ZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvLmNsYXNzcGF0aCBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLy5jdnNpZ25vcmUgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLy5vcHRpb25zIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxODFhZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIERlYnVnZ2luZyBvcHRpb25zIGZvciB0aGUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIHBsdWctaW4NCi0NCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcgZm9yIHRoZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcgcGx1Zy1pbg0KLW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9kZWJ1Zz1mYWxzZQ0KLQ0KLSMgVHVybiBvbiBkZWJ1Z2dpbmcgb2YgdmlzdWFsSUQgcHJvY2Vzc2luZw0KLW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9kZWJ1Zy92aXN1YWxJRD10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy8ucHJvamVjdCBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwN2EyOTEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzYxZTAuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmc7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRVBGRGlhZ3JhbUVkaXRvclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuY29tbWFuZHMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGFydHMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmpmYWNlLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS51aS52aWV3cywKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWksCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWksCi0gb3JnLmVjbGlwc2UuZ2VmO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5wcm9wZXJ0aWVzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuaWRlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVuZGVyO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvcjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLnByb3ZpZGVyczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51bWwyLnVtbDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51bWwyLnVtbC5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZHJhdzJkO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWEsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5nZW9zaGFwZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2J1aWxkLnByb3BlcnRpZXMgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOTJkYjkuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2RpYWdyYW0vYWN0aXZpdHkuZ2lmIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL2FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2RpYWdyYW0vYWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL2l0ZXJhdGlvbi5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2RpYWdyYW0vaXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjOGExNC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2RpYWdyYW0vaXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZGlhZ3JhbS9taWxlc3RvbmUuZ2lmIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL21pbGVzdG9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NmZmOTQuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL21pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2RpYWdyYW0vcGhhc2UuZ2lmIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL3BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVjYjNjZC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2RpYWdyYW0vcGhhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yLmdpZiBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZGlhZ3JhbS90YXNrZGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NWQ2NTEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZGlhZ3JhbS90YXNrZGVzY3JpcHRvcjEuZ2lmIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NWQ2NTEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RmluYWxOb2RlLmdpZiBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eUZpbmFsTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNDk3MjguLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RmluYWxOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eVBhcnRpdGlvbi5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlQYXJ0aXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDFiMDllLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eVBhcnRpdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQ29udHJvbEZsb3cuZ2lmIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0NvbnRyb2xGbG93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwYzIyMy4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQ29udHJvbEZsb3cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0RlY2lzaW9uTm9kZS5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvRGVjaXNpb25Ob2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhNjAxYy4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvRGVjaXNpb25Ob2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Gb3JrTm9kZS5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvRm9ya05vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2MyMGIzLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Gb3JrTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSW5pdGlhbE5vZGUuZ2lmIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0luaXRpYWxOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1Y2Y3OC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSW5pdGlhbE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMWU0Ni4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Kb2luTm9kZS5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSm9pbk5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGMzYTM5Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Kb2luTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvTWVyZ2VOb2RlLmdpZiBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9NZXJnZU5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzRjYjk2Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9NZXJnZU5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2MTVlYi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDYwYmQ5Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MGZiMjkuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZiBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NGUyNmUuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9kZWxldGUuZ2lmIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L2RlbGV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OTIyYWMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L2RlbGV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL29iajE2L1VNTERpYWdyYW1GaWxlLmdpZiBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvb2JqMTYvVU1MRGlhZ3JhbUZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTkzODA3Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvb2JqMTYvVU1MRGlhZ3JhbUZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy93aXpiYW4vTmV3VU1MV2l6YXJkLmdpZiBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvd2l6YmFuL05ld1VNTFdpemFyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZTAzYmYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy93aXpiYW4vTmV3VU1MV2l6YXJkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvbW9kZWwvZXBmZGlhZ3JhbS5nbWZnZW4gYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL21vZGVsL2VwZmRpYWdyYW0uZ21mZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDk5MjI2Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvbW9kZWwvZXBmZGlhZ3JhbS5nbWZnZW4KKysrIC9kZXYvbnVsbApAQCAtMSw5MTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mZ2VuPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L0dlbk1vZGVsIiBwYWNrYWdlTmFtZVByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIgotICAgIG1vZGVsSUQ9IkFEIgotICAgIHNhbWVGaWxlRm9yRGlhZ3JhbUFuZE1vZGVsPSJ0cnVlIgotICAgIGRpYWdyYW1GaWxlRXh0ZW5zaW9uPSJ4bWkiCi0gICAgdGVtcGxhdGVEaXJlY3Rvcnk9IiIKLSAgICBjb3B5cmlnaHRUZXh0PSIgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiYjeEQ7JiN4QTsgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyYjeEQ7JiN4QTsgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wJiN4RDsmI3hBOyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCYjeEQ7JiN4QTsgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmI3hEOyYjeEE7JiN4RDsmI3hBOyBDb250cmlidXRvcnM6JiN4RDsmI3hBOyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uJiN4RDsmI3hBOyI+Ci0gIDxkaWFncmFtCi0gICAgICB2aXN1YWxJRD0iNzkiCi0gICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlFZGl0UGFydCIKLSAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5Vmlld0ZhY3RvcnkiCi0gICAgICBpY29uUHJvdmlkZXJQcmlvcml0eT0iTG93IgotICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgdmFsaWRhdGlvblByb3ZpZGVyQ2xhc3NOYW1lPSJWYWxpZGF0aW9uUHJvdmlkZXIiCi0gICAgICBtZXRyaWNQcm92aWRlckNsYXNzTmFtZT0iTWV0cmljUHJvdmlkZXIiCi0gICAgICB2YWxpZGF0aW9uRGVjb3JhdG9yUHJvdmlkZXJDbGFzc05hbWU9IlZhbGlkYXRpb25EZWNvcmF0b3JQcm92aWRlciI+Ci0gICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRGlhZ3JhbSIvPgotICAgIDxlbGVtZW50VHlwZQotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5RWRpdEhlbHBlciIvPgotICAgIDx2aWV3bWFwCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllciIvPgotICAgIDxkb21haW5EaWFncmFtRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkiLz4KLSAgICA8Y2hpbGROb2RlcwotICAgICAgICB2aXN1YWxJRD0iMjAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24yQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIgotICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNy9AZWxlbWVudFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckFkdmljZUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyQWR2aWNlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgbGF5b3V0VHlwZT0iWFlfTEFZT1VUIgotICAgICAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQgbXlHZW5MYXlvdXRNYW5hZ2VyID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuYmxhY2smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNDAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4MDApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjAwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJvcmRlcigmI3hEOyYjeEE7bmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyKCkmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmUGFydGl0aW9uTGFiZWxGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUGFydGl0aW9uTGFiZWxGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmUGFydGl0aW9uTGFiZWxGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMjU1KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJ0aXRpb24iLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcnRpdGlvbi9zdWJwYXJ0aXRpb24iLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcnRpdGlvbi9zdWJwYXJ0aXRpb24iLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWVWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkVuZE5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRW5kTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5nbWYudW1sLm1vZGVsLkVuZE5vZGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEVuZE5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUmI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihFTkROT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjQpKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCkpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBFTkROT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDQ1LCA4NSwgMTMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlGaW5hbE5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRXh0ZXJuYWxOb2RlTGFiZWwiCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDEiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNZXJnZU5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTWVyZ2VOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9Ik1lcmdlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJNZXJnZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJNZXJnZU5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJEZWNpc2lvbkRpYW1vbmRGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRGVjaXNpb25EaWFtb25kRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5nZW9zaGFwZXMuaW50ZXJuYWwuZHJhdzJkLmZpZ3VyZXMuR2VvU2hhcGVEaWFtb25kRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUmI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlRGlhbW9uZExhYmVsKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmRGlhbW9uZExhYmVsOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlRGlhbW9uZExhYmVsKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZEaWFtb25kTGFiZWw7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlRGlhbW9uZExhYmVsKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZkRpYW1vbmRMYWJlbCA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAxODUsIDIwNSwgMjMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTWVyZ2VOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik1lcmdlTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik1lcmdlTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIE5vZGVOYW1lRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBOb2RlTmFtZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90OyZsdDsuLi4+JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMyIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkZvcmtOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkZvcmtOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iRm9ya05vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iRm9ya05vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iRm9ya05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJGb3JrTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkZvcmtOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEZvcmtOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRm9ya05vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRk9SS05PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgRk9SS05PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgNTEsIDEwMiwgMTAyKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlJlc2l6ZUNvbnN0cmFpbnRzIgotICAgICAgICAgICAgcmVzaXplSGFuZGxlcz0iMjQiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9Gb3JrTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA0IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iSW5pdGlhbE5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkluaXRpYWxOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iSW5pdGlhbE5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuRWxsaXBzZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgSW5pdGlhbE5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUmI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihJTklUSUFMTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBJTklUSUFMTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCA0NSwgODUsIDEzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0luaXRpYWxOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkV4dGVybmFsTm9kZUxhYmVsIgotICAgICAgICAgIHZpc3VhbElEPSI0MDAzIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJJbml0aWFsTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkluaXRpYWxOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZQotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA1IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iRGVjaXNpb25Ob2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkRlY2lzaW9uTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkRlY2lzaW9uTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRGVjaXNpb25EaWFtb25kRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZ2Vvc2hhcGVzLmludGVybmFsLmRyYXcyZC5maWd1cmVzLkdlb1NoYXBlRGlhbW9uZEZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRGVjaXNpb25EaWFtb25kRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZURpYW1vbmRMYWJlbChmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZkRpYW1vbmRMYWJlbDsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZURpYW1vbmRMYWJlbCgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRGlhbW9uZExhYmVsOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZURpYW1vbmRMYWJlbChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZEaWFtb25kTGFiZWwgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMTg1LCAyMDUsIDIzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0RlY2lzaW9uTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDQiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkRlY2lzaW9uTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0iTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBOb2RlTmFtZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTm9kZU5hbWVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDsmbHQ7Li4uPiZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDYiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJKb2luTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJKb2luTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkpvaW5Ob2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkpvaW5Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkpvaW5Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iSm9pbk5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJGb3JrTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBGb3JrTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEZvcmtOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKEZPUktOT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIEZPUktOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDUxLCAxMDIsIDEwMik7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpSZXNpemVDb25zdHJhaW50cyIKLSAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXM9IjI0Ii8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvSm9pbk5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwNyIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90OyZsdDsuLi4+JnF1b3Q7KTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmTm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50U2VsZWN0b3IKLSAgICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfQWN0aXZpdHkiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfQWN0aXZpdHkmI3hEOyYjeEE7IgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA1IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwOCIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25WaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25DYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4wIgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBsYXlvdXRUeXBlPSJYWV9MQVlPVVQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0KCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5ibGFjayYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgwMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMDApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Qm9yZGVyKCYjeEQ7JiN4QTtuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXIoKSYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZQYXJ0aXRpb25MYWJlbEZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAyNTUpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcnRpdGlvbiIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L2dyb3VwIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvZ3JvdXAiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNyIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uTmFtZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uTmFtZTJWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwOSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRTZWxlY3RvcgotICAgICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9UYXNrRGVzY3JpcHRvciIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9UYXNrRGVzY3JpcHRvciIKLSAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUvRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgICAgPC9tb2RlbEVsZW1lbnRJbml0aWFsaXplcj4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwOCIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZQotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDEwIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMlZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiCi0gICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42L0BlbGVtZW50VHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQWR2aWNlQ2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlckFkdmljZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZOb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRTZWxlY3RvcgotICAgICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9QaGFzZSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9QaGFzZSIKLSAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUvRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgICAgPC9tb2RlbEVsZW1lbnRJbml0aWFsaXplcj4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwOSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMTEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSIKLSAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYvQGVsZW1lbnRUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJBZHZpY2VDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdEhlbHBlckFkdmljZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZOb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRTZWxlY3RvcgotICAgICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9JdGVyYXRpb24iCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDEwIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAxMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSIKLSAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjgvQGVsZW1lbnRUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJBZHZpY2VDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXJBZHZpY2UiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRTZWxlY3RvcgotICAgICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9NaWxlc3RvbmUiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfTWlsZXN0b25lIgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDExIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMlZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPGxpbmtzCi0gICAgICAgIHZpc3VhbElEPSIzMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29udHJvbEZsb3dFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29udHJvbEZsb3dJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDb250cm9sRmxvd1ZpZXdGYWN0b3J5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRWRnZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkNvbnRyb2xGbG93RWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iQ29udHJvbEZsb3dGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQ29udHJvbEZsb3dGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsmI3hEOyYjeEE7b3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBkZiA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uKCk7JiN4RDsmI3hBOy8vIGRpc3BhdGNoTmV4dD8mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0IHBsID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QoKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KC0xLCAxKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KDAsIDApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIC0xKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2RmLnNldFRlbXBsYXRlKHBsKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2RmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNyksIGdldE1hcE1vZGUoKS5EUHRvTFAoMykpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBkZjsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUeXBlTGlua01vZGVsRmFjZXQiPgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQ29udHJvbEZsb3ciLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlL2VkZ2UiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlL2VkZ2UiLz4KLSAgICAgICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlFZGdlL3NvdXJjZSIvPgotICAgICAgICA8dGFyZ2V0TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eUVkZ2UvdGFyZ2V0Ii8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMTIiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbnRyb2xGbG93TmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29udHJvbEZsb3dOYW1lVmlld0ZhY3RvcnkiCi0gICAgICAgICAgZWxlbWVudEljb249InRydWUiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0iQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSIKLSAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIENvbnRyb2xGbG93TGFiZWxGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIENvbnRyb2xGbG93TGFiZWxGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpMYWJlbE9mZnNldEF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIHk9IjQwIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvbGlua3M+Ci0gICAgPGNvbXBhcnRtZW50cwotICAgICAgICB2aXN1YWxJRD0iNTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRWaWV3RmFjdG9yeSIKLSAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgdGl0bGU9IlBhcnRpdGlvbkNhbXBhcnRtZW50IgotICAgICAgICBjYW5Db2xsYXBzZT0iZmFsc2UiCi0gICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIgotICAgICAgICBub2RlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjciCi0gICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPGNvbXBhcnRtZW50cwotICAgICAgICB2aXN1YWxJRD0iNTAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJWaWV3RmFjdG9yeSIKLSAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIHRpdGxlPSJQYXJ0aXRpb25DYW1wYXJ0bWVudCIKLSAgICAgICAgY2FuQ29sbGFwc2U9ImZhbHNlIgotICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSIKLSAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIj4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgIDwvY29tcGFydG1lbnRzPgotICAgIDxwYWxldHRlPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJGbG93cyIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRpb24gdG9vbCBmb3IgZmxvd3MiCi0gICAgICAgICAgY29sbGFwc2U9InRydWUiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iQ29udHJvbCBGbG93IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQ29udHJvbCBGbG93IgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0NvbnRyb2xGbG93LmdpZiIKLSAgICAgICAgICAgIGdlbkxpbmtzPSIvL0BkaWFncmFtL0BsaW5rcy4wIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0iTm9kZXMiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0aW9uIHRvb2wgZ3JvdXAgZm9yIG5vZGVzIgotICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkFjdGl2aXR5IFBhcnRpdGlvbiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEFjdGl2aXR5IFBhcnRpdGlvbiIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eVBhcnRpdGlvbi5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy43IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iU3RhcnQgTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFN0YXJ0IE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSW5pdGlhbE5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMyIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iRm9yayBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgRm9yayBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0ZvcmtOb2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjIiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9Ik1lcmdlIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBNZXJnZSBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L01lcmdlTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJEZWNpc2lvbiBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgRGVjaXNpb24gTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9EZWNpc2lvbk5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iRW5kIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBFbmQgTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eUZpbmFsTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJKb2luIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBKb2luIE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSm9pbk5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNSIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTZXBhcmF0b3IiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkFjdGl2aXR5IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQWN0aXZpdHkiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNiIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iUGhhc2UiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBQaGFzZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy45Ii8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJJdGVyYXRpb24iCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBJdGVyYXRpb24iCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEwIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJUYXNrIERlc2NyaXB0b3IiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBUYXNrIERlc2NyaXB0b3IiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iTWlsZXN0b25lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTWlsZXN0b25lIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMSIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgPC9wYWxldHRlPgotICA8L2RpYWdyYW0+Ci0gIDxwbHVnaW4KLSAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciCi0gICAgICBuYW1lPSJFUEYgRGlhZ3JhbW1pbmcgUGx1Z2luIgotICAgICAgcHJvdmlkZXI9IklCTSBSYXRpb25hbCIKLSAgICAgIGFjdGl2YXRvckNsYXNzTmFtZT0iRVBGRGlhZ3JhbUVkaXRvclBsdWdpbiIvPgotICA8ZWRpdG9yCi0gICAgICBjbGFzc05hbWU9IkRpYWdyYW1FZGl0b3IiLz4KLSAgPGRvbWFpbkdlbk1vZGVsCi0gICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLyIvPgotICA8ZXhwcmVzc2lvblByb3ZpZGVycz4KLSAgICA8cHJvdmlkZXJzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuSmF2YUV4cHJlc3Npb25Qcm92aWRlciIKLSAgICAgICAgZXhwcmVzc2lvbnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNi9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50U2VsZWN0b3IgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy44L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjgvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjkvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOS9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIvQGluaXRpYWxpemVycy4wIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTAvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTAvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjExL0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjExL0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAiLz4KLSAgPC9leHByZXNzaW9uUHJvdmlkZXJzPgotPC9nbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yPgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9tb2RlbC9lcGZkaWFncmFtLmdtZmdyYXBoIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9tb2RlbC9lcGZkaWFncmFtLmdtZmdyYXBoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWQ2MzA0Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvbW9kZWwvZXBmZGlhZ3JhbS5nbWZncmFwaAorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdyYXBoOkNhbnZhcyB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdyYXBoPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L0dyYXBoaWNhbERlZmluaXRpb24iIG5hbWU9InVtbCI+Ci0gIDxmaWd1cmVzCi0gICAgICBuYW1lPSJEZWZhdWx0Ij4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIgotICAgICAgICBuYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgICBvdXRsaW5lPSJmYWxzZSI+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iTm9kZU5hbWUgQWN0aXZpdHlOb2RlTmFtZSBJbml0aWFsTm9kZU5hbWUgRm9ya05vZGVOYW1lIERlY2lzaW9uTm9kZU5hbWUiCi0gICAgICAgICAgbmFtZT0iTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgdGV4dD0iJmx0Oy4uLj4iLz4KLSAgICA8L2ZpZ3VyZXM+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iQWN0aXZpdHlQYXJ0aXRpb24iCi0gICAgICAgIG5hbWU9IkFjdGl2aXR5UGFydGl0aW9uRmlndXJlIj4KLSAgICAgIDxsYXlvdXREYXRhCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlhZTGF5b3V0RGF0YSI+Ci0gICAgICAgIDxzaXplCi0gICAgICAgICAgICBkeD0iMTAwIgotICAgICAgICAgICAgZHk9IjIwMCIvPgotICAgICAgPC9sYXlvdXREYXRhPgotICAgICAgPGxheW91dAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpYWUxheW91dCIvPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IlBhcnRpdGlvbk5hbWUiCi0gICAgICAgICAgbmFtZT0iUGFydGl0aW9uTGFiZWxGaWd1cmUiLz4KLSAgICAgIDxmb3JlZ3JvdW5kQ29sb3IKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q29uc3RhbnRDb2xvciIKLSAgICAgICAgICB2YWx1ZT0iYmxhY2siLz4KLSAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiCi0gICAgICAgICAgcmVkPSIyNTUiCi0gICAgICAgICAgZ3JlZW49IjI1NSIKLSAgICAgICAgICBibHVlPSIyNTUiLz4KLSAgICAgIDxwcmVmZXJyZWRTaXplCi0gICAgICAgICAgZHg9IjQwMCIKLSAgICAgICAgICBkeT0iODAwIi8+Ci0gICAgICA8Ym9yZGVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxpbmVCb3JkZXIiLz4KLSAgICAgIDxzaXplCi0gICAgICAgICAgeD0iMTAwIgotICAgICAgICAgIHk9IjIwMCIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UG9seWxpbmVDb25uZWN0aW9uIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJDb250cm9sRmxvdyIKLSAgICAgICAgbmFtZT0iQ29udHJvbEZsb3dGaWd1cmUiCi0gICAgICAgIHRhcmdldERlY29yYXRpb249Ik9wZW5BcnJvdyI+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UG9seWxpbmVEZWNvcmF0aW9uIgotICAgICAgICAgIG5hbWU9Ik9wZW5BcnJvdyI+Ci0gICAgICAgIDx0ZW1wbGF0ZQotICAgICAgICAgICAgeD0iLTEiCi0gICAgICAgICAgICB5PSIxIi8+Ci0gICAgICAgIDx0ZW1wbGF0ZS8+Ci0gICAgICAgIDx0ZW1wbGF0ZQotICAgICAgICAgICAgeD0iLTEiCi0gICAgICAgICAgICB5PSItMSIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJDb250cm9sRmxvd0xhYmVsIgotICAgICAgICAgIG5hbWU9IkNvbnRyb2xGbG93TGFiZWxGaWd1cmUiCi0gICAgICAgICAgdGV4dD0iIi8+Ci0gICAgPC9maWd1cmVzPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IkZvcmtOb2RlIEpvaW5Ob2RlIgotICAgICAgICBuYW1lPSJGb3JrTm9kZUZpZ3VyZSI+Ci0gICAgICA8YmFja2dyb3VuZENvbG9yCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgIHJlZD0iNTEiCi0gICAgICAgICAgZ3JlZW49IjEwMiIKLSAgICAgICAgICBibHVlPSIxMDIiLz4KLSAgICAgIDxwcmVmZXJyZWRTaXplCi0gICAgICAgICAgZHg9IjEwMCIKLSAgICAgICAgICBkeT0iOCIvPgotICAgICAgPHNpemUKLSAgICAgICAgICB4PSIxMDAiCi0gICAgICAgICAgeT0iOCIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UG9seWdvbiIKLSAgICAgICAgbmFtZT0iRGVjaXNpb25EaWFtb25kUG9seWdvbkZpZ3VyZV9vbGQiPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9Ik1lcmdlTm9kZVBvbHlnb25MYWJlbCIKLSAgICAgICAgICBuYW1lPSJNZXJnZU5vZGVQb2x5Z29uTGFiZWxGaWd1cmUiCi0gICAgICAgICAgdGV4dD0iTWVyZ2VOb2RlIi8+Ci0gICAgICA8Zm9yZWdyb3VuZENvbG9yCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgIGdyZWVuPSIyMDAiCi0gICAgICAgICAgYmx1ZT0iMTAwIi8+Ci0gICAgICA8YmFja2dyb3VuZENvbG9yCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkNvbnN0YW50Q29sb3IiCi0gICAgICAgICAgdmFsdWU9ImxpZ2h0R3JheSIvPgotICAgICAgPGJvcmRlcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMaW5lQm9yZGVyIi8+Ci0gICAgICA8dGVtcGxhdGUKLSAgICAgICAgICB4PSIyMCIKLSAgICAgICAgICB5PSI2MCIvPgotICAgICAgPHRlbXBsYXRlCi0gICAgICAgICAgeD0iMzAiCi0gICAgICAgICAgeT0iNjAiLz4KLSAgICAgIDx0ZW1wbGF0ZQotICAgICAgICAgIHg9IjYwIgotICAgICAgICAgIHk9IjMwIi8+Ci0gICAgICA8dGVtcGxhdGUKLSAgICAgICAgICB4PSIzMCIKLSAgICAgICAgICB5PSIyMCIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q3VzdG9tRmlndXJlIgotICAgICAgICBuYW1lPSJEZWNpc2lvbkRpYW1vbmRGaWd1cmVfb2xkIgotICAgICAgICBxdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5MYXllciIKLSAgICAgICAgYnVuZGxlTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkIj4KLSAgICAgIDxsYXlvdXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6U3RhY2tMYXlvdXQiLz4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpQb2x5Z29uIgotICAgICAgICAgIG5hbWU9IkRpYW1vbmRQb2x5Z29uIj4KLSAgICAgICAgPGZvcmVncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkNvbnN0YW50Q29sb3IiCi0gICAgICAgICAgICB2YWx1ZT0iYmxhY2siLz4KLSAgICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkNvbnN0YW50Q29sb3IiCi0gICAgICAgICAgICB2YWx1ZT0ibGlnaHRHcmF5Ii8+Ci0gICAgICAgIDxtYXhpbXVtU2l6ZQotICAgICAgICAgICAgZHg9IjgwIgotICAgICAgICAgICAgZHk9IjgwIi8+Ci0gICAgICAgIDxzaXplCi0gICAgICAgICAgICB4PSI4MCIKLSAgICAgICAgICAgIHk9IjgwIi8+Ci0gICAgICAgIDx0ZW1wbGF0ZQotICAgICAgICAgICAgeD0iNDAiLz4KLSAgICAgICAgPHRlbXBsYXRlCi0gICAgICAgICAgICB4PSI4MCIKLSAgICAgICAgICAgIHk9IjQwIi8+Ci0gICAgICAgIDx0ZW1wbGF0ZQotICAgICAgICAgICAgeD0iNDAiCi0gICAgICAgICAgICB5PSI4MCIvPgotICAgICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgIHk9IjQwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgIG5hbWU9IkRlY2lzaW9uTWVyZ2VMYWJlbF8xIgotICAgICAgICAgIHRleHQ9IiIvPgotICAgICAgPHByZWZlcnJlZFNpemUKLSAgICAgICAgICBkeD0iODAiCi0gICAgICAgICAgZHk9IjgwIi8+Ci0gICAgICA8c2l6ZQotICAgICAgICAgIHg9IjgwIgotICAgICAgICAgIHk9IjgwIi8+Ci0gICAgPC9maWd1cmVzPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDdXN0b21GaWd1cmUiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IkFjdGl2aXR5RmluYWxOb2RlIgotICAgICAgICBuYW1lPSJFbmROb2RlRmlndXJlIgotICAgICAgICBxdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVwZi5nbWYudW1sLm1vZGVsLkVuZE5vZGVGaWd1cmUiCi0gICAgICAgIGJ1bmRsZU5hbWU9Im9yZy5lY2xpcHNlLmVwZi5nbWYudW1sLm1vZGVsIj4KLSAgICAgIDxmb3JlZ3JvdW5kQ29sb3IKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q29uc3RhbnRDb2xvciIKLSAgICAgICAgICB2YWx1ZT0iZGFya0JsdWUiLz4KLSAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiCi0gICAgICAgICAgcmVkPSI0NSIKLSAgICAgICAgICBncmVlbj0iODUiCi0gICAgICAgICAgYmx1ZT0iMTMwIi8+Ci0gICAgICA8cHJlZmVycmVkU2l6ZQotICAgICAgICAgIGR4PSIyNCIKLSAgICAgICAgICBkeT0iMjQiLz4KLSAgICAgIDxzaXplCi0gICAgICAgICAgeD0iMjQiCi0gICAgICAgICAgeT0iMjQiLz4KLSAgICA8L2ZpZ3VyZXM+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkN1c3RvbUZpZ3VyZSIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iRGVjaXNpb25Ob2RlIE1lcmdlTm9kZSIKLSAgICAgICAgbmFtZT0iRGVjaXNpb25EaWFtb25kRmlndXJlIgotICAgICAgICBxdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZ2Vvc2hhcGVzLmludGVybmFsLmRyYXcyZC5maWd1cmVzLkdlb1NoYXBlRGlhbW9uZEZpZ3VyZSIKLSAgICAgICAgYnVuZGxlTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5nZW9zaGFwZXMiPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgIG5hbWU9IkRpYW1vbmRMYWJlbCIvPgotICAgICAgPGZvcmVncm91bmRDb2xvcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDb25zdGFudENvbG9yIgotICAgICAgICAgIHZhbHVlPSJkYXJrQmx1ZSIvPgotICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSR0JDb2xvciIKLSAgICAgICAgICByZWQ9IjE4NSIKLSAgICAgICAgICBncmVlbj0iMjA1IgotICAgICAgICAgIGJsdWU9IjIzMCIvPgotICAgICAgPHByZWZlcnJlZFNpemUKLSAgICAgICAgICBkeD0iNTAiCi0gICAgICAgICAgZHk9IjUwIi8+Ci0gICAgICA8c2l6ZQotICAgICAgICAgIHg9IjUwIgotICAgICAgICAgIHk9IjUwIi8+Ci0gICAgPC9maWd1cmVzPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpFbGxpcHNlIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJJbml0aWFsTm9kZSIKLSAgICAgICAgbmFtZT0iSW5pdGlhbE5vZGVGaWd1cmUiPgotICAgICAgPGZvcmVncm91bmRDb2xvcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDb25zdGFudENvbG9yIgotICAgICAgICAgIHZhbHVlPSJkYXJrQmx1ZSIvPgotICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSR0JDb2xvciIKLSAgICAgICAgICByZWQ9IjQ1IgotICAgICAgICAgIGdyZWVuPSI4NSIKLSAgICAgICAgICBibHVlPSIxMzAiLz4KLSAgICAgIDxwcmVmZXJyZWRTaXplCi0gICAgICAgICAgZHg9IjIwIgotICAgICAgICAgIGR5PSIyMCIvPgotICAgICAgPHNpemUKLSAgICAgICAgICB4PSIyMCIKLSAgICAgICAgICB5PSIyMCIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IkdlbmVyaWNMYWJlbCIKLSAgICAgICAgbmFtZT0iR2VuZXJpY0xhYmVsRmlndXJlIi8+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkN1c3RvbUZpZ3VyZSIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iUGFydGl0aW9uQ2FtcGFydG1lbnQiCi0gICAgICAgIG5hbWU9IlJlc2l6ZWFibGVDb21wYXJ0bWVudEZpZ3VyZUV4IgotICAgICAgICBxdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSIKLSAgICAgICAgYnVuZGxlTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzIi8+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIgotICAgICAgICBuYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUiCi0gICAgICAgIG91dGxpbmU9ImZhbHNlIj4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lIgotICAgICAgICAgIG5hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCIvPgotICAgIDwvZmlndXJlcz4KLSAgPC9maWd1cmVzPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiCi0gICAgICBmaWd1cmU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJBY3Rpdml0eVBhcnRpdGlvbiIKLSAgICAgIGZpZ3VyZT0iQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJJbml0aWFsTm9kZSIKLSAgICAgIGZpZ3VyZT0iSW5pdGlhbE5vZGVGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJGb3JrTm9kZSIKLSAgICAgIGZpZ3VyZT0iRm9ya05vZGVGaWd1cmUiCi0gICAgICByZXNpemVDb25zdHJhaW50PSJFQVNUX1dFU1QiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJNZXJnZU5vZGUiCi0gICAgICBmaWd1cmU9IkRlY2lzaW9uRGlhbW9uZEZpZ3VyZSIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IkRlY2lzaW9uTm9kZSIKLSAgICAgIGZpZ3VyZT0iRGVjaXNpb25EaWFtb25kRmlndXJlIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iQWN0aXZpdHlGaW5hbE5vZGUiCi0gICAgICBmaWd1cmU9IkVuZE5vZGVGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJKb2luTm9kZSIKLSAgICAgIGZpZ3VyZT0iRm9ya05vZGVGaWd1cmUiCi0gICAgICByZXNpemVDb25zdHJhaW50PSJFQVNUX1dFU1QiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUiCi0gICAgICBmaWd1cmU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSIvPgotICA8Y29ubmVjdGlvbnMKLSAgICAgIG5hbWU9IkNvbnRyb2xGbG93IgotICAgICAgZmlndXJlPSJDb250cm9sRmxvd0ZpZ3VyZSIvPgotICA8Y29tcGFydG1lbnRzCi0gICAgICBuYW1lPSJQYXJ0aXRpb25DYW1wYXJ0bWVudCIKLSAgICAgIGZpZ3VyZT0iUmVzaXplYWJsZUNvbXBhcnRtZW50RmlndXJlRXgiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9Ik5vZGVOYW1lRmlndXJlIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IlBhcnRpdGlvbk5hbWUiCi0gICAgICBmaWd1cmU9IlBhcnRpdGlvbkxhYmVsRmlndXJlIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkNvbnRyb2xGbG93TGFiZWwiCi0gICAgICBmaWd1cmU9IkNvbnRyb2xGbG93TGFiZWxGaWd1cmUiCi0gICAgICByZXNpemVDb25zdHJhaW50PSJFQVNUX1dFU1QiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iTWVyZ2VOb2RlUG9seWdvbkxhYmVsIgotICAgICAgZmlndXJlPSJNZXJnZU5vZGVQb2x5Z29uTGFiZWxGaWd1cmUiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iR2VuZXJpY0xhYmVsIgotICAgICAgZmlndXJlPSJHZW5lcmljTGFiZWxGaWd1cmUiCi0gICAgICByZXNpemVDb25zdHJhaW50PSJFQVNUX1dFU1QiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iQWN0aXZpdHlOb2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iTm9kZU5hbWVGaWd1cmUiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iSW5pdGlhbE5vZGVOYW1lIgotICAgICAgZmlndXJlPSJOb2RlTmFtZUZpZ3VyZSIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJGb3JrTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9Ik5vZGVOYW1lRmlndXJlIgotICAgICAgZWxlbWVudEljb249ImZhbHNlIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkRlY2lzaW9uTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9Ik5vZGVOYW1lRmlndXJlIgotICAgICAgZWxlbWVudEljb249ImZhbHNlIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIvPgotPC9nbWZncmFwaDpDYW52YXM+CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL21vZGVsL2VwZmRpYWdyYW0uZ21mbWFwIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9tb2RlbC9lcGZkaWFncmFtLmdtZm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmOGUzYi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL21vZGVsL2VwZmRpYWdyYW0uZ21mbWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mbWFwOk1hcHBpbmcgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnbWZtYXA9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvbWFwcGluZ3MiCi0gICAgeG1sbnM6Z21mdG9vbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9Ub29sRGVmaW5pdGlvbiI+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5RmluYWxOb2RlIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjR2VuZXJpY0xhYmVsIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy41Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5RmluYWxOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9NZXJnZU5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjRGVjaXNpb25Ob2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMyIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNNZXJnZU5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0ZvcmtOb2RlIi8+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMiIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNGb3JrTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vSW5pdGlhbE5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNHZW5lcmljTGFiZWwiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjEiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjSW5pdGlhbE5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0RlY2lzaW9uTm9kZSIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNEZWNpc2lvbk5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy40Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0RlY2lzaW9uTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vSm9pbk5vZGUiLz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy42Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0pvaW5Ob2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICA8ZG9tYWluU3BlY2lhbGl6YXRpb24KLSAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX0FjdGl2aXR5IgotICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICA8ZG9tYWluSW5pdGlhbGl6ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfQWN0aXZpdHkmI3hEOyYjeEE7IgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3M+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuOCIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ncm91cCIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlQYXJ0aXRpb24iLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNQYXJ0aXRpb25OYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4wIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFydGl0aW9uIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuNy9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjAiCi0gICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy43L0Bvd25lZENoaWxkIj4KLSAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlQYXJ0aXRpb24vc3VicGFydGl0aW9uIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNvbXBhcnRtZW50cwotICAgICAgICAgIGNoaWxkcmVuPSIvL0Bub2Rlcy43L0Bvd25lZENoaWxkL0BjaGlsZHJlbi4wIj4KLSAgICAgICAgPGNvbXBhcnRtZW50Ci0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1BhcnRpdGlvbkNhbXBhcnRtZW50Ii8+Ci0gICAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgICAgPGRvbWFpblNwZWNpYWxpemF0aW9uCi0gICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9UYXNrRGVzY3JpcHRvciIKLSAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgPGRvbWFpbkluaXRpYWxpemVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3M+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMTEiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICA8ZG9tYWluU3BlY2lhbGl6YXRpb24KLSAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX1BoYXNlIgotICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICA8ZG9tYWluSW5pdGlhbGl6ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfUGhhc2UiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgIDwvZG9tYWluSW5pdGlhbGl6ZXI+Ci0gICAgICA8bGFiZWxNYXBwaW5ncz4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eU5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy45Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgIDxkb21haW5TcGVjaWFsaXphdGlvbgotICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICA8ZG9tYWluSW5pdGlhbGl6ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3M+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMTAiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgICA8ZG9tYWluU3BlY2lhbGl6YXRpb24KLSAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgPGRvbWFpbkluaXRpYWxpemVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgPC9kb21haW5Jbml0aWFsaXplcj4KLSAgICAgIDxsYWJlbE1hcHBpbmdzPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjEyIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPGxpbmtzPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9Db250cm9sRmxvdyIvPgotICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQ29udHJvbEZsb3dMYWJlbCIvPgotICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlL2VkZ2UiLz4KLSAgICA8dG9vbAotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4wIi8+Ci0gICAgPGRpYWdyYW1MaW5rCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQ29udHJvbEZsb3ciLz4KLSAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5RWRnZS9zb3VyY2UiLz4KLSAgICA8bGlua01ldGFGZWF0dXJlCi0gICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eUVkZ2UvdGFyZ2V0Ii8+Ci0gIDwvbGlua3M+Ci0gIDxkaWFncmFtPgotICAgIDxkaWFncmFtQ2FudmFzCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjdW1sIi8+Ci0gICAgPGRvbWFpbk1vZGVsCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvIi8+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5Ii8+Ci0gICAgPHBhbGV0dGUKLSAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUiLz4KLSAgPC9kaWFncmFtPgotPC9nbWZtYXA6TWFwcGluZz4KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvbW9kZWwvZXBmZGlhZ3JhbS5nbWZ0b29sIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9tb2RlbC9lcGZkaWFncmFtLmdtZnRvb2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZTQ2OTYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9tb2RlbC9lcGZkaWFncmFtLmdtZnRvb2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZ0b29sOlRvb2xSZWdpc3RyeSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZnRvb2w9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvVG9vbERlZmluaXRpb24iPgotICA8cGFsZXR0ZT4KLSAgICA8dG9vbHMKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6VG9vbEdyb3VwIgotICAgICAgICB0aXRsZT0iRmxvd3MiCi0gICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGlvbiB0b29sIGZvciBmbG93cyIKLSAgICAgICAgY29sbGFwc2libGU9InRydWUiPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJDb250cm9sIEZsb3ciCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQ29udHJvbCBGbG93Ij4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0NvbnRyb2xGbG93LmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICA8L3Rvb2xzPgotICAgIDx0b29scwotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpUb29sR3JvdXAiCi0gICAgICAgIHRpdGxlPSJOb2RlcyIKLSAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0aW9uIHRvb2wgZ3JvdXAgZm9yIG5vZGVzIgotICAgICAgICBjb2xsYXBzaWJsZT0idHJ1ZSIKLSAgICAgICAgYWN0aXZlPSIvL0BwYWxldHRlL0B0b29scy4xIj4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iQWN0aXZpdHkgUGFydGl0aW9uIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEFjdGl2aXR5IFBhcnRpdGlvbiI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eVBhcnRpdGlvbi5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IlN0YXJ0IE5vZGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgU3RhcnQgTm9kZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9Jbml0aWFsTm9kZS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IkZvcmsgTm9kZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBGb3JrIE5vZGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvRm9ya05vZGUuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJNZXJnZSBOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IE1lcmdlIE5vZGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvTWVyZ2VOb2RlLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iRGVjaXNpb24gTm9kZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBEZWNpc2lvbiBOb2RlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0RlY2lzaW9uTm9kZS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IkVuZCBOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEVuZCBOb2RlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RmluYWxOb2RlLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iSm9pbiBOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEpvaW4gTm9kZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9Kb2luTm9kZS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpQYWxldHRlU2VwYXJhdG9yIi8+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IkFjdGl2aXR5IgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEFjdGl2aXR5Ij4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iUGhhc2UiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUGhhc2UiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJJdGVyYXRpb24iCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgSXRlcmF0aW9uIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iVGFzayBEZXNjcmlwdG9yIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFRhc2sgRGVzY3JpcHRvciI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9Ik1pbGVzdG9uZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBNaWxlc3RvbmUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICA8L3Rvb2xzPgotICA8L3BhbGV0dGU+Ci08L2dtZnRvb2w6VG9vbFJlZ2lzdHJ5PgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9wbHVnaW4ucHJvcGVydGllcyBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNWE0MGIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBsdWdpbk5hbWU9RVBGIERpYWdyYW1taW5nIFBsdWdpbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSNOZWVkcyBUcmFuc2xhdGlvbgotRGVsZXRlRGlhZ3JhbV90ZXh0PURlbGV0ZSBEaWFncmFtCi1yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PVJlZnJlc2ggZnJvbSBCYXNlIEFjdGl2aXR5Ci1yZWZyZXNoX3RleHQ9UmVmcmVzaAotb3Blbl9hZGRfdGV4dD1PcGVuIEFjdGl2aXR5IERldGFpbCBEaWFncmFtCi1kZWxldGVfdGV4dD1EZWxldGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3BsdWdpbi54bWwgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MWY3MmEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTwhLS0KLSBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLQotIENvbnRyaWJ1dG9yczoKLSBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0KLS0tPgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgIDxpbml0aWFsaXplciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0gICAgICA8ZmlsZVR5cGVzCi0gICAgICAgICB0eXBlPSJ0ZXh0IgotICAgICAgICAgZXh0ZW5zaW9uPSJ4bWkiPgotICAgICAgPC9maWxlVHlwZXM+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgICA8cGFyc2VyCi0gICAgICAgICB0eXBlPSJ4bWkiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUucmVzb3VyY2VzLkdNRlJlc291cmNlRmFjdG9yeSI+Ci0gICAgICA8L3BhcnNlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgPGVkaXRvcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRGlhZ3JhbUVkaXRvcklEIgotICAgICAgICBuYW1lPSJBY3Rpdml0eSBEaWFncmFtIEVkaXRvciIKLSAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvVU1MRGlhZ3JhbUZpbGUuZ2lmIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRGlhZ3JhbUVkaXRvciIKLSAgICAgICAgbWF0Y2hpbmdTdHJhdGVneT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MTWF0Y2hpbmdTdHJhdGVneSIKLSAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIj4KLSAgICAgPC9lZGl0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQotICA8IS0tIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAJICA8d2l6YXJkCi0gIAkgICAgIG5hbWU9IkFjdGl2aXR5IERpYWdyYW0iCi0gIAkgICAgIGljb249Imljb25zL29iajE2L1VNTERpYWdyYW1GaWxlLmdpZiIKLSAgCSAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkV4YW1wbGVzIgotICAJICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MQ3JlYXRpb25XaXphcmQiCi0gIAkgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxDcmVhdGlvbldpemFyZElEIj4KLSAgCSAgCSA8ZGVzY3JpcHRpb24+Ci0gIAkgIAkJQ3JlYXRlcyBBY3Rpdml0eSBkaWFncmFtLgotICAJICAJIDwvZGVzY3JpcHRpb24+ICAKLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+IC0tPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgCTwhLS0gPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy51aS5vYmplY3RDb250cmlidXRpb24uSUZpbGUxIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi51bWwiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IkluaXRpYWxpemUgeG1pIGRpYWdyYW0gZmlsZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb25JRCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy51aS5vYmplY3RDb250cmlidXRpb24uQWN0aXZpdHlFZGl0UGFydDIiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MTG9hZFJlc291cmNlQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxMb2FkUmVzb3VyY2VBY3Rpb25JRCIKLSAgICAgICAgICAgICAgIGxhYmVsPSJMb2FkIFJlc291cmNlLi4uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAKLQkgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5EZWxldGVEaWFncmFtIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxldGVEaWFncmFtQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZXRlRGlhZ3JhbUFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlRGVsZXRlRGlhZ3JhbV90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJURlbGV0ZURpYWdyYW1fdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+IAotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuUmVmcmVzaEZyb21CYXNlQWN0aW9uIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoRnJvbUJhc2VBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoRnJvbUJhc2VBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJXJlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5SZWZyZXNoQWN0aW9uIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlcmVmcmVzaF90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJXJlZnJlc2hfdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5PcGVuQUREIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuYWN0aW9ucy5PcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5hY3Rpb25zLk9wZW5BY3Rpdml0eURldGFpbERpYWdyYW1BY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJW9wZW5fYWRkX3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlb3Blbl9hZGRfdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5PcGVuQUREMiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5hY3Rpb25zLk9wZW5BY3Rpdml0eURldGFpbERpYWdyYW1BY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmFjdGlvbnMuT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlb3Blbl9hZGRfdGV4dCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVvcGVuX2FkZF90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLk9wZW5BREQzIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmFjdGlvbnMuT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuYWN0aW9ucy5PcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVvcGVuX2FkZF90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJW9wZW5fYWRkX3RleHQiLz4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5EZWxldGVEaWFncmFtRWxlbWVudEFjdGlvbiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRlbGV0ZURpYWdyYW1FbGVtZW50QWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvZGVsZXRlLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZXRlRGlhZ3JhbUVsZW1lbnRBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJWRlbGV0ZV90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIG92ZXJyaWRlQWN0aW9uSWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlZGVsZXRlX3RleHQiLz4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAtLT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uY29udHJpYnV0aW9uSXRlbVByb3ZpZGVycyI+Ci0gICAgICA8Y29udHJpYnV0aW9uSXRlbVByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciIKLSAgICAgICAgICAgIGNoZWNrUGx1Z2luTG9hZGVkPSJmYWxzZSI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ii8+Ci0gICAgICAgICA8IS0tCi0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tTW9kZWxBY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5NZXJnZU5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tTW9kZWxBY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Kb2luTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0Ii8+Ci0JCQk8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPiAKLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tTW9kZWxBY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIC0tPgotICAgICAgPC9jb250cmlidXRpb25JdGVtUHJvdmlkZXI+IAotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uZ2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVycyI+Ci0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgIGlkPSJBRFByZXNlbnRhdGlvbiI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5EaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJkZWxldGUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9InNhdmUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLmlkZS5wcm92aWRlcnMuRGlhZ3JhbUlERUdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgIGlkPSJBRFByZXNlbnRhdGlvbklERSI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5EaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJib29rbWFyayIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZW5kZXIucHJvdmlkZXJzLkRpYWdyYW1VSVJlbmRlckdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgICAgIGlkPSJBRFJlbmRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5EaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJjdXQiLz4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iY29weSIvPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJwYXN0ZSIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnZpZXdQcm92aWRlcnMiPgotICAgICAgPHZpZXdQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxWaWV3UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPGNvbnRleHQgdmlld0NsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtIiBzZW1hbnRpY0hpbnRzPSJBRCIvPgotICAgICAgICAgPGNvbnRleHQgdmlld0NsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIiBzZW1hbnRpY0hpbnRzPSIiLz4KLSAgICAgICAgIDxjb250ZXh0IHZpZXdDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZSIgc2VtYW50aWNIaW50cz0iIi8+Ci0gICAgICA8L3ZpZXdQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0UHJvdmlkZXJzIj4KLSAgICAgIDxlZGl0cGFydFByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVkaXRQYXJ0UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9lZGl0cGFydFByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFsZXR0ZVByb3ZpZGVycyI+Ci0gICAgICA8cGFsZXR0ZVByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTFBhbGV0dGVQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8ZWRpdG9yIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5EaWFncmFtRWRpdG9ySUQiLz4KLSAgICAgIDwvcGFsZXR0ZVByb3ZpZGVyPgotICAgICAgPHBhbGV0dGVQcm92aWRlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRlZmF1bHRQYWxldHRlUHJvdmlkZXIiPgotICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTWVkaXVtIi8+Ci0gICAgICAgIDxlZGl0b3IgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkRpYWdyYW1FZGl0b3JJRCIvPgotICAgICAgICA8Y29udHJpYnV0aW9uPgotICAgICAgICAgICAgPHByZWRlZmluZWRFbnRyeSAgICAKLSAgICAgICAgICAgIAlpZD0iZ2Vvc2hhcGVEcmF3ZXIiICAgcGF0aD0iLyI+Ci0gICAgICAgICAgICAJPGV4cGFuZCBmb3JjZT0idHJ1ZSIvPgotICAgICAgICAgICAgIDwvcHJlZGVmaW5lZEVudHJ5PiAKLSAgICAgICAgPC9jb250cmlidXRpb24+Ci0gICAgICA8L3BhbGV0dGVQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkubW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcnMiPgotICAgICAgPG1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L21vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMucHJvcGVydGllc1Byb3ZpZGVycyI+Ci0gICAgICA8UHJvcGVydGllc1Byb3ZpZGVyCi0gICAgICAgICAgICB2ZXJpZnlQbHVnaW5Mb2FkZWQ9ImZhbHNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MUHJvcGVydHlQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L1Byb3BlcnRpZXNQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvblByb3ZpZGVycyI+Ci0gICAgICA8SWNvblByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEljb25Qcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ii8+Ci0gICAgICA8L0ljb25Qcm92aWRlcj4KLSAgICAgIDxJY29uUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmdlb3NoYXBlcy5pbnRlcm5hbC5wcm92aWRlcnMuR2VvU2hhcGVJY29uUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5Ci0gICAgICAgICAgICAgICBuYW1lPSJNZWRpdW0iPgotICAgICAgICAgPC9Qcmlvcml0eT4KLSAgICAgICAgIDxvYmplY3QgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXcob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24pIiBpZD0iR2VvU2hhcGUiPgotICAgICAgICAJIDxtZXRob2QgbmFtZT0iZ2V0VHlwZSgpIiB2YWx1ZT0ib3ZhbCx0cmlhbmdsZSxyZWN0YW5nbGUsc2hhZG93UmVjdGFuZ2xlLHJlY3RhbmdsZTNELHJvdW5kUmVjdGFuZ2xlLGhleGFnb24sb2N0YWdvbixwZW50YWdvbixkaWFtb25kLGN5bGluZGVyLGxpbmUiLz4KLQkgICAgIDwvb2JqZWN0PgotICAgICAgICAgPGNvbnRleHQgZWxlbWVudHM9Ikdlb1NoYXBlIj4KLSAgICAgICAgIDwvY29udGV4dD4KLSAgICAgIDwvSWNvblByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXJQcm92aWRlcnMiPgotICAgICAgPFBhcnNlclByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTFBhcnNlclByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvUGFyc2VyUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lbGVtZW50VHlwZXMiPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkFjdGl2aXR5Xzc5IgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iQWN0aXZpdHkiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzLkFjdGl2aXR5RWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iNzkiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSIKLSAgICAgICAgICAgICAgIG5hbWU9IkFjdGl2aXR5IFBhcnRpdGlvbiIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyYWR2aWNlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzLkFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlckFkdmljZSI+Ci0gICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMjAwMSIvPgotICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxIgotICAgICAgICAgICAgICAgbmFtZT0iRW5kIE5vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJBY3Rpdml0eUZpbmFsTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnMuQWN0aXZpdHlGaW5hbE5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDAxIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5NZXJnZU5vZGVfMTAwMiIKLSAgICAgICAgICAgICAgIG5hbWU9Ik1lcmdlIE5vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJNZXJnZU5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzLk1lcmdlTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDIiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkZvcmtOb2RlXzEwMDMiCi0gICAgICAgICAgICAgICBuYW1lPSJGb3JrIE5vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJGb3JrTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnMuRm9ya05vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDAzIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5Jbml0aWFsTm9kZV8xMDA0IgotICAgICAgICAgICAgICAgbmFtZT0iU3RhcnQgTm9kZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkluaXRpYWxOb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVycy5Jbml0aWFsTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDQiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkRlY2lzaW9uTm9kZV8xMDA1IgotICAgICAgICAgICAgICAgbmFtZT0iRGVjaXNpb24gTm9kZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkRlY2lzaW9uTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnMuRGVjaXNpb25Ob2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwNSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuSm9pbk5vZGVfMTAwNiIKLSAgICAgICAgICAgICAgIG5hbWU9IkpvaW4gTm9kZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkpvaW5Ob2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVycy5Kb2luTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDYiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyIKLSAgICAgICAgICAgICAgIG5hbWU9IkFjdGl2aXR5IgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDciLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkFjdGl2aXR5UGFydGl0aW9uXzEwMDgiCi0gICAgICAgICAgICAgICBuYW1lPSJBY3Rpdml0eSBQYXJ0aXRpb24iCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJBY3Rpdml0eVBhcnRpdGlvbiIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnMuQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDA4Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSIKLSAgICAgICAgICAgICAgIG5hbWU9IlRhc2sgRGVzY3JpcHRvciIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwOSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAiCi0gICAgICAgICAgICAgICBuYW1lPSJQaGFzZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyYWR2aWNlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyQWR2aWNlIj4KLSAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMTAiLz4KLSAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEiCi0gICAgICAgICAgICAgICBuYW1lPSJJdGVyYXRpb24iCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcmFkdmljZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRIZWxwZXJBZHZpY2UiPgotICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAxMSIvPgotICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyIgotICAgICAgICAgICAgICAgbmFtZT0iTWlsZXN0b25lIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXJhZHZpY2U9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlckFkdmljZSI+Ci0gICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMTIiLz4KLSAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuQ29udHJvbEZsb3dfMzAwMSIKLSAgICAgICAgICAgICAgIG5hbWU9IkNvbnRyb2wgRmxvdyIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkNvbnRyb2xGbG93IgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVycy5Db250cm9sRmxvd0VkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMDEiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWxlbWVudFR5cGVCaW5kaW5ncyI+Ci0gICAgICA8Y2xpZW50Q29udGV4dCBpZD0iQURDbGllbnRDb250ZXh0Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5lZGl0aW5nRG9tYWluIgotICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5FZGl0aW5nRG9tYWluIi8+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L2NsaWVudENvbnRleHQ+IAotICAgICAgPGJpbmRpbmcgY29udGV4dD0iQURDbGllbnRDb250ZXh0Ij4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5BY3Rpdml0eV83OSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuTWVyZ2VOb2RlXzEwMDIiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5Gb3JrTm9kZV8xMDAzIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuSW5pdGlhbE5vZGVfMTAwNCIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkRlY2lzaW9uTm9kZV8xMDA1Ii8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuSm9pbk5vZGVfMTAwNiIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkFjdGl2aXR5UGFydGl0aW9uXzEwMDgiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuQ29udHJvbEZsb3dfMzAwMSIvPgotICAgICAgICAgPGFkdmljZSByZWY9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5hZHZpY2Uubm90YXRpb25EZXBkZW5kZW50cyIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHBhdHRlcm49Ii4qIi8+Ci0gICAgICA8L2JpbmRpbmc+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgotCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvRVBGRGlhZ3JhbVBsdWdpbi5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL0VQRkRpYWdyYW1QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZkMjZlOC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvRVBGRGlhZ3JhbVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEVQRkRpYWdyYW1QbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEVQRkRpYWdyYW1QbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFUEZEaWFncmFtUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVBGRGlhZ3JhbVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gaW1hZ2UgYmFzZWQgb24gZ2l2ZW4gcGF0aAotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBpbWFnZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgaW1hZ2VGaWxlUGF0aCkgewotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoZmFsc2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKXsKLQkJcmV0dXJuIFBMVUdJTl9JRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9Db25zdGFudHMuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjJkNzJhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfU09VUkNFID0gInVtYV9zcmMiOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfRURJVE9SX0lOUFVUID0gInVtYV9lZGl0b3JfaW5wdXQiOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfRUxFTUVOVCA9ICJ1bWFfZWxlbWVudCI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9FTEVNRU5UX0dVSUQgPSAidW1hX2d1aWQiOwotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvRGlhZ3JhbW1pbmdSZXNvdXJjZXMuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL0RpYWdyYW1taW5nUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYTE4NzcuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvRGlhZ3JhbW1pbmdSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uRGlhZ3JhbVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1taW5nUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERpYWdyYW1taW5nUmVzb3VyY2VzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRGlhZ3JhbVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVEb2N1bWVudFByb3ZpZGVyX2NyZWF0ZUVsZW1lbnRJbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVEb2N1bWVudFByb3ZpZGVyX2Vycm9yX291dF9vZl9zeW5jOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVEb2N1bWVudFByb3ZpZGVyX3Rhc2tfc2F2aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVEb2N1bWVudFByb3ZpZGVyX3Jlc2V0RG9jdW1lbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZURvY3VtZW50UHJvdmlkZXJfcmVzb3VyY2VDaGFuZ2VkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVEb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdG9yYWdlRG9jdW1lbnRQcm92aWRlcl9jcmVhdGVFbGVtZW50SW5mbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdG9yYWdlRG9jdW1lbnRQcm92aWRlcl91cGRhdGVDYWNoZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdG9yYWdlRG9jdW1lbnRQcm92aWRlcl9pc1JlYWRPbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRQYWdlX0RJQUdSQU1fQ1JFQVRJT05fRkFJTF9FWENfOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkUGFnZV9NZXNzYWdlX0ZpbGVFeGlzdHNfRVJST1JfOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUNyZWF0b3JfVGFza1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcldpemFyZFBhZ2VfRGlhbG9nSW50ZXJuYWxFcnJvclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcldpemFyZFBhZ2VfSW52YWxpZEZpbGVuYW1lOyAKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlU2F2ZUFzX0RpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVTYXZlQXNfRGlhbG9nTWVzc2FnZVRleHQ7Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9FcGZEaWFncmFtQWN0aW9uUHJvdmlkZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL0VwZkRpYWdyYW1BY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWM1ZDcyLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL0VwZkRpYWdyYW1BY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5hY3Rpb25zLkFjdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5hY3Rpb25zLk9yaWVudGF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uY29udHJpYnV0aW9uaXRlbS5BYnN0cmFjdENvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkudXRpbC5JV29ya2JlbmNoUGFydERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRXBmRGlhZ3JhbUFjdGlvblByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RDb250cmlidXRpb25JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEVwZkRpYWdyYW1BY3Rpb25Qcm92aWRlcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5jb250cmlidXRpb25pdGVtLkFic3RyYWN0Q29udHJpYnV0aW9uSXRlbVByb3ZpZGVyI2NyZWF0ZUFjdGlvbihqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkudXRpbC5JV29ya2JlbmNoUGFydERlc2NyaXB0b3IpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIElBY3Rpb24gY3JlYXRlQWN0aW9uKFN0cmluZyBhY3Rpb25JZCwgSVdvcmtiZW5jaFBhcnREZXNjcmlwdG9yIHBhcnREZXNjcmlwdG9yKSB7Ci0JCQotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gcGFydERlc2NyaXB0b3IuZ2V0UGFydFBhZ2UoKTsKLQkJaWYoYWN0aW9uSWQuZXF1YWxzKEFjdGlvbklkcy5BQ1RJT05fVl9PUklFTlRBVElPTikpewotCQkJT3JpZW50YXRpb25BY3Rpb24gYWN0aW9uID0gbmV3IE9yaWVudGF0aW9uQWN0aW9uKHBhZ2UsCi0JCQkJCWFjdGlvbklkKTsKLQkJCWFjdGlvbi5zZXRJZChhY3Rpb25JZCk7Ci0JCQlhY3Rpb24uc2V0VGV4dCgidk9yaWVudGF0aW9uIik7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInZPcmllbnRhdGlvbiIpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVBY3Rpb24oYWN0aW9uSWQsIHBhcnREZXNjcmlwdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9SZXNvdXJjZXMucHJvcGVydGllcyBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmM5YWUwLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMqKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSMqfCBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgICBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gICAgICAgICAgICAgICAgIHwKLSMqfCBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgIHwKLSMqfCBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgIHwKLSMqfCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgIHwKLSMqfCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSMqfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSMqfCBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSMqfCAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgIHwKLSMqKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotIyMgRXJyb3JzICMjCi0KLUZpbGVEb2N1bWVudFByb3ZpZGVyX2NyZWF0ZUVsZW1lbnRJbmZvPUZpbGVEb2N1bWVudFByb3ZpZGVyLmNyZWF0ZUVsZW1lbnRJbmZvCi1GaWxlRG9jdW1lbnRQcm92aWRlcl9lcnJvcl9vdXRfb2Zfc3luYz1UaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBmaWxlIHN5c3RlbQotRmlsZURvY3VtZW50UHJvdmlkZXJfdGFza19zYXZpbmc9U2F2aW5nCi1GaWxlRG9jdW1lbnRQcm92aWRlcl9yZXNldERvY3VtZW50PUZpbGVEb2N1bWVudFByb3ZpZGVyLnJlc2V0RG9jdW1lbnQKLUZpbGVEb2N1bWVudFByb3ZpZGVyX3Jlc291cmNlQ2hhbmdlZD1GaWxlRG9jdW1lbnRQcm92aWRlci5yZXNvdXJjZUNoYW5nZWQKLUZpbGVEb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZD1GaWxlRG9jdW1lbnRQcm92aWRlci5oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQKLQotU3RvcmFnZURvY3VtZW50UHJvdmlkZXJfY3JlYXRlRWxlbWVudEluZm89U3RvcmFnZURvY3VtZW50UHJvdmlkZXIuY3JlYXRlRWxlbWVudEluZm8KLVN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyX3VwZGF0ZUNhY2hlPVN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyLnVwZGF0ZUNhY2hlCi1TdG9yYWdlRG9jdW1lbnRQcm92aWRlcl9pc1JlYWRPbmx5PVN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyLmlzUmVhZE9ubHkKLVN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZT1TdG9yYWdlRG9jdW1lbnRQcm92aWRlci5pc01vZGlmaWFibGUKLQotIy0tLSBFeGNlcHRpb25zIC0tLQotV2l6YXJkUGFnZV9ESUFHUkFNX0NSRUFUSU9OX0ZBSUxfRVhDXz1VbmFibGUgdG8gY3JlYXRlIGRpYWdyYW0gZmlsZQotCi0jLS0tIEVycm9ycyAtLS0KLVdpemFyZFBhZ2VfTWVzc2FnZV9GaWxlRXhpc3RzX0VSUk9SXz1UaGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotCi0jLS0tLSBGaWxlIGNyZWF0aW9uCi1GaWxlQ3JlYXRvcl9UYXNrVGl0bGUgPSBDcmVhdGluZwotRWRpdG9yV2l6YXJkUGFnZV9EaWFsb2dJbnRlcm5hbEVycm9yVGl0bGU9Q3JlYXRpb24gUHJvYmxlbXMKLUVkaXRvcldpemFyZFBhZ2VfSW52YWxpZEZpbGVuYW1lID0gJyd7MH0nJyBpcyBub3QgYSB2YWxpZCBmaWxlIG5hbWUuIAotCi0jLS0tLSBGaWxlIFNhdmUgQXMKLUZpbGVTYXZlQXNfRGlhbG9nVGl0bGUgPVByb2JsZW0gRHVyaW5nIFNhdmUgQXMuLi4KLUZpbGVTYXZlQXNfRGlhbG9nTWVzc2FnZVRleHQgPVNhdmUgY291bGQgbm90IGJlIGNvbXBsZXRlZC4gVGFyZ2V0IGZpbGUgaXMgYWxyZWFkeSBvcGVuIGluIGFub3RoZXIgZWRpdG9yLgotCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9hY3Rpb25zL0FjdGlvbklkcy5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvYWN0aW9ucy9BY3Rpb25JZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjMTI2MS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9hY3Rpb25zL0FjdGlvbklkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuYWN0aW9uczsKLQotLyoqCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aW9uSWRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVl9PUklFTlRBVElPTiA9ICJ2T3JpZW50YXRpb25BY3Rpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9IX09SSUVOVEFUSU9OID0gImhPcmllbnRhdGlvbkFjdGlvbiI7Ci0JCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9hY3Rpb25zL09wZW5BY3Rpdml0eURldGFpbERpYWdyYW1BY3Rpb24uamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2FjdGlvbnMvT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTlkYjBkLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2FjdGlvbnMvT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLk5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRVBGRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBBY3Rpb24gdG8gb3BlbiBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbSBmb3Igc2VsZWN0ZWQgQWN0aXZpdHkuCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIE9wZW5BY3Rpdml0eURldGFpbERpYWdyYW1BY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JcHJpdmF0ZSBFZGl0UGFydCBzZWxlY3RlZFBhcnQ7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0OwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQkKLQkJCi0JCWlmKHNlbGVjdGVkUGFydCAhPSBudWxsKXsKLQkJCU5vZGUgdmlldyA9IChOb2RlKXNlbGVjdGVkUGFydC5nZXRNb2RlbCgpOwotCQkJRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IChEaWFncmFtRWRpdFBhcnQpc2VsZWN0ZWRQYXJ0LmdldFBhcmVudCgpOwotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pZGlhZ3JhbUVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXREaWFncmFtQWRhcHRlcihkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkKLQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIodmlldy5nZXRFbGVtZW50KCkpOwotCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gYWRhcHRlci5nZXRXcmFwcGVyKCk7Ci0JCQlpZihzZWxlY3RlZE9iamVjdCA9PSBudWxsKXsKLQkJCQlzZWxlY3RlZE9iamVjdCA9IGFkYXB0ZXIuZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJLy9JRWRpdG9yUGFydCBwYXJlbnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0KAotCQkJCQlzZWxlY3RlZE9iamVjdCwgZGlhZ3JhbUFkYXB0ZXIuZ2V0U3VwcHJlc3Npb24oKSwgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pOwotCQkJRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW1FZGl0b3IodGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpLCBpbnB1dCwgCi0JCQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5ULCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMQotCQkJCQkmJiBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCQlzZWxlY3RlZFBhcnQgPSAoRWRpdFBhcnQpIHN0cnVjdHVyZWRTZWxlY3Rpb24KLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2FjdGlvbnMvT3JpZW50YXRpb25BY3Rpb24uamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2FjdGlvbnMvT3JpZW50YXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1NjhiOC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9hY3Rpb25zL09yaWVudGF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkRpYWdyYW1BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT3JpZW50YXRpb25BY3Rpb24gZXh0ZW5kcyBEaWFncmFtQWN0aW9uIHsKLQkKLQlwdWJsaWMgT3JpZW50YXRpb25BY3Rpb24oSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSwgU3RyaW5nIG9yaWVuYXRpb24pIHsKLQkJc3VwZXIod29ya2JlbmNoUGFnZSk7Ci0JCXNldElkKG9yaWVuYXRpb24pOwotCX0KLQkKLQlwdWJsaWMgT3JpZW50YXRpb25BY3Rpb24oSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNocGFydCwgU3RyaW5nIG9yaWllbnRhdGlvbikgewotCQlzdXBlcih3b3JrYmVuY2hwYXJ0KTsKLQkJc2V0SWQob3JpaWVudGF0aW9uKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHdvcmtiZW5jaFBhZ2UKLQkgKi8KLQlwdWJsaWMgT3JpZW50YXRpb25BY3Rpb24oSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSkgewotCQlzdXBlcih3b3JrYmVuY2hQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd29ya2JlbmNocGFydAotCSAqLwotCXB1YmxpYyBPcmllbnRhdGlvbkFjdGlvbihJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hwYXJ0KSB7Ci0JCXN1cGVyKHdvcmtiZW5jaHBhcnQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5EaWFncmFtQWN0aW9uI2NyZWF0ZVRhcmdldFJlcXVlc3QoKQotCSAqLwotCXByb3RlY3RlZCBSZXF1ZXN0IGNyZWF0ZVRhcmdldFJlcXVlc3QoKSB7Ci0JCXJldHVybiBuZXcgT3JpZW50YXRpb25SZXF1ZXN0KGdldElkKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5EaWFncmFtQWN0aW9uI2lzU2VsZWN0aW9uTGlzdGVuZXIoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2FjdGlvbnMvT3JpZW50YXRpb25SZXF1ZXN0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9hY3Rpb25zL09yaWVudGF0aW9uUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGRiOWI3Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2FjdGlvbnMvT3JpZW50YXRpb25SZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuTG9jYXRpb25SZXF1ZXN0OwotCi0vKioKLSAqIFJlcXVlc3QgaXMgY29tbXVuaWNhdGlvbiBvYmplY3QgZm9yIGNvbW1hbmQgYW5kIHVpLiBPcmllbnRhdGlvbiBSZXF1ZXN0IGlzIAotICogZm9yIHZlcnRpY2FsIG9yIGhvcml6b250YWwgb3JpZW50YXRpb24gb2YgRWRpdFBhcnQgCi0gKi8KLXB1YmxpYyBjbGFzcyBPcmllbnRhdGlvblJlcXVlc3QgZXh0ZW5kcyBMb2NhdGlvblJlcXVlc3QgewotCi0JcHJvdGVjdGVkIExpc3QgZWRpdFBhcnRzOwotCQotCXB1YmxpYyBPcmllbnRhdGlvblJlcXVlc3QoU3RyaW5nIHR5cGUpIHsKLQkJc3VwZXIodHlwZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKExpc3QgZWRpdFBhcnRzKXsKLQkJdGhpcy5lZGl0UGFydHMgPSBuZXcgQXJyYXlMaXN0KGVkaXRQYXJ0cyk7Ci0JfQotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGVkKCl7Ci0JCXJldHVybiBlZGl0UGFydHM7Ci0JfQotfQkKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0FjdGl2aXR5UGFydGl0aW9uRGVzdHJveUNvbW1hbmQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0FjdGl2aXR5UGFydGl0aW9uRGVzdHJveUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4ZTY0MC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9BY3Rpdml0eVBhcnRpdGlvbkRlc3Ryb3lDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuQ3Jvc3NSZWZlcmVuY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogRGVzdHJveUNvbW1hbmQgdG8gZGVzdHJveSBBY3Rpdml0eVBhcnRpdGlvbiBhbmQgYWxsIHRoZSBlbGVtZW50cyBpbnNpZGUgdGhlIHBhcnRpdGlvbnMuCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkRlc3Ryb3lDb21tYW5kIGV4dGVuZHMgRGVzdHJveUVsZW1lbnRDb21tYW5kIHsKLQotCQotCXByaXZhdGUgRWRpdFBhcnQgaG9zdDsKLQotCS8qKgotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uRGVzdHJveUNvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QsIEVkaXRQYXJ0IGhvc3QpIHsKLQkJc3VwZXIocmVxdWVzdCk7Ci0JCXRoaXMuaG9zdCA9IGhvc3Q7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQkKLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9EZXN0cm95KCkgewotCQlWaWV3IHZpZXcgPSAoVmlldykgaG9zdC5nZXRNb2RlbCgpOwotCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdmlldzsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudFRvRGVzdHJveSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bkluY29taW5nUmVmZXJlbmNlcyhFT2JqZWN0IGRlc3RydWN0ZWUpIHsKLQkJQ3Jvc3NSZWZlcmVuY2VBZGFwdGVyIGNyb3NzUmVmZXJlbmNlciA9IENyb3NzUmVmZXJlbmNlQWRhcHRlcgotCQkJCS5nZXRFeGlzdGluZ0Nyb3NzUmVmZXJlbmNlQWRhcHRlcihkZXN0cnVjdGVlKTsKLQkJaWYgKGNyb3NzUmVmZXJlbmNlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGludmVyc2VSZWZlcmVuY2VzID0gY3Jvc3NSZWZlcmVuY2VyCi0JCQkJCS5nZXRJbnZlcnNlUmVmZXJlbmNlcyhkZXN0cnVjdGVlKTsKLQkJCWlmIChpbnZlcnNlUmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBpbnZlcnNlUmVmZXJlbmNlcy5zaXplKCk7Ci0JCQkJaWYgKHNpemUgPiAwKSB7Ci0JCQkJCVNldHRpbmcgc2V0dGluZzsKLQkJCQkJRVJlZmVyZW5jZSBlUmVmOwotCQkJCQlTZXR0aW5nW10gc2V0dGluZ3MgPSAoU2V0dGluZ1tdKSBpbnZlcnNlUmVmZXJlbmNlcwotCQkJCQkJCS50b0FycmF5KG5ldyBTZXR0aW5nW3NpemVdKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLQkJCQkJCXNldHRpbmcgPSBzZXR0aW5nc1tpXTsKLQkJCQkJCWVSZWYgPSAoRVJlZmVyZW5jZSkgc2V0dGluZwotCQkJCQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCQkJCQlpZiAoZVJlZi5pc0NoYW5nZWFibGUoKQotCQkJCQkJCQkmJiAoZVJlZi5pc0Rlcml2ZWQoKSA9PSBmYWxzZSkKLQkJCQkJCQkJJiYgKGVSZWYuaXNDb250YWlubWVudCgpID09IGZhbHNlKQotCQkJCQkJCQkmJiAoZVJlZi5pc0NvbnRhaW5lcigpID09IGZhbHNlKSkgewotCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoc2V0dGluZy5nZXRFT2JqZWN0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9DcmVhdGVBY3Rpdml0eU5vZGVJbkFjdGl2aXR5UGFydGl0aW9uLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9DcmVhdGVBY3Rpdml0eU5vZGVJbkFjdGl2aXR5UGFydGl0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OGI5ZGQuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvQ3JlYXRlQWN0aXZpdHlOb2RlSW5BY3Rpdml0eVBhcnRpdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLlBhY2thZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZUFjdGl2aXR5Tm9kZUluQWN0aXZpdHlQYXJ0aXRpb24gZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqLwotCXB1YmxpYyBDcmVhdGVBY3Rpdml0eU5vZGVJbkFjdGl2aXR5UGFydGl0aW9uKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJc3VwZXIocmVxdWVzdCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJaWYoY29udGFpbmVyIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pewotCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQkKLQkvKioKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQjZG9FeGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCXN0YXR1cyA9IHN1cGVyLmRvRXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQkJRU9iamVjdCBuZXdFbGVtZW50ID0gZ2V0TmV3RWxlbWVudCgpOwotCQkKLQkJaWYgKG5ld0VsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIAotCQl7Ci0JCQlFT2JqZWN0IG9iaiA9IGdldE9yaWdpbmFsQ29udGFpbmVyKCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pIHsKLQkJCQkvLyBzZXQgaW5wYXJ0aXRpb24gCi0JCQkJKChBY3Rpdml0eU5vZGUpIG5ld0VsZW1lbnQpLmdldEluUGFydGl0aW9ucygpLmFkZChvYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCQotCi0JLyoqCi0JICogQGN1c3RvbQotCSAqLwotCXByaXZhdGUgRU9iamVjdCBnZXRPcmlnaW5hbENvbnRhaW5lcigpCi0JewotCQlyZXR1cm4gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRDb250YWluZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGFpbm1lbnQgZmVhdHVyZSBmb3IgdGhlIG5ldyBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDb250YWlubWVudEZlYXR1cmUoKSB7Ci0KLQkJLyoqCi0JCSAqIFRoZSBjb250YWlubWVudCBmZWF0dXJlIGluIHdoaWNoIHRoZSBuZXcgZWxlbWVudCB3aWxsIGJlIGNyZWF0ZWQuCi0JCSAqLwotCQlFUmVmZXJlbmNlIGNvbnRhaW5tZW50RmVhdHVyZT1udWxsOwotCQlpZiAoY29udGFpbm1lbnRGZWF0dXJlID09IG51bGwpIHsKLQkJCUVDbGFzcyBjbGFzc1RvRWRpdCA9IGdldEVDbGFzc1RvRWRpdCgpOwotCi0JCQlpZiAoY2xhc3NUb0VkaXQgIT0gbnVsbCkgewotCQkJCUlFbGVtZW50VHlwZSB0eXBlID0gZ2V0RWxlbWVudFR5cGUoKTsKLQotCQkJCWlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5nZXRFQ2xhc3MoKSAhPSBudWxsKSB7Ci0JCQkJCWNvbnRhaW5tZW50RmVhdHVyZSA9IFBhY2thZ2VVdGlsLmZpbmRGZWF0dXJlKGNsYXNzVG9FZGl0LAotCQkJCQkJCXR5cGUuZ2V0RUNsYXNzKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb250YWlubWVudEZlYXR1cmU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvQ3JlYXRlRGlhZ3JhbUNvbW1hbmQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0NyZWF0ZURpYWdyYW1Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZDYxMzcuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvQ3JlYXRlRGlhZ3JhbUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UudXRpbC5VbWFVbWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTEZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRGlhZ3JhbUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTU1BTkRfTEFCRUwgPSAiQ3JlYXRpbmcgZGlhZ3JhbSBhbmQgbW9kZWwiOyAKLQlwcml2YXRlIElFZGl0b3JJbnB1dCBpbnB1dDsKLQlwcml2YXRlIFJlc291cmNlIGRpYWdyYW1SZXNvdXJjZTsKLQlwcml2YXRlIFN0cmluZyBraW5kUGFyYW07Ci0JLy9wcml2YXRlIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbjsKLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGFmZmVjdGVkRmlsZXMKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlRGlhZ3JhbUNvbW1hbmQoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJU3RyaW5nIGxhYmVsLCBMaXN0IGFmZmVjdGVkRmlsZXMsIAotCQkJSUVkaXRvcklucHV0IGlucHV0LCBSZXNvdXJjZSBkaWFncmFtUmVzb3VjZSwKLQkJCVN0cmluZyBraW5kUGFyYW0pIHsKLQkJc3VwZXIoZG9tYWluLCBsYWJlbCwgYWZmZWN0ZWRGaWxlcyk7Ci0JCXRoaXMuaW5wdXQgPSBpbnB1dDsKLQkJdGhpcy5kaWFncmFtUmVzb3VyY2UgPSBkaWFncmFtUmVzb3VjZTsKLQkJdGhpcy5raW5kUGFyYW0gPSBraW5kUGFyYW07Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBvcHRpb25zCi0JICogQHBhcmFtIGFmZmVjdGVkRmlsZXMKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlRGlhZ3JhbUNvbW1hbmQoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJU3RyaW5nIGxhYmVsLCBNYXAgb3B0aW9ucywgTGlzdCBhZmZlY3RlZEZpbGVzKSB7Ci0JCXN1cGVyKGRvbWFpbiwgbGFiZWwsIG9wdGlvbnMsIGFmZmVjdGVkRmlsZXMpOwotCQkvLy90aGlzLmRvbWFpbiA9IGRvbWFpbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQjZG9FeGVjdXRlV2l0aFJlc3VsdChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlBY3Rpdml0eSBtb2RlbCA9IGNyZWF0ZUluaXRpYWxNb2RlbCgpOwotCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQobW9kZWwpOwotCQlEaWFncmFtIGRpYWdyYW0gPSBWaWV3U2VydmljZS5jcmVhdGVEaWFncmFtKG1vZGVsLCBraW5kUGFyYW0sCi0JCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0KWlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQlpZihtZXRob2RFbGVtZW50ICE9IG51bGwgJiYgbWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkpewotCQkJCVVtYVVtbFV0aWwuY3JlYXRlRUFubm90YXRpb25Gb3JVbWwobW9kZWwsIG1ldGhvZEVsZW1lbnQuZ2V0R3VpZCgpKTsKLQkJCX0KLQkJCQotCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQkJZGlhZ3JhbS5zZXROYW1lKG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCWRpYWdyYW0uc2V0RWxlbWVudChtb2RlbCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWRpYWdyYW1SZXNvdXJjZS5zYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQotCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIHN0b3JlIG1vZGVsIGFuZCBkaWFncmFtIHJlc291cmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7CQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgZG9tYWluIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGNhbnZhcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBjcmVhdGVJbml0aWFsTW9kZWwoKSB7Ci0JCXJldHVybiBVTUxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0NyZWF0ZUluY29taW5nQ29udHJvbEZsb3dDb21tYW5kLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9DcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTJkMzJjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0NyZWF0ZUluY29taW5nQ29udHJvbEZsb3dDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZCBleHRlbmRzIENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQgewotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcXVlc3QsCi0JCQlFT2JqZWN0IGVsZW1lbnQpIHsKLQkJc3VwZXIocmVxdWVzdCk7Ci0JCXNldEVsZW1lbnRUb0VkaXQoZWxlbWVudCk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICovCi0JcHVibGljIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3dDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxdWVzdCkgewotCQlzdXBlcihyZXF1ZXN0KTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLS8vCQlpZihnZXRTb3VyY2UoKSA9PSBudWxsKQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCi0vLwkJaWYgKGdldEVDbGFzc1RvRWRpdCgpID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCi0vLwkJaWYgKGdldENvbnRhaW5tZW50RmVhdHVyZSgpICE9IG51bGwpIHsKLS8vCQkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSBnZXRDb250YWlubWVudEZlYXR1cmUoKS5nZXRFVHlwZSgpOwotLy8JCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0vLwotLy8JCQlpZiAoZUNsYXNzaWZpZXIgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLS8vCQkJCXJlc3VsdCA9ICgoRUNsYXNzKSBlQ2xhc3NpZmllcikuaXNTdXBlclR5cGVPZihnZXRFbGVtZW50VHlwZSgpCi0vLwkJCQkJCS5nZXRFQ2xhc3MoKSk7Ci0vLwkJCX0KLS8vCi0vLwkJCXJlc3VsdCA9IHJlc3VsdAotLy8JCQkJCSYmIFBhY2thZ2VVdGlsLmNhblJlZmVyZW5jZShnZXRFQ2xhc3NUb0VkaXQoKSwKLS8vCQkJCQkJCWdldENvbnRhaW5tZW50RmVhdHVyZSgpLCBnZXRFbGVtZW50VHlwZSgpCi0vLwkJCQkJCQkJCS5nZXRFQ2xhc3MoKSk7Ci0vLwotLy8JCQlyZXR1cm4gcmVzdWx0OwotLy8JCX0KLS8vCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJQ29udHJvbEZsb3cgbmV3RWxlbWVudCA9IChDb250cm9sRmxvdykgc3VwZXIuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCW5ld0VsZW1lbnQuc2V0VGFyZ2V0KChBY3Rpdml0eU5vZGUpIGdldFRhcmdldCgpKTsKLQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIGdldFNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gbmV3RWxlbWVudDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9DcmVhdGVPdXRnb2luZ0NvbnRyb2xGbG93Q29tbWFuZC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczOTA5NC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9DcmVhdGVPdXRnb2luZ0NvbnRyb2xGbG93Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLlBhY2thZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQgZXh0ZW5kcyBDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0LAotCQkJRU9iamVjdCBlbGVtZW50KSB7Ci0JCXN1cGVyKHJlcXVlc3QpOwotCQlzZXRFbGVtZW50VG9FZGl0KGVsZW1lbnQpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqLwotCXB1YmxpYyBDcmVhdGVPdXRnb2luZ0NvbnRyb2xGbG93Q29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJc3VwZXIocmVxdWVzdCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5Tm9kZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlpZihnZXRTb3VyY2UoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKGdldEVDbGFzc1RvRWRpdCgpID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChnZXRDb250YWlubWVudEZlYXR1cmUoKSAhPSBudWxsKSB7Ci0JCQlFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA9IGdldENvbnRhaW5tZW50RmVhdHVyZSgpLmdldEVUeXBlKCk7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLQkJCWlmIChlQ2xhc3NpZmllciBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJCXJlc3VsdCA9ICgoRUNsYXNzKSBlQ2xhc3NpZmllcikuaXNTdXBlclR5cGVPZihnZXRFbGVtZW50VHlwZSgpCi0JCQkJCQkuZ2V0RUNsYXNzKCkpOwotCQkJfQotCi0JCQlyZXN1bHQgPSByZXN1bHQKLQkJCQkJJiYgUGFja2FnZVV0aWwuY2FuUmVmZXJlbmNlKGdldEVDbGFzc1RvRWRpdCgpLAotCQkJCQkJCWdldENvbnRhaW5tZW50RmVhdHVyZSgpLCBnZXRFbGVtZW50VHlwZSgpCi0JCQkJCQkJCQkuZ2V0RUNsYXNzKCkpOwotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQkJLy9yZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCS8vIFRPRE86IFJlc29sdmUgdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IHByb3Blcmx5LgotCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlci5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgZ2V0VGFyZ2V0KCkpOwotCQkJbmV3RWxlbWVudC5zZXRTb3VyY2UoKEFjdGl2aXR5Tm9kZSkgZ2V0U291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBuZXdFbGVtZW50OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0NyZWF0ZVJlbGF0aW9uU2hpcENvbW1hbmRTdHJ1Y3R1cmVkQWN0aXZpdHkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0NyZWF0ZVJlbGF0aW9uU2hpcENvbW1hbmRTdHJ1Y3R1cmVkQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA1MmU4ZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9DcmVhdGVSZWxhdGlvblNoaXBDb21tYW5kU3RydWN0dXJlZEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVSZWxhdGlvblNoaXBDb21tYW5kU3RydWN0dXJlZEFjdGl2aXR5IGV4dGVuZHMKLQkJQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqLwotCXB1YmxpYyBDcmVhdGVSZWxhdGlvblNoaXBDb21tYW5kU3RydWN0dXJlZEFjdGl2aXR5KAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0LCBFT2JqZWN0IGVsZW1lbnQpIHsKLQkJc3VwZXIocmVxdWVzdCk7Ci0JCXNldEVsZW1lbnRUb0VkaXQoZWxlbWVudCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKTsKLQl9OwotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCUNvbnRyb2xGbG93IG5ld0VsZW1lbnQgPSAoQ29udHJvbEZsb3cpIHN1cGVyCi0JCQkJLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQluZXdFbGVtZW50LnNldFRhcmdldCgoQWN0aXZpdHlOb2RlKSBnZXRUYXJnZXQoKSk7Ci0JCQluZXdFbGVtZW50LnNldFNvdXJjZSgoQWN0aXZpdHlOb2RlKSBnZXRTb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL09yaWVudGF0aW9uQ29tbWFuZC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvT3JpZW50YXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZDM0ZTEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvT3JpZW50YXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5hY3Rpb25zLkFjdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcmllbnRhdGlvbkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIHsKLQotCXByaXZhdGUgU3RyaW5nIG9yaWVudGF0aW9uOwotCXByaXZhdGUgRWRpdFBhcnQgZWRpdFBhcnQ7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGFmZmVjdGVkRmlsZXMKLQkgKi8KLQlwdWJsaWMgT3JpZW50YXRpb25Db21tYW5kKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgU3RyaW5nIGxhYmVsLAotCQkJRWRpdFBhcnQgZWRpdFBhcnQsIFN0cmluZyBvcmllbnRhdGlvbikgewotCQkKLQkJc3VwZXIoZG9tYWluLCAiT3JpZW50YXRpb24iLCBnZXRXb3Jrc3BhY2VGaWxlcygoKFZpZXcpZWRpdFBhcnQuZ2V0TW9kZWwoKSkuZUNvbnRhaW5lcigpKSk7Ci0JCXRoaXMub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjsKLQkJdGhpcy5lZGl0UGFydCA9IGVkaXRQYXJ0OwotCi0JCXNldFJlc3VsdChDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChlZGl0UGFydC5nZXRNb2RlbCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBvcHRpb25zCi0JICogQHBhcmFtIGFmZmVjdGVkRmlsZXMKLQkgKi8KLQlwdWJsaWMgT3JpZW50YXRpb25Db21tYW5kKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgU3RyaW5nIGxhYmVsLAotCQkJTWFwIG9wdGlvbnMsIExpc3QgYWZmZWN0ZWRGaWxlcykgewotCQlzdXBlcihkb21haW4sIGxhYmVsLCBvcHRpb25zLCBhZmZlY3RlZEZpbGVzKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kI2RvRXhlY3V0ZVdpdGhSZXN1bHQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJaWYob3JpZW50YXRpb24gPT0gQWN0aW9uSWRzLkFDVElPTl9WX09SSUVOVEFUSU9OKXsKLQkJCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpZWRpdFBhcnQ7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gcGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCWlmIChib3VuZHMgIT0gbnVsbCkgewotCQkJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpcGFydC5nZXRNb2RlbCgpLE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLCBuZXcgSW50ZWdlcihib3VuZHMuaGVpZ2h0KSk7Ci0JCQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgoVmlldylwYXJ0LmdldE1vZGVsKCksTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLCBuZXcgSW50ZWdlcihib3VuZHMud2lkdGgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYoZWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSAKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIAotCQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2ZpZ3VyZXMvRGVjaXNpb25Ob2RlRmlndXJlLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9maWd1cmVzL0RlY2lzaW9uTm9kZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2VlMTM4Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2ZpZ3VyZXMvRGVjaXNpb25Ob2RlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuZmlndXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuSVBvbHlnb25BbmNob3JhYmxlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEFkb3B0ZWQgZnJvbSBHTUYncyBHZW9TaGFwZXMKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZUZpZ3VyZSBleHRlbmRzIERlZmF1bHRTaXplTm9kZUZpZ3VyZSBpbXBsZW1lbnRzCi0JCUlQb2x5Z29uQW5jaG9yYWJsZUZpZ3VyZSB7Ci0KLQlwcml2YXRlIGludCBzcGFjaW5nOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgY3JlYXRlIGEgZGVjaXNpb24gZmlndXJlCi0JICogCi0JICovCi0JcHVibGljIERlY2lzaW9uTm9kZUZpZ3VyZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzcGFjaW5nKSB7Ci0JCXN1cGVyKHdpZHRoLCBoZWlnaHQpOwotCQl0aGlzLnNwYWNpbmcgPSBzcGFjaW5nOwotCQljcmVhdGVGaWd1cmUod2lkdGgsIGhlaWdodCk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBkZWZTaXplCi0JICovCi0JcHVibGljIERlY2lzaW9uTm9kZUZpZ3VyZShEaW1lbnNpb24gZGVmU2l6ZSkgewotCQlzdXBlcihkZWZTaXplKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodAotCSAqLwotCXB1YmxpYyBEZWNpc2lvbk5vZGVGaWd1cmUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCXN1cGVyKHdpZHRoLCBoZWlnaHQpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5JUG9seWdvbkFuY2hvcmFibGVGaWd1cmUjZ2V0UG9seWdvblBvaW50cygpCi0JICovCi0JcHVibGljIFBvaW50TGlzdCBnZXRQb2x5Z29uUG9pbnRzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBnZXRQb2ludHMoKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZykgewotCQlQb2ludExpc3QgcG9pbnRzID0gZ2V0UG9pbnRMaXN0KGdldEJvdW5kcygpLmdldENvcHkoKSk7Ci0JCWcuZmlsbFBvbHlnb24ocG9pbnRzKTsKLQkJZy5kcmF3UG9seWdvbihwb2ludHMpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHNoYXBlcyBwb2x5Z29uIHBvaW50cy4KLQkgKiBUaGlzIGlzIGN1cnJlbnRseSBiYXNlZCBvbiB0aGUgc2hhcGVzIGJvdW5kaW5nIGJveC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVjdCB0aGUgcmVjdGFuZ2xlIHRoYXQgdGhlIHNoYXBlIHdpbGwgZml0IGluCi0JICovCi0JcHJvdGVjdGVkIFBvaW50TGlzdCBnZXRQb2ludExpc3QoUmVjdGFuZ2xlIHJlY3QpIHsKLQkJUG9pbnRMaXN0IHBvaW50cyA9IG5ldyBQb2ludExpc3QoKTsKLQkJCi0JCWludCBoYWxmWCA9IHJlY3QueCArIChyZWN0LndpZHRoIC8gMik7Ci0JCWludCBoYWxmWSA9IHJlY3QueSArIChyZWN0LmhlaWdodCAvIDIpOwotCQkKLQkJUG9pbnQgcDEgPSBuZXcgUG9pbnQoIGhhbGZYLCByZWN0LnkgKTsKLQkJUG9pbnQgcDIgPSBuZXcgUG9pbnQoIHJlY3QueCArIHJlY3Qud2lkdGggLSAxLCBoYWxmWSApOwotCQlQb2ludCBwMyA9IG5ldyBQb2ludCggaGFsZlgsIHJlY3QueSArIHJlY3QuaGVpZ2h0IC0gMSApOwotCQlQb2ludCBwNCA9IG5ldyBQb2ludCggcmVjdC54LCBoYWxmWSApOwotCQkKLQkJcG9pbnRzLmFkZFBvaW50KCBwMSApOwotCQlwb2ludHMuYWRkUG9pbnQoIHAyICk7Ci0JCXBvaW50cy5hZGRQb2ludCggcDMgKTsKLQkJcG9pbnRzLmFkZFBvaW50KCBwNCApOwotCQlwb2ludHMuYWRkUG9pbnQoIHAxICk7CQotCQkKLQkJcmV0dXJuIHBvaW50czsKLQl9Ci0JCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCXJldHVybiAoSUZpZ3VyZSkgZ2V0Q2hpbGRyZW4oKS5nZXQoMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZUZpZ3VyZShpbnQgd2lkdGgsIGludCBoZWlnaHQpewotCQlzZXRPcGFxdWUodHJ1ZSk7Ci0JCXNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkgewotCQkJcHVibGljIHZvaWQgbGF5b3V0KElGaWd1cmUgZmlndXJlKSB7Ci0JCQkJUmVjdGFuZ2xlIHIgPSBmaWd1cmUuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCUxpc3QgY2hpbGRyZW4gPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlJRmlndXJlIGNoaWxkOwotCQkJCURpbWVuc2lvbiBkOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCQkJY2hpbGQgPSAoSUZpZ3VyZSljaGlsZHJlbi5nZXQoaSk7Ci0JCQkJCWQgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKHIud2lkdGgsIHIuaGVpZ2h0KTsKLQkJCQkJZC53aWR0aCA9IE1hdGgubWluKGQud2lkdGgsIHIud2lkdGgpOwotCQkJCQlkLmhlaWdodCA9IE1hdGgubWluKGQuaGVpZ2h0LCByLmhlaWdodCk7Ci0JCQkJCVJlY3RhbmdsZSBjaGlsZFJlY3QgPSBuZXcgUmVjdGFuZ2xlKAotCQkJCQkJci54ICsgKHIud2lkdGggLSBkLndpZHRoKS8yLAotCQkJCQkJci55ICsgKHIuaGVpZ2h0IC0gZC5oZWlnaHQpLzIsCi0JCQkJCQlkLndpZHRoLAotCQkJCQkJZC5oZWlnaHQpOwotCQkJCQljaGlsZC5zZXRCb3VuZHMoY2hpbGRSZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJSUZpZ3VyZSBmID0gbmV3IEZpZ3VyZSgpOwotCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQlsYXlvdXQuc2V0U3BhY2luZyhzcGFjaW5nKTsKLQkJZi5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCWFkZChmKTsKLQl9Ci0JCi0JcHVibGljIFBvaW50TGlzdCBnZXRQb2ludHMoKXsKLQkJcmV0dXJuIGdldFBvaW50TGlzdChnZXRCb3VuZHMoKS5nZXRDb3B5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2ZpZ3VyZXMvRW5kTm9kZUZpZ3VyZS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvZmlndXJlcy9FbmROb2RlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNmI2NzEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvZmlndXJlcy9FbmROb2RlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmROb2RlRmlndXJlIGV4dGVuZHMgRWxsaXBzZSB7Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgZWxsaXBzZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZSNmaWxsU2hhcGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxTaGFwZShHcmFwaGljcyBncmFwaGljcykgewotCQlSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJci5zaHJpbmsoci53aWR0aCAvIDgsIHIuaGVpZ2h0IC8gOCk7Ci0JCWdyYXBoaWNzLmZpbGxPdmFsKHIpOwotCX0KLQotCS8qKgotCSAqIE91dGxpbmVzIHRoZSBlbGxpcHNlLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlI291dGxpbmVTaGFwZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3V0bGluZVNoYXBlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCXN1cGVyLm91dGxpbmVTaGFwZShncmFwaGljcyk7Ci0KLQkJUmVjdGFuZ2xlIHIgPSBSZWN0YW5nbGUuU0lOR0xFVE9OOwotCQlyLnNldEJvdW5kcyhnZXRCb3VuZHMoKSk7Ci0JCXIuc2hyaW5rKGdldEJvdW5kcygpLndpZHRoIC8gOCwgZ2V0Qm91bmRzKCkuaGVpZ2h0IC8gOCk7Ci0JCXIud2lkdGgtLTsKLQkJci5oZWlnaHQtLTsKLQkJci5zaHJpbmsoKGxpbmVXaWR0aCAtIDEpIC8gMiwgKGxpbmVXaWR0aCAtIDEpIC8gMik7Ci0JCWdyYXBoaWNzLmRyYXdPdmFsKHIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvZmlndXJlcy9Gb3JrTm9kZUZpZ3VyZS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvZmlndXJlcy9Gb3JrTm9kZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTgzMTAxLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2ZpZ3VyZXMvRm9ya05vZGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLk1hcE1vZGVVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIEZvcmtOb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQkKLQlwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3LCBpbnQgaCkgewotCQlzdXBlci5zZXRTaXplKE1hcE1vZGVVdGlsLmdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgCi0JCQkJTWFwTW9kZVV0aWwuZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvZmlndXJlcy9SZWxhdGl2ZVhZQW5jaG9yLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9maWd1cmVzL1JlbGF0aXZlWFlBbmNob3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk3NDE1OC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9maWd1cmVzL1JlbGF0aXZlWFlBbmNob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Q29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBQcm92aWRlcyByZWxhdGl2ZSBhbmNob3IgZm9yIGEgZmlndXJlJ3MgbG9jYXRpb24uIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVsYXRpdmVYWUFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwcml2YXRlIFBvaW50IHJlbGF0aXZlTG9jYXRpb247Ci0KLQlwdWJsaWMgUmVsYXRpdmVYWUFuY2hvcihJRmlndXJlIGZpZ3VyZSwgUG9pbnQgbG9jYXRpb24sIGJvb2xlYW4gaXNSZWxhdGl2ZSkgewotCQlzdXBlcihmaWd1cmUpOwotCQlyZWxhdGl2ZUxvY2F0aW9uID0gbG9jYXRpb24uZ2V0Q29weSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3IjZ2V0TG9jYXRpb24oUG9pbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlQb2ludCBwID0gcmVsYXRpdmVMb2NhdGlvbi5nZXRDb3B5KCk7Ci0JCVJlY3RhbmdsZSByID0gZ2V0T3duZXIoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCXAucGVyZm9ybVRyYW5zbGF0ZShyLngsIHIueSk7Ci0JCWdldE93bmVyKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShwKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yI2dldFJlZmVyZW5jZVBvaW50KCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0JCXJldHVybiBnZXRMb2NhdGlvbihudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BhcnRzL0FjdGl2aXR5Tm9kZUVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wYXJ0cy9BY3Rpdml0eU5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDNhMzQxLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BhcnRzL0FjdGl2aXR5Tm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBvbGljaWVzLkFjdGl2aXR5Tm9kZVJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5Tm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQHBhcmFtIHZpZXcKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydCNjcmVhdGVOb2RlRmlndXJlKCkKLQkgKi8KLQotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBFZGl0UG9saWN5IGdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eU5vZGVSZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGFydHMvRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGFydHMvRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzMzNzUwLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BhcnRzL0RpYWdyYW1GaWxlRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXRoRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXRGYWN0b3J5OwotCi0vKioKLSAqIEFkYXB0ZXIgZm9yIG1ha2luZyBhIGZpbGUgcmVzb3VyY2UgYSBzdWl0YWJsZSBpbnB1dCBmb3IgYW4gZWRpdG9yLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRmlsZUVkaXRvcklucHV0IGltcGxlbWVudHMgSUZpbGVFZGl0b3JJbnB1dCwgSVBhdGhFZGl0b3JJbnB1dCwKLSAgICAgICAgSVBlcnNpc3RhYmxlRWxlbWVudCAKLSAgICAgICAgewotCXByaXZhdGUgRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1FZGl0b3JJbnB1dDsKLSAgICBwcml2YXRlIElGaWxlIGZpbGU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGVkaXRvciBpbnB1dCBiYXNlZCBvZiB0aGUgZ2l2ZW4gZmlsZSByZXNvdXJjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHJlc291cmNlCi0gICAgICovCi0gICAgcHVibGljIERpYWdyYW1GaWxlRWRpdG9ySW5wdXQoSUZpbGUgZmlsZSwgRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1FZGl0b3JJbnB1dCkgewotICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICAgICAgdGhpcy5kaWFncmFtRWRpdG9ySW5wdXQgPSBkaWFncmFtRWRpdG9ySW5wdXQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBPYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGUuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE9iamVjdC4KLSAgICAgKgotICAgICAqIFRoZSA8Y29kZT5EaWFncmFtRmlsZUVkaXRvcklucHV0PC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPk9iamVjdDwvY29kZT4KLSAgICAgKiBtZXRob2QgYmFzZXMgdGhlIGVxdWFsaXR5IG9mIHR3byA8Y29kZT5EaWFncmFtRmlsZUVkaXRvcklucHV0PC9jb2RlPiBvYmplY3RzIG9uIHRoZQotICAgICAqIGVxdWFsaXR5IG9mIHRoZWlyIHVuZGVybHlpbmcgPGNvZGU+SUZpbGU8L2NvZGU+IHJlc291cmNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAodGhpcyA9PSBvYmopIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLSAgICAgICAgSUZpbGVFZGl0b3JJbnB1dCBvdGhlciA9IChJRmlsZUVkaXRvcklucHV0KSBvYmo7Ci0gICAgICAgIHJldHVybiBmaWxlLmVxdWFscyhvdGhlci5nZXRGaWxlKCkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUVkaXRvcklucHV0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLSAgICAgICAgcmV0dXJuIGZpbGUuZXhpc3RzKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWRhcHRhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChhZGFwdGVyID09IElGaWxlLmNsYXNzKSB7Ci0JCQlyZXR1cm4gZmlsZTsKLQkJfQotICAgICAgICByZXR1cm4gZmlsZS5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVBlcnNpc3RhYmxlRWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlJZCgpIHsKLSAgICAgICAgcmV0dXJuIEZpbGVFZGl0b3JJbnB1dEZhY3RvcnkuZ2V0RmFjdG9yeUlkKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRWRpdG9ySW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIElDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IElERS5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKQotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoZmlsZS5nZXROYW1lKCksIGNvbnRlbnRUeXBlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJU3RvcmFnZUVkaXRvcklucHV0LgotICAgICAqLwotICAgIHB1YmxpYyBJU3RvcmFnZSBnZXRTdG9yYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZmlsZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotICAgICAgICByZXR1cm4gZmlsZS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUGVyc2lzdGFibGVFbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQYXRoRWRpdG9ySW5wdXQKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICogQGlzc3VlIGNvbnNpZGVyIHVzaW5nIGFuIGludGVybmFsIGFkYXB0ZXIgZm9yIElQYXRoRWRpdG9ySW5wdXQgcmF0aGVyIHRoYW4gYWRkaW5nIHRoaXMgYXMgQVBJCi0gICAgICovCi0gICAgcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlLmdldExvY2F0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICIoIiArIGdldEZpbGUoKS5nZXRGdWxsUGF0aCgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0KLQlwdWJsaWMgRGlhZ3JhbUVkaXRvcklucHV0IGdldERpYWdyYW1FZGl0b3JJbnB1dCgpIHsKLQkJcmV0dXJuIGRpYWdyYW1FZGl0b3JJbnB1dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaWFncmFtRWRpdG9ySW5wdXQoRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1FZGl0b3JJbnB1dCkgewotCQl0aGlzLmRpYWdyYW1FZGl0b3JJbnB1dCA9IGRpYWdyYW1FZGl0b3JJbnB1dDsKLQl9Ci0JCi19Ci0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BhcnRzL0RpYWdyYW1GaWxlRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wYXJ0cy9EaWFncmFtRmlsZUVkaXRvcklucHV0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTE1YTJjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BhcnRzL0RpYWdyYW1GaWxlRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWxlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci0KLS8qKgotICogRmFjdG9yeSBmb3Igc2F2aW5nIGFuZCByZXN0b3JpbmcgYSB7QGxpbmsgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dH0uIAotICogVGhlIHN0b3JlZCByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBEaWFncmFtRmlsZUVkaXRvcklucHV0fSByZW1lbWJlcnMKLSAqIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpbGUgYW5kIHtAbGluayBDYXBhYmlsaXR5UGF0dGVybn0gb3Ige0BsaW5rIEFjdGl2aXR5fSdzCi0gKiBHVUlELlRoZSB3b3JrYmVuY2ggd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcyByZXF1aXJlZC4KLSAqIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSB0aGUgY2xpZW50LgotICogPC9wPgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRmlsZUVkaXRvcklucHV0RmFjdG9yeSBpbXBsZW1lbnRzIElFbGVtZW50RmFjdG9yeSB7Ci0KLQkKLQkgLyoqCi0gICAgICogRmFjdG9yeSBpZC4gVGhlIHdvcmtiZW5jaCBwbHVnLWluIHJlZ2lzdGVycyBhIGZhY3RvcnkgYnkgdGhpcyBuYW1lCi0gICAgICogd2l0aCB0aGUgIm9yZy5lY2xpcHNlLnVpLmVsZW1lbnRGYWN0b3JpZXMiIGV4dGVuc2lvbiBwb2ludC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRkFDVE9SWSA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wYXJ0cy5EaWFncmFtRmlsZUVkaXRvcklucHV0RmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRhZyBmb3IgdGhlIElGaWxlLmZ1bGxQYXRoIG9mIHRoZSBmaWxlIHJlc291cmNlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUEFUSCA9ICJwYXRoIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8qKgotICAgICAqIFRhZyBmb3IgdW1hIEdVSUQKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0dVSUQgPSAiZ3VpZCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dEZhY3RvcnkoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFbGVtZW50RmFjdG9yeSNjcmVhdGVFbGVtZW50KG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQotCSAqLwotCXB1YmxpYyBJQWRhcHRhYmxlIGNyZWF0ZUVsZW1lbnQoSU1lbWVudG8gbWVtZW50bykgewotCQkKLQkJICBTdHJpbmcgZmlsZU5hbWUgPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfUEFUSCk7Ci0JICAgICAgICBpZiAoZmlsZU5hbWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCSAgICAgICAgU3RyaW5nIGd1aWQgPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfR1VJRCk7Ci0JICAgICAgICBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IG51bGw7Ci0JICAgICAgICBNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JICAgICAgICBpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpewotCSAgICAgICAgCXN1cHByZXNzaW9uID0gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24oKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykoKEFjdGl2aXR5KWVsZW1lbnQpLmVDb250YWluZXIoKSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dCgKLQkJCQkJZWxlbWVudCwgc3VwcHJlc3Npb24pOwotCi0JICAgICAgICAvLyBHZXQgYSBoYW5kbGUgdG8gdGhlIElGaWxlLi4ud2hpY2ggY2FuIGJlIGEgaGFuZGxlCi0JICAgICAgICAvLyB0byBhIHJlc291cmNlIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gd29ya3NwYWNlCi0JICAgICAgICBJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKAotCSAgICAgICAgICAgICAgICBuZXcgUGF0aChmaWxlTmFtZSkpOwotCSAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dChmaWxlLGlucHV0ICk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCX0KLQkKLQkvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IGZhY3RvcnkgaWQgZm9yIHRoaXMgY2xhc3MuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCBmYWN0b3J5IGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkKCkgewotICAgICAgICByZXR1cm4gSURfRkFDVE9SWTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGUgc3RhdGUgb2YgdGhlIGdpdmVuIGZpbGUgZWRpdG9yIGlucHV0IGludG8gdGhlIGdpdmVuIG1lbWVudG8uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVtZW50byB0aGUgc3RvcmFnZSBhcmVhIGZvciBlbGVtZW50IHN0YXRlCi0gICAgICogQHBhcmFtIGlucHV0IHRoZSBmaWxlIGVkaXRvciBpbnB1dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bywgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dCBpbnB1dCkgewotICAgICAgICBJRmlsZSBmaWxlID0gaW5wdXQuZ2V0RmlsZSgpOwotICAgICAgICBtZW1lbnRvLnB1dFN0cmluZyhUQUdfUEFUSCwgZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotICAgICAgICBtZW1lbnRvLnB1dFN0cmluZyhUQUdfR1VJRCwgaW5wdXQuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0TWV0aG9kRWxlbWVudCgpLmdldEd1aWQoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wYXJ0cy9EaWFncmFtSGVscGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wYXJ0cy9EaWFncmFtSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTEwZmIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGFydHMvRGlhZ3JhbUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQWN0aXZpdHlEaWFncmFtQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuRGlhZ3JhbUZpbGVDcmVhdG9yRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuRGlhZ3JhbVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wZXJzaXN0ZW5jZS5EaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wZXJzaXN0ZW5jZS5JRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogRGlhZ3JtIGhlbHBlciBjbGFzcyAocmVwbGFjaW5nIHRoZSBEaWFncmFtRWRpdG9yVXRpbCkuCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEaWFncmFtSGVscGVyIHsKLQotCS8qKgotCSAqIFRvIG9wZW4gYSBkaWFncmFtIGFuZCBjcmVhdGUgYSBmaWxlLgotCSAqIEB3cml0dGVuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5EaWFncmFtRWRpdG9yKElXb3JrYmVuY2hQYWdlIHBhZ2UsIElFZGl0b3JJbnB1dCBpbnB1dCwgU3RyaW5nIGRpYWdyYW1LaW5kKXsKLQkJCi0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQotCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkoKERpYWdyYW1FZGl0b3JJbnB1dClpbnB1dCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQlEaWFncmFtIGRpYWdyYW0gPSBJRGlhZ3JhbVNlcnZpY2UuZUluc3RhbmNlLmdldERpYWdyYW0oKEFjdGl2aXR5KW1ldGhvZEVsZW1lbnQsIGRpYWdyYW1LaW5kLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCUlGaWxlIGRpYWdyYW1GaWxlID0gRGlhZ3JhbVBlcnNpc3Rlci5nZXRGaWxlKGlucHV0KSA7Ci0JCWlmKGRpYWdyYW1GaWxlID09IG51bGwpewotCQkJZGlhZ3JhbUZpbGUgPSBEaWFncmFtUGVyc2lzdGVyLmNyZWF0ZU5ld0RpYWdyYW1GaWxlKERpYWdyYW1GaWxlQ3JlYXRvckV4LmdldEluc3RhbmNlKCksIAotCQkJCQlpbnB1dCwgcGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCAKLQkJCQkJbW9uaXRvcik7Ci0JCX0KLQkJaWYoZGlhZ3JhbSA9PSBudWxsKXsKLQkJCWRpYWdyYW0gPSBJRGlhZ3JhbVNlcnZpY2UuZUluc3RhbmNlLmNyZWF0ZURpYWdyYW0oKEFjdGl2aXR5KW1ldGhvZEVsZW1lbnQsIGRpYWdyYW1LaW5kLCBmYWxzZSk7Ci0JCQkvL1RPRE86IHJlbW92ZSB0aGlzIHNhdmUgb3B0aW9uCi0JCQl0cnl7Ci0JCQkJRGlhZ3JhbVBlcnNpc3Rlci5zYXZlRGlhZ3JhbShJRGlhZ3JhbVNlcnZpY2UuZUluc3RhbmNlLmNyZWF0ZUVkaXRpbmdEb21haW4oKSwgCi0JCQkJCWRpYWdyYW1GaWxlLCBkaWFncmFtLCBmYWxzZSk7Ci0JCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkgZGlhZ3JhbUZpbGVFZGl0b3JJbnB1dCA9IG5ldyBEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkoCi0JCQkJZGlhZ3JhbUZpbGUsIChEaWFncmFtRWRpdG9ySW5wdXQpaW5wdXQsIG51bGwpOwotCQkKLQkJaWYgKGRpYWdyYW1GaWxlICE9IG51bGwpIHsKLQkJCURpYWdyYW1FZGl0UGFydCBlZGl0UGFydCA9IG9wZW5FZGl0b3IoZGlhZ3JhbUZpbGVFZGl0b3JJbnB1dCwgcGFnZSwgbW9uaXRvciwgdHJ1ZSwgdHJ1ZSk7Ci0JCQlpbml0aWFsaXplKChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpLCBkaWFncmFtRmlsZUVkaXRvcklucHV0KTsKLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGlhZ3JhbUVkaXRQYXJ0IG9wZW5FZGl0b3IoSUZpbGVFZGl0b3JJbnB1dCBpbnB1dCwKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UsSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIGJvb2xlYW4gYWN0aXZhdGUsIAotCQkJYm9vbGVhbiBkZXRlcm1pbmVDb250ZW50VHlwZSl7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBudWxsOwotCQl0cnkgewotCQkJLy9JV29ya2JlbmNoUGFnZSBwYWdlID0gZFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCSAvL3Nhbml0eSBjaGVja3MKLQkJICAgICAgICBpZiAocGFnZSA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0KLQkJICAgICAgICAvLyBvcGVuIHRoZSBlZGl0b3Igb24gdGhlIGZpbGUKLQkJICAgICAgICBJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3JEZXNjID0gSURFLmdldEVkaXRvckRlc2NyaXB0b3IoaW5wdXQuZ2V0RmlsZSgpLCBkZXRlcm1pbmVDb250ZW50VHlwZSk7Ci0JCSAgICAgICAgZWRpdG9yUGFydCA9ICBwYWdlLm9wZW5FZGl0b3IoaW5wdXQsIGVkaXRvckRlc2MuZ2V0SWQoKSwKLQkJICAgICAgICAgICAgICAgIGFjdGl2YXRlKTsKLQkJCQlpZihlZGl0b3JQYXJ0ICE9IG51bGwgJiYgcGFyZW50ICE9IG51bGwpewotCQkJCQkvLyBzZXQgdGhlIHBhcmVudC4KLQkJCQl9Ci0JCQl9Ci0JCQlpbnB1dC5nZXRGaWxlKCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBudWxsKTsKLQkJCXJldHVybiAoKElEaWFncmFtV29ya2JlbmNoUGFydCkgZWRpdG9yUGFydCkuZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGl2aXR5RGlhZ3JhbUtpbmQoKXsKLQkJcmV0dXJuIERpYWdyYW1TZXJ2aWNlLkFEX2tpbmQ7Ci0JfQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBkaWFncmFtRmlsZUVkaXRvcklucHV0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0aWFsaXplKERpYWdyYW0gbW9kZWwsIERpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBkaWFncmFtRmlsZUVkaXRvcklucHV0KSB7Ci0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSBkaWFncmFtRmlsZUVkaXRvcklucHV0LmdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldFdyYXBwZXIoKTsKLQkJQWN0aXZpdHlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0gd3JhcHBlciAhPSBudWxsID8KLQkJCQluZXcgQWN0aXZpdHlEaWFncmFtQWRhcHRlcih3cmFwcGVyKSA6IAotCQkJCQluZXcgQWN0aXZpdHlEaWFncmFtQWRhcHRlcigoQWN0aXZpdHkpZGlhZ3JhbUZpbGVFZGl0b3JJbnB1dC5nZXREaWFncmFtRWRpdG9ySW5wdXQoKS5nZXRNZXRob2RFbGVtZW50KCkpOwotCQlhZGFwdGVyLnNldEVkaXRpbmdEb21haW4oKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIGRpYWdyYW1GaWxlRWRpdG9ySW5wdXQuZ2V0RWRpdGluZ0RvbWFpbigpKTsKLQkJYWRhcHRlci5zZXRTdXBwcmVzc2lvbihkaWFncmFtRmlsZUVkaXRvcklucHV0LmdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldFN1cHByZXNzaW9uKCkpOwotCQltb2RlbC5nZXRFbGVtZW50KCkuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQlhZGFwdGVyLnBvcHVsYXRlRGlhZ3JhbSgpOwotCX0KLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21tYW5kIGdldENvbW1hbmRXcmFwcGVyKElDb21tYW5kIGNtZCkgewotCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkoY21kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wYXJ0cy9EaWFtb25kTm9kZUVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wYXJ0cy9EaWFtb25kTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OTFlOGIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGFydHMvRGlhbW9uZE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5maWd1cmVzLkRlY2lzaW9uTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5maWd1cmVzLlJlbGF0aXZlWFlBbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkxvY2F0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGlhbW9uZE5vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBwYXJhbSB2aWV3Ci0JICovCi0JcHVibGljIERpYW1vbmROb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydCNjcmVhdGVOb2RlRmlndXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVFZGl0UGFydCNnZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQpCi0JICogQGN1c3RvbQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlib29sZWFuIGlzUmVsYXRpdmUgPSBmYWxzZTsKLQkJUG9pbnQgc291cmNlRW5kUG9pbnQ7Ci0JCWlmIChyZWNlbnRTb3VyY2VFbmRQb2ludCA9PSBudWxsKSB7Ci0JCQkvLyBnZXQgc291cmNlIGVuZCBwb2ludCBmcm9tIHRoZSBtb2RlbAotCQkJTGluayBsaW5rID0gKExpbmspIGNvbm5lY3Rpb24uZ2V0TW9kZWwoKTsKLQkJCXNvdXJjZUVuZFBvaW50ID0gbGluay5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQkJaXNSZWxhdGl2ZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlzb3VyY2VFbmRQb2ludCA9IHJlY2VudFNvdXJjZUVuZFBvaW50OwotCQl9Ci0JCWlmIChzb3VyY2VFbmRQb2ludCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHNvdXJjZUVuZFBvaW50LCBpc1JlbGF0aXZlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihjb25uZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0I2dldFNvdXJjZUNvbm5lY3Rpb25BbmNob3Iob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0JICogQGN1c3RvbQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVBvaW50IHAgPSBudWxsOwotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSB7Ci0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXEgPSAoQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHJlcXVlc3Q7Ci0JCQlwID0gcmVxLmdldExvY2F0aW9uKCk7Ci0JCX0gZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkgewotCQkJcCA9ICgoTG9jYXRpb25SZXF1ZXN0KSByZXF1ZXN0KS5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXJlY2VudFNvdXJjZUVuZFBvaW50ID0gZ2V0TG9jYXRpb24ocCk7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHJlY2VudFNvdXJjZUVuZFBvaW50LCB0cnVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihyZXF1ZXN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0I2dldFRhcmdldENvbm5lY3Rpb25BbmNob3Iob3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydCkKLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcigKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uKSB7Ci0JCWJvb2xlYW4gaXNSZWxhdGl2ZSA9IGZhbHNlOwotCQlQb2ludCB0YXJnZXRFbmRQb2ludDsKLQkJaWYgKHJlY2VudFRhcmdldEVuZFBvaW50ID09IG51bGwpIHsKLQkJCS8vIGdldCB0YXJnZXQgZW5kIHBvaW50IGZyb20gbW9kZWwKLQkJCUxpbmsgbGluayA9IChMaW5rKSBjb25uZWN0aW9uLmdldE1vZGVsKCk7Ci0JCQl0YXJnZXRFbmRQb2ludCA9IGxpbmsuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQkJCWlzUmVsYXRpdmUgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJdGFyZ2V0RW5kUG9pbnQgPSByZWNlbnRUYXJnZXRFbmRQb2ludDsKLQkJfQotCQlpZiAodGFyZ2V0RW5kUG9pbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBSZWxhdGl2ZVhZQW5jaG9yKGdldEZpZ3VyZSgpLCB0YXJnZXRFbmRQb2ludCwgaXNSZWxhdGl2ZSk7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihjb25uZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0I2dldFRhcmdldENvbm5lY3Rpb25BbmNob3Iob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0JICogQGN1c3RvbQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVBvaW50IHAgPSBudWxsOwotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSB7Ci0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXEgPSAoQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHJlcXVlc3Q7Ci0JCQlwID0gcmVxLmdldExvY2F0aW9uKCk7Ci0JCX0gZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkgewotCQkJcCA9ICgoTG9jYXRpb25SZXF1ZXN0KSByZXF1ZXN0KS5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXJlY2VudFRhcmdldEVuZFBvaW50ID0gZ2V0TG9jYXRpb24ocCk7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHJlY2VudFRhcmdldEVuZFBvaW50LCB0cnVlKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5Db25uZWN0aW9uQW5jaG9yTG9jYXRvciNnZXRMb2NhdGlvbihQb2ludCkKLQkgKiBAY3VzdG9tCi0JICogCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlEZWNpc2lvbk5vZGVGaWd1cmUgZiA9ICgoRGVjaXNpb25Ob2RlRmlndXJlKSBnZXRGaWd1cmUoKSk7Ci0KLQkJLy8gdHJhbnNsYXRlIHBvaW50cyB0byBhYnNvbHV0ZQotCQlQb2ludFtdIHBvaW50cyA9IG5ldyBQb2ludFtmLmdldFBvaW50cygpLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSBmLmdldFBvaW50cygpLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlQb2ludCBwID0gZi5nZXRQb2ludHMoKS5nZXRQb2ludChpKTsKLQkJCWYudHJhbnNsYXRlVG9BYnNvbHV0ZShwKTsKLQkJCXBvaW50c1tpXSA9IHA7Ci0JCX0KLQotCQlQb2ludCBwID0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UudXRpbC5BbmNob3JVdGlsLmdldENsb3Nlc3RQb2ludChwb2ludHMsIHJlZmVyZW5jZSk7Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCVJlY3RhbmdsZSByID0gZi5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCQlmLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCQlwLnBlcmZvcm1UcmFuc2xhdGUoLXIueCwgLXIueSk7Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotCQotCS8qCi0JICogQGN1c3RvbQotCSAqLwotCXByaXZhdGUgUG9pbnQgcmVjZW50U291cmNlRW5kUG9pbnQ7Ci0KLQkvKgotCSAqIEBjdXN0b20KLQkgKi8KLQlwcml2YXRlIFBvaW50IHJlY2VudFRhcmdldEVuZFBvaW50OwotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9EaWFncmFtRmlsZUNyZWF0b3JFeC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGVyc2lzdGVuY2UvRGlhZ3JhbUZpbGVDcmVhdG9yRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxZDE5Zi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9EaWFncmFtRmlsZUNyZWF0b3JFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5EaWFncmFtRmlsZUNyZWF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRmlsZUNyZWF0b3JFeCBleHRlbmRzIERpYWdyYW1GaWxlQ3JlYXRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZhdWx0X2RpYWdyYW1fZmlsZSA9ICJkaWFncmFtIjsgCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRGlhZ3JhbUZpbGVDcmVhdG9yRXggSU5TVEFOQ0UgPSBuZXcgRGlhZ3JhbUZpbGVDcmVhdG9yRXgoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbUZpbGVDcmVhdG9yRXggZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9EaWFncmFtUGVyc2lzdGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9EaWFncmFtUGVyc2lzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MDc3N2UuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGVyc2lzdGVuY2UvRGlhZ3JhbVBlcnNpc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLk9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLkZlYXR1cmVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlBhY2thZ2VOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuRVBGRGlhZ3JhbVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5jb21tYW5kcy5DcmVhdGVEaWFncmFtQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWwuVW1hVW1sVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5yZXNvdXJjZXMuR01GUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24udXRpbC5Ob3RhdGlvbkV4dGVuZGVkTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTEZhY3Rvcnk7Ci0KLS8qKgotICogUmUtdXNlZCB7RGlhZ3JhbUlPVXRpbH0gY29kZSBhbmQgbW9kaWZ5IGFjY29yZGluZyBmb3IgRVBGIGFuZCBVTUwKLSAqIEJyaWRnZS4gUGVyc2lzdGVyIGhlbHBzIGluIGhhbmRsaW5nIG11bHRpIHJlc291cmNlIG1hbmlwdWxhdGlvbi4gCi0gKiAgCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjIKLSAqLwotCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVBlcnNpc3RlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIFRYX09QVElPTlMgPSBuZXcgSGFzaE1hcCgpOwkKLSAgICBzdGF0aWMgewotICAgICAgICBUWF9PUFRJT05TLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fTk9fVU5ETywgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgVFhfT1BUSU9OUy5wdXQoVHJhbnNhY3Rpb24uT1BUSU9OX05PX05PVElGSUNBVElPTlMsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIFRYX09QVElPTlMucHV0KFRyYW5zYWN0aW9uLk9QVElPTl9OT19UUklHR0VSUywgQm9vbGVhbi5UUlVFKTsKLSAgICB9Ci0JCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2UuRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkgPSBuZXcgR01GUmVzb3VyY2VGYWN0b3J5KCk7Ci0gICAgCi0JLy8gbG9jYWxpemVkIGxhYmVscwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBVTkFCTEVfVE9fTE9BRF9ESUFHUkFNID0gIlVuYWJsZSB0byBsb2FkIGRpYWdyYW0iOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE5PX0RJQUdSQU1fSU5fUkVTT1VSQ0UgPSAiTm8gZGlhZ3JhbSByZXNvdXJjZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgSUxvYWRlciB7Ci0JCXB1YmxpYyBSZXNvdXJjZSBsb2FkKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgTWFwIGxvYWRPcHRpb25zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsZUxvYWRlciBpbXBsZW1lbnRzIElMb2FkZXIgewotCQlwcml2YXRlIElGaWxlIGZGaWxlOwotCQlwdWJsaWMgRmlsZUxvYWRlcihJRmlsZSBmaWxlKSB7Ci0JCQkvL2Fzc2VydCBmaWxlICE9IG51bGw7Ci0JCQlmRmlsZSA9IGZpbGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBSZXNvdXJjZSBsb2FkKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgTWFwIGxvYWRPcHRpb25zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlmRmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG1vbml0b3IpOwotCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZGaWxlLmdldEZ1bGxQYXRoKCkKLSAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCQkKLQkJCVJlc291cmNlIHJlc291cmNlID0gZG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7Ci0JCQkKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJcmVzb3VyY2UgPSBkb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCQkJfQotCQkJCi0JCQlpZiAoIXJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQlNYXAgbG9hZGluZ09wdGlvbnMgPSBuZXcgSGFzaE1hcChHTUZSZXNvdXJjZUZhY3RvcnkuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkpOwotCQkJCQotICAgICAgICAgICAgICAgIC8vIHByb3BvZ2F0ZSBwYXNzZWQgaW4gb3B0aW9ucyB0byB0aGUgZGVmYXVsdHMKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gbG9hZE9wdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGtleSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBsb2FkaW5nT3B0aW9ucy5wdXQoa2V5LCBsb2FkT3B0aW9ucy5nZXQoa2V5KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCXJlc291cmNlLmxvYWQobG9hZGluZ09wdGlvbnMpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAJcmVzb3VyY2UudW5sb2FkKCk7Ci0gICAgICAgICAgICAgICAgCXRocm93IGU7Ci0gICAgICAgICAgICAgICAgfQotCQkJfQotCQkJCi0JCQlsb2dSZXNvdXJjZUVycm9yc0FuZFdhcm5pbmdzKHJlc291cmNlKTsKLQkJCQkJCQotCQkJcmV0dXJuIHJlc291cmNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dSZXNvdXJjZUVycm9yc0FuZFdhcm5pbmdzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlLmdldEVycm9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UuRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gKFJlc291cmNlLkRpYWdub3N0aWMpIGl0ZXIubmV4dCgpOwotCQkJTG9nLmVycm9yKEVQRkRpYWdyYW1QbHVnaW4uZ2V0RGVmYXVsdCgpLCAxLCBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKSk7CQkJCQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0V2FybmluZ3MoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlLkRpYWdub3N0aWMgZGlhZ25vc3RpYyA9IChSZXNvdXJjZS5EaWFnbm9zdGljKSBpdGVyLm5leHQoKTsKLQkJCUxvZy53YXJuaW5nKEVQRkRpYWdyYW1QbHVnaW4uZ2V0RGVmYXVsdCgpLCA3LCBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKSk7CQkJCQotCQl9Ci0JfQotCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RvcmFnZUxvYWRlciBpbXBsZW1lbnRzIElMb2FkZXIgewotCQlwcml2YXRlIElTdG9yYWdlIGZTdG9yYWdlOwotCQlwdWJsaWMgU3RvcmFnZUxvYWRlcihJU3RvcmFnZSBzdG9yYWdlKSB7Ci0JCQkvL2Fzc2VydCBzdG9yYWdlICE9IG51bGw7Ci0JCQlmU3RvcmFnZSA9IHN0b3JhZ2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBSZXNvdXJjZSBsb2FkKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sCi0JCQkJTWFwIGxvYWRPcHRpb25zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotICAgICAgICAgICAgU3RyaW5nIHN0b3JhZ2VOYW1lID0gZlN0b3JhZ2UuZ2V0TmFtZSgpOwotICAgICAgICAgICAgVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHN0b3JhZ2VOYW1lKTsKLSAgICAgICAgICAgIFJlc291cmNlIHJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHVyaSxmYWxzZSk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXJlc291cmNlLmlzTG9hZGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZS5sb2FkKGZTdG9yYWdlLmdldENvbnRlbnRzKCksIGxvYWRPcHRpb25zKTsKLSAgICAgICAgICAgIH0KLQkJCWxvZ1Jlc291cmNlRXJyb3JzQW5kV2FybmluZ3MocmVzb3VyY2UpOwotCQkJcmV0dXJuIHJlc291cmNlOwotCQl9Ci0JfQotCQotCXN0YXRpYyBwdWJsaWMgRGlhZ3JhbSBsb2FkKGZpbmFsIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgZmluYWwgSUZpbGUgZmlsZSwgYm9vbGVhbiBiVHJ5Q29tcGF0aWJsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUZpbGVMb2FkZXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoZmlsZSk7Ci0JCXJldHVybiBsb2FkKGRvbWFpbiwgbG9hZGVyLCBiVHJ5Q29tcGF0aWJsZSwgbW9uaXRvcik7Ci0JfQotCQotCXN0YXRpYyBwdWJsaWMgRGlhZ3JhbSBsb2FkKGZpbmFsIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgZmluYWwgSVN0b3JhZ2Ugc3RvcmFnZSwgYm9vbGVhbiBiVHJ5Q29tcGF0aWJsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlMb2FkZXIgbG9hZGVyID0gbnVsbDsKLQkJaWYoc3RvcmFnZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlsb2FkZXIgPSBuZXcgRmlsZUxvYWRlcigoSUZpbGUpc3RvcmFnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlsb2FkZXIgPSBuZXcgU3RvcmFnZUxvYWRlcihzdG9yYWdlKTsKLQkJfQotCQlyZXR1cm4gbG9hZChkb21haW4sIGxvYWRlciwgYlRyeUNvbXBhdGlibGUsIG1vbml0b3IsIGlucHV0KTsKLQl9Ci0JCi0Jc3RhdGljIHB1YmxpYyBEaWFncmFtIGxvYWQoZmluYWwgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBmaW5hbCBJU3RvcmFnZSBzdG9yYWdlLCBib29sZWFuIGJUcnlDb21wYXRpYmxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQlNZXRob2RFbGVtZW50IG1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlMb2FkZXIgbG9hZGVyID0gbnVsbDsKLQkJaWYoc3RvcmFnZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlsb2FkZXIgPSBuZXcgRmlsZUxvYWRlcigoSUZpbGUpc3RvcmFnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlsb2FkZXIgPSBuZXcgU3RvcmFnZUxvYWRlcihzdG9yYWdlKTsKLQkJfQotCQlyZXR1cm4gbG9hZChkb21haW4sIGxvYWRlciwgYlRyeUNvbXBhdGlibGUsIG1vbml0b3IsIG1lKTsKLQl9Ci0JCi0JLyoqCi0JICogbG9hZCBhbiBleGlzdGluZyBkaWFncmFtIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jc3RhdGljIHByaXZhdGUgRGlhZ3JhbSBsb2FkKGZpbmFsIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgZmluYWwgSUxvYWRlciBsb2FkZXIsIGJvb2xlYW4gYlRyeUNvbXBhdGlibGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gIHsKLQkJUmVzb3VyY2Ugbm90YXRpb25Nb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0cnkgewkKLQkJCQkvLyBGaWxlIGV4aXN0cyB3aXRoIGNvbnRlbnRzLi4KLQkJCQlub3RhdGlvbk1vZGVsID0gbG9hZGVyLmxvYWQoZG9tYWluLCBuZXcgSGFzaE1hcCgpLCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKFJlc291cmNlLklPV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGJUcnlDb21wYXRpYmxlKSB7Ci0JCQkJCVRocm93YWJsZSBjYXVzZUVycm9yID0gZS5nZXRDYXVzZSgpOwotCQkJCQkKLQkJCQkJaWYgKGNhdXNlRXJyb3IgPT0gbnVsbCkgewotCQkJCQkJY2F1c2VFcnJvciA9IGU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCVN0cmluZyBlcnJNc2cgPSBjYXVzZUVycm9yLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJCQkJaWYgKGNhdXNlRXJyb3IgaW5zdGFuY2VvZiBSZXNvdXJjZS5JT1dyYXBwZWRFeGNlcHRpb24pIHsKLQkJCQkJCUV4Y2VwdGlvbiBleGMgPSAoRXhjZXB0aW9uKSgoUmVzb3VyY2UuSU9XcmFwcGVkRXhjZXB0aW9uKSBjYXVzZUVycm9yKQotCQkJCQkJCS5nZXRDYXVzZSgpOwotCQkJCQkJaWYgKGV4YyAhPSBudWxsKSB7Ci0JCQkJCQkJY2F1c2VFcnJvciA9IGV4YzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKChjYXVzZUVycm9yIGluc3RhbmNlb2YgUGFja2FnZU5vdEZvdW5kRXhjZXB0aW9uIAotCQkJCQkJCXx8IGNhdXNlRXJyb3IgaW5zdGFuY2VvZiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0JCQkJCQkJfHwgY2F1c2VFcnJvciBpbnN0YW5jZW9mIEZlYXR1cmVOb3RGb3VuZEV4Y2VwdGlvbikpIHsKLQkJCQkJCWlmIChzaG91bGRMb2FkSW5Db21wYXRpYmlsaXR5TW9kZShlcnJNc2cpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGxvYWRPcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIAkJCQkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSB3aWxsIHBsYWNlIGEgc3BlY2lhbCBleHRlbmRlZCBtZXRhZGF0YSBpbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHdlIGNhbiBsb2FkIGRpYWdyYW1zCi0gICAgICAgICAgICAJCQkJLy8gIGZyb20gb2xkZXIgdmVyc2lvbnMgb2Ygb3VyIG1ldGFtb2RlbC4KLSAgICAgICAgICAgIAkJCQlsb2FkT3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgbmV3IE5vdGF0aW9uRXh0ZW5kZWRNZXRhRGF0YSgpKTsKLSAgICAgICAgICAgIAkJCQkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkT3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1JFQ09SRF9VTktOT1dOX0ZFQVRVUkUsIEJvb2xlYW4uVFJVRSk7Ci0JCQkJCQkJbm90YXRpb25Nb2RlbCA9IGxvYWRlci5sb2FkKGRvbWFpbiwgbG9hZE9wdGlvbnMsIG1vbml0b3IpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyB1c2VyIGRvZXMgbm90IHdhbnQgdG8gbG9hZCBpbiBjb21wYXRpYmlsaXR5IG1vZGUuCi0JCQkJCQkJcmV0dXJuIG51bGw7IAotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJfQotCQkJaWYobm90YXRpb25Nb2RlbCA9PSBudWxsKQotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFVOQUJMRV9UT19MT0FEX0RJQUdSQU0pOwotCi0JCQlJdGVyYXRvciByb290Q29udGVudHMgPSBub3RhdGlvbk1vZGVsLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKHJvb3RDb250ZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlFT2JqZWN0IHJvb3RFbGVtZW50ID0gKEVPYmplY3Qpcm9vdENvbnRlbnRzLm5leHQoKTsKLQkJCQlpZihyb290RWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pCi0JCQkJCXJldHVybiAoRGlhZ3JhbSlyb290RWxlbWVudDsKLQkJCX0KLQkJCQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTk9fRElBR1JBTV9JTl9SRVNPVVJDRSk7Ci0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCUNvcmVFeGNlcHRpb24gdGhyb3duRXhjcCA9IG51bGw7Ci0JCQlpZihlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCXRocm93bkV4Y3AgPSAoQ29yZUV4Y2VwdGlvbillOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXhjZXB0aW9uTWVzc2FnZSA9IGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHRocm93bkV4Y3AgPSBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgCQlFUEZEaWFncmFtUGx1Z2luLmdldFBsdWdpbklkKCksIDEsCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbk1lc3NhZ2UgIT0gbnVsbCA/IGV4Y2VwdGlvbk1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIDogImxvYWQoSUZpbGUsIGJvb2xlYW4pIiwgZSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0JCQl0aHJvdyB0aHJvd25FeGNwOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbG9hZCBhbiBleGlzdGluZyBkaWFncmFtIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jc3RhdGljIHByaXZhdGUgRGlhZ3JhbSBsb2FkKGZpbmFsIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgZmluYWwgSUxvYWRlciBsb2FkZXIsIGJvb2xlYW4gYlRyeUNvbXBhdGlibGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gIHsKLQkJUmVzb3VyY2Ugbm90YXRpb25Nb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0cnkgewkKLQkJCQkvLyBGaWxlIGV4aXN0cyB3aXRoIGNvbnRlbnRzLi4KLQkJCQlub3RhdGlvbk1vZGVsID0gbG9hZGVyLmxvYWQoZG9tYWluLCBuZXcgSGFzaE1hcCgpLCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKFJlc291cmNlLklPV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGJUcnlDb21wYXRpYmxlKSB7Ci0JCQkJCVRocm93YWJsZSBjYXVzZUVycm9yID0gZS5nZXRDYXVzZSgpOwotCQkJCQkKLQkJCQkJaWYgKGNhdXNlRXJyb3IgPT0gbnVsbCkgewotCQkJCQkJY2F1c2VFcnJvciA9IGU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCVN0cmluZyBlcnJNc2cgPSBjYXVzZUVycm9yLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJCQkJaWYgKGNhdXNlRXJyb3IgaW5zdGFuY2VvZiBSZXNvdXJjZS5JT1dyYXBwZWRFeGNlcHRpb24pIHsKLQkJCQkJCUV4Y2VwdGlvbiBleGMgPSAoRXhjZXB0aW9uKSgoUmVzb3VyY2UuSU9XcmFwcGVkRXhjZXB0aW9uKSBjYXVzZUVycm9yKQotCQkJCQkJCS5nZXRDYXVzZSgpOwotCQkJCQkJaWYgKGV4YyAhPSBudWxsKSB7Ci0JCQkJCQkJY2F1c2VFcnJvciA9IGV4YzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKChjYXVzZUVycm9yIGluc3RhbmNlb2YgUGFja2FnZU5vdEZvdW5kRXhjZXB0aW9uIAotCQkJCQkJCXx8IGNhdXNlRXJyb3IgaW5zdGFuY2VvZiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0JCQkJCQkJfHwgY2F1c2VFcnJvciBpbnN0YW5jZW9mIEZlYXR1cmVOb3RGb3VuZEV4Y2VwdGlvbikpIHsKLQkJCQkJCWlmIChzaG91bGRMb2FkSW5Db21wYXRpYmlsaXR5TW9kZShlcnJNc2cpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGxvYWRPcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIAkJCQkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSB3aWxsIHBsYWNlIGEgc3BlY2lhbCBleHRlbmRlZCBtZXRhZGF0YSBpbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHdlIGNhbiBsb2FkIGRpYWdyYW1zCi0gICAgICAgICAgICAJCQkJLy8gIGZyb20gb2xkZXIgdmVyc2lvbnMgb2Ygb3VyIG1ldGFtb2RlbC4KLSAgICAgICAgICAgIAkJCQlsb2FkT3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgbmV3IE5vdGF0aW9uRXh0ZW5kZWRNZXRhRGF0YSgpKTsKLSAgICAgICAgICAgIAkJCQkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkT3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1JFQ09SRF9VTktOT1dOX0ZFQVRVUkUsIEJvb2xlYW4uVFJVRSk7Ci0JCQkJCQkJbm90YXRpb25Nb2RlbCA9IGxvYWRlci5sb2FkKGRvbWFpbiwgbG9hZE9wdGlvbnMsIG1vbml0b3IpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyB1c2VyIGRvZXMgbm90IHdhbnQgdG8gbG9hZCBpbiBjb21wYXRpYmlsaXR5IG1vZGUuCi0JCQkJCQkJcmV0dXJuIG51bGw7IAotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJfQotCQkJaWYobm90YXRpb25Nb2RlbCA9PSBudWxsKQotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFVOQUJMRV9UT19MT0FEX0RJQUdSQU0pOwotCi0JCQkvL0ZpbGVFZGl0b3JJbnB1dFByb3h5IHByb3h5ID0gKEZpbGVFZGl0b3JJbnB1dFByb3h5KWlucHV0OwotCQkJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5IGZpbGVJbnB1dCA9IChEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpaW5wdXQ7Ci0JCQlEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUlucHV0ID0gZmlsZUlucHV0LmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCi0JCQlPYmplY3QgaW5wdXRFbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQotCQkJRGlhZ3JhbSBhZCA9IG51bGw7Ci0JCQlJdGVyYXRvciByb290Q29udGVudHMgPSBub3RhdGlvbk1vZGVsLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLQkJCWZpbmRfYWQ6Ci0JCQl3aGlsZShyb290Q29udGVudHMuaGFzTmV4dCgpKSB7Ci0JCQkJRU9iamVjdCByb290RWxlbWVudCA9IChFT2JqZWN0KXJvb3RDb250ZW50cy5uZXh0KCk7Ci0JCQkJCi0JCQkJaWYocm9vdEVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKXsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pcm9vdEVsZW1lbnQ7Ci0JCQkJCUVPYmplY3QgZGlhZ3JhbUVsZW1lbnQgPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJCQkJLy9UT0RPOiBjYW4gdGhpcyBtZXRob2QgaGFuZGxlIHdpdGggb3RoZXIgdHlwZXMgb2YgZGlhZ3JhbT8/PwotCQkJCQlpZihEaWFncmFtU2VydmljZS5BRF9raW5kLmVxdWFscyhkaWFncmFtLmdldFR5cGUoKSkgJiYgZGlhZ3JhbUVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBVbWFVbWxVdGlsLmdldFVtYUVsZW1lbnQoKE5hbWVkRWxlbWVudClkaWFncmFtRWxlbWVudCk7Ci0JCQkJCQlpZihpbnB1dEVsZW1lbnQgPT0gZWxlbWVudCl7Ci0JCQkJCQkJYWQgPSBkaWFncmFtOwotCQkJCQkJCWJyZWFrIGZpbmRfYWQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZihhZCAhPSBudWxsKSB7Ci0JCQkJCi0JCQkJLy8gZGlhZ3JhbSBmb3VuZCwgcmVtb3ZlIGFsbCBvdGhlciBkaWFncmFtcyBhbmQgdGhlaXIgc2VtYXRpYyBtb2RlbHMgZnJvbSB0aGUgcmVzb3VyY2UKLQkJCQkvLwotLy8JCQkJTGlzdCB0b1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vdGF0aW9uTW9kZWwuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotLy8JCQkJCWlmKGVsZW1lbnQgIT0gYWQgJiYgZWxlbWVudCAhPSBhZC5nZXRFbGVtZW50KCkpIHsKLS8vCQkJCQkJdG9SZW1vdmUuYWRkKGVsZW1lbnQpOwotLy8JCQkJCX0JCQkJCQotLy8JCQkJfQotLy8JCQkJCi0vLwkJCQlpZighdG9SZW1vdmUuaXNFbXB0eSgpKSB7Ci0vLwkJCQkJSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBpbnRlcm5hbERvbWFpbiA9ICgoSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbilkb21haW4pOwotLy8JCQkJCUludGVybmFsVHJhbnNhY3Rpb24gdHggPSBpbnRlcm5hbERvbWFpbi5nZXRBY3RpdmVUcmFuc2FjdGlvbigpOwotLy8JCQkJCWlmKHR4ID09IG51bGwpIHsKLS8vCQkJCQkJdHggPSBpbnRlcm5hbERvbWFpbi5zdGFydFRyYW5zYWN0aW9uKGZhbHNlLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotLy8JCQkJCX0KLS8vCQkJCQllbHNlIGlmKCF0eC5pc0FjdGl2ZSgpKSB7CQkKLS8vCQkJCQkJdHguc3RhcnQoKTsKLS8vCQkJCQl9Ci0vLwkJCQkJbm90YXRpb25Nb2RlbC5nZXRDb250ZW50cygpLnJlbW92ZUFsbCh0b1JlbW92ZSk7Ci0vLwkJCQkJCi0vLwkJCQkJdHguY29tbWl0KCk7Ci0vLwkJCQl9Ci0JCQkJCi0vLwkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGRvbWFpbi5jcmVhdGVSZXNvdXJjZShub3RhdGlvbk1vZGVsLmdldFVSSSgpKTsKLS8vCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuY2xlYXIoKTsKLS8vCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGFkLmdldEVsZW1lbnQoKSk7Ci0vLwkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChhZCk7Ci0JCQkJCi0JCQkJCi0JCQkJcmV0dXJuIGFkOwotCQkJfQotCQkJCi0JCQkvL1RPRE86IHJlbW92ZSB0aGUgZGVwZW5kZW5jeSBvbiBEaWFncmFtRWRpdG9yVXRpbC4KLQkJCWJvb2xlYW4gb2sgPURpYWdyYW1FZGl0b3JVdGlsLmNyZWF0ZURpYWdyYW1Db250ZW50KGRvbWFpbiwKLQkJCQkJZmlsZUlucHV0LmdldEZpbGUoKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgZGlhZ3JhbUlucHV0LCBub3RhdGlvbk1vZGVsKTsKLQkJCWlmKG9rKXsKLQkJCQkvL3VubG9hZChkb21haW4sIGRpYWdyYW0pCi0JCQkJcmV0dXJuIGxvYWQoZG9tYWluLCBsb2FkZXIsIGJUcnlDb21wYXRpYmxlLCBtb25pdG9yLCBpbnB1dCk7Ci0JCQl9Ci0JCQkJCi0JCQkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKE5PX0RJQUdSQU1fSU5fUkVTT1VSQ0UpOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlDb3JlRXhjZXB0aW9uIHRocm93bkV4Y3AgPSBudWxsOwotCQkJaWYoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCQl0aHJvd25FeGNwID0gKENvcmVFeGNlcHRpb24pZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGV4Y2VwdGlvbk1lc3NhZ2UgPSBlLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICB0aHJvd25FeGNwID0gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotICAgICAgICAgICAgICAgICAgICBFUEZEaWFncmFtUGx1Z2luLmdldFBsdWdpbklkKCksIDEsCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbk1lc3NhZ2UgIT0gbnVsbCA/IGV4Y2VwdGlvbk1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIDogImxvYWQoSUZpbGUsIGJvb2xlYW4pIiwgZSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0JCQl0aHJvdyB0aHJvd25FeGNwOwotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIGxvYWQgYW4gZXhpc3RpbmcgZGlhZ3JhbSBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXN0YXRpYyBwcml2YXRlIERpYWdyYW0gbG9hZChmaW5hbCBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIGZpbmFsIElMb2FkZXIgbG9hZGVyLCBib29sZWFuIGJUcnlDb21wYXRpYmxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQlNZXRob2RFbGVtZW50IG1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAgewotCQlSZXNvdXJjZSBub3RhdGlvbk1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyeSB7CQotCQkJCS8vIEZpbGUgZXhpc3RzIHdpdGggY29udGVudHMuLgotCQkJCW5vdGF0aW9uTW9kZWwgPSBsb2FkZXIubG9hZChkb21haW4sIG5ldyBIYXNoTWFwKCksIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoUmVzb3VyY2UuSU9XcmFwcGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoYlRyeUNvbXBhdGlibGUpIHsKLQkJCQkJVGhyb3dhYmxlIGNhdXNlRXJyb3IgPSBlLmdldENhdXNlKCk7Ci0JCQkJCQotCQkJCQlpZiAoY2F1c2VFcnJvciA9PSBudWxsKSB7Ci0JCQkJCQljYXVzZUVycm9yID0gZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJU3RyaW5nIGVyck1zZyA9IGNhdXNlRXJyb3IuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQkJCQlpZiAoY2F1c2VFcnJvciBpbnN0YW5jZW9mIFJlc291cmNlLklPV3JhcHBlZEV4Y2VwdGlvbikgewotCQkJCQkJRXhjZXB0aW9uIGV4YyA9IChFeGNlcHRpb24pKChSZXNvdXJjZS5JT1dyYXBwZWRFeGNlcHRpb24pIGNhdXNlRXJyb3IpCi0JCQkJCQkJLmdldENhdXNlKCk7Ci0JCQkJCQlpZiAoZXhjICE9IG51bGwpIHsKLQkJCQkJCQljYXVzZUVycm9yID0gZXhjOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoKGNhdXNlRXJyb3IgaW5zdGFuY2VvZiBQYWNrYWdlTm90Rm91bmRFeGNlcHRpb24gCi0JCQkJCQkJfHwgY2F1c2VFcnJvciBpbnN0YW5jZW9mIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLQkJCQkJCQl8fCBjYXVzZUVycm9yIGluc3RhbmNlb2YgRmVhdHVyZU5vdEZvdW5kRXhjZXB0aW9uKSkgewotCQkJCQkJaWYgKHNob3VsZExvYWRJbkNvbXBhdGliaWxpdHlNb2RlKGVyck1zZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgbG9hZE9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgCQkJCQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgcGxhY2UgYSBzcGVjaWFsIGV4dGVuZGVkIG1ldGFkYXRhIGluIGhlcmUgdG8gZW5zdXJlIHRoYXQgd2UgY2FuIGxvYWQgZGlhZ3JhbXMKLSAgICAgICAgICAgIAkJCQkvLyAgZnJvbSBvbGRlciB2ZXJzaW9ucyBvZiBvdXIgbWV0YW1vZGVsLgotICAgICAgICAgICAgCQkJCWxvYWRPcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBuZXcgTm90YXRpb25FeHRlbmRlZE1ldGFEYXRhKCkpOwotICAgICAgICAgICAgCQkJCQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRPcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLQkJCQkJCQlub3RhdGlvbk1vZGVsID0gbG9hZGVyLmxvYWQoZG9tYWluLCBsb2FkT3B0aW9ucywgbW9uaXRvcik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIHVzZXIgZG9lcyBub3Qgd2FudCB0byBsb2FkIGluIGNvbXBhdGliaWxpdHkgbW9kZS4KLQkJCQkJCQlyZXR1cm4gbnVsbDsgCi0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihub3RhdGlvbk1vZGVsID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oVU5BQkxFX1RPX0xPQURfRElBR1JBTSk7Ci0KLQkJCUl0ZXJhdG9yIHJvb3RDb250ZW50cyA9IG5vdGF0aW9uTW9kZWwuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUocm9vdENvbnRlbnRzLmhhc05leHQoKSkgewotCQkJCUVPYmplY3Qgcm9vdEVsZW1lbnQgPSAoRU9iamVjdClyb290Q29udGVudHMubmV4dCgpOwotCQkJCQotCQkJCWlmKHJvb3RFbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSl7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKXJvb3RFbGVtZW50OwotCQkJCQlFT2JqZWN0IGRpYWdyYW1FbGVtZW50ID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQkJCWlmKGRpYWdyYW1FbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gVW1hVW1sVXRpbC5nZXRVbWFFbGVtZW50KChOYW1lZEVsZW1lbnQpZGlhZ3JhbUVsZW1lbnQpOwotCi0JCQkJCQlpZihtZSA9PSBlbGVtZW50KXsKLQkJCQkJCQlyZXR1cm4gZGlhZ3JhbTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQkJCi0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCUNvcmVFeGNlcHRpb24gdGhyb3duRXhjcCA9IG51bGw7Ci0JCQlpZihlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCXRocm93bkV4Y3AgPSAoQ29yZUV4Y2VwdGlvbillOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXhjZXB0aW9uTWVzc2FnZSA9IGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHRocm93bkV4Y3AgPSBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIEVQRkRpYWdyYW1QbHVnaW4uZ2V0UGx1Z2luSWQoKSwgMSwKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uTWVzc2FnZSAhPSBudWxsID8gZXhjZXB0aW9uTWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgOiAibG9hZChJRmlsZSwgYm9vbGVhbikiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLQkJCXRocm93IHRocm93bkV4Y3A7Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gYktlZXBVbnJlY29nbml6ZWREYXRhCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCQotCXN0YXRpYyBwdWJsaWMgdm9pZCBzYXZlKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgSUZpbGUgZmlsZSwgRGlhZ3JhbSBkaWFncmFtLCBib29sZWFuIGJLZWVwVW5yZWNvZ25pemVkRGF0YSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQlpZihiS2VlcFVucmVjb2duaXplZERhdGEpCi0gICAgICAgICAgICBvcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgc2F2ZShkb21haW4sIGZpbGUsIGRpYWdyYW0sIHByb2dyZXNzTW9uaXRvciwgb3B0aW9ucyk7Ci0JfQotICAgIAotICAgIHN0YXRpYyBwdWJsaWMgdm9pZCBzYXZlKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgSUZpbGUgZmlsZSwgRGlhZ3JhbSBkaWFncmFtLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHNhdmUoZG9tYWluLCBmaWxlLCBkaWFncmFtLCBwcm9ncmVzc01vbml0b3IsIG9wdGlvbnMpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0IGdldE90aGVyRGlhZ3JhbU9iamVjdHMoUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBhY3RHdWlkKSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWlmKCFhY3RHdWlkLmVxdWFscyhVbWFVbWxVdGlsLmdldFVtYUd1aWRGcm9tVW1sRWxlbWVudCgoTmFtZWRFbGVtZW50KSBlbGVtZW50KSkpIHsKLQkJCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCU9iamVjdCBlID0gKChEaWFncmFtKWVsZW1lbnQpLmdldEVsZW1lbnQoKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsgCi0JCQkJCWlmKCFhY3RHdWlkLmVxdWFscyhVbWFVbWxVdGlsLmdldFVtYUd1aWRGcm9tVW1sRWxlbWVudCgoTmFtZWRFbGVtZW50KSBlKSkpIHsKLQkJCQkJCWxpc3QuYWRkKGVsZW1lbnQpOwotCQkJCQl9CQkJCQkJCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlsaXN0LmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlsaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLSAgICB9Ci0JCi0Jc3RhdGljIHB1YmxpYyB2b2lkIHNhdmUoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBJRmlsZSBmaWxlLCBEaWFncmFtIGRpYWdyYW0sIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBNYXAgb3B0aW9ucykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZSBub3RhdGlvbk1vZGVsID0gKChFT2JqZWN0KSBkaWFncmFtKS5lUmVzb3VyY2UoKTsKLQkJU3RyaW5nIGFjdEd1aWQgPSBVbWFVbWxVdGlsLmdldFVtYUd1aWRGcm9tVW1sRWxlbWVudCgoTmFtZWRFbGVtZW50KSBkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQotCQkvLyBUaGUgY3VycmVudCByZXNvdXJjZSBjb250YWlucyBvbmx5IGN1cnJlbnQgZGlhZ3JhbQotCQkvLyBTbyBsb2FkIGRpYWdyYW0gZmlsZSBhbmQgYWRkIG90aGVyIGRpYWdyYW1zIHRvIHRoZSBjdXJyZW50IHJlc291cmNlIGJlZm9yZSBzYXZpbmcgaXQKLQkJLy8KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZUZhY3RvcnkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKTsKLQkJdHJ5IHsKLQkJCVRyYW5zYWN0aW9uIHR4ID0gKChJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKWRvbWFpbikuc3RhcnRUcmFuc2FjdGlvbihmYWxzZSwgVFhfT1BUSU9OUyk7Ci0JCQlyZXNvdXJjZS5sb2FkKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7CQotCQkJTGlzdCBuZXdMaXN0ID0gZ2V0T3RoZXJEaWFncmFtT2JqZWN0cyhyZXNvdXJjZSwgYWN0R3VpZCk7Ci0JCQlMaXN0IG9sZExpc3QgPSBnZXRPdGhlckRpYWdyYW1PYmplY3RzKG5vdGF0aW9uTW9kZWwsIGFjdEd1aWQpOwotCQkJbm90YXRpb25Nb2RlbC5nZXRDb250ZW50cygpLnJlbW92ZUFsbChvbGRMaXN0KTsKLQkJCW5vdGF0aW9uTW9kZWwuZ2V0Q29udGVudHMoKS5hZGRBbGwobmV3TGlzdCk7Ci0JCQl0eC5jb21taXQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQkJCi0JCQotCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpOwotCQlub3RhdGlvbk1vZGVsLnNldFVSSShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlTmFtZSwgdHJ1ZSkpOwotCQl0cnkgewotCQkJbm90YXRpb25Nb2RlbC5zYXZlKG9wdGlvbnMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEVQRkRpYWdyYW1QbHVnaW4KLQkJCQkuZ2V0UGx1Z2luSWQoKSwgNSwgZQotCQkJCS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG51bGwpKTsKLQkJfQotCi0JCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkKLQkJCXByb2dyZXNzTW9uaXRvci5kb25lKCk7Ci0JCQotCQlsb2dSZXNvdXJjZUVycm9yc0FuZFdhcm5pbmdzKG5vdGF0aW9uTW9kZWwpOwotCX0KLQkKLQkvKioKLQkgKiBUZW1wIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgbGF0ZXIuCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIHNhdmUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgc2F2ZShUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIElGaWxlIGZpbGUsIERpYWdyYW0gZGlhZ3JhbSwgCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgYm9vbGVhbiBzYXZlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJUmVzb3VyY2Ugbm90YXRpb25Nb2RlbCA9ICgoRU9iamVjdCkgZGlhZ3JhbSkuZVJlc291cmNlKCk7Ci0JCWlmKG5vdGF0aW9uTW9kZWwgPT0gbnVsbCl7Ci0JCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKQotCSAgICAgICAgICAgICAgICAudG9PU1N0cmluZygpLCB0cnVlKTsKLQkJCQkKLQkJCQlub3RhdGlvbk1vZGVsID0gZG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7Ci0JCQkJaWYgKG5vdGF0aW9uTW9kZWwgPT0gbnVsbCkgewotCQkJCQlub3RhdGlvbk1vZGVsID0gZG9tYWluLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJCQl9Ci0JCQkJbm90YXRpb25Nb2RlbC5nZXRDb250ZW50cygpLmFkZChkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJbm90YXRpb25Nb2RlbC5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJfWVsc2V7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpOwotCQkJbm90YXRpb25Nb2RlbC5zZXRVUkkoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZU5hbWUsIHRydWUpKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCW5vdGF0aW9uTW9kZWwuc2F2ZShvcHRpb25zKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFUEZEaWFncmFtUGx1Z2luCi0JCQkJLmdldFBsdWdpbklkKCksIDUsIGUKLQkJCQkuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBudWxsKSk7Ci0JCX0KLQotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpCi0JCQlwcm9ncmVzc01vbml0b3IuZG9uZSgpOwotCQkKLQkJbG9nUmVzb3VyY2VFcnJvcnNBbmRXYXJuaW5ncyhub3RhdGlvbk1vZGVsKTsKLQl9Ci0JCi0JCi0JCS8qKgotCSAqIEBwYXJhbSBlcnJNc2cKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzaG91bGRMb2FkSW5Db21wYXRpYmlsaXR5TW9kZShTdHJpbmcgZXJyTXNnKSB7Ci0JCS8vIG5vIGNvbXBhdGliaWxpdHkgc3VwcG9ydCBhdCBwcmVzZW50Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHVubG9hZChUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIERpYWdyYW0gZGlhZ3JhbSkgewotCQlkaWFncmFtLmVSZXNvdXJjZSgpLnVubG9hZCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNVbnJlY29nbml6ZWREYXRhKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCS8vIG5vIGNvbXBhdGliaWxpdHkgc3VwcG9ydCBhdCBwcmVzZW50Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKElFZGl0b3JJbnB1dCBpbnB1dCl7Ci0JCXJldHVybiBnZXRGaWxlKERpYWdyYW1GaWxlQ3JlYXRvckV4LmRlZmF1bHRfZGlhZ3JhbV9maWxlLCBpbnB1dCwKLQkJCQlEaWFncmFtRmlsZUNyZWF0b3JFeC5nZXRJbnN0YW5jZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciBmaWxlIGV4aXN0cyBvciBub3QuCi0JICogQHBhcmFtIHN6RmlsZU5hbWUKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcGFyYW0gZGlhZ3JhbUZpbGVDcmVhdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0RmlsZShTdHJpbmcgc3pGaWxlTmFtZSwgSUVkaXRvcklucHV0IGlucHV0LAotCQkJRGlhZ3JhbUZpbGVDcmVhdG9yIGRpYWdyYW1GaWxlQ3JlYXRvcikgewotCi0JCU1ldGhvZEVsZW1lbnQgZSA9ICgoRGlhZ3JhbUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQlQcm9jZXNzIHNyY1Byb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGUpOwotCi0JCUlQYXRoIGNvbnRhaW5lclBhdGggPSBnZXRDb250YWluZXJQYXRoKGUpOwotCQlTdHJpbmcgc3pOZXdGaWxlTmFtZSA9IHN6RmlsZU5hbWU7Ci0JCUlQYXRoIGZpbGVQYXRoID0gY29udGFpbmVyUGF0aC5hcHBlbmQoZGlhZ3JhbUZpbGVDcmVhdG9yCi0JCQkJLmFwcGVuZEV4dGVuc2lvblRvRmlsZU5hbWUoc3pOZXdGaWxlTmFtZSkpOwotCQlGaWxlIGxpYkRpcnMgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKTsKLQkJU3RyaW5nIGRpYWdyYW1QYXRoID0gbGliRGlycy5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJKyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmdldEVsZW1lbnRQYXRoKHNyY1Byb2MpCi0JCQkJKyBGaWxlLnNlcGFyYXRvciArIHNyY1Byb2MuZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkrICJkaWFncmFtLnhtaSI7Ci0JCUZpbGUgZmlsZXggPSBuZXcgRmlsZShkaWFncmFtUGF0aCk7Ci0JCWlmIChmaWxleC5leGlzdHMoKSkgewotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEB3cml0dGVuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRDb250YWluZXJQYXRoKCl7Ci0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IHJvb3QuZ2V0UHJvamVjdHMoKTsKLQotCQkJCXBhdGggPSByb290LmdldEZ1bGxQYXRoKCk7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQotCQkJCQlpZiAocHJvamVjdC5pc09wZW4oKSkgewotCQkJCQkJcGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiAKLQkgKiBAcGFyYW0gcHJvYwotCSAqIEByZXR1cm4KLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRDb250YWluZXJQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCi0JCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKTsKLQkJLy8gVE9ETyBoYW5kbGUgdGhlIFdyYXBwZXIgRWxlbWVudHMuCi0JCQotCQlpZiAocHJvYyBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwcm9jKTsKLQotCQkJU3RyaW5nIHJlbGF0aXZlRGlyOwotCi0JCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJcmVsYXRpdmVEaXIgPSBNdWx0aUZpbGVTYXZlVXRpbC5DQVBBQklMSVRZX1BBVFRFUk5fUEFUSDsKLQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCXJlbGF0aXZlRGlyID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVMSVZFUllfUFJPQ0VTU19QQVRIOwotCQkJfSBlbHNlIHsKLQkJCQlyZWxhdGl2ZURpciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCUlQYXRoIHdvcmtzcGFjZVBhdGggPSBudWxsOwotCQkJaWYgKHdvcmtzcGFjZVBhdGggPT0gbnVsbCkgewotCQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSByb290LmdldFByb2plY3RzKCk7Ci0KLQkJCQl3b3Jrc3BhY2VQYXRoID0gcm9vdC5nZXRGdWxsUGF0aCgpOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7ICsraSkgewotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0KLQkJCQkJaWYgKHByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQkJCXdvcmtzcGFjZVBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJU3RyaW5nIGxpYkRpciA9IHdvcmtzcGFjZVBhdGgudG9TdHJpbmcoKTsKLQkJCVN0cmluZyBwbHVnaW5EaXIgPSBsaWJEaXIgKyBGaWxlLnNlcGFyYXRvciArIHBsdWdpbi5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgZGlhZ3JhbURpciA9IHBsdWdpbkRpciArIEZpbGUuc2VwYXJhdG9yICsgcmVsYXRpdmVEaXIKLQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHByb2MuZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUHJpbnQ6ICIgKyBkaWFncmFtRGlyKTsKLQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRpYWdyYW1EaXIpOwotCQkJcmV0dXJuIHBhdGg7Ci0KLQkJCS8vCSByZXR1cm4gd29ya3NwYWNlUGF0aDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9IAotCQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgZmlsZSBleGlzdHMgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBzekZpbGVOYW1lCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHBhcmFtIGRpYWdyYW1GaWxlQ3JlYXRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldEZpbGUoU3RyaW5nIHN6RmlsZU5hbWUsIEJyZWFrZG93bkVsZW1lbnQgZSwKLQkJCURpYWdyYW1GaWxlQ3JlYXRvciBkaWFncmFtRmlsZUNyZWF0b3IpIHsKLQotCQlQcm9jZXNzIHNyY1Byb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGUpOwotCi0JCUlQYXRoIGNvbnRhaW5lclBhdGggPSBnZXRDb250YWluZXJQYXRoKGUpOwotCQlTdHJpbmcgc3pOZXdGaWxlTmFtZSA9IHN6RmlsZU5hbWU7Ci0JCUlQYXRoIGZpbGVQYXRoID0gY29udGFpbmVyUGF0aC5hcHBlbmQoZGlhZ3JhbUZpbGVDcmVhdG9yCi0JCQkJLmFwcGVuZEV4dGVuc2lvblRvRmlsZU5hbWUoc3pOZXdGaWxlTmFtZSkpOwotCQlGaWxlIGxpYkRpcnMgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKTsKLQkJU3RyaW5nIGRpYWdyYW1QYXRoID0gbGliRGlycy5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJKyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmdldEVsZW1lbnRQYXRoKHNyY1Byb2MpCi0JCQkJKyBGaWxlLnNlcGFyYXRvciArIHNyY1Byb2MuZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkrICJkaWFncmFtLnhtaSI7Ci0JCUZpbGUgZmlsZXggPSBuZXcgRmlsZShkaWFncmFtUGF0aCk7Ci0JCWlmIChmaWxleC5leGlzdHMoKSkgewotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8qKgotCSAqIAotCSAqIAotCSAqIENyZWF0ZXMgYSBkaWFncmFtIGZpbGUgY29udGVudCAtIEdNRiBub3RhdGlvbiBEaWFncmFtIGFuZCBVTUwgQWN0aXZpdHksCi0JICogVU1BIGJyaWRnZS4gVE9ETzogcmVtb3ZlIHRoZSBkZXBlbmRlbmN5IG9uIGNvbW1hbmQuCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY3JlYXRlRGlhZ3JhbUNvbnRlbnQoCi0JCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBJRmlsZSBkaWFncmFtRmlsZSwKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJRWRpdG9ySW5wdXQgaW5wdXQsCi0JCQlSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGtpbmQpIHsKLQotCQlMaXN0IGFmZmVjdGVkRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFmZmVjdGVkRmlsZXMuYWRkKGRpYWdyYW1GaWxlKTsKLQkJQ3JlYXRlRGlhZ3JhbUNvbW1hbmQgY29tbWFuZCA9IG5ldyBDcmVhdGVEaWFncmFtQ29tbWFuZChlZGl0aW5nRG9tYWluLAotCQkJCUNyZWF0ZURpYWdyYW1Db21tYW5kLkNPTU1BTkRfTEFCRUwsIGFmZmVjdGVkRmlsZXMsIGlucHV0LAotCQkJCXJlc291cmNlLCBraW5kKTsKLQkJdHJ5IHsKLQkJCU9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5LmdldE9wZXJhdGlvbkhpc3RvcnkoKS5leGVjdXRlKGNvbW1hbmQsCi0JCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxKSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gY3JlYXRlIG1vZGVsIGFuZCBkaWFncmFtIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFncmFtIGNyZWF0ZURpYWdyYW0oVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgCi0JCQlTdHJpbmcgZGlhZ3JhbUtpbmQsIEJyZWFrZG93bkVsZW1lbnQgbWUsIGJvb2xlYW4gc2F2ZSkgewotCQlJRmlsZSBkaWFncmFtRmlsZSA9IGdldEZpbGUoRGlhZ3JhbUZpbGVDcmVhdG9yRXguZGVmYXVsdF9kaWFncmFtX2ZpbGUsIChCcmVha2Rvd25FbGVtZW50KW1lLCAKLQkJCQlEaWFncmFtRmlsZUNyZWF0b3JFeC5nZXRJbnN0YW5jZSgpKTsJCi0JCQotCQlmaW5hbCBSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkKLQkJCQkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGlhZ3JhbUZpbGUKLQkJCQkJCS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKTsKLQkJTGlzdCBhZmZlY3RlZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhZmZlY3RlZEZpbGVzLmFkZChkaWFncmFtRmlsZSk7Ci0KLQkJZmluYWwgU3RyaW5nIGtpbmRQYXJhbSA9IGRpYWdyYW1LaW5kOwotCQlmaW5hbCBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSBtZTsKLQkJZmluYWwgYm9vbGVhbiBzYXZlRGlhZ3JhbSA9IHNhdmU7Ci0JCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sICJDcmVhdGluZyBkaWFncmFtIGFuZCBtb2RlbCIsIGFmZmVjdGVkRmlsZXMpIHsgLy8kTk9OLU5MUy0xJAotCQkJRGlhZ3JhbSBkaWFncmFtID0gbnVsbDsKLQkJCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoCi0JCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQlBY3Rpdml0eSBtb2RlbCA9IFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5KCk7Ci0JCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKG1vZGVsKTsKLQkJCQlkaWFncmFtID0gVmlld1NlcnZpY2UuY3JlYXRlRGlhZ3JhbShtb2RlbCwga2luZFBhcmFtLAotCQkJCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJaWYobWV0aG9kRWxlbWVudCAhPSBudWxsICYmIG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5KXsKLQkJCQkJCVVtYVVtbFV0aWwuY3JlYXRlRUFubm90YXRpb25Gb3JVbWwobW9kZWwsIG1ldGhvZEVsZW1lbnQuZ2V0R3VpZCgpKTsKLQkJCQkJfQotCQkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQkJCWRpYWdyYW0uc2V0TmFtZShtZXRob2RFbGVtZW50LmdldE5hbWUoKSk7Ci0JCQkJCWRpYWdyYW0uc2V0RWxlbWVudChtb2RlbCk7Ci0JCQkJCW1vZGVsLnNldE5hbWUobWV0aG9kRWxlbWVudC5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQkvLyBFbmFibGUgYmVsb3cgaWYgd2UgaGF2ZSB0byBzdG9yZSB0aGUgZGlhZ3JhbSBpbW1lZGlhdGVseS4KLQkJCQlpZiAoc2F2ZURpYWdyYW0pIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCSBkaWFncmFtUmVzb3VyY2Uuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJVbmFibGUgdG8gc3RvcmUgbW9kZWwgYW5kIGRpYWdyYW0gcmVzb3VyY2VzIgotCQkJCQkJCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChkaWFncmFtKTsKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCAxKSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogVW5hYmxlIHRvIGNyZWF0ZSBtb2RlbCBhbmQgZGlhZ3JhbSIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQotCQl0cnkgewotCQkJZGlhZ3JhbUZpbGUuc2V0Q2hhcnNldCgKLQkJCQkJIlVURi04IiwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCAxKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiBVbmFibGUgdG8gc2V0IGNoYXJzZXQgZm9yIGRpYWdyYW0gZmlsZSAiKyAgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIChEaWFncmFtKWNvbW1hbmQuZ2V0Q29tbWFuZFJlc3VsdCgpLmdldFJldHVyblZhbHVlKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIAotCSAqIEAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpYWdyYW0gc2F2ZURpYWdyYW0oVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgSUZpbGUgZGlhZ3JhbUZpbGUsIAotCQkJRGlhZ3JhbSBkaWFncmFtLCBib29sZWFuIHNhdmUpIHsKLQkJCi0JCVJlc291cmNlIG5vdGF0aW9uTW9kZWwgPSAoKEVPYmplY3QpIGRpYWdyYW0pLmVSZXNvdXJjZSgpOwotCQlpZihub3RhdGlvbk1vZGVsID09IG51bGwpewotCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkaWFncmFtRmlsZS5nZXRGdWxsUGF0aCgpCi0JICAgICAgICAgICAgICAgIC50b09TU3RyaW5nKCksIHRydWUpOwotCQkJCQotCQkJCW5vdGF0aW9uTW9kZWwgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7Ci0JCQkJaWYgKG5vdGF0aW9uTW9kZWwgPT0gbnVsbCkgewotCQkJCQlub3RhdGlvbk1vZGVsID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCQkJfQotCQl9Ci0JCWZpbmFsIFJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IG5vdGF0aW9uTW9kZWw7Ci0JCUxpc3QgYWZmZWN0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYWZmZWN0ZWRGaWxlcy5hZGQoZGlhZ3JhbUZpbGUpOwotCQlmaW5hbCBEaWFncmFtIHNhdmVEaWFncmFtID0gZGlhZ3JhbTsKLQkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IEFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwgIlNhdmluZyBkaWFncmFtIGFuZCBtb2RlbCIsIGFmZmVjdGVkRmlsZXMpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChzYXZlRGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChzYXZlRGlhZ3JhbSk7Ci0JCQkJdHJ5IHsKLQkJCQkJIGRpYWdyYW1SZXNvdXJjZS5zYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIlVuYWJsZSB0byBzdG9yZSBtb2RlbCBhbmQgZGlhZ3JhbSByZXNvdXJjZXMiCi0JCQkJCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KHNhdmVEaWFncmFtKTsKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCAxKSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogVW5hYmxlIHRvIGNyZWF0ZSBtb2RlbCBhbmQgZGlhZ3JhbSIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQotCQl0cnkgewotCQkJZGlhZ3JhbUZpbGUuc2V0Q2hhcnNldCgKLQkJCQkJIlVURi04IiwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCAxKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiBVbmFibGUgdG8gc2V0IGNoYXJzZXQgZm9yIGRpYWdyYW0gZmlsZSAiKyAgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIChEaWFncmFtKWNvbW1hbmQuZ2V0Q29tbWFuZFJlc3VsdCgpLmdldFJldHVyblZhbHVlKCk7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCBnZXRJbml0aWFsQ29udGVudHMuIEdldHMgdGhlIGluaXRpYWwgY29udGVudHMgb2YgdGhlIFVNTAotCSAqIFZpc3VhbGl6ZXIgZGlhZ3JhbSBmaWxlLiBDdXJyZW50bHkgaXQgcmV0dXJucyBhbiBlbXB0eSBieXRlIHN0cmVhbS4KLQkgKgotCSAqIEByZXR1cm4gQnl0ZSBzdHJlYW0gdGhhdCB3aWxsIGluaXRpYWxseSBwb3B1bGF0ZSB0aGUgVU1MCi0JICogICAgICAgICBWaXN1YWxpemVyIGRpYWdyYW0gZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldEluaXRpYWxDb250ZW50cygpIHsKLQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7Ci0JfQotCQotCQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2l0aGluIGEgd29ya3NwYWNlIG1vZGlmeSBvcGVyYXRpb24gc2luY2UgaXQgY3JlYXRlcyByZXNvdXJjZXMuCi0JICogPC9wPgotCSAqIEBtb2RpZmllZAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgZmlsZSByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGZpbGUgd2FzIG5vdCBjcmVhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRmlsZSBjcmVhdGVOZXdEaWFncmFtRmlsZSgKLQkJCURpYWdyYW1GaWxlQ3JlYXRvckV4IGRpYWdyYW1GaWxlQ3JlYXRvciwgSUVkaXRvcklucHV0IGlucHV0LCAKLQkJCVNoZWxsIHNoZWxsLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciApIHsKLQkJCi0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0KWlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCWZpbmFsIElQYXRoIGNvbnRhaW5lclBhdGggPSBnZXRDb250YWluZXJQYXRoKGVsZW1lbnQpOwotCQlmaW5hbCBTdHJpbmcgZGlhZ3JhbUZpbGVOYW1lID0gRGlhZ3JhbUZpbGVDcmVhdG9yRXguZGVmYXVsdF9kaWFncmFtX2ZpbGU7Ci0JCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIkNyZWF0aW5nIG5vdGF0aW9uIGRpYWdyYW0gYW5kIG1vZGVsIGZpbGUiLCA0KTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHN1YlByb2dyZXNzTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IoCi0JCQkJcHJvZ3Jlc3NNb25pdG9yLCAxKTsKLQkJZmluYWwgSUZpbGUgZGlhZ3JhbUZpbGUgPSBkaWFncmFtRmlsZUNyZWF0b3IuY3JlYXRlTmV3RmlsZSgKLQkJCQljb250YWluZXJQYXRoLCBkaWFncmFtRmlsZU5hbWUsIAotCQkJCWdldEluaXRpYWxDb250ZW50cygpLCBzaGVsbCwKLQkJCQluZXcgSVJ1bm5hYmxlQ29udGV4dCgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKGJvb2xlYW4gZm9yaywgYm9vbGVhbiBjYW5jZWxhYmxlLAotCQkJCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQlydW5uYWJsZS5ydW4oc3ViUHJvZ3Jlc3NNb25pdG9yKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJLy9jcmVhdGVEaWFncmFtQ29udGVudChkaWFncmFtRmlsZSwgcHJvZ3Jlc3NNb25pdG9yLCBpbnB1dCk7Ci0JCXByb2dyZXNzTW9uaXRvci5kb25lKCk7Ci0JCXJldHVybiBkaWFncmFtRmlsZTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL0RpYWdyYW1TZXJ2aWNlLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9EaWFncmFtU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjFhNDQxLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL0RpYWdyYW1TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbC5Db3BpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS5BYnN0cmFjdEVNRk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS51dGlsLlVtYVVtbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLlN0cmluZ1N0YXRpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLkRpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVNRkNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5PYmplY3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0KLS8qKgotICogRGlhZ3JhbSBzZXJ2aWNlIGRvZXMgZGlhZ3JhbSBkYXRhIHNwZWNpZmljIHdvcmsgcmVxdWVzdGVkIGJ5IGNsaWVudHMuCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1TZXJ2aWNlIGltcGxlbWVudHMgSURpYWdyYW1TZXJ2aWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVElOR19ET01JQU5fSUQgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkVkaXRpbmdEb21haW4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURfa2luZCA9IERpYWdyYW1NYW5hZ2VyLkFEX2tpbmQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX2tpbmQgPSBEaWFncmFtTWFuYWdlci5BRERfa2luZDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUERfa2luZCA9IERpYWdyYW1NYW5hZ2VyLldQRF9raW5kOwkKLQkKLQlzdGF0aWMgZmluYWwgaW50W10gRElBR1JBTV9UWVBFUyA9IHsgQUNUSVZJVFlfRElBR1JBTSwgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSwgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0gfTsKLQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gRElBR1JBTV9LSU5EUyA9IG5ldyBTdHJpbmdbXXtBRF9raW5kLCBXUERfa2luZCwgQUREX2tpbmR9OwotCi0JcHVibGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcmVmZXJlbmNlc0hpbnQgRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UID0gbmV3IFByZWZlcmVuY2VzSGludCgKLQkJCUlEKTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIERpYWdyYW1TZXJ2aWNlIGluc3RhbmNlID0gbmV3IERpYWdyYW1TZXJ2aWNlKCk7Ci0JcHJvdGVjdGVkIExpc3QgZGlzcGF0Y2hlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERpYWdyYW1TZXJ2aWNlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERpYWdyYW1TZXJ2aWNlIGVJbnN0YW5jZSgpewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCQotCQotCS8qKgotCSAqIEFkZHMgYSBkaXNwYXRjaGVycyB0byBtb25pdG9yIExpYnJhcnkgU2VydmljZSBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGRpc3BhdGNoZXJzCi0JICogICAgICAgICAgICBhIGRpYWdyYW0gc2VydmljZSBkaXNwYXRjaGVycwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERpc3BhdGNoZXJzKElTYXZlRXZlbnREaXNwYXRjaGVyIGRpc3BhdGNoZXIpIHsKLQkJZGlzcGF0Y2hlcnMuYWRkKGRpc3BhdGNoZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBkaXNwYXRjaGVycyB0aGF0IHdhcyBhZGRlZCB0byBtb25pdG9yIExpYnJhcnkgU2VydmljZSBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGRpc3BhdGNoZXJzCi0JICogICAgICAgICAgICBhIGRpYWdyYW0gc2VydmljZSBkaXNwYXRjaGVycwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURpc3BhdGNoZXJzKElTYXZlRXZlbnREaXNwYXRjaGVyIGRpc3BhdGNoZXIpIHsKLQkJZGlzcGF0Y2hlcnMucmVtb3ZlKGRpc3BhdGNoZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwYXRjaChJU2F2ZUluZm8gaW5mbyl7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpc3BhdGNoZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVNhdmVFdmVudERpc3BhdGNoZXIgZWxlbWVudCA9IChJU2F2ZUV2ZW50RGlzcGF0Y2hlcikgaXRlci5uZXh0KCk7Ci0JCQllbGVtZW50LnVwZGF0ZVRpbWVTdGFtcChpbmZvKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgU2F2ZUluZm8gZ2V0U2F2ZUluZm8oT2JqZWN0IG9iaiwgbG9uZyB0aW1lU3RhbXApewotCQkKLQkJcmV0dXJuIG5ldyBTYXZlSW5mbyhvYmosIHRpbWVTdGFtcCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBUcmFuc2FjdGlvbmFsRG9tYWluIGZvciBoYW5kbGluZyB0aGluZ3Mgd2l0aCByZXNvdXJjZXMuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBjcmVhdGVFZGl0aW5nRG9tYWluKCkgewotICAgICAgICBTdHJpbmcgZWRpdGluZ0RvbWFpbklEID0gRURJVElOR19ET01JQU5fSUQ7Ci0gICAgICAgIGlmIChlZGl0aW5nRG9tYWluSUQgIT0gbnVsbCkgewotICAgICAgICAgICAgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluLlJlZ2lzdHJ5LklOU1RBTkNFCi0gICAgICAgICAgICAgICAgLmdldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbklEKTsKLSAgICAgICAgICAgIGlmIChlZGl0aW5nRG9tYWluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWRpdGluZ0RvbWFpbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotICAgIH0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgZGlhZ3JhbSBmb3IgYmFzZSBhY3Rpdml0eS4gSWYgZGlhZ3JhbSBleGlzdHMuCi0JICogCi0JICogQHBhcmFtIGFjdAotCSAqIEBwYXJhbSBkaWFncmFtVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQkKLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKEFjdGl2aXR5IGFjdGl2aXR5LCBTdHJpbmcgZGlhZ3JhbVR5cGUsIGJvb2xlYW4gY3JlYXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewotCQlEaWFncmFtIGRpYWdyYW0gPSBudWxsOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBjcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JCUlGaWxlIGZpbGUgPSBEaWFncmFtUGVyc2lzdGVyLmdldEZpbGUoRGlhZ3JhbUZpbGVDcmVhdG9yRXguZGVmYXVsdF9kaWFncmFtX2ZpbGUsIGFjdGl2aXR5LCBEaWFncmFtRmlsZUNyZWF0b3JFeC5nZXRJbnN0YW5jZSgpKTsKLQkJCi0JCWlmKGZpbGUgIT0gbnVsbCl7Ci0JCQlpZihtb25pdG9yID09IG51bGwpbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQl0cnl7Ci0JCQkJZGlhZ3JhbSA9IERpYWdyYW1QZXJzaXN0ZXIubG9hZChkb21haW4sIGZpbGUsIHRydWUsICBtb25pdG9yLCBhY3Rpdml0eSk7Ci0JCQkJaWYoZGlhZ3JhbSAhPSBudWxsKXsKLQkJCQkJcmV0dXJuIGRpYWdyYW07Ci0JCQkJfQotCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQlpZihkZWJ1Zyl7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb2NjdXJlZCB3aGlsZSByZXRyaWV2aW5nIGRpYWdyYW0gZm9yICIgKyBhY3Rpdml0eSArICI6IiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYoY3JlYXRlKXsKLQkJCWRpYWdyYW0gPSBjcmVhdGVEaWFncmFtKGFjdGl2aXR5LCBkaWFncmFtVHlwZSwgZmFsc2UpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgY29weSBvZiBEaWFncmFtLiBBbHNvIGNvcGllcyB0aGUgcmVmZXJlbmNlcyBhbmQgYWxzbyBjb3BpZXMgdGhlIHVtbE9iamVjdC4KLQkgKiBAcGFyYW0gc291cmNlRGlhZ3JhbQotCSAqIEBwYXJhbSBhY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIERpYWdyYW0gY29weURpYWdyYW0oRGlhZ3JhbSBzb3VyY2VEaWFncmFtLCBBY3Rpdml0eSBhY3QpewotCQlEaWFncmFtIGNvcHkgPSBjb3B5KHNvdXJjZURpYWdyYW0pOwotCQlFT2JqZWN0IHVtbENvcHkgPSBjb3B5LmdldEVsZW1lbnQoKTsKLQkJaWYoYWN0ICE9IG51bGwpewotCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uKChOYW1lZEVsZW1lbnQpdW1sQ29weSwgYWN0KTsKLQkJfQotCQlpZihjb3B5ICE9IG51bGwpewotCQkJcmV0dXJuIGNvcHk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXByaXZhdGUgRGlhZ3JhbSBjb3B5KERpYWdyYW0gc291cmNlT2JqZWN0KXsKLQkJQ29waWVyIGNvcGllciA9IG5ldyBDb3BpZXIoKSB7Ci0JCQotCQkJLyoqCi0JCQkgKiAKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGNvcHlSZWZlcmVuY2UoRVJlZmVyZW5jZSBlUmVmZXJlbmNlLCBFT2JqZWN0IGVPYmplY3QsCi0JCQkJCUVPYmplY3QgY29weUVPYmplY3QpIHsKLQkJCQlpZiAoZU9iamVjdC5lSXNTZXQoZVJlZmVyZW5jZSkpCi0JCQkgICAgICB7Ci0JCQkgICAgICAgIGlmIChlUmVmZXJlbmNlLmlzTWFueSgpKQotCQkJICAgICAgICB7Ci0JCQkgICAgICAgICAgSW50ZXJuYWxFTGlzdCBzb3VyY2UgPSAoSW50ZXJuYWxFTGlzdCllT2JqZWN0LmVHZXQoZVJlZmVyZW5jZSk7Ci0JCQkgICAgICAgICAgSW50ZXJuYWxFTGlzdCB0YXJnZXQgPSAoSW50ZXJuYWxFTGlzdCljb3B5RU9iamVjdC5lR2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSk7Ci0JCQkgICAgICAgICAgaWYgKHNvdXJjZS5pc0VtcHR5KCkpCi0JCQkgICAgICAgICAgewotCQkJICAgICAgICAgICAgdGFyZ2V0LmNsZWFyKCk7Ci0JCQkgICAgICAgICAgfQotCQkJICAgICAgICAgIGVsc2UKLQkJCSAgICAgICAgICB7Ci0JCQkgICAgICAgICAgICBib29sZWFuIGlzQmlkaXJlY3Rpb25hbCA9IGVSZWZlcmVuY2UuZ2V0RU9wcG9zaXRlKCkgIT0gbnVsbDsKLQkJCSAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0JCQkgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGsgPSByZXNvbHZlUHJveGllcyA/IHNvdXJjZS5pdGVyYXRvcigpIDogc291cmNlLmJhc2ljSXRlcmF0b3IoKTsgay5oYXNOZXh0KCk7KQotCQkJICAgICAgICAgICAgewotCQkJICAgICAgICAgICAgICBPYmplY3QgcmVmZXJlbmNlZEVPYmplY3QgPSBrLm5leHQoKTsKLQkJCSAgICAgICAgICAgICAgT2JqZWN0IGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9IGdldChyZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkgICAgICAgICAgICAgIGlmIChjb3B5UmVmZXJlbmNlZEVPYmplY3QgPT0gbnVsbCkKLQkJCSAgICAgICAgICAgICAgewotCQkJICAgICAgICAgICAgICAgIGlmICghaXNCaWRpcmVjdGlvbmFsKQotCQkJICAgICAgICAgICAgICAgIHsKLQkJCSAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRVbmlxdWUoaW5kZXgsIHJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCSAgICAgICAgICAgICAgICAgICsraW5kZXg7Ci0JCQkgICAgICAgICAgICAgICAgfQotCQkJICAgICAgICAgICAgICB9Ci0JCQkgICAgICAgICAgICAgIGVsc2UKLQkJCSAgICAgICAgICAgICAgewotCQkJICAgICAgICAgICAgICAgIGlmIChpc0JpZGlyZWN0aW9uYWwpCi0JCQkgICAgICAgICAgICAgICAgewotCQkJICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gdGFyZ2V0LmluZGV4T2YoY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCSAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA9PSAtMSkKLQkJCSAgICAgICAgICAgICAgICAgIHsKLQkJCSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZFVuaXF1ZShpbmRleCwgY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCSAgICAgICAgICAgICAgICAgIH0KLQkJCSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGluZGV4ICE9IHBvc2l0aW9uKQotCQkJICAgICAgICAgICAgICAgICAgewotCQkJICAgICAgICAgICAgICAgICAgICB0YXJnZXQubW92ZShpbmRleCwgY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCSAgICAgICAgICAgICAgICAgIH0KLQkJCSAgICAgICAgICAgICAgICB9Ci0JCQkgICAgICAgICAgICAgICAgZWxzZQotCQkJICAgICAgICAgICAgICAgIHsKLQkJCSAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRVbmlxdWUoaW5kZXgsIGNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkgICAgICAgICAgICAgICAgfQotCQkJICAgICAgICAgICAgICAgICsraW5kZXg7Ci0JCQkgICAgICAgICAgICAgIH0KLQkJCSAgICAgICAgICAgIH0KLQkJCSAgICAgICAgICB9Ci0JCQkgICAgICAgIH0KLQkJCSAgICAgICAgZWxzZQotCQkJICAgICAgICB7Ci0JCQkgICAgICAgICAgT2JqZWN0IHJlZmVyZW5jZWRFT2JqZWN0ID0gZU9iamVjdC5lR2V0KGVSZWZlcmVuY2UsIHJlc29sdmVQcm94aWVzKTsKLQkJCSAgICAgICAgICBpZiAocmVmZXJlbmNlZEVPYmplY3QgPT0gbnVsbCkKLQkJCSAgICAgICAgICB7Ci0JCQkgICAgICAgICAgICBjb3B5RU9iamVjdC5lU2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSwgbnVsbCk7Ci0JCQkgICAgICAgICAgfQotCQkJICAgICAgICAgIGVsc2UKLQkJCSAgICAgICAgICB7Ci0JCQkgICAgICAgICAgICBPYmplY3QgY29weVJlZmVyZW5jZWRFT2JqZWN0ID0gZ2V0KHJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCSAgICAgICAgICAgIGlmIChjb3B5UmVmZXJlbmNlZEVPYmplY3QgPT0gbnVsbCkKLQkJCSAgICAgICAgICAgIHsKLQkJCSAgICAgICAgICAgICAgaWYgKGVSZWZlcmVuY2UuZ2V0RU9wcG9zaXRlKCkgPT0gbnVsbCkKLQkJCSAgICAgICAgICAgICAgewotCQkJICAgICAgICAgICAgCSAgLy8gTWFrZSBhIGNvcHkgb2YgQWN0aXZpdHkncyBlbGVtZW50cwotCQkJICAgICAgICAgICAgCWlmKHJlZmVyZW5jZWRFT2JqZWN0IGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KXsKLQkJCSAgICAgICAgICAgIAkJLy9jb3B5UmVmZXJlbmNlZEVPYmplY3QgPSBjb3B5KChFT2JqZWN0KXJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCSAgICAgICAgICAgIAkJLy9jb3B5RU9iamVjdC5lU2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSwgY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCSAgICAgICAgICAgIAkJY29weUVPYmplY3QuZVNldChnZXRUYXJnZXQoZVJlZmVyZW5jZSksIGNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkgICAgICAgICAgICAJfWVsc2V7Ci0JCQkgICAgICAgICAgICAJCWNvcHlFT2JqZWN0LmVTZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpLCByZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkgICAgICAgICAgICAJfQotCQkJICAgICAgICAgICAgCSAgCi0JCQkgICAgICAgICAgICAgIH0KLQkJCSAgICAgICAgICAgIH0KLQkJCSAgICAgICAgICAgIGVsc2UKLQkJCSAgICAgICAgICAgIHsKLQkJCSAgICAgICAgICAgICAgY29weUVPYmplY3QuZVNldChnZXRUYXJnZXQoZVJlZmVyZW5jZSksIGNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkgICAgICAgICAgICB9Ci0JCQkgICAgICAgICAgfQotCQkJICAgICAgICB9Ci0JCQkgICAgICB9Ci0JCQl9Ci0JCQotCQl9OwotCQlFT2JqZWN0IHVtbENvcHkgPSBjb3BpZXIuY29weShzb3VyY2VPYmplY3QuZ2V0RWxlbWVudCgpKTsKLQkJRGlhZ3JhbSByZXN1bHQgPSAoRGlhZ3JhbSljb3BpZXIuY29weShzb3VyY2VPYmplY3QpOwotCQlyZXN1bHQuc2V0RWxlbWVudCh1bWxDb3B5KTsKLQkJY29waWVyLmNvcHlSZWZlcmVuY2VzKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCQotCS8qKgotCSAqIENvcGllcyB0aGUgZGlhZ3JhbSBmcm9tIG9uZSByZXNvdXJjZXMgdG8gYW5vdGhlci4gVGhpcyBpcyB1c2VmdWwgaW4gY2FzZSBvZiAKLQkgKiBkZWVwIGNvcHkuIEZvciBjb3B5IG9mIGluZGl2aWR1YWwgZGlhZ3JhbSBsb29rIGF0IGNvcHlEaWFncmFtKERpYWdyYW0gc291cmNlRGlhZ3JhbSwgQWN0aXZpdHkgYWN0KQotCSAqIEBwYXJhbSBzb3VyY2VEaWFncmFtCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIERpYWdyYW0gY29weURpYWdyYW1SZXNvdXJjZShEaWFncmFtIHNvdXJjZURpYWdyYW0sIElGaWxlIGZpbGUpIHsKLQkJUmVzb3VyY2Ugc291cmNlUmVzID0gc291cmNlRGlhZ3JhbS5lUmVzb3VyY2UoKTsKLQkJRUxpc3QgY29udGVudHMgPSBzb3VyY2VSZXMuZ2V0Q29udGVudHMoKTsKLQkJCi0JCWludCBpbmRleE9mRGlhZ3JhbSA9IGNvbnRlbnRzLmluZGV4T2Yoc291cmNlRGlhZ3JhbSk7Ci0JCWZpbmFsIENvbGxlY3Rpb24gY29waWVkQ29udGVudHMgPSBFY29yZVV0aWwuY29weUFsbChjb250ZW50cyk7Ci0KLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKHNvdXJjZURpYWdyYW0pOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJZmluYWwgUmVzb3VyY2UgbmV3UmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkKLSAgICAgICAgICAgIC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlTmFtZSwgdHJ1ZSkpOwotICAgICAgICAgCi0gICAgICAgIE1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoVHJhbnNhY3Rpb24uT1BUSU9OX1VOUFJPVEVDVEVELCBCb29sZWFuLlRSVUUpOwotIAotICAgICAgICBBYnN0cmFjdEVNRk9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oCi0gICAgICAgICAgICBlZGl0aW5nRG9tYWluLCBTdHJpbmdTdGF0aWNzLkJMQU5LLAotICAgICAgICAgICAgb3B0aW9ucykgewotCi0gICAgICAgICAgICBwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotICAgICAgICAgICAgICAgICAgICBJQWRhcHRhYmxlIGluZm8pCi0gICAgICAgICAgICAgICAgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBuZXdSZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZEFsbChjb3BpZWRDb250ZW50cyk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG9wZXJhdGlvbi5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotIAkKLQkJcmV0dXJuIChEaWFncmFtKW5ld1Jlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KGluZGV4T2ZEaWFncmFtKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZGlhZ3JhbSBmb3IgZ2l2ZW4ge0BsaW5rIEFjdGl2aXR5fSBhbmQgZGlhZ3JhbUtpbmQuIAotCSAqIElmIEFjdGl2aXR5IGlzIGV4dGVuZGluZy9sb2NhbGx5Y29udHJpYnV0aW5nLCBnZXRzIGEgY29weSBvZiBiYXNlIGRpYWdyYW0uCi0JICogZWxzZSBjcmVhdGVzIGEgbmV3IGRpYWdyYW0gZm9yIGl0LgotCSAqIEBwYXJhbSBhY3QKLQkgKiBAcGFyYW0gZGlhZ3JhbUtpbmQKLQkgKiBAcGFyYW0gc2F2ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBjcmVhdGVEaWFncmFtKEFjdGl2aXR5IGFjdCwgU3RyaW5nIGRpYWdyYW1LaW5kLCBib29sZWFuIHNhdmUpewotCQkKLQkJaWYoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0KSl7Ci0JCQlEaWFncmFtIGJhc2VEaWFncmFtID0gZ2V0RGlhZ3JhbSgoQWN0aXZpdHkpYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQkJZGlhZ3JhbUtpbmQsIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWlmKGJhc2VEaWFncmFtICE9IG51bGwpewotCQkJCURpYWdyYW0gY29weSA9IGNvcHlEaWFncmFtKGJhc2VEaWFncmFtLCBhY3QpOwotCQkJCWlmKGNvcHkgIT0gbnVsbCl7Ci0JCQkJCXJldHVybiBjb3B5OwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJRGlhZ3JhbSBkaWFncmFtID0gRGlhZ3JhbVBlcnNpc3Rlci5jcmVhdGVEaWFncmFtKGNyZWF0ZUVkaXRpbmdEb21haW4oKSwKLQkJCQlkaWFncmFtS2luZCwgYWN0LCBmYWxzZSk7Ci0JCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCS8vcG9wdWxhdGVEaWFncmFtKGRpYWdyYW0sIGFjdCwgZGlhZ3JhbUtpbmQpOwotCQkJcmV0dXJuIGRpYWdyYW07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZURpYWdyYW0oRGlhZ3JhbSBkaWFncmFtLCBBY3Rpdml0eSBhY3QsIFN0cmluZyBkaWFncmFtS2luZCkgewotCQkvLyBjcmVhdGUgR3JhcGhOb2RlIGZvciBlYWNoIEJyZWFrZG93bkVsZW1lbnQgYW5kIGFkZCBpdCB0byB0aGUgZGlhZ3JhbQotCQkvLwotCQlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZihkaWFncmFtID09IG51bGwpIHJldHVybjsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdClpdGVyLm5leHQoKTsKLQkJCW5vZGVzLmFkZChjcmVhdGVOb2RlKGRpYWdyYW0sIChNZXRob2RFbGVtZW50KWVsZW1lbnQpKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBHcmFwaENvbm5lY3RvcnMgZm9yIGVhY2ggQnJlYWtkb3duRWxlbWVudAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWNyZWF0ZUNvbm5lY3RvcnMobm9kZSwgZGlhZ3JhbSwgZGlhZ3JhbUtpbmQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb25uZWN0b3JzKE5vZGUgbm9kZSwgRGlhZ3JhbSBkaWFncmFtLAotCQkJU3RyaW5nIGRpYWdyYW1LaW5kKXsKLQkJLy8gSW4gY2FzZSBvZiBBY3Rpdml0eSBkaWFncmFtCi0JCWlmIChkaWFncmFtS2luZC5lcXVhbHMoQURfa2luZCkpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChBY3Rpdml0eU5vZGUpbm9kZS5nZXRFbGVtZW50KCkpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JCQkJCU5vZGUgc3JjTm9kZSA9IGZpbmROb2RlKGRpYWdyYW0sIHdvcmtPcmRlcgotCQkJCQkJCS5nZXRQcmVkKCkpOwotCQkJCQlpZiAoc3JjTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQljcmVhdGVFZGdlKGRpYWdyYW0sIHNyY05vZGUsIG5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlKERpYWdyYW0gZGlhZ3JhbSwgT2JqZWN0IG1ldGhvZEVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVmlldyB2aWV3ID0gKFZpZXcpIGl0ZXIubmV4dCgpOwotCQkJaWYodmlldyBpbnN0YW5jZW9mIE5vZGUpewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChBY3Rpdml0eU5vZGUpdmlldy5nZXRFbGVtZW50KCkpOwotCQkJCWlmKG1ldGhvZEVsZW1lbnQuZXF1YWxzKGUpKXsKLQkJCQkJcmV0dXJuIChOb2RlKXZpZXc7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE5vZGUgZmluZE5vZGUoRGlhZ3JhbSBkaWFncmFtLCBOYW1lZEVsZW1lbnQgdW1sRWxlbWVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldykgaXRlci5uZXh0KCk7Ci0JCQlpZih2aWV3IGluc3RhbmNlb2YgTm9kZSl7Ci0JCQkJRU9iamVjdCBlID0gdmlldy5nZXRFbGVtZW50KCk7Ci0JCQkJaWYodW1sRWxlbWVudC5lcXVhbHMoZSkpewotCQkJCQlyZXR1cm4gKE5vZGUpdmlldzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRWRnZSBmaW5kRWRnZShEaWFncmFtIGRpYWdyYW0sIE5vZGUgc3JjTm9kZSwgTm9kZSB0YXJnZXROb2RlKSB7Ci0JCS8vIFRPRE8gOiBpbXBsZW1lbnQgdGhpcy4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFZGdlIGZpbmRFZGdlKERpYWdyYW0gZGlhZ3JhbSwgTWV0aG9kRWxlbWVudCBzcmMsCi0JCQlNZXRob2RFbGVtZW50IHRhcmdldCkgewotCi0JCS8vIFRPRE8gOiBpbXBsZW1lbnQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXB1YmxpYyBFZGdlIGNyZWF0ZUVkZ2UoRGlhZ3JhbSBkaWFncmFtLCBOb2RlIHNyY05vZGUsCi0JCQlOb2RlIHRhcmdldE5vZGUpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJRVJlZmVyZW5jZSBjb250YWlubWVudCA9IFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0VkZ2UoKTsKLQkJRU9iamVjdCBlZGdlID0gRU1GQ29yZVV0aWwuY3JlYXRlKGNvbnRhaW5lciwgY29udGFpbm1lbnQsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RWRnZSgpKTsKLQkJLy9UT0RPOiByZW1vdmUgQ3JlYXRpb24gbm9kZS4gQWRkaW5nIE1vZGVsIHdpbGwgY3JlYXRlIFZpZXcuCi0JCXJldHVybiBWaWV3U2VydmljZS5jcmVhdGVFZGdlKHNyY05vZGUsIHRhcmdldE5vZGUsIGVkZ2UsIFZpZXdUeXBlLkRJQUdSQU1fTElOSywgCi0JCQkJCQlESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCX0KLQkKLQlwdWJsaWMgTm9kZSBjcmVhdGVOb2RlKERpYWdyYW0gZGlhZ3JhbSwgTWV0aG9kRWxlbWVudCBlICl7Ci0JCUVPYmplY3QgZWxlbWVudCA9IGU7Ci0JCUVPYmplY3QgdW1sQ2xhc3MgPSBnZXRFbGVtZW50KGVsZW1lbnQpOwotCQlFT2JqZWN0IHVtbE9iamVjdCA9IFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZSgoRUNsYXNzKXVtbENsYXNzKTsKLQkJCi0JCS8vVE9ETzogcmVtb3ZlIENyZWF0aW9uIG5vZGUuIEFkZGluZyBNb2RlbCB3aWxsIGNyZWF0ZSBWaWV3LgotCQlOb2RlIG5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE9iamVjdCwgIiIsIAotCQkJCURJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvbigoRU1vZGVsRWxlbWVudClub2RlLmdldEVsZW1lbnQoKSxlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0RGlhZ3JhbVR5cGUoRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCVN0cmluZyB0eXBlU3RyID0gZGlhZ3JhbS5nZXRUeXBlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgRElBR1JBTV9LSU5EUy5sZW5ndGg7IGkrKykgewotCQkJaWYgKERJQUdSQU1fS0lORFNbaV0uZXF1YWxzKHR5cGVTdHIpKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0Q29tbWFuZExpc3RlbmVycygpewotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHJlZnJlc2hGcm9tQmFzZShEaWFncmFtIGRpYWdyYW0sIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQkKLQkJY2xhc3MgUmVmcmVzaEZyb21CYXNlT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RFTUZPcGVyYXRpb257Ci0JCQkKLQkJCXByaXZhdGUgRGlhZ3JhbSBkaWFncmFtOwotCi0JCQlwdWJsaWMgUmVmcmVzaEZyb21CYXNlT3BlcmF0aW9uKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCQkJc3VwZXIoZG9tYWluLCAiUmVmcmVzaCBmcm9tIGJhc2UiKTsKLQkJCQl0aGlzLmRpYWdyYW0gPSBkaWFncmFtOwotCQkJfQotCQkJCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCUVPYmplY3QgdW1sT2JqZWN0ID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQkJaWYodW1sT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQlBY3Rpdml0eSBhY3QgPSAgKEFjdGl2aXR5KUJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50RnJvbUFubm90YXRpb24oKEVNb2RlbEVsZW1lbnQpdW1sT2JqZWN0KTsKLQkJCQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSlhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQlpZihiYXNlID09IG51bGwgCi0JCQkJCQkJfHwgYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMICl7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWludCB0eXBlID0gRGlhZ3JhbVNlcnZpY2UuZUluc3RhbmNlKCkuZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbSk7Ci0JCQkJCURpYWdyYW0gYmFzZURpYWdyYW0gPSBEaWFncmFtU2VydmljZS5lSW5zdGFuY2UoKS5nZXREaWFncmFtKGJhc2UsIGRpYWdyYW0uZ2V0VHlwZSgpLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWlmKGJhc2VEaWFncmFtID09IG51bGwpIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJCi0JCQkJCUxpc3Qgb2xkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCURpYWdyYW0gYmFzZUNvcHkgPSBjb3B5RGlhZ3JhbShiYXNlRGlhZ3JhbSwgYmFzZSk7Ci0JCQkJCXN3aXRjaCh0eXBlKXsKLQkJCQkJY2FzZSBBQ1RJVklUWV9ESUFHUkFNOnsKLQkJCQkJCQotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYmFzZURpYWdyYW0uZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlOb2RlIGJhc2VOb2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQkJCXVtbE9iamVjdCA9IGJhc2VOb2RlLmdldEVsZW1lbnQoKTsKLQkJCQkJCQlpZih1bWxPYmplY3QgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHx8Ci0JCQkJCQkJCQl1bWxPYmplY3QgaW5zdGFuY2VvZiBPYmplY3ROb2RlKXsKLQkJCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbigoQWN0aXZpdHlOb2RlKXVtbE9iamVjdCk7Ci0JCQkJCQkJCU5vZGUgbm9kZSA9ICBmaW5kTm9kZShkaWFncmFtLCBlKTsKLQkJCQkJCQkJaWYobm9kZSAhPW51bGwpewotCQkJCQkJCQkJb2xkTm9kZXMuYWRkKG5vZGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCU5vZGUgbm9kZSA9IGZpbmROb2RlKGRpYWdyYW0sIHVtbE9iamVjdCk7Ci0JCQkJCQkJCWlmKG5vZGUgIT0gbnVsbCl7Ci0JCQkJCQkJCQlvbGROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlkaWFncmFtLmdldENoaWxkcmVuKCkucmVtb3ZlQWxsKG9sZE5vZGVzKTsKLQkJCQkJCQotCQkJCQkJLy9UT0RPOiBjaGVjayB3aHkgdGhpcyAKLS8vCQkJCQkJIHJlbW92ZSB1bnVzZWQgb2xkIFVJIG5vZGVzICYmIG5vZGVzIG9mIGNvbnRyaWJ1dG9yL3JlcGxhY2VyCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlFT2JqZWN0IGJyaWRnZSA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCQkJCQkJCWlmIChicmlkZ2UgaW5zdGFuY2VvZiBDb250cm9sTm9kZSl7Ci0JCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKGJyaWRnZSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gVW1hVW1sVXRpbC5nZXRVbWFFbGVtZW50KChOYW1lZEVsZW1lbnQpYnJpZGdlKTsKLQkJCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCQkJCQkJJiYgKChBY3Rpdml0eSkgZSkKLQkJCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0vLwkJCQkJCSByZXBsYWNlIGFzc29jaWF0ZWQgYmFzZSBlbGVtZW50IHdpdGggY29udHJpYnV0aW5nL3JlcGxhY2luZwotCQkJCQkJLy8gZWxlbWVudAotCQkJCQkJLy8KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2VFbGVtZW50ID0gKChBY3Rpdml0eSkgZWxlbWVudCkKLQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJCQlOb2RlIG5vZGUgPSBmaW5kTm9kZShiYXNlQ29weSwgYmFzZUVsZW1lbnQpOwotCQkJCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlFT2JqZWN0IHVtbE9iaiA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCQkJCQkJCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uKChFTW9kZWxFbGVtZW50KXVtbE9iaiwgKE1ldGhvZEVsZW1lbnQpZWxlbWVudCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBhZGQgbmV3IG5vZGVzCi0JCQkJCQkvLwotCQkJCQkJZGlhZ3JhbS5nZXRDaGlsZHJlbigpLmFkZEFsbChiYXNlQ29weS5nZXRDaGlsZHJlbigpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWRlZmF1bHQ6IHsKLQotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYmFzZURpYWdyYW0uZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTm9kZSBiYXNlTm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQl1bWxPYmplY3QgPSBiYXNlTm9kZS5nZXRFbGVtZW50KCk7Ci0JCQkJCQkJaWYgKHVtbE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJCQkJCQkvLyB0aGlzIGlzIGEgZWxlbWVudCdzIG5vZGUKLQkJCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEFjdGl2aXR5Tm9kZSl1bWxPYmplY3QpOwotCQkJCQkJCQlOb2RlIG5vZGUgPSBmaW5kTm9kZShkaWFncmFtLCBlKTsKLQkJCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJCQkJb2xkTm9kZXMuYWRkKG5vZGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvLyByZW1vdmUgb2xkIG5vZGVzCi0JCQkJCQkvLwotCQkJCQkJZGlhZ3JhbS5nZXRDaGlsZHJlbigpLnJlbW92ZUFsbChvbGROb2Rlcyk7Ci0KLQkJCQkJCS8vIGFkZCBuZXcgbm9kZXMKLQkJCQkJCS8vCi0JCQkJCQlkaWFncmFtLmdldENoaWxkcmVuKCkuYWRkQWxsKGJhc2VDb3B5LmdldENoaWxkcmVuKCkpOwotCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQlSZWZyZXNoRnJvbUJhc2VPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFJlZnJlc2hGcm9tQmFzZU9wZXJhdGlvbihkb21haW4sIGRpYWdyYW0pOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBvcGVyYXRpb24uZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCWlmKHN0YXR1cy5pc09LKCkpIHJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyA6IHVzZSBMb2cKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3I6IFJlZnJlc2ggZnJvbSBiYXNlIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgZWxlbWVudHM7Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm5zICd0eXBlJyBvZiB0aGUgZWNvcmUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgaGludC4KLQkgKiAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVOYW1lZEVsZW1lbnQgZ2V0RWxlbWVudChFT2JqZWN0IG9iamVjdCkgewotCQlFQ2xhc3MgZUNsYXNzID0gb2JqZWN0LmVDbGFzcygpOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJZWxlbWVudHMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwKCk7Ci0JCQllbGVtZW50cy5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSAsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpOwotCQkJZWxlbWVudHMucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdGlvbigpLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpOwotCQl9Ci0JCXJldHVybiAoRU5hbWVkRWxlbWVudCkgZWxlbWVudHMuZ2V0KGVDbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGVyc2lzdGVuY2UvSURpYWdyYW1TZXJ2aWNlLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9JRGlhZ3JhbVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3NGVkYy4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9JRGlhZ3JhbVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBlcnNpc3RlbmNlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbVNlcnZpY2UgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0RJQUdSQU0gPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSA9IDI7Ci0JCi0JcHVibGljIHZvaWQgZGlzcGF0Y2goSVNhdmVJbmZvIGluZm8pOwotCQotCXB1YmxpYyBTYXZlSW5mbyBnZXRTYXZlSW5mbyhPYmplY3Qgb2JqLCBsb25nIHRpbWVTdGFtcCk7Ci0JCi0JcHVibGljIERpYWdyYW1TZXJ2aWNlIGVJbnN0YW5jZSA9IERpYWdyYW1TZXJ2aWNlLmVJbnN0YW5jZSgpOwotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGVyc2lzdGVuY2UvSVNhdmVFdmVudERpc3BhdGNoZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL0lTYXZlRXZlbnREaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZDYxM2IuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGVyc2lzdGVuY2UvSVNhdmVFdmVudERpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBlcnNpc3RlbmNlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2F2ZUV2ZW50RGlzcGF0Y2hlciB7Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVUaW1lU3RhbXAoSVNhdmVJbmZvIGluZm8pOwotCQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGVyc2lzdGVuY2UvSVNhdmVJbmZvLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9JU2F2ZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwMjBmMi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9JU2F2ZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBlcnNpc3RlbmNlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2F2ZUluZm8gewotCQotCXB1YmxpYyBPYmplY3QgZ2V0U291cmNlKCk7Ci0JCi0JcHVibGljIGxvbmcgZ2V0VGltZVN0YW1wKCk7Ci0JCi0JcHVibGljIHZvaWQgc2V0VGltZVN0YW1wKGxvbmcgdGltZVN0YW1wKTsKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL1NhdmVFdmVudERpc3BhdGNoZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL1NhdmVFdmVudERpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlNmQyZi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9TYXZlRXZlbnREaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlRXZlbnREaXNwYXRjaGVyIGltcGxlbWVudHMgSVNhdmVFdmVudERpc3BhdGNoZXIgewotCi0JcHJpdmF0ZSBJU2F2ZUluZm8gaW5mbzsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTYXZlRXZlbnREaXNwYXRjaGVyKCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBlcnNpc3RlbmNlLklTYXZlRXZlbnREaXNwYXRjaGVyI3VwZGF0ZVRpbWVTdGFtcChqYXZhLmxhbmcuT2JqZWN0LCBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRpbWVTdGFtcChJU2F2ZUluZm8gaW5mbykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXRoaXMuaW5mbyA9IGluZm87Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcGF0Y2goKXsKLQkJRGlhZ3JhbVNlcnZpY2UuZUluc3RhbmNlLmRpc3BhdGNoKGluZm8pOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL1NhdmVJbmZvLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9TYXZlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjVhYWZmLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL1NhdmVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlSW5mbyBpbXBsZW1lbnRzIElTYXZlSW5mbyB7Ci0KLQkKLQlwcml2YXRlIE9iamVjdCBzb3VyY2U7Ci0JcHJpdmF0ZSBsb25nIHRpbWVTdGFtcDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTYXZlSW5mbyhPYmplY3Qgc291cmNlLCBsb25nIHRpbWVTdGFtcCkgewotCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJdGhpcy50aW1lU3RhbXAgPSB0aW1lU3RhbXA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuSVNhdmVJbmZvI2dldFNvdXJjZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTb3VyY2UoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wZXJzaXN0ZW5jZS5JU2F2ZUluZm8jZ2V0VGltZVN0YW1wKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRUaW1lU3RhbXAoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIHRpbWVTdGFtcDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wZXJzaXN0ZW5jZS5JU2F2ZUluZm8jc2V0VGltZVN0YW1wKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lU3RhbXAobG9uZyB0aW1lU3RhbXApIHsKLQkJdGhpcy50aW1lU3RhbXAgPSB0aW1lU3RhbXA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wb2xpY2llcy9BY3Rpdml0eU5vZGVSZXNpemFibGVFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wb2xpY2llcy9BY3Rpdml0eU5vZGVSZXNpemFibGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YWNhYWUuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcG9saWNpZXMvQWN0aXZpdHlOb2RlUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZVNoYXBlRWRpdFBvbGljeTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eU5vZGVSZXNpemFibGVFZGl0UG9saWN5IGV4dGVuZHMgUmVzaXphYmxlU2hhcGVFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eU5vZGVSZXNpemFibGVFZGl0UG9saWN5KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDb21tYW5kKENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBzdXBlci5nZXRNb3ZlQ29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlSGFuZGxlRHJhZ0VkaXRQYXJ0c1RyYWNrZXIoSGFuZGxlIGhhbmRsZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnJlcGxhY2VIYW5kbGVEcmFnRWRpdFBhcnRzVHJhY2tlcihoYW5kbGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uQ3JlYXRpb25FZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkNyZWF0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmNiZmNhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uQ3JlYXRpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIENyZWF0aW9uRWRpdFBvbGljeSBmb3IgQWN0aXZpdHlQYXJ0aXRpb24KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uQ3JlYXRpb25FZGl0UG9saWN5IGV4dGVuZHMgQ3JlYXRpb25FZGl0UG9saWN5IHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeSNnZXRDcmVhdGVDb21tYW5kKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNjID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sIERpYWdyYW1VSU1lc3NhZ2VzLkFkZENvbW1hbmRfTGFiZWwpOwotCi0JCUl0ZXJhdG9yIGRlc2NyaXB0b3JzID0gcmVxdWVzdC5nZXRWaWV3RGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChkZXNjcmlwdG9ycy5oYXNOZXh0KCkpIHsKLQkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IpIGRlc2NyaXB0b3JzCi0JCQkJCS5uZXh0KCk7Ci0JCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0vLwkJCXdoaWxlKGNvbnRhaW5lclZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pewotLy8JCQkJY29udGFpbmVyVmlldyA9IChWaWV3KWNvbnRhaW5lclZpZXcuZUNvbnRhaW5lcigpOwotLy8JCQl9Ci0JCQlDcmVhdGVDb21tYW5kIGNyZWF0ZUNvbW1hbmQgPSBuZXcgQ3JlYXRlQ29tbWFuZChlZGl0aW5nRG9tYWluLAotCQkJCQlkZXNjcmlwdG9yLCBjb250YWluZXJWaWV3KTsKLQotCQkJY2MuY29tcG9zZShjcmVhdGVDb21tYW5kKTsKLQkJfQotCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShjYy5yZWR1Y2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25EZWxlZ2F0aW9uRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25EZWxlZ2F0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGZmMDMzLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uRGVsZWdhdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci0KLS8qKgotICogQWN0aXZpdHlQYXJ0aXRpb24gZGVsZWdhdGVzIHRvIGl0cyBjb21wYXJ0bWVudCBlZGl0IHBvbGljeQotICogICAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRGVsZWdhdGlvbkVkaXRQb2xpY3kgZXh0ZW5kcwotICAgICAgICBBYnN0cmFjdEVkaXRQb2xpY3kgewotCi0gICAgcHJpdmF0ZSBFZGl0UGFydCBjaGlsZEVkaXRQYXJ0OwotICAgIHByaXZhdGUgRWRpdFBvbGljeSBjaGlsZEVkaXRQb2xpY3k7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2hpbGRWaWV3SUQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWRpdFBvbGljeUlEOwotICAgIAotICAgIAotICAgIHB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkRlbGVnYXRpb25FZGl0UG9saWN5KFN0cmluZyBjaGlsZElkLCBTdHJpbmcgZWRpdFBvbGljeUlkKSB7Ci0gICAgICAgIGNoaWxkVmlld0lEID0gY2hpbGRJZDsKLSAgICAgICAgZWRpdFBvbGljeUlEID0gZWRpdFBvbGljeUlkOwotICAgIH0KLSAgICAKLQotICAgLyoqCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQWJzdHJhY3RFZGl0UG9saWN5I2FjdGl2YXRlKCkKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotICAgICAgICBjaGlsZEVkaXRQYXJ0ID0KLSAgICAgICAgICAgICgoSUdyYXBoaWNhbEVkaXRQYXJ0KWdldEhvc3QoKSkuZ2V0Q2hpbGRCeVNlbWFudGljSGludChjaGlsZFZpZXdJRCk7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQYXJ0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjaGlsZEVkaXRQb2xpY3kgPSBjaGlsZEVkaXRQYXJ0LmdldEVkaXRQb2xpY3koZWRpdFBvbGljeUlEKTsKLSAgICAgICAgY2hpbGRFZGl0UG9saWN5LnNldEhvc3QoY2hpbGRFZGl0UGFydCk7Ci0gICAgICAgIGNoaWxkRWRpdFBvbGljeS5hY3RpdmF0ZSgpOwotICAgIH0KLQotICAvKioKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQWJzdHJhY3RFZGl0UG9saWN5I2RlYWN0aXZhdGUoKQotICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotICAgICAgICBpZiAoY2hpbGRFZGl0UG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjaGlsZEVkaXRQb2xpY3kuZGVhY3RpdmF0ZSgpOwotICAgICAgICBjaGlsZEVkaXRQYXJ0ID0gbnVsbDsKLSAgICAgICAgY2hpbGRFZGl0UG9saWN5ID0gbnVsbDsKLSAgICB9Ci0KLQotICAgLyoqCi0gICAgKiAKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVyYXNlU291cmNlRmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNoaWxkRWRpdFBvbGljeS5lcmFzZVNvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSNlcmFzZVRhcmdldEZlZWRiYWNrKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotICAgICAqIEBtb2RpZmllZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVyYXNlVGFyZ2V0RmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNoaWxkRWRpdFBvbGljeS5lcmFzZVRhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSNnZXRDb21tYW5kKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotICAgICAqIEBtb2RpZmllZAotICAgICAqLwotICAgIHB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkRWRpdFBvbGljeS5nZXRDb21tYW5kKHJlcXVlc3QpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSNnZXRUYXJnZXRFZGl0UGFydChvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdCkKLSAgICAgKiBAbW9kaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRWRpdFBhcnQgZ2V0VGFyZ2V0RWRpdFBhcnQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkRWRpdFBvbGljeS5nZXRUYXJnZXRFZGl0UGFydChyZXF1ZXN0KTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjc2hvd1NvdXJjZUZlZWRiYWNrKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotICAgICAqIEBtb2RpZmllZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRFZGl0UG9saWN5LnNob3dTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjc2hvd1RhcmdldEZlZWRiYWNrKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotICAgICAqIEBtb2RpZmllZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dUYXJnZXRGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRFZGl0UG9saWN5LnNob3dUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjdW5kZXJzdGFuZHNSZXF1ZXN0KG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotICAgICAqIEBtb2RpZmllZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcSkgewotICAgICAgICBpZiAoY2hpbGRFZGl0UGFydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhY3RpdmF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZEVkaXRQb2xpY3kudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcSk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uTGF5b3V0RWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25MYXlvdXRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYTdiYWIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25MYXlvdXRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVTaGFwZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuWFlMYXlvdXRFZGl0UG9saWN5OwotCi0vKioKLSAqIFhZTGF5b3V0UG9saWN5IGZvciBBY3Rpdml0eVBhcnRpdGlvbiB0byBoYW5kbGUgdGhlIG1vdmUgb2YgY2hpbGRyZW4uCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEB3cml0dGVuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkxheW91dEVkaXRQb2xpY3kgZXh0ZW5kcyBYWUxheW91dEVkaXRQb2xpY3kgewotCi0JcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCUVkaXRQb2xpY3kgcmVzdWx0ID0gc3VwZXIuY3JlYXRlQ2hpbGRFZGl0UG9saWN5KGNoaWxkKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFJlc2l6YWJsZVNoYXBlRWRpdFBvbGljeSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKHJlcXVlc3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BvbGljaWVzL0FjdGl2aXR5WFlMYXlvdXRFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wb2xpY2llcy9BY3Rpdml0eVhZTGF5b3V0RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWMzNDg3Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BvbGljaWVzL0FjdGl2aXR5WFlMYXlvdXRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS51dGlsLkFERGlhZ3JhbVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRCb3VuZHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuWFlMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVhZTGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIFhZTGF5b3V0RWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlYWUxheW91dEVkaXRQb2xpY3koKSB7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0UGFydCBjaGlsZCwgT2JqZWN0IGNvbnN0cmFpbnQpIHsKLQkJT2JqZWN0IHBhcmVudCAgPSBjaGlsZC5nZXRQYXJlbnQoKTsKLQkJaWYgKChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSAmJgotCQkJKCBjaGlsZCBpbnN0YW5jZW9mIFNoYXBlRWRpdFBhcnQgJiYgY29uc3RyYWludCBpbnN0YW5jZW9mIFJlY3RhbmdsZSkpIHsKLQkJCQkKLQkJCVJlY3RhbmdsZSByZWN0ID0gKFJlY3RhbmdsZSkgY29uc3RyYWludDsKLQkJCWludCB4ID0gcmVjdC54IC0gKChBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSBwYXJlbnQpLmdldExvY2F0aW9uKCkueDsKLQkJCWludCB5ID0gcmVjdC55IC0gKChBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSBwYXJlbnQpLmdldExvY2F0aW9uKCkueTsKLQkJCQotCSAJCUlDb21tYW5kIGJvdW5kc0NvbW1hbmQgPSAKLQkgCQkJbmV3IFNldEJvdW5kc0NvbW1hbmQoKChTaGFwZUVkaXRQYXJ0KSBjaGlsZCkuZ2V0RWRpdGluZ0RvbWFpbigpLAotCSAJCQkJRGlhZ3JhbVVJTWVzc2FnZXMuU2V0TG9jYXRpb25Db21tYW5kX0xhYmVsX1Jlc2l6ZSwKLQkgCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigoVmlldykgY2hpbGQuZ2V0TW9kZWwoKSksCi0JCQkJCW5ldyBQb2ludCh4LCB5KSk7IAotCSAJCQotCQkJcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KGJvdW5kc0NvbW1hbmQpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChjaGlsZCwgY29uc3RyYWludCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE1vdmVDaGlsZHJlbkNvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDaGFuZ2VDb25zdHJhaW50Q29tbWFuZChFZGl0UGFydCBjaGlsZCwKLQkJCU9iamVjdCBjb25zdHJhaW50KSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVDaGFuZ2VDb25zdHJhaW50Q29tbWFuZChjaGlsZCwgY29uc3RyYWludCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDaGFuZ2VDb25zdHJhaW50Q29tbWFuZCgKLQkJCUNoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCwgRWRpdFBhcnQgY2hpbGQsIE9iamVjdCBjb25zdHJhaW50KSB7Ci0JCUNvbW1hbmQgY21kID0gc3VwZXIuY3JlYXRlQ2hhbmdlQ29uc3RyYWludENvbW1hbmQocmVxdWVzdCwgY2hpbGQsCi0JCQkJY29uc3RyYWludCk7Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpIHsKLQkJCUxpc3QgbGlzdCA9IEFERGlhZ3JhbVV0aWwKLQkJCQkJLmdldE5vZGVzSW5QYXJ0aXRpb24oKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpIGNoaWxkKTsKLQkJCWlmIChsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRWRpdFBhcnQgZWxlbWVudCA9IChFZGl0UGFydCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCUNoYW5nZUJvdW5kc1JlcXVlc3QgcmVxID0gbmV3IENoYW5nZUJvdW5kc1JlcXVlc3QoCi0JCQkJCQkJCVJFUV9SRVNJWkVfQ0hJTERSRU4pOwotCQkJCQkJcmVxLnNldEVkaXRQYXJ0cyhlbGVtZW50KTsKLQkJCQkJCXJlcS5zZXRNb3ZlRGVsdGEocmVxdWVzdC5nZXRNb3ZlRGVsdGEoKSk7Ci0JCQkJCQlyZXEuc2V0U2l6ZURlbHRhKHJlcXVlc3QuZ2V0U2l6ZURlbHRhKCkpOwotCQkJCQkJcmVxLnNldExvY2F0aW9uKHJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQlyZXEuc2V0RXh0ZW5kZWREYXRhKHJlcXVlc3QuZ2V0RXh0ZW5kZWREYXRhKCkpOwotCQkJCQkJcmVxLnNldFJlc2l6ZURpcmVjdGlvbihyZXF1ZXN0LmdldFJlc2l6ZURpcmVjdGlvbigpKTsKLQkJCQkJCWNtZCA9IGNtZC5jaGFpbihlbGVtZW50LmdldFBhcmVudCgpLmdldENvbW1hbmQocmVxKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BvbGljaWVzL09wZW5BRERFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wb2xpY2llcy9PcGVuQURERWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODAxZGFhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BvbGljaWVzL09wZW5BRERFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLk5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRVBGRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5PcGVuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1FZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBNb3VzZSBkb3VibGUgY2xpY2sgb24gU3RydWN0dXJlZEFjdGl2aXR5RWRpdFBhcnQgc2hvdWxkIG9wZW4gZGlhZ3JhbS4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuQURERWRpdFBvbGljeSBleHRlbmRzIE9wZW5FZGl0UG9saWN5IHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLk9wZW5FZGl0UG9saWN5I2dldE9wZW5Db21tYW5kKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21tYW5kIGdldE9wZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IGdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBJR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCU5vZGUgdmlldyA9IChOb2RlKSB0YXJnZXRFZGl0UGFydC5nZXRNb2RlbCgpOwotCi0JCQlEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gKERpYWdyYW1FZGl0UGFydCkgdGFyZ2V0RWRpdFBhcnQKLQkJCQkJLmdldFBhcmVudCgpOwotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGRpYWdyYW1FZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJRGlhZ3JhbUFkYXB0ZXIgZGlhZ3JhbUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJLmdldERpYWdyYW1BZGFwdGVyKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQotCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlcgotCQkJCQkuZ2V0Tm9kZUFkYXB0ZXIodmlldy5nZXRFbGVtZW50KCkpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gYWRhcHRlci5nZXRXcmFwcGVyKCk7Ci0JCQkJaWYgKHNlbGVjdGVkT2JqZWN0ID09IG51bGwpIHsKLQkJCQkJc2VsZWN0ZWRPYmplY3QgPSBhZGFwdGVyLmdldEVsZW1lbnQoKTsKLQkJCQl9Ci0JCQkJR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChHcmFwaGljYWxWaWV3ZXIpIGRpYWdyYW1FZGl0UGFydAotCQkJCQkJLmdldFZpZXdlcigpOwotCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQlEaWFncmFtRWRpdERvbWFpbiBkb21haW4gPSAoRGlhZ3JhbUVkaXREb21haW4pIHZpZXdlcgotCQkJCQkJCS5nZXRFZGl0RG9tYWluKCk7Ci0JCQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBkb21haW4uZ2V0RGlhZ3JhbUVkaXRvclBhcnQoKTsKLQkJCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQoCi0JCQkJCQkJCXNlbGVjdGVkT2JqZWN0LAotCQkJCQkJCQlkaWFncmFtQWRhcHRlci5nZXRTdXBwcmVzc2lvbigpLAotCQkJCQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSk7Ci0JCQkJCQl0cnl7Ci0JCQkJCQlEaWFncmFtRWRpdG9yVXRpbAotCQkJCQkJCQkub3BlbkRpYWdyYW1FZGl0b3IoCi0JCQkJCQkJCQkJcGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpLAotCQkJCQkJCQkJCWlucHV0LAotCQkJCQkJCQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5ULAotCQkJCQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3Byb3ZpZGVycy9EaWFncmFtRWRpdG9yRG9jdW1lbnRQcm92aWRlci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcHJvdmlkZXJzL0RpYWdyYW1FZGl0b3JEb2N1bWVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOWM1YzAuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcHJvdmlkZXJzL0RpYWdyYW1FZGl0b3JEb2N1bWVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5tYW5pcHVsYXRpb24uQ29udGFpbmVyQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UuQWJzdHJhY3RFTUZPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5JRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLkRpYWdyYW1taW5nUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBlcnNpc3RlbmNlLkRpYWdyYW1QZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuSVNhdmVFdmVudERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuSVNhdmVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBlcnNpc3RlbmNlLlNhdmVFdmVudERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuU2F2ZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UudXRpbC5VbWFVbWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnJlc291cmNlcy5HTUZSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuTmFtZWRFbGVtZW50OwotCi0vKioKLSAqIFNwZWNpYWxpemVkIGRvY3VtZW50IHByb3ZpZGVyIGZvciBoYW5kbGUgY2hhbmdlcyBhbmQgbWFuaXB1bGF0ZSBkb2N1bWVudCBhc3NvY2lhdGVkIAotICogYW5kIHN5bmNocm9uaXplIHRoZSBvdGhlciBvcGVuZWQgZWRpdG9yJ3MgZG9jdW1lbnQgYW5kIGRvIG1lcmdlIGFueSBjb25mbGljdCBzeW5jaHJvbml6ZS4KLSAqIEFsc28gaGFuZGxlcyB0aGUgdGltZXN0YW1wIHN5bmNocm9uaXphdGlvbiBpZiB0aGUgbXVsdGlwbGUgZWRpdG9ycyBhcmUgc2hhcmluZyBzYW1lIHJlc291cmNlLgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdG9yRG9jdW1lbnRQcm92aWRlciBleHRlbmRzIEZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVkaXRvckRvY3VtZW50UHJvdmlkZXIoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyI3NldERvY3VtZW50Q29udGVudChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50LCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICogCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0RG9jdW1lbnRDb250ZW50KElEb2N1bWVudCBkb2N1bWVudCwKLQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIHsKLQkJCURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBkaWFncmFtRWxlbWVudCA9IChEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIGVkaXRvcklucHV0OwotCi0JCQkoKElEaWFncmFtRG9jdW1lbnQpIGRvY3VtZW50KS5zZXRFZGl0aW5nRG9tYWluKGRpYWdyYW1FbGVtZW50Ci0JCQkJCS5nZXRFZGl0aW5nRG9tYWluKCkpOwotCQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCUlTdG9yYWdlIHN0b3JhZ2UgPSAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KQotCQkJCQkJLmdldFN0b3JhZ2UoKTsKLQkJCQlzZXREb2N1bWVudENvbnRlbnRGcm9tU3RvcmFnZShkb2N1bWVudCwgc3RvcmFnZSwgZWRpdG9ySW5wdXQpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cERvY3VtZW50KE9iamVjdCBlbGVtZW50LCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0dXBEb2N1bWVudChlbGVtZW50LCBkb2N1bWVudCk7Ci0JfQotCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBjdXN0b20KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudENvbnRlbnRGcm9tU3RvcmFnZShJRG9jdW1lbnQgZG9jdW1lbnQsCi0JCQlJU3RvcmFnZSBzdG9yYWdlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGRvY3VtZW50LmdldENvbnRlbnQoKTsKLQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBkaWFncmFtLmVSZXNvdXJjZSgpOwotCQkJSUZpbGUgcmVzb3VyY2VGaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUocmVzb3VyY2UpOwotCQkJLy8gdW5sb2FkIGlmIHRoZSByZXNvdXJjZUZpbGUgYW5kIHN0b3JhZ2UgaXMgc2FtZS4KLQkJCS8vIGlmIG5vdCBzYW1lIHRocm93IGV4Y2VwdGlvbi4KLQkJCWlmIChyZXNvdXJjZUZpbGUgIT0gbnVsbCkgewotCQkJCWlmIChyZXNvdXJjZUZpbGUuZXF1YWxzKHN0b3JhZ2UpKSB7Ci0JCQkJCWRvY3VtZW50LnNldENvbnRlbnQobnVsbCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQkiMSIsCi0JCQkJCQkJCQkxLAotCQkJCQkJCQkJRGlhZ3JhbW1pbmdSZXNvdXJjZXMuRmlsZURvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkLAotCQkJCQkJCQkJbnVsbCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlJRGlhZ3JhbURvY3VtZW50IGRpYWdyYW1Eb2N1bWVudCA9IChJRGlhZ3JhbURvY3VtZW50KSBkb2N1bWVudDsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gZGlhZ3JhbURvY3VtZW50LmdldEVkaXRpbmdEb21haW4oKTsKLQotCQlkaWFncmFtID0gRGlhZ3JhbVBlcnNpc3Rlci5sb2FkKGRvbWFpbiwgc3RvcmFnZSwgdHJ1ZSwKLQkJCQlnZXRQcm9ncmVzc01vbml0b3IoKSwgZWRpdG9ySW5wdXQpOwotCQlkb2N1bWVudC5zZXRDb250ZW50KGRpYWdyYW0pOwotCQkvL3N1cGVyLnNldERvY3VtZW50Q29udGVudEZyb21TdG9yYWdlKGRvY3VtZW50LCBzdG9yYWdlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyI2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZChvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0KQotCSAqIEBjdXN0b20KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQoSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQpIHsKLQotCQlGaWxlSW5mbyBpbmZvPSAoRmlsZUluZm8pIGdldEVsZW1lbnRJbmZvKGZpbGVFZGl0b3JJbnB1dCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSURvY3VtZW50IGRvY3VtZW50PSBjcmVhdGVFbXB0eURvY3VtZW50KCk7Ci0JCUlTdGF0dXMgc3RhdHVzPSBudWxsOwotCi0JCXRyeSB7Ci0KLQkJCXRyeSB7Ci0JCQkJcmVmcmVzaEZpbGUoZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCQloYW5kbGVDb3JlRXhjZXB0aW9uKHgsICJGaWxlIENoYW5nZWQgb3V0c2lkZSIpOwotCQkJfQotCi0JCQlzZXREb2N1bWVudENvbnRlbnQoZG9jdW1lbnQsIGZpbGVFZGl0b3JJbnB1dCk7Ci0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQlzdGF0dXM9IHguZ2V0U3RhdHVzKCk7Ci0JCX0KLQotCQlPYmplY3QgbmV3Q29udGVudD0gZG9jdW1lbnQuZ2V0Q29udGVudCgpOwotCi0JCWlmICggIW5ld0NvbnRlbnQuZXF1YWxzKGluZm8uZkRvY3VtZW50LmdldENvbnRlbnQoKSkpIHsKLQotCQkJLy8gc2V0IHRoZSBuZXcgY29udGVudCBhbmQgZmlyZSBjb250ZW50IHJlbGF0ZWQgZXZlbnRzCi0JCQlmaXJlRWxlbWVudENvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChmaWxlRWRpdG9ySW5wdXQpOwotCi0JCQlyZW1vdmVVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGZpbGVFZGl0b3JJbnB1dCwgaW5mbyk7Ci0KLQkJCWluZm8uZkRvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIoaW5mbyk7Ci0JCQlpbmZvLmZEb2N1bWVudC5zZXRDb250ZW50KG5ld0NvbnRlbnQpOwotCQkJaW5mby5mQ2FuQmVTYXZlZD0gZmFsc2U7Ci0JCQlpbmZvLmZNb2RpZmljYXRpb25TdGFtcD0gY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCkpOwotCQkJaW5mby5mU3RhdHVzPSBzdGF0dXM7Ci0KLQkJCWFkZFVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoZmlsZUVkaXRvcklucHV0LCBpbmZvKTsKLQotCQkJZmlyZUVsZW1lbnRDb250ZW50UmVwbGFjZWQoZmlsZUVkaXRvcklucHV0KTsKLQotCQl9IAotCX0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbGVtZW50TW92ZWQoSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQsIElQYXRoIHBhdGgpIHsKLQkJc3VwZXIuaGFuZGxlRWxlbWVudE1vdmVkKGZpbGVFZGl0b3JJbnB1dCwgcGF0aCk7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5GaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIjY3JlYXRlSW5wdXRXaXRoRWRpdGluZ0RvbWFpbihvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQsIG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikKLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIElFZGl0b3JJbnB1dCBjcmVhdGVJbnB1dFdpdGhFZGl0aW5nRG9tYWluKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCwgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluKSB7Ci0JCWlmKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSl7Ci0JCQkoKElEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpZWRpdG9ySW5wdXQpLnNldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKGRvbWFpbik7Ci0JCQlyZXR1cm4gZWRpdG9ySW5wdXQ7Ci0JCX1lbHNlewotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUlucHV0V2l0aEVkaXRpbmdEb21haW4oZWRpdG9ySW5wdXQsIGRvbWFpbik7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0JICogQGN1c3RvbQotCSAqLwotCXB1YmxpYyBjbGFzcyBEaWFncmFtRmlsZUluZm9TeW5jIGV4dGVuZHMgRGlhZ3JhbUZpbGVJbmZvewotCi0JCUlTYXZlRXZlbnREaXNwYXRjaGVyIGRpc3BhdGNoZXI7Ci0JCUlGaWxlRWRpdG9ySW5wdXQgaW5wdXQ7Ci0JCXB1YmxpYyBib29sZWFuIHJlZnJlc2hlZEJ5U2hhcmVkID0gZmFsc2U7Ci0JCXB1YmxpYyBEaWFncmFtRmlsZUluZm9TeW5jKElEb2N1bWVudCBkb2N1bWVudCwgRmlsZVN5bmNocm9uaXplciBmaWxlU3luY2hyb25pemVyLCBEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIsCi0JCQkJSUZpbGVFZGl0b3JJbnB1dCBpbnB1dCkgewotCQkJc3VwZXIoZG9jdW1lbnQsIGZpbGVTeW5jaHJvbml6ZXIsIGxpc3RlbmVyKTsKLQkJCWZpbmFsIElEb2N1bWVudCBpblVzZURvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCQlmaW5hbCBEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkgaW5wdXRQcm94eSA9KERpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSlpbnB1dDsKLQkJCWlmKGRpc3BhdGNoZXIgPT0gbnVsbCl7Ci0JCQkJZGlzcGF0Y2hlciA9IG5ldyBTYXZlRXZlbnREaXNwYXRjaGVyKCl7Ci0JCQkJCXB1YmxpYyB2b2lkIHVwZGF0ZVRpbWVTdGFtcChJU2F2ZUluZm8gaW5mbykgewotCQkJCQkJZk1vZGlmaWNhdGlvblN0YW1wID0gaW5mby5nZXRUaW1lU3RhbXAoKTsKLS8vCQkJCQkJT2JqZWN0IG9iamVjdCA9IGluZm8uZ2V0U291cmNlKCk7Ci0vLwkJCQkJCQotLy8JCQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50SW5mbyl7Ci0vLwkJCQkJCQkKLS8vCQkJCQkJCWlmKGluVXNlRG9jdW1lbnQuZXF1YWxzKCgoRWxlbWVudEluZm8pb2JqZWN0KS5mRG9jdW1lbnQpKXsKLS8vCQkJCQkJCQlyZXR1cm47Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQkJTWVyZ2VPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IE1lcmdlT3BlcmF0aW9uKGlucHV0UHJveHkuZ2V0RWRpdGluZ0RvbWFpbigpLAotLy8JCQkJCQkJCSJEb2N1bWVudCBNZXJnZSBPcGVyYXRpb24iLCAoRWxlbWVudEluZm8pb2JqZWN0LCBpblVzZURvY3VtZW50KTsKLS8vCQkJCQkJdHJ5ewotLy8JCQkJCQkJb3BlcmF0aW9uLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCApOwotLy8JCQkJCQl9Y2F0Y2goRXhlY3V0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbil7Ci0vLwkJCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJaWYoZGlzcGF0Y2hlciAhPSBudWxsKXsKLQkJCQkJRGlhZ3JhbVNlcnZpY2UuZUluc3RhbmNlKCkuYWRkRGlzcGF0Y2hlcnMoZGlzcGF0Y2hlcik7Ci0JCQkJfQotCQkJfQotCQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCQkJCi0JCX0KLQkJcHVibGljIHZvaWQgdXBkYXRlVGltZVN0YW1wKCl7Ci0JCQlsb25nIHRpbWVzdGFtcCA9IGdldE1vZGlmaWNhdGlvblN0YW1wKGlucHV0KTsKLQkJCVNhdmVJbmZvIGluZm8gPSBEaWFncmFtU2VydmljZS5lSW5zdGFuY2UoKS5nZXRTYXZlSW5mbyh0aGlzLCB0aW1lc3RhbXApOwotCQkJcmVmcmVzaGVkQnlTaGFyZWQgPSB0cnVlOwotCQkJRGlhZ3JhbVNlcnZpY2UuZUluc3RhbmNlKCkuZGlzcGF0Y2goaW5mbyk7Ci0JCQlyZWZyZXNoZWRCeVNoYXJlZCA9IGZhbHNlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHVwZGF0ZVRpbWVTdGFtcChJRmlsZSBmaWxlKXsKLQkJCWxvbmcgdGltZXN0YW1wID0gY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpOwotCQkJU2F2ZUluZm8gaW5mbyA9IERpYWdyYW1TZXJ2aWNlLmVJbnN0YW5jZSgpLmdldFNhdmVJbmZvKHRoaXMsIHRpbWVzdGFtcCk7Ci0JCQlEaWFncmFtU2VydmljZS5lSW5zdGFuY2UoKS5kaXNwYXRjaChpbmZvKTsKLQkJfQotCi0JCQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlRGlzcGF0Y2hlcigpewotCQkJaWYoZGlzcGF0Y2hlciAhPW51bGwpCi0JCQkJRGlhZ3JhbVNlcnZpY2UuZUluc3RhbmNlKCkucmVtb3ZlRGlzcGF0Y2hlcnMoZGlzcGF0Y2hlcik7Ci0JCX0KLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LkZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlciNkb1NhdmVEb2N1bWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudCwgYm9vbGVhbikKLQkgKiBAY3VzdG9tCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlRG9jdW1lbnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgZWxlbWVudCwgSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQotCQkJSUZpbGVFZGl0b3JJbnB1dCBpbnB1dD0gKElGaWxlRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQlGaWxlSW5mbyBpbmZvPSAoRmlsZUluZm8pIGdldEVsZW1lbnRJbmZvKGVsZW1lbnQpOwotCQkJSUZpbGUgZmlsZT0gaW5wdXQuZ2V0RmlsZSgpOwotCi0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCi0JCQkJaWYgKGluZm8gIT0gbnVsbCAmJiAhb3ZlcndyaXRlKQotCQkJCQljaGVja1N5bmNocm9uaXphdGlvblN0YXRlKGluZm8uZk1vZGlmaWNhdGlvblN0YW1wLCBmaWxlKTsKLQotCQkJCS8vIGluZm9ybSBhYm91dCB0aGUgdXBjb21pbmcgY29udGVudCBjaGFuZ2UKLQkJCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdpbmcoZWxlbWVudCk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaW1lIHRpbWVzdGFtcCBiZWZvcmUgc2F2aW5nOiAiICsgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpKTsKLQkJCQkJc2F2ZURvY3VtZW50VG9GaWxlKGRvY3VtZW50LCBmaWxlLCBvdmVyd3JpdGUsIG1vbml0b3IpOwotCQkJCQkvLyBEaXNwYXRjaCB0aGUgc2F2ZSBldmVudC4KLQkJCQkJaWYoaW5mbyBpbnN0YW5jZW9mIERpYWdyYW1GaWxlSW5mb1N5bmMpewotCQkJCQkJKChEaWFncmFtRmlsZUluZm9TeW5jKWluZm8pLnVwZGF0ZVRpbWVTdGFtcCgpOwotCQkJCQl9Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGltZSB0aW1lc3RhbXAgYWZ0ZXIgc2F2aW5nOiAiICsgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpKTsKLQkJCQkJCi0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJCS8vIGluZm9ybSBhYm91dCBmYWlsdXJlCi0JCQkJCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2VGYWlsZWQoZWxlbWVudCk7Ci0JCQkJCXRocm93IHg7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJCS8vIGluZm9ybSBhYm91dCBmYWlsdXJlCi0JCQkJCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2VGYWlsZWQoZWxlbWVudCk7Ci0JCQkJCXRocm93IHg7Ci0JCQkJfQotCi0JCQkJLy8gSWYgaGVyZSwgdGhlIGVkaXRvciBzdGF0ZSB3aWxsIGJlIGZsaXBwZWQgdG8gIm5vdCBkaXJ0eSIuCi0JCQkJLy8gVGh1cywgdGhlIHN0YXRlIGNoYW5naW5nIGZsYWcgd2lsbCBiZSByZXNldC4KLQotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJaW5mby5mTW9kaWZpY2F0aW9uU3RhbXA9IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChmaWxlKTsKLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soRGlhZ3JhbW1pbmdSZXNvdXJjZXMuRmlsZURvY3VtZW50UHJvdmlkZXJfdGFza19zYXZpbmcsIDMwMDApOwotCQkJCQlDb250YWluZXJDcmVhdG9yIGNyZWF0b3IgPSBuZXcgQ29udGFpbmVyQ3JlYXRvcihmaWxlLmdldFdvcmtzcGFjZSgpLCBmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkpOwotCQkJCQljcmVhdG9yLmNyZWF0ZUNvbnRhaW5lcihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMDApKTsKLQkJCQkJZmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCIiLmdldEJ5dGVzKCkpLCBmYWxzZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDAwKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc2F2ZURvY3VtZW50VG9GaWxlKGRvY3VtZW50LCBmaWxlLCBvdmVyd3JpdGUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCkpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuZG9TYXZlRG9jdW1lbnQobW9uaXRvciwgZWxlbWVudCwgZG9jdW1lbnQsIG92ZXJ3cml0ZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LkZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlciNkaXNwb3NlRWxlbWVudEluZm8oamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRQcm92aWRlci5FbGVtZW50SW5mbykKLQkgKiBAY3VzdG9tCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50LCBFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCWlmKGluZm8gaW5zdGFuY2VvZiBEaWFncmFtRmlsZUluZm9TeW5jKXsKLQkJCSgoRGlhZ3JhbUZpbGVJbmZvU3luYylpbmZvKS5kaXNwb3NlRGlzcGF0Y2hlcigpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2VFbGVtZW50SW5mbyhlbGVtZW50LCBpbmZvKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0b3IuQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyI2NyZWF0ZUVsZW1lbnRJbmZvKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbmZvIGNyZWF0ZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCi0JCQlJRmlsZUVkaXRvcklucHV0IGlucHV0PSAoSUZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQotCQkJdHJ5IHsKLQkJCQlyZWZyZXNoRmlsZShpbnB1dC5nZXRGaWxlKCkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJaGFuZGxlQ29yZUV4Y2VwdGlvbih4LCBEaWFncmFtbWluZ1Jlc291cmNlcy5GaWxlRG9jdW1lbnRQcm92aWRlcl9jcmVhdGVFbGVtZW50SW5mbyk7Ci0JCQl9Ci0KLQkJCUlEb2N1bWVudCBkPSBudWxsOwotCQkJSVN0YXR1cyBzPSBudWxsOwotCi0JCQl0cnkgewotCQkJCWQ9IGNyZWF0ZURvY3VtZW50KGVsZW1lbnQpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJaGFuZGxlQ29yZUV4Y2VwdGlvbih4LCBEaWFncmFtbWluZ1Jlc291cmNlcy5GaWxlRG9jdW1lbnRQcm92aWRlcl9jcmVhdGVFbGVtZW50SW5mbyk7Ci0JCQkJcz0geC5nZXRTdGF0dXMoKTsKLQkJCQlkPSBjcmVhdGVFbXB0eURvY3VtZW50KCk7Ci0JCQl9Ci0JCQkKLQkJCURpYWdyYW1GaWxlU3luY2hyb25pemVyIGY9IG5ldyBEaWFncmFtRmlsZVN5bmNocm9uaXplcihpbnB1dCk7Ci0JCQlmLmluc3RhbGwoKTsKLQotCQkJRmlsZUluZm8gaW5mbz0gY3JlYXRlRmlsZUluZm8oZCwgZiwgaW5wdXQpOwotCQkJaW5mby5mTW9kaWZpY2F0aW9uU3RhbXA9IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbnB1dC5nZXRGaWxlKCkpOwotCQkJaW5mby5mU3RhdHVzPSBzOwotCi0JCQlyZXR1cm4gaW5mbzsKLQkJfQotCi0JCXJldHVybiBzdXBlci5jcmVhdGVFbGVtZW50SW5mbyhlbGVtZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogRG9lcyBtZXJnZSBvcGVyYXRpb24gb2YgdGhlIHJlc291cmNlIGlmIHJlc291cmNlIGNvbnRlbnRzIGFyZSBzYXZlZCBieSBzaGFyZWQKLQkgKiBJRG9jdW1lbnQuIAotCSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotCSAqLwotCXB1YmxpYyBjbGFzcyBNZXJnZU9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RU1GT3BlcmF0aW9uewotCi0JCXByaXZhdGUgRWxlbWVudEluZm8gZWxlbWVudEluZm87Ci0JCXByaXZhdGUgSURvY3VtZW50IHRvTWVyZ2VEb2N1bWVudDsKLQotCQlwdWJsaWMgTWVyZ2VPcGVyYXRpb24oVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBTdHJpbmcgbGFiZWwsCi0JCQkJRWxlbWVudEluZm8gZWxlbWVudEluZm8sIElEb2N1bWVudCB0b01lcmdlRG9jdW1lbnQpIHsKLQkJCXN1cGVyKGRvbWFpbiwgbGFiZWwpOwotCQkJdGhpcy5lbGVtZW50SW5mbyA9IGVsZW1lbnRJbmZvOwotCQkJdGhpcy50b01lcmdlRG9jdW1lbnQgPSB0b01lcmdlRG9jdW1lbnQ7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJdHJ5ewotCQkJaWYoZWxlbWVudEluZm8gaW5zdGFuY2VvZiBFbGVtZW50SW5mbyl7Ci0JCQkJSURvY3VtZW50IHNhdmVkRG9jdW1lbnQgPSAoKEVsZW1lbnRJbmZvKWVsZW1lbnRJbmZvKS5mRG9jdW1lbnQ7Ci0JCQkJRGlhZ3JhbSBzYXZlZGRpYWdyYW0gID0gKERpYWdyYW0pc2F2ZWREb2N1bWVudC5nZXRDb250ZW50KCk7Ci0JCQkJaWYoc2F2ZWRkaWFncmFtICE9IG51bGwpewotCQkJCQlEaWFncmFtIGluVXNlRGlhZ3JhbSA9IChEaWFncmFtKXRvTWVyZ2VEb2N1bWVudC5nZXRDb250ZW50KCk7Ci0JCQkJCUdNRlJlc291cmNlIGdtZlJlc291cmNlID0gKEdNRlJlc291cmNlKWluVXNlRGlhZ3JhbS5lUmVzb3VyY2UoKTsKLQkJCQkJRUxpc3QgbGlzdCA9IGdtZlJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0KLQkJCQkJU3RyaW5nIGd1aWQgPSBVbWFVbWxVdGlsLmdldFVtYUd1aWRGcm9tVW1sRWxlbWVudCgoTmFtZWRFbGVtZW50KXNhdmVkZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCQlEaWFncmFtIHJlcGxhY2luZ0RpYWdyYW0gPSBudWxsOwotCQkJCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQkJCVN0cmluZyBjdXJyZW50Z3VpZCA9IFVtYVVtbFV0aWwuZ2V0VW1hR3VpZEZyb21VbWxFbGVtZW50KChOYW1lZEVsZW1lbnQpZWxlbWVudCk7Ci0JCQkJCQkJaWYoY3VycmVudGd1aWQuZXF1YWxzKGd1aWQpKXsKLQkJCQkJCQkJbmV3TGlzdC5hZGQoc2F2ZWRkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCW5ld0xpc3QuYWRkKGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKXsKLQkJCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSllbGVtZW50OwotCQkJCQkJCUVPYmplY3Qgb2JqZWN0ID0gKChEaWFncmFtKWVsZW1lbnQpLmdldEVsZW1lbnQoKTsKLQkJCQkJCQlTdHJpbmcgckd1aWQgPSBVbWFVbWxVdGlsLmdldFVtYUd1aWRGcm9tVW1sRWxlbWVudCgoTmFtZWRFbGVtZW50KW9iamVjdCk7Ci0JCQkJCQkJaWYoZ3VpZC5lcXVhbHMockd1aWQpKXsKLQkJCQkJCQkJcmVwbGFjaW5nRGlhZ3JhbSA9IGRpYWdyYW07Ci0JCQkJCQkJCW5ld0xpc3QuYWRkKHNhdmVkZGlhZ3JhbSk7Ci0JCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCW5ld0xpc3QuYWRkKGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYocmVwbGFjaW5nRGlhZ3JhbSA9PSBudWxsKXsKLQkJCQkJCW5ld0xpc3QuYWRkKHNhdmVkZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCQkJbmV3TGlzdC5hZGQoc2F2ZWRkaWFncmFtKTsKLQkJCQkJfQotCQkJCQkvL1RyYW5zYWN0aW9uIHR4ID0gY3JlYXRlIAotCQkJCQkvLyBUT0RPIGhhbmRsZSBiZXR0ZXIgd2F5IHRvIG1lcmdlIHRoZSBlbGVtZW50cy4KLQkJCQkJaWYoIW5ld0xpc3QuaXNFbXB0eSgpKXsKLQkJCQkJCWJvb2xlYW4gbm90aWZpY2F0aW9uID0gZ21mUmVzb3VyY2UuZURlbGl2ZXIoKTsKLQkJCQkJCWdtZlJlc291cmNlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkJCWdtZlJlc291cmNlLmdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQkJCWdtZlJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkQWxsKG5ld0xpc3QpOwotCQkJCQkJZ21mUmVzb3VyY2UuZVNldERlbGl2ZXIobm90aWZpY2F0aW9uKTsKLQkJCQkJCS8vbGlzdC5hZGRBbGwobmV3TGlzdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogRG9jdW1lbnQgbWVyZ2UgZmFpbGVkIGR1ZSB0byAiKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0JCi0JICAgCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyB0aGUgc2F2aW5nIG9mIHRoZSBkaWFncmFtIHRvIGEgZmlsZQotICAgICAqIAotICAgICAqIEBwYXJhbSBkb21haW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB3ZSBhcmUgc2F2aW5nIGluCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBJRmlsZSB0byBzYXZlIHRvCi0gICAgICogQHBhcmFtIGRpYWdyYW0KLSAgICAgKiAgICAgICAgICAgIERpYWdyYW0gdGhhdCB3aWxsIGJlIHNhdmVkCi0gICAgICogQHBhcmFtIG9wdGlvbnMKLSAgICAgKiAgICAgICAgICAgIHNhdmUgb3B0aW9ucyBvciBudWxsCi0gICAgICogQHBhcmFtIG1vbml0b3IKLSAgICAgKiAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NhdmUoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBJRmlsZSBmaWxlLAotICAgICAgICAgICAgRGlhZ3JhbSBkaWFncmFtLCBNYXAgb3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgIERpYWdyYW1QZXJzaXN0ZXIuc2F2ZShkb21haW4sIGZpbGUsIGRpYWdyYW0sIERpYWdyYW1QZXJzaXN0ZXIKLSAgICAgICAgICAgICAgICAuaGFzVW5yZWNvZ25pemVkRGF0YShkaWFncmFtLmVSZXNvdXJjZSgpKSwgbW9uaXRvcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlEaWFncmFtUGVyc2lzdGVyLnNhdmUoZG9tYWluLCBmaWxlLCBkaWFncmFtLCBtb25pdG9yLCBvcHRpb25zKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLQkgKiBTeW5jaHJvbml6ZXMgdGhlIGRvY3VtZW50IHdpdGggZXh0ZXJuYWwgcmVzb3VyY2UgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRGlhZ3JhbUZpbGVTeW5jaHJvbml6ZXIgZXh0ZW5kcyBGaWxlU3luY2hyb25pemVyIHsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBmaWxlIHN5bmNocm9uaXplci4gSXMgbm90IHlldCBpbnN0YWxsZWQgb24gYSByZXNvdXJjZS4KLQkJICoKLQkJICogQHBhcmFtIGZpbGVFZGl0b3JJbnB1dCB0aGUgZWRpdG9yIGlucHV0IHRvIGJlIHN5bmNocm9uaXplZAotCQkgKi8KLQkJcHVibGljIERpYWdyYW1GaWxlU3luY2hyb25pemVyKElGaWxlRWRpdG9ySW5wdXQgZmlsZUVkaXRvcklucHV0KSB7Ci0JCQlzdXBlcihmaWxlRWRpdG9ySW5wdXQpOwotCQl9Ci0JCS8qCi0JCSAqIEBzZWUgSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCWlmIChkZWx0YSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJZGVsdGE9IGRlbHRhLmZpbmRNZW1iZXIoZ2V0RmlsZSgpLmdldEZ1bGxQYXRoKCkpOwotCi0JCQlpZiAoZGVsdGEgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlPSBudWxsOwotCi0JCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKLQkJCQkJRGlhZ3JhbUZpbGVJbmZvU3luYyBpbmZvPSAoRGlhZ3JhbUZpbGVJbmZvU3luYykgZ2V0RWxlbWVudEluZm8oZkZpbGVFZGl0b3JJbnB1dCk7Ci0JCQkJCWlmIChpbmZvID09IG51bGwgfHwgaW5mby5mQ2FuQmVTYXZlZCkKLQkJCQkJCWJyZWFrOwotCi0JCQkJCWJvb2xlYW4gaXNTeW5jaHJvbml6ZWQ9IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChnZXRGaWxlKCkpID09IGluZm8uZk1vZGlmaWNhdGlvblN0YW1wOwotCQkJCQlpZiAoKChJUmVzb3VyY2VEZWx0YS5FTkNPRElORyAmIGRlbHRhLmdldEZsYWdzKCkpICE9IDAgJiYgaXNTeW5jaHJvbml6ZWQpIHx8ICgoSVJlc291cmNlRGVsdGEuQ09OVEVOVCAmIGRlbHRhLmdldEZsYWdzKCkpICE9IDAgJiYgIWlzU3luY2hyb25pemVkKQotCQkJCQkJCXx8IGluZm8ucmVmcmVzaGVkQnlTaGFyZWQpIHsKLQkJCQkJCXJ1bm5hYmxlID0gbmV3IFNhZmVDaGFuZ2UoZkZpbGVFZGl0b3JJbnB1dCkgewotCQkJCQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSUZpbGVFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCS8vaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkKGlucHV0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOgotCQkJCQlpZiAoKElSZXNvdXJjZURlbHRhLk1PVkVEX1RPICYgZGVsdGEuZ2V0RmxhZ3MoKSkgIT0gMCkgewotCQkJCQkJZmluYWwgSVBhdGggcGF0aD0gZGVsdGEuZ2V0TW92ZWRUb1BhdGgoKTsKLQkJCQkJCXJ1bm5hYmxlPSBuZXcgU2FmZUNoYW5nZShmRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkJCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJRmlsZUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCQkJaGFuZGxlRWxlbWVudE1vdmVkKGlucHV0LCBwYXRoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQl9IGVsc2UgewotCQkJCQkJaW5mbz0gKERpYWdyYW1GaWxlSW5mb1N5bmMpIGdldEVsZW1lbnRJbmZvKGZGaWxlRWRpdG9ySW5wdXQpOwotCQkJCQkJaWYgKGluZm8gIT0gbnVsbCAmJiAhaW5mby5mQ2FuQmVTYXZlZCkgewotCQkJCQkJCXJ1bm5hYmxlPSBuZXcgU2FmZUNoYW5nZShmRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkJCQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSUZpbGVFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCQloYW5kbGVFbGVtZW50RGVsZXRlZChpbnB1dCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAocnVubmFibGUgIT0gbnVsbCkKLQkJCQl1cGRhdGUocnVubmFibGUpOwotCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9CQotCQotCXB1YmxpYyB2b2lkIHVuc2V0Q2FuU2F2ZURvY3VtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCUVsZW1lbnRJbmZvIGluZm8gPSAoRWxlbWVudEluZm8pIGdldEVsZW1lbnRJbmZvKGVsZW1lbnQpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCXJlbW92ZVVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoZWxlbWVudCwgaW5mbyk7Ci0JCQkJaW5mby5mQ2FuQmVTYXZlZCA9IGZhbHNlOwotCQkJCWFkZFVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoZWxlbWVudCwgaW5mbyk7Ci0JCQkJZmlyZUVsZW1lbnREaXJ0eVN0YXRlQ2hhbmdlZChlbGVtZW50LCBpbmZvLmZDYW5CZVNhdmVkKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3V0aWwvQUREaWFncmFtVXRpbC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9BRERpYWdyYW1VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNjExYzkuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9BRERpYWdyYW1VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQUREaWFncmFtVXRpbCB7Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE5vZGVzSW5QYXJ0aXRpb24oQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCBjaGlsZCkgewotCQlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlBY3Rpdml0eVBhcnRpdGlvbiBwYXJ0aXRpb24gPSAoQWN0aXZpdHlQYXJ0aXRpb24pKChOb2RlKWNoaWxkLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJTGlzdCBsaXN0ID0gcGFydGl0aW9uLmdldE5vZGVzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJbm9kZXMuYWRkKGZpbmRFZGl0UGFydHlCeUVsZW1lbnQoY2hpbGQuZ2V0UGFyZW50KCksIGVsZW1lbnQpKTsKLQkJfQotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCXB1YmxpYyBzdGF0aWMgRWRpdFBhcnQgZmluZEVkaXRQYXJ0eUJ5RWxlbWVudChFZGl0UGFydCBwYXJlbnQsCi0JCQlPYmplY3QgZWxlbWVudCkgewotCQlMaXN0IGxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLQkJCWlmICgoKE5vZGUpIGVkaXRQYXJ0LmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKSA9PSBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGVkaXRQYXJ0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgc3RhdGljIEVkaXRQYXJ0IGdldFBhcnRpdGlvbldoZXJlQ2hpbGRJbihFZGl0UGFydCBjaGlsZCwgT2JqZWN0IGNvbnN0cmFpbnQpIHsKLQkJRGlhZ3JhbUVkaXRQYXJ0IHBhcmVudCA9IChEaWFncmFtRWRpdFBhcnQpIGNoaWxkLmdldFBhcmVudCgpOwotCQlpZiAoIShjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpCi0JCQkJJiYgcGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHlFZGl0UGFydCkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoKE5vZGUpIGNoaWxkLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQkJTGlzdCBsaXN0ID0gKChBY3Rpdml0eU5vZGUpIGVsZW1lbnQpLmdldEluUGFydGl0aW9ucygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJQWN0aXZpdHlQYXJ0aXRpb24gcGFydGl0aW9uID0gKEFjdGl2aXR5UGFydGl0aW9uKSBpdGVyCi0vLwkJCQkJCQkubmV4dCgpOwotCQkJCQlFZGl0UGFydCBwYXJ0ID0gZmluZEVkaXRQYXJ0eUJ5RWxlbWVudChwYXJlbnQsIGVsZW1lbnQpOwotCQkJCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBOb2RlIG5vZGUgPSAoTm9kZSlwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCQkvLyBPYmplY3QgeCA9IFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwKLQkJCQkJCS8vIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpKTsKLQkJCQkJCS8vIE9iamVjdCB5ID0gVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLAotCQkJCQkJLy8gTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkpOwotCQkJCQkJLy8gT2JqZWN0IHdpZHRoID0KLQkJCQkJCS8vIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwKLQkJCQkJCS8vIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpKTsKLQkJCQkJCS8vIE9iamVjdCBoZWlnaHQgPQotCQkJCQkJLy8gVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLAotCQkJCQkJLy8gTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpKTsKLQkJCQkJCS8vIFJlY3RhbmdsZSByZWN0ID0gbmV3IFJlY3RhbmdsZSh4LHksd2lkdGgsIGhlaWdodCk7Ci0JCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gKChHcmFwaGljYWxFZGl0UGFydCkgcGFydCkKLQkJCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQkJaWYgKGJvdW5kcy5jb250YWlucygoUmVjdGFuZ2xlKSBjb25zdHJhaW50KSkgewotCQkJCQkJCXJldHVybiBwYXJ0OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbm91c2UoKXsKLS8vCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSB7Ci0vLwkJCUxpc3QgY2hpbGRzID0gZ2V0Tm9kZXNJblBhcnRpdGlvbigoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCljaGlsZCk7CQotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlFZGl0UGFydCBlbGVtZW50ID0gKEVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLS8vCQkJCS8vY21kLmNoYWluKHN1cGVyLmNyZWF0ZUNoYW5nZUNvbnN0cmFpbnRDb21tYW5kKGVsZW1lbnQsIGNvbnN0cmFpbnQpKTsKLS8vCQkJfQotLy8JCQkKLS8vCQl9IGVsc2UgewotLy8KLS8vCQkJRWRpdFBhcnQgcGFydCA9IGNoaWxkSW5BbnlQYXJ0aXRpb25BcmVhKGNoaWxkLCBjb25zdHJhaW50KTsKLS8vCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSB7Ci0vLwkJCQkvLyBSZWN0YW5nbGUgYm91bmRzID0KLS8vCQkJCS8vICgoR3JhcGhpY2FsRWRpdFBhcnQpcGFydCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0vLwkJCQkvLyBSZWN0YW5nbGUgY29uc3RhaW50ciA9IChSZWN0YW5nbGUpY29uc3RyYWludDsKLS8vCQkJCS8vIGJvdW5kcyA9IGJvdW5kcy5leHBhbmQoY29uc3RhaW50ci53aWR0aCwgY29uc3RhaW50ci5oZWlnaHQpOwotLy8JCQkJLy8gKChHcmFwaGljYWxFZGl0UGFydClwYXJ0KS5nZXRGaWd1cmUoKS5zZXRCb3VuZHMoYm91bmRzKTsKLS8vLy8JCQkJQ29tbWFuZCBjbWR4ID0gc3VwZXIuY3JlYXRlQ2hhbmdlQ29uc3RyYWludENvbW1hbmQocGFydCwKLS8vLy8JCQkJCQljb25zdHJhaW50KTsKLS8vLy8JCQkJY21kLmNoYWluKGNtZHgpOwotLy8KLS8vCQkJfQotLy8JCX0KLQl9Ci0JCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZCBnZXRDb21tYW5kV3JhcHBlcihJQ29tbWFuZCBjbWQpIHsKLQkJcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KGNtZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9BbmNob3JVdGlsLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS91dGlsL0FuY2hvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3OGY5MS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS91dGlsL0FuY2hvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGFuY2hvcnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbmNob3JVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgUG9pbnQgZ2V0Q2xvc2VzdFBvaW50KFBvaW50W10gcG9pbnRzLCBQb2ludCBwb2ludCkgewotCQlpbnQgc2l6ZSA9IHBvaW50cy5sZW5ndGg7Ci0JCWRvdWJsZVtdIGRpc3RhbmNlcyA9IG5ldyBkb3VibGVbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlkaXN0YW5jZXNbaV0gPSBwb2ludHNbaV0uZ2V0RGlzdGFuY2UocG9pbnQpOwotCQl9Ci0JCXJldHVybiBwb2ludHNbbWluKGRpc3RhbmNlcyldOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IG1pbihkb3VibGVbXSBudW1iZXJzKSB7Ci0JCWlmIChudW1iZXJzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIC0xOwotCQlkb3VibGUgbWluID0gbnVtYmVyc1swXTsKLQkJaW50IGlkID0gMDsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBudW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlkb3VibGUgbiA9IG51bWJlcnNbaV07Ci0JCQlpZiAobiA8IG1pbikgewotCQkJCW1pbiA9IG47Ci0JCQkJaWQgPSBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbnVtYmVycwotCSAqIEByZXR1cm4KLQkgKiAJCWluZGV4IG9mIHRoZSBzbWFsbGVzdCBudW1iZXIgaW4gdGhlIGdpdmVuIGFycmF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbWluKGludFtdIG51bWJlcnMpIHsKLQkJaWYgKG51bWJlcnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWludCBtaW4gPSBudW1iZXJzWzBdOwotCQlpbnQgaWQgPSAwOwotCQlmb3IgKGludCBpID0gMTsgaSA8IG51bWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWludCBuID0gbnVtYmVyc1tpXTsKLQkJCWlmIChuIDwgbWluKSB7Ci0JCQkJbWluID0gbjsKLQkJCQlpZCA9IGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9EaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3V0aWwvRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzN2M4ZmIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9EaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLQotLyoqCi0gKiBEaWFncmFtQ2hhbmdlTGlzdGVuZXIgbGlzdGVucyB0byB0aGUgTm90aWZpY2F0aW9uIG9mIE5vdGlmaWVyIChtYWlubHkge0BsaW5rIEFjdGl2aXR5fQotICogU2ltaWxhciB0byB0aGUgR0VGIGJhc2VkIEFjdGl2aXR5RGlhZ3JhbSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JRGlhZ3JhbUNoYW5nZUxpc3RlbmVyfQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG9iamVjdDsKLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbTsKLQkKLQlwdWJsaWMgRGlhZ3JhbUNoYW5nZUxpc3RlbmVyKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCU1ldGhvZEVsZW1lbnQgb2JqZWN0LCBEaWFncmFtIGRpYWdyYW0pIHsKLQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCXRoaXMuZGlhZ3JhbSA9IGRpYWdyYW07Ci0JfQotCi0JcHVibGljIERpYWdyYW1DaGFuZ2VMaXN0ZW5lcihNZXRob2RFbGVtZW50IG9iamVjdCwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQl0aGlzLmRpYWdyYW0gPSBkaWFncmFtOwotCX0KLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQlwdWJsaWMgTm90aWZpZXIgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLS8vCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQgKQotLy8JCQlyZXR1cm47Ci0vLwkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotLy8JCXRyeSB7Ci0vLwkJCS8vT2JqZWN0IG9iajsKLS8vCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotLy8JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLS8vCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZmljYXRpb24gQWRkIik7Ci0vLwkJCQkJYnJlYWs7Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZmljYXRpb24gQWRkIik7Ci0vLwkJCQkJYnJlYWs7Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmaWNhdGlvbiBBZGQiKTsKLS8vCQkJCQlicmVhazsKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm90aWZpY2F0aW9uIEFkZCIpOwotLy8JCQkJCWJyZWFrOwotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmaWNhdGlvbiBBZGQiKTsKLS8vCQkJCQlicmVhazsKLS8vCQkJCX0KLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwkJfQotLy8JCWZpbmFsbHkgewotLy8JCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLS8vCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS91dGlsL0RpYWdyYW1FZGl0b3JVdGlsLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS91dGlsL0RpYWdyYW1FZGl0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTk3YmMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9EaWFncmFtRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5BY3Rpdml0eURpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuY29tbWFuZHMuQ3JlYXRlRGlhZ3JhbUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuRGlhZ3JhbUZpbGVDcmVhdG9yRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuSURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MRGlhZ3JhbUZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5BY3Rpdml0eURyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1Xb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUudXRpbC5JREVFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci51dGlsLkVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLkdNRkVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdG9yVXRpbCBleHRlbmRzIElERUVkaXRvclV0aWwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcga2luZCA9ICJBRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdF9maWxlX25hbWUgPSAiZGlhZ3JhbSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY3JlYXRlX2RpYWdyYW1fbGFiZWwgPSAiQ3JlYXRlIGRpYWdyYW0gYW5kIG1vZGVsIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkRpYWdyYW1FZGl0b3JJRCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFZGl0b3JJZChpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJc3dpdGNoKGRpYWdyYW1UeXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gQURfRURJVE9SX0lEOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5EaWFncmFtRWRpdG9yKElXb3JrYmVuY2hQYWdlIHBhZ2UsIERpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJRGlhZ3JhbUVkaXRvcklucHV0UHJveHkgZGlhZ3JhbUZpbGVFZGl0b3JJbnB1dCA9IG5ldyBEaWFncmFtRWRpdG9ySW5wdXRQcm94eShpbnB1dCwgRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCi0JCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdG9yUGFydCA9IHBhZ2Uub3BlbkVkaXRvcihkaWFncmFtRmlsZUVkaXRvcklucHV0LCBnZXRFZGl0b3JJZChpbnB1dC5nZXREaWFncmFtVHlwZSgpKSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQkvLyBpbml0aWFsaXplIHRoZSBkaWFncmFtIGJ5IHN5bmNocm9uaXppbmcgaXQgd2l0aCBsaWJyYXJ5IGRhdGEKLQkJLy8KLQkJaWYoZWRpdG9yUGFydCBpbnN0YW5jZW9mIElEaWFncmFtV29ya2JlbmNoUGFydCkgewotCQkJRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKChJRGlhZ3JhbVdvcmtiZW5jaFBhcnQpZWRpdG9yUGFydCkuZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCQkoKERpYWdyYW1Eb2N1bWVudEVkaXRvcillZGl0b3JQYXJ0KS5nZXREb2N1bWVudFByb3ZpZGVyKCkuc2V0Q2FuU2F2ZURvY3VtZW50KGRpYWdyYW1GaWxlRWRpdG9ySW5wdXQpOwotCQkJaW5pdGlhbGl6ZSgoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKSwgZGlhZ3JhbUZpbGVFZGl0b3JJbnB1dCk7Ci0JCX0KLQkJcmV0dXJuIGVkaXRvclBhcnQ7Ci0JfQotCi0JLyoqCi0JICogVG8gb3BlbiBhIGRpYWdyYW0gYW5kIGNyZWF0ZSBhIGZpbGUuCi0JICogQHdyaXR0ZW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkRpYWdyYW1FZGl0b3IoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgSUVkaXRvcklucHV0IGlucHV0KXsKLQkJCi0JCU1ldGhvZEVsZW1lbnQgcHJvY2VzcyA9IChNZXRob2RFbGVtZW50KSgoRGlhZ3JhbUVkaXRvcklucHV0KWlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCUlQYXRoIGNvbnRhaW5lclBhdGggPSBnZXRDb250YWluZXJQYXRoKHByb2Nlc3MpOwotCQkKLQkJY3JlYXRlQW5kT3BlbkRpYWdyYW0oCi0JCQkJVU1MRGlhZ3JhbUZpbGVDcmVhdG9yLmdldEluc3RhbmNlKCksIGNvbnRhaW5lclBhdGgsIGRlZmF1bHRfZmlsZV9uYW1lLAotCQkJCUVkaXRvclV0aWwuZ2V0SW5pdGlhbENvbnRlbnRzKCksIGtpbmQsIHBhZ2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksCi0JCQkJdHJ1ZSwgZmFsc2UsIGlucHV0KTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUZpbGUgY3JlYXRlQW5kT3BlbkRpYWdyYW0oCi0JCQlEaWFncmFtRmlsZUNyZWF0b3IgZGlhZ3JhbUZpbGVDcmVhdG9yLCBJUGF0aCBjb250YWluZXJQYXRoLAotCQkJU3RyaW5nIGZpbGVOYW1lLCBJbnB1dFN0cmVhbSBpbml0aWFsQ29udGVudHMsIFN0cmluZyBraW5kLAotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JCQlib29sZWFuIG9wZW5FZGl0b3IsIGJvb2xlYW4gc2F2ZURpYWdyYW0sIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQkKLQkJSUZpbGUgZGlhZ3JhbUZpbGUgPSBnZXRGaWxlKGZpbGVOYW1lLCBpbnB1dCwgZGlhZ3JhbUZpbGVDcmVhdG9yKSA7Ci0JCWlmKGRpYWdyYW1GaWxlID09IG51bGwpewotCQkJZGlhZ3JhbUZpbGUgPSBjcmVhdGVOZXdEaWFncmFtRmlsZSgKLQkJCQlkaWFncmFtRmlsZUNyZWF0b3IsIGNvbnRhaW5lclBhdGgsIGZpbGVOYW1lLCBpbml0aWFsQ29udGVudHMsCi0JCQkJa2luZCwgcGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBwcm9ncmVzc01vbml0b3IsIGlucHV0KTsKLQkJfWVsc2V7Ci0JCQkKLQkJfQotCQkKLS8vCQlEaWFncmFtRmlsZUVkaXRvcklucHV0IGRpYWdyYW1GaWxlRWRpdG9ySW5wdXQgPSBuZXcgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dCgKLS8vCQkJCWRpYWdyYW1GaWxlLCAoRGlhZ3JhbUVkaXRvcklucHV0KWlucHV0KTsKLQkJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5IGRpYWdyYW1GaWxlRWRpdG9ySW5wdXQgPSBuZXcgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KAotCQkJCWRpYWdyYW1GaWxlLCAoRGlhZ3JhbUVkaXRvcklucHV0KWlucHV0LCBudWxsKTsKLQkJCi0JCWlmIChkaWFncmFtRmlsZSAhPSBudWxsICYmIG9wZW5FZGl0b3IpIHsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBkb09wZW5EaWFncmFtRWRpdG9yKGRpYWdyYW1GaWxlRWRpdG9ySW5wdXQsIHBhZ2UsIHNhdmVEaWFncmFtLCBwcm9ncmVzc01vbml0b3IpOwotCQkJCi0JCQkvLyBpbml0aWFsaXplIHRoZSBkaWFncmFtIGJ5IHN5bmNocm9uaXppbmcgaXQgd2l0aCBsaWJyYXJ5IGRhdGEKLQkJCS8vCi0JCQlpZihlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSURpYWdyYW1Xb3JrYmVuY2hQYXJ0KSB7Ci0JCQkJRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKChJRGlhZ3JhbVdvcmtiZW5jaFBhcnQpZWRpdG9yUGFydCkuZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCQkJaW5pdGlhbGl6ZSgoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKSwgZGlhZ3JhbUZpbGVFZGl0b3JJbnB1dCk7Ci0JCQl9Ci0JCQkvLyByZW1vdmUgdGhlIGRpcnR5IGZsYWcKLQkJCS8vCi0vLwkJCWlmKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFZGl0b3IpIHsKLS8vCQkJCUlEb2N1bWVudFByb3ZpZGVyIGRwID0gKChJRG9jdW1lbnRFZGl0b3IpZWRpdG9yUGFydCkuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotLy8JCQkJaWYoZHAgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9yRG9jdW1lbnRQcm92aWRlcikgewotLy8JCQkJCSgoRGlhZ3JhbUVkaXRvckRvY3VtZW50UHJvdmlkZXIpZHApLnVuc2V0Q2FuU2F2ZURvY3VtZW50KGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJfQotCQlyZXR1cm4gZGlhZ3JhbUZpbGU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShEaWFncmFtIG1vZGVsLCBEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkgZGlhZ3JhbUZpbGVFZGl0b3JJbnB1dCkgewotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gZGlhZ3JhbUZpbGVFZGl0b3JJbnB1dC5nZXREaWFncmFtRWRpdG9ySW5wdXQoKS5nZXRXcmFwcGVyKCk7Ci0JCUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIgYWRhcHRlciA9IHdyYXBwZXIgIT0gbnVsbCA/Ci0JCQkJbmV3IEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIod3JhcHBlcikgOiAKLQkJCQkJbmV3IEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIoKEFjdGl2aXR5KWRpYWdyYW1GaWxlRWRpdG9ySW5wdXQuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJYWRhcHRlci5zZXRFZGl0aW5nRG9tYWluKChJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKSBkaWFncmFtRmlsZUVkaXRvcklucHV0LmdldEVkaXRpbmdEb21haW4oKSk7Ci0JCWFkYXB0ZXIuc2V0U3VwcHJlc3Npb24oZGlhZ3JhbUZpbGVFZGl0b3JJbnB1dC5nZXREaWFncmFtRWRpdG9ySW5wdXQoKS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJYWRhcHRlci5zZXRWaWV3KG1vZGVsKTsKLQkJbW9kZWwuZ2V0RWxlbWVudCgpLmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJYWRhcHRlci5wb3B1bGF0ZURpYWdyYW0oKTsKLQl9Ci0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2l0aGluIGEgd29ya3NwYWNlIG1vZGlmeSBvcGVyYXRpb24gc2luY2UgaXQgY3JlYXRlcyByZXNvdXJjZXMuCi0JICogPC9wPgotCSAqIEBtb2RpZmllZAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgZmlsZSByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGZpbGUgd2FzIG5vdCBjcmVhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRmlsZSBjcmVhdGVOZXdEaWFncmFtRmlsZSgKLQkJCURpYWdyYW1GaWxlQ3JlYXRvciBkaWFncmFtRmlsZUNyZWF0b3IsIElQYXRoIGNvbnRhaW5lckZ1bGxQYXRoLAotCQkJU3RyaW5nIGZpbGVOYW1lLCBJbnB1dFN0cmVhbSBpbml0aWFsQ29udGVudHMsIFN0cmluZyBraW5kLAotCQkJU2hlbGwgc2hlbGwsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzaygiQ3JlYXRpbmcgbm90YXRpb24gZGlhZ3JhbSBhbmQgbW9kZWwgZmlsZSIsIDQpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIElQcm9ncmVzc01vbml0b3Igc3ViUHJvZ3Jlc3NNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcigKLQkJCQlwcm9ncmVzc01vbml0b3IsIDEpOwotCQlmaW5hbCBJRmlsZSBkaWFncmFtRmlsZSA9IGRpYWdyYW1GaWxlQ3JlYXRvci5jcmVhdGVOZXdGaWxlKAotCQkJCWNvbnRhaW5lckZ1bGxQYXRoLCBmaWxlTmFtZSwgaW5pdGlhbENvbnRlbnRzLCBzaGVsbCwKLQkJCQluZXcgSVJ1bm5hYmxlQ29udGV4dCgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKGJvb2xlYW4gZm9yaywgYm9vbGVhbiBjYW5jZWxhYmxlLAotCQkJCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQlydW5uYWJsZS5ydW4oc3ViUHJvZ3Jlc3NNb25pdG9yKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJY3JlYXRlRGlhZ3JhbUNvbnRlbnQoZGlhZ3JhbUZpbGUsIHByb2dyZXNzTW9uaXRvciwgaW5wdXQpOwotCQlyZXR1cm4gZGlhZ3JhbUZpbGU7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBkaWFncmFtIGZpbGUgY29udGVudCAtIEdNRiBub3RhdGlvbiBEaWFncmFtIGFuZCBVTUwgQWN0aXZpdHksCi0JICogVU1BIGJyaWRnZS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY3JlYXRlRGlhZ3JhbUNvbnRlbnQoSUZpbGUgZGlhZ3JhbUZpbGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gR01GRWRpdGluZ0RvbWFpbkZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKLQkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gcmVzb3VyY2VTZXQKLQkJCQkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGlhZ3JhbUZpbGUKLQkJCQkJCS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKTsKLQkJTGlzdCBhZmZlY3RlZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhZmZlY3RlZEZpbGVzLmFkZChkaWFncmFtRmlsZSk7Ci0JCUNyZWF0ZURpYWdyYW1Db21tYW5kIGNvbW1hbmQgPSBuZXcgQ3JlYXRlRGlhZ3JhbUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwKLQkJCQkiQ3JlYXRpbmcgZGlhZ3JhbSBhbmQgbW9kZWwiLCBhZmZlY3RlZEZpbGVzLCBpbnB1dCwKLQkJCQlkaWFncmFtUmVzb3VyY2UsIGtpbmQpOwotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgZGlhZ3JhbSBmaWxlIGNvbnRlbnQgLSBHTUYgbm90YXRpb24gRGlhZ3JhbSBhbmQgVU1MIEFjdGl2aXR5LAotCSAqIFVNQSBicmlkZ2UuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNyZWF0ZURpYWdyYW1Db250ZW50KFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sCi0JCQlJRmlsZSBkaWFncmFtRmlsZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIElFZGl0b3JJbnB1dCBpbnB1dCwKLQkJCVJlc291cmNlIHJlc291cmNlKSB7Ci0KLS8vCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gR01GRWRpdGluZ0RvbWFpbkZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0vLwkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7Ci0vLwkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gcmVzb3VyY2VTZXQKLS8vCQkJCS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkaWFncmFtRmlsZQotLy8JCQkJCQkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSk7Ci0JCUxpc3QgYWZmZWN0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYWZmZWN0ZWRGaWxlcy5hZGQoZGlhZ3JhbUZpbGUpOwotCQlDcmVhdGVEaWFncmFtQ29tbWFuZCBjb21tYW5kID0gbmV3IENyZWF0ZURpYWdyYW1Db21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJIkNyZWF0aW5nIGRpYWdyYW0gYW5kIG1vZGVsIiwgYWZmZWN0ZWRGaWxlcywgaW5wdXQsCi0JCQkJcmVzb3VyY2UsIGtpbmQpOwotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiBAd3JpdHRlbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0Q29udGFpbmVyUGF0aCgpewotCQlJUGF0aCBwYXRoID0gRWRpdG9yVXRpbC5nZXREZWZhdWx0RGlhZ3JhbVBhdGgobnVsbCwgbnVsbCk7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQlJUHJvamVjdFtdIHByb2plY3RzID0gcm9vdC5nZXRQcm9qZWN0cygpOwotCi0JCQkJcGF0aCA9IHJvb3QuZ2V0RnVsbFBhdGgoKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCi0JCQkJCWlmIChwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCQlwYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCQotCS8qKgotCSAqIE9wZW5zIHRoZSBkaWFncmFtIGluIGFuIElFZGl0b3JQYXJ0Ci0JICogIAotCSAqIEBwYXJhbSBmaWxlIElGaWxlIHRoYXQgY29udGFpbnMgdGhlIGRpYWdyYW0KLQkgKiBAcGFyYW0gZFdpbmRvdyB0aGUgd29ya2JlbmNoIHdpbmRvdwotCSAqIEBwYXJhbSBzYXZlRGlhZ3JhbSB0cnVlIHRvIHNhdmUgdGhlIGRpYWdyYW0gYWZ0ZXIgb3BlbmluZywgZmFsc2UgdG8gbm90Ci0JICogc2F2ZSBpdC4KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIHVzZWQgd2hlbiBvcGVuaW5nIHRoZSBkaWFncmFtLgotCSAqIEZvciBub3csIGl0IGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBkaWFncmFtIGlzIGJlaW5nIHNhdmVkIGFmdGVyIG9wZW5pbmcuCi0JICogIAotCSAqIEByZXR1cm4gRGlhZ3JhbUVkaXRQYXJ0IGZvciB0aGUgZGlhZ3JhbSBvcGVuZWQgaW4gYW4gSUVkaXRvclBhcnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaWFncmFtRWRpdFBhcnQgb3BlbkRpYWdyYW1FZGl0b3IoSUZpbGVFZGl0b3JJbnB1dCBpbnB1dCwKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UsIGJvb2xlYW4gc2F2ZURpYWdyYW0sCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gZG9PcGVuRGlhZ3JhbUVkaXRvcihpbnB1dCwgcGFnZSwgc2F2ZURpYWdyYW0sIHByb2dyZXNzTW9uaXRvcik7Ci0JCWlmKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJRGlhZ3JhbVdvcmtiZW5jaFBhcnQpIHsKLQkJCXJldHVybiAoKElEaWFncmFtV29ya2JlbmNoUGFydCllZGl0b3JQYXJ0KS5nZXREaWFncmFtRWRpdFBhcnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWRpdG9yUGFydCBkb09wZW5EaWFncmFtRWRpdG9yKElGaWxlRWRpdG9ySW5wdXQgaW5wdXQsCi0JCQlJV29ya2JlbmNoUGFnZSBwYWdlLCBib29sZWFuIHNhdmVEaWFncmFtLAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvL0lXb3JrYmVuY2hQYWdlIHBhZ2UgPSBkV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJZWRpdG9yUGFydCA9IG9wZW5FZGl0b3IocGFnZSwgaW5wdXQsIHRydWUsdHJ1ZSk7Ci0JCQkJaWYoZWRpdG9yUGFydCAhPSBudWxsICYmIHBhcmVudCAhPSBudWxsKXsKLQkJCQkJLy8gc2V0IHRoZSBwYXJlbnQuCi0JCQkJfQotCQkJCS8vIHNldCBBY3RpdmUgcGFnZSBlZGl0b3IgYXMgcGFyZW50LgotCQkJCWlmIChzYXZlRGlhZ3JhbSkKLQkJCQkJZWRpdG9yUGFydC5kb1NhdmUocHJvZ3Jlc3NNb25pdG9yKTsKLQkJCX0KLQkJCWlucHV0LmdldEZpbGUoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG51bGwpOwotCQkJcmV0dXJuIGVkaXRvclBhcnQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotICAgICAqIE9wZW5zIGFuIGVkaXRvciBvbiB0aGUgZ2l2ZW4gZmlsZSByZXNvdXJjZS4gIFRoaXMgbWV0aG9kIHdpbGwgYXR0ZW1wdCB0bwotCSAqIHJlc29sdmUgdGhlIGVkaXRvciBiYXNlZCBvbiBjb250ZW50LXR5cGUgYmluZGluZ3MgYXMgd2VsbCBhcyB0cmFkaXRpb25hbAotCSAqIG5hbWUvZXh0ZW5zaW9uIGJpbmRpbmdzIGlmIDxjb2RlPmRldGVybWluZUNvbnRlbnRUeXBlPC9jb2RlPiBpcwotCSAqIDxjb2RlPnRydWU8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBwYWdlIGFscmVhZHkgaGFzIGFuIGVkaXRvciBvcGVuIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRoZW4gdGhhdAotICAgICAqIGVkaXRvciBpcyBicm91Z2h0IHRvIGZyb250OyBvdGhlcndpc2UsIGEgbmV3IGVkaXRvciBpcyBvcGVuZWQuIElmCi0gICAgICogPGNvZGU+YWN0aXZhdGUgPT0gdHJ1ZTwvY29kZT4gdGhlIGVkaXRvciB3aWxsIGJlIGFjdGl2YXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBAcGFyYW0gcGFnZQotICAgICAqICAgICAgICAgICAgdGhlIHBhZ2UgaW4gd2hpY2ggdGhlIGVkaXRvciB3aWxsIGJlIG9wZW5lZAotICAgICAqIEBwYXJhbSBpbnB1dAotICAgICAqICAgICAgICAgICAgdGhlIGVkaXRvciBpbnB1dAotICAgICAqIEBwYXJhbSBhY3RpdmF0ZQotICAgICAqIAkJCSAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIGVkaXRvciB3aWxsIGJlIGFjdGl2YXRlZAotICAgICAqIEBwYXJhbSBkZXRlcm1pbmVDb250ZW50VHlwZQotICAgICAqIAkJCSAgYXR0ZW1wdCB0byByZXNvbHZlIHRoZSBjb250ZW50IHR5cGUgZm9yIHRoaXMgZmlsZQotICAgICAqIEByZXR1cm4gYW4gb3BlbiBlZGl0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgYW4gZXh0ZXJuYWwgZWRpdG9yIHdhcwotICAgICAqICAgICAgICAgb3BlbmVkCi0gICAgICogQGV4Y2VwdGlvbiBQYXJ0SW5pdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBlZGl0b3IgY291bGQgbm90IGJlIGluaXRpYWxpemVkCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZSNvcGVuRWRpdG9yKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCwKLSAgICAgKiAgICAgIFN0cmluZywgYm9vbGVhbikKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuRWRpdG9yKElXb3JrYmVuY2hQYWdlIHBhZ2UsIElGaWxlRWRpdG9ySW5wdXQgaW5wdXQsCi0gICAgICAgICAgICBib29sZWFuIGFjdGl2YXRlLCBib29sZWFuIGRldGVybWluZUNvbnRlbnRUeXBlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICAvL3Nhbml0eSBjaGVja3MKLSAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLSAgICAgICAgLy8gb3BlbiB0aGUgZWRpdG9yIG9uIHRoZSBmaWxlCi0gICAgICAgIElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2MgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihpbnB1dC5nZXRGaWxlKCksIGRldGVybWluZUNvbnRlbnRUeXBlKTsKLSAgICAgICAgcmV0dXJuIHBhZ2Uub3BlbkVkaXRvcihpbnB1dCwgZWRpdG9yRGVzYy5nZXRJZCgpLAotICAgICAgICAgICAgICAgIGFjdGl2YXRlKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciBmaWxlIGV4aXN0cyBvciBub3QuCi0JICogQHBhcmFtIHN6RmlsZU5hbWUKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcGFyYW0gZGlhZ3JhbUZpbGVDcmVhdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0RmlsZShTdHJpbmcgc3pGaWxlTmFtZSwgSUVkaXRvcklucHV0IGlucHV0LCBEaWFncmFtRmlsZUNyZWF0b3IgZGlhZ3JhbUZpbGVDcmVhdG9yKXsKLQkJCi0JCU1ldGhvZEVsZW1lbnQgZSA9ICgoRGlhZ3JhbUVkaXRvcklucHV0KWlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCVByb2Nlc3Mgc3JjUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgZSk7Ci0JCQotCQlJUGF0aCBjb250YWluZXJQYXRoID0gZ2V0Q29udGFpbmVyUGF0aChlKTsKLQkJU3RyaW5nIHN6TmV3RmlsZU5hbWUgPSBzekZpbGVOYW1lOwkJCi0JCUlQYXRoIGZpbGVQYXRoID0gY29udGFpbmVyUGF0aC5hcHBlbmQoZGlhZ3JhbUZpbGVDcmVhdG9yLmFwcGVuZEV4dGVuc2lvblRvRmlsZU5hbWUoc3pOZXdGaWxlTmFtZSkpOwotLy8JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotLy8JCWlmKHdvcmtzcGFjZVJvb3QuZXhpc3RzKGZpbGVQYXRoKSl7Ci0vLwkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwotLy8JCQlpZihmaWxlLmV4aXN0cygpKXsKLS8vCQkJCXJldHVybiBudWxsOwotLy8JCQl9Ci0vLwkJfQotCQlGaWxlIGxpYkRpcnMgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKTsKLQkJU3RyaW5nIGRpYWdyYW1QYXRoID0gbGliRGlycy5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJCSsgTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRFbGVtZW50UGF0aChzcmNQcm9jKQotCQkJCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgc3JjUHJvYy5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCQkrICJkaWFncmFtLnhtaSI7Ci0JCUZpbGUgZmlsZXggPSBuZXcgRmlsZShkaWFncmFtUGF0aCk7Ci0JCWlmKGZpbGV4LmV4aXN0cygpKXsKLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiAKLQkgKiBAcGFyYW0gcHJvYwotCSAqIEByZXR1cm4KLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRDb250YWluZXJQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCi0JCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKTsKLQkJLy8gVE9ETyBoYW5kbGUgdGhlIFdyYXBwZXIgRWxlbWVudHMuCi0JCQotCQlpZiAocHJvYyBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwcm9jKTsKLQotCQkJU3RyaW5nIHJlbGF0aXZlRGlyOwotCi0JCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJcmVsYXRpdmVEaXIgPSBNdWx0aUZpbGVTYXZlVXRpbC5DQVBBQklMSVRZX1BBVFRFUk5fUEFUSDsKLQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCXJlbGF0aXZlRGlyID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVMSVZFUllfUFJPQ0VTU19QQVRIOwotCQkJfSBlbHNlIHsKLQkJCQlyZWxhdGl2ZURpciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCUlQYXRoIHdvcmtzcGFjZVBhdGggPSBFZGl0b3JVdGlsLmdldERlZmF1bHREaWFncmFtUGF0aChudWxsLCBudWxsKTsKLQkJCWlmICh3b3Jrc3BhY2VQYXRoID09IG51bGwpIHsKLQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQlJUHJvamVjdFtdIHByb2plY3RzID0gcm9vdC5nZXRQcm9qZWN0cygpOwotCi0JCQkJd29ya3NwYWNlUGF0aCA9IHJvb3QuZ2V0RnVsbFBhdGgoKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCi0JCQkJCWlmIChwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCQl3b3Jrc3BhY2VQYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCVN0cmluZyBsaWJEaXIgPSB3b3Jrc3BhY2VQYXRoLnRvU3RyaW5nKCk7Ci0JCQlTdHJpbmcgcGx1Z2luRGlyID0gbGliRGlyICsgRmlsZS5zZXBhcmF0b3IgKyBwbHVnaW4uZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGRpYWdyYW1EaXIgPSBwbHVnaW5EaXIgKyBGaWxlLnNlcGFyYXRvciArIHJlbGF0aXZlRGlyCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBwcm9jLmdldE5hbWUoKSArIEZpbGUuc2VwYXJhdG9yOwotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlByaW50OiAiICsgZGlhZ3JhbURpcik7Ci0JCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkaWFncmFtRGlyKTsKLQkJCXJldHVybiBwYXRoOwotCi0JCQkvLwkgcmV0dXJuIHdvcmtzcGFjZVBhdGg7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfSAKLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgZmlsZSBleGlzdHMgb3Igbm90LgotCSAqIEBwYXJhbSBzekZpbGVOYW1lCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHBhcmFtIGRpYWdyYW1GaWxlQ3JlYXRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldEZpbGUoU3RyaW5nIHN6RmlsZU5hbWUsIEJyZWFrZG93bkVsZW1lbnQgZSwgRGlhZ3JhbUZpbGVDcmVhdG9yIGRpYWdyYW1GaWxlQ3JlYXRvcil7Ci0JCQotCQlQcm9jZXNzIHNyY1Byb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGUpOwotCQkKLQkJSVBhdGggY29udGFpbmVyUGF0aCA9IGdldENvbnRhaW5lclBhdGgoZSk7Ci0JCVN0cmluZyBzek5ld0ZpbGVOYW1lID0gc3pGaWxlTmFtZTsJCQotCQlJUGF0aCBmaWxlUGF0aCA9IGNvbnRhaW5lclBhdGguYXBwZW5kKGRpYWdyYW1GaWxlQ3JlYXRvci5hcHBlbmRFeHRlbnNpb25Ub0ZpbGVOYW1lKHN6TmV3RmlsZU5hbWUpKTsKLS8vCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLS8vCQlpZih3b3Jrc3BhY2VSb290LmV4aXN0cyhmaWxlUGF0aCkpewotLy8JCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKTsKLS8vCQkJaWYoZmlsZS5leGlzdHMoKSl7Ci0vLwkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJfQotLy8JCX0KLQkJRmlsZSBsaWJEaXJzID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSk7Ci0JCVN0cmluZyBkaWFncmFtUGF0aCA9IGxpYkRpcnMuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCQkrIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0RWxlbWVudFBhdGgoc3JjUHJvYykKLQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHNyY1Byb2MuZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCQkJKyAiZGlhZ3JhbS54bWkiOwotCQlGaWxlIGZpbGV4ID0gbmV3IEZpbGUoZGlhZ3JhbVBhdGgpOwotCQlpZihmaWxleC5leGlzdHMoKSl7Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG1vdmVkIHRvIExpYnJhcnlFZGl0IG9yIFVzZSBOZXN0ZWRDb21tYW5kcyB1c2luZyBleHRlbnNpb24uCi0JICogQHBhcmFtIGNvbW1hbmQyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29weURpYWdyYW1zKEFjdGl2aXR5RHJvcENvbW1hbmQgY29tbWFuZDIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBJRGlhZ3JhbVNlcnZpY2UuZUluc3RhbmNlLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQkJSGVscGVyIGNvcHlIZWxwZXIgPSBuZXcgSGVscGVyKCk7Ci0JCUhlbHBlciBjb3BpZWRIZWxwZXIgPSBjb21tYW5kMi5nZXRBY3Rpdml0eUhhbmRsZXIoKS5nZXRDb3B5SGVscGVyKCk7Ci0JCVNldCBrZXlzID0gY29waWVkSGVscGVyLmtleVNldCgpOwotCQlDb21wb3VuZENvbW1hbmQgY29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoQ29tcG91bmRDb21tYW5kLk1FUkdFX0NPTU1BTkRfQUxMKTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGtleSA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCUVPYmplY3QgZW50cnkgPSAoRU9iamVjdCljb3BpZWRIZWxwZXIuZ2V0KGtleSk7Ci0JCQlpZihlbnRyeSBpbnN0YW5jZW9mIEFjdGl2aXR5ICYmIGtleSBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpZW50cnk7Ci0JCQkJLy9UT0RPOiBIYW5kbGUgZGlmZmVyZW50IGRpYWdyYW1zLgotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IElEaWFncmFtU2VydmljZS5lSW5zdGFuY2UuZ2V0RGlhZ3JhbSgoQWN0aXZpdHkpa2V5LCBEaWFncmFtU2VydmljZS5BRF9raW5kLCAKLQkJCQkJCWZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlpZihkaWFncmFtICE9IG51bGwpewotLy8JCQkJCUNvcHlEaWFncmFtRWxlbWVudENvbW1hbmQgY21kID0gbmV3IENvcHlEaWFncmFtRWxlbWVudENvbW1hbmQoCi0vLwkJCQkJCQlkb21haW4sZGlhZ3JhbS5nZXRFbGVtZW50KCksY29weUhlbHBlcixhY3QgKTsKLS8vCQkJCQljb21tYW5kLmFwcGVuZChjbWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0cnl7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJCVByb2Nlc3MgcCA9IGNvbW1hbmQyLmdldEFjdGl2aXR5SGFuZGxlcigpLmdldFRhcmdldFByb2Nlc3MoKTsKLQkJCS8vIE5lZWQgdG8gbW92ZSB0aGlzIGNvZGUgdG8gZGlmZmVyZW50IHBsYWNlLgotLy8JCQlwLmdldEJyCi0JCQlJRmlsZSBmaWxlID0gRGlhZ3JhbUVkaXRvclV0aWwuZ2V0RmlsZShkZWZhdWx0X2ZpbGVfbmFtZSwgKEJyZWFrZG93bkVsZW1lbnQpcCwgRGlhZ3JhbUZpbGVDcmVhdG9yRXguZ2V0SW5zdGFuY2UoKSk7Ci0JCQlpZihmaWxlID09IG51bGwpewotCQkJCWZpbGUgPSBjcmVhdGVOZXdEaWFncmFtRmlsZShEaWFncmFtRmlsZUNyZWF0b3JFeC5nZXRJbnN0YW5jZSgpLCBwLCBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCAKLQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCQkJU2V0IHhLZXlzID0gY29weUhlbHBlci5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHhLZXlzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSl7Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJCUxpc3QgYWZmZWN0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWFmZmVjdGVkRmlsZXMuYWRkKGZpbGUpOwotCQkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCgKLQkJCQkJZG9tYWluLCAiY29weSBkaWFncmFtcyIsIGFmZmVjdGVkRmlsZXMpIHsKLQkJCQotCQkJCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCi0JCQl9OwotCQkJCi0JCQkKLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQotCQl9Ci0JCWZpbmFsbHl7Ci0JCQljb21tYW5kLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2l0aGluIGEgd29ya3NwYWNlIG1vZGlmeSBvcGVyYXRpb24gc2luY2UgaXQgY3JlYXRlcyByZXNvdXJjZXMuCi0JICogPC9wPgotCSAqIEBtb2RpZmllZAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgZmlsZSByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGZpbGUgd2FzIG5vdCBjcmVhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRmlsZSBjcmVhdGVOZXdEaWFncmFtRmlsZSgKLQkJCURpYWdyYW1GaWxlQ3JlYXRvckV4IGRpYWdyYW1GaWxlQ3JlYXRvciwgQnJlYWtkb3duRWxlbWVudCBlbGVtZW50LCAKLQkJCVNoZWxsIHNoZWxsLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciApIHsKLQkJCi0JCWZpbmFsIElQYXRoIGNvbnRhaW5lclBhdGggPSBnZXRDb250YWluZXJQYXRoKGVsZW1lbnQpOwotCQlmaW5hbCBTdHJpbmcgZGlhZ3JhbUZpbGVOYW1lID0gRGlhZ3JhbUZpbGVDcmVhdG9yRXguZGVmYXVsdF9kaWFncmFtX2ZpbGU7Ci0JCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIkNyZWF0aW5nIG5vdGF0aW9uIGRpYWdyYW0gYW5kIG1vZGVsIGZpbGUiLCA0KTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHN1YlByb2dyZXNzTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IoCi0JCQkJcHJvZ3Jlc3NNb25pdG9yLCAxKTsKLQkJZmluYWwgSUZpbGUgZGlhZ3JhbUZpbGUgPSBkaWFncmFtRmlsZUNyZWF0b3IuY3JlYXRlTmV3RmlsZSgKLQkJCQljb250YWluZXJQYXRoLCBkaWFncmFtRmlsZU5hbWUsIAotCQkJCWdldEluaXRpYWxDb250ZW50cygpLCBzaGVsbCwKLQkJCQluZXcgSVJ1bm5hYmxlQ29udGV4dCgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKGJvb2xlYW4gZm9yaywgYm9vbGVhbiBjYW5jZWxhYmxlLAotCQkJCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQlydW5uYWJsZS5ydW4oc3ViUHJvZ3Jlc3NNb25pdG9yKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJLy9jcmVhdGVEaWFncmFtQ29udGVudChkaWFncmFtRmlsZSwgcHJvZ3Jlc3NNb25pdG9yLCBpbnB1dCk7Ci0JCXByb2dyZXNzTW9uaXRvci5kb25lKCk7Ci0JCXJldHVybiBkaWFncmFtRmlsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS91dGlsL0lEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3V0aWwvSURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODUxNTAzLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3V0aWwvSURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEFkYXB0ZXIgewotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oKTsKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3V0aWwvSVZpZXdDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9JVmlld0NoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDk0ZjYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9JVmlld0NoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqICBMaXN0ZW5zIHRvIGNoYW5nZXMgaW4gVmlldy4gU2ltaWxhciB0byBPbGQgRGlhZ3JhbSBjb2RlLgotICogIFJlcGxpY2Egb2YgSU5vZGVDaGFuZ2VMaXN0ZW5lcihvZiBlcGYgZGlhZ3JhbSkKLSAqCVNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmlld0NoYW5nZUxpc3RlbmVyIGV4dGVuZHMgQWRhcHRlciB7Ci0JCi0JcHVibGljIFZpZXcgZ2V0VmlldygpOwotCQotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCk7Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS91dGlsL1VtYVVtbFV0aWwuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3V0aWwvVW1hVW1sVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDdhZjZhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3V0aWwvVW1hVW1sVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk5hbWVkRWxlbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIga2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbWFVbWxVdGlsIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBVbWFVbWxVdGlsKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW1hR3VpZEZyb21VbWxFbGVtZW50KE5hbWVkRWxlbWVudCBuZSl7Ci0JCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gbmUuZ2V0RUFubm90YXRpb24oQ29uc3RhbnRzLlVNQV9TT1VSQ0UpOwotCQlpZihlQW5ub3RhdGlvbiAhPSBudWxsKXsKLQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgZUFubm90YXRpb24uZ2V0RGV0YWlscygpLmdldCgKLQkJCQkJQ29uc3RhbnRzLlVNQV9FTEVNRU5UX0dVSUQpOwotCQkJcmV0dXJuIGd1aWQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVFQW5ub3RhdGlvbkZvclVtbChOYW1lZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGd1aWQpewotCQlpZihlbGVtZW50LmdldEVBbm5vdGF0aW9uKENvbnN0YW50cy5VTUFfU09VUkNFKSA9PSBudWxsKXsKLQkJCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJZUFubm90YXRpb24uc2V0U291cmNlKENvbnN0YW50cy5VTUFfU09VUkNFKTsKLQkJCWVBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoQ29uc3RhbnRzLlVNQV9FTEVNRU5UX0dVSUQsIGd1aWQpOwotCQkJZWxlbWVudC5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoZUFubm90YXRpb24pOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVFQW5ub3RhdGlvbkZvclVtbChOYW1lZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGd1aWQpewotCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbiA9IGVsZW1lbnQuZ2V0RUFubm90YXRpb24oQ29uc3RhbnRzLlVNQV9TT1VSQ0UpOwotCQlpZihlQW5ub3RhdGlvbiA9PSBudWxsKXsKLQkJCWNyZWF0ZUVBbm5vdGF0aW9uRm9yVW1sKGVsZW1lbnQsIGd1aWQpOwotCQl9ZWxzZXsKLQkJCWVBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoQ29uc3RhbnRzLlVNQV9FTEVNRU5UX0dVSUQsIGd1aWQpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRVbWFFbGVtZW50KE5hbWVkRWxlbWVudCB1bWxFbGVtZW50KXsKLQotCQlTdHJpbmcgdW1hR3VpZCA9IGdldFVtYUd1aWRGcm9tVW1sRWxlbWVudCh1bWxFbGVtZW50KTsKLQkJaWYodW1hR3VpZCAhPSBudWxsICYmIHVtYUd1aWQgIT0gIiIpewotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYobWFuYWdlciAhPSBudWxsKXsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQodW1hR3VpZCk7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRVbWFFbGVtZW50KFZpZXcgdmlldyl7Ci0JCQotCQlOYW1lZEVsZW1lbnQgdW1sRWxlbWVudCA9IChOYW1lZEVsZW1lbnQpdmlldy5nZXRFbGVtZW50KCk7Ci0JCVN0cmluZyB1bWFHdWlkID0gZ2V0VW1hR3VpZEZyb21VbWxFbGVtZW50KHVtbEVsZW1lbnQpOwotCQlpZih1bWFHdWlkICE9IG51bGwgJiYgdW1hR3VpZCAhPSAiIil7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZihtYW5hZ2VyICE9IG51bGwpewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudCh1bWFHdWlkKTsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVVtYU9iamVjdChWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gY29udGFpbmVyVmlldwotCQkJCS5nZXRFQW5ub3RhdGlvbihDb25zdGFudHMuVU1BX1NPVVJDRSk7Ci0JCVN0cmluZyBndWlkID0gKFN0cmluZykgZUFubm90YXRpb24uZ2V0RGV0YWlscygpLmdldCgKLQkJCQlDb25zdGFudHMuVU1BX0VMRU1FTlRfR1VJRCk7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQlBY3Rpdml0eSBzdWJhY3Rpdml0eSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5KCk7Ci0JCQkJKChBY3Rpdml0eSllbGVtZW50KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChzdWJhY3Rpdml0eSk7Ci0JCQkJU3RyaW5nIHN1YklkID0gVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKTsKLQkJCQlzdWJhY3Rpdml0eS5zZXRHdWlkKHN1YklkKTsKLQkJCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbjIgPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQkJZUFubm90YXRpb24yLnNldFNvdXJjZShDb25zdGFudHMuVU1BX1NPVVJDRSk7Ci0JCQkJZUFubm90YXRpb24yLmdldERldGFpbHMoKS5wdXQoQ29uc3RhbnRzLlVNQV9FTEVNRU5UX0dVSUQsIHN1YklkKTsKLQkJCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChlQW5ub3RhdGlvbjIpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9WYWxpZGF0aW9uVXRpbC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9WYWxpZGF0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWYzMjk1Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3V0aWwvVmFsaWRhdGlvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBza2Fubm9vcgotICoKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25VdGlsIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uVXRpbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS92aWV3L0RpYWdyYW1JbXBsLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS92aWV3L0RpYWdyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNWUxY2IuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2Uvdmlldy9EaWFncmFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWwuRGlhZ3JhbUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWwuSURpYWdyYW1DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS51dGlsLlVtYVVtbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk5hbWVkRWxlbWVudDsKLQotLyoqCi0gKiBFeHRlbmRlZCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uaW1wbC5EaWFncmFtSW1wbH0KLSAqIHRvIGFkZCBhZGFwdGVycyB0byBVTUEge0BsaW5rIE1ldGhvZEVsZW1lbnR9IGFuZCB7QGxpbmsgRGlhZ3JhbX0gICAKLSAqIAotICogTm90IFVzZWZ1bCAsIG5vdCBjb21wbGV0ZS4gVGVtcG9yYXJ5IHNvbHV0aW9uLiBEZWZlY3QgYXQgdGltZSBvZiByZXNvdXJjZSBsb2FkLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JbXBsIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uaW1wbC5EaWFncmFtSW1wbCB7Ci0KLQlPYmplY3Qgb2JqZWN0OwotCXByaXZhdGUgYm9vbGVhbiBub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsgCi0JcHJpdmF0ZSBib29sZWFuIHJlYWRPbmx5ID0gZmFsc2U7Ci0JcHJvdGVjdGVkIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgZGlhZ3JhbUNoYW5nZUxpc3RlbmVyOwotCXByaXZhdGUgQWN0aXZpdHkgYmFzZUFjdDsKLQkKLQkvLyBzdGlsbCBuZWVkIHRvIHVzZSBiZWxvdyB0aGVzZQotCXByaXZhdGUgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXI7Ci0JcHJvdGVjdGVkIElGaWx0ZXIgZmlsdGVyOwotCQotCXB1YmxpYyBEaWFncmFtSW1wbCgpIHsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5pbXBsLlZpZXdJbXBsI3NldEVsZW1lbnQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChFT2JqZWN0IG5ld0VsZW1lbnQpIHsKLQkJc3VwZXIuc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQkJLy8gQ2hlY2sgZm9yIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGFuZCByZWFkb25seS4KLQkJb2JqZWN0ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbigoRU1vZGVsRWxlbWVudCluZXdFbGVtZW50KTsKLQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQlBY3Rpdml0eSBlID0gKEFjdGl2aXR5KSBvYmplY3Q7Ci0JCQlpZiAoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoZSkpIHsKLQkJCQliYXNlQWN0ID0gKEFjdGl2aXR5KSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCX0KLQkJCWJhc2VBY3QgPSBudWxsOwotCQkJCi0JCQlpZihkaWFncmFtQ2hhbmdlTGlzdGVuZXIgPT1udWxsKXsKLQkJCQlkaWFncmFtQ2hhbmdlTGlzdGVuZXIgPSBuZXcgQWN0aXZpdHlEaWFncmFtQ2hhbmdlTGlzdGVuZXIoZSwgdGhpcyk7Ci0JCQl9Ci0KLQkJCWlmKGRpYWdyYW1DaGFuZ2VMaXN0ZW5lciAhPSBudWxsKXsKLQkJCQllLmVBZGFwdGVycygpLmFkZChkaWFncmFtQ2hhbmdlTGlzdGVuZXIpOwotCQkJfQotCQkJCi0JCQlpZiAoYmFzZUFjdCAhPSBudWxsKSB7Ci0JCQkJYmFzZUFjdC5lQWRhcHRlcnMoKS5hZGQoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyKTsKLQkJCX0KLQkJCXRoaXMuZUFkYXB0ZXJzKCkuYWRkKG5ldyBEaWFncmFtTm90YXRpb25DaGFuZ2VMaXN0ZW5lcigpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUbyBzZXQgdGhlIFVtYUVsZW1lbnQgb2JqZWN0IGNhbiBiZSB7QGxpbmsgQWN0aXZpdHl9IG9yIHtAbGluayBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcn0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbWFFbGVtZW50KE9iamVjdCBvYmplY3QpewotCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQl9Ci0JCi0KLQkvKioKLQkgKiAKLQkgKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLQkgKgotCSAqLwotCXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIERpYWdyYW1DaGFuZ2VMaXN0ZW5lcnsKLQkJcHVibGljIEFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyKE1ldGhvZEVsZW1lbnQgZSwgRGlhZ3JhbSBkKSB7Ci0JCQlzdXBlcihlLCBkKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCApCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQkvL09iamVjdCBvYmo7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOgotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmaWNhdGlvbiBBZGQiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmaWNhdGlvbiBSZW1vdmVkIik7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmaWNhdGlvbiBBRERfTUFOWSIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZmljYXRpb24gUkVNT1ZFX01BTlkiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZmljYXRpb24gTU9WRSIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0JCQl9Ci0JCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0JICoKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRGlhZ3JhbU5vdGF0aW9uQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVySW1wbHsKLQkJCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKCFub3RpZmljYXRpb25FbmFibGVkKQotCQkJCXJldHVybjsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJLy9BY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChEaWFncmFtLmNsYXNzKSkgewotCQkJCWNhc2UgTm90YXRpb25QYWNrYWdlLkRJQUdSQU1fX1BFUlNJU1RFRF9DSElMRFJFTjoKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIubm90aWZ5Q2hhbmdlZCgpOiBpbmRleD0iICsKLQkJCQkJLy8gbXNnLmdldFBvc2l0aW9uKCkpOwotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb247Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJCW5vZGVBZGRlZChtc2cuZ2V0UG9zaXRpb24oKSwgbXNnCi0JCQkJCQkJCS5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJbm9kZVJlbW92ZWQobXNnLmdldE9sZFZhbHVlKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3Qgbm9kZSA9ICBpdGVyLm5leHQoKTsKLQkJCQkJCQlub2RlQWRkZWQobXNnLmdldFBvc2l0aW9uKCksIG5vZGUpOwotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW5vZGVSZW1vdmVkKGl0ZXIubmV4dCgpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgbm9kZUFkZGVkKGludCBwb3NpdGlvbiwgT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiTm90YXRpb24gbm90aWZpY2F0aW9uIGFkZCIrb2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RhdGlvbiBub3RpZmljYXRpb24gcmVtb3ZlIiArIG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBleHRyYWN0Q2hpbGRyZW4oSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIsIE9iamVjdCBvYmplY3QsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJLy8gZGlzYWJsZSByb2xsdXAgYmVmb3JlIGdldHRpbmcgdGhlIGNoaWxkcmVuCi0JCS8vCi0JCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSBmYWxzZTsKLQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpYWRhcHRlcjsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJfQotCQllbHNlIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpewotCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcjsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQkvLyBmaWx0ZXIgb3V0IHRoZSBzdXBwcmVzc2VkIGVsZW1lbnRzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmKCFnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChjaGlsZCkpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGRvbid0IGZpbHRlciBzdXBwcmVzc2VkIGVsZW1lbnRzCi0JCQkvLwotCQkJLy9jaGlsZHJlbi5hZGRBbGwoYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIHJlc3RvcmUgdGhlIHJvbGxlZC11cCBmbGFnCi0JCQkvLwotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCSgoSUJTSXRlbVByb3ZpZGVyKWFkYXB0ZXIpLnNldFJvbGxlZFVwKG9sZFJvbGxlZFVwKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKSB7Ci0JCXJldHVybiBzdXBwcmVzc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc2lvbihTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQl0aGlzLnN1cHByZXNzaW9uID0gc3VwcHJlc3Npb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvY29tbWFuZHMvVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2NvbW1hbmRzL1VNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OWJkNDUuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvY29tbWFuZHMvVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQgZXh0ZW5kcwotCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElBZGFwdGFibGUgZWRnZUFkYXB0b3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kKAotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGVkaXRpbmdEb21haW4sIGxhYmVsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWZmZWN0ZWRGaWxlcygpIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGVkZ2VBZGFwdG9yLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRXb3Jrc3BhY2VGaWxlcyh2aWV3KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRGaWxlcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUFkYXB0YWJsZSBnZXRFZGdlQWRhcHRvcigpIHsKLQkJcmV0dXJuIGVkZ2VBZGFwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGdlQWRhcHRvcihJQWRhcHRhYmxlIGVkZ2VBZGFwdG9yKSB7Ci0JCXRoaXMuZWRnZUFkYXB0b3IgPSBlZGdlQWRhcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKiAJICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHsKLQkJLy8gICAgYXNzZXJ0IG51bGwgIT0gZWRnZUFkYXB0b3IgOiAiTnVsbCBjaGlsZCBpbiBVTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQkJRWRnZSBlZGdlID0gKEVkZ2UpIGdldEVkZ2VBZGFwdG9yKCkuZ2V0QWRhcHRlcihFZGdlLmNsYXNzKTsKLQkJLy8gICAgYXNzZXJ0IG51bGwgIT0gZWRnZSA6ICJOdWxsIGVkZ2UgaW4gVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0KLQkJVmlldyB0ZW1wVmlldyA9IGVkZ2UuZ2V0U291cmNlKCk7Ci0JCWVkZ2Uuc2V0U291cmNlKGVkZ2UuZ2V0VGFyZ2V0KCkpOwotCQllZGdlLnNldFRhcmdldCh0ZW1wVmlldyk7Ci0KLQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9BY3Rpdml0eUVkaXRIZWxwZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvQWN0aXZpdHlFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NjkwYmYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9BY3Rpdml0eUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvQWN0aXZpdHlGaW5hbE5vZGVFZGl0SGVscGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL0FjdGl2aXR5RmluYWxOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzJmZDA2Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvQWN0aXZpdHlGaW5hbE5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2Q3YmI4Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlckFkdmljZS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNmRjMjguLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lZGl0aGVscGVyLkFic3RyYWN0RWRpdEhlbHBlckFkdmljZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlIGV4dGVuZHMKLQkJQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3MzM4ZC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXJBZHZpY2UuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTg1NjkuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXJBZHZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlckFkdmljZSBleHRlbmRzIEFic3RyYWN0RWRpdEhlbHBlckFkdmljZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9Db250cm9sRmxvd0VkaXRIZWxwZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvQ29udHJvbEZsb3dFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYmZlZDEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9Db250cm9sRmxvd0VkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvRGVjaXNpb25Ob2RlRWRpdEhlbHBlci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9EZWNpc2lvbk5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZjE2NzYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9EZWNpc2lvbk5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9Gb3JrTm9kZUVkaXRIZWxwZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvRm9ya05vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NTRhNmIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9Gb3JrTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvSW5pdGlhbE5vZGVFZGl0SGVscGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL0luaXRpYWxOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGFjNWFjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvSW5pdGlhbE5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL0pvaW5Ob2RlRWRpdEhlbHBlci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9Kb2luTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYzOTZmNS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL0pvaW5Ob2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9NZXJnZU5vZGVFZGl0SGVscGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL01lcmdlTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBjMTM5OC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL01lcmdlTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL09iamVjdE5vZGVFZGl0SGVscGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL09iamVjdE5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNWYyM2YuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9PYmplY3ROb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3ROb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdEhlbHBlckFkdmljZS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRIZWxwZXJBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzYTc1NC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdEhlbHBlckFkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWRpdGhlbHBlci5BYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0SGVscGVyQWR2aWNlIGV4dGVuZHMKLQkJQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMTNlZGYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyQWR2aWNlLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZTVhZTMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlckFkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWRpdGhlbHBlci5BYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXJBZHZpY2UgZXh0ZW5kcwotCQlBYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2UgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvVU1MQmFzZUVkaXRIZWxwZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvVU1MQmFzZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1OTcyZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL1VNTEJhc2VFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lZGl0aGVscGVyLkFic3RyYWN0RWRpdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuSUVkaXRDb21tYW5kUmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxCYXNlRWRpdEhlbHBlciBleHRlbmRzIEFic3RyYWN0RWRpdEhlbHBlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9QT0xJQ1lfQ09NTUFORCA9ICJlZGl0IHBvbGljeSBjb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRJbnN0ZWFkQ29tbWFuZChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcSkgewotCQlJQ29tbWFuZCBlcENvbW1hbmQgPSAoSUNvbW1hbmQpIHJlcS5nZXRQYXJhbWV0ZXIoRURJVF9QT0xJQ1lfQ09NTUFORCk7Ci0JCXJlcS5zZXRQYXJhbWV0ZXIoRURJVF9QT0xJQ1lfQ09NTUFORCwgbnVsbCk7Ci0JCUlDb21tYW5kIGVoQ29tbWFuZCA9IHN1cGVyLmdldEluc3RlYWRDb21tYW5kKHJlcSk7Ci0JCWlmIChlcENvbW1hbmQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGVoQ29tbWFuZDsKLQkJfQotCQlpZiAoZWhDb21tYW5kID09IG51bGwpIHsKLQkJCXJldHVybiBlcENvbW1hbmQ7Ci0JCX0KLQkJQ29tcG9zaXRlQ29tbWFuZCBjb21tYW5kID0gbmV3IENvbXBvc2l0ZUNvbW1hbmQobnVsbCk7Ci0JCWNvbW1hbmQuYWRkKGVwQ29tbWFuZCk7Ci0JCWNvbW1hbmQuYWRkKGVoQ29tbWFuZCk7Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzA0MDQyLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucG9saWNpZXMuQWN0aXZpdHlYWUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkFjdGl2aXR5SXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlFZGl0UGFydCBleHRlbmRzIERpYWdyYW1FZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ERUxfSUQgPSAiQUQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0KLQkJLy8gbW9kaWZpZWQgU1RBUlQKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlYWUxheW91dEVkaXRQb2xpY3koKSk7Ci0JCS8vIG1vZGlmaWVkIEVORAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmY4OTY5Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5BY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5BY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuTGF5ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlQ2hpbGQoRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlpZiAoaXNFeHRlcm5hbExhYmVsKGNoaWxkKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXN1cGVyLmRlY29yYXRlQ2hpbGQoY2hpbGQpOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kgeGxlcCA9IG5ldyBVTUxFeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHRlcm5hbExhYmVsKEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQudGhpcy5pc0V4dGVybmFsTGFiZWwoZWRpdFBhcnQpOwotCQkJfQotCQl9OwotCQl4bGVwLnNldFJlYWxMYXlvdXRFZGl0UG9saWN5KGxlcCk7Ci0JCXJldHVybiB4bGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCUVuZE5vZGVGaWd1cmUgZmlndXJlID0gbmV3IEVuZE5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVuZE5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKEVuZE5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoMjQpLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDI0KSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4dGVybmFsTGFiZWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldEV4dGVybmFsTGFiZWxzQ29udGFpbmVyKCkgewotCQlMYXllck1hbmFnZXIgcm9vdCA9IChMYXllck1hbmFnZXIpIGdldFJvb3QoKTsKLQkJcmV0dXJuIHJvb3QuZ2V0TGF5ZXIoVU1MRWRpdFBhcnRGYWN0b3J5LkVYVEVSTkFMX05PREVfTEFCRUxTX0xBWUVSKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChpc0V4dGVybmFsTGFiZWwoY2hpbGRFZGl0UGFydCkpIHsKLQkJCUlGaWd1cmUgbGFiZWxGaWd1cmUgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuZ2V0RmlndXJlKCk7Ci0JCQlnZXRFeHRlcm5hbExhYmVsc0NvbnRhaW5lcigpLmFkZChsYWJlbEZpZ3VyZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChpc0V4dGVybmFsTGFiZWwoY2hpbGRFZGl0UGFydCkpIHsKLQkJCUlGaWd1cmUgbGFiZWxGaWd1cmUgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuZ2V0RmlndXJlKCk7Ci0JCQlnZXRFeHRlcm5hbExhYmVsc0NvbnRhaW5lcigpLnJlbW92ZShsYWJlbEZpZ3VyZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmeSgpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgY2hpbGRFZGl0UGFydCA9IChFZGl0UGFydCkgaXQubmV4dCgpOwotCQkJaWYgKGlzRXh0ZXJuYWxMYWJlbChjaGlsZEVkaXRQYXJ0KSkgewotCQkJCUlGaWd1cmUgbGFiZWxGaWd1cmUgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkJLmdldEZpZ3VyZSgpOwotCQkJCWdldEV4dGVybmFsTGFiZWxzQ29udGFpbmVyKCkucmVtb3ZlKGxhYmVsRmlndXJlKTsKLQkJCX0KLQkJfQotCQlzdXBlci5yZW1vdmVOb3RpZnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRW5kTm9kZUZpZ3VyZSBleHRlbmRzCi0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5maWd1cmVzLkVuZE5vZGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgRW5kTm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlCi0KLQkJCSk7Ci0JCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihFTkROT0RFRklHVVJFX0JBQ0sKLQotCQkJKTsKLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgKLQkJCQkJMjQpKTsKLQkJCXRoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCkpOwotCi0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgRU5ETk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcigKLQkJCW51bGwsIDQ1LCA4NSwgMTMwKTsKLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NjgwNDcuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRVBGRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIFVNTEV4dE5vZGVMYWJlbEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgewotCQlyZWdpc3RlclNuYXBCYWNrUG9zaXRpb24oVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksIG5ldyBQb2ludCgwLAotCQkJCTApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5RmluYWxOb2RlXzEwMDE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7Ci0JCXJldHVybiBuZXcgV3JhcExhYmVsKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2ZhYTY3Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDEyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZmlndXJlID0gbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydCkgewotCQkJKChBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkKLQkJCQkJCQkuZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIGV4dGVuZHMKLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlKCkgewotCi0JCQl0aGlzLnNldE91dGxpbmUoZmFsc2UpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsKLQotCQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7Ci0JCQlzZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoZmlnXzApOwotCi0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKCkgewotCQkJcmV0dXJuIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCgKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKSB7Ci0JCQlmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NGJiZGUuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDA5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCUFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQpIHsKLQkJCSgoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkKLQkJCQkJCQkuZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZXh0ZW5kcwotCQkJb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0T3V0bGluZShmYWxzZSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOwotCi0JCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsKLQkJCXNldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoKSB7Ci0JCQlyZXR1cm4gZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKAotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpIHsKLQkJCWZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NGQ5NWEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDExOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcExhYmVsIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCS8vcmV0dXJuIG51bGw7Ci0JCXJldHVybiBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoCi0JCQkJImRpYWdyYW0vbWlsZXN0b25lLmdpZiIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJaWYgKERpYWdyYW1Db3JlVXRpbC5pc1JlYWRPbmx5KHRoaXMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMjsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLAotCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwKLQkJCQkJVU1MRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkgewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCQkJCSgoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQkJcmV0dXJuIERpYWdyYW1Db3JlVXRpbC52YWxpZFN0cmluZ0ZvckJyZWFrZG93bkVsZW1lbnRzKAotCQkJCQkJCWdldEVkaXRQYXJ0KCksIHR4dCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBjID0gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcih0aGlzKTsKLQkJaWYgKGMgIT0gbnVsbCkgewotCQkJY29sb3IgPSBjOwotCQl9Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNWE4MjAuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydAotCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwODsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcExhYmVsIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCS8vCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgKLQkJCQkiZGlhZ3JhbS90YXNrZGVzY3JpcHRvci5naWYiKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCWlmIChEaWFncmFtQ29yZVV0aWwuaXNSZWFkT25seSh0aGlzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywKLQkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksCi0JCQkJCVVNTEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpIHsKLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQkJCQkoKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQkJcmV0dXJuIERpYWdyYW1Db3JlVXRpbC52YWxpZFN0cmluZ0ZvckJyZWFrZG93bkVsZW1lbnRzKAotCQkJCQkJCWdldEVkaXRQYXJ0KCksIHR4dCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBjID0gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcih0aGlzKTsKLQkJaWYgKGMgIT0gbnVsbCkgewotCQkJY29sb3IgPSBjOwotCQl9Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDcxZWM2Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb24yR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb24ySXRlbVNlbWFudGljRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVTaGFwZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuWFlMYXlvdXRFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDIwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb24yR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb24yQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJWFlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBYWUxheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gc3VwZXIuY3JlYXRlQ2hpbGRFZGl0UG9saWN5KGNoaWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG5ldyBSZXNpemFibGVTaGFwZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBmaWd1cmUgPSBuZXcgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCkgewotCQkJKChBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpLmdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGcmVlZm9ybUxheW91dCgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0Q29uc3RyYWludChJRmlndXJlIGZpZ3VyZSkgewotCQkJCQlPYmplY3QgcmVzdWx0ID0gY29uc3RyYWludHMuZ2V0KGZpZ3VyZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkJcmVzdWx0ID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAtMSwgLTEpOwotCQkJCQl9Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGV4dGVuZHMKLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKSB7Ci0KLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0KCk7Ci0KLQkJCXRoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOwotCi0JCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuYmxhY2sKLQotCQkJKTsKLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0sKLQotCQkJKTsKLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDQwMCksIGdldE1hcE1vZGUoKQotCQkJCQkuRFB0b0xQKDgwMCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMDApKTsKLQkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcigpKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOwotCi0JCQlzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlBhcnRpdGlvbkxhYmVsRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkgewotCQkJcmV0dXJuIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoCi0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZykgewotCQkJZlBhcnRpdGlvbkxhYmVsRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcigKLQkJCW51bGwsIDI1NSwgMjU1LCAyNTUpOwotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlN2E0ODcuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbkNyZWF0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbkRlbGVnYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZVNoYXBlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS51dGlsLk1lYXN1cmVtZW50VW5pdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5HcmF2aXR5Q29uc3RyYWluZWRGbG93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkdyYXZpdHlEaXJlY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLklNYXBNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDg7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGlvbkVkaXRQb2xpY3koKSk7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJcmVtb3ZlRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koCi0JCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25DYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvbkxheW91dEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KAotCQkJCUVkaXRQb2xpY3kuQ09OVEFJTkVSX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uRGVsZWdhdGlvbkVkaXRQb2xpY3koCi0JCQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCQkJRWRpdFBvbGljeS5DT05UQUlORVJfUk9MRSkpOwotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCVhZTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgWFlMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IHN1cGVyLmNyZWF0ZUNoaWxkRWRpdFBvbGljeShjaGlsZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBuZXcgUmVzaXphYmxlU2hhcGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZmlndXJlID0gbmV3IEFjdGl2aXR5UGFydGl0aW9uRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0KSB7Ci0JCQkoKEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpLmdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobmV3IEdyYXZpdHlDb25zdHJhaW5lZEZsb3dMYXlvdXQoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldENvbnN0cmFpbnQoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJCQkJLy8JCQkJCU9iamVjdCByZXN1bHQgPSBjb25zdHJhaW50cy5nZXQoZmlndXJlKTsKLQkJCQkJLy8JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkvLwkJCQkJCXJlc3VsdCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgLTEsIC0xKTsKLQkJCQkJLy8JCQkJCX0KLQkJCQkJLy8JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCXJldHVybiBzdXBlci5nZXRDb25zdHJhaW50KGZpZ3VyZSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgc2V0R3Jhdml0eShHcmF2aXR5RGlyZWN0aW9uVHlwZSBncmF2aXR5KSB7Ci0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCQkJc3VwZXIuc2V0R3Jhdml0eShHcmF2aXR5RGlyZWN0aW9uVHlwZS5FQVNUKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGV4dGVuZHMKLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKSB7Ci0KLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0KCk7Ci0KLQkJCXRoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOwotCi0JCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuYmxhY2sKLQotCQkJKTsKLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0sKLQotCQkJKTsKLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDQwMCksIGdldE1hcE1vZGUoKQotCQkJCQkuRFB0b0xQKDgwMCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMDApKTsKLQkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcigpKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOwotCi0JCQlzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlBhcnRpdGlvbkxhYmVsRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkgewotCQkJcmV0dXJuIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoCi0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZykgewotCQkJZlBhcnRpdGlvbkxhYmVsRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcigKLQkJCW51bGwsIDI1NSwgMjU1LCAyNTUpOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUVkaXRQYXJ0I3JlZnJlc2hWaXN1YWxzKCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJTm9kZSB2aWV3ID0gKE5vZGUpIGdldENoaWxkVmlld0J5U2VtYW50aWNIaW50KG5ldyBJbnRlZ2VyKAotCQkJCUFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCkpOwotCQlOb2RlIHBhcmVudFZpZXcgPSAoTm9kZSkgZ2V0TW9kZWwoKTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIHZpZXcuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlpZiAobG9jYXRpb24uZ2V0WCgpID4gMCkgewotCQkJSU1hcE1vZGUgbWFwTW9kZSA9IE1lYXN1cmVtZW50VW5pdEhlbHBlci5nZXRNYXBNb2RlKHBhcmVudFZpZXcKLQkJCQkJLmdldERpYWdyYW0oKS5nZXRNZWFzdXJlbWVudFVuaXQoKSk7Ci0JCQlsb2NhdGlvbi5zZXRYKG1hcE1vZGUuRFB0b0xQKDApKTsKLQkJCWxvY2F0aW9uLnNldFkobWFwTW9kZS5EUHRvTFAoNSkpOwotCQl9Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0RWRpdFBhcnQjcmVmcmVzaENoaWxkcmVuKCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2hpbGRyZW4oKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIucmVmcmVzaENoaWxkcmVuKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjRkOGNkLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0SXRlbUltYWdlRGVzY3JpcHRvcihnZXRQYXJzZXJFbGVtZW50KCkpOwotCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzEwMDg7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJcmVmcmVzaEJvdW5kcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsKLQkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCQlEaW1lbnNpb24gc2l6ZSA9IG5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCk7Ci0JCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlQb2ludCBsb2MgPSBuZXcgUG9pbnQoeCwgeSk7Ci0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIG5ldyBSZWN0YW5nbGUobG9jLCBzaXplKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTIyNGRlLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDA2OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0SXRlbUltYWdlRGVzY3JpcHRvcihnZXRQYXJzZXJFbGVtZW50KCkpOwotCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJcmVmcmVzaEJvdW5kcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsKLQkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCQlEaW1lbnNpb24gc2l6ZSA9IG5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCk7Ci0JCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlQb2ludCBsb2MgPSBuZXcgUG9pbnQoeCwgeSk7Ci0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIG5ldyBSZWN0YW5nbGUobG9jLCBzaXplKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2MGVlNS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0IGV4dGVuZHMKLQkJU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7Ci0JCXJldHVybiAiUGFydGl0aW9uQ2FtcGFydG1lbnQiOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXIKLQkJCQkuY3JlYXRlRmlndXJlKCk7Ci0JCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KAotCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLAotCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwKLQkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLy9wdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JLy8JSUZpZ3VyZSByZXN1bHQgPSBzdXBlci5jcmVhdGVGaWd1cmUoKTsKLQkvLwlyZXN1bHQuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKCkpOwotCS8vCXJldHVybiByZXN1bHQ7Ci0JLy99Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoQm91bmRzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7Ci0JCWludCB3aWR0aCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfV2lkdGgoKSkpLmludFZhbHVlKCk7Ci0JCWludCBoZWlnaHQgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTaXplX0hlaWdodCgpKSkuaW50VmFsdWUoKTsKLQkJRGltZW5zaW9uIHNpemUgPSBuZXcgRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJUG9pbnQgbG9jID0gbmV3IFBvaW50KHgsIHkpOwotCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLAotCQkJCWdldEZpZ3VyZSgpLCBuZXcgUmVjdGFuZ2xlKGxvYywgc2l6ZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsKLQkJLy8gbm90aGluZyB0byBkbyAtLSBwYXJlbnQgbGF5b3V0IGRvZXMgbm90IGFjY2VwdCBEb3VibGUgY29uc3RyYWludHMgYXMgcmF0aW8KLQkJLy8gc3VwZXIuc2V0UmF0aW8ocmF0aW8pOyAKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTY1YWJlLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ29udGFpbmVyTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0IGV4dGVuZHMKLQkJU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsKLQkJcmV0dXJuICJQYXJ0aXRpb25DYW1wYXJ0bWVudCI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcgotCQkJCS5jcmVhdGVGaWd1cmUoKTsKLQkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeSgKLQkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLAotCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwKLQkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IENvbnRhaW5lck5vZGVFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBuZXcgWFlMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvL3B1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkvLwlJRmlndXJlIHJlc3VsdCA9IHN1cGVyLmNyZWF0ZUZpZ3VyZSgpOwotCS8vCXJlc3VsdC5zZXRCb3JkZXIobmV3IExpbmVCb3JkZXIoKSk7Ci0JLy8JcmV0dXJuIHJlc3VsdDsKLQkvL30KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hCb3VuZHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChub3RpZmljYXRpb24pOwotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsKLQkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCQlEaW1lbnNpb24gc2l6ZSA9IG5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCk7Ci0JCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlQb2ludCBsb2MgPSBuZXcgUG9pbnQoeCwgeSk7Ci0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIG5ldyBSZWN0YW5nbGUobG9jLCBzaXplKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgewotCQkvLyBub3RoaW5nIHRvIGRvIC0tIHBhcmVudCBsYXlvdXQgZG9lcyBub3QgYWNjZXB0IERvdWJsZSBjb25zdHJhaW50cyBhcyByYXRpbwotCQkvLyBzdXBlci5zZXRSYXRpbyhyYXRpbyk7IAotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0NvbnRyb2xGbG93RWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0NvbnRyb2xGbG93RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4ZWE3ZC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9Db250cm9sRmxvd0VkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkNvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dFZGl0UGFydCBleHRlbmRzIENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRyb2xGbG93RWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBDb250cm9sRmxvd0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sRmxvd0ZpZ3VyZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dGaWd1cmUgZXh0ZW5kcwotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXggewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ29udHJvbEZsb3dGaWd1cmUoKSB7Ci0KLQkJCXNldFRhcmdldERlY29yYXRpb24oY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsKLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbigpOwotCQkJLy8gZGlzcGF0Y2hOZXh0PwotCi0JCQlvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0IHBsID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QoKTsKLQkJCXBsLmFkZFBvaW50KC0xLCAxKTsKLQkJCXBsLmFkZFBvaW50KDAsIDApOwotCQkJcGwuYWRkUG9pbnQoLTEsIC0xKTsKLQkJCWRmLnNldFRlbXBsYXRlKHBsKTsKLQkJCWRmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNyksIGdldE1hcE1vZGUoKS5EUHRvTFAoMykpOwotCi0JCQlyZXR1cm4gZGY7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0NvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMGEwNjAuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd05hbWVFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMTI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyB7Ci0JCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbihVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwgbmV3IFBvaW50KDAsIDQwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250cm9sRmxvd05hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0S2V5UG9pbnQoKSB7Ci0JCXJldHVybiBDb25uZWN0aW9uTG9jYXRvci5NSURETEU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0vLwkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLS8vCQkJCS5nZXRJdGVtSW1hZ2VEZXNjcmlwdG9yKGdldFBhcnNlckVsZW1lbnQoKSk7Ci0vLwkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotLy8JCQlkZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIFVNTEVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sRmxvd0xhYmVsRmlndXJlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd0xhYmVsRmlndXJlIGV4dGVuZHMKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDb250cm9sRmxvd0xhYmVsRmlndXJlKCkgewotCi0JCQl0aGlzLnNldFRleHQoIiIpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9EZWNpc2lvbk5vZGVFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvRGVjaXNpb25Ob2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVmNjczZi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9EZWNpc2lvbk5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmZpZ3VyZXMuRGVjaXNpb25Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkRlY2lzaW9uTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuRGVjaXNpb25Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKiBAbW9kaWZpZWQgYnkgU2hhc2hpZGhhciBLYW5ub29yaS4KLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWNpc2lvbk5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IERlY2lzaW9uTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgRGVjaXNpb25Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgRGVjaXNpb25Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJRGVjaXNpb25EaWFtb25kRmlndXJlIGZpZ3VyZSA9IG5ldyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoRGVjaXNpb25EaWFtb25kRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlyZXR1cm4gbmV3IERlY2lzaW9uTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIGNsYXNzIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSBleHRlbmRzIERlY2lzaW9uTm9kZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSgpIHsKLQotCQkJc3VwZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLAotCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7Ci0JCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUKLQotCQkJKTsKLQotCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0spOwotCi0JCQl0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoCi0JCQkJCTUwKSk7Ci0JCQl0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsKLQotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7Ci0KLQkJCXNldEZpZ3VyZURpYW1vbmRMYWJlbChmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZkRpYW1vbmRMYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVEaWFtb25kTGFiZWwoKSB7Ci0JCQlyZXR1cm4gZkRpYW1vbmRMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlRGlhbW9uZExhYmVsKAotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpIHsKLQkJCWZEaWFtb25kTGFiZWwgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcigKLQkJCW51bGwsIDE4NSwgMjA1LCAyMzApOwotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0RlY2lzaW9uTm9kZU5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDgxOTdjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0RlY2lzaW9uTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUlUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlY2lzaW9uTm9kZU5hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuRGVjaXNpb25Ob2RlXzEwMDU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgewotCQlyZXR1cm4gbmV3IE5vZGVOYW1lRmlndXJlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBOb2RlTmFtZUZpZ3VyZSBleHRlbmRzCi0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTm9kZU5hbWVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0VGV4dCgiPC4uLj4iKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvRm9ya05vZGVFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvRm9ya05vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjFjYjZjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0ZvcmtOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5Gb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuRm9ya05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5Gb3JrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5SZXNpemFibGVFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JrTm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGb3JrTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IEZvcmtOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgRm9ya05vZGVDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlGb3JrTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgRm9ya05vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZvcmtOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChGb3JrTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQb2xpY3kgZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCkgewotCQlSZXNpemFibGVFZGl0UG9saWN5IGVwID0gKFJlc2l6YWJsZUVkaXRQb2xpY3kpIHN1cGVyCi0JCQkJLmdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpOwotCi0JCWVwLnNldFJlc2l6ZURpcmVjdGlvbnMoUG9zaXRpb25Db25zdGFudHMuV0VTVCB8IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QpOwotCi0JCXJldHVybiBlcDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEZvcmtOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBGb3JrTm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRk9SS05PREVGSUdVUkVfQkFDSwotCi0JCQkpOwotCQkJdGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJCS5EUHRvTFAoOCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgRk9SS05PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IoCi0JCQludWxsLCA1MSwgMTAyLCAxMDIpOwotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9Gb3JrTm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvRm9ya05vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4YjE4My4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9Gb3JrTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRm9ya05vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkZvcmtOb2RlXzEwMDM7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgewotCQlyZXR1cm4gbmV3IE5vZGVOYW1lRmlndXJlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBOb2RlTmFtZUZpZ3VyZSBleHRlbmRzCi0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTm9kZU5hbWVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0VGV4dCgiPC4uLj4iKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvSW5pdGlhbE5vZGVFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvSW5pdGlhbE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTc1MTQ0Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0luaXRpYWxOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkluaXRpYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5Jbml0aWFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkluaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5VTUxFeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkxheWVyTWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaXRpYWxOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBJbml0aWFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgSW5pdGlhbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBJbml0aWFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlQ2hpbGQoRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlpZiAoaXNFeHRlcm5hbExhYmVsKGNoaWxkKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXN1cGVyLmRlY29yYXRlQ2hpbGQoY2hpbGQpOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kgeGxlcCA9IG5ldyBVTUxFeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHRlcm5hbExhYmVsKEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCQkJcmV0dXJuIEluaXRpYWxOb2RlRWRpdFBhcnQudGhpcy5pc0V4dGVybmFsTGFiZWwoZWRpdFBhcnQpOwotCQkJfQotCQl9OwotCQl4bGVwLnNldFJlYWxMYXlvdXRFZGl0UG9saWN5KGxlcCk7Ci0JCXJldHVybiB4bGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCUluaXRpYWxOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBJbml0aWFsTm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5pdGlhbE5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKEluaXRpYWxOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCgyMCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShJbml0aWFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHRlcm5hbExhYmVsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBJbml0aWFsTm9kZU5hbWVFZGl0UGFydCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRFeHRlcm5hbExhYmVsc0NvbnRhaW5lcigpIHsKLQkJTGF5ZXJNYW5hZ2VyIHJvb3QgPSAoTGF5ZXJNYW5hZ2VyKSBnZXRSb290KCk7Ci0JCXJldHVybiByb290LmdldExheWVyKFVNTEVkaXRQYXJ0RmFjdG9yeS5FWFRFUk5BTF9OT0RFX0xBQkVMU19MQVlFUik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoaXNFeHRlcm5hbExhYmVsKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlJRmlndXJlIGxhYmVsRmlndXJlID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLmdldEZpZ3VyZSgpOwotCQkJZ2V0RXh0ZXJuYWxMYWJlbHNDb250YWluZXIoKS5hZGQobGFiZWxGaWd1cmUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoaXNFeHRlcm5hbExhYmVsKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlJRmlndXJlIGxhYmVsRmlndXJlID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLmdldEZpZ3VyZSgpOwotCQkJZ2V0RXh0ZXJuYWxMYWJlbHNDb250YWluZXIoKS5yZW1vdmUobGFiZWxGaWd1cmUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVOb3RpZnkoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQgPSAoRWRpdFBhcnQpIGl0Lm5leHQoKTsKLQkJCWlmIChpc0V4dGVybmFsTGFiZWwoY2hpbGRFZGl0UGFydCkpIHsKLQkJCQlJRmlndXJlIGxhYmVsRmlndXJlID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJCS5nZXRGaWd1cmUoKTsKLQkJCQlnZXRFeHRlcm5hbExhYmVsc0NvbnRhaW5lcigpLnJlbW92ZShsYWJlbEZpZ3VyZSk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIucmVtb3ZlTm90aWZ5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBJbml0aWFsTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIEluaXRpYWxOb2RlRmlndXJlKCkgewotCi0JCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUKLQotCQkJKTsKLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKElOSVRJQUxOT0RFRklHVVJFX0JBQ0sKLQotCQkJKTsKLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgKLQkJCQkJMjApKTsKLQkJCXRoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIElOSVRJQUxOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKAotCQkJbnVsbCwgNDUsIDg1LCAxMzApOwotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9Jbml0aWFsTm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U1MjcwNS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9Jbml0aWFsTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgVU1MRXh0Tm9kZUxhYmVsRWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyB7Ci0JCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbihVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwgbmV3IFBvaW50KDAsIDApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkluaXRpYWxOb2RlXzEwMDQ7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7Ci0JCXJldHVybiBuZXcgV3JhcExhYmVsKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9Kb2luTm9kZUVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9Kb2luTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhM2M5YjIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvSm9pbk5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkpvaW5Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5Kb2luTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkpvaW5Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Ob2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwNjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpvaW5Ob2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBKb2luTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgSm9pbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBKb2luTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCUZvcmtOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBGb3JrTm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRm9ya05vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKEZvcmtOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoOCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBvbGljeSBnZXRQcmltYXJ5RHJhZ0VkaXRQb2xpY3koKSB7Ci0JCVJlc2l6YWJsZUVkaXRQb2xpY3kgZXAgPSAoUmVzaXphYmxlRWRpdFBvbGljeSkgc3VwZXIKLQkJCQkuZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCk7Ci0KLQkJZXAuc2V0UmVzaXplRGlyZWN0aW9ucyhQb3NpdGlvbkNvbnN0YW50cy5XRVNUIHwgUG9zaXRpb25Db25zdGFudHMuRUFTVCk7Ci0KLQkJcmV0dXJuIGVwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRm9ya05vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIEZvcmtOb2RlRmlndXJlKCkgewotCi0JCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihGT1JLTk9ERUZJR1VSRV9CQUNLCi0KLQkJCSk7Ci0JCQl0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkKLQkJCQkJLkRQdG9MUCg4KSk7Ci0JCQl0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBGT1JLTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcigKLQkJCW51bGwsIDUxLCAxMDIsIDEwMik7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0pvaW5Ob2RlTmFtZUVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9Kb2luTm9kZU5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGJlMzY2Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0pvaW5Ob2RlTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRVBGRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDY7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKb2luTm9kZU5hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuSm9pbk5vZGVfMTAwNjsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIFVNTEVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7Ci0JCXJldHVybiBuZXcgTm9kZU5hbWVGaWd1cmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIE5vZGVOYW1lRmlndXJlIGV4dGVuZHMKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBOb2RlTmFtZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRUZXh0KCI8Li4uPiIpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9NZXJnZU5vZGVFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvTWVyZ2VOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQzMDkyNy4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9NZXJnZU5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmZpZ3VyZXMuRGVjaXNpb25Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLk1lcmdlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuTWVyZ2VOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAbW9kaWZpZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXJnZU5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IE1lcmdlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgTWVyZ2VOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgTWVyZ2VOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJRGVjaXNpb25EaWFtb25kRmlndXJlIGZpZ3VyZSA9IG5ldyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoRGVjaXNpb25EaWFtb25kRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlyZXR1cm4gbmV3IERlY2lzaW9uTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRGVjaXNpb25EaWFtb25kRmlndXJlIGV4dGVuZHMgRGVjaXNpb25Ob2RlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgRGVjaXNpb25EaWFtb25kRmlndXJlKCkgewotCi0JCQlzdXBlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksCi0JCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsKLQkJCXRoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZQotCi0JCQkpOwotCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0spOwotCQkJdGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKAotCQkJCQk1MCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7Ci0KLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOwotCi0JCQlzZXRGaWd1cmVEaWFtb25kTGFiZWwoZmlnXzApOwotCi0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZEaWFtb25kTGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlRGlhbW9uZExhYmVsKCkgewotCQkJcmV0dXJuIGZEaWFtb25kTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZURpYW1vbmRMYWJlbCgKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKSB7Ci0JCQlmRGlhbW9uZExhYmVsID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IoCi0JCQludWxsLCAxODUsIDIwNSwgMjMwKTsKLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9NZXJnZU5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFhYTc3Yy4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9NZXJnZU5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXJnZU5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLk1lcmdlTm9kZV8xMDAyOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgVU1MRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsKLQkJcmV0dXJuIG5ldyBOb2RlTmFtZUZpZ3VyZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTm9kZU5hbWVGaWd1cmUgZXh0ZW5kcwotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIE5vZGVOYW1lRmlndXJlKCkgewotCi0JCQl0aGlzLnNldFRleHQoIjwuLi4+Iik7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiMjc2Zi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wb2xpY2llcy5PcGVuQURERWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDEwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLCBuZXcgT3BlbkFEREVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZmlndXJlID0gbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQpIHsKLQkJCSgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpCi0JCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKS5nZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMKLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7Ci0JCQlmaWdfMC5zZXRUZXh0KCI8Li4uPiIpOwotCi0JCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsKLQotCQkJc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoZmlnXzApOwotCi0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZOb2RlTmFtZUZpZ3VyZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgpIHsKLQkJCXJldHVybiBmTm9kZU5hbWVGaWd1cmU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKAotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpIHsKLQkJCWZOb2RlTmFtZUZpZ3VyZSA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmNDc3MC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wb2xpY2llcy5PcGVuQURERWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDExOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLCBuZXcgT3BlbkFEREVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZmlndXJlID0gbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQpIHsKLQkJCSgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpCi0JCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKS5nZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMKLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7Ci0JCQlmaWdfMC5zZXRUZXh0KCI8Li4uPiIpOwotCi0JCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsKLQkJCXNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmTm9kZU5hbWVGaWd1cmU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7Ci0JCQlyZXR1cm4gZk5vZGVOYW1lRmlndXJlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKSB7Ci0JCQlmTm9kZU5hbWVGaWd1cmUgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjFhZmNjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucG9saWNpZXMuT3BlbkFEREVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwNzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLCBuZXcgT3BlbkFEREVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZmlndXJlID0gbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCkgewotCQkJKChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkuZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMKLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7Ci0JCQlmaWdfMC5zZXRUZXh0KCI8Li4uPiIpOwotCi0JCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsKLQkJCXNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmTm9kZU5hbWVGaWd1cmU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7Ci0JCQlyZXR1cm4gZk5vZGVOYW1lRmlndXJlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKSB7Ci0JCQlmTm9kZU5hbWVGaWd1cmUgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhYzFkYy4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydAotCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwOTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJLy9yZXR1cm4gbnVsbDsKLQkJcmV0dXJuIEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgKLQkJCQkiZGlhZ3JhbS9waGFzZS5naWYiKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCWlmIChEaWFncmFtQ29yZVV0aWwuaXNSZWFkT25seSh0aGlzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBWYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsCi0JCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLAotCQkJCQlVTUxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSB7Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJCQkJKChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQkJcmV0dXJuIERpYWdyYW1Db3JlVXRpbC52YWxpZFN0cmluZ0ZvckJyZWFrZG93bkVsZW1lbnRzKAotCQkJCQkJCWdldEVkaXRQYXJ0KCksIHR4dCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBjID0gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcih0aGlzKTsKLQkJaWYgKGMgIT0gbnVsbCkgewotCQkJY29sb3IgPSBjOwotCQl9Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDM4MWI0Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRVBGRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDEwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQkvL3JldHVybiBudWxsOwotCQlyZXR1cm4gRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKAotCQkJCSJkaWFncmFtL2l0ZXJhdGlvbi5naWYiKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywKLQkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksCi0JCQkJCVVNTEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpIHsKLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQkJCQkoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKQotCQkJCQkJCS5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQkJCQlyZXR1cm4gRGlhZ3JhbUNvcmVVdGlsLnZhbGlkU3RyaW5nRm9yQnJlYWtkb3duRWxlbWVudHMoCi0JCQkJCQkJZ2V0RWRpdFBhcnQoKSwgdHh0KTsKLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmJmNzc4Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5BY3Rpdml0eURpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCS8vIHJldHVybiBudWxsOwotCQlyZXR1cm4gRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKAotCQkJCSJkaWFncmFtL2FjdGl2aXR5LmdpZiIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJaWYgKERpYWdyYW1Db3JlVXRpbC5pc1JlYWRPbmx5KHRoaXMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDc7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywKLQkJCQkJVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0KLQkJCQkJT2JqZWN0IG9iaiA9IGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQkJCQlFT2JqZWN0IHVtbEUgPSBub2RlLmdldEVsZW1lbnQoKTsKLQkJCQkJCU9iamVjdCBlID0gQnJpZGdlSGVscGVyCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KSB1bWxFKTsKLQkJCQkJCUVPYmplY3QgdW1sQSA9IG5vZGUuZ2V0RGlhZ3JhbSgpLmdldEVsZW1lbnQoKTsKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIgYWRhcHRlciA9IChBY3Rpdml0eURpYWdyYW1BZGFwdGVyKSBCcmlkZ2VIZWxwZXIKLQkJCQkJCQkJLmdldE5vZGVBZGFwdGVyKHVtbEEpOwotCi0JCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tXQlNBY3Rpdml0eVByZXNlbnRhdGlvbk5hbWUoZSwKLQkJCQkJCQkJCXR4dCwgYWRhcHRlci5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0dXJuIFRuZ1V0aWwKLQkJCQkJCQkJCS5jaGVja1dvcmtCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZSgKLQkJCQkJCQkJCQkJZSwgdHh0LCBhZGFwdGVyLmdldFN1cHByZXNzaW9uKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQkJCQkoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCkpCi0JCQkJCQkJLnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvVU1MRWRpdFBhcnRGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9VTUxFZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljNzk5NC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9VTUxFZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxFZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBFZGl0UGFydEZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX05PREVfTEFCRUxTX0xBWUVSID0gIkV4dGVybmFsIE5vZGUgTGFiZWxzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJVmlldyB2aWV3ID0gKFZpZXcpIG1vZGVsOwotCQkJaW50IHZpZXdWaXN1YWxJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7Ci0JCQlzd2l0Y2ggKHZpZXdWaXN1YWxJRCkgewotCQkJY2FzZSBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBNZXJnZU5vZGVFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IE1lcmdlTm9kZU5hbWVFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBGb3JrTm9kZUVkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEluaXRpYWxOb2RlRWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IERlY2lzaW9uTm9kZU5hbWVFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBKb2luTm9kZUVkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIEFjdGl2aXR5RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBDb250cm9sRmxvd0VkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBDb250cm9sRmxvd05hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBDb250cm9sRmxvd05hbWVFZGl0UGFydCh2aWV3KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY3JlYXRlVW5yZWNvZ25pemVkRWRpdFBhcnQoY29udGV4dCwgbW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVkaXRQYXJ0IGNyZWF0ZVVucmVjb2duaXplZEVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotCQkvLyBIYW5kbGUgY3JlYXRpb24gb2YgdW5yZWNvZ25pemVkIGNoaWxkIG5vZGUgRWRpdFBhcnRzIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2VsbEVkaXRvckxvY2F0b3IgZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKAotCQkJSVRleHRBd2FyZUVkaXRQYXJ0IHNvdXJjZSkgewotCQlpZiAoc291cmNlLmdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKQotCQkJcmV0dXJuIG5ldyBUZXh0Q2VsbEVkaXRvckxvY2F0b3IoKFdyYXBMYWJlbCkgc291cmNlLmdldEZpZ3VyZSgpKTsKLQkJZWxzZSB7Ci0JCQlJRmlndXJlIGZpZ3VyZSA9IHNvdXJjZS5nZXRGaWd1cmUoKTsKLQkJCXJldHVybiBuZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcigoTGFiZWwpIGZpZ3VyZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jc3RhdGljIHByaXZhdGUgY2xhc3MgVGV4dENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCB3cmFwTGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBUZXh0Q2VsbEVkaXRvckxvY2F0b3IoV3JhcExhYmVsIHdyYXBMYWJlbCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMud3JhcExhYmVsID0gd3JhcExhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0V3JhcExhYmVsKCkgewotCQkJcmV0dXJuIHdyYXBMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBjZWxsZWRpdG9yLmdldENvbnRyb2woKTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gZ2V0V3JhcExhYmVsKCkuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLQkJCWdldFdyYXBMYWJlbCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0KLQkJCWlmIChnZXRXcmFwTGFiZWwoKS5pc1RleHRXcmFwcGVkKCkKLQkJCQkJJiYgZ2V0V3JhcExhYmVsKCkuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkKLQkJCQlyZWN0LnNldFNpemUobmV3IERpbWVuc2lvbih0ZXh0LmNvbXB1dGVTaXplKHJlY3Qud2lkdGgsCi0JCQkJCQlTV1QuREVGQVVMVCkpKTsKLQkJCWVsc2UgewotCQkJCWludCBhdnIgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3ModGV4dC5nZXRGb250KCkpCi0JCQkJCQkuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOwotCQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJCQlTV1QuREVGQVVMVCkpLmV4cGFuZChhdnIgKiAyLCAwKSk7Ci0JCQl9Ci0KLQkJCWlmICghcmVjdC5lcXVhbHMobmV3IFJlY3RhbmdsZSh0ZXh0LmdldEJvdW5kcygpKSkpCi0JCQkJdGV4dC5zZXRCb3VuZHMocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExhYmVsQ2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTGFiZWwgbGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKExhYmVsIGxhYmVsKSB7Ci0JCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExhYmVsIGdldExhYmVsKCkgewotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRMYWJlbCgpLmdldFRleHRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCQlnZXRMYWJlbCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0KLQkJCWludCBhdnIgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3ModGV4dC5nZXRGb250KCkpCi0JCQkJCS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCQlyZWN0LnNldFNpemUobmV3IERpbWVuc2lvbih0ZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotCQkJCQlTV1QuREVGQVVMVCkpLmV4cGFuZChhdnIgKiAyLCAwKSk7Ci0KLQkJCWlmICghcmVjdC5lcXVhbHMobmV3IFJlY3RhbmdsZSh0ZXh0LmdldEJvdW5kcygpKSkpCi0JCQkJdGV4dC5zZXRCb3VuZHMocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1VNTEV4dE5vZGVMYWJlbEVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9VTUxFeHROb2RlTGFiZWxFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzZkM2JkLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1VNTEV4dE5vZGVMYWJlbEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5MYWJlbExvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRXh0Tm9kZUxhYmVsRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1MRXh0Tm9kZUxhYmVsRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgewotCQlJRmlndXJlIHJlZkZpZ3VyZSA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5nZXRGaWd1cmUoKTsKLQkJaW50IGR4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGR5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJUG9pbnQgb2Zmc2V0ID0gbmV3IFBvaW50KGR4LCBkeSk7Ci0JCWdldEZpZ3VyZSgpLmdldFBhcmVudCgpLnNldENvbnN0cmFpbnQoZ2V0RmlndXJlKCksCi0JCQkJbmV3IExhYmVsTG9jYXRvcihyZWZGaWd1cmUsIG9mZnNldCwgZ2V0S2V5UG9pbnQoKSkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJlbG9jYXRlKElGaWd1cmUgdGFyZ2V0KSB7Ci0JCQkJCQlQb2ludCBsb2NhdGlvbiA9IGdldFJlZmVyZW5jZVBvaW50KCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJCQkJZ2V0T2Zmc2V0KCkpOwotCQkJCQkJbG9jYXRpb24udHJhbnNsYXRlKC10YXJnZXQuZ2V0Qm91bmRzKCkud2lkdGggLyAyLCAwKTsKLQkJCQkJCXRhcmdldC5zZXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQkJCQl0YXJnZXQuc2V0U2l6ZShuZXcgRGltZW5zaW9uKAotCQkJCQkJCQl0YXJnZXQuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoLCB0YXJnZXQKLQkJCQkJCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCkpOwotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIFBvaW50IGdldFJlZmVyZW5jZVBvaW50KCkgewotCQkJCQkJcmV0dXJuIGdldExhYmVsTG9jYXRpb24ocGFyZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0JCXJldHVybiBnZXRMYWJlbExvY2F0aW9uKCgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5nZXRGaWd1cmUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBnZXRMYWJlbExvY2F0aW9uKElGaWd1cmUgcGFyZW50KSB7Ci0JCXJldHVybiBwYXJlbnQuZ2V0Qm91bmRzKCkuZ2V0Qm90dG9tKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVkZGM2Ny4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRm9ya05vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkpvaW5Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuTWVyZ2VOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbENvbm5lY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxDb25uZWN0aW9uRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlFT2JqZWN0IG1vZGVsT2JqZWN0ID0gKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgbmV4dFZhbHVlOwotCQlpbnQgbm9kZVZJRDsKLQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKEFjdGl2aXR5KSBtb2RlbE9iamVjdCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyB2YWx1ZXMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJbmV4dFZhbHVlID0gKEVPYmplY3QpIHZhbHVlcy5uZXh0KCk7Ci0JCQkvLyBtb2RpZmllZCBTVEFSVAotCQkJLy8gVG8gYXZvaWQgdGhlIEFjdGl2aXR5Tm9kZSBzaG93IGluIGR1cGxpY2F0ZSBwbGFjZXMKLQkJCWlmIChuZXh0VmFsdWUgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCQlpZiAoISgoQWN0aXZpdHlOb2RlKSBuZXh0VmFsdWUpLmdldEluUGFydGl0aW9ucygpLmlzRW1wdHkoKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQkvLyBtb2RpZmllZCBFTkQKLQkJCW5vZGVWSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXROb2RlVmlzdWFsSUQodmlld09iamVjdCwgbmV4dFZhbHVlKTsKLQkJCXN3aXRjaCAobm9kZVZJRCkgewotCQkJY2FzZSBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgdmFsdWVzID0gKChBY3Rpdml0eSkgbW9kZWxPYmplY3QpLmdldEdyb3VwcygpLml0ZXJhdG9yKCk7IHZhbHVlcwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQluZXh0VmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLm5leHQoKTsKLQkJCW5vZGVWSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXROb2RlVmlzdWFsSUQodmlld09iamVjdCwgbmV4dFZhbHVlKTsKLQkJCWlmIChBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVklEKSB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgKHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCkgfHwgKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgRU1vZGVsRWxlbWVudCAmJiBCcmlkZ2VIZWxwZXIKLQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KSB2aWV3LmdldEVsZW1lbnQoKSkgIT0gbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDb25uZWN0aW9uc0xpc3QoKSB7Ci0JCS8vCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoYWN0LmdldEVkZ2VzKCkpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFNvdXJjZUVsZW1lbnQoRU9iamVjdCByZWxhdGlvbnNoaXApIHsKLQkJaWYgKHJlbGF0aW9uc2hpcCBpbnN0YW5jZW9mIEFjdGl2aXR5RWRnZSkgewotCQkJcmV0dXJuICgoQWN0aXZpdHlFZGdlKSByZWxhdGlvbnNoaXApLmdldFNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFRhcmdldEVsZW1lbnQoRU9iamVjdCByZWxhdGlvbnNoaXApIHsKLQkJaWYgKHJlbGF0aW9uc2hpcCBpbnN0YW5jZW9mIEFjdGl2aXR5RWRnZSkgewotCQkJcmV0dXJuICgoQWN0aXZpdHlFZGdlKSByZWxhdGlvbnNoaXApLmdldFRhcmdldCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEluY2x1ZGVDb25uZWN0aW9uKEVkZ2UgY29ubmVjdG9yLAotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlyZXR1cm4gc3VwZXIuc2hvdWxkSW5jbHVkZUNvbm5lY3Rpb24oY29ubmVjdG9yLCBjaGlsZHJlbik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsKLQkJTGlzdCBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdCgpOwotCQljcmVhdGVkVmlld3MuYWRkQWxsKHJlZnJlc2hTZW1hbnRpY0NoaWxkcmVuKCkpOwotCQlMaXN0IGNyZWF0ZWRDb25uZWN0aW9uVmlld3MgPSBuZXcgTGlua2VkTGlzdCgpOwotCQljcmVhdGVkQ29ubmVjdGlvblZpZXdzLmFkZEFsbChyZWZyZXNoU2VtYW50aWNDb25uZWN0aW9ucygpKTsKLQkJY3JlYXRlZENvbm5lY3Rpb25WaWV3cy5hZGRBbGwocmVmcmVzaENvbm5lY3Rpb25zKCkpOwotCi0JCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgewotCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyCi0JCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOwotCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7Ci0JCX0KLQotCQljcmVhdGVkVmlld3MuYWRkQWxsKGNyZWF0ZWRDb25uZWN0aW9uVmlld3MpOwotCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG15TGlua0Rlc2NyaXB0b3JzID0gbmV3IExpbmtlZExpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1hcCBteUVPYmplY3QyVmlld01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIHJlZnJlc2hDb25uZWN0aW9ucygpIHsKLQkJdHJ5IHsKLQkJCWNvbGxlY3RBbGxMaW5rcyhnZXREaWFncmFtKCkpOwotCQkJQ29sbGVjdGlvbiBleGlzdGluZ0xpbmtzID0gbmV3IExpbmtlZExpc3QoZ2V0RGlhZ3JhbSgpLmdldEVkZ2VzKCkpOwotCQkJZm9yIChJdGVyYXRvciBkaWFncmFtTGlua3MgPSBleGlzdGluZ0xpbmtzLml0ZXJhdG9yKCk7IGRpYWdyYW1MaW5rcwotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVkZ2UgbmV4dERpYWdyYW1MaW5rID0gKEVkZ2UpIGRpYWdyYW1MaW5rcy5uZXh0KCk7Ci0JCQkJRU9iamVjdCBkaWFncmFtTGlua09iamVjdCA9IG5leHREaWFncmFtTGluay5nZXRFbGVtZW50KCk7Ci0JCQkJRU9iamVjdCBkaWFncmFtTGlua1NyYyA9IG5leHREaWFncmFtTGluay5nZXRTb3VyY2UoKQotCQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rRHN0ID0gbmV4dERpYWdyYW1MaW5rLmdldFRhcmdldCgpCi0JCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCWludCBkaWFncmFtTGlua1Zpc3VhbElEID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldFZpc3VhbElEKG5leHREaWFncmFtTGluayk7Ci0JCQkJZm9yIChJdGVyYXRvciBtb2RlbExpbmtEZXNjcmlwdG9ycyA9IG15TGlua0Rlc2NyaXB0b3JzCi0JCQkJCQkuaXRlcmF0b3IoKTsgbW9kZWxMaW5rRGVzY3JpcHRvcnMuaGFzTmV4dCgpOykgewotCQkJCQlMaW5rRGVzY3JpcHRvciBuZXh0TGlua0Rlc2NyaXB0b3IgPSAoTGlua0Rlc2NyaXB0b3IpIG1vZGVsTGlua0Rlc2NyaXB0b3JzCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJaWYgKGRpYWdyYW1MaW5rT2JqZWN0ID09IG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkJCS5nZXRMaW5rRWxlbWVudCgpCi0JCQkJCQkJJiYgZGlhZ3JhbUxpbmtTcmMgPT0gbmV4dExpbmtEZXNjcmlwdG9yLmdldFNvdXJjZSgpCi0JCQkJCQkJJiYgZGlhZ3JhbUxpbmtEc3QgPT0gbmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCQkJCQkuZ2V0RGVzdGluYXRpb24oKQotCQkJCQkJCSYmIGRpYWdyYW1MaW5rVmlzdWFsSUQgPT0gbmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCQkJCQkuZ2V0VmlzdWFsSUQoKSkgewotCQkJCQkJZGlhZ3JhbUxpbmtzLnJlbW92ZSgpOwotCQkJCQkJbW9kZWxMaW5rRGVzY3JpcHRvcnMucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlkZWxldGVWaWV3cyhleGlzdGluZ0xpbmtzLml0ZXJhdG9yKCkpOwotCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3Rpb25zKG15TGlua0Rlc2NyaXB0b3JzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW15TGlua0Rlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCQlteUVPYmplY3QyVmlld01hcC5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBjb2xsZWN0QWxsTGlua3MoVmlldyB2aWV3KSB7Ci0JCUVPYmplY3QgbW9kZWxFbGVtZW50ID0gdmlldy5nZXRFbGVtZW50KCk7Ci0JCWludCBkaWFncmFtRWxlbWVudFZpc3VhbElEID0gVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsKLQkJc3dpdGNoIChkaWFncmFtRWxlbWVudFZpc3VhbElEKSB7Ci0JCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIEluaXRpYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBBY3Rpdml0eUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJbXlFT2JqZWN0MlZpZXdNYXAucHV0KG1vZGVsRWxlbWVudCwgdmlldyk7Ci0JCQlzdG9yZUxpbmtzKG1vZGVsRWxlbWVudCwgZ2V0RGlhZ3JhbSgpKTsKLQkJfQotCQlkZWZhdWx0OiB7Ci0JCX0KLQkJCWZvciAoSXRlcmF0b3IgY2hpbGRyZW4gPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2hpbGRyZW4KLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZHJlbi5uZXh0KCk7Ci0JCQkJY29sbGVjdEFsbExpbmtzKGNoaWxkVmlldyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25zKENvbGxlY3Rpb24gbGlua0Rlc2NyaXB0b3JzKSB7Ci0JCWlmIChsaW5rRGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlMaXN0IGFkYXB0ZXJzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBsaW5rRGVzY3JpcHRvcnNJdGVyYXRvciA9IGxpbmtEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBsaW5rRGVzY3JpcHRvcnNJdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlmaW5hbCBMaW5rRGVzY3JpcHRvciBuZXh0TGlua0Rlc2NyaXB0b3IgPSAoTGlua0Rlc2NyaXB0b3IpIGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yCi0JCQkJCS5uZXh0KCk7Ci0JCQlFZGl0UGFydCBzb3VyY2VFZGl0UGFydCA9IGdldEVkaXRQYXJ0Rm9yKG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkuZ2V0U291cmNlKCkpOwotCQkJRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSBnZXRFZGl0UGFydEZvcihuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJLmdldERlc3RpbmF0aW9uKCkpOwotCQkJaWYgKHNvdXJjZUVkaXRQYXJ0ID09IG51bGwgfHwgdGFyZ2V0RWRpdFBhcnQgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0LkNvbm5lY3Rpb25WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdC5Db25uZWN0aW9uVmlld0Rlc2NyaXB0b3IoCi0JCQkJCW5leHRMaW5rRGVzY3JpcHRvci5nZXRTZW1hbnRpY0FkYXB0ZXIoKSwgbnVsbCwKLQkJCQkJVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwgKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCQkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsKLQkJCUNyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdCBjY3IgPSBuZXcgQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0KAotCQkJCQlkZXNjcmlwdG9yKTsKLQkJCWNjci5zZXRUeXBlKFJlcXVlc3RDb25zdGFudHMuUkVRX0NPTk5FQ1RJT05fU1RBUlQpOwotCQkJY2NyLnNldFNvdXJjZUVkaXRQYXJ0KHNvdXJjZUVkaXRQYXJ0KTsKLQkJCXNvdXJjZUVkaXRQYXJ0LmdldENvbW1hbmQoY2NyKTsKLQkJCWNjci5zZXRUYXJnZXRFZGl0UGFydCh0YXJnZXRFZGl0UGFydCk7Ci0JCQljY3Iuc2V0VHlwZShSZXF1ZXN0Q29uc3RhbnRzLlJFUV9DT05ORUNUSU9OX0VORCk7Ci0JCQlDb21tYW5kIGNtZCA9IHRhcmdldEVkaXRQYXJ0LmdldENvbW1hbmQoY2NyKTsKLQkJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsKLQkJCQlJQWRhcHRhYmxlIHZpZXdBZGFwdGVyID0gKElBZGFwdGFibGUpIGNjci5nZXROZXdPYmplY3QoKTsKLQkJCQlpZiAodmlld0FkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlhZGFwdGVycy5hZGQodmlld0FkYXB0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYWRhcHRlcnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWRpdFBhcnQgZ2V0RWRpdFBhcnRGb3IoRU9iamVjdCBtb2RlbEVsZW1lbnQpIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIG15RU9iamVjdDJWaWV3TWFwLmdldChtb2RlbEVsZW1lbnQpOwotCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKEVkaXRQYXJ0KSBnZXRIb3N0KCkuZ2V0Vmlld2VyKCkuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCgKLQkJCQkJdmlldyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICpAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlTGlua3MoRU9iamVjdCBjb250YWluZXIsIERpYWdyYW0gZGlhZ3JhbSkgewotCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzID0gY29udGFpbmVyLmVDbGFzcygpOwotCQlzdG9yZUZlYXR1cmVNb2RlbEZhY2V0TGlua3MoY29udGFpbmVyLCBjb250YWluZXJNZXRhY2xhc3MsIGRpYWdyYW0pOwotCQlzdG9yZVR5cGVNb2RlbEZhY2V0TGlua3MoY29udGFpbmVyLCBjb250YWluZXJNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVUeXBlTW9kZWxGYWNldExpbmtzKEVPYmplY3QgY29udGFpbmVyLAotCQkJRUNsYXNzIGNvbnRhaW5lck1ldGFjbGFzcykgewotCQlpZiAoVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJY29udGFpbmVyTWV0YWNsYXNzKSkgewotCQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGNvbnRhaW5lcikKLQkJCQkJLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IG5leHRWYWx1ZSA9ICgoRU9iamVjdCkgdmFsdWVzLm5leHQoKSk7Ci0JCQkJaW50IGxpbmtWSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKG5leHRWYWx1ZSk7Ci0JCQkJaWYgKENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEID09IGxpbmtWSUQpIHsKLQkJCQkJT2JqZWN0IHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0ID0gKChBY3Rpdml0eUVkZ2UpIG5leHRWYWx1ZSkKLQkJCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCWlmIChzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCUVPYmplY3QgZHN0ID0gKEVPYmplY3QpIHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0OwotCQkJCQkJc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgPSAoKEFjdGl2aXR5RWRnZSkgbmV4dFZhbHVlKQotCQkJCQkJCQkuZ2V0U291cmNlKCk7Ci0JCQkJCQlpZiAoc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJRU9iamVjdCBzcmMgPSAoRU9iamVjdCkgc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQ7Ci0JCQkJCQkJbXlMaW5rRGVzY3JpcHRvcnMuYWRkKG5ldyBMaW5rRGVzY3JpcHRvcihzcmMsIGRzdCwKLQkJCQkJCQkJCW5leHRWYWx1ZSwgbGlua1ZJRCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICpAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlRmVhdHVyZU1vZGVsRmFjZXRMaW5rcyhFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MsIERpYWdyYW0gZGlhZ3JhbSkgewotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RGlhZ3JhbSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGNsYXNzIExpbmtEZXNjcmlwdG9yIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBFT2JqZWN0IG15U291cmNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIEVPYmplY3QgbXlEZXN0aW5hdGlvbjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBFT2JqZWN0IG15TGlua0VsZW1lbnQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgaW50IG15VmlzdWFsSUQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgSUFkYXB0YWJsZSBteVNlbWFudGljQWRhcHRlcjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIExpbmtEZXNjcmlwdG9yKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGRlc3RpbmF0aW9uLAotCQkJCUVPYmplY3QgbGlua0VsZW1lbnQsIGludCBsaW5rVklEKSB7Ci0JCQl0aGlzKHNvdXJjZSwgZGVzdGluYXRpb24sIGxpbmtWSUQpOwotCQkJbXlMaW5rRWxlbWVudCA9IGxpbmtFbGVtZW50OwotCQkJbXlTZW1hbnRpY0FkYXB0ZXIgPSBuZXcgRU9iamVjdEFkYXB0ZXIobGlua0VsZW1lbnQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwKLQkJCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUsIGludCBsaW5rVklEKSB7Ci0JCQl0aGlzKHNvdXJjZSwgZGVzdGluYXRpb24sIGxpbmtWSUQpOwotCQkJbXlMaW5rRWxlbWVudCA9IG51bGw7Ci0JCQlmaW5hbCBJRWxlbWVudFR5cGUgZWxlbWVudFR5cGVDb3B5ID0gZWxlbWVudFR5cGU7Ci0JCQlteVNlbWFudGljQWRhcHRlciA9IG5ldyBJQWRhcHRhYmxlKCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gZWxlbWVudFR5cGVDb3B5OwotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwgaW50IGxpbmtWSUQpIHsKLQkJCW15U291cmNlID0gc291cmNlOwotCQkJbXlEZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOwotCQkJbXlWaXN1YWxJRCA9IGxpbmtWSUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIG15U291cmNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldERlc3RpbmF0aW9uKCkgewotCQkJcmV0dXJuIG15RGVzdGluYXRpb247Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0TGlua0VsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gbXlMaW5rRWxlbWVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgaW50IGdldFZpc3VhbElEKCkgewotCQkJcmV0dXJuIG15VmlzdWFsSUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIElBZGFwdGFibGUgZ2V0U2VtYW50aWNBZGFwdGVyKCkgewotCQkJcmV0dXJuIG15U2VtYW50aWNBZGFwdGVyOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTc1Njg3Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlGaW5hbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I5MDc4ZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlGaW5hbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlZmVmOS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlGaW5hbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk1lcmdlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlGaW5hbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSB7Ci0KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0Rlc3Ryb3koKSB7Ci0JCQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdmlldzsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRUb0Rlc3Ryb3koKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpCi0JCS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSk7Ci0JCS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWZpbmFsIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJcmVxLmdldFNvdXJjZSgpLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkgewotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUb0VkaXQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlcgotCQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgZ2V0VGFyZ2V0KCkpOwotCQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIGdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXdFbGVtZW50OwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmdtZi5kaWFncmFtLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0Q3JlYXRlT3V0Z29pbmcob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KQotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZU91dGdvaW5nKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0KLQkJLy8gVmFsaWRhdGlvbiBBY3Rpdml0eUZpbmFsTm9kZSBub2RlIHNob3VsZCBhbGxvdyBvbmx5IG9uZSBvdXRnb2luZyBjb25uZWN0aW9uLgotCQlpZiAocmVxLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQWN0aXZpdHlGaW5hbE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVPdXRnb2luZyhyZXEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyZGMyYS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZHMuRHVwbGljYXRlRU9iamVjdHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlQWN0aXZpdHlGaW5hbE5vZGVfMTAwMUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5NZXJnZU5vZGVfMTAwMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlTWVyZ2VOb2RlXzEwMDJDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuRm9ya05vZGVfMTAwMyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlRm9ya05vZGVfMTAwM0NvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVJbml0aWFsTm9kZV8xMDA0Q29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkRlY2lzaW9uTm9kZV8xMDA1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVEZWNpc2lvbk5vZGVfMTAwNUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Kb2luTm9kZV8xMDA2ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVKb2luTm9kZV8xMDA2Q29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Q29tbWFuZCgKLQkJCQkJcmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfR3JvdXAoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25fMTAwOENvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDlDb21tYW5kKAotCQkJCQlyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwQ29tbWFuZCgKLQkJCQkJcmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMUNvbW1hbmQoCi0JCQkJCXJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZUFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyQ29tbWFuZCgKLQkJCQkJcmVxKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlQWN0aXZpdHlGaW5hbE5vZGVfMTAwMUNvbW1hbmQgZXh0ZW5kcwotCQkJQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlQWN0aXZpdHlGaW5hbE5vZGVfMTAwMUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihyZXEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJLmdldENvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDcmVhdGVNZXJnZU5vZGVfMTAwMkNvbW1hbmQgZXh0ZW5kcwotCQkJQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlTWVyZ2VOb2RlXzEwMDJDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCQl9OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCS5nZXRDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJCX0KLQkJCXJldHVybiBjb250YWluZXI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlRm9ya05vZGVfMTAwM0NvbW1hbmQgZXh0ZW5kcwotCQkJQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlRm9ya05vZGVfMTAwM0NvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihyZXEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJLmdldENvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDcmVhdGVJbml0aWFsTm9kZV8xMDA0Q29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDcmVhdGVJbml0aWFsTm9kZV8xMDA0Q29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKHJlcSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQkJfTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY29udGFpbmVyOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZURlY2lzaW9uTm9kZV8xMDA1Q29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDcmVhdGVEZWNpc2lvbk5vZGVfMTAwNUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihyZXEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJLmdldENvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDcmVhdGVKb2luTm9kZV8xMDA2Q29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDcmVhdGVKb2luTm9kZV8xMDA2Q29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKHJlcSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQkJfTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY29udGFpbmVyOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwN0NvbW1hbmQgZXh0ZW5kcwotCQkJQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Q29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKHJlcSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQkJfTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY29udGFpbmVyOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgbmV3RWxlbWVudCA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBzdXBlcgotCQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcKLQkJCQkJCS5pbml0KG5ld0VsZW1lbnQpOwotCQkJfQotCQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kI2RvRXhlY3V0ZVdpdGhSZXN1bHQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCQkgKiBAbW9kaWlmZWQKLQkJICovCi0JCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQlDb21tYW5kUmVzdWx0IHJlc3VsdCA9IHN1cGVyLmRvRXhlY3V0ZVdpdGhSZXN1bHQobW9uaXRvciwgaW5mbyk7Ci0JCQkvL1ZpZXcgY29udGFpbmVyID0gKFZpZXcpKChDcmVhdGVFbGVtZW50UmVxdWVzdClnZXRSZXF1ZXN0KCkpLmdldENvbnRhaW5lcigpOwotCi0JCQkvLygoQ3JlYXRlRWxlbWVudFJlcXVlc3QpZ2V0UmVxdWVzdCgpKS4KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQjZG9VbmRvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1VuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gc3VwZXIuZG9VbmRvKG1vbml0b3IsIGluZm8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUFjdGl2aXR5UGFydGl0aW9uXzEwMDhDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUFjdGl2aXR5UGFydGl0aW9uXzEwMDhDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCQl9OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCS5nZXRDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJCX0KLQkJCXJldHVybiBjb250YWluZXI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDlDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5Q29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKHJlcSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQkJfTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY29udGFpbmVyOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBuZXdFbGVtZW50ID0gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgc3VwZXIKLQkJCQkJLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkKLQkJCQkJCS5pbml0KG5ld0VsZW1lbnQpOwotCQkJfQotCQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTBDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCQl9OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCS5nZXRDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJCX0KLQkJCXJldHVybiBjb250YWluZXI7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBuZXdFbGVtZW50ID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIHN1cGVyCi0JCQkJCS5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlVTUxFbGVtZW50VHlwZXMuSW5pdGlhbGl6ZXJzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMAotCQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3RWxlbWVudDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTFDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihyZXEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJLmdldENvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIG5ld0VsZW1lbnQgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgc3VwZXIKLQkJCQkJLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExCi0JCQkJCQkuaW5pdChuZXdFbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybiBuZXdFbGVtZW50OwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDcmVhdGVBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMkNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihyZXEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJLmdldENvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgbmV3RWxlbWVudCA9IChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIHN1cGVyCi0JCQkJCS5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlVTUxFbGVtZW50VHlwZXMuSW5pdGlhbGl6ZXJzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyCi0JCQkJCQkuaW5pdChuZXdFbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybiBuZXdFbGVtZW50OwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldER1cGxpY2F0ZUNvbW1hbmQoRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0IHJlcSkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRHVwbGljYXRlQW55dGhpbmdDb21tYW5kKGVkaXRpbmdEb21haW4sIHJlcSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQgZXh0ZW5kcwotCQkJRHVwbGljYXRlRU9iamVjdHNDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIER1cGxpY2F0ZUFueXRoaW5nQ29tbWFuZCgKLQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLAotCQkJCUR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKGVkaXRpbmdEb21haW4sIHJlcS5nZXRMYWJlbCgpLCByZXEKLQkJCQkJLmdldEVsZW1lbnRzVG9CZUR1cGxpY2F0ZWQoKSwgcmVxCi0JCQkJCS5nZXRBbGxEdXBsaWNhdGVkRWxlbWVudHNNYXAoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5NTA4NS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYxODMzMi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDUwM2RjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSB7Ci0KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0Rlc3Ryb3koKSB7Ci0JCQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdmlldzsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRUb0Rlc3Ryb3koKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpCi0JCS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSk7Ci0JCS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWZpbmFsIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJcmVxLmdldFNvdXJjZSgpLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkgewotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUb0VkaXQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlcgotCQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgZ2V0VGFyZ2V0KCkpOwotCQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIGdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXdFbGVtZW50OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTA3NmUzLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjkwYmYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzhkZGI0Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkgewotCi0JCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9EZXN0cm95KCkgewotCQkJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHZpZXc7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRFbGVtZW50VG9EZXN0cm95KCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkvLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKQotCQkvLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpOwotCQkvLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoIShyZXEuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlmaW5hbCBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGVsZW1lbnQgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXJlcS5nZXRTb3VyY2UoKSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpIHsKLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQgZXh0ZW5kcwotCQkJQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQoCi0JCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKHJlcSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpOwotCQl9OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRFbGVtZW50VG9FZGl0KEVPYmplY3QgZWxlbWVudCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQkJQ29udHJvbEZsb3cgbmV3RWxlbWVudCA9IChDb250cm9sRmxvdykgc3VwZXIKLQkJCQkJLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCW5ld0VsZW1lbnQuc2V0VGFyZ2V0KChBY3Rpdml0eU5vZGUpIGdldFRhcmdldCgpKTsKLQkJCQluZXdFbGVtZW50LnNldFNvdXJjZSgoQWN0aXZpdHlOb2RlKSBnZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3RWxlbWVudDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3NTgwYi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbjJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbjJDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbjJHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGVmZTE2Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbjJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzODMwYS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbjJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbjJJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSB7Ci0KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0Rlc3Ryb3koKSB7Ci0JCQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdmlldzsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRUb0Rlc3Ryb3koKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25DYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NDk2ZGIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25DYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzg5OWQ2Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmZlZWIxLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25JdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSB7Ci0KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0Rlc3Ryb3koKSB7Ci0JCQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdmlldzsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRUb0Rlc3Ryb3koKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4OTdkYjQuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUVPYmplY3QgbW9kZWxPYmplY3QgPSAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBuZXh0VmFsdWU7Ci0JCWludCBub2RlVklEOwotCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoQWN0aXZpdHlQYXJ0aXRpb24pIG1vZGVsT2JqZWN0KQotCQkJCS5nZXRTdWJwYXJ0aXRpb25zKCkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJbm9kZVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LCBuZXh0VmFsdWUpOwotCQkJaWYgKEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVklEKSB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDZlNTFmLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ci0JCWV4dGVuZHMgVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5UGFydGl0aW9uX1N1YnBhcnRpdGlvbigpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVBY3Rpdml0eVBhcnRpdGlvbl8yMDAxQ29tbWFuZChyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDcmVhdGVBY3Rpdml0eVBhcnRpdGlvbl8yMDAxQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDcmVhdGVBY3Rpdml0eVBhcnRpdGlvbl8yMDAxQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKHJlcSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJ0aXRpb24oKTsKLQkJfTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY29udGFpbmVyOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc3ODI2MC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJRU9iamVjdCBtb2RlbE9iamVjdCA9ICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IG5leHRWYWx1ZTsKLQkJaW50IG5vZGVWSUQ7Ci0JCS8vIG1vZGlmaWVkIHRvIGNoZWNrIEFjdGl2aXR5UGFydGl0aW9uIG9yIG5vdC4gdG8gYXZvaWQgY2xhc3NjYXN0IGV4Y2VwdGlvbi4KLQkJaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pIHsKLQkJCWZvciAoSXRlcmF0b3IgdmFsdWVzID0gKChBY3Rpdml0eVBhcnRpdGlvbikgbW9kZWxPYmplY3QpCi0JCQkJCS5nZXRTdWJwYXJ0aXRpb25zKCkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCQluZXh0VmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLm5leHQoKTsKLQkJCQlub2RlVklEID0gVU1MVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlld09iamVjdCwKLQkJCQkJCW5leHRWYWx1ZSk7Ci0JCQkJaWYgKEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVklEKSB7Ci0JCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODQ1NWYxLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmNvbW1hbmRzLkFjdGl2aXR5UGFydGl0aW9uRGVzdHJveUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuY29tbWFuZHMuQ3JlYXRlQWN0aXZpdHlOb2RlSW5BY3Rpdml0eVBhcnRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlQYXJ0aXRpb25fU3VicGFydGl0aW9uKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZUFjdGl2aXR5UGFydGl0aW9uXzIwMDFDb21tYW5kKHJlcSkpOwotCQl9Ci0JCS8vIG1vZGlmaWVkIFNUQVJUCi0JCUNvbW1hbmQgY29tbWFuZCA9IGdldENyZWF0ZUFjdGl2aXR5Tm9kZUNvbW1hbmQocmVxKTsKLQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotCi0JCQkvLwkJCWNvbW1hbmQgPSBjb21tYW5kLmNoYWluKGdldE1TTFdyYXBwZXIobmV3IFVwZGF0ZUFjdGl2aXR5Q29tbWFuZChyZXEpKSk7Ci0JCQkvLwkJCWNvbW1hbmQgPSBjb21tYW5kLmNoYWluKG5ldyBVbWFBY3Rpdml0eUNyZWF0aW9uQ29tbWFuZChyZXEpKTsKLQkJCXJldHVybiBjb21tYW5kOwotCQl9Ci0JCS8vIG1vZGlmaWVkIEVORAotCi0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUFjdGl2aXR5UGFydGl0aW9uXzIwMDFDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUFjdGl2aXR5UGFydGl0aW9uXzIwMDFDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcnRpdGlvbigpOwotCQl9OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCS5nZXRDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJCX0KLQkJCXJldHVybiBjb250YWluZXI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAY3VzdG9tCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kIGdldENyZWF0ZUFjdGl2aXR5Tm9kZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCA9PSByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSA9PSByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLk1lcmdlTm9kZV8xMDAyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkZvcmtOb2RlXzEwMDMgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuSW5pdGlhbE5vZGVfMTAwNCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKQotCQkJCXx8IFVNTEVsZW1lbnRUeXBlcy5EZWNpc2lvbk5vZGVfMTAwNSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKQotCQkJCXx8IFVNTEVsZW1lbnRUeXBlcy5Kb2luTm9kZV8xMDA2ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEgPT0gcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKQotCQkJCXx8IFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSA9PSByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyID09IHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eVBhcnRpdGlvbl9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZUFjdGl2aXR5Tm9kZUluQWN0aXZpdHlQYXJ0aXRpb24ocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZ21mLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXRDcmVhdGVPdXRnb2luZyhvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpCi0JICogQG1vZGlpZmVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlT3V0Z29pbmcoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiBAY3VzdG9tCi0JICovCi0JLy8JcHJpdmF0ZSB2b2lkIHVwZGF0ZUFjdGl2aXR5Q29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXF1ZXN0LCBDb21tYW5kIGNtZCl7Ci0JLy8JCUVPYmplY3Qgb2JqID0gcmVxdWVzdC5nZXROZXdFbGVtZW50KCk7Ci0JLy8JCWlmIChvYmogIT0gbnVsbCkgewotCS8vCQkJRU9iamVjdCBwYXJlbnQgPSBvYmo7Ci0JLy8JCQl3aGlsZSAoIShwYXJlbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JLy8JCQkJcGFyZW50ID0gcGFyZW50LmVDb250YWluZXIoKTsKLQkvLwkJCX0KLQkvLwkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkvLwkJCQkJLmdldEFjdGl2aXR5X05vZGUoKTsKLQkvLwkJCVNldFJlcXVlc3QgcmVxID0gbmV3IFNldFJlcXVlc3QocGFyZW50LCBmZWF0dXJlLCByZXF1ZXN0Ci0JLy8JCQkJCS5nZXROZXdFbGVtZW50KCkpOwotCS8vCQkJY21kLmNoYWluKGdldE1TTFdyYXBwZXIobmV3IFNldFZhbHVlQ29tbWFuZChyZXEpKSk7Ci0JLy8JCX0KLQkvLwl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXREZXN0cm95RWxlbWVudENvbW1hbmQob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJLyogbW9kaWZ5IFNUQVJUICovCi0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBBY3Rpdml0eVBhcnRpdGlvbkRlc3Ryb3lDb21tYW5kKHJlcSwgZ2V0SG9zdCgpKSk7Ci0JCS8qIG1vZGlmeSBFTkQgKi8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5I2dldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQoRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBzdXBlci5nZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZChyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0NvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQ29udHJvbEZsb3dJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZjRmNDYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQ29udHJvbEZsb3dJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMWE0ZTEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvRGVjaXNpb25Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvRGVjaXNpb25Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyMjI3OS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NzNhOTUuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRGVjaXNpb25Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkZvcmtOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSB7Ci0KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0Rlc3Ryb3koKSB7Ci0JCQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdmlldzsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRUb0Rlc3Ryb3koKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpCi0JCS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSk7Ci0JCS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWZpbmFsIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJcmVxLmdldFNvdXJjZSgpLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkgewotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUb0VkaXQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlcgotCQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgZ2V0VGFyZ2V0KCkpOwotCQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIGdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXdFbGVtZW50OwotCQl9Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAocmVxLmdldFRhcmdldCgpIGluc3RhbmNlb2YgRGVjaXNpb25Ob2RlKSB7Ci0JCQlEZWNpc2lvbk5vZGUgZGVjaXNpb24gPSAoRGVjaXNpb25Ob2RlKSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCQlMaXN0IGxpc3QgPSBkZWNpc2lvbi5nZXRJbmNvbWluZ3MoKTsKLQkJCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPj0gMSkgewotCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvRm9ya05vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzZGVkYS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZvcmtOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NDczODguLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvRm9ya05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzIFVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0ZvcmtOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZjdhODIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Gb3JrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Kb2luTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSB7Ci0KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0Rlc3Ryb3koKSB7Ci0JCQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdmlldzsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRUb0Rlc3Ryb3koKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpCi0JCS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSk7Ci0JCS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWZpbmFsIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJcmVxLmdldFNvdXJjZSgpLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkgewotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUb0VkaXQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlcgotCQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgZ2V0VGFyZ2V0KCkpOwotCQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIGdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXdFbGVtZW50OwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChyZXEuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBGb3JrTm9kZSkgewotCQkJRm9ya05vZGUgZm9yayA9IChGb3JrTm9kZSkgcmVxLmdldFRhcmdldCgpOwotCQkJTGlzdCBsaXN0ID0gZm9yay5nZXRJbmNvbWluZ3MoKTsKLQkJCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPj0gMSkgewotCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1ODkyMi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzUxYzQuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YWE4OTkuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSW5pdGlhbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkgewotCi0JCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9EZXN0cm95KCkgewotCQkJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHZpZXc7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRFbGVtZW50VG9EZXN0cm95KCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkvLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKQotCQkvLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpOwotCQkvLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmdtZi5kaWFncmFtLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAocmVxLmdldFRhcmdldCgpIGluc3RhbmNlb2YgSW5pdGlhbE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWZpbmFsIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJcmVxLmdldFNvdXJjZSgpLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkgewotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUb0VkaXQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlcgotCQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgZ2V0VGFyZ2V0KCkpOwotCQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIGdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXdFbGVtZW50OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5Y2ZiMC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjE5NTMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzIFVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNzAyZjAuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Kb2luTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSB7Ci0KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0Rlc3Ryb3koKSB7Ci0JCQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdmlldzsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRUb0Rlc3Ryb3koKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpCi0JCS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSk7Ci0JCS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZ21mLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXRDcmVhdGVPdXRnb2luZyhvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlT3V0Z29pbmcoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQotCQkvLyBWYWxpZGF0aW9uIEpvaW4gTm9kZSBzaG91bGQgYWxsb3cgb25seSBvbmUgb3V0Z29pbmcgY29ubmVjdGlvbi4KLQkJaWYgKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEpvaW5Ob2RlKSB7Ci0JCQlKb2luTm9kZSBqb2luID0gKEpvaW5Ob2RlKSByZXEuZ2V0U291cmNlKCk7Ci0JCQlMaXN0IGxpc3QgPSBqb2luLmdldE91dGdvaW5ncygpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+PSAxKSB7Ci0JCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZU91dGdvaW5nKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWZpbmFsIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJcmVxLmdldFNvdXJjZSgpLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkgewotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUb0VkaXQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlcgotCQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgZ2V0VGFyZ2V0KCkpOwotCQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIGdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXdFbGVtZW50OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODhkMjliLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZTY3NWEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWE0NzUzLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkpvaW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk1lcmdlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkgewotCi0JCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9EZXN0cm95KCkgewotCQkJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHZpZXc7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRFbGVtZW50VG9EZXN0cm95KCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkvLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKQotCQkvLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpOwotCQkvLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoIShyZXEuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlmaW5hbCBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGVsZW1lbnQgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXJlcS5nZXRTb3VyY2UoKSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpIHsKLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQgZXh0ZW5kcwotCQkJQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQoCi0JCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKHJlcSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpOwotCQl9OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRFbGVtZW50VG9FZGl0KEVPYmplY3QgZWxlbWVudCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQkJQ29udHJvbEZsb3cgbmV3RWxlbWVudCA9IChDb250cm9sRmxvdykgc3VwZXIKLQkJCQkJLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCW5ld0VsZW1lbnQuc2V0VGFyZ2V0KChBY3Rpdml0eU5vZGUpIGdldFRhcmdldCgpKTsKLQkJCQluZXdFbGVtZW50LnNldFNvdXJjZSgoQWN0aXZpdHlOb2RlKSBnZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3RWxlbWVudDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5nbWYuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5I2dldENyZWF0ZU91dGdvaW5nKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVPdXRnb2luZyhDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCi0JCS8vIFZhbGlkYXRpb24gbWVyZ2Ugbm9kZSBzaG91bGQgYWxsb3cgb25seSBvbmUgb3V0Z29pbmcgY29ubmVjdGlvbi4KLQkJaWYgKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIE1lcmdlTm9kZSkgewotCQkJTWVyZ2VOb2RlIGpvaW4gPSAoTWVyZ2VOb2RlKSByZXEuZ2V0U291cmNlKCk7Ci0JCQlMaXN0IGxpc3QgPSBqb2luLmdldE91dGdvaW5ncygpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+PSAxKSB7Ci0JCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZU91dGdvaW5nKHJlcSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTAyNzI1Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc5MDA2OC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxMjliNi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSB7Ci0KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0Rlc3Ryb3koKSB7Ci0JCQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdmlldzsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRUb0Rlc3Ryb3koKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpCi0JCS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSk7Ci0JCS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWZpbmFsIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJcmVxLmdldFNvdXJjZSgpLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkgewotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUb0VkaXQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlcgotCQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgZ2V0VGFyZ2V0KCkpOwotCQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIGdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXdFbGVtZW50OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAwYjdhMi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmN2FlMWIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMWJmMjguLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkgewotCi0JCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9EZXN0cm95KCkgewotCQkJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHZpZXc7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRFbGVtZW50VG9EZXN0cm95KCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkvLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKQotCQkvLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpOwotCQkvLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoIShyZXEuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlmaW5hbCBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGVsZW1lbnQgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXJlcS5nZXRTb3VyY2UoKSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpIHsKLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQgZXh0ZW5kcwotCQkJQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQoCi0JCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKHJlcSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpOwotCQl9OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRFbGVtZW50VG9FZGl0KEVPYmplY3QgZWxlbWVudCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQkJQ29udHJvbEZsb3cgbmV3RWxlbWVudCA9IChDb250cm9sRmxvdykgc3VwZXIKLQkJCQkJLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCW5ld0VsZW1lbnQuc2V0VGFyZ2V0KChBY3Rpdml0eU5vZGUpIGdldFRhcmdldCgpKTsKLQkJCQluZXdFbGVtZW50LnNldFNvdXJjZSgoQWN0aXZpdHlOb2RlKSBnZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3RWxlbWVudDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTE2NjZjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmJkMGYxLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZGFlYmQuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpIHsKLQotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRGVzdHJveSgpIHsKLQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB2aWV3OwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudFRvRGVzdHJveSgpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkvLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkKLQkJLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKTsKLQkJLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKCEocmVxLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJZmluYWwgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBlbGVtZW50ID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlyZXEuZ2V0U291cmNlKCksIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKSB7Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihyZXEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKTsKLQkJfTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0RWxlbWVudFRvRWRpdChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJCUNvbnRyb2xGbG93IG5ld0VsZW1lbnQgPSAoQ29udHJvbEZsb3cpIHN1cGVyCi0JCQkJCS5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQluZXdFbGVtZW50LnNldFRhcmdldCgoQWN0aXZpdHlOb2RlKSBnZXRUYXJnZXQoKSk7Ci0JCQkJbmV3RWxlbWVudC5zZXRTb3VyY2UoKEFjdGl2aXR5Tm9kZSkgZ2V0U291cmNlKCkpOwotCQkJfQotCQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA1ZDU3ZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmNvbW1hbmRzLkNyZWF0ZUluY29taW5nQ29udHJvbEZsb3dDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmNvbW1hbmRzLkNyZWF0ZU91dGdvaW5nQ29udHJvbEZsb3dDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnMuVU1MQmFzZUVkaXRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5Db21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLkVsZW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWRpdEhlbHBlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkdldEVkaXRDb250ZXh0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLklFZGl0Q29tbWFuZFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Nb3ZlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlNldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcyBTZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFNlbWFudGljQ29tbWFuZChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSUVkaXRDb21tYW5kUmVxdWVzdCBjb21wbGV0ZWRSZXF1ZXN0ID0gY29tcGxldGVSZXF1ZXN0KHJlcXVlc3QpOwotCQlPYmplY3QgZWRpdEhlbHBlckNvbnRleHQgPSBjb21wbGV0ZWRSZXF1ZXN0LmdldEVkaXRIZWxwZXJDb250ZXh0KCk7Ci0JCWlmIChlZGl0SGVscGVyQ29udGV4dCBpbnN0YW5jZW9mIFZpZXcKLQkJCQl8fCAoZWRpdEhlbHBlckNvbnRleHQgaW5zdGFuY2VvZiBJRWRpdEhlbHBlckNvbnRleHQgJiYgKChJRWRpdEhlbHBlckNvbnRleHQpIGVkaXRIZWxwZXJDb250ZXh0KQotCQkJCQkJLmdldEVPYmplY3QoKSBpbnN0YW5jZW9mIFZpZXcpKSB7Ci0JCQkvLyBubyBzZW1hbnRpYyBjb21tYW5kcyBhcmUgcHJvdmlkZWQgZm9yIHB1cmUgZGVzaWduIGVsZW1lbnRzCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoZWRpdEhlbHBlckNvbnRleHQgPT0gbnVsbCkgewotCQkJZWRpdEhlbHBlckNvbnRleHQgPSBWaWV3VXRpbAotCQkJCQkucmVzb2x2ZVNlbWFudGljRWxlbWVudCgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCQl9Ci0JCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRFbGVtZW50VHlwZShlZGl0SGVscGVyQ29udGV4dCk7Ci0JCWlmIChlbGVtZW50VHlwZSA9PSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZSgKLQkJCQkib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5kZWZhdWx0IikpIHsgLy8kTk9OLU5MUy0xJCAKLQkJCWVsZW1lbnRUeXBlID0gbnVsbDsKLQkJfQotCQlDb21tYW5kIGVwQ29tbWFuZCA9IGdldFNlbWFudGljQ29tbWFuZFN3aXRjaChjb21wbGV0ZWRSZXF1ZXN0KTsKLQkJaWYgKGVwQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlJQ29tbWFuZCBjb21tYW5kID0gZXBDb21tYW5kIGluc3RhbmNlb2YgSUNvbW1hbmRQcm94eSA/ICgoSUNvbW1hbmRQcm94eSkgZXBDb21tYW5kKQotCQkJCQkuZ2V0SUNvbW1hbmQoKQotCQkJCQk6IG5ldyBDb21tYW5kUHJveHkoZXBDb21tYW5kKTsKLQkJCWNvbXBsZXRlZFJlcXVlc3Quc2V0UGFyYW1ldGVyKAotCQkJCQlVTUxCYXNlRWRpdEhlbHBlci5FRElUX1BPTElDWV9DT01NQU5ELCBjb21tYW5kKTsKLQkJfQotCQlDb21tYW5kIGVoQ29tbWFuZCA9IG51bGw7Ci0JCWlmIChlbGVtZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlJQ29tbWFuZCBjb21tYW5kID0gZWxlbWVudFR5cGUuZ2V0RWRpdENvbW1hbmQoY29tcGxldGVkUmVxdWVzdCk7Ci0JCQlpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJaWYgKCEoY29tbWFuZCBpbnN0YW5jZW9mIENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKSkgewotCQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkJCQljb21tYW5kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJCQkJbnVsbCkuY29tcG9zZShjb21tYW5kKTsKLQkJCQl9Ci0JCQkJZWhDb21tYW5kID0gbmV3IElDb21tYW5kUHJveHkoY29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQkJYm9vbGVhbiBzaG91bGRQcm9jZWVkID0gdHJ1ZTsKLQkJaWYgKGNvbXBsZXRlZFJlcXVlc3QgaW5zdGFuY2VvZiBEZXN0cm95UmVxdWVzdCkgewotCQkJc2hvdWxkUHJvY2VlZCA9IHNob3VsZFByb2NlZWQoKERlc3Ryb3lSZXF1ZXN0KSBjb21wbGV0ZWRSZXF1ZXN0KTsKLQkJfQotCQlpZiAoc2hvdWxkUHJvY2VlZCkgewotCQkJaWYgKGNvbXBsZXRlZFJlcXVlc3QgaW5zdGFuY2VvZiBEZXN0cm95UmVxdWVzdCkgewotCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCQlDb21tYW5kIGRlbGV0ZVZpZXdDb21tYW5kID0gbmV3IElDb21tYW5kUHJveHkoCi0JCQkJCQluZXcgRGVsZXRlQ29tbWFuZChlZGl0aW5nRG9tYWluLCAoVmlldykgZ2V0SG9zdCgpCi0JCQkJCQkJCS5nZXRNb2RlbCgpKSk7Ci0JCQkJZWhDb21tYW5kID0gZWhDb21tYW5kID09IG51bGwgPyBkZWxldGVWaWV3Q29tbWFuZCA6IGVoQ29tbWFuZAotCQkJCQkJLmNoYWluKGRlbGV0ZVZpZXdDb21tYW5kKTsKLQkJCX0KLQkJCXJldHVybiBlaENvbW1hbmQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFNlbWFudGljQ29tbWFuZFN3aXRjaChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcSkgewotCQlpZiAocmVxIGluc3RhbmNlb2YgQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgQ3JlYXRlRWxlbWVudFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRDcmVhdGVDb21tYW5kKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBDb25maWd1cmVSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q29uZmlndXJlQ29tbWFuZCgoQ29uZmlndXJlUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBEZXN0cm95RWxlbWVudFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoKERlc3Ryb3lFbGVtZW50UmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QpIHsKLQkJCXJldHVybiBnZXREdXBsaWNhdGVDb21tYW5kKChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgR2V0RWRpdENvbnRleHRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RWRpdENvbnRleHRDb21tYW5kKChHZXRFZGl0Q29udGV4dFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgTW92ZVJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRNb3ZlQ29tbWFuZCgoTW92ZVJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0UmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBDb21tYW5kKChSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKChSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgU2V0UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldFNldENvbW1hbmQoKFNldFJlcXVlc3QpIHJlcSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENvbmZpZ3VyZUNvbW1hbmQoQ29uZmlndXJlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZU91dGdvaW5nKHJlcSkKLQkJCQkJOiBnZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKHJlcSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hpbGRyZW4gc2hvdWxkIG92ZXJyaWRlIHRoaXMsIGZvciBhbnkgZXh0cmEgdmFsaWRhdGlvbnMuCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlDb21tYW5kIGNvbW1hbmQ7Ci0JCWlmIChyZXEuZ2V0U291cmNlKCkgPT0gcmVxLmdldFRhcmdldCgpKSB7Ci0JCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQl9OwotCQl9Ci0KLQkJaWYgKCEocmVxLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQotCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8ICEoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChpc0R1cGxpY2F0ZVJlbGF0aW9uc2hpcChyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0KLQkJaWYgKERpYWdyYW1Db3JlVmFsaWRhdGlvbi5jYW5Db25uZWN0KChFZGl0UGFydCkgZ2V0SG9zdCgpLCByZXEKLQkJCQkuZ2V0VGFyZ2V0KCksIHJlcS5nZXRTb3VyY2UoKSkgIT0gbnVsbCkKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfRWRnZSgpKTsKLQkJCX0KLQkJCWNvbW1hbmQgPSBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZChyZXEsCi0JCQkJCWVsZW1lbnQuZUNvbnRhaW5lcigpKSk7Ci0KLQkJCS8vCQkJaWYgKHJlcS5nZXRUYXJnZXQoKSAhPSByZXEuZ2V0U291cmNlKCkpIHsKLQkJCS8vCQkJCWNvbW1hbmQgPSBjb21tYW5kLmNoYWluKG5ldyBDcmVhdGVQcmVkZWNlc3NvckNvbW1hbmQocmVxKSk7Ci0JCQkvLwkJCX0KLQkJCXJldHVybiBjb21tYW5kOwotCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgIGlmIHRoZSBsaW5rIGJldHdlZW4gdHdvIGVuZHMgYWxyZWFkeSBleGlzdHMuCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRHVwbGljYXRlUmVsYXRpb25zaGlwKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IHRhcmdldCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IHNvdXJjZS5lQ29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIGNvbnRhaW5lcjsKLQkJCUxpc3QgbGlzdCA9IGFjdGl2aXR5LmdldEVkZ2VzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFjdGl2aXR5RWRnZSBlbGVtZW50ID0gKEFjdGl2aXR5RWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKChlbGVtZW50LmdldFNvdXJjZSgpID09IHNvdXJjZSkKLQkJCQkJCSYmIGVsZW1lbnQuZ2V0VGFyZ2V0KCkgPT0gdGFyZ2V0KSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlT3V0Z29pbmcoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKCEocmVxLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCAhKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpKSB7Ci0JCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQl9OwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQkvLyBUT0RPOiAgY2hlY2sgdGhlIHNhbWUgdHlwZSwgZG9uJ3QgY3JlYXRlIGNvbm5lY3Rpb24uCi0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfRWRnZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQocmVxKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTZXRDb21tYW5kKFNldFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRFZGl0Q29udGV4dENvbW1hbmQoR2V0RWRpdENvbnRleHRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RHVwbGljYXRlQ29tbWFuZChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ29tbWFuZChNb3ZlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldE1TTFdyYXBwZXIoSUNvbW1hbmQgY21kKSB7Ci0JCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShjbWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTZW1hbnRpY0VsZW1lbnQoKSB7Ci0JCXJldHVybiBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgY29udGFpbmVyIGVsZW1lbnQgZm9yIHRoZSBuZXcgcmVsYXRpb25zaGlwIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGdvZXMgdXAgYnkgY29udGFpbm1lbnQgaGllcmFyY2h5IHN0YXJ0aW5nIGZyb20KLQkgKiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyBpbnN0YW5jZSBvZgotCSAqIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIGNsYXNzLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoRU9iamVjdCBlbGVtZW50LAotCQkJRUNsYXNzIGNvbnRhaW5lckNsYXNzLCBJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlmb3IgKDsgZWxlbWVudCAhPSBudWxsOyBlbGVtZW50ID0gZWxlbWVudC5lQ29udGFpbmVyKCkpIHsKLQkJCWlmIChjb250YWluZXJDbGFzcy5pc1N1cGVyVHlwZU9mKGVsZW1lbnQuZUNsYXNzKCkpKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9VTUxFeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjMTU1YS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9VTUxFeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuWFlMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5IGV4dGVuZHMgWFlMYXlvdXRFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExheW91dEVkaXRQb2xpY3kgcmVhbExheW91dEVkaXRQb2xpY3k7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExheW91dEVkaXRQb2xpY3kgZ2V0UmVhbExheW91dEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiByZWFsTGF5b3V0RWRpdFBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhbExheW91dEVkaXRQb2xpY3koTGF5b3V0RWRpdFBvbGljeSByZWFsTGF5b3V0RWRpdFBvbGljeSkgewotCQl0aGlzLnJlYWxMYXlvdXRFZGl0UG9saWN5ID0gcmVhbExheW91dEVkaXRQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRXh0ZXJuYWxMYWJlbChFZGl0UGFydCBlZGl0UGFydCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0IGdldEV4dGVybmFsTGFiZWxzKEdyb3VwUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUxpc3QgZWRpdFBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocmVxdWVzdC5nZXRFZGl0UGFydHMoKSAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVxdWVzdC5nZXRFZGl0UGFydHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGl0Lm5leHQoKTsKLQkJCQlpZiAoaXNFeHRlcm5hbExhYmVsKGVkaXRQYXJ0KSkgewotCQkJCQllZGl0UGFydHMuYWRkKGVkaXRQYXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRQYXJ0czsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKFJFUV9NT1ZFX0NISUxEUkVOLmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkpIHsKLQkJCUNoYW5nZUJvdW5kc1JlcXVlc3QgY2JSZXF1ZXN0ID0gKENoYW5nZUJvdW5kc1JlcXVlc3QpIHJlcXVlc3Q7Ci0JCQlMaXN0IGV4dExhYmVscyA9IGdldEV4dGVybmFsTGFiZWxzKGNiUmVxdWVzdCk7Ci0JCQlpZiAoIWV4dExhYmVscy5pc0VtcHR5KCkpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGNiUmVxdWVzdC5nZXRFZGl0UGFydHMoKTsKLQkJCQlDb21tYW5kIGNtZCA9IG51bGw7Ci0JCQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwKLQkJCQkJCSYmIGVkaXRQYXJ0cy5zaXplKCkgPiBleHRMYWJlbHMuc2l6ZSgpKSB7Ci0JCQkJCUxpc3Qgb3RoZXIgPSBuZXcgQXJyYXlMaXN0KGVkaXRQYXJ0cyk7Ci0JCQkJCW90aGVyLnJlbW92ZUFsbChleHRMYWJlbHMpOwotCQkJCQljYlJlcXVlc3Quc2V0RWRpdFBhcnRzKG90aGVyKTsKLQkJCQkJY21kID0gcmVhbExheW91dEVkaXRQb2xpY3kuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQkJCQl9Ci0JCQkJY2JSZXF1ZXN0LnNldEVkaXRQYXJ0cyhleHRMYWJlbHMpOwotCQkJCUNvbW1hbmQgZXh0TGFiZWxzQ21kID0gZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChyZXF1ZXN0KTsKLQkJCQljYlJlcXVlc3Quc2V0RWRpdFBhcnRzKGVkaXRQYXJ0cyk7Ci0JCQkJcmV0dXJuIGNtZCA9PSBudWxsID8gZXh0TGFiZWxzQ21kIDogY21kLmNoYWluKGV4dExhYmVsc0NtZCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBHcm91cFJlcXVlc3QpIHsKLQkJCUxpc3QgZXh0TGFiZWxzID0gZ2V0RXh0ZXJuYWxMYWJlbHMoKEdyb3VwUmVxdWVzdCkgcmVxdWVzdCk7Ci0JCQlpZiAoIWV4dExhYmVscy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVhbExheW91dEVkaXRQb2xpY3kgPT0gbnVsbCA/IG51bGwgOiByZWFsTGF5b3V0RWRpdFBvbGljeQotCQkJCS5nZXRDb21tYW5kKHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnN0cmFpbnRGb3IoQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0LAotCQkJR3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQpIHsKLQkJaW50IGR4ID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKChWaWV3KSBjaGlsZAotCQkJCS5nZXRNb2RlbCgpLCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKSkpCi0JCQkJLmludFZhbHVlKCk7Ci0JCWludCBkeSA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgoVmlldykgY2hpbGQKLQkJCQkuZ2V0TW9kZWwoKSwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkpKQotCQkJCS5pbnRWYWx1ZSgpOwotCQlSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUoZHgsIGR5LCAwLCAwKTsKLQkJY2hpbGQuZ2V0RmlndXJlKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyKTsKLQkJci50cmFuc2xhdGUocmVxdWVzdC5nZXRNb3ZlRGVsdGEoKSk7Ci0JCWNoaWxkLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvUmVsYXRpdmUocik7Ci0JCXJldHVybiByOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXEpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwKLQkJCQkmJiByZWFsTGF5b3V0RWRpdFBvbGljeS51bmRlcnN0YW5kc1JlcXVlc3QocmVxKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnVuZGVyc3RhbmRzUmVxdWVzdChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZUNoaWxkKEVkaXRQYXJ0IGNoaWxkKSB7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhvc3QoRWRpdFBhcnQgaG9zdCkgewotCQlzdXBlci5zZXRIb3N0KGhvc3QpOwotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuc2V0SG9zdChob3N0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LmFjdGl2YXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuZGVhY3RpdmF0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRUYXJnZXRFZGl0UGFydChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJldHVybiByZWFsTGF5b3V0RWRpdFBvbGljeS5nZXRUYXJnZXRFZGl0UGFydChyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBzdXBlci5nZXRUYXJnZXRFZGl0UGFydChyZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93U291cmNlRmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5zaG93U291cmNlRmVlZGJhY2socmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zaG93U291cmNlRmVlZGJhY2socmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZXJhc2VTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LmVyYXNlU291cmNlRmVlZGJhY2socmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5lcmFzZVNvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dUYXJnZXRGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LnNob3dUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnNob3dUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlcmFzZVRhcmdldEZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuZXJhc2VUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmVyYXNlVGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9VTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwMWExOS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9VTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuZWRpdGhlbHBlcnMuQ3JlYXRlRWxlbWVudFJlcXVlc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uVmlld0FuZEVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmNvbW1hbmRzLlVNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMgR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRWxlbWVudFR5cGUgZ2V0RWxlbWVudFR5cGUoQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUNvbm5lY3Rpb25WaWV3QW5kRWxlbWVudFJlcXVlc3QpIHsKLQkJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0QWRhcHRlciByZXF1ZXN0QWRhcHRlciA9ICgoQ3JlYXRlQ29ubmVjdGlvblZpZXdBbmRFbGVtZW50UmVxdWVzdCkgcmVxdWVzdCkKLQkJCQkJLmdldENvbm5lY3Rpb25WaWV3QW5kRWxlbWVudERlc2NyaXB0b3IoKQotCQkJCQkuZ2V0Q3JlYXRlRWxlbWVudFJlcXVlc3RBZGFwdGVyKCk7Ci0JCQlyZXR1cm4gKElFbGVtZW50VHlwZSkgcmVxdWVzdEFkYXB0ZXIuZ2V0QWRhcHRlcihJRWxlbWVudFR5cGUuY2xhc3MpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25uZWN0aW9uV2l0aFJlb3JpZW50ZWRWaWV3Q29tcGxldGVDb21tYW5kKAotCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCkgewotCQlJQ29tbWFuZFByb3h5IGMgPSAoSUNvbW1hbmRQcm94eSkgc3VwZXIKLQkJCQkuZ2V0Q29ubmVjdGlvbkNvbXBsZXRlQ29tbWFuZChyZXF1ZXN0KTsKLQkJQ29tcG9zaXRlQ29tbWFuZCBjYyA9IChDb21wb3NpdGVDb21tYW5kKSBjLmdldElDb21tYW5kKCk7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCVVNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kIHJjdkNvbW1hbmQgPSBuZXcgVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwgbnVsbCk7Ci0JCXJjdkNvbW1hbmQuc2V0RWRnZUFkYXB0b3IoZ2V0Vmlld0FkYXB0ZXIoKSk7Ci0JCWNjLmNvbXBvc2UocmN2Q29tbWFuZCk7Ci0JCXJldHVybiBjOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1VNTFJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9VTUxSZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzdmODRhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1VNTFJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbm5lY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5Hcm91cFJlcXVlc3RWaWFLZXlib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgQ29ubmVjdGlvbkVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19USVRMRSA9IERpYWdyYW1VSU1lc3NhZ2VzLlByb21wdGluZ0RlbGV0ZUFjdGlvbl9EZWxldGVGcm9tRGlhZ3JhbURpYWxvZ19UaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fRElBR1JBTV9ETEdfTUVTU0FHRSA9IERpYWdyYW1VSU1lc3NhZ2VzLlByb21wdGluZ0RlbGV0ZUFjdGlvbl9EZWxldGVGcm9tRGlhZ3JhbURpYWxvZ19NZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRlJPTV9NT0RFTF9ETEdfVE9HR0xFX0xBQkVMID0gRGlhZ3JhbVVJTWVzc2FnZXMuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGVfRG9Ob3RQcm9tcHRBZ2FpblRvZ2dsZV9sYWJlbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCWJvb2xlYW4gaXNEZWxldGVGcm9tS2V5Qm9hcmQgPSBkZWxldGVSZXF1ZXN0IGluc3RhbmNlb2YgR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQ7Ci0JCWlmIChzaG91bGREZWxldGVTZW1hbnRpYygpKSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVsZXRlU2VtYW50aWNDb21tYW5kKGRlbGV0ZVJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJYm9vbGVhbiBwcm9jZWVkVG9EZWxldGVWaWV3ID0gdHJ1ZTsKLQkJCWlmIChpc0RlbGV0ZUZyb21LZXlCb2FyZCkgewotCQkJCUdyb3VwUmVxdWVzdFZpYUtleWJvYXJkIGdyb3VwUmVxdWVzdFZpYUtleWJvYXJkID0gKEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkKSBkZWxldGVSZXF1ZXN0OwotCQkJCWlmIChncm91cFJlcXVlc3RWaWFLZXlib2FyZC5pc1Nob3dJbmZvcm1hdGlvbkRpYWxvZygpKSB7Ci0JCQkJCXByb2NlZWRUb0RlbGV0ZVZpZXcgPSBzaG93UHJvbXB0KCk7Ci0JCQkJCWdyb3VwUmVxdWVzdFZpYUtleWJvYXJkLnNldFNob3dJbmZvcm1hdGlvbkRpYWxvZyhmYWxzZSk7Ci0JCQkJCWlmICghKHByb2NlZWRUb0RlbGV0ZVZpZXcpKQotCQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNyZWF0ZURlbGV0ZVZpZXdDb21tYW5kKGRlbGV0ZVJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVNlbWFudGljKCkgewotCQlBc3NlcnQuaXNUcnVlKGdldEhvc3QoKSBpbnN0YW5jZW9mIEFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0KTsKLQkJQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQgY2VwID0gKEFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0KSBnZXRIb3N0KCk7Ci0JCWJvb2xlYW4gaXNDYW5vbmljYWwgPSBmYWxzZTsKLQkJaWYgKGNlcC5nZXRTb3VyY2UoKSAhPSBudWxsKQotCQkJaXNDYW5vbmljYWwgPSBJc0Nhbm9uaWNhbChjZXAuZ2V0U291cmNlKCkpOwotCQlpZiAoY2VwLmdldFRhcmdldCgpICE9IG51bGwpCi0JCQlyZXR1cm4gaXNDYW5vbmljYWwgPyBpc0Nhbm9uaWNhbCA6IElzQ2Fub25pY2FsKGNlcC5nZXRUYXJnZXQoKSk7Ci0JCXJldHVybiBpc0Nhbm9uaWNhbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIElzQ2Fub25pY2FsKEVkaXRQYXJ0IGVwKSB7Ci0JCUVkaXRQYXJ0IHBhcmVudCA9IGVwLmdldFBhcmVudCgpOwotCQlyZXR1cm4gcGFyZW50IGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQgPyAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJlbnQpCi0JCQkJLmlzQ2Fub25pY2FsKCkKLQkJCQk6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVWaWV3Q29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkobmV3IERlbGV0ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwKLQkJCQkoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRGVsZXRlU2VtYW50aWNDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCUVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIgc2VtUmVxID0gbmV3IEVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIoCi0JCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChlZGl0aW5nRG9tYWluLCBmYWxzZSksIGRlbGV0ZVJlcXVlc3QKLQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKSk7Ci0JCUNvbW1hbmQgc2VtYW50aWNDbWQgPSBnZXRIb3N0KCkuZ2V0Q29tbWFuZChzZW1SZXEpOwotCQlpZiAoc2VtYW50aWNDbWQgIT0gbnVsbCAmJiBzZW1hbnRpY0NtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCUNvbXBvdW5kQ29tbWFuZCBjYyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkJCWNjLmFkZChzZW1hbnRpY0NtZCk7Ci0JCQlyZXR1cm4gY2M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG93UHJvbXB0KCkgewotCQlib29sZWFuIHByb21wdCA9ICgoSVByZWZlcmVuY2VTdG9yZSkgKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKQotCQkJCS5nZXRCb29sZWFuKElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUFJPTVBUX09OX0RFTF9GUk9NX0RJQUdSQU0pOwotCQlpZiAocHJvbXB0KQotCQkJaWYgKHNob3dNZXNzYWdlRGlhbG9nKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3dNZXNzYWdlRGlhbG9nKCkgewotCQlNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSBkaWFsb2cgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZQotCQkJCS5vcGVuWWVzTm9RdWVzdGlvbihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJREVMRVRFX0ZST01fRElBR1JBTV9ETEdfVElUTEUsCi0JCQkJCQlERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19NRVNTQUdFLAotCQkJCQkJREVMRVRFX0ZST01fTU9ERUxfRExHX1RPR0dMRV9MQUJFTCwgZmFsc2UsCi0JCQkJCQkoSVByZWZlcmVuY2VTdG9yZSkgKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCQkJLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKQotCQkJCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksCi0JCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BST01QVF9PTl9ERUxfRlJPTV9ESUFHUkFNKTsKLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkKSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZXRlQ29tbWFuZCgoR3JvdXBSZXF1ZXN0KSByZXF1ZXN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9VTUxUZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvVU1MVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjYWQ5Ni4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9VTUxUZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTW92ZUhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5RXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5EcmFnRWRpdFBhcnRzVHJhY2tlckV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxUZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeSBleHRlbmRzIE5vblJlc2l6YWJsZUVkaXRQb2xpY3lFeCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRmlndXJlIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUZpZ3VyZSBmb2N1c0ZlZWRiYWNrRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dQcmltYXJ5U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJc2hvd1NlbGVjdGlvbigpOwotCQkJc2hvd0ZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlU2VsZWN0aW9uKCk7Ci0JCQlhZGRGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJaGlkZUZvY3VzKCk7Ci0JCQlhZGRGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlID0gY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZUZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0RmVlZGJhY2tMYXllcigpIHsKLQkJcmV0dXJuIGdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxFRF9GRUVEQkFDS19MQVlFUik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0RmVlZGJhY2tCb3VuZHMoKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHM7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJYm91bmRzID0gKChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5nZXRUZXh0Qm91bmRzKCk7Ci0JCQlib3VuZHMuaW50ZXJzZWN0KGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlib3VuZHMgPSBnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQl9Ci0JCWdldEhvc3RGaWd1cmUoKS5nZXRQYXJlbnQoKS50cmFuc2xhdGVUb0Fic29sdXRlKGJvdW5kcyk7Ci0JCWdldEZlZWRiYWNrTGF5ZXIoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGJvdW5kcyk7Ci0JCXJldHVybiBib3VuZHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCUxhYmVsIGZlZWRiYWNrRmlndXJlID0gbmV3IExhYmVsKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRPcGFxdWUodHJ1ZSk7Ci0JCQlmZWVkYmFja0ZpZ3VyZQotCQkJCQkuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVCYWNrZ3JvdW5kU2VsZWN0ZWQpOwotCQkJZmVlZGJhY2tGaWd1cmUKLQkJCQkJLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51Rm9yZWdyb3VuZFNlbGVjdGVkKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfSBlbHNlIHsKLQkJCVJlY3RhbmdsZUZpZ3VyZSBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEZpbGwoZmFsc2UpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCXJldHVybiBuZXcgRmlndXJlKCkgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJCWdyYXBoaWNzLmRyYXdGb2N1cyhnZXRCb3VuZHMoKS5nZXRSZXNpemVkKC0xLCAtMSkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVMYWJlbChMYWJlbCB0YXJnZXQpIHsKLQkJTGFiZWwgc291cmNlID0gKExhYmVsKSBnZXRIb3N0RmlndXJlKCk7Ci0JCXRhcmdldC5zZXRUZXh0KHNvdXJjZS5nZXRUZXh0KCkpOwotCQl0YXJnZXQuc2V0VGV4dEFsaWdubWVudChzb3VyY2UuZ2V0VGV4dEFsaWdubWVudCgpKTsKLQkJdGFyZ2V0LnNldEZvbnQoc291cmNlLmdldEZvbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpIHsKLQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQkJdXBkYXRlTGFiZWwoKExhYmVsKSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKS5leHBhbmQoNSwKLQkJCQkJCTUpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9jdXNGZWVkYmFjaygpIHsKLQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEZlZWRiYWNrKCkgewotCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJTW92ZUhhbmRsZSBtb3ZlSGFuZGxlID0gbmV3IE1vdmVIYW5kbGUoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpOwotCQltb3ZlSGFuZGxlLnNldEJvcmRlcihudWxsKTsKLQkJbW92ZUhhbmRsZS5zZXREcmFnVHJhY2tlcihuZXcgRHJhZ0VkaXRQYXJ0c1RyYWNrZXJFeChnZXRIb3N0KCkpKTsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobW92ZUhhbmRsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1VNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyN2E5NmEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgU2VsZWN0aW9uRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRmlndXJlIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUZpZ3VyZSBmb2N1c0ZlZWRiYWNrRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dQcmltYXJ5U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJc2hvd1NlbGVjdGlvbigpOwotCQkJc2hvd0ZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlU2VsZWN0aW9uKCk7Ci0JCQlhZGRGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJaGlkZUZvY3VzKCk7Ci0JCQlhZGRGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlID0gY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZUZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0RmVlZGJhY2tMYXllcigpIHsKLQkJcmV0dXJuIGdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxFRF9GRUVEQkFDS19MQVlFUik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0RmVlZGJhY2tCb3VuZHMoKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHM7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJYm91bmRzID0gKChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5nZXRUZXh0Qm91bmRzKCk7Ci0JCQlib3VuZHMuaW50ZXJzZWN0KGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlib3VuZHMgPSBnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQl9Ci0JCWdldEhvc3RGaWd1cmUoKS5nZXRQYXJlbnQoKS50cmFuc2xhdGVUb0Fic29sdXRlKGJvdW5kcyk7Ci0JCWdldEZlZWRiYWNrTGF5ZXIoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGJvdW5kcyk7Ci0JCXJldHVybiBib3VuZHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCUxhYmVsIGZlZWRiYWNrRmlndXJlID0gbmV3IExhYmVsKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRPcGFxdWUodHJ1ZSk7Ci0JCQlmZWVkYmFja0ZpZ3VyZQotCQkJCQkuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVCYWNrZ3JvdW5kU2VsZWN0ZWQpOwotCQkJZmVlZGJhY2tGaWd1cmUKLQkJCQkJLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51Rm9yZWdyb3VuZFNlbGVjdGVkKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfSBlbHNlIHsKLQkJCVJlY3RhbmdsZUZpZ3VyZSBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEZpbGwoZmFsc2UpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCXJldHVybiBuZXcgRmlndXJlKCkgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJCWdyYXBoaWNzLmRyYXdGb2N1cyhnZXRCb3VuZHMoKS5nZXRSZXNpemVkKC0xLCAtMSkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVMYWJlbChMYWJlbCB0YXJnZXQpIHsKLQkJTGFiZWwgc291cmNlID0gKExhYmVsKSBnZXRIb3N0RmlndXJlKCk7Ci0JCXRhcmdldC5zZXRUZXh0KHNvdXJjZS5nZXRUZXh0KCkpOwotCQl0YXJnZXQuc2V0VGV4dEFsaWdubWVudChzb3VyY2UuZ2V0VGV4dEFsaWdubWVudCgpKTsKLQkJdGFyZ2V0LnNldEZvbnQoc291cmNlLmdldEZvbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpIHsKLQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQkJdXBkYXRlTGFiZWwoKExhYmVsKSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKS5leHBhbmQoNSwKLQkJCQkJCTUpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9jdXNGZWVkYmFjaygpIHsKLQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEZlZWRiYWNrKCkgewotCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZXhwcmVzc2lvbnMvVU1MQWJzdHJhY3RFeHByZXNzaW9uLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZXhwcmVzc2lvbnMvVU1MQWJzdHJhY3RFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNDA0MGIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2V4cHJlc3Npb25zL1VNTEFic3RyYWN0RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5leHByZXNzaW9uczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVU1MQWJzdHJhY3RFeHByZXNzaW9uIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBESVNBQkxFRF9OT19JTVBMX0VYQ0VQVElPTl9MT0cgPSBCb29sZWFuCi0JCQkudmFsdWVPZigKLQkJCQkJUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oRVBGRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpCi0JCQkJCQkJKyAiL2RlYnVnL2Rpc2FibGVOb0V4cHJJbXBsRXhjZXB0aW9uTG9nIikpCi0JCQkuYm9vbGVhblZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYm9keTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzc2lmaWVyIGNvbnRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVNTEFic3RyYWN0RXhwcmVzc2lvbihFQ2xhc3NpZmllciBjb250ZXh0KSB7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBVTUxBYnN0cmFjdEV4cHJlc3Npb24oU3RyaW5nIGJvZHksIEVDbGFzc2lmaWVyIGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJdGhpcy5ib2R5ID0gYm9keTsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJU3RyaW5nIHBsdWdpbklEID0gRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5JRDsKLQkJdGhpcy5zdGF0dXMgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBwbHVnaW5JRCwgLTEsCi0JCQkJKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIiIsIHRocm93YWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCF0aGlzLnN0YXR1cy5pc09LKCkpIHsKLQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFeHByZXNzaW9uIHByb2JsZW06IiArIG1lc3NhZ2UgKyAiYm9keToiICsgYm9keSwgdGhyb3dhYmxlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoT2JqZWN0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGV2YWx1YXRlKGNvbnRleHQsIENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJaWYgKGNvbnRleHQoKS5pc0luc3RhbmNlKGNvbnRleHQpKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBkb0V2YWx1YXRlKGNvbnRleHQsIGVudik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChESVNBQkxFRF9OT19JTVBMX0VYQ0VQVElPTl9MT0cKLQkJCQkJCSYmIGUgaW5zdGFuY2VvZiBOb0ltcGxFeGNlcHRpb24pIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCSJFeHByZXNzaW9uIGV2YWx1YXRpb24gZmFpbHVyZTogIiArIGJvZHksIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgYm9keSgpIHsKLQkJcmV0dXJuIGJvZHk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3NpZmllciBjb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhc3NpZ25UbyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRU9iamVjdCB0YXJnZXQpIHsKLQkJT2JqZWN0IHZhbHVlID0gZXZhbHVhdGUodGFyZ2V0KTsKLQkJLy8JCXZhbHVlID0gKHZhbHVlICE9IG51bGwpID8gcGVyZm9ybUNhc3QodmFsdWUsIGZlYXR1cmUpIDogbnVsbDsKLQkJLy8JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCS8vCQkJQ29sbGVjdGlvbiBkZXN0Q29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSB0YXJnZXQuZUdldChmZWF0dXJlKTsKLQkJLy8JCQlkZXN0Q29sbGVjdGlvbi5jbGVhcigpOwotCQkvLwkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJLy8JCQkJQ29sbGVjdGlvbiB2YWx1ZUNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgdmFsdWU7Ci0JCS8vCQkJCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZUNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkvLwkJCQkJZGVzdENvbGxlY3Rpb24uYWRkKHBlcmZvcm1DYXN0KGl0Lm5leHQoKSwgZmVhdHVyZSkpOwotCQkvLwkJCQl9Ci0JCS8vCQkJfSBlbHNlIHsKLQkJLy8JCQkJZGVzdENvbGxlY3Rpb24uYWRkKHZhbHVlKTsKLQkJLy8JCQl9Ci0JCS8vCQkJcmV0dXJuOwotCQkvLwkJfQotCQkvLwkJdGFyZ2V0LmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHBlcmZvcm1DYXN0KE9iamVjdCB2YWx1ZSwgRVR5cGVkRWxlbWVudCB0YXJnZXRUeXBlKSB7Ci0JCWlmICh0YXJnZXRUeXBlLmdldEVUeXBlKCkgPT0gbnVsbAotCQkJCXx8IHRhcmdldFR5cGUuZ2V0RVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JCUNsYXNzIHRhcmdldENsYXNzID0gdGFyZ2V0VHlwZS5nZXRFVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKTsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCU51bWJlciBudW0gPSAoTnVtYmVyKSB2YWx1ZTsKLQkJCUNsYXNzIHZhbENsYXNzID0gdmFsdWUuZ2V0Q2xhc3MoKTsKLQkJCUNsYXNzIHRhcmdldFdyYXBwZXJDbGFzcyA9IHRhcmdldENsYXNzOwotCQkJaWYgKHRhcmdldENsYXNzLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQl0YXJnZXRXcmFwcGVyQ2xhc3MgPSBFY29yZVV0aWwud3JhcHBlckNsYXNzRm9yKHRhcmdldENsYXNzKTsKLQkJCX0KLQkJCWlmICh2YWxDbGFzcy5lcXVhbHModGFyZ2V0V3JhcHBlckNsYXNzKSkgewotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJCWlmIChOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0YXJnZXRXcmFwcGVyQ2xhc3MpKSB7Ci0JCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoQnl0ZS5jbGFzcykpCi0JCQkJCXJldHVybiBuZXcgQnl0ZShudW0uYnl0ZVZhbHVlKCkpOwotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKEludGVnZXIuY2xhc3MpKQotCQkJCQlyZXR1cm4gbmV3IEludGVnZXIobnVtLmludFZhbHVlKCkpOwotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKFNob3J0LmNsYXNzKSkKLQkJCQkJcmV0dXJuIG5ldyBTaG9ydChudW0uc2hvcnRWYWx1ZSgpKTsKLQkJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhMb25nLmNsYXNzKSkKLQkJCQkJcmV0dXJuIG5ldyBMb25nKG51bS5sb25nVmFsdWUoKSk7Ci0JCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoQmlnSW50ZWdlci5jbGFzcykpCi0JCQkJCXJldHVybiBCaWdJbnRlZ2VyLnZhbHVlT2YobnVtLmxvbmdWYWx1ZSgpKTsKLQkJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhGbG9hdC5jbGFzcykpCi0JCQkJCXJldHVybiBuZXcgRmxvYXQobnVtLmZsb2F0VmFsdWUoKSk7Ci0JCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoRG91YmxlLmNsYXNzKSkKLQkJCQkJcmV0dXJuIG5ldyBEb3VibGUobnVtLmRvdWJsZVZhbHVlKCkpOwotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKEJpZ0RlY2ltYWwuY2xhc3MpKQotCQkJCQlyZXR1cm4gbmV3IEJpZ0RlY2ltYWwobnVtLmRvdWJsZVZhbHVlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBVTUxBYnN0cmFjdEV4cHJlc3Npb24gY3JlYXRlTnVsbEV4cHJlc3Npb24oCi0JCQlFQ2xhc3NpZmllciBjb250ZXh0KSB7Ci0JCXJldHVybiBuZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKGNvbnRleHQpIHsKLQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCS8vIFRPRE8gLSBsb2cgZW50cnkgYWJvdXQgbm90IHByb3ZpZGVyIGF2YWlsYWJsZSBmb3IgdGhpcyBleHByZXNzaW9uCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTm9JbXBsRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTm9JbXBsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQlzdXBlcihtZXNzYWdlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L0RpYWdyYW1FZGl0b3IuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L0RpYWdyYW1FZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkYzYwNi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9EaWFncmFtRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkRlbGVnYXRpbmdMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxheWVyZWRQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLk5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5VTUxFZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkdFRkFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBtb2RpZmllZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVkaXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3IgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5EaWFncmFtRWRpdG9ySUQiOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCQlEaWFncmFtUm9vdEVkaXRQYXJ0IHJvb3QgPSAoRGlhZ3JhbVJvb3RFZGl0UGFydCkgZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpCi0JCQkJLmdldFJvb3RFZGl0UGFydCgpOwotCQlMYXllcmVkUGFuZSBwcmludGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgZXh0TGFiZWxzTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlleHRMYWJlbHNMYXllci5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBEZWxlZ2F0aW5nTGF5b3V0KCkpOwotCQlwcmludGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihleHRMYWJlbHNMYXllciwKLQkJCQlVTUxFZGl0UGFydEZhY3RvcnkuRVhURVJOQUxfTk9ERV9MQUJFTFNfTEFZRVIsCi0JCQkJTGF5ZXJDb25zdGFudHMuUFJJTUFSWV9MQVlFUik7Ci0JCUxheWVyZWRQYW5lIHNjYWxhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgc2NhbGVkRmVlZGJhY2tMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCXNjYWxlZEZlZWRiYWNrTGF5ZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNjYWxhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoc2NhbGVkRmVlZGJhY2tMYXllciwKLQkJCQlMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIsCi0JCQkJRGlhZ3JhbVJvb3RFZGl0UGFydC5ERUNPUkFUSU9OX1VOUFJJTlRBQkxFX0xBWUVSKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXNIaW50IGdldFByZWZlcmVuY2VzSGludCgpIHsKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlc0hpbnQoRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRG91YmxlQ2xpY2soRXZlbnQgZXZlbnQpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCi0JCS8vIGRvIG5vdGhpbmcgaWYgMCBvciBtb3JlIHRoYW4gMSBlZGl0IHBhcnRzIGFyZSBzZWxlY3RlZAotCQkvLwotCQlpZiAoZWRpdFBhcnRzLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuOwotCi0JCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQlOb2RlIG5vZGUgPSAoTm9kZSllZGl0UGFydC5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IG1vZGVsID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBlZGl0b3JJbnB1dCA9IChEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpZ2V0RWRpdG9ySW5wdXQoKTsKLQkJRGlhZ3JhbUVkaXRvcklucHV0IGRJbnB1dCA9IGVkaXRvcklucHV0LmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCi0JCWlmKG1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpewotCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobW9kZWwpOwotCQkJT2JqZWN0IGUgPSBudWxsOwotCQkJLy8gVE9ETzogaGFuZGxlIFdyYXBwZXIgY2hhbmdlIGJlbG93IGxpbmUgYWZ0ZXIgd3JhcHBlciBpbXBsZW1lbnQKLQkJCQllID0gbm9kZUFkYXB0ZXIuZ2V0RWxlbWVudCgpOwotCQkJaWYoZSA9PSBudWxsKXsKLQkJCQllID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpbW9kZWwpOwotCQkJfQotCQkJaWYoZSAhPSBudWxsKXsKLQkJCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0KAotCQkJCQkJZSwgZElucHV0LmdldFN1cHByZXNzaW9uKCksIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKTsKLQkJCQlEaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbUVkaXRvcihnZXRTaXRlKCkuZ2V0UGFnZSgpLCBpbnB1dCwgCi0JCQkJCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CQkJCQkKLQotCQkJfQotCQl9Ci0KLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUdyYXBoaWNhbFZpZXdlcigpOwotCQkvLyBDb2RlIGZvciBkaXNhYmxpbmcgdGhlIHJlYWRvbmx5IGVsZW1lbnQgaW4gdGhlIGRpYWdyYW0uCi0vLwkJRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1QYXJ0ID0gZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0vLwkJTGlzdCBjaGlsZHJlbiA9IGRpYWdyYW1QYXJ0LmdldENoaWxkcmVuKCk7Ci0vLwkJaWYoIWNoaWxkcmVuLmlzRW1wdHkoKSl7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJRWRpdFBhcnQgcGFydCA9IChFZGl0UGFydCkgaXRlci5uZXh0KCk7Ci0vLwkJCQlpZihwYXJ0IGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpewotLy8JCQkJCU5vZGUgbm9kZSA9IChOb2RlKXBhcnQuZ2V0TW9kZWwoKTsKLS8vCQkJCQlpZihCcmlkZ2VIZWxwZXIuaXNJbmhlcml0ZWQobm9kZSkpewotLy8JCQkJCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KXBhcnQpLmRpc2FibGVFZGl0TW9kZSgpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJc3VwZXIuY3JlYXRlQWN0aW9ucygpOwotCQkKLQkJCi0JCUlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIERpYWdyYW1Db25zdGFudHMuT1BFTl9BQ1RJVklUWV9ERVRBSUxfRElBR1JBTTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCUVkaXRQYXJ0IHNlbGVjdGVkUGFydCA9IChFZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCQkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5nZXQoMCk7Ci0JCQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJCWlmIChzZWxlY3RlZFBhcnQgIT0gbnVsbCkgewotCQkJCQkJTm9kZSB2aWV3ID0gKE5vZGUpIHNlbGVjdGVkUGFydC5nZXRNb2RlbCgpOwotCQkJCQkJRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IChEaWFncmFtRWRpdFBhcnQpIHNlbGVjdGVkUGFydAotCQkJCQkJCQkuZ2V0UGFyZW50KCk7Ci0JCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZGlhZ3JhbUVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IEJyaWRnZUhlbHBlcgotCQkJCQkJCQkuZ2V0RGlhZ3JhbUFkYXB0ZXIoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCi0JCQkJCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKHZpZXcKLQkJCQkJCQkJLmdldEVsZW1lbnQoKSk7Ci0JCQkJCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBhZGFwdGVyLmdldFdyYXBwZXIoKTsKLQkJCQkJCWlmIChzZWxlY3RlZE9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCQkJc2VsZWN0ZWRPYmplY3QgPSBhZGFwdGVyLmdldEVsZW1lbnQoKTsKLQkJCQkJCX0KLQkJCQkJCS8vIElFZGl0b3JQYXJ0IHBhcmVudCA9Ci0JCQkJCQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0KAotCQkJCQkJCQlzZWxlY3RlZE9iamVjdCwKLQkJCQkJCQkJZGlhZ3JhbUFkYXB0ZXIuZ2V0U3VwcHJlc3Npb24oKSwKLQkJCQkJCQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pOwotCQkJCQkJRGlhZ3JhbUVkaXRvclV0aWwKLQkJCQkJCQkJLm9wZW5EaWFncmFtRWRpdG9yKAotCQkJCQkJCQkJCWdldFNpdGUoKS5nZXRQYWdlKCksCi0JCQkJCQkJCQkJaW5wdXQsCi0JCQkJCQkJCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQsCi0JCQkJCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCX0KLQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQlpZiAoZWRpdFBhcnRzLnNpemUoKSAhPSAxKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJCQkmJiBub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkKLQkJCi0JCUxpc3Q8SUVsZW1lbnRUeXBlPiBlbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmNsZWFyKCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzEwMDgpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxKTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BhcnRpdGlvbl9Ob2RlX3RleHQsIGVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1BBUlRJVElPTiwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGFydGl0aW9uX05vZGVfdG9vbHRpcAotCQkJCSwgVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcnRpdGlvbigpLCAKLQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuSW5pdGlhbE5vZGVfMTAwNCk7Ci0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdGV4dCwgZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfU1RBUlRfTk9ERSwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXAsIC8vJE5PTi1OTFMtMSQKLQkJCQlVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRpYWxOb2RlKCksIAotCQkJCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxOb2RlXzEwMDQpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuRm9ya05vZGVfMTAwMyk7Ci0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9Gb3JrX05vZGVfdGV4dCwgZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfRk9SS19OT0RFLCBEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRm9ya19Ob2RlX3Rvb2x0aXAKLQkJCQksIFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9ya05vZGUoKSwgCi0JCQkJCQlVTUxFbGVtZW50VHlwZXMuRm9ya05vZGVfMTAwMykpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkKLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkpvaW5Ob2RlXzEwMDYpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0LCBlbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9TWU5DX0JBUiwgRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcAotCQkJCSwgVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRKb2luTm9kZSgpLCAKLQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5Kb2luTm9kZV8xMDA2KSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkRlY2lzaW9uTm9kZV8xMDA1KTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0LCBlbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9ERUNJU0lPTl9CQVIsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwCi0JCQkJLCBVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldERlY2lzaW9uTm9kZSgpLCAKLQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5EZWNpc2lvbk5vZGVfMTAwNSkpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkKLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLk1lcmdlTm9kZV8xMDAyKTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX01lcmdlX05vZGVfdGV4dCwgZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfTUVSR0VfTk9ERSwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTWVyZ2VfTm9kZV90b29sdGlwCi0JCQkJLCBVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldERlY2lzaW9uTm9kZSgpLCAKLQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5NZXJnZU5vZGVfMTAwMikpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxKTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dCwgZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfRU5EX05PREUsIERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXAKLQkJCQksIFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlGaW5hbE5vZGUoKSwgCi0JCQkJCQlVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSkpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dCwgZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfQUNUSVZJVFksCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXAKLQkJCQksIFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IobnVsbCwgCi0JCQkJCQlVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3KSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSk7Ci0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dCwgZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfSVRFUkFUSU9OLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcAotCQkJCSwgVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihudWxsLCAKLQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwKTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQsIGVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1BIQVNFLCBEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcAotCQkJCSwgVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihudWxsLCAKLQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTApKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dCwgZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfVEFTS19ERVNDUklQVE9SLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwCi0JCQkJLCBVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwsIAotCQkJCQkJVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTWVyZ2VfTm9kZV90ZXh0LCBlbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9NSUxFU1RPTkUsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX01lcmdlX05vZGVfdG9vbHRpcAotCQkJCSwgVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihudWxsLCAKLQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMikpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvQ29udGV4dE1lbnUobWVudSk7Ci0JCWFkZFRvTWVudShtZW51LCBEaWFncmFtQ29uc3RhbnRzLk9QRU5fQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pOwotCQltZW51Lmluc2VydEFmdGVyKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIG5ldyBTZXBhcmF0b3IoCi0JCQkJR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCi0JCWFkZFRvTWVudShtZW51LERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1BBUlRJVElPTik7Ci0JCWFkZFRvTWVudShtZW51LERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1NUQVJUX05PREUpOwotCQlhZGRUb01lbnUobWVudSxEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9TWU5DX0JBUik7Ci0JCWFkZFRvTWVudShtZW51LERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0ZPUktfTk9ERSk7Ci0JCWFkZFRvTWVudShtZW51LERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0RFQ0lTSU9OX0JBUik7Ci0JCWFkZFRvTWVudShtZW51LERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX01FUkdFX05PREUpOwotCQlhZGRUb01lbnUobWVudSxEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9FTkRfTk9ERSk7Ci0JCW1lbnUuaW5zZXJ0QWZ0ZXIoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgbmV3IFNlcGFyYXRvcigKLQkJCQlHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCWFkZFRvTWVudShtZW51LERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0FDVElWSVRZKTsKLQkJYWRkVG9NZW51KG1lbnUsRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfSVRFUkFUSU9OKTsKLQkJYWRkVG9NZW51KG1lbnUsRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfUEhBU0UpOwotCQlhZGRUb01lbnUobWVudSxEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9UQVNLX0RFU0NSSVBUT1IpOwotCQlhZGRUb01lbnUobWVudSxEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9NSUxFU1RPTkUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L0VQRkRpYWdyYW1FZGl0b3JQbHVnaW4uamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L0VQRkRpYWdyYW1FZGl0b3JQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdiZWUyOC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9FUEZEaWFncmFtRWRpdG9yUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5lZGl0LnByb3ZpZGVycy5VTUxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBAbW9kaWZpZWQKLSAqLwotcHVibGljIGNsYXNzIEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZmVyZW5jZXNIaW50IERJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCA9IG5ldyBQcmVmZXJlbmNlc0hpbnQoCi0JCQlJRCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRVBGRGlhZ3JhbUVkaXRvclBsdWdpbiBpbnN0YW5jZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4oKSB7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JCVByZWZlcmVuY2VzSGludC5yZWdpc3RlclByZWZlcmVuY2VTdG9yZShESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQsCi0JCQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlhZGFwdGVyRmFjdG9yeSA9IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQlhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFUEZEaWFncmFtRWRpdG9yUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmlsbEl0ZW1Qcm92aWRlckZhY3RvcmllcyhmYWN0b3JpZXMpOwotCQlyZXR1cm4gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoZmFjdG9yaWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbEl0ZW1Qcm92aWRlckZhY3RvcmllcyhMaXN0IGZhY3RvcmllcykgewotCQlmYWN0b3JpZXMuYWRkKG5ldyBVTUxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SXRlbUltYWdlRGVzY3JpcHRvcihPYmplY3QgaXRlbSkgewotCQlJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IChJSXRlbUxhYmVsUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGl0ZW0sIElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCWxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoaXRlbSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihJRCwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUmVzcGVjdHMgaW1hZ2VzIHJlc2lkaW5nIGluIGFueSBwbHVnLWluLiBJZiBwYXRoIGlzIHJlbGF0aXZlLAotCSAqIHRoZW4gdGhpcyBidW5kbGUgaXMgbG9va2VkIHVwIGZvciB0aGUgaW1hZ2UsIG90aGVyd2lzZSwgZm9yIGFic29sdXRlIAotCSAqIHBhdGgsIGZpcnN0IHNlZ21lbnQgaXMgdGFrZW4gYXMgaWQgb2YgcGx1Zy1pbiB3aXRoIGltYWdlCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gaW1hZ2UsIGVpdGhlciBhYnNvbHV0ZSAod2l0aCBwbHVnLWluIGlkIGFzIGZpcnN0IHNlZ21lbnQpLCBvciByZWxhdGl2ZSBmb3IgYnVuZGxlZCBpbWFnZXMKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZmluZEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlmaW5hbCBJUGF0aCBwID0gbmV3IFBhdGgocGF0aCk7Ci0JCWlmIChwLmlzQWJzb2x1dGUoKSAmJiBwLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihwLnNlZ21lbnQoMCksIHAKLQkJCQkJLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihwLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKiBDbGllbnQgZG8gbm90IG5lZWQgdG8gZGlzcG9zZSB0aGlzIGltYWdlLiBJbWFnZXMgd2lsbCBiZSBkaXNwb3NlZCBhdXRvbWF0aWNhbGx5LgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiBpbWFnZSBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRCdW5kbGVkSW1hZ2UoU3RyaW5nIHBhdGgpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHBhdGgpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChwYXRoLCBnZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKHBhdGgpKTsKLQkJCWltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChwYXRoKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvcikgewotCQlsb2dFcnJvcihlcnJvciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRocm93YWJsZSBhY3R1YWwgZXJyb3Igb3IgbnVsbCBjb3VsZCBiZSBwYXNzZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIGVycm9yLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWlmIChlcnJvciA9PSBudWxsICYmIHRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQllcnJvciA9IHRocm93YWJsZS5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJZ2V0TG9nKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCUlTdGF0dXMuT0ssIGVycm9yLCB0aHJvd2FibGUpKTsKLQkJZGVidWcoZXJyb3IsIHRocm93YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0luZm8oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbG9nSW5mbyhtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhyb3dhYmxlIGFjdHVhbCBlcnJvciBvciBudWxsIGNvdWxkIGJlIHBhc3NlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwgJiYgbWVzc2FnZSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlID0gdGhyb3dhYmxlLmdldE1lc3NhZ2UoKTsKLQkJfQotCQlnZXRMb2coKS5sb2coCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uSUQsIElTdGF0dXMuT0ssCi0JCQkJCQltZXNzYWdlLCB0aHJvd2FibGUpKTsKLQkJZGVidWcobWVzc2FnZSwgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlYnVnKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKLQkJfQotCQlpZiAodGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCXRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MQ3JlYXRpb25XaXphcmQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTENyZWF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YzhkNWMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MQ3JlYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS53aXphcmRzLkVkaXRvckNyZWF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxDcmVhdGlvbldpemFyZCBleHRlbmRzIEVkaXRvckNyZWF0aW9uV2l6YXJkIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc3VwZXIuYWRkUGFnZXMoKTsKLQkJaWYgKHBhZ2UgPT0gbnVsbCkgewotCQkJcGFnZSA9IG5ldyBVTUxDcmVhdGlvbldpemFyZFBhZ2UoZ2V0V29ya2JlbmNoKCksIGdldFNlbGVjdGlvbigpKTsKLQkJfQotCQlhZGRQYWdlKHBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0JCXNldFdpbmRvd1RpdGxlKCJOZXcgQUQgRGlhZ3JhbSIpOyAvLyROT04tTkxTLTEkCi0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcigiaWNvbnMvd2l6YmFuL05ld1VNTFdpemFyZC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MQ3JlYXRpb25XaXphcmRQYWdlLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxDcmVhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc3NDM5My4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxDcmVhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLndpemFyZHMuRWRpdG9yV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5EaWFncmFtRmlsZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTENyZWF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIEVkaXRvcldpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVTUxDcmVhdGlvbldpemFyZFBhZ2UoSVdvcmtiZW5jaCB3b3JrYmVuY2gsCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIoIkNyZWF0aW9uV2l6YXJkUGFnZSIsIHdvcmtiZW5jaCwgc2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZSgiQ3JlYXRlIEFEIERpYWdyYW0iKTsKLQkJc2V0RGVzY3JpcHRpb24oIkNyZWF0ZSBhIG5ldyBBRCBkaWFncmFtLiIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpbGUgY3JlYXRlQW5kT3BlbkRpYWdyYW0oSVBhdGggY29udGFpbmVyUGF0aCwgU3RyaW5nIGZpbGVOYW1lLAotCQkJSW5wdXRTdHJlYW0gaW5pdGlhbENvbnRlbnRzLCBTdHJpbmcga2luZCwgSVdvcmtiZW5jaFdpbmRvdyBkV2luZG93LAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIGJvb2xlYW4gc2F2ZURpYWdyYW0pIHsKLQkJcmV0dXJuIFVNTERpYWdyYW1FZGl0b3JVdGlsLmNyZWF0ZUFuZE9wZW5EaWFncmFtKAotCQkJCWdldERpYWdyYW1GaWxlQ3JlYXRvcigpLCBjb250YWluZXJQYXRoLCBmaWxlTmFtZSwKLQkJCQlpbml0aWFsQ29udGVudHMsIGtpbmQsIGRXaW5kb3csIHByb2dyZXNzTW9uaXRvciwKLQkJCQlpc09wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKCksIHNhdmVEaWFncmFtKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1GaWxlQ3JlYXRvciBnZXREaWFncmFtRmlsZUNyZWF0b3IoKSB7Ci0JCXJldHVybiBVTUxEaWFncmFtRmlsZUNyZWF0b3IuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFncmFtS2luZCgpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTERpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmE0NTAwLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTERpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcyBEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRFZGl0b3JDbGFzcygpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0b3IuY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWRpdG9ySWQoKSB7Ci0JCXJldHVybiBEaWFncmFtRWRpdG9yLklEOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTERpYWdyYW1FZGl0b3IuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTERpYWdyYW1FZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3ZmE1Mi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxEaWFncmFtRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRGVsZWdhdGluZ0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5ZXJlZFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5lZGl0b3IuRmlsZURpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5VTUxFZGl0UGFydEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LlN0b3JhZ2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxEaWFncmFtRWRpdG9yIGV4dGVuZHMgRmlsZURpYWdyYW1FZGl0b3IgaW1wbGVtZW50cyBJR290b01hcmtlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MRGlhZ3JhbUVkaXRvcklEIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVTUxEaWFncmFtRWRpdG9yKCkgewotCQlzdXBlcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFZGl0aW5nRG9tYWluSUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkVkaXRpbmdEb21haW4iOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBjcmVhdGVFZGl0aW5nRG9tYWluKCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBzdXBlci5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JCWRvbWFpbi5zZXRJRChnZXRFZGl0aW5nRG9tYWluSUQoKSk7Ci0JCXJldHVybiBkb21haW47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50UHJvdmlkZXIoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKSAhPSBudWxsKSB7Ci0JCQlzZXREb2N1bWVudFByb3ZpZGVyKG5ldyBVTUxEb2N1bWVudFByb3ZpZGVyKCkpOwotCQl9IGVsc2UgewotCQkJc2V0RG9jdW1lbnRQcm92aWRlcihuZXcgU3RvcmFnZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJc3VwZXIuY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0JCURpYWdyYW1Sb290RWRpdFBhcnQgcm9vdCA9IChEaWFncmFtUm9vdEVkaXRQYXJ0KSBnZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkKLQkJCQkuZ2V0Um9vdEVkaXRQYXJ0KCk7Ci0JCUxheWVyZWRQYW5lIHByaW50YWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklOVEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBleHRMYWJlbHNMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCWV4dExhYmVsc0xheWVyLnNldExheW91dE1hbmFnZXIobmV3IERlbGVnYXRpbmdMYXlvdXQoKSk7Ci0JCXByaW50YWJsZUxheWVycy5hZGRMYXllckFmdGVyKGV4dExhYmVsc0xheWVyLAotCQkJCVVNTEVkaXRQYXJ0RmFjdG9yeS5FWFRFUk5BTF9OT0RFX0xBQkVMU19MQVlFUiwKLQkJCQlMYXllckNvbnN0YW50cy5QUklNQVJZX0xBWUVSKTsKLQkJTGF5ZXJlZFBhbmUgc2NhbGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuU0NBTEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBzY2FsZWRGZWVkYmFja0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJc2NhbGVkRmVlZGJhY2tMYXllci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2NhbGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihzY2FsZWRGZWVkYmFja0xheWVyLAotCQkJCUxheWVyQ29uc3RhbnRzLlNDQUxFRF9GRUVEQkFDS19MQVlFUiwKLQkJCQlEaWFncmFtUm9vdEVkaXRQYXJ0LkRFQ09SQVRJT05fVU5QUklOVEFCTEVfTEFZRVIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTERpYWdyYW1FZGl0b3JVdGlsLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxEaWFncmFtRWRpdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWMyNzlkLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTERpYWdyYW1FZGl0b3JVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5jb21tYW5kcy5DcmVhdGVEaWFncmFtQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS51dGlsLklERUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLkdNRkVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTERpYWdyYW1FZGl0b3JVdGlsIGV4dGVuZHMgSURFRWRpdG9yVXRpbCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRmlsZSBjcmVhdGVBbmRPcGVuRGlhZ3JhbSgKLQkJCURpYWdyYW1GaWxlQ3JlYXRvciBkaWFncmFtRmlsZUNyZWF0b3IsIElQYXRoIGNvbnRhaW5lclBhdGgsCi0JCQlTdHJpbmcgZmlsZU5hbWUsIElucHV0U3RyZWFtIGluaXRpYWxDb250ZW50cywgU3RyaW5nIGtpbmQsCi0JCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdywgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JCQlib29sZWFuIG9wZW5FZGl0b3IsIGJvb2xlYW4gc2F2ZURpYWdyYW0pIHsKLQkJSUZpbGUgZGlhZ3JhbUZpbGUgPSBVTUxEaWFncmFtRWRpdG9yVXRpbC5jcmVhdGVOZXdEaWFncmFtRmlsZSgKLQkJCQlkaWFncmFtRmlsZUNyZWF0b3IsIGNvbnRhaW5lclBhdGgsIGZpbGVOYW1lLCBpbml0aWFsQ29udGVudHMsCi0JCQkJa2luZCwgd2luZG93LmdldFNoZWxsKCksIHByb2dyZXNzTW9uaXRvcik7Ci0JCWlmIChkaWFncmFtRmlsZSAhPSBudWxsICYmIG9wZW5FZGl0b3IpIHsKLQkJCUlERUVkaXRvclV0aWwub3BlbkRpYWdyYW0oZGlhZ3JhbUZpbGUsIHdpbmRvdywgc2F2ZURpYWdyYW0sCi0JCQkJCXByb2dyZXNzTW9uaXRvcik7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW1GaWxlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2l0aGluIGEgd29ya3NwYWNlIG1vZGlmeSBvcGVyYXRpb24gc2luY2UgaXQgY3JlYXRlcyByZXNvdXJjZXMuCi0JICogPC9wPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGZpbGUgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBmaWxlIHdhcyBub3QgY3JlYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUZpbGUgY3JlYXRlTmV3RGlhZ3JhbUZpbGUoCi0JCQlEaWFncmFtRmlsZUNyZWF0b3IgZGlhZ3JhbUZpbGVDcmVhdG9yLCBJUGF0aCBjb250YWluZXJGdWxsUGF0aCwKLQkJCVN0cmluZyBmaWxlTmFtZSwgSW5wdXRTdHJlYW0gaW5pdGlhbENvbnRlbnRzLCBTdHJpbmcga2luZCwKLQkJCVNoZWxsIHNoZWxsLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gR01GRWRpdGluZ0RvbWFpbkZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzaygiQ3JlYXRpbmcgZGlhZ3JhbSBhbmQgbW9kZWwgZmlsZXMiLCA0KTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHN1YlByb2dyZXNzTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IoCi0JCQkJcHJvZ3Jlc3NNb25pdG9yLCAxKTsKLQkJZmluYWwgSUZpbGUgZGlhZ3JhbUZpbGUgPSBkaWFncmFtRmlsZUNyZWF0b3IuY3JlYXRlTmV3RmlsZSgKLQkJCQljb250YWluZXJGdWxsUGF0aCwgZmlsZU5hbWUsIGluaXRpYWxDb250ZW50cywgc2hlbGwsCi0JCQkJbmV3IElSdW5uYWJsZUNvbnRleHQoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bihib29sZWFuIGZvcmssIGJvb2xlYW4gY2FuY2VsYWJsZSwKLQkJCQkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpCi0JCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJcnVubmFibGUucnVuKHN1YlByb2dyZXNzTW9uaXRvcik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gcmVzb3VyY2VTZXQKLQkJCQkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGlhZ3JhbUZpbGUKLQkJCQkJCS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKTsKLQkJTGlzdCBhZmZlY3RlZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhZmZlY3RlZEZpbGVzLmFkZChkaWFncmFtRmlsZSk7Ci0KLQkJZmluYWwgU3RyaW5nIGtpbmRQYXJhbSA9IGtpbmQ7Ci0JCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sICJDcmVhdGluZyBkaWFncmFtIGFuZCBtb2RlbCIsIGFmZmVjdGVkRmlsZXMpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCUFjdGl2aXR5IG1vZGVsID0gY3JlYXRlSW5pdGlhbE1vZGVsKCk7Ci0JCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKG1vZGVsKTsKLQkJCQlEaWFncmFtIGRpYWdyYW0gPSBWaWV3U2VydmljZS5jcmVhdGVEaWFncmFtKG1vZGVsLCBraW5kUGFyYW0sCi0JCQkJCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQkJCWRpYWdyYW0uc2V0TmFtZShkaWFncmFtRmlsZS5nZXROYW1lKCkpOwotCQkJCQlkaWFncmFtLnNldEVsZW1lbnQobW9kZWwpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlkaWFncmFtUmVzb3VyY2Uuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQotCQkJCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJIlVuYWJsZSB0byBzdG9yZSBtb2RlbCBhbmQgZGlhZ3JhbSByZXNvdXJjZXMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoKTsKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCWRpYWdyYW1GaWxlLnNldENoYXJzZXQoCi0JCQkJCSJVVEYtOCIsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gc2V0IGNoYXJzZXQgZm9yIGRpYWdyYW0gZmlsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gZGlhZ3JhbUZpbGU7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRmlsZSBjcmVhdGVBbmRPcGVuRGlhZ3JhbSgKLQkJCURpYWdyYW1GaWxlQ3JlYXRvciBkaWFncmFtRmlsZUNyZWF0b3IsIElQYXRoIGNvbnRhaW5lclBhdGgsCi0JCQlTdHJpbmcgZmlsZU5hbWUsIElucHV0U3RyZWFtIGluaXRpYWxDb250ZW50cywgU3RyaW5nIGtpbmQsCi0JCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdywgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JCQlib29sZWFuIG9wZW5FZGl0b3IsIGJvb2xlYW4gc2F2ZURpYWdyYW0sIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJRmlsZSBkaWFncmFtRmlsZSA9IFVNTERpYWdyYW1FZGl0b3JVdGlsLmNyZWF0ZU5ld0RpYWdyYW1GaWxlKAotCQkJCWRpYWdyYW1GaWxlQ3JlYXRvciwgY29udGFpbmVyUGF0aCwgZmlsZU5hbWUsIGluaXRpYWxDb250ZW50cywKLQkJCQlraW5kLCB3aW5kb3cuZ2V0U2hlbGwoKSwgcHJvZ3Jlc3NNb25pdG9yLCBpbnB1dCk7Ci0JCWlmIChkaWFncmFtRmlsZSAhPSBudWxsICYmIG9wZW5FZGl0b3IpIHsKLQkJCUlERUVkaXRvclV0aWwub3BlbkRpYWdyYW0oZGlhZ3JhbUZpbGUsIHdpbmRvdywgc2F2ZURpYWdyYW0sCi0JCQkJCXByb2dyZXNzTW9uaXRvcik7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW1GaWxlOwotCi0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aXRoaW4gYSB3b3Jrc3BhY2UgbW9kaWZ5IG9wZXJhdGlvbiBzaW5jZSBpdCBjcmVhdGVzIHJlc291cmNlcy4KLQkgKiA8L3A+Ci0JICogQG1vZGlmaWVkCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBmaWxlIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZmlsZSB3YXMgbm90IGNyZWF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElGaWxlIGNyZWF0ZU5ld0RpYWdyYW1GaWxlKAotCQkJRGlhZ3JhbUZpbGVDcmVhdG9yIGRpYWdyYW1GaWxlQ3JlYXRvciwgSVBhdGggY29udGFpbmVyRnVsbFBhdGgsCi0JCQlTdHJpbmcgZmlsZU5hbWUsIElucHV0U3RyZWFtIGluaXRpYWxDb250ZW50cywgU3RyaW5nIGtpbmQsCi0JCQlTaGVsbCBzaGVsbCwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gR01GRWRpdGluZ0RvbWFpbkZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzaygiQ3JlYXRpbmcgZGlhZ3JhbSBhbmQgbW9kZWwgZmlsZXMiLCA0KTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHN1YlByb2dyZXNzTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IoCi0JCQkJcHJvZ3Jlc3NNb25pdG9yLCAxKTsKLQkJZmluYWwgSUZpbGUgZGlhZ3JhbUZpbGUgPSBkaWFncmFtRmlsZUNyZWF0b3IuY3JlYXRlTmV3RmlsZSgKLQkJCQljb250YWluZXJGdWxsUGF0aCwgZmlsZU5hbWUsIGluaXRpYWxDb250ZW50cywgc2hlbGwsCi0JCQkJbmV3IElSdW5uYWJsZUNvbnRleHQoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bihib29sZWFuIGZvcmssIGJvb2xlYW4gY2FuY2VsYWJsZSwKLQkJCQkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpCi0JCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJcnVubmFibGUucnVuKHN1YlByb2dyZXNzTW9uaXRvcik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gcmVzb3VyY2VTZXQKLQkJCQkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGlhZ3JhbUZpbGUKLQkJCQkJCS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKTsKLQkJTGlzdCBhZmZlY3RlZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhZmZlY3RlZEZpbGVzLmFkZChkaWFncmFtRmlsZSk7Ci0KLQkJLy9maW5hbCBTdHJpbmcga2luZFBhcmFtID0ga2luZDsKLQkJQ3JlYXRlRGlhZ3JhbUNvbW1hbmQgY29tbWFuZCA9IG5ldyBDcmVhdGVEaWFncmFtQ29tbWFuZChlZGl0aW5nRG9tYWluLAotCQkJCSJDcmVhdGluZyBkaWFncmFtIGFuZCBtb2RlbCIsIGFmZmVjdGVkRmlsZXMsIGlucHV0LAotCQkJCWRpYWdyYW1SZXNvdXJjZSwga2luZCk7Ci0JCXRyeSB7Ci0JCQlPcGVyYXRpb25IaXN0b3J5RmFjdG9yeS5nZXRPcGVyYXRpb25IaXN0b3J5KCkuZXhlY3V0ZShjb21tYW5kLAotCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgMSksIG51bGwpOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBtb2RlbCBhbmQgZGlhZ3JhbSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJZGlhZ3JhbUZpbGUuc2V0Q2hhcnNldCgKLQkJCQkJIlVURi04IiwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBzZXQgY2hhcnNldCBmb3IgZGlhZ3JhbSBmaWxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBkaWFncmFtRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgZG9tYWluIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGNhbnZhcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBjcmVhdGVJbml0aWFsTW9kZWwoKSB7Ci0JCXJldHVybiBVTUxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eSgpOwotCX0KLQotCS8qKgotCSAqIFRvIG9wZW4gYSBkaWFncmFtIGFuZCBjcmVhdGUgYSBmaWxlLgotCSAqIEBjdXN0b20KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlQW5kT3BlbkRpYWdyYW0oSVdvcmtiZW5jaFdpbmRvdyBkV2luZG93LAotCQkJSUVkaXRvcklucHV0IGlucHV0LCBQcm9jZXNzIHByb2MpIHsKLQkJVU1MRGlhZ3JhbUVkaXRvclV0aWwuY3JlYXRlQW5kT3BlbkRpYWdyYW0oVU1MRGlhZ3JhbUZpbGVDcmVhdG9yCi0JCQkJLmdldEluc3RhbmNlKCksIGdldENvbnRhaW5lclBhdGgocHJvYyksICJkZWZhdWx0IiwgRWRpdG9yVXRpbAotCQkJCS5nZXRJbml0aWFsQ29udGVudHMoKSwgIkVQRiBVTUwiLCBkV2luZG93LAotCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRydWUsIHRydWUsIGlucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRDb250YWluZXJQYXRoKCkgewotCQlJUGF0aCBwYXRoID0gRWRpdG9yVXRpbC5nZXREZWZhdWx0RGlhZ3JhbVBhdGgobnVsbCwgbnVsbCk7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IHJvb3QuZ2V0UHJvamVjdHMoKTsKLQotCQkJcGF0aCA9IHJvb3QuZ2V0RnVsbFBhdGgoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7ICsraSkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQotCQkJCWlmIChwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCXBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAY3VzdG9tCi0JICogCi0JICogQHBhcmFtIHByb2MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRDb250YWluZXJQYXRoKFByb2Nlc3MgcHJvYykgewotCi0JCWlmIChwcm9jIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHByb2MpOwotCi0JCQlTdHJpbmcgcmVsYXRpdmVEaXI7Ci0KLQkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQlyZWxhdGl2ZURpciA9IE11bHRpRmlsZVNhdmVVdGlsLkNBUEFCSUxJVFlfUEFUVEVSTl9QQVRIOwotCQkJfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJcmVsYXRpdmVEaXIgPSBNdWx0aUZpbGVTYXZlVXRpbC5ERUxJVkVSWV9QUk9DRVNTX1BBVEg7Ci0JCQl9IGVsc2UgewotCQkJCXJlbGF0aXZlRGlyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJSVBhdGggd29ya3NwYWNlUGF0aCA9IEVkaXRvclV0aWwuZ2V0RGVmYXVsdERpYWdyYW1QYXRoKG51bGwsIG51bGwpOwotCQkJaWYgKHdvcmtzcGFjZVBhdGggPT0gbnVsbCkgewotCQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSByb290LmdldFByb2plY3RzKCk7Ci0KLQkJCQl3b3Jrc3BhY2VQYXRoID0gcm9vdC5nZXRGdWxsUGF0aCgpOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7ICsraSkgewotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0KLQkJCQkJaWYgKHByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQkJCXdvcmtzcGFjZVBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJU3RyaW5nIGxpYkRpciA9IHdvcmtzcGFjZVBhdGgudG9TdHJpbmcoKTsKLQkJCVN0cmluZyBwbHVnaW5EaXIgPSBsaWJEaXIgKyBGaWxlLnNlcGFyYXRvciArIHBsdWdpbi5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgZGlhZ3JhbURpciA9IHBsdWdpbkRpciArIEZpbGUuc2VwYXJhdG9yICsgcmVsYXRpdmVEaXIKLQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHByb2MuZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3I7Ci0KLQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRpYWdyYW1EaXIpOwotCQkJcmV0dXJuIHBhdGg7Ci0KLQkJCS8vCQkJcmV0dXJuIHdvcmtzcGFjZVBhdGg7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEVkaXRvcklucHV0VG9EaWFncmFtKERpYWdyYW0gZGlhZ3JhbSwKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCkgewotCi0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxEaWFncmFtRmlsZUNyZWF0b3IuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTERpYWdyYW1GaWxlQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDFiODJhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTERpYWdyYW1GaWxlQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLnV0aWwuSURFRWRpdG9yRmlsZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTERpYWdyYW1GaWxlQ3JlYXRvciBleHRlbmRzIElERUVkaXRvckZpbGVDcmVhdG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBVTUxEaWFncmFtRmlsZUNyZWF0b3IgSU5TVEFOQ0UgPSBuZXcgVU1MRGlhZ3JhbUZpbGVDcmVhdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFncmFtRmlsZUNyZWF0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxEaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxEaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZjJiOGMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzCi0JCURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLmluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKTsKLQkJRGlhZ3JhbUNvcmVVdGlsLnNldERlZmF1bHRGb250UHJlZmVyZW5jZShnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MRG9jdW1lbnRQcm92aWRlci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MRG9jdW1lbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODUzNWYwLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTERvY3VtZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLk11bHRpUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5EZW11bHRpcGxleGluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5Ob3RpZmljYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucHJvdmlkZXJzLkRpYWdyYW1FZGl0b3JEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5EaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuRmlsZURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogQG1vZGlmaWVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxEb2N1bWVudFByb3ZpZGVyIGV4dGVuZHMgRGlhZ3JhbUVkaXRvckRvY3VtZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZURvY3VtZW50VG9GaWxlKElEb2N1bWVudCBkb2N1bWVudCwgSUZpbGUgZmlsZSwKLQkJCWJvb2xlYW4gb3ZlcndyaXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy9EaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZG9jdW1lbnQuZ2V0Q29udGVudCgpOwotCQkvL1Jlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IGRpYWdyYW0uZVJlc291cmNlKCk7Ci0JCUlEaWFncmFtRG9jdW1lbnQgZGlhZ3JhbURvY3VtZW50ID0gKElEaWFncmFtRG9jdW1lbnQpIGRvY3VtZW50OwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBkaWFncmFtRG9jdW1lbnQuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlMaXN0IHJlc291cmNlcyA9IGRvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpOwotCi0JCW1vbml0b3IuYmVnaW5UYXNrKCJTYXZpbmcgZGlhZ3JhbSIsIHJlc291cmNlcy5zaXplKCkgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQlzdXBlci5zYXZlRG9jdW1lbnRUb0ZpbGUoZG9jdW1lbnQsIGZpbGUsIG92ZXJ3cml0ZSwKLQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJLy8JCWZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkvLwkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkvLwkJCW1vbml0b3Iuc2V0VGFza05hbWUoIlNhdmluZyAiICsgbmV4dFJlc291cmNlLmdldFVSSSgpKTsgLy8kTk9OLU5MUy0xJAotCQkvLwkJCWlmIChuZXh0UmVzb3VyY2UgIT0gZGlhZ3JhbVJlc291cmNlICYmIG5leHRSZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCS8vCQkJCXRyeSB7Ci0JCS8vCQkJCQluZXh0UmVzb3VyY2Uuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkvLwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCS8vCQkJCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCS8vCQkJCQkJCS5nZXRJbnN0YW5jZSgpCi0JCS8vCQkJCQkJCS5sb2dFcnJvcigKLQkJLy8JCQkJCQkJCQkiVW5hYmxlIHRvIHNhdmUgcmVzb3VyY2U6ICIgKyBuZXh0UmVzb3VyY2UuZ2V0VVJJKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCS8vCQkJCX0KLQkJLy8JCQl9Ci0JCS8vCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCS8vCQl9Ci0JCW1vbml0b3IuZG9uZSgpOwotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0U2F2ZVJ1bGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSURpYWdyYW1Eb2N1bWVudCBkaWFncmFtRG9jdW1lbnQgPSBnZXREaWFncmFtRG9jdW1lbnQoZWxlbWVudCk7Ci0JCWlmIChkaWFncmFtRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJRGlhZ3JhbSBkaWFncmFtID0gZGlhZ3JhbURvY3VtZW50LmdldERpYWdyYW0oKTsKLQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQlDb2xsZWN0aW9uIHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBkaWFncmFtRG9jdW1lbnQuZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJSUZpbGUgbmV4dEZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIKLQkJCQkJCQkuZ2V0RmlsZSgoUmVzb3VyY2UpIGl0Lm5leHQoKSk7Ci0JCQkJCWlmIChuZXh0RmlsZSAhPSBudWxsKSB7Ci0JCQkJCQlydWxlcy5hZGQoY29tcHV0ZVNhdmVTY2hlZHVsaW5nUnVsZShuZXh0RmlsZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBuZXcgTXVsdGlSdWxlKChJU2NoZWR1bGluZ1J1bGVbXSkgcnVsZXMKLQkJCQkJCS50b0FycmF5KG5ldyBJU2NoZWR1bGluZ1J1bGVbcnVsZXMuc2l6ZSgpXSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTYXZlUnVsZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmlsZUluZm8gY3JlYXRlRmlsZUluZm8oSURvY3VtZW50IGRvY3VtZW50LAotCQkJRmlsZVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIsIElGaWxlRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJLy8gICAgYXNzZXJ0IGRvY3VtZW50IGluc3RhbmNlb2YgRGlhZ3JhbURvY3VtZW50OwotCi0JCURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lciBkaWFncmFtTGlzdGVuZXIgPSBuZXcgQ3VzdG9tTW9kaWZpY2F0aW9uTGlzdGVuZXIoCi0JCQkJdGhpcywgKERpYWdyYW1Eb2N1bWVudCkgZG9jdW1lbnQsIGlucHV0KTsKLQkJLy8JCURpYWdyYW1GaWxlSW5mbyBpbmZvID0gbmV3IERpYWdyYW1GaWxlSW5mbyhkb2N1bWVudCwgc3luY2hyb25pemVyLAotCQkvLwkJCQlkaWFncmFtTGlzdGVuZXIpOwotCQlEaWFncmFtRmlsZUluZm9TeW5jIGluZm8gPSBuZXcgRGlhZ3JhbUZpbGVJbmZvU3luYyhkb2N1bWVudCwKLQkJCQlzeW5jaHJvbml6ZXIsIGRpYWdyYW1MaXN0ZW5lciwgaW5wdXQpOwotCi0JCWRpYWdyYW1MaXN0ZW5lci5zdGFydExpc3RlbmluZygpOwotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJU2NoZWR1bGluZ1J1bGUgY29tcHV0ZVNhdmVTY2hlZHVsaW5nUnVsZShJUmVzb3VyY2UgdG9DcmVhdGVPck1vZGlmeSkgewotCQlpZiAodG9DcmVhdGVPck1vZGlmeS5leGlzdHMoKQotCQkJCSYmIHRvQ3JlYXRlT3JNb2RpZnkuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKQotCQkJcmV0dXJuIGZSZXNvdXJjZVJ1bGVGYWN0b3J5Lm1vZGlmeVJ1bGUodG9DcmVhdGVPck1vZGlmeSk7Ci0KLQkJSVJlc291cmNlIHBhcmVudCA9IHRvQ3JlYXRlT3JNb2RpZnk7Ci0JCWRvIHsKLQkJCS8qCi0JCQkgKiBYWFggVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NzYwMQotCQkJICogSVJlc291cmNlUnVsZUZhY3RvcnkuY3JlYXRlUnVsZSBzaG91bGQgaXRlcmF0ZSB0aGUgaGllcmFyY2h5IGl0c2VsZi4KLQkJCSAqLwotCQkJdG9DcmVhdGVPck1vZGlmeSA9IHBhcmVudDsKLQkJCXBhcmVudCA9IHRvQ3JlYXRlT3JNb2RpZnkuZ2V0UGFyZW50KCk7Ci0JCX0gd2hpbGUgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuZXhpc3RzKCkKLQkJCQkmJiAhcGFyZW50LmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKSk7Ci0KLQkJcmV0dXJuIGZSZXNvdXJjZVJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGUodG9DcmVhdGVPck1vZGlmeSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgY2xhc3MgQ3VzdG9tTW9kaWZpY2F0aW9uTGlzdGVuZXIgZXh0ZW5kcwotCQkJRmlsZURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgRGVtdWx0aXBsZXhpbmdMaXN0ZW5lciBteUxpc3RlbmVyID0gbnVsbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIEN1c3RvbU1vZGlmaWNhdGlvbkxpc3RlbmVyKAotCQkJCVVNTERvY3VtZW50UHJvdmlkZXIgZG9jdW1lbnRQcm92aWRlclBhcmFtZXRlciwKLQkJCQlEaWFncmFtRG9jdW1lbnQgZG9jdW1lbnRQYXJhbWV0ZXIsCi0JCQkJSUZpbGVFZGl0b3JJbnB1dCBpbnB1dFBhcmFtZXRlcikgewotCQkJc3VwZXIoZG9jdW1lbnRQcm92aWRlclBhcmFtZXRlciwgZG9jdW1lbnRQYXJhbWV0ZXIsIGlucHV0UGFyYW1ldGVyKTsKLQkJCWZpbmFsIERpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50UGFyYW1ldGVyOwotCQkJTm90aWZpY2F0aW9uRmlsdGVyIGRpYWdyYW1SZXNvdXJjZU1vZGlmaWVkRmlsdGVyID0gTm90aWZpY2F0aW9uRmlsdGVyCi0JCQkJCS5jcmVhdGVFdmVudFR5cGVGaWx0ZXIoTm90aWZpY2F0aW9uLlNFVCk7Ci0JCQlteUxpc3RlbmVyID0gbmV3IERlbXVsdGlwbGV4aW5nTGlzdGVuZXIoCi0JCQkJCWRpYWdyYW1SZXNvdXJjZU1vZGlmaWVkRmlsdGVyKSB7Ci0JCQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKAotCQkJCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJCQkJTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQlSZXNvdXJjZSBtb2RpZmllZFJlc291cmNlID0gKChFT2JqZWN0KSBub3RpZmljYXRpb24KLQkJCQkJCQkJLmdldE5vdGlmaWVyKCkpLmVSZXNvdXJjZSgpOwotCQkJCQkJaWYgKG1vZGlmaWVkUmVzb3VyY2UgIT0gZG9jdW1lbnQuZ2V0RGlhZ3JhbSgpCi0JCQkJCQkJCS5lUmVzb3VyY2UoKSkgewotCQkJCQkJCWRvY3VtZW50LnNldENvbnRlbnQoZG9jdW1lbnQuZ2V0Q29udGVudCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdGFydExpc3RlbmluZygpIHsKLQkJCXN1cGVyLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkuYWRkUmVzb3VyY2VTZXRMaXN0ZW5lcihteUxpc3RlbmVyKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdG9wTGlzdGVuaW5nKCkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJlbW92ZVJlc291cmNlU2V0TGlzdGVuZXIobXlMaXN0ZW5lcik7Ci0JCQlzdXBlci5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyOGZkOS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5HTUZFZGl0aW5nRG9tYWluRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEluaXREaWFncmFtRmlsZUFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBteVBhcnQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBteVNlbGVjdGVkTW9kZWxGaWxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gbXlTZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQlteVBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlteVNlbGVjdGVkTW9kZWxGaWxlID0gbnVsbDsKLQkJbXlTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiA9PSBmYWxzZQotCQkJCXx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlteVNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQlteVNlbGVjdGVkTW9kZWxGaWxlID0gKElGaWxlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBHTUZFZGl0aW5nRG9tYWluRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCQlFT2JqZWN0IGRpYWdyYW1Sb290ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJCi0JCQkJCS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKG15U2VsZWN0ZWRNb2RlbEZpbGUKLQkJCQkJCQkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSwgdHJ1ZSk7Ci0JCQlkaWFncmFtUm9vdCA9IChFT2JqZWN0KSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBleCkgewotCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIlVuYWJsZSB0byBsb2FkIHJlc291cmNlOiAiICsgbXlTZWxlY3RlZE1vZGVsRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChkaWFncmFtUm9vdCA9PSBudWxsKSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihteVBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCksICJFcnJvciIsCi0JCQkJCSJNb2RlbCBmaWxlIGxvYWRpbmcgZmFpbGVkIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJV2l6YXJkIHdpemFyZCA9IG5ldyBVTUxOZXdEaWFncmFtRmlsZVdpemFyZChteVNlbGVjdGVkTW9kZWxGaWxlLCBteVBhcnQKLQkJCQkuZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgbXlTZWxlY3Rpb24sIGRpYWdyYW1Sb290LCBlZGl0aW5nRG9tYWluKTsKLQkJSURpYWxvZ1NldHRpbmdzIHBsdWdpbkRpYWxvZ1NldHRpbmdzID0gRVBGRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5nZXRJbnN0YW5jZSgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyBpbml0RGlhZ3JhbUZpbGVTZXR0aW5ncyA9IHBsdWdpbkRpYWxvZ1NldHRpbmdzCi0JCQkJLmdldFNlY3Rpb24oIkluaXNEaWFncmFtRmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbml0RGlhZ3JhbUZpbGVTZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQlpbml0RGlhZ3JhbUZpbGVTZXR0aW5ncyA9IHBsdWdpbkRpYWxvZ1NldHRpbmdzCi0JCQkJCS5hZGROZXdTZWN0aW9uKCJJbmlzRGlhZ3JhbUZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyhpbml0RGlhZ3JhbUZpbGVTZXR0aW5ncyk7Ci0JCXdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoZmFsc2UpOwotCQl3aXphcmQuc2V0V2luZG93VGl0bGUoIkluaXRpYWxpemUgbmV3ICIgKyBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJKyAiIGRpYWdyYW0gZmlsZSIpOwotCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKG15UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwKLQkJCQl3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoTWF0aC5tYXgoNTAwLCBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCksCi0JCQkJNTAwKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxMb2FkUmVzb3VyY2VBY3Rpb24uamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTExvYWRSZXNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGM0ODZiLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTExvYWRSZXNvdXJjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uLkxvYWRSZXNvdXJjZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxMb2FkUmVzb3VyY2VBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQWN0aXZpdHlFZGl0UGFydCBteVNlbGVjdGVkRWxlbWVudDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFNoZWxsIG15U2hlbGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQlteVNoZWxsID0gdGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUxvYWRSZXNvdXJjZURpYWxvZyBsb2FkUmVzb3VyY2VEaWFsb2cgPSBuZXcgTG9hZFJlc291cmNlRGlhbG9nKG15U2hlbGwsCi0JCQkJbXlTZWxlY3RlZEVsZW1lbnQuZ2V0RWRpdGluZ0RvbWFpbigpKTsKLQkJbG9hZFJlc291cmNlRGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJbXlTZWxlY3RlZEVsZW1lbnQgPSBudWxsOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSA9PSAxCi0JCQkJCSYmIHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eUVkaXRQYXJ0KSB7Ci0JCQkJbXlTZWxlY3RlZEVsZW1lbnQgPSAoQWN0aXZpdHlFZGl0UGFydCkgc3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJfQotCQl9Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIG15U2VsZWN0ZWRFbGVtZW50ICE9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxNYXRjaGluZ1N0cmF0ZWd5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxNYXRjaGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTQ3NmMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MTWF0Y2hpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGFydHMuRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRvY3VtZW50UHJvdmlkZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5NRWRpdGluZ0RvbWFpbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRvY3VtZW50UHJvdmlkZXJSZWdpc3RyeS5JRG9jdW1lbnRQcm92aWRlclNlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnBhcnRzLkRpYWdyYW1Eb2N1bWVudEVkaXRvck1hdGNoaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MTWF0Y2hpbmdTdHJhdGVneSBleHRlbmRzIERpYWdyYW1Eb2N1bWVudEVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yTWF0Y2hpbmdTdHJhdGVneSNtYXRjaGVzKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2UsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJLy9yZXR1cm4gc3VwZXIubWF0Y2hlcyhlZGl0b3JSZWYsIGlucHV0KTsKLQkJSUVkaXRvcklucHV0IGV4aXN0aW5nRWRpdG9ySW5wdXQ7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGVkaXRvclJlZi5nZXRFZGl0b3IoZmFsc2UpOwotCi0JCXRyeSB7Ci0JCQlleGlzdGluZ0VkaXRvcklucHV0ID0gZWRpdG9yUmVmLmdldEVkaXRvcklucHV0KCk7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIElmIHRoZSBFeGlzdGluZ0VkaXRvcklucHV0IGlzIHNhbWUgYXMgdGhlIHBhc3NlZCBpbnB1dCwKLQkJLy8gcmV0dXJuIHRydWUKLQkJaWYgKGV4aXN0aW5nRWRpdG9ySW5wdXQuZXF1YWxzKGlucHV0KSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmICghKGlucHV0IGluc3RhbmNlb2YgTUVkaXRpbmdEb21haW5FbGVtZW50KQotCQkJCSYmIChlZGl0b3IgaW5zdGFuY2VvZiBEaWFncmFtRG9jdW1lbnRFZGl0b3IpKSB7Ci0JCQkvLyBJZiB0aGUgaW5wdXQgaXNuJ3QgYW4gaW5zdGFuY2VvZiBNRWRpdGluZ0RvbWFpbkVsZW1lbnQsIGFuZCB0aGUgZWRpdG9yIGlzIGluc3RhbmNlb2YgRGlhZ3JhbURvY3VtZW50RWRpdG9yCi0JCQkvLyB0aGVuIGRvbid0IG1hdGNoIGl0LCBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBjbGllbnQgc2hvdWxkbid0IHVzZSB0aGlzIHN0cmF0ZWd5IGZvciBub24tRGlhZ3JhbURvY3VtZW50RWRpdG9yLgotCQkJSURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyIGRvY1Byb3ZpZGVyID0gKElEaWFncmFtRG9jdW1lbnRQcm92aWRlcikgRG9jdW1lbnRQcm92aWRlclJlZ2lzdHJ5Ci0JCQkJCS5nZXREZWZhdWx0KCkuZ2V0RG9jdW1lbnRQcm92aWRlcihpbnB1dCwKLQkJCQkJCQluZXcgSURvY3VtZW50UHJvdmlkZXJTZWxlY3RvcigpIHsKLQotCQkJCQkJCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoU3RyaW5nIGRvY3VtZW50VHlwZSkgewotCQkJCQkJCQkJLy8gT25seSBjaGVja2luZyBvZiB0aGUgaW50ZXJmYWNlIG5hbWUKLQkJCQkJCQkJCXJldHVybiBkb2N1bWVudFR5cGUKLQkJCQkJCQkJCQkJLmVxdWFscyhJRGlhZ3JhbURvY3VtZW50LmNsYXNzCi0JCQkJCQkJCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9ICgoRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQpCi0JCQkJCQkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCS8vTWV0aG9kRWxlbWVudCBleGlzaXRuZ0UgPSgoRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dClleGlzdGluZ0VkaXRvcklucHV0KS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJTWV0aG9kRWxlbWVudCBleGlzdGluZ0UgPSAoKERpYWdyYW1GaWxlRWRpdG9ySW5wdXQpIGV4aXN0aW5nRWRpdG9ySW5wdXQKLQkJCQkJCS5nZXRQZXJzaXN0YWJsZSgpKS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKQotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQlpZiAoZSAhPSBleGlzdGluZ0UpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKGRvY1Byb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBkb2NQcm92aWRlcgotCQkJCQkJLmNyZWF0ZUlucHV0V2l0aEVkaXRpbmdEb21haW4oaW5wdXQsCi0JCQkJCQkJCSgoRGlhZ3JhbURvY3VtZW50RWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKSk7Ci0JCQkJcmV0dXJuIGVkaXRvcklucHV0LmVxdWFscyhleGlzdGluZ0VkaXRvcklucHV0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTE5ld0RpYWdyYW1GaWxlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YWVkNTYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5PcGVyYXRpb25IaXN0b3J5RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLnZpZXcuQ3JlYXRlRGlhZ3JhbVZpZXdPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIG15RWRpdGluZ0RvbWFpbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgbXlGaWxlQ3JlYXRpb25QYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUZpbGUgbXlTZWxlY3RlZE1vZGVsRmlsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElXb3JrYmVuY2hQYWdlIG15V29ya2JlbmNoUGFnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG15U2VsZWN0aW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRU9iamVjdCBteURpYWdyYW1Sb290OwotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkKElGaWxlIHNlbGVjdGVkTW9kZWxGaWxlLAotCQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLAotCQkJRU9iamVjdCBkaWFncmFtUm9vdCwgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbikgewotCQkvLyAgICBhc3NlcnQgc2VsZWN0ZWRNb2RlbEZpbGUgIT0gbnVsbCA6ICJOdWxsIHNlbGVjdGVkTW9kZWxGaWxlIGluIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkIGNvbnN0cnVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCQkvLyAgICBhc3NlcnQgd29ya2JlbmNoUGFnZSAhPSBudWxsIDogIk51bGwgd29ya2JlbmNoUGFnZSBpbiBVTUxOZXdEaWFncmFtRmlsZVdpemFyZCBjb25zdHJ1Y3RvciI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gICAgYXNzZXJ0IHNlbGVjdGlvbiAhPSBudWxsIDogIk51bGwgc2VsZWN0aW9uIGluIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkIGNvbnN0cnVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCQkvLyAgICAgIGFzc2VydCBkaWFncmFtUm9vdCAhPSBudWxsIDogIk51bGwgZGlhZ3JhbVJvb3QgaW4gVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmQgY29uc3RydWN0b3IiOyAvLyROT04tTkxTLTEkCi0JCS8vICAgICAgYXNzZXJ0IGVkaXRpbmdEb21haW4gIT0gbnVsbCA6ICJOdWxsIGVkaXRpbmdEb21haW4gaW4gVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmQgY29uc3RydWN0b3IiOyAvLyROT04tTkxTLTEkCi0KLQkJbXlTZWxlY3RlZE1vZGVsRmlsZSA9IHNlbGVjdGVkTW9kZWxGaWxlOwotCQlteVdvcmtiZW5jaFBhZ2UgPSB3b3JrYmVuY2hQYWdlOwotCQlteVNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJbXlEaWFncmFtUm9vdCA9IGRpYWdyYW1Sb290OwotCQlteUVkaXRpbmdEb21haW4gPSBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJbXlGaWxlQ3JlYXRpb25QYWdlID0gbmV3IFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoCi0JCQkJIkluaXRpYWxpemUgbmV3IEVjb3JlIGRpYWdyYW0gZmlsZSIsIG15U2VsZWN0aW9uKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQotCQkJCUlDb250YWluZXIgcGFyZW50Q29udGFpbmVyID0gbXlTZWxlY3RlZE1vZGVsRmlsZS5nZXRQYXJlbnQoKTsKLQkJCQlTdHJpbmcgb3JpZ2luYWxGaWxlTmFtZSA9IG15U2VsZWN0ZWRNb2RlbEZpbGUKLQkJCQkJCS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkucmVtb3ZlRmlsZUV4dGVuc2lvbigpCi0JCQkJCQkubGFzdFNlZ21lbnQoKTsKLQkJCQlTdHJpbmcgZmlsZUV4dGVuc2lvbiA9ICIueG1pIjsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBmaWxlTmFtZSA9IG9yaWdpbmFsRmlsZU5hbWUgKyBmaWxlRXh0ZW5zaW9uOwotCQkJCWZvciAoaW50IGkgPSAxOyBwYXJlbnRDb250YWluZXIuZ2V0RmlsZShuZXcgUGF0aChmaWxlTmFtZSkpCi0JCQkJCQkuZXhpc3RzKCk7IGkrKykgewotCQkJCQlmaWxlTmFtZSA9IG9yaWdpbmFsRmlsZU5hbWUgKyBpICsgZmlsZUV4dGVuc2lvbjsKLQkJCQl9Ci0JCQkJc2V0RmlsZU5hbWUoZmlsZU5hbWUpOwotCQkJfQotCi0JCX07Ci0JCW15RmlsZUNyZWF0aW9uUGFnZS5zZXRUaXRsZSgiRGlhZ3JhbSBmaWxlIik7Ci0JCW15RmlsZUNyZWF0aW9uUGFnZS5zZXREZXNjcmlwdGlvbigiQ3JlYXRlIG5ldyBkaWFncmFtIGJhc2VkIG9uICIKLQkJCQkrIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQgKyAiIG1vZGVsIGNvbnRlbnQiKTsKLQkJYWRkUGFnZShteUZpbGVDcmVhdGlvblBhZ2UpOwotCQlhZGRQYWdlKG5ldyBSb290RWxlbWVudFNlbGVjdG9yUGFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJSUZpbGUgZGlhZ3JhbUZpbGUgPSBteUZpbGVDcmVhdGlvblBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotCQl0cnkgewotCQkJZGlhZ3JhbUZpbGUuc2V0Q2hhcnNldCgiVVRGLTgiLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBzZXQgY2hhcnNldCBmb3IgZGlhZ3JhbSBmaWxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbXlFZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7Ci0JCWZpbmFsIFJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IHJlc291cmNlU2V0Ci0JCQkJLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGRpYWdyYW1GaWxlCi0JCQkJCQkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSk7Ci0KLQkJTGlzdCBhZmZlY3RlZEZpbGVzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJYWZmZWN0ZWRGaWxlcy5hZGQobXlTZWxlY3RlZE1vZGVsRmlsZSk7Ci0JCWFmZmVjdGVkRmlsZXMuYWRkKGRpYWdyYW1GaWxlKTsKLQotCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCgKLQkJCQlteUVkaXRpbmdEb21haW4sICJJbml0aWFsaXppbmcgZGlhZ3JhbSBjb250ZW50cyIsIGFmZmVjdGVkRmlsZXMpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCWludCBkaWFncmFtVklEID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldERpYWdyYW1WaXN1YWxJRChteURpYWdyYW1Sb290KTsKLQkJCQlpZiAoZGlhZ3JhbVZJRCAhPSBBY3Rpdml0eUVkaXRQYXJ0LlZJU1VBTF9JRCkgewotCQkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdAotCQkJCQkJCS5uZXdFcnJvckNvbW1hbmRSZXN1bHQoIkluY29ycmVjdCBtb2RlbCBvYmplY3Qgc3RvcmVkIGFzIGEgcm9vdCByZXNvdXJjZSBvYmplY3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlEaWFncmFtIGRpYWdyYW0gPSBWaWV3U2VydmljZS5jcmVhdGVEaWFncmFtKG15RGlhZ3JhbVJvb3QsCi0JCQkJCQlBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELAotCQkJCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOwotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlPcGVyYXRpb25IaXN0b3J5RmFjdG9yeS5nZXRPcGVyYXRpb25IaXN0b3J5KCkuZXhlY3V0ZShjb21tYW5kLAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCWRpYWdyYW1SZXNvdXJjZS5zYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQlJREUub3BlbkVkaXRvcihteVdvcmtiZW5jaFBhZ2UsIGRpYWdyYW1GaWxlKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIlNhdmUgb3BlcmF0aW9uIGZhaWxlZCBmb3I6ICIgKyBkaWFncmFtRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleCkgewotCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIG9wZW4gZWRpdG9yIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgY2xhc3MgUm9vdEVsZW1lbnRTZWxlY3RvclBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgUm9vdEVsZW1lbnRTZWxlY3RvclBhZ2UoKSB7Ci0JCQlzdXBlcigiU2VsZWN0IGRpYWdyYW0gcm9vdCBlbGVtZW50Iik7Ci0JCQlzZXRUaXRsZSgiRGlhZ3JhbSByb290IGVsZW1lbnQiKTsKLQkJCXNldERlc2NyaXB0aW9uKCJTZWxlY3Qgc2VtYW50aWMgbW9kZWwgZWxlbWVudCB0byBiZSBkZXBpY3RlZCBvbiBkaWFncmFtIik7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQkJCUNvbXBvc2l0ZSB0b3BMZXZlbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQl0b3BMZXZlbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQl0b3BMZXZlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMCi0JCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCQl0b3BMZXZlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkJc2V0Q29udHJvbCh0b3BMZXZlbCk7Ci0JCQljcmVhdGVNb2RlbEJyb3dzZXIodG9wTGV2ZWwpOwotCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlTW9kZWxCcm93c2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlwYW5lbC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoIlNlbGVjdCBkaWFncmFtIHJvb3QgZWxlbWVudDoiKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotCQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCi0JCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYW5lbCwgU1dULlNJTkdMRQotCQkJCQl8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJbGF5b3V0RGF0YS5oZWlnaHRIaW50ID0gMzAwOwotCQkJbGF5b3V0RGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpKTsKLQkJCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpKTsKLQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQobXlEaWFncmFtUm9vdC5lUmVzb3VyY2UoKSk7Ci0JCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihteURpYWdyYW1Sb290KSk7Ci0JCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJbXlEaWFncmFtUm9vdCA9IG51bGw7Ci0JCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJc2VsZWN0ZWRFbGVtZW50ID0gKChJV3JhcHBlckl0ZW1Qcm92aWRlcikgc2VsZWN0ZWRFbGVtZW50KQotCQkJCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQkJfQotCQkJCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmVhdHVyZU1hcC5FbnRyeSkgewotCQkJCQkJc2VsZWN0ZWRFbGVtZW50ID0gKChGZWF0dXJlTWFwLkVudHJ5KSBzZWxlY3RlZEVsZW1lbnQpCi0JCQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQlteURpYWdyYW1Sb290ID0gKEVPYmplY3QpIHNlbGVjdGVkRWxlbWVudDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJCWlmIChteURpYWdyYW1Sb290ID09IG51bGwpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoIk5vIGRpYWdyYW0gcm9vdCBlbGVtZW50IHNlbGVjdGVkIik7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJYm9vbGVhbiByZXN1bHQgPSBWaWV3U2VydmljZS5nZXRJbnN0YW5jZSgpLnByb3ZpZGVzKAotCQkJCQluZXcgQ3JlYXRlRGlhZ3JhbVZpZXdPcGVyYXRpb24obmV3IEVPYmplY3RBZGFwdGVyKAotCQkJCQkJCW15RGlhZ3JhbVJvb3QpLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELAotCQkJCQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKSk7Ci0JCQlzZXRFcnJvck1lc3NhZ2UocmVzdWx0ID8gbnVsbAotCQkJCQk6ICJJbnZhbGlkIGRpYWdyYW0gcm9vdCBlbGVtZW50IHdhcyBzZWxlY3RlZCIpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTFBhbGV0dGVGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxQYWxldHRlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTU3Y2NhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTFBhbGV0dGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVEcmF3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlU2VwYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5VbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlVuc3BlY2lmaWVkVHlwZUNyZWF0aW9uVG9vbDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxQYWxldHRlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZmlsbFBhbGV0dGUoUGFsZXR0ZVJvb3QgcGFsZXR0ZVJvb3QpIHsKLQkJcGFsZXR0ZVJvb3QuYWRkKGNyZWF0ZUZsb3dzMUdyb3VwKCkpOwotCQlwYWxldHRlUm9vdC5hZGQoY3JlYXRlTm9kZXMyR3JvdXAoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVGbG93czFHcm91cCgpIHsKLQkJUGFsZXR0ZUNvbnRhaW5lciBwYWxldHRlQ29udGFpbmVyID0gbmV3IFBhbGV0dGVEcmF3ZXIoIkZsb3dzIik7Ci0JCXBhbGV0dGVDb250YWluZXIuc2V0RGVzY3JpcHRpb24oIkNyZWF0aW9uIHRvb2wgZm9yIGZsb3dzIik7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZUNvbnRyb2xGbG93MUNyZWF0aW9uVG9vbCgpKTsKLQkJcmV0dXJuIHBhbGV0dGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVOb2RlczJHcm91cCgpIHsKLQkJUGFsZXR0ZUNvbnRhaW5lciBwYWxldHRlQ29udGFpbmVyID0gbmV3IFBhbGV0dGVEcmF3ZXIoIk5vZGVzIik7Ci0JCXBhbGV0dGVDb250YWluZXIuc2V0RGVzY3JpcHRpb24oIkNyZWF0aW9uIHRvb2wgZ3JvdXAgZm9yIG5vZGVzIik7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZUFjdGl2aXR5UGFydGl0aW9uMUNyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlU3RhcnROb2RlMkNyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlRm9ya05vZGUzQ3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVNZXJnZU5vZGU0Q3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVEZWNpc2lvbk5vZGU1Q3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVFbmROb2RlNkNyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlSm9pbk5vZGU3Q3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChuZXcgUGFsZXR0ZVNlcGFyYXRvcigpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlQWN0aXZpdHk5Q3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVQaGFzZTEwQ3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVJdGVyYXRpb24xMUNyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlVGFza0Rlc2NyaXB0b3IxMkNyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlTWlsZXN0b25lMTNDcmVhdGlvblRvb2woKSk7Ci0JCXJldHVybiBwYWxldHRlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVDb250cm9sRmxvdzFDcmVhdGlvblRvb2woKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBzbWFsbEltYWdlOwotCQlJbWFnZURlc2NyaXB0b3IgbGFyZ2VJbWFnZTsKLQotCQlzbWFsbEltYWdlID0gRVBGRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5maW5kSW1hZ2VEZXNjcmlwdG9yKCIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQ29udHJvbEZsb3cuZ2lmIik7Ci0KLQkJbGFyZ2VJbWFnZSA9IHNtYWxsSW1hZ2U7Ci0KLQkJZmluYWwgTGlzdCByZWxhdGlvbnNoaXBUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVsYXRpb25zaGlwVHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxKTsKLQkJVG9vbEVudHJ5IHJlc3VsdCA9IG5ldyBMaW5rVG9vbEVudHJ5KCJDb250cm9sIEZsb3ciLAotCQkJCSJDcmVhdGUgbmV3IENvbnRyb2wgRmxvdyIsIHNtYWxsSW1hZ2UsIGxhcmdlSW1hZ2UsCi0JCQkJcmVsYXRpb25zaGlwVHlwZXMpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZUFjdGl2aXR5UGFydGl0aW9uMUNyZWF0aW9uVG9vbCgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIHNtYWxsSW1hZ2U7Ci0JCUltYWdlRGVzY3JpcHRvciBsYXJnZUltYWdlOwotCi0JCXNtYWxsSW1hZ2UgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmZpbmRJbWFnZURlc2NyaXB0b3IoIi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eVBhcnRpdGlvbi5naWYiKTsKLQotCQlsYXJnZUltYWdlID0gc21hbGxJbWFnZTsKLQotCQlmaW5hbCBMaXN0IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEpOwotCQlUb29sRW50cnkgcmVzdWx0ID0gbmV3IE5vZGVUb29sRW50cnkoIkFjdGl2aXR5IFBhcnRpdGlvbiIsCi0JCQkJIkNyZWF0ZSBuZXcgQWN0aXZpdHkgUGFydGl0aW9uIiwgc21hbGxJbWFnZSwgbGFyZ2VJbWFnZSwKLQkJCQllbGVtZW50VHlwZXMpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVN0YXJ0Tm9kZTJDcmVhdGlvblRvb2woKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBzbWFsbEltYWdlOwotCQlJbWFnZURlc2NyaXB0b3IgbGFyZ2VJbWFnZTsKLQotCQlzbWFsbEltYWdlID0gRVBGRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5maW5kSW1hZ2VEZXNjcmlwdG9yKCIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSW5pdGlhbE5vZGUuZ2lmIik7Ci0KLQkJbGFyZ2VJbWFnZSA9IHNtYWxsSW1hZ2U7Ci0KLQkJZmluYWwgTGlzdCBlbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkluaXRpYWxOb2RlXzEwMDQpOwotCQlUb29sRW50cnkgcmVzdWx0ID0gbmV3IE5vZGVUb29sRW50cnkoIlN0YXJ0IE5vZGUiLAotCQkJCSJDcmVhdGUgbmV3IFN0YXJ0IE5vZGUiLCBzbWFsbEltYWdlLCBsYXJnZUltYWdlLCBlbGVtZW50VHlwZXMpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZUZvcmtOb2RlM0NyZWF0aW9uVG9vbCgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIHNtYWxsSW1hZ2U7Ci0JCUltYWdlRGVzY3JpcHRvciBsYXJnZUltYWdlOwotCi0JCXNtYWxsSW1hZ2UgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmZpbmRJbWFnZURlc2NyaXB0b3IoIi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Gb3JrTm9kZS5naWYiKTsKLQotCQlsYXJnZUltYWdlID0gc21hbGxJbWFnZTsKLQotCQlmaW5hbCBMaXN0IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuRm9ya05vZGVfMTAwMyk7Ci0JCVRvb2xFbnRyeSByZXN1bHQgPSBuZXcgTm9kZVRvb2xFbnRyeSgiRm9yayBOb2RlIiwKLQkJCQkiQ3JlYXRlIG5ldyBGb3JrIE5vZGUiLCBzbWFsbEltYWdlLCBsYXJnZUltYWdlLCBlbGVtZW50VHlwZXMpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZU1lcmdlTm9kZTRDcmVhdGlvblRvb2woKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBzbWFsbEltYWdlOwotCQlJbWFnZURlc2NyaXB0b3IgbGFyZ2VJbWFnZTsKLQotCQlzbWFsbEltYWdlID0gRVBGRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5maW5kSW1hZ2VEZXNjcmlwdG9yKCIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvTWVyZ2VOb2RlLmdpZiIpOwotCi0JCWxhcmdlSW1hZ2UgPSBzbWFsbEltYWdlOwotCi0JCWZpbmFsIExpc3QgZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5NZXJnZU5vZGVfMTAwMik7Ci0JCVRvb2xFbnRyeSByZXN1bHQgPSBuZXcgTm9kZVRvb2xFbnRyeSgiTWVyZ2UgTm9kZSIsCi0JCQkJIkNyZWF0ZSBuZXcgTWVyZ2UgTm9kZSIsIHNtYWxsSW1hZ2UsIGxhcmdlSW1hZ2UsIGVsZW1lbnRUeXBlcyk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlRGVjaXNpb25Ob2RlNUNyZWF0aW9uVG9vbCgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIHNtYWxsSW1hZ2U7Ci0JCUltYWdlRGVzY3JpcHRvciBsYXJnZUltYWdlOwotCi0JCXNtYWxsSW1hZ2UgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmZpbmRJbWFnZURlc2NyaXB0b3IoIi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9EZWNpc2lvbk5vZGUuZ2lmIik7Ci0KLQkJbGFyZ2VJbWFnZSA9IHNtYWxsSW1hZ2U7Ci0KLQkJZmluYWwgTGlzdCBlbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkRlY2lzaW9uTm9kZV8xMDA1KTsKLQkJVG9vbEVudHJ5IHJlc3VsdCA9IG5ldyBOb2RlVG9vbEVudHJ5KCJEZWNpc2lvbiBOb2RlIiwKLQkJCQkiQ3JlYXRlIG5ldyBEZWNpc2lvbiBOb2RlIiwgc21hbGxJbWFnZSwgbGFyZ2VJbWFnZSwKLQkJCQllbGVtZW50VHlwZXMpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZUVuZE5vZGU2Q3JlYXRpb25Ub29sKCkgewotCQlJbWFnZURlc2NyaXB0b3Igc21hbGxJbWFnZTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGxhcmdlSW1hZ2U7Ci0KLQkJc21hbGxJbWFnZSA9IEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZmluZEltYWdlRGVzY3JpcHRvcigiL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RmluYWxOb2RlLmdpZiIpOwotCi0JCWxhcmdlSW1hZ2UgPSBzbWFsbEltYWdlOwotCi0JCWZpbmFsIExpc3QgZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxKTsKLQkJVG9vbEVudHJ5IHJlc3VsdCA9IG5ldyBOb2RlVG9vbEVudHJ5KCJFbmQgTm9kZSIsICJDcmVhdGUgbmV3IEVuZCBOb2RlIiwKLQkJCQlzbWFsbEltYWdlLCBsYXJnZUltYWdlLCBlbGVtZW50VHlwZXMpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZUpvaW5Ob2RlN0NyZWF0aW9uVG9vbCgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIHNtYWxsSW1hZ2U7Ci0JCUltYWdlRGVzY3JpcHRvciBsYXJnZUltYWdlOwotCi0JCXNtYWxsSW1hZ2UgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmZpbmRJbWFnZURlc2NyaXB0b3IoIi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Kb2luTm9kZS5naWYiKTsKLQotCQlsYXJnZUltYWdlID0gc21hbGxJbWFnZTsKLQotCQlmaW5hbCBMaXN0IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuSm9pbk5vZGVfMTAwNik7Ci0JCVRvb2xFbnRyeSByZXN1bHQgPSBuZXcgTm9kZVRvb2xFbnRyeSgiSm9pbiBOb2RlIiwKLQkJCQkiQ3JlYXRlIG5ldyBKb2luIE5vZGUiLCBzbWFsbEltYWdlLCBsYXJnZUltYWdlLCBlbGVtZW50VHlwZXMpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZUFjdGl2aXR5OUNyZWF0aW9uVG9vbCgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIHNtYWxsSW1hZ2U7Ci0JCUltYWdlRGVzY3JpcHRvciBsYXJnZUltYWdlOwotCi0JCXNtYWxsSW1hZ2UgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmZpbmRJbWFnZURlc2NyaXB0b3IoIi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYiKTsKLQotCQlsYXJnZUltYWdlID0gc21hbGxJbWFnZTsKLQotCQlmaW5hbCBMaXN0IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3KTsKLQkJVG9vbEVudHJ5IHJlc3VsdCA9IG5ldyBOb2RlVG9vbEVudHJ5KCJBY3Rpdml0eSIsICJDcmVhdGUgbmV3IEFjdGl2aXR5IiwKLQkJCQlzbWFsbEltYWdlLCBsYXJnZUltYWdlLCBlbGVtZW50VHlwZXMpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVBoYXNlMTBDcmVhdGlvblRvb2woKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBzbWFsbEltYWdlOwotCQlJbWFnZURlc2NyaXB0b3IgbGFyZ2VJbWFnZTsKLQotCQlzbWFsbEltYWdlID0gRVBGRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5maW5kSW1hZ2VEZXNjcmlwdG9yKCIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmIik7Ci0KLQkJbGFyZ2VJbWFnZSA9IHNtYWxsSW1hZ2U7Ci0KLQkJZmluYWwgTGlzdCBlbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCk7Ci0JCVRvb2xFbnRyeSByZXN1bHQgPSBuZXcgTm9kZVRvb2xFbnRyeSgiUGhhc2UiLCAiQ3JlYXRlIG5ldyBQaGFzZSIsCi0JCQkJc21hbGxJbWFnZSwgbGFyZ2VJbWFnZSwgZWxlbWVudFR5cGVzKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVJdGVyYXRpb24xMUNyZWF0aW9uVG9vbCgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIHNtYWxsSW1hZ2U7Ci0JCUltYWdlRGVzY3JpcHRvciBsYXJnZUltYWdlOwotCi0JCXNtYWxsSW1hZ2UgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmZpbmRJbWFnZURlc2NyaXB0b3IoIi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmIik7Ci0KLQkJbGFyZ2VJbWFnZSA9IHNtYWxsSW1hZ2U7Ci0KLQkJZmluYWwgTGlzdCBlbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSk7Ci0JCVRvb2xFbnRyeSByZXN1bHQgPSBuZXcgTm9kZVRvb2xFbnRyeSgiSXRlcmF0aW9uIiwKLQkJCQkiQ3JlYXRlIG5ldyBJdGVyYXRpb24iLCBzbWFsbEltYWdlLCBsYXJnZUltYWdlLCBlbGVtZW50VHlwZXMpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVRhc2tEZXNjcmlwdG9yMTJDcmVhdGlvblRvb2woKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBzbWFsbEltYWdlOwotCQlJbWFnZURlc2NyaXB0b3IgbGFyZ2VJbWFnZTsKLQotCQlzbWFsbEltYWdlID0gRVBGRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5maW5kSW1hZ2VEZXNjcmlwdG9yKCIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmIik7Ci0KLQkJbGFyZ2VJbWFnZSA9IHNtYWxsSW1hZ2U7Ci0KLQkJZmluYWwgTGlzdCBlbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KTsKLQkJVG9vbEVudHJ5IHJlc3VsdCA9IG5ldyBOb2RlVG9vbEVudHJ5KCJUYXNrIERlc2NyaXB0b3IiLAotCQkJCSJDcmVhdGUgbmV3IFRhc2sgRGVzY3JpcHRvciIsIHNtYWxsSW1hZ2UsIGxhcmdlSW1hZ2UsCi0JCQkJZWxlbWVudFR5cGVzKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVNaWxlc3RvbmUxM0NyZWF0aW9uVG9vbCgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIHNtYWxsSW1hZ2U7Ci0JCUltYWdlRGVzY3JpcHRvciBsYXJnZUltYWdlOwotCi0JCXNtYWxsSW1hZ2UgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmZpbmRJbWFnZURlc2NyaXB0b3IoIi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmIik7Ci0KLQkJbGFyZ2VJbWFnZSA9IHNtYWxsSW1hZ2U7Ci0KLQkJZmluYWwgTGlzdCBlbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKTsKLQkJVG9vbEVudHJ5IHJlc3VsdCA9IG5ldyBOb2RlVG9vbEVudHJ5KCJNaWxlc3RvbmUiLAotCQkJCSJDcmVhdGUgbmV3IE1pbGVzdG9uZSIsIHNtYWxsSW1hZ2UsIGxhcmdlSW1hZ2UsIGVsZW1lbnRUeXBlcyk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZVRvb2xFbnRyeSBleHRlbmRzIFRvb2xFbnRyeSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgZmluYWwgTGlzdCBlbGVtZW50VHlwZXM7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTm9kZVRvb2xFbnRyeShTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkJCQlJbWFnZURlc2NyaXB0b3Igc21hbGxJY29uLCBJbWFnZURlc2NyaXB0b3IgbGFyZ2VJY29uLAotCQkJCUxpc3QgZWxlbWVudFR5cGVzKSB7Ci0JCQlzdXBlcih0aXRsZSwgZGVzY3JpcHRpb24sIHNtYWxsSWNvbiwgbGFyZ2VJY29uKTsKLQkJCXRoaXMuZWxlbWVudFR5cGVzID0gZWxlbWVudFR5cGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJCVRvb2wgdG9vbCA9IG5ldyBVbnNwZWNpZmllZFR5cGVDcmVhdGlvblRvb2woZWxlbWVudFR5cGVzKTsKLQkJCXRvb2wuc2V0UHJvcGVydGllcyhnZXRUb29sUHJvcGVydGllcygpKTsKLQkJCUJyaWRnZUhlbHBlci5lbGVtZW50VHlwZXMuYWRkKGVsZW1lbnRUeXBlcwotCQkJCQkuZ2V0KGVsZW1lbnRUeXBlcy5zaXplKCkgLSAxKSk7Ci0JCQlyZXR1cm4gdG9vbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMaW5rVG9vbEVudHJ5IGV4dGVuZHMgVG9vbEVudHJ5IHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBMaXN0IHJlbGF0aW9uc2hpcFR5cGVzOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIExpbmtUb29sRW50cnkoU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCQkJSW1hZ2VEZXNjcmlwdG9yIHNtYWxsSWNvbiwgSW1hZ2VEZXNjcmlwdG9yIGxhcmdlSWNvbiwKLQkJCQlMaXN0IHJlbGF0aW9uc2hpcFR5cGVzKSB7Ci0JCQlzdXBlcih0aXRsZSwgZGVzY3JpcHRpb24sIHNtYWxsSWNvbiwgbGFyZ2VJY29uKTsKLQkJCXRoaXMucmVsYXRpb25zaGlwVHlwZXMgPSByZWxhdGlvbnNoaXBUeXBlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgVG9vbCBjcmVhdGVUb29sKCkgewotCQkJVG9vbCB0b29sID0gbmV3IFVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25Ub29sKHJlbGF0aW9uc2hpcFR5cGVzKTsKLQkJCXRvb2wuc2V0UHJvcGVydGllcyhnZXRUb29sUHJvcGVydGllcygpKTsKLQkJCXJldHVybiB0b29sOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MVmlzdWFsSURSZWdpc3RyeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MVmlzdWFsSURSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDlhYmI0Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTFZpc3VhbElEUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkZvcmtOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRm9ya05vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSW5pdGlhbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Kb2luTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkpvaW5Ob2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLk1lcmdlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLk1lcmdlTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmV4cHJlc3Npb25zLlVNTEFic3RyYWN0RXhwcmVzc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUZpbmFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRGVjaXNpb25Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkZvcmtOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkluaXRpYWxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkpvaW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk1lcmdlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5PYmplY3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIHJlZ2lzdHJ5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHR5cGUgb2YgdmlzdWFsIG9iamVjdCBzaG91bGQgYmUKLSAqIGNyZWF0ZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIERpYWdyYW0sIE5vZGUsIENoaWxkTm9kZSBvciBMaW5rIHJlcHJlc2VudGVkIAotICogYnkgYSBkb21haW4gbW9kZWwgb2JqZWN0LgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFZpc3VhbElEUmVnaXN0cnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19LRVkgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkuZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKQotCQkJKyAiL2RlYnVnL3Zpc3VhbElEIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFZpc3VhbElEKFZpZXcgdmlldykgewotCQlpZiAodmlldyBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCWlmIChBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyh2aWV3LmdldFR5cGUoKSkpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0VmlzdWFsSUQodmlldy5nZXRUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2RlbElEKFZpZXcgdmlldykgewotCQlWaWV3IGRpYWdyYW0gPSB2aWV3LmdldERpYWdyYW0oKTsKLQkJd2hpbGUgKHZpZXcgIT0gZGlhZ3JhbSkgewotCQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgYW5ub3RhdGlvbi5nZXREZXRhaWxzKCkuZ2V0KCJtb2RlbElEIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbCA/IGRpYWdyYW0uZ2V0VHlwZSgpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VmlzdWFsSUQoU3RyaW5nIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHR5cGUpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJaWYgKEJvb2xlYW4uVFJVRS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCVBsYXRmb3JtLmdldERlYnVnT3B0aW9uKERFQlVHX0tFWSkpKSB7Ci0JCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJIlVuYWJsZSB0byBwYXJzZSB2aWV3IHR5cGUgYXMgYSB2aXN1YWxJRCBudW1iZXI6ICIKLQkJCQkJCQkJKyB0eXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGUoaW50IHZpc3VhbElEKSB7Ci0JCXJldHVybiBTdHJpbmcudmFsdWVPZih2aXN1YWxJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldERpYWdyYW1WaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJaWYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzID0gZG9tYWluRWxlbWVudC5lQ2xhc3MoKTsKLQkJcmV0dXJuIGdldERpYWdyYW1WaXN1YWxJRChkb21haW5FbGVtZW50LCBkb21haW5FbGVtZW50TWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldERpYWdyYW1WaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQsCi0JCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcykgewotCQlpZiAoVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKS5pc1N1cGVyVHlwZU9mKAotCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJJiYgaXNEaWFncmFtQWN0aXZpdHlfNzkoKEFjdGl2aXR5KSBkb21haW5FbGVtZW50KSkgewotCQkJcmV0dXJuIEFjdGl2aXR5RWRpdFBhcnQuVklTVUFMX0lEOwotCQl9Ci0JCXJldHVybiBnZXRVbnJlY29nbml6ZWREaWFncmFtSUQoZG9tYWluRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldE5vZGVWaXN1YWxJRChWaWV3IGNvbnRhaW5lclZpZXcsIEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlpZiAoZG9tYWluRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MgPSBkb21haW5FbGVtZW50LmVDbGFzcygpOwotCQlyZXR1cm4gZ2V0Tm9kZVZpc3VhbElEKGNvbnRhaW5lclZpZXcsIGRvbWFpbkVsZW1lbnQsCi0JCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9kZVZpc3VhbElEKFZpZXcgY29udGFpbmVyVmlldywKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MsCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCVN0cmluZyBjb250YWluZXJNb2RlbElEID0gZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhjb250YWluZXJNb2RlbElEKSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWludCBjb250YWluZXJWaXN1YWxJRDsKLQkJaWYgKEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKGNvbnRhaW5lck1vZGVsSUQpKSB7Ci0JCQljb250YWluZXJWaXN1YWxJRCA9IGdldFZpc3VhbElEKGNvbnRhaW5lclZpZXcpOwotCQl9IGVsc2UgewotCQkJaWYgKGNvbnRhaW5lclZpZXcgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJY29udGFpbmVyVmlzdWFsSUQgPSBBY3Rpdml0eUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWludCBub2RlVmlzdWFsSUQgPSBzZW1hbnRpY0hpbnQgIT0gbnVsbCA/IGdldFZpc3VhbElEKHNlbWFudGljSGludCkKLQkJCQk6IC0xOwotCQlzd2l0Y2ggKGNvbnRhaW5lclZpc3VhbElEKSB7Ci0JCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlGaW5hbE5vZGVfMTAwMUNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZE1lcmdlTm9kZV8xMDAyQ2hpbGROb2RlSUQoZG9tYWluRWxlbWVudCwKLQkJCQkJc2VtYW50aWNIaW50KTsKLQkJY2FzZSBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChGb3JrTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEZvcmtOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRGb3JrTm9kZV8xMDAzQ2hpbGROb2RlSUQoZG9tYWluRWxlbWVudCwKLQkJCQkJc2VtYW50aWNIaW50KTsKLQkJY2FzZSBJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChJbml0aWFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRJbml0aWFsTm9kZV8xMDA0Q2hpbGROb2RlSUQoZG9tYWluRWxlbWVudCwKLQkJCQkJc2VtYW50aWNIaW50KTsKLQkJY2FzZSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWREZWNpc2lvbk5vZGVfMTAwNUNoaWxkTm9kZUlEKGRvbWFpbkVsZW1lbnQsCi0JCQkJCXNlbWFudGljSGludCk7Ci0JCWNhc2UgSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoSm9pbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBKb2luTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkSm9pbk5vZGVfMTAwNkNoaWxkTm9kZUlEKGRvbWFpbkVsZW1lbnQsCi0JCQkJCXNlbWFudGljSGludCk7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Q2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcnRpdGlvbl8xMDA4Q2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDlDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTBDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTFDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMkNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJ0aXRpb25fMjAwMUNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFydGl0aW9uKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUFjdGl2aXR5UGFydGl0aW9uXzIwMDEoKEFjdGl2aXR5UGFydGl0aW9uKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRfNTAwMUNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcnRpdGlvbigpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVBY3Rpdml0eVBhcnRpdGlvbl8yMDAxKChBY3Rpdml0eVBhcnRpdGlvbikgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50XzUwMDJDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBBY3Rpdml0eUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eUZpbmFsTm9kZSgpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVBY3Rpdml0eUZpbmFsTm9kZV8xMDAxKChBY3Rpdml0eUZpbmFsTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXJnZU5vZGUoKS5pc1N1cGVyVHlwZU9mKAotCQkJCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlTWVyZ2VOb2RlXzEwMDIoKE1lcmdlTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRGb3JrTm9kZSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVGb3JrTm9kZV8xMDAzKChGb3JrTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRpYWxOb2RlKCkuaXNTdXBlclR5cGVPZigKLQkJCQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUluaXRpYWxOb2RlXzEwMDQoKEluaXRpYWxOb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldERlY2lzaW9uTm9kZSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVEZWNpc2lvbk5vZGVfMTAwNSgoRGVjaXNpb25Ob2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEpvaW5Ob2RlKCkuaXNTdXBlclR5cGVPZigKLQkJCQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUpvaW5Ob2RlXzEwMDYoKEpvaW5Ob2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNygoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJ0aXRpb24oKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCgoQWN0aXZpdHlQYXJ0aXRpb24pIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZEFjdGl2aXR5Xzc5Q2hpbGROb2RlSUQoZG9tYWluRWxlbWVudCwKLQkJCQkJc2VtYW50aWNIaW50KTsKLQkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChDb250cm9sRmxvd05hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRDb250cm9sRmxvd18zMDAxTGlua0xhYmVsSUQoc2VtYW50aWNIaW50KTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJaWYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzID0gZG9tYWluRWxlbWVudC5lQ2xhc3MoKTsKLQkJcmV0dXJuIGdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChkb21haW5FbGVtZW50LCBkb21haW5FbGVtZW50TWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCwKLQkJCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzKSB7Ci0JCWlmIChVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250cm9sRmxvdygpLmlzU3VwZXJUeXBlT2YoCi0JCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTGlua1dpdGhDbGFzc0NvbnRyb2xGbG93XzMwMDEoKENvbnRyb2xGbG93KSBkb21haW5FbGVtZW50KSkpIHsKLQkJCXJldHVybiBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRMaW5rV2l0aENsYXNzSUQoZG9tYWluRWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlhZ3JhbUFjdGl2aXR5Xzc5KEFjdGl2aXR5IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWREaWFncmFtSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZUFjdGl2aXR5RmluYWxOb2RlXzEwMDEoCi0JCQlBY3Rpdml0eUZpbmFsTm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlTWVyZ2VOb2RlXzEwMDIoTWVyZ2VOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVGb3JrTm9kZV8xMDAzKEZvcmtOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVJbml0aWFsTm9kZV8xMDA0KEluaXRpYWxOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVEZWNpc2lvbk5vZGVfMTAwNShEZWNpc2lvbk5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZUpvaW5Ob2RlXzEwMDYoSm9pbk5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNygKLQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Lm1hdGNoZXMoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVBY3Rpdml0eVBhcnRpdGlvbl8xMDA4KAotCQkJQWN0aXZpdHlQYXJ0aXRpb24gZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KAotCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5Lm1hdGNoZXMoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAoCi0JCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMC5tYXRjaGVzKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExKAotCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEubWF0Y2hlcyhlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKAotCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyLm1hdGNoZXMoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVBY3Rpdml0eVBhcnRpdGlvbl8yMDAxKAotCQkJQWN0aXZpdHlQYXJ0aXRpb24gZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEFjdGl2aXR5RmluYWxOb2RlXzEwMDFDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRNZXJnZU5vZGVfMTAwMkNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEZvcmtOb2RlXzEwMDNDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRJbml0aWFsTm9kZV8xMDA0Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkRGVjaXNpb25Ob2RlXzEwMDVDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRKb2luTm9kZV8xMDA2Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJ0aXRpb25fMTAwOENoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTJDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcnRpdGlvbl8yMDAxQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudF81MDAxQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudF81MDAyQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlfNzlDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRDb250cm9sRmxvd18zMDAxTGlua0xhYmVsSUQoCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZExpbmtXaXRoQ2xhc3NJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMaW5rV2l0aENsYXNzQ29udHJvbEZsb3dfMzAwMShDb250cm9sRmxvdyBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXRjaGVyIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyA9IG5ldyBNYXRjaGVyKAotCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKSB7Ci0JCQkJcHJvdGVjdGVkIE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZiA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBjb250ZXh0OwotCQkJCQlyZXR1cm4gSmF2YU1hdGNoZXJzLmdldFVtYVR5cGVfQWN0aXZpdHkoc2VsZik7Ci0JCQkJfQotCQkJfSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWF0Y2hlciBBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSA9IG5ldyBNYXRjaGVyKAotCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpIHsKLQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHNlbGYgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBjb250ZXh0OwotCQkJCQlyZXR1cm4gSmF2YU1hdGNoZXJzLmdldFVtYVR5cGVfVGFza0Rlc2NyaXB0b3Ioc2VsZik7Ci0JCQkJfQotCQkJfSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWF0Y2hlciBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAgPSBuZXcgTWF0Y2hlcigKLQkJCW5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24oVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSkgewotCQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgY29udGV4dDsKLQkJCQkJcmV0dXJuIEphdmFNYXRjaGVycy5nZXRVbWFUeXBlX1BoYXNlKHNlbGYpOwotCQkJCX0KLQkJCX0pOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hdGNoZXIgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID0gbmV3IE1hdGNoZXIoCi0JCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpIHsKLQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGNvbnRleHQ7Ci0JCQkJCXJldHVybiBKYXZhTWF0Y2hlcnMuZ2V0VW1hVHlwZV9JdGVyYXRpb24oc2VsZik7Ci0JCQkJfQotCQkJfSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWF0Y2hlciBBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiA9IG5ldyBNYXRjaGVyKAotCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpIHsKLQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHNlbGYgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBjb250ZXh0OwotCQkJCQlyZXR1cm4gSmF2YU1hdGNoZXJzLmdldFVtYVR5cGVfTWlsZXN0b25lKHNlbGYpOwotCQkJCX0KLQkJCX0pOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAkKLQkgKi8KLQlzdGF0aWMgY2xhc3MgTWF0Y2hlciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQJCi0JCSAqLwotCQlwcml2YXRlIFVNTEFic3RyYWN0RXhwcmVzc2lvbiBjb25kaXRpb247Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQJCi0JCSAqLwotCQlNYXRjaGVyKFVNTEFic3RyYWN0RXhwcmVzc2lvbiBjb25kaXRpb25FeHByZXNzaW9uKSB7Ci0JCQl0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbkV4cHJlc3Npb247Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAkKLQkJICovCi0JCWJvb2xlYW4gbWF0Y2hlcyhFT2JqZWN0IG9iamVjdCkgewotCQkJT2JqZWN0IHJlc3VsdCA9IGNvbmRpdGlvbi5ldmFsdWF0ZShvYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdCBpbnN0YW5jZW9mIEJvb2xlYW4KLQkJCQkJJiYgKChCb29sZWFuKSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JfS8vIE1hdGNoZXIKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBKYXZhTWF0Y2hlcnMgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIEJvb2xlYW4gZ2V0VW1hVHlwZV9BY3Rpdml0eShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYpIHsKLQkJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQotCQkJQm9vbGVhbiBibCA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJCVN0cmluZyB0eXBlID0gQnJpZGdlSGVscGVyLmdldEVBbm5vdGF0aW9uVHlwZShzZWxmLAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX1RZUEUpOwotCQkJaWYgKEJyaWRnZUhlbHBlci5VTUFfQUNUSVZJVFkuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgewotCQkJCXJldHVybiBibC5UUlVFOwotCQkJfQotCQkJcmV0dXJuIGJsOwotCQkJLy8JCQl0aHJvdyBuZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uLk5vSW1wbEV4Y2VwdGlvbigKLQkJCS8vCQkJCQkiTm8gdXNlciBqYXZhIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGluICdnZXRVbWFUeXBlX0FjdGl2aXR5JyBvcGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBnZXRVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yKAotCQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBzZWxmKSB7Ci0JCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0KLQkJCUJvb2xlYW4gYmwgPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCQlTdHJpbmcgdHlwZSA9IEJyaWRnZUhlbHBlci5nZXRFQW5ub3RhdGlvblR5cGUoc2VsZiwKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UWVBFKTsKLQkJCWlmIChCcmlkZ2VIZWxwZXIuVU1BX1RBU0tfREVTQ1JJUFRPUi5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7Ci0JCQkJcmV0dXJuIGJsLlRSVUU7Ci0JCQl9Ci0JCQlyZXR1cm4gYmw7Ci0JCQkvLwkJCXRocm93IG5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24uTm9JbXBsRXhjZXB0aW9uKAotCQkJLy8JCQkJCSJObyB1c2VyIGphdmEgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgaW4gJ2dldFVtYVR5cGVfVGFza0Rlc2NyaXB0b3InIG9wZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBCb29sZWFuIGdldFVtYVR5cGVfUGhhc2UoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmKSB7Ci0JCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0KLQkJCUJvb2xlYW4gYmwgPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCQlTdHJpbmcgdHlwZSA9IEJyaWRnZUhlbHBlci5nZXRFQW5ub3RhdGlvblR5cGUoc2VsZiwKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UWVBFKTsKLQkJCWlmIChCcmlkZ2VIZWxwZXIuVU1BX1BIQVNFLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKLQkJCQlyZXR1cm4gYmwuVFJVRTsKLQkJCX0KLQkJCXJldHVybiBibDsKLQkJCS8vCQkJdGhyb3cgbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbi5Ob0ltcGxFeGNlcHRpb24oCi0JCQkvLwkJCQkJIk5vIHVzZXIgamF2YSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBpbiAnZ2V0VW1hVHlwZV9QaGFzZScgb3BlcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIEJvb2xlYW4gZ2V0VW1hVHlwZV9JdGVyYXRpb24oU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmKSB7Ci0JCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCQlCb29sZWFuIGJsID0gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQkJU3RyaW5nIHR5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0RUFubm90YXRpb25UeXBlKHNlbGYsCi0JCQkJCUJyaWRnZUhlbHBlci5VTUFfVFlQRSk7Ci0JCQlpZiAoQnJpZGdlSGVscGVyLlVNQV9JVEVSQVRJT04uZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgewotCQkJCXJldHVybiBibC5UUlVFOwotCQkJfQotCQkJcmV0dXJuIGJsOwotCQkJLy8JCQl0aHJvdyBuZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uLk5vSW1wbEV4Y2VwdGlvbigKLQkJCS8vCQkJCQkiTm8gdXNlciBqYXZhIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGluICdnZXRVbWFUeXBlX0l0ZXJhdGlvbicgb3BlcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIEJvb2xlYW4gZ2V0VW1hVHlwZV9NaWxlc3RvbmUoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHNlbGYpIHsKLQkJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQotCQkJQm9vbGVhbiBibCA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJCVN0cmluZyB0eXBlID0gQnJpZGdlSGVscGVyLmdldEVBbm5vdGF0aW9uVHlwZShzZWxmLAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX1RZUEUpOwotCQkJaWYgKEJyaWRnZUhlbHBlci5VTUFfTUlMRVNUT05FLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKLQkJCQlyZXR1cm4gYmwuVFJVRTsKLQkJCX0KLQkJCXJldHVybiBibDsKLQkJCS8vCQkJdGhyb3cgbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbi5Ob0ltcGxFeGNlcHRpb24oCi0JCQkvLwkJCQkJIk5vIHVzZXIgamF2YSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBpbiAnZ2V0VW1hVHlwZV9NaWxlc3RvbmUnIG9wZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0vLyBKYXZhTWF0Y2hlcnMKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MQWJzdHJhY3RQYXJzZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MQWJzdHJhY3RQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUzMTg0Mi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTEFic3RyYWN0UGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLlNldFZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlNldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFVNTEFic3RyYWN0UGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdmlld1BhdHRlcm47Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlRm9ybWF0IHZpZXdQcm9jZXNzb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZWRpdFBhdHRlcm47Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlRm9ybWF0IGVkaXRQcm9jZXNzb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWaWV3UGF0dGVybigpIHsKLQkJcmV0dXJuIHZpZXdQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRWaWV3UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gdmlld1Byb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vmlld1BhdHRlcm4oU3RyaW5nIHZpZXdQYXR0ZXJuKSB7Ci0JCXRoaXMudmlld1BhdHRlcm4gPSB2aWV3UGF0dGVybjsKLQkJdmlld1Byb2Nlc3NvciA9IGNyZWF0ZVZpZXdQcm9jZXNzb3Iodmlld1BhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBjcmVhdGVWaWV3UHJvY2Vzc29yKFN0cmluZyB2aWV3UGF0dGVybikgewotCQlyZXR1cm4gbmV3IE1lc3NhZ2VGb3JtYXQodmlld1BhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRQYXR0ZXJuKCkgewotCQlyZXR1cm4gZWRpdFBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldEVkaXRQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiBlZGl0UHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0UGF0dGVybihTdHJpbmcgZWRpdFBhdHRlcm4pIHsKLQkJdGhpcy5lZGl0UGF0dGVybiA9IGVkaXRQYXR0ZXJuOwotCQllZGl0UHJvY2Vzc29yID0gY3JlYXRlRWRpdFByb2Nlc3NvcihlZGl0UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGNyZWF0ZUVkaXRQcm9jZXNzb3IoU3RyaW5nIGVkaXRQYXR0ZXJuKSB7Ci0JCXJldHVybiBuZXcgTWVzc2FnZUZvcm1hdChlZGl0UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbnRTdHJpbmcoSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuIGdldFN0cmluZ0J5UGF0dGVybihhZGFwdGVyLCBmbGFncywgZ2V0Vmlld1BhdHRlcm4oKSwKLQkJCQlnZXRWaWV3UHJvY2Vzc29yKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRTdHJpbmcoSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuIGdldFN0cmluZ0J5UGF0dGVybihhZGFwdGVyLCBmbGFncywgZ2V0RWRpdFBhdHRlcm4oKSwKLQkJCQlnZXRFZGl0UHJvY2Vzc29yKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncywKLQkJCVN0cmluZyBwYXR0ZXJuLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3Nvcik7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXJFZGl0U3RhdHVzIGlzVmFsaWRFZGl0U3RyaW5nKElBZGFwdGFibGUgZWxlbWVudCwKLQkJCVN0cmluZyBlZGl0U3RyaW5nKSB7Ci0JCVBhcnNlUG9zaXRpb24gcG9zID0gbmV3IFBhcnNlUG9zaXRpb24oMCk7Ci0JCU9iamVjdFtdIHZhbHVlcyA9IGdldEVkaXRQcm9jZXNzb3IoKS5wYXJzZShlZGl0U3RyaW5nLCBwb3MpOwotCQlpZiAodmFsdWVzID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUGFyc2VyRWRpdFN0YXR1cyhFUEZEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQlJUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFLCAiSW52YWxpZCBpbnB1dCBhdCAiCi0JCQkJCQkJKyBwb3MuZ2V0RXJyb3JJbmRleCgpKTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdGVOZXdWYWx1ZXModmFsdWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlTmV3VmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRV9TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLCBTdHJpbmcgbmV3U3RyaW5nLAotCQkJaW50IGZsYWdzKSB7Ci0JCU9iamVjdFtdIHZhbHVlcyA9IGdldEVkaXRQcm9jZXNzb3IoKS5wYXJzZShuZXdTdHJpbmcsCi0JCQkJbmV3IFBhcnNlUG9zaXRpb24oMCkpOwotCQlpZiAodmFsdWVzID09IG51bGwKLQkJCQl8fCB2YWxpZGF0ZU5ld1ZhbHVlcyh2YWx1ZXMpLmdldENvZGUoKSAhPSBJUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlQ29tbWFuZChhZGFwdGVyLCB2YWx1ZXMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwKLQkJCU9iamVjdFtdIHZhbHVlcyk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoSUFkYXB0YWJsZSBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0TW9kaWZpY2F0aW9uQ29tbWFuZChFT2JqZWN0IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludmFsaWRWYWx1ZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJU2V0UmVxdWVzdCByZXF1ZXN0ID0gbmV3IFNldFJlcXVlc3QoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWUpOwotCQlyZXR1cm4gbmV3IFNldFZhbHVlQ29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWxpZFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJRUNsYXNzaWZpZXIgdHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFRGF0YVR5cGUpIHsKLQkJCUNsYXNzIGlDbGFzcyA9IHR5cGUuZ2V0SW5zdGFuY2VDbGFzcygpOwotCQkJaWYgKFN0cmluZy5jbGFzcy5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbGlkTmV3VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlFQ2xhc3NpZmllciB0eXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVEYXRhVHlwZSkgewotCQkJQ2xhc3MgaUNsYXNzID0gdHlwZS5nZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQlpZiAoQm9vbGVhbi5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJdmFsdWUgPSBCb29sZWFuLnZhbHVlT2YoKFN0cmluZykgdmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkiVmFsdWUgb2YgdHlwZSBCb29sZWFuIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChDaGFyYWN0ZXIuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdmFsdWUgPSBuZXcgQ2hhcmFjdGVyKHMuY2hhckF0KDApKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkiVmFsdWUgb2YgdHlwZSBDaGFyYWN0ZXIgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEJ5dGUuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEJ5dGUpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IEJ5dGUoKChOdW1iZXIpIHZhbHVlKS5ieXRlVmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gQnl0ZS52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBCeXRlIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgQnl0ZSBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoU2hvcnQuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFNob3J0KSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBTaG9ydCgoKE51bWJlcikgdmFsdWUpLnNob3J0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gU2hvcnQudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gU2hvcnQgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBTaG9ydCBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoSW50ZWdlci5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcigoKE51bWJlcikgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IEludGVnZXIudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gSW50ZWdlciB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCSJWYWx1ZSBvZiB0eXBlIEludGVnZXIgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKExvbmcuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExvbmcpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IExvbmcoKChOdW1iZXIpIHZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gTG9uZy52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBMb25nIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgTG9uZyBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRmxvYXQuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBGbG9hdCgoKE51bWJlcikgdmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gRmxvYXQudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gRmxvYXQgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBGbG9hdCBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRG91YmxlLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBEb3VibGUpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IERvdWJsZSgoKE51bWJlcikgdmFsdWUpLmRvdWJsZVZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IERvdWJsZS52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBEb3VibGUgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBEb3VibGUgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBFRW51bSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlFRW51bUxpdGVyYWwgbGl0ZXJhbCA9ICgoRUVudW0pIHR5cGUpCi0JCQkJCQkJLmdldEVFbnVtTGl0ZXJhbEJ5TGl0ZXJhbCgoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJCWlmIChsaXRlcmFsID09IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVW5rbm93biBsaXRlcmFsOiAiICsgdmFsdWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdmFsdWUgPSBsaXRlcmFsLmdldEluc3RhbmNlKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgU3RyaW5nIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEludmFsaWRWYWx1ZSB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLQkJcHVibGljIEludmFsaWRWYWx1ZShTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTEVkaXRQYXJ0UHJvdmlkZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MRWRpdFBhcnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmI1ODJiLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MRWRpdFBhcnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuQWJzdHJhY3RFZGl0UGFydFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuQ3JlYXRlR3JhcGhpY0VkaXRQYXJ0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuSUVkaXRQYXJ0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuVU1MRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEVkaXRQYXJ0UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEVkaXRQYXJ0UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWRpdFBhcnRGYWN0b3J5IGZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFsbG93Q2FjaGluZzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdlYWtSZWZlcmVuY2UgY2FjaGVkUGFydDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdlYWtSZWZlcmVuY2UgY2FjaGVkVmlldzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1MRWRpdFBhcnRQcm92aWRlcigpIHsKLQkJc2V0RmFjdG9yeShuZXcgVU1MRWRpdFBhcnRGYWN0b3J5KCkpOwotCQlzZXRBbGxvd0NhY2hpbmcodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBFZGl0UGFydEZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZhY3RvcnkoRWRpdFBhcnRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBbGxvd0NhY2hpbmcoKSB7Ci0JCXJldHVybiBhbGxvd0NhY2hpbmc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBbGxvd0NhY2hpbmcoYm9vbGVhbiBhbGxvd0NhY2hpbmcpIHsKLQkJdGhpcy5hbGxvd0NhY2hpbmcgPSBhbGxvd0NhY2hpbmc7Ci0JCWlmICghYWxsb3dDYWNoaW5nKSB7Ci0JCQljYWNoZWRQYXJ0ID0gbnVsbDsKLQkJCWNhY2hlZFZpZXcgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJR3JhcGhpY2FsRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCUVkaXRQYXJ0IHBhcnQgPSBmYWN0b3J5LmNyZWF0ZUVkaXRQYXJ0KG51bGwsIHZpZXcpOwotCQlpZiAocGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJcmV0dXJuIChJR3JhcGhpY2FsRWRpdFBhcnQpIHBhcnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2FjaGVkUGFydChWaWV3IHZpZXcpIHsKLQkJaWYgKGNhY2hlZFZpZXcgIT0gbnVsbCAmJiBjYWNoZWRWaWV3LmdldCgpID09IHZpZXcpIHsKLQkJCXJldHVybiAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBjYWNoZWRQYXJ0LmdldCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElHcmFwaGljYWxFZGl0UGFydCBjcmVhdGVHcmFwaGljRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCWlmIChpc0FsbG93Q2FjaGluZygpKSB7Ci0JCQlJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IGdldENhY2hlZFBhcnQodmlldyk7Ci0JCQljYWNoZWRQYXJ0ID0gbnVsbDsKLQkJCWNhY2hlZFZpZXcgPSBudWxsOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBwYXJ0OwotCQkJfQotCQl9Ci0JCXJldHVybiBjcmVhdGVFZGl0UGFydCh2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBDcmVhdGVHcmFwaGljRWRpdFBhcnRPcGVyYXRpb24pIHsKLQkJCVZpZXcgdmlldyA9ICgoSUVkaXRQYXJ0T3BlcmF0aW9uKSBvcGVyYXRpb24pLmdldFZpZXcoKTsKLQkJCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0TW9kZWxJRCh2aWV3KSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoaXNBbGxvd0NhY2hpbmcoKSAmJiBnZXRDYWNoZWRQYXJ0KHZpZXcpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCUlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gY3JlYXRlRWRpdFBhcnQodmlldyk7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJaWYgKGlzQWxsb3dDYWNoaW5nKCkpIHsKLQkJCQkJY2FjaGVkUGFydCA9IG5ldyBXZWFrUmVmZXJlbmNlKHBhcnQpOwotCQkJCQljYWNoZWRWaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2Uodmlldyk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3Byb3ZpZGVycy9VTUxFbGVtZW50VHlwZXMuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MRWxlbWVudFR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MzNjY2YuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3Byb3ZpZGVycy9VTUxFbGVtZW50VHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmV4cHJlc3Npb25zLlVNTEFic3RyYWN0RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxFbGVtZW50VHlwZXMgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVU1MRWxlbWVudFR5cGVzKCkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgZWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJaWYgKGltYWdlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJaW1hZ2VSZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJbWFnZVJlZ2lzdHJ5S2V5KEVOYW1lZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRQcm92aWRlZEltYWdlRGVzY3JpcHRvcigKLQkJCUVOYW1lZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQkJZWxlbWVudCA9ICgoRVN0cnVjdHVyYWxGZWF0dXJlKSBlbGVtZW50KS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBlbGVtZW50OwotCQkJaWYgKCFlQ2xhc3MuaXNBYnN0cmFjdCgpKSB7Ci0JCQkJcmV0dXJuIEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1JbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkJCWVDbGFzcy5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKQotCQkJCQkJCQkJCS5jcmVhdGUoZUNsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJLy8gVE9ETyA6IHN1cHBvcnQgc3RydWN0dXJhbCBmZWF0dXJlcwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKEVOYW1lZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcga2V5ID0gZ2V0SW1hZ2VSZWdpc3RyeUtleShlbGVtZW50KTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXREZXNjcmlwdG9yKGtleSk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gZ2V0UHJvdmlkZWRJbWFnZURlc2NyaXB0b3IoZWxlbWVudCk7Ci0JCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJfQotCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGtleSA9IGdldEltYWdlUmVnaXN0cnlLZXkoZWxlbWVudCk7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOwotCQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCX0KLQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3IpOwotCQkJaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCUVOYW1lZEVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoaGludCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRJbWFnZURlc2NyaXB0b3IoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGN1c3RvbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoRU5hbWVkRWxlbWVudCBlbGVtZW50LCBJRWxlbWVudFR5cGUgdHlwZSkgewotCQlTdHJpbmcga2V5ID0gdHlwZS5nZXRJZCgpOwotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCQlpZiAoa2V5LmVxdWFscyhTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcuZ2V0SWQoKSkpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAuZ2V0SWQoKSkpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvUGhhc2UuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEuZ2V0SWQoKSkpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIuZ2V0SWQoKSkpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvTWlsZXN0b25lLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkuZ2V0SWQoKSkpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3IpOwotCQkJCWltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKEVOYW1lZEVsZW1lbnQgZWxlbWVudCwKLQkJCUlFbGVtZW50VHlwZSB0eXBlKSB7Ci0JCVN0cmluZyBrZXkgPSB0eXBlLmdldElkKCk7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcihrZXkpOwotCi0JCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJCWlmIChrZXkuZXF1YWxzKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNy5nZXRJZCgpKSkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMC5nZXRJZCgpKSkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9QaGFzZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMS5nZXRJZCgpKSkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMi5nZXRJZCgpKSkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOS5nZXRJZCgpKSkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldERlc2NyaXB0b3Ioa2V5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShJQWRhcHRhYmxlIGhpbnQpIHsKLQkJRU5hbWVkRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudChoaW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJT2JqZWN0IHR5cGUgPSBoaW50LmdldEFkYXB0ZXIoSUVsZW1lbnRUeXBlLmNsYXNzKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZShlbGVtZW50LCAoSUVsZW1lbnRUeXBlKSB0eXBlKTsKLQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRJbWFnZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zICd0eXBlJyBvZiB0aGUgZWNvcmUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgaGludC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFTmFtZWRFbGVtZW50IGdldEVsZW1lbnQoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCU9iamVjdCB0eXBlID0gaGludC5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBJZGVudGl0eUhhc2hNYXAoKTsKLQkJCWVsZW1lbnRzLnB1dChBY3Rpdml0eV83OSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSk7Ci0JCQllbGVtZW50cy5wdXQoQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEFjdGl2aXR5UGFydGl0aW9uKCkpOwotCQkJZWxlbWVudHMucHV0KEFjdGl2aXR5RmluYWxOb2RlXzEwMDEsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eUZpbmFsTm9kZSgpKTsKLQkJCWVsZW1lbnRzLnB1dChNZXJnZU5vZGVfMTAwMiwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVyZ2VOb2RlKCkpOwotCQkJZWxlbWVudHMucHV0KEZvcmtOb2RlXzEwMDMsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEZvcmtOb2RlKCkpOwotCQkJZWxlbWVudHMucHV0KEluaXRpYWxOb2RlXzEwMDQsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRJbml0aWFsTm9kZSgpKTsKLQkJCWVsZW1lbnRzLnB1dChEZWNpc2lvbk5vZGVfMTAwNSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldERlY2lzaW9uTm9kZSgpKTsKLQkJCWVsZW1lbnRzLnB1dChKb2luTm9kZV8xMDA2LCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRKb2luTm9kZSgpKTsKLQkJCWVsZW1lbnRzLnB1dChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpOwotCQkJZWxlbWVudHMucHV0KEFjdGl2aXR5UGFydGl0aW9uXzEwMDgsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eVBhcnRpdGlvbigpKTsKLQkJCWVsZW1lbnRzLnB1dChBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpKTsKLQkJCWVsZW1lbnRzLnB1dChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpOwotCQkJZWxlbWVudHMucHV0KFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSk7Ci0JCQllbGVtZW50cy5wdXQoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSk7Ci0JCQllbGVtZW50cy5wdXQoQ29udHJvbEZsb3dfMzAwMSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRyb2xGbG93KCkpOwotCQl9Ci0JCXJldHVybiAoRU5hbWVkRWxlbWVudCkgZWxlbWVudHMuZ2V0KHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBBY3Rpdml0eV83OSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuQWN0aXZpdHlfNzkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEFjdGl2aXR5UGFydGl0aW9uXzIwMDEgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEFjdGl2aXR5RmluYWxOb2RlXzEwMDEgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIE1lcmdlTm9kZV8xMDAyID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5NZXJnZU5vZGVfMTAwMiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgRm9ya05vZGVfMTAwMyA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuRm9ya05vZGVfMTAwMyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgSW5pdGlhbE5vZGVfMTAwNCA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuSW5pdGlhbE5vZGVfMTAwNCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgRGVjaXNpb25Ob2RlXzEwMDUgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkRlY2lzaW9uTm9kZV8xMDA1Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBKb2luTm9kZV8xMDA2ID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5Kb2luTm9kZV8xMDA2Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQ29udHJvbEZsb3dfMzAwMSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuQ29udHJvbEZsb3dfMzAwMSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSUVsZW1lbnRUeXBlIGdldEVsZW1lbnRUeXBlKFN0cmluZyBpZCkgewotCQlyZXR1cm4gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGUoaWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTZXQgS05PV05fRUxFTUVOVF9UWVBFUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNLbm93bkVsZW1lbnRUeXBlKElFbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgewotCQlpZiAoS05PV05fRUxFTUVOVF9UWVBFUyA9PSBudWxsKSB7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTID0gbmV3IEhhc2hTZXQoKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEFjdGl2aXR5Xzc5KTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEFjdGl2aXR5UGFydGl0aW9uXzIwMDEpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChNZXJnZU5vZGVfMTAwMik7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChGb3JrTm9kZV8xMDAzKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEluaXRpYWxOb2RlXzEwMDQpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoRGVjaXNpb25Ob2RlXzEwMDUpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoSm9pbk5vZGVfMTAwNik7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTApOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKENvbnRyb2xGbG93XzMwMDEpOwotCQl9Ci0JCXJldHVybiBLTk9XTl9FTEVNRU5UX1RZUEVTLmNvbnRhaW5zKGVsZW1lbnRUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBJbml0aWFsaXplcnMgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdEluaXRpYWxpemVyIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyA9IG5ldyBPYmplY3RJbml0aWFsaXplcigKLQkJCQluZXcgRmVhdHVyZUluaXRpYWxpemVyW10geyBuZXcgRmVhdHVyZUluaXRpYWxpemVyKAotCQkJCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKSB7Ci0JCQkJCQkJcHJvdGVjdGVkIE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCQkJCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZiA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBjb250ZXh0OwotCQkJCQkJCQlyZXR1cm4gSmF2YS5jcmVhdGVVbWFUeXBlX0FjdGl2aXR5KHNlbGYpOwotCQkJCQkJCX0KLQkJCQkJCX0sIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEVNb2RlbEVsZW1lbnRfRUFubm90YXRpb25zKCkpIH0pOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdEluaXRpYWxpemVyIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5ID0gbmV3IE9iamVjdEluaXRpYWxpemVyKAotCQkJCW5ldyBGZWF0dXJlSW5pdGlhbGl6ZXJbXSB7IG5ldyBGZWF0dXJlSW5pdGlhbGl6ZXIoCi0JCQkJCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSkgewotCQkJCQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgc2VsZiA9IChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIGNvbnRleHQ7Ci0JCQkJCQkJCXJldHVybiBKYXZhLmNyZWF0ZVVtYVR5cGVfVGFza0Rlc2NyaXB0b3Ioc2VsZik7Ci0JCQkJCQkJfQotCQkJCQkJfSwgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RU1vZGVsRWxlbWVudF9FQW5ub3RhdGlvbnMoKSkgfSk7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SW5pdGlhbGl6ZXIgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwID0gbmV3IE9iamVjdEluaXRpYWxpemVyKAotCQkJCW5ldyBGZWF0dXJlSW5pdGlhbGl6ZXJbXSB7IG5ldyBGZWF0dXJlSW5pdGlhbGl6ZXIoCi0JCQkJCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpIHsKLQkJCQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGNvbnRleHQ7Ci0JCQkJCQkJCXJldHVybiBKYXZhLmNyZWF0ZVVtYVR5cGVfUGhhc2Uoc2VsZik7Ci0JCQkJCQkJfQotCQkJCQkJfSwgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RU1vZGVsRWxlbWVudF9FQW5ub3RhdGlvbnMoKSkgfSk7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SW5pdGlhbGl6ZXIgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID0gbmV3IE9iamVjdEluaXRpYWxpemVyKAotCQkJCW5ldyBGZWF0dXJlSW5pdGlhbGl6ZXJbXSB7IG5ldyBGZWF0dXJlSW5pdGlhbGl6ZXIoCi0JCQkJCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpIHsKLQkJCQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGNvbnRleHQ7Ci0JCQkJCQkJCXJldHVybiBKYXZhLmNyZWF0ZVVtYVR5cGVfSXRlcmF0aW9uKHNlbGYpOwotCQkJCQkJCX0KLQkJCQkJCX0sIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEVNb2RlbEVsZW1lbnRfRUFubm90YXRpb25zKCkpIH0pOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdEluaXRpYWxpemVyIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyID0gbmV3IE9iamVjdEluaXRpYWxpemVyKAotCQkJCW5ldyBGZWF0dXJlSW5pdGlhbGl6ZXJbXSB7IG5ldyBGZWF0dXJlSW5pdGlhbGl6ZXIoCi0JCQkJCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSkgewotCQkJCQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgc2VsZiA9IChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIGNvbnRleHQ7Ci0JCQkJCQkJCXJldHVybiBKYXZhLmNyZWF0ZVVtYVR5cGVfTWlsZXN0b25lKHNlbGYpOwotCQkJCQkJCX0KLQkJCQkJCX0sIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEVNb2RlbEVsZW1lbnRfRUFubm90YXRpb25zKCkpIH0pOwotCi0JCS8qKiAKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBJbml0aWFsaXplcnMoKSB7Ci0JCX0KLQotCQkvKiogCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgY2xhc3MgT2JqZWN0SW5pdGlhbGl6ZXIgewotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcml2YXRlIEZlYXR1cmVJbml0aWFsaXplcltdIGluaXRFeHByZXNzaW9uczsKLQotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlPYmplY3RJbml0aWFsaXplcihGZWF0dXJlSW5pdGlhbGl6ZXJbXSBpbml0RXhwcmVzc2lvbnMpIHsKLQkJCQl0aGlzLmluaXRFeHByZXNzaW9ucyA9IGluaXRFeHByZXNzaW9uczsKLQkJCX0KLQotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBpbml0KEVPYmplY3QgaW5zdGFuY2UpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluaXRFeHByZXNzaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlGZWF0dXJlSW5pdGlhbGl6ZXIgbmV4dEV4cHIgPSBpbml0RXhwcmVzc2lvbnNbaV07Ci0JCQkJCXRyeSB7Ci0JCQkJCQluZXh0RXhwci5pbml0KGluc3RhbmNlKTsKLQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJCSJGZWF0dXJlIGluaXRpYWxpemF0aW9uIGZhaWxlZCIsIGUpOyAvLyROT04tTkxTLTEkCQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gLy8gZW5kIG9mIE9iamVjdEluaXRpYWxpemVyCi0KLQkJLyoqIAotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlzdGF0aWMgY2xhc3MgRmVhdHVyZUluaXRpYWxpemVyIHsKLQotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzRmVhdHVyZTsKLQotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcml2YXRlIFVNTEFic3RyYWN0RXhwcmVzc2lvbiBleHByZXNzaW9uOwotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJRmVhdHVyZUluaXRpYWxpemVyKFVNTEFic3RyYWN0RXhwcmVzc2lvbiBleHByZXNzaW9uLAotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgc0ZlYXR1cmUpIHsKLQkJCQl0aGlzLnNGZWF0dXJlID0gc0ZlYXR1cmU7Ci0JCQkJdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLQkJCX0KLQotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQl2b2lkIGluaXQoRU9iamVjdCBjb250ZXh0SW5zdGFuY2UpIHsKLQkJCQlleHByZXNzaW9uLmFzc2lnblRvKHNGZWF0dXJlLCBjb250ZXh0SW5zdGFuY2UpOwotCQkJfQotCQl9IC8vIGVuZCBvZiBGZWF0dXJlSW5pdGlhbGl6ZXIKLQotCQkvKiogCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXN0YXRpYyBjbGFzcyBKYXZhIHsKLQotCQkJLyoqCi0JCQkgKiBAbW9kaWZpZWQKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgRUxpc3QgY3JlYXRlVW1hVHlwZV9QaGFzZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYpIHsKLQkJCQlyZXR1cm4gQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uVHlwZShzZWxmLAotCQkJCQkJQnJpZGdlSGVscGVyLlVNQV9QSEFTRSk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQG1vZGlmaWVkCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIEVMaXN0IGNyZWF0ZVVtYVR5cGVfTWlsZXN0b25lKAotCQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgc2VsZikgewotCQkJCXJldHVybiBCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb25UeXBlKHNlbGYsCi0JCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX01JTEVTVE9ORSk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQG1vZGlmaWVkCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIEVMaXN0IGNyZWF0ZVVtYVR5cGVfQWN0aXZpdHkoCi0JCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZikgewotCQkJCXJldHVybiBCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb25UeXBlKHNlbGYsCi0JCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX0FDVElWSVRZKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAbW9kaWZpZWQKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgRUxpc3QgY3JlYXRlVW1hVHlwZV9UYXNrRGVzY3JpcHRvcigKLQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHNlbGYpIHsKLQkJCQlyZXR1cm4gQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uVHlwZShzZWxmLAotCQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UQVNLX0RFU0NSSVBUT1IpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBtb2RpZmllZAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBFTGlzdCBjcmVhdGVVbWFUeXBlX0l0ZXJhdGlvbigKLQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmKSB7Ci0JCQkJcmV0dXJuIEJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvblR5cGUoc2VsZiwKLQkJCQkJCUJyaWRnZUhlbHBlci5VTUFfSVRFUkFUSU9OKTsKLQkJCX0KLQkJfSAvL0phdmEKLQl9IC8vIGVuZCBvZiBJbml0aWFsaXplcnMKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MSWNvblByb3ZpZGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTEljb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTc4NzFkLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MSWNvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5BYnN0cmFjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvbi5HZXRJY29uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5pY29uLklJY29uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEljb25Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cyBJSWNvblByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SWNvbihJQWRhcHRhYmxlIGhpbnQsIGludCBmbGFncykgewotCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLmdldEltYWdlKGhpbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgR2V0SWNvbk9wZXJhdGlvbikgewotCQkJcmV0dXJuICgoR2V0SWNvbk9wZXJhdGlvbikgb3BlcmF0aW9uKS5leGVjdXRlKHRoaXMpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3Byb3ZpZGVycy9VTUxNb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YmE0N2YuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3Byb3ZpZGVycy9VTUxNb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMubW9kZWxpbmdhc3Npc3RhbnQuTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciBleHRlbmRzIE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yUG9wdXBCYXIoSUFkYXB0YWJsZSBob3N0KSB7Ci0JCUlHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGhvc3QKLQkJCQkuZ2V0QWRhcHRlcihJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOwotCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQpIHsKLQkJCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEpOwotCQkJcmV0dXJuIHR5cGVzOwotCQl9Ci0JCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQpIHsKLQkJCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEpOwotCQkJcmV0dXJuIHR5cGVzOwotCQl9Ci0JCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5RWRpdFBhcnQpIHsKLQkJCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5NZXJnZU5vZGVfMTAwMik7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkZvcmtOb2RlXzEwMDMpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0KTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuRGVjaXNpb25Ob2RlXzEwMDUpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Kb2luTm9kZV8xMDA2KTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3KTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwKTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExKTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIpOwotCQkJcmV0dXJuIHR5cGVzOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWxUeXBlc09uU291cmNlKElBZGFwdGFibGUgc291cmNlKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWxUeXBlc09uVGFyZ2V0KElBZGFwdGFibGUgdGFyZ2V0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KElBZGFwdGFibGUgc291cmNlLAotCQkJSUFkYXB0YWJsZSB0YXJnZXQpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yU291cmNlKElBZGFwdGFibGUgdGFyZ2V0LAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yVGFyZ2V0KElBZGFwdGFibGUgc291cmNlLAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IHNlbGVjdEV4aXN0aW5nRWxlbWVudEZvclNvdXJjZShJQWRhcHRhYmxlIHRhcmdldCwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBzZWxlY3RFeGlzdGluZ0VsZW1lbnQodGFyZ2V0LCBnZXRUeXBlc0ZvclNvdXJjZSh0YXJnZXQsCi0JCQkJcmVsYXRpb25zaGlwVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBzZWxlY3RFeGlzdGluZ0VsZW1lbnRGb3JUYXJnZXQoSUFkYXB0YWJsZSBzb3VyY2UsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gc2VsZWN0RXhpc3RpbmdFbGVtZW50KHNvdXJjZSwgZ2V0VHlwZXNGb3JUYXJnZXQoc291cmNlLAotCQkJCXJlbGF0aW9uc2hpcFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3Qgc2VsZWN0RXhpc3RpbmdFbGVtZW50KElBZGFwdGFibGUgaG9zdCwgQ29sbGVjdGlvbiB0eXBlcykgewotCQlpZiAodHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBob3N0Ci0JCQkJLmdldEFkYXB0ZXIoSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsKLQkJaWYgKGVkaXRQYXJ0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRSb290KCkuZ2V0Q29udGVudHMoKS5nZXRNb2RlbCgpOwotCQlDb2xsZWN0aW9uIGVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJaWYgKGlzQXBwbGljYWJsZUVsZW1lbnQoZWxlbWVudCwgdHlwZXMpKSB7Ci0JCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmIChlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBzZWxlY3RFbGVtZW50KChFT2JqZWN0W10pIGVsZW1lbnRzLnRvQXJyYXkobmV3IEVPYmplY3RbZWxlbWVudHMKLQkJCQkuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcGxpY2FibGVFbGVtZW50KEVPYmplY3QgZWxlbWVudCwgQ29sbGVjdGlvbiB0eXBlcykgewotCQlJRWxlbWVudFR5cGUgdHlwZSA9IEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50VHlwZSgKLQkJCQllbGVtZW50KTsKLQkJcmV0dXJuIHR5cGVzLmNvbnRhaW5zKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBzZWxlY3RFbGVtZW50KEVPYmplY3RbXSBlbGVtZW50cykgewotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKTsKLQkJRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCXNoZWxsLCBsYWJlbFByb3ZpZGVyKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoIkF2YWlsYWJsZSBkb21haW4gbW9kZWwgZWxlbWVudHM6Iik7Ci0JCWRpYWxvZy5zZXRUaXRsZSgiU2VsZWN0IGRvbWFpbiBtb2RlbCBlbGVtZW50Iik7Ci0JCWRpYWxvZy5zZXRNdWx0aXBsZVNlbGVjdGlvbihmYWxzZSk7Ci0JCWRpYWxvZy5zZXRFbGVtZW50cyhlbGVtZW50cyk7Ci0JCUVPYmplY3Qgc2VsZWN0ZWQgPSBudWxsOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXNlbGVjdGVkID0gKEVPYmplY3QpIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTFBhbGV0dGVQcm92aWRlci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3Byb3ZpZGVycy9VTUxQYWxldHRlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4M2YwZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTFBhbGV0dGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMucGFsZXR0ZS5JUGFsZXR0ZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFBhbGV0dGVGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFBhbGV0dGVQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUGFsZXR0ZVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9QYWxldHRlKElFZGl0b3JQYXJ0IGVkaXRvciwgT2JqZWN0IGNvbnRlbnQsCi0JCQlQYWxldHRlUm9vdCByb290LCBNYXAgcHJlZGVmaW5lZEVudHJpZXMpIHsKLQkJVU1MUGFsZXR0ZUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBVTUxQYWxldHRlRmFjdG9yeSgpOwotCQlmYWN0b3J5LmZpbGxQYWxldHRlKHJvb3QpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250cmlidXRpb25zKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7Ci0JCS8vIG5vIGNvbmZpZ3VyYXRpb24KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJcmV0dXJuIGZhbHNlOyAvLyBhbGwgbG9naWMgaXMgZG9uZSBpbiB0aGUgc2VydmljZQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MUGFyc2VyUHJvdmlkZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MUGFyc2VyUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjNjYxZi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTFBhcnNlclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Db250cm9sRmxvd05hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRm9ya05vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSm9pbk5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuR2V0UGFyc2VyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MUGFyc2VyUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVBhcnNlclByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgYWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0QWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlcigpIHsKLQkJaWYgKGFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDZQYXJzZXIgPT0gbnVsbCkgewotCQkJYWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlciA9IGNyZWF0ZUFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDZQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gYWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJCSJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBhY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRBY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyKCkgewotCQlpZiAoYWN0aXZpdHlGaW5hbE5vZGVBY3Rpdml0eUZpbmFsTm9kZU5hbWVfNDAwMVBhcnNlciA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyID0gY3JlYXRlQWN0aXZpdHlGaW5hbE5vZGVBY3Rpdml0eUZpbmFsTm9kZU5hbWVfNDAwMVBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVBY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKAotCQkJCQkJIm5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIG1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0TWVyZ2VOb2RlTWVyZ2VOb2RlTmFtZV80MDAyUGFyc2VyKCkgewotCQlpZiAobWVyZ2VOb2RlTWVyZ2VOb2RlTmFtZV80MDAyUGFyc2VyID09IG51bGwpIHsKLQkJCW1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlciA9IGNyZWF0ZU1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBtZXJnZU5vZGVNZXJnZU5vZGVOYW1lXzQwMDJQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZU1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJCSJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBpbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRJbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyKCkgewotCQlpZiAoaW5pdGlhbE5vZGVJbml0aWFsTm9kZU5hbWVfNDAwM1BhcnNlciA9PSBudWxsKSB7Ci0JCQlpbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyID0gY3JlYXRlSW5pdGlhbE5vZGVJbml0aWFsTm9kZU5hbWVfNDAwM1BhcnNlcigpOwotCQl9Ci0JCXJldHVybiBpbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVJbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKAotCQkJCQkJIm5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGRlY2lzaW9uTm9kZURlY2lzaW9uTm9kZU5hbWVfNDAwNFBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0RGVjaXNpb25Ob2RlRGVjaXNpb25Ob2RlTmFtZV80MDA0UGFyc2VyKCkgewotCQlpZiAoZGVjaXNpb25Ob2RlRGVjaXNpb25Ob2RlTmFtZV80MDA0UGFyc2VyID09IG51bGwpIHsKLQkJCWRlY2lzaW9uTm9kZURlY2lzaW9uTm9kZU5hbWVfNDAwNFBhcnNlciA9IGNyZWF0ZURlY2lzaW9uTm9kZURlY2lzaW9uTm9kZU5hbWVfNDAwNFBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBkZWNpc2lvbk5vZGVEZWNpc2lvbk5vZGVOYW1lXzQwMDRQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZURlY2lzaW9uTm9kZURlY2lzaW9uTm9kZU5hbWVfNDAwNFBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJCSJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDVQYXJzZXIoKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlciA9PSBudWxsKSB7Ci0JCQlzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlciA9IGNyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA1UGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA1UGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJCSJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBhY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRBY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyKCkgewotCQlpZiAoYWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwN1BhcnNlciA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyID0gY3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwN1BhcnNlcigpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVBY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKAotCQkJCQkJIm5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAwOFBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDA4UGFyc2VyKCkgewotCQlpZiAoYWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDA4UGFyc2VyID09IG51bGwpIHsKLQkJCWFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAwOFBhcnNlciA9IGNyZWF0ZUFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAwOFBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMDhQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZUFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAwOFBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJCSJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwOVBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDlQYXJzZXIoKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwOVBhcnNlciA9PSBudWxsKSB7Ci0JCQlzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwOVBhcnNlciA9IGNyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA5UGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA5UGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwOVBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJCSJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAxMFBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMTBQYXJzZXIoKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAxMFBhcnNlciA9PSBudWxsKSB7Ci0JCQlzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAxMFBhcnNlciA9IGNyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDEwUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDEwUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAxMFBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJCSJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBhY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMTFQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAxMVBhcnNlcigpIHsKLQkJaWYgKGFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAxMVBhcnNlciA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMTFQYXJzZXIgPSBjcmVhdGVBY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMTFQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gYWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDExUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVBY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMTFQYXJzZXIoKSB7Ci0JCVVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoCi0JCQkJCQkibmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgY29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0Q29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlcigpIHsKLQkJaWYgKGNvbnRyb2xGbG93Q29udHJvbEZsb3dOYW1lXzQwMTJQYXJzZXIgPT0gbnVsbCkgewotCQkJY29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlciA9IGNyZWF0ZUNvbnRyb2xGbG93Q29udHJvbEZsb3dOYW1lXzQwMTJQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gY29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlQ29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJCSJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGdldFBhcnNlcihpbnQgdmlzdWFsSUQpIHsKLQkJc3dpdGNoICh2aXN1YWxJRCkgewotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRBY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA2UGFyc2VyKCk7Ci0JCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldEFjdGl2aXR5RmluYWxOb2RlQWN0aXZpdHlGaW5hbE5vZGVOYW1lXzQwMDFQYXJzZXIoKTsKLQkJY2FzZSBNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldE1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlcigpOwotCQljYXNlIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRJbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyKCk7Ci0JCWNhc2UgRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXREZWNpc2lvbk5vZGVEZWNpc2lvbk5vZGVOYW1lXzQwMDRQYXJzZXIoKTsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlcigpOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0QWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwN1BhcnNlcigpOwotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDA4UGFyc2VyKCk7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA5UGFyc2VyKCk7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDEwUGFyc2VyKCk7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDExUGFyc2VyKCk7Ci0JCWNhc2UgQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldENvbnRyb2xGbG93Q29udHJvbEZsb3dOYW1lXzQwMTJQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKElBZGFwdGFibGUgaGludCkgewotCQlTdHJpbmcgdmlkID0gKFN0cmluZykgaGludC5nZXRBZGFwdGVyKFN0cmluZy5jbGFzcyk7Ci0JCWlmICh2aWQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFBhcnNlcihVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZCkpOwotCQl9Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBoaW50LmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRQYXJzZXIoVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBHZXRQYXJzZXJPcGVyYXRpb24pIHsKLQkJCUlBZGFwdGFibGUgaGludCA9ICgoR2V0UGFyc2VyT3BlcmF0aW9uKSBvcGVyYXRpb24pLmdldEhpbnQoKTsKLQkJCWlmIChVTUxFbGVtZW50VHlwZXMuZ2V0RWxlbWVudChoaW50KSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIGdldFBhcnNlcihoaW50KSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTFByb3BlcnR5UHJvdmlkZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MUHJvcGVydHlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDA0MWE2Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MUHJvcGVydHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMuR2V0UHJvcGVydHlTb3VyY2VPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMuSUNvbXBvc2l0ZVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzLklQcm9wZXJ0aWVzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnByb3BlcnRpZXMucHJvdmlkZXJzLkdlbmVyaWNFTUZQcm9wZXJ0aWVzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxQcm9wZXJ0eVByb3ZpZGVyIGV4dGVuZHMgR2VuZXJpY0VNRlByb3BlcnRpZXNQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlQcm9wZXJ0aWVzUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBHZXRQcm9wZXJ0eVNvdXJjZU9wZXJhdGlvbikgewotCQkJT2JqZWN0IG9iamVjdCA9ICgoR2V0UHJvcGVydHlTb3VyY2VPcGVyYXRpb24pIG9wZXJhdGlvbikKLQkJCQkJLmdldE9iamVjdCgpOwotCQkJcmV0dXJuIGdldFNlbWFudGljRWxlbWVudChvYmplY3QpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbXBvc2l0ZVByb3BlcnR5U291cmNlIGdldFByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KG9iamVjdCk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eVNvdXJjZShlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0U2VtYW50aWNFbGVtZW50KE9iamVjdCBvYmplY3QpIHsKLQkJVmlldyB2aWV3ID0gbnVsbDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCXZpZXcgPSAoVmlldykgb2JqZWN0OwotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgb2JqZWN0OwotCQkJaWYgKGVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJdmlldyA9IChWaWV3KSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJfQotCQl9Ci0JCWlmICh2aWV3ICE9IG51bGwKLQkJCQkmJiBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0TW9kZWxJRCh2aWV3KSkpIHsKLQkJCXJldHVybiB2aWV3LmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwODMxOS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRVBGRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIGV4dGVuZHMgVU1MQWJzdHJhY3RQYXJzZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1lc3NhZ2VGb3JtYXQgREVGQVVMVF9QUk9DRVNTT1IgPSBuZXcgTWVzc2FnZUZvcm1hdCgKLQkJCSJ7MH0iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldFZpZXdQcm9jZXNzb3IoKSB7Ci0JCU1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yID0gc3VwZXIuZ2V0Vmlld1Byb2Nlc3NvcigpOwotCQlyZXR1cm4gcHJvY2Vzc29yID09IG51bGwgPyBERUZBVUxUX1BST0NFU1NPUiA6IHByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0RWRpdFByb2Nlc3NvcigpIHsKLQkJTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IgPSBzdXBlci5nZXRFZGl0UHJvY2Vzc29yKCk7Ci0JCXJldHVybiBwcm9jZXNzb3IgPT0gbnVsbCA/IERFRkFVTFRfUFJPQ0VTU09SIDogcHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncywKLQkJCVN0cmluZyBwYXR0ZXJuLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3NvcikgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCXZhbHVlID0gZ2V0VmFsaWRWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCXJldHVybiBwcm9jZXNzb3IuZm9ybWF0KG5ldyBPYmplY3RbXSB7IHZhbHVlIH0sIG5ldyBTdHJpbmdCdWZmZXIoKSwKLQkJCQluZXcgRmllbGRQb3NpdGlvbigwKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlVmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlpZiAodmFsdWVzLmxlbmd0aCA+IDEpIHsKLQkJCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEVfU1RBVFVTOwotCQl9Ci0JCU9iamVjdCB2YWx1ZSA9IHZhbHVlcy5sZW5ndGggPT0gMSA/IHZhbHVlc1swXSA6IG51bGw7Ci0JCXZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludmFsaWRWYWx1ZSkgewotCQkJcmV0dXJuIG5ldyBQYXJzZXJFZGl0U3RhdHVzKEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCUlQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEUsIHZhbHVlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwgT2JqZWN0W10gdmFsdWVzKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBUcmFuc2FjdGlvblV0aWwKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbihlbGVtZW50KTsKLQkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJT2JqZWN0IHZhbHVlID0gdmFsdWVzLmxlbmd0aCA9PSAxID8gdmFsdWVzWzBdIDogbnVsbDsKLQkJSUNvbW1hbmQgY29tbWFuZCA9IGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWUpOwotCQkvLwkJQ29sbGVjdGlvbjxJQ29tbWFuZD4gY29sID0gbmV3IEFycmF5TGlzdDxJQ29tbWFuZD4oKTsKLQkJLy8JCWNvbC5hZGQoY29tbWFuZCk7Ci0JCS8vCQlJQ29tbWFuZCBjb21tYW5kMSA9IGdldFVtYUNvbW1hbmQoYWRhcHRlciwgdmFsdWUpOwotCi0JCS8vVE9ETzogQ2hhbmdlIHRvIENvbW1hbmQuIGZvciB1bmRvIGFjdGlvbi4KLQkJLy8JCVZpZXcgdmlldyA9IChWaWV3KSgoVmlldylhZGFwdGVyLmdldEFkYXB0ZXIoVmlldy5jbGFzcykpLmVDb250YWluZXIoKTsKLQkJLy8JCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbihDb25zdGFudHMuVU1BX1NPVVJDRSk7Ci0JCS8vCQlpZihlQW5ub3RhdGlvbiAhPSBudWxsKXsKLQkJLy8JCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpZUFubm90YXRpb24uZ2V0RGV0YWlscygpLmdldChDb25zdGFudHMuVU1BX0VMRU1FTlRfR1VJRCk7Ci0JCS8vCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkvLwkJCU1ldGhvZEVsZW1lbnQgbWUgPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCS8vCQkJbWUuc2V0TmFtZSgoU3RyaW5nKXZhbHVlKTsKLQkJLy8JCQlpZihtZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCl7Ci0JCS8vCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KW1lKS5zZXRQcmVzZW50YXRpb25OYW1lKChTdHJpbmcpdmFsdWUpOwotCQkvLwkJCX0KLQkJLy8JCX0KLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZChlZGl0aW5nRG9tYWluLCBjb21tYW5kCi0JCQkJLmdldExhYmVsKCksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY29tbWFuZCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FmZmVjdGluZ0V2ZW50KE9iamVjdCBldmVudCwgaW50IGZsYWdzKSB7Ci0JCWlmIChldmVudCBpbnN0YW5jZW9mIE5vdGlmaWNhdGlvbikgewotCQkJaWYgKGZlYXR1cmUgPT0gKChOb3RpZmljYXRpb24pIGV2ZW50KS5nZXRGZWF0dXJlKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3Byb3ZpZGVycy9VTUxTdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZTBlZGIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3Byb3ZpZGVycy9VTUxTdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIgZXh0ZW5kcyBVTUxBYnN0cmFjdFBhcnNlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZlYXR1cmVzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIoTGlzdCBmZWF0dXJlcykgewotCQl0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nQnlQYXR0ZXJuKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzLAotCQkJU3RyaW5nIHBhdHRlcm4sIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdChmZWF0dXJlcy5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdC5uZXh0KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQl2YWx1ZSA9IGdldFZhbGlkVmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCQkJdmFsdWVzLmFkZCh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3Nvci5mb3JtYXQodmFsdWVzLnRvQXJyYXkobmV3IE9iamVjdFt2YWx1ZXMuc2l6ZSgpXSksCi0JCQkJbmV3IFN0cmluZ0J1ZmZlcigpLCBuZXcgRmllbGRQb3NpdGlvbigwKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlVmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlpZiAodmFsdWVzLmxlbmd0aCAhPSBmZWF0dXJlcy5zaXplKCkpIHsKLQkJCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEVfU1RBVFVTOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBnZXRWYWxpZE5ld1ZhbHVlKChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCS5nZXQoaSksIHZhbHVlc1tpXSk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnZhbGlkVmFsdWUpIHsKLQkJCQlyZXR1cm4gbmV3IFBhcnNlckVkaXRTdGF0dXMoRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEUsIHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsIE9iamVjdFtdIHZhbHVlcykgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gVHJhbnNhY3Rpb25VdGlsCi0JCQkJLmdldEVkaXRpbmdEb21haW4oZWxlbWVudCk7Ci0JCWlmIChlZGl0aW5nRG9tYWluID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwgIlNldCBWYWx1ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQljb21tYW5kCi0JCQkJCS5jb21wb3NlKGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWVzW2ldKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWZmZWN0aW5nRXZlbnQoT2JqZWN0IGV2ZW50LCBpbnQgZmxhZ3MpIHsKLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgTm90aWZpY2F0aW9uKSB7Ci0JCQlPYmplY3QgZmVhdHVyZSA9ICgoTm90aWZpY2F0aW9uKSBldmVudCkuZ2V0RmVhdHVyZSgpOwotCQkJaWYgKGZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MVmlld1Byb3ZpZGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTFZpZXdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDZiNDZhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MVmlld1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkluaXRpYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5NZXJnZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5NZXJnZU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5RmluYWxOb2RlTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eUZpbmFsTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFydGl0aW9uMlZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcnRpdGlvbk5hbWUyVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MlZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Vmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFydGl0aW9uVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5Vmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkNvbnRyb2xGbG93TmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5Db250cm9sRmxvd1ZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5EZWNpc2lvbk5vZGVOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkRlY2lzaW9uTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5Gb3JrTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5Jbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXMuSW5pdGlhbE5vZGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXMuSm9pbk5vZGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXMuTWVyZ2VOb2RlTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5NZXJnZU5vZGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5BYnN0cmFjdFZpZXdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFZpZXdQcm92aWRlciBleHRlbmRzIEFic3RyYWN0Vmlld1Byb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RGlhZ3JhbVZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVN0cmluZyBkaWFncmFtS2luZCkgewotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpZiAoQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoZGlhZ3JhbUtpbmQpCi0JCQkJJiYgVU1MVmlzdWFsSURSZWdpc3RyeS5nZXREaWFncmFtVmlzdWFsSUQoc2VtYW50aWNFbGVtZW50KSAhPSAtMSkgewotCQkJcmV0dXJuIEFjdGl2aXR5Vmlld0ZhY3RvcnkuY2xhc3M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXROb2RlVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJVmlldyBjb250YWluZXJWaWV3LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCWlmIChjb250YWluZXJWaWV3ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IGdldFNlbWFudGljRWxlbWVudFR5cGUoc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKGVsZW1lbnRUeXBlICE9IG51bGwKLQkJCQkmJiAhVU1MRWxlbWVudFR5cGVzLmlzS25vd25FbGVtZW50VHlwZShlbGVtZW50VHlwZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUVDbGFzcyBzZW1hbnRpY1R5cGUgPSBnZXRTZW1hbnRpY0VDbGFzcyhzZW1hbnRpY0FkYXB0ZXIpOwotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpbnQgbm9kZVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKGNvbnRhaW5lclZpZXcsCi0JCQkJc2VtYW50aWNFbGVtZW50LCBzZW1hbnRpY1R5cGUsIHNlbWFudGljSGludCk7Ci0JCXN3aXRjaCAobm9kZVZJRCkgewotCQljYXNlIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5RmluYWxOb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5RmluYWxOb2RlTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBNZXJnZU5vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIE1lcmdlTm9kZU5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBGb3JrTm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEluaXRpYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEluaXRpYWxOb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEluaXRpYWxOb2RlTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBEZWNpc2lvbk5vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIERlY2lzaW9uTm9kZU5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBKb2luTm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25WaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uTmFtZTJWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb24yVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudFZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIENvbnRyb2xGbG93TmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RWRnZVZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVZpZXcgY29udGFpbmVyVmlldywgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChlbGVtZW50VHlwZSAhPSBudWxsCi0JCQkJJiYgIVVNTEVsZW1lbnRUeXBlcy5pc0tub3duRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFQ2xhc3Mgc2VtYW50aWNUeXBlID0gZ2V0U2VtYW50aWNFQ2xhc3Moc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKHNlbWFudGljVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpbnQgbGlua1ZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKAotCQkJCXNlbWFudGljRWxlbWVudCwgc2VtYW50aWNUeXBlKTsKLQkJc3dpdGNoIChsaW5rVklEKSB7Ci0JCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQ29udHJvbEZsb3dWaWV3RmFjdG9yeS5jbGFzczsKLQkJfQotCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQ29ubmVjdG9yVmlld0NsYXNzKHNlbWFudGljQWRhcHRlciwKLQkJCQljb250YWluZXJWaWV3LCBzZW1hbnRpY0hpbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElFbGVtZW50VHlwZSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyKSB7Ci0JCWlmIChzZW1hbnRpY0FkYXB0ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJRWxlbWVudFR5cGUpIHNlbWFudGljQWRhcHRlci5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ2xhc3MgZ2V0VW5yZWNvZ25pemVkQ29ubmVjdG9yVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJVmlldyBjb250YWluZXJWaWV3LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCS8vIEhhbmRsZSB1bnJlY29nbml6ZWQgY2hpbGQgbm9kZSBjbGFzc2VzIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlGaW5hbE5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eUZpbmFsTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQzYzJkLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eUZpbmFsTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RMYWJlbFZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnV0aWwuTWVhc3VyZW1lbnRVbml0SGVscGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLm1hcG1vZGUuSU1hcE1vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Mb2NhdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgVmlldyBjb250YWluZXJWaWV3LAotCQkJU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwKLQkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsKLQkJTm9kZSB2aWV3ID0gKE5vZGUpIHN1cGVyLmNyZWF0ZVZpZXcoc2VtYW50aWNBZGFwdGVyLCBjb250YWluZXJWaWV3LAotCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIHZpZXcuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlJTWFwTW9kZSBtYXBNb2RlID0gTWVhc3VyZW1lbnRVbml0SGVscGVyLmdldE1hcE1vZGUoY29udGFpbmVyVmlldwotCQkJCS5nZXREaWFncmFtKCkuZ2V0TWVhc3VyZW1lbnRVbml0KCkpOwotCQlsb2NhdGlvbi5zZXRYKG1hcE1vZGUuRFB0b0xQKDApKTsKLQkJbG9jYXRpb24uc2V0WShtYXBNb2RlLkRQdG9MUCg1KSk7Ci0JCXJldHVybiB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eUZpbmFsTm9kZVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlGaW5hbE5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzIwMzM5Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eUZpbmFsTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZSgKLQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VHlwZShBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2ZiNjVmLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKAotCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQl2aWV3LAotCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMlZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmZhMDBjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMlZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyVmlld0ZhY3RvcnkgZXh0ZW5kcyBCYXNpY05vZGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNjFmOTIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBCYXNpY05vZGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlVmlld0ZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjZhOWQzLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpLmNyZWF0ZU5vZGUoCi0JCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCXZpZXcsCi0JCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb24yVmlld0ZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvbjJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2ZiMTVhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvbjJWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uMlZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKAotCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQl2aWV3LAotCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JCWdldFZpZXdTZXJ2aWNlKCkKLQkJCQkuY3JlYXRlTm9kZSgKLQkJCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQkJCXZpZXcsCi0JCQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uTmFtZTJWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uTmFtZTJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGIzNzhjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvbk5hbWUyVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnV0aWwuTWVhc3VyZW1lbnRVbml0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLklNYXBNb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uTmFtZTJWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5I2NyZWF0ZVZpZXcob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUsIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXcsIGphdmEubGFuZy5TdHJpbmcsIGludCwgYm9vbGVhbiwgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgVmlldyBjcmVhdGVWaWV3KElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBWaWV3IGNvbnRhaW5lclZpZXcsCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLAotCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgewotCQlOb2RlIHZpZXcgPSAoTm9kZSkgc3VwZXIuY3JlYXRlVmlldyhzZW1hbnRpY0FkYXB0ZXIsIGNvbnRhaW5lclZpZXcsCi0JCQkJc2VtYW50aWNIaW50LCBpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOwotCQlMb2NhdGlvbiBsb2NhdGlvbiA9IChMb2NhdGlvbikgdmlldy5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCUlNYXBNb2RlIG1hcE1vZGUgPSBNZWFzdXJlbWVudFVuaXRIZWxwZXIuZ2V0TWFwTW9kZShjb250YWluZXJWaWV3Ci0JCQkJLmdldERpYWdyYW0oKS5nZXRNZWFzdXJlbWVudFVuaXQoKSk7Ci0JCWxvY2F0aW9uLnNldFgobWFwTW9kZS5EUHRvTFAoMCkpOwotCQlsb2NhdGlvbi5zZXRZKG1hcE1vZGUuRFB0b0xQKDUpKTsKLQkJcmV0dXJuIHZpZXc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyYmY3Ni4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhNTA0NC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkxpc3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuRmlndXJlVXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRHJhd2VyU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTGF5b3V0Q29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlRpdGxlU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyVmlld0ZhY3RvcnkgZXh0ZW5kcwotCQlMaXN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTb3J0aW5nU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWx0ZXJpbmdTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlzZXR1cENvbXBhcnRtZW50VGl0bGUodmlldyk7Ci0JCXNldHVwQ29tcGFydG1lbnRDb2xsYXBzZWQodmlldyk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRDb25zdHJhaW50IGNyZWF0ZUxheW91dENvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzKFZpZXcgdmlldykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVByZWZlcmVuY2VzKHZpZXcpOwotCi0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgZ2V0UHJlZmVyZW5jZXNIaW50KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJLy8gZmlsbCBjb2xvcgotCQlSR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsCi0JCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsKLQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwgRmlndXJlVXRpbGl0aWVzCi0JCQkJLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQ29tcGFydG1lbnRUaXRsZShWaWV3IHZpZXcpIHsKLQkJVGl0bGVTdHlsZSB0aXRsZVN0eWxlID0gKFRpdGxlU3R5bGUpIHZpZXcKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRUaXRsZVN0eWxlKCkpOwotCQlpZiAodGl0bGVTdHlsZSAhPSBudWxsKSB7Ci0JCQl0aXRsZVN0eWxlLnNldFNob3dUaXRsZSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cENvbXBhcnRtZW50Q29sbGFwc2VkKFZpZXcgdmlldykgewotCQlEcmF3ZXJTdHlsZSBkcmF3ZXJTdHlsZSA9IChEcmF3ZXJTdHlsZSkgdmlldwotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldERyYXdlclN0eWxlKCkpOwotCQlpZiAoZHJhd2VyU3R5bGUgIT0gbnVsbCkgewotCQkJZHJhd2VyU3R5bGUuc2V0Q29sbGFwc2VkKGZhbHNlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWQ1ZTc3Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Vmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5MaXN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkZpZ3VyZVV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRyYXdlclN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxheW91dENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5UaXRsZVN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Vmlld0ZhY3RvcnkgZXh0ZW5kcwotCQlMaXN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTb3J0aW5nU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWx0ZXJpbmdTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCXNldHVwQ29tcGFydG1lbnRUaXRsZSh2aWV3KTsKLQkJc2V0dXBDb21wYXJ0bWVudENvbGxhcHNlZCh2aWV3KTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dENvbnN0cmFpbnQgY3JlYXRlTGF5b3V0Q29uc3RyYWludCgpIHsKLQkJcmV0dXJuIE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMoVmlldyB2aWV3KSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXModmlldyk7Ci0KLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBnZXRQcmVmZXJlbmNlc0hpbnQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQkvLyBmaWxsIGNvbG9yCi0JCVJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwKLQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOwotCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLCBGaWd1cmVVdGlsaXRpZXMKLQkJCQkuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBDb21wYXJ0bWVudFRpdGxlKFZpZXcgdmlldykgewotCQlUaXRsZVN0eWxlIHRpdGxlU3R5bGUgPSAoVGl0bGVTdHlsZSkgdmlldwotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFRpdGxlU3R5bGUoKSk7Ci0JCWlmICh0aXRsZVN0eWxlICE9IG51bGwpIHsKLQkJCXRpdGxlU3R5bGUuc2V0U2hvd1RpdGxlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQ29tcGFydG1lbnRDb2xsYXBzZWQoVmlldyB2aWV3KSB7Ci0JCURyYXdlclN0eWxlIGRyYXdlclN0eWxlID0gKERyYXdlclN0eWxlKSB2aWV3Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHJhd2VyU3R5bGUoKSk7Ci0JCWlmIChkcmF3ZXJTdHlsZSAhPSBudWxsKSB7Ci0JCQlkcmF3ZXJTdHlsZS5zZXRDb2xsYXBzZWQoZmFsc2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25WaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2ZWJjZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25WaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZSgKLQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQkJZ2V0Vmlld1NlcnZpY2UoKQotCQkJCS5jcmVhdGVOb2RlKAotCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJdmlldywKLQkJCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzRmYTZkLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnZpZXcuRGlhZ3JhbUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkRpYWdyYW1WaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk1lYXN1cmVtZW50VW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVZpZXdGYWN0b3J5IGV4dGVuZHMgRGlhZ3JhbVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhZ2VTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyB2aWV3LCBJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVN0cmluZyBkaWFncmFtS2luZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcodmlldywgc2VtYW50aWNBZGFwdGVyLCBkaWFncmFtS2luZCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkRpYWdyYW1WaWV3RmFjdG9yeSNjcmVhdGVEaWFncmFtKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50KQotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBEaWFncmFtIGNyZWF0ZURpYWdyYW0oSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlTdHJpbmcgZGlhZ3JhbUtpbmQsIFByZWZlcmVuY2VzSGludCB0aGVQcmVmZXJlbmNlc0hpbnQpIHsKLQkJc2V0UHJlZmVyZW5jZXNIaW50KHRoZVByZWZlcmVuY2VzSGludCk7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IG5ldyBEaWFncmFtSW1wbCgpOwotCQlMaXN0IHN0eWxlcyA9IGNyZWF0ZVN0eWxlcyhkaWFncmFtKTsKLQkJaWYgKHN0eWxlcy5zaXplKCkgPiAwKSB7Ci0JCQlkaWFncmFtLmdldFN0eWxlcygpLmFkZEFsbChzdHlsZXMpOwotCQl9Ci0KLQkJaWYgKGRpYWdyYW1LaW5kICE9IG51bGwpCi0JCQlkaWFncmFtLnNldFR5cGUoZGlhZ3JhbUtpbmQpOwotCQlpZiAoc2VtYW50aWNBZGFwdGVyICE9IG51bGwpCi0JCQlkaWFncmFtLnNldEVsZW1lbnQoKEVPYmplY3QpIHNlbWFudGljQWRhcHRlcgotCQkJCQkuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKSk7Ci0JCWVsc2UKLQkJCS8vIGVuZm9yY2UgYSBzZXQgdG8gTlVMTAotCQkJZGlhZ3JhbS5zZXRFbGVtZW50KG51bGwpOwotCi0JCWluaXRpYWxpemVNZWFzdXJlbWVudFVuaXQoZGlhZ3JhbSk7Ci0KLQkJLy8gZG8gdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbnMgKGNyZWF0aW5nIGNoaWxkcmVuLCBzZXR0aW5nIHByb3BlcnRpZXMuLi5ldGMpCi0JCWRlY29yYXRlVmlldyhkaWFncmFtLCBzZW1hbnRpY0FkYXB0ZXIsIGRpYWdyYW1LaW5kKTsKLQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBjdXN0b20KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZU1lYXN1cmVtZW50VW5pdChEaWFncmFtIGRpYWdyYW0pIHsKLQkJaWYgKCFkaWFncmFtLmlzU2V0TWVhc3VyZW1lbnRVbml0KCkpIHsKLQkJCWRpYWdyYW0uc2V0TWVhc3VyZW1lbnRVbml0KGdldE1lYXN1cmVtZW50VW5pdCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVhc3VyZW1lbnRVbml0IGdldE1lYXN1cmVtZW50VW5pdCgpIHsKLQkJcmV0dXJuIE1lYXN1cmVtZW50VW5pdC5QSVhFTF9MSVRFUkFMOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0NvbnRyb2xGbG93TmFtZVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQ29udHJvbEZsb3dOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQzYTM0My4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQ29udHJvbEZsb3dOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS51dGlsLk1lYXN1cmVtZW50VW5pdEhlbHBlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLklNYXBNb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTG9jYXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdExhYmVsVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWaWV3IGNyZWF0ZVZpZXcoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFZpZXcgY29udGFpbmVyVmlldywKLQkJCVN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsCi0JCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7Ci0JCU5vZGUgdmlldyA9IChOb2RlKSBzdXBlci5jcmVhdGVWaWV3KHNlbWFudGljQWRhcHRlciwgY29udGFpbmVyVmlldywKLQkJCQlzZW1hbnRpY0hpbnQsIGluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7Ci0JCUxvY2F0aW9uIGxvY2F0aW9uID0gKExvY2F0aW9uKSB2aWV3LmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJSU1hcE1vZGUgbWFwTW9kZSA9IE1lYXN1cmVtZW50VW5pdEhlbHBlci5nZXRNYXBNb2RlKGNvbnRhaW5lclZpZXcKLQkJCQkuZ2V0RGlhZ3JhbSgpLmdldE1lYXN1cmVtZW50VW5pdCgpKTsKLQkJbG9jYXRpb24uc2V0WChtYXBNb2RlLkRQdG9MUCgwKSk7Ci0JCWxvY2F0aW9uLnNldFkobWFwTW9kZS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHZpZXc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0NvbnRyb2xGbG93Vmlld0ZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9Db250cm9sRmxvd1ZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyM2I2MzMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0NvbnRyb2xGbG93Vmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS5BYnN0cmFjdEVNRk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUudXRpbC5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUudXRpbC5TdHJpbmdTdGF0aWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSURlYnVnT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSVN0YXR1c0NvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQ29ubmVjdGlvblZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkJlbmRwb2ludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd1ZpZXdGYWN0b3J5IGV4dGVuZHMgQ29ubmVjdGlvblZpZXdGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQlzdGF0aWMgewotCQlvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fVU5QUk9URUNURUQsIEJvb2xlYW4uVFJVRSk7Ci0JCW9wdGlvbnMucHV0KFRyYW5zYWN0aW9uLk9QVElPTl9OT19OT1RJRklDQVRJT05TLCBCb29sZWFuLlRSVUUpOwotCQlvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fTk9fVFJJR0dFUlMsIEJvb2xlYW4uVFJVRSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm91dGluZ1N0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKHNlbWFudGljQWRhcHRlciwgdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUoQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS52aWV3LmZhY3Rvcmllcy5WaWV3RmFjdG9yeSNjcmVhdGVWaWV3KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlLCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcpCi0JICogCi0JICogT3ZlcnJvZGUgY3JlYXRlVmlldyBzaW5jZSB0aGVyZSBpcyBhIGJ1ZyBpbiAKLQkgKiBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkNvbm5lY3Rpb25WaWV3RmFjdG9yeS5qYXZhCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhmaW5hbCBJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCWZpbmFsIFZpZXcgY29udGFpbmVyVmlldywgZmluYWwgU3RyaW5nIHNlbWFudGljSGludCwKLQkJCWZpbmFsIGludCBpbmRleCwgZmluYWwgYm9vbGVhbiBwZXJzaXN0ZWQsCi0JCQlmaW5hbCBQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7Ci0KLQkJc2V0UHJlZmVyZW5jZXNIaW50KHByZWZlcmVuY2VzSGludCk7Ci0KLQkJZmluYWwgRWRnZSBlZGdlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFZGdlKCk7Ci0JCUxpc3Qgc3R5bGVzID0gY3JlYXRlU3R5bGVzKGVkZ2UpOwotCQlpZiAoc3R5bGVzLnNpemUoKSA+IDApIHsKLQkJCWVkZ2UuZ2V0U3R5bGVzKCkuYWRkQWxsKHN0eWxlcyk7Ci0JCX0KLQotCQlCZW5kcG9pbnRzIGJlbmRQb2ludHMgPSBjcmVhdGVCZW5kcG9pbnRzKCk7Ci0JCWlmIChiZW5kUG9pbnRzICE9IG51bGwpIHsKLQkJCWVkZ2Uuc2V0QmVuZHBvaW50cyhiZW5kUG9pbnRzKTsKLQkJfQotCi0JCUVPYmplY3Qgc2VtYW50aWNFbCA9IHNlbWFudGljQWRhcHRlciA9PSBudWxsID8gbnVsbAotCQkJCTogKEVPYmplY3QpIHNlbWFudGljQWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlpZiAoc2VtYW50aWNFbCA9PSBudWxsKQotCQkJLy8gZW5mb3JjZSBhIHNldCB0byBOVUxMCi0JCQllZGdlLnNldEVsZW1lbnQobnVsbCk7Ci0JCWVsc2UgaWYgKHJlcXVpcmVzRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIsIGNvbnRhaW5lclZpZXcpKSB7Ci0JCQllZGdlLnNldEVsZW1lbnQoc2VtYW50aWNFbCk7Ci0JCX0KLQotCQllZGdlLnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQotCQkvLyBkZWNvcmF0ZSB2aWV3IGFzc3VtZXMgdGhlIHZpZXcgaGFkIGJlZW4gaW5zZXJ0ZWQgYWxyZWFkeSwgc28gCi0JCS8vIHdlIGhhZCB0byBjYWxsIGluc2VydCBjaGlsZCBiZWZvcmUgY2FsbGluZyBkZWNvcmF0ZSB2aWV3Ci0JCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBlZGdlLCBpbmRleCwgcGVyc2lzdGVkKTsKLQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBnZXRFZGl0aW5nRG9tYWluKHNlbWFudGljRWwsCi0JCQkJY29udGFpbmVyVmlldyk7Ci0KLQkJaWYgKGRvbWFpbiAhPSBudWxsKSB7Ci0JCQlpZiAoaXNVblByb3RlY3RlZFNpbGVudFRyYW5zYWN0aW9uSW5Qcm9ncmVzcyhkb21haW4pKSB7Ci0JCQkJLy8gZGVjb3JhdGUgdmlldyBoYWQgdG8gcnVuIGFzIGEgc2lsZW50IG9wZXJhdGlvbiBvdGhlciB3aXNlCi0JCQkJLy8gaXQgd2lsbCBnZW5lcmF0ZSB0b28gbWFueSBldmVudHMKLQkJCQlkZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgZWRnZSwgc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJc2VtYW50aWNIaW50LCBpbmRleCwgdHJ1ZSk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJQWJzdHJhY3RFTUZPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEFic3RyYWN0RU1GT3BlcmF0aW9uKAotCQkJCQkJZG9tYWluLCBTdHJpbmdTdGF0aWNzLkJMQU5LLCBvcHRpb25zKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCQkJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCQkJZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIGVkZ2UsIHNlbWFudGljQWRhcHRlciwKLQkJCQkJCQkJc2VtYW50aWNIaW50LCBpbmRleCwgdHJ1ZSk7Ci0KLQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQl0cnkgewotCQkJCQlvcGVyYXRpb24uZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS5jYXRjaGluZyhEaWFncmFtVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKSwKLQkJCQkJCQlEaWFncmFtVUlEZWJ1Z09wdGlvbnMuRVhDRVBUSU9OU19DQVRDSElORywKLQkJCQkJCQlnZXRDbGFzcygpLCAiY3JlYXRlVmlldyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCUxvZy53YXJuaW5nKERpYWdyYW1VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLAotCQkJCQkJCURpYWdyYW1VSVN0YXR1c0NvZGVzLklHTk9SRURfRVhDRVBUSU9OX1dBUk5JTkcsCi0JCQkJCQkJImNyZWF0ZVZpZXciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlZGdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0RlY2lzaW9uTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0RlY2lzaW9uTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWNmMTE5Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9EZWNpc2lvbk5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0RlY2lzaW9uTm9kZVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvRGVjaXNpb25Ob2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4MzNkNy4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvRGVjaXNpb25Ob2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKQotCQkJCS5jcmVhdGVOb2RlKAotCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJdmlldywKLQkJCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCQkJLmdldFR5cGUoRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9Gb3JrTm9kZVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvRm9ya05vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjRjNTFjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9Gb3JrTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRm9ya05vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZvcmtOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvSW5pdGlhbE5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9Jbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJkYzU4Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9Jbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RMYWJlbFZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnV0aWwuTWVhc3VyZW1lbnRVbml0SGVscGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLm1hcG1vZGUuSU1hcE1vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Mb2NhdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgVmlldyBjb250YWluZXJWaWV3LAotCQkJU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwKLQkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsKLQkJTm9kZSB2aWV3ID0gKE5vZGUpIHN1cGVyLmNyZWF0ZVZpZXcoc2VtYW50aWNBZGFwdGVyLCBjb250YWluZXJWaWV3LAotCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIHZpZXcuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlJTWFwTW9kZSBtYXBNb2RlID0gTWVhc3VyZW1lbnRVbml0SGVscGVyLmdldE1hcE1vZGUoY29udGFpbmVyVmlldwotCQkJCS5nZXREaWFncmFtKCkuZ2V0TWVhc3VyZW1lbnRVbml0KCkpOwotCQlsb2NhdGlvbi5zZXRYKG1hcE1vZGUuRFB0b0xQKDApKTsKLQkJbG9jYXRpb24uc2V0WShtYXBNb2RlLkRQdG9MUCg1KSk7Ci0JCXJldHVybiB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9Jbml0aWFsTm9kZVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvSW5pdGlhbE5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2IyMjBiLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9Jbml0aWFsTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZShzZW1hbnRpY0FkYXB0ZXIsIHZpZXcsCi0JCQkJVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvSm9pbk5vZGVWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0pvaW5Ob2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5ZGY4Ni4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvSm9pbk5vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkpvaW5Ob2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL01lcmdlTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL01lcmdlTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2ZkOTZjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9NZXJnZU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL01lcmdlTm9kZVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvTWVyZ2VOb2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjYmQxZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvTWVyZ2VOb2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5NZXJnZU5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKHNlbWFudGljQWRhcHRlciwgdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUoTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0M2I0NS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMlZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpCi0JCQkJLmNyZWF0ZU5vZGUoCi0JCQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQl2aWV3LAotCQkJCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlYmVhNC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM1ZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpCi0JCQkJLmNyZWF0ZU5vZGUoCi0JCQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQl2aWV3LAotCQkJCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyVmlld0ZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTQ3NDE3Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJWaWV3RmFjdG9yeSBleHRlbmRzCi0JCUJhc2ljTm9kZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NTQzMTguLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYmE5ZWEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEJhc2ljTm9kZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlVmlld0ZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U4OThjNi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZSgKLQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS8ucHJvamVjdCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OWMxN2EyLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzM3ZjBmLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcDQotICAgICAgICAgICAgICAgZmVhdHVyZV9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmVfa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgZmVhdHVyZV9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmVfemhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgZmVhdHVyZV9pdC5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmVfZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZS54bWwgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDFhNTIzNy4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEiCi0gICAgICBsYWJlbD0iRVBGIENvbXBvc2VyIEJhc2UgTkwxIEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSJFY2xpcHNlIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYmFzZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlVGV4dAotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90ZWNobm9sb2d5L2VwZi91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51bWEubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfZGUucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjUwZTI1Ny4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1FUEYgLSBCYXNpcy1GZWF0dXJlDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGLUJhc2lzLUZlYXR1cmUuDQotdXBkYXRlU2l0ZU5hbWU9RVBGIC0gRmVhdHVyZS1Ba3R1YWxpc2llcnVuZ2VuDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PURpZSBWZXJ3ZW5kdW5nIGRpZXNlcyBGZWF0dXJlcyB1bnRlcmxpZWd0IGRlbnNlbGJlbiBCZWRpbmd1bmdlbiwgZGllIGZcdTAwZmNyIGRpZSBWZXJ3ZW5kdW5nIGRlcyBQcm9kdWt0cyBnZWx0ZW4sIGRhcyBkaWVzZXMgRmVhdHVyZSBlbnRoXHUwMGU0bHQuDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZV9lcy5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZV9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MmQzYWYwLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZlYXR1cmVOYW1lPUNhcmFjdGVyXHUwMGVkc3RpY2EgYlx1MDBlMXNpY2EgZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249Q2FyYWN0ZXJcdTAwZWRzdGljYSBiXHUwMGUxc2ljYSBkZSBFUEYuDQotdXBkYXRlU2l0ZU5hbWU9QWN0dWFsaXphY2lvbmVzIGRlIGNhcmFjdGVyXHUwMGVkc3RpY2EgZGUgRVBGDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgQ29sYWJvcmFkb3JlcyBkZSBFY2xpcHNlIHkgb3Ryb3MgMjAwNCwgMjAwNi4gIFJlc2VydmFkb3MgdG9kb3MgbG9zIGRlcmVjaG9zLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9RWwgdXNvIGRlIGVzdGEgY2FyYWN0ZXJcdTAwZWRzdGljYSBlc3RcdTAwZTEgc3VqZXRvIGEgbG9zIG1pc21vcyB0XHUwMGU5cm1pbm9zIHkgY29uZGljaW9uZXMgcXVlIHJpZ2VuIGVsIHVzbyBkZWwgUHJvZHVjdG8gcXVlIGluY2x1eWUgZXN0YSBjYXJhY3Rlclx1MDBlZHN0aWNhLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfZnIucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDVlNWY3ZS4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1Gb25jdGlvbiBkZSBiYXNlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLWRlc2NyaXB0aW9uPUZvbmN0aW9uIGRlIGJhc2UgRVBGLg0KLXVwZGF0ZVNpdGVOYW1lPU1pc2VzIFx1MDBlMCBqb3VyIGRlIGxhIGZvbmN0aW9uIEVQRg0KLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwNCi1saWNlbnNlVGV4dD1MJ3V0aWxpc2F0aW9uIGRlIGNldHRlIGZvbmN0aW9uIGRcdTAwZTlwZW5kIGRlcyBtXHUwMGVhbWVzIHRlcm1lcyBldCBjb25kaXRpb25zIHF1aSByXHUwMGU5Z2lzc2VudCBsJ3V0aWxpc2F0aW9uIGR1IHByb2R1aXQgaW5jbHVhbnQgY2V0dGUgZm9uY3Rpb24uDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZV9pdC5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZV9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OTMxNWI3Li4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZlYXR1cmVOYW1lPUZ1bnppb25lIEVQRiBCYXNlDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RnVuemlvbmUgZGkgYmFzZSBFUEYuDQotdXBkYXRlU2l0ZU5hbWU9QWdnaW9ybmFtZW50aSBmdW56aW9uZSBFUEYNCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuICBUdXR0aSBpIGRpcml0dGkgcmlzZXJ2YXRpLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9TCd1c28gZGkgcXVlc3RhIGZ1bnppb25lIFx1MDBlOCBzb2dnZXR0byBhZ2xpIHN0ZXNzaSB0ZXJtaW5pIGUgY29uZGl6aW9uaSBjaGUgcmVnb2xhbm8gbCd1c28gZGVsIHByb2RvdHRvIGNoZSBmb3JuaXNjZSB0YWxlIGZ1bnppb25lLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfamEucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA5ZWM1MC4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1FUEYgQmFzZSBGZWF0dXJlDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGIFx1NTdmYVx1NjcyY1x1NmE1Zlx1ODBmZFx1MzAwMg0KLXVwZGF0ZVNpdGVOYW1lPUVQRiBcdTZhNWZcdTgwZmRcdTMwNmVcdTY2ZjRcdTY1YjANCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9XHUzMDUzXHUzMDZlXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGZjXHUzMDZlXHU0ZjdmXHU3NTI4XHUzMDZiXHUzMDZmXHUzMDAxXHUzMDUzXHUzMDZlXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGZjXHUzMDkyXHU1NDJiXHUzMDgwXHU4OGZkXHU1NGMxXHUzMDZlXHU0ZjdmXHU3NTI4XHUzMDZiXHU1YmZlXHUzMDU3XHUzMDY2XHU5MDY5XHU3NTI4XHUzMDU1XHUzMDhjXHUzMDhiXHUzMDgyXHUzMDZlXHUzMDY4XHU1NDBjXHUzMDU4XHUzMDU0XHU0ZjdmXHU3NTI4XHU2NzYxXHU0ZWY2XHUzMDRjXHU5MDY5XHU3NTI4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZV9rby5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZV9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMmQzNDMyLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZlYXR1cmVOYW1lPUVQRiBcdWFlMzBcdWJjZjggXHVhZTMwXHViMmE1DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGIFx1YWUzMFx1YmNmOCBcdWFlMzBcdWIyYTUNCi11cGRhdGVTaXRlTmFtZT1FUEYgXHVhZTMwXHViMmE1IFx1YWMzMVx1YzJlMFx1YzBhY1x1ZDU2ZA0KLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PVx1YmNmOCBcdWFlMzBcdWIyYTVcdWM3NTggXHVjMGFjXHVjNmE5XHVjNWQwIFx1YjMwMFx1ZDU3NFx1YzExY1x1YjI5NCBcdWJjZjggXHVhZTMwXHViMmE1XHVjNzQ0IFx1ZDNlY1x1ZDU2OFx1ZDU1OFx1YjI5NCBcdWM4MWNcdWQ0ODhcdWM3NTggXHVjMGFjXHVjNmE5XHVjNWQwIFx1YzgwMVx1YzZhOVx1YjQxOFx1YjI5NCBcdWIzZDlcdWM3N2NcdWQ1NWMgXHVjODcwXHVhYzc0XHVjNzc0IFx1YzgwMVx1YzZhOVx1YjQyOVx1YjJjOFx1YjJlNC4NCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyYzRiNDcuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZV9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotZmVhdHVyZU5hbWU9UmVjdXJzbyBCYXNlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLWRlc2NyaXB0aW9uPVJlY3Vyc28gQmFzZSBFUEYuDQotdXBkYXRlU2l0ZU5hbWU9QXR1YWxpemFcdTAwZTdcdTAwZjVlcyBkZSBSZWN1cnNvcyBFUEYNCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBjb250cmlidWlkb3JlcyBkbyBFY2xpcHNlIGUgdGVyY2Vpcm9zIDIwMDQsIDIwMDYuICBUb2RvcyBvcyBEaXJlaXRvcyBSZXNlcnZhZG9zLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9TyB1c28gZGVzdGUgcmVjdXJzbyBlc3RcdTAwZTEgc3VqZWl0byBhb3MgbWVzbW9zIHRlcm1vcyBlIGNvbmRpXHUwMGU3XHUwMGY1ZXMgcXVlIGNvbnRyb2xhbSBvIHVzbyBkbyBQcm9kdXRvIHF1ZSBpbmNsdWl1IGVzdGUgcmVjdXJzby4NCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlX3poX0NOLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjOThiYzkuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZV96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotZmVhdHVyZU5hbWU9RVBGIEJhc2UgXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGIEJhc2UgXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2XHUzMDAyDQotdXBkYXRlU2l0ZU5hbWU9RVBGIFx1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNlx1NjZmNFx1NjViMA0KLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PVx1NmI2NFx1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNlx1NzY4NFx1NGY3Zlx1NzUyOFx1NGUwZVx1NTMwNVx1NTQyYlx1NmI2NFx1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNlx1NzY4NFx1NGVhN1x1NTRjMVx1NzY4NFx1NGY3Zlx1NzUyOFx1N2JhMVx1NzQwNlx1OTA3NVx1NWZhYVx1NzZmOFx1NTQwY1x1NzY4NFx1Njc2MVx1NmIzZVx1NTQ4Y1x1Njc2MVx1NGVmNlx1MzAwMg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfemhfVFcucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODAzOGY0Mi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1FUEYgQmFzZSBcdTcyNzlcdTYwMjcNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi1kZXNjcmlwdGlvbj1FUEYgQmFzZSBcdTcyNzlcdTYwMjdcdTMwMDINCi11cGRhdGVTaXRlTmFtZT1FUEYgXHU3Mjc5XHU2MDI3XHU2NmY0XHU2NWIwDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PVx1NjcyY1x1NzI3OVx1NjAyN1x1NGU0Ylx1NzUyOFx1OTAxNFx1ODk4Zlx1N2JjNFx1N2I0OVx1NTQwY1x1NjViY1x1NTMwNVx1NTQyYlx1NjcyY1x1NzI3OVx1NjAyN1x1NGU0Ylx1MzAwY1x1NzUyMlx1NTRjMVx1MzAwZFx1NzY4NFx1NGY3Zlx1NzUyOFx1Njg5ZFx1NmIzZVx1MzAwMg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2xpY2Vuc2UuaHRtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTVhMTBjZi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPg0KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPg0KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPg0KLQ0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4NCi0NCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMNCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UNCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUg0KLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4NCi0gICANCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgDQotICAgDQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMA0KLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUw0KLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPg0KLSAgIA0KLTx1bD4NCi0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4NCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPg0KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMNCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4NCi0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+DQotPC91bD4gICANCi0gDQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQNCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQ0KLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4NCi0NCi08dWw+DQotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPg0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPg0KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+DQotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+DQotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4NCi08L3VsPg0KLQkJDQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUNCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3INCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuDQotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluDQotdGhhdCBkaXJlY3RvcnkuPC9wPg0KLQ0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFDQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+DQotDQotPHVsPg0KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+DQotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkNCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4NCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4NCi08L3VsPg0KLQ0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlDQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+DQotDQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+DQotDQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bw0KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LA0KLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPg0KLSAgIA0KLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIA0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvbGljZW5zZV9mci5odG1sIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvbGljZW5zZV9mci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MGZmZDAyLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2xpY2Vuc2VfZnIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLQ0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCi08TUVUQSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9IklCTSBXZWJTcGhlcmUgU3R1ZGlvIj4NCi08dGl0bGU+Q29udHJhdCBkZSBsaWNlbmNlIGRlIGxhIGZvbmN0aW9uPC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotPGgzPkNvbnRyYXQgZGUgbGljZW5jZSBkZSBsYSBmb25jdGlvbjwvaDM+DQotDQotPHA+TCd1dGlsaXNhdGlvbiBkZSBjZXR0ZSBmb25jdGlvbiBkw6lwZW5kIGRlcyBtw6ptZXMgdGVybWVzIGV0IGNvbmRpdGlvbnMgcXVpIHLDqWdpc3NlbnQgbCd1dGlsaXNhdGlvbiBkdSBwcm9kdWl0IGluY2x1YW50IGNldHRlIGZvbmN0aW9uLjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2xpY2Vuc2VfamEuaHRtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2xpY2Vuc2VfamEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDIzNzQ4OS4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9saWNlbnNlX2phLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi0NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQotPE1FVEEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJJQk0gV2ViU3BoZXJlIFN0dWRpbyI+DQotPHRpdGxlPuODleOCo+ODvOODgeODo+ODvOOBruOBlOS9v+eUqOadoeS7tjwvdGl0bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5Pg0KLQ0KLTxoMz7jg5XjgqPjg7zjg4Hjg6Pjg7zjga7jgZTkvb/nlKjmnaHku7Y8L2gzPg0KLQ0KLTxwPuOBk+OBruODleOCo+ODvOODgeODo+ODvOOBruS9v+eUqOOBq+OBr+OAgeOBk+OBruODleOCo+ODvOODgeODo+ODvOOCkuWQq+OCgOijveWTgeOBruS9v+eUqOOBq+WvvuOBl+OBpumBqeeUqOOBleOCjOOCi+OCguOBruOBqOWQjOOBmOOBlOS9v+eUqOadoeS7tuOBjOmBqeeUqOOBleOCjOOBvuOBmeOAgjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyLy5wcm9qZWN0IGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjYWI5YTEuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmM2I4YWIuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmVfcnUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvZmVhdHVyZS54bWwgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMi9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTdlZmI4ZS4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMi9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDIiCi0gICAgICBsYWJlbD0iRVBGIENvbXBvc2VyIEJhc2UgTkwyIEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSJFY2xpcHNlIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2VUZXh0Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3RlY2hub2xvZ3kvZXBmL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnVtYS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvZmVhdHVyZV9ydS5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvZmVhdHVyZV9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZmViNzFhLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyL2ZlYXR1cmVfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZlYXR1cmVOYW1lPVx1MDQxMVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2JcdTA0MzVcdTA0M2FcdTA0NDIgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249XHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQzNVx1MDQzYVx1MDQ0MiBFUEYuDQotdXBkYXRlU2l0ZU5hbWU9XHUwNDFlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIEVQRg0KLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi4gIFx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDRiLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9XHUwNDE0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzZFx1MDQzMCBcdTA0NDJcdTA0MzVcdTA0NDUgXHUwNDM2XHUwNDM1IFx1MDQ0M1x1MDQ0MVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Zlx1MDQ0NSwgXHUwNDQ3XHUwNDQyXHUwNDNlIFx1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyLCBcdTA0MzIgXHUwNDQxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2VcdTA0M2QgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyL2xpY2Vuc2UuaHRtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTVhMTBjZi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMi9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPg0KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPg0KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPg0KLQ0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4NCi0NCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMNCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UNCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUg0KLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4NCi0gICANCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgDQotICAgDQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMA0KLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUw0KLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPg0KLSAgIA0KLTx1bD4NCi0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4NCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPg0KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMNCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4NCi0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+DQotPC91bD4gICANCi0gDQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQNCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQ0KLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4NCi0NCi08dWw+DQotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPg0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPg0KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+DQotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+DQotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4NCi08L3VsPg0KLQkJDQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUNCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3INCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuDQotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluDQotdGhhdCBkaXJlY3RvcnkuPC9wPg0KLQ0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFDQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+DQotDQotPHVsPg0KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+DQotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkNCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4NCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4NCi08L3VsPg0KLQ0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlDQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+DQotDQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+DQotDQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bw0KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LA0KLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPg0KLSAgIA0KLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIA0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvbGljZW5zZV9ydS5odG1sIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvbGljZW5zZV9ydS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNjczYTgxLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyL2xpY2Vuc2VfcnUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLQ0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCi08TUVUQSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9IklCTSBXZWJTcGhlcmUgU3R1ZGlvIj4NCi08dGl0bGU+0JvQuNGG0LXQvdC30LjQvtC90L3QvtC1INGB0L7Qs9C70LDRiNC10L3QuNC1INC60L7QvNC/0LvQtdC60YLQsDwvdGl0bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5Pg0KLQ0KLTxoMz7Qm9C40YbQtdC90LfQuNC+0L3QvdC+0LUg0YHQvtCz0LvQsNGI0LXQvdC40LUg0LrQvtC80L/Qu9C10LrRgtCwPC9oMz4NCi0NCi08cD7QmtC+0LzQv9C70LXQutGCINC/0YDQtdC00L7RgdGC0LDQstC70Y/QtdGC0YHRjyDQvdCwINGD0YHQu9C+0LLQuNGP0YUg0LvQuNGG0LXQvdC30LjQvtC90L3QvtCz0L4g0YHQvtCz0LvQsNGI0LXQvdC40Y8g0L7RgdC90L7QstC90L7Qs9C+INC/0YDQvtC00YPQutGC0LAsINGBINC60L7RgtC+0YDRi9C8INC+0L0g0L/QvtGB0YLQsNCy0LvRj9C10YLRgdGPLjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYS8ucHJvamVjdCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGZjZjRiYi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4N2YyZTkuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlX2RhLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbA0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYS9mZWF0dXJlLnhtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NhZGM3MS4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMmEvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyYSIKLSAgICAgIGxhYmVsPSJFUEYgQ29tcG9zZXIgQmFzZSBOTDJhIEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSJFY2xpcHNlIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYmFzZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlVGV4dAotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90ZWNobm9sb2d5L2VwZi91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJjcC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51bWEubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYS9mZWF0dXJlX2RhLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMmEvZmVhdHVyZV9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZGM4YjgwLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYS9mZWF0dXJlX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1FUEYgLSBiYXNpc2Z1bmt0aW9uDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGIC0gYmFzaXNmdW5rdGlvbi4NCi11cGRhdGVTaXRlTmFtZT1FUEYgLSBmdW5rdGlvbnNvcGRhdGVyaW5nZXINCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwNCi1saWNlbnNlVGV4dD1CcnVnZW4gYWYgZGVubmUgZnVua3Rpb24gZXIgdW5kZXJsYWd0IGRlIHNhbW1lIHZpbGtcdTAwZTVyLCBzb20gcmVndWxlcmVyIGJydWdlbiBhZiBkZXQgcHJvZHVrdCwgZGVyIGluZGVob2xkZXIgZGVubmUgZnVua3Rpb24uDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDJhL2xpY2Vuc2UuaHRtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1YTEwY2YuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDJhL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+DQotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+DQotPHA+TWFyY2ggMTcsIDIwMDU8L3A+DQotDQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPg0KLQ0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUw0KLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EDQotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQ0KLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SDQotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EDQotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPg0KLSAgIA0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICANCi0gICANCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wDQotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTDQotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+DQotICAgDQotPHVsPg0KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPg0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+DQotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucw0KLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPg0KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4NCi08L3VsPiAgIA0KLSANCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZA0KLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlDQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPg0KLQ0KLTx1bD4NCi0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+DQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+DQotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4NCi0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4NCi0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPg0KLTwvdWw+DQotCQkNCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQ0KLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcg0KLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4NCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4NCi10aGF0IGRpcmVjdG9yeS48L3A+DQotDQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UNCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4NCi0NCi08dWw+DQotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4NCi0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQ0KLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPg0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPg0KLTwvdWw+DQotDQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UNCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4NCi0NCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4NCi0NCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvDQotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsDQotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+DQotICAgDQotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvLnByb2plY3QgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiYmE4ZTUuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YWExNzQwLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgZmVhdHVyZV9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmVfZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgZmVhdHVyZV9pdC5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmVfa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgZmVhdHVyZV9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmVfemhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2ZlYXR1cmUucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyNWI2ZGYuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZlYXR1cmVOYW1lPUVQRiBQbGF0Zm9ybSBGZWF0dXJlIChOTDEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGIFBsYXRmb3JtIEZlYXR1cmUuDQotdXBkYXRlU2l0ZU5hbWU9RVBGIEZlYXR1cmUgVXBkYXRlcw0KLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwNCi1saWNlbnNlVGV4dD1Vc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgdGVybXMgYW5kIGNvbmRpdGlvbnMgd2hpY2ggZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIFByb2R1Y3Qgd2hpY2ggaW5jbHVkZWQgdGhpcyBmZWF0dXJlLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlLnhtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDE3Y2NhNS4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0iCi0gICAgICBvcz0ibGludXgsd2luMzIiCi0gICAgICB3cz0iZ3RrLHdpbjMyIgotICAgICAgYXJjaD0ieDg2IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZVRleHQKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4yIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5pYm0uaWN1Lm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmpvYnMubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Lm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGgubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb21tb25qLnNkby5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJlY29yZS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWwubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24ubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcy5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5Lm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdlZi5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuYXBwc2VydmVyLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLnVpLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NnaS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGV4dC5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5mb3Jtcy5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaW50cm8ubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcC5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRvbWNhdC5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc2VhcmNoLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaC5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gyLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0udWkubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jb25zb2xlLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV9kZS5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2ZlYXR1cmVfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Q2NTc5MC4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotZmVhdHVyZU5hbWU9RVBGIC0gUGxhdHRmb3JtLUZlYXR1cmUNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi1kZXNjcmlwdGlvbj1FUEYtUGxhdHRmb3JtLUZlYXR1cmUuDQotdXBkYXRlU2l0ZU5hbWU9RVBGIC0gRmVhdHVyZS1Ba3R1YWxpc2llcnVuZ2VuDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PURpZSBWZXJ3ZW5kdW5nIGRpZXNlcyBGZWF0dXJlcyB1bnRlcmxpZWd0IGRlbnNlbGJlbiBCZWRpbmd1bmdlbiwgZGllIGZcdTAwZmNyIGRpZSBWZXJ3ZW5kdW5nIGRlcyBQcm9kdWt0cyBnZWx0ZW4sIGRhcyBkaWVzZXMgRmVhdHVyZSBlbnRoXHUwMGU0bHQuDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2ZlYXR1cmVfZXMucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4Yzc4NTIuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2ZlYXR1cmVfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZlYXR1cmVOYW1lPUNhcmFjdGVyXHUwMGVkc3RpY2EgZGUgbGEgcGxhdGFmb3JtYSBkZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi1kZXNjcmlwdGlvbj1DYXJhY3Rlclx1MDBlZHN0aWNhIGRlIGxhIHBsYXRhZm9ybWEgZGUgRVBGLg0KLXVwZGF0ZVNpdGVOYW1lPUFjdHVhbGl6YWNpb25lcyBkZSBjYXJhY3Rlclx1MDBlZHN0aWNhIGRlIEVQRg0KLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IENvbGFib3JhZG9yZXMgZGUgRWNsaXBzZSB5IG90cm9zIDIwMDQsIDIwMDYuICBSZXNlcnZhZG9zIHRvZG9zIGxvcyBkZXJlY2hvcy4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PUVsIHVzbyBkZSBlc3RhIGNhcmFjdGVyXHUwMGVkc3RpY2EgZXN0XHUwMGUxIHN1amV0byBhIGxvcyBtaXNtb3MgdFx1MDBlOXJtaW5vcyB5IGNvbmRpY2lvbmVzIHF1ZSByaWdlbiBlbCB1c28gZGVsIFByb2R1Y3RvIHF1ZSBpbmNsdXllIGVzdGEgY2FyYWN0ZXJcdTAwZWRzdGljYS4NCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV9mci5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2ZlYXR1cmVfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWYwNTFmNC4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotZmVhdHVyZU5hbWU9Rm9uY3Rpb24gcGxhdGVmb3JtZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi1kZXNjcmlwdGlvbj1Gb25jdGlvbiBwbGF0ZWZvcm1lIEVQRi4NCi11cGRhdGVTaXRlTmFtZT1NaXNlcyBcdTAwZTAgam91ciBkZSBsYSBmb25jdGlvbiBFUEYNCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9TCd1dGlsaXNhdGlvbiBkZSBjZXR0ZSBmb25jdGlvbiBkXHUwMGU5cGVuZCBkZXMgbVx1MDBlYW1lcyB0ZXJtZXMgZXQgY29uZGl0aW9ucyBxdWkgclx1MDBlOWdpc3NlbnQgbCd1dGlsaXNhdGlvbiBkdSBwcm9kdWl0IGluY2x1YW50IGNldHRlIGZvbmN0aW9uLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX2l0LnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NzZhNmRiLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1GdW56aW9uZSBwaWF0dGFmb3JtYSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi1kZXNjcmlwdGlvbj1GdW56aW9uZSBwaWF0dGFmb3JtYSBFUEYuDQotdXBkYXRlU2l0ZU5hbWU9QWdnaW9ybmFtZW50aSBmdW56aW9uZSBFUEYNCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuICBUdXR0aSBpIGRpcml0dGkgcmlzZXJ2YXRpLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9TCd1c28gZGkgcXVlc3RhIGZ1bnppb25lIFx1MDBlOCBzb2dnZXR0byBhZ2xpIHN0ZXNzaSB0ZXJtaW5pIGUgY29uZGl6aW9uaSBjaGUgcmVnb2xhbm8gbCd1c28gZGVsIHByb2RvdHRvIGNoZSBmb3JuaXNjZSB0YWxlIGZ1bnppb25lLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX2phLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YWYyYmE4Li4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1FUEYgUGxhdGZvcm0gRmVhdHVyZQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLWRlc2NyaXB0aW9uPUVQRiBcdTMwZDdcdTMwZTlcdTMwYzNcdTMwYzhcdTMwZDVcdTMwYTlcdTMwZmNcdTMwZTBcdTZhNWZcdTgwZmRcdTMwMDINCi11cGRhdGVTaXRlTmFtZT1FUEYgXHU2YTVmXHU4MGZkXHUzMDZlXHU2NmY0XHU2NWIwDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PVx1MzA1M1x1MzA2ZVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzBmY1x1MzA2ZVx1NGY3Zlx1NzUyOFx1MzA2Ylx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzBmY1x1MzA5Mlx1NTQyYlx1MzA4MFx1ODhmZFx1NTRjMVx1MzA2ZVx1NGY3Zlx1NzUyOFx1MzA2Ylx1NWJmZVx1MzA1N1x1MzA2Nlx1OTA2OVx1NzUyOFx1MzA1NVx1MzA4Y1x1MzA4Ylx1MzA4Mlx1MzA2ZVx1MzA2OFx1NTQwY1x1MzA1OFx1MzA1NFx1NGY3Zlx1NzUyOFx1Njc2MVx1NGVmNlx1MzA0Y1x1OTA2OVx1NzUyOFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OVx1MzAwMg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX2tvLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZDIyY2NjLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1FUEYgXHVkNTBjXHViN2FiXHVkM2ZjIFx1YWUzMFx1YjJhNQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLWRlc2NyaXB0aW9uPUVQRiBcdWQ1MGNcdWI3YWJcdWQzZmMgXHVhZTMwXHViMmE1Lg0KLXVwZGF0ZVNpdGVOYW1lPUVQRiBcdWFlMzBcdWIyYTUgXHVhYzMxXHVjMmUwXHVjMGFjXHVkNTZkDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9XHViY2Y4IFx1YWUzMFx1YjJhNVx1Yzc1OCBcdWMwYWNcdWM2YTlcdWM1ZDAgXHViMzAwXHVkNTc0XHVjMTFjXHViMjk0IFx1YmNmOCBcdWFlMzBcdWIyYTVcdWM3NDQgXHVkM2VjXHVkNTY4XHVkNTU4XHViMjk0IFx1YzgxY1x1ZDQ4OFx1Yzc1OCBcdWMwYWNcdWM2YTlcdWM1ZDAgXHVjODAxXHVjNmE5XHViNDE4XHViMjk0IFx1YjNkOVx1Yzc3Y1x1ZDU1YyBcdWM4NzBcdWFjNzRcdWM3NzQgXHVjODAxXHVjNmE5XHViNDI5XHViMmM4XHViMmU0Lg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NzlmYjM0Li4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1SZWN1cnNvIGRhIFBsYXRhZm9ybWEgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249UmVjdXJzbyBkYSBQbGF0YWZvcm1hIEVQRi4NCi11cGRhdGVTaXRlTmFtZT1BdHVhbGl6YVx1MDBlN1x1MDBmNWVzIGRlIFJlY3Vyc29zIEVQRg0KLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IGNvbnRyaWJ1aWRvcmVzIGRvIEVjbGlwc2UgZSB0ZXJjZWlyb3MgMjAwNCwgMjAwNi4gIFRvZG9zIG9zIERpcmVpdG9zIFJlc2VydmFkb3MuDQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwNCi1saWNlbnNlVGV4dD1PIHVzbyBkZXN0ZSByZWN1cnNvIGVzdFx1MDBlMSBzdWplaXRvIGFvcyBtZXNtb3MgdGVybW9zIGUgY29uZGlcdTAwZTdcdTAwZjVlcyBxdWUgY29udHJvbGFtIG8gdXNvIGRvIFByb2R1dG8gcXVlIGluY2x1aXUgZXN0ZSByZWN1cnNvLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX3poX0NOLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YmFlMTI2Li4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1FUEYgXHU1ZTczXHU1M2YwXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGIFx1NWU3M1x1NTNmMFx1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNlx1MzAwMg0KLXVwZGF0ZVNpdGVOYW1lPUVQRiBcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjZcdTY2ZjRcdTY1YjANCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwNCi1saWNlbnNlVGV4dD1cdTZiNjRcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjZcdTc2ODRcdTRmN2ZcdTc1MjhcdTRlMGVcdTUzMDVcdTU0MmJcdTZiNjRcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjZcdTc2ODRcdTRlYTdcdTU0YzFcdTc2ODRcdTRmN2ZcdTc1MjhcdTdiYTFcdTc0MDZcdTkwNzVcdTVmYWFcdTc2ZjhcdTU0MGNcdTc2ODRcdTY3NjFcdTZiM2VcdTU0OGNcdTY3NjFcdTRlZjZcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2ZlYXR1cmVfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQ0NGUyMC4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotZmVhdHVyZU5hbWU9RVBGIFx1NWU3M1x1NTNmMFx1NzI3OVx1NjAyNw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLWRlc2NyaXB0aW9uPUVQRiBcdTVlNzNcdTUzZjBcdTcyNzlcdTYwMjdcdTMwMDINCi11cGRhdGVTaXRlTmFtZT1FUEYgXHU3Mjc5XHU2MDI3XHU2NmY0XHU2NWIwDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PVx1NjcyY1x1NzI3OVx1NjAyN1x1NGU0Ylx1NzUyOFx1OTAxNFx1ODk4Zlx1N2JjNFx1N2I0OVx1NTQwY1x1NjViY1x1NTMwNVx1NTQyYlx1NjcyY1x1NzI3OVx1NjAyN1x1NGU0Ylx1MzAwY1x1NzUyMlx1NTRjMVx1MzAwZFx1NzY4NFx1NGY3Zlx1NzUyOFx1Njg5ZFx1NmIzZVx1MzAwMg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9saWNlbnNlLmh0bWwgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNWExMGNmLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPg0KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPg0KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPg0KLQ0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4NCi0NCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMNCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UNCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUg0KLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4NCi0gICANCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgDQotICAgDQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMA0KLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUw0KLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPg0KLSAgIA0KLTx1bD4NCi0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4NCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPg0KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMNCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4NCi0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+DQotPC91bD4gICANCi0gDQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQNCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQ0KLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4NCi0NCi08dWw+DQotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPg0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPg0KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+DQotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+DQotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4NCi08L3VsPg0KLQkJDQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUNCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3INCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuDQotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluDQotdGhhdCBkaXJlY3RvcnkuPC9wPg0KLQ0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFDQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+DQotDQotPHVsPg0KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+DQotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkNCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4NCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4NCi08L3VsPg0KLQ0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlDQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+DQotDQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+DQotDQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bw0KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LA0KLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPg0KLSAgIA0KLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIA0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2xpY2Vuc2VfZW4uaHRtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9saWNlbnNlX2VuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1YTEwY2YuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2xpY2Vuc2VfZW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+DQotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+DQotPHA+TWFyY2ggMTcsIDIwMDU8L3A+DQotDQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPg0KLQ0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUw0KLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EDQotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQ0KLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SDQotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EDQotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPg0KLSAgIA0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICANCi0gICANCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wDQotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTDQotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+DQotICAgDQotPHVsPg0KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPg0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+DQotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucw0KLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPg0KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4NCi08L3VsPiAgIA0KLSANCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZA0KLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlDQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPg0KLQ0KLTx1bD4NCi0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+DQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+DQotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4NCi0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4NCi0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPg0KLTwvdWw+DQotCQkNCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQ0KLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcg0KLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4NCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4NCi10aGF0IGRpcmVjdG9yeS48L3A+DQotDQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UNCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4NCi0NCi08dWw+DQotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4NCi0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQ0KLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPg0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPg0KLTwvdWw+DQotDQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UNCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4NCi0NCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4NCi0NCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvDQotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsDQotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+DQotICAgDQotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvbGljZW5zZV9mci5odG1sIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2xpY2Vuc2VfZnIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmYzNDQxNi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvbGljZW5zZV9mci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQotPHRpdGxlPkNvbnRyYXQgZCd1dGlsaXNhdGlvbiBkdSBsb2dpY2llbCBkJ0VjbGlwc2Uub3JnPC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHkgbGFuZz0iRlItRlIiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+DQotPGgyPkNvbnRyYXQgZCd1dGlsaXNhdGlvbiBkdSBsb2dpY2llbCBkZSBsYSBmb25kYXRpb24gRWNsaXBzZTwvaDI+DQotPHA+MTcgbWFycyAyMDA1PC9wPg0KLQ0KLTxoMz5VdGlsaXNhdGlvbiBkdSBjb250ZW51PC9oMz4NCi0NCi08cD5MQSBGT05EQVRJT04gRUNMSVBTRSBGT1VSTklUIERFUyBMT0dJQ0lFTFMsIERFIExBIERPQ1VNRU5UQVRJT04sIERFUyBJTkZPUk1BVElPTlMgRVQvT1UgRCdBVVRSRVMgRE9DVU1FTlRTIERFU1RJTkVTIEEgREVTIFBST0pFVFMgQSBTT1VSQ0UgT1VWRVJURSAoQ09MTEVDVElWRU1FTlQgJnF1b3Q7Q09OVEVOVSZxdW90OykuIEwnVVRJTElTQVRJT04gRFUgQ09OVEVOVSBFU1QgUkVHSSBQQVIgTEVTIFRFUk1FUyBFVCBDT05ESVRJT05TIERFIENFIENPTlRSQVQgRVQvT1UgTEVTIFRFUk1FUyBFVCBDT05ESVRJT05TIERFUyBDT05UUkFUUyBERSBMSUNFTkNFIE9VIERFUyBNT0RBTElURVMgSU5ESVFVRUVTIE9VIFJFRkVSRU5DRUVTIENJLURFU1NPVVMuIEVOIFVUSUxJU0FOVCBMRSBDT05URU5VLCBWT1VTIEFDQ0VQVEVaIFFVRSBWT1RSRSBVVElMSVNBVElPTiBEVSBDT05URU5VIFNPSVQgUkVHSUUgUEFSIENFIENPTlRSQVQgRVQvT1UgTEVTIFRFUk1FUyBFVCBDT05ESVRJT05TIERFIFRPVVQgQ09OVFJBVCBERSBMSUNFTkNFIEFQUExJQ0FCTEUgT1UgREUgVE9VVEUgTU9EQUxJVEUgSU5ESVFVRUUgT1UgUkVGRVJFTkNFRSBDSS1ERVNTT1VTLiBTSSBWT1VTIE4nQUNDRVBURVogUEFTIExFUyBURVJNRVMgRVQgQ09ORElUSU9OUyBERSBDRSBDT05UUkFUIEVUIExFUyBURVJNRVMgRVQgQ09ORElUSU9OUyBERSBUT1VUIENPTlRSQVQgREUgTElDRU5DRSBBUFBMSUNBQkxFIE9VIERFUyBNT0RBTElURVMgSU5ESVFVRUVTIE9VIFJFRkVSRU5DRUVTIENJLURFU1NPVVMsIE4nVVRJTElTRVogUEFTIExFIENPTlRFTlUuPC9wPg0KLSAgIA0KLTxoMz5MaWNlbmNlcyBhcHBsaWNhYmxlczwvaDM+ICAgDQotICAgDQotPHA+U2F1ZiBpbmRpY2F0aW9uIGNvbnRyYWlyZSwgdG91dCBjb250ZW51IG1pcyDDoCBkaXNwb3NpdGlvbiBwYXIgbGEgRm9uZGF0aW9uIEVjbGlwc2Ugdm91cyBlc3QgZm91cm5pIGNvbmZvcm3DqW1lbnQgYXV4IHRlcm1lcyBldCBjb25kaXRpb25zIGQnRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMA0KLSAgICgmcXVvdDtFUEwmcXVvdDspLiBVbmUgY29waWUgZGUgbCdFUEwgZXN0IGZvdXJuaWUgYXZlYyBjZSBjb250ZW51LCB2b3VzIHBvdXZleiDDqWdhbGVtZW50IGxhIGNvbnN1bHRlciDDoCBsJ2FkcmVzc2Ugc3VpdmFudGUgOiA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Lg0KLURhbnMgbGUgY2FkcmUgZGUgbCdFUEwsIGxlIHRlcm1lICZxdW90O1Byb2dyYW1tZSZxdW90OyBzaWduaWZpZSAiQ29udGVudSIuPC9wPg0KLQ0KLTxwPkxlIGNvbnRlbnUgaW5jbHV0LCBzYW5zIHMneSBsaW1pdGVyLCBsZSBjb2RlIHNvdXJjZSwgbGUgY29kZSBvYmpldCwgbGEgZG9jdW1lbnRhdGlvbiBldCBsZXMgYXV0cmVzIGZpY2hpZXJzIGZpZ3VyYW50IGRhbnMgbGUgcsOpZsOpcmVudGllbCAoJnF1b3Q7UsOpZsOpcmVudGllbCZxdW90OykgQ1ZTIGR1IHNpdGUgRWNsaXBzZS5vcmcgZXQgZGFucyBsZXMgbW9kdWxlcyBDVlMNCi0oJnF1b3Q7TW9kdWxlcyZxdW90OykgZXQgbWlzIMOgIGRpc3Bvc2l0aW9uIHNvdXMgZm9ybWUgZCdhcmNoaXZlcyB0w6lsw6ljaGFyZ2VhYmxlcyAoJnF1b3Q7VMOpbMOpY2hhcmdlbWVudHMmcXVvdDspLjwvcD4NCi0gICANCi08dWw+DQotCTxsaT5MZSBjb250ZW51IHBldXQgw6p0cmUgc3RydWN0dXLDqSBldCBtaXMgZW4gZm9ybWUgZGFucyBkZXMgbW9kdWxlcyBwb3VyIGZhY2lsaXRlciBsYSBsaXZyYWlzb24sIGxlIGTDqXZlbG9wcGVtZW50IGV0IGxhIG1pc2Ugw6Agbml2ZWF1IGR1IGNvbnRlbnUuIERlcyBtb2R1bGVzIGNsYXNzaXF1ZXMgcGV1dmVudCBpbmNsdXJlIGRlcyBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBkZXMgZnJhZ21lbnRzIGRlIHBsdWctaW4gKCZxdW90O0ZyYWdtZW50cyZxdW90OykgYWluc2kgcXVlIGRlcyBmb25jdGlvbnMgKCZxdW90O0ZvbmN0aW9ucyZxdW90OykuPC9saT4NCi0JPGxpPkNoYXF1ZSBwbHVnLWluIG91IGZyYWdtZW50IHBldXQgw6p0cmUgbWlzIGVuIGZvcm1lIGVuIHRhbnQgcXVlIHNvdXMtcsOpcGVydG9pcmUgb3UgSkFSIChBcmNoaXZlIEphdmEmdHJhZGU7KSBkYW5zIHVuIHLDqXBlcnRvaXJlIGTDqW5vbW3DqSAmcXVvdDtwbHVnLWlucyZxdW90Oy48L2xpPg0KLQk8bGk+VW5lIGZvbmN0aW9uIHJlZ3JvdXBlIHVuIG91IHBsdXNpZXVycyBwbHVnLWlucyBldC9vdSBkZXMgZnJhZ21lbnRzIGV0IGRlcyBkb2N1bWVudHMgYXNzb2Npw6lzLiBDaGFxdWUgZm9uY3Rpb24gcGV1dCDDqnRyZSBtaXNlIGVuIGZvcm1lIGVuIHRhbnQgcXVlIHNvdXMtcsOpcGVydG9pcmUgZGFucyB1biByw6lwZXJ0b2lyZSBkw6lub21tw6kgJnF1b3Q7Zm9uY3Rpb25zJnF1b3Q7LiBEYW5zIHVuZSBmb25jdGlvbiwgbGVzIGZpY2hpZXJzIGTDqW5vbW3DqXMgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgcGV1dmVudCBjb250ZW5pciB1bmUgbGlzdGUgZGVzIG5vbXMgZXQgbnVtw6lyb3MgZGUgdmVyc2lvbiBkZXMgcGx1Zy1pbnMNCi0gICAgICBldC9vdSBkZXMgZnJhZ21lbnRzIGFzc29jacOpcyDDoCBjZXR0ZSBmb25jdGlvbi48L2xpPg0KLQk8bGk+TGVzIGZvbmN0aW9ucyBwZXV2ZW50IMOpZ2FsZW1lbnQgaW5jbHVyZSBkJ2F1dHJlcyBmb25jdGlvbnMgKCZxdW90O0ZvbmN0aW9ucyBpbmNsdXNlcyZxdW90OykuIERhbnMgdW5lIGZvbmN0aW9uLCBsZXMgZmljaGllcnMgZMOpbm9tbcOpcyAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBwZXV2ZW50IGNvbnRlbmlyIHVuZSBsaXN0ZSBkZXMgbm9tcyBldCBudW3DqXJvcyBkZSB2ZXJzaW9uIGRlcyBmb25jdGlvbnMgaW5jbHVzZXMuPC9saT4NCi08L3VsPiAgIA0KLSANCi08cD5MZXMgdGVybWVzIGV0IGNvbmRpdGlvbnMgcsOpZ2lzc2FudCBsZXMgcGx1Zy1pbnMgZXQgbGVzIGZyYWdtZW50cyBkb2l2ZW50IGZpZ3VyZXIgZGFucyBsZXMgZmljaGllcnMgZMOpbm9tbcOpcyAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBIHByb3BvcyBkZSZxdW90OykuIExlcyB0ZXJtZXMgZXQgY29uZGl0aW9ucyByw6lnaXNzYW50IGxlcyBmb25jdGlvbnMgZXQNCi1sZXMgZm9uY3Rpb25zIGluY2x1c2VzIGRvaXZlbnQgZmlndXJlciBkYW5zIGxlcyBmaWNoaWVycyBkw6lub21tw6lzICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7TGljZW5jZXMgZGVzIGZvbmN0aW9ucyZxdW90OykuIExlcyBpbmZvcm1hdGlvbnMgcHJvZHVpdCAoQSBwcm9wb3MgZGUpIGV0IGxlcyBsaWNlbmNlcyBkZXMgZm9uY3Rpb25zIHBldXZlbnQgc2UgdHJvdXZlciBkYW5zIG4naW1wb3J0ZSBxdWVsIHLDqXBlcnRvaXJlIGRlIHTDqWzDqWNoYXJnZW1lbnQgb3UgZGUgbW9kdWxlDQoteSBjb21wcmlzLCBtYWlzIG5vbiBsaW1pdMOpIGF1eCBlbXBsYWNlbWVudHMgc3VpdmFudHMgOjwvcD4NCi0NCi08dWw+DQotCTxsaT5MZSByw6lwZXJ0b2lyZSBkZSBuaXZlYXUgc3Vww6lyaWV1ciAocmFjaW5lKTwvbGk+DQotCTxsaT5MZXMgcsOpcGVydG9pcmVzIGRlIHBsdWctaW5zIGV0IGRlIGZyYWdtZW50czwvbGk+DQotCTxsaT5MZXMgcGx1Zy1pbnMgZXQgbGVzIGZyYWdtZW50cyBpbnRlcm5lcyBtaXMgZW4gZm9ybWUgZW4gdGFudCBxdWUgSkFSIChhcmNoaXZlcyBKYXZhKTwvbGk+DQotCTxsaT5MZXMgc291cy1yw6lwZXJ0b2lyZXMgZHUgcsOpcGVydG9pcmUgZMOpbm9tbcOpICZxdW90O3NyYyZxdW90OyBkZSBjZXJ0YWlucyBwbHVnLWluczwvbGk+DQotCTxsaT5MZXMgcsOpcGVydG9pcmVzIGRlIGZvbmN0aW9uczwvbGk+DQotPC91bD4NCi0JCQ0KLTxwPlJlbWFycXVlIDogc2kgdW5lIGZvbmN0aW9uIGZvdXJuaWUgcGFyIGxhIEZvbmRhdGlvbiBFY2xpcHNlIGVzdCBpbnN0YWxsw6llIMOgIGwnYWlkZSBkdSBnZXN0aW9ubmFpcmUgZGUgbWlzZSDDoCBqb3VyIGQnRWNsaXBzZSwgdm91cyBkZXZleiBhY2NlcHRlciBsYSBsaWNlbmNlICgmcXVvdDtMaWNlbmNlIGRlIG1pc2Ugw6Agam91ciBkZSBsYSBmb25jdGlvbiZxdW90OykgbG9ycyBkdQ0KLXByb2Nlc3N1cyBkJ2luc3RhbGxhdGlvbi4gU2kgbGEgZm9uY3Rpb24gY29udGllbnQgZGVzIGZvbmN0aW9ucyBpbmNsdXNlcywgbGEgbGljZW5jZSBkZSBtaXNlIMOgIGpvdXIgZGUgbGEgZm9uY3Rpb24gZG9pdCB2b3VzIGZvdXJuaXIgbGVzIHRlcm1lcyBldCBjb25kaXRpb25zIHLDqWdpc3NhbnQgbGVzIGZvbmN0aW9ucyBpbmNsdXNlcyBvdSB2b3VzIGluZm9ybWVyIGRlIGwnZW5kcm9pdCBvw7kgaWxzIHNlIHRyb3V2ZW50LiBMZXMgbGljZW5jZXMgZGUgbWlzZSDDoCBqb3VyIGRlIGxhIGZvbmN0aW9uIHNlIHRyb3V2ZW50IGRhbnMgbGEgcHJvcHJpw6l0w6kgJnF1b3Q7bGljZW5jZSZxdW90OyBkZXMgZmljaGllcnMgZMOpbm9tbcOpcyAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZmlndXJhbnQgZGFucyB1bmUgZm9uY3Rpb24uDQotRGUgdGVsbGVzIGluZm9ybWF0aW9ucyBwcm9kdWl0IChBIHByb3BvcyBkZSksIGxpY2VuY2VzIGRlIGZvbmN0aW9ucyBldCBsaWNlbmNlcyBkZSBtaXNlcyDDoCBqb3VyIGRlIGxhIGZvbmN0aW9uIGNvbnRpZW5uZW50IGxlcyB0ZXJtZXMgZXQgY29uZGl0aW9ucyAob3UgbGVzIHLDqWbDqXJlbmNlcyBhdXggZGl0cyB0ZXJtZXMgZXQgY29uZGl0aW9ucykgcXVpIHLDqWdpc3NlbnQgdm90cmUgdXRpbGlzYXRpb24gZHUgY29udGVudSBhc3NvY2nDqSBkYW5zIGNlIHLDqXBlcnRvaXJlLjwvcD4NCi0NCi08cD5MRVMgSU5GT1JNQVRJT05TIFBST0RVSVQgKEEgUFJPUE9TIERFKSwgTEVTIExJQ0VOQ0VTIERFIEZPTkNUSU9OUyBFVCBMRVMgTElDRU5DRVMgREUgTUlTRVMgQSBKT1VSIERFIExBIEZPTkNUSU9OIFBFVVZFTlQgU0UgUkVGRVJFUiBBIEwnRVBMIE9VIEEgRCdBVVRSRVMgQ09OVFJBVFMgREUgTElDRU5DRSwgTU9EQUxJVEVTIE9VIFRFUk1FUyBFVCBDT05ESVRJT05TLiBDRVJUQUlOUyBERSBDRVMgQVVUUkVTIENPTlRSQVRTIERFIExJQ0VOQ0UgUEVVVkVOVCBJTkNMVVJFIChNQUlTIFNBTlMgUydZIExJTUlURVIpIDo8L3A+DQotDQotPHVsPg0KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChkaXNwb25pYmxlIMOgIGwnYWRyZXNzZSBzdWl2YW50ZSA6IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4NCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoZGlzcG9uaWJsZSDDoCBsJ2FkcmVzc2Ugc3VpdmFudGUgOiA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGRpc3BvbmlibGUgw6AgbCdhZHJlc3NlIHN1aXZhbnRlIDogPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+DQotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChkaXNwb25pYmxlIMOgIGwnYWRyZXNzZSBzdWl2YW50ZSA6IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JDQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGRpc3BvbmlibGUgw6AgbCdhZHJlc3NlIHN1aXZhbnRlIDogPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPg0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoZGlzcG9uaWJsZSDDoCBsJ2FkcmVzc2Ugc3VpdmFudGUgOiA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4NCi08L3VsPg0KLQ0KLTxwPklMIEVTVCBERSBWT1RSRSBSRVNQT05TQUJJTElURSBERSBMSVJFIEVUIEQnQUNDRVBURVIgTCdFTlNFTUJMRSBERSBDRVMgVEVSTUVTIEVUIENPTkRJVElPTlMgQVZBTlQgRCdVVElMSVNFUiBMRSBDT05URU5VLiBTaSBhdWN1bmUgaW5mb3JtYXRpb24gcHJvZHVpdCAoQSBwcm9wb3MgZGUpLCBsaWNlbmNlIGRlIGZvbmN0aW9uIG91IGxpY2VuY2UgZGUgbWlzZSDDoCBqb3VyIGRlIGxhIGZvbmN0aW9uIG4nZXN0IGZvdXJuaWUsDQotY29udGFjdGV6IGxhIEZvbmRhdGlvbiBFY2xpcHNlIHBvdXIgZMOpdGVybWluZXIgcXVlbHMgdGVybWVzIGV0IGNvbmRpdGlvbnMgcsOpZ2lzc2VudCBjZSBjb250ZW51IHByw6ljaXMuPC9wPg0KLQ0KLTxoMz5DcnlwdG9ncmFwaGllPC9oMz4NCi0NCi08cD5MZSBjb250ZW51IHBldXQgaW5jbHVyZSB1biBsb2dpY2llbCBkZSBjcnlwdGFnZS4gTGUgcGF5cyBkYW5zIGxlcXVlbCB2b3VzIHZvdXMgdHJvdXZleiBhY3R1ZWxsZW1lbnQgcGV1dCDDqnRyZSBzb3VtaXMgw6AgZGVzIHJlc3RyaWN0aW9ucyBkJ2ltcG9ydGF0aW9uLCBkZSBwb3NzZXNzaW9uLCBkJ3V0aWxpc2F0aW9uIGV0L291IGRlIHLDqWV4cG9ydGF0aW9uIHZlcnMgdW4gYXV0cmUgcGF5cyBkdSBsb2dpY2llbCBkZSBjcnlwdGFnZS4gQVZBTlQgZCd1dGlsaXNlciB1biBsb2dpY2llbCBkZSBjcnlwdGFnZSwgdsOpcmlmaWV6IHNpIGxhIGxvaSBuYXRpb25hbGUsIGxlcyByw6hnbGVzIGV0IGxlcyBwb2xpdGlxdWVzIGVuIHZpZ3VldXIsIHJlbGF0aXZlcyDDoCBsJ2ltcG9ydGF0aW9uLCBsYSBwb3NzZXNzaW9uIG91IGwndXRpbGlzYXRpb24gZXQgbGEgcsOpZXhwb3J0YXRpb24gZHUgbG9naWNpZWwgZGUgY3J5cHRhZ2UgbCdhdXRvcmlzZW50LjwvcD4NCi0gICANCi08c21hbGw+SmF2YSBhaW5zaSBxdWUgdG91dGVzIGxlcyBtYXJxdWVzIGluY2x1YW50IEphdmEgc29udCBkZXMgbWFycXVlcyBkZSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFdGF0cy1VbmlzLCBldC9vdSBkYW5zIGNlcnRhaW5zIGF1dHJlcyBwYXlzLjwvc21hbGw+IA0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2xpY2Vuc2VfamEuaHRtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9saWNlbnNlX2phLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlOWJkYTEuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2xpY2Vuc2VfamEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPg0KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPg0KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPg0KLQ0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4NCi0NCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMNCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UNCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUg0KLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4NCi0gICANCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgDQotICAgDQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMA0KLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUw0KLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPg0KLSAgIA0KLTx1bD4NCi0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4NCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPg0KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMNCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4NCi0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+DQotPC91bD4gICANCi0gDQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQNCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQ0KLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4NCi0NCi08dWw+DQotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPg0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPg0KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+DQotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+DQotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4NCi08L3VsPg0KLQkJDQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUNCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3INCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuDQotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluDQotdGhhdCBkaXJlY3RvcnkuPC9wPg0KLQ0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFDQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+DQotDQotPHVsPg0KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+DQotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkNCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4NCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4NCi08L3VsPg0KLQ0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlDQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+DQotDQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+DQotDQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bw0KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LA0KLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPg0KLSAgIA0KLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIA0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyLy5wcm9qZWN0IGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmM2YzMzhkLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FmODBlYS4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgZmVhdHVyZV9ydS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwNCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTI1YjZkZi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotZmVhdHVyZU5hbWU9RVBGIFBsYXRmb3JtIEZlYXR1cmUgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi1kZXNjcmlwdGlvbj1FUEYgUGxhdGZvcm0gRmVhdHVyZS4NCi11cGRhdGVTaXRlTmFtZT1FUEYgRmVhdHVyZSBVcGRhdGVzDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PVVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgc3ViamVjdCB0byB0aGUgc2FtZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB3aGljaCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgUHJvZHVjdCB3aGljaCBpbmNsdWRlZCB0aGlzIGZlYXR1cmUuDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyL2ZlYXR1cmUueG1sIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNjI3Y2ZkLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMi9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMi4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybSIKLSAgICAgIG9zPSJsaW51eCx3aW4zMiIKLSAgICAgIHdzPSJndGssd2luMzIiCi0gICAgICBhcmNoPSJ4ODYiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlVGV4dAotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjIiLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iY29tLmlibS5pY3UubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuNC40LnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQuY29yZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjEwMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5qb2JzLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjEwMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkuYXV0aC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMTAwLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb21tb25qLnNkby5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4xLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJlY29yZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMnhtbC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcy5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nZWYubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC5hcHBzZXJ2ZXIubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4xMDAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAudWkubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZmFjZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGV4dC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5mb3Jtcy5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8ubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudG9tY2F0Lm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSI0LjEuMTMwLnYyMDA2MDYyMjAwMjYiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zZWFyY2gubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gyLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMudWkubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLnVpLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnNvbGUubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4xMDAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvZmVhdHVyZV9ydS5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyL2ZlYXR1cmVfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjk0ZjEwYS4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvZmVhdHVyZV9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotZmVhdHVyZU5hbWU9XHUwNDFmXHUwNDNiXHUwNDMwXHUwNDQyXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLWRlc2NyaXB0aW9uPVx1MDQxZlx1MDQzYlx1MDQzMFx1MDQ0Mlx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMCBFUEYNCi11cGRhdGVTaXRlTmFtZT1cdTA0MWVcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgRVBGDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgXHUwNDEyXHUwNDQxXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0NDlcdTA0MzhcdTA0NDlcdTA0MzVcdTA0M2RcdTA0NGIuDQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwNCi1saWNlbnNlVGV4dD1cdTA0MTRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzY1x1MDQzZVx1MDQzNlx1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGNcdTA0NDFcdTA0NGYgXHUwNDNkXHUwNDMwIFx1MDQ0Mlx1MDQzNVx1MDQ0NSBcdTA0MzZcdTA0MzUgXHUwNDQzXHUwNDQxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDRmXHUwNDQ1LCBcdTA0NDdcdTA0NDJcdTA0M2UgXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDIsIFx1MDQzMiBcdTA0NDFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzIgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZVx1MDQzZCBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDIuDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyL2xpY2Vuc2UuaHRtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMi9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1YTEwY2YuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+DQotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+DQotPHA+TWFyY2ggMTcsIDIwMDU8L3A+DQotDQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPg0KLQ0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUw0KLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EDQotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQ0KLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SDQotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EDQotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPg0KLSAgIA0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICANCi0gICANCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wDQotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTDQotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+DQotICAgDQotPHVsPg0KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPg0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+DQotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucw0KLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPg0KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4NCi08L3VsPiAgIA0KLSANCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZA0KLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlDQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPg0KLQ0KLTx1bD4NCi0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+DQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+DQotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4NCi0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4NCi0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPg0KLTwvdWw+DQotCQkNCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQ0KLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcg0KLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4NCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4NCi10aGF0IGRpcmVjdG9yeS48L3A+DQotDQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UNCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4NCi0NCi08dWw+DQotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4NCi0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQ0KLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPg0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPg0KLTwvdWw+DQotDQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UNCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4NCi0NCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4NCi0NCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvDQotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsDQotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+DQotICAgDQotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvbGljZW5zZV9lbi5odG1sIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyL2xpY2Vuc2VfZW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTVhMTBjZi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvbGljZW5zZV9lbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4NCi08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4NCi08cD5NYXJjaCAxNywgMjAwNTwvcD4NCi0NCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+DQotDQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTDQotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQNCi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFDQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1INCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQNCi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+DQotICAgDQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIA0KLSAgIA0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjANCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Lg0KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+DQotDQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMNCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4NCi0gICANCi08dWw+DQotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+DQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4NCi0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zDQotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+DQotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPg0KLTwvdWw+ICAgDQotIA0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kDQotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUNCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+DQotDQotPHVsPg0KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4NCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4NCi0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPg0KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPg0KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+DQotPC91bD4NCi0JCQ0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlDQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yDQotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLg0KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbg0KLXRoYXQgZGlyZWN0b3J5LjwvcD4NCi0NCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQ0KLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPg0KLQ0KLTx1bD4NCi0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4NCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4NCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPg0KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JDQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+DQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+DQotPC91bD4NCi0NCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQ0KLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPg0KLQ0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPg0KLQ0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8NCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwNCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4NCi0gICANCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICANCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMi9saWNlbnNlX3J1Lmh0bWwgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvbGljZW5zZV9ydS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDEwYTE2Li4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMi9saWNlbnNlX3J1Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCi08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keSBsYW5nPSJSVS1SVSIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4NCi08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4NCi08cD5NYXJjaCAxNywgMjAwNTwvcD4NCi0NCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+DQotDQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTDQotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQNCi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFDQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1INCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQNCi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+DQotICAgDQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIA0KLSAgIA0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjANCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Lg0KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+DQotDQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMNCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4NCi0gICANCi08dWw+DQotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+DQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4NCi0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMNCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4NCi0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+DQotPC91bD4gICANCi0gDQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQNCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQ0KLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4NCi0NCi08dWw+DQotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPg0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPg0KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+DQotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+DQotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4NCi08L3VsPg0KLQkJDQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUNCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3INCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuDQotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluDQotdGhhdCBkaXJlY3RvcnkuPC9wPg0KLQ0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFDQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+DQotDQotPHVsPg0KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+DQotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkNCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4NCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4NCi08L3VsPg0KLQ0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlDQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+DQotDQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+DQotDQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bw0KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LA0KLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPg0KLSAgIA0KLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIA0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyYS8ucHJvamVjdCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5ZWEyZTIuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTdiMTJlNy4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmVfZGEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyYS9mZWF0dXJlLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDJhL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTI1YjZkZi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDJhL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZlYXR1cmVOYW1lPUVQRiBQbGF0Zm9ybSBGZWF0dXJlIChOTDEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGIFBsYXRmb3JtIEZlYXR1cmUuDQotdXBkYXRlU2l0ZU5hbWU9RVBGIEZlYXR1cmUgVXBkYXRlcw0KLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwNCi1saWNlbnNlVGV4dD1Vc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgdGVybXMgYW5kIGNvbmRpdGlvbnMgd2hpY2ggZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIFByb2R1Y3Qgd2hpY2ggaW5jbHVkZWQgdGhpcyBmZWF0dXJlLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMmEvZmVhdHVyZS54bWwgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDJhL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNTU4MmUxLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMmEvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtIgotICAgICAgb3M9ImxpbnV4LHdpbjMyIgotICAgICAgd3M9Imd0ayx3aW4zMiIKLSAgICAgIGFyY2g9Ing4NiIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2VUZXh0Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMiIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJjb20uaWJtLmljdS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYW50LmNvcmUubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5qb2JzLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkuYXV0aC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24ubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb21tb25qLnNkby5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQudWkubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJlY29yZS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbi5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcy5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ2VmLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlci5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLnVpLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZmFjZS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamZhY2UudGV4dC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NnaS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZXh0Lm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmZvcm1zLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmNoYW5nZS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8ubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAud2ViYXBwLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRvbWNhdC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zZWFyY2gubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoMi5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMudWkubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0udWkubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnNvbGUubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyYS9mZWF0dXJlX2RhLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDJhL2ZlYXR1cmVfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDQ3OTY1Ni4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDJhL2ZlYXR1cmVfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZlYXR1cmVOYW1lPUVQRiAtIHBsYXRmb3Jtc2Z1bmt0aW9uDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGIC0gcGxhdGZvcm1zZnVua3Rpb24uDQotdXBkYXRlU2l0ZU5hbWU9RVBGIC0gZnVua3Rpb25zb3BkYXRlcmluZ2VyDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9QnJ1Z2VuIGFmIGRlbm5lIGZ1bmt0aW9uIGVyIHVuZGVybGFndCBkZSBzYW1tZSB2aWxrXHUwMGU1ciwgc29tIHJlZ3VsZXJlciBicnVnZW4gYWYgZGV0IHByb2R1a3QsIGRlciBpbmRlaG9sZGVyIGRlbm5lIGZ1bmt0aW9uLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMmEvbGljZW5zZS5odG1sIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyYS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1YTEwY2YuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyYS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPg0KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPg0KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPg0KLQ0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4NCi0NCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMNCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UNCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUg0KLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4NCi0gICANCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgDQotICAgDQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMA0KLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUw0KLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPg0KLSAgIA0KLTx1bD4NCi0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4NCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPg0KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMNCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4NCi0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+DQotPC91bD4gICANCi0gDQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQNCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQ0KLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4NCi0NCi08dWw+DQotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPg0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPg0KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+DQotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+DQotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4NCi08L3VsPg0KLQkJDQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUNCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3INCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuDQotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluDQotdGhhdCBkaXJlY3RvcnkuPC9wPg0KLQ0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFDQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+DQotDQotPHVsPg0KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+DQotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkNCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4NCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4NCi08L3VsPg0KLQ0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlDQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+DQotDQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+DQotDQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bw0KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LA0KLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPg0KLSAgIA0KLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIA0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyYS9saWNlbnNlX2VuLmh0bWwgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDJhL2xpY2Vuc2VfZW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTVhMTBjZi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDJhL2xpY2Vuc2VfZW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+DQotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+DQotPHA+TWFyY2ggMTcsIDIwMDU8L3A+DQotDQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPg0KLQ0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUw0KLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EDQotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQ0KLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SDQotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EDQotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPg0KLSAgIA0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICANCi0gICANCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wDQotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTDQotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+DQotICAgDQotPHVsPg0KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPg0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+DQotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucw0KLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPg0KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4NCi08L3VsPiAgIA0KLSANCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZA0KLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlDQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPg0KLQ0KLTx1bD4NCi0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+DQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+DQotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4NCi0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4NCi0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPg0KLTwvdWw+DQotCQkNCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQ0KLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcg0KLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4NCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4NCi10aGF0IGRpcmVjdG9yeS48L3A+DQotDQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UNCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4NCi0NCi08dWw+DQotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4NCi0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQ0KLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPg0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPg0KLTwvdWw+DQotDQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UNCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4NCi0NCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4NCi0NCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvDQotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsDQotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+DQotICAgDQotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhNWJjYzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDVlMjhjNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwxLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmNzNiOTkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotc291cmNlLm5sMS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMS5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gbmwxLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBubC8NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU3OTdjZTMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIENvbXBvc2VyIEF1dGhvcmluZyBVSSAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OWU2NTJmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBCZW51dHplcnNjaG5pdHRzdGVsbGUgZlx1MDBmY3IgQXV0aG9yaW5nDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBDYXRlZ29yeQ0KLW1ldGhvZENhdGVnb3J5TmFtZT1NZXRob2RlDQotDQotIyBQZXJzcGVjdGl2ZQ0KLWF1dGhvcmluZ1BlcnNwZWN0aXZlTmFtZT1BdXRob3JpbmcNCi1icm93c2luZ1BlcnNwZWN0aXZlTmFtZT1Ccm93c2luZw0KLQ0KLSMgVmlld3MNCi1saWJyYXJ5Vmlld05hbWU9QmlibGlvdGhlaw0KLWNvbmZpZ3VyYXRpb25WaWV3TmFtZT1Lb25maWd1cmF0aW9uDQotY29udGVudFZpZXdOYW1lPUluaGFsdA0KLWNvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXdOYW1lPUtvbmZpZ3VyYXRpb25zZmVobGVycHJvdG9rb2xsDQotDQotIyBFZGl0b3JzDQotbWV0aG9kRWxlbWVudEVkaXRvck5hbWU9RWRpdG9yIGZcdTAwZmNyIE1ldGhvZGVuZWxlbWVudGUNCi1jb25maWd1cmF0aW9uRWRpdG9yTmFtZT1Lb25maWd1cmF0aW9uc2VkaXRvcg0KLXByb2Nlc3NFZGl0b3JOYW1lPVByb3plc3NlZGl0b3INCi1hY3Rpdml0eURpYWdyYW1FZGl0b3JOYW1lPUVkaXRvciBmXHUwMGZjciBBa3Rpdml0XHUwMGU0dHNkaWFncmFtbWUNCi1hY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JOYW1lPUVkaXRvciBmXHUwMGZjciBBa3Rpdml0XHUwMGU0dHNkZXRhaWxkaWFncmFtbWUNCi13b3JrUHJvZHVjdERlcGVkZW5jeURpYWdyYW1FZGl0b3JOYW1lPUVkaXRvciBmXHUwMGZjciBBcmJlaXRzZXJnZWJuaXNhYmhcdTAwZTRuZ2lna2VpdHNkaWFncmFtbWUNCi0NCi0jIENoZWF0IFNoZWV0cw0KLW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZT1TcGlja3pldHRlbCBmXHUwMGZjciBNZXRob2Rlbi1BdXRob3JpbmcNCi1DaGVhdHNoZWV0R2V0c3RhcnRlZENhdGVnb3J5VGV4dD1FcnN0ZSBTY2hyaXR0ZQ0KLUNoZWF0c2hlZXRSZXVzYWJsZUNvbnRlbnRDYXRlZ29yeVRleHQ9V2llZGVydmVyd2VuZGJhcmVuIE1ldGhvZGVuaW5oYWx0IGVyc3RlbGxlbg0KLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9TWV0aG9kZW5pbmhhbHQgc2NocmVpYmVuDQotQ2hlYXRzaGVldFByb2Nlc3Nlc0NhdGVnb3J5VGV4dD1NaXQgUHJvemVzc2VuIGFyYmVpdGVuDQotQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudD1JbSBNZXRob2RlbmluaGFsdCBuYXZpZ2llcmVuDQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249RWlnZW5lIE1ldGhvZGVua29uZmlndXJhdGlvbiBlcnN0ZWxsZW4NCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kUGx1Z2luPUVpZ2VuZXMgTWV0aG9kZW4tUGx1Zy1pbiBlcnN0ZWxsZW4NCi1DaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudD1OZXVlbiBNZXRob2RlbmluaGFsdCB3aWUgUm9sbGVuLCBBdWZnYWJlbiwgQXJiZWl0c2VyZ2Vibmlzc2Ugb2RlciBBbmxlaXR1bmdlbiBoaW56dWZcdTAwZmNnZW4NCi1DaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHM9Vm9yaGFuZGVuZSBNZXRob2RlbmVsZW1lbnRlIChSb2xsZW4sIEF1ZmdhYmVuLCBBcmJlaXRzZXJnZWJuaXNzZSBvZGVyIEFubGVpdHVuZ2VuKSBtaXQgQmVpdHJcdTAwZTRnZW4gYW5wYXNzZW4NCi1DaGVhdHNoZWV0UmVwbGFjZU1laHRvZEVsZW1lbnRzPVZvcmhhbmRlbmUgTWV0aG9kZW5lbGVtZW50ZSAoUm9sbGVuLCBBdWZnYWJlbiwgQXJiZWl0c2VyZ2Vibmlzc2Ugb2RlciBBbmxlaXR1bmdlbikgZXJzZXR6ZW4NCi1DaGVhdHNoZWV0QWRkTWV0aG9kUmVmT3JIeXBlcmxpbms9TWV0aG9kZW5yZWZlcmVueiBvZGVyIEh5cGVybGluayAoVVJMKSBoaW56dWZcdTAwZmNnZW4NCi1DaGVhdHNoZWV0QXBwbHlDYXBhYmlsaXR5UGF0dGVybj1Qcm96ZXNzbXVzdGVyIGFud2VuZGVuDQotQ2hlYXRzaGVldENyZWF0ZVByb2Nlc3M9UHJvemVzcyBlcnN0ZWxsZW4gKFByb3plc3NtdXN0ZXIgb2RlciBCZXJlaXRzdGVsbHVuZ3Nwcm96ZXNzKQ0KLQ0KLSMgQWN0aW9uIFNldA0KLWF1dGhvcmluZ0FjdGlvblNldD1BdXRob3JpbmcNCi1jaGVhdFNoZWV0c0FjdGlvblNldD1TcGlja3pldHRlbA0KLQ0KLSMgR2xvYmFsIEFjdGlvbnMNCi1uZXdMaWJyYXJ5QWN0aW9uPU1ldGhvZGVuYmliJmxpb3RoZWsNCi1uZXdMaWJyYXJ5QWN0aW9uVG9vbHRpcD1OZXVlIE1ldGhvZGVuYmlibGlvdGhlayBlcnN0ZWxsZW4NCi1uZXdQbHVnaW5BY3Rpb249TWV0aG9kZW4tJlBsdWctaW4NCi1uZXdQbHVnaW5BY3Rpb25Ub29sdGlwPU5ldWVzIE1ldGhvZGVuLVBsdWctaW4gZXJzdGVsbGVuDQotbmV3Q29uZmlnQWN0aW9uPU1ldGhvZGVuJmtvbmZpZ3VyYXRpb24NCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPU5ldWUgTWV0aG9kZW5rb25maWd1cmF0aW9uIGVyc3RlbGxlbg0KLW9wZW5MaWJyYXJ5QWN0aW9uPU1ldGhvZGVuYmliJmxpb3RoZWsNCi1vcGVuTGlicmFyeUFjdGlvblRvb2x0aXA9Vm9yaGFuZGVuZSBNZXRob2RlbmJpYmxpb3RoZWsgXHUwMGY2ZmZuZW4NCi1vcGVuQ29uZmlnQWN0aW9uPU1ldGhvZGVuJmtvbmZpZ3VyYXRpb24NCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1Wb3JoYW5kZW5lIE1ldGhvZGVua29uZmlndXJhdGlvbiBcdTAwZjZmZm5lbg0KLW9wZW5DaGVhdFNoZWV0cz1TcGlja3pldHRlbC4uLg0KLQ0KLSMgTGlicmFyeSBWaWV3IEFjdGlvbnMNCi1saW5rV2l0aEVkaXRvcj1NaXQgRWRpdG9yIHZlcmxpbmtlbg0KLWxpbmtXaXRoRWRpdG9yVG9vbHRpcD1NaXQgRWRpdG9yIHZlcmxpbmtlbg0KLXNob3dQcmVzZW50YXRpb25OYW1lcz1Qclx1MDBlNHNlbnRhdGlvbnNuYW1lbiBhbnplaWdlbg0KLXNob3dQcmVzZW50YXRpb25OYW1lc1Rvb2x0aXA9UHJcdTAwZTRzZW50YXRpb25zbmFtZW4gYW56ZWlnZW4NCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBBY3Rpb25zDQotcmVmcmVzaENvbmZpZz1Ba3R1YWxpc2llcmVuDQotcmVmcmVzaENvbmZpZ1Rvb2x0aXA9S29uZmlndXJhdGlvbiBha3R1YWxpc2llcmVuDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tZXRob2RBdXRob3JpbmdQYWdlPU1ldGhvZGVuLUF1dGhvcmluZw0KLXByb2Nlc3NFZGl0b3I9UHJvemVzc2VkaXRvcg0KLWxpYnJhcnlPcHRpb25zPUJpYmxpb3RoZWtzb3B0aW9uZW4NCi1kaWFncmFtPURpYWdyYW1tDQotc3RhcnR1cEFuZFNodXRkb3duPVN0YXJ0ZW4gdW5kIGJlZW5kZW4NCi1kZWJ1Zz1EZWJ1Z2dpbmcNCi0NCi0jIENvbW1hbmQgSGFuZGxlcg0KLXNlbGVjdEFsbD1BbGxlcyBhdXN3XHUwMGU0aGxlbg0KLQ0KLSMgUHJvcGVydGllcyBWaWV3DQotX1VJX1Byb2Nlc3NFZGl0b3JfbWVudT1Qcm96ZXNzDQotX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbT0mTmV1ZXIgdW50ZXJnZW9yZG5ldGVyIEVpbnRyYWcNCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZldWVyIGdsZWljaGdlb3JkbmV0ZXIgRWludHJhZw0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPUUmaWdlbnNjaGFmdGVuc2ljaHQgYW56ZWlnZW4NCi1fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW09QSZrdHVhbGlzaWVyZW4NCi1fVUlfUHJvcGVydGllc19HZW5lcmFsPUFsbGdlbWVpbg0KLV9VSV9Qcm9wZXJ0aWVzX0RvY3VtZW50YXRpb249RG9rdW1lbnRhdGlvbg0KLV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlPUFubGVpdHVuZw0KLV9VSV9Qcm9wZXJ0aWVzX1dvcmtfUm9sbHVwPUFyYmVpdHMtUm9sbHVwDQotX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXA9VGVhbS1Sb2xsdXANCi0jIyBUaGUgZm9sbG93aW5nIHZhbHVlIG9mIHN0cmluZyBzaG91bGQgYmUgIldvcmsgUHJvZHVjdCBSb2xsdXAiLiBCdXQNCi0jIyBkdWUgdG8gbGltaXRhdGlvbi9idWcgaW4gRWNsaXBzZSBXVFAsIGl0J3MgYmVlbiB0cnVuY2F0ZWQgdG8gDQotIyMgIldvcmsgUHJvZCBSb2xsdXAiLiBTbyBkdXJpbmcgdHJhbnNsYXRpb24sIHBsZWFzZSB0YWtlIHRoaXMgaW50byBjb25zaWRlcmF0aW9uLg0KLV9VSV9Qcm9wZXJ0aWVzX1dQX1JvbGx1cD1BcmJlaXRzZXJnLi1Sb2xsdXANCi1fVUlfUHJvcGVydGllc19Sb2xlcz1Sb2xsZW4NCi1fVUlfUHJvcGVydGllc19Xb3JrUHJvZHVjdHM9QXJiZWl0c2VyZ2Vibmlzc2UNCi1fVUlfUHJvcGVydGllc19TdGVwcz1TY2hyaXR0ZQ0KLV9VSV9Qcm9wZXJ0aWVzX1RlYW1zPVRlYW1zDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxMGM3NTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVVJIGRlIG1vbnRhamUgZGUgVUkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1cdTAwZTl0b2RvDQotDQotIyBQZXJzcGVjdGl2ZQ0KLWF1dGhvcmluZ1BlcnNwZWN0aXZlTmFtZT1BdXRvclx1MDBlZGENCi1icm93c2luZ1BlcnNwZWN0aXZlTmFtZT1FeGFtZW4NCi0NCi0jIFZpZXdzDQotbGlicmFyeVZpZXdOYW1lPUJpYmxpb3RlY2ENCi1jb25maWd1cmF0aW9uVmlld05hbWU9Q29uZmlndXJhY2lcdTAwZjNuDQotY29udGVudFZpZXdOYW1lPUNvbnRlbmlkbw0KLWNvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXdOYW1lPVJlZ2lzdHJvIGRlIGVycm9yZXMgZGUgY29uZmlndXJhY2lcdTAwZjNuDQotDQotIyBFZGl0b3JzDQotbWV0aG9kRWxlbWVudEVkaXRvck5hbWU9RWRpdG9yIGRlIGVsZW1lbnRvcyBkZSBtXHUwMGU5dG9kbw0KLWNvbmZpZ3VyYXRpb25FZGl0b3JOYW1lPUVkaXRvciBkZSBjb25maWd1cmFjaVx1MDBmM24NCi1wcm9jZXNzRWRpdG9yTmFtZT1FZGl0b3IgZGUgcHJvY2Vzb3MNCi1hY3Rpdml0eURpYWdyYW1FZGl0b3JOYW1lPUVkaXRvciBkZWwgZGlhZ3JhbWEgZGUgbGEgYWN0aXZpZGFkDQotYWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yTmFtZT1FZGl0b3IgZGVsIGRpYWdyYW1hIGRlIGRldGFsbGVzIGRlIGxhIGFjdGl2aWRhZA0KLXdvcmtQcm9kdWN0RGVwZWRlbmN5RGlhZ3JhbUVkaXRvck5hbWU9RWRpdG9yIGRlbCBkaWFncmFtYSBkZSBkZXBlbmRlbmNpYSBkZWwgcHJvZHVjdG8gZGUgdHJhYmFqbw0KLQ0KLSMgQ2hlYXQgU2hlZXRzDQotbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lPUhvamFzIGRlIG9yaWVudGFjaVx1MDBmM24gZGUgbGEgYXV0b3JcdTAwZWRhIGRlIG1cdTAwZTl0b2Rvcw0KLUNoZWF0c2hlZXRHZXRzdGFydGVkQ2F0ZWdvcnlUZXh0PUNcdTAwZjNtbyBlbXBlemFyDQotQ2hlYXRzaGVldFJldXNhYmxlQ29udGVudENhdGVnb3J5VGV4dD1DcmVhciBjb250ZW5pZG8gZGVsIG1cdTAwZTl0b2RvIHJldXRpbGl6YWJsZQ0KLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9RXNjcmliaXIgY29udGVuaWRvIGRlbCBtXHUwMGU5dG9kbw0KLUNoZWF0c2hlZXRQcm9jZXNzZXNDYXRlZ29yeVRleHQ9VHJhYmFqYXIgY29uIHByb2Nlc29zDQotQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudD1OYXZlZ2FyIHBvciBlbCBjb250ZW5pZG8gZGVsIG1cdTAwZTl0b2RvDQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249Q3JlYXIgdW5hIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbyBwcm9waWENCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kUGx1Z2luPUNyZWFyIHVuIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8gcHJvcGlvDQotQ2hlYXRzaGVldEFkZE1ldGhvZENvbnRlbnQ9QVx1MDBmMWFkaXIgY29udGVuaWRvIGRlbCBtXHUwMGU5dG9kbyBudWV2bywgY29tbyByb2xlcywgdGFyZWFzLCBwcm9kdWN0b3MgZGUgdHJhYmFqbyBvIGd1XHUwMGVkYXMNCi1DaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHM9UGVyc29uYWxpemFyIGxvcyBlbGVtZW50b3MgZGUgbVx1MDBlOXRvZG8gZXhpc3RlbnRlcyAoUm9sZXMsIFRhcmVhcywgUHJvZHVjdG9zIGRlIHRyYWJham8gbyBHdVx1MDBlZGEpIG1lZGlhbnRlIGxhIGNvbnRyaWJ1Y2lcdTAwZjNuDQotQ2hlYXRzaGVldFJlcGxhY2VNZWh0b2RFbGVtZW50cz1SZWVtcGxhemFyIGxvcyBlbGVtZW50b3MgZGUgbVx1MDBlOXRvZG8gZXhpc3RlbnRlcyAoUm9sZXMsIFRhcmVhcywgUHJvZHVjdG9zIGRlIHRyYWJham8gbyBHdVx1MDBlZGEpDQotQ2hlYXRzaGVldEFkZE1ldGhvZFJlZk9ySHlwZXJsaW5rPUFcdTAwZjFhZGlyIHVuYSByZWZlcmVuY2lhIG8gaGlwZXJlbmxhY2UgYWwgbVx1MDBlOXRvZG8gKFVSTCkNCi1DaGVhdHNoZWV0QXBwbHlDYXBhYmlsaXR5UGF0dGVybj1BcGxpY2FyIHVuIHBhdHJcdTAwZjNuIGRlIHBvc2liaWxpZGFkDQotQ2hlYXRzaGVldENyZWF0ZVByb2Nlc3M9Q3JlYXIgdW4gcHJvY2VzbyAoUGF0clx1MDBmM24gZGUgcG9zaWJpbGlkYWQgbyBQcm9jZXNvIGRlIGVudHJlZ2EpDQotDQotIyBBY3Rpb24gU2V0DQotYXV0aG9yaW5nQWN0aW9uU2V0PUF1dG9yXHUwMGVkYQ0KLWNoZWF0U2hlZXRzQWN0aW9uU2V0PUhvamFzIGRlIG9yaWVudGFjaVx1MDBmM24NCi0NCi0jIEdsb2JhbCBBY3Rpb25zDQotbmV3TGlicmFyeUFjdGlvbj0mQmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MNCi1uZXdMaWJyYXJ5QWN0aW9uVG9vbHRpcD1DcmVhciB1bmEgbnVldmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MNCi1uZXdQbHVnaW5BY3Rpb249JlBsdWctaW4gZGUgbVx1MDBlOXRvZG8NCi1uZXdQbHVnaW5BY3Rpb25Ub29sdGlwPUNyZWFyIHVuIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8gbnVldm8NCi1uZXdDb25maWdBY3Rpb249JkNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbw0KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9Q3JlYXIgdW5hIG51ZXZhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbw0KLW9wZW5MaWJyYXJ5QWN0aW9uPSZCaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcw0KLW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcD1BYnJpciB1bmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZXhpc3RlbnRlDQotb3BlbkNvbmZpZ0FjdGlvbj0mQ29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvDQotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9QWJyaXIgdW5hIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbyBleGlzdGVudGUNCi1vcGVuQ2hlYXRTaGVldHM9SG9qYXMgZGUgb3JpZW50YWNpXHUwMGYzbi4uLg0KLQ0KLSMgTGlicmFyeSBWaWV3IEFjdGlvbnMNCi1saW5rV2l0aEVkaXRvcj1FbmxhemFyIGNvbiBlbCBlZGl0b3INCi1saW5rV2l0aEVkaXRvclRvb2x0aXA9RW5sYXphciBjb24gZWwgZWRpdG9yDQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzPU1vc3RyYXIgbm9tYnJlcyBkZSBwcmVzZW50YWNpXHUwMGYzbg0KLXNob3dQcmVzZW50YXRpb25OYW1lc1Rvb2x0aXA9TW9zdHJhciBub21icmVzIGRlIHByZXNlbnRhY2lcdTAwZjNuDQotDQotIyBDb25maWd1cmF0aW9uIFZpZXcgQWN0aW9ucw0KLXJlZnJlc2hDb25maWc9UmVub3Zhcg0KLXJlZnJlc2hDb25maWdUb29sdGlwPVJlbm92YXIgbGEgY29uZmlndXJhY2lcdTAwZjNuDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tZXRob2RBdXRob3JpbmdQYWdlPUF1dG9yXHUwMGVkYSBkZSBtXHUwMGU5dG9kb3MNCi1wcm9jZXNzRWRpdG9yPUVkaXRvciBkZSBwcm9jZXNvcw0KLWxpYnJhcnlPcHRpb25zPU9wY2lvbmVzIGRlIGxhIGJpYmxpb3RlY2ENCi1kaWFncmFtPURpYWdyYW1hDQotc3RhcnR1cEFuZFNodXRkb3duPUluaWNpbyB5IGNvbmNsdXNpXHUwMGYzbg0KLWRlYnVnPURlcHVyYXINCi0NCi0jIENvbW1hbmQgSGFuZGxlcg0KLXNlbGVjdEFsbD1TZWxlY2Npb25hciB0b2RvDQotDQotIyBQcm9wZXJ0aWVzIFZpZXcNCi1fVUlfUHJvY2Vzc0VkaXRvcl9tZW51PVByb2Nlc28NCi1fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtPSZOdWV2byBoaWpvDQotX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtPU51JmV2byBpZ3VhbA0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPU1vc3RyYXIgcHJvcGllZGFkZXMgJlZpc3RhDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPVJlJm5vdmFyDQotX1VJX1Byb3BlcnRpZXNfR2VuZXJhbD1HZW5lcmFsDQotX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbj1Eb2N1bWVudGFjaVx1MDBmM24NCi1fVUlfUHJvcGVydGllc19HdWlkYW5jZT1HdVx1MDBlZGENCi1fVUlfUHJvcGVydGllc19Xb3JrX1JvbGx1cD1UcmFiYWphciBjb24gZWxlbWVudG9zIGNvbnRyYVx1MDBlZGRvcw0KLV9VSV9Qcm9wZXJ0aWVzX1RlYW1fUm9sbHVwPUVsZW1lbnRvcyBjb250cmFcdTAwZWRkb3MgZGUgRXF1aXBvDQotIyMgVGhlIGZvbGxvd2luZyB2YWx1ZSBvZiBzdHJpbmcgc2hvdWxkIGJlICJXb3JrIFByb2R1Y3QgUm9sbHVwIi4gQnV0DQotIyMgZHVlIHRvIGxpbWl0YXRpb24vYnVnIGluIEVjbGlwc2UgV1RQLCBpdCdzIGJlZW4gdHJ1bmNhdGVkIHRvIA0KLSMjICJXb3JrIFByb2QgUm9sbHVwIi4gU28gZHVyaW5nIHRyYW5zbGF0aW9uLCBwbGVhc2UgdGFrZSB0aGlzIGludG8gY29uc2lkZXJhdGlvbi4NCi1fVUlfUHJvcGVydGllc19XUF9Sb2xsdXA9RWxlbWVudG8gY29udHJhXHUwMGVkZG8gZGUgcHJvZHVjdG8gZGUgdHJhYmFqbw0KLV9VSV9Qcm9wZXJ0aWVzX1JvbGVzPVJvbGVzDQotX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzPVByb2R1Y3RvcyBkZSB0cmFiYWpvDQotX1VJX1Byb3BlcnRpZXNfU3RlcHM9UGFzb3MNCi1fVUlfUHJvcGVydGllc19UZWFtcz1FcXVpcG9zDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3MWNiNDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUludGVyZmFjZSB1dGlsaXNhdGV1ciBkJ2F1dG9yaXNhdGlvbiBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1cdTAwZTl0aG9kZQ0KLQ0KLSMgUGVyc3BlY3RpdmUNCi1hdXRob3JpbmdQZXJzcGVjdGl2ZU5hbWU9Q3JcdTAwZTlhdGlvbg0KLWJyb3dzaW5nUGVyc3BlY3RpdmVOYW1lPUV4cGxvcmF0aW9uDQotDQotIyBWaWV3cw0KLWxpYnJhcnlWaWV3TmFtZT1CaWJsaW90aFx1MDBlOHF1ZQ0KLWNvbmZpZ3VyYXRpb25WaWV3TmFtZT1Db25maWd1cmF0aW9uDQotY29udGVudFZpZXdOYW1lPUNvbnRlbnUNCi1jb25maWd1cmF0aW9uRXJyb3JMb2dWaWV3TmFtZT1Kb3VybmFsIGRlcyBlcnJldXJzIGRlIGNvbmZpZ3VyYXRpb24NCi0NCi0jIEVkaXRvcnMNCi1tZXRob2RFbGVtZW50RWRpdG9yTmFtZT1FZGl0ZXVyIGQnXHUwMGU5bFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlDQotY29uZmlndXJhdGlvbkVkaXRvck5hbWU9RWRpdGV1ciBkZSBjb25maWd1cmF0aW9uDQotcHJvY2Vzc0VkaXRvck5hbWU9RWRpdGV1ciBkZSBwcm9jZXNzdXMNCi1hY3Rpdml0eURpYWdyYW1FZGl0b3JOYW1lPUVkaXRldXIgZGUgZGlhZ3JhbW1lIGQnYWN0aXZpdFx1MDBlOQ0KLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvck5hbWU9RWRpdGV1ciBkZSBkaWFncmFtbWUgZGUgZFx1MDBlOXRhaWwgZCdhY3Rpdml0XHUwMGU5DQotd29ya1Byb2R1Y3REZXBlZGVuY3lEaWFncmFtRWRpdG9yTmFtZT1FZGl0ZXVyIGRlIGRpYWdyYW1tZSBkZSBkXHUwMGU5cGVuZGFuY2UgZGUgcHJvZHVpdA0KLQ0KLSMgQ2hlYXQgU2hlZXRzDQotbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lPUFpZGUtbVx1MDBlOW1vaXJlIGRlIGNyXHUwMGU5YXRpb24gZGUgbVx1MDBlOXRob2RlDQotQ2hlYXRzaGVldEdldHN0YXJ0ZWRDYXRlZ29yeVRleHQ9TWlzZSBlbiByb3V0ZQ0KLUNoZWF0c2hlZXRSZXVzYWJsZUNvbnRlbnRDYXRlZ29yeVRleHQ9Q3JcdTAwZTllciB1biBjb250ZW51IGRlIG1cdTAwZTl0aG9kZSByXHUwMGU5dXRpbGlzYWJsZQ0KLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9RWNyaXJlIGxlIGNvbnRlbnUgZGUgbGEgbVx1MDBlOXRob2RlDQotQ2hlYXRzaGVldFByb2Nlc3Nlc0NhdGVnb3J5VGV4dD1HXHUwMGU5cmVyIGxlcyBwcm9jZXNzdXMNCi1DaGVhdHNoZWV0TmF2aWdhdGVNZXRob2RDb250ZW50PU5hdmlndWVyIGRhbnMgbGUgY29udGVudSBkZSBsYSBtXHUwMGU5dGhvZGUNCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbj1Dclx1MDBlOWVyIHZvdHJlIHByb3ByZSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RQbHVnaW49Q3JcdTAwZTllciB2b3RyZSBwcm9wcmUgcGx1Zy1pbiBkZSBtXHUwMGU5dGhvZGUNCi1DaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudD1Bam91dGVyIGR1IG5vdXZlYXUgY29udGVudSBkZSBtXHUwMGU5dGhvZGUgdGVsIHF1ZSBkZXMgclx1MDBmNGxlcywgZGVzIHRcdTAwZTJjaGVzLCBkZXMgcHJvZHVpdHMgb3UgZGVzIGNvbnNlaWxzDQotQ2hlYXRzaGVldFRhaWxvck1ldGhvZEVsZW1lbnRzPVBlcnNvbm5hbGlzZXIgbGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSBtXHUwMGU5dGhvZGUgZXhpc3RhbnRzIChyXHUwMGY0bGVzLCB0XHUwMGUyY2hlcywgcHJvZHVpdHMgb3UgY29uc2VpbHMpIFx1MDBlMCBsJ2FpZGUgZGUgbGEgY29udHJpYnV0aW9uDQotQ2hlYXRzaGVldFJlcGxhY2VNZWh0b2RFbGVtZW50cz1SZW1wbGFjZXIgbGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSBtXHUwMGU5dGhvZGUgZXhpc3RhbnRzIChyXHUwMGY0bGVzLCB0XHUwMGUyY2hlcywgcHJvZHVpdHMgb3UgY29uc2VpbHMpDQotQ2hlYXRzaGVldEFkZE1ldGhvZFJlZk9ySHlwZXJsaW5rPUFqb3V0ZXIgdW5lIHJcdTAwZTlmXHUwMGU5cmVuY2UgZGUgbVx1MDBlOXRob2RlIG91IHVuIGxpZW4gaHlwZXJ0ZXh0ZSAoVVJMKQ0KLUNoZWF0c2hlZXRBcHBseUNhcGFiaWxpdHlQYXR0ZXJuPUFwcGxpcXVlciB1biBwYXR0ZXJuIGRlIGNhcGFjaXRcdTAwZTkNCi1DaGVhdHNoZWV0Q3JlYXRlUHJvY2Vzcz1Dclx1MDBlOWVyIHVuIHByb2Nlc3N1cyAocGF0dGVybiBkZSBjYXBhY2l0XHUwMGU5IG91IHByb2Nlc3N1cyBkZSBsaXZyYWlzb24pDQotDQotIyBBY3Rpb24gU2V0DQotYXV0aG9yaW5nQWN0aW9uU2V0PUNyXHUwMGU5YXRpb24NCi1jaGVhdFNoZWV0c0FjdGlvblNldD1BaWRlLW1cdTAwZTltb2lyZXMNCi0NCi0jIEdsb2JhbCBBY3Rpb25zDQotbmV3TGlicmFyeUFjdGlvbj0mQmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcw0KLW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwPUNyXHUwMGU5ZXIgdW5lIG5vdXZlbGxlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMNCi1uZXdQbHVnaW5BY3Rpb249JlBsdWctaW4gZGUgbVx1MDBlOXRob2RlDQotbmV3UGx1Z2luQWN0aW9uVG9vbHRpcD1Dclx1MDBlOWVyIHVuIG5vdXZlYXUgcGx1Zy1pbiBkZSBtXHUwMGU5dGhvZGUNCi1uZXdDb25maWdBY3Rpb249JkNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlDQotbmV3Q29uZmlnQWN0aW9uVG9vbHRpcD1Dclx1MDBlOWVyIHVuZSBub3V2ZWxsZSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLW9wZW5MaWJyYXJ5QWN0aW9uPSZCaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzDQotb3BlbkxpYnJhcnlBY3Rpb25Ub29sdGlwPU91dnJpciB1bmUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBleGlzdGFudGUNCi1vcGVuQ29uZmlnQWN0aW9uPSZDb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPU91dnJpciB1bmUgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUgZXhpc3RhbnRlDQotb3BlbkNoZWF0U2hlZXRzPUFpZGUtbVx1MDBlOW1vaXJlLi4uDQotDQotIyBMaWJyYXJ5IFZpZXcgQWN0aW9ucw0KLWxpbmtXaXRoRWRpdG9yPUxpZW4gYXZlYyBsJ1x1MDBlOWRpdGV1cg0KLWxpbmtXaXRoRWRpdG9yVG9vbHRpcD1MaWVuIGF2ZWMgbCdcdTAwZTlkaXRldXINCi1zaG93UHJlc2VudGF0aW9uTmFtZXM9QWZmaWNoZXIgbGVzIG5vbXMgZGUgcHJcdTAwZTlzZW50YXRpb24NCi1zaG93UHJlc2VudGF0aW9uTmFtZXNUb29sdGlwPUFmZmljaGVyIGxlcyBub21zIGRlIHByXHUwMGU5c2VudGF0aW9uDQotDQotIyBDb25maWd1cmF0aW9uIFZpZXcgQWN0aW9ucw0KLXJlZnJlc2hDb25maWc9QWN0dWFsaXNlcg0KLXJlZnJlc2hDb25maWdUb29sdGlwPUFjdHVhbGlzZXIgbGEgY29uZmlndXJhdGlvbg0KLQ0KLSMgUHJlZmVyZW5jZSBQYWdlDQotbWV0aG9kQXV0aG9yaW5nUGFnZT1Dclx1MDBlOWF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLXByb2Nlc3NFZGl0b3I9RWRpdGV1ciBkZSBwcm9jZXNzdXMNCi1saWJyYXJ5T3B0aW9ucz1PcHRpb25zIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlDQotZGlhZ3JhbT1EaWFncmFtbWUNCi1zdGFydHVwQW5kU2h1dGRvd249RFx1MDBlOW1hcnJhZ2UgZXQgYXJyXHUwMGVhdA0KLWRlYnVnPURcdTAwZTlib2d1ZXINCi0NCi0jIENvbW1hbmQgSGFuZGxlcg0KLXNlbGVjdEFsbD1TXHUwMGU5bGVjdGlvbm5lciB0b3V0DQotDQotIyBQcm9wZXJ0aWVzIFZpZXcNCi1fVUlfUHJvY2Vzc0VkaXRvcl9tZW51PVByb2Nlc3N1cw0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jk5vdXZlbCBlbmZhbnQNCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZvdXZlYXUgZnJcdTAwZThyZS9zb2V1cg0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPSZBZmZpY2hlciBsYSB2dWUgUHJvcHJpXHUwMGU5dFx1MDBlOXMNCi1fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW09QWN0JnVhbGlzZXINCi1fVUlfUHJvcGVydGllc19HZW5lcmFsPURpc3Bvc2l0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzDQotX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbj1Eb2N1bWVudGF0aW9uDQotX1VJX1Byb3BlcnRpZXNfR3VpZGFuY2U9Q29uc2VpbA0KLV9VSV9Qcm9wZXJ0aWVzX1dvcmtfUm9sbHVwPUN1bXVsIGRlIHRyYXZhaWwNCi1fVUlfUHJvcGVydGllc19UZWFtX1JvbGx1cD1DdW11bCBkZSBsJ1x1MDBlOXF1aXBlDQotIyMgVGhlIGZvbGxvd2luZyB2YWx1ZSBvZiBzdHJpbmcgc2hvdWxkIGJlICJXb3JrIFByb2R1Y3QgUm9sbHVwIi4gQnV0DQotIyMgZHVlIHRvIGxpbWl0YXRpb24vYnVnIGluIEVjbGlwc2UgV1RQLCBpdCdzIGJlZW4gdHJ1bmNhdGVkIHRvIA0KLSMjICJXb3JrIFByb2QgUm9sbHVwIi4gU28gZHVyaW5nIHRyYW5zbGF0aW9uLCBwbGVhc2UgdGFrZSB0aGlzIGludG8gY29uc2lkZXJhdGlvbi4NCi1fVUlfUHJvcGVydGllc19XUF9Sb2xsdXA9Q3VtdWwgZGUgcHJvZHVpdHMNCi1fVUlfUHJvcGVydGllc19Sb2xlcz1SXHUwMGY0bGVzDQotX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzPVByb2R1aXRzDQotX1VJX1Byb3BlcnRpZXNfU3RlcHM9RXRhcGVzDQotX1VJX1Byb3BlcnRpZXNfVGVhbXM9RXF1aXBlcw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMGQwMzM2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBVSSBBdXRob3JpbmcNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1ldG9kbw0KLQ0KLSMgUGVyc3BlY3RpdmUNCi1hdXRob3JpbmdQZXJzcGVjdGl2ZU5hbWU9QXV0aG9yaW5nDQotYnJvd3NpbmdQZXJzcGVjdGl2ZU5hbWU9RXNwbG9yYXppb25lDQotDQotIyBWaWV3cw0KLWxpYnJhcnlWaWV3TmFtZT1MaWJyZXJpYQ0KLWNvbmZpZ3VyYXRpb25WaWV3TmFtZT1Db25maWd1cmF6aW9uZQ0KLWNvbnRlbnRWaWV3TmFtZT1Db250ZW51dG8NCi1jb25maWd1cmF0aW9uRXJyb3JMb2dWaWV3TmFtZT1Mb2cgZXJyb3JpIGRpIGNvbmZpZ3VyYXppb25lDQotDQotIyBFZGl0b3JzDQotbWV0aG9kRWxlbWVudEVkaXRvck5hbWU9RWRpdG9yIGRpIGVsZW1lbnRpIGRlbCBtZXRvZG8NCi1jb25maWd1cmF0aW9uRWRpdG9yTmFtZT1FZGl0b3IgZGkgY29uZmlndXJhemlvbmkNCi1wcm9jZXNzRWRpdG9yTmFtZT1FZGl0b3IgZGkgcHJvY2Vzc2kNCi1hY3Rpdml0eURpYWdyYW1FZGl0b3JOYW1lPUVkaXRvciBkaSBkaWFncmFtbWkgYXR0aXZpdFx1MDBlMA0KLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvck5hbWU9RWRpdG9yIGRpIGRpYWdyYW1taSBkZXR0YWdsaSBhdHRpdml0XHUwMGUwDQotd29ya1Byb2R1Y3REZXBlZGVuY3lEaWFncmFtRWRpdG9yTmFtZT1FZGl0b3IgZGkgZGlhZ3JhbW1pIGRpcGVuZGVuemUgcHJvZG90dGkgZGkgbGF2b3JvDQotDQotIyBDaGVhdCBTaGVldHMNCi1tZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWU9Q2hlYXQgc2hlZXQgcmVsYXRpdmkgYWxsJ2F1dGhvcmluZyBkaSBtZXRvZGkNCi1DaGVhdHNoZWV0R2V0c3RhcnRlZENhdGVnb3J5VGV4dD1JbnRyb2R1emlvbmUNCi1DaGVhdHNoZWV0UmV1c2FibGVDb250ZW50Q2F0ZWdvcnlUZXh0PUNyZWF6aW9uZSBkaSBjb250ZW51dG8gZGVsIG1ldG9kbyByaXV0aWxpenphYmlsZQ0KLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9U2NyaXR0dXJhIGRlbCBjb250ZW51dG8gZGVsIG1ldG9kbw0KLUNoZWF0c2hlZXRQcm9jZXNzZXNDYXRlZ29yeVRleHQ9VXRpbGl6em8gZGVpIHByb2Nlc3NpDQotQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudD1Fc3Bsb3JhemlvbmUgZGVsIGNvbnRlbnV0byBkZWwgbWV0b2RvDQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249Q3JlYXppb25lIGRpIHVuYSBjb25maWd1cmF6aW9uZSBkaSBtZXRvZG8gcGVyc29uYWxpenphdGENCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kUGx1Z2luPUNyZWF6aW9uZSBkaSB1biBwbHVnLWluIGRpIG1ldG9kbyBwZXJzb25hbGl6emF0bw0KLUNoZWF0c2hlZXRBZGRNZXRob2RDb250ZW50PUFnZ2l1bnRhIGRpIG51b3ZvIGNvbnRlbnV0byBkZWwgbWV0b2RvIGNvbWUgcnVvbG8sIG9wZXJhemlvbmksIHByb2RvdHRpIGRpIGxhdm9ybyBvIGd1aWRhDQotQ2hlYXRzaGVldFRhaWxvck1ldGhvZEVsZW1lbnRzPVBlcnNvbmFsaXp6YXppb25lIGRpIGVsZW1lbnRpIGRlbCBtZXRvZG8gZXNpc3RlbnRpIChydW9saSwgb3BlcmF6aW9uaSwgcHJvZG90dGkgZGkgbGF2b3JvIG8gZ3VpZGEpIG1lZGlhbnRlIHVuIGNvbnRyaWJ1dG8NCi1DaGVhdHNoZWV0UmVwbGFjZU1laHRvZEVsZW1lbnRzPVNvc3RpdHV6aW9uZSBkaSBlbGVtZW50aSBkZWwgbWV0b2RvIGVzaXN0ZW50aSAocnVvbGksIG9wZXJhemlvbmksIHByb2RvdHRpIGRpIGxhdm9ybyBvIGd1aWRhKQ0KLUNoZWF0c2hlZXRBZGRNZXRob2RSZWZPckh5cGVybGluaz1BZ2dpdW50YSBkaSB1biBjb2xsZWdhbWVudG8gaXBlcnRlc3R1YWxlIChVUkwpIG8gZGkgdW4gcmlmZXJpbWVudG8gZGVsIG1ldG9kbw0KLUNoZWF0c2hlZXRBcHBseUNhcGFiaWxpdHlQYXR0ZXJuPUFwcGxpY2F6aW9uZSBkaSB1biBtb2RlbGxvIGRpIGNhcGFjaXRcdTAwZTANCi1DaGVhdHNoZWV0Q3JlYXRlUHJvY2Vzcz1DcmVhemlvbmUgZGkgdW4gcHJvY2Vzc28gKG1vZGVsbG8gZGkgY2FwYWNpdFx1MDBlMCBvIHByb2Nlc3NvIGRpIHByb2R1emlvbmUpDQotDQotIyBBY3Rpb24gU2V0DQotYXV0aG9yaW5nQWN0aW9uU2V0PUF1dGhvcmluZw0KLWNoZWF0U2hlZXRzQWN0aW9uU2V0PUNoZWF0IHNoZWV0DQotDQotIyBHbG9iYWwgQWN0aW9ucw0KLW5ld0xpYnJhcnlBY3Rpb249TGlicmVyaWEgZGVpICZtZXRvZGkNCi1uZXdMaWJyYXJ5QWN0aW9uVG9vbHRpcD1DcmVhIHVuYSBudW92YSBsaWJyZXJpYSBkZWkgbWV0b2RpDQotbmV3UGx1Z2luQWN0aW9uPSZQbHVnLWluIGRpIG1ldG9kbw0KLW5ld1BsdWdpbkFjdGlvblRvb2x0aXA9Q3JlYSB1biBudW92byBwbHVnLWluIGRpIG1ldG9kbw0KLW5ld0NvbmZpZ0FjdGlvbj0mQ29uZmlndXJhemlvbmUgbWV0b2RvDQotbmV3Q29uZmlnQWN0aW9uVG9vbHRpcD1DcmVhIHVuYSBudW92YSBjb25maWd1cmF6aW9uZSBkaSBtZXRvZG8NCi1vcGVuTGlicmFyeUFjdGlvbj1MaWJyZXJpYSBkZWkgJm1ldG9kaQ0KLW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcD1BcHJpIHVuYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGVzaXN0ZW50ZQ0KLW9wZW5Db25maWdBY3Rpb249JkNvbmZpZ3VyYXppb25lIG1ldG9kbw0KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPUFwcmkgdW5hIGNvbmZpZ3VyYXppb25lIGRpIG1ldG9kbyBlc2lzdGVudGUNCi1vcGVuQ2hlYXRTaGVldHM9Q2hlYXQgc2hlZXQuLi4NCi0NCi0jIExpYnJhcnkgVmlldyBBY3Rpb25zDQotbGlua1dpdGhFZGl0b3I9Q29sbGVnYSBhIGVkaXRvcg0KLWxpbmtXaXRoRWRpdG9yVG9vbHRpcD1Db2xsZWdhIGEgZWRpdG9yDQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzPU1vc3RyYSBub21pIHByZXNlbnRhemlvbmkNCi1zaG93UHJlc2VudGF0aW9uTmFtZXNUb29sdGlwPU1vc3RyYSBub21pIHByZXNlbnRhemlvbmkNCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBBY3Rpb25zDQotcmVmcmVzaENvbmZpZz1BZ2dpb3JuYQ0KLXJlZnJlc2hDb25maWdUb29sdGlwPUFnZ2lvcm5hcmUgbGEgY29uZmlndXJhemlvbmUNCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1ldGhvZEF1dGhvcmluZ1BhZ2U9QXV0aG9yaW5nIG1ldG9kaQ0KLXByb2Nlc3NFZGl0b3I9RWRpdG9yIGRpIHByb2Nlc3NpDQotbGlicmFyeU9wdGlvbnM9T3B6aW9uaSBsaWJyZXJpYQ0KLWRpYWdyYW09RGlhZ3JhbW1hDQotc3RhcnR1cEFuZFNodXRkb3duPUF2dmlvIGUgYXJyZXN0byBzaXN0ZW1hDQotZGVidWc9RGVidWcNCi0NCi0jIENvbW1hbmQgSGFuZGxlcg0KLXNlbGVjdEFsbD1TZWxlemlvbmEgdHV0dG8NCi0NCi0jIFByb3BlcnRpZXMgVmlldw0KLV9VSV9Qcm9jZXNzRWRpdG9yX21lbnU9UHJvY2Vzc28NCi1fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtPSZOdW92byBlbGVtZW50byBjaGlsZA0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1OJnVvdm8gZWxlbWVudG8gZGkgcGFyaSBsaXZlbGxvDQotX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW09TW9zdHJhICZ2aXN0YSBQcm9wcmlldFx1MDBlMA0KLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT1BJmdnaW9ybmENCi1fVUlfUHJvcGVydGllc19HZW5lcmFsPUdlbmVyYWxlDQotX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbj1Eb2N1bWVudGF6aW9uZQ0KLV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlPUd1aWRhDQotX1VJX1Byb3BlcnRpZXNfV29ya19Sb2xsdXA9Um9sbHVwIGxhdm9ybw0KLV9VSV9Qcm9wZXJ0aWVzX1RlYW1fUm9sbHVwPVJvbGx1cCB0ZWFtDQotIyMgVGhlIGZvbGxvd2luZyB2YWx1ZSBvZiBzdHJpbmcgc2hvdWxkIGJlICJXb3JrIFByb2R1Y3QgUm9sbHVwIi4gQnV0DQotIyMgZHVlIHRvIGxpbWl0YXRpb24vYnVnIGluIEVjbGlwc2UgV1RQLCBpdCdzIGJlZW4gdHJ1bmNhdGVkIHRvIA0KLSMjICJXb3JrIFByb2QgUm9sbHVwIi4gU28gZHVyaW5nIHRyYW5zbGF0aW9uLCBwbGVhc2UgdGFrZSB0aGlzIGludG8gY29uc2lkZXJhdGlvbi4NCi1fVUlfUHJvcGVydGllc19XUF9Sb2xsdXA9Um9sbHVwIHByb2RvdHRvIGRpIGxhdm9ybw0KLV9VSV9Qcm9wZXJ0aWVzX1JvbGVzPVJ1b2xpDQotX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzPVByb2RvdHRpIGRpIGxhdm9ybw0KLV9VSV9Qcm9wZXJ0aWVzX1N0ZXBzPVBhc3NpDQotX1VJX1Byb3BlcnRpZXNfVGVhbXM9VGVhbQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MTJiYjFmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgQXV0aG9yaW5nIFVJDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBDYXRlZ29yeQ0KLW1ldGhvZENhdGVnb3J5TmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzkNCi0NCi0jIFBlcnNwZWN0aXZlDQotYXV0aG9yaW5nUGVyc3BlY3RpdmVOYW1lPVx1MzBhYVx1MzBmY1x1MzBiNVx1MzBlYVx1MzBmM1x1MzBiMA0KLWJyb3dzaW5nUGVyc3BlY3RpdmVOYW1lPVx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiYQ0KLQ0KLSMgVmlld3MNCi1saWJyYXJ5Vmlld05hbWU9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjDQotY29uZmlndXJhdGlvblZpZXdOYW1lPVx1NjljYlx1NjIxMA0KLWNvbnRlbnRWaWV3TmFtZT1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQNCi1jb25maWd1cmF0aW9uRXJyb3JMb2dWaWV3TmFtZT1cdTY5Y2JcdTYyMTBcdTMwYThcdTMwZTlcdTMwZmNcdTMwZmJcdTMwZWRcdTMwYjANCi0NCi0jIEVkaXRvcnMNCi1tZXRob2RFbGVtZW50RWRpdG9yTmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTg5ODFcdTdkMjBcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmMNCi1jb25maWd1cmF0aW9uRWRpdG9yTmFtZT1cdTY5Y2JcdTYyMTBcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmMNCi1wcm9jZXNzRWRpdG9yTmFtZT1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmMNCi1hY3Rpdml0eURpYWdyYW1FZGl0b3JOYW1lPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1NTZmM1x1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmYw0KLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvck5hbWU9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU4YTczXHU3ZDMwXHU1NmYzXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjDQotd29ya1Byb2R1Y3REZXBlZGVuY3lEaWFncmFtRWRpdG9yTmFtZT1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTRmOWRcdTViNThcdTk1YTJcdTRmYzJcdTU2ZjNcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmMNCi0NCi0jIENoZWF0IFNoZWV0cw0KLW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwYWFcdTMwZmNcdTMwYjVcdTMwZWFcdTMwZjNcdTMwYjBcdTg2NGVcdTMwNmVcdTVkZmINCi1DaGVhdHNoZWV0R2V0c3RhcnRlZENhdGVnb3J5VGV4dD1cdTU5Y2JcdTMwODFcdTMwNmINCi1DaGVhdHNoZWV0UmV1c2FibGVDb250ZW50Q2F0ZWdvcnlUZXh0PVx1NTE4ZFx1NGY3Zlx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2YVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA2ZVx1NGY1Y1x1NjIxMA0KLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXHU0ZjVjXHU2MjEwDQotQ2hlYXRzaGVldFByb2Nlc3Nlc0NhdGVnb3J5VGV4dD1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmVcdTUxZTZcdTc0MDYNCi1DaGVhdHNoZWV0TmF2aWdhdGVNZXRob2RDb250ZW50PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA2ZVx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBjOA0KLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RDb25maWd1cmF0aW9uPVx1NzJlY1x1ODFlYVx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA2ZVx1NGY1Y1x1NjIxMA0KLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RQbHVnaW49XHU3MmVjXHU4MWVhXHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDZlXHU0ZjVjXHU2MjEwDQotQ2hlYXRzaGVldEFkZE1ldGhvZENvbnRlbnQ9XHUzMDBjXHUzMGVkXHUzMGZjXHUzMGViXHUzMDBkXHUzMDAxXHUzMDBjXHUzMGJmXHUzMGI5XHUzMGFmXHUzMDBkXHUzMDAxXHUzMDBjXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDBkXHUzMDAxXHUzMDdlXHUzMDVmXHUzMDZmXHUzMDBjXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDBkXHUzMDZhXHUzMDY5XHUzMDAxXHU2NWIwXHU4OThmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXHU4ZmZkXHU1MmEwDQotQ2hlYXRzaGVldFRhaWxvck1ldGhvZEVsZW1lbnRzPVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMCAoXHUzMDBjXHUzMGVkXHUzMGZjXHUzMGViXHUzMDBkXHUzMDAxXHUzMDBjXHUzMGJmXHUzMGI5XHUzMGFmXHUzMDBkXHUzMDAxXHUzMDBjXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDBkXHUzMDAxXHUzMDdlXHUzMDVmXHUzMDZmXHUzMDBjXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDBkKSBcdTMwNmVcdTMwMGNcdTViYzRcdTRlMGVcdTMwMGRcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwNWZcdThhYmZcdTY1NzQNCi1DaGVhdHNoZWV0UmVwbGFjZU1laHRvZEVsZW1lbnRzPVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMCAoXHUzMDBjXHUzMGVkXHUzMGZjXHUzMGViXHUzMDBkXHUzMDAxXHUzMDBjXHUzMGJmXHUzMGI5XHUzMGFmXHUzMDBkXHUzMDAxXHUzMDBjXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDBkXHUzMDAxXHUzMDdlXHUzMDVmXHUzMDZmXHUzMDBjXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDBkKSBcdTMwNmVcdTdmNmVcdTYzZGINCi1DaGVhdHNoZWV0QWRkTWV0aG9kUmVmT3JIeXBlcmxpbms9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU1M2MyXHU3MTY3XHUzMDdlXHUzMDVmXHUzMDZmXHUzMGNmXHUzMGE0XHUzMGQxXHUzMGZjXHUzMGVhXHUzMGYzXHUzMGFmIChVUkwpIFx1MzA2ZVx1OGZmZFx1NTJhMA0KLUNoZWF0c2hlZXRBcHBseUNhcGFiaWxpdHlQYXR0ZXJuPVx1MzBiMVx1MzBmY1x1MzBkMVx1MzBkM1x1MzBlYVx1MzBjNlx1MzBhM1x1MzBmY1x1MzBmYlx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmM1x1MzA2ZVx1OTA2OVx1NzUyOA0KLUNoZWF0c2hlZXRDcmVhdGVQcm9jZXNzPVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOSAoXHUzMGIxXHUzMGZjXHUzMGQxXHUzMGQzXHUzMGVhXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzXHUzMDdlXHUzMDVmXHUzMDZmXHUzMGM3XHUzMGVhXHUzMGQwXHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5KSBcdTMwNmVcdTRmNWNcdTYyMTANCi0NCi0jIEFjdGlvbiBTZXQNCi1hdXRob3JpbmdBY3Rpb25TZXQ9XHUzMGFhXHUzMGZjXHUzMGI1XHUzMGVhXHUzMGYzXHUzMGIwDQotY2hlYXRTaGVldHNBY3Rpb25TZXQ9XHU4NjRlXHUzMDZlXHU1ZGZiDQotDQotIyBHbG9iYWwgQWN0aW9ucw0KLW5ld0xpYnJhcnlBY3Rpb249XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjKCZMKQ0KLW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLW5ld1BsdWdpbkFjdGlvbj1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjMoJlApDQotbmV3UGx1Z2luQWN0aW9uVG9vbHRpcD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTY1YjBcdTg5OGZcdTRmNWNcdTYyMTANCi1uZXdDb25maWdBY3Rpb249XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwKCZDKQ0KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHUzMDZlXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwDQotb3BlbkxpYnJhcnlBY3Rpb249XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjKCZMKQ0KLW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcD1cdTY1ZTJcdTViNThcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGYNCi1vcGVuQ29uZmlnQWN0aW9uPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMCgmQykNCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1cdTY1ZTJcdTViNThcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTBcdTMwOTJcdTk1OGJcdTMwNGYNCi1vcGVuQ2hlYXRTaGVldHM9XHU4NjRlXHUzMDZlXHU1ZGZiLi4uDQotDQotIyBMaWJyYXJ5IFZpZXcgQWN0aW9ucw0KLWxpbmtXaXRoRWRpdG9yPVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzA2Nlx1MzBlYVx1MzBmM1x1MzBhZg0KLWxpbmtXaXRoRWRpdG9yVG9vbHRpcD1cdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwNjZcdTMwZWFcdTMwZjNcdTMwYWYNCi1zaG93UHJlc2VudGF0aW9uTmFtZXM9XHU4ODY4XHU3OTNhXHU1NDBkXHUzMDZlXHU4ODY4XHU3OTNhDQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcD1cdTg4NjhcdTc5M2FcdTU0MGRcdTMwNmVcdTg4NjhcdTc5M2ENCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBBY3Rpb25zDQotcmVmcmVzaENvbmZpZz1cdTY2ZjRcdTY1YjANCi1yZWZyZXNoQ29uZmlnVG9vbHRpcD1cdTY5Y2JcdTYyMTBcdTMwNmVcdTY2ZjRcdTY1YjANCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1ldGhvZEF1dGhvcmluZ1BhZ2U9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGFhXHUzMGZjXHUzMGI1XHUzMGVhXHUzMGYzXHUzMGIwDQotcHJvY2Vzc0VkaXRvcj1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmMNCi1saWJyYXJ5T3B0aW9ucz1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwZmJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjMNCi1kaWFncmFtPVx1MzBjMFx1MzBhNFx1MzBhMlx1MzBiMFx1MzBlOVx1MzBlMA0KLXN0YXJ0dXBBbmRTaHV0ZG93bj1cdTU5Y2JcdTUyZDVcdTMwNjhcdTMwYjdcdTMwZTNcdTMwYzNcdTMwYzhcdTMwYzBcdTMwYTZcdTMwZjMNCi1kZWJ1Zz1cdTMwYzdcdTMwZDBcdTMwYzNcdTMwYjANCi0NCi0jIENvbW1hbmQgSGFuZGxlcg0KLXNlbGVjdEFsbD1cdTMwNTlcdTMwNzlcdTMwNjZcdTkwNzhcdTYyOWUNCi0NCi0jIFByb3BlcnRpZXMgVmlldw0KLV9VSV9Qcm9jZXNzRWRpdG9yX21lbnU9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5DQotX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbT1cdTY1YjBcdTg5OGZcdTMwNmVcdTViNTAoJk4pDQotX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtPVx1NjViMFx1ODk4Zlx1MzA2ZVx1NTE0NFx1NWYxZigmRSkNCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT1cdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwZDNcdTMwZTVcdTMwZmNcdTMwNmVcdTg4NjhcdTc5M2EoJlYpDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPVx1NjZmNFx1NjViMCgmRikNCi1fVUlfUHJvcGVydGllc19HZW5lcmFsPVx1NGUwMFx1ODIyYw0KLV9VSV9Qcm9wZXJ0aWVzX0RvY3VtZW50YXRpb249XHU2NTg3XHU2NmY4DQotX1VJX1Byb3BlcnRpZXNfR3VpZGFuY2U9XHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5DQotX1VJX1Byb3BlcnRpZXNfV29ya19Sb2xsdXA9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMGEyXHUzMGMzXHUzMGQ3DQotX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXA9XHUzMGMxXHUzMGZjXHUzMGUwXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMGEyXHUzMGMzXHUzMGQ3DQotIyMgVGhlIGZvbGxvd2luZyB2YWx1ZSBvZiBzdHJpbmcgc2hvdWxkIGJlICJXb3JrIFByb2R1Y3QgUm9sbHVwIi4gQnV0DQotIyMgZHVlIHRvIGxpbWl0YXRpb24vYnVnIGluIEVjbGlwc2UgV1RQLCBpdCdzIGJlZW4gdHJ1bmNhdGVkIHRvIA0KLSMjICJXb3JrIFByb2QgUm9sbHVwIi4gU28gZHVyaW5nIHRyYW5zbGF0aW9uLCBwbGVhc2UgdGFrZSB0aGlzIGludG8gY29uc2lkZXJhdGlvbi4NCi1fVUlfUHJvcGVydGllc19XUF9Sb2xsdXA9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMGEyXHUzMGMzXHUzMGQ3DQotX1VJX1Byb3BlcnRpZXNfUm9sZXM9XHUzMGVkXHUzMGZjXHUzMGViDQotX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLV9VSV9Qcm9wZXJ0aWVzX1N0ZXBzPVx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkNw0KLV9VSV9Qcm9wZXJ0aWVzX1RlYW1zPVx1MzBjMVx1MzBmY1x1MzBlMA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTEwN2Y1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHVjNzkxXHVjMTMxIFVJDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBDYXRlZ29yeQ0KLW1ldGhvZENhdGVnb3J5TmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMNCi0NCi0jIFBlcnNwZWN0aXZlDQotYXV0aG9yaW5nUGVyc3BlY3RpdmVOYW1lPVx1Yzc5MVx1YzEzMQ0KLWJyb3dzaW5nUGVyc3BlY3RpdmVOYW1lPVx1Y2MzZVx1YzU0NFx1YmNmNFx1YWUzMA0KLQ0KLSMgVmlld3MNCi1saWJyYXJ5Vmlld05hbWU9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjDQotY29uZmlndXJhdGlvblZpZXdOYW1lPVx1YWQ2Y1x1YzEzMQ0KLWNvbnRlbnRWaWV3TmFtZT1cdWNlZThcdWQxNTBcdWNlMjANCi1jb25maWd1cmF0aW9uRXJyb3JMb2dWaWV3TmFtZT1cdWFkNmNcdWMxMzEgXHVjNjI0XHViOTU4IFx1Yjg1Y1x1YWRmOA0KLQ0KLSMgRWRpdG9ycw0KLW1ldGhvZEVsZW1lbnRFZGl0b3JOYW1lPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWM2OTRcdWMxOGMgXHVkM2I4XHVjOWQxXHVhZTMwDQotY29uZmlndXJhdGlvbkVkaXRvck5hbWU9XHVhZDZjXHVjMTMxIFx1ZDNiOFx1YzlkMVx1YWUzMA0KLXByb2Nlc3NFZGl0b3JOYW1lPVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWQzYjhcdWM5ZDFcdWFlMzANCi1hY3Rpdml0eURpYWdyYW1FZGl0b3JOYW1lPVx1ZDY1Y1x1YjNkOSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHVkM2I4XHVjOWQxXHVhZTMwDQotYWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yTmFtZT1cdWQ2NWNcdWIzZDkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWQzYjhcdWM5ZDFcdWFlMzANCi13b3JrUHJvZHVjdERlcGVkZW5jeURpYWdyYW1FZGl0b3JOYW1lPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjODg1XHVjMThkXHVjMTMxIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWQzYjhcdWM5ZDFcdWFlMzANCi0NCi0jIENoZWF0IFNoZWV0cw0KLW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNzkxXHVjMTMxIFx1Y2U1OFx1ZDJiOCBcdWMyZGNcdWQyYjgNCi1DaGVhdHNoZWV0R2V0c3RhcnRlZENhdGVnb3J5VGV4dD1cdWMyZGNcdWM3OTFcdWQ1NThcdWFlMzANCi1DaGVhdHNoZWV0UmV1c2FibGVDb250ZW50Q2F0ZWdvcnlUZXh0PVx1YzdhY1x1YzBhY1x1YzZhOVx1YWMwMFx1YjJhNSBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVjZWU4XHVkMTUwXHVjZTIwIFx1Yzc5MVx1YzEzMQ0KLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWM0ZjBcdWFlMzANCi1DaGVhdHNoZWV0UHJvY2Vzc2VzQ2F0ZWdvcnlUZXh0PVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWM3OTFcdWM1YzUNCi1DaGVhdHNoZWV0TmF2aWdhdGVNZXRob2RDb250ZW50PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWNlZThcdWQxNTBcdWNlMjAgXHVkMGQwXHVjMGM5DQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249XHVhY2UwXHVjNzIwXHVkNTVjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzEgXHVjNzkxXHVjMTMxDQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZFBsdWdpbj1cdWFjZTBcdWM3MjBcdWQ1NWMgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWM3OTFcdWMxMzENCi1DaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudD1cdWM1ZWRcdWQ1NjAsIFx1ZDBjMFx1YzJhNFx1ZDA2YywgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWI2MTBcdWIyOTQgXHVjNTQ4XHViMGI0XHVjNjQwIFx1YWMxOVx1Yzc0MCBcdWMwYzhcdWI4NWNcdWM2YjQgXHViYTU0XHVjMThjXHViNGRjIFx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWNkOTRcdWFjMDANCi1DaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHM9XHVjZWU4XHVkMmI4XHViOWFjXHViZGYwXHVjMTU4XHVjNzQ0IFx1YzBhY1x1YzZhOVx1ZDU1OFx1YzVlYyBcdWFlMzBcdWM4NzQgXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4YyhcdWM1ZWRcdWQ1NjAsIFx1ZDBjMFx1YzJhNFx1ZDA2YywgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWI2MTBcdWIyOTQgXHVjNTQ4XHViMGI0KSBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODcwXHVjODE1DQotQ2hlYXRzaGVldFJlcGxhY2VNZWh0b2RFbGVtZW50cz1cdWFlMzBcdWM4NzQgXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4YyhcdWM1ZWRcdWQ1NjAsIFx1ZDBjMFx1YzJhNFx1ZDA2YywgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWI2MTBcdWIyOTQgXHVjNTQ4XHViMGI0KSBcdWJjMTRcdWFmYjhcdWFlMzANCi1DaGVhdHNoZWV0QWRkTWV0aG9kUmVmT3JIeXBlcmxpbms9XHViYTU0XHVjMThjXHViNGRjIFx1Y2MzOFx1Yzg3MCBcdWI2MTBcdWIyOTQgXHVkNTU4XHVjNzc0XHVkMzdjXHViOWMxXHVkMDZjKFVSTCkgXHVjZDk0XHVhYzAwDQotQ2hlYXRzaGVldEFwcGx5Q2FwYWJpbGl0eVBhdHRlcm49XHVhZTMwXHViMmE1IFx1ZDMyOFx1ZDEzNCBcdWM4MDFcdWM2YTkNCi1DaGVhdHNoZWV0Q3JlYXRlUHJvY2Vzcz1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQoXHVhZTMwXHViMmE1IFx1ZDMyOFx1ZDEzNCBcdWI2MTBcdWIyOTQgXHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCkgXHVjNzkxXHVjMTMxDQotDQotIyBBY3Rpb24gU2V0DQotYXV0aG9yaW5nQWN0aW9uU2V0PVx1Yzc5MVx1YzEzMQ0KLWNoZWF0U2hlZXRzQWN0aW9uU2V0PVx1Y2U1OFx1ZDJiOCBcdWMyZGNcdWQyYjgNCi0NCi0jIEdsb2JhbCBBY3Rpb25zDQotbmV3TGlicmFyeUFjdGlvbj1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjKCZMKQ0KLW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwPVx1YzBjOCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1Yzc5MVx1YzEzMQ0KLW5ld1BsdWdpbkFjdGlvbj1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4KCZQKQ0KLW5ld1BsdWdpbkFjdGlvblRvb2x0aXA9XHVjMGM4IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzggXHVjNzkxXHVjMTMxDQotbmV3Q29uZmlnQWN0aW9uPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzEoJkMpDQotbmV3Q29uZmlnQWN0aW9uVG9vbHRpcD1cdWMwYzggXHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMSBcdWM3OTFcdWMxMzENCi1vcGVuTGlicmFyeUFjdGlvbj1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjKCZMKQ0KLW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcD1cdWFlMzBcdWM4NzQgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWM1ZjRcdWFlMzANCi1vcGVuQ29uZmlnQWN0aW9uPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzEoJkMpDQotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9XHVhZTMwXHVjODc0IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzEgXHVjNWY0XHVhZTMwDQotb3BlbkNoZWF0U2hlZXRzPVx1Y2U1OFx1ZDJiOCBcdWMyZGNcdWQyYjguLi4NCi0NCi0jIExpYnJhcnkgVmlldyBBY3Rpb25zDQotbGlua1dpdGhFZGl0b3I9XHVkM2I4XHVjOWQxXHVhZTMwXHVjNjQwIFx1YjljMVx1ZDA2Yw0KLWxpbmtXaXRoRWRpdG9yVG9vbHRpcD1cdWQzYjhcdWM5ZDFcdWFlMzBcdWM2NDAgXHViOWMxXHVkMDZjDQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzPVx1ZDQ1Y1x1YzJkYyBcdWM3NzRcdWI5ODRcdWM3NTggXHVkNDVjXHVjMmRjDQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcD1cdWQ0NWNcdWMyZGMgXHVjNzc0XHViOTg0XHVjNzU4IFx1ZDQ1Y1x1YzJkYw0KLQ0KLSMgQ29uZmlndXJhdGlvbiBWaWV3IEFjdGlvbnMNCi1yZWZyZXNoQ29uZmlnPVx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWFlMzANCi1yZWZyZXNoQ29uZmlnVG9vbHRpcD1cdWMwYzhcdWI4NWMgXHVhY2UwXHVjZTU4XHVhZTMwIFx1YWQ2Y1x1YzEzMQ0KLQ0KLSMgUHJlZmVyZW5jZSBQYWdlDQotbWV0aG9kQXV0aG9yaW5nUGFnZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNzkxXHVjMTMxDQotcHJvY2Vzc0VkaXRvcj1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVkM2I4XHVjOWQxXHVhZTMwDQotbGlicmFyeU9wdGlvbnM9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YzYzNVx1YzE1OA0KLWRpYWdyYW09XHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4DQotc3RhcnR1cEFuZFNodXRkb3duPVx1YzJkY1x1Yzc5MSBcdWJjMGYgXHVjMmRjXHVjMmE0XHVkMTVjIFx1Yzg4NVx1YjhjYw0KLWRlYnVnPVx1YjUxNFx1YmM4NFx1YWRmOA0KLQ0KLSMgQ29tbWFuZCBIYW5kbGVyDQotc2VsZWN0QWxsPVx1YmFhOFx1YjQ1MCBcdWMxMjBcdWQwZGQNCi0NCi0jIFByb3BlcnRpZXMgVmlldw0KLV9VSV9Qcm9jZXNzRWRpdG9yX21lbnU9XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbT1cdWMwYzggXHVkNTU4XHVjNzA0KCZOKQ0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1cdWMwYzggXHViM2Q5XHVjNzA0KCZFKQ0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPVx1ZDJiOVx1YzEzMSBcdWJjZjRcdWFlMzAgXHVkNDVjXHVjMmRjKCZWKQ0KLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT1cdWMwYzhcdWI4NWMgXHVhY2UwXHVjZTU4XHVhZTMwKCZGKQ0KLV9VSV9Qcm9wZXJ0aWVzX0dlbmVyYWw9XHVjNzdjXHViYzE4DQotX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbj1cdWJiMzhcdWMxMWMNCi1fVUlfUHJvcGVydGllc19HdWlkYW5jZT1cdWM1NDhcdWIwYjQNCi1fVUlfUHJvcGVydGllc19Xb3JrX1JvbGx1cD1cdWM3OTFcdWM1YzUgXHViODY0XHVjNWM1DQotX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXA9XHVkMzAwIFx1Yjg2NFx1YzVjNQ0KLSMjIFRoZSBmb2xsb3dpbmcgdmFsdWUgb2Ygc3RyaW5nIHNob3VsZCBiZSAiV29yayBQcm9kdWN0IFJvbGx1cCIuIEJ1dA0KLSMjIGR1ZSB0byBsaW1pdGF0aW9uL2J1ZyBpbiBFY2xpcHNlIFdUUCwgaXQncyBiZWVuIHRydW5jYXRlZCB0byANCi0jIyAiV29yayBQcm9kIFJvbGx1cCIuIFNvIGR1cmluZyB0cmFuc2xhdGlvbiwgcGxlYXNlIHRha2UgdGhpcyBpbnRvIGNvbnNpZGVyYXRpb24uDQotX1VJX1Byb3BlcnRpZXNfV1BfUm9sbHVwPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHViODY0XHVjNWM1DQotX1VJX1Byb3BlcnRpZXNfUm9sZXM9XHVjNWVkXHVkNTYwDQotX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi1fVUlfUHJvcGVydGllc19TdGVwcz1cdWIyZThcdWFjYzQNCi1fVUlfUHJvcGVydGllc19UZWFtcz1cdWQzMDANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMThlYTgwZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9VUkgZGUgQXV0b3JpYSBkbyBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1cdTAwZTl0b2RvDQotDQotIyBQZXJzcGVjdGl2ZQ0KLWF1dGhvcmluZ1BlcnNwZWN0aXZlTmFtZT1BdXRvcmlhDQotYnJvd3NpbmdQZXJzcGVjdGl2ZU5hbWU9TmF2ZWdhXHUwMGU3XHUwMGUzbw0KLQ0KLSMgVmlld3MNCi1saWJyYXJ5Vmlld05hbWU9QmlibGlvdGVjYQ0KLWNvbmZpZ3VyYXRpb25WaWV3TmFtZT1Db25maWd1cmFcdTAwZTdcdTAwZTNvDQotY29udGVudFZpZXdOYW1lPUNvbnRlXHUwMGZhZG8NCi1jb25maWd1cmF0aW9uRXJyb3JMb2dWaWV3TmFtZT1SZWdpc3RybyBkZSBFcnJvcyBkZSBDb25maWd1cmFcdTAwZTdcdTAwZTNvDQotDQotIyBFZGl0b3JzDQotbWV0aG9kRWxlbWVudEVkaXRvck5hbWU9RWRpdG9yIGRlIEVsZW1lbnRvIGRlIE1cdTAwZTl0b2RvDQotY29uZmlndXJhdGlvbkVkaXRvck5hbWU9RWRpdG9yIGRlIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi1wcm9jZXNzRWRpdG9yTmFtZT1FZGl0b3IgZGUgUHJvY2Vzc28NCi1hY3Rpdml0eURpYWdyYW1FZGl0b3JOYW1lPUVkaXRvciBkZSBEaWFncmFtYSBkZSBBdGl2aWRhZGVzDQotYWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yTmFtZT1FZGl0b3IgZGUgRGlhZ3JhbWEgZGUgRGV0YWxoZXMgZGUgQXRpdmlkYWRlcw0KLXdvcmtQcm9kdWN0RGVwZWRlbmN5RGlhZ3JhbUVkaXRvck5hbWU9RWRpdG9yIGRlIERpYWdyYW1hIGRlIERlcGVuZFx1MDBlYW5jaWEgZGUgUHJvZHV0byBkZSBUcmFiYWxobw0KLQ0KLSMgQ2hlYXQgU2hlZXRzDQotbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lPUZvbGhhcyBkZSBEaWNhcyBkZSBBdXRvcmlhIGRlIE1cdTAwZTl0b2RvDQotQ2hlYXRzaGVldEdldHN0YXJ0ZWRDYXRlZ29yeVRleHQ9R3VpYSBkZSBJbnRyb2R1XHUwMGU3XHUwMGUzbw0KLUNoZWF0c2hlZXRSZXVzYWJsZUNvbnRlbnRDYXRlZ29yeVRleHQ9Q3JpYXIgQ29udGVcdTAwZmFkbyBkZSBNXHUwMGU5dG9kbyBSZXV0aWxpelx1MDBlMXZlbA0KLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9R3JhdmFyIENvbnRlXHUwMGZhZG8gZGUgTVx1MDBlOXRvZG8NCi1DaGVhdHNoZWV0UHJvY2Vzc2VzQ2F0ZWdvcnlUZXh0PVRyYWJhbGhhciBjb20gUHJvY2Vzc29zDQotQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudD1OYXZlZ2FyIENvbnRlXHUwMGZhZG8gZGUgTVx1MDBlOXRvZG8NCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbj1DcmlhciBTdWEgUHJcdTAwZjNwcmlhIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgTVx1MDBlOXRvZG8NCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kUGx1Z2luPUNyaWFyIFNldSBQclx1MDBmM3ByaW8gUGx1Zy1pbiBkZSBNXHUwMGU5dG9kbw0KLUNoZWF0c2hlZXRBZGRNZXRob2RDb250ZW50PUluY2x1aXIgTm92byBDb250ZVx1MDBmYWRvIGRlIE1cdTAwZTl0b2RvLCBjb21vIEZ1blx1MDBlN1x1MDBmNWVzLCBUYXJlZmFzLCBQcm9kdXRvcyBkZSBUcmFiYWxobyBvdSBPcmllbnRhXHUwMGU3XHUwMGUzbw0KLUNoZWF0c2hlZXRUYWlsb3JNZXRob2RFbGVtZW50cz1BZGFwdGFyIEVsZW1lbnRvcyBkZSBNXHUwMGU5dG9kbyBFeGlzdGVudGVzIChGdW5cdTAwZTdcdTAwZjVlcywgVGFyZWZhcywgUHJvZHV0b3MgZGUgVHJhYmFsaG8gb3UgT3JpZW50YVx1MDBlN1x1MDBlM28pIFV0aWxpemFuZG8gQ29udHJpYnVpXHUwMGU3XHUwMGUzbw0KLUNoZWF0c2hlZXRSZXBsYWNlTWVodG9kRWxlbWVudHM9U3Vic3RpdHVpciBFbGVtZW50b3MgZGUgTVx1MDBlOXRvZG8gRXhpc3RlbnRlcyAoRnVuXHUwMGU3XHUwMGY1ZXMsIFRhcmVmYXMsIFByb2R1dG9zIGRlIFRyYWJhbGhvIG91IE9yaWVudGFcdTAwZTdcdTAwZTNvKQ0KLUNoZWF0c2hlZXRBZGRNZXRob2RSZWZPckh5cGVybGluaz1JbmNsdWlyIHVtYSBSZWZlclx1MDBlYW5jaWEgb3UgSHlwZXJsaW5rIChVUkwpIGRlIE1cdTAwZTl0b2RvDQotQ2hlYXRzaGVldEFwcGx5Q2FwYWJpbGl0eVBhdHRlcm49QXBsaWNhciB1bSBQYWRyXHUwMGUzbyBkZSBSZWN1cnNvDQotQ2hlYXRzaGVldENyZWF0ZVByb2Nlc3M9Q3JpYXIgdW0gUHJvY2Vzc28gKFBhZHJcdTAwZTNvIGRlIFJlY3Vyc28gb3UgUHJvY2Vzc28gZGUgRW50cmVnYSkNCi0NCi0jIEFjdGlvbiBTZXQNCi1hdXRob3JpbmdBY3Rpb25TZXQ9QXV0b3JpYQ0KLWNoZWF0U2hlZXRzQWN0aW9uU2V0PUZvbGhhcyBkZSBEaWNhcw0KLQ0KLSMgR2xvYmFsIEFjdGlvbnMNCi1uZXdMaWJyYXJ5QWN0aW9uPSZCaWJsaW90ZWNhIGRlIE1cdTAwZTl0b2Rvcw0KLW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwPUNyaWFyIHVtYSBOb3ZhIEJpYmxpb3RlY2EgZGUgTVx1MDBlOXRvZG9zDQotbmV3UGx1Z2luQWN0aW9uPSZQbHVnLWluIGRlIE1cdTAwZTl0b2RvDQotbmV3UGx1Z2luQWN0aW9uVG9vbHRpcD1DcmlhciB1bSBOb3ZvIFBsdWctaW4gZGUgTVx1MDBlOXRvZG8NCi1uZXdDb25maWdBY3Rpb249JkNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgTVx1MDBlOXRvZG8NCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPUNyaWFyIHVtYSBOb3ZhIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgTVx1MDBlOXRvZG8NCi1vcGVuTGlicmFyeUFjdGlvbj0mQmlibGlvdGVjYSBkZSBNXHUwMGU5dG9kb3MNCi1vcGVuTGlicmFyeUFjdGlvblRvb2x0aXA9QWJyaXIgdW1hIEJpYmxpb3RlY2EgZGUgTVx1MDBlOXRvZG9zIEV4aXN0ZW50ZQ0KLW9wZW5Db25maWdBY3Rpb249JkNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgTVx1MDBlOXRvZG8NCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1BYnJpciB1bWEgQ29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBNXHUwMGU5dG9kbyBFeGlzdGVudGUNCi1vcGVuQ2hlYXRTaGVldHM9Rm9saGFzIGRlIERpY2FzLi4uDQotDQotIyBMaWJyYXJ5IFZpZXcgQWN0aW9ucw0KLWxpbmtXaXRoRWRpdG9yPUxpbmsgY29tIEVkaXRvcg0KLWxpbmtXaXRoRWRpdG9yVG9vbHRpcD1MaW5rIGNvbSBFZGl0b3INCi1zaG93UHJlc2VudGF0aW9uTmFtZXM9TW9zdHJhciBOb21lcyBkZSBBcHJlc2VudGFcdTAwZTdcdTAwZTNvDQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcD1Nb3N0cmFyIE5vbWVzIGRlIEFwcmVzZW50YVx1MDBlN1x1MDBlM28NCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBBY3Rpb25zDQotcmVmcmVzaENvbmZpZz1BdHVhbGl6YXINCi1yZWZyZXNoQ29uZmlnVG9vbHRpcD1BdHVhbGl6YXIgQ29uZmlndXJhXHUwMGU3XHUwMGUzbw0KLQ0KLSMgUHJlZmVyZW5jZSBQYWdlDQotbWV0aG9kQXV0aG9yaW5nUGFnZT1BdXRvcmlhIGRlIE1cdTAwZTl0b2RvDQotcHJvY2Vzc0VkaXRvcj1FZGl0b3IgZGUgUHJvY2Vzc28NCi1saWJyYXJ5T3B0aW9ucz1PcFx1MDBlN1x1MDBmNWVzIGRlIEJpYmxpb3RlY2ENCi1kaWFncmFtPURpYWdyYW1hDQotc3RhcnR1cEFuZFNodXRkb3duPUluaWNpYWxpemFcdTAwZTdcdTAwZTNvIGUgRW5jZXJyYW1lbnRvDQotZGVidWc9RGVwdXJhcg0KLQ0KLSMgQ29tbWFuZCBIYW5kbGVyDQotc2VsZWN0QWxsPVNlbGVjaW9uYXIgVHVkbw0KLQ0KLSMgUHJvcGVydGllcyBWaWV3DQotX1VJX1Byb2Nlc3NFZGl0b3JfbWVudT1Qcm9jZXNzbw0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jk5vdm8gRmlsaG8NCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZvdm8gSXJtXHUwMGUzbw0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPU1vc3RyYXIgJlZpc3VhbGl6YVx1MDBlN1x1MDBlM28gZGUgUHJvcHJpZWRhZGVzDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPUF0dWFsaSZ6YXINCi1fVUlfUHJvcGVydGllc19HZW5lcmFsPUdlcmFsDQotX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbj1Eb2N1bWVudGFcdTAwZTdcdTAwZTNvDQotX1VJX1Byb3BlcnRpZXNfR3VpZGFuY2U9T3JpZW50YVx1MDBlN1x1MDBlM28NCi1fVUlfUHJvcGVydGllc19Xb3JrX1JvbGx1cD1MaXN0YSBkbyBUcmFiYWxobw0KLV9VSV9Qcm9wZXJ0aWVzX1RlYW1fUm9sbHVwPUxpc3RhIGRhIEVxdWlwZQ0KLSMjIFRoZSBmb2xsb3dpbmcgdmFsdWUgb2Ygc3RyaW5nIHNob3VsZCBiZSAiV29yayBQcm9kdWN0IFJvbGx1cCIuIEJ1dA0KLSMjIGR1ZSB0byBsaW1pdGF0aW9uL2J1ZyBpbiBFY2xpcHNlIFdUUCwgaXQncyBiZWVuIHRydW5jYXRlZCB0byANCi0jIyAiV29yayBQcm9kIFJvbGx1cCIuIFNvIGR1cmluZyB0cmFuc2xhdGlvbiwgcGxlYXNlIHRha2UgdGhpcyBpbnRvIGNvbnNpZGVyYXRpb24uDQotX1VJX1Byb3BlcnRpZXNfV1BfUm9sbHVwPUxpc3RhIGRlIFByb2R1dG9zIGRlIFRyYWJhbGhvDQotX1VJX1Byb3BlcnRpZXNfUm9sZXM9RnVuXHUwMGU3XHUwMGY1ZXMNCi1fVUlfUHJvcGVydGllc19Xb3JrUHJvZHVjdHM9UHJvZHV0b3MgZGUgVHJhYmFsaG8NCi1fVUlfUHJvcGVydGllc19TdGVwcz1FdGFwYXMNCi1fVUlfUHJvcGVydGllc19UZWFtcz1FcXVpcGVzDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkNGFmYjIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTdmMTZcdTUxOTlcdTc1MjhcdTYyMzdcdTc1NGNcdTk3NjINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPVx1NjViOVx1NmNkNQ0KLQ0KLSMgUGVyc3BlY3RpdmUNCi1hdXRob3JpbmdQZXJzcGVjdGl2ZU5hbWU9XHU3ZjE2XHU1MTk5DQotYnJvd3NpbmdQZXJzcGVjdGl2ZU5hbWU9XHU2ZDRmXHU4OWM4DQotDQotIyBWaWV3cw0KLWxpYnJhcnlWaWV3TmFtZT1cdTVlOTMNCi1jb25maWd1cmF0aW9uVmlld05hbWU9XHU5MTRkXHU3ZjZlDQotY29udGVudFZpZXdOYW1lPVx1NTE4NVx1NWJiOQ0KLWNvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXdOYW1lPVx1OTE0ZFx1N2Y2ZVx1OTUxOVx1OGJlZlx1NjVlNVx1NWZkNw0KLQ0KLSMgRWRpdG9ycw0KLW1ldGhvZEVsZW1lbnRFZGl0b3JOYW1lPVx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1N2YxNlx1OGY5MVx1NTY2OA0KLWNvbmZpZ3VyYXRpb25FZGl0b3JOYW1lPVx1OTE0ZFx1N2Y2ZVx1N2YxNlx1OGY5MVx1NTY2OA0KLXByb2Nlc3NFZGl0b3JOYW1lPVx1NmQ0MVx1N2EwYlx1N2YxNlx1OGY5MVx1NTY2OA0KLWFjdGl2aXR5RGlhZ3JhbUVkaXRvck5hbWU9XHU2ZDNiXHU1MmE4XHU1NmZlXHU3ZjE2XHU4ZjkxXHU1NjY4DQotYWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yTmFtZT1cdTZkM2JcdTUyYThcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTU2ZmVcdTdmMTZcdThmOTFcdTU2NjgNCi13b3JrUHJvZHVjdERlcGVkZW5jeURpYWdyYW1FZGl0b3JOYW1lPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYlx1NTZmZVx1N2YxNlx1OGY5MVx1NTY2OA0KLQ0KLSMgQ2hlYXQgU2hlZXRzDQotbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lPVx1NjViOVx1NmNkNVx1N2YxNlx1NTE5OVx1NTkwN1x1NWZkOFx1NTM1NQ0KLUNoZWF0c2hlZXRHZXRzdGFydGVkQ2F0ZWdvcnlUZXh0PVx1NTE2NVx1OTVlOA0KLUNoZWF0c2hlZXRSZXVzYWJsZUNvbnRlbnRDYXRlZ29yeVRleHQ9XHU1MjFiXHU1ZWZhXHU1M2VmXHU1OTBkXHU3NTI4XHU3Njg0XHU2NWI5XHU2Y2Q1XHU1MTg1XHU1YmI5DQotQ2hlYXRzaGVldFdyaXRlQ29udGVudENhdGVnb3J5VGV4dD1cdTUxOTlcdTY1YjlcdTZjZDVcdTUxODVcdTViYjkNCi1DaGVhdHNoZWV0UHJvY2Vzc2VzQ2F0ZWdvcnlUZXh0PVx1NTkwNFx1NzQwNlx1NmQ0MVx1N2EwYg0KLUNoZWF0c2hlZXROYXZpZ2F0ZU1ldGhvZENvbnRlbnQ9XHU2ZDRmXHU4OWM4XHU2NWI5XHU2Y2Q1XHU1MTg1XHU1YmI5DQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249XHU1MjFiXHU1ZWZhXHU2MGE4XHU4MWVhXHU1ZGYxXHU3Njg0XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZFBsdWdpbj1cdTUyMWJcdTVlZmFcdTYwYThcdTgxZWFcdTVkZjFcdTc2ODRcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi1DaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudD1cdTZkZmJcdTUyYTBcdTY1YjBcdTY1YjlcdTZjZDVcdTUxODVcdTViYjlcdWZmMGNcdTRmOGJcdTU5ODJcdTg5ZDJcdTgyNzJcdTMwMDFcdTRlZmJcdTUyYTFcdTMwMDFcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTYyMTZcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmYNCi1DaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHM9XHU0ZjdmXHU3NTI4XHU2M2QwXHU0ZjliXHU1YjlhXHU1MjM2XHU3M2IwXHU2NzA5XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHVmZjA4XHU4OWQyXHU4MjcyXHUzMDAxXHU0ZWZiXHU1MmExXHUzMDAxXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU2MjE2XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHVmZjA5DQotQ2hlYXRzaGVldFJlcGxhY2VNZWh0b2RFbGVtZW50cz1cdTY2ZmZcdTYzNjJcdTczYjBcdTY3MDlcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdWZmMDhcdTg5ZDJcdTgyNzJcdTMwMDFcdTRlZmJcdTUyYTFcdTMwMDFcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTYyMTZcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdWZmMDkNCi1DaGVhdHNoZWV0QWRkTWV0aG9kUmVmT3JIeXBlcmxpbms9XHU2ZGZiXHU1MmEwXHU2NWI5XHU2Y2Q1XHU1ZjE1XHU3NTI4XHU2MjE2XHU4ZDg1XHU5NGZlXHU2M2E1XHVmZjA4VVJMXHVmZjA5DQotQ2hlYXRzaGVldEFwcGx5Q2FwYWJpbGl0eVBhdHRlcm49XHU1ZTk0XHU3NTI4XHU4MGZkXHU1MjliXHU2YTIxXHU1ZjBmDQotQ2hlYXRzaGVldENyZWF0ZVByb2Nlc3M9XHU1MjFiXHU1ZWZhXHU2ZDQxXHU3YTBiXHVmZjA4XHU4MGZkXHU1MjliXHU2YTIxXHU1ZjBmXHU2MjE2XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiXHVmZjA5DQotDQotIyBBY3Rpb24gU2V0DQotYXV0aG9yaW5nQWN0aW9uU2V0PVx1N2YxNlx1NTE5OQ0KLWNoZWF0U2hlZXRzQWN0aW9uU2V0PVx1NTkwN1x1NWZkOFx1NTM1NQ0KLQ0KLSMgR2xvYmFsIEFjdGlvbnMNCi1uZXdMaWJyYXJ5QWN0aW9uPVx1NjViOVx1NmNkNVx1NWU5MygmTCkNCi1uZXdMaWJyYXJ5QWN0aW9uVG9vbHRpcD1cdTUyMWJcdTVlZmFcdTY1YjBcdTY1YjlcdTZjZDVcdTVlOTMNCi1uZXdQbHVnaW5BY3Rpb249XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2KCZQKQ0KLW5ld1BsdWdpbkFjdGlvblRvb2x0aXA9XHU1MjFiXHU1ZWZhXHU2NWIwXHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2DQotbmV3Q29uZmlnQWN0aW9uPVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZSgmQykNCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPVx1NTIxYlx1NWVmYVx1NjViMFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLW9wZW5MaWJyYXJ5QWN0aW9uPVx1NjViOVx1NmNkNVx1NWU5MygmTCkNCi1vcGVuTGlicmFyeUFjdGlvblRvb2x0aXA9XHU2MjUzXHU1ZjAwXHU3M2IwXHU2NzA5XHU2NWI5XHU2Y2Q1XHU1ZTkzDQotb3BlbkNvbmZpZ0FjdGlvbj1cdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUoJkMpDQotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9XHU2MjUzXHU1ZjAwXHU3M2IwXHU2NzA5XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotb3BlbkNoZWF0U2hlZXRzPVx1NTkwN1x1NWZkOFx1NTM1NS4uLg0KLQ0KLSMgTGlicmFyeSBWaWV3IEFjdGlvbnMNCi1saW5rV2l0aEVkaXRvcj1cdTk0ZmVcdTYzYTVcdTdmMTZcdThmOTFcdTU2NjgNCi1saW5rV2l0aEVkaXRvclRvb2x0aXA9XHU5NGZlXHU2M2E1XHU3ZjE2XHU4ZjkxXHU1NjY4DQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzPVx1NjdlNVx1NzcwYlx1NjYzZVx1NzkzYVx1NTQwZFx1NzlmMA0KLXNob3dQcmVzZW50YXRpb25OYW1lc1Rvb2x0aXA9XHU2N2U1XHU3NzBiXHU2NjNlXHU3OTNhXHU1NDBkXHU3OWYwDQotDQotIyBDb25maWd1cmF0aW9uIFZpZXcgQWN0aW9ucw0KLXJlZnJlc2hDb25maWc9XHU1MjM3XHU2NWIwDQotcmVmcmVzaENvbmZpZ1Rvb2x0aXA9XHU1MjM3XHU2NWIwXHU5MTRkXHU3ZjZlDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tZXRob2RBdXRob3JpbmdQYWdlPVx1NjViOVx1NmNkNVx1N2YxNlx1NTE5OQ0KLXByb2Nlc3NFZGl0b3I9XHU2ZDQxXHU3YTBiXHU3ZjE2XHU4ZjkxXHU1NjY4DQotbGlicmFyeU9wdGlvbnM9XHU1ZTkzXHU5MDA5XHU5ODc5DQotZGlhZ3JhbT1cdTU2ZmUNCi1zdGFydHVwQW5kU2h1dGRvd249XHU1NDJmXHU1MmE4XHU1NDhjXHU1MTczXHU5NWVkDQotZGVidWc9XHU4YzAzXHU4YmQ1DQotDQotIyBDb21tYW5kIEhhbmRsZXINCi1zZWxlY3RBbGw9XHU1MTY4XHU5MGU4XHU5MDA5XHU0ZTJkDQotDQotIyBQcm9wZXJ0aWVzIFZpZXcNCi1fVUlfUHJvY2Vzc0VkaXRvcl9tZW51PVx1NmQ0MVx1N2EwYg0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09XHU2NWIwXHU1ZWZhXHU1YjUwXHU0ZWUzKCZOKQ0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1cdTY1YjBcdTVlZmFcdTU0MGNcdTRlZTMoJkUpDQotX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW09XHU2NjNlXHU3OTNhXHU1YzVlXHU2MDI3XHU4OWM2XHU1NmZlKCZWKQ0KLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT1cdTUyMzdcdTY1YjAoJkYpDQotX1VJX1Byb3BlcnRpZXNfR2VuZXJhbD1cdTVlMzhcdTg5YzQNCi1fVUlfUHJvcGVydGllc19Eb2N1bWVudGF0aW9uPVx1NjU4N1x1Njg2Mw0KLV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlPVx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLV9VSV9Qcm9wZXJ0aWVzX1dvcmtfUm9sbHVwPVx1NWRlNVx1NGY1Y1x1NGUwYVx1NmVkYQ0KLV9VSV9Qcm9wZXJ0aWVzX1RlYW1fUm9sbHVwPVx1NTZlMlx1OTYxZlx1NGUwYVx1NmVkYQ0KLSMjIFRoZSBmb2xsb3dpbmcgdmFsdWUgb2Ygc3RyaW5nIHNob3VsZCBiZSAiV29yayBQcm9kdWN0IFJvbGx1cCIuIEJ1dA0KLSMjIGR1ZSB0byBsaW1pdGF0aW9uL2J1ZyBpbiBFY2xpcHNlIFdUUCwgaXQncyBiZWVuIHRydW5jYXRlZCB0byANCi0jIyAiV29yayBQcm9kIFJvbGx1cCIuIFNvIGR1cmluZyB0cmFuc2xhdGlvbiwgcGxlYXNlIHRha2UgdGhpcyBpbnRvIGNvbnNpZGVyYXRpb24uDQotX1VJX1Byb3BlcnRpZXNfV1BfUm9sbHVwPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NGUwYVx1NmVkYQ0KLV9VSV9Qcm9wZXJ0aWVzX1JvbGVzPVx1ODlkMlx1ODI3Mg0KLV9VSV9Qcm9wZXJ0aWVzX1dvcmtQcm9kdWN0cz1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzENCi1fVUlfUHJvcGVydGllc19TdGVwcz1cdTZiNjVcdTlhYTQNCi1fVUlfUHJvcGVydGllc19UZWFtcz1cdTU2ZTJcdTk2MWYNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2YxNDJhYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIEF1dGhvcmluZyBVSQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgQ2F0ZWdvcnkNCi1tZXRob2RDYXRlZ29yeU5hbWU9XHU2NWI5XHU2Y2Q1DQotDQotIyBQZXJzcGVjdGl2ZQ0KLWF1dGhvcmluZ1BlcnNwZWN0aXZlTmFtZT1cdTdkZThcdTViZWINCi1icm93c2luZ1BlcnNwZWN0aXZlTmFtZT1cdTcwMGZcdTg5YmQNCi0NCi0jIFZpZXdzDQotbGlicmFyeVZpZXdOYW1lPVx1N2EwYlx1NWYwZlx1NWVhYg0KLWNvbmZpZ3VyYXRpb25WaWV3TmFtZT1cdTkxNGRcdTdmNmUNCi1jb250ZW50Vmlld05hbWU9XHU1MTY3XHU1YmI5DQotY29uZmlndXJhdGlvbkVycm9yTG9nVmlld05hbWU9XHU5MTRkXHU3ZjZlXHU5MzJmXHU4YWE0XHU2NWU1XHU4YThjDQotDQotIyBFZGl0b3JzDQotbWV0aG9kRWxlbWVudEVkaXRvck5hbWU9XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU3ZGU4XHU4ZjJmXHU1NjY4DQotY29uZmlndXJhdGlvbkVkaXRvck5hbWU9XHU5MTRkXHU3ZjZlXHU3ZGU4XHU4ZjJmXHU1NjY4DQotcHJvY2Vzc0VkaXRvck5hbWU9XHU3YTBiXHU1ZThmXHU3ZGU4XHU4ZjJmXHU1NjY4DQotYWN0aXZpdHlEaWFncmFtRWRpdG9yTmFtZT1cdTZkM2JcdTUyZDVcdTU3MTZcdTdkZThcdThmMmZcdTU2NjgNCi1hY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JOYW1lPVx1NmQzYlx1NTJkNVx1NjYwZVx1N2QzMFx1NTcxNlx1N2RlOFx1OGYyZlx1NTY2OA0KLXdvcmtQcm9kdWN0RGVwZWRlbmN5RGlhZ3JhbUVkaXRvck5hbWU9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyXHU1NzE2XHU3ZGU4XHU4ZjJmXHU1NjY4DQotDQotIyBDaGVhdCBTaGVldHMNCi1tZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWU9XHU2NWI5XHU2Y2Q1XHU3ZGU4XHU1YmViXHU2M2QwXHU4OTgxDQotQ2hlYXRzaGVldEdldHN0YXJ0ZWRDYXRlZ29yeVRleHQ9XHU1MTY1XHU5NTgwDQotQ2hlYXRzaGVldFJldXNhYmxlQ29udGVudENhdGVnb3J5VGV4dD1cdTVlZmFcdTdhY2JcdTUzZWZcdTkxY2RcdTg5MDdcdTRmN2ZcdTc1MjhcdTc2ODRcdTY1YjlcdTZjZDVcdTUxNjdcdTViYjkNCi1DaGVhdHNoZWV0V3JpdGVDb250ZW50Q2F0ZWdvcnlUZXh0PVx1NWJlYlx1NTE2NVx1NjViOVx1NmNkNVx1NTE2N1x1NWJiOQ0KLUNoZWF0c2hlZXRQcm9jZXNzZXNDYXRlZ29yeVRleHQ9XHU0ZjdmXHU3NTI4XHU3YTBiXHU1ZThmDQotQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudD1cdTVjMGVcdTg5YmRcdTY1YjlcdTZjZDVcdTUxNjdcdTViYjkNCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbj1cdTVlZmFcdTdhY2JcdTgxZWFcdTVkZjFcdTc2ODRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kUGx1Z2luPVx1NWVmYVx1N2FjYlx1ODFlYVx1NWRmMVx1NzY4NFx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLUNoZWF0c2hlZXRBZGRNZXRob2RDb250ZW50PVx1NjViMFx1NTg5ZVx1NjViOVx1NmNkNVx1NTE2N1x1NWJiOVx1ZmYwY1x1NGY4Ylx1NTk4Mlx1ODlkMlx1ODI3Mlx1MzAwMVx1NGY1Y1x1Njk2ZFx1MzAwMVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NjIxNlx1NjMwN1x1NWYxNQ0KLUNoZWF0c2hlZXRUYWlsb3JNZXRob2RFbGVtZW50cz1cdTRmN2ZcdTc1MjhcdTk2NDRcdTUyYTBcdTg5ODFcdTdkMjBcdThhYmZcdTY1NzRcdTczZmVcdTY3MDlcdTc2ODRcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdWZmMDhcdTg5ZDJcdTgyNzJcdTMwMDFcdTRmNWNcdTY5NmRcdTMwMDFcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTYyMTZcdTYzMDdcdTVmMTVcdWZmMDkNCi1DaGVhdHNoZWV0UmVwbGFjZU1laHRvZEVsZW1lbnRzPVx1NTNkNlx1NGVlM1x1NzNmZVx1NjcwOVx1NzY4NFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1ZmYwOFx1ODlkMlx1ODI3Mlx1MzAwMVx1NGY1Y1x1Njk2ZFx1MzAwMVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NjIxNlx1NjMwN1x1NWYxNVx1ZmYwOQ0KLUNoZWF0c2hlZXRBZGRNZXRob2RSZWZPckh5cGVybGluaz1cdTY1YjBcdTU4OWVcdTY1YjlcdTZjZDVcdTUzYzNcdTcxNjdcdTYyMTZcdThkODVcdTkzYzhcdTdkNTAgKFVSTCkNCi1DaGVhdHNoZWV0QXBwbHlDYXBhYmlsaXR5UGF0dGVybj1cdTU5NTdcdTc1MjhcdTUyOWZcdTgwZmRcdTU3OGJcdTZhMjMNCi1DaGVhdHNoZWV0Q3JlYXRlUHJvY2Vzcz1cdTVlZmFcdTdhY2JcdTdhMGJcdTVlOGZcdWZmMDhcdTUyOWZcdTgwZmRcdTU3OGJcdTZhMjNcdTYyMTZcdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGJcdWZmMDkNCi0NCi0jIEFjdGlvbiBTZXQNCi1hdXRob3JpbmdBY3Rpb25TZXQ9XHU3ZGU4XHU1YmViDQotY2hlYXRTaGVldHNBY3Rpb25TZXQ9XHU2M2QwXHU4OTgxDQotDQotIyBHbG9iYWwgQWN0aW9ucw0KLW5ld0xpYnJhcnlBY3Rpb249XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiKCZMKQ0KLW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYg0KLW5ld1BsdWdpbkFjdGlvbj1cdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYoJlApDQotbmV3UGx1Z2luQWN0aW9uVG9vbHRpcD1cdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYNCi1uZXdDb25maWdBY3Rpb249XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlKCZDKQ0KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9XHU1ZWZhXHU3YWNiXHU2NWIwXHU3Njg0XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotb3BlbkxpYnJhcnlBY3Rpb249XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiKCZMKQ0KLW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcD1cdTk1OGJcdTU1NWZcdTczZmVcdTY3MDlcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWINCi1vcGVuQ29uZmlnQWN0aW9uPVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZSgmQykNCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1cdTk1OGJcdTU1NWZcdTczZmVcdTY3MDlcdTc2ODRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi1vcGVuQ2hlYXRTaGVldHM9XHU2M2QwXHU4OTgxLi4uDQotDQotIyBMaWJyYXJ5IFZpZXcgQWN0aW9ucw0KLWxpbmtXaXRoRWRpdG9yPVx1OTAyM1x1N2Q1MFx1N2RlOFx1OGYyZlx1NTY2OA0KLWxpbmtXaXRoRWRpdG9yVG9vbHRpcD1cdTkwMjNcdTdkNTBcdTdkZThcdThmMmZcdTU2NjgNCi1zaG93UHJlc2VudGF0aW9uTmFtZXM9XHU5ODZmXHU3OTNhXHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxDQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcD1cdTk4NmZcdTc5M2FcdTU0NDhcdTczZmVcdTU0MGRcdTdhMzENCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBBY3Rpb25zDQotcmVmcmVzaENvbmZpZz1cdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDYNCi1yZWZyZXNoQ29uZmlnVG9vbHRpcD1cdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDZcdTkxNGRcdTdmNmUNCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1ldGhvZEF1dGhvcmluZ1BhZ2U9XHU2NWI5XHU2Y2Q1XHU3ZGU4XHU1YmViDQotcHJvY2Vzc0VkaXRvcj1cdTdhMGJcdTVlOGZcdTdkZThcdThmMmZcdTU2NjgNCi1saWJyYXJ5T3B0aW9ucz1cdTdhMGJcdTVmMGZcdTVlYWJcdTkwNzhcdTk4MDUNCi1kaWFncmFtPVx1NTcxNlx1ODllMw0KLXN0YXJ0dXBBbmRTaHV0ZG93bj1cdTU1NWZcdTUyZDVcdTgyMDdcdTk1ZGNcdTk1ODkNCi1kZWJ1Zz1cdTk2NjRcdTkzMmYNCi0NCi0jIENvbW1hbmQgSGFuZGxlcg0KLXNlbGVjdEFsbD1cdTUxNjhcdTkwNzgNCi0NCi0jIFByb3BlcnRpZXMgVmlldw0KLV9VSV9Qcm9jZXNzRWRpdG9yX21lbnU9XHU3YTBiXHU1ZThmDQotX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbT1cdTY1YjBcdTVlZmFcdTViNTBcdTk4MDUoJk4pDQotX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtPVx1NjViMFx1NWVmYVx1NTQwY1x1NWM2NFx1N2QxYVx1OTgwNSgmRSkNCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT1cdTk4NmZcdTc5M2FcdTUxNjdcdTViYjlcdTg5OTZcdTdhOTcoJlYpDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPVx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNigmRikNCi1fVUlfUHJvcGVydGllc19HZW5lcmFsPVx1NGUwMFx1ODIyYw0KLV9VSV9Qcm9wZXJ0aWVzX0RvY3VtZW50YXRpb249XHU2NTg3XHU0ZWY2DQotX1VJX1Byb3BlcnRpZXNfR3VpZGFuY2U9XHU2MzA3XHU1ZjE1DQotX1VJX1Byb3BlcnRpZXNfV29ya19Sb2xsdXA9XHU1ZGU1XHU0ZjVjXHU1ZjU5XHU3ZTNkDQotX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXA9XHU1NzE4XHU5NjhhXHU1ZjU5XHU3ZTNkDQotIyMgVGhlIGZvbGxvd2luZyB2YWx1ZSBvZiBzdHJpbmcgc2hvdWxkIGJlICJXb3JrIFByb2R1Y3QgUm9sbHVwIi4gQnV0DQotIyMgZHVlIHRvIGxpbWl0YXRpb24vYnVnIGluIEVjbGlwc2UgV1RQLCBpdCdzIGJlZW4gdHJ1bmNhdGVkIHRvIA0KLSMjICJXb3JrIFByb2QgUm9sbHVwIi4gU28gZHVyaW5nIHRyYW5zbGF0aW9uLCBwbGVhc2UgdGFrZSB0aGlzIGludG8gY29uc2lkZXJhdGlvbi4NCi1fVUlfUHJvcGVydGllc19XUF9Sb2xsdXA9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU1ZjU5XHU3ZTNkDQotX1VJX1Byb3BlcnRpZXNfUm9sZXM9XHU4OWQyXHU4MjcyDQotX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLV9VSV9Qcm9wZXJ0aWVzX1N0ZXBzPVx1NmI2NVx1OWE1Zg0KLV9VSV9Qcm9wZXJ0aWVzX1RlYW1zPVx1NTcxOFx1OTY4YQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OWYyOTgzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1wcmV2aW91c19uYW1lX251bGwxPURhcyBSXHUwMGZjY2tnXHUwMGU0bmdpZ21hY2hlbiBlaW5lciBOYW1lbnNcdTAwZTRuZGVydW5nIGlzdCBuaWNodCB6dWxcdTAwZTRzc2lnLCB3ZW5uIGRlciBOYW1lIHZvcmhlciBuaWNodCBkZWZpbmllcnQgd2FyLg0KLWVycl9uYW1lX2VtcHR5PURlciBOYW1lIG11c3MgYW5nZWdlYmVuIHdlcmRlbi4gR2ViZW4gU2llIGVpbmVuIGdcdTAwZmNsdGlnZW4gTmFtZW4gYW4uDQotbW92ZUFjdGlvbl9sYWJlbD1WZXJzY2hpZWJlbg0KLQ0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dD1BdXN3XHUwMGU0aGxlbg0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcD1Lbm90ZW4gb2RlciBMaW5rIGF1c3dcdTAwZTRobGVuDQotQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfdGl0bGU9S25vdGVuIGhpbnp1Zlx1MDBmY2dlbg0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX2Vycl9tc2c9SVhSRDAwMDJXOiBEYXMgSGluenVmXHUwMGZjZ2VuIGVpbmVzIEtub3RlbnMgenVtIERpYWdyYW1tIGlzdCBmZWhsZ2VzY2hsYWdlbi4NCi1BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0PUxpbmsNCi1BYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3Q9TGluayBhdXN3XHUwMGU0aGxlbg0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA9TmV1ZW4gTGluayBlcnN0ZWxsZW4NCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQ9QXVzZ2FuZ3Nrbm90ZW4NCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9TmV1ZW4gQXVzZ2FuZ3Nrbm90ZW4gZXJzdGVsbGVuDQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ9VGV4dCBtaXQgZnJlaWVtIEZvcm1hdA0KLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwPU5ldWVuIFRleHQgbWl0IGZyZWllbSBGb3JtYXQgZXJzdGVsbGVuDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dD1TeW5jaHJvbmlzYXRpb25zYmFsa2VuDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcD1OZXVlbiBTeW5jaHJvbmlzYXRpb25zYmFsa2VuIGVyc3RlbGxlbg0KLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dD1FbnRzY2hlaWR1bmdza25vdGVuDQotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwPU5ldWVuIEVudHNjaGVpZHVuZ3Nrbm90ZW4gZXJzdGVsbGVuDQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dD1FbmRrbm90ZW4NCi1BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4PUFrdGl2aXRcdTAwZTR0c2RldGFpbDoNCi1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwPU5ldWVuIEVuZGtub3RlbiBlcnN0ZWxsZW4NCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1Ba3Rpdml0XHUwMGU0dA0KLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90b29sdGlwPU5ldWUgQWt0aXZpdFx1MDBlNHQgZXJzdGVsbGVuDQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhdGlvbg0KLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcD1OZXVlIEl0ZXJhdGlvbiBlcnN0ZWxsZW4NCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dD1QaGFzZQ0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwPU5ldWUgUGhhc2UgZXJzdGVsbGVuDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9QXVmZ2FiZW5kZXNrcmlwdG9yDQotQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3RleHQ9Um9sbGVuZGVza3JpcHRvcg0KLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PUFyYmVpdHNlcmdlYm5pc2FiaFx1MDBlNG5naWdrZWl0c2RpYWdyYW1tOg0KLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90b29sdGlwPU5ldWVuIFJvbGxlbmRlc2tyaXB0b3IgZXJzdGVsbGVuDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXA9TmV1ZW4gQXVmZ2FiZW5kZXNrcmlwdG9yIGVyc3RlbGxlbg0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1CZXJlaXRzdGVsbHVuZ3Nwcm96ZXNzDQotQWN0dml0aXZpdHlEaWFncmFtX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9UHJvemVzc211c3Rlcg0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg9UGhhc2UNCi1BY3R2aXRpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9SXRlcmF0aW9uDQotQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9QWt0aXZpdFx1MDBlNHQNCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9QXJiZWl0c2VyZ2VibmlzZGVza3JpcHRvcg0KLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcD1OZXVlbiBBcmJlaXRzZXJnZWJuaXNkZXNrcmlwdG9yIGVyc3RlbGxlbg0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1BdXNyaWNodGVuDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9QW5oYW5kIGRlciBCYXNpc2FrdGl2aXRcdTAwZTR0IGFrdHVhbGlzaWVyZW4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9VGV4dGZlbGQgZm9ybWF0aWVyZW4uLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PUhvcml6b250YWwgYW4gRHVyY2hzY2huaXR0c2tvb3JkaW5hdGVuDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1Ib3Jpem9udGFsIGFuIGVyc3RlciBhdXNnZXdcdTAwZTRobHRlciBLb29yZGluYXRlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WZXJ0aWthbCBhbiBEdXJjaHNjaG5pdHRza29vcmRpbmF0ZW4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVZlcnRpa2FsIGFuIGVyc3RlciBhdXNnZXdcdTAwZTRobHRlciBLb29yZGluYXRlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1TcGVpY2hlcm4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPXswfSB3aXJkIGdlc3BlaWNoZXJ0DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPUtub3RlbiB2ZXJzY2hpZWJlbg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZT1BbmhhbmQgZGVyIEJhc2lzIGFrdHVhbGlzaWVyZW4NCi1BYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZT1WZXJ6d2VpZ3VuZ3NwdW5rdCBlcnN0ZWxsZW4NCi0NCi1BY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PUFrdGl2aXRcdTAwZTR0c2RldGFpbGRpYWdyYW1tIFx1MDBmNmZmbmVuDQotcmVmcmVzaEFjdGlvbl9sYWJlbD1Ba3R1YWxpc2llcmVuDQotcmVmcmVzaEZyb21CYXNlQ21kX2xhYmVsPUFuaGFuZCBkZXIgQmFzaXMgYWt0dWFsaXNpZXJlbg0KLWRpYWdyYW1fc2F2ZUVycm9yPUlVUEQwMDAxVzogRGFzIFNwZWljaGVybiBkZXMgRGlhZ3JhbW1zIGlzdCBmZWhsZ2VzY2hsYWdlbi4NCi0NCi1EZWxldGVEaWFncmFtX3RleHQ9RGlhZ3JhbW0gbFx1MDBmNnNjaGVuDQotRGVsZXRlRGlhZ3JhbV9wcm9tcHQ9TVx1MDBmNmNodGVuIFNpZSBkYXMgRGlhZ3JhbW0gd2lya2xpY2ggc2NobGllXHUwMGRmZW4gdW5kIGxcdTAwZjZzY2hlbj9cbkRpZXNlIFx1MDBjNG5kZXJ1bmcgaXN0IHBlcm1hbmVudCB1bmQga2FubiBuaWNodCByXHUwMGZjY2tnXHUwMGU0bmdpZyBnZW1hY2h0IHdlcmRlbi4NCi1hbGlnbl9iZW5kX3BvaW50X3RleHQ9VmVyendlaWd1bmdzcHVua3QgYXVzcmljaHRlbg0KLUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwPUtvbmZpZ3VyYXRpb25zZWRpdG9yDQotZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnPUZlaGxlciBpbSBFaWdlbnNjaGFmdHN3ZXJ0IGRlcyBLbm90ZW5zLg0KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA9RmVobGVyDQotDQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PURpYWdyYW1tbGF5b3V0IHp1clx1MDBmY2Nrc2V0emVuDQotZXJyb3JEaWFsb2dfdGl0bGU9RmVobGVyDQotY29tbWFuZF9jYW5ub3RFZGl0PUlVUEQwMDAzRTogRGFzIERpYWdyYW1tIGthbm4gbmljaHQgYmVhcmJlaXRldCB3ZXJkZW4uDQotDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RpdGxlPVx1MDBkY2Jlcmdlb3JkbmV0ZXIgRWRpdG9yIGdlc2NobG9zc2VuDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RleHQ9ezB9IHd1cmRlIGdlc2NobG9zc2VuLiB7MX0gYXVjaCBzY2hsaWVcdTAwZGZlbj8NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDU2ODFlOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcHJldmlvdXNfbmFtZV9udWxsMT1ObyBzZSBwdWVkZSBkZXNoYWNlciBlbCBjYW1iaW8gZGUgbm9tYnJlIHNpIGVsIG5vbWJyZSBhbnRlcmlvciBlcyBudWxvLg0KLWVycl9uYW1lX2VtcHR5PUVsIG5vbWJyZSBubyBwdWVkZSBlc3RhciB2YWNcdTAwZWRvLiBFc3BlY2lmaXF1ZSB1biBub21icmUgdlx1MDBlMWxpZG8uDQotbW92ZUFjdGlvbl9sYWJlbD1Nb3Zlcg0KLQ0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dD1TZWxlY2Npb25hcg0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcD1TZWxlY2Npb25hciBub2RvIG8gZW5sYWNlDQotQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfdGl0bGU9QVx1MDBmMWFkaXIgbm9kbw0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX2Vycl9tc2c9SVhSRDAwMDJXOiBMYSBhZGljaVx1MDBmM24gZGUgdW4gbm9kbyBhbCBkaWFncmFtYSBoYSBmYWxsYWRvDQotQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dD1FbmxhY2UNCi1BYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3Q9U2VsZWNjaW9uYXIgZW5sYWNlDQotQWJzdHJhY3REaWFncmFtX0xpbmtfdG9vbHRpcD1DcmVhciB1biBudWV2byBlbmxhY2UNCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQ9Tm9kbyBkZSBpbmljaW8NCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9Q3JlYXIgdW4gbnVldm8gbm9kbyBkZSBpbmljaW8NCi1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dD1UZXh0byBsaWJyZQ0KLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwPUNyZWFyIHVuIG51ZXZvIHRleHRvIGxpYnJlDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dD1CYXJyYSBkZSBzaW5jcm9uaXphY2lcdTAwZjNuDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcD1DcmVhciB1bmEgbnVldmEgYmFycmEgZGUgc2luY3Jvbml6YWNpXHUwMGYzbg0KLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dD1Ob2RvIGRlIGRlY2lzaVx1MDBmM24NCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA9Q3JlYXIgdW4gbnVldm8gbm9kbyBkZSBkZWNpc2lcdTAwZjNuDQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dD1Ob2RvIGRlIGZpbg0KLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg9RGV0YWxsZSBkZSBsYSBhY3RpdmlkYWQ6DQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcD1DcmVhciB1biBudWV2byBub2RvIGRlIGZpbg0KLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0PUFjdGl2aWRhZA0KLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90b29sdGlwPUNyZWFyIHVuYSBudWV2YSBhY3RpdmlkYWQNCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9SXRlcmFjaVx1MDBmM24NCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXA9Q3JlYXIgdW5hIG51ZXZhIGl0ZXJhY2lcdTAwZjNuDQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQ9RmFzZQ0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwPUNyZWFyIHVuYSBudWV2YSBmYXNlDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9RGVzY3JpcHRvciBkZSB0YXJlYXMNCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdGV4dD1EZXNjcmlwdG9yIGRlIHJvbGVzDQotV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg9RGlhZ3JhbWEgZGUgZGVwZW5kZW5jaWEgZGVsIHByb2R1Y3RvIGRlIHRyYWJham86DQotQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3Rvb2x0aXA9Q3JlYXIgdW4gbnVldm8gZGVzY3JpcHRvciBkZSByb2xlcw0KLUFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwPUNyZWFyIHVuIG51ZXZvIGRlc2NyaXB0b3IgZGUgdGFyZWFzDQotQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PVByb2Nlc28gZGUgZW50cmVnYQ0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PVBhdHJcdTAwZjNuIGRlIHBvc2liaWxpZGFkDQotQWN0dml0aXZpdHlEaWFncmFtX1BoYXNlX3RleD1GYXNlDQotQWN0dml0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhY2lcdTAwZjNuDQotQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9QWN0aXZpZGFkDQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PURlc2NyaXB0b3IgZGUgcHJvZHVjdG9zIGRlIHRyYWJham8NCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXA9Q3JlYXIgdW4gbnVldm8gZGVzY3JpcHRvciBkZSBwcm9kdWN0b3MgZGUgdHJhYmFqbw0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1BbGluZWFyDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9UmVub3ZhciBkZXNkZSBhY3RpdmlkYWQgYlx1MDBlMXNpY2ENCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9Rm9ybWF0ZWFyIHJlY3VhZHJvIGRlIHRleHRvLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1Ib3Jpem9udGFsbWVudGUgaGFzdGEgZWwgcHJvbWVkaW8NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PUhvcml6b250YWxtZW50ZSBoYXN0YSBsYSBwcmltZXJhIHNlbGVjY2lcdTAwZjNuDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WZXJ0aWNhbG1lbnRlIGhhc3RhIGVsIHByb21lZGlvDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWNhbG1lbnRlIGhhc3RhIGxhIHByaW1lcmEgc2VsZWNjaVx1MDBmM24NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PUd1YXJkYXINCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPUd1YXJkYW5kbyB7MH0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9TW92ZXIgbm9kbw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZT1SZW5vdmFyIGRlc2RlIGFjdGl2aWRhZCBiXHUwMGUxc2ljYQ0KLUFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlPUNyZWFyIHB1bnRvIGRlIGluZmxleGlcdTAwZjNuDQotDQotQWN0aXZpdHlEaWFncmFtX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1BYnJpciBkaWFncmFtYSBkZSBkZXRhbGxlcyBkZSBsYSBhY3RpdmlkYWQNCi1yZWZyZXNoQWN0aW9uX2xhYmVsPVJlbm92YXINCi1yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw9UmVub3ZhciBkZXNkZSBhY3RpdmlkYWQgYlx1MDBlMXNpY2ENCi1kaWFncmFtX3NhdmVFcnJvcj1JVVBEMDAwMVc6IExhIGFjY2lcdTAwZjNuIGRlIGd1YXJkYXIgZWwgZGlhZ3JhbWEgaGEgZmFsbGFkbw0KLQ0KLURlbGV0ZURpYWdyYW1fdGV4dD1TdXByaW1pciBkaWFncmFtYQ0KLURlbGV0ZURpYWdyYW1fcHJvbXB0PVx1MDBiZkVzdFx1MDBlMSBzZWd1cm8gZGUgcXVlIGRlc2VhIGNlcnJhciB5IHN1cHJpbWlyIGVzdGUgZGlhZ3JhbWE/XG5Fc3RlIGNhbWJpbyBlcyBwZXJtYW5lbnRlIHkgbm8gc2UgcHVlZGUgZGVzaGFjZXIuDQotYWxpZ25fYmVuZF9wb2ludF90ZXh0PUFsaW5lYXIgcHVudG8gZGUgaW5mbGV4aVx1MDBmM24NCi1Db25maWd1cmF0aW9uRWRpdG9ySW5wdXRfY29uZmlnZWRpdG9yMD1FZGl0b3IgZGUgY29uZmlndXJhY2lcdTAwZjNuDQotZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnPVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBlbiBlbCB2YWxvciBkZSBsYSBwcm9waWVkYWQgZGVsIG5vZG8uDQotZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZV90ZXh0MD1FcnJvcg0KLQ0KLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcl9SZXNldERpYWdyYW1MYXlvdXRfdGV4dD1SZXN0YWJsZWNlciBkaXNlXHUwMGYxbyBkZSBkaWFncmFtYQ0KLWVycm9yRGlhbG9nX3RpdGxlPUVycm9yDQotY29tbWFuZF9jYW5ub3RFZGl0PUlVUEQwMDAzRTogTm8gc2UgcHVlZGUgZWRpdGFyIGVsIGRpYWdyYW1hDQotDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RpdGxlPUVkaXRvciBwYWRyZSBjZXJyYWRvDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RleHQ9ezB9IHNlIGhhIGNlcnJhZG8uIFx1MDBiZkRlc2VhIGNlcnJhciB0YW1iaVx1MDBlOW4gezF9Pw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NDIzNTg3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1wcmV2aW91c19uYW1lX251bGwxPUwnYW5udWxhdGlvbiBkdSBjaGFuZ2VtZW50IGRlIG5vbSBuJ2VzdCBwYXMgcGVybWlzZSBzaSBsZSBub20gcHJcdTAwZTljXHUwMGU5ZGVudCBlc3QgTlVMTC4NCi1lcnJfbmFtZV9lbXB0eT1MZSBub20gbmUgcGV1dCBwYXMgXHUwMGVhdHJlIHZpZGUuIEluZGlxdWV6IHVuIG5vbSB2YWxpZGUuDQotbW92ZUFjdGlvbl9sYWJlbD1EXHUwMGU5cGxhY2VyDQotDQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0PVNcdTAwZTlsZWN0aW9ubmVyDQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwPVNcdTAwZTlsZWN0aW9ubmVyIHVuIG5vZXVkIG91IHVuIGxpZW4NCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV90aXRsZT1Bam91dGVyIHVuIG5vZXVkDQotQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfZXJyX21zZz1JWFJEMDAwMlcgOiBFY2hlYyBkZSBsJ2Fqb3V0IGQndW4gbm9ldWQgYXUgZGlhZ3JhbW1lDQotQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dD1MaWVuDQotQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0PVNcdTAwZTlsZWN0aW9ubmVyIHVuIGxpZW4NCi1BYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwPUNyXHUwMGU5ZXIgdW4gbm91dmVhdSBsaWVuDQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0PU5vZXVkIGRlIGRcdTAwZTlidXQNCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9Q3JcdTAwZTllciB1biBub3V2ZWF1IG5vZXVkIGRlIGRcdTAwZTlidXQNCi1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dD1UZXh0ZSBsaWJyZQ0KLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwPUNyXHUwMGU5ZXIgdW4gbm91dmVhdSB0ZXh0ZSBsaWJyZQ0KLUFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3RleHQ9QmFycmUgZGUgc3luY2hyb25pc2F0aW9uDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcD1Dclx1MDBlOWVyIHVuZSBub3V2ZWxsZSBiYXJyZSBkZSBzeW5jaHJvbmlzYXRpb24NCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQ9Tm9ldWQgZGUgZFx1MDBlOWNpc2lvbg0KLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcD1Dclx1MDBlOWVyIHVuIG5vdXZlYXUgbm9ldWQgZGUgZFx1MDBlOWNpc2lvbg0KLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3RleHQ9Tm9ldWQgZGUgZmluIGRlIGZsdXgNCi1BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4PURcdTAwZTl0YWlsIGRlcyBhY3Rpdml0XHUwMGU5cyA6DQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcD1Dclx1MDBlOWVyIHVuIG5vdXZlYXUgbm9ldWQgZGUgZmluIGRlIGZsdXgNCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1BY3Rpdml0XHUwMGU5DQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA9Q3JcdTAwZTllciB1bmUgbm91dmVsbGUgYWN0aXZpdFx1MDBlOQ0KLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1JdFx1MDBlOXJhdGlvbg0KLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcD1Dclx1MDBlOWVyIHVuZSBub3V2ZWxsZSBpdFx1MDBlOXJhdGlvbg0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0PVBoYXNlDQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXA9Q3JcdTAwZTllciB1bmUgbm91dmVsbGUgcGhhc2UNCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dD1EZXNjcmlwdGV1ciBkZSB0XHUwMGUyY2hlDQotQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3RleHQ9RGVzY3JpcHRldXIgZGUgclx1MDBmNGxlDQotV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg9RGlhZ3JhbW1lIGRlIGRcdTAwZTlwZW5kYW5jZSBkZSBwcm9kdWl0IDoNCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1Dclx1MDBlOWVyIHVuIG5vdXZlYXUgZGVzY3JpcHRldXIgZGUgclx1MDBmNGxlDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXA9Q3JcdTAwZTllciB1biBub3V2ZWF1IGRlc2NyaXB0ZXVyIGRlIHRcdTAwZTJjaGUNCi1BY3R2aXRpdml0eURpYWdyYW1fRGVsaXZlcnlQcm9jZXNzX3RleHQ9UHJvY2Vzc3VzIGRlIGxpdnJhaXNvbg0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PVBhdHRlcm4gZGUgY2FwYWNpdFx1MDBlOQ0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg9UGhhc2UNCi1BY3R2aXRpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9SXRcdTAwZTlyYXRpb24NCi1BY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1BY3Rpdml0XHUwMGU5DQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PURlc2NyaXB0ZXVyIGRlIHByb2R1aXQNCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXA9Q3JcdTAwZTllciB1biBub3V2ZWF1IGRlc2NyaXB0ZXVyIGRlIHByb2R1aXQNCi0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9QWxpZ25lcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PUFjdHVhbGlzZXIgXHUwMGUwIHBhcnRpciBkZSBsJ2FjdGl2aXRcdTAwZTkgZGUgYmFzZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dD1NaXNlIGVuIGZvcm1lIGRlIGxhIHpvbmUgZGUgdGV4dGUuLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PUhvcml6b250YWxlbWVudCBwYXIgcmFwcG9ydCBcdTAwZTAgbGEgbW95ZW5uZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9SG9yaXpvbnRhbGVtZW50IHBhciByYXBwb3J0IGF1IHByZW1pZXIgXHUwMGU5bFx1MDBlOW1lbnQgc1x1MDBlOWxlY3Rpb25uXHUwMGU5DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WZXJ0aWNhbGVtZW50IHBhciByYXBwb3J0IFx1MDBlMCBsYSBtb3llbm5lDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWNhbGVtZW50IHBhciByYXBwb3J0IGF1IHByZW1pZXIgXHUwMGU5bFx1MDBlOW1lbnQgc1x1MDBlOWxlY3Rpb25uXHUwMGU5DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1TYXV2ZWdhcmRlcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9U2F1dmVnYXJkZSBkZSB7MH0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9RFx1MDBlOXBsYWNlciB1biBub2V1ZA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZT1BY3R1YWxpc2VyIFx1MDBlMCBwYXJ0aXIgZGUgbGEgYmFzZQ0KLUFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlPUNyXHUwMGU5ZXIgdW4gcG9pbnQgZCdpbmZsXHUwMGU5Y2hpc3NlbWVudA0KLQ0KLUFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9T3V2cmlyIHVuIGRpYWdyYW1tZSBkXHUwMGU5dGFpbGxcdTAwZTkgZCdhY3Rpdml0XHUwMGU5DQotcmVmcmVzaEFjdGlvbl9sYWJlbD1BY3R1YWxpc2VyDQotcmVmcmVzaEZyb21CYXNlQ21kX2xhYmVsPUFjdHVhbGlzZXIgXHUwMGUwIHBhcnRpciBkZSBsYSBiYXNlDQotZGlhZ3JhbV9zYXZlRXJyb3I9SVVQRDAwMDFXIDogRWNoZWMgZGUgc2F1dmVnYXJkZSBkdSBkaWFncmFtbWUNCi0NCi1EZWxldGVEaWFncmFtX3RleHQ9U3VwcHJpbWVyIGxlIGRpYWdyYW1tZQ0KLURlbGV0ZURpYWdyYW1fcHJvbXB0PUV0ZXMtdm91cyBzXHUwMGZiciBkZSB2b3Vsb2lyIGZlcm1lciBldCBzdXBwcmltZXIgY2UgZGlhZ3JhbW1lID9cbkNlIGNoYW5nZW1lbnQgZXN0IGRcdTAwZTlmaW5pdGlmIGV0IG5lIHBldXQgcGFzIFx1MDBlYXRyZSBhbm51bFx1MDBlOS4NCi1hbGlnbl9iZW5kX3BvaW50X3RleHQ9QWxpZ25lciBsZSBwb2ludCBkJ2luZmxcdTAwZTljaGlzc2VtZW50DQotQ29uZmlndXJhdGlvbkVkaXRvcklucHV0X2NvbmZpZ2VkaXRvcjA9RWRpdGV1ciBkZSBjb25maWd1cmF0aW9uDQotZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnPUVycmV1ciBkYW5zIGxhIHZhbGV1ciBkZSBwcm9wcmlcdTAwZTl0XHUwMGU5IGR1IG5vZXVkLg0KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA9RXJyZXVyDQotDQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PVJcdTAwZTlpbml0aWFsaXNlciBsYSBkaXNwb3NpdGlvbiBkdSBkaWFncmFtbWUNCi1lcnJvckRpYWxvZ190aXRsZT1FcnJldXINCi1jb21tYW5kX2Nhbm5vdEVkaXQ9SVVQRDAwMDNFIDogSW1wb3NzaWJsZSBkZSBtb2RpZmllciBsZSBkaWFncmFtbWUNCi0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGl0bGU9RWRpdGV1ciBwYXJlbnQgZmVybVx1MDBlOQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0PXswfSBzJydlc3QgZmVybVx1MDBlOS4gVm91bGV6LXZvdXMgXHUwMGU5Z2FsZW1lbnQgZmVybWVyIHsxfSA/DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViOGRhZWUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXByZXZpb3VzX25hbWVfbnVsbDE9Tm9uIFx1MDBlOCBwb3NzaWJpbGUgYW5udWxsYXJlIGxhIG1vZGlmaWNhIGRlbCBub21lIHNlIGlsIG5vbWUgcHJlY2VkZW50ZSBcdTAwZTggbnVsbG8uDQotZXJyX25hbWVfZW1wdHk9SWwgbm9tZSBub24gcHVcdTAwZjIgZXNzZXJlIHZ1b3RvLiBTcGVjaWZpY2FyZSB1biBub21lIHZhbGlkby4NCi1tb3ZlQWN0aW9uX2xhYmVsPVNwb3N0YQ0KLQ0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dD1TZWxlemlvbmENCi1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXA9U2VsZXppb25hIG5vZG8gb3BwdXJlIGNvbGxlZ2FtZW50bw0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPUFnZ2l1bmdpIG5vZG8NCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnPUlYUkQwMDAyVzogQWdnaXVudGEgZGVsIG5vZG8gYWwgZGlhZ3JhbW1hIG5vbiByaXVzY2l0YQ0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQ9Q29sbGVnYW1lbnRvDQotQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0PVNlbGV6aW9uYSBjb2xsZWdhbWVudG8NCi1BYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwPUNyZWEgdW4gbnVvdm8gY29sbGVnYW1lbnRvDQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0PU5vZG8gaW5pemlhbGUNCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9Q3JlYSB1biBudW92byBub2RvDQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ9VGVzdG8gbGliZXJvDQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXA9Q3JlYSBudW92byB0ZXN0byBsaWJlcm8NCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0PUJhcnJhIGRpIHNpbmNyb25penphemlvbmUNCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwPUNyZWEgdW5hIG51b3ZhIGJhcnJhIGRpIHNpbmNyb25penphemlvbmUNCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQ9Tm9kbyBkaSBkZWNpc2lvbmUNCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA9Q3JlYSB1biBudW92byBkZWNpc2lvbmUNCi1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0PU5vZG8gZmluYWxlDQotQWN0aXZpdHlEZXRhaWxEaWFncmFtX3ByZWZpeD1EZXR0YWdsaSBhdHRpdml0XHUwMGUwOg0KLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXA9Q3JlYSB1biBudW92byBub2RvIGZpbmFsZQ0KLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0PUF0dGl2aXRcdTAwZTANCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcD1DcmVhIHVuYSBudW92YSBhdHRpdml0XHUwMGUwDQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhemlvbmUNCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXA9Q3JlYSB1bmEgbnVvdmEgaXRlcmF6aW9uZQ0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0PUZhc2UNCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcD1DcmVhIHVuYSBudW92YSBmYXNlDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9RGVzY3JpdHRvcmUgZGkgb3BlcmF6aW9uaQ0KLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90ZXh0PURlc2NyaXR0b3JlIGRpIHJ1b2xpDQotV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg9RGlhZ3JhbW1hIGRpcGVuZGVuemUgcHJvZG90dG8gZGkgbGF2b3JvOg0KLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90b29sdGlwPUNyZWEgdW4gbnVvdm8gZGVzY3JpdHRvcmUgZGkgcnVvbGkNCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcD1DcmVhIHVuIG51b3ZvIGRlc2NyaXR0b3JlIGRpIG9wZXJhemlvbmkNCi1BY3R2aXRpdml0eURpYWdyYW1fRGVsaXZlcnlQcm9jZXNzX3RleHQ9UHJvY2Vzc28gZGkgcHJvZHV6aW9uZQ0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PU1vZGVsbG8gZGkgY2FwYWNpdFx1MDBlMA0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg9RmFzZQ0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1JdGVyYXppb25lDQotQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9QXR0aXZpdFx1MDBlMA0KLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dD1EZXNjcml0dG9yZSBkaSBwcm9kb3R0aSBkaSBsYXZvcm8NCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXA9Q3JlYSB1biBudW92byBkZXNjcml0dG9yZSBkaSBwcm9kb3R0aSBkaSBsYXZvcmkNCi0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9QWxsaW5lYQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PUFnZ2lvcm5hIGRhIGF0dGl2aXRcdTAwZTAgZGkgYmFzZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dD1Gb3JtYXRvIGNhc2VsbGEgZGkgdGVzdG8uLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PU9yaXp6b250YWxtZW50ZSBhIGNvb3JkLiBtZWRpZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9T3JpenpvbnRhbG1lbnRlIGEgcHJpbWUgY29vcmQuIHNlbGV6aW9uYXRlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WZXJ0aWNhbG1lbnRlIGEgY29vcmQuIG1lZGllDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWNhbG1lbnRlIGEgcHJpbWUgY29vcmQuIHNlbGV6aW9uYXRlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1TYWx2YQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9U2FsdmF0YWdnaW8gZGkgezB9DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPVNwb3N0YSBub2RvDQotQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlPUFnZ2lvcm5hIGRhIGJhc2UNCi1BYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZT1DcmVhIGJlbmRwb2ludA0KLQ0KLUFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9QXByaSBkaWFncmFtbWEgZGV0dGFnbGkgYXR0aXZpdFx1MDBlMA0KLXJlZnJlc2hBY3Rpb25fbGFiZWw9QWdnaW9ybmENCi1yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw9QWdnaW9ybmEgZGEgYmFzZQ0KLWRpYWdyYW1fc2F2ZUVycm9yPUlVUEQwMDAxVzogU2FsdmF0YWdnaW8gZGVsIGRpYWdyYW1tYSBub24gcml1c2NpdG8NCi0NCi1EZWxldGVEaWFncmFtX3RleHQ9RWxpbWluYSBkaWFncmFtbWENCi1EZWxldGVEaWFncmFtX3Byb21wdD1DaGl1ZGVyZSBlZCBlbGltaW5hcmUgcXVlc3RvIGRpYWdyYW1tYT9cblF1ZXN0YSBtb2RpZmljYSBcdTAwZTggcGVybWFuZW50ZSBlIG5vbiBwdVx1MDBmMiBlc3NlcmUgYW5udWxsYXRhLg0KLWFsaWduX2JlbmRfcG9pbnRfdGV4dD1BbGxpbmVhIGJlbmRwb2ludA0KLUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwPUVkaXRvciBkaSBjb25maWd1cmF6aW9uaQ0KLWRpYWdyYW1fbm9kZV9wcm9wZXJ0eV92YWx1ZV9wcm9ibGVtX21zZz1FcnJvcmUgbmVsIHZhbG9yZSBkZWwgbm9kby4NCi1kaWFncmFtX2Vycm9yRGlhbG9nX3RpdGxlX3RleHQwPUVycm9yZQ0KLQ0KLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcl9SZXNldERpYWdyYW1MYXlvdXRfdGV4dD1SaXByaXN0aW5hIGxheW91dCBkaWFncmFtbWENCi1lcnJvckRpYWxvZ190aXRsZT1FcnJvcmUNCi1jb21tYW5kX2Nhbm5vdEVkaXQ9SVVQRDAwMDNFOiBJbXBvc3NpYmlsZSBtb2RpZmljYXJlIGlsIGRpYWdyYW1tYQ0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90aXRsZT1FZGl0b3IgcGFyZW50IGNoaXVzbw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0PXswfSBjaGl1c28uIENoaXVkZXJlIGFuY2hlIHsxfT8NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjc5NzQ0Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcHJldmlvdXNfbmFtZV9udWxsMT1cdTUyNGRcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNGNcdTMwY2NcdTMwZWJcdTMwNjdcdTMwNDJcdTMwOGJcdTU4MzRcdTU0MDhcdTMwMDFcdTU0MGRcdTUyNGRcdTMwNmVcdTU5MDlcdTY2ZjRcdTMwNmZcdTUzZDZcdTMwOGFcdTZkODhcdTMwNWJcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1lcnJfbmFtZV9lbXB0eT1cdTU0MGRcdTUyNGRcdTMwOTJcdTdhN2FcdTMwNmJcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgXHU2NzA5XHU1MmI5XHUzMDZhXHU1NDBkXHU1MjRkXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotbW92ZUFjdGlvbl9sYWJlbD1cdTc5ZmJcdTUyZDUNCi0NCi1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3RleHQ9XHU5MDc4XHU2MjllDQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwPVx1MzBjZVx1MzBmY1x1MzBjOVx1MzA3ZVx1MzA1Zlx1MzA2Zlx1MzBlYVx1MzBmM1x1MzBhZlx1MzA2ZVx1OTA3OFx1NjI5ZQ0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPVx1MzBjZVx1MzBmY1x1MzBjOVx1MzA2ZVx1OGZmZFx1NTJhMA0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX2Vycl9tc2c9SVhSRDAwMDJXOiBcdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTBcdTMwNzhcdTMwNmVcdTMwY2VcdTMwZmNcdTMwYzlcdTMwNmVcdThmZmRcdTUyYTBcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYNCi1BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0PVx1MzBlYVx1MzBmM1x1MzBhZg0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3NlbGVjdD1cdTMwZWFcdTMwZjNcdTMwYWZcdTMwNmVcdTkwNzhcdTYyOWUNCi1BYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwPVx1MzBlYVx1MzBmM1x1MzBhZlx1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLUFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdGV4dD1cdTMwY2VcdTMwZmNcdTMwYzlcdTMwNmVcdTk1OGJcdTU5Y2INCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9XHU5NThiXHU1OWNiXHUzMGNlXHUzMGZjXHUzMGM5XHUzMDZlXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwDQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ9XHUzMGQ1XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4DQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXA9XHUzMGQ1XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dD1cdTU0MGNcdTY3MWZcdTMwZDBcdTMwZmMNCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwPVx1NTQwY1x1NjcxZlx1MzBkMFx1MzBmY1x1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dD1cdTZjN2FcdTViOWFcdTMwY2VcdTMwZmNcdTMwYzkNCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA9XHU2YzdhXHU1YjlhXHUzMGNlXHUzMGZjXHUzMGM5XHUzMDZlXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwDQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dD1cdTdkNDJcdTRlODZcdTMwY2VcdTMwZmNcdTMwYzkNCi1BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4PVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1OGE3M1x1N2QzMDoNCi1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwPVx1N2Q0Mlx1NGU4Nlx1MzBjZVx1MzBmY1x1MzBjOVx1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0PVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmYw0KLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90b29sdGlwPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1cdTUzY2RcdTVmYTkNCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXA9XHU1M2NkXHU1ZmE5XHUzMDZlXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwDQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQ9XHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGJhDQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXA9XHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGJhXHUzMDZlXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9XHUzMGJmXHUzMGI5XHUzMGFmXHU4YTE4XHU4ZmYwXHU1YjUwDQotQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3RleHQ9XHUzMGVkXHUzMGZjXHUzMGViXHU4YTE4XHU4ZmYwXHU1YjUwDQotV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyXHU1NmYzOg0KLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90b29sdGlwPVx1MzBlZFx1MzBmY1x1MzBlYlx1OGExOFx1OGZmMFx1NWI1MFx1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLUFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwPVx1MzBiZlx1MzBiOVx1MzBhZlx1OGExOFx1OGZmMFx1NWI1MFx1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1cdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1BY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1cdTMwYjFcdTMwZmNcdTMwZDFcdTMwZDNcdTMwZWFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjMNCi1BY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4PVx1MzBkNVx1MzBhN1x1MzBmY1x1MzBiYQ0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1cdTUzY2RcdTVmYTkNCi1BY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmMNCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwDQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1OGExOFx1OGZmMFx1NWI1MFx1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1cdThhYmZcdTY1NzQNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1cdTU3ZmFcdTY3MmNcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwNGJcdTMwODlcdTMwNmVcdTY2ZjRcdTY1YjANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9XHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGZiXHUzMGRjXHUzMGMzXHUzMGFmXHUzMGI5XHUzMDZlXHUzMGQ1XHUzMGE5XHUzMGZjXHUzMGRlXHUzMGMzXHUzMGM4Li4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1cdTVlNzNcdTU3NDdcdTMwNmJcdTViZmVcdTMwNTdcdTMwNjZcdTZjMzRcdTVlNzNcdTMwNmJcdTkxNGRcdTdmNmUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVx1NjcwMFx1NTIxZFx1MzA2ZVx1OTA3OFx1NjI5ZVx1MzA2Ylx1NWJmZVx1MzA1N1x1MzA2Nlx1NmMzNFx1NWU3M1x1MzA2Ylx1OTE0ZFx1N2Y2ZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9XHU1ZTczXHU1NzQ3XHUzMDZiXHU1YmZlXHUzMDU3XHUzMDY2XHU1NzgyXHU3NmY0XHUzMDZiXHU5MTRkXHU3ZjZlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdTY3MDBcdTUyMWRcdTMwNmVcdTkwNzhcdTYyOWVcdTMwNmJcdTViZmVcdTMwNTdcdTMwNjZcdTU3ODJcdTc2ZjRcdTMwNmJcdTkxNGRcdTdmNmUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVx1NGZkZFx1N2JhMQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9ezB9IFx1MzA5Mlx1NGZkZFx1N2JhMVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1cdTMwY2VcdTMwZmNcdTMwYzlcdTMwNmVcdTc5ZmJcdTUyZDUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JyZWZyZXNoZnJvbWJhc2U9XHU1N2ZhXHU2NzJjXHUzMDRiXHUzMDg5XHUzMDZlXHU2NmY0XHU2NWIwDQotQWJzdHJhY3REaWFncmFtX0JlbmRQb2ludF9jcmVhdGU9XHUzMGQ5XHUzMGYzXHUzMGM5XHUzMGZiXHUzMGRkXHUzMGE0XHUzMGYzXHUzMGM4XHUzMDZlXHU0ZjVjXHU2MjEwDQotDQotQWN0aXZpdHlEaWFncmFtX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdThhNzNcdTdkMzBcdTU2ZjNcdTMwOTJcdTk1OGJcdTMwNGYNCi1yZWZyZXNoQWN0aW9uX2xhYmVsPVx1NjZmNFx1NjViMA0KLXJlZnJlc2hGcm9tQmFzZUNtZF9sYWJlbD1cdTU3ZmFcdTY3MmNcdTMwNGJcdTMwODlcdTMwNmVcdTY2ZjRcdTY1YjANCi1kaWFncmFtX3NhdmVFcnJvcj1JVVBEMDAwMVc6IFx1MzBjMFx1MzBhNFx1MzBhMlx1MzBiMFx1MzBlOVx1MzBlMFx1MzA2ZVx1NGZkZFx1N2JhMVx1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zg0KLQ0KLURlbGV0ZURpYWdyYW1fdGV4dD1cdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTBcdTMwNmVcdTUyNGFcdTk2NjQNCi1EZWxldGVEaWFncmFtX3Byb21wdD1cdTMwNTNcdTMwNmVcdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTBcdTMwOTJcdTk1ODlcdTMwNThcdTMwNjZcdTUyNGFcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/XG5cdTMwNTNcdTMwNmVcdTU5MDlcdTY2ZjRcdTMwNmZcdTZjMzhcdTdkOWFcdTc2ODRcdTMwNjdcdTMwMDFcdTUxNDNcdTMwNmJcdTYyM2JcdTMwNTlcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1hbGlnbl9iZW5kX3BvaW50X3RleHQ9XHUzMGQ5XHUzMGYzXHUzMGM5XHUzMGZiXHUzMGRkXHUzMGE0XHUzMGYzXHUzMGM4XHUzMDZlXHU4YWJmXHU2NTc0DQotQ29uZmlndXJhdGlvbkVkaXRvcklucHV0X2NvbmZpZ2VkaXRvcjA9XHU2OWNiXHU2MjEwXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjDQotZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnPVx1MzBjZVx1MzBmY1x1MzBjOVx1MzA2ZVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzBmY1x1NTAyNFx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMg0KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA9XHUzMGE4XHUzMGU5XHUzMGZjDQotDQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PVx1MzBjMFx1MzBhNFx1MzBhMlx1MzBiMFx1MzBlOVx1MzBlMFx1MzA2ZVx1MzBlY1x1MzBhNFx1MzBhMlx1MzBhNlx1MzBjOFx1MzA2ZVx1NTIxZFx1NjcxZlx1NTMxNg0KLWVycm9yRGlhbG9nX3RpdGxlPVx1MzBhOFx1MzBlOVx1MzBmYw0KLWNvbW1hbmRfY2Fubm90RWRpdD1JVVBEMDAwM0U6IFx1MzBjMFx1MzBhNFx1MzBhMlx1MzBiMFx1MzBlOVx1MzBlMFx1MzA5Mlx1N2RlOFx1OTZjNlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90aXRsZT1cdTg5YWFcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwNmVcdTMwYWZcdTMwZWRcdTMwZmNcdTMwYmENCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGV4dD17MH0gXHUzMDRjXHUzMGFmXHUzMGVkXHUzMGZjXHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIHsxfSBcdTMwODJcdTk1ODlcdTMwNThcdTMwN2VcdTMwNTlcdTMwNGI/DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwNzUzOWUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXByZXZpb3VzX25hbWVfbnVsbDE9XHVjNzc0XHVjODA0IFx1Yzc3NFx1Yjk4NFx1Yzc3NCBcdWIxMTAobnVsbClcdWM3N2MgXHVhY2JkXHVjNmIwIFx1Yzc3NFx1Yjk4NCBcdWJjYzBcdWFjYmQgXHVjMmU0XHVkNTg5IFx1Y2RlOFx1YzE4YyBcdWM4NzBcdWM3OTFcdWM3NzQgXHVkNWM4XHVjNmE5XHViNDE4XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi1lcnJfbmFtZV9lbXB0eT1cdWM3NzRcdWI5ODRcdWM3NDQgXHViZTQ0XHVjNmNjXHViNDU4IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YzYyY1x1YmMxNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLW1vdmVBY3Rpb25fbGFiZWw9XHVjNzc0XHViM2Q5DQotDQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0PVx1YzEyMFx1ZDBkZA0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcD1cdWIxNzhcdWI0ZGMgXHViNjEwXHViMjk0IFx1YjljMVx1ZDA2YyBcdWMxMjBcdWQwZGQNCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV90aXRsZT1cdWIxNzhcdWI0ZGMgXHVjZDk0XHVhYzAwDQotQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfZXJyX21zZz1JWFJEMDAwMlc6IFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOFx1YzVkMCBcdWIxNzhcdWI0ZGMgXHVjZDk0XHVhYzAwIFx1YzJlNFx1ZDMyOA0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQ9XHViOWMxXHVkMDZjDQotQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0PVx1YjljMVx1ZDA2YyBcdWMxMjBcdWQwZGQNCi1BYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwPVx1YzBjOCBcdWI5YzFcdWQwNmMgXHVjNzkxXHVjMTMxDQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0PVx1YzJkY1x1Yzc5MSBcdWIxNzhcdWI0ZGMNCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9XHVjMGM4IFx1YzJkY1x1Yzc5MSBcdWIxNzhcdWI0ZGMgXHVjNzkxXHVjMTMxDQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ9XHViZTQ0XHVjODE1XHVkNjE1IFx1ZDE0ZFx1YzJhNFx1ZDJiOA0KLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwPVx1YzBjOCBcdWJlNDRcdWM4MTVcdWQ2MTUgXHVkMTRkXHVjMmE0XHVkMmI4IFx1Yzc5MVx1YzEzMQ0KLUFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3RleHQ9XHViM2Q5XHVhZTMwXHVkNjU0IFx1ZDQ1Y1x1YzJkY1x1YzkwNA0KLUFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3Rvb2x0aXA9XHVjMGM4IFx1YjNkOVx1YWUzMFx1ZDY1NCBcdWQ0NWNcdWMyZGNcdWM5MDQgXHVjNzkxXHVjMTMxDQotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0PVx1YWNiMFx1YzgxNSBcdWIxNzhcdWI0ZGMNCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA9XHVjMGM4IFx1YWNiMFx1YzgxNSBcdWIxNzhcdWI0ZGMgXHVjNzkxXHVjMTMxDQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dD1cdWIwNWQgXHViMTc4XHViNGRjDQotQWN0aXZpdHlEZXRhaWxEaWFncmFtX3ByZWZpeD1cdWQ2NWNcdWIzZDkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkOg0KLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXA9XHVjMGM4IFx1YjA1ZCBcdWIxNzhcdWI0ZGMgXHVjNzkxXHVjMTMxDQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9XHVkNjVjXHViM2Q5DQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA9XHVjMGM4IFx1ZDY1Y1x1YjNkOSBcdWM3OTFcdWMxMzENCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9XHViYzE4XHViY2Y1DQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwPVx1YzBjOCBcdWJjMThcdWJjZjUgXHVjNzkxXHVjMTMxDQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQ9XHViMmU4XHVhY2M0DQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXA9XHVjMGM4IFx1YjJlOFx1YWNjNCBcdWM3OTFcdWMxMzENCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dD1cdWQwYzBcdWMyYTRcdWQwNmMgXHVjMTI0XHViYTg1XHVjNzkwDQotQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3RleHQ9XHVjNWVkXHVkNTYwIFx1YzEyNFx1YmE4NVx1Yzc5MA0KLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjODg1XHVjMThkXHVjMTMxIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhODoNCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1cdWMwYzggXHVjNWVkXHVkNTYwIFx1YzEyNFx1YmE4NVx1Yzc5MCBcdWM3OTFcdWMxMzENCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcD1cdWMwYzggXHVkMGMwXHVjMmE0XHVkMDZjIFx1YzEyNFx1YmE4NVx1Yzc5MCBcdWM3OTFcdWMxMzENCi1BY3R2aXRpdml0eURpYWdyYW1fRGVsaXZlcnlQcm9jZXNzX3RleHQ9XHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNA0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PVx1YWUzMFx1YjJhNSBcdWQzMjhcdWQxMzQNCi1BY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4PVx1YjJlOFx1YWNjNA0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1cdWJjMThcdWJjZjUNCi1BY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1cdWQ2NWNcdWIzZDkNCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWMxMjRcdWJhODVcdWM3OTANCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXA9XHVjMGM4IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjMTI0XHViYTg1XHVjNzkwIFx1Yzc5MVx1YzEzMQ0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1cdWI5ZGVcdWNkOTRcdWFlMzANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1cdWFlMzBcdWJjZjggXHVkNjVjXHViM2Q5XHVjNWQwXHVjMTFjIFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWFlMzANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9XHVkNjE1XHVjMmRkIFx1ZDE0ZFx1YzJhNFx1ZDJiOCBcdWMwYzFcdWM3OTAuLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVx1ZDNjOVx1YWRlMFx1YzVkMCBcdWI5ZGVcdWNkYjAgXHVhYzAwXHViODVjXHViODVjDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdWNjOThcdWM3NGMgXHVjMTIwXHVkMGRkXHVjMGFjXHVkNTZkXHVjNWQwIFx1YjlkZVx1Y2RiMCBcdWFjMDBcdWI4NWNcdWI4NWMNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVx1ZDNjOVx1YWRlMFx1YzVkMCBcdWI5ZGVcdWNkYjAgXHVjMTM4XHViODVjXHViODVjDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdWNjOThcdWM3NGMgXHVjMTIwXHVkMGRkXHVjMGFjXHVkNTZkXHVjNWQwIFx1YjlkZVx1Y2RiMCBcdWMxMzhcdWI4NWNcdWI4NWMNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVx1YzgwMFx1YzdhNQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9ezB9IFx1YzgwMFx1YzdhNSBcdWM5MTENCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9XHViMTc4XHViNGRjIFx1Yzc3NFx1YjNkOQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZT1cdWFlMzBcdWJjZjhcdWM1ZDBcdWMxMWMgXHVjMGM4XHViODVjIFx1YWNlMFx1Y2U1OFx1YWUzMA0KLUFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlPVx1YWQ3NFx1YWNlMVx1YzgxMCBcdWM3OTFcdWMxMzENCi0NCi1BY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PVx1ZDY1Y1x1YjNkOSBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmQgXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1YzVmNFx1YWUzMA0KLXJlZnJlc2hBY3Rpb25fbGFiZWw9XHVjMGM4XHViODVjIFx1YWNlMFx1Y2U1OFx1YWUzMA0KLXJlZnJlc2hGcm9tQmFzZUNtZF9sYWJlbD1cdWFlMzBcdWJjZjhcdWM1ZDBcdWMxMWMgXHVjMGM4XHViODVjIFx1YWNlMFx1Y2U1OFx1YWUzMA0KLWRpYWdyYW1fc2F2ZUVycm9yPUlVUEQwMDAxVzogXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1YzgwMFx1YzdhNSBcdWMyZTRcdWQzMjgNCi0NCi1EZWxldGVEaWFncmFtX3RleHQ9XHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1YzBhZFx1YzgxYw0KLURlbGV0ZURpYWdyYW1fcHJvbXB0PVx1Yzc3NCBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YThcdWM3NDQgXHViMmViXHVhY2UwIFx1YzBhZFx1YzgxY1x1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz9cblx1Yzc3NCBcdWJjYzBcdWFjYmRcdWM3NDAgXHVjNjAxXHVhZDZjXHVjODAxXHVjNzc0XHViYmMwXHViODVjIFx1YzJlNFx1ZDU4OSBcdWNkZThcdWMxOGNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1hbGlnbl9iZW5kX3BvaW50X3RleHQ9XHVhZDc0XHVhY2UxXHVjODEwIFx1YjlkZVx1Y2Q5NFx1YWUzMA0KLUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwPVx1YWQ2Y1x1YzEzMSBcdWQzYjhcdWM5ZDFcdWFlMzANCi1kaWFncmFtX25vZGVfcHJvcGVydHlfdmFsdWVfcHJvYmxlbV9tc2c9XHViMTc4XHViNGRjIFx1ZDJiOVx1YzEzMSBcdWFjMTIgXHVjNjI0XHViOTU4Lg0KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA9XHVjNjI0XHViOTU4IA0KLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcl9SZXNldERpYWdyYW1MYXlvdXRfdGV4dD1cdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHViODA4XHVjNzc0XHVjNTQ0XHVjNmMzIFx1YzdhY1x1YzEyNFx1YzgxNQ0KLWVycm9yRGlhbG9nX3RpdGxlPVx1YzYyNFx1Yjk1OA0KLWNvbW1hbmRfY2Fubm90RWRpdD1JVVBEMDAwM0U6IFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOFx1Yzc0NCBcdWQzYjhcdWM5ZDFcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1Yzc0Yw0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90aXRsZT1cdWMwYzFcdWM3MDQgXHVkM2I4XHVjOWQxXHVhZTMwIFx1YjJlYlx1ZDc5OA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0PXswfVx1Yzc3NChcdWFjMDApIFx1YjJlYlx1ZDYxNFx1YzJiNVx1YjJjOFx1YjJlNC4gezF9XHViM2M0IFx1YjJlYlx1YzczY1x1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWYyZDFhOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcHJldmlvdXNfbmFtZV9udWxsMT1OXHUwMGUzbyBcdTAwZTkgcGVybWl0aWRvIGRlc2ZhemVyIHVtYSBhbHRlcmFcdTAwZTdcdTAwZTNvIGRlIG5vbWUgc2UgbyBub21lIGFudGVyaW9yIGZvciBudWxvLg0KLWVycl9uYW1lX2VtcHR5PU8gbm9tZSBuXHUwMGUzbyBwb2RlIGVzdGFyIHZhemlvLiBFc3BlY2lmaXF1ZSB1bSBub21lIHZcdTAwZTFsaWRvLg0KLW1vdmVBY3Rpb25fbGFiZWw9TW92ZXINCi0NCi1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3RleHQ9U2VsZWNpb25hcg0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcD1TZWxlY2lvbmFyIG5cdTAwZjMgb3UgbGluaw0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPUluY2x1aXIgTlx1MDBmMw0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX2Vycl9tc2c9SVhSRDAwMDJXOiBBIGluY2x1c1x1MDBlM28gZGUgdW0gblx1MDBmMyBubyBkaWFncmFtYSBmYWxob3UNCi1BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0PUxpbmsNCi1BYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3Q9U2VsZWNpb25hciBMaW5rDQotQWJzdHJhY3REaWFncmFtX0xpbmtfdG9vbHRpcD1DcmlhciBub3ZvIExpbmsNCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQ9Tlx1MDBmMyBkZSBJblx1MDBlZGNpbw0KLUFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcD1DcmlhciBOb3ZvIE5cdTAwZjMgZGUgSW5cdTAwZWRjaW8NCi1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dD1UZXh0byBMaXZyZQ0KLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwPUNyaWFyIE5vdm8gVGV4dG8gTGl2cmUNCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0PUJhcnJhIGRlIFNpbmNyb25pemFcdTAwZTdcdTAwZTNvDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcD1DcmlhciBOb3ZhIEJhcnJhIGRlIFNpbmNyb25pemFcdTAwZTdcdTAwZTNvDQotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0PU5cdTAwZjMgZGUgRGVjaXNcdTAwZTNvDQotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwPUNyaWFyIE5vdm8gTlx1MDBmMyBkZSBEZWNpc1x1MDBlM28NCi1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0PU5cdTAwZjMgZGUgRXh0cmVtaWRhZGUNCi1BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4PURldGFsaGUgZG8gQWN0aXZpdHk6DQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcD1DcmlhciBOb3ZvIE5cdTAwZjMgZGUgRXh0cmVtaWRhZGUNCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1BdGl2aWRhZGUNCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcD1DcmlhciBOb3ZhIEF0aXZpZGFkZQ0KLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1JdGVyYVx1MDBlN1x1MDBlM28NCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXA9Q3JpYXIgTm92YSBJdGVyYVx1MDBlN1x1MDBlM28NCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dD1GYXNlDQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXA9Q3JpYXIgTm92YSBGYXNlDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9RGVzY3JpdG9yIGRlIFRhcmVmYXMNCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdGV4dD1EZXNjcml0b3IgZGEgRnVuXHUwMGU3XHUwMGUzbw0KLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PURpYWdyYW1hIGRlIERlcGVuZFx1MDBlYW5jaWEgZGUgUHJvZHV0byBkZSBUcmFiYWxobzoNCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1DcmlhciBOb3ZvIERlc2NyaXRvciBkZSBGdW5cdTAwZTdcdTAwZTNvDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXA9Q3JpYXIgTm92byBEZXNjcml0b3IgZGUgVGFyZWZhDQotQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PVByb2Nlc3NvIGRlIEVudHJlZ2ENCi1BY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1QYWRyXHUwMGUzbyBkZSBSZWN1cnNvDQotQWN0dml0aXZpdHlEaWFncmFtX1BoYXNlX3RleD1GYXNlDQotQWN0dml0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhXHUwMGU3XHUwMGUzbw0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0PUF0aXZpZGFkZQ0KLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dD1EZXNjcml0b3IgZG8gUHJvZHV0byBkZSBUcmFiYWxobw0KLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcD1DcmlhciBOb3ZvIERlc2NyaXRvciBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0PUFsaW5oYXINCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1BdHVhbGl6YXIgYSBwYXJ0aXIgZGEgQXRpdmlkYWRlIGRlIEJhc2UNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9Rm9ybWF0YXIgQ2FpeGEgZGUgVGV4dG8uLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PUhvcml6b250YWxtZW50ZSBwYXJhIGEgTVx1MDBlOWRpYQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9SG9yaXpvbnRhbG1lbnRlIHBhcmEgbyBQcmltZWlybyBTZWxlY2lvbmFkbw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9VmVydGljYWxtZW50ZSBwYXJhIGEgTVx1MDBlOWRpYQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9VmVydGljYWxtZW50ZSBwYXJhIG8gUHJpbWVpcm8gU2VsZWNpb25hZG8NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVNhbHZhcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9U2FsdmFuZG8gezB9DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPU1vdmVyIE5cdTAwZjMNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JyZWZyZXNoZnJvbWJhc2U9QXR1YWxpemFyIGEgUGFydGlyIGRhIEJhc2UNCi1BYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZT1DcmlhciBQb250byBkZSBDdXJ2YXR1cmENCi0NCi1BY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PUFicmlyIERpYWdyYW1hIGRlIERldGFsaGVzIGRlIEF0aXZpZGFkZXMNCi1yZWZyZXNoQWN0aW9uX2xhYmVsPUF0dWFsaXphcg0KLXJlZnJlc2hGcm9tQmFzZUNtZF9sYWJlbD1BdHVhbGl6YXIgYSBQYXJ0aXIgZGEgQmFzZQ0KLWRpYWdyYW1fc2F2ZUVycm9yPUlVUEQwMDAxVzogT2NvcnJldSB1bWEgZmFsaGEgYW8gc2FsdmFyIG8gZGlhZ3JhbWENCi0NCi1EZWxldGVEaWFncmFtX3RleHQ9RXhjbHVpciBEaWFncmFtYQ0KLURlbGV0ZURpYWdyYW1fcHJvbXB0PVRlciBjZXJ0ZXphIGRlIHF1ZSBxdWVyIGZlY2hhciBlIGV4Y2x1aXIgZXN0ZSBkaWFncmFtYT9cbkVzdGEgYWx0ZXJhXHUwMGU3XHUwMGUzbyBcdTAwZTkgcGVybWFuZW50ZSBlIG5cdTAwZTNvIHBvZGUgc2VyIGRlc2ZlaXRhLg0KLWFsaWduX2JlbmRfcG9pbnRfdGV4dD1BbGluaGFyIFBvbnRvIGRlIEN1cnZhdHVyYQ0KLUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwPUVkaXRvciBkZSBDb25maWd1cmFcdTAwZTdcdTAwZTNvDQotZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnPUVycm8gbm8gdmFsb3IgZGEgcHJvcHJpZWRhZGUgZG8gblx1MDBmMy4NCi1kaWFncmFtX2Vycm9yRGlhbG9nX3RpdGxlX3RleHQwPUVycm8NCi1BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JfUmVzZXREaWFncmFtTGF5b3V0X3RleHQ9UmVjb25maWd1cmFyIExheW91dCBkbyBEaWFncmFtYQ0KLWVycm9yRGlhbG9nX3RpdGxlPUVycm8NCi1jb21tYW5kX2Nhbm5vdEVkaXQ9SVVQRDAwMDNFOiBOXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCBlZGl0YXIgbyBkaWFncmFtYQ0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90aXRsZT1FZGl0b3IgUGFpIEZlY2hhZG8NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGV4dD1PIHswfSBmb2kgZmVjaGFkby4gRGVzZWphIGZlY2hhciB7MX0/DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzNTNmZTMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXByZXZpb3VzX25hbWVfbnVsbDE9XHU1OTgyXHU2NzljXHU1MTQ4XHU1MjRkXHU3Njg0XHU1NDBkXHU3OWYwXHU0ZTNhXHU3YTdhXHVmZjBjXHU1MjE5XHU0ZTBkXHU1MTQxXHU4YmI4XHU2NGE0XHU2ZDg4XHU1NDBkXHU3OWYwXHU2NmY0XHU2NTM5XHUzMDAyDQotZXJyX25hbWVfZW1wdHk9XHU1NDBkXHU3OWYwXHU0ZTBkXHU4MGZkXHU0ZTNhXHU3YTdhXHUzMDAyXHU4YmY3XHU2MzA3XHU1YjlhXHU2NzA5XHU2NTQ4XHU1NDBkXHU3OWYwXHUzMDAyDQotbW92ZUFjdGlvbl9sYWJlbD1cdTc5ZmJcdTUyYTgNCi0NCi1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3RleHQ9XHU5MDA5XHU2MmU5DQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwPVx1OTAwOVx1NjJlOVx1ODI4Mlx1NzBiOVx1NjIxNlx1OTRmZVx1NjNhNQ0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPVx1NmRmYlx1NTJhMFx1ODI4Mlx1NzBiOQ0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX2Vycl9tc2c9SVhSRDAwMDJXOiBcdTVjMDZcdTgyODJcdTcwYjlcdTZkZmJcdTUyYTBcdTUyMzBcdTU2ZmVcdTU5MzFcdThkMjUNCi1BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0PVx1OTRmZVx1NjNhNQ0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3NlbGVjdD1cdTkwMDlcdTYyZTlcdTk0ZmVcdTYzYTUNCi1BYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwPVx1NTIxYlx1NWVmYVx1NjViMFx1OTRmZVx1NjNhNQ0KLUFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdGV4dD1cdTU0MmZcdTUyYThcdTgyODJcdTcwYjkNCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9XHU1MjFiXHU1ZWZhXHU2NWIwXHU1NDJmXHU1MmE4XHU4MjgyXHU3MGI5DQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ9XHU4MWVhXHU3NTMxXHU2NTg3XHU2NzJjDQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXA9XHU1MjFiXHU1ZWZhXHU2NWIwXHU3Njg0XHU4MWVhXHU3NTMxXHU2NTg3XHU2NzJjDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dD1cdTU0MGNcdTZiNjVcdTY3NjENCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwPVx1NTIxYlx1NWVmYVx1NjViMFx1NTQwY1x1NmI2NVx1Njc2MQ0KLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dD1cdTUxYjNcdTdiNTZcdTgyODJcdTcwYjkNCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA9XHU1MjFiXHU1ZWZhXHU2NWIwXHU1MWIzXHU3YjU2XHU4MjgyXHU3MGI5DQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dD1cdTdlZDNcdTY3NWZcdTgyODJcdTcwYjkNCi1BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4PVx1NmQzYlx1NTJhOFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1ZmYxYQ0KLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXA9XHU1MjFiXHU1ZWZhXHU2NWIwXHU3ZWQzXHU2NzVmXHU4MjgyXHU3MGI5DQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9XHU2ZDNiXHU1MmE4DQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA9XHU1MjFiXHU1ZWZhXHU2NWIwXHU2ZDNiXHU1MmE4DQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PVx1OGZlZFx1NGVlMw0KLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcD1cdTUyMWJcdTVlZmFcdTY1YjBcdThmZWRcdTRlZTMNCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dD1cdTk2MzZcdTZiYjUNCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcD1cdTUyMWJcdTVlZmFcdTY1YjBcdTk2MzZcdTZiYjUNCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dD1cdTRlZmJcdTUyYTFcdTYzY2ZcdThmZjBcdTdiMjYNCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdGV4dD1cdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTdiMjYNCi1Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtX3ByZWZpeD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTRmOWRcdThkNTZcdTUxNzNcdTdjZmJcdTU2ZmVcdWZmMWENCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1cdTUyMWJcdTVlZmFcdTY1YjBcdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTdiMjYNCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcD1cdTUyMWJcdTVlZmFcdTY1YjBcdTRlZmJcdTUyYTFcdTYzY2ZcdThmZjBcdTdiMjYNCi1BY3R2aXRpdml0eURpYWdyYW1fRGVsaXZlcnlQcm9jZXNzX3RleHQ9XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiDQotQWN0dml0aXZpdHlEaWFncmFtX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9XHU4MGZkXHU1MjliXHU2YTIxXHU1ZjBmDQotQWN0dml0aXZpdHlEaWFncmFtX1BoYXNlX3RleD1cdTk2MzZcdTZiYjUNCi1BY3R2aXRpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9XHU4ZmVkXHU0ZWUzDQotQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9XHU2ZDNiXHU1MmE4DQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NjNjZlx1OGZmMFx1N2IyNg0KLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcD1cdTUyMWJcdTVlZmFcdTY1YjBcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTYzY2ZcdThmZjBcdTdiMjYNCi0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9XHU1YmY5XHU5ZjUwDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9XHU0ZWNlXHU1N2ZhXHU2NzJjXHU2ZDNiXHU1MmE4XHU1MjM3XHU2NWIwDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0PVx1NjgzY1x1NWYwZlx1NjU4N1x1NjcyY1x1Njg0Ni4uLg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9XHU2YzM0XHU1ZTczXHU1YzQ1XHU0ZTJkXHU1YmY5XHU5ZjUwDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdTZjMzRcdTVlNzNcdTViZjlcdTlmNTBcdTdiMmNcdTRlMDBcdTRlMmFcdTkwMDlcdTViOWFcdTk4NzkNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVx1NTc4Mlx1NzZmNFx1NWM0NVx1NGUyZFx1NWJmOVx1OWY1MA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9XHU1NzgyXHU3NmY0XHU1YmY5XHU5ZjUwXHU3YjJjXHU0ZTAwXHU0ZTJhXHU5MDA5XHU1YjlhXHU5ODc5DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1cdTRmZGRcdTViNTgNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPVx1NmI2M1x1NTcyOFx1NGZkZFx1NWI1OCB7MH0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9XHU3OWZiXHU1MmE4XHU4MjgyXHU3MGI5DQotQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlPVx1NGVjZVx1NTdmYVx1NjcyY1x1NmQzYlx1NTJhOFx1NTIzN1x1NjViMA0KLUFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlPVx1NTIxYlx1NWVmYVx1NWYyZlx1NjZmMlx1NzBiOQ0KLQ0KLUFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9XHU2MjUzXHU1ZjAwXHU2ZDNiXHU1MmE4XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU1NmZlDQotcmVmcmVzaEFjdGlvbl9sYWJlbD1cdTUyMzdcdTY1YjANCi1yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw9XHU0ZWNlXHU1N2ZhXHU2NzJjXHU2ZDNiXHU1MmE4XHU1MjM3XHU2NWIwDQotZGlhZ3JhbV9zYXZlRXJyb3I9SVVQRDAwMDFXOiBcdTRmZGRcdTViNThcdTU2ZmVcdTU5MzFcdThkMjUNCi0NCi1EZWxldGVEaWFncmFtX3RleHQ9XHU1MjIwXHU5NjY0XHU1NmZlDQotRGVsZXRlRGlhZ3JhbV9wcm9tcHQ9XHU3ODZlXHU1YjllXHU4OTgxXHU1MTczXHU5NWVkXHU1ZTc2XHU1MjIwXHU5NjY0XHU2YjY0XHU1NmZlXHU1NDE3XHVmZjFmXG5cdTZiNjRcdTY2ZjRcdTY1MzlcdTVjMDZcdTY2MmZcdTZjMzhcdTRlNDVcdTc2ODRcdTRlMTRcdTY1ZTBcdTZjZDVcdTY0YTRcdTZkODhcdTMwMDINCi1hbGlnbl9iZW5kX3BvaW50X3RleHQ9XHU1YmY5XHU5ZjUwXHU1ZjJmXHU2NmYyXHU3MGI5DQotQ29uZmlndXJhdGlvbkVkaXRvcklucHV0X2NvbmZpZ2VkaXRvcjA9XHU5MTRkXHU3ZjZlXHU3ZjE2XHU4ZjkxXHU1NjY4DQotZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnPVx1ODI4Mlx1NzBiOVx1NzY4NFx1NWM1ZVx1NjAyN1x1NTAzY1x1NGUyZFx1NjcwOVx1OTUxOVx1OGJlZlx1MzAwMg0KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA9XHU5NTE5XHU4YmVmDQotDQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PVx1OTFjZFx1NjViMFx1OGJiZVx1N2Y2ZVx1NTZmZVx1NzY4NFx1NWUwM1x1NWM0MA0KLWVycm9yRGlhbG9nX3RpdGxlPVx1OTUxOVx1OGJlZg0KLWNvbW1hbmRfY2Fubm90RWRpdD1JVVBEMDAwM0U6IFx1NjVlMFx1NmNkNVx1N2YxNlx1OGY5MVx1NTZmZQ0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90aXRsZT1cdTcyMzZcdTdmMTZcdThmOTFcdTU2NjhcdTVkZjJcdTUxNzNcdTk1ZWQNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGV4dD17MH0gXHU1ZGYyXHU1MTczXHU5NWVkXHUzMDAyXHU4OTgxXHU1NDBjXHU2NWY2XHU1MTczXHU5NWVkIHsxfSBcdTU0MTdcdWZmMWYNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDdmMGQyMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcHJldmlvdXNfbmFtZV9udWxsMT1cdTU5ODJcdTY3OWNcdTUyNGRcdTRlMDBcdTUwMGJcdTU0MGRcdTdhMzFcdTY2MmZcdTdhN2FcdTUwM2NcdWZmMGNcdTUyNDdcdTRlMGRcdTUxNDFcdThhMzFcdTVmYTlcdTUzOWZcdTU0MGRcdTdhMzFcdThiOGFcdTY2ZjRcdTMwMDINCi1lcnJfbmFtZV9lbXB0eT1cdTU0MGRcdTdhMzFcdTRlMGRcdTgwZmRcdTdhN2FcdTc2N2RcdTMwMDJcdThhY2JcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTc2ODRcdTU0MGRcdTdhMzFcdTMwMDINCi1tb3ZlQWN0aW9uX2xhYmVsPVx1NzlmYlx1NTJkNQ0KLQ0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dD1cdTkwNzhcdTUzZDYNCi1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXA9XHU5MDc4XHU1M2Q2XHU3YmMwXHU5ZWRlXHU2MjE2XHU5M2M4XHU3ZDUwDQotQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfdGl0bGU9XHU2NWIwXHU1ODllXHU3YmMwXHU5ZWRlDQotQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfZXJyX21zZz1JWFJEMDAwMlc6IFx1NWMwN1x1N2JjMFx1OWVkZVx1NjViMFx1NTg5ZVx1ODFmM1x1NTcxNlx1ODllM1x1NTkzMVx1NjU1Nw0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQ9XHU5M2M4XHU3ZDUwDQotQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0PVx1OTA3OFx1NTNkNlx1OTNjOFx1N2Q1MA0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA9XHU1ZWZhXHU3YWNiXHU2NWIwXHU3Njg0XHU5M2M4XHU3ZDUwDQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0PVx1OGQ3N1x1NTljYlx1N2JjMFx1OWVkZQ0KLUFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcD1cdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdThkNzdcdTU5Y2JcdTdiYzBcdTllZGUNCi1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dD1cdTRlZmJcdTYxMGZcdTY1ODdcdTViNTcNCi1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcD1cdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTRlZmJcdTYxMGZcdTY1ODdcdTViNTcNCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0PVx1NTQwY1x1NmI2NVx1ODY1NVx1NzQwNlx1Njg3Zg0KLUFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3Rvb2x0aXA9XHU1ZWZhXHU3YWNiXHU2NWIwXHU3Njg0XHU1NDBjXHU2YjY1XHU4NjU1XHU3NDA2XHU2ODdmDQotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0PVx1NmM3YVx1N2I1Nlx1N2JjMFx1OWVkZQ0KLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcD1cdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTZjN2FcdTdiNTZcdTdiYzBcdTllZGUNCi1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0PVx1N2Q1MFx1Njc1Zlx1N2JjMFx1OWVkZQ0KLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg9XHU2ZDNiXHU1MmQ1XHU2NjBlXHU3ZDMwXHVmZjFhDQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcD1cdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTdkNTBcdTY3NWZcdTdiYzBcdTllZGUNCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1cdTZkM2JcdTUyZDUNCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcD1cdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTZkM2JcdTUyZDUNCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9XHU1M2NkXHU4OTg2DQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1NTNjZFx1ODk4Ng0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0PVx1OTY4ZVx1NmJiNQ0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1OTY4ZVx1NmJiNQ0KLUFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90ZXh0PVx1NGY1Y1x1Njk2ZFx1NjNjZlx1OGZmMFx1NWI1MA0KLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90ZXh0PVx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1NWI1MA0KLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NzZmOFx1NGY5ZFx1OTVkY1x1NGZjMlx1NTcxNlx1ZmYxYQ0KLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90b29sdGlwPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1NWI1MA0KLUFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1NGY1Y1x1Njk2ZFx1NjNjZlx1OGZmMFx1NWI1MA0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1cdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGINCi1BY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1cdTUyOWZcdTgwZmRcdTU3OGJcdTZhMjMNCi1BY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4PVx1OTY4ZVx1NmJiNQ0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1cdTUzY2RcdTg5ODYNCi1BY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1cdTZkM2JcdTUyZDUNCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU2M2NmXHU4ZmYwXHU1YjUwDQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NjNjZlx1OGZmMFx1NWI1MA0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1cdTVjMGRcdTlmNGENCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1cdTVmOWVcdTU3ZmFcdTY3MmNcdTZkM2JcdTUyZDVcdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDYNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9XHU2ODNjXHU1ZjBmXHU2NTg3XHU1YjU3XHU2ODQ2Li4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1cdTZjMzRcdTVlNzNcdTVjMGRcdTlmNGFcdTVlNzNcdTU3NDdcdTUwM2MNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVx1NmMzNFx1NWU3M1x1NWMwZFx1OWY0YVx1N2IyY1x1NGUwMFx1NTAwYlx1OTA3OFx1NWI5YVx1OTgwNVx1NzZlZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9XHU1NzgyXHU3NmY0XHU1YzBkXHU5ZjRhXHU1ZTczXHU1NzQ3XHU1MDNjDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdTU3ODJcdTc2ZjRcdTVjMGRcdTlmNGFcdTdiMmNcdTRlMDBcdTUwMGJcdTkwNzhcdTViOWFcdTk4MDVcdTc2ZWUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVx1NTEzMlx1NWI1OA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9XHU2YjYzXHU1NzI4XHU1MTMyXHU1YjU4IHswfQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1cdTc5ZmJcdTUyZDVcdTdiYzBcdTllZGUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JyZWZyZXNoZnJvbWJhc2U9XHU1ZjllXHU1N2ZhXHU2NzJjXHU5MWNkXHU2NWIwXHU2NTc0XHU3NDA2DQotQWJzdHJhY3REaWFncmFtX0JlbmRQb2ludF9jcmVhdGU9XHU1ZWZhXHU3YWNiXHU1ZjRlXHU2NmYyXHU5ZWRlDQotDQotQWN0aXZpdHlEaWFncmFtX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1cdTk1OGJcdTU1NWZcdTZkM2JcdTUyZDVcdTY2MGVcdTdkMzBcdTU3MTYNCi1yZWZyZXNoQWN0aW9uX2xhYmVsPVx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNg0KLXJlZnJlc2hGcm9tQmFzZUNtZF9sYWJlbD1cdTVmOWVcdTU3ZmFcdTY3MmNcdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDYNCi1kaWFncmFtX3NhdmVFcnJvcj1JVVBEMDAwMVc6IFx1NTEzMlx1NWI1OFx1NTcxNlx1ODllM1x1NTkzMVx1NjU1Nw0KLQ0KLURlbGV0ZURpYWdyYW1fdGV4dD1cdTUyMmFcdTk2NjRcdTU3MTZcdTg5ZTMNCi1EZWxldGVEaWFncmFtX3Byb21wdD1cdTYwYThcdTc4YmFcdTViOWFcdTg5ODFcdTk1ZGNcdTk1ODlcdTRlMjZcdTUyMmFcdTk2NjRcdTZiNjRcdTU3MTZcdTg5ZTNcdTU1Y2VcdWZmMWZcblx1NmI2NFx1OGI4YVx1NjZmNFx1NzBiYVx1NmMzOFx1NGU0NVx1NjAyN1x1ZmYwY1x1NzEyMVx1NmNkNVx1NWZhOVx1NTM5Zlx1MzAwMg0KLWFsaWduX2JlbmRfcG9pbnRfdGV4dD1cdTVjMGRcdTlmNGFcdTVmNGVcdTY2ZjJcdTllZGUNCi1Db25maWd1cmF0aW9uRWRpdG9ySW5wdXRfY29uZmlnZWRpdG9yMD1cdTkxNGRcdTdmNmVcdTdkZThcdThmMmZcdTU2NjgNCi1kaWFncmFtX25vZGVfcHJvcGVydHlfdmFsdWVfcHJvYmxlbV9tc2c9XHU3YmMwXHU5ZWRlXHU3Njg0XHU1MTY3XHU1YmI5XHU1MDNjXHU5MzJmXHU4YWE0XHUzMDAyDQotZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZV90ZXh0MD1cdTkzMmZcdThhYTQNCi0NCi1BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JfUmVzZXREaWFncmFtTGF5b3V0X3RleHQ9XHU5MWNkXHU4YTJkXHU1NzE2XHU4OWUzXHU3MjQ4XHU5NzYyXHU5MTRkXHU3ZjZlDQotZXJyb3JEaWFsb2dfdGl0bGU9XHU5MzJmXHU4YWE0DQotY29tbWFuZF9jYW5ub3RFZGl0PUlVUEQwMDAzRTogXHU3MTIxXHU2Y2Q1XHU3ZGU4XHU4ZjJmXHU1NzE2XHU4OWUzDQotDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RpdGxlPVx1NmJjZFx1OTgwNVx1N2RlOFx1OGYyZlx1NTY2OFx1NWRmMlx1OTVkY1x1OTU4OQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0PXswfSBcdTVkZjJcdTk1ZGNcdTk1ODlcdTMwMDJcdTYwYThcdTRlNWZcdTYwZjNcdTg5ODFcdTk1ZGNcdTk1ODkgezF9IFx1NTVjZVx1ZmYxZg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDE4OTQzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb3JtIFBhZ2UgVGl0bGVzDQotYXNzaWduUGFnZV90aXRsZT1adW9yZG5lbg0KLWNhdGVnb3JpZXNQYWdlX3RpdGxlPUthdGVnb3JpZW4NCi1kZWxpdmVyYWJsZVBhcnRzUGFnZV90aXRsZT1UZWlsZSBkZXMgTGllZmVyZ2VnZW5zdGFuZHMNCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9QmVzY2hyZWlidW5nDQotZGlzY2lwbGluZXNQYWdlX3RpdGxlPURpc3ppcGxpbmVuDQotZGlzY2FyZHVucmVzb2x2ZWRyZWY9TmljaHQgYXVmZ2VsXHUwMGY2c3RlIFJlZmVyZW56ZW4gdmVyd2VyZmVuDQotZ3VpZGFuY2VQYWdlX3RpdGxlPUFubGVpdHVuZw0KLXByZXZpZXdQYWdlX3RpdGxlPVZvcmFuemVpZ2UNCi1yZWZlcmVuY2VzUGFnZV90aXRsZT1SZWZlcmVuemVuDQotcmVmZXJlbmNlX3RleHQ9UmVmZXJlbnplbjoNCi1yZWZlcmVuY2VXb3JrZmxvd1BhZ2VfdGl0bGU9UmVmZXJlbnp3b3JrZmxvdw0KLXJvbGVzUGFnZV90aXRsZT1Sb2xsZW4NCi1yb2xlU2V0c1BhZ2VfdGl0bGU9Um9sbGVuZ3J1cHBlbg0KLXN0ZXBzUGFnZV90aXRsZT1TY2hyaXR0ZQ0KLXRhc2tzUGFnZV90aXRsZT1BdWZnYWJlbg0KLXRvb2xNZW50b3JzUGFnZV90aXRsZT1Ub29sbWVudG9yZW4NCi13b3JrUHJvZHVjdHNQYWdlX3RpdGxlPUFyYmVpdHNlcmdlYm5pc3NlDQotDQotIyBTZWN0aW9uIE5hbWVzICYgRGVzY3JpcHRpb24NCi1jaGVja0l0ZW1zU2VjdGlvbl9uYW1lPVByXHUwMGZjZmxpc3RlbmVpbnRyXHUwMGU0Z2UNCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPUdlYmVuIFNpZSBkaWUgUHJcdTAwZmNmbGlzdGVuZWludHJcdTAwZTRnZSBmXHUwMGZjciBkaWVzZSBQclx1MDBmY2ZsaXN0ZSBhbi4NCi1kZXBlbmRlbmNpZXNTZWN0aW9uX25hbWU9QWJoXHUwMGU0bmdpZ2tlaXRlbg0KLWRlcGVuZGVuY2llc1NlY3Rpb25fZGVzYz1JbiBkaWVzZW0gQWJzY2huaXR0IHdlcmRlbiBkaWUgQWJoXHUwMGU0bmdpZ2tlaXRlbiBkaWVzZXMgSW5oYWx0c3Bha2V0cyB2b24gYW5kZXJlbiBJbmhhbHRzcGFrZXRlbiBhbmdlemVpZ3QuDQotZGV0YWlsU2VjdGlvbl9uYW1lPURldGFpbGluZm9ybWF0aW9uZW4NCi1kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4gZlx1MDBmY3IgezB9IGFuZ2ViZW4uDQotZ2VuZXJhbEluZm9TZWN0aW9uX25hbWU9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuDQotZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIGZcdTAwZmNyIHswfSBhbmdlYmVuLg0KLWljb25TZWN0aW9uX25hbWU9U3ltYm9sDQotaWNvblNlY3Rpb25fZGVzYz1TeW1ib2xlIGZcdTAwZmNyIHswfSBhbnBhc3Nlbi4NCi1ub3RhdGlvblNlY3Rpb25fbmFtZT1CZXJlaXRzdGVsbHVuZ3NvcHRpb25lbg0KLW5vdGF0aW9uU2VjdGlvbl9kZXNjPUJlcmVpdHN0ZWxsdW5nc2luZm9ybWF0aW9uZW4genUgezB9IGFuZ2ViZW4uDQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX25hbWU9UmVmZXJlbnppZXJ0ZSBQbHVnLWluczoNCi1yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fZGVzYz1EaWVzZXIgQWJzY2huaXR0IHplaWd0IGRpZSB2b24gZGllc2VtIE1ldGhvZGVuLVBsdWctaW4gcmVmZXJlbnppZXJ0ZW4gUGx1Zy1pbnMgYW4uDQotc3RhZmZpbmdTZWN0aW9uX25hbWU9SW5mb3JtYXRpb25lbiB6dXIgTWl0YXJiZWl0ZXJhdXN3YWhsDQotc3RhZmZpbmdTZWN0aW9uX2Rlc2M9SW5mb3JtYXRpb25lbiB6dXIgTWl0YXJiZWl0ZXJhdXN3YWhsIGZcdTAwZmNyIGRpZXNlIFJvbGxlIGFuZ2ViZW4uDQotc3RlcHNTZWN0aW9uX25hbWU9U2Nocml0dGUNCi1zdGVwc1NlY3Rpb25fZGVzYz1EaWUgU2Nocml0dGUgZlx1MDBmY3IgZGllIEF1c2ZcdTAwZmNocnVuZyBkaWVzZXIgQXVmZ2FiZSBhbmdlYmVuLg0KLXRhaWxvcmluZ1NlY3Rpb25fbmFtZT1BbnBhc3N1bmcNCi10YWlsb3JpbmdTZWN0aW9uX2Rlc2M9QW5wYXNzdW5nc2luZm9ybWF0aW9uZW4gZlx1MDBmY3IgezB9IGFuZ2ViZW4uDQotdmFyaWFiaWxpdHlTZWN0aW9uX25hbWU9SW5oYWx0c3ZhcmlhYmlsaXRcdTAwZTR0DQotdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIHswfSBtaXQgezB9IGluIEJlemllaHVuZyBzdGVodC4NCi12ZXJzaW9uSW5mb1NlY3Rpb25fbmFtZT1WZXJzaW9uc2luZm9ybWF0aW9uZW4NCi12ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4gZlx1MDBmY3IgezB9IGFuZ2ViZW4uDQotDQotIyBVSSAmIEVsZW1lbnQgQXR0cmlidXRlIExhYmVscw0KLWFkZGl0aW9uYWxJbmZvX3RleHQ9WnVzXHUwMGU0dHpsaWNoZSBJbmZvcm1hdGlvbmVuOg0KLWFwcGxpY2F0aW9uX3RleHQ9QW53ZW5kdW5nOg0KLWFjdGlvbkxhYmVsX2VkaXQ9QmVhcmJlaXRlbg0KLWFjdGlvbkxhYmVsX2ZpbmRFbGVtZW50SW5MaWJOYXY9SW4gQmlibGlvdGhla3NzaWNodCBhbnplaWdlbg0KLWFsdGVybmF0aXZlc190ZXh0PUFsdGVybmF0aXZlbjoNCi1hc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0PVp1b3JkbnVuZ3NzdHJhdGVnaWVuOg0KLWF1dGhvcnNfdGV4dD1BdXRvcmVuOg0KLWJhY2tncm91bmRfdGV4dD1IaW50ZXJncnVuZDoNCi1iYXNlRWxlbWVudF90ZXh0PUJhc2lzOg0KLWJhc2VHdWlkYW5jZV90ZXh0PUJhc2lzYW5sZWl0dW5nOg0KLWJyaWVmRGVzY3JpcHRpb25fdGV4dD1LdXJ6YmVzY2hyZWlidW5nOg0KLWRlc2NyaXB0aW9uX3RleHQ9QmVzY2hyZWlidW5nOg0KLWJhY2t1cGJlZm9yZXNhdmVfdGV4dD1Wb3IgZGVtIFNwZWljaGVybiBzaWNoZXJuDQotYnJpZWZPdXRsaW5lX3RleHQ9S3VyemluZm9ybWF0aW9uOg0KLWNoYW5nZURhdGVfdGV4dD1cdTAwYzRuZGVydW5nc2RhdHVtOg0KLWNoYW5nZURlc2NyaXB0aW9uX3RleHQ9XHUwMGM0bmRlcnVuZ3NiZXNjaHJlaWJ1bmc6DQotY2hlY2tJdGVtc190ZXh0PVByXHUwMGZjZmxpc3RlbmVpbnRyXHUwMGU0Z2UNCi1jb250cmlidXRlc190ZXh0PUJlaXRyYWcNCi1sb2NhbENvbnRyaWJ1dGVzX3RleHQ9TG9rYWxlciBCZWl0cmFnIHp1DQotY29udHJpYnV0ZXNfdG9fdGV4dD1CZWl0cmFnIHp1DQotY29weXJpZ2h0X3RleHQ9Q29weXJpZ2h0Og0KLWVkaXRvcl90ZXh0PUVkaXRvcg0KLWV4dGVuZHNfdGV4dD1FcndlaXRlcnVuZw0KLWV4dGVuZF90ZXh0PUVyd2VpdGVybg0KLWV4dGVybmFsRGVzY3JpcHRpb25fdGV4dD1FeHRlcm5lIEJlc2NocmVpYnVuZzoNCi1leHRlcm5hbElkX3RleHQ9RXh0ZXJuZSBJRDoNCi1nb2Fsc190ZXh0PVppZWxlOg0KLWltcGFjdE9mTm90SGF2aW5nX3RleHQ9QXVzd2lya3VuZ2VuIGJlaSBOaWNodHZlcndlbmR1bmc6DQota2V5Q29uc2lkZXJhdGlvbnNfdGV4dD1XaWNodGlnZSBIaW53ZWlzZToNCi1sZXZlbHNPZkFkb3B0aW9uX3RleHQ9RWluZlx1MDBmY2hydW5nc3N0dWZlOg0KLW1haW5EZXNjcmlwdGlvbl90ZXh0PUhhdXB0YmVzY2hyZWlidW5nOg0KLW5ld0VsZW1lbnRfdGV4dD17MH0gLSBOZXUNCi1uYW1lX3RleHQ9TmFtZToNCi1ub3RBcHBsaWNhYmxlX3RleHQ9TmljaHQgenV0cmVmZmVuZA0KLXBhY2thZ2luZ0d1aWRhbmNlX3RleHQ9QW5sZWl0dW5nIGZcdTAwZmNyIFBhY2tlbjoNCi1wcmVzZW50YXRpb25OYW1lX3RleHQ9UHJcdTAwZTRzZW50YXRpb25zbmFtZToNCi1wcm9tcHRmb3JsaWJhcnlfdGV4dD1BbmZvcmRlcnVuZyB6dXIgQW5nYWJlIGRlciBNZXRob2RlbmJpYmxpb3RoZWsgYmVpbSBTdGFydGVuDQotZW5hYmxlSGVhbHRoQ2hlY2tfdGV4dD1JbnRlcm5lIERlYnVnLVRvb2xzIGFrdGl2aWVyZW4NCi1wcm9ibGVtX3RleHQ9UHJvYmxlbToNCi1wdXJwb3NlX3RleHQ9WndlY2s6DQotcmVhc29uRm9yTm90TmVlZGluZ190ZXh0PUdyXHUwMGZjbmRlIGZcdTAwZmNyIE5pY2h0dmVyd2VuZHVuZzoNCi1yZXBsYWNlc190ZXh0PUVyc2V0enVuZw0KLWxvY2FsUmVwbGFjZXNfdGV4dD1Mb2thbGUgRXJzZXR6dW5nIGZcdTAwZmNyDQotcmVwcmVzZW50YXRpb25PcHRpb25zX3RleHQ9RGFyc3RlbGx1bmdzb3B0aW9uZW46DQotdGVtcGxhdGVGaWxlX3RleHQ9Vm9ybGFnZW5kYXRlaShlbik6DQotc2tpbGxzX3RleHQ9S25vdy1ob3c6DQotc3RlcHNfdGV4dD1TY2hyaXR0ZToNCi1zdGVwc19uYW1lX3RleHQ9TmFtZToNCi1zdG9wX3RleHQ9U3RvcHBlbg0KLXByaW50X3RleHQ9RHJ1Y2tlbg0KLXN5bm9ueW1zX3RleHQ9U3lub255bWU6DQotdHlwZV90ZXh0PVR5cDoNCi1jb3B5X3RleHQ9S29waWVyZW4NCi1kZWVwQ29weV90ZXh0PVRpZWZlIEtvcGllDQotYmFja190ZXh0PVp1clx1MDBmY2NrDQotbmV3X3BsdWdpbj1OZXVlcyBNZXRob2Rlbi1QbHVnLWluDQotbW92ZT1WZXJzY2hpZWJlbi4uLg0KLXVuaXF1ZUlkX3RleHQ9RWluZGV1dGlnZS1JRDoNCi12YXJpYWJpbGl0eVR5cGVfdGV4dD1WYXJpYWJpbGl0XHUwMGU0dHN0eXA6DQotdmVyc2lvbl90ZXh0PVZlcnNpb246DQotDQotIyBCdXR0b24gTGFiZWxzDQotYWRkQnV0dG9uX3RleHQ9SGluenVmXHUwMGZjZ2VuLi4uDQotYXR0YWNoQnV0dG9uX3RleHQ9QW5oXHUwMGU0bmdlbi4uLg0KLWJyb3dzZUJ1dHRvbl90ZXh0PUR1cmNoc3VjaGVuLi4uDQotY2hhbmdlVHlwZUJ1dHRvbl90ZXh0PVR5cCBcdTAwZTRuZGVybi4uLg0KLWNsZWFyQnV0dG9uX3RleHQ9SW5oYWx0IGxcdTAwZjZzY2hlbg0KLWRlbGV0ZUJ1dHRvbl90ZXh0PUxcdTAwZjZzY2hlbg0KLWRldGFjaEJ1dHRvbl90ZXh0PUFiaFx1MDBlNG5nZW4NCi1kaWFncmFtX3NhdmVFcnJvcj1GZWhsZXIgYmVpbSBTcGVpY2hlcm4gZGVzIERpYWdyYW1tcw0KLWRvd25CdXR0b25fdGV4dD1OYWNoIHVudGVuDQotZGlyZWN0b3J5X3RleHQ9VmVyemVpY2huaXM6DQotb3JkZXJCdXR0b25fdGV4dD1Tb3J0aWVyZW4NCi1lZGl0QnV0dG9uX3RleHQ9QmVhcmJlaXRlbi4uLg0KLXJlbW92ZUJ1dHRvbl90ZXh0PUVudGZlcm5lbg0KLXJlbmFtZUFjdGlvbl90ZXh0PVVtYmVuZW5uZW4uLi4NCi1yZW1vdmVfdGV4dD1FbnRmZXJuZW4NCi1yZW5hbWVfdGV4dD1VbWJlbmVubmVuDQotU2F2ZUFzX3RleHQ9U3BlaWNoZXJuIHVudGVyDQotc2VsZWN0QnV0dG9uX3RleHQ9QXVzd1x1MDBlNGhsZW4uLi4NCi1kZXNlbGVjdEJ1dHRvbl90ZXh0PUFid1x1MDBlNGhsZW4NCi11cEJ1dHRvbl90ZXh0PU5hY2ggb2Jlbg0KLW1ha2VEZWZhdWx0QnV0dG9uX3RleHQ9QWxzIFN0YW5kYXJkIGZlc3RsZWdlbg0KLXZpZXdIaXN0b3J5QnV0dG9uX3RleHQ9SGlzdG9yaWUgYW56ZWlnZW4uLi4NCi0NCi0jIFJvbGUgRWRpdG9yIFRhc2tzIFBhZ2UNCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25OYW1lPUF1ZmdhYmVuDQotcm9sZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RGllc2UgUm9sbGUgaXN0IEF1c2ZcdTAwZmNocmVuZGVyIGRlciBmb2xnZW5kZW4gQXVmZ2FiZW4uDQotcm9sZVRhc2tzUGFnZV9hdmFpbGFibGVMYWJlbD1WZXJmXHUwMGZjZ2JhcmUgQXVmZ2FiZW4NCi1yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9UHJpbVx1MDBlNHJlciBBdXNmXHUwMGZjaHJlbmRlcjoNCi1yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWwyPVp1c1x1MDBlNHR6bGljaGVyIEF1c2ZcdTAwZmNocmVuZGVyOg0KLXJvbGVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IEF1ZmdhYmVuIGF1c2dld1x1MDBlNGhsdC4NCi0NCi0jIFJvbGUgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPUFyYmVpdHNlcmdlYm5pc3NlOg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1BcmJlaXRzZXJnZWJuaXNzZSBhbmdlYmVuLCBmXHUwMGZjciBkaWUgZGllc2UgUm9sbGUgdmVyYW50d29ydGxpY2ggaXN0Lg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVZlcmZcdTAwZmNnYmFyZSBBcmJlaXRzZXJnZWJuaXNzZToNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVZlcmFudHdvcnRsaWNoIGZcdTAwZmNyOg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPUFyYmVpdHNlcmdlYm5pc3NlLCBkaWUgQXVzZ2FiZW4gZGVyIEF1ZmdhYmVuIHNpbmQsIGRpZSBkaWVzZSBSb2xsZSBhdXNmXHUwMGZjaHJ0Og0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249RXMgd3VyZGVuIHswfSBBcmJlaXRzZXJnZWJuaXNzZSBhdXNnZXdcdTAwZTRobHQuDQotDQotIyBSb2xlIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1BbmxlaXR1bmcNCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1MaW5rcyB6dSB3ZWl0ZXJlbiBJbmZvcm1hdGlvbmVuIGluIEZvcm0gdm9uIEFubGVpdHVuZ2VuIGFuZ2ViZW4uDQotcm9sZUd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1WZXJmXHUwMGZjZ2JhcmUgQW5sZWl0dW5nOg0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1BbmxlaXR1bmc6DQotcm9sZUd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPUVzIHd1cmRlbiB7MH0gQW5sZWl0dW5nZW4gYXVzZ2V3XHUwMGU0aGx0Lg0KLQ0KLSMgUm9sZSBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUthdGVnb3JpZW46DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1EaWUgS2F0ZWdvcmllbiB2ZXJ3YWx0ZW4sIHp1IGRlbmVuIGRpZXNlIFJvbGxlIGdlaFx1MDBmNnJ0Lg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1Sb2xsZW5ncnVwcGVuOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9QW5nZXBhc3N0ZSBLYXRlZ29yaWVuOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPVJvbGxlbmdydXBwZW46DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUFuZ2VwYXNzdGUgS2F0ZWdvcmllbjoNCi0NCi0jIFRhc2sgRWRpdG9yIFJvbGVzIFBhZ2UNCi10YXNrUm9sZXNQYWdlX3NlY3Rpb25OYW1lPVJvbGxlbg0KLXRhc2tSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPURpZSBSb2xsZW4gZlx1MDBmY3IgZGllIEF1c2ZcdTAwZmNocnVuZyBkaWVzZXIgQXVmZ2FiZSB6dW9yZG5lbi4NCi10YXNrUm9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVZlcmZcdTAwZmNnYmFyZSBSb2xsZW46DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVByaW1cdTAwZTRyZXIgQXVzZlx1MDBmY2hyZW5kZXI6DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsMj1adXNcdTAwZTR0emxpY2hlIEF1c2ZcdTAwZmNocmVuZGU6DQotdGFza1JvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPUVzIHd1cmRlbiB7MH0gUm9sbGVuIGF1c2dld1x1MDBlNGhsdC4NCi10YXNrUm9sZXNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbW9kaWZ5X21lc3NhZ2U9SVVQQTAwMDQ1VzogTVx1MDBmNmNodGVuIFNpZSBkZW4gcHJpbVx1MDBlNHJlbiBBdXNmXHUwMGZjaHJlbmRlbiBpbiAnJ3swfScnIFx1MDBlNG5kZXJuPw0KLXRhc2tSb2xlc1BhZ2VfY29uZmlybV90aXRsZT1cdTAwYzRuZGVydW5nIGRlciBwcmltXHUwMGU0cmVuIFJvbGxlIGJlc3RcdTAwZTR0aWdlbg0KLQ0KLSMgVGFzayBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9QXJiZWl0c2VyZ2Vibmlzc2UNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RWluZ2FiZS0gdW5kIEF1c2dhYmVhcmJlaXRzZXJnZWJuaXNzZSBmXHUwMGZjciBkaWVzZSBBdWZnYWJlIGFuZ2ViZW4uDQotdGFza1dvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9VmVyZlx1MDBmY2diYXJlIEFyYmVpdHNlcmdlYm5pc3NlDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1WZXJiaW5kbGljaGUgRWluZ2FiZW46DQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9T3B0aW9uYWxlIEVpbmdhYmVuOg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwzPUF1c2dhYmVuOg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249RXMgd3VyZGVuIHswfSBBcmJlaXRzZXJnZWJuaXNzZSBhdXNnZXdcdTAwZTRobHQuDQotDQotIyBUYXNrIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1BbmxlaXR1bmcNCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1MaW5rcyB6dSB3ZWl0ZXJlbiBJbmZvcm1hdGlvbmVuIGluIEZvcm0gdm9uIEFubGVpdHVuZ2VuIGFuZ2ViZW4uDQotdGFza0d1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1WZXJmXHUwMGZjZ2JhcmUgQW5sZWl0dW5nOg0KLXRhc2tHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1BbmxlaXR1bmc6DQotdGFza0d1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPUVzIHd1cmRlbiB7MH0gQW5sZWl0dW5nZW4gYXVzZ2V3XHUwMGU0aGx0Lg0KLQ0KLSMgVGFzayBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUthdGVnb3JpZW4NCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPURpZSBLYXRlZ29yaWVuIHZlcndhbHRlbiwgenUgZGVuZW4gZGllc2UgQXVmZ2FiZSBnZWhcdTAwZjZydC4NCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RGlzemlwbGluZW4NCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPUFuZ2VwYXNzdGUgS2F0ZWdvcmllbg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPURpc3ppcGxpbmVuOg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1BbmdlcGFzc3RlIEthdGVnb3JpZW46DQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIFRhc2tzIFBhZ2UNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uTmFtZT1BdWZnYWJlbg0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbj1EaWVzZXMgQXJiZWl0c2VyZ2VibmlzIGlzdCBlaW5lIEVpbmdhYmUgb2RlciBBdXNnYWJlIGZcdTAwZmNyIGRpZSBmb2xnZW5kZW4gQXVmZ2FiZW4uDQotV29ya1Byb2R1Y3RfVGFza3NfQXZhaWxhYmxlTGFiZWw9VmVyZlx1MDBmY2diYXJlIEF1ZmdhYmVuDQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbD1WZXJiaW5kbGljaGUgRWluZ2FiZToNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMj1PcHRpb25hbGUgRWluZ2FiZToNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMz1BdXNnYWJlOg0KLVdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249RXMgd3VyZGVuIHswfSBBdWZnYWJlbiBhdXNnZXdcdTAwZTRobHQuDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIFJvbGVzIFBhZ2UNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1Sb2xsZW4NCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RGllIGZvbGdlbmRlbiBSb2xsZW4gc2luZCBmXHUwMGZjciBkaWVzZXMgQXJiZWl0c2VyZ2VibmlzIHZlcmFudHdvcnRsaWNoIGJ6dy4gXHUwMGU0bmRlcm4gZXMuDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9VmVyZlx1MDBmY2diYXJlIFJvbGxlbg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9VmVyYW50d29ydGxpY2hlIFJvbGxlOg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1MDBjNG5kZXJuZGUgUm9sbGVuOg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249RXMgd3VyZGVuIHswfSBSb2xsZW4gYXVzZ2V3XHUwMGU0aGx0Lg0KLQ0KLSMjIFdvcmsgUHJvZHVjdCBFZGl0b3IgRGVsaXZlcmFibGUgUGFydHMgUGFnZQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU9VGVpbGUgZGVzIExpZWZlcmdlZ2Vuc3RhbmRzDQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QXJiZWl0c2VyZ2Vibmlzc2UgYW5nZWJlbiwgYXVzIGRlbmVuIHNpY2ggZGllc2VyIExpZWZlcmdlZ2Vuc3RhbmQgenVzYW1tZW5zZXR6dC4NCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX2F2YWlsYWJsZUxhYmVsPVZlcmZcdTAwZmNnYmFyZSBBcmJlaXRzZXJnZWJuaXNzZSBhbHMgVGVpbGUgZGVzIExpZWZlcmdlZ2Vuc3RhbmRzOg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1BcmJlaXRzZXJnZWJuaXNzZSBhbHMgVGVpbGUgZGVzIExpZWZlcmdlZ2Vuc3RhbmRzOg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IEFyYmVpdHNlcmdlYm5pc3NlIGF1c2dld1x1MDBlNGhsdC4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPUFubGVpdHVuZw0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1MaW5rcyB6dSB3ZWl0ZXJlbiBJbmZvcm1hdGlvbmVuIGluIEZvcm0gdm9uIEFubGVpdHVuZ2VuIGFuZ2ViZW4uDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9VmVyZlx1MDBmY2diYXJlIEFubGVpdHVuZzoNCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPUFubGVpdHVuZzoNCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPUVzIHd1cmRlbiB7MH0gQW5sZWl0dW5nZW4gYXVzZ2V3XHUwMGU0aGx0Lg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUthdGVnb3JpZW4NCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1EaWUgS2F0ZWdvcmllbiB2ZXJ3YWx0ZW4sIHp1IGRlbmVuIGRpZXNlcyBBcmJlaXRzZXJnZWJuaXMgZ2VoXHUwMGY2cnQuDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1Eb21cdTAwZTRuZW4NCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1BcnRlbiBBcmJlaXRzZXJnZWJuaXNzZW46DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDM9QW5nZXBhc3N0ZSBLYXRlZ29yaWVuOg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Eb21cdTAwZTRuZToNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUFydGVuIHZvbiBBcmJlaXRzZXJnZWJuaXNzZW46DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMz1BbmdlcGFzc3RlIEthdGVnb3JpZW46DQotDQotIyBQcmFjdGljZSBFZGl0b3IgUmVmZXJlbmNlcyBQYWdlDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uTmFtZT1JbmhhbHRzZWxlbWVudGUNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1JbmhhbHRzZWxlbWVudGUgYW5nZWJlbiwgYXVmIGRpZSBkaWVzZXMgVmVyZmFocmVuIHZlcndlaXN0Lg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9VmVyZlx1MDBmY2diYXJlIEluaGFsdHNlbGVtZW50ZToNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw9SW5oYWx0c2VsZW1lbnRlOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IEluaGFsdHNlbGVtZW50ZSBhdXNnZXdcdTAwZTRobHQuDQotDQotIyBDYXRlZ29yeSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZT1BbmxlaXR1bmcNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciB7MH0gdmVyd2FsdGVuLg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1WZXJmXHUwMGZjZ2JhcmUgQW5sZWl0dW5nOg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPUFubGVpdHVuZzoNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IEFubGVpdHVuZ2VuIGF1c2dld1x1MDBlNGhsdC4NCi0NCi0jIERpc2NpcGxpbmUgR3JvdXBpbmcgRWRpdG9yIERpc2NpcGxpbmVzIFBhZ2UNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbk5hbWU9RGlzemlwbGluZW4NCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPURpc3ppcGxpbmVuIHZlcndhbHRlbiwgZGllIHp1IGRpZXNlciBEaXN6aXBsaW5ncnVwcGllcnVuZyBnZWhcdTAwZjZyZW4uDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVZlcmZcdTAwZmNnYmFyZSBEaXN6aXBsaW5lbjoNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1EaXN6aXBsaW5lbjoNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IERpc3ppcGxpbmVuIGF1c2dld1x1MDBlNGhsdC4NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX1VzZURlZmF1bHREaXJlY3RvcnlCdXR0b25MYWJlbD1TdGFuZGFyZHZlcnplaWNobmlzIHZlcndlbmRlbg0KLQ0KLSMgRGlzY2lwbGluZSBFZGl0b3IgVGFza3MgUGFnZQ0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9QXVmZ2FiZW4NCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1BdWZnYWJlbiB2ZXJ3YWx0ZW4sIGRpZSB6dSBkaWVzZXIgRGlzemlwbGluIGdlaFx1MDBmNnJlbi4NCi1kaXNjaXBsaW5lVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVZlcmZcdTAwZmNnYmFyZSBBdWZnYWJlbjoNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9QXVmZ2FiZW46DQotZGlzY2lwbGluZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPUVzIHd1cmRlbiB7MH0gQXVmZ2FiZW4gYXVzZ2V3XHUwMGU0aGx0Lg0KLQ0KLSMgRGlzY2lwbGluZSBFZGl0b3IgUmVmZXJlbmNlIFdvcmtmbG93IFBhZ2UNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25OYW1lPVJlZmVyZW56d29ya2Zsb3dzDQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uRGVzY3JpcHRpb249UmVmZXJlbnp3b3JrZmxvd3MgdmVyd2FsdGVuLCBkaWUgenUgZGllc2VyIERpc3ppcGxpbiBnZWhcdTAwZjZyZW4uDQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9hdmFpbGFibGVMYWJlbD1WZXJmXHUwMGZjZ2JhcmUgUmVmZXJlbnp3b3JrZmxvd3M6DQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsPVJlZmVyZW56d29ya2Zsb3dzOg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IFJlZmVyZW56d29ya2Zsb3dzIGF1c2dld1x1MDBlNGhsdC4NCi0NCi0jIERvbWFpbiBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1BcmJlaXRzZXJnZWJuaXNzZQ0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFyYmVpdHNlcmdlYm5pc3NlIHZlcndhbHRlbiwgZGllIHp1IGRpZXNlciBEb21cdTAwZTRuZSBnZWhcdTAwZjZyZW4uDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1WZXJmXHUwMGZjZ2JhcmUgQXJiZWl0c2VyZ2Vibmlzc2U6DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPUFyYmVpdHNlcmdlYm5pc3NlOg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IEFyYmVpdHNlcmdlYm5pc3NlIGF1c2dld1x1MDBlNGhsdC4NCi0NCi0jIFdvcmsgUHJvZHVjdCBLaW5kIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPUFyYmVpdHNlcmdlYm5pc3NlDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QXJiZWl0c2VyZ2Vibmlzc2UgdmVyd2FsdGVuLCBkaWUgenUgZGllc2VyIEFydCB2b24gQXJiZWl0c2VyZ2Vibmlzc2VuIGdlaFx1MDBmNnJlbi4NCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVZlcmZcdTAwZmNnYmFyZSBBcmJlaXRzZXJnZWJuaXNzZToNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9QXJiZWl0c2VyZ2Vibmlzc2U6DQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPUVzIHd1cmRlbiB7MH0gQXJiZWl0c2VyZ2Vibmlzc2UgYXVzZ2V3XHUwMGU0aGx0Lg0KLQ0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPVJvbGxlbmdydXBwZW4NCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVJvbGxlbmdydXBwZW4gdmVyd2FsdGVuLCBkaWUgenUgZGllc2VyIEdydXBwaWVydW5nIHZvbiBSb2xsZW5ncnVwcGVuIGdlaFx1MDBmNnJlbi4NCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9VmVyZlx1MDBmY2diYXJlIFJvbGxlbmdydXBwZW46DQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw9Um9sbGVuZ3J1cHBlbjoNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IFJvbGxlbmdydXBwZW4gYXVzZ2V3XHUwMGU0aGx0Lg0KLQ0KLSMgUm9sZSBTZXQgRWRpdG9yIFJvbGVzIFBhZ2UNCi1yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVJvbGxlbg0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVJvbGxlbiB2ZXJ3YWx0ZW4sIGRpZSB6dSBkaWVzZXIgUm9sbGVuZ3J1cHBlIGdlaFx1MDBmNnJlbi4NCi1yb2xlU2V0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVZlcmZcdTAwZmNnYmFyZSBSb2xsZW46DQotcm9sZVNldFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVJvbGxlbjoNCi1yb2xlU2V0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249RXMgd3VyZGVuIHswfSBSb2xsZW4gYXVzZ2V3XHUwMGU0aGx0Lg0KLQ0KLSMgVG9vbCBFZGl0b3IgVG9vbCBNZW50b3JzIFBhZ2UNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25OYW1lPVRvb2xtZW50b3Jlbg0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVRvb2xtZW50b3JlbiB2ZXJ3YWx0ZW4sIGRpZSB6dSBkaWVzZW0gVG9vbCBnZWhcdTAwZjZyZW4uDQotdG9vbFRvb2xNZW50b3JzUGFnZV9hdmFpbGFibGVMYWJlbD1WZXJmXHUwMGZjZ2JhcmUgVG9vbG1lbnRvcmVuOg0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Ub29sbWVudG9yZW46DQotdG9vbFRvb2xNZW50b3JzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPUVzIHd1cmRlbiB7MH0gVG9vbG1lbnRvcmVuIGF1c2dld1x1MDBlNGhsdC4NCi0NCi0jIEN1c3RvbSBDYXRlZ29yeSBFZGl0b3IgQXNzaWduIFBhZ2UNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbk5hbWU9SW5oYWx0c2VsZW1lbnRlDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1JbmhhbHRzZWxlbWVudGUgdmVyd2FsdGVuLCBhdXMgZGVuZW4gc2ljaCBkaWVzZSBhbmdlcGFzc3RlIEthdGVnb3JpZSB6dXNhbW1lbnNldHp0Lg0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9hdmFpbGFibGVMYWJlbD1WZXJmXHUwMGZjZ2JhcmUgSW5oYWx0c2VsZW1lbnRlOg0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWxlY3RlZExhYmVsPUluaGFsdHNlbGVtZW50ZToNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IEluaGFsdHNlbGVtZW50ZSBhdXNnZXdcdTAwZTRobHQuDQotDQotIyBOZXcgTWV0aG9kIFBsdWctaW4gV2l6YXJkDQotbmV3UGx1Z2luV2l6YXJkX3RpdGxlPU5ldWVzIE1ldGhvZGVuLVBsdWctaW4NCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlPU5ldWVzIE1ldGhvZGVuLVBsdWctaW4gZXJzdGVsbGVuDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0PUdlYmVuIFNpZSBlaW5lbiBOYW1lbiB1bmQgYWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIGZcdTAwZmNyIGRhcyBuZXVlIE1ldGhvZGVuLVBsdWctaW4gYW4uDQotbmV3UGx1Z2luRXJyb3JfbXNnPUlVUEEwMDIxRTogRGFzIE1ldGhvZGVuLVBsdWctaW4ga29ubnRlIG5pY2h0IGVyc3RlbGx0IHdlcmRlbi4NCi1uZXdQbHVnaW5FcnJvcl9yZWFzb249SW50ZXJuZXIgRmVobGVyLlxuXA0KLVxuXA0KLUtsaWNrZW4gU2llIGF1ZiBEZXRhaWxzLCB1bSB3ZWl0ZXJlIEluZm9ybWF0aW9uZW4genUgZXJoYWx0ZW4uDQotDQotIyBHZW5lcmljIGRpYWxvZyB0aXRsZXMNCi1jcmVhdGVEaWFsb2dfdGl0bGU9RWxlbWVudCBlcnN0ZWxsZW4NCi1kZWxldGVEaWFsb2dfdGl0bGU9RWxlbWVudCBsXHUwMGY2c2NoZW4NCi1lZGl0RGlhbG9nX3RpdGxlPUVsZW1lbnQgYmVhcmJlaXRlbg0KLWVycm9yRGlhbG9nX3RpdGxlPUZlaGxlcg0KLW1vdmVEaWFsb2dfdGl0bGU9RWxlbWVudCB2ZXJzY2hpZWJlbg0KLXJlbmFtZURpYWxvZ190aXRsZT1FbGVtZW50IHVtYmVuZW5uZW4NCi13YXJuaW5nRGlhbG9nX3RpdGxlPVdhcm51bmcNCi0NCi0jIEFkZCBDb25maWd1cmF0aW9uIHRvIFByb2Nlc3MgRXJyb3IgRGlhbG9nDQotYWRkQ29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9S29uZmlndXJhdGlvbiB6dW0gUHJvemVzcyBoaW56dWZcdTAwZmNnZW4NCi0NCi0jIFNldCBEZWZhdWx0IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotc2V0RGVmYXVsdENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPVN0YW5kYXJka29uZmlndXJhdGlvbiBmXHUwMGZjciBQcm96ZXNzIGZlc3RsZWdlbg0KLQ0KLSMgRWRpdCBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlPVByb3plc3NlbGVtZW50IGJlYXJiZWl0ZW4NCi0NCi0jIE9wZW4gTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1NZXRob2RlbmJpYmxpb3RoZWsgXHUwMGY2ZmZuZW4NCi1vcGVuTGlicmFyeURpYWxvZ190ZXh0PURpZSBha3R1ZWxsZSBNZXRob2RlbmJpYmxpb3RoZWsgd3VyZGUgbmljaHQgb3JkbnVuZ3NnZW1cdTAwZTRcdTAwZGYgZ2VzcGVpY2hlcnQuIERlbiBGZWhsZXIgaWdub3JpZXJlbiB1bmQgZWluZSBhbmRlcmUgQmlibGlvdGhlayBcdTAwZjZmZm5lbj8NCi0NCi0jIFNhdmUgTGlicmFyeSBEaWFsb2cNCi1zYXZlTGlicmFyeURpYWxvZ190aXRsZT1NZXRob2RlbmJpYmxpb3RoZWsgc3BlaWNoZXJuDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dD1EaWUgYWt0dWVsbGUgTWV0aG9kZW5iaWJsaW90aGVrIHd1cmRlIGdlXHUwMGU0bmRlcnQuIFx1MDBjNG5kZXJ1bmdlbiBzcGVpY2hlcm4/DQotDQotIyBVcGdyYWRlIExpYnJhcnkgRGlhbG9nDQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGU9VXBncmFkZSBkZXIgTWV0aG9kZW5iaWJsaW90aGVrIGR1cmNoZlx1MDBmY2hyZW4NCi0NCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cNCi1kZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PURhcyBFbGVtZW50ICcnezB9Jycgd3VyZGUgYmVyZWl0cyBnZWxcdTAwZjZzY2h0LiBFbGVtZW50IGF1cyAnJ3sxfScnIGVudGZlcm5lbj8NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbm9PcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwMEU6IEVzIGlzdCBrZWluZSBNZXRob2RlbmJpYmxpb3RoZWsgZ2VcdTAwZjZmZm5ldC5cblwNCi1cblwNCi1FcyBtdXNzIGVpbmUgTWV0aG9kZW5iaWJsaW90aGVrIGdlXHUwMGY2ZmZuZXQgc2VpbiwgZGFtaXQgZWluIG5ldWVzIE1ldGhvZGVuZWxlbWVudCBoaW56dWdlZlx1MDBmY2d0IHdlcmRlbiBrYW5uLiBcblwNCi1cblwNCi1FcnN0ZWxsZW4gU2llIGVpbmUgbmV1ZSBNZXRob2RlbmJpYmxpb3RoZWsgb2RlciBcdTAwZjZmZm5lbiBTaWUgZWluZSB2b3JoYW5kZW5lIHVuZCB3aWVkZXJob2xlbiBTaWUgYW5zY2hsaWVcdTAwZGZlbmQgZGVuIFZvcmdhbmcuDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZz1JVVBBMDAwMUU6IERlciBOYW1lIGZcdTAwZmNyIHswfSBmZWhsdC5cblwNCi1cblwNCi1BbGxlIE1ldGhvZGVuLSB1bmQgUHJvemVzc2VsZW1lbnRlIG1cdTAwZmNzc2VuIGVpbmVuIE5hbWVuIGhhYmVuLlxuXA0KLVxuXA0KLUtsaWNrZW4gU2llIGF1ZiBPSyB1bmQgZ2ViZW4gU2llIGVpbmVuIGdcdTAwZmNsdGlnZW4gTmFtZW4gZlx1MDBmY3IgZGFzIEVsZW1lbnQgZWluLg0KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEEwMDAyRTogRGVyIE5hbWUgJyd7MH0nJyBpc3QgYmVyZWl0cyB2b3JoYW5kZW4uXG5cDQotXG5cDQotRWluIE1ldGhvZGVuZWxlbWVudCBtdXNzIGVpbmVuIGVpbmRldXRpZ2VuIE5hbWVuIGhhYmVuLlxuXA0KLVxuXA0KLUtsaWNrZW4gU2llIGF1ZiBPSyB1bmQgZ2ViZW4gU2llIGVpbmVuIGFuZGVyZW4gTmFtZW4gZlx1MDBmY3IgZGFzIEVsZW1lbnQgZWluLg0KLWNyZWF0ZUNvbmZpZ0Vycm9yX21zZz1JVVBBMDAwM0U6IERpZSBNZXRob2RlbmtvbmZpZ3VyYXRpb24ga2FubiBuaWNodCBlcnN0ZWxsdCB3ZXJkZW4uDQotZGVsZXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDA0VzogRGllIE1ldGhvZGVua29uZmlndXJhdGlvbiBrYW5uIG5pY2h0IGdlbFx1MDBmNnNjaHQgd2VyZGVuLg0KLWludGVybmFsRXJyb3JfbXNnPUlVUEEwMDA1RTogRXMgaXN0IGVpbiBpbnRlcm5lciBGZWhsZXIgYXVmZ2V0cmV0ZW4uXG5cDQotXG5cDQotS2xpY2tlbiBTaWUgYXVmIERldGFpbHMsIHVtIHdlaXRlcmUgSW5mb3JtYXRpb25lbiB6dSBlcmhhbHRlbi4NCi1pbnZhbGlkUHJlc2VudGF0aW9uTmFtZUVycm9yX21zZz1JVVBBMDAwNkU6IERlciBhbmdlZ2ViZW5lIFByXHUwMGU0c2VudGF0aW9uc25hbWUgaXN0IHVuZ1x1MDBmY2x0aWcuXG5cDQotXG5cDQotS2xpY2tlbiBTaWUgYXVmIE9LIHVuZCBnZWJlbiBTaWUgZWluZW4gYW5kZXJlbiBOYW1lbiBlaW4uDQotaW52YWxpZENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwN0U6IERpZSBhdXNnZXdcdTAwZTRobHRlIE1ldGhvZGVua29uZmlndXJhdGlvbiAnJ3swfScnIGlzdCBrZWluIFN1YnNldCBkZXIgU3RhbmRhcmRrb25maWd1cmF0aW9uIGRlcyBQcm96ZXNzZXMuXG5cDQotXG5cDQotVW0gZGllIEludGVncml0XHUwMGU0dCBlaW5lcyBQcm96ZXNzZXMgenUgd2FocmVuLCBtdXNzIGRpZSBTdGFuZGFyZGtvbmZpZ3VyYXRpb24gZGVzIFByb3plc3NlcyBlaW4gU3VwZXJzZXQgYWxsZXIgYW5kZXJlbiBLb25maWd1cmF0aW9uZW4gc2VpbiwgZGllIGRpZXNlbSBQcm96ZXNzIHp1Z2VvcmRuZXQgc2luZC5cblwNCi1cblwNCi1XXHUwMGU0aGxlbiBTaWUgZWluZSBhbmRlcmUgS29uZmlndXJhdGlvbiBhdXMgb2RlciBcdTAwZTRuZGVybiBTaWUgZGllIFN0YW5kYXJka29uZmlndXJhdGlvbiwgdW0gZGVuIEluaGFsdCBkZXIgYXVzZ2V3XHUwMGU0aGx0ZW4gS29uZmlndXJhdGlvbiBlaW56dWZcdTAwZmNnZW4sIHVuZCB3aWVkZXJob2xlbiBTaWUgYW5zY2hsaWVcdTAwZGZlbmQgZGVuIFZvcmdhbmcuDQotc2V0RGVmYXVsdENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwOEU6IERpZSBhdXNnZXdcdTAwZTRobHRlIE1ldGhvZGVua29uZmlndXJhdGlvbiAnJ3swfScnIGlzdCBrZWluIFN1cGVyc2V0IGRlciBhbmRlcmVuIEtvbmZpZ3VyYXRpb24sIGF1ZiBkaWUgZGVyIFByb3plc3MgdmVyd2Vpc3QuXG5cDQotXG5cDQotVW0gZGllIEludGVncml0XHUwMGU0dCBlaW5lcyBQcm96ZXNzZXMgenUgd2FocmVuLCBtdXNzIGRpZSBTdGFuZGFyZGtvbmZpZ3VyYXRpb24gZGVzIFByb3plc3NlcyBlaW4gU3VwZXJzZXQgYWxsZXIgYW5kZXJlbiBLb25maWd1cmF0aW9uZW4gc2VpbiwgZGllIGRpZXNlbSBQcm96ZXNzIHp1Z2VvcmRuZXQgc2luZC5cblwNCi1cblwNCi1XXHUwMGU0aGxlbiBTaWUgZWluZSBhbmRlcmUgS29uZmlndXJhdGlvbiBhdXMgb2RlciBcdTAwZTRuZGVybiBTaWUgZGVuIEluaGFsdCBkZXIgYXVzZ2V3XHUwMGU0aGx0ZW4gS29uZmlndXJhdGlvbiB1bmQgd2llZGVyaG9sZW4gU2llIGFuc2NobGllXHUwMGRmZW5kIGRlbiBWb3JnYW5nLg0KLW9wZW5MaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDA5RTogRGllIE1ldGhvZGVuYmlibGlvdGhlayBrYW5uIG5pY2h0IGdlbGFkZW4gd2VyZGVuLlxuXA0KLVxuXA0KLUtsaWNrZW4gU2llIGF1ZiBEZXRhaWxzLCB1bSB3ZWl0ZXJlIEluZm9ybWF0aW9uZW4genUgZXJoYWx0ZW4uDQotc2F2ZUxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTBFOiBEaWUgTWV0aG9kZW5iaWJsaW90aGVrIGthbm4gbmljaHQgZ2VzcGVpY2hlcnQgd2VyZGVuLg0KLXNhdmVMaWJyYXJ5VG9FcnJvcl9tc2c9SVVQQTAwMTBFOiBEaWUgTWV0aG9kZW5iaWJsaW90aGVrIGthbm4gbmljaHQgaW4gJyd7MH0nJyBnZXNwZWljaGVydCB3ZXJkZW4uDQotZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnPUlVUEEwMDExRTogRGFzIEVsZW1lbnQgJyd7MH0nJyB3dXJkZSBiZXJlaXRzIGdlbFx1MDBmNnNjaHQuDQotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTJFOiBEaWUgTWV0aG9kZW5iaWJsaW90aGVrIGthbm4gbmljaHQgYWt0dWFsaXNpZXJ0IHdlcmRlbi4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQQTAwMTZFOiBFcyBpc3QgZWluIEZlaGxlciBhdWZnZXRyZXRlbi5cblwNCi1cblwNCi1LbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLg0KLWludGVybmFsRXJyb3JfcmVhc29uPUlVUEEwMDE3RTogRXMgaXN0IGVpbiBpbnRlcm5lciBGZWhsZXIgYXVmZ2V0cmV0ZW4uXG5cDQotXG5cDQotS2xpY2tlbiBTaWUgYXVmIERldGFpbHMsIHVtIHdlaXRlcmUgSW5mb3JtYXRpb25lbiB6dSBlcmhhbHRlbi4NCi11cGdyYWRlTGlicmFyeUVycm9yX3JlYXNvbj1JVVBBMDAxOEU6IEJlaW0gTGFkZW4gZGVyIEVsZW1lbnRlIGZcdTAwZmNyIGRpZSBNZXRob2RlbmJpYmxpb3RoZWsgaXN0IGVpbiBGZWhsZXIgYXVmZ2V0cmV0ZW4uXG5cDQotXG5cDQotS2xpY2tlbiBTaWUgYXVmIERldGFpbHMsIHVtIHdlaXRlcmUgSW5mb3JtYXRpb25lbiB6dSBlcmhhbHRlbi4NCi1zYXZlVXBncmFkZWRMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE5RTogQmVpbSBTcGVpY2hlcm4gZGVyIGFrdHVhbGlzaWVydGVuIE1ldGhvZGVuYmlibGlvdGhlayBpc3QgZWluIEZlaGxlciBhdWZnZXRyZXRlbi5cblwNCi1cblwNCi1LbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1NZXRob2RlbmJpYmxpb3RoZWsgd2lyZCBnZVx1MDBmNmZmbmV0Li4uDQotc2F2aW5nTGlicmFyeVRhc2tfbmFtZT1NZXRob2RlbmJpYmxpb3RoZWsgd2lyZCBnZXNwZWljaGVydC4uLg0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9VXBncmFkZSBmXHUwMGZjciBNZXRob2RlbmJpYmxpb3RoZWsgd2lyZCBkdXJjaGdlZlx1MDBmY2hydC4uLg0KLWxvYWRpbmdMaWJyYXJ5RWxlbWVudHNUYXNrX25hbWU9RWxlbWVudGUgZlx1MDBmY3IgTWV0aG9kZW5iaWJsaW90aGVrIHdlcmRlbiBnZWxhZGVuLi4uDQotc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZT1FbGVtZW50ZSBmXHUwMGZjciBNZXRob2RlbmJpYmxpb3RoZWsgd2VyZGVuIGluIG5ldWVtIERhdGVpZm9ybWF0IGdlc3BlaWNoZXJ0Li4uDQotc2F2aW5nVGFza19uYW1lPScnezB9Jycgd2lyZCBnZXNwZWljaGVydC4uLg0KLXNhdmluZ0ZpbGVzVGFza19uYW1lPURhdGVpZW4gd2VyZGVuIGdlc3BlaWNoZXJ0Li4uDQotZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU9R1VJRHMgZlx1MDBmY3IgSW5oYWx0c2Jlc2NocmVpYnVuZyB3ZXJkZW4ga29ycmlnaWVydC4uLg0KLWRlbGV0aW5nSW52YWxpZFJlZmVyZW5jZXNUYXNrX25hbWU9VW5nXHUwMGZjbHRpZ2UgUmVmZXJlbnplbiB3ZXJkZW4gZ2VsXHUwMGY2c2NodC4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IERpZXNlIFBlcnNwZWt0aXZlIGlzdCBzcGV6aWVsbCBkYWZcdTAwZmNyIGVudHdpY2tlbHQgd29yZGVuLCBkYXNzIHNpY2ggZGVyIEJlbnV0emVyIG1pdCBkZXIgQW56ZWlnZSB2b24gSFRNTC1EYXJzdGVsbHVuZ2VuIGRlciBNZXRob2RlbmJpYmxpb3RoZWtzZWxlbWVudGUgdmVydHJhdXQgbWFjaGVuIGthbm4uIEVzIGthbm4ga2VpbiBFZGl0b3IgaGluenVnZWZcdTAwZmNndCBvZGVyIGFuZ2V6ZWlndCB3ZXJkZW4uDQotDQotIyBDaGFuZ2UgSGlzdG9yeSBEaWFsb2cNCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX3RpdGxlPUhpc3RvcmllIGRlciBcdTAwYzRuZGVydW5nc2Jlc2NocmVpYnVuZw0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfbGFiZWw9XHUwMGM0bmRlcnVuZ3NoaXN0b3JpZToNCi0NCi0jIE1ldGhvZCBFbGVtZW50IERlbGV0ZSBBY3Rpb24NCi1jb25maXJtRGVsZXRlRGlhbG9nX3RpdGxlPUxcdTAwZjZzY2hlbiBiZXN0XHUwMGU0dGlnZW4NCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZz0nJ3swfScnIHdpcmtsaWNoIGxcdTAwZjZzY2hlbj8NCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZ1dpdGhSZWZlcmVuY2U9Jyd7MH0nJyB3aXJrbGljaCBsXHUwMGY2c2NoZW4/XG5cDQotXG5cDQotRGllIGZvbGdlbmRlbiBFbGVtZW50ZSBlbnRoYWx0ZW4gUmVmZXJlbnplbiBhdWYgZGllIHp1IGxcdTAwZjZzY2hlbmRlbiBFaW50clx1MDBlNGdlOiB7MX0NCi0NCi0jIE5ldyBMaWJyYXJ5IERpYWxvZw0KLWVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjJFOiBEaWUgTWV0aG9kZW5iaWJsaW90aGVrICcnezB9Jycga2FubiBuaWNodCBlcnN0ZWxsdCB3ZXJkZW4uDQotZXJyb3JEaWFsb2dfZXJyb3I9RXMgaXN0IG5pY2h0IG1cdTAwZjZnbGljaCwgZWluZSBNZXRob2RlbmJpYmxpb3RoZWsgaW4gZWluZXIgYW5kZXJlbiBNZXRob2RlbmJpYmxpb3RoZWsgenUgZXJzdGVsbGVuLg0KLWVycl9ub29wZW5saWJyYXJ5PUlVUEEwMDQwRTogRXMgaXN0IGtlaW5lIE1ldGhvZGVuYmlibGlvdGhlayBnZVx1MDBmNmZmbmV0LlxuXA0KLVxuXA0KLUVzIG11c3MgZWluZSBNZXRob2RlbmJpYmxpb3RoZWsgZ2VcdTAwZjZmZm5ldCBzZWluLCBkYW1pdCBlaW4gbmV1ZXMgTWV0aG9kZW4tUGx1Zy1pbiBoaW56dWdlZlx1MDBmY2d0IHdlcmRlbiBrYW5uLiBcblwNCi1cblwNCi1FcnN0ZWxsZW4gU2llIGVpbmUgbmV1ZSBNZXRob2RlbmJpYmxpb3RoZWsgb2RlciBcdTAwZjZmZm5lbiBTaWUgZWluZSB2b3JoYW5kZW5lIHVuZCB3aWVkZXJob2xlbiBTaWUgYW5zY2hsaWVcdTAwZGZlbmQgZGVuIFZvcmdhbmcuDQotZXJyX2xvYWRpbmdsaWJyYXJ5PUZlaGxlciBiZWltIExhZGVuIGRlciBCaWJsaW90aGVrDQotbXNnX3JlbG9hZExpYnJhcnk9RmVobGVyIGJlaW0gUlx1MDBmY2NrZ1x1MDBlNG5naWdtYWNoZW4gZGVyIGZlaGxnZXNjaGxhZ2VuZW4gTFx1MDBmNnNjaG9wZXJhdGlvbi4gRGllIGFrdHVlbGxlIE1ldGhvZGVuYmlibGlvdGhlayBtdXNzIGVybmV1dCBnZWxhZGVuIHdlcmRlbi4NCi0NCi0jIFJlbG9hZCBMaWJyYXJ5IERpYWxvZw0KLXJlbG9hZERpYWxvZ19tZXNzYWdlPURpZSBCaWJsaW90aGVrIG11c3MgZXJuZXV0IGdlbGFkZW4gd2VyZGVuLCB1bSBkZW4gdXJzcHJcdTAwZmNuZ2xpY2hlbiBadXN0YW5kIHdpZWRlcmhlcnp1c3RlbGxlbi4NCi1yZWxvYWREaWFsb2dfdGl0bGU9QmlibGlvdGhlayBlcm5ldXQgbGFkZW4NCi1kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JUaXRsZT1GZWhsZXIgYmVpbSBWZXJzY2hpZWJlbg0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U9QmVpbSBWZXJzY2hpZWJlbiBpc3QgZWluIEZlaGxlciBhdWZnZXRyZXRlbi4NCi0NCi0jIFByb2Nlc3MgRm9ybSBFZGl0b3INCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU9U3BlaWNoZXJuDQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxPURpZXNlIFx1MDBjNG5kZXJ1bmcgd2lya3Qgc2ljaCBhdWYgYWxsZSBEaWFncmFtbWUgaW4gSWhyZW0gUHJvemVzcyBhdXMuIERlciBFZGl0b3Igd2lyZCBuYWNoIGRlciBcdTAwYzRuZGVydW5nIGdlc3BlaWNoZXJ0LiBGb3J0ZmFocmVuPw0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMj1EZXIgRWRpdG9yIHdpcmQgbmFjaCBkZXIgXHUwMGM0bmRlcnVuZyBnZXNwZWljaGVydC4gRm9ydGZhaHJlbj8NCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBQYWdlDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPUVudGZlcm5lbiBiZXN0XHUwMGU0dGlnZW4NCi1jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfbWVzc2FnZT1TaWNodCAnJ3swfScnIHdpcmtsaWNoIGVudGZlcm5lbj8NCi1jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfdGl0bGU9V2FybnVuZw0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb249S29uZmlndXJhdGlvbjoNCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3M9S29uZmlndXJhdGlvbnNzaWNodGVuDQotY29uZmlnVmlld1BhZ2Vfdmlld3M9U2ljaHRlbg0KLWNvbHVtbnNlbGVjdGlvbl90ZXh0PVNwYWx0ZW5hdXN3YWhsOg0KLWNvbmZpZ1ZpZXdQYWdlX2FkZFZpZXdCdXR0b25UZXh0PVNpY2h0IGhpbnp1Zlx1MDBmY2dlbi4uLg0KLWNvbmZpZ1ZpZXdQYWdlX3JlbW92ZVZpZXdCdXR0b25UZXh0PVNpY2h0IGVudGZlcm5lbg0KLWNvbmZpZ1ZpZXdQYWdlX21ha2VEZWZhdWx0QnV0dG9uVGV4dD1BbHMgU3RhbmRhcmQgZmVzdGxlZ2VuDQotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNXOiBEaWUgU2ljaHQgbWl0IGRlbSBOYW1lbiAnJ3swfScnIGlzdCBiZXJlaXRzIHZvcmhhbmRlbi4NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25UaXRsZT1WZXJcdTAwZjZmZmVudGxpY2h0ZSBOYXZpZ2F0aW9uc3NpY2h0ZW4NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25NZXNzYWdlPUdlYmVuIFNpZSBkaWUgU2ljaHRlbiBhbiwgZGllIGVpbmdlc2NobG9zc2VuIHdlcmRlbiBzb2xsZW4sIHdlbm4gZGllc2UgS29uZmlndXJhdGlvbiB2ZXJcdTAwZjZmZmVudGxpY2h0IHdpcmQuIEtsaWNrZW4gU2llIHp1bSBFcnN0ZWxsZW4gZWluZXIgU2ljaHQgYXVmIFNpY2h0IGhpbnp1Zlx1MDBmY2dlbiwgdW0gZWluZSBTdGFuZGFyZC0gb2RlciBhbmdlcGFzc3RlIEthdGVnb3JpZSBpbiBkZXIgS29uZmlndXJhdGlvbiBhdXN6dXdcdTAwZTRobGVuLiBEaWUgYXVzZ2V3XHUwMGU0aGx0ZSBLYXRlZ29yaWUgc3RlbGx0IGRpZSBTaWNodCBkYXIgdW5kIGRpZSBVbnRlcmthdGVnb3JpZW4gdW5kIEluaGFsdHNlbGVtZW50ZSBkaWUgQmF1bXN0cnVrdHVyZWxlbWVudGUgZGVyIFNpY2h0Lg0KLQ0KLSMgRGVzY3JpcHRpb24gVGFiDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU9QW5sZWl0dW5nIGtvbnZlcnRpZXJlbg0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxPUlVUEEwMDQwVzogU3BlaWNoZXJuIFNpZSB6dWVyc3QgZGVuIEVkaXRvci4NCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMj1FcyBpc3Qga2VpbmUga29tcGF0aWJsZSBBbmxlaXR1bmcgZlx1MDBmY3IgZGllc2VuIFR5cCB2b3JoYW5kZW4uDQotDQotY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZT1Ba3Rpdml0XHUwMGU0dCBrb252ZXJ0aWVyZW4NCi0jIEFzc29jaWF0aW9uIEZvcm0gUGFnZQ0KLUFzc29jaWF0aW9uRm9ybVBhZ2VfQnJpZWZEZXNjcmlwdGlvbkxhYmVsPUt1cnpiZXNjaHJlaWJ1bmcgZGVzIGF1c2dld1x1MDBlNGhsdGVuIEVsZW1lbnRzOg0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVzY3JpcHRpb24NCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfdGl0bGU9RWxlbWVudG5hbWVuIGVpbmdlYmVuLg0KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ19tZXNzYWdlPURhcyBGZWxkIGZcdTAwZmNyIGRlbiBOYW1lbiBkYXJmIG5pY2h0IGxlZXIgc2Vpbi4NCi0NCi0jIE1ldGhvZCBQbHVnLWluIERlc2NyaXB0aW9uDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25SZW1vdmVSZWZDb25maXJtX21lc3NhZ2U9V2VubiBTaWUgZGllIHJlZmVyZW56aWVydGVuIFBsdWctaW5zIGFid1x1MDBlNGhsZW4sIGRpZSBkZW0gUGx1Zy1pbiAnJ3swfScnIHp1Z2VvcmRuZXQgc2luZCwgd2VyZGVuIHVuZ1x1MDBmY2x0aWdlIEJlemllaHVuZ2VuIGVyemV1Z3QsIGRpZSBnZWxcdTAwZjZzY2h0IHdlcmRlbi5cblwNCi1cblwNCi1EaWVzZSBBa3Rpb24ga2FubiBuaWNodCByXHUwMGZjY2tnXHUwMGU0bmdpZyBnZW1hY2h0IHdlcmRlbi4gTWl0IGRlciBcdTAwYzRuZGVydW5nIGZvcnRmYWhyZW4/DQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU9U2llIHNpbmQgZGFiZWksIGRlbiBOYW1lbiBkaWVzZXMgTWV0aG9kZW4tUGx1Zy1pbiB2b24gJyd7MH0nJyBpbiAnJ3sxfScnIHp1IFx1MDBlNG5kZXJuLiBCZWkgZGllc2VyIEFrdGlvbiB3aXJkIGRlciBFZGl0b3IgZ2VzcGVpY2hlcnQgdW5kIGRlciBQbHVnLWluLU9yZG5lciB1bWJlbmFubnQuIEZvcnRmYWhyZW4/DQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWVfdGl0bGU9TWV0aG9kZW4tUGx1Zy1pbiB1bWJlbmVubmVuDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2Nhbm5vdFJlbmFtZVBsdWdpbkZvbGRlcj1EZXIgUGx1Zy1pbi1PcmRuZXIga29ubnRlIG5pY2h0IHVtYmVuYW5udCB3ZXJkZW4uDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5MYWJlbD1QbHVnLWluIHNwZXJyZW4NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbl9tZXNzYWdlPUJlaW0gU3BlcnJlbiBkZXMgUGx1Zy1pbiB3ZXJkZW4gb2ZmZW5lIEVkaXRvcmVuIG1pdCBFbGVtZW50ZW4sIGRpZSB6dW0gUGx1Zy1pbiAnJ3swfScnIGdlaFx1MDBmNnJlbiwgZ2VzcGVpY2hlcnQgdW5kIGdlc2NobG9zc2VuLiBNaXQgZGVyIFx1MDBjNG5kZXJ1bmcgZm9ydGZhaHJlbj8NCi0NCi0jIFByb2Nlc3MgRGVzY3JpcHRpb24NCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV90aXRsZT1VbWJlbmVubmVuDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZT1TaWUgc2luZCBkYWJlaSwgZGVuIE5hbWVuIGRlcyBQcm96ZXNzZXMgenUgXHUwMGU0bmRlcm4uIEJlaSBkaWVzZXIgQWt0aW9uIHdpcmQgZGVyIEluaGFsdCBkZXMgRWRpdG9ycyBnZXNwZWljaGVydCB1bmQgZGVyIFByb3plc3NvcmRuZXIgdW1iZW5hbm50LiBGb3J0ZmFocmVuPw0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uRGVzY3JpcHRpb249QmVzY2hyZWlidW5nOg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvblRpdGxlPUtvbmZpZ3VyYXRpb24NCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlPUdlYmVuIFNpZSBhbGxlIGdcdTAwZmNsdGlnZW4gS29uZmlndXJhdGlvbmVuIGZcdTAwZmNyIGRpZXNlbiBQcm96ZXNzIGFuLiBXXHUwMGU0aGxlbiBTaWUgZWluZSBLb25maWd1cmF0aW9uIGFscyBTdGFuZGFyZGtvbmZpZ3VyYXRpb24gYXVzLiBEaWVzZSBtdXNzIGVpbiBTdXBlcnNldCBhbGxlIGFuZGVyZW4gS29uZmlndXJhdGlvbmVuIHNlaW4uDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25zPUtvbmZpZ3VyYXRpb25lbjoNCi1wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdD0oU3RhbmRhcmQpDQotUHJvY2Vzc0Rlc2NyaXB0aW9uX3NlbGVjdENvbmZpZ3VyYXRpb249SGluenV6dWZcdTAwZmNnZW5kZSBLb25maWd1cmF0aW9uZW4gYXVzd1x1MDBlNGhsZW4NCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0MD1NaXQgZGllc2VyIEFrdGlvbiB3aXJkIGRlciBha3R1ZWxsZSBFZGl0b3IgZ2VzcGVpY2hlcnQgdW5kIGRpZSBcdTAwYzRuZGVydW5nIHBlcm1hbmVudCBmZXN0Z2VzY2hyaWViZW4uICcnezB9Jycgd2lya2xpY2ggbFx1MDBmNnNjaGVuPw0KLVByb2Nlc3NEZWxldGVBY3Rpb25fc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZT1EaWUgZm9sZ2VuZGVuIERlc2tyaXB0b3JlbiB3ZXJkZW4gbmFjaCBkZW0gTFx1MDBmNnNjaGVuIGRlciBhdXNnZXdcdTAwZTRobHRlbiBFbGVtZW50ZSBuaXJnZW5kd28gbWVociB2ZXJ3ZW5kZXQuXG5cDQotV1x1MDBlNGhsZW4gU2llIGRpZSB6dSBsXHUwMGY2c2NoZW5kZW4gRGVza3JpcHRvcmVuIGF1cy4NCi0NCi0jIFZpZXcgSGVscGVyDQotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX3RpdGxlPVN0YXR1c3ByXHUwMGZjZnVuZyBkZXIgQmlibGlvdGhlaw0KLXZpZXdIZWxwZXJfcGVyZm9ybUhlYWx0aENoZWNrPVN0YXR1c3ByXHUwMGZjZnVuZyBkZXIgQmlibGlvdGhlayB3aXJkIGR1cmNoZ2VmXHUwMGZjaHJ0Li4uDQotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U9RGllIFN0YXR1c3ByXHUwMGZjZnVuZyBkZXIgZ2VcdTAwZjZmZm5ldGVuIEJpYmxpb3RoZWsgd3VyZGUgb3JkbnVuZ3NnZW1cdTAwZTRcdTAwZGYgZHVyY2hnZWZcdTAwZmNocnQuIFNlaGVuIFNpZSBzaWNoIGRlbiBCZXJpY2h0IGluIGRlciBQcm90b2tvbGxkYXRlaSBhbi4NCi0NCi0jIEF0dGFjaCBUZW1wbGF0ZSBGaWxlIERpYWxvZw0KLWF0dGFjaFRlbXBsYXRlRmlsZURpYWxvZ190aXRsZT1Wb3JsYWdlbmRhdGVpIGFuaFx1MDBlNG5nZW4NCi0NCi0jIENyZWF0ZSBFbGVtZW50IEVycm9yIERpYWxvZw0KLWNyZWF0ZUVsZW1lbnREaWFsb2dfdGl0bGU9ezB9IG5ldSBlcnN0ZWxsZW4NCi1jcmVhdGVOZXdFbGVtZW50RXJyb3JfbXNnPUZlaGxlciBiZWltIEVyc3RlbGxlbiB2b24gezB9Lg0KLQ0KLWRsZ1RpdGxlX3JlbG9hZExpYnJhcnk9QmlibGlvdGhlayBlcm5ldXQgbGFkZW4NCi1jcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uPUVzIG11c3MgZWluIE5hbWUgZlx1MDBmY3IgezB9IGFuZ2VnZWJlbiB3ZXJkZW4uXG5cDQotXG5cDQotR2ViZW4gU2llIGVpbmVuIGdcdTAwZmNsdGlnZW4gTmFtZW4gZWluIHVuZCB3aWVkZXJob2xlbiBTaWUgZGVuIFZvcmdhbmcuDQotZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uPURpZSBLb25maWd1cmF0aW9uIHdpcmQgdm9tIFByb3plc3MgJyd7MH0nJyByZWZlcmVuemllcnQuDQotIyBDaGFuZ2VCb3VuZHNDb21tYW5kDQotZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw9QmVncmVuenVuZ2VuIFx1MDBlNG5kZXJuDQotIyBDaGFuZ2VOYW1lQ29tbWFuZA0KLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF9sYWJlbD1OYW1lbiBcdTAwZTRuZGVybg0KLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF91bmRvTWVzc2FnZT1EaWUgTmFtZW5zXHUwMGU0bmRlcnVuZyBrYW5uIG5pY2h0IHJcdTAwZmNja2dcdTAwZTRuZ2lnIGdlbWFjaHQgd2VyZGVuLlxuXA0KLVxuXA0KLURhcyBSXHUwMGZjY2tnXHUwMGU0bmdpZ21hY2hlbiBlaW5lciBOYW1lbnNcdTAwZTRuZGVydW5nIGlzdCBuaWNodCB6dWxcdTAwZTRzc2lnLCB3ZW5uIGRlciBOYW1lIHZvcmhlciBuaWNodCBkZWZpbmllcnQgd2FyLg0KLSMgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQNCi1nZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw9RWlnZW5zY2hhZnRzd2VydCBcdTAwZTRuZGVybg0KLSMgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZA0KLWdlZl9jcmVhdGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPVZlcnp3ZWlndW5nc3B1bmt0IGVyc3RlbGxlbg0KLSMgQ3JlYXRlTGlua0NvbW1hbmQNCi1nZWZfY3JlYXRlTGlua0NvbW1hbmRfbGFiZWw9TGluay1FcnN0ZWxsdW5nDQotIyBDcmVhdGVOb2RlQ29tbWFuZA0KLWdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbD1OZXVlbiBLbm90ZW4gZXJzdGVsbGVuDQotIyBEZWxldGVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9VmVyendlaWd1bmdzcHVua3QgbFx1MDBmNnNjaGVuDQotIyBEZWxldGVDb21tYW5kDQotZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw9TFx1MDBmNnNjaGVuDQotIyBEZWxldGVMaW5rQ29tbWFuZA0KLWdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbD1WZXJiaW5kdW5nIGxcdTAwZjZzY2hlbg0KLSMgTW92ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfbW92ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9VmVyendlaWd1bmdzcHVua3QgdmVyc2NoaWViZW4NCi0jIFJlY29ubmVjdExpbmtDb21tYW5kDQotZ2VmX3JlY29ubmVjdExpbmtDb21tYW5kX2xhYmVsPUxpbmsgd2llZGVyaGVyc3RlbGxlbg0KLQ0KLSMgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyDQotZ2VmX3ZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9RGVyIE5hbWUgbXVzcyBhbmdlZ2ViZW4gd2VyZGVuLiBHZWJlbiBTaWUgZWluZW4gZ1x1MDBmY2x0aWdlbiBOYW1lbiBhbi4NCi0jIFZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyDQotZ2VmX3ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1EZXIgTmFtZSBtdXNzIGFuZ2VnZWJlbiB3ZXJkZW4uIEdlYmVuIFNpZSBlaW5lbiBnXHUwMGZjbHRpZ2VuIE5hbWVuIGFuLg0KLSMgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQNCi1nZWZfd29ya1Byb2R1Y3ROb2RlRWRpdFBhcnRfdmFsaWRhdGVNZXNzYWdlPURlciBOYW1lIG11c3MgYW5nZWdlYmVuIHdlcmRlbi4gR2ViZW4gU2llIGVpbmVuIGdcdTAwZmNsdGlnZW4gTmFtZW4gYW4uDQotDQotIyBFbGVtZW50c1ZpZXdEZWxldGVBY3Rpb24NCi1hY3Rpb25zX0VsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbl9tZXNzYWdlPURpZSBLb25maWd1cmF0aW9uICcnezB9Jycga2FubiBuaWNodCBnZWxcdTAwZjZzY2h0IHdlcmRlbiwgd2VpbCBzaWUgbm9jaCB2b24gUHJvemVzcyAnJ3sxfScnIHZlcndlbmRldCB3aXJkLg0KLQ0KLSMgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JUaXRsZT1GZWhsZXIgYmVpbSBMXHUwMGY2c2NoZW4NCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvck1lc3NhZ2U9TmljaHQgYmVoYW5kZWx0ZSBBdXNuYWhtZQ0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uPVNlaGVuIFNpZSBzaWNoIGRpZSBEZXRhaWxzIGFuLg0KLQ0KLSMgTWV0aG9kRWxlbWVudEVkaXRvcg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZT1GZWhsZXIgYmVpbSBTcGVpY2hlcm4NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTE9SVVQQTAwMjBFOiBGZWhsZXIgYmVpbSBTcGVpY2hlcm4gZGVyIERhdGVpDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UyPUZlaGxlciBiZWltIEZlc3RzY2hyZWliZW4NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMT1TdWNoZW4gU2llIGluIGRlciBQcm90b2tvbGxkYXRlaSBuYWNoIHdlaXRlcmVuIERldGFpbHMuDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjI9U2VoZW4gU2llIHNpY2ggZGllIERldGFpbHMgYW4uDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU9RmVobGVyIGJlaW0gVW1iZW5lbm5lbg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yTXNnPU1pbmRlc3RlbnMgZWluZSBEYXRlaSBkaWVzZXMgRWRpdG9ycyB3dXJkZSBlbnRmZXJudC4gRGVyIEVkaXRvciBpc3QgbmljaHQgbWVociBnXHUwMGZjbHRpZyB1bmQgbXVzcyBnZXNjaGxvc3NlbiB3ZXJkZW4uDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZT1VbmdcdTAwZmNsdGlnZXIgRWRpdG9yDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yTWVzc2FnZTE9RmVobGVyIGJlaW0gVW1iZW5lbm5lbiBkZXIgRGF0ZWkoZW4pICcnezB9JycNCi0NCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1yZW5hbWVFcnJvcl90aXRsZT1FbGVtZW50IHVtYmVuZW5uZW4NCi1yZW5hbWVFcnJvcl9tc2c9SVVQQTAwMTNFOiBEaWUgVW1iZW5lbm51bmdzb3BlcmF0aW9uIGthbm4gbmljaHQgYXVzZ2VmXHUwMGZjaHJ0IHdlcmRlbi4NCi1TZWxlY3RFbGVtZW50RGlhbG9nX3NlbGVjdGVsZW1lbnRfdGV4dD1FbGVtZW50IGF1c3dcdTAwZTRobGVuDQotDQotIyBFZGl0b3JDaG9vc2VyDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3RpdGxlPU1ldGhvZGVuZWRpdG9yIFx1MDBmNmZmbmVuDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZXNjcmlwdGlvbkxhYmVsPUJlc2NocmVpYnVuZzoNCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWw9QWxsZXMgYXVzd1x1MDBlNGhsZW4NCi1PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDA9RWxlbWVudCBiZWFyYmVpdGVuDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNFOiBEZXIgRWRpdG9yLCBkZXIgZGVtIGF1c2dld1x1MDBlNGhsdGVuIE1ldGhvZGVuZWxlbWVudCB6dWdlb3JkbmV0IGlzdCwga2FubiBuaWNodCBnZVx1MDBmNmZmbmV0IHdlcmRlbi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZT1HcmFmaWtkYXRlaSBhdXN3XHUwMGU0aGxlbg0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVmYXVsdExpYnJhcnlOYW1lPU5ldWUgQmlibGlvdGhlaw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZXNjcmlwdGlvbkxhYmVsPUJlc2NocmVpYnVuZzoNCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1XXHUwMGU0aGxlbiBTaWUgZWluZSBvZGVyIG1laHJlcmUgTWV0aG9kZW5rb25maWd1cmF0aW9uZW4gYXVzIHVuZCBrbGlja2VuIFNpZSBhbnNjaGxpZVx1MDBkZmVuZCBhdWYgRmVydGlnIHN0ZWxsZW4sIHVtIHNpZSB6dSBcdTAwZjZmZm5lbi4NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfRGVzZWxlY3RBbGxCdXR0b25MYWJlbD1BbGxlcyBhYndcdTAwZTRobGVuDQotRWxlbWVudHNWaWV3X21pZ3JhdGlvbl9kaXJfZGxnX2Rlc2NyaXB0aW9uX3RleHQ9VmVyemVpY2huaXMgZlx1MDBmY3IgTWlncmF0aW9uIHZvbiB7MH0gYWxzIEVyc2V0enVuZyBmXHUwMGZjciB7MH0gYW5nZWJlbi4NCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPUVzIGlzdCBlaW4gU3lzdGVtZmVobGVyIGF1ZmdldHJldGVuLiBLbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLlxuXA0KLVxuXA0KLVNjaGxpZVx1MDBkZmVuIFNpZSBlaW5pZ2UgZGVyIGdlXHUwMGY2ZmZuZXRlbiBFZGl0b3JlbiB1bmQgd2llZGVyaG9sZW4gU2llIGFuc2NobGllXHUwMGRmZW5kIGRlbiBWb3JnYW5nLg0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU9R3JhZmlrIGlzdCB1bmdcdTAwZmNsdGlnDQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMUU6IERpZSBhdXNnZXdcdTAwZTRobHRlIEdyYWZpayAnJ3swfScnIFx1MDBmY2JlcnNjaHJlaXRldCBkaWUgenVsXHUwMGU0c3NpZ2UgR3JcdTAwZjZcdTAwZGZlICh7MX0geCB7Mn0pLiBXXHUwMGU0aGxlbiBTaWUgZWluZSBhbmRlcmUgR3JhZmlrIGF1cy4NCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGU9R3JhZmlrIGlzdCB1bmdcdTAwZmNsdGlnDQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RlbXBsYXRlPUlVUEEwMDMyRTogRGllIGF1c2dld1x1MDBlNGhsdGUgRGF0ZWkgJyd7MH0nJyBpc3QgbmljaHQgdm9yaGFuZGVuLiBXXHUwMGU0aGxlbiBTaWUgZWluZSBhbmRlcmUgR3JhZmlrIGF1cy4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9QXVzd1x1MDBlNGhsZW4uLi4NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5RGVzY3JpcHRpb249QmVzY2hyZWlidW5nIGRlciBNZXRob2RlbmJpYmxpb3RoZWsNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVmYXVsdEJyaWVmRGVzY3JpcHRpb249QmVzY2hyZWlidW5nIGRlciBNZXRob2RlbmtvbmZpZ3VyYXRpb24NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPUFsbGUgRWRpdG9yZW4gbVx1MDBmY3NzZW4gZ2VzY2hsb3NzZW4gd2VyZGVuLiBXXHUwMGU0aGxlbiBTaWUgZGllIEVkaXRvcmVuIGF1cywgZGllIGdlZ2ViZW5lbmZhbGxzIHp1ZXJzdCBnZXNpY2hlcnQgd2VyZGVuIG1cdTAwZmNzc2VuLg0KLQ0KLSMgVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2UNCi1mb3Jtc19UZW1wbGF0ZURlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPURpZSBhdXNnZXdcdTAwZTRobHRlIERhdGVpIGlzdCBiZXJlaXRzIGVpbiBBbmhhbmcgZGllc2VyIFZvcmxhZ2UuDQotDQotIyBOZXcgTGlicmFyeSBFcnJvciBEaWFsb2cNCi1uZXdMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDE0RTogRGllIE1ldGhvZGVuYmlibGlvdGhlayBrYW5uIG5pY2h0IGVyc3RlbGx0IHdlcmRlbi4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMT1EZXIgYW5nZWdlYmVuZSBQZmFkIGZcdTAwZmNyIGRpZSBNZXRob2RlbmJpYmxpb3RoZWssICcnezB9JycsIGlzdCB1bmdcdTAwZmNsdGlnLg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24yPUVzIGlzdCBiZXJlaXRzIGVpbmUgTWV0aG9kZW5iaWJsaW90aGVrIGluICcnezB9Jycgdm9yaGFuZGVuLg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24zPURlciBhbmdlZ2ViZW5lIE9yZG5lciBmXHUwMGZjciBkaWUgTWV0aG9kZW5iaWJsaW90aGVrLCAnJ3swfScnLCBrYW5uIG5pY2h0IGVyc3RlbGx0IHdlcmRlbi4NCi1uZXdMaWJyYXJ5RXJyb3JfYWR2aWNlPVdcdTAwZTRobGVuIFNpZSBPSyBhdXMsIHVtIGVpbmVuIGFuZGVyZW4gTmFtZW4gb2RlciBQZmFkIGZcdTAwZmNyIGRpZSBCaWJsaW90aGVrIGFuenVnZWJlbi4NCi0NCi0jUHJvY2VzcyBsaXRlcmFscw0KLVByb2Nlc3NfRXh0ZXJuYWxJRD1FeHRlcm5lIElEOg0KLVByb2Nlc3NfUHVycG9zZT1ad2VjazoNCi1Qcm9jZXNzX1Njb3BlPVNjb3BlOg0KLVByb2Nlc3NfVXNhZ2VOb3Rlcz1WZXJ3ZW5kdW5nc2hpbndlaXNlOg0KLVByb2Nlc3NfQWx0ZXJuYXRpdmVzPUFsdGVybmF0aXZlbjoNCi1Qcm9jZXNzX0hvd1RvU3RhZmY9Vm9yZ2VoZW5zd2Vpc2UgYmVpIE1pdGFyYmVpdGVyYXVzd2FobDoNCi1Qcm9jZXNzX0tleUNvbnNpZGVyYXRpb249V2ljaHRpZ2UgSGlud2Vpc2U6DQotUHJvY2Vzc19TY2FsZT1Ta2FsaWVydW5nOg0KLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1Qcm9qZWt0bWVya21hbGU6DQotUHJvY2Vzc19SaXNrTGV2ZWw9UmlzaWtvc3R1ZmU6DQotUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlPVNjaFx1MDBlNHR6dW5nc3RlY2huaWtlbjoNCi1Qcm9jZXNzX1Byb2plY3RNZW1iZXJFeHBlcnRpc2U9S25vdy1ob3cgZGVyIFByb2pla3RtaXRhcmJlaXRlcjoNCi1Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0PVR5cCBkZXMgVmVydHJhZ3M6DQotDQotIyBFZGl0b3IgUHJldmlldyBOYXZpZ2F0aW9uIEJ1dHRvbnMNCi1iYWNrQnV0dG9uX3RleHQ9WnVyXHUwMGZjY2sNCi1mb3J3YXJkQnV0dG9uX3RleHQ9Vm9yDQotZm9yd2FyZF90ZXh0PVZvcg0KLXN0b3BCdXR0b25fdGV4dD1TdG9wcGVuDQotcmVmcmVzaEJ1dHRvbl90ZXh0PUFrdHVhbGlzaWVyZW4NCi1yZWZyZXNoX3RleHQ9QWt0dWFsaXNpZXJlbg0KLW5ld25hbWVfdGV4dD1OZXVlciBOYW1lOg0KLXByaW50QnV0dG9uX3RleHQ9RHJ1Y2tlbg0KLQ0KLSMgQ29udGV4dCBtZW51cw0KLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT0mQWt0dWFsaXNpZXJlbg0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPSZFaWdlbnNjaGFmdGVuIGFuemVpZ2VuDQotDQotX1VJX01ldGhvZEVkaXRvcl9tZW51PSZNZXRob2RlbmVkaXRvcg0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jk5ldQ0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1OJmV1ZXIgZ2xlaWNoZ2VvcmRuZXRlciBFaW50cmFnDQotDQotX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWw9QXVzd2FobA0KLV9VSV9QYXJlbnRQYWdlX2xhYmVsPVx1MDBkY2Jlcmdlb3JkbmV0ZXIgRWludHJhZw0KLV9VSV9MaXN0UGFnZV9sYWJlbD1MaXN0ZQ0KLV9VSV9UcmVlUGFnZV9sYWJlbD1CYXVtc3RydWt0dXINCi1fVUlfVGFibGVQYWdlX2xhYmVsPVRhYmVsbGUNCi1fVUlfVGFibGVUcmVlUGFnZV9sYWJlbD1UYWJsZVRyZWUNCi1fVUlfT2JqZWN0Q29sdW1uX2xhYmVsPU9iamVrdA0KLV9VSV9TZWxmQ29sdW1uX2xhYmVsPUVpZ2VudGxpY2hlciBFaW50cmFnDQotDQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9RXMgaXN0IG5pY2h0cyBhdXNnZXdcdTAwZTRobHQgd29yZGVuLg0KLV9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZD1BdXNnZXdcdTAwZTRobHRlcyBPYmpla3Q6IHswfQ0KLV9VSV9NdWx0aU9iamVjdFNlbGVjdGVkPUVzIHd1cmRlbiB7MH0gT2JqZWt0ZSBhdXNnZXdcdTAwZTRobHQuDQotDQotX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbD1FZGl0b3IgXHUwMGY2ZmZuZW4NCi0NCi1fVUlfV2l6YXJkX2NhdGVnb3J5PUFzc2lzdGVudGVuIGZcdTAwZmNyIGRpZSBFcnN0ZWxsdW5nIHZvbiBFTUYtQmVpc3BpZWxtb2RlbGxlbg0KLQ0KLV9VSV9NZXRob2RNb2RlbFdpemFyZF9sYWJlbD1NZXRob2Rlbm1vZGVsbA0KLV9VSV9NZXRob2RNb2RlbFdpemFyZF9kZXNjcmlwdGlvbj1OZXVlcyBNZXRob2Rlbm1vZGVsbCBlcnN0ZWxsZW4NCi0NCi1fVUlfTWV0aG9kRWRpdG9yX2xhYmVsPUVkaXRvciBmXHUwMGZjciBNZXRob2Rlbm1vZGVsbGUNCi0NCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZT1NeQ0KLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbj1tZXRob2QNCi0NCi1fVUlfV2l6YXJkX2xhYmVsPU5ldQ0KLQ0KLV9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uPURlciBEYXRlaW5hbWUgbXVzcyBtaXQgJycuezB9JycgZW5kZW4uDQotDQotX1VJX01vZGVsT2JqZWN0PU1vZGVsbG9iamVrdA0KLV9VSV9YTUxFbmNvZGluZz1YTUwtQ29kaWVydW5nDQotX1VJX1hNTEVuY29kaW5nQ2hvaWNlcz1VVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQ0KLV9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb249V1x1MDBlNGhsZW4gU2llIGVpbiB6dSBlcnN0ZWxsZW5kZXMgT2JqZWt0bW9kZWxsIGF1cy4NCi0NCi1fVUlfRmlsZUNvbmZsaWN0X2xhYmVsPURhdGVpa29uZmxpa3QNCi1fV0FSTl9GaWxlQ29uZmxpY3Q9RXMgc2luZCBuaWNodCBnZXNwZWljaGVydGUgXHUwMGM0bmRlcnVuZ2VuIHZvcmhhbmRlbiwgZGllIG1pdCBcdTAwYzRuZGVydW5nZW4gaW4gS29uZmxpa3Qgc3RlaGVuLCBkaWUgYXVcdTAwZGZlcmhhbGIgZGVzIEVkaXRvcnMgdm9yZ2Vub21tZW4gd3VyZGVuLiBcdTAwYzRuZGVydW5nZW4gaW4gZGllc2VtIEVkaXRvciB2ZXJ3ZXJmZW4/DQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1hZGRMaW5rRGlhbG9nX2xpbmtUeXBlPVR5cDoNCi1vcGVuTGlua0NoZWNrYm94X3RleHQ9TGluayBpbiBlaW5lbSBnZXNvbmRlcnRlbiBCcm93c2VyZmVuc3RlciBcdTAwZjZmZm5lbg0KLQ0KLSMgQWRkIEltYWdlIERpYWxvZw0KLWhlaWdodExhYmVsX3RleHQ9SFx1MDBmNmhlOg0KLXdpZHRoTGFiZWxfdGV4dD1CcmVpdGU6DQotRWxlbWVudHNWaWV3XzIwPVByb3plc3NtdXN0ZXINCi1FbGVtZW50c1ZpZXdfMjE9QmVyZWl0c3RlbGx1bmdzcHJvemVzcw0KLUVsZW1lbnRzVmlld18yMj1Qcm96ZXNzDQotRWxlbWVudHNWaWV3XzM1PXswfSBpc3Qgc2NocmVpYmdlc2NoXHUwMGZjdHp0LiBCZXZvciBTaWUgZGVuIFZvcmdhbmcgZm9ydHNldHplbiwgbVx1MDBmY3NzZW4gU2llIGRhZlx1MDBmY3Igc29yZ2VuLCBkYXNzIGluIGRpZSBEYXRlaSBnZXNjaHJpZWJlbiB3ZXJkZW4ga2Fubi4NCi1FbGVtZW50c1ZpZXdfMzY9RmVobGVyIGJlaW0gTGFkZW4gZGVyIEJpYmxpb3RoZWsNCi1hbHRUYWdMYWJlbF90ZXh0PUFMVC1UYWc6DQotaW1hZ2VTaXplTGFiZWxfdGV4dD1EaWUgTWluZGVzdC0gdW5kIE1heGltYWx3ZXJ0ZSBmXHUwMGZjciBIXHUwMGY2aGUgdW5kIEJyZWl0ZSBlaW5lcyBCaWxkZXMgc2luZCAxMCBiencuIDYwMC4gVW5nXHUwMGZjbHRpZ2UgSFx1MDBmNmhlbi0gdW5kIEJyZWl0ZW5hbmdhYmVuIHdlcmRlbiBpbiBlaW5lIGFuZ2VtZXNzZW5lIEdyXHUwMGY2XHUwMGRmZSBrb252ZXJ0aWVydC4NCi0NCi0jIFByb2Nlc3MgRWRpdG9yDQotUHJvY2Vzc0VkaXRvcj1Qcm9jZXNzRWRpdG9yDQotUHJvY2Vzc0VkaXRvcl9OYW1lPU5hbWUNCi1Qcm9jZXNzRWRpdG9yX1ByZXNlbnRhdGlvbk5hbWU9UHJcdTAwZTRzZW50YXRpb25zbmFtZQ0KLVByb2Nlc3NFZGl0b3JfSW5kZXg9SW5kZXgNCi1Qcm9jZXNzRWRpdG9yX1ByZWRlY2Vzc29ycz1Wb3JnXHUwMGU0bmdlcg0KLSNDb25maWd1cmF0aW9uUGFnZV9TZWxlY3RlZD1TZWxlY3RlZDogDQotQ2hlY2tsaXN0T3JkZXJfZGVzY3JpcHRpb249V1x1MDBlNGhsZW4gU2llIGVpbmVuIFByXHUwMGZjZmxpc3RlbmVpbnRyYWcgYXVzIG9kZXIgXHUwMGU0bmRlcm4gU2llIG1pdCBOYWNoIG9iZW4gdW5kIE5hY2ggdW50ZW4gZGllIFBvc2l0aW9uIGRlcyBFaW50cmFncyBpbiBkZXIgTGlzdGUuDQotRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQ9VW1iZW5lbm5lbi4uLg0KLVByb2Nlc3NFZGl0b3JfTW9kZWxJbmZvPU1vZGVsbGluZm8NCi1Qcm9jZXNzRWRpdG9yX1ByZWZpeD1Qclx1MDBlNGZpeA0KLU1vdmVEaWFsb2dfbW92ZV90ZXh0PVZlcnNjaGllYmVuDQotQ2hlY2tsaXN0T3JkZXJfdGl0bGU9UHJcdTAwZmNmbGlzdGVuZWludHJcdTAwZTRnZSBzb3J0aWVyZW4NCi1Qcm9jZXNzRWRpdG9yX1JlcGV0YWJsZT1XaWVkZXJob2x0IGFud2VuZGJhcg0KLVByb2Nlc3NFZGl0b3JfT25nb2luZz1Gb3J0bGF1ZmVuZA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N5bmNocm9uaXphdGlvbj1TeW5jaHJvbmlzaWVyZW4uLi4NCi1Qcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuPUVyZWlnbmlzZ2VzdGV1ZXJ0DQotUHJvY2Vzc0VkaXRvcl9EZWxpdmVyYWJsZT1MaWVmZXJnZWdlbnN0YW5kDQotUHJvY2Vzc0VkaXRvcl9PcHRpb25hbD1PcHRpb25hbA0KLUZpbHRlckRpYWxvZ19UeXBlX3RleHQ9VHlwIGRlcyBNZXRob2RlbmVsZW1lbnRzOg0KLUZpbHRlckRpYWxvZ19FeHBhbmRBbGw9QWxsZXMgZWluYmxlbmRlbg0KLU1vdmVEaWFsb2dfbW92aW5nX3RleHQ9VmVyc2NoaWViZW4uLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25XYXJuaW5nPUlVUEEwMDI1VzogRGFzIEZvcm1zeW1ib2wgZlx1MDBmY3IgezB9IHd1cmRlIG5pY2h0IGltIFBmYWQgZ2VmdW5kZW46IHsxfQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yPUlVUEEwMDI1RTogRmVobGVyOiBBYnNjaG5pdHQgZlx1MDBmY3IgRm9ybXN5bWJvbDogezB9DQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9OYW1lTGFiZWw9TmFtZToNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPU5ldWUgTWV0aG9kZW5rb25maWd1cmF0aW9uIGVyc3RlbGxlbg0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9OYW1lTGFiZWw9TmFtZToNCi1BdXRob3JpbmdVSVBsdWdpbl9uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlPU5ldWUgTWV0aG9kZW5rb25maWd1cmF0aW9uDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VUaXRsZT1OZXVlIE1ldGhvZGVuYmlibGlvdGhlayBlcnN0ZWxsZW4NCi1uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlPU5ldWUgTWV0aG9kZW5iaWJsaW90aGVrDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVUaXRsZT1cdTAwYzRuZGVydW5nZW4gc3BlaWNoZXJuDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1HZWJlbiBTaWUgZWluZW4gTmFtZW4sIGVpbmUgQmVzY2hyZWlidW5nIHVuZCBlaW4gWmllbHZlcnplaWNobmlzIGZcdTAwZmNyIGRpZSBuZXVlIE1ldGhvZGVuYmlibGlvdGhlayBhbi4NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZURlc2NyaXB0aW9uPU1pbmRlc3RlbnMgZWluIE1ldGhvZGVuZWxlbWVudCB3dXJkZSBnZVx1MDBlNG5kZXJ0LiBXXHUwMGU0aGxlbiBTaWUgZGllIGF1cywgZGllIGdlc3BlaWNoZXJ0IHdlcmRlbiBtXHUwMGZjc3Nlbi4NCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1NZXRob2RlbmtvbmZpZ3VyYXRpb25lbiBcdTAwZjZmZm5lbg0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlPU1ldGhvZGVua29uZmlndXJhdGlvbmVuIFx1MDBmNmZmbmVuDQotRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ9ezB9IHdpcmQgZXJzZXR6dC4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uV2FybmluZz1JVVBBMDAyNlc6IERhcyBLbm90ZW5zeW1ib2wgZlx1MDBmY3IgezB9IHd1cmRlIG5pY2h0IGltIFBmYWQgezF9IGdlZnVuZGVuLg0KLU1lc3NhZ2VMYWJlbFByb3ZpZGVyX3Vuc2VsZWN0ZWRwYWNrYWdlcz0nJ3swfScnIGVudGhcdTAwZTRsdCBFbGVtZW50ZSwgZGllIGF1ZiBFbGVtZW50ZSBpbiBuaWNodCBhdXNnZXdcdTAwZTRobHRlbiBQYWtldGVuIHZlcndlaXNlbi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbkVycm9yPUlVUEEwMDI2RTogRmVobGVyOiBBYnNjaG5pdHQgZlx1MDBmY3IgS25vdGVuc3ltYm9sOiB7MH0NCi1TdGVwc09yZGVyRGlhbG9nX3N0ZXBzPVNjaHJpdHRlOg0KLQ0KLVN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU9QXVmZ2FiZW5zY2hyaXR0ZSBzb3J0aWVyZW4NCi1Qcm9jZXNzRWRpdG9yX1BsYW5uZWQ9R2VwbGFudA0KLXNwZWNpZnlkaXJlY3RvcnlfdGV4dD1HZWJlbiBTaWUgZWluIFZlcnplaWNobmlzIGVpbiwgaW4gZGVtIGRpZSBNZXRob2RlbmJpYmxpb3RoZWsgZ2VzcGVpY2hlcnQgd2VyZGVuIHNvbGwuDQotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPU1laHJlcmUgVm9ya29tbWVuDQotUHJvY2Vzc0VkaXRvcl9FbnRyeVN0YXRlPUFuZmFuZ3N6dXN0YW5kDQotUHJvY2Vzc0VkaXRvcl9FeGl0U3RhdGU9RW5kenVzdGFuZA0KLXNlbGVjdENvbHVtbnN0b0FkZF90ZXh0PUhpbnp1enVmXHUwMGZjZ2VuZGUgU3BhbHRlbiBhdXN3XHUwMGU0aGxlbg0KLVByb2Nlc3NFZGl0b3JfVHlwZT1UeXANCi1Qcm9jZXNzRWRpdG9yX1RlYW09VGVhbQ0KLUZpbHRlckRpYWxvZ190aXRsZT1EaWFsb2cgYXVzd1x1MDBlNGhsZW46IA0KLQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZD1IaW56dWZcdTAwZmNnZW4gYXVzICZNZXRob2RlbmluaGFsdC4uLg0KLUZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbD1BbGxlcyBhdXNibGVuZGVuDQotT3BlbkNoZWF0c2hlZXRWaWV3X3RpdGxlPVNwaWNremV0dGVsc2ljaHQgXHUwMGY2ZmZuZW4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsVXA9Um9sbHVwDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd249Um9sbGRvd24NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA9TmFjaCAmb2Jlbg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVEb3duPU5hY2ggJnVudGVuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsPVJldmUmYWwNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db3B5PSZLb3BpZXJlbi4uLg0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ9TmFtZW5zbXVzdGVyIChcdTAwZmNiZXJlaW5zdGltbWVuZGUgTmFtZW4gd2VyZGVuIGFuZ2V6ZWlndCk6DQotDQotTWV0aG9kTGlicmFyeUVkaXRvcl90aXRsZT1NZXRob2RlbmJpYmxpb3RoZWs6DQotI01lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ9U2VsZWN0ZWQ6IA0KLU1lc3NhZ2VWaWV3X2Vycm1zZ190ZXh0PUJlc2NocmVpYnVuZw0KLUVsZW1lbnRzVmlld19lcnJfc2F2aW5nPUlVUEEwMDI3RTogRmVobGVyIGJlaW0gU3BlaWNoZXJuIHZvbiAnJ3swfScnezF9DQotDQotZXJyX2NvcHlpbmdfZmlsZV90aXRsZT1GZWhsZXIgYmVpbSBLb3BpZXJlbiBkZXIgRGF0ZWkNCi1lcnJfY29weWluZ19maWxlX2Vycm9yPUlVUEEwMDI4RTogRGFzIFN5bWJvbCBrb25udGUgbmljaHQgenVnZW9yZG5ldCB3ZXJkZW4uIA0KLWVycl9jb3B5aW5nX2ZpbGVfcmVhc29uPUJlaW0gS29waWVyZW4gZGVyIGF1c2dld1x1MDBlNGhsdGVuIERhdGVpIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBLbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU9RmVobGVyIGJlaW0gVmVyYXJiZWl0ZW4gZGVyIERhdGVpDQotZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcD1Lb25maWd1cmF0aW9uIGJlYXJiZWl0ZW4NCi1lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQ9SVVQQTAwMTVFOiBEYXMgRWxlbWVudCBrYW5uIG5pY2h0IGJlYXJiZWl0ZXQgd2VyZGVuDQotU2F2ZVRoaXNBY3Rpb25fc2F2ZW9iamVjdD1PYmpla3Qgc3BlaWNoZXJuLi4uDQotRWxlbWVudHNWaWV3X3JlcGxhY2VfdGV4dD1FcnNldHplbg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0V4dGVuZD0mRXJ3ZWl0ZXJuLi4uDQotTW92ZURpYWxvZ19kZXN0aW5hdGlvbl90ZXh0PVppZWwgZlx1MDBmY3IgYXVzZ2V3XHUwMGU0aGx0ZSBFbGVtZW50ZSBhdXN3XHUwMGU0aGxlbjoNCi1jaG9vc2VEZWZhdWx0RGlyZWN0b3J5X3RleHQ9U3RhbmRhcmR2ZXJ6ZWljaG5pcyBmXHUwMGZjciBCaWJsaW90aGVrZW4gYXVzd1x1MDBlNGhsZW46DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3M9VW50ZXJkJnJcdTAwZmNja2VuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3MyPVZlclx1MDBmNmZmZW50bGljaHVuZ3NvJnB0aW9uZW4uLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbT1CZW4mdXR6ZXJkZWZpbmllcnRlIERpYWdyYW1tZS4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ190aXRsZT1CZW51dHplcmRlZmluaWVydGUgRGlhZ3JhbW1lIHp1b3JkbmVuDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U9QWt0aXZpdFx1MDBlNHRzZGlhZ3JhbW06DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlPUFrdGl2aXRcdTAwZTR0c2RldGFpbGRpYWdyYW1tOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1BcmJlaXRzZXJnZWJuaXNhYmhcdTAwZTRuZ2lna2VpdHNkaWFncmFtbToNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfbm90YUZpbGU9SVVQQTAwMDRFOiBEZXIgYW5nZWdlYmVuZSBQZmFkIGlzdCBrZWluZSBEYXRlaS4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uPUF1c3dcdTAwZTRobGVuLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDI0RTogRGllIGFuZ2VnZWJlbmUgR3JhZmlrIGlzdCBuaWNodCBpbiBkZXIgQmlibGlvdGhlayBlbnRoYWx0ZW4uIFZlcmdld2lzc2VybiBTaWUgc2ljaCwgZGFzcyBkZXIgUGZhZCByZWxhdGl2IHp1bSBTdGFtbXZlcnplaWNobmlzIGRlciBCaWJsaW90aGVrIGVpbmdlZ2ViZW4gd3VyZGUuDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3NlbGVjdGVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAzMEU6IERpZSBhdXNnZXdcdTAwZTRobHRlIEdyYWZpayBpc3QgbmljaHQgaW4gZGVyIEJpYmxpb3RoZWsgZW50aGFsdGVuLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBREltYWdlPUdyYWZpayBmXHUwMGZjciBBa3Rpdml0XHUwMGU0dHNkaWFncmFtbSBmXHUwMGZjciBCcm93c2luZyB1bmQgVmVyXHUwMGY2ZmZlbnRsaWNodW5nIHZlcndlbmRlbg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBRERJbWFnZT1HcmFmaWsgZlx1MDBmY3IgQWt0aXZpdFx1MDBlNHRzZGV0YWlsZGlhZ3JhbW0gZlx1MDBmY3IgQnJvd3NpbmcgdW5kIFZlclx1MDBmNmZmZW50bGljaHVuZyB2ZXJ3ZW5kZW4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlV1BESW1hZ2U9R3JhZmlrIGZcdTAwZmNyIEFyYmVpdHNlcmdlYm5pc2FiaFx1MDBlNG5naWdrZWl0c2RpYWdyYW1tIGZcdTAwZmNyIEJyb3dzaW5nIHVuZCBWZXJcdTAwZjZmZmVudGxpY2h1bmcgdmVyd2VuZGVuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29udHJpYnV0ZT1Mb2thbGVyIEJlaXRyYWcNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXBsYWNlPUxva2FsZSBFcnNldHp1bmcNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9EaWFncmFtcz1EaWEmZ3JhbW1lDQotUHJvY2Vzc0VkaXRvcl9hY3Rpb25fZGVlcENvcHk9JlRpZWZlIEtvcGllLi4uDQotRmlsdGVyRGlhbG9nX0JyaWVmRGVzY3JpcHRpb249S3VyemJlc2NocmVpYnVuZzoNCi1Db25maWd1cmF0aW9uUGFnZV9oaWRlVG9vbFRpcD1OaWNodCBhdXNnZXdcdTAwZTRobHRlIEVsZW1lbnRlIGVpbi0vYXVzYmxlbmRlbg0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uPUJlc2NocmVpYnVuZzoNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbD1OaWNodHMgdmVyXHUwMGY2ZmZlbnRsaWNoZW4NCi1GaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbj1NdXN0ZXIgd2VyZGVuIGR1cmNoIEtvbW1hdGEgdm9uZWluYW5kZXIgZ2V0cmVubnQuIEluIGVpbmVtIE11c3RlciBrYW5uICogZlx1MDBmY3IgZWluZSBiZWxpZWJpZ2UgWmVpY2hlbmZvbGdlIHVuZCA/ICBmXHUwMGZjciBlaW4gYmVsaWViaWdlcyBaZWljaGVuIHZlcndlbmRldCB3ZXJkZW4uDQotQ29uZmlndXJhdGlvblBhZ2VfVHJlZVRpdGxlTGFiZWw9SW5oYWx0Og0KLUNvbmZpZ3VyYXRpb25QYWdlX0xvYWRpbmdNZXNzYWdlPUtvbmZpZ3VyYXRpb24gd2lyZCBnZWxhZGVuLiBCaXR0ZSB3YXJ0ZW4uLi4NCi1Nb3ZlRGlhbG9nX3ZhbGlkZGVzdGluYXRpb25fdGV4dD1EYXMgYW5nZWdlYmVuZSBaaWVsIGZcdTAwZmNyIFZlcnNjaGllYmVuIGlzdCBuaWNodCBnXHUwMGZjbHRpZy4NCi1Nb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uPUlVUEEwMDM0RTogRGllIGF1c2dld1x1MDBlNGhsdGUgWmllbGFkcmVzc2Uga2FubiBuaWNodCBnZVx1MDBlNG5kZXJ0IHdlcmRlbi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw9QWxsZXMgdmVyXHUwMGY2ZmZlbnRsaWNoZW4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQmFzZUFjdGl2aXR5PUJhc2lzYWt0aXZpdFx1MDBlNHQgXHUwMGY2ZmZuZW4NCi1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPUFsbGVzIGUmaW5ibGVuZGVuDQotUHJvY2Vzc0Zvcm1FZGl0b3JfY29sbGFwc2VBbGxBY3Rpb25MYWJlbD1BbGxlcyBhdXNiJmxlbmRlbg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURpYWdyYW09JkFrdGl2aXRcdTAwZTR0c2RpYWdyYW1tIFx1MDBmNmZmbmVuDQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbD1EaWUgdW50ZXIgRGV0YWlscyBhdWZnZWxpc3RldGVuIHVudGVyZHJcdTAwZmNja3RlbiBEZXNrcmlwdG9yZW4gbVx1MDBmY3NzZW4gZ2VsXHUwMGY2c2NodCB3ZXJkZW4sIHVtIG5hY2ggZGVtIEVpbmJsZW5kZW4gZGVyIGF1c2dld1x1MDBlNGhsdGVuIEVsZW1lbnRlIER1cGxpemllcnVuZ2VuIHp1IHZlcm1laWRlbi4gS2xpY2tlbiBTaWUgYXVmIE9LLCB3ZW5uIFNpZSBkaWUgRGVza3JpcHRvcmVuIGxcdTAwZjZzY2hlbiB1bmQgZm9ydGZhaHJlbiBtXHUwMGY2Y2h0ZW4uDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX1NlbGVjdENvbHVtbnM9SGluenV6dWZcdTAwZmNnZW5kZSBTcGFsdGVuIGF1c3dcdTAwZTRobGVuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT1Ba3Rpdml0XHUwMGU0dHMmZGV0YWlsZGlhZ3JhbW0NCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfQ29sdW1uU2VsZWN0aW9uPVNwYWx0ZW5hdXN3YWhsOg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zd2l0Y2hDb25maWd1cmF0aW9uPUJlaW0gQWt0aXZpZXJlbiBlaW5lcyBQcm96ZXNzZWRpdG9ycyBhdWYgZGllIFN0YW5kYXJka29uZmlndXJhdGlvbiBkZXMgUHJvemVzc2VzIHVtc2NoYWx0ZW4NCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3VwcHJlc3Npb25Hcm91cFRpdGxlPVVudGVyZHJcdTAwZmNja3VuZw0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9pbmhlcml0U3VwcHJlc3Npb25TdGF0ZT1VbnRlcmRyXHUwMGZjY2t1bmdzenVzdFx1MDBlNG5kZSBcdTAwZmNiZXJuZWhtZW4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbT1BJnJiZWl0c2VyZ2VibmlzYWJoXHUwMGU0bmdpZ2tlaXRzZGlhZ3JhbW0gXHUwMGY2ZmZuZW4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1JbmhhbHQgbFx1MDBmNnNjaGVuDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9QXVzd1x1MDBlNGhsZW4uLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9JbnNlcnROZXdQaGFzZT1OZXVlIFBoYXNlIGVpbmZcdTAwZmNnZW4NCi1WaWV3SGVscGVyX3JlbG9hZExpYk9uUm9sbGJhY2tFcnJvcj1SZWNvdmVyeSBuYWNoIGVpbmVtIHBlcm1hbmVudGVuIEZlaGxlciBuaWNodCBtXHUwMGY2Z2xpY2guIERpZSBCaWJsaW90aGVrIG11c3MgZXJuZXV0IGdlbGFkZW4gd2VyZGVuLCB1bSBkZW4gdXJzcHJcdTAwZmNuZ2xpY2hlbiBadXN0YW5kIHdpZWRlcmhlcnp1c3RlbGxlbi4NCi1WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkX3RleHQ9RGFzIEVsZW1lbnQgJyd7MH0nJyB3dXJkZSBiZXJlaXRzIGdlbFx1MDBmNnNjaHQuDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZGNvbmZpcm1fdGV4dD1EYXMgRWxlbWVudCAnJ3swfScnIHd1cmRlIGJlcmVpdHMgZ2VsXHUwMGY2c2NodC4gXA0KLUVsZW1lbnQgYXVzICcnezF9JycgZW50ZmVybmVuPw0KLUNvbmZpZ3VyYXRpb25QYWdlX0FkZE1pc3NpbmdUb29sVGlwPUZlaGxlbmRlIFJlZmVyZW56ZW4gaGluenVmXHUwMGZjZ2VuDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb249QmVzY2hyZWlidW5nDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm89QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuDQotDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPU11cyZ0ZXIgYW53ZW5kZW4NCi1Nb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ9V1x1MDBlNGhsZW4gU2llIGVpbmUgWmllbGFkcmVzc2UgYXVzLg0KLU1vdmVEaWFsb2dfbm9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnPUVzIHd1cmRlIGtlaW4gWmllbCBmXHUwMGZjciBWZXJzY2hpZWJlbiBhbmdlZ2ViZW4uDQotTWV0aG9kTGlicmFyeUVkaXRvcl90cm91Ymxlb2JqZWN0PS4gRmVobGVyaGFmdGVzIE9iamVrdDogDQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfZXJyY2hpbGRwa2dzPUVpbiB1bnRlcmdlb3JkbmV0ZXMgSW5oYWx0c3Bha2V0IG9kZXIgZWluIFByb3plc3MgZW50aFx1MDBlNGx0IEVsZW1lbnRlIG1pdCBmZWhsZW5kZW4gUmVmZXJlbnplbg0KLVByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfVGl0bGU9VmVyXHUwMGY2ZmZlbnRsaWNodW5nc29wdGlvbmVuIGZcdTAwZmNyIERpYWdyYW1tDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlPVdcdTAwZTRobGVuIFNpZSBkaWUgenUgdmVyXHUwMGY2ZmZlbnRsaWNoZW5kZW4gRGlhZ3JhbW1lIGF1cyB1bmQgd1x1MDBlNGhsZW4gU2llIGRpZSBEaWFncmFtbWUgYWIsIGRpZSBTaWUgbmljaHQgdmVyXHUwMGY2ZmZlbnRsaWNoZW4gbVx1MDBmNmNodGVuLg0KLVByb2Nlc3NFZGl0b3JfVGl0bGU9UHJvemVzc2VkaXRvcjogDQotU2F2ZUFzd2l0aGRvdHNfdGV4dD1TcGVpY2hlcm4gdW50ZXIuLi4NCi1Qcm9jZXNzRWRpdG9yX1dvcmtCcmVha2Rvd25TdHJ1Y3R1cmU9UHJvamVrdHN0cnVrdHVycGxhbg0KLVByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb249VGVhbXp1b3JkbnVuZw0KLVByb2Nlc3NFZGl0b3JfV29ya1Byb2R1Y3RVc2FnZT1WZXJ3ZW5kdW5nIGRlciBBcmJlaXRzZXJnZWJuaXNzZQ0KLVByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldz1Lb25zb2xpZGllcnRlIFNpY2h0DQotUHJvY2Vzc0VkaXRvcl9jb25maXJtQXV0b1N5bmNoPURpZXNlIE9wZXJhdGlvbiBha3R1YWxpc2llcnQgZGllIGF1c2dld1x1MDBlNGhsdGVuIERlc2tyaXB0b3JlbiBiencuIGFsbGUgRGVza3JpcHRvcmVuIHVudGVyaGFsYiBkZXIgYXVzZ2V3XHUwMGU0aGx0ZW4gQWt0aXZpdFx1MDBlNHRlbiwgZGllIGF1ZiBkZXIgUmVnaXN0ZXJrYXJ0ZSBBbGxnZW1laW4gZGVyIEVpZ2Vuc2NoYWZ0ZW5zaWNodCBtaXQgIlN5bmNocm9uaXNpZXJ0IG1pdCBRdWVsbGUiIGdla2VubnplaWNobmV0IHNpbmQuIFNpZSBha3R1YWxpc2llcnQgZGllc2UgRGVza3JpcHRvcmVuIG1pdCBkZW4gdXJzcHJcdTAwZmNuZ2xpY2hlbiBFaWdlbnNjaGFmdGVuIGRlciB2ZXJsaW5rdGVuIE1ldGhvZGVuaW5oYWx0c2VsZW1lbnRlIGluIGRlciBTdGFuZGFyZGtvbmZpZ3VyYXRpb24gZGVzIFByb3plc3Nlcy4gQmVhY2h0ZW4gU2llLCBkYXNzIGtlaW5lIGR5bmFtaXNjaCB2ZXJsaW5rdGVuIERlc2tyaXB0b3JlbiAoZ3JcdTAwZmNuZSBLdXJzaXZzY2hyaWZ0KSBha3R1YWxpc2llcnQgd2VyZGVuLiBGb3J0ZmFocmVuPw0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMT1Lb25maWd1cmF0aW9uDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yPVBsdWctaW4tIHVuZCBQYWtldGF1c3dhaGwNCi1OZXdMaWJyYXJ5RGlhbG9nX25ld2xpYnJhcnlfYXM9TmV1ZSBCaWJsaW90aGVrIGVyc3RlbGxlbiB1bnRlcg0KLU5ld1BsdWdpbkRpYWxvZ19uZXdwbHVnaW5fdGV4dD1OZXVlcyBNZXRob2Rlbi1QbHVnLWluDQotU2VsZWN0RWxlbWVudERpYWxvZ190aXRsZV90ZXh0PVdcdTAwZTRobGVuIFNpZSBkYXMgRWxlbWVudCBvZGVyIGVpbmVuIHNlaW5lciBCZWl0clx1MDBlNGdlIGF1czoNCi1PcGVuQ29uZmlnRGlhbG9nbmV3Y29uZmlnX3RleHQ9TmV1ZSBLb25maWd1cmF0aW9uOg0KLXByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZV9CU0VkaXRvcj1Qcm96ZXNzZWRpdG9yDQotDQotIyBBYnN0cmFjdERpYWdyYW1FZGl0b3INCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9QXVzcmljaHRlbg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PUFuaGFuZCBkZXIgQmFzaXNha3Rpdml0XHUwMGU0dCBha3R1YWxpc2llcmVuDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0PVRleHRmZWxkIGZvcm1hdGllcmVuLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1Ib3Jpem9udGFsIGFuIER1cmNoc2Nobml0dHNrb29yZGluYXRlbg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9SG9yaXpvbnRhbCBhbiBlcnN0ZXIgYXVzZ2V3XHUwMGU0aGx0ZXIgS29vcmRpbmF0ZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9VmVydGlrYWwgYW4gRHVyY2hzY2huaXR0c2tvb3JkaW5hdGVuDQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl90aXRsZT1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4NCi1Nb3ZlRGlhbG9nX2ludmFsaWRfbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1JVVBBMDA0MUU6IERpZSBhdXNnZXdcdTAwZTRobHRlbiBFbGVtZW50ZSBrXHUwMGY2bm5lbiBuaWNodCBhbiBkaWUgYW5nZWdlYmVuZSBaaWVsYWRyZXNzZSB2ZXJzY2hvYmVuIHdlcmRlbi4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVtb2RlbGxpYnJhcnk9TW9kZWxsYmlibGlvdGhlayB3aXJkIGdlc3BlaWNoZXJ0Li4uDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU9RmVobGVyDQotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c9SVVQQTAwMzNFOiBCZWltIFNwZWljaGVybiBkZXIgQmlibGlvdGhlayBpc3QgZWluIEZlaGxlciBhdWZnZXRyZXRlbi4NCi1NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dD0nJ3swfScnIHdpcmtsaWNoIGxcdTAwZjZzY2hlbj8NCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19Db250ZW50RWxlbWVudF90ZXh0PUluaGFsdHNlbGVtZW50ZTogDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Ccm93c2VCdXR0b25MYWJlbD1EdXJjaHN1Y2hlbi4uLg0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249R2ViZW4gU2llIGVpbmVuIE5hbWVuIHVuZCBlaW5lIEJlc2NocmVpYnVuZyBmXHUwMGZjciBkaWUgbmV1ZSBNZXRob2RlbmtvbmZpZ3VyYXRpb24gYW4uDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VUaXRsZT1cdTAwYzRuZGVydW5nZW4gc3BlaWNoZXJuIHVuZCBhbGxlIEVkaXRvcmVuIHNjaGxpZVx1MDBkZmVuDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWthbCBhbiBlcnN0ZXIgYXVzZ2V3XHUwMGU0aGx0ZXIgS29vcmRpbmF0ZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9U3BlaWNoZXJuDQotQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dD1EYXRlaSBhbmhcdTAwZTRuZ2VuDQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudD1Lb25maWd1cmF0aW9uc2luaGFsdA0KLU9wZW5Db25maWdEaWFsb2dvcGVuY29uZmlnX3RleHQ9S29uZmlndXJhdGlvbiBcdTAwZjZmZm5lbg0KLUVsZW1lbnRzVmlld19yZXBsYWNlQWN0aW9uX3RleHQ9RXJzZXR6ZW4uLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPXswfSB3aXJkIGdlc3BlaWNoZXJ0DQotQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcD1WaWV3ZXIgZlx1MDBmY3IgS29uZmlndXJhdGlvbnN3YXJudW5nc3Byb3Rva29sbCBhbnplaWdlbg0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkZvcm1QcmVmaXg9S29uZmlndXJhdGlvbjoNCi0NCi1DaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0PVByXHUwMGZjZmxpc3RlbmVpbnRyXHUwMGU0Z2U6IA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1Lbm90ZW4gdmVyc2NoaWViZW4NCi1Db25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXA9RmVobGVyYmVoZWJ1bmcgZlx1MDBmY3IgS29uZmlndXJhdGlvbnNhYnNjaGx1c3MNCi1OZXdQbHVnaW5EaWFsb2dfcmVmZXJlbmNlcGx1Z2luX3RleHQ9UmVmZXJlbnotUGx1Zy1pbnM6DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2NyZWF0ZUZyZWVUZXh0X3RleHQ9VGV4dCBtaXQgZnJlaWVtIEZvcm1hdCBlcnN0ZWxsZW4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbD1Wb3JhbnplaWdlIGRlcyBLbm90ZW5zeW1ib2xzOg0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0PUlVUEEwMDMyVzogVmVyYmluZHVuZyBrYW5uIG5pY2h0IGhlcmdlc3RlbGx0IHdlcmRlbg0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0PUlVUEEwMDMzVzogRWluIFN0cnVrdHVyZWxlbWVudCBrYW5uIG5pY2h0IGdsZWljaHplaXRpZyBWb3JnXHUwMGU0bmdlciB1bmQgTmFjaGZvbGdlciBzZWluLg0KLQ0KLSMgRWRpdG9yQ2hvb3Nlcg0KLUVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlPUVkaXRvciBcdTAwZjZmZm5lbg0KLUVkaXRvckNob29zZXJfUmVzb3VyY2VzRXJyb3I9RGllc2VzIEVsZW1lbnQgZW50aFx1MDBlNGx0IEZlaGxlci4gRXMgd2lyZCBlbXBmb2hsZW4sIGRpZSBGZWhsZXIgenUgYmVoZWJlbiwgYmV2b3IgZGVyIFZvcmdhbmcgZm9ydGdlc2V0enQgd2lyZCAoc2llaGUgRGV0YWlscykuXG5cDQotXG5cDQotS2xpY2tlbiBTaWUgYXVmIE9LLCB1bSBkZW4gVm9yZ2FuZyBvaG5lIFx1MDBkNmZmbmVuIGRlcyBFZGl0b3JzIGZvcnR6dXNldHplbi4gU2NobGllXHUwMGRmZW4gU2llIGRlbiBEaWFsb2csIHVtIGRlbiBFZGl0b3IgenUgXHUwMGY2ZmZuZW4uDQotQ29uZmlndXJhdGlvblBhZ2VfRm9ybVByZWZpeD1Lb25maWd1cmF0aW9uOg0KLQ0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbk5hbWU9TmFtZToNCi1BdHRhY2htZW50RGlhbG9nRmlsZVVSTF90ZXh0PURhdGVpLVVSTDoNCi1TdGVwc09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uPVdcdTAwZTRobGVuIFNpZSBlaW5lbiBTY2hyaXR0IGF1cyBvZGVyIFx1MDBlNG5kZXJuIFNpZSBtaXQgTmFjaCBvYmVuIHVuZCBOYWNoIHVudGVuIGRpZSBQb3NpdGlvbiBkZXMgRWludHJhZ3MgaW4gZGVyIExpc3RlLg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyX3NhdmU9QmVpbSBTcGVpY2hlcm4gaXN0IGVpbiBGZWhsZXIgYXVmZ2V0cmV0ZW4uDQotTWVzc2FnZVZpZXdfZXJyZWxlbWVudF90ZXh0PVJlZmVyZW56aWVyZW5kZXMgRWxlbWVudA0KLU1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dD1SZWZlcmVuemllcnRlcyBFbGVtZW50DQotDQotI0FjdGl2aXR5IERpYWdyYW0NCi1BY3Rpdml0eURpYWdyYW1FZGl0b3JfY3JlYXRlU3RhcnROb2RlX3RleHQ9QW5mYW5nc2tub3RlbiBlcnN0ZWxsZW4NCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb249V1x1MDBlNGhsZW4gU2llIGRpZSBNZXRob2Rlbi1QbHVnLWlucywgZGllIEluaGFsdHNwYWtldGUgdW5kIFByb3plc3NlIGF1cywgZGllIGluIGRpZSBLb25maWd1cmF0aW9uIGF1Zmdlbm9tbWVuIHdlcmRlbiBzb2xsZW4uDQotQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb25fdGV4dD1JbmhhbHRzZWxlbWVudGUgZGVyIGFuZ2VwYXNzdGVuIEthdGVnb3JpZSAoRGlhbG9nKQ0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGlyZWN0b3J5TGFiZWw9VmVyemVpY2huaXM6DQotUm9vdFByZWZQYWdlX2VuYWJsZXByb2Nlc3Njb250cmlidXRpb25fdGV4dD1Qcm96ZXNzYmVpdHJcdTAwZTRnZSBha3RpdmllcmVuDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIE1ldGhvZGVua29uZmlndXJhdGlvbiBhbmdlYmVuLg0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uTGFiZWw9QmVzY2hyZWlidW5nOg0KLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9QmVpdHJcdTAwZTRnZSBmXHUwMGZjciAnJ3swfScnIGF1c3dcdTAwZTRobGVuDQotRWxlbWVudHNWaWV3X29wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbl90ZXh0PVx1MDBkY2JlciBWYXJpYWJpbGl0XHUwMGU0dHNlbGVtZW50ZSBcdTAwZjZmZm5lbg0KLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1WYXJpYWJpbGl0XHUwMGU0dHNlbGVtZW50ZSBmXHUwMGZjciAnJ3swfScnIGF1c3dcdTAwZTRobGVuDQotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsPVZhcmlhYmlsaXRcdTAwZTR0c2VsZW1lbnRlIGZcdTAwZmNyICcnezB9JycNCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfTGFiZWw9Vm9yYW56ZWlnZSBkZXMgRm9ybXN5bWJvbHM6DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dD1MXHUwMGY2c2Nob3BlcmF0aW9uIGthbm4gbmljaHQgYXVzZ2VmXHUwMGZjaHJ0IHdlcmRlbg0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9QWt0aXZpdFx1MDBlNHRzZGV0YWlsZGlhZ3JhbW0gXHUwMGY2ZmZuZW4NCi0NCi1NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX2Rlc2NyaXB0aW9uPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgTWV0aG9kZW5iaWJsaW90aGVrIGFuZ2ViZW4uDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1JbmhhbHQgbFx1MDBmNnNjaGVuDQotV1BDb21wYXJ0bWVudEZpZ3VyZV8wPU5ldWVyIEFyYmVpdHNlcmdlYm5pc2Rlc2tyaXB0b3INCi1wcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0PUFrdGl2aXRcdTAwZTR0c2RldGFpbGRpYWdyYW1tZSB2ZXJcdTAwZjZmZmVudGxpY2hlbiBvZGVyIGFuemVpZ2VuLCBkaWUgaW0gUHJvemVzc2VkaXRvciBuaWNodCBlcnN0ZWxsdCB3dXJkZW4uDQotcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPUFrdGl2aXRcdTAwZTR0c2RpYWdyYW1tZSBmXHUwMGZjciBuaWNodCBnZVx1MDBlNG5kZXJ0ZSBBa3Rpdml0XHUwMGU0dHNlcndlaXRlcnVuZ2VuIHZlclx1MDBmNmZmZW50bGljaGVuIG9kZXIgYW56ZWlnZW4NCi0NCi0jQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2cNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19OYW1lUGF0dGVybj1OYW1lbnNtdXN0ZXIgKFx1MDBmY2JlcmVpbnN0aW1tZW5kZSBOYW1lbiB3ZXJkZW4gYW5nZXplaWd0KToNCi1zaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbD1JbSBSZXNzb3VyY2VubmF2aWdhdG9yIGFuemVpZ2VuDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfUGF0dGVybj1NdXN0ZXIgd2VyZGVuIGR1cmNoIEtvbW1hdGEgdm9uZWluYW5kZXIgZ2V0cmVubnQuIEluIGVpbmVtIE11c3RlciBrYW5uICogZlx1MDBmY3IgZWluZSBiZWxpZWJpZ2UgWmVpY2hlbmZvbGdlIHVuZCA/ICBmXHUwMGZjciBlaW4gYmVsaWViaWdlcyBaZWljaGVuIHZlcndlbmRldCB3ZXJkZW4uDQotZXJyX3Byb2Nlc3NpbmdfZmlsZV9kZXNjcmlwdGlvbj1JVVBBMDAyOUU6IEJlaW0gVmVyYXJiZWl0ZW4gZGVyIGF1c2dld1x1MDBlNGhsdGVuIERhdGVpIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBLbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX0NhdGVnb3J5VHlwZT1LYXRlZ29yaWV0eXA6DQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1LdXJ6YmVzY2hyZWlidW5nOg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXM9S2F0ZWdvcmllbiBhdXN3XHUwMGU0aGxlbg0KLQ0KLSNsb2cgbWVzc2FnZXMNCi1jaGVhdHNoZWV0X2xvYWRfZmFpbHVyZV9sb2dfbXNnPURlciBhbmdlZm9yZGVydGUgU3BpY2t6ZXR0ZWwga29ubnRlIG5pY2h0IGdlXHUwMGY2ZmZuZXQgd2VyZGVuOiANCi0NCi1uZXdDb25maWd1cmF0aW9uV2lyYXpkX2NyZWF0ZUVycm9yPUlVUEEwMDM1RTogRGllIEtvbmZpZ3VyYXRpb24ga2FubiBuaWNodCBmZWhsZXJmcmVpIGVyc3RlbGx0IHdlcmRlbi4NCi1uZXdQbHVnaW5XaXphcmRfY3JlYXRlRXJyb3I9SVVQQTAwMzZFOiBEYXMgUGx1Zy1pbiBrYW5uIG5pY2h0IGZlaGxlcmZyZWkgZXJzdGVsbHQgd2VyZGVuLg0KLWVycm9yRGlhbG9nX21vdmVFcnJvcj1JVVBBMDAzN0U6IERhcyBFbGVtZW50IGthbm4gbmljaHQgZmVobGVyZnJlaSB2ZXJzY2hvYmVuIHdlcmRlbi4NCi1yZW5hbWVEaWFsb2dfcmVuYW1lRXJyb3I9SVVQQTAwMzhFOiBEYXMgRWxlbWVudCBrYW5uIG5pY2h0IGZlaGxlcmZyZWkgdW1iZW5hbm50IHdlcmRlbi4NCi1lcnJvckRpYWxvZ19jcmVhdGVFcnJvcj1JVVBBMDAzOUU6IERhcyBFbGVtZW50IGthbm4gbmljaHQgZmVobGVyZnJlaSBlcnN0ZWxsdCB3ZXJkZW4uDQotZHVwbGljYXRlUGx1Z2luTmFtZUVycm9yX21zZz1JVVBBMDEwMUU6IERlciBOYW1lICcnezB9JycgaXN0IGJlcmVpdHMgdm9yaGFuZGVuLiBHZWJlbiBTaWUgZWluZW4gYW5kZXJlbiBOYW1lbiBlaW4gdW5kIHdpZWRlcmhvbGVuIFNpZSBkaWUgT3BlcmF0aW9uLg0KLQ0KLSNOZXcgU3RyaW5ncyBmb3IgUHJvY2Vzc0VkaXRvciBDb250ZXh0IG1lbnUgZGlhZ3JhbSBpbWFnZXMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBREltYWdlPUdyYWZpayBmXHUwMGZjciBBa3Rpdml0XHUwMGU0dHNkaWFncmFtbSB6dW9yZG5lbi4uLg0KLVByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yVGl0bGU9QWt0dWFsaXNpZXJ1bmdzZmVobGVyDQotUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JNc2c9RmVobGVyIGJlaW0gQWt0dWFsaXNpZXJlbiBkZXMgRWRpdG9ycw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlPUdyYWZpayBmXHUwMGZjciBBa3Rpdml0XHUwMGU0dHNkZXRhaWxkaWFncmFtbSB6dW9yZG5lbi4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZFdQREltYWdlPUdyYWZpayBmXHUwMGZjciBBcmJlaXRzZXJnZWJuaXNhYmhcdTAwZTRuZ2lna2VpdHNkaWFncmFtbSB6dW9yZG5lbi4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFESW1hZ2VJblB1Ymxpc2hpbmc9R3JhZmlrIGZcdTAwZmNyIEFrdGl2aXRcdTAwZTR0c2RpYWdyYW1tIGluIFZlclx1MDBmNmZmZW50bGljaHVuZyB2ZXJ3ZW5kZW4NCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlU3VwcHJlc3M9RGllIHVudGVyIERldGFpbHMgYXVmZ2VsaXN0ZXRlbiB1bnRlcmRyXHUwMGZjY2t0ZW4gRGVza3JpcHRvcmVuIG1cdTAwZmNzc2VuIGdlbFx1MDBmNnNjaHQgd2VyZGVuLCB1bSBuYWNoIGRlbSBVbnRlcmRyXHUwMGZjY2tlbiBkZXIgYXVzZ2V3XHUwMGU0aGx0ZW4gRWxlbWVudGUgRHVwbGl6aWVydW5nZW4genUgdmVybWVpZGVuLiBLbGlja2VuIFNpZSBhdWYgT0ssIHdlbm4gU2llIGRpZSBEZXNrcmlwdG9yZW4gbFx1MDBmNnNjaGVuIHVuZCBmb3J0ZmFocmVuIG1cdTAwZjZjaHRlbi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBRERJbWFnZUluUHVibGlzaGluZz1HcmFmaWsgZlx1MDBmY3IgQWt0aXZpdFx1MDBlNHRzZGV0YWlsZGlhZ3JhbW0gaW4gVmVyXHUwMGY2ZmZlbnRsaWNodW5nIHZlcndlbmRlbg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZVdQREltYWdlSW5QdWJsaXNoaW5nPUdyYWZpayBmXHUwMGZjciBBcmJlaXRzZXJnZWJuaXNhYmhcdTAwZTRuZ2lna2VpdHNkaWFncmFtbSBpbiBWZXJcdTAwZjZmZmVudGxpY2h1bmcgdmVyd2VuZGVuDQotUHJvY2Vzc0VkaXRvcl9EaWFncmFtSW1hZ2VfSW5wdXREaWFsb2dfaW5pdGlhbFZhbHVlPUdyYWZpa3BmYWQNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXc9VmVybGlua3RlcyBFbGVtZW50IGluIEJpYmxpb3QmaGVrc3NpY2h0IGFuemVpZ2VuDQotUHJvY2Vzc0VkaXRvcl91cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uX2xhYmVsPVVudGVyZHJcdTAwZmNja3RlIEVsZW1lbnRlIGluICZCYXNpcyBha3R1YWxpc2llcmVuDQotUHJvY2Vzc0VkaXRvcl9Db250ZXh0TWVudV9EaWFncmFtSW1hZ2VzPURpYWdyYW1tZ3JhZmlrZW4NCi0NCi0jU3RyaW5ncyBmb3Igc3luY2hyb25pemF0aW9uIHdpemFyZCBvbiBwcm9jZXNzIGVkaXRvcidzIEJTDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90aXRsZT1TeW5jaHJvbmlzYXRpb25zYmVzY2hyZWlidW5nDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0PUxlc2VuIFNpZSBkaWUgZm9sZ2VuZGVuIEluZm9ybWF0aW9uZW4genVyIGJlbnV0emVyZGVmaW5pZXJ0ZW4gU3luY2hyb25pc2F0aW9uLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlPUtvbmZpZ3VyYXRpb24gYXVzd1x1MDBlNGhsZW4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVdcdTAwZTRobGVuIFNpZSBkaWUgS29uZmlndXJhdGlvbiBhdXMsIGRpZSBTaWUgZlx1MDBmY3IgZGllIFN5bmNocm9uaXNhdGlvbiB2ZXJ3ZW5kZW4gbVx1MDBmNmNodGVuLiBcDQotSWhyZSBBdXN3YWhsIGJlc3RpbW10LCB3ZWxjaGUgQmVpdHJcdTAwZTRnZSB1bmQgRXJzZXR6dW5nZW4gZlx1MDBmY3IgZGllIFN5bmNocm9uaXNhdGlvbiB2ZXJ3ZW5kZXQgd2VyZGVuLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX2NvbmZpZ0xhYmVsPUtvbmZpZ3VyYXRpb246DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RpdGxlPVp1IHN5bmNocm9uaXNpZXJlbmRlIEVpZ2Vuc2NoYWZ0ZW4gYXVzd1x1MDBlNGhsZW4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJvcGVydGllc19sYWJsZT1FaWdlbnNjaGFmdGVuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX25hbWVfbGFibGU9TmFtZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmVzZW50YXRpb25OYW1lX2xhYmxlPVByXHUwMGU0c2VudGF0aW9uc25hbWUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYnJpZWZEZXNjX2xhYmxlPUt1cnpiZXNjaHJlaWJ1bmcNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3B0aW9uYWxJbm91dHNfbGFiZWw9T3B0aW9uYWxlIEVpbmdhYmVuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX21hbmRhdG9yeUlucHV0c19sYWJsZT1WZXJiaW5kbGljaGUgRWluZ2FiZW4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3V0cHV0c19sYWJlbD1BdXNnYWJlbg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX2xhYmVsPVByaW1cdTAwZTRyZXIgQXVzZlx1MDBmY2hyZW5kZXINCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYWRkblBlcmZvcm1lcnNfbGFibGU9WnVzXHUwMGU0dHpsaWNoZSBBdXNmXHUwMGZjaHJlbmRlDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGU9VmVyYW50d29ydGxpY2hlIFJvbGxlbg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9jb250bkFydGlmYWN0c19sYWJlbD1FbnRoYWx0ZW5lIEFydGVmYWt0ZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbD1UZWlsZSBkZXMgTGllZmVyZ2VnZW5zdGFuZHMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfc2VsU3RlcHNfbGFiZWw9QXVzd2FobCBkZXIgU2Nocml0dGUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGV4dD1XXHUwMGU0aGxlbiBTaWUgZGllIEVpZ2Vuc2NoYWZ0ZW4gZGVzIE1ldGhvZGVuaW5oYWx0cyBhdXMsIGRpZSBiZWkgZGVyIFN5bmNocm9uaXNhdGlvbiBiZXJcdTAwZmNja3NpY2h0aWd0IHdlcmRlbiBzb2xsZW4uDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RpdGxlPVN5bmNocm9uaXNhdGlvbnN2b3JzY2hhdQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90ZXh0PVx1MDBkY2JlcnByXHUwMGZjZmVuIFNpZSBkaWUgdm9yZ2VzY2hsYWdlbmVuIFN5bmNocm9uaXNhdGlvbnNkZXRhaWxzLg0KLXNlbGVjdEVkaXRvcnNUb0Rpc2NhcmRDb25mbGljdENoYW5nZXM9RXMgc2luZCBuaWNodCBnZXNwZWljaGVydGUgXHUwMGM0bmRlcnVuZ2VuIHZvcmhhbmRlbiwgZGllIG1pdCBcdTAwYzRuZGVydW5nZW4gaW4gS29uZmxpa3Qgc3RlaGVuLCBkaWUgYXVcdTAwZGZlcmhhbGIgZGVyIEVkaXRvcmVuIHZvcmdlbm9tbWVuIHd1cmRlbi5cblwNCi1XXHUwMGU0aGxlbiBTaWUgZGllIEVkaXRvcmVuIGF1cywgZGVyZW4gXHUwMGM0bmRlcnVuZ2VuIFNpZSB2ZXJ3ZXJmZW4gbVx1MDBmNmNodGVuLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF90aXRsZV90ZXh0PVN5bmNocm9uaXNhdGlvbnNhc3Npc3RlbnQNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX2V4cGxhaW5UZXh0PURpZXNlciBBc3Npc3RlbnQgdW50ZXJzdFx1MDBmY3R6dCBTaWUgYmVpbSBBa3R1YWxpc2llcmVuIGRlciBhdXNnZXdcdTAwZTRobHRlbiBEZXNrcmlwdG9yZW4gYnp3LiBhbGxlciBEZXNrcmlwdG9yZW4gdW50ZXJoYWxiIGRlciBhdXNnZXdcdTAwZTRobHRlbiBBa3Rpdml0XHUwMGU0dGVuLCBkaWUgYXVmIGRlciBSZWdpc3RlcmthcnRlIEFsbGdlbWVpbiBpaHJlciBFaWdlbnNjaGFmdGVuc2ljaHQgbWl0ICJTeW5jaHJvbmlzaWVydCBtaXQgUXVlbGxlIiBnZWtlbm56ZWljaG5ldCBzaW5kLiBcDQotRXMgd2VyZGVuIG51ciBkaWUgRWlnZW5zY2hhZnRlbiwgZGllIFNpZSBpbiBkaWVzZW0gQXNzaXN0ZW50ZW4gYXVzd1x1MDBlNGhsZW4sIGluIGRlbiBEZXNrcmlwdG9yZW4gYWt0dWFsaXNpZXJ0LiBcDQotQmVpIGRlciBCZXJlY2hudW5nIGRlciBBa3R1YWxpc2llcnVuZyBrXHUwMGY2bm5lbiBTaWUgamVkZSBnXHUwMGZjbHRpZ2UgS29uZmlndXJhdGlvbiBmXHUwMGZjciBJaHJlbiBQcm96ZXNzIHZlcndlbmRlbi4gXA0KLURlciBBc3Npc3RlbnQgYWt0dWFsaXNpZXJ0IGtlaW5lIGR5bmFtaXNjaCB2ZXJsaW5rdGVuIERlc2tyaXB0b3JlbiAoZ3JcdTAwZmNuZSBLdXJzaXZzY2hyaWZ0KS4NCi0NCi1vcGVuUlRFPVJpY2ggVGV4dCBFZGl0b3IgXHUwMGY2ZmZuZW4NCi1jbG9zZVJURT1SaWNoIFRleHQgRWRpdG9yIHNjaGxpZVx1MDBkZmVuDQotDQotI05ldyBTdHJpbmdzDQotcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BbmxlaXR1bmcgZlx1MDBmY3IgZGllc2UgUm9sbGVuZ3J1cHBlIHZlcndhbHRlbi4NCi1kaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZSBEaXN6aXBsaW4gdmVyd2FsdGVuLg0KLXdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BbmxlaXR1bmcgZlx1MDBmY3IgZGllc2UgQXJ0IHZvbiBBcmJlaXRzZXJnZWJuaXNzZW4gdmVyd2FsdGVuLg0KLWRvbWFpbnNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BbmxlaXR1bmcgZlx1MDBmY3IgZGllc2UgRG9tXHUwMGU0bmUgdmVyd2FsdGVuLg0KLXRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QW5sZWl0dW5nIGZcdTAwZmNyIGRpZXNlcyBUb29sIHZlcndhbHRlbi4NCi1jdXN0b21jYXRlZ29yeV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZSBhbmdlcGFzc3RlIEthdGVnb3JpZSB2ZXJ3YWx0ZW4uDQotDQotY29uY2VwdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZXMgS29uemVwdCB2ZXJ3YWx0ZW4uDQotY2hlY2tsaXN0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QW5sZWl0dW5nIGZcdTAwZmNyIGRpZXNlIFByXHUwMGZjZmxpc3RlIHZlcndhbHRlbi4NCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QW5sZWl0dW5nIGZcdTAwZmNyIGRpZXNlcyBCZWlzcGllbCB2ZXJ3YWx0ZW4uDQotZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QW5sZWl0dW5nIGZcdTAwZmNyIGRpZXNlIFJpY2h0bGluaWUgdmVyd2FsdGVuLg0KLXJvYWRtYXBfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BbmxlaXR1bmcgZlx1MDBmY3IgZGllc2UgUm9hZG1hcCB2ZXJ3YWx0ZW4uDQotcmV1c2FibGVhc3NldF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZXMgd2llZGVydmVyd2VuZGJhcmUgQXNzZXQgdmVyd2FsdGVuLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZXMgdW50ZXJzdFx1MDBmY3R6ZW5kZSBNYXRlcmlhbCB2ZXJ3YWx0ZW4uDQotcmVwb3J0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QW5sZWl0dW5nIGZcdTAwZmNyIGRpZXNlbiBCZXJpY2h0IHZlcndhbHRlbi4NCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZXMgVmVyZmFocmVuIHZlcndhbHRlbi4NCi10ZW1wbGF0ZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZSBWb3JsYWdlIHZlcndhbHRlbi4NCi10ZXJtZGVmaW5pdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZSBCZWdyaWZmc2RlZmluaXRpb24gdmVyd2FsdGVuLg0KLXRvb2xtZW50b3JfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BbmxlaXR1bmcgZlx1MDBmY3IgZGllc2VuIFRvb2xtZW50b3IgdmVyd2FsdGVuLg0KLXdoaXRlcGFwZXJfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BbmxlaXR1bmcgZlx1MDBmY3IgZGllc2VzIFdoaXRlIFBhcGVyIHZlcndhbHRlbi4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZW4gU2NoXHUwMGU0dHpmYWt0b3IgdmVyd2FsdGVuLg0KLQ0KLQ0KLSNOZXcgU3RyaW5nIFNlY3Rpb24gRGVzY3JpcHRpb24NCi1yb2xlX2RldGFpbFNlY3Rpb25fZGVzYz1EZXRhaWxsaWVydGUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgUm9sbGUgYW5nZWJlbi4NCi1yb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgUm9sbGUgYW5nZWJlbi4NCi1yb2xlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZSBSb2xsZSBtaXQgZWluZXIgYW5kZXJlbiBSb2xsZSBpbiBCZXppZWh1bmcgc3RlaHQuDQotcm9sZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VyIFJvbGxlIGFuZ2ViZW4uDQotDQotdGFza19kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VyIEF1ZmdhYmUgYW5nZWJlbi4NCi10YXNrX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgQXVmZ2FiZSBhbmdlYmVuLg0KLXRhc2tfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlIEF1ZmdhYmUgbWl0IGVpbmVyIGFuZGVyZW4gQXVmZ2FiZSBpbiBCZXppZWh1bmcgc3RlaHQuDQotdGFza192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VyIEF1ZmdhYmUgYW5nZWJlbi4NCi0NCi1hcnRpZmFjdF9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIEFydGVmYWt0IGFuZ2ViZW4uDQotYXJ0aWZhY3RfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBBcnRlZmFrdCBhbmdlYmVuLg0KLWFydGlmYWN0X2ljb25TZWN0aW9uX2Rlc2M9U3ltYm9sZSBmXHUwMGZjciBkaWVzZXMgQXJ0ZWZha3QgYW5wYXNzZW4uDQotYXJ0aWZhY3Rfbm90YXRpb25TZWN0aW9uX2Rlc2M9QmVyZWl0c3RlbGx1bmdzaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gQXJ0ZWZha3QgYW5nZWJlbi4NCi1hcnRpZmFjdF90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9QW5wYXNzdW5nc2luZm9ybWF0aW9uZW4genUgZGllc2VtIEFydGVmYWt0IGFuZ2ViZW4uDQotYXJ0aWZhY3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlcyBBcnRlZmFrdCBtaXQgZWluZW0gYW5kZXJlbiBBcnRlZmFrdCBpbiBCZXppZWh1bmcgc3RlaHQuDQotYXJ0aWZhY3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9VmVyc2lvbnNpbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBBcnRlZmFrdCBhbmdlYmVuLg0KLQ0KLW91dGNvbWVfZGV0YWlsU2VjdGlvbl9kZXNjPURldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBSZXN1bHRhdCBhbmdlYmVuLg0KLW91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBSZXN1bHRhdCBhbmdlYmVuLg0KLW91dGNvbWVfaWNvblNlY3Rpb25fZGVzYz1TeW1ib2xlIGZcdTAwZmNyIGRpZXNlcyBSZXN1bHRhdCBhbnBhc3Nlbi4NCi1vdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjPUJlcmVpdHN0ZWxsdW5nc2luZm9ybWF0aW9uZW4genUgZGllc2VtIFJlc3VsdGF0IGFuZ2ViZW4uDQotb3V0Y29tZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9QW5wYXNzdW5nc2luZm9ybWF0aW9uZW4genUgZGllc2VtIFJlc3VsdGF0IGFuZ2ViZW4uDQotb3V0Y29tZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdlYmVuLCB3aWUgZGllc2VzIFJlc3VsdGF0IG1pdCBlaW5lbSBhbmRlcmVuIFJlc3VsdGF0IGluIEJlemllaHVuZyBzdGVodC4NCi1vdXRjb21lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gUmVzdWx0YXQgYW5nZWJlbi4NCi0NCi1kZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIExpZWZlcmdlZ2Vuc3RhbmQgYW5nZWJlbi4NCi1kZWxpdmVyYWJsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VtIExpZWZlcmdlZ2Vuc3RhbmQgYW5nZWJlbi4NCi1kZWxpdmVyYWJsZV9pY29uU2VjdGlvbl9kZXNjPVN5bWJvbGUgZlx1MDBmY3IgZGllc2VuIExpZWZlcmdlZ2Vuc3RhbmQgYW5wYXNzZW4uDQotZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M9QmVyZWl0c3RlbGx1bmdzaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gTGllZmVyZ2VnZW5zdGFuZCBhbmdlYmVuLg0KLWRlbGl2ZXJhYmxlX3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1BbnBhc3N1bmdzaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gTGllZmVyZ2VnZW5zdGFuZCBhbmdlYmVuLg0KLWRlbGl2ZXJhYmxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZXIgTGllZmVyZ2VnZW5zdGFuZCBtaXQgZWluZW0gYW5kZXJlbiBMaWVmZXJnZWdlbnN0YW5kIGluIEJlemllaHVuZyBzdGVodC4NCi1kZWxpdmVyYWJsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VtIExpZWZlcmdlZ2Vuc3RhbmQgYW5nZWJlbi4NCi0NCi1kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1EZXRhaWxsaWVydGUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgRGlzemlwbGluIGFuZ2ViZW4uDQotZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIERpc3ppcGxpbiBhbmdlYmVuLg0KLWRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlIERpc3ppcGxpbiBtaXQgZWluZXIgYW5kZXJlbiBEaXN6aXBsaW4gaW4gQmV6aWVodW5nIHN0ZWh0Lg0KLWRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9VmVyc2lvbnNpbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBEaXN6aXBsaW4gYW5nZWJlbi4NCi0NCi1kb21haW5fZGV0YWlsU2VjdGlvbl9kZXNjPURldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBEb21cdTAwZTRuZSBhbmdlYmVuLg0KLWRvbWFpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIERvbVx1MDBlNG5lIGFuZ2ViZW4uDQotZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZSBEb21cdTAwZTRuZSBtaXQgZWluZXIgYW5kZXJlbiBEb21cdTAwZTRuZSBpbiBCZXppZWh1bmcgc3RlaHQuDQotZG9tYWluX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgRG9tXHUwMGU0bmUgYW5nZWJlbi4NCi0NCi13b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjPURldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBBcnQgdm9uIEFyYmVpdHNlcmdlYm5pc3NlbiBhbmdlYmVuLg0KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIEFydCB2b24gQXJiZWl0c2VyZ2Vibmlzc2VuIGFuZ2ViZW4uDQotd29ya3Byb2R1Y3R0eXBlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZSBBcnQgdm9uIEFyYmVpdHNlcmdlYm5pc3NlbiBtaXQgZWluZXIgYW5kZXJlbiBBcnQgdm9uIEFyYmVpdHNlcmdlYm5pc3NlbiBpbiBCZXppZWh1bmcgc3RlaHQuDQotd29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgQXJ0IHZvbiBBcmJlaXRzZXJnZWJuaXNzZW4gYW5nZWJlbi4NCi0NCi1yb2xlc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1EZXRhaWxsaWVydGUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgUm9sbGVuZ3J1cHBlIGFuZ2ViZW4uDQotcm9sZXNldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIFJvbGxlbmdydXBwZSBhbmdlYmVuLg0KLXJvbGVzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlIFJvbGxlbmdydXBwZSBtaXQgZWluZXIgYW5kZXJlbiBSb2xsZW5ncnVwcGUgaW4gQmV6aWVodW5nIHN0ZWh0Lg0KLXJvbGVzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9VmVyc2lvbnNpbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBSb2xsZW5ncnVwcGUgYW5nZWJlbi4NCi0NCi10b29sX2RldGFpbFNlY3Rpb25fZGVzYz1EZXRhaWxsaWVydGUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gVG9vbCBhbmdlYmVuLg0KLXRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBUb29sIGFuZ2ViZW4uDQotdG9vbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdlYmVuLCB3aWUgZGllc2VzIFRvb2wgbWl0IGVpbmVtIGFuZGVyZW4gVG9vbCBpbiBCZXppZWh1bmcgc3RlaHQuDQotdG9vbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VtIFRvb2wgYW5nZWJlbi4NCi0NCi1jb25jZXB0X2RldGFpbFNlY3Rpb25fZGVzYz1EZXRhaWxsaWVydGUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gS29uemVwdCBhbmdlYmVuLg0KLWNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBLb256ZXB0IGFuZ2ViZW4uDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdlYmVuLCB3aWUgZGllc2VzIEtvbnplcHQgbWl0IGVpbmVtIGFuZGVyZW4gS29uemVwdCBpbiBCZXppZWh1bmcgc3RlaHQuDQotY29uY2VwdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VtIEtvbnplcHQgYW5nZWJlbi4NCi0NCi1jaGVja2xpc3RfZGV0YWlsU2VjdGlvbl9kZXNjPURldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBQclx1MDBmY2ZsaXN0ZSBhbmdlYmVuLg0KLWNoZWNrbGlzdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIFByXHUwMGZjZmxpc3RlIGFuZ2ViZW4uDQotY2hlY2tsaXN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZSBQclx1MDBmY2ZsaXN0ZSBtaXQgZWluZXIgYW5kZXJlbiBQclx1MDBmY2ZsaXN0ZSBpbiBCZXppZWh1bmcgc3RlaHQuDQotY2hlY2tsaXN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgUHJcdTAwZmNmbGlzdGUgYW5nZWJlbi4NCi0NCi1leGFtcGxlX2RldGFpbFNlY3Rpb25fZGVzYz1EZXRhaWxsaWVydGUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gQmVpc3BpZWwgYW5nZWJlbi4NCi1leGFtcGxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gQmVpc3BpZWwgYW5nZWJlbi4NCi1leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZXMgQmVpc3BpZWwgbWl0IGVpbmVtIGFuZGVyZW4gQmVpc3BpZWwgaW4gQmV6aWVodW5nIHN0ZWh0Lg0KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9VmVyc2lvbnNpbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBCZWlzcGllbCBhbmdlYmVuLg0KLQ0KLWd1aWRlbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VyIFJpY2h0bGluaWUgYW5nZWJlbi4NCi1ndWlkZWxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBSaWNodGxpbmllIGFuZ2ViZW4uDQotZ3VpZGVsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZSBSaWNodGxpbmllIG1pdCBlaW5lciBhbmRlcmVuIFJpY2h0bGluaWUgaW4gQmV6aWVodW5nIHN0ZWh0Lg0KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VyIFJpY2h0bGluaWUgYW5nZWJlbi4NCi0NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIFNjaFx1MDBlNHR6ZmFrdG9yIGFuZ2ViZW4uDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBTY2hcdTAwZTR0emZha3RvciBhbmdlYmVuLg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZXIgU2NoXHUwMGU0dHpmYWt0b3IgbWl0IGVpbmVtIGFuZGVyZW4gU2NoXHUwMGU0dHpmYWt0b3IgaW4gQmV6aWVodW5nIHN0ZWh0Lg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gU2NoXHUwMGU0dHpmYWt0b3IgYW5nZWJlbi4NCi0NCi1wcmFjdGljZV9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIFZlcmZhaHJlbiBhbmdlYmVuLg0KLXByYWN0aWNlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gVmVyZmFocmVuIGFuZ2ViZW4uDQotcHJhY3RpY2VfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlcyBWZXJmYWhyZW4gbWl0IGVpbmVtIGFuZGVyZW4gVmVyZmFocmVuIGluIEJlemllaHVuZyBzdGVodC4NCi1wcmFjdGljZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VtIFZlcmZhaHJlbiBhbmdlYmVuLg0KLQ0KLXJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIEJlcmljaHQgYW5nZWJlbi4NCi1yZXBvcnRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBCZXJpY2h0IGFuZ2ViZW4uDQotcmVwb3J0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZXIgQmVyaWNodCBtaXQgZWluZW0gYW5kZXJlbiBCZXJpY2h0IGluIEJlemllaHVuZyBzdGVodC4NCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9VmVyc2lvbnNpbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBCZXJpY2h0IGFuZ2ViZW4uDQotDQotcmVzdWFibGVhc3NldF9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIHdpZWRlcnZlcndlbmRiYXJlbiBBc3NldCBhbmdlYmVuLg0KLXJlc3VhYmxlYXNzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSB3aWVkZXJ2ZXJ3ZW5kYmFyZW4gQXNzZXQgYW5nZWJlbi4NCi1yZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZXMgd2llZGVydmVyd2VuZGJhcmUgQXNzZXQgbWl0IGVpbmVtIGFuZGVyZW4gd2llZGVydmVyd2VuZGJhcmVuIEFzc2V0IGluIEJlemllaHVuZyBzdGVodC4NCi1yZXN1YWJsZWFzc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gd2llZGVydmVyd2VuZGJhcmVuIEFzc2V0IGFuZ2ViZW4uDQotDQotcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VyIFJvYWRtYXAgYW5nZWJlbi4NCi1yb2FkbWFwX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgUm9hZG1hcCBhbmdlYmVuLg0KLXJvYWRtYXBfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlIFJvYWRtYXAgbWl0IGVpbmVyIGFuZGVyZW4gUm9hZG1hcCBpbiBCZXppZWh1bmcgc3RlaHQuDQotcm9hZG1hcF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VyIFJvYWRtYXAgYW5nZWJlbi4NCi0NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZGV0YWlsU2VjdGlvbl9kZXNjPURldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSB1bnRlcnN0XHUwMGZjdHplbmRlbiBNYXRlcmlhbCBhbmdlYmVuLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VtIHVudGVyc3RcdTAwZmN0emVuZGVuIE1hdGVyaWFsIGFuZ2ViZW4uDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZXMgdW50ZXJzdFx1MDBmY3R6ZW5kZSBNYXRlcmlhbCBtaXQgYW5kZXJlbSB1bnRlcnN0XHUwMGZjdHplbmRlbiBNYXRlcmlhbCBpbiBCZXppZWh1bmcgc3RlaHQuDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gdW50ZXJzdFx1MDBmY3R6ZW5kZW4gTWF0ZXJpYWwgYW5nZWJlbi4NCi0NCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VyIFZvcmxhZ2UgYW5nZWJlbi4NCi10ZW1wbGF0ZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIFZvcmxhZ2UgYW5nZWJlbi4NCi10ZW1wbGF0ZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdlYmVuLCB3aWUgZGllc2UgVm9ybGFnZSBtaXQgZWluZXIgYW5kZXJlbiBWb3JsYWdlIGluIEJlemllaHVuZyBzdGVodC4NCi10ZW1wbGF0ZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VyIFZvcmxhZ2UgYW5nZWJlbi4NCi0NCi10ZXJtZGVmaW5pdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VyIEJlZ3JpZmZzZGVmaW5pdGlvbiBhbmdlYmVuLg0KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgQmVncmlmZnNkZWZpbml0aW9uIGFuZ2ViZW4uDQotdGVybWRlZmluaXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlIEJlZ3JpZmZzZGVmaW5pdGlvbiBtaXQgZWluZXIgYW5kZXJlbiBCZWdyaWZmc2RlZmluaXRpb24gaW4gQmV6aWVodW5nIHN0ZWh0Lg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgQmVncmlmZnNkZWZpbml0aW9uIGFuZ2ViZW4uDQotDQotdG9vbG1lbnRvcl9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIFRvb2xtZW50b3IgYW5nZWJlbi4NCi10b29sbWVudG9yX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gVG9vbG1lbnRvciBhbmdlYmVuLg0KLXRvb2xtZW50b3JfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlciBUb29sbWVudG9yIG1pdCBlaW5lbSBhbmRlcmVuIFRvb2xtZW50b3IgaW4gQmV6aWVodW5nIHN0ZWh0Lg0KLXRvb2xtZW50b3JfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9VmVyc2lvbnNpbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBUb29sbWVudG9yIGFuZ2ViZW4uDQotDQotd2hpdGVwYXBlcl9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIFdoaXRlIFBhcGVyIGFuZ2ViZW4uDQotd2hpdGVwYXBlcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VtIFdoaXRlIFBhcGVyIGFuZ2ViZW4uDQotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdlYmVuLCB3aWUgZGllc2VzIFdoaXRlIFBhcGVyIG1pdCBlaW5lbSBhbmRlcmVuIFdoaXRlIFBhcGVyIGluIEJlemllaHVuZyBzdGVodC4NCi13aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gV2hpdGUgUGFwZXIgYW5nZWJlbi4NCi0NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPURldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBEaXN6aXBsaW5ncnVwcGllcnVuZyBhbmdlYmVuLg0KLWRpc2NpcGxpbmVncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIERpc3ppcGxpbmdydXBwaWVydW5nIGFuZ2ViZW4uDQotZGlzY2lwbGluZWdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZSBEaXN6aXBsaW5ncnVwcGllcnVuZyBtaXQgZWluZXIgYW5kZXJlbiBEaXN6aXBsaW5ncnVwcGllcnVuZyBpbiBCZXppZWh1bmcgc3RlaHQuDQotZGlzY2lwbGluZWdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgRGlzemlwbGluZ3J1cHBpZXJ1bmcgYW5nZWJlbi4NCi0NCi1yb2xlc2V0Z3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPURldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBHcnVwcGllcnVuZyB2b24gUm9sbGVuZ3J1cHBlbiBhbmdlYmVuLg0KLXJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIEdydXBwaWVydW5nIHZvbiBSb2xsZW5ncnVwcGVuIGFuZ2ViZW4uDQotcm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZSBHcnVwcGllcnVuZyB2b24gUm9sbGVuZ3J1cHBlbiBtaXQgZWluZXIgYW5kZXJlbiBHcnVwcGllcnVuZyB2b24gUm9sbGVuZ3J1cHBlbiBpbiBCZXppZWh1bmcgc3RlaHQuDQotcm9sZXNldGdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgR3J1cHBpZXJ1bmcgdm9uIFJvbGxlbmdydXBwZW4gYW5nZWJlbi4NCi0NCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VyIGFuZ2VwYXNzdGVuIEthdGVnb3JpZSBhbmdlYmVuLg0KLWN1c3RvbWNhdGVnb3J5X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgYW5nZXBhc3N0ZW4gS2F0ZWdvcmllIGFuZ2ViZW4uDQotY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlIGFuZ2VwYXNzdGUgS2F0ZWdvcmllIG1pdCBlaW5lciBhbmRlcmVuIGFuZ2VwYXNzdGVuIEthdGVnb3JpZSBpbiBCZXppZWh1bmcgc3RlaHQuDQotY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9VmVyc2lvbnNpbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBhbmdlcGFzc3RlbiBLYXRlZ29yaWUgYW5nZWJlbi4NCi1jdXN0b21jYXRlZ29yeV9JY29uU2VjdGlvbl9kZXNjPVN5bWJvbGUgZlx1MDBmY3IgZGllc2UgYW5nZXBhc3N0ZSBLYXRlZ29yaWUgYW5wYXNzZW4uDQotDQotY29uY2VwdF9pY29uU2VjdGlvbl9kZXNjPVN5bWJvbGUgZlx1MDBmY3IgZGllc2VzIEtvbnplcHQgYW5wYXNzZW4uDQotY2hlY2tsaXN0X2ljb25TZWN0aW9uX2Rlc2M9U3ltYm9sZSBmXHUwMGZjciBkaWVzZSBQclx1MDBmY2ZsaXN0ZSBhbnBhc3Nlbi4NCi10b29sbWVudG9yX2ljb25TZWN0aW9uX2Rlc2M9U3ltYm9sZSBmXHUwMGZjciBkaWVzZW4gVG9vbG1lbnRvciBhbnBhc3Nlbi4NCi13aGl0ZXBhcGVyX2ljb25TZWN0aW9uX2Rlc2M9U3ltYm9sZSBmXHUwMGZjciBkaWVzZXMgV2hpdGUgUGFwZXIgYW5wYXNzZW4uDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25faWNvblNlY3Rpb25fZGVzYz1TeW1ib2xlIGZcdTAwZmNyIGRpZXNlbiBTY2hcdTAwZTR0emZha3RvciBhbnBhc3Nlbi4NCi10ZXJtZGVmaW5pdGlvbl9pY29uU2VjdGlvbl9kZXNjPVN5bWJvbGUgZlx1MDBmY3IgZGllc2UgQmVncmlmZnNkZWZpbml0aW9uIGFucGFzc2VuLg0KLXRlbXBsYXRlX2ljb25TZWN0aW9uX2Rlc2M9U3ltYm9sZSBmXHUwMGZjciBkaWVzZSBWb3JsYWdlIGFucGFzc2VuLg0KLXJldXNhYmxlYXNzZXRfaWNvblNlY3Rpb25fZGVzYz1TeW1ib2xlIGZcdTAwZmNyIGRpZXNlcyB3aWVkZXJ2ZXJ3ZW5kYmFyZSBBc3NldCBhbnBhc3Nlbi4NCi1yZXBvcnRfaWNvblNlY3Rpb25fZGVzYz1TeW1ib2xlIGZcdTAwZmNyIGRpZXNlbiBCZXJpY2h0IGFucGFzc2VuLg0KLXByYWN0aWNlX2ljb25TZWN0aW9uX2Rlc2M9U3ltYm9sZSBmXHUwMGZjciBkaWVzZXMgVmVyZmFocmVuIGFucGFzc2VuLg0KLWV4YW1wbGVfaWNvblNlY3Rpb25fZGVzYz1TeW1ib2xlIGZcdTAwZmNyIGRpZXNlcyBCZWlzcGllbCBhbnBhc3Nlbi4NCi1ndWlkZWxpbmVfaWNvblNlY3Rpb25fZGVzYz1TeW1ib2xlIGZcdTAwZmNyIGRpZXNlIFJpY2h0bGluaWUgYW5wYXNzZW4uDQotcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjPVN5bWJvbGUgZlx1MDBmY3IgZGllc2UgUm9hZG1hcCBhbnBhc3Nlbi4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfaWNvblNlY3Rpb25fZGVzYz1TeW1ib2xlIGZcdTAwZmNyIGRpZXNlcyB1bnRlcnN0XHUwMGZjdHplbmRlIE1hdGVyaWFsIGFucGFzc2VuLg0KLQ0KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX3RpdGxlPURhdGVpIGdlXHUwMGU0bmRlcnQNCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY19tZXNzYWdlPURpZSBEYXRlaSB3dXJkZSBpbSBEYXRlaXN5c3RlbSBnZVx1MDBlNG5kZXJ0LiBNXHUwMGY2Y2h0ZW4gU2llIGRpZSBcdTAwYzRuZGVydW5nZW4gbGFkZW4/DQotDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU9QWt0aXZpdFx1MDBlNHRzdmFyaWFiaWxpdFx1MDBlNHQNCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2c9RGllIEFrdGl2aXRcdTAwZTR0ICcnezB9Jycga2FubiBrZWluZSBWYXJpYWJpbGl0XHUwMGU0dCBtaXQgJyd7MX0nJyBzZXR6ZW4sIGRhICcnezF9JycgYmVyZWl0cyBlaW5lIG9kZXIgbWVocmVyZSB6dXNcdTAwZTR0emxpY2hlIG9kZXIgZXJzZXR6dGUgQWt0aXZpdFx1MDBlNHRlbiBhbHMgdW50ZXJnZW9yZG5ldGUgRWxlbWVudGUgZW50aFx1MDBlNGx0Lg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzE9RGllIEFrdGl2aXRcdTAwZTR0ICcnezB9Jycga2FubiBrZWluZSBWYXJpYWJpbGl0XHUwMGU0dCBtaXQgZWluZXIgaWhyZXIgZGlyZWt0ZW4gXHUwMGZjYmVyZ2VvcmRuZXRlbiBFbGVtZW50ZSB1bmQgUHJvemVzc2Ugc2V0emVuLg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzI9RGllIEFrdGl2aXRcdTAwZTR0ICcnezB9Jycga2FubiBrZWluZSBWYXJpYWJpbGl0XHUwMGU0dCBtaXQgJyd7MX0nJyBzZXR6ZW4sIGRhIGRpZXMgenUgZWluZXIgU2NobGVpZmVuYWJoXHUwMGU0bmdpZ2tlaXQgZlx1MDBmY2hyZW4gd1x1MDBmY3JkZS4NCi0NCi1hcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlPU11c3RlciBhbndlbmRlbg0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPURpZSBBa3Rpdml0XHUwMGU0dCAnJ3swfScnIGthbm4ga2VpbmUgTXVzdGVyIG1pdCAnJ3sxfScnIGFud2VuZGVuLCBkYSBkaWVzIHp1IGVpbmVyIFNjaGxlaWZlbmFiaFx1MDBlNG5naWdrZWl0IGZcdTAwZmNocmVuIHdcdTAwZmNyZGUuDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyPXwNCi1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc9RWlnbmVyIGRpZXNlciBuaWNodCBhdWZnZWxcdTAwZjZzdGVuIFJlZmVyZW56IGluIGRlciBCaWJsaW90aGVrc3NpY2h0IGFuemVpZ2VuDQotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZW1vdmVVbnJlc29sdmVkUmVmZXJlbmNlPU5pY2h0IGF1ZmdlbFx1MDBmNnN0ZSBSZWZlcmVueiBlbnRmZXJuZW4NCi1wcm9tcHREZWxldGVDdXN0b21DYXRlZ29yeUJlZm9yZVJlbW92ZUxhc3RSZWZUb0l0PVNpZSBzaW5kIGRhYmVpLCBkaWUgbGV0enRlIFJlZmVyZW56IGF1ZiB7MH0gaW0gUGx1Zy1pbiB6dSBsXHUwMGY2c2NoZW4uIERpZSBFbGVtZW50ZSB3ZXJkZW4gZ2VsXHUwMGY2c2NodC4gRm9ydGZhaHJlbj8NCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotI0JlbG93IHByb3BlcnR5ICJlZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXMiIHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZA0KLSNEb24ndCBkZWxldGUgYSBzcGFjZSBhZnRlciAiOiAiDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1lZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXM9OiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDc4ODQyYy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRm9ybSBQYWdlIFRpdGxlcw0KLWFzc2lnblBhZ2VfdGl0bGU9QXNpZ25hcg0KLWNhdGVnb3JpZXNQYWdlX3RpdGxlPUNhdGVnb3JcdTAwZWRhcw0KLWRlbGl2ZXJhYmxlUGFydHNQYWdlX3RpdGxlPUNvbXBvbmVudGVzIGRlIHByb2R1Y3RvIGZpbmFsDQotZGVzY3JpcHRpb25QYWdlX3RpdGxlPURlc2NyaXBjaVx1MDBmM24NCi1kaXNjaXBsaW5lc1BhZ2VfdGl0bGU9RGlzY2lwbGluYXMNCi1kaXNjYXJkdW5yZXNvbHZlZHJlZj1EZXNjYXJ0YXIgcmVmZXJlbmNpYXMgc2luIHJlc29sdmVyDQotZ3VpZGFuY2VQYWdlX3RpdGxlPUd1XHUwMGVkYQ0KLXByZXZpZXdQYWdlX3RpdGxlPVZpc3RhIHByZWxpbWluYXINCi1yZWZlcmVuY2VzUGFnZV90aXRsZT1SZWZlcmVuY2lhcw0KLXJlZmVyZW5jZV90ZXh0PVJlZmVyZW5jaWFzOg0KLXJlZmVyZW5jZVdvcmtmbG93UGFnZV90aXRsZT1GbHVqbyBkZSB0cmFiYWpvIGRlIHJlZmVyZW5jaWENCi1yb2xlc1BhZ2VfdGl0bGU9Um9sZXMNCi1yb2xlU2V0c1BhZ2VfdGl0bGU9Q29uanVudG9zIGRlIHJvbGVzDQotc3RlcHNQYWdlX3RpdGxlPVBhc29zDQotdGFza3NQYWdlX3RpdGxlPVRhcmVhcw0KLXRvb2xNZW50b3JzUGFnZV90aXRsZT1HdVx1MDBlZGFzIGRlIGxhIGhlcnJhbWllbnRhDQotd29ya1Byb2R1Y3RzUGFnZV90aXRsZT1Qcm9kdWN0b3MgZGUgdHJhYmFqbw0KLQ0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uDQotY2hlY2tJdGVtc1NlY3Rpb25fbmFtZT1FbGVtZW50b3MgZGUgY29tcHJvYmFjaVx1MDBmM24NCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGxvcyBlbGVtZW50b3MgZGUgY29tcHJvYmFjaVx1MDBmM24gcXVlIGNvbnN0aXR1eWVuIGVzdGEgbGlzdGEgZGUgY29tcHJvYmFjaVx1MDBmM24uDQotZGVwZW5kZW5jaWVzU2VjdGlvbl9uYW1lPURlcGVuZGVuY2lhcw0KLWRlcGVuZGVuY2llc1NlY3Rpb25fZGVzYz1FbiBlc3RlIGFwYXJ0YWRvIHNlIG11ZXN0cmFuIGxhcyBkZXBlbmRlbmNpYXMgZGUgZXN0ZSBwYXF1ZXRlIGRlIGNvbnRlbmlkbyBjb24gb3Ryb3MgcGFxdWV0ZXMgZGUgY29udGVuaWRvLg0KLWRldGFpbFNlY3Rpb25fbmFtZT1JbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYQ0KLWRldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGU6IHswfS4NCi1nZW5lcmFsSW5mb1NlY3Rpb25fbmFtZT1JbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwNCi1nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlOiB7MH0uDQotaWNvblNlY3Rpb25fbmFtZT1JY29ubw0KLWljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpemFyIGxvcyBpY29ub3M6IHswfS4NCi1ub3RhdGlvblNlY3Rpb25fbmFtZT1JbmZvcm1hY2lcdTAwZjNuIGRlIGVudHJlZ2ENCi1ub3RhdGlvblNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIGVudHJlZ2EgYWNlcmNhIGRlIGVzdGUgezB9Lg0KLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9uYW1lPVBsdWctaW5zIGNvbiByZWZlcmVuY2lhczoNCi1yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fZGVzYz1Fc3RhIHNlY2NpXHUwMGYzbiBtdWVzdHJhIHBsdWctaW5zIGEgbG9zIHF1ZSBoYWNlIHJlZmVyZW5jaWEgZXN0ZSBwbHVnLWluIGRlIG1cdTAwZTl0b2RvLg0KLXN0YWZmaW5nU2VjdGlvbl9uYW1lPUluZm9ybWFjaVx1MDBmM24gZGVsIHBlcnNvbmFsDQotc3RhZmZpbmdTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZWwgcGVyc29uYWwgYWNlcmNhIGRlIGVzdGUgcm9sLg0KLXN0ZXBzU2VjdGlvbl9uYW1lPVBhc29zDQotc3RlcHNTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgbG9zIHBhc29zIG5lY2VzYXJpb3MgcGFyYSByZWFsaXphciBlc3RhIHRhcmVhLg0KLXRhaWxvcmluZ1NlY3Rpb25fbmFtZT1QZXJzb25hbGl6YWNpXHUwMGYzbg0KLXRhaWxvcmluZ1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIHBlcnNvbmFsaXphY2lcdTAwZjNuIGFjZXJjYSBkZTogezB9Lg0KLXZhcmlhYmlsaXR5U2VjdGlvbl9uYW1lPVZhcmlhYmlsaWRhZCBkZSBjb250ZW5pZG8NCi12YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjXHUwMGYzbW8gc2UgcmVsYWNpb25hIHswfSBjb24gb3RybyhhKSB7MH0uDQotdmVyc2lvbkluZm9TZWN0aW9uX25hbWU9SW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24NCi12ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGU6IHswfS4NCi0NCi0jIFVJICYgRWxlbWVudCBBdHRyaWJ1dGUgTGFiZWxzDQotYWRkaXRpb25hbEluZm9fdGV4dD1JbmZvcm1hY2lcdTAwZjNuIGFkaWNpb25hbDoNCi1hcHBsaWNhdGlvbl90ZXh0PUFwbGljYWNpXHUwMGYzbjoNCi1hY3Rpb25MYWJlbF9lZGl0PUVkaXRhcg0KLWFjdGlvbkxhYmVsX2ZpbmRFbGVtZW50SW5MaWJOYXY9TW9zdHJhciBlbiBsYSB2aXN0YSBkZSBiaWJsaW90ZWNhDQotYWx0ZXJuYXRpdmVzX3RleHQ9QWx0ZXJuYXRpdmFzOg0KLWFzc2lnbm1lbnRBcHByb2FjaGVzX3RleHQ9UHJvcHVlc3RhcyBkZSBhc2lnbmFjaVx1MDBmM246DQotYXV0aG9yc190ZXh0PUF1dG9yZXM6DQotYmFja2dyb3VuZF90ZXh0PUZvbmRvOg0KLWJhc2VFbGVtZW50X3RleHQ9QmFzZToNCi1iYXNlR3VpZGFuY2VfdGV4dD1HdVx1MDBlZGEgYlx1MDBlMXNpY2E6DQotYnJpZWZEZXNjcmlwdGlvbl90ZXh0PURlc2NyaXBjaVx1MDBmM24gYnJldmU6DQotZGVzY3JpcHRpb25fdGV4dD1EZXNjcmlwY2lcdTAwZjNuOg0KLWJhY2t1cGJlZm9yZXNhdmVfdGV4dD1SZWFsaXphciBjb3BpYSBkZSBzZWd1cmlkYWQgYW50ZXMgZGUgZ3VhcmRhcg0KLWJyaWVmT3V0bGluZV90ZXh0PUVzcXVlbWF0aXphY2lcdTAwZjNuIGJyZXZlOg0KLWNoYW5nZURhdGVfdGV4dD1GZWNoYSBkZSBjYW1iaW86DQotY2hhbmdlRGVzY3JpcHRpb25fdGV4dD1EZXNjcmlwY2lcdTAwZjNuIGRlIGNhbWJpbzoNCi1jaGVja0l0ZW1zX3RleHQ9RWxlbWVudG9zIGRlIGNvbXByb2JhY2lcdTAwZjNuDQotY29udHJpYnV0ZXNfdGV4dD1Db250cmlidXllDQotbG9jYWxDb250cmlidXRlc190ZXh0PUxvY2FsQ29udHJpYnV0ZXMNCi1jb250cmlidXRlc190b190ZXh0PUNvbnRyaWJ1eWUgYQ0KLWNvcHlyaWdodF90ZXh0PUNvcHlyaWdodDoNCi1lZGl0b3JfdGV4dD1FZGl0b3INCi1leHRlbmRzX3RleHQ9QW1wbFx1MDBlZGENCi1leHRlbmRfdGV4dD1BbXBsaWFyDQotZXh0ZXJuYWxEZXNjcmlwdGlvbl90ZXh0PURlc2NyaXBjaVx1MDBmM24gZXh0ZXJuYToNCi1leHRlcm5hbElkX3RleHQ9SUQgZXh0ZXJubzoNCi1nb2Fsc190ZXh0PU9iamV0aXZvczoNCi1pbXBhY3RPZk5vdEhhdmluZ190ZXh0PUltcGFjdG8gZGUgbm8gdGVuZXI6DQota2V5Q29uc2lkZXJhdGlvbnNfdGV4dD1GYWN0b3JlcyBjbGF2ZToNCi1sZXZlbHNPZkFkb3B0aW9uX3RleHQ9Tml2ZWwgZGUgYWRvcGNpXHUwMGYzbjoNCi1tYWluRGVzY3JpcHRpb25fdGV4dD1EZXNjcmlwY2lcdTAwZjNuIHByaW5jaXBhbDoNCi1uZXdFbGVtZW50X3RleHQ9ezB9IG51ZXZvDQotbmFtZV90ZXh0PU5vbWJyZToNCi1ub3RBcHBsaWNhYmxlX3RleHQ9Tm8gYXBsaWNhYmxlDQotcGFja2FnaW5nR3VpZGFuY2VfdGV4dD1HdVx1MDBlZGEgZGUgZW1wYXF1ZXRhZG86DQotcHJlc2VudGF0aW9uTmFtZV90ZXh0PU5vbWJyZSBkZSBwcmVzZW50YWNpXHUwMGYzbjoNCi1wcm9tcHRmb3JsaWJhcnlfdGV4dD1Tb2xpY2l0YXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYWwgaW5pY2lvDQotZW5hYmxlSGVhbHRoQ2hlY2tfdGV4dD1IYWJpbGl0YXIgbGFzIGhlcnJhbWllbnRhcyBkZSBkZXB1cmFjaVx1MDBmM24gaW50ZXJuYXMNCi1wcm9ibGVtX3RleHQ9UHJvYmxlbWE6DQotcHVycG9zZV90ZXh0PU9iamV0aXZvOg0KLXJlYXNvbkZvck5vdE5lZWRpbmdfdGV4dD1Nb3Rpdm9zIHBhcmEgbm8gbmVjZXNpdGFyOg0KLXJlcGxhY2VzX3RleHQ9UmVlbXBsYXphDQotbG9jYWxSZXBsYWNlc190ZXh0PUxvY2FsUmVwbGFjZXMNCi1yZXByZXNlbnRhdGlvbk9wdGlvbnNfdGV4dD1PcGNpb25lcyBkZSByZXByZXNlbnRhY2lcdTAwZjNuOg0KLXRlbXBsYXRlRmlsZV90ZXh0PUFyY2hpdm8ocykgZGUgcGxhbnRpbGxhOg0KLXNraWxsc190ZXh0PUhhYmlsaWRhZGVzOg0KLXN0ZXBzX3RleHQ9UGFzb3M6DQotc3RlcHNfbmFtZV90ZXh0PU5vbWJyZToNCi1zdG9wX3RleHQ9RGV0ZW5lcg0KLXByaW50X3RleHQ9SW1wcmltaXINCi1zeW5vbnltc190ZXh0PVNpblx1MDBmM25pbW9zOg0KLXR5cGVfdGV4dD1UaXBvOg0KLWNvcHlfdGV4dD1Db3BpYXINCi1kZWVwQ29weV90ZXh0PUNvcGlhIGVuIHByb2Z1bmRpZGFkDQotYmFja190ZXh0PUF0clx1MDBlMXMNCi1uZXdfcGx1Z2luPU51ZXZvIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8NCi1tb3ZlPU1vdmVyLi4uDQotdW5pcXVlSWRfdGV4dD1JRCBleGNsdXNpdm86DQotdmFyaWFiaWxpdHlUeXBlX3RleHQ9VGlwbyBkZSB2YXJpYWJpbGlkYWQ6DQotdmVyc2lvbl90ZXh0PVZlcnNpXHUwMGYzbjoNCi0NCi0jIEJ1dHRvbiBMYWJlbHMNCi1hZGRCdXR0b25fdGV4dD1BXHUwMGYxYWRpci4uLg0KLWF0dGFjaEJ1dHRvbl90ZXh0PUFkanVudGFyLi4uDQotYnJvd3NlQnV0dG9uX3RleHQ9RXhhbWluYXIuLi4NCi1jaGFuZ2VUeXBlQnV0dG9uX3RleHQ9Q2FtYmlhciB0aXBvLi4uDQotY2xlYXJCdXR0b25fdGV4dD1Cb3JyYXINCi1kZWxldGVCdXR0b25fdGV4dD1TdXByaW1pcg0KLWRldGFjaEJ1dHRvbl90ZXh0PURlc2NvbmVjdGFyDQotZGlhZ3JhbV9zYXZlRXJyb3I9U2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGFsIGd1YXJkYXIgZWwgZGlhZ3JhbWENCi1kb3duQnV0dG9uX3RleHQ9QWJham8NCi1kaXJlY3RvcnlfdGV4dD1EaXJlY3RvcmlvOg0KLW9yZGVyQnV0dG9uX3RleHQ9T3JkZW4NCi1lZGl0QnV0dG9uX3RleHQ9RWRpdGFyLi4uDQotcmVtb3ZlQnV0dG9uX3RleHQ9RWxpbWluYXINCi1yZW5hbWVBY3Rpb25fdGV4dD1SZW5vbWJyYXIuLi4NCi1yZW1vdmVfdGV4dD1FbGltaW5hcg0KLXJlbmFtZV90ZXh0PVJlbm9tYnJhcg0KLVNhdmVBc190ZXh0PUd1YXJkYXIgY29tbw0KLXNlbGVjdEJ1dHRvbl90ZXh0PVNlbGVjY2lvbmFyLi4uDQotZGVzZWxlY3RCdXR0b25fdGV4dD1BbnVsYXIgc2VsZWNjaVx1MDBmM24NCi11cEJ1dHRvbl90ZXh0PUFycmliYQ0KLW1ha2VEZWZhdWx0QnV0dG9uX3RleHQ9RXN0YWJsZWNlciBjb21vIHByZWRldGVybWluYWRvDQotdmlld0hpc3RvcnlCdXR0b25fdGV4dD1WZXIgaGlzdG9yaWFsLi4uDQotDQotIyBSb2xlIEVkaXRvciBUYXNrcyBQYWdlDQotcm9sZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1UYXJlYXMNCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Fc3RlIHJvbCBlcyBlbCByZWFsaXphZG9yIGRlIGxhcyBzaWd1aWVudGVzIHRhcmVhcy4NCi1yb2xlVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVRhcmVhcyBkaXNwb25pYmxlcw0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZWFsaXphZG9yIHByaW5jaXBhbDoNCi1yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWwyPVJlYWxpemFkb3IgYWRpY2lvbmFsOg0KLXJvbGVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1TZSBoYW4gc2VsZWNjaW9uYWRvIHswfSB0YXJlYXMuDQotDQotIyBSb2xlIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kdWN0b3MgZGUgdHJhYmFqbzoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RXNwZWNpZmlxdWUgbG9zIHByb2R1Y3RvcyBkZSB0cmFiYWpvIGRlIGxvcyBxdWUgZXMgcmVzcG9uc2FibGUgZXN0ZSByb2wuDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9UHJvZHVjdG9zIGRlIHRyYWJham8gZGlzcG9uaWJsZXM6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZXNwb25zYWJsZSBkZToNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1Qcm9kdWN0b3MgZGUgdHJhYmFqbyBxdWUgc29uIGxhIHNhbGlkYSBkZSB0YXJlYXMgcXVlIHJlYWxpemEgZXN0ZSByb2w6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1TZSBoYW4gc2VsZWNjaW9uYWRvIHswfSBwcm9kdWN0b3MgZGUgdHJhYmFqby4NCi0NCi0jIFJvbGUgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPUd1XHUwMGVkYQ0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVByb3BvcmNpb25hciBlbmxhY2VzIGEgaW5mb3JtYWNpXHUwMGYzbiBhZGljaW9uYWwgZW4gZm9ybWEgZGUgZ3VcdTAwZWRhLg0KLXJvbGVHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9R3VcdTAwZWRhIGRpc3BvbmlibGU6DQotcm9sZUd1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPUd1XHUwMGVkYToNCi1yb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U2UgaGFuIHNlbGVjY2lvbmFkbyB7MH0gZ3VcdTAwZWRhcy4NCi0NCi0jIFJvbGUgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRlZ29yXHUwMGVkYXM6DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aW9uYXIgbGFzIGNhdGVnb3JcdTAwZWRhcyBhIGxhcyBxdWUgcGVydGVuZWNlIGVzdGUgcm9sLg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1Db25qdW50b3MgZGUgcm9sZXM6DQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1DYXRlZ29yXHUwMGVkYXMgcGVyc29uYWxpemFkYXM6DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9Q29uanVudG9zIGRlIHJvbGVzOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1DYXRlZ29yXHUwMGVkYXMgcGVyc29uYWxpemFkYXM6DQotDQotIyBUYXNrIEVkaXRvciBSb2xlcyBQYWdlDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZT1Sb2xlcw0KLXRhc2tSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFzaWduYXIgbG9zIHJvbGVzIHF1ZSBkZWJlbiByZWFsaXphciBlc3RhIHRhcmVhLg0KLXRhc2tSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9Um9sZXMgZGlzcG9uaWJsZXM6DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVJlYWxpemFkb3IgcHJpbmNpcGFsOg0KLXRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9UmVhbGl6YWRvcmVzIGFkaWNpb25hbGVzOg0KLXRhc2tSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1TZSBoYW4gc2VsZWNjaW9uYWRvIHswfSByb2xlcy4NCi10YXNrUm9sZXNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbW9kaWZ5X21lc3NhZ2U9SVVQQTAwMDQ1VzogXHUwMGJmRGVzZWEgY2FtYmlhciBlbCByZWFsaXphZG9yIHByaW5jaXBhbCBhICcnezB9Jyc/DQotdGFza1JvbGVzUGFnZV9jb25maXJtX3RpdGxlPUNvbmZpcm1hciBlbCBjYW1iaW8gZGUgcm9sIHByaW5jaXBhbA0KLQ0KLSMgVGFzayBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9UHJvZHVjdG9zIGRlIHRyYWJham8NCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RXNwZWNpZmlxdWUgbG9zIHByb2R1Y3RvcyBkZSB0cmFiYWpvIGRlIHNhbGlkYSB5IGVudHJhZGEgcGFyYSBlc3RhIHRhcmVhLg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVByb2R1Y3RvcyBkZSB0cmFiYWpvIGRpc3BvbmlibGVzDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1FbnRyYWRhcyBvYmxpZ2F0b3JpYXM6DQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9RW50cmFkYXMgb3BjaW9uYWxlczoNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMz1TYWxpZGFzOg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U2UgaGFuIHNlbGVjY2lvbmFkbyB7MH0gcHJvZHVjdG9zIGRlIHRyYWJham8uDQotDQotIyBUYXNrIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1HdVx1MDBlZGENCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Qcm9wb3JjaW9uYXIgZW5sYWNlcyBhIGluZm9ybWFjaVx1MDBmM24gYWRpY2lvbmFsIGVuIGZvcm1hIGRlIGd1XHUwMGVkYS4NCi10YXNrR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPUd1XHUwMGVkYSBkaXNwb25pYmxlOg0KLXRhc2tHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1HdVx1MDBlZGE6DQotdGFza0d1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNlIGhhbiBzZWxlY2Npb25hZG8gezB9IGd1XHUwMGVkYXMuDQotDQotIyBUYXNrIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9Q2F0ZWdvclx1MDBlZGFzDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aW9uYXIgbGFzIGNhdGVnb3JcdTAwZWRhcyBhIGxhcyBxdWUgcGVydGVuZWNlIGVzdGEgdGFyZWEuDQotdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPURpc2NpcGxpbmFzDQotdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1DYXRlZ29yXHUwMGVkYXMgcGVyc29uYWxpemFkYXMNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1EaXNjaXBsaW5hczoNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9Q2F0ZWdvclx1MDBlZGFzIHBlcnNvbmFsaXphZGFzOg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBUYXNrcyBQYWdlDQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbk5hbWU9VGFyZWFzDQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPUVzdGUgcHJvZHVjdG8gZGUgdHJhYmFqbyBlcyB1bmEgZW50cmFkYSBvIHVuYSBzYWxpZGEgZGUgbGFzIHNpZ3VpZW50ZXMgdGFyZWFzLg0KLVdvcmtQcm9kdWN0X1Rhc2tzX0F2YWlsYWJsZUxhYmVsPVRhcmVhcyBkaXNwb25pYmxlcw0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWw9RW50cmFkYSBvYmxpZ2F0b3JpYToNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMj1FbnRyYWRhIG9wY2lvbmFsOg0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwzPVNhbGlkYToNCi1Xb3JrUHJvZHVjdF9UYXNrc19NdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNlIGhhbiBzZWxlY2Npb25hZG8gezB9IHRhcmVhcy4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgUm9sZXMgUGFnZQ0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVJvbGVzDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUxvcyByb2xlcyBzaWd1aWVudGVzIHNvbiByZXNwb25zYWJsZXMgZGUgZXN0ZSBwcm9kdWN0byBkZSB0cmFiYWpvIG8gbG8gbW9kaWZpY2FuLg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVJvbGVzIGRpc3BvbmlibGVzDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Sb2wgcmVzcG9uc2FibGU6DQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9Um9sZXMgZGUgbW9kaWZpY2FjaVx1MDBmM246DQotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1TZSBoYW4gc2VsZWNjaW9uYWRvIHswfSByb2xlcy4NCi0NCi0jIyBXb3JrIFByb2R1Y3QgRWRpdG9yIERlbGl2ZXJhYmxlIFBhcnRzIFBhZ2UNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25OYW1lPUNvbXBvbmVudGVzIGRlIHByb2R1Y3RvIGZpbmFsDQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RXNwZWNpZmljYXIgbG9zIHByb2R1Y3RvcyBkZSB0cmFiYWpvIHF1ZSBjb25zdGl0dXllbiBlc3RlIHByb2R1Y3RvIGZpbmFsLg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9UHJvZHVjdG9zIGRlIHRyYWJham8gZGlzcG9uaWJsZXMgY29tbyBjb21wb25lbnRlcyBkZSBwcm9kdWN0byBmaW5hbDoNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlbGVjdGVkTGFiZWw9UHJvZHVjdG9zIGRlIHRyYWJham8gY29tbyBjb21wb25lbnRlcyBkZSBwcm9kdWN0byBmaW5hbDoNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U2UgaGFuIHNlbGVjY2lvbmFkbyB7MH0gcHJvZHVjdG9zIGRlIHRyYWJham8uDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1HdVx1MDBlZGENCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249UHJvcG9yY2lvbmFyIGVubGFjZXMgYSBpbmZvcm1hY2lcdTAwZjNuIGFkaWNpb25hbCBlbiBmb3JtYSBkZSBndVx1MDBlZGEuDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9R3VcdTAwZWRhIGRpc3BvbmlibGU6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1HdVx1MDBlZGE6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1TZSBoYW4gc2VsZWNjaW9uYWRvIHswfSBndVx1MDBlZGFzLg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUNhdGVnb3JcdTAwZWRhcw0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3Rpb25hciBsYXMgY2F0ZWdvclx1MDBlZGFzIGEgbGFzIHF1ZSBwZXJ0ZW5lY2UgZXN0ZSBwcm9kdWN0byBkZSB0cmFiYWpvLg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RG9taW5pb3MNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1DbGFzZXMgZGUgcHJvZHVjdG8gZGUgdHJhYmFqbzoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMz1DYXRlZ29yXHUwMGVkYXMgcGVyc29uYWxpemFkYXM6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPURvbWluaW86DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1DbGFzZXMgZGUgcHJvZHVjdG8gZGUgdHJhYmFqbzoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzPUNhdGVnb3JcdTAwZWRhcyBwZXJzb25hbGl6YWRhczoNCi0NCi0jIFByYWN0aWNlIEVkaXRvciBSZWZlcmVuY2VzIFBhZ2UNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25OYW1lPUVsZW1lbnRvcyBkZSBjb250ZW5pZG8NCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Fc3BlY2lmaWNhciBsb3MgZWxlbWVudG9zIGRlIGNvbnRlbmlkbyBhIGxvcyBxdWUgaGFjZSByZWZlcmVuY2lhIGVzdGEgcHJcdTAwZTFjdGljYS4NCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUVsZW1lbnRvcyBkZSBjb250ZW5pZG8gZGlzcG9uaWJsZXM6DQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsPUVsZW1lbnRvcyBkZSBjb250ZW5pZG86DQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNlIGhhbiBzZWxlY2Npb25hZG8gezB9IGVsZW1lbnRvcyBkZSBjb250ZW5pZG8uDQotDQotIyBDYXRlZ29yeSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZT1HdVx1MDBlZGENCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3Rpb25hciBsYSBndVx1MDBlZGEgcXVlIHBlcnRlbmVjZSBhIGVzdGUgezB9Lg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1HdVx1MDBlZGEgZGlzcG9uaWJsZToNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1HdVx1MDBlZGE6DQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U2UgaGFuIHNlbGVjY2lvbmFkbyB7MH0gZ3VcdTAwZWRhcy4NCi0NCi0jIERpc2NpcGxpbmUgR3JvdXBpbmcgRWRpdG9yIERpc2NpcGxpbmVzIFBhZ2UNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbk5hbWU9RGlzY2lwbGluYXMNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3Rpb25hciBsYXMgZGlzY2lwbGluYXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RhIGFncnVwYWNpXHUwMGYzbiBkZSBkaXNjaXBsaW5hcy4NCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RGlzY2lwbGluYXMgZGlzcG9uaWJsZXM6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw9RGlzY2lwbGluYXM6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U2UgaGFuIHNlbGVjY2lvbmFkbyB7MH0gZGlzY2lwbGluYXMuDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Vc2VEZWZhdWx0RGlyZWN0b3J5QnV0dG9uTGFiZWw9VXRpbGl6YXIgZGlyZWN0b3JpbyBwb3Igb21pc2lcdTAwZjNuDQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBUYXNrcyBQYWdlDQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1UYXJlYXMNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aW9uYXIgbGFzIHRhcmVhcyBxdWUgcGVydGVuZWNlbiBhIGVzdGEgZGlzY2lwbGluYS4NCi1kaXNjaXBsaW5lVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVRhcmVhcyBkaXNwb25pYmxlczoNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9VGFyZWFzOg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1TZSBoYW4gc2VsZWNjaW9uYWRvIHswfSB0YXJlYXMuDQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBSZWZlcmVuY2UgV29ya2Zsb3cgUGFnZQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbk5hbWU9Rmx1am9zIGRlIHRyYWJham8gZGUgcmVmZXJlbmNpYQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3Rpb25lIGxvcyBmbHVqb3MgZGUgdHJhYmFqbyBkZSByZWZlcmVuY2lhIHF1ZSBwZXJ0ZW5lY2VuIGEgZXN0YSBkaXNjaXBsaW5hLg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfYXZhaWxhYmxlTGFiZWw9Rmx1am9zIGRlIHRyYWJham8gZGUgcmVmZXJlbmNpYSBkaXNwb25pYmxlcw0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbD1GbHVqb3MgZGUgdHJhYmFqbyBkZSByZWZlcmVuY2lhOg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1TZSBoYW4gc2VsZWNjaW9uYWRvIHswfSBmbHVqb3MgZGUgdHJhYmFqbyBkZSByZWZlcmVuY2lhLg0KLQ0KLSMgRG9tYWluIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVByb2R1Y3RvcyBkZSB0cmFiYWpvDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R2VzdGlvbmFyIGxvcyBwcm9kdWN0b3MgZGUgdHJhYmFqbyBxdWUgcGVydGVuZWNlbiBhIGVzdGUgZG9taW5pby4NCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVByb2R1Y3RvcyBkZSB0cmFiYWpvIGRpc3BvbmlibGVzOg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Qcm9kdWN0b3MgZGUgdHJhYmFqbzoNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U2UgaGFuIHNlbGVjY2lvbmFkbyB7MH0gcHJvZHVjdG9zIGRlIHRyYWJham8uDQotDQotIyBXb3JrIFByb2R1Y3QgS2luZCBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kdWN0b3MgZGUgdHJhYmFqbw0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3Rpb25hciBsb3MgcHJvZHVjdG9zIGRlIHRyYWJham8gcXVlIHBlcnRlbmVjZW4gYSBlc3RhIGNsYXNlIGRlIHByb2R1Y3RvIGRlIHRyYWJham8uDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1Qcm9kdWN0b3MgZGUgdHJhYmFqbyBkaXNwb25pYmxlczoNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9UHJvZHVjdG9zIGRlIHRyYWJham86DQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNlIGhhbiBzZWxlY2Npb25hZG8gezB9IHByb2R1Y3RvcyBkZSB0cmFiYWpvLg0KLQ0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPUNvbmp1bnRvcyBkZSByb2xlcw0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R2VzdGlvbmFyIGxvcyBjb25qdW50b3MgZGUgcm9sZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RhIGFncnVwYWNpXHUwMGYzbiBkZWwgY29uanVudG8gZGUgcm9sZXMuDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsPUNvbmp1bnRvcyBkZSByb2xlcyBkaXNwb25pYmxlczoNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Db25qdW50b3MgZGUgcm9sZXM6DQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U2UgaGFuIHNlbGVjY2lvbmFkbyB7MH0gY29uanVudG9zIGRlIHJvbGVzLg0KLQ0KLSMgUm9sZSBTZXQgRWRpdG9yIFJvbGVzIFBhZ2UNCi1yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVJvbGVzDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R2VzdGlvbmFyIGxvcyByb2xlcyBxdWUgcGVydGVuZWNlbiBhIGVzdGUgY29uanVudG8gZGUgcm9sZXMuDQotcm9sZVNldFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1Sb2xlcyBkaXNwb25pYmxlczoNCi1yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9Um9sZXM6DQotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNlIGhhbiBzZWxlY2Npb25hZG8gezB9IHJvbGVzLg0KLQ0KLSMgVG9vbCBFZGl0b3IgVG9vbCBNZW50b3JzIFBhZ2UNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25OYW1lPUd1XHUwMGVkYXMgZGUgbGEgaGVycmFtaWVudGENCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aW9uYXIgbGFzIGd1XHUwMGVkYXMgZGUgbGEgaGVycmFtaWVudGEgcXVlIHBlcnRlbmVjZW4gYSBlc3RhIGhlcnJhbWllbnRhLg0KLXRvb2xUb29sTWVudG9yc1BhZ2VfYXZhaWxhYmxlTGFiZWw9R3VcdTAwZWRhcyBkZSBsYSBoZXJyYW1pZW50YSBkaXNwb25pYmxlczoNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw9R3VcdTAwZWRhcyBkZSBsYSBoZXJyYW1pZW50YToNCi10b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U2UgaGFuIHNlbGVjY2lvbmFkbyB7MH0gZ3VcdTAwZWRhcyBkZSBsYSBoZXJyYW1pZW50YS4NCi0NCi0jIEN1c3RvbSBDYXRlZ29yeSBFZGl0b3IgQXNzaWduIFBhZ2UNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbk5hbWU9RWxlbWVudG9zIGRlIGNvbnRlbmlkbw0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R2VzdGlvbmFyIGxvcyBlbGVtZW50b3MgZGUgY29udGVuaWRvIHF1ZSBjb25zdGl0dXllbiBlc3RhIGNhdGVnb3JcdTAwZWRhIHBlcnNvbmFsaXphZGEuDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX2F2YWlsYWJsZUxhYmVsPUVsZW1lbnRvcyBkZSBjb250ZW5pZG8gZGlzcG9uaWJsZXM6DQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlbGVjdGVkTGFiZWw9RWxlbWVudG9zIGRlIGNvbnRlbmlkbzoNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1TZSBoYW4gc2VsZWNjaW9uYWRvIHswfSBlbGVtZW50b3MgZGUgY29udGVuaWRvLg0KLQ0KLSMgTmV3IE1ldGhvZCBQbHVnLWluIFdpemFyZA0KLW5ld1BsdWdpbldpemFyZF90aXRsZT1OdWV2byBwbHVnLWluIGRlIG1cdTAwZTl0b2RvDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90aXRsZT1DcmVhciB1biBwbHVnLWluIGRlIG1cdTAwZTl0b2RvIG51ZXZvDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0PUVzcGVjaWZpcXVlIHVuIG5vbWJyZSB5IHByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGVsIG51ZXZvIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8uDQotbmV3UGx1Z2luRXJyb3JfbXNnPUlVUEEwMDIxRTogTm8gc2UgaGEgcG9kaWRvIGNyZWFyIGVsIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8uDQotbmV3UGx1Z2luRXJyb3JfcmVhc29uPUVycm9yIGludGVybm8uXG5cDQotXG5cDQotUHVsc2UgRGV0YWxsZXMgcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGluZm9ybWFjaVx1MDBmM24uDQotDQotIyBHZW5lcmljIGRpYWxvZyB0aXRsZXMNCi1jcmVhdGVEaWFsb2dfdGl0bGU9Q3JlYXIgZWxlbWVudG8NCi1kZWxldGVEaWFsb2dfdGl0bGU9U3VwcmltaXIgZWxlbWVudG8NCi1lZGl0RGlhbG9nX3RpdGxlPUVkaXRhciBlbGVtZW50bw0KLWVycm9yRGlhbG9nX3RpdGxlPUVycm9yDQotbW92ZURpYWxvZ190aXRsZT1Nb3ZlciBlbGVtZW50bw0KLXJlbmFtZURpYWxvZ190aXRsZT1SZW5vbWJyYXIgZWxlbWVudG8NCi13YXJuaW5nRGlhbG9nX3RpdGxlPUF2aXNvDQotDQotIyBBZGQgQ29uZmlndXJhdGlvbiB0byBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWFkZENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPUFcdTAwZjFhZGlyIGNvbmZpZ3VyYWNpXHUwMGYzbiBhbCBwcm9jZXNvDQotDQotIyBTZXQgRGVmYXVsdCBDb25maWd1cmF0aW9uIEVycm9yIERpYWxvZw0KLXNldERlZmF1bHRDb25maWdFcnJvckRpYWxvZ190aXRsZT1Fc3RhYmxlY2VyIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBwb3Igb21pc2lcdTAwZjNuIHBhcmEgZWwgcHJvY2Vzbw0KLQ0KLSMgRWRpdCBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlPUVkaXRhciBlbCBlbGVtZW50byBkZSBwcm9jZXNvDQotDQotIyBPcGVuIExpYnJhcnkgRGlhbG9nDQotb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU9QWJyaXIgdW5hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zDQotb3BlbkxpYnJhcnlEaWFsb2dfdGV4dD1MYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhY3R1YWwgbm8gc2UgaGEgZ3VhcmRhZG8gY29ycmVjdGFtZW50ZS4gXHUwMGJmRGVzZWEgb21pdGlyIGVsIGVycm9yIHkgYWJyaXIgb3RyYSBiaWJsaW90ZWNhPw0KLQ0KLSMgU2F2ZSBMaWJyYXJ5IERpYWxvZw0KLXNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlPUd1YXJkYXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MNCi1zYXZlTGlicmFyeURpYWxvZ190ZXh0PUxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGFjdHVhbCBzZSBoYSBtb2RpZmljYWRvLiBcdTAwYmZEZXNlYSBndWFyZGFyIGxvcyBjYW1iaW9zPw0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPUFjdHVhbGl6YXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MNCi0NCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cNCi1kZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PUVsIGVsZW1lbnRvICcnezB9JycgeWEgc2UgaGEgc3VwcmltaWRvLiBcdTAwYmZEZXNlYSBlbGltaW5hcmxvIGRlICcnezF9Jyc/DQotDQotIyBFcnJvciBNZXNzYWdlcw0KLW5vT3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDBFOiBObyBoYXkgbmluZ3VuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhYmllcnRhLlxuXA0KLVxuXA0KLURlYmUgYWJyaXIgdW5hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIHBhcmEgcG9kZXIgYVx1MDBmMWFkaXIgdW4gbnVldm8gZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8uXG5cDQotXG5cDQotQ3JlZSB1bmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgbnVldmEgbyBhYnJhIHVuYSBleGlzdGVudGUgeSB2dWVsdmEgYSBpbnRlbnRhcmxvLg0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDFFOiBGYWx0YSBlbCBub21icmUgZGUgezB9LlxuXA0KLVxuXA0KLVRvZG9zIGxvcyBlbGVtZW50b3MgZGUgcHJvY2VzbyB5IG1cdTAwZTl0b2RvIGRlYmVuIHRlbmVyIHVuIG5vbWJyZS5cblwNCi1cblwNCi1QdWxzZSBBY2VwdGFyIHkgZXNwZWNpZmlxdWUgdW4gbm9tYnJlIHZcdTAwZTFsaWRvIHBhcmEgZWwgZWxlbWVudG8uDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFOiBFbCBub21icmUgJyd7MH0nJyB5YSBleGlzdGUuXG5cDQotXG5cDQotVW4gZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gZGViZSB0ZW5lciB1biBub21icmUgZXhjbHVzaXZvLlxuXA0KLVxuXA0KLVB1bHNlIEFjZXB0YXIgeSBlc3BlY2lmaXF1ZSB1biBub21icmUgZGlmZXJlbnRlIHBhcmEgZWwgZWxlbWVudG8uDQotY3JlYXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDAzRTogTm8gc2UgcHVlZGUgY3JlYXIgbGEgY29uZmlndXJhY2lcdTAwZjNuIGRlbCBtXHUwMGU5dG9kby4NCi1kZWxldGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDRXOiBObyBzZSBwdWVkZSBzdXByaW1pciBsYSBjb25maWd1cmFjaVx1MDBmM24gZGVsIG1cdTAwZTl0b2RvLg0KLWludGVybmFsRXJyb3JfbXNnPUlVUEEwMDA1RTogU2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGludGVybm8uXG5cDQotXG5cDQotUHVsc2UgRGV0YWxsZXMgcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGluZm9ybWFjaVx1MDBmM24uDQotaW52YWxpZFByZXNlbnRhdGlvbk5hbWVFcnJvcl9tc2c9SVVQQTAwMDZFOiBFbCBub21icmUgZGUgcHJlc2VudGFjaVx1MDBmM24gZXNwZWNpZmljYWRvIG5vIGVzIHZcdTAwZTFsaWRvLlxuXA0KLVxuXA0KLVB1bHNlIEFjZXB0YXIgeSBlc3BlY2lmaXF1ZSB1biBub21icmUgZGlmZXJlbnRlLg0KLWludmFsaWRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDdFOiBMYSBjb25maWd1cmFjaVx1MDBmM24gZGVsIG1cdTAwZTl0b2RvIHNlbGVjY2lvbmFkYSAnJ3swfScnIG5vIGVzIHVuIHN1YmNvbmp1bnRvIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBwb3Igb21pc2lcdTAwZjNuIGRlbCBwcm9jZXNvLlxuXA0KLVxuXA0KLVBhcmEgbWFudGVuZXIgbGEgaW50ZWdyaWRhZCBkZSB1biBwcm9jZXNvLCBzdSBjb25maWd1cmFjaVx1MDBmM24gcG9yIG9taXNpXHUwMGYzbiBkZWJlIHNlciB1biBzdXBlcmNvbmp1bnRvIGRlIHRvZGFzIGxhcyBkZW1cdTAwZTFzIGNvbmZpZ3VyYWNpb25lcyBhc29jaWFkYXMgY29uIGVsIHByb2Nlc28uXG5cDQotXG5cDQotU2VsZWNjaW9uZSBvdHJhIGNvbmZpZ3VyYWNpXHUwMGYzbiBvIG1vZGlmaXF1ZSBsYSBjb25maWd1cmFjaVx1MDBmM24gcG9yIG9taXNpXHUwMGYzbiBwYXJhIGluY2x1aXIgZWwgY29udGVuaWRvIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBzZWxlY2Npb25hZGEgeSB2dWVsdmEgYSBpbnRlbnRhcmxvLg0KLXNldERlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDhFOiBMYSBjb25maWd1cmFjaVx1MDBmM24gZGVsIG1cdTAwZTl0b2RvIHNlbGVjY2lvbmFkYSAnJ3swfScnIG5vIGVzIHVuIHN1cGVyY29uanVudG8gZGUgbGFzIGRlbVx1MDBlMXMgY29uZmlndXJhY2lvbmVzIGEgbGFzIHF1ZSBoYWNlIHJlZmVyZW5jaWEgZWwgcHJvY2Vzby5cblwNCi1cblwNCi1QYXJhIG1hbnRlbmVyIGxhIGludGVncmlkYWQgZGUgdW4gcHJvY2Vzbywgc3UgY29uZmlndXJhY2lcdTAwZjNuIHBvciBvbWlzaVx1MDBmM24gZGViZSBzZXIgdW4gc3VwZXJjb25qdW50byBkZSB0b2RhcyBsYXMgZGVtXHUwMGUxcyBjb25maWd1cmFjaW9uZXMgYXNvY2lhZGFzIGNvbiBlbCBwcm9jZXNvLlxuXA0KLVxuXA0KLVNlbGVjY2lvbmUgb3RyYSBjb25maWd1cmFjaVx1MDBmM24gbyBtb2RpZmlxdWUgZWwgY29udGVuaWRvIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBzZWxlY2Npb25hZGEgeSB2dWVsdmEgYSBpbnRlbnRhcmxvLg0KLW9wZW5MaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDA5RTogTm8gc2UgcHVlZGUgY2FyZ2FyIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLlxuXA0KLVxuXA0KLVB1bHNlIERldGFsbGVzIHBhcmEgb2J0ZW5lciBtXHUwMGUxcyBpbmZvcm1hY2lcdTAwZjNuLg0KLXNhdmVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEwRTogTm8gc2UgcHVlZGUgZ3VhcmRhciBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBzZWxlY2Npb25hZGEuDQotc2F2ZUxpYnJhcnlUb0Vycm9yX21zZz1JVVBBMDAxMEU6IE5vIHNlIHB1ZWRlIGd1YXJkYXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3Mgc2VsZWNjaW9uYWRhIGVuICcnezB9JycuDQotZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnPUlVUEEwMDExRTogRWwgZWxlbWVudG8gJyd7MH0nJyB5YSBzZSBoYSBzdXByaW1pZG8uDQotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTJFOiBObyBzZSBwdWVkZSBhY3R1YWxpemFyIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLg0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1JVVBBMDAxNkU6IFNlIGhhIHByb2R1Y2lkbyB1biBlcnJvci5cblwNCi1cblwNCi1QdWxzZSBEZXRhbGxlcyBwYXJhIG9idGVuZXIgbVx1MDBlMXMgaW5mb3JtYWNpXHUwMGYzbi4NCi1pbnRlcm5hbEVycm9yX3JlYXNvbj1JVVBBMDAxN0U6IFNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBpbnRlcm5vLlxuXA0KLVxuXA0KLVB1bHNlIERldGFsbGVzIHBhcmEgb2J0ZW5lciBtXHUwMGUxcyBpbmZvcm1hY2lcdTAwZjNuLg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE4RTogU2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGFsIGNhcmdhciBsb3MgZWxlbWVudG9zIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLlxuXA0KLVxuXA0KLVB1bHNlIERldGFsbGVzIHBhcmEgb2J0ZW5lciBtXHUwMGUxcyBpbmZvcm1hY2lcdTAwZjNuLg0KLXNhdmVVcGdyYWRlZExpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMTlFOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgZ3VhcmRhciBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhY3R1YWxpemFkYS5cblwNCi1cblwNCi1QdWxzZSBEZXRhbGxlcyBwYXJhIG9idGVuZXIgbVx1MDBlMXMgaW5mb3JtYWNpXHUwMGYzbi4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9QWJyaWVuZG8gYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuLi4NCi1zYXZpbmdMaWJyYXJ5VGFza19uYW1lPUd1YXJkYW5kbyBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4uLg0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9QWN0dWFsaXphbmRvIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLi4uDQotbG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2tfbmFtZT1DYXJnYW5kbyBlbGVtZW50b3MgZGUgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuLi4NCi1zYXZpbmdVcGdyYWRlZEVsZW1lbnRzVGFza19uYW1lPUd1YXJkYW5kbyBlbGVtZW50b3MgZGUgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZW4gZWwgbnVldm8gZm9ybWF0byBkZSBhcmNoaXZvLi4uDQotc2F2aW5nVGFza19uYW1lPUd1YXJkYW5kbyAnJ3swfScnLi4uDQotc2F2aW5nRmlsZXNUYXNrX25hbWU9R3VhcmRhbmRvIGFyY2hpdm9zLi4uDQotZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU9QXJyZWdsYW5kbyBHVUlEIGRlIGRlc2NyaXBjaVx1MDBmM24gZGVsIGNvbnRlbmlkby4uLg0KLWRlbGV0aW5nSW52YWxpZFJlZmVyZW5jZXNUYXNrX25hbWU9U3VwcmltaWVuZG8gbGFzIHJlZmVyZW5jaWFzIG5vIHZcdTAwZTFsaWRhcy4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IEVzdGEgcGVyc3BlY3RpdmEgc2UgaGEgZGlzZVx1MDBmMWFkbyBlc3BlY1x1MDBlZGZpY2FtZW50ZSBwYXJhIG1heGltaXphciBsYSBleHBlcmllbmNpYSBkZWwgdXN1YXJpbyBhbCBuYXZlZ2FyIHBvciBsYSByZXByZXNlbnRhY2lcdTAwZjNuIEhUTUwgZGUgbG9zIGVsZW1lbnRvcyBkZSBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4gQXF1XHUwMGVkIG5vIHNlIHB1ZWRlIGFcdTAwZjFhZGlyIG5pIHZpc3VhbGl6YXIgbmluZ1x1MDBmYW4gZWRpdG9yLg0KLQ0KLSMgQ2hhbmdlIEhpc3RvcnkgRGlhbG9nDQotQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZT1IaXN0b3JpYWwgZGUgZGVzY3JpcGNpXHUwMGYzbiBkZSBjYW1iaW8NCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsPUhpc3RvcmlhbCBkZSBjYW1iaW9zOg0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVsZXRlIEFjdGlvbg0KLWNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU9Q29uZmlybWFyIHN1cHJlc2lcdTAwZjNuDQotY29uZmlybURlbGV0ZURpYWxvZ19tc2c9XHUwMGJmRXN0XHUwMGUxIHNlZ3VybyBkZSBxdWUgZGVzZWEgc3VwcmltaXIgJyd7MH0nJz8NCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZ1dpdGhSZWZlcmVuY2U9XHUwMGJmRXN0XHUwMGUxIHNlZ3VybyBkZSBxdWUgZGVzZWEgc3VwcmltaXIgJyd7MH0nJz9cblwNCi1cblwNCi1Mb3MgZWxlbWVudG9zIHNpZ3VpZW50ZXMgY29udGllbmVuIHJlZmVyZW5jaWFzIGEgbG9zIGFydFx1MDBlZGN1bG9zIHF1ZSBzZSB2YW4gYSBzdXByaW1pcjogezF9DQotDQotIyBOZXcgTGlicmFyeSBEaWFsb2cNCi1lcnJvckRpYWxvZ19tZXNzYWdlPUlVUEEwMDIyRTogTm8gc2UgcHVlZGUgY3JlYXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgJyd7MH0nJy4NCi1lcnJvckRpYWxvZ19lcnJvcj1ObyBzZSBwdWVkZSBjcmVhciB1bmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZGVudHJvIGRlIG90cmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuDQotZXJyX25vb3BlbmxpYnJhcnk9SVVQQTAwNDBFOiBObyBoYXkgbmluZ3VuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhYmllcnRhLlxuXA0KLVxuXA0KLURlYmUgYWJyaXIgdW5hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIHBhcmEgcG9kZXIgYVx1MDBmMWFkaXIgdW4gbnVldm8gcGx1Zy1pbiBkZSBtXHUwMGU5dG9kby5cblwNCi1cblwNCi1DcmVlIHVuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBudWV2YSBvIGFicmEgdW5hIGV4aXN0ZW50ZSB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotZXJyX2xvYWRpbmdsaWJyYXJ5PVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBjYXJnYXIgbGEgYmlibGlvdGVjYQ0KLW1zZ19yZWxvYWRMaWJyYXJ5PVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBkZXNoYWNlciBsYSBzdXByZXNpXHUwMGYzbiBhblx1MDBmM21hbGEuIERlYmUgdm9sdmVyIGEgY2FyZ2FyIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGFjdHVhbC4NCi0NCi0jIFJlbG9hZCBMaWJyYXJ5IERpYWxvZw0KLXJlbG9hZERpYWxvZ19tZXNzYWdlPURlYmUgdm9sdmVyIGEgY2FyZ2FyIGxhIGJpYmxpb3RlY2EgcGFyYSByZXN0YXVyYXIgc3UgZXN0YWRvIG9yaWdpbmFsLg0KLXJlbG9hZERpYWxvZ190aXRsZT1Wb2x2ZXIgYSBjYXJnYXIgYmlibGlvdGVjYQ0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlPUVycm9yIGRlIG1vdmltaWVudG8NCi1kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JNZXNzYWdlPVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBkdXJhbnRlIGVsIG1vdmltaWVudG8NCi0NCi0jIFByb2Nlc3MgRm9ybSBFZGl0b3INCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU9R3VhcmRhcg0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMT1Fc3RlIGNhbWJpbyBhZmVjdGFyXHUwMGUxIGEgdG9kb3MgbG9zIGRpYWdyYW1hcyBkZWwgcHJvY2Vzby4gRWwgZWRpdG9yIHNlIGd1YXJkYXJcdTAwZTEgZGVzcHVcdTAwZTlzIGRlbCBjYW1iaW8uIFx1MDBiZkRlc2VhIGNvbnRpbnVhcj8NCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTI9RWwgZWRpdG9yIHNlIGd1YXJkYXJcdTAwZTEgZGVzcHVcdTAwZTlzIGRlbCBjYW1iaW8uIFx1MDBiZkRlc2VhIGNvbnRpbnVhcj8NCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBQYWdlDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPUNvbmZpcm1hciBlbGltaW5hY2lcdTAwZjNuDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX21lc3NhZ2U9XHUwMGJmRXN0XHUwMGUxIHNlZ3VybyBkZSBxdWUgZGVzZWEgZWxpbWluYXIgbGEgdmlzdGEgJyd7MH0nJz8NCi1jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfdGl0bGU9QXZpc28NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uPUNvbmZpZ3VyYWNpXHUwMGYzbjoNCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3M9VmlzdGFzIGRlIGNvbmZpZ3VyYWNpXHUwMGYzbg0KLWNvbmZpZ1ZpZXdQYWdlX3ZpZXdzPVZpc3Rhcw0KLWNvbHVtbnNlbGVjdGlvbl90ZXh0PVNlbGVjY2lcdTAwZjNuIGRlIGNvbHVtbmFzOg0KLWNvbmZpZ1ZpZXdQYWdlX2FkZFZpZXdCdXR0b25UZXh0PUFcdTAwZjFhZGlyIHZpc3RhLi4uDQotY29uZmlnVmlld1BhZ2VfcmVtb3ZlVmlld0J1dHRvblRleHQ9RWxpbWluYXIgdmlzdGENCi1jb25maWdWaWV3UGFnZV9tYWtlRGVmYXVsdEJ1dHRvblRleHQ9RXN0YWJsZWNlciBjb21vIHByZWRldGVybWluYWRvDQotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNXOiBZYSBleGlzdGUgdW5hIHZpc3RhIGNvbiBlbCBub21icmUgJyd7MH0nJy4NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25UaXRsZT1WaXN0YXMgZGUgbmF2ZWdhY2lcdTAwZjNuIHB1YmxpY2FkYXMNCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25NZXNzYWdlPUVzcGVjaWZpcXVlIGxhcyB2aXN0YXMgcXVlIHNlIGluY2x1aXJcdTAwZTFuIGN1YW5kbyBzZSBwdWJsaXF1ZSBlc3RhIGNvbmZpZ3VyYWNpXHUwMGYzbi4gUGFyYSBjcmVhciB1bmEgdmlzdGEsIHB1bHNlIEFcdTAwZjFhZGlyIHZpc3RhIHBhcmEgc2VsZWNjaW9uYXIgdW5hIGNhdGVnb3JcdTAwZWRhIGVzdFx1MDBlMW5kYXIgbyBwZXJzb25hbGl6YWRhIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbi4gIExhIGNhdGVnb3JcdTAwZWRhIHNlbGVjY2lvbmFkYSByZXByZXNlbnRhclx1MDBlMSBsYSB2aXN0YSB5IGxvcyBlbGVtZW50b3MgZGUgY29udGVuaWRvIHkgbGFzIHN1YmNhdGVnb3JcdTAwZWRhcyBkZSBsYSBjYXRlZ29yXHUwMGVkYSByZXByZXNlbnRhclx1MDBlMW4gbG9zIGVsZW1lbnRvcyBkZSBcdTAwZTFyYm9sIGRlIGxhIHZpc3RhLg0KLQ0KLSMgRGVzY3JpcHRpb24gVGFiDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU9Q29udmVydGlyIGd1XHUwMGVkYQ0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxPUlVUEEwMDQwVzogQW50ZXMgZ3VhcmRlIGVsIGVkaXRvci4NCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMj1ObyBoYXkgbmluZ3VuYSBndVx1MDBlZGEgY29tcGF0aWJsZSBwYXJhIGVzdGUgdGlwby4NCi0NCi1jaGFuZ2VBY3Rpdml0eVR5cGVXYXJuaW5nRGlhbG9nX3RpdGxlPUNvbnZlcnRpciBhY3RpdmlkYWQNCi0jIEFzc29jaWF0aW9uIEZvcm0gUGFnZQ0KLUFzc29jaWF0aW9uRm9ybVBhZ2VfQnJpZWZEZXNjcmlwdGlvbkxhYmVsPURlc2NyaXBjaVx1MDBmM24gYnJldmUgZGVsIGVsZW1lbnRvIHNlbGVjY2lvbmFkbzoNCi0NCi0jIE1ldGhvZCBFbGVtZW50IERlc2NyaXB0aW9uDQotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX3RpdGxlPUVzcGVjaWZpY2FyIGVsIG5vbWJyZSBkZSBlbGVtZW50bw0KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ19tZXNzYWdlPUVsIGNhbXBvIGRlIG5vbWJyZSBubyBwdWVkZSBlc3RhciB2YWNcdTAwZWRvLg0KLQ0KLSMgTWV0aG9kIFBsdWctaW4gRGVzY3JpcHRpb24NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZT1TaSBhbnVsYSBsYSBzZWxlY2NpXHUwMGYzbiBkZSBsb3MgcGx1Zy1pbnMgY29uIHJlZmVyZW5jaWFzIGFzb2NpYWRvcyBjb24gZWwgcGx1Zy1pbiAnJ3swfScnIHNlIHByb2R1Y2lyXHUwMGUxbiByZWxhY2lvbmVzIG5vIHZcdTAwZTFsaWRhcyBxdWUgc2Ugc3VwcmltaXJcdTAwZTFuLlxuXA0KLVxuXA0KLUVzdGEgYWNjaVx1MDBmM24gbm8gc2UgcHVlZGUgZGVzaGFjZXIuIFx1MDBiZkRlc2VhIGNvbnRpbnVhciBjb24gZXN0ZSBjYW1iaW8/DQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU9RXN0XHUwMGUxIGEgcHVudG8gZGUgY2FtYmlhciBlbCBub21icmUgZGUgZXN0ZSBwbHVnLWluIGRlIG1cdTAwZTl0b2RvIGRlICcnezB9JycgYWwgbnVldm8gbm9tYnJlICcnezF9JycuIEVzdGEgb3BlcmFjaVx1MDBmM24gZ3VhcmRhclx1MDBlMSBlbCBlZGl0b3IgeSBjYW1iaWFyXHUwMGUxIGVsIG5vbWJyZSBkZSBsYSBjYXJwZXRhIGRlIHBsdWctaW5zIHBvciBlbCBub21icmUgbnVldm8uIFx1MDBiZkRlc2VhIGNvbnRpbnVhcj8NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZT1SZW5vbWJyYXIgcGx1Zy1pbiBkZSBtXHUwMGU5dG9kbw0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jYW5ub3RSZW5hbWVQbHVnaW5Gb2xkZXI9Tm8gc2UgaGEgcG9kaWRvIGNhbWJpYXIgZWwgbm9tYnJlIGRlIGxhIGNhcnBldGEgZGUgcGx1Zy1pbnMgcG9yIGVsIG5vbWJyZSBudWV2bw0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luTGFiZWw9QmxvcXVlYXIgcGx1Zy1pbg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luX21lc3NhZ2U9RWwgY2FtYmlvIGRlbCBibG9xdWVvIGRlbCBwbHVnLWluIGd1YXJkYXJcdTAwZTEgeSBjZXJyYXJcdTAwZTEgbG9zIGVkaXRvcmVzIGFiaWVydG9zIGRlIGVsZW1lbnRvcyBxdWUgcGVydGVuZWNlbiBhbCBwbHVnLWluICcnezB9JycuIFx1MDBiZkRlc2VhIGNvbnRpbnVhciBjb24gZXN0ZSBjYW1iaW8/DQotDQotIyBQcm9jZXNzIERlc2NyaXB0aW9uDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fdGl0bGU9UmVub21icmFyDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZT1Fc3RcdTAwZTEgYSBwdW50byBkZSBjYW1iaWFyIGVsIG5vbWJyZSBkZSBlc3RlIHByb2Nlc28uIEVzdGEgb3BlcmFjaVx1MDBmM24gZ3VhcmRhclx1MDBlMSBlbCBlZGl0b3IgeSBjYW1iaWFyXHUwMGUxIGVsIG5vbWJyZSBkZSBsYSBjYXJwZXRhIGRlbCBwcm9jZXNvIHBvciBlbCBub21icmUgbnVldm8uIFx1MDBiZkRlc2VhIGNvbnRpbnVhcj8NCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbkRlc2NyaXB0aW9uPURlc2NyaXBjaVx1MDBmM246DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uVGl0bGU9Q29uZmlndXJhY2lcdTAwZjNuDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uTWVzc2FnZT1Fc3BlY2lmaXF1ZSB0b2RhcyBsYXMgY29uZmlndXJhY2lvbmVzIHZcdTAwZTFsaWRhcyBwYXJhIGVzdGUgcHJvY2Vzby4gU2VsZWNjaW9uZSB1bmEgY29uZmlndXJhY2lcdTAwZjNuIHBvciBvbWlzaVx1MDBmM24sIHF1ZSBkZWJlIHNlciB1biBjb25qdW50byBzdXBlcmlvciBkZWwgcmVzdG8gZGUgY29uZmlndXJhY2lvbmVzLg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9ucz1Db25maWd1cmFjaW9uZXM6DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ9KHBvciBvbWlzaVx1MDBmM24pDQotUHJvY2Vzc0Rlc2NyaXB0aW9uX3NlbGVjdENvbmZpZ3VyYXRpb249U2VsZWNjaW9uZSBsYXMgY29uZmlndXJhY2lvbmVzIHF1ZSBkZXNlYSBhXHUwMGYxYWRpcg0KLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQwPUVzdGEgYWNjaVx1MDBmM24gZ3VhcmRhclx1MDBlMSBlbCBlZGl0b3IgYWN0dWFsIHkgZWwgY2FtYmlvIHNlclx1MDBlMSBwZXJtYW5lbnRlLiBcdTAwYmZFc3RcdTAwZTEgc2VndXJvIGRlIHF1ZSBkZXNlYSBzdXByaW1pciAnJ3swfScnPw0KLVByb2Nlc3NEZWxldGVBY3Rpb25fc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZT1Mb3MgZGVzY3JpcHRvcmVzIHNpZ3VpZW50ZXMgbm8gc2UgdXRpbGl6YW4gZW4gbmluZ3VuYSBwYXJ0ZSBkZXNwdVx1MDBlOXMgZGUgc3VwcmltaXIgbG9zIGVsZW1lbnRvcyBzZWxlY2Npb25hZG9zLlxuXA0KLVNlbGVjY2lvbmUgbG9zIGRlc2NyaXB0b3JlcyBxdWUgZGVzZWEgc3VwcmltaXIuDQotDQotIyBWaWV3IEhlbHBlcg0KLXZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ190aXRsZT1Db21wcm9iYXIgZWwgZXN0YWRvIGRlIGxhIGJpYmxpb3RlY2ENCi12aWV3SGVscGVyX3BlcmZvcm1IZWFsdGhDaGVjaz1SZWFsaXphbmRvIGxhIGNvbXByb2JhY2lcdTAwZjNuIGRlIGVzdGFkbyBkZSBsYSBiaWJsaW90ZWNhLi4uDQotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U9TGEgY29tcHJvYmFjaVx1MDBmM24gZGUgZXN0YWRvIGRlIGxhIGJpYmxpb3RlY2EgYWJpZXJ0YSBzZSBoYSBjb21wbGV0YWRvIHNhdGlzZmFjdG9yaWFtZW50ZS4gQ29uc3VsdGUgZWwgaW5mb3JtZSBkZWwgYXJjaGl2byBkZSByZWdpc3Ryby4NCi0NCi0jIEF0dGFjaCBUZW1wbGF0ZSBGaWxlIERpYWxvZw0KLWF0dGFjaFRlbXBsYXRlRmlsZURpYWxvZ190aXRsZT1BZGp1bnRhciBhcmNoaXZvIGRlIHBsYW50aWxsYQ0KLQ0KLSMgQ3JlYXRlIEVsZW1lbnQgRXJyb3IgRGlhbG9nDQotY3JlYXRlRWxlbWVudERpYWxvZ190aXRsZT1DcmVhciBudWV2byB7MH0NCi1jcmVhdGVOZXdFbGVtZW50RXJyb3JfbXNnPVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBjcmVhciBlbCBudWV2byB7MH0uDQotDQotZGxnVGl0bGVfcmVsb2FkTGlicmFyeT1Wb2x2ZXIgYSBjYXJnYXIgYmlibGlvdGVjYQ0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9yZWFzb249RWwgbm9tYnJlIGRlIHswfSBubyBwdWVkZSBlc3RhciB2YWNcdTAwZWRvLlxuXA0KLVxuXA0KLUVzcGVjaWZpcXVlIHVuIG5vbWJyZSB2XHUwMGUxbGlkbyB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uPUVsIHByb2Nlc28gJyd7MH0nJyBoYWNlIHJlZmVyZW5jaWEgYSBsYSBjb25maWd1cmFjaVx1MDBmM24NCi0NCi0jIENoYW5nZUJvdW5kc0NvbW1hbmQNCi1nZWZfY2hhbmdlQm91bmRzQ29tbWFuZF9sYWJlbD1DYW1iaWFyIGxcdTAwZWRtaXRlcw0KLSMgQ2hhbmdlTmFtZUNvbW1hbmQNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw9Q2FtYmlhciBub21icmUNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U9Tm8gc2UgcHVlZGUgZGVzaGFjZXIgZWwgY2FtYmlvIGRlIG5vbWJyZS5cblwNCi1cblwNCi1ObyBzZSBwdWVkZSBkZXNoYWNlciBlbCBjYW1iaW8gZGUgbm9tYnJlIHNpIGVsIG5vbWJyZSBhbnRlcmlvciBlcyBudWxvLg0KLSMgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQNCi1nZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw9Q2FtYmlhciB2YWxvciBkZSBsYSBwcm9waWVkYWQNCi0jIENyZWF0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfY3JlYXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1DcmVhciBwdW50byBkZSBpbmZsZXhpXHUwMGYzbg0KLSMgQ3JlYXRlTGlua0NvbW1hbmQNCi1nZWZfY3JlYXRlTGlua0NvbW1hbmRfbGFiZWw9Q3JlYWNpXHUwMGYzbiBkZSBlbmxhY2VzDQotIyBDcmVhdGVOb2RlQ29tbWFuZA0KLWdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbD1DcmVhciBudWV2byBub2RvDQotIyBEZWxldGVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9U3VwcmltaXIgcHVudG8gZGUgaW5mbGV4aVx1MDBmM24NCi0jIERlbGV0ZUNvbW1hbmQNCi1nZWZfZGVsZXRlQ29tbWFuZF9sYWJlbD1TdXByaW1pcg0KLSMgRGVsZXRlTGlua0NvbW1hbmQNCi1nZWZfZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw9U3VwcmltaXIgY29uZXhpXHUwMGYzbg0KLSMgTW92ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfbW92ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9TW92ZXIgcHVudG8gZGUgaW5mbGV4aVx1MDBmM24NCi0jIFJlY29ubmVjdExpbmtDb21tYW5kDQotZ2VmX3JlY29ubmVjdExpbmtDb21tYW5kX2xhYmVsPVJlY29uZWN0YXIgZW5sYWNlDQotDQotIyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXINCi1nZWZfdmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1FbCBub21icmUgbm8gcHVlZGUgZXN0YXIgdmFjXHUwMGVkby4gRXNwZWNpZmlxdWUgdW4gbm9tYnJlIHZcdTAwZTFsaWRvLg0KLSMgVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXINCi1nZWZfdmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0PUVsIG5vbWJyZSBubyBwdWVkZSBlc3RhciB2YWNcdTAwZWRvLiBFc3BlY2lmaXF1ZSB1biBub21icmUgdlx1MDBlMWxpZG8uDQotIyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydA0KLWdlZl93b3JrUHJvZHVjdE5vZGVFZGl0UGFydF92YWxpZGF0ZU1lc3NhZ2U9RWwgbm9tYnJlIG5vIHB1ZWRlIGVzdGFyIHZhY1x1MDBlZG8uIEVzcGVjaWZpcXVlIHVuIG5vbWJyZSB2XHUwMGUxbGlkby4NCi0NCi0jIEVsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbg0KLWFjdGlvbnNfRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uX21lc3NhZ2U9TGEgY29uZmlndXJhY2lcdTAwZjNuICcnezB9Jycgbm8gc2UgcHVlZGUgc3VwcmltaXIgcG9ycXVlIHRvZGF2XHUwMGVkYSBsYSBlc3RcdTAwZTEgdXRpbGl6YW5kbyBlbCBwcm9jZXNvICcnezF9JycuDQotDQotIyBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3INCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclRpdGxlPVN1cHJpbWlyIGVycm9yDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JNZXNzYWdlPUV4Y2VwY2lcdTAwZjNuIG5vIGNvbnRyb2xhZGENCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclJlYXNvbj1Db25zdWx0ZSBsb3MgZGV0YWxsZXMNCi0NCi0jIE1ldGhvZEVsZW1lbnRFZGl0b3INCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yVGl0bGU9R3VhcmRhciBlcnJvcg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMT1JVVBBMDAyMEU6IFNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBndWFyZGFyIGVsIGFyY2hpdm8NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI9Q29uZmlybWFyIGVycm9yDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjE9Q29uc3VsdGUgZWwgYXJjaGl2byBkZSByZWdpc3RybyBwYXJhIG9idGVuZXIgbVx1MDBlMXMgZGV0YWxsZXMNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMj1Db25zdWx0ZSBsb3MgZGV0YWxsZXMNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JUaXRsZT1FcnJvciBkZSByZW5vbWJyZQ0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yTXNnPVNlIGhhbiBlbGltaW5hZG8gdW5vIG8gbXVjaG9zIGFyY2hpdm9zIGRlIGVzdGUgZWRpdG9yLiBFbCBlZGl0b3IgeWEgbm8gZXMgdlx1MDBlMWxpZG8geSB0aWVuZSBxdWUgY2VycmFyc2UuDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZT1FZGl0b3Igbm8gdlx1MDBlMWxpZG8NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JNZXNzYWdlMT1TZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgcmVub21icmFyIGVsIGFyY2hpdm8gJyd7MH0nJw0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLXJlbmFtZUVycm9yX3RpdGxlPVJlbm9tYnJhciBlbGVtZW50bw0KLXJlbmFtZUVycm9yX21zZz1JVVBBMDAxM0U6IE5vIHNlIHB1ZWRlIGNvbXBsZXRhciBsYSBvcGVyYWNpXHUwMGYzbiBkZSByZW5vbWJyYXIuDQotU2VsZWN0RWxlbWVudERpYWxvZ19zZWxlY3RlbGVtZW50X3RleHQ9U2VsZWNjaW9uYXIgZWxlbWVudG8NCi0NCi0jIEVkaXRvckNob29zZXINCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfdGl0bGU9QWJyaXIgZWRpdG9yIGRlIG1cdTAwZTl0b2Rvcw0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlwY2lcdTAwZjNuOg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbD1TZWxlY2Npb25hciB0b2RvDQotT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZV9lZGl0X3RleHQwPUVkaXRhciBlbGVtZW50bw0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19tZXNzYWdlPUlVUEEwMDIzRTogTm8gc2UgcHVlZGUgYWJyaXIgZWwgZWRpdG9yIGFzb2NpYWRvIGNvbiBlbCBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyBzZWxlY2Npb25hZG8uDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9JY29uRmlsZUNob29zZXJEaWFsb2dfdGl0bGU9U2VsZWNjaW9uYXIgYXJjaGl2byBkZSBpbWFnZW4NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5TmFtZT1OdWV2YSBiaWJsaW90ZWNhDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX0Rlc2NyaXB0aW9uTGFiZWw9RGVzY3JpcGNpXHUwMGYzbjoNCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1TZWxlY2Npb25lIHVuYSBvIHZhcmlhcyBjb25maWd1cmFjaW9uZXMgZGVsIG1cdTAwZTl0b2RvIHkgcHVsc2UgRmluYWxpemFyIHBhcmEgYWJyaXJsYXMuDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX0Rlc2VsZWN0QWxsQnV0dG9uTGFiZWw9QW51bGFyIHNlbGVjY2lvbmVzDQotRWxlbWVudHNWaWV3X21pZ3JhdGlvbl9kaXJfZGxnX2Rlc2NyaXB0aW9uX3RleHQ9RXNwZWNpZmlxdWUgZWwgZGlyZWN0b3JpbyBkZWwgezB9IHJlY2lcdTAwZTluIG1pZ3JhZG8gcGFyYSByZWVtcGxhemFyIGVsIHswfSBzZWxlY2Npb25hZG8NCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBkZWwgc2lzdGVtYS4gUHVsc2UgRGV0YWxsZXMgcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGluZm9ybWFjaVx1MDBmM24uXG5cDQotXG5cDQotQ2llcnJlIGFsZ3Vub3MgZGUgbG9zIGVkaXRvcmVzIGFiaWVydG9zIHkgdnVlbHZhIGEgaW50ZW50YXJsby4NCi0NCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlPUxhIGltYWdlbiBubyBlcyB2XHUwMGUxbGlkYQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzFFOiBMYSBpbWFnZW4gc2VsZWNjaW9uYWRhICcnezB9Jycgc3VwZXJhIGVsIHRhbWFcdTAwZjFvIHBlcm1pdGlkbyAoezF9IHBvciB7Mn0pLiBTZWxlY2Npb25lIG90cmEgaW1hZ2VuLg0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190aXRsZT1MYSBpbWFnZW4gbm8gZXMgdlx1MDBlMWxpZGENCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzJFOiBFbCBhcmNoaXZvIHNlbGVjY2lvbmFkbyAnJ3swfScnIG5vIGV4aXN0ZS4gU2VsZWNjaW9uZSBvdHJhIGltYWdlbi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9U2VsZWNjaW9uYXIuLi4NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5RGVzY3JpcHRpb249RGVzY3JpcGNpXHUwMGYzbiBkZSBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1EZXNjcmlwY2lcdTAwZjNuIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZWwgbVx1MDBlOXRvZG8NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPURlYmVuIGNlcnJhcnNlIHRvZG9zIGxvcyBlZGl0b3Jlcy4gU2VsZWNjaW9uZSBsb3MgcXVlIHRpZW5lbiBxdWUgZ3VhcmRhcnNlIHByaW1lcm8sIGVuIHN1IGNhc28uDQotDQotIyBUZW1wbGF0ZURlc2NyaXB0aW9uUGFnZQ0KLWZvcm1zX1RlbXBsYXRlRGVzY3JpcHRpb25QYWdlX2FscmVhZHlBdHRhY2hlZF9tc2c9RWwgYXJjaGl2byBzZWxlY2Npb25hZG8geWEgZXMgdW4gYXJjaGl2byBkZSBkYXRvcyBhZGp1bnRvcyBkZSBlc3RhIFBsYW50aWxsYS4NCi0NCi0jIE5ldyBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLW5ld0xpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFOiBObyBzZSBoYSBwb2RpZG8gY3JlYXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuDQotbmV3TGlicmFyeUVycm9yX3JlYXNvbjE9TGEgdlx1MDBlZGEgZGUgYWNjZXNvIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGVzcGVjaWZpY2FkYSAnJ3swfScnIG5vIGVzIHZcdTAwZTFsaWRhLg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24yPVlhIGV4aXN0ZSB1bmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZW4gJyd7MH0nJy4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMz1ObyBzZSBwdWVkZSBjcmVhciBsYSBjYXJwZXRhIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGVzcGVjaWZpY2FkYSAnJ3swfScnLg0KLW5ld0xpYnJhcnlFcnJvcl9hZHZpY2U9U2VsZWNjaW9uZSBBY2VwdGFyIHBhcmEgZXNwZWNpZmljYXIgb3RybyBub21icmUgbyB2XHUwMGVkYSBkZSBhY2Nlc28gcGFyYSBsYSBiaWJsaW90ZWNhLg0KLQ0KLSNQcm9jZXNzIGxpdGVyYWxzDQotUHJvY2Vzc19FeHRlcm5hbElEPUlEIGV4dGVybm86DQotUHJvY2Vzc19QdXJwb3NlPU9iamV0aXZvOg0KLVByb2Nlc3NfU2NvcGU9XHUwMGMxbWJpdG86DQotUHJvY2Vzc19Vc2FnZU5vdGVzPU5vdGFzIGRlIHV0aWxpemFjaVx1MDBmM246DQotUHJvY2Vzc19BbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmFzOg0KLVByb2Nlc3NfSG93VG9TdGFmZj1DXHUwMGYzbW8gcHJvdmVlciBkZSBwZXJzb25hbDoNCi1Qcm9jZXNzX0tleUNvbnNpZGVyYXRpb249RmFjdG9yZXMgY2xhdmU6DQotUHJvY2Vzc19TY2FsZT1Fc2NhbGE6DQotUHJvY2Vzc19Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPUNhcmFjdGVyXHUwMGVkc3RpY2FzIGRlbCBwcm95ZWN0bzoNCi1Qcm9jZXNzX1Jpc2tMZXZlbD1OaXZlbCBkZSByaWVzZ286DQotUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlPVRcdTAwZTljbmljYSBkZSBjXHUwMGUxbGN1bG86DQotUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPUVzcGVjaWFsaWRhZCBkZSBtaWVtYnJvIGRlbCBwcm95ZWN0bzoNCi1Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0PVRpcG8gZGUgY29udHJhdG86DQotDQotIyBFZGl0b3IgUHJldmlldyBOYXZpZ2F0aW9uIEJ1dHRvbnMNCi1iYWNrQnV0dG9uX3RleHQ9QXRyXHUwMGUxcw0KLWZvcndhcmRCdXR0b25fdGV4dD1IYWNpYSBkZWxhbnRlDQotZm9yd2FyZF90ZXh0PUhhY2lhIGRlbGFudGUNCi1zdG9wQnV0dG9uX3RleHQ9RGV0ZW5lcg0KLXJlZnJlc2hCdXR0b25fdGV4dD1SZW5vdmFyDQotcmVmcmVzaF90ZXh0PVJlbm92YXINCi1uZXduYW1lX3RleHQ9TnVldm8gbm9tYnJlOg0KLXByaW50QnV0dG9uX3RleHQ9SW1wcmltaXINCi0NCi0jIENvbnRleHQgbWVudXMNCi1fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW09JlJlbm92YXINCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT0mTW9zdHJhciBwcm9waWVkYWRlcw0KLQ0KLV9VSV9NZXRob2RFZGl0b3JfbWVudT0mRWRpdG9yIGRlIG1cdTAwZTl0b2Rvcw0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jk51ZXZvDQotX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtPU51JmV2byBpZ3VhbA0KLQ0KLV9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsPVNlbGVjY2lcdTAwZjNuDQotX1VJX1BhcmVudFBhZ2VfbGFiZWw9UGFkcmUNCi1fVUlfTGlzdFBhZ2VfbGFiZWw9TGlzdGENCi1fVUlfVHJlZVBhZ2VfbGFiZWw9XHUwMGMxcmJvbA0KLV9VSV9UYWJsZVBhZ2VfbGFiZWw9VGFibGENCi1fVUlfVGFibGVUcmVlUGFnZV9sYWJlbD1cdTAwYzFyYm9sIGRlIHRhYmxhDQotX1VJX09iamVjdENvbHVtbl9sYWJlbD1PYmpldG8NCi1fVUlfU2VsZkNvbHVtbl9sYWJlbD1BdXRvbVx1MDBlMXRpY28NCi0NCi1fVUlfTm9PYmplY3RTZWxlY3RlZD1ObyBzZSBoYSBzZWxlY2Npb25hZG8gbmluZ1x1MDBmYW4gb2JqZXRvDQotX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkPU9iamV0byBzZWxlY2Npb25hZG86IHswfQ0KLV9VSV9NdWx0aU9iamVjdFNlbGVjdGVkPVNlIGhhbiBzZWxlY2Npb25hZG8gezB9IG9iamV0b3MNCi0NCi1fVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsPUFicmlyIGVkaXRvcg0KLQ0KLV9VSV9XaXphcmRfY2F0ZWdvcnk9RWplbXBsbyBkZSBhc2lzdGVudGVzIGRlIGNyZWFjaVx1MDBmM24gZGUgbW9kZWxvcyBkZSBFTUYNCi0NCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfbGFiZWw9TW9kZWxvIGRlIG1cdTAwZTl0b2RvDQotX1VJX01ldGhvZE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uPUNyZWFyIHVuIG51ZXZvIG1vZGVsbyBkZSBtXHUwMGU5dG9kbw0KLQ0KLV9VSV9NZXRob2RFZGl0b3JfbGFiZWw9RWRpdG9yIGRlIG1vZGVsb3MgZGUgbVx1MDBlOXRvZG8NCi0NCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZT1NaQ0KLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbj1tXHUwMGU5dG9kbw0KLQ0KLV9VSV9XaXphcmRfbGFiZWw9TnVldm8NCi0NCi1fV0FSTl9GaWxlbmFtZUV4dGVuc2lvbj1FbCBub21icmUgZGUgYXJjaGl2byBkZWJlIHRlcm1pbmFyIGVuICcnezB9JycNCi0NCi1fVUlfTW9kZWxPYmplY3Q9T2JqZXRvIGRlIG1vZGVsbw0KLV9VSV9YTUxFbmNvZGluZz1Db2RpZmljYWNpXHUwMGYzbiBYTUwNCi1fVUlfWE1MRW5jb2RpbmdDaG9pY2VzPVVURi04IEFTQ0lJIFVURi0xNiBVVEYtMTZCRSBVVEYtMTZMRSBJU08tODg1OS0xDQotX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbj1TZWxlY2Npb25lIHVuIG9iamV0byBkZSBtb2RlbG8gcGFyYSBjcmVhcg0KLQ0KLV9VSV9GaWxlQ29uZmxpY3RfbGFiZWw9Q29uZmxpY3RvIGRlIGFyY2hpdm9zDQotX1dBUk5fRmlsZUNvbmZsaWN0PUhheSBjYW1iaW9zIHNpbiBndWFyZGFyIHF1ZSBlbnRyYW4gZW4gY29uZmxpY3RvIGNvbiBsb3MgY2FtYmlvcyByZWFsaXphZG9zIGZ1ZXJhIGRlbCBlZGl0b3IuIFx1MDBiZkRlc2VhIGRlc2NhcnRhciBsb3MgY2FtYmlvcyBkZSBlc3RlIGVkaXRvcj8NCi0NCi0jIEFkZCBMaW5rIERpYWxvZw0KLWFkZExpbmtEaWFsb2dfbGlua1R5cGU9VGlwbzoNCi1vcGVuTGlua0NoZWNrYm94X3RleHQ9QWJyaXIgZW5sYWNlIGVuIHVuYSB2ZW50YW5hIHNlcGFyYWRhIGRlbCBuYXZlZ2Fkb3INCi0NCi0jIEFkZCBJbWFnZSBEaWFsb2cNCi1oZWlnaHRMYWJlbF90ZXh0PUFsdHVyYToNCi13aWR0aExhYmVsX3RleHQ9QW5jaG86DQotRWxlbWVudHNWaWV3XzIwPXBhdHJcdTAwZjNuIGRlIHBvc2liaWxpZGFkDQotRWxlbWVudHNWaWV3XzIxPXByb2Nlc28gZGUgZW50cmVnYQ0KLUVsZW1lbnRzVmlld18yMj1wcm9jZXNvDQotRWxlbWVudHNWaWV3XzM1PXswfSBlcyBkZSBzXHUwMGYzbG8gbGVjdHVyYS4gU2VsZWNjaW9uZSBsYSBvcGNpXHUwMGYzbiBwYXJhIHF1ZSBzZSBwdWVkYSBlc2NyaWJpciBhbnRlcyBkZSBjb250aW51YXIuDQotRWxlbWVudHNWaWV3XzM2PVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBjYXJnYXIgbGEgYmlibGlvdGVjYQ0KLWFsdFRhZ0xhYmVsX3RleHQ9RXRpcXVldGEgQUxUOg0KLWltYWdlU2l6ZUxhYmVsX3RleHQ9TGEgYWx0dXJhIHkgZWwgYW5jaG8gZGUgbGEgaW1hZ2VuIGRlYmVuIHRlbmVyIHVuIG1cdTAwZWRuaW1vIGRlIDEwIHkgdW4gbVx1MDBlMXhpbW8gZGUgNjAwLiBMYSBhbHR1cmEgeSBlbCBhbmNobyBxdWUgbm8gc2VhbiB2XHUwMGUxbGlkb3Mgc2UgY29udmVydGlyXHUwMGUxbiBhIHVuIHRhbWFcdTAwZjFvIGFkZWN1YWRvLg0KLQ0KLSMgUHJvY2VzcyBFZGl0b3INCi1Qcm9jZXNzRWRpdG9yPUVkaXRvciBkZSBwcm9jZXNvcw0KLVByb2Nlc3NFZGl0b3JfTmFtZT1Ob21icmUNCi1Qcm9jZXNzRWRpdG9yX1ByZXNlbnRhdGlvbk5hbWU9Tm9tYnJlIGRlIHByZXNlbnRhY2lcdTAwZjNuDQotUHJvY2Vzc0VkaXRvcl9JbmRleD1cdTAwY2RuZGljZQ0KLVByb2Nlc3NFZGl0b3JfUHJlZGVjZXNzb3JzPVByZWRlY2Vzb3Jlcw0KLSNDb25maWd1cmF0aW9uUGFnZV9TZWxlY3RlZD1TZWxlY3RlZDogDQotQ2hlY2tsaXN0T3JkZXJfZGVzY3JpcHRpb249U2VsZWNjaW9uZSB1biBlbGVtZW50byBkZSBjb21wcm9iYWNpXHUwMGYzbiB5IHB1bHNlIEFycmliYSBvIEFiYWpvIHBhcmEgY2FtYmlhciBlbCBvcmRlbi4NCi1FbGVtZW50c1ZpZXdfcmVuYW1pbmdfdGV4dD1SZW5vbWJyYW5kby4uLg0KLVByb2Nlc3NFZGl0b3JfTW9kZWxJbmZvPUluZm9ybWFjaVx1MDBmM24gZGVsIG1vZGVsbw0KLVByb2Nlc3NFZGl0b3JfUHJlZml4PVByZWZpam8NCi1Nb3ZlRGlhbG9nX21vdmVfdGV4dD1Nb3Zlcg0KLUNoZWNrbGlzdE9yZGVyX3RpdGxlPU9yZGVuYXIgZWxlbWVudG9zIGRlIGNvbXByb2JhY2lcdTAwZjNuDQotUHJvY2Vzc0VkaXRvcl9SZXBldGFibGU9U2UgcHVlZGUgcmVwZXRpcg0KLVByb2Nlc3NFZGl0b3JfT25nb2luZz1Db250aW51bw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N5bmNocm9uaXphdGlvbj1TaW5jcm9uaXphci4uLg0KLVByb2Nlc3NFZGl0b3JfRXZlbnREcml2ZW49Q29uZGljaW9uYWRvIHBvciBzdWNlc29zDQotUHJvY2Vzc0VkaXRvcl9EZWxpdmVyYWJsZT1Qcm9kdWN0byBmaW5hbA0KLVByb2Nlc3NFZGl0b3JfT3B0aW9uYWw9T3BjaW9uYWwNCi1GaWx0ZXJEaWFsb2dfVHlwZV90ZXh0PVRpcG8gZGUgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG86DQotRmlsdGVyRGlhbG9nX0V4cGFuZEFsbD1FeHBhbmRpciB0b2RvDQotTW92ZURpYWxvZ19tb3ZpbmdfdGV4dD1Nb3ZpZW5kby4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbldhcm5pbmc9SVVQQTAwMjVXOiBFbCBpY29ubyBkZSBmb3JtYSBwYXJhIHswfSBubyBzZSBlbmN1ZW50cmEgZW4gbGEgdlx1MDBlZGEgZGUgYWNjZXNvOiB7MX0NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25FcnJvcj1JVVBBMDAyNUU6IEVycm9yOiBTZWNjaVx1MDBmM24gZGVsIGljb25vIGRlIGZvcm1hOiB7MH0NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX05hbWVMYWJlbD1Ob21icmU6DQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1DcmVhciB1bmEgY29uZmlndXJhY2lcdTAwZjNuIGRlbCBtXHUwMGU5dG9kbyBudWV2YQ0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9OYW1lTGFiZWw9Tm9tYnJlOg0KLUF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU9TnVldmEgY29uZmlndXJhY2lcdTAwZjNuIGRlbCBtXHUwMGU5dG9kbw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0xpYnJhcnlNYWluUGFnZV9wYWdlVGl0bGU9Q3JlYXIgdW5hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIG51ZXZhDQotbmV3TGlicmFyeVdpemFyZF90aXRsZT1OdWV2YSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcw0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlVGl0bGU9R3VhcmRhciBjYW1iaW9zDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1Fc3BlY2lmaXF1ZSB1biBub21icmUsIHVuYSBkZXNjcmlwY2lcdTAwZjNuIHkgdW4gZGlyZWN0b3JpbyBkZSBkZXN0aW5vIHBhcmEgbGEgbnVldmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVEZXNjcmlwdGlvbj1TZSBoYW4gbW9kaWZpY2FkbyB1bm8gbyB2YXJpb3MgZWxlbWVudG9zIGRlIG1cdTAwZTl0b2RvLiBTZWxlY2Npb25lIGxvcyBxdWUgZGVzZWUgZ3VhcmRhci4NCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1BYnJpciBjb25maWd1cmFjaW9uZXMgZGVsIG1cdTAwZTl0b2RvDQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25XaXphcmRfd2luZG93VGl0bGU9QWJyaXIgY29uZmlndXJhY2lvbmVzIGRlbCBtXHUwMGU5dG9kbw0KLUVsZW1lbnRzVmlld19yZXBsYWNlaW5nd2l0aGZvcm1hdF90ZXh0PVJlZW1wbGF6YW5kbyB7MH0uLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmc9SVVQQTAwMjZXOiBFbCBpY29ubyBkZSBub2RvIHBhcmEgezB9IG5vIHNlIGVuY3VlbnRyYSBlbiBsYSB2XHUwMGVkYSBkZSBhY2Nlc286IHsxfQ0KLU1lc3NhZ2VMYWJlbFByb3ZpZGVyX3Vuc2VsZWN0ZWRwYWNrYWdlcz0nJ3swfScnIGNvbnRpZW5lIGVsZW1lbnRvcyBxdWUgaGFjZW4gcmVmZXJlbmNpYSBhIGVsZW1lbnRvcyBkZSBwYXF1ZXRlcyBubyBzZWxlY2Npb25hZG9zDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25FcnJvcj1JVVBBMDAyNkU6IEVycm9yOiBTZWNjaVx1MDBmM24gZGVsIGljb25vIGRlIG5vZG86IHswfQ0KLVN0ZXBzT3JkZXJEaWFsb2dfc3RlcHM9UGFzb3M6IA0KLVN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU9T3JkZW5hciBwYXNvcyBkZSBsYSB0YXJlYQ0KLVByb2Nlc3NFZGl0b3JfUGxhbm5lZD1QbGFuZWFkbw0KLXNwZWNpZnlkaXJlY3RvcnlfdGV4dD1Fc3BlY2lmaXF1ZSB1biBkaXJlY3RvcmlvIHBhcmEgZ3VhcmRhciBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBlbg0KLVByb2Nlc3NFZGl0b3JfTXVsdGlwbGVPY2N1cnJlbmNlcz1WYXJpYXMgYXBhcmljaW9uZXMNCi1Qcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU9RXN0YWRvIGRlIGVudHJhZGENCi1Qcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZT1Fc3RhZG8gZGUgc2FsaWRhDQotc2VsZWN0Q29sdW1uc3RvQWRkX3RleHQ9U2VsZWNjaW9uZSBsYXMgY29sdW1uYXMgcXVlIGRlc2VlIGFcdTAwZjFhZGlyDQotUHJvY2Vzc0VkaXRvcl9UeXBlPVRpcG8NCi1Qcm9jZXNzRWRpdG9yX1RlYW09RXF1aXBvDQotRmlsdGVyRGlhbG9nX3RpdGxlPVNlbGVjY2lvbmFyIGRpXHUwMGUxbG9nbzogDQotDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkPUFcdTAwZjFhZGlyIGRlc2RlIGVsIGNvbnRlbmlkbyBkZWwgJm1cdTAwZTl0b2RvLi4uDQotRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsPUNvbnRyYWVyIHRvZG8NCi1PcGVuQ2hlYXRzaGVldFZpZXdfdGl0bGU9QWJyaXIgdmlzdGEgZGUgaG9qYSBkZSBvcmllbnRhY2lcdTAwZjNuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwPUNvbnRyYWVyDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd249RXhwYW5kaXINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA9TSZvdmVyIGFycmliYQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVEb3duPU1vdmVyIGEmYmFqbw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbD1Nb3N0ciZhcg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvcHk9JkNvcGlhci4uLg0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ9UGF0cm9uZXMgZGUgbm9tYnJlIChzZSBtb3N0cmFyXHUwMGUxbiBsb3Mgbm9tYnJlcyBxdWUgY29pbmNpZGFuKTogDQotTWV0aG9kTGlicmFyeUVkaXRvcl90aXRsZT1CaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvczogDQotI01lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ9U2VsZWN0ZWQ6IA0KLU1lc3NhZ2VWaWV3X2Vycm1zZ190ZXh0PURlc2NyaXBjaVx1MDBmM24NCi1FbGVtZW50c1ZpZXdfZXJyX3NhdmluZz1JVVBBMDAyN0U6IFNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBndWFyZGFyICcnezB9Jyd7MX0NCi0NCi1lcnJfY29weWluZ19maWxlX3RpdGxlPVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBjb3BpYXIgZWwgYXJjaGl2bw0KLWVycl9jb3B5aW5nX2ZpbGVfZXJyb3I9SVVQQTAwMjhFOiBObyBzZSBoYSBwb2RpZG8gYXNpZ25hciBlbCBpY29uby4gDQotZXJyX2NvcHlpbmdfZmlsZV9yZWFzb249U2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGFsIGNvcGlhciBlbCBhcmNoaXZvIHNlbGVjY2lvbmFkby4gUHVsc2UgZW4gRGV0YWxsZXMgcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGluZm9ybWFjaVx1MDBmM24uDQotZXJyX3Byb2Nlc3NpbmdfZmlsZV90aXRsZT1TZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgcHJvY2VzYXIgZWwgYXJjaGl2bw0KLWVkaXRDb25maWd1cmF0aW9uX3Rvb2x0aXA9RWRpdGFyIGNvbmZpZ3VyYWNpXHUwMGYzbg0KLWVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdD1JVVBBMDAxNUU6IE5vIHNlIHB1ZWRlIGVkaXRhciBlbCBlbGVtZW50bw0KLVNhdmVUaGlzQWN0aW9uX3NhdmVvYmplY3Q9R3VhcmRhciBlc3RlIG9iamV0by4uLg0KLUVsZW1lbnRzVmlld19yZXBsYWNlX3RleHQ9UmVlbXBsYXphcg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0V4dGVuZD0mRXh0ZW5kZXIuLi4NCi1Nb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ9RXNjb2dlciBkZXN0aW5vIHBhcmEgbG9zIGVsZW1lbnRvcyBzZWxlY2Npb25hZG9zOg0KLWNob29zZURlZmF1bHREaXJlY3RvcnlfdGV4dD1Fc2NvZ2VyIHVuIGRpcmVjdG9yaW8gcG9yIG9taXNpXHUwMGYzbiBwYXJhIGxhcyBiaWJsaW90ZWNhczoNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzcz0mU3VwcmltaXINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczI9T3BjaW9uZXMgZGUgJnB1YmxpY2FjaVx1MDBmM24uLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbT1EaWFncmFtYXMgZGVmaW5pZG9zIHBvciBlbCAmdXN1YXJpby4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ190aXRsZT1Bc2lnbmFyIGRpYWdyYW1hcyBkZWZpbmlkb3MgcG9yIGVsIHVzdWFyaW8NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRJbWFnZT1EaWFncmFtYSBkZSBsYSBhY3RpdmlkYWQ6DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlPURpYWdyYW1hIGRlIGRldGFsbGUgZGUgbGEgYWN0aXZpZGFkOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1EaWFncmFtYSBkZSBkZXBlbmRlbmNpYSBkZWwgcHJvZHVjdG8gZGUgdHJhYmFqbzoNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfbm90YUZpbGU9SVVQQTAwMDRFOiBMYSB2XHUwMGVkYSBkZSBhY2Nlc28gZXNwZWNpZmljYWRhIG5vIGVzIHVuIGFyY2hpdm8uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2Fzc2lnbkJ1dHRvbj1TZWxlY2Npb25hci4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19lbnRlcmVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAyNEU6IExhIGltYWdlbiBlc3BlY2lmaWNhZGEgbm8gZXhpc3RlIGVuIGxhIGJpYmxpb3RlY2EuIEFzZWdcdTAwZmFyZXNlIGRlIHF1ZSBoYSBlbnRyYWRvIGxhIHZcdTAwZWRhIGRlIGFjY2VzbyByZWxhdGl2YSBhbCBkaXJlY3RvcmlvIHJhXHUwMGVkeiBkZSBsYSBiaWJsaW90ZWNhLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ9SVVQQTAwMzBFOiBMYSBpbWFnZW4gcXVlIGhhIHNlbGVjY2lvbmFkbyBubyBzZSBlbmN1ZW50cmEgZW4gbGEgYmlibGlvdGVjYS4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZT1VdGlsaXphciBsYSBpbWFnZW4gZGVsIGRpYWdyYW1hIGRlIGFjdGl2aWRhZCBwYXJhIGV4YW1pbmFyIHkgcHVibGljYXINCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURESW1hZ2U9VXRpbGl6YXIgbGEgaW1hZ2VuIGRlbCBkaWFncmFtYSBkZSBhY3RpdmlkYWQgZGUgZGVzZ2xvc2UgcGFyYSBleGFtaW5hciB5IHB1YmxpY2FyDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlPVV0aWxpemFyIGxhIGltYWdlbiBkZWwgZGlhZ3JhbWEgZGUgZGVwZW5kZW5jaWEgZGVsIHByb2R1Y3RvIGRlIHRyYWJham8gcGFyYSBleGFtaW5hciB5IHB1YmxpY2FyDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29udHJpYnV0ZT1Db250cmlidWNpXHUwMGYzbiBsb2NhbA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JlcGxhY2U9U3VzdGl0dWNpXHUwMGYzbiBsb2NhbA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0RpYWdyYW1zPURpYSZncmFtYXMNCi1Qcm9jZXNzRWRpdG9yX2FjdGlvbl9kZWVwQ29weT1Db3BpYSBlbiBwcm9mdW4mZGlkYWQuLi4NCi1GaWx0ZXJEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1EZXNjcmlwY2lcdTAwZjNuIGJyZXZlOg0KLUNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwPU1vc3RyYXIvT2N1bHRhciBlbGVtZW50b3MgZGVzYWN0aXZhZG9zDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb249RGVzY3JpcGNpXHUwMGYzbjoNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbD1ObyBwdWJsaWNhciBuYWRhDQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb249TG9zIHBhdHJvbmVzIHNlIHNlcGFyYW4gbWVkaWFudGUgY29tYXMsIGRvbmRlICo9Y3VhbHF1aWVyIGNhZGVuYSBkZSBjYXJhY3RlcmVzIHkgPz1jdWFscXVpZXIgY2FyXHUwMGUxY3Rlcg0KLUNvbmZpZ3VyYXRpb25QYWdlX1RyZWVUaXRsZUxhYmVsPUNvbnRlbmlkbzoNCi1Db25maWd1cmF0aW9uUGFnZV9Mb2FkaW5nTWVzc2FnZT1DYXJnYW5kbyBjb25maWd1cmFjaVx1MDBmM24sIGVzcGVyZS4uLg0KLU1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0PUVsIGRlc3Rpbm8gZGUgbW92aW1pZW50byBlc3BlY2lmaWNhZG8gbm8gZXMgdlx1MDBlMWxpZG8uDQotTW92ZURpYWxvZ19jYW5ub3RNb2RpZnlEZXN0aW5hdGlvbj1JVVBBMDAzNEU6IEVsIGRlc3Rpbm8gc2VsZWNjaW9uYWRvIG5vIHNlIHB1ZWRlIG1vZGlmaWNhci4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw9UHVibGljYXIgdG9kbw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5CYXNlQWN0aXZpdHk9QWJyaXIgYWN0aXZpZGFkIGJcdTAwZTFzaWNhDQotUHJvY2Vzc0Zvcm1FZGl0b3JfZXhwYW5BbGxBY3Rpb25MYWJlbD1FJnhwYW5kaXIgdG9kbw0KLVByb2Nlc3NGb3JtRWRpdG9yX2NvbGxhcHNlQWxsQWN0aW9uTGFiZWw9Q28mbGFwc2FyIHRvZG8NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtPUFicmlyIGRpYWdyYW1hIGRlIGxhICZhY3RpdmlkYWQNCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlUmV2ZWFsPUxvcyBkZXNjcmlwdG9yZXMgbm8gZWxpbWluYWRvcyBxdWUgc2UgbGlzdGFuIGVuIERldGFsbGVzIGRlYmVuIHN1cHJpbWlyc2UgcGFyYSBldml0YXIgbGEgZHVwbGljYWNpXHUwMGYzbiBkZXNwdVx1MDBlOXMgZGUgcmV2ZWxhciBsb3MgZWxlbWVudG9zIHNlbGVjY2lvbmFkb3MuIFB1bHNlIEFjZXB0YXIgc2kgZGVzZWEgc3VwcmltaXJsb3MgeSBjb250aW51YXIuDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX1NlbGVjdENvbHVtbnM9U2VsZWNjaW9uZSBsYXMgY29sdW1uYXMgcXVlIGRlc2VlIGFcdTAwZjFhZGlyDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT1BYnJpciBkaWFncmFtYSBkZSAmZGV0YWxsZXMgZGUgbGEgYWN0aXZpZGFkDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX0NvbHVtblNlbGVjdGlvbj1TZWxlY2NpXHUwMGYzbiBkZSBjb2x1bW5hczoNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3dpdGNoQ29uZmlndXJhdGlvbj1WYXlhIGEgbGEgY29uZmlndXJhY2lcdTAwZjNuIHBvciBvbWlzaVx1MDBmM24gZGVsIHByb2Nlc28gY3VhbmRvIGFjdGl2ZSB1biBlZGl0b3IgZGUgcHJvY2Vzbw0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zdXBwcmVzc2lvbkdyb3VwVGl0bGU9U3VwcmVzaVx1MDBmM24NCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGU9SGVyZWRhciBlc3RhZG9zIGRlIHN1cHJlc2lcdTAwZjNuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW09QWJyaXIgZGlhZ3JhbWEgZGUgZGVwZW5kZW5jaWEgZGVsIHByb2R1Y3RvIGRlICZ0cmFiYWpvDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9Qm9ycmFyDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9U2VsZWNjaW9uYXIuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9JbnNlcnROZXdQaGFzZT1JbnNlcnRhciBmYXNlIG51ZXZhDQotVmlld0hlbHBlcl9yZWxvYWRMaWJPblJvbGxiYWNrRXJyb3I9Tm8gc2UgaGEgcG9kaWRvIHJlY3VwZXJhciBkZSB1biBlcnJvciBkZSBwZXJtYW5lbmNpYS4gRGViZSB2b2x2ZXIgYSBjYXJnYXIgbGEgYmlibGlvdGVjYSBwYXJhIHJlc3RhdXJhciBzdSBlc3RhZG8gb3JpZ2luYWwuDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZF90ZXh0PUVsIGVsZW1lbnRvICcnezB9JycgeWEgc2UgaGEgc3VwcmltaWRvLg0KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQ9RWwgZWxlbWVudG8gJyd7MH0nJyB5YSBzZSBoYSBzdXByaW1pZG8uIFx1MDBiZkRlc2VhIGVsaW1pbmFybG8gZGUgJyd7MX0nJz8NCi1Db25maWd1cmF0aW9uUGFnZV9BZGRNaXNzaW5nVG9vbFRpcD1BXHUwMGYxYWRpciByZWZlcmVuY2lhcyBhdXNlbnRlcw0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uPURlc2NyaXBjaVx1MDBmM24NCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25HZW5lcmFsSW5mbz1JbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPUFwbGljYXIgcGEmdHJcdTAwZjNuDQotTW92ZURpYWxvZ19zZWxlY3RkZXN0aW5hdGlvbl90ZXh0PVNlbGVjY2lvbmUgdW4gZGVzdGluby4NCi1Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1ObyBzZSBoYSBlc3BlY2lmaWNhZG8gbmluZ1x1MDBmYW4gZGVzdGlubyBkZSBtb3ZpbWllbnRvLg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdD0uIE9iamV0byBwcm9ibGVtXHUwMGUxdGljbzogDQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfZXJyY2hpbGRwa2dzPVVuIHByb2Nlc28gbyBwYXF1ZXRlIGRlIGNvbnRlbmlkbyBoaWpvIGNvbnRpZW5lIGVsZW1lbnRvcyBjb24gcmVmZXJlbmNpYXMgYXVzZW50ZXMNCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX1RpdGxlPU9wY2lvbmVzIGRlIHB1YmxpY2FjaVx1MDBmM24gZGVsIGRpYWdyYW1hDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlPVNlbGVjY2lvbmUgZWwgZGlhZ3JhbWFzIHF1ZSBkZXNlZSBwdWJsaWNhciBvIGFudWxlIGxhIHNlbGVjY2lcdTAwZjNuIHBhcmEgbm8gcHVibGljYXJsbw0KLVByb2Nlc3NFZGl0b3JfVGl0bGU9RWRpdG9yIGRlIHByb2Nlc29zOiANCi1TYXZlQXN3aXRoZG90c190ZXh0PUd1YXJkYXIgY29tby4uLg0KLVByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZT1Fc3RydWN0dXJhIGRlIGRlc2dsb3NlIGRlIHRyYWJham8NCi1Qcm9jZXNzRWRpdG9yX1RlYW1BbGxvY2F0aW9uPUFzaWduYWNpXHUwMGYzbiBkZSBlcXVpcG9zDQotUHJvY2Vzc0VkaXRvcl9Xb3JrUHJvZHVjdFVzYWdlPVV0aWxpemFjaVx1MDBmM24gZGVsIHByb2R1Y3RvIGRlIHRyYWJham8NCi1Qcm9jZXNzRWRpdG9yX0NvbnNvbGlkYXRlZFZpZXc9VmlzdGEgY29uc29saWRhZGENCi1Qcm9jZXNzRWRpdG9yX2NvbmZpcm1BdXRvU3luY2g9RXN0YSBvcGVyYWNpXHUwMGYzbiByZW51ZXZhIGxvcyBkZXNjcmlwdG9yZXMgc2VsZWNjaW9uYWRvcyBvIHRvZG9zIGxvcyBkZXNjcmlwdG9yZXMgcG9yIGRlYmFqbyBkZSBsYXMgYWN0aXZpZGFkZXMgc2VsZWNjaW9uYWRhcyBxdWUgc2UgaGFuIG1hcmNhZG8gY29tbyAiU2luY3Jvbml6YWRvIGNvbiBlbCBvcmlnZW4iIGVuIGxhIHBlc3RhXHUwMGYxYSBHZW5lcmFsIGRlIGxhIHZpc3RhIGRlIHByb3BpZWRhZGVzLiAgUmVudWV2YSBsb3MgZGVzY3JpcHRvcmVzIGNvbiBsYXMgcHJvcGllZGFkZXMgb3JpZ2luYWxlcyBkZSBsb3MgZWxlbWVudG9zIGRlIGNvbnRlbmlkbyBkZWwgbVx1MDBlOXRvZG8gZW5sYXphZG8gZGViYWpvIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBwb3Igb21pc2lcdTAwZjNuIGRlbCBwcm9jZXNvLiAgVGVuZ2EgZW4gY3VlbnRhIHF1ZSBlc3RvIG5vIGFjdHVhbGl6YXJcdTAwZTEgbmluZ1x1MDBmYW4gZGVzY3JpcHRvciBlbmxhemFkbyBkZSBmb3JtYSBkaW5cdTAwZTFtaWNhIChjdXJzaXZhIHZlcmRlKS4gIFx1MDBiZkRlc2VhIGNvbnRpbnVhcj8NCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE9Q29uZmlndXJhY2lcdTAwZjNuDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yPVNlbGVjY2lcdTAwZjNuIGRlIHBhcXVldGUgeSBwbHVnLWluDQotTmV3TGlicmFyeURpYWxvZ19uZXdsaWJyYXJ5X2FzPUNyZWFyIG51ZXZhIGJpYmxpb3RlY2EgY29tbw0KLU5ld1BsdWdpbkRpYWxvZ19uZXdwbHVnaW5fdGV4dD1OdWV2byBwbHVnLWluIGRlIG1cdTAwZTl0b2RvDQotU2VsZWN0RWxlbWVudERpYWxvZ190aXRsZV90ZXh0PVNlbGVjY2lvbmFyIGVsIGVsZW1lbnRvIG8gdW5vIGRlIHN1cyBjb2xhYm9yYWRvcmVzOg0KLU9wZW5Db25maWdEaWFsb2duZXdjb25maWdfdGV4dD1OdWV2YSBjb25maWd1cmFjaVx1MDBmM246DQotcHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlX0JTRWRpdG9yPUVkaXRvciBkZSBwcm9jZXNvcw0KLQ0KLSMgQWJzdHJhY3REaWFncmFtRWRpdG9yDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0PUFsaW5lYXINCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1SZW5vdmFyIGRlc2RlIGFjdGl2aWRhZCBiXHUwMGUxc2ljYQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dD1Gb3JtYXRlYXIgcmVjdWFkcm8gZGUgdGV4dG8uLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PUhvcml6b250YWxtZW50ZSBoYXN0YSBlbCBwcm9tZWRpbw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9SG9yaXpvbnRhbG1lbnRlIGhhc3RhIGxhIHByaW1lcmEgc2VsZWNjaVx1MDBmM24NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVZlcnRpY2FsbWVudGUgaGFzdGEgZWwgcHJvbWVkaW8NCi1NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX3RpdGxlPUluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbA0KLU1vdmVEaWFsb2dfaW52YWxpZF9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnPUlVUEEwMDQxRTogRWwgZWxlbWVudG8gc2VsZWNjaW9uYWRvIG5vIHNlIHB1ZWRlIG1vdmVyIGFsIGRlc3Rpbm8gZXNwZWNpZmljYWRvLg0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeT1HdWFyZGFuZG8gYmlibGlvdGVjYSBkZSBtb2RlbG8uLi4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX2Vycm9yX2RpYWxvZ190aXRsZT1FcnJvcg0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZV9saWJyYXJ5X3Byb2JsZW1fbXNnPUlVUEEwMDMzRTogU2UgaGEgcHJvZHVjaWRvIHVuIHByb2JsZW1hIGFsIGd1YXJkYXIgbGEgYmlibGlvdGVjYS4NCi1NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dD1cdTAwYmZFc3RcdTAwZTEgc2VndXJvIGRlIHF1ZSBkZXNlYSBzdXByaW1pciAnJ3swfScnPw0KLUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX0NvbnRlbnRFbGVtZW50X3RleHQ9RWxlbWVudG9zIGRlIGNvbnRlbmlkbzogDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Ccm93c2VCdXR0b25MYWJlbD1FeGFtaW5hci4uLg0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249RXNwZWNpZmlxdWUgdW4gbm9tYnJlIHkgdW5hIGRlc2NyaXBjaVx1MDBmM24gcGFyYSBsYSBudWV2YSBjb25maWd1cmFjaVx1MDBmM24gZGVsIG1cdTAwZTl0b2RvLg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU9R3VhcmRhciBsb3MgY2FtYmlvcyB5IGNlcnJhciB0b2RvcyBsb3MgZWRpdG9yZXMNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVZlcnRpY2FsbWVudGUgaGFzdGEgbGEgcHJpbWVyYSBzZWxlY2NpXHUwMGYzbg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9R3VhcmRhcg0KLUF0dGFjaG1lbnREaWFsb2dhdHRhY2hGaWxlX3RleHQ9QWRqdW50YXIgYXJjaGl2bw0KLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ9Q29udGVuaWRvIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbg0KLU9wZW5Db25maWdEaWFsb2dvcGVuY29uZmlnX3RleHQ9QWJyaXIgY29uZmlndXJhY2lcdTAwZjNuDQotRWxlbWVudHNWaWV3X3JlcGxhY2VBY3Rpb25fdGV4dD1SZWVtcGxhemFyLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZT1HdWFyZGFuZG8gezB9DQotQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcD1Nb3N0cmFyIHZpc29yIGRlIHJlZ2lzdHJvcyBkZSBhdmlzb3MgZGUgY29uZmlndXJhY2lcdTAwZjNuDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeD1Db25maWd1cmFjaVx1MDBmM246IA0KLUNoZWNrbGlzdE9yZGVyX2NoZWNrbGlzdGl0ZW1zX3RleHQ9RWxlbWVudG9zIGRlIGNvbXByb2JhY2lcdTAwZjNuOiANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9TW92ZXIgbm9kbw0KLUNvbmZpZ3VyYXRpb25QYWdlX01ha2VDbG9zdXJlVG9vbFRpcD1FZmVjdFx1MDBmYWUgZWwgY2llcnJlIGFycmVnbGFuZG8gbG9zIGVycm9yZXMNCi1OZXdQbHVnaW5EaWFsb2dfcmVmZXJlbmNlcGx1Z2luX3RleHQ9UGx1Zy1pbnMgZGUgcmVmZXJlbmNpYToNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfY3JlYXRlRnJlZVRleHRfdGV4dD1DcmVhciB1biB0ZXh0byBsaWJyZQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0xhYmVsPVZpc3RhIHByZWxpbWluYXIgZGVsIGljb25vIGRlIG5vZG86DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ9SVVQQTAwMzJXOiBObyBzZSBwdWVkZSBjb25lY3Rhcg0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0PUlVUEEwMDMzVzogTm8gcHVlZGUgdGVuZXIgZWwgbWlzbW8gZWxlbWVudG8gZGUgZGVzZ2xvc2UgcXVlIGVsIHByZWRlY2Vzb3IgbyBlbCBzdWNlc29yDQotDQotIyBFZGl0b3JDaG9vc2VyDQotRWRpdG9yQ2hvb3Nlcl9sb2FkZEVycm9yRGxnVGl0bGU9QWJyaXIgZWRpdG9yDQotRWRpdG9yQ2hvb3Nlcl9SZXNvdXJjZXNFcnJvcj1Fc3RlIGVsZW1lbnRvIHRpZW5lIGVycm9yZXMuIEVzIHJlY29tZW5kYWJsZSBhcnJlZ2xhciBlc3RvcyBlcnJvcmVzIGFudGVzIGRlIGNvbnRpbnVhciAoY29uc3VsdGUgbG9zIGRldGFsbGVzKS5cblwNCi1cblwNCi1QdWxzZSBBY2VwdGFyIHBhcmEgY29udGludWFyIHNpbiBhYnJpciBlbCBlZGl0b3IuIENpZXJyZSBlc3RlIGRpXHUwMGUxbG9nbyBwYXJhIGFicmlyIGVsIGVkaXRvci4NCi1Db25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4PUNvbmZpZ3VyYWNpXHUwMGYzbjogDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZT1Ob21icmU6DQotQXR0YWNobWVudERpYWxvZ0ZpbGVVUkxfdGV4dD1VUkwgZGVsIGFyY2hpdm86DQotU3RlcHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbj1TZWxlY2Npb25lIHVuIHBhc28geSBwdWxzZSBBcnJpYmEgbyBBYmFqbyBwYXJhIGNhbWJpYXIgZWwgb3JkZW4uDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZT1TZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgZ3VhcmRhcg0KLU1lc3NhZ2VWaWV3X2VycmVsZW1lbnRfdGV4dD1FbGVtZW50byBkZSByZWZlcmVuY2lhDQotTWVzc2FnZVZpZXdfcmVmZWxlbWVudF90ZXh0PUVsZW1lbnRvIGNvbiByZWZlcmVuY2lhcw0KLQ0KLSNBY3Rpdml0eSBEaWFncmFtDQotQWN0aXZpdHlEaWFncmFtRWRpdG9yX2NyZWF0ZVN0YXJ0Tm9kZV90ZXh0PUNyZWFyIHVuIG5vZG8gZGUgaW5pY2lvDQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudERlc2NyaXB0aW9uPVNlbGVjY2lvbmUgbG9zIHBsdWctaW5zIGRlIG1cdTAwZTl0b2RvLCBsb3MgcHJvY2Vzb3MgeSBsb3MgcGFxdWV0ZXMgZGUgY29udGVuaWRvIHF1ZSBzZSBpbmNsdWlyXHUwMGUxbiBlbiBlc3RhIGNvbmZpZ3VyYWNpXHUwMGYzbi4NCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbl90ZXh0PURpXHUwMGUxbG9nbyBkZSBvcmRlbiBkZSBlbGVtZW50b3MgZGUgY29udGVuaWRvIGRlIGxhIGNhdGVnb3JcdTAwZWRhIHBlcnNvbmFsaXphZGENCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsPURpcmVjdG9yaW86DQotUm9vdFByZWZQYWdlX2VuYWJsZXByb2Nlc3Njb250cmlidXRpb25fdGV4dD1IYWJpbGl0YXIgY29udHJpYnVjaVx1MDBmM24gYWwgcHJvY2Vzbw0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uX3RleHQ9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZWwgbVx1MDBlOXRvZG8uDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlwY2lcdTAwZjNuOg0KLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9RXNjb2dpZW5kbyBjb2xhYm9yYWRvcmVzIHBhcmEgJyd7MH0nJw0KLUVsZW1lbnRzVmlld19vcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb25fdGV4dD1BYnJpciBhIHRyYXZcdTAwZTlzIGRlIGxvcyBlbGVtZW50b3MgZGUgdmFyaWFiaWxpZGFkDQotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3RpdGxlPXNlbGVjY2lvbmFuZG8gZWxlbWVudG9zIGRlIHZhcmlhYmlsaWRhZCBwYXJhICcnezB9JycNCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdmlld2VyTGFiZWw9RWxlbWVudG9zIGRlIHZhcmlhYmlsaWRhZCBwYXJhICcnezB9JycNCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfTGFiZWw9VmlzdGEgcHJlbGltaW5hciBkZWwgaWNvbm8gZGUgZm9ybWE6DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dD1ObyBzZSBwdWVkZSBzdXByaW1pcg0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9QWJyaXIgZGlhZ3JhbWEgZGUgZGV0YWxsZXMgZGUgbGEgYWN0aXZpZGFkIA0KLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fZGVzY3JpcHRpb249UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9Qm9ycmFyDQotV1BDb21wYXJ0bWVudEZpZ3VyZV8wPU51ZXZvIGRlc2NyaXB0b3IgZGUgcHJvZHVjdG9zIGRlIHRyYWJham8NCi1wcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0PVB1YmxpY2FyIG8gZXhhbWluYXIgZGlhZ3JhbWFzIGRlIGRldGFsbGVzIGRlIGxhIGFjdGl2aWRhZCBxdWUgbm8gc2UgaGF5YW4gY3JlYWRvIGVuIGVsIGVkaXRvciBkZSBwcm9jZXNvcw0KLXByb21wdF9mb3JfcHVibGlzaF9leHRlbmRfYWN0aXZpdHlfZGlhZ3JhbT1QdWJsaWNhciB5IGV4YW1pbmFyIGRpYWdyYW1hcyBkZSBhY3RpdmlkYWQgcGFyYSBleHRlbnNpb25lcyBkZSBhY3RpdmlkYWQgbm8gbW9kaWZpY2FkYXMNCi0NCi0jQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2cNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19OYW1lUGF0dGVybj1QYXRyb25lcyBkZSBub21icmUgKHNlIG1vc3RyYXJcdTAwZTFuIGxvcyBub21icmVzIHF1ZSBjb2luY2lkYW4pOg0KLXNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uX2xhYmVsPU1vc3RyYXIgZW4gZWwgbmF2ZWdhZG9yIGRlIHJlY3Vyc29zDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfUGF0dGVybj1Mb3MgcGF0cm9uZXMgc2Ugc2VwYXJhbiBtZWRpYW50ZSBjb21hcywgZG9uZGUgKj1jdWFscXVpZXIgY2FkZW5hIGRlIGNhcmFjdGVyZXMgeSA/PWN1YWxxdWllciBjYXJcdTAwZTFjdGVyDQotZXJyX3Byb2Nlc3NpbmdfZmlsZV9kZXNjcmlwdGlvbj1JVVBBMDAyOUU6IFNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBwcm9jZXNhciBlbCBhcmNoaXZvIHNlbGVjY2lvbmFkby4gUHVsc2UgZW4gRGV0YWxsZXMgcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGluZm9ybWFjaVx1MDBmM24uDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQ2F0ZWdvcnlUeXBlPVRpcG8gZGUgY2F0ZWdvclx1MDBlZGE6DQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1EZXNjcmlwY2lcdTAwZjNuIGJyZXZlOg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXM9U2VsZWNjaW9uYXIgY2F0ZWdvclx1MDBlZGFzDQotDQotI2xvZyBtZXNzYWdlcw0KLWNoZWF0c2hlZXRfbG9hZF9mYWlsdXJlX2xvZ19tc2c9Tm8gc2UgaGEgcG9kaWRvIGFicmlyIGxhIGhvamEgZGUgb3JpZW50YWNpXHUwMGYzbiBzb2xpY2l0YWRhOiANCi0NCi1uZXdDb25maWd1cmF0aW9uV2lyYXpkX2NyZWF0ZUVycm9yPUlVUEEwMDM1RTogTm8gc2UgaGEgcG9kaWRvIGNyZWFyIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBzYXRpc2ZhY3RvcmlhbWVudGUNCi1uZXdQbHVnaW5XaXphcmRfY3JlYXRlRXJyb3I9SVVQQTAwMzZFOiBObyBzZSBwdWVkZSBjcmVhciBlbCBwbHVnLWluIHNhdGlzZmFjdG9yaWFtZW50ZQ0KLWVycm9yRGlhbG9nX21vdmVFcnJvcj1JVVBBMDAzN0U6IE5vIHNlIHB1ZWRlIG1vdmVyIGVsIGVsZW1lbnRvIHNhdGlzZmFjdG9yaWFtZW50ZQ0KLXJlbmFtZURpYWxvZ19yZW5hbWVFcnJvcj1JVVBBMDAzOEU6IE5vIHNlIHB1ZWRlIHJlbm9tYnJhciBlbCBlbGVtZW50byBzYXRpc2ZhY3RvcmlhbWVudGUNCi1lcnJvckRpYWxvZ19jcmVhdGVFcnJvcj1JVVBBMDAzOUU6IE5vIHNlIHB1ZWRlIGNyZWFyIGVsIGVsZW1lbnRvIHNhdGlzZmFjdG9yaWFtZW50ZQ0KLWR1cGxpY2F0ZVBsdWdpbk5hbWVFcnJvcl9tc2c9SVVQQTAxMDFFOiBFbCBub21icmUgJyd7MH0nJyB5YSBleGlzdGUuIEVzY3JpYmEgdW4gbm9tYnJlIGRpZmVyZW50ZSB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotDQotI05ldyBTdHJpbmdzIGZvciBQcm9jZXNzRWRpdG9yIENvbnRleHQgbWVudSBkaWFncmFtIGltYWdlcw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFESW1hZ2U9QXNpZ25hciBpbWFnZW4gQUQuLi4NCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlPVJlbm92YXIgZXJyb3INCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZz1FcnJvciBhbCByZW5vdmFyIGVsIGVkaXRvcg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlPUFzaWduYXIgaW1hZ2VuIEFERC4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZFdQREltYWdlPUFzaWduYXIgaW1hZ2VuIFdQRC4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFESW1hZ2VJblB1Ymxpc2hpbmc9VXRpbGl6YXIgaW1hZ2VuIEFEIGFsIHB1YmxpY2FyDQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzPUxvcyBkZXNjcmlwdG9yZXMgZWxpbWluYWRvcyBxdWUgc2UgbGlzdGFuIGVuIERldGFsbGVzIGRlYmVuIHN1cHJpbWlyc2UgcGFyYSBldml0YXIgbGEgZHVwbGljYWNpXHUwMGYzbiBkZXNwdVx1MDBlOXMgZGUgc3VwcmltaXIgbG9zIGVsZW1lbnRvcyBzZWxlY2Npb25hZG9zLiBQdWxzZSBBY2VwdGFyIHNpIGRlc2VhIHN1cHJpbWlybG9zIHkgY29udGludWFyLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFEREltYWdlSW5QdWJsaXNoaW5nPVV0aWxpemFyIGltYWdlbiBBREQgYWwgcHVibGljYXINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VXUERJbWFnZUluUHVibGlzaGluZz1VdGlsaXphciBpbWFnZW4gV1BEIGFsIHB1YmxpY2FyDQotUHJvY2Vzc0VkaXRvcl9EaWFncmFtSW1hZ2VfSW5wdXREaWFsb2dfaW5pdGlhbFZhbHVlPVZcdTAwZWRhIGRlIGFjY2VzbyBhIGxhIGltYWdlbg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1Nob3dMaW5rZWRFbGVtZW50aW5MaWJyYXJ5Vmlldz1Nb3N0cmFyIGVsZW1lbnRvIGVuJmxhemFkbyBlbiBsYSB2aXN0YSBkZSBiaWJsaW90ZWNhDQotUHJvY2Vzc0VkaXRvcl91cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uX2xhYmVsPUFjdHVhbGl6YXIgbGEgc3VwcmVzaVx1MDBmM24gZGVzZGUgbGEgJmJhc2UNCi1Qcm9jZXNzRWRpdG9yX0NvbnRleHRNZW51X0RpYWdyYW1JbWFnZXM9SW1cdTAwZTFnZW5lcyBkZSBkaWFncmFtYQ0KLQ0KLSNTdHJpbmdzIGZvciBzeW5jaHJvbml6YXRpb24gd2l6YXJkIG9uIHByb2Nlc3MgZWRpdG9yJ3MgQlMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlPURlc2NyaXBjaVx1MDBmM24gZGUgc2luY3Jvbml6YWNpXHUwMGYzbg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfdGV4dD1MZWEgbGEgaW5mb3JtYWNpXHUwMGYzbiBzaWd1aWVudGUgcXVlIGV4cGxpY2EgcXVcdTAwZTkgc2luY3Jvbml6YWNpXHUwMGYzbiBwZXJzb25hbGl6YWRhIHNlIGVmZWN0dWFyXHUwMGUxLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlPVNlbGVjY2lvbmFyIGNvbmZpZ3VyYWNpXHUwMGYzbg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ9U2VsZWNjaW9uZSBsYSBjb25maWd1cmFjaVx1MDBmM24gcXVlIGRlc2VhIHV0aWxpemFyIHBhcmEgbGEgc2luY3Jvbml6YWNpXHUwMGYzbi4gIFwNCi1MYSBzZWxlY2NpXHUwMGYzbiBkZXRlcm1pbmEgcXVcdTAwZTkgY29udHJpYnVjaW9uZXMgeSByZWVtcGxhem9zIHNlIHV0aWxpemFyXHUwMGUxbiBwYXJhIGxhIHNpbmNyb25pemFjaVx1MDBmM24uDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWw9Q29uZmlndXJhY2lcdTAwZjNuOg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90aXRsZT1TZWxlY2Npb25hciBwcm9waWVkYWRlcyBwYXJhIHNpbmNyb25pemFyDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Byb3BlcnRpZXNfbGFibGU9UHJvcGllZGFkZXMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbmFtZV9sYWJsZT1Ob21icmUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJlc2VudGF0aW9uTmFtZV9sYWJsZT1Ob21icmUgZGUgcHJlc2VudGFjaVx1MDBmM24NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYnJpZWZEZXNjX2xhYmxlPURlc2NyaXBjaVx1MDBmM24gYnJldmUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3B0aW9uYWxJbm91dHNfbGFiZWw9RW50cmFkYXMgb3BjaW9uYWxlcw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9tYW5kYXRvcnlJbnB1dHNfbGFibGU9RW50cmFkYXMgb2JsaWdhdG9yaWFzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX291dHB1dHNfbGFiZWw9U2FsaWRhcw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX2xhYmVsPVJlYWxpemFkb3IgcHJpbmNpcGFsDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2FkZG5QZXJmb3JtZXJzX2xhYmxlPU90cmFzIGFjdGl2aWRhZGVzIGFkaWNpb25hbGVzIHF1ZSByZWFsaXphDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGU9Um9sZXMgcmVzcG9uc2FibGVzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2NvbnRuQXJ0aWZhY3RzX2xhYmVsPUFydGVmYWN0b3MgY29udGVuaWRvcw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbD1Db21wb25lbnRlcyBkZSBwcm9kdWN0byBmaW5hbA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxTdGVwc19sYWJlbD1TZWxlY2NpXHUwMGYzbiBkZSBwYXNvcw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90ZXh0PVNlbGVjY2lvbmUgbGFzIHByb3BpZWRhZGVzIGRlbCBjb250ZW5pZG8gZGUgbVx1MDBlOXRvZG8gcXVlIGRlc2VhIHF1ZSBzZSB0ZW5nYSBlbiBjdWVudGEgcGFyYSBsYSBzaW5jcm9uaXphY2lcdTAwZjNuLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90aXRsZT1WaXN0YSBwcmVsaW1pbmFyIGRlIGxhIHNpbmNyb25pemFjaVx1MDBmM24NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGV4dD1SZXZpc2UgbG9zIGRldGFsbGVzIGRlIGxhIHNpbmNyb25pemFjaVx1MDBmM24gcHJvcHVlc3RhIGEgY29udGludWFjaVx1MDBmM24uDQotc2VsZWN0RWRpdG9yc1RvRGlzY2FyZENvbmZsaWN0Q2hhbmdlcz1IYXkgY2FtYmlvcyBzaW4gZ3VhcmRhciBxdWUgZW50cmFuIGVuIGNvbmZsaWN0byBjb24gbG9zIGNhbWJpb3MgcmVhbGl6YWRvcyBmdWVyYSBkZSBsb3MgZWRpdG9yZXMuIFxuXA0KLVNlbGVjY2lvbmUgbG9zIGVkaXRvcmVzIGVuIGxvcyBxdWUgZGVzZWEgZGVzY2FydGFyIGxvcyBjYW1iaW9zLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF90aXRsZV90ZXh0PUFzaXN0ZW50ZSBkZSBzaW5jcm9uaXphY2lcdTAwZjNuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dD1Fc3RlIGFzaXN0ZW50ZSBkYSBzb3BvcnRlIGEgbGEgcmVub3ZhY2lcdTAwZjNuIGRlIGxvcyBkZXNjcmlwdG9yZXMgc2VsZWNjaW9uYWRvcyBvIHRvZG9zIGxvcyBkZXNjcmlwdG9yZXMgcG9yIGRlYmFqbyBkZSBsYXMgYWN0aXZpZGFkZXMgc2VsZWNjaW9uYWRhcyBxdWUgc2UgaGFuIG1hcmNhZG8gY29tbyAiU2luY3Jvbml6YWRvIGNvbiBlbCBvcmlnZW4iIGVuIGxhIHBlc3RhXHUwMGYxYSBHZW5lcmFsIGRlIGxhIHZpc3RhIGRlIHByb3BpZWRhZGVzLiAgXA0KLVNcdTAwZjNsbyBsYXMgcHJvcGllZGFkZXMgcXVlIHNlbGVjY2lvbmUgZW4gZXN0ZSBhc2lzdGVudGUgc2UgcmVudWV2YW4gZW4gbG9zIGRlc2NyaXB0b3Jlcy4gIFwNCi1UYW1iaVx1MDBlOW4gcHVlZGUgc2VsZWNjaW9uYXIgY3VhbHF1aWVyIGNvbmZpZ3VyYWNpXHUwMGYzbiB2XHUwMGUxbGlkYSBwYXJhIHF1ZSBlbCBwcm9jZXNvIGxhIHV0aWxpY2UgYWwgY29tcHV0YXIgbGEgcmVub3ZhY2lcdTAwZjNuLiAgXA0KLVRlbmdhIGVuIGN1ZW50YSBxdWUgZWwgYXNpc3RlbnRlIG5vIGFjdHVhbGl6YXJcdTAwZTEgbmluZ1x1MDBmYW4gZGVzY3JpcHRvciBlbmxhemFkbyBkZSBmb3JtYSBkaW5cdTAwZTFtaWNhIChjdXJzaXZhIHZlcmRlKS4NCi0NCi1vcGVuUlRFPUFicmlyIGVsIGVkaXRvciBkZSB0ZXh0byBlbnJpcXVlY2lkbw0KLWNsb3NlUlRFPUNlcnJhciBlbCBlZGl0b3IgZGUgdGV4dG8gZW5yaXF1ZWNpZG8NCi0NCi0jTmV3IFN0cmluZ3MNCi1yb2xlc2V0c19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3Rpb25lIGxhcyBpbnN0cnVjY2lvbmVzIHF1ZSBwZXJ0ZW5lY2VuIGEgZXN0ZSBjb25qdW50byBkZSByb2xlcy4NCi1kaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3Rpb25lIGxhcyBpbnN0cnVjY2lvbmVzIHF1ZSBwZXJ0ZW5lY2VuIGEgZXN0YSBkaXNjaXBsaW5hLg0KLXdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aW9uZSBsYXMgaW5zdHJ1Y2Npb25lcyBxdWUgcGVydGVuZWNlbiBhIGVzdGEgY2xhc2UgZGUgcHJvZHVjdG8gZGUgdHJhYmFqby4NCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlvbmUgbGFzIGluc3RydWNjaW9uZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RlIGRvbWluaW8uDQotdG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aW9uZSBsYXMgaW5zdHJ1Y2Npb25lcyBxdWUgcGVydGVuZWNlbiBhIGVzdGEgaGVycmFtaWVudGEuDQotY3VzdG9tY2F0ZWdvcnlfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aW9uZSBsYXMgaW5zdHJ1Y2Npb25lcyBxdWUgcGVydGVuZWNlbiBhIGVzdGEgY2F0ZWdvclx1MDBlZGEgcGVyc29uYWxpemFkYS4NCi0NCi1jb25jZXB0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlvbmUgbGFzIGluc3RydWNjaW9uZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RlIGNvbmNlcHRvLg0KLWNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3Rpb25lIGxhcyBpbnN0cnVjY2lvbmVzIHF1ZSBwZXJ0ZW5lY2VuIGEgZXN0YSBsaXN0YSBkZSBjb21wcm9iYWNpXHUwMGYzbi4NCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlvbmUgbGFzIGluc3RydWNjaW9uZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RlIGVqZW1wbG8uDQotZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlvbmUgbGFzIGluc3RydWNjaW9uZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RhIGRpcmVjdHJpei4NCi1yb2FkbWFwX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlvbmUgbGFzIGluc3RydWNjaW9uZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RlIG1hcGEuDQotcmV1c2FibGVhc3NldF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3Rpb25lIGxhcyBpbnN0cnVjY2lvbmVzIHF1ZSBwZXJ0ZW5lY2VuIGEgZXN0ZSBhY3Rpdm8gcmV1dGlsaXphYmxlLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3Rpb25lIGxhcyBpbnN0cnVjY2lvbmVzIHF1ZSBwZXJ0ZW5lY2VuIGEgZXN0ZSBtYXRlcmlhbCBkZSBzb3BvcnRlLg0KLXJlcG9ydF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3Rpb25lIGxhcyBpbnN0cnVjY2lvbmVzIHF1ZSBwZXJ0ZW5lY2VuIGEgZXN0ZSBpbmZvcm1lLg0KLXByYWN0aWNlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlvbmUgbGFzIGluc3RydWNjaW9uZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RhIHByXHUwMGUxY3RpY2EuDQotdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aW9uZSBsYXMgaW5zdHJ1Y2Npb25lcyBxdWUgcGVydGVuZWNlbiBhIGVzdGEgcGxhbnRpbGxhLg0KLXRlcm1kZWZpbml0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlvbmUgbGFzIGluc3RydWNjaW9uZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RhIGRlZmluaWNpXHUwMGYzbi4NCi10b29sbWVudG9yX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlvbmUgbGFzIGluc3RydWNjaW9uZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RhIGhlcnJhbWllbnRhLg0KLXdoaXRlcGFwZXJfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aW9uZSBsYXMgaW5zdHJ1Y2Npb25lcyBxdWUgcGVydGVuZWNlbiBhIGVzdGEgZG9jdW1lbnRhY2lcdTAwZjNuIHRcdTAwZTljbmljYS4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3Rpb25lIGxhcyBpbnN0cnVjY2lvbmVzIHF1ZSBwZXJ0ZW5lY2VuIGEgZXN0YSBjb25zaWRlcmFjaVx1MDBmM24gZGUgY1x1MDBlMWxjdWxvLg0KLQ0KLQ0KLSNOZXcgU3RyaW5nIFNlY3Rpb24gRGVzY3JpcHRpb24NCi1yb2xlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0ZSByb2wuDQotcm9sZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGUgcm9sLg0KLXJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RlIHJvbCBjb24gb3Ryby4NCi1yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RlIHJvbC4NCi0NCi10YXNrX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0YSB0YXJlYS4NCi10YXNrX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0YSB0YXJlYS4NCi10YXNrX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0YSB0YXJlYSBjb24gb3RyYS4NCi10YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RhIHRhcmVhLg0KLQ0KLWFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0ZSBhcnRlZmFjdG8uDQotYXJ0aWZhY3RfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RlIGFydGVmYWN0by4NCi1hcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaWNlIGxvcyBpY29ub3MgcGFyYSBlc3RlIGFydGVmYWN0by4NCi1hcnRpZmFjdF9ub3RhdGlvblNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGVudHJlZ2EgYWNlcmNhIGRlIGVzdGUgYXJ0ZWZhY3RvLg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGFkYXB0YWNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0ZSBhcnRlZmFjdG8uDQotYXJ0aWZhY3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RlIGFydGVmYWN0byBjb24gb3Ryby4NCi1hcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0ZSBhcnRlZmFjdG8uDQotDQotb3V0Y29tZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGUgcmVzdWx0YWRvLg0KLW91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RlIHJlc3VsdGFkby4NCi1vdXRjb21lX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpY2UgbG9zIGljb25vcyBwYXJhIGVzdGUgcmVzdWx0YWRvLg0KLW91dGNvbWVfbm90YXRpb25TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBlbnRyZWdhIGFjZXJjYSBkZSBlc3RlIHJlc3VsdGFkby4NCi1vdXRjb21lX3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGFkYXB0YWNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0ZSByZXN1bHRhZG8uDQotb3V0Y29tZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjXHUwMGYzbW8gc2UgcmVsYWNpb25hIGVzdGUgcmVzdWx0YWRvIGNvbiBvdHJvLg0KLW91dGNvbWVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24gYWNlcmNhIGRlIGVzdGUgcmVzdWx0YWRvLg0KLQ0KLWRlbGl2ZXJhYmxlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0ZSBwcm9kdWN0byBmaW5hbC4NCi1kZWxpdmVyYWJsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGUgcHJvZHVjdG8gZmluYWwuDQotZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGljZSBsb3MgaWNvbm9zIHBhcmEgZXN0ZSBwcm9kdWN0byBmaW5hbC4NCi1kZWxpdmVyYWJsZV9ub3RhdGlvblNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGVudHJlZ2EgYWNlcmNhIGRlIGVzdGUgcHJvZHVjdG8gZmluYWwuDQotZGVsaXZlcmFibGVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgYWRhcHRhY2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RlIHByb2R1Y3RvIGZpbmFsLg0KLWRlbGl2ZXJhYmxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0ZSBwcm9kdWN0byBmaW5hbCBjb24gb3Ryby4NCi1kZWxpdmVyYWJsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0ZSBwcm9kdWN0byBmaW5hbC4NCi0NCi1kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0YSBkaXNjaXBsaW5hLg0KLWRpc2NpcGxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RhIGRpc2NpcGxpbmEuDQotZGlzY2lwbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjXHUwMGYzbW8gc2UgcmVsYWNpb25hIGVzdGEgZGlzY2lwbGluYSBjb24gb3RyYS4NCi1kaXNjaXBsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RhIGRpc2NpcGxpbmEuDQotDQotZG9tYWluX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0ZSBkb21pbmlvLg0KLWRvbWFpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGUgZG9taW5pby4NCi1kb21haW5fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RlIGRvbWluaW8gY29uIG90cm8uDQotZG9tYWluX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RlIGRvbWluaW8uDQotDQotd29ya3Byb2R1Y3R0eXBlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0YSBjbGFzZSBkZSBwcm9kdWN0byBkZSB0cmFiYWpvLg0KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGEgY2xhc2UgZGUgcHJvZHVjdG8gZGUgdHJhYmFqby4NCi13b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIGVzdGEgY2xhc2UgZGUgcHJvZHVjdG8gZGUgdHJhYmFqbyBzZSByZWxhY2lvbmEgY29uIG90cmEgY2xhc2UgZGUgcHJvZHVjdG8gZGUgdHJhYmFqby4NCi13b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24gYWNlcmNhIGRlIGVzdGEgY2xhc2UgZGUgcHJvZHVjdG8gZGUgdHJhYmFqby4NCi0NCi1yb2xlc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0ZSBjb25qdW50byBkZSByb2xlcy4NCi1yb2xlc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0ZSBjb25qdW50byBkZSByb2xlcy4NCi1yb2xlc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0ZSBjb25qdW50byBkZSByb2xlcyBjb24gb3Ryby4NCi1yb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RlIGNvbmp1bnRvIGRlIHJvbGVzLg0KLQ0KLXRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGV0YWxsYWRhIGFjZXJjYSBkZSBlc3RhIGhlcnJhbWllbnRhLg0KLXRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RhIGhlcnJhbWllbnRhLg0KLXRvb2xfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RhIGhlcnJhbWllbnRhIGNvbiBvdHJhLg0KLXRvb2xfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24gYWNlcmNhIGRlIGVzdGEgaGVycmFtaWVudGEuDQotDQotY29uY2VwdF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGUgY29uY2VwdG8uDQotY29uY2VwdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGUgY29uY2VwdG8uDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjXHUwMGYzbW8gc2UgcmVsYWNpb25hIGVzdGUgY29uY2VwdG8gY29uIG90cm8uDQotY29uY2VwdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0ZSBjb25jZXB0by4NCi0NCi1jaGVja2xpc3RfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGV0YWxsYWRhIGFjZXJjYSBkZSBlc3RhIGxpc3RhIGRlIGNvbXByb2JhY2lcdTAwZjNuLg0KLWNoZWNrbGlzdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGEgbGlzdGEgZGUgY29tcHJvYmFjaVx1MDBmM24uDQotY2hlY2tsaXN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0YSBsaXN0YSBkZSBjb21wcm9iYWNpXHUwMGYzbiBjb24gb3RyYS4NCi1jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24gYWNlcmNhIGRlIGVzdGEgbGlzdGEgZGUgY29tcHJvYmFjaVx1MDBmM24uDQotDQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGUgZWplbXBsby4NCi1leGFtcGxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0ZSBlamVtcGxvLg0KLWV4YW1wbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RlIGVqZW1wbG8gY29uIG90cm8uDQotZXhhbXBsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0ZSBlamVtcGxvLg0KLQ0KLWd1aWRlbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGEgZGlyZWN0cml6Lg0KLWd1aWRlbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGEgZGlyZWN0cml6Lg0KLWd1aWRlbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjXHUwMGYzbW8gc2UgcmVsYWNpb25hIGVzdGEgZGlyZWN0cml6IGNvbiBvdHJhLg0KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0YSBkaXJlY3RyaXouDQotDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGV0YWxsYWRhIGFjZXJjYSBkZSBlc3RhIGNvbnNpZGVyYWNpXHUwMGYzbiBkZSBjXHUwMGUxbGN1bG8uDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RhIGNvbnNpZGVyYWNpXHUwMGYzbiBkZSBjXHUwMGUxbGN1bG8uDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RhIGNvbnNpZGVyYWNpXHUwMGYzbiBkZSBjXHUwMGUxbGN1bG8gY29uIG90cmEuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24gYWNlcmNhIGRlIGVzdGEgY29uc2lkZXJhY2lcdTAwZjNuIGRlIGNcdTAwZTFsY3Vsby4NCi0NCi1wcmFjdGljZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGEgcHJcdTAwZTFjdGljYS4NCi1wcmFjdGljZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGEgcHJcdTAwZTFjdGljYS4NCi1wcmFjdGljZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjXHUwMGYzbW8gc2UgcmVsYWNpb25hIGVzdGEgcHJcdTAwZTFjdGljYSBjb24gb3RyYS4NCi1wcmFjdGljZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0YSBwclx1MDBlMWN0aWNhLg0KLQ0KLXJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGUgaW5mb3JtZS4NCi1yZXBvcnRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RlIGluZm9ybWUuDQotcmVwb3J0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0ZSBpbmZvcm1lIGNvbiBvdHJvLg0KLXJlcG9ydF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0ZSBpbmZvcm1lLg0KLQ0KLXJlc3VhYmxlYXNzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGV0YWxsYWRhIGFjZXJjYSBkZSBlc3RlIGFjdGl2byByZXV0aWxpemFibGUuDQotcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGUgYWN0aXZvIHJldXRpbGl6YWJsZS4NCi1yZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0ZSBhY3Rpdm8gcmV1dGlsaXphYmxlIGNvbiBvdHJvLg0KLXJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24gYWNlcmNhIGRlIGVzdGUgYWN0aXZvIHJldXRpbGl6YWJsZS4NCi0NCi1yb2FkbWFwX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0ZSBtYXBhLg0KLXJvYWRtYXBfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RlIG1hcGEuDQotcm9hZG1hcF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjXHUwMGYzbW8gc2UgcmVsYWNpb25hIGVzdGUgbWFwYSBjb24gb3Ryby4NCi1yb2FkbWFwX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RlIG1hcGEuDQotDQotc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0ZSBtYXRlcmlhbCBkZSBzb3BvcnRlLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGUgbWF0ZXJpYWwgZGUgc29wb3J0ZS4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RlIG1hdGVyaWFsIGRlIHNvcG9ydGUgY29uIG90cm8uDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RlIG1hdGVyaWFsIGRlIHNvcG9ydGUuDQotDQotdGVtcGxhdGVfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGV0YWxsYWRhIGFjZXJjYSBkZSBlc3RhIHBsYW50aWxsYS4NCi10ZW1wbGF0ZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGEgcGxhbnRpbGxhLg0KLXRlbXBsYXRlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0YSBwbGFudGlsbGEgY29uIG90cmEuDQotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24gYWNlcmNhIGRlIGVzdGEgcGxhbnRpbGxhLg0KLQ0KLXRlcm1kZWZpbml0aW9uX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0YSBkZWZpbmljaVx1MDBmM24gZGUgdFx1MDBlOXJtaW5vLg0KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0YSBkZWZpbmljaVx1MDBmM24gZGUgdFx1MDBlOXJtaW5vLg0KLXRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0YSBkZWZpbmljaVx1MDBmM24gZGUgdFx1MDBlOXJtaW5vIGNvbiBvdHJhLg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RhIGRlZmluaWNpXHUwMGYzbiBkZSB0XHUwMGU5cm1pbm8uDQotDQotdG9vbG1lbnRvcl9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGEgZ3VcdTAwZWRhIGRlIGhlcnJhbWllbnRhLg0KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RhIGd1XHUwMGVkYSBkZSBoZXJyYW1pZW50YS4NCi10b29sbWVudG9yX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0YSBndVx1MDBlZGEgZGUgaGVycmFtaWVudGEgY29uIG90cmEuDQotdG9vbG1lbnRvcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0YSBndVx1MDBlZGEgZGUgaGVycmFtaWVudGEuDQotDQotd2hpdGVwYXBlcl9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGEgZG9jdW1lbnRhY2lcdTAwZjNuIHRcdTAwZTljbmljYS4NCi13aGl0ZXBhcGVyX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0YSBkb2N1bWVudGFjaVx1MDBmM24gdFx1MDBlOWNuaWNhLg0KLXdoaXRlcGFwZXJfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RhIGRvY3VtZW50YWNpXHUwMGYzbiB0XHUwMGU5Y25pY2EgY29uIG90cmEuDQotd2hpdGVwYXBlcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0YSBkb2N1bWVudGFjaVx1MDBmM24gdFx1MDBlOWNuaWNhLg0KLQ0KLWRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGEgYWdydXBhY2lcdTAwZjNuIGRlIGRpc2NpcGxpbmFzLg0KLWRpc2NpcGxpbmVncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGEgYWdydXBhY2lcdTAwZjNuIGRlIGRpc2NpcGxpbmFzLg0KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjXHUwMGYzbW8gc2UgcmVsYWNpb25hIGVzdGEgYWdydXBhY2lcdTAwZjNuIGRlIGRpc2NpcGxpbmFzIGNvbiBvdHJhLg0KLWRpc2NpcGxpbmVncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0YSBhZ3J1cGFjaVx1MDBmM24gZGUgZGlzY2lwbGluYXMuDQotDQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0YSBhZ3J1cGFjaVx1MDBmM24gZGUgY29uanVudG9zIGRlIHJvbGVzLg0KLXJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGEgYWdydXBhY2lcdTAwZjNuIGRlIGNvbmp1bnRvcyBkZSByb2xlcy4NCi1yb2xlc2V0Z3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RhIGFncnVwYWNpXHUwMGYzbiBkZSBjb25qdW50b3MgZGUgcm9sZXMgY29uIG90cmEuDQotcm9sZXNldGdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RhIGFncnVwYWNpXHUwMGYzbiBkZSBjb25qdW50b3MgZGUgcm9sZXMuDQotDQotY3VzdG9tY2F0ZWdvcnlfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGV0YWxsYWRhIGFjZXJjYSBkZSBlc3RhIGNhdGVnb3JcdTAwZWRhIHBlcnNvbmFsaXphZGEuDQotY3VzdG9tY2F0ZWdvcnlfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RhIGNhdGVnb3JcdTAwZWRhIHBlcnNvbmFsaXphZGEuDQotY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RhIGNhdGVnb3JcdTAwZWRhIHBlcnNvbmFsaXphZGEgY29uIG90cmEuDQotY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24gYWNlcmNhIGRlIGVzdGEgY2F0ZWdvclx1MDBlZGEgcGVyc29uYWxpemFkYS4NCi1jdXN0b21jYXRlZ29yeV9JY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaWNlIGxvcyBpY29ub3MgcGFyYSBlc3RhIGNhdGVnb3JcdTAwZWRhIHBlcnNvbmFsaXphZGEuDQotDQotY29uY2VwdF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaWNlIGxvcyBpY29ub3MgcGFyYSBlc3RlIGNvbmNlcHRvLg0KLWNoZWNrbGlzdF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaWNlIGxvcyBpY29ub3MgcGFyYSBlc3RhIGxpc3RhIGRlIGNvbXByb2JhY2lcdTAwZjNuLg0KLXRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGljZSBsb3MgaWNvbm9zIHBhcmEgZXN0YSBndVx1MDBlZGEgZGUgbGEgaGVycmFtaWVudGEuDQotd2hpdGVwYXBlcl9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaWNlIGxvcyBpY29ub3MgcGFyYSBlc3RhIGRvY3VtZW50YWNpXHUwMGYzbiB0XHUwMGU5Y25pY2EuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25faWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGljZSBsb3MgaWNvbm9zIHBhcmEgZXN0YSBjb25zaWRlcmFjaVx1MDBmM24gZGUgY1x1MDBlMWxjdWxvLg0KLXRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpY2UgbG9zIGljb25vcyBwYXJhIGVzdGEgZGVmaW5pY2lcdTAwZjNuIGRlIHRcdTAwZTlybWluby4NCi10ZW1wbGF0ZV9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaWNlIGxvcyBpY29ub3MgcGFyYSBlc3RhIHBsYW50aWxsYS4NCi1yZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpY2UgbG9zIGljb25vcyBwYXJhIGVzdGUgYWN0aXZvIHJldXRpbGl6YWJsZS4NCi1yZXBvcnRfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGljZSBsb3MgaWNvbm9zIHBhcmEgZXN0ZSBpbmZvcm1lLg0KLXByYWN0aWNlX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpY2UgbG9zIGljb25vcyBwYXJhIGVzdGEgcHJcdTAwZTFjdGljYS4NCi1leGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpY2UgbG9zIGljb25vcyBwYXJhIGVzdGUgZWplbXBsby4NCi1ndWlkZWxpbmVfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGljZSBsb3MgaWNvbm9zIHBhcmEgZXN0YSBkaXJlY3RyaXouDQotcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaWNlIGxvcyBpY29ub3MgcGFyYSBlc3RlIG1hcGEuDQotc3VwcG9ydGluZ21hdGVyaWFsX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpY2UgbG9zIGljb25vcyBwYXJhIGVzdGUgbWF0ZXJpYWwgZGUgc29wb3J0ZS4NCi0NCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY190aXRsZT1BcmNoaXZvIGNhbWJpYWRvDQotZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfbWVzc2FnZT1FbCBhcmNoaXZvIHNlIGhhIGNhbWJpYWRvIGVuIGVsIHNpc3RlbWEgZGUgYXJjaGl2b3MuIFx1MDBiZkRlc2VhIGNhcmdhciBsb3MgY2FtYmlvcz8NCi0NCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZT1WYXJpYWJpbGlkYWQgZGUgbGEgYWN0aXZpZGFkDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnPUxhIGFjdGl2aWRhZCAnJ3swfScnIG5vIHB1ZWRlIGVzdGFibGVjZXIgbGEgdmFyaWFiaWxpZGFkIGNvbiAnJ3sxfScnIHB1ZXN0byBxdWUgJyd7MX0nJyB5YSB0aWVuZSB1bmEgbyB2YXJpYXMgYWN0aXZpZGFkZXMgY29udHJpYnVpZGFzL3N1c3RpdHVpZGFzIGNvbW8gaGlqb3MuDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMT1MYSBhY3RpdmlkYWQgJyd7MH0nJyBubyBwdWVkZSBlc3RhYmxlY2VyIGxhIHZhcmlhYmlsaWRhZCBjb24gdW5vIGRlIHN1cyBwYWRyZXMgZGlyZWN0b3MgbmkgY29uIG5pbmdcdTAwZmFuIHByb2Nlc28uDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMj1MYSBhY3RpdmlkYWQgJyd7MH0nJyBubyBwdWVkZSBlc3RhYmxlY2VyIGxhIHZhcmlhYmlsaWRhZCBjb24gJyd7MX0nJyBwdWVzdG8gcXVlIGRhclx1MDBlZGEgY29tbyByZXN1bHRhZG8gdW5hIGRlcGVuZGVuY2lhIGNpcmN1bGFyLg0KLQ0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU9QXBsaWNhciBwYXRyXHUwMGYzbg0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPUxhIGFjdGl2aWRhZCAnJ3swfScnIG5vIHB1ZWRlIGVzdGFibGVjZXIgZWwgcGF0clx1MDBmM24gY29uICcnezF9JycgcHVlc3RvIHF1ZSBkYXJcdTAwZWRhIGNvbW8gcmVzdWx0YWRvIHVuYSBkZXBlbmRlbmNpYSBjaXJjdWxhci4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotQ2hhbmdlSGlzdG9yeURpYWxvZ19kZWxpbWl0ZXI9fA0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3Jfc2hvd093bmVySW5MaWJyYXJ5Vmlldz1TaG93IG93bmVyIG9mIHRoaXMgdW5yZXNvbHZlZCByZWZlcmVuY2UgaW4gTGlicmFyeSB2aWV3DQotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZW1vdmVVbnJlc29sdmVkUmVmZXJlbmNlPVJlbW92ZSB0aGlzIHVucmVzb2x2ZWQgcmVmZXJlbmNlDQotcHJvbXB0RGVsZXRlQ3VzdG9tQ2F0ZWdvcnlCZWZvcmVSZW1vdmVMYXN0UmVmVG9JdD1Fc3RcdTAwZTEgYSBwdW50byBkZSBzdXByaW1pciBsYSBcdTAwZmFsdGltYSByZWZlcmVuY2lhIGEgezB9IGVuIGVsIHBsdWctaW4uIFNlIHN1cHJpbWlyXHUwMGUxbiBsb3MgZWxlbWVudG9zLiBcdTAwYmZEZXNlYSBjb250aW51YXI/DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSNCZWxvdyBwcm9wZXJ0eSAiZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzIiBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQNCi0jRG9uJ3QgZGVsZXRlIGEgc3BhY2UgYWZ0ZXIgIjogIg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzPTogDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwMmQ4ZjkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZvcm0gUGFnZSBUaXRsZXMNCi1hc3NpZ25QYWdlX3RpdGxlPUFmZmVjdGVyDQotY2F0ZWdvcmllc1BhZ2VfdGl0bGU9Q2F0XHUwMGU5Z29yaWVzDQotZGVsaXZlcmFibGVQYXJ0c1BhZ2VfdGl0bGU9Q29tcG9zYW50cyBsaXZyYWJsZXMNCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9RGVzY3JpcHRpb24NCi1kaXNjaXBsaW5lc1BhZ2VfdGl0bGU9RGlzY2lwbGluZXMNCi1kaXNjYXJkdW5yZXNvbHZlZHJlZj1FbGltaW5lciBsZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgbm9uIHJcdTAwZTlzb2x1ZXMNCi1ndWlkYW5jZVBhZ2VfdGl0bGU9Q29uc2VpbA0KLXByZXZpZXdQYWdlX3RpdGxlPUFwZXJcdTAwZTd1DQotcmVmZXJlbmNlc1BhZ2VfdGl0bGU9Ulx1MDBlOWZcdTAwZTlyZW5jZXMNCi1yZWZlcmVuY2VfdGV4dD1SXHUwMGU5Zlx1MDBlOXJlbmNlcyA6DQotcmVmZXJlbmNlV29ya2Zsb3dQYWdlX3RpdGxlPUVuY2hhXHUwMGVlbmVtZW50IGQnYWN0aXZpdFx1MDBlOXMgZGUgclx1MDBlOWZcdTAwZTlyZW5jZQ0KLXJvbGVzUGFnZV90aXRsZT1SXHUwMGY0bGVzDQotcm9sZVNldHNQYWdlX3RpdGxlPUVuc2VtYmxlcyBkZSByXHUwMGY0bGVzDQotc3RlcHNQYWdlX3RpdGxlPUV0YXBlcw0KLXRhc2tzUGFnZV90aXRsZT1UXHUwMGUyY2hlcw0KLXRvb2xNZW50b3JzUGFnZV90aXRsZT1HdWlkZXMgZCd1dGlsaXNhdGlvbiBkZSBsJ291dGlsDQotd29ya1Byb2R1Y3RzUGFnZV90aXRsZT1Qcm9kdWl0cw0KLQ0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uDQotY2hlY2tJdGVtc1NlY3Rpb25fbmFtZT1FbFx1MDBlOW1lbnRzIGRlIHZcdTAwZTlyaWZpY2F0aW9uDQotY2hlY2tJdGVtc1NlY3Rpb25fZGVzYz1TcFx1MDBlOWNpZmlleiBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIHZcdTAwZTlyaWZpY2F0aW9uIGNvbnN0aXR1YW50IGNldHRlIGxpc3RlIGRlIGNvbnRyXHUwMGY0bGUuDQotZGVwZW5kZW5jaWVzU2VjdGlvbl9uYW1lPURcdTAwZTlwZW5kYW5jZXMNCi1kZXBlbmRlbmNpZXNTZWN0aW9uX2Rlc2M9Q2V0dGUgc2VjdGlvbiBhZmZpY2hlIGxlcyBkXHUwMGU5cGVuZGFuY2VzIGRlIGNlIHBhY2thZ2UgZGUgY29udGVudSBhdXggYXV0cmVzIHBhY2thZ2VzIGRlIGNvbnRlbnUuDQotZGV0YWlsU2VjdGlvbl9uYW1lPUluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcw0KLWRldGFpbFNlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZFx1MDBlOXRhaWxsXHUwMGU5ZXMgc3VyIGNlIHswfS4NCi1nZW5lcmFsSW5mb1NlY3Rpb25fbmFtZT1JbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcw0KLWdlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2UgezB9Lg0KLWljb25TZWN0aW9uX25hbWU9SWNcdTAwZjRuZQ0KLWljb25TZWN0aW9uX2Rlc2M9UGVyc29ubmFsaXNleiBsZXMgaWNcdTAwZjRuZXMgcG91ciBjZSB7MH0uDQotbm90YXRpb25TZWN0aW9uX25hbWU9SW5mb3JtYXRpb25zIGRlIGxpdnJhaXNvbg0KLW5vdGF0aW9uU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSBsaXZyYWlzb24gXHUwMGUwIHByb3BvcyBkZSBjZSB7MH0uDQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX25hbWU9UGx1Zy1pbnMgclx1MDBlOWZcdTAwZTlyZW5jXHUwMGU5cyA6DQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX2Rlc2M9Q2V0dGUgc2VjdGlvbiBhZmZpY2hlIGxlcyBwbHVnLWlucyByXHUwMGU5Zlx1MDBlOXJlbmNcdTAwZTlzIHBhciBjZSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZS4NCi1zdGFmZmluZ1NlY3Rpb25fbmFtZT1JbmZvcm1hdGlvbnMgcmVsYXRpdmVzIFx1MDBlMCBsJ2FmZmVjdGF0aW9uIGR1IHBlcnNvbm5lbA0KLXN0YWZmaW5nU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyByZWxhdGl2ZXMgXHUwMGUwIGwnYWZmZWN0YXRpb24gZHUgcGVyc29ubmVsIFx1MDBlMCBwcm9wb3MgZGUgY2Ugclx1MDBmNGxlLg0KLXN0ZXBzU2VjdGlvbl9uYW1lPUV0YXBlcw0KLXN0ZXBzU2VjdGlvbl9kZXNjPVNwXHUwMGU5Y2lmaWV6IGxlcyBcdTAwZTl0YXBlcyBcdTAwZTAgc3VpdnJlIHBvdXIgZWZmZWN0dWVyIGNldHRlIHRcdTAwZTJjaGUuDQotdGFpbG9yaW5nU2VjdGlvbl9uYW1lPVBlcnNvbm5hbGlzYXRpb24NCi10YWlsb3JpbmdTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHBlcnNvbm5hbGlzYXRpb24gXHUwMGUwIHByb3BvcyBkZSBjZSB7MH0uDQotdmFyaWFiaWxpdHlTZWN0aW9uX25hbWU9VmFyaWFiaWxpdFx1MDBlOSBkdSBjb250ZW51DQotdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZSB7MH0gcycnYXNzb2NpZSBcdTAwZTAgdW4gYXV0cmUgezB9Lg0KLXZlcnNpb25JbmZvU2VjdGlvbl9uYW1lPUluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uDQotdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZSB7MH0uDQotDQotIyBVSSAmIEVsZW1lbnQgQXR0cmlidXRlIExhYmVscw0KLWFkZGl0aW9uYWxJbmZvX3RleHQ9SW5mb3JtYXRpb25zIGNvbXBsXHUwMGU5bWVudGFpcmVzIDoNCi1hcHBsaWNhdGlvbl90ZXh0PUFwcGxpY2F0aW9uIDoNCi1hY3Rpb25MYWJlbF9lZGl0PU1vZGlmaWVyDQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1BZmZpY2hlciBkYW5zIGxhIHZ1ZSBCaWJsaW90aFx1MDBlOHF1ZQ0KLWFsdGVybmF0aXZlc190ZXh0PUFsdGVybmF0aXZlcyA6DQotYXNzaWdubWVudEFwcHJvYWNoZXNfdGV4dD1BcHByb2NoZXMgZCdhZmZlY3RhdGlvbiA6DQotYXV0aG9yc190ZXh0PUF1dGV1cnMgOg0KLWJhY2tncm91bmRfdGV4dD1BcnJpXHUwMGU4cmUtcGxhbiA6DQotYmFzZUVsZW1lbnRfdGV4dD1CYXNlIDoNCi1iYXNlR3VpZGFuY2VfdGV4dD1Db25zZWlsIGRlIGJhc2UgOg0KLWJyaWVmRGVzY3JpcHRpb25fdGV4dD1EZXNjcmlwdGlmIGNvdXJ0IDoNCi1kZXNjcmlwdGlvbl90ZXh0PURlc2NyaXB0aW9uIDoNCi1iYWNrdXBiZWZvcmVzYXZlX3RleHQ9U2F1dmVnYXJkZXIgYXZhbnQgZCdlbnJlZ2lzdHJlcg0KLWJyaWVmT3V0bGluZV90ZXh0PUJyZWYgYXBlclx1MDBlN3UgOg0KLWNoYW5nZURhdGVfdGV4dD1EYXRlIGRlIG1vZGlmaWNhdGlvbiA6DQotY2hhbmdlRGVzY3JpcHRpb25fdGV4dD1EZXNjcmlwdGlvbiBkZSBsYSBtb2RpZmljYXRpb24gOg0KLWNoZWNrSXRlbXNfdGV4dD1FbFx1MDBlOW1lbnRzIGRlIHZcdTAwZTlyaWZpY2F0aW9uDQotY29udHJpYnV0ZXNfdGV4dD1Db250cmlidWUNCi1sb2NhbENvbnRyaWJ1dGVzX3RleHQ9Q29udHJpYnV0aW9ucyBsb2NhbGVzDQotY29udHJpYnV0ZXNfdG9fdGV4dD1Db250cmlidWUgXHUwMGUwDQotY29weXJpZ2h0X3RleHQ9Q29weXJpZ2h0IDoNCi1lZGl0b3JfdGV4dD1FZGl0ZXVyDQotZXh0ZW5kc190ZXh0PUV0ZW5kDQotZXh0ZW5kX3RleHQ9RXh0ZW5zaW9uDQotZXh0ZXJuYWxEZXNjcmlwdGlvbl90ZXh0PURlc2NyaXB0aWYgZXh0ZXJuZSA6DQotZXh0ZXJuYWxJZF90ZXh0PUlkZW50aWZpY2F0ZXVyIGV4dGVybmUgOg0KLWdvYWxzX3RleHQ9QnV0cyA6DQotaW1wYWN0T2ZOb3RIYXZpbmdfdGV4dD1JbmNpZGVuY2UgZHUgbWFucXVlIDoNCi1rZXlDb25zaWRlcmF0aW9uc190ZXh0PUNvbnNpZFx1MDBlOXJhdGlvbnMgY2xcdTAwZTlzIDoNCi1sZXZlbHNPZkFkb3B0aW9uX3RleHQ9Tml2ZWF1IGQnYWRvcHRpb24gOg0KLW1haW5EZXNjcmlwdGlvbl90ZXh0PURlc2NyaXB0aWYgcHJpbmNpcGFsIDoNCi1uZXdFbGVtZW50X3RleHQ9Tm91dmVhdShub3V2ZWxsZSkgezB9DQotbmFtZV90ZXh0PU5vbSA6DQotbm90QXBwbGljYWJsZV90ZXh0PVNhbnMgb2JqZXQNCi1wYWNrYWdpbmdHdWlkYW5jZV90ZXh0PUNvbnNlaWwgcG91ciByZWdyb3VwZW1lbnQgOg0KLXByZXNlbnRhdGlvbk5hbWVfdGV4dD1Ob20gZGUgcHJcdTAwZTlzZW50YXRpb24gOg0KLXByb21wdGZvcmxpYmFyeV90ZXh0PUludml0ZSBkZW1hbmRhbnQgcXVlbGxlIGVzdCBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGF1IGRcdTAwZTltYXJyYWdlDQotZW5hYmxlSGVhbHRoQ2hlY2tfdGV4dD1BY3RpdmVyIGxlcyBvdXRpbHMgZGUgZFx1MDBlOWJvZ2FnZSBpbnRlcm5lcw0KLXByb2JsZW1fdGV4dD1Qcm9ibFx1MDBlOG1lIDoNCi1wdXJwb3NlX3RleHQ9T2JqZXQgOg0KLXJlYXNvbkZvck5vdE5lZWRpbmdfdGV4dD1DYXVzZSBqdXN0aWZpYW50IGwnYWJzZW5jZSBkZSBuXHUwMGU5Y2Vzc2l0XHUwMGU5IDoNCi1yZXBsYWNlc190ZXh0PVJlbXBsYWNlDQotbG9jYWxSZXBsYWNlc190ZXh0PVJlbXBsYWNlbWVudCBsb2NhbA0KLXJlcHJlc2VudGF0aW9uT3B0aW9uc190ZXh0PU9wdGlvbnMgZGUgcmVwclx1MDBlOXNlbnRhdGlvbiA6DQotdGVtcGxhdGVGaWxlX3RleHQ9RmljaGllcihzKSBkZSBjYW5ldmFzIDoNCi1za2lsbHNfdGV4dD1Db21wXHUwMGU5dGVuY2VzIDoNCi1zdGVwc190ZXh0PUV0YXBlcyA6DQotc3RlcHNfbmFtZV90ZXh0PU5vbSA6DQotc3RvcF90ZXh0PUFyclx1MDBlYXQNCi1wcmludF90ZXh0PUltcHJpbWVyDQotc3lub255bXNfdGV4dD1TeW5vbnltZXMgOg0KLXR5cGVfdGV4dD1UeXBlIDoNCi1jb3B5X3RleHQ9Q29waWVyDQotZGVlcENvcHlfdGV4dD1Db3BpZSBwcm9mb25kZQ0KLWJhY2tfdGV4dD1SZXRvdXINCi1uZXdfcGx1Z2luPU5vdXZlYXUgcGx1Zy1pbiBkZSBtXHUwMGU5dGhvZGUNCi1tb3ZlPURcdTAwZTlwbGFjZXIuLi4NCi11bmlxdWVJZF90ZXh0PUlkZW50aWZpY2F0ZXVyIHVuaXF1ZSA6DQotdmFyaWFiaWxpdHlUeXBlX3RleHQ9VHlwZSBkZSB2YXJpYWJpbGl0XHUwMGU5IDoNCi12ZXJzaW9uX3RleHQ9VmVyc2lvbiA6DQotDQotIyBCdXR0b24gTGFiZWxzDQotYWRkQnV0dG9uX3RleHQ9QWpvdXRlci4uLg0KLWF0dGFjaEJ1dHRvbl90ZXh0PUpvaW5kcmUuLi4NCi1icm93c2VCdXR0b25fdGV4dD1QYXJjb3VyaXIuLi4NCi1jaGFuZ2VUeXBlQnV0dG9uX3RleHQ9Q2hhbmdlciBkZSB0eXBlLi4uDQotY2xlYXJCdXR0b25fdGV4dD1FZmZhY2VyDQotZGVsZXRlQnV0dG9uX3RleHQ9U3VwcHJpbWVyDQotZGV0YWNoQnV0dG9uX3RleHQ9RFx1MDBlOXRhY2hlcg0KLWRpYWdyYW1fc2F2ZUVycm9yPUVycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZHUgZGlhZ3JhbW1lDQotZG93bkJ1dHRvbl90ZXh0PUJhcw0KLWRpcmVjdG9yeV90ZXh0PVJcdTAwZTlwZXJ0b2lyZSA6DQotb3JkZXJCdXR0b25fdGV4dD1PcmRyZQ0KLWVkaXRCdXR0b25fdGV4dD1Nb2RpZmllci4uLg0KLXJlbW92ZUJ1dHRvbl90ZXh0PVN1cHByaW1lcg0KLXJlbmFtZUFjdGlvbl90ZXh0PVJlbm9tbWVyLi4uDQotcmVtb3ZlX3RleHQ9U3VwcHJpbWVyDQotcmVuYW1lX3RleHQ9UmVub21tZXINCi1TYXZlQXNfdGV4dD1FbnJlZ2lzdHJlciBzb3VzDQotc2VsZWN0QnV0dG9uX3RleHQ9U1x1MDBlOWxlY3Rpb25uZXIuLi4NCi1kZXNlbGVjdEJ1dHRvbl90ZXh0PURcdTAwZTlzXHUwMGU5bGVjdGlvbm5lcg0KLXVwQnV0dG9uX3RleHQ9SGF1dA0KLW1ha2VEZWZhdWx0QnV0dG9uX3RleHQ9RFx1MDBlOWZpbmlyIGNvbW1lIHZhbGV1ciBwYXIgZFx1MDBlOWZhdXQNCi12aWV3SGlzdG9yeUJ1dHRvbl90ZXh0PUFmZmljaGVyIGwnaGlzdG9yaXF1ZS4uLg0KLQ0KLSMgUm9sZSBFZGl0b3IgVGFza3MgUGFnZQ0KLXJvbGVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9VFx1MDBlMmNoZXMNCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1DZSByXHUwMGY0bGUgZXN0IGwnZXhcdTAwZTljdXRhbnQgZGVzIHRcdTAwZTJjaGVzIHN1aXZhbnRlcy4NCi1yb2xlVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVRcdTAwZTJjaGVzIGRpc3BvbmlibGVzDQotcm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsPUV4XHUwMGU5Y3V0YW50IHByaW5jaXBhbCA6DQotcm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsMj1FeFx1MDBlOWN1dGFudCBzdXBwbFx1MDBlOW1lbnRhaXJlIDoNCi1yb2xlVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRcdTAwZTJjaGVzIG9udCBcdTAwZTl0XHUwMGU5IHNcdTAwZTlsZWN0aW9ublx1MDBlOWVzLg0KLQ0KLSMgUm9sZSBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9UHJvZHVpdHMgOg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcFx1MDBlOWNpZmlleiBsZXMgcHJvZHVpdHMgZG9udCBjZSByXHUwMGY0bGUgZXN0IHJlc3BvbnNhYmxlLg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVByb2R1aXRzIGRpc3BvbmlibGVzIDoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVJlc3BvbnNhYmxlIGRlIDoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1Qcm9kdWl0cyBjb25zdGl0dWFudCBkZXMgc29ydGllcyBkZXMgdFx1MDBlMmNoZXMgZWZmZWN0dVx1MDBlOWVzIHBhciBjZSByXHUwMGY0bGUgOg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHByb2R1aXRzIG9udCBcdTAwZTl0XHUwMGU5IHNcdTAwZTlsZWN0aW9ublx1MDBlOXMuDQotDQotIyBSb2xlIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1Db25zZWlsDQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249Rm91cm5pdCBkZXMgbGllbnMgdmVycyBkZXMgaW5mb3JtYXRpb25zIGNvbXBsXHUwMGU5bWVudGFpcmVzIHNvdXMgbGEgZm9ybWUgZGUgY29uc2VpbHMuDQotcm9sZUd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1Db25zZWlsIGRpc3BvbmlibGUgOg0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1Db25zZWlsIDoNCi1yb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGNvbnNlaWxzIG9udCBcdTAwZTl0XHUwMGU5IHNcdTAwZTlsZWN0aW9ublx1MDBlOXMuDQotDQotIyBSb2xlIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9Q2F0XHUwMGU5Z29yaWVzIDoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGVzIGNhdFx1MDBlOWdvcmllcyBhdXhxdWVsbGVzIGFwcGFydGllbnQgY2Ugclx1MDBmNGxlLg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1FbnNlbWJsZXMgZGUgclx1MDBmNGxlcyA6DQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1DYXRcdTAwZTlnb3JpZXMgcGVyc29ubmFsaXNcdTAwZTllcyA6DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9RW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMgOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1DYXRcdTAwZTlnb3JpZXMgcGVyc29ubmFsaXNcdTAwZTllcyA6DQotDQotIyBUYXNrIEVkaXRvciBSb2xlcyBQYWdlDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZT1SXHUwMGY0bGVzDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QWZmZWN0ZXogbGVzIHJcdTAwZjRsZXMgcG91ciBlZmZlY3R1ZXIgY2V0dGUgdFx1MDBlMmNoZS4NCi10YXNrUm9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVJcdTAwZjRsZXMgZGlzcG9uaWJsZXMgOg0KLXRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1FeFx1MDBlOWN1dGFudCBwcmluY2lwYWwgOg0KLXRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9RXhcdTAwZTljdXRhbnRzIHN1cHBsXHUwMGU5bWVudGFpcmVzIDoNCi10YXNrUm9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHJcdTAwZjRsZXMgb250IFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cy4NCi10YXNrUm9sZXNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbW9kaWZ5X21lc3NhZ2U9SVVQQTAwMDQ1VyA6IFZvdWxlei12b3VzIG1vZGlmaWVyIGwnJ2V4XHUwMGU5Y3V0YW50IHByaW5jaXBhbCBlbiAnJ3swfScnID8NCi10YXNrUm9sZXNQYWdlX2NvbmZpcm1fdGl0bGU9Q29uZmlybWVyIGxhIG1vZGlmaWNhdGlvbiBkdSByXHUwMGY0bGUgcHJpbmNpcGFsDQotDQotIyBUYXNrIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kdWl0cw0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcFx1MDBlOWNpZmlleiBsZXMgcHJvZHVpdHMgZCdlbnRyXHUwMGU5ZSBldCBkZSBzb3J0aWUgcG91ciBjZXR0ZSB0XHUwMGUyY2hlLg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVByb2R1aXRzIGRpc3BvbmlibGVzDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1FbnRyXHUwMGU5ZXMgb2JsaWdhdG9pcmVzIDoNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1FbnRyXHUwMGU5ZXMgZmFjdWx0YXRpdmVzIDoNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMz1Tb3J0aWVzIDoNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBwcm9kdWl0cyBvbnQgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzLg0KLQ0KLSMgVGFzayBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9Q29uc2VpbA0KLXRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUZvdXJuaXQgZGVzIGluZm9ybWF0aW9ucyBjb21wbFx1MDBlOW1lbnRhaXJlcyBzb3VzIGxhIGZvcm1lIGRlIGNvbnNlaWxzLg0KLXRhc2tHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9Q29uc2VpbCBkaXNwb25pYmxlIDoNCi10YXNrR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9Q29uc2VpbCA6DQotdGFza0d1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBjb25zZWlscyBvbnQgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzLg0KLQ0KLSMgVGFzayBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUNhdFx1MDBlOWdvcmllcw0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R1x1MDBlOXJleiBsZXMgY2F0XHUwMGU5Z29yaWVzIGF1eHF1ZWxsZXMgYXBwYXJ0aWVudCBjZXR0ZSB0XHUwMGUyY2hlLg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1EaXNjaXBsaW5lcw0KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9Q2F0XHUwMGU5Z29yaWVzIHBlcnNvbm5hbGlzXHUwMGU5ZXMNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1EaXNjaXBsaW5lcyA6DQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUNhdFx1MDBlOWdvcmllcyBwZXJzb25uYWxpc1x1MDBlOWVzIDoNCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgVGFza3MgUGFnZQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25OYW1lPVRcdTAwZTJjaGVzDQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPUNlIHByb2R1aXQgZXN0IHVuZSBlbnRyXHUwMGU5ZSBvdSB1bmUgc29ydGllIHBvdXIgbGVzIHRcdTAwZTJjaGVzIHN1aXZhbnRlcy4NCi1Xb3JrUHJvZHVjdF9UYXNrc19BdmFpbGFibGVMYWJlbD1UXHUwMGUyY2hlcyBkaXNwb25pYmxlcw0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWw9RW50clx1MDBlOWUgb2JsaWdhdG9pcmUgOg0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwyPUVudHJcdTAwZTllIGZhY3VsdGF0aXZlIDoNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMz1Tb3J0aWUgOg0KLVdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRcdTAwZTJjaGVzIG9udCBcdTAwZTl0XHUwMGU5IHNcdTAwZTlsZWN0aW9ublx1MDBlOWVzLg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBSb2xlcyBQYWdlDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9Ulx1MDBmNGxlcw0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1MZXMgclx1MDBmNGxlcyBzdWl2YW50cyBzb250IHJlc3BvbnNhYmxlcyBkZSBvdSBtb2RpZmllbnQgY2UgcHJvZHVpdC4NCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1SXHUwMGY0bGVzIGRpc3BvbmlibGVzDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SXHUwMGY0bGUgcmVzcG9uc2FibGUgOg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVJcdTAwZjRsZXMgbW9kaWZpY2F0ZXVycyA6DQotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gclx1MDBmNGxlcyBvbnQgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzLg0KLQ0KLSMjIFdvcmsgUHJvZHVjdCBFZGl0b3IgRGVsaXZlcmFibGUgUGFydHMgUGFnZQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU9Q29tcG9zYW50cyBsaXZyYWJsZXMNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcFx1MDBlOWNpZmlleiBsZXMgcHJvZHVpdHMgcXVpIGNvbnN0aXR1ZW50IGNlIGxpdnJhYmxlLg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9UHJvZHVpdHMgZGlzcG9uaWJsZXMgY29tbWUgY29tcG9zYW50cyBsaXZyYWJsZXMgOg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Qcm9kdWl0cyBjb21tZSBjb21wb3NhbnRzIGxpdnJhYmxlcyA6DQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBwcm9kdWl0cyBvbnQgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzLg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBHdWlkYW5jZSBQYWdlDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9Q29uc2VpbA0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Gb3Vybml0IGRlcyBpbmZvcm1hdGlvbnMgY29tcGxcdTAwZTltZW50YWlyZXMgc291cyBsYSBmb3JtZSBkZSBjb25zZWlscy4NCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1Db25zZWlsIGRpc3BvbmlibGUgOg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9Q29uc2VpbCA6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gY29uc2VpbHMgb250IFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cy4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRcdTAwZTlnb3JpZXMNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlcyBjYXRcdTAwZTlnb3JpZXMgYXV4cXVlbGxlcyBhcHBhcnRpZW50IGNlIHByb2R1aXQuDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1Eb21haW5lcw0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPVR5cGUgZGUgcHJvZHVpdHMgOg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwzPUNhdFx1MDBlOWdvcmllcyBwZXJzb25uYWxpc1x1MDBlOWVzIDoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9RG9tYWluZSA6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1UeXBlcyBkZSBwcm9kdWl0cyA6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMz1DYXRcdTAwZTlnb3JpZXMgcGVyc29ubmFsaXNcdTAwZTllcyA6DQotDQotIyBQcmFjdGljZSBFZGl0b3IgUmVmZXJlbmNlcyBQYWdlDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uTmFtZT1FbFx1MDBlOW1lbnRzIGRlIGNvbnRlbnUNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcFx1MDBlOWNpZmlleiBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIGNvbnRlbnUgclx1MDBlOWZcdTAwZTlyZW5jXHUwMGU5cyBwYXIgY2V0dGUgcHJhdGlxdWUuDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1FbFx1MDBlOW1lbnRzIGRlIGNvbnRlbnUgZGlzcG9uaWJsZXMgOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1FbFx1MDBlOW1lbnRzIGRlIGNvbnRlbnUgOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gXHUwMGU5bFx1MDBlOW1lbnRzIGRlIGNvbnRlbnUgb250IFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cy4NCi0NCi0jIENhdGVnb3J5IEVkaXRvciBHdWlkYW5jZSBQYWdlDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25OYW1lPUNvbnNlaWwNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGVzIGNvbnNlaWxzIHF1aSBhcHBhcnRpZW5uZW50IFx1MDBlMCBjZXQgezB9Lg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1Db25zZWlsIGRpc3BvbmlibGUgOg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPUNvbnNlaWwgOg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBjb25zZWlscyBvbnQgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzLg0KLQ0KLSMgRGlzY2lwbGluZSBHcm91cGluZyBFZGl0b3IgRGlzY2lwbGluZXMgUGFnZQ0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uTmFtZT1EaXNjaXBsaW5lcw0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R1x1MDBlOXJlciBsZXMgZGlzY2lwbGluZXMgcXVpIGFwcGFydGllbm5lbnQgXHUwMGUwIGNlIHJlZ3JvdXBlbWVudCBkZSBkaXNjaXBsaW5lcy4NCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RGlzY2lwbGluZXMgZGlzcG9uaWJsZXMgOg0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWxlY3RlZExhYmVsPURpc2NpcGxpbmVzIDoNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gZGlzY2lwbGluZXMgb250IFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZXMuDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Vc2VEZWZhdWx0RGlyZWN0b3J5QnV0dG9uTGFiZWw9VXRpbGlzZXIgbGUgclx1MDBlOXBlcnRvaXJlIHBhciBkXHUwMGU5ZmF1dA0KLQ0KLSMgRGlzY2lwbGluZSBFZGl0b3IgVGFza3MgUGFnZQ0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9VFx1MDBlMmNoZXMNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlcyB0XHUwMGUyY2hlcyBxdWkgYXBwYXJ0aWVubmVudCBcdTAwZTAgY2V0dGUgZGlzY2lwbGluZS4NCi1kaXNjaXBsaW5lVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVRcdTAwZTJjaGVzIGRpc3BvbmlibGVzIDoNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9VFx1MDBlMmNoZXMgOg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gdFx1MDBlMmNoZXMgb250IFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZXMuDQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBSZWZlcmVuY2UgV29ya2Zsb3cgUGFnZQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbk5hbWU9RW5jaGFcdTAwZWVuZW1lbnRzIGQnYWN0aXZpdFx1MDBlOXMgZGUgclx1MDBlOWZcdTAwZTlyZW5jZQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGVzIGVuY2hhXHUwMGVlbmVtZW50cyBkJ2FjdGl2aXRcdTAwZTlzIGRlIHJcdTAwZTlmXHUwMGU5cmVuY2UgcXVpIGFwcGFydGllbm5lbnQgXHUwMGUwIGNldHRlIGRpc2NpcGxpbmUuDQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9hdmFpbGFibGVMYWJlbD1FbmNoYVx1MDBlZW5lbWVudHMgZCdhY3Rpdml0XHUwMGU5cyBkZSByXHUwMGU5Zlx1MDBlOXJlbmNlIGRpc3BvbmlibGVzIDoNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlbGVjdGVkTGFiZWw9RW5jaGFcdTAwZWVuZW1lbnRzIGQnYWN0aXZpdFx1MDBlOXMgZGUgclx1MDBlOWZcdTAwZTlyZW5jZSA6DQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBlbmNoYVx1MDBlZW5lbWVudHMgZCcnYWN0aXZpdFx1MDBlOXMgZGUgclx1MDBlOWZcdTAwZTlyZW5jZSBvbnQgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzLg0KLQ0KLSMgRG9tYWluIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVByb2R1aXRzDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R1x1MDBlOXJleiBsZXMgcHJvZHVpdHMgcXVpIGFwcGFydGllbm5lbnQgXHUwMGUwIGNlIGRvbWFpbmUuDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1Qcm9kdWl0cyBkaXNwb25pYmxlcyA6DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVByb2R1aXRzIDoNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHByb2R1aXRzIG9udCBcdTAwZTl0XHUwMGU5IHNcdTAwZTlsZWN0aW9ublx1MDBlOXMuDQotDQotIyBXb3JrIFByb2R1Y3QgS2luZCBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kdWl0cw0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGVzIHByb2R1aXRzIHF1aSBhcHBhcnRpZW5uZW50IFx1MDBlMCBjZSB0eXBlIGRlIHByb2R1aXQuDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1Qcm9kdWl0cyBkaXNwb25pYmxlcyA6DQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVByb2R1aXRzIDoNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHByb2R1aXRzIG9udCBcdTAwZTl0XHUwMGU5IHNcdTAwZTlsZWN0aW9ublx1MDBlOXMuDQotDQotIyBSb2xlIFNldCBHcm91cGluZyBFZGl0b3IgUm9sZSBTZXRzIFBhZ2UNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbk5hbWU9RW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGVzIGVuc2VtYmxlcyBkZSByXHUwMGY0bGVzIHF1aSBhcHBhcnRpZW5uZW50IFx1MDBlMCBjZSByZWdyb3VwZW1lbnQgZCdlbnNlbWJsZXMgZGUgclx1MDBmNGxlcy4NCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9RW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMgZGlzcG9uaWJsZXMgOg0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWxlY3RlZExhYmVsPUVuc2VtYmxlcyBkZSByXHUwMGY0bGVzIDoNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gZW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMgb250IFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cy4NCi0NCi0jIFJvbGUgU2V0IEVkaXRvciBSb2xlcyBQYWdlDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1SXHUwMGY0bGVzDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R1x1MDBlOXJleiBsZXMgclx1MDBmNGxlcyBxdWkgYXBwYXJ0aWVubmVudCBcdTAwZTAgY2V0IGVuc2VtYmxlIGRlIHJcdTAwZjRsZXMuDQotcm9sZVNldFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1SXHUwMGY0bGVzIGRpc3BvbmlibGVzIDoNCi1yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9Ulx1MDBmNGxlcyA6DQotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSByXHUwMGY0bGVzIG9udCBcdTAwZTl0XHUwMGU5IHNcdTAwZTlsZWN0aW9ublx1MDBlOXMuDQotDQotIyBUb29sIEVkaXRvciBUb29sIE1lbnRvcnMgUGFnZQ0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbk5hbWU9R3VpZGVzIGQndXRpbGlzYXRpb24gZGUgbCdvdXRpbA0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGVzIGd1aWRlcyBkJ3V0aWxpc2F0aW9uIGRlIGwnb3V0aWwgcXVpIGFwcGFydGllbm5lbnQgXHUwMGUwIGNldCBvdXRpbC4NCi10b29sVG9vbE1lbnRvcnNQYWdlX2F2YWlsYWJsZUxhYmVsPUd1aWRlcyBkJ3V0aWxpc2F0aW9uIGRlIGwnb3V0aWwgZGlzcG9uaWJsZXMgOg0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1HdWlkZXMgZCd1dGlsaXNhdGlvbiBkZSBsJ291dGlsIDoNCi10b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGd1aWRlcyBkJyd1dGlsaXNhdGlvbiBkZSBsJydvdXRpbCBvbnQgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzLg0KLQ0KLSMgQ3VzdG9tIENhdGVnb3J5IEVkaXRvciBBc3NpZ24gUGFnZQ0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uTmFtZT1FbFx1MDBlOW1lbnRzIGRlIGNvbnRlbnUNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSBjb250ZW51IHF1aSBjb25zdGl0dWVudCBjZXR0ZSBjYXRcdTAwZTlnb3JpZSBwZXJzb25uYWxpc1x1MDBlOWUuDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX2F2YWlsYWJsZUxhYmVsPUVsXHUwMGU5bWVudHMgZGUgY29udGVudSBkaXNwb25pYmxlcyA6DQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlbGVjdGVkTGFiZWw9RWxcdTAwZTltZW50cyBkZSBjb250ZW51IDoNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gXHUwMGU5bFx1MDBlOW1lbnRzIGRlIGNvbnRlbnUgb250IFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cy4NCi0NCi0jIE5ldyBNZXRob2QgUGx1Zy1pbiBXaXphcmQNCi1uZXdQbHVnaW5XaXphcmRfdGl0bGU9Tm91dmVhdSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZQ0KLW5ld1BsdWdpbldpemFyZFBhZ2VfdGl0bGU9Q3JcdTAwZTllciB1biBub3V2ZWF1IHBsdWctaW4gZGUgbVx1MDBlOXRob2RlDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0PVNwXHUwMGU5Y2lmaWV6IHVuIG5vbSBldCBmb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBzdXIgbGUgbm91dmVhdSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZS4NCi1uZXdQbHVnaW5FcnJvcl9tc2c9SVVQQTAwMjFFIDogRWNoZWMgZGUgbGEgY3JcdTAwZTlhdGlvbiBkdSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZS4NCi1uZXdQbHVnaW5FcnJvcl9yZWFzb249RXJyZXVyIGludGVybmUuXG5cDQotXG5cDQotQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy4NCi0NCi0jIEdlbmVyaWMgZGlhbG9nIHRpdGxlcw0KLWNyZWF0ZURpYWxvZ190aXRsZT1Dclx1MDBlOWVyIHVuIFx1MDBlOWxcdTAwZTltZW50DQotZGVsZXRlRGlhbG9nX3RpdGxlPVN1cHByaW1lciB1biBcdTAwZTlsXHUwMGU5bWVudA0KLWVkaXREaWFsb2dfdGl0bGU9TW9kaWZpZXIgdW4gXHUwMGU5bFx1MDBlOW1lbnQNCi1lcnJvckRpYWxvZ190aXRsZT1FcnJldXINCi1tb3ZlRGlhbG9nX3RpdGxlPURcdTAwZTlwbGFjZXIgdW4gXHUwMGU5bFx1MDBlOW1lbnQNCi1yZW5hbWVEaWFsb2dfdGl0bGU9UmVub21tZXIgdW4gXHUwMGU5bFx1MDBlOW1lbnQNCi13YXJuaW5nRGlhbG9nX3RpdGxlPUF2ZXJ0aXNzZW1lbnQNCi0NCi0jIEFkZCBDb25maWd1cmF0aW9uIHRvIFByb2Nlc3MgRXJyb3IgRGlhbG9nDQotYWRkQ29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9QWpvdXRlciB1bmUgY29uZmlndXJhdGlvbiBhdSBwcm9jZXNzdXMNCi0NCi0jIFNldCBEZWZhdWx0IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotc2V0RGVmYXVsdENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPURcdTAwZTlmaW5pciB1bmUgY29uZmlndXJhdGlvbiBwYXIgZFx1MDBlOWZhdXQgcG91ciBsZSBwcm9jZXNzdXMNCi0NCi0jIEVkaXQgUHJvY2VzcyBFcnJvciBEaWFsb2cNCi1lZGl0UHJvY2Vzc0VsZW1lbnRFcnJvckRpYWxvZ190aXRsZT1Nb2RpZmllciBsJ1x1MDBlOWxcdTAwZTltZW50IGRlIHByb2Nlc3N1cw0KLQ0KLSMgT3BlbiBMaWJyYXJ5IERpYWxvZw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlPU91dnJpciB1bmUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RleHQ9TGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBlbiBjb3VycyBuJ2EgcGFzIFx1MDBlOXRcdTAwZTkgc2F1dmVnYXJkXHUwMGU5ZSBjb3JyZWN0ZW1lbnQuIFZvdWxlei12b3VzIGlnbm9yZXIgbCdlcnJldXIgZXQgY29udGludWVyIHBvdXIgb3V2cmlyIHVuZSBhdXRyZSBiaWJsaW90aFx1MDBlOHF1ZSA/DQotDQotIyBTYXZlIExpYnJhcnkgRGlhbG9nDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGU9U2F1dmVnYXJkZXIgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcw0KLXNhdmVMaWJyYXJ5RGlhbG9nX3RleHQ9TGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBlbiBjb3VycyBhIFx1MDBlOXRcdTAwZTkgbW9kaWZpXHUwMGU5ZS4gVm91bGV6LXZvdXMgZW5yZWdpc3RyZXIgbGVzIG1vZGlmaWNhdGlvbnMgPw0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPU1ldHRyZSBcdTAwZTAgbml2ZWF1IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMNCi0NCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cNCi1kZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PUwnJ1x1MDBlOWxcdTAwZTltZW50ICcnezB9JycgYSBkXHUwMGU5alx1MDBlMCBcdTAwZTl0XHUwMGU5IHN1cHByaW1cdTAwZTkuIFNvdWhhaXRlei12b3VzIGxlIHN1cHByaW1lciBkZSAnJ3sxfScnID8NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbm9PcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwMEUgOiBBdWN1bmUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBvdXZlcnRlLlxuXA0KLVxuXA0KLVVuZSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGRvaXQgXHUwMGVhdHJlIG91dmVydGUgcG91ciBxdSd1biBub3V2ZWwgXHUwMGU5bFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlIHB1aXNzZSBcdTAwZWF0cmUgYWpvdXRcdTAwZTkuXG5cDQotXG5cDQotQ3JcdTAwZTlleiB1bmUgbm91dmVsbGUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBvdSBvdXZyZXogdW5lIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZXhpc3RhbnRlIGV0IHJcdTAwZTllc3NheWV6Lg0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDFFIDogTGUgbm9tIHswfSBlc3QgbWFucXVhbnQuXG5cDQotXG5cDQotVG91cyBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIG1cdTAwZTl0aG9kZSBldCBkZSBwcm9jZXNzdXMgZG9pdmVudCBhdm9pciB1biBub20uXG5cDQotXG5cDQotQ2xpcXVleiBzdXIgT0sgZXQgc2Fpc2lzc2V6IHVuIG5vbSB2YWxpZGUgcG91ciBjZXQgXHUwMGU5bFx1MDBlOW1lbnQuDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFIDogTGUgbm9tICcnezB9JycgZXhpc3RlIGRcdTAwZTlqXHUwMGUwLlxuXA0KLVxuXA0KLVVuIFx1MDBlOWxcdTAwZTltZW50IGRlIG1cdTAwZTl0aG9kZSBkb2l0IGF2b2lyIHVuIG5vbSB1bmlxdWUuXG5cDQotXG5cDQotQ2xpcXVleiBzdXIgT0sgZXQgc2Fpc2lzc2V6IHVuIG5vbSBkaWZmXHUwMGU5cmVudCBwb3VyIGNldCBcdTAwZTlsXHUwMGU5bWVudC4NCi1jcmVhdGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDNFIDogSW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIGxhIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlLg0KLWRlbGV0ZUNvbmZpZ0Vycm9yX21zZz1JVVBBMDAwNFcgOiBJbXBvc3NpYmxlIGRlIHN1cHByaW1lciBsYSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZS4NCi1pbnRlcm5hbEVycm9yX21zZz1JVVBBMDAwNUUgOiBVbmUgZXJyZXVyIGludGVybmUgcydlc3QgcHJvZHVpdGUuXG5cDQotXG5cDQotQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy4NCi1pbnZhbGlkUHJlc2VudGF0aW9uTmFtZUVycm9yX21zZz1JVVBBMDAwNkUgOiBMZSBub20gZGUgcHJcdTAwZTlzZW50YXRpb24gc3BcdTAwZTljaWZpXHUwMGU5IGVzdCBub24gdmFsaWRlLlxuXA0KLVxuXA0KLUNsaXF1ZXogc3VyIE9LIGV0IHNhaXNpc3NleiB1biBub20gZGlmZlx1MDBlOXJlbnQuDQotaW52YWxpZENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwN0UgOiBMYSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZSBzXHUwMGU5bGVjdGlvbm5cdTAwZTllICcnezB9JycgbicnZXN0IHBhcyB1biBzb3VzLWVuc2VtYmxlIGRlIGxhIGNvbmZpZ3VyYXRpb24gcGFyIGRcdTAwZTlmYXV0IGR1IHByb2Nlc3N1cy5cblwNCi1cblwNCi1BZmluIGRlIHByXHUwMGU5c2VydmVyIGwnJ2ludFx1MDBlOWdyaXRcdTAwZTkgZCcndW4gcHJvY2Vzc3VzLCBzYSBjb25maWd1cmF0aW9uIHBhciBkXHUwMGU5ZmF1dCBkb2l0IFx1MDBlYXRyZSB1bmUgdmVyc2lvbiBcdTAwZTlsYWJvclx1MDBlOWUgZGUgdG91dGVzIGxlcyBhdXRyZXMgY29uZmlndXJhdGlvbnMgcXVpIHNvbnQgYXNzb2NpXHUwMGU5ZXMgXHUwMGUwIGNlIHByb2Nlc3N1cy5cblwNCi1cblwNCi1TXHUwMGU5bGVjdGlvbm5leiB1bmUgYXV0cmUgY29uZmlndXJhdGlvbiBvdSBtb2RpZmlleiBsYSBjb25maWd1cmF0aW9uIHBhciBkXHUwMGU5ZmF1dCBwb3VyIHF1JydlbGxlIGluY2x1ZSBsZSBjb250ZW51IGRlIGxhIGNvbmZpZ3VyYXRpb24gc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZSBldCByXHUwMGU5ZXNzYXllei4NCi1zZXREZWZhdWx0Q29uZmlnRXJyb3JfbXNnPUlVUEEwMDA4RSA6IExhIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlIHNcdTAwZTlsZWN0aW9ublx1MDBlOWUgJyd7MH0nJyBuJydlc3QgcGFzIHVuZSB2ZXJzaW9uIFx1MDBlOWxhYm9yXHUwMGU5ZSBkZXMgYXV0cmVzIGNvbmZpZ3VyYXRpb25zIHJcdTAwZTlmXHUwMGU5cmVuY1x1MDBlOWVzIHBhciBsZSBwcm9jZXNzdXMuXG5cDQotXG5cDQotQWZpbiBkZSBwclx1MDBlOXNlcnZlciBsJydpbnRcdTAwZTlncml0XHUwMGU5IGQnJ3VuIHByb2Nlc3N1cywgc2EgY29uZmlndXJhdGlvbiBwYXIgZFx1MDBlOWZhdXQgZG9pdCBcdTAwZWF0cmUgdW5lIHZlcnNpb24gXHUwMGU5bGFib3JcdTAwZTllIGRlIHRvdXRlcyBsZXMgYXV0cmVzIGNvbmZpZ3VyYXRpb25zIHF1aSBzb250IGFzc29jaVx1MDBlOWVzIFx1MDBlMCBjZSBwcm9jZXNzdXMuXG5cDQotXG5cDQotU1x1MDBlOWxlY3Rpb25uZXogdW5lIGF1dHJlIGNvbmZpZ3VyYXRpb24gb3UgbW9kaWZpZXogbGUgY29udGVudSBkZSBsYSBjb25maWd1cmF0aW9uIHNcdTAwZTlsZWN0aW9ublx1MDBlOWUgZXQgclx1MDBlOWVzc2F5ZXouDQotb3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDlFIDogQ2hhcmdlbWVudCBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGltcG9zc2libGUuXG5cDQotXG5cDQotQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy4NCi1zYXZlTGlicmFyeUVycm9yX21zZz1JVVBBMDAxMEUgOiBJbXBvc3NpYmxlIGRlIHNhdXZlZ2FyZGVyIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMuDQotc2F2ZUxpYnJhcnlUb0Vycm9yX21zZz1JVVBBMDAxMEUgOiBJbXBvc3NpYmxlIGRlIHNhdXZlZ2FyZGVyIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZGFucyAnJ3swfScnLg0KLWVsZW1lbnRBbHJlYWR5RGVsZXRlZEVycm9yX21zZz1JVVBBMDAxMUUgOiBMJydcdTAwZTlsXHUwMGU5bWVudCAnJ3swfScnIGEgZFx1MDBlOWpcdTAwZTAgXHUwMGU5dFx1MDBlOSBzdXBwcmltXHUwMGU5Lg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEyRSA6IExhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgbmUgcGV1dCBwYXMgXHUwMGVhdHJlIG1pc2UgXHUwMGUwIG5pdmVhdS4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQQTAwMTZFIDogVW5lIGVycmV1ciBzJ2VzdCBwcm9kdWl0ZS5cblwNCi1cblwNCi1DbGlxdWV6IHN1ciBEXHUwMGU5dGFpbHMgcG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLg0KLWludGVybmFsRXJyb3JfcmVhc29uPUlVUEEwMDE3RSA6IFVuZSBlcnJldXIgaW50ZXJuZSBzJ2VzdCBwcm9kdWl0ZS5cblwNCi1cblwNCi1DbGlxdWV6IHN1ciBEXHUwMGU5dGFpbHMgcG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE4RSA6IFVuZSBlcnJldXIgcydlc3QgcHJvZHVpdGUgbG9ycyBkdSBjaGFyZ2VtZW50IGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy5cblwNCi1cblwNCi1DbGlxdWV6IHN1ciBEXHUwMGU5dGFpbHMgcG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLg0KLXNhdmVVcGdyYWRlZExpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMTlFIDogVW5lIGVycmV1ciBzJ2VzdCBwcm9kdWl0ZSBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBtaXNlIFx1MDBlMCBuaXZlYXUuXG5cDQotXG5cDQotQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9T3V2ZXJ0dXJlIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMuLi4NCi1zYXZpbmdMaWJyYXJ5VGFza19uYW1lPVNhdXZlZ2FyZGUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy4uLg0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9TWlzZSBcdTAwZTAgbml2ZWF1IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMuLi4NCi1sb2FkaW5nTGlicmFyeUVsZW1lbnRzVGFza19uYW1lPUNoYXJnZW1lbnQgZGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzLi4uDQotc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZT1FbnJlZ2lzdHJlbWVudCBkZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZGFucyB1biBub3V2ZWF1IGZvcm1hdCBkZSBmaWNoaWVyLi4uDQotc2F2aW5nVGFza19uYW1lPUVucmVnaXN0cmVtZW50IGRlICcnezB9JycuLi4NCi1zYXZpbmdGaWxlc1Rhc2tfbmFtZT1FbnJlZ2lzdHJlbWVudCBkZXMgZmljaGllcnMuLi4NCi1maXhpbmdDb250ZW50RGVzY3JpcHRpb25HVUlEc1Rhc2tfbmFtZT1Db3JyZWN0aW9uIGRlcyBpZGVudGlmaWNhdGV1cnMgZ2xvYmF1eCB1bmlxdWVzIGRlIGRlc2NyaXB0aW9uIGRlIGNvbnRlbnUuLi4NCi1kZWxldGluZ0ludmFsaWRSZWZlcmVuY2VzVGFza19uYW1lPVN1cHByZXNzaW9uIGRlcyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBub24gdmFsaWRlcy4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0NlcgOiBDZXR0ZSBwZXJzcGVjdGl2ZSBhIFx1MDBlOXRcdTAwZTkgc3BcdTAwZTljaWFsZW1lbnQgY29uXHUwMGU3dWUgcG91ciBtYXhpbWlzZXIgdm90cmUgYWNxdWlzIHV0aWxpc2F0ZXVyIGVuIHRlcm1lcyBkJ2V4cGxvcmF0aW9uIGRhbnMgbGEgcmVwclx1MDBlOXNlbnRhdGlvbiBIVE1MIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgZGUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy4gQXVjdW4gXHUwMGU5ZGl0ZXVyIG5lIHBldXQgeSBcdTAwZWF0cmUgYWpvdXRcdTAwZTkgb3UgYWZmaWNoXHUwMGU5Lg0KLQ0KLSMgQ2hhbmdlIEhpc3RvcnkgRGlhbG9nDQotQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZT1IaXN0b3JpcXVlIGRlcyBkZXNjcmlwdGlvbnMgZGVzIG1vZGlmaWNhdGlvbnMNCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsPUhpc3RvcmlxdWUgZGVzIG1vZGlmaWNhdGlvbnMgOg0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVsZXRlIEFjdGlvbg0KLWNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU9Q29uZmlybWVyIGxhIHN1cHByZXNzaW9uDQotY29uZmlybURlbGV0ZURpYWxvZ19tc2c9RXRlcy12b3VzIHNcdTAwZmJyIGRlIHZvdWxvaXIgc3VwcHJpbWVyICcnezB9JycgPw0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnV2l0aFJlZmVyZW5jZT1FdGVzLXZvdXMgc1x1MDBmYnIgZGUgdm91bG9pciBzdXBwcmltZXIgJyd7MH0nJyA/XG5cDQotXG5cDQotTGUocykgXHUwMGU5bFx1MDBlOW1lbnQocykgc3VpdmFudChzKSBjb250aWVudCgtdGllbm5lbnQpIGRlcyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBcdTAwZTAoYXV4KSBcdTAwZTlsXHUwMGU5bWVudChzKSBcdTAwZTAgc3VwcHJpbWVyIDogezF9DQotDQotIyBOZXcgTGlicmFyeSBEaWFsb2cNCi1lcnJvckRpYWxvZ19tZXNzYWdlPUlVUEEwMDIyRSA6IEltcG9zc2libGUgZGUgY3JcdTAwZTllciBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzICcnezB9JycuDQotZXJyb3JEaWFsb2dfZXJyb3I9SW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIHVuZSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGRhbnMgdW5lIGF1dHJlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMuDQotZXJyX25vb3BlbmxpYnJhcnk9SVVQQTAwNDBFIDogQXVjdW5lIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgb3V2ZXJ0ZS5cblwNCi1cblwNCi1VbmUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBkb2l0IFx1MDBlYXRyZSBvdXZlcnRlIHBvdXIgcXUndW4gbm91dmVhdSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZSBwdWlzc2UgXHUwMGVhdHJlIGFqb3V0XHUwMGU5LlxuXA0KLVxuXA0KLUNyXHUwMGU5ZXogdW5lIG5vdXZlbGxlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgb3Ugb3V2cmV6IHVuZSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGV4aXN0YW50ZSBldCByXHUwMGU5ZXNzYXllei4NCi1lcnJfbG9hZGluZ2xpYnJhcnk9RXJyZXVyIGRlIGNoYXJnZW1lbnQgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUNCi1tc2dfcmVsb2FkTGlicmFyeT1FcnJldXIgZCdhbm51bGF0aW9uIGRlIGwnXHUwMGU5Y2hlYyBkZSBzdXBwcmVzc2lvbi4gTGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBlbiBjb3VycyBkb2l0IFx1MDBlYXRyZSByZWNoYXJnXHUwMGU5ZS4NCi0NCi0jIFJlbG9hZCBMaWJyYXJ5IERpYWxvZw0KLXJlbG9hZERpYWxvZ19tZXNzYWdlPUxhIGJpYmxpb3RoXHUwMGU4cXVlIGRvaXQgXHUwMGVhdHJlIHJlY2hhcmdcdTAwZTllIHBvdXIgcXVlIHNvbiBcdTAwZTl0YXQgaW5pdGlhbCBzb2l0IHJlc3RhdXJcdTAwZTkuDQotcmVsb2FkRGlhbG9nX3RpdGxlPVJlY2hhcmdlciBsYSBiaWJsaW90aFx1MDBlOHF1ZQ0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlPUVycmV1ciBkZSBkXHUwMGU5cGxhY2VtZW50DQotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yTWVzc2FnZT1FcnJldXIgbG9ycyBkdSBkXHUwMGU5cGxhY2VtZW50DQotDQotIyBQcm9jZXNzIEZvcm0gRWRpdG9yDQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX3RpdGxlPUVucmVnaXN0cmVyDQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxPUNldHRlIG1vZGlmaWNhdGlvbiBhdXJhIHVuZSBpbmNpZGVuY2Ugc3VyIHRvdXMgbGVzIGRpYWdyYW1tZXMgZGUgdm90cmUgcHJvY2Vzc3VzLiBMJ1x1MDBlOWRpdGV1ciBzZXJhIHNhdXZlZ2FyZFx1MDBlOSB1bmUgZm9pcyBxdWUgdm91cyBhdXJleiBlZmZlY3R1XHUwMGU5IHZvdHJlIG1vZGlmaWNhdGlvbi4gVm91bGV6LXZvdXMgY29udGludWVyID8NCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTI9TCdcdTAwZTlkaXRldXIgc2VyYSBzYXV2ZWdhcmRcdTAwZTkgdW5lIGZvaXMgcXVlIHZvdXMgYXVyZXogZWZmZWN0dVx1MDBlOSB2b3RyZSBtb2RpZmljYXRpb24uIFZvdWxlei12b3VzIGNvbnRpbnVlciA/DQotDQotIyBDb25maWd1cmF0aW9uIFZpZXcgUGFnZQ0KLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ190aXRsZT1Db25maXJtZXIgbGEgc3VwcHJlc3Npb24NCi1jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfbWVzc2FnZT1FdGVzLXZvdXMgc1x1MDBmYnIgZGUgdm91bG9pciBzdXBwcmltZXIgbGEgdnVlICcnezB9JycgPw0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ190aXRsZT1BdmVydGlzc2VtZW50DQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvbj1Db25maWd1cmF0aW9uIDoNCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3M9VnVlcyBkZSBsYSBjb25maWd1cmF0aW9uDQotY29uZmlnVmlld1BhZ2Vfdmlld3M9VnVlcw0KLWNvbHVtbnNlbGVjdGlvbl90ZXh0PVNcdTAwZTlsZWN0aW9uIGRlIGNvbG9ubmVzIDoNCi1jb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dD1Bam91dGVyIHVuZSB2dWUuLi4NCi1jb25maWdWaWV3UGFnZV9yZW1vdmVWaWV3QnV0dG9uVGV4dD1TdXBwcmltZXIgdW5lIHZ1ZQ0KLWNvbmZpZ1ZpZXdQYWdlX21ha2VEZWZhdWx0QnV0dG9uVGV4dD1EXHUwMGU5ZmluaXIgY29tbWUgdmFsZXVyIHBhciBkXHUwMGU5ZmF1dA0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlPUlVUEEwMDIzVyA6IExhIHZ1ZSAnJ3swfScnIGV4aXN0ZSBkXHUwMGU5alx1MDBlMC4NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25UaXRsZT1WdWVzIGRlIG5hdmlnYXRpb24gcHVibGlcdTAwZTllcw0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvbk1lc3NhZ2U9U3BcdTAwZTljaWZpZXogbGVzIHZ1ZXMgcXVpIHNlcm9udCBpbmNsdXNlcyBsb3JzIGRlIGxhIHB1YmxpY2F0aW9uIGRlIGNldHRlIGNvbmZpZ3VyYXRpb24uIFBvdXIgY3JcdTAwZTllciB1bmUgdnVlLCBjbGlxdWV6IHN1ciBBam91dGVyIHVuZSB2dWUgYWZpbiBkZSBzXHUwMGU5bGVjdGlvbm5lciBuJ2ltcG9ydGUgcXVlbGxlIGNhdFx1MDBlOWdvcmllIHN0YW5kYXJkIG91IHBlcnNvbm5hbGlzXHUwMGU5ZSBkYW5zIGxhIGNvbmZpZ3VyYXRpb24uICBMYSBjYXRcdTAwZTlnb3JpZSBzXHUwMGU5bGVjdGlvbm5cdTAwZTllIHJlcHJcdTAwZTlzZW50ZXJhIGxhIHZ1ZSwgdGFuZGlzIHF1ZSBsZXMgc291cy1jYXRcdTAwZTlnb3JpZXMgZGUgbGEgY2F0XHUwMGU5Z29yaWUgZXQgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIGNvbnRlbnUgcmVwclx1MDBlOXNlbnRlcm9udCBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIGwnYXJicmUgZGUgbGEgdnVlLg0KLQ0KLSMgRGVzY3JpcHRpb24gVGFiDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU9Q29udmVydGlyIGxlIGNvbnNlaWwNCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMT1JVVBBMDA0MFcgOiBFbnJlZ2lzdHJleiBkJ2Fib3JkIGwnXHUwMGU5ZGl0ZXVyLg0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UyPUF1Y3VuIGNvbnNlaWwgbidlc3QgY29tcGF0aWJsZSBhdmVjIGNlIHR5cGUuDQotDQotY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZT1Db252ZXJ0aXIgbCdhY3Rpdml0XHUwMGU5DQotIyBBc3NvY2lhdGlvbiBGb3JtIFBhZ2UNCi1Bc3NvY2lhdGlvbkZvcm1QYWdlX0JyaWVmRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlwdGlmIGNvdXJ0IGRlIGwnXHUwMGU5bFx1MDBlOW1lbnQgc1x1MDBlOWxlY3Rpb25uXHUwMGU5IDoNCi0NCi0jIE1ldGhvZCBFbGVtZW50IERlc2NyaXB0aW9uDQotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX3RpdGxlPVNhaXNpciBsZSBub20gZGUgbCdcdTAwZTlsXHUwMGU5bWVudA0KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ19tZXNzYWdlPUxhIHpvbmUgZGUgbm9tIG5lIHBldXQgcGFzIFx1MDBlYXRyZSB2aWRlLg0KLQ0KLSMgTWV0aG9kIFBsdWctaW4gRGVzY3JpcHRpb24NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZT1TaSB2b3VzIGRcdTAwZTlzXHUwMGU5bGVjdGlvbm5leiBsZShzKSBwbHVnLWluKHMpIHJcdTAwZTlmXHUwMGU5cmVuY1x1MDBlOShzKSBhc3NvY2lcdTAwZTkocykgYXUgcGx1Zy1pbiAnJ3swfScnIGRlcyByZWxhdGlvbnMgbm9uIHZhbGlkZXMgc2Vyb250IGdcdTAwZTluXHUwMGU5clx1MDBlOWVzIGV0IHN1cHByaW1cdTAwZTllcy5cblwNCi1cblwNCi1DZXR0ZSBhY3Rpb24gbmUgcGV1dCBwYXMgXHUwMGVhdHJlIGFubnVsXHUwMGU5ZS4gVm91bGV6LXZvdXMgY29udGludWVyIGV0IGVmZmVjdHVlciBjZXR0ZSBtb2RpZmljYXRpb24gPw0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lPVZvdXMgXHUwMGVhdGVzIHN1ciBsZSBwb2ludCBkZSBjaGFuZ2VyIGxlIG5vbSBkZSBjZSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZSwgZGUgJyd7MH0nJyBhdSBwcm9maXQgZHUgbm91dmVhdSBub20gJyd7MX0nJy4gQ2V0dGUgYWN0aW9uIGVucmVnaXN0cmVyYSBjZXQgXHUwMGU5ZGl0ZXVyIGV0IHJlbm9tbWVyYSBsZSBkb3NzaWVyIGR1IHBsdWctaW4uIFZvdWxlei12b3VzIGNvbnRpbnVlciA/DQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWVfdGl0bGU9UmVub21tZXIgbGUgcGx1Zy1pbiBkZSBtXHUwMGU5dGhvZGUNCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY2Fubm90UmVuYW1lUGx1Z2luRm9sZGVyPUltcG9zc2libGUgZGUgcmVub21tZXIgbGUgZG9zc2llciBkdSBwbHVnLWluDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5MYWJlbD1WZXJyb3VpbGxlciBsZSBwbHVnLWluDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5fbWVzc2FnZT1TaSB2b3VzIHZlcnJvdWlsbGV6IGxhIG1vZGlmaWNhdGlvbiBkdSBwbHVnLWluLCBsZXMgXHUwMGU5ZGl0ZXVycyBvdXZlcnRzIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgYXBwYXJ0ZW5hbnQgYXUgcGx1Zy1pbiAnJ3swfScnIHNlcm9udCBlbnJlZ2lzdHJcdTAwZTlzIGV0IGZlcm1cdTAwZTlzLiBWb3VsZXotdm91cyBjb250aW51ZXIgZXQgZWZmZWN0dWVyIGNldHRlIG1vZGlmaWNhdGlvbiA/DQotDQotIyBQcm9jZXNzIERlc2NyaXB0aW9uDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fdGl0bGU9UmVub21tZXINCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV9tZXNzYWdlPVZvdXMgXHUwMGVhdGVzIHN1ciBsZSBwb2ludCBkZSBjaGFuZ2VyIGxlIG5vbSBkZSBjZSBwcm9jZXNzdXMuIENldHRlIG9wXHUwMGU5cmF0aW9uIGVucmVnaXN0cmVyYSBjZXQgXHUwMGU5ZGl0ZXVyIGV0IHZhIHJlbm9tbWVyIGxlIGRvc3NpZXIgZHUgcHJvY2Vzc3VzLiBWb3VsZXotdm91cyBjb250aW51ZXIgPw0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uRGVzY3JpcHRpb249RGVzY3JpcHRpb24gOg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvblRpdGxlPUNvbmZpZ3VyYXRpb24NCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlPUluZGlxdWV6IHRvdXRlcyBsZXMgY29uZmlndXJhdGlvbnMgdmFsaWRlcyBwb3VyIGNlIHByb2Nlc3N1cy4gU1x1MDBlOWxlY3Rpb25uZXogdW5lIGNvbmZpZ3VyYXRpb24gZW4gdGFudCBxdWUgY29uZmlndXJhdGlvbiBwYXIgZFx1MDBlOWZhdXQuIElsIGRvaXQgcydhZ2lyIGQndW5lIHZlcnNpb24gXHUwMGU5bGFib3JcdTAwZTllIGRlIHRvdXRlcyBsZXMgYXV0cmVzIGNvbmZpZ3VyYXRpb25zLg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9ucz1Db25maWd1cmF0aW9ucyA6DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ9KHBhciBkXHUwMGU5ZmF1dCkNCi1Qcm9jZXNzRGVzY3JpcHRpb25fc2VsZWN0Q29uZmlndXJhdGlvbj1TXHUwMGU5bGVjdGlvbm5leiBsZXMgY29uZmlndXJhdGlvbnMgXHUwMGUwIGFqb3V0ZXINCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0MD1DZXR0ZSBvcFx1MDBlOXJhdGlvbiBlbnJlZ2lzdHJlcmEgbCcnXHUwMGU5ZGl0ZXVyIGVuIGNvdXJzIGV0IGxhIG1vZGlmaWNhdGlvbiBzZXJhIGRcdTAwZTlmaW5pdGl2ZS4gRXRlcy12b3VzIHNcdTAwZmJyIGRlIHZvdWxvaXIgc3VwcHJpbWVyICcnezB9JycgPw0KLVByb2Nlc3NEZWxldGVBY3Rpb25fc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZT1MZXMgZGVzY3JpcHRldXJzIHN1aXZhbnRzIG5lIHNvbnQgcGx1cyB1dGlsaXNcdTAwZTlzIG51bGxlIHBhcnQgdW5lIGZvaXMgcXVlIGxlcyBcdTAwZTlsXHUwMGU5bWVudHMgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cyBzb250IHN1cHByaW1cdTAwZTlzLlxuXA0KLVNcdTAwZTlsZWN0aW9ubmV6IGxlcyBkZXNjcmlwdGV1cnMgcXVlIHZvdXMgc291aGFpdGV6IHN1cHByaW1lci4NCi0NCi0jIFZpZXcgSGVscGVyDQotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX3RpdGxlPVZcdTAwZTlyaWZpZXIgbGEgc2FudFx1MDBlOSBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZQ0KLXZpZXdIZWxwZXJfcGVyZm9ybUhlYWx0aENoZWNrPVZcdTAwZTlyaWZpY2F0aW9uIGRlIGxhIHNhbnRcdTAwZTkgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUuLi4NCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZT1MYSB2XHUwMGU5cmlmaWNhdGlvbiBkZSBsYSBzYW50XHUwMGU5IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIG91dmVydGUgcydlc3QgY29ycmVjdGVtZW50IHRlcm1pblx1MDBlOWUuIENvbnN1bHRleiBsZSByYXBwb3J0IGRhbnMgbGUgZmljaGllciBqb3VybmFsLg0KLQ0KLSMgQXR0YWNoIFRlbXBsYXRlIEZpbGUgRGlhbG9nDQotYXR0YWNoVGVtcGxhdGVGaWxlRGlhbG9nX3RpdGxlPUpvaW5kcmUgdW4gZmljaGllciBkZSBjYW5ldmFzDQotDQotIyBDcmVhdGUgRWxlbWVudCBFcnJvciBEaWFsb2cNCi1jcmVhdGVFbGVtZW50RGlhbG9nX3RpdGxlPUNyXHUwMGU5ZXIgdW5lIG5vdXZlbGxlIHswfQ0KLWNyZWF0ZU5ld0VsZW1lbnRFcnJvcl9tc2c9RXJyZXVyIGRlIGNyXHUwMGU5YXRpb24gZCcndW5lIG5vdXZlbGxlIHswfS4NCi0NCi1kbGdUaXRsZV9yZWxvYWRMaWJyYXJ5PVJlY2hhcmdlciBsYSBiaWJsaW90aFx1MDBlOHF1ZQ0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9yZWFzb249TGUgbm9tIGRlIGxhIHswfSBuZSBwZXV0IHBhcyBcdTAwZWF0cmUgdmlkZS5cblwNCi1cblwNCi1TcFx1MDBlOWNpZmlleiB1biBub20gdmFsaWRlIGV0IHJcdTAwZTllc3NheWV6Lg0KLWRlbGV0ZUNvbmZpZ0Vycm9yX3JlYXNvbj1MYSBjb25maWd1cmF0aW9uIGVzdCByXHUwMGU5Zlx1MDBlOXJlbmNcdTAwZTllIHBhciBsZSBwcm9jZXNzdXMgJyd7MH0nJw0KLQ0KLSMgQ2hhbmdlQm91bmRzQ29tbWFuZA0KLWdlZl9jaGFuZ2VCb3VuZHNDb21tYW5kX2xhYmVsPUNoYW5nZXIgbGVzIGJvcm5lcw0KLSMgQ2hhbmdlTmFtZUNvbW1hbmQNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw9Q2hhbmdlciBsZSBub20NCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U9SW1wb3NzaWJsZSBkJ2FubnVsZXIgbGUgY2hhbmdlbWVudCBkZSBub20uXG5cDQotXG5cDQotTCdhbm51bGF0aW9uIGR1IGNoYW5nZW1lbnQgZGUgbm9tIG4nZXN0IHBhcyBwZXJtaXNlIHNpIGxlIG5vbSBwclx1MDBlOWNcdTAwZTlkZW50IGVzdCBOVUxMLg0KLSMgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQNCi1nZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw9Q2hhbmdlciB1bmUgdmFsZXVyIGRlIHByb3ByaVx1MDBlOXRcdTAwZTkNCi0jIENyZWF0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfY3JlYXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1Dclx1MDBlOWVyIHVuIHBvaW50IGQnaW5mbFx1MDBlOWNoaXNzZW1lbnQNCi0jIENyZWF0ZUxpbmtDb21tYW5kDQotZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsPUNyXHUwMGU5YXRpb24gZCd1biBsaWVuDQotIyBDcmVhdGVOb2RlQ29tbWFuZA0KLWdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbD1Dclx1MDBlOWVyIHVuIG5vdXZlYXUgbm9ldWQNCi0jIERlbGV0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfZGVsZXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1TdXBwcmltZXIgdW4gcG9pbnQgZCdpbmZsXHUwMGU5Y2hpc3NlbWVudA0KLSMgRGVsZXRlQ29tbWFuZA0KLWdlZl9kZWxldGVDb21tYW5kX2xhYmVsPVN1cHByaW1lcg0KLSMgRGVsZXRlTGlua0NvbW1hbmQNCi1nZWZfZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw9U3VwcHJpbWVyIHVuZSBjb25uZXhpb24NCi0jIE1vdmVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX21vdmVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPURcdTAwZTlwbGFjZXIgdW4gcG9pbnQgZCdpbmZsXHUwMGU5Y2hpc3NlbWVudA0KLSMgUmVjb25uZWN0TGlua0NvbW1hbmQNCi1nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw9Ulx1MDBlOXRhYmxpciB1biBsaWVuDQotDQotIyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXINCi1nZWZfdmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1MZSBub20gbmUgcGV1dCBwYXMgXHUwMGVhdHJlIHZpZGUuIFZldWlsbGV6IGluZGlxdWVyIHVuIG5vbSB2YWxpZGUuDQotIyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9TGUgbm9tIG5lIHBldXQgcGFzIFx1MDBlYXRyZSB2aWRlLiBWZXVpbGxleiBpbmRpcXVlciB1biBub20gdmFsaWRlLg0KLSMgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQNCi1nZWZfd29ya1Byb2R1Y3ROb2RlRWRpdFBhcnRfdmFsaWRhdGVNZXNzYWdlPUxlIG5vbSBuZSBwZXV0IHBhcyBcdTAwZWF0cmUgdmlkZS4gVmV1aWxsZXogaW5kaXF1ZXIgdW4gbm9tIHZhbGlkZS4NCi0NCi0jIEVsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbg0KLWFjdGlvbnNfRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uX21lc3NhZ2U9TGEgY29uZmlndXJhdGlvbiAnJ3swfScnIG5lIHBldXQgcGFzIFx1MDBlYXRyZSBzdXBwcmltXHUwMGU5ZSBjYXIgZWxsZSBlc3QgZW4gY291cnMgZCcndXRpbGlzYXRpb24gcGFyIGxlIHByb2Nlc3N1cyAnJ3sxfScnLg0KLQ0KLSMgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JUaXRsZT1FcnJldXIgZGUgc3VwcHJlc3Npb24NCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvck1lc3NhZ2U9RXhjZXB0aW9uIG5vbiBnXHUwMGU5clx1MDBlOWUNCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclJlYXNvbj1BZmZpY2hlciBsZXMgZFx1MDBlOXRhaWxzDQotDQotIyBNZXRob2RFbGVtZW50RWRpdG9yDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclRpdGxlPUVycmV1ciBkZSBzYXV2ZWdhcmRlDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UxPUlVUEEwMDIwRSA6IEVycmV1ciBkZSBzYXV2ZWdhcmRlIGR1IGZpY2hpZXINCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI9RXJyZXVyIGRlIHZhbGlkYXRpb24NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMT1BZmZpY2hlciBsZSBmaWNoaWVyIGpvdXJuYWwgcG91ciBwbHVzIGRlIGRcdTAwZTl0YWlscw0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24yPUFmZmljaGVyIGxlcyBkXHUwMGU5dGFpbHMNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JUaXRsZT1FcnJldXIgZGUgcmVub21tYWdlDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JNc2c9VW4gb3UgcGx1c2lldXJzIGZpY2hpZXJzIGRlIGNldCBcdTAwZTlkaXRldXIgb250IFx1MDBlOXRcdTAwZTkgc3VwcHJpbVx1MDBlOXMuIEwnXHUwMGU5ZGl0ZXVyIG4nZXN0IHBsdXMgdmFsaWRlIGV0IGRvaXQgc2UgZmVybWVyLg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yVGl0bGU9RWRpdGV1ciBub24gdmFsaWRlDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yTWVzc2FnZTE9RXJyZXVyIGRlIHJlbm9tbWFnZSBkdShkZXMpIGZpY2hpZXIocykgJyd7MH0nJw0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLXJlbmFtZUVycm9yX3RpdGxlPVJlbm9tbWVyIHVuIFx1MDBlOWxcdTAwZTltZW50DQotcmVuYW1lRXJyb3JfbXNnPUlVUEEwMDEzRSA6IEltcG9zc2libGUgZGUgdGVybWluZXIgbCdvcFx1MDBlOXJhdGlvbiBkZSByZW5vbW1hZ2UuDQotU2VsZWN0RWxlbWVudERpYWxvZ19zZWxlY3RlbGVtZW50X3RleHQ9U1x1MDBlOWxlY3Rpb25uZXogdW4gXHUwMGU5bFx1MDBlOW1lbnQNCi0NCi0jIEVkaXRvckNob29zZXINCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfdGl0bGU9T3V2cmlyIGwnXHUwMGU5ZGl0ZXVyIGRlIG1cdTAwZTl0aG9kZXMNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Rlc2NyaXB0aW9uTGFiZWw9RGVzY3JpcHRpb24gOg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbD1TXHUwMGU5bGVjdGlvbm5lciB0b3V0DQotT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZV9lZGl0X3RleHQwPU1vZGlmaWVyIHVuIFx1MDBlOWxcdTAwZTltZW50DQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNFIDogSW1wb3NzaWJsZSBkJ291dnJpciBsJ1x1MDBlOWRpdGV1ciBhc3NvY2lcdTAwZTkgXHUwMGUwIGwnXHUwMGU5bFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlIHNcdTAwZTlsZWN0aW9ublx1MDBlOS4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZT1TXHUwMGU5bGVjdGlvbm5lciB1biBmaWNoaWVyIGltYWdlDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeU5hbWU9Tm91dmVsbGUgYmlibGlvdGhcdTAwZThxdWUNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlwdGlvbiA6DQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249U1x1MDBlOWxlY3Rpb25uZXogdW5lIG91IHBsdXNpZXVycyBjb25maWd1cmF0aW9ucyBkZSBtXHUwMGU5dGhvZGUgZXQgY2xpcXVleiBzdXIgVGVybWluZXIgcG91ciBsZXMgb3V2cmlyLg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsPURcdTAwZTlzXHUwMGU5bGVjdGlvbm5lciB0b3V0DQotRWxlbWVudHNWaWV3X21pZ3JhdGlvbl9kaXJfZGxnX2Rlc2NyaXB0aW9uX3RleHQ9U3BcdTAwZTljaWZpZXogbGUgclx1MDBlOXBlcnRvaXJlIGRlcyB7MH0gclx1MDBlOWNlbW1lbnQgbWlnclx1MDBlOXMgcG91ciByZW1wbGFjZXIgbGVzIHswfSBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3JlYXNvbj1VbmUgZXJyZXVyIHN5c3RcdTAwZThtZSBzJ2VzdCBwcm9kdWl0ZS4gQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy5cblwNCi1cblwNCi1GZXJtZXogdW5lIHBhcnRpZSBkZXMgXHUwMGU5ZGl0ZXVycyBvdXZlcnRzIGV0IHJcdTAwZTllc3NheWV6Lg0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU9TCdpbWFnZSBlc3Qgbm9uIHZhbGlkZQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzFFIDogTGEgdGFpbGxlIGRlIGwnJ2ltYWdlICcnezB9Jycgc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZSBkXHUwMGU5cGFzc2UgbGEgdGFpbGxlIGF1dG9yaXNcdTAwZTllICh7MX0gcGFyIHsyfSkuIFNcdTAwZTlsZWN0aW9ubmV6IHVuZSBhdXRyZSBpbWFnZS4NCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGU9TCdpbWFnZSBlc3Qgbm9uIHZhbGlkZQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMkUgOiBMZSBmaWNoaWVyICcnezB9Jycgc1x1MDBlOWxlY3Rpb25uXHUwMGU5IG4nJ2V4aXN0ZSBwYXMuIFNcdTAwZTlsZWN0aW9ubmV6IHVuZSBhdXRyZSBpbWFnZS4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9U1x1MDBlOWxlY3Rpb25uZXIuLi4NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5RGVzY3JpcHRpb249RGVzY3JpcHRpb24gZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1EZXNjcmlwdGlvbiBkZSBsYSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlRGVzY3JpcHRpb249VG91cyBsZXMgXHUwMGU5ZGl0ZXVycyBkb2l2ZW50IFx1MDBlYXRyZSBmZXJtXHUwMGU5cy4gU1x1MDBlOWxlY3Rpb25uZXogY2V1eCBxdWkgZG9pdmVudCBcdTAwZWF0cmUgZW5yZWdpc3RyXHUwMGU5cyBlbiBwcmVtaWVyLCBzaSBhcHBsaWNhYmxlLg0KLQ0KLSMgVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2UNCi1mb3Jtc19UZW1wbGF0ZURlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPUxlIGZpY2hpZXIgc1x1MDBlOWxlY3Rpb25uXHUwMGU5IGVzdCBkXHUwMGU5alx1MDBlMCB1bmUgcGlcdTAwZThjZSBqb2ludGUgZGUgY2UgY2FuZXZhcy4NCi0NCi0jIE5ldyBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLW5ld0xpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFIDogSW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMuDQotbmV3TGlicmFyeUVycm9yX3JlYXNvbjE9TGUgY2hlbWluIGRlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgaW5kaXF1XHUwMGU5ICcnezB9JycgZXN0IG5vbiB2YWxpZGUuDQotbmV3TGlicmFyeUVycm9yX3JlYXNvbjI9VW5lIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZXhpc3RlIGRcdTAwZTlqXHUwMGUwIGRhbnMgJyd7MH0nJy4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMz1JbXBvc3NpYmxlIGRlIGNyXHUwMGU5ZXIgbGUgZG9zc2llciBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzICcnezB9JycgaW5kaXF1XHUwMGU5Lg0KLW5ld0xpYnJhcnlFcnJvcl9hZHZpY2U9Q2xpcXVleiBzdXIgT0sgcG91ciBzYWlzaXIgdW4gYXV0cmUgbm9tIG91IHVuIGF1dHJlIGNoZW1pbiBwb3VyIGNldHRlIGJpYmxpb3RoXHUwMGU4cXVlLg0KLQ0KLSNQcm9jZXNzIGxpdGVyYWxzDQotUHJvY2Vzc19FeHRlcm5hbElEPUlkZW50aWZpY2F0ZXVyIGV4dGVybmUgOg0KLVByb2Nlc3NfUHVycG9zZT1PYmpldCA6DQotUHJvY2Vzc19TY29wZT1Qb3J0XHUwMGU5ZSA6DQotUHJvY2Vzc19Vc2FnZU5vdGVzPU5vdGVzIGQndXRpbGlzYXRpb24gOg0KLVByb2Nlc3NfQWx0ZXJuYXRpdmVzPUFsdGVybmF0aXZlcyA6DQotUHJvY2Vzc19Ib3dUb1N0YWZmPURvdGF0aW9uIGVuIHBlcnNvbm5lbCA6DQotUHJvY2Vzc19LZXlDb25zaWRlcmF0aW9uPUNvbnNpZFx1MDBlOXJhdGlvbnMgY2xcdTAwZTlzIDoNCi1Qcm9jZXNzX1NjYWxlPUVjaGVsbGUgOg0KLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1DYXJhY3RcdTAwZTlyaXN0aXF1ZXMgZHUgcHJvamV0IDoNCi1Qcm9jZXNzX1Jpc2tMZXZlbD1OaXZlYXUgZGUgcmlzcXVlIDoNCi1Qcm9jZXNzX0VzdGltYXRpbmdUZWNobmlxdWU9VGVjaG5pcXVlcyBkJ2VzdGltYXRpb24gOg0KLVByb2Nlc3NfUHJvamVjdE1lbWJlckV4cGVydGlzZT1FeHBlcnRpc2UgZHUgbWVtYnJlIGRlIHByb2pldCA6DQotUHJvY2Vzc19UeXBlT2ZDb250cmFjdD1UeXBlIGRlIGNvbnRyYXQgOg0KLQ0KLSMgRWRpdG9yIFByZXZpZXcgTmF2aWdhdGlvbiBCdXR0b25zDQotYmFja0J1dHRvbl90ZXh0PVJldG91cg0KLWZvcndhcmRCdXR0b25fdGV4dD1TdWl2YW50DQotZm9yd2FyZF90ZXh0PVN1aXZhbnQNCi1zdG9wQnV0dG9uX3RleHQ9QXJyXHUwMGVhdA0KLXJlZnJlc2hCdXR0b25fdGV4dD1BY3R1YWxpc2VyDQotcmVmcmVzaF90ZXh0PUFjdHVhbGlzZXINCi1uZXduYW1lX3RleHQ9Tm91dmVhdSBub20gOg0KLXByaW50QnV0dG9uX3RleHQ9SW1wcmltZXINCi0NCi0jIENvbnRleHQgbWVudXMNCi1fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW09JkFjdHVhbGlzZXINCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT0mQWZmaWNoZXIgbGVzIHByb3ByaVx1MDBlOXRcdTAwZTlzDQotDQotX1VJX01ldGhvZEVkaXRvcl9tZW51PSZFZGl0ZXVyIGRlIG1cdTAwZTl0aG9kZQ0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jk5vdXZlYXUNCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZvdXZlYXUgZnJcdTAwZThyZS9zb2V1cg0KLQ0KLV9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsPVNcdTAwZTlsZWN0aW9uDQotX1VJX1BhcmVudFBhZ2VfbGFiZWw9UGFyZW50DQotX1VJX0xpc3RQYWdlX2xhYmVsPUxpc3RlDQotX1VJX1RyZWVQYWdlX2xhYmVsPUFyYnJlDQotX1VJX1RhYmxlUGFnZV9sYWJlbD1UYWJsZQ0KLV9VSV9UYWJsZVRyZWVQYWdlX2xhYmVsPVRhYmxlVHJlZQ0KLV9VSV9PYmplY3RDb2x1bW5fbGFiZWw9T2JqZXQNCi1fVUlfU2VsZkNvbHVtbl9sYWJlbD1BdXRvDQotDQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9QXVjdW5lIHNcdTAwZTlsZWN0aW9uDQotX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkPU9iamV0IHNcdTAwZTlsZWN0aW9ublx1MDBlOSA6IHswfQ0KLV9VSV9NdWx0aU9iamVjdFNlbGVjdGVkPU9iamV0cyB7MH0gc1x1MDBlOWxlY3Rpb25uXHUwMGU5cw0KLQ0KLV9VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWw9T3V2cmlyIGwnXHUwMGU5ZGl0ZXVyDQotDQotX1VJX1dpemFyZF9jYXRlZ29yeT1FeGVtcGxlcyBkJ2Fzc2lzdGFudHMgZGUgY3JcdTAwZTlhdGlvbiBkZSBtb2RcdTAwZThsZSBFTUYNCi0NCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfbGFiZWw9TW9kXHUwMGU4bGUgZGUgbVx1MDBlOXRob2RlDQotX1VJX01ldGhvZE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uPUNyXHUwMGU5ZXogdW4gbm91dmVhdSBtb2RcdTAwZThsZSBkZSBtXHUwMGU5dGhvZGUNCi0NCi1fVUlfTWV0aG9kRWRpdG9yX2xhYmVsPUVkaXRldXIgZGUgbW9kXHUwMGU4bGUgZGUgbVx1MDBlOXRob2RlDQotDQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2U9TWENCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVFeHRlbnNpb249bVx1MDBlOXRob2RlDQotDQotX1VJX1dpemFyZF9sYWJlbD1Ob3V2ZWF1DQotDQotX1dBUk5fRmlsZW5hbWVFeHRlbnNpb249TGUgbm9tIGRlIGZpY2hpZXIgZG9pdCBzZSB0ZXJtaW5lciBwYXIgJycuezB9JycNCi0NCi1fVUlfTW9kZWxPYmplY3Q9T2JqZXQgZGUgbW9kXHUwMGU4bGUNCi1fVUlfWE1MRW5jb2Rpbmc9RW5jb2RhZ2UgWE1MDQotX1VJX1hNTEVuY29kaW5nQ2hvaWNlcz1VVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQ0KLV9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb249U1x1MDBlOWxlY3Rpb25uZXogdW4gb2JqZXQgZGUgbW9kXHUwMGU4bGUgXHUwMGUwIGNyXHUwMGU5ZXINCi0NCi1fVUlfRmlsZUNvbmZsaWN0X2xhYmVsPUNvbmZsaXQgZGUgZmljaGllcnMNCi1fV0FSTl9GaWxlQ29uZmxpY3Q9Q2VydGFpbmVzIG1vZGlmaWNhdGlvbnMgbm9uIGVucmVnaXN0clx1MDBlOWVzIHNvbnQgZW4gY29uZmxpdCBhdmVjIGRlcyBtb2RpZmljYXRpb25zIGVmZmVjdHVcdTAwZTllcyBlbiBkZWhvcnMgZGUgbCdcdTAwZTlkaXRldXIuIFZvdWxlei12b3VzIFx1MDBlOWxpbWluZXIgbGVzIG1vZGlmaWNhdGlvbnMgZWZmZWN0dVx1MDBlOWVzIGRhbnMgY2V0IFx1MDBlOWRpdGV1ciA/DQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1hZGRMaW5rRGlhbG9nX2xpbmtUeXBlPVR5cGUgOg0KLW9wZW5MaW5rQ2hlY2tib3hfdGV4dD1PdXZyZXogbGUgbGllbiBkYW5zIHVuZSBmZW5cdTAwZWF0cmUgZGUgbmF2aWdhdGV1ciBkaXN0aW5jdGUNCi0NCi0jIEFkZCBJbWFnZSBEaWFsb2cNCi1oZWlnaHRMYWJlbF90ZXh0PUhhdXRldXIgOg0KLXdpZHRoTGFiZWxfdGV4dD1MYXJnZXVyIDoNCi1FbGVtZW50c1ZpZXdfMjA9cGF0dGVybiBkZSBjYXBhY2l0XHUwMGU5DQotRWxlbWVudHNWaWV3XzIxPXByb2Nlc3N1cyBkZSBsaXZyYWlzb24NCi1FbGVtZW50c1ZpZXdfMjI9cHJvY2Vzc3VzDQotRWxlbWVudHNWaWV3XzM1PXswfSBlc3QgZW4gbGVjdHVyZSBzZXVsZW1lbnQuIEF2YW50IGRlIGNvbnRpbnVlciwgZmFpdGVzIGVuIHNvcnRlIHF1JydpbCBzb2l0IG1vZGlmaWFibGUuDQotRWxlbWVudHNWaWV3XzM2PUVycmV1ciBkZSBjaGFyZ2VtZW50IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlDQotYWx0VGFnTGFiZWxfdGV4dD1CYWxpc2UgQUxUIDoNCi1pbWFnZVNpemVMYWJlbF90ZXh0PUxhIGhhdXRldXIgZXQgbGEgbGFyZ2V1ciBkZSBsJ2ltYWdlIGRvaXZlbnQgXHUwMGVhdHJlIGNvbXByaXNlcyBlbnRyZSAxMCBldCA2MDAuIExlcyBoYXV0ZXVycyBldCBsYXJnZXVycyBub24gdmFsaWRlcyBzZXJvbnQgY29udmVydGllcyBlbiB1bmUgdGFpbGxlIGFkYXB0XHUwMGU5ZS4NCi0NCi0jIFByb2Nlc3MgRWRpdG9yDQotUHJvY2Vzc0VkaXRvcj1FZGl0ZXVyIGRlIHByb2Nlc3N1cw0KLVByb2Nlc3NFZGl0b3JfTmFtZT1Ob20NCi1Qcm9jZXNzRWRpdG9yX1ByZXNlbnRhdGlvbk5hbWU9Tm9tIGRlIHByXHUwMGU5c2VudGF0aW9uDQotUHJvY2Vzc0VkaXRvcl9JbmRleD1JbmRleA0KLVByb2Nlc3NFZGl0b3JfUHJlZGVjZXNzb3JzPVByXHUwMGU5ZFx1MDBlOWNlc3NldXJzDQotI0NvbmZpZ3VyYXRpb25QYWdlX1NlbGVjdGVkPVNlbGVjdGVkOiANCi1DaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbj1TXHUwMGU5bGVjdGlvbm5leiB1biBcdTAwZTlsXHUwMGU5bWVudCBkZSB2XHUwMGU5cmlmaWNhdGlvbiBldCBjbGlxdWV6IHN1ciBIYXV0IG91IEJhcyBwb3VyIGNoYW5nZXIgc2EgcG9zaXRpb24uDQotRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQ9UmVub21tYWdlLi4uDQotUHJvY2Vzc0VkaXRvcl9Nb2RlbEluZm89SW5mb3JtYXRpb25zIHJlbGF0aXZlcyBhdSBtb2RcdTAwZThsZQ0KLVByb2Nlc3NFZGl0b3JfUHJlZml4PVByXHUwMGU5Zml4ZQ0KLU1vdmVEaWFsb2dfbW92ZV90ZXh0PURcdTAwZTlwbGFjZXINCi1DaGVja2xpc3RPcmRlcl90aXRsZT1DbGFzc2VyIGxlcyBcdTAwZTlsXHUwMGU5bWVudHMgZGUgdlx1MDBlOXJpZmljYXRpb24NCi1Qcm9jZXNzRWRpdG9yX1JlcGV0YWJsZT1SXHUwMGU5aXRcdTAwZTlyYWJsZQ0KLVByb2Nlc3NFZGl0b3JfT25nb2luZz1FbiBjb3Vycw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N5bmNocm9uaXphdGlvbj1TeW5jaHJvbmlzYXRpb24uLi4NCi1Qcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuPUNvbW1hbmRcdTAwZTkgcGFyIGxlcyBcdTAwZTl2XHUwMGU5bmVtZW50cw0KLVByb2Nlc3NFZGl0b3JfRGVsaXZlcmFibGU9TGl2cmFibGUNCi1Qcm9jZXNzRWRpdG9yX09wdGlvbmFsPUZhY3VsdGF0aWYNCi1GaWx0ZXJEaWFsb2dfVHlwZV90ZXh0PVR5cGUgZCdcdTAwZTlsXHUwMGU5bWVudCBkZSBtXHUwMGU5dGhvZGUgOg0KLUZpbHRlckRpYWxvZ19FeHBhbmRBbGw9VG91dCBkXHUwMGU5dmVsb3BwZXINCi1Nb3ZlRGlhbG9nX21vdmluZ190ZXh0PURcdTAwZTlwbGFjZW1lbnQuLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25XYXJuaW5nPUlVUEEwMDI1VyA6IEwnJ2ljXHUwMGY0bmUgRm9ybWUgcG91ciB7MH0gZXN0IGludHJvdXZhYmxlIGRhbnMgbGUgY2hlbWluIDogezF9DQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uRXJyb3I9SVVQQTAwMjVFIDogRXJyZXVyIDogU2VjdGlvbiBkZSBsJydpY1x1MDBmNG5lIEZvcm1lIDogezB9DQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9OYW1lTGFiZWw9Tm9tIDoNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPUNyXHUwMGU5ZXIgdW5lIG5vdXZlbGxlIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX05hbWVMYWJlbD1Ob20gOg0KLUF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU9Tm91dmVsbGUgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdMaWJyYXJ5TWFpblBhZ2VfcGFnZVRpdGxlPUNyXHUwMGU5ZXIgdW5lIG5vdXZlbGxlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMNCi1uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlPU5vdXZlbGxlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMNCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZVRpdGxlPUVucmVnaXN0cmVyIGxlcyBtb2RpZmljYXRpb25zDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1TcFx1MDBlOWNpZmlleiB1biBub20sIHVuZSBkZXNjcmlwdGlvbiBldCB1biByXHUwMGU5cGVydG9pcmUgZGUgZGVzdGluYXRpb24gcG91ciBsYSBub3V2ZWxsZSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzLg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb249VW4gb3UgcGx1c2lldXJzIFx1MDBlOWxcdTAwZTltZW50cyBkZSBtXHUwMGU5dGhvZGUgb250IFx1MDBlOXRcdTAwZTkgbW9kaWZpXHUwMGU5cy4gU1x1MDBlOWxlY3Rpb25uZXogY2V1eCBxdWkgZG9pdmVudCBcdTAwZWF0cmUgZW5yZWdpc3RyXHUwMGU5cy4NCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1PdXZyaXIgZGVzIGNvbmZpZ3VyYXRpb25zIGRlIG1cdTAwZTl0aG9kZQ0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlPU91dnJpciBkZXMgY29uZmlndXJhdGlvbnMgZGUgbVx1MDBlOXRob2RlDQotRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ9UmVtcGxhY2VtZW50IGRlIHswfS4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uV2FybmluZz1JVVBBMDAyNlcgOiBMJydpY1x1MDBmNG5lIGRlIG5vZXVkIGRlIHswfSBlc3QgaW50cm91dmFibGUgZGFucyBsZSBjaGVtaW4gOiB7MX0NCi1NZXNzYWdlTGFiZWxQcm92aWRlcl91bnNlbGVjdGVkcGFja2FnZXM9Jyd7MH0nJyBjb250aWVudCBkZXMgXHUwMGU5bFx1MDBlOW1lbnRzIHF1aSByXHUwMGU5Zlx1MDBlOXJlbmNlbnQgZGVzIFx1MDBlOWxcdTAwZTltZW50cyBkYW5zIGRlcyBwYWNrYWdlcyBub24gc1x1MDBlOWxlY3Rpb25uXHUwMGU5cw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3I9SVVQQTAwMjZFIDogRXJyZXVyIDogU2VjdGlvbiBkZSBsJydpY1x1MDBmNG5lIGRlIG5vZXVkIDogezB9DQotU3RlcHNPcmRlckRpYWxvZ19zdGVwcz1FdGFwZXMgOiANCi1TdGVwc09yZGVyRGlhbG9nX3RpdGxlPUNsYXNzZXIgbGVzIFx1MDBlOXRhcGVzIGRlIHRcdTAwZTJjaGUNCi1Qcm9jZXNzRWRpdG9yX1BsYW5uZWQ9UGxhbmlmaVx1MDBlOQ0KLXNwZWNpZnlkaXJlY3RvcnlfdGV4dD1TcFx1MDBlOWNpZmlleiB1biByXHUwMGU5cGVydG9pcmUgcG91ciBlbnJlZ2lzdHJlciBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGRhbnMNCi1Qcm9jZXNzRWRpdG9yX011bHRpcGxlT2NjdXJyZW5jZXM9UGx1c2lldXJzIG9jY3VycmVuY2VzDQotUHJvY2Vzc0VkaXRvcl9FbnRyeVN0YXRlPUV0YXQgZCdlbnRyXHUwMGU5ZQ0KLVByb2Nlc3NFZGl0b3JfRXhpdFN0YXRlPUV0YXQgZGUgc29ydGllDQotc2VsZWN0Q29sdW1uc3RvQWRkX3RleHQ9U1x1MDBlOWxlY3Rpb25uZXogbGVzIGNvbG9ubmVzIFx1MDBlMCBham91dGVyDQotUHJvY2Vzc0VkaXRvcl9UeXBlPVR5cGUNCi1Qcm9jZXNzRWRpdG9yX1RlYW09RXF1aXBlDQotRmlsdGVyRGlhbG9nX3RpdGxlPVNcdTAwZTlsZWN0aW9ubmVyIGxhIGJvXHUwMGVldGUgZGUgZGlhbG9ndWUgOiANCi0NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGQ9QWpvdXRlciBcdTAwZTAgcGFydGlyIGR1IGNvbnRlbnUgZGUgbGEgJm1cdTAwZTl0aG9kZS4uLg0KLUZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbD1Ub3V0IGNvbmRlbnNlcg0KLU9wZW5DaGVhdHNoZWV0Vmlld190aXRsZT1PdXZyaXIgbGEgdnVlIEFpZGUtbVx1MDBlOW1vaXJlDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwPUZhaXJlIGRcdTAwZTlmaWxlciB2ZXJzIGxlIGhhdXQNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsRG93bj1GYWlyZSBkXHUwMGU5ZmlsZXIgdmVycyBsZSBiYXMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA9RFx1MDBlOXBsJmFjZXIgdmVycyBsZSBoYXV0DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZURvd249RFx1MDBlOXBsYWNlciB2ZXJzIGxlIGJhJnMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWw9RFx1MDBlOWMmb3V2cmlyDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29weT0mQ29weS4uLg0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ9UGF0dGVybnMgZGUgbm9tcyAobGVzIG5vbXMgY29ycmVzcG9uZGFudHMgc2Vyb250IGFmZmljaFx1MDBlOXMpIDogDQotTWV0aG9kTGlicmFyeUVkaXRvcl90aXRsZT1CaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIDogDQotI01lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ9U2VsZWN0ZWQ6IA0KLU1lc3NhZ2VWaWV3X2Vycm1zZ190ZXh0PURlc2NyaXB0aW9uDQotRWxlbWVudHNWaWV3X2Vycl9zYXZpbmc9SVVQQTAwMjdFIDogRXJyZXVyIGRlIHNhdXZlZ2FyZGUgZGUgJyd7MH0nJ3sxfQ0KLQ0KLWVycl9jb3B5aW5nX2ZpbGVfdGl0bGU9RXJyZXVyIGRlIGNvcGllIGRlIGZpY2hpZXINCi1lcnJfY29weWluZ19maWxlX2Vycm9yPUlVUEEwMDI4RSA6IEltcG9zc2libGUgZCdhZmZlY3RlciBsJ2ljXHUwMGY0bmUuIA0KLWVycl9jb3B5aW5nX2ZpbGVfcmVhc29uPVVuZSBlcnJldXIgcydlc3QgcHJvZHVpdGUgbG9ycyBkZSBsYSBjb3BpZSBkdSBmaWNoaWVyIHNcdTAwZTlsZWN0aW9ublx1MDBlOS4gQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy4NCi1lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlPUVycmV1ciBkZSB0cmFpdGVtZW50IGRlIGZpY2hpZXINCi1lZGl0Q29uZmlndXJhdGlvbl90b29sdGlwPU1vZGlmaWVyIGxhIGNvbmZpZ3VyYXRpb24NCi1lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQ9SVVQQTAwMTVFIDogSW1wb3NzaWJsZSBkZSBtb2RpZmllciBsJ1x1MDBlOWxcdTAwZTltZW50DQotU2F2ZVRoaXNBY3Rpb25fc2F2ZW9iamVjdD1TYXV2ZWdhcmRlciBjZXQgb2JqZXQuLi4NCi1FbGVtZW50c1ZpZXdfcmVwbGFjZV90ZXh0PVJlbXBsYWNlcg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0V4dGVuZD0mRXRlbmRyZS4uLg0KLU1vdmVEaWFsb2dfZGVzdGluYXRpb25fdGV4dD1DaG9pc2lzc2V6IGxhIGRlc3RpbmF0aW9uIGR1KGRlcykgXHUwMGU5bFx1MDBlOW1lbnQocykgc1x1MDBlOWxlY3Rpb25uXHUwMGU5KHMpIDoNCi1jaG9vc2VEZWZhdWx0RGlyZWN0b3J5X3RleHQ9Q2hvaXNpc3NleiB1biByXHUwMGU5cGVydG9pcmUgcGFyIGRcdTAwZTlmYXV0IHBvdXIgbGVzIGJpYmxpb3RoXHUwMGU4cXVlcyA6DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3M9JlN1cHByaW1lcg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzMj0mT3B0aW9ucyBkZSBwdWJsaWNhdGlvbi4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0Fzc2lnblVzZXJEaWFncmFtPSZEaWFncmFtbWVzIHBlcnNvbm5hbGlzXHUwMGU5cy4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ190aXRsZT1BZmZlY3RlciBkZXMgZGlhZ3JhbW1lcyBwZXJzb25uYWxpc1x1MDBlOXMNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRJbWFnZT1EaWFncmFtbWUgZCdhY3Rpdml0XHUwMGU5IDoNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRkSW1hZ2U9RGlhZ3JhbW1lIGRcdTAwZTl0YWlsbFx1MDBlOSBkJ2FjdGl2aXRcdTAwZTkgOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1EaWFncmFtbWUgZGUgZFx1MDBlOXBlbmRhbmNlIGRlIHByb2R1aXQgOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19ub3RhRmlsZT1JVVBBMDAwNEUgOiBMZSBjaGVtaW4gaW5kaXF1XHUwMGU5IG4nZXN0IHBhcyB1biBmaWNoaWVyLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b249U1x1MDBlOWxlY3Rpb25uZXIuLi4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfZW50ZXJlZEltYWdlTm90Rm91bmQ9SVVQQTAwMjRFIDogTCdpbWFnZSBzcFx1MDBlOWNpZmlcdTAwZTllIG4nZXhpc3RlIHBhcyBkYW5zIGxhIGJpYmxpb3RoXHUwMGU4cXVlLiBBc3N1cmV6LXZvdXMgZCdhdm9pciBiaWVuIHNhaXNpIGxlIGNoZW1pbiBwYXIgcmFwcG9ydCBhdSByXHUwMGU5cGVydG9pcmUgcmFjaW5lIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ9SVVQQTAwMzBFIDogTCdpbWFnZSBxdWUgdm91cyBhdmV6IHNcdTAwZTlsZWN0aW9ublx1MDBlOWUgbidleGlzdGUgcGFzIGRhbnMgbGEgYmlibGlvdGhcdTAwZThxdWUuDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFESW1hZ2U9VXRpbGlzZXIgbCdpbWFnZSBkdSBkaWFncmFtbWUgZCdhY3Rpdml0XHUwMGU5IHBvdXIgbCdleHBsb3JhdGlvbiBldCBsYSBwdWJsaWNhdGlvbg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBRERJbWFnZT1VdGlsaXNlciBsJ2ltYWdlIGR1IGRpYWdyYW1tZSBkXHUwMGU5dGFpbGxcdTAwZTkgZCdhY3Rpdml0XHUwMGU5IHBvdXIgbCdleHBsb3JhdGlvbiBldCBsYSBwdWJsaWNhdGlvbg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VXUERJbWFnZT1VdGlsaXNlciBsJ2ltYWdlIGR1IGRpYWdyYW1tZSBkZSBkXHUwMGU5cGVuZGFuY2UgZGUgcHJvZHVpdCBwb3VyIGwnZXhwbG9yYXRpb24gZXQgbGEgcHVibGljYXRpb24NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db250cmlidXRlPUNvbnRyaWJ1dGlvbiBsb2NhbGUNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXBsYWNlPVJlbXBsYWNlbWVudCBsb2NhbA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0RpYWdyYW1zPURpYSZncmFtbWVzDQotUHJvY2Vzc0VkaXRvcl9hY3Rpb25fZGVlcENvcHk9JkNvcGllIHByb2ZvbmRlLi4uDQotRmlsdGVyRGlhbG9nX0JyaWVmRGVzY3JpcHRpb249RGVzY3JpcHRpZiBjb3VydCA6DQotQ29uZmlndXJhdGlvblBhZ2VfaGlkZVRvb2xUaXA9QWZmaWNoZXIvTWFzcXVlciBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIG5vbiB2XHUwMGU5cmlmaVx1MDBlOXMNCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbj1EZXNjcmlwdGlvbiA6DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NBbGw9UmllbiBwdWJsaWVyDQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb249TGVzIHBhdHRlcm5zIHNvbnQgc1x1MDBlOXBhclx1MDBlOXMgcGFyIHVuZSB2aXJndWxlLCBvXHUwMGY5ICogPSBuJ2ltcG9ydGUgcXVlbGxlIGNoYVx1MDBlZW5lLCA/ID0gbidpbXBvcnRlIHF1ZWwgY2FyYWN0XHUwMGU4cmUNCi1Db25maWd1cmF0aW9uUGFnZV9UcmVlVGl0bGVMYWJlbD1Db250ZW51IDoNCi1Db25maWd1cmF0aW9uUGFnZV9Mb2FkaW5nTWVzc2FnZT1DaGFyZ2VtZW50IGRlIGxhIGNvbmZpZ3VyYXRpb24sIHZldWlsbGV6IHBhdGllbnRlci4uLg0KLU1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0PUxhIGRlc3RpbmF0aW9uIGRlIGRcdTAwZTlwbGFjZW1lbnQgaW5kaXF1XHUwMGU5ZSBlc3Qgbm9uIHZhbGlkZS4NCi1Nb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uPUlVUEEwMDM0RSA6IExhIGRlc3RpbmF0aW9uIHNcdTAwZTlsZWN0aW9ublx1MDBlOWUgbmUgcGV1dCBwYXMgXHUwMGVhdHJlIG1vZGlmaVx1MDBlOWUuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsQWxsPVB1YmxpZXIgdG91dA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5CYXNlQWN0aXZpdHk9T3V2cmlyIHVuZSBhY3Rpdml0XHUwMGU5IGRlIGJhc2UNCi1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPUUmdGVuZHJlIHRvdXQNCi1Qcm9jZXNzRm9ybUVkaXRvcl9jb2xsYXBzZUFsbEFjdGlvbkxhYmVsPVJcdTAwZTkmZHVpcmUgdG91dA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURpYWdyYW09T3V2cmlyIHVuIGRpYWdyYW1tZSBkJyZhY3Rpdml0XHUwMGU5DQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbD1MZXMgZGVzY3JpcHRldXJzIG5vbiBzdXBwcmltXHUwMGU5cyByXHUwMGU5cGVydG9yaVx1MDBlOXMgZGFucyBsYSBsaXN0ZSBEXHUwMGU5dGFpbHMgZG9pdmVudCBcdTAwZWF0cmUgc3VwcHJpbVx1MDBlOXMgYWZpbiBkJ1x1MDBlOXZpdGVyIGxlcyBkb3VibG9ucyBhcHJcdTAwZThzIGF2b2lyIHJcdTAwZTl2XHUwMGU5bFx1MDBlOSBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIHNcdTAwZTlsZWN0aW9ublx1MDBlOXMuIENsaXF1ZXogc3VyIE9LIHNpIHZvdXMgc291aGFpdGV6IGxlcyBzdXBwcmltZXIgZXQgY29udGludWVyLg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9TZWxlY3RDb2x1bW5zPVNcdTAwZTlsZWN0aW9ubmV6IGxlcyBjb2xvbm5lcyBcdTAwZTAgYWpvdXRlcg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW09T3V2cmlyIHVuIGRpYWdyYW1tZSAmZFx1MDBlOXRhaWxsXHUwMGU5IGQnYWN0aXZpdFx1MDBlOQ0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9Db2x1bW5TZWxlY3Rpb249U1x1MDBlOWxlY3Rpb24gZGUgY29sb25uZXMgOg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zd2l0Y2hDb25maWd1cmF0aW9uPUJhc2N1bGVyIHZlcnMgbGEgY29uZmlndXJhdGlvbiBwYXIgZFx1MDBlOWZhdXQgZHUgcHJvY2Vzc3VzIGxvcnMgZGUgbCdhY3RpdmF0aW9uIGQndW4gXHUwMGU5ZGl0ZXVyIGRlIHByb2Nlc3N1cw0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zdXBwcmVzc2lvbkdyb3VwVGl0bGU9U3VwcHJlc3Npb24NCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGU9SFx1MDBlOXJpdGVyIGRlcyBcdTAwZTl0YXRzIGRlIHN1cHByZXNzaW9uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW09T3V2cmlyIHVuIGRpYWdyYW1tZSBkZSBkXHUwMGU5cGVuZGFuY2UgZGUgJnByb2R1aXQNCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1FZmZhY2VyDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9U1x1MDBlOWxlY3Rpb25uZXIuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9JbnNlcnROZXdQaGFzZT1JbnNcdTAwZTlyZXIgdW5lIG5vdXZlbGxlIHBoYXNlDQotVmlld0hlbHBlcl9yZWxvYWRMaWJPblJvbGxiYWNrRXJyb3I9SW1wb3NzaWJsZSBkZSByXHUwMGU5Y3VwXHUwMGU5cmVyIHVuZSBlcnJldXIgZGUgcGVyc2lzdGFuY2UuIExhIGJpYmxpb3RoXHUwMGU4cXVlIGRvaXQgXHUwMGVhdHJlIHJlY2hhcmdcdTAwZTllIHBvdXIgcXVlIHNvbiBcdTAwZTl0YXQgaW5pdGlhbCBzb2l0IHJlc3RhdXJcdTAwZTkuDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZF90ZXh0PUwnJ1x1MDBlOWxcdTAwZTltZW50ICcnezB9JycgYSBkXHUwMGU5alx1MDBlMCBcdTAwZTl0XHUwMGU5IHN1cHByaW1cdTAwZTkuDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZGNvbmZpcm1fdGV4dD1MJydcdTAwZTlsXHUwMGU5bWVudCAnJ3swfScnIGEgZFx1MDBlOWpcdTAwZTAgXHUwMGU5dFx1MDBlOSBzdXBwcmltXHUwMGU5LiBTb3VoYWl0ZXotdm91cyBsZSBzdXBwcmltZXIgZGUgJyd7MX0nJyA/DQotQ29uZmlndXJhdGlvblBhZ2VfQWRkTWlzc2luZ1Rvb2xUaXA9QWpvdXRlciBkZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgbWFucXVhbnRlcw0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uPURlc2NyaXB0aW9uDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm89SW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPUFwcGxpcXVlciB1biBwYSZ0dGVybg0KLU1vdmVEaWFsb2dfc2VsZWN0ZGVzdGluYXRpb25fdGV4dD1TXHUwMGU5bGVjdGlvbm5leiB1bmUgZGVzdGluYXRpb24uDQotTW92ZURpYWxvZ19ub21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9QXVjdW5lIGNoZW1pc2UgZGUgZGVzdGluYXRpb24gZHUgZG9jdW1lbnQgXHUwMGUwIHRyYW5zZlx1MDBlOXJlciBuJ2EgXHUwMGU5dFx1MDBlOSBzcFx1MDBlOWNpZmlcdTAwZTllLg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdD0uIE9iamV0IHByb2JsXHUwMGU5bWF0aXF1ZSA6IA0KLU1lc3NhZ2VMYWJlbFByb3ZpZGVyX2VycmNoaWxkcGtncz1VbiBwcm9jZXNzdXMgb3UgdW4gcGFja2FnZSBkZSBjb250ZW51IGVuZmFudCBjb250aWVudCBkZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGNvbnRlbmFudCBkZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgbWFucXVhbnRlcw0KLVByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfVGl0bGU9T3B0aW9ucyBkZSBwdWJsaWNhdGlvbiBkdSBkaWFncmFtbWUNCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2U9U1x1MDBlOWxlY3Rpb25uZXogbGUocykgZGlhZ3JhbW1lKHMpIFx1MDBlMCBwdWJsaWVyIG91IGRcdTAwZTlzXHUwMGU5bGVjdGlvbm5lei1sZXMgcG91ciBuZSBwYXMgbGVzIHB1YmxpZXINCi1Qcm9jZXNzRWRpdG9yX1RpdGxlPUVkaXRldXIgZGUgcHJvY2Vzc3VzIDogDQotU2F2ZUFzd2l0aGRvdHNfdGV4dD1FbnJlZ2lzdHJlciBzb3VzLi4uDQotUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlPVN0cnVjdHVyZSBkZSByXHUwMGU5cGFydGl0aW9uIGR1IHRyYXZhaWwNCi1Qcm9jZXNzRWRpdG9yX1RlYW1BbGxvY2F0aW9uPUFmZmVjdGF0aW9uIGRlIGwnXHUwMGU5cXVpcGUNCi1Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U9VXRpbGlzYXRpb24gZHUgcHJvZHVpdA0KLVByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldz1WdWUgY29uc29saWRcdTAwZTllDQotUHJvY2Vzc0VkaXRvcl9jb25maXJtQXV0b1N5bmNoPUNldHRlIG9wXHUwMGU5cmF0aW9uIHJhZnJhXHUwMGVlY2hpdCBsZXMgZGVzY3JpcHRldXJzIHNcdTAwZTlsZWN0aW9ublx1MDBlOXMgb3UgdG91cyBsZXMgZGVzY3JpcHRldXJzIHNlIHRyb3V2YW50IHNvdXMgbGVzIGFjdGl2aXRcdTAwZTlzIHNcdTAwZTlsZWN0aW9ublx1MDBlOWVzIHF1aSBvbnQgcmVcdTAwZTd1IGxlIG1hcnF1YWdlICJTeW5jaHJvbmlzXHUwMGU5IGF2ZWMgbGEgc291cmNlIiBkYW5zIGwnb25nbGV0IEdcdTAwZTluXHUwMGU5cmFsaXRcdTAwZTlzIGRlIGxldXIgdnVlIFByb3ByaVx1MDBlOXRcdTAwZTlzLiAgRWxsZSBhY3R1YWxpc2UgY2VzIGRlc2NyaXB0ZXVycyBhdmVjIGxlcyBwcm9wcmlcdTAwZTl0XHUwMGU5cyBkJ29yaWdpbmUgZGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSBjb250ZW51IGRlIG1cdTAwZTl0aG9kZSBsaVx1MDBlOXMgZGUgbGEgY29uZmlndXJhdGlvbiBwYXIgZFx1MDBlOWZhdXQgZHUgcHJvY2Vzc3VzLiAgTm90ZXogcXVlIGNldHRlIG9wXHUwMGU5cmF0aW9uIG5lIG1ldCBcdTAwZTAgam91ciBhdWN1biBkZXNjcmlwdGV1ciBsaVx1MDBlOSBkZSBmYVx1MDBlN29uIGR5bmFtaXF1ZSAoaXRhbGlxdWUgdmVydCkuICBWb3VsZXotdm91cyBjb250aW51ZXIgPw0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMT1Db25maWd1cmF0aW9uDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yPVNcdTAwZTlsZWN0aW9uIGR1IHBsdWctaW4gZXQgZHUgcGFja2FnZQ0KLU5ld0xpYnJhcnlEaWFsb2dfbmV3bGlicmFyeV9hcz1Dclx1MDBlOWVyIGxhIG5vdXZlbGxlIGJpYmxpb3RoXHUwMGU4cXVlIHNvdXMNCi1OZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ9Tm91dmVhdSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZQ0KLVNlbGVjdEVsZW1lbnREaWFsb2dfdGl0bGVfdGV4dD1TXHUwMGU5bGVjdGlvbm5leiBsJ1x1MDBlOWxcdTAwZTltZW50IG91IGwndW4gZGUgc2VzIGNvbGxhYm9yYXRldXJzIDoNCi1PcGVuQ29uZmlnRGlhbG9nbmV3Y29uZmlnX3RleHQ9Tm91dmVsbGUgY29uZmlndXJhdGlvbiA6DQotcHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlX0JTRWRpdG9yPUVkaXRldXIgZGUgcHJvY2Vzc3VzDQotDQotIyBBYnN0cmFjdERpYWdyYW1FZGl0b3INCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9QWxpZ25lcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PUFjdHVhbGlzZXIgXHUwMGUwIHBhcnRpciBkZSBsJ2FjdGl2aXRcdTAwZTkgXHUwMGU5bFx1MDBlOW1lbnRhaXJlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0PU1pc2UgZW4gZm9ybWUgZGUgbGEgem9uZSBkZSB0ZXh0ZS4uLg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9SG9yaXpvbnRhbGVtZW50IHBhciByYXBwb3J0IFx1MDBlMCBsYSBtb3llbm5lDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1Ib3Jpem9udGFsZW1lbnQgcGFyIHJhcHBvcnQgYXUgcHJlbWllciBcdTAwZTlsXHUwMGU5bWVudCBzXHUwMGU5bGVjdGlvbm5cdTAwZTkNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVZlcnRpY2FsZW1lbnQgcGFyIHJhcHBvcnQgXHUwMGUwIGxhIG1veWVubmUNCi1NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX3RpdGxlPUluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzDQotTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9SVVQQTAwNDFFIDogSW1wb3NzaWJsZSBkZSBkXHUwMGU5cGxhY2VyIGxlKHMpIFx1MDBlOWxcdTAwZTltZW50KHMpIHNcdTAwZTlsZWN0aW9ublx1MDBlOShzKSB2ZXJzIGxhIGRlc3RpbmF0aW9uIGluZGlxdVx1MDBlOWUuDQotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlbW9kZWxsaWJyYXJ5PVNhdXZlZ2FyZGUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy4uLg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyb3JfZGlhbG9nX3RpdGxlPUVycmV1cg0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZV9saWJyYXJ5X3Byb2JsZW1fbXNnPUlVUEEwMDMzRSA6IFByb2JsXHUwMGU4bWUgcmVuY29udHJcdTAwZTkgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlLg0KLU1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0PUV0ZXMtdm91cyBzXHUwMGZiciBkZSB2b3Vsb2lyIHN1cHByaW1lciAnJ3swfScnID8NCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19Db250ZW50RWxlbWVudF90ZXh0PUVsXHUwMGU5bWVudHMgZGUgY29udGVudSA6IA0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfQnJvd3NlQnV0dG9uTGFiZWw9UGFyY291cmlyLi4uDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1TcFx1MDBlOWNpZmlleiB1biBub20gZXQgdW5lIGRlc2NyaXB0aW9uIHBvdXIgbGEgbm91dmVsbGUgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUuDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VUaXRsZT1FbnJlZ2lzdHJlciBsZXMgbW9kaWZpY2F0aW9ucyBldCBmZXJtZXIgdG91cyBsZXMgXHUwMGU5ZGl0ZXVycw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9VmVydGljYWxlbWVudCBwYXIgcmFwcG9ydCBhdSBwcmVtaWVyIFx1MDBlOWxcdTAwZTltZW50IHNcdTAwZTlsZWN0aW9ublx1MDBlOQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9RW5yZWdpc3RyZXINCi1BdHRhY2htZW50RGlhbG9nYXR0YWNoRmlsZV90ZXh0PUpvaW5kcmUgdW4gZmljaGllcg0KLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ9Q29udGVudSBkZSBsYSBjb25maWd1cmF0aW9uDQotT3BlbkNvbmZpZ0RpYWxvZ29wZW5jb25maWdfdGV4dD1PdXZyaXIgdW5lIGNvbmZpZ3VyYXRpb24NCi1FbGVtZW50c1ZpZXdfcmVwbGFjZUFjdGlvbl90ZXh0PVJlbXBsYWNlci4uLg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9U2F1dmVnYXJkZSBkZSB7MH0gZW4gY291cnMNCi1Db25maWd1cmF0aW9uUGFnZV9TaG93RXJyb3JUb29sVGlwPUFmZmljaGVyIGwnYWZmaWNoZXVyIGRlIGpvdXJuYWwgZCdhdmVydGlzc2VtZW50IGRlIGNvbmZpZ3VyYXRpb24NCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25Gb3JtUHJlZml4PUNvbmZpZ3VyYXRpb24gOiANCi1DaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0PUVsXHUwMGU5bWVudHMgZGUgdlx1MDBlOXJpZmljYXRpb24gOiANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9RFx1MDBlOXBsYWNlciB1biBub2V1ZA0KLUNvbmZpZ3VyYXRpb25QYWdlX01ha2VDbG9zdXJlVG9vbFRpcD1GZXJtZXIgZW4gY29ycmlnZWFudCBsZXMgZXJyZXVycw0KLU5ld1BsdWdpbkRpYWxvZ19yZWZlcmVuY2VwbHVnaW5fdGV4dD1QbHVnLWlucyBkZSByXHUwMGU5Zlx1MDBlOXJlbmNlIDoNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfY3JlYXRlRnJlZVRleHRfdGV4dD1Dclx1MDBlOWV6IHVuIHRleHRlIGxpYnJlDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfTGFiZWw9QXBlclx1MDBlN3UgZGUgbCdpY1x1MDBmNG5lIGRlIG5vZXVkIDoNCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2Nvbm5lY3RfdGV4dD1JVVBBMDAzMlcgOiBDb25uZXhpb24gaW1wb3NzaWJsZQ0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0PUlVUEEwMDMzVyA6IE5lIHBldXQgcGFzIGF2b2lyIGxlIG1cdTAwZWFtZSBcdTAwZTlsXHUwMGU5bWVudCBkZSByXHUwMGU5cGFydGl0aW9uIHF1ZSBsZSBwclx1MDBlOWRcdTAwZTljZXNzZXVyIGV0IGxlIHN1Y2Nlc3NldXINCi0NCi0jIEVkaXRvckNob29zZXINCi1FZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZT1PdXZyaXIgbCdcdTAwZTlkaXRldXINCi1FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yPUNldCBcdTAwZTlsXHUwMGU5bWVudCBjb21wb3J0ZSBkZXMgZXJyZXVycy4gSWwgZXN0IHJlY29tbWFuZFx1MDBlOSBkZSBsZXMgY29ycmlnZXIgYXZhbnQgZGUgY29udGludWVyICh2b2lyIGxlcyBkXHUwMGU5dGFpbHMpLlxuXA0KLVxuXA0KLUNsaXF1ZXogc3VyIE9LIHBvdXIgY29udGludWVyIHNhbnMgb3V2cmlyIGwnXHUwMGU5ZGl0ZXVyLiBGZXJtZXogY2V0dGUgYm9cdTAwZWV0ZSBkZSBkaWFsb2d1ZSBwb3VyIG91dnJpciBsJ1x1MDBlOWRpdGV1ci4NCi1Db25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4PUNvbmZpZ3VyYXRpb24gOiANCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25OYW1lPU5vbSA6DQotQXR0YWNobWVudERpYWxvZ0ZpbGVVUkxfdGV4dD1VUkwgZGUgZmljaGllciA6DQotU3RlcHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbj1TXHUwMGU5bGVjdGlvbm5leiB1bmUgXHUwMGU5dGFwZSBldCBjbGlxdWV6IHN1ciBIYXV0IG91IEJhcyBwb3VyIGNoYW5nZXIgc29uIG9yZHJlLg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyX3NhdmU9RXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZQ0KLU1lc3NhZ2VWaWV3X2VycmVsZW1lbnRfdGV4dD1FbFx1MDBlOW1lbnQgZGUgclx1MDBlOWZcdTAwZTlyZW5jZW1lbnQNCi1NZXNzYWdlVmlld19yZWZlbGVtZW50X3RleHQ9RWxcdTAwZTltZW50IHJcdTAwZTlmXHUwMGU5cmVuY1x1MDBlOQ0KLQ0KLSNBY3Rpdml0eSBEaWFncmFtDQotQWN0aXZpdHlEaWFncmFtRWRpdG9yX2NyZWF0ZVN0YXJ0Tm9kZV90ZXh0PUNyXHUwMGU5ZXIgdW4gbm9ldWQgZGUgZFx1MDBlOXBhcnQNCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb249U1x1MDBlOWxlY3Rpb25uZXogbGVzIHBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZSwgcGFja2FnZXMgZGUgY29udGVudSBldCBwcm9jZXNzdXMgcXVpIHNlcm9udCBpbmNsdXMgZGFucyBjZXR0ZSBjb25maWd1cmF0aW9uLg0KLUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uX3RleHQ9Qm9cdTAwZWV0ZSBkZSBkaWFsb2d1ZSBkJ29yZHJlIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgZHUgY29udGVudSBkZSBsYSBjYXRcdTAwZTlnb3JpZSBwZXJzb25uYWxpc1x1MDBlOWUNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsPVJcdTAwZTlwZXJ0b2lyZSA6DQotUm9vdFByZWZQYWdlX2VuYWJsZXByb2Nlc3Njb250cmlidXRpb25fdGV4dD1BY3RpdmVyIGxhIGNvbnRyaWJ1dGlvbiBkZSBwcm9jZXNzdXMNCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbl90ZXh0PUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUuDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlwdGlvbiA6DQotQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1DaG9pc2lyIGRlcyBjb2xsYWJvcmF0ZXVycyBwb3VyICcnezB9JycNCi1FbGVtZW50c1ZpZXdfb3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uX3RleHQ9T3V2cmlyIHZpYSBkZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIHZhcmlhYmlsaXRcdTAwZTkNCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9Q2hvaXNpciBkZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIHZhcmlhYmlsaXRcdTAwZTkgcG91ciAnJ3swfScnDQotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsPUVsXHUwMGU5bWVudHMgZGUgdmFyaWFiaWxpdFx1MDBlOSBwb3VyICcnezB9JycNCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfTGFiZWw9QXBlclx1MDBlN3UgZGUgbCdpY1x1MDBmNG5lIEZvcm1lIDoNCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2RlbGV0ZV90ZXh0PVN1cHByZXNzaW9uIGltcG9zc2libGUNCi1BY3Rpdml0eURpYWdyYW1FZGl0b3Jfb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PU91dnJpciB1biBkaWFncmFtbWUgZFx1MDBlOXRhaWxsXHUwMGU5IGQnYWN0aXZpdFx1MDBlOSANCi1NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX2Rlc2NyaXB0aW9uPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsPUVmZmFjZXINCi1XUENvbXBhcnRtZW50RmlndXJlXzA9Tm91dmVhdSBkZXNjcmlwdGV1ciBkZSBwcm9kdWl0DQotcHJvbXB0Zm9yX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGRfdGV4dD1QdWJsaWV6IG91IHBhcmNvdXJleiBsZXMgZGlhZ3JhbW1lcyBkXHUwMGU5dGFpbGxcdTAwZTlzIGQnYWN0aXZpdFx1MDBlOSBxdWkgbidvbnQgcGFzIFx1MDBlOXRcdTAwZTkgY3JcdTAwZTlcdTAwZTlzIGRhbnMgbCdcdTAwZTlkaXRldXIgZGUgcHJvY2Vzc3VzDQotcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVB1YmxpZXIgb3UgcGFyY291cmlyIGxlcyBkaWFncmFtbWVzIGQnYWN0aXZpdFx1MDBlOSBkZXMgZXh0ZW5zaW9ucyBkJ2FjdGl2aXRcdTAwZTkgbm9uIG1vZGlmaVx1MDBlOWVzDQotDQotI0NvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm49UGF0dGVybnMgZGUgbm9tcyAobGVzIG5vbXMgY29ycmVzcG9uZGFudHMgc2Vyb250IGFmZmljaFx1MDBlOXMpIDoNCi1zaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbD1BZmZpY2hlciBsZSBuYXZpZ2F0ZXVyIGRlIHJlc3NvdXJjZXMNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19QYXR0ZXJuPUxlcyBwYXR0ZXJucyBzb250IHNcdTAwZTlwYXJcdTAwZTlzIHBhciB1bmUgdmlyZ3VsZSwgb1x1MDBmOSAqID0gbidpbXBvcnRlIHF1ZWxsZSBjaGFcdTAwZWVuZSwgPyA9IG4naW1wb3J0ZSBxdWVsIGNhcmFjdFx1MDBlOHJlDQotZXJyX3Byb2Nlc3NpbmdfZmlsZV9kZXNjcmlwdGlvbj1JVVBBMDAyOUUgOiBVbmUgZXJyZXVyIHMnZXN0IHByb2R1aXRlIGxvcnMgZHUgdHJhaXRlbWVudCBkdSBmaWNoaWVyIHNcdTAwZTlsZWN0aW9ublx1MDBlOS4gQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy4NCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19DYXRlZ29yeVR5cGU9VHlwZSBkZSBjYXRcdTAwZTlnb3JpZSA6DQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1EZXNjcmlwdGlmIGNvdXJ0IDoNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19TZWxlY3RDYXRlZ29yaWVzPVNcdTAwZTlsZWN0aW9ubmVyIGxlcyBjYXRcdTAwZTlnb3JpZXMNCi0NCi0jbG9nIG1lc3NhZ2VzDQotY2hlYXRzaGVldF9sb2FkX2ZhaWx1cmVfbG9nX21zZz1FY2hlYyBkZSBsJ291dmVydHVyZSBkZSBsJ2FpZGUtbVx1MDBlOW1vaXJlIGRlbWFuZFx1MDBlOSA6IA0KLQ0KLW5ld0NvbmZpZ3VyYXRpb25XaXJhemRfY3JlYXRlRXJyb3I9SVVQQTAwMzVFIDogSW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIGxhIGNvbmZpZ3VyYXRpb24NCi1uZXdQbHVnaW5XaXphcmRfY3JlYXRlRXJyb3I9SVVQQTAwMzZFIDogSW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIGxlIHBsdWctaW4NCi1lcnJvckRpYWxvZ19tb3ZlRXJyb3I9SVVQQTAwMzdFIDogSW1wb3NzaWJsZSBkZSBkXHUwMGU5cGxhY2VyIGwnXHUwMGU5bFx1MDBlOW1lbnQNCi1yZW5hbWVEaWFsb2dfcmVuYW1lRXJyb3I9SVVQQTAwMzhFIDogSW1wb3NzaWJsZSBkZSBjaGFuZ2VyIGxlIG5vbSBkZSBsJ1x1MDBlOWxcdTAwZTltZW50DQotZXJyb3JEaWFsb2dfY3JlYXRlRXJyb3I9SVVQQTAwMzlFIDogSW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIGwnXHUwMGU5bFx1MDBlOW1lbnQNCi1kdXBsaWNhdGVQbHVnaW5OYW1lRXJyb3JfbXNnPUlVUEEwMTAxRSA6IExlIG5vbSAnJ3swfScnIGV4aXN0ZSBkXHUwMGU5alx1MDBlMC4gU2Fpc2lzc2V6IHVuIG5vbSBkaWZmXHUwMGU5cmVudCBldCByXHUwMGU5ZXNzYXllei4NCi0NCi0jTmV3IFN0cmluZ3MgZm9yIFByb2Nlc3NFZGl0b3IgQ29udGV4dCBtZW51IGRpYWdyYW0gaW1hZ2VzDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkQURJbWFnZT1BZmZlY3RlciB1bmUgaW1hZ2UgQUQuLi4NCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlPUFjdHVhbGlzZXIgbCdlcnJldXINCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZz1FZGl0ZXVyIGQnYWN0dWFsaXNhdGlvbiBkZXMgZXJyZXVycw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlPUFmZmVjdGVyIHVuZSBpbWFnZSBBREQuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRXUERJbWFnZT1BZmZlY3RlciB1bmUgaW1hZ2UgV1BELi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURJbWFnZUluUHVibGlzaGluZz1VdGlsaXNlciB1bmUgaW1hZ2UgQUQgZGFucyBsYSBwdWJsaWNhdGlvbg0KLVByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVTdXBwcmVzcz1MZXMgZGVzY3JpcHRldXJzIHN1cHByaW1cdTAwZTlzIHJcdTAwZTlwZXJ0b3JpXHUwMGU5cyBkYW5zIGxhIGxpc3RlIERcdTAwZTl0YWlscyBkb2l2ZW50IFx1MDBlYXRyZSBzdXBwcmltXHUwMGU5cyBhZmluIGQnXHUwMGU5dml0ZXIgbGVzIGRvdWJsb25zIGFwclx1MDBlOHMgbGEgc3VwcHJlc3Npb24gZGVzIFx1MDBlOWxcdTAwZTltZW50cyBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzLiBDbGlxdWV6IHN1ciBPSyBzaSB2b3VzIHNvdWhhaXRleiBsZXMgc3VwcHJpbWVyIGV0IGNvbnRpbnVlci4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBRERJbWFnZUluUHVibGlzaGluZz1VdGlsaXNlciB1bmUgaW1hZ2UgQUREIGRhbnMgbGEgcHVibGljYXRpb24NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VXUERJbWFnZUluUHVibGlzaGluZz1VdGlsaXNlciB1bmUgaW1hZ2UgV1BEIGRhbnMgbGEgcHVibGljYXRpb24NCi1Qcm9jZXNzRWRpdG9yX0RpYWdyYW1JbWFnZV9JbnB1dERpYWxvZ19pbml0aWFsVmFsdWU9Q2hlbWluIGRlIGwnaW1hZ2UNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXc9QWZmaWMmaGVyIGwnXHUwMGU5bFx1MDBlOW1lbnQgbGlcdTAwZTkgZGFucyBsYSB2dWUgQmlibGlvdGhcdTAwZThxdWUNCi1Qcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWw9TWV0dHJlIFx1MDBlMCBqb3VyIGxhIHN1cHByZXNzaW9uIFx1MDBlMCBwYXJ0aXIgZGUgbGEgJmJhc2UNCi1Qcm9jZXNzRWRpdG9yX0NvbnRleHRNZW51X0RpYWdyYW1JbWFnZXM9SW1hZ2VzIGRlIGRpYWdyYW1tZQ0KLQ0KLSNTdHJpbmdzIGZvciBzeW5jaHJvbml6YXRpb24gd2l6YXJkIG9uIHByb2Nlc3MgZWRpdG9yJ3MgQlMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlPURlc2NyaXB0aW9uIGRlIGxhIHN5bmNocm9uaXNhdGlvbg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfdGV4dD1MaXNleiBsZXMgaW5mb3JtYXRpb25zIGNpLWRlc3NvdXMgcXVpIGV4cGxpcXVlbnQgY2UgcXVlIHZhIGVmZmVjdHVlciBsYSBzeW5jaHJvbmlzYXRpb24gcGVyc29ubmFsaXNcdTAwZTllLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlPVNcdTAwZTlsZWN0aW9ubmVyIGxhIGNvbmZpZ3VyYXRpb24NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVNcdTAwZTlsZWN0aW9ubmV6IGxhIGNvbmZpZ3VyYXRpb24gcXVlIHZvdXMgc291aGFpdGV6IHV0aWxpc2VyIHBvdXIgbGEgc3luY2hyb25pc2F0aW9uLiAgXA0KLVZvdHJlIHNcdTAwZTlsZWN0aW9uIGRcdTAwZTl0ZXJtaW5lIHF1ZWxsZXMgY29udHJpYnV0aW9ucyBldCBxdWVscyByZW1wbGFjZW1lbnRzIHNlcm9udCB1dGlsaXNcdTAwZTlzIHBvdXIgbGEgc3luY2hyb25pc2F0aW9uLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX2NvbmZpZ0xhYmVsPUNvbmZpZ3VyYXRpb24gOg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90aXRsZT1TXHUwMGU5bGVjdGlvbm5lciBsZXMgcHJvcHJpXHUwMGU5dFx1MDBlOXMgXHUwMGUwIHN5bmNocm9uaXNlcg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcm9wZXJ0aWVzX2xhYmxlPVByb3ByaVx1MDBlOXRcdTAwZTlzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX25hbWVfbGFibGU9Tm9tDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByZXNlbnRhdGlvbk5hbWVfbGFibGU9Tm9tIGRlIHByXHUwMGU5c2VudGF0aW9uDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2JyaWVmRGVzY19sYWJsZT1EZXNjcmlwdGlmIGNvdXJ0DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsPUVudHJcdTAwZTllcyBmYWN1bHRhdGl2ZXMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbWFuZGF0b3J5SW5wdXRzX2xhYmxlPUVudHJcdTAwZTllcyBvYmxpZ2F0b2lyZXMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3V0cHV0c19sYWJlbD1Tb3J0aWVzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWw9RXhcdTAwZTljdXRhbnQgcHJpbmNpcGFsDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2FkZG5QZXJmb3JtZXJzX2xhYmxlPUV4XHUwMGU5Y3V0YW50IHN1cHBsXHUwMGU5bWVudGFpcmVzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGU9Ulx1MDBmNGxlcyByZXNwb25zYWJsZXMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfY29udG5BcnRpZmFjdHNfbGFiZWw9QXJ0ZWZhY3RzIGNvbnRlbnVzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2RpbHZlZFBhcnRzX2xhYmVsPUNvbXBvc2FudHMgbGl2cmFibGVzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsPVNcdTAwZTlsZWN0aW9uIGRlcyBcdTAwZTl0YXBlcw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90ZXh0PUNob2lzaXNzZXogbGVzIHByb3ByaVx1MDBlOXRcdTAwZTlzIGR1IGNvbnRlbnUgZGUgbVx1MDBlOXRob2RlIHF1ZSB2b3VzIHZvdWxleiBzb3VtZXR0cmUgXHUwMGUwIHVuZSBzeW5jaHJvbmlzYXRpb24uDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RpdGxlPVByXHUwMGU5dmlzdWFsaXNhdGlvbiBkZSBsYSBzeW5jaHJvbmlzYXRpb24NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGV4dD1SXHUwMGU5dmlzZXogbGVzIGRcdTAwZTl0YWlscyBkZSBzeW5jaHJvbmlzYXRpb24gcHJvcG9zXHUwMGU5cyBjaS1kZXNzb3VzLg0KLXNlbGVjdEVkaXRvcnNUb0Rpc2NhcmRDb25mbGljdENoYW5nZXM9Q2VydGFpbmVzIG1vZGlmaWNhdGlvbnMgbm9uIHNhdXZlZ2FyZFx1MDBlOWVzIHNvbnQgZW4gY29uZmxpdCBhdmVjIGRlcyBtb2RpZmljYXRpb25zIGVmZmVjdHVcdTAwZTllcyBlbiBkZWhvcnMgZGVzIFx1MDBlOWRpdGV1cnMuXG5cDQotU1x1MDBlOWxlY3Rpb25uZXogbGVzIFx1MDBlOWRpdGV1cnMgZG9udCB2b3VzIHNvdWhhaXRleiBzdXBwcmltZXIgbGVzIG1vZGlmaWNhdGlvbnMuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3RpdGxlX3RleHQ9QXNzaXN0YW50IGRlIHN5bmNocm9uaXNhdGlvbg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfZXhwbGFpblRleHQ9Q2V0IGFzc2lzdGFudCB2b3VzIGFpZGUgXHUwMGUwIGFjdHVhbGlzZXIgbGVzIGRlc2NyaXB0ZXVycyBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzIG91IHRvdXMgbGVzIGRlc2NyaXB0ZXVycyBzZSB0cm91dmFudCBzb3VzIGRlcyBhY3Rpdml0XHUwMGU5cyBzXHUwMGU5bGVjdGlvbm5cdTAwZTllcyBxdWkgb250IHJlXHUwMGU3dSBsZSBtYXJxdWFnZSAiU3luY2hyb25pc2VyIGF2ZWMgbGEgU291cmNlIiBkYW5zIGwnb25nbGV0IEdcdTAwZTluXHUwMGU5cmFsaXRcdTAwZTlzIGRlIGxldXIgdnVlIFByb3ByaVx1MDBlOXRcdTAwZTlzLiAgXA0KLVNldWxlcyBsZXMgcHJvcHJpXHUwMGU5dFx1MDBlOXMgcXVlIHZvdXMgc1x1MDBlOWxlY3Rpb25uZXogZGFucyBjZXQgYXNzaXN0YW50IHNvbnQgYWN0dWFsaXNcdTAwZTllcyBkYW5zIGxlcyBkZXNjcmlwdGV1cnMuICBcDQotVm91cyBwb3V2ZXogXHUwMGU5Z2FsZW1lbnQgc1x1MDBlOWxlY3Rpb25uZXIgbidpbXBvcnRlIHF1ZWxsZSBjb25maWd1cmF0aW9uIHZhbGlkZSBwb3VyIHZvdHJlIHByb2Nlc3N1cyBldCBxdWkgc2VyYSB1dGlsaXNcdTAwZTllIGxvcnMgZGUgbCdvcFx1MDBlOXJhdGlvbiBkJ2FjdHVhbGlzYXRpb24uICBcDQotTm90ZXogcXVlIGwnYXNzaXN0YW50IG5lIG1ldCBcdTAwZTAgam91ciBhdWN1biBkZXNjcmlwdGV1ciBsaVx1MDBlOSBkZSBmYVx1MDBlN29uIGR5bmFtaXF1ZSAoaXRhbGlxdWUgdmVydCkuDQotDQotb3BlblJURT1PdXZyaXIgbCdcdTAwZTlkaXRldXIgZGUgdGV4dGUgZW5yaWNoaQ0KLWNsb3NlUlRFPUZlcm1lciBsJ1x1MDBlOWRpdGV1ciBkZSB0ZXh0ZSBlbnJpY2hpDQotDQotI05ldyBTdHJpbmdzDQotcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlIGNvbnNlaWwgcXVpIGFwcGFydGllbnQgXHUwMGUwIGNldCBlbnNlbWJsZSBkZSByXHUwMGY0bGVzLg0KLWRpc2NpcGxpbmVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R1x1MDBlOXJleiBsZSBjb25zZWlsIHF1aSBhcHBhcnRpZW50IFx1MDBlMCBjZXR0ZSBkaXNjaXBsaW5lLg0KLXdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlIGNvbnNlaWwgcXVpIGFwcGFydGllbnQgXHUwMGUwIGNlIHR5cGUgZGUgcHJvZHVpdC4NCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R1x1MDBlOXJleiBsZSBjb25zZWlsIHF1aSBhcHBhcnRpZW50IFx1MDBlMCBjZSBkb21haW5lLg0KLXRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R1x1MDBlOXJleiBsZSBjb25zZWlsIHF1aSBhcHBhcnRpZW50IFx1MDBlMCBjZXQgb3V0aWwuDQotY3VzdG9tY2F0ZWdvcnlfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlIGNvbnNlaWwgcXVpIGFwcGFydGllbnQgXHUwMGUwIGNldHRlIGNhdFx1MDBlOWdvcmllIHBlcnNvbm5hbGlzXHUwMGU5ZS4NCi0NCi1jb25jZXB0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R1x1MDBlOXJleiBsZSBjb25zZWlsIHF1aSBhcHBhcnRpZW50IFx1MDBlMCBjZSBjb25jZXB0Lg0KLWNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGUgY29uc2VpbCBxdWkgYXBwYXJ0aWVudCBcdTAwZTAgY2V0dGUgbGlzdGUgZGUgY29udHJcdTAwZjRsZS4NCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R1x1MDBlOXJleiBsZSBjb25zZWlsIHF1aSBhcHBhcnRpZW50IFx1MDBlMCBjZXQgZXhlbXBsZS4NCi1ndWlkZWxpbmVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlIGNvbnNlaWwgcXVpIGFwcGFydGllbnQgXHUwMGUwIGNldHRlIGluc3RydWN0aW9uLg0KLXJvYWRtYXBfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlIGNvbnNlaWwgcXVpIGFwcGFydGllbnQgXHUwMGUwIGNldHRlIGZldWlsbGUgZGUgcm91dGUuDQotcmV1c2FibGVhc3NldF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGUgY29uc2VpbCBxdWkgYXBwYXJ0aWVudCBcdTAwZTAgY2V0dGUgcmVzc291cmNlIHJcdTAwZTl1dGlsaXNhYmxlLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGUgY29uc2VpbCBxdWkgYXBwYXJ0aWVudCBcdTAwZTAgY2V0dGUgZG9jdW1lbnRhdGlvbiBkJ2FjY29tcGFnbmVtZW50Lg0KLXJlcG9ydF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGUgY29uc2VpbCBxdWkgYXBwYXJ0aWVudCBcdTAwZTAgY2UgcmFwcG9ydC4NCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGUgY29uc2VpbCBxdWkgYXBwYXJ0aWVudCBcdTAwZTAgY2V0dGUgcHJhdGlxdWUuDQotdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlIGNvbnNlaWwgcXVpIGFwcGFydGllbnQgXHUwMGUwIGNlIGNhbmV2YXMuDQotdGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HXHUwMGU5cmVyIGxlIGNvbnNlaWwgcXVpIGFwcGFydGllbnQgXHUwMGUwIGNldHRlIGRcdTAwZTlmaW5pdGlvbiBkZSB0ZXJtZS4NCi10b29sbWVudG9yX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R1x1MDBlOXJlciBsZSBjb25zZWlsIHF1aSBhcHBhcnRpZW50IFx1MDBlMCBjZSBndWlkZSBkJ3V0aWxpc2F0aW9uIGRlIGwnb3V0aWwuDQotd2hpdGVwYXBlcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGUgY29uc2VpbCBxdWkgYXBwYXJ0aWVudCBcdTAwZTAgY2UgbGl2cmUgYmxhbmMuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlIGNvbnNlaWwgcXVpIGFwcGFydGllbnQgXHUwMGUwIGNldHRlIGNvbnNpZFx1MDBlOXJhdGlvbiBkJ2VzdGltYXRpb24uDQotDQotDQotI05ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbg0KLXJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNlIHJcdTAwZjRsZS4NCi1yb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2Ugclx1MDBmNGxlLg0KLXJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZSByXHUwMGY0bGUgcydhc3NvY2llIFx1MDBlMCB1biBhdXRyZS4NCi1yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIFx1MDBlMCBwcm9wb3MgZGUgY2Ugclx1MDBmNGxlLg0KLQ0KLXRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIHRcdTAwZTJjaGUuDQotdGFza19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIHRcdTAwZTJjaGUuDQotdGFza192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNldHRlIHRcdTAwZTJjaGUgcydhc3NvY2llIFx1MDBlMCB1bmUgYXV0cmUuDQotdGFza192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgdmVyc2lvbiBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIHRcdTAwZTJjaGUuDQotDQotYXJ0aWZhY3RfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNldCBhcnRlZmFjdC4NCi1hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNldCBhcnRlZmFjdC4NCi1hcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNldCBhcnRlZmFjdC4NCi1hcnRpZmFjdF9ub3RhdGlvblNlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgbGl2cmFpc29uIFx1MDBlMCBwcm9wb3MgZGUgY2V0IGFydGVmYWN0Lg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgcGVyc29ubmFsaXNhdGlvbiBcdTAwZTAgcHJvcG9zIGRlIGNldCBhcnRlZmFjdC4NCi1hcnRpZmFjdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNldCBhcnRlZmFjdCBzJ2Fzc29jaWUgXHUwMGUwIHVuIGF1dHJlLg0KLWFydGlmYWN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIFx1MDBlMCBwcm9wb3MgZGUgY2V0IGFydGVmYWN0Lg0KLQ0KLW91dGNvbWVfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIHNvcnRpZS4NCi1vdXRjb21lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgc29ydGllLg0KLW91dGNvbWVfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25uYWxpc2V6IGxlcyBpY1x1MDBmNG5lcyBkZSBjZXR0ZSBzb3J0aWUuDQotb3V0Y29tZV9ub3RhdGlvblNlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgbGl2cmFpc29uIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgc29ydGllLg0KLW91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSBwZXJzb25uYWxpc2F0aW9uIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgc29ydGllLg0KLW91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZXR0ZSBzb3J0aWUgcydhc3NvY2llIFx1MDBlMCB1bmUgYXV0cmUuDQotb3V0Y29tZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgdmVyc2lvbiBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIHNvcnRpZS4NCi0NCi1kZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgZGUgY2UgbGl2cmFibGUuDQotZGVsaXZlcmFibGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgXHUwMGUwIHByb3BvcyBkZSBjZSBsaXZyYWJsZS4NCi1kZWxpdmVyYWJsZV9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNlIGxpdnJhYmxlLg0KLWRlbGl2ZXJhYmxlX25vdGF0aW9uU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSBsaXZyYWlzb24gXHUwMGUwIHByb3BvcyBkZSBjZSBsaXZyYWJsZS4NCi1kZWxpdmVyYWJsZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHBlcnNvbm5hbGlzYXRpb24gXHUwMGUwIHByb3BvcyBkZSBkZSBsaXZyYWJsZS4NCi1kZWxpdmVyYWJsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNlIGxpdnJhYmxlIHMnYXNzb2NpZSBcdTAwZTAgdW4gYXV0cmUuDQotZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZSBsaXZyYWJsZS4NCi0NCi1kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZFx1MDBlOXRhaWxsXHUwMGU5ZXMgXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSBkaXNjaXBsaW5lLg0KLWRpc2NpcGxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSBkaXNjaXBsaW5lLg0KLWRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZXR0ZSBkaXNjaXBsaW5lIHMnYXNzb2NpZSBcdTAwZTAgdW5lIGF1dHJlLg0KLWRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSBkaXNjaXBsaW5lLg0KLQ0KLWRvbWFpbl9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgZGUgY2UgZG9tYWluZS4NCi1kb21haW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgXHUwMGUwIHByb3BvcyBkZSBjZSBkb21haW5lLg0KLWRvbWFpbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNlIGRvbWFpbmUgcydhc3NvY2llIFx1MDBlMCB1biBhdXRyZS4NCi1kb21haW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZSBkb21haW5lLg0KLQ0KLXdvcmtwcm9kdWN0dHlwZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgZGUgY2UgdHlwZSBkZSBwcm9kdWl0Lg0KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNlIHR5cGUgZGUgcHJvZHVpdC4NCi13b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZSB0eXBlIGRlIHByb2R1aXQgcydhc3NvY2llIFx1MDBlMCB1biBhdXRyZS4NCi13b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZSB0eXBlIGRlIHByb2R1aXQuDQotDQotcm9sZXNldF9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0IGVuc2VtYmxlIGRlIHJcdTAwZjRsZXMuDQotcm9sZXNldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNldCBlbnNlbWJsZSBkZSByXHUwMGY0bGVzLg0KLXJvbGVzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZXQgZW5zZW1ibGUgZGUgclx1MDBmNGxlcyBzJ2Fzc29jaWUgXHUwMGUwIHVuIGF1dHJlLg0KLXJvbGVzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZXQgZW5zZW1ibGUgZGUgclx1MDBmNGxlLg0KLQ0KLXRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNldCBvdXRpbC4NCi10b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0IG91dGlsLg0KLXRvb2xfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZXQgb3V0aWwgcydhc3NvY2llIFx1MDBlMCB1biBhdXRyZS4NCi10b29sX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIFx1MDBlMCBwcm9wb3MgZGUgY2V0IG91dGlsLg0KLQ0KLWNvbmNlcHRfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNlIGNvbmNlcHQuDQotY29uY2VwdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNlIGNvbmNlcHQuDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNlIGNvbmNlcHQgcydhc3NvY2llIFx1MDBlMCB1biBhdXRyZS4NCi1jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIFx1MDBlMCBwcm9wb3MgZGUgY2UgY29uY2VwdC4NCi0NCi1jaGVja2xpc3RfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIGxpc3RlIGRlIGNvbnRyXHUwMGY0bGUuDQotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgbGlzdGUgZGUgY29udHJcdTAwZjRsZS4NCi1jaGVja2xpc3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZXR0ZSBsaXN0ZSBkZSBjb250clx1MDBmNGxlIHMnYXNzb2NpZSBcdTAwZTAgdW5lIGF1dHJlLg0KLWNoZWNrbGlzdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgdmVyc2lvbiBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIGxpc3RlIGRlIGNvbnRyXHUwMGY0bGUuDQotDQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0IGV4ZW1wbGUuDQotZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNldCBleGVtcGxlLg0KLWV4YW1wbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZXQgZXhlbXBsZSBzJ2Fzc29jaWUgXHUwMGUwIHVuIGF1dHJlLg0KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZXQgZXhlbXBsZS4NCi0NCi1ndWlkZWxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIGluc3RydWN0aW9uLg0KLWd1aWRlbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIGluc3RydWN0aW9uLg0KLWd1aWRlbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNldHRlIGluc3RydWN0aW9uIHMnYXNzb2NpZSBcdTAwZTAgdW5lIGF1dHJlLg0KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgdmVyc2lvbiBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIGluc3RydWN0aW9uLg0KLQ0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZFx1MDBlOXRhaWxsXHUwMGU5ZXMgXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSBjb25zaWRcdTAwZTlyYXRpb24gZCdlc3RpbWF0aW9uLg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgY29uc2lkXHUwMGU5cmF0aW9uIGQnZXN0aW1hdGlvbi4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNldHRlIGNvbnNpZFx1MDBlOXJhdGlvbiBkJ2VzdGltYXRpb24gcydhc3NvY2llIFx1MDBlMCB1bmUgYXV0cmUuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSBjb25zaWRcdTAwZTlyYXRpb24gZCdlc3RpbWF0aW9uLg0KLQ0KLXByYWN0aWNlX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZFx1MDBlOXRhaWxsXHUwMGU5ZXMgXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSBwcmF0aXF1ZS4NCi1wcmFjdGljZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIHByYXRpcXVlLg0KLXByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUluZGlxdWV6IGNvbW1lbnQgY2V0dGUgcHJhdGlxdWUgcydhc3NvY2llIFx1MDBlMCB1bmUgYXV0cmUuDQotcHJhY3RpY2VfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSBwcmF0aXF1ZS4NCi0NCi1yZXBvcnRfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNlIHJhcHBvcnQuDQotcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2UgcmFwcG9ydC4NCi1yZXBvcnRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZSByYXBwb3J0IHMnYXNzb2NpZSBcdTAwZTAgdW4gYXV0cmUuDQotcmVwb3J0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIFx1MDBlMCBwcm9wb3MgZGUgY2UgcmFwcG9ydC4NCi0NCi1yZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZFx1MDBlOXRhaWxsXHUwMGU5ZXMgXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSByZXNzb3VyY2Ugclx1MDBlOXV0aWxpc2FibGUuDQotcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIHJlc3NvdXJjZSByXHUwMGU5dXRpbGlzYWJsZS4NCi1yZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUluZGlxdWV6IGNvbW1lbnQgY2V0dGUgcmVzc291cmNlIHJcdTAwZTl1dGlsaXNhYmxlIHMnYXNzb2NpZSBcdTAwZTAgdW5lIGF1dHJlLg0KLXJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSByZXNzb3VyY2Ugclx1MDBlOXV0aWxpc2FibGUuDQotDQotcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgZmV1aWxsZSBkZSByb3V0ZS4NCi1yb2FkbWFwX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgZmV1aWxsZSBkZSByb3V0ZS4NCi1yb2FkbWFwX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUluZGlxdWV6IGNvbW1lbnQgY2V0dGUgZmV1aWxsZSBkZSByb3V0ZSBzJ2Fzc29jaWUgXHUwMGUwIHVuZSBhdXRyZS4NCi1yb2FkbWFwX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgZmV1aWxsZSBkZSByb3V0ZS4NCi0NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNlIGRvY3VtZW50IGQnYWNjb21wYWduZW1lbnQuDQotc3VwcG9ydGluZ21hdGVyaWFsX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2UgZG9jdW1lbnQgZCdhY2NvbXBhZ25lbWVudC4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZSBkb2N1bWVudCBkJ2FjY29tcGFnbmVtZW50IHMnYXNzb2NpZSBcdTAwZTAgdW4gYXV0cmUuDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIFx1MDBlMCBwcm9wb3MgZGUgY2UgZG9jdW1lbnQgZCdhY2NvbXBhZ25lbWVudC4NCi0NCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgZGUgY2UgY2FuZXZhcy4NCi10ZW1wbGF0ZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNlIGNhbmV2YXMuDQotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZSBjYW5ldmFzIHMnYXNzb2NpZSBcdTAwZTAgdW4gYXV0cmUuDQotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZSBjYW5ldmFzLg0KLQ0KLXRlcm1kZWZpbml0aW9uX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZFx1MDBlOXRhaWxsXHUwMGU5ZXMgXHUwMGUwIHByb3BvcyBjZXR0ZSBkXHUwMGU5ZmluaXRpb24gZGUgdGVybWUuDQotdGVybWRlZmluaXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgXHUwMGUwIHByb3BvcyBjZXR0ZSBkXHUwMGU5ZmluaXRpb24gZGUgdGVybWUuDQotdGVybWRlZmluaXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZXR0ZSBkXHUwMGU5ZmluaXRpb24gZGUgdGVybWUgcydhc3NvY2llIFx1MDBlMCB1bmUgYXV0cmUuDQotdGVybWRlZmluaXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSBkXHUwMGU5ZmluaXRpb24gZGUgdGVybWUuDQotDQotdG9vbG1lbnRvcl9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgY2UgZ3VpZGUgZCd1dGlsaXNhdGlvbiBkZSBsJ291dGlsLg0KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgXHUwMGUwIHByb3BvcyBjZSBndWlkZSBkJ3V0aWxpc2F0aW9uIGRlIGwnb3V0aWwuDQotdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNlIGd1aWRlIGQndXRpbGlzYXRpb24gZGUgbCdvdXRpbCBzJ2Fzc29jaWUgXHUwMGUwIHVuIGF1dHJlLg0KLXRvb2xtZW50b3JfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZSBndWlkZSBkJ3V0aWxpc2F0aW9uIGRlIGwnb3V0aWwuDQotDQotd2hpdGVwYXBlcl9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgY2UgbGl2cmUgYmxhbmMuDQotd2hpdGVwYXBlcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGNlIGxpdnJlIGJsYW5jLg0KLXdoaXRlcGFwZXJfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZSBsaXZyZSBibGFuYyBzJ2Fzc29jaWUgXHUwMGUwIHVuIGF1dHJlLg0KLXdoaXRlcGFwZXJfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZSBsaXZyZSBibGFuYy4NCi0NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGNlIHJlZ3JvdXBlbWVudCBkZSBkaXNjaXBsaW5lLg0KLWRpc2NpcGxpbmVncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGNlIHJlZ3JvdXBlbWVudCBkZSBkaXNjaXBsaW5lLg0KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNlIHJlZ3JvdXBlbWVudCBkZSBkaXNjaXBsaW5lcyBzJ2Fzc29jaWUgXHUwMGUwIHVuIGF1dHJlLg0KLWRpc2NpcGxpbmVncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgdmVyc2lvbiBcdTAwZTAgcHJvcG9zIGRlIGNlIHJlZ3JvdXBlbWVudCBkZSBkaXNjaXBsaW5lcy4NCi0NCi1yb2xlc2V0Z3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGNlIHJlZ3JvdXBlbWVudCBkJ2Vuc2VtYmxlcyBkZSByXHUwMGY0bGVzLg0KLXJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGNlIHJlZ3JvdXBlbWVudCBkJ2Vuc2VtYmxlcyBkZSByXHUwMGY0bGVzLg0KLXJvbGVzZXRncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNlIHJlZ3JvdXBlbWVudCBkJ2Vuc2VtYmxlcyBkZSByXHUwMGY0bGVzIHMnYXNzb2NpZSBcdTAwZTAgdW4gYXV0cmUuDQotcm9sZXNldGdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIFx1MDBlMCBwcm9wb3MgZGUgY2UgcmVncm91cGVtZW50IGQnZW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMuDQotDQotY3VzdG9tY2F0ZWdvcnlfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGNldHRlIGNhdFx1MDBlOWdvcmllIHBlcnNvbm5hbGlzXHUwMGU5ZS4NCi1jdXN0b21jYXRlZ29yeV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGNldHRlIGNhdFx1MDBlOWdvcmllIHBlcnNvbm5hbGlzXHUwMGU5ZS4NCi1jdXN0b21jYXRlZ29yeV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNldHRlIGNhdFx1MDBlOWdvcmllIHBlcnNvbm5hbGlzXHUwMGU5ZSBzJ2Fzc29jaWUgXHUwMGUwIHVuZSBhdXRyZS4NCi1jdXN0b21jYXRlZ29yeV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgdmVyc2lvbiBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIGNhdFx1MDBlOWdvcmllIHBlcnNvbm5hbGlzXHUwMGU5ZS4NCi1jdXN0b21jYXRlZ29yeV9JY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNldHRlIGNhdFx1MDBlOWdvcmllIHBlcnNvbm5hbGlzXHUwMGU5ZS4NCi0NCi1jb25jZXB0X2ljb25TZWN0aW9uX2Rlc2M9UGVyc29ubmFsaXNleiBsZXMgaWNcdTAwZjRuZXMgZGUgY2UgY29uY2VwdC4NCi1jaGVja2xpc3RfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25uYWxpc2V6IGxlcyBpY1x1MDBmNG5lcyBkZSBjZXR0ZSBsaXN0ZSBkZSBjb250clx1MDBmNGxlLg0KLXRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25uYWxpc2V6IGxlcyBpY1x1MDBmNG5lcyBkZSBjZSBndWlkZSBkJ3V0aWxpc2F0aW9uIGRlIGwnb3V0aWwuDQotd2hpdGVwYXBlcl9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNlIGxpdnJlIGJsYW5jLg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29ubmFsaXNleiBsZXMgaWNcdTAwZjRuZXMgZGUgY2V0dGUgY29uc2lkXHUwMGU5cmF0aW9uIGQnZXN0aW1hdGlvbi4NCi10ZXJtZGVmaW5pdGlvbl9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNldHRlIGRcdTAwZTlmaW5pdGlvbiBkZSB0ZXJtZS4NCi10ZW1wbGF0ZV9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNlIGNhbmV2YXMuDQotcmV1c2FibGVhc3NldF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNldHRlIHJlc3NvdXJjZSByXHUwMGU5dXRpbGlzYWJsZS4NCi1yZXBvcnRfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25uYWxpc2V6IGxlcyBpY1x1MDBmNG5lcyBkZSBjZSByYXBwb3J0Lg0KLXByYWN0aWNlX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29ubmFsaXNleiBsZXMgaWNcdTAwZjRuZXMgZGUgY2V0dGUgcHJhdGlxdWUuDQotZXhhbXBsZV9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNldCBleGVtcGxlLg0KLWd1aWRlbGluZV9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNldHRlIGluc3RydWN0aW9uLg0KLXJvYWRtYXBfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25uYWxpc2V6IGxlcyBpY1x1MDBmNG5lcyBkZSBjZXR0ZSBmZXVpbGxlIGRlIHJvdXRlLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNlIGRvY3VtZW50IGQnYWNjb21wYWduZW1lbnQuDQotDQotZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfdGl0bGU9RmljaGllciBtb2RpZmlcdTAwZTkNCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY19tZXNzYWdlPUxlIGZpY2hpZXIgYSBcdTAwZTl0XHUwMGU5IG1vZGlmaVx1MDBlOSBkYW5zIGxlIHN5c3RcdTAwZThtZSBkZSBmaWNoaWVycy4gU291aGFpdGV6LXZvdXMgY2hhcmdlciBsZXMgbW9kaWZpY2F0aW9ucyA/DQotDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU9VmFyaWFiaWxpdFx1MDBlOSBkZSBsJ2FjdGl2aXRcdTAwZTkNCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2c9TCcnYWN0aXZpdFx1MDBlOSAnJ3swfScnIG5lIHBldXQgcGFzIGRcdTAwZTlmaW5pciBsYSB2YXJpYWJpbGl0XHUwMGU5IGF2ZWMgJyd7MX0nJyBcdTAwZTl0YW50IGRvbm5cdTAwZTkgcXVlICcnezF9JycgZGlzcG9zZSBkXHUwMGU5alx1MDBlMCBkJyd1bmUgb3UgZGUgcGx1c2lldXJzIGFjdGl2aXRcdTAwZTlzIGRlIGNvbnRyaWJ1dGlvbiBvdSBkZSByZW1wbGFjZW1lbnQgY29tbWUgXHUwMGU5dGFudCBzZXMgZW5mYW50cy4NCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxPUwnJ2FjdGl2aXRcdTAwZTkgJyd7MH0nJyBuZSBwZXV0IHBhcyBkXHUwMGU5ZmluaXIgbGEgdmFyaWFiaWxpdFx1MDBlOSBhdmVjIGwnJ3VuIGRlIHNlcyBwYXJlbnRzIGRpcmVjdHMgb3UgdW4gcXVlbGNvbnF1ZSAgcHJvY2Vzc3VzLg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzI9TCcnYWN0aXZpdFx1MDBlOSAnJ3swfScnIG5lIHBldXQgcGFzIGRcdTAwZTlmaW5pciBsYSB2YXJpYWJpbGl0XHUwMGU5IGF2ZWMgJyd7MX0nJyBcdTAwZTl0YW50IGRvbm5cdTAwZTkgcXUnJ2VsbGUgdmEgZ1x1MDBlOW5cdTAwZTlyZXIgdW5lIGRcdTAwZTlwZW5kYW5jZSBlbiBib3VjbGUuDQotDQotYXBwbHlfcGF0dGVybl9lcnJvcl90aXRsZT1BcHBsaXF1ZXIgdW4gcGF0dGVybg0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPUwnJ2FjdGl2aXRcdTAwZTkgJyd7MH0nJyBuZSBwZXV0IHBhcyBhcHBsaXF1ZXIgZGUgcGF0dGVybiBhdmVjICcnezF9JycgXHUwMGU5dGFudCBkb25uXHUwMGU5IHF1JydlbGxlIHZhIGdcdTAwZTluXHUwMGU5cmVyIHVuZSBkXHUwMGU5cGVuZGFuY2UgZW4gYm91Y2xlLg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlcj18DQotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9zaG93T3duZXJJbkxpYnJhcnlWaWV3PUFmZmljaGVyIGxlIHByb3ByaVx1MDBlOXRhaXJlIGRlIGNldHRlIHJcdTAwZTlmXHUwMGU5cmVuY2Ugbm9uIHJcdTAwZTlzb2x1ZSBkYW5zIGxhIHZ1ZSBCaWJsaW90aFx1MDBlOHF1ZQ0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZT1TdXBwcmltZXIgY2V0dGUgclx1MDBlOWZcdTAwZTlyZW5jZSBub24gclx1MDBlOXNvbHVlDQotcHJvbXB0RGVsZXRlQ3VzdG9tQ2F0ZWdvcnlCZWZvcmVSZW1vdmVMYXN0UmVmVG9JdD1Wb3VzIFx1MDBlYXRlcyBzdXIgbGUgcG9pbnQgZGUgc3VwcHJpbWVyIGxhIGRlcm5pXHUwMGU4cmUgclx1MDBlOWZcdTAwZTlyZW5jZSBcdTAwZTAgezB9IGRhbnMgbGUgcGx1Zy1pbi4gTGUgb3UgbGVzIFx1MDBlOWxcdTAwZTltZW50cyBzZXJvbnQgc3VwcHJpbVx1MDBlOXMuIFZvdWxlei12b3VzIGNvbnRpbnVlciA/DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSNCZWxvdyBwcm9wZXJ0eSAiZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzIiBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQNCi0jRG9uJ3QgZGVsZXRlIGEgc3BhY2UgYWZ0ZXIgIjogIg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzPVwgOiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzUwYjhiMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRm9ybSBQYWdlIFRpdGxlcw0KLWFzc2lnblBhZ2VfdGl0bGU9QXNzZWduYQ0KLWNhdGVnb3JpZXNQYWdlX3RpdGxlPUNhdGVnb3JpZQ0KLWRlbGl2ZXJhYmxlUGFydHNQYWdlX3RpdGxlPVBhcnRpIGRpc3RyaWJ1aWJpbGkNCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9RGVzY3JpemlvbmUNCi1kaXNjaXBsaW5lc1BhZ2VfdGl0bGU9RGlzY2lwbGluZQ0KLWRpc2NhcmR1bnJlc29sdmVkcmVmPUVsaW1pbmEgcmlmZXJpbWVudGkgbm9uIHJpc29sdGkNCi1ndWlkYW5jZVBhZ2VfdGl0bGU9R3VpZGENCi1wcmV2aWV3UGFnZV90aXRsZT1BbnRlcHJpbWENCi1yZWZlcmVuY2VzUGFnZV90aXRsZT1SaWZlcmltZW50aQ0KLXJlZmVyZW5jZV90ZXh0PVJpZmVyaW1lbnRpOg0KLXJlZmVyZW5jZVdvcmtmbG93UGFnZV90aXRsZT1GbHVzc28gZGkgbGF2b3JvIGRpIHJpZmVyaW1lbnRvDQotcm9sZXNQYWdlX3RpdGxlPVJ1b2xpDQotcm9sZVNldHNQYWdlX3RpdGxlPUluc2llbWkgZGkgcnVvbGkNCi1zdGVwc1BhZ2VfdGl0bGU9UGFzc2kNCi10YXNrc1BhZ2VfdGl0bGU9T3BlcmF6aW9uaQ0KLXRvb2xNZW50b3JzUGFnZV90aXRsZT1HdWlkYSBhbCB0b29sDQotd29ya1Byb2R1Y3RzUGFnZV90aXRsZT1Qcm9kb3R0aSBkaSBsYXZvcm8NCi0NCi0jIFNlY3Rpb24gTmFtZXMgJiBEZXNjcmlwdGlvbg0KLWNoZWNrSXRlbXNTZWN0aW9uX25hbWU9Vm9jaSBlbGVuY2hpIGRpIG9wZXJhemlvbmkNCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGxlIHZvY2kgY2hlIGNvc3RpdHVpc2Nvbm8gcXVlc3RvIGVsZW5jbyBkaSBjb250cm9sbG8uDQotZGVwZW5kZW5jaWVzU2VjdGlvbl9uYW1lPURpcGVuZGVuemUNCi1kZXBlbmRlbmNpZXNTZWN0aW9uX2Rlc2M9UXVlc3RhIHNlemlvbmUgdmlzdWFsaXp6YSBsZSBkaXBlbmRlbnplIGRpIHF1ZXN0byBwYWNjaGV0dG8gZGVsIGNvbnRlbnV0byBpbiBhbHRyaSBwYWNjaGV0dGkgZGVsIGNvbnRlbnV0by4NCi1kZXRhaWxTZWN0aW9uX25hbWU9SW5mb3JtYXppb25pIGRldHRhZ2xpYXRlDQotZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0byB7MH0uDQotZ2VuZXJhbEluZm9TZWN0aW9uX25hbWU9SW5mb3JtYXppb25pIGdlbmVyYWxpDQotZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RvIHswfS4NCi1pY29uU2VjdGlvbl9uYW1lPUljb25hDQotaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGl6emFyZSBsZSBpY29uZSBwZXIgcXVlc3RvIHswfS4NCi1ub3RhdGlvblNlY3Rpb25fbmFtZT1JbmZvcm1hemlvbmkgc3VsbGEgY29uc2VnbmENCi1ub3RhdGlvblNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSBjb25zZWduYSBwZXIgcXVlc3RvIHswfS4NCi1yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fbmFtZT1QbHVnLWluIGEgY3VpIHNpIGZhIHJpZmVyaW1lbnRvOg0KLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9kZXNjPVF1ZXN0YSBzZXppb25lIHZpc3VhbGl6emEgaSBwbHVnLWluIGEgY3VpIGZhIHJpZmVyaW1lbnRvIHF1ZXN0byBwbHVnLWluIGRpIG1ldG9kby4NCi1zdGFmZmluZ1NlY3Rpb25fbmFtZT1JbmZvcm1hemlvbmkgc3VsIHBlcnNvbmFsZQ0KLXN0YWZmaW5nU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1IHBlcnNvbmFsZSByZWxhdGl2ZSBhIHF1ZXN0byBydW9sby4NCi1zdGVwc1NlY3Rpb25fbmFtZT1QYXNzaQ0KLXN0ZXBzU2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGkgcGFzc2kgcGVyIGVzZWd1aXJlIHF1ZXN0YSBvcGVyYXppb25lLg0KLXRhaWxvcmluZ1NlY3Rpb25fbmFtZT1QZXJzb25hbGl6emF6aW9uZQ0KLXRhaWxvcmluZ1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSBwZXJzb25hbGl6emF6aW9uZSByZWxhdGl2ZSBhIHF1ZXN0byB7MH0uDQotdmFyaWFiaWxpdHlTZWN0aW9uX25hbWU9VmFyaWFiaWxpdFx1MDBlMCBkZWwgY29udGVudXRvDQotdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RvIHswfSBzaSBjb3JyZWxhIGEgdW4gYWx0cm8gezB9Lg0KLXZlcnNpb25JbmZvU2VjdGlvbl9uYW1lPUluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZQ0KLXZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIHZlcnNpb25lIHJlbGF0aXZlIGEgcXVlc3RvIHswfS4NCi0NCi0jIFVJICYgRWxlbWVudCBBdHRyaWJ1dGUgTGFiZWxzDQotYWRkaXRpb25hbEluZm9fdGV4dD1JbmZvcm1hemlvbmkgYWdnaXVudGl2ZToNCi1hcHBsaWNhdGlvbl90ZXh0PUFwcGxpY2F6aW9uZToNCi1hY3Rpb25MYWJlbF9lZGl0PU1vZGlmaWNhDQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1Nb3N0cmEgaW4gdmlzdGEgbGlicmVyaWENCi1hbHRlcm5hdGl2ZXNfdGV4dD1BbHRlcm5hdGl2ZToNCi1hc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0PUFwcHJvY2NpIGFzc2VnbmF6aW9uZToNCi1hdXRob3JzX3RleHQ9QXV0b3JpOg0KLWJhY2tncm91bmRfdGV4dD1CYWNrZ3JvdW5kOg0KLWJhc2VFbGVtZW50X3RleHQ9QmFzZToNCi1iYXNlR3VpZGFuY2VfdGV4dD1HdWlkYSBkaSBiYXNlOg0KLWJyaWVmRGVzY3JpcHRpb25fdGV4dD1CcmV2ZSBkZXNjcml6aW9uZToNCi1kZXNjcmlwdGlvbl90ZXh0PURlc2NyaXppb25lOg0KLWJhY2t1cGJlZm9yZXNhdmVfdGV4dD1Fc2VndWkgYmFja3VwIHByaW1hIGRpIHNhbHZhcmUNCi1icmllZk91dGxpbmVfdGV4dD1CcmV2ZSBwcm9maWxvOg0KLWNoYW5nZURhdGVfdGV4dD1EYXRhIG1vZGlmaWNhOg0KLWNoYW5nZURlc2NyaXB0aW9uX3RleHQ9RGVzY3JpemlvbmUgbW9kaWZpY2E6DQotY2hlY2tJdGVtc190ZXh0PVZvY2kgZWxlbmNoaSBkaSBvcGVyYXppb25pDQotY29udHJpYnV0ZXNfdGV4dD1Db250cmlidWlzY2UNCi1sb2NhbENvbnRyaWJ1dGVzX3RleHQ9TG9jYWxDb250cmlidXRlcw0KLWNvbnRyaWJ1dGVzX3RvX3RleHQ9Q29udHJpYnVpc2NlIGENCi1jb3B5cmlnaHRfdGV4dD1Db3B5cmlnaHQ6DQotZWRpdG9yX3RleHQ9RWRpdG9yDQotZXh0ZW5kc190ZXh0PUVzdGVuZGUNCi1leHRlbmRfdGV4dD1Fc3RlbmRpDQotZXh0ZXJuYWxEZXNjcmlwdGlvbl90ZXh0PURlc2NyaXppb25lIGVzdGVybmE6DQotZXh0ZXJuYWxJZF90ZXh0PUlEIGVzdGVybm86DQotZ29hbHNfdGV4dD1PYmlldHRpdmk6DQotaW1wYWN0T2ZOb3RIYXZpbmdfdGV4dD1JbXBhdHRvIGRlbGxhIG5vbiBkaXNwb25pYmlsaXRcdTAwZTA6DQota2V5Q29uc2lkZXJhdGlvbnNfdGV4dD1Db25zaWRlcmF6aW9uaSBjaGlhdmU6DQotbGV2ZWxzT2ZBZG9wdGlvbl90ZXh0PUxpdmVsbG8gZGkgYWRvemlvbmU6DQotbWFpbkRlc2NyaXB0aW9uX3RleHQ9RGVzY3JpemlvbmUgcHJpbmNpcGFsZToNCi1uZXdFbGVtZW50X3RleHQ9TnVvdm8gezB9DQotbmFtZV90ZXh0PU5vbWU6DQotbm90QXBwbGljYWJsZV90ZXh0PU5vbiBhcHBsaWNhYmlsZQ0KLXBhY2thZ2luZ0d1aWRhbmNlX3RleHQ9R3VpZGEgYWxsYSBjcmVhemlvbmUgcGFjY2hldHRpOg0KLXByZXNlbnRhdGlvbk5hbWVfdGV4dD1Ob21lIHByZXNlbnRhemlvbmU6DQotcHJvbXB0Zm9ybGliYXJ5X3RleHQ9UmljaGllZGkgbGlicmVyaWEgZGVpIG1ldG9kaSBhbGwnYXZ2aW8NCi1lbmFibGVIZWFsdGhDaGVja190ZXh0PUFiaWxpdGEgdG9vbCBkaSBkZWJ1ZyBpbnRlcm5pDQotcHJvYmxlbV90ZXh0PVByb2JsZW1hOg0KLXB1cnBvc2VfdGV4dD1TY29wbzoNCi1yZWFzb25Gb3JOb3ROZWVkaW5nX3RleHQ9TW90aXZvIGRlbGxhIG5vbiBuZWNlc3NpdFx1MDBlMDoNCi1yZXBsYWNlc190ZXh0PVNvc3RpdHVpc2NlDQotbG9jYWxSZXBsYWNlc190ZXh0PUxvY2FsUmVwbGFjZXMNCi1yZXByZXNlbnRhdGlvbk9wdGlvbnNfdGV4dD1PcHppb25pIGRpIHJhcHByZXNlbnRhemlvbmU6DQotdGVtcGxhdGVGaWxlX3RleHQ9RmlsZSBkaSBtb2RlbGxvOg0KLXNraWxsc190ZXh0PVNraWxsOg0KLXN0ZXBzX3RleHQ9UGFzc2k6DQotc3RlcHNfbmFtZV90ZXh0PU5vbWU6DQotc3RvcF90ZXh0PUludGVycm9tcGkNCi1wcmludF90ZXh0PVN0YW1wYQ0KLXN5bm9ueW1zX3RleHQ9U2lub25pbWk6DQotdHlwZV90ZXh0PVRpcG86DQotY29weV90ZXh0PUNvcGlhDQotZGVlcENvcHlfdGV4dD1Db3BpYSBwcm9mb25kYQ0KLWJhY2tfdGV4dD1JbmRpZXRybw0KLW5ld19wbHVnaW49TnVvdm8gcGx1Zy1pbiBkaSBtZXRvZG8NCi1tb3ZlPVNwb3N0YS4uLg0KLXVuaXF1ZUlkX3RleHQ9SUQgdW5pdm9jbzoNCi12YXJpYWJpbGl0eVR5cGVfdGV4dD1UaXBvIGRpIHZhcmlhYmlsaXRcdTAwZTA6DQotdmVyc2lvbl90ZXh0PVZlcnNpb25lOg0KLQ0KLSMgQnV0dG9uIExhYmVscw0KLWFkZEJ1dHRvbl90ZXh0PUFnZ2l1bmdpLi4uDQotYXR0YWNoQnV0dG9uX3RleHQ9QWxsZWdhLi4uDQotYnJvd3NlQnV0dG9uX3RleHQ9U2ZvZ2xpYS4uLg0KLWNoYW5nZVR5cGVCdXR0b25fdGV4dD1Nb2RpZmljYSB0aXBvLi4uDQotY2xlYXJCdXR0b25fdGV4dD1DYW5jZWxsYQ0KLWRlbGV0ZUJ1dHRvbl90ZXh0PUVsaW1pbmENCi1kZXRhY2hCdXR0b25fdGV4dD1TZXBhcmENCi1kaWFncmFtX3NhdmVFcnJvcj1FcnJvcmUgZHVyYW50ZSBpbCBzYWx2YXRhZ2dpbyBkZWwgZGlhZ3JhbW1hDQotZG93bkJ1dHRvbl90ZXh0PUdpXHUwMGY5DQotZGlyZWN0b3J5X3RleHQ9RGlyZWN0b3J5Og0KLW9yZGVyQnV0dG9uX3RleHQ9T3JkaW5hDQotZWRpdEJ1dHRvbl90ZXh0PU1vZGlmaWNhLi4uDQotcmVtb3ZlQnV0dG9uX3RleHQ9UmltdW92aQ0KLXJlbmFtZUFjdGlvbl90ZXh0PVJpbm9taW5hLi4uDQotcmVtb3ZlX3RleHQ9UmltdW92aQ0KLXJlbmFtZV90ZXh0PVJpbm9taW5hDQotU2F2ZUFzX3RleHQ9U2FsdmEgY29uIG5vbWUNCi1zZWxlY3RCdXR0b25fdGV4dD1TZWxlemlvbmEuLi4NCi1kZXNlbGVjdEJ1dHRvbl90ZXh0PURlc2VsZXppb25hDQotdXBCdXR0b25fdGV4dD1TdQ0KLW1ha2VEZWZhdWx0QnV0dG9uX3RleHQ9UmVuZGkgcHJlZGVmaW5pdGENCi12aWV3SGlzdG9yeUJ1dHRvbl90ZXh0PVZpc3VhbGl6emEgY3Jvbm9sb2dpYS4uLg0KLQ0KLSMgUm9sZSBFZGl0b3IgVGFza3MgUGFnZQ0KLXJvbGVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9T3BlcmF6aW9uaQ0KLXJvbGVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVF1ZXN0byBydW9sbyBcdTAwZTggbCdlc2VjdXRvcmUgZGVsbGUgc2VndWVudGkgb3BlcmF6aW9uaS4NCi1yb2xlVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPU9wZXJhemlvbmkgZGlzcG9uaWJpbGkNCi1yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9RXNlY3V0b3JlIHByaW1hcmlvOg0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9RXNlY3V0b3JlIGFnZ2l1bnRpdm86DQotcm9sZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNvbm8gc3RhdGUgc2VsZXppb25hdGUgezB9IG9wZXJhemlvbmkuDQotDQotIyBSb2xlIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kb3R0aSBkaSBsYXZvcm86DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVNwZWNpZmljYXJlIGkgcHJvZG90dGkgZGkgbGF2b3JvIGRpIGN1aSBcdTAwZTggcmVzcG9uc2FiaWxlIHF1ZXN0byBydW9sby4NCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1Qcm9kb3R0aSBkaSBsYXZvcm8gZGlzcG9uaWJpbGk6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZXNwb25zYWJpbGUgZGk6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9UHJvZG90dGkgZGkgbGF2b3JvIGNoZSBzb25vIGdsaSBvdXRwdXQgZGVsbGUgb3BlcmF6aW9uaSBlc2VndWl0ZSBkYSBxdWVzdG8gcnVvbG86DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1Tb25vIHN0YXRpIHNlbGV6aW9uYXRpIHswfSBwcm9kb3R0aSBkaSBsYXZvcm8uDQotDQotIyBSb2xlIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1HdWlkYQ0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUZvcm5pcmUgY29sbGVnYW1lbnRpIGEgaW5mb3JtYXppb25pIGFnZ2l1bnRpdmUgc290dG8gZm9ybWEgZGkgZ3VpZGEuDQotcm9sZUd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1HdWlkYSBkaXNwb25pYmlsZToNCi1yb2xlR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9R3VpZGE6DQotcm9sZUd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNvbm8gc3RhdGUgc2VsZXppb25hdGUgezB9IGd1aWRlLg0KLQ0KLSMgUm9sZSBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUNhdGVnb3JpZToNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3RpcmUgbGUgY2F0ZWdvcmllIGEgY3VpIGFwcGFydGllbmUgcXVlc3RvIHJ1b2xvLg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1JbnNpZW1pIGRpIHJ1b2xpOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9Q2F0ZWdvcmllIHBlcnNvbmFsaXp6YXRlOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPUluc2llbWkgZGkgcnVvbGk6DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUNhdGVnb3JpZSBwZXJzb25hbGl6emF0ZToNCi0NCi0jIFRhc2sgRWRpdG9yIFJvbGVzIFBhZ2UNCi10YXNrUm9sZXNQYWdlX3NlY3Rpb25OYW1lPVJ1b2xpDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QXNzZWduYXJlIGkgcnVvbGkgcGVyIGVzZWd1aXJlIHF1ZXN0YSBvcGVyYXppb25lLg0KLXRhc2tSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9UnVvbGkgZGlzcG9uaWJpbGk6DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPUVzZWN1dG9yZSBwcmltYXJpbzoNCi10YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUVzZWN1dG9yaSBhZ2dpdW50aXZpOg0KLXRhc2tSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1Tb25vIHN0YXRpIHNlbGV6aW9uYXRpIHswfSBydW9saS4NCi10YXNrUm9sZXNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbW9kaWZ5X21lc3NhZ2U9SVVQQTAwMDQ1VzogTW9kaWZpY2FyZSBsJydlc2VjdXRvcmUgcHJpbWFyaW8gaW4gJyd7MH0nJz8NCi10YXNrUm9sZXNQYWdlX2NvbmZpcm1fdGl0bGU9Q29uZmVybWFyZSBsYSBtb2RpZmljYSBkZWwgcnVvbG8gcHJpbWFyaW8NCi0NCi0jIFRhc2sgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVByb2RvdHRpIGRpIGxhdm9ybw0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZpY2FyZSBpIHByb2RvdHRpIGRpIGxhdm9ybyBpbnB1dCBlIG91dHB1dCBwZXIgcXVlc3RhIG9wZXJhemlvbmUuDQotdGFza1dvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9UHJvZG90dGkgZGkgbGF2b3JvIGRpc3BvbmliaWxpOg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9SW5wdXQgb2JibGlnYXRvcmk6DQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9SW5wdXQgZmFjb2x0YXRpdmk6DQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDM9T3V0cHV0Og0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U29ubyBzdGF0aSBzZWxlemlvbmF0aSB7MH0gcHJvZG90dGkgZGkgbGF2b3JvLg0KLQ0KLSMgVGFzayBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9R3VpZGENCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Gb3JuaXJlIGNvbGxlZ2FtZW50aSBhIGluZm9ybWF6aW9uaSBhZ2dpdW50aXZlIHNvdHRvIGZvcm1hIGRpIGd1aWRhLg0KLXRhc2tHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9R3VpZGEgZGlzcG9uaWJpbGU6DQotdGFza0d1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPUd1aWRhOg0KLXRhc2tHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1Tb25vIHN0YXRlIHNlbGV6aW9uYXRlIHswfSBndWlkZS4NCi0NCi0jIFRhc2sgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRlZ29yaWUNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3RpcmUgbGUgY2F0ZWdvcmllIGEgY3VpIGFwcGFydGllbmUgcXVlc3RhIG9wZXJhemlvbmUuDQotdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPURpc2NpcGxpbmUNCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPUNhdGVnb3JpZSBwZXJzb25hbGl6emF0ZQ0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPURpc2NpcGxpbmU6DQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUNhdGVnb3JpZSBwZXJzb25hbGl6emF0ZToNCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgVGFza3MgUGFnZQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25OYW1lPU9wZXJhemlvbmkNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb249UXVlc3RvIHByb2RvdHRvIGRpIGxhdm9ybyBcdTAwZTggdW4gaW5wdXQgb3BwdXJlIHVuIG91dHB1dCBwZXIgbGUgc2VndWVudGkgb3BlcmF6aW9uaS4NCi1Xb3JrUHJvZHVjdF9UYXNrc19BdmFpbGFibGVMYWJlbD1PcGVyYXppb25pIGRpc3BvbmliaWxpDQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbD1JbnB1dCBvYmJsaWdhdG9yaW86DQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDI9SW5wdXQgZmFjb2x0YXRpdm86DQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDM9T3V0cHV0Og0KLVdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U29ubyBzdGF0ZSBzZWxlemlvbmF0ZSB7MH0gb3BlcmF6aW9uaS4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgUm9sZXMgUGFnZQ0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVJ1b2xpDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUkgc2VndWVudGkgcnVvbGkgc29ubyByZXNwb25zYWJpbGkgb3BwdXJlIG1vZGlmaWNhbm8gcXVlc3RvIHByb2RvdHRvIGRpIGxhdm9yby4NCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1SdW9saSBkaXNwb25pYmlsaQ0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9UnVvbG8gcmVzcG9uc2FiaWxlOg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPU1vZGlmaWNhIGRlaSBydW9saToNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNvbm8gc3RhdGkgc2VsZXppb25hdGkgezB9IHJ1b2xpLg0KLQ0KLSMjIFdvcmsgUHJvZHVjdCBFZGl0b3IgRGVsaXZlcmFibGUgUGFydHMgUGFnZQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU9UGFydGkgZGlzdHJpYnVpYmlsaQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVNwZWNpZmljYXJlIGkgcHJvZG90dGkgZGkgbGF2b3JvIGNoZSBjb3N0aXR1aXNjb25vIHF1ZXN0byBjb21wb25lbnRlIGRpc3RyaWJ1aWJpbGUuDQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9hdmFpbGFibGVMYWJlbD1Qcm9kb3R0aSBkaSBsYXZvcm8gZGlzcG9uaWJpbGkgY29tZSBwYXJ0aSBkaXN0cmlidWliaWxpOg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Qcm9kb3R0aSBkaSBsYXZvcm8gY29tZSBwYXJ0aSBkaXN0cmlidWliaWxpOg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1Tb25vIHN0YXRpIHNlbGV6aW9uYXRpIHswfSBwcm9kb3R0aSBkaSBsYXZvcm8uDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1HdWlkYQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Gb3JuaXJlIGNvbGxlZ2FtZW50aSBhIGluZm9ybWF6aW9uaSBhZ2dpdW50aXZlIHNvdHRvIGZvcm1hIGRpIGd1aWRhLg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPUd1aWRhIGRpc3BvbmliaWxlOg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9R3VpZGE6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1Tb25vIHN0YXRlIHNlbGV6aW9uYXRlIHswfSBndWlkZS4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRlZ29yaWUNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGNhdGVnb3JpZSBhIGN1aSBhcHBhcnRpZW5lIHF1ZXN0byBwcm9kb3R0byBkaSBsYXZvcm8uDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1Eb21pbmkNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1UaXBpIGRpIHByb2RvdHRpIGRpIGxhdm9ybzoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMz1DYXRlZ29yaWUgcGVyc29uYWxpenphdGU6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPURvbWluaW86DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1UaXBpIGRpIHByb2RvdHRpIGRpIGxhdm9ybzoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzPUNhdGVnb3JpZSBwZXJzb25hbGl6emF0ZToNCi0NCi0jIFByYWN0aWNlIEVkaXRvciBSZWZlcmVuY2VzIFBhZ2UNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25OYW1lPUVsZW1lbnRpIGRlbCBjb250ZW51dG8NCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZpY2FyZSBnbGkgZWxlbWVudGkgZGVsIGNvbnRlbnV0byBjdWkgZmEgcmlmZXJpbWVudG8gcXVlc3RhIHByYXRpY2EuDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1FbGVtZW50aSBkZWwgY29udGVudXRvIGRpc3BvbmliaWxpOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1FbGVtZW50aSBkZWwgY29udGVudXRvOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1Tb25vIHN0YXRpIHNlbGV6aW9uYXRpIHswfSBlbGVtZW50aSBkZWwgY29udGVudXRvLg0KLQ0KLSMgQ2F0ZWdvcnkgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbk5hbWU9R3VpZGENCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3RpcmUgbGUgZ3VpZGUgY2hlIGFwcGFydGVuZ29ubyBhIHF1ZXN0byB7MH0uDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUd1aWRhIGRpc3BvbmliaWxlOg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPUd1aWRhOg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNvbm8gc3RhdGUgc2VsZXppb25hdGUgezB9IGd1aWRlLg0KLQ0KLSMgRGlzY2lwbGluZSBHcm91cGluZyBFZGl0b3IgRGlzY2lwbGluZXMgUGFnZQ0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uTmFtZT1EaXNjaXBsaW5lDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGRpc2NpcGxpbmUgYSBjdWkgYXBwYXJ0aWVuZSBxdWVzdG8gcmFnZ3J1cHBhbWVudG8gZGkgZGlzY2lwbGluZS4NCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RGlzY2lwbGluZSBkaXNwb25pYmlsaToNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1EaXNjaXBsaW5lOg0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNvbm8gc3RhdGUgc2VsZXppb25hdGUgezB9IGRpc2NpcGxpbmUuDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Vc2VEZWZhdWx0RGlyZWN0b3J5QnV0dG9uTGFiZWw9VXRpbGl6emEgZGlyZWN0b3J5IHByZWRlZmluaXRhDQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBUYXNrcyBQYWdlDQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1PcGVyYXppb25pDQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R2VzdGlyZSBsZSBvcGVyYXppb25pIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdGEgZGlzY2lwbGluYS4NCi1kaXNjaXBsaW5lVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPU9wZXJhemlvbmkgZGlzcG9uaWJpbGk6DQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsPU9wZXJhemlvbmk6DQotZGlzY2lwbGluZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNvbm8gc3RhdGUgc2VsZXppb25hdGUgezB9IG9wZXJhemlvbmkuDQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBSZWZlcmVuY2UgV29ya2Zsb3cgUGFnZQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbk5hbWU9Rmx1c3NpIGRpIGxhdm9ybyBkaSByaWZlcmltZW50bw0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3RpcmUgaSBmbHVzc2kgZGkgbGF2b3JvIGRpIHJpZmVyaW1lbnRvIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdGEgZGlzY2lwbGluYS4NCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX2F2YWlsYWJsZUxhYmVsPUZsdXNzaSBkaSBsYXZvcm8gZGkgcmlmZXJpbWVudG8gZGlzcG9uaWJpbGk6DQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsPUZsdXNzaSBkaSBsYXZvcm8gZGkgcmlmZXJpbWVudG86DQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNvbm8gc3RhdGkgc2VsZXppb25hdGkgezB9IGZsdXNzaSBkaSByaWZlcmltZW50by4NCi0NCi0jIERvbWFpbiBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kb3R0aSBkaSBsYXZvcm8NCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aXJlIGkgcHJvZG90dGkgZGkgbGF2b3JvIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdG8gZG9taW5pby4NCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVByb2RvdHRpIGRpIGxhdm9ybyBkaXNwb25pYmlsaToNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9UHJvZG90dGkgZGkgbGF2b3JvOg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1Tb25vIHN0YXRpIHNlbGV6aW9uYXRpIHswfSBwcm9kb3R0aSBkaSBsYXZvcm8uDQotDQotIyBXb3JrIFByb2R1Y3QgS2luZCBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kb3R0aSBkaSBsYXZvcm8NCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aXJlIGkgcHJvZG90dGkgZGkgbGF2b3JvIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdG8gdGlwbyBkaSBwcm9kb3R0byBkaSBsYXZvcm8uDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1Qcm9kb3R0aSBkaSBsYXZvcm8gZGlzcG9uaWJpbGk6DQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVByb2RvdHRpIGRpIGxhdm9ybzoNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U29ubyBzdGF0aSBzZWxlemlvbmF0aSB7MH0gcHJvZG90dGkgZGkgbGF2b3JvLg0KLQ0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPUluc2llbWkgZGkgcnVvbGkNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3RpcmUgZ2xpIGluc2llbWkgZGkgcnVvbGkgY2hlIGFwcGFydGVuZ29ubyBhIHF1ZXN0byByYWdncnVwcGFtZW50byBkaSBpbnNpZW1pIGRpIHJ1b2xpLg0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9hdmFpbGFibGVMYWJlbD1JbnNpZW1pIGRpIHJ1b2xpIGRpc3BvbmliaWxpOg0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWxlY3RlZExhYmVsPUluc2llbWkgZGkgcnVvbGk6DQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U29ubyBzdGF0aSBzZWxlemlvbmF0aSB7MH0gaW5zaWVtaSBkaSBydW9saS4NCi0NCi0jIFJvbGUgU2V0IEVkaXRvciBSb2xlcyBQYWdlDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1SdW9saQ0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3RpcmUgaSBydW9saSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RvIGluc2llbWUgZGkgcnVvbGkuDQotcm9sZVNldFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1SdW9saSBkaXNwb25pYmlsaToNCi1yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9UnVvbGk6DQotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNvbm8gc3RhdGkgc2VsZXppb25hdGkgezB9IHJ1b2xpLg0KLQ0KLSMgVG9vbCBFZGl0b3IgVG9vbCBNZW50b3JzIFBhZ2UNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25OYW1lPUd1aWRhIGFsIHRvb2wNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGd1aWRlIGFpIHRvb2wgY2hlIGFwcGFydGVuZ29ubyBhIHF1ZXN0byB0b29sLg0KLXRvb2xUb29sTWVudG9yc1BhZ2VfYXZhaWxhYmxlTGFiZWw9R3VpZGUgYWkgdG9vbCBkaXNwb25pYmlsaToNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw9R3VpZGUgYWkgdG9vbDoNCi10b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U29ubyBzdGF0ZSBzZWxlemlvbmF0ZSB7MH0gZ3VpZGUgYWkgdG9vbC4NCi0NCi0jIEN1c3RvbSBDYXRlZ29yeSBFZGl0b3IgQXNzaWduIFBhZ2UNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbk5hbWU9RWxlbWVudGkgZGVsIGNvbnRlbnV0bw0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R2VzdGlyZSBnbGkgZWxlbWVudGkgZGVsIGNvbnRlbnV0byBjaGUgY29zdGl0dWlzY29ubyBxdWVzdGEgY2F0ZWdvcmlhIHBlcnNvbmFsaXp6YXRhLg0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9hdmFpbGFibGVMYWJlbD1FbGVtZW50aSBkZWwgY29udGVudXRvIGRpc3BvbmliaWxpOg0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWxlY3RlZExhYmVsPUVsZW1lbnRpIGRlbCBjb250ZW51dG86DQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U29ubyBzdGF0aSBzZWxlemlvbmF0aSB7MH0gZWxlbWVudGkgZGVsIGNvbnRlbnV0by4NCi0NCi0jIE5ldyBNZXRob2QgUGx1Zy1pbiBXaXphcmQNCi1uZXdQbHVnaW5XaXphcmRfdGl0bGU9TnVvdm8gcGx1Zy1pbiBkaSBtZXRvZG8NCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlPUNyZWEgbnVvdm8gcGx1Zy1pbiBtZXRvZG8NCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RleHQ9U3BlY2lmaWNhcmUgdW4gbm9tZSBlIGZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHJlbGF0aXZlIGFsIG51b3ZvIHBsdWctaW4gZGkgbWV0b2RvLg0KLW5ld1BsdWdpbkVycm9yX21zZz1JVVBBMDAyMUU6IEltcG9zc2liaWxlIGNyZWFyZSBpbCBwbHVnLWluIGRpIG1ldG9kby4NCi1uZXdQbHVnaW5FcnJvcl9yZWFzb249RXJyb3JlIGludGVybm8uXG5cDQotXG5cDQotRmFyZSBjbGljIHN1IERldHRhZ2xpIHBlciB1bHRlcmlvcmkgaW5mb3JtYXppb25pLg0KLQ0KLSMgR2VuZXJpYyBkaWFsb2cgdGl0bGVzDQotY3JlYXRlRGlhbG9nX3RpdGxlPUNyZWEgZWxlbWVudG8NCi1kZWxldGVEaWFsb2dfdGl0bGU9RWxpbWluYSBlbGVtZW50bw0KLWVkaXREaWFsb2dfdGl0bGU9TW9kaWZpY2EgZWxlbWVudG8NCi1lcnJvckRpYWxvZ190aXRsZT1FcnJvcmUNCi1tb3ZlRGlhbG9nX3RpdGxlPVNwb3N0YSBlbGVtZW50bw0KLXJlbmFtZURpYWxvZ190aXRsZT1SaW5vbWluYSBlbGVtZW50bw0KLXdhcm5pbmdEaWFsb2dfdGl0bGU9QXZ2aXNvDQotDQotIyBBZGQgQ29uZmlndXJhdGlvbiB0byBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWFkZENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPUFnZ2l1bmdpIGNvbmZpZ3VyYXppb25lIGEgcHJvY2Vzc28NCi0NCi0jIFNldCBEZWZhdWx0IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotc2V0RGVmYXVsdENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPUltcG9zdGEgY29uZmlndXJhemlvbmUgcHJlZGVmaW5pdGEgcGVyIHByb2Nlc3NvDQotDQotIyBFZGl0IFByb2Nlc3MgRXJyb3IgRGlhbG9nDQotZWRpdFByb2Nlc3NFbGVtZW50RXJyb3JEaWFsb2dfdGl0bGU9TW9kaWZpY2EgZWxlbWVudG8gcHJvY2Vzc28NCi0NCi0jIE9wZW4gTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1BcHJpIGxpYnJlcmlhIGRlaSBtZXRvZGkNCi1vcGVuTGlicmFyeURpYWxvZ190ZXh0PUxhIGxpYnJlcmlhIGRlaSBtZXRvZGkgY29ycmVudGUgbm9uIFx1MDBlOCBzdGF0YSBzYWx2YXRhIGNvcnJldHRhbWVudGUuIElnbm9yYXJlIGwnZXJyb3JlIGUgYXByaXJlIHVuJ2FsdHJhIGxpYnJlcmlhPw0KLQ0KLSMgU2F2ZSBMaWJyYXJ5IERpYWxvZw0KLXNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlPVNhbHZhIGxpYnJlcmlhIGRlaSBtZXRvZGkNCi1zYXZlTGlicmFyeURpYWxvZ190ZXh0PUxhIGxpYnJlcmlhIGRlaSBtZXRvZGkgY29ycmVudGUgXHUwMGU4IHN0YXRhIG1vZGlmaWNhdGEuIFNhbHZhcmUgbGUgbW9kaWZpY2hlPw0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPUFnZ2lvcm5hIGxpYnJlcmlhIGRlaSBtZXRvZGkNCi0NCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cNCi1kZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PUwnJ2VsZW1lbnRvICcnezB9JycgXHUwMGU4IHN0YXRvIGdpXHUwMGUwIGVsaW1pbmF0by4gUmltdW92ZXJsbyBkYSAnJ3sxfScnPw0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1ub09wZW5MaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDAwRTogTmVzc3VuYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGFwZXJ0YS5cblwNCi1cblwNCi1QcmltYSBkaSBwb3RlciBhZ2dpdW5nZXJlIHVuIG51b3ZvIGVsZW1lbnRvIG1ldG9kbywgXHUwMGU4IG5lY2Vzc2FyaW8gYXByaXJlIHVuYSBsaWJyZXJpYSBkZWkgbWV0b2RpLlxuXA0KLVxuXA0KLUNyZWFyZSB1bmEgbnVvdmEgbGlicmVyaWEgZGVpIG1ldG9kaSBvcHB1cmUgYXByaXJuZSB1bmEgZXNpc3RlbnRlIGUgcHJvdmFyZSBkaSBudW92by4NCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEEwMDAxRTogSWwgbm9tZSB7MH0gbWFuY2EuXG5cDQotXG5cDQotVHV0dGkgZ2xpIGVsZW1lbnRpIGRpIG1ldG9kbyBlIGRpIHByb2Nlc3NvIGRldm9ubyBhdmVyZSB1biBub21lLlxuXA0KLVxuXA0KLUZhcmUgY2xpYyBzdSBPSyBlIGltbWV0dGVyZSB1biBub21lIHZhbGlkbyBwZXIgbCcnZWxlbWVudG8uDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFOiBJbCBub21lICcnezB9JycgZXNpc3RlIGdpXHUwMGUwLlxuXA0KLVxuXA0KLUdsaSBlbGVtZW50aSBkaSBtZXRvZG8gZGV2b25vIGF2ZXJlIHVuIG5vbWUgdW5pdm9jby5cblwNCi1cblwNCi1GYXJlIGNsaWMgc3UgT0sgZSBpbW1ldHRlcmUgdW4gbm9tZSBkaWZmZXJlbnRlIHBlciBsJydlbGVtZW50by4NCi1jcmVhdGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDNFOiBJbXBvc3NpYmlsZSBjcmVhcmUgbGEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvLg0KLWRlbGV0ZUNvbmZpZ0Vycm9yX21zZz1JVVBBMDAwNFc6IEltcG9zc2liaWxlIGVsaW1pbmFyZSBsYSBjb25maWd1cmF6aW9uZSBkaSBtZXRvZG8uDQotaW50ZXJuYWxFcnJvcl9tc2c9SVVQQTAwMDVFOiBTaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUgaW50ZXJuby5cblwNCi1cblwNCi1GYXJlIGNsaWMgc3UgRGV0dGFnbGkgcGVyIHVsdGVyaW9yaSBpbmZvcm1hemlvbmkuDQotaW52YWxpZFByZXNlbnRhdGlvbk5hbWVFcnJvcl9tc2c9SVVQQTAwMDZFOiBJbCBub21lIGRlbGxhIHByZXNlbnRhemlvbmUgc3BlY2lmaWNhdG8gbm9uIFx1MDBlOCB2YWxpZG8uXG5cDQotXG5cDQotRmFyZSBjbGljIHN1IE9LIGUgaW1tZXR0ZXJlIHVuIG5vbWUgZGlmZmVyZW50ZS4NCi1pbnZhbGlkQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDA3RTogTGEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvIHNlbGV6aW9uYXRhICcnezB9Jycgbm9uIFx1MDBlOCB1biBzb3R0b2luc2llbWUgZGVsbGEgY29uZmlndXJhemlvbmUgcHJlZGVmaW5pdGEgZGVsIHByb2Nlc3NvLlxuXA0KLVxuXA0KLVBlciBnYXJhbnRpcmUgbCcnaW50ZWdyaXRcdTAwZTAgZGkgdW4gcHJvY2Vzc28sIFx1MDBlOCBuZWNlc3NhcmlvIGNoZSBsYSBzdWEgY29uZmlndXJhemlvbmUgcHJlZGVmaW5pdGEgc2lhIHVuIHN1cGVyaW5zaWVtZSBkaSB0dXR0ZSBsZSBhbHRyZSBjb25maWd1cmF6aW9uaSBhc3NvY2lhdGUgYWwgcHJvY2Vzc28uXG5cDQotXG5cDQotU2VsZXppb25hcmUgdW4nJ2FsdHJhIGNvbmZpZ3VyYXppb25lIG9wcHVyZSBtb2RpZmljYXJlIGxhIGNvbmZpZ3VyYXppb25lIHByZWRlZmluaXRhIHBlciBpbmNsdWRlcmUgaWwgY29udGVudXRvIGRlbGxhIGNvbmZpZ3VyYXppb25lIGUgcHJvdmFyZSBkaSBudW92by4NCi1zZXREZWZhdWx0Q29uZmlnRXJyb3JfbXNnPUlVUEEwMDA4RTogTGEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvIHNlbGV6aW9uYXRhICcnezB9Jycgbm9uIFx1MDBlOCB1biBzdXBlcmluc2llbWUgZGVsbGUgYWx0cmUgY29uZmlndXJhemlvbmkgY3VpIGZhIHJpZmVyaW1lbnRvIGlsIHByb2Nlc3NvLlxuXA0KLVxuXA0KLVBlciBnYXJhbnRpcmUgbCcnaW50ZWdyaXRcdTAwZTAgZGkgdW4gcHJvY2Vzc28sIFx1MDBlOCBuZWNlc3NhcmlvIGNoZSBsYSBzdWEgY29uZmlndXJhemlvbmUgcHJlZGVmaW5pdGEgc2lhIHVuIHN1cGVyaW5zaWVtZSBkaSB0dXR0ZSBsZSBhbHRyZSBjb25maWd1cmF6aW9uaSBhc3NvY2lhdGUgYWwgcHJvY2Vzc28uXG5cDQotXG5cDQotU2VsZXppb25hcmUgdW4nJ2FsdHJhIGNvbmZpZ3VyYXppb25lIG9wcHVyZSBtb2RpZmljYXJlIGlsIGNvbnRlbnV0byBkZWxsYSBjb25maWd1cmF6aW9uZSBzZWxlemlvbmF0YSBlIHByb3ZhcmUgZGkgbnVvdm8uDQotb3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDlFOiBJbXBvc3NpYmlsZSBjYXJpY2FyZSBsYSBsaWJyZXJpYSBkZWkgbWV0b2RpLlxuXA0KLVxuXA0KLUZhcmUgY2xpYyBzdSBEZXR0YWdsaSBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4NCi1zYXZlTGlicmFyeUVycm9yX21zZz1JVVBBMDAxMEU6IEltcG9zc2liaWxlIHNhbHZhcmUgbGEgbGlicmVyaWEgZGVpIG1ldG9kaS4NCi1zYXZlTGlicmFyeVRvRXJyb3JfbXNnPUlVUEEwMDEwRTogSW1wb3NzaWJpbGUgc2FsdmFyZSBsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGluICcnezB9JycuDQotZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnPUlVUEEwMDExRTogTCcnZWxlbWVudG8gJyd7MH0nJyBcdTAwZTggc3RhdG8gZ2lcdTAwZTAgZWxpbWluYXRvLg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEyRTogSW1wb3NzaWJpbGUgYWdnaW9ybmFyZSBsYSBsaWJyZXJpYSBkZWkgbWV0b2RpLg0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1JVVBBMDAxNkU6IFNpIFx1MDBlOCB2ZXJpZmljYXRvIHVuIGVycm9yZS5cblwNCi1cblwNCi1GYXJlIGNsaWMgc3UgRGV0dGFnbGkgcGVyIHVsdGVyaW9yaSBpbmZvcm1hemlvbmkuDQotaW50ZXJuYWxFcnJvcl9yZWFzb249SVVQQTAwMTdFOiBTaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUgaW50ZXJuby5cblwNCi1cblwNCi1GYXJlIGNsaWMgc3UgRGV0dGFnbGkgcGVyIHVsdGVyaW9yaSBpbmZvcm1hemlvbmkuDQotdXBncmFkZUxpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMThFOiBTaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUgZHVyYW50ZSBpbCBjYXJpY2FtZW50byBkZWdsaSBlbGVtZW50aSBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpLlxuXA0KLVxuXA0KLUZhcmUgY2xpYyBzdSBEZXR0YWdsaSBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4NCi1zYXZlVXBncmFkZWRMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE5RTogU2kgXHUwMGU4IHZlcmlmaWNhdG8gdW4gZXJyb3JlIGR1cmFudGUgaWwgc2FsdmF0YWdnaW8gZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBhZ2dpb3JuYXRhLlxuXA0KLVxuXA0KLUZhcmUgY2xpYyBzdSBEZXR0YWdsaSBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9QXBlcnR1cmEgZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBpbiBjb3Jzby4uLg0KLXNhdmluZ0xpYnJhcnlUYXNrX25hbWU9U2FsdmF0YWdnaW8gZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBpbiBjb3Jzby4uLg0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9QWdnaW9ybmFtZW50byBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGluIGNvcnNvLi4uDQotbG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2tfbmFtZT1DYXJpY2FtZW50byBkZWdsaSBlbGVtZW50aSBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGluIGNvcnNvLi4uDQotc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZT1TYWx2YXRhZ2dpbyBkZWdsaSBlbGVtZW50aSBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIG5lbCBudW92byBmb3JtYXRvIGZpbGUgaW4gY29yc28uLi4NCi1zYXZpbmdUYXNrX25hbWU9U2FsdmF0YWdnaW8gZGkgJyd7MH0nJyBpbiBjb3Jzby4uLg0KLXNhdmluZ0ZpbGVzVGFza19uYW1lPVNhbHZhdGFnZ2lvIGRlaSBmaWxlIGluIGNvcnNvLi4uDQotZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU9Q29ycmV6aW9uZSBkZWkgR1VJRCBkZWxsZSBkZXNjcml6aW9uaSBkZWwgY29udGVudXRvIGluIGNvcnNvLi4uDQotZGVsZXRpbmdJbnZhbGlkUmVmZXJlbmNlc1Rhc2tfbmFtZT1FbGltaW5hemlvbmUgZGVpIHJpZmVyaW1lbnRpIG5vbiB2YWxpZGkgaW4gY29yc28uLi4NCi0NCi0NCi0jIEFkZCBFZGl0b3IgVG8gQnJvd3NpbmcgUGVyc3BlY3RpdmUgV2FybmluZyBEaWFsb2cNCi1hZGRFZGl0b3JUb1BlcnNwZWN0aXZlV2FybmluZ19tc2c9SVVQQTAwNDZXOiBRdWVzdGEgcHJvc3BldHRpdmEgXHUwMGU4IHN0YXRhIHByb2dldHRhdGEgYXBwb3NpdGFtZW50ZSBwZXIgYWdldm9sYXJlIGdsaSB1dGVudGkgbmVsbGEgdmlzdWFsaXp6YXppb25lIGRlbGxlIHJhcHByZXNlbnRhemlvbmkgSFRNTCBkZWdsaSBlbGVtZW50aSBkZWxsZSBsaWJyZXJpZSBkZWkgbWV0b2RpLiBOb24gXHUwMGU4IHBvc3NpYmlsZSBhZ2dpdW5nZXJlIG8gdmlzdWFsaXp6YXJlIGFsY3VuIGVkaXRvci4NCi0NCi0jIENoYW5nZSBIaXN0b3J5IERpYWxvZw0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfdGl0bGU9TW9kaWZpY2EgY3Jvbm9sb2dpYSBkZXNjcml6aW9uZQ0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfbGFiZWw9TW9kaWZpY2EgY3Jvbm9sb2dpYToNCi0NCi0jIE1ldGhvZCBFbGVtZW50IERlbGV0ZSBBY3Rpb24NCi1jb25maXJtRGVsZXRlRGlhbG9nX3RpdGxlPUNvbmZlcm1hIGVsaW1pbmF6aW9uZQ0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnPUVsaW1pbmFyZSAnJ3swfScnPw0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnV2l0aFJlZmVyZW5jZT1FbGltaW5hcmUgJyd7MH0nJz9cblwNCi1cblwNCi1JIHNlZ3VlbnRpIGVsZW1lbnRpIGNvbnRlbmdvbm8gcmlmZXJpbWVudGkgYWQgZWxlbWVudGkgY2hlIGRldm9ubyBlc3NlcmUgZWxpbWluYXRpOiB7MX0NCi0NCi0jIE5ldyBMaWJyYXJ5IERpYWxvZw0KLWVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjJFOiBJbXBvc3NpYmlsZSBjcmVhcmUgbGEgbGlicmVyaWEgZGVpIG1ldG9kaSAnJ3swfScnLg0KLWVycm9yRGlhbG9nX2Vycm9yPUltcG9zc2liaWxlIGNyZWFyZSB1bmEgbGlicmVyaWEgZGVpIG1ldG9kaSBpbiB1bidhbHRyYSBsaWJyZXJpYSBkZWkgbWV0b2RpLg0KLWVycl9ub29wZW5saWJyYXJ5PUlVUEEwMDQwRTogTmVzc3VuYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGFwZXJ0YS5cblwNCi1cblwNCi1QcmltYSBkaSBwb3RlciBhZ2dpdW5nZXJlIHVuIG51b3ZvIHBsdWctaW4gZGkgbWV0b2RvLCBcdTAwZTggbmVjZXNzYXJpbyBhcHJpcmUgdW5hIG51b3ZhIGxpYnJlcmlhIGRlaSBtZXRvZGkuXG5cDQotXG5cDQotQ3JlYXJlIHVuYSBudW92YSBsaWJyZXJpYSBkZWkgbWV0b2RpIG9wcHVyZSBhcHJpcm5lIHVuYSBlc2lzdGVudGUgZSBwcm92YXJlIGRpIG51b3ZvLg0KLWVycl9sb2FkaW5nbGlicmFyeT1FcnJvcmUgZHVyYW50ZSBpbCBjYXJpY2FtZW50byBkZWxsYSBsaWJyZXJpYQ0KLW1zZ19yZWxvYWRMaWJyYXJ5PUVycm9yZSBkdXJhbnRlIGwnYW5udWxsYW1lbnRvIGRlbGwnb3BlcmF6aW9uZSBkaSBlbGltaW5hemlvbmUgbm9uIHJpdXNjaXRhLiBPY2NvcnJlIHJpY2FyaWNhcmUgbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBjb3JyZW50ZS4NCi0NCi0jIFJlbG9hZCBMaWJyYXJ5IERpYWxvZw0KLXJlbG9hZERpYWxvZ19tZXNzYWdlPUxhIGxpYnJlcmlhIGRldmUgZXNzZXJlIHJpY2FyaWNhdGEgcGVyIHJpcHJpc3RpbmFybmUgbG8gc3RhdG8gb3JpZ2luYWxlLg0KLXJlbG9hZERpYWxvZ190aXRsZT1SaWNhcmljYSBsaWJyZXJpYQ0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlPUVycm9yZSBkaSBzcG9zdGFtZW50bw0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U9RXJyb3JlIGR1cmFudGUgbG8gc3Bvc3RhbWVudG8NCi0NCi0jIFByb2Nlc3MgRm9ybSBFZGl0b3INCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU9U2FsdmENCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTE9UXVlc3RhIG1vZGlmaWNhIGludGVyZXNzZXJcdTAwZTAgdHV0dGkgaSBkaWFncmFtbWkgZGVsIHByb2Nlc3NvLiBMJ2VkaXRvciB2ZXJyXHUwMGUwIHNhbHZhdG8gZG9wbyBsZSBtb2RpZmljaGUuIENvbnRpbnVhcmU/DQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UyPUwnZWRpdG9yIHZlcnJcdTAwZTAgc2FsdmF0byBkb3BvIGxlIG1vZGlmaWNoZS4gQ29udGludWFyZT8NCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBQYWdlDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPUNvbmZlcm1hIHJpbW96aW9uZQ0KLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlPVJpbXVvdmVyZSBsYSB2aXN0YSAnJ3swfScnPw0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ190aXRsZT1BdnZpc28NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uPUNvbmZpZ3VyYXppb25lOg0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3cz1WaXN0ZSBkaSBjb25maWd1cmF6aW9uZQ0KLWNvbmZpZ1ZpZXdQYWdlX3ZpZXdzPVZpc3RlDQotY29sdW1uc2VsZWN0aW9uX3RleHQ9U2VsZXppb25lIGNvbG9ubmE6DQotY29uZmlnVmlld1BhZ2VfYWRkVmlld0J1dHRvblRleHQ9QWdnaXVuZ2kgdmlzdGEuLi4NCi1jb25maWdWaWV3UGFnZV9yZW1vdmVWaWV3QnV0dG9uVGV4dD1SaW11b3ZpIHZpc3RhDQotY29uZmlnVmlld1BhZ2VfbWFrZURlZmF1bHRCdXR0b25UZXh0PVJlbmRpIHByZWRlZmluaXRhDQotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNXOiBMYSB2aXN0YSBjb24gaWwgbm9tZSAnJ3swfScnIGVzaXN0ZSBnaVx1MDBlMC4NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25UaXRsZT1WaXN0ZSBkaSBuYXZpZ2F6aW9uZSBwdWJibGljYXRlDQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uTWVzc2FnZT1TcGVjaWZpY2FyZSBsZSB2aXN0ZSBjaGUgdmVycmFubm8gaW5jbHVzZSBxdWFuZG8gcXVlc3RhIHB1YmJsaWNhemlvbmUgdmVyclx1MDBlMCBwdWJibGljYXRhLiBQZXIgY3JlYXJlIHVuYSB2aXN0YSwgZmFyZSBjbGljIHN1IEFnZ2l1bmdpIHZpc3RhIHBlciBzZWxlemlvbmFyZSBxdWFsc2lhc2kgY2F0ZWdvcmlhIHN0YW5kYXJkIG8gcGVyc29uYWxpenphdGEgYWxsJ2ludGVybm8gZGVsbGEgY29uZmlndXJhemlvbmUuICBMYSBjYXRlZ29yaWEgc2VsZXppb25hdGEgcmFwcHJlc2VudGVyXHUwMGUwIGxhIHZpc3RhLCBsZSBzb3R0b2NhdGVnb3JpZSBkZWxsYSBjYXRlZ29yaWEgZSBnbGkgZWxlbWVudGkgZGVsIGNvbnRlbnV0byByYXBwcmVzZW50ZXJhbm5vIGdsaSBlbGVtZW50aSBkZWxsYSBzdHJ1dHR1cmEgZGVsbGEgdmlzdGEuDQotDQotIyBEZXNjcmlwdGlvbiBUYWINCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZT1Db252ZXJ0aSBndWlkYQ0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxPUlVUEEwMDQwVzogIFNhbHZhcmUgcHJpbWEgbCdlZGl0b3IuDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTI9Tm9uIGNpIHNvbm8gZ3VpZGUgY29tcGF0aWJpbGkgcGVyIHF1ZXN0byB0aXBvLg0KLQ0KLWNoYW5nZUFjdGl2aXR5VHlwZVdhcm5pbmdEaWFsb2dfdGl0bGU9Q29udmVydGkgYXR0aXZpdFx1MDBlMA0KLSMgQXNzb2NpYXRpb24gRm9ybSBQYWdlDQotQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWw9QnJldmUgZGVzY3JpemlvbmUgZGVsbCdlbGVtZW50byBzZWxlemlvbmF0bzoNCi0NCi0jIE1ldGhvZCBFbGVtZW50IERlc2NyaXB0aW9uDQotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX3RpdGxlPUltbWV0dGVyZSBub21lIGVsZW1lbnRvDQotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX21lc3NhZ2U9SWwgY2FtcG8gbm9tZSBub24gcHVcdTAwZjIgZXNzZXJlIHZ1b3RvLg0KLQ0KLSMgTWV0aG9kIFBsdWctaW4gRGVzY3JpcHRpb24NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZT1EZXNlbGV6aW9uYW5kbyBpIHBsdWctaW4gYSBjdWkgdmllbmUgZmF0dG8gcmlmZXJpbWVudG8gZSBjaGUgc29ubyBhc3NvY2lhdGkgYWwgcGx1Zy1pbiAnJ3swfScnLCB2ZW5nb25vIGdlbmVyYXRlIHJlbGF6aW9uaSBub24gdmFsaWRlIGNoZSB2ZXJyYW5ubyBlbGltaW5hdGUuXG5cDQotXG5cDQotUXVlc3RhIGF6aW9uZSBub24gcHVcdTAwZjIgZXNzZXJlIGFubnVsbGF0YS4gUHJvY2VkZXJlIGNvbiBxdWVzdGEgbW9kaWZpY2E/DQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU9U2kgc3RhIHBlciBtb2RpZmljYXJlIGlsIG5vbWUgZGkgcXVlc3RvIHBsdWctaW4gZGkgbWV0b2RvIGRhICcnezB9JycgbmVsIG51b3ZvIG5vbWUgJyd7MX0nJy4gUXVlc3RhIGF6aW9uZSBzYWx2YSBsJydlZGl0b3IgZSByaW5vbWluYSBsYSBjYXJ0ZWxsYSBkZWkgcGx1Zy1pbi4gQ29udGludWFyZT8NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZT1SaW5vbWluYSBwbHVnLWluIGRpIG1ldG9kbw0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jYW5ub3RSZW5hbWVQbHVnaW5Gb2xkZXI9SW1wb3NzaWJpbGUgcmlub21pbmFyZSBsYSBjYXJ0ZWxsYSBkZWkgcGx1Zy1pbiBjb24gdW4gbnVvdm8gbm9tZQ0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luTGFiZWw9QmxvY2NhIHBsdWctaW4NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbl9tZXNzYWdlPURvcG8gYXZlciBibG9jY2F0byBpbCBwbHVnLWluLCBnbGkgZWRpdG9yIGRlZ2xpIGVsZW1lbnRpIGNoZSBhcHBhcnRlbmdvbm8gYWwgcGx1Zy1pbiAnJ3swfScnIHZlcnJhbm5vIHNhbHZhdGkgZSBjaGl1c2kuIFByb2NlZGVyZSBjb24gcXVlc3RhIG1vZGlmaWNhPw0KLQ0KLSMgUHJvY2VzcyBEZXNjcmlwdGlvbg0KLXByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX3RpdGxlPVJpbm9taW5hDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZT1TaSBzdGEgcGVyIG1vZGlmaWNhcmUgaWwgbm9tZSBkaSBxdWVzdG8gcHJvY2Vzc28uIEluIHRhbCBtb2RvLCBsJ2VkaXRvciB2ZXJyXHUwMGUwIHNhbHZhdG8gZSBsYSBjYXJ0ZWxsYSBkZWkgcHJvY2Vzc2kgdmVyclx1MDBlMCByaW5vbWluYXRhLiBDb250aW51YXJlPw0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uRGVzY3JpcHRpb249RGVzY3JpemlvbmU6DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uVGl0bGU9Q29uZmlndXJhemlvbmUNCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlPVNwZWNpZmljYXJlIHR1dHRlIGxlIGNvbmZpZ3VyYXppb25pIHZhbGlkZSBwZXIgcXVlc3RvIHByb2Nlc3NvLiBTZWxlemlvbmFyZSB1bmEgY29uZmlndXJhemlvbmUgY29tZSBwcmVkZWZpbml0YTsgZGV2ZSBlc3NlcmUgdW5hIHN1cGVyc2VyaWUgZGkgdHV0dGUgbGUgYWx0cmUgY29uZmlndXJhemlvbmkuDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25zPUNvbmZpZ3VyYXppb25pOg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9kZWZhdWx0PShwcmVkZWZpbml0YSkNCi1Qcm9jZXNzRGVzY3JpcHRpb25fc2VsZWN0Q29uZmlndXJhdGlvbj1TZWxlemlvbmEgY29uZmlndXJhemlvbmkgZGEgYWdnaXVuZ2VyZQ0KLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQwPUluIHRhbCBtb2RvLCBsJydlZGl0b3IgY29ycmVudGUgdmVyclx1MDBlMCBzYWx2YXRvIGUgbGEgbW9kaWZpY2Egc2FyXHUwMGUwIHBlcm1hbmVudGUuIEVsaW1pbmFyZSAnJ3swfScnPw0KLVByb2Nlc3NEZWxldGVBY3Rpb25fc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZT1JIHNlZ3VlbnRpIGRlc2NyaXR0b3JpIG5vbiB2ZW5nb25vIHV0aWxpenphdGkgb3Z1bnF1ZSBkb3BvIGwnZWxpbWluYXppb25lIGRlZ2xpIGVsZW1lbnRpIHNlbGV6aW9uYXRpLlxuXA0KLVNlbGV6aW9uYXJlIGkgZGVzY3JpdHRvcmkgZGEgZWxpbWluYXJlLg0KLQ0KLSMgVmlldyBIZWxwZXINCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfdGl0bGU9Q29udHJvbGxvIGludGVncml0XHUwMGUwIGxpYnJlcmlhDQotdmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2s9RXNlY3V6aW9uZSBkZWwgY29udHJvbGxvIGRpIGludGVncml0XHUwMGUwIGRlbGxhIGxpYnJlcmlhIGluIGNvcnNvLi4uDQotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U9SWwgY29udHJvbGxvIGRpIGludGVncml0XHUwMGUwIGRlbGxhIGxpYnJlcmlhIGFwZXJ0YSBcdTAwZTggc3RhdG8gY29tcGxldGF0by4gQ29uc3VsdGFyZSBpbCByZXBvcnQgbmVsIGZpbGUgZGkgbG9nLg0KLQ0KLSMgQXR0YWNoIFRlbXBsYXRlIEZpbGUgRGlhbG9nDQotYXR0YWNoVGVtcGxhdGVGaWxlRGlhbG9nX3RpdGxlPUFsbGVnYSBmaWxlIGRpIG1vZGVsbG8NCi0NCi0jIENyZWF0ZSBFbGVtZW50IEVycm9yIERpYWxvZw0KLWNyZWF0ZUVsZW1lbnREaWFsb2dfdGl0bGU9Q3JlYSBudW92byB7MH0NCi1jcmVhdGVOZXdFbGVtZW50RXJyb3JfbXNnPUVycm9yZSBkdXJhbnRlIGxhIGNyZWF6aW9uZSBkZWwgbnVvdm8gezB9Lg0KLQ0KLWRsZ1RpdGxlX3JlbG9hZExpYnJhcnk9UmljYXJpY2EgbGlicmVyaWENCi1jcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uPUlsIG5vbWUgZGkgezB9IG5vbiBwdVx1MDBmMiBlc3NlcmUgdnVvdG8uXG5cDQotXG5cDQotU3BlY2lmaWNhcmUgdW4gbm9tZSBlIHByb3ZhcmUgZGkgbnVvdm8uDQotZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uPUFsbGEgY29uZmlndXJhemlvbmUgZmEgcmlmZXJpbWVudG8gaWwgcHJvY2Vzc28gJyd7MH0nJyANCi0jIENoYW5nZUJvdW5kc0NvbW1hbmQNCi1nZWZfY2hhbmdlQm91bmRzQ29tbWFuZF9sYWJlbD1Nb2RpZmljYSBsaW1pdGkNCi0jIENoYW5nZU5hbWVDb21tYW5kDQotZ2VmX2NoYW5nZU5hbWVDb21tYW5kX2xhYmVsPU1vZGlmaWNhIG5vbWUNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U9SW1wb3NzaWJpbGUgYW5udWxsYXJlIGxhIG1vZGlmaWNhIGRlbCBub21lLlxuXA0KLVxuXA0KLU5vbiBcdTAwZTggcG9zc2liaWxlIGFubnVsbGFyZSBsYSBtb2RpZmljYSBkZWwgbm9tZSBzZSBpbCBub21lIHByZWNlZGVudGUgXHUwMGU4IG51bGxvLg0KLSMgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQNCi1nZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw9TW9kaWZpY2EgdmFsb3JlIHByb3ByaWV0XHUwMGUwDQotIyBDcmVhdGVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX2NyZWF0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9Q3JlYSBiZW5kcG9pbnQNCi0jIENyZWF0ZUxpbmtDb21tYW5kDQotZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsPUNyZWF6aW9uZSBjb2xsZWdhbWVudG8NCi0jIENyZWF0ZU5vZGVDb21tYW5kDQotZ2VmX2NyZWF0ZU5vZGVDb21tYW5kX2xhYmVsPUNyZWEgbnVvdm8gbm9kbw0KLSMgRGVsZXRlQmVuZHBvaW50Q29tbWFuZA0KLWdlZl9kZWxldGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPUVsaW1pbmEgYmVuZHBvaW50DQotIyBEZWxldGVDb21tYW5kDQotZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw9RWxpbWluYQ0KLSMgRGVsZXRlTGlua0NvbW1hbmQNCi1nZWZfZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw9RWxpbWluYSBjb25uZXNzaW9uZQ0KLSMgTW92ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfbW92ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9U3Bvc3RhIGJlbmRwb2ludA0KLSMgUmVjb25uZWN0TGlua0NvbW1hbmQNCi1nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw9Umljb25uZXR0aSBjb2xsZWdhbWVudG8NCi0NCi0jIFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0PUlsIG5vbWUgbm9uIHB1XHUwMGYyIGVzc2VyZSB2dW90by4gU3BlY2lmaWNhcmUgdW4gbm9tZSB2YWxpZG8uDQotIyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9SWwgbm9tZSBub24gcHVcdTAwZjIgZXNzZXJlIHZ1b3RvLiBTcGVjaWZpY2FyZSB1biBub21lIHZhbGlkby4NCi0jIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0DQotZ2VmX3dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0X3ZhbGlkYXRlTWVzc2FnZT1JbCBub21lIG5vbiBwdVx1MDBmMiBlc3NlcmUgdnVvdG8uIFNwZWNpZmljYXJlIHVuIG5vbWUgdmFsaWRvLg0KLQ0KLSMgRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uDQotYWN0aW9uc19FbGVtZW50c1ZpZXdEZWxldGVBY3Rpb25fbWVzc2FnZT1JbXBvc3NpYmlsZSBlbGltaW5hcmUgbGEgY29uZmlndXJhemlvbmUgJyd7MH0nJyBwZXJjaFx1MDBlOSBcdTAwZTggYW5jb3JhIGluIHVzbyBkYWwgcHJvY2Vzc28gJyd7MX0nJy4NCi0NCi0jIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcg0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU9RWxpbWluYSBlcnJvcmUNCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvck1lc3NhZ2U9RWNjZXppb25lIG5vbiBnZXN0aXRhDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JSZWFzb249VmVkaSBkZXR0YWdsaQ0KLQ0KLSMgTWV0aG9kRWxlbWVudEVkaXRvcg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZT1FcnJvcmUgZHVyYW50ZSBsJ2VsaW1pbmF6aW9uZQ0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMT1JVVBBMDAyMEU6IEVycm9yZSBkdXJhbnRlIGlsIHNhbHZhdGFnZ2lvIGRlbCBmaWxlDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UyPUVycm9yZSBkdXJhbnRlIGlsIGNvbW1pdA0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xPUNvbnRyb2xsYXJlIGlsIGZpbGUgZGkgbG9nIHBlciB1bHRlcmlvcmkgZGV0dGFnbGkNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMj1WZWRpIGRldHRhZ2xpDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU9RXJyb3JlIGR1cmFudGUgbGEgcmlkZW5vbWluYXppb25lDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JNc2c9VW5vIG8gcGlcdTAwZjkgZmlsZSBkaSBxdWVzdG8gZWRpdG9yIHNvbm8gc3RhdGkgcmltb3NzaS4gTCdlZGl0b3Igbm9uIFx1MDBlOCBwaVx1MDBmOSB2YWxpZG8gZSBkZXZlIGVzc2VyZSBjaGl1c28uDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZT1FZGl0b3Igbm9uIHZhbGlkbw0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvck1lc3NhZ2UxPUVycm9yZSBkdXJhbnRlIGxhIHJpZGVub21pbmF6aW9uZSBkZWkgZmlsZSAnJ3swfScnDQotDQotIyBEZXNjcmlwdGlvbkZvcm1QYWdlDQotcmVuYW1lRXJyb3JfdGl0bGU9Umlub21pbmEgZWxlbWVudG8NCi1yZW5hbWVFcnJvcl9tc2c9SVVQQTAwMTNFOiBJbXBvc3NpYmlsZSBjb21wbGV0YXJlIGwnb3BlcmF6aW9uZSBkaSByaWRlbm9taW5hemlvbmUuDQotU2VsZWN0RWxlbWVudERpYWxvZ19zZWxlY3RlbGVtZW50X3RleHQ9U2VsZXppb25hIGVsZW1lbnRvDQotDQotIyBFZGl0b3JDaG9vc2VyDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3RpdGxlPUFwcmkgZWRpdG9yIGRpIG1ldG9kaQ0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVzY3JpcHRpb25MYWJlbD1EZXNjcml6aW9uZToNCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWw9U2VsZXppb25hIHR1dHRvDQotT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZV9lZGl0X3RleHQwPU1vZGlmaWNhIGVsZW1lbnRvDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNFOiBJbXBvc3NpYmlsZSBhcHJpcmUgbCdlZGl0b3IgYXNzb2NpYXRvIGFsbCdlbGVtZW50byBtZXRvZG8gc2VsZXppb25hdG8uDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9JY29uRmlsZUNob29zZXJEaWFsb2dfdGl0bGU9U2VsZXppb25hIGZpbGUgaW1tYWdpbmUNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5TmFtZT1OdW92YSBsaWJyZXJpYQ0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZXNjcmlwdGlvbkxhYmVsPURlc2NyaXppb25lOg0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uPVNlbGV6aW9uYXJlIHVuYSBvIHBpXHUwMGY5IGNvbmZpZ3VyYXppb25pIGRpIG1ldG9kbyBlIGZhcmUgY2xpYyBzdSBGaW5lIHBlciBhcHJpcmxlLg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsPURlc2VsZXppb25hIHR1dHRvDQotRWxlbWVudHNWaWV3X21pZ3JhdGlvbl9kaXJfZGxnX2Rlc2NyaXB0aW9uX3RleHQ9U3BlY2lmaWNhcmUgbGEgZGlyZWN0b3J5IGRlbCB7MH0gYXBwZW5hIG1pZ3JhdG8gcGVyIHNvc3RpdHVpcmUgaWwgezB9IHNlbGV6aW9uYXRvDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3JlYXNvbj1TaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUgZGkgc2lzdGVtYS4gRmFyZSBjbGljIHN1IERldHRhZ2xpIHBlciB1bHRlcmlvcmkgaW5mb3JtYXppb25pLlxuXA0KLVxuXA0KLUNoaXVkZXJlIGFsY3VuaSBkZWdsaSBlZGl0b3IgYXBlcnRpIGUgcHJvdmFyZSBkaSBudW92by4NCi0NCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlPUwnaW1tYWdpbmUgbm9uIFx1MDBlOCB2YWxpZGENCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RlbXBsYXRlPUlVUEEwMDMxRTogTCcnaW1tYWdpbmUgc2VsZXppb25hdGEgJyd7MH0nJyBcdTAwZTggcGlcdTAwZjkgbGFyZ2EgZGVsbGEgZGltZW5zaW9uZSBjb25zZW50aXRhICh7MX0gZGkgezJ9KS4gU2VsZXppb25hcmUgdW4nJ2FsdHJhIGltbWFnaW5lLg0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190aXRsZT1MJ2ltbWFnaW5lIG5vbiBcdTAwZTggdmFsaWRhDQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RlbXBsYXRlPUlVUEEwMDMyRTogSWwgZmlsZSBzZWxlemlvbmF0byAnJ3swfScnIG5vbiBlc2lzdGUuIFNlbGV6aW9uYXJlIHVuJydhbHRyYSBpbW1hZ2luZS4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9U2VsZXppb25hLi4uDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uPURlc2NyaXppb25lIGxpYnJlcmlhIG1ldG9kaQ0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1EZXNjcml6aW9uZSBjb25maWd1cmF6aW9uZSBtZXRvZG8NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPVx1MDBjOCBuZWNlc3NhcmlvIGNoaXVkZXJlIHR1dHRpIGdsaSBlZGl0b3IuIFNlbGV6aW9uYXJlIHF1ZWxsaSBjaGUgZGV2b25vIGVzc2VyZSBwcmltYSBzYWx2YXRpLCBzZSBwb3NzaWJpbGUuDQotDQotIyBUZW1wbGF0ZURlc2NyaXB0aW9uUGFnZQ0KLWZvcm1zX1RlbXBsYXRlRGVzY3JpcHRpb25QYWdlX2FscmVhZHlBdHRhY2hlZF9tc2c9SWwgZmlsZSBzZWxlemlvbmF0byBcdTAwZTggZ2lcdTAwZTAgdW4gYWxsZWdhdG8gcGVyIHF1ZXN0byBtb2RlbGxvLg0KLQ0KLSMgTmV3IExpYnJhcnkgRXJyb3IgRGlhbG9nDQotbmV3TGlicmFyeUVycm9yX21zZz1JVVBBMDAxNEU6IEltcG9zc2liaWxlIGNyZWFyZSBsYSBsaWJyZXJpYSBkZWkgbWV0b2RpLg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24xPUlsIHBlcmNvcnNvIGRlbGxhIGxpYnJlcmlhIGRlaSBtZXRvZGkgc3BlY2lmaWNhdGEgJyd7MH0nJyBub24gXHUwMGU4IHZhbGlkby4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMj1VbmEgbGlicmVyaWEgZGVpIG1ldG9kaSBlc2lzdGUgZ2lcdTAwZTAgaW4gJyd7MH0nJy4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMz1JbXBvc3NpYmlsZSBjcmVhcmUgbGEgY2FydGVsbGEgZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBzcGVjaWZpY2F0YSAnJ3swfScnLg0KLW5ld0xpYnJhcnlFcnJvcl9hZHZpY2U9U2VsZXppb25hcmUgT0sgcGVyIGltbWV0dGVyZSB1biBhbHRybyBub21lIG8gcGVyY29yc28gcGVyIGxhIGxpYnJlcmlhLg0KLQ0KLSNQcm9jZXNzIGxpdGVyYWxzDQotUHJvY2Vzc19FeHRlcm5hbElEPUlEIGVzdGVybm86DQotUHJvY2Vzc19QdXJwb3NlPVNjb3BvOg0KLVByb2Nlc3NfU2NvcGU9QW1iaXRvOg0KLVByb2Nlc3NfVXNhZ2VOb3Rlcz1Ob3RlIHN1bGwndXRpbGl6em86DQotUHJvY2Vzc19BbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmU6DQotUHJvY2Vzc19Ib3dUb1N0YWZmPURlZmluaXppb25lIGRlbCBwZXJzb25hbGU6DQotUHJvY2Vzc19LZXlDb25zaWRlcmF0aW9uPUNvbnNpZGVyYXppb25pIGNoaWF2ZToNCi1Qcm9jZXNzX1NjYWxlPVNjYWxhOg0KLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1DYXJhdHRlcmlzdGljaGUgZGVsIHByb2dldHRvOg0KLVByb2Nlc3NfUmlza0xldmVsPUxpdmVsbG8gZGkgcmlzY2hpbzoNCi1Qcm9jZXNzX0VzdGltYXRpbmdUZWNobmlxdWU9VGVjbmljaGUgZGkgdmFsdXRhemlvbmU6DQotUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPUVzcGVyaWVuemEgbWVtYnJvIGRlbCBwcm9nZXR0bzoNCi1Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0PVRpcG8gZGkgY29udHJhdHRvOg0KLQ0KLSMgRWRpdG9yIFByZXZpZXcgTmF2aWdhdGlvbiBCdXR0b25zDQotYmFja0J1dHRvbl90ZXh0PUluZGlldHJvDQotZm9yd2FyZEJ1dHRvbl90ZXh0PUluIGF2YW50aQ0KLWZvcndhcmRfdGV4dD1JbiBhdmFudGkNCi1zdG9wQnV0dG9uX3RleHQ9SW50ZXJyb21waQ0KLXJlZnJlc2hCdXR0b25fdGV4dD1BZ2dpb3JuYQ0KLXJlZnJlc2hfdGV4dD1BZ2dpb3JuYQ0KLW5ld25hbWVfdGV4dD1OdW92byBub21lOg0KLXByaW50QnV0dG9uX3RleHQ9U3RhbXBhDQotDQotIyBDb250ZXh0IG1lbnVzDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPSZBZ2dpb3JuYQ0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPSZNb3N0cmEgcHJvcHJpZXRcdTAwZTANCi0NCi1fVUlfTWV0aG9kRWRpdG9yX21lbnU9JkVkaXRvciBkaSBtZXRvZGkNCi1fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtPSZOdW92bw0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1OJnVvdm8gZWxlbWVudG8gZGkgcGFyaSBsaXZlbGxvDQotDQotX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWw9U2VsZXppb25lDQotX1VJX1BhcmVudFBhZ2VfbGFiZWw9UGFyZW50DQotX1VJX0xpc3RQYWdlX2xhYmVsPUVsZW5jbw0KLV9VSV9UcmVlUGFnZV9sYWJlbD1TdHJ1dHR1cmENCi1fVUlfVGFibGVQYWdlX2xhYmVsPVRhYmVsbGENCi1fVUlfVGFibGVUcmVlUGFnZV9sYWJlbD1UYWJsZVRyZWUNCi1fVUlfT2JqZWN0Q29sdW1uX2xhYmVsPU9nZ2V0dG8NCi1fVUlfU2VsZkNvbHVtbl9sYWJlbD1FbGVtZW50byBpbiBzXHUwMGU5DQotDQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9TmVzc3VuIG9nZ2V0dG8gc2VsZXppb25hdG8NCi1fVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQ9T2dnZXR0byBzZWxlemlvbmF0bzogezB9DQotX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQ9U2VsZXppb25hdGkgezB9IG9nZ2V0dGkNCi0NCi1fVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsPUFwcmkgZWRpdG9yDQotDQotX1VJX1dpemFyZF9jYXRlZ29yeT1Qcm9jZWR1cmUgZ3VpZGF0ZSBwZXIgbGEgY3JlYXppb25lIGRpIG1vZGVsbGkgZGkgZXNlbXBpbyBFTUYNCi0NCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfbGFiZWw9TW9kZWxsbyBkaSBtZXRvZG8NCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfZGVzY3JpcHRpb249Q3JlYSBudW92byBtb2RlbGxvIGRpIG1ldG9kbw0KLQ0KLV9VSV9NZXRob2RFZGl0b3JfbGFiZWw9RWRpdG9yIGRpIG1vZGVsbGkgZGkgbWV0b2RvDQotDQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2U9TXkNCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVFeHRlbnNpb249bWV0b2RvDQotDQotX1VJX1dpemFyZF9sYWJlbD1OdW92bw0KLQ0KLV9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uPUlsIG5vbWUgZmlsZSBkZXZlIHRlcm1pbmFyZSBpbiAnJy57MH0nJw0KLQ0KLV9VSV9Nb2RlbE9iamVjdD1PZ2dldHRvIG1vZGVsbG8NCi1fVUlfWE1MRW5jb2Rpbmc9Q29kaWZpY2EgWE1MDQotX1VJX1hNTEVuY29kaW5nQ2hvaWNlcz1VVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQ0KLV9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb249U2VsZXppb25hcmUgdW4gb2dnZXR0byBtb2RlbGxvIGRhIGNyZWFyZS4NCi0NCi1fVUlfRmlsZUNvbmZsaWN0X2xhYmVsPUNvbmZsaXR0byBmaWxlDQotX1dBUk5fRmlsZUNvbmZsaWN0PUNpIHNvbm8gbW9kaWZpY2hlIG5vbiBzYWx2YXRlIGNoZSBzb25vIGluIGNvbmZsaXR0byBjb24gbGUgbW9kaWZpY2hlIGFwcG9ydGF0ZSBhbGwnZXN0ZXJubyBkZWxsJ2VkaXRvci4gSWdub3JhcmUgbGUgbW9kaWZpY2hlIGFwcG9ydGF0ZSBhIHF1ZXN0byBlZGl0b3I/DQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1hZGRMaW5rRGlhbG9nX2xpbmtUeXBlPVRpcG86DQotb3BlbkxpbmtDaGVja2JveF90ZXh0PUFwcmkgY29sbGVnYW1lbnRvIGluIHVuJ2FsdHJhIGZpbmVzdHJhIGRlbCBicm93c2VyDQotDQotIyBBZGQgSW1hZ2UgRGlhbG9nDQotaGVpZ2h0TGFiZWxfdGV4dD1BbHRlenphOg0KLXdpZHRoTGFiZWxfdGV4dD1MYXJnaGV6emE6DQotRWxlbWVudHNWaWV3XzIwPW1vZGVsbG8gZGkgY2FwYWNpdFx1MDBlMA0KLUVsZW1lbnRzVmlld18yMT1wcm9jZXNzbyBkaSBwcm9kdXppb25lDQotRWxlbWVudHNWaWV3XzIyPXByb2Nlc3NvDQotRWxlbWVudHNWaWV3XzM1PXswfSBcdTAwZTggZGkgc29sYSBsZXR0dXJhLiBQZXIgY29udGludWFyZSwgXHUwMGU4IG5lY2Vzc2FyaW8gcmVuZGVybG8gc2NyaXZpYmlsZS4NCi1FbGVtZW50c1ZpZXdfMzY9RXJyb3JlIGR1cmFudGUgaWwgY2FyaWNhbWVudG8gZGVsbGEgbGlicmVyaWENCi1hbHRUYWdMYWJlbF90ZXh0PVRhZyBBTFQ6DQotaW1hZ2VTaXplTGFiZWxfdGV4dD1MJ2FsdGV6emEgZSBsYSBsYXJnaGV6emEgZGVsbCdpbW1hZ2luZSBkZXZvbm8gZXNzZXJlIGFsbWVubyAxMCBlIG5vbiBwaVx1MDBmOSBkaSA2MDAuIExlIGFsdGV6emUgZSBsZSBsYXJnaGV6emUgbm9uIHZhbGlkZSB2ZXJyYW5ubyBtb2RpZmljYXRlIG5laSB2YWxvcmkgYXBwcm9wcmlhdGkuDQotDQotIyBQcm9jZXNzIEVkaXRvcg0KLVByb2Nlc3NFZGl0b3I9UHJvY2Vzc0VkaXRvcg0KLVByb2Nlc3NFZGl0b3JfTmFtZT1Ob21lDQotUHJvY2Vzc0VkaXRvcl9QcmVzZW50YXRpb25OYW1lPU5vbWUgcHJlc2VudGF6aW9uZQ0KLVByb2Nlc3NFZGl0b3JfSW5kZXg9SW5kaWNlDQotUHJvY2Vzc0VkaXRvcl9QcmVkZWNlc3NvcnM9UHJlZGVjZXNzb3JpDQotI0NvbmZpZ3VyYXRpb25QYWdlX1NlbGVjdGVkPVNlbGVjdGVkOiANCi1DaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbj1TZWxlemlvbmFyZSB1biB2b2NlIGRlbGwnZWxlbmNvIGRpIGNvbnRyb2xsbyBlIGZhcmUgY2xpYyBzdSBHaVx1MDBmOSBvIFN1IHBlciBtb2RpZmljYXJuZSBsJ29yZGluZS4NCi1FbGVtZW50c1ZpZXdfcmVuYW1pbmdfdGV4dD1SaWRlbm9taW5hemlvbmUgaW4gY29yc28uLi4NCi1Qcm9jZXNzRWRpdG9yX01vZGVsSW5mbz1JbmZvIG1vZGVsbG8NCi1Qcm9jZXNzRWRpdG9yX1ByZWZpeD1QcmVmaXNzbw0KLU1vdmVEaWFsb2dfbW92ZV90ZXh0PVNwb3N0YQ0KLUNoZWNrbGlzdE9yZGVyX3RpdGxlPU9yZGluYSB2b2NlIGVsZW5jbyBkaSBjb250cm9sbG8NCi1Qcm9jZXNzRWRpdG9yX1JlcGV0YWJsZT1SaXBldGliaWxlDQotUHJvY2Vzc0VkaXRvcl9PbmdvaW5nPUluIGNvcnNvDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uPVNpbmNyb25penphemlvbmUgaW4gY29yc28uLi4NCi1Qcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuPUF0dGl2YXRvIGRhIGV2ZW50bw0KLVByb2Nlc3NFZGl0b3JfRGVsaXZlcmFibGU9Q29tcG9uZW50ZSBkaXN0cmlidWliaWxlDQotUHJvY2Vzc0VkaXRvcl9PcHRpb25hbD1GYWNvbHRhdGl2bw0KLUZpbHRlckRpYWxvZ19UeXBlX3RleHQ9VGlwbyBkaSBlbGVtZW50byBkaSBtZXRvZG86DQotRmlsdGVyRGlhbG9nX0V4cGFuZEFsbD1Fc3BhbmRpIHR1dHRvDQotTW92ZURpYWxvZ19tb3ZpbmdfdGV4dD1TcG9zdGFtZW50byBpbiBjb3Jzby4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbldhcm5pbmc9SVVQQTAwMjVXOiBMJydpY29uYSBmb3JtYSB7MH0gbm9uIHNpIHRyb3ZhIG5lbCBwZXJjb3JzbzogezF9DQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uRXJyb3I9SVVQQTAwMjVFOiBFcnJvcmU6IFNlemlvbmUgaWNvbmEgZm9ybWE6IHswfQ0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfTmFtZUxhYmVsPU5vbWU6DQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1DcmVhIG51b3ZhIGNvbmZpZ3VyYXppb25lIG1ldG9kbw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9OYW1lTGFiZWw9Tm9tZToNCi1BdXRob3JpbmdVSVBsdWdpbl9uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlPU51b3ZhIGNvbmZpZ3VyYXppb25lIG1ldG9kbw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0xpYnJhcnlNYWluUGFnZV9wYWdlVGl0bGU9Q3JlYSBudW92YSBsaWJyZXJpYSBkZWkgbWV0b2RpDQotbmV3TGlicmFyeVdpemFyZF90aXRsZT1OdW92YSBsaWJyZXJpYSBkZWkgbWV0b2RpDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVUaXRsZT1TYWx2YSBtb2RpZmljYQ0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0xpYnJhcnlNYWluUGFnZV9wYWdlRGVzY3JpcHRpb249U3BlY2lmaWNhcmUgdW4gbm9tZSwgdW5hIGRlc2NyaXppb25lIGUgdW5hIGRpcmVjdG9yeSBkaSBkZXN0aW5hemlvbmUgcGVyIGxhIG51b3ZhIGxpYnJlcmlhIGRlaSBtZXRvZGkuDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVEZXNjcmlwdGlvbj1Vbm8gbyBwaVx1MDBmOSBlbGVtZW50aSBkaSBtZXRvZG8gc29ubyBzdGF0aSBtb2RpZmljYXRpLiBTZWxlemlvbmFyZSBxdWVsbGkgY2hlIG9jY29ycmUgc2FsdmFyZS4NCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1BcHJpIGNvbmZpZ3VyYXppb25pIG1ldG9kbw0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlPUFwcmkgY29uZmlndXJhemlvbmkgbWV0b2RvDQotRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ9U29zdGl0dXppb25lIGluIGNvcnNvIHswfS4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uV2FybmluZz1JVVBBMDAyNlc6IEwnJ2ljb25hIG5vZG8gcGVyIHswfSBub24gc2kgdHJvdmEgbmVsIHBlcmNvcnNvOiB7MX0NCi1NZXNzYWdlTGFiZWxQcm92aWRlcl91bnNlbGVjdGVkcGFja2FnZXM9Jyd7MH0nJyBjb250aWVuZSBlbGVtZW50aSBjaGUgZmFubm8gcmlmZXJpbWVudG8gYSBlbGVtZW50aSBpbiBwYWNjaGV0dGkgbm9uIHNlbGV6aW9uYXRpDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25FcnJvcj1JVVBBMDAyNkU6IEVycm9yZTogU2V6aW9uZSBpY29uYSBub2RvOiB7MH0NCi1TdGVwc09yZGVyRGlhbG9nX3N0ZXBzPVBhc3NpOg0KLQ0KLVN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU9T3JkaW5hIHBhc3NpIG9wZXJhemlvbmUNCi1Qcm9jZXNzRWRpdG9yX1BsYW5uZWQ9UGlhbmlmaWNhdG8NCi1zcGVjaWZ5ZGlyZWN0b3J5X3RleHQ9U3BlY2lmaWNhcmUgdW5hIGRpcmVjdG9yeSBwZXIgc2FsdmFyZSBsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGluDQotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPVJpY29ycmVuemUgbXVsdGlwbGUNCi1Qcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU9U3RhdG8gZGkgaW5ncmVzc28NCi1Qcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZT1TdGF0byBkaSB1c2NpdGENCi1zZWxlY3RDb2x1bW5zdG9BZGRfdGV4dD1TZWxlemlvbmEgbGUgY29sb25uZSBkYSBhZ2dpdW5nZXJlDQotUHJvY2Vzc0VkaXRvcl9UeXBlPVRpcG8NCi1Qcm9jZXNzRWRpdG9yX1RlYW09VGVhbQ0KLUZpbHRlckRpYWxvZ190aXRsZT1TZWxlemlvbmEgZmluZXN0cmEgZGkgZGlhbG9nbzogDQotDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkPUFnZ2l1bmdpIGEgY29udGVudXRvICZtZXRvZG8uLi4NCi1GaWx0ZXJEaWFsb2dfQ29sbGFwc2VBbGw9Q29tcHJpbWkgdHV0dG8NCi1PcGVuQ2hlYXRzaGVldFZpZXdfdGl0bGU9QXByaSB2aXN0YSBDaGVhdCBzaGVldA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxVcD1Fc2VndWkgcm9sbHVwDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd249RXNlZ3VpIHJvbGxkb3duDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZVVwPU0mdW92aSBzdQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVEb3duPU11b3ZpIGcmaVx1MDBmOQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbD1NbyZzcnRyYQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvcHk9JkNvcGlhLi4uDQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dD1Nb2RlbGxpIG5vbWkgKGkgbm9taSBjb3JyaXNwb25kZW50aSB2ZXJyYW5ubyB2aXN1YWxpenphdGkpOg0KLQ0KLU1ldGhvZExpYnJhcnlFZGl0b3JfdGl0bGU9TGlicmVyaWEgZGVpIG1ldG9kaTogDQotI01lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ9U2VsZWN0ZWQ6IA0KLU1lc3NhZ2VWaWV3X2Vycm1zZ190ZXh0PURlc2NyaXppb25lDQotRWxlbWVudHNWaWV3X2Vycl9zYXZpbmc9SVVQQTAwMjdFOiBFcnJvcmUgZHVyYW50ZSBpbCBzYWx2YXRhZ2dpbyBkaSAnJ3swfScnezF9DQotDQotZXJyX2NvcHlpbmdfZmlsZV90aXRsZT1FcnJvcmUgZHVyYW50ZSBsYSBjb3BpYSBkZWwgZmlsZQ0KLWVycl9jb3B5aW5nX2ZpbGVfZXJyb3I9SVVQQTAwMjhFOiBJbXBvc3NpYmlsZSBhc3NlZ25hcmUgbCdpY29uYS4gDQotZXJyX2NvcHlpbmdfZmlsZV9yZWFzb249U2kgXHUwMGU4IHZlcmlmaWNhdG8gdW4gZXJyb3JlIGR1cmFudGUgbGEgY29waWEgZGVsIGZpbGUgc2VsZXppb25hdG8uIEZhcmUgY2xpYyBzdSBEZXR0YWdsaSBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4NCi1lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlPUVycm9yZSBkdXJhbnRlIGwnZWxhYm9yYXppb25lIGRlbCBmaWxlDQotZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcD1Nb2RpZmljYSBjb25maWd1cmF6aW9uZQ0KLWVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdD1JVVBBMDAxNUU6IEltcG9zc2liaWxlIG1vZGlmaWNhcmUgbCdlbGVtZW50bw0KLVNhdmVUaGlzQWN0aW9uX3NhdmVvYmplY3Q9U2FsdmEgcXVlc3RvIG9nZ2V0dG8uLi4NCi1FbGVtZW50c1ZpZXdfcmVwbGFjZV90ZXh0PVNvc3RpdHVpc2NpDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kPSZFc3RlbmRpLi4uDQotTW92ZURpYWxvZ19kZXN0aW5hdGlvbl90ZXh0PVNjZWdsaWVyZSBkZXN0aW5hemlvbmUgcGVyIGVsZW1lbnRpIHNlbGV6aW9uYXRpOg0KLWNob29zZURlZmF1bHREaXJlY3RvcnlfdGV4dD1TY2VnbGllcmUgdW5hIGRpcmVjdG9yeSBwcmVkZWZpbml0YSBwZXIgbGUgbGlicmVyaWU6DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3M9JlNvcHByaW1pDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3MyPU9wemlvbmkgZGkgJnB1YmJsaWNhemlvbmUuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbT1EaWFncmFtbWkgZGVmaW5pdGkgZGFsbCcmdXRlbnRlLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3RpdGxlPUFzc2VnbmEgZGlhZ3JhbW1pIGRlZmluaXRpIGRhbGwndXRlbnRlDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U9RGlhZ3JhbW1hIGF0dGl2aXRcdTAwZTA6DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlPURpYWdyYW1tYSBkZXR0YWdsaSBhdHRpdml0XHUwMGUwOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1EaWFncmFtbWEgZGlwZW5kZW56ZSBwcm9kb3R0byBkaSBsYXZvcm86DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX25vdGFGaWxlPUlVUEEwMDA0RTogSWwgcGVyY29yc28gc3BlY2lmaWNhdG8gbm9uIFx1MDBlOCB1biBmaWxlLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b249U2VsZXppb25hLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDI0RTogTCdpbW1hZ2luZSBzcGVjaWZpY2F0YSBub24gZXNpc3RlIG5lbGxhIGxpYnJlcmlhLiBWZXJpZmljYXJlIGRpIGF2ZXIgaW5zZXJpdG8gaWwgcGVyY29yc28gcmVsYXRpdm8gYWxsYSBkaXJlY3Rvcnkgcm9vdCBkZWxsYSBsaWJyZXJpYS4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfc2VsZWN0ZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDMwRTogTCdpbW1hZ2luZSBzZWxlemlvbmF0YSBub24gXHUwMGU4IG5lbGxhIGxpYnJlcmlhLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBREltYWdlPVV0aWxpenphcmUgbCdpbW1hZ2luZSBkaWFncmFtbWEgYXR0aXZpdFx1MDBlMCBwZXIgbGEgcmljZXJjYSBlIGxhIHB1YmJsaWNhemlvbmUNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURESW1hZ2U9VXRpbGl6emFyZSBsJ2ltbWFnaW5lIGRpYWdyYW1tYSBkZXR0YWdsaSBhdHRpdml0XHUwMGUwIHBlciBsYSByaWNlcmNhIGUgbGEgcHViYmxpY2F6aW9uZQ0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VXUERJbWFnZT1VdGlsaXp6YXJlIGwnaW1tYWdpbmUgZGlhZ3JhbW1hIGRpIGRpcGVuZGVuemEgZGVsIHByb2RvdHRvIGRpIGxhdm9ybyBwZXIgbGEgcmljZXJjYSBlIGxhIHB1YmJsaWNhemlvbmUNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db250cmlidXRlPUNvbnRyaWJ1dG8gbG9jYWxlDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZT1Tb3N0aXR1emlvbmUgbG9jYWxlDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRGlhZ3JhbXM9RGlhJmdyYW1taQ0KLVByb2Nlc3NFZGl0b3JfYWN0aW9uX2RlZXBDb3B5PUNvcGlhIGNvbXAmbGV0YS4uLg0KLUZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uPUJyZXZlIGRlc2NyaXppb25lOg0KLUNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwPU1vc3RyYS9OYXNjb25kaSBlbGVtZW50aSBub24gc2VsZXppb25hdGkNCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbj1EZXNjcml6aW9uZToNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbD1Ob24gcHViYmxpY2FyZQ0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uPUkgbW9kZWxsaSBzb25vIHNlcGFyYXRpIGRhIHVuYSB2aXJnb2xhLCBkb3ZlICo9cXVhbHNpYXNpIHN0cmluZ2EsID89cXVhbHNpYXNpIGNhcmF0dGVyZQ0KLUNvbmZpZ3VyYXRpb25QYWdlX1RyZWVUaXRsZUxhYmVsPUNvbnRlbnV0bzoNCi1Db25maWd1cmF0aW9uUGFnZV9Mb2FkaW5nTWVzc2FnZT1DYXJpY2FtZW50byBkZWxsYSBjb25maWd1cmF6aW9uZSBpbiBjb3JzbywgYXR0ZW5kZXJlIC4uLg0KLU1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0PUxhIGRlc3RpbmF6aW9uZSBkaSBzcG9zdGFtZW50byBzcGVjaWZpY2F0YSBub24gXHUwMGU4IHZhbGlkYS4NCi1Nb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uPUlVUEEwMDM0RTogSW1wb3NzaWJpbGUgbW9kaWZpY2FyZSBsYSBkZXN0aW5hemlvbmUgc2VsZXppb25hdGEuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsQWxsPVB1YmJsaWNhIHR1dHRvDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkJhc2VBY3Rpdml0eT1BcHJpIGF0dGl2aXRcdTAwZTAgZGkgYmFzZQ0KLVByb2Nlc3NGb3JtRWRpdG9yX2V4cGFuQWxsQWN0aW9uTGFiZWw9RSZzdGVuZGkgdHV0dG8NCi1Qcm9jZXNzRm9ybUVkaXRvcl9jb2xsYXBzZUFsbEFjdGlvbkxhYmVsPUNoaXUmZGkgdHV0dG8NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtPUFwcmkgZGlhZ3JhbW1hICZhdHRpdml0XHUwMGUwDQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbD1JIGRlc2NyaXR0b3JpIG5vbiBzb3BwcmVzc2kgZWxlbmNhdGkgbmVpIGRldHRhZ2xpIGRldm9ubyBlc3NlcmUgZWxpbWluYXRpIHBlciBldml0YXJlIGxhIGR1cGxpY2F6aW9uZSBpbiBzZWd1aXRvIGFsbGEgcml2ZWxhemlvbmUgZGVnbGkgZWxlbWVudGkgc2VsZXppb25hdGkuIEZhcmUgY2xpYyBzdSBPSyBwZXIgZWxpbWluYXJsaSBlIGNvbnRpbnVhcmUuDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX1NlbGVjdENvbHVtbnM9U2VsZXppb25hIGxlIGNvbG9ubmUgZGEgYWdnaXVuZ2VyZQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW09QXByaSBkaWFncmFtbWEgJmRldHRhZ2xpIGF0dGl2aXRcdTAwZTANCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfQ29sdW1uU2VsZWN0aW9uPVNlbGV6aW9uZSBjb2xvbm5hOg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zd2l0Y2hDb25maWd1cmF0aW9uPVBhc3NhcmUgYWxsYSBjb25maWd1cmF6aW9uZSBwcmVkZWZpbml0YSBkZWwgcHJvY2Vzc28gZHVyYW50ZSBsJ2F0dGl2YXppb25lIGRpIHVuIGVkaXRvciBkaSBwcm9jZXNzbw0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zdXBwcmVzc2lvbkdyb3VwVGl0bGU9RWxpbWluYXppb25lDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX2luaGVyaXRTdXBwcmVzc2lvblN0YXRlPUVyZWRpdGEgc3RhdGkgZGkgZWxpbWluYXppb25lDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW09YXByaSBkaWFncmFtbWEgZGlwZW5kZW4memUgcHJvZG90dG8gZGkgbGF2b3JvDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9Q2FuY2VsbGENCi1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19TZWxlY3RCdXR0b25MYWJlbD1TZWxlemlvbmEuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9JbnNlcnROZXdQaGFzZT1JbnNlcmlzY2kgbnVvdmEgZmFzZQ0KLVZpZXdIZWxwZXJfcmVsb2FkTGliT25Sb2xsYmFja0Vycm9yPUltcG9zc2liaWxlIGVzZWd1aXJlIHJpcHJpc3Rpbm8gaW4gc2VndWl0byBhIHVuIGVycm9yZSBkaSBwZXJzaXN0ZW56YS4gTGEgbGlicmVyaWEgZGV2ZSBlc3NlcmUgcmljYXJpY2F0YSBwZXIgcmlwcmlzdGluYXJuZSBsbyBzdGF0byBvcmlnaW5hbGUuDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZF90ZXh0PUwnJ2VsZW1lbnRvICcnezB9JycgXHUwMGU4IHN0YXRvIGdpXHUwMGUwIGVsaW1pbmF0by4NCi1WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkY29uZmlybV90ZXh0PUwnJ2VsZW1lbnRvICcnezB9JycgXHUwMGU4IHN0YXRvIGdpXHUwMGUwIGVsaW1pbmF0by4gXA0KLVJpbXVvdmVybG8gZGEgJyd7MX0nJz8NCi1Db25maWd1cmF0aW9uUGFnZV9BZGRNaXNzaW5nVG9vbFRpcD1BZ2dpdW5naSByaWZlcmltZW50aSBtYW5jYW50aQ0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uPURlc2NyaXppb25lDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm89SW5mb3JtYXppb25pIGdlbmVyYWxpDQotDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPUFwcGxpJmNhIG1vZGVsbG8NCi1Nb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ9U2VsZXppb25hcmUgdW5hIGRlc3RpbmF6aW9uZS4NCi1Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1OZXNzdW5hIGRlc3RpbmF6aW9uZSBkaSBzcG9zdGFtZW50byBzcGVjaWZpY2F0YS4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3Ryb3VibGVvYmplY3Q9LiBPZ2dldHRvIGNvbiBwcm9ibGVtaTogDQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfZXJyY2hpbGRwa2dzPVVuIHByb2Nlc3NvIG8gdW4gcGFjY2hldHRvIGRlbCBjb250ZW51dG8gY2hpbGQgY29udGllbmUgZWxlbWVudGkgY29uIHJpZmVyaW1lbnRpIG1hbmNhbnRpDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZT1PcHppb25pIGRpIHB1YmJsaWNhemlvbmUgZGlhZ3JhbW1pDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlPVNlbGV6aW9uYXJlIGkgZGlhZ3JhbW1pIGRhIHB1YmJsaWNhcmUgb3BwdXJlIGRlc2VsZXppb25hcmUgcXVlbGxpIGRhIG5vbiBwdWJibGljYXJlDQotUHJvY2Vzc0VkaXRvcl9UaXRsZT1FZGl0b3IgZGkgcHJvY2Vzc2k6IA0KLVNhdmVBc3dpdGhkb3RzX3RleHQ9U2FsdmEgY29uIG5vbWUuLi4NCi1Qcm9jZXNzRWRpdG9yX1dvcmtCcmVha2Rvd25TdHJ1Y3R1cmU9RWxlbWVudG8gZGVsbGEgc3VkZGl2aXNpb25lIGRlbCBsYXZvcm8NCi1Qcm9jZXNzRWRpdG9yX1RlYW1BbGxvY2F0aW9uPUFsbG9jYXppb25lIHRlYW0NCi1Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U9VXRpbGl6em8gZGVsIHByb2RvdHRvIGRpIGxhdm9ybw0KLVByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldz1WaXN0YSBjb25zb2xpZGF0YQ0KLVByb2Nlc3NFZGl0b3JfY29uZmlybUF1dG9TeW5jaD1RdWVzdGEgb3BlcmF6aW9uZSBhZ2dpb3JuYSBpIGRlc2NyaXR0b3JpIHNlbGV6aW9uYXRpIG8gdHV0dGkgaSBkZXNjcml0dG9yaSBzb3R0byBsZSBhdHRpdml0XHUwMGUwIHNlbGV6aW9uYXRlIGNoZSBzb25vIHN0YXRpIGNvbnRyYXNzZWduYXRpIGNvbWUgIlNpbmNyb25penphdG8gY29uIGwnb3JpZ2luZSIgbmVsbGEgc2NoZWRhIEdlbmVyYWxlIGRlbGxhIHZpc3RhIFByb3ByaWV0XHUwMGUwLiBBZ2dpb3JuYSBxdWVzdGkgZGVzY3JpdHRvcmkgY29uIGxlIHByb3ByaWV0XHUwMGUwIG9yaWdpbmFsaSBkZWdsaSBlbGVtZW50aSBkZWwgY29udGVudXRvIGRlbCBtZXRvZG8gY29sbGVnYXRvIG5lbGxhIGNvbmZpZ3VyYXppb25lIHByZWRlZmluaXRhIGRlbCBwcm9jZXNzby4gTm90YXJlIGNoZSBub24gYWdnaW9ybmEgbmVzc3VuIGRlc2NyaXR0b3JlIGNvbGxlZ2F0byBpbiBtb2RvIGRpbmFtaWNvIChjb3JzaXZvIHZlcmRlKS4gIFByb2NlZGVyZT8NCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE9Q29uZmlndXJhemlvbmUNCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjI9U2VsZXppb25lIHBsdWctaW4gZSBwYWNjaGV0dG8NCi1OZXdMaWJyYXJ5RGlhbG9nX25ld2xpYnJhcnlfYXM9Q3JlYSBudW92YSBsaWJyZXJpYSBjb21lDQotTmV3UGx1Z2luRGlhbG9nX25ld3BsdWdpbl90ZXh0PU51b3ZvIHBsdWctaW4gZGkgbWV0b2RvDQotU2VsZWN0RWxlbWVudERpYWxvZ190aXRsZV90ZXh0PVNlbGV6aW9uYXJlIGwnZWxlbWVudG8gb3BwdXJlIHVubyBkZWkgc3VvaSBjb250cmlidXRvcjoNCi1PcGVuQ29uZmlnRGlhbG9nbmV3Y29uZmlnX3RleHQ9TnVvdmEgY29uZmlndXJhemlvbmU6DQotcHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlX0JTRWRpdG9yPUVkaXRvciBkaSBwcm9jZXNzaQ0KLQ0KLSMgQWJzdHJhY3REaWFncmFtRWRpdG9yDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0PUFsbGluZWENCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1BZ2dpb3JuYSBkYSBhdHRpdml0XHUwMGUwIGRpIGJhc2UNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9Rm9ybWF0byBjYXNlbGxhIGRpIHRlc3RvLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1Pcml6em9udGFsbWVudGUgYSBjb29yZC4gbWVkaWUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PU9yaXp6b250YWxtZW50ZSBhIHByaW1lIGNvb3JkLiBzZWxlemlvbmF0ZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9VmVydGljYWxtZW50ZSBhIGNvb3JkLiBtZWRpZQ0KLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGU9SW5mb3JtYXppb25pIGdlbmVyYWxpDQotTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9SVVQQTAwNDFFOiBJbXBvc3NpYmlsZSBzcG9zdGFyZSBsJ2VsZW1lbnRvIHNlbGV6aW9uYXRvIHN1bGxhIGRlc3RpbmF6aW9uZSBzcGVjaWZpY2F0YS4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVtb2RlbGxpYnJhcnk9U2FsdmF0YWdnaW8gZGVsbGEgbGlicmVyaWEgZGVpIG1vZGVsbGkgaW4gY29yc28gLi4uDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU9RXJyb3JlDQotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c9SVVQQTAwMzNFOiBSaWxldmF0byBwcm9ibGVtYSBkdXJhbnRlIGlsIHNhbHZhdGFnZ2lvIGRlbGxhIGxpYnJlcmlhLg0KLU1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0PUVsaW1pbmFyZSAnJ3swfScnPw0KLUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX0NvbnRlbnRFbGVtZW50X3RleHQ9RWxlbWVudGkgZGVsIGNvbnRlbnV0bzogDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Ccm93c2VCdXR0b25MYWJlbD1TZm9nbGlhLi4uDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1TcGVjaWZpY2FyZSB1biBub21lIGUgdW5hIGRlc2NyaXppb25lIHBlciBsYSBudW92YSBjb25maWd1cmF6aW9uZSBkaSBtZXRvZG8uDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VUaXRsZT1TYWx2YSBtb2RpZmljaGUgZSBjaGl1ZGkgdHV0dGkgZ2xpIGVkaXRvcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9VmVydGljYWxtZW50ZSBhIHByaW1lIGNvb3JkLiBzZWxlemlvbmF0ZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9U2FsdmENCi1BdHRhY2htZW50RGlhbG9nYXR0YWNoRmlsZV90ZXh0PUFsbGVnYSBmaWxlDQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudD1Db250ZW51dG8gY29uZmlndXJhemlvbmUNCi1PcGVuQ29uZmlnRGlhbG9nb3BlbmNvbmZpZ190ZXh0PUFwcmkgY29uZmlndXJhemlvbmUNCi1FbGVtZW50c1ZpZXdfcmVwbGFjZUFjdGlvbl90ZXh0PVNvc3RpdHVpc2NpLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZT1TYWx2YXRhZ2dpbyBkaSB7MH0NCi1Db25maWd1cmF0aW9uUGFnZV9TaG93RXJyb3JUb29sVGlwPU1vc3RyYSBpbCB2aXN1YWxpenphdG9yZSBsb2cgZGVnbGkgYXZ2aXNpIGRpIGNvbmZpZ3VyYXppb25lDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeD1Db25maWd1cmF6aW9uZToNCi0NCi1DaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0PVZvY2kgZWxlbmNvIGRpIGNvbnRyb2xsbzogDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPVNwb3N0YSBub2RvDQotQ29uZmlndXJhdGlvblBhZ2VfTWFrZUNsb3N1cmVUb29sVGlwPUNyZWEgY2hpdXN1cmEgY29ycmVnZ2VuZG8gZ2xpIGVycm9yaQ0KLU5ld1BsdWdpbkRpYWxvZ19yZWZlcmVuY2VwbHVnaW5fdGV4dD1QbHVnLWluIGRpIHJpZmVyaW1lbnRvOg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9jcmVhdGVGcmVlVGV4dF90ZXh0PUNyZWEgdGVzdG8gbGliZXJvDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfTGFiZWw9QW50ZXByaW1hIGljb25hIG5vZG86DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ9SVVQQTAwMzJXOiBJbXBvc3NpYmlsZSBjb25uZXR0ZXJzaQ0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0PUlVUEEwMDMzVzogSW1wb3NzaWJpbGUgYXZlcmUgbG8gc3Rlc3NvIGVsZW1lbnRvIGRlbGxhIHN1ZGRpdmlzaW9uZSBjb21lIHByZWRlY2Vzc29yZSBlIHN1Y2Nlc3NvcmUNCi0NCi0jIEVkaXRvckNob29zZXINCi1FZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZT1BcHJpIGVkaXRvcg0KLUVkaXRvckNob29zZXJfUmVzb3VyY2VzRXJyb3I9UXVlc3RvIGVsZW1lbnRvIHByZXNlbnRhIGVycm9yaS4gU2kgY29uc2lnbGlhIGRpIGNvcnJlZ2dlcmUgcXVlc3RpIGVycm9yaSBwcmltYSBkaSBjb250aW51YXJlICh2ZWRlcmUgaSBkZXR0YWdsaSkuXG5cDQotXG5cDQotRmFyZSBjbGljIHN1IE9LIHBlciBjb250aW51YXJlIHNlbnphIGFwcmlyZSBsJ2VkaXRvci4gQ2hpdWRlcmUgbGEgZmluZXN0cmEgZGkgZGlhbG9nbyBwZXIgYXByaXJlIGwnZWRpdG9yLg0KLUNvbmZpZ3VyYXRpb25QYWdlX0Zvcm1QcmVmaXg9Q29uZmlndXJhemlvbmU6DQotDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZT1Ob21lOg0KLUF0dGFjaG1lbnREaWFsb2dGaWxlVVJMX3RleHQ9VVJMIGZpbGU6DQotU3RlcHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbj1TZWxlemlvbmFyZSB1biBwYXNzbyBlIGZhcmUgY2xpYyBzdSBTdSBvIEdpXHUwMGY5IHBlciBtb2RpZmljYXJuZSBsJ29yZGluZS4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX2Vycl9zYXZlPUVycm9yZSBkdXJhbnRlIGlsIHNhbHZhdGFnZ2lvDQotTWVzc2FnZVZpZXdfZXJyZWxlbWVudF90ZXh0PUVsZW1lbnRvIGNoZSBmYSByaWZlcmltZW50bw0KLU1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dD1FbGVtZW50byBjdWkgc2kgZmEgcmlmZXJpbWVudG8NCi0NCi0jQWN0aXZpdHkgRGlhZ3JhbQ0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9jcmVhdGVTdGFydE5vZGVfdGV4dD1DcmVhIG5vZG8gaW5pemlhbGUNCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb249U2VsZXppb25hcmUgaSBwbHVnLWluIGRpIG1ldG9kbywgaSBwcm9jZXNzaSBlIGkgcGFjY2hldHRpIGRlbCBjb250ZW51dG8gY2hlIHZlcnJhbm5vIGluY2x1c2kgaW4gcXVlc3RhIGNvbmZpZ3VyYXppb25lLg0KLUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uX3RleHQ9RmluZXN0cmEgZGkgZGlhbG9nbyBPcmRpbmUgZWxlbWVudGkgZGVsIGNvbnRlbnV0byBkZWxsYSBjYXRlZ29yaWEgcGVyc29uYWxpenphdGENCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsPURpcmVjdG9yeToNCi1Sb290UHJlZlBhZ2VfZW5hYmxlcHJvY2Vzc2NvbnRyaWJ1dGlvbl90ZXh0PUFiaWxpdGEgY29udHJpYnV0byBwcm9jZXNzbw0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uX3RleHQ9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RhIGNvbmZpZ3VyYXppb25lIGRpIG1ldG9kby4NCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbkxhYmVsPURlc2NyaXppb25lOg0KLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9U2NlbHRhIGRlaSBjb250cmlidXRvciBwZXIgJyd7MH0nJw0KLUVsZW1lbnRzVmlld19vcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb25fdGV4dD1BcHJpcmUgdHJhbWl0ZSBnbGkgZWxlbWVudGkgZGkgdmFyaWFiaWxpdFx1MDBlMA0KLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1zY2VsdGEgZGVnbGkgZWxlbWVudGkgZGkgdmFyaWFiaWxpdFx1MDBlMCBwZXIgJyd7MH0nJw0KLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ192aWV3ZXJMYWJlbD1FbGVtZW50aSBkaSB2YXJpYWJpbGl0XHUwMGUwIHBlciAnJ3swfScnDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsPUFudGVwcmltYSBpY29uYSBmb3JtYToNCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2RlbGV0ZV90ZXh0PUltcG9zc2liaWxlIGVsaW1pbmFyZQ0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9QXByaSBkaWFncmFtbWEgZGV0dGFnbGkgYXR0aXZpdFx1MDBlMA0KLQ0KLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fZGVzY3JpcHRpb249Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RhIGxpYnJlcmlhIGRlaSBtZXRvZGkuDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1DYW5jZWxsYQ0KLVdQQ29tcGFydG1lbnRGaWd1cmVfMD1OdW92byBkZXNjcml0dG9yZSBkaSBwcm9kb3R0aSBkaSBsYXZvcm8NCi1wcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0PVB1YmJsaWNhIG8gdmlzdWFsaXp6YSBkaWFncmFtbWkgZGV0dGFnbGkgYXR0aXZpdFx1MDBlMCBjaGUgbm9uIHNvbm8gc3RhdGkgY3JlYXRpIG5lbGwnZWRpdG9yIGRpIHByb2Nlc3NpDQotcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVB1YmJsaWNhcmUgbyByaWNlcmNhcmUgaSBkaWFncmFtbWkgZGkgYXR0aXZpdFx1MDBlMCBwZXIgbGUgZXN0ZW5zaW9uaSBhdHRpdml0XHUwMGUwIG5vbiBtb2RpZmljYXRlDQotDQotI0NvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm49TW9kZWxsaSBub21pIChpIG5vbWkgY29ycmlzcG9uZGVudGkgdmVycmFubm8gdmlzdWFsaXp6YXRpKToNCi1zaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbD1Nb3N0cmEgaW4gTmF2aWdhdG9yIHJpc29yc2UNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19QYXR0ZXJuPUkgbW9kZWxsaSBzb25vIHNlcGFyYXRpIGRhIHVuYSB2aXJnb2xhLCBkb3ZlICo9cXVhbHNpYXNpIHN0cmluZ2EsID89cXVhbHNpYXNpIGNhcmF0dGVyZQ0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb249SVVQQTAwMjlFOiBTaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUgZHVyYW50ZSBsJ2VsYWJvcmF6aW9uZSBkZWwgZmlsZSBzZWxlemlvbmF0by4gRmFyZSBjbGljIHN1IERldHRhZ2xpIHBlciB1bHRlcmlvcmkgaW5mb3JtYXppb25pLg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX0NhdGVnb3J5VHlwZT1UaXBvIGRpIGNhdGVnb3JpYToNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19CcmllZkRlc2NyaXB0aW9uPUJyZXZlIGRlc2NyaXppb25lOg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXM9U2VsZXppb25hIGNhdGVnb3JpZQ0KLQ0KLSNsb2cgbWVzc2FnZXMNCi1jaGVhdHNoZWV0X2xvYWRfZmFpbHVyZV9sb2dfbXNnPUltcG9zc2liaWxlIGFwcmlyZSBpbCBjaGVhdCBzaGVldCByaWNoaWVzdG86IA0KLQ0KLW5ld0NvbmZpZ3VyYXRpb25XaXJhemRfY3JlYXRlRXJyb3I9SVVQQTAwMzVFOiBJbXBvc3NpYmlsZSBjcmVhcmUgbGEgY29uZmlndXJhemlvbmUgY29ycmV0dGFtZW50ZQ0KLW5ld1BsdWdpbldpemFyZF9jcmVhdGVFcnJvcj1JVVBBMDAzNkU6IEltcG9zc2liaWxlIGNyZWFyZSBpbCBwbHVnLWluIGNvcnJldHRhbWVudGUNCi1lcnJvckRpYWxvZ19tb3ZlRXJyb3I9SVVQQTAwMzdFOiBJbXBvc3NpYmlsZSBzcG9zdGFyZSBsJ2VsZW1lbnRvIGNvcnJldHRhbWVudGUNCi1yZW5hbWVEaWFsb2dfcmVuYW1lRXJyb3I9SVVQQTAwMzhFOiBJbXBvc3NpYmlsZSByaW5vbWluYXJlIGwnZWxlbWVudG8gY29ycmV0dGFtZW50ZQ0KLWVycm9yRGlhbG9nX2NyZWF0ZUVycm9yPUlVUEEwMDM5RTogSW1wb3NzaWJpbGUgY3JlYXJlIGwnZWxlbWVudG8gY29ycmV0dGFtZW50ZQ0KLWR1cGxpY2F0ZVBsdWdpbk5hbWVFcnJvcl9tc2c9SVVQQTAxMDFFOiBJbCBub21lICcnezB9JycgZXNpc3RlIGdpXHUwMGUwLiBJbW1ldHRlcmUgdW4gYWx0cm8gbm9tZSBlIHByb3ZhcmUgZGkgbnVvdm8uDQotDQotI05ldyBTdHJpbmdzIGZvciBQcm9jZXNzRWRpdG9yIENvbnRleHQgbWVudSBkaWFncmFtIGltYWdlcw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFESW1hZ2U9QXNzZWduYXppb25lIGltbWFnaW5lIEFEIGluIGNvcnNvLi4uDQotUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZT1FcnJvcmUgZGkgYWdnaW9ybmFtZW50bw0KLVByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yTXNnPUVycm9yZSBkdXJhbnRlIGwnYWdnaW9ybmFtZW50byBkZWxsJ2VkaXRvcg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlPUFzc2VnbmF6aW9uZSBpbW1hZ2luZSBBREQgaW4gY29yc28uLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRXUERJbWFnZT1Bc3NlZ25hemlvbmUgaW1tYWdpbmUgV1BEIGluIGNvcnNvLi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURJbWFnZUluUHVibGlzaGluZz1VdGlsaXp6YXJlIGwnaW1tYWdpbmUgQUQgbmVsbGEgcHViYmxpY2F6aW9uZQ0KLVByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVTdXBwcmVzcz1JIGRlc2NyaXR0b3JpIHNvcHByZXNzaSBlbGVuY2F0aSBuZWkgZGV0dGFnbGkgZGV2b25vIGVzc2VyZSBlbGltaW5hdGkgcGVyIGV2aXRhcmUgbGEgZHVwbGljYXppb25lIGluIHNlZ3VpdG8gYWxsYSBzb3BwcmVzc2lvbmUgZGVnbGkgZWxlbWVudGkgc2VsZXppb25hdGkuIEZhcmUgY2xpYyBzdSBPSyBwZXIgZWxpbWluYXJsaSBlIGNvbnRpbnVhcmUuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURESW1hZ2VJblB1Ymxpc2hpbmc9VXRpbGl6emFyZSBsJ2ltbWFnaW5lIEFERCBuZWxsYSBwdWJibGljYXppb25lDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlV1BESW1hZ2VJblB1Ymxpc2hpbmc9VXRpbGl6emFyZSBsJ2ltbWFnaW5lIFdQRCBuZWxsYSBwdWJibGljYXppb25lDQotUHJvY2Vzc0VkaXRvcl9EaWFncmFtSW1hZ2VfSW5wdXREaWFsb2dfaW5pdGlhbFZhbHVlPVBlcmNvcnNvIGltbWFnaW5lDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU2hvd0xpbmtlZEVsZW1lbnRpbkxpYnJhcnlWaWV3PU0mb3N0cmEgZWxlbWVudG8gY29sbGVnYXRvIGluIHZpc3RhIGxpYnJlcmlhDQotUHJvY2Vzc0VkaXRvcl91cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uX2xhYmVsPUFnZ2lvcm5hIHNvcHByZXNzaW9uZSBkYSAmYmFzZQ0KLVByb2Nlc3NFZGl0b3JfQ29udGV4dE1lbnVfRGlhZ3JhbUltYWdlcz1JbW1hZ2luaSBkaWFncmFtbWkNCi0NCi0jU3RyaW5ncyBmb3Igc3luY2hyb25pemF0aW9uIHdpemFyZCBvbiBwcm9jZXNzIGVkaXRvcidzIEJTDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90aXRsZT1EZXNjcml6aW9uZSBzaW5jcm9uaXp6YXppb25lDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0PUxlZ2dlcmUgbGUgaW5mb3JtYXppb25pIHJpcG9ydGF0ZSBkaSBzZWd1aXRvIGNoZSBzcGllZ2FubyBxdWFsZSBzaW5jcm9uaXp6YXppb25lIHBlcnNvbmFsaXp6YXRhIHZlcnJcdTAwZTAgZXNlZ3VpdGEuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9U2VsZXppb25hIGNvbmZpZ3VyYXppb25lDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGV4dD1TZWxlemlvbmFyZSBsYSBjb25maWd1cmF6aW9uZSBkYSB1dGlsaXp6YXJlIHBlciBsYSBzaW5jcm9uaXp6YXppb25lLiAgXA0KLUxhIHNlbGV6aW9uZSBkZXRlcm1pbmEgaSBjb250cmlidXRpIGUgbGUgc29zdGl0dXppb25pIGNoZSB2ZXJyYW5ubyB1c2F0aSBwZXIgbGEgc2luY3Jvbml6emF6aW9uZS4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV9jb25maWdMYWJlbD1Db25maWd1cmF6aW9uZToNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGl0bGU9U2VsZXppb25hcmUgbGUgcHJvcHJpZXRcdTAwZTAgZGEgc2luY3Jvbml6emFyZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcm9wZXJ0aWVzX2xhYmxlPVByb3ByaWV0XHUwMGUwDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX25hbWVfbGFibGU9Tm9tZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmVzZW50YXRpb25OYW1lX2xhYmxlPU5vbWUgcHJlc2VudGF6aW9uZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9icmllZkRlc2NfbGFibGU9QnJldmUgZGVzY3JpemlvbmUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3B0aW9uYWxJbm91dHNfbGFiZWw9SW5wdXQgZmFjb2x0YXRpdmkNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbWFuZGF0b3J5SW5wdXRzX2xhYmxlPUlucHV0IG9iYmxpZ2F0b3JpDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX291dHB1dHNfbGFiZWw9T3V0cHV0DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWw9RXNlY3V0b3JlIHByaW1hcmlvDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2FkZG5QZXJmb3JtZXJzX2xhYmxlPUVzZWN1dG9yaSBhZ2dpdW50aXZpDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGU9UnVvbGkgcmVzcG9uc2FiaWxlDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2NvbnRuQXJ0aWZhY3RzX2xhYmVsPUFydGVmYXR0aSBjb250ZW51dGkNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfZGlsdmVkUGFydHNfbGFiZWw9UGFydGkgZGlzdHJpYnVpYmlsaQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxTdGVwc19sYWJlbD1TZWxlemlvbmUgcGFzc2kNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGV4dD1TY2VnbGllcmUgbGUgcHJvcHJpZXRcdTAwZTAgZGVsIGNvbnRlbnV0byBtZXRvZG8gZGEgY29uc2lkZXJhcmUgcGVyIGxhIHNpbmNyb25penphemlvbmUuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RpdGxlPUFudGVwcmltYSBzaW5jcm9uaXp6YXppb25lDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQ9Uml2ZWRlcmUgaSBkZXR0YWdsaSBkZWxsYSBzaW5jcm9uaXp6YXppb25lIHByb3Bvc3RpIGRpIHNlZ3VpdG8uDQotc2VsZWN0RWRpdG9yc1RvRGlzY2FyZENvbmZsaWN0Q2hhbmdlcz1DaSBzb25vIG1vZGlmaWNoZSBub24gc2FsdmF0ZSBjaGUgc29ubyBpbiBjb25mbGl0dG8gY29uIGxlIG1vZGlmaWNoZSBhcHBvcnRhdGUgYWxsJ2VzdGVybm8gZGVnbGkgZWRpdG9yLlxuXA0KLVNlbGV6aW9uYXJlIGdsaSBlZGl0b3IgZGkgY3VpIGVsaW1pbmFyZSBsZSBtb2RpZmljaGUuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3RpdGxlX3RleHQ9UHJvY2VkdXJhIGd1aWRhdGEgcGVyIGxhIHNpbmNyb25penphemlvbmUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX2V4cGxhaW5UZXh0PVF1ZXN0YSBwcm9jZWR1cmEgZ3VpZGF0YSBmb3JuaXNjZSB1biBzdXBwb3J0byBwZXIgbCdhZ2dpb3JuYW1lbnRvIGRlaSBkZXNjcml0dG9yaSBzZWxlemlvbmF0aSBvIGRpIHR1dHRpIGkgZGVzY3JpdHRvcmkgc290dG8gbGUgYXR0aXZpdFx1MDBlMCBzZWxlemlvbmF0ZSBjaGUgc29ubyBzdGF0aSBjb250cmFzc2VnbmF0aSBjb21lICJTaW5jcm9uaXp6YXRvIGNvbiBsJ29yaWdpbmUiIG5lbGxhIHNjaGVkYSBHZW5lcmFsZSBkZWxsYSB2aXN0YSBQcm9wcmlldFx1MDBlMC4gIFwNCi1Tb2xvIGxlIHByb3ByaWV0XHUwMGUwIHNlbGV6aW9uYXRlIG5lbGxhIHByb2NlZHVyYSBndWlkYXRhIHZlbmdvbm8gYWdnaW9ybmF0ZSBuZWkgZGVzY3JpdHRvcmkuICBcDQotXHUwMGM4IHBvc3NpYmlsZSBzZWxlemlvbmFyZSBxdWFsc2lhc2kgY29uZmlndXJhemlvbmUgdmFsaWRhIHBlciBpbCBwcm9jZXNzbyBkYSB1dGlsaXp6YXJlIGR1cmFudGUgbCdlbGFib3JhemlvbmUgZGVsbCdhZ2dpb3JuYW1lbnRvLiAgXA0KLU5vdGFyZSBjaGUgbGEgcHJvY2VkdXJhIGd1aWRhdGEgbm9uIGFnZ2lvcm5hIG5lc3N1biBkZXNjcml0dG9yZSBjb2xsZWdhdG8gaW4gbW9kbyBkaW5hbWljbyAoY29yc2l2byB2ZXJkZSkuICANCi1vcGVuUlRFPUFwcmlyZSBsJ2VkaXRvciByaWNoIHRleHQNCi1jbG9zZVJURT1DaGl1ZGVyZSBsJ2VkaXRvciByaWNoIHRleHQNCi0NCi0jTmV3IFN0cmluZ3MNCi1yb2xlc2V0c19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3RpcmUgbGUgZ3VpZGUgY2hlIGFwcGFydGVuZ29ubyBhIHF1ZXN0byBpbnNpZW1lIGRpIHJ1b2xpLg0KLWRpc2NpcGxpbmVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlyZSBsZSBndWlkZSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RhIGRpc2NpcGxpbmEuDQotd29ya3Byb2R1Y3R0eXBlc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3RpcmUgbGUgZ3VpZGUgY2hlIGFwcGFydGVuZ29ubyBhIHF1ZXN0byB0aXBvIGRpIHByb2RvdHRvIGRpIGxhdm9yby4NCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlyZSBsZSBndWlkZSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RvIGRvbWluaW8uDQotdG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGd1aWRlIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdG8gdG9vbC4NCi1jdXN0b21jYXRlZ29yeV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3RpcmUgbGUgZ3VpZGUgY2hlIGFwcGFydGVuZ29ubyBhIHF1ZXN0YSBjYXRlZ29yaWEgcGVyc29uYWxpenphdGEuDQotDQotY29uY2VwdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3RpcmUgbGUgZ3VpZGUgY2hlIGFwcGFydGVuZ29ubyBhIHF1ZXN0byBjb25jZXR0by4NCi1jaGVja2xpc3RfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGd1aWRlIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdG8gZWxlbmNvIGRpIGNvbnRyb2xsby4NCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlyZSBsZSBndWlkZSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RvIGVzZW1waW8uDQotZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlyZSBsZSBndWlkZSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RhIGxpbmVhIGd1aWRhLg0KLXJvYWRtYXBfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGd1aWRlIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdGEgcm9hZG1hcC4NCi1yZXVzYWJsZWFzc2V0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlyZSBsZSBndWlkZSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RhIHJpc29yc2Egcml1dGlsaXp6YWJpbGUuDQotc3VwcG9ydGluZ21hdGVyaWFsX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlyZSBsZSBndWlkZSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RvIG1hdGVyaWFsZSBkaSBzdXBwb3J0by4NCi1yZXBvcnRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGd1aWRlIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdG8gcmVwb3J0Lg0KLXByYWN0aWNlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlyZSBsZSBndWlkZSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RhIHByYXRpY2EuDQotdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGd1aWRlIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdG8gbW9kZWxsby4NCi10ZXJtZGVmaW5pdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3RpcmUgbGUgZ3VpZGUgY2hlIGFwcGFydGVuZ29ubyBhIHF1ZXN0YSBkZWZpbml6aW9uZSB0ZXJtaW5lLg0KLXRvb2xtZW50b3JfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGd1aWRlIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdGEgZ3VpZGEgdG9vbC4NCi13aGl0ZXBhcGVyX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlyZSBsZSBndWlkZSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RvIHdoaXRlcGFwZXIuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGd1aWRlIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdGEgY29uc2lkZXJhemlvbmUgc3VsbGEgdmFsdXRhemlvbmUuDQotDQotDQotI05ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbg0KLXJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0byBydW9sby4NCi1yb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byBydW9sby4NCi1yb2xlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0byBydW9sbyBzaSBjb3JyZWxhIGEgdW4gYWx0cm8gcnVvbG8uDQotcm9sZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdG8gcnVvbG8uDQotDQotdGFza19kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RhIG9wZXJhemlvbmUuDQotdGFza19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdGEgb3BlcmF6aW9uZS4NCi10YXNrX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0YSBvcGVyYXppb25lIHNpIGNvcnJlbGEgYSB1bidhbHRyYSBvcGVyYXppb25lLg0KLXRhc2tfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RhIG9wZXJhemlvbmUuDQotDQotYXJ0aWZhY3RfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0byBhcnRlZmF0dG8uDQotYXJ0aWZhY3RfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RvIGFydGVmYXR0by4NCi1hcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdG8gYXJ0ZWZhdHRvLg0KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIGNvbnNlZ25hIHBlciBxdWVzdG8gYXJ0ZWZhdHRvLg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSBwZXJzb25hbGl6emF6aW9uZSByZWxhdGl2ZSBhIHF1ZXN0byBhcnRlZmF0dG8uDQotYXJ0aWZhY3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RvIGFydGVmYXR0byBzaSBjb3JyZWxhIGEgdW4gYWx0cm8gYXJ0ZWZhdHRvLg0KLWFydGlmYWN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIHZlcnNpb25lIGRpIHF1ZXN0byBhcnRlZmF0dG8uDQotDQotb3V0Y29tZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RvIHJpc3VsdGF0by4NCi1vdXRjb21lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byByaXN1bHRhdG8uDQotb3V0Y29tZV9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdG8gcmlzdWx0YXRvLg0KLW91dGNvbWVfbm90YXRpb25TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgY29uc2VnbmEgcGVyIHF1ZXN0byByaXN1bHRhdG8uDQotb3V0Y29tZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgcGVyc29uYWxpenphemlvbmUgcmVsYXRpdmUgYSBxdWVzdG8gcmlzdWx0YXRvLg0KLW91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RvIHJpc3VsdGF0byBzaSBjb3JyZWxhIGEgdW4gYWx0cm8gcmlzdWx0YXRvLg0KLW91dGNvbWVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIHJpc3VsdGF0by4NCi0NCi1kZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RvIGNvbXBvbmVudGUgZGlzdHJpYnVpYmlsZS4NCi1kZWxpdmVyYWJsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdG8gY29tcG9uZW50ZSBkaXN0cmlidWliaWxlLg0KLWRlbGl2ZXJhYmxlX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpenphcmUgbGUgaWNvbmUgcGVyIHF1ZXN0byBjb21wb25lbnRlIGRpc3RyaWJ1aWJpbGUuDQotZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgY29uc2VnbmEgcGVyIHF1ZXN0byBjb21wb25lbnRlIGRpc3RyaWJ1aWJpbGUuDQotZGVsaXZlcmFibGVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIHBlcnNvbmFsaXp6YXppb25lIHJlbGF0aXZlIGEgcXVlc3RvIGNvbXBvbmVudGUgZGlzdHJpYnVpYmlsZS4NCi1kZWxpdmVyYWJsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZpY2FyZSBpbiBjaGUgbW9kbyBxdWVzdG8gY29tcG9uZW50ZSBkaXN0cmlidWliaWxlIHNpIGNvcnJlbGEgYSB1biBhbHRybyBjb21wb25lbnRlIGRpc3RyaWJ1aWJpbGUuDQotZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIGNvbXBvbmVudGUgZGlzdHJpYnVpYmlsZS4NCi0NCi1kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdGEgZGlzY2lwbGluYS4NCi1kaXNjaXBsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0YSBkaXNjaXBsaW5hLg0KLWRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RhIGRpc2NpcGxpbmEgc2kgY29ycmVsYSBhIHVuJ2FsdHJhIGRpc2NpcGxpbmEuDQotZGlzY2lwbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdGEgZGlzY2lwbGluYS4NCi0NCi1kb21haW5fZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0byBkb21pbmlvLg0KLWRvbWFpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdG8gZG9taW5pby4NCi1kb21haW5fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RvIGRvbWluaW8gc2kgY29ycmVsYSBhIHVuIGFsdHJvIGRvbWluaW8uDQotZG9tYWluX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIHZlcnNpb25lIGRpIHF1ZXN0byBkb21pbmlvLg0KLQ0KLXdvcmtwcm9kdWN0dHlwZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RvIHRpcG8gZGkgcHJvZG90dG8gZGkgbGF2b3JvLg0KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdG8gdGlwbyBkaSBwcm9kb3R0byBkaSBsYXZvcm8uDQotd29ya3Byb2R1Y3R0eXBlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0byB0aXBvIGRpIHByb2RvdHRvIGRpIGxhdm9ybyBzaSBjb3JyZWxhIGEgdW4gYWx0cm8gdGlwbyBkaSBwcm9kb3R0byBkaSBsYXZvcm8uDQotd29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIHZlcnNpb25lIGRpIHF1ZXN0byB0aXBvIGRpIHByb2RvdHRvIGRpIGxhdm9yby4NCi0NCi1yb2xlc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdG8gaW5zaWVtZSBkaSBydW9saS4NCi1yb2xlc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byBpbnNpZW1lIGRpIHJ1b2xpLg0KLXJvbGVzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RvIGluc2llbWUgZGkgcnVvbGkgc2kgY29ycmVsYSBhIHVuIGFsdHJvIGluc2llbWUgZGkgcnVvbGkuDQotcm9sZXNldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdG8gaW5zaWVtZSBkaSBydW9saS4NCi0NCi10b29sX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdG8gdG9vbC4NCi10b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byB0b29sLg0KLXRvb2xfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RvIHRvb2wgc2kgY29ycmVsYSBhIHVuIGFsdHJvIHRvb2wuDQotdG9vbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdG8gdG9vbC4NCi0NCi1jb25jZXB0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdG8gY29uY2V0dG8uDQotY29uY2VwdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdG8gY29uY2V0dG8uDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZpY2FyZSBpbiBjaGUgbW9kbyBxdWVzdG8gY29uY2V0dG8gc2kgY29ycmVsYSBhIHVuIGFsdHJvIGNvbmNldHRvLg0KLWNvbmNlcHRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIGNvbmNldHRvLg0KLQ0KLWNoZWNrbGlzdF9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RvIGVsZW5jbyBkaSBjb250cm9sbG8uDQotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byBlbGVuY28gZGkgY29udHJvbGxvLg0KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZpY2FyZSBpbiBjaGUgbW9kbyBxdWVzdG8gZWxlbmNvIGRpIGNvbnRyb2xsbyBzaSBjb3JyZWxhIGEgdW4gYWx0cm8gZWxlbmNvIGRpIGNvbnRyb2xsby4NCi1jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIGVsZW5jbyBkaSBjb250cm9sbG8uDQotDQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RvIGVzZW1waW8uDQotZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdG8gZXNlbXBpby4NCi1leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0byBlc2VtcGlvIHNpIGNvcnJlbGEgYSB1biBhbHRybyBlc2VtcGlvLg0KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIGVzZW1waW8uDQotDQotZ3VpZGVsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdGEgbGluZWEgZ3VpZGEuDQotZ3VpZGVsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0YSBsaW5lYSBndWlkYS4NCi1ndWlkZWxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RhIGxpbmVhIGd1aWRhIHNpIGNvcnJlbGEgYSB1bidhbHRyYSBsaW5lYSBndWlkYS4NCi1ndWlkZWxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RhIGxpbmVhIGd1aWRhLg0KLQ0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdGEgY29uc2lkZXJhemlvbmUgc3VsbGEgdmFsdXRhemlvbmUuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RhIGNvbnNpZGVyYXppb25lIHN1bGxhIHZhbHV0YXppb25lLg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0YSBjb25zaWRlcmF6aW9uZSBzdWxsYSB2YWx1dGF6aW9uZSBzaSBjb3JyZWxhIGEgdW4nYWx0cmEgY29uc2lkZXJhemlvbmUgc3VsbGEgdmFsdXRhemlvbmUuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RhIGNvbnNpZGVyYXppb25lIHN1bGxhIHZhbHV0YXppb25lLg0KLQ0KLXByYWN0aWNlX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdGEgcHJhdGljYS4NCi1wcmFjdGljZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdGEgcHJhdGljYS4NCi1wcmFjdGljZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZpY2FyZSBpbiBjaGUgbW9kbyBxdWVzdGEgcHJhdGljYSBzaSBjb3JyZWxhIGEgdW4nYWx0cmEgcHJhdGljYS4NCi1wcmFjdGljZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdGEgcHJhdGljYS4NCi0NCi1yZXBvcnRfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0byByZXBvcnQuDQotcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byByZXBvcnQuDQotcmVwb3J0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0byByZXBvcnQgc2kgY29ycmVsYSBhIHVuIGFsdHJvIHJlcG9ydC4NCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIHJlcG9ydC4NCi0NCi1yZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdGEgcmlzb3JzYSByaXV0aWxpenphYmlsZS4NCi1yZXN1YWJsZWFzc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0YSByaXNvcnNhIHJpdXRpbGl6emFiaWxlLg0KLXJlc3VhYmxlYXNzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RhIHJpc29yc2Egcml1dGlsaXp6YWJpbGUgc2kgY29ycmVsYSBhIHVuJ2FsdHJhIHJpc29yc2Egcml1dGlsaXp6YWJpbGUuDQotcmVzdWFibGVhc3NldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdGEgcmlzb3JzYSByaXV0aWxpenphYmlsZS4NCi0NCi1yb2FkbWFwX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdGEgcm9hZG1hcC4NCi1yb2FkbWFwX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0YSByb2FkbWFwLg0KLXJvYWRtYXBfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RhIHJvYWRtYXAgc2kgY29ycmVsYSBhIHVuJ2FsdHJhIHJvYWRtYXAuDQotcm9hZG1hcF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdGEgcm9hZG1hcC4NCi0NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0byBtYXRlcmlhbGUgZGkgc3VwcG9ydG8uDQotc3VwcG9ydGluZ21hdGVyaWFsX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byBtYXRlcmlhbGUgZGkgc3VwcG9ydG8uDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0byBtYXRlcmlhbGUgZGkgc3VwcG9ydG8gc2kgY29ycmVsYSBhIHVuIGFsdHJvIG1hdGVyaWFsZSBkaSBzdXBwb3J0by4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIG1hdGVyaWFsZSBkaSBzdXBwb3J0by4NCi0NCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RvIG1vZGVsbG8uDQotdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RvIG1vZGVsbG8uDQotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RvIG1vZGVsbG8gc2kgY29ycmVsYSBhIHVuIGFsdHJvIG1vZGVsbG8uDQotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIG1vZGVsbG8uDQotDQotdGVybWRlZmluaXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0YSBkZWZpbml6aW9uZSB0ZXJtaW5lLg0KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0YSBkZWZpbml6aW9uZSB0ZXJtaW5lLg0KLXRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0YSBkZWZpbml6aW9uZSB0ZXJtaW5lIHNpIGNvcnJlbGEgYSB1bidhbHRyYSBkZWZpbml6aW9uZSB0ZXJtaW5lLg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIHZlcnNpb25lIGRpIHF1ZXN0YSBkZWZpbml6aW9uZSB0ZXJtaW5lLg0KLQ0KLXRvb2xtZW50b3JfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0YSBndWlkYSBhbCB0b29sLg0KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RhIGd1aWRhIGFsIHRvb2wuDQotdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZpY2FyZSBpbiBjaGUgbW9kbyBxdWVzdGEgZ3VpZGEgYWwgdG9vbCBzaSBjb3JyZWxhIGEgdW4nYWx0cmEgZ3VpZGEgYWwgdG9vbC4NCi10b29sbWVudG9yX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIHZlcnNpb25lIGRpIHF1ZXN0YSBndWlkYSBhbCB0b29sLg0KLQ0KLXdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0byB3aGl0ZXBhcGVyLg0KLXdoaXRlcGFwZXJfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RvIHdoaXRlcGFwZXIuDQotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZpY2FyZSBpbiBjaGUgbW9kbyBxdWVzdG8gd2hpdGVwYXBlciBzaSBjb3JyZWxhIGEgdW4gYWx0cm8gd2hpdGVwYXBlci4NCi13aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIHZlcnNpb25lIGRpIHF1ZXN0byB3aGl0ZXBhcGVyLg0KLQ0KLWRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RvIHJhZ2dydXBwYW1lbnRvIGRpIGRpc2NpcGxpbmUuDQotZGlzY2lwbGluZWdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byByYWdncnVwcGFtZW50byBkaSBkaXNjaXBsaW5lLg0KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZpY2FyZSBpbiBjaGUgbW9kbyBxdWVzdG8gcmFnZ3J1cHBhbWVudG8gZGkgZGlzY2lwbGluZSBzaSBjb3JyZWxhIGEgdW4gYWx0cm8gcmFnZ3J1cHBhbWVudG8gZGkgZGlzY2lwbGluZS4NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIHJhZ2dydXBwYW1lbnRvIGRpIGRpc2NpcGxpbmUuDQotDQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdG8gcmFnZ3J1cHBhbWVudG8gaW5zaWVtaSBkaSBydW9saS4NCi1yb2xlc2V0Z3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RvIHJhZ2dydXBwYW1lbnRvIGluc2llbWkgZGkgcnVvbGkuDQotcm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0byByYWdncnVwcGFtZW50byBpbnNpZW1pIGRpIHJ1b2xpIHNpIGNvcnJlbGEgYSB1biBhbHRybyByYWdncnVwcGFtZW50byBpbnNpZW1pIGRpIHJ1b2xpLg0KLXJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdG8gcmFnZ3J1cHBhbWVudG8gaW5zaWVtaSBkaSBydW9saS4NCi0NCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RhIGNhdGVnb3JpYSBwZXJzb25hbGl6emF0YS4NCi1jdXN0b21jYXRlZ29yeV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdGEgY2F0ZWdvcmlhIHBlcnNvbmFsaXp6YXRhLg0KLWN1c3RvbWNhdGVnb3J5X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0YSBjYXRlZ29yaWEgcGVyc29uYWxpenphdGEgc2kgY29ycmVsYSBhIHVuJ2FsdHJhIGNhdGVnb3JpYSBwZXJzb25hbGl6emF0YS4NCi1jdXN0b21jYXRlZ29yeV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdGEgY2F0ZWdvcmlhIHBlcnNvbmFsaXp6YXRhLg0KLWN1c3RvbWNhdGVnb3J5X0ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpenphcmUgbGUgaWNvbmUgcGVyIHF1ZXN0YSBjYXRlZ29yaWEgcGVyc29uYWxpenphdGEuDQotDQotY29uY2VwdF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdG8gY29uY2V0dG8uDQotY2hlY2tsaXN0X2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpenphcmUgbGUgaWNvbmUgcGVyIHF1ZXN0byBlbGVuY28gZGkgY29udHJvbGxvLg0KLXRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGl6emFyZSBsZSBpY29uZSBwZXIgcXVlc3RhIGd1aWRhIGFsIHRvb2wuDQotd2hpdGVwYXBlcl9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdG8gd2hpdGVwYXBlci4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdGEgY29uc2lkZXJhemlvbmUgc3VsbGEgdmFsdXRhemlvbmUuDQotdGVybWRlZmluaXRpb25faWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGl6emFyZSBsZSBpY29uZSBwZXIgcXVlc3RhIGRlZmluaXppb25lIHRlcm1pbmUuDQotdGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGl6emFyZSBsZSBpY29uZSBwZXIgcXVlc3RvIG1vZGVsbG8uDQotcmV1c2FibGVhc3NldF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdGEgcmlzb3JzYSByaXV0aWxpenphYmlsZS4NCi1yZXBvcnRfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGl6emFyZSBsZSBpY29uZSBwZXIgcXVlc3RvIHJlcG9ydC4NCi1wcmFjdGljZV9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdGEgcHJhdGljYS4NCi1leGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpenphcmUgbGUgaWNvbmUgcGVyIHF1ZXN0byBlc2VtcGlvLg0KLWd1aWRlbGluZV9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdGEgbGluZWEgZ3VpZGEuDQotcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdGEgcm9hZG1hcC4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGl6emFyZSBsZSBpY29uZSBwZXIgcXVlc3RvIG1hdGVyaWFsZSBkaSBzdXBwb3J0by4NCi0NCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY190aXRsZT1GaWxlIG1vZGlmaWNhdG8NCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY19tZXNzYWdlPUlsIGZpbGUgXHUwMGU4IHN0YXRvIG1vZGlmaWNhdG8gc3VsIGZpbGUgc3lzdGVtLiBDYXJpY2FyZSBsZSBtb2RpZmljaGU/DQotDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU9VmFyaWFiaWxpdFx1MDBlMCBhdHRpdml0XHUwMGUwDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnPUwnJ2F0dGl2aXRcdTAwZTAgJyd7MH0nJyBub24gcHVcdTAwZjIgaW1wb3N0YXJlIGxhIHZhcmlhYmlsaXRcdTAwZTAgY29uICcnezF9JycgcG9pY2hcdTAwZTkgJyd7MX0nJyBkaXNwb25lIGRpIHVuYSBvIHBpXHUwMGY5IGF0dGl2aXRcdTAwZTAgY29udHJpYnVpdGEvc29zdGl0dWl0YSBjb21lIGdsaSBlbGVtZW50aSBjaGlsZC4NCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxPUwnJ2F0dGl2aXRcdTAwZTAgJyd7MH0nJyBub24gcHVcdTAwZjIgaW1wb3N0YXJlIGxhIHZhcmlhYmlsaXRcdTAwZTAgY29uIHVubyBkZWkgcGFyZW50IGRpcmV0dGkgZSBxdWFsc2lhc2kgcHJvY2Vzc28uDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMj1MJydhdHRpdml0XHUwMGUwICcnezB9Jycgbm9uIHB1XHUwMGYyIGltcG9zdGFyZSBsYSB2YXJpYWJpbGl0XHUwMGUwIGNvbiAnJ3sxfScnIHBvaWNoXHUwMGU5IGRldGVybWluZXJcdTAwZTAgdW5hIGRpcGVuZGVuemEgY2lyY29sYXJlLg0KLQ0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU9QXBwbGljYSBtb2RlbGxvDQotYXBwbHlfcGF0dGVybl9lcnJvcl9tc2c9TCcnYXR0aXZpdFx1MDBlMCAnJ3swfScnIG5vbiBwdVx1MDBmMiBhcHBsaWNhcmUgaSBtb2RlbGxpIGNvbiAnJ3sxfScnIHBvaWNoXHUwMGU4IGRldGVybWluZXJcdTAwZTAgdW5hIGRpcGVuZGVuemEgY2lzcmNvbGFyZS4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotQ2hhbmdlSGlzdG9yeURpYWxvZ19kZWxpbWl0ZXI9fA0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3Jfc2hvd093bmVySW5MaWJyYXJ5Vmlldz1Nb3N0cmEgcHJvcHJpZXRhcmlvIGRpIHF1ZXN0byByaWZlcmltZW50byBub24gcmlzb2x0byBuZWxsYSB2aXN0YSBsaWJyZXJpYQ0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZT1SaW11b3ZpIHF1ZXN0byByaWZlcmltZW50byBub24gcmlzb2x0bw0KLXByb21wdERlbGV0ZUN1c3RvbUNhdGVnb3J5QmVmb3JlUmVtb3ZlTGFzdFJlZlRvSXQ9U2kgc3RhIHBlciByaW11b3ZlcmUgbCcndWx0aW1vIHJpZmVyaW1lbnRvIGEgezB9IG5lbCBwbHVnaW4uIEdsaSBlbGVtZW50aSB2ZXJyYW5ubyBlbGltaW5hdGkuIENvbnRpbnVhcmU/DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSNCZWxvdyBwcm9wZXJ0eSAiZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzIiBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQNCi0jRG9uJ3QgZGVsZXRlIGEgc3BhY2UgYWZ0ZXIgIjogIg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzPTogDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfamEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1YmU5ZDUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZvcm0gUGFnZSBUaXRsZXMNCi1hc3NpZ25QYWdlX3RpdGxlPVx1NTI3Mlx1MzA4YVx1NWY1M1x1MzA2Ng0KLWNhdGVnb3JpZXNQYWdlX3RpdGxlPVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmYw0KLWRlbGl2ZXJhYmxlUGFydHNQYWdlX3RpdGxlPVx1N2QwZFx1NTE2NVx1NzI2OQ0KLWRlc2NyaXB0aW9uUGFnZV90aXRsZT1cdThhYWNcdTY2MGUNCi1kaXNjaXBsaW5lc1BhZ2VfdGl0bGU9XHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlDQotZGlzY2FyZHVucmVzb2x2ZWRyZWY9XHU2NzJhXHU4OWUzXHU2YzdhXHUzMDZlXHU1M2MyXHU3MTY3XHUzMDZlXHU3ODM0XHU2OGM0DQotZ3VpZGFuY2VQYWdlX3RpdGxlPVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOQ0KLXByZXZpZXdQYWdlX3RpdGxlPVx1MzBkN1x1MzBlY1x1MzBkM1x1MzBlNVx1MzBmYw0KLXJlZmVyZW5jZXNQYWdlX3RpdGxlPVx1NTNjMlx1NzE2Nw0KLXJlZmVyZW5jZV90ZXh0PVx1NTNjMlx1NzE2NzoNCi1yZWZlcmVuY2VXb3JrZmxvd1BhZ2VfdGl0bGU9XHU1M2MyXHU3MTY3XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGQ1XHUzMGVkXHUzMGZjDQotcm9sZXNQYWdlX3RpdGxlPVx1MzBlZFx1MzBmY1x1MzBlYg0KLXJvbGVTZXRzUGFnZV90aXRsZT1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzgNCi1zdGVwc1BhZ2VfdGl0bGU9XHUzMGI5XHUzMGM2XHUzMGMzXHUzMGQ3DQotdGFza3NQYWdlX3RpdGxlPVx1MzBiZlx1MzBiOVx1MzBhZg0KLXRvb2xNZW50b3JzUGFnZV90aXRsZT1cdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmMNCi13b3JrUHJvZHVjdHNQYWdlX3RpdGxlPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLQ0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uDQotY2hlY2tJdGVtc1NlY3Rpb25fbmFtZT1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk4MDVcdTc2ZWUNCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1MzBlYVx1MzBiOVx1MzBjOFx1MzA5Mlx1NjljYlx1NjIxMFx1MzA1OVx1MzA4Ylx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1OTgwNVx1NzZlZVx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWRlcGVuZGVuY2llc1NlY3Rpb25fbmFtZT1cdTRmOWRcdTViNThcdTk1YTJcdTRmYzINCi1kZXBlbmRlbmNpZXNTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGJiXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDY3XHUzMDZmXHUzMDAxXHU0ZWQ2XHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMGZiXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHUzMDZiXHU1YmZlXHUzMDU5XHUzMDhiXHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMGZiXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHUzMDZlXHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyXHUzMDkyXHU3OTNhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZGV0YWlsU2VjdGlvbl9uYW1lPVx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMQ0KLWRldGFpbFNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmV7MH1cdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhNzNcdTdkMzBcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1nZW5lcmFsSW5mb1NlY3Rpb25fbmFtZT1cdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzENCi1nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmV7MH1cdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1pY29uU2VjdGlvbl9uYW1lPVx1MzBhMlx1MzBhNFx1MzBiM1x1MzBmMw0KLWljb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlezB9XHUzMDZlXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDkyXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotbm90YXRpb25TZWN0aW9uX25hbWU9XHUzMGM3XHUzMGVhXHUzMGQwXHUzMGVhXHUzMGZjXHU2MGM1XHU1ODMxDQotbm90YXRpb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlIHswfSBcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fbmFtZT1cdTUzYzJcdTcxNjdcdTUxNDhcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjM6DQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGJiXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDY3XHUzMDZmXHUzMDAxXHUzMDUzXHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDRjXHU1M2MyXHU3MTY3XHUzMDU5XHUzMDhiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDkyXHU3OTNhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotc3RhZmZpbmdTZWN0aW9uX25hbWU9XHU5MTRkXHU1YzVlXHU2MGM1XHU1ODMxDQotc3RhZmZpbmdTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU5MTRkXHU1YzVlXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotc3RlcHNTZWN0aW9uX25hbWU9XHUzMGI5XHUzMGM2XHUzMGMzXHUzMGQ3DQotc3RlcHNTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGJmXHUzMGI5XHUzMGFmXHUzMDZlXHU1YjlmXHU4ODRjXHUzMGI5XHUzMGM2XHUzMGMzXHUzMGQ3XHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdGFpbG9yaW5nU2VjdGlvbl9uYW1lPVx1OGFiZlx1NjU3NA0KLXRhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmV7MH1cdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhYmZcdTY1NzRcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi12YXJpYWJpbGl0eVNlY3Rpb25fbmFtZT1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNmVcdTUzZWZcdTU5MDlcdTYwMjcNCi12YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmUgezB9IFx1MzA2OFx1NTIyNVx1MzA2ZSB7MH0gXHUzMDY4XHUzMDZlXHU5NWEyXHU0ZmMyXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdmVyc2lvbkluZm9TZWN0aW9uX25hbWU9XHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxDQotdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlezB9XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBVSSAmIEVsZW1lbnQgQXR0cmlidXRlIExhYmVscw0KLWFkZGl0aW9uYWxJbmZvX3RleHQ9XHU4ZmZkXHU1MmEwXHU2MGM1XHU1ODMxOg0KLWFwcGxpY2F0aW9uX3RleHQ9XHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzOg0KLWFjdGlvbkxhYmVsX2VkaXQ9XHU3ZGU4XHU5NmM2DQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDNcdTMwZTVcdTMwZmNcdTMwNmJcdTg4NjhcdTc5M2ENCi1hbHRlcm5hdGl2ZXNfdGV4dD1cdTRlZTNcdTY4NDg6DQotYXNzaWdubWVudEFwcHJvYWNoZXNfdGV4dD1cdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjZcdTY1YjlcdTZjZDU6DQotYXV0aG9yc190ZXh0PVx1NGY1Y1x1NjIxMFx1ODAwNToNCi1iYWNrZ3JvdW5kX3RleHQ9XHUzMGQwXHUzMGMzXHUzMGFmXHUzMGIwXHUzMGU5XHUzMGE2XHUzMGYzXHUzMGM5Og0KLWJhc2VFbGVtZW50X3RleHQ9XHU1N2ZhXHU2NzJjOg0KLWJhc2VHdWlkYW5jZV90ZXh0PVx1NTdmYVx1NjcyY1x1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOToNCi1icmllZkRlc2NyaXB0aW9uX3RleHQ9XHU4OTgxXHU2NWU4Og0KLWRlc2NyaXB0aW9uX3RleHQ9XHU4YWFjXHU2NjBlOg0KLWJhY2t1cGJlZm9yZXNhdmVfdGV4dD1cdTRmZGRcdTdiYTFcdTUyNGRcdTMwNmJcdTMwZDBcdTMwYzNcdTMwYWZcdTMwYTJcdTMwYzNcdTMwZDcNCi1icmllZk91dGxpbmVfdGV4dD1cdTY5ODJcdTg5ODE6DQotY2hhbmdlRGF0ZV90ZXh0PVx1NTkwOVx1NjZmNFx1NjVlNToNCi1jaGFuZ2VEZXNjcmlwdGlvbl90ZXh0PVx1NTkwOVx1NjZmNFx1MzA2ZVx1OGFhY1x1NjYwZToNCi1jaGVja0l0ZW1zX3RleHQ9XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHU5ODA1XHU3NmVlDQotY29udHJpYnV0ZXNfdGV4dD1cdTViYzRcdTRlMGUNCi1sb2NhbENvbnRyaWJ1dGVzX3RleHQ9XHUzMGVkXHUzMGZjXHUzMGFiXHUzMGViXHU1YmM0XHU0ZTBlDQotY29udHJpYnV0ZXNfdG9fdGV4dD1cdTViYzRcdTRlMGVcdTViZmVcdThjNjENCi1jb3B5cmlnaHRfdGV4dD1cdTg0NTdcdTRmNWNcdTZhMjk6DQotZWRpdG9yX3RleHQ9XHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjDQotZXh0ZW5kc190ZXh0PVx1NjJlMVx1NWYzNQ0KLWV4dGVuZF90ZXh0PVx1NjJlMVx1NWYzNQ0KLWV4dGVybmFsRGVzY3JpcHRpb25fdGV4dD1cdTU5MTZcdTkwZThcdThhMThcdThmZjA6DQotZXh0ZXJuYWxJZF90ZXh0PVx1NTkxNlx1OTBlOCBJRDoNCi1nb2Fsc190ZXh0PVx1NzZlZVx1NmExOToNCi1pbXBhY3RPZk5vdEhhdmluZ190ZXh0PVx1MzA2YVx1MzA0NFx1NTgzNFx1NTQwOFx1MzA2ZVx1NWY3MVx1OTdmZjoNCi1rZXlDb25zaWRlcmF0aW9uc190ZXh0PVx1NGUzYlx1MzA2YVx1ODAwM1x1NjE2ZVx1NGU4Ylx1OTgwNToNCi1sZXZlbHNPZkFkb3B0aW9uX3RleHQ9XHU2M2ExXHU3NTI4XHUzMGVjXHUzMGQ5XHUzMGViOg0KLW1haW5EZXNjcmlwdGlvbl90ZXh0PVx1OGFhY1x1NjYwZToNCi1uZXdFbGVtZW50X3RleHQ9XHU2NWIwXHU4OThmIHswfQ0KLW5hbWVfdGV4dD1cdTU0MGRcdTUyNGQ6DQotbm90QXBwbGljYWJsZV90ZXh0PVx1OTA2OVx1NzUyOFx1NTkxNg0KLXBhY2thZ2luZ0d1aWRhbmNlX3RleHQ9XHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHU1MzE2XHUzMDZlXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5Og0KLXByZXNlbnRhdGlvbk5hbWVfdGV4dD1cdTg4NjhcdTc5M2FcdTU0MGQ6DQotcHJvbXB0Zm9ybGliYXJ5X3RleHQ9XHU1OWNiXHU1MmQ1XHU2NjQyXHUzMDZiXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHUzMGQ3XHUzMGVkXHUzMGYzXHUzMGQ3XHUzMGM4XHUzMDU5XHUzMDhiDQotZW5hYmxlSGVhbHRoQ2hlY2tfdGV4dD1cdTUxODVcdTkwZThcdTMwYzdcdTMwZDBcdTMwYzNcdTMwYjBcdTMwZmJcdTMwYzRcdTMwZmNcdTMwZWJcdTMwOTJcdTRmN2ZcdTc1MjhcdTUzZWZcdTgwZmRcdTMwNmJcdTMwNTlcdTMwOGINCi1wcm9ibGVtX3RleHQ9XHU1NTRmXHU5ODRjOg0KLXB1cnBvc2VfdGV4dD1cdTc2ZWVcdTc2ODQ6DQotcmVhc29uRm9yTm90TmVlZGluZ190ZXh0PVx1NGUwZFx1ODk4MVx1MzA2N1x1MzA0Mlx1MzA4Ylx1NzQwNlx1NzUzMToNCi1yZXBsYWNlc190ZXh0PVx1N2Y2ZVx1NjNkYg0KLWxvY2FsUmVwbGFjZXNfdGV4dD1cdTMwZWRcdTMwZmNcdTMwYWJcdTMwZWJcdTdmNmVcdTYzZGINCi1yZXByZXNlbnRhdGlvbk9wdGlvbnNfdGV4dD1cdTg4NjhcdTc5M2FcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjM6DQotdGVtcGxhdGVGaWxlX3RleHQ9XHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViOg0KLXNraWxsc190ZXh0PVx1MzBiOVx1MzBhZFx1MzBlYjoNCi1zdGVwc190ZXh0PVx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkNzoNCi1zdGVwc19uYW1lX3RleHQ9XHU1NDBkXHU1MjRkOg0KLXN0b3BfdGV4dD1cdTUwNWNcdTZiNjINCi1wcmludF90ZXh0PVx1NTM3MFx1NTIzNw0KLXN5bm9ueW1zX3RleHQ9XHU1NDBjXHU3ZmE5XHU4YTllOg0KLXR5cGVfdGV4dD1cdTMwYmZcdTMwYTRcdTMwZDc6DQotY29weV90ZXh0PVx1MzBiM1x1MzBkNFx1MzBmYw0KLWRlZXBDb3B5X3RleHQ9XHUzMGM3XHUzMGEzXHUzMGZjXHUzMGQ3XHUzMGZiXHUzMGIzXHUzMGQ0XHUzMGZjDQotYmFja190ZXh0PVx1NjIzYlx1MzA4Yg0KLW5ld19wbHVnaW49XHU2NWIwXHU4OThmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzDQotbW92ZT1cdTc5ZmJcdTUyZDUuLi4NCi11bmlxdWVJZF90ZXh0PVx1NTZmYVx1NjcwOSBJRDoNCi12YXJpYWJpbGl0eVR5cGVfdGV4dD1cdTUzZWZcdTU5MDlcdTYwMjdcdTMwNmVcdTMwYmZcdTMwYTRcdTMwZDc6DQotdmVyc2lvbl90ZXh0PVx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmMzoNCi0NCi0jIEJ1dHRvbiBMYWJlbHMNCi1hZGRCdXR0b25fdGV4dD1cdThmZmRcdTUyYTAuLi4NCi1hdHRhY2hCdXR0b25fdGV4dD1cdTZkZmJcdTRlZDguLi4NCi1icm93c2VCdXR0b25fdGV4dD1cdTUzYzJcdTcxNjcuLi4NCi1jaGFuZ2VUeXBlQnV0dG9uX3RleHQ9XHUzMGJmXHUzMGE0XHUzMGQ3XHUzMDZlXHU1OTA5XHU2NmY0Li4uDQotY2xlYXJCdXR0b25fdGV4dD1cdTMwYWZcdTMwZWFcdTMwYTINCi1kZWxldGVCdXR0b25fdGV4dD1cdTUyNGFcdTk2NjQNCi1kZXRhY2hCdXR0b25fdGV4dD1cdTZkZmJcdTRlZDhcdTUyNGFcdTk2NjQNCi1kaWFncmFtX3NhdmVFcnJvcj1cdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTBcdTRmZGRcdTdiYTFcdTY2NDJcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmMNCi1kb3duQnV0dG9uX3RleHQ9XHU0ZTBiXHUzMDc4DQotZGlyZWN0b3J5X3RleHQ9XHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjOg0KLW9yZGVyQnV0dG9uX3RleHQ9XHU5ODA2XHU1ZThmDQotZWRpdEJ1dHRvbl90ZXh0PVx1N2RlOFx1OTZjNi4uLg0KLXJlbW92ZUJ1dHRvbl90ZXh0PVx1OTY2NFx1NTNiYg0KLXJlbmFtZUFjdGlvbl90ZXh0PVx1NTQwZFx1NTI0ZFx1NTkwOVx1NjZmNC4uLg0KLXJlbW92ZV90ZXh0PVx1OTY2NFx1NTNiYg0KLXJlbmFtZV90ZXh0PVx1NTQwZFx1NTI0ZFx1NTkwOVx1NjZmNA0KLVNhdmVBc190ZXh0PVx1NTIyNVx1NTQwZFx1NGZkZFx1N2JhMQ0KLXNlbGVjdEJ1dHRvbl90ZXh0PVx1OTA3OFx1NjI5ZS4uLg0KLWRlc2VsZWN0QnV0dG9uX3RleHQ9XHU5MDc4XHU2MjllXHU4OWUzXHU5NjY0DQotdXBCdXR0b25fdGV4dD1cdTRlMGFcdTMwNzgNCi1tYWtlRGVmYXVsdEJ1dHRvbl90ZXh0PVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA2Ylx1OGEyZFx1NWI5YQ0KLXZpZXdIaXN0b3J5QnV0dG9uX3RleHQ9XHU1YzY1XHU2Yjc0XHUzMDZlXHU4ODY4XHU3OTNhLi4uDQotDQotIyBSb2xlIEVkaXRvciBUYXNrcyBQYWdlDQotcm9sZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1cdTMwYmZcdTMwYjlcdTMwYWYNCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwNmZcdTMwMDFcdTZiMjFcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdTMwNmVcdTViOWZcdTg4NGNcdTgwMDVcdTMwNjdcdTMwNTlcdTMwMDINCi1yb2xlVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBiZlx1MzBiOVx1MzBhZg0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTU3ZmFcdTY3MmNcdTViOWZcdTg4NGNcdTgwMDU6DQotcm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsMj1cdThmZmRcdTUyYTBcdTViOWZcdTg4NGNcdTgwMDU6DQotcm9sZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBcdTMwYmZcdTMwYjlcdTMwYWZcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIFJvbGUgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjODoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMDRjXHU2MmM1XHU1ZjUzXHUzMDU5XHUzMDhiXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU5MDc4XHU2MjllXHU1M2VmXHU4MGZkXHUzMDZhXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4Og0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9XHU2MmM1XHU1ZjUzOg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzA0Y1x1NWI5Zlx1ODg0Y1x1MzA1OVx1MzA4Ylx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2ZVx1NTFmYVx1NTI5Ylx1MzA2N1x1MzA0Mlx1MzA4Ylx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjODoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIFJvbGUgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOQ0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1OGZmZFx1NTJhMFx1NjBjNVx1NTgzMVx1MzA3OFx1MzA2ZVx1MzBlYVx1MzBmM1x1MzBhZlx1MzA5Mlx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1NWY2Mlx1NWYwZlx1MzA2N1x1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJvbGVHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9XHU5MDc4XHU2MjllXHU1M2VmXHU4MGZkXHUzMDZhXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5Og0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjk6DQotcm9sZUd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIFJvbGUgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1cdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmM6DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwNGNcdTVjNWVcdTMwNTlcdTMwOGJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yb2xlQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUzMGVkXHUzMGZjXHUzMGViXHUzMGZiXHUzMGJiXHUzMGMzXHUzMGM4Og0KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9XHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjODoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjOg0KLQ0KLSMgVGFzayBFZGl0b3IgUm9sZXMgUGFnZQ0KLXRhc2tSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9XHUzMGVkXHUzMGZjXHUzMGViDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGJmXHUzMGI5XHUzMGFmXHUzMDkyXHU1YjlmXHU4ODRjXHUzMDU5XHUzMDhiXHUzMGVkXHUzMGZjXHUzMGViXHUzMDkyXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2XHUzMDdlXHUzMDU5XHUzMDAyDQotdGFza1JvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTMwNmFcdTMwZWRcdTMwZmNcdTMwZWI6DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVx1NTdmYVx1NjcyY1x1NWI5Zlx1ODg0Y1x1ODAwNToNCi10YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1OGZmZFx1NTJhMFx1NWI5Zlx1ODg0Y1x1ODAwNToNCi10YXNrUm9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFx1MzBlZFx1MzBmY1x1MzBlYlx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLXRhc2tSb2xlc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9tb2RpZnlfbWVzc2FnZT1JVVBBMDAwNDVXOiBcdTU3ZmFcdTY3MmNcdTViOWZcdTg4NGNcdTgwMDVcdTMwOTIgJyd7MH0nJyBcdTMwNmJcdTU5MDlcdTY2ZjRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotdGFza1JvbGVzUGFnZV9jb25maXJtX3RpdGxlPVx1NTdmYVx1NjcyY1x1MzBlZFx1MzBmY1x1MzBlYlx1MzA2ZVx1NTkwOVx1NjZmNFx1MzA2ZVx1NzhiYVx1OGE4ZA0KLQ0KLSMgVGFzayBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2ZVx1NTE2NVx1NTFmYVx1NTI5Ylx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9XHU1ZmM1XHU5ODA4XHU1MTY1XHU1MjliOg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1NTE2NVx1NTI5YjoNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMz1cdTUxZmFcdTUyOWI6DQotdGFza1dvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDRjXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBUYXNrIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjkNCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdThmZmRcdTUyYTBcdTYwYzVcdTU4MzFcdTMwNzhcdTMwNmVcdTMwZWFcdTMwZjNcdTMwYWZcdTMwOTJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTVmNjJcdTVmMGZcdTMwNjdcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi10YXNrR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOToNCi10YXNrR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9XHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5Og0KLXRhc2tHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDRjXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBUYXNrIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdTMwNGNcdTVjNWVcdTMwNTlcdTMwOGJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlDQotdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1cdTMwYWJcdTMwYjlcdTMwYmZcdTMwZTBcdTMwZmJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmMNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2U6DQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1MzBhYlx1MzBiOVx1MzBiZlx1MzBlMFx1MzBmYlx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmYzoNCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgVGFza3MgUGFnZQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25OYW1lPVx1MzBiZlx1MzBiOVx1MzBhZg0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTMwNmZcdTMwMDFcdTZiMjFcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdTMwNmVcdTUxNjVcdTUyOWJcdTMwN2VcdTMwNWZcdTMwNmZcdTUxZmFcdTUyOWJcdTMwNjdcdTMwNTlcdTMwMDINCi1Xb3JrUHJvZHVjdF9UYXNrc19BdmFpbGFibGVMYWJlbD1cdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTMwNmFcdTMwYmZcdTMwYjlcdTMwYWYNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsPVx1NWZjNVx1OTgwOFx1NTE2NVx1NTI5YjoNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMj1cdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTUxNjVcdTUyOWI6DQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDM9XHU1MWZhXHU1MjliOg0KLVdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFx1MzBiZlx1MzBiOVx1MzBhZlx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBSb2xlcyBQYWdlDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9XHUzMGVkXHUzMGZjXHUzMGViDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NmIyMVx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA5Mlx1NjJjNVx1NWY1M1x1MzA3ZVx1MzA1Zlx1MzA2Zlx1NTkwOVx1NjZmNFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBlZFx1MzBmY1x1MzBlYg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU2MmM1XHU1ZjUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViOg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1NTkwOVx1NjZmNFx1MzBlZFx1MzBmY1x1MzBlYjoNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBcdTMwZWRcdTMwZmNcdTMwZWJcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIyBXb3JrIFByb2R1Y3QgRWRpdG9yIERlbGl2ZXJhYmxlIFBhcnRzIFBhZ2UNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25OYW1lPVx1N2QwZFx1NTE2NVx1NzI2OQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1N2QwZFx1NTE2NVx1NzI2OVx1MzA5Mlx1NjljYlx1NjIxMFx1MzA1OVx1MzA4Ylx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDY4XHUzMDU3XHUzMDY2XHU5MDc4XHU2MjllXHU1M2VmXHU4MGZkXHUzMDZhXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4Og0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTdkMGRcdTUxNjVcdTcyNjlcdTMwNjhcdTMwNTdcdTMwNjZcdTMwNmVcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzg6DQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdThmZmRcdTUyYTBcdTYwYzVcdTU4MzFcdTMwNzhcdTMwNmVcdTMwZWFcdTMwZjNcdTMwYWZcdTMwOTJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTVmNjJcdTVmMGZcdTMwNjdcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1cdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTMwNmFcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjk6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjk6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDRjXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDRjXHU1YzVlXHUzMDU5XHUzMDhiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTMwYzlcdTMwZTFcdTMwYTRcdTMwZjMNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTk4NWU6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDM9XHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjOg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTMwYzlcdTMwZTFcdTMwYTRcdTMwZjM6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTk4NWU6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMz1cdTMwYWJcdTMwYjlcdTMwYmZcdTMwZTBcdTMwZmJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmM6DQotDQotIyBQcmFjdGljZSBFZGl0b3IgUmVmZXJlbmNlcyBQYWdlDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uTmFtZT1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTg5ODFcdTdkMjANCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwZDdcdTMwZTlcdTMwYWZcdTMwYzZcdTMwYTNcdTMwYjlcdTMwNjdcdTUzYzJcdTcxNjdcdTMwNTlcdTMwOGJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTg5ODFcdTdkMjBcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1ODk4MVx1N2QyMDoNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHU4OTgxXHU3ZDIwOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHU4OTgxXHU3ZDIwXHUzMDRjXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBDYXRlZ29yeSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZT1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjkNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZSB7MH0gXHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOToNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjk6DQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgRGlzY2lwbGluZSBHcm91cGluZyBFZGl0b3IgRGlzY2lwbGluZXMgUGFnZQ0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uTmFtZT1cdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2UNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2Ylx1NWM1ZVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTMwNmFcdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2U6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlOg0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBcdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2VcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX1VzZURlZmF1bHREaXJlY3RvcnlCdXR0b25MYWJlbD1cdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmVcdTRmN2ZcdTc1MjgNCi0NCi0jIERpc2NpcGxpbmUgRWRpdG9yIFRhc2tzIFBhZ2UNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25OYW1lPVx1MzBiZlx1MzBiOVx1MzBhZg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzA2Ylx1NWM1ZVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBiZlx1MzBiOVx1MzBhZlx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU5MDc4XHU2MjllXHU1M2VmXHU4MGZkXHUzMDZhXHUzMGJmXHUzMGI5XHUzMGFmOg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTMwYmZcdTMwYjlcdTMwYWY6DQotZGlzY2lwbGluZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBcdTMwYmZcdTMwYjlcdTMwYWZcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIERpc2NpcGxpbmUgRWRpdG9yIFJlZmVyZW5jZSBXb3JrZmxvdyBQYWdlDQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uTmFtZT1cdTUzYzJcdTcxNjdcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZDVcdTMwZWRcdTMwZmMNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2VcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTUzYzJcdTcxNjdcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZDVcdTMwZWRcdTMwZmNcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1NTNjMlx1NzE2N1x1MzBlZlx1MzBmY1x1MzBhZlx1MzBkNVx1MzBlZFx1MzBmYzoNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlbGVjdGVkTGFiZWw9XHU1M2MyXHU3MTY3XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGQ1XHUzMGVkXHUzMGZjOg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gXHU1M2MyXHU3MTY3XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGQ1XHUzMGVkXHUzMGZjXHUzMDRjXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBEb21haW4gRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzXHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTMwNmFcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzg6DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjODoNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgV29yayBQcm9kdWN0IEtpbmQgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU5ODVlXHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTMwNmFcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzg6DQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjODoNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOA0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMGZiXHUzMGJiXHUzMGMzXHUzMGM4XHUzMGZiXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGVkXHUzMGZjXHUzMGViXHUzMGZiXHUzMGJiXHUzMGMzXHUzMGM4XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjODoNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzg6DQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOFx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgUm9sZSBTZXQgRWRpdG9yIFJvbGVzIFBhZ2UNCi1yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVx1MzBlZFx1MzBmY1x1MzBlYg0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOFx1MzA2Ylx1NWM1ZVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBlZFx1MzBmY1x1MzBlYlx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJvbGVTZXRSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU5MDc4XHU2MjllXHU1M2VmXHU4MGZkXHUzMDZhXHUzMGVkXHUzMGZjXHUzMGViOg0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTMwZWRcdTMwZmNcdTMwZWI6DQotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBcdTMwZWRcdTMwZmNcdTMwZWJcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIFRvb2wgRWRpdG9yIFRvb2wgTWVudG9ycyBQYWdlDQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uTmFtZT1cdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmMNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwYzRcdTMwZmNcdTMwZWJcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmNcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi10b29sVG9vbE1lbnRvcnNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBjNFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBlMVx1MzBmM1x1MzBiZlx1MzBmYzoNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw9XHUzMGM0XHUzMGZjXHUzMGViXHUzMGZiXHUzMGUxXHUzMGYzXHUzMGJmXHUzMGZjOg0KLXRvb2xUb29sTWVudG9yc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gXHUzMGM0XHUzMGZjXHUzMGViXHUzMGZiXHUzMGUxXHUzMGYzXHUzMGJmXHUzMGZjXHUzMDRjXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBDdXN0b20gQ2F0ZWdvcnkgRWRpdG9yIEFzc2lnbiBQYWdlDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1ODk4MVx1N2QyMA0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDkyXHU2OWNiXHU2MjEwXHUzMDU5XHUzMDhiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHU4OTgxXHU3ZDIwXHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1ODk4MVx1N2QyMDoNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTg5ODFcdTdkMjA6DQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1ODk4MVx1N2QyMFx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgTmV3IE1ldGhvZCBQbHVnLWluIFdpemFyZA0KLW5ld1BsdWdpbldpemFyZF90aXRsZT1cdTY1YjBcdTg5OGZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjMNCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLW5ld1BsdWdpbldpemFyZFBhZ2VfdGV4dD1cdTY1YjBcdTg5OGZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNjhcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1uZXdQbHVnaW5FcnJvcl9tc2c9SVVQQTAwMjFFOiBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTRmNWNcdTYyMTBcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1uZXdQbHVnaW5FcnJvcl9yZWFzb249XHU1MTg1XHU5MGU4XHUzMGE4XHUzMGU5XHUzMGZjXHUzMDAyXG5cDQotXG5cDQotXHU4YTczXHUzMDU3XHUzMDRmXHUzMDZmXHUzMDBjXHU4YTczXHU3ZDMwXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotDQotIyBHZW5lcmljIGRpYWxvZyB0aXRsZXMNCi1jcmVhdGVEaWFsb2dfdGl0bGU9XHU4OTgxXHU3ZDIwXHUzMDZlXHU0ZjVjXHU2MjEwDQotZGVsZXRlRGlhbG9nX3RpdGxlPVx1ODk4MVx1N2QyMFx1MzA2ZVx1NTI0YVx1OTY2NA0KLWVkaXREaWFsb2dfdGl0bGU9XHU4OTgxXHU3ZDIwXHUzMDZlXHU3ZGU4XHU5NmM2DQotZXJyb3JEaWFsb2dfdGl0bGU9XHUzMGE4XHUzMGU5XHUzMGZjDQotbW92ZURpYWxvZ190aXRsZT1cdTg5ODFcdTdkMjBcdTMwNmVcdTc5ZmJcdTUyZDUNCi1yZW5hbWVEaWFsb2dfdGl0bGU9XHU4OTgxXHU3ZDIwXHUzMDZlXHU1NDBkXHU1MjRkXHU1OTA5XHU2NmY0DQotd2FybmluZ0RpYWxvZ190aXRsZT1cdThiNjZcdTU0NGENCi0NCi0jIEFkZCBDb25maWd1cmF0aW9uIHRvIFByb2Nlc3MgRXJyb3IgRGlhbG9nDQotYWRkQ29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9XHU1MWU2XHU3NDA2XHU1YmZlXHU4YzYxXHUzMDZlXHU2OWNiXHU2MjEwXHUzMDkyXHU4ZmZkXHU1MmEwDQotDQotIyBTZXQgRGVmYXVsdCBDb25maWd1cmF0aW9uIEVycm9yIERpYWxvZw0KLXNldERlZmF1bHRDb25maWdFcnJvckRpYWxvZ190aXRsZT1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTc1MjhcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTY5Y2JcdTYyMTBcdTMwNmVcdThhMmRcdTViOWENCi0NCi0jIEVkaXQgUHJvY2VzcyBFcnJvciBEaWFsb2cNCi1lZGl0UHJvY2Vzc0VsZW1lbnRFcnJvckRpYWxvZ190aXRsZT1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTg5ODFcdTdkMjBcdTMwNmVcdTdkZThcdTk2YzYNCi0NCi0jIE9wZW4gTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGYNCi1vcGVuTGlicmFyeURpYWxvZ190ZXh0PVx1NzNmZVx1ODg0Y1x1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Zlx1OTA2OVx1NTIwN1x1MzA2Ylx1NGZkZFx1NWI1OFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMiBcdTMwYThcdTMwZTlcdTMwZmNcdTMwOTJcdTcxMjFcdTg5OTZcdTMwNTdcdTMwNjZcdTUyMjVcdTMwNmVcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGRcdTMwN2VcdTMwNTlcdTMwNGI/DQotDQotIyBTYXZlIExpYnJhcnkgRGlhbG9nDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHU0ZmRkXHU3YmExDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dD1cdTczZmVcdTg4NGNcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmZcdTU5MDlcdTY2ZjRcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIgXHU1OTA5XHU2NmY0XHU1MTg1XHU1YmI5XHUzMDkyXHU0ZmRkXHU3YmExXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPw0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBhMlx1MzBjM1x1MzBkN1x1MzBiMFx1MzBlY1x1MzBmY1x1MzBjOQ0KLQ0KLSMgRGVsZXRlIEVsZW1lbnQgUmVmZXJlbmNlIERpYWxvZw0KLWRlbGV0ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ9XHU4OTgxXHU3ZDIwICcnezB9JycgXHUzMDZmXHUzMDU5XHUzMDY3XHUzMDZiXHU1MjRhXHU5NjY0XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzA1M1x1MzA2ZVx1ODk4MVx1N2QyMFx1MzA5MiAnJ3sxfScnIFx1MzA0Ylx1MzA4OVx1OTY2NFx1NTNiYlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbm9PcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwMEU6IFx1OTU4Ylx1MzA0NFx1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXA0KLVxuXA0KLVx1NjViMFx1ODk4Zlx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1MzA5Mlx1OGZmZFx1NTJhMFx1MzA1OVx1MzA4Ylx1MzA2Ylx1MzA2Zlx1MzAwMVx1MzA1ZFx1MzA2ZVx1NTI0ZFx1MzA2Ylx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0Zlx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMlxuXA0KLVxuXA0KLVx1NjViMFx1ODk4Zlx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA1OVx1MzA4Ylx1MzA0Ylx1MzAwMVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0NFx1MzA2Nlx1MzA0Ylx1MzA4OVx1MzAwMVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDFFOiB7MH0gXHUzMDZlXHU1NDBkXHU1MjRkXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cDQotXG5cDQotXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDRhXHUzMDg4XHUzMDczXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU4OTgxXHU3ZDIwXHUzMDZiXHUzMDZmXHU1NDBkXHU1MjRkXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyXG5cDQotXG5cDQotXHUzMDBjT0tcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwMDFcdTg5ODFcdTdkMjBcdTMwNmJcdTY3MDlcdTUyYjlcdTMwNmFcdTU0MGRcdTUyNGRcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBBMDAwMkU6IFx1NTQwZFx1NTI0ZCAnJ3swfScnIFx1MzA2Zlx1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMlxuXA0KLVxuXA0KLVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1MzA2ZVx1NTQwZFx1NTI0ZFx1MzA2Zlx1NTZmYVx1NjcwOVx1MzA2N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA2YVx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXA0KLVxuXA0KLVx1MzAwY09LXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDAxXHU4OTgxXHU3ZDIwXHUzMDZiXHU1MjI1XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotY3JlYXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDAzRTogXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotZGVsZXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDA0VzogXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHUzMDkyXHU1MjRhXHU5NjY0XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotaW50ZXJuYWxFcnJvcl9tc2c9SVVQQTAwMDVFOiBcdTUxODVcdTkwZThcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDJcblwNCi1cblwNCi1cdThhNzNcdTMwNTdcdTMwNGZcdTMwNmZcdTMwMGNcdThhNzNcdTdkMzBcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1pbnZhbGlkUHJlc2VudGF0aW9uTmFtZUVycm9yX21zZz1JVVBBMDAwNkU6IFx1NzEyMVx1NTJiOVx1MzA2YVx1ODg2OFx1NzkzYVx1NTQwZFx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMlxuXA0KLVxuXA0KLVx1MzAwY09LXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHU1MjI1XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotaW52YWxpZENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwN0U6IFx1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMCAnJ3swfScnIFx1MzA2Zlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2ZVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1NjljYlx1NjIxMFx1MzA2ZVx1MzBiNVx1MzBkNlx1MzBiYlx1MzBjM1x1MzBjOFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXA0KLVxuXA0KLVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2ZVx1NjU3NFx1NTQwOFx1NjAyN1x1MzA5Mlx1N2RhZFx1NjMwMVx1MzA1OVx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzAwMVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2ZVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1NjljYlx1NjIxMFx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2Ylx1OTVhMlx1OTAyM1x1MzA1OVx1MzA4Ylx1MzA1ZFx1MzA2ZVx1NGVkNlx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1NjljYlx1NjIxMFx1MzA2ZVx1MzBiOVx1MzBmY1x1MzBkMVx1MzBmY1x1MzBiYlx1MzBjM1x1MzBjOFx1MzA2N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA2YVx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXA0KLVxuXA0KLVx1NTIyNVx1MzA2ZVx1NjljYlx1NjIxMFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1OVx1MzA4Ylx1MzA0Ylx1MzAwMVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1NjljYlx1NjIxMFx1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA5Mlx1NTQyYlx1MzA4MFx1MzA4OFx1MzA0Nlx1MzA2Ylx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1NjljYlx1NjIxMFx1MzA5Mlx1NTkwOVx1NjZmNFx1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1MzAwMVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXNldERlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDhFOiBcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNGNcdTUzYzJcdTcxNjdcdTMwNTlcdTMwOGJcdTMwNWRcdTMwNmVcdTRlZDZcdTMwNmVcdTY5Y2JcdTYyMTBcdTMwNmVcdTMwYjlcdTMwZmNcdTMwZDFcdTMwZmNcdTMwYmJcdTMwYzNcdTMwYzhcdTMwNjdcdTMwNmZcdTMwNmFcdTMwNDRcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTAgJyd7MH0nJyBcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDJcblwNCi1cblwNCi1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmVcdTY1NzRcdTU0MDhcdTYwMjdcdTMwOTJcdTdkYWRcdTYzMDFcdTMwNTlcdTMwOGJcdTMwNWZcdTMwODFcdTMwMDFcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTY5Y2JcdTYyMTBcdTMwNmZcdTMwMDFcdTMwNTNcdTMwNmVcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmJcdTk1YTJcdTkwMjNcdTMwNTlcdTMwOGJcdTMwNWRcdTMwNmVcdTRlZDZcdTMwNTlcdTMwNzlcdTMwNjZcdTMwNmVcdTY5Y2JcdTYyMTBcdTMwNmVcdTMwYjlcdTMwZmNcdTMwZDFcdTMwZmNcdTMwYmJcdTMwYzNcdTMwYzhcdTMwNjdcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNmFcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcblwNCi1cblwNCi1cdTUyMjVcdTMwNmVcdTY5Y2JcdTYyMTBcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTlcdTMwOGJcdTMwNGJcdTMwMDFcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTY5Y2JcdTYyMTBcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwOTJcdTU5MDlcdTY2ZjRcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTMwMDFcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1vcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwOUU6IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXA0KLVxuXA0KLVx1OGE3M1x1MzA1N1x1MzA0Zlx1MzA2Zlx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXNhdmVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEwRTogXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHU0ZmRkXHU3YmExXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotc2F2ZUxpYnJhcnlUb0Vycm9yX21zZz1JVVBBMDAxMEU6IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5MiAnJ3swfScnIFx1MzA2Ylx1NGZkZFx1N2JhMVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLWVsZW1lbnRBbHJlYWR5RGVsZXRlZEVycm9yX21zZz1JVVBBMDAxMUU6IFx1ODk4MVx1N2QyMCAnJ3swfScnIFx1MzA2Zlx1MzA1OVx1MzA2N1x1MzA2Ylx1NTI0YVx1OTY2NFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEyRTogXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGIwXHUzMGVjXHUzMGZjXHUzMGM5XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotDQotIyBFcnJvciBSZWFzb25zDQotZXJyb3JfcmVhc29uPUlVUEEwMDE2RTogXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyXG5cDQotXG5cDQotXHU4YTczXHUzMDU3XHUzMDRmXHUzMDZmXHUzMDBjXHU4YTczXHU3ZDMwXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotaW50ZXJuYWxFcnJvcl9yZWFzb249SVVQQTAwMTdFOiBcdTUxODVcdTkwZThcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDJcblwNCi1cblwNCi1cdThhNzNcdTMwNTdcdTMwNGZcdTMwNmZcdTMwMGNcdThhNzNcdTdkMzBcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi11cGdyYWRlTGlicmFyeUVycm9yX3JlYXNvbj1JVVBBMDAxOEU6IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1ODk4MVx1N2QyMFx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjOVx1NGUyZFx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMlxuXA0KLVxuXA0KLVx1OGE3M1x1MzA1N1x1MzA0Zlx1MzA2Zlx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXNhdmVVcGdyYWRlZExpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMTlFOiBcdTMwYTJcdTMwYzNcdTMwZDdcdTMwYjBcdTMwZWNcdTMwZmNcdTMwYzlcdTMwNTdcdTMwNWZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTRmZGRcdTdiYTFcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDJcblwNCi1cblwNCi1cdThhNzNcdTMwNTdcdTMwNGZcdTMwNmZcdTMwMGNcdThhNzNcdTdkMzBcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHU5NThiXHUzMDQ0XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotc2F2aW5nTGlicmFyeVRhc2tfbmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1MzBhMlx1MzBjM1x1MzBkN1x1MzBiMFx1MzBlY1x1MzBmY1x1MzBjOVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWxvYWRpbmdMaWJyYXJ5RWxlbWVudHNUYXNrX25hbWU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU4OTgxXHU3ZDIwXHUzMDkyXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTg5ODFcdTdkMjBcdTMwOTJcdTY1YjBcdTg5OGZcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwZmJcdTMwZDVcdTMwYTlcdTMwZmNcdTMwZGVcdTMwYzNcdTMwYzhcdTMwNjdcdTRmZGRcdTdiYTFcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1zYXZpbmdUYXNrX25hbWU9Jyd7MH0nJyBcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1zYXZpbmdGaWxlc1Rhc2tfbmFtZT1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1maXhpbmdDb250ZW50RGVzY3JpcHRpb25HVUlEc1Rhc2tfbmFtZT1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdThhYWNcdTY2MGUgR1VJRCBcdTMwOTJcdTRmZWVcdTZiNjNcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1kZWxldGluZ0ludmFsaWRSZWZlcmVuY2VzVGFza19uYW1lPVx1NzEyMVx1NTJiOVx1MzA2YVx1NTNjMlx1NzE2N1x1MzA5Mlx1NTI0YVx1OTY2NFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IFx1MzA1M1x1MzA2ZVx1MzBkMVx1MzBmY1x1MzBiOVx1MzBkYVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkNlx1MzA2Zlx1MzAwMVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1ODk4MVx1N2QyMFx1MzA2ZSBIVE1MIFx1ODg2OFx1NzNmZVx1MzA5Mlx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiYVx1MzA1OVx1MzA4Ylx1MzBlNlx1MzBmY1x1MzBiNlx1MzBmY1x1MzBmYlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkYVx1MzBlYVx1MzBhOFx1MzBmM1x1MzBiOVx1MzA5Mlx1NjcwMFx1NTkyN1x1NTMxNlx1MzA1OVx1MzA4Ylx1MzA4OFx1MzA0Nlx1NzI3OVx1NTIyNVx1MzA2Ylx1OGEyZFx1OGEwOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwNTNcdTMwNTNcdTMwNmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwOTJcdThmZmRcdTUyYTBcdTMwNTdcdTMwNWZcdTMwOGFcdTMwMDFcdTg4NjhcdTc5M2FcdTMwNTdcdTMwNWZcdTMwOGFcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi0NCi0jIENoYW5nZSBIaXN0b3J5IERpYWxvZw0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfdGl0bGU9XHU1OTA5XHU2NmY0XHU4YWFjXHU2NjBlXHUzMDZlXHU1YzY1XHU2Yjc0DQotQ2hhbmdlSGlzdG9yeURpYWxvZ19sYWJlbD1cdTU5MDlcdTY2ZjRcdTVjNjVcdTZiNzQ6DQotDQotIyBNZXRob2QgRWxlbWVudCBEZWxldGUgQWN0aW9uDQotY29uZmlybURlbGV0ZURpYWxvZ190aXRsZT1cdTUyNGFcdTk2NjRcdTMwNmVcdTc4YmFcdThhOGQNCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZz0nJ3swfScnIFx1MzA5Mlx1NTI0YVx1OTY2NFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZ1dpdGhSZWZlcmVuY2U9Jyd7MH0nJyBcdTMwOTJcdTUyNGFcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/XG5cDQotXG5cDQotXHU2YjIxXHUzMDZlXHU4OTgxXHU3ZDIwXHUzMDZiXHUzMDZmXHUzMDAxXHU1MjRhXHU5NjY0XHU1YmZlXHU4YzYxXHU5ODA1XHU3NmVlXHUzMDc4XHUzMDZlXHU1M2MyXHU3MTY3XHUzMDRjXHU1NDJiXHUzMDdlXHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5OiB7MX0NCi0NCi0jIE5ldyBMaWJyYXJ5IERpYWxvZw0KLWVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjJFOiBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmMgJyd7MH0nJyBcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1lcnJvckRpYWxvZ19lcnJvcj1cdTUyMjVcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTUxODVcdTMwNmJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1lcnJfbm9vcGVubGlicmFyeT1JVVBBMDA0MEU6IFx1OTU4Ylx1MzA0NFx1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXA0KLVxuXA0KLVx1NjViMFx1ODk4Zlx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1OGZmZFx1NTJhMFx1MzA1OVx1MzA4Ylx1MzA2Ylx1MzA2Zlx1MzAwMVx1MzA1ZFx1MzA2ZVx1NTI0ZFx1MzA2Ylx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0Zlx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMlxuXA0KLVxuXA0KLVx1NjViMFx1ODk4Zlx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA1OVx1MzA4Ylx1MzA0Ylx1MzAwMVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0NFx1MzA2Nlx1MzA0Ylx1MzA4OVx1MzAwMVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWVycl9sb2FkaW5nbGlicmFyeT1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwYzlcdTMwZmJcdTMwYThcdTMwZTlcdTMwZmMNCi1tc2dfcmVsb2FkTGlicmFyeT1cdTU5MzFcdTY1NTdcdTMwNTdcdTMwNWZcdTUyNGFcdTk2NjRcdTMwNmVcdTUzZDZcdTMwOGFcdTZkODhcdTMwNTdcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHU3M2ZlXHU4ODRjXHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU5XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBSZWxvYWQgTGlicmFyeSBEaWFsb2cNCi1yZWxvYWREaWFsb2dfbWVzc2FnZT1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTUxNDNcdTMwNmVcdTcyYjZcdTYxNGJcdTMwNmJcdTVmYTlcdTUxNDNcdTMwNTlcdTMwOGJcdTMwNmJcdTMwNmZcdTMwMDFcdTUxOGRcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNTlcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi1yZWxvYWREaWFsb2dfdGl0bGU9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5DQotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yVGl0bGU9XHU3OWZiXHU1MmQ1XHUzMGE4XHUzMGU5XHUzMGZjDQotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yTWVzc2FnZT1cdTc5ZmJcdTUyZDVcdTRlMmRcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmMNCi0NCi0jIFByb2Nlc3MgRm9ybSBFZGl0b3INCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU9XHU0ZmRkXHU3YmExDQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxPVx1MzA1M1x1MzA2ZVx1NTkwOVx1NjZmNFx1MzA2Zlx1MzAwMVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1NTE4NVx1MzA2ZVx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1MzBjMFx1MzBhNFx1MzBhMlx1MzBiMFx1MzBlOVx1MzBlMFx1MzA2Ylx1NWY3MVx1OTdmZlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTU5MDlcdTY2ZjRcdTVmOGNcdTMwMDFcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwNGNcdTRmZGRcdTdiYTFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIgXHU3ZDlhXHU4ODRjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPw0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMj1cdTU5MDlcdTY2ZjRcdTVmOGNcdTMwMDFcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwNGNcdTRmZGRcdTdiYTFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIgXHU3ZDlhXHU4ODRjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPw0KLQ0KLSMgQ29uZmlndXJhdGlvbiBWaWV3IFBhZ2UNCi1jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfdGl0bGU9XHU5NjY0XHU1M2JiXHUzMDZlXHU3OGJhXHU4YThkDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX21lc3NhZ2U9XHUzMGQzXHUzMGU1XHUzMGZjICcnezB9JycgXHUzMDkyXHU5NjY0XHU1M2JiXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPw0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ190aXRsZT1cdThiNjZcdTU0NGENCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uPVx1NjljYlx1NjIxMDoNCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3M9XHU2OWNiXHU2MjEwXHUzMGQzXHUzMGU1XHUzMGZjDQotY29uZmlnVmlld1BhZ2Vfdmlld3M9XHUzMGQzXHUzMGU1XHUzMGZjDQotY29sdW1uc2VsZWN0aW9uX3RleHQ9XHU1MjE3XHUzMDZlXHU5MDc4XHU2MjllOg0KLWNvbmZpZ1ZpZXdQYWdlX2FkZFZpZXdCdXR0b25UZXh0PVx1MzBkM1x1MzBlNVx1MzBmY1x1MzA2ZVx1OGZmZFx1NTJhMC4uLg0KLWNvbmZpZ1ZpZXdQYWdlX3JlbW92ZVZpZXdCdXR0b25UZXh0PVx1MzBkM1x1MzBlNVx1MzBmY1x1MzA2ZVx1OTY2NFx1NTNiYg0KLWNvbmZpZ1ZpZXdQYWdlX21ha2VEZWZhdWx0QnV0dG9uVGV4dD1cdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmJcdThhMmRcdTViOWENCi1jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfbWVzc2FnZT1JVVBBMDAyM1c6IFx1NTQwZFx1NTI0ZCAnJ3swfScnIFx1MzA2ZVx1MzBkM1x1MzBlNVx1MzBmY1x1MzA2Zlx1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvblRpdGxlPVx1NTE2Y1x1OTU4Ylx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBmYlx1MzBkM1x1MzBlNVx1MzBmYw0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvbk1lc3NhZ2U9XHUzMDUzXHUzMDZlXHU2OWNiXHU2MjEwXHUzMDZlXHU1MTZjXHU5NThiXHU2NjQyXHUzMDZiXHU3ZDQ0XHUzMDdmXHU4ZmJjXHUzMDdlXHUzMDhjXHUzMDhiXHUzMGQzXHUzMGU1XHUzMGZjXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzBkM1x1MzBlNVx1MzBmY1x1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA1OVx1MzA4Ylx1MzA2Ylx1MzA2Zlx1MzAwMVx1MzAwY1x1MzBkM1x1MzBlNVx1MzBmY1x1MzA2ZVx1OGZmZFx1NTJhMFx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzAwMVx1NjljYlx1NjIxMFx1NTE4NVx1MzA2ZVx1NmExOVx1NmU5Nlx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1MzA3ZVx1MzA1Zlx1MzA2Zlx1MzBhYlx1MzBiOVx1MzBiZlx1MzBlMFx1MzBmYlx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiAgXHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDZmXHUzMDAxXHUzMGQzXHUzMGU1XHUzMGZjXHUzMDg0XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDZlXHUzMGI1XHUzMGQ2XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDkyXHU4ODY4XHUzMDU3XHUzMDAxXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHU4OTgxXHU3ZDIwXHUzMDZmXHUzMGQzXHUzMGU1XHUzMGZjXHUzMDZlXHUzMGM0XHUzMGVhXHUzMGZjXHU4OTgxXHU3ZDIwXHUzMDkyXHU4ODY4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBEZXNjcmlwdGlvbiBUYWINCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZT1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwNmVcdTU5MDlcdTYzZGINCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMT1JVVBBMDA0MFc6IFx1NjcwMFx1NTIxZFx1MzA2Ylx1MzAwMVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1NGZkZFx1N2JhMVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UyPVx1MzA1M1x1MzA2ZVx1MzBiZlx1MzBhNFx1MzBkN1x1MzA2Ylx1NGU5Mlx1NjNkYlx1NjAyN1x1MzA2ZVx1MzA0Mlx1MzA4Ylx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLQ0KLWNoYW5nZUFjdGl2aXR5VHlwZVdhcm5pbmdEaWFsb2dfdGl0bGU9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHUzMDZlXHU1OTA5XHU2M2RiDQotIyBBc3NvY2lhdGlvbiBGb3JtIFBhZ2UNCi1Bc3NvY2lhdGlvbkZvcm1QYWdlX0JyaWVmRGVzY3JpcHRpb25MYWJlbD1cdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTg5ODFcdTdkMjBcdTMwNmVcdTg5ODFcdTY1ZTg6DQotDQotIyBNZXRob2QgRWxlbWVudCBEZXNjcmlwdGlvbg0KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ190aXRsZT1cdTg5ODFcdTdkMjBcdTU0MGRcdTMwNmVcdTUxNjVcdTUyOWINCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfbWVzc2FnZT1cdTU0MGRcdTUyNGRcdTMwZDVcdTMwYTNcdTMwZmNcdTMwZWJcdTMwYzlcdTMwOTJcdTdhN2FcdTMwNmJcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi0NCi0jIE1ldGhvZCBQbHVnLWluIERlc2NyaXB0aW9uDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25SZW1vdmVSZWZDb25maXJtX21lc3NhZ2U9XHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzICcnezB9JycgXHUzMDZiXHU5NWEyXHU5MDIzXHUzMDU5XHUzMDhiXHU1M2MyXHU3MTY3XHU1MTQ4XHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDkyXHU5MDc4XHU2MjllXHU4OWUzXHU5NjY0XHUzMDU5XHUzMDhiXHUzMDY4XHUzMDAxXHU1MjRhXHU5NjY0XHU1YmZlXHU4YzYxXHUzMDY4XHUzMDZhXHUzMDhiXHU3MTIxXHU1MmI5XHUzMDZhXHU5NWEyXHU0ZmMyXHUzMDRjXHU0ZjVjXHU2MjEwXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyXG5cDQotXG5cDQotXHUzMDUzXHUzMDZlXHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHU1M2Q2XHUzMDhhXHU2ZDg4XHUzMDViXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyIFx1MzA1M1x1MzA2ZVx1NTkwOVx1NjZmNFx1MzA5Mlx1N2Q5YVx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZT1cdTMwNTNcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTU0MGRcdTUyNGRcdTMwOTIgJyd7MH0nJyBcdTMwNGJcdTMwODlcdTY1YjBcdTg5OGZcdTU0MGQgJyd7MX0nJyBcdTMwNmJcdTU5MDlcdTY2ZjRcdTMwNTdcdTMwODhcdTMwNDZcdTMwNjhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMDUzXHUzMDZlXHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZiXHUzMDg4XHUzMDhhXHUzMDAxXHUzMDUzXHUzMDZlXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjXHUzMDRjXHU0ZmRkXHU3YmExXHUzMDU1XHUzMDhjXHUzMDAxXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMGZiXHUzMGQ1XHUzMGE5XHUzMGViXHUzMGMwXHUzMGZjXHUzMDRjXHU2NWIwXHU4OThmXHU1NDBkXHUzMDZiXHU1OTA5XHU2NmY0XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyIFx1N2Q5YVx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTU0MGRcdTUyNGRcdTU5MDlcdTY2ZjQNCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY2Fubm90UmVuYW1lUGx1Z2luRm9sZGVyPVx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzBmYlx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1MzA5Mlx1NjViMFx1ODk4Zlx1NTQwZFx1MzA2Ylx1NTkwOVx1NjZmNFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luTGFiZWw9XHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDZlXHUzMGVkXHUzMGMzXHUzMGFmDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5fbWVzc2FnZT1cdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTU5MDlcdTY2ZjRcdTMwOTJcdTMwZWRcdTMwYzNcdTMwYWZcdTMwNTlcdTMwOGJcdTMwNjhcdTMwMDFcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjMgJyd7MH0nJyBcdTMwNmJcdTVjNWVcdTMwNTlcdTMwOGJcdTg5ODFcdTdkMjBcdTMwOTJcdTk1OGJcdTMwNDRcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNTdcdTMwNjZcdTk1ODlcdTMwNThcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMDUzXHUzMDZlXHU1OTA5XHU2NmY0XHUzMDkyXHU3ZDlhXHU4ODRjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPw0KLQ0KLSMgUHJvY2VzcyBEZXNjcmlwdGlvbg0KLXByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX3RpdGxlPVx1NTQwZFx1NTI0ZFx1NTkwOVx1NjZmNA0KLXByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX21lc3NhZ2U9XHUzMDUzXHUzMDZlXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDkyXHU1OTA5XHU2NmY0XHUzMDU3XHUzMDg4XHUzMDQ2XHUzMDY4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzA1M1x1MzA2ZVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA0Y1x1NGZkZFx1N2JhMVx1MzA1NVx1MzA4Y1x1MzAwMVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzBmYlx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1MzA0Y1x1NjViMFx1ODk4Zlx1NTQwZFx1MzA2Ylx1NTkwOVx1NjZmNFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTdkOWFcdTg4NGNcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbj1cdThhYWNcdTY2MGU6DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uVGl0bGU9XHU2OWNiXHU2MjEwDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uTWVzc2FnZT1cdTMwNTNcdTMwNmVcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmJcdTY3MDlcdTUyYjlcdTMwNjdcdTMwNDJcdTMwOGJcdTMwNTlcdTMwNzlcdTMwNjZcdTMwNmVcdTY5Y2JcdTYyMTBcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIgXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMDZlXHU2OWNiXHU2MjEwXHUzMDkyIDEgXHUzMDY0XHU5MDc4XHU2MjllXHUzMDU3XHUzMDAxXHUzMDVkXHUzMDhjXHU0ZWU1XHU1OTE2XHUzMDZlXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHU2OWNiXHU2MjEwXHUzMDZlXHUzMGI5XHUzMGZjXHUzMGQxXHUzMGZjXHUzMGJiXHUzMGMzXHUzMGM4XHUzMDZiXHUzMDZhXHUzMDhiXHUzMDg4XHUzMDQ2XHUzMDZiXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25zPVx1NjljYlx1NjIxMDoNCi1wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdD0oXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4KQ0KLVByb2Nlc3NEZXNjcmlwdGlvbl9zZWxlY3RDb25maWd1cmF0aW9uPVx1OGZmZFx1NTJhMFx1MzA1OVx1MzA4Ylx1NjljYlx1NjIxMFx1MzA2ZVx1OTA3OFx1NjI5ZQ0KLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQwPVx1NzNmZVx1NTcyOFx1MzA2ZVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA0Y1x1NGZkZFx1N2JhMVx1MzA1NVx1MzA4Y1x1MzAwMVx1NTkwOVx1NjZmNFx1NTE4NVx1NWJiOVx1MzA0Y1x1NmMzOFx1N2Q5YVx1NTMxNlx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OVx1MzAwMiAnJ3swfScnIFx1MzA5Mlx1NTI0YVx1OTY2NFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX3NlbGVjdERlc2NyaXB0b3JzVG9EZWxldGU9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHU4OTgxXHU3ZDIwXHUzMDkyXHU1MjRhXHU5NjY0XHUzMDU3XHUzMDVmXHU1ZjhjXHUzMDZmXHUzMDAxXHU0ZWU1XHU0ZTBiXHUzMDZlXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDZmXHU0ZjdmXHU3NTI4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cDQotXHU1MjRhXHU5NjY0XHUzMDU5XHUzMDhiXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotDQotIyBWaWV3IEhlbHBlcg0KLXZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ190aXRsZT1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwZDhcdTMwZWJcdTMwYjlcdTMwZmJcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWYNCi12aWV3SGVscGVyX3BlcmZvcm1IZWFsdGhDaGVjaz1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwZDhcdTMwZWJcdTMwYjlcdTMwZmJcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwOTJcdTViOWZcdTg4NGNcdTRlMmRcdTMwNjdcdTMwNTkuLi4NCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZT1cdTMwYWFcdTMwZmNcdTMwZDdcdTMwZjNcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwZDhcdTMwZWJcdTMwYjlcdTMwZmJcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwNmZcdTZiNjNcdTVlMzhcdTMwNmJcdTViOGNcdTRlODZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHUzMGVkXHUzMGIwXHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHUzMGVjXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDkyXHU1M2MyXHU3MTY3XHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotDQotIyBBdHRhY2ggVGVtcGxhdGUgRmlsZSBEaWFsb2cNCi1hdHRhY2hUZW1wbGF0ZUZpbGVEaWFsb2dfdGl0bGU9XHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHU2ZGZiXHU0ZWQ4DQotDQotIyBDcmVhdGUgRWxlbWVudCBFcnJvciBEaWFsb2cNCi1jcmVhdGVFbGVtZW50RGlhbG9nX3RpdGxlPXswfSBcdTMwNmVcdTY1YjBcdTg5OGZcdTRmNWNcdTYyMTANCi1jcmVhdGVOZXdFbGVtZW50RXJyb3JfbXNnPXswfSBcdTMwNmVcdTY1YjBcdTg5OGZcdTRmNWNcdTYyMTBcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi0NCi1kbGdUaXRsZV9yZWxvYWRMaWJyYXJ5PVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1NTE4ZFx1MzBlZFx1MzBmY1x1MzBjOQ0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9yZWFzb249XHU1NDBkXHU1MjRkIHswfSBcdTMwOTJcdTdhN2FcdTMwNmJcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcblwNCi1cblwNCi1cdTY3MDlcdTUyYjlcdTMwNmFcdTU0MGRcdTUyNGRcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1kZWxldGVDb25maWdFcnJvcl9yZWFzb249XHU2OWNiXHU2MjEwXHUzMDZmXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5ICcnezB9JycgXHUzMDZiXHUzMDg4XHUzMDYzXHUzMDY2XHU1M2MyXHU3MTY3XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBDaGFuZ2VCb3VuZHNDb21tYW5kDQotZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw9XHU1ODgzXHU3NTRjXHUzMDZlXHU1OTA5XHU2NmY0DQotIyBDaGFuZ2VOYW1lQ29tbWFuZA0KLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF9sYWJlbD1cdTU0MGRcdTUyNGRcdTMwNmVcdTU5MDlcdTY2ZjQNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U9XHU1NDBkXHU1MjRkXHUzMDZlXHU1OTA5XHU2NmY0XHUzMDZmXHU1M2Q2XHUzMDhhXHU2ZDg4XHUzMDViXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cDQotXG5cDQotXHU1MjRkXHUzMDZlXHU1NDBkXHU1MjRkXHUzMDRjXHUzMGNjXHUzMGViXHUzMDY3XHUzMDQyXHUzMDhiXHU1ODM0XHU1NDA4XHUzMDAxXHU1NDBkXHU1MjRkXHUzMDZlXHU1OTA5XHU2NmY0XHUzMDZmXHU1M2Q2XHUzMDhhXHU2ZDg4XHUzMDViXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotIyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZA0KLWdlZl9jaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZF9sYWJlbD1cdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmNcdTUwMjRcdTMwNmVcdTU5MDlcdTY2ZjQNCi0jIENyZWF0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfY3JlYXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1cdTMwZDlcdTMwZjNcdTMwYzlcdTMwZmJcdTMwZGRcdTMwYTRcdTMwZjNcdTMwYzhcdTMwNmVcdTRmNWNcdTYyMTANCi0jIENyZWF0ZUxpbmtDb21tYW5kDQotZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsPVx1MzBlYVx1MzBmM1x1MzBhZlx1MzA2ZVx1NGY1Y1x1NjIxMA0KLSMgQ3JlYXRlTm9kZUNvbW1hbmQNCi1nZWZfY3JlYXRlTm9kZUNvbW1hbmRfbGFiZWw9XHUzMGNlXHUzMGZjXHUzMGM5XHUzMDZlXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwDQotIyBEZWxldGVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9XHUzMGQ5XHUzMGYzXHUzMGM5XHUzMGZiXHUzMGRkXHUzMGE0XHUzMGYzXHUzMGM4XHUzMDZlXHU1MjRhXHU5NjY0DQotIyBEZWxldGVDb21tYW5kDQotZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw9XHU1MjRhXHU5NjY0DQotIyBEZWxldGVMaW5rQ29tbWFuZA0KLWdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbD1cdTYzYTVcdTdkOWFcdTMwNmVcdTUyNGFcdTk2NjQNCi0jIE1vdmVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX21vdmVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPVx1MzBkOVx1MzBmM1x1MzBjOVx1MzBmYlx1MzBkZFx1MzBhNFx1MzBmM1x1MzBjOFx1MzA2ZVx1NzlmYlx1NTJkNQ0KLSMgUmVjb25uZWN0TGlua0NvbW1hbmQNCi1nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw9XHUzMGVhXHUzMGYzXHUzMGFmXHUzMDZlXHU1MThkXHU2M2E1XHU3ZDlhDQotDQotIyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXINCi1nZWZfdmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1cdTU0MGRcdTUyNGRcdTMwOTJcdTdhN2FcdTMwNmJcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgXHU2NzA5XHU1MmI5XHUzMDZhXHU1NDBkXHU1MjRkXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotIyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9XHU1NDBkXHU1MjRkXHUzMDkyXHU3YTdhXHUzMDZiXHUzMDU5XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyIFx1NjcwOVx1NTJiOVx1MzA2YVx1NTQwZFx1NTI0ZFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLSMgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQNCi1nZWZfd29ya1Byb2R1Y3ROb2RlRWRpdFBhcnRfdmFsaWRhdGVNZXNzYWdlPVx1NTQwZFx1NTI0ZFx1MzA5Mlx1N2E3YVx1MzA2Ylx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMiBcdTY3MDlcdTUyYjlcdTMwNmFcdTU0MGRcdTUyNGRcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi0NCi0jIEVsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbg0KLWFjdGlvbnNfRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uX21lc3NhZ2U9XHU2OWNiXHU2MjEwICcnezB9JycgXHUzMDZmXHUzMDAxXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5ICcnezF9JycgXHUzMDRjXHUzMDdlXHUzMDYwXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDAxXHU1MjRhXHU5NjY0XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotDQotIyBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3INCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclRpdGxlPVx1NTI0YVx1OTY2NFx1MzBhOFx1MzBlOVx1MzBmYw0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yTWVzc2FnZT1cdTY3MmFcdTUxZTZcdTc0MDZcdTMwNmVcdTRmOGJcdTU5MTYNCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclJlYXNvbj1cdThhNzNcdTdkMzBcdTMwOTJcdTUzYzJcdTcxNjcNCi0NCi0jIE1ldGhvZEVsZW1lbnRFZGl0b3INCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yVGl0bGU9XHU0ZmRkXHU3YmExXHUzMGE4XHUzMGU5XHUzMGZjDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UxPUlVUEEwMDIwRTogXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU0ZmRkXHU3YmExXHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UyPVx1MzBiM1x1MzBkZlx1MzBjM1x1MzBjOFx1MzBmYlx1MzBhOFx1MzBlOVx1MzBmYw0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xPVx1OGE3M1x1MzA1N1x1MzA0Zlx1MzA2Zlx1MzBlZFx1MzBiMFx1MzBmYlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NTNjMlx1NzE2Nw0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24yPVx1OGE3M1x1N2QzMFx1MzA5Mlx1NTNjMlx1NzE2Nw0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvclRpdGxlPVx1NTQwZFx1NTI0ZFx1NTkwOVx1NjZmNFx1MzBhOFx1MzBlOVx1MzBmYw0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yTXNnPVx1MzA1M1x1MzA2ZVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA2ZSAxIFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1OTY2NFx1NTNiYlx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwNmZcdTY3MDlcdTUyYjlcdTMwNjdcdTMwNmZcdTMwNmFcdTMwNGZcdTMwNmFcdTMwOGFcdTMwMDFcdTk1ODlcdTMwNThcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvclRpdGxlPVx1NzEyMVx1NTJiOVx1MzA2YVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmYw0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvck1lc3NhZ2UxPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiAnJ3swfScnIFx1MzA2ZVx1NTQwZFx1NTI0ZFx1NTkwOVx1NjZmNFx1NGUyZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmYw0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLXJlbmFtZUVycm9yX3RpdGxlPVx1ODk4MVx1N2QyMFx1MzA2ZVx1NTQwZFx1NTI0ZFx1NTkwOVx1NjZmNA0KLXJlbmFtZUVycm9yX21zZz1JVVBBMDAxM0U6IFx1NTQwZFx1NTI0ZFx1NTkwOVx1NjZmNFx1NjRjZFx1NGY1Y1x1MzA5Mlx1NWI4Y1x1NGU4Nlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLVNlbGVjdEVsZW1lbnREaWFsb2dfc2VsZWN0ZWxlbWVudF90ZXh0PVx1ODk4MVx1N2QyMFx1MzA2ZVx1OTA3OFx1NjI5ZQ0KLQ0KLSMgRWRpdG9yQ2hvb3Nlcg0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ190aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGYNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Rlc2NyaXB0aW9uTGFiZWw9XHU4YWFjXHU2NjBlOg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbD1cdTMwNTlcdTMwNzlcdTMwNjZcdTkwNzhcdTYyOWUNCi1PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDA9XHU4OTgxXHU3ZDIwXHUzMDZlXHU3ZGU4XHU5NmM2DQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNFOiBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTg5ODFcdTdkMjBcdTMwNmJcdTk1YTJcdTkwMjNcdTMwNTlcdTMwOGJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZT1cdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwZmJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmVcdTkwNzhcdTYyOWUNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5TmFtZT1OZXcgTGlicmFyeQ0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZXNjcmlwdGlvbkxhYmVsPVx1OGFhY1x1NjYwZToNCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj0xIFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzAwMVx1MzAwY1x1NWI4Y1x1NGU4Nlx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzA1ZFx1MzA4Y1x1MzA4OVx1MzA5Mlx1OTU4Ylx1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsPVx1OTA3OFx1NjI5ZVx1MzA5Mlx1MzA1OVx1MzA3OVx1MzA2Nlx1ODllM1x1OTY2NA0KLUVsZW1lbnRzVmlld19taWdyYXRpb25fZGlyX2RsZ19kZXNjcmlwdGlvbl90ZXh0PVx1NjViMFx1ODk4Zlx1MzA2Ylx1MzBkZVx1MzBhNFx1MzBiMFx1MzBlY1x1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA1NVx1MzA4Y1x1MzA1ZiB7MH0gXHUzMDZlXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDY2XHUzMDAxXHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmIHswfSBcdTMwOTJcdTdmNmVcdTMwNGRcdTYzZGJcdTMwNDhcdTMwN2VcdTMwNTlcdTMwMDINCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPVx1MzBiN1x1MzBiOVx1MzBjNlx1MzBlMFx1MzBmYlx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdThhNzNcdTMwNTdcdTMwNGZcdTMwNmZcdTMwMGNcdThhNzNcdTdkMzBcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDJcblwNCi1cblwNCi1cdTk1OGJcdTMwNDRcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwOTJcdTk1ODlcdTMwNThcdTMwNjZcdTMwNGJcdTMwODlcdTMwMDFcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi0NCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlPVx1MzBhNFx1MzBlMVx1MzBmY1x1MzBiOFx1MzA0Y1x1NzEyMVx1NTJiOQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzFFOiBcdThhMzFcdTViYjlcdTMwYjVcdTMwYTRcdTMwYmEgKHsxfSBcdTAwZDcgezJ9KSBcdTMwOTJcdThkODVcdTMwNDhcdTMwOGJcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjggJyd7MH0nJyBcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHU1MjI1XHUzMDZlXHUzMGE0XHUzMGUxXHUzMGZjXHUzMGI4XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RpdGxlPVx1MzBhNFx1MzBlMVx1MzBmY1x1MzBiOFx1MzA0Y1x1NzEyMVx1NTJiOQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMkU6IFx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2YVx1MzA0NFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiAnJ3swfScnIFx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdTUyMjVcdTMwNmVcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9XHU5MDc4XHU2MjllLi4uDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1OGFhY1x1NjYwZQ0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTBcdTMwNmVcdThhYWNcdTY2MGUNCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPVx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1OTU4OVx1MzA1OFx1MzA4Ylx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMiBcdTY3MDBcdTUyMWRcdTMwNmJcdTMwMDFcdTRmZGRcdTdiYTFcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNmFcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwNGNcdTMwNDJcdTMwOGNcdTMwNzBcdTMwMDFcdTMwNWRcdTMwOGNcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi0NCi0jIFRlbXBsYXRlRGVzY3JpcHRpb25QYWdlDQotZm9ybXNfVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2VfYWxyZWFkeUF0dGFjaGVkX21zZz1cdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmZcdTMwNTlcdTMwNjdcdTMwNmJcdTMwNTNcdTMwNmVcdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzhcdTMwNmJcdTZkZmJcdTRlZDhcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIE5ldyBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLW5ld0xpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFOiBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMT1cdTcxMjFcdTUyYjlcdTMwNmFcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwZDFcdTMwYjkgJyd7MH0nJyBcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMj1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmYgJyd7MH0nJyBcdTMwNmJcdTY1ZTJcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMz1cdTRmNWNcdTYyMTBcdTMwNjdcdTMwNGRcdTMwNmFcdTMwNDRcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzBcdTMwZmMgJyd7MH0nJyBcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1uZXdMaWJyYXJ5RXJyb3JfYWR2aWNlPVx1MzAwY09LXHUzMDBkXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDAxXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHU1MjI1XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDRiXHUzMGQxXHUzMGI5XHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotDQotI1Byb2Nlc3MgbGl0ZXJhbHMNCi1Qcm9jZXNzX0V4dGVybmFsSUQ9XHU1OTE2XHU5MGU4IElEOg0KLVByb2Nlc3NfUHVycG9zZT1cdTc2ZWVcdTc2ODQ6DQotUHJvY2Vzc19TY29wZT1cdTMwYjlcdTMwYjNcdTMwZmNcdTMwZDc6DQotUHJvY2Vzc19Vc2FnZU5vdGVzPVx1NGY3Zlx1NzUyOFx1NGUwYVx1MzA2ZVx1NmNlOFx1NjEwZjoNCi1Qcm9jZXNzX0FsdGVybmF0aXZlcz1cdTRlZTNcdTY4NDg6DQotUHJvY2Vzc19Ib3dUb1N0YWZmPVx1OTE0ZFx1NWM1ZVx1NjViOVx1NmNkNToNCi1Qcm9jZXNzX0tleUNvbnNpZGVyYXRpb249XHU0ZTNiXHUzMDZhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1Og0KLVByb2Nlc3NfU2NhbGU9XHUzMGI5XHUzMGIxXHUzMGZjXHUzMGViOg0KLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1cdTMwZDdcdTMwZWRcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTMwNmVcdTcyNzlcdTYwMjc6DQotUHJvY2Vzc19SaXNrTGV2ZWw9XHUzMGVhXHUzMGI5XHUzMGFmXHUzMGZiXHUzMGVjXHUzMGQ5XHUzMGViOg0KLVByb2Nlc3NfRXN0aW1hdGluZ1RlY2huaXF1ZT1cdTg5OGJcdTdhNGRcdTMwODJcdTMwOGFcdTYyODBcdTg4NTM6DQotUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPVx1MzBkN1x1MzBlZFx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOFx1MzBmYlx1MzBlMVx1MzBmM1x1MzBkMFx1MzBmY1x1MzA2ZVx1NWMwMlx1OTU4MFx1NzdlNVx1OGI1ODoNCi1Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0PVx1NTk1MVx1N2QwNFx1MzA2ZVx1MzBiZlx1MzBhNFx1MzBkNzoNCi0NCi0jIEVkaXRvciBQcmV2aWV3IE5hdmlnYXRpb24gQnV0dG9ucw0KLWJhY2tCdXR0b25fdGV4dD1cdTYyM2JcdTMwOGINCi1mb3J3YXJkQnV0dG9uX3RleHQ9XHU5MDMyXHUzMDgwDQotZm9yd2FyZF90ZXh0PVx1OTAzMlx1MzA4MA0KLXN0b3BCdXR0b25fdGV4dD1cdTUwNWNcdTZiNjINCi1yZWZyZXNoQnV0dG9uX3RleHQ9XHU2NmY0XHU2NWIwDQotcmVmcmVzaF90ZXh0PVx1NjZmNFx1NjViMA0KLW5ld25hbWVfdGV4dD1cdTY1YjBcdTg5OGZcdTU0MGQ6DQotcHJpbnRCdXR0b25fdGV4dD1cdTUzNzBcdTUyMzcNCi0NCi0jIENvbnRleHQgbWVudXMNCi1fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW09XHU2NmY0XHU2NWIwKCZSKQ0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1ODg2OFx1NzkzYSgmUykNCi0NCi1fVUlfTWV0aG9kRWRpdG9yX21lbnU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjKCZNKQ0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09XHU2NWIwXHU4OThmKCZOKQ0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1cdTY1YjBcdTg5OGZcdTMwNmVcdTUxNDRcdTVmMWYoJkUpDQotDQotX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWw9XHU5MDc4XHU2MjllDQotX1VJX1BhcmVudFBhZ2VfbGFiZWw9XHU4OWFhDQotX1VJX0xpc3RQYWdlX2xhYmVsPVx1MzBlYVx1MzBiOVx1MzBjOA0KLV9VSV9UcmVlUGFnZV9sYWJlbD1cdTMwYzRcdTMwZWFcdTMwZmMNCi1fVUlfVGFibGVQYWdlX2xhYmVsPVx1MzBjNlx1MzBmY1x1MzBkNlx1MzBlYg0KLV9VSV9UYWJsZVRyZWVQYWdlX2xhYmVsPVRhYmxlVHJlZQ0KLV9VSV9PYmplY3RDb2x1bW5fbGFiZWw9XHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4DQotX1VJX1NlbGZDb2x1bW5fbGFiZWw9XHUzMGJiXHUzMGViXHUzMGQ1DQotDQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9XHU5MDc4XHU2MjllXHUzMDZhXHUzMDU3DQotX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkPVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1MzBhYVx1MzBkNlx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjODogezB9DQotX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQ9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmIHswfSBcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzgNCi0NCi1fVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsPVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0Zg0KLQ0KLV9VSV9XaXphcmRfY2F0ZWdvcnk9RU1GIFx1MzBlMlx1MzBjN1x1MzBlYlx1NGY1Y1x1NjIxMFx1MzBhNlx1MzBhM1x1MzBiNlx1MzBmY1x1MzBjOVx1MzA2ZVx1NGY4Yg0KLQ0KLV9VSV9NZXRob2RNb2RlbFdpemFyZF9sYWJlbD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTJcdTMwYzdcdTMwZWINCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfZGVzY3JpcHRpb249XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGUyXHUzMGM3XHUzMGViXHUzMDkyXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwDQotDQotX1VJX01ldGhvZEVkaXRvcl9sYWJlbD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTJcdTMwYzdcdTMwZWJcdTMwZmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmMNCi0NCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZT1NeQ0KLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbj1tZXRob2QNCi0NCi1fVUlfV2l6YXJkX2xhYmVsPVx1NjViMFx1ODk4Zg0KLQ0KLV9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1NTQwZFx1MzA2ZVx1NjcyYlx1NWMzZVx1MzA2ZiAnJy57MH0nJyBcdTMwNjdcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNmFcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi0NCi1fVUlfTW9kZWxPYmplY3Q9XHUzMGUyXHUzMGM3XHUzMGViXHUzMGZiXHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4DQotX1VJX1hNTEVuY29kaW5nPVhNTCBcdTMwYThcdTMwZjNcdTMwYjNcdTMwZmNcdTMwYzlcdTY1YjlcdTVmMGYNCi1fVUlfWE1MRW5jb2RpbmdDaG9pY2VzPVVURi04IEFTQ0lJIFVURi0xNiBVVEYtMTZCRSBVVEYtMTZMRSBJU08tODg1OS0xDQotX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbj1cdTRmNWNcdTYyMTBcdTMwNTlcdTMwOGJcdTMwZTJcdTMwYzdcdTMwZWJcdTMwZmJcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTMwNmVcdTkwNzhcdTYyOWUNCi0NCi1fVUlfRmlsZUNvbmZsaWN0X2xhYmVsPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZVx1N2FmNlx1NTQwOA0KLV9XQVJOX0ZpbGVDb25mbGljdD1cdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTU5MTZcdTMwNjdcdTUyYTBcdTMwNDhcdTMwODlcdTMwOGNcdTMwNWZcdTU5MDlcdTY2ZjRcdTMwNjhcdTc3ZGJcdTc2ZmVcdTMwNTlcdTMwOGJcdTMwMDFcdTRmZGRcdTdiYTFcdTUyNGRcdTMwNmVcdTU5MDlcdTY2ZjRcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMDUzXHUzMDZlXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjXHUzMDZlXHU1OTA5XHU2NmY0XHUzMDkyXHU3ODM0XHU2OGM0XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPw0KLQ0KLSMgQWRkIExpbmsgRGlhbG9nDQotYWRkTGlua0RpYWxvZ19saW5rVHlwZT1cdTMwYmZcdTMwYTRcdTMwZDc6DQotb3BlbkxpbmtDaGVja2JveF90ZXh0PVx1NTIyNVx1MzA2ZVx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiNlx1MzBmY1x1MzBmYlx1MzBhNlx1MzBhM1x1MzBmM1x1MzBjOVx1MzBhNlx1MzA2N1x1MzBlYVx1MzBmM1x1MzBhZlx1MzA5Mlx1OTU4Ylx1MzA0Zg0KLQ0KLSMgQWRkIEltYWdlIERpYWxvZw0KLWhlaWdodExhYmVsX3RleHQ9XHU5YWQ4XHUzMDU1Og0KLXdpZHRoTGFiZWxfdGV4dD1cdTVlNDU6DQotRWxlbWVudHNWaWV3XzIwPVx1MzBiMVx1MzBmY1x1MzBkMVx1MzBkM1x1MzBlYVx1MzBjNlx1MzBhM1x1MzBmY1x1MzBmYlx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmMw0KLUVsZW1lbnRzVmlld18yMT1cdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1FbGVtZW50c1ZpZXdfMjI9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5DQotRWxlbWVudHNWaWV3XzM1PXswfSBcdTMwNmZcdThhYWRcdTMwN2ZcdTUzZDZcdTMwOGFcdTVjMDJcdTc1MjhcdTMwNjdcdTMwNTlcdTMwMDIgXHU3ZDlhXHU4ODRjXHUzMDU5XHUzMDhiXHU1MjRkXHUzMDZiXHU2NmY4XHUzMDRkXHU4ZmJjXHUzMDdmXHU1M2VmXHU4MGZkXHUzMDZiXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotRWxlbWVudHNWaWV3XzM2PVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBmYlx1MzBhOFx1MzBlOVx1MzBmYw0KLWFsdFRhZ0xhYmVsX3RleHQ9QUxUIFx1MzBiZlx1MzBiMDoNCi1pbWFnZVNpemVMYWJlbF90ZXh0PVx1MzBhNFx1MzBlMVx1MzBmY1x1MzBiOFx1MzA2ZVx1OWFkOFx1MzA1NVx1MzA2OFx1NWU0NVx1MzA2Zlx1MzAwMTEwIFx1NGVlNVx1NGUwYSA2MDAgXHU0ZWU1XHU0ZTBiXHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDZhXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyIFx1NzEyMVx1NTJiOVx1MzA2YVx1OWFkOFx1MzA1NVx1MzA2OFx1NWU0NVx1MzA2Zlx1MzAwMVx1OTA2OVx1NTIwN1x1MzA2YVx1MzBiNVx1MzBhNFx1MzBiYVx1MzA2Ylx1NTkwOVx1NjNkYlx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgUHJvY2VzcyBFZGl0b3INCi1Qcm9jZXNzRWRpdG9yPVByb2Nlc3NFZGl0b3INCi1Qcm9jZXNzRWRpdG9yX05hbWU9XHU1NDBkXHU1MjRkDQotUHJvY2Vzc0VkaXRvcl9QcmVzZW50YXRpb25OYW1lPVx1ODg2OFx1NzkzYVx1NTQwZA0KLVByb2Nlc3NFZGl0b3JfSW5kZXg9XHU3ZDIyXHU1ZjE1DQotUHJvY2Vzc0VkaXRvcl9QcmVkZWNlc3NvcnM9XHU1MTQ4XHU4ODRjXHUzMGJmXHUzMGI5XHUzMGFmDQotI0NvbmZpZ3VyYXRpb25QYWdlX1NlbGVjdGVkPVNlbGVjdGVkOiANCi1DaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbj1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk4MDVcdTc2ZWVcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwMDFcdTMwMGNcdTRlMGFcdTMwNzhcdTMwMGRcdTMwN2VcdTMwNWZcdTMwNmZcdTMwMGNcdTRlMGJcdTMwNzhcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTk4MDZcdTVlOGZcdTMwOTJcdTU5MDlcdTY2ZjRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1FbGVtZW50c1ZpZXdfcmVuYW1pbmdfdGV4dD1cdTU0MGRcdTUyNGRcdTU5MDlcdTY2ZjQuLi4NCi1Qcm9jZXNzRWRpdG9yX01vZGVsSW5mbz1cdTMwZTJcdTMwYzdcdTMwZWJcdTYwYzVcdTU4MzENCi1Qcm9jZXNzRWRpdG9yX1ByZWZpeD1cdTMwZDdcdTMwZWNcdTMwZDVcdTMwYTNcdTMwYzNcdTMwYWZcdTMwYjkNCi1Nb3ZlRGlhbG9nX21vdmVfdGV4dD1cdTc5ZmJcdTUyZDUNCi1DaGVja2xpc3RPcmRlcl90aXRsZT1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk4MDVcdTc2ZWVcdTMwNmVcdTk4MDZcdTVlOGZcdTRlZDhcdTMwNTENCi1Qcm9jZXNzRWRpdG9yX1JlcGV0YWJsZT1cdTUzY2RcdTVmYTlcdTUzZWZcdTgwZmQNCi1Qcm9jZXNzRWRpdG9yX09uZ29pbmc9XHU5MDMyXHU4ODRjXHU0ZTJkDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uPVx1NTQwY1x1NjcxZlx1NTMxNi4uLg0KLVByb2Nlc3NFZGl0b3JfRXZlbnREcml2ZW49XHUzMGE0XHUzMGQ5XHUzMGYzXHUzMGM4XHU5OWM2XHU1MmQ1DQotUHJvY2Vzc0VkaXRvcl9EZWxpdmVyYWJsZT1cdTdkMGRcdTUxNjVcdTcyNjkNCi1Qcm9jZXNzRWRpdG9yX09wdGlvbmFsPVx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmMw0KLUZpbHRlckRpYWxvZ19UeXBlX3RleHQ9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU4OTgxXHU3ZDIwXHUzMDZlXHUzMGJmXHUzMGE0XHUzMGQ3Og0KLUZpbHRlckRpYWxvZ19FeHBhbmRBbGw9XHUzMDU5XHUzMDc5XHUzMDY2XHU1YzU1XHU5NThiDQotTW92ZURpYWxvZ19tb3ZpbmdfdGV4dD1cdTc5ZmJcdTUyZDVcdTRlMmQuLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25XYXJuaW5nPUlVUEEwMDI1VzogezB9IFx1MzA2ZSBcdTVmNjJcdTcyYjZcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwNGNcdTZiMjFcdTMwNmVcdTMwZDFcdTMwYjlcdTMwNmJcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTM6IHsxfQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yPUlVUEEwMDI1RTogXHUzMGE4XHUzMGU5XHUzMGZjOiBcdTVmNjJcdTcyYjZcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwNmVcdTMwYmJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjM6IHswfQ0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfTmFtZUxhYmVsPVx1NTQwZFx1NTI0ZDoNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9OYW1lTGFiZWw9XHU1NDBkXHU1MjRkOg0KLUF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU9XHU2NWIwXHU4OThmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VUaXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTY1YjBcdTg5OGZcdTRmNWNcdTYyMTANCi1uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlPVx1NjViMFx1ODk4Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmYw0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlVGl0bGU9XHU1OTA5XHU2NmY0XHUzMDkyXHU0ZmRkXHU3YmExDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1cdTY1YjBcdTg5OGZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwMDFcdTU0MGRcdTUyNGRcdTMwMDFcdThhYWNcdTY2MGVcdTMwMDFcdTMwNGFcdTMwODhcdTMwNzNcdTViOWJcdTUxNDhcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZURlc2NyaXB0aW9uPTEgXHUzMDY0XHU0ZWU1XHU0ZTBhXHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU4OTgxXHU3ZDIwXHUzMDRjXHU1OTA5XHU2NmY0XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIFx1NGZkZFx1N2JhMVx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2YVx1ODk4MVx1N2QyMFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1OTU4Ylx1MzA0Zg0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1OTU4Ylx1MzA0Zg0KLUVsZW1lbnRzVmlld19yZXBsYWNlaW5nd2l0aGZvcm1hdF90ZXh0PXswfSBcdTMwOTJcdTdmNmVcdTYzZGJcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmc9SVVQQTAwMjZXOiB7MH0gXHUzMDZlXHUzMGNlXHUzMGZjXHUzMGM5XHUzMGZiXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDRjXHU2YjIxXHUzMDZlXHUzMGQxXHUzMGI5XHUzMDZiXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzOiB7MX0NCi1NZXNzYWdlTGFiZWxQcm92aWRlcl91bnNlbGVjdGVkcGFja2FnZXM9Jyd7MH0nJyBcdTMwNGNcdTMwMDFcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwNmFcdTMwNDRcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjhcdTMwNmVcdTg5ODFcdTdkMjBcdTMwOTJcdTUzYzJcdTcxNjdcdTMwNTlcdTMwOGJcdTg5ODFcdTdkMjBcdTMwOTJcdTU0MmJcdTMwOTNcdTMwNjdcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbkVycm9yPUlVUEEwMDI2RTogXHUzMGE4XHUzMGU5XHUzMGZjOiBcdTMwY2VcdTMwZmNcdTMwYzlcdTMwZmJcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwNmVcdTMwYmJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjM6IHswfQ0KLVN0ZXBzT3JkZXJEaWFsb2dfc3RlcHM9XHUzMGI5XHUzMGM2XHUzMGMzXHUzMGQ3OiANCi1TdGVwc09yZGVyRGlhbG9nX3RpdGxlPVx1MzBiZlx1MzBiOVx1MzBhZlx1MzBmYlx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkN1x1MzA2ZVx1OTgwNlx1NWU4Zlx1NGVkOFx1MzA1MQ0KLVByb2Nlc3NFZGl0b3JfUGxhbm5lZD1cdThhMDhcdTc1M2JcdTZlMDhcdTMwN2YNCi1zcGVjaWZ5ZGlyZWN0b3J5X3RleHQ9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHU0ZmRkXHU3YmExXHU1MTQ4XHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0DQotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPVx1ODkwN1x1NjU3MFx1MzA2ZVx1NTFmYVx1NzNmZQ0KLVByb2Nlc3NFZGl0b3JfRW50cnlTdGF0ZT1cdTk1OGJcdTU5Y2JcdTcyYjZcdTYxNGINCi1Qcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZT1cdTdkNDJcdTRlODZcdTcyYjZcdTYxNGINCi1zZWxlY3RDb2x1bW5zdG9BZGRfdGV4dD1cdThmZmRcdTUyYTBcdTMwNTlcdTMwOGJcdTUyMTdcdTMwNmVcdTkwNzhcdTYyOWUNCi1Qcm9jZXNzRWRpdG9yX1R5cGU9XHUzMGJmXHUzMGE0XHUzMGQ3DQotUHJvY2Vzc0VkaXRvcl9UZWFtPVx1MzBjMVx1MzBmY1x1MzBlMA0KLUZpbHRlckRpYWxvZ190aXRsZT1cdTkwNzhcdTYyOWVcdTMwYzBcdTMwYTRcdTMwYTJcdTMwZWRcdTMwYjA6IA0KLQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNGJcdTMwODlcdThmZmRcdTUyYTAoJk0pLi4uDQotRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsPVx1MzA1OVx1MzA3OVx1MzA2Nlx1N2UyZVx1NWMwZlx1ODg2OFx1NzkzYQ0KLU9wZW5DaGVhdHNoZWV0Vmlld190aXRsZT1DaGVhdFNoZWV0IFx1MzBkM1x1MzBlNVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0Zg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxVcD1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwYTJcdTMwYzNcdTMwZDcNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsRG93bj1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwYzBcdTMwYTZcdTMwZjMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA9XHU0ZTBhXHUzMDc4XHU3OWZiXHU1MmQ1KCZPKQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVEb3duPVx1NGUwYlx1MzA3OFx1NzlmYlx1NTJkNSgmVykNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWw9XHU2NjBlXHU3OTNhKCZBKQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvcHk9XHUzMGIzXHUzMGQ0XHUzMGZjKCZDKS4uLg0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ9XHU1NDBkXHU1MjRkXHUzMDZlXHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzIChcdTRlMDBcdTgxZjRcdTMwNTlcdTMwOGJcdTU0MGRcdTUyNGRcdTMwOTJcdTg4NjhcdTc5M2EpOg0KLQ0KLU1ldGhvZExpYnJhcnlFZGl0b3JfdGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjOiANCi0jTWVzc2FnZVZpZXdfc2VsZWN0ZWRfdGV4dD1TZWxlY3RlZDogDQotTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ9XHU4YWFjXHU2NjBlDQotRWxlbWVudHNWaWV3X2Vycl9zYXZpbmc9SVVQQTAwMjdFOiAnJ3swfScnIFx1MzA2ZVx1NGZkZFx1N2JhMVx1NGUyZFx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZiB7MX0NCi0NCi1lcnJfY29weWluZ19maWxlX3RpdGxlPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZVx1MzBiM1x1MzBkNFx1MzBmY1x1NGUyZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmYw0KLWVycl9jb3B5aW5nX2ZpbGVfZXJyb3I9SVVQQTAwMjhFOiBcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwOTJcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDIgDQotZXJyX2NvcHlpbmdfZmlsZV9yZWFzb249XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHUzMGIzXHUzMGQ0XHUzMGZjXHU0ZTJkXHUzMDZiXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIFx1OGE3M1x1MzA1N1x1MzA0Zlx1MzA2Zlx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU1MWU2XHU3NDA2XHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjDQotZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcD1cdTY5Y2JcdTYyMTBcdTMwNmVcdTdkZThcdTk2YzYNCi1lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQ9SVVQQTAwMTVFOiBcdTg5ODFcdTdkMjBcdTMwOTJcdTdkZThcdTk2YzZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMNCi1TYXZlVGhpc0FjdGlvbl9zYXZlb2JqZWN0PVx1MzA1M1x1MzA2ZVx1MzBhYVx1MzBkNlx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOFx1MzA5Mlx1NGZkZFx1N2JhMS4uLg0KLUVsZW1lbnRzVmlld19yZXBsYWNlX3RleHQ9XHU3ZjZlXHU2M2RiDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kPVx1NjJlMVx1NWYzNSgmRSkuLi4NCi1Nb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHU4OTgxXHU3ZDIwXHUzMDZlXHU1YjliXHU1MTQ4XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0Og0KLWNob29zZURlZmF1bHREaXJlY3RvcnlfdGV4dD1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmVcdTkwNzhcdTYyOWU6DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3M9XHU2MjkxXHU1MjM2KCZTKQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzMj1cdTUxNmNcdTk1OGJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjMoJlApLi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXNzaWduVXNlckRpYWdyYW09XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGZjXHU1YjlhXHU3ZmE5XHUzMGMwXHUzMGE0XHUzMGEyXHUzMGIwXHUzMGU5XHUzMGUwKCZVKS4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ190aXRsZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTMwZmNcdTViOWFcdTdmYTlcdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTBcdTMwNmVcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjYNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRJbWFnZT1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTU2ZjM6DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1OGE3M1x1N2QzMFx1NTZmMzoNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfd3BkSW1hZ2U9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyXHU1NmYzOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19ub3RhRmlsZT1JVVBBMDAwNEU6IFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2N1x1MzA2Zlx1MzA2YVx1MzA0NFx1MzBkMVx1MzBiOVx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b249XHU5MDc4XHU2MjllLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDI0RTogXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDZhXHUzMDQ0XHUzMGE0XHUzMGUxXHUzMGZjXHUzMGI4XHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIFx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBlYlx1MzBmY1x1MzBjOFx1MzBmYlx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBmY1x1MzA3OFx1MzA2ZVx1NzZmOFx1NWJmZVx1MzBkMVx1MzBiOVx1MzA5Mlx1NTE2NVx1NTI5Ylx1MzA1N1x1MzA1Zlx1MzA1M1x1MzA2OFx1MzA5Mlx1NzhiYVx1OGE4ZFx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ9SVVQQTAwMzBFOiBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwNmFcdTMwNDRcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZT1cdTMwZDZcdTMwZTlcdTMwYTZcdTMwYmFcdTMwNGFcdTMwODhcdTMwNzNcdTUxNmNcdTk1OGJcdTMwNTlcdTMwOGJcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTU2ZjNcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwNmVcdTRmN2ZcdTc1MjgNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURESW1hZ2U9XHUzMGQ2XHUzMGU5XHUzMGE2XHUzMGJhXHUzMDRhXHUzMDg4XHUzMDczXHU1MTZjXHU5NThiXHUzMDU5XHUzMDhiXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU4YTczXHU3ZDMwXHU1NmYzXHUzMGE0XHUzMGUxXHUzMGZjXHUzMGI4XHUzMDZlXHU0ZjdmXHU3NTI4DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlPVx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiYVx1MzA0YVx1MzA4OFx1MzA3M1x1NTE2Y1x1OTU4Ylx1MzA1OVx1MzA4Ylx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1NGY5ZFx1NWI1OFx1OTVhMlx1NGZjMlx1NTZmM1x1MzBhNFx1MzBlMVx1MzBmY1x1MzBiOFx1MzA2ZVx1NGY3Zlx1NzUyOA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvbnRyaWJ1dGU9XHUzMGVkXHUzMGZjXHUzMGFiXHUzMGViXHU1YmM0XHU0ZTBlDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZT1cdTMwZWRcdTMwZmNcdTMwYWJcdTMwZWJcdTdmNmVcdTYzZGINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9EaWFncmFtcz1cdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTAoJkcpDQotUHJvY2Vzc0VkaXRvcl9hY3Rpb25fZGVlcENvcHk9XHUzMGM3XHUzMGEzXHUzMGZjXHUzMGQ3XHUzMGZiXHUzMGIzXHUzMGQ0XHUzMGZjKCZEKS4uLg0KLUZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uPVx1ODk4MVx1NjVlODoNCi1Db25maWd1cmF0aW9uUGFnZV9oaWRlVG9vbFRpcD1cdTY3MmFcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTg5ODFcdTdkMjBcdTMwOTJcdTg4NjhcdTc5M2EvXHU5NzVlXHU4ODY4XHU3OTNhDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb249XHU4YWFjXHU2NjBlOg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzQWxsPVx1NTE2Y1x1OTU4Ylx1MzA2YVx1MzA1Nw0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uPVx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmM1x1MzA2Zlx1MzBiM1x1MzBmM1x1MzBkZVx1MzA2N1x1NTMzYVx1NTIwN1x1MzA4YVx1MzAwMSogXHUzMDY3XHU0ZWZiXHU2MTBmXHUzMDZlXHUzMGI5XHUzMGM4XHUzMGVhXHUzMGYzXHUzMGIwXHUzMDAxPyBcdTMwNjdcdTRlZmJcdTYxMGZcdTMwNmVcdTY1ODdcdTViNTdcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1Db25maWd1cmF0aW9uUGFnZV9UcmVlVGl0bGVMYWJlbD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQ6DQotQ29uZmlndXJhdGlvblBhZ2VfTG9hZGluZ01lc3NhZ2U9XHU2OWNiXHU2MjEwXHUzMDkyXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyXHUzMDRhXHU1Zjg1XHUzMDYxXHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0IC4uLg0KLU1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0PVx1NzEyMVx1NTJiOVx1MzA2YVx1NzlmYlx1NTJkNVx1NTE0OFx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMg0KLU1vdmVEaWFsb2dfY2Fubm90TW9kaWZ5RGVzdGluYXRpb249SVVQQTAwMzRFOiBcdTU5MDlcdTY2ZjRcdTMwNjdcdTMwNGRcdTMwNmFcdTMwNDRcdTViOWJcdTUxNDhcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw9XHUzMDU5XHUzMDc5XHUzMDY2XHU1MTZjXHU5NThiDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkJhc2VBY3Rpdml0eT1cdTU3ZmFcdTY3MmNcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGYNCi1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPVx1MzA1OVx1MzA3OVx1MzA2Nlx1NWM1NVx1OTU4YigmWCkNCi1Qcm9jZXNzRm9ybUVkaXRvcl9jb2xsYXBzZUFsbEFjdGlvbkxhYmVsPVx1MzA1OVx1MzA3OVx1MzA2Nlx1N2UyZVx1NWMwZlx1ODg2OFx1NzkzYSgmTCkNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1NTZmM1x1MzA5Mlx1OTU4Ylx1MzA0ZigmQSkNCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlUmV2ZWFsPVx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA2Ylx1MzBlYVx1MzBiOVx1MzBjOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA4Ylx1NjI5MVx1NTIzNlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA2YVx1MzA0NFx1OGExOFx1OGZmMFx1NWI1MFx1MzA2Zlx1MzAwMVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1ODk4MVx1N2QyMFx1MzA5Mlx1NzkzYVx1MzA1N1x1MzA1Zlx1NWY4Y1x1MzA2N1x1MzAwMVx1OTFjZFx1ODkwN1x1MzA5Mlx1OTA3Zlx1MzA1MVx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzA2Ylx1NTI0YVx1OTY2NFx1MzA1OVx1MzA4Ylx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwNTNcdTMwOGNcdTMwODlcdTMwOTJcdTUyNGFcdTk2NjRcdTMwNTdcdTMwNjZcdTdkOWFcdTg4NGNcdTMwNTlcdTMwOGJcdTU4MzRcdTU0MDhcdTMwNmZcdTMwMDFcdTMwMGNPS1x1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9TZWxlY3RDb2x1bW5zPVx1OGZmZFx1NTJhMFx1MzA1OVx1MzA4Ylx1NTIxN1x1MzA2ZVx1OTA3OFx1NjI5ZQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW09XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU4YTczXHU3ZDMwXHU1NmYzXHUzMDkyXHU5NThiXHUzMDRmKCZEKQ0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9Db2x1bW5TZWxlY3Rpb249XHU1MjE3XHUzMDZlXHU5MDc4XHU2MjllOg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zd2l0Y2hDb25maWd1cmF0aW9uPVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzBmYlx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1NmQzYlx1NTJkNVx1NTMxNlx1MzA1OVx1MzA4Ylx1MzA2OFx1MzA0ZFx1MzA2Ylx1MzAwMVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2ZVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1NjljYlx1NjIxMFx1MzA2Ylx1NTIwN1x1MzA4YVx1NjZmZlx1MzA0OFx1MzA4Yg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zdXBwcmVzc2lvbkdyb3VwVGl0bGU9XHU2MjkxXHU1MjM2DQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX2luaGVyaXRTdXBwcmVzc2lvblN0YXRlPVx1NjI5MVx1NTIzNlx1NzJiNlx1NjE0Ylx1MzA2ZVx1N2Q5OVx1NjI3Zg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1NGY5ZFx1NWI1OFx1OTVhMlx1NGZjMlx1NTZmM1x1MzA5Mlx1OTU4Ylx1MzA0ZigmVykNCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1cdTMwYWZcdTMwZWFcdTMwYTINCi1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19TZWxlY3RCdXR0b25MYWJlbD1cdTkwNzhcdTYyOWUuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9JbnNlcnROZXdQaGFzZT1cdTY1YjBcdTg5OGZcdTMwZDVcdTMwYTdcdTMwZmNcdTMwYmFcdTMwNmVcdTYzM2ZcdTUxNjUNCi1WaWV3SGVscGVyX3JlbG9hZExpYk9uUm9sbGJhY2tFcnJvcj1cdTMwZDFcdTMwZmNcdTMwYjdcdTMwYjlcdTMwYmZcdTMwZjNcdTMwYjlcdTMwZmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGJcdTMwODlcdTMwZWFcdTMwYWJcdTMwZDBcdTMwZWFcdTMwZmNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHU1MTQzXHUzMDZlXHU3MmI2XHU2MTRiXHUzMDZiXHU1ZmE5XHU1MTQzXHUzMDU5XHUzMDhiXHUzMDZiXHUzMDZmXHUzMDAxXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU5XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZF90ZXh0PVx1ODk4MVx1N2QyMCAnJ3swfScnIFx1MzA2Zlx1NjVlMlx1MzA2Ylx1NTI0YVx1OTY2NFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQ9XHU4OTgxXHU3ZDIwICcnezB9JycgXHUzMDZmXHU2NWUyXHUzMDZiXHU1MjRhXHU5NjY0XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzA1M1x1MzA2ZVx1ODk4MVx1N2QyMFx1MzA5MiAnJ3sxfScnIFx1MzA0Ylx1MzA4OVx1OTY2NFx1NTNiYlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi1Db25maWd1cmF0aW9uUGFnZV9BZGRNaXNzaW5nVG9vbFRpcD1cdTZiMjBcdTg0M2RcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTUzYzJcdTcxNjdcdTMwNmVcdThmZmRcdTUyYTANCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbj1cdThhYWNcdTY2MGUNCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25HZW5lcmFsSW5mbz1cdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzEgDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPVx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmM1x1MzA2ZVx1OTA2OVx1NzUyOCgmVCkNCi1Nb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ9XHU1YjliXHU1MTQ4XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotTW92ZURpYWxvZ19ub21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9XHU3OWZiXHU1MmQ1XHU1MTQ4XHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotTWV0aG9kTGlicmFyeUVkaXRvcl90cm91Ymxlb2JqZWN0PS4gXHU1NTRmXHU5ODRjXHUzMDRjXHU3NTFmXHUzMDU4XHUzMDVmXHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4OiANCi1NZXNzYWdlTGFiZWxQcm92aWRlcl9lcnJjaGlsZHBrZ3M9XHU1YjUwXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHUzMDdlXHUzMDVmXHUzMDZmXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZiXHUzMDAxXHU2YjIwXHU4NDNkXHUzMDU3XHUzMDVmXHU1M2MyXHU3MTY3XHUzMDkyXHU2MzAxXHUzMDY0XHU4OTgxXHU3ZDIwXHUzMDRjXHU1NDJiXHUzMDdlXHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZT1cdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTBcdTUxNmNcdTk1OGJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjMNCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2U9XHU1MTZjXHU5NThiXHUzMDU5XHUzMDhiXHUzMGMwXHUzMGE0XHUzMGEyXHUzMGIwXHUzMGU5XHUzMGUwXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU5XHUzMDhiXHUzMDRiXHUzMDAxXHU1MTZjXHU5NThiXHUzMDU3XHUzMDZhXHUzMDQ0XHUzMGMwXHUzMGE0XHUzMGEyXHUzMGIwXHUzMGU5XHUzMGUwXHUzMDkyXHU5MDc4XHU2MjllXHU4OWUzXHU5NjY0XHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotUHJvY2Vzc0VkaXRvcl9UaXRsZT1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmM6IA0KLVNhdmVBc3dpdGhkb3RzX3RleHQ9XHU1MjI1XHU1NDBkXHU0ZmRkXHU3YmExLi4uDQotUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkNlx1MzBlY1x1MzBmY1x1MzBhZlx1MzBjMFx1MzBhNlx1MzBmM1x1MzBmYlx1MzBiOVx1MzBjOFx1MzBlOVx1MzBhZlx1MzBjMVx1MzBlM1x1MzBmYw0KLVByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb249XHUzMGMxXHUzMGZjXHUzMGUwXHUzMDZlXHU1MjcyXHUzMDhhXHU2MzJmXHUzMDhhDQotUHJvY2Vzc0VkaXRvcl9Xb3JrUHJvZHVjdFVzYWdlPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA2ZVx1NGY3Zlx1NzUyOFx1NzJiNlx1NmNjMQ0KLVByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldz1cdTdkNzFcdTU0MDhcdTMwZDNcdTMwZTVcdTMwZmMNCi1Qcm9jZXNzRWRpdG9yX2NvbmZpcm1BdXRvU3luY2g9XHUzMDUzXHUzMDZlXHU2NGNkXHU0ZjVjXHUzMDZmXHUzMDAxXHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGQzXHUzMGU1XHUzMGZjXHUzMDZlXHUzMDBjXHU0ZTAwXHU4MjJjXHUzMDBkXHUzMGJmXHUzMGQ2XHUzMDY3XHUzMDBjXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDY4XHU1NDBjXHU2NzFmXHU1MzE2XHUzMDBkXHUzMDY4XHUzMGRlXHUzMGZjXHUzMGFmXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHU5MDc4XHU2MjllXHU2ZTA4XHUzMDdmXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHUzMDZlXHU0ZTBiXHUzMDZlXHUzMDAxXHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDdlXHUzMDVmXHUzMDZmXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDkyXHU2NmY0XHU2NWIwXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyICBcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTY5Y2JcdTYyMTBcdTMwNmVcdTRlMGJcdTMwNmVcdTMwMDFcdTMwZWFcdTMwZjNcdTMwYWZcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTg5ODFcdTdkMjBcdTMwNmVcdTMwYWFcdTMwZWFcdTMwYjhcdTMwY2FcdTMwZWJcdTMwZmJcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwOTJcdTYzMDFcdTMwNjRcdThhMThcdThmZjBcdTViNTBcdTMwNGNcdTY2ZjRcdTY1YjBcdTViZmVcdThjNjFcdTMwNjhcdTMwNmFcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDIgIFx1MzA1M1x1MzA2ZVx1NjRjZFx1NGY1Y1x1MzA2N1x1MzAwMVx1NTJkNVx1NzY4NFx1MzA2Ylx1MzBlYVx1MzBmM1x1MzBhZlx1MzA1NVx1MzA4Y1x1MzA1ZiAoXHU3ZGQxXHU4MjcyXHUzMDZlXHUzMGE0XHUzMGJmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDY3XHU3OTNhXHUzMDU1XHUzMDhjXHUzMDhiKSBcdThhMThcdThmZjBcdTViNTBcdTMwNGNcdTY2ZjRcdTY1YjBcdTMwNTVcdTMwOGNcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgIFx1N2Q5YVx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE9XHU2OWNiXHU2MjEwDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yPVx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA0YVx1MzA4OFx1MzA3M1x1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOFx1MzA2ZVx1OTA3OFx1NjI5ZQ0KLU5ld0xpYnJhcnlEaWFsb2dfbmV3bGlicmFyeV9hcz1cdTZiMjFcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNjdcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTY1YjBcdTg5OGZcdTRmNWNcdTYyMTANCi1OZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ9XHU2NWIwXHU4OThmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzDQotU2VsZWN0RWxlbWVudERpYWxvZ190aXRsZV90ZXh0PVx1ODk4MVx1N2QyMFx1MzA3ZVx1MzA1Zlx1MzA2Zlx1MzA1ZFx1MzA2ZVx1NWJjNFx1NGUwZVx1ODAwNVx1MzA2ZSAxIFx1MzA2NFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NDoNCi1PcGVuQ29uZmlnRGlhbG9nbmV3Y29uZmlnX3RleHQ9XHU2NWIwXHU4OThmXHU2OWNiXHU2MjEwOg0KLXByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZV9CU0VkaXRvcj1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmMNCi0NCi0jIEFic3RyYWN0RGlhZ3JhbUVkaXRvcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1cdThhYmZcdTY1NzQNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1cdTU3ZmFcdTY3MmNcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwNGJcdTMwODlcdTMwNmVcdTY2ZjRcdTY1YjANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9XHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGZiXHUzMGRjXHUzMGMzXHUzMGFmXHUzMGI5XHUzMDZlXHUzMGQ1XHUzMGE5XHUzMGZjXHUzMGRlXHUzMGMzXHUzMGM4Li4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1cdTVlNzNcdTU3NDdcdTMwNmJcdTViZmVcdTMwNTdcdTMwNjZcdTZjMzRcdTVlNzNcdTMwNmJcdTkxNGRcdTdmNmUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVx1NjcwMFx1NTIxZFx1MzA2ZVx1OTA3OFx1NjI5ZVx1MzA2Ylx1NWJmZVx1MzA1N1x1MzA2Nlx1NmMzNFx1NWU3M1x1MzA2Ylx1OTE0ZFx1N2Y2ZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9XHU1ZTczXHU1NzQ3XHUzMDZiXHU1YmZlXHUzMDU3XHUzMDY2XHU1NzgyXHU3NmY0XHUzMDZiXHU5MTRkXHU3ZjZlDQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl90aXRsZT1cdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzENCi1Nb3ZlRGlhbG9nX2ludmFsaWRfbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1JVVBBMDA0MUU6IFx1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA1Zlx1ODk4MVx1N2QyMFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA2ZVx1NWI5Ylx1NTE0OFx1MzA2Ylx1NzlmYlx1NTJkNVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeT1cdTMwZTJcdTMwYzdcdTMwZWJcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkgLi4uDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU9XHUzMGE4XHUzMGU5XHUzMGZjDQotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c9SVVQQTAwMzNFOiBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTRmZGRcdTdiYTFcdTRlMmRcdTMwNmJcdTU1NGZcdTk4NGNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dD0nJ3swfScnIFx1MzA5Mlx1NTI0YVx1OTY2NFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19Db250ZW50RWxlbWVudF90ZXh0PVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1ODk4MVx1N2QyMDogDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Ccm93c2VCdXR0b25MYWJlbD1cdTUzYzJcdTcxNjcuLi4NCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uPVx1NjViMFx1ODk4Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA2Ylx1NTQwZFx1NTI0ZFx1MzA2OFx1OGFhY1x1NjYwZVx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU9XHU1OTA5XHU2NmY0XHUzMDkyXHU0ZmRkXHU3YmExXHUzMDU3XHUzMDY2XHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjXHUzMDkyXHU5NTg5XHUzMDU4XHUzMDhiDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdTY3MDBcdTUyMWRcdTMwNmVcdTkwNzhcdTYyOWVcdTMwNmJcdTViZmVcdTMwNTdcdTMwNjZcdTU3ODJcdTc2ZjRcdTMwNmJcdTkxNGRcdTdmNmUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVx1NGZkZFx1N2JhMQ0KLUF0dGFjaG1lbnREaWFsb2dhdHRhY2hGaWxlX3RleHQ9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHU2ZGZiXHU0ZWQ4DQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudD1cdTY5Y2JcdTYyMTBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQNCi1PcGVuQ29uZmlnRGlhbG9nb3BlbmNvbmZpZ190ZXh0PVx1NjljYlx1NjIxMFx1MzA5Mlx1OTU4Ylx1MzA0Zg0KLUVsZW1lbnRzVmlld19yZXBsYWNlQWN0aW9uX3RleHQ9XHU3ZjZlXHU2M2RiLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZT17MH0gXHUzMDkyXHU0ZmRkXHU3YmExXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5DQotQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcD1cdTY5Y2JcdTYyMTBcdTMwNmVcdThiNjZcdTU0NGFcdTMwZWRcdTMwYjBcdTMwZmJcdTMwZDNcdTMwZTVcdTMwZmNcdTMwYTJcdTMwZmNcdTMwOTJcdTg4NjhcdTc5M2ENCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25Gb3JtUHJlZml4PVx1NjljYlx1NjIxMDogDQotQ2hlY2tsaXN0T3JkZXJfY2hlY2tsaXN0aXRlbXNfdGV4dD1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk4MDVcdTc2ZWU6IA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1cdTMwY2VcdTMwZmNcdTMwYzlcdTMwNmVcdTc5ZmJcdTUyZDUNCi1Db25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXA9XHUzMGE4XHUzMGU5XHUzMGZjXHUzMDkyXHU0ZmVlXHU2YjYzXHUzMDU3XHUzMDY2XHU5NTg5XHUzMDU4XHUzMDhiDQotTmV3UGx1Z2luRGlhbG9nX3JlZmVyZW5jZXBsdWdpbl90ZXh0PVx1NTNjMlx1NzE2N1x1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmMzoNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfY3JlYXRlRnJlZVRleHRfdGV4dD1cdTMwZDVcdTMwZWFcdTMwZmNcdTMwZmJcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNmVcdTRmNWNcdTYyMTANCi1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbD1cdTMwY2VcdTMwZmNcdTMwYzlcdTMwZmJcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwNmVcdTMwZDdcdTMwZWNcdTMwZDNcdTMwZTVcdTMwZmM6DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ9SVVQQTAwMzJXOiBcdTYzYTVcdTdkOWFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMNCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfc2FtZXByZWRhbmRzdWNfdGV4dD1JVVBBMDAzM1c6IFx1NTE0OFx1ODg0Y1x1MzBiZlx1MzBiOVx1MzBhZlx1MzA0YVx1MzA4OFx1MzA3M1x1NWY4Y1x1N2Q5YVx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2OFx1NTQwY1x1MzA1OFx1MzBkNlx1MzBlY1x1MzBmY1x1MzBhZlx1MzBjMFx1MzBhNlx1MzBmM1x1MzBmYlx1MzBhOFx1MzBlY1x1MzBlMVx1MzBmM1x1MzBjOFx1MzA2Zlx1NjMwMVx1MzA2Nlx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLQ0KLSMgRWRpdG9yQ2hvb3Nlcg0KLUVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlPVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0Zg0KLUVkaXRvckNob29zZXJfUmVzb3VyY2VzRXJyb3I9XHUzMDUzXHUzMDZlXHU4OTgxXHU3ZDIwXHUzMDZiXHUzMDZmXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyIFx1MzA1M1x1MzA4Y1x1MzA4OVx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA5Mlx1NGZlZVx1NmI2M1x1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1N2Q5YVx1ODg0Y1x1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA5Mlx1MzA0YVx1NTJlN1x1MzA4MVx1MzA1N1x1MzA3ZVx1MzA1OSAoXHU4YTczXHU3ZDMwXHUzMDkyXHU1M2MyXHU3MTY3XHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0KVx1MzAwMlxuXA0KLVxuXA0KLVx1MzAwY09LXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDAxXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjXHUzMDkyXHU5NThiXHUzMDRiXHUzMDVhXHUzMDZiXHU3ZDlhXHU4ODRjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0Zlx1MzA2Ylx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBjMFx1MzBhNFx1MzBhMlx1MzBlZFx1MzBiMFx1MzA5Mlx1OTU4OVx1MzA1OFx1MzA3ZVx1MzA1OVx1MzAwMg0KLUNvbmZpZ3VyYXRpb25QYWdlX0Zvcm1QcmVmaXg9XHU2OWNiXHU2MjEwOiANCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25OYW1lPVx1NTQwZFx1NTI0ZDoNCi1BdHRhY2htZW50RGlhbG9nRmlsZVVSTF90ZXh0PVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZSBVUkw6DQotU3RlcHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbj1cdTMwYjlcdTMwYzZcdTMwYzNcdTMwZDdcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwMDFcdTMwMGNcdTRlMGFcdTMwNzhcdTMwMGRcdTMwN2VcdTMwNWZcdTMwNmZcdTMwMGNcdTRlMGJcdTMwNzhcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTk4MDZcdTVlOGZcdTMwOTJcdTU5MDlcdTY2ZjRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1NZXRob2RMaWJyYXJ5RWRpdG9yX2Vycl9zYXZlPVx1NGZkZFx1N2JhMVx1NGUyZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmYw0KLU1lc3NhZ2VWaWV3X2VycmVsZW1lbnRfdGV4dD1cdTUzYzJcdTcxNjdcdTUwNzRcdTMwNmVcdTg5ODFcdTdkMjANCi1NZXNzYWdlVmlld19yZWZlbGVtZW50X3RleHQ9XHU1M2MyXHU3MTY3XHU1YmZlXHU4YzYxXHUzMDZlXHU4OTgxXHU3ZDIwDQotDQotI0FjdGl2aXR5IERpYWdyYW0NCi1BY3Rpdml0eURpYWdyYW1FZGl0b3JfY3JlYXRlU3RhcnROb2RlX3RleHQ9XHUzMDBjXHU5NThiXHU1OWNiXHUzMGNlXHUzMGZjXHUzMGM5XHUzMDBkXHUzMDZlXHU0ZjVjXHU2MjEwDQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudERlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1NjljYlx1NjIxMFx1MzA2Ylx1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA4Ylx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzAwMVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzBmYlx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOFx1MzAwMVx1MzA0YVx1MzA4OFx1MzA3M1x1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uX3RleHQ9XHUzMDBjXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDBkXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHU4OTgxXHU3ZDIwXHUzMDZlXHU5ODA2XHU1ZThmXHUzMGMwXHUzMGE0XHUzMGEyXHUzMGVkXHUzMGIwDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EaXJlY3RvcnlMYWJlbD1cdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmM6DQotUm9vdFByZWZQYWdlX2VuYWJsZXByb2Nlc3Njb250cmlidXRpb25fdGV4dD1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTViYzRcdTRlMGVcdTMwOTJcdTRmN2ZcdTc1MjhcdTUzZWZcdTgwZmRcdTMwNmJcdTMwNTlcdTMwOGINCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbl90ZXh0PVx1MzA1M1x1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uTGFiZWw9XHU4YWFjXHU2NjBlOg0KLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9Jyd7MH0nJyBcdTMwNmVcdTViYzRcdTRlMGVcdTgwMDVcdTMwOTJcdTkwNzhcdTYyOWUNCi1FbGVtZW50c1ZpZXdfb3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uX3RleHQ9XHU1OTFhXHU2OWQ4XHU2MDI3XHU4OTgxXHU3ZDIwXHU3ZDRjXHU3NTMxXHUzMDY3XHU5NThiXHUzMDRmDQotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3RpdGxlPScnezB9JycgXHUzMDZlXHU1OTFhXHU2OWQ4XHU2MDI3XHU4OTgxXHU3ZDIwXHUzMDZlXHU5MDc4XHU2MjllDQotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsPScnezB9JycgXHUzMDZlXHU1OTFhXHU2OWQ4XHU2MDI3XHU4OTgxXHU3ZDIwDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsPVx1NWY2Mlx1NzJiNlx1MzBhMlx1MzBhNFx1MzBiM1x1MzBmM1x1MzA2ZVx1MzBkN1x1MzBlY1x1MzBkM1x1MzBlNVx1MzBmYzoNCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2RlbGV0ZV90ZXh0PVx1NTI0YVx1OTY2NFx1NGUwZFx1NTNlZg0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU4YTczXHU3ZDMwXHU1NmYzXHUzMDkyXHU5NThiXHUzMDRmIA0KLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fZGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1cdTMwYWZcdTMwZWFcdTMwYTINCi1XUENvbXBhcnRtZW50RmlndXJlXzA9XHU2NWIwXHU4OThmXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwDQotcHJvbXB0Zm9yX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGRfdGV4dD1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwNjdcdTRmNWNcdTYyMTBcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwNmFcdTMwNDRcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdThhNzNcdTdkMzBcdTU2ZjNcdTMwOTJcdTUxNmNcdTk1OGJcdTMwN2VcdTMwNWZcdTMwNmZcdTMwZDZcdTMwZTlcdTMwYTZcdTMwYmFcdTMwNTlcdTMwOGINCi1wcm9tcHRfZm9yX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09XHU1OTA5XHU2NmY0XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDZhXHUzMDQ0XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU2MmUxXHU1ZjM1XHUzMDZlXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU1NmYzXHUzMDkyXHU1MTZjXHU5NThiXHUzMDdlXHUzMDVmXHUzMDZmXHUzMGQ2XHUzMGU5XHUzMGE2XHUzMGJhXHUzMDU5XHUzMDhiDQotDQotI0NvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm49XHU1NDBkXHU1MjRkXHUzMDZlXHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzIChcdTRlMDBcdTgxZjRcdTMwNTlcdTMwOGJcdTU0MGRcdTUyNGRcdTMwOTJcdTg4NjhcdTc5M2EpOg0KLXNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uX2xhYmVsPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzBmYlx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBiZlx1MzBmY1x1MzA2Ylx1ODg2OFx1NzkzYQ0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1BhdHRlcm49XHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzXHUzMDZmXHUzMGIzXHUzMGYzXHUzMGRlXHUzMDY3XHU1MzNhXHU1MjA3XHUzMDhhXHUzMDAxKiBcdTMwNjdcdTRlZmJcdTYxMGZcdTMwNmVcdTMwYjlcdTMwYzhcdTMwZWFcdTMwZjNcdTMwYjBcdTMwMDE/IFx1MzA2N1x1NGVmYlx1NjEwZlx1MzA2ZVx1NjU4N1x1NWI1N1x1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb249SVVQQTAwMjlFOiBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmVcdTUxZTZcdTc0MDZcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHU4YTczXHUzMDU3XHUzMDRmXHUzMDZmXHUzMDBjXHU4YTczXHU3ZDMwXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQ2F0ZWdvcnlUeXBlPVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1MzBmYlx1MzBiZlx1MzBhNFx1MzBkNzoNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19CcmllZkRlc2NyaXB0aW9uPVx1ODk4MVx1NjVlODoNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19TZWxlY3RDYXRlZ29yaWVzPVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1MzA2ZVx1OTA3OFx1NjI5ZQ0KLQ0KLSNsb2cgbWVzc2FnZXMNCi1jaGVhdHNoZWV0X2xvYWRfZmFpbHVyZV9sb2dfbXNnPVx1ODk4MVx1NmM0Mlx1MzA1NVx1MzA4Y1x1MzA1Zlx1ODY0ZVx1MzA2ZVx1NWRmYlx1MzA5Mlx1OTU4Ylx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1ZjogDQotDQotbmV3Q29uZmlndXJhdGlvbldpcmF6ZF9jcmVhdGVFcnJvcj1JVVBBMDAzNUU6IFx1NjljYlx1NjIxMFx1MzA5Mlx1NmI2M1x1NWUzOFx1MzA2Ylx1NGY1Y1x1NjIxMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLW5ld1BsdWdpbldpemFyZF9jcmVhdGVFcnJvcj1JVVBBMDAzNkU6IFx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1NmI2M1x1NWUzOFx1MzA2Ylx1NGY1Y1x1NjIxMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLWVycm9yRGlhbG9nX21vdmVFcnJvcj1JVVBBMDAzN0U6IFx1ODk4MVx1N2QyMFx1MzA5Mlx1NmI2M1x1NWUzOFx1MzA2Ylx1NzlmYlx1NTJkNVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLXJlbmFtZURpYWxvZ19yZW5hbWVFcnJvcj1JVVBBMDAzOEU6IFx1ODk4MVx1N2QyMFx1MzA5Mlx1NmI2M1x1NWUzOFx1MzA2Ylx1NTQwZFx1NTI0ZFx1NTkwOVx1NjZmNFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLWVycm9yRGlhbG9nX2NyZWF0ZUVycm9yPUlVUEEwMDM5RTogXHU4OTgxXHU3ZDIwXHUzMDkyXHU2YjYzXHU1ZTM4XHUzMDZiXHU0ZjVjXHU2MjEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzDQotZHVwbGljYXRlUGx1Z2luTmFtZUVycm9yX21zZz1JVVBBMDEwMUU6IFx1NTQwZFx1NTI0ZCAnJ3swfScnIFx1MzA2Zlx1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiBcdTUyMjVcdTMwNmVcdTU0MGRcdTUyNGRcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi0NCi0jTmV3IFN0cmluZ3MgZm9yIFByb2Nlc3NFZGl0b3IgQ29udGV4dCBtZW51IGRpYWdyYW0gaW1hZ2VzDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkQURJbWFnZT1BRCBcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwNmVcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjYuLi4NCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlPVx1NjZmNFx1NjViMFx1MzBhOFx1MzBlOVx1MzBmYw0KLVByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yTXNnPVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA2ZVx1NjZmNFx1NjViMFx1NGUyZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmYw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlPUFERCBcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwNmVcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjYuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRXUERJbWFnZT1XUEQgXHUzMGE0XHUzMGUxXHUzMGZjXHUzMGI4XHUzMDZlXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2Li4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURJbWFnZUluUHVibGlzaGluZz1cdTUxNmNcdTk1OGJcdTRlMmRcdTMwNmUgQUQgXHUzMGE0XHUzMGUxXHUzMGZjXHUzMGI4XHUzMDZlXHU0ZjdmXHU3NTI4DQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzPVx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA2Ylx1MzBlYVx1MzBiOVx1MzBjOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA4Ylx1NjI5MVx1NTIzNlx1MzA1NVx1MzA4Y1x1MzA1Zlx1OGExOFx1OGZmMFx1NWI1MFx1MzA2Zlx1MzAwMVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1ODk4MVx1N2QyMFx1MzA5Mlx1NjI5MVx1NTIzNlx1MzA1N1x1MzA1Zlx1NWY4Y1x1MzA2N1x1MzAwMVx1OTFjZFx1ODkwN1x1MzA5Mlx1OTA3Zlx1MzA1MVx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzA2Ylx1NTI0YVx1OTY2NFx1MzA1OVx1MzA4Ylx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwNTNcdTMwOGNcdTMwODlcdTMwOTJcdTUyNGFcdTk2NjRcdTMwNTdcdTMwNjZcdTdkOWFcdTg4NGNcdTMwNTlcdTMwOGJcdTU4MzRcdTU0MDhcdTMwNmZcdTMwMDFcdTMwMGNPS1x1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFEREltYWdlSW5QdWJsaXNoaW5nPVx1NTE2Y1x1OTU4Ylx1NGUyZFx1MzA2ZSBBREQgXHUzMGE0XHUzMGUxXHUzMGZjXHUzMGI4XHUzMDZlXHU0ZjdmXHU3NTI4DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlV1BESW1hZ2VJblB1Ymxpc2hpbmc9XHU1MTZjXHU5NThiXHU0ZTJkXHUzMDZlIFdQRCBcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwNmVcdTRmN2ZcdTc1MjgNCi1Qcm9jZXNzRWRpdG9yX0RpYWdyYW1JbWFnZV9JbnB1dERpYWxvZ19pbml0aWFsVmFsdWU9XHUzMGE0XHUzMGUxXHUzMGZjXHUzMGI4XHUzMGZiXHUzMGQxXHUzMGI5DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU2hvd0xpbmtlZEVsZW1lbnRpbkxpYnJhcnlWaWV3PVx1MzBlYVx1MzBmM1x1MzBhZlx1MzA1NVx1MzA4Y1x1MzA1Zlx1ODk4MVx1N2QyMFx1MzA5Mlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkM1x1MzBlNVx1MzBmY1x1MzA2Ylx1ODg2OFx1NzkzYSgmSCkNCi1Qcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWw9XHU1N2ZhXHU2NzJjXHUzMDRiXHUzMDg5XHUzMDZlXHU2MjkxXHU1MjM2XHUzMDZlXHU2NmY0XHU2NWIwKCZCKQ0KLVByb2Nlc3NFZGl0b3JfQ29udGV4dE1lbnVfRGlhZ3JhbUltYWdlcz1cdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTBcdTMwZmJcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjgNCi0NCi0jU3RyaW5ncyBmb3Igc3luY2hyb25pemF0aW9uIHdpemFyZCBvbiBwcm9jZXNzIGVkaXRvcidzIEJTDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90aXRsZT1cdTU0MGNcdTY3MWZcdTMwNmVcdThhYWNcdTY2MGUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RleHQ9XHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHU1NDBjXHU2NzFmXHUzMDZlXHU1YjlmXHU4ODRjXHU1MTg1XHU1YmI5XHUzMDkyXHU4YWFjXHU2NjBlXHUzMDU5XHUzMDhiXHUzMDAxXHU0ZWU1XHU0ZTBiXHUzMDZlXHU2MGM1XHU1ODMxXHUzMDkyXHUzMDRhXHU4YWFkXHUzMDdmXHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHU2OWNiXHU2MjEwXHUzMDZlXHU5MDc4XHU2MjllDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGV4dD1cdTU0MGNcdTY3MWZcdTMwNmJcdTRmN2ZcdTc1MjhcdTMwNTlcdTMwOGJcdTY5Y2JcdTYyMTBcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIgIFwNCi1cdTMwNTNcdTMwNmVcdTkwNzhcdTYyOWVcdTMwNjdcdTMwMDFcdTU0MGNcdTY3MWZcdTMwNmJcdTRmN2ZcdTc1MjhcdTMwNTVcdTMwOGNcdTMwOGJcdTViYzRcdTRlMGVcdTMwNjhcdTdmNmVcdTYzZGJcdTMwNGNcdTZjN2FcdTMwN2VcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV9jb25maWdMYWJlbD1cdTY5Y2JcdTYyMTA6DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RpdGxlPVx1NTQwY1x1NjcxZlx1MzA1OVx1MzA4Ylx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1OTA3OFx1NjI5ZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcm9wZXJ0aWVzX2xhYmxlPVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzBmYw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9uYW1lX2xhYmxlPVx1NTQwZFx1NTI0ZA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmVzZW50YXRpb25OYW1lX2xhYmxlPVx1ODg2OFx1NzkzYVx1NTQwZA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9icmllZkRlc2NfbGFibGU9XHU4OTgxXHU2NWU4DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsPVx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1NTE2NVx1NTI5Yg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9tYW5kYXRvcnlJbnB1dHNfbGFibGU9XHU1ZmM1XHU5ODA4XHU1MTY1XHU1MjliDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX291dHB1dHNfbGFiZWw9XHU1MWZhXHU1MjliDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWw9XHU1N2ZhXHU2NzJjXHU1YjlmXHU4ODRjXHU4MDA1DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2FkZG5QZXJmb3JtZXJzX2xhYmxlPVx1OGZmZFx1NTJhMFx1NWI5Zlx1ODg0Y1x1ODAwNQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9yZXNwb25zaWJsZVJvbGVzX2xhYmxlPVx1NjJjNVx1NWY1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9jb250bkFydGlmYWN0c19sYWJlbD1cdTU0MmJcdTMwN2VcdTMwOGNcdTMwOGJcdTYyMTBcdTY3OWNcdTcyNjkNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfZGlsdmVkUGFydHNfbGFiZWw9XHU3ZDBkXHU1MTY1XHU3MjY5DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsPVx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkN1x1OTA3OFx1NjI5ZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90ZXh0PVx1NTQwY1x1NjcxZlx1MzA2ZVx1NWJmZVx1OGM2MVx1MzA2OFx1MzA1OVx1MzA4Ylx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA2ZVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzBmY1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90aXRsZT1cdTU0MGNcdTY3MWZcdTMwNmVcdTMwZDdcdTMwZWNcdTMwZDNcdTMwZTVcdTMwZmMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGV4dD1cdTRlZTVcdTRlMGJcdTMwNmVcdTYzZDBcdTY4NDhcdTMwNTVcdTMwOGNcdTMwNWZcdTU0MGNcdTY3MWZcdTMwNmVcdThhNzNcdTdkMzBcdTMwOTJcdTc4YmFcdThhOGRcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1zZWxlY3RFZGl0b3JzVG9EaXNjYXJkQ29uZmxpY3RDaGFuZ2VzPVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1NTkxNlx1MzA2N1x1NTJhMFx1MzA0OFx1MzA4OVx1MzA4Y1x1MzA1Zlx1NTkwOVx1NjZmNFx1MzA2OFx1NzdkYlx1NzZmZVx1MzA1OVx1MzA4Ylx1MzAwMVx1NGZkZFx1N2JhMVx1NTI0ZFx1MzA2ZVx1NTkwOVx1NjZmNFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMlxuXA0KLVx1NTkwOVx1NjZmNFx1MzA5Mlx1NzgzNFx1NjhjNFx1MzA1OVx1MzA4Ylx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXN5bmNocm9uaXphdGlvbldpemFyZF90aXRsZV90ZXh0PVx1NTQwY1x1NjcxZlx1MzBhNlx1MzBhM1x1MzBiNlx1MzBmY1x1MzBjOQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfZXhwbGFpblRleHQ9XHUzMDUzXHUzMDZlXHUzMGE2XHUzMGEzXHUzMGI2XHUzMGZjXHUzMGM5XHUzMDZmXHUzMDAxXHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGQzXHUzMGU1XHUzMGZjXHUzMDZlXHUzMDBjXHU0ZTAwXHU4MjJjXHUzMDBkXHUzMGJmXHUzMGQ2XHUzMDY3XHUzMDBjXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDY4XHU1NDBjXHU2NzFmXHU1MzE2XHUzMDBkXHUzMDY4XHUzMGRlXHUzMGZjXHUzMGFmXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHU5MDc4XHU2MjllXHU2ZTA4XHUzMDdmXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHUzMDZlXHU0ZTBiXHUzMDZlXHUzMDAxXHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDdlXHUzMDVmXHUzMDZmXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDkyXHU2NmY0XHU2NWIwXHUzMDU5XHUzMDhiXHU2NGNkXHU0ZjVjXHUzMDkyXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyICBcDQotXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDY3XHUzMDZmXHUzMDAxXHUzMDUzXHUzMDZlXHUzMGE2XHUzMGEzXHUzMGI2XHUzMGZjXHUzMGM5XHUzMDY3XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMGZjXHUzMDYwXHUzMDUxXHUzMDRjXHU2NmY0XHU2NWIwXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyICBcDQotXHU2NmY0XHU2NWIwXHUzMDZlXHU4YTA4XHU3Yjk3XHU2NjQyXHUzMDZiXHU0ZjdmXHU3NTI4XHUzMDU5XHUzMDhiXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZlXHU2NzA5XHU1MmI5XHUzMDZhXHU2OWNiXHU2MjEwXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU5XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDgyXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDU5XHUzMDAyICBcDQotXHUzMDUzXHUzMDZlXHUzMGE2XHUzMGEzXHUzMGI2XHUzMGZjXHUzMGM5XHUzMDY3XHUzMDZmXHUzMDAxXHU1MmQ1XHU3Njg0XHUzMDZiXHUzMGVhXHUzMGYzXHUzMGFmXHUzMDU1XHUzMDhjXHUzMDVmIChcdTdkZDFcdTgyNzJcdTMwNmVcdTMwYTRcdTMwYmZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNjdcdTc5M2FcdTMwNTVcdTMwOGNcdTMwOGIpIFx1OGExOFx1OGZmMFx1NWI1MFx1MzA2Zlx1NjZmNFx1NjViMFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLQ0KLW9wZW5SVEU9XHUzMGVhXHUzMGMzXHUzMGMxXHUzMGZiXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGZiXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjXHUzMDkyXHU5NThiXHUzMDRmDQotY2xvc2VSVEU9XHUzMGVhXHUzMGMzXHUzMGMxXHUzMGZiXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGZiXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjXHUzMDkyXHU5NTg5XHUzMDU4XHUzMDhiDQotDQotI05ldyBTdHJpbmdzDQotcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzhcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1kaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzA2Ylx1NWM1ZVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTk4NWVcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzXHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwYzRcdTMwZmNcdTMwZWJcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1jdXN0b21jYXRlZ29yeV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBhYlx1MzBiOVx1MzBiZlx1MzBlMFx1MzBmYlx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1MzA2Ylx1NWM1ZVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLWNvbmNlcHRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTY5ODJcdTVmZjVcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1jaGVja2xpc3RfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwZWFcdTMwYjlcdTMwYzhcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHU0ZjhiXHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGFjXHUzMGE0XHUzMGM5XHUzMGU5XHUzMGE0XHUzMGYzXHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcm9hZG1hcF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkN1x1MzA2Ylx1NWM1ZVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJldXNhYmxlYXNzZXRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTUxOGRcdTUyMjlcdTc1MjhcdTUzZWZcdTgwZmRcdTMwNmFcdThjYzdcdTc1MjNcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzhcdThjYzdcdTY1OTlcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yZXBvcnRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOVx1MzA2Ylx1NWM1ZVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRlbXBsYXRlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTc1MjhcdThhOWVcdTViOWFcdTdmYTlcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi10b29sbWVudG9yX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGM0XHUzMGZjXHUzMGViXHUzMGZiXHUzMGUxXHUzMGYzXHUzMGJmXHUzMGZjXHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotd2hpdGVwYXBlcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBkYlx1MzBlZlx1MzBhNFx1MzBjOFx1MzBmYlx1MzBkYVx1MzBmY1x1MzBkMVx1MzBmY1x1MzA2Ylx1NWM1ZVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1XHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotDQotI05ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbg0KLXJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJvbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcm9sZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwNjhcdTUyMjVcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLXRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRhc2tfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGJmXHUzMGI5XHUzMGFmXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdGFza192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdTMwNjhcdTUyMjVcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi10YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLWFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTYyMTBcdTY3OWNcdTcyNjlcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhNzNcdTdkMzBcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTYyMTBcdTY3OWNcdTcyNjlcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1hcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NjIxMFx1Njc5Y1x1NzI2OVx1MzA2ZVx1MzBhMlx1MzBhNFx1MzBiM1x1MzBmM1x1MzA5Mlx1MzBhYlx1MzBiOVx1MzBiZlx1MzBkZVx1MzBhNFx1MzBiYVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NjIxMFx1Njc5Y1x1NzI2OVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBjN1x1MzBlYVx1MzBkMFx1MzBlYVx1MzBmY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTYyMTBcdTY3OWNcdTcyNjlcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhYmZcdTY1NzRcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1hcnRpZmFjdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTYyMTBcdTY3OWNcdTcyNjlcdTMwNjhcdTUyMjVcdTMwNmVcdTYyMTBcdTY3OWNcdTcyNjlcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1hcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTYyMTBcdTY3OWNcdTcyNjlcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi1vdXRjb21lX2RldGFpbFNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTdkNTBcdTY3OWNcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhNzNcdTdkMzBcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1vdXRjb21lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1N2Q1MFx1Njc5Y1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLW91dGNvbWVfaWNvblNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTdkNTBcdTY3OWNcdTMwNmVcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwOTJcdTMwYWJcdTMwYjlcdTMwYmZcdTMwZGVcdTMwYTRcdTMwYmFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1vdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1N2Q1MFx1Njc5Y1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBjN1x1MzBlYVx1MzBkMFx1MzBlYVx1MzBmY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLW91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1N2Q1MFx1Njc5Y1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGFiZlx1NjU3NFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLW91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU3ZDUwXHU2NzljXHUzMDY4XHU1MjI1XHUzMDZlXHU3ZDUwXHU2NzljXHUzMDY4XHUzMDZlXHU5NWEyXHU0ZmMyXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotb3V0Y29tZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTdkNTBcdTY3OWNcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi1kZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZGVsaXZlcmFibGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTdkMGRcdTUxNjVcdTcyNjlcdTMwNmVcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwOTJcdTMwYWJcdTMwYjlcdTMwYmZcdTMwZGVcdTMwYTRcdTMwYmFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1kZWxpdmVyYWJsZV9ub3RhdGlvblNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTdkMGRcdTUxNjVcdTcyNjlcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1kZWxpdmVyYWJsZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YWJmXHU2NTc0XHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZGVsaXZlcmFibGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDY4XHU1MjI1XHUzMDZlXHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDY4XHUzMDZlXHU5NWEyXHU0ZmMyXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotZGlzY2lwbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2VcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1kaXNjaXBsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzA2OFx1NTIyNVx1MzA2ZVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotZG9tYWluX2RldGFpbFNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYzlcdTMwZTFcdTMwYTRcdTMwZjNcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhNzNcdTdkMzBcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1kb21haW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBjOVx1MzBlMVx1MzBhNFx1MzBmM1x1MzA2OFx1NTIyNVx1MzA2ZVx1MzBjOVx1MzBlMVx1MzBhNFx1MzBmM1x1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWRvbWFpbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYzlcdTMwZTFcdTMwYTRcdTMwZjNcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi13b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA2ZVx1N2EyZVx1OTg1ZVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTMwNmVcdTdhMmVcdTk4NWVcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi13b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDZlXHU3YTJlXHU5ODVlXHUzMDY4XHU1MjI1XHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDZlXHU3YTJlXHU5ODVlXHUzMDY4XHUzMDZlXHU5NWEyXHU0ZmMyXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotd29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA2ZVx1N2EyZVx1OTg1ZVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLXJvbGVzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOFx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJvbGVzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMGZiXHUzMGJiXHUzMGMzXHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcm9sZXNldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzhcdTMwNjhcdTUyMjVcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzhcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOFx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLXRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBjNFx1MzBmY1x1MzBlYlx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGM0XHUzMGZjXHUzMGViXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdG9vbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYzRcdTMwZmNcdTMwZWJcdTMwNjhcdTUyMjVcdTMwNmVcdTMwYzRcdTMwZmNcdTMwZWJcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi10b29sX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBjNFx1MzBmY1x1MzBlYlx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLWNvbmNlcHRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1Njk4Mlx1NWZmNVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU2OTgyXHU1ZmY1XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTY5ODJcdTVmZjVcdTMwNjhcdTUyMjVcdTMwNmVcdTY5ODJcdTVmZjVcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1Njk4Mlx1NWZmNVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLWNoZWNrbGlzdF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMGVhXHUzMGI5XHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1MzBlYVx1MzBiOVx1MzBjOFx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwZWFcdTMwYjlcdTMwYzhcdTMwNjhcdTUyMjVcdTMwNmVcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwZWFcdTMwYjlcdTMwYzhcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMGVhXHUzMGI5XHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU0ZjhiXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTRmOGJcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NGY4Ylx1MzA2OFx1NTIyNVx1MzA2ZVx1NGY4Ylx1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU0ZjhiXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotZ3VpZGVsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjNcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhNzNcdTdkMzBcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1ndWlkZWxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGFjXHUzMGE0XHUzMGM5XHUzMGU5XHUzMGE0XHUzMGYzXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZ3VpZGVsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBhY1x1MzBhNFx1MzBjOVx1MzBlOVx1MzBhNFx1MzBmM1x1MzA2OFx1NTIyNVx1MzA2ZVx1MzBhY1x1MzBhNFx1MzBjOVx1MzBlOVx1MzBhNFx1MzBmM1x1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjNcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1XHUzMDY4XHU1MjI1XHUzMDZlXHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1XHUzMDY4XHUzMDZlXHU5NWEyXHU0ZmMyXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotcHJhY3RpY2VfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXByYWN0aWNlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOVx1MzA2OFx1NTIyNVx1MzA2ZVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOVx1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXByYWN0aWNlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLXJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVjXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlY1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJlcG9ydF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNjhcdTUyMjVcdTMwNmVcdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVjXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotcmVzdWFibGVhc3NldF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU1MThkXHU1MjI5XHU3NTI4XHU1M2VmXHU4MGZkXHUzMDZhXHU4Y2M3XHU3NTIzXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTUxOGRcdTUyMjlcdTc1MjhcdTUzZWZcdTgwZmRcdTMwNmFcdThjYzdcdTc1MjNcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NTE4ZFx1NTIyOVx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2YVx1OGNjN1x1NzUyM1x1MzA2OFx1NTIyNVx1MzA2ZVx1NTE4ZFx1NTIyOVx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2YVx1OGNjN1x1NzUyM1x1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU1MThkXHU1MjI5XHU3NTI4XHU1M2VmXHU4MGZkXHUzMDZhXHU4Y2M3XHU3NTIzXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGM5XHUzMGRlXHUzMGMzXHUzMGQ3XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwYzlcdTMwZGVcdTMwYzNcdTMwZDdcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yb2FkbWFwX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkN1x1MzA2OFx1NTIyNVx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkN1x1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGM5XHUzMGRlXHUzMGMzXHUzMGQ3XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzhcdThjYzdcdTY1OTlcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhNzNcdTdkMzBcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHU4Y2M3XHU2NTk5XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1OGNjN1x1NjU5OVx1MzA2OFx1NTIyNVx1MzA2ZVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1OGNjN1x1NjU5OVx1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXN1cHBvcnRpbmdtYXRlcmlhbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzhcdThjYzdcdTY1OTlcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMDY4XHU1MjI1XHUzMDZlXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMDY4XHUzMDZlXHU5NWEyXHU0ZmMyXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotdGVybWRlZmluaXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NzUyOFx1OGE5ZVx1NWI5YVx1N2ZhOVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NzUyOFx1OGE5ZVx1NWI5YVx1N2ZhOVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NzUyOFx1OGE5ZVx1NWI5YVx1N2ZhOVx1MzA2OFx1NTIyNVx1MzA2ZVx1NzUyOFx1OGE5ZVx1NWI5YVx1N2ZhOVx1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NzUyOFx1OGE5ZVx1NWI5YVx1N2ZhOVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLXRvb2xtZW50b3JfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBjNFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBlMVx1MzBmM1x1MzBiZlx1MzBmY1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGM0XHUzMGZjXHUzMGViXHUzMGZiXHUzMGUxXHUzMGYzXHUzMGJmXHUzMGZjXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmNcdTMwNjhcdTUyMjVcdTMwNmVcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmNcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi10b29sbWVudG9yX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBjNFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBlMVx1MzBmM1x1MzBiZlx1MzBmY1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLXdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBkYlx1MzBlZlx1MzBhNFx1MzBjOFx1MzBmYlx1MzBkYVx1MzBmY1x1MzBkMVx1MzBmY1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXdoaXRlcGFwZXJfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGRiXHUzMGVmXHUzMGE0XHUzMGM4XHUzMGZiXHUzMGRhXHUzMGZjXHUzMGQxXHUzMGZjXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZGJcdTMwZWZcdTMwYTRcdTMwYzhcdTMwZmJcdTMwZGFcdTMwZmNcdTMwZDFcdTMwZmNcdTMwNjhcdTUyMjVcdTMwNmVcdTMwZGJcdTMwZWZcdTMwYTRcdTMwYzhcdTMwZmJcdTMwZGFcdTMwZmNcdTMwZDFcdTMwZmNcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi13aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBkYlx1MzBlZlx1MzBhNFx1MzBjOFx1MzBmYlx1MzBkYVx1MzBmY1x1MzBkMVx1MzBmY1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLWRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZGlzY2lwbGluZWdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2VcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTMwNjhcdTUyMjVcdTMwNmVcdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2VcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzhcdTMwZmJcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhNzNcdTdkMzBcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yb2xlc2V0Z3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMGZiXHUzMGJiXHUzMGMzXHUzMGM4XHUzMGZiXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOFx1MzBmYlx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2OFx1NTIyNVx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOFx1MzBmYlx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzhcdTMwZmJcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDY4XHU1MjI1XHUzMDZlXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDY4XHUzMDZlXHU5NWEyXHU0ZmMyXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfSWNvblNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYWJcdTMwYjlcdTMwYmZcdTMwZTBcdTMwZmJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTMwNmVcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwOTJcdTMwYWJcdTMwYjlcdTMwYmZcdTMwZGVcdTMwYTRcdTMwYmFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi1jb25jZXB0X2ljb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU2OTgyXHU1ZmY1XHUzMDZlXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDkyXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY2hlY2tsaXN0X2ljb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMGVhXHUzMGI5XHUzMGM4XHUzMDZlXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDkyXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdG9vbG1lbnRvcl9pY29uU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBjNFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBlMVx1MzBmM1x1MzBiZlx1MzBmY1x1MzA2ZVx1MzBhMlx1MzBhNFx1MzBiM1x1MzBmM1x1MzA5Mlx1MzBhYlx1MzBiOVx1MzBiZlx1MzBkZVx1MzBhNFx1MzBiYVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXdoaXRlcGFwZXJfaWNvblNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZGJcdTMwZWZcdTMwYTRcdTMwYzhcdTMwZmJcdTMwZGFcdTMwZmNcdTMwZDFcdTMwZmNcdTMwNmVcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwOTJcdTMwYWJcdTMwYjlcdTMwYmZcdTMwZGVcdTMwYTRcdTMwYmFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YVx1ODAwM1x1NjE2ZVx1NGU4Ylx1OTgwNVx1MzA2ZVx1MzBhMlx1MzBhNFx1MzBiM1x1MzBmM1x1MzA5Mlx1MzBhYlx1MzBiOVx1MzBiZlx1MzBkZVx1MzBhNFx1MzBiYVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU3NTI4XHU4YTllXHU1YjlhXHU3ZmE5XHUzMDZlXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDkyXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzhcdTMwNmVcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwOTJcdTMwYWJcdTMwYjlcdTMwYmZcdTMwZGVcdTMwYTRcdTMwYmFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU1MThkXHU1MjI5XHU3NTI4XHU1M2VmXHU4MGZkXHUzMDZhXHU4Y2M3XHU3NTIzXHUzMDZlXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDkyXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcmVwb3J0X2ljb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVjXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZlXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDkyXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcHJhY3RpY2VfaWNvblNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZDdcdTMwZTlcdTMwYWZcdTMwYzZcdTMwYTNcdTMwYjlcdTMwNmVcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwOTJcdTMwYWJcdTMwYjlcdTMwYmZcdTMwZGVcdTMwYTRcdTMwYmFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1leGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU0ZjhiXHUzMDZlXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDkyXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZ3VpZGVsaW5lX2ljb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGFjXHUzMGE0XHUzMGM5XHUzMGU5XHUzMGE0XHUzMGYzXHUzMDZlXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDkyXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkN1x1MzA2ZVx1MzBhMlx1MzBhNFx1MzBiM1x1MzBmM1x1MzA5Mlx1MzBhYlx1MzBiOVx1MzBiZlx1MzBkZVx1MzBhNFx1MzBiYVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1OGNjN1x1NjU5OVx1MzA2ZVx1MzBhMlx1MzBhNFx1MzBiM1x1MzBmM1x1MzA5Mlx1MzBhYlx1MzBiOVx1MzBiZlx1MzBkZVx1MzBhNFx1MzBiYVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX3RpdGxlPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NTkwOVx1NjZmNFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zg0KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2U9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMGZiXHUzMGI3XHUzMGI5XHUzMGM2XHUzMGUwXHUzMDY3XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHU1OTA5XHU2NmY0XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIFx1NTkwOVx1NjZmNFx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi0NCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZT1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwNmVcdTUzZWZcdTU5MDlcdTYwMjcNCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2c9Jyd7MX0nJyBcdTMwNmZcdTY1ZTJcdTMwNmIgMSBcdTMwNjRcdTRlZTVcdTRlMGFcdTMwNmVcdTViYzRcdTRlMGUvXHU3ZjZlXHU2M2RiXHU2ZTA4XHUzMDdmXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHUzMDkyXHU1YjUwXHUzMDY4XHUzMDU3XHUzMDY2XHU2MzAxXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDAxXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjICcnezB9JycgXHUzMDZmICcnezF9JycgXHUzMDY3XHU1M2VmXHU1OTA5XHU2MDI3XHUzMDkyXHU4YTJkXHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMT1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmMgJyd7MH0nJyBcdTMwNmZcdTMwMDFcdTMwNDRcdTMwNWFcdTMwOGNcdTMwNGJcdTMwNmVcdTc2ZjRcdTYzYTVcdTMwNmVcdTg5YWFcdTMwNGFcdTMwODhcdTMwNzNcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNjdcdTUzZWZcdTU5MDlcdTYwMjdcdTMwOTJcdThhMmRcdTViOWFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cyPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmYyAnJ3swfScnIFx1MzA2Zlx1MzAwMVx1NWZhYVx1NzRiMFx1NGY5ZFx1NWI1OFx1OTVhMlx1NGZjMlx1MzA2Ylx1MzA2YVx1MzA4Ylx1MzA1Zlx1MzA4MSAnJ3sxfScnIFx1MzA2N1x1NTNlZlx1NTkwOVx1NjAyN1x1MzA5Mlx1OGEyZFx1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLQ0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU9XHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzXHUzMDZlXHU5MDY5XHU3NTI4DQotYXBwbHlfcGF0dGVybl9lcnJvcl9tc2c9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjICcnezB9JycgXHUzMDZmXHUzMDAxXHU1ZmFhXHU3NGIwXHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyXHUzMDZiXHUzMDZhXHUzMDhiXHUzMDVmXHUzMDgxICcnezF9JycgXHUzMDY3XHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzXHUzMDkyXHU5MDY5XHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyPXwNCi1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc9XHUzMDUzXHUzMDZlXHU2NzJhXHU4OWUzXHU2YzdhXHUzMDZlXHU1M2MyXHU3MTY3XHUzMDZlXHU2MjQwXHU2NzA5XHU4MDA1XHUzMDkyXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQzXHUzMGU1XHUzMGZjXHUzMDZiXHU4ODY4XHU3OTNhXHUzMDU5XHUzMDhiDQotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZW1vdmVVbnJlc29sdmVkUmVmZXJlbmNlPVx1MzA1M1x1MzA2ZVx1NjcyYVx1ODllM1x1NmM3YVx1MzA2ZVx1NTNjMlx1NzE2N1x1MzA5Mlx1OTY2NFx1NTNiYlx1MzA1OVx1MzA4Yg0KLXByb21wdERlbGV0ZUN1c3RvbUNhdGVnb3J5QmVmb3JlUmVtb3ZlTGFzdFJlZlRvSXQ9XHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHU1MTg1XHUzMDZlIHswfSBcdTMwNzhcdTMwNmVcdTY3MDBcdTVmOGNcdTMwNmVcdTUzYzJcdTcxNjdcdTMwOTJcdTk2NjRcdTUzYmJcdTMwNTdcdTMwODhcdTMwNDZcdTMwNjhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDJcdTg5ODFcdTdkMjBcdTMwNmZcdTUyNGFcdTk2NjRcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDJcdTdkOWFcdTg4NGNcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSNCZWxvdyBwcm9wZXJ0eSAiZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzIiBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQNCi0jRG9uJ3QgZGVsZXRlIGEgc3BhY2UgYWZ0ZXIgIjogIg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzPTogDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlYzRmOWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZvcm0gUGFnZSBUaXRsZXMNCi1hc3NpZ25QYWdlX3RpdGxlPVx1YzljMFx1YzgxNQ0KLWNhdGVnb3JpZXNQYWdlX3RpdGxlPVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYw0KLWRlbGl2ZXJhYmxlUGFydHNQYWdlX3RpdGxlPVx1Yzc3OFx1YjNjNFx1YmIzYyBcdWQzMGNcdWQyYjgNCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9XHVjMTI0XHViYTg1DQotZGlzY2lwbGluZXNQYWdlX3RpdGxlPVx1YzZkMFx1Y2U1OQ0KLWRpc2NhcmR1bnJlc29sdmVkcmVmPVx1ZDU3NFx1YzExZFx1ZDU2MCBcdWMyMTggXHVjNWM2XHViMjk0IFx1Y2MzOFx1Yzg3MCBcdWJjODRcdWI5YWNcdWFlMzANCi1ndWlkYW5jZVBhZ2VfdGl0bGU9XHVjNTQ4XHViMGI0DQotcHJldmlld1BhZ2VfdGl0bGU9XHViYmY4XHViOWFjXHViY2Y0XHVhZTMwDQotcmVmZXJlbmNlc1BhZ2VfdGl0bGU9XHVjYzM4XHVjODcwDQotcmVmZXJlbmNlX3RleHQ9XHVjYzM4XHVjODcwOg0KLXJlZmVyZW5jZVdvcmtmbG93UGFnZV90aXRsZT1cdWNjMzhcdWM4NzAgXHVjNmNjXHVkMDZjXHVkNTBjXHViODVjXHVjNmIwDQotcm9sZXNQYWdlX3RpdGxlPVx1YzVlZFx1ZDU2MA0KLXJvbGVTZXRzUGFnZV90aXRsZT1cdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4DQotc3RlcHNQYWdlX3RpdGxlPVx1YjJlOFx1YWNjNA0KLXRhc2tzUGFnZV90aXRsZT1cdWQwYzBcdWMyYTRcdWQwNmMNCi10b29sTWVudG9yc1BhZ2VfdGl0bGU9XHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDANCi13b3JrUHJvZHVjdHNQYWdlX3RpdGxlPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi0NCi0jIFNlY3Rpb24gTmFtZXMgJiBEZXNjcmlwdGlvbg0KLWNoZWNrSXRlbXNTZWN0aW9uX25hbWU9XHVhYzgwXHVjMGFjIFx1ZDU2ZFx1YmFhOQ0KLWNoZWNrSXRlbXNTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1Y2NiNFx1ZDA2Y1x1YjlhY1x1YzJhNFx1ZDJiOFx1Yjk3YyBcdWFkNmNcdWMxMzFcdWQ1NThcdWIyOTQgXHVhYzgwXHVjMGFjIFx1ZDU2ZFx1YmFhOVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZGVwZW5kZW5jaWVzU2VjdGlvbl9uYW1lPVx1Yzg4NVx1YzE4ZFx1YzEzMQ0KLWRlcGVuZGVuY2llc1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjMTM5XHVjMTU4XHVjNWQwXHViMjk0IFx1YjJlNFx1Yjk3OCBcdWNlZThcdWQxNTBcdWNlMjAgXHVkMzI4XHVkMGE0XHVjOWMwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3NzQgXHVjZWU4XHVkMTUwXHVjZTIwIFx1ZDMyOFx1ZDBhNFx1YzljMFx1Yzc1OCBcdWM4ODVcdWMxOGRcdWMxMzFcdWM3NzQgXHVkNDVjXHVjMmRjXHViNDI5XHViMmM4XHViMmU0Lg0KLWRldGFpbFNlY3Rpb25fbmFtZT1cdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0DQotZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWdlbmVyYWxJbmZvU2VjdGlvbl9uYW1lPVx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjQNCi1nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgezB9XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1pY29uU2VjdGlvbl9uYW1lPVx1YzU0NFx1Yzc3NFx1Y2Y1OA0KLWljb25TZWN0aW9uX2Rlc2M9XHVjNzc0IHswfVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNTQ0XHVjNzc0XHVjZjU4XHVjNzQ0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NThcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotbm90YXRpb25TZWN0aW9uX25hbWU9XHVjODA0XHViMmVjIFx1YzgxNVx1YmNmNA0KLW5vdGF0aW9uU2VjdGlvbl9kZXNjPVx1Yzc3NCB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzgwNFx1YjJlYyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9uYW1lPVx1Y2MzOFx1Yzg3MFx1YjQxYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3Nzg6DQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzEzOVx1YzE1OFx1YzVkMFx1YjI5NCBcdWM3NzQgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1YzVkMFx1YzExYyBcdWNjMzhcdWM4NzBcdWQ1NThcdWIyOTQgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzc0IFx1ZDQ1Y1x1YzJkY1x1YjQyOVx1YjJjOFx1YjJlNC4NCi1zdGFmZmluZ1NlY3Rpb25fbmFtZT1cdWM3NzhcdWI4MjUgXHVhZDZjXHVjMTMxIFx1YzgxNVx1YmNmNA0KLXN0YWZmaW5nU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM1ZWRcdWQ1NjBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3OFx1YjgyNSBcdWFkNmNcdWMxMzEgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1zdGVwc1NlY3Rpb25fbmFtZT1cdWIyZThcdWFjYzQNCi1zdGVwc1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVkMGMwXHVjMmE0XHVkMDZjXHViOTdjIFx1YzIxOFx1ZDU4OVx1ZDU1OFx1YWUzMCBcdWM3MDRcdWQ1NWMgXHViMmU4XHVhY2M0XHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi10YWlsb3JpbmdTZWN0aW9uX25hbWU9XHVjODcwXHVjODE1DQotdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVx1Yzc3NCB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzg3MFx1YzgxNSBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXZhcmlhYmlsaXR5U2VjdGlvbl9uYW1lPVx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWJjYzBcdWIzZDkNCi12YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgezB9XHVjNzc0KFx1YWMwMCkgXHViMmU0XHViOTc4IHswfVx1YWNmYyhcdWM2NDApIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXZlcnNpb25JbmZvU2VjdGlvbl9uYW1lPVx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjQNCi12ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgezB9XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIFVJICYgRWxlbWVudCBBdHRyaWJ1dGUgTGFiZWxzDQotYWRkaXRpb25hbEluZm9fdGV4dD1cdWNkOTRcdWFjMDAgXHVjODE1XHViY2Y0Og0KLWFwcGxpY2F0aW9uX3RleHQ9XHVjNzUxXHVjNmE5XHVkNTA0XHViODVjXHVhZGY4XHViN2E4Og0KLWFjdGlvbkxhYmVsX2VkaXQ9XHVkM2I4XHVjOWQxDQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHViY2Y0XHVhZTMwXHVjNWQwIFx1ZDQ1Y1x1YzJkYw0KLWFsdGVybmF0aXZlc190ZXh0PVx1YjMwMFx1YzU0ODoNCi1hc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0PVx1YzljMFx1YzgxNSBcdWM4MTFcdWFkZmMgXHViYzI5XHVjMmRkOg0KLWF1dGhvcnNfdGV4dD1cdWM3OTFcdWMxMzFcdWM3OTA6DQotYmFja2dyb3VuZF90ZXh0PVx1YmMzMFx1YWNiZDoNCi1iYXNlRWxlbWVudF90ZXh0PVx1YWUzMFx1YmNmODoNCi1iYXNlR3VpZGFuY2VfdGV4dD1cdWFlMzBcdWJjZjggXHVjNTQ4XHViMGI0Og0KLWJyaWVmRGVzY3JpcHRpb25fdGV4dD1cdWFjMDRcdWI3YjVcdWQ1NWMgXHVjMTI0XHViYTg1Og0KLWRlc2NyaXB0aW9uX3RleHQ9XHVjMTI0XHViYTg1Og0KLWJhY2t1cGJlZm9yZXNhdmVfdGV4dD1cdWM4MDBcdWM3YTUgXHVjODA0IFx1YmMzMVx1YzVjNQ0KLWJyaWVmT3V0bGluZV90ZXh0PVx1YWMwNFx1YjdiNVx1ZDU1YyBcdWM1NDRcdWM2YzNcdWI3N2NcdWM3Nzg6DQotY2hhbmdlRGF0ZV90ZXh0PVx1YmNjMFx1YWNiZCBcdWIwYTBcdWM5ZGM6DQotY2hhbmdlRGVzY3JpcHRpb25fdGV4dD1cdWJjYzBcdWFjYmQgXHVjMTI0XHViYTg1Og0KLWNoZWNrSXRlbXNfdGV4dD1cdWFjODBcdWMwYWMgXHVkNTZkXHViYWE5DQotY29udHJpYnV0ZXNfdGV4dD1cdWNlZThcdWQyYjhcdWI5YWNcdWJkZjBcdWMxNTgNCi1sb2NhbENvbnRyaWJ1dGVzX3RleHQ9TG9jYWxDb250cmlidXRlcw0KLWNvbnRyaWJ1dGVzX3RvX3RleHQ9XHVjZWU4XHVkMmI4XHViOWFjXHViZGYwXHVjMTU4IFx1YjMwMFx1YzBjMQ0KLWNvcHlyaWdodF90ZXh0PVx1YzgwMFx1Yzc5MVx1YWQ4YzoNCi1lZGl0b3JfdGV4dD1cdWQzYjhcdWM5ZDFcdWFlMzANCi1leHRlbmRzX3RleHQ9XHVkNjU1XHVjN2E1DQotZXh0ZW5kX3RleHQ9XHVkNjU1XHVjN2E1DQotZXh0ZXJuYWxEZXNjcmlwdGlvbl90ZXh0PVx1YzY3OFx1YmQ4MCBcdWMxMjRcdWJhODU6DQotZXh0ZXJuYWxJZF90ZXh0PVx1YzY3OFx1YmQ4MCBJRDoNCi1nb2Fsc190ZXh0PVx1YmFhOVx1YzgwMToNCi1pbXBhY3RPZk5vdEhhdmluZ190ZXh0PVx1YmQ4MFx1YzdhY1x1YzVkMCBcdWI1MzBcdWI5NzggXHVjNjAxXHVkNWE1Og0KLWtleUNvbnNpZGVyYXRpb25zX3RleHQ9XHVkNTc1XHVjMmVjIFx1YWNlMFx1YjgyNFx1YzBhY1x1ZDU2ZDoNCi1sZXZlbHNPZkFkb3B0aW9uX3RleHQ9XHVjYzQ0XHVkMGRkIFx1YjgwOFx1YmNhODoNCi1tYWluRGVzY3JpcHRpb25fdGV4dD1cdWFlMzBcdWJjZjggXHVjMTI0XHViYTg1Og0KLW5ld0VsZW1lbnRfdGV4dD1cdWMwYzggezB9DQotbmFtZV90ZXh0PVx1Yzc3NFx1Yjk4NDoNCi1ub3RBcHBsaWNhYmxlX3RleHQ9XHVkNTc0XHViMmY5IFx1YzBhY1x1ZDU2ZCBcdWM1YzZcdWM3NGMNCi1wYWNrYWdpbmdHdWlkYW5jZV90ZXh0PVx1ZDMyOFx1ZDBhNFx1YzlkNSBcdWM1NDhcdWIwYjQ6DQotcHJlc2VudGF0aW9uTmFtZV90ZXh0PVx1ZDQ1Y1x1YzJkYyBcdWM3NzRcdWI5ODQ6DQotcHJvbXB0Zm9ybGliYXJ5X3RleHQ9XHVjMmRjXHVjNzkxIFx1YzJkYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1ZDUwNFx1Yjg2Y1x1ZDUwNFx1ZDJiOA0KLWVuYWJsZUhlYWx0aENoZWNrX3RleHQ9XHViMGI0XHViZDgwIFx1YjUxNFx1YmM4NFx1YWRmOCBcdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5DQotcHJvYmxlbV90ZXh0PVx1YmIzOFx1YzgxY1x1YzgxMDoNCi1wdXJwb3NlX3RleHQ9XHViYWE5XHVjODAxOg0KLXJlYXNvbkZvck5vdE5lZWRpbmdfdGV4dD1cdWQ1NDRcdWM2OTQgXHVjNWM2XHViMjk0IFx1Yzc3NFx1YzcyMDoNCi1yZXBsYWNlc190ZXh0PVx1YmMxNFx1YWZiOFx1YWUzMA0KLWxvY2FsUmVwbGFjZXNfdGV4dD1Mb2NhbFJlcGxhY2VzDQotcmVwcmVzZW50YXRpb25PcHRpb25zX3RleHQ9XHVkNDVjXHVjMmRjIFx1YzYzNVx1YzE1ODoNCi10ZW1wbGF0ZUZpbGVfdGV4dD1cdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjggXHVkMzBjXHVjNzdjOg0KLXNraWxsc190ZXh0PVx1YzJhNFx1ZDBhYzoNCi1zdGVwc190ZXh0PVx1YjJlOFx1YWNjNDoNCi1zdGVwc19uYW1lX3RleHQ9XHVjNzc0XHViOTg0Og0KLXN0b3BfdGV4dD1cdWM5MTFcdWM5YzANCi1wcmludF90ZXh0PVx1Yzc3OFx1YzFjNA0KLXN5bm9ueW1zX3RleHQ9XHViM2Q5XHVjNzU4XHVjNWI0Og0KLXR5cGVfdGV4dD1cdWM3MjBcdWQ2MTU6DQotY29weV90ZXh0PVx1YmNmNVx1YzBhYw0KLWRlZXBDb3B5X3RleHQ9XHVjODA0XHVjY2I0IFx1YmNmNVx1YzBhYw0KLWJhY2tfdGV4dD1cdWM3NzRcdWM4MDQNCi1uZXdfcGx1Z2luPVx1YzBjOCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotbW92ZT1cdWM3NzRcdWIzZDkuLi4NCi11bmlxdWVJZF90ZXh0PVx1YWNlMFx1YzcyMCBJRDoNCi12YXJpYWJpbGl0eVR5cGVfdGV4dD1cdWJjYzBcdWIzZDkgXHVjNzIwXHVkNjE1Og0KLXZlcnNpb25fdGV4dD1cdWJjODRcdWM4MDQ6DQotDQotIyBCdXR0b24gTGFiZWxzDQotYWRkQnV0dG9uX3RleHQ9XHVjZDk0XHVhYzAwLi4uDQotYXR0YWNoQnV0dG9uX3RleHQ9XHVjY2E4XHViZDgwLi4uDQotYnJvd3NlQnV0dG9uX3RleHQ9XHVjYzNlXHVjNTQ0XHViY2Y0XHVhZTMwLi4uDQotY2hhbmdlVHlwZUJ1dHRvbl90ZXh0PVx1YmNjMFx1YWNiZCBcdWM3MjBcdWQ2MTUuLi4NCi1jbGVhckJ1dHRvbl90ZXh0PVx1YzljMFx1YzZiMFx1YWUzMA0KLWRlbGV0ZUJ1dHRvbl90ZXh0PVx1YzBhZFx1YzgxYw0KLWRldGFjaEJ1dHRvbl90ZXh0PVx1YmQ4NFx1YjlhYw0KLWRpYWdyYW1fc2F2ZUVycm9yPVx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWM4MDBcdWM3YTUgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OCBcdWJjMWNcdWMwZGQNCi1kb3duQnV0dG9uX3RleHQ9XHVjNTQ0XHViNzk4XHViODVjDQotZGlyZWN0b3J5X3RleHQ9XHViNTE0XHViODA5XHVkMWEwXHViOWFjOg0KLW9yZGVyQnV0dG9uX3RleHQ9XHVjMjFjXHVjMTFjIFx1YzljMFx1YzgxNQ0KLWVkaXRCdXR0b25fdGV4dD1cdWQzYjhcdWM5ZDEuLi4NCi1yZW1vdmVCdXR0b25fdGV4dD1cdWM4MWNcdWFjNzANCi1yZW5hbWVBY3Rpb25fdGV4dD1cdWM3NzRcdWI5ODQgXHViYzE0XHVhZmI4XHVhZTMwLi4uDQotcmVtb3ZlX3RleHQ9XHVjODFjXHVhYzcwDQotcmVuYW1lX3RleHQ9XHVjNzc0XHViOTg0IFx1YmMxNFx1YWZiOFx1YWUzMA0KLVNhdmVBc190ZXh0PVx1YjJlNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3M2NcdWI4NWMgXHVjODAwXHVjN2E1DQotc2VsZWN0QnV0dG9uX3RleHQ9XHVjMTIwXHVkMGRkLi4uDQotZGVzZWxlY3RCdXR0b25fdGV4dD1cdWMxMjBcdWQwZGQgXHVjZGU4XHVjMThjDQotdXBCdXR0b25fdGV4dD1cdWM3MDRcdWI4NWMNCi1tYWtlRGVmYXVsdEJ1dHRvbl90ZXh0PVx1YWUzMFx1YmNmOFx1YWMxMlx1YzczY1x1Yjg1YyBcdWMxMjRcdWM4MTUNCi12aWV3SGlzdG9yeUJ1dHRvbl90ZXh0PVx1ZDc4OFx1YzJhNFx1ZDFhMFx1YjlhYyBcdWJjZjRcdWFlMzAuLi4NCi0NCi0jIFJvbGUgRWRpdG9yIFRhc2tzIFBhZ2UNCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25OYW1lPVx1ZDBjMFx1YzJhNFx1ZDA2Yw0KLXJvbGVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM1ZWRcdWQ1NjBcdWM3NDAgXHViMmU0XHVjNzRjIFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1Yzc1OCBcdWMyMThcdWQ1ODlcdWM3OTBcdWM3ODVcdWIyYzhcdWIyZTQuDQotcm9sZVRhc2tzUGFnZV9hdmFpbGFibGVMYWJlbD1cdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTVjIFx1ZDBjMFx1YzJhNFx1ZDA2Yw0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWFlMzBcdWJjZjggXHVjMjE4XHVkNTg5XHVjNzkwOg0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHVjZDk0XHVhYzAwIFx1YzIxOFx1ZDU4OVx1Yzc5MDoNCi1yb2xlVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9XHVhYzFjIFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1YWMwMCBcdWMxMjBcdWQwZGRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBSb2xlIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjOg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjNWVkXHVkNTYwXHVjNzc0IFx1Y2M0NVx1Yzc4NFx1YzljMFx1YjI5NCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1cdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTVjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2M6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWNjNDVcdWM3ODQgXHVjMGFjXHVkNTZkOg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1Yzc3NCBcdWM1ZWRcdWQ1NjBcdWM3NzQgXHVjMjE4XHVkNTg5XHVkNTU4XHViMjk0IFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1Yzc1OCBcdWMwYjBcdWNkOWNcdWJiM2NcdWM3NzggXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYzoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNzc0IFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIFJvbGUgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPVx1YzU0OFx1YjBiNA0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1YzU0OFx1YjBiNCBcdWQ2MTVcdWMyZGRcdWM3M2NcdWI4NWMgXHVjZDk0XHVhYzAwIFx1YzgxNVx1YmNmNFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHViOWMxXHVkMDZjXHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2xlR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjNTQ4XHViMGI0Og0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWM1NDhcdWIwYjQ6DQotcm9sZUd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWM1NDhcdWIwYjRcdWFjMDAgXHVjMTIwXHVkMGRkXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgUm9sZSBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYzoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM1ZWRcdWQ1NjBcdWM3NzQgXHVjMThkXHVkNTU4XHViMjk0IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhY1x1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjg6DQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1cdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1ODoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4Og0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1ODoNCi0NCi0jIFRhc2sgRWRpdG9yIFJvbGVzIFBhZ2UNCi10YXNrUm9sZXNQYWdlX3NlY3Rpb25OYW1lPVx1YzVlZFx1ZDU2MA0KLXRhc2tSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWQwYzBcdWMyYTRcdWQwNmNcdWI5N2MgXHVjMjE4XHVkNTg5XHVkNTYwIFx1YzVlZFx1ZDU2MFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdGFza1JvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTVjIFx1YzVlZFx1ZDU2MDoNCi10YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHVhZTMwXHViY2Y4IFx1YzIxOFx1ZDU4OVx1Yzc5MDoNCi10YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1Y2Q5NFx1YWMwMCBcdWMyMThcdWQ1ODlcdWM3OTA6DQotdGFza1JvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWM1ZWRcdWQ1NjBcdWM3NzQgXHVjMTIwXHVkMGRkXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLXRhc2tSb2xlc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9tb2RpZnlfbWVzc2FnZT1JVVBBMDAwNDVXOiBcdWFlMzBcdWJjZjggXHVjMjE4XHVkNTg5XHVjNzkwXHViOTdjICcnezB9JycoXHVjNzNjKVx1Yjg1YyBcdWJjMTRcdWFmYjhcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotdGFza1JvbGVzUGFnZV9jb25maXJtX3RpdGxlPVx1YWUzMFx1YmNmOCBcdWM1ZWRcdWQ1NjAgXHViY2MwXHVhY2JkIFx1ZDY1NVx1Yzc3OA0KLQ0KLSMgVGFzayBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVkMGMwXHVjMmE0XHVkMDZjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3ODVcdWI4MjUgXHViYzBmIFx1Y2Q5Y1x1YjgyNSBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1cdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTVjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVx1ZDU0NFx1YzIxOCBcdWM3ODVcdWI4MjU6DQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHVjMTIwXHVkMGRkXHVjODAxIFx1Yzc4NVx1YjgyNToNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMz1cdWNkOWNcdWI4MjU6DQotdGFza1dvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzY1x1Yzc3NCBcdWMxMjBcdWQwZGRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBUYXNrIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1cdWM1NDhcdWIwYjQNCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM1NDhcdWIwYjQgXHVkNjE1XHVjMmRkXHVjNzNjXHViODVjIFx1Y2Q5NFx1YWMwMCBcdWM4MTVcdWJjZjRcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YjljMVx1ZDA2Y1x1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdGFza0d1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1cdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTVjIFx1YzU0OFx1YjBiNDoNCi10YXNrR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9XHVjNTQ4XHViMGI0Og0KLXRhc2tHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVjNTQ4XHViMGI0XHVhYzAwIFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIFRhc2sgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1cdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWQwYzBcdWMyYTRcdWQwNmNcdWFjMDAgXHVjMThkXHVkNTU4XHViMjk0IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhY1x1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzZkMFx1Y2U1OQ0KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9XHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWM2ZDBcdWNlNTk6DQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYyBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4Og0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBUYXNrcyBQYWdlDQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbk5hbWU9XHVkMGMwXHVjMmE0XHVkMDZjDQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNzQwIFx1YjJlNFx1Yzc0YyBcdWQwYzBcdWMyYTRcdWQwNmNcdWM3NTggXHVjNzg1XHViODI1IFx1YjYxMFx1YjI5NCBcdWNkOWNcdWI4MjVcdWM3ODVcdWIyYzhcdWIyZTQuDQotV29ya1Byb2R1Y3RfVGFza3NfQXZhaWxhYmxlTGFiZWw9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWQwYzBcdWMyYTRcdWQwNmMNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsPVx1ZDU0NFx1YzIxOCBcdWM3ODVcdWI4MjU6DQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDI9XHVjMTIwXHVkMGRkXHVjODAxIFx1Yzc4NVx1YjgyNToNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMz1cdWNkOWNcdWI4MjU6DQotV29ya1Byb2R1Y3RfVGFza3NfTXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVkMGMwXHVjMmE0XHVkMDZjXHVhYzAwIFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgUm9sZXMgUGFnZQ0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVx1YzVlZFx1ZDU2MA0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWIyZTRcdWM3NGMgXHVjNWVkXHVkNTYwXHVjNWQwXHVjMTFjIFx1Yzc3NCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNWQwIFx1YjMwMFx1ZDU3NCBcdWNjNDVcdWM3ODRcdWM3NDQgXHVjOWMwXHVhYzcwXHViMDk4IFx1YzIxOFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjNWVkXHVkNTYwDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWNjNDVcdWM3ODRcdWM3NDQgXHViOWUxXHVjNzQwIFx1YzVlZFx1ZDU2MDoNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdWMyMThcdWM4MTUgXHVhZDhjXHVkNTVjXHVjNzc0IFx1Yzc4OFx1YjI5NCBcdWM1ZWRcdWQ1NjA6DQotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVjNWVkXHVkNTYwXHVjNzc0IFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIyBXb3JrIFByb2R1Y3QgRWRpdG9yIERlbGl2ZXJhYmxlIFBhcnRzIFBhZ2UNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25OYW1lPVx1Yzc3OFx1YjNjNFx1YmIzYyBcdWQzMGNcdWQyYjgNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjNzc4XHViM2M0XHViYjNjXHVjNzQ0IFx1YWQ2Y1x1YzEzMVx1ZDU1OFx1YjI5NCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1Yzc3OFx1YjNjNFx1YmIzYyBcdWQzMGNcdWQyYjhcdWI4NWMgXHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjOg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWM3NzhcdWIzYzRcdWJiM2MgXHVkMzBjXHVkMmI4XHVjNzc4IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2M6DQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNzc0IFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPVx1YzU0OFx1YjBiNA0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM1NDhcdWIwYjQgXHVkNjE1XHVjMmRkXHVjNzNjXHViODVjIFx1Y2Q5NFx1YWMwMCBcdWM4MTVcdWJjZjRcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YjljMVx1ZDA2Y1x1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWM1NDhcdWIwYjQ6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWM1NDhcdWIwYjQ6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVjNTQ4XHViMGI0XHVhYzAwIFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1cdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzY1x1Yzc3NCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjXHViOTdjIFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YjNjNFx1YmE1NFx1Yzc3OA0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1Og0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwzPVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYyBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4Og0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWIzYzRcdWJhNTRcdWM3Nzg6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1YzcyMFx1ZDYxNToNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzPVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYyBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4Og0KLQ0KLSMgUHJhY3RpY2UgRWRpdG9yIFJlZmVyZW5jZXMgUGFnZQ0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbk5hbWU9XHVjZWU4XHVkMTUwXHVjZTIwIFx1YzY5NFx1YzE4Yw0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWMwYWNcdWI4NDBcdWI4NWMgXHVjYzM4XHVjODcwXHViNDE4XHViMjk0IFx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWM2OTRcdWMxOGNcdWI5N2MgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVjZWU4XHVkMTUwXHVjZTIwIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWMxMjBcdWQwZGRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBDYXRlZ29yeSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZT1cdWM1NDhcdWIwYjQNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCB7MH1cdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjNTQ4XHViMGI0Og0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPVx1YzU0OFx1YjBiNDoNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVjNTQ4XHViMGI0XHVhYzAwIFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIERpc2NpcGxpbmUgR3JvdXBpbmcgRWRpdG9yIERpc2NpcGxpbmVzIFBhZ2UNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbk5hbWU9XHVjNmQwXHVjZTU5DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjNmQwXHVjZTU5IFx1YWRmOFx1YjhmOVx1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjNmQwXHVjZTU5XHVjNzQ0IFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWM2ZDBcdWNlNTk6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHVjNmQwXHVjZTU5Og0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWM2ZDBcdWNlNTlcdWM3NzQgXHVjMTIwXHVkMGRkXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfVXNlRGVmYXVsdERpcmVjdG9yeUJ1dHRvbkxhYmVsPVx1YWUzMFx1YmNmOCBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWMgXHVjMGFjXHVjNmE5DQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBUYXNrcyBQYWdlDQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1cdWQwYzBcdWMyYTRcdWQwNmMNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjNmQwXHVjZTU5XHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWQwYzBcdWMyYTRcdWQwNmNcdWI5N2MgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWQwYzBcdWMyYTRcdWQwNmM6DQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsPVx1ZDBjMFx1YzJhNFx1ZDA2YzoNCi1kaXNjaXBsaW5lVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9XHVhYzFjIFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1YWMwMCBcdWMxMjBcdWQwZGRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBSZWZlcmVuY2UgV29ya2Zsb3cgUGFnZQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbk5hbWU9XHVjYzM4XHVjODcwIFx1YzZjY1x1ZDA2Y1x1ZDUwY1x1Yjg1Y1x1YzZiMA0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM2ZDBcdWNlNTlcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1Y2MzOFx1Yzg3MCBcdWM2Y2NcdWQwNmNcdWQ1MGNcdWI4NWNcdWM2YjBcdWI5N2MgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWNjMzhcdWM4NzAgXHVjNmNjXHVkMDZjXHVkNTBjXHViODVjXHVjNmIwOg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWNjMzhcdWM4NzAgXHVjNmNjXHVkMDZjXHVkNTBjXHViODVjXHVjNmIwOg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVjYzM4XHVjODcwIFx1YzZjY1x1ZDA2Y1x1ZDUwY1x1Yjg1Y1x1YzZiMFx1YWMwMCBcdWMxMjBcdWQwZGRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBEb21haW4gRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWIzYzRcdWJhNTRcdWM3NzhcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2NcdWM3NDQgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjOg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjOg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzY1x1Yzc3NCBcdWMxMjBcdWQwZGRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBXb3JrIFByb2R1Y3QgS2luZCBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHVjNzc0IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1XHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNzQ0IFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYzoNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYzoNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9XHVhYzFjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2NcdWM3NzQgXHVjMTIwXHVkMGRkXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPVx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjgNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4IFx1YWRmOFx1YjhmOVx1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiODoNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4Og0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4XHVhYzAwIFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIFJvbGUgU2V0IEVkaXRvciBSb2xlcyBQYWdlDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1cdWM1ZWRcdWQ1NjANCi1yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOFx1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjNWVkXHVkNTYwXHVjNzQ0IFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2xlU2V0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjNWVkXHVkNTYwOg0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWM1ZWRcdWQ1NjA6DQotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWM1ZWRcdWQ1NjBcdWM3NzQgXHVjMTIwXHVkMGRkXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgVG9vbCBFZGl0b3IgVG9vbCBNZW50b3JzIFBhZ2UNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25OYW1lPVx1YjNjNFx1YWQ2YyBcdWMwYWNcdWM2YTkgXHViM2M0XHVjNmMwXHViOWQwDQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHVjNzc0IFx1YjNjNFx1YWQ2Y1x1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDBcdWM3NDQgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRvb2xUb29sTWVudG9yc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5IFx1YjNjNFx1YzZjMFx1YjlkMDoNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw9XHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDA6DQotdG9vbFRvb2xNZW50b3JzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5IFx1YjNjNFx1YzZjMFx1YjlkMFx1Yzc3NCBcdWMxMjBcdWQwZGRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBDdXN0b20gQ2F0ZWdvcnkgRWRpdG9yIEFzc2lnbiBQYWdlDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lPVx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWM2OTRcdWMxOGMNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhY1x1Yjk3YyBcdWFkNmNcdWMxMzFcdWQ1NThcdWIyOTQgXHVjZWU4XHVkMTUwXHVjZTIwIFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjZWU4XHVkMTUwXHVjZTIwIFx1YzY5NFx1YzE4YzoNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjOg0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjXHVhYzAwIFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIE5ldyBNZXRob2QgUGx1Zy1pbiBXaXphcmQNCi1uZXdQbHVnaW5XaXphcmRfdGl0bGU9XHVjMGM4IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzgNCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlPVx1YzBjOCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4IFx1Yzc5MVx1YzEzMQ0KLW5ld1BsdWdpbldpemFyZFBhZ2VfdGV4dD1cdWMwYzggXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzc0XHViOTg0XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YWNlMCBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1uZXdQbHVnaW5FcnJvcl9tc2c9SVVQQTAwMjFFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzQ0IFx1Yzc5MVx1YzEzMVx1ZDU1OFx1YzljMCBcdWJhYmJcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotbmV3UGx1Z2luRXJyb3JfcmVhc29uPVx1YjBiNFx1YmQ4MCBcdWM2MjRcdWI5NTggXG5cDQotXG5cDQotXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWJjZjRcdWI4MjRcdWJhNzQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkXHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIEdlbmVyaWMgZGlhbG9nIHRpdGxlcw0KLWNyZWF0ZURpYWxvZ190aXRsZT1cdWM2OTRcdWMxOGMgXHVjNzkxXHVjMTMxDQotZGVsZXRlRGlhbG9nX3RpdGxlPVx1YzY5NFx1YzE4YyBcdWMwYWRcdWM4MWMNCi1lZGl0RGlhbG9nX3RpdGxlPVx1YzY5NFx1YzE4YyBcdWQzYjhcdWM5ZDENCi1lcnJvckRpYWxvZ190aXRsZT1cdWM2MjRcdWI5NTgNCi1tb3ZlRGlhbG9nX3RpdGxlPVx1YzY5NFx1YzE4YyBcdWM3NzRcdWIzZDkNCi1yZW5hbWVEaWFsb2dfdGl0bGU9XHVjNjk0XHVjMThjIFx1Yzc3NFx1Yjk4NCBcdWJjMTRcdWFmYjhcdWFlMzANCi13YXJuaW5nRGlhbG9nX3RpdGxlPVx1YWNiZFx1YWNlMA0KLQ0KLSMgQWRkIENvbmZpZ3VyYXRpb24gdG8gUHJvY2VzcyBFcnJvciBEaWFsb2cNCi1hZGRDb25maWdFcnJvckRpYWxvZ190aXRsZT1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWM1ZDAgXHVhZDZjXHVjMTMxIFx1Y2Q5NFx1YWMwMA0KLQ0KLSMgU2V0IERlZmF1bHQgQ29uZmlndXJhdGlvbiBFcnJvciBEaWFsb2cNCi1zZXREZWZhdWx0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWFlMzBcdWJjZjggXHVhZDZjXHVjMTMxIFx1YzEyNFx1YzgxNQ0KLQ0KLSMgRWRpdCBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlPVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWM2OTRcdWMxOGMgXHVkM2I4XHVjOWQxDQotDQotIyBPcGVuIExpYnJhcnkgRGlhbG9nDQotb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU9XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWM1ZjRcdWFlMzANCi1vcGVuTGlicmFyeURpYWxvZ190ZXh0PVx1ZDYwNFx1YzdhYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVhYzAwIFx1YzgxY1x1YjMwMFx1Yjg1YyBcdWM4MDBcdWM3YTVcdWI0MThcdWM5YzAgXHVjNTRhXHVjNTU4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM2MjRcdWI5NThcdWI5N2MgXHViYjM0XHVjMmRjXHVkNTU4XHVhY2UwIFx1YWNjNFx1YzE4ZFx1ZDU3NFx1YzExYyBcdWIyZTRcdWI5NzggXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzVlY1x1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCi0NCi0jIFNhdmUgTGlicmFyeSBEaWFsb2cNCi1zYXZlTGlicmFyeURpYWxvZ190aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YzgwMFx1YzdhNQ0KLXNhdmVMaWJyYXJ5RGlhbG9nX3RleHQ9XHVkNjA0XHVjN2FjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWFjMDAgXHVjMjE4XHVjODE1XHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LiBcdWJjYzBcdWFjYmRcdWMwYWNcdWQ1NmRcdWM3NDQgXHVjODAwXHVjN2E1XHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjNWM1XHVhZGY4XHViODA4XHVjNzc0XHViNGRjDQotDQotIyBEZWxldGUgRWxlbWVudCBSZWZlcmVuY2UgRGlhbG9nDQotZGVsZXRlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD0nJ3swfScnIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWM3NzRcdWJiZjggXHVjMGFkXHVjODFjXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3NzRcdWI5N2MgJyd7MX0nJ1x1YzVkMFx1YzExYyBcdWM4MWNcdWFjNzBcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotDQotIyBFcnJvciBNZXNzYWdlcw0KLW5vT3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDBFOiBcdWM1ZjRcdWI4MjQgXHVjNzg4XHViMjk0IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWFjMDAgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1YzBjOCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjXHViOTdjIFx1Y2Q5NFx1YWMwMFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzVmNFx1YzViNFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuXG5cDQotXG5cDQotXHVjMGM4IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjNzkxXHVjMTMxXHVkNTU4XHVhYzcwXHViMDk4IFx1YWUzMFx1Yzg3NCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzVmNFx1YWNlMCBcdWIyZTRcdWMyZGMgXHVjMmRjXHViM2M0XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDFFOiB7MH0gXHVjNzc0XHViOTg0XHVjNzc0IFx1YjIwNFx1Yjc3ZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC5cblwNCi1cblwNCi1cdWJhYThcdWI0ZTAgXHViYTU0XHVjMThjXHViNGRjIFx1YmMwZiBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVjNjk0XHVjMThjXHVjNWQwXHViMjk0IFx1Yzc3NFx1Yjk4NFx1Yzc3NCBcdWM3ODhcdWM1YjRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1ZDY1NVx1Yzc3OFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWFjZTAgXHVjNjk0XHVjMThjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM2MmNcdWJjMTRcdWI5NzggXHVjNzc0XHViOTg0XHVjNzQ0IFx1Yzc4NVx1YjgyNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBBMDAwMkU6IFx1Yzc3NFx1Yjk4NFx1Yzc3NCAnJ3swfScnXHVjNzc4IFx1ZDU2ZFx1YmFhOVx1Yzc3NCBcdWM3NzRcdWJiZjggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWM2OTRcdWMxOGNcdWM1ZDAgXHVhY2UwXHVjNzIwXHVkNTVjIFx1Yzc3NFx1Yjk4NFx1Yzc3NCBcdWM3ODhcdWM1YjRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1ZDY1NVx1Yzc3OFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWFjZTAgXHVjNjk0XHVjMThjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWIyZTRcdWI5NzggXHVjNzc0XHViOTg0XHVjNzQ0IFx1Yzc4NVx1YjgyNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1jcmVhdGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDNFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWRlbGV0ZUNvbmZpZ0Vycm9yX21zZz1JVVBBMDAwNFc6IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzFcdWM3NDQgXHVjMGFkXHVjODFjXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotaW50ZXJuYWxFcnJvcl9tc2c9SVVQQTAwMDVFOiBcdWIwYjRcdWJkODAgXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC5cblwNCi1cblwNCi1cdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YmNmNFx1YjgyNFx1YmE3NCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWludmFsaWRQcmVzZW50YXRpb25OYW1lRXJyb3JfbXNnPUlVUEEwMDA2RTogXHVjOWMwXHVjODE1XHVkNTVjIFx1ZDQ1Y1x1YzJkYyBcdWM3NzRcdWI5ODRcdWM3NzQgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC5cblwNCi1cblwNCi1cdWQ2NTVcdWM3NzhcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVhY2UwIFx1YjJlNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjNzg1XHViODI1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWludmFsaWRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDdFOiBcdWMxMjBcdWQwZGRcdWQ1NWMgXHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMSAnJ3swfScnXHVjNzc0KFx1YWMwMCkgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1YWUzMFx1YmNmOCBcdWFkNmNcdWMxMzFcdWM3NTggXHVjMTFjXHViZTBjXHVjMTM4XHVkMmI4XHVhYzAwIFx1YzU0NFx1YjJkOVx1YjJjOFx1YjJlNC5cblwNCi1cblwNCi1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWM3NTggXHViYjM0XHVhY2IwXHVjMTMxXHVjNzQ0IFx1YzcyMFx1YzljMFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWM3NTggXHVhZTMwXHViY2Y4IFx1YWQ2Y1x1YzEzMVx1Yzc3NCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWM2NDAgXHVjNWYwXHVhZDAwXHViNDFjIFx1YjJlNFx1Yjk3OCBcdWJhYThcdWI0ZTAgXHVhZDZjXHVjMTMxXHVjNzU4IFx1YzBjMVx1YzcwNCBcdWMxMzhcdWQyYjhcdWM1ZWNcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1YjJlNFx1Yjk3OCBcdWFkNmNcdWMxMzFcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVhYzcwXHViMDk4IFx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWFkNmNcdWMxMzFcdWM3NTggXHVjZWU4XHVkMTUwXHVjZTIwXHViOTdjIFx1ZDNlY1x1ZDU2OFx1ZDU1OFx1YjNjNFx1Yjg1ZCBcdWFlMzBcdWJjZjggXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzIxOFx1YzgxNVx1ZDU1OFx1YWNlMCBcdWIyZTRcdWMyZGMgXHVjMmRjXHViM2M0XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXNldERlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDhFOiBcdWMxMjBcdWQwZGRcdWQ1NWMgXHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMSAnJ3swfScnXHVjNzc0KFx1YWMwMCkgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVjNWQwXHVjMTFjIFx1Y2MzOFx1Yzg3MFx1ZDU1OFx1YjI5NCBcdWIyZTRcdWI5NzggXHVhZDZjXHVjMTMxXHVjNzU4IFx1YzBjMVx1YzcwNCBcdWMxMzhcdWQyYjhcdWFjMDAgXHVjNTQ0XHViMmQ5XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yzc1OCBcdWJiMzRcdWFjYjBcdWMxMzFcdWM3NDQgXHVjNzIwXHVjOWMwXHVkNTU4XHViODI0XHViYTc0IFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yzc1OCBcdWFlMzBcdWJjZjggXHVhZDZjXHVjMTMxXHVjNzc0IFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1YzY0MCBcdWM1ZjBcdWFkMDBcdWI0MWMgXHViMmU0XHViOTc4IFx1YmFhOFx1YjRlMCBcdWFkNmNcdWMxMzFcdWM3NTggXHVjMGMxXHVjNzA0IFx1YzEzOFx1ZDJiOFx1YzVlY1x1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuXG5cDQotXG5cDQotXHViMmU0XHViOTc4IFx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWFjNzBcdWIwOTggXHVjMTIwXHVkMGRkXHVkNTVjIFx1YWQ2Y1x1YzEzMVx1Yzc1OCBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgXHVjMjE4XHVjODE1XHVkNTU4XHVhY2UwIFx1YjJlNFx1YzJkYyBcdWMyZGNcdWIzYzRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotb3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDlFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1Yjg1Y1x1YjRkY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHViY2Y0XHViODI0XHViYTc0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotc2F2ZUxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTBFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzgwMFx1YzdhNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXNhdmVMaWJyYXJ5VG9FcnJvcl9tc2c9SVVQQTAwMTBFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjICcnezB9JycoXHVjNzNjKVx1Yjg1YyBcdWM4MDBcdWM3YTVcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1lbGVtZW50QWxyZWFkeURlbGV0ZWRFcnJvcl9tc2c9SVVQQTAwMTFFOiAnJ3swfScnIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWM3NzRcdWJiZjggXHVjMGFkXHVjODFjXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEyRTogXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM1YzVcdWFkZjhcdWI4MDhcdWM3NzRcdWI0ZGNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQQTAwMTZFOiBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHViY2Y0XHViODI0XHViYTc0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotaW50ZXJuYWxFcnJvcl9yZWFzb249SVVQQTAwMTdFOiBcdWIwYjRcdWJkODAgXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC5cblwNCi1cblwNCi1cdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YmNmNFx1YjgyNFx1YmE3NCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE4RTogXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWM2OTRcdWMxOGNcdWI5N2MgXHViODVjXHViNGRjXHVkNTU4XHViMjk0IFx1YzkxMVx1YzVkMCBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHViY2Y0XHViODI0XHViYTc0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotc2F2ZVVwZ3JhZGVkTGlicmFyeUVycm9yX3JlYXNvbj1JVVBBMDAxOUU6IFx1YzVjNVx1YWRmOFx1YjgwOFx1Yzc3NFx1YjRkY1x1YjQxYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzgwMFx1YzdhNVx1ZDU1OFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC5cblwNCi1cblwNCi1cdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YmNmNFx1YjgyNFx1YmE3NCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzVlY1x1YjI5NCBcdWM5MTEuLi4NCi1zYXZpbmdMaWJyYXJ5VGFza19uYW1lPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjODAwXHVjN2E1IFx1YzkxMS4uLg0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM1YzVcdWFkZjhcdWI4MDhcdWM3NzRcdWI0ZGNcdWQ1NThcdWIyOTQgXHVjOTExLi4uDQotbG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2tfbmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWI4NWNcdWI0ZGNcdWQ1NThcdWIyOTQgXHVjOTExLi4uDQotc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZT1cdWMwYzggXHVkMzBjXHVjNzdjIFx1ZDYxNVx1YzJkZFx1YzczY1x1Yjg1YyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWM4MDBcdWM3YTVcdWQ1NThcdWIyOTQgXHVjOTExLi4uDQotc2F2aW5nVGFza19uYW1lPScnezB9JydcdWM3NDQoXHViOTdjKSBcdWM4MDBcdWM3YTVcdWQ1NThcdWIyOTQgXHVjOTExLi4uDQotc2F2aW5nRmlsZXNUYXNrX25hbWU9XHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzgwMFx1YzdhNVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1maXhpbmdDb250ZW50RGVzY3JpcHRpb25HVUlEc1Rhc2tfbmFtZT1cdWNlZThcdWQxNTBcdWNlMjAgXHVjMTI0XHViYTg1IEdVSURcdWI5N2MgXHVjMjE4XHVjODE1XHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLWRlbGV0aW5nSW52YWxpZFJlZmVyZW5jZXNUYXNrX25hbWU9XHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWNjMzhcdWM4NzBcdWI5N2MgXHVjMGFkXHVjODFjXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IFx1Yzc3NCBQZXJzcGVjdGl2ZVx1YjI5NCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YzY5NFx1YzE4Y1x1YjRlNFx1Yzc0NCBIVE1MIFx1ZDYxNVx1YzJkZFx1YzczY1x1Yjg1YyBcdWJjZmMgXHVjMjE4IFx1Yzc4OFx1YWM4YyBcdWQ1NThcdWM1ZWMgXHVjMGFjXHVjNmE5XHVjNzkwXHVjNzU4IFx1YWNiZFx1ZDVkOFx1Yzc0NCBcdWFkZjlcdWIzMDBcdWQ2NTRcdWQ1NjAgXHVjMjE4IFx1Yzc4OFx1YjNjNFx1Yjg1ZCBcdWQyYjlcdWMyMTggXHVjMTI0XHVhY2M0XHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM1ZWNcdWFlMzBcdWM1ZDBcdWIyOTQgXHVkM2I4XHVjOWQxXHVhZTMwXHViOTdjIFx1Y2Q5NFx1YWMwMFx1ZDU1OFx1YWM3MFx1YjA5OCBcdWQ0NWNcdWMyZGNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIENoYW5nZSBIaXN0b3J5IERpYWxvZw0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfdGl0bGU9XHVjMTI0XHViYTg1IFx1YmNjMFx1YWNiZCBcdWQ3ODhcdWMyYTRcdWQxYTBcdWI5YWMNCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsPVx1YmNjMFx1YWNiZCBcdWQ3ODhcdWMyYTRcdWQxYTBcdWI5YWM6DQotDQotIyBNZXRob2QgRWxlbWVudCBEZWxldGUgQWN0aW9uDQotY29uZmlybURlbGV0ZURpYWxvZ190aXRsZT1cdWMwYWRcdWM4MWMgXHVkNjU1XHVjNzc4DQotY29uZmlybURlbGV0ZURpYWxvZ19tc2c9Jyd7MH0nJyBcdWQ1NmRcdWJhYTlcdWM3NDQgXHVjMGFkXHVjODFjXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnV2l0aFJlZmVyZW5jZT0nJ3swfScnIFx1ZDU2ZFx1YmFhOVx1Yzc0NCBcdWMwYWRcdWM4MWNcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/XG5cDQotXG5cDQotezF9IFx1YzY5NFx1YzE4Y1x1YzVkMCBcdWMwYWRcdWM4MWNcdWQ1NjAgXHVkNTZkXHViYWE5XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWNjMzhcdWM4NzBcdWFjMDAgXHVkM2VjXHVkNTY4XHViNDE4XHVjNWI0IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIE5ldyBMaWJyYXJ5IERpYWxvZw0KLWVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjJFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjICcnezB9JydcdWM3NDQoXHViOTdjKSBcdWM3OTFcdWMxMzFcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1lcnJvckRpYWxvZ19lcnJvcj1cdWIyZTRcdWI5NzggXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWIwYjRcdWM1ZDAgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM3OTFcdWMxMzFcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1lcnJfbm9vcGVubGlicmFyeT1JVVBBMDA0MEU6IFx1YzVmNFx1YjgyNCBcdWM3ODhcdWIyOTQgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YWMwMCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cDQotXG5cDQotXHVjMGM4IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVjZDk0XHVhYzAwXHVkNTU4XHViODI0XHViYTc0IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjNWY0XHVjNWI0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC5cblwNCi1cblwNCi1cdWMwYzggXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM3OTFcdWMxMzFcdWQ1NThcdWFjNzBcdWIwOTggXHVhZTMwXHVjODc0IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjNWY0XHVhY2UwIFx1YjJlNFx1YzJkYyBcdWMyZGNcdWIzYzRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZXJyX2xvYWRpbmdsaWJyYXJ5PVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWI4NWNcdWI0ZGNcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OCBcdWJjMWNcdWMwZGQNCi1tc2dfcmVsb2FkTGlicmFyeT1cdWMyZTRcdWQzMjhcdWQ1NWMgXHVjMGFkXHVjODFjXHViOTdjIFx1YzJlNFx1ZDU4OSBcdWNkZThcdWMxOGNcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1ZDYwNFx1YzdhYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YjJlNFx1YzJkYyBcdWI4NWNcdWI0ZGNcdWQ1NzRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0Lg0KLQ0KLSMgUmVsb2FkIExpYnJhcnkgRGlhbG9nDQotcmVsb2FkRGlhbG9nX21lc3NhZ2U9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzZkMFx1Yjc5OCBcdWMwYzFcdWQwZGNcdWI4NWMgXHViY2Y1XHVjNmQwXHVkNTU4XHViODI0XHViYTc0IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWIyZTRcdWMyZGMgXHViODVjXHViNGRjXHVkNTc0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC4NCi1yZWxvYWREaWFsb2dfdGl0bGU9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YjJlNFx1YzJkYyBcdWI4NWNcdWI0ZGMNCi1kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JUaXRsZT1cdWM3NzRcdWIzZDkgXHVjNjI0XHViOTU4DQotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yTWVzc2FnZT1cdWM3NzRcdWIzZDkgXHVjOTExIFx1YzYyNFx1Yjk1OA0KLQ0KLSMgUHJvY2VzcyBGb3JtIEVkaXRvcg0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZT1cdWM4MDBcdWM3YTUNCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTE9XHVjNzc0IFx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1Yzc0MCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWM3NTggXHViYWE4XHViNGUwIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOFx1YzVkMCBcdWM2MDFcdWQ1YTVcdWM3NDQgXHViYmY4XHVjZTY5XHViMmM4XHViMmU0LiBcdWJjYzBcdWFjYmQgXHVkNmM0IFx1ZDNiOFx1YzlkMVx1YWUzMFx1YWMwMCBcdWM4MDBcdWM3YTVcdWI0MjlcdWIyYzhcdWIyZTQuIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTI9XHViY2MwXHVhY2JkIFx1ZDZjNCBcdWQzYjhcdWM5ZDFcdWFlMzBcdWFjMDAgXHVjODAwXHVjN2E1XHViNDI5XHViMmM4XHViMmU0LiBcdWFjYzRcdWMxOGRcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotDQotIyBDb25maWd1cmF0aW9uIFZpZXcgUGFnZQ0KLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ190aXRsZT1cdWM4MWNcdWFjNzAgXHVkNjU1XHVjNzc4DQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX21lc3NhZ2U9Jyd7MH0nJyBcdWJjZjRcdWFlMzBcdWI5N2MgXHVjODFjXHVhYzcwXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ190aXRsZT1cdWFjYmRcdWFjZTANCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uPVx1YWQ2Y1x1YzEzMToNCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3M9XHVhZDZjXHVjMTMxIFx1YmNmNFx1YWUzMA0KLWNvbmZpZ1ZpZXdQYWdlX3ZpZXdzPVx1YmNmNFx1YWUzMA0KLWNvbHVtbnNlbGVjdGlvbl90ZXh0PVx1YzVmNCBcdWMxMjBcdWQwZGRcdWMwYWNcdWQ1NmQ6DQotY29uZmlnVmlld1BhZ2VfYWRkVmlld0J1dHRvblRleHQ9XHViY2Y0XHVhZTMwIFx1Y2Q5NFx1YWMwMC4uLg0KLWNvbmZpZ1ZpZXdQYWdlX3JlbW92ZVZpZXdCdXR0b25UZXh0PVx1YmNmNFx1YWUzMCBcdWM4MWNcdWFjNzANCi1jb25maWdWaWV3UGFnZV9tYWtlRGVmYXVsdEJ1dHRvblRleHQ9XHVhZTMwXHViY2Y4XHVhYzEyXHVjNzNjXHViODVjIFx1YzEyNFx1YzgxNQ0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlPUlVUEEwMDIzVzogXHVjNzc0XHViOTg0XHVjNzc0ICcnezB9JydcdWM3NzggXHViY2Y0XHVhZTMwXHVhYzAwIFx1Yzc3NFx1YmJmOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uVGl0bGU9XHVhY2Y1XHVhYzFjXHViNDFjIFx1ZDBkMFx1YzBjOSBcdWJjZjRcdWFlMzANCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25NZXNzYWdlPVx1Yzc3NCBcdWFkNmNcdWMxMzFcdWM3NDQgXHVhY2Y1XHVhYzFjXHVkNTYwIFx1YjU0YyBcdWQzZWNcdWQ1NjhcdWI0MThcdWIyOTQgXHViY2Y0XHVhZTMwXHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gXHViY2Y0XHVhZTMwXHViOTdjIFx1Yzc5MVx1YzEzMVx1ZDU1OFx1YjgyNFx1YmE3NCBcdWJjZjRcdWFlMzAgXHVjZDk0XHVhYzAwXHViOTdjIFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzVlYyBcdWFkNmNcdWMxMzEgXHViMGI0IFx1ZDQ1Y1x1YzkwMCBcdWI2MTBcdWIyOTQgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWNcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWMxMjBcdWQwZGRcdWQ1NWMgXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjXHVjNWQwXHVjMTFjIFx1YmNmNFx1YWUzMFx1Yjk3YyBcdWQ0NWNcdWMyZGNcdWQ1NThcdWFjZTAgXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjXHVjNzU4IFx1ZDU1OFx1YzcwNCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWNcdWM2NDAgXHVjZWU4XHVkMTUwXHVjZTIwIFx1YzY5NFx1YzE4Y1x1YzVkMFx1YzExYyBcdWJjZjRcdWFlMzBcdWM3NTggXHVkMmI4XHViOWFjIFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWQ0NWNcdWMyZGNcdWQ1NjlcdWIyYzhcdWIyZTQuDQotDQotIyBEZXNjcmlwdGlvbiBUYWINCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZT1cdWM1NDhcdWIwYjQgXHViY2MwXHVkNjU4DQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTE9SVVQQTAwNDBXOiBcdWJhM2NcdWM4MDAgXHVkM2I4XHVjOWQxXHVhZTMwXHViOTdjIFx1YzgwMFx1YzdhNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMj1cdWM3NzQgXHVjNzIwXHVkNjE1XHVjNWQwIFx1YjMwMFx1ZDU3NCBcdWQ2MzhcdWQ2NTggXHVhYzAwXHViMmE1XHVkNTVjIFx1YzU0OFx1YjBiNFx1YWMwMCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZT1cdWQ2NWNcdWIzZDkgXHViY2MwXHVkNjU4DQotIyBBc3NvY2lhdGlvbiBGb3JtIFBhZ2UNCi1Bc3NvY2lhdGlvbkZvcm1QYWdlX0JyaWVmRGVzY3JpcHRpb25MYWJlbD1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVjNjk0XHVjMThjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWFjMDRcdWI3YjVcdWQ1NWMgXHVjMTI0XHViYTg1Og0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVzY3JpcHRpb24NCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfdGl0bGU9XHVjNjk0XHVjMThjIFx1Yzc3NFx1Yjk4NCBcdWM3ODVcdWI4MjUNCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfbWVzc2FnZT1cdWM3NzRcdWI5ODQgXHVkNTQ0XHViNGRjXHViOTdjIFx1YmU0NFx1YzZjY1x1YjQ1OCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgTWV0aG9kIFBsdWctaW4gRGVzY3JpcHRpb24NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZT0nJ3swfScnIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1YWNmYyBcdWM1ZjBcdWFkMDBcdWI0MWMgXHVjYzM4XHVjODcwXHViNDFjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc1OCBcdWMxMjBcdWQwZGRcdWM3NDQgXHVjZGU4XHVjMThjXHVkNTU4XHViYTc0IFx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWM3NDAgXHVhZDAwXHVhY2M0XHVhYzAwIFx1YzBkZFx1YzEzMVx1YjQxOFx1YWNlMCBcdWMwYWRcdWM4MWNcdWI0MjlcdWIyYzhcdWIyZTQuXG5cDQotXG5cDQotXHVjNzc0IFx1Yzg3MFx1Y2U1OFx1YjI5NCBcdWMyZTRcdWQ1ODkgXHVjZGU4XHVjMThjXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yzc3NCBcdWJjYzBcdWFjYmRcdWM3NDQgXHVhY2M0XHVjMThkXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lPVx1Yzc3NCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzU4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCAnJ3swfScnXHVjNWQwXHVjMTFjIFx1YzBjOCBcdWM3NzRcdWI5ODQgJyd7MX0nJyhcdWM3M2MpXHViODVjIFx1YmNjMFx1YWNiZFx1ZDU1OFx1YjgyNFx1YWNlMCBcdWQ1NjlcdWIyYzhcdWIyZTQuIFx1YmNjMFx1YWNiZFx1ZDU1OFx1YmE3NCBcdWM3NzQgXHVkM2I4XHVjOWQxXHVhZTMwXHVhYzAwIFx1YzgwMFx1YzdhNVx1YjQxOFx1YWNlMCBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzggXHVkM2Y0XHViMzU0IFx1Yzc3NFx1Yjk4NFx1Yzc3NCBcdWMwYzhcdWI4NWNcdWM2YjQgXHVjNzc0XHViOTg0XHVjNzNjXHViODVjIFx1YmMxNFx1YjAxZFx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lX3RpdGxlPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzggXHVjNzc0XHViOTg0IFx1YmMxNFx1YWZiOFx1YWUzMA0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jYW5ub3RSZW5hbWVQbHVnaW5Gb2xkZXI9XHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4IFx1ZDNmNFx1YjM1NCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjMGM4XHViODVjXHVjNmI0IFx1Yzc3NFx1Yjk4NFx1YzczY1x1Yjg1YyBcdWJjMTRcdWFmYzAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbkxhYmVsPVx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWM3YTBcdWFlMDgNCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbl9tZXNzYWdlPVx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWM3YTBcdWFlMDggXHViY2MwXHVhY2JkXHVjNzQwICcnezB9JycgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWM2OTRcdWMxOGNcdWM3NTggXHVjNWY0XHViOWIwIFx1ZDNiOFx1YzlkMVx1YWUzMFx1Yjk3YyBcdWM4MDBcdWM3YTVcdWQ1NThcdWFjZTAgXHViMmViXHVjMmI1XHViMmM4XHViMmU0LiBcdWM3NzQgXHViY2MwXHVhY2JkXHVjNzQ0IFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCi0NCi0jIFByb2Nlc3MgRGVzY3JpcHRpb24NCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV90aXRsZT1cdWM3NzRcdWI5ODQgXHViYzE0XHVhZmI4XHVhZTMwDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZT1cdWM3NzQgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVjNzU4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWJjYzBcdWFjYmRcdWQ1NThcdWI4MjRcdWFjZTAgXHVkNTY5XHViMmM4XHViMmU0LiBcdWFkZjhcdWI3ZWNcdWJhNzQgXHVjNzc0IFx1ZDNiOFx1YzlkMVx1YWUzMFx1YWMwMCBcdWM4MDBcdWM3YTVcdWI0MThcdWFjZTAgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1ZDNmNFx1YjM1NCBcdWM3NzRcdWI5ODRcdWM3NzQgXHVjMGM4XHViODVjXHVjNmI0IFx1Yzc3NFx1Yjk4NFx1YzczY1x1Yjg1YyBcdWJjMTRcdWIwMWRcdWIyYzhcdWIyZTQuIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbkRlc2NyaXB0aW9uPVx1YzEyNFx1YmE4NToNCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25UaXRsZT1cdWFkNmNcdWMxMzENCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlPVx1Yzc3NCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWM1ZDAgXHVjNjJjXHViYzE0XHViOTc4IFx1YmFhOFx1YjRlMCBcdWFkNmNcdWMxMzFcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWFlMzBcdWJjZjhcdWM3M2NcdWI4NWMgXHVkNTU4XHViMDk4XHVjNzU4IFx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuIFx1YWRmOFx1YjdlY1x1YmE3NCBcdWIyZTRcdWI5NzggXHViYWE4XHViNGUwIFx1YWQ2Y1x1YzEzMVx1Yzc1OCBcdWMwYzFcdWM3MDQgXHVjMTM4XHVkMmI4XHVhYzAwIFx1YjQyMCBcdWQ1NDRcdWM2OTRcdWFjMDAgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9ucz1cdWFkNmNcdWMxMzE6DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ9KFx1YWUzMFx1YmNmOFx1YWMxMikNCi1Qcm9jZXNzRGVzY3JpcHRpb25fc2VsZWN0Q29uZmlndXJhdGlvbj1cdWNkOTRcdWFjMDBcdWQ1NjAgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0MD1cdWM3NzQgXHVjODcwXHVjNzkxXHVjNzQwIFx1ZDYwNFx1YzdhYyBcdWQzYjhcdWM5ZDFcdWFlMzBcdWI5N2MgXHVjODAwXHVjN2E1XHVkNTU4XHVhY2UwIFx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWM2MDFcdWFkNmNcdWM4MDFcdWM3M2NcdWI4NWMgXHViYzE4XHVjNjAxXHVkNTY5XHViMmM4XHViMmU0LiAnJ3swfScnIFx1ZDU2ZFx1YmFhOVx1Yzc0NCBcdWMwYWRcdWM4MWNcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotUHJvY2Vzc0RlbGV0ZUFjdGlvbl9zZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlPVx1YjJlNFx1Yzc0YyBcdWMxMjRcdWJhODVcdWM3OTBcdWIyOTQgXHVjMTIwXHVkMGRkXHViNDFjIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWMwYWRcdWM4MWNcdWI0MWMgXHVjNzc0XHVkNmM0IFx1YzViNFx1YjI5MCBcdWFjZjNcdWM1ZDBcdWMxMWNcdWIzYzQgXHVjMGFjXHVjNmE5XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cDQotXHVjMGFkXHVjODFjXHVkNTYwIFx1YzEyNFx1YmE4NVx1Yzc5MFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotIyBWaWV3IEhlbHBlcg0KLXZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ190aXRsZT1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjMGMxXHVkMGRjIFx1YWM4MFx1YzBhYw0KLXZpZXdIZWxwZXJfcGVyZm9ybUhlYWx0aENoZWNrPVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMFx1YzExYyBcdWMwYzFcdWQwZGMgXHVhYzgwXHVjMGFjXHViOTdjIFx1YzIxOFx1ZDU4OVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZT1cdWM1ZjRcdWI4MjQgXHVjNzg4XHViMjk0IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yzc1OCBcdWMwYzFcdWQwZGMgXHVhYzgwXHVjMGFjXHVhYzAwIFx1YzEzMVx1YWNmNVx1YzgwMVx1YzczY1x1Yjg1YyBcdWM2NDRcdWI4Y2NcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yjg1Y1x1YWRmOCBcdWQzMGNcdWM3N2NcdWM3NTggXHViY2Y0XHVhY2UwXHVjMTFjXHViOTdjIFx1Y2MzOFx1Yzg3MFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIEF0dGFjaCBUZW1wbGF0ZSBGaWxlIERpYWxvZw0KLWF0dGFjaFRlbXBsYXRlRmlsZURpYWxvZ190aXRsZT1cdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjggXHVkMzBjXHVjNzdjIFx1Y2NhOFx1YmQ4MA0KLQ0KLSMgQ3JlYXRlIEVsZW1lbnQgRXJyb3IgRGlhbG9nDQotY3JlYXRlRWxlbWVudERpYWxvZ190aXRsZT1cdWMwYzggezB9IFx1Yzc5MVx1YzEzMQ0KLWNyZWF0ZU5ld0VsZW1lbnRFcnJvcl9tc2c9XHVjMGM4IHswfSBcdWQ1NmRcdWJhYTlcdWM3NDQgXHVjNzkxXHVjMTMxXHVkNTU4XHViMjk0IFx1YzkxMVx1YzVkMCBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLWRsZ1RpdGxlX3JlbG9hZExpYnJhcnk9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YjJlNFx1YzJkYyBcdWI4NWNcdWI0ZGMNCi1jcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uPXswfSBcdWM3NzRcdWI5ODRcdWM3NDQgXHViZTQ0XHVjNmNjXHViNDU4IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cDQotXG5cDQotXHVjNjJjXHViYzE0XHViOTc4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kZWxldGVDb25maWdFcnJvcl9yZWFzb249XHVhZDZjXHVjMTMxXHVjNzQ0ICcnezB9JycgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVjNWQwXHVjMTFjIFx1Y2MzOFx1Yzg3MFx1ZDU2OVx1YjJjOFx1YjJlNC4NCi0NCi0jIENoYW5nZUJvdW5kc0NvbW1hbmQNCi1nZWZfY2hhbmdlQm91bmRzQ29tbWFuZF9sYWJlbD1cdWJjOTRcdWM3MDQgXHViY2MwXHVhY2JkDQotIyBDaGFuZ2VOYW1lQ29tbWFuZA0KLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF9sYWJlbD1cdWM3NzRcdWI5ODQgXHViY2MwXHVhY2JkDQotZ2VmX2NoYW5nZU5hbWVDb21tYW5kX3VuZG9NZXNzYWdlPVx1Yzc3NFx1Yjk4NCBcdWJjYzBcdWFjYmRcdWM3NDQgXHVjMmU0XHVkNTg5IFx1Y2RlOFx1YzE4Y1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1Yzc3NFx1YzgwNCBcdWM3NzRcdWI5ODRcdWM3NzQgXHViMTEwKG51bGwpXHVjNzdjIFx1YWNiZFx1YzZiMCBcdWM3NzRcdWI5ODQgXHViY2MwXHVhY2JkIFx1YzJlNFx1ZDU4OSBcdWNkZThcdWMxOGMgXHVjODcwXHVjNzkxXHVjNzc0IFx1ZDVjOFx1YzZhOVx1YjQxOFx1YzljMCBcdWM1NGFcdWMyYjVcdWIyYzhcdWIyZTQuDQotIyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZA0KLWdlZl9jaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZF9sYWJlbD1cdWQyYjlcdWMxMzEgXHVhYzEyIFx1YmNjMFx1YWNiZA0KLSMgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZA0KLWdlZl9jcmVhdGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPVx1YWQ3NFx1YWNlMVx1YzgxMCBcdWM3OTFcdWMxMzENCi0jIENyZWF0ZUxpbmtDb21tYW5kDQotZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsPVx1YjljMVx1ZDA2YyBcdWM3OTFcdWMxMzENCi0jIENyZWF0ZU5vZGVDb21tYW5kDQotZ2VmX2NyZWF0ZU5vZGVDb21tYW5kX2xhYmVsPVx1YzBjOCBcdWIxNzhcdWI0ZGMgXHVjNzkxXHVjMTMxDQotIyBEZWxldGVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9XHVhZDc0XHVhY2UxXHVjODEwIFx1YzBhZFx1YzgxYw0KLSMgRGVsZXRlQ29tbWFuZA0KLWdlZl9kZWxldGVDb21tYW5kX2xhYmVsPVx1YzBhZFx1YzgxYw0KLSMgRGVsZXRlTGlua0NvbW1hbmQNCi1nZWZfZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw9XHVjNWYwXHVhY2IwIFx1YzBhZFx1YzgxYw0KLSMgTW92ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfbW92ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9XHVhZDc0XHVhY2UxXHVjODEwIFx1Yzc3NFx1YjNkOQ0KLSMgUmVjb25uZWN0TGlua0NvbW1hbmQNCi1nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw9XHViOWMxXHVkMDZjIFx1YjJlNFx1YzJkYyBcdWM1ZjBcdWFjYjANCi0NCi0jIFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0PVx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWJlNDRcdWM2Y2NcdWI0NTggXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNjJjXHViYzE0XHViOTc4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotIyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9XHVjNzc0XHViOTg0XHVjNzQ0IFx1YmU0NFx1YzZjY1x1YjQ1OCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWM2MmNcdWJjMTRcdWI5NzggXHVjNzc0XHViOTg0XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0jIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0DQotZ2VmX3dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0X3ZhbGlkYXRlTWVzc2FnZT1cdWM3NzRcdWI5ODRcdWM3NDQgXHViZTQ0XHVjNmNjXHViNDU4IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YzYyY1x1YmMxNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uDQotYWN0aW9uc19FbGVtZW50c1ZpZXdEZWxldGVBY3Rpb25fbWVzc2FnZT0nJ3swfScnIFx1YWQ2Y1x1YzEzMVx1Yzc0NCAnJ3sxfScnIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1YzVkMFx1YzExYyBcdWMwYWNcdWM2YTlcdWQ1NThcdWIyOTQgXHVjOTExXHVjNzc0XHVhZTMwIFx1YjU0Y1x1YmIzOFx1YzVkMCBcdWMwYWRcdWM4MWNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcg0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU9XHVjMGFkXHVjODFjIFx1YzYyNFx1Yjk1OA0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yTWVzc2FnZT1cdWNjOThcdWI5YWNcdWI0MThcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YzYwOFx1YzY3OA0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uPVx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWNjMzhcdWM4NzANCi0NCi0jIE1ldGhvZEVsZW1lbnRFZGl0b3INCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yVGl0bGU9XHVjODAwXHVjN2E1IFx1YzYyNFx1Yjk1OA0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMT1JVVBBMDAyMEU6IFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWM4MDBcdWM3YTVcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OCBcdWJjMWNcdWMwZGQNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI9XHVkNjU1XHVjNTdkIFx1YzYyNFx1Yjk1OA0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xPVx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWIyOTQgXHViODVjXHVhZGY4IFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWNjMzhcdWM4NzBcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjI9XHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1Y2MzOFx1Yzg3MA0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvclRpdGxlPVx1Yzc3NFx1Yjk4NCBcdWJjMTRcdWFmYjhcdWFlMzAgXHVjNjI0XHViOTU4DQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JNc2c9XHVjNzc0IFx1ZDNiOFx1YzlkMVx1YWUzMFx1Yzc1OCBcdWQzMGNcdWM3N2NcdWM3NzQgXHVkNTU4XHViMDk4IFx1Yzc3NFx1YzBjMSBcdWM4MWNcdWFjNzBcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1ZDNiOFx1YzlkMVx1YWUzMFx1YjI5NCBcdWIzNTQgXHVjNzc0XHVjMGMxIFx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWM3M2NcdWJhNzAgXHViMmViXHVjNTQ0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC4NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvclRpdGxlPVx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWM3NDAgXHVkM2I4XHVjOWQxXHVhZTMwDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yTWVzc2FnZTE9Jyd7MH0nJyBcdWQzMGNcdWM3N2MgXHVjNzc0XHViOTg0XHVjNzQ0IFx1YmMxNFx1YWZiOFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4IFx1YmMxY1x1YzBkZA0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLXJlbmFtZUVycm9yX3RpdGxlPVx1YzY5NFx1YzE4YyBcdWM3NzRcdWI5ODQgXHViYzE0XHVhZmI4XHVhZTMwDQotcmVuYW1lRXJyb3JfbXNnPUlVUEEwMDEzRTogXHVjNzc0XHViOTg0IFx1YmMxNFx1YWZiOFx1YWUzMCBcdWM4NzBcdWM3OTFcdWM3NDQgXHVjNjQ0XHViOGNjXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotU2VsZWN0RWxlbWVudERpYWxvZ19zZWxlY3RlbGVtZW50X3RleHQ9XHVjNjk0XHVjMThjIFx1YzEyMFx1ZDBkZA0KLQ0KLSMgRWRpdG9yQ2hvb3Nlcg0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ190aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVkM2I4XHVjOWQxXHVhZTMwIFx1YzVmNFx1YWUzMA0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVzY3JpcHRpb25MYWJlbD1cdWMxMjRcdWJhODU6DQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX1NlbGVjdEFsbEJ1dHRvbkxhYmVsPVx1YmFhOFx1YjQ1MCBcdWMxMjBcdWQwZGQNCi1PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDA9XHVjNjk0XHVjMThjIFx1ZDNiOFx1YzlkMQ0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19tZXNzYWdlPUlVUEEwMDIzRTogXHVjMTIwXHVkMGRkXHVkNTVjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWM2OTRcdWMxOGNcdWM2NDAgXHVjNWYwXHVhZDAwXHViNDFjIFx1ZDNiOFx1YzlkMVx1YWUzMFx1Yjk3YyBcdWM1ZjQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZT1cdWM3NzRcdWJiZjhcdWM5YzAgXHVkMzBjXHVjNzdjIFx1YzEyMFx1ZDBkZA0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVmYXVsdExpYnJhcnlOYW1lPVx1YzBjOCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVzY3JpcHRpb25MYWJlbD1cdWMxMjRcdWJhODU6DQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249XHVkNTU4XHViMDk4IFx1Yzc3NFx1YzBjMVx1Yzc1OCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YWNlMCBcdWM2NDRcdWI4Y2NcdWI5N2MgXHVkMDc0XHViOWFkXHVkNTU4XHVjNWVjIFx1YzVlY1x1YzJlZFx1YzJkY1x1YzYyNC4NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfRGVzZWxlY3RBbGxCdXR0b25MYWJlbD1cdWJhYThcdWI0NTAgXHVjMTIwXHVkMGRkIFx1Y2RlOFx1YzE4Yw0KLUVsZW1lbnRzVmlld19taWdyYXRpb25fZGlyX2RsZ19kZXNjcmlwdGlvbl90ZXh0PVx1YzBjOFx1Yjg1YyBcdWM3NzRcdWM4ZmNcdWI0MWMgezB9XHVjNzU4IFx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1Yjk3YyBcdWM5YzBcdWM4MTVcdWQ1NThcdWM1ZWMgXHVjMTIwXHVkMGRkXHViNDFjIHswfVx1Yzc0NChcdWI5N2MpIFx1YmMxNFx1YWZiOFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPVx1YzJkY1x1YzJhNFx1ZDE1YyBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YmNmNFx1YjgyNFx1YmE3NCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LlxuXA0KLVxuXA0KLVx1YzVmNFx1YjgyNCBcdWM3ODhcdWIyOTQgXHVjNzdjXHViZDgwIFx1ZDNiOFx1YzlkMVx1YWUzMFx1Yjk3YyBcdWIyZWJcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlPVx1Yzc3NFx1YmJmOFx1YzljMFx1YWMwMCBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0Lg0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzFFOiBcdWMxMjBcdWQwZGRcdWQ1NWMgJyd7MH0nJyBcdWM3NzRcdWJiZjhcdWM5YzBcdWFjMDAgXHVkNWM4XHVjNmE5XHViNDE4XHViMjk0IFx1ZDA2Y1x1YWUzMCh7MX0pXHViY2Y0XHViMmU0IFx1YjM1NCBcdWQwN2RcdWIyYzhcdWIyZTQoezJ9KS4gXHViMmU0XHViOTc4IFx1Yzc3NFx1YmJmOFx1YzljMFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RpdGxlPVx1Yzc3NFx1YmJmOFx1YzljMFx1YWMwMCBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0Lg0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMkU6IFx1YzEyMFx1ZDBkZFx1ZDU1YyAnJ3swfScnIFx1ZDMwY1x1Yzc3Y1x1Yzc3NCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YjJlNFx1Yjk3OCBcdWM3NzRcdWJiZjhcdWM5YzBcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19TZWxlY3RCdXR0b25MYWJlbD1cdWMxMjBcdWQwZGQuLi4NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5RGVzY3JpcHRpb249XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWMxMjRcdWJhODUNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVmYXVsdEJyaWVmRGVzY3JpcHRpb249XHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMSBcdWMxMjRcdWJhODUNCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPVx1YmFhOFx1YjRlMCBcdWQzYjhcdWM5ZDFcdWFlMzBcdWI5N2MgXHViMmViXHVjNTQ0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC4gXHViYTNjXHVjODAwIFx1YzgwMFx1YzdhNVx1ZDU3NFx1YzU3YyBcdWQ1NThcdWIyOTQgXHVhY2JkXHVjNmIwIFx1ZDU3NFx1YjJmOSBcdWQzYjhcdWM5ZDFcdWFlMzBcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2UNCi1mb3Jtc19UZW1wbGF0ZURlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPVx1YzEyMFx1ZDBkZFx1YjQxYyBcdWQzMGNcdWM3N2NcdWM3NDAgXHVjNzc0XHViYmY4IFx1Yzc3NCBcdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjhcdWM1ZDAgXHVjY2E4XHViZDgwXHViNDE4XHVjNWI0IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIE5ldyBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLW5ld0xpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24xPVx1YzljMFx1YzgxNVx1ZDU1YyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YWNiZFx1Yjg1YyAnJ3swfScnXHVjNzc0KFx1YWMwMCkgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMj1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVhYzAwIFx1Yzc3NFx1YmJmOCAnJ3swfScnXHVjNWQwIFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMz1cdWM5YzBcdWM4MTVcdWQ1NWMgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWQzZjRcdWIzNTQgJyd7MH0nJ1x1Yzc0NChcdWI5N2MpIFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLW5ld0xpYnJhcnlFcnJvcl9hZHZpY2U9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWIyZTRcdWI5NzggXHVjNzc0XHViOTg0XHVjNzc0XHViMDk4IFx1YWNiZFx1Yjg1Y1x1Yjk3YyBcdWM3ODVcdWI4MjVcdWQ1NThcdWI4MjRcdWJhNzQgXHVkNjU1XHVjNzc4XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jUHJvY2VzcyBsaXRlcmFscw0KLVByb2Nlc3NfRXh0ZXJuYWxJRD1cdWM2NzhcdWJkODAgSUQ6DQotUHJvY2Vzc19QdXJwb3NlPVx1YmFhOVx1YzgwMToNCi1Qcm9jZXNzX1Njb3BlPVx1YmM5NFx1YzcwNDoNCi1Qcm9jZXNzX1VzYWdlTm90ZXM9XHVjMGFjXHVjNmE5XHViYzk1IFx1YjE3OFx1ZDJiODoNCi1Qcm9jZXNzX0FsdGVybmF0aXZlcz1cdWIzMDBcdWM1NDg6DQotUHJvY2Vzc19Ib3dUb1N0YWZmPVx1Yzc3OFx1YjgyNSBcdWFkNmNcdWMxMzEgXHViYzI5XHViYzk1Og0KLVByb2Nlc3NfS2V5Q29uc2lkZXJhdGlvbj1cdWQ1NzVcdWMyZWMgXHVhY2UwXHViODI0XHVjMGFjXHVkNTZkOg0KLVByb2Nlc3NfU2NhbGU9XHVhZGRjXHViYWE4Og0KLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1cdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjggXHVkMmI5XHVjMTMxOg0KLVByb2Nlc3NfUmlza0xldmVsPVx1YzcwNFx1ZDVkOFx1YzEzMSBcdWI4MDhcdWJjYTg6DQotUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlPVx1YzYwOFx1YzBjMSBcdWFlMzBcdWJjOTU6DQotUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPVx1ZDUwNFx1Yjg1Y1x1YzgxZFx1ZDJiOCBcdWFkNmNcdWMxMzFcdWM2ZDAgXHVjODA0XHViYjM4IFx1YzljMFx1YzJkZDoNCi1Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0PVx1YWNjNFx1YzU3ZCBcdWM3MjBcdWQ2MTU6DQotDQotIyBFZGl0b3IgUHJldmlldyBOYXZpZ2F0aW9uIEJ1dHRvbnMNCi1iYWNrQnV0dG9uX3RleHQ9XHVjNzc0XHVjODA0DQotZm9yd2FyZEJ1dHRvbl90ZXh0PVx1YjJlNFx1Yzc0Yw0KLWZvcndhcmRfdGV4dD1cdWIyZTRcdWM3NGMNCi1zdG9wQnV0dG9uX3RleHQ9XHVjOTExXHVjOWMwDQotcmVmcmVzaEJ1dHRvbl90ZXh0PVx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWFlMzANCi1yZWZyZXNoX3RleHQ9XHVjMGM4XHViODVjIFx1YWNlMFx1Y2U1OFx1YWUzMA0KLW5ld25hbWVfdGV4dD1cdWMwYzggXHVjNzc0XHViOTg0Og0KLXByaW50QnV0dG9uX3RleHQ9XHVjNzc4XHVjMWM0DQotDQotIyBDb250ZXh0IG1lbnVzDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPVx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWFlMzAoJlIpDQotX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW09XHVkMmI5XHVjMTMxIFx1ZDQ1Y1x1YzJkYygmUykNCi0NCi1fVUlfTWV0aG9kRWRpdG9yX21lbnU9XHViYTU0XHVjMThjXHViNGRjIFx1ZDNiOFx1YzlkMVx1YWUzMCgmTSkNCi1fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtPVx1YzBjOFx1Yjg1YyBcdWM3OTFcdWMxMzEoJk4pDQotX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtPVx1YzBjOCBcdWIzZDlcdWM3MDQoJkUpDQotDQotX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWw9XHVjMTIwXHVkMGRkDQotX1VJX1BhcmVudFBhZ2VfbGFiZWw9XHVjMGMxXHVjNzA0DQotX1VJX0xpc3RQYWdlX2xhYmVsPVx1YmFhOVx1Yjg1ZA0KLV9VSV9UcmVlUGFnZV9sYWJlbD1cdWQyYjhcdWI5YWMNCi1fVUlfVGFibGVQYWdlX2xhYmVsPVx1ZDE0Y1x1Yzc3NFx1YmUxNA0KLV9VSV9UYWJsZVRyZWVQYWdlX2xhYmVsPVRhYmxlVHJlZQ0KLV9VSV9PYmplY3RDb2x1bW5fbGFiZWw9XHVjNjI0XHViZTBjXHVjODFkXHVkMmI4DQotX1VJX1NlbGZDb2x1bW5fbGFiZWw9XHVjNzkwXHVjY2I0DQotDQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9XHVjMTIwXHVkMGRkIFx1YzU0OFx1ZDU2OA0KLV9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZD1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVjNjI0XHViZTBjXHVjODFkXHVkMmI4OiB7MH0NCi1fVUlfTXVsdGlPYmplY3RTZWxlY3RlZD17MH1cdWFjMWMgXHVjNjI0XHViZTBjXHVjODFkXHVkMmI4IFx1YzEyMFx1ZDBkZFx1ZDU2OA0KLQ0KLV9VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWw9XHVkM2I4XHVjOWQxXHVhZTMwIFx1YzVmNFx1YWUzMA0KLQ0KLV9VSV9XaXphcmRfY2F0ZWdvcnk9XHVjNjA4XHVjODFjIEVNRiBcdWJhYThcdWIzNzggXHVjNzkxXHVjMTMxIFx1YjljOFx1YmM5NVx1YzBhYw0KLQ0KLV9VSV9NZXRob2RNb2RlbFdpemFyZF9sYWJlbD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViYWE4XHViMzc4DQotX1VJX01ldGhvZE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uPVx1YzBjOCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViYWE4XHViMzc4IFx1Yzc5MVx1YzEzMQ0KLQ0KLV9VSV9NZXRob2RFZGl0b3JfbGFiZWw9XHViYTU0XHVjMThjXHViNGRjIFx1YmFhOFx1YjM3OCBcdWQzYjhcdWM5ZDFcdWFlMzANCi0NCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZT1NeQ0KLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbj1cdWJhNTRcdWMxOGNcdWI0ZGMNCi0NCi1fVUlfV2l6YXJkX2xhYmVsPVx1YzBjOFx1Yjg1YyBcdWM3OTFcdWMxMzENCi0NCi1fV0FSTl9GaWxlbmFtZUV4dGVuc2lvbj1cdWQzMGNcdWM3N2MgXHVjNzc0XHViOTg0XHVjNzQwICcnLnswfScnKFx1YzczYylcdWI4NWMgXHViMDVkXHViMDk4XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC4NCi0NCi1fVUlfTW9kZWxPYmplY3Q9XHViYWE4XHViMzc4IFx1YzYyNFx1YmUwY1x1YzgxZFx1ZDJiOA0KLV9VSV9YTUxFbmNvZGluZz1YTUwgXHVjNzc4XHVjZjU0XHViNTI5DQotX1VJX1hNTEVuY29kaW5nQ2hvaWNlcz1VVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQ0KLV9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb249XHVjNzkxXHVjMTMxXHVkNTYwIFx1YmFhOFx1YjM3OCBcdWM2MjRcdWJlMGNcdWM4MWRcdWQyYjhcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLV9VSV9GaWxlQ29uZmxpY3RfbGFiZWw9XHVkMzBjXHVjNzdjIFx1Y2RhOVx1YjNjYw0KLV9XQVJOX0ZpbGVDb25mbGljdD1cdWQzYjhcdWM5ZDFcdWFlMzAgXHVjNjc4XHViZDgwXHVjNzU4IFx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1YWNmYyBcdWNkYTlcdWIzY2NcdWQ1NThcdWIyOTQgXHVjODAwXHVjN2E1XHViNDE4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWJjYzBcdWFjYmRcdWMwYWNcdWQ1NmRcdWM3NzQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3NzQgXHVkM2I4XHVjOWQxXHVhZTMwXHVjNzU4IFx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWJjODRcdWI5YWNcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1hZGRMaW5rRGlhbG9nX2xpbmtUeXBlPVx1YzcyMFx1ZDYxNToNCi1vcGVuTGlua0NoZWNrYm94X3RleHQ9XHViY2M0XHViM2M0XHVjNzU4IFx1YmUwY1x1Yjc3Y1x1YzZiMFx1YzgwMCBcdWNjM2RcdWM1ZDBcdWMxMWMgXHViOWMxXHVkMDZjIFx1YzVmNFx1YWUzMA0KLQ0KLSMgQWRkIEltYWdlIERpYWxvZw0KLWhlaWdodExhYmVsX3RleHQ9XHViMTkyXHVjNzc0Og0KLXdpZHRoTGFiZWxfdGV4dD1cdWIxMDhcdWJlNDQ6DQotRWxlbWVudHNWaWV3XzIwPVx1YWUzMFx1YjJhNSBcdWQzMjhcdWQxMzQNCi1FbGVtZW50c1ZpZXdfMjE9XHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNA0KLUVsZW1lbnRzVmlld18yMj1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1FbGVtZW50c1ZpZXdfMzU9ezB9XHVjNzQwKFx1YjI5NCkgXHVjNzdkXHVhZTMwIFx1YzgwNFx1YzZhOVx1Yzc4NVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVhZTMwIFx1YzgwNFx1YzVkMCBcdWM0ZjBcdWFlMzAgXHVhYzAwXHViMmE1XHVjNzNjXHViODVjIFx1YjljY1x1YjRkY1x1YzJlZFx1YzJkY1x1YzYyNC4NCi1FbGVtZW50c1ZpZXdfMzY9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1Yjg1Y1x1YjRkY1x1ZDU1OFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4IFx1YmMxY1x1YzBkZA0KLWFsdFRhZ0xhYmVsX3RleHQ9QUxUIFx1ZDBkY1x1YWRmODoNCi1pbWFnZVNpemVMYWJlbF90ZXh0PVx1Yzc3NFx1YmJmOFx1YzljMFx1Yzc1OCBcdWIxOTJcdWM3NzRcdWM2NDAgXHViMTA4XHViZTQ0XHViMjk0IFx1YWMwMVx1YWMwMSBcdWNkNWNcdWMxOGNcdWQ1NWMgMTAgXHViYzBmIDYwMCBcdWM3NzRcdWQ1NThcdWM1ZWNcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0LiBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YjE5Mlx1Yzc3NFx1YzY0MCBcdWIxMDhcdWJlNDRcdWIyOTQgXHVjODAxXHVjODA4XHVkNTVjIFx1ZDA2Y1x1YWUzMFx1Yjg1YyBcdWJjYzBcdWQ2NThcdWI0MjlcdWIyYzhcdWIyZTQuDQotDQotIyBQcm9jZXNzIEVkaXRvcg0KLVByb2Nlc3NFZGl0b3I9UHJvY2Vzc0VkaXRvcg0KLVByb2Nlc3NFZGl0b3JfTmFtZT1cdWM3NzRcdWI5ODQNCi1Qcm9jZXNzRWRpdG9yX1ByZXNlbnRhdGlvbk5hbWU9XHVkNDVjXHVjMmRjIFx1Yzc3NFx1Yjk4NA0KLVByb2Nlc3NFZGl0b3JfSW5kZXg9XHVjMGM5XHVjNzc4DQotUHJvY2Vzc0VkaXRvcl9QcmVkZWNlc3NvcnM9XHVjMTIwXHVkNTg5DQotI0NvbmZpZ3VyYXRpb25QYWdlX1NlbGVjdGVkPVNlbGVjdGVkOiANCi1DaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbj1cdWFjODBcdWMwYWMgXHVkNTZkXHViYWE5XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YWNlMCBcdWM3MDRcdWI4NWMgXHViNjEwXHViMjk0IFx1YzU0NFx1Yjc5OFx1Yjg1Y1x1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWM1ZWMgXHVkNTc0XHViMmY5IFx1YzIxY1x1YzExY1x1Yjk3YyBcdWJjYzBcdWFjYmRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQ9XHVjNzc0XHViOTg0XHVjNzQ0IFx1YmMxNFx1YWZiOFx1YjI5NCBcdWM5MTEuLi4NCi1Qcm9jZXNzRWRpdG9yX01vZGVsSW5mbz1cdWJhYThcdWIzNzggXHVjODE1XHViY2Y0DQotUHJvY2Vzc0VkaXRvcl9QcmVmaXg9XHVjODExXHViNDUwXHViZDgwDQotTW92ZURpYWxvZ19tb3ZlX3RleHQ9XHVjNzc0XHViM2Q5DQotQ2hlY2tsaXN0T3JkZXJfdGl0bGU9XHVhYzgwXHVjMGFjIFx1ZDU2ZFx1YmFhOSBcdWMyMWNcdWMxMWMgXHVjOWMwXHVjODE1DQotUHJvY2Vzc0VkaXRvcl9SZXBldGFibGU9XHViYzE4XHViY2Y1IFx1YWMwMFx1YjJhNVx1ZDU2OA0KLVByb2Nlc3NFZGl0b3JfT25nb2luZz1cdWM5YzRcdWQ1ODkgXHVjOTExXHVjNzg0DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uPVx1YjNkOVx1YWUzMFx1ZDY1NC4uLg0KLVByb2Nlc3NFZGl0b3JfRXZlbnREcml2ZW49XHVjNzc0XHViY2E0XHVkMmI4XHViODVjIFx1YWQ2Y1x1YjNkOVx1YjQyOA0KLVByb2Nlc3NFZGl0b3JfRGVsaXZlcmFibGU9XHVjNzc4XHViM2M0XHViYjNjDQotUHJvY2Vzc0VkaXRvcl9PcHRpb25hbD1cdWMxMjBcdWQwZGRcdWM4MDENCi1GaWx0ZXJEaWFsb2dfVHlwZV90ZXh0PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWM2OTRcdWMxOGMgXHVjNzIwXHVkNjE1Og0KLUZpbHRlckRpYWxvZ19FeHBhbmRBbGw9XHViYWE4XHViNDUwIFx1ZDNiY1x1Y2U1OFx1YWUzMA0KLU1vdmVEaWFsb2dfbW92aW5nX3RleHQ9XHVjNzc0XHViM2Q5IFx1YzkxMS4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbldhcm5pbmc9SVVQQTAwMjVXOiB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmFhOFx1YzU5MSBcdWM1NDRcdWM3NzRcdWNmNThcdWM3NzQgezF9IFx1YWNiZFx1Yjg1Y1x1YzVkMCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uRXJyb3I9SVVQQTAwMjVFOiBcdWM2MjRcdWI5NTg6IFx1YmFhOFx1YzU5MSBcdWM1NDRcdWM3NzRcdWNmNTggXHVjMTM5XHVjMTU4OiB7MH0NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX05hbWVMYWJlbD1cdWM3NzRcdWI5ODQ6DQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1cdWMwYzggXHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMSBcdWM3OTFcdWMxMzENCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfTmFtZUxhYmVsPVx1Yzc3NFx1Yjk4NDoNCi1BdXRob3JpbmdVSVBsdWdpbl9uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlPVx1YzBjOCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VUaXRsZT1cdWMwYzggXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWM3OTFcdWMxMzENCi1uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlPVx1YzBjOCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVUaXRsZT1cdWJjYzBcdWFjYmRcdWMwYWNcdWQ1NmQgXHVjODAwXHVjN2E1DQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1cdWMwYzggXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzc0XHViOTg0LCBcdWMxMjRcdWJhODUgXHViYzBmIFx1YjMwMFx1YzBjMSBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWNcdWI5N2MgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb249XHVkNTU4XHViMDk4IFx1Yzc3NFx1YzBjMVx1Yzc1OCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjXHVhYzAwIFx1YzIxOFx1YzgxNVx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjODAwXHVjN2E1XHVkNTc0XHVjNTdjIFx1ZDU2MCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjXHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxIFx1YzVmNFx1YWUzMA0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzEgXHVjNWY0XHVhZTMwDQotRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ9ezB9XHVjNzQ0KFx1Yjk3YykgXHViYzE0XHVhZmI4XHViMjk0IFx1YzkxMS4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uV2FybmluZz1JVVBBMDAyNlc6IHswfVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHViMTc4XHViNGRjIFx1YzU0NFx1Yzc3NFx1Y2Y1OFx1Yzc3NCB7MX0gXHVhY2JkXHViODVjXHVjNWQwIFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1NZXNzYWdlTGFiZWxQcm92aWRlcl91bnNlbGVjdGVkcGFja2FnZXM9XHVjMTIwXHVkMGRkXHVkNTU4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWQzMjhcdWQwYTRcdWM5YzBcdWM3NTggXHVjNjk0XHVjMThjXHViOTdjIFx1Y2MzOFx1Yzg3MFx1ZDU1OFx1YjI5NCBcdWM2OTRcdWMxOGNcdWFjMDAgJyd7MH0nJ1x1YzVkMCBcdWQzZWNcdWQ1NjhcdWI0MThcdWM1YjQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3I9SVVQQTAwMjZFOiBcdWM2MjRcdWI5NTg6IFx1YjE3OFx1YjRkYyBcdWM1NDRcdWM3NzRcdWNmNTggXHVjMTM5XHVjMTU4OiB7MH0NCi1TdGVwc09yZGVyRGlhbG9nX3N0ZXBzPVx1YjJlOFx1YWNjNDogDQotU3RlcHNPcmRlckRpYWxvZ190aXRsZT1cdWQwYzBcdWMyYTRcdWQwNmMgXHViMmU4XHVhY2M0IFx1YzIxY1x1YzExYyBcdWM5YzBcdWM4MTUNCi1Qcm9jZXNzRWRpdG9yX1BsYW5uZWQ9XHVhY2M0XHVkNjhkXHViNDI4DQotc3BlY2lmeWRpcmVjdG9yeV90ZXh0PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjODAwXHVjN2E1XHVkNTYwIFx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1Yjk3YyBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPVx1YjJlNFx1YzkxMSBcdWJjMWNcdWMwZGQNCi1Qcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU9XHVjMmRjXHVjNzkxIFx1YzBjMVx1ZDBkYw0KLVByb2Nlc3NFZGl0b3JfRXhpdFN0YXRlPVx1Yzg4NVx1YjhjYyBcdWMwYzFcdWQwZGMNCi1zZWxlY3RDb2x1bW5zdG9BZGRfdGV4dD1cdWNkOTRcdWFjMDBcdWQ1NjAgXHVjNWY0XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1Qcm9jZXNzRWRpdG9yX1R5cGU9XHVjNzIwXHVkNjE1DQotUHJvY2Vzc0VkaXRvcl9UZWFtPVx1ZDMwMA0KLUZpbHRlckRpYWxvZ190aXRsZT1cdWMxMjBcdWQwZGQgXHViMzAwXHVkNjU0IFx1YzBjMVx1Yzc5MDogDQotDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWNlZThcdWQxNTBcdWNlMjBcdWM1ZDBcdWMxMWMgXHVjZDk0XHVhYzAwKCZNKS4uLg0KLUZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbD1cdWJhYThcdWI0NTAgXHVjODExXHVhZTMwDQotT3BlbkNoZWF0c2hlZXRWaWV3X3RpdGxlPVx1Y2U1OFx1ZDJiOCBcdWMyZGNcdWQyYjggXHViY2Y0XHVhZTMwIFx1YzVmNFx1YWUzMA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxVcD1cdWI4NjRcdWM1YzUNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsRG93bj1cdWI4NjRcdWIyZTRcdWM2YjQNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA9XHVjNzA0XHViODVjIFx1Yzc3NFx1YjNkOSgmTykNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlRG93bj1cdWM1NDRcdWI3OThcdWI4NWMgXHVjNzc0XHViM2Q5KCZXKQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbD1cdWQ0NWNcdWMyZGMoJkEpDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29weT1cdWJjZjVcdWMwYWMoJkMpLi4uDQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dD1cdWM3NzRcdWI5ODQgXHVkMzI4XHVkMTM0KFx1Yzc3Y1x1Y2U1OFx1ZDU1OFx1YjI5NCBcdWM3NzRcdWI5ODRcdWM3NzQgXHVkNDVjXHVjMmRjXHViNDI4KTogDQotTWV0aG9kTGlicmFyeUVkaXRvcl90aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjOiANCi0jTWVzc2FnZVZpZXdfc2VsZWN0ZWRfdGV4dD1TZWxlY3RlZDogDQotTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ9XHVjMTI0XHViYTg1DQotRWxlbWVudHNWaWV3X2Vycl9zYXZpbmc9SVVQQTAwMjdFOiAnJ3swfScnXHVjNzQ0KFx1Yjk3YykgXHVjODAwXHVjN2E1XHVkNTU4XHViMjk0IFx1YzkxMVx1YzVkMCBcdWM2MjRcdWI5NTggXHViYzFjXHVjMGRkKHsxfSkNCi0NCi1lcnJfY29weWluZ19maWxlX3RpdGxlPVx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWJjZjVcdWMwYWNcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OCBcdWJjMWNcdWMwZGQNCi1lcnJfY29weWluZ19maWxlX2Vycm9yPUlVUEEwMDI4RTogXHVjNTQ0XHVjNzc0XHVjZjU4XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiANCi1lcnJfY29weWluZ19maWxlX3JlYXNvbj1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YmNmNVx1YzBhY1x1ZDU1OFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWJjZjRcdWI4MjRcdWJhNzQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkXHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlPVx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWNjOThcdWI5YWNcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OCBcdWJjMWNcdWMwZGQNCi1lZGl0Q29uZmlndXJhdGlvbl90b29sdGlwPVx1YWQ2Y1x1YzEzMSBcdWQzYjhcdWM5ZDENCi1lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQ9SVVQQTAwMTVFOiBcdWM2OTRcdWMxOGNcdWI5N2MgXHVkM2I4XHVjOWQxXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotU2F2ZVRoaXNBY3Rpb25fc2F2ZW9iamVjdD1cdWM3NzQgXHVjNjI0XHViZTBjXHVjODFkXHVkMmI4IFx1YzgwMFx1YzdhNS4uLg0KLUVsZW1lbnRzVmlld19yZXBsYWNlX3RleHQ9XHViYzE0XHVhZmI4XHVhZTMwDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kPVx1ZDY1NVx1YzdhNSgmRSkuLi4NCi1Nb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ9XHVjMTIwXHVkMGRkXHVkNTVjIFx1YzY5NFx1YzE4Y1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHViMzAwXHVjMGMxIFx1YzEyMFx1ZDBkZDoNCi1jaG9vc2VEZWZhdWx0RGlyZWN0b3J5X3RleHQ9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWFlMzBcdWJjZjggXHViNTE0XHViODA5XHVkMWEwXHViOWFjIFx1YzEyMFx1ZDBkZDoNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzcz1cdWM1YjVcdWM4MWMoJlMpDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3MyPVx1YWNmNVx1YWMxYyBcdWM2MzVcdWMxNTgoJlApLi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXNzaWduVXNlckRpYWdyYW09XHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTgoJlUpLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3RpdGxlPVx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NTggXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1YzljMFx1YzgxNQ0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZEltYWdlPVx1ZDY1Y1x1YjNkOSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTg6DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlPVx1ZDY1Y1x1YjNkOSBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmQgXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4Og0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1Yzg4NVx1YzE4ZFx1YzEzMSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTg6DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX25vdGFGaWxlPUlVUEEwMDA0RTogXHVjOWMwXHVjODE1XHViNDFjIFx1YWNiZFx1Yjg1Y1x1YWMwMCBcdWQzMGNcdWM3N2NcdWM3NzQgXHVjNTQ0XHViMmQ5XHViMmM4XHViMmU0Lg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b249XHVjMTIwXHVkMGRkLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDI0RTogXHVjOWMwXHVjODE1XHViNDFjIFx1Yzc3NFx1YmJmOFx1YzljMFx1YWMwMCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM1ZDAgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHViOGU4XHVkMmI4IFx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1Yzc1OCBcdWMwYzFcdWIzMDAgXHVhY2JkXHViODVjXHViOTdjIFx1Yzc4NVx1YjgyNVx1ZDU4OFx1YjI5NFx1YzljMCBcdWQ2NTVcdWM3NzhcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3NlbGVjdGVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAzMEU6IFx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWM3NzRcdWJiZjhcdWM5YzBcdWFjMDAgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVjNWQwIFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZT1cdWNjM2VcdWM1NDRcdWJjZjRcdWFlMzAgXHViYzBmIFx1YWNmNVx1YWMxY1x1Yjk3YyBcdWM3MDRcdWQ1NzQgXHVkNjVjXHViM2Q5IFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWM3NzRcdWJiZjhcdWM5YzAgXHVjMGFjXHVjNmE5DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFEREltYWdlPVx1Y2MzZVx1YzU0NFx1YmNmNFx1YWUzMCBcdWJjMGYgXHVhY2Y1XHVhYzFjXHViOTdjIFx1YzcwNFx1ZDU3NCBcdWQ2NWNcdWIzZDkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWM3NzRcdWJiZjhcdWM5YzAgXHVjMGFjXHVjNmE5DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlPVx1Y2MzZVx1YzU0NFx1YmNmNFx1YWUzMCBcdWJjMGYgXHVhY2Y1XHVhYzFjXHViOTdjIFx1YzcwNFx1ZDU3NCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1Yzg4NVx1YzE4ZFx1YzEzMSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHVjNzc0XHViYmY4XHVjOWMwIFx1YzBhY1x1YzZhOQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvbnRyaWJ1dGU9XHViODVjXHVjZWVjIFx1YmQ4NFx1YmMzMA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JlcGxhY2U9XHViODVjXHVjZWVjIFx1YmMxNFx1YWZiOFx1YWUzMA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0RpYWdyYW1zPVx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCgmRykNCi1Qcm9jZXNzRWRpdG9yX2FjdGlvbl9kZWVwQ29weT1cdWM4MDRcdWNjYjQgXHViY2Y1XHVjMGFjKCZEKS4uLg0KLUZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uPVx1YWMwNFx1YjdiNVx1ZDU1YyBcdWMxMjRcdWJhODU6DQotQ29uZmlndXJhdGlvblBhZ2VfaGlkZVRvb2xUaXA9XHVjMTIwXHVkMGRkIFx1Y2RlOFx1YzE4Y1x1ZDU1YyBcdWM2OTRcdWMxOGMgXHVkNDVjXHVjMmRjL1x1YzIyOFx1YWUzMFx1YWUzMA0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uPVx1YzEyNFx1YmE4NToNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbD1cdWFjZjVcdWFjMWMgXHVjNWM2XHVjNzRjDQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb249XHVkMzI4XHVkMTM0XHVjNzQwIFx1YzI3Y1x1ZDQ1Y1x1Yjg1YyBcdWFkNmNcdWJkODRcdWI0MjlcdWIyYzhcdWIyZTQuIFx1YzVlY1x1YWUzMFx1YzExYyAqXHViMjk0IFx1YmIzOFx1Yzc5MFx1YzVmNCwgP1x1YjI5NCBcdWJiMzhcdWM3OTBcdWM3ODVcdWIyYzhcdWIyZTQuDQotQ29uZmlndXJhdGlvblBhZ2VfVHJlZVRpdGxlTGFiZWw9XHVjZWU4XHVkMTUwXHVjZTIwOg0KLUNvbmZpZ3VyYXRpb25QYWdlX0xvYWRpbmdNZXNzYWdlPVx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWI4NWNcdWI0ZGNcdWQ1NThcdWIyOTQgXHVjOTExXHVjNzg1XHViMmM4XHViMmU0LiBcdWFlMzBcdWIyZTRcdWI5YWNcdWMyZWRcdWMyZGNcdWM2MjQuDQotTW92ZURpYWxvZ192YWxpZGRlc3RpbmF0aW9uX3RleHQ9XHVjOWMwXHVjODE1XHViNDFjIFx1Yzc3NFx1YjNkOSBcdWIzMDBcdWMwYzFcdWM3NzQgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi1Nb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uPUlVUEEwMDM0RTogXHVjMTIwXHVkMGRkXHVkNTVjIFx1YjMwMFx1YzBjMVx1Yzc0NCBcdWMyMThcdWM4MTVcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw9XHViYWE4XHViNDUwIFx1YWNmNVx1YWMxYw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5CYXNlQWN0aXZpdHk9XHVhZTMwXHViY2Y4IFx1ZDY1Y1x1YjNkOSBcdWM1ZjRcdWFlMzANCi1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPVx1YmFhOFx1YjQ1MCBcdWQzYmNcdWNlNThcdWFlMzAoJlgpDQotUHJvY2Vzc0Zvcm1FZGl0b3JfY29sbGFwc2VBbGxBY3Rpb25MYWJlbD1cdWJhYThcdWI0NTAgXHVjODExXHVhZTMwKCZMKQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURpYWdyYW09XHVkNjVjXHViM2Q5IFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWM1ZjRcdWFlMzAoJkEpDQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbD1cdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM1ZDAgXHViMDk4XHVjNWY0XHViNDFjIFx1YzViNVx1YzgxY1x1YjQxOFx1YzljMCBcdWM1NGFcdWM3NDAgXHVjMTI0XHViYTg1XHVjNzkwXHViOTdjIFx1YzEyMFx1ZDBkZFx1YjQxYyBcdWM2OTRcdWMxOGNcdWFjMDAgXHViMDk4XHVkMGMwXHViMDljIFx1ZDZjNCwgXHVjOTExXHViY2Y1IFx1YmMyOVx1YzljMFx1Yjk3YyBcdWM3MDRcdWQ1NzQgXHVjMGFkXHVjODFjXHVkNTc0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC4gXHVjMGFkXHVjODFjXHVkNTU4XHVhY2UwIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWQ2NTVcdWM3NzhcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9TZWxlY3RDb2x1bW5zPVx1Y2Q5NFx1YWMwMFx1ZDU2MCBcdWM1ZjRcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW09XHVkNjVjXHViM2Q5IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHVjNWY0XHVhZTMwKCZEKQ0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9Db2x1bW5TZWxlY3Rpb249XHVjNWY0IFx1YzEyMFx1ZDBkZFx1YzBhY1x1ZDU2ZDoNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3dpdGNoQ29uZmlndXJhdGlvbj1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVkM2I4XHVjOWQxXHVhZTMwXHVhYzAwIFx1ZDY1Y1x1YzEzMVx1ZDY1NFx1YjQxOFx1YmE3NCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVhZTMwXHViY2Y4IFx1YWQ2Y1x1YzEzMVx1YzczY1x1Yjg1YyBcdWM4MDRcdWQ2NTgNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3VwcHJlc3Npb25Hcm91cFRpdGxlPVx1YzViNVx1YzgxYw0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9pbmhlcml0U3VwcHJlc3Npb25TdGF0ZT1cdWM1YjVcdWM4MWMgXHVjMGMxXHVkMGRjIFx1YzBjMVx1YzE4ZA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjODg1XHVjMThkXHVjMTMxIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWM1ZjRcdWFlMzAoJlcpDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9XHVjOWMwXHVjNmIwXHVhZTMwDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9XHVjMTIwXHVkMGRkLi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fSW5zZXJ0TmV3UGhhc2U9XHVjMGM4IFx1YjJlOFx1YWNjNCBcdWMwYmRcdWM3ODUNCi1WaWV3SGVscGVyX3JlbG9hZExpYk9uUm9sbGJhY2tFcnJvcj1cdWM5YzBcdWMxOGRcdWMxMzEgXHVjNjI0XHViOTU4XHViOTdjIFx1YmNmNVx1YWQ2Y1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjNmQwXHViNzk4IFx1YzBjMVx1ZDBkY1x1Yjg1YyBcdWJjZjVcdWM2ZDBcdWQ1NThcdWI4MjRcdWJhNzQgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YjJlNFx1YzJkYyBcdWI4NWNcdWI0ZGNcdWQ1NzRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0Lg0KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRfdGV4dD0nJ3swfScnIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWM3NzRcdWJiZjggXHVjMGFkXHVjODFjXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQ9Jyd7MH0nJyBcdWM2OTRcdWMxOGNcdWFjMDAgXHVjNzc0XHViYmY4IFx1YzBhZFx1YzgxY1x1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzc0XHViOTdjICcnezF9JydcdWM1ZDBcdWMxMWMgXHVjODFjXHVhYzcwXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLUNvbmZpZ3VyYXRpb25QYWdlX0FkZE1pc3NpbmdUb29sVGlwPVx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWNjMzhcdWM4NzAgXHVjZDk0XHVhYzAwDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb249XHVjMTI0XHViYTg1DQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm89XHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNCANCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BcHBseVBhdHRlcm49XHVkMzI4XHVkMTM0IFx1YzgwMVx1YzZhOSgmVCkNCi1Nb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ9XHViMzAwXHVjMGMxXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1cdWM3NzRcdWIzZDkgXHViMzAwXHVjMGMxXHVjNzc0IFx1YzljMFx1YzgxNVx1YjQxOFx1YzljMCBcdWM1NGFcdWM1NThcdWMyYjVcdWIyYzhcdWIyZTQuDQotTWV0aG9kTGlicmFyeUVkaXRvcl90cm91Ymxlb2JqZWN0PS4gXHViYjM4XHVjODFjXHVjODEwIFx1YzYyNFx1YmUwY1x1YzgxZFx1ZDJiODogDQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfZXJyY2hpbGRwa2dzPVx1ZDU1OFx1YzcwNCBcdWNlZThcdWQxNTBcdWNlMjAgXHVkMzI4XHVkMGE0XHVjOWMwIFx1YjYxMFx1YjI5NCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWM1ZDAgXHViMjA0XHViNzdkXHViNDFjIFx1Y2MzOFx1Yzg3MFx1Yjk3YyBcdWFjMDBcdWM5YzQgXHVjNjk0XHVjMThjXHVhYzAwIFx1ZDNlY1x1ZDU2OFx1YjQxOFx1YzViNCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZT1cdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHVhY2Y1XHVhYzFjIFx1YzYzNVx1YzE1OA0KLVByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfTWVzc2FnZT1cdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YThcdWM3NDQgXHVhY2Y1XHVhYzFjXHVkNTU4XHViODI0XHViYTc0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YWNlMCBcdWFjZjVcdWFjMWNcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNzNjXHViODI0XHViYTc0IFx1YzEyMFx1ZDBkZCBcdWNkZThcdWMxOGNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotUHJvY2Vzc0VkaXRvcl9UaXRsZT1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVkM2I4XHVjOWQxXHVhZTMwOiANCi1TYXZlQXN3aXRoZG90c190ZXh0PVx1YjJlNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3M2NcdWI4NWMgXHVjODAwXHVjN2E1Li4uDQotUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlPVx1Yzc5MVx1YzVjNVx1YmQ4NFx1Yjk1OFx1Y2NiNFx1YWNjNChXQlMpDQotUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbj1cdWQzMDAgXHVkNTYwXHViMmY5DQotUHJvY2Vzc0VkaXRvcl9Xb3JrUHJvZHVjdFVzYWdlPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjMGFjXHVjNmE5XHViYzk1DQotUHJvY2Vzc0VkaXRvcl9Db25zb2xpZGF0ZWRWaWV3PVx1ZDFiNVx1ZDU2OVx1YjQxYyBcdWJjZjRcdWFlMzANCi1Qcm9jZXNzRWRpdG9yX2NvbmZpcm1BdXRvU3luY2g9XHVjNzc0IFx1Yzg3MFx1Yzc5MVx1Yzc0MCBcdWQyYjlcdWMxMzEgXHViY2Y0XHVhZTMwXHVjNzU4IFx1Yzc3Y1x1YmMxOCBcdWQwZWRcdWM1ZDBcdWMxMWMgIlx1YzE4Y1x1YzJhNFx1YzY0MCBcdWIzZDlcdWFlMzBcdWQ2NTQiXHViODVjIFx1ZDQ1Y1x1YzJkY1x1YjQxYyBcdWMxMjBcdWQwZGRcdWI0MWMgXHVkNjVjXHViM2Q5IFx1YzU0NFx1Yjc5OFx1Yzc1OCBcdWMxMjBcdWQwZGRcdWI0MWMgXHVjMTI0XHViYTg1XHVjNzkwIFx1YjYxMFx1YjI5NCBcdWJhYThcdWI0ZTAgXHVjMTI0XHViYTg1XHVjNzkwXHViOTdjIFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNjlcdWIyYzhcdWIyZTQuIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWFlMzBcdWJjZjggXHVhZDZjXHVjMTMxIFx1YzU0NFx1Yjc5OFx1Yzc1OCBcdWI5YzFcdWQwNmNcdWI0MWMgXHViYTU0XHVjMThjXHViNGRjIFx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWM2OTRcdWMxOGNcdWM3NTggXHVjNmQwXHViNzk4IFx1ZDJiOVx1YzEzMVx1YWNmYyBcdWQ1NjhcdWFlZDggXHVjMTI0XHViYTg1XHVjNzkwXHViOTdjIFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNjlcdWIyYzhcdWIyZTQuIFx1YjljMVx1ZDA2YyhcdWNkMDhcdWI4NWRcdWMwYzkgXHVhZTMwXHVjNmI4XHVjNzg0XHVjY2I0KVx1YjQxYyBcdWMxMjRcdWJhODVcdWM3OTBcdWIyOTQgXHVhYzMxXHVjMmUwXHVkNTU4XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMT1cdWFkNmNcdWMxMzENCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjI9XHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4IFx1YmMwZiBcdWQzMjhcdWQwYTRcdWM5YzAgXHVjMTIwXHVkMGRkDQotTmV3TGlicmFyeURpYWxvZ19uZXdsaWJyYXJ5X2FzPVx1YjJlNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3M2NcdWI4NWMgXHVjMGM4IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWM3OTFcdWMxMzENCi1OZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ9XHVjMGM4IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzgNCi1TZWxlY3RFbGVtZW50RGlhbG9nX3RpdGxlX3RleHQ9XHVjNjk0XHVjMThjXHViMDk4IFx1YzY5NFx1YzE4Y1x1Yzc1OCBcdWNlZThcdWQyYjhcdWI5YWNcdWJkZjBcdWQxMzAgXHVjOTExIFx1ZDU1OFx1YjA5OFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotT3BlbkNvbmZpZ0RpYWxvZ25ld2NvbmZpZ190ZXh0PVx1YzBjOCBcdWFkNmNcdWMxMzE6DQotcHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlX0JTRWRpdG9yPVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWQzYjhcdWM5ZDFcdWFlMzANCi0NCi0jIEFic3RyYWN0RGlhZ3JhbUVkaXRvcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1cdWI5ZGVcdWNkOTRcdWFlMzANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1cdWFlMzBcdWJjZjggXHVkNjVjXHViM2Q5XHVjNWQwXHVjMTFjIFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWFlMzANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9XHVkNjE1XHVjMmRkIFx1ZDE0ZFx1YzJhNFx1ZDJiOCBcdWMwYzFcdWM3OTAuLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVx1ZDNjOVx1YWRlMFx1YzVkMCBcdWI5ZGVcdWNkYjAgXHVhYzAwXHViODVjXHViODVjDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdWNjOThcdWM3NGMgXHVjMTIwXHVkMGRkXHVjMGFjXHVkNTZkXHVjNWQwIFx1YjlkZVx1Y2RiMCBcdWFjMDBcdWI4NWNcdWI4NWMNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVx1ZDNjOVx1YWRlMFx1YzVkMCBcdWI5ZGVcdWNkYjAgXHVjMTM4XHViODVjXHViODVjDQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl90aXRsZT1cdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0DQotTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9SVVQQTAwNDFFOiBcdWMxMjBcdWQwZGRcdWQ1NWMgXHVjNjk0XHVjMThjXHViOTdjIFx1YzljMFx1YzgxNVx1YjQxYyBcdWIzMDBcdWMwYzFcdWM3M2NcdWI4NWMgXHVjNzc0XHViM2Q5XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlbW9kZWxsaWJyYXJ5PVx1YmFhOFx1YjM3OCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjODAwXHVjN2E1IFx1YzkxMS4uLg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyb3JfZGlhbG9nX3RpdGxlPVx1YzYyNFx1Yjk1OA0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZV9saWJyYXJ5X3Byb2JsZW1fbXNnPUlVUEEwMDMzRTogXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzgwMFx1YzdhNVx1ZDU1OFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHViYjM4XHVjODFjXHVjODEwXHVjNzc0IFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dD0nJ3swfScnIFx1ZDU2ZFx1YmFhOVx1Yzc0NCBcdWMwYWRcdWM4MWNcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfQ29udGVudEVsZW1lbnRfdGV4dD1cdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjOiANCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Jyb3dzZUJ1dHRvbkxhYmVsPVx1Y2MzZVx1YzU0NFx1YmNmNFx1YWUzMC4uLg0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249XHVjMGM4IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzFcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3NFx1Yjk4NFx1YWNmYyBcdWMxMjRcdWJhODVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU9XHViY2MwXHVhY2JkXHVjMGFjXHVkNTZkIFx1YzgwMFx1YzdhNSBcdWQ2YzQgXHViYWE4XHViNGUwIFx1ZDNiOFx1YzlkMVx1YWUzMCBcdWIyZWJcdWFlMzANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVx1Y2M5OFx1Yzc0YyBcdWMxMjBcdWQwZGRcdWMwYWNcdWQ1NmRcdWM1ZDAgXHViOWRlXHVjZGIwIFx1YzEzOFx1Yjg1Y1x1Yjg1Yw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9XHVjODAwXHVjN2E1DQotQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dD1cdWQzMGNcdWM3N2MgXHVjY2E4XHViZDgwDQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudD1cdWFkNmNcdWMxMzEgXHVjZWU4XHVkMTUwXHVjZTIwDQotT3BlbkNvbmZpZ0RpYWxvZ29wZW5jb25maWdfdGV4dD1cdWFkNmNcdWMxMzEgXHVjNWY0XHVhZTMwDQotRWxlbWVudHNWaWV3X3JlcGxhY2VBY3Rpb25fdGV4dD1cdWJjMTRcdWFmYjhcdWFlMzAuLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPXswfSBcdWM4MDBcdWM3YTUgXHVjOTExDQotQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcD1cdWFkNmNcdWMxMzEgXHVhY2JkXHVhY2UwIFx1Yjg1Y1x1YWRmOCBcdWQ0NWNcdWMyZGNcdWFlMzAgXHVkNDVjXHVjMmRjDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeD1cdWFkNmNcdWMxMzE6IA0KLUNoZWNrbGlzdE9yZGVyX2NoZWNrbGlzdGl0ZW1zX3RleHQ9XHVhYzgwXHVjMGFjIFx1ZDU2ZFx1YmFhOTogDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPVx1YjE3OFx1YjRkYyBcdWM3NzRcdWIzZDkNCi1Db25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXA9XHVjNzkwXHViM2Q5XHVjNzNjXHViODVjIFx1YzYyNFx1Yjk1OCBcdWMyMThcdWM4MTUNCi1OZXdQbHVnaW5EaWFsb2dfcmVmZXJlbmNlcGx1Z2luX3RleHQ9XHVjYzM4XHVjODcwIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3ODoNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfY3JlYXRlRnJlZVRleHRfdGV4dD1cdWJlNDRcdWM4MTVcdWQ2MTUgXHVkMTRkXHVjMmE0XHVkMmI4IFx1Yzc5MVx1YzEzMQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0xhYmVsPVx1YjE3OFx1YjRkYyBcdWM1NDRcdWM3NzRcdWNmNTggXHViYmY4XHViOWFjXHViY2Y0XHVhZTMwOg0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0PUlVUEEwMDMyVzogXHVjNWYwXHVhY2IwXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWM3NGMNCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfc2FtZXByZWRhbmRzdWNfdGV4dD1JVVBBMDAzM1c6IFx1YzEyMFx1ZDU4OSBcdWJjMGYgXHVkNmM0XHVkNTg5XHVhY2ZjIFx1YjNkOVx1Yzc3Y1x1ZDU1YyBcdWM3OTFcdWM1YzVcdWJkODRcdWI5NTggXHVjNjk0XHVjMThjXHViOTdjIFx1YWMwMFx1YzljOCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgRWRpdG9yQ2hvb3Nlcg0KLUVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlPVx1ZDNiOFx1YzlkMVx1YWUzMCBcdWM1ZjRcdWFlMzANCi1FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yPVx1Yzc3NCBcdWM2OTRcdWMxOGNcdWM1ZDAgXHVjNjI0XHViOTU4XHVhYzAwIFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVhZTMwIFx1YzgwNFx1YzVkMCBcdWM3NzQgXHVjNjI0XHViOTU4XHViOTdjIFx1YzIxOFx1YzgxNVx1ZDU2MCBcdWFjODNcdWM3NDQgXHVhZDhjXHVjN2E1XHVkNTY5XHViMmM4XHViMmU0KFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWNjMzhcdWM4NzApLlxuXA0KLVxuXA0KLVx1ZDNiOFx1YzlkMVx1YWUzMFx1Yjk3YyBcdWM1ZjRcdWM5YzAgXHVjNTRhXHVhY2UwIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWQ2NTVcdWM3NzhcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWQzYjhcdWM5ZDFcdWFlMzBcdWI5N2MgXHVjNWY0XHViODI0XHViYTc0IFx1Yzc3NCBcdWIzMDBcdWQ2NTQgXHVjMGMxXHVjNzkwXHViOTdjIFx1YjJlYlx1YzczY1x1YzJlZFx1YzJkY1x1YzYyNC4NCi1Db25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4PVx1YWQ2Y1x1YzEzMTogDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZT1cdWM3NzRcdWI5ODQ6DQotQXR0YWNobWVudERpYWxvZ0ZpbGVVUkxfdGV4dD1cdWQzMGNcdWM3N2MgVVJMOg0KLVN0ZXBzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb249XHViMmU4XHVhY2M0XHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YWNlMCBcdWM3MDRcdWI4NWMgXHViNjEwXHViMjk0IFx1YzU0NFx1Yjc5OFx1Yjg1Y1x1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWM1ZWMgXHViMmU4XHVhY2M0IFx1YzIxY1x1YzExY1x1Yjk3YyBcdWJjYzBcdWFjYmRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZT1cdWM4MDBcdWM3YTVcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OCBcdWJjMWNcdWMwZGQNCi1NZXNzYWdlVmlld19lcnJlbGVtZW50X3RleHQ9XHVjYzM4XHVjODcwXHVkNTU4XHViMjk0IFx1YzY5NFx1YzE4Yw0KLU1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dD1cdWNjMzhcdWM4NzBcdWI0MWMgXHVjNjk0XHVjMThjDQotDQotI0FjdGl2aXR5IERpYWdyYW0NCi1BY3Rpdml0eURpYWdyYW1FZGl0b3JfY3JlYXRlU3RhcnROb2RlX3RleHQ9XHVjMmRjXHVjNzkxIFx1YjE3OFx1YjRkYyBcdWM3OTFcdWMxMzENCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb249XHVjNzc0IFx1YWQ2Y1x1YzEzMVx1Yzc3NCBcdWQzZWNcdWQ1NjhcdWQ1NjAgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCwgXHVjZWU4XHVkMTUwXHVjZTIwIFx1ZDMyOFx1ZDBhNFx1YzljMCBcdWJjMGYgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbl90ZXh0PVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhY1x1Yzc1OCBcdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjIFx1YzIxY1x1YzExYyBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1YjMwMFx1ZDY1NCBcdWMwYzFcdWM3OTANCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsPVx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhYzoNCi1Sb290UHJlZlBhZ2VfZW5hYmxlcHJvY2Vzc2NvbnRyaWJ1dGlvbl90ZXh0PVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWNlZThcdWQyYjhcdWI5YWNcdWJkZjBcdWMxNTggXHVjMGFjXHVjNmE5DQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1cdWM3NzQgXHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25MYWJlbD1cdWMxMjRcdWJhODU6DQotQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT0nJ3swfScnXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWNlZThcdWQyYjhcdWI5YWNcdWJkZjBcdWQxMzAgXHVjMTIwXHVkMGRkDQotRWxlbWVudHNWaWV3X29wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbl90ZXh0PVx1YmNjMFx1YzIxOCBcdWM2OTRcdWMxOGNcdWI4NWMgXHVjNWY0XHVhZTMwDQotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3RpdGxlPScnezB9JydcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmNjMFx1YzIxOCBcdWMxMjBcdWQwZGQNCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdmlld2VyTGFiZWw9Jyd7MH0nJ1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHViY2MwXHVjMjE4IFx1YzY5NFx1YzE4Yw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19MYWJlbD1cdWJhYThcdWM1OTEgXHVjNTQ0XHVjNzc0XHVjZjU4IFx1YmJmOFx1YjlhY1x1YmNmNFx1YWUzMDoNCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2RlbGV0ZV90ZXh0PVx1YzBhZFx1YzgxY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjNzRjDQotQWN0aXZpdHlEaWFncmFtRWRpdG9yX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1cdWQ2NWNcdWIzZDkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWM1ZjRcdWFlMzAgDQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl9kZXNjcmlwdGlvbj1cdWM3NzQgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1cdWM5YzBcdWM2YjBcdWFlMzANCi1XUENvbXBhcnRtZW50RmlndXJlXzA9XHVjMGM4IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjMTI0XHViYTg1XHVjNzkwDQotcHJvbXB0Zm9yX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGRfdGV4dD1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVkM2I4XHVjOWQxXHVhZTMwXHVjNWQwXHVjMTFjIFx1Yzc5MVx1YzEzMVx1YjQxOFx1YzljMCBcdWM1NGFcdWM3NDAgXHVkNjVjXHViM2Q5IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHVhY2Y1XHVhYzFjIFx1YjYxMFx1YjI5NCBcdWNjM2VcdWM1NDRcdWJjZjRcdWFlMzANCi1wcm9tcHRfZm9yX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09XHVjMjE4XHVjODE1XHViNDE4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWQ2NWNcdWIzZDkgXHVkNjU1XHVjN2E1XHVjNzkwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWQ2NWNcdWIzZDkgXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4XHVjNzQ0IFx1YWNmNVx1YWMxY1x1ZDU1OFx1YWM3MFx1YjA5OCBcdWNjM2VcdWM1NDRcdWJjZjRcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotI0NvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm49XHVjNzc0XHViOTg0IFx1ZDMyOFx1ZDEzNChcdWM3N2NcdWNlNThcdWQ1NThcdWIyOTQgXHVjNzc0XHViOTg0XHVjNzc0IFx1ZDQ1Y1x1YzJkY1x1YjQyOCk6DQotc2hvd0luUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb25fbGFiZWw9XHVjNzkwXHVjNmQwIFx1YjEyNFx1YmU0NFx1YWM4Y1x1Yzc3NFx1ZDEzMFx1YzVkMCBcdWQ0NWNcdWMyZGMNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19QYXR0ZXJuPVx1ZDMyOFx1ZDEzNFx1Yzc0MCBcdWMyN2NcdWQ0NWNcdWI4NWMgXHVhZDZjXHViZDg0XHViNDI5XHViMmM4XHViMmU0LiBcdWM1ZWNcdWFlMzBcdWMxMWMgKlx1YjI5NCBcdWJiMzhcdWM3OTBcdWM1ZjQsID9cdWIyOTQgXHViYjM4XHVjNzkwXHVjNzg1XHViMmM4XHViMmU0Lg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb249SVVQQTAwMjlFOiBcdWMxMjBcdWQwZGRcdWQ1NWMgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1Y2M5OFx1YjlhY1x1ZDU1OFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWJjZjRcdWI4MjRcdWJhNzQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkXHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19DYXRlZ29yeVR5cGU9XHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjIFx1YzcyMFx1ZDYxNToNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19CcmllZkRlc2NyaXB0aW9uPVx1YWMwNFx1YjdiNVx1ZDU1YyBcdWMxMjRcdWJhODU6DQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfU2VsZWN0Q2F0ZWdvcmllcz1cdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMgXHVjMTIwXHVkMGRkDQotDQotI2xvZyBtZXNzYWdlcw0KLWNoZWF0c2hlZXRfbG9hZF9mYWlsdXJlX2xvZ19tc2c9XHVjNjk0XHVjY2FkXHVkNTVjIFx1Y2U1OFx1ZDJiOCBcdWMyZGNcdWQyYjhcdWI5N2MgXHVjNWY0IFx1YzIxOCBcdWM1YzZcdWM3NGM6IA0KLQ0KLW5ld0NvbmZpZ3VyYXRpb25XaXJhemRfY3JlYXRlRXJyb3I9SVVQQTAwMzVFOiBcdWFkNmNcdWMxMzFcdWM3NDQgXHVjNzkxXHVjMTMxXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotbmV3UGx1Z2luV2l6YXJkX2NyZWF0ZUVycm9yPUlVUEEwMDM2RTogXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzQ0IFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWVycm9yRGlhbG9nX21vdmVFcnJvcj1JVVBBMDAzN0U6IFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWM3NzRcdWIzZDlcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1yZW5hbWVEaWFsb2dfcmVuYW1lRXJyb3I9SVVQQTAwMzhFOiBcdWM2OTRcdWMxOGMgXHVjNzc0XHViOTg0XHVjNzQ0IFx1YmMxNFx1YWZjMCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWVycm9yRGlhbG9nX2NyZWF0ZUVycm9yPUlVUEEwMDM5RTogXHVjNjk0XHVjMThjXHViOTdjIFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWR1cGxpY2F0ZVBsdWdpbk5hbWVFcnJvcl9tc2c9SVVQQTAxMDFFOiBcdWM3NzRcdWI5ODRcdWM3NzQgJyd7MH0nJ1x1Yzc3OCBcdWQ1NmRcdWJhYTlcdWM3NzQgXHVjNzc0XHViYmY4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHViMmU0XHViOTc4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM3ODVcdWI4MjVcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jTmV3IFN0cmluZ3MgZm9yIFByb2Nlc3NFZGl0b3IgQ29udGV4dCBtZW51IGRpYWdyYW0gaW1hZ2VzDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkQURJbWFnZT1BRCBcdWM3NzRcdWJiZjhcdWM5YzAgXHVjOWMwXHVjODE1Li4uDQotUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZT1cdWMwYzhcdWI4NWMgXHVhY2UwXHVjZTU4XHVhZTMwIFx1YzYyNFx1Yjk1OA0KLVByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yTXNnPVx1ZDNiOFx1YzlkMVx1YWUzMCBcdWMwYzhcdWI4NWMgXHVhY2UwXHVjZTU4XHVhZTMwIFx1YzYyNFx1Yjk1OA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlPUFERCBcdWM3NzRcdWJiZjhcdWM5YzAgXHVjOWMwXHVjODE1Li4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkV1BESW1hZ2U9V1BEIFx1Yzc3NFx1YmJmOFx1YzljMCBcdWM5YzBcdWM4MTUuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBREltYWdlSW5QdWJsaXNoaW5nPVx1YWNmNVx1YWMxY1x1YzVkMFx1YzExYyBBRCBcdWM3NzRcdWJiZjhcdWM5YzAgXHVjMGFjXHVjNmE5DQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzPVx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1YzVkMCBcdWIwOThcdWM1ZjRcdWI0MWMgXHVjNWI1XHVjODFjXHViNDFjIFx1YzEyNFx1YmE4NVx1Yzc5MFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWI0MWMgXHVjNjk0XHVjMThjXHViOTdjIFx1YzViNVx1YzgxY1x1ZDU1YyBcdWQ2YzQsIFx1YzkxMVx1YmNmNSBcdWJjMjlcdWM5YzBcdWI5N2MgXHVjNzA0XHVkNTc0IFx1YzBhZFx1YzgxY1x1ZDU3NFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuIFx1YzBhZFx1YzgxY1x1ZDU1OFx1YWNlMCBcdWFjYzRcdWMxOGRcdWQ1NThcdWI4MjRcdWJhNzQgXHVkNjU1XHVjNzc4XHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBRERJbWFnZUluUHVibGlzaGluZz1cdWFjZjVcdWFjMWNcdWM1ZDBcdWMxMWMgQUREIFx1Yzc3NFx1YmJmOFx1YzljMCBcdWMwYWNcdWM2YTkNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VXUERJbWFnZUluUHVibGlzaGluZz1cdWFjZjVcdWFjMWNcdWM1ZDBcdWMxMWMgV1BEIFx1Yzc3NFx1YmJmOFx1YzljMCBcdWMwYWNcdWM2YTkNCi1Qcm9jZXNzRWRpdG9yX0RpYWdyYW1JbWFnZV9JbnB1dERpYWxvZ19pbml0aWFsVmFsdWU9XHVjNzc0XHViYmY4XHVjOWMwIFx1YWNiZFx1Yjg1Yw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1Nob3dMaW5rZWRFbGVtZW50aW5MaWJyYXJ5Vmlldz1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHViY2Y0XHVhZTMwXHVjNWQwXHVjMTFjIFx1YjljMVx1ZDA2Y1x1YjQxYyBcdWM2OTRcdWMxOGMgXHVkNDVjXHVjMmRjKCZIKQ0KLVByb2Nlc3NFZGl0b3JfdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbl9sYWJlbD1cdWFlMzBcdWJjZjhcdWM1ZDBcdWMxMWMgXHVjNWI1XHVjODFjIFx1YWMzMVx1YzJlMCgmQikNCi1Qcm9jZXNzRWRpdG9yX0NvbnRleHRNZW51X0RpYWdyYW1JbWFnZXM9XHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1Yzc3NFx1YmJmOFx1YzljMA0KLQ0KLSNTdHJpbmdzIGZvciBzeW5jaHJvbml6YXRpb24gd2l6YXJkIG9uIHByb2Nlc3MgZWRpdG9yJ3MgQlMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlPVx1YjNkOVx1YWUzMFx1ZDY1NCBcdWMxMjRcdWJhODUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RleHQ9XHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWIzZDlcdWFlMzBcdWQ2NTRcdWM3NTggXHVjMjE4XHVkNTg5XHVjNWQwIFx1YjMwMFx1ZDU3NCBcdWMxMjRcdWJhODVcdWQ1NWMgXHViMmU0XHVjNzRjXHVjNzU4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM3N2RcdWM3M2NcdWMyZWRcdWMyZGNcdWM2MjQuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHVhZDZjXHVjMTMxIFx1YzEyMFx1ZDBkZA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ9XHViM2Q5XHVhZTMwXHVkNjU0XHVjNWQwIFx1YzBhY1x1YzZhOVx1ZDU2MCBcdWFkNmNcdWMxMzFcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcDQotXHVjMGFjXHVjNmE5XHVjNzkwXHVjNzU4IFx1YzEyMFx1ZDBkZFx1Yzc3NCBcdWIzZDlcdWFlMzBcdWQ2NTRcdWM1ZDAgXHVjMGFjXHVjNmE5XHViNDIwIFx1YzgxY1x1YWNmNSBcdWJjMGYgXHViMzAwXHVjY2I0XHViOTdjIFx1YWNiMFx1YzgxNVx1ZDU2OVx1YjJjOFx1YjJlNC4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV9jb25maWdMYWJlbD1cdWFkNmNcdWMxMzE6DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RpdGxlPVx1YjNkOVx1YWUzMFx1ZDY1NFx1ZDU2MCBcdWQyYjlcdWMxMzEgXHVjMTIwXHVkMGRkDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Byb3BlcnRpZXNfbGFibGU9XHVkMmI5XHVjMTMxDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX25hbWVfbGFibGU9XHVjNzc0XHViOTg0DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByZXNlbnRhdGlvbk5hbWVfbGFibGU9XHVkNDVjXHVjMmRjIFx1Yzc3NFx1Yjk4NA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9icmllZkRlc2NfbGFibGU9XHVhYzA0XHViN2I1XHVkNTVjIFx1YzEyNFx1YmE4NQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vcHRpb25hbElub3V0c19sYWJlbD1cdWMxMjBcdWQwZGRcdWM4MDEgXHVjNzg1XHViODI1DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX21hbmRhdG9yeUlucHV0c19sYWJsZT1cdWQ1NDRcdWMyMTggXHVjNzg1XHViODI1DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX291dHB1dHNfbGFiZWw9XHVjMGIwXHVjZDljXHViYjNjDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWw9XHVhZTMwXHViY2Y4IFx1YzIxOFx1ZDU4OVx1Yzc5MA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9hZGRuUGVyZm9ybWVyc19sYWJsZT1cdWNkOTRcdWFjMDAgXHVjMjE4XHVkNTg5XHVjNzkwDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGU9XHVjYzQ1XHVjNzg0XHVjNzQ0IFx1YjllMVx1Yzc0MCBcdWM1ZWRcdWQ1NjANCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfY29udG5BcnRpZmFjdHNfbGFiZWw9XHVkM2VjXHVkNTY4XHViNDFjIFx1YzU0NFx1ZDJmMFx1ZDMyOVx1ZDJiOA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbD1cdWM3NzhcdWIzYzRcdWJiM2MgXHVkMzBjXHVkMmI4DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsPVx1YzEyMFx1ZDBkZCBcdWIyZThcdWFjYzQNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGV4dD1cdWIzZDlcdWFlMzBcdWQ2NTRcdWM1ZDAgXHVhY2UwXHViODI0XHVkNTYwIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWNlZThcdWQxNTBcdWNlMjBcdWM3NTggXHVkMmI5XHVjMTMxXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGl0bGU9XHViM2Q5XHVhZTMwXHVkNjU0IFx1YmJmOFx1YjlhY1x1YmNmNFx1YWUzMA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90ZXh0PVx1YzU0NFx1Yjc5OFx1Yzc1OCBcdWM2OTRcdWNjYWRcdWQ1NWMgXHViM2Q5XHVhZTMwXHVkNjU0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWFjODBcdWQxYTBcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotc2VsZWN0RWRpdG9yc1RvRGlzY2FyZENvbmZsaWN0Q2hhbmdlcz1cdWQzYjhcdWM5ZDFcdWFlMzAgXHVjNjc4XHViZDgwXHVjNzU4IFx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1YWNmYyBcdWNkYTlcdWIzY2NcdWQ1NThcdWIyOTQgXHVjODAwXHVjN2E1XHViNDE4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWJjYzBcdWFjYmRcdWMwYWNcdWQ1NmRcdWM3NzQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LlxuXA0KLVx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWNkZThcdWMxOGNcdWQ1NjAgXHVkM2I4XHVjOWQxXHVhZTMwXHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfdGl0bGVfdGV4dD1cdWIzZDlcdWFlMzBcdWQ2NTQgXHViOWM4XHViYzk1XHVjMGFjDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dD1cdWM3NzQgXHViOWM4XHViYzk1XHVjMGFjXHViMjk0IFx1ZDJiOVx1YzEzMSBcdWJjZjRcdWFlMzBcdWM3NTggXHVjNzdjXHViYzE4IFx1ZDBlZFx1YzVkMFx1YzExYyAiXHVjMThjXHVjMmE0XHVjNjQwIFx1YjNkOVx1YWUzMFx1ZDY1NCJcdWI4NWMgXHVkNDVjXHVjMmRjXHViNDFjIFx1YzEyMFx1ZDBkZFx1YjQxYyBcdWQ2NWNcdWIzZDkgXHVjNTQ0XHViNzk4XHVjNzU4IFx1YzEyMFx1ZDBkZFx1YjQxYyBcdWMxMjRcdWJhODVcdWM3OTAgXHViNjEwXHViMjk0IFx1YmFhOFx1YjRlMCBcdWMxMjRcdWJhODVcdWM3OTBcdWM3NTggXHVjMGM4XHViODVjIFx1YWNlMFx1Y2U2OFx1Yzc0NCBcdWM5YzBcdWM2ZDBcdWQ1NjlcdWIyYzhcdWIyZTQuIFwNCi1cdWM3NzQgXHViOWM4XHViYzk1XHVjMGFjXHVjNWQwXHVjMTFjIFx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWQyYjlcdWMxMzFcdWI5Y2MgXHVjMTI0XHViYTg1XHVjNzkwXHVjNTQ4XHVjNWQwXHVjMTFjIFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNjhcdWI0MjlcdWIyYzhcdWIyZTQuIFwNCi1cdWI2MTBcdWQ1NWMgXHVjMGM4XHViODVjIFx1YWNlMFx1Y2U1OFx1YWUzMCBcdWFlMzBcdWIyYTVcdWM3NDQgXHVhY2M0XHVjMGIwXHVkNTYwIFx1YjU0YyBcdWMwYWNcdWM2YTlcdWQ1NjAgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVjNWQwIFx1YjMwMFx1ZDU3NCBcdWM3MjBcdWQ2YThcdWQ1NWMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU2MCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcDQotXHViOWM4XHViYzk1XHVjMGFjXHViMjk0IFx1YjljMVx1ZDA2YyhcdWNkMDhcdWI4NWRcdWMwYzkgXHVhZTMwXHVjNmI4XHVjNzg0XHVjY2I0KVx1YjQxYyBcdWMxMjRcdWJhODVcdWM3OTBcdWIyOTQgXHVhYzMxXHVjMmUwXHVkNTU4XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi1vcGVuUlRFPVx1YzExY1x1YzJkZFx1Yzc4OFx1YjI5NCBcdWJiMzhcdWMxMWMgXHVkM2I4XHVjOWQxXHVhZTMwIFx1YzVmNFx1YWUzMA0KLWNsb3NlUlRFPVx1YzExY1x1YzJkZFx1Yzc4OFx1YjI5NCBcdWJiMzhcdWMxMWMgXHVkM2I4XHVjOWQxXHVhZTMwIFx1YjJlYlx1YWUzMA0KLQ0KLSNOZXcgU3RyaW5ncw0KLXJvbGVzZXRzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjhcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZGlzY2lwbGluZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdWM3NzQgXHVjNmQwXHVjZTU5XHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWM1NDhcdWIwYjRcdWI5N2MgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdWM3NzQgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWM3MjBcdWQ2MTVcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZG9tYWluc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1Yzc3NCBcdWIzYzRcdWJhNTRcdWM3NzhcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdWM3NzQgXHViM2M0XHVhZDZjXHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWM1NDhcdWIwYjRcdWI5N2MgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWN1c3RvbWNhdGVnb3J5X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NTggXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjXHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWM1NDhcdWIwYjRcdWI5N2MgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLWNvbmNlcHRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdWM3NzQgXHVhYzFjXHViMTUwXHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWM1NDhcdWIwYjRcdWI5N2MgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1Yzc3NCBcdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjhcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZXhhbXBsZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM2MDhcdWM4MWNcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1YWMwMFx1Yzc3NFx1YjRkY1x1Yjc3Y1x1Yzc3OFx1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjNTQ4XHViMGI0XHViOTdjIFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2FkbWFwX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1Yjg1Y1x1YjRkY1x1YjlmNVx1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjNTQ4XHViMGI0XHViOTdjIFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yZXVzYWJsZWFzc2V0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1YzdhY1x1YzBhY1x1YzZhOVx1YWMwMFx1YjJhNVx1ZDU1YyBcdWM3OTBcdWMwYjBcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotc3VwcG9ydGluZ21hdGVyaWFsX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1YzljMFx1YzZkMCBcdWM3OTBcdWI4Y2NcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcmVwb3J0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1YmNmNFx1YWNlMFx1YzExY1x1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjNTQ4XHViMGI0XHViOTdjIFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1Yzc3NCBcdWMwYWNcdWI4NDBcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdWM3NzQgXHVkMTVjXHVkNTBjXHViOWFjXHVkMmI4XHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWM1NDhcdWIwYjRcdWI5N2MgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRlcm1kZWZpbml0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1YzZhOVx1YzViNCBcdWM4MTVcdWM3NThcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdG9vbG1lbnRvcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1Yzc3NCBcdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5IFx1YjNjNFx1YzZjMFx1YjlkMFx1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjNTQ4XHViMGI0XHViOTdjIFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi13aGl0ZXBhcGVyX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1YmMzMVx1YzExY1x1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjNTQ4XHViMGI0XHViOTdjIFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM2MDhcdWMwYzEgXHVhY2UwXHViODI0XHVjMGFjXHVkNTZkXHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWM1NDhcdWIwYjRcdWI5N2MgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLQ0KLSNOZXcgU3RyaW5nIFNlY3Rpb24gRGVzY3JpcHRpb24NCi1yb2xlX2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNWVkXHVkNTYwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM1ZWRcdWQ1NjBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzVlZFx1ZDU2MFx1Yzc3NCBcdWIyZTRcdWI5NzggXHVjNWVkXHVkNTYwXHVhY2ZjIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXJvbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzVlZFx1ZDU2MFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHViYzg0XHVjODA0IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotdGFza19kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdGFza19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVkMGMwXHVjMmE0XHVkMDZjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi10YXNrX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWQwYzBcdWMyYTRcdWQwNmNcdWFjMDAgXHViMmU0XHViOTc4IFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1YzY0MCBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi10YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWQwYzBcdWMyYTRcdWQwNmNcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLWFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNTQ0XHVkMmYwXHVkMzI5XHVkMmI4XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNTQ0XHVkMmYwXHVkMzI5XHVkMmI4XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1hcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM1NDRcdWQyZjBcdWQzMjlcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzU0NFx1Yzc3NFx1Y2Y1OFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM1NDRcdWQyZjBcdWQzMjlcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzgwNFx1YjJlYyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNTQ0XHVkMmYwXHVkMzI5XHVkMmI4XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODcwXHVjODE1IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotYXJ0aWZhY3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzU0NFx1ZDJmMFx1ZDMyOVx1ZDJiOFx1YWMwMCBcdWIyZTRcdWI5NzggXHVjNTQ0XHVkMmYwXHVkMzI5XHVkMmI4XHVjNjQwIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWFydGlmYWN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM1NDRcdWQyZjBcdWQzMjlcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLW91dGNvbWVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWFjYjBcdWFjZmNcdWJiM2NcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLW91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YWNiMFx1YWNmY1x1YmIzY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotb3V0Y29tZV9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWFjYjBcdWFjZmNcdWJiM2NcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzU0NFx1Yzc3NFx1Y2Y1OFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLW91dGNvbWVfbm90YXRpb25TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YWNiMFx1YWNmY1x1YmIzY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjODA0XHViMmVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotb3V0Y29tZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YWNiMFx1YWNmY1x1YmIzY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjMGFjXHVjNmE5XHVjNzkwIFx1Yzg3MFx1YzgxNSBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLW91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YWNiMFx1YWNmY1x1YmIzY1x1Yzc3NCBcdWIyZTRcdWI5NzggXHVhY2IwXHVhY2ZjXHViYjNjXHVhY2ZjIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLW91dGNvbWVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YWNiMFx1YWNmY1x1YmIzY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHViYzg0XHVjODA0IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotZGVsaXZlcmFibGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM3NzhcdWIzYzRcdWJiM2NcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWRlbGl2ZXJhYmxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM3NzhcdWIzYzRcdWJiM2NcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWRlbGl2ZXJhYmxlX2ljb25TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1Yzc3OFx1YjNjNFx1YmIzY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNTQ0XHVjNzc0XHVjZjU4XHVjNzQ0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NThcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1Yzc3OFx1YjNjNFx1YmIzY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjODA0XHViMmVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZGVsaXZlcmFibGVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM3NzhcdWIzYzRcdWJiM2NcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4NzBcdWM4MTUgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kZWxpdmVyYWJsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNzc4XHViM2M0XHViYjNjXHVjNzc0IFx1YjJlNFx1Yjk3OCBcdWM3NzhcdWIzYzRcdWJiM2NcdWFjZmMgXHVhZDAwXHViODI4XHViNDE4XHViMjk0IFx1YmMyOVx1YmM5NVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1Yzc3OFx1YjNjNFx1YmIzY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHViYzg0XHVjODA0IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotZGlzY2lwbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzZkMFx1Y2U1OVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNmQwXHVjZTU5XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kaXNjaXBsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2ZDBcdWNlNTlcdWM3NzQgXHViMmU0XHViOTc4IFx1YzZkMFx1Y2U1OVx1YWNmYyBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kaXNjaXBsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2ZDBcdWNlNTlcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLWRvbWFpbl9kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YjNjNFx1YmE1NFx1Yzc3OFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZG9tYWluX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWIzYzRcdWJhNTRcdWM3NzhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWRvbWFpbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHViM2M0XHViYTU0XHVjNzc4XHVjNzc0IFx1YjJlNFx1Yjk3OCBcdWIzYzRcdWJhNTRcdWM3NzhcdWFjZmMgXHVhZDAwXHViODI4XHViNDE4XHViMjk0IFx1YmMyOVx1YmM5NVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZG9tYWluX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWIzYzRcdWJhNTRcdWM3NzhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLXdvcmtwcm9kdWN0dHlwZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi13b3JrcHJvZHVjdHR5cGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi13b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1XHVjNzc0IFx1YjJlNFx1Yjk3OCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1YzcyMFx1ZDYxNVx1YWNmYyBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi13b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1yb2xlc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcm9sZXNldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcm9sZXNldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOFx1YWMwMCBcdWIyZTRcdWI5NzggXHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOFx1YzY0MCBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi10b29sX2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHViM2M0XHVhZDZjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi10b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWIzYzRcdWFkNmNcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRvb2xfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YjNjNFx1YWQ2Y1x1YWMwMCBcdWIyZTRcdWI5NzggXHViM2M0XHVhZDZjXHVjNjQwIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRvb2xfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YjNjNFx1YWQ2Y1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHViYzg0XHVjODA0IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotY29uY2VwdF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YWMxY1x1YjE1MFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotY29uY2VwdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVhYzFjXHViMTUwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1jb25jZXB0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWFjMWNcdWIxNTBcdWM3NzQgXHViMmU0XHViOTc4IFx1YWMxY1x1YjE1MFx1YWNmYyBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWFjMWNcdWIxNTBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLWNoZWNrbGlzdF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1Y2NiNFx1ZDA2Y1x1YjlhY1x1YzJhNFx1ZDJiOFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjY2I0XHVkMDZjXHViOWFjXHVjMmE0XHVkMmI4XHVhYzAwIFx1YjJlNFx1Yjk3OCBcdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjhcdWM2NDAgXHVhZDAwXHViODI4XHViNDE4XHViMjk0IFx1YmMyOVx1YmM5NVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotY2hlY2tsaXN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLWV4YW1wbGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2MDhcdWM4MWNcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWV4YW1wbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzYwOFx1YzgxY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZXhhbXBsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNjA4XHVjODFjXHVhYzAwIFx1YjJlNFx1Yjk3OCBcdWM2MDhcdWM4MWNcdWM2NDAgXHVhZDAwXHViODI4XHViNDE4XHViMjk0IFx1YmMyOVx1YmM5NVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZXhhbXBsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNjA4XHVjODFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1ndWlkZWxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWFjMDBcdWM3NzRcdWI0ZGNcdWI3N2NcdWM3NzhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWd1aWRlbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1ndWlkZWxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YWMwMFx1Yzc3NFx1YjRkY1x1Yjc3Y1x1Yzc3OFx1Yzc3NCBcdWIyZTRcdWI5NzggXHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4XHVhY2ZjIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzYwOFx1YzBjMSBcdWFjZTBcdWI4MjRcdWMwYWNcdWQ1NmRcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2MDhcdWMwYzEgXHVhY2UwXHViODI0XHVjMGFjXHVkNTZkXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNjA4XHVjMGMxIFx1YWNlMFx1YjgyNFx1YzBhY1x1ZDU2ZFx1Yzc3NCBcdWIyZTRcdWI5NzggXHVjNjA4XHVjMGMxIFx1YWNlMFx1YjgyNFx1YzBhY1x1ZDU2ZFx1YWNmYyBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNjA4XHVjMGMxIFx1YWNlMFx1YjgyNFx1YzBhY1x1ZDU2ZFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHViYzg0XHVjODA0IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotcHJhY3RpY2VfZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWMwYWNcdWI4NDBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXByYWN0aWNlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWMwYWNcdWI4NDBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWMwYWNcdWI4NDBcdWFjMDAgXHViMmU0XHViOTc4IFx1YzBhY1x1Yjg0MFx1YzY0MCBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1wcmFjdGljZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjMGFjXHViODQwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1yZXBvcnRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWJjZjRcdWFjZTBcdWMxMWNcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXJlcG9ydF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHViY2Y0XHVhY2UwXHVjMTFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yZXBvcnRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YmNmNFx1YWNlMFx1YzExY1x1YWMwMCBcdWIyZTRcdWI5NzggXHViY2Y0XHVhY2UwXHVjMTFjXHVjNjQwIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXJlcG9ydF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHViY2Y0XHVhY2UwXHVjMTFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1yZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcmVzdWFibGVhc3NldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMFx1Yzc3NCBcdWIyZTRcdWI5NzggXHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMFx1YWNmYyBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yZXN1YWJsZWFzc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM3YWNcdWMwYWNcdWM2YTlcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjNzkwXHVjMGIwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1yb2FkbWFwX2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHViODVjXHViNGRjXHViOWY1XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2FkbWFwX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWI4NWNcdWI0ZGNcdWI5ZjVcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXJvYWRtYXBfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1Yjg1Y1x1YjRkY1x1YjlmNVx1Yzc3NCBcdWIyZTRcdWI5NzggXHViODVjXHViNGRjXHViOWY1XHVhY2ZjIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1Yjg1Y1x1YjRkY1x1YjlmNVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHViYzg0XHVjODA0IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjOWMwXHVjNmQwIFx1Yzc5MFx1YjhjY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotc3VwcG9ydGluZ21hdGVyaWFsX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM5YzBcdWM2ZDAgXHVjNzkwXHViOGNjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzljMFx1YzZkMCBcdWM3OTBcdWI4Y2NcdWFjMDAgXHViMmU0XHViOTc4IFx1YzljMFx1YzZkMCBcdWM3OTBcdWI4Y2NcdWM2NDAgXHVhZDAwXHViODI4XHViNDE4XHViMjk0IFx1YmMyOVx1YmM5NVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM5YzBcdWM2ZDAgXHVjNzkwXHViOGNjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1ZDE1Y1x1ZDUwY1x1YjlhY1x1ZDJiOFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1ZDE1Y1x1ZDUwY1x1YjlhY1x1ZDJiOFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1ZDE1Y1x1ZDUwY1x1YjlhY1x1ZDJiOFx1YWMwMCBcdWIyZTRcdWI5NzggXHVkMTVjXHVkNTBjXHViOWFjXHVkMmI4XHVjNjQwIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRlbXBsYXRlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLXRlcm1kZWZpbml0aW9uX2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNmE5XHVjNWI0IFx1YzgxNVx1Yzc1OFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdGVybWRlZmluaXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzZhOVx1YzViNCBcdWM4MTVcdWM3NThcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2YTlcdWM1YjQgXHVjODE1XHVjNzU4XHVhYzAwIFx1YjJlNFx1Yjk3OCBcdWM2YTlcdWM1YjQgXHVjODE1XHVjNzU4XHVjNjQwIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2YTlcdWM1YjQgXHVjODE1XHVjNzU4XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi10b29sbWVudG9yX2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YjNjNFx1YWQ2YyBcdWMwYWNcdWM2YTkgXHViM2M0XHVjNmMwXHViOWQwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi10b29sbWVudG9yX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5IFx1YjNjNFx1YzZjMFx1YjlkMFx1Yzc3NCBcdWIyZTRcdWI5NzggXHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDBcdWFjZmMgXHVhZDAwXHViODI4XHViNDE4XHViMjk0IFx1YmMyOVx1YmM5NVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdG9vbG1lbnRvcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLXdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWJjMzFcdWMxMWNcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXdoaXRlcGFwZXJfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YmMzMVx1YzExY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHViYzMxXHVjMTFjXHVhYzAwIFx1YjJlNFx1Yjk3OCBcdWJjMzFcdWMxMWNcdWM2NDAgXHVhZDAwXHViODI4XHViNDE4XHViMjk0IFx1YmMyOVx1YmM5NVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotd2hpdGVwYXBlcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHViYzMxXHVjMTFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2ZDBcdWNlNTkgXHVhZGY4XHViOGY5XHVkNjU0XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzZkMFx1Y2U1OSBcdWFkZjhcdWI4ZjlcdWQ2NTRcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNmQwXHVjZTU5IFx1YWRmOFx1YjhmOVx1ZDY1NFx1YWMwMCBcdWIyZTRcdWI5NzggXHVjNmQwXHVjZTU5IFx1YWRmOFx1YjhmOVx1ZDY1NFx1YzY0MCBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzZkMFx1Y2U1OSBcdWFkZjhcdWI4ZjlcdWQ2NTRcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLXJvbGVzZXRncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjggXHVhZGY4XHViOGY5XHVkNjU0XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2xlc2V0Z3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjggXHVhZGY4XHViOGY5XHVkNjU0XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2xlc2V0Z3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjggXHVhZGY4XHViOGY5XHVkNjU0XHVhYzAwIFx1YjJlNFx1Yjk3OCBcdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4IFx1YWRmOFx1YjhmOVx1ZDY1NFx1YzY0MCBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2xlc2V0Z3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjggXHVhZGY4XHViOGY5XHVkNjU0XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NTggXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1jdXN0b21jYXRlZ29yeV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWNcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWN1c3RvbWNhdGVnb3J5X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhY1x1YWMwMCBcdWIyZTRcdWI5NzggXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWNcdWM2NDAgXHVhZDAwXHViODI4XHViNDE4XHViMjk0IFx1YmMyOVx1YmM5NVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NTggXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1jdXN0b21jYXRlZ29yeV9JY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNTQ0XHVjNzc0XHVjZjU4XHVjNzQ0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NThcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotY29uY2VwdF9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWFjMWNcdWIxNTBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzU0NFx1Yzc3NFx1Y2Y1OFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWNoZWNrbGlzdF9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzU0NFx1Yzc3NFx1Y2Y1OFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYz1cdWM3NzQgXHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzU0NFx1Yzc3NFx1Y2Y1OFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXdoaXRlcGFwZXJfaWNvblNlY3Rpb25fZGVzYz1cdWM3NzQgXHViYzMxXHVjMTFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM1NDRcdWM3NzRcdWNmNThcdWM3NDQgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2MDhcdWMwYzEgXHVhY2UwXHViODI0XHVjMGFjXHVkNTZkXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM1NDRcdWM3NzRcdWNmNThcdWM3NDQgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi10ZXJtZGVmaW5pdGlvbl9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2YTlcdWM1YjQgXHVjODE1XHVjNzU4XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM1NDRcdWM3NzRcdWNmNThcdWM3NDQgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi10ZW1wbGF0ZV9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzU0NFx1Yzc3NFx1Y2Y1OFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXJldXNhYmxlYXNzZXRfaWNvblNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNTQ0XHVjNzc0XHVjZjU4XHVjNzQ0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NThcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcmVwb3J0X2ljb25TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YmNmNFx1YWNlMFx1YzExY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNTQ0XHVjNzc0XHVjZjU4XHVjNzQ0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NThcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcHJhY3RpY2VfaWNvblNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjMGFjXHViODQwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM1NDRcdWM3NzRcdWNmNThcdWM3NDQgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1leGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzYwOFx1YzgxY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNTQ0XHVjNzc0XHVjZjU4XHVjNzQ0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NThcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZ3VpZGVsaW5lX2ljb25TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YWMwMFx1Yzc3NFx1YjRkY1x1Yjc3Y1x1Yzc3OFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNTQ0XHVjNzc0XHVjZjU4XHVjNzQ0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NThcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWI4NWNcdWI0ZGNcdWI5ZjVcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzU0NFx1Yzc3NFx1Y2Y1OFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM5YzBcdWM2ZDAgXHVjNzkwXHViOGNjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM1NDRcdWM3NzRcdWNmNThcdWM3NDQgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY190aXRsZT1cdWQzMGNcdWM3N2MgXHViY2MwXHVhY2JkDQotZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfbWVzc2FnZT1cdWQzMGNcdWM3N2NcdWM3NzQgXHVkMzBjXHVjNzdjIFx1YzJkY1x1YzJhNFx1ZDE1Y1x1YzVkMFx1YzExYyBcdWJjYzBcdWFjYmRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWI4NWNcdWI0ZGNcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU9XHVkNjVjXHViM2Q5IFx1YmNjMFx1YjNkOQ0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZz0nJ3swfScnIFx1ZDY1Y1x1YjNkOVx1Yzc3NCBcdWJjYzBcdWIzZDlcdWM3NDQgJyd7MX0nJ1x1YzVkMCBcdWMxMjRcdWM4MTVcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gJyd7MX0nJ1x1Yzc3NChcdWFjMDApIFx1Yzc3NFx1YmJmOCBcdWQ1NThcdWM3MDQgXHVkNjVjXHViM2Q5XHVjNzNjXHViODVjXHVjMTFjIFx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHVjZWU4XHVkMmI4XHViOWFjXHViZGYwXHVkMmI4XHViNDE4XHVhYzcwXHViMDk4IFx1YjMwMFx1Y2NiNFx1YjQxYyBcdWQ2NWNcdWIzZDlcdWM3NDQgXHVhYzAwXHVjOWMwXHVhY2UwIFx1Yzc4OFx1YWUzMCBcdWI1NGNcdWJiMzhcdWM3ODVcdWIyYzhcdWIyZTQuDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMT0nJ3swfScnIFx1ZDY1Y1x1YjNkOVx1Yzc3NCBcdWJjYzBcdWIzZDlcdWM3NDQgXHVjOWMxXHVjODExIFx1YzBjMVx1YzcwNCBcdWQ2NWNcdWIzZDkgXHViNjEwXHViMjk0IFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWM5MTEgXHVkNTU4XHViMDk4XHVjNWQwIFx1YzEyNFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzI9XHVjMjFjXHVkNjU4IFx1Yzg4NVx1YzE4ZFx1YzEzMVx1Yzc0NCBcdWFjMDBcdWM5YzBcdWFlMzAgXHViNTRjXHViYjM4XHVjNWQwICcnezB9JycgXHVkNjVjXHViM2Q5XHVjNzc0IFx1YmNjMFx1YjNkOVx1Yzc0NCAnJ3sxfScnXHVjNWQwIFx1YzEyNFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU9XHVkMzI4XHVkMTM0IFx1YzgwMVx1YzZhOQ0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPVx1YzIxY1x1ZDY1OCBcdWM4ODVcdWMxOGRcdWMxMzFcdWM3NDQgXHVhYzAwXHVjOWMwXHVhZTMwIFx1YjU0Y1x1YmIzOFx1YzVkMCAnJ3swfScnIFx1ZDY1Y1x1YjNkOVx1Yzc3NCBcdWQzMjhcdWQxMzRcdWM3NDQgJyd7MX0nJ1x1YzVkMCBcdWM4MDFcdWM2YTlcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotQ2hhbmdlSGlzdG9yeURpYWxvZ19kZWxpbWl0ZXI9fA0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3Jfc2hvd093bmVySW5MaWJyYXJ5Vmlldz1cdWJiZjhcdWQ1NzRcdWFjYjBcdWI0MWMgXHVjYzM4XHVjODcwXHVjNzU4IFx1YzE4Y1x1YzcyMFx1Yzc5MFx1Yjk3YyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHViY2Y0XHVhZTMwXHVjNWQwIFx1ZDQ1Y1x1YzJkYw0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZT1cdWJiZjhcdWQ1NzRcdWFjYjBcdWI0MWMgXHVjYzM4XHVjODcwIFx1YzgxY1x1YWM3MA0KLXByb21wdERlbGV0ZUN1c3RvbUNhdGVnb3J5QmVmb3JlUmVtb3ZlTGFzdFJlZlRvSXQ9XHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzU4IHswfVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHViOWM4XHVjOWMwXHViOWM5IFx1Y2MzOFx1Yzg3MFx1Yjk3YyBcdWM4MWNcdWFjNzBcdWQ1NThcdWI4MjQgXHVkNTY5XHViMmM4XHViMmU0LiBcdWQ1NzRcdWIyZjkgXHVjNjk0XHVjMThjXHVhYzAwIFx1YzBhZFx1YzgxY1x1YjQyOVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jQmVsb3cgcHJvcGVydHkgImVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcyIgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkDQotI0Rvbid0IGRlbGV0ZSBhIHNwYWNlIGFmdGVyICI6ICINCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLWVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcz06IA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZjE1MzFkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb3JtIFBhZ2UgVGl0bGVzDQotYXNzaWduUGFnZV90aXRsZT1EZXNpZ25hcg0KLWNhdGVnb3JpZXNQYWdlX3RpdGxlPUNhdGVnb3JpYXMNCi1kZWxpdmVyYWJsZVBhcnRzUGFnZV90aXRsZT1QYXJ0ZXMgRGlzdHJpYnVcdTAwZWR2ZWlzDQotZGVzY3JpcHRpb25QYWdlX3RpdGxlPURlc2NyaVx1MDBlN1x1MDBlM28NCi1kaXNjaXBsaW5lc1BhZ2VfdGl0bGU9RGlzY2lwbGluYXMNCi1kaXNjYXJkdW5yZXNvbHZlZHJlZj1EZXNjYXJ0YXIgcmVmZXJcdTAwZWFuY2lhcyBuXHUwMGUzbyByZXNvbHZpZGFzDQotZ3VpZGFuY2VQYWdlX3RpdGxlPU9yaWVudGFcdTAwZTdcdTAwZTNvDQotcHJldmlld1BhZ2VfdGl0bGU9VmlzdWFsaXphcg0KLXJlZmVyZW5jZXNQYWdlX3RpdGxlPVJlZmVyXHUwMGVhbmNpYXMNCi1yZWZlcmVuY2VfdGV4dD1SZWZlclx1MDBlYW5jaWFzOg0KLXJlZmVyZW5jZVdvcmtmbG93UGFnZV90aXRsZT1GbHV4byBkZSBUcmFiYWxobyBkZSBSZWZlclx1MDBlYW5jaWENCi1yb2xlc1BhZ2VfdGl0bGU9RnVuXHUwMGU3XHUwMGY1ZXMNCi1yb2xlU2V0c1BhZ2VfdGl0bGU9Q29uanVudG9zIGRlIEZ1blx1MDBlN1x1MDBmNWVzDQotc3RlcHNQYWdlX3RpdGxlPUV0YXBhcw0KLXRhc2tzUGFnZV90aXRsZT1UYXJlZmFzDQotdG9vbE1lbnRvcnNQYWdlX3RpdGxlPU1lbnRvcmVzIGRlIEZlcnJhbWVudGFzDQotd29ya1Byb2R1Y3RzUGFnZV90aXRsZT1Qcm9kdXRvcyBkZSBUcmFiYWxobw0KLQ0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uDQotY2hlY2tJdGVtc1NlY3Rpb25fbmFtZT1JdGVucyBkZSBWZXJpZmljYVx1MDBlN1x1MDBlM28NCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPUVzcGVjaWZpY2FyIG9zIGl0ZW5zIGRlIHZlcmlmaWNhXHUwMGU3XHUwMGUzbyBxdWUgY29uc3RpdHVlbSBlc3RhIGxpc3RhIGRlIHZlcmlmaWNhXHUwMGU3XHUwMGUzby4NCi1kZXBlbmRlbmNpZXNTZWN0aW9uX25hbWU9RGVwZW5kXHUwMGVhbmNpYXMNCi1kZXBlbmRlbmNpZXNTZWN0aW9uX2Rlc2M9RXN0YSBzZVx1MDBlN1x1MDBlM28gZXhpYmUgZGVwZW5kXHUwMGVhbmNpYXMgZGVzdGUgcGFjb3RlIGRlIGNvbnRlXHUwMGZhZG8gcGFyYSBvdXRyb3MgcGFjb3RlcyBkZSBjb250ZVx1MDBmYWRvLg0KLWRldGFpbFNlY3Rpb25fbmFtZT1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgRGV0YWxoYWRhcw0KLWRldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZWNlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGV0YWxoYWRhcyBzb2JyZSBlc3RlL2VzdGEgezB9Lg0KLWdlbmVyYWxJbmZvU2VjdGlvbl9uYW1lPUluZm9ybWFcdTAwZTdcdTAwZjVlcyBHZXJhaXMNCi1nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlL2VzdGEgezB9Lg0KLWljb25TZWN0aW9uX25hbWU9XHUwMGNkY29uZQ0KLWljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXphciBvcyBcdTAwZWRjb25lcyBwYXJhIGVzdGUvZXN0YSB7MH0uDQotbm90YXRpb25TZWN0aW9uX25hbWU9SW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIEVudHJlZ2ENCi1ub3RhdGlvblNlY3Rpb25fZGVzYz1Gb3JuZWNlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgZW50cmVnYSBzb2JyZSBlc3RlIHswfS4NCi1yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fbmFtZT1QbHVnLWlucyBSZWZlcmVuY2lhZG9zOg0KLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9kZXNjPUVzdGEgc2VcdTAwZTdcdTAwZTNvIGV4aWJlIG9zIHBsdWctaW5zIHJlZmVyZW5jaWFkb3MgcG9yIGVzdGUgcGx1Zy1pbiBkZSBtXHUwMGU5dG9kby4NCi1zdGFmZmluZ1NlY3Rpb25fbmFtZT1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgc29icmUgRGVmaW5pXHUwMGU3XHUwMGUzbyBkYSBFcXVpcGUNCi1zdGFmZmluZ1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIHNvYnJlIGEgZGVmaW5pXHUwMGU3XHUwMGUzbyBkYSBlcXVpcGUgcGFyYSBlc3RhIGZ1blx1MDBlN1x1MDBlM28uDQotc3RlcHNTZWN0aW9uX25hbWU9RXRhcGFzDQotc3RlcHNTZWN0aW9uX2Rlc2M9RXNwZWNpZmljYXIgYXMgZXRhcGFzIHBhcmEgZGVzZW1wZW5oYXIgZXN0YSB0YXJlZmEuDQotdGFpbG9yaW5nU2VjdGlvbl9uYW1lPUFkYXB0YVx1MDBlN1x1MDBlM28NCi10YWlsb3JpbmdTZWN0aW9uX2Rlc2M9Rm9ybmVjZXIgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIHNvYnJlIGFkYXB0YVx1MDBlN1x1MDBlM28gc29icmUgZXN0ZS9lc3RhIHswfS4NCi12YXJpYWJpbGl0eVNlY3Rpb25fbmFtZT1WYXJpYWJpbGlkYWRlIGRvIENvbnRlXHUwMGZhZG8NCi12YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaWNhciBjb21vIGVzdGUvZXN0YSB7MH0gc2UgcmVsYWNpb25hIGNvbSBvdXRyby9vdXRyYSB7MH0uDQotdmVyc2lvbkluZm9TZWN0aW9uX25hbWU9SW5mb3JtYVx1MDBlN1x1MDBmNWVzIHNvYnJlIFZlcnNcdTAwZTNvDQotdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVjZXIgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIHNvYnJlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGUvZXN0YSB7MH0uDQotDQotIyBVSSAmIEVsZW1lbnQgQXR0cmlidXRlIExhYmVscw0KLWFkZGl0aW9uYWxJbmZvX3RleHQ9SW5mb3JtYVx1MDBlN1x1MDBmNWVzIEFkaWNpb25haXM6DQotYXBwbGljYXRpb25fdGV4dD1BcGxpY2F0aXZvOg0KLWFjdGlvbkxhYmVsX2VkaXQ9RWRpdGFyDQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1Nb3N0cmFyIG5hIFZpc3VhbGl6YVx1MDBlN1x1MDBlM28gZGUgQmlibGlvdGVjYQ0KLWFsdGVybmF0aXZlc190ZXh0PUFsdGVybmF0aXZhczoNCi1hc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0PUFib3JkYWdlbnMgZGUgZGVzaWduYVx1MDBlN1x1MDBlM286DQotYXV0aG9yc190ZXh0PUF1dG9yZXM6DQotYmFja2dyb3VuZF90ZXh0PUluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSBiYXNlOg0KLWJhc2VFbGVtZW50X3RleHQ9QmFzZToNCi1iYXNlR3VpZGFuY2VfdGV4dD1PcmllbnRhXHUwMGU3XHUwMGUzbyBkZSBiYXNlOg0KLWJyaWVmRGVzY3JpcHRpb25fdGV4dD1EZXNjcmlcdTAwZTdcdTAwZTNvIHJlc3VtaWRhOg0KLWRlc2NyaXB0aW9uX3RleHQ9RGVzY3JpXHUwMGU3XHUwMGUzbzoNCi1iYWNrdXBiZWZvcmVzYXZlX3RleHQ9RmF6ZXIgYmFja3VwIGFudGVzIGRlIHNhbHZhcg0KLWJyaWVmT3V0bGluZV90ZXh0PUVzYm9cdTAwZTdvIHJlc3VtaWRvOg0KLWNoYW5nZURhdGVfdGV4dD1EYXRhIGRhIGFsdGVyYVx1MDBlN1x1MDBlM286DQotY2hhbmdlRGVzY3JpcHRpb25fdGV4dD1EZXNjcmlcdTAwZTdcdTAwZTNvIGRhIGFsdGVyYVx1MDBlN1x1MDBlM286DQotY2hlY2tJdGVtc190ZXh0PUl0ZW5zIGRlIFZlcmlmaWNhXHUwMGU3XHUwMGUzbw0KLWNvbnRyaWJ1dGVzX3RleHQ9Q29udHJpYnVpDQotbG9jYWxDb250cmlidXRlc190ZXh0PUxvY2FsQ29udHJpYnV0ZXMNCi1jb250cmlidXRlc190b190ZXh0PUNvbnRyaWJ1aSBwYXJhDQotY29weXJpZ2h0X3RleHQ9RGlyZWl0b3MgYXV0b3JhaXM6DQotZWRpdG9yX3RleHQ9RWRpdG9yDQotZXh0ZW5kc190ZXh0PUV4dGVuc1x1MDBmNWVzDQotZXh0ZW5kX3RleHQ9RXh0ZW5zXHUwMGUzbw0KLWV4dGVybmFsRGVzY3JpcHRpb25fdGV4dD1EZXNjcmlcdTAwZTdcdTAwZTNvIGV4dGVybmE6DQotZXh0ZXJuYWxJZF90ZXh0PUlEIGV4dGVybm86DQotZ29hbHNfdGV4dD1NZXRhczoNCi1pbXBhY3RPZk5vdEhhdmluZ190ZXh0PUltcGFjdG8gZGUgblx1MDBlM28gdGVyOg0KLWtleUNvbnNpZGVyYXRpb25zX3RleHQ9Q29uc2lkZXJhXHUwMGU3XHUwMGY1ZXMgY2hhdmU6DQotbGV2ZWxzT2ZBZG9wdGlvbl90ZXh0PU5cdTAwZWR2ZWwgZGUgYWRvXHUwMGU3XHUwMGUzbzoNCi1tYWluRGVzY3JpcHRpb25fdGV4dD1EZXNjcmlcdTAwZTdcdTAwZTNvIHByaW5jaXBhbDoNCi1uZXdFbGVtZW50X3RleHQ9Tm92byB7MH0NCi1uYW1lX3RleHQ9Tm9tZToNCi1ub3RBcHBsaWNhYmxlX3RleHQ9Tlx1MDBlM28gYXBsaWNcdTAwZTF2ZWwNCi1wYWNrYWdpbmdHdWlkYW5jZV90ZXh0PU9yaWVudGFcdTAwZTdcdTAwZTNvIGRlIGVtcGFjb3RhbWVudG86DQotcHJlc2VudGF0aW9uTmFtZV90ZXh0PU5vbWUgZGEgYXByZXNlbnRhXHUwMGU3XHUwMGUzbzoNCi1wcm9tcHRmb3JsaWJhcnlfdGV4dD1QZWRpciBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBuYSBpbmljaWFsaXphXHUwMGU3XHUwMGUzbw0KLWVuYWJsZUhlYWx0aENoZWNrX3RleHQ9QXRpdmFyIGZlcnJhbWVudGFzIGRlIGRlcHVyYVx1MDBlN1x1MDBlM28gaW50ZXJuYXMNCi1wcm9ibGVtX3RleHQ9UHJvYmxlbWE6DQotcHVycG9zZV90ZXh0PU9iamV0aXZvOg0KLXJlYXNvbkZvck5vdE5lZWRpbmdfdGV4dD1SYXpcdTAwZTNvIHBhcmEgblx1MDBlM28gbmVjZXNzaXRhcjoNCi1yZXBsYWNlc190ZXh0PVN1YnN0aXR1aQ0KLWxvY2FsUmVwbGFjZXNfdGV4dD1Mb2NhbFJlcGxhY2VzDQotcmVwcmVzZW50YXRpb25PcHRpb25zX3RleHQ9T3BcdTAwZTdcdTAwZjVlcyBkZSByZXByZXNlbnRhXHUwMGU3XHUwMGUzbzoNCi10ZW1wbGF0ZUZpbGVfdGV4dD1BcnF1aXZvKHMpIGRlIGdhYmFyaXRvOg0KLXNraWxsc190ZXh0PUhhYmlsaWRhZGVzOg0KLXN0ZXBzX3RleHQ9RXRhcGFzOg0KLXN0ZXBzX25hbWVfdGV4dD1Ob21lOg0KLXN0b3BfdGV4dD1QYXJhcg0KLXByaW50X3RleHQ9SW1wcmltaXINCi1zeW5vbnltc190ZXh0PVNpblx1MDBmNG5pbW9zOg0KLXR5cGVfdGV4dD1UaXBvOg0KLWNvcHlfdGV4dD1Db3BpYXINCi1kZWVwQ29weV90ZXh0PUNcdTAwZjNwaWEgUHJvZnVuZGENCi1iYWNrX3RleHQ9Vm9sdGFyDQotbmV3X3BsdWdpbj1Ob3ZvIFBsdWctaW4gZGUgTVx1MDBlOXRvZG8NCi1tb3ZlPU1vdmVyLi4uDQotdW5pcXVlSWRfdGV4dD1JRCBFeGNsdXNpdm86DQotdmFyaWFiaWxpdHlUeXBlX3RleHQ9VGlwbyBkZSB2YXJpYWJpbGlkYWRlOg0KLXZlcnNpb25fdGV4dD1WZXJzXHUwMGUzbzoNCi0NCi0jIEJ1dHRvbiBMYWJlbHMNCi1hZGRCdXR0b25fdGV4dD1JbmNsdWlyLi4uDQotYXR0YWNoQnV0dG9uX3RleHQ9QW5leGFyLi4uDQotYnJvd3NlQnV0dG9uX3RleHQ9UHJvY3VyYXIuLi4NCi1jaGFuZ2VUeXBlQnV0dG9uX3RleHQ9QWx0ZXJhciBUaXBvLi4uDQotY2xlYXJCdXR0b25fdGV4dD1MaW1wYXINCi1kZWxldGVCdXR0b25fdGV4dD1EZWxldGUNCi1kZXRhY2hCdXR0b25fdGV4dD1EZXNhbmV4YXINCi1kaWFncmFtX3NhdmVFcnJvcj1FcnJvIGFvIHNhbHZhciBkaWFncmFtYQ0KLWRvd25CdXR0b25fdGV4dD1QYXJhIEJhaXhvDQotZGlyZWN0b3J5X3RleHQ9RGlyZXRcdTAwZjNyaW86DQotb3JkZXJCdXR0b25fdGV4dD1PcmRlbmFyDQotZWRpdEJ1dHRvbl90ZXh0PUVkaXRhci4uLg0KLXJlbW92ZUJ1dHRvbl90ZXh0PVJlbW92ZXINCi1yZW5hbWVBY3Rpb25fdGV4dD1SZW5vbWVhci4uLg0KLXJlbW92ZV90ZXh0PVJlbW92ZXINCi1yZW5hbWVfdGV4dD1SZW5vbWVhcg0KLVNhdmVBc190ZXh0PVNhbHZhciBjb21vDQotc2VsZWN0QnV0dG9uX3RleHQ9U2VsZWNpb25hci4uLg0KLWRlc2VsZWN0QnV0dG9uX3RleHQ9Q2FuY2VsYXIgc2VsZVx1MDBlN1x1MDBlM28NCi11cEJ1dHRvbl90ZXh0PVBhcmEgQ2ltYQ0KLW1ha2VEZWZhdWx0QnV0dG9uX3RleHQ9VG9ybmFyIFBhZHJcdTAwZTNvDQotdmlld0hpc3RvcnlCdXR0b25fdGV4dD1WaXN1YWxpemFyIEhpc3RcdTAwZjNyaWNvLi4uDQotIyBSb2xlIEVkaXRvciBUYXNrcyBQYWdlDQotcm9sZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1UYXJlZmFzDQotcm9sZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RXN0YSBmdW5cdTAwZTdcdTAwZTNvIFx1MDBlOSBhIGV4ZWN1dG9yYSBkYXMgdGFyZWZhcyBhIHNlZ3Vpci4NCi1yb2xlVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVRhcmVmYXMgZGlzcG9uXHUwMGVkdmVpcw0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1FeGVjdXRvciBwcmltXHUwMGUxcmlvOg0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9RXhlY3V0b3IgYWRpY2lvbmFsOg0KLXJvbGVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gdGFyZWZhcyBmb3JhbSBzZWxlY2lvbmFkYXMuDQotDQotIyBSb2xlIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kdXRvcyBkZSBUcmFiYWxobzoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RXNwZWNpZmlxdWUgcHJvZHV0b3MgZGUgdHJhYmFsaG8gcGVsb3MgcXVhaXMgZXN0YSBmdW5cdTAwZTdcdTAwZTNvIFx1MDBlOSByZXNwb25zXHUwMGUxdmVsLg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVByb2R1dG9zIGRlIHRyYWJhbGhvIGRpc3Bvblx1MDBlZHZlaXM6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZXNwb25zXHUwMGUxdmVsIHBvcjoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1Qcm9kdXRvcyBkZSB0cmFiYWxobyBxdWUgc1x1MDBlM28gc2FcdTAwZWRkYXMgZGUgdGFyZWZhcyBxdWUgZXN0YSBmdW5cdTAwZTdcdTAwZTNvIGRlc2VtcGVuaGE6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gcHJvZHV0b3MgZGUgdHJhYmFsaG8gZm9yYW0gc2VsZWNpb25hZG9zLg0KLQ0KLSMgUm9sZSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9T3JpZW50YVx1MDBlN1x1MDBlM28NCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgbGlua3MgcGFyYSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcyBuYSBmb3JtYSBkZSBvcmllbnRhXHUwMGU3XHUwMGUzby4NCi1yb2xlR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPU9yaWVudGFcdTAwZTdcdTAwZjVlcyBEaXNwb25cdTAwZWR2ZWlzOg0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1PcmllbnRhXHUwMGU3XHUwMGUzbzoNCi1yb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IG9yaWVudGFcdTAwZTdcdTAwZjVlcyBmb3JhbSBzZWxlY2lvbmFkYXMuDQotDQotIyBSb2xlIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9Q2F0ZWdvcmlhczoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlcmVuY2llIGFzIGNhdGVnb3JpYXMgXHUwMGUwcyBxdWFpcyBlc3RhIGZ1blx1MDBlN1x1MDBlM28gcGVydGVuY2UuDQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUNvbmp1bnRvcyBkZSBGdW5cdTAwZTdcdTAwZjVlczoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPUNhdGVnb3JpYXMgQ3VzdG9taXphZGFzOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPUNvbmp1bnRvcyBkZSBmdW5cdTAwZTdcdTAwZjVlczoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9Q2F0ZWdvcmlhcyBjdXN0b21pemFkYXM6DQotDQotIyBUYXNrIEVkaXRvciBSb2xlcyBQYWdlDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZT1GdW5cdTAwZTdcdTAwZjVlcw0KLXRhc2tSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPURlc2lnbmUgYXMgZnVuXHUwMGU3XHUwMGY1ZXMgcGFyYSBkZXNlbXBlbmhhciBlc3RhIHRhcmVmYS4NCi10YXNrUm9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUZ1blx1MDBlN1x1MDBmNWVzIGRpc3Bvblx1MDBlZHZlaXM6DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPUV4ZWN1dG9yIHByaW1cdTAwZTFyaW86DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsMj1FeGVjdXRvcmVzIGFkaWNpb25haXM6DQotdGFza1JvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBmdW5cdTAwZTdcdTAwZjVlcyBmb3JhbSBzZWxlY2lvbmFkYXMuDQotdGFza1JvbGVzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX21vZGlmeV9tZXNzYWdlPUlVUEEwMDA0NVc6IERlc2VqYSBhbHRlcmFyIG8gYWdlbnRlIHByaW1cdTAwZTFyaW8gcGFyYSAnJ3swfScnPw0KLXRhc2tSb2xlc1BhZ2VfY29uZmlybV90aXRsZT1Db25maXJtYXIgYWx0ZXJhXHUwMGU3XHUwMGUzbyBkZSBmdW5cdTAwZTdcdTAwZTNvIHByaW1cdTAwZTFyaWENCi0NCi0jIFRhc2sgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVByb2R1dG9zIGRlIFRyYWJhbGhvDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUVzcGVjaWZpcXVlIG9zIHByb2R1dG9zIGRlIHRyYWJhbGhvIGRlIGVudHJhZGEgZSBkZSBzYVx1MDBlZGRhIHBhcmEgZXN0YSB0YXJlZmEuDQotdGFza1dvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9UHJvZHV0b3MgZGUgVHJhYmFsaG8gRGlzcG9uXHUwMGVkdmVpcw0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9RW50cmFkYXMgb2JyaWdhdFx1MDBmM3JpYXM6DQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9RW50cmFkYXMgb3BjaW9uYWlzOg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwzPVNhXHUwMGVkZGFzOg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHByb2R1dG9zIGRlIHRyYWJhbGhvIGZvcmFtIHNlbGVjaW9uYWRvcy4NCi0NCi0jIFRhc2sgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPU9yaWVudGFcdTAwZTdcdTAwZTNvDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249Rm9ybmVcdTAwZTdhIGxpbmtzIHBhcmEgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGFkaWNpb25haXMgbmEgZm9ybWEgZGUgb3JpZW50YVx1MDBlN1x1MDBlM28uDQotdGFza0d1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1PcmllbnRhXHUwMGU3XHUwMGY1ZXMgRGlzcG9uXHUwMGVkdmVpczoNCi10YXNrR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9T3JpZW50YVx1MDBlN1x1MDBlM286DQotdGFza0d1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBvcmllbnRhXHUwMGU3XHUwMGY1ZXMgZm9yYW0gc2VsZWNpb25hZGFzLg0KLQ0KLSMgVGFzayBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUNhdGVnb3JpYXMNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlcmVuY2llIGFzIGNhdGVnb3JpYXMgXHUwMGUwcyBxdWFpcyBlc3RhIHRhcmVmYSBwZXJ0ZW5jZS4NCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RGlzY2lwbGluYXMNCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPUNhdGVnb3JpYXMgUGVyc29uYWxpemFkYXMNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1EaXNjaXBsaW5hczoNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9Q2F0ZWdvcmlhcyBjdXN0b21pemFkYXM6DQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIFRhc2tzIFBhZ2UNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uTmFtZT1UYXJlZmFzDQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPUVzdGUgcHJvZHV0byBkZSB0cmFiYWxobyBcdTAwZTkgdW1hIGVudHJhZGEgb3Ugc2FcdTAwZWRkYSBwYXJhIGFzIHRhcmVmYXMgYSBzZWd1aXIuDQotV29ya1Byb2R1Y3RfVGFza3NfQXZhaWxhYmxlTGFiZWw9VGFyZWZhcyBkaXNwb25cdTAwZWR2ZWlzDQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbD1FbnRyYWRhIG9icmlnYXRcdTAwZjNyaWE6DQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDI9RW50cmFkYSBvcGNpb25hbDoNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMz1TYVx1MDBlZGRhOg0KLVdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRhcmVmYXMgZm9yYW0gc2VsZWNpb25hZGFzLg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBSb2xlcyBQYWdlDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9RnVuXHUwMGU3XHUwMGY1ZXMNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QXMgdGFyZWZhcyBhIHNlZ3VpciBzXHUwMGUzbyByZXNwb25zXHUwMGUxdmVpcyBwb3IgZXN0ZSBwcm9kdXRvIGRlIHRyYWJhbGhvIG91IG8gbW9kaWZpY2FtLg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUZ1blx1MDBlN1x1MDBmNWVzIGRpc3Bvblx1MDBlZHZlaXMNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsPUZ1blx1MDBlN1x1MDBlM28gcmVzcG9uc1x1MDBlMXZlbDoNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsMj1GdW5cdTAwZTdcdTAwZjVlcyBtb2RpZmljYWRvcmFzOg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGZ1blx1MDBlN1x1MDBmNWVzIGZvcmFtIHNlbGVjaW9uYWRhcy4NCi0NCi0jIyBXb3JrIFByb2R1Y3QgRWRpdG9yIERlbGl2ZXJhYmxlIFBhcnRzIFBhZ2UNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25OYW1lPVBhcnRlcyBEaXN0cmlidVx1MDBlZHZlaXMNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Fc3BlY2lmaXF1ZSBvcyBwcm9kdXRvcyBkZSB0cmFiYWxobyBxdWUgY29uc3RpdHVlbSBlc3RlIGRpc3RyaWJ1XHUwMGVkdmVsLg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9UHJvZHV0b3MgZGUgdHJhYmFsaG8gZGlzcG9uXHUwMGVkdmVpcyBjb21vIHBhcnRlcyBkaXN0cmlidVx1MDBlZHZlaXM6DQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWxlY3RlZExhYmVsPVByb2R1dG9zIGRlIHRyYWJhbGhvIGNvbW8gcGFydGVzIGRpc3RyaWJ1XHUwMGVkdmVpczoNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHByb2R1dG9zIGRlIHRyYWJhbGhvIGZvcmFtIHNlbGVjaW9uYWRvcy4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPU9yaWVudGFcdTAwZTdcdTAwZTNvDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUZvcm5lXHUwMGU3YSBsaW5rcyBwYXJhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzIG5hIGZvcm1hIGRlIG9yaWVudGFcdTAwZTdcdTAwZTNvLg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPU9yaWVudGFcdTAwZTdcdTAwZjVlcyBEaXNwb25cdTAwZWR2ZWlzOg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9T3JpZW50YVx1MDBlN1x1MDBlM286DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gb3JpZW50YVx1MDBlN1x1MDBmNWVzIGZvcmFtIHNlbGVjaW9uYWRhcy4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRlZ29yaWFzDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R2VyZW5jaWUgYXMgY2F0ZWdvcmlhcyBcdTAwZTBzIHF1YWlzIGVzdGUgcHJvZHV0byBkZSB0cmFiYWxobyBwZXJ0ZW5jZS4NCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPURvbVx1MDBlZG5pb3MNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1UaXBvcyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvOg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwzPUNhdGVnb3JpYXMgQ3VzdG9taXphZGFzOg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Eb21cdTAwZWRuaW86DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1UaXBvIGRlIHByb2R1dG8gZGUgdHJhYmFsaG86DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMz1DYXRlZ29yaWFzIGN1c3RvbWl6YWRhczoNCi0NCi0jIFByYWN0aWNlIEVkaXRvciBSZWZlcmVuY2VzIFBhZ2UNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25OYW1lPUVsZW1lbnRvcyBkZSBDb250ZVx1MDBmYWRvDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RXNwZWNpZmlxdWUgb3MgZWxlbWVudG9zIGRlIGNvbnRlXHUwMGZhZG8gcmVmZXJlbmNpYWRvcyBwb3IgZXN0YSBwclx1MDBlMXRpY2EuDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1FbGVtZW50b3MgZGUgY29udGVcdTAwZmFkbyBkaXNwb25cdTAwZWR2ZWlzOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1FbGVtZW50b3MgZGUgY29udGVcdTAwZmFkbzoNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGVsZW1lbnRvcyBkZSBjb250ZVx1MDBmYWRvIGZvcmFtIHNlbGVjaW9uYWRvcy4NCi0NCi0jIENhdGVnb3J5IEVkaXRvciBHdWlkYW5jZSBQYWdlDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25OYW1lPU9yaWVudGFcdTAwZTdcdTAwZTNvDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXJlbmNpZSBhIG9yaWVudGFcdTAwZTdcdTAwZTNvIHF1ZSBwZXJ0ZW5jZSBhIGVzdGUvZXN0YSB7MH0uDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPU9yaWVudGFcdTAwZTdcdTAwZjVlcyBEaXNwb25cdTAwZWR2ZWlzOg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPU9yaWVudGFcdTAwZTdcdTAwZTNvOg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBvcmllbnRhXHUwMGU3XHUwMGY1ZXMgZm9yYW0gc2VsZWNpb25hZGFzLg0KLQ0KLSMgRGlzY2lwbGluZSBHcm91cGluZyBFZGl0b3IgRGlzY2lwbGluZXMgUGFnZQ0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uTmFtZT1EaXNjaXBsaW5hcw0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R2VyZW5jaWUgYXMgZGlzY2lwbGluYXMgcXVlIHBlcnRlbmNlbSBhIGVzdGUgYWdydXBhbWVudG8gZGUgZGlzY2lwbGluYXMuDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX2F2YWlsYWJsZUxhYmVsPURpc2NpcGxpbmFzIERpc3Bvblx1MDBlZHZlaXM6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw9RGlzY2lwbGluYXM6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGRpc2NpcGxpbmFzIGZvcmFtIHNlbGVjaW9uYWRhcy4NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX1VzZURlZmF1bHREaXJlY3RvcnlCdXR0b25MYWJlbD1VdGlsaXphciBkaXJldFx1MDBmM3JpbyBwYWRyXHUwMGUzbw0KLQ0KLSMgRGlzY2lwbGluZSBFZGl0b3IgVGFza3MgUGFnZQ0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9VGFyZWZhcw0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlcmVuY2llIGFzIHRhcmVmYXMgcXVlIHBlcnRlbmNlbSBhIGVzdGEgZGlzY2lwbGluYS4NCi1kaXNjaXBsaW5lVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVRhcmVmYXMgZGlzcG9uXHUwMGVkdmVpczoNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9VGFyZWZhczoNCi1kaXNjaXBsaW5lVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRhcmVmYXMgZm9yYW0gc2VsZWNpb25hZGFzLg0KLQ0KLSMgRGlzY2lwbGluZSBFZGl0b3IgUmVmZXJlbmNlIFdvcmtmbG93IFBhZ2UNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25OYW1lPUZsdXhvcyBkZSBUcmFiYWxobyBkZSBSZWZlclx1MDBlYW5jaWENCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXJlbmNpZSBvcyBmbHV4b3MgZGUgdHJhYmFsaG8gZGUgcmVmZXJcdTAwZWFuY2lhIHF1ZSBwZXJ0ZW5jZW0gYSBlc3RhIGRpc2NpcGxpbmEuDQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9hdmFpbGFibGVMYWJlbD1GbHV4b3MgZGUgVHJhYmFsaG8gZGUgUmVmZXJcdTAwZWFuY2lhIERpc3Bvblx1MDBlZHZlaXM6DQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsPUZsdXhvcyBkZSB0cmFiYWxobyBkZSByZWZlclx1MDBlYW5jaWE6DQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBmbHV4b3MgZGUgdHJhYmFsaG8gZGUgcmVmZXJcdTAwZWFuY2lhIGZvcmFtIHNlbGVjaW9uYWRvcy4NCi0NCi0jIERvbWFpbiBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kdXRvcyBkZSBUcmFiYWxobw0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlcmVuY2llIG9zIHByb2R1dG9zIGRlIHRyYWJhbGhvIHF1ZSBwZXJ0ZW5jZW0gYSBlc3RlIGRvbVx1MDBlZG5pby4NCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVByb2R1dG9zIGRlIHRyYWJhbGhvIGRpc3Bvblx1MDBlZHZlaXM6DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVByb2R1dG9zIGRlIHRyYWJhbGhvOg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gcHJvZHV0b3MgZGUgdHJhYmFsaG8gZm9yYW0gc2VsZWNpb25hZG9zLg0KLQ0KLSMgV29yayBQcm9kdWN0IEtpbmQgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9UHJvZHV0b3MgZGUgVHJhYmFsaG8NCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXJlbmNpZSBvcyBwcm9kdXRvcyBkZSB0cmFiYWxobyBxdWUgcGVydGVuY2VtIGEgZXN0ZSB0aXBvIGRlIHByb2R1dG8gZGUgdHJhYmFsaG8uDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1Qcm9kdXRvcyBkZSB0cmFiYWxobyBkaXNwb25cdTAwZWR2ZWlzOg0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Qcm9kdXRvcyBkZSB0cmFiYWxobzoNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHByb2R1dG9zIGRlIHRyYWJhbGhvIGZvcmFtIHNlbGVjaW9uYWRvcy4NCi0NCi0jIFJvbGUgU2V0IEdyb3VwaW5nIEVkaXRvciBSb2xlIFNldHMgUGFnZQ0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uTmFtZT1Db25qdW50b3MgZGUgRnVuXHUwMGU3XHUwMGY1ZXMNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlcmVuY2llIG9zIGNvbmp1bnRvcyBkZSBmdW5cdTAwZTdcdTAwZjVlcyBxdWUgcGVydGVuY2VtIGEgZXN0ZSBhZ3J1cGFtZW50byBkZSBjb25qdW50b3MgZGUgZnVuXHUwMGU3XHUwMGY1ZXMuDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsPUNvbmp1bnRvcyBkZSBGdW5cdTAwZTdcdTAwZjVlcyBEaXNwb25cdTAwZWR2ZWlzOg0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWxlY3RlZExhYmVsPUNvbmp1bnRvcyBkZSBmdW5cdTAwZTdcdTAwZjVlczoNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gY29uanVudG9zIGRlIGZ1blx1MDBlN1x1MDBmNWVzIGZvcmFtIHNlbGVjaW9uYWRvcy4NCi0NCi0jIFJvbGUgU2V0IEVkaXRvciBSb2xlcyBQYWdlDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1GdW5cdTAwZTdcdTAwZjVlcw0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlcmVuY2llIGFzIGZ1blx1MDBlN1x1MDBmNWVzIHF1ZSBwZXJ0ZW5jZW0gYSBlc3RlIGNvbmp1bnRvIGRlIGZ1blx1MDBlN1x1MDBmNWVzLg0KLXJvbGVTZXRSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RnVuXHUwMGU3XHUwMGY1ZXMgZGlzcG9uXHUwMGVkdmVpczoNCi1yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9RnVuXHUwMGU3XHUwMGY1ZXM6DQotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBmdW5cdTAwZTdcdTAwZjVlcyBmb3JhbSBzZWxlY2lvbmFkYXMuDQotDQotIyBUb29sIEVkaXRvciBUb29sIE1lbnRvcnMgUGFnZQ0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbk5hbWU9TWVudG9yZXMgZGUgRmVycmFtZW50YXMNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXJlbmNpZSBvcyBtZW50b3JlcyBkZSBmZXJyYW1lbnRhcyBxdWUgcGVydGVuY2VtIGEgZXN0YSBmZXJyYW1lbnRhLg0KLXRvb2xUb29sTWVudG9yc1BhZ2VfYXZhaWxhYmxlTGFiZWw9TWVudG9yZXMgZGUgZmVycmFtZW50YXMgZGlzcG9uXHUwMGVkdmVpczoNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw9TWVudG9yZXMgZGUgZmVycmFtZW50YXM6DQotdG9vbFRvb2xNZW50b3JzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBtZW50b3JlcyBkZSBmZXJyYW1lbnRhcyBmb3JhbSBzZWxlY2lvbmFkb3MuDQotDQotIyBDdXN0b20gQ2F0ZWdvcnkgRWRpdG9yIEFzc2lnbiBQYWdlDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lPUVsZW1lbnRvcyBkZSBDb250ZVx1MDBmYWRvDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXJlbmNpZSBvcyBlbGVtZW50b3MgZGUgY29udGVcdTAwZmFkbyBxdWUgY29uc3RpdHVlbSBlc3RhIGNhdGVnb3JpYSBjdXN0b21pemFkYS4NCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfYXZhaWxhYmxlTGFiZWw9RWxlbWVudG9zIGRlIENvbnRlXHUwMGZhZG8gRGlzcG9uXHUwMGVkdmVpczoNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VsZWN0ZWRMYWJlbD1FbGVtZW50b3MgZGUgY29udGVcdTAwZmFkbzoNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gZWxlbWVudG9zIGRlIGNvbnRlXHUwMGZhZG8gZm9yYW0gc2VsZWNpb25hZG9zLg0KLQ0KLSMgTmV3IE1ldGhvZCBQbHVnLWluIFdpemFyZA0KLW5ld1BsdWdpbldpemFyZF90aXRsZT1Ob3ZvIFBsdWctaW4gZGUgTVx1MDBlOXRvZG8NCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlPUNyaWUgdW0gbm92byBwbHVnLWluIGRlIG1cdTAwZTl0b2RvDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0PUVzcGVjaWZpcXVlIHVtIG5vbWUgZSBmb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBvIG5vdm8gcGx1Zy1pbiBkZSBtXHUwMGU5dG9kby4NCi1uZXdQbHVnaW5FcnJvcl9tc2c9SVVQQTAwMjFFOiBOXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBjcmlhciBvIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8uDQotbmV3UGx1Z2luRXJyb3JfcmVhc29uPUVycm8gaW50ZXJuby5cblwNCi1cblwNCi1DbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4NCi0NCi0jIEdlbmVyaWMgZGlhbG9nIHRpdGxlcw0KLWNyZWF0ZURpYWxvZ190aXRsZT1DcmlhciBFbGVtZW50bw0KLWRlbGV0ZURpYWxvZ190aXRsZT1FeGNsdWlyIEVsZW1lbnRvDQotZWRpdERpYWxvZ190aXRsZT1FZGl0YXIgRWxlbWVudG8NCi1lcnJvckRpYWxvZ190aXRsZT1FcnJvDQotbW92ZURpYWxvZ190aXRsZT1Nb3ZlciBFbGVtZW50bw0KLXJlbmFtZURpYWxvZ190aXRsZT1SZW5vbWVhciBFbGVtZW50bw0KLXdhcm5pbmdEaWFsb2dfdGl0bGU9QXZpc28NCi0NCi0jIEFkZCBDb25maWd1cmF0aW9uIHRvIFByb2Nlc3MgRXJyb3IgRGlhbG9nDQotYWRkQ29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9SW5jbHVpciBDb25maWd1cmFcdTAwZTdcdTAwZTNvIGVtIFByb2Nlc3NvDQotDQotIyBTZXQgRGVmYXVsdCBDb25maWd1cmF0aW9uIEVycm9yIERpYWxvZw0KLXNldERlZmF1bHRDb25maWdFcnJvckRpYWxvZ190aXRsZT1EZWZpbmlyIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28gUGFkclx1MDBlM28gcGFyYSBQcm9jZXNzbw0KLQ0KLSMgRWRpdCBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlPUVkaXRhciBFbGVtZW50byBkZSBQcm9jZXNzbw0KLQ0KLSMgT3BlbiBMaWJyYXJ5IERpYWxvZw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlPUFicmlyIEJpYmxpb3RlY2EgZGUgTVx1MDBlOXRvZG9zDQotb3BlbkxpYnJhcnlEaWFsb2dfdGV4dD1BIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGF0dWFsIG5cdTAwZTNvIGZvaSBzYWx2YSBjb3JyZXRhbWVudGUuIERlc2VqYSBpZ25vcmFyIG8gZXJybyBlIGNvbnRpbnVhciBwYXJhIGFicmlyIG91dHJhIGJpYmxpb3RlY2E/DQotDQotIyBTYXZlIExpYnJhcnkgRGlhbG9nDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGU9U2FsdmFyIEJpYmxpb3RlY2EgZGUgTVx1MDBlOXRvZG9zDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dD1BIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGF0dWFsIGZvaSBtb2RpZmljYWRhLiBEZXNlamEgc2FsdmFyIGFzIGFsdGVyYVx1MDBlN1x1MDBmNWVzPw0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPUZhemVyIFVwZ3JhZGUgZGUgQmlibGlvdGVjYSBkZSBNXHUwMGU5dG9kb3MNCi0NCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cNCi1kZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PU8gZWxlbWVudG8gJyd7MH0nJyBqXHUwMGUxIGZvaSBleGNsdVx1MDBlZGRvLiBEZXNlamEgcmVtb3ZcdTAwZWEtbG8gZGUgJyd7MX0nJz8NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbm9PcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwMEU6IE5lbmh1bWEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZXN0XHUwMGUxIGFiZXJ0YS5cblwNCi1cblwNCi1cdTAwYzkgcHJlY2lzbyBxdWUgaGFqYSB1bWEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYWJlcnRhIHBhcmEgcG9kZXIgaW5jbHVpciB1bSBub3ZvIGVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvLlxuXA0KLVxuXA0KLUNyaWUgdW1hIG5vdmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3Mgb3UgYWJyYSB1bWEgZXhpc3RlbnRlIGUgdGVudGUgbm92YW1lbnRlLg0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDFFOiBPIG5vbWUgZGUgezB9IGVzdFx1MDBlMSBhdXNlbnRlLlxuXA0KLVxuXA0KLVRvZG9zIG9zIGVsZW1lbnRvcyBkZSBtXHUwMGU5dG9kbyBlIGRlIHByb2Nlc3NvIGRldmVtIHRlciB1bSBub21lLlxuXA0KLVxuXA0KLUNsaXF1ZSBlbSBPSyBlIGRpZ2l0ZSB1bSBub21lIHZcdTAwZTFsaWRvIHBhcmEgbyBlbGVtZW50by4NCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBBMDAwMkU6IE8gbm9tZSAnJ3swfScnIGpcdTAwZTEgZXhpc3RlLlxuXA0KLVxuXA0KLVVtIGVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvIGRldmUgdGVyIHVtIG5vbWUgZXhjbHVzaXZvLlxuXA0KLVxuXA0KLUNsaXF1ZSBlbSBPSyBlIGRpZ2l0ZSB1bSBub21lIGRpZmVyZW50ZSBwYXJhIG8gZWxlbWVudG8uDQotY3JlYXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDAzRTogTlx1MDBlM28gXHUwMGU5IHBvc3NcdTAwZWR2ZWwgY3JpYXIgYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRvIG1cdTAwZTl0b2RvLg0KLWRlbGV0ZUNvbmZpZ0Vycm9yX21zZz1JVVBBMDAwNFc6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGV4Y2x1aXIgYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRvIG1cdTAwZTl0b2RvLg0KLWludGVybmFsRXJyb3JfbXNnPUlVUEEwMDA1RTogT2NvcnJldSB1bSBlcnJvIGludGVybm8uXG5cDQotXG5cDQotQ2xpcXVlIGVtIERldGFsaGVzIHBhcmEgb2J0ZXIgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGFkaWNpb25haXMuDQotaW52YWxpZFByZXNlbnRhdGlvbk5hbWVFcnJvcl9tc2c9SVVQQTAwMDZFOiBPIG5vbWUgZGUgYXByZXNlbnRhXHUwMGU3XHUwMGUzbyBlc3BlY2lmaWNhZG8gXHUwMGU5IGludlx1MDBlMWxpZG8uXG5cDQotXG5cDQotQ2xpcXVlIGVtIE9LIGUgZGlnaXRlIHVtIG5vbWUgZGlmZXJlbnRlLg0KLWludmFsaWRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDdFOiBBIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgbVx1MDBlOXRvZG8gc2VsZWNpb25hZGEgJyd7MH0nJyBuXHUwMGUzbyBcdTAwZTkgdW0gc3ViY29uanVudG8gZGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBwYWRyXHUwMGUzbyBkb3MgcHJvY2Vzc29zIHBhZHJcdTAwZTNvLlxuXA0KLVxuXA0KLVBhcmEgbWFudGVyIGEgaW50ZWdyaWRhZGUgZGUgdW0gcHJvY2Vzc28sIHN1YSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHBhZHJcdTAwZTNvIGRldmUgc2VyIHVtIHN1cGVyY29uanVudG8gZGUgdG9kYXMgYXMgb3V0cmFzIGNvbmZpZ3VyYVx1MDBlN1x1MDBmNWVzIGFzc29jaWFkYXMgYW8gcHJvY2Vzc28uXG5cDQotXG5cDQotU2VsZWNpb25lIG91dHJhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gb3UgbW9kaWZpcXVlIGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBwYWRyXHUwMGUzbyBwYXJhIGluY2x1aXIgbyBjb250ZVx1MDBmYWRvIGRhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gc2VsZWNpb25hZGEgZSB0ZW50ZSBub3ZhbWVudGUuDQotc2V0RGVmYXVsdENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwOEU6IEEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBtXHUwMGU5dG9kbyBzZWxlY2lvbmFkYSAnJ3swfScnIG5cdTAwZTNvIFx1MDBlOSB1bSBzdXBlcmNvbmp1bnRvIGRhcyBvdXRyYXMgY29uZmlndXJhXHUwMGU3XHUwMGY1ZXMgcmVmZXJlbmNpYWRhcyBwZWxvIHByb2Nlc3NvLlxuXA0KLVxuXA0KLVBhcmEgbWFudGVyIGEgaW50ZWdyaWRhZGUgZGUgdW0gcHJvY2Vzc28sIHN1YSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHBhZHJcdTAwZTNvIGRldmUgc2VyIHVtIHN1cGVyY29uanVudG8gZGUgdG9kYXMgYXMgb3V0cmFzIGNvbmZpZ3VyYVx1MDBlN1x1MDBmNWVzIGFzc29jaWFkYXMgYW8gcHJvY2Vzc28uXG5cDQotXG5cDQotU2VsZWNpb25lIG91dHJhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gb3UgbW9kaWZpcXVlIG8gY29udGVcdTAwZmFkbyBkYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHNlbGVjaW9uYWRhIGUgdGVudGUgbm92YW1lbnRlLg0KLW9wZW5MaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDA5RTogTlx1MDBlM28gXHUwMGU5IHBvc3NcdTAwZWR2ZWwgY2FycmVnYXIgYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy5cblwNCi1cblwNCi1DbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4NCi1zYXZlTGlicmFyeUVycm9yX21zZz1JVVBBMDAxMEU6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIHNhbHZhciBhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLg0KLXNhdmVMaWJyYXJ5VG9FcnJvcl9tc2c9SVVQQTAwMTBFOiBOXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCBzYWx2YXIgYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBwYXJhICcnezB9JycuDQotZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnPUlVUEEwMDExRTogTyBlbGVtZW50byAnJ3swfScnIGpcdTAwZTEgZm9pIGV4Y2x1XHUwMGVkZG8uDQotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTJFOiBOXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCBmYXplciB1cGdyYWRlIGRhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLg0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1JVVBBMDAxNkU6IE9jb3JyZXUgdW0gZXJyby5cblwNCi1cblwNCi1DbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4NCi1pbnRlcm5hbEVycm9yX3JlYXNvbj1JVVBBMDAxN0U6IE9jb3JyZXUgdW0gZXJybyBpbnRlcm5vLlxuXA0KLVxuXA0KLUNsaXF1ZSBlbSBEZXRhbGhlcyBwYXJhIG9idGVyIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzLg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE4RTogT2NvcnJldSB1bSBlcnJvIGFvIGNhcnJlZ2FyIG9zIGVsZW1lbnRvcyBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy5cblwNCi1cblwNCi1DbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4NCi1zYXZlVXBncmFkZWRMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE5RTogT2NvcnJldSB1bSBlcnJvIGFvIHNhbHZhciBhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGF0dWFsaXphZGEuXG5cDQotXG5cDQotQ2xpcXVlIGVtIERldGFsaGVzIHBhcmEgb2J0ZXIgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGFkaWNpb25haXMuDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLW9wZW5pbmdMaWJyYXJ5VGFza19uYW1lPUFicmluZG8gYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4uLg0KLXNhdmluZ0xpYnJhcnlUYXNrX25hbWU9U2FsdmFuZG8gYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuLi4NCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPUZhemVuZG8gdXBncmFkZSBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4uLg0KLWxvYWRpbmdMaWJyYXJ5RWxlbWVudHNUYXNrX25hbWU9Q2FycmVnYW5kbyBlbGVtZW50b3MgZGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuLi4NCi1zYXZpbmdVcGdyYWRlZEVsZW1lbnRzVGFza19uYW1lPVNhbHZhbmRvIGVsZW1lbnRvcyBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBlbSBub3ZvIGZvcm1hdG8gZGUgYXJxdWl2by4uLg0KLXNhdmluZ1Rhc2tfbmFtZT1TYWx2YW5kbyAnJ3swfScnLi4uDQotc2F2aW5nRmlsZXNUYXNrX25hbWU9U2FsdmFuZG8gYXJxdWl2b3MuLi4NCi1maXhpbmdDb250ZW50RGVzY3JpcHRpb25HVUlEc1Rhc2tfbmFtZT1Db3JyaWdpbmRvIEdVSURzIGRlIGRlc2NyaVx1MDBlN1x1MDBlM28gZGUgY29udGVcdTAwZmFkby4uLg0KLWRlbGV0aW5nSW52YWxpZFJlZmVyZW5jZXNUYXNrX25hbWU9RXhjbHVpbmRvIHJlZmVyXHUwMGVhbmNpYXMgaW52XHUwMGUxbGlkYXMuLi4NCi0NCi0NCi0jIEFkZCBFZGl0b3IgVG8gQnJvd3NpbmcgUGVyc3BlY3RpdmUgV2FybmluZyBEaWFsb2cNCi1hZGRFZGl0b3JUb1BlcnNwZWN0aXZlV2FybmluZ19tc2c9SVVQQTAwNDZXOiBFc3RhIHBlcnNwZWN0aXZhIGZvaSBkZXNlbnZvbHZpZGEgZXNwZWNpYWxtZW50ZSBwYXJhIG1heGltaXphciBhIGV4cGVyaVx1MDBlYW5jaWEgZG8gdXN1XHUwMGUxcmlvIGVtIHJlbGFcdTAwZTdcdTAwZTNvIFx1MDBlMCBuYXZlZ2FcdTAwZTdcdTAwZTNvIG5hIHJlcHJlc2VudGFcdTAwZTdcdTAwZTNvIEhUTUwgZG9zIGVsZW1lbnRvcyBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4gTmVuaHVtIGVkaXRvciBwb2RlIHNlciBpbmNsdVx1MDBlZGRvIG91IGV4aWJpZG8gYXF1aS4NCi0NCi0jIENoYW5nZSBIaXN0b3J5IERpYWxvZw0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfdGl0bGU9QWx0ZXJhciBIaXN0XHUwMGYzcmljbyBkZSBEZXNjcmlcdTAwZTdcdTAwZTNvDQotQ2hhbmdlSGlzdG9yeURpYWxvZ19sYWJlbD1BbHRlcmFyIG8gaGlzdFx1MDBmM3JpY286DQotDQotIyBNZXRob2QgRWxlbWVudCBEZWxldGUgQWN0aW9uDQotY29uZmlybURlbGV0ZURpYWxvZ190aXRsZT1Db25maXJtYXIgRXhjbHVzXHUwMGUzbw0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnPVRlbSBjZXJ0ZXphIGRlIHF1ZSBkZXNlamEgZXhjbHVpciAnJ3swfScnPw0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnV2l0aFJlZmVyZW5jZT1UZW0gY2VydGV6YSBkZSBxdWUgZGVzZWphIGV4Y2x1aXIgJyd7MH0nJz9cblwNCi1cblwNCi1PcyBzZWd1aW50ZXMgZWxlbWVudG9zIGNvbnRcdTAwZWFtIHJlZmVyXHUwMGVhbmNpYXMgYW9zIHRlcm1vcyBhIHNlcmVtIGV4Y2x1XHUwMGVkZG9zOiB7MX0NCi0NCi0jIE5ldyBMaWJyYXJ5IERpYWxvZw0KLWVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjJFOiBOXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCBjcmlhciBhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zICcnezB9JycuDQotZXJyb3JEaWFsb2dfZXJyb3I9SW1wb3NzXHUwMGVkdmVsIGNyaWFyIHVtYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBkZW50cm8gZGUgb3V0cmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuDQotZXJyX25vb3BlbmxpYnJhcnk9SVVQQTAwNDBFOiBOZW5odW1hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGVzdFx1MDBlMSBhYmVydGEuXG5cDQotXG5cDQotXHUwMGM5IHByZWNpc28gcXVlIGhhamEgdW1hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGFiZXJ0YSBwYXJhIHBvZGVyIGluY2x1aXIgdW0gbm92byBwbHVnLWluIGRlIG1cdTAwZTl0b2RvLlxuXA0KLVxuXA0KLUNyaWUgdW1hIG5vdmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3Mgb3UgYWJyYSB1bWEgZXhpc3RlbnRlIGUgdGVudGUgbm92YW1lbnRlLg0KLWVycl9sb2FkaW5nbGlicmFyeT1FcnJvIGFvIGNhcnJlZ2FyIGJpYmxpb3RlY2ENCi1tc2dfcmVsb2FkTGlicmFyeT1FcnJvIGFvIGRlc2ZhemVyIGEgZXhjbHVzXHUwMGUzbyBxdWUgZmFsaG91LiBBIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGF0dWFsIHByZWNpc2Egc2VyIHJlY2FycmVnYWRhLg0KLQ0KLSMgUmVsb2FkIExpYnJhcnkgRGlhbG9nDQotcmVsb2FkRGlhbG9nX21lc3NhZ2U9QSBiaWJsaW90ZWNhIHByZWNpc2Egc2VyIHJlY2FycmVnYWRhIHBhcmEgcmVzdGF1cmFyIHNldSBlc3RhZG8gb3JpZ2luYWwuDQotcmVsb2FkRGlhbG9nX3RpdGxlPVJlY2FycmVnYXIgQmlibGlvdGVjYQ0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlPUVycm8gZGUgTW92aW1lbnRhXHUwMGU3XHUwMGUzbw0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U9RXJybyBkdXJhbnRlIGEgbW92aW1lbnRhXHUwMGU3XHUwMGUzbw0KLQ0KLSMgUHJvY2VzcyBGb3JtIEVkaXRvcg0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZT1TYWx2YXINCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTE9RXN0YSBhbHRlcmFcdTAwZTdcdTAwZTNvIGFmZXRhclx1MDBlMSB0b2RvcyBvcyBkaWFncmFtYXMgbm8gcHJvY2Vzc28uIE8gZWRpdG9yIHNlclx1MDBlMSBzYWx2byBhcFx1MDBmM3MgYSBhbHRlcmFcdTAwZTdcdTAwZTNvLiBEZXNlamEgY29udGludWFyPw0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMj1PIGVkaXRvciBzZXJcdTAwZTEgc2Fsdm8gYXBcdTAwZjNzIGEgYWx0ZXJhXHUwMGU3XHUwMGUzby4gRGVzZWphIGNvbnRpbnVhcj8NCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBQYWdlDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPUNvbmZpcm1hciBSZW1vXHUwMGU3XHUwMGUzbw0KLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlPXRlbSBjZXJ0ZXphIGRlIHF1ZSBkZXNlamEgcmVtb3ZlciBhIHZpc3VhbGl6YVx1MDBlN1x1MDBlM28gJyd7MH0nJz8NCi1jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfdGl0bGU9QXZpc28NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uPUNvbmZpZ3VyYVx1MDBlN1x1MDBlM286DQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdzPVZpc3VhbGl6YVx1MDBlN1x1MDBmNWVzIGRlIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi1jb25maWdWaWV3UGFnZV92aWV3cz1WaXN1YWxpemFcdTAwZTdcdTAwZjVlcw0KLWNvbHVtbnNlbGVjdGlvbl90ZXh0PVNlbGVcdTAwZTdcdTAwZTNvIGRlIGNvbHVuYToNCi1jb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dD1JbmNsdWlyIFZpc3VhbGl6YVx1MDBlN1x1MDBlM28uLi4NCi1jb25maWdWaWV3UGFnZV9yZW1vdmVWaWV3QnV0dG9uVGV4dD1SZW1vdmVyIFZpc3VhbGl6YVx1MDBlN1x1MDBlM28NCi1jb25maWdWaWV3UGFnZV9tYWtlRGVmYXVsdEJ1dHRvblRleHQ9VG9ybmFyIFBhZHJcdTAwZTNvDQotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNXOiBBIHZpc3VhbGl6YVx1MDBlN1x1MDBlM28gY29tIG8gbm9tZSAnJ3swfScnIGpcdTAwZTEgZXhpc3RlLg0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvblRpdGxlPVZpc3VhbGl6YVx1MDBlN1x1MDBmNWVzIGRlIE5hdmVnYVx1MDBlN1x1MDBlM28gUHVibGljYWRhcw0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvbk1lc3NhZ2U9RXNwZWNpZmlxdWUgYXMgdmlzdWFsaXphXHUwMGU3XHUwMGY1ZXMgcXVlIHNlclx1MDBlM28gaW5jbHVcdTAwZWRkYXMgcXVhbmRvIGVzdGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBmb3IgcHVibGljYWRhLiBQYXJhIGNyaWFyIHVtYSB2aXN1YWxpemFcdTAwZTdcdTAwZTNvLCBjbGlxdWUgZW0gSW5jbHVpciBWaXN1YWxpemFcdTAwZTdcdTAwZTNvIHBhcmEgc2VsZWNpb25hciBxdWFscXVlciBjYXRlZ29yaWEgcGFkclx1MDBlM28gb3UgY3VzdG9taXphZGEgbmEgY29uZmlndXJhXHUwMGU3XHUwMGUzby4gQSBjYXRlZ29yaWEgc2VsZWNpb25hZGEgcmVwcmVzZW50YXJcdTAwZTEgYSB2aXN1YWxpemFcdTAwZTdcdTAwZTNvIGUgYXMgc3ViLWNhdGVnb3JpYXMgZSBvcyBlbGVtZW50b3MgZGUgY29udGVcdTAwZmFkbyBkYSBjYXRlZ29yaWEgcmVwcmVzZW50YXJcdTAwZTNvIG9zIGVsZW1lbnRvcyBkYSBcdTAwZTFydm9yZSBkYSB2aXN1YWxpemFcdTAwZTdcdTAwZTNvLg0KLQ0KLSMgRGVzY3JpcHRpb24gVGFiDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU9Q29udmVydGVyIE9yaWVudGFcdTAwZTdcdTAwZTNvDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTE9SVVQQTAwNDBXOiBTYWx2ZSBvIGVkaXRvciBwcmltZWlyby4NCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMj1OXHUwMGUzbyBleGlzdGUgb3JpZW50YVx1MDBlN1x1MDBlM28gY29tcGF0XHUwMGVkdmVsIHBhcmEgZXN0ZSB0aXBvLg0KLQ0KLWNoYW5nZUFjdGl2aXR5VHlwZVdhcm5pbmdEaWFsb2dfdGl0bGU9Q29udmVydGVyIEF0aXZpZGFkZQ0KLSMgQXNzb2NpYXRpb24gRm9ybSBQYWdlDQotQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWw9RGVzY3JpXHUwMGU3XHUwMGUzbyByZXN1bWlkYSBkbyBlbGVtZW50byBzZWxlY2lvbmFkbzoNCi0NCi0jIE1ldGhvZCBFbGVtZW50IERlc2NyaXB0aW9uDQotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX3RpdGxlPURpZ2l0YXIgTm9tZSBkZSBFbGVtZW50bw0KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ19tZXNzYWdlPU8gY2FtcG8gZGUgbm9tZSBuXHUwMGUzbyBwb2RlIGVzdGFyIHZhemlvLg0KLQ0KLSMgTWV0aG9kIFBsdWctaW4gRGVzY3JpcHRpb24NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZT1DYW5jZWxhciBhIHNlbGVcdTAwZTdcdTAwZTNvIGRvcyBwbHVnLWlucyByZWZlcmVuY2lhZG9zIGFzc29jaWFkb3MgYW8gcGx1Zy1pbiAnJ3swfScnIHByb2R1emlyXHUwMGUxIHJlbGFjaW9uYW1lbnRvcyBpbnZcdTAwZTFsaWRvcyBxdWUgc2VyXHUwMGUzbyBleGNsdVx1MDBlZGRvcy5cblwNCi1cblwNCi1Fc3RhIGFcdTAwZTdcdTAwZTNvIG5cdTAwZTNvIHBvZGUgc2VyIGRlc2ZlaXRhLiBEZXNlamEgY29udGludWFyIGNvbSBlc3RhIGFsdGVyYVx1MDBlN1x1MDBlM28/DQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU9Vm9jXHUwMGVhIGVzdFx1MDBlMSBwcmVzdGVzIGEgYWx0ZXJhciBvIG5vbWUgZGVzdGUgcGx1Zy1pbiBkZSBtXHUwMGU5dG9kbyBkZSAnJ3swfScnIHBhcmEgbyBub3ZvIG5vbWUgJyd7MX0nJy4gRXN0YSBhXHUwMGU3XHUwMGUzbyBpclx1MDBlMSBzYWx2YXIgZXN0ZSBlZGl0b3IgZSByZW5vbWVhciBhIHBhc3RhIGRlIHBsdWctaW5zIGNvbSBvIG5vdm8gbm9tZS4gRGVzZWphIGNvbnRpbnVhcj8NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZT1SZW5vbWVhciBQbHVnLWluIGRlIE1cdTAwZTl0b2RvDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2Nhbm5vdFJlbmFtZVBsdWdpbkZvbGRlcj1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCByZW5vbWVhciBhIHBhc3RhIGRvIHBsdWdpbiBwYXJhIG8gbm92byBub21lLg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luTGFiZWw9QmxvcXVlYXIgcGx1Zy1pbg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luX21lc3NhZ2U9QSBhbHRlcmFcdTAwZTdcdTAwZTNvIEJsb3F1ZWFyIHBsdWctaW4gaXJcdTAwZTEgc2FsdmFyIGUgZmVjaGFyIG9zIGVkaXRvcmVzIGRlIGVsZW1lbnRvcyBhYmVydG9zIHF1ZSBwZXJ0ZW5jZXJlbSBhbyBwbHVnLWluICcnezB9JycuIERlc2VqYSBjb250aW51YXIgY29tIGVzdGEgYWx0ZXJhXHUwMGU3XHUwMGUzbz8NCi0NCi0jIFByb2Nlc3MgRGVzY3JpcHRpb24NCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV90aXRsZT1SZW5vbWVhcg0KLXByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX21lc3NhZ2U9Vm9jXHUwMGVhIGVzdFx1MDBlMSBwcmVzdGVzIGEgYWx0ZXJhciBvIG5vbWUgZGVzdGUgcHJvY2Vzc28uIElzc28gc2FsdmFyXHUwMGUxIGVzdGUgZWRpdG9yIGUgcmVub21lYXJcdTAwZTEgYSBwYXN0YSBkbyBwcm9jZXNzbyBjb20gbyBub3ZvIG5vbWUuIERlc2VqYSBjb250aW51YXI/DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbj1EZXNjcmlcdTAwZTdcdTAwZTNvOg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvblRpdGxlPUNvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlPUVzcGVjaWZpcXVlIHRvZGFzIGFzIGNvbmZpZ3VyYVx1MDBlN1x1MDBmNWVzIHZcdTAwZTFsaWRhcyBwYXJhIGVzdGUgcHJvY2Vzc28uIFNlbGVjaW9uZSB1bWEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBjb21vIGEgcGFkclx1MDBlM28uIEVsYSBwcmVjaXNhIHNlciB1bSBzdXBlcmNvbmp1bnRvIGRlIHRvZGFzIGFzIG91dHJhcyBjb25maWd1cmFcdTAwZTdcdTAwZjVlcy4NCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbnM9Q29uZmlndXJhXHUwMGU3XHUwMGY1ZXM6DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ9KHBhZHJcdTAwZTNvKQ0KLVByb2Nlc3NEZXNjcmlwdGlvbl9zZWxlY3RDb25maWd1cmF0aW9uPVNlbGVjaW9uZSBhcyBjb25maWd1cmFcdTAwZTdcdTAwZjVlcyBhIHNlcmVtIGluY2x1XHUwMGVkZGFzLg0KLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQwPUlzdG8gc2FsdmFyXHUwMGUxIG8gZWRpdG9yIGF0dWFsIGUgYSBhbHRlcmFcdTAwZTdcdTAwZTNvIHNlclx1MDBlMSBwZXJtYW5lbnRlLiBUZW0gY2VydGV6YSBkZSBxdWUgZGVzZWphIGV4Y2x1aXIgJyd7MH0nJz8NCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX3NlbGVjdERlc2NyaXB0b3JzVG9EZWxldGU9T3Mgc2VndWludGVzIGRlc2NyaXRvcmVzIG5cdTAwZTNvIHNcdTAwZTNvIHV0aWxpemFkb3MgZW0gbmVuaHVtIGx1Z2FyIGFwXHUwMGYzcyBhIGV4Y2x1c1x1MDBlM28gZG9zIGVsZW1lbnRvcyBzZWxlY2lvbmFkb3MuXG5cDQotU2VsZWNpb25lIG9zIGRlc2NyaXRvcmVzIHF1ZSB2b2NcdTAwZWEgZGVzZWphIGV4Y2x1aXIuDQotDQotIyBWaWV3IEhlbHBlcg0KLXZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ190aXRsZT1WZXJpZmljYVx1MDBlN1x1MDBlM28gZGUgRnVuY2lvbmFtZW50byBkYSBCaWJsaW90ZWNhDQotdmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2s9RXhlY3V0YW5kbyB2ZXJpZmljYVx1MDBlN1x1MDBlM28gZGUgZnVuY2lvbmFtZW50byBuYSBiaWJsaW90ZWNhLi4uDQotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U9QSB2ZXJpZmljYVx1MDBlN1x1MDBlM28gZGUgZnVuY2lvbmFtZW50byBuYSBiaWJsaW90ZWNhIGFiZXJ0YSBmb2kgY29uY2x1XHUwMGVkZGEgY29tIFx1MDBlYXhpdG8uIENvbnN1bHRlIG8gcmVsYXRcdTAwZjNyaW8gbm8gYXJxdWl2byBkZSByZWdpc3Ryby4NCi0NCi0jIEF0dGFjaCBUZW1wbGF0ZSBGaWxlIERpYWxvZw0KLWF0dGFjaFRlbXBsYXRlRmlsZURpYWxvZ190aXRsZT1BbmV4YXIgQXJxdWl2byBkZSBHYWJhcml0bw0KLQ0KLSMgQ3JlYXRlIEVsZW1lbnQgRXJyb3IgRGlhbG9nDQotY3JlYXRlRWxlbWVudERpYWxvZ190aXRsZT1DcmlhciBub3ZvL25vdmEgezB9DQotY3JlYXRlTmV3RWxlbWVudEVycm9yX21zZz1FcnJvIGFvIGNyaWFyIG5vdm8vbm92YSB7MH0uDQotDQotZGxnVGl0bGVfcmVsb2FkTGlicmFyeT1SZWNhcnJlZ2FyIEJpYmxpb3RlY2ENCi1jcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uPU8gbm9tZSBkZSB7MH0gblx1MDBlM28gcG9kZSBzZXIgdmF6aW8uXG5cDQotXG5cDQotRXNwZWNpZmlxdWUgdW0gbm9tZSB2XHUwMGUxbGlkbyBlIHRlbnRlIG5vdmFtZW50ZS4NCi1kZWxldGVDb25maWdFcnJvcl9yZWFzb249QSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIFx1MDBlOSByZWZlcmVuY2lhZGEgcGVsbyBwcm9jZXNzbyAnJ3swfScnIA0KLSMgQ2hhbmdlQm91bmRzQ29tbWFuZA0KLWdlZl9jaGFuZ2VCb3VuZHNDb21tYW5kX2xhYmVsPUFsdGVyYXIgTGltaXRlcw0KLSMgQ2hhbmdlTmFtZUNvbW1hbmQNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw9QWx0ZXJhciBvIE5vbWUNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U9SW1wb3NzXHUwMGVkdmVsIGRlc2ZhemVyIGEgYWx0ZXJhXHUwMGU3XHUwMGUzbyBkZSBub21lLlxuXA0KLVxuXA0KLU5cdTAwZTNvIFx1MDBlOSBwZXJtaXRpZG8gZGVzZmF6ZXIgdW1hIGFsdGVyYVx1MDBlN1x1MDBlM28gZGUgbm9tZSBzZSBvIG5vbWUgYW50ZXJpb3IgZXJhIG51bG8uDQotIyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZA0KLWdlZl9jaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZF9sYWJlbD1BbHRlcmFyIFZhbG9yIGRlIFByb3ByaWVkYWRlDQotIyBDcmVhdGVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX2NyZWF0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9Q3JpYXIgUG9udG8gZGUgQ3VydmF0dXJhDQotIyBDcmVhdGVMaW5rQ29tbWFuZA0KLWdlZl9jcmVhdGVMaW5rQ29tbWFuZF9sYWJlbD1GYXplciBMaW5rIGRlIENyaWFcdTAwZTdcdTAwZTNvDQotIyBDcmVhdGVOb2RlQ29tbWFuZA0KLWdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbD1DcmlhciBOb3ZvIE5cdTAwZjMNCi0jIERlbGV0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfZGVsZXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1FeGNsdWlyIFBvbnRvIGRlIEN1cnZhdHVyYQ0KLSMgRGVsZXRlQ29tbWFuZA0KLWdlZl9kZWxldGVDb21tYW5kX2xhYmVsPURlbGV0ZQ0KLSMgRGVsZXRlTGlua0NvbW1hbmQNCi1nZWZfZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw9RXhjbHVpciBDb25leFx1MDBlM28NCi0jIE1vdmVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX21vdmVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPU1vdmVyIFBvbnRvIGRlIEN1cnZhdHVyYQ0KLSMgUmVjb25uZWN0TGlua0NvbW1hbmQNCi1nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw9UmVjb25lY3RhciBMaW5rDQotDQotIyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXINCi1nZWZfdmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1PIG5vbWUgblx1MDBlM28gcG9kZSBlc3RhciB2YXppby4gRXNwZWNpZmlxdWUgdW0gbm9tZSB2XHUwMGUxbGlkby4NCi0jIFZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyDQotZ2VmX3ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1PIG5vbWUgblx1MDBlM28gcG9kZSBlc3RhciB2YXppby4gRXNwZWNpZmlxdWUgdW0gbm9tZSB2XHUwMGUxbGlkby4NCi0jIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0DQotZ2VmX3dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0X3ZhbGlkYXRlTWVzc2FnZT1PIG5vbWUgblx1MDBlM28gcG9kZSBlc3RhciB2YXppby4gRXNwZWNpZmlxdWUgdW0gbm9tZSB2XHUwMGUxbGlkby4NCi0NCi0jIEVsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbg0KLWFjdGlvbnNfRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uX21lc3NhZ2U9Tlx1MDBlM28gXHUwMGU5IHBvc3NcdTAwZWR2ZWwgZXhjbHVpciBhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gJyd7MH0nJyBwb3JxdWUgZWxhIGFpbmRhIGVzdFx1MDBlMSBlbSB1c28gcGVsbyBwcm9jZXNzbyAnJ3sxfScnLg0KLQ0KLSMgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JUaXRsZT1FcnJvIGRlIEV4Y2x1c1x1MDBlM28NCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvck1lc3NhZ2U9RXhjZVx1MDBlN1x1MDBlM28gblx1MDBlM28gbWFuaXB1bGFkYQ0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uPUNvbnN1bHRlIG9zIGRldGFsaGVzDQotDQotIyBNZXRob2RFbGVtZW50RWRpdG9yDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclRpdGxlPUVycm8gZGUgU2FsdmFtZW50bw0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMT1JVVBBMDAyMEU6IEVycm8gYW8gc2FsdmFyIGFycXVpdm8NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI9RXJybyBkZSBjb25maXJtYVx1MDBlN1x1MDBlM28NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMT1Db25zdWx0ZSBvIGFycXVpdm8gZGUgcmVnaXN0cm8gcGFyYSBvYnRlciBkZXRhbGhlcyBhZGljaW9uYWlzDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjI9Q29uc3VsdGUgb3MgZGV0YWxoZXMNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JUaXRsZT1FcnJvIGRlIFJlbm9tZWFcdTAwZTdcdTAwZTNvDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JNc2c9VW0gb3UgbXVpdG9zIGFycXVpdm9zIGRlc3RlIGVkaXRvciBmb3JhbSByZW1vdmlkb3MuIE8gZWRpdG9yIG5cdTAwZTNvIFx1MDBlOSBtYWlzIHZcdTAwZTFsaWRvIGUgdGVtIGRlIHNlciBmZWNoYWRvLg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yVGl0bGU9RWRpdG9yIEludlx1MDBlMWxpZG8NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JNZXNzYWdlMT1FcnJvIGFvIHJlbm9tZWFyIG8ocykgYXJxdWl2byhzKSAnJ3swfScnDQotDQotIyBEZXNjcmlwdGlvbkZvcm1QYWdlDQotcmVuYW1lRXJyb3JfdGl0bGU9UmVub21lYXIgRWxlbWVudG8NCi1yZW5hbWVFcnJvcl9tc2c9SVVQQTAwMTNFOiBJbXBvc3NcdTAwZWR2ZWwgY29uY2x1aXIgYSBvcGVyYVx1MDBlN1x1MDBlM28gZGUgcmVub21lYVx1MDBlN1x1MDBlM28uDQotU2VsZWN0RWxlbWVudERpYWxvZ19zZWxlY3RlbGVtZW50X3RleHQ9U2VsZWNpb25hciBFbGVtZW50bw0KLQ0KLSMgRWRpdG9yQ2hvb3Nlcg0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ190aXRsZT1BYnJpciBFZGl0b3IgZGUgTVx1MDBlOXRvZG8NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Rlc2NyaXB0aW9uTGFiZWw9RGVzY3JpXHUwMGU3XHUwMGUzbzoNCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWw9U2VsZWNpb25hciBUdWRvDQotT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZV9lZGl0X3RleHQwPUVkaXRhciBFbGVtZW50bw0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19tZXNzYWdlPUlVUEEwMDIzRTogSW1wb3NzXHUwMGVkdmVsIGFicmlyIG8gZWRpdG9yIGFzc29jaWFkbyBhbyBlbGVtZW50byBkZSBNXHUwMGU5dG9kbyBzZWxlY2lvbmFkby4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZT1TZWxlY2lvbmFyIEFycXVpdm8gZGUgSW1hZ2VtDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeU5hbWU9Tm92YSBCaWJsaW90ZWNhDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX0Rlc2NyaXB0aW9uTGFiZWw9RGVzY3JpXHUwMGU3XHUwMGUzbzoNCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1TZWxlY2lvbmUgdW1hIG91IG1haXMgY29uZmlndXJhXHUwMGU3XHUwMGY1ZXMgZGUgbVx1MDBlOXRvZG8gZSBjbGlxdWUgZW0gQ29uY2x1aXIgcGFyYSBhYnJpLWxhcy4NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfRGVzZWxlY3RBbGxCdXR0b25MYWJlbD1EZXNtYXJjYXIgVHVkbw0KLUVsZW1lbnRzVmlld19taWdyYXRpb25fZGlyX2RsZ19kZXNjcmlwdGlvbl90ZXh0PUVzcGVjaWZpcXVlIG8gZGlyZXRcdTAwZjNyaW8gZG9zIG5vdm9zIHswfSByZWNcdTAwZTltLW1pZ3JhZG9zIHBhcmEgc3Vic3RpdHVpciBvIHswfSBzZWxlY2lvbmFkby4NCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPU9jb3JyZXUgdW0gZXJybyBkbyBzaXN0ZW1hLiBDbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4gXG5cDQotXG5cDQotRmVjaGUgYWxndW5zIGRvcyBlZGl0b3JlcyBhYmVydG9zIGUgdGVudGUgbm92YW1lbnRlLg0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU9QSBpbWFnZW0gXHUwMGU5IGludlx1MDBlMWxpZGENCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RlbXBsYXRlPUlVUEEwMDMxRTogQSBpbWFnZW0gc2VsZWNpb25hZGEgJyd7MH0nJyBcdTAwZTkgbWFpb3IgcXVlIG8gdGFtYW5obyBwZXJtaXRpZG8gKHsxfSBwb3IgezJ9KS4gU2VsZWNpb25lIG91dHJhIGltYWdlbS4NCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGU9QSBpbWFnZW0gXHUwMGU5IGludlx1MDBlMWxpZGENCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzJFOiBPIGFycXVpdm8gc2VsZWNpb25hZG8gJyd7MH0nJyBuXHUwMGUzbyBleGlzdGUuIFNlbGVjaW9uZSBvdXRyYSBpbWFnZW0uDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsPVNlbGVjaW9uYXIuLi4NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5RGVzY3JpcHRpb249RGVzY3JpXHUwMGU3XHUwMGUzbyBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1EZXNjcmlcdTAwZTdcdTAwZTNvIGRhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZG8gbVx1MDBlOXRvZG8NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPVRvZG9zIG9zIGVkaXRvcmVzIGRldmVtIHNlciBmZWNoYWRvcy4gU2VsZWNpb25lIGFxdWVsZXMgcXVlIHByZWNpc2FtIHNlciBzYWx2b3MgcHJpbWVpcm8sIHNlIGFwbGljXHUwMGUxdmVsLg0KLQ0KLSMgVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2UNCi1mb3Jtc19UZW1wbGF0ZURlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPU8gYXJxdWl2byBzZWxlY2lvbmFkbyBqXHUwMGUxIFx1MDBlOSB1bSBhbmV4byBkZXN0ZSBHYWJhcml0by4NCi0NCi0jIE5ldyBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLW5ld0xpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFOiBJbXBvc3NcdTAwZWR2ZWwgY3JpYXIgYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMT1PIGNhbWluaG8gZGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZXNwZWNpZmljYWRvICcnezB9JycgXHUwMGU5IGludlx1MDBlMWxpZG8uDQotbmV3TGlicmFyeUVycm9yX3JlYXNvbjI9Slx1MDBlMSBleGlzdGUgdW1hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGVtICcnezB9JycuDQotbmV3TGlicmFyeUVycm9yX3JlYXNvbjM9Tlx1MDBlM28gXHUwMGU5IHBvc3NcdTAwZWR2ZWwgY3JpYXIgYSBwYXN0YSBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBlc3BlY2lmaWNhZGEgJyd7MH0nJy4NCi1uZXdMaWJyYXJ5RXJyb3JfYWR2aWNlPVNlbGVjaW9uZSBPSyBwYXJhIGRpZ2l0YXIgb3V0cm8gbm9tZSBvdSBjYW1pbmhvIHBhcmEgYSBiaWJsaW90ZWNhLg0KLQ0KLSNQcm9jZXNzIGxpdGVyYWxzDQotUHJvY2Vzc19FeHRlcm5hbElEPUlEIGV4dGVybm86DQotUHJvY2Vzc19QdXJwb3NlPU9iamV0aXZvOg0KLVByb2Nlc3NfU2NvcGU9RXNjb3BvOg0KLVByb2Nlc3NfVXNhZ2VOb3Rlcz1Ob3RhcyBkZSBVc286DQotUHJvY2Vzc19BbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmFzOg0KLVByb2Nlc3NfSG93VG9TdGFmZj1Db21vIERlZmluaXIgYSBFcXVpcGU6DQotUHJvY2Vzc19LZXlDb25zaWRlcmF0aW9uPUNvbnNpZGVyYVx1MDBlN1x1MDBmNWVzLWNoYXZlOg0KLVByb2Nlc3NfU2NhbGU9RXNjYWxhOg0KLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1DYXJhY3Rlclx1MDBlZHN0aWNhcyBkbyBQcm9qZXRvOg0KLVByb2Nlc3NfUmlza0xldmVsPU5cdTAwZWR2ZWwgZGUgUmlzY286DQotUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlPVRcdTAwZTljbmljYXMgZGUgRXN0aW1hdGl2YToNCi1Qcm9jZXNzX1Byb2plY3RNZW1iZXJFeHBlcnRpc2U9RXhwZXJpXHUwMGVhbmNpYSBkb3MgTWVtYnJvcyBkbyBQcm9qZXRvOg0KLVByb2Nlc3NfVHlwZU9mQ29udHJhY3Q9VGlwbyBkZSBDb250cmF0bzoNCi0NCi0jIEVkaXRvciBQcmV2aWV3IE5hdmlnYXRpb24gQnV0dG9ucw0KLWJhY2tCdXR0b25fdGV4dD1Wb2x0YXINCi1mb3J3YXJkQnV0dG9uX3RleHQ9UmVkaXJlY2lvbmFyDQotZm9yd2FyZF90ZXh0PVJlZGlyZWNpb25hcg0KLXN0b3BCdXR0b25fdGV4dD1QYXJhcg0KLXJlZnJlc2hCdXR0b25fdGV4dD1BdHVhbGl6YXINCi1yZWZyZXNoX3RleHQ9QXR1YWxpemFyDQotbmV3bmFtZV90ZXh0PU5vdm8gbm9tZToNCi1wcmludEJ1dHRvbl90ZXh0PUltcHJpbWlyDQotDQotIyBDb250ZXh0IG1lbnVzDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPUF0dWFsaXphJnINCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT1Nb3N0cmFyICZQcm9wcmllZGFkZXMNCi0NCi1fVUlfTWV0aG9kRWRpdG9yX21lbnU9RWRpdG9yIGRlICZNXHUwMGU5dG9kbw0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jk5vdm8NCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZvdm8gSXJtXHUwMGUzbw0KLQ0KLV9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsPVNlbGVcdTAwZTdcdTAwZTNvDQotX1VJX1BhcmVudFBhZ2VfbGFiZWw9UGFpDQotX1VJX0xpc3RQYWdlX2xhYmVsPUxpc3RhDQotX1VJX1RyZWVQYWdlX2xhYmVsPVx1MDBjMXJ2b3JlDQotX1VJX1RhYmxlUGFnZV9sYWJlbD1UYWJlbGENCi1fVUlfVGFibGVUcmVlUGFnZV9sYWJlbD1cdTAwYzFydm9yZSBkZSBUYWJlbGENCi1fVUlfT2JqZWN0Q29sdW1uX2xhYmVsPU9iamV0bw0KLV9VSV9TZWxmQ29sdW1uX2xhYmVsPVx1MDBkYW5pY28NCi0NCi1fVUlfTm9PYmplY3RTZWxlY3RlZD1OYWRhIFNlbGVjaW9uYWRvDQotX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkPU9iamV0byBTZWxlY2lvbmFkbzogezB9DQotX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQ9T2JqZXRvcyB7MH0gU2VsZWNpb25hZG9zDQotDQotX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbD1BYnJpciBFZGl0b3INCi0NCi1fVUlfV2l6YXJkX2NhdGVnb3J5PUV4ZW1wbG8gZGUgQXNzaXN0ZW50ZXMgZGUgQ3JpYVx1MDBlN1x1MDBlM28gZG8gTW9kZWxvIEVNRg0KLQ0KLV9VSV9NZXRob2RNb2RlbFdpemFyZF9sYWJlbD1Nb2RlbG8gZGUgTVx1MDBlOXRvZG8NCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfZGVzY3JpcHRpb249Q3JpZSB1bSBub3ZvIG1vZGVsbyBkZSBNXHUwMGU5dG9kbw0KLQ0KLV9VSV9NZXRob2RFZGl0b3JfbGFiZWw9RWRpdG9yIGRlIE1vZGVsbyBkZSBNXHUwMGU5dG9kbw0KLQ0KLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlPU1pbmhhDQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9uPW1cdTAwZTl0b2RvDQotX1VJX1dpemFyZF9sYWJlbD1Ob3ZvDQotDQotX1dBUk5fRmlsZW5hbWVFeHRlbnNpb249TyBub21lIGRvIGFycXVpdm8gZGV2ZSB0ZXJtaW5hciBlbSAnJy57MH0nJw0KLQ0KLV9VSV9Nb2RlbE9iamVjdD1PYmpldG8gZGUgTW9kZWxvDQotX1VJX1hNTEVuY29kaW5nPUNvZGlmaWNhXHUwMGU3XHUwMGUzbyBYTUwNCi1fVUlfWE1MRW5jb2RpbmdDaG9pY2VzPVVURi04IEFTQ0lJIFVURi0xNiBVVEYtMTZCRSBVVEYtMTZMRSBJU08tODg1OS0xDQotX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbj1TZWxlY2lvbmUgdW0gb2JqZXRvIGRlIG1vZGVsbyBhIHNlciBjcmlhZG8NCi0NCi1fVUlfRmlsZUNvbmZsaWN0X2xhYmVsPUNvbmZsaXRvIGRlIEFycXVpdm8NCi1fV0FSTl9GaWxlQ29uZmxpY3Q9SFx1MDBlMSBhbHRlcmFcdTAwZTdcdTAwZjVlcyBuXHUwMGUzbyBzYWx2YXMgZW0gY29uZmxpdG8gY29tIGFzIGFsdGVyYVx1MDBlN1x1MDBmNWVzIGZlaXRhcyBmb3JhIGRvIGVkaXRvci4gRGVzZWphIGRlc2NhcnRhciBlc3RhcyBhbHRlcmFcdTAwZTdcdTAwZjVlcyBkbyBlZGl0b3I/DQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1hZGRMaW5rRGlhbG9nX2xpbmtUeXBlPVRpcG86DQotb3BlbkxpbmtDaGVja2JveF90ZXh0PUFicmEgbyBsaW5rIGVtIHVtYSBqYW5lbGEgc2VwYXJhZGEgZG8gbmF2ZWdhZG9yDQotDQotIyBBZGQgSW1hZ2UgRGlhbG9nDQotaGVpZ2h0TGFiZWxfdGV4dD1BbHR1cmE6DQotd2lkdGhMYWJlbF90ZXh0PUxhcmd1cmE6DQotRWxlbWVudHNWaWV3XzIwPXBhZHJcdTAwZTNvIGRlIHJlY3Vyc28NCi1FbGVtZW50c1ZpZXdfMjE9cHJvY2Vzc28gZGUgZW50cmVnYQ0KLUVsZW1lbnRzVmlld18yMj1wcm9jZXNzbw0KLUVsZW1lbnRzVmlld18zNT17MH0gXHUwMGU5IHNvbWVudGUgbGVpdHVyYS4gXA0KLVRvcm5lLW8gZ3Jhdlx1MDBlMXZlbCBhbnRlcyBkZSBjb250aW51YXIuDQotRWxlbWVudHNWaWV3XzM2PUVycm8gYW8gY2FycmVnYXIgYmlibGlvdGVjYQ0KLWFsdFRhZ0xhYmVsX3RleHQ9VGFnIEFMVDoNCi1pbWFnZVNpemVMYWJlbF90ZXh0PUEgYWx0dXJhIGUgYSBsYXJndXJhIGRhIGltYWdlbSBkZXZlbSBzZXIgcGVsbyBtZW5vcyAxMCBlIG5cdTAwZTNvIG1haXMgcXVlIDYwMC4gQSBhbHR1cmEgZSBsYXJndXJhIGludlx1MDBlMWxpZGFzIHNlclx1MDBlM28gY29udmVydGlkYXMgZW0gdW0gdGFtYW5obyBhZGVxdWFkby4NCi0NCi0jIFByb2Nlc3MgRWRpdG9yDQotUHJvY2Vzc0VkaXRvcj1Qcm9jZXNzRWRpdG9yDQotUHJvY2Vzc0VkaXRvcl9OYW1lPU5vbWUNCi1Qcm9jZXNzRWRpdG9yX1ByZXNlbnRhdGlvbk5hbWU9Tm9tZSBkZSBBcHJlc2VudGFcdTAwZTdcdTAwZTNvDQotUHJvY2Vzc0VkaXRvcl9JbmRleD1cdTAwY2RuZGljZQ0KLVByb2Nlc3NFZGl0b3JfUHJlZGVjZXNzb3JzPVByZWRlY2Vzc29yZXMNCi0jQ29uZmlndXJhdGlvblBhZ2VfU2VsZWN0ZWQ9U2VsZWN0ZWQ6IA0KLUNoZWNrbGlzdE9yZGVyX2Rlc2NyaXB0aW9uPVNlbGVjaW9uZSB1bSBpdGVtIGRlIHZlcmlmaWNhXHUwMGU3XHUwMGUzbyBlIGNsaXF1ZSBlbSBQYXJhIENpbWEgb3UgZW0gUGFyYSBCYWl4byBwYXJhIGFsdGVyYXIgc3VhIG9yZGVtLg0KLUVsZW1lbnRzVmlld19yZW5hbWluZ190ZXh0PVJlbm9tZWFuZG8uLi4NCi1Qcm9jZXNzRWRpdG9yX01vZGVsSW5mbz1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZG8gTW9kZWxvDQotUHJvY2Vzc0VkaXRvcl9QcmVmaXg9UHJlZml4bw0KLU1vdmVEaWFsb2dfbW92ZV90ZXh0PU1vdmVyDQotQ2hlY2tsaXN0T3JkZXJfdGl0bGU9Q2xhc3NpZmljYXIgSXRlbnMgZGUgVmVyaWZpY2FcdTAwZTdcdTAwZTNvDQotUHJvY2Vzc0VkaXRvcl9SZXBldGFibGU9UmVwZXRcdTAwZWR2ZWwNCi1Qcm9jZXNzRWRpdG9yX09uZ29pbmc9RW0gQW5kYW1lbnRvDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uPVNpbmNyb25pemFyLi4uDQotUHJvY2Vzc0VkaXRvcl9FdmVudERyaXZlbj1PcmllbnRhZG8gYSBFdmVudG8NCi1Qcm9jZXNzRWRpdG9yX0RlbGl2ZXJhYmxlPURpc3RyaWJ1XHUwMGVkdmVsDQotUHJvY2Vzc0VkaXRvcl9PcHRpb25hbD1PcGNpb25hbA0KLUZpbHRlckRpYWxvZ19UeXBlX3RleHQ9VGlwbyBkZSBFbGVtZW50byBkZSBNXHUwMGU5dG9kbzoNCi1GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsPUV4cGFuZGlyIFR1ZG8NCi1Nb3ZlRGlhbG9nX21vdmluZ190ZXh0PU1vdmVuZG8uLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25XYXJuaW5nPUlVUEEwMDI1VzogTyBcdTAwZWRjb25lIGRlIHNoYXBlIHBhcmEgezB9IG5cdTAwZTNvIGZvaSBsb2NhbGl6YWRvIG5vIGNhbWluaG86IHsxfQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yPUlVUEEwMDI1RTogRXJybzogU2VcdTAwZTdcdTAwZTNvIGRlIFx1MDBlZGNvbmUgZGUgc2hhcGU6IHswfQ0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfTmFtZUxhYmVsPU5vbWU6DQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1DcmlhciB1bWEgbm92YSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX05hbWVMYWJlbD1Ob21lOg0KLUF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU9Tm92YSBDb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIE1cdTAwZTl0b2RvDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VUaXRsZT1DcmlhciB1bWEgbm92YSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvDQotbmV3TGlicmFyeVdpemFyZF90aXRsZT1Ob3ZhIEJpYmxpb3RlY2EgZGUgTVx1MDBlOXRvZG8NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZVRpdGxlPVNhbHZhciBhbHRlcmFcdTAwZTdcdTAwZjVlcw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0xpYnJhcnlNYWluUGFnZV9wYWdlRGVzY3JpcHRpb249RXNwZWNpZmlxdWUgdW0gbm9tZSwgdW1hIGRlc2NyaVx1MDBlN1x1MDBlM28gZSB1bSBkaXJldFx1MDBmM3JpbyBkZSBkZXN0aW5vIHBhcmEgYSBub3ZhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG8uDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVEZXNjcmlwdGlvbj1VbSBvdSBtYWlzIGVsZW1lbnRvcyBkZSBtXHUwMGU5dG9kbyBmb3JhbSBtb2RpZmljYWRvcy4gU2VsZWNpb25lIGFxdWVsZXMgcXVlIHByZWNpc2FtIHNlciBzYWx2b3MuDQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU9QWJyaXIgQ29uZmlndXJhXHUwMGU3XHUwMGY1ZXMgZGUgTVx1MDBlOXRvZG8NCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbldpemFyZF93aW5kb3dUaXRsZT1BYnJpciBDb25maWd1cmFcdTAwZTdcdTAwZjVlcyBkZSBNXHUwMGU5dG9kbw0KLUVsZW1lbnRzVmlld19yZXBsYWNlaW5nd2l0aGZvcm1hdF90ZXh0PVN1YnN0aXR1aW5kbyB7MH0uLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmc9SVVQQTAwMjZXOiBPIFx1MDBlZGNvbmUgZGUgblx1MDBmMyBwYXJhIHswfSBuXHUwMGUzbyBmb2kgbG9jYWxpemFkbyBubyBjYW1pbmhvOiB7MX0NCi1NZXNzYWdlTGFiZWxQcm92aWRlcl91bnNlbGVjdGVkcGFja2FnZXM9Jyd7MH0nJyBjb250XHUwMGU5bSBlbGVtZW50b3MgcXVlIHJlZmVyZW5jaWFtIGVsZW1lbnRvcyBlbSBwYWNvdGVzIG5cdTAwZTNvIHNlbGVjaW9uYWRvcw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3I9SVVQQTAwMjZFOiBFcnJvOiBTZVx1MDBlN1x1MDBlM28gZGUgXHUwMGVkY29uZSBkZSBuXHUwMGYzOiB7MH0NCi1TdGVwc09yZGVyRGlhbG9nX3N0ZXBzPUV0YXBhczogDQotU3RlcHNPcmRlckRpYWxvZ190aXRsZT1DbGFzc2lmaWNhciBFdGFwYXMgZGUgVGFyZWZhDQotUHJvY2Vzc0VkaXRvcl9QbGFubmVkPVBsYW5lamFkbw0KLXNwZWNpZnlkaXJlY3RvcnlfdGV4dD1Fc3BlY2lmaXF1ZSB1bSBkaXJldFx1MDBmM3JpbyBwYXJhIHNhbHZhciBhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zDQotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPU1cdTAwZmFsdGlwbGFzIE9jb3JyXHUwMGVhbmNpYXMNCi1Qcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU9RXN0YWRvIGRlIEVudHJhZGENCi1Qcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZT1Fc3RhZG8gZGUgU2FcdTAwZWRkYQ0KLXNlbGVjdENvbHVtbnN0b0FkZF90ZXh0PVNlbGVjaW9uZSBhcyBjb2x1bmFzIGEgc2VyZW0gaW5jbHVcdTAwZWRkYXMNCi1Qcm9jZXNzRWRpdG9yX1R5cGU9VGlwbw0KLVByb2Nlc3NFZGl0b3JfVGVhbT1FcXVpcGUNCi1GaWx0ZXJEaWFsb2dfdGl0bGU9U2VsZWNpb25hciBEaVx1MDBlMWxvZ286IA0KLQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZD1JbmNsdWlyIGRvIENvbnRlXHUwMGZhZG8gZG8gJk1cdTAwZTl0b2RvLi4uDQotRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsPVJlZHV6aXIgVHVkbw0KLU9wZW5DaGVhdHNoZWV0Vmlld190aXRsZT1BYnJpciBWaXN1YWxpemFcdTAwZTdcdTAwZTNvIGRlIEZvbGhhIGRlIERpY2FzDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwPVJvbGFyIHBhcmEgQ2ltYQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxEb3duPVJvbGFyIHBhcmEgQmFpeG8NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA9TSZvdmVyIHBhcmEgQ2ltYQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVEb3duPU1vdmVyIHBhcmEgQmFpJnhvDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsPVJldmUmbGFyDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29weT0mQ29waWFyLi4uDQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dD1QYWRyXHUwMGY1ZXMgZGUgbm9tZSAob3Mgbm9tZXMgY29ycmVzcG9uZGVudGVzIHNlclx1MDBlM28gbW9zdHJhZG9zKToNCi0NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3RpdGxlPUJpYmxpb3RlY2EgZGUgTVx1MDBlOXRvZG9zOiANCi0jTWVzc2FnZVZpZXdfc2VsZWN0ZWRfdGV4dD1TZWxlY3RlZDogDQotTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ9RGVzY3JpXHUwMGU3XHUwMGUzbw0KLUVsZW1lbnRzVmlld19lcnJfc2F2aW5nPUlVUEEwMDI3RTogRXJybyBhbyBzYWx2YXIgJyd7MH0nJ3sxfQ0KLQ0KLWVycl9jb3B5aW5nX2ZpbGVfdGl0bGU9RXJybyBhbyBjb3BpYXIgYXJxdWl2bw0KLWVycl9jb3B5aW5nX2ZpbGVfZXJyb3I9SVVQQTAwMjhFOiBPIFx1MDBlZGNvbmUgblx1MDBlM28gcFx1MDBmNGRlIHNlciBkZXNpZ25hZG8uIA0KLWVycl9jb3B5aW5nX2ZpbGVfcmVhc29uPU9jb3JyZXUgdW0gZXJybyBhbyBjb3BpYXIgbyBhcnF1aXZvIHNlbGVjaW9uYWRvLiBDbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4NCi1lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlPUVycm8gYW8gcHJvY2Vzc2FyIGFycXVpdm8NCi1lZGl0Q29uZmlndXJhdGlvbl90b29sdGlwPUVkaXRhciBjb25maWd1cmFcdTAwZTdcdTAwZTNvDQotZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0PUlVUEEwMDE1RTogSW1wb3NzXHUwMGVkdmVsIGVkaXRhciBlbGVtZW50bw0KLVNhdmVUaGlzQWN0aW9uX3NhdmVvYmplY3Q9U2FsdmFyIGVzdGUgT2JqZXRvLi4uDQotRWxlbWVudHNWaWV3X3JlcGxhY2VfdGV4dD1TdWJzdGl0dWlyDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kPSZFc3RlbmRlci4uLg0KLU1vdmVEaWFsb2dfZGVzdGluYXRpb25fdGV4dD1Fc2NvbGhhIG8gZGVzdGlubyBwYXJhIG9zIGVsZW1lbnRvcyBzZWxlY2lvbmFkb3M6DQotY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0PUVzY29saGEgdW0gZGlyZXRcdTAwZjNyaW8gcGFkclx1MDBlM28gcGFyYSBiaWJsaW90ZWNhczoNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzcz0mU3VwcmltaXINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczI9T3BcdTAwZTdcdTAwZjVlcyBkZSAmUHVibGljYVx1MDBlN1x1MDBlM28uLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbT1EaWFncmFtYXMgRGVmaW5pZG9zIHBlbG8gJlVzdVx1MDBlMXJpby4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ190aXRsZT1EZXNpZ25hciBEaWFncmFtYXMgRGVmaW5pZG9zIHBlbG8gVXN1XHUwMGUxcmlvDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U9RGlhZ3JhbWEgZGUgQXRpdmlkYWRlOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZGRJbWFnZT1EaWFncmFtYSBkZSBEZXRhbGhlIGRlIEF0aXZpZGFkZToNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfd3BkSW1hZ2U9RGlhZ3JhbWEgZGUgRGVwZW5kXHUwMGVhbmNpYSBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19ub3RhRmlsZT1JVVBBMDAwNEU6IE8gY2FtaW5obyBlc3BlY2lmaWNhZG8gblx1MDBlM28gXHUwMGU5IHVtIGFycXVpdm8uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2Fzc2lnbkJ1dHRvbj1TZWxlY2lvbmFyLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDI0RTogQSBpbWFnZW0gZXNwZWNpZmljYWRhIG5cdTAwZTNvIGV4aXN0ZSBuYSBiaWJsaW90ZWNhLiBDZXJ0aWZpcXVlLXNlIGRlIHRlciBkaWdpdGFkbyBvIGNhbWluaG8gcmVsYXRpdm8gYW8gZGlyZXRcdTAwZjNyaW8gcmFpeiBkYSBiaWJsaW90ZWNhLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ9SVVQQTAwMzBFOiBBIGltYWdlbSBzZWxlY2lvbmFkYSBuXHUwMGUzbyBlc3RcdTAwZTEgbmEgYmlibGlvdGVjYS4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZT1VdGlsaXplIGEgaW1hZ2VtIGRvIGRpYWdyYW1hIGRlIEF0aXZpZGFkZSBwYXJhIG5hdmVnYVx1MDBlN1x1MDBlM28gZSBwdWJsaWNhXHUwMGU3XHUwMGUzbw0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBRERJbWFnZT1VdGlsaXplIGEgaW1hZ2VtIGRvIGRpYWdyYW1hIGRlIGRldGFsaGUgZGUgQXRpdmlkYWRlIHBhcmEgbmF2ZWdhXHUwMGU3XHUwMGUzbyBlIHB1YmxpY2FcdTAwZTdcdTAwZTNvDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlPVV0aWxpemUgYSBpbWFnZW0gZG8gZGlhZ3JhbWEgZGUgZGVwZW5kXHUwMGVhbmNpYSBkbyBwcm9kdXRvIHBhcmEgbmF2ZWdhXHUwMGU3XHUwMGUzbyBlIHB1YmxpY2FcdTAwZTdcdTAwZTNvDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29udHJpYnV0ZT1Db250cmlidWlcdTAwZTdcdTAwZTNvIExvY2FsDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZT1TdWJzdGl0dWlcdTAwZTdcdTAwZTNvIExvY2FsDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRGlhZ3JhbXM9RGlhJmdyYW1hcw0KLVByb2Nlc3NFZGl0b3JfYWN0aW9uX2RlZXBDb3B5PUNcdTAwZjNwaWEgUHJvZnVuJmRhLi4uDQotRmlsdGVyRGlhbG9nX0JyaWVmRGVzY3JpcHRpb249RGVzY3JpXHUwMGU3XHUwMGUzbyBSZXN1bWlkYToNCi1Db25maWd1cmF0aW9uUGFnZV9oaWRlVG9vbFRpcD1Nb3N0cmFyL09jdWx0YXIgRWxlbWVudG9zIE5cdTAwZTNvIFZlcmlmaWNhZG9zDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb249RGVzY3JpXHUwMGU3XHUwMGUzbzoNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbD1OXHUwMGUzbyBQdWJsaWNhciBOZW5odW0NCi1GaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbj1PcyBwYWRyXHUwMGY1ZXMgc1x1MDBlM28gc2VwYXJhZG9zIHBvciB2XHUwMGVkcmd1bGFzLCBlbSBxdWUgKj1xdWFscXVlciBjYWRlaWEsID89cXVhbHF1ZXIgY2FyYWN0ZXJlDQotQ29uZmlndXJhdGlvblBhZ2VfVHJlZVRpdGxlTGFiZWw9Q29udGVcdTAwZmFkbzoNCi1Db25maWd1cmF0aW9uUGFnZV9Mb2FkaW5nTWVzc2FnZT1DYXJyZWdhbmRvIGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbywgYWd1YXJkZSAuLi4NCi1Nb3ZlRGlhbG9nX3ZhbGlkZGVzdGluYXRpb25fdGV4dD1PIGRlc3Rpbm8gcGFyYSBtdWRhblx1MDBlN2EgZXNwZWNpZmljYWRvIFx1MDBlOSBpbnZcdTAwZTFsaWRvLg0KLU1vdmVEaWFsb2dfY2Fubm90TW9kaWZ5RGVzdGluYXRpb249SVVQQTAwMzRFOiBOXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCBtb2RpZmljYXIgbyBkZXN0aW5vIHNlbGVjaW9uYWRvLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbEFsbD1QdWJsaWNhciBUdWRvDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkJhc2VBY3Rpdml0eT1BYnJpciBBdGl2aWRhZGUgZGUgQmFzZQ0KLVByb2Nlc3NGb3JtRWRpdG9yX2V4cGFuQWxsQWN0aW9uTGFiZWw9RSZ4cGFuZGlyIFRvZG9zDQotUHJvY2Vzc0Zvcm1FZGl0b3JfY29sbGFwc2VBbGxBY3Rpb25MYWJlbD1SZWR1JnppciBUb2Rvcw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURpYWdyYW09QWJyaXIgRGlhZ3JhbWEgZGUgJkF0aXZpZGFkZQ0KLVByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVSZXZlYWw9T3MgZGVzY3JpdG9yZXMgblx1MDBlM28gc3VwcmltaWRvcyBsaXN0YWRvcyBub3MgRGV0YWxoZXMgZGV2ZW0gc2VyIGV4Y2x1XHUwMGVkZG9zIHBhcmEgZXZpdGFyIGR1cGxpY2FcdTAwZTdcdTAwZTNvIGFwXHUwMGYzcyByZXZlbGFyIG9zIGVsZW1lbnRvcyBzZWxlY2lvbmFkb3MuIENsaXF1ZSBlbSBPSyBzZSBkZXNlamFyIGV4Y2x1XHUwMGVkLWxvcyBlIGNvbnRpbnVlLg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9TZWxlY3RDb2x1bW5zPVNlbGVjaW9uZSBhcyBjb2x1bmFzIGEgc2VyZW0gaW5jbHVcdTAwZWRkYXMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtPUFicmlyIERpYWdyYW1hIGRlICZEZXRhbGhlcyBkZSBBdGl2aWRhZGUNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfQ29sdW1uU2VsZWN0aW9uPVNlbGVcdTAwZTdcdTAwZTNvIGRlIGNvbHVuYToNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3dpdGNoQ29uZmlndXJhdGlvbj1WXHUwMGUxIHBhcmEgYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHBhZHJcdTAwZTNvIGRvIFByb2Nlc3NvIGFvIGF0aXZhciB1bSBlZGl0b3IgZGUgUHJvY2Vzc28NCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3VwcHJlc3Npb25Hcm91cFRpdGxlPVN1cHJlc3NcdTAwZTNvDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX2luaGVyaXRTdXBwcmVzc2lvblN0YXRlPUhlcmRhciBlc3RhZG9zIGRlIHN1cHJlc3NcdTAwZTNvDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW09QWJyaXIgRGlhZ3JhbWEgZGUgRGVwZW5kXHUwMGVhbmNpYSBkZSBQcm9kdXRvIGRlICZUcmFiYWxobw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsPUxpbXBhcg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsPVNlbGVjaW9uYXIuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9JbnNlcnROZXdQaGFzZT1JbnNlcmlyIE5vdmEgRmFzZQ0KLVZpZXdIZWxwZXJfcmVsb2FkTGliT25Sb2xsYmFja0Vycm9yPU5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIHJlY3VwZXJhci1zZSBkZSB1bSBlcnJvIGRlIHBlcnNpc3RcdTAwZWFuY2lhLiBBIGJpYmxpb3RlY2EgcHJlY2lzYSBzZXIgcmVjYXJyZWdhZGEgcGFyYSByZXN0YXVyYXIgc2V1IGVzdGFkbyBvcmlnaW5hbC4NCi1WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkX3RleHQ9TyBlbGVtZW50byAnJ3swfScnIGpcdTAwZTEgZm9pIGV4Y2x1XHUwMGVkZG8uDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZGNvbmZpcm1fdGV4dD1PIGVsZW1lbnRvICcnezB9Jycgalx1MDBlMSBmb2kgZXhjbHVcdTAwZWRkby4gRGVzZWphIHJlbW92XHUwMGVhLWxvIGRlICcnezF9Jyc/DQotQ29uZmlndXJhdGlvblBhZ2VfQWRkTWlzc2luZ1Rvb2xUaXA9SW5jbHVpciBSZWZlclx1MDBlYW5jaWFzIEF1c2VudGVzDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb249RGVzY3JpXHUwMGU3XHUwMGUzbw0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkdlbmVyYWxJbmZvPUluZm9ybWFcdTAwZTdcdTAwZjVlcyBHZXJhaXMgDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPUFwbGljYXIgUGEmZHJcdTAwZTNvDQotTW92ZURpYWxvZ19zZWxlY3RkZXN0aW5hdGlvbl90ZXh0PVNlbGVjaW9uZSB1bSBkZXN0aW5vLg0KLU1vdmVEaWFsb2dfbm9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnPU5lbmh1bSBkZXN0aW5vIGRlIG1vdmltZW50YVx1MDBlN1x1MDBlM28gZm9pIGVzcGVjaWZpY2Fkby4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3Ryb3VibGVvYmplY3Q9LiBPYmpldG8gY29tIHByb2JsZW1hOiANCi1NZXNzYWdlTGFiZWxQcm92aWRlcl9lcnJjaGlsZHBrZ3M9VW0gcGFjb3RlIGRlIGNvbnRlXHUwMGZhZG8gb3UgcHJvY2Vzc28gY29udFx1MDBlOW0gZWxlbWVudG9zIGNvbSByZWZlclx1MDBlYW5jaWFzIGF1c2VudGVzDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZT1PcFx1MDBlN1x1MDBmNWVzIGRlIFB1YmxpY2FcdTAwZTdcdTAwZTNvIGRlIERpYWdyYW1hDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlPVNlbGVjaW9uZSBvcyBkaWFncmFtYXMgYSBzZXJlbSBwdWJsaWNhZG9zIG91IGNhbmNlbGUgYSBzZWxlXHUwMGU3XHUwMGUzbyBwYXJhIG5cdTAwZTNvIHB1YmxpY2FyDQotUHJvY2Vzc0VkaXRvcl9UaXRsZT1FZGl0b3IgZGUgUHJvY2Vzc286IA0KLVNhdmVBc3dpdGhkb3RzX3RleHQ9U2FsdmFyIENvbW8uLi4NCi1Qcm9jZXNzRWRpdG9yX1dvcmtCcmVha2Rvd25TdHJ1Y3R1cmU9RXN0cnV0dXJhIGRlIERlY29tcG9zaVx1MDBlN1x1MDBlM28gZGUgVHJhYmFsaG8NCi1Qcm9jZXNzRWRpdG9yX1RlYW1BbGxvY2F0aW9uPUFsb2NhXHUwMGU3XHUwMGUzbyBkZSBFcXVpcGUNCi1Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U9VXNvIGRlIFByb2R1dG8gZGUgVHJhYmFsaG8NCi1Qcm9jZXNzRWRpdG9yX0NvbnNvbGlkYXRlZFZpZXc9VmlzdWFsaXphXHUwMGU3XHUwMGUzbyBDb25zb2xpZGFkYQ0KLVByb2Nlc3NFZGl0b3JfY29uZmlybUF1dG9TeW5jaD1Fc3RhIG9wZXJhXHUwMGU3XHUwMGUzbyBhdHVhbGl6YSBvcyBkZXNjcml0b3JlcyBzZWxlY2lvbmFkb3Mgb3UgdG9kb3Mgb3MgZGVzY3JpdG9yZXMgYWJhaXhvIGRhcyBhdGl2aWRhZGVzIHNlbGVjaW9uYWRhcyBxdWUgZm9yYW0gbWFyY2Fkb3MgY29tbyAiU2luY3Jvbml6YWRvcyBjb20gYSBvcmlnZW0iIG5hIGd1aWEgR2VyYWwgZGEgdmlzdWFsaXphXHUwMGU3XHUwMGUzbyBQcm9wcmllZGFkZXMuIEVsYSBhdHVhbGl6YSBlc3NlcyBkZXNjcml0b3JlcyBjb20gYXMgcHJvcHJpZWRhZGVzIG9yaWdpbmFpcyBkb3MgZWxlbWVudG9zIGRlIGNvbnRlXHUwMGZhZG8gZGUgbVx1MDBlOXRvZG8gdmluY3VsYWRvcyBuYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHBhZHJcdTAwZTNvIGRvIHByb2Nlc3NvLiBPYnNlcnZlIHF1ZSBlbGUgblx1MDBlM28gYXR1YWxpemFyXHUwMGUxIG5lbmh1bSBkZXNjcml0b3IgdmluY3VsYWRvIGRpbmFtaWNhbWVudGUgKGVtIHZlcmRlIGUgaXRcdTAwZTFsaWNvKS4gRGVzZWphIGNvbnRpbnVhcj8NCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE9Q29uZmlndXJhXHUwMGU3XHUwMGUzbw0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMj1TZWxlXHUwMGU3XHUwMGUzbyBkZSBQbHVnLWluIGUgUGFjb3RlDQotTmV3TGlicmFyeURpYWxvZ19uZXdsaWJyYXJ5X2FzPUNyaWFyIE5vdmEgQmlibGlvdGVjYSBDb21vDQotTmV3UGx1Z2luRGlhbG9nX25ld3BsdWdpbl90ZXh0PU5vdm8gUGx1Zy1pbiBkZSBNXHUwMGU5dG9kbw0KLVNlbGVjdEVsZW1lbnREaWFsb2dfdGl0bGVfdGV4dD1TZWxlY2lvbmUgbyBlbGVtZW50byBvdSB1bSBkZSBzZXVzIGNvbnRyaWJ1aW50ZXM6DQotT3BlbkNvbmZpZ0RpYWxvZ25ld2NvbmZpZ190ZXh0PU5vdmEgQ29uZmlndXJhXHUwMGU3XHUwMGUzbzoNCi1wcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VfQlNFZGl0b3I9RWRpdG9yIGRlIFByb2Nlc3NvDQotDQotIyBBYnN0cmFjdERpYWdyYW1FZGl0b3INCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9QWxpbmhhcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PUF0dWFsaXphciBhIHBhcnRpciBkYSBBdGl2aWRhZGUgZGUgQmFzZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dD1Gb3JtYXRhciBDYWl4YSBkZSBUZXh0by4uLg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9SG9yaXpvbnRhbG1lbnRlIHBhcmEgYSBNXHUwMGU5ZGlhDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1Ib3Jpem9udGFsbWVudGUgcGFyYSBvIFByaW1laXJvIFNlbGVjaW9uYWRvDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WZXJ0aWNhbG1lbnRlIHBhcmEgYSBNXHUwMGU5ZGlhDQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl90aXRsZT1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgR2VyYWlzDQotTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9SVVQQTAwNDFFOiBPKHMpIGVsZW1lbnRvKHMpIHNlbGVjaW9uYWRvKHMpIG5cdTAwZTNvIHBvZGUobSkgc2VyIG1vdmlkbyhzICkgcGFyYSBvIGRlc3Rpbm8gZXNwZWNpZmljYWRvLg0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeT1TYWx2YW5kbyBiaWJsaW90ZWNhIGRlIG1vZGVsbyAuLi4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX2Vycm9yX2RpYWxvZ190aXRsZT1FcnJvDQotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c9SVVQQTAwMzNFOiBQcm9ibGVtYSBlbmNvbnRyYWRvIGFvIHNhbHZhciBiaWJsaW90ZWNhLg0KLU1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0PVRlbSBjZXJ0ZXphIGRlIHF1ZSBkZXNlamEgZXhjbHVpciAnJ3swfScnPw0KLUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX0NvbnRlbnRFbGVtZW50X3RleHQ9RWxlbWVudG9zIGRlIGNvbnRlXHUwMGZhZG86IA0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfQnJvd3NlQnV0dG9uTGFiZWw9UHJvY3VyYXIuLi4NCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uPUVzcGVjaWZpcXVlIHVtIG5vbWUgZSB1bWEgZGVzY3JpXHUwMGU3XHUwMGUzbyBwYXJhIGEgbm92YSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvLg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU9U2FsdmFyIGFzIGFsdGVyYVx1MDBlN1x1MDBmNWVzIGUgZmVjaGFyIHRvZG9zIG9zIGVkaXRvcmVzDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWNhbG1lbnRlIHBhcmEgbyBQcmltZWlybyBTZWxlY2lvbmFkbw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9U2FsdmFyDQotQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dD1BbmV4YXIgQXJxdWl2bw0KLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ9Q29udGVcdTAwZmFkbyBkYSBDb25maWd1cmFcdTAwZTdcdTAwZTNvDQotT3BlbkNvbmZpZ0RpYWxvZ29wZW5jb25maWdfdGV4dD1BYnJpciBDb25maWd1cmFcdTAwZTdcdTAwZTNvDQotRWxlbWVudHNWaWV3X3JlcGxhY2VBY3Rpb25fdGV4dD1TdWJzdGl0dWlyLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZT1TYWx2YW5kbyB7MH0NCi1Db25maWd1cmF0aW9uUGFnZV9TaG93RXJyb3JUb29sVGlwPU1vc3RyYXIgdmlzdWFsaXphZG9yIGRlIHJlZ2lzdHJvIGRlIGF2aXNvcyBkZSBjb25maWd1cmFcdTAwZTdcdTAwZTNvDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeD1Db25maWd1cmFcdTAwZTdcdTAwZTNvOg0KLQ0KLUNoZWNrbGlzdE9yZGVyX2NoZWNrbGlzdGl0ZW1zX3RleHQ9SXRlbnMgZGUgVmVyaWZpY2FcdTAwZTdcdTAwZTNvOiANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9TW92ZXIgTlx1MDBmMw0KLUNvbmZpZ3VyYXRpb25QYWdlX01ha2VDbG9zdXJlVG9vbFRpcD1GYXplciBGZWNoYW1lbnRvIGNvcnJpZ2luZG8gZXJyb3MNCi1OZXdQbHVnaW5EaWFsb2dfcmVmZXJlbmNlcGx1Z2luX3RleHQ9UGx1Zy1pbnMgZGUgUmVmZXJcdTAwZWFuY2lhOg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9jcmVhdGVGcmVlVGV4dF90ZXh0PUNyaWFyIHVtIFRleHRvIExpdnJlDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfTGFiZWw9VmlzdWFsaXphXHUwMGU3XHUwMGUzbyBkZSBcdTAwY2Rjb25lIGRlIE5cdTAwZjM6DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ9SVVQQTAwMzJXOiBJbXBvc3NcdTAwZWR2ZWwgY29uZWN0YXINCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfc2FtZXByZWRhbmRzdWNfdGV4dD1JVVBBMDAzM1c6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIHRlciBvIG1lc21vIGVsZW1lbnRvIGRlIGRpdmlzXHUwMGUzbyBjb21vIHByZWRlY2Vzc29yIGUgc3VjZXNzb3INCi0NCi0jIEVkaXRvckNob29zZXINCi1FZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZT1BYnJpciBFZGl0b3INCi1FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yPUVzdGUgZWxlbWVudG8gdGVtIGVycm9zLiBSZWNvbWVuZGEtc2UgY29ycmlnaXIgZXN0ZXMgZXJyb3MgYW50ZXMgZGUgY29udGludWFyIChjb25zdWx0ZSBvcyBkZXRhbGhlcykuXG5cDQotXG5cDQotQ2xpcXVlIGVtIE9LIHBhcmEgY29udGludWFyIHNlbSBhYnJpciBvIGVkaXRvci4gRmVjaGUgZXN0ZSBkaVx1MDBlMWxvZ28gcGFyYSBhYnJpciBvIGVkaXRvci4NCi1Db25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4PUNvbmZpZ3VyYVx1MDBlN1x1MDBlM286DQotDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZT1Ob21lOg0KLUF0dGFjaG1lbnREaWFsb2dGaWxlVVJMX3RleHQ9VVJMIGRvIEFycXVpdm86DQotU3RlcHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbj1TZWxlY2lvbmUgdW1hIGV0YXBhIGUgY2xpcXVlIGVtIFBhcmEgQ2ltYSBvdSBlbSBQYXJhIEJhaXhvIHBhcmEgYWx0ZXJhciBzdWEgb3JkZW0uDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZT1FcnJvIGR1cmFudGUgc2FsdmFtZW50bw0KLU1lc3NhZ2VWaWV3X2VycmVsZW1lbnRfdGV4dD1FbGVtZW50byBxdWUgUmVmZXJlbmNpYQ0KLU1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dD1FbGVtZW50byBSZWZlcmVuY2lhZG8NCi0NCi0jQWN0aXZpdHkgRGlhZ3JhbQ0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9jcmVhdGVTdGFydE5vZGVfdGV4dD1DcmlhciB1bSBOXHUwMGYzIGRlIEluXHUwMGVkY2lvDQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudERlc2NyaXB0aW9uPVNlbGVjaW9uZSBvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbywgb3MgcGFjb3RlcyBkZSBjb250ZVx1MDBmYWRvIGUgb3MgcHJvY2Vzc28gcXVlIHNlclx1MDBlM28gaW5jbHVcdTAwZWRkb3MgbmVzdGEgY29uZmlndXJhXHUwMGU3XHUwMGUzby4NCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbl90ZXh0PURpXHUwMGUxbG9nbyBkZSBvcmRlbSBkb3MgZWxlbWVudG9zIGRlIGNvbnRlXHUwMGZhZG8gZGUgQ2F0ZWdvcmlhIEN1c3RvbWl6YWRhDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EaXJlY3RvcnlMYWJlbD1EaXJldFx1MDBmM3JpbzoNCi1Sb290UHJlZlBhZ2VfZW5hYmxlcHJvY2Vzc2NvbnRyaWJ1dGlvbl90ZXh0PUF0aXZhciBDb250cmlidWlcdTAwZTdcdTAwZTNvIGRlIFByb2Nlc3NvDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgbVx1MDBlOXRvZG8uDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlcdTAwZTdcdTAwZTNvOg0KLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9RXNjb2xoZW5kbyBDb250cmlidWludGVzIHBhcmEgJyd7MH0nJw0KLUVsZW1lbnRzVmlld19vcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb25fdGV4dD1BYnJpciB2aWEgZWxlbWVudG9zIGRlIHZhcmlhYmlsaWRhZGUNCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9ZXNjb2xoZW5kbyBlbGVtZW50b3MgZGUgdmFyaWFiaWxpZGFkZSBkZSAnJ3swfScnDQotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsPUVsZW1lbnRvcyBkZSB2YXJpYWJpbGlkYWRlIGRlICcnezB9JycNCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfTGFiZWw9VmlzdWFsaXphXHUwMGU3XHUwMGUzbyBkZSBcdTAwY2Rjb25lIGRlIFNoYXBlOg0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ9SW1wb3NzXHUwMGVkdmVsIGV4Y2x1aXINCi1BY3Rpdml0eURpYWdyYW1FZGl0b3Jfb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PUFicmlyIERpYWdyYW1hIGRlIERldGFsaGVzIGRlIEF0aXZpZGFkZXMgDQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl9kZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9TGltcGFyDQotV1BDb21wYXJ0bWVudEZpZ3VyZV8wPU5vdm8gRGVzY3JpdG9yIGRlIFByb2R1dG8gZGUgVHJhYmFsaG8NCi1wcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0PVB1YmxpY2FyIG91IHByb2N1cmFyIGRpYWdyYW1hcyBkZSBkZXRhbGhlcyBkZSBhdGl2aWRhZGUgcXVlIG5cdTAwZTNvIHRlbmhhbSBzaWRvIGNyaWFkb3Mgbm8gZWRpdG9yIGRlIHByb2Nlc3NvDQotcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVB1YmxpY2FyIG91IHByb2N1cmFyIGRpYWdyYW1hcyBkZSBhdGl2aWRhZGVzIHBhcmEgZXh0ZW5zXHUwMGY1ZXMgZGUgYXRpdmlkYWRlIG5cdTAwZTNvIG1vZGlmaWNhZGFzLg0KLQ0KLSNDb25maWdQcm9jZXNzVmlld0RpYWxvZw0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX05hbWVQYXR0ZXJuPVBhZHJcdTAwZjVlcyBkZSBub21lIChvcyBub21lcyBjb3JyZXNwb25kZW50ZXMgc2VyXHUwMGUzbyBtb3N0cmFkb3MpOg0KLXNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uX2xhYmVsPU1vc3RyYXIgbm8gTmF2ZWdhZG9yIGRlIFJlY3Vyc28NCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19QYXR0ZXJuPU9zIHBhZHJcdTAwZjVlcyBzXHUwMGUzbyBzZXBhcmFkb3MgcG9yIHZcdTAwZWRyZ3VsYXMsIGVtIHF1ZSAqPXF1YWxxdWVyIGNhZGVpYSwgPz1xdWFscXVlciBjYXJhY3RlcmUNCi1lcnJfcHJvY2Vzc2luZ19maWxlX2Rlc2NyaXB0aW9uPUlVUEEwMDI5RTogT2NvcnJldSB1bSBlcnJvIGFvIHByb2Nlc3NhciBvIGFycXVpdm8gc2VsZWNpb25hZG8uIENsaXF1ZSBlbSBEZXRhbGhlcyBwYXJhIG9idGVyIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzLg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX0NhdGVnb3J5VHlwZT1UaXBvIGRlIENhdGVnb3JpYToNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19CcmllZkRlc2NyaXB0aW9uPURlc2NyaVx1MDBlN1x1MDBlM28gUmVzdW1pZGE6DQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfU2VsZWN0Q2F0ZWdvcmllcz1TZWxlY2lvbmFyIENhdGVnb3JpYXMNCi0NCi0jbG9nIG1lc3NhZ2VzDQotY2hlYXRzaGVldF9sb2FkX2ZhaWx1cmVfbG9nX21zZz1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBhYnJpciBhIGZvbGhhIGRlIGRpY2FzIHNvbGljaXRhZGE6IA0KLQ0KLW5ld0NvbmZpZ3VyYXRpb25XaXJhemRfY3JlYXRlRXJyb3I9SVVQQTAwMzVFOiBOXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBjcmlhciBhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gY29tIFx1MDBlYXhpdG8NCi1uZXdQbHVnaW5XaXphcmRfY3JlYXRlRXJyb3I9SVVQQTAwMzZFOiBOXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBjcmlhciBvIHBsdWctaW4gY29tIFx1MDBlYXhpdG8NCi1lcnJvckRpYWxvZ19tb3ZlRXJyb3I9SVVQQTAwMzdFOiBOXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBtb3ZlciBvIGVsZW1lbnRvIGNvbSBcdTAwZWF4aXRvDQotcmVuYW1lRGlhbG9nX3JlbmFtZUVycm9yPUlVUEEwMDM4RTogTlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgcmVub21lYXIgbyBlbGVtZW50byBjb20gXHUwMGVheGl0bw0KLWVycm9yRGlhbG9nX2NyZWF0ZUVycm9yPUlVUEEwMDM5RTogTlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgY3JpYXIgbyBlbGVtZW50byBjb20gXHUwMGVheGl0bw0KLWR1cGxpY2F0ZVBsdWdpbk5hbWVFcnJvcl9tc2c9SVVQQTAxMDFFOiBPIG5vbWUgJyd7MH0nJyBqXHUwMGUxIGV4aXN0ZS4gRGlnaXRlIHVtIG5vbWUgZGlmZXJlbnRlIGUgdGVudGUgbm92YW1lbnRlLg0KLQ0KLSNOZXcgU3RyaW5ncyBmb3IgUHJvY2Vzc0VkaXRvciBDb250ZXh0IG1lbnUgZGlhZ3JhbSBpbWFnZXMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBREltYWdlPURlc2lnbmFyIEltYWdlbSBBRC4uLg0KLVByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yVGl0bGU9RXJybyBkZSBBdHVhbGl6YVx1MDBlN1x1MDBlM28NCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZz1FcnJvIGFvIGF0dWFsaXphciBlZGl0b3INCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBRERJbWFnZT1EZXNpZ25hciBJbWFnZW0gQURELi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkV1BESW1hZ2U9RGVzaWduYXIgSW1hZ2VtIFdQRC4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFESW1hZ2VJblB1Ymxpc2hpbmc9VXRpbGl6YXIgSW1hZ2VtIEFEIG5hIFB1YmxpY2FcdTAwZTdcdTAwZTNvDQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzPU9zIGRlc2NyaXRvcmVzIHN1cHJpbWlkb3MgbGlzdGFkb3Mgbm9zIERldGFsaGVzIGRldmVtIHNlciBleGNsdVx1MDBlZGRvcyBwYXJhIGV2aXRhciBkdXBsaWNhXHUwMGU3XHUwMGUzbyBhcFx1MDBmM3MgYSBzdXByZXNzXHUwMGUzbyBkb3MgZWxlbWVudG9zIHNlbGVjaW9uYWRvcy4gQ2xpcXVlIGVtIE9LIHNlIGRlc2VqYXIgZXhjbHVcdTAwZWQtbG9zIGUgY29udGludWUuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURESW1hZ2VJblB1Ymxpc2hpbmc9VXRpbGl6YXIgSW1hZ2VtIEFERCBuYSBQdWJsaWNhXHUwMGU3XHUwMGUzbw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZVdQREltYWdlSW5QdWJsaXNoaW5nPVV0aWxpemFyIEltYWdlbSBXUEQgbmEgUHVibGljYVx1MDBlN1x1MDBlM28NCi1Qcm9jZXNzRWRpdG9yX0RpYWdyYW1JbWFnZV9JbnB1dERpYWxvZ19pbml0aWFsVmFsdWU9Q2FtaW5obyBkYSBJbWFnZW0NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXc9TSZvc3RyYXIgRWxlbWVudG8gVmluY3VsYWRvIGVtIFZpc3VhbGl6YVx1MDBlN1x1MDBlM28gZGUgQmlibGlvdGVjYQ0KLVByb2Nlc3NFZGl0b3JfdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbl9sYWJlbD1BdHVhbGl6YXIgU3VwcmVzc1x1MDBlM28gZGEgJkJhc2UNCi1Qcm9jZXNzRWRpdG9yX0NvbnRleHRNZW51X0RpYWdyYW1JbWFnZXM9SW1hZ2VucyBkZSBEaWFncmFtYQ0KLQ0KLSNTdHJpbmdzIGZvciBzeW5jaHJvbml6YXRpb24gd2l6YXJkIG9uIHByb2Nlc3MgZWRpdG9yJ3MgQlMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlPURlc2NyaVx1MDBlN1x1MDBlM28gZGEgU2luY3Jvbml6YVx1MDBlN1x1MDBlM28NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RleHQ9TGVpYSBhcyBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWJhaXhvIHF1ZSBleHBsaWNhbSBlbSBxdWUgcmVzdWx0YSB1bWEgc2luY3Jvbml6YVx1MDBlN1x1MDBlM28gcGVyc29uYWxpemFkYS4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TZWxlY2lvbmFyIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVNlbGVjaW9uZSBhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gcXVlIGRlc2VqYSB1dGlsaXphciBuYSBzaW5jcm9uaXphXHUwMGU3XHUwMGUzby5cDQotQSBzZWxlXHUwMGU3XHUwMGUzbyBkZXRlcm1pbmEgcXVhaXMgY29udHJpYnVpXHUwMGU3XHUwMGY1ZXMgZSBzdWJzdGl0dWlcdTAwZTdcdTAwZjVlcyBzZXJcdTAwZTNvIHV0aWxpemFkYXMgbmEgc2luY3Jvbml6YVx1MDBlN1x1MDBlM28uDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWw9Q29uZmlndXJhXHUwMGU3XHUwMGUzbzoNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGl0bGU9U2VsZWNpb25lIGFzIHByb3ByaWVkYWRlcyBxdWUgZGV2ZW0gc2VyIHNpbmNyb25pemFkYXMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJvcGVydGllc19sYWJsZT1Qcm9wcmllZGFkZXMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbmFtZV9sYWJsZT1Ob21lDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByZXNlbnRhdGlvbk5hbWVfbGFibGU9Tm9tZSBkZSBBcHJlc2VudGFcdTAwZTdcdTAwZTNvDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2JyaWVmRGVzY19sYWJsZT1CcmV2ZSBEZXNjcmlcdTAwZTdcdTAwZTNvDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsPUVudHJhZGFzIE9wY2lvbmFpcw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9tYW5kYXRvcnlJbnB1dHNfbGFibGU9RW50cmFkYXMgT2JyaWdhdFx1MDBmM3JpYXMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3V0cHV0c19sYWJlbD1TYVx1MDBlZGRhcw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX2xhYmVsPUV4ZWN1dG9yIFByaW1cdTAwZTFyaW8NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYWRkblBlcmZvcm1lcnNfbGFibGU9RXhlY3V0b3JlcyBBZGljaW9uYWlzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGU9RnVuXHUwMGU3XHUwMGY1ZXMgUmVzcG9uc1x1MDBlMXZlaXMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfY29udG5BcnRpZmFjdHNfbGFiZWw9QXJ0ZWZhdG8gQ29udGlkbw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbD1QYXJ0ZXMgRGlzdHJpYnVcdTAwZWR2ZWlzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsPVNlbGVcdTAwZTdcdTAwZTNvIGRlIEV0YXBhcw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90ZXh0PUVzY29saGEgYXMgcHJvcHJpZWRhZGVzIGRlIGNvbnRlXHUwMGZhZG8gZG8gbVx1MDBlOXRvZG8gcXVlIHZvY1x1MDBlYSBkZXNlamEgY29uc2lkZXJhciBwYXJhIHNpbmNyb25pemFcdTAwZTdcdTAwZTNvLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90aXRsZT1Qclx1MDBlOS12aXN1YWxpemFcdTAwZTdcdTAwZTNvIGRlIFNpbmNyb25pemFcdTAwZTdcdTAwZTNvDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQ9UmV2aXNlIG9zIGRldGFsaGVzIGRhIHNpbmNyb25pemFcdTAwZTdcdTAwZTNvIHByb3Bvc3RvcyBhYmFpeG8uDQotc2VsZWN0RWRpdG9yc1RvRGlzY2FyZENvbmZsaWN0Q2hhbmdlcz1IXHUwMGUxIGFsdGVyYVx1MDBlN1x1MDBmNWVzIG5cdTAwZTNvIHNhbHZhcyBlbSBjb25mbGl0byBjb20gYWx0ZXJhXHUwMGU3XHUwMGY1ZXMgZmVpdGFzIGZvcmEgZG9zIGVkaXRvcmVzLlxuXA0KLVNlbGVjaW9uZSBvcyBlZGl0b3JlcyBjdWphcyBhbHRlcmFcdTAwZTdcdTAwZjVlcyB2b2NcdTAwZWEgZGVzZWphIGRlc2NhcnRhci4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfdGl0bGVfdGV4dD1Bc3Npc3RlbnRlIGRlIFNpbmNyb25pemFcdTAwZTdcdTAwZTNvDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dD1Fc3RlIGFzc2lzdGVudGUgb2ZlcmVjZSBzdXBvcnRlIHBhcmEgYSBhdHVhbGl6YVx1MDBlN1x1MDBlM28gZG9zIGRlc2NyaXRvcmVzIHNlbGVjaW9uYWRvcyBvdSB0b2RvcyBvcyBkZXNjcml0b3JlcyBhYmFpeG8gZGFzIGF0aXZpZGFkZXMgc2VsZWNpb25hZGFzIHF1ZSBmb3JhbSBtYXJjYWRvcyBjb21vICJTaW5jcm9uaXphZG9zIGNvbSBhIG9yaWdlbSIgbmEgZ3VpYSBHZXJhbCBkYSB2aXN1YWxpemFcdTAwZTdcdTAwZTNvIFByb3ByaWVkYWRlcy5cDQotQXBlbmFzIGFzIHByb3ByaWVkYWRlcyBxdWUgZm9yZW0gc2VsZWNpb25hZGFzIG5lc3RlIGFzc2lzdGVudGUgc2VyXHUwMGUzbyBhdHVhbGl6YWRhcyBub3MgZGVzY3JpdG9yZXMuIFwNCi1UYW1iXHUwMGU5bSBcdTAwZTkgcG9zc1x1MDBlZHZlbCBzZWxlY2lvbmFyIHF1YWxxdWVyIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gdlx1MDBlMWxpZGEgZG8gcHJvY2Vzc28gcXVlIHNlclx1MDBlMSB1dGlsaXphZG8gYW8gY29tcHV0YXIgYSBhdHVhbGl6YVx1MDBlN1x1MDBlM28uXA0KLU9ic2VydmUgcXVlIG8gYXNzaXN0ZW50ZSBuXHUwMGUzbyBhdHVhbGl6YXJcdTAwZTEgbmVuaHVtIGRlc2NyaXRvciB2aW5jdWxhZG8gZGluYW1pY2FtZW50ZSAoZW0gdmVyZGUgZSBpdFx1MDBlMWxpY28pLg0KLQ0KLW9wZW5SVEU9QWJyaXIgZWRpdG9yIGRlIHJpY2ggdGV4dA0KLWNsb3NlUlRFPUZlY2hhciBlZGl0b3IgZGUgcmljaCB0ZXh0DQotDQotI05ldyBTdHJpbmdzDQotcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXJlbmNpZSBhIG9yaWVudGFcdTAwZTdcdTAwZTNvIHF1ZSBwZXJ0ZW5jZSBhIGVzdGUgY29uanVudG8gZGUgZnVuXHUwMGU3XHUwMGY1ZXMuDQotZGlzY2lwbGluZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXJlbmNpZSBhIG9yaWVudGFcdTAwZTdcdTAwZTNvIHF1ZSBwZXJ0ZW5jZSBhIGVzdGEgZGlzY2lwbGluYS4NCi13b3JrcHJvZHVjdHR5cGVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VyZW5jaWUgYSBvcmllbnRhXHUwMGU3XHUwMGUzbyBxdWUgcGVydGVuY2UgYSBlc3RlIHRpcG8gZGUgcHJvZHV0byBkZSB0cmFiYWxoby4NCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VyZW5jaWUgYSBvcmllbnRhXHUwMGU3XHUwMGUzbyBxdWUgcGVydGVuY2UgYSBlc3RlIGRvbVx1MDBlZG5pby4NCi10b29sc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXN0YSBmZXJyYW1lbnRhLg0KLWN1c3RvbWNhdGVnb3J5X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VyZW5jaWUgYSBvcmllbnRhXHUwMGU3XHUwMGUzbyBxdWUgcGVydGVuY2UgYSBlc3RhIGNhdGVnb3JpYSBjdXN0b21pemFkYS4NCi0NCi1jb25jZXB0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VyZW5jaWUgYSBvcmllbnRhXHUwMGU3XHUwMGUzbyBxdWUgcGVydGVuY2UgYSBlc3RlIGNvbmNlaXRvLg0KLWNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXN0YSBsaXN0YSBkZSB2ZXJpZmljYVx1MDBlN1x1MDBlM28uDQotZXhhbXBsZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXN0ZSBleGVtcGxvLg0KLWd1aWRlbGluZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXN0YSBkaXJldHJpei4NCi1yb2FkbWFwX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VyZW5jaWUgYSBvcmllbnRhXHUwMGU3XHUwMGUzbyBxdWUgcGVydGVuY2UgYSBlc3RlIHJvdGVpcm8uDQotcmV1c2FibGVhc3NldF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXN0ZSByZWN1cnNvIHJldXRpbGl6XHUwMGUxdmVsLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXN0ZSBtYXRlcmlhbCBkZSBzdXBvcnRlLg0KLXJlcG9ydF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXN0ZSByZWxhdFx1MDBmM3Jpby4NCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXN0YSBwclx1MDBlMXRpY2EuDQotdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXJlbmNpZSBhIG9yaWVudGFcdTAwZTdcdTAwZTNvIHF1ZSBwZXJ0ZW5jZSBhIGVzdGUgbW9kZWxvLg0KLXRlcm1kZWZpbml0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VyZW5jaWUgYSBvcmllbnRhXHUwMGU3XHUwMGUzbyBxdWUgcGVydGVuY2UgYSBlc3NhIGRlZmluaVx1MDBlN1x1MDBlM28gZGUgdGVybW8uDQotdG9vbG1lbnRvcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXNzZSBtZW50b3IgZGUgZmVycmFtZW50YS4NCi13aGl0ZXBhcGVyX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VyZW5jaWUgYSBvcmllbnRhXHUwMGU3XHUwMGUzbyBxdWUgcGVydGVuY2UgYSBlc3RlIHdoaXRlcGFwZXIuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXJlbmNpZSBhIG9yaWVudGFcdTAwZTdcdTAwZTNvIHF1ZSBwZXJ0ZW5jZSBhIGVzdGEgY29uc2lkZXJhXHUwMGU3XHUwMGUzbyBkZSBlc3RpbWF0aXZhLg0KLQ0KLQ0KLSNOZXcgU3RyaW5nIFNlY3Rpb24gRGVzY3JpcHRpb24NCi1yb2xlX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0YSBmdW5cdTAwZTdcdTAwZTNvLg0KLXJvbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0YSBmdW5cdTAwZTdcdTAwZTNvLg0KLXJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY29tbyBlc3RhIGZ1blx1MDBlN1x1MDBlM28gc2UgcmVsYWNpb25hIGEgb3V0cmEgZnVuXHUwMGU3XHUwMGUzby4NCi1yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0YSBmdW5cdTAwZTdcdTAwZTNvLg0KLQ0KLXRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGV0YWxoYWRhcyBzb2JyZSBlc3RhIHRhcmVmYS4NCi10YXNrX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGEgdGFyZWZhLg0KLXRhc2tfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY29tbyBlc3RhIHRhcmVmYSBzZSByZWxhY2lvbmEgYSBvdXRyYSB0YXJlZmEuDQotdGFza192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGEgdGFyZWZhLg0KLQ0KLWFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSBhcnRlZmF0by4NCi1hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlIGFydGVmYXRvLg0KLWFydGlmYWN0X2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIG9zIFx1MDBlZGNvbmVzIGRlc3RlIGFydGVmYXRvLg0KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgZW50cmVnYSBzb2JyZSBlc3RlIGFydGVmYXRvLg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIGFqdXN0ZSBzb2JyZSBlc3RlIGFydGVmYXRvLg0KLWFydGlmYWN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNvbW8gZXN0ZSBhcnRlZmF0byBzZSByZWxhY2lvbmEgYSBvdXRybyBhcnRlZmF0by4NCi1hcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGUgYXJ0ZWZhdG8uDQotDQotb3V0Y29tZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZXRhbGhhZGFzIHNvYnJlIGVzdGUgcmVzdWx0YWRvLg0KLW91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0ZSByZXN1bHRhZG8uDQotb3V0Y29tZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSBvcyBcdTAwZWRjb25lcyBkZXN0ZSByZXN1bHRhZG8uDQotb3V0Y29tZV9ub3RhdGlvblNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIGVudHJlZ2Egc29icmUgZXN0ZSByZXN1bHRhZG8uDQotb3V0Y29tZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSBhanVzdGUgc29icmUgZXN0ZSByZXN1bHRhZG8uDQotb3V0Y29tZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgcmVzdWx0YWRvIHNlIHJlbGFjaW9uYSBhIG91dHJvIHJlc3VsdGFkby4NCi1vdXRjb21lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSByZXN1bHRhZG8uDQotDQotZGVsaXZlcmFibGVfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGV0YWxoYWRhcyBzb2JyZSBlc3RlIGRpc3RyaWJ1XHUwMGVkdmVsLg0KLWRlbGl2ZXJhYmxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGUgZGlzdHJpYnVcdTAwZWR2ZWwuDQotZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgb3MgXHUwMGVkY29uZXMgZGVzdGUgZGlzdHJpYnVcdTAwZWR2ZWwuDQotZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSBlbnRyZWdhIHNvYnJlIGVzdGUgZGlzdHJpYnVcdTAwZWR2ZWwuDQotZGVsaXZlcmFibGVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgYWp1c3RlIHNvYnJlIGVzdGUgZGlzdHJpYnVcdTAwZWR2ZWwuDQotZGVsaXZlcmFibGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY29tbyBlc3RlIGRpc3RyaWJ1XHUwMGVkdmVsIHNlIHJlbGFjaW9uYSBhIG91dHJvIGRpc3RyaWJ1XHUwMGVkdmVsLg0KLWRlbGl2ZXJhYmxlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSBkaXN0cmlidVx1MDBlZHZlbC4NCi0NCi1kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0YSBkaXNjaXBsaW5hLg0KLWRpc2NpcGxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0YSBkaXNjaXBsaW5hLg0KLWRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY29tbyBlc3RhIGRpc2NpcGxpbmEgc2UgcmVsYWNpb25hIGEgb3V0cmEgZGlzY2lwbGluYS4NCi1kaXNjaXBsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0YSBkaXNjaXBsaW5hLg0KLQ0KLWRvbWFpbl9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZXRhbGhhZGFzIHNvYnJlIGVzdGUgZG9tXHUwMGVkbmlvLg0KLWRvbWFpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlIGRvbVx1MDBlZG5pby4NCi1kb21haW5fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY29tbyBlc3RlIGRvbVx1MDBlZG5pbyBzZSByZWxhY2lvbmEgYSBvdXRybyBkb21cdTAwZWRuaW8uDQotZG9tYWluX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSBkb21cdTAwZWRuaW8uDQotDQotd29ya3Byb2R1Y3R0eXBlX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSB0aXBvIGRlIHByb2R1dG8gZGUgdHJhYmFsaG8uDQotd29ya3Byb2R1Y3R0eXBlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGUgdGlwbyBkZSBwcm9kdXRvIGRlIHRyYWJhbGhvLg0KLXdvcmtwcm9kdWN0dHlwZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgdGlwbyBkZSBwcm9kdXRvIGRlIHRyYWJhbGhvIHNlIHJlbGFjaW9uYSBhIG91dHJvIHRpcG8gZGUgcHJvZHV0byBkZSB0cmFiYWxoby4NCi13b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSB2ZXJzXHUwMGUzbyBzb2JyZSBlc3RlIHRpcG8gZGUgcHJvZHV0byBkZSB0cmFiYWxoby4NCi0NCi1yb2xlc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSBjb25qdW50byBkZSBmdW5cdTAwZTdcdTAwZjVlcy4NCi1yb2xlc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGUgY29uanVudG8gZGUgZnVuXHUwMGU3XHUwMGY1ZXMuDQotcm9sZXNldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgY29uanVudG8gZGUgZnVuXHUwMGU3XHUwMGY1ZXMgc2UgcmVsYWNpb25hIGEgb3V0cm8gY29uanVudG8gZGUgZnVuXHUwMGU3XHUwMGY1ZXMuDQotcm9sZXNldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGUgY29uanVudG8gZGUgZnVuXHUwMGU3XHUwMGY1ZXMuDQotDQotdG9vbF9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZXRhbGhhZGFzIHNvYnJlIGVzdGEgZmVycmFtZW50YS4NCi10b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGEgZmVycmFtZW50YS4NCi10b29sX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNvbW8gZXN0YSBmZXJyYW1lbnRhIHNlIHJlbGFjaW9uYSBhIG91dHJhIGZlcnJhbWVudGEuDQotdG9vbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGEgZmVycmFtZW50YS4NCi0NCi1jb25jZXB0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSBjb25jZWl0by4NCi1jb25jZXB0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGUgY29uY2VpdG8uDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgY29uY2VpdG8gc2UgcmVsYWNpb25hIGEgb3V0cm8gY29uY2VpdG8uDQotY29uY2VwdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGUgY29uY2VpdG8uDQotDQotY2hlY2tsaXN0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0YSBsaXN0YSBkZSB2ZXJpZmljYVx1MDBlN1x1MDBlM28uDQotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGEgbGlzdGEgZGUgdmVyaWZpY2FcdTAwZTdcdTAwZTNvLg0KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGEgbGlzdGEgZGUgdmVyaWZpY2FcdTAwZTdcdTAwZTNvIHNlIHJlbGFjaW9uYSBhIG91dHJhIGxpc3RhIGRlIHZlcmlmaWNhXHUwMGU3XHUwMGUzby4NCi1jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSB2ZXJzXHUwMGUzbyBzb2JyZSBlc3RhIGxpc3RhIGRlIHZlcmlmaWNhXHUwMGU3XHUwMGUzby4NCi0NCi1leGFtcGxlX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSBleGVtcGxvLg0KLWV4YW1wbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0ZSBleGVtcGxvLg0KLWV4YW1wbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY29tbyBlc3RlIGV4ZW1wbG8gc2UgcmVsYWNpb25hIGEgb3V0cm8gZXhlbXBsby4NCi1leGFtcGxlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSBleGVtcGxvLg0KLQ0KLWd1aWRlbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZXRhbGhhZGFzIHNvYnJlIGVzdGEgb3JpZW50YVx1MDBlN1x1MDBlM28uDQotZ3VpZGVsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGEgb3JpZW50YVx1MDBlN1x1MDBlM28uDQotZ3VpZGVsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNvbW8gZXN0YSBvcmllbnRhXHUwMGU3XHUwMGUzbyBzZSByZWxhY2lvbmEgYSBvdXRyYSBvcmllbnRhXHUwMGU3XHUwMGUzby4NCi1ndWlkZWxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSB2ZXJzXHUwMGUzbyBzb2JyZSBlc3RhIG9yaWVudGFcdTAwZTdcdTAwZTNvLg0KLQ0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0YSBjb25zaWRlcmFcdTAwZTdcdTAwZTNvIGRlIGVzdGltYXRpdmEuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0YSBjb25zaWRlcmFcdTAwZTdcdTAwZTNvIGRlIGVzdGltYXRpdmEuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmljYXIgY29tbyBlc3RhIGNvbnNpZGVyYVx1MDBlN1x1MDBlM28gZGUgZXN0aW1hdGl2YSBzZSByZWxhY2lvbmEgYSBvdXJhIGNvbnNpZGVyYVx1MDBlN1x1MDBlM28gZGUgZXN0aW1hdGl2YS4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGEgY29uc2lkZXJhXHUwMGU3XHUwMGUzbyBkZSBlc3RpbWF0aXZhLg0KLQ0KLXByYWN0aWNlX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0YSBwclx1MDBlMXRpY2EuDQotcHJhY3RpY2VfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0YSBwclx1MDBlMXRpY2EuDQotcHJhY3RpY2VfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY29tbyBlc3RhIHByXHUwMGUxdGljYSBzZSByZWxhY2lvbmEgYSBvdXRyYSBwclx1MDBlMXRpY2EuDQotcHJhY3RpY2VfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSB2ZXJzXHUwMGUzbyBzb2JyZSBlc3RhIHByXHUwMGUxdGljYS4NCi0NCi1yZXBvcnRfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGV0YWxoYWRhcyBzb2JyZSBlc3RlIHJlbGF0XHUwMGYzcmlvLg0KLXJlcG9ydF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlIHJlbGF0XHUwMGYzcmlvLg0KLXJlcG9ydF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgcmVsYXRcdTAwZjNyaW8gc2UgcmVsYWNpb25hIGEgb3V0cm8gcmVsYXRcdTAwZjNyaW8uDQotcmVwb3J0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSByZWxhdFx1MDBmM3Jpby4NCi0NCi1yZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSByZWN1cnNvIHJldXRpbGl6XHUwMGUxdmVsLg0KLXJlc3VhYmxlYXNzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0ZSByZWN1cnNvIHJldXRpbGl6XHUwMGUxdmVsLg0KLXJlc3VhYmxlYXNzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmljYXIgY29tbyBlc3RlIHJlY3Vyc28gcmV1dGlsaXpcdTAwZTF2ZWwgc2UgcmVsYWNpb25hIGEgb3V0cm8gcmVjdXJzbyByZXV0aWxpelx1MDBlMXZlbC4NCi1yZXN1YWJsZWFzc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSByZWN1cnNvIHJldXRpbGl6XHUwMGUxdmVsLg0KLQ0KLXJvYWRtYXBfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGV0YWxoYWRhcyBzb2JyZSBlc3RlIHJvdGVpcm8uDQotcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlIHJvdGVpcm8uDQotcm9hZG1hcF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgcm90ZWlybyBzZSByZWxhY2lvbmEgYSBvdXRybyByb3RlaXJvLg0KLXJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSB2ZXJzXHUwMGUzbyBzb2JyZSBlc3RlIHJvdGVpcm8uDQotDQotc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSBtYXRlcmlhbCBkZSBzdXBvcnRlLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlIG1hdGVyaWFsIGRlIHN1cG9ydGUuDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpY2FyIGNvbW8gZXN0ZSBtYXRlcmlhbCBkZSBzdXBvcnRlIHNlIHJlbGFjaW9uYSBhIG91dHJvIG1hdGVyaWFsIGRlIHN1cG9ydGUuDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSBtYXRlcmlhbCBkZSBzdXBvcnRlLg0KLQ0KLXRlbXBsYXRlX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSBtb2RlbG8uDQotdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0ZSBtb2RlbG8uDQotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY29tbyBlc3RlIG1vZGVsbyBzZSByZWxhY2lvbmEgYSBvdXRybyBtb2RlbG8uDQotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSB2ZXJzXHUwMGUzbyBzb2JyZSBlc3RlIG1vZGVsby4NCi0NCi10ZXJtZGVmaW5pdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZXRhbGhhZGFzIHNvYnJlIGVzdGEgZGVmaW5pXHUwMGU3XHUwMGUzbyBkZSB0ZXJtby4NCi10ZXJtZGVmaW5pdGlvbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RhIGRlZmluaVx1MDBlN1x1MDBlM28gZGUgdGVybW8uDQotdGVybWRlZmluaXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmljYXIgY29tbyBlc3RhIGRlZmluaVx1MDBlN1x1MDBlM28gZGUgdGVybW8gc2UgcmVsYWNpb25hIGEgb3V0cmEgZGVmaW5pXHUwMGU3XHUwMGUzbyBkZSB0ZXJtby4NCi10ZXJtZGVmaW5pdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGEgZGVmaW5pXHUwMGU3XHUwMGUzbyBkZSB0ZXJtby4NCi0NCi10b29sbWVudG9yX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSBtZW50b3IgZGUgZmVycmFtZW50YS4NCi10b29sbWVudG9yX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGUgbWVudG9yIGRlIGZlcnJhbWVudGEuDQotdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgbWVudG9yIGRlIGZlcnJhbWVudGEgc2UgcmVsYWNpb25hIGEgb3V0cm8gbWVudG9yIGRlIGZlcnJhbWVudGEuDQotdG9vbG1lbnRvcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGUgbWVudG9yIGRlIGZlcnJhbWVudGEuDQotDQotd2hpdGVwYXBlcl9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZXRhbGhhZGFzIHNvYnJlIGVzdGUgd2hpdGVwYXBlci4NCi13aGl0ZXBhcGVyX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGUgd2hpdGVwYXBlci4NCi13aGl0ZXBhcGVyX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNvbW8gZXN0ZSB3aGl0ZXBhcGVyIHNlIHJlbGFjaW9uYSBhIG91dHJvIHdoaXRlcGFwZXIuDQotd2hpdGVwYXBlcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGUgd2hpdGVwYXBlci4NCi0NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGV0YWxoYWRhcyBzb2JyZSBlc3RlIGdydXBvIGRlIGRpc2NpcGxpbmFzLg0KLWRpc2NpcGxpbmVncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlIGdydXBvIGRlIGRpc2NpcGxpbmFzLg0KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgZ3J1cG8gZGUgZGlzY2lwbGluYXMgc2UgcmVsYWNpb25hIGEgb3V0cm8gZ3J1cG8gZGUgZGlzY2lwbGluYXMuDQotZGlzY2lwbGluZWdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSBncnVwbyBkZSBkaXNjaXBsaW5hcy4NCi0NCi1yb2xlc2V0Z3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGV0YWxoYWRhcyBzb2JyZSBlc3RlIGdydXBvIGRlIGNvbmp1bnRvIGRlIGZ1blx1MDBlN1x1MDBmNWVzLg0KLXJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlIGdydXBvIGRlIGNvbmp1bnRvIGRlIGZ1blx1MDBlN1x1MDBmNWVzLg0KLXJvbGVzZXRncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgZ3J1cG8gZGUgY29uanVudG8gZGUgZnVuXHUwMGU3XHUwMGY1ZXMgc2UgcmVsYWNpb25hIGEgb3V0cm8gZ3J1cG8gZGUgY29uanVudG8gZGUgZnVuXHUwMGU3XHUwMGY1ZXMuDQotcm9sZXNldGdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSBncnVwbyBkZSBjb25qdW50byBkZSBmdW5cdTAwZTdcdTAwZjVlcy4NCi0NCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZXRhbGhhZGFzIHNvYnJlIGVzdGEgY2F0ZWdvcmlhIGN1c3RvbWl6YWRhLg0KLWN1c3RvbWNhdGVnb3J5X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGEgY2F0ZWdvcmlhIGN1c3RvbWl6YWRhLg0KLWN1c3RvbWNhdGVnb3J5X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNvbW8gZXN0YSBjYXRlZ29yaWEgY3VzdG9taXphZGEgc2UgcmVsYWNpb25hIGEgb3V0cmEgY2F0ZWdvcmlhIGN1c3RvbWl6YWRhLg0KLWN1c3RvbWNhdGVnb3J5X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0YSBjYXRlZ29yaWEgY3VzdG9taXphZGEuDQotY3VzdG9tY2F0ZWdvcnlfSWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgb3MgXHUwMGVkY29uZXMgZGVzdGEgY2F0ZWdvcmlhIGN1c3RvbWl6YWRhLg0KLQ0KLWNvbmNlcHRfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgb3MgXHUwMGVkY29uZXMgZGVzdGUgY29uY2VpdG8uDQotY2hlY2tsaXN0X2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIG9zIFx1MDBlZGNvbmVzIGRlc3RhIGxpc3RhIGRlIHZlcmlmaWNhXHUwMGU3XHUwMGUzby4NCi10b29sbWVudG9yX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIG9zIFx1MDBlZGNvbmVzIGRlc3RlIG1lbnRvciBkZSBmZXJyYW1lbnRhLg0KLXdoaXRlcGFwZXJfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgb3MgXHUwMGVkY29uZXMgZGVzdGUgd2hpdGVwYXBlci4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSBvcyBcdTAwZWRjb25lcyBkZXN0YSBjb25zaWRlcmFcdTAwZTdcdTAwZTNvIGRlIGVzdGltYXRpdmEuDQotdGVybWRlZmluaXRpb25faWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgb3MgXHUwMGVkY29uZXMgZGVzdGEgZGVmaW5pXHUwMGU3XHUwMGUzbyBkZSB0ZXJtby4NCi10ZW1wbGF0ZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSBvcyBcdTAwZWRjb25lcyBkZXN0ZSBtb2RlbG8uDQotcmV1c2FibGVhc3NldF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSBvcyBcdTAwZWRjb25lcyBkZXN0ZSByZWN1cnNvIHJldXRpbGl6XHUwMGUxdmVsLg0KLXJlcG9ydF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSBvcyBcdTAwZWRjb25lcyBkZXN0ZSByZWxhdFx1MDBmM3Jpby4NCi1wcmFjdGljZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSBvcyBcdTAwZWRjb25lcyBkZXN0YSBwclx1MDBlMXRpY2EuDQotZXhhbXBsZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSBvcyBcdTAwZWRjb25lcyBkZXN0ZSBleGVtcGxvLg0KLWd1aWRlbGluZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSBvcyBcdTAwZWRjb25lcyBkZXN0YSBkaXJldHJpei4NCi1yb2FkbWFwX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIG9zIFx1MDBlZGNvbmVzIGRlc3RlIHJvdGVpcm8uDQotc3VwcG9ydGluZ21hdGVyaWFsX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIG9zIFx1MDBlZGNvbmVzIGRlc3RlIG1hdGVyaWFsIGRlIHN1cG9ydGUuDQotDQotZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfdGl0bGU9QXJxdWl2byBBbHRlcmFkbw0KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2U9TyBhcnF1aXZvIGZvaSBhbHRlcmFkbyBubyBzaXN0ZW1hIGRlIGFycXVpdm8uIERlc2VqYSBjYXJyZWdhciBhcyBhbHRlcmFcdTAwZTdcdTAwZjVlcz8NCi0NCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZT1WYXJpYWJpbGlkYWRlIGRlIEF0aXZpZGFkZQ0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZz1BIGF0aXZpZGFkZSAnJ3swfScnIG5cdTAwZTNvIHBvZGUgZGVmaW5pciBhIHZhcmlhYmlsaWRhZGUgY29tICcnezF9JycgcG9ycXVlICcnezF9Jycgalx1MDBlMSB0ZW0gdW1hIG91IG1haXMgYXRpdmlkYWRlcyBjb250cmlidVx1MDBlZGRhcy9zdWJzdGl0dVx1MDBlZGRhcyBjb21vIHN1YXMgZmlsaGFzLg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzE9QSBhdGl2aWRhZGUgJyd7MH0nJyBuXHUwMGUzbyBwb2RlIGRlZmluaXIgYSB2YXJpYWJpbGlkYWRlIGNvbSB1bSBkZSBzZXVzIHBhaXMgZGlyZXRvcyBlIHF1YWxxdWVyIHByb2Nlc3NvLg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzI9QSBhdGl2aWRhZGUgJyd7MH0nJyBuXHUwMGUzbyBwb2RlIGRlZmluaXIgYSB2YXJpYWJpbGlkYWRlIGNvbSAnJ3sxfScnIHBvcnF1ZSByZXN1bHRhclx1MDBlMSBlbSBkZXBlbmRcdTAwZWFuY2lhIGNpcmN1bGFyLg0KLQ0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU9QXBsaWNhciBQYWRyXHUwMGUzbw0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPUEgYXRpdmlkYWRlICcnezB9Jycgblx1MDBlM28gcG9kZSBhcGxpY2FyIHBhZHJcdTAwZjVlcyBjb20gJyd7MX0nJyBqXHUwMGUxIHF1ZSByZXN1bHRhIGVtIGRlcGVuZFx1MDBlYW5jaWEgY2lyY3VsYXIuDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyPXwNCi1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc9TW9zdHJhciBwcm9wcmlldFx1MDBlMXJpbyBkZXN0YSByZWZlclx1MDBlYW5jaWEgblx1MDBlM28gcmVzb2x2aWRhIG5hIHZpc3VhbGl6YVx1MDBlN1x1MDBlM28gQmlibGlvdGVjYQ0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZT1SZW1vdmVyIGVzdGEgcmVmZXJcdTAwZWFuY2lhIG5cdTAwZTNvIHJlc29sdmlkYQ0KLXByb21wdERlbGV0ZUN1c3RvbUNhdGVnb3J5QmVmb3JlUmVtb3ZlTGFzdFJlZlRvSXQ9Vm9jXHUwMGVhIGVzdFx1MDBlMSBwcmVzdGVzIGEgcmVtb3ZlciBhIFx1MDBmYWx0aW1hIHJlZmVyXHUwMGVhbmNpYSBhIHswfSBubyBwbHVnLWluLiBPKHMpIGVsZW1lbnRvKHMpIHNlclx1MDBlMShcdTAwZTNvKSBleGNsdVx1MDBlZGRvKHMpLiBEZXNlamEgY29udGludWFyPw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jQmVsb3cgcHJvcGVydHkgImVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcyIgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkDQotI0Rvbid0IGRlbGV0ZSBhIHNwYWNlIGFmdGVyICI6ICINCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLWVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcz06IA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhY2FhOTM5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEzICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb3JtIFBhZ2UgVGl0bGVzDQotYXNzaWduUGFnZV90aXRsZT1cdTUyMDZcdTkxNGQNCi1jYXRlZ29yaWVzUGFnZV90aXRsZT1cdTdjN2JcdTUyMmINCi1kZWxpdmVyYWJsZVBhcnRzUGFnZV90aXRsZT1cdTUzZWZcdTRlYTRcdTRlZDhcdTkwZThcdTRlZjYNCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9XHU2M2NmXHU4ZmYwDQotZGlzY2lwbGluZXNQYWdlX3RpdGxlPVx1ODljNFx1N2EwYg0KLWRpc2NhcmR1bnJlc29sdmVkcmVmPVx1NWU5Zlx1NWYwM1x1NjcyYVx1ODllM1x1Njc5MFx1NzY4NFx1NWYxNVx1NzUyOA0KLWd1aWRhbmNlUGFnZV90aXRsZT1cdTYzMDdcdTViZmNcdTRmZTFcdTYwNmYNCi1wcmV2aWV3UGFnZV90aXRsZT1cdTk4ODRcdTg5YzgNCi1yZWZlcmVuY2VzUGFnZV90aXRsZT1cdTVmMTVcdTc1MjgNCi1yZWZlcmVuY2VfdGV4dD1cdTVmMTVcdTc1MjhcdWZmMWENCi1yZWZlcmVuY2VXb3JrZmxvd1BhZ2VfdGl0bGU9XHU1ZjE1XHU3NTI4XHU1ZGU1XHU0ZjVjXHU2ZDQxDQotcm9sZXNQYWdlX3RpdGxlPVx1ODlkMlx1ODI3Mg0KLXJvbGVTZXRzUGFnZV90aXRsZT1cdTg5ZDJcdTgyNzJcdTk2YzYNCi1zdGVwc1BhZ2VfdGl0bGU9XHU2YjY1XHU5YWE0DQotdGFza3NQYWdlX3RpdGxlPVx1NGVmYlx1NTJhMQ0KLXRvb2xNZW50b3JzUGFnZV90aXRsZT1cdTVkZTVcdTUxNzdcdTU0MTFcdTViZmMNCi13b3JrUHJvZHVjdHNQYWdlX3RpdGxlPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLQ0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uDQotY2hlY2tJdGVtc1NlY3Rpb25fbmFtZT1cdTY4YzBcdTY3ZTVcdTk4NzkNCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1Njc4NFx1NjIxMFx1NmI2NFx1NjgzOFx1NWJmOVx1ODg2OFx1NzY4NFx1NjhjMFx1NjdlNVx1OTg3OVx1MzAwMg0KLWRlcGVuZGVuY2llc1NlY3Rpb25fbmFtZT1cdTRmOWRcdThkNTZcdTUxNzNcdTdjZmINCi1kZXBlbmRlbmNpZXNTZWN0aW9uX2Rlc2M9XHU2NzJjXHU5MGU4XHU1MjA2XHU2NjNlXHU3OTNhXHU2YjY0XHU1MTg1XHU1YmI5XHU1MzA1XHU0ZTBlXHU1MTc2XHU0ZWQ2XHU1MTg1XHU1YmI5XHU1MzA1XHU3Njg0XHU0ZjlkXHU4ZDU2XHU1MTczXHU3Y2ZiXHUzMDAyDQotZGV0YWlsU2VjdGlvbl9uYW1lPVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zg0KLWRldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjR7MH1cdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi1nZW5lcmFsSW5mb1NlY3Rpb25fbmFtZT1cdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmYNCi1nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjR7MH1cdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1pY29uU2VjdGlvbl9uYW1lPVx1NTZmZVx1NjgwNw0KLWljb25TZWN0aW9uX2Rlc2M9XHU0ZTNhXHU2YjY0ezB9XHU1YjlhXHU1MjM2XHU1NmZlXHU2ODA3XHUzMDAyDQotbm90YXRpb25TZWN0aW9uX25hbWU9XHU0ZWE0XHU0ZWQ4XHU0ZmUxXHU2MDZmDQotbm90YXRpb25TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2NzA5XHU1MTczXHU2YjY0ezB9XHU3Njg0XHU0ZWE0XHU0ZWQ4XHU0ZmUxXHU2MDZmXHUzMDAyDQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX25hbWU9XHU1ZjE1XHU3NTI4XHU2M2QyXHU0ZWY2XHVmZjFhDQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX2Rlc2M9XHU2NzJjXHU5MGU4XHU1MjA2XHU2NjNlXHU3OTNhXHU2YjY0XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHU1ZjE1XHU3NTI4XHU3Njg0XHU2M2QyXHU0ZWY2XHUzMDAyDQotc3RhZmZpbmdTZWN0aW9uX25hbWU9XHU0ZWJhXHU1NDU4XHU5MTRkXHU1OTA3XHU0ZmUxXHU2MDZmDQotc3RhZmZpbmdTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2NzA5XHU1MTczXHU2YjY0XHU4OWQyXHU4MjcyXHU3Njg0XHU0ZWJhXHU1NDU4XHU5MTRkXHU1OTA3XHU0ZmUxXHU2MDZmXHUzMDAyDQotc3RlcHNTZWN0aW9uX25hbWU9XHU2YjY1XHU5YWE0DQotc3RlcHNTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2MjY3XHU4ODRjXHU2YjY0XHU0ZWZiXHU1MmExXHU3Njg0XHU2YjY1XHU5YWE0XHUzMDAyDQotdGFpbG9yaW5nU2VjdGlvbl9uYW1lPVx1NWI5YVx1NTIzNg0KLXRhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjR7MH1cdTc2ODRcdTViOWFcdTUyMzZcdTRmZTFcdTYwNmZcdTMwMDINCi12YXJpYWJpbGl0eVNlY3Rpb25fbmFtZT1cdTUxODVcdTViYjlcdTUzZWZcdTUzZDhcdTYwMjcNCi12YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjR7MH1cdTU5ODJcdTRmNTVcdTRlMGVcdTUzZTZcdTRlMDBcdTRlMmF7MH1cdTc2ZjhcdTUxNzNcdTMwMDINCi12ZXJzaW9uSW5mb1NlY3Rpb25fbmFtZT1cdTcyNDhcdTY3MmNcdTRmZTFcdTYwNmYNCi12ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjR7MH1cdTc2ODRcdTcyNDhcdTY3MmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi0jIFVJICYgRWxlbWVudCBBdHRyaWJ1dGUgTGFiZWxzDQotYWRkaXRpb25hbEluZm9fdGV4dD1cdTUxNzZcdTRlZDZcdTRmZTFcdTYwNmZcdWZmMWENCi1hcHBsaWNhdGlvbl90ZXh0PVx1NWU5NFx1NzUyOFx1N2EwYlx1NWU4Zlx1ZmYxYQ0KLWFjdGlvbkxhYmVsX2VkaXQ9XHU3ZjE2XHU4ZjkxDQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1cdTU3MjhcdTVlOTNcdTg5YzZcdTU2ZmVcdTRlMmRcdTY2M2VcdTc5M2ENCi1hbHRlcm5hdGl2ZXNfdGV4dD1cdTY2ZmZcdTRlZTNcdTY1YjlcdTY4NDhcdWZmMWENCi1hc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0PVx1NTIwNlx1OTE0ZFx1NjViOVx1NmNkNVx1ZmYxYQ0KLWF1dGhvcnNfdGV4dD1cdTRmNWNcdTgwMDVcdWZmMWENCi1iYWNrZ3JvdW5kX3RleHQ9XHU4MGNjXHU2NjZmXHVmZjFhDQotYmFzZUVsZW1lbnRfdGV4dD1cdTU3ZmFcdTY3MmNcdWZmMWENCi1iYXNlR3VpZGFuY2VfdGV4dD1cdTU3ZmFcdTY3MmNcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdWZmMWENCi1icmllZkRlc2NyaXB0aW9uX3RleHQ9XHU3YjgwXHU4OTgxXHU2M2NmXHU4ZmYwXHVmZjFhDQotZGVzY3JpcHRpb25fdGV4dD1cdTYzY2ZcdThmZjBcdWZmMWENCi1iYWNrdXBiZWZvcmVzYXZlX3RleHQ9XHU0ZmRkXHU1YjU4XHU1MjRkXHU1OTA3XHU0ZWZkDQotYnJpZWZPdXRsaW5lX3RleHQ9XHU3YjgwXHU3N2VkXHU2OTgyXHU2MmVjXHVmZjFhDQotY2hhbmdlRGF0ZV90ZXh0PVx1NjZmNFx1NjUzOVx1NjVlNVx1NjcxZlx1ZmYxYQ0KLWNoYW5nZURlc2NyaXB0aW9uX3RleHQ9XHU2NmY0XHU2NTM5XHU2M2NmXHU4ZmYwXHVmZjFhDQotY2hlY2tJdGVtc190ZXh0PVx1NjhjMFx1NjdlNVx1OTg3OQ0KLWNvbnRyaWJ1dGVzX3RleHQ9XHU2M2QwXHU0ZjliDQotbG9jYWxDb250cmlidXRlc190ZXh0PVx1NjcyY1x1NTczMFx1NjNkMFx1NGY5Yg0KLWNvbnRyaWJ1dGVzX3RvX3RleHQ9XHU2M2QwXHU0ZjliXHU1MjMwDQotY29weXJpZ2h0X3RleHQ9XHU3MjQ4XHU2NzQzXHVmZjFhDQotZWRpdG9yX3RleHQ9XHU3ZjE2XHU4ZjkxXHU1NjY4DQotZXh0ZW5kc190ZXh0PVx1NjI2OVx1NWM1NQ0KLWV4dGVuZF90ZXh0PVx1NjI2OVx1NWM1NQ0KLWV4dGVybmFsRGVzY3JpcHRpb25fdGV4dD1cdTU5MTZcdTkwZThcdTYzY2ZcdThmZjBcdWZmMWENCi1leHRlcm5hbElkX3RleHQ9XHU1OTE2XHU5MGU4XHU2ODA3XHU4YmM2XHVmZjFhDQotZ29hbHNfdGV4dD1cdTc2ZWVcdTY4MDdcdWZmMWENCi1pbXBhY3RPZk5vdEhhdmluZ190ZXh0PVx1NGUwZFx1NTE3N1x1NjcwOVx1NzY4NFx1NWY3MVx1NTRjZFx1ZmYxYQ0KLWtleUNvbnNpZGVyYXRpb25zX3RleHQ9XHU1MTczXHU5NTJlXHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5XHVmZjFhDQotbGV2ZWxzT2ZBZG9wdGlvbl90ZXh0PVx1OTFjN1x1NzUyOFx1N2VhN1x1NTIyYlx1ZmYxYQ0KLW1haW5EZXNjcmlwdGlvbl90ZXh0PVx1NGUzYlx1ODk4MVx1NjNjZlx1OGZmMFx1ZmYxYQ0KLW5ld0VsZW1lbnRfdGV4dD1cdTY1YjBcdTVlZmEgezB9DQotbmFtZV90ZXh0PVx1NTQwZFx1NzlmMFx1ZmYxYQ0KLW5vdEFwcGxpY2FibGVfdGV4dD1cdTRlMGRcdTkwMDJcdTc1MjgNCi1wYWNrYWdpbmdHdWlkYW5jZV90ZXh0PVx1NjI1M1x1NTMwNVx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1ZmYxYQ0KLXByZXNlbnRhdGlvbk5hbWVfdGV4dD1cdTY2M2VcdTc5M2FcdTU0MGRcdTc5ZjBcdWZmMWENCi1wcm9tcHRmb3JsaWJhcnlfdGV4dD1cdTU0MmZcdTUyYThcdTY1ZjZcdTYzZDBcdTc5M2FcdTkwMDlcdTYyZTlcdTY1YjlcdTZjZDVcdTVlOTMNCi1lbmFibGVIZWFsdGhDaGVja190ZXh0PVx1NTQyZlx1NzUyOFx1NTE4NVx1OTBlOFx1OGMwM1x1OGJkNVx1NWRlNVx1NTE3Nw0KLXByb2JsZW1fdGV4dD1cdTk1ZWVcdTk4OThcdWZmMWENCi1wdXJwb3NlX3RleHQ9XHU3NTI4XHU5MDE0XHVmZjFhDQotcmVhc29uRm9yTm90TmVlZGluZ190ZXh0PVx1NGUwZFx1OTcwMFx1ODk4MVx1NzY4NFx1NTM5Zlx1NTZlMFx1ZmYxYQ0KLXJlcGxhY2VzX3RleHQ9XHU2NmZmXHU2MzYyDQotbG9jYWxSZXBsYWNlc190ZXh0PVx1NjcyY1x1NTczMFx1NjZmZlx1NjM2Mg0KLXJlcHJlc2VudGF0aW9uT3B0aW9uc190ZXh0PVx1OGJmNFx1NjYwZVx1OTAwOVx1OTg3OVx1ZmYxYQ0KLXRlbXBsYXRlRmlsZV90ZXh0PVx1NmEyMVx1Njc3Zlx1NjU4N1x1NGVmNlx1ZmYxYQ0KLXNraWxsc190ZXh0PVx1NjI4MFx1ODBmZFx1ZmYxYQ0KLXN0ZXBzX3RleHQ9XHU2YjY1XHU5YWE0XHVmZjFhDQotc3RlcHNfbmFtZV90ZXh0PVx1NTQwZFx1NzlmMFx1ZmYxYQ0KLXN0b3BfdGV4dD1cdTUwNWNcdTZiNjINCi1wcmludF90ZXh0PVx1NjI1M1x1NTM3MA0KLXN5bm9ueW1zX3RleHQ9XHU1NDBjXHU0ZTQ5XHU4YmNkXHVmZjFhDQotdHlwZV90ZXh0PVx1N2M3Ylx1NTc4Ylx1ZmYxYQ0KLWNvcHlfdGV4dD1cdTU5MGRcdTUyMzYNCi1kZWVwQ29weV90ZXh0PVx1NmRmMVx1NWM0Mlx1NTkwZFx1NTIzNg0KLWJhY2tfdGV4dD1cdTU0MGVcdTkwMDANCi1uZXdfcGx1Z2luPVx1NjViMFx1NWVmYVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLW1vdmU9XHU3OWZiXHU1MmE4Li4uDQotdW5pcXVlSWRfdGV4dD1cdTU1MmZcdTRlMDBcdTY4MDdcdThiYzZcdWZmMWENCi12YXJpYWJpbGl0eVR5cGVfdGV4dD1cdTUzZWZcdTUzZDhcdTYwMjdcdTdjN2JcdTU3OGJcdWZmMWENCi12ZXJzaW9uX3RleHQ9XHU3MjQ4XHU2NzJjXHVmZjFhDQotDQotIyBCdXR0b24gTGFiZWxzDQotYWRkQnV0dG9uX3RleHQ9XHU2ZGZiXHU1MmEwLi4uDQotYXR0YWNoQnV0dG9uX3RleHQ9XHU5NjQ0XHU1MmEwLi4uDQotYnJvd3NlQnV0dG9uX3RleHQ9XHU2ZDRmXHU4OWM4Li4uDQotY2hhbmdlVHlwZUJ1dHRvbl90ZXh0PVx1NjZmNFx1NjUzOVx1N2M3Ylx1NTc4Yi4uLg0KLWNsZWFyQnV0dG9uX3RleHQ9XHU2ZTA1XHU5NjY0DQotZGVsZXRlQnV0dG9uX3RleHQ9XHU1MjIwXHU5NjY0DQotZGV0YWNoQnV0dG9uX3RleHQ9XHU2MmM2XHU3OWJiDQotZGlhZ3JhbV9zYXZlRXJyb3I9XHU0ZmRkXHU1YjU4XHU1NmZlXHU2NWY2XHU1MWZhXHU5NTE5DQotZG93bkJ1dHRvbl90ZXh0PVx1NTQxMVx1NGUwYg0KLWRpcmVjdG9yeV90ZXh0PVx1NzZlZVx1NWY1NVx1ZmYxYQ0KLW9yZGVyQnV0dG9uX3RleHQ9XHU2MzkyXHU1ZThmDQotZWRpdEJ1dHRvbl90ZXh0PVx1N2YxNlx1OGY5MS4uLg0KLXJlbW92ZUJ1dHRvbl90ZXh0PVx1OTY2NFx1NTNiYg0KLXJlbmFtZUFjdGlvbl90ZXh0PVx1OTFjZFx1NTQ3ZFx1NTQwZC4uLg0KLXJlbW92ZV90ZXh0PVx1OTY2NFx1NTNiYg0KLXJlbmFtZV90ZXh0PVx1OTFjZFx1NTQ3ZFx1NTQwZA0KLVNhdmVBc190ZXh0PVx1NTNlNlx1NWI1OFx1NGUzYQ0KLXNlbGVjdEJ1dHRvbl90ZXh0PVx1OTAwOVx1NjJlOS4uLg0KLWRlc2VsZWN0QnV0dG9uX3RleHQ9XHU1M2Q2XHU2ZDg4XHU5MDA5XHU2MmU5DQotdXBCdXR0b25fdGV4dD1cdTU0MTFcdTRlMGENCi1tYWtlRGVmYXVsdEJ1dHRvbl90ZXh0PVx1OGJiZVx1NGUzYVx1N2YzYVx1NzcwMVx1NTAzYw0KLXZpZXdIaXN0b3J5QnV0dG9uX3RleHQ9XHU2N2U1XHU3NzBiXHU1Mzg2XHU1M2YyXHU4YmIwXHU1ZjU1Li4uDQotDQotIyBSb2xlIEVkaXRvciBUYXNrcyBQYWdlDQotcm9sZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1cdTRlZmJcdTUyYTENCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTZiNjRcdTg5ZDJcdTgyNzJcdTY2MmZcdTRlZTVcdTRlMGJcdTRlZmJcdTUyYTFcdTc2ODRcdTYyNjdcdTg4NGNcdTgwMDVcdTMwMDINCi1yb2xlVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NGVmYlx1NTJhMQ0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTRlM2JcdTg5ODFcdTYyNjdcdTg4NGNcdTgwMDVcdWZmMWENCi1yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWwyPVx1NTE3Nlx1NGVkNlx1NjI2N1x1ODg0Y1x1ODAwNVx1ZmYxYQ0KLXJvbGVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NGVmYlx1NTJhMVx1MzAwMg0KLQ0KLSMgUm9sZSBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHVmZjFhDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NjMwN1x1NWI5YVx1NmI2NFx1ODlkMlx1ODI3Mlx1OGQxZlx1OGQyM1x1NzY4NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1MzAwMg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1ZmYxYQ0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9XHU4ZDFmXHU4ZDIzXHVmZjFhDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHU2YjY0XHU4OWQyXHU4MjcyXHU2MjY3XHU4ODRjXHU3Njg0XHU0ZWZiXHU1MmExXHU2MjQwXHU4ZjkzXHU1MWZhXHU3Njg0XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHVmZjFhDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1MzAwMg0KLQ0KLSMgUm9sZSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmDQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU0ZWU1XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHU3Njg0XHU1ZjYyXHU1ZjBmXHU2M2QwXHU0ZjliXHU1MjMwXHU1MTc2XHU0ZWQ2XHU0ZmUxXHU2MDZmXHU3Njg0XHU5NGZlXHU2M2E1XHUzMDAyDQotcm9sZUd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1MjhcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdWZmMWENCi1yb2xlR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHVmZjFhDQotcm9sZUd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTAwOVx1NjJlOSB7MH0gXHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotIyBSb2xlIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9XHU3YzdiXHU1MjJiXHVmZjFhDQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTg5ZDJcdTgyNzJcdTYyNDBcdTVjNWVcdTc2ODRcdTdjN2JcdTUyMmJcdTMwMDINCi1yb2xlQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU4OWQyXHU4MjcyXHU5NmM2XHVmZjFhDQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1cdTViOWFcdTUyMzZcdTdjN2JcdTUyMmJcdWZmMWENCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTg5ZDJcdTgyNzJcdTk2YzZcdWZmMWENCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHU1YjlhXHU1MjM2XHU3YzdiXHU1MjJiXHVmZjFhDQotDQotIyBUYXNrIEVkaXRvciBSb2xlcyBQYWdlDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZT1cdTg5ZDJcdTgyNzINCi10YXNrUm9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTYzMDdcdTViOWFcdTYyNjdcdTg4NGNcdTZiNjRcdTRlZmJcdTUyYTFcdTc2ODRcdTg5ZDJcdTgyNzJcdTMwMDINCi10YXNrUm9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1ODlkMlx1ODI3Mlx1ZmYxYQ0KLXRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTRlM2JcdTg5ODFcdTYyNjdcdTg4NGNcdTgwMDVcdWZmMWENCi10YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1NTE3Nlx1NGVkNlx1NjI2N1x1ODg0Y1x1ODAwNVx1ZmYxYQ0KLXRhc2tSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1ODlkMlx1ODI3Mlx1MzAwMg0KLXRhc2tSb2xlc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9tb2RpZnlfbWVzc2FnZT1JVVBBMDAwNDVXOiBcdTg5ODFcdTVjMDZcdTRlM2JcdTg5ODFcdTYyNjdcdTg4NGNcdTgwMDVcdTY2ZjRcdTY1MzlcdTRlM2FcdTIwMWN7MH1cdTIwMWRcdTU0MTdcdWZmMWYNCi10YXNrUm9sZXNQYWdlX2NvbmZpcm1fdGl0bGU9XHU3ODZlXHU4YmE0XHU0ZTNiXHU4OTgxXHU4OWQyXHU4MjcyXHU2NmY0XHU2NTM5DQotDQotIyBUYXNrIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzENCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU2MzA3XHU1YjlhXHU2YjY0XHU0ZWZiXHU1MmExXHU3Njg0XHU4ZjkzXHU1MTY1XHU1NDhjXHU4ZjkzXHU1MWZhXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHUzMDAyDQotdGFza1dvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTVmYzVcdTk3MDBcdThmOTNcdTUxNjVcdWZmMWENCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTUzZWZcdTkwMDlcdThmOTNcdTUxNjVcdWZmMWENCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMz1cdThmOTNcdTUxZmFcdWZmMWENCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTAwOVx1NjJlOSB7MH0gXHU0ZTJhXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHUzMDAyDQotDQotIyBUYXNrIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1cdTYzMDdcdTViZmNcdTRmZTFcdTYwNmYNCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTRlZTVcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTc2ODRcdTVmNjJcdTVmMGZcdTYzZDBcdTRmOWJcdTUyMzBcdTUxNzZcdTRlZDZcdTRmZTFcdTYwNmZcdTc2ODRcdTk0ZmVcdTYzYTVcdTMwMDINCi10YXNrR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1ZmYxYQ0KLXRhc2tHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdWZmMWENCi10YXNrR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi0jIFRhc2sgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1cdTdjN2JcdTUyMmINCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NmI2NFx1NGVmYlx1NTJhMVx1NjI0MFx1NWM1ZVx1NzY4NFx1N2M3Ylx1NTIyYlx1MzAwMg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTg5YzRcdTdhMGINCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPVx1NWI5YVx1NTIzNlx1N2M3Ylx1NTIyYg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPVx1ODljNFx1N2EwYlx1ZmYxYQ0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTViOWFcdTUyMzZcdTdjN2JcdTUyMmJcdWZmMWENCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgVGFza3MgUGFnZQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25OYW1lPVx1NGVmYlx1NTJhMQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTZiNjRcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTY2MmZcdTRlZTVcdTRlMGJcdTRlZmJcdTUyYTFcdTc2ODRcdThmOTNcdTUxNjVcdTYyMTZcdThmOTNcdTUxZmFcdTMwMDINCi1Xb3JrUHJvZHVjdF9UYXNrc19BdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1MjhcdTRlZmJcdTUyYTENCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsPVx1NWZjNVx1OTcwMFx1OGY5M1x1NTE2NVx1ZmYxYQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwyPVx1NTNlZlx1OTAwOVx1OGY5M1x1NTE2NVx1ZmYxYQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwzPVx1OGY5M1x1NTFmYVx1ZmYxYQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTRlZmJcdTUyYTFcdTMwMDINCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgUm9sZXMgUGFnZQ0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVx1ODlkMlx1ODI3Mg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTRlZTVcdTRlMGJcdTg5ZDJcdTgyNzJcdThkMWZcdThkMjNcdTZiNjRcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTYyMTZcdTRmZWVcdTY1MzlcdTZiNjRcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTMwMDINCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1MjhcdTg5ZDJcdTgyNzINCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVx1OGQxZlx1OGQyM1x1ODlkMlx1ODI3Mlx1ZmYxYQ0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1NGZlZVx1NjUzOVx1ODlkMlx1ODI3Mlx1ZmYxYQ0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTg5ZDJcdTgyNzJcdTMwMDINCi0NCi0jIyBXb3JrIFByb2R1Y3QgRWRpdG9yIERlbGl2ZXJhYmxlIFBhcnRzIFBhZ2UNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25OYW1lPVx1NTNlZlx1NGVhNFx1NGVkOFx1OTBlOFx1NGVmNg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NjMwN1x1NWI5YVx1Njc4NFx1NjIxMFx1NmI2NFx1NTNlZlx1NGVhNFx1NGVkOFx1NGVmNlx1NzY4NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1MzAwMg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU0ZjVjXHU0ZTNhXHU1M2VmXHU0ZWE0XHU0ZWQ4XHU5MGU4XHU0ZWY2XHU3Njg0XHU1M2VmXHU3NTI4XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHVmZjFhDQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWxlY3RlZExhYmVsPVx1NGY1Y1x1NGUzYVx1NTNlZlx1NGVhNFx1NGVkOFx1OTBlOFx1NGVmNlx1NzY4NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1ZmYxYQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1MzAwMg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBHdWlkYW5jZSBQYWdlDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NGVlNVx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1NzY4NFx1NWY2Mlx1NWYwZlx1NjNkMFx1NGY5Ylx1NTIzMFx1NTE3Nlx1NGVkNlx1NGZlMVx1NjA2Zlx1NzY4NFx1OTRmZVx1NjNhNVx1MzAwMg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1ZmYxYQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHVmZjFhDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPVx1N2M3Ylx1NTIyYg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NmI2NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NjI0MFx1NWM1ZVx1NzY4NFx1N2M3Ylx1NTIyYlx1MzAwMg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1N2RmDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiXHVmZjFhDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDM9XHU1YjlhXHU1MjM2XHU3YzdiXHU1MjJiXHVmZjFhDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPVx1NTdkZlx1ZmYxYQ0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiXHVmZjFhDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMz1cdTViOWFcdTUyMzZcdTdjN2JcdTUyMmJcdWZmMWENCi0NCi0jIFByYWN0aWNlIEVkaXRvciBSZWZlcmVuY2VzIFBhZ2UNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25OYW1lPVx1NTE4NVx1NWJiOVx1NTE0M1x1N2QyMA0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NjMwN1x1NWI5YVx1NmI2NFx1NWI5ZVx1OGRmNVx1NWYxNVx1NzUyOFx1NzY4NFx1NTE4NVx1NWJiOVx1NTE0M1x1N2QyMFx1MzAwMg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU1MTg1XHU1YmI5XHU1MTQzXHU3ZDIwXHVmZjFhDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsPVx1NTE4NVx1NWJiOVx1NTE0M1x1N2QyMFx1ZmYxYQ0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NTE4NVx1NWJiOVx1NTE0M1x1N2QyMFx1MzAwMg0KLQ0KLSMgQ2F0ZWdvcnkgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbk5hbWU9XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNWVcdTRlOGVcdTZiNjR7MH1cdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHVmZjFhDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHVmZjFhDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi0jIERpc2NpcGxpbmUgR3JvdXBpbmcgRWRpdG9yIERpc2NpcGxpbmVzIFBhZ2UNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbk5hbWU9XHU4OWM0XHU3YTBiDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNWVcdTRlOGVcdTZiNjRcdTg5YzRcdTdhMGJcdTUyMDZcdTdlYzRcdTc2ODRcdTg5YzRcdTdhMGJcdTMwMDINCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU4OWM0XHU3YTBiXHVmZjFhDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU4OWM0XHU3YTBiXHVmZjFhDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTg5YzRcdTdhMGJcdTMwMDINCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX1VzZURlZmF1bHREaXJlY3RvcnlCdXR0b25MYWJlbD1cdTRmN2ZcdTc1MjhcdTdmM2FcdTc3MDFcdTc2ZWVcdTVmNTUNCi0NCi0jIERpc2NpcGxpbmUgRWRpdG9yIFRhc2tzIFBhZ2UNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25OYW1lPVx1NGVmYlx1NTJhMQ0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM1ZVx1NGU4ZVx1NmI2NFx1ODljNFx1N2EwYlx1NzY4NFx1NGVmYlx1NTJhMVx1MzAwMg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU0ZWZiXHU1MmExXHVmZjFhDQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsPVx1NGVmYlx1NTJhMVx1ZmYxYQ0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NGVmYlx1NTJhMVx1MzAwMg0KLQ0KLSMgRGlzY2lwbGluZSBFZGl0b3IgUmVmZXJlbmNlIFdvcmtmbG93IFBhZ2UNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25OYW1lPVx1NWYxNVx1NzUyOFx1NWRlNVx1NGY1Y1x1NmQ0MQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM1ZVx1NGU4ZVx1NmI2NFx1ODljNFx1N2EwYlx1NzY4NFx1NWYxNVx1NzUyOFx1NWRlNVx1NGY1Y1x1NmQ0MVx1MzAwMg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU1ZjE1XHU3NTI4XHU1ZGU1XHU0ZjVjXHU2ZDQxXHVmZjFhDQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsPVx1NWYxNVx1NzUyOFx1NWRlNVx1NGY1Y1x1NmQ0MVx1ZmYxYQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NWYxNVx1NzUyOFx1NWRlNVx1NGY1Y1x1NmQ0MVx1MzAwMg0KLQ0KLSMgRG9tYWluIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM1ZVx1NGU4ZVx1NmI2NFx1NTdkZlx1NzY4NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1MzAwMg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHVmZjFhDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1ZmYxYQ0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1MzAwMg0KLQ0KLSMgV29yayBQcm9kdWN0IEtpbmQgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzVlXHU0ZThlXHU2YjY0XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiXHU3Njg0XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHUzMDAyDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1MjhcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdWZmMWENCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHVmZjFhDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTAwOVx1NjJlOSB7MH0gXHU0ZTJhXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHUzMDAyDQotDQotIyBSb2xlIFNldCBHcm91cGluZyBFZGl0b3IgUm9sZSBTZXRzIFBhZ2UNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbk5hbWU9XHU4OWQyXHU4MjcyXHU5NmM2DQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNWVcdTRlOGVcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTUyMDZcdTdlYzRcdTc2ODRcdTg5ZDJcdTgyNzJcdTk2YzZcdTMwMDINCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU4OWQyXHU4MjcyXHU5NmM2XHVmZjFhDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw9XHU4OWQyXHU4MjcyXHU5NmM2XHVmZjFhDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTg5ZDJcdTgyNzJcdTk2YzZcdTMwMDINCi0NCi0jIFJvbGUgU2V0IEVkaXRvciBSb2xlcyBQYWdlDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1cdTg5ZDJcdTgyNzINCi1yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNWVcdTRlOGVcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTc2ODRcdTg5ZDJcdTgyNzJcdTMwMDINCi1yb2xlU2V0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1ODlkMlx1ODI3Mlx1ZmYxYQ0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTg5ZDJcdTgyNzJcdWZmMWENCi1yb2xlU2V0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTg5ZDJcdTgyNzJcdTMwMDINCi0NCi0jIFRvb2wgRWRpdG9yIFRvb2wgTWVudG9ycyBQYWdlDQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uTmFtZT1cdTVkZTVcdTUxNzdcdTU0MTFcdTViZmMNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNWVcdTRlOGVcdTZiNjRcdTVkZTVcdTUxNzdcdTc2ODRcdTVkZTVcdTUxNzdcdTU0MTFcdTViZmNcdTMwMDINCi10b29sVG9vbE1lbnRvcnNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NWRlNVx1NTE3N1x1NTQxMVx1NWJmY1x1ZmYxYQ0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTVkZTVcdTUxNzdcdTU0MTFcdTViZmMNCi10b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTVkZTVcdTUxNzdcdTU0MTFcdTViZmNcdTMwMDINCi0jIEN1c3RvbSBDYXRlZ29yeSBFZGl0b3IgQXNzaWduIFBhZ2UNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbk5hbWU9XHU1MTg1XHU1YmI5XHU1MTQzXHU3ZDIwDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTY3ODRcdTYyMTBcdTZiNjRcdTViOWFcdTUyMzZcdTdjN2JcdTUyMmJcdTc2ODRcdTUxODVcdTViYjlcdTUxNDNcdTdkMjBcdTMwMDINCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU1MTg1XHU1YmI5XHU1MTQzXHU3ZDIwXHVmZjFhDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlbGVjdGVkTGFiZWw9XHU1MTg1XHU1YmI5XHU1MTQzXHU3ZDIwXHVmZjFhDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTUxODVcdTViYjlcdTUxNDNcdTdkMjBcdTMwMDINCi0jIE5ldyBNZXRob2QgUGx1Zy1pbiBXaXphcmQNCi1uZXdQbHVnaW5XaXphcmRfdGl0bGU9XHU2NWIwXHU1ZWZhXHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2DQotbmV3UGx1Z2luV2l6YXJkUGFnZV90aXRsZT1cdTUyMWJcdTVlZmFcdTY1YjBcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RleHQ9XHU2MzA3XHU1YjlhXHU1NDBkXHU3OWYwXHU1ZTc2XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2NWIwXHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotbmV3UGx1Z2luRXJyb3JfbXNnPUlVUEEwMDIxRTogXHU2NzJhXHU4MGZkXHU1MjFiXHU1ZWZhXHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHUzMDAyDQotbmV3UGx1Z2luRXJyb3JfcmVhc29uPVx1NTE4NVx1OTBlOFx1OTUxOVx1OGJlZlx1MzAwMlxuXA0KLVxuXA0KLVx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLSMgR2VuZXJpYyBkaWFsb2cgdGl0bGVzDQotY3JlYXRlRGlhbG9nX3RpdGxlPVx1NTIxYlx1NWVmYVx1NTE0M1x1N2QyMA0KLWRlbGV0ZURpYWxvZ190aXRsZT1cdTUyMjBcdTk2NjRcdTUxNDNcdTdkMjANCi1lZGl0RGlhbG9nX3RpdGxlPVx1N2YxNlx1OGY5MVx1NTE0M1x1N2QyMA0KLWVycm9yRGlhbG9nX3RpdGxlPVx1OTUxOVx1OGJlZg0KLW1vdmVEaWFsb2dfdGl0bGU9XHU3OWZiXHU1MmE4XHU1MTQzXHU3ZDIwDQotcmVuYW1lRGlhbG9nX3RpdGxlPVx1OTFjZFx1NTQ3ZFx1NTQwZFx1NTE0M1x1N2QyMA0KLXdhcm5pbmdEaWFsb2dfdGl0bGU9XHU4YjY2XHU1NDRhDQotDQotIyBBZGQgQ29uZmlndXJhdGlvbiB0byBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWFkZENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPVx1NTQxMVx1NmQ0MVx1N2EwYlx1NmRmYlx1NTJhMFx1OTE0ZFx1N2Y2ZQ0KLQ0KLSMgU2V0IERlZmF1bHQgQ29uZmlndXJhdGlvbiBFcnJvciBEaWFsb2cNCi1zZXREZWZhdWx0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9XHU4YmJlXHU3ZjZlXHU2ZDQxXHU3YTBiXHU3Njg0XHU3ZjNhXHU3NzAxXHU5MTRkXHU3ZjZlDQotDQotIyBFZGl0IFByb2Nlc3MgRXJyb3IgRGlhbG9nDQotZWRpdFByb2Nlc3NFbGVtZW50RXJyb3JEaWFsb2dfdGl0bGU9XHU3ZjE2XHU4ZjkxXHU2ZDQxXHU3YTBiXHU1MTQzXHU3ZDIwDQotDQotIyBPcGVuIExpYnJhcnkgRGlhbG9nDQotb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU9XHU2MjUzXHU1ZjAwXHU2NWI5XHU2Y2Q1XHU1ZTkzDQotb3BlbkxpYnJhcnlEaWFsb2dfdGV4dD1cdTY3MmFcdTZiNjNcdTc4NmVcdTRmZGRcdTViNThcdTVmNTNcdTUyNGRcdTY1YjlcdTZjZDVcdTVlOTNcdTMwMDJcdTY2MmZcdTU0MjZcdTg5ODFcdTVmZmRcdTc1NjVcdTk1MTlcdThiZWZcdTVlNzZcdTdlZTdcdTdlZWRcdTYyNTNcdTVmMDBcdTUzZTZcdTRlMDBcdTRlMmFcdTVlOTNcdWZmMWYNCi0NCi0jIFNhdmUgTGlicmFyeSBEaWFsb2cNCi1zYXZlTGlicmFyeURpYWxvZ190aXRsZT1cdTRmZGRcdTViNThcdTY1YjlcdTZjZDVcdTVlOTMNCi1zYXZlTGlicmFyeURpYWxvZ190ZXh0PVx1NWY1M1x1NTI0ZFx1NjViOVx1NmNkNVx1NWU5M1x1NWRmMlx1NGZlZVx1NjUzOVx1MzAwMlx1NjYyZlx1NTQyNlx1ODk4MVx1NGZkZFx1NWI1OFx1NjZmNFx1NjUzOVx1ZmYxZg0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1NTM0N1x1N2VhN1x1NjViOVx1NmNkNVx1NWU5Mw0KLQ0KLSMgRGVsZXRlIEVsZW1lbnQgUmVmZXJlbmNlIERpYWxvZw0KLWRlbGV0ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ9XHU1MTQzXHU3ZDIwXHUyMDFjezB9XHUyMDFkXHU1ZGYyXHU1MjIwXHU5NjY0XHUzMDAyXHU2NjJmXHU1NDI2XHU4OTgxXHU0ZWNlXHUyMDFjezF9XHUyMDFkXHU0ZTJkXHU5NjY0XHU1M2JiXHU1YjgzXHVmZjFmDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLW5vT3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDBFOiBcdTY1ZTBcdTYyNTNcdTVmMDBcdTc2ODRcdTY1YjlcdTZjZDVcdTVlOTNcdTMwMDJcblwNCi1cblwNCi1cdTU3MjhcdTZkZmJcdTUyYTBcdTY1YjBcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTRlNGJcdTUyNGRcdWZmMGNcdTVmYzVcdTk4N2JcdTYyNTNcdTVmMDBcdTY1YjlcdTZjZDVcdTVlOTNcdTMwMDJcblwNCi1cblwNCi1cdThiZjdcdTUyMWJcdTVlZmFcdTY1YjBcdTY1YjlcdTZjZDVcdTVlOTNcdWZmMGNcdTYyMTZcdTYyNTNcdTVmMDBcdTczYjBcdTY3MDlcdTY1YjlcdTZjZDVcdTVlOTNcdWZmMGNcdTcxMzZcdTU0MGVcdTkxY2RcdThiZDVcdTMwMDINCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEEwMDAxRTogXHU3ZjNhXHU1YzExezB9XHU1NDBkXHU3OWYwXHUzMDAyXG5cDQotXG5cDQotXHU2MjQwXHU2NzA5XHU2NWI5XHU2Y2Q1XHU1NDhjXHU2ZDQxXHU3YTBiXHU1MTQzXHU3ZDIwXHU5MGZkXHU1ZmM1XHU5ODdiXHU2NzA5XHU1NDBkXHU3OWYwXHUzMDAyXG5cDQotXG5cDQotXHU4YmY3XHU1MzU1XHU1MWZiXHUyMDFjXHU3ODZlXHU1YjlhXHUyMDFkXHVmZjBjXHU3MTM2XHU1NDBlXHU0ZTNhXHU1MTQzXHU3ZDIwXHU4ZjkzXHU1MTY1XHU2NzA5XHU2NTQ4XHU1NDBkXHU3OWYwXHUzMDAyDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFOiBcdTU0MGRcdTc5ZjBcdTIwMWN7MH1cdTIwMWRcdTVkZjJcdTViNThcdTU3MjhcdTMwMDJcblwNCi1cblwNCi1cdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTVmYzVcdTk4N2JcdTY3MDlcdTU1MmZcdTRlMDBcdTU0MGRcdTc5ZjBcdTMwMDJcblwNCi1cblwNCi1cdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdTc4NmVcdTViOWFcdTIwMWRcdWZmMGNcdTcxMzZcdTU0MGVcdTRlM2FcdTUxNDNcdTdkMjBcdThmOTNcdTUxNjVcdTUzZTZcdTRlMDBcdTRlMmFcdTU0MGRcdTc5ZjBcdTMwMDINCi1jcmVhdGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDNFOiBcdTY1ZTBcdTZjZDVcdTUyMWJcdTVlZmFcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDINCi1kZWxldGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDRXOiBcdTY1ZTBcdTZjZDVcdTUyMjBcdTk2NjRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDINCi1pbnRlcm5hbEVycm9yX21zZz1JVVBBMDAwNUU6IFx1NTNkMVx1NzUxZlx1NTE4NVx1OTBlOFx1OTUxOVx1OGJlZlx1MzAwMlxuXA0KLVxuXA0KLVx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMg0KLWludmFsaWRQcmVzZW50YXRpb25OYW1lRXJyb3JfbXNnPUlVUEEwMDA2RTogXHU2MzA3XHU1YjlhXHU3Njg0XHU2NjNlXHU3OTNhXHU1NDBkXHU3OWYwXHU2NWUwXHU2NTQ4XHUzMDAyXG5cDQotXG5cDQotXHU4YmY3XHU1MzU1XHU1MWZiXHUyMDFjXHU3ODZlXHU1YjlhXHUyMDFkXHVmZjBjXHU3MTM2XHU1NDBlXHU4ZjkzXHU1MTY1XHU1M2U2XHU0ZTAwXHU0ZTJhXHU1NDBkXHU3OWYwXHUzMDAyDQotaW52YWxpZENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwN0U6IFx1OTAwOVx1NjJlOVx1NzY4NFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1MjAxY3swfVx1MjAxZFx1NGUwZFx1NjYyZlx1NmQ0MVx1N2EwYlx1N2YzYVx1NzcwMVx1OTE0ZFx1N2Y2ZVx1NzY4NFx1NWI1MFx1OTZjNlx1MzAwMlxuXA0KLVxuXA0KLVx1NGUzYVx1NGU4Nlx1NGZkZFx1NjMwMVx1NmQ0MVx1N2EwYlx1NzY4NFx1NWI4Y1x1NjU3NFx1NjAyN1x1ZmYwY1x1NWI4M1x1NzY4NFx1N2YzYVx1NzcwMVx1OTE0ZFx1N2Y2ZVx1NWZjNVx1OTg3Ylx1NjYyZlx1NGUwZVx1NmQ0MVx1N2EwYlx1NTE3M1x1ODA1NFx1NzY4NFx1NjI0MFx1NjcwOVx1NTE3Nlx1NGVkNlx1OTE0ZFx1N2Y2ZVx1NzY4NFx1OGQ4NVx1OTZjNlx1MzAwMlxuXA0KLVxuXA0KLVx1OGJmN1x1OTAwOVx1NjJlOVx1NTNlNlx1NGUwMFx1NGUyYVx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1NjIxNlx1NGZlZVx1NjUzOVx1N2YzYVx1NzcwMVx1OTE0ZFx1N2Y2ZVx1NGY3Zlx1NWI4M1x1NTMwNVx1NTQyYlx1NjI0MFx1OTAwOVx1OTE0ZFx1N2Y2ZVx1NzY4NFx1NTE4NVx1NWJiOVx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLXNldERlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDhFOiBcdTkwMDlcdTViOWFcdTc2ODRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTIwMWN7MH1cdTIwMWRcdTRlMGRcdTY2MmZcdTZkNDFcdTdhMGJcdTVmMTVcdTc1MjhcdTc2ODRcdTUxNzZcdTRlZDZcdTkxNGRcdTdmNmVcdTc2ODRcdThkODVcdTk2YzZcdTMwMDJcblwNCi1cblwNCi1cdTRlM2FcdTRlODZcdTRmZGRcdTYzMDFcdTZkNDFcdTdhMGJcdTc2ODRcdTViOGNcdTY1NzRcdTYwMjdcdWZmMGNcdTViODNcdTc2ODRcdTdmM2FcdTc3MDFcdTkxNGRcdTdmNmVcdTVmYzVcdTk4N2JcdTY2MmZcdTRlMGVcdTZkNDFcdTdhMGJcdTUxNzNcdTgwNTRcdTc2ODRcdTYyNDBcdTY3MDlcdTUxNzZcdTRlZDZcdTkxNGRcdTdmNmVcdTc2ODRcdThkODVcdTk2YzZcdTMwMDJcblwNCi1cblwNCi1cdThiZjdcdTkwMDlcdTYyZTlcdTUzZTZcdTRlMDBcdTRlMmFcdTkxNGRcdTdmNmVcdWZmMGNcdTYyMTZcdTRmZWVcdTY1MzlcdTYyNDBcdTkwMDlcdTkxNGRcdTdmNmVcdTc2ODRcdTUxODVcdTViYjlcdWZmMGNcdTcxMzZcdTU0MGVcdTkxY2RcdThiZDVcdTMwMDINCi1vcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwOUU6IFx1NjVlMFx1NmNkNVx1ODhjNVx1NTE2NVx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMlxuXA0KLVxuXA0KLVx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMg0KLXNhdmVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEwRTogXHU2NWUwXHU2Y2Q1XHU0ZmRkXHU1YjU4XHU2NWI5XHU2Y2Q1XHU1ZTkzXHUzMDAyDQotc2F2ZUxpYnJhcnlUb0Vycm9yX21zZz1JVVBBMDAxMEU6IFx1NjVlMFx1NmNkNVx1NWMwNlx1NjViOVx1NmNkNVx1NWU5M1x1NGZkZFx1NWI1OFx1NTIzMFx1MjAxY3swfVx1MjAxZFx1MzAwMg0KLWVsZW1lbnRBbHJlYWR5RGVsZXRlZEVycm9yX21zZz1JVVBBMDAxMUU6IFx1NTE0M1x1N2QyMFx1MjAxY3swfVx1MjAxZFx1NWRmMlx1NTIyMFx1OTY2NFx1MzAwMg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEyRTogXHU2NWUwXHU2Y2Q1XHU1MzQ3XHU3ZWE3XHU2NWI5XHU2Y2Q1XHU1ZTkzXHUzMDAyDQotDQotIyBFcnJvciBSZWFzb25zDQotZXJyb3JfcmVhc29uPUlVUEEwMDE2RTogXHU1M2QxXHU3NTFmXHU5NTE5XHU4YmVmXHUzMDAyXG5cDQotXG5cDQotXHU4YmY3XHU1MzU1XHU1MWZiXHUyMDFjXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUyMDFkXHVmZjBjXHU4M2I3XHU1M2Q2XHU2NmY0XHU1OTFhXHU0ZmUxXHU2MDZmXHUzMDAyDQotaW50ZXJuYWxFcnJvcl9yZWFzb249SVVQQTAwMTdFOiBcdTUzZDFcdTc1MWZcdTUxODVcdTkwZThcdTk1MTlcdThiZWZcdTMwMDJcblwNCi1cblwNCi1cdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTIwMWRcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdTRmZTFcdTYwNmZcdTMwMDINCi11cGdyYWRlTGlicmFyeUVycm9yX3JlYXNvbj1JVVBBMDAxOEU6IFx1ODhjNVx1NTE2NVx1NjViOVx1NmNkNVx1NWU5M1x1NTE0M1x1N2QyMFx1NjVmNlx1NTNkMVx1NzUxZlx1OTUxOVx1OGJlZlx1MzAwMlxuXA0KLVxuXA0KLVx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMg0KLXNhdmVVcGdyYWRlZExpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMTlFOiBcdTRmZGRcdTViNThcdTVkZjJcdTUzNDdcdTdlYTdcdTc2ODRcdTY1YjlcdTZjZDVcdTVlOTNcdTY1ZjZcdTUzZDFcdTc1MWZcdTk1MTlcdThiZWZcdTMwMDJcblwNCi1cblwNCi1cdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTIwMWRcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU2MjUzXHU1ZjAwXHU2NWI5XHU2Y2Q1XHU1ZTkzLi4uDQotc2F2aW5nTGlicmFyeVRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTRmZGRcdTViNThcdTY1YjlcdTZjZDVcdTVlOTMuLi4NCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTM0N1x1N2VhN1x1NjViOVx1NmNkNVx1NWU5My4uLg0KLWxvYWRpbmdMaWJyYXJ5RWxlbWVudHNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU4OGM1XHU1MTY1XHU2NWI5XHU2Y2Q1XHU1ZTkzXHU1MTQzXHU3ZDIwLi4uDQotc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTRlZTVcdTY1YjBcdTY1ODdcdTRlZjZcdTY4M2NcdTVmMGZcdTRmZGRcdTViNThcdTY1YjlcdTZjZDVcdTVlOTNcdTUxNDNcdTdkMjAuLi4NCi1zYXZpbmdUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU0ZmRkXHU1YjU4XHUyMDFjezB9XHUyMDFkLi4uDQotc2F2aW5nRmlsZXNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU0ZmRkXHU1YjU4XHU2NTg3XHU0ZWY2Li4uDQotZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU0ZmVlXHU1OTBkXHU1MTg1XHU1YmI5XHU2M2NmXHU4ZmYwIEdVSUQuLi4NCi1kZWxldGluZ0ludmFsaWRSZWZlcmVuY2VzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTIyMFx1OTY2NFx1NjVlMFx1NjU0OFx1NWYxNVx1NzUyOC4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IFx1NWRmMlx1NzI3OVx1NTIyYlx1OGJiZVx1OGJhMVx1NmI2NFx1OTAwZlx1ODljNlx1NTZmZVx1NGVlNVx1NjUzOVx1NTU4NFx1NmQ0Zlx1ODljOFx1NjViOVx1NmNkNVx1NWU5M1x1NTE0M1x1N2QyMFx1NzY4NCBIVE1MIFx1OGJmNFx1NjYwZVx1NzY4NFx1NzUyOFx1NjIzN1x1NGY1M1x1OWE4Y1x1MzAwMlx1NjVlMFx1NmNkNVx1NTcyOFx1NmI2NFx1NTkwNFx1NmRmYlx1NTJhMFx1NjIxNlx1NjYzZVx1NzkzYVx1N2YxNlx1OGY5MVx1NTY2OFx1MzAwMg0KLQ0KLSMgQ2hhbmdlIEhpc3RvcnkgRGlhbG9nDQotQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZT1cdTY2ZjRcdTY1MzlcdTYzY2ZcdThmZjBcdTUzODZcdTUzZjJcdThiYjBcdTVmNTUNCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsPVx1NjZmNFx1NjUzOVx1NTM4Nlx1NTNmMlx1OGJiMFx1NWY1NVx1ZmYxYQ0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVsZXRlIEFjdGlvbg0KLWNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU9XHU3ODZlXHU4YmE0XHU1MjIwXHU5NjY0DQotY29uZmlybURlbGV0ZURpYWxvZ19tc2c9XHU3ODZlXHU1YjllXHU4OTgxXHU1MjIwXHU5NjY0XHUyMDFjezB9XHUyMDFkXHU1NDE3XHVmZjFmDQotY29uZmlybURlbGV0ZURpYWxvZ19tc2dXaXRoUmVmZXJlbmNlPVx1Nzg2ZVx1NWI5ZVx1ODk4MVx1NTIyMFx1OTY2NFx1MjAxY3swfVx1MjAxZFx1NTQxN1x1ZmYxZlxuXA0KLVxuXA0KLVx1NGVlNVx1NGUwYlx1NTE0M1x1N2QyMFx1NTMwNVx1NTQyYlx1NWJmOVx1ODk4MVx1NTIyMFx1OTY2NFx1NzY4NFx1OTg3OVx1NzY4NFx1NWYxNVx1NzUyOFx1ZmYxYXsxfQ0KLQ0KLSMgTmV3IExpYnJhcnkgRGlhbG9nDQotZXJyb3JEaWFsb2dfbWVzc2FnZT1JVVBBMDAyMkU6IFx1NjVlMFx1NmNkNVx1NTIxYlx1NWVmYVx1NjViOVx1NmNkNVx1NWU5M1x1MjAxY3swfVx1MjAxZFx1MzAwMg0KLWVycm9yRGlhbG9nX2Vycm9yPVx1NjVlMFx1NmNkNVx1NTcyOFx1NGUwMFx1NGUyYVx1NjViOVx1NmNkNVx1NWU5M1x1NGUyZFx1NTIxYlx1NWVmYVx1NTNlNlx1NGUwMFx1NGUyYVx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMg0KLWVycl9ub29wZW5saWJyYXJ5PUlVUEEwMDQwRTogXHU2NWUwXHU2MjUzXHU1ZjAwXHU3Njg0XHU2NWI5XHU2Y2Q1XHU1ZTkzXHUzMDAyXG5cDQotXG5cDQotXHU1NzI4XHU2ZGZiXHU1MmEwXHU2NWIwXHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHU0ZTRiXHU1MjRkXHVmZjBjXHU1ZmM1XHU5ODdiXHU2MjUzXHU1ZjAwXHU2NWI5XHU2Y2Q1XHU1ZTkzXHUzMDAyXG5cDQotXG5cDQotXHU4YmY3XHU1MjFiXHU1ZWZhXHU2NWIwXHU2NWI5XHU2Y2Q1XHU1ZTkzXHVmZjBjXHU2MjE2XHU2MjUzXHU1ZjAwXHU3M2IwXHU2NzA5XHU2NWI5XHU2Y2Q1XHU1ZTkzXHVmZjBjXHU3MTM2XHU1NDBlXHU5MWNkXHU4YmQ1XHUzMDAyDQotZXJyX2xvYWRpbmdsaWJyYXJ5PVx1ODhjNVx1NTE2NVx1NWU5M1x1NjVmNlx1NTFmYVx1OTUxOQ0KLW1zZ19yZWxvYWRMaWJyYXJ5PVx1NjRhNFx1NmQ4OFx1NTkzMVx1OGQyNVx1NzY4NFx1NTIyMFx1OTY2NFx1NjVmNlx1NTFmYVx1OTUxOVx1MzAwMlx1OTcwMFx1ODk4MVx1OTFjZFx1NjViMFx1ODhjNVx1NTE2NVx1NWY1M1x1NTI0ZFx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMg0KLQ0KLSMgUmVsb2FkIExpYnJhcnkgRGlhbG9nDQotcmVsb2FkRGlhbG9nX21lc3NhZ2U9XHU5NzAwXHU4OTgxXHU5MWNkXHU2NWIwXHU4OGM1XHU1MTY1XHU1ZTkzXHVmZjBjXHU2MDYyXHU1OTBkXHU1YjgzXHU3Njg0XHU1MzlmXHU1OWNiXHU3MmI2XHU2MDAxXHUzMDAyDQotcmVsb2FkRGlhbG9nX3RpdGxlPVx1OTFjZFx1NjViMFx1ODhjNVx1NTE2NVx1NWU5Mw0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlPVx1NzlmYlx1NTJhOFx1OTUxOVx1OGJlZg0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U9XHU3OWZiXHU1MmE4XHU2NWY2XHU1MWZhXHU5NTE5DQotDQotIyBQcm9jZXNzIEZvcm0gRWRpdG9yDQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX3RpdGxlPVx1NGZkZFx1NWI1OA0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMT1cdTZiNjRcdTY2ZjRcdTY1MzlcdTVjMDZcdTVmNzFcdTU0Y2RcdTZkNDFcdTdhMGJcdTRlMmRcdTc2ODRcdTYyNDBcdTY3MDlcdTU2ZmVcdTMwMDJcdTY2ZjRcdTY1MzlcdTRlNGJcdTU0MGVcdWZmMGNcdTVjMDZcdTRmZGRcdTViNThcdTdmMTZcdThmOTFcdTU2NjhcdTMwMDJcdTg5ODFcdTdlZTdcdTdlZWRcdTU0MTdcdWZmMWYNCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTI9XHU2NmY0XHU2NTM5XHU0ZTRiXHU1NDBlXHVmZjBjXHU1YzA2XHU0ZmRkXHU1YjU4XHU3ZjE2XHU4ZjkxXHU1NjY4XHUzMDAyXHU4OTgxXHU3ZWU3XHU3ZWVkXHU1NDE3XHVmZjFmDQotDQotIyBDb25maWd1cmF0aW9uIFZpZXcgUGFnZQ0KLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ190aXRsZT1cdTc4NmVcdThiYTRcdTk2NjRcdTUzYmINCi1jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfbWVzc2FnZT1cdTc4NmVcdTViOWVcdTg5ODFcdTk2NjRcdTUzYmJcdTg5YzZcdTU2ZmVcdTIwMWN7MH1cdTIwMWRcdTU0MTdcdWZmMWYNCi1jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfdGl0bGU9XHU4YjY2XHU1NDRhDQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvbj1cdTkxNGRcdTdmNmVcdWZmMWENCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3M9XHU5MTRkXHU3ZjZlXHU4OWM2XHU1NmZlDQotY29uZmlnVmlld1BhZ2Vfdmlld3M9XHU4OWM2XHU1NmZlDQotY29sdW1uc2VsZWN0aW9uX3RleHQ9XHU1MjE3XHU5MDA5XHU2MmU5XHVmZjFhDQotY29uZmlnVmlld1BhZ2VfYWRkVmlld0J1dHRvblRleHQ9XHU2ZGZiXHU1MmEwXHU4OWM2XHU1NmZlLi4uDQotY29uZmlnVmlld1BhZ2VfcmVtb3ZlVmlld0J1dHRvblRleHQ9XHU5NjY0XHU1M2JiXHU4OWM2XHU1NmZlDQotY29uZmlnVmlld1BhZ2VfbWFrZURlZmF1bHRCdXR0b25UZXh0PVx1OGJiZVx1NGUzYVx1N2YzYVx1NzcwMVx1NTAzYw0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlPUlVUEEwMDIzVzogXHU1NDBkXHU3OWYwXHU0ZTNhXHUyMDFjezB9XHUyMDFkXHU3Njg0XHU4OWM2XHU1NmZlXHU1ZGYyXHU1YjU4XHU1NzI4XHUzMDAyDQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uVGl0bGU9XHU1M2QxXHU1ZTAzXHU3Njg0XHU1YmZjXHU4MjJhXHU4OWM2XHU1NmZlDQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uTWVzc2FnZT1cdTYzMDdcdTViOWFcdTUzZDFcdTVlMDNcdTZiNjRcdTkxNGRcdTdmNmVcdTY1ZjZcdTVjMDZcdTUzMDVcdTU0MmJcdTc2ODRcdTg5YzZcdTU2ZmVcdTMwMDJcdTg5ODFcdTUyMWJcdTVlZmFcdTg5YzZcdTU2ZmVcdWZmMGNcdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdTZkZmJcdTUyYTBcdTg5YzZcdTU2ZmVcdTIwMWRcdWZmMGNcdTU3MjhcdTkxNGRcdTdmNmVcdTRlMmRcdTkwMDlcdTYyZTlcdTRlZmJcdTYxMGZcdTY4MDdcdTUxYzZcdTYyMTZcdTViOWFcdTUyMzZcdTdjN2JcdTUyMmJcdTMwMDJcdTkwMDlcdTViOWFcdTc2ODRcdTdjN2JcdTUyMmJcdTVjMDZcdTg4NjhcdTc5M2FcdThiZTVcdTg5YzZcdTU2ZmVcdWZmMGNcdTgwMGNcdThmZDlcdTRlMmFcdTdjN2JcdTUyMmJcdTc2ODRcdTViNTBcdTdjN2JcdTUyMmJcdTU0OGNcdTUxODVcdTViYjlcdTUxNDNcdTdkMjBcdTVjMDZcdTg4NjhcdTc5M2FcdThiZTVcdTg5YzZcdTU2ZmVcdTc2ODRcdTY4MTFcdTUxNDNcdTdkMjBcdTMwMDINCi0NCi0jIERlc2NyaXB0aW9uIFRhYg0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX3RpdGxlPVx1OGY2Y1x1NjM2Mlx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxPUlVUEEwMDQwVzogXHU4YmY3XHU1MTQ4XHU0ZmRkXHU1YjU4XHU3ZjE2XHU4ZjkxXHU1NjY4XHUzMDAyDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTI9XHU2YjY0XHU3YzdiXHU1NzhiXHU2Y2ExXHU2NzA5XHU1MTdjXHU1YmI5XHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZT1cdThmNmNcdTYzNjJcdTZkM2JcdTUyYTgNCi0jIEFzc29jaWF0aW9uIEZvcm0gUGFnZQ0KLUFzc29jaWF0aW9uRm9ybVBhZ2VfQnJpZWZEZXNjcmlwdGlvbkxhYmVsPVx1OTAwOVx1NWI5YVx1NTE0M1x1N2QyMFx1NzY4NFx1N2I4MFx1ODk4MVx1NjNjZlx1OGZmMFx1ZmYxYQ0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVzY3JpcHRpb24NCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfdGl0bGU9XHU4ZjkzXHU1MTY1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3OWYwDQotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX21lc3NhZ2U9XHU1NDBkXHU3OWYwXHU1YjU3XHU2YmI1XHU0ZTBkXHU4MGZkXHU0ZTNhXHU3YTdhXHUzMDAyDQotDQotIyBNZXRob2QgUGx1Zy1pbiBEZXNjcmlwdGlvbg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUmVtb3ZlUmVmQ29uZmlybV9tZXNzYWdlPVx1NGUwZFx1OTAwOVx1NjJlOVx1NGUwZVx1NjNkMlx1NGVmNlx1MjAxY3swfVx1MjAxZFx1NTE3M1x1ODA1NFx1NzY4NFx1NWYxNVx1NzUyOFx1NjNkMlx1NGVmNlx1NWMwNlx1NGVhN1x1NzUxZlx1NGYxYVx1ODhhYlx1NTIyMFx1OTY2NFx1NzY4NFx1NjVlMFx1NjU0OFx1NTE3M1x1N2NmYlx1MzAwMlxuXA0KLVxuXA0KLVx1NmI2NFx1NjRjZFx1NGY1Y1x1NjVlMFx1NmNkNVx1NjRhNFx1NmQ4OFx1MzAwMlx1NjYyZlx1NTQyNlx1ODk4MVx1N2VlN1x1N2VlZFx1NjI2N1x1ODg0Y1x1NmI2NFx1NjZmNFx1NjUzOVx1ZmYxZg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lPVx1NjBhOFx1ODk4MVx1NWMwNlx1NmI2NFx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNlx1NzY4NFx1NTQwZFx1NzlmMFx1NGVjZVx1MjAxY3swfVx1MjAxZFx1NjZmNFx1NjUzOVx1NGUzYVx1NjViMFx1NTQwZFx1NzlmMFx1MjAxY3sxfVx1MjAxZFx1MzAwMlx1OGZkOVx1NGUyYVx1NjRjZFx1NGY1Y1x1NWMwNlx1NGZkZFx1NWI1OFx1NmI2NFx1N2YxNlx1OGY5MVx1NTY2OFx1NWU3Nlx1NWMwNlx1NjNkMlx1NGVmNlx1NjU4N1x1NGVmNlx1NTkzOVx1OTFjZFx1NTQ3ZFx1NTQwZFx1NGUzYVx1NjViMFx1NTQwZFx1NzlmMFx1MzAwMlx1ODk4MVx1N2VlN1x1N2VlZFx1NTQxN1x1ZmYxZg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lX3RpdGxlPVx1OTFjZFx1NTQ3ZFx1NTQwZFx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jYW5ub3RSZW5hbWVQbHVnaW5Gb2xkZXI9XHU2NWUwXHU2Y2Q1XHU1YzA2XHU2M2QyXHU0ZWY2XHU2NTg3XHU0ZWY2XHU1OTM5XHU5MWNkXHU1NDdkXHU1NDBkXHU0ZTNhXHU2NWIwXHU1NDBkXHU3OWYwDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5MYWJlbD1cdTk1MDFcdTViOWFcdTYzZDJcdTRlZjYNCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbl9tZXNzYWdlPVx1OTUwMVx1NWI5YVx1NjNkMlx1NGVmNlx1NjZmNFx1NjUzOVx1NWMwNlx1NGZkZFx1NWI1OFx1ZmYwY1x1NWU3Nlx1NWMwNlx1NTE3M1x1OTVlZFx1NWJmOVx1NWM1ZVx1NGU4ZVx1NjNkMlx1NGVmNlx1MjAxY3swfVx1MjAxZFx1NzY4NFx1NTE0M1x1N2QyMFx1NjI1M1x1NWYwMFx1NzY4NFx1N2YxNlx1OGY5MVx1NTY2OFx1MzAwMlx1NjYyZlx1NTQyNlx1ODk4MVx1N2VlN1x1N2VlZFx1NjI2N1x1ODg0Y1x1NmI2NFx1NjZmNFx1NjUzOVx1ZmYxZg0KLQ0KLSMgUHJvY2VzcyBEZXNjcmlwdGlvbg0KLXByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX3RpdGxlPVx1OTFjZFx1NTQ3ZFx1NTQwZA0KLXByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX21lc3NhZ2U9XHU2MGE4XHU4OTgxXHU2NmY0XHU2NTM5XHU2YjY0XHU2ZDQxXHU3YTBiXHU3Njg0XHU1NDBkXHU3OWYwXHUzMDAyXHU4ZmQ5XHU1YzA2XHU0ZmRkXHU1YjU4XHU2YjY0XHU3ZjE2XHU4ZjkxXHU1NjY4XHU1ZTc2XHU1YzA2XHU2ZDQxXHU3YTBiXHU2NTg3XHU0ZWY2XHU1OTM5XHU5MWNkXHU1NDdkXHU1NDBkXHU0ZTNhXHU2NWIwXHU1NDBkXHU3OWYwXHUzMDAyXHU4OTgxXHU3ZWU3XHU3ZWVkXHU1NDE3XHVmZjFmDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbj1cdTYzY2ZcdThmZjBcdWZmMWENCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25UaXRsZT1cdTkxNGRcdTdmNmUNCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlPVx1NjMwN1x1NWI5YVx1NjI0MFx1NjcwOVx1NWJmOVx1NGU4ZVx1NmI2NFx1NmQ0MVx1N2EwYlx1NjcwOVx1NjU0OFx1NzY4NFx1OTE0ZFx1N2Y2ZVx1MzAwMlx1OGJmN1x1OTAwOVx1NjJlOVx1NGUwMFx1NGUyYVx1OTE0ZFx1N2Y2ZVx1NGY1Y1x1NGUzYVx1N2YzYVx1NzcwMVx1OTE0ZFx1N2Y2ZVx1ZmYxYlx1OGJlNVx1OTE0ZFx1N2Y2ZVx1NWZjNVx1OTg3Ylx1NjYyZlx1NjI0MFx1NjcwOVx1NTE3Nlx1NGVkNlx1OTE0ZFx1N2Y2ZVx1NzY4NFx1OGQ4NVx1OTZjNlx1MzAwMg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9ucz1cdTkxNGRcdTdmNmVcdWZmMWENCi1wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdD1cdWZmMDhcdTdmM2FcdTc3MDFcdTUwM2NcdWZmMDkNCi1Qcm9jZXNzRGVzY3JpcHRpb25fc2VsZWN0Q29uZmlndXJhdGlvbj1cdTkwMDlcdTYyZTlcdTg5ODFcdTZkZmJcdTUyYTBcdTc2ODRcdTkxNGRcdTdmNmUNCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0MD1cdThmZDlcdTVjMDZcdTRmZGRcdTViNThcdTVmNTNcdTUyNGRcdTdmMTZcdThmOTFcdTU2NjhcdTVlNzZcdTRlMTRcdTY2ZjRcdTY1MzlcdTY2MmZcdTZjMzhcdTRlNDVcdTYwMjdcdTc2ODRcdTMwMDJcdTc4NmVcdTViOWVcdTg5ODFcdTUyMjBcdTk2NjRcdTIwMWN7MH1cdTIwMWRcdTU0MTdcdWZmMWYNCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX3NlbGVjdERlc2NyaXB0b3JzVG9EZWxldGU9XHU1MjIwXHU5NjY0XHU5MDA5XHU1YjlhXHU1MTQzXHU3ZDIwXHU1NDBlXHVmZjBjXHU2NWUwXHU0ZWZiXHU0ZjU1XHU1NzMwXHU2NWI5XHU0ZjdmXHU3NTI4XHU0ZWU1XHU0ZTBiXHU2M2NmXHU4ZmYwXHU3YjI2XHUzMDAyXG5cDQotXHU4YmY3XHU5MDA5XHU2MmU5XHU4OTgxXHU1MjIwXHU5NjY0XHU3Njg0XHU2M2NmXHU4ZmYwXHU3YjI2XHUzMDAyDQotDQotIyBWaWV3IEhlbHBlcg0KLXZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ190aXRsZT1cdTVlOTNcdTUwNjVcdTUxNjhcdTY4YzBcdTY3ZTUNCi12aWV3SGVscGVyX3BlcmZvcm1IZWFsdGhDaGVjaz1cdTZiNjNcdTU3MjhcdTViZjlcdTVlOTNcdTYyNjdcdTg4NGNcdTUwNjVcdTUxNjhcdTY4YzBcdTY3ZTUuLi4NCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZT1cdTVkZjJcdTYyMTBcdTUyOWZcdTViOGNcdTYyMTBcdTViZjlcdTYyNTNcdTVmMDBcdTVlOTNcdTc2ODRcdTUwNjVcdTUxNjhcdTY4YzBcdTY3ZTVcdTMwMDJcdThiZjdcdTUzYzJcdTk2MDVcdTY1ZTVcdTVmZDdcdTY1ODdcdTRlZjZcdTRlMmRcdTc2ODRcdTYyYTVcdTU0NGFcdTMwMDINCi0NCi0jIEF0dGFjaCBUZW1wbGF0ZSBGaWxlIERpYWxvZw0KLWF0dGFjaFRlbXBsYXRlRmlsZURpYWxvZ190aXRsZT1cdTk2NDRcdTUyYTBcdTZhMjFcdTY3N2ZcdTY1ODdcdTRlZjYNCi0NCi0jIENyZWF0ZSBFbGVtZW50IEVycm9yIERpYWxvZw0KLWNyZWF0ZUVsZW1lbnREaWFsb2dfdGl0bGU9XHU2NWIwXHU1ZWZhIHswfQ0KLWNyZWF0ZU5ld0VsZW1lbnRFcnJvcl9tc2c9XHU2NWIwXHU1ZWZhIHswfSBcdTY1ZjZcdTUxZmFcdTk1MTlcdTMwMDINCi0NCi1kbGdUaXRsZV9yZWxvYWRMaWJyYXJ5PVx1OTFjZFx1NjViMFx1ODhjNVx1NTE2NVx1NWU5Mw0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9yZWFzb249ezB9IFx1NTQwZFx1NzlmMFx1NGUwZFx1ODBmZFx1NGUzYVx1N2E3YVx1MzAwMlxuXA0KLVxuXA0KLVx1OGJmN1x1NjMwN1x1NWI5YVx1NjcwOVx1NjU0OFx1NTQwZFx1NzlmMFx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLWRlbGV0ZUNvbmZpZ0Vycm9yX3JlYXNvbj1cdTZkNDFcdTdhMGJcdTIwMWN7MH1cdTIwMWRcdTVmMTVcdTc1MjhcdTRlODZcdTkxNGRcdTdmNmUNCi0jIENoYW5nZUJvdW5kc0NvbW1hbmQNCi1nZWZfY2hhbmdlQm91bmRzQ29tbWFuZF9sYWJlbD1cdTY2ZjRcdTY1MzlcdTdlZDFcdTViOWENCi0jIENoYW5nZU5hbWVDb21tYW5kDQotZ2VmX2NoYW5nZU5hbWVDb21tYW5kX2xhYmVsPVx1NjZmNFx1NjUzOVx1NTQwZFx1NzlmMA0KLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF91bmRvTWVzc2FnZT1cdTY1ZTBcdTZjZDVcdTY0YTRcdTZkODhcdTU0MGRcdTc5ZjBcdTY2ZjRcdTY1MzlcdTMwMDJcblwNCi1cblwNCi1cdTU5ODJcdTY3OWNcdTUxNDhcdTUyNGRcdTc2ODRcdTU0MGRcdTc5ZjBcdTRlM2FcdTdhN2FcdWZmMGNcdTUyMTlcdTRlMGRcdTUxNDFcdThiYjhcdTY0YTRcdTZkODhcdTU0MGRcdTc5ZjBcdTY2ZjRcdTY1MzlcdTMwMDINCi0jIENoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kDQotZ2VmX2NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kX2xhYmVsPVx1NjZmNFx1NjUzOVx1NWM1ZVx1NjAyN1x1NTAzYw0KLSMgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZA0KLWdlZl9jcmVhdGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPVx1NTIxYlx1NWVmYVx1NWYyZlx1NjZmMlx1NzBiOQ0KLSMgQ3JlYXRlTGlua0NvbW1hbmQNCi1nZWZfY3JlYXRlTGlua0NvbW1hbmRfbGFiZWw9XHU5NGZlXHU2M2E1XHU1MjFiXHU1ZWZhDQotIyBDcmVhdGVOb2RlQ29tbWFuZA0KLWdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbD1cdTUyMWJcdTVlZmFcdTY1YjBcdTgyODJcdTcwYjkNCi0jIERlbGV0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfZGVsZXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1cdTUyMjBcdTk2NjRcdTVmMmZcdTY2ZjJcdTcwYjkNCi0jIERlbGV0ZUNvbW1hbmQNCi1nZWZfZGVsZXRlQ29tbWFuZF9sYWJlbD1cdTUyMjBcdTk2NjQNCi0jIERlbGV0ZUxpbmtDb21tYW5kDQotZ2VmX2RlbGV0ZUxpbmtDb21tYW5kX2xhYmVsPVx1NTIyMFx1OTY2NFx1OGZkZVx1NjNhNQ0KLSMgTW92ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfbW92ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9XHU3OWZiXHU1MmE4XHU1ZjJmXHU2NmYyXHU3MGI5DQotIyBSZWNvbm5lY3RMaW5rQ29tbWFuZA0KLWdlZl9yZWNvbm5lY3RMaW5rQ29tbWFuZF9sYWJlbD1cdTkxY2RcdTY1YjBcdTk0ZmVcdTYzYTUNCi0NCi0jIFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0PVx1NTQwZFx1NzlmMFx1NGUwZFx1ODBmZFx1NGUzYVx1N2E3YVx1MzAwMlx1OGJmN1x1NjMwN1x1NWI5YVx1NjcwOVx1NjU0OFx1NTQwZFx1NzlmMFx1MzAwMg0KLSMgVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXINCi1nZWZfdmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0PVx1NTQwZFx1NzlmMFx1NGUwZFx1ODBmZFx1NGUzYVx1N2E3YVx1MzAwMlx1OGJmN1x1NjMwN1x1NWI5YVx1NjcwOVx1NjU0OFx1NTQwZFx1NzlmMFx1MzAwMg0KLSMgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQNCi1nZWZfd29ya1Byb2R1Y3ROb2RlRWRpdFBhcnRfdmFsaWRhdGVNZXNzYWdlPVx1NTQwZFx1NzlmMFx1NGUwZFx1ODBmZFx1NGUzYVx1N2E3YVx1MzAwMlx1OGJmN1x1NjMwN1x1NWI5YVx1NjcwOVx1NjU0OFx1NTQwZFx1NzlmMFx1MzAwMg0KLQ0KLSMgRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uDQotYWN0aW9uc19FbGVtZW50c1ZpZXdEZWxldGVBY3Rpb25fbWVzc2FnZT1cdTY1ZTBcdTZjZDVcdTUyMjBcdTk2NjRcdTkxNGRcdTdmNmVcdTIwMWN7MH1cdTIwMWRcdWZmMGNcdTU2ZTBcdTRlM2FcdTZkNDFcdTdhMGJcdTIwMWN7MX1cdTIwMWRcdTRlY2RcdTcxMzZcdTU3MjhcdTRmN2ZcdTc1MjhcdTZiNjRcdTkxNGRcdTdmNmVcdTMwMDINCi0NCi0jIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcg0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU9XHU1MjIwXHU5NjY0XHU5NTE5XHU4YmVmDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JNZXNzYWdlPVx1NjcyYVx1NTkwNFx1NzQwNlx1NzY4NFx1NWYwMlx1NWUzOA0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uPVx1OGJmN1x1NTNjMlx1OTYwNVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zg0KLQ0KLSMgTWV0aG9kRWxlbWVudEVkaXRvcg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZT1cdTRmZGRcdTViNThcdTk1MTlcdThiZWYNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTE9SVVQQTAwMjBFOiBcdTRmZGRcdTViNThcdTY1ODdcdTRlZjZcdTY1ZjZcdTUxZmFcdTk1MTkNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI9XHU2M2QwXHU0ZWE0XHU5NTE5XHU4YmVmDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjE9XHU4YmY3XHU1M2MyXHU5NjA1XHU2NWU1XHU1ZmQ3XHU2NTg3XHU0ZWY2XHVmZjBjXHU4M2I3XHU1M2Q2XHU2NmY0XHU1OTFhXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjI9XHU4YmY3XHU1M2MyXHU5NjA1XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU9XHU5MWNkXHU1NDdkXHU1NDBkXHU5NTE5XHU4YmVmDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JNc2c9XHU2YjY0XHU3ZjE2XHU4ZjkxXHU1NjY4XHU3Njg0XHU0ZTAwXHU0ZTJhXHU2MjE2XHU1OTFhXHU0ZTJhXHU2NTg3XHU0ZWY2XHU1ZGYyXHU4OGFiXHU1MjIwXHU5NjY0XHUzMDAyXHU2YjY0XHU3ZjE2XHU4ZjkxXHU1NjY4XHU0ZTBkXHU1MThkXHU2NzA5XHU2NTQ4XHVmZjBjXHU1YzA2XHU4OGFiXHU1MTczXHU5NWVkXHUzMDAyDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZT1cdTY1ZTBcdTY1NDhcdTdmMTZcdThmOTFcdTU2NjgNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JNZXNzYWdlMT1cdTkxY2RcdTU0N2RcdTU0MGRcdTY1ODdcdTRlZjZcdTIwMWN7MH1cdTIwMWRcdTY1ZjZcdTUxZmFcdTk1MTkNCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1yZW5hbWVFcnJvcl90aXRsZT1cdTkxY2RcdTU0N2RcdTU0MGRcdTUxNDNcdTdkMjANCi1yZW5hbWVFcnJvcl9tc2c9SVVQQTAwMTNFOiBcdTY1ZTBcdTZjZDVcdTViOGNcdTYyMTBcdTkxY2RcdTU0N2RcdTU0MGRcdTY0Y2RcdTRmNWNcdTMwMDINCi1TZWxlY3RFbGVtZW50RGlhbG9nX3NlbGVjdGVsZW1lbnRfdGV4dD1cdTkwMDlcdTYyZTlcdTUxNDNcdTdkMjANCi0NCi0jIEVkaXRvckNob29zZXINCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfdGl0bGU9XHU2MjUzXHU1ZjAwXHU2NWI5XHU2Y2Q1XHU3ZjE2XHU4ZjkxXHU1NjY4DQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZXNjcmlwdGlvbkxhYmVsPVx1NjNjZlx1OGZmMFx1ZmYxYQ0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbD1cdTUxNjhcdTkwZThcdTkwMDlcdTRlMmQNCi1PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDA9XHU3ZjE2XHU4ZjkxXHU1MTQzXHU3ZDIwDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNFOiBcdTY1ZTBcdTZjZDVcdTYyNTNcdTVmMDBcdTRlMGVcdTkwMDlcdTViOWFcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTUxNzNcdTgwNTRcdTc2ODRcdTdmMTZcdThmOTFcdTU2NjhcdTMwMDINCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZT1cdTkwMDlcdTYyZTlcdTU2ZmVcdTUwY2ZcdTY1ODdcdTRlZjYNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5TmFtZT1cdTY1YjBcdTVlZmFcdTVlOTMNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVzY3JpcHRpb25MYWJlbD1cdTYzY2ZcdThmZjBcdWZmMWENCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1cdTkwMDlcdTYyZTlcdTRlMDBcdTRlMmFcdTYyMTZcdTU5MWFcdTRlMmFcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdWZmMGNcdTcxMzZcdTU0MGVcdTUzNTVcdTUxZmJcdTIwMWNcdTViOGNcdTYyMTBcdTIwMWRcdTYyNTNcdTVmMDBcdThmZDlcdTRlOWJcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDINCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfRGVzZWxlY3RBbGxCdXR0b25MYWJlbD1cdTUxNjhcdTkwZThcdTRlMGRcdTkwMDkNCi1FbGVtZW50c1ZpZXdfbWlncmF0aW9uX2Rpcl9kbGdfZGVzY3JpcHRpb25fdGV4dD1cdTYzMDdcdTViOWFcdTY1YjBcdThmYzFcdTc5ZmJcdTc2ODQgezB9IFx1NzY4NFx1NzZlZVx1NWY1NVx1NjZmZlx1NjM2Mlx1OTAwOVx1NWI5YVx1NzY4NCB7MH0NCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPVx1NTNkMVx1NzUxZlx1N2NmYlx1N2VkZlx1OTUxOVx1OGJlZlx1MzAwMlx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMlxuXA0KLVxuXA0KLVx1OGJmN1x1NTE3M1x1OTVlZFx1NGUwMFx1NGU5Ylx1NjI1M1x1NWYwMFx1NzY4NFx1N2YxNlx1OGY5MVx1NTY2OFx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU9XHU1NmZlXHU1MGNmXHU2NWUwXHU2NTQ4DQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMUU6IFx1OTAwOVx1NWI5YVx1NzY4NFx1NTZmZVx1NTBjZlx1MjAxY3swfVx1MjAxZFx1NTkyN1x1NGU4ZVx1NTE0MVx1OGJiOFx1NzY4NFx1NTkyN1x1NWMwZlx1ZmYwOHsxfSAqIHsyfVx1ZmYwOVx1MzAwMlx1OGJmN1x1OTAwOVx1NjJlOVx1NTNlNlx1NGUwMFx1NGUyYVx1NTZmZVx1NTBjZlx1MzAwMg0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190aXRsZT1cdTU2ZmVcdTUwY2ZcdTY1ZTBcdTY1NDgNCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzJFOiBcdTkwMDlcdTViOWFcdTc2ODRcdTY1ODdcdTRlZjZcdTIwMWN7MH1cdTIwMWRcdTRlMGRcdTViNThcdTU3MjhcdTMwMDJcdThiZjdcdTkwMDlcdTYyZTlcdTUzZTZcdTRlMDBcdTRlMmFcdTU2ZmVcdTUwY2ZcdTMwMDINCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9XHU5MDA5XHU2MmU5Li4uDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uPVx1NjViOVx1NmNkNVx1NWU5M1x1NjNjZlx1OGZmMA0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1cdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTYzY2ZcdThmZjANCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPVx1NWZjNVx1OTg3Ylx1NTE3M1x1OTVlZFx1NjI0MFx1NjcwOVx1N2YxNlx1OGY5MVx1NTY2OFx1MzAwMlx1OGJmN1x1NjMwOVx1NWI5ZVx1OTY0NVx1NjBjNVx1NTFiNVx1OTAwOVx1NjJlOVx1OTcwMFx1ODk4MVx1NTE0OFx1ODhhYlx1NGZkZFx1NWI1OFx1NzY4NFx1N2YxNlx1OGY5MVx1NTY2OFx1MzAwMg0KLQ0KLSMgVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2UNCi1mb3Jtc19UZW1wbGF0ZURlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPVx1OTAwOVx1NjJlOVx1NzY4NFx1NjU4N1x1NGVmNlx1NWRmMlx1NjYyZlx1NmI2NFx1NmEyMVx1Njc3Zlx1NzY4NFx1OTY0NFx1NGVmNlx1MzAwMg0KLQ0KLSMgTmV3IExpYnJhcnkgRXJyb3IgRGlhbG9nDQotbmV3TGlicmFyeUVycm9yX21zZz1JVVBBMDAxNEU6IFx1NjVlMFx1NmNkNVx1NTIxYlx1NWVmYVx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24xPVx1NjMwN1x1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1NWU5M1x1OGRlZlx1NWY4NFx1MjAxY3swfVx1MjAxZFx1NjVlMFx1NjU0OFx1MzAwMg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24yPVx1MjAxY3swfVx1MjAxZFx1NGUyZFx1NWRmMlx1NWI1OFx1NTcyOFx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24zPVx1NjVlMFx1NmNkNVx1NTIxYlx1NWVmYVx1NjMwN1x1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1NWU5M1x1NjU4N1x1NGVmNlx1NTkzOVx1MjAxY3swfVx1MjAxZFx1MzAwMg0KLW5ld0xpYnJhcnlFcnJvcl9hZHZpY2U9XHU4YmY3XHU5MDA5XHU2MmU5XHUyMDFjXHU3ODZlXHU1YjlhXHUyMDFkXHVmZjBjXHU0ZTNhXHU1ZTkzXHU4ZjkzXHU1MTY1XHU1M2U2XHU0ZTAwXHU0ZTJhXHU1NDBkXHU3OWYwXHU2MjE2XHU4ZGVmXHU1Zjg0XHUzMDAyDQotDQotI1Byb2Nlc3MgbGl0ZXJhbHMNCi1Qcm9jZXNzX0V4dGVybmFsSUQ9XHU1OTE2XHU5MGU4XHU2ODA3XHU4YmM2XHVmZjFhDQotUHJvY2Vzc19QdXJwb3NlPVx1NzUyOFx1OTAxNFx1ZmYxYQ0KLVByb2Nlc3NfU2NvcGU9XHU4MzAzXHU1NmY0XHVmZjFhDQotUHJvY2Vzc19Vc2FnZU5vdGVzPVx1NGY3Zlx1NzUyOFx1NmNlOFx1OTFjYVx1ZmYxYQ0KLVByb2Nlc3NfQWx0ZXJuYXRpdmVzPVx1NjZmZlx1NGVlM1x1NjViOVx1Njg0OFx1ZmYxYQ0KLVByb2Nlc3NfSG93VG9TdGFmZj1cdTU5ODJcdTRmNTVcdTkxNGRcdTU5MDdcdTRlYmFcdTU0NThcdWZmMWENCi1Qcm9jZXNzX0tleUNvbnNpZGVyYXRpb249XHU1MTczXHU5NTJlXHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5XHVmZjFhDQotUHJvY2Vzc19TY2FsZT1cdTdiNDlcdTdlYTdcdWZmMWENCi1Qcm9jZXNzX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3M9XHU5ODc5XHU3NmVlXHU3Mjc5XHU1ZjgxXHVmZjFhDQotUHJvY2Vzc19SaXNrTGV2ZWw9XHU5OGNlXHU5NjY5XHU3ZWE3XHU1MjJiXHVmZjFhDQotUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlPVx1NGYzMFx1N2I5N1x1NjI4MFx1NjcyZlx1ZmYxYQ0KLVByb2Nlc3NfUHJvamVjdE1lbWJlckV4cGVydGlzZT1cdTk4NzlcdTc2ZWVcdTYyMTBcdTU0NThcdTRlMTNcdTk1N2ZcdWZmMWENCi1Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0PVx1NTQwOFx1NTQwY1x1N2M3Ylx1NTc4Ylx1ZmYxYQ0KLQ0KLSMgRWRpdG9yIFByZXZpZXcgTmF2aWdhdGlvbiBCdXR0b25zDQotYmFja0J1dHRvbl90ZXh0PVx1NTQwZVx1OTAwMA0KLWZvcndhcmRCdXR0b25fdGV4dD1cdTUyNGRcdThmZGINCi1mb3J3YXJkX3RleHQ9XHU1MjRkXHU4ZmRiDQotc3RvcEJ1dHRvbl90ZXh0PVx1NTA1Y1x1NmI2Mg0KLXJlZnJlc2hCdXR0b25fdGV4dD1cdTUyMzdcdTY1YjANCi1yZWZyZXNoX3RleHQ9XHU1MjM3XHU2NWIwDQotbmV3bmFtZV90ZXh0PVx1NjViMFx1NTQwZFx1NzlmMFx1ZmYxYQ0KLXByaW50QnV0dG9uX3RleHQ9XHU2MjUzXHU1MzcwDQotDQotIyBDb250ZXh0IG1lbnVzDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPVx1NTIzN1x1NjViMCgmUikNCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT1cdTY2M2VcdTc5M2FcdTVjNWVcdTYwMjcoJlMpDQotDQotX1VJX01ldGhvZEVkaXRvcl9tZW51PVx1NjViOVx1NmNkNVx1N2YxNlx1OGY5MVx1NTY2OCgmTSkNCi1fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtPVx1NjViMFx1NWVmYSgmTikNCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09XHU2NWIwXHU1ZWZhXHU1NDBjXHU0ZWUzKCZFKQ0KLQ0KLV9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsPVx1OTAwOVx1NjJlOQ0KLV9VSV9QYXJlbnRQYWdlX2xhYmVsPVx1NzIzNg0KLV9VSV9MaXN0UGFnZV9sYWJlbD1cdTUyMTdcdTg4NjgNCi1fVUlfVHJlZVBhZ2VfbGFiZWw9XHU2ODExDQotX1VJX1RhYmxlUGFnZV9sYWJlbD1cdTg4NjgNCi1fVUlfVGFibGVUcmVlUGFnZV9sYWJlbD1cdTg4NjhcdTY4MTENCi1fVUlfT2JqZWN0Q29sdW1uX2xhYmVsPVx1NWJmOVx1OGM2MQ0KLV9VSV9TZWxmQ29sdW1uX2xhYmVsPVx1ODFlYVx1OGVhYg0KLQ0KLV9VSV9Ob09iamVjdFNlbGVjdGVkPVx1NjcyYVx1OTAwOVx1NjJlOVx1NGVmYlx1NGY1NVx1NWJmOVx1OGM2MQ0KLV9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZD1cdTkwMDlcdTViOWFcdTc2ODRcdTViZjlcdThjNjFcdWZmMWF7MH0NCi1fVUlfTXVsdGlPYmplY3RTZWxlY3RlZD1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NWJmOVx1OGM2MQ0KLQ0KLV9VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWw9XHU2MjUzXHU1ZjAwXHU3ZjE2XHU4ZjkxXHU1NjY4DQotDQotX1VJX1dpemFyZF9jYXRlZ29yeT1cdTc5M2FcdTRmOGIgRU1GIFx1NmEyMVx1NTc4Ylx1NTIxYlx1NWVmYVx1NTQxMVx1NWJmYw0KLQ0KLV9VSV9NZXRob2RNb2RlbFdpemFyZF9sYWJlbD1cdTY1YjlcdTZjZDVcdTZhMjFcdTU3OGINCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfZGVzY3JpcHRpb249XHU1MjFiXHU1ZWZhXHU2NWIwXHU2NWI5XHU2Y2Q1XHU2YTIxXHU1NzhiDQotDQotX1VJX01ldGhvZEVkaXRvcl9sYWJlbD1cdTY1YjlcdTZjZDVcdTZhMjFcdTU3OGJcdTdmMTZcdThmOTFcdTU2NjgNCi0NCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZT1cdTYyMTFcdTc2ODQNCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVFeHRlbnNpb249XHU2NWI5XHU2Y2Q1DQotDQotX1VJX1dpemFyZF9sYWJlbD1cdTY1YjBcdTVlZmENCi0NCi1fV0FSTl9GaWxlbmFtZUV4dGVuc2lvbj1cdTY1ODdcdTRlZjZcdTU0MGRcdTVmYzVcdTk4N2JcdTRlZTVcdTIwMWMuezB9XHUyMDFkXHU3ZWQzXHU1YzNlDQotDQotX1VJX01vZGVsT2JqZWN0PVx1NmEyMVx1NTc4Ylx1NWJmOVx1OGM2MQ0KLV9VSV9YTUxFbmNvZGluZz1YTUwgXHU3ZjE2XHU3ODAxDQotX1VJX1hNTEVuY29kaW5nQ2hvaWNlcz1VVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQ0KLV9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb249XHU5MDA5XHU2MmU5XHU4OTgxXHU1MjFiXHU1ZWZhXHU3Njg0XHU2YTIxXHU1NzhiXHU1YmY5XHU4YzYxDQotDQotX1VJX0ZpbGVDb25mbGljdF9sYWJlbD1cdTY1ODdcdTRlZjZcdTUxYjJcdTdhODENCi1fV0FSTl9GaWxlQ29uZmxpY3Q9XHU2NzA5XHU2NzJhXHU0ZmRkXHU1YjU4XHU3Njg0XHU2NmY0XHU2NTM5XHU0ZTBlXHU1NzI4XHU3ZjE2XHU4ZjkxXHU1NjY4XHU1OTE2XHU0ZjVjXHU1MWZhXHU3Njg0XHU2NmY0XHU2NTM5XHU1MWIyXHU3YTgxXHUzMDAyXHU2NjJmXHU1NDI2XHU4OTgxXHU1ZTlmXHU1ZjAzXHU2YjY0XHU3ZjE2XHU4ZjkxXHU1NjY4XHU3Njg0XHU2NmY0XHU2NTM5XHVmZjFmDQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1hZGRMaW5rRGlhbG9nX2xpbmtUeXBlPVx1N2M3Ylx1NTc4Ylx1ZmYxYQ0KLW9wZW5MaW5rQ2hlY2tib3hfdGV4dD1cdTU3MjhcdTUzZTZcdTRlMDBcdTRlMmFcdTZkNGZcdTg5YzhcdTU2NjhcdTdhOTdcdTUzZTNcdTRlMmRcdTYyNTNcdTVmMDBcdTk0ZmVcdTYzYTUNCi0NCi0jIEFkZCBJbWFnZSBEaWFsb2cNCi1oZWlnaHRMYWJlbF90ZXh0PVx1OWFkOFx1NWVhNlx1ZmYxYQ0KLXdpZHRoTGFiZWxfdGV4dD1cdTViYmRcdTVlYTZcdWZmMWENCi1FbGVtZW50c1ZpZXdfMjA9XHU4MGZkXHU1MjliXHU2YTIxXHU1ZjBmDQotRWxlbWVudHNWaWV3XzIxPVx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYg0KLUVsZW1lbnRzVmlld18yMj1cdTZkNDFcdTdhMGINCi1FbGVtZW50c1ZpZXdfMzU9ezB9IFx1NGUzYVx1NTNlYVx1OGJmYlx1MzAwMlx1OGJmN1x1NWMwNlx1NWI4M1x1OGJiZVx1NGUzYVx1NTNlZlx1NTE5OVx1ZmYwY1x1NzEzNlx1NTQwZVx1NTE4ZFx1N2VlN1x1N2VlZFx1MzAwMg0KLUVsZW1lbnRzVmlld18zNj1cdTg4YzVcdTUxNjVcdTVlOTNcdTY1ZjZcdTUxZmFcdTk1MTkNCi1hbHRUYWdMYWJlbF90ZXh0PUFMVCBcdTY4MDdcdThiYjBcdWZmMWENCi1pbWFnZVNpemVMYWJlbF90ZXh0PVx1NTZmZVx1NTBjZlx1NzY4NFx1OWFkOFx1NWVhNlx1NTQ4Y1x1NWJiZFx1NWVhNlx1NWZjNVx1OTg3Ylx1ODFmM1x1NWMxMVx1NGUzYSAxMFx1ZmYwY1x1NGY0Nlx1NGUwZFx1ODBmZFx1OGQ4NVx1OGZjNyA2MDBcdTMwMDJcdTY1ZTBcdTY1NDhcdTlhZDhcdTVlYTZcdTU0OGNcdTViYmRcdTVlYTZcdTVjMDZcdThmNmNcdTYzNjJcdTRlM2FcdTU0MDhcdTkwMDJcdTU5MjdcdTVjMGZcdTMwMDINCi0NCi0jIFByb2Nlc3MgRWRpdG9yDQotUHJvY2Vzc0VkaXRvcj1Qcm9jZXNzRWRpdG9yDQotUHJvY2Vzc0VkaXRvcl9OYW1lPVx1NTQwZFx1NzlmMA0KLVByb2Nlc3NFZGl0b3JfUHJlc2VudGF0aW9uTmFtZT1cdTY2M2VcdTc5M2FcdTU0MGRcdTc5ZjANCi1Qcm9jZXNzRWRpdG9yX0luZGV4PVx1N2QyMlx1NWYxNQ0KLVByb2Nlc3NFZGl0b3JfUHJlZGVjZXNzb3JzPVx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYQ0KLSNDb25maWd1cmF0aW9uUGFnZV9TZWxlY3RlZD1TZWxlY3RlZDogDQotQ2hlY2tsaXN0T3JkZXJfZGVzY3JpcHRpb249XHU5MDA5XHU2MmU5XHU2N2QwXHU0ZTJhXHU2OGMwXHU2N2U1XHU5ODc5XHVmZjBjXHU3MTM2XHU1NDBlXHU1MzU1XHU1MWZiXHUyMDFjXHU1NDExXHU0ZTBhXHUyMDFkXHU2MjE2XHUyMDFjXHU1NDExXHU0ZTBiXHUyMDFkXHVmZjBjXHU1M2VmXHU2NmY0XHU2NTM5XHU1YjgzXHU3Njg0XHU5ODdhXHU1ZThmXHUzMDAyDQotRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQ9XHU2YjYzXHU1NzI4XHU5MWNkXHU1NDdkXHU1NDBkLi4uDQotUHJvY2Vzc0VkaXRvcl9Nb2RlbEluZm89XHU2YTIxXHU1NzhiXHU0ZmUxXHU2MDZmDQotUHJvY2Vzc0VkaXRvcl9QcmVmaXg9XHU1MjRkXHU3ZjAwDQotTW92ZURpYWxvZ19tb3ZlX3RleHQ9XHU3OWZiXHU1MmE4DQotQ2hlY2tsaXN0T3JkZXJfdGl0bGU9XHU1YmY5XHU2OGMwXHU2N2U1XHU5ODc5XHU2MzkyXHU1ZThmDQotUHJvY2Vzc0VkaXRvcl9SZXBldGFibGU9XHU1M2VmXHU5MWNkXHU1OTBkDQotUHJvY2Vzc0VkaXRvcl9PbmdvaW5nPVx1NmI2M1x1NTcyOFx1OGZkYlx1ODg0Yw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N5bmNocm9uaXphdGlvbj1cdTU0MGNcdTZiNjUuLi4NCi1Qcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuPVx1NGU4Ylx1NGVmNlx1OWE3MVx1NTJhOA0KLVByb2Nlc3NFZGl0b3JfRGVsaXZlcmFibGU9XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2DQotUHJvY2Vzc0VkaXRvcl9PcHRpb25hbD1cdTUzZWZcdTkwMDkNCi1GaWx0ZXJEaWFsb2dfVHlwZV90ZXh0PVx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1N2M3Ylx1NTc4Ylx1ZmYxYQ0KLUZpbHRlckRpYWxvZ19FeHBhbmRBbGw9XHU1MTY4XHU5MGU4XHU1YzU1XHU1ZjAwDQotTW92ZURpYWxvZ19tb3ZpbmdfdGV4dD1cdTZiNjNcdTU3MjhcdTc5ZmJcdTUyYTguLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25XYXJuaW5nPUlVUEEwMDI1VzogXHU4ZGVmXHU1Zjg0IHsxfSBcdTRlMmRcdTY3MmFcdTYyN2VcdTUyMzAgezB9IFx1NzY4NFx1NWY2Mlx1NzJiNlx1NTZmZVx1NjgwNw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yPUlVUEEwMDI1RTogXHU5NTE5XHU4YmVmXHVmZjFhXHU1ZjYyXHU3MmI2XHU1NmZlXHU2ODA3XHU5MGU4XHU1MjA2XHVmZjFhezB9DQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9OYW1lTGFiZWw9XHU1NDBkXHU3OWYwXHVmZjFhDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1cdTUyMWJcdTVlZmFcdTY1YjBcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfTmFtZUxhYmVsPVx1NTQwZFx1NzlmMFx1ZmYxYQ0KLUF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU9XHU2NWIwXHU1ZWZhXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VUaXRsZT1cdTUyMWJcdTVlZmFcdTY1YjBcdTY1YjlcdTZjZDVcdTVlOTMNCi1uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlPVx1NjViMFx1NWVmYVx1NjViOVx1NmNkNVx1NWU5Mw0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlVGl0bGU9XHU0ZmRkXHU1YjU4XHU2NmY0XHU2NTM5DQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1cdTRlM2FcdTY1YjBcdTY1YjlcdTZjZDVcdTVlOTNcdTYzMDdcdTViOWFcdTU0MGRcdTc5ZjBcdTMwMDFcdTYzY2ZcdThmZjBcdTU0OGNcdTc2ZWVcdTY4MDdcdTc2ZWVcdTVmNTVcdTMwMDINCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZURlc2NyaXB0aW9uPVx1NGZlZVx1NjUzOVx1NGU4Nlx1NGUwMFx1NGUyYVx1NjIxNlx1NTkxYVx1NGUyYVx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1MzAwMlx1OGJmN1x1OTAwOVx1NjJlOVx1OTcwMFx1ODk4MVx1NGZkZFx1NWI1OFx1NzY4NFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1MzAwMg0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPVx1NjI1M1x1NWYwMFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlPVx1NjI1M1x1NWYwMFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLUVsZW1lbnRzVmlld19yZXBsYWNlaW5nd2l0aGZvcm1hdF90ZXh0PVx1NmI2M1x1NTcyOFx1NjZmZlx1NjM2MiB7MH0uLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmc9SVVQQTAwMjZXOiBcdThkZWZcdTVmODQgezF9IFx1NGUyZFx1NjcyYVx1NjI3ZVx1NTIzMCB7MH0gXHU3Njg0XHU4MjgyXHU3MGI5XHU1NmZlXHU2ODA3DQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfdW5zZWxlY3RlZHBhY2thZ2VzPVx1MjAxY3swfVx1MjAxZFx1NTMwNVx1NTQyYlx1NjdkMFx1NGU5Ylx1NTE0M1x1N2QyMFx1ZmYwY1x1OGZkOVx1NGU5Ylx1NTE0M1x1N2QyMFx1NWYxNVx1NzUyOFx1NjcyYVx1OTAwOVx1NWI5YVx1N2EwYlx1NWU4Zlx1NTMwNVx1NGUyZFx1NzY4NFx1NTE0M1x1N2QyMA0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3I9SVVQQTAwMjZFOiBcdTk1MTlcdThiZWZcdWZmMWFcdTgyODJcdTcwYjlcdTU2ZmVcdTY4MDdcdTkwZThcdTUyMDZcdWZmMWF7MH0NCi1TdGVwc09yZGVyRGlhbG9nX3N0ZXBzPVx1NmI2NVx1OWFhNFx1ZmYxYQ0KLVN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU9XHU1YmY5XHU0ZWZiXHU1MmExXHU2YjY1XHU5YWE0XHU2MzkyXHU1ZThmDQotUHJvY2Vzc0VkaXRvcl9QbGFubmVkPVx1NWRmMlx1ODljNFx1NTIxMg0KLXNwZWNpZnlkaXJlY3RvcnlfdGV4dD1cdThiZjdcdTYzMDdcdTViOWFcdTRmZGRcdTViNThcdTY1YjlcdTZjZDVcdTVlOTNcdTc2ODRcdTc2ZWVcdTVmNTUNCi1Qcm9jZXNzRWRpdG9yX011bHRpcGxlT2NjdXJyZW5jZXM9XHU1OTFhXHU2YjIxXHU1MWZhXHU3M2IwDQotUHJvY2Vzc0VkaXRvcl9FbnRyeVN0YXRlPVx1OGZkYlx1NTE2NVx1NzJiNlx1NjAwMQ0KLVByb2Nlc3NFZGl0b3JfRXhpdFN0YXRlPVx1OTAwMFx1NTFmYVx1NzJiNlx1NjAwMQ0KLXNlbGVjdENvbHVtbnN0b0FkZF90ZXh0PVx1OTAwOVx1NjJlOVx1ODk4MVx1NmRmYlx1NTJhMFx1NzY4NFx1NTIxNw0KLVByb2Nlc3NFZGl0b3JfVHlwZT1cdTdjN2JcdTU3OGINCi1Qcm9jZXNzRWRpdG9yX1RlYW09XHU1NmUyXHU5NjFmDQotRmlsdGVyRGlhbG9nX3RpdGxlPVx1OTAwOVx1NjJlOVx1NWJmOVx1OGJkZFx1Njg0Nlx1ZmYxYQ0KLQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZD1cdTRlY2VcdTY1YjlcdTZjZDVcdTUxODVcdTViYjlcdTZkZmJcdTUyYTAoJk0pLi4uDQotRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsPVx1NTE2OFx1OTBlOFx1NjI5OFx1NTNlMA0KLU9wZW5DaGVhdHNoZWV0Vmlld190aXRsZT1cdTYyNTNcdTVmMDBcdTU5MDdcdTVmZDhcdTUzNTVcdTg5YzZcdTU2ZmUNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsVXA9XHU0ZTBhXHU2ZWRhDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd249XHU0ZTBiXHU2ZWRhDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZVVwPVx1NGUwYVx1NzlmYigmTykNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlRG93bj1cdTRlMGJcdTc5ZmIoJlcpDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsPVx1NjYzZVx1NzkzYSgmQSkNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db3B5PVx1NTkwZFx1NTIzNigmQykuLi4NCi1GaWx0ZXJEaWFsb2dfUGF0dGVybl90ZXh0PVx1NTQwZFx1NzlmMFx1NmEyMVx1NWYwZlx1ZmYwOFx1NWMwNlx1NjYzZVx1NzkzYVx1NTMzOVx1OTE0ZFx1NzY4NFx1NTQwZFx1NzlmMFx1ZmYwOVx1ZmYxYQ0KLQ0KLU1ldGhvZExpYnJhcnlFZGl0b3JfdGl0bGU9XHU2NWI5XHU2Y2Q1XHU1ZTkzXHVmZjFhDQotI01lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ9U2VsZWN0ZWQ6IA0KLU1lc3NhZ2VWaWV3X2Vycm1zZ190ZXh0PVx1NjNjZlx1OGZmMA0KLUVsZW1lbnRzVmlld19lcnJfc2F2aW5nPUlVUEEwMDI3RTogXHU0ZmRkXHU1YjU4XHUyMDFjezB9XHUyMDFkezF9IFx1NjVmNlx1NTFmYVx1OTUxOQ0KLQ0KLWVycl9jb3B5aW5nX2ZpbGVfdGl0bGU9XHU1OTBkXHU1MjM2XHU2NTg3XHU0ZWY2XHU2NWY2XHU1MWZhXHU5NTE5DQotZXJyX2NvcHlpbmdfZmlsZV9lcnJvcj1JVVBBMDAyOEU6IFx1NjVlMFx1NmNkNVx1NTIwNlx1OTE0ZFx1OGJlNVx1NTZmZVx1NjgwN1x1MzAwMg0KLWVycl9jb3B5aW5nX2ZpbGVfcmVhc29uPVx1NTkwZFx1NTIzNlx1OTAwOVx1NWI5YVx1NjU4N1x1NGVmNlx1NjVmNlx1NTFmYVx1OTUxOVx1MzAwMlx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU9XHU1OTA0XHU3NDA2XHU2NTg3XHU0ZWY2XHU2NWY2XHU1MWZhXHU5NTE5DQotZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcD1cdTdmMTZcdThmOTFcdTkxNGRcdTdmNmUNCi1lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQ9SVVQQTAwMTVFOiBcdTY1ZTBcdTZjZDVcdTdmMTZcdThmOTFcdTUxNDNcdTdkMjANCi1TYXZlVGhpc0FjdGlvbl9zYXZlb2JqZWN0PVx1NGZkZFx1NWI1OFx1NmI2NFx1NWJmOVx1OGM2MS4uLg0KLUVsZW1lbnRzVmlld19yZXBsYWNlX3RleHQ9XHU2NmZmXHU2MzYyDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kPVx1NjI2OVx1NWM1NSgmRSkuLi4NCi1Nb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ9XHU5MDA5XHU2MmU5XHU5MDA5XHU1YjlhXHU1MTQzXHU3ZDIwXHU3Njg0XHU3NmVlXHU2ODA3XHU0ZjRkXHU3ZjZlXHVmZjFhDQotY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0PVx1OTAwOVx1NjJlOVx1NWU5M1x1NzY4NFx1N2YzYVx1NzcwMVx1NzZlZVx1NWY1NVx1ZmYxYQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzPVx1NjI5MVx1NTIzNigmUykNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczI9XHU1M2QxXHU1ZTAzXHU5MDA5XHU5ODc5KCZQKS4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0Fzc2lnblVzZXJEaWFncmFtPVx1NzUyOFx1NjIzN1x1NWI5YVx1NGU0OVx1NTZmZSgmVSkuLi4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdGl0bGU9XHU1MjA2XHU5MTRkXHU3NTI4XHU2MjM3XHU1YjlhXHU0ZTQ5XHU1NmZlDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U9XHU2ZDNiXHU1MmE4XHU1NmZlXHVmZjFhDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlPVx1NmQzYlx1NTJhOFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1NTZmZVx1ZmYxYQ0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTRmOWRcdThkNTZcdTUxNzNcdTdjZmJcdTU2ZmVcdWZmMWENCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfbm90YUZpbGU9SVVQQTAwMDRFOiBcdTYzMDdcdTViOWFcdTc2ODRcdThkZWZcdTVmODRcdTRlMGRcdTY2MmZcdTY1ODdcdTRlZjZcdTMwMDINCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uPVx1OTAwOVx1NjJlOS4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19lbnRlcmVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAyNEU6IFx1NjMwN1x1NWI5YVx1NzY4NFx1NTZmZVx1NTBjZlx1NTcyOFx1NWU5M1x1NGUyZFx1NGUwZFx1NWI1OFx1NTcyOFx1MzAwMlx1OGJmN1x1Nzg2ZVx1NGZkZFx1OGY5M1x1NTE2NVx1NGUwZVx1NWU5M1x1NjgzOVx1NzZlZVx1NWY1NVx1NzZmOFx1NWJmOVx1NzY4NFx1OGRlZlx1NWY4NFx1MzAwMg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ9SVVQQTAwMzBFOiBcdTYwYThcdTkwMDlcdTYyZTlcdTc2ODRcdTU2ZmVcdTUwY2ZcdTRlMGRcdTU3MjhcdTVlOTNcdTRlMmRcdTMwMDINCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZT1cdTRmN2ZcdTc1MjhcdTZkM2JcdTUyYThcdTU2ZmVcdTU2ZmVcdTUwY2ZcdThmZGJcdTg4NGNcdTZkNGZcdTg5YzhcdTU0OGNcdTUzZDFcdTVlMDMNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURESW1hZ2U9XHU0ZjdmXHU3NTI4XHU2ZDNiXHU1MmE4XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU1NmZlXHU1NmZlXHU1MGNmXHU4ZmRiXHU4ODRjXHU2ZDRmXHU4OWM4XHU1NDhjXHU1M2QxXHU1ZTAzDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlPVx1NGY3Zlx1NzUyOFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYlx1NTZmZVx1NTZmZVx1NTBjZlx1OGZkYlx1ODg0Y1x1NmQ0Zlx1ODljOFx1NTQ4Y1x1NTNkMVx1NWUwMw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvbnRyaWJ1dGU9XHU2NzJjXHU1NzMwXHU2M2QwXHU0ZjliDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZT1cdTY3MmNcdTU3MzBcdTY2ZmZcdTYzNjINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9EaWFncmFtcz1cdTU2ZmUoJkcpDQotUHJvY2Vzc0VkaXRvcl9hY3Rpb25fZGVlcENvcHk9XHU2ZGYxXHU1YzQyXHU1OTBkXHU1MjM2KCZEKS4uLg0KLUZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uPVx1N2I4MFx1ODk4MVx1NjNjZlx1OGZmMFx1ZmYxYQ0KLUNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwPVx1NjYzZVx1NzkzYVx1ZmYwZlx1OTY5MFx1ODVjZlx1NjcyYVx1OTAwOVx1NGUyZFx1NzY4NFx1NTE0M1x1N2QyMA0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uPVx1NjNjZlx1OGZmMFx1ZmYxYQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzQWxsPVx1NGUwZFx1NTNkMVx1NWUwMw0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uPVx1NmEyMVx1NWYwZlx1NGVlNVx1OTAxN1x1NTNmN1x1OTY5NFx1NWYwMFx1ZmYwY1x1NTE3Nlx1NGUyZCAqIFx1ODg2OFx1NzkzYVx1NGVmYlx1NjEwZlx1NWI1N1x1N2IyNlx1NGUzMlx1ZmYwYz8gXHU4ODY4XHU3OTNhXHU0ZWZiXHU2MTBmXHU1YjU3XHU3YjI2DQotQ29uZmlndXJhdGlvblBhZ2VfVHJlZVRpdGxlTGFiZWw9XHU1MTg1XHU1YmI5XHVmZjFhDQotQ29uZmlndXJhdGlvblBhZ2VfTG9hZGluZ01lc3NhZ2U9XHU2YjYzXHU1NzI4XHU4OGM1XHU1MTY1XHU5MTRkXHU3ZjZlXHVmZjBjXHU4YmY3XHU3YTBkXHU1MDE5IC4uLg0KLU1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0PVx1NjMwN1x1NWI5YVx1NzY4NFx1NzlmYlx1NTJhOFx1NzZlZVx1NjgwN1x1NGY0ZFx1N2Y2ZVx1NjVlMFx1NjU0OFx1MzAwMg0KLU1vdmVEaWFsb2dfY2Fubm90TW9kaWZ5RGVzdGluYXRpb249SVVQQTAwMzRFOiBcdTY1ZTBcdTZjZDVcdTRmZWVcdTY1MzlcdTkwMDlcdTViOWFcdTc2ODRcdTc2ZWVcdTY4MDdcdTRmNGRcdTdmNmVcdTMwMDINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw9XHU1MTY4XHU5MGU4XHU1M2QxXHU1ZTAzDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkJhc2VBY3Rpdml0eT1cdTYyNTNcdTVmMDBcdTU3ZmFcdTY3MmNcdTZkM2JcdTUyYTgNCi1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPVx1NTE2OFx1OTBlOFx1NWM1NVx1NWYwMCgmWCkNCi1Qcm9jZXNzRm9ybUVkaXRvcl9jb2xsYXBzZUFsbEFjdGlvbkxhYmVsPVx1NTE2OFx1OTBlOFx1NjI5OFx1NTNlMCgmTCkNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtPVx1NjI1M1x1NWYwMFx1NmQzYlx1NTJhOFx1NTZmZSgmQSkNCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlUmV2ZWFsPVx1NWZjNVx1OTg3Ylx1NTIyMFx1OTY2NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1NGUyZFx1NTIxN1x1NTFmYVx1NzY4NFx1NjcyYVx1NjI5MVx1NTIzNlx1NzY4NFx1NjNjZlx1OGZmMFx1N2IyNlx1ZmYwY1x1NGVlNVx1OTA3Zlx1NTE0ZFx1NTcyOFx1NWM1NVx1NzkzYVx1OTAwOVx1NWI5YVx1NTE0M1x1N2QyMFx1NTQwZVx1NTFmYVx1NzNiMFx1OTFjZFx1NTkwZFx1MzAwMlx1NTk4Mlx1Njc5Y1x1ODk4MVx1NTIyMFx1OTY2NFx1NWI4M1x1NGVlY1x1NWU3Nlx1N2VlN1x1N2VlZFx1NGUwYlx1NTNiYlx1ZmYwY1x1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1Nzg2ZVx1NWI5YVx1MjAxZFx1MzAwMg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9TZWxlY3RDb2x1bW5zPVx1OTAwOVx1NjJlOVx1ODk4MVx1NmRmYlx1NTJhMFx1NzY4NFx1NTIxNw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW09XHU2MjUzXHU1ZjAwXHU2ZDNiXHU1MmE4XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU1NmZlKCZEKQ0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9Db2x1bW5TZWxlY3Rpb249XHU1MjE3XHU5MDA5XHU2MmU5XHVmZjFhDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N3aXRjaENvbmZpZ3VyYXRpb249XHU1NzI4XHU2ZmMwXHU2ZDNiXHUyMDFjXHU2ZDQxXHU3YTBiXHUyMDFkXHU3ZjE2XHU4ZjkxXHU1NjY4XHU2NWY2XHU1MjA3XHU2MzYyXHU1MjMwXHU2ZDQxXHU3YTBiXHU3Njg0XHU3ZjNhXHU3NzAxXHU5MTRkXHU3ZjZlDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N1cHByZXNzaW9uR3JvdXBUaXRsZT1cdTYyOTFcdTUyMzYNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGU9XHU3ZWU3XHU2MjdmXHU2MjkxXHU1MjM2XHU3MmI2XHU2MDAxDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW09XHU2MjUzXHU1ZjAwXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU0ZjlkXHU4ZDU2XHU1MTczXHU3Y2ZiXHU1NmZlKCZXKQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsPVx1NmUwNVx1OTY2NA0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsPVx1OTAwOVx1NjJlOS4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0luc2VydE5ld1BoYXNlPVx1NjNkMlx1NTE2NVx1NjViMFx1OTYzNlx1NmJiNQ0KLVZpZXdIZWxwZXJfcmVsb2FkTGliT25Sb2xsYmFja0Vycm9yPVx1NjVlMFx1NmNkNVx1NGVjZVx1NjMwMVx1NGU0NVx1NjAyN1x1OTUxOVx1OGJlZlx1NjA2Mlx1NTkwZFx1MzAwMlx1OTcwMFx1ODk4MVx1OTFjZFx1NjViMFx1ODhjNVx1NTE2NVx1NWU5M1x1ZmYwY1x1NjA2Mlx1NTkwZFx1NWI4M1x1NzY4NFx1NTM5Zlx1NTljYlx1NzJiNlx1NjAwMVx1MzAwMg0KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRfdGV4dD1cdTUxNDNcdTdkMjBcdTIwMWN7MH1cdTIwMWRcdTVkZjJcdTUyMjBcdTk2NjRcdTMwMDINCi1WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkY29uZmlybV90ZXh0PVx1NTE0M1x1N2QyMFx1MjAxY3swfVx1MjAxZFx1NWRmMlx1NTIyMFx1OTY2NFx1MzAwMlx1NjYyZlx1NTQyNlx1ODk4MVx1NGVjZVx1MjAxY3sxfVx1MjAxZFx1NGUyZFx1OTY2NFx1NTNiYlx1NWI4M1x1ZmYxZg0KLUNvbmZpZ3VyYXRpb25QYWdlX0FkZE1pc3NpbmdUb29sVGlwPVx1NmRmYlx1NTJhMFx1N2YzYVx1NWMxMVx1NzY4NFx1NWYxNVx1NzUyOA0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uPVx1NjNjZlx1OGZmMA0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkdlbmVyYWxJbmZvPVx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FwcGx5UGF0dGVybj1cdTVlOTRcdTc1MjhcdTZhMjFcdTVmMGYoJlQpDQotTW92ZURpYWxvZ19zZWxlY3RkZXN0aW5hdGlvbl90ZXh0PVx1OGJmN1x1OTAwOVx1NjJlOVx1NzZlZVx1NjgwN1x1NGY0ZFx1N2Y2ZVx1MzAwMg0KLU1vdmVEaWFsb2dfbm9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnPVx1NjcyYVx1NjMwN1x1NWI5YVx1NzlmYlx1NTJhOFx1NzZlZVx1NjgwN1x1NGY0ZFx1N2Y2ZVx1MzAwMg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdD1cdTk1ZWVcdTk4OThcdTViZjlcdThjNjFcdWZmMWENCi1NZXNzYWdlTGFiZWxQcm92aWRlcl9lcnJjaGlsZHBrZ3M9XHU1YjUwXHU1MTg1XHU1YmI5XHU1MzA1XHU2MjE2XHU2ZDQxXHU3YTBiXHU1MzA1XHU1NDJiXHU1ZTI2XHU2NzA5XHU3ZjNhXHU1YzExXHU1ZjE1XHU3NTI4XHU3Njg0XHU1MTQzXHU3ZDIwDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZT1cdTU2ZmVcdTUzZDFcdTVlMDNcdTkwMDlcdTk4NzkNCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2U9XHU4YmY3XHU5MDA5XHU2MmU5XHU4OTgxXHU1M2QxXHU1ZTAzXHU3Njg0XHU1NmZlXHU2MjE2XHU1M2Q2XHU2ZDg4XHU5MDA5XHU2MmU5XHU0ZTBkXHU1M2QxXHU1ZTAzXHU3Njg0XHU1NmZlDQotUHJvY2Vzc0VkaXRvcl9UaXRsZT1cdTZkNDFcdTdhMGJcdTdmMTZcdThmOTFcdTU2NjhcdWZmMWENCi1TYXZlQXN3aXRoZG90c190ZXh0PVx1NTNlNlx1NWI1OFx1NGUzYS4uLg0KLVByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZT1cdTVkZTVcdTRmNWNcdTUyMDZcdTg5ZTNcdTdlZDNcdTY3ODQNCi1Qcm9jZXNzRWRpdG9yX1RlYW1BbGxvY2F0aW9uPVx1NTZlMlx1OTYxZlx1NTIwNlx1OTE0ZA0KLVByb2Nlc3NFZGl0b3JfV29ya1Byb2R1Y3RVc2FnZT1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTRmN2ZcdTc1MjgNCi1Qcm9jZXNzRWRpdG9yX0NvbnNvbGlkYXRlZFZpZXc9XHU1NDA4XHU1ZTc2XHU4OWM2XHU1NmZlDQotUHJvY2Vzc0VkaXRvcl9jb25maXJtQXV0b1N5bmNoPVx1NmI2NFx1NjRjZFx1NGY1Y1x1NTIzN1x1NjViMFx1OTAwOVx1NWI5YVx1NzY4NFx1NjNjZlx1OGZmMFx1N2IyNlx1ZmYwY1x1NjIxNlx1NTIzN1x1NjViMFx1OTAwOVx1NWI5YVx1NmQzYlx1NTJhOFx1NGUwYlx1NzY4NFx1MzAwMVx1NTcyOFx1NTQwNFx1ODFlYVx1MjAxY1x1NWM1ZVx1NjAyN1x1MjAxZFx1ODljNlx1NTZmZVx1MjAxY1x1NWUzOFx1ODljNFx1MjAxZFx1OTAwOVx1OTg3OVx1NTM2MVx1NGUyZFx1NjgwN1x1NGUzYVx1MjAxY1x1NWRmMlx1NGUwZVx1NmU5MFx1NTQwY1x1NmI2NVx1MjAxZFx1NzY4NFx1NjI0MFx1NjcwOVx1NjNjZlx1OGZmMFx1N2IyNlx1MzAwMlx1NWI4M1x1NGVlNVx1NmQ0MVx1N2EwYlx1N2YzYVx1NzcwMVx1OTE0ZFx1N2Y2ZVx1NGUwYlx1NzY4NFx1OTRmZVx1NjNhNVx1NjViOVx1NmNkNVx1NTE4NVx1NWJiOVx1NTE0M1x1N2QyMFx1NzY4NFx1NTM5Zlx1NTljYlx1NWM1ZVx1NjAyN1x1NTIzN1x1NjViMFx1OGZkOVx1NGU5Ylx1NjNjZlx1OGZmMFx1N2IyNlx1MzAwMlx1OGJmN1x1NmNlOFx1NjEwZlx1ZmYxYVx1NWI4M1x1NGUwZFx1NGYxYVx1NjZmNFx1NjViMFx1NjI0MFx1NjcwOVx1NTJhOFx1NjAwMVx1OTRmZVx1NjNhNVx1NzY4NFx1NjNjZlx1OGZmMFx1N2IyNlx1ZmYwOFx1NGVlNVx1N2VmZlx1ODI3Mlx1NjU5Y1x1NGY1M1x1NjYzZVx1NzkzYVx1ZmYwOVx1MzAwMlx1NjYyZlx1NTQyNlx1ODk4MVx1N2VlN1x1N2VlZFx1ZmYxZg0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMT1cdTkxNGRcdTdmNmUNCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjI9XHU2M2QyXHU0ZWY2XHU1NDhjXHU1MzA1XHU5MDA5XHU2MmU5DQotTmV3TGlicmFyeURpYWxvZ19uZXdsaWJyYXJ5X2FzPVx1NWMwNlx1NjViMFx1NWU5M1x1NTIxYlx1NWVmYVx1NGUzYQ0KLU5ld1BsdWdpbkRpYWxvZ19uZXdwbHVnaW5fdGV4dD1cdTY1YjBcdTVlZmFcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi1TZWxlY3RFbGVtZW50RGlhbG9nX3RpdGxlX3RleHQ9XHU5MDA5XHU2MmU5XHU1MTQzXHU3ZDIwXHU2MjE2XHU5MDA5XHU2MmU5XHU1MTQzXHU3ZDIwXHU3Njg0XHU0ZTAwXHU0ZTJhXHU2M2QwXHU0ZjliXHU4MDA1XHVmZjFhDQotT3BlbkNvbmZpZ0RpYWxvZ25ld2NvbmZpZ190ZXh0PVx1NjViMFx1OTE0ZFx1N2Y2ZVx1ZmYxYQ0KLXByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZV9CU0VkaXRvcj1cdTZkNDFcdTdhMGJcdTdmMTZcdThmOTFcdTU2NjgNCi0NCi0jIEFic3RyYWN0RGlhZ3JhbUVkaXRvcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1cdTViZjlcdTlmNTANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1cdTRlY2VcdTU3ZmFcdTY3MmNcdTZkM2JcdTUyYThcdTUyMzdcdTY1YjANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9XHU2ODNjXHU1ZjBmXHU2NTg3XHU2NzJjXHU2ODQ2Li4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1cdTZjMzRcdTVlNzNcdTVjNDVcdTRlMmRcdTViZjlcdTlmNTANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVx1NmMzNFx1NWU3M1x1NWJmOVx1OWY1MFx1N2IyY1x1NGUwMFx1NGUyYVx1OTAwOVx1NWI5YVx1OTg3OQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9XHU1NzgyXHU3NmY0XHU1YzQ1XHU0ZTJkXHU1YmY5XHU5ZjUwDQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl90aXRsZT1cdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmYNCi1Nb3ZlRGlhbG9nX2ludmFsaWRfbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1JVVBBMDA0MUU6IFx1OTAwOVx1NWI5YVx1NzY4NFx1NTE0M1x1N2QyMFx1NjVlMFx1NmNkNVx1NzlmYlx1NTJhOFx1NTIzMFx1NjMwN1x1NWI5YVx1NzY4NFx1NzZlZVx1NjgwN1x1NGY0ZFx1N2Y2ZVx1MzAwMg0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeT1cdTZiNjNcdTU3MjhcdTRmZGRcdTViNThcdTZhMjFcdTU3OGJcdTVlOTMgLi4uDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU9XHU5NTE5XHU4YmVmDQotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c9SVVQQTAwMzNFOiBcdTRmZGRcdTViNThcdTVlOTNcdTY1ZjZcdTkwNDdcdTUyMzBcdTk1ZWVcdTk4OThcdTMwMDINCi1NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dD1cdTc4NmVcdTViOWVcdTg5ODFcdTUyMjBcdTk2NjRcdTIwMWN7MH1cdTIwMWRcdTU0MTdcdWZmMWYNCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19Db250ZW50RWxlbWVudF90ZXh0PVx1NTE4NVx1NWJiOVx1NTE0M1x1N2QyMFx1ZmYxYQ0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfQnJvd3NlQnV0dG9uTGFiZWw9XHU2ZDRmXHU4OWM4Li4uDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1cdTYzMDdcdTViOWFcdTY1YjBcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTc2ODRcdTU0MGRcdTc5ZjBcdTU0OGNcdTYzY2ZcdThmZjBcdTMwMDINCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZVRpdGxlPVx1NGZkZFx1NWI1OFx1NjZmNFx1NjUzOVx1NWU3Nlx1NTE3M1x1OTVlZFx1NjI0MFx1NjcwOVx1N2YxNlx1OGY5MVx1NTY2OA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9XHU1NzgyXHU3NmY0XHU1YmY5XHU5ZjUwXHU3YjJjXHU0ZTAwXHU0ZTJhXHU5MDA5XHU1YjlhXHU5ODc5DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1cdTRmZGRcdTViNTgNCi1BdHRhY2htZW50RGlhbG9nYXR0YWNoRmlsZV90ZXh0PVx1OTY0NFx1NTJhMFx1NjU4N1x1NGVmNg0KLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ9XHU5MTRkXHU3ZjZlXHU1MTg1XHU1YmI5DQotT3BlbkNvbmZpZ0RpYWxvZ29wZW5jb25maWdfdGV4dD1cdTYyNTNcdTVmMDBcdTkxNGRcdTdmNmUNCi1FbGVtZW50c1ZpZXdfcmVwbGFjZUFjdGlvbl90ZXh0PVx1NjZmZlx1NjM2Mi4uLg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9XHU2YjYzXHU1NzI4XHU0ZmRkXHU1YjU4IHswfQ0KLUNvbmZpZ3VyYXRpb25QYWdlX1Nob3dFcnJvclRvb2xUaXA9XHU2NjNlXHU3OTNhXHU5MTRkXHU3ZjZlXHU4YjY2XHU1NDRhXHU2NWU1XHU1ZmQ3XHU2N2U1XHU3NzBiXHU1NjY4DQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeD1cdTkxNGRcdTdmNmVcdWZmMWENCi0NCi1DaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0PVx1NjhjMFx1NjdlNVx1OTg3OVx1ZmYxYQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1cdTc5ZmJcdTUyYThcdTgyODJcdTcwYjkNCi1Db25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXA9XHU0ZmVlXHU1OTBkXHU5NTE5XHU4YmVmXHU1ZTc2XHU3ZWQzXHU2NzVmDQotTmV3UGx1Z2luRGlhbG9nX3JlZmVyZW5jZXBsdWdpbl90ZXh0PVx1NWYxNVx1NzUyOFx1NjNkMlx1NGVmNlx1ZmYxYQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9jcmVhdGVGcmVlVGV4dF90ZXh0PVx1NTIxYlx1NWVmYVx1ODFlYVx1NzUzMVx1NjU4N1x1NjcyYw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0xhYmVsPVx1ODI4Mlx1NzBiOVx1NTZmZVx1NjgwN1x1OTg4NFx1ODljOFx1ZmYxYQ0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0PUlVUEEwMDMyVzogXHU2NWUwXHU2Y2Q1XHU4ZmRlXHU2M2E1DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX3NhbWVwcmVkYW5kc3VjX3RleHQ9SVVQQTAwMzNXOiBcdTRlMGRcdTgwZmRcdTVjMDZcdTU0MGNcdTRlMDBcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTU0MGNcdTY1ZjZcdTRmNWNcdTRlM2FcdTUxNDhcdTg4NGNcdTRmNWNcdTRlMWFcdTU0OGNcdTU0MGVcdTdlZWRcdTRmNWNcdTRlMWENCi0NCi0jIEVkaXRvckNob29zZXINCi1FZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZT1cdTYyNTNcdTVmMDBcdTdmMTZcdThmOTFcdTU2NjgNCi1FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yPVx1NmI2NFx1NTE0M1x1N2QyMFx1NjcwOVx1OTUxOVx1OGJlZlx1MzAwMlx1NWVmYVx1OGJhZVx1NTE0OFx1NGZlZVx1NTkwZFx1OGZkOVx1NGU5Ylx1OTUxOVx1OGJlZlx1ZmYwY1x1NzEzNlx1NTQwZVx1NTE4ZFx1N2VlN1x1N2VlZFx1ZmYwOFx1OGJmN1x1NTNjMlx1OTYwNVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1ZmYwOVx1MzAwMlxuXA0KLVxuXA0KLVx1NTM1NVx1NTFmYlx1MjAxY1x1Nzg2ZVx1NWI5YVx1MjAxZFx1NTNlZlx1N2VlN1x1N2VlZFx1NjRjZFx1NGY1Y1x1ODAwY1x1NGUwZFx1NjI1M1x1NWYwMFx1N2YxNlx1OGY5MVx1NTY2OFx1MzAwMlx1NTE3M1x1OTVlZFx1NmI2NFx1NWJmOVx1OGJkZFx1Njg0Nlx1NTNlZlx1NjI1M1x1NWYwMFx1N2YxNlx1OGY5MVx1NTY2OFx1MzAwMg0KLUNvbmZpZ3VyYXRpb25QYWdlX0Zvcm1QcmVmaXg9XHU5MTRkXHU3ZjZlXHVmZjFhDQotDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZT1cdTU0MGRcdTc5ZjBcdWZmMWENCi1BdHRhY2htZW50RGlhbG9nRmlsZVVSTF90ZXh0PVx1NjU4N1x1NGVmNiBVUkxcdWZmMWENCi1TdGVwc09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uPVx1OTAwOVx1NjJlOVx1NjdkMFx1NGUyYVx1NmI2NVx1OWFhNFx1ZmYwY1x1NzEzNlx1NTQwZVx1NTM1NVx1NTFmYlx1MjAxY1x1NTQxMVx1NGUwYVx1MjAxZFx1NjIxNlx1MjAxY1x1NTQxMVx1NGUwYlx1MjAxZFx1ZmYwY1x1NTNlZlx1NjZmNFx1NjUzOVx1NWI4M1x1NzY4NFx1OTg3YVx1NWU4Zlx1MzAwMg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyX3NhdmU9XHU0ZmRkXHU1YjU4XHU2NzFmXHU5NWY0XHU1MWZhXHU5NTE5DQotTWVzc2FnZVZpZXdfZXJyZWxlbWVudF90ZXh0PVx1NWYxNVx1NzUyOFx1NTE0M1x1N2QyMA0KLU1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dD1cdTg4YWJcdTVmMTVcdTc1MjhcdTUxNDNcdTdkMjANCi0NCi0jQWN0aXZpdHkgRGlhZ3JhbQ0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9jcmVhdGVTdGFydE5vZGVfdGV4dD1cdTUyMWJcdTVlZmFcdTU0MmZcdTUyYThcdTgyODJcdTcwYjkNCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb249XHU5MDA5XHU2MmU5XHU2YjY0XHU5MTRkXHU3ZjZlXHU0ZTJkXHU1YzA2XHU1MzA1XHU1NDJiXHU3Njg0XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHUzMDAxXHU1MTg1XHU1YmI5XHU1MzA1XHU1NDhjXHU2ZDQxXHU3YTBiXHUzMDAyDQotQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb25fdGV4dD1cdTViOWFcdTUyMzZcdTdjN2JcdTUyMmJcdTc2ODRcdTUxODVcdTViYjlcdTUxNDNcdTdkMjBcdTk4N2FcdTVlOGZcdTViZjlcdThiZGRcdTY4NDYNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsPVx1NzZlZVx1NWY1NVx1ZmYxYQ0KLVJvb3RQcmVmUGFnZV9lbmFibGVwcm9jZXNzY29udHJpYnV0aW9uX3RleHQ9XHU1NDJmXHU3NTI4XHU2ZDQxXHU3YTBiXHU2M2QwXHU0ZjliDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbkxhYmVsPVx1NjNjZlx1OGZmMFx1ZmYxYQ0KLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9XHU5MDA5XHU2MmU5XHUyMDFjezB9XHUyMDFkXHU3Njg0XHU2M2QwXHU0ZjliXHU4MDA1DQotRWxlbWVudHNWaWV3X29wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbl90ZXh0PVx1OTAxYVx1OGZjN1x1NTNlZlx1NTNkOFx1NjAyN1x1NTE0M1x1N2QyMFx1NjI1M1x1NWYwMA0KLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1cdTkwMDlcdTYyZTlcdTIwMWN7MH1cdTIwMWRcdTc2ODRcdTUzZWZcdTUzZDhcdTYwMjdcdTUxNDNcdTdkMjANCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdmlld2VyTGFiZWw9XHUyMDFjezB9XHUyMDFkXHU3Njg0XHU1M2VmXHU1M2Q4XHU2MDI3XHU1MTQzXHU3ZDIwDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsPVx1NWY2Mlx1NzJiNlx1NTZmZVx1NjgwN1x1OTg4NFx1ODljOFx1ZmYxYQ0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ9XHU2NWUwXHU2Y2Q1XHU1MjIwXHU5NjY0DQotQWN0aXZpdHlEaWFncmFtRWRpdG9yX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1cdTYyNTNcdTVmMDBcdTZkM2JcdTUyYThcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTU2ZmUNCi1NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX2Rlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NjcwOVx1NTE3M1x1NmI2NFx1NjViOVx1NmNkNVx1NWU5M1x1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9XHU2ZTA1XHU5NjY0DQotV1BDb21wYXJ0bWVudEZpZ3VyZV8wPVx1NjViMFx1NWVmYVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NjNjZlx1OGZmMFx1N2IyNg0KLXByb21wdGZvcl9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkX3RleHQ9XHU1M2QxXHU1ZTAzXHU2MjE2XHU2ZDRmXHU4OWM4XHU2ZDQxXHU3YTBiXHU3ZjE2XHU4ZjkxXHU1NjY4XHU0ZTJkXHU1YzFhXHU2NzJhXHU1MjFiXHU1ZWZhXHU3Njg0XHU2ZDNiXHU1MmE4XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU1NmZlDQotcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVx1NTNkMVx1NWUwM1x1NjIxNlx1NmQ0Zlx1ODljOFx1NjcyYVx1NGZlZVx1NjUzOVx1NzY4NFx1NmQzYlx1NTJhOFx1NjI2OVx1NWM1NVx1NzY4NFx1NmQzYlx1NTJhOFx1NTZmZQ0KLQ0KLSNDb25maWdQcm9jZXNzVmlld0RpYWxvZw0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX05hbWVQYXR0ZXJuPVx1NTQwZFx1NzlmMFx1NmEyMVx1NWYwZlx1ZmYwOFx1NWMwNlx1NjYzZVx1NzkzYVx1NTMzOVx1OTE0ZFx1NzY4NFx1NTQwZFx1NzlmMFx1ZmYwOVx1ZmYxYQ0KLXNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uX2xhYmVsPVx1NzUyOFx1OGQ0NFx1NmU5MFx1NWJmY1x1ODIyYVx1NTY2OFx1NjYzZVx1NzkzYQ0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1BhdHRlcm49XHU2YTIxXHU1ZjBmXHU0ZWU1XHU5MDE3XHU1M2Y3XHU5Njk0XHU1ZjAwXHVmZjBjXHU1MTc2XHU0ZTJkICogXHU4ODY4XHU3OTNhXHU0ZWZiXHU2MTBmXHU1YjU3XHU3YjI2XHU0ZTMyXHVmZjBjPyBcdTg4NjhcdTc5M2FcdTRlZmJcdTYxMGZcdTViNTdcdTdiMjYNCi1lcnJfcHJvY2Vzc2luZ19maWxlX2Rlc2NyaXB0aW9uPUlVUEEwMDI5RTogXHU1OTA0XHU3NDA2XHU5MDA5XHU1YjlhXHU3Njg0XHU2NTg3XHU0ZWY2XHU2NWY2XHU1MWZhXHU5NTE5XHUzMDAyXHU4YmY3XHU1MzU1XHU1MWZiXHUyMDFjXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUyMDFkXHVmZjBjXHU4M2I3XHU1M2Q2XHU2NmY0XHU1OTFhXHU0ZmUxXHU2MDZmXHUzMDAyDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQ2F0ZWdvcnlUeXBlPVx1N2M3Ylx1NTIyYlx1N2M3Ylx1NTc4Ylx1ZmYxYQ0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX0JyaWVmRGVzY3JpcHRpb249XHU3YjgwXHU4OTgxXHU2M2NmXHU4ZmYwXHVmZjFhDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfU2VsZWN0Q2F0ZWdvcmllcz1cdTkwMDlcdTYyZTlcdTdjN2JcdTUyMmINCi0NCi0jbG9nIG1lc3NhZ2VzDQotY2hlYXRzaGVldF9sb2FkX2ZhaWx1cmVfbG9nX21zZz1cdTY3MmFcdTgwZmRcdTYyNTNcdTVmMDBcdThiZjdcdTZjNDJcdTc2ODRcdTU5MDdcdTVmZDhcdTUzNTVcdWZmMWENCi0NCi1uZXdDb25maWd1cmF0aW9uV2lyYXpkX2NyZWF0ZUVycm9yPUlVUEEwMDM1RTogXHU2NWUwXHU2Y2Q1XHU2MjEwXHU1MjlmXHU1MjFiXHU1ZWZhXHU5MTRkXHU3ZjZlDQotbmV3UGx1Z2luV2l6YXJkX2NyZWF0ZUVycm9yPUlVUEEwMDM2RTogXHU2NWUwXHU2Y2Q1XHU2MjEwXHU1MjlmXHU1MjFiXHU1ZWZhXHU2M2QyXHU0ZWY2DQotZXJyb3JEaWFsb2dfbW92ZUVycm9yPUlVUEEwMDM3RTogXHU2NWUwXHU2Y2Q1XHU2MjEwXHU1MjlmXHU3OWZiXHU1MmE4XHU1MTQzXHU3ZDIwDQotcmVuYW1lRGlhbG9nX3JlbmFtZUVycm9yPUlVUEEwMDM4RTogXHU2NWUwXHU2Y2Q1XHU2MjEwXHU1MjlmXHU5MWNkXHU1NDdkXHU1NDBkXHU1MTQzXHU3ZDIwDQotZXJyb3JEaWFsb2dfY3JlYXRlRXJyb3I9SVVQQTAwMzlFOiBcdTY1ZTBcdTZjZDVcdTYyMTBcdTUyOWZcdTUyMWJcdTVlZmFcdTUxNDNcdTdkMjANCi1kdXBsaWNhdGVQbHVnaW5OYW1lRXJyb3JfbXNnPUlVUEEwMTAxRTogXHU1NDBkXHU3OWYwXHUyMDFjezB9XHUyMDFkXHU1ZGYyXHU1YjU4XHU1NzI4XHUzMDAyXHU4YmY3XHU4ZjkzXHU1MTY1XHU1MTc2XHU0ZWQ2XHU1NDBkXHU3OWYwXHU1ZTc2XHU5MWNkXHU4YmQ1XHUzMDAyDQotDQotI05ldyBTdHJpbmdzIGZvciBQcm9jZXNzRWRpdG9yIENvbnRleHQgbWVudSBkaWFncmFtIGltYWdlcw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFESW1hZ2U9XHU1MjA2XHU5MTRkIEFEIFx1NTZmZVx1NTBjZi4uLg0KLVByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yVGl0bGU9XHU1MjM3XHU2NWIwXHU5NTE5XHU4YmVmDQotUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JNc2c9XHU1MjM3XHU2NWIwXHU3ZjE2XHU4ZjkxXHU1NjY4XHU2NWY2XHU1MWZhXHU5NTE5DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkQURESW1hZ2U9XHU1MjA2XHU5MTRkIEFERCBcdTU2ZmVcdTUwY2YuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRXUERJbWFnZT1cdTUyMDZcdTkxNGQgV1BEIFx1NTZmZVx1NTBjZi4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFESW1hZ2VJblB1Ymxpc2hpbmc9XHU1NzI4XHU1M2QxXHU1ZTAzXHU0ZTJkXHU0ZjdmXHU3NTI4IEFEIFx1NTZmZVx1NTBjZg0KLVByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVTdXBwcmVzcz1cdTVmYzVcdTk4N2JcdTUyMjBcdTk2NjRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTRlMmRcdTUyMTdcdTUxZmFcdTc2ODRcdTYyOTFcdTUyMzZcdTc2ODRcdTYzY2ZcdThmZjBcdTdiMjZcdWZmMGNcdTRlZTVcdTkwN2ZcdTUxNGRcdTU3MjhcdTYyOTFcdTUyMzZcdTkwMDlcdTViOWFcdTUxNDNcdTdkMjBcdTU0MGVcdTUxZmFcdTczYjBcdTkxY2RcdTU5MGRcdTMwMDJcdTU5ODJcdTY3OWNcdTg5ODFcdTUyMjBcdTk2NjRcdTViODNcdTRlZWNcdTVlNzZcdTdlZTdcdTdlZWRcdTRlMGJcdTUzYmJcdWZmMGNcdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdTc4NmVcdTViOWFcdTIwMWRcdTMwMDINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBRERJbWFnZUluUHVibGlzaGluZz1cdTU3MjhcdTUzZDFcdTVlMDNcdTRlMmRcdTRmN2ZcdTc1MjggQUREIFx1NTZmZVx1NTBjZg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZVdQREltYWdlSW5QdWJsaXNoaW5nPVx1NTcyOFx1NTNkMVx1NWUwM1x1NGUyZFx1NGY3Zlx1NzUyOCBXUEQgXHU1NmZlXHU1MGNmDQotUHJvY2Vzc0VkaXRvcl9EaWFncmFtSW1hZ2VfSW5wdXREaWFsb2dfaW5pdGlhbFZhbHVlPVx1NTZmZVx1NTBjZlx1OGRlZlx1NWY4NA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1Nob3dMaW5rZWRFbGVtZW50aW5MaWJyYXJ5Vmlldz1cdTU3MjhcdTVlOTNcdTg5YzZcdTU2ZmVcdTRlMmRcdTY2M2VcdTc5M2FcdTk0ZmVcdTYzYTVcdTUxNDNcdTdkMjAoJkgpDQotUHJvY2Vzc0VkaXRvcl91cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uX2xhYmVsPVx1NGVjZVx1NTdmYVx1NjcyY1x1NzUyOFx1NGY4Ylx1NjZmNFx1NjViMFx1NjI5MVx1NTIzNigmQikNCi1Qcm9jZXNzRWRpdG9yX0NvbnRleHRNZW51X0RpYWdyYW1JbWFnZXM9XHU1NmZlXHU3Njg0XHU1NmZlXHU1MGNmDQotDQotI1N0cmluZ3MgZm9yIHN5bmNocm9uaXphdGlvbiB3aXphcmQgb24gcHJvY2VzcyBlZGl0b3IncyBCUw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfdGl0bGU9XHU1NDBjXHU2YjY1XHU2M2NmXHU4ZmYwDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0PVx1OTYwNVx1OGJmYlx1NGUwYlx1OTc2Mlx1OGJmNFx1NjYwZVx1NWMwNlx1NWI4Y1x1NjIxMFx1NGVjMFx1NGU0OFx1NWI5YVx1NTIzNlx1NTQwY1x1NmI2NVx1NzY4NFx1NGZlMVx1NjA2Zlx1MzAwMg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlPVx1OTAwOVx1NjJlOVx1OTE0ZFx1N2Y2ZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ9XHU5MDA5XHU2MmU5XHU4OTgxXHU3NTI4XHU0ZThlXHU1NDBjXHU2YjY1XHU3Njg0XHU5MTRkXHU3ZjZlXHUzMDAyXA0KLVx1NjBhOFx1NzY4NFx1OTAwOVx1NjJlOVx1NTFiM1x1NWI5YVx1NTRlYVx1NGU5Ylx1NjNkMFx1NGY5Ylx1NTQ4Y1x1NjZmZlx1NjM2Mlx1NWMwNlx1NzUyOFx1NGU4ZVx1NTQwY1x1NmI2NVx1MzAwMg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX2NvbmZpZ0xhYmVsPVx1OTE0ZFx1N2Y2ZVx1ZmYxYQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90aXRsZT1cdTkwMDlcdTYyZTlcdTg5ODFcdTU0MGNcdTZiNjVcdTc2ODRcdTVjNWVcdTYwMjcNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJvcGVydGllc19sYWJsZT1cdTVjNWVcdTYwMjcNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbmFtZV9sYWJsZT1cdTU0MGRcdTc5ZjANCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJlc2VudGF0aW9uTmFtZV9sYWJsZT1cdTY2M2VcdTc5M2FcdTU0MGRcdTc5ZjANCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYnJpZWZEZXNjX2xhYmxlPVx1N2I4MFx1ODk4MVx1NjNjZlx1OGZmMA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vcHRpb25hbElub3V0c19sYWJlbD1cdTUzZWZcdTkwMDlcdThmOTNcdTUxNjUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbWFuZGF0b3J5SW5wdXRzX2xhYmxlPVx1NWYzYVx1NTIzNlx1OGY5M1x1NTE2NQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vdXRwdXRzX2xhYmVsPVx1OGY5M1x1NTFmYQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX2xhYmVsPVx1NGUzYlx1NjI2N1x1ODg0Y1x1ODAwNQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9hZGRuUGVyZm9ybWVyc19sYWJsZT1cdTUxNzZcdTRlZDZcdTYyNjdcdTg4NGNcdTgwMDUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcmVzcG9uc2libGVSb2xlc19sYWJsZT1cdThkMWZcdThkMjNcdTg5ZDJcdTgyNzINCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfY29udG5BcnRpZmFjdHNfbGFiZWw9XHU1MzA1XHU1NDJiXHU3Njg0XHU1ZGU1XHU0ZWY2DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2RpbHZlZFBhcnRzX2xhYmVsPVx1NTNlZlx1NGVhNFx1NGVkOFx1OTBlOFx1NGVmNg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxTdGVwc19sYWJlbD1cdTZiNjVcdTlhYTRcdTkwMDlcdTYyZTkNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGV4dD1cdTkwMDlcdTYyZTlcdTg5ODFcdTgwMDNcdTg2NTFcdThmZGJcdTg4NGNcdTU0MGNcdTZiNjVcdTc2ODRcdTY1YjlcdTZjZDVcdTUxODVcdTViYjlcdTc2ODRcdTVjNWVcdTYwMjdcdTMwMDINCi1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGl0bGU9XHU1NDBjXHU2YjY1XHU5ODg0XHU4OWM4DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQ9XHU2OGMwXHU2N2U1XHU0ZTBiXHU5NzYyXHU2M2QwXHU0ZjliXHU3Njg0XHU1NDBjXHU2YjY1XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotc2VsZWN0RWRpdG9yc1RvRGlzY2FyZENvbmZsaWN0Q2hhbmdlcz1cdTY3MmFcdTRmZGRcdTViNThcdTc2ODRcdTY2ZjRcdTY1MzlcdTRlMGVcdTU3MjhcdTdmMTZcdThmOTFcdTU2NjhcdTU5MTZcdTYyNDBcdTRmNWNcdTc2ODRcdTY2ZjRcdTY1MzlcdTUzZDFcdTc1MWZcdTUxYjJcdTdhODFcdTMwMDJcblwNCi1cdThiZjdcdTkwMDlcdTYyZTlcdTYwYThcdTYwZjNcdTVlOWZcdTVmMDNcdTUxNzZcdTY2ZjRcdTY1MzlcdTc2ODRcdTdmMTZcdThmOTFcdTU2NjhcdTMwMDINCi1zeW5jaHJvbml6YXRpb25XaXphcmRfdGl0bGVfdGV4dD1cdTU0MGNcdTZiNjVcdTU0MTFcdTViZmMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX2V4cGxhaW5UZXh0PVx1NmI2NFx1NTQxMVx1NWJmY1x1NjUyZlx1NjMwMVx1NTIzN1x1NjViMFx1OTAwOVx1NWI5YVx1NzY4NFx1NjNjZlx1OGZmMFx1N2IyNlx1ZmYwY1x1NjIxNlx1NTIzN1x1NjViMFx1OTAwOVx1NWI5YVx1NmQzYlx1NTJhOFx1NGUwYlx1NzY4NFx1MzAwMVx1NTcyOFx1NTQwNFx1ODFlYVx1MjAxY1x1NWM1ZVx1NjAyN1x1MjAxZFx1ODljNlx1NTZmZVx1MjAxY1x1NWUzOFx1ODljNFx1MjAxZFx1OTAwOVx1OTg3OVx1NTM2MVx1NGUyZFx1NjgwN1x1NGUzYVx1MjAxY1x1NGUwZVx1NmU5MFx1NTQwY1x1NmI2NVx1MjAxZFx1NzY4NFx1NjI0MFx1NjcwOVx1NjNjZlx1OGZmMFx1N2IyNlx1MzAwMlwNCi1cdTUzZWFcdTY3MDlcdTYwYThcdTU3MjhcdTZiNjRcdTU0MTFcdTViZmNcdTRlMmRcdTkwMDlcdTYyZTlcdTc2ODRcdTVjNWVcdTYwMjdcdWZmMGNcdTYyNGRcdTRmMWFcdTU3MjhcdTYzY2ZcdThmZjBcdTdiMjZcdTRlMmRcdTUyMzdcdTY1YjBcdTMwMDJcDQotXHU2MGE4XHU4ZmQ4XHU1M2VmXHU0ZWU1XHU5MDA5XHU2MmU5XHU0ZWZiXHU0ZjU1XHU2NzA5XHU2NTQ4XHU5MTRkXHU3ZjZlXHVmZjBjXHU4YmE5XHU2MGE4XHU3Njg0XHU2ZDQxXHU3YTBiXHU1NzI4XHU4YmExXHU3Yjk3XHU1MjM3XHU2NWIwXHU2NWY2XHU0ZjdmXHU3NTI4XHUzMDAyXA0KLVx1OGJmN1x1NmNlOFx1NjEwZlx1ZmYxYVx1NmI2NFx1NTQxMVx1NWJmY1x1NGUwZFx1NGYxYVx1NjZmNFx1NjViMFx1NjI0MFx1NjcwOVx1NTJhOFx1NjAwMVx1OTRmZVx1NjNhNVx1NzY4NFx1NjNjZlx1OGZmMFx1N2IyNlx1ZmYwOFx1NGVlNVx1N2VmZlx1ODI3Mlx1NjU5Y1x1NGY1M1x1NjYzZVx1NzkzYVx1ZmYwOVx1MzAwMg0KLQ0KLW9wZW5SVEU9XHU2MjUzXHU1ZjAwXHU1YmNjXHU2NTg3XHU2NzJjXHU2ODNjXHU1ZjBmXHU3ZjE2XHU4ZjkxXHU1NjY4DQotY2xvc2VSVEU9XHU1MTczXHU5NWVkXHU1YmNjXHU2NTg3XHU2NzJjXHU2ODNjXHU1ZjBmXHU3ZjE2XHU4ZjkxXHU1NjY4DQotDQotI05ldyBTdHJpbmdzDQotcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1kaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NmI2NFx1ODljNFx1N2EwYlx1NzY4NFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLXdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTdjN2JcdTU3OGJcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU2YjY0XHU1N2RmXHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHUzMDAyDQotdG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTVkZTVcdTUxNzdcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1jdXN0b21jYXRlZ29yeV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NmI2NFx1NWI5YVx1NTIzNlx1N2M3Ylx1NTIyYlx1NzY4NFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLWNvbmNlcHRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTY5ODJcdTVmZjVcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1jaGVja2xpc3RfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTY4MzhcdTViZjlcdTg4NjhcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU2YjY0XHU3OTNhXHU0ZjhiXHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHUzMDAyDQotZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU2YjY0XHU2MzA3XHU1MzU3XHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHUzMDAyDQotcm9hZG1hcF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NmI2NFx1OGRlZlx1N2ViZlx1NTZmZVx1NzY4NFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLXJldXNhYmxlYXNzZXRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTUzZWZcdTkxY2RcdTc1MjhcdThkNDRcdTRlYTdcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTY1MmZcdTYzMDFcdTY3NTBcdTY1OTlcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1yZXBvcnRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTYyYTVcdTU0NGFcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NmI2NFx1NWI5ZVx1OGRmNVx1NzY4NFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLXRlbXBsYXRlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU2YjY0XHU2YTIxXHU2NzdmXHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHUzMDAyDQotdGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTY3MmZcdThiZWRcdTViOWFcdTRlNDlcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi10b29sbWVudG9yX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU2YjY0XHU1ZGU1XHU1MTc3XHU1NDExXHU1YmZjXHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHUzMDAyDQotd2hpdGVwYXBlcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NmI2NFx1NzY3ZFx1NzZhZVx1NGU2Nlx1NzY4NFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU2YjY0XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5XHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotDQotI05ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbg0KLXJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1ODlkMlx1ODI3Mlx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXJvbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4OWQyXHU4MjcyXHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotcm9sZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTg5ZDJcdTgyNzJcdTRlMGVcdTUxNzZcdTRlZDZcdTg5ZDJcdTgyNzJcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi1yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1ODlkMlx1ODI3Mlx1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLXRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NGVmYlx1NTJhMVx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXRhc2tfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU0ZWZiXHU1MmExXHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotdGFza192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTRlZmJcdTUyYTFcdTRlMGVcdTUxNzZcdTRlZDZcdTRlZmJcdTUyYTFcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi10YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NGVmYlx1NTJhMVx1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLWFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTVkZTVcdTRlZjZcdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi1hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTVkZTVcdTRlZjZcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1hcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjPVx1NWI5YVx1NTIzNlx1NmI2NFx1NWRlNVx1NGVmNlx1NzY4NFx1NTZmZVx1NjgwN1x1MzAwMg0KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWRlNVx1NGVmNlx1NzY4NFx1NGVhNFx1NGVkOFx1NGZlMVx1NjA2Zlx1MzAwMg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTVkZTVcdTRlZjZcdTc2ODRcdTViOWFcdTUyMzZcdTRmZTFcdTYwNmZcdTMwMDINCi1hcnRpZmFjdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTVkZTVcdTRlZjZcdTRlMGVcdTUxNzZcdTRlZDZcdTVkZTVcdTRlZjZcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi1hcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTVkZTVcdTRlZjZcdTc2ODRcdTcyNDhcdTY3MmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi1vdXRjb21lX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTdlZDNcdTY3OWNcdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi1vdXRjb21lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1N2VkM1x1Njc5Y1x1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLW91dGNvbWVfaWNvblNlY3Rpb25fZGVzYz1cdTViOWFcdTUyMzZcdTZiNjRcdTdlZDNcdTY3OWNcdTc2ODRcdTU2ZmVcdTY4MDdcdTMwMDINCi1vdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1N2VkM1x1Njc5Y1x1NzY4NFx1NGVhNFx1NGVkOFx1NGZlMVx1NjA2Zlx1MzAwMg0KLW91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1N2VkM1x1Njc5Y1x1NzY4NFx1NWI5YVx1NTIzNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLW91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU3ZWQzXHU2NzljXHU0ZTBlXHU1MTc2XHU0ZWQ2XHU3ZWQzXHU2NzljXHU3Njg0XHU1MTczXHU3Y2ZiXHUzMDAyDQotb3V0Y29tZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTdlZDNcdTY3OWNcdTc2ODRcdTcyNDhcdTY3MmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi1kZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotZGVsaXZlcmFibGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYz1cdTViOWFcdTUyMzZcdTZiNjRcdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjZcdTc2ODRcdTU2ZmVcdTY4MDdcdTMwMDINCi1kZWxpdmVyYWJsZV9ub3RhdGlvblNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjZcdTc2ODRcdTRlYTRcdTRlZDhcdTRmZTFcdTYwNmZcdTMwMDINCi1kZWxpdmVyYWJsZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHU3Njg0XHU1YjlhXHU1MjM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotZGVsaXZlcmFibGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHU0ZTBlXHU1MTc2XHU0ZWQ2XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHU3Njg0XHU1MTczXHU3Y2ZiXHUzMDAyDQotZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotZGlzY2lwbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4OWM0XHU3YTBiXHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTg5YzRcdTdhMGJcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1kaXNjaXBsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1ODljNFx1N2EwYlx1NGUwZVx1NTE3Nlx1NGVkNlx1ODljNFx1N2EwYlx1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLWRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4OWM0XHU3YTBiXHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotZG9tYWluX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTU3ZGZcdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi1kb21haW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1N2RmXHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NTdkZlx1NGUwZVx1NTE3Nlx1NGVkNlx1NTdkZlx1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLWRvbWFpbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTU3ZGZcdTc2ODRcdTcyNDhcdTY3MmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi13b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1N2M3Ylx1NTc4Ylx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTdjN2JcdTU3OGJcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi13b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiXHU0ZTBlXHU1MTc2XHU0ZWQ2XHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiXHU3Njg0XHU1MTczXHU3Y2ZiXHUzMDAyDQotd29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1N2M3Ylx1NTc4Ylx1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLXJvbGVzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1ODlkMlx1ODI3Mlx1OTZjNlx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXJvbGVzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4OWQyXHU4MjcyXHU5NmM2XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotcm9sZXNldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTRlMGVcdTUxNzZcdTRlZDZcdTg5ZDJcdTgyNzJcdTk2YzZcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi1yb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1ODlkMlx1ODI3Mlx1OTZjNlx1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLXRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWRlNVx1NTE3N1x1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1ZGU1XHU1MTc3XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotdG9vbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTVkZTVcdTUxNzdcdTRlMGVcdTUxNzZcdTRlZDZcdTVkZTVcdTUxNzdcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi10b29sX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWRlNVx1NTE3N1x1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLWNvbmNlcHRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1Njk4Mlx1NWZmNVx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLWNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU2OTgyXHU1ZmY1XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTY5ODJcdTVmZjVcdTRlMGVcdTUxNzZcdTRlZDZcdTY5ODJcdTVmZjVcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi1jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1Njk4Mlx1NWZmNVx1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLWNoZWNrbGlzdF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2NzA5XHU1MTczXHU2YjY0XHU2ODM4XHU1YmY5XHU4ODY4XHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NjgzOFx1NWJmOVx1ODg2OFx1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTY4MzhcdTViZjlcdTg4NjhcdTRlMGVcdTUxNzZcdTRlZDZcdTY4MzhcdTViZjlcdTg4NjhcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi1jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2NzA5XHU1MTczXHU2YjY0XHU2ODM4XHU1YmY5XHU4ODY4XHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU3OTNhXHU0ZjhiXHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTc5M2FcdTRmOGJcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NzkzYVx1NGY4Ylx1NGUwZVx1NTE3Nlx1NGVkNlx1NzkzYVx1NGY4Ylx1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU3OTNhXHU0ZjhiXHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotZ3VpZGVsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTYzMDdcdTUzNTdcdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi1ndWlkZWxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU2MzA3XHU1MzU3XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotZ3VpZGVsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NjMwN1x1NTM1N1x1NGUwZVx1NTE3Nlx1NGVkNlx1NjMwN1x1NTM1N1x1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTYzMDdcdTUzNTdcdTc2ODRcdTcyNDhcdTY3MmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5XHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5XHU0ZTBlXHU1MTc2XHU0ZWQ2XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5XHU3Njg0XHU1MTczXHU3Y2ZiXHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5XHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotcHJhY3RpY2VfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWI5ZVx1OGRmNVx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXByYWN0aWNlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWI5ZVx1OGRmNVx1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLXByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NWI5ZVx1OGRmNVx1NGUwZVx1NTE3Nlx1NGVkNlx1NWI5ZVx1OGRmNVx1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLXByYWN0aWNlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWI5ZVx1OGRmNVx1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLXJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU2MmE1XHU1NDRhXHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NjJhNVx1NTQ0YVx1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLXJlcG9ydF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTYyYTVcdTU0NGFcdTRlMGVcdTUxNzZcdTRlZDZcdTYyYTVcdTU0NGFcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU2MmE1XHU1NDRhXHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotcmVzdWFibGVhc3NldF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1M2VmXHU5MWNkXHU3NTI4XHU4ZDQ0XHU0ZWE3XHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTUzZWZcdTkxY2RcdTc1MjhcdThkNDRcdTRlYTdcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1yZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NTNlZlx1OTFjZFx1NzUyOFx1OGQ0NFx1NGVhN1x1NGUwZVx1NTE3Nlx1NGVkNlx1NTNlZlx1OTFjZFx1NzUyOFx1OGQ0NFx1NGVhN1x1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLXJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1M2VmXHU5MWNkXHU3NTI4XHU4ZDQ0XHU0ZWE3XHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4ZGVmXHU3ZWJmXHU1NmZlXHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdThkZWZcdTdlYmZcdTU2ZmVcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1yb2FkbWFwX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1OGRlZlx1N2ViZlx1NTZmZVx1NGUwZVx1NTE3Nlx1NGVkNlx1OGRlZlx1N2ViZlx1NTZmZVx1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLXJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4ZGVmXHU3ZWJmXHU1NmZlXHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTY1MmZcdTYzMDFcdTY3NTBcdTY1OTlcdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU2NTJmXHU2MzAxXHU2NzUwXHU2NTk5XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NjUyZlx1NjMwMVx1Njc1MFx1NjU5OVx1NGUwZVx1NTE3Nlx1NGVkNlx1NjUyZlx1NjMwMVx1Njc1MFx1NjU5OVx1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLXN1cHBvcnRpbmdtYXRlcmlhbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTY1MmZcdTYzMDFcdTY3NTBcdTY1OTlcdTc2ODRcdTcyNDhcdTY3MmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU2YTIxXHU2NzdmXHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU2YTIxXHU2NzdmXHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU2YTIxXHU2NzdmXHU0ZTBlXHU1MTc2XHU0ZWQ2XHU2YTIxXHU2NzdmXHU3Njg0XHU1MTczXHU3Y2ZiXHUzMDAyDQotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU2YTIxXHU2NzdmXHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotdGVybWRlZmluaXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NjcyZlx1OGJlZFx1NWI5YVx1NGU0OVx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NjcyZlx1OGJlZFx1NWI5YVx1NGU0OVx1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NjcyZlx1OGJlZFx1NWI5YVx1NGU0OVx1NGUwZVx1NTE3Nlx1NGVkNlx1NjcyZlx1OGJlZFx1NWI5YVx1NGU0OVx1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NjcyZlx1OGJlZFx1NWI5YVx1NGU0OVx1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLXRvb2xtZW50b3JfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWRlNVx1NTE3N1x1NTQxMVx1NWJmY1x1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1ZGU1XHU1MTc3XHU1NDExXHU1YmZjXHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTVkZTVcdTUxNzdcdTU0MTFcdTViZmNcdTRlMGVcdTUxNzZcdTRlZDZcdTVkZTVcdTUxNzdcdTU0MTFcdTViZmNcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi10b29sbWVudG9yX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NjcwOVx1NTE3M1x1NmI2NFx1NWRlNVx1NTE3N1x1NTQxMVx1NWJmY1x1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLXdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NzY3ZFx1NzZhZVx1NGU2Nlx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXdoaXRlcGFwZXJfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU3NjdkXHU3NmFlXHU0ZTY2XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTc2N2RcdTc2YWVcdTRlNjZcdTRlMGVcdTUxNzZcdTRlZDZcdTc2N2RcdTc2YWVcdTRlNjZcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi13aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NzY3ZFx1NzZhZVx1NGU2Nlx1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLWRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4OWM0XHU3YTBiXHU1MjA2XHU3ZWM0XHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotZGlzY2lwbGluZWdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1ODljNFx1N2EwYlx1NTIwNlx1N2VjNFx1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTg5YzRcdTdhMGJcdTUyMDZcdTdlYzRcdTRlMGVcdTUxNzZcdTRlZDZcdTg5YzRcdTdhMGJcdTUyMDZcdTdlYzRcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4OWM0XHU3YTBiXHU1MjA2XHU3ZWM0XHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTUyMDZcdTdlYzRcdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi1yb2xlc2V0Z3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4OWQyXHU4MjcyXHU5NmM2XHU1MjA2XHU3ZWM0XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotcm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1ODlkMlx1ODI3Mlx1OTZjNlx1NTIwNlx1N2VjNFx1NGUwZVx1NTE3Nlx1NGVkNlx1ODlkMlx1ODI3Mlx1OTZjNlx1NTIwNlx1N2VjNFx1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLXJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTUyMDZcdTdlYzRcdTc2ODRcdTcyNDhcdTY3MmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1YjlhXHU1MjM2XHU3YzdiXHU1MjJiXHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1YjlhXHU1MjM2XHU3YzdiXHU1MjJiXHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU1YjlhXHU1MjM2XHU3YzdiXHU1MjJiXHU0ZTBlXHU1MTc2XHU0ZWQ2XHU1YjlhXHU1MjM2XHU3YzdiXHU1MjJiXHU3Njg0XHU1MTczXHU3Y2ZiXHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1YjlhXHU1MjM2XHU3YzdiXHU1MjJiXHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfSWNvblNlY3Rpb25fZGVzYz1cdTViOWFcdTUyMzZcdTZiNjRcdTViOWFcdTUyMzZcdTdjN2JcdTUyMmJcdTc2ODRcdTU2ZmVcdTY4MDdcdTMwMDINCi0NCi1jb25jZXB0X2ljb25TZWN0aW9uX2Rlc2M9XHU1YjlhXHU1MjM2XHU2YjY0XHU2OTgyXHU1ZmY1XHU3Njg0XHU1NmZlXHU2ODA3XHUzMDAyDQotY2hlY2tsaXN0X2ljb25TZWN0aW9uX2Rlc2M9XHU1YjlhXHU1MjM2XHU2YjY0XHU2ODM4XHU1YmY5XHU4ODY4XHU3Njg0XHU1NmZlXHU2ODA3XHUzMDAyDQotdG9vbG1lbnRvcl9pY29uU2VjdGlvbl9kZXNjPVx1NWI5YVx1NTIzNlx1NmI2NFx1NWRlNVx1NTE3N1x1NTQxMVx1NWJmY1x1NzY4NFx1NTZmZVx1NjgwN1x1MzAwMg0KLXdoaXRlcGFwZXJfaWNvblNlY3Rpb25fZGVzYz1cdTViOWFcdTUyMzZcdTZiNjRcdTc2N2RcdTc2YWVcdTRlNjZcdTc2ODRcdTU2ZmVcdTY4MDdcdTMwMDINCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjPVx1NWI5YVx1NTIzNlx1NmI2NFx1NGYzMFx1N2I5N1x1NmNlOFx1NjEwZlx1NGU4Ylx1OTg3OVx1NzY4NFx1NTZmZVx1NjgwN1x1MzAwMg0KLXRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M9XHU1YjlhXHU1MjM2XHU2YjY0XHU2NzJmXHU4YmVkXHU1YjlhXHU0ZTQ5XHU3Njg0XHU1NmZlXHU2ODA3XHUzMDAyDQotdGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYz1cdTViOWFcdTUyMzZcdTZiNjRcdTZhMjFcdTY3N2ZcdTc2ODRcdTU2ZmVcdTY4MDdcdTMwMDINCi1yZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M9XHU1YjlhXHU1MjM2XHU2YjY0XHU1M2VmXHU5MWNkXHU3NTI4XHU4ZDQ0XHU0ZWE3XHU3Njg0XHU1NmZlXHU2ODA3XHUzMDAyDQotcmVwb3J0X2ljb25TZWN0aW9uX2Rlc2M9XHU1YjlhXHU1MjM2XHU2YjY0XHU2MmE1XHU1NDRhXHU3Njg0XHU1NmZlXHU2ODA3XHUzMDAyDQotcHJhY3RpY2VfaWNvblNlY3Rpb25fZGVzYz1cdTViOWFcdTUyMzZcdTZiNjRcdTViOWVcdThkZjVcdTc2ODRcdTU2ZmVcdTY4MDdcdTMwMDINCi1leGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M9XHU1YjlhXHU1MjM2XHU2YjY0XHU3OTNhXHU0ZjhiXHU3Njg0XHU1NmZlXHU2ODA3XHUzMDAyDQotZ3VpZGVsaW5lX2ljb25TZWN0aW9uX2Rlc2M9XHU1YjlhXHU1MjM2XHU2YjY0XHU2MzA3XHU1MzU3XHU3Njg0XHU1NmZlXHU2ODA3XHUzMDAyDQotcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjPVx1NWI5YVx1NTIzNlx1NmI2NFx1OGRlZlx1N2ViZlx1NTZmZVx1NzY4NFx1NTZmZVx1NjgwN1x1MzAwMg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjPVx1NWI5YVx1NTIzNlx1NmI2NFx1NjUyZlx1NjMwMVx1Njc1MFx1NjU5OVx1NzY4NFx1NTZmZVx1NjgwN1x1MzAwMg0KLQ0KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX3RpdGxlPVx1NjU4N1x1NGVmNlx1NWRmMlx1NjZmNFx1NjUzOQ0KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2U9XHU1ZGYyXHU1NzI4XHU2NTg3XHU0ZWY2XHU3Y2ZiXHU3ZWRmXHU0ZTBhXHU2NmY0XHU2NTM5XHU0ZTg2XHU2NTg3XHU0ZWY2XHUzMDAyXHU2NjJmXHU1NDI2XHU4OTgxXHU4OGM1XHU1MTY1XHU4ZmQ5XHU0ZTliXHU2NmY0XHU2NTM5XHVmZjFmDQotDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU9XHU2ZDNiXHU1MmE4XHU1M2VmXHU1M2Q4XHU2MDI3DQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnPVx1NmQzYlx1NTJhOFx1MjAxY3swfVx1MjAxZFx1NjVlMFx1NmNkNVx1NzUyOFx1MjAxY3sxfVx1MjAxZFx1Njc2NVx1OGJiZVx1N2Y2ZVx1NTNlZlx1NTNkOFx1NjAyN1x1ZmYwY1x1NTZlMFx1NGUzYVx1MjAxY3sxfVx1MjAxZFx1NWRmMlx1NjcwOVx1NGUwMFx1OTg3OVx1NjIxNlx1NTkxYVx1OTg3OVx1NGY1Y1x1NGUzYVx1NTE3Nlx1NWI1MFx1NTE0M1x1N2QyMFx1NzY4NFx1NjNkMFx1NGY5Ylx1ZmYwZlx1NjZmZlx1NjM2Mlx1NmQzYlx1NTJhOFx1MzAwMg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzE9XHU2ZDNiXHU1MmE4XHUyMDFjezB9XHUyMDFkXHU2NWUwXHU2Y2Q1XHU3NTI4XHU1YjgzXHU3Njg0XHU0ZTAwXHU0ZTJhXHU3NmY0XHU2M2E1XHU3MjM2XHU1MTQzXHU3ZDIwXHU1NDhjXHU0ZWZiXHU0ZjU1XHU2ZDQxXHU3YTBiXHU2NzY1XHU4YmJlXHU3ZjZlXHU1M2VmXHU1M2Q4XHU2MDI3XHUzMDAyDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMj1cdTZkM2JcdTUyYThcdTIwMWN7MH1cdTIwMWRcdTY1ZTBcdTZjZDVcdTc1MjhcdTIwMWN7MX1cdTIwMWRcdTY3NjVcdThiYmVcdTdmNmVcdTUzZWZcdTUzZDhcdTYwMjdcdWZmMGNcdTU2ZTBcdTRlM2FcdThmZDlcdTVjMDZcdTRmMWFcdTViZmNcdTgxZjRcdTVmYWFcdTczYWZcdTc2ODRcdTRmOWRcdThkNTZcdTUxNzNcdTdjZmJcdTMwMDINCi0NCi1hcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlPVx1NWU5NFx1NzUyOFx1NmEyMVx1NWYwZg0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPVx1NmQzYlx1NTJhOFx1MjAxY3swfVx1MjAxZFx1NjVlMFx1NmNkNVx1NzUyOFx1MjAxY3sxfVx1MjAxZFx1Njc2NVx1NWU5NFx1NzUyOFx1NmEyMVx1NWYwZlx1ZmYwY1x1NTZlMFx1NGUzYVx1OGZkOVx1NWMwNlx1NGYxYVx1NWJmY1x1ODFmNFx1NWZhYVx1NzNhZlx1NzY4NFx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYlx1MzAwMg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlcj18DQotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9zaG93T3duZXJJbkxpYnJhcnlWaWV3PVx1NTcyOFx1NWU5M1x1ODljNlx1NTZmZVx1NGUyZFx1NjYzZVx1NzkzYVx1NmI2NFx1NjcyYVx1ODllM1x1Njc5MFx1NWYxNVx1NzUyOFx1NzY4NFx1NjJlNVx1NjcwOVx1ODAwNQ0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZT1cdTk2NjRcdTUzYmJcdTZiNjRcdTY3MmFcdTg5ZTNcdTY3OTBcdTc2ODRcdTVmMTVcdTc1MjgNCi1wcm9tcHREZWxldGVDdXN0b21DYXRlZ29yeUJlZm9yZVJlbW92ZUxhc3RSZWZUb0l0PVx1NjBhOFx1NWMwNlx1OTY2NFx1NTNiYlx1NjNkMlx1NGVmNlx1NGUyZFx1NWJmOSB7MH0gXHU3Njg0XHU2NzAwXHU1NDBlXHU1ZjE1XHU3NTI4XHUzMDAyXHU1YzA2XHU1MjIwXHU5NjY0XHU1MTQzXHU3ZDIwXHUzMDAyXHU4OTgxXHU3ZWU3XHU3ZWVkXHU1NDE3XHVmZjFmDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSNCZWxvdyBwcm9wZXJ0eSAiZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzIiBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQNCi0jRG9uJ3QgZGVsZXRlIGEgc3BhY2UgYWZ0ZXIgIjogIg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzPVx1ZmYxYQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOWIzY2IzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb3JtIFBhZ2UgVGl0bGVzDQotYXNzaWduUGFnZV90aXRsZT1cdTYzMDdcdTZkM2UNCi1jYXRlZ29yaWVzUGFnZV90aXRsZT1cdTdhMmVcdTk4NWUNCi1kZWxpdmVyYWJsZVBhcnRzUGFnZV90aXRsZT1cdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWVcdTdkNDRcdTRlZjYNCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9XHU4YWFhXHU2NjBlDQotZGlzY2lwbGluZXNQYWdlX3RpdGxlPVx1ODk4Zlx1N2JjNA0KLWRpc2NhcmR1bnJlc29sdmVkcmVmPVx1NjM2OFx1NjhjNFx1NjcyYVx1ODllM1x1Njc5MFx1NzY4NFx1NTNjM1x1NzE2Nw0KLWd1aWRhbmNlUGFnZV90aXRsZT1cdTYzMDdcdTVmMTUNCi1wcmV2aWV3UGFnZV90aXRsZT1cdTk4MTBcdTg5YmQNCi1yZWZlcmVuY2VzUGFnZV90aXRsZT1cdTUzYzNcdTcxNjcNCi1yZWZlcmVuY2VfdGV4dD1cdTUzYzNcdTcxNjdcdWZmMWENCi1yZWZlcmVuY2VXb3JrZmxvd1BhZ2VfdGl0bGU9XHU1M2MzXHU3MTY3XHU1ZGU1XHU0ZjVjXHU2ZDQxXHU3YTBiDQotcm9sZXNQYWdlX3RpdGxlPVx1ODlkMlx1ODI3Mg0KLXJvbGVTZXRzUGFnZV90aXRsZT1cdTg5ZDJcdTgyNzJcdTk2YzYNCi1zdGVwc1BhZ2VfdGl0bGU9XHU2YjY1XHU5YTVmDQotdGFza3NQYWdlX3RpdGxlPVx1NGY1Y1x1Njk2ZA0KLXRvb2xNZW50b3JzUGFnZV90aXRsZT1cdTVkZTVcdTUxNzdcdThmMTRcdTUyYTkNCi13b3JrUHJvZHVjdHNQYWdlX3RpdGxlPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLQ0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uDQotY2hlY2tJdGVtc1NlY3Rpb25fbmFtZT1cdTZhYTJcdTY3ZTVcdTk4MDVcdTc2ZWUNCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NjljYlx1NjIxMFx1NmI2NFx1NjgzOFx1NWMwZFx1NmUwNVx1NTVhZVx1NzY4NFx1NmFhMlx1NjdlNVx1OTgwNVx1NzZlZVx1MzAwMg0KLWRlcGVuZGVuY2llc1NlY3Rpb25fbmFtZT1cdTc2ZjhcdTRmOWRcdTk1ZGNcdTRmYzINCi1kZXBlbmRlbmNpZXNTZWN0aW9uX2Rlc2M9XHU2NzJjXHU3YmMwXHU5ODZmXHU3OTNhXHU2YjY0XHU1MTY3XHU1YmI5XHU1OTU3XHU0ZWY2XHU4MjA3XHU1MTc2XHU0ZWQ2XHU1MTY3XHU1YmI5XHU1OTU3XHU0ZWY2XHU3Njg0XHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyXHUzMDAyDQotZGV0YWlsU2VjdGlvbl9uYW1lPVx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYQ0KLWRldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjR7MH1cdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTMwMDINCi1nZW5lcmFsSW5mb1NlY3Rpb25fbmFtZT1cdTRlMDBcdTgyMmNcdThjYzdcdThhMGENCi1nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjR7MH1cdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1pY29uU2VjdGlvbl9uYW1lPVx1NTcxNlx1NzkzYQ0KLWljb25TZWN0aW9uX2Rlc2M9XHU4MWVhXHU4YTAyXHU2YjY0ezB9XHU3Njg0XHU1NzE2XHU3OTNhXHUzMDAyDQotbm90YXRpb25TZWN0aW9uX25hbWU9XHU5MDVlXHU5MDAxXHU4Y2M3XHU4YTBhDQotbm90YXRpb25TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0ezB9XHU3Njg0XHU0ZWE0XHU0ZWQ4XHU4Y2M3XHU4YTBhXHUzMDAyDQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX25hbWU9XHU1M2MzXHU3MTY3XHU3Njg0XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHVmZjFhDQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX2Rlc2M9XHU2NzJjXHU3YmMwXHU5ODZmXHU3OTNhXHU2YjY0XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHU2MjQwXHU1M2MzXHU3MTY3XHU3Njg0XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHUzMDAyDQotc3RhZmZpbmdTZWN0aW9uX25hbWU9XHU0ZWJhXHU1NGUxXHU5MTRkXHU3ZjZlXHU4Y2M3XHU4YTBhDQotc3RhZmZpbmdTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4OWQyXHU4MjcyXHU3Njg0XHU0ZWJhXHU1NGUxXHU5MTRkXHU3ZjZlXHU4Y2M3XHU4YTBhXHUzMDAyDQotc3RlcHNTZWN0aW9uX25hbWU9XHU2YjY1XHU5YTVmDQotc3RlcHNTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU1N2Y3XHU4ODRjXHU5MDE5XHU5ODA1XHU0ZjVjXHU2OTZkXHU3Njg0XHU2YjY1XHU5YTVmXHUzMDAyDQotdGFpbG9yaW5nU2VjdGlvbl9uYW1lPVx1OGFiZlx1NjU3NA0KLXRhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjR7MH1cdTc2ODRcdThhYmZcdTY1NzRcdThjYzdcdThhMGFcdTMwMDINCi12YXJpYWJpbGl0eVNlY3Rpb25fbmFtZT1cdTUxNjdcdTViYjlcdThiOGFcdTc1NzBcdTYwMjcNCi12YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjR7MH1cdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJ7MH1cdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi12ZXJzaW9uSW5mb1NlY3Rpb25fbmFtZT1cdTcyNDhcdTY3MmNcdThjYzdcdThhMGENCi12ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjR7MH1cdTc2ODRcdTcyNDhcdTY3MmNcdThjYzdcdThhMGFcdTMwMDINCi0NCi0jIFVJICYgRWxlbWVudCBBdHRyaWJ1dGUgTGFiZWxzDQotYWRkaXRpb25hbEluZm9fdGV4dD1cdTUxNzZcdTRlZDZcdThjYzdcdThhMGFcdWZmMWENCi1hcHBsaWNhdGlvbl90ZXh0PVx1NjFjOVx1NzUyOFx1N2EwYlx1NWYwZlx1ZmYxYQ0KLWFjdGlvbkxhYmVsX2VkaXQ9XHU3ZGU4XHU4ZjJmDQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1cdTU3MjhcdTdhMGJcdTVmMGZcdTVlYWJcdTg5OTZcdTU3MTZcdTRlMmRcdTk4NmZcdTc5M2ENCi1hbHRlcm5hdGl2ZXNfdGV4dD1cdTY2ZmZcdTRlZTNcdTY1YjlcdTY4NDhcdWZmMWENCi1hc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0PVx1NjMwN1x1NmQzZVx1NjViOVx1NmNkNVx1ZmYxYQ0KLWF1dGhvcnNfdGV4dD1cdTRmNWNcdTgwMDVcdWZmMWENCi1iYWNrZ3JvdW5kX3RleHQ9XHU4MGNjXHU2NjZmXHVmZjFhDQotYmFzZUVsZW1lbnRfdGV4dD1cdTU3ZmFcdTY3MmNcdWZmMWENCi1iYXNlR3VpZGFuY2VfdGV4dD1cdTU3ZmFcdTY3MmNcdTYzMDdcdTVmMTVcdWZmMWENCi1icmllZkRlc2NyaXB0aW9uX3RleHQ9XHU3YzIxXHU4OTgxXHU4YWFhXHU2NjBlXHVmZjFhDQotZGVzY3JpcHRpb25fdGV4dD1cdThhYWFcdTY2MGVcdWZmMWENCi1iYWNrdXBiZWZvcmVzYXZlX3RleHQ9XHU1MTMyXHU1YjU4XHU0ZTRiXHU1MjRkXHU1MDk5XHU0ZWZkDQotYnJpZWZPdXRsaW5lX3RleHQ9XHU3YzIxXHU3N2VkXHU2OTgyXHU4OTgxXHVmZjFhDQotY2hhbmdlRGF0ZV90ZXh0PVx1OGI4YVx1NjZmNFx1NjVlNVx1NjcxZlx1ZmYxYQ0KLWNoYW5nZURlc2NyaXB0aW9uX3RleHQ9XHU4YjhhXHU2NmY0XHU4YWFhXHU2NjBlXHVmZjFhDQotY2hlY2tJdGVtc190ZXh0PVx1NmFhMlx1NjdlNVx1OTgwNVx1NzZlZQ0KLWNvbnRyaWJ1dGVzX3RleHQ9XHU2M2QwXHU1MWZhDQotbG9jYWxDb250cmlidXRlc190ZXh0PUxvY2FsQ29udHJpYnV0ZXMNCi1jb250cmlidXRlc190b190ZXh0PVx1NjNkMFx1NTFmYVx1ODFmMw0KLWNvcHlyaWdodF90ZXh0PVx1ODQ1N1x1NGY1Y1x1NmIwYVx1ZmYxYQ0KLWVkaXRvcl90ZXh0PVx1N2RlOFx1OGYyZlx1NTY2OA0KLWV4dGVuZHNfdGV4dD1cdTVlZjZcdTRmMzgNCi1leHRlbmRfdGV4dD1cdTVlZjZcdTRmMzgNCi1leHRlcm5hbERlc2NyaXB0aW9uX3RleHQ9XHU1OTE2XHU5MGU4XHU4YWFhXHU2NjBlXHVmZjFhDQotZXh0ZXJuYWxJZF90ZXh0PVx1NTkxNlx1OTBlOCBJRFx1ZmYxYQ0KLWdvYWxzX3RleHQ9XHU3NmVlXHU2YTE5XHVmZjFhDQotaW1wYWN0T2ZOb3RIYXZpbmdfdGV4dD1cdTZiMjBcdTdmM2FcdTRlMGJcdTUyMTdcdTk4MDVcdTc2ZWVcdTc2ODRcdTVmNzFcdTk3ZmZcdWZmMWENCi1rZXlDb25zaWRlcmF0aW9uc190ZXh0PVx1NGUzYlx1ODk4MVx1ODAwM1x1OTFjZlx1ZmYxYQ0KLWxldmVsc09mQWRvcHRpb25fdGV4dD1cdTYzYTFcdTc1MjhcdTVjNjRcdTZiMjFcdWZmMWENCi1tYWluRGVzY3JpcHRpb25fdGV4dD1cdTRlM2JcdTg5ODFcdThhYWFcdTY2MGVcdWZmMWENCi1uZXdFbGVtZW50X3RleHQ9XHU2NWIwXHU1ZWZhIHswfQ0KLW5hbWVfdGV4dD1cdTU0MGRcdTdhMzFcdWZmMWENCi1ub3RBcHBsaWNhYmxlX3RleHQ9XHU0ZTBkXHU5MDY5XHU3NTI4DQotcGFja2FnaW5nR3VpZGFuY2VfdGV4dD1cdTU5NTdcdTg4ZGRcdTYzMDdcdTVmMTVcdWZmMWENCi1wcmVzZW50YXRpb25OYW1lX3RleHQ9XHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxXHVmZjFhDQotcHJvbXB0Zm9ybGliYXJ5X3RleHQ9XHU1NTVmXHU1MmQ1XHU2NjQyXHU2M2QwXHU3OTNhXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiDQotZW5hYmxlSGVhbHRoQ2hlY2tfdGV4dD1cdTU1NWZcdTc1MjhcdTUxNjdcdTkwZThcdTk2NjRcdTkzMmZcdTVkZTVcdTUxNzcNCi1wcm9ibGVtX3RleHQ9XHU1NTRmXHU5ODRjXHVmZjFhDQotcHVycG9zZV90ZXh0PVx1NzUyOFx1OTAxNFx1ZmYxYQ0KLXJlYXNvbkZvck5vdE5lZWRpbmdfdGV4dD1cdTRlMGRcdTk3MDBcdTg5ODFcdTc2ODRcdTUzOWZcdTU2ZTBcdWZmMWENCi1yZXBsYWNlc190ZXh0PVx1NTNkNlx1NGVlMw0KLWxvY2FsUmVwbGFjZXNfdGV4dD1Mb2NhbFJlcGxhY2VzDQotcmVwcmVzZW50YXRpb25PcHRpb25zX3RleHQ9XHU4ODY4XHU3OTNhXHU2Y2Q1XHU5MDc4XHU5ODA1XHVmZjFhDQotdGVtcGxhdGVGaWxlX3RleHQ9XHU3YmM0XHU2NzJjXHU2YTk0XHVmZjFhDQotc2tpbGxzX3RleHQ9XHU2MjgwXHU1ZGU3XHVmZjFhDQotc3RlcHNfdGV4dD1cdTZiNjVcdTlhNWZcdWZmMWENCi1zdGVwc19uYW1lX3RleHQ9XHU1NDBkXHU3YTMxXHVmZjFhDQotc3RvcF90ZXh0PVx1NTA1Y1x1NmI2Mg0KLXByaW50X3RleHQ9XHU1MjE3XHU1MzcwDQotc3lub255bXNfdGV4dD1cdTU0MGNcdTdmYTlcdTViNTdcdWZmMWENCi10eXBlX3RleHQ9XHU5ODVlXHU1NzhiXHVmZjFhDQotY29weV90ZXh0PVx1ODkwN1x1ODhmZA0KLWRlZXBDb3B5X3RleHQ9XHU2ZGYxXHU1YzY0XHU4OTA3XHU4OGZkDQotYmFja190ZXh0PVx1NGUwYVx1NGUwMFx1NmI2NQ0KLW5ld19wbHVnaW49XHU2NWIwXHU1ZWZhXHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotbW92ZT1cdTc5ZmJcdTUyZDUuLi4NCi11bmlxdWVJZF90ZXh0PVx1NTUyZlx1NGUwMCBJRFx1ZmYxYQ0KLXZhcmlhYmlsaXR5VHlwZV90ZXh0PVx1OGI4YVx1NzU3MFx1NjAyN1x1OTg1ZVx1NTc4Ylx1ZmYxYQ0KLXZlcnNpb25fdGV4dD1cdTcyNDhcdTY3MmNcdWZmMWENCi0NCi0jIEJ1dHRvbiBMYWJlbHMNCi1hZGRCdXR0b25fdGV4dD1cdTY1YjBcdTU4OWUuLi4NCi1hdHRhY2hCdXR0b25fdGV4dD1cdTk2NDRcdTUyYTAuLi4NCi1icm93c2VCdXR0b25fdGV4dD1cdTcwMGZcdTg5YmQuLi4NCi1jaGFuZ2VUeXBlQnV0dG9uX3RleHQ9XHU4YjhhXHU2NmY0XHU5ODVlXHU1NzhiLi4uDQotY2xlYXJCdXR0b25fdGV4dD1cdTZlMDVcdTk2NjQNCi1kZWxldGVCdXR0b25fdGV4dD1cdTUyMmFcdTk2NjQNCi1kZXRhY2hCdXR0b25fdGV4dD1cdTUyMDZcdTk1OGINCi1kaWFncmFtX3NhdmVFcnJvcj1cdTUxMzJcdTViNThcdTU3MTZcdTg5ZTNcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTQNCi1kb3duQnV0dG9uX3RleHQ9XHU0ZTBiDQotZGlyZWN0b3J5X3RleHQ9XHU3NmVlXHU5MzA0XHVmZjFhDQotb3JkZXJCdXR0b25fdGV4dD1cdTZiMjFcdTVlOGYNCi1lZGl0QnV0dG9uX3RleHQ9XHU3ZGU4XHU4ZjJmLi4uDQotcmVtb3ZlQnV0dG9uX3RleHQ9XHU3OWZiXHU5NjY0DQotcmVuYW1lQWN0aW9uX3RleHQ9XHU5MWNkXHU2NWIwXHU1NDdkXHU1NDBkLi4uDQotcmVtb3ZlX3RleHQ9XHU3OWZiXHU5NjY0DQotcmVuYW1lX3RleHQ9XHU5MWNkXHU2NWIwXHU1NDdkXHU1NDBkDQotU2F2ZUFzX3RleHQ9XHU1M2U2XHU1YjU4XHU2NWIwXHU2YTk0DQotc2VsZWN0QnV0dG9uX3RleHQ9XHU5MDc4XHU1M2Q2Li4uDQotZGVzZWxlY3RCdXR0b25fdGV4dD1cdTUzZDZcdTZkODhcdTkwNzhcdTUzZDYNCi11cEJ1dHRvbl90ZXh0PVx1NGUwYQ0KLW1ha2VEZWZhdWx0QnV0dG9uX3RleHQ9XHU4YTJkXHU3MGJhXHU5ODEwXHU4YTJkXHU1MDNjDQotdmlld0hpc3RvcnlCdXR0b25fdGV4dD1cdTZhYTJcdTg5OTZcdTZiNzdcdTdhMGIuLi4NCi0NCi0jIFJvbGUgRWRpdG9yIFRhc2tzIFBhZ2UNCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25OYW1lPVx1NGY1Y1x1Njk2ZA0KLXJvbGVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NmI2NFx1ODlkMlx1ODI3Mlx1NjYyZlx1NGUwYlx1NTIxN1x1NGY1Y1x1Njk2ZFx1NzY4NFx1NTdmN1x1ODg0Y1x1ODAwNVx1MzAwMg0KLXJvbGVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU3Njg0XHU0ZjVjXHU2OTZkDQotcm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsPVx1NGUzYlx1ODk4MVx1NTdmN1x1ODg0Y1x1ODAwNVx1ZmYxYQ0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHU1MTc2XHU0ZWQ2XHU1N2Y3XHU4ODRjXHU4MDA1XHVmZjFhDQotcm9sZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU0ZjVjXHU2OTZkXHUzMDAyDQotDQotIyBSb2xlIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdWZmMWENCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU2MzA3XHU1YjlhXHU2YjY0XHU4OWQyXHU4MjcyXHU4Y2EwXHU4Y2FjXHU3Njg0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHUzMDAyDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU3Njg0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHVmZjFhDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdThjYTBcdThjYWNcdWZmMWENCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTZiNjRcdTg5ZDJcdTgyNzJcdTU3ZjdcdTg4NGNcdTc2ODRcdTRmNWNcdTY5NmRcdTYyNDBcdThmMzhcdTUxZmFcdTc2ODRcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdWZmMWENCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHUzMDAyDQotDQotIyBSb2xlIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1cdTYzMDdcdTVmMTUNCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTRlZTVcdTYzMDdcdTVmMTVcdTVmNjJcdTVmMGZcdTYzZDBcdTRmOWJcdTUxNzZcdTRlZDZcdThjYzdcdThhMGFcdTc2ODRcdTkzYzhcdTdkNTBcdTMwMDINCi1yb2xlR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1NjMwN1x1NWYxNVx1ZmYxYQ0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTYzMDdcdTVmMTVcdWZmMWENCi1yb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDc4XHU1M2Q2IHswfSBcdTUwMGJcdTYzMDdcdTVmMTVcdTMwMDINCi0NCi0jIFJvbGUgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1cdTdhMmVcdTk4NWVcdWZmMWENCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NmI2NFx1ODlkMlx1ODI3Mlx1OTZiOFx1NWM2Y1x1NzY4NFx1N2EyZVx1OTg1ZVx1MzAwMg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTg5ZDJcdTgyNzJcdTk2YzZcdWZmMWENCi1yb2xlQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPVx1ODFlYVx1OGEwMlx1N2EyZVx1OTg1ZVx1ZmYxYQ0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPVx1ODlkMlx1ODI3Mlx1OTZjNlx1ZmYxYQ0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTgxZWFcdThhMDJcdTdhMmVcdTk4NWVcdWZmMWENCi0NCi0jIFRhc2sgRWRpdG9yIFJvbGVzIFBhZ2UNCi10YXNrUm9sZXNQYWdlX3NlY3Rpb25OYW1lPVx1ODlkMlx1ODI3Mg0KLXRhc2tSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NjMwN1x1NmQzZVx1ODlkMlx1ODI3Mlx1NGY4Nlx1NTdmN1x1ODg0Y1x1OTAxOVx1OTgwNVx1NGY1Y1x1Njk2ZFx1MzAwMg0KLXRhc2tSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU3Njg0XHU4OWQyXHU4MjcyXHVmZjFhDQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVx1NGUzYlx1ODk4MVx1NTdmN1x1ODg0Y1x1ODAwNVx1ZmYxYQ0KLXRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHU1MTc2XHU0ZWQ2XHU1N2Y3XHU4ODRjXHU4MDA1XHVmZjFhDQotdGFza1JvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU4OWQyXHU4MjcyXHUzMDAyDQotdGFza1JvbGVzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX21vZGlmeV9tZXNzYWdlPUlVUEEwMDA0NVc6IFx1NjBhOFx1ODk4MVx1NWMwN1x1NGUzYlx1ODk4MVx1NTdmN1x1ODg0Y1x1ODAwNVx1NjUzOVx1NzBiYSAnJ3swfScnIFx1NTVjZVx1ZmYxZg0KLXRhc2tSb2xlc1BhZ2VfY29uZmlybV90aXRsZT1cdTc4YmFcdThhOGRcdTRlM2JcdTg5ODFcdTg5ZDJcdTgyNzJcdThiOGFcdTY2ZjQNCi0NCi0jIFRhc2sgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTYzMDdcdTViOWFcdTkwMTlcdTk4MDVcdTRmNWNcdTY5NmRcdTc2ODRcdThmMzhcdTUxNjVcdTUzY2FcdThmMzhcdTUxZmFcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTMwMDINCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1MjhcdTc2ODRcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVx1NWZjNVx1ODk4MVx1OGYzOFx1NTE2NVx1ZmYxYQ0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1OTA3OFx1NzUyOFx1OGYzOFx1NTE2NVx1ZmYxYQ0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwzPVx1OGYzOFx1NTFmYVx1ZmYxYQ0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDc4XHU1M2Q2IHswfSBcdTUwMGJcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTMwMDINCi0NCi0jIFRhc2sgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPVx1NjMwN1x1NWYxNQ0KLXRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NGVlNVx1NjMwN1x1NWYxNVx1NWY2Mlx1NWYwZlx1NjNkMFx1NGY5Ylx1NTE3Nlx1NGVkNlx1OGNjN1x1OGEwYVx1NzY4NFx1OTNjOFx1N2Q1MFx1MzAwMg0KLXRhc2tHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU3Njg0XHU2MzA3XHU1ZjE1XHVmZjFhDQotdGFza0d1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPVx1NjMwN1x1NWYxNVx1ZmYxYQ0KLXRhc2tHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwNzhcdTUzZDYgezB9IFx1NTAwYlx1NjMwN1x1NWYxNVx1MzAwMg0KLQ0KLSMgVGFzayBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPVx1N2EyZVx1OTg1ZQ0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU5MDE5XHU5ODA1XHU0ZjVjXHU2OTZkXHU5NmI4XHU1YzZjXHU3Njg0XHU3YTJlXHU5ODVlXHUzMDAyDQotdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1ODk4Zlx1N2JjNA0KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU4OThmXHU3YmM0XHVmZjFhDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1ODFlYVx1OGEwMlx1N2EyZVx1OTg1ZVx1ZmYxYQ0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBUYXNrcyBQYWdlDQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbk5hbWU9XHU0ZjVjXHU2OTZkDQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPVx1NmI2NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NjYyZlx1NGUwYlx1NTIxN1x1NGY1Y1x1Njk2ZFx1NzY4NFx1OGYzOFx1NTE2NVx1NjIxNlx1OGYzOFx1NTFmYVx1MzAwMg0KLVdvcmtQcm9kdWN0X1Rhc2tzX0F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1NGY1Y1x1Njk2ZA0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWw9XHU1ZmM1XHU4OTgxXHU4ZjM4XHU1MTY1XHVmZjFhDQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDI9XHU5MDc4XHU3NTI4XHU4ZjM4XHU1MTY1XHVmZjFhDQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDM9XHU4ZjM4XHU1MWZhXHVmZjFhDQotV29ya1Byb2R1Y3RfVGFza3NfTXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwNzhcdTUzZDYgezB9IFx1NTAwYlx1NGY1Y1x1Njk2ZFx1MzAwMg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBSb2xlcyBQYWdlDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9XHU4OWQyXHU4MjcyDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NGUwYlx1NTIxN1x1ODlkMlx1ODI3Mlx1OGNhMFx1OGNhY1x1NjIxNlx1NGZlZVx1NjUzOVx1NmI2NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1MzAwMg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1ODlkMlx1ODI3Mg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU4Y2EwXHU4Y2FjXHU4OWQyXHU4MjcyXHVmZjFhDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHU0ZmVlXHU2NTM5XHU4OWQyXHU4MjcyXHVmZjFhDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwNzhcdTUzZDYgezB9IFx1NTAwYlx1ODlkMlx1ODI3Mlx1MzAwMg0KLQ0KLSMjIFdvcmsgUHJvZHVjdCBFZGl0b3IgRGVsaXZlcmFibGUgUGFydHMgUGFnZQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU9XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3ZDQ0XHU0ZWY2DQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU2MzA3XHU1YjlhXHU2OWNiXHU2MjEwXHU2YjY0XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHUzMDAyDQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1NzZcdTUwNWFcdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWVcdTc2ODRcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdWZmMWENCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlbGVjdGVkTGFiZWw9XHU3NTc2XHU1MDVhXHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3Njg0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHVmZjFhDQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHUzMDAyDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1cdTYzMDdcdTVmMTUNCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU0ZWU1XHU2MzA3XHU1ZjE1XHU1ZjYyXHU1ZjBmXHU2M2QwXHU0ZjliXHU1MTc2XHU0ZWQ2XHU4Y2M3XHU4YTBhXHU3Njg0XHU5M2M4XHU3ZDUwXHUzMDAyDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU3Njg0XHU2MzA3XHU1ZjE1XHVmZjFhDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTYzMDdcdTVmMTVcdWZmMWENCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU2MzA3XHU1ZjE1XHUzMDAyDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9XHU3YTJlXHU5ODVlDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU2YjY0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU5NmI4XHU1YzZjXHU3Njg0XHU3YTJlXHU5ODVlXHUzMDAyDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTk4MThcdTU3ZGYNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTk4NWVcdTU3OGJcdWZmMWENCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMz1cdTgxZWFcdThhMDJcdTdhMmVcdTk4NWVcdWZmMWENCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU5ODE4XHU1N2RmXHVmZjFhDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTk4NWVcdTU3OGJcdWZmMWENCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzPVx1ODFlYVx1OGEwMlx1N2EyZVx1OTg1ZVx1ZmYxYQ0KLQ0KLSMgUHJhY3RpY2UgRWRpdG9yIFJlZmVyZW5jZXMgUGFnZQ0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbk5hbWU9XHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU2MzA3XHU1YjlhXHU2YjY0XHU0ZjVjXHU2Y2Q1XHU2MjQwXHU1M2MzXHU3MTY3XHU3Njg0XHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwXHUzMDAyDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1MjhcdTc2ODRcdTUxNjdcdTViYjlcdTUxNDNcdTdkMjBcdWZmMWENCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwXHVmZjFhDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwXHUzMDAyDQotDQotIyBDYXRlZ29yeSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZT1cdTYzMDdcdTVmMTUNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM2Y1x1NjViY1x1NmI2NCB7MH0gXHU3Njg0XHU2MzA3XHU1ZjE1XHUzMDAyDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1NjMwN1x1NWYxNVx1ZmYxYQ0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPVx1NjMwN1x1NWYxNVx1ZmYxYQ0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU2MzA3XHU1ZjE1XHUzMDAyDQotDQotIyBEaXNjaXBsaW5lIEdyb3VwaW5nIEVkaXRvciBEaXNjaXBsaW5lcyBQYWdlDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25OYW1lPVx1ODk4Zlx1N2JjNA0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU2YjY0XHU4OThmXHU3YmM0XHU3ZmE0XHU3ZDQ0XHU3Njg0XHU4OThmXHU3YmM0XHUzMDAyDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1ODk4Zlx1N2JjNFx1ZmYxYQ0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWxlY3RlZExhYmVsPVx1ODk4Zlx1N2JjNFx1ZmYxYQ0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU4OThmXHU3YmM0XHUzMDAyDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Vc2VEZWZhdWx0RGlyZWN0b3J5QnV0dG9uTGFiZWw9XHU0ZjdmXHU3NTI4XHU5ODEwXHU4YTJkXHU3NmVlXHU5MzA0DQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBUYXNrcyBQYWdlDQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1cdTRmNWNcdTY5NmQNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTZiNjRcdTg5OGZcdTdiYzRcdTc2ODRcdTRmNWNcdTY5NmRcdTMwMDINCi1kaXNjaXBsaW5lVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1NGY1Y1x1Njk2ZFx1ZmYxYQ0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTRmNWNcdTY5NmRcdWZmMWENCi1kaXNjaXBsaW5lVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDc4XHU1M2Q2IHswfSBcdTUwMGJcdTRmNWNcdTY5NmRcdTMwMDINCi0NCi0jIERpc2NpcGxpbmUgRWRpdG9yIFJlZmVyZW5jZSBXb3JrZmxvdyBQYWdlDQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uTmFtZT1cdTUzYzNcdTcxNjdcdTVkZTVcdTRmNWNcdTZkNDFcdTdhMGINCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTZiNjRcdTg5OGZcdTdiYzRcdTc2ODRcdTUzYzNcdTcxNjdcdTVkZTVcdTRmNWNcdTZkNDFcdTdhMGJcdTMwMDINCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1NTNjM1x1NzE2N1x1NWRlNVx1NGY1Y1x1NmQ0MVx1N2EwYlx1ZmYxYQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTUzYzNcdTcxNjdcdTVkZTVcdTRmNWNcdTZkNDFcdTdhMGJcdWZmMWENCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDc4XHU1M2Q2IHswfSBcdTUwMGJcdTUzYzNcdTcxNjdcdTVkZTVcdTRmNWNcdTZkNDFcdTdhMGJcdTMwMDINCi0NCi0jIERvbWFpbiBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTZiNjRcdTk4MThcdTU3ZGZcdTc2ODRcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTMwMDINCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1ZmYxYQ0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdWZmMWENCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDc4XHU1M2Q2IHswfSBcdTUwMGJcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTMwMDINCi0NCi0jIFdvcmsgUHJvZHVjdCBLaW5kIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM2Y1x1NjViY1x1NmI2NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1OTg1ZVx1NTc4Ylx1NzY4NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1MzAwMg0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU3Njg0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHVmZjFhDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1ZmYxYQ0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwNzhcdTUzZDYgezB9IFx1NTAwYlx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1MzAwMg0KLQ0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPVx1ODlkMlx1ODI3Mlx1OTZjNg0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU2YjY0XHU4OWQyXHU4MjcyXHU5NmM2XHU3ZmE0XHU3ZDQ0XHU3Njg0XHU4OWQyXHU4MjcyXHU5NmM2XHUzMDAyDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1ODlkMlx1ODI3Mlx1OTZjNlx1ZmYxYQ0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWxlY3RlZExhYmVsPVx1ODlkMlx1ODI3Mlx1OTZjNlx1ZmYxYQ0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU4OWQyXHU4MjcyXHU5NmM2XHUzMDAyDQotDQotIyBSb2xlIFNldCBFZGl0b3IgUm9sZXMgUGFnZQ0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9XHU4OWQyXHU4MjcyDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU2YjY0XHU4OWQyXHU4MjcyXHU5NmM2XHU3Njg0XHU4OWQyXHU4MjcyXHUzMDAyDQotcm9sZVNldFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1MjhcdTc2ODRcdTg5ZDJcdTgyNzJcdWZmMWENCi1yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU4OWQyXHU4MjcyXHVmZjFhDQotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU4OWQyXHU4MjcyXHUzMDAyDQotDQotIyBUb29sIEVkaXRvciBUb29sIE1lbnRvcnMgUGFnZQ0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbk5hbWU9XHU1ZGU1XHU1MTc3XHU4ZjE0XHU1MmE5DQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU2YjY0XHU1ZGU1XHU1MTc3XHU3Njg0XHU1ZGU1XHU1MTc3XHU4ZjE0XHU1MmE5XHUzMDAyDQotdG9vbFRvb2xNZW50b3JzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1MjhcdTc2ODRcdTVkZTVcdTUxNzdcdThmMTRcdTUyYTlcdWZmMWENCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw9XHU1ZGU1XHU1MTc3XHU4ZjE0XHU1MmE5XHVmZjFhDQotdG9vbFRvb2xNZW50b3JzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU1ZGU1XHU1MTc3XHU4ZjE0XHU1MmE5XHUzMDAyDQotDQotIyBDdXN0b20gQ2F0ZWdvcnkgRWRpdG9yIEFzc2lnbiBQYWdlDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lPVx1NTE2N1x1NWJiOVx1NTE0M1x1N2QyMA0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU2OWNiXHU2MjEwXHU2YjY0XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlXHU3Njg0XHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwXHUzMDAyDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1NTE2N1x1NWJiOVx1NTE0M1x1N2QyMFx1ZmYxYQ0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWxlY3RlZExhYmVsPVx1NTE2N1x1NWJiOVx1NTE0M1x1N2QyMFx1ZmYxYQ0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwXHUzMDAyDQotDQotIyBOZXcgTWV0aG9kIFBsdWctaW4gV2l6YXJkDQotbmV3UGx1Z2luV2l6YXJkX3RpdGxlPVx1NjViMFx1NWVmYVx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLW5ld1BsdWdpbldpemFyZFBhZ2VfdGl0bGU9XHU1ZWZhXHU3YWNiXHU2NWIwXHU3Njg0XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0PVx1NjMwN1x1NWI5YVx1NjViMFx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1NzY4NFx1NTQwZFx1N2EzMVx1NGUyNlx1NjNkMFx1NGY5Ylx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLW5ld1BsdWdpbkVycm9yX21zZz1JVVBBMDAyMUU6IFx1NzEyMVx1NmNkNVx1NWVmYVx1N2FjYlx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1MzAwMg0KLW5ld1BsdWdpbkVycm9yX3JlYXNvbj1cdTUxNjdcdTkwZThcdTkzMmZcdThhYTRcdTMwMDJcblwNCi1cblwNCi1cdTU5ODJcdTk3MDBcdTc2ZjhcdTk1ZGNcdThjYzdcdThhMGFcdWZmMGNcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMGRcdTMwMDINCi0NCi0jIEdlbmVyaWMgZGlhbG9nIHRpdGxlcw0KLWNyZWF0ZURpYWxvZ190aXRsZT1cdTVlZmFcdTdhY2JcdTUxNDNcdTdkMjANCi1kZWxldGVEaWFsb2dfdGl0bGU9XHU1MjJhXHU5NjY0XHU1MTQzXHU3ZDIwDQotZWRpdERpYWxvZ190aXRsZT1cdTdkZThcdThmMmZcdTUxNDNcdTdkMjANCi1lcnJvckRpYWxvZ190aXRsZT1cdTkzMmZcdThhYTQNCi1tb3ZlRGlhbG9nX3RpdGxlPVx1NzlmYlx1NTJkNVx1NTE0M1x1N2QyMA0KLXJlbmFtZURpYWxvZ190aXRsZT1cdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGRcdTUxNDNcdTdkMjANCi13YXJuaW5nRGlhbG9nX3RpdGxlPVx1OGI2Nlx1NTQ0YQ0KLQ0KLSMgQWRkIENvbmZpZ3VyYXRpb24gdG8gUHJvY2VzcyBFcnJvciBEaWFsb2cNCi1hZGRDb25maWdFcnJvckRpYWxvZ190aXRsZT1cdTY1YjBcdTU4OWVcdTkxNGRcdTdmNmVcdTgxZjNcdTdhMGJcdTVlOGYNCi0NCi0jIFNldCBEZWZhdWx0IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotc2V0RGVmYXVsdENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPVx1OGEyZFx1NWI5YVx1N2EwYlx1NWU4Zlx1NzY4NFx1OTgxMFx1OGEyZFx1OTE0ZFx1N2Y2ZQ0KLQ0KLSMgRWRpdCBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlPVx1N2RlOFx1OGYyZlx1N2EwYlx1NWU4Zlx1NTE0M1x1N2QyMA0KLQ0KLSMgT3BlbiBMaWJyYXJ5IERpYWxvZw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlPVx1OTU4Ylx1NTU1Zlx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYg0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RleHQ9XHU3NmVlXHU1MjRkXHU3Njg0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2NzJhXHU2YjYzXHU3OGJhXHU1MTMyXHU1YjU4XHUzMDAyXHU2MGE4XHU4OTgxXHU1ZmZkXHU3NTY1XHU5MzJmXHU4YWE0XHU0ZTI2XHU3ZTdjXHU3ZThjXHU5NThiXHU1NTVmXHU1M2U2XHU0ZTAwXHU1MDBiXHU3YTBiXHU1ZjBmXHU1ZWFiXHU1NWNlXHVmZjFmDQotDQotIyBTYXZlIExpYnJhcnkgRGlhbG9nDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGU9XHU1MTMyXHU1YjU4XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dD1cdTVkZjJcdTRmZWVcdTY1MzlcdTc2ZWVcdTUyNGRcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMDJcdTYwYThcdTg5ODFcdTUxMzJcdTViNThcdThiOGFcdTY2ZjRcdTU1Y2VcdWZmMWYNCi0NCi0jIFVwZ3JhZGUgTGlicmFyeSBEaWFsb2cNCi11cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZT1cdTUzNDdcdTdkMWFcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWINCi0NCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cNCi1kZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PVx1NWRmMlx1NTIyYVx1OTY2NFx1NTE0M1x1N2QyMCAnJ3swfScnXHUzMDAyXHU2MGE4XHU4OTgxXHU1ZjllICcnezF9JycgXHU0ZTJkXHU3OWZiXHU5NjY0XHU2YjY0XHU1MTQzXHU3ZDIwXHU1NWNlXHVmZjFmDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLW5vT3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDBFOiBcdTY3MmFcdTk1OGJcdTU1NWZcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMDJcblwNCi1cblwNCi1cdTVmYzVcdTk4MDhcdTk1OGJcdTU1NWZcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdWZmMGNcdTYyNGRcdTgwZmRcdTY1YjBcdTU4OWVcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTMwMDJcblwNCi1cblwNCi1cdThhY2JcdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTYyMTZcdTk1OGJcdTU1NWZcdTczZmVcdTY3MDlcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEEwMDAxRTogXHU5MDdhXHU2ZjBmezB9XHU1NDBkXHU3YTMxXHUzMDAyXG5cDQotXG5cDQotXHU2MjQwXHU2NzA5XHU2NWI5XHU2Y2Q1XHU1NDhjXHU3YTBiXHU1ZThmXHU1MTQzXHU3ZDIwXHU5MGZkXHU1ZmM1XHU5ODA4XHU2NzA5XHU1NDBkXHU3YTMxXHUzMDAyXG5cDQotXG5cDQotXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU3OGJhXHU1YjlhXHUzMDBkXHVmZjBjXHU4ZjM4XHU1MTY1XHU1MTQzXHU3ZDIwXHU3Njg0XHU2NzA5XHU2NTQ4XHU1NDBkXHU3YTMxXHUzMDAyDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFOiBcdTU0MGRcdTdhMzEgJyd7MH0nJyBcdTVkZjJcdTViNThcdTU3MjhcdTMwMDJcblwNCi1cblwNCi1cdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTVmYzVcdTk4MDhcdTY3MDlcdTU1MmZcdTRlMDBcdTU0MGRcdTdhMzFcdTMwMDJcblwNCi1cblwNCi1cdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTc4YmFcdTViOWFcdTMwMGRcdWZmMGNcdThmMzhcdTUxNjVcdTRlMGRcdTU0MGNcdTc2ODRcdTUxNDNcdTdkMjBcdTU0MGRcdTdhMzFcdTMwMDINCi1jcmVhdGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDNFOiBcdTcxMjFcdTZjZDVcdTVlZmFcdTdhY2JcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDINCi1kZWxldGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDRXOiBcdTcxMjFcdTZjZDVcdTUyMmFcdTk2NjRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDINCi1pbnRlcm5hbEVycm9yX21zZz1JVVBBMDAwNUU6IFx1NzY3Y1x1NzUxZlx1NTE2N1x1OTBlOFx1OTMyZlx1OGFhNFx1MzAwMlxuXA0KLVxuXA0KLVx1NTk4Mlx1OTcwMFx1NzZmOFx1OTVkY1x1OGNjN1x1OGEwYVx1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwZFx1MzAwMg0KLWludmFsaWRQcmVzZW50YXRpb25OYW1lRXJyb3JfbXNnPUlVUEEwMDA2RTogXHU2MzA3XHU1YjlhXHU3Njg0XHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxXHU3MTIxXHU2NTQ4XHUzMDAyXG5cDQotXG5cDQotXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU3OGJhXHU1YjlhXHUzMDBkXHVmZjBjXHU4ZjM4XHU1MTY1XHU0ZTBkXHU1NDBjXHU3Njg0XHU1NDBkXHU3YTMxXHUzMDAyDQotaW52YWxpZENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwN0U6IFx1OTA3OFx1NTNkNlx1NzY4NFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZSAnJ3swfScnIFx1NGUwZFx1NjYyZlx1N2EwYlx1NWU4Zlx1NzY4NFx1OTgxMFx1OGEyZFx1OTE0ZFx1N2Y2ZVx1NzY4NFx1NWI1MFx1OTZjNlx1MzAwMlxuXA0KLVxuXA0KLVx1NzBiYVx1NGU4Nlx1NGZkZFx1NjMwMVx1N2EwYlx1NWU4Zlx1NzY4NFx1NWI4Y1x1NjU3NFx1NjAyN1x1ZmYwY1x1OTgxMFx1OGEyZFx1OTE0ZFx1N2Y2ZVx1NWZjNVx1OTgwOFx1NjYyZlx1N2EwYlx1NWU4Zlx1NzZmOFx1OTVkY1x1NGU0Ylx1NTE3Nlx1NGVkNlx1NjI0MFx1NjcwOVx1OTE0ZFx1N2Y2ZVx1NzY4NFx1OGQ4NVx1OTZjNlx1MzAwMlxuXA0KLVxuXA0KLVx1OGFjYlx1OTA3OFx1NTNkNlx1NTNlNlx1NGUwMFx1NTAwYlx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1NjIxNlx1NGZlZVx1NjUzOVx1OTgxMFx1OGEyZFx1OTE0ZFx1N2Y2ZVx1NGY4Nlx1NTMwNVx1NTQyYlx1OTA3OFx1NWI5YVx1OTE0ZFx1N2Y2ZVx1NzY4NFx1NTE2N1x1NWJiOVx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLXNldERlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDhFOiBcdTkwNzhcdTUzZDZcdTc2ODRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUgJyd7MH0nJyBcdTRlMGRcdTY2MmZcdTdhMGJcdTVlOGZcdTYyNDBcdTUzYzNcdTcxNjdcdTRlNGJcdTUxNzZcdTRlZDZcdTkxNGRcdTdmNmVcdTc2ODRcdThkODVcdTk2YzZcdTMwMDJcblwNCi1cblwNCi1cdTcwYmFcdTRlODZcdTRmZGRcdTYzMDFcdTdhMGJcdTVlOGZcdTc2ODRcdTViOGNcdTY1NzRcdTYwMjdcdWZmMGNcdTk4MTBcdThhMmRcdTkxNGRcdTdmNmVcdTVmYzVcdTk4MDhcdTY2MmZcdTdhMGJcdTVlOGZcdTc2ZjhcdTk1ZGNcdTRlNGJcdTUxNzZcdTRlZDZcdTYyNDBcdTY3MDlcdTkxNGRcdTdmNmVcdTc2ODRcdThkODVcdTk2YzZcdTMwMDJcblwNCi1cblwNCi1cdThhY2JcdTkwNzhcdTUzZDZcdTUzZTZcdTRlMDBcdTUwMGJcdTkxNGRcdTdmNmVcdWZmMGNcdTYyMTZcdTRmZWVcdTY1MzlcdTkwNzhcdTViOWFcdTkxNGRcdTdmNmVcdTc2ODRcdTUxNjdcdTViYjlcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi1vcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwOUU6IFx1NzEyMVx1NmNkNVx1OGYwOVx1NTE2NVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1MzAwMlxuXA0KLVxuXA0KLVx1NTk4Mlx1OTcwMFx1NzZmOFx1OTVkY1x1OGNjN1x1OGEwYVx1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwZFx1MzAwMg0KLXNhdmVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEwRTogXHU3MTIxXHU2Y2Q1XHU1MTMyXHU1YjU4XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHUzMDAyDQotc2F2ZUxpYnJhcnlUb0Vycm9yX21zZz1JVVBBMDAxMEU6IFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NzEyMVx1NmNkNVx1NTEzMlx1NWI1OFx1ODFmMyAnJ3swfScnXHUzMDAyDQotZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnPUlVUEEwMDExRTogXHU1ZGYyXHU1MjJhXHU5NjY0XHU1MTQzXHU3ZDIwICcnezB9JydcdTMwMDINCi11cGdyYWRlTGlicmFyeUVycm9yX21zZz1JVVBBMDAxMkU6IFx1NzEyMVx1NmNkNVx1NTM0N1x1N2QxYVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1MzAwMg0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1JVVBBMDAxNkU6IFx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNFx1MzAwMlxuXA0KLVxuXA0KLVx1NTk4Mlx1OTcwMFx1NzZmOFx1OTVkY1x1OGNjN1x1OGEwYVx1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwZFx1MzAwMg0KLWludGVybmFsRXJyb3JfcmVhc29uPUlVUEEwMDE3RTogXHU3NjdjXHU3NTFmXHU1MTY3XHU5MGU4XHU5MzJmXHU4YWE0XHUzMDAyXG5cDQotXG5cDQotXHU1OTgyXHU5NzAwXHU3NmY4XHU5NWRjXHU4Y2M3XHU4YTBhXHVmZjBjXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHUzMDBkXHUzMDAyDQotdXBncmFkZUxpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMThFOiBcdThmMDlcdTUxNjVcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTUxNDNcdTdkMjBcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdTMwMDJcblwNCi1cblwNCi1cdTU5ODJcdTk3MDBcdTc2ZjhcdTk1ZGNcdThjYzdcdThhMGFcdWZmMGNcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMGRcdTMwMDINCi1zYXZlVXBncmFkZWRMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE5RTogXHU1MTMyXHU1YjU4XHU1ZGYyXHU1MzQ3XHU3ZDFhXHU3Njg0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHUzMDAyXG5cDQotXG5cDQotXHU1OTgyXHU5NzAwXHU3NmY4XHU5NWRjXHU4Y2M3XHU4YTBhXHVmZjBjXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHUzMDBkXHUzMDAyDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLW9wZW5pbmdMaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1OTU4Ylx1NTU1Zlx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYi4uLg0KLXNhdmluZ0xpYnJhcnlUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU1MTMyXHU1YjU4XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiLi4uDQotdXBncmFkaW5nTGlicmFyeVRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTUzNDdcdTdkMWFcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWIuLi4NCi1sb2FkaW5nTGlicmFyeUVsZW1lbnRzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1OGYwOVx1NTE2NVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NTE0M1x1N2QyMC4uLg0KLXNhdmluZ1VwZ3JhZGVkRWxlbWVudHNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU0ZWU1XHU2NWIwXHU3Njg0XHU2YTk0XHU2ODQ4XHU2ODNjXHU1ZjBmXHU1MTMyXHU1YjU4XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1MTQzXHU3ZDIwLi4uDQotc2F2aW5nVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTEzMlx1NWI1OCAnJ3swfScnLi4uDQotc2F2aW5nRmlsZXNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU1MTMyXHU1YjU4XHU2YTk0XHU2ODQ4Li4uDQotZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU0ZmVlXHU2YjYzXHU1MTY3XHU1YmI5XHU4YWFhXHU2NjBlIEdVSUQuLi4NCi1kZWxldGluZ0ludmFsaWRSZWZlcmVuY2VzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTIyYVx1OTY2NFx1NzEyMVx1NjU0OFx1NTNjM1x1NzE2Ny4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IFx1NmI2NFx1ODk5Nlx1NjY2Zlx1NWRmMlx1NzI3OVx1NTIyNVx1OGEyZFx1OGEwOFx1OGI5M1x1NjBhOFx1NGVlNVx1NjcwMFx1NGY3M1x1NjViOVx1NWYwZlx1NzAwZlx1ODliZFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NTE0M1x1N2QyMFx1NzY4NCBIVE1MIFx1ODg2OFx1NzkzYVx1NmNkNVx1MzAwMlx1OTAxOVx1ODhlMVx1NzEyMVx1NmNkNVx1NjViMFx1NTg5ZVx1NjIxNlx1OTg2Zlx1NzkzYVx1NGVmYlx1NGY1NVx1N2RlOFx1OGYyZlx1NTY2OFx1MzAwMg0KLQ0KLSMgQ2hhbmdlIEhpc3RvcnkgRGlhbG9nDQotQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZT1cdThiOGFcdTY2ZjRcdThhYWFcdTY2MGVcdTZiNzdcdTdhMGINCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsPVx1OGI4YVx1NjZmNFx1NmI3N1x1N2EwYlx1ZmYxYQ0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVsZXRlIEFjdGlvbg0KLWNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU9XHU3OGJhXHU4YThkXHU1MjJhXHU5NjY0DQotY29uZmlybURlbGV0ZURpYWxvZ19tc2c9XHU2MGE4XHU3OGJhXHU1YjlhXHU4OTgxXHU1MjJhXHU5NjY0ICcnezB9JycgXHU1NWNlXHVmZjFmDQotY29uZmlybURlbGV0ZURpYWxvZ19tc2dXaXRoUmVmZXJlbmNlPVx1NjBhOFx1NzhiYVx1NWI5YVx1ODk4MVx1NTIyYVx1OTY2NCAnJ3swfScnIFx1NTVjZVx1ZmYxZlxuXA0KLVxuXA0KLVx1NGUwYlx1NTIxN1x1NTE0M1x1N2QyMFx1NTNjM1x1NzE2N1x1NTIzMFx1ODk4MVx1NTIyYVx1OTY2NFx1NzY4NFx1OTgwNVx1NzZlZVx1ZmYxYXsxfQ0KLQ0KLSMgTmV3IExpYnJhcnkgRGlhbG9nDQotZXJyb3JEaWFsb2dfbWVzc2FnZT1JVVBBMDAyMkU6IFx1NzEyMVx1NmNkNVx1NWVmYVx1N2FjYlx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYiAnJ3swfScnXHUzMDAyDQotZXJyb3JEaWFsb2dfZXJyb3I9XHU3MTIxXHU2Y2Q1XHU1NzI4XHU1M2U2XHU0ZTAwXHU1MDBiXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1MTY3XHU1MThkXHU1ZWZhXHU3YWNiXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHUzMDAyDQotZXJyX25vb3BlbmxpYnJhcnk9SVVQQTAwNDBFOiBcdTY3MmFcdTk1OGJcdTU1NWZcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMDJcblwNCi1cblwNCi1cdTVmYzVcdTk4MDhcdTk1OGJcdTU1NWZcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdWZmMGNcdTYyNGRcdTgwZmRcdTY1YjBcdTU4OWVcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTMwMDJcblwNCi1cblwNCi1cdThhY2JcdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTYyMTZcdTk1OGJcdTU1NWZcdTczZmVcdTY3MDlcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi1lcnJfbG9hZGluZ2xpYnJhcnk9XHU4ZjA5XHU1MTY1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotbXNnX3JlbG9hZExpYnJhcnk9XHU1ZmE5XHU1MzlmXHU1OTMxXHU2NTU3XHU3Njg0XHU1MjJhXHU5NjY0XHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHUzMDAyXHU1ZmM1XHU5ODA4XHU5MWNkXHU2NWIwXHU4ZjA5XHU1MTY1XHU3NmVlXHU1MjRkXHU3Njg0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHUzMDAyDQotDQotIyBSZWxvYWQgTGlicmFyeSBEaWFsb2cNCi1yZWxvYWREaWFsb2dfbWVzc2FnZT1cdTdhMGJcdTVmMGZcdTVlYWJcdTVmYzVcdTk4MDhcdTkxY2RcdTY1YjBcdThmMDlcdTUxNjVcdTRmODZcdTkwODRcdTUzOWZcdTgxZjNcdTUzOWZcdTU5Y2JcdTcyYzBcdTYxNGJcdTMwMDINCi1yZWxvYWREaWFsb2dfdGl0bGU9XHU5MWNkXHU2NWIwXHU4ZjA5XHU1MTY1XHU3YTBiXHU1ZjBmXHU1ZWFiDQotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yVGl0bGU9XHU3OWZiXHU1MmQ1XHU5MzJmXHU4YWE0DQotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yTWVzc2FnZT1cdTc5ZmJcdTUyZDVcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTQNCi0NCi0jIFByb2Nlc3MgRm9ybSBFZGl0b3INCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU9XHU1MTMyXHU1YjU4DQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxPVx1NmI2NFx1OGI4YVx1NjZmNFx1NWMwN1x1NWY3MVx1OTdmZlx1NmQ0MVx1N2EwYlx1NzY4NFx1NjI0MFx1NjcwOVx1NTcxNlx1ODllM1x1MzAwMlx1OGI4YVx1NjZmNFx1NGU0Ylx1NWY4Y1x1NWMwN1x1NTEzMlx1NWI1OFx1N2RlOFx1OGYyZlx1NTY2OFx1MzAwMlx1ODk4MVx1N2U3Y1x1N2U4Y1x1NTVjZVx1ZmYxZg0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMj1cdThiOGFcdTY2ZjRcdTRlNGJcdTVmOGNcdTVjMDdcdTUxMzJcdTViNThcdTdkZThcdThmMmZcdTU2NjhcdTMwMDJcdTg5ODFcdTdlN2NcdTdlOGNcdTU1Y2VcdWZmMWYNCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBQYWdlDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPVx1NzhiYVx1OGE4ZFx1NzlmYlx1OTY2NA0KLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlPVx1NjBhOFx1NzhiYVx1NWI5YVx1ODk4MVx1NzlmYlx1OTY2NFx1ODk5Nlx1NTcxNiAnJ3swfScnIFx1NTVjZVx1ZmYxZg0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ190aXRsZT1cdThiNjZcdTU0NGENCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uPVx1OTE0ZFx1N2Y2ZVx1ZmYxYQ0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3cz1cdTkxNGRcdTdmNmVcdTg5OTZcdTU3MTYNCi1jb25maWdWaWV3UGFnZV92aWV3cz1cdTg5OTZcdTU3MTYNCi1jb2x1bW5zZWxlY3Rpb25fdGV4dD1cdTc2ZjRcdTZiMDRcdTkwNzhcdTY0YzdcdWZmMWENCi1jb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dD1cdTY1YjBcdTU4OWVcdTg5OTZcdTU3MTYuLi4NCi1jb25maWdWaWV3UGFnZV9yZW1vdmVWaWV3QnV0dG9uVGV4dD1cdTc5ZmJcdTk2NjRcdTg5OTZcdTU3MTYNCi1jb25maWdWaWV3UGFnZV9tYWtlRGVmYXVsdEJ1dHRvblRleHQ9XHU4YTJkXHU3MGJhXHU5ODEwXHU4YTJkXHU1MDNjDQotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNXOiBcdTVkZjJcdTViNThcdTU3MjhcdTU0MGRcdTdhMzFcdTcwYmEgJyd7MH0nJyBcdTc2ODRcdTg5OTZcdTU3MTZcdTMwMDINCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25UaXRsZT1cdTVkZjJcdTc2N2NcdTRmNDhcdTc2ODRcdTVjMGVcdTg5YmRcdTg5OTZcdTU3MTYNCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25NZXNzYWdlPVx1NjMwN1x1NWI5YVx1NzY3Y1x1NGY0OFx1NmI2NFx1OTE0ZFx1N2Y2ZVx1NjY0Mlx1NWMwN1x1NTMwNVx1NTQyYlx1NzY4NFx1ODk5Nlx1NTcxNlx1MzAwMlx1ODJlNVx1ODk4MVx1NWVmYVx1N2FjYlx1ODk5Nlx1NTcxNlx1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1NjViMFx1NTg5ZVx1ODk5Nlx1NTcxNlx1MzAwZFx1ZmYwY1x1OTA3OFx1NTNkNlx1OTE0ZFx1N2Y2ZVx1NTE2N1x1NGVmYlx1NGY1NVx1NmExOVx1NmU5Nlx1NzY4NFx1NjIxNlx1ODFlYVx1OGEwMlx1NzY4NFx1N2EyZVx1OTg1ZVx1MzAwMlx1OTA3OFx1NTNkNlx1NzY4NFx1N2EyZVx1OTg1ZVx1NWMwN1x1NGVlM1x1ODg2OFx1ODk5Nlx1NTcxNlx1ZmYwY1x1N2EyZVx1OTg1ZVx1NzY4NFx1NmIyMVx1N2EyZVx1OTg1ZVx1NTQ4Y1x1NTE2N1x1NWJiOVx1NTE0M1x1N2QyMFx1NWMwN1x1NGVlM1x1ODg2OFx1ODk5Nlx1NTcxNlx1NzY4NFx1NmEzOVx1NzJjMFx1NTE0M1x1N2QyMFx1MzAwMg0KLQ0KLSMgRGVzY3JpcHRpb24gVGFiDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU9XHU4ZjQ5XHU2M2RiXHU2MzA3XHU1ZjE1DQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTE9SVVQQTAwNDBXOiBcdThhY2JcdTUxNDhcdTUxMzJcdTViNThcdTdkZThcdThmMmZcdTU2NjhcdTMwMDINCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMj1cdTZiNjRcdTk4NWVcdTU3OGJcdTZjOTJcdTY3MDlcdTc2ZjhcdTViYjlcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi0NCi1jaGFuZ2VBY3Rpdml0eVR5cGVXYXJuaW5nRGlhbG9nX3RpdGxlPVx1OGY0OVx1NjNkYlx1NmQzYlx1NTJkNQ0KLSMgQXNzb2NpYXRpb24gRm9ybSBQYWdlDQotQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWw9XHU5MDc4XHU1YjlhXHU1MTQzXHU3ZDIwXHU3Njg0XHU3YzIxXHU4OTgxXHU4YWFhXHU2NjBlXHVmZjFhDQotDQotIyBNZXRob2QgRWxlbWVudCBEZXNjcmlwdGlvbg0KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ190aXRsZT1cdThmMzhcdTUxNjVcdTUxNDNcdTdkMjBcdTU0MGRcdTdhMzENCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfbWVzc2FnZT1cdTU0MGRcdTdhMzFcdTZiMDRcdTRmNGRcdTRlMGRcdTgwZmRcdTdhN2FcdTc2N2RcdTMwMDINCi0NCi0jIE1ldGhvZCBQbHVnLWluIERlc2NyaXB0aW9uDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25SZW1vdmVSZWZDb25maXJtX21lc3NhZ2U9XHU1M2Q2XHU2ZDg4XHU5MDc4XHU1M2Q2XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmICcnezB9JycgXHU1M2MzXHU3MTY3XHU3Njg0XHU3NmY4XHU5NWRjXHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHVmZjBjXHU1YzA3XHU3NTIyXHU3NTFmXHU3MTIxXHU2NTQ4XHU3Njg0XHU5NWRjXHU0ZmMyXHVmZjBjXHU2NzAwXHU1ZjhjXHU2NzAzXHU1MjJhXHU5NjY0XHU5MDE5XHU0ZTliXHU5NWRjXHU0ZmMyXHUzMDAyXG5cDQotXG5cDQotXHU2YjY0XHU1MmQ1XHU0ZjVjXHU3MTIxXHU2Y2Q1XHU1ZmE5XHU1MzlmXHUzMDAyXHU2MGE4XHU4OTgxXHU3ZTdjXHU3ZThjXHU1YjhjXHU2MjEwXHU5MDE5XHU5ODA1XHU4YjhhXHU2NmY0XHU1NWNlXHVmZjFmDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU9XHU2MGE4XHU2ZTk2XHU1MDk5XHU1YzA3XHU2YjY0XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHU3Njg0XHU1NDBkXHU3YTMxICcnezB9JycgXHU2NTM5XHU3MGJhXHU2NWIwXHU1NDBkXHU3YTMxICcnezF9JydcdTMwMDJcdTZiNjRcdTUyZDVcdTRmNWNcdTY3MDNcdTUxMzJcdTViNThcdTZiNjRcdTdkZThcdThmMmZcdTU2NjhcdWZmMGNcdTRlMjZcdTVjMDdcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdThjYzdcdTY1OTlcdTU5M2VcdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGRcdTcwYmFcdTY1YjBcdTU0MGRcdTdhMzFcdTMwMDJcdTg5ODFcdTdlN2NcdTdlOGNcdTU1Y2VcdWZmMWYNCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZT1cdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGRcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYNCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY2Fubm90UmVuYW1lUGx1Z2luRm9sZGVyPVx1NzEyMVx1NmNkNVx1NWMwN1x1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1OGNjN1x1NjU5OVx1NTkzZVx1OTFjZFx1NjViMFx1NTQ3ZFx1NTQwZFx1NzBiYVx1NjViMFx1NTQwZFx1N2EzMQ0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luTGFiZWw9XHU5Mzk2XHU1YjlhXHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5fbWVzc2FnZT1cdTkzOTZcdTViOWFcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdThiOGFcdTY2ZjRcdTY3MDNcdTUxMzJcdTViNThcdTRlMjZcdTk1ZGNcdTk1ODlcdTVjNmNcdTY1YmNcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYgJyd7MH0nJyBcdTc2ODRcdTUxNDNcdTdkMjBcdTVkZjJcdTk1OGJcdTU1NWZcdTc2ODRcdTdkZThcdThmMmZcdTU2NjhcdTMwMDJcdTYwYThcdTg5ODFcdTdlN2NcdTdlOGNcdTkwMTlcdTk4MDVcdThiOGFcdTY2ZjRcdTU1Y2VcdWZmMWYNCi0NCi0jIFByb2Nlc3MgRGVzY3JpcHRpb24NCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV90aXRsZT1cdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGQNCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV9tZXNzYWdlPVx1NjBhOFx1NWMwN1x1OGI4YVx1NjZmNFx1NmI2NFx1N2EwYlx1NWU4Zlx1NzY4NFx1NTQwZFx1N2EzMVx1MzAwMlx1OTAxOVx1NmEyM1x1NjcwM1x1NTEzMlx1NWI1OFx1NmI2NFx1N2RlOFx1OGYyZlx1NTY2OFx1ZmYwY1x1NGUyNlx1NWMwN1x1N2EwYlx1NWU4Zlx1OGNjN1x1NjU5OVx1NTkzZVx1OTFjZFx1NjViMFx1NTQ3ZFx1NTQwZFx1NzBiYVx1NjViMFx1NTQwZFx1N2EzMVx1MzAwMlx1ODk4MVx1N2U3Y1x1N2U4Y1x1NTVjZVx1ZmYxZg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uRGVzY3JpcHRpb249XHU4YWFhXHU2NjBlXHVmZjFhDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uVGl0bGU9XHU5MTRkXHU3ZjZlDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uTWVzc2FnZT1cdTYzMDdcdTViOWFcdTZiNjRcdTZkNDFcdTdhMGJcdTY3MDlcdTY1NDhcdTc2ODRcdTYyNDBcdTY3MDlcdTkxNGRcdTdmNmVcdTMwMDJcdTkwNzhcdTUzZDZcdTRlMDBcdTUwMGJcdTkxNGRcdTdmNmVcdTUwNWFcdTcwYmFcdTk4MTBcdThhMmRcdTUwM2NcdWZmMGNcdTRmNDZcdTVmYzVcdTk4MDhcdTY2MmZcdTUxNzZcdTRlZDZcdTYyNDBcdTY3MDlcdTkxNGRcdTdmNmVcdTc2ODRcdThkODVcdTk2YzZcdTMwMDINCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbnM9XHU5MTRkXHU3ZjZlXHVmZjFhDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ9XHVmZjA4XHU5ODEwXHU4YTJkXHVmZjA5DQotUHJvY2Vzc0Rlc2NyaXB0aW9uX3NlbGVjdENvbmZpZ3VyYXRpb249XHU5MDc4XHU1M2Q2XHU4OTgxXHU2NWIwXHU1ODllXHU3Njg0XHU5MTRkXHU3ZjZlDQotUHJvY2Vzc0RlbGV0ZUFjdGlvbl9kZWxldGVjb2Zpcm1fdGV4dDA9XHU5MDE5XHU2YTIzXHU2NzAzXHU1MTMyXHU1YjU4XHU3NmVlXHU1MjRkXHU3Njg0XHU3ZGU4XHU4ZjJmXHU1NjY4XHVmZjBjXHU0ZTE0XHU1YzA3XHU2YzM4XHU0ZTQ1XHU4YjhhXHU2NmY0XHUzMDAyXHU2MGE4XHU3OGJhXHU1YjlhXHU4OTgxXHU1MjJhXHU5NjY0ICcnezB9JycgXHU1NWNlXHVmZjFmDQotUHJvY2Vzc0RlbGV0ZUFjdGlvbl9zZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlPVx1OTA3OFx1NTNkNlx1NzY4NFx1NTE0M1x1N2QyMFx1NTcyOFx1NTIyYVx1OTY2NFx1NGU0Ylx1NWY4Y1x1ZmYwY1x1NGUwYlx1NTIxN1x1NjNjZlx1OGZmMFx1NWI1MFx1NWMwN1x1NGUwZFx1NTE4ZFx1NGY3Zlx1NzUyOFx1MzAwMlxuXA0KLVx1OTA3OFx1NTNkNlx1NjBhOFx1ODk4MVx1NTIyYVx1OTY2NFx1NzY4NFx1NjNjZlx1OGZmMFx1NWI1MFx1MzAwMg0KLQ0KLSMgVmlldyBIZWxwZXINCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfdGl0bGU9XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2MDI3XHU4MGZkXHU3MmMwXHU2MTRiXHU2YWEyXHU2N2U1DQotdmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2s9XHU2YjYzXHU1NzI4XHU2YWEyXHU2N2U1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU3Njg0XHU1MDY1XHU1MTY4XHU3MmMwXHU2MTRiLi4uDQotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U9XHU1NzI4XHU5NThiXHU1NTVmXHU3Njg0XHU3YTBiXHU1ZjBmXHU1ZWFiXHU0ZTBhXHU1ZGYyXHU5ODA2XHU1MjI5XHU1YjhjXHU2MjEwXHU1MDY1XHU1MTY4XHU3MmMwXHU2MTRiXHU2YWEyXHU2N2U1XHUzMDAyXHU4YWNiXHU1M2MzXHU5NWIxXHU2NWU1XHU4YThjXHU2YTk0XHU3Njg0XHU1ODMxXHU1NDRhXHUzMDAyDQotDQotIyBBdHRhY2ggVGVtcGxhdGUgRmlsZSBEaWFsb2cNCi1hdHRhY2hUZW1wbGF0ZUZpbGVEaWFsb2dfdGl0bGU9XHU5NjQ0XHU1MmEwXHU3YmM0XHU2NzJjXHU2YTk0DQotDQotIyBDcmVhdGUgRWxlbWVudCBFcnJvciBEaWFsb2cNCi1jcmVhdGVFbGVtZW50RGlhbG9nX3RpdGxlPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NCB7MH0NCi1jcmVhdGVOZXdFbGVtZW50RXJyb3JfbXNnPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NCB7MH0gXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHUzMDAyDQotDQotZGxnVGl0bGVfcmVsb2FkTGlicmFyeT1cdTkxY2RcdTY1YjBcdThmMDlcdTUxNjVcdTdhMGJcdTVmMGZcdTVlYWINCi1jcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uPXswfSBcdTU0MGRcdTdhMzFcdTRlMGRcdTgwZmRcdTdhN2FcdTc2N2RcdTMwMDJcblwNCi1cblwNCi1cdThhY2JcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTc2ODRcdTU0MGRcdTdhMzFcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi1kZWxldGVDb25maWdFcnJvcl9yZWFzb249XHU5MTRkXHU3ZjZlXHU3NTMxXHU3YTBiXHU1ZThmICcnezB9JycgXHU2MjQwXHU1M2MzXHU3MTY3DQotIyBDaGFuZ2VCb3VuZHNDb21tYW5kDQotZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw9XHU4YjhhXHU2NmY0XHU3NTRjXHU5NjUwDQotIyBDaGFuZ2VOYW1lQ29tbWFuZA0KLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF9sYWJlbD1cdThiOGFcdTY2ZjRcdTU0MGRcdTdhMzENCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U9XHU3MTIxXHU2Y2Q1XHU1ZmE5XHU1MzlmXHU1NDBkXHU3YTMxXHU4YjhhXHU2NmY0XHUzMDAyXG5cDQotXG5cDQotXHU1OTgyXHU2NzljXHU1MjRkXHU0ZTAwXHU1MDBiXHU1NDBkXHU3YTMxXHU2NjJmXHU3YTdhXHU1MDNjXHVmZjBjXHU1MjQ3XHU0ZTBkXHU1MTQxXHU4YTMxXHU1ZmE5XHU1MzlmXHU1NDBkXHU3YTMxXHU4YjhhXHU2NmY0XHUzMDAyDQotIyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZA0KLWdlZl9jaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZF9sYWJlbD1cdThiOGFcdTY2ZjRcdTUxNjdcdTViYjlcdTUwM2MNCi0jIENyZWF0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfY3JlYXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1cdTVlZmFcdTdhY2JcdTVmNGVcdTY2ZjJcdTllZGUNCi0jIENyZWF0ZUxpbmtDb21tYW5kDQotZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsPVx1OTNjOFx1N2Q1MFx1NWVmYVx1N2FjYg0KLSMgQ3JlYXRlTm9kZUNvbW1hbmQNCi1nZWZfY3JlYXRlTm9kZUNvbW1hbmRfbGFiZWw9XHU1ZWZhXHU3YWNiXHU2NWIwXHU3Njg0XHU3YmMwXHU5ZWRlDQotIyBEZWxldGVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9XHU1MjJhXHU5NjY0XHU1ZjRlXHU2NmYyXHU5ZWRlDQotIyBEZWxldGVDb21tYW5kDQotZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw9XHU1MjJhXHU5NjY0DQotIyBEZWxldGVMaW5rQ29tbWFuZA0KLWdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbD1cdTUyMmFcdTk2NjRcdTkwMjNcdTdkZGENCi0jIE1vdmVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX21vdmVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPVx1NzlmYlx1NTJkNVx1NWY0ZVx1NjZmMlx1OWVkZQ0KLSMgUmVjb25uZWN0TGlua0NvbW1hbmQNCi1nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw9XHU5MWNkXHU2NWIwXHU5MDIzXHU2M2E1XHU5M2M4XHU3ZDUwDQotDQotIyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXINCi1nZWZfdmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1cdTU0MGRcdTdhMzFcdTRlMGRcdTgwZmRcdTdhN2FcdTc2N2RcdTMwMDJcdThhY2JcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTc2ODRcdTU0MGRcdTdhMzFcdTMwMDINCi0jIFZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyDQotZ2VmX3ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1cdTU0MGRcdTdhMzFcdTRlMGRcdTgwZmRcdTdhN2FcdTc2N2RcdTMwMDJcdThhY2JcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTc2ODRcdTU0MGRcdTdhMzFcdTMwMDINCi0jIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0DQotZ2VmX3dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0X3ZhbGlkYXRlTWVzc2FnZT1cdTU0MGRcdTdhMzFcdTRlMGRcdTgwZmRcdTdhN2FcdTc2N2RcdTMwMDJcdThhY2JcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTc2ODRcdTU0MGRcdTdhMzFcdTMwMDINCi0NCi0jIEVsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbg0KLWFjdGlvbnNfRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uX21lc3NhZ2U9XHU3MTIxXHU2Y2Q1XHU1MjJhXHU5NjY0XHU5MTRkXHU3ZjZlICcnezB9JydcdWZmMGNcdTU2ZTBcdTcwYmFcdTdhMGJcdTVlOGYgJyd7MX0nJyBcdTRlY2RcdTU3MjhcdTRmN2ZcdTc1MjhcdTZiNjRcdTkxNGRcdTdmNmVcdTMwMDINCi0NCi0jIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcg0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU9XHU1MjJhXHU5NjY0XHU5MzJmXHU4YWE0DQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JNZXNzYWdlPVx1NzEyMVx1NmNkNVx1ODY1NVx1NzQwNlx1NzY4NFx1NzU3MFx1NWUzOFx1NzJjMFx1NmNjMQ0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uPVx1OGFjYlx1NTNjM1x1OTViMVx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OQ0KLQ0KLSMgTWV0aG9kRWxlbWVudEVkaXRvcg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZT1cdTUxMzJcdTViNThcdTkzMmZcdThhYTQNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTE9SVVQQTAwMjBFOiBcdTUxMzJcdTViNThcdTZhOTRcdTY4NDhcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTQNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI9XHU3OGJhXHU1YjlhXHU5MzJmXHU4YWE0DQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjE9XHU4YWNiXHU1M2MzXHU5NWIxXHU2NWU1XHU4YThjXHU2YTk0XHU0Zjg2XHU1M2Q2XHU1Zjk3XHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5DQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjI9XHU4YWNiXHU1M2MzXHU5NWIxXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5DQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU9XHU5MWNkXHU2NWIwXHU1NDdkXHU1NDBkXHU5MzJmXHU4YWE0DQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JNc2c9XHU5MDE5XHU1MDBiXHU3ZGU4XHU4ZjJmXHU1NjY4XHU3Njg0XHU0ZTAwXHU2MjE2XHU1OTFhXHU1MDBiXHU2YTk0XHU2ODQ4XHU1ZGYyXHU3OWZiXHU5NjY0XHUzMDAyXHU3ZGU4XHU4ZjJmXHU1NjY4XHU1ZGYyXHU3MTIxXHU2NTQ4XHVmZjBjXHU1ZmM1XHU5ODA4XHU5NWRjXHU5NTg5XHUzMDAyDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZT1cdTcxMjFcdTY1NDhcdTc2ODRcdTdkZThcdThmMmZcdTU2NjgNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JNZXNzYWdlMT1cdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGRcdTZhOTRcdTY4NDggJyd7MH0nJyBcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTQNCi0NCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1yZW5hbWVFcnJvcl90aXRsZT1cdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGRcdTUxNDNcdTdkMjANCi1yZW5hbWVFcnJvcl9tc2c9SVVQQTAwMTNFOiBcdTcxMjFcdTZjZDVcdTViOGNcdTYyMTBcdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGRcdTRmNWNcdTY5NmRcdTMwMDINCi1TZWxlY3RFbGVtZW50RGlhbG9nX3NlbGVjdGVsZW1lbnRfdGV4dD1cdTkwNzhcdTUzZDZcdTUxNDNcdTdkMjANCi0NCi0jIEVkaXRvckNob29zZXINCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfdGl0bGU9XHU5NThiXHU1NTVmXHU2NWI5XHU2Y2Q1XHU3ZGU4XHU4ZjJmXHU1NjY4DQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZXNjcmlwdGlvbkxhYmVsPVx1OGFhYVx1NjYwZVx1ZmYxYQ0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbD1cdTUxNjhcdTkwNzgNCi1PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDA9XHU3ZGU4XHU4ZjJmXHU1MTQzXHU3ZDIwDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNFOiBcdTcxMjFcdTZjZDVcdTk1OGJcdTU1NWZcdTgyMDdcdTkwNzhcdTViOWFcdTMwMGNcdTY1YjlcdTZjZDVcdTMwMGRcdTUxNDNcdTdkMjBcdTc2ZjhcdTk1ZGNcdTc2ODRcdTdkZThcdThmMmZcdTU2NjhcdTMwMDINCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZT1cdTkwNzhcdTUzZDZcdTVmNzFcdTUwY2ZcdTZhOTQNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5TmFtZT1cdTY1YjBcdTVlZmFcdTdhMGJcdTVmMGZcdTVlYWINCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVzY3JpcHRpb25MYWJlbD1cdThhYWFcdTY2MGVcdWZmMWENCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1cdTkwNzhcdTUzZDZcdTRlMDBcdTYyMTZcdTU5MWFcdTUwMGJcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdWZmMGNcdTUxOGRcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTViOGNcdTYyMTBcdTMwMGRcdTRmODZcdTk1OGJcdTU1NWZcdTkxNGRcdTdmNmVcdTMwMDINCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfRGVzZWxlY3RBbGxCdXR0b25MYWJlbD1cdTUzZDZcdTZkODhcdTUxNjhcdTkwNzgNCi1FbGVtZW50c1ZpZXdfbWlncmF0aW9uX2Rpcl9kbGdfZGVzY3JpcHRpb25fdGV4dD1cdTYzMDdcdTViOWFcdTY1YjBcdTc5ZmJcdThmNDlcdTc2ODQgezB9IFx1NzY4NFx1NzZlZVx1OTMwNFx1NGY4Nlx1NTNkNlx1NGVlM1x1OTA3OFx1NTNkNlx1NzY4NCB7MH0NCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPVx1NzY3Y1x1NzUxZlx1N2NmYlx1N2Q3MVx1OTMyZlx1OGFhNFx1MzAwMlx1NTk4Mlx1OTcwMFx1NzZmOFx1OTVkY1x1OGNjN1x1OGEwYVx1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwZFx1MzAwMlxuXA0KLVxuXA0KLVx1OGFjYlx1OTVkY1x1OTU4OVx1NGUwMFx1NGU5Ylx1NWRmMlx1OTU4Ylx1NTU1Zlx1NzY4NFx1N2RlOFx1OGYyZlx1NTY2OFx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU9XHU1ZjcxXHU1MGNmXHU3MTIxXHU2NTQ4DQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMUU6IFx1OTA3OFx1NTNkNlx1NzY4NFx1NWY3MVx1NTBjZiAnJ3swfScnIFx1OGQ4NVx1OTA0ZVx1NWJiOVx1OGEzMVx1NzY4NFx1NTkyN1x1NWMwZiAoezF9IHggezJ9KVx1MzAwMlx1OGFjYlx1OTA3OFx1NTNkNlx1NTNlNlx1NGUwMFx1NTAwYlx1NWY3MVx1NTBjZlx1MzAwMg0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190aXRsZT1cdTVmNzFcdTUwY2ZcdTcxMjFcdTY1NDgNCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzJFOiBcdTkwNzhcdTUzZDZcdTc2ODRcdTZhOTRcdTY4NDggJyd7MH0nJyBcdTRlMGRcdTViNThcdTU3MjhcdTMwMDJcdThhY2JcdTkwNzhcdTUzZDZcdTUzZTZcdTRlMDBcdTUwMGJcdTVmNzFcdTUwY2ZcdTMwMDINCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9XHU5MDc4XHU1M2Q2Li4uDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uPVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1OGFhYVx1NjYwZQ0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1cdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdThhYWFcdTY2MGUNCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPVx1NWZjNVx1OTgwOFx1OTVkY1x1OTU4OVx1NjI0MFx1NjcwOVx1N2RlOFx1OGYyZlx1NTY2OFx1MzAwMlx1NTNlZlx1ODBmZFx1NzY4NFx1OGE3MVx1ZmYwY1x1OGFjYlx1NTE0OFx1OTA3OFx1NTNkNlx1OTcwMFx1ODk4MVx1NTEzMlx1NWI1OFx1NzY4NFx1N2RlOFx1OGYyZlx1NTY2OFx1MzAwMg0KLQ0KLSMgVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2UNCi1mb3Jtc19UZW1wbGF0ZURlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPVx1OTA3OFx1NTNkNlx1NzY4NFx1NmE5NFx1Njg0OFx1NWRmMlx1N2Q5M1x1NjYyZlx1NmI2NFx1MzAwY1x1N2JjNFx1NjcyY1x1MzAwZFx1NzY4NFx1OTY0NFx1NGVmNlx1MzAwMg0KLQ0KLSMgTmV3IExpYnJhcnkgRXJyb3IgRGlhbG9nDQotbmV3TGlicmFyeUVycm9yX21zZz1JVVBBMDAxNEU6IFx1NzEyMVx1NmNkNVx1NWVmYVx1N2FjYlx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1MzAwMg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24xPVx1NjMwN1x1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1OGRlZlx1NWY5MSAnJ3swfScnIFx1NzEyMVx1NjU0OFx1MzAwMg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24yPVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NWRmMlx1NWI1OFx1NTcyOCAnJ3swfScnIFx1NGUyZFx1MzAwMg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24zPVx1NzEyMVx1NmNkNVx1NWVmYVx1N2FjYlx1NjMwN1x1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1OGNjN1x1NjU5OVx1NTkzZSAnJ3swfScnXHUzMDAyDQotbmV3TGlicmFyeUVycm9yX2FkdmljZT1cdTkwNzhcdTUzZDZcdTMwMGNcdTc4YmFcdTViOWFcdTMwMGRcdWZmMGNcdTRlMjZcdThmMzhcdTUxNjVcdTdhMGJcdTVmMGZcdTVlYWJcdTc2ODRcdTUxNzZcdTRlZDZcdTU0MGRcdTdhMzFcdTYyMTZcdThkZWZcdTVmOTFcdTMwMDINCi0NCi0jUHJvY2VzcyBsaXRlcmFscw0KLVByb2Nlc3NfRXh0ZXJuYWxJRD1cdTU5MTZcdTkwZTggSURcdWZmMWENCi1Qcm9jZXNzX1B1cnBvc2U9XHU3NTI4XHU5MDE0XHVmZjFhDQotUHJvY2Vzc19TY29wZT1cdTdiYzRcdTU3MGRcdWZmMWENCi1Qcm9jZXNzX1VzYWdlTm90ZXM9XHU0ZjdmXHU3NTI4XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODA1XHVmZjFhDQotUHJvY2Vzc19BbHRlcm5hdGl2ZXM9XHU2NmZmXHU0ZWUzXHU2NWI5XHU2ODQ4XHVmZjFhDQotUHJvY2Vzc19Ib3dUb1N0YWZmPVx1NTk4Mlx1NGY1NVx1OTE0ZFx1N2Y2ZVx1NGViYVx1NTRlMVx1ZmYxYQ0KLVByb2Nlc3NfS2V5Q29uc2lkZXJhdGlvbj1cdTRlM2JcdTg5ODFcdTgwMDNcdTkxY2ZcdWZmMWENCi1Qcm9jZXNzX1NjYWxlPVx1NmJkNFx1NGY4Ylx1ZmYxYQ0KLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1cdTVjMDhcdTY4NDhcdTYwMjdcdThjZWFcdWZmMWENCi1Qcm9jZXNzX1Jpc2tMZXZlbD1cdTk4YThcdTk2YWFcdTdiNDlcdTdkMWFcdWZmMWENCi1Qcm9jZXNzX0VzdGltYXRpbmdUZWNobmlxdWU9XHU5ODEwXHU0ZjMwXHU2MjgwXHU4ODUzXHVmZjFhDQotUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPVx1NWMwOFx1Njg0OFx1NjIxMFx1NTRlMVx1NWMwOFx1Njk2ZFx1NzdlNVx1OGI1OFx1ZmYxYQ0KLVByb2Nlc3NfVHlwZU9mQ29udHJhY3Q9XHU1NDA4XHU3ZDA0XHU5ODVlXHU1NzhiXHVmZjFhDQotDQotIyBFZGl0b3IgUHJldmlldyBOYXZpZ2F0aW9uIEJ1dHRvbnMNCi1iYWNrQnV0dG9uX3RleHQ9XHU0ZTBhXHU0ZTAwXHU2YjY1DQotZm9yd2FyZEJ1dHRvbl90ZXh0PVx1NGUwYlx1NGUwMFx1NmI2NQ0KLWZvcndhcmRfdGV4dD1cdTRlMGJcdTRlMDBcdTZiNjUNCi1zdG9wQnV0dG9uX3RleHQ9XHU1MDVjXHU2YjYyDQotcmVmcmVzaEJ1dHRvbl90ZXh0PVx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNg0KLXJlZnJlc2hfdGV4dD1cdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDYNCi1uZXduYW1lX3RleHQ9XHU2NWIwXHU1NDBkXHU3YTMxXHVmZjFhDQotcHJpbnRCdXR0b25fdGV4dD1cdTUyMTdcdTUzNzANCi0NCi0jIENvbnRleHQgbWVudXMNCi1fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW09XHU5MWNkXHU2NWIwXHU2NTc0XHU3NDA2KCZSKQ0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPVx1OTg2Zlx1NzkzYVx1NTE2N1x1NWJiOSgmUykNCi0NCi1fVUlfTWV0aG9kRWRpdG9yX21lbnU9XHU2NWI5XHU2Y2Q1XHU3ZGU4XHU4ZjJmXHU1NjY4KCZNKQ0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09XHU2NWIwXHU1ZWZhKCZOKQ0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1cdTY1YjBcdTVlZmFcdTU0MGNcdTVjNjRcdTdkMWFcdTk4MDUoJkUpDQotDQotX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWw9XHU5MDc4XHU5ODA1DQotX1VJX1BhcmVudFBhZ2VfbGFiZWw9XHU2YmNkXHU5ODA1DQotX1VJX0xpc3RQYWdlX2xhYmVsPVx1NmUwNVx1NTVhZQ0KLV9VSV9UcmVlUGFnZV9sYWJlbD1cdTZhMzlcdTcyYzBcdTdkNTBcdTY5Y2INCi1fVUlfVGFibGVQYWdlX2xhYmVsPVx1ODg2OFx1NjgzYw0KLV9VSV9UYWJsZVRyZWVQYWdlX2xhYmVsPVx1ODg2OFx1NjgzY1x1NmEzOQ0KLV9VSV9PYmplY3RDb2x1bW5fbGFiZWw9XHU3MjY5XHU0ZWY2DQotX1VJX1NlbGZDb2x1bW5fbGFiZWw9XHU4MWVhXHU4ZWFiDQotDQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9XHU1MTY4XHU2NzJhXHU5MDc4DQotX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkPVx1NWRmMlx1OTA3OFx1NTNkNlx1NzY4NFx1NzI2OVx1NGVmNlx1ZmYxYXswfQ0KLV9VSV9NdWx0aU9iamVjdFNlbGVjdGVkPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU3MjY5XHU0ZWY2DQotDQotX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbD1cdTk1OGJcdTU1NWZcdTdkZThcdThmMmZcdTU2NjgNCi0NCi1fVUlfV2l6YXJkX2NhdGVnb3J5PVx1N2JjNFx1NGY4YiBFTUYgXHU2YTIxXHU1NzhiXHU1ZWZhXHU3YWNiXHU3Y2JlXHU5NzQ4DQotDQotX1VJX01ldGhvZE1vZGVsV2l6YXJkX2xhYmVsPVx1NjViOVx1NmNkNVx1NmEyMVx1NTc4Yg0KLV9VSV9NZXRob2RNb2RlbFdpemFyZF9kZXNjcmlwdGlvbj1cdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTY1YjlcdTZjZDVcdTZhMjFcdTU3OGINCi0NCi1fVUlfTWV0aG9kRWRpdG9yX2xhYmVsPVx1NjViOVx1NmNkNVx1NmEyMVx1NTc4Ylx1N2RlOFx1OGYyZlx1NTY2OA0KLQ0KLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlPVx1NjIxMVx1NzY4NA0KLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbj1cdTY1YjlcdTZjZDUNCi0NCi1fVUlfV2l6YXJkX2xhYmVsPVx1NjViMFx1NWVmYQ0KLQ0KLV9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uPVx1NmE5NFx1NTQwZFx1N2Q1MFx1NWMzZVx1NWZjNVx1OTgwOFx1NjYyZiAnJy57MH0nJw0KLQ0KLV9VSV9Nb2RlbE9iamVjdD1cdTZhMjFcdTU3OGJcdTcyNjlcdTRlZjYNCi1fVUlfWE1MRW5jb2Rpbmc9WE1MIFx1N2RlOFx1NzhiYw0KLV9VSV9YTUxFbmNvZGluZ0Nob2ljZXM9VVRGLTggQVNDSUkgVVRGLTE2IFVURi0xNkJFIFVURi0xNkxFIElTTy04ODU5LTENCi1fVUlfV2l6YXJkX2luaXRpYWxfb2JqZWN0X2Rlc2NyaXB0aW9uPVx1OTA3OFx1NTNkNlx1ODk4MVx1NWVmYVx1N2FjYlx1NzY4NFx1NmEyMVx1NTc4Ylx1NzI2OVx1NGVmNg0KLQ0KLV9VSV9GaWxlQ29uZmxpY3RfbGFiZWw9XHU2YTk0XHU2ODQ4XHU4ODVkXHU3YTgxDQotX1dBUk5fRmlsZUNvbmZsaWN0PVx1NjcyYVx1NTEzMlx1NWI1OFx1NzY4NFx1OGI4YVx1NjZmNFx1NTQ4Y1x1N2RlOFx1OGYyZlx1NTY2OFx1NGU0Ylx1NTkxNlx1NjI0MFx1NTA1YVx1NzY4NFx1OGI4YVx1NjZmNFx1NzY3Y1x1NzUxZlx1ODg1ZFx1N2E4MVx1MzAwMlx1NjBhOFx1ODk4MVx1NjM2OFx1NjhjNFx1NmI2NFx1N2RlOFx1OGYyZlx1NTY2OFx1NzY4NFx1OGI4YVx1NjZmNFx1NTVjZVx1ZmYxZg0KLQ0KLSMgQWRkIExpbmsgRGlhbG9nDQotYWRkTGlua0RpYWxvZ19saW5rVHlwZT1cdTk4NWVcdTU3OGJcdWZmMWENCi1vcGVuTGlua0NoZWNrYm94X3RleHQ9XHU1NzI4XHU0ZTBkXHU1NDBjXHU3Njg0XHU3MDBmXHU4OWJkXHU1NjY4XHU4OTk2XHU3YTk3XHU5NThiXHU1NTVmXHU5M2M4XHU3ZDUwDQotDQotIyBBZGQgSW1hZ2UgRGlhbG9nDQotaGVpZ2h0TGFiZWxfdGV4dD1cdTlhZDhcdTVlYTZcdWZmMWENCi13aWR0aExhYmVsX3RleHQ9XHU1YmVjXHU1ZWE2XHVmZjFhDQotRWxlbWVudHNWaWV3XzIwPVx1NTI5Zlx1ODBmZFx1NTc4Ylx1NmEyMw0KLUVsZW1lbnRzVmlld18yMT1cdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGINCi1FbGVtZW50c1ZpZXdfMjI9XHU2ZDQxXHU3YTBiDQotRWxlbWVudHNWaWV3XzM1PXswfSBcdTY2MmZcdTU1MmZcdThiODBcdTc2ODRcdTMwMDJcdTdlN2NcdTdlOGNcdTRlNGJcdTUyNGRcdWZmMGNcdThhY2JcdTUxNDhcdThhMmRcdTcwYmFcdTUzZWZcdTViZWJcdTUxNjVcdTMwMDINCi1FbGVtZW50c1ZpZXdfMzY9XHU4ZjA5XHU1MTY1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotYWx0VGFnTGFiZWxfdGV4dD1BTFQgXHU2YTE5XHU3YzY0XHVmZjFhDQotaW1hZ2VTaXplTGFiZWxfdGV4dD1cdTVmNzFcdTUwY2ZcdTc2ODRcdTlhZDhcdTVlYTZcdTU0OGNcdTViZWNcdTVlYTZcdTgxZjNcdTVjMTFcdTVmYzVcdTk4MDhcdTcwYmEgMTAgXHU0ZTE0XHU0ZTBkXHU4ZDg1XHU5MDRlIDYwMFx1MzAwMlx1NzEyMVx1NjU0OFx1NzY4NFx1OWFkOFx1NWVhNlx1NTQ4Y1x1NWJlY1x1NWVhNlx1NWMwN1x1OGY0OVx1NjNkYlx1NzBiYVx1OTA2OVx1NzU3Nlx1NTkyN1x1NWMwZlx1MzAwMg0KLQ0KLSMgUHJvY2VzcyBFZGl0b3INCi1Qcm9jZXNzRWRpdG9yPVByb2Nlc3NFZGl0b3INCi1Qcm9jZXNzRWRpdG9yX05hbWU9XHU1NDBkXHU3YTMxDQotUHJvY2Vzc0VkaXRvcl9QcmVzZW50YXRpb25OYW1lPVx1NTQ0OFx1NzNmZVx1NTQwZFx1N2EzMQ0KLVByb2Nlc3NFZGl0b3JfSW5kZXg9XHU3ZDIyXHU1ZjE1DQotUHJvY2Vzc0VkaXRvcl9QcmVkZWNlc3NvcnM9XHU1MjRkXHU0ZTAwXHU3MjQ4DQotI0NvbmZpZ3VyYXRpb25QYWdlX1NlbGVjdGVkPVNlbGVjdGVkOiANCi1DaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbj1cdTkwNzhcdTUzZDZcdTZhYTJcdTY3ZTVcdTk4MDVcdTc2ZWVcdWZmMGNcdTUxOGRcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTRlMGFcdTMwMGRcdTYyMTZcdTMwMGNcdTRlMGJcdTMwMGRcdTRmODZcdThiOGFcdTY2ZjRcdTZiMjFcdTVlOGZcdTMwMDINCi1FbGVtZW50c1ZpZXdfcmVuYW1pbmdfdGV4dD1cdTZiNjNcdTU3MjhcdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGQuLi4NCi1Qcm9jZXNzRWRpdG9yX01vZGVsSW5mbz1cdTZhMjFcdTU3OGJcdThjYzdcdThhMGENCi1Qcm9jZXNzRWRpdG9yX1ByZWZpeD1cdTViNTdcdTk5OTYNCi1Nb3ZlRGlhbG9nX21vdmVfdGV4dD1cdTc5ZmJcdTUyZDUNCi1DaGVja2xpc3RPcmRlcl90aXRsZT1cdTYzOTJcdTVlOGZcdTZhYTJcdTY3ZTVcdTk4MDVcdTc2ZWUNCi1Qcm9jZXNzRWRpdG9yX1JlcGV0YWJsZT1cdTUzZWZcdTkxY2RcdTg5MDdcdTc2ODQNCi1Qcm9jZXNzRWRpdG9yX09uZ29pbmc9XHU2MzAxXHU3ZThjXHU5MDMyXHU4ODRjXHU0ZTJkDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uPVx1NTQwY1x1NmI2NVx1NTMxNi4uLg0KLVByb2Nlc3NFZGl0b3JfRXZlbnREcml2ZW49XHU0ZThiXHU0ZWY2XHU5YTQ1XHU1MmQ1DQotUHJvY2Vzc0VkaXRvcl9EZWxpdmVyYWJsZT1cdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWUNCi1Qcm9jZXNzRWRpdG9yX09wdGlvbmFsPVx1OTA3OFx1NzUyOA0KLUZpbHRlckRpYWxvZ19UeXBlX3RleHQ9XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU5ODVlXHU1NzhiXHVmZjFhDQotRmlsdGVyRGlhbG9nX0V4cGFuZEFsbD1cdTUxNjhcdTkwZThcdTVjNTVcdTk1OGINCi1Nb3ZlRGlhbG9nX21vdmluZ190ZXh0PVx1NmI2M1x1NTcyOFx1NzlmYlx1NTJkNS4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbldhcm5pbmc9SVVQQTAwMjVXOiBcdTU3MjhcdThkZWZcdTVmOTEgezF9IFx1NGUyZFx1NjI3ZVx1NGUwZFx1NTIzMCB7MH0gXHU3Njg0XHU1ZjYyXHU3MmMwXHU1NzE2XHU3OTNhDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uRXJyb3I9SVVQQTAwMjVFOiBcdTkzMmZcdThhYTRcdWZmMWFcdTVmNjJcdTcyYzBcdTU3MTZcdTc5M2FcdTUzNDBcdTZiYjVcdWZmMWF7MH0NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX05hbWVMYWJlbD1cdTU0MGRcdTdhMzFcdWZmMWENCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9OYW1lTGFiZWw9XHU1NDBkXHU3YTMxXHVmZjFhDQotQXV0aG9yaW5nVUlQbHVnaW5fbmV3Q29uZmlndXJhdGlvbldpemFyZF90aXRsZT1cdTY1YjBcdTVlZmFcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdMaWJyYXJ5TWFpblBhZ2VfcGFnZVRpdGxlPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYg0KLW5ld0xpYnJhcnlXaXphcmRfdGl0bGU9XHU2NWIwXHU1ZWZhXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVUaXRsZT1cdTUxMzJcdTViNThcdThiOGFcdTY2ZjQNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdMaWJyYXJ5TWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uPVx1NjMwN1x1NWI5YVx1NjViMFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NzY4NFx1NTQwZFx1N2EzMVx1MzAwMVx1OGFhYVx1NjYwZVx1NTNjYVx1NzZlZVx1NmExOVx1NzZlZVx1OTMwNFx1MzAwMg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb249XHU1ZGYyXHU0ZmVlXHU2NTM5XHU0ZTAwXHU2MjE2XHU1OTFhXHU1MDBiXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHUzMDAyXHU4YWNiXHU5MDc4XHU1M2Q2XHU5NzAwXHU4OTgxXHU1MTMyXHU1YjU4XHU3Njg0XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHUzMDAyDQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU9XHU5NThiXHU1NTVmXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25XaXphcmRfd2luZG93VGl0bGU9XHU5NThiXHU1NTVmXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ9XHU2YjYzXHU1NzI4XHU1M2Q2XHU0ZWUzIHswfS4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uV2FybmluZz1JVVBBMDAyNlc6IFx1NTcyOFx1OGRlZlx1NWY5MSB7MX0gXHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwIHswfSBcdTc2ODRcdTdiYzBcdTllZGVcdTU3MTZcdTc5M2ENCi1NZXNzYWdlTGFiZWxQcm92aWRlcl91bnNlbGVjdGVkcGFja2FnZXM9Jyd7MH0nJyBcdTRlMmRcdTY3MDlcdTUxNDNcdTdkMjBcdTUzYzNcdTcxNjdcdTUyMzBcdTY3MmFcdTkwNzhcdTViOWFcdTU5NTdcdTRlZjZcdTc2ODRcdTUxNDNcdTdkMjANCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbkVycm9yPUlVUEEwMDI2RTogXHU5MzJmXHU4YWE0XHVmZjFhXHU3YmMwXHU5ZWRlXHU1NzE2XHU3OTNhXHU1MzQwXHU2YmI1XHVmZjFhezB9DQotU3RlcHNPcmRlckRpYWxvZ19zdGVwcz1cdTZiNjVcdTlhNWZcdWZmMWENCi0NCi1TdGVwc09yZGVyRGlhbG9nX3RpdGxlPVx1NjM5Mlx1NWU4Zlx1NGY1Y1x1Njk2ZFx1NmI2NVx1OWE1Zg0KLVByb2Nlc3NFZGl0b3JfUGxhbm5lZD1cdTg5OGZcdTUyODMNCi1zcGVjaWZ5ZGlyZWN0b3J5X3RleHQ9XHU4YWNiXHU2MzA3XHU1YjlhXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU3Njg0XHU1MTMyXHU1YjU4XHU3NmVlXHU5MzA0DQotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPVx1NTkxYVx1NmIyMVx1NTFmYVx1NzNmZVx1NzY4NFx1OTgwNVx1NzZlZQ0KLVByb2Nlc3NFZGl0b3JfRW50cnlTdGF0ZT1cdTkwMzJcdTUxNjVcdTcyYzBcdTYxNGINCi1Qcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZT1cdTdkNTBcdTY3NWZcdTcyYzBcdTYxNGINCi1zZWxlY3RDb2x1bW5zdG9BZGRfdGV4dD1cdTkwNzhcdTUzZDZcdTg5ODFcdTY1YjBcdTU4OWVcdTc2ODRcdTc2ZjRcdTZiMDQNCi1Qcm9jZXNzRWRpdG9yX1R5cGU9XHU5ODVlXHU1NzhiDQotUHJvY2Vzc0VkaXRvcl9UZWFtPVx1NTcxOFx1OTY4YQ0KLUZpbHRlckRpYWxvZ190aXRsZT1cdTkwNzhcdTUzZDZcdTVjMGRcdThhNzFcdTY4NDZcdWZmMWENCi0NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGQ9XHU1ZjllXHU2NWI5XHU2Y2Q1XHU1MTY3XHU1YmI5XHU2NWIwXHU1ODllKCZNKS4uLg0KLUZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbD1cdTUxNjhcdTkwZThcdTY1MzZcdTU0MDgNCi1PcGVuQ2hlYXRzaGVldFZpZXdfdGl0bGU9XHU5NThiXHU1NTVmXHU2M2QwXHU4OTgxXHU4OTk2XHU1NzE2DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwPVx1NGUwYVx1NjM3Mg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxEb3duPVx1NGUwYlx1NjM3Mg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVVcD1cdTRlMGFcdTc5ZmIoJk8pDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZURvd249XHU0ZTBiXHU3OWZiKCZXKQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbD1cdTk4NmZcdTc5M2EoJkEpDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29weT1cdTg5MDdcdTg4ZmQoJkMpLi4uDQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dD1cdTU0MGRcdTdhMzFcdTU3OGJcdTZhMjNcdWZmMDhcdTVjMDdcdTk4NmZcdTc5M2FcdTc2ZjhcdTdiMjZcdTc2ODRcdTU0MGRcdTdhMzFcdWZmMDlcdWZmMWENCi0NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3RpdGxlPVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1ZmYxYQ0KLSNNZXNzYWdlVmlld19zZWxlY3RlZF90ZXh0PVNlbGVjdGVkOiANCi1NZXNzYWdlVmlld19lcnJtc2dfdGV4dD1cdThhYWFcdTY2MGUNCi1FbGVtZW50c1ZpZXdfZXJyX3NhdmluZz1JVVBBMDAyN0U6IFx1NTEzMlx1NWI1OCAnJ3swfScnezF9IFx1NjY0Mlx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNA0KLQ0KLWVycl9jb3B5aW5nX2ZpbGVfdGl0bGU9XHU4OTA3XHU4OGZkXHU2YTk0XHU2ODQ4XHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotZXJyX2NvcHlpbmdfZmlsZV9lcnJvcj1JVVBBMDAyOEU6IFx1NzEyMVx1NmNkNVx1NjMwN1x1NWI5YVx1NTcxNlx1NzkzYVx1MzAwMg0KLWVycl9jb3B5aW5nX2ZpbGVfcmVhc29uPVx1ODkwN1x1ODhmZFx1OTA3OFx1NTNkNlx1NzY4NFx1NmE5NFx1Njg0OFx1NjY0Mlx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNFx1MzAwMlx1NTk4Mlx1OTcwMFx1NzZmOFx1OTVkY1x1OGNjN1x1OGEwYVx1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwZFx1MzAwMg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU9XHU4NjU1XHU3NDA2XHU2YTk0XHU2ODQ4XHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcD1cdTdkZThcdThmMmZcdTkxNGRcdTdmNmUNCi1lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQ9SVVQQTAwMTVFOiBcdTcxMjFcdTZjZDVcdTdkZThcdThmMmZcdTUxNDNcdTdkMjANCi1TYXZlVGhpc0FjdGlvbl9zYXZlb2JqZWN0PVx1NTEzMlx1NWI1OFx1OTAxOVx1NTAwYlx1NzI2OVx1NGVmNi4uLg0KLUVsZW1lbnRzVmlld19yZXBsYWNlX3RleHQ9XHU1M2Q2XHU0ZWUzDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kPVx1NWVmNlx1NGYzOCgmRSkuLi4NCi1Nb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ9XHU5MDc4XHU2NGM3XHU5MDc4XHU1YjlhXHU1MTQzXHU3ZDIwXHU3Njg0XHU3NmVlXHU3Njg0XHU1NzMwXHVmZjFhDQotY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0PVx1OTA3OFx1NjRjN1x1N2EwYlx1NWYwZlx1NWVhYlx1NzY4NFx1OTgxMFx1OGEyZFx1NzZlZVx1OTMwNFx1ZmYxYQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzPVx1NjZhYlx1NTA1YygmUykNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczI9XHU3NjdjXHU0ZjQ4XHU5MDc4XHU5ODA1KCZQKS4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0Fzc2lnblVzZXJEaWFncmFtPVx1NGY3Zlx1NzUyOFx1ODAwNVx1NWI5YVx1N2ZhOVx1NzY4NFx1NTcxNlx1ODllMygmVSkuLi4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdGl0bGU9XHU2MzA3XHU1YjlhXHU0ZjdmXHU3NTI4XHU4MDA1XHU1YjlhXHU3ZmE5XHU3Njg0XHU1NzE2XHU4OWUzDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U9XHU2ZDNiXHU1MmQ1XHU1NzE2XHVmZjFhDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlPVx1NmQzYlx1NTJkNVx1NTcxNlx1NjYwZVx1N2QzMFx1ZmYxYQ0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTc2ZjhcdTRmOWRcdTk1ZGNcdTRmYzJcdTU3MTZcdWZmMWENCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfbm90YUZpbGU9SVVQQTAwMDRFOiBcdTYzMDdcdTViOWFcdTc2ODRcdThkZWZcdTVmOTFcdTRlMGRcdTY2MmZcdTZhOTRcdTY4NDhcdTMwMDINCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uPVx1OTA3OFx1NTNkNi4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19lbnRlcmVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAyNEU6IFx1NjMwN1x1NWI5YVx1NzY4NFx1NWY3MVx1NTBjZlx1NGUwZFx1NWI1OFx1NTcyOFx1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1MzAwMlx1OGFjYlx1NzhiYVx1NWI5YVx1OGYzOFx1NTE2NVx1NzZmOFx1NWMwZFx1NjViY1x1N2EwYlx1NWYwZlx1NWVhYlx1NjgzOVx1NzZlZVx1OTMwNFx1NzY4NFx1OGRlZlx1NWY5MVx1MzAwMg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ9SVVQQTAwMzBFOiBcdTYwYThcdTkwNzhcdTUzZDZcdTc2ODRcdTVmNzFcdTUwY2ZcdTRlMGRcdTU3MjhcdTdhMGJcdTVmMGZcdTVlYWJcdTRlMmRcdTMwMDINCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZT1cdTRmN2ZcdTc1MjhcdTZkM2JcdTUyZDVcdTU3MTZcdTVmNzFcdTUwY2ZcdTRmODZcdTcwMGZcdTg5YmRcdTU0OGNcdTc2N2NcdTg4NGMNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURESW1hZ2U9XHU0ZjdmXHU3NTI4XHU2ZDNiXHU1MmQ1XHU2NjBlXHU3ZDMwXHU1NzE2XHU1ZjcxXHU1MGNmXHU0Zjg2XHU3MDBmXHU4OWJkXHU1NDhjXHU3NjdjXHU4ODRjDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlPVx1NGY3Zlx1NzUyOFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NzZmOFx1NGY5ZFx1OTVkY1x1NGZjMlx1NTcxNlx1NWY3MVx1NTBjZlx1NGY4Nlx1NzAwZlx1ODliZFx1NTQ4Y1x1NzY3Y1x1ODg0Yw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvbnRyaWJ1dGU9XHU2NzJjXHU3YWVmXHU5NjQ0XHU1MmEwXHU4OTgxXHU3ZDIwDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZT1cdTY3MmNcdTdhZWZcdTdmNmVcdTYzZGINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9EaWFncmFtcz1cdTU3MTZcdTU3OGIoJkcpDQotUHJvY2Vzc0VkaXRvcl9hY3Rpb25fZGVlcENvcHk9XHU2ZGYxXHU1YzY0XHU4OTA3XHU4OGZkKCZEKS4uLg0KLUZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uPVx1N2MyMVx1ODk4MVx1OGFhYVx1NjYwZVx1ZmYxYQ0KLUNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwPVx1OTg2Zlx1NzkzYS9cdTk2YjFcdTg1Y2ZcdTY3MmFcdTUyZmVcdTkwNzhcdTc2ODRcdTUxNDNcdTdkMjANCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbj1cdThhYWFcdTY2MGVcdWZmMWENCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbD1cdTRlMGRcdTc2N2NcdTRmNDgNCi1GaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbj1cdTU3OGJcdTZhMjNcdTRlZTVcdTkwMTdcdTllZGVcdTUzNDBcdTk2OTRcdWZmMGNcdTUxNzZcdTRlMmQgKj1cdTRlZmJcdTRmNTVcdTViNTdcdTRlMzJcdWZmMGM/PVx1NGVmYlx1NGY1NVx1NWI1N1x1NTE0Mw0KLUNvbmZpZ3VyYXRpb25QYWdlX1RyZWVUaXRsZUxhYmVsPVx1NTE2N1x1NWJiOVx1ZmYxYQ0KLUNvbmZpZ3VyYXRpb25QYWdlX0xvYWRpbmdNZXNzYWdlPVx1NmI2M1x1NTcyOFx1OGYwOVx1NTE2NVx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1OGFjYlx1N2EwZFx1NTAxOS4uLg0KLU1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0PVx1NjMwN1x1NWI5YVx1NzY4NFx1NzlmYlx1NTJkNVx1NzZlZVx1NzY4NFx1NTczMFx1NzEyMVx1NjU0OFx1MzAwMg0KLU1vdmVEaWFsb2dfY2Fubm90TW9kaWZ5RGVzdGluYXRpb249SVVQQTAwMzRFOiBcdTcxMjFcdTZjZDVcdTRmZWVcdTY1MzlcdTkwNzhcdTUzZDZcdTc2ODRcdTc2ZWVcdTc2ODRcdTU3MzBcdTMwMDINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw9XHU1MTY4XHU5MGU4XHU3NjdjXHU0ZjQ4DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkJhc2VBY3Rpdml0eT1cdTk1OGJcdTU1NWZcdTU3ZmFcdTY3MmNcdTZkM2JcdTUyZDUNCi1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPVx1NTE2OFx1OTBlOFx1NWM1NVx1OTU4YigmWCkNCi1Qcm9jZXNzRm9ybUVkaXRvcl9jb2xsYXBzZUFsbEFjdGlvbkxhYmVsPVx1NTE2OFx1OTBlOFx1NjUzNlx1NTQwOCgmTCkNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtPVx1OTU4Ylx1NTU1Zlx1NmQzYlx1NTJkNVx1NTcxNigmQSkNCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlUmV2ZWFsPVx1NWZjNVx1OTgwOFx1NTIyYVx1OTY2NFx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwZFx1NGUyZFx1NTIxN1x1NTFmYVx1NzY4NFx1NjcyYVx1NjI5MVx1NTIzNlx1NjNjZlx1OGZmMFx1NWI1MFx1ZmYwY1x1NGVlNVx1NTE0ZFx1NTcyOFx1NjNlZFx1OTczMlx1OTA3OFx1NTNkNlx1NzY4NFx1NTE0M1x1N2QyMFx1NGU0Ylx1NWY4Y1x1OTFjZFx1ODkwN1x1MzAwMlx1NTk4Mlx1Njc5Y1x1ODk4MVx1NTIyYVx1OTY2NFx1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1NzhiYVx1NWI5YVx1MzAwZFx1NGUyNlx1N2U3Y1x1N2U4Y1x1MzAwMg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9TZWxlY3RDb2x1bW5zPVx1OTA3OFx1NTNkNlx1ODk4MVx1NjViMFx1NTg5ZVx1NzY4NFx1NzZmNFx1NmIwNA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW09XHU5NThiXHU1NTVmXHU2ZDNiXHU1MmQ1XHU2NjBlXHU3ZDMwXHU1NzE2KCZEKQ0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9Db2x1bW5TZWxlY3Rpb249XHU3NmY0XHU2YjA0XHU5MDc4XHU2NGM3XHVmZjFhDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N3aXRjaENvbmZpZ3VyYXRpb249XHU1NTVmXHU1MmQ1XHUzMDBjXHU2ZDQxXHU3YTBiXHU3ZGU4XHU4ZjJmXHU1NjY4XHUzMDBkXHU2NjQyXHU1MjA3XHU2M2RiXHU4MWYzXHUzMDBjXHU2ZDQxXHU3YTBiXHUzMDBkXHU3Njg0XHU5ODEwXHU4YTJkXHU5MTRkXHU3ZjZlDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N1cHByZXNzaW9uR3JvdXBUaXRsZT1cdTYyOTFcdTUyMzYNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGU9XHU3ZTdjXHU2MjdmXHU2MjkxXHU1MjM2XHU3MmMwXHU2MTRiDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW09XHU5NThiXHU1NTVmXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyXHU1NzE2KCZXKQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsPVx1NmUwNVx1OTY2NA0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsPVx1OTA3OFx1NTNkNi4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0luc2VydE5ld1BoYXNlPVx1NjNkMlx1NTE2NVx1NjViMFx1NzY4NFx1OTY4ZVx1NmJiNQ0KLVZpZXdIZWxwZXJfcmVsb2FkTGliT25Sb2xsYmFja0Vycm9yPVx1NzEyMVx1NmNkNVx1NTZkZVx1NWZhOVx1NjMwMVx1N2U4Y1x1NjAyN1x1OTMyZlx1OGFhNFx1MzAwMlx1N2EwYlx1NWYwZlx1NWVhYlx1NWZjNVx1OTgwOFx1OTFjZFx1NjViMFx1OGYwOVx1NTE2NVx1NGY4Nlx1OTA4NFx1NTM5Zlx1ODFmM1x1NTM5Zlx1NTljYlx1NzJjMFx1NjE0Ylx1MzAwMg0KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRfdGV4dD1cdTVkZjJcdTUyMmFcdTk2NjRcdTUxNDNcdTdkMjAgJyd7MH0nJ1x1MzAwMg0KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQ9XHU1ZGYyXHU1MjJhXHU5NjY0XHU1MTQzXHU3ZDIwICcnezB9JydcdTMwMDJcDQotXHU2MGE4XHU4OTgxXHU1ZjllICcnezF9JycgXHU0ZTJkXHU3OWZiXHU5NjY0XHU2YjY0XHU1MTQzXHU3ZDIwXHU1NWNlXHVmZjFmDQotQ29uZmlndXJhdGlvblBhZ2VfQWRkTWlzc2luZ1Rvb2xUaXA9XHU2NWIwXHU1ODllXHU5MDdhXHU2ZjBmXHU3Njg0XHU1M2MzXHU3MTY3DQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb249XHU4YWFhXHU2NjBlDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm89XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhDQotDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPVx1NTk1N1x1NzUyOFx1NTc4Ylx1NmEyMygmVCkNCi1Nb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ9XHU4YWNiXHU5MDc4XHU1M2Q2XHU3NmVlXHU3Njg0XHU1NzMwXHUzMDAyDQotTW92ZURpYWxvZ19ub21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9XHU2NzJhXHU2MzA3XHU1YjlhXHU3OWZiXHU1MmQ1XHU3NmVlXHU3Njg0XHU1NzMwXHUzMDAyDQotTWV0aG9kTGlicmFyeUVkaXRvcl90cm91Ymxlb2JqZWN0PS4gXHU3ZjNhXHU5ZWRlXHU3MjY5XHU0ZWY2XHVmZjFhDQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfZXJyY2hpbGRwa2dzPVx1NWI1MFx1OTgwNVx1NTE2N1x1NWJiOVx1NTk1N1x1NGVmNlx1NjIxNlx1N2EwYlx1NWU4Zlx1NTMwNVx1NTQyYlx1OTA3YVx1NmYwZlx1NTNjM1x1NzE2N1x1NzY4NFx1NTE0M1x1N2QyMA0KLVByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfVGl0bGU9XHU1NzE2XHU4OWUzXHU3NjdjXHU0ZjQ4XHU5MDc4XHU5ODA1DQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlPVx1OGFjYlx1OTA3OFx1NTNkNlx1ODk4MVx1NzY3Y1x1NGY0OFx1NzY4NFx1NTcxNlx1ODllM1x1NjIxNlx1NTNkNlx1NmQ4OFx1OTA3OFx1NTNkNlx1NGUwZFx1ODk4MVx1NzY3Y1x1NGY0OFx1NzY4NFx1NTcxNlx1ODllMw0KLVByb2Nlc3NFZGl0b3JfVGl0bGU9XHU3YTBiXHU1ZThmXHU3ZGU4XHU4ZjJmXHU1NjY4XHVmZjFhDQotU2F2ZUFzd2l0aGRvdHNfdGV4dD1cdTUzZTZcdTViNThcdTY1YjBcdTZhOTQuLi4NCi1Qcm9jZXNzRWRpdG9yX1dvcmtCcmVha2Rvd25TdHJ1Y3R1cmU9XHU1ZGU1XHU0ZjVjXHU1MjA2XHU4OWUzXHU3ZDUwXHU2OWNiDQotUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbj1cdTU3MThcdTk2OGFcdTkxNGRcdTdmNmUNCi1Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU3NTI4XHU2Y2Q1DQotUHJvY2Vzc0VkaXRvcl9Db25zb2xpZGF0ZWRWaWV3PVx1NTQwOFx1NGY3NVx1ODk5Nlx1NTcxNg0KLVByb2Nlc3NFZGl0b3JfY29uZmlybUF1dG9TeW5jaD1cdTZiNjRcdTY0Y2RcdTRmNWNcdTY3MDNcdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDZcdTkwNzhcdTUzZDZcdTc2ODRcdTYzY2ZcdThmZjBcdTViNTBcdTYyMTZcdTkwNzhcdTViOWFcdTZkM2JcdTUyZDVcdTRlMGJcdTc2ODRcdTYyNDBcdTY3MDlcdTYzY2ZcdThmZjBcdTViNTBcdWZmMGNcdTkwMTlcdTRlOWJcdTZkM2JcdTUyZDVcdTU3MjhcdTMwMGNcdTUxNjdcdTViYjlcdTMwMGRcdTg5OTZcdTU3MTZcdTc2ODRcdTMwMGNcdTRlMDBcdTgyMmNcdTMwMGRcdTZhMTlcdTdjNjRcdTRlMmRcdTVkZjJcdTZhMTlcdTc5M2FcdTcwYmFcdTMwMGNcdTgyMDdcdTRmODZcdTZlOTBcdTU0MGNcdTZiNjVcdTUzMTZcdTMwMGRcdTMwMDJcdTVjMDdcdTRlZTVcdTZkNDFcdTdhMGJcdTk4MTBcdThhMmRcdTkxNGRcdTdmNmVcdTRlMGJcdTc2ODRcdTkzYzhcdTdkNTBcdTY1YjlcdTZjZDVcdTUxNjdcdTViYjlcdTUxNDNcdTdkMjBcdTc2ODRcdTUzOWZcdTU5Y2JcdTUxNjdcdTViYjlcdTRmODZcdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDZcdTkwMTlcdTRlOWJcdTYzY2ZcdThmZjBcdTViNTBcdTMwMDJcdThhY2JcdTZjZThcdTYxMGZcdWZmMGNcdTVjMDdcdTRlMGRcdTY3MDNcdTY2ZjRcdTY1YjBcdTRlZmJcdTRmNTVcdTUyZDVcdTYxNGJcdTkwMjNcdTdkNTBcdTc2ODRcdWZmMDhcdTdkYTBcdTgyNzJcdTY1OWNcdTlhZDRcdTViNTdcdWZmMDlcdTYzY2ZcdThmZjBcdTViNTBcdTMwMDJcdTg5ODFcdTdlN2NcdTdlOGNcdTU1Y2VcdWZmMWYNCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE9XHU5MTRkXHU3ZjZlDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yPVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1NTQ4Y1x1NTk1N1x1NGVmNlx1OTA3OFx1NjRjNw0KLU5ld0xpYnJhcnlEaWFsb2dfbmV3bGlicmFyeV9hcz1cdTUzZTZcdTVlZmFcdTY1YjBcdTc2ODRcdTdhMGJcdTVmMGZcdTVlYWINCi1OZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ9XHU2NWIwXHU1ZWZhXHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotU2VsZWN0RWxlbWVudERpYWxvZ190aXRsZV90ZXh0PVx1OTA3OFx1NTNkNlx1NTE0M1x1N2QyMFx1NjIxNlx1NTE3Nlx1NGUyZFx1NGUwMFx1NTAwYlx1OTY0NFx1NTJhMFx1ODk4MVx1N2QyMFx1ZmYxYQ0KLU9wZW5Db25maWdEaWFsb2duZXdjb25maWdfdGV4dD1cdTY1YjBcdTVlZmFcdTkxNGRcdTdmNmVcdWZmMWENCi1wcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VfQlNFZGl0b3I9XHU3YTBiXHU1ZThmXHU3ZGU4XHU4ZjJmXHU1NjY4DQotDQotIyBBYnN0cmFjdERpYWdyYW1FZGl0b3INCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9XHU1YzBkXHU5ZjRhDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9XHU1ZjllXHU1N2ZhXHU2NzJjXHU2ZDNiXHU1MmQ1XHU5MWNkXHU2NWIwXHU2NTc0XHU3NDA2DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0PVx1NjgzY1x1NWYwZlx1NjU4N1x1NWI1N1x1Njg0Ni4uLg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9XHU2YzM0XHU1ZTczXHU1YzBkXHU5ZjRhXHU1ZTczXHU1NzQ3XHU1MDNjDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdTZjMzRcdTVlNzNcdTVjMGRcdTlmNGFcdTdiMmNcdTRlMDBcdTUwMGJcdTkwNzhcdTViOWFcdTk4MDVcdTc2ZWUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVx1NTc4Mlx1NzZmNFx1NWMwZFx1OWY0YVx1NWU3M1x1NTc0N1x1NTAzYw0KLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGU9XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhDQotTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9SVVQQTAwNDFFOiBcdTkwNzhcdTUzZDZcdTc2ODRcdTUxNDNcdTdkMjBcdTcxMjFcdTZjZDVcdTc5ZmJcdTgxZjNcdTYzMDdcdTViOWFcdTc2ODRcdTc2ZWVcdTc2ODRcdTU3MzBcdTMwMDINCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVtb2RlbGxpYnJhcnk9XHU2YjYzXHU1NzI4XHU1MTMyXHU1YjU4XHU2YTIxXHU1NzhiXHU3YTBiXHU1ZjBmXHU1ZWFiLi4uDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU9XHU5MzJmXHU4YWE0DQotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c9SVVQQTAwMzNFOiBcdTUxMzJcdTViNThcdTdhMGJcdTVmMGZcdTVlYWJcdTY2NDJcdTc2N2NcdTc1MWZcdTU1NGZcdTk4NGNcdTMwMDINCi1NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dD1cdTYwYThcdTc4YmFcdTViOWFcdTg5ODFcdTUyMmFcdTk2NjQgJyd7MH0nJyBcdTU1Y2VcdWZmMWYNCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19Db250ZW50RWxlbWVudF90ZXh0PVx1NTE2N1x1NWJiOVx1NTE0M1x1N2QyMFx1ZmYxYQ0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfQnJvd3NlQnV0dG9uTGFiZWw9XHU3MDBmXHU4OWJkLi4uDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1cdTYzMDdcdTViOWFcdTY1YjBcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTc2ODRcdTU0MGRcdTdhMzFcdTU0OGNcdThhYWFcdTY2MGVcdTMwMDINCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZVRpdGxlPVx1NTEzMlx1NWI1OFx1OGI4YVx1NjZmNFx1NGUyNlx1OTVkY1x1OTU4OVx1NjI0MFx1NjcwOVx1N2RlOFx1OGYyZlx1NTY2OA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9XHU1NzgyXHU3NmY0XHU1YzBkXHU5ZjRhXHU3YjJjXHU0ZTAwXHU1MDBiXHU5MDc4XHU1YjlhXHU5ODA1XHU3NmVlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1cdTUxMzJcdTViNTgNCi1BdHRhY2htZW50RGlhbG9nYXR0YWNoRmlsZV90ZXh0PVx1OTY0NFx1NTJhMFx1NmE5NFx1Njg0OA0KLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ9XHU5MTRkXHU3ZjZlXHU1MTY3XHU1YmI5DQotT3BlbkNvbmZpZ0RpYWxvZ29wZW5jb25maWdfdGV4dD1cdTk1OGJcdTU1NWZcdTkxNGRcdTdmNmUNCi1FbGVtZW50c1ZpZXdfcmVwbGFjZUFjdGlvbl90ZXh0PVx1NTNkNlx1NGVlMy4uLg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9XHU2YjYzXHU1NzI4XHU1MTMyXHU1YjU4IHswfQ0KLUNvbmZpZ3VyYXRpb25QYWdlX1Nob3dFcnJvclRvb2xUaXA9XHU5ODZmXHU3OTNhXHU5MTRkXHU3ZjZlXHU4YjY2XHU1NDRhXHU2NWU1XHU4YThjXHU2YWEyXHU4OTk2XHU1NjY4DQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeD1cdTkxNGRcdTdmNmVcdWZmMWENCi0NCi1DaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0PVx1NmFhMlx1NjdlNVx1OTgwNVx1NzZlZVx1ZmYxYQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1cdTc5ZmJcdTUyZDVcdTdiYzBcdTllZGUNCi1Db25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXA9XHU0ZmVlXHU2YjYzXHU5MzJmXHU4YWE0XHU0Zjg2XHU1ZWZhXHU3YWNiXHU5MDhhXHU3NTRjDQotTmV3UGx1Z2luRGlhbG9nX3JlZmVyZW5jZXBsdWdpbl90ZXh0PVx1NTNjM1x1NzE2N1x1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1ZmYxYQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9jcmVhdGVGcmVlVGV4dF90ZXh0PVx1NWVmYVx1N2FjYlx1NGVmYlx1NjEwZlx1NjU4N1x1NWI1Nw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0xhYmVsPVx1N2JjMFx1OWVkZVx1NTcxNlx1NzkzYVx1OTgxMFx1ODliZFx1ZmYxYQ0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0PUlVUEEwMDMyVzogXHU3MTIxXHU2Y2Q1XHU5MDIzXHU2M2E1DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX3NhbWVwcmVkYW5kc3VjX3RleHQ9SVVQQTAwMzNXOiBcdTc2ZjhcdTU0MGNcdTc2ODRcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTRlMGRcdTgwZmRcdTU0MGNcdTY2NDJcdTcwYmFcdTUyNGRcdTRlMDBcdTcyNDhcdTU0OGNcdTRlMGJcdTRlMDBcdTcyNDgNCi0NCi0jIEVkaXRvckNob29zZXINCi1FZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZT1cdTk1OGJcdTU1NWZcdTdkZThcdThmMmZcdTU2NjgNCi1FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yPVx1NmI2NFx1NTE0M1x1N2QyMFx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNFx1MzAwMlx1N2U3Y1x1N2U4Y1x1NGU0Ylx1NTI0ZFx1ZmYwY1x1NWVmYVx1OGI3MFx1NTE0OFx1NGZlZVx1NmI2M1x1OTAxOVx1NGU5Ylx1OTMyZlx1OGFhNFx1ZmYwOFx1OGFjYlx1NTNjM1x1OTViMVx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1ZmYwOVx1MzAwMlxuXA0KLVxuXA0KLVx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1NzhiYVx1NWI5YVx1MzAwZFx1NTNlZlx1N2U3Y1x1N2U4Y1x1ZmYwY1x1NGUwZFx1OTU4Ylx1NTU1Zlx1N2RlOFx1OGYyZlx1NTY2OFx1MzAwMlx1OTVkY1x1OTU4OVx1NmI2NFx1NWMwZFx1OGE3MVx1Njg0Nlx1NjcwM1x1OTU4Ylx1NTU1Zlx1N2RlOFx1OGYyZlx1NTY2OFx1MzAwMg0KLUNvbmZpZ3VyYXRpb25QYWdlX0Zvcm1QcmVmaXg9XHU5MTRkXHU3ZjZlXHVmZjFhDQotDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZT1cdTU0MGRcdTdhMzFcdWZmMWENCi1BdHRhY2htZW50RGlhbG9nRmlsZVVSTF90ZXh0PVx1NmE5NFx1Njg0OCBVUkxcdWZmMWENCi1TdGVwc09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uPVx1OTA3OFx1NTNkNlx1NmI2NVx1OWE1Zlx1ZmYwY1x1NTE4ZFx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1NGUwYVx1MzAwZFx1NjIxNlx1MzAwY1x1NGUwYlx1MzAwZFx1NGY4Nlx1OGI4YVx1NjZmNFx1NmIyMVx1NWU4Zlx1MzAwMg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyX3NhdmU9XHU1MTMyXHU1YjU4XHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotTWVzc2FnZVZpZXdfZXJyZWxlbWVudF90ZXh0PVx1NTNjM1x1NzE2N1x1NTE0M1x1N2QyMA0KLU1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dD1cdTg4YWJcdTUzYzNcdTcxNjdcdTUxNDNcdTdkMjANCi0NCi0jQWN0aXZpdHkgRGlhZ3JhbQ0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9jcmVhdGVTdGFydE5vZGVfdGV4dD1cdTVlZmFcdTdhY2JcdThkNzdcdTU5Y2JcdTdiYzBcdTllZGUNCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb249XHU5MDc4XHU1M2Q2XHU2YjY0XHU5MTRkXHU3ZjZlXHU1YzA3XHU1MzA1XHU1NDJiXHU3Njg0XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHUzMDAxXHU1MTY3XHU1YmI5XHU1OTU3XHU0ZWY2XHU1M2NhXHU3YTBiXHU1ZThmXHUzMDAyDQotQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb25fdGV4dD1cdTgxZWFcdThhMDJcdTdhMmVcdTk4NWVcdTc2ODRcdTUxNjdcdTViYjlcdTUxNDNcdTdkMjBcdTZiMjFcdTVlOGZcdTVjMGRcdThhNzFcdTY4NDYNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsPVx1NzZlZVx1OTMwNFx1ZmYxYQ0KLVJvb3RQcmVmUGFnZV9lbmFibGVwcm9jZXNzY29udHJpYnV0aW9uX3RleHQ9XHU1NTVmXHU3NTI4XHU3YTBiXHU1ZThmXHU5NjQ0XHU1MmEwXHU4OTgxXHU3ZDIwDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1cdTYzZDBcdTRmOWJcdTZiNjRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbkxhYmVsPVx1OGFhYVx1NjYwZVx1ZmYxYQ0KLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9XHU5MDc4XHU2NGM3ICcnezB9JycgXHU3Njg0XHU5NjQ0XHU1MmEwXHU4OTgxXHU3ZDIwDQotRWxlbWVudHNWaWV3X29wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbl90ZXh0PVx1OTAwZlx1OTA0ZVx1OGI4YVx1NTMxNlx1NjAyN1x1NTE0M1x1N2QyMFx1OTU4Ylx1NTU1Zg0KLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1cdTkwNzhcdTY0YzcgJyd7MH0nJyBcdTc2ODRcdThiOGFcdTUzMTZcdTYwMjdcdTUxNDNcdTdkMjANCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdmlld2VyTGFiZWw9Jyd7MH0nJyBcdTc2ODRcdThiOGFcdTUzMTZcdTYwMjdcdTUxNDNcdTdkMjANCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfTGFiZWw9XHU1ZjYyXHU3MmMwXHU1NzE2XHU3OTNhXHU5ODEwXHU4OWJkXHVmZjFhDQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dD1cdTcxMjFcdTZjZDVcdTUyMmFcdTk2NjQNCi1BY3Rpdml0eURpYWdyYW1FZGl0b3Jfb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PVx1OTU4Ylx1NTU1Zlx1NmQzYlx1NTJkNVx1NjYwZVx1N2QzMFx1NTcxNg0KLQ0KLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fZGVzY3JpcHRpb249XHU2M2QwXHU0ZjliXHU2YjY0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1cdTZlMDVcdTk2NjQNCi1XUENvbXBhcnRtZW50RmlndXJlXzA9XHU2NWIwXHU1ZWZhXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU2M2NmXHU4ZmYwXHU1YjUwDQotcHJvbXB0Zm9yX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGRfdGV4dD1cdTc2N2NcdTRmNDhcdTYyMTZcdTcwMGZcdTg5YmRcdTVjMWFcdTY3MmFcdTY1YmNcdTdhMGJcdTVlOGZcdTdkZThcdThmMmZcdTU2NjhcdTRlMmRcdTVlZmFcdTdhY2JcdTc2ODRcdTZkM2JcdTUyZDVcdTY2MGVcdTdkMzBcdTU3MTYNCi1wcm9tcHRfZm9yX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09XHU3NjdjXHU0ZjQ4XHU2MjE2XHU3MDBmXHU4OWJkXHU2ZDNiXHU1MmQ1XHU1NzE2XHU0ZTJkXHU2NzJhXHU0ZmVlXHU2NTM5XHU3Njg0XHU2ZDNiXHU1MmQ1XHU1ZWY2XHU0ZjM4DQotDQotI0NvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm49XHU1NDBkXHU3YTMxXHU1NzhiXHU2YTIzXHVmZjA4XHU1YzA3XHU5ODZmXHU3OTNhXHU3NmY4XHU3YjI2XHU3Njg0XHU1NDBkXHU3YTMxXHVmZjA5XHVmZjFhDQotc2hvd0luUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb25fbGFiZWw9XHU1NzI4XHU4Y2M3XHU2ZTkwXHU1YzBlXHU4OWJkXHU1NjY4XHU0ZTJkXHU5ODZmXHU3OTNhDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfUGF0dGVybj1cdTU3OGJcdTZhMjNcdTRlZTVcdTkwMTdcdTllZGVcdTUzNDBcdTk2OTRcdWZmMGNcdTUxNzZcdTRlMmQgKj1cdTRlZmJcdTRmNTVcdTViNTdcdTRlMzJcdWZmMGM/PVx1NGVmYlx1NGY1NVx1NWI1N1x1NTE0Mw0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb249SVVQQTAwMjlFOiBcdTg2NTVcdTc0MDZcdTkwNzhcdTUzZDZcdTc2ODRcdTZhOTRcdTY4NDhcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdTMwMDJcdTU5ODJcdTk3MDBcdTc2ZjhcdTk1ZGNcdThjYzdcdThhMGFcdWZmMGNcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMGRcdTMwMDINCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19DYXRlZ29yeVR5cGU9XHU3YTJlXHU5ODVlXHU5ODVlXHU1NzhiXHVmZjFhDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1cdTdjMjFcdTg5ODFcdThhYWFcdTY2MGVcdWZmMWENCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19TZWxlY3RDYXRlZ29yaWVzPVx1OTA3OFx1NTNkNlx1N2EyZVx1OTg1ZQ0KLQ0KLSNsb2cgbWVzc2FnZXMNCi1jaGVhdHNoZWV0X2xvYWRfZmFpbHVyZV9sb2dfbXNnPVx1NzEyMVx1NmNkNVx1OTU4Ylx1NTU1Zlx1NjI0MFx1ODk4MVx1NmM0Mlx1NzY4NFx1NjNkMFx1ODk4MVx1ZmYxYQ0KLQ0KLW5ld0NvbmZpZ3VyYXRpb25XaXJhemRfY3JlYXRlRXJyb3I9SVVQQTAwMzVFOiBcdTcxMjFcdTZjZDVcdTk4MDZcdTUyMjlcdTVlZmFcdTdhY2JcdTkxNGRcdTdmNmUNCi1uZXdQbHVnaW5XaXphcmRfY3JlYXRlRXJyb3I9SVVQQTAwMzZFOiBcdTcxMjFcdTZjZDVcdTk4MDZcdTUyMjlcdTVlZmFcdTdhY2JcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYNCi1lcnJvckRpYWxvZ19tb3ZlRXJyb3I9SVVQQTAwMzdFOiBcdTcxMjFcdTZjZDVcdTk4MDZcdTUyMjlcdTc5ZmJcdTUyZDVcdTUxNDNcdTdkMjANCi1yZW5hbWVEaWFsb2dfcmVuYW1lRXJyb3I9SVVQQTAwMzhFOiBcdTcxMjFcdTZjZDVcdTk4MDZcdTUyMjlcdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGRcdTUxNDNcdTdkMjANCi1lcnJvckRpYWxvZ19jcmVhdGVFcnJvcj1JVVBBMDAzOUU6IFx1NzEyMVx1NmNkNVx1OTgwNlx1NTIyOVx1NWVmYVx1N2FjYlx1NTE0M1x1N2QyMA0KLWR1cGxpY2F0ZVBsdWdpbk5hbWVFcnJvcl9tc2c9SVVQQTAxMDFFOiBcdTU0MGRcdTdhMzEgJyd7MH0nJyBcdTVkZjJcdTViNThcdTU3MjhcdTMwMDJcdThhY2JcdThmMzhcdTUxNjVcdTRlMGRcdTU0MGNcdTU0MGRcdTdhMzFcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi0NCi0jTmV3IFN0cmluZ3MgZm9yIFByb2Nlc3NFZGl0b3IgQ29udGV4dCBtZW51IGRpYWdyYW0gaW1hZ2VzDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkQURJbWFnZT1cdTYzMDdcdTViOWEgQUQgXHU1ZjcxXHU1MGNmLi4uDQotUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZT1cdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDZcdTkzMmZcdThhYTQNCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZz1cdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDZcdTdkZThcdThmMmZcdTU2NjhcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTQNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBRERJbWFnZT1cdTYzMDdcdTViOWEgQUREIFx1NWY3MVx1NTBjZi4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZFdQREltYWdlPVx1NjMwN1x1NWI5YSBXUEQgXHU1ZjcxXHU1MGNmLi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURJbWFnZUluUHVibGlzaGluZz1cdTc2N2NcdTg4NGNcdTY2NDJcdTRmN2ZcdTc1MjggQUQgXHU1ZjcxXHU1MGNmDQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzPVx1NWZjNVx1OTgwOFx1NTIyYVx1OTY2NFx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwZFx1NGUyZFx1NTIxN1x1NTFmYVx1NzY4NFx1NjI5MVx1NTIzNlx1NjNjZlx1OGZmMFx1NWI1MFx1ZmYwY1x1NGVlNVx1NTE0ZFx1NTcyOFx1NjI5MVx1NTIzNlx1OTA3OFx1NTNkNlx1NzY4NFx1NTE0M1x1N2QyMFx1NGU0Ylx1NWY4Y1x1OTFjZFx1ODkwN1x1MzAwMlx1NTk4Mlx1Njc5Y1x1ODk4MVx1NTIyYVx1OTY2NFx1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1NzhiYVx1NWI5YVx1MzAwZFx1NGUyNlx1N2U3Y1x1N2U4Y1x1MzAwMg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFEREltYWdlSW5QdWJsaXNoaW5nPVx1NzY3Y1x1ODg0Y1x1NjY0Mlx1NGY3Zlx1NzUyOCBBREQgXHU1ZjcxXHU1MGNmDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlV1BESW1hZ2VJblB1Ymxpc2hpbmc9XHU3NjdjXHU4ODRjXHU2NjQyXHU0ZjdmXHU3NTI4IFdQRCBcdTVmNzFcdTUwY2YNCi1Qcm9jZXNzRWRpdG9yX0RpYWdyYW1JbWFnZV9JbnB1dERpYWxvZ19pbml0aWFsVmFsdWU9XHU1ZjcxXHU1MGNmXHU4ZGVmXHU1ZjkxDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU2hvd0xpbmtlZEVsZW1lbnRpbkxpYnJhcnlWaWV3PVx1NTcyOFx1N2EwYlx1NWYwZlx1NWVhYlx1ODk5Nlx1NTcxNlx1NGUyZFx1OTg2Zlx1NzkzYVx1OTNjOFx1N2Q1MFx1NTE0M1x1N2QyMCgmSCkNCi1Qcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWw9XHU1ZjllXHU1N2ZhXHU2NzJjXHU2NmY0XHU2NWIwXHU2MjkxXHU1MjM2KCZCKQ0KLVByb2Nlc3NFZGl0b3JfQ29udGV4dE1lbnVfRGlhZ3JhbUltYWdlcz1cdTU3MTZcdTg5ZTNcdTVmNzFcdTUwY2YNCi0NCi0jU3RyaW5ncyBmb3Igc3luY2hyb25pemF0aW9uIHdpemFyZCBvbiBwcm9jZXNzIGVkaXRvcidzIEJTDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90aXRsZT1cdTU0MGNcdTZiNjVcdTUzMTZcdThhYWFcdTY2MGUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RleHQ9XHU5NWIxXHU4YjgwXHU0ZTBiXHU1MjE3XHU4Y2M3XHU4YTBhXHVmZjBjXHU1MTc2XHU0ZTJkXHU1YzA3XHU4YWFhXHU2NjBlXHU4MWVhXHU4YTAyXHU1NDBjXHU2YjY1XHU1MzE2XHU2NzAzXHU1YjhjXHU2MjEwXHU3Njg0XHU0ZThiXHU5ODA1XHUzMDAyDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHU5MDc4XHU1M2Q2XHU5MTRkXHU3ZjZlDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGV4dD1cdTkwNzhcdTUzZDZcdTYwYThcdTg5ODFcdTc1MjhcdTY1YmNcdTU0MGNcdTZiNjVcdTUzMTZcdTc2ODRcdTkxNGRcdTdmNmVcdTMwMDJcDQotXHU2MGE4XHU3Njg0XHU5MDc4XHU2NGM3XHU2NzAzXHU2YzdhXHU1YjlhXHU1NGVhXHU0ZTliXHU5NjQ0XHU1MmEwXHU4OTgxXHU3ZDIwXHU1NDhjXHU2NmY0XHU2M2RiXHU1NGMxXHU1YzA3XHU3NTI4XHU2NWJjXHU1NDBjXHU2YjY1XHU1MzE2XHUzMDAyDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWw9XHU5MTRkXHU3ZjZlXHVmZjFhDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RpdGxlPVx1OTA3OFx1NTNkNlx1ODk4MVx1NTQwY1x1NmI2NVx1NTMxNlx1NzY4NFx1NTE2N1x1NWJiOQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcm9wZXJ0aWVzX2xhYmxlPVx1NTE2N1x1NWJiOQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9uYW1lX2xhYmxlPVx1NTQwZFx1N2EzMQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmVzZW50YXRpb25OYW1lX2xhYmxlPVx1NTQ0OFx1NzNmZVx1NTQwZFx1N2EzMQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9icmllZkRlc2NfbGFibGU9XHU3YzIxXHU4OTgxXHU4YWFhXHU2NjBlDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsPVx1OTA3OFx1NzUyOFx1OGYzOFx1NTE2NQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9tYW5kYXRvcnlJbnB1dHNfbGFibGU9XHU1ZmM1XHU4OTgxXHU4ZjM4XHU1MTY1DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX291dHB1dHNfbGFiZWw9XHU4ZjM4XHU1MWZhDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWw9XHU0ZTNiXHU4OTgxXHU1N2Y3XHU4ODRjXHU4MDA1DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2FkZG5QZXJmb3JtZXJzX2xhYmxlPVx1NTE3Nlx1NGVkNlx1NTdmN1x1ODg0Y1x1ODAwNQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9yZXNwb25zaWJsZVJvbGVzX2xhYmxlPVx1OGNhMFx1OGNhY1x1ODlkMlx1ODI3Mg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9jb250bkFydGlmYWN0c19sYWJlbD1cdTUxNjdcdTU0MmJcdTc2ODRcdTY5Y2JcdTRlZjYNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfZGlsdmVkUGFydHNfbGFiZWw9XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3ZDQ0XHU0ZWY2DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsPVx1NmI2NVx1OWE1Zlx1OTA3OFx1NjRjNw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90ZXh0PVx1OTA3OFx1NjRjN1x1NjBhOFx1ODAwM1x1NjE2ZVx1ODk4MVx1NTQwY1x1NmI2NVx1NTMxNlx1NzY4NFx1NjViOVx1NmNkNVx1NTE2N1x1NWJiOVx1NzY4NFx1NWM2Y1x1NjAyN1x1MzAwMg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90aXRsZT1cdTU0MGNcdTZiNjVcdTUzMTZcdTk4MTBcdTg5YmQNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGV4dD1cdTg5MDdcdTY3ZTVcdTRlMGJcdTUyMTdcdTYzZDBcdTUxZmFcdTc2ODRcdTU0MGNcdTZiNjVcdTUzMTZcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMDINCi1zZWxlY3RFZGl0b3JzVG9EaXNjYXJkQ29uZmxpY3RDaGFuZ2VzPVx1NjcyYVx1NTEzMlx1NWI1OFx1NzY4NFx1OGI4YVx1NjZmNFx1NTQ4Y1x1N2RlOFx1OGYyZlx1NTY2OFx1NGU0Ylx1NTkxNlx1NjI0MFx1NTA1YVx1NzY4NFx1OGI4YVx1NjZmNFx1NzY3Y1x1NzUxZlx1ODg1ZFx1N2E4MVx1MzAwMlxuXA0KLVx1OGFjYlx1OTA3OFx1NTNkNlx1NjBhOFx1ODk4MVx1NjM2OFx1NjhjNFx1OGI4YVx1NjZmNFx1NzY4NFx1N2RlOFx1OGYyZlx1NTY2OFx1MzAwMg0KLXN5bmNocm9uaXphdGlvbldpemFyZF90aXRsZV90ZXh0PVx1NTQwY1x1NmI2NVx1NTMxNlx1N2NiZVx1OTc0OA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfZXhwbGFpblRleHQ9XHU2YjY0XHU3Y2JlXHU5NzQ4XHU2NTJmXHU2M2Y0XHU5MWNkXHU2NWIwXHU2NTc0XHU3NDA2XHU5MDc4XHU1M2Q2XHU3Njg0XHU2M2NmXHU4ZmYwXHU1YjUwXHU2MjE2XHU5MDc4XHU1YjlhXHU2ZDNiXHU1MmQ1XHU0ZTBiXHU3Njg0XHU2MjQwXHU2NzA5XHU2M2NmXHU4ZmYwXHU1YjUwXHVmZjBjXHU5MDE5XHU0ZTliXHU2ZDNiXHU1MmQ1XHU1NzI4XHUzMDBjXHU1MTY3XHU1YmI5XHUzMDBkXHU4OTk2XHU1NzE2XHU3Njg0XHUzMDBjXHU0ZTAwXHU4MjJjXHUzMDBkXHU2YTE5XHU3YzY0XHU0ZTJkXHU1ZGYyXHU2YTE5XHU3OTNhXHU3MGJhXHUzMDBjXHU4MjA3XHU0Zjg2XHU2ZTkwXHU1NDBjXHU2YjY1XHU1MzE2XHUzMDBkXHUzMDAyXA0KLVx1NTNlYVx1NjcwOVx1NTcyOFx1NmI2NFx1N2NiZVx1OTc0OFx1NGUyZFx1OTA3OFx1NTNkNlx1NzY4NFx1NTE2N1x1NWJiOVx1NjcwM1x1NTcyOFx1NjNjZlx1OGZmMFx1NWI1MFx1NGUyZFx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNlx1MzAwMlwNCi1cdTYwYThcdTRlNWZcdTUzZWZcdTRlZTVcdTcwYmFcdTZkNDFcdTdhMGJcdTkwNzhcdTUzZDZcdTU3MjhcdThhMDhcdTdiOTdcdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDZcdTY2NDJcdTg5ODFcdTRmN2ZcdTc1MjhcdTc2ODRcdTRlZmJcdTRmNTVcdTY3MDlcdTY1NDhcdTkxNGRcdTdmNmVcdTMwMDJcDQotXHU4YWNiXHU2Y2U4XHU2MTBmXHVmZjBjXHU3Y2JlXHU5NzQ4XHU1YzA3XHU0ZTBkXHU2NzAzXHU2NmY0XHU2NWIwXHU0ZWZiXHU0ZjU1XHU1MmQ1XHU2MTRiXHU5MDIzXHU3ZDUwXHU3Njg0XHVmZjA4XHU3ZGEwXHU4MjcyXHU2NTljXHU5YWQ0XHU1YjU3XHVmZjA5XHU2M2NmXHU4ZmYwXHU1YjUwXHUzMDAyDQotDQotb3BlblJURT1cdTk1OGJcdTU1NWYgUmljaCBUZXh0IFx1N2RlOFx1OGYyZlx1NTY2OA0KLWNsb3NlUlRFPVx1OTVkY1x1OTU4OSBSaWNoIFRleHQgXHU3ZGU4XHU4ZjJmXHU1NjY4DQotDQotI05ldyBTdHJpbmdzDQotcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdTg5ZDJcdTgyNzJcdTk2YzZcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi1kaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM2Y1x1NjViY1x1OTAxOVx1NTAwYlx1ODk4Zlx1N2JjNFx1NzY4NFx1NjMwN1x1NWYxNVx1MzAwMg0KLXdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTk4NWVcdTU3OGJcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU5MDE5XHU1MDBiXHU5ODE4XHU1N2RmXHU3Njg0XHU2MzA3XHU1ZjE1XHUzMDAyDQotdG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdTVkZTVcdTUxNzdcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi1jdXN0b21jYXRlZ29yeV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM2Y1x1NjViY1x1OTAxOVx1NTAwYlx1ODFlYVx1OGEwMlx1N2EyZVx1OTg1ZVx1NzY4NFx1NjMwN1x1NWYxNVx1MzAwMg0KLQ0KLWNvbmNlcHRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdTY5ODJcdTVmZjVcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi1jaGVja2xpc3RfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdTY4MzhcdTVjMGRcdTZlMDVcdTU1YWVcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU5MDE5XHU1MDBiXHU3YmM0XHU0ZjhiXHU3Njg0XHU2MzA3XHU1ZjE1XHUzMDAyDQotZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU5MDE5XHU1MDBiXHU2ZTk2XHU1MjQ3XHU3Njg0XHU2MzA3XHU1ZjE1XHUzMDAyDQotcm9hZG1hcF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM2Y1x1NjViY1x1OTAxOVx1NTAwYlx1ODVjZFx1NTcxNlx1NzY4NFx1NjMwN1x1NWYxNVx1MzAwMg0KLXJldXNhYmxlYXNzZXRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdTUzZWZcdTkxY2RcdTg5MDdcdTRmN2ZcdTc1MjhcdTc2ODRcdThjYzdcdTc1MjJcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdThmMTRcdTUyYTlcdThjYzdcdTY1OTlcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi1yZXBvcnRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdTU4MzFcdTU0NGFcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM2Y1x1NjViY1x1OTAxOVx1NTAwYlx1N2RmNFx1N2ZkMlx1NzY4NFx1NjMwN1x1NWYxNVx1MzAwMg0KLXRlbXBsYXRlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU5MDE5XHU1MDBiXHU3YmM0XHU2NzJjXHU3Njg0XHU2MzA3XHU1ZjE1XHUzMDAyDQotdGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdTg4NTNcdThhOWVcdTViOWFcdTdmYTlcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi10b29sbWVudG9yX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU5MDE5XHU1MDBiXHU1ZGU1XHU1MTc3XHU4ZjE0XHU1MmE5XHU3Njg0XHU2MzA3XHU1ZjE1XHUzMDAyDQotd2hpdGVwYXBlcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM2Y1x1NjViY1x1OTAxOVx1NTAwYlx1NzY3ZFx1NzZhZVx1NjZmOFx1NzY4NFx1NjMwN1x1NWYxNVx1MzAwMg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU5MDE5XHU1MDBiXHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmXHU3Njg0XHU2MzA3XHU1ZjE1XHUzMDAyDQotDQotDQotI05ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbg0KLXJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1ODlkMlx1ODI3Mlx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXJvbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4OWQyXHU4MjcyXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotcm9sZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTg5ZDJcdTgyNzJcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTg5ZDJcdTgyNzJcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi1yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1ODlkMlx1ODI3Mlx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLXRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1OTAxOVx1OTgwNVx1NGY1Y1x1Njk2ZFx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXRhc2tfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU5MDE5XHU5ODA1XHU0ZjVjXHU2OTZkXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotdGFza192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTkwMTlcdTk4MDVcdTRmNWNcdTY5NmRcdTgyMDdcdTUzZTZcdTRlMDBcdTk4MDVcdTRmNWNcdTY5NmRcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi10YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1OTAxOVx1OTgwNVx1NGY1Y1x1Njk2ZFx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLWFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTY5Y2JcdTRlZjZcdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTMwMDINCi1hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTY5Y2JcdTRlZjZcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1hcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjPVx1ODFlYVx1OGEwMlx1NmI2NFx1NjljYlx1NGVmNlx1NzY4NFx1NTcxNlx1NzkzYVx1MzAwMg0KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NjljYlx1NGVmNlx1NzY4NFx1NGVhNFx1NGVkOFx1OGNjN1x1OGEwYVx1MzAwMg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTY5Y2JcdTRlZjZcdTc2ODRcdThhYmZcdTY1NzRcdThjYzdcdThhMGFcdTMwMDINCi1hcnRpZmFjdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTY5Y2JcdTRlZjZcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTY5Y2JcdTRlZjZcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi1hcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTY5Y2JcdTRlZjZcdTc2ODRcdTcyNDhcdTY3MmNcdThjYzdcdThhMGFcdTMwMDINCi0NCi1vdXRjb21lX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdThmMzhcdTUxZmFcdTdkNTBcdTY3OWNcdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTMwMDINCi1vdXRjb21lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1OGYzOFx1NTFmYVx1N2Q1MFx1Njc5Y1x1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLW91dGNvbWVfaWNvblNlY3Rpb25fZGVzYz1cdTgxZWFcdThhMDJcdTZiNjRcdThmMzhcdTUxZmFcdTdkNTBcdTY3OWNcdTc2ODRcdTU3MTZcdTc5M2FcdTMwMDINCi1vdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1OGYzOFx1NTFmYVx1N2Q1MFx1Njc5Y1x1NzY4NFx1NGVhNFx1NGVkOFx1OGNjN1x1OGEwYVx1MzAwMg0KLW91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1OGYzOFx1NTFmYVx1N2Q1MFx1Njc5Y1x1NzY4NFx1OGFiZlx1NjU3NFx1OGNjN1x1OGEwYVx1MzAwMg0KLW91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU4ZjM4XHU1MWZhXHU3ZDUwXHU2NzljXHU4MjA3XHU1M2U2XHU0ZTAwXHU1MDBiXHU4ZjM4XHU1MWZhXHU3ZDUwXHU2NzljXHU3Njg0XHU5NWRjXHU0ZmMyXHUzMDAyDQotb3V0Y29tZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdThmMzhcdTUxZmFcdTdkNTBcdTY3OWNcdTc2ODRcdTcyNDhcdTY3MmNcdThjYzdcdThhMGFcdTMwMDINCi0NCi1kZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotZGVsaXZlcmFibGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYz1cdTgxZWFcdThhMDJcdTZiNjRcdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWVcdTc2ODRcdTU3MTZcdTc5M2FcdTMwMDINCi1kZWxpdmVyYWJsZV9ub3RhdGlvblNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWVcdTc2ODRcdTRlYTRcdTRlZDhcdThjYzdcdThhMGFcdTMwMDINCi1kZWxpdmVyYWJsZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3Njg0XHU4YWJmXHU2NTc0XHU4Y2M3XHU4YTBhXHUzMDAyDQotZGVsaXZlcmFibGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU4MjA3XHU1M2U2XHU0ZTAwXHU1MDBiXHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3Njg0XHU5NWRjXHU0ZmMyXHUzMDAyDQotZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotZGlzY2lwbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4OThmXHU3YmM0XHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTg5OGZcdTdiYzRcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1kaXNjaXBsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1ODk4Zlx1N2JjNFx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1ODk4Zlx1N2JjNFx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLWRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4OThmXHU3YmM0XHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotZG9tYWluX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTk4MThcdTU3ZGZcdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTMwMDINCi1kb21haW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU5ODE4XHU1N2RmXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1OTgxOFx1NTdkZlx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1OTgxOFx1NTdkZlx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLWRvbWFpbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTk4MThcdTU3ZGZcdTc2ODRcdTcyNDhcdTY3MmNcdThjYzdcdThhMGFcdTMwMDINCi0NCi13b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1OTg1ZVx1NTc4Ylx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTk4NWVcdTU3OGJcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi13b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU5ODVlXHU1NzhiXHU4MjA3XHU1M2U2XHU0ZTAwXHU1MDBiXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU5ODVlXHU1NzhiXHU3Njg0XHU5NWRjXHU0ZmMyXHUzMDAyDQotd29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1OTg1ZVx1NTc4Ylx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLXJvbGVzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1ODlkMlx1ODI3Mlx1OTZjNlx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXJvbGVzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4OWQyXHU4MjcyXHU5NmM2XHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotcm9sZXNldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTg5ZDJcdTgyNzJcdTk2YzZcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi1yb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1ODlkMlx1ODI3Mlx1OTZjNlx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLXRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NWRlNVx1NTE3N1x1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU1ZGU1XHU1MTc3XHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotdG9vbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTVkZTVcdTUxNzdcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTVkZTVcdTUxNzdcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi10b29sX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NWRlNVx1NTE3N1x1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLWNvbmNlcHRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1Njk4Mlx1NWZmNVx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLWNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU2OTgyXHU1ZmY1XHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTY5ODJcdTVmZjVcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTY5ODJcdTVmZjVcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi1jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1Njk4Mlx1NWZmNVx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLWNoZWNrbGlzdF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU2ODM4XHU1YzBkXHU2ZTA1XHU1NWFlXHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NjgzOFx1NWMwZFx1NmUwNVx1NTVhZVx1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTY4MzhcdTVjMGRcdTZlMDVcdTU1YWVcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTY4MzhcdTVjMGRcdTZlMDVcdTU1YWVcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi1jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU2ODM4XHU1YzBkXHU2ZTA1XHU1NWFlXHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU3YmM0XHU0ZjhiXHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTdiYzRcdTRmOGJcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1N2JjNFx1NGY4Ylx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1N2JjNFx1NGY4Ylx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU3YmM0XHU0ZjhiXHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotZ3VpZGVsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTZlOTZcdTUyNDdcdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTMwMDINCi1ndWlkZWxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU2ZTk2XHU1MjQ3XHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotZ3VpZGVsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NmU5Nlx1NTI0N1x1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1NmU5Nlx1NTI0N1x1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTZlOTZcdTUyNDdcdTc2ODRcdTcyNDhcdTY3MmNcdThjYzdcdThhMGFcdTMwMDINCi0NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmXHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmXHU4MjA3XHU1M2U2XHU0ZTAwXHU1MDBiXHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmXHU3Njg0XHU5NWRjXHU0ZmMyXHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmXHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotcHJhY3RpY2VfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1N2RmNFx1N2ZkMlx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXByYWN0aWNlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1N2RmNFx1N2ZkMlx1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLXByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1N2RmNFx1N2ZkMlx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1N2RmNFx1N2ZkMlx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLXByYWN0aWNlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1N2RmNFx1N2ZkMlx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLXJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU1ODMxXHU1NDRhXHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NTgzMVx1NTQ0YVx1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLXJlcG9ydF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTU4MzFcdTU0NGFcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTU4MzFcdTU0NGFcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU1ODMxXHU1NDRhXHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotcmVzdWFibGVhc3NldF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU1M2VmXHU5MWNkXHU4OTA3XHU0ZjdmXHU3NTI4XHU3Njg0XHU4Y2M3XHU3NTIyXHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTUzZWZcdTkxY2RcdTg5MDdcdTRmN2ZcdTc1MjhcdTc2ODRcdThjYzdcdTc1MjJcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1yZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NTNlZlx1OTFjZFx1ODkwN1x1NGY3Zlx1NzUyOFx1NzY4NFx1OGNjN1x1NzUyMlx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1NTNlZlx1OTFjZFx1ODkwN1x1NGY3Zlx1NzUyOFx1NzY4NFx1OGNjN1x1NzUyMlx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLXJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU1M2VmXHU5MWNkXHU4OTA3XHU0ZjdmXHU3NTI4XHU3Njg0XHU4Y2M3XHU3NTIyXHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4NWNkXHU1NzE2XHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTg1Y2RcdTU3MTZcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1yb2FkbWFwX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1ODVjZFx1NTcxNlx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1ODVjZFx1NTcxNlx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLXJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4NWNkXHU1NzE2XHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdThmMTRcdTUyYTlcdThjYzdcdTY1OTlcdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTMwMDINCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4ZjE0XHU1MmE5XHU4Y2M3XHU2NTk5XHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1OGYxNFx1NTJhOVx1OGNjN1x1NjU5OVx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1OGYxNFx1NTJhOVx1OGNjN1x1NjU5OVx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLXN1cHBvcnRpbmdtYXRlcmlhbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdThmMTRcdTUyYTlcdThjYzdcdTY1OTlcdTc2ODRcdTcyNDhcdTY3MmNcdThjYzdcdThhMGFcdTMwMDINCi0NCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU3YmM0XHU2NzJjXHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU3YmM0XHU2NzJjXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU3YmM0XHU2NzJjXHU4MjA3XHU1M2U2XHU0ZTAwXHU1MDBiXHU3YmM0XHU2NzJjXHU3Njg0XHU5NWRjXHU0ZmMyXHUzMDAyDQotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU3YmM0XHU2NzJjXHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotdGVybWRlZmluaXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1ODg1M1x1OGE5ZVx1NWI5YVx1N2ZhOVx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1ODg1M1x1OGE5ZVx1NWI5YVx1N2ZhOVx1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1ODg1M1x1OGE5ZVx1NWI5YVx1N2ZhOVx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1ODg1M1x1OGE5ZVx1NWI5YVx1N2ZhOVx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1ODg1M1x1OGE5ZVx1NWI5YVx1N2ZhOVx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLXRvb2xtZW50b3JfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NWRlNVx1NTE3N1x1OGYxNFx1NTJhOVx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU1ZGU1XHU1MTc3XHU4ZjE0XHU1MmE5XHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTVkZTVcdTUxNzdcdThmMTRcdTUyYTlcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTVkZTVcdTUxNzdcdThmMTRcdTUyYTlcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi10b29sbWVudG9yX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NWRlNVx1NTE3N1x1OGYxNFx1NTJhOVx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLXdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NzY3ZFx1NzZhZVx1NjZmOFx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXdoaXRlcGFwZXJfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU3NjdkXHU3NmFlXHU2NmY4XHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTc2N2RcdTc2YWVcdTY2ZjhcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTc2N2RcdTc2YWVcdTY2ZjhcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi13aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NzY3ZFx1NzZhZVx1NjZmOFx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLWRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4OThmXHU3YmM0XHU1MjA2XHU3ZDQ0XHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotZGlzY2lwbGluZWdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1ODk4Zlx1N2JjNFx1NTIwNlx1N2Q0NFx1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTg5OGZcdTdiYzRcdTUyMDZcdTdkNDRcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTg5OGZcdTdiYzRcdTUyMDZcdTdkNDRcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4OThmXHU3YmM0XHU1MjA2XHU3ZDQ0XHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTUyMDZcdTdkNDRcdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTMwMDINCi1yb2xlc2V0Z3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4OWQyXHU4MjcyXHU5NmM2XHU1MjA2XHU3ZDQ0XHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotcm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1ODlkMlx1ODI3Mlx1OTZjNlx1NTIwNlx1N2Q0NFx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1ODlkMlx1ODI3Mlx1OTZjNlx1NTIwNlx1N2Q0NFx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLXJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTUyMDZcdTdkNDRcdTc2ODRcdTcyNDhcdTY3MmNcdThjYzdcdThhMGFcdTMwMDINCi0NCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlXHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlXHU4MjA3XHU1M2U2XHU0ZTAwXHU1MDBiXHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlXHU3Njg0XHU5NWRjXHU0ZmMyXHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlXHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfSWNvblNlY3Rpb25fZGVzYz1cdTgxZWFcdThhMDJcdTkwMTlcdTUwMGJcdTgxZWFcdThhMDJcdTdhMmVcdTk4NWVcdTc2ODRcdTU3MTZcdTc5M2FcdTMwMDINCi0NCi1jb25jZXB0X2ljb25TZWN0aW9uX2Rlc2M9XHU4MWVhXHU4YTAyXHU2YjY0XHU2OTgyXHU1ZmY1XHU3Njg0XHU1NzE2XHU3OTNhXHUzMDAyDQotY2hlY2tsaXN0X2ljb25TZWN0aW9uX2Rlc2M9XHU4MWVhXHU4YTAyXHU2YjY0XHU2ODM4XHU1YzBkXHU2ZTA1XHU1NWFlXHU3Njg0XHU1NzE2XHU3OTNhXHUzMDAyDQotdG9vbG1lbnRvcl9pY29uU2VjdGlvbl9kZXNjPVx1ODFlYVx1OGEwMlx1OTAxOVx1NTAwYlx1NWRlNVx1NTE3N1x1OGYxNFx1NTJhOVx1NzY4NFx1NTcxNlx1NzkzYVx1MzAwMg0KLXdoaXRlcGFwZXJfaWNvblNlY3Rpb25fZGVzYz1cdTgxZWFcdThhMDJcdTZiNjRcdTc2N2RcdTc2YWVcdTY2ZjhcdTc2ODRcdTU3MTZcdTc5M2FcdTMwMDINCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjPVx1ODFlYVx1OGEwMlx1OTAxOVx1NTAwYlx1OTgxMFx1NGYzMFx1ODAwM1x1OTFjZlx1NzY4NFx1NTcxNlx1NzkzYVx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M9XHU4MWVhXHU4YTAyXHU5MDE5XHU1MDBiXHU4ODUzXHU4YTllXHU1YjlhXHU3ZmE5XHU3Njg0XHU1NzE2XHU3OTNhXHUzMDAyDQotdGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYz1cdTgxZWFcdThhMDJcdTZiNjRcdTdiYzRcdTY3MmNcdTc2ODRcdTU3MTZcdTc5M2FcdTMwMDINCi1yZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M9XHU4MWVhXHU4YTAyXHU5MDE5XHU1MDBiXHU1M2VmXHU5MWNkXHU4OTA3XHU0ZjdmXHU3NTI4XHU3Njg0XHU4Y2M3XHU3NTIyXHU3Njg0XHU1NzE2XHU3OTNhXHUzMDAyDQotcmVwb3J0X2ljb25TZWN0aW9uX2Rlc2M9XHU4MWVhXHU4YTAyXHU2YjY0XHU1ODMxXHU1NDRhXHU3Njg0XHU1NzE2XHU3OTNhXHUzMDAyDQotcHJhY3RpY2VfaWNvblNlY3Rpb25fZGVzYz1cdTgxZWFcdThhMDJcdTZiNjRcdTdkZjRcdTdmZDJcdTc2ODRcdTU3MTZcdTc5M2FcdTMwMDINCi1leGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M9XHU4MWVhXHU4YTAyXHU2YjY0XHU3YmM0XHU0ZjhiXHU3Njg0XHU1NzE2XHU3OTNhXHUzMDAyDQotZ3VpZGVsaW5lX2ljb25TZWN0aW9uX2Rlc2M9XHU4MWVhXHU4YTAyXHU2YjY0XHU2ZTk2XHU1MjQ3XHU3Njg0XHU1NzE2XHU3OTNhXHUzMDAyDQotcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjPVx1ODFlYVx1OGEwMlx1NmI2NFx1ODVjZFx1NTcxNlx1NzY4NFx1NTcxNlx1NzkzYVx1MzAwMg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjPVx1ODFlYVx1OGEwMlx1NmI2NFx1OGYxNFx1NTJhOVx1OGNjN1x1NjU5OVx1NzY4NFx1NTcxNlx1NzkzYVx1MzAwMg0KLQ0KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX3RpdGxlPVx1NmE5NFx1Njg0OFx1NWRmMlx1OGI4YVx1NjZmNA0KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2U9XHU2YTk0XHU2ODQ4XHU3Y2ZiXHU3ZDcxXHU0ZTBhXHU3Njg0XHU2YTk0XHU2ODQ4XHU1ZGYyXHU4YjhhXHU2NmY0XHUzMDAyXHU4OTgxXHU4ZjA5XHU1MTY1XHU4YjhhXHU2NmY0XHU1NWNlXHVmZjFmDQotDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU9XHU2ZDNiXHU1MmQ1XHU4YjhhXHU1MzE2XHU2MDI3DQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnPVx1NzEyMVx1NmNkNVx1NGVlNSAnJ3sxfScnIFx1NGY4Nlx1OGEyZFx1NWI5YVx1NmQzYlx1NTJkNSAnJ3swfScnIFx1NzY4NFx1OGI4YVx1NTMxNlx1NjAyN1x1ZmYwY1x1NTZlMFx1NzBiYSAnJ3sxfScnIFx1NzY4NFx1NWI1MFx1OTgwNVx1NWRmMlx1NTMwNVx1NjJlY1x1NGUwMFx1NjIxNlx1NTkxYVx1NTAwYlx1OTY0NFx1NTJhMC9cdTUzZDZcdTRlZTNcdTc2ODRcdTZkM2JcdTUyZDVcdTMwMDINCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxPVx1NmQzYlx1NTJkNSAnJ3swfScnIFx1NzEyMVx1NmNkNVx1OGEyZFx1NWI5YVx1NTE3Nlx1NGUyZFx1NGUwMFx1NTAwYlx1NzZmNFx1N2NmYlx1NmJjZFx1OTgwNVx1NTQ4Y1x1NGVmYlx1NGY1NVx1N2EwYlx1NWU4Zlx1NzY4NFx1OGI4YVx1NTMxNlx1NjAyN1x1MzAwMg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzI9XHU3MTIxXHU2Y2Q1XHU0ZWU1ICcnezF9JycgXHU0Zjg2XHU4YTJkXHU1YjlhXHU2ZDNiXHU1MmQ1ICcnezB9JycgXHU3Njg0XHU4YjhhXHU1MzE2XHU2MDI3XHVmZjBjXHU1NmUwXHU3MGJhXHU1YzA3XHU1YzBlXHU4MWY0XHU1ZmFhXHU3NGIwXHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyXHUzMDAyDQotDQotYXBwbHlfcGF0dGVybl9lcnJvcl90aXRsZT1cdTU5NTdcdTc1MjhcdTU3OGJcdTZhMjMNCi1hcHBseV9wYXR0ZXJuX2Vycm9yX21zZz1cdTcxMjFcdTZjZDVcdTRlZTUgJyd7MX0nJyBcdTRmODZcdTU5NTdcdTc1MjhcdTZkM2JcdTUyZDUgJyd7MH0nJyBcdTc2ODRcdTU3OGJcdTZhMjNcdWZmMGNcdTU2ZTBcdTcwYmFcdTVjMDdcdTVjMGVcdTgxZjRcdTVmYWFcdTc0YjBcdTc2ZjhcdTRmOWRcdTk1ZGNcdTRmYzJcdTMwMDINCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotQ2hhbmdlSGlzdG9yeURpYWxvZ19kZWxpbWl0ZXI9fA0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3Jfc2hvd093bmVySW5MaWJyYXJ5Vmlldz1cdTU3MjhcdTMwMGNcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMGRcdTg5OTZcdTU3MTZcdTRlMmRcdTk4NmZcdTc5M2FcdTkwMTlcdTUwMGJcdTY3MmFcdTg5ZTNcdTY3OTBcdTc2ODRcdTUzYzNcdTcxNjdcdTc2ODRcdTY0YzFcdTY3MDlcdTgwMDUNCi1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3JlbW92ZVVucmVzb2x2ZWRSZWZlcmVuY2U9XHU3OWZiXHU5NjY0XHU5MDE5XHU1MDBiXHU2NzJhXHU4OWUzXHU2NzkwXHU3Njg0XHU1M2MzXHU3MTY3DQotcHJvbXB0RGVsZXRlQ3VzdG9tQ2F0ZWdvcnlCZWZvcmVSZW1vdmVMYXN0UmVmVG9JdD1cdTYwYThcdTVjMDdcdTU3MjhcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTRlMmRcdTc5ZmJcdTk2NjQgezB9IFx1NzY4NFx1NjcwMFx1NWY4Y1x1NGUwMFx1NTAwYlx1NTNjM1x1NzE2N1x1MzAwMlx1NWMwN1x1NTIyYVx1OTY2NFx1NTE0M1x1N2QyMFx1MzAwMlx1ODk4MVx1N2U3Y1x1N2U4Y1x1NTVjZVx1ZmYxZg0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jQmVsb3cgcHJvcGVydHkgImVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcyIgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkDQotI0Rvbid0IGRlbGV0ZSBhIHNwYWNlIGFmdGVyICI6ICINCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLWVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcz1cdWZmMWENCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5OWI1ODEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvblRpdGxlPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbg0KLVByb2Nlc3NfRG9jdW1lbnRJbmZvcm1hdGlvblRpdGxlPURva3VtZW50YXRpb25zaW5mb3JtYXRpb25lbg0KLUFjdGl2aXR5X2d1aWRhbmNlSW5mb3JtYXRpb25UaXRsZT1BbmxlaXR1bmcNCi1CcmVha2Rvd25FbGVtZW50X29wdGlvbkluZm9ybWF0aW9uVGl0bGU9U3RydWt0dXJvcHRpb25lbg0KLVRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvblRpdGxlPVNjaHJpdHRlDQotDQotVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uRGVzY3JpcHRpb249RGllIFNjaHJpdHRlIGZcdTAwZmNyIGRpZSBBdXNmXHUwMGZjaHJ1bmcgZGllc2VzIEF1ZmdhYmVuZGVza3JpcHRvcnMgYW5nZWJlbi4NCi0NCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSB7MH0gYW5nZWJlbi4NCi1Qcm9jZXNzX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Eb2t1bWVudGF0aW9uc2luZm9ybWF0aW9uZW4gZlx1MDBmY3IgezB9IGFuZ2ViZW4uDQotDQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VtIERlc2tyaXB0b3IgYW5nZWJlbi4NCi1EZXNjcmlwdG9yX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb249RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIERlc2tyaXB0b3IgYW5nZWJlbi4NCi1NaWxlc3RvbmVfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBNZWlsZW5zdGVpbiBhbmdlYmVuLg0KLU1pbGVzdG9uZV9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPURldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBNZWlsZW5zdGVpbiBhbmdlYmVuLg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBTdHJ1a3R1cmVsZW1lbnQgYW5nZWJlbi4NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VtIFByb2pla3RzdHJ1a3R1cmVsZW1lbnQgYW5nZWJlbi4NCi1EZXNjcmlwdG9yX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0b249QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBEZXNrcmlwdG9yIGFuZ2ViZW4uDQotQWN0aXZpdHlfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBBa3Rpdml0XHUwMGU0dCBhbmdlYmVuLg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPURva3VtZW50YXRpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gU3RydWt0dXJlbGVtZW50IGFuZ2ViZW4uDQotQWN0aXZpdHlfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPURva3VtZW50YXRpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgQWt0aXZpdFx1MDBlNHQgYW5nZWJlbi4NCi1EZXNjcmlwdG9yX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Eb2t1bWVudGF0aW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VtIERlc2tyaXB0b3IgYW5nZWJlbi4NCi1Qcm9jZXNzX05vbmU9PDwgT0hORSA+Pg0KLVByb2Nlc3NfbmFtZT1OYW1lOg0KLVByb2Nlc3NfUHJlc2VudGF0aW9uTmFtZT1Qclx1MDBlNHNlbnRhdGlvbnNuYW1lOg0KLVByb2Nlc3NfYnJpZWZEZXNjcmlwdGlvbj1LdXJ6YmVzY2hyZWlidW5nOg0KLVByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uPSBIYXVwdGJlc2NocmVpYnVuZzoNCi1Qcm9jZXNzX3B1cnBvc2U9WndlY2s6DQotUHJvY2Vzc19wcmVmaXg9UHJcdTAwZTRmaXg6DQotDQotQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU9U3RydWt0dXJlbGVtZW50DQotDQotUHJvY2Vzc19UeXBlX1Rhc2s9TWV0aG9kZW5hdWZnYWJlOg0KLVByb2Nlc3NfVHlwZV9Sb2xlPU1ldGhvZGVucm9sbGU6DQotUHJvY2Vzc19UeXBlX1dvcmtQcm9kdWN0PU1ldGhvZGVuYXJiZWl0c2VyZ2VibmlzOg0KLQ0KLVdvcmtQcm9kdWN0X1R5cGU9QXJiZWl0c2VyZ2VibmlzdHlwOg0KLQ0KLUFjdGl2aXR5X01vZGVsSW5mbz1Nb2RlbGxpbmZvcm1hdGlvbmVuOg0KLUFjdGl2aXR5X1R5cGU9QWt0aXZpdFx1MDBlNHRzdHlwOg0KLUFjdGl2aXR5X3ByZXNlbnRhdGlvbk5hbWU9UHJcdTAwZTRzZW50YXRpb25zbmFtZToNCi1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmVuOg0KLUFjdGl2aXR5X2hvd1RvU3RhZmY9Vm9yZ2VoZW5zd2Vpc2UgYmVpIE1pdGFyYmVpdGVyYXVzd2FobDoNCi1CcmVha2Rvd25FbGVtZW50X2tleUNvbnNpZGVyYXRpb25zPVdpY2h0aWdlIEhpbndlaXNlOg0KLVByb2Nlc3NfdXNhZ2VHdWlkYW5jZT1WZXJ3ZW5kdW5nc2FubGVpdHVuZzoNCi0NCi1BY3Rpdml0eV9Sb2FkbWFwVGl0bGU9Um9hZG1hcHMNCi1BY3Rpdml0eV9Sb2FkbWFwRGVzY3JpcHRpb249TGlua3MgenUgd2VpdGVyZW4gSW5mb3JtYXRpb25lbiBpbiBGb3JtIHZvbiBSb2FkbWFwcyBhbmdlYmVuLg0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlPUFsbGdlbWVpbmUgQW5sZWl0dW5nDQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlRGVzY3JpcHRpb249TGlua3MgenUgd2VpdGVyZW4gSW5mb3JtYXRpb25lbiBpbiBGb3JtIHZvbiBBbmxlaXR1bmdlbiBhbmdlYmVuLg0KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbFRpdGxlPUtvbW11bmlrYXRpb25zbWF0ZXJpYWwNCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1MaW5rcyB6dSB3ZWl0ZXJlbiBJbmZvcm1hdGlvbmVuIGluIEZvcm0gdm9uIEtvbW11bmlrYXRpb25zbWF0ZXJpYWwgYW5nZWJlbi4NCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlPUxlcm5tYXRlcmlhbA0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249TGlua3MgenUgd2VpdGVyZW4gSW5mb3JtYXRpb25lbiBpbiBGb3JtIHZvbiBMZXJubWF0ZXJpYWwgYW5nZWJlbi4NCi0NCi1BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwPVJvYWRtYXBzOg0KLUFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZT1BbmxlaXR1bmc6DQotQWN0aXZpdHlfU2VsZWN0ZWRfQ29tbXVuaWNhdGlvbk1hdGVyaWFsPUtvbW11bmlrYXRpb25zbWF0ZXJpYWw6DQotQWN0aXZpdHlfU2VsZWN0ZWRfRWR1Y2F0aW9uTWF0ZXJpYWw9TGVybm1hdGVyaWFsOg0KLQ0KLUFjdGl2aXR5X0RpYWdyYW1UaXRsZT1EaWFncmFtbQ0KLUFjdGl2aXR5X0RpYWdyYW1EZXNjcmlwdGlvbiA9IERpYWdyYW1tZSBmXHUwMGZjciB7MH0gYmVyZWl0c3RlbGxlbi4NCi1BY3Rpdml0eV9BREltYWdlPUFrdGl2aXRcdTAwZTR0c2RpYWdyYW1tDQotQWN0aXZpdHlfQURESW1hZ2U9QWt0aXZpdFx1MDBlNHRzZGV0YWlsZGlhZ3JhbW0NCi1BY3Rpdml0eV9XUERJbWFnZT1BcmJlaXRzZXJnZWJuaXNhYmhcdTAwZTRuZ2lna2VpdHNkaWFncmFtbQ0KLUFjdGl2aXR5X1VzZUFESW1hZ2U9QWt0aXZpdFx1MDBlNHRzZGlhZ3JhbW0gZlx1MDBmY3IgVmVyXHUwMGY2ZmZlbnRsaWNodW5nIHZlcndlbmRlbg0KLUFjdGl2aXR5X1VzZUFEREltYWdlPUFrdGl2aXRcdTAwZTR0c2RldGFpbGRpYWdyYW1tIGZcdTAwZmNyIFZlclx1MDBmNmZmZW50bGljaHVuZyB2ZXJ3ZW5kZW4NCi1BY3Rpdml0eV9Vc2VXUERJbWFnZT1BcmJlaXRzZXJnZWJuaXNhYmhcdTAwZTRuZ2lna2VpdHNkaWFncmFtbSBmXHUwMGZjciBWZXJcdTAwZjZmZmVudGxpY2h1bmcgdmVyd2VuZGVuDQotQWN0aXZpdHlfQXNzaWduPVp1b3JkbmVuLi4uDQotDQotVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM9U2Nocml0dGU6DQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ1RpdGxlPVNjaHJpdHRlDQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2U9U2Nocml0dGUgYXVzd1x1MDBlNGhsZW4NCi0NCi1BY3Rpdml0eV9Xb3JrUm9sbHVwPUFyYmVpdHMtUm9sbHVwDQotQWN0aXZpdHlfVGVhbVJvbGx1cD1UZWFtLVJvbGx1cA0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cD1BcmJlaXRzZXJnLi1Sb2xsdXANCi1BY3Rpdml0eV9Xb3JrUm9sbHVwRGVzY3JpcHRpb249QXJiZWl0cy1Sb2xsdXAgZlx1MDBmY3IgZGllc2UgQWt0aXZpdFx1MDBlNHQgaW4gZGllc2VtIEFic2Nobml0dCBwclx1MDBmY2Zlbg0KLUFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbj1UZWFtLVJvbGx1cCBmXHUwMGZjciBkaWVzZSBBa3Rpdml0XHUwMGU0dCBpbiBkaWVzZW0gQWJzY2huaXR0IHByXHUwMGZjZmVuDQotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb249QXJiZWl0c2VyZ2VibmlzLVJvbGx1cCBmXHUwMGZjciBkaWVzZSBBa3Rpdml0XHUwMGU0dCBpbiBkaWVzZW0gQWJzY2huaXR0IHByXHUwMGZjZmVuDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fTXVsdGlwbGVPY3VycmFuY2U9TWVocmVyZSBWb3Jrb21tZW4NCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9PcHRpb25hbD1PcHRpb25hbA0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1BsYW5uZWQ9R2VwbGFudA0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N1cHJlc3NlZD1VbnRlcmRyXHUwMGZjY2t0DQotDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRXZlbnREcml2ZW49RXJlaWduaXNnZXN0ZXVlcnQNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9PbmdvaW5nPUZvcnRsYXVmZW5kDQotV29ya0JyZWFrZG93bkVsZW1lbnRfUmVwZWF0YWJsZT1XaWVkZXJob2x0IGFud2VuZGJhcg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29ycz1Wb3JnXHUwMGU0bmdlcjoNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5PUFiaFx1MDBlNG5naWdrZWl0Og0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQ9SW5kZXgNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9QUkVTRU5UQVRJT05fTkFNRV9URVhUPVByXHUwMGU0c2VudGF0aW9uc25hbWUNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9ERVBFTkRFTkNZX1RFWFQ9QWJoXHUwMGU0bmdpZ2tlaXQNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZD1IaW56dWZcdTAwZmNnZW4NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQ9QmVhcmJlaXRlbg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfUmVtb3ZlPUVudGZlcm5lbg0KLQ0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUPUVuZGUgYmlzIEFuZmFuZw0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSD1FbmRlIGJpcyBFbmRlDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g9QW5mYW5nIGJpcyBFbmRlDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19TVEFSVD1BbmZhbmcgYmlzIEFuZmFuZw0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZD1TeW5jaHJvbmlzaWVydCBtaXQgUXVlbGxlDQotDQotRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb249UHJcdTAwZTR6aXNpZXJ0ZSBCZXNjaHJlaWJ1bmc6DQotDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlPVJvbGxlbg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbj1EaWUgUm9sbGVuZGVza3JpcHRvcmVuIGZcdTAwZmNyIGRpZSBBdXNmXHUwMGZjaHJ1bmcgZGllc2VzIEF1ZmdhYmVuZGVza3JpcHRvcnMgenVvcmRuZW4uDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUxPVByaW1cdTAwZTRyZXIgQXVzZlx1MDBmY2hyZW5kZXI6DQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUyPVp1c1x1MDBlNHR6bGljaGUgQXVzZlx1MDBmY2hyZW5kZToNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTM9VW50ZXJzdFx1MDBmY3R6dCB2b246DQotDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZT1BcmJlaXRzZXJnZWJuaXNzZQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249RGVza3JpcHRvcmVuIGZcdTAwZmNyIEVpbmdhYmUtIHVuZCBBdXNnYWJlYXJiZWl0c2VyZ2Vibmlzc2UgZlx1MDBmY3IgZGllc2VuIEF1ZmdhYmVuZGVza3JpcHRvciBhbmdlYmVuLg0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTE9VmVyYmluZGxpY2hlIEVpbmdhYmU6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1PcHRpb25hbGUgRWluZ2FiZToNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUzPUV4dGVybmUgRWluZ2FiZToNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGU0PUF1c2dhYmU6DQotDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvblRpdGxlPUF1ZmdhYmVuDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPURpZXNlciBSb2xsZW5kZXNrcmlwdG9yIGlzdCBBdXNmXHUwMGZjaHJlbmRlciBkZXIgZm9sZ2VuZGVuIEF1ZmdhYmVuZGVza3JpcHRvcmVuLg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMT1QcmltXHUwMGU0cmVyIEF1c2ZcdTAwZmNocmVuZGVyOg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMj1adXNcdTAwZTR0emxpY2hlIEF1c2ZcdTAwZmNocmVuZGU6DQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUzPVVudGVyc3RcdTAwZmN0enQgdm9uOg0KLQ0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9QXJiZWl0c2VyZ2Vibmlzc2UNCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uPURpZXNlciBSb2xsZW5kZXNrcmlwdG9yIGlzdCBmXHUwMGZjciBkaWUgZm9sZ2VuZGVuIEFyYmVpdHNlcmdlYm5pc2Rlc2tyaXB0b3JlbiB2ZXJhbnR3b3J0bGljaCB1bmQgXHUwMGU0bmRlcnQgZGllc2UuDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1WZXJhbnR3b3J0bGljaCBmXHUwMGZjcjoNCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyPVx1MDBjNG5kZXJ1bmc6DQotDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1Sb2xsZW4NCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPURpZSBmb2xnZW5kZW4gUm9sbGVuZGVza3JpcHRvcmVuIHNpbmQgZlx1MDBmY3IgZGllc2VuIEFyYmVpdHNlcmdlYm5pc2Rlc2tyaXB0b3IgdmVyYW50d29ydGxpY2ggdW5kIFx1MDBlNG5kZXJuIGRpZXNlbi4NCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUxPVZlcmFudHdvcnRsaWNoIGZcdTAwZmNyOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9R2VcdTAwZTRuZGVydCB2b246DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1R5cGU9VHlwOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGU9QW5mYW5nc3p1c3RhbmQgZGVyIEFrdGl2aXRcdTAwZTR0Og0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZT1FbmR6dXN0YW5kIGRlciBBa3Rpdml0XHUwMGU0dDoNCi0NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZT1UZWlsZSBkZXMgTGllZmVyZ2VnZW5zdGFuZHMNCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbj1EZXIgTGllZmVyZ2VnZW5zdGFuZCBoYXQgZGllIGZvbGdlbmRlbiBUZWlsZS4NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMT1UZWlsZSBkZXMgTGllZmVyZ2VnZW5zdGFuZHMNCi0NCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25UaXRsZT1UZWFtcw0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvbkRlc2NyaXB0aW9uPURpZXNlciBSb2xsZW5kZXNrcmlwdG9yIHZlcndlaXN0IGF1ZiBkaWUgZm9sZ2VuZGVuIFRlYW1zLg0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fVGFibGUxPVRlYW1zOg0KLQ0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU9Um9sbGVuDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1EaWVzZSBrb21iaW5pZXJ0ZSBSb2xsZSBoYXQgZGllIGZvbGdlbmRlbiBFaW56ZWxyb2xsZW4uDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1RhYmxlMT1FaW56ZWxyb2xsZW46DQotDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uVGl0bGU9Um9sbGVuDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249Um9sbGVuIHp1bSBUZWFtcHJvZmlsIGhpbnp1Zlx1MDBmY2dlbiBvZGVyIGF1cyBkaWVzZW0gZW50ZmVybmVuLg0KLVRlYW1Qcm9maWxlX1JvbGVfVGFibGUxPVJvbGxlbjoNCi0NCi1Qcm9jZXNzX1JpY2hUZXh0X0NvbGxhcHNlSW1hZ2U9Y29sbGFwc2VkLmdpZg0KLVByb2Nlc3NfUmljaFRleHRfRXhwYW5kSW1hZ2U9ZXhwYW5kZWQuZ2lmDQotUHJvY2Vzc19BZGQ9SGluenVmXHUwMGZjZ2VuLi4uDQotUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcz1IaW56dWZcdTAwZmNnZW4gYXVzIFByb3plc3MuLi4NCi1Qcm9jZXNzX1JlbmFtZV9NZXNzYWdlPVNpZSBzaW5kIGRhYmVpLCBkZW4gTmFtZW4gZGVzIFByb3plc3NlcyB6dSBcdTAwZTRuZGVybi4gQmVpIGRpZXNlciBBa3Rpb24gd2lyZCBkZXIgSW5oYWx0IGRlcyBFZGl0b3JzIGdlc3BlaWNoZXJ0IHVuZCBkZXIgUHJvemVzc29yZG5lciB1bWJlbmFubnQuIEZvcnRmYWhyZW4/DQotUHJvY2Vzc19SZW1vdmU9RW50ZmVybmVuDQotUHJvY2Vzc19VcD1OYWNoIG9iZW4NCi1Qcm9jZXNzX0Rvd249TmFjaCB1bnRlbg0KLVByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb249TWVocmZhY2hhdXN3YWhsDQotUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQ9TWV0aG9kZW5lbGVtZW50IHZlcmxpbmtlbi4uLg0KLQ0KLSMjIEVycm9yL1dhcm5pbmcNCi1Qcm9jZXNzX0ludmFsaWROYW1lVGl0bGU9VW5nXHUwMGZjbHRpZ2VyIE5hbWUNCi1Qcm9jZXNzX0ludmFsaWROYW1lPUlVUEEwMDgxRTogRGVyIE5hbWUgbXVzcyBhbmdlZ2ViZW4gd2VyZGVuLiBHZWJlbiBTaWUgZWluZW4gZ1x1MDBmY2x0aWdlbiBOYW1lbiBhbi4NCi1Qcm9jZXNzX1JlbmFtZV9UaXRsZT1VbWJlbmVubmVuDQotUHJvY2Vzc19JbnZhbGlkUHJlc2VudGF0aW9uTmFtZT1JVVBBMDA4MkU6IERlciBQclx1MDBlNHNlbnRhdGlvbnNuYW1lIG11c3MgYW5nZWdlYmVuIHdlcmRlbi4gR2ViZW4gU2llIGVpbmVuIGdcdTAwZmNsdGlnZW4gUHJcdTAwZTRzZW50YXRpb25zbmFtZW4gYW4uDQotUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlPU1ldGhvZGVuZWxlbWVudCB2ZXJsaW5rZW4NCi1Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudD1JVVBBMDA4M0U6IEVzIGthbm4ga2VpbiBMaW5rIHp1ICcnezB9JycgZXJnZXN0ZWxsdCB3ZXJkZW4sIHdlaWwgZGllc2VzIE1ldGhvZGVuZWxlbWVudCBiZXJlaXRzIGZcdTAwZmNyIGVpbmVuIGFuZGVyZW4gRGVza3JpcHRvciB1bnRlciBkZW1zZWxiZW4gXHUwMGZjYmVyZ2VvcmRuZXRlbiBFbGVtZW50IHZlcndlbmRldCB3aXJkLg0KLVByb2Nlc3NfQXNzaWdubWVudEluZm9UaXRsZT1JbmZvcm1hdGlvbg0KLVByb2Nlc3NfVGVhbUFzc2lnbkVycm9yPUlVUEEwMDg0RTogJyd7MH0nJyBrYW5uIGRlbSBUZWFtICcnezF9JycgbmljaHQgaGluenVnZWZcdTAwZmNndCB3ZXJkZW4uXG5cblJvbGxlbmRlc2tyaXB0b3JlbiBtdXNzIGVpbmUgTWV0aG9kZW5lbGVtZW50cm9sbGUgenVnZW9yZG5ldCBzZWluLCBkYW1pdCBzaWUgZWluZW0gVGVhbSB6dWdlb3JkbmV0IHdlcmRlbiBrXHUwMGY2bm5lbi5cblxuIEtvcnJpZ2llcmVuIFNpZSBkaWUgWnVvcmRudW5nIHVuZCB3aWVkZXJob2xlbiBTaWUgYW5zY2hsaWVcdTAwZGZlbmQgZGVuIFZvcmdhbmcuDQotUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZT1BdXNnZXdcdTAwZTRobHRlIFRlYW1zDQotUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGU9VGVhbXMNCi0NCi1Qcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3I9SVVQQTAwODVFOiAnJ3swfScnIGthbm4gZGVtIExpZWZlcmdlZ2Vuc3RhbmQgJyd7MX0nJyBuaWNodCBoaW56dWdlZlx1MDBmY2d0IHdlcmRlbiwgd2VpbCBrZWluIEFyYmVpdHNlcmdlYm5pcyBmXHUwMGZjciBkYXMgTWV0aG9kZW5lbGVtZW50IHp1Z2VvcmRuZXQgaXN0Lg0KLVByb2Nlc3NfQ29tcG9zaXRlUm9sZUFzc2lnbkVycm9yPUlVUEEwMDg2RTogJyd7MH0nJyBrYW5uIGRlciBrb21iaW5pZXJ0ZW4gUm9sbGUgJyd7MX0nJyBuaWNodCBoaW56dWdlZlx1MDBmY2d0IHdlcmRlbiwgd2VpbCBrZWluZSBNZXRob2RlbmVsZW1lbnRyb2xsZSB6dWdlb3JkbmV0IGlzdC4NCi1Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlck1lc3NhZ2U9SVVQQTAwODdXOiBHZWJlbiBTaWUgZWluZSBnXHUwMGZjbHRpZ2UgWmFobCBmXHUwMGZjciBkaWUgVm9yZ1x1MDBlNG5nZXIgYW4uDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJUaXRsZT1VbmdcdTAwZmNsdGlnZSBWb3JnXHUwMGU0bmdlci1JRA0KLQ0KLVByb2Nlc3NfTm9JdGVtcz1FcyB3dXJkZW4ga2VpbmUgRWludHJcdTAwZTRnZSBhdXNnZXdcdTAwZTRobHQNCi1Qcm9jZXNzX0l0ZW1zU2VsZWN0ZWQ9RXMgd3VyZGVuIHswfSBFaW50clx1MDBlNGdlIGF1c2dld1x1MDBlNGhsdA0KLVByb2Nlc3NfTm9Qcm9wZXJ0aWVzQXZhaWxhYmxlPUVzIHNpbmQga2VpbmUgTWVya21hbGUgdmVyZlx1MDBmY2diYXINCi0NCi1QcmVkZWNlc3NvckRpYWxvZ19UaXRsZT1BYmhcdTAwZTRuZ2lna2VpdCB2b20gVm9yZ1x1MDBlNG5nZXINCi1QcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlPUFiaFx1MDBlNG5naWdrZWl0c3R5cCBmXHUwMGZjciBWb3JnXHUwMGU0bmdlciBlaW5nZWJlbjoNCi1QcmVkZWNlc3NvckRpYWxvZ19JbmRleD1JbmRleDoNCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lPVByXHUwMGU0c2VudGF0aW9uc25hbWU6DQotUHJlZGVjZXNzb3JEaWFsb2dfRGVwZW5kZW5jeT1BYmhcdTAwZTRuZ2lna2VpdDoNCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGU9Vm9yZ1x1MDBlNG5nZXINCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yTWVzc2FnZT1JVVBBMDA4OEU6IEVzIGlzdCBiZXJlaXRzIGVpbiBWb3JnXHUwMGU0bmdlciBtaXQgZGllc2VyIElEIGZcdTAwZmNyIGRhcyBQcm9qZWt0c3RydWt0dXJlbGVtZW50IHZvcmhhbmRlbi4NCi0NCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfdGV4dEVkaXRDZWxsX3Byb2JsZW1fbXNnPUlVUEEwMDkwRTogQmVpbSBCZWFyYmVpdGVuIGVpbmVyIEVpZ2Vuc2NoYWZ0IGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLg0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc19jZWxsRWRpdG9yX2ludmFsaWRQcmVkY2Vzc29yX3Byb2JsZW1fbXNnPUlVUEEwMDg5VzogVW5nXHUwMGZjbHRpZ2UgVm9yZ1x1MDBlNG5nZXJsaXN0ZQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDNkMjBmNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9SW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsDQotUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGU9SW5mb3JtYWNpXHUwMGYzbiBzb2JyZSBsYSBkb2N1bWVudGFjaVx1MDBmM24NCi1BY3Rpdml0eV9ndWlkYW5jZUluZm9ybWF0aW9uVGl0bGU9R3VcdTAwZWRhDQotQnJlYWtkb3duRWxlbWVudF9vcHRpb25JbmZvcm1hdGlvblRpdGxlPU9wY2lvbmVzIGRlIGRlc2dsb3NlDQotVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uVGl0bGU9UGFzb3MNCi0NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Fc3BlY2lmaXF1ZSBsb3MgcGFzb3MgcXVlIGRlYmUgcmVhbGl6YXIgZXN0ZSBkZXNjcmlwdG9yIGRlIHRhcmVhcy4NCi0NCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGU6IHswfS4NCi1Qcm9jZXNzX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIHNvYnJlIGxhIGRvY3VtZW50YWNpXHUwMGYzbiBkZTogezB9Lg0KLQ0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RlIGRlc2NyaXB0b3IuDQotRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGV0YWxsYWRhIGFjZXJjYSBkZSBlc3RlIGRlc2NyaXB0b3IuDQotTWlsZXN0b25lX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0ZSBvYmpldGl2by4NCi1NaWxlc3RvbmVfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0ZSBvYmpldGl2by4NCi0NCi1CcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0ZSBlbGVtZW50byBkZSBkZXNnbG9zZS4NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGUgZWxlbWVudG8gZGUgZGVzZ2xvc2UgZGVsIHRyYWJham8uDQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdG9uPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0ZSBkZXNjcmlwdG9yLg0KLUFjdGl2aXR5X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0YSBhY3RpdmlkYWQuDQotDQotQnJlYWtkb3duRWxlbWVudF9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBzb2JyZSBsYSBkb2N1bWVudGFjaVx1MDBmM24gZGUgZXN0ZSBlbGVtZW50byBkZSBkZXNnbG9zZS4NCi1BY3Rpdml0eV9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBzb2JyZSBsYSBkb2N1bWVudGFjaVx1MDBmM24gZGUgZXN0YSBhY3RpdmlkYWQuDQotRGVzY3JpcHRvcl9kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBzb2JyZSBsYSBkb2N1bWVudGFjaVx1MDBmM24gZGUgZXN0ZSBkZXNjcmlwdG9yLg0KLVByb2Nlc3NfTm9uZT08PCBOT05FID4+DQotUHJvY2Vzc19uYW1lPU5vbWJyZToNCi1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9Tm9tYnJlIGRlIHByZXNlbnRhY2lcdTAwZjNuOg0KLVByb2Nlc3NfYnJpZWZEZXNjcmlwdGlvbj1EZXNjcmlwY2lcdTAwZjNuIGJyZXZlOg0KLVByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uPSBEZXNjcmlwY2lcdTAwZjNuIHByaW5jaXBhbDoNCi1Qcm9jZXNzX3B1cnBvc2U9T2JqZXRpdm86DQotUHJvY2Vzc19wcmVmaXg9UHJlZmlqbzoNCi0NCi1CcmVha2Rvd25FbGVtZW50X1R5cGVfTmFtZT1FbGVtZW50byBkZSBkZXNnbG9zZQ0KLQ0KLVByb2Nlc3NfVHlwZV9UYXNrPVRhcmVhIGRlbCBtXHUwMGU5dG9kbzoNCi1Qcm9jZXNzX1R5cGVfUm9sZT1Sb2wgZGVsIG1cdTAwZTl0b2RvOg0KLVByb2Nlc3NfVHlwZV9Xb3JrUHJvZHVjdD1Qcm9kdWN0byBkZSB0cmFiYWpvIGRlIG1cdTAwZTl0b2RvOg0KLQ0KLVdvcmtQcm9kdWN0X1R5cGU9VGlwbyBkZSBwcm9kdWN0byBkZSB0cmFiYWpvOg0KLQ0KLUFjdGl2aXR5X01vZGVsSW5mbz1JbmZvcm1hY2lcdTAwZjNuIGRlbCBtb2RlbG86DQotQWN0aXZpdHlfVHlwZT1UaXBvIGRlIGFjdGl2aWRhZDoNCi1BY3Rpdml0eV9wcmVzZW50YXRpb25OYW1lPU5vbWJyZSBkZSBwcmVzZW50YWNpXHUwMGYzbjoNCi1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmFzOg0KLUFjdGl2aXR5X2hvd1RvU3RhZmY9Q1x1MDBmM21vIHByb3ZlZXIgZGUgcGVyc29uYWw6DQotQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucz1GYWN0b3JlcyBjbGF2ZToNCi1Qcm9jZXNzX3VzYWdlR3VpZGFuY2U9R3VcdTAwZWRhIGRlIHV0aWxpemFjaVx1MDBmM246DQotDQotQWN0aXZpdHlfUm9hZG1hcFRpdGxlPU1hcGFzDQotQWN0aXZpdHlfUm9hZG1hcERlc2NyaXB0aW9uPVByb3BvcmNpb25hciBlbmxhY2VzIGEgaW5mb3JtYWNpXHUwMGYzbiBhZGljaW9uYWwgZW4gZm9ybWEgZGUgbWFwYXMuDQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlVGl0bGU9R3VcdTAwZWRhIGdlbmVyYWwNCi1BY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VEZXNjcmlwdGlvbj1Qcm9wb3JjaW9uYXIgZW5sYWNlcyBhIGluZm9ybWFjaVx1MDBmM24gYWRpY2lvbmFsIGVuIGZvcm1hIGRlIGd1XHUwMGVkYS4NCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxUaXRsZT1NYXRlcmlhbGVzIGRlIGNvbXVuaWNhY2lcdTAwZjNuDQotQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249UHJvcG9yY2lvbmFyIGVubGFjZXMgYSBpbmZvcm1hY2lcdTAwZjNuIGFkaWNpb25hbCBlbiBmb3JtYSBkZSBtYXRlcmlhbGVzIGRlIGNvbXVuaWNhY2lcdTAwZjNuLg0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU9TWF0ZXJpYWxlcyBkZSBmb3JtYWNpXHUwMGYzbg0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249UHJvcG9yY2lvbmFyIGVubGFjZXMgYSBpbmZvcm1hY2lcdTAwZjNuIGFkaWNpb25hbCBlbiBmb3JtYSBkZSBtYXRlcmlhbGVzIGRlIGZvcm1hY2lcdTAwZjNuLg0KLQ0KLUFjdGl2aXR5X1NlbGVjdGVkX1JvYWRtYXA9TWFwYXM6DQotQWN0aXZpdHlfU2VsZWN0ZWRfR2VuZXJhbEd1aWRhbmNlPUd1XHUwMGVkYToNCi1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9TWF0ZXJpYWxlcyBkZSBjb211bmljYWNpXHUwMGYzbjoNCi1BY3Rpdml0eV9TZWxlY3RlZF9FZHVjYXRpb25NYXRlcmlhbD1NYXRlcmlhbGVzIGRlIGZvcm1hY2lcdTAwZjNuOg0KLQ0KLUFjdGl2aXR5X0RpYWdyYW1UaXRsZT1EaWFncmFtYQ0KLUFjdGl2aXR5X0RpYWdyYW1EZXNjcmlwdGlvbiA9IFByb3BvcmNpb25hciBpbVx1MDBlMWdlbmVzIGRlIGRpYWdyYW1hIHBhcmEgZXN0ZSB7MH0uDQotQWN0aXZpdHlfQURJbWFnZT1EaWFncmFtYSBkZSBsYSBhY3RpdmlkYWQNCi1BY3Rpdml0eV9BRERJbWFnZT1EaWFncmFtYSBkZSBkZXRhbGxlcyBkZSBsYSBhY3RpdmlkYWQNCi1BY3Rpdml0eV9XUERJbWFnZT1EaWFncmFtYSBkZSBkZXBlbmRlbmNpYSBkZWwgcHJvZHVjdG8gZGUgdHJhYmFqbw0KLUFjdGl2aXR5X1VzZUFESW1hZ2U9VXRpbGl6YXIgZWwgZGlhZ3JhbWEgZGUgbGEgYWN0aXZpZGFkIHBhcmEgcHVibGljYXINCi1BY3Rpdml0eV9Vc2VBRERJbWFnZT1VdGlsaXphciBlbCBkaWFncmFtYSBkZSBkZXRhbGxlIGRlIGxhIGFjdGl2aWRhZCBwYXJhIHB1YmxpY2FyDQotQWN0aXZpdHlfVXNlV1BESW1hZ2U9VXRpbGl6YXIgZWwgZGlhZ3JhbWEgZGUgZGVwZW5kZW5jaWEgZGVsIHByb2R1Y3RvIGRlIHRyYWJham8gcGFyYSBwdWJsaWNhcg0KLUFjdGl2aXR5X0Fzc2lnbj1Bc2lnbmFyLi4uDQotDQotVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM9UGFzb3M6DQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ1RpdGxlPVBhc29zDQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2U9U2VsZWNjaW9uYXIgcGFzb3MNCi0NCi1BY3Rpdml0eV9Xb3JrUm9sbHVwPVRyYWJhamFyIGNvbiBlbGVtZW50b3MgY29udHJhXHUwMGVkZG9zDQotQWN0aXZpdHlfVGVhbVJvbGx1cD1FbGVtZW50b3MgY29udHJhXHUwMGVkZG9zIGRlIEVxdWlwbw0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cD1UcmFiYWphciBjb24gZWxlbWVudG9zIGNvbnRyYVx1MDBlZGRvcyBkZSBwcm9kdWN0b3MNCi1BY3Rpdml0eV9Xb3JrUm9sbHVwRGVzY3JpcHRpb249UmV2aXNhciBsb3MgZWxlbWVudG9zIGNvbnRyYVx1MDBlZGRvcyBkZSB0cmFiYWpvIHBhcmEgZXN0YSBhY3RpdmlkYWQgZW4gZXN0YSBzZWNjaVx1MDBmM24uDQotQWN0aXZpdHlfVGVhbVJvbGx1cERlc2NyaXB0aW9uPVJldmlzYXIgbG9zIGVsZW1lbnRvcyBjb250cmFcdTAwZWRkb3MgZGUgZXF1aXBvIHBhcmEgZXN0YSBhY3RpdmlkYWQgZW4gZXN0YSBzZWNjaVx1MDBmM24uDQotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb249UmV2aXNhciBsb3MgZWxlbWVudG9zIGNvbnRyYVx1MDBlZGRvcyBkZSBwcm9kdWN0byBkZSB0cmFiYWpvIHBhcmEgZXN0YSBhY3RpdmlkYWQgZW4gZXN0YSBzZWNjaVx1MDBmM24uDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fTXVsdGlwbGVPY3VycmFuY2U9VmFyaWFzIGFwYXJpY2lvbmVzDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fT3B0aW9uYWw9T3BjaW9uYWwNCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9QbGFubmVkPVBsYW5lYWRvDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkPVN1cHJpbWlkbw0KLQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0V2ZW50RHJpdmVuPUNvbmRpY2lvbmFkbyBwb3Igc3VjZXNvcw0KLVdvcmtCcmVha2Rvd25FbGVtZW50X09uZ29pbmc9Q29udGludW8NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9SZXBlYXRhYmxlPVNlIHB1ZWRlIHJlcGV0aXINCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcnM9UHJlZGVjZXNvcmVzOg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3k9RGVwZW5kZW5jaWE6DQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfSURfVEVYVD1cdTAwY2RuZGljZQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX1BSRVNFTlRBVElPTl9OQU1FX1RFWFQ9Tm9tYnJlIGRlIHByZXNlbnRhY2lcdTAwZjNuDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfREVQRU5ERU5DWV9URVhUPURlcGVuZGVuY2lhDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9BZGQ9QVx1MDBmMWFkaXINCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQ9RWRpdGFyDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU9RWxpbWluYXINCi0NCi1Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19TVEFSVD1GaW5hbGl6YWNpXHUwMGYzbiBhIGluaWNpbw0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSD1GaW5hbGl6YWNpXHUwMGYzbiBhIGZpbmFsaXphY2lcdTAwZjNuDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g9SW5pY2lvIGEgZmluYWxpemFjaVx1MDBmM24NCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUPUluaWNpbyBhIGluaWNpbw0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZD1TaW5jcm9uaXphZG8gY29uIGVsIG9yaWdlbg0KLQ0KLURlc2NyaXB0b3JfUmVmaW5lZERlc2NyaXB0aW9uPURlc2NyaXBjaVx1MDBmM24gcGVyZmVjY2lvbmFkYToNCi0NCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9Um9sZXMNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb249QXNpZ25lIGxvcyBkZXNjcmlwdG9yZXMgZGUgcm9sZXMgcGFyYSBlZmVjdHVhciBlc3RlIGRlc2NyaXB0b3IgZGUgdGFyZWFzLg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1SZWFsaXphZG9yIHByaW5jaXBhbDoNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9UmVhbGl6YWRvcmVzIGFkaWNpb25hbGVzOg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMz1Bc2lzdGlkbyBwb3I6DQotDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZT1Qcm9kdWN0b3MgZGUgdHJhYmFqbw0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249RXNwZWNpZmlxdWUgbG9zIGRlc2NyaXB0b3JlcyBkZSBwcm9kdWN0b3MgZGUgdHJhYmFqbyBkZSBzYWxpZGEgeSBlbnRyYWRhIHBhcmEgZXN0ZSBkZXNjcmlwdG9yIGRlIHRhcmVhcy4NCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPUVudHJhZGEgb2JsaWdhdG9yaWE6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1FbnRyYWRhIG9wY2lvbmFsOg0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTM9RW50cmFkYSBleHRlcm5hOg0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTQ9U2FsaWRhOg0KLQ0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25UaXRsZT1UYXJlYXMNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb249RXN0ZSBkZXNjcmlwdG9yIGRlIHJvbGVzIGVzIGVsIHJlYWxpemFkb3IgZGUgbG9zIHNpZ3VpZW50ZXMgZGVzY3JpcHRvcmVzIGRlIHRhcmVhcy4NCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTE9UmVhbGl6YWRvciBwcmluY2lwYWw6DQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUyPVJlYWxpemFkb3JlcyBhZGljaW9uYWxlczoNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTM9QXNpc3RpZG8gcG9yOg0KLQ0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9UHJvZHVjdG9zIGRlIHRyYWJham8NCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uPUVzdGUgZGVzY3JpcHRvciBkZSByb2xlcyBlcyByZXNwb25zYWJsZSBkZSBsb3Mgc2lndWllbnRlcyBkZXNjcmlwdG9yZXMgZGUgcHJvZHVjdG9zIGRlIHRyYWJham8geSBsb3MgbW9kaWZpY2EuDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1SZXNwb25zYWJsZSBkZToNCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyPU1vZGlmaWNhOg0KLQ0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9Um9sZXMNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPUxvcyBzaWd1aWVudGVzIGRlc2NyaXB0b3JlcyBkZSByb2xlcyBzb24gcmVzcG9uc2FibGVzIGRlIGVzdGUgZGVzY3JpcHRvciBkZSBwcm9kdWN0b3MgZGUgdHJhYmFqbyB5IGxvIG1vZGlmaWNhbi4NCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUxPVJlc3BvbnNhYmxlIGRlOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9TW9kaWZpY2FkbyBwb3I6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1R5cGU9VGlwbzoNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlPUVzdGFkbyBkZSBlbnRyYWRhIGRlIGFjdGl2aWRhZDoNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGU9RXN0YWRvIGRlIHNhbGlkYSBkZSBhY3RpdmlkYWQ6DQotDQotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uVGl0bGU9Q29tcG9uZW50ZXMgZGUgcHJvZHVjdG8gZmluYWwNCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbj1FbCBwcm9kdWN0byBmaW5hbCB0aWVuZSBsb3Mgc2lndWllbnRlcyBjb21wb25lbnRlcyBkZSBwcm9kdWN0byBmaW5hbC4NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMT1Db21wb25lbnRlcyBkZSBwcm9kdWN0byBmaW5hbA0KLQ0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvblRpdGxlPUVxdWlwb3MNCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25EZXNjcmlwdGlvbj1Fc3RlIGRlc2NyaXB0b3IgZGUgcm9sZXMgaGFjZSByZWZlcmVuY2lhIGEgbG9zIHNpZ3VpZW50ZXMgZXF1aXBvcy4NCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMT1FcXVpcG9zOg0KLQ0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU9Um9sZXMNCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uPUVzdGUgcm9sIGNvbXB1ZXN0byB0aWVuZSBsb3Mgc2lndWllbnRlcyByb2xlcyBhZ3JlZ2Fkb3MuDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1RhYmxlMT1Sb2xlcyBhZ3JlZ2Fkb3M6DQotDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uVGl0bGU9Um9sZXMNCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1BXHUwMGYxYWRpciBvIGVsaW1pbmFyIHJvbGVzIGEvZGVsIHBlcmZpbCBkZWwgZXF1aXBvLg0KLVRlYW1Qcm9maWxlX1JvbGVfVGFibGUxPVJvbGVzOg0KLQ0KLVByb2Nlc3NfUmljaFRleHRfQ29sbGFwc2VJbWFnZT1jb2xsYXBzZWQuZ2lmDQotUHJvY2Vzc19SaWNoVGV4dF9FeHBhbmRJbWFnZT1leHBhbmRlZC5naWYNCi1Qcm9jZXNzX0FkZD1BXHUwMGYxYWRpci4uLg0KLVByb2Nlc3NfQWRkRnJvbVByb2Nlc3M9QVx1MDBmMWFkaXIgZGVzZGUgZWwgcHJvY2Vzby4uLg0KLVByb2Nlc3NfUmVuYW1lX01lc3NhZ2U9RXN0XHUwMGUxIGEgcHVudG8gZGUgY2FtYmlhciBlbCBub21icmUgZGUgZXN0ZSBwcm9jZXNvLiBFc3RhIG9wZXJhY2lcdTAwZjNuIGd1YXJkYXJcdTAwZTEgZWwgZWRpdG9yIHkgY2FtYmlhclx1MDBlMSBlbCBub21icmUgZGUgbGEgY2FycGV0YSBkZWwgcHJvY2VzbyBwb3IgZWwgbm9tYnJlIG51ZXZvLiBcdTAwYmZEZXNlYSBjb250aW51YXI/DQotUHJvY2Vzc19SZW1vdmU9RWxpbWluYXINCi1Qcm9jZXNzX1VwPUFycmliYQ0KLVByb2Nlc3NfRG93bj1BYmFqbw0KLVByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb249U2VsZWNjaVx1MDBmM24gbVx1MDBmYWx0aXBsZQ0KLVByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50PUVubGF6YXIgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8uLi4NCi0NCi0jIyBFcnJvci9XYXJuaW5nDQotUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlPU5vbWJyZSBubyB2XHUwMGUxbGlkbw0KLVByb2Nlc3NfSW52YWxpZE5hbWU9SVVQQTAwODFFOiBFbCBub21icmUgbm8gcHVlZGUgZXN0YXIgdmFjXHUwMGVkby4gRXNwZWNpZmlxdWUgdW4gbm9tYnJlIHZcdTAwZTFsaWRvLg0KLVByb2Nlc3NfUmVuYW1lX1RpdGxlPVJlbm9tYnJhcg0KLVByb2Nlc3NfSW52YWxpZFByZXNlbnRhdGlvbk5hbWU9SVVQQTAwODJFOiBFbCBub21icmUgZGUgcHJlc2VudGFjaVx1MDBmM24gbm8gcHVlZGUgZXN0YXIgdmFjXHUwMGVkby4gRXNwZWNpZmlxdWUgdW4gbm9tYnJlIGRlIHByZXNlbnRhY2lcdTAwZjNuIHZcdTAwZTFsaWRvLg0KLVByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZT1FbmxhemFyIGVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvDQotUHJvY2Vzc19JbnZhbGlkTGlua01ldGhvZEVsZW1lbnQ9SVVQQTAwODNFOiBObyBzZSBwdWVkZSBlbmxhemFyIGNvbiAnJ3swfScnIHBvcnF1ZSBoYXkgb3RybyBkZXNjcmlwdG9yIGRlbCBtaXNtbyBwYWRyZSBxdWUgZXN0XHUwMGUxIHV0aWxpemFuZG8gZXN0ZSBlbGVtZW50byBkZSBtXHUwMGU5dG9kby4NCi1Qcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGU9SW5mb3JtYWNpXHUwMGYzbg0KLVByb2Nlc3NfVGVhbUFzc2lnbkVycm9yPUlVUEEwMDg0RTogTm8gc2UgcHVlZGUgYVx1MDBmMWFkaXIgJyd7MH0nJyBhbCBlcXVpcG8gJyd7MX0nJyBcblxuRWwgZGVzY3JpcHRvciBkZSByb2xlcyBkZWJlIHRlbmVyIGVsIHJvbCBkZSBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyBxdWUgdGllbmUgYXNvY2lhZG8gYXNpZ25hZG8gYWwgZXF1aXBvLlxuXG4gQXJyZWdsZSBwcmltZXJvIGxhIGFzb2NpYWNpXHUwMGYzbiB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZT1TZWxlY2Npb25hciBlcXVpcG9zDQotUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGU9RXF1aXBvcw0KLQ0KLVByb2Nlc3NfRGVsaXZlcmFibGVBc3NpZ25FcnJvcj1JVVBBMDA4NUU6IE5vIHNlIHB1ZWRlIGFcdTAwZjFhZGlyICcnezB9JycgYWwgcHJvZHVjdG8gZmluYWwgJyd7MX0nJyBwb3JxdWUgbm8gdGllbmUgdW4gcHJvZHVjdG8gZGUgdHJhYmFqbyBkZSBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyBhc29jaWFkby4NCi1Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcj1JVVBBMDA4NkU6IE5vIHNlIHB1ZWRlIGFcdTAwZjFhZGlyICcnezB9JycgYWwgcm9sIGNvbXB1ZXN0byAnJ3sxfScnIHBvcnF1ZSBubyB0aWVuZSB1biByb2wgZGUgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gYXNvY2lhZG8uDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlPUlVUEEwMDg3VzogRXNwZWNpZmlxdWUgdW4gblx1MDBmYW1lcm8gdlx1MDBlMWxpZG8gcGFyYSBsb3MgcHJlZGVjZXNvcmVzLg0KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGU9SUQgZGUgcHJlZGVjZXNvciBubyB2XHUwMGUxbGlkbw0KLQ0KLVByb2Nlc3NfTm9JdGVtcz1ObyBzZSBoYSBzZWxlY2Npb25hZG8gbmluZ1x1MDBmYW4gZWxlbWVudG8NCi1Qcm9jZXNzX0l0ZW1zU2VsZWN0ZWQ9SGF5IHswfSBlbGVtZW50b3Mgc2VsZWNjaW9uYWRvcw0KLVByb2Nlc3NfTm9Qcm9wZXJ0aWVzQXZhaWxhYmxlPU5vIGhheSBwcm9waWVkYWRlcyBkaXNwb25pYmxlcw0KLQ0KLVByZWRlY2Vzc29yRGlhbG9nX1RpdGxlPURlcGVuZGVuY2lhIGRlbCBwcmVkZWNlc29yDQotUHJlZGVjZXNzb3JEaWFsb2dfSGVhZGVyTWVzc2FnZT1Fc3BlY2lmaXF1ZSB1biB0aXBvIGRlIGRlcGVuZGVuY2lhIHBhcmEgZWwgcHJlZGVjZXNvcjoNCi1QcmVkZWNlc3NvckRpYWxvZ19JbmRleD1cdTAwY2RuZGljZToNCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lPU5vbWJyZSBkZSBwcmVzZW50YWNpXHUwMGYzbjoNCi1QcmVkZWNlc3NvckRpYWxvZ19EZXBlbmRlbmN5PURlcGVuZGVuY2lhOg0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZT1QcmVkZWNlc29yDQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2U9SVVQQTAwODhFOiBZYSBleGlzdGUgdW4gcHJlZGVjZXNvciBjb24gZXNlIElEIHBhcmEgZXN0ZSBlbGVtZW50byBkZSBkZXNnbG9zZSBkZSB0cmFiYWpvLg0KLQ0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c9SVVQQTAwOTBFOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgZWRpdGFyIGxhIHByb3BpZWRhZC4NCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZz1JVVBBMDA4OVc6IExpc3RhIGRlIHByZWRlY2Vzb3JlcyBubyB2XHUwMGUxbGlkYQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2UyMjNmNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9SW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMNCi1Qcm9jZXNzX0RvY3VtZW50SW5mb3JtYXRpb25UaXRsZT1JbmZvcm1hdGlvbnMgc3VyIGxhIGRvY3VtZW50YXRpb24NCi1BY3Rpdml0eV9ndWlkYW5jZUluZm9ybWF0aW9uVGl0bGU9Q29uc2VpbA0KLUJyZWFrZG93bkVsZW1lbnRfb3B0aW9uSW5mb3JtYXRpb25UaXRsZT1PcHRpb25zIGRlIHJcdTAwZTlwYXJ0aXRpb24NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZT1FdGFwZXMNCi0NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1TcFx1MDBlOWNpZmlleiBsZXMgXHUwMGU5dGFwZXMgXHUwMGUwIHN1aXZyZSBwb3VyIGxhbmNlciBjZSBkZXNjcmlwdGV1ciBkZSB0XHUwMGUyY2hlLg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgXHUwMGUwIHByb3BvcyBkZSBjZSB7MH0uDQotUHJvY2Vzc19kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIGRvY3VtZW50YXRpb24gXHUwMGUwIHByb3BvcyBkZSBjZSB7MH0uDQotDQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNlIGRlc2NyaXB0ZXVyLg0KLURlc2NyaXB0b3JfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZFx1MDBlOXRhaWxsXHUwMGU5ZXMgXHUwMGUwIHByb3BvcyBkZSBjZSBkZXNjcmlwdGV1ci4NCi1NaWxlc3RvbmVfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgXHUwMGUwIHByb3BvcyBkZSBjZSBqYWxvbi4NCi1NaWxlc3RvbmVfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZFx1MDBlOXRhaWxsXHUwMGU5ZXMgXHUwMGUwIHByb3BvcyBkZSBjZSBqYWxvbi4NCi0NCi1CcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0IFx1MDBlOWxcdTAwZTltZW50IGRlIHJcdTAwZTlwYXJ0aXRpb24uDQotV29ya0JyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgXHUwMGUwIHByb3BvcyBkZSBjZXQgXHUwMGU5bFx1MDBlOW1lbnQgZGUgclx1MDBlOXBhcnRpdGlvbiBkdSB0cmF2YWlsLg0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRvbj1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNlIGRlc2NyaXB0ZXVyLg0KLUFjdGl2aXR5X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgYWN0aXZpdFx1MDBlOS4NCi0NCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgZG9jdW1lbnRhdGlvbiBcdTAwZTAgcHJvcG9zIGRlIGNldCBcdTAwZTlsXHUwMGU5bWVudCBkZSByXHUwMGU5cGFydGl0aW9uLg0KLUFjdGl2aXR5X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgZG9jdW1lbnRhdGlvbiBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIGFjdGl2aXRcdTAwZTkuDQotRGVzY3JpcHRvcl9kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIGRvY3VtZW50YXRpb24gXHUwMGUwIHByb3BvcyBkZSBjZSBkZXNjcmlwdGV1ci4NCi1Qcm9jZXNzX05vbmU9PDwgTkVBTlQgPj4NCi1Qcm9jZXNzX25hbWU9Tm9tIDoNCi1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9Tm9tIGRlIHByXHUwMGU5c2VudGF0aW9uIDoNCi1Qcm9jZXNzX2JyaWVmRGVzY3JpcHRpb249RGVzY3JpcHRpZiBjb3VydCA6DQotUHJvY2Vzc19tYWluRGVzY3JpcHRpb249IERlc2NyaXB0aWYgcHJpbmNpcGFsIDoNCi1Qcm9jZXNzX3B1cnBvc2U9T2JqZXQgOg0KLVByb2Nlc3NfcHJlZml4PVByXHUwMGU5Zml4ZSA6DQotDQotQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU9RWxcdTAwZTltZW50IGRlIHJcdTAwZTlwYXJ0aXRpb24NCi0NCi1Qcm9jZXNzX1R5cGVfVGFzaz1UXHUwMGUyY2hlIGRlIG1cdTAwZTl0aG9kZSA6DQotUHJvY2Vzc19UeXBlX1JvbGU9Ulx1MDBmNGxlIGRlIG1cdTAwZTl0aG9kZSA6DQotUHJvY2Vzc19UeXBlX1dvcmtQcm9kdWN0PVByb2R1aXQgZGUgbVx1MDBlOXRob2RlIDoNCi0NCi1Xb3JrUHJvZHVjdF9UeXBlPVR5cGUgZGUgcHJvZHVpdCA6DQotDQotQWN0aXZpdHlfTW9kZWxJbmZvPUluZm9ybWF0aW9ucyByZWxhdGl2ZXMgYXUgbW9kXHUwMGU4bGUgOg0KLUFjdGl2aXR5X1R5cGU9VHlwZSBkJ2FjdGl2aXRcdTAwZTkgOg0KLUFjdGl2aXR5X3ByZXNlbnRhdGlvbk5hbWU9Tm9tIGRlIHByXHUwMGU5c2VudGF0aW9uIDoNCi1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmVzIDoNCi1BY3Rpdml0eV9ob3dUb1N0YWZmPURvdGF0aW9uIGVuIHBlcnNvbm5lbCA6DQotQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucz1Db25zaWRcdTAwZTlyYXRpb25zIGNsXHUwMGU5cyA6DQotUHJvY2Vzc191c2FnZUd1aWRhbmNlPUluc3RydWN0aW9ucyBkJ3V0aWxpc2F0aW9uIDoNCi0NCi1BY3Rpdml0eV9Sb2FkbWFwVGl0bGU9Q2FsZW5kcmllcnMNCi1BY3Rpdml0eV9Sb2FkbWFwRGVzY3JpcHRpb249Rm91cm5pdCBkZXMgbGllbnMgdmVycyBkZXMgaW5mb3JtYXRpb25zIGNvbXBsXHUwMGU5bWVudGFpcmVzIHNvdXMgbGEgZm9ybWUgZGUgZmV1aWxsZXMgZGUgcm91dGUuDQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlVGl0bGU9Q29uc2VpbHMgZ1x1MDBlOW5cdTAwZTlyYXV4DQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlRGVzY3JpcHRpb249Rm91cm5pdCBkZXMgbGllbnMgdmVycyBkZXMgaW5mb3JtYXRpb25zIGNvbXBsXHUwMGU5bWVudGFpcmVzIHNvdXMgbGEgZm9ybWUgZGUgY29uc2VpbHMuDQotQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsVGl0bGU9RG9jdW1lbnRzIGRlIGNvbW11bmljYXRpb24NCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1Gb3Vybml0IGRlcyBsaWVucyB2ZXJzIGRlcyBpbmZvcm1hdGlvbnMgY29tcGxcdTAwZTltZW50YWlyZXMgc291cyBsYSBmb3JtZSBkZSBkb2N1bWVudHMgZGUgY29tbXVuaWNhdGlvbi4NCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlPURvY3VtZW50cyBkZSBmb3JtYXRpb24NCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPUZvdXJuaXQgZGVzIGxpZW5zIHZlcnMgZGVzIGluZm9ybWF0aW9ucyBjb21wbFx1MDBlOW1lbnRhaXJlcyBzb3VzIGxhIGZvcm1lIGRlIGRvY3VtZW50cyBkZSBmb3JtYXRpb24uDQotDQotQWN0aXZpdHlfU2VsZWN0ZWRfUm9hZG1hcD1GZXVpbGxlcyBkZSByb3V0ZSA6DQotQWN0aXZpdHlfU2VsZWN0ZWRfR2VuZXJhbEd1aWRhbmNlPUNvbnNlaWwgOg0KLUFjdGl2aXR5X1NlbGVjdGVkX0NvbW11bmljYXRpb25NYXRlcmlhbD1Eb2N1bWVudHMgZGUgY29tbXVuaWNhdGlvbiA6DQotQWN0aXZpdHlfU2VsZWN0ZWRfRWR1Y2F0aW9uTWF0ZXJpYWw9RG9jdW1lbnRzIGRlIGZvcm1hdGlvbiA6DQotDQotQWN0aXZpdHlfRGlhZ3JhbVRpdGxlPURpYWdyYW1tZQ0KLUFjdGl2aXR5X0RpYWdyYW1EZXNjcmlwdGlvbiA9IEZvdXJuaXNzZXogZGVzIGltYWdlcyBkZSBkaWFncmFtbWVzIHBvdXIgY2UgezB9Lg0KLUFjdGl2aXR5X0FESW1hZ2U9RGlhZ3JhbW1lIGQnYWN0aXZpdFx1MDBlOQ0KLUFjdGl2aXR5X0FEREltYWdlPURpYWdyYW1tZSBkXHUwMGU5dGFpbGxcdTAwZTkgZCdhY3Rpdml0XHUwMGU5DQotQWN0aXZpdHlfV1BESW1hZ2U9RGlhZ3JhbW1lIGRlIGRcdTAwZTlwZW5kYW5jZSBkZSBwcm9kdWl0DQotQWN0aXZpdHlfVXNlQURJbWFnZT1VdGlsaXNlciBsZSBkaWFncmFtbWUgZCdhY3Rpdml0XHUwMGU5IHBvdXIgbGEgcHVibGljYXRpb24NCi1BY3Rpdml0eV9Vc2VBRERJbWFnZT1VdGlsaXNlciBsZSBkaWFncmFtbWUgZFx1MDBlOXRhaWxsXHUwMGU5IGQnYWN0aXZpdFx1MDBlOSBwb3VyIGxhIHB1YmxpY2F0aW9uDQotQWN0aXZpdHlfVXNlV1BESW1hZ2U9VXRpbGlzZXIgbGUgZGlhZ3JhbW1lIGRlIGRcdTAwZTlwZW5kYW5jZSBkZSBwcm9kdWl0IHBvdXIgbGEgcHVibGljYXRpb24NCi1BY3Rpdml0eV9Bc3NpZ249QXR0cmlidWVyLi4uDQotDQotVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM9RXRhcGVzIDoNCi1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nVGl0bGU9RXRhcGVzDQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2U9U1x1MDBlOWxlY3Rpb25uZXIgbGVzIFx1MDBlOXRhcGVzDQotDQotQWN0aXZpdHlfV29ya1JvbGx1cD1DdW11bCBkZSB0cmF2YWlsDQotQWN0aXZpdHlfVGVhbVJvbGx1cD1DdW11bCBkZSBsJ1x1MDBlOXF1aXBlDQotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwPUN1bXVsIGRlIHByb2R1aXRzDQotQWN0aXZpdHlfV29ya1JvbGx1cERlc2NyaXB0aW9uPVJcdTAwZTl2aXNleiBsZSBjdW11bCBkZSB0cmF2YWlsIHBvdXIgY2V0dGUgYWN0aXZpdFx1MDBlOSBkYW5zIGNldHRlIHNlY3Rpb24uDQotQWN0aXZpdHlfVGVhbVJvbGx1cERlc2NyaXB0aW9uPVJcdTAwZTl2aXNleiBsZSBjdW11bCBkJ1x1MDBlOXF1aXBlIHBvdXIgY2V0dGUgYWN0aXZpdFx1MDBlOSBkYW5zIGNldHRlIHNlY3Rpb24uDQotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb249Ulx1MDBlOXZpc2V6IGxlIGN1bXVsIGRlIHByb2R1aXQgcG91ciBjZXR0ZSBhY3Rpdml0XHUwMGU5IGRhbnMgY2V0dGUgc2VjdGlvbi4NCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9NdWx0aXBsZU9jdXJyYW5jZT1QbHVzaWV1cnMgb2NjdXJyZW5jZXMNCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9PcHRpb25hbD1GYWN1bHRhdGlmDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fUGxhbm5lZD1QbGFuaWZpXHUwMGU5DQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkPVN1cHByaW1cdTAwZTkNCi0NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9FdmVudERyaXZlbj1Db21tYW5kXHUwMGU5IHBhciBsZXMgXHUwMGU5dlx1MDBlOW5lbWVudHMNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9PbmdvaW5nPUVuIGNvdXJzDQotV29ya0JyZWFrZG93bkVsZW1lbnRfUmVwZWF0YWJsZT1SXHUwMGU5aXRcdTAwZTlyYWJsZQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29ycz1Qclx1MDBlOWRcdTAwZTljZXNzZXVycyA6DQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeT1EXHUwMGU5cGVuZGFuY2UgOg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQ9SW5kZXgNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9QUkVTRU5UQVRJT05fTkFNRV9URVhUPU5vbSBkZSBwclx1MDBlOXNlbnRhdGlvbg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0RFUEVOREVOQ1lfVEVYVD1EXHUwMGU5cGVuZGFuY2UNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZD1Bam91dGVyDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9FZGl0PU1vZGlmaWVyDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU9U3VwcHJpbWVyDQotDQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fU1RBUlQ9RmluIGF1IERcdTAwZTlidXQNCi1Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19GSU5JU0g9RmluIFx1MDBlMCBGaW4NCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSD1EXHUwMGU5YnV0IFx1MDBlMCBGaW4NCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUPURcdTAwZTlidXQgYXUgZFx1MDBlOWJ1dA0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZD1TeW5jaHJvbmlzXHUwMGU5IGF2ZWMgbGEgc291cmNlDQotDQotRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb249RGVzY3JpcHRpZiBkXHUwMGU5dGFpbGxcdTAwZTkgOg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1SXHUwMGY0bGVzDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPUFmZmVjdGV6IGxlcyBkZXNjcmlwdGV1cnMgZGUgclx1MDBmNGxlIHBvdXIgbGFuY2VyIGNlIGRlc2NyaXB0ZXVyIGRlIHRcdTAwZTJjaGUuDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUxPUV4XHUwMGU5Y3V0YW50IHByaW5jaXBhbCA6DQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUyPUV4XHUwMGU5Y3V0YW50cyBzdXBwbFx1MDBlOW1lbnRhaXJlcyA6DQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUzPUFpZFx1MDBlOSBwYXIgOg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9UHJvZHVpdHMNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uPVNwXHUwMGU5Y2lmaWV6IGxlcyBkZXNjcmlwdGV1cnMgZGUgcHJvZHVpdCBkJ2VudHJcdTAwZTllIGV0IGRlIHNvcnRpZSBwb3VyIGNlIGRlc2NyaXB0ZXVyIGRlIHRcdTAwZTJjaGUuDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1FbnRyXHUwMGU5ZSBvYmxpZ2F0b2lyZSA6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1FbnRyXHUwMGU5ZSBmYWN1bHRhdGl2ZSA6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMz1FbnRyXHUwMGU5ZSBleHRlcm5lIDoNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGU0PVNvcnRpZSA6DQotDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvblRpdGxlPVRcdTAwZTJjaGVzDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPUNlIGRlc2NyaXB0ZXVyIGRlIHJcdTAwZjRsZSBlc3QgbCdleFx1MDBlOWN1dGFudCBkZXMgZGVzY3JpcHRldXJzIGRlIHRcdTAwZTJjaGUgc3VpdmFudHMuDQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUxPUV4XHUwMGU5Y3V0YW50IHByaW5jaXBhbCA6DQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUyPUV4XHUwMGU5Y3V0YW50cyBzdXBwbFx1MDBlOW1lbnRhaXJlcyA6DQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUzPUFpZFx1MDBlOSBwYXIgOg0KLQ0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9UHJvZHVpdHMNCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uPUNlIGRlc2NyaXB0ZXVyIGRlIHJcdTAwZjRsZSBlc3QgcmVzcG9uc2FibGUgZGVzIGRlc2NyaXB0ZXVycyBkZSBwcm9kdWl0IHN1aXZhbnRzIGV0IGxlcyBtb2RpZmllLg0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTE9UmVzcG9uc2FibGUgZGUgOg0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9TW9kaWZpZSA6DQotDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1SXHUwMGY0bGVzDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbj1MZXMgZGVzY3JpcHRldXJzIGRlIHJcdTAwZjRsZSBzdWl2YW50cyBzb250IHJlc3BvbnNhYmxlcyBkZSBkZSBjZSBkZXNjcmlwdGV1ciBkZSBwcm9kdWl0IGV0IGxlIG1vZGlmaWVudC4NCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUxPVJlc3BvbnNhYmxlIGRlIDoNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUyPU1vZGlmaVx1MDBlOSBwYXIgOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9UeXBlPVR5cGUgOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGU9RXRhdCBkJ2VudHJcdTAwZTllIGRlIGwnYWN0aXZpdFx1MDBlOSA6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlPUV0YXQgZGUgc29ydGllIGRlIGwnYWN0aXZpdFx1MDBlOSA6DQotDQotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uVGl0bGU9Q29tcG9zYW50cyBsaXZyYWJsZXMNCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbj1MZSBsaXZyYWJsZSBjb250aWVudCBsZXMgY29tcG9zYW50cyBsaXZyYWJsZXMgc3VpdmFudHMuDQotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9UYWJsZTE9Q29tcG9zYW50cyBsaXZyYWJsZXMNCi0NCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25UaXRsZT1FcXVpcGVzDQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uRGVzY3JpcHRpb249Q2UgZGVzY3JpcHRldXIgZGUgclx1MDBmNGxlIGZhaXQgclx1MDBlOWZcdTAwZTlyZW5jZSBhdXggXHUwMGU5cXVpcGVzIHN1aXZhbnRlcy4NCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMT1FcXVpcGVzIDoNCi0NCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvblRpdGxlPVJcdTAwZjRsZXMNCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uPUNlIHJcdTAwZjRsZSBjb21wb3NpdGUgY29udGllbnQgbGVzIHJcdTAwZjRsZXMgYWdyXHUwMGU5Z1x1MDBlOXMgc3VpdmFudHMuDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1RhYmxlMT1SXHUwMGY0bGVzIGFnclx1MDBlOWdcdTAwZTlzIDoNCi0NCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25UaXRsZT1SXHUwMGY0bGVzDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249QWpvdXRleiBvdSBzdXBwcmltZXogZGVzIHJcdTAwZjRsZXMgZGFucyBsZSBwcm9maWwgZCdcdTAwZTlxdWlwZS4NCi1UZWFtUHJvZmlsZV9Sb2xlX1RhYmxlMT1SXHUwMGY0bGVzIDoNCi0NCi1Qcm9jZXNzX1JpY2hUZXh0X0NvbGxhcHNlSW1hZ2U9Y29sbGFwc2VkLmdpZg0KLVByb2Nlc3NfUmljaFRleHRfRXhwYW5kSW1hZ2U9ZXhwYW5kZWQuZ2lmDQotUHJvY2Vzc19BZGQ9QWpvdXRlci4uLg0KLVByb2Nlc3NfQWRkRnJvbVByb2Nlc3M9RWZmZWN0dWVyIHVuIGFqb3V0IGRlcHVpcyBsZSBwcm9jZXNzdXMuLi4NCi1Qcm9jZXNzX1JlbmFtZV9NZXNzYWdlPVZvdXMgXHUwMGVhdGVzIHN1ciBsZSBwb2ludCBkZSBjaGFuZ2VyIGxlIG5vbSBkZSBjZSBwcm9jZXNzdXMuIENldHRlIG9wXHUwMGU5cmF0aW9uIGVucmVnaXN0cmVyYSBjZXQgXHUwMGU5ZGl0ZXVyIGV0IHJlbm9tbWVyYSBsZSBkb3NzaWVyIGR1IHByb2Nlc3N1cy4gVm91bGV6LXZvdXMgY29udGludWVyID8NCi1Qcm9jZXNzX1JlbW92ZT1TdXBwcmltZXINCi1Qcm9jZXNzX1VwPUhhdXQNCi1Qcm9jZXNzX0Rvd249QmFzDQotUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbj1TXHUwMGU5bGVjdGlvbiBtdWx0aXBsZQ0KLVByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50PUxpZXIgbCdcdTAwZTlsXHUwMGU5bWVudCBkZSBtXHUwMGU5dGhvZGUuLi4NCi0NCi0jIyBFcnJvci9XYXJuaW5nDQotUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlPU5vbSBub24gdmFsaWRlDQotUHJvY2Vzc19JbnZhbGlkTmFtZT1JVVBBMDA4MUUgOiBMZSBub20gbmUgcGV1dCBwYXMgXHUwMGVhdHJlIHZpZGUuIEluZGlxdWV6IHVuIG5vbSB2YWxpZGUuDQotUHJvY2Vzc19SZW5hbWVfVGl0bGU9UmVub21tZXINCi1Qcm9jZXNzX0ludmFsaWRQcmVzZW50YXRpb25OYW1lPUlVUEEwMDgyRSA6IExlIG5vbSBkZSBwclx1MDBlOXNlbnRhdGlvbiBuZSBwZXV0IHBhcyBcdTAwZWF0cmUgdmlkZS4gSW5kaXF1ZXogdW4gbm9tIGRlIHByXHUwMGU5c2VudGF0aW9uIHZhbGlkZS4NCi1Qcm9jZXNzX0xpbmtNZXRob2RFbGVtZW50VGl0bGU9TGllciBsJ1x1MDBlOWxcdTAwZTltZW50IGRlIG1cdTAwZTl0aG9kZQ0KLVByb2Nlc3NfSW52YWxpZExpbmtNZXRob2RFbGVtZW50PUlVUEEwMDgzRSA6IEltcG9zc2libGUgZCcnXHUwMGU5dGFibGlyIHVuIGxpZW4gdmVycyAnJ3swfScnIGNhciBjZXQgXHUwMGU5bFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlIGVzdCBkXHUwMGU5alx1MDBlMCBlbiBjb3VycyBkJyd1dGlsaXNhdGlvbiBwb3VyIHVuIGF1dHJlIGRlc2NyaXB0ZXVyIGR1IG1cdTAwZWFtZSBwYXJlbnQuDQotUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlPUluZm9ybWF0aW9ucw0KLVByb2Nlc3NfVGVhbUFzc2lnbkVycm9yPUlVUEEwMDg0RSA6IEltcG9zc2libGUgZCcnYWpvdXRlciAnJ3swfScnIFx1MDBlMCBsJydcdTAwZTlxdWlwZSAnJ3sxfScnIFxuXG5MZShzKSBkZXNjcmlwdGV1cihzKSBkZSByXHUwMGY0bGUgZG9pdmVudCBhdm9pciBkZXMgclx1MDBmNGxlcyBkJydcdTAwZTlsXHUwMGU5bWVudHMgZGUgbVx1MDBlOXRob2RlIGFzc29jaVx1MDBlOXMgcG91ciBcdTAwZWF0cmUgYWZmZWN0XHUwMGU5cyBcdTAwZTAgdW5lIFx1MDBlOXF1aXBlLlxuXG4gQ29ycmlnZXogZCcnYWJvcmQgbCcnYXNzb2NpYXRpb24sIHB1aXMgclx1MDBlOWVzc2F5ZXouDQotUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZT1TXHUwMGU5bGVjdGlvbm5leiBsZXMgXHUwMGU5cXVpcGVzDQotUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGU9RXF1aXBlcw0KLQ0KLVByb2Nlc3NfRGVsaXZlcmFibGVBc3NpZ25FcnJvcj1JVVBBMDA4NUUgOiBJbXBvc3NpYmxlIGQnJ2Fqb3V0ZXIgJyd7MH0nJyBhdSBsaXZyYWJsZSAnJ3sxfScnIGNhciBpbCBuZSBjb250aWVudCBhdWN1biBwcm9kdWl0IGQnJ1x1MDBlOWxcdTAwZTltZW50IGRlIG1cdTAwZTl0aG9kZSBhc3NvY2lcdTAwZTkuDQotUHJvY2Vzc19Db21wb3NpdGVSb2xlQXNzaWduRXJyb3I9SVVQQTAwODZFOiBJbXBvc3NpYmxlIGQnJ2Fqb3V0ZXIgJyd7MH0nJyBhdSByXHUwMGY0bGUgY29tcG9zaXRlICcnezF9JycgY2FyIGlsIG5lIGNvbnRpZW50IGF1Y3VuIHJcdTAwZjRsZSBkJydcdTAwZTlsXHUwMGU5bWVudCBkZSBtXHUwMGU5dGhvZGUgYXNzb2NpXHUwMGU5Lg0KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyTWVzc2FnZT1JVVBBMDA4N1cgOiBTYWlzaXNzZXogdW4gbnVtXHUwMGU5cm8gdmFsaWRlIHBvdXIgbGVzIHByXHUwMGU5ZFx1MDBlOWNlc3NldXJzLg0KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGU9SWRlbnRpZmljYXRldXIgZHUgcHJcdTAwZTlkXHUwMGU5Y2Vzc2V1ciBub24gdmFsaWRlDQotDQotUHJvY2Vzc19Ob0l0ZW1zPUF1Y3VuIFx1MDBlOWxcdTAwZTltZW50IHNcdTAwZTlsZWN0aW9ublx1MDBlOQ0KLVByb2Nlc3NfSXRlbXNTZWxlY3RlZD17MH0gXHUwMGU5bFx1MDBlOW1lbnRzIHNcdTAwZTlsZWN0aW9ublx1MDBlOXMNCi1Qcm9jZXNzX05vUHJvcGVydGllc0F2YWlsYWJsZT1BdWN1bmUgcHJvcHJpXHUwMGU5dFx1MDBlOSBkaXNwb25pYmxlDQotDQotUHJlZGVjZXNzb3JEaWFsb2dfVGl0bGU9RFx1MDBlOXBlbmRhbmNlIGRlIHByXHUwMGU5ZFx1MDBlOWNlc3NldXINCi1QcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlPVNhaXNpc3NleiBsZSB0eXBlIGRlIGRcdTAwZTlwZW5kYW5jZSBwb3VyIGxlIHByXHUwMGU5ZFx1MDBlOWNlc3NldXIgOg0KLVByZWRlY2Vzc29yRGlhbG9nX0luZGV4PUluZGV4IDoNCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lPU5vbSBkZSBwclx1MDBlOXNlbnRhdGlvbiA6DQotUHJlZGVjZXNzb3JEaWFsb2dfRGVwZW5kZW5jeT1EXHUwMGU5cGVuZGFuY2UgOg0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZT1Qclx1MDBlOWRcdTAwZTljZXNzZXVyDQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2U9SVVQQTAwODhFIDogTGUgcHJcdTAwZTlkXHUwMGU5Y2Vzc2V1ciBjb250ZW5hbnQgY2V0IGlkZW50aWZpY2F0ZXVyIGV4aXN0ZSBkXHUwMGU5alx1MDBlMCBwb3VyIGNldCBcdTAwZTlsXHUwMGU5bWVudCBkZSByXHUwMGU5cGFydGl0aW9uIGR1IHRyYXZhaWwuDQotDQotUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX3RleHRFZGl0Q2VsbF9wcm9ibGVtX21zZz1JVVBBMDA5MEUgOiBVbmUgZXJyZXVyIHMnZXN0IHByb2R1aXRlIGxvcnMgZGUgbGEgbW9kaWZpY2F0aW9uIGQndW5lIHByb3ByaVx1MDBlOXRcdTAwZTkuDQotUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX2NlbGxFZGl0b3JfaW52YWxpZFByZWRjZXNzb3JfcHJvYmxlbV9tc2c9SVVQQTAwODlXIDogTGlzdGUgZGUgcHJcdTAwZTlkXHUwMGU5Y2Vzc2V1cnMgbm9uIHZhbGlkZQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NmOGI1YS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9SW5mb3JtYXppb25pIGdlbmVyYWxpDQotUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGU9SW5mb3JtYXppb25pIHN1bGxhIGRvY3VtZW50YXppb25lDQotQWN0aXZpdHlfZ3VpZGFuY2VJbmZvcm1hdGlvblRpdGxlPUd1aWRhDQotQnJlYWtkb3duRWxlbWVudF9vcHRpb25JbmZvcm1hdGlvblRpdGxlPU9wemlvbmkgZGkgc3VkZGl2aXNpb25lDQotVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uVGl0bGU9UGFzc2kNCi0NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1TcGVjaWZpY2FyZSBpIHBhc3NpIHBlciBlc2VndWlyZSBxdWVzdG8gZGVzY3JpdHRvcmUgZGkgb3BlcmF6aW9uZS4NCi0NCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byB7MH0uDQotUHJvY2Vzc19kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgZG9jdW1lbnRhemlvbmUgcGVyIHF1ZXN0byB7MH0uDQotDQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdG8gZGVzY3JpdHRvcmUuDQotRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0byBkZXNjcml0dG9yZS4NCi1NaWxlc3RvbmVfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RvIG1pbGVzdG9uZS4NCi1NaWxlc3RvbmVfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdG8gbWlsZXN0b25lLg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RvIGVsZW1lbnRvIGRlbGxhIHN1ZGRpdmlzaW9uZS4NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdG8gZWxlbWVudG8gZGVsbGEgc3VkZGl2aXNpb25lIGRlbCBsYXZvcm8uDQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdG9uPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byBkZXNjcml0dG9yZS4NCi1BY3Rpdml0eV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdGEgYXR0aXZpdFx1MDBlMC4NCi0NCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSBkb2N1bWVudGF6aW9uZSBwZXIgcXVlc3RvIGVsZW1lbnRvIGRlbGxhIHN1ZGRpdmlzaW9uZS4NCi1BY3Rpdml0eV9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgZG9jdW1lbnRhemlvbmUgcGVyIHF1ZXN0YSBhdHRpdml0XHUwMGUwLg0KLURlc2NyaXB0b3JfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIGRvY3VtZW50YXppb25lIHBlciBxdWVzdG8gZGVzY3JpdHRvcmUuDQotUHJvY2Vzc19Ob25lPTw8IE5FU1NVTk8gPj4NCi1Qcm9jZXNzX25hbWU9Tm9tZToNCi1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9Tm9tZSBwcmVzZW50YXppb25lOg0KLVByb2Nlc3NfYnJpZWZEZXNjcmlwdGlvbj1CcmV2ZSBkZXNjcml6aW9uZToNCi1Qcm9jZXNzX21haW5EZXNjcmlwdGlvbj0gRGVzY3JpemlvbmUgcHJpbmNpcGFsZToNCi1Qcm9jZXNzX3B1cnBvc2U9U2NvcG86DQotUHJvY2Vzc19wcmVmaXg9UHJlZmlzc286DQotDQotQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU9RWxlbWVudG8gZGVsbGEgc3VkZGl2aXNpb25lDQotDQotUHJvY2Vzc19UeXBlX1Rhc2s9T3BlcmF6aW9uZSBtZXRvZG86DQotUHJvY2Vzc19UeXBlX1JvbGU9UnVvbG8gbWV0b2RvOg0KLVByb2Nlc3NfVHlwZV9Xb3JrUHJvZHVjdD1Qcm9kb3R0byBkaSBsYXZvcm8gbWV0b2RvOg0KLQ0KLVdvcmtQcm9kdWN0X1R5cGU9VGlwbyBkaSBwcm9kb3R0byBkaSBsYXZvcm86DQotDQotQWN0aXZpdHlfTW9kZWxJbmZvPUluZm9ybWF6aW9uaSBtb2RlbGxvOg0KLUFjdGl2aXR5X1R5cGU9VGlwbyBhdHRpdml0XHUwMGUwOg0KLUFjdGl2aXR5X3ByZXNlbnRhdGlvbk5hbWU9Tm9tZSBwcmVzZW50YXppb25lOg0KLUFjdGl2aXR5X2FsdGVybmF0aXZlcz1BbHRlcm5hdGl2ZToNCi1BY3Rpdml0eV9ob3dUb1N0YWZmPURlZmluaXppb25lIGRlbCBwZXJzb25hbGU6DQotQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucz1Db25zaWRlcmF6aW9uaSBjaGlhdmU6DQotUHJvY2Vzc191c2FnZUd1aWRhbmNlPUd1aWRhIGFsbCd1c286DQotDQotQWN0aXZpdHlfUm9hZG1hcFRpdGxlPVJvYWRtYXANCi1BY3Rpdml0eV9Sb2FkbWFwRGVzY3JpcHRpb249Rm9ybmlyZSBjb2xsZWdhbWVudGkgYSBpbmZvcm1hemlvbmkgYWdnaXVudGl2ZSBzb3R0byBmb3JtYSBkaSByb2FkbWFwLg0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlPUd1aWRhIGdlbmVyYWxlDQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlRGVzY3JpcHRpb249Rm9ybmlyZSBjb2xsZWdhbWVudGkgYSBpbmZvcm1hemlvbmkgYWdnaXVudGl2ZSBzb3R0byBmb3JtYSBkaSBndWlkYS4NCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxUaXRsZT1NYXRlcmlhbGUgcGVyIGxhIGNvbXVuaWNhemlvbmUNCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1Gb3JuaXJlIGNvbGxlZ2FtZW50aSBhIGluZm9ybWF6aW9uaSBhZ2dpdW50aXZlIHNvdHRvIGZvcm1hIGRpIG1hdGVyaWFsZSBwZXIgbGEgY29tdW5pY2F6aW9uZS4NCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlPU1hdGVyaWFsZSBkaWRhdHRpY28NCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPUZvcm5pcmUgY29sbGVnYW1lbnRpIGEgaW5mb3JtYXppb25pIGFnZ2l1bnRpdmUgc290dG8gZm9ybWEgZGkgbWF0ZXJpYWxlIGRpZGF0dGljby4NCi0NCi1BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwPVJvYWRtYXA6DQotQWN0aXZpdHlfU2VsZWN0ZWRfR2VuZXJhbEd1aWRhbmNlPUd1aWRhOg0KLUFjdGl2aXR5X1NlbGVjdGVkX0NvbW11bmljYXRpb25NYXRlcmlhbD1NYXRlcmlhbGUgcGVyIGxhIGNvbXVuaWNhemlvbmU6DQotQWN0aXZpdHlfU2VsZWN0ZWRfRWR1Y2F0aW9uTWF0ZXJpYWw9TWF0ZXJpYWxlIGRpZGF0dGljbzoNCi0NCi1BY3Rpdml0eV9EaWFncmFtVGl0bGU9RGlhZ3JhbW1hDQotQWN0aXZpdHlfRGlhZ3JhbURlc2NyaXB0aW9uID0gRm9ybmlyZSBpbW1hZ2luaSBkaSBkaWFncmFtbWEgcmVsYXRpdmUgYSBxdWVzdG8gezB9Lg0KLUFjdGl2aXR5X0FESW1hZ2U9RGlhZ3JhbW1hIGF0dGl2aXRcdTAwZTANCi1BY3Rpdml0eV9BRERJbWFnZT1EaWFncmFtbWEgZGV0dGFnbGkgYXR0aXZpdFx1MDBlMA0KLUFjdGl2aXR5X1dQREltYWdlPURpYWdyYW1tYSBkaXBlbmRlbnplIHByb2RvdHRvIGRpIGxhdm9ybw0KLUFjdGl2aXR5X1VzZUFESW1hZ2U9VXRpbGl6emFyZSBpbCBEaWFncmFtbWEgZGkgYXR0aXZpdFx1MDBlMCBwZXIgbGEgcHViYmxpY2F6aW9uZQ0KLUFjdGl2aXR5X1VzZUFEREltYWdlPVV0aWxpenphcmUgaWwgRGlhZ3JhbW1hIGRpIGRldHRhZ2xpbyBkaSBhdHRpdml0XHUwMGUwIHBlciBsYSBwdWJibGljYXppb25lDQotQWN0aXZpdHlfVXNlV1BESW1hZ2U9VXRpbGl6emFyZSBpbCBEaWFncmFtbWEgZGkgZGlwZW5kZW56YSBkZWwgcHJvZG90dG8gZGkgbGF2b3JvIHBlciBsYSBwdWJibGljYXppb25lDQotQWN0aXZpdHlfQXNzaWduPUFzc2VnbmF6aW9uZS4uLg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkX1N0ZXBzPVBhc3NpOg0KLVRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dUaXRsZT1QYXNzaQ0KLVRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dNZXNzYWdlPVNlbGV6aW9uYSBwYXNzaQ0KLQ0KLUFjdGl2aXR5X1dvcmtSb2xsdXA9Um9sbHVwIGxhdm9ybw0KLUFjdGl2aXR5X1RlYW1Sb2xsdXA9Um9sbHVwIHRlYW0NCi1BY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXA9Um9sbHVwIHByb2RvdHRpIGRpIGxhdm9ybw0KLUFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbj1SaXZlZGVyZSBpbCByb2xsdXAgZGVsIGxhdm9ybyBwZXIgcXVlc3RhIGF0dGl2aXRcdTAwZTAgaW4gcXVlc3RhIHNlemlvbmUuDQotQWN0aXZpdHlfVGVhbVJvbGx1cERlc2NyaXB0aW9uPVJpdmVkZXJlIGlsIHJvbGx1cCBkZWwgdGVhbSBwZXIgcXVlc3RhIGF0dGl2aXRcdTAwZTAgaW4gcXVlc3RhIHNlemlvbmUuDQotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb249Uml2ZWRlcmUgaWwgcm9sbHVwIGRlbCBwcm9kb3R0byBkaSBsYXZvcm8gcGVyIHF1ZXN0YSBhdHRpdml0XHUwMGUwIGluIHF1ZXN0YSBzZXppb25lLg0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX011bHRpcGxlT2N1cnJhbmNlPVJpY29ycmVuemUgbXVsdGlwbGUNCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9PcHRpb25hbD1GYWNvbHRhdGl2bw0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1BsYW5uZWQ9UGlhbmlmaWNhdG8NCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9TdXByZXNzZWQ9RWxpbWluYXRvDQotDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRXZlbnREcml2ZW49QXR0aXZhdG8gZGEgZXZlbnRvDQotV29ya0JyZWFrZG93bkVsZW1lbnRfT25nb2luZz1JbiBjb3Jzbw0KLVdvcmtCcmVha2Rvd25FbGVtZW50X1JlcGVhdGFibGU9UmlwZXRpYmlsZQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29ycz1QcmVkZWNlc3Nvcmk6DQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeT1EaXBlbmRlbnphOg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQ9SW5kaWNlDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfUFJFU0VOVEFUSU9OX05BTUVfVEVYVD1Ob21lIHByZXNlbnRhemlvbmUNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9ERVBFTkRFTkNZX1RFWFQ9RGlwZW5kZW56YQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQWRkPUFnZ2l1bmdpDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9FZGl0PU1vZGlmaWNhDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU9UmltdW92aQ0KLQ0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUPUZpbmUtSW5pemlvDQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fRklOSVNIPUZpbmUtRmluZQ0KLVdvcmtPcmRlclR5cGVfU1RBUlRfVE9fRklOSVNIPUluaXppby1GaW5lDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19TVEFSVD1Jbml6aW8tSW5pemlvDQotDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3luY2hyb25pemVkPVNpbmNyb25penphdG8gY29uIGwnb3JpZ2luZQ0KLQ0KLURlc2NyaXB0b3JfUmVmaW5lZERlc2NyaXB0aW9uPURlc2NyaXppb25lIHBlcmZlemlvbmF0YToNCi0NCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9UnVvbGkNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb249QXNzZWduYXJlIGkgZGVzY3JpdHRvcmkgZGkgcnVvbGkgcGVyIGVzZWd1aXJlIHF1ZXN0byBkZXNjcml0dG9yZSBkaSBvcGVyYXppb25pLg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1Fc2VjdXRvcmUgcHJpbWFyaW86DQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUyPUVzZWN1dG9yaSBhZ2dpdW50aXZpOg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMz1Bc3Npc3RpdG8gZGE6DQotDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZT1Qcm9kb3R0aSBkaSBsYXZvcm8NCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uPVNwZWNpZmljYXJlIGkgZGVzY3JpdHRvcmkgZGVpIHByb2RvdHRpIGRpIGxhdm9ybyBpbnB1dCBlIG91dHB1dCBwZXIgcXVlc3RvIGRlc2NyaXR0b3JlIGRpIG9wZXJhemlvbmkuDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1JbnB1dCBvYmJsaWdhdG9yaW86DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1JbnB1dCBmYWNvbHRhdGl2bzoNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUzPUlucHV0IGVzdGVybm86DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlND1PdXRwdXQ6DQotDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvblRpdGxlPU9wZXJhemlvbmkNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb249UXVlc3RvIGRlc2NyaXR0b3JlIGRpIHJ1b2xpIFx1MDBlOCBsJ2VzZWN1dG9yZSBkZWkgc2VndWVudGkgZGVzY3JpdHRvcmkgZGkgb3BlcmF6aW9uaS4NCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTE9RXNlY3V0b3JlIHByaW1hcmlvOg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMj1Fc2VjdXRvcmkgYWdnaXVudGl2aToNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTM9QXNzaXN0aXRvIGRhOg0KLQ0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9UHJvZG90dGkgZGkgbGF2b3JvDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbj1RdWVzdG8gZGVzY3JpdHRvcmUgZGkgcnVvbGkgXHUwMGU4IHJlc3BvbnNhYmlsZSBlIG1vZGlmaWNhIGkgc2VndWVudGkgZGVzY3JpdHRvcmkgZGkgcHJvZG90dGkgZGkgbGF2b3JvLg0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTE9UmVzcG9uc2FiaWxlIGRpOg0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9TW9kaWZpY2E6DQotDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1SdW9saQ0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb249SWwgc2VndWVudGUgZGVzY3JpdHRvcmUgZGkgcnVvbGkgXHUwMGU4IHJlc3BvbnNhYmlsZSBlIG1vZGlmaWNhIHF1ZXN0byBkZXNjcml0dG9yZSBkaSBwcm9kb3R0aSBkaSBsYXZvcm8uDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1SZXNwb25zYWJpbGUgZGk6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMj1Nb2RpZmljYXRvIGRhOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9UeXBlPVRpcG86DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZT1TdGF0byBpbmdyZXNzbyBhdHRpdml0XHUwMGUwOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZT1TdGF0byB1c2NpdGEgYXR0aXZpdFx1MDBlMDoNCi0NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZT1QYXJ0aSBkaXN0cmlidWliaWxpDQotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uRGVzY3JpcHRpb249SWwgY29tcG9uZW50ZSBkaXN0cmlidWliaWxlIHByZXNlbnRhIGxlIHNlZ3VlbnRpIHBhcnRpIGRpc3RyaWJ1aWJpbGkuDQotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9UYWJsZTE9UGFydGkgZGlzdHJpYnVpYmlsaSANCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25UaXRsZT1UZWFtDQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uRGVzY3JpcHRpb249UXVlc3RvIGRlc2NyaXR0b3JlIGRpIHJ1b2xpIGZhIHJpZmVyaW1lbnRvIGFpIHNlZ3VlbnRpIHRlYW0uDQotUm9sZURlc2NyaXB0b3JfVGVhbV9UYWJsZTE9VGVhbToNCi0NCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvblRpdGxlPVJ1b2xpDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1RdWVzdG8gcnVvbG8gY29tcG9zaXRvIHByZXNlbnRhIGkgc2VndWVudGkgcnVvbGkgYWdncmVnYXRpLg0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9UYWJsZTE9UnVvbGkgYWdncmVnYXRpOg0KLQ0KLVRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvblRpdGxlPVJ1b2xpDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249QWdnaXVuZ2VyZSBvIGVsaW1pbmFyZSBpIHJ1b2xpIGEvZGFsIHByb2ZpbG8gZGVsIHRlYW0uDQotVGVhbVByb2ZpbGVfUm9sZV9UYWJsZTE9UnVvbGk6DQotDQotUHJvY2Vzc19SaWNoVGV4dF9Db2xsYXBzZUltYWdlPWNvbGxhcHNlZC5naWYNCi1Qcm9jZXNzX1JpY2hUZXh0X0V4cGFuZEltYWdlPWV4cGFuZGVkLmdpZg0KLVByb2Nlc3NfQWRkPUFnZ2l1bmdpLi4uDQotUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcz1BZ2dpdW5naSBkYSBwcm9jZXNzby4uLg0KLVByb2Nlc3NfUmVuYW1lX01lc3NhZ2U9U2kgc3RhIHBlciBtb2RpZmljYXJlIGlsIG5vbWUgZGkgcXVlc3RvIHByb2Nlc3NvLiBJbiB0YWwgbW9kbywgbCdlZGl0b3IgdmVyclx1MDBlMCBzYWx2YXRvIGUgbGEgY2FydGVsbGEgZGVpIHByb2Nlc3NpIHZlcnJcdTAwZTAgcmlub21pbmF0YS4gQ29udGludWFyZT8NCi1Qcm9jZXNzX1JlbW92ZT1SaW11b3ZpDQotUHJvY2Vzc19VcD1TdQ0KLVByb2Nlc3NfRG93bj1HaVx1MDBmOQ0KLVByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb249U2VsZXppb25lIG11bHRpcGxhDQotUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQ9Q29sbGVnYSBlbGVtZW50byBtZXRvZG8uLi4NCi0NCi0jIyBFcnJvci9XYXJuaW5nDQotUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlPU5vbWUgbm9uIHZhbGlkbw0KLVByb2Nlc3NfSW52YWxpZE5hbWU9SVVQQTAwODFFOiBJbCBub21lIG5vbiBwdVx1MDBmMiBlc3NlcmUgdnVvdG8uIFNwZWNpZmljYXJlIHVuIG5vbWUgdmFsaWRvLg0KLVByb2Nlc3NfUmVuYW1lX1RpdGxlPVJpbm9taW5hDQotUHJvY2Vzc19JbnZhbGlkUHJlc2VudGF0aW9uTmFtZT1JVVBBMDA4MkU6IElsIG5vbWUgZGVsbGEgcHJlc2VudGF6aW9uZSBub24gcHVcdTAwZjIgZXNzZXJlIHZ1b3RvLiBTcGVjaWZpY2FyZSB1biBub21lIGRpIHByZXNlbnRhemlvbmUgdmFsaWRvLg0KLVByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZT1Db2xsZWdhIGVsZW1lbnRvIG1ldG9kbw0KLVByb2Nlc3NfSW52YWxpZExpbmtNZXRob2RFbGVtZW50PUlVUEEwMDgzRTogSW1wb3NzaWJpbGUgY29sbGVnYXJzaSBhICcnezB9JycgaW4gcXVhbnRvIHF1ZXN0byBlbGVtZW50byBkaSBtZXRvZG8gXHUwMGU4IGdpXHUwMGUwIGluIHVzbyBwZXIgdW4gYWx0cm8gZGVzY3JpdHRvcmUgbmVsbG8gc3Rlc3NvIGVsZW1lbnRvIHBhcmVudC4NCi1Qcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGU9SW5mb3JtYXppb25pDQotUHJvY2Vzc19UZWFtQXNzaWduRXJyb3I9SVVQQTAwODRFOiBJbXBvc3NpYmlsZSBhZ2dpdW5nZXJlICcnezB9JycgYWwgdGVhbSAnJ3sxfScnIFxuXG5JIGRlc2NyaXR0b3JpIGRpIHJ1b2xpIGRldm9ubyBlc3NlcmUgYXNzb2NpYXRpIGEgdW4gcnVvbG8gZGVsbCcnZWxlbWVudG8gZGkgbWV0b2RvIGRhIGFzc2VnbmFyZSBhbCB0ZWFtLlxuXG4gQ29ycmVnZ2VyZSBsJydhc3NvY2lhemlvbmUsIHF1aW5kaSBwcm92YXJlIGRpIG51b3ZvLg0KLVByb2Nlc3NfVGVhbURpYWxvZ01lc3NhZ2U9U2VsZXppb25hIHRlYW0NCi1Qcm9jZXNzX1RlYW1EaWFsb2dUaXRsZT1UZWFtDQotDQotUHJvY2Vzc19EZWxpdmVyYWJsZUFzc2lnbkVycm9yPUlVUEEwMDg1RTogSW1wb3NzaWJpbGUgYWdnaXVuZ2VyZSAnJ3swfScnIGFsIGNvbXBvbmVudGUgZGlzdHJpYnVpYmlsZSAnJ3sxfScnIGluIHF1YW50byBub24gZGlzcG9uZSBkaSB1biBwcm9kb3R0byBkaSBsYXZvcm8gZGVsbCcnZWxlbWVudG8gZGkgbWV0b2RvIGFzc29jaWF0by4NCi1Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcj1JVVBBMDA4NkU6IEltcG9zc2liaWxlIGFnZ2l1bmdlcmUgJyd7MH0nJyBhbCBydW9sbyBjb21wb3NpdG8gJyd7MX0nJyBpbiBxdWFudG8gbm9uIGRpc3BvbmUgZGkgdW4gcnVvbG8gZGVsbCcnZWxlbWVudG8gZGkgbWV0b2RvIGFzc29jaWF0by4NCi1Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlck1lc3NhZ2U9SVVQQTAwODdXOiBJbW1ldHRlcmUgdW4gbnVtZXJvIHZhbGlkbyBwZXIgaSBwcmVkZWNlc3NvcmkuDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJUaXRsZT1JRCBwcmVkZWNlc3NvcmUgbm9uIHZhbGlkbw0KLQ0KLVByb2Nlc3NfTm9JdGVtcz1OZXNzdW4gZWxlbWVudG8gc2VsZXppb25hdG8NCi1Qcm9jZXNzX0l0ZW1zU2VsZWN0ZWQ9ezB9IGVsZW1lbnRpIHNlbGV6aW9uYXRpDQotUHJvY2Vzc19Ob1Byb3BlcnRpZXNBdmFpbGFibGU9TmVzc3VuYSBwcm9wcmlldFx1MDBlMCBkaXNwb25pYmlsZQ0KLQ0KLVByZWRlY2Vzc29yRGlhbG9nX1RpdGxlPURpcGVuZGVuemEgcHJlZGVjZXNzb3JlDQotUHJlZGVjZXNzb3JEaWFsb2dfSGVhZGVyTWVzc2FnZT1JbW1ldHRlcmUgdGlwbyBkaSBkaXBlbmRlbnphIHBlciBwcmVkZWNlc3NvcmU6DQotUHJlZGVjZXNzb3JEaWFsb2dfSW5kZXg9SW5kaWNlOg0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZXNlbnRhdGlvbk5hbWU9Tm9tZSBwcmVzZW50YXppb25lOg0KLVByZWRlY2Vzc29yRGlhbG9nX0RlcGVuZGVuY3k9RGlwZW5kZW56YToNCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGU9UHJlZGVjZXNzb3JlDQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2U9SVVQQTAwODhFOiBFc2lzdGUgZ2lcdTAwZTAgdW4gcHJlZGVjZXNzb3JlIGNvbiBxdWVzdG8gSUQgcGVyIHF1ZXN0byBlbGVtZW50byBkZWxsYSBzdWRkaXZpc2lvbmUgZGVsIGxhdm9yby4NCi0NCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfdGV4dEVkaXRDZWxsX3Byb2JsZW1fbXNnPUlVUEEwMDkwRTogU2kgXHUwMGU4IHZlcmlmaWNhdG8gdW4gZXJyb3JlIGR1cmFudGUgbGEgbW9kaWZpY2EgZGkgdW5hIHByb3ByaWV0XHUwMGUwLg0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc19jZWxsRWRpdG9yX2ludmFsaWRQcmVkY2Vzc29yX3Byb2JsZW1fbXNnPUlVUEEwMDg5VzogRWxlbmNvIHByZWRlY2Vzc29yaSBub24gdmFsaWRvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzIzMjljLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25UaXRsZT1cdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzENCi1Qcm9jZXNzX0RvY3VtZW50SW5mb3JtYXRpb25UaXRsZT1cdTY1ODdcdTY2ZjhcdTYwYzVcdTU4MzENCi1BY3Rpdml0eV9ndWlkYW5jZUluZm9ybWF0aW9uVGl0bGU9XHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5DQotQnJlYWtkb3duRWxlbWVudF9vcHRpb25JbmZvcm1hdGlvblRpdGxlPVx1MzBkNlx1MzBlY1x1MzBmY1x1MzBhZlx1MzBjMFx1MzBhNlx1MzBmM1x1MzBmYlx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmMw0KLVRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvblRpdGxlPVx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkNw0KLQ0KLVRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBiZlx1MzBiOVx1MzBhZlx1OGExOFx1OGZmMFx1NWI1MFx1MzA2ZVx1NWI5Zlx1ODg0Y1x1MzBiOVx1MzBjNlx1MzBjM1x1MzBkN1x1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlezB9XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotUHJvY2Vzc19kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlezB9XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU2NTg3XHU2NmY4XHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdThhMThcdThmZjBcdTViNTBcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1EZXNjcmlwdG9yX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotTWlsZXN0b25lX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBkZVx1MzBhNFx1MzBlYlx1MzBiOVx1MzBjOFx1MzBmY1x1MzBmM1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLU1pbGVzdG9uZV9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBkZVx1MzBhNFx1MzBlYlx1MzBiOVx1MzBjOFx1MzBmY1x1MzBmM1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotV29ya0JyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdG9uPVx1MzA1M1x1MzA2ZVx1OGExOFx1OGZmMFx1NWI1MFx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLUFjdGl2aXR5X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBkNlx1MzBlY1x1MzBmY1x1MzBhZlx1MzBjMFx1MzBhNlx1MzBmM1x1MzBmYlx1MzBhOFx1MzBlY1x1MzBlMVx1MzBmM1x1MzBjOFx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NjU4N1x1NjZmOFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLUFjdGl2aXR5X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTY1ODdcdTY2ZjhcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1EZXNjcmlwdG9yX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdThhMThcdThmZjBcdTViNTBcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTY1ODdcdTY2ZjhcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1Qcm9jZXNzX05vbmU9PDwgTk9ORSA+Pg0KLVByb2Nlc3NfbmFtZT1cdTU0MGRcdTUyNGQ6DQotUHJvY2Vzc19QcmVzZW50YXRpb25OYW1lPVx1ODg2OFx1NzkzYVx1NTQwZDoNCi1Qcm9jZXNzX2JyaWVmRGVzY3JpcHRpb249XHU4OTgxXHU2NWU4Og0KLVByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uPSBcdThhYWNcdTY2MGU6DQotUHJvY2Vzc19wdXJwb3NlPVx1NzZlZVx1NzY4NDoNCi1Qcm9jZXNzX3ByZWZpeD1cdTMwZDdcdTMwZWNcdTMwZDVcdTMwYTNcdTMwYzNcdTMwYWZcdTMwYjk6DQotDQotQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU9XHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4DQotDQotUHJvY2Vzc19UeXBlX1Rhc2s9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDZlXHUzMGJmXHUzMGI5XHUzMGFmOg0KLVByb2Nlc3NfVHlwZV9Sb2xlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYjoNCi1Qcm9jZXNzX1R5cGVfV29ya1Byb2R1Y3Q9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4Og0KLQ0KLVdvcmtQcm9kdWN0X1R5cGU9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDZlXHUzMGJmXHUzMGE0XHUzMGQ3Og0KLQ0KLUFjdGl2aXR5X01vZGVsSW5mbz1cdTMwZTJcdTMwYzdcdTMwZWJcdTYwYzVcdTU4MzE6DQotQWN0aXZpdHlfVHlwZT1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwYmZcdTMwYTRcdTMwZDcNCi1BY3Rpdml0eV9wcmVzZW50YXRpb25OYW1lPVx1ODg2OFx1NzkzYVx1NTQwZDoNCi1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9XHU0ZWUzXHU2ODQ4Og0KLUFjdGl2aXR5X2hvd1RvU3RhZmY9XHU5MTRkXHU1YzVlXHU2NWI5XHU2Y2Q1Og0KLUJyZWFrZG93bkVsZW1lbnRfa2V5Q29uc2lkZXJhdGlvbnM9XHU0ZTNiXHUzMDZhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1Og0KLVByb2Nlc3NfdXNhZ2VHdWlkYW5jZT1cdTRmN2ZcdTc1MjhcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjk6DQotDQotQWN0aXZpdHlfUm9hZG1hcFRpdGxlPVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkNw0KLUFjdGl2aXR5X1JvYWRtYXBEZXNjcmlwdGlvbj1cdThmZmRcdTUyYTBcdTYwYzVcdTU4MzFcdTMwNzhcdTMwNmVcdTMwZWFcdTMwZjNcdTMwYWZcdTMwOTJcdTMwZWRcdTMwZmNcdTMwYzlcdTMwZGVcdTMwYzNcdTMwZDdcdTVmNjJcdTVmMGZcdTMwNjdcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1BY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VUaXRsZT1cdTRlMDBcdTgyMmNcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjkNCi1BY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VEZXNjcmlwdGlvbj1cdThmZmRcdTUyYTBcdTYwYzVcdTU4MzFcdTMwNzhcdTMwNmVcdTMwZWFcdTMwZjNcdTMwYWZcdTMwOTJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTVmNjJcdTVmMGZcdTMwNjdcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxUaXRsZT1cdTMwYjNcdTMwZGZcdTMwZTVcdTMwY2JcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdThjYzdcdTY1OTkNCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1cdThmZmRcdTUyYTBcdTYwYzVcdTU4MzFcdTMwNzhcdTMwNmVcdTMwZWFcdTMwZjNcdTMwYWZcdTMwOTJcdTMwYjNcdTMwZGZcdTMwZTVcdTMwY2JcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdThjYzdcdTY1OTlcdTMwNmVcdTVmNjJcdTVmMGZcdTMwNjdcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlPVx1NjU1OVx1ODBiMlx1OGNjN1x1NjU5OQ0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249XHU4ZmZkXHU1MmEwXHU2MGM1XHU1ODMxXHUzMDc4XHUzMDZlXHUzMGVhXHUzMGYzXHUzMGFmXHUzMDkyXHU2NTU5XHU4MGIyXHU4Y2M3XHU2NTk5XHUzMDZlXHU1ZjYyXHU1ZjBmXHUzMDY3XHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotQWN0aXZpdHlfU2VsZWN0ZWRfUm9hZG1hcD1cdTMwZWRcdTMwZmNcdTMwYzlcdTMwZGVcdTMwYzNcdTMwZDc6DQotQWN0aXZpdHlfU2VsZWN0ZWRfR2VuZXJhbEd1aWRhbmNlPVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOToNCi1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9XHUzMGIzXHUzMGRmXHUzMGU1XHUzMGNiXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHU4Y2M3XHU2NTk5Og0KLUFjdGl2aXR5X1NlbGVjdGVkX0VkdWNhdGlvbk1hdGVyaWFsPVx1NjU1OVx1ODBiMlx1OGNjN1x1NjU5OToNCi0NCi1BY3Rpdml0eV9EaWFncmFtVGl0bGU9XHUzMGMwXHUzMGE0XHUzMGEyXHUzMGIwXHUzMGU5XHUzMGUwDQotQWN0aXZpdHlfRGlhZ3JhbURlc2NyaXB0aW9uID0gXHUzMDUzXHUzMDZlIHswfSBcdTMwNmVcdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTBcdTMwZmJcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1BY3Rpdml0eV9BREltYWdlPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1NTZmMw0KLUFjdGl2aXR5X0FEREltYWdlPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1OGE3M1x1N2QzMFx1NTZmMw0KLUFjdGl2aXR5X1dQREltYWdlPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1NGY5ZFx1NWI1OFx1OTVhMlx1NGZjMlx1NTZmMw0KLUFjdGl2aXR5X1VzZUFESW1hZ2U9XHU1MTZjXHU5NThiXHUzMDU5XHUzMDhiXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU1NmYzXHUzMDZlXHU0ZjdmXHU3NTI4DQotQWN0aXZpdHlfVXNlQURESW1hZ2U9XHU1MTZjXHU5NThiXHUzMDU5XHUzMDhiXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU4YTczXHU3ZDMwXHU1NmYzXHUzMDZlXHU0ZjdmXHU3NTI4DQotQWN0aXZpdHlfVXNlV1BESW1hZ2U9XHU1MTZjXHU5NThiXHUzMDU5XHUzMDhiXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyXHU1NmYzXHUzMDZlXHU0ZjdmXHU3NTI4DQotQWN0aXZpdHlfQXNzaWduPVx1NTI3Mlx1MzA4YVx1NWY1M1x1MzA2Ni4uLg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkX1N0ZXBzPVx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkNzoNCi1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nVGl0bGU9XHUzMGI5XHUzMGM2XHUzMGMzXHUzMGQ3DQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2U9XHUzMGI5XHUzMGM2XHUzMGMzXHUzMGQ3XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0DQotDQotQWN0aXZpdHlfV29ya1JvbGx1cD1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwYTJcdTMwYzNcdTMwZDcNCi1BY3Rpdml0eV9UZWFtUm9sbHVwPVx1MzBjMVx1MzBmY1x1MzBlMFx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBhMlx1MzBjM1x1MzBkNw0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cD1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwYTJcdTMwYzNcdTMwZDcNCi1BY3Rpdml0eV9Xb3JrUm9sbHVwRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGJiXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDY3XHUzMDZmXHUzMDAxXHUzMDUzXHUzMDZlXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMDkyXHU2OTFjXHU4YTBlXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotQWN0aXZpdHlfVGVhbVJvbGx1cERlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBiYlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1MzA2N1x1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1MzBjMVx1MzBmY1x1MzBlMFx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBhMlx1MzBjM1x1MzBkN1x1MzA5Mlx1NjkxY1x1OGEwZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cERlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBiYlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1MzA2N1x1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBhMlx1MzBjM1x1MzBkN1x1MzA5Mlx1NjkxY1x1OGEwZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX011bHRpcGxlT2N1cnJhbmNlPVx1ODkwN1x1NjU3MFx1MzA2ZVx1NTFmYVx1NzNmZQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX09wdGlvbmFsPVx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmMw0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1BsYW5uZWQ9XHU4YTA4XHU3NTNiXHU2ZTA4XHUzMDdmDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkPVx1NjI5MVx1NTIzNg0KLQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0V2ZW50RHJpdmVuPVx1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1OTljNlx1NTJkNQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X09uZ29pbmc9XHU5MDMyXHU4ODRjXHU0ZTJkDQotV29ya0JyZWFrZG93bkVsZW1lbnRfUmVwZWF0YWJsZT1cdTUzY2RcdTVmYTlcdTUzZWZcdTgwZmQNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcnM9XHU1MTQ4XHU4ODRjXHUzMGJmXHUzMGI5XHUzMGFmOg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3k9XHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyOg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQ9XHU3ZDIyXHU1ZjE1DQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfUFJFU0VOVEFUSU9OX05BTUVfVEVYVD1cdTg4NjhcdTc5M2FcdTU0MGQNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9ERVBFTkRFTkNZX1RFWFQ9XHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9BZGQ9XHU4ZmZkXHU1MmEwDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9FZGl0PVx1N2RlOFx1OTZjNg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfUmVtb3ZlPVx1OTY2NFx1NTNiYg0KLQ0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUPVx1N2Q0Mlx1NGU4NiAtIFx1OTU4Ylx1NTljYg0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSD1cdTdkNDJcdTRlODYgLSBcdTdkNDJcdTRlODYNCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSD1cdTk1OGJcdTU5Y2IgLSBcdTdkNDJcdTRlODYNCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUPVx1OTU4Ylx1NTljYiAtIFx1OTU4Ylx1NTljYg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZD1cdTMwYmRcdTMwZmNcdTMwYjlcdTMwNjhcdTU0MGNcdTY3MWZcdTUzMTYNCi0NCi1EZXNjcmlwdG9yX1JlZmluZWREZXNjcmlwdGlvbj1cdThhNzNcdTdkMzBcdThhYWNcdTY2MGU6DQotDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlPVx1MzBlZFx1MzBmY1x1MzBlYg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdThhMThcdThmZjBcdTViNTBcdTMwOTJcdTViOWZcdTg4NGNcdTMwNTlcdTMwOGJcdTMwZWRcdTMwZmNcdTMwZWJcdThhMThcdThmZjBcdTViNTBcdTMwOTJcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjZcdTMwN2VcdTMwNTlcdTMwMDINCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE9XHU1N2ZhXHU2NzJjXHU1YjlmXHU4ODRjXHU4MDA1Og0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMj1cdThmZmRcdTUyYTBcdTViOWZcdTg4NGNcdTgwMDU6DQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUzPVx1NjUyZlx1NjNmNFx1ODAwNToNCi0NCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249XHU1MTY1XHU1MjliXHUzMDRhXHUzMDg4XHUzMDczXHU1MWZhXHU1MjliXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDkyXHUzMDUzXHUzMDZlXHUzMGJmXHUzMGI5XHUzMGFmXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDZiXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1cdTVmYzVcdTk4MDhcdTUxNjVcdTUyOWI6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1cdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTUxNjVcdTUyOWI6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMz1cdTU5MTZcdTkwZThcdTUxNjVcdTUyOWI6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlND1cdTUxZmFcdTUyOWI6DQotDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvblRpdGxlPVx1MzBiZlx1MzBiOVx1MzBhZg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdThhMThcdThmZjBcdTViNTBcdTMwNmZcdTMwMDFcdTZiMjFcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdThhMThcdThmZjBcdTViNTBcdTMwNmVcdTViOWZcdTg4NGNcdTgwMDVcdTMwNjdcdTMwNTlcdTMwMDINCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTE9XHU1N2ZhXHU2NzJjXHU1YjlmXHU4ODRjXHU4MDA1Og0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMj1cdThmZmRcdTUyYTBcdTViOWZcdTg4NGNcdTgwMDU6DQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUzPVx1NjUyZlx1NjNmNFx1ODAwNToNCi0NCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDZmXHUzMDAxXHU2YjIxXHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDkyXHU2MmM1XHU1ZjUzXHUzMDU3XHUzMDAxXHU1OTA5XHU2NmY0XHUzMDkyXHU1MmEwXHUzMDQ4XHUzMDdlXHUzMDU5XHUzMDAyDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1cdTYyYzVcdTVmNTM6DQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1cdTU5MDlcdTY2ZjQ6DQotDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1cdTMwZWRcdTMwZmNcdTMwZWINCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPVx1NmIyMVx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1OGExOFx1OGZmMFx1NWI1MFx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1OGExOFx1OGZmMFx1NWI1MFx1MzA5Mlx1NjJjNVx1NWY1M1x1MzA1N1x1MzAwMVx1NTkwOVx1NjZmNFx1MzA5Mlx1NTJhMFx1MzA0OFx1MzA3ZVx1MzA1OVx1MzAwMg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE9XHU2MmM1XHU1ZjUzOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9XHU1OTA5XHU2NmY0XHU4MDA1Og0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9UeXBlPVx1MzBiZlx1MzBhNFx1MzBkNzoNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1OTU4Ylx1NTljYlx1NzJiNlx1NjE0YjoNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGU9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU3ZDQyXHU0ZTg2XHU3MmI2XHU2MTRiOg0KLQ0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvblRpdGxlPVx1N2QwZFx1NTE2NVx1NzI2OQ0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvbkRlc2NyaXB0aW9uPVx1N2QwZFx1NTE2NVx1NzI2OVx1MzA2Ylx1MzA2Zlx1MzAwMVx1NmIyMVx1MzA2ZVx1MzA4OFx1MzA0Nlx1MzA2YVx1MzA4Mlx1MzA2ZVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMg0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfVGFibGUxPVx1N2QwZFx1NTE2NVx1NzI2OQ0KLQ0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvblRpdGxlPVx1MzBjMVx1MzBmY1x1MzBlMA0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1OGExOFx1OGZmMFx1NWI1MFx1MzA2Zlx1MzAwMVx1NmIyMVx1MzA2ZVx1MzBjMVx1MzBmY1x1MzBlMFx1MzA5Mlx1NTNjMlx1NzE2N1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fVGFibGUxPVx1MzBjMVx1MzBmY1x1MzBlMDoNCi0NCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvblRpdGxlPVx1MzBlZFx1MzBmY1x1MzBlYg0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGRkXHUzMGI4XHUzMGMzXHUzMGM4XHUzMGZiXHUzMGVkXHUzMGZjXHUzMGViXHUzMDZiXHUzMDZmXHUzMDAxXHU2YjIxXHUzMDZlXHU5NmM2XHU3ZDA0XHUzMGVkXHUzMGZjXHUzMGViXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1RhYmxlMT1cdTk2YzZcdTdkMDRcdTMwZWRcdTMwZmNcdTMwZWI6DQotDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uVGl0bGU9XHUzMGVkXHUzMGZjXHUzMGViDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249XHUzMGMxXHUzMGZjXHUzMGUwXHUzMDZlXHUzMGQ3XHUzMGVkXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMDkyXHU4ZmZkXHU1MmEwXHUzMDdlXHUzMDVmXHUzMDZmXHU1MjRhXHU5NjY0XHUzMDU5XHUzMDhiXHUzMDAyDQotVGVhbVByb2ZpbGVfUm9sZV9UYWJsZTE9XHUzMGVkXHUzMGZjXHUzMGViOg0KLQ0KLVByb2Nlc3NfUmljaFRleHRfQ29sbGFwc2VJbWFnZT1jb2xsYXBzZWQuZ2lmDQotUHJvY2Vzc19SaWNoVGV4dF9FeHBhbmRJbWFnZT1leHBhbmRlZC5naWYNCi1Qcm9jZXNzX0FkZD1cdThmZmRcdTUyYTAuLi4NCi1Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzPVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA0Ylx1MzA4OVx1OGZmZFx1NTJhMC4uLg0KLVByb2Nlc3NfUmVuYW1lX01lc3NhZ2U9XHUzMDUzXHUzMDZlXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDkyXHU1OTA5XHU2NmY0XHUzMDU3XHUzMDg4XHUzMDQ2XHUzMDY4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzA1M1x1MzA2ZVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA0Y1x1NGZkZFx1N2JhMVx1MzA1NVx1MzA4Y1x1MzAwMVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzBmYlx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1MzA0Y1x1NjViMFx1ODk4Zlx1NTQwZFx1MzA2Ylx1NTkwOVx1NjZmNFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTdkOWFcdTg4NGNcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotUHJvY2Vzc19SZW1vdmU9XHU5NjY0XHU1M2JiDQotUHJvY2Vzc19VcD1cdTRlMGFcdTMwNzgNCi1Qcm9jZXNzX0Rvd249XHU0ZTBiXHUzMDc4DQotUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbj1cdTg5MDdcdTY1NzBcdTkwNzhcdTYyOWUNCi1Qcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTg5ODFcdTdkMjBcdTMwNmVcdTMwZWFcdTMwZjNcdTMwYWYuLi4NCi0NCi0jIyBFcnJvci9XYXJuaW5nDQotUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlPVx1NzEyMVx1NTJiOVx1MzA2YVx1NTQwZFx1NTI0ZA0KLVByb2Nlc3NfSW52YWxpZE5hbWU9SVVQQTAwODFFOiBcdTU0MGRcdTUyNGRcdTMwOTJcdTdhN2FcdTMwNmJcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgXHU2NzA5XHU1MmI5XHUzMDZhXHU1NDBkXHU1MjRkXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotUHJvY2Vzc19SZW5hbWVfVGl0bGU9XHU1NDBkXHU1MjRkXHU1OTA5XHU2NmY0DQotUHJvY2Vzc19JbnZhbGlkUHJlc2VudGF0aW9uTmFtZT1JVVBBMDA4MkU6IFx1ODg2OFx1NzkzYVx1NTQwZFx1MzA5Mlx1N2E3YVx1MzA2Ylx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMiBcdTY3MDlcdTUyYjlcdTMwNmFcdTg4NjhcdTc5M2FcdTU0MGRcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1Qcm9jZXNzX0xpbmtNZXRob2RFbGVtZW50VGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU4OTgxXHU3ZDIwXHUzMDZlXHUzMGVhXHUzMGYzXHUzMGFmDQotUHJvY2Vzc19JbnZhbGlkTGlua01ldGhvZEVsZW1lbnQ9SVVQQTAwODNFOiBNZXRob2RFbGVtZW50ICcnezB9JycgXHUzMDZmXHUzMDAxXHU1NDBjXHUzMDU4XHU4OWFhXHUzMDZlXHU1MjI1XHUzMDZlXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDZiXHUzMDU5XHUzMDY3XHUzMDZiXHU0ZjdmXHU3NTI4XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDAxXHUzMGVhXHUzMGYzXHUzMGFmXHU1MTQ4XHUzMDY4XHUzMDU3XHUzMDY2XHU2MzA3XHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlPVx1OTAxYVx1NzdlNQ0KLVByb2Nlc3NfVGVhbUFzc2lnbkVycm9yPUlVUEEwMDg0RTogJyd7MH0nJyBcdTMwOTJcdTMwYzFcdTMwZmNcdTMwZTAgJyd7MX0nJyBcdTMwNmJcdThmZmRcdTUyYTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcblxuXHUzMGVkXHUzMGZjXHUzMGViXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDZiXHUzMDZmXHUzMDAxXHUzMGMxXHUzMGZjXHUzMGUwXHUzMDZiXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2XHUzMDhiXHUzMDAxXHU5NWEyXHU5MDIzXHU0ZWQ4XHUzMDUxXHUzMDg5XHUzMDhjXHUzMDVmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU4OTgxXHU3ZDIwXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyXG5cblx1MzA3ZVx1MzA1YVx1MzAwMVx1OTVhMlx1OTAyM1x1NGVkOFx1MzA1MVx1MzA5Mlx1NGZlZVx1NmI2M1x1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLVByb2Nlc3NfVGVhbURpYWxvZ01lc3NhZ2U9XHUzMGMxXHUzMGZjXHUzMGUwXHUzMDZlXHU5MDc4XHU2MjllDQotUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGU9XHUzMGMxXHUzMGZjXHUzMGUwDQotDQotUHJvY2Vzc19EZWxpdmVyYWJsZUFzc2lnbkVycm9yPUlVUEEwMDg1RTogXHU3ZDBkXHU1MTY1XHU3MjY5ICcnezF9JycgXHUzMDZiXHUzMDZmXHU5NWEyXHU5MDIzXHU0ZWQ4XHUzMDUxXHUzMDg5XHUzMDhjXHUzMDVmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU4OTgxXHU3ZDIwXHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDRjXHUzMDZhXHUzMDQ0XHUzMDVmXHUzMDgxXHUzMDAxJyd7MH0nJyBcdTMwOTJcdThmZmRcdTUyYTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcj1JVVBBMDA4NkU6IFx1MzBiM1x1MzBmM1x1MzBkZFx1MzBiOFx1MzBjM1x1MzBjOFx1MzBmYlx1MzBlZFx1MzBmY1x1MzBlYiAnJ3sxfScnIFx1MzA2Ylx1MzA2Zlx1OTVhMlx1OTAyM1x1NGVkOFx1MzA1MVx1MzA4OVx1MzA4Y1x1MzA1Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzA0Y1x1MzA2YVx1MzA0NFx1MzA1Zlx1MzA4MVx1MzAwMScnezB9JycgXHUzMDkyXHU4ZmZkXHU1MmEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlPUlVUEEwMDg3VzogXHU2NzA5XHU1MmI5XHUzMDZhXHU1MTQ4XHU4ODRjXHUzMGJmXHUzMGI5XHUzMGFmXHU2NTcwXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJUaXRsZT1cdTcxMjFcdTUyYjlcdTMwNmFcdTUxNDhcdTg4NGNcdTMwYmZcdTMwYjlcdTMwYWYgSUQNCi0NCi1Qcm9jZXNzX05vSXRlbXM9XHU5ODA1XHU3NmVlXHUzMDRjXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzDQotUHJvY2Vzc19JdGVtc1NlbGVjdGVkPXswfSBcdTk4MDVcdTc2ZWVcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkNCi1Qcm9jZXNzX05vUHJvcGVydGllc0F2YWlsYWJsZT1cdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTMwNmFcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMNCi0NCi1QcmVkZWNlc3NvckRpYWxvZ19UaXRsZT1cdTUxNDhcdTg4NGNcdTMwYmZcdTMwYjlcdTMwYWZcdTMwNmVcdTRmOWRcdTViNThcdTk1YTJcdTRmYzINCi1QcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlPVx1NTE0OFx1ODg0Y1x1MzBiZlx1MzBiOVx1MzBhZlx1MzA2ZVx1NGY5ZFx1NWI1OFx1OTVhMlx1NGZjMlx1MzBiZlx1MzBhNFx1MzBkN1x1MzA5Mlx1NTE2NVx1NTI5Ylx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NDoNCi1QcmVkZWNlc3NvckRpYWxvZ19JbmRleD1cdTMwYTRcdTMwZjNcdTMwYzdcdTMwYzNcdTMwYWZcdTMwYjk6DQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlc2VudGF0aW9uTmFtZT1cdTg4NjhcdTc5M2FcdTU0MGQ6DQotUHJlZGVjZXNzb3JEaWFsb2dfRGVwZW5kZW5jeT1cdTRmOWRcdTViNThcdTk1YTJcdTRmYzI6DQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvckRpYWxvZ1RpdGxlPVx1NTE0OFx1ODg0Y1x1MzBiZlx1MzBiOVx1MzBhZg0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JNZXNzYWdlPUlVUEEwMDg4RTogXHUzMDUzXHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4XHUzMDZiXHUzMDZmXHUzMDAxXHUzMDVkXHUzMDZlIElEIFx1MzA5Mlx1NjMwMVx1MzA2NFx1NTE0OFx1ODg0Y1x1MzBiZlx1MzBiOVx1MzBhZlx1MzA0Y1x1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c9SVVQQTAwOTBFOiBcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmNcdTdkZThcdTk2YzZcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZz1JVVBBMDA4OVc6IFx1NzEyMVx1NTJiOVx1MzA2YVx1NTE0OFx1ODg0Y1x1MzBiZlx1MzBiOVx1MzBhZlx1MzA2ZVx1MzBlYVx1MzBiOVx1MzBjOA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWQ2ZDUxNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9XHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNA0KLVByb2Nlc3NfRG9jdW1lbnRJbmZvcm1hdGlvblRpdGxlPVx1YmIzOFx1YzExYyBcdWM4MTVcdWJjZjQNCi1BY3Rpdml0eV9ndWlkYW5jZUluZm9ybWF0aW9uVGl0bGU9XHVjNTQ4XHViMGI0DQotQnJlYWtkb3duRWxlbWVudF9vcHRpb25JbmZvcm1hdGlvblRpdGxlPVx1YmQ4NFx1Yjk1OCBcdWM2MzVcdWMxNTgNCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZT1cdWIyZThcdWFjYzQNCi0NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVkMGMwXHVjMmE0XHVkMDZjIFx1YzEyNFx1YmE4NVx1Yzc5MFx1Yjk3YyBcdWMyMThcdWQ1ODlcdWQ1NjAgXHViMmU4XHVhY2M0XHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLVByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmIzOFx1YzExYyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHVjNzc0IFx1YzEyNFx1YmE4NVx1Yzc5MFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWMxMjRcdWJhODVcdWM3OTBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLU1pbGVzdG9uZV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjNzc0XHVjODE1XHVkNDVjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1NaWxlc3RvbmVfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjNzc0XHVjODE1XHVkNDVjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1CcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM3OTFcdWM1YzVcdWJkODRcdWI5NTggXHVjNjk0XHVjMThjKEJyZWFrZG93biBFbGVtZW50KVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotV29ya0JyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHVjNzc0IFx1Yzc5MVx1YzVjNVx1YmQ4NFx1Yjk1OCBcdWM2OTRcdWMxOGMoV29yayBCcmVha2Rvd24gRWxlbWVudClcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRvbj1cdWM3NzQgXHVjMTI0XHViYTg1XHVjNzkwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1BY3Rpdml0eV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVkNjVjXHViM2Q5XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjNzkxXHVjNWM1XHViZDg0XHViOTU4IFx1YzY5NFx1YzE4YyhCcmVha2Rvd24gRWxlbWVudClcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmIzOFx1YzExYyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLUFjdGl2aXR5X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVkNjVjXHViM2Q5XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJiMzhcdWMxMWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1EZXNjcmlwdG9yX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjMTI0XHViYTg1XHVjNzkwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJiMzhcdWMxMWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1Qcm9jZXNzX05vbmU9PDwgXHVjNWM2XHVjNzRjID4+DQotUHJvY2Vzc19uYW1lPVx1Yzc3NFx1Yjk4NDoNCi1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9XHVkNDVjXHVjMmRjIFx1Yzc3NFx1Yjk4NDoNCi1Qcm9jZXNzX2JyaWVmRGVzY3JpcHRpb249XHVhYzA0XHViN2I1XHVkNTVjIFx1YzEyNFx1YmE4NToNCi1Qcm9jZXNzX21haW5EZXNjcmlwdGlvbj0gXHVhZTMwXHViY2Y4IFx1YzEyNFx1YmE4NToNCi1Qcm9jZXNzX3B1cnBvc2U9XHViYWE5XHVjODAxOg0KLVByb2Nlc3NfcHJlZml4PVx1YzgxMVx1YjQ1MFx1YmQ4MDoNCi0NCi1CcmVha2Rvd25FbGVtZW50X1R5cGVfTmFtZT1cdWM3OTFcdWM1YzVcdWJkODRcdWI5NTggXHVjNjk0XHVjMThjKEJyZWFrZG93biBFbGVtZW50KQ0KLQ0KLVByb2Nlc3NfVHlwZV9UYXNrPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQwYzBcdWMyYTRcdWQwNmM6DQotUHJvY2Vzc19UeXBlX1JvbGU9XHViYTU0XHVjMThjXHViNGRjIFx1YzVlZFx1ZDU2MDoNCi1Qcm9jZXNzX1R5cGVfV29ya1Byb2R1Y3Q9XHViYTU0XHVjMThjXHViNGRjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2M6DQotDQotV29ya1Byb2R1Y3RfVHlwZT1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1YzcyMFx1ZDYxNToNCi0NCi1BY3Rpdml0eV9Nb2RlbEluZm89XHViYWE4XHViMzc4IFx1YzgxNVx1YmNmNDoNCi1BY3Rpdml0eV9UeXBlPVx1ZDY1Y1x1YjNkOSBcdWM3MjBcdWQ2MTU6DQotQWN0aXZpdHlfcHJlc2VudGF0aW9uTmFtZT1cdWQ0NWNcdWMyZGMgXHVjNzc0XHViOTg0Og0KLUFjdGl2aXR5X2FsdGVybmF0aXZlcz1cdWIzMDBcdWM1NDg6DQotQWN0aXZpdHlfaG93VG9TdGFmZj1cdWM3NzhcdWI4MjUgXHVhZDZjXHVjMTMxIFx1YmMyOVx1YmM5NToNCi1CcmVha2Rvd25FbGVtZW50X2tleUNvbnNpZGVyYXRpb25zPVx1ZDU3NVx1YzJlYyBcdWFjZTBcdWI4MjRcdWMwYWNcdWQ1NmQ6DQotUHJvY2Vzc191c2FnZUd1aWRhbmNlPVx1YzBhY1x1YzZhOVx1YmM5NSBcdWM1NDhcdWIwYjQ6DQotDQotQWN0aXZpdHlfUm9hZG1hcFRpdGxlPVx1Yjg1Y1x1YjRkY1x1YjlmNQ0KLUFjdGl2aXR5X1JvYWRtYXBEZXNjcmlwdGlvbj1cdWI4NWNcdWI0ZGNcdWI5ZjUgXHVjNTkxXHVjMmRkXHVjNzNjXHViODVjIFx1Y2Q5NFx1YWMwMCBcdWM4MTVcdWJjZjRcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YjljMVx1ZDA2Y1x1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlVGl0bGU9XHVjNzdjXHViYzE4IFx1YzU0OFx1YjBiNA0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uPVx1YzU0OFx1YjBiNCBcdWQ2MTVcdWMyZGRcdWM3M2NcdWI4NWMgXHVjZDk0XHVhYzAwIFx1YzgxNVx1YmNmNFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHViOWMxXHVkMDZjXHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxUaXRsZT1cdWNlZTRcdWJiYTRcdWIyYzhcdWNmMDBcdWM3NzRcdWMxNTggXHVjNzkwXHViOGNjDQotQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249XHVjZWU0XHViYmE0XHViMmM4XHVjZjAwXHVjNzc0XHVjMTU4IFx1Yzc5MFx1YjhjYyBcdWM1OTFcdWMyZGRcdWM3M2NcdWI4NWMgXHVjZDk0XHVhYzAwIFx1YzgxNVx1YmNmNFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHViOWMxXHVkMDZjXHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlPVx1YWQ1MFx1YzcyMSBcdWM3OTBcdWI4Y2MNCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPVx1YWQ1MFx1YzcyMSBcdWM3OTBcdWI4Y2MgXHVjNTkxXHVjMmRkXHVjNzNjXHViODVjIFx1Y2Q5NFx1YWMwMCBcdWM4MTVcdWJjZjRcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YjljMVx1ZDA2Y1x1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotQWN0aXZpdHlfU2VsZWN0ZWRfUm9hZG1hcD1cdWI4NWNcdWI0ZGNcdWI5ZjU6DQotQWN0aXZpdHlfU2VsZWN0ZWRfR2VuZXJhbEd1aWRhbmNlPVx1YzU0OFx1YjBiNDoNCi1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9XHVjZWU0XHViYmE0XHViMmM4XHVjZjAwXHVjNzc0XHVjMTU4IFx1Yzc5MFx1YjhjYzoNCi1BY3Rpdml0eV9TZWxlY3RlZF9FZHVjYXRpb25NYXRlcmlhbD1cdWFkNTBcdWM3MjEgXHVjNzkwXHViOGNjOg0KLQ0KLUFjdGl2aXR5X0RpYWdyYW1UaXRsZT1cdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTgNCi1BY3Rpdml0eV9EaWFncmFtRGVzY3JpcHRpb24gPSBcdWM3NzQgezB9XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHVjNzc0XHViYmY4XHVjOWMwXHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1BY3Rpdml0eV9BREltYWdlPVx1ZDY1Y1x1YjNkOSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTgNCi1BY3Rpdml0eV9BRERJbWFnZT1cdWQ2NWNcdWIzZDkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOA0KLUFjdGl2aXR5X1dQREltYWdlPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjODg1XHVjMThkXHVjMTMxIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOA0KLUFjdGl2aXR5X1VzZUFESW1hZ2U9XHVhY2Y1XHVhYzFjXHViOTdjIFx1YzcwNFx1ZDU3NCBcdWQ2NWNcdWIzZDkgXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1YzBhY1x1YzZhOQ0KLUFjdGl2aXR5X1VzZUFEREltYWdlPVx1YWNmNVx1YWMxY1x1Yjk3YyBcdWM3MDRcdWQ1NzQgXHVkNjVjXHViM2Q5IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHVjMGFjXHVjNmE5DQotQWN0aXZpdHlfVXNlV1BESW1hZ2U9XHVhY2Y1XHVhYzFjXHViOTdjIFx1YzcwNFx1ZDU3NCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1Yzg4NVx1YzE4ZFx1YzEzMSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHVjMGFjXHVjNmE5DQotQWN0aXZpdHlfQXNzaWduPVx1YzljMFx1YzgxNS4uLg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkX1N0ZXBzPVx1YjJlOFx1YWNjNDoNCi1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nVGl0bGU9XHViMmU4XHVhY2M0DQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2U9XHViMmU4XHVhY2M0IFx1YzEyMFx1ZDBkZA0KLQ0KLUFjdGl2aXR5X1dvcmtSb2xsdXA9XHVjNzkxXHVjNWM1IFx1Yjg2NFx1YzVjNQ0KLUFjdGl2aXR5X1RlYW1Sb2xsdXA9XHVkMzAwIFx1Yjg2NFx1YzVjNQ0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1Yjg2NFx1YzVjNQ0KLUFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbj1cdWM3NzQgXHVjMTM5XHVjMTU4XHVjNWQwXHVjMTFjIFx1Yzc3NCBcdWQ2NWNcdWIzZDlcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MVx1YzVjNSBcdWI4NjRcdWM1YzVcdWM3NDQgXHVhYzgwXHVkMWEwXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLUFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbj1cdWM3NzQgXHVjMTM5XHVjMTU4XHVjNWQwXHVjMTFjIFx1Yzc3NCBcdWQ2NWNcdWIzZDlcdWM1ZDAgXHViMzAwXHVkNTVjIFx1ZDMwMCBcdWI4NjRcdWM1YzVcdWM3NDQgXHVhYzgwXHVkMWEwXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cERlc2NyaXB0aW9uPVx1Yzc3NCBcdWMxMzlcdWMxNThcdWM1ZDBcdWMxMWMgXHVjNzc0IFx1ZDY1Y1x1YjNkOVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWI4NjRcdWM1YzVcdWM3NDQgXHVhYzgwXHVkMWEwXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX011bHRpcGxlT2N1cnJhbmNlPVx1YjJlNFx1YzkxMSBcdWJjMWNcdWMwZGQNCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9PcHRpb25hbD1cdWMxMjBcdWQwZGRcdWM4MDENCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9QbGFubmVkPVx1YWNjNFx1ZDY4ZFx1YjQyOA0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N1cHJlc3NlZD1cdWM1YjVcdWM4MWNcdWI0MjgNCi0NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9FdmVudERyaXZlbj1cdWM3NzRcdWJjYTRcdWQyYjhcdWI4NWMgXHVhZDZjXHViM2Q5XHViNDI4DQotV29ya0JyZWFrZG93bkVsZW1lbnRfT25nb2luZz1cdWM5YzRcdWQ1ODkgXHVjOTExXHVjNzg0DQotV29ya0JyZWFrZG93bkVsZW1lbnRfUmVwZWF0YWJsZT1cdWJjMThcdWJjZjUgXHVhYzAwXHViMmE1XHVkNTY4DQotV29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3JzPVx1YzEyMFx1ZDU4OToNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5PVx1Yzg4NVx1YzE4ZFx1YzEzMToNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9JRF9URVhUPVx1YzBjOVx1Yzc3OA0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX1BSRVNFTlRBVElPTl9OQU1FX1RFWFQ9XHVkNDVjXHVjMmRjIFx1Yzc3NFx1Yjk4NA0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0RFUEVOREVOQ1lfVEVYVD1cdWM4ODVcdWMxOGRcdWMxMzENCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZD1cdWNkOTRcdWFjMDANCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQ9XHVkM2I4XHVjOWQxDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU9XHVjODFjXHVhYzcwDQotDQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fU1RBUlQ9XHVjNjQ0XHViOGNjXHVjNWQwXHVjMTFjIFx1YzJkY1x1Yzc5MQ0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSD1cdWM2NDRcdWI4Y2NcdWM1ZDBcdWMxMWMgXHVjNjQ0XHViOGNjDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g9XHVjMmRjXHVjNzkxXHVjNWQwXHVjMTFjIFx1YzY0NFx1YjhjYw0KLVdvcmtPcmRlclR5cGVfU1RBUlRfVE9fU1RBUlQ9XHVjMmRjXHVjNzkxXHVjNWQwXHVjMTFjIFx1YzJkY1x1Yzc5MQ0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZD1cdWMxOGNcdWMyYTRcdWM2NDAgXHViM2Q5XHVhZTMwXHVkNjU0DQotDQotRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb249XHVjNzkwXHVjMTM4XHVkNTVjIFx1YzEyNFx1YmE4NToNCi0NCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9XHVjNWVkXHVkNTYwDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWQwYzBcdWMyYTRcdWQwNmMgXHVjMTI0XHViYTg1XHVjNzkwXHViOTdjIFx1YzIxOFx1ZDU4OVx1ZDU2MCBcdWM1ZWRcdWQ1NjAgXHVjMTI0XHViYTg1XHVjNzkwXHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE9XHVhZTMwXHViY2Y4IFx1YzIxOFx1ZDU4OVx1Yzc5MDoNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9XHVjZDk0XHVhYzAwIFx1YzIxOFx1ZDU4OVx1Yzc5MDoNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTM9XHVjOWMwXHVjNmQwXHVjNzkwOg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249XHVjNzc0IFx1ZDBjMFx1YzJhNFx1ZDA2YyBcdWMxMjRcdWJhODVcdWM3OTBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc4NVx1YjgyNSBcdWJjMGYgXHVjZDljXHViODI1IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjMTI0XHViYTg1XHVjNzkwXHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPVx1ZDU0NFx1YzIxOCBcdWM3ODVcdWI4MjU6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1cdWMxMjBcdWQwZGRcdWM4MDEgXHVjNzg1XHViODI1Og0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTM9XHVjNjc4XHViZDgwIFx1Yzc4NVx1YjgyNToNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGU0PVx1Y2Q5Y1x1YjgyNToNCi0NCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uVGl0bGU9XHVkMGMwXHVjMmE0XHVkMDZjDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM1ZWRcdWQ1NjAgXHVjMTI0XHViYTg1XHVjNzkwXHViMjk0IFx1YjJlNFx1Yzc0YyBcdWQwYzBcdWMyYTRcdWQwNmMgXHVjMTI0XHViYTg1XHVjNzkwXHVjNzU4IFx1YzIxOFx1ZDU4OVx1Yzc5MFx1Yzc4NVx1YjJjOFx1YjJlNC4NCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTE9XHVhZTMwXHViY2Y4IFx1YzIxOFx1ZDU4OVx1Yzc5MDoNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTI9XHVjZDk0XHVhYzAwIFx1YzIxOFx1ZDU4OVx1Yzc5MDoNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTM9XHVjOWMwXHVjNmQwXHVjNzkwOg0KLQ0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249XHVjNzc0IFx1YzVlZFx1ZDU2MCBcdWMxMjRcdWJhODVcdWM3OTBcdWIyOTQgXHViMmU0XHVjNzRjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjMTI0XHViYTg1XHVjNzkwXHViOTdjIFx1Y2M0NVx1Yzc4NFx1YzljMFx1YmE3MCBcdWMyMThcdWM4MTVcdWQ1NjlcdWIyYzhcdWIyZTQuDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1cdWNjNDVcdWM3ODQgXHVjMGFjXHVkNTZkOg0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9XHVjMjE4XHVjODE1Og0KLQ0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9XHVjNWVkXHVkNTYwDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdWIyZTRcdWM3NGMgXHVjNWVkXHVkNTYwIFx1YzEyNFx1YmE4NVx1Yzc5MFx1YjI5NCBcdWM3NzQgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWMxMjRcdWJhODVcdWM3OTBcdWI5N2MgXHVjYzQ1XHVjNzg0XHVjOWMwXHViYTcwIFx1YzIxOFx1YzgxNVx1ZDU2OVx1YjJjOFx1YjJlNC4NCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUxPVx1Y2M0NVx1Yzc4NCBcdWMwYWNcdWQ1NmQ6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMj1cdWMyMThcdWM4MTU6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1R5cGU9XHVjNzIwXHVkNjE1Og0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGU9XHVkNjVjXHViM2Q5IFx1YzJkY1x1Yzc5MSBcdWMwYzFcdWQwZGM6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlPVx1ZDY1Y1x1YjNkOSBcdWM4ODVcdWI4Y2MgXHVjMGMxXHVkMGRjOg0KLQ0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvblRpdGxlPVx1Yzc3OFx1YjNjNFx1YmIzYyBcdWQzMGNcdWQyYjgNCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzhcdWIzYzRcdWJiM2NcdWM1ZDBcdWIyOTQgXHViMmU0XHVjNzRjXHVhY2ZjIFx1YWMxOVx1Yzc0MCBcdWM3NzhcdWIzYzRcdWJiM2MgXHVkMzBjXHVkMmI4XHVhYzAwIFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMT1cdWM3NzhcdWIzYzRcdWJiM2MgXHVkMzBjXHVkMmI4DQotDQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uVGl0bGU9XHVkMzAwDQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uRGVzY3JpcHRpb249XHVjNzc0IFx1YzVlZFx1ZDU2MCBcdWMxMjRcdWJhODVcdWM3OTBcdWIyOTQgXHViMmU0XHVjNzRjIFx1ZDMwMFx1Yzc0NCBcdWNjMzhcdWM4NzBcdWQ1NjlcdWIyYzhcdWIyZTQuDQotUm9sZURlc2NyaXB0b3JfVGVhbV9UYWJsZTE9XHVkMzAwOg0KLQ0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU9XHVjNWVkXHVkNTYwDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjZWY0XHVkM2VjXHVjOWMwXHVkMmI4IFx1YzVlZFx1ZDU2MFx1YzVkMFx1YjI5NCBcdWIyZTRcdWM3NGNcdWFjZmMgXHVhYzE5XHVjNzQwIFx1YzlkMVx1YWNjNFx1YjQxYyBcdWM1ZWRcdWQ1NjBcdWM3NzQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9UYWJsZTE9XHVjOWQxXHVhY2M0XHViNDFjIFx1YzVlZFx1ZDU2MDoNCi0NCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25UaXRsZT1cdWM1ZWRcdWQ1NjANCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1cdWQzMDAgXHVkNTA0XHViODVjXHVkMzBjXHVjNzdjXHVjNWQwXHVjMTFjIFx1YzVlZFx1ZDU2MFx1Yzc0NCBcdWNkOTRcdWFjMDAgXHViNjEwXHViMjk0IFx1YzgxY1x1YWM3MFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1UZWFtUHJvZmlsZV9Sb2xlX1RhYmxlMT1cdWM1ZWRcdWQ1NjA6DQotDQotUHJvY2Vzc19SaWNoVGV4dF9Db2xsYXBzZUltYWdlPWNvbGxhcHNlZC5naWYNCi1Qcm9jZXNzX1JpY2hUZXh0X0V4cGFuZEltYWdlPWV4cGFuZGVkLmdpZg0KLVByb2Nlc3NfQWRkPVx1Y2Q5NFx1YWMwMC4uLg0KLVByb2Nlc3NfQWRkRnJvbVByb2Nlc3M9XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVjNWQwXHVjMTFjIFx1Y2Q5NFx1YWMwMC4uLg0KLVByb2Nlc3NfUmVuYW1lX01lc3NhZ2U9XHVjNzc0IFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yzc1OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHViY2MwXHVhY2JkXHVkNTU4XHViODI0XHVhY2UwIFx1ZDU2OVx1YjJjOFx1YjJlNC4gXHVhZGY4XHViN2VjXHViYTc0IFx1Yzc3NCBcdWQzYjhcdWM5ZDFcdWFlMzBcdWFjMDAgXHVjODAwXHVjN2E1XHViNDE4XHVhY2UwIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWQzZjRcdWIzNTQgXHVjNzc0XHViOTg0XHVjNzc0IFx1YzBjOFx1Yjg1Y1x1YzZiNCBcdWM3NzRcdWI5ODRcdWM3M2NcdWI4NWMgXHViYzE0XHViMDFkXHViMmM4XHViMmU0LiBcdWFjYzRcdWMxOGRcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotUHJvY2Vzc19SZW1vdmU9XHVjODFjXHVhYzcwDQotUHJvY2Vzc19VcD1cdWM3MDRcdWI4NWMNCi1Qcm9jZXNzX0Rvd249XHVjNTQ0XHViNzk4XHViODVjDQotUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbj1cdWJjZjVcdWMyMTggXHVjMTIwXHVkMGRkDQotUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQ9XHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4YyBcdWI5YzFcdWQwNmMuLi4NCi0NCi0jIyBFcnJvci9XYXJuaW5nDQotUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlPVx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWM3NDAgXHVjNzc0XHViOTg0DQotUHJvY2Vzc19JbnZhbGlkTmFtZT1JVVBBMDA4MUU6IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWJlNDRcdWM2Y2NcdWI0NTggXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNjJjXHViYzE0XHViOTc4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotUHJvY2Vzc19SZW5hbWVfVGl0bGU9XHVjNzc0XHViOTg0IFx1YmMxNFx1YWZiOFx1YWUzMA0KLVByb2Nlc3NfSW52YWxpZFByZXNlbnRhdGlvbk5hbWU9SVVQQTAwODJFOiBcdWQ0NWNcdWMyZGMgXHVjNzc0XHViOTg0XHVjNzQ0IFx1YmU0NFx1YzZjY1x1YjQ1OCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWM2MmNcdWJjMTRcdWI5NzggXHVkNDVjXHVjMmRjIFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWM2OTRcdWMxOGMgXHViOWMxXHVkMDZjDQotUHJvY2Vzc19JbnZhbGlkTGlua01ldGhvZEVsZW1lbnQ9SVVQQTAwODNFOiBcdWM3NzQgXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWIzZDlcdWM3N2NcdWQ1NWMgXHVjMGMxXHVjNzA0XHVjNzU4IFx1YjJlNFx1Yjk3OCBcdWMxMjRcdWJhODVcdWM3OTBcdWM1ZDAgXHVjNzc0XHViYmY4IFx1YzBhY1x1YzZhOVx1ZDU1OFx1YWNlMCBcdWM3ODhcdWFlMzAgXHViNTRjXHViYjM4XHVjNWQwICcnezB9JydcdWM1ZDAgXHViOWMxXHVkMDZjXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlPVx1YzgxNVx1YmNmNA0KLVByb2Nlc3NfVGVhbUFzc2lnbkVycm9yPUlVUEEwMDg0RTogJyd7MH0nJ1x1Yzc0NChcdWI5N2MpICcnezF9JycgXHVkMzAwXHVjNWQwIFx1Y2Q5NFx1YWMwMFx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcblxuXHVkMzAwXHVjNWQwIFx1YmMzMFx1YzgxNVx1ZDU1OFx1YjgyNFx1YmE3NCBcdWM1ZWRcdWQ1NjAgXHVjMTI0XHViYTg1XHVjNzkwXHVjNWQwIFx1YzVmMFx1YWQwMFx1YjQxYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjIFx1YzVlZFx1ZDU2MFx1Yzc3NCBcdWM3ODhcdWM1YjRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0LlxuXG5cdWJhM2NcdWM4MDAgXHVjNWYwXHVhZDAwXHVjNzQ0IFx1YzIxOFx1YzgxNVx1ZDU1OFx1YWNlMCBcdWIyZTRcdWMyZGMgXHVjMmRjXHViM2M0XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLVByb2Nlc3NfVGVhbURpYWxvZ01lc3NhZ2U9XHVkMzAwIFx1YzEyMFx1ZDBkZA0KLVByb2Nlc3NfVGVhbURpYWxvZ1RpdGxlPVx1ZDMwMA0KLQ0KLVByb2Nlc3NfRGVsaXZlcmFibGVBc3NpZ25FcnJvcj1JVVBBMDA4NUU6IFx1YzVmMFx1YWQwMFx1YjQxYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2NcdWM3NzQgXHVjNWM2XHVhZTMwIFx1YjU0Y1x1YmIzOFx1YzVkMCAnJ3swfScnXHVjNzQ0KFx1Yjk3YykgJyd7MX0nJyBcdWM3NzhcdWIzYzRcdWJiM2NcdWM1ZDAgXHVjZDk0XHVhYzAwXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotUHJvY2Vzc19Db21wb3NpdGVSb2xlQXNzaWduRXJyb3I9SVVQQTAwODZFOiBcdWM1ZjBcdWFkMDBcdWI0MWMgXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4YyBcdWM1ZWRcdWQ1NjBcdWM3NzQgXHVjNWM2XHVhZTMwIFx1YjU0Y1x1YmIzOFx1YzVkMCAnJ3swfScnXHVjNzQ0KFx1Yjk3YykgJyd7MX0nJyBcdWNlZjRcdWQzZWNcdWM5YzBcdWQyYjggXHVjNWVkXHVkNTYwXHVjNWQwIFx1Y2Q5NFx1YWMwMFx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyTWVzc2FnZT1JVVBBMDA4N1c6IFx1YzEyMFx1ZDU4OVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNjJjXHViYzE0XHViOTc4IFx1YmM4OFx1ZDYzOFx1Yjk3YyBcdWM3ODVcdWI4MjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJUaXRsZT1cdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YzEyMFx1ZDU4OSBJZA0KLQ0KLVByb2Nlc3NfTm9JdGVtcz1cdWQ1NmRcdWJhYTlcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjOWMwIFx1YzU0YVx1YzU1OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1Qcm9jZXNzX0l0ZW1zU2VsZWN0ZWQ9ezB9XHVhYzFjIFx1ZDU2ZFx1YmFhOVx1Yzc3NCBcdWMxMjBcdWQwZGRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotUHJvY2Vzc19Ob1Byb3BlcnRpZXNBdmFpbGFibGU9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWQyYjlcdWMxMzFcdWM3NzQgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLVByZWRlY2Vzc29yRGlhbG9nX1RpdGxlPVx1YzEyMFx1ZDU4OSBcdWM4ODVcdWMxOGRcdWMxMzENCi1QcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlPVx1YzEyMFx1ZDU4OVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjODg1XHVjMThkXHVjMTMxIFx1YzcyMFx1ZDYxNVx1Yzc0NCBcdWM3ODVcdWI4MjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotUHJlZGVjZXNzb3JEaWFsb2dfSW5kZXg9XHVjMGM5XHVjNzc4Og0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZXNlbnRhdGlvbk5hbWU9XHVkNDVjXHVjMmRjIFx1Yzc3NFx1Yjk4NDoNCi1QcmVkZWNlc3NvckRpYWxvZ19EZXBlbmRlbmN5PVx1Yzg4NVx1YzE4ZFx1YzEzMToNCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGU9XHVjMTIwXHVkNTg5DQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2U9SVVQQTAwODhFOiBcdWQ1NzRcdWIyZjkgSURcdWI5N2MgXHVhYzAwXHVjOWM0IFx1YzEyMFx1ZDU4OVx1Yzc3NCBcdWM3NzQgXHVjNzkxXHVjNWM1XHViZDg0XHViOTU4IFx1YzY5NFx1YzE4Y1x1YzVkMCBcdWM3NzRcdWJiZjggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c9SVVQQTAwOTBFOiBcdWQyYjlcdWMxMzFcdWM3NDQgXHVkM2I4XHVjOWQxXHVkNTU4XHViMjk0IFx1YzkxMVx1YzVkMCBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc19jZWxsRWRpdG9yX2ludmFsaWRQcmVkY2Vzc29yX3Byb2JsZW1fbXNnPUlVUEEwMDg5VzogXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWMxMjBcdWQ1ODkgXHViYWE5XHViODVkDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjRhZTYxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25UaXRsZT1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgR2VyYWlzDQotUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGU9SW5mb3JtYVx1MDBlN1x1MDBmNWVzIHNvYnJlIERvY3VtZW50YVx1MDBlN1x1MDBlM28NCi1BY3Rpdml0eV9ndWlkYW5jZUluZm9ybWF0aW9uVGl0bGU9T3JpZW50YVx1MDBlN1x1MDBlM28NCi1CcmVha2Rvd25FbGVtZW50X29wdGlvbkluZm9ybWF0aW9uVGl0bGU9T3BcdTAwZTdcdTAwZjVlcyBkZSBEaXZpc1x1MDBlM28NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZT1FdGFwYXMNCi0NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Fc3BlY2lmaXF1ZSBhcyBldGFwYXMgcGFyYSBkZXNlbXBlbmhhciBlc3RlIGRlc2NyaXRvciBkZSB0YXJlZmEuDQotDQotUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlL2VzdGEgezB9Lg0KLVByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgc29icmUgZG9jdW1lbnRhXHUwMGU3XHUwMGUzbyBzb2JyZSBlc3RlL2VzdGEgezB9Lg0KLQ0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0ZSBkZXNjcml0b3IuDQotRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGV0YWxoYWRhcyBzb2JyZSBlc3RlIGRlc2NyaXRvci4NCi1NaWxlc3RvbmVfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0ZSBtYXJjby4NCi1NaWxlc3RvbmVfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSBtYXJjby4NCi0NCi1CcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGUgZWxlbWVudG8gZGUgZGl2aXNcdTAwZTNvLg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGUgZWxlbWVudG8gZGUgZGl2aXNcdTAwZTNvIGRlIHRyYWJhbGhvLg0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRvbj1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlIGRlc2NyaXRvci4NCi1BY3Rpdml0eV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RhIGF0aXZpZGFkZS4NCi0NCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIHNvYnJlIGRvY3VtZW50YVx1MDBlN1x1MDBlM28gc29icmUgZXN0ZSBlbGVtZW50byBkZSBkaXZpc1x1MDBlM28uDQotQWN0aXZpdHlfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgc29icmUgZG9jdW1lbnRhXHUwMGU3XHUwMGUzbyBzb2JyZSBlc3RhIGF0aXZpZGFkZS4NCi1EZXNjcmlwdG9yX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIHNvYnJlIGRvY3VtZW50YVx1MDBlN1x1MDBlM28gc29icmUgZXN0ZSBkZXNjcml0b3IuDQotUHJvY2Vzc19Ob25lPTw8IE5FTkhVTSA+Pg0KLVByb2Nlc3NfbmFtZT1Ob21lOg0KLVByb2Nlc3NfUHJlc2VudGF0aW9uTmFtZT1Ob21lIGRhIGFwcmVzZW50YVx1MDBlN1x1MDBlM286DQotUHJvY2Vzc19icmllZkRlc2NyaXB0aW9uPURlc2NyaVx1MDBlN1x1MDBlM28gcmVzdW1pZGE6DQotUHJvY2Vzc19tYWluRGVzY3JpcHRpb249IERlc2NyaVx1MDBlN1x1MDBlM28gcHJpbmNpcGFsOg0KLVByb2Nlc3NfcHVycG9zZT1PYmpldGl2bzoNCi1Qcm9jZXNzX3ByZWZpeD1QcmVmaXhvOg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfVHlwZV9OYW1lPUVsZW1lbnRvIGRlIERpdmlzXHUwMGUzbw0KLQ0KLVByb2Nlc3NfVHlwZV9UYXNrPVRhcmVmYSBkbyBtXHUwMGU5dG9kbzoNCi1Qcm9jZXNzX1R5cGVfUm9sZT1GdW5cdTAwZTdcdTAwZTNvIGRvIG1cdTAwZTl0b2RvOg0KLVByb2Nlc3NfVHlwZV9Xb3JrUHJvZHVjdD1Qcm9kdXRvIGRlIHRyYWJhbGhvIGRvIG1cdTAwZTl0b2RvOg0KLQ0KLVdvcmtQcm9kdWN0X1R5cGU9VGlwbyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvOg0KLQ0KLUFjdGl2aXR5X01vZGVsSW5mbz1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgc29icmUgbyBtb2RlbG86DQotQWN0aXZpdHlfVHlwZT1UaXBvIGRlIEF0aXZpZGFkZToNCi1BY3Rpdml0eV9wcmVzZW50YXRpb25OYW1lPU5vbWUgZGEgYXByZXNlbnRhXHUwMGU3XHUwMGUzbzoNCi1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmFzOg0KLUFjdGl2aXR5X2hvd1RvU3RhZmY9Q29tbyBNb250YXIgYSBFcXVpcGU6DQotQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucz1Db25zaWRlcmFcdTAwZTdcdTAwZjVlcyBjaGF2ZToNCi1Qcm9jZXNzX3VzYWdlR3VpZGFuY2U9T3JpZW50YVx1MDBlN1x1MDBlM28gc29icmUgVXNvOg0KLQ0KLUFjdGl2aXR5X1JvYWRtYXBUaXRsZT1NYXBhcyBkZSBSb3Rhcw0KLUFjdGl2aXR5X1JvYWRtYXBEZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgbGlua3MgcGFyYSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcyBuYSBmb3JtYSBkZSByb3RlaXJvcy4NCi1BY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VUaXRsZT1PcmllbnRhXHUwMGU3XHUwMGUzbyBHZXJhbA0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uPUZvcm5lXHUwMGU3YSBsaW5rcyBwYXJhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzIG5hIGZvcm1hIGRlIG9yaWVudGFcdTAwZTdcdTAwZTNvLg0KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbFRpdGxlPU1hdGVyaWFpcyBkZSBDb211bmljYVx1MDBlN1x1MDBlM28NCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgbGlua3MgcGFyYSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcyBuYSBmb3JtYSBkZSBtYXRlcmlhaXMgZGUgY29tdW5pY2FcdTAwZTdcdTAwZTNvLg0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU9TWF0ZXJpYWlzIGRlIEVkdWNhXHUwMGU3XHUwMGUzbw0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249Rm9ybmVcdTAwZTdhIGxpbmtzIHBhcmEgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGFkaWNpb25haXMgbmEgZm9ybWEgZGUgbWF0ZXJpYWlzIGRlIGVkdWNhXHUwMGU3XHUwMGUzby4NCi0NCi1BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwPVJvdGVpcm9zOg0KLUFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZT1PcmllbnRhXHUwMGU3XHUwMGUzbzoNCi1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9TWF0ZXJpYWlzIGRlIENvbXVuaWNhXHUwMGU3XHUwMGUzbzoNCi1BY3Rpdml0eV9TZWxlY3RlZF9FZHVjYXRpb25NYXRlcmlhbD1NYXRlcmlhaXMgZGUgRWR1Y2FcdTAwZTdcdTAwZTNvOg0KLQ0KLUFjdGl2aXR5X0RpYWdyYW1UaXRsZT1EaWFncmFtYQ0KLUFjdGl2aXR5X0RpYWdyYW1EZXNjcmlwdGlvbiA9IEZvcm5lY2VyIGltYWdlbnMgZGUgZGlhZ3JhbWEgcGFyYSBlc3RlIHswfS4NCi1BY3Rpdml0eV9BREltYWdlPURpYWdyYW1hIGRlIEF0aXZpZGFkZXMNCi1BY3Rpdml0eV9BRERJbWFnZT1EaWFncmFtYSBkZSBEZXRhbGhlcyBkZSBBdGl2aWRhZGVzDQotQWN0aXZpdHlfV1BESW1hZ2U9RGlhZ3JhbWEgZGUgRGVwZW5kXHUwMGVhbmNpYSBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotQWN0aXZpdHlfVXNlQURJbWFnZT1VdGlsaXphciBEaWFncmFtYSBkZSBBdGl2aWRhZGVzIHBhcmEgUHVibGljYVx1MDBlN1x1MDBlM28NCi1BY3Rpdml0eV9Vc2VBRERJbWFnZT1VdGlsaXphciBEaWFncmFtYSBkZSBEZXRhbGhlcyBkZSBBdGl2aWRhZGUgcGFyYSBQdWJsaWNhXHUwMGU3XHUwMGUzbw0KLUFjdGl2aXR5X1VzZVdQREltYWdlPVV0aWxpemFyIERpYWdyYW1hIGRlIERlcGVuZFx1MDBlYW5jaWEgZGUgUHJvZHV0byBwYXJhIFB1YmxpY2FcdTAwZTdcdTAwZTNvDQotQWN0aXZpdHlfQXNzaWduPURlc2lnbmFyLi4uDQotDQotVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM9RXRhcGFzOg0KLVRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dUaXRsZT1FdGFwYXMNCi1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nTWVzc2FnZT1TZWxlY2lvbmFyIGFzIGV0YXBhcw0KLQ0KLUFjdGl2aXR5X1dvcmtSb2xsdXA9TGlzdGEgZG8gVHJhYmFsaG8NCi1BY3Rpdml0eV9UZWFtUm9sbHVwPUxpc3RhIGRhIEVxdWlwZQ0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cD1MaXN0YSBkZSBQcm9kdXRvcyBkZSBUcmFiYWxobw0KLUFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbj1SZXZpc2FyIGEgbGlzdGEgZGUgdHJhYmFsaG9zIHBhcmEgZXN0YSBhdGl2aWRhZGUgbmVzdGEgc2VcdTAwZTdcdTAwZTNvLg0KLUFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbj1SZXZpc2FyIGEgbGlzdGEgZGUgZXF1aXBlIHBhcmEgZXN0YSBhdGl2aWRhZGUgbmVzdGEgc2VcdTAwZTdcdTAwZTNvLg0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cERlc2NyaXB0aW9uPVJldmlzYXIgYSBsaXN0YSBkZSBwcm9kdXRvcyBkZSB0cmFiYWxobyBwYXJhIGVzdGEgYXRpdmlkYWRlIG5lc3RhIHNlXHUwMGU3XHUwMGUzby4NCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9NdWx0aXBsZU9jdXJyYW5jZT1NXHUwMGZhbHRpcGxhcyBPY29yclx1MDBlYW5jaWFzDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fT3B0aW9uYWw9T3BjaW9uYWwNCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9QbGFubmVkPVBsYW5lamFkbw0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N1cHJlc3NlZD1TdXByaW1pZG8NCi0NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9FdmVudERyaXZlbj1PcmllbnRhZG8gcG9yIEV2ZW50bw0KLVdvcmtCcmVha2Rvd25FbGVtZW50X09uZ29pbmc9RW0gQW5kYW1lbnRvDQotV29ya0JyZWFrZG93bkVsZW1lbnRfUmVwZWF0YWJsZT1SZXBldFx1MDBlZHZlbA0KLVdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29ycz1QcmVkZWNlc3NvcmVzOg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3k9RGVwZW5kXHUwMGVhbmNpYToNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9JRF9URVhUPVx1MDBjZG5kaWNlDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfUFJFU0VOVEFUSU9OX05BTUVfVEVYVD1Ob21lIGRlIEFwcmVzZW50YVx1MDBlN1x1MDBlM28NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9ERVBFTkRFTkNZX1RFWFQ9RGVwZW5kXHUwMGVhbmNpYQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQWRkPUluY2x1aXINCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQ9RWRpdGFyDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU9UmVtb3Zlcg0KLQ0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUPURvIEZpbmFsIGFvIEluXHUwMGVkY2lvDQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fRklOSVNIPURvIEZpbmFsIGFvIEZpbmFsDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g9RG8gSW5cdTAwZWRjaW8gYW8gRmluYWwNCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUPURvIEluXHUwMGVkY2lvIGFvIEluXHUwMGVkY2lvDQotDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3luY2hyb25pemVkPVNpbmNyb25pemFkbyBjb20gYSBvcmlnZW0NCi0NCi1EZXNjcmlwdG9yX1JlZmluZWREZXNjcmlwdGlvbj1EZXNjcmlcdTAwZTdcdTAwZTNvIHJlZmluYWRhOg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1GdW5cdTAwZTdcdTAwZjVlcw0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbj1EZXNpZ25lIG9zIGRlc2NyaXRvcmVzIGRlIGZ1blx1MDBlN1x1MDBlM28gcGFyYSBkZXNlbXBlbmhhciBlc3RlIGRlc2NyaXRvciBkZSB0YXJlZmEuDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUxPUV4ZWN1dG9yIFByaW1cdTAwZTFyaW86DQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUyPUV4ZWN1dG9yZXMgQWRpY2lvbmFpczoNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTM9QXNzaXN0aWRvIHBvcjoNCi0NCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPVByb2R1dG9zIGRlIFRyYWJhbGhvDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbj1Fc3BlY2lmaXF1ZSBvcyBkZXNjcml0b3JlcyBkZSB0cmFiYWxobyBkZSBlbnRyYWRhIGUgZGUgc2FcdTAwZWRkYSBwYXJhIGVzdGUgZGVzY3JpdG9yIGRlIHRhcmVmYS4NCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPUVudHJhZGEgT2JyaWdhdFx1MDBmM3JpYToNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyPUVudHJhZGEgT3BjaW9uYWw6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMz1FbnRyYWRhIEV4dGVybmE6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlND1TYVx1MDBlZGRhOg0KLQ0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25UaXRsZT1UYXJlZmFzDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPUVzdGUgZGVzY3JpdG9yIGRlIGZ1blx1MDBlN1x1MDBlM28gXHUwMGU5IGV4ZWN1dG9yIGRvcyBkZXNjcml0b3JlcyBkZSB0YXJlZmEgYSBzZWd1aXIuDQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUxPUV4ZWN1dG9yIFByaW1cdTAwZTFyaW86DQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUyPUV4ZWN1dG9yZXMgQWRpY2lvbmFpczoNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTM9QXNzaXN0aWRvIHBvcjoNCi0NCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPVByb2R1dG9zIGRlIFRyYWJhbGhvDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbj1Fc3RlIGRlc2NyaXRvciBkZSBmdW5cdTAwZTdcdTAwZTNvIFx1MDBlOSByZXNwb25zXHUwMGUxdmVsIHBvciBlIG1vZGlmaWNhIG9zIGRlc2NyaXRvcmVzIGRlIHByb2R1dG8gZGUgdHJhYmFsaG8gYSBzZWd1aXIuDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1SZXNwb25zXHUwMGUxdmVsIHBvcjoNCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyPU1vZGlmaWNhOg0KLQ0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9RnVuXHUwMGU3XHUwMGY1ZXMNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPU9zIGRlc2NyaXRvcmVzIGRlIGZ1blx1MDBlN1x1MDBlM28gYSBzZWd1aXIgc1x1MDBlM28gcmVzcG9uc1x1MDBlMXZlaXMgcG9yIGUgbW9kaWZpY2FtIGVzdGUgZGVzY3JpdG9yIGRlIHByb2R1dG8gZGUgdHJhYmFsaG8uDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1SZXNwb25zXHUwMGUxdmVsIHBvcjoNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUyPU1vZGlmaWNhZG8gcG9yOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9UeXBlPVRpcG86DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZT1Fc3RhZG8gZGUgRW50cmFkYSBkYSBBdGl2aWRhZGU6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlPUVzdGFkbyBkZSBTYVx1MDBlZGRhIGRhIEF0aXZpZGFkZToNCi0NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZT1QYXJ0ZXMgRGlzdHJpYnVcdTAwZWR2ZWlzDQotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uRGVzY3JpcHRpb249TyBkaXN0cmlidVx1MDBlZHZlbCB0ZW0gYXMgcGFydGVzIGRpc3RyaWJ1XHUwMGVkdmVpcyBhIHNlZ3Vpci4NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMT1QYXJ0ZXMgRGlzdHJpYnVcdTAwZWR2ZWlzDQotDQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uVGl0bGU9RXF1aXBlcw0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvbkRlc2NyaXB0aW9uPUVzdGUgZGVzY3JpdG9yIGRlIGZ1blx1MDBlN1x1MDBlM28gcmVmZXJlLXNlIFx1MDBlMHMgZXF1aXBlcyBhIHNlZ3Vpci4NCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMT1FcXVpcGVzOg0KLQ0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU9RnVuXHUwMGU3XHUwMGY1ZXMNCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uPUVzdGEgZnVuXHUwMGU3XHUwMGUzbyBjb21wb3N0YSB0ZW0gYXMgZnVuXHUwMGU3XHUwMGY1ZXMgYWdyZWdhZGFzIGEgc2VndWlyLg0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9UYWJsZTE9RnVuXHUwMGU3XHUwMGY1ZXMgQWdyZWdhZGFzOg0KLQ0KLVRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvblRpdGxlPUZ1blx1MDBlN1x1MDBmNWVzDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249SW5jbHVpciBvdSByZW1vdmVyIGZ1blx1MDBlN1x1MDBmNWVzIHBhcmEvZGUgcGVyZmlzIGRlIGVxdWlwZS4NCi1UZWFtUHJvZmlsZV9Sb2xlX1RhYmxlMT1GdW5cdTAwZTdcdTAwZjVlczoNCi0NCi1Qcm9jZXNzX1JpY2hUZXh0X0NvbGxhcHNlSW1hZ2U9Y29sbGFwc2VkLmdpZg0KLVByb2Nlc3NfUmljaFRleHRfRXhwYW5kSW1hZ2U9ZXhwYW5kZWQuZ2lmDQotUHJvY2Vzc19BZGQ9SW5jbHVpci4uLg0KLVByb2Nlc3NfQWRkRnJvbVByb2Nlc3M9SW5jbHVpciBkZSBQcm9jZXNzby4uLg0KLVByb2Nlc3NfUmVuYW1lX01lc3NhZ2U9Vm9jXHUwMGVhIGVzdFx1MDBlMSBwcmVzdGVzIGEgYWx0ZXJhciBvIG5vbWUgZGVzdGUgcHJvY2Vzc28uIElzc28gc2FsdmFyXHUwMGUxIGVzdGUgZWRpdG9yIGUgcmVub21lYXJcdTAwZTEgYSBwYXN0YSBkbyBwcm9jZXNzbyBjb20gbyBub3ZvIG5vbWUuIERlc2VqYSBjb250aW51YXI/DQotUHJvY2Vzc19SZW1vdmU9UmVtb3Zlcg0KLVByb2Nlc3NfVXA9UGFyYSBDaW1hDQotUHJvY2Vzc19Eb3duPVBhcmEgQmFpeG8NCi1Qcm9jZXNzX011bHRpcGxlU2VsZWN0aW9uPVNlbGVcdTAwZTdcdTAwZTNvIE1cdTAwZmFsdGlwbGENCi1Qcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudD1MaW5rIGRlIEVsZW1lbnRvIGRlIE1cdTAwZTl0b2RvLi4uDQotDQotIyMgRXJyb3IvV2FybmluZw0KLVByb2Nlc3NfSW52YWxpZE5hbWVUaXRsZT1Ob21lIGludlx1MDBlMWxpZG8NCi1Qcm9jZXNzX0ludmFsaWROYW1lPUlVUEEwMDgxRTogTyBub21lIG5cdTAwZTNvIHBvZGUgc2VyIHZhemlvLiBFc3BlY2lmaXF1ZSB1bSBub21lIHZcdTAwZTFsaWRvLg0KLVByb2Nlc3NfUmVuYW1lX1RpdGxlPVJlbm9tZWFyDQotUHJvY2Vzc19JbnZhbGlkUHJlc2VudGF0aW9uTmFtZT1JVVBBMDA4MkU6IE8gbm9tZSBkZSBhcHJlc2VudGFcdTAwZTdcdTAwZTNvIG5cdTAwZTNvIHBvZGUgc2VyIHZhemlvLiBFc3BlY2lmaXF1ZSB1bSBub21lIGRlIGFwcmVzZW50YVx1MDBlN1x1MDBlM28gdlx1MDBlMWxpZG8uDQotUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlPUxpbmsgZGUgRWxlbWVudG8gZGUgTVx1MDBlOXRvZG8NCi1Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudD1JVVBBMDA4M0U6IEltcG9zc1x1MDBlZHZlbCBmYXplciBsaW5rIHBhcmEgJyd7MH0nJyBwb3JxdWUgZXNzZSBNZXRob2RFbGVtZW50IGpcdTAwZTEgZXN0XHUwMGUxIHNlbmRvIHV0aWxpemFkbyBwYXJhIG91dHJvIGRlc2NyaXRvciBzb2IgbyBtZXNtbyBwYWkuDQotUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlPUluZm9ybWFcdTAwZTdcdTAwZjVlcw0KLVByb2Nlc3NfVGVhbUFzc2lnbkVycm9yPUlVUEEwMDg0RTogSW1wb3NzXHUwMGVkdmVsIGluY2x1aXIgJyd7MH0nJyBuYSBlcXVpcGUgJyd7MX0nJyBcblxuRGVzY3JpdG9yZXMgZGUgZnVuXHUwMGU3XHUwMGUzbyBkZXZlbSB0ZXIgdW1hIGZ1blx1MDBlN1x1MDBlM28gZGUgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gYXNzb2NpYWRhIGEgZWxlcyBwYXJhIHNlcmVtIGRlc2lnbmFkb3MgcGFyYSBhIGVxdWlwZS5cblxuIENvcnJpamEgYSBhc3NvY2lhXHUwMGU3XHUwMGUzbyBwcmltZWlybyBlIHRlbnRlIG5vdmFtZW50ZS4NCi1Qcm9jZXNzX1RlYW1EaWFsb2dNZXNzYWdlPVNlbGVjaW9uYXIgZXF1aXBlcw0KLVByb2Nlc3NfVGVhbURpYWxvZ1RpdGxlPUVxdWlwZXMNCi0NCi1Qcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3I9SVVQQTAwODVFOiBJbXBvc3NcdTAwZWR2ZWwgaW5jbHVpciAnJ3swfScnIG5vIGRpc3RyaWJ1XHUwMGVkdmVsICcnezF9JycgcG9ycXVlIGVsZSBuXHUwMGUzbyB0ZW0gcHJvZHV0byBkZSB0cmFiYWxobyBkZSBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyBhc3NvY2lhZG8gYSBlbGUuDQotUHJvY2Vzc19Db21wb3NpdGVSb2xlQXNzaWduRXJyb3I9SVVQQTAwODZFOiBJbXBvc3NcdTAwZWR2ZWwgaW5jbHVpciAnJ3swfScnIG5hIHJlZ3JhIGNvbXBvc3RhICcnezF9JycgcG9ycXVlIGVsZSBuXHUwMGUzbyB0ZW0gZnVuXHUwMGU3XHUwMGUzbyBkZSBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyBhc3NvY2lhZGEgYSBlbGUuDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlPUlVUEEwMDg3VzogRGlnaXRlIHVtIG5cdTAwZmFtZXJvIHZcdTAwZTFsaWRvIHBhcmEgb3MgcHJlZGVjZXNzb3Jlcy4NCi1Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlclRpdGxlPUlEIGRlIFByZWRlY2Vzc29yIEludlx1MDBlMWxpZG8NCi0NCi1Qcm9jZXNzX05vSXRlbXM9TmVuaHVtIGl0ZW0gc2VsZWNpb25hZG8NCi1Qcm9jZXNzX0l0ZW1zU2VsZWN0ZWQ9ezB9IGl0ZW5zIHNlbGVjaW9uYWRvcw0KLVByb2Nlc3NfTm9Qcm9wZXJ0aWVzQXZhaWxhYmxlPU5lbmh1bWEgUHJvcHJpZWRhZGUgZGlzcG9uXHUwMGVkdmVsDQotDQotUHJlZGVjZXNzb3JEaWFsb2dfVGl0bGU9RGVwZW5kXHUwMGVhbmNpYSBkZSBQcmVkZWNlc3Nvcg0KLVByZWRlY2Vzc29yRGlhbG9nX0hlYWRlck1lc3NhZ2U9RGlnaXRlIG8gdGlwbyBkZSBkZXBlbmRcdTAwZWFuY2lhIHBhcmEgbyBwcmVkZWNlc3NvcjoNCi1QcmVkZWNlc3NvckRpYWxvZ19JbmRleD1cdTAwY2RuZGljZToNCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lPU5vbWUgZGUgQXByZXNlbnRhXHUwMGU3XHUwMGUzbzoNCi1QcmVkZWNlc3NvckRpYWxvZ19EZXBlbmRlbmN5PURlcGVuZFx1MDBlYW5jaWE6DQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvckRpYWxvZ1RpdGxlPVByZWRlY2Vzc29yDQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2U9SVVQQTAwODhFOiBKXHUwMGUxIGV4aXN0ZSB1bSBwcmVkZWNlc3NvciBjb20gZXNzZSBJRCBwYXJhIGVzdGUgZWxlbWVudG8gZGUgZGl2aXNcdTAwZTNvIGRlIHRyYWJhbGhvLg0KLQ0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c9SVVQQTAwOTBFOiBPY29ycmV1IHVtIGVycm8gYW8gZWRpdGFyIHVtYSBwcm9wcmllZGFkZS4NCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZz1JVVBBMDA4OVc6IExpc3RhIGRlIHByZWRlY2Vzc29yZXMgaW52XHUwMGUxbGlkYQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjFkNmY4Mi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmDQotUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGU9XHU2NTg3XHU2ODYzXHU0ZmUxXHU2MDZmDQotQWN0aXZpdHlfZ3VpZGFuY2VJbmZvcm1hdGlvblRpdGxlPVx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLUJyZWFrZG93bkVsZW1lbnRfb3B0aW9uSW5mb3JtYXRpb25UaXRsZT1cdTUyMDZcdTg5ZTNcdTkwMDlcdTk4NzkNCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZT1cdTZiNjVcdTlhYTQNCi0NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzMDdcdTViOWFcdTYyNjdcdTg4NGNcdTZiNjRcdTRlZmJcdTUyYTFcdTYzY2ZcdThmZjBcdTdiMjZcdTc2ODRcdTZiNjVcdTlhYTRcdTMwMDINCi0NCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NjcwOVx1NTE3M1x1NmI2NHswfVx1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLVByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NjcwOVx1NTE3M1x1NmI2NHswfVx1NzY4NFx1NjU4N1x1Njg2M1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHU2M2QwXHU0ZjliXHU2NzA5XHU1MTczXHU2YjY0XHU2M2NmXHU4ZmYwXHU3YjI2XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NjcwOVx1NTE3M1x1NmI2NFx1NjNjZlx1OGZmMFx1N2IyNlx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLU1pbGVzdG9uZV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjRcdTkxY2NcdTdhMGJcdTc4OTFcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1NaWxlc3RvbmVfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjRcdTkxY2NcdTdhMGJcdTc4OTFcdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi1CcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NjcwOVx1NTE3M1x1NmI2NFx1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NjcwOVx1NTE3M1x1NmI2NFx1NWRlNVx1NGY1Y1x1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRvbj1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjRcdTYzY2ZcdThmZjBcdTdiMjZcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1BY3Rpdml0eV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjRcdTZkM2JcdTUyYThcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjRcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTc2ODRcdTY1ODdcdTY4NjNcdTRmZTFcdTYwNmZcdTMwMDINCi1BY3Rpdml0eV9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHU2M2QwXHU0ZjliXHU2NzA5XHU1MTczXHU2YjY0XHU2ZDNiXHU1MmE4XHU3Njg0XHU2NTg3XHU2ODYzXHU0ZmUxXHU2MDZmXHUzMDAyDQotRGVzY3JpcHRvcl9kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHU2M2QwXHU0ZjliXHU2NzA5XHU1MTczXHU2YjY0XHU2M2NmXHU4ZmYwXHU3YjI2XHU3Njg0XHU2NTg3XHU2ODYzXHU0ZmUxXHU2MDZmXHUzMDAyDQotUHJvY2Vzc19Ob25lPTw8IFx1NjVlMCA+Pg0KLVByb2Nlc3NfbmFtZT1cdTU0MGRcdTc5ZjBcdWZmMWENCi1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9XHU2NjNlXHU3OTNhXHU1NDBkXHU3OWYwXHVmZjFhDQotUHJvY2Vzc19icmllZkRlc2NyaXB0aW9uPVx1N2I4MFx1ODk4MVx1NjNjZlx1OGZmMFx1ZmYxYQ0KLVByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uPSBcdTRlM2JcdTg5ODFcdTYzY2ZcdThmZjBcdWZmMWENCi1Qcm9jZXNzX3B1cnBvc2U9XHU3NTI4XHU5MDE0XHVmZjFhDQotUHJvY2Vzc19wcmVmaXg9XHU1MjRkXHU3ZjAwXHVmZjFhDQotDQotQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU9XHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwDQotDQotUHJvY2Vzc19UeXBlX1Rhc2s9XHU2NWI5XHU2Y2Q1XHU0ZWZiXHU1MmExXHVmZjFhDQotUHJvY2Vzc19UeXBlX1JvbGU9XHU2NWI5XHU2Y2Q1XHU4OWQyXHU4MjcyXHVmZjFhDQotUHJvY2Vzc19UeXBlX1dvcmtQcm9kdWN0PVx1NjViOVx1NmNkNVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1ZmYxYQ0KLQ0KLVdvcmtQcm9kdWN0X1R5cGU9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiXHVmZjFhDQotDQotQWN0aXZpdHlfTW9kZWxJbmZvPVx1NmEyMVx1NTc4Ylx1NGZlMVx1NjA2Zlx1ZmYxYQ0KLUFjdGl2aXR5X1R5cGU9XHU2ZDNiXHU1MmE4XHU3YzdiXHU1NzhiXHVmZjFhDQotQWN0aXZpdHlfcHJlc2VudGF0aW9uTmFtZT1cdTY2M2VcdTc5M2FcdTU0MGRcdTc5ZjBcdWZmMWENCi1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9XHU2NmZmXHU0ZWUzXHU2NWI5XHU2ODQ4XHVmZjFhDQotQWN0aXZpdHlfaG93VG9TdGFmZj1cdTU5ODJcdTRmNTVcdTkxNGRcdTU5MDdcdTRlYmFcdTU0NThcdWZmMWENCi1CcmVha2Rvd25FbGVtZW50X2tleUNvbnNpZGVyYXRpb25zPVx1NTE3M1x1OTUyZVx1NmNlOFx1NjEwZlx1NGU4Ylx1OTg3OVx1ZmYxYQ0KLVByb2Nlc3NfdXNhZ2VHdWlkYW5jZT1cdTRmN2ZcdTc1MjhcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdWZmMWENCi0NCi1BY3Rpdml0eV9Sb2FkbWFwVGl0bGU9XHU4ZGVmXHU3ZWJmXHU1NmZlDQotQWN0aXZpdHlfUm9hZG1hcERlc2NyaXB0aW9uPVx1NGVlNVx1OGRlZlx1N2ViZlx1NTZmZVx1NzY4NFx1NWY2Mlx1NWYwZlx1NjNkMFx1NGY5Ylx1NTIzMFx1NTE3Nlx1NGVkNlx1NGZlMVx1NjA2Zlx1NzY4NFx1OTRmZVx1NjNhNVx1MzAwMg0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlPVx1OTAxYVx1NzUyOFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uPVx1NGVlNVx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1NzY4NFx1NWY2Mlx1NWYwZlx1NjNkMFx1NGY5Ylx1NTIzMFx1NTE3Nlx1NGVkNlx1NGZlMVx1NjA2Zlx1NzY4NFx1OTRmZVx1NjNhNVx1MzAwMg0KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbFRpdGxlPVx1OTAxYVx1NGZlMVx1Njc1MFx1NjU5OQ0KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPVx1NGVlNVx1OTAxYVx1NGZlMVx1Njc1MFx1NjU5OVx1NzY4NFx1NWY2Mlx1NWYwZlx1NjNkMFx1NGY5Ylx1NTIzMFx1NTE3Nlx1NGVkNlx1NGZlMVx1NjA2Zlx1NzY4NFx1OTRmZVx1NjNhNVx1MzAwMg0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU9XHU2NTU5XHU1YjY2XHU2NzUwXHU2NTk5DQotQWN0aXZpdHlfRWR1Y2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1cdTRlZTVcdTY1NTlcdTViNjZcdTY3NTBcdTY1OTlcdTc2ODRcdTVmNjJcdTVmMGZcdTYzZDBcdTRmOWJcdTUyMzBcdTUxNzZcdTRlZDZcdTRmZTFcdTYwNmZcdTc2ODRcdTk0ZmVcdTYzYTVcdTMwMDINCi0NCi1BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwPVx1OGRlZlx1N2ViZlx1NTZmZVx1ZmYxYQ0KLUFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZT1cdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdWZmMWENCi1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9XHU5MDFhXHU0ZmUxXHU2NzUwXHU2NTk5XHVmZjFhDQotQWN0aXZpdHlfU2VsZWN0ZWRfRWR1Y2F0aW9uTWF0ZXJpYWw9XHU2NTU5XHU1YjY2XHU2NzUwXHU2NTk5XHVmZjFhDQotDQotQWN0aXZpdHlfRGlhZ3JhbVRpdGxlPVx1NTZmZQ0KLUFjdGl2aXR5X0RpYWdyYW1EZXNjcmlwdGlvbiA9IFx1NGUzYVx1NmI2NCB7MH0gXHU2M2QwXHU0ZjliXHU1NmZlXHU3Njg0XHU1NmZlXHU1MGNmXHUzMDAyDQotQWN0aXZpdHlfQURJbWFnZT1cdTZkM2JcdTUyYThcdTU2ZmUNCi1BY3Rpdml0eV9BRERJbWFnZT1cdTZkM2JcdTUyYThcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTU2ZmUNCi1BY3Rpdml0eV9XUERJbWFnZT1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTRmOWRcdThkNTZcdTUxNzNcdTdjZmJcdTU2ZmUNCi1BY3Rpdml0eV9Vc2VBREltYWdlPVx1NGY3Zlx1NzUyOFx1NmQzYlx1NTJhOFx1NTZmZVx1OGZkYlx1ODg0Y1x1NTNkMVx1NWUwMw0KLUFjdGl2aXR5X1VzZUFEREltYWdlPVx1NGY3Zlx1NzUyOFx1NmQzYlx1NTJhOFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1NTZmZVx1OGZkYlx1ODg0Y1x1NTNkMVx1NWUwMw0KLUFjdGl2aXR5X1VzZVdQREltYWdlPVx1NGY3Zlx1NzUyOFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYlx1NTZmZVx1OGZkYlx1ODg0Y1x1NTNkMVx1NWUwMw0KLUFjdGl2aXR5X0Fzc2lnbj1cdTUyMDZcdTkxNGQuLi4NCi0NCi1UYXNrRGVzY3JpcHRvcl9TZWxlY3RlZF9TdGVwcz1cdTZiNjVcdTlhYTRcdWZmMWENCi1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nVGl0bGU9XHU2YjY1XHU5YWE0DQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2U9XHU5MDA5XHU2MmU5XHU2YjY1XHU5YWE0DQotDQotQWN0aXZpdHlfV29ya1JvbGx1cD1cdTVkZTVcdTRmNWNcdTRlMGFcdTZlZGENCi1BY3Rpdml0eV9UZWFtUm9sbHVwPVx1NTZlMlx1OTYxZlx1NGUwYVx1NmVkYQ0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTRlMGFcdTZlZGENCi1BY3Rpdml0eV9Xb3JrUm9sbHVwRGVzY3JpcHRpb249XHU1NzI4XHU4ZmQ5XHU0ZTJhXHU5MGU4XHU1MjA2XHU0ZTJkXHU2OGMwXHU2N2U1XHU2YjY0XHU2ZDNiXHU1MmE4XHU3Njg0XHU1ZGU1XHU0ZjVjXHU0ZTBhXHU2ZWRhXHUzMDAyDQotQWN0aXZpdHlfVGVhbVJvbGx1cERlc2NyaXB0aW9uPVx1NTcyOFx1OGZkOVx1NGUyYVx1OTBlOFx1NTIwNlx1NGUyZFx1NjhjMFx1NjdlNVx1NmI2NFx1NmQzYlx1NTJhOFx1NzY4NFx1NTZlMlx1OTYxZlx1NGUwYVx1NmVkYVx1MzAwMg0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cERlc2NyaXB0aW9uPVx1NTcyOFx1OGZkOVx1NGUyYVx1OTBlOFx1NTIwNlx1NGUyZFx1NjhjMFx1NjdlNVx1NmI2NFx1NmQzYlx1NTJhOFx1NzY4NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NGUwYVx1NmVkYVx1MzAwMg0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX011bHRpcGxlT2N1cnJhbmNlPVx1NTkxYVx1NmIyMVx1NTFmYVx1NzNiMA0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX09wdGlvbmFsPVx1NTNlZlx1OTAwOQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1BsYW5uZWQ9XHU1ZGYyXHU4OWM0XHU1MjEyDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkPVx1NWRmMlx1NjI5MVx1NTIzNg0KLQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0V2ZW50RHJpdmVuPVx1NGU4Ylx1NGVmNlx1OWE3MVx1NTJhOA0KLVdvcmtCcmVha2Rvd25FbGVtZW50X09uZ29pbmc9XHU2YjYzXHU1NzI4XHU4ZmRiXHU4ODRjDQotV29ya0JyZWFrZG93bkVsZW1lbnRfUmVwZWF0YWJsZT1cdTUzZWZcdTkxY2RcdTU5MGQNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcnM9XHU1MTQ4XHU4ODRjXHU0ZjVjXHU0ZTFhXHVmZjFhDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeT1cdTRmOWRcdThkNTZcdTUxNzNcdTdjZmJcdWZmMWENCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9JRF9URVhUPVx1N2QyMlx1NWYxNQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX1BSRVNFTlRBVElPTl9OQU1FX1RFWFQ9XHU2NjNlXHU3OTNhXHU1NDBkXHU3OWYwDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfREVQRU5ERU5DWV9URVhUPVx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQWRkPVx1NmRmYlx1NTJhMA0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfRWRpdD1cdTdmMTZcdThmOTENCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X1JlbW92ZT1cdTk2NjRcdTUzYmINCi0NCi1Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19TVEFSVD1cdTViOGNcdTYyMTBcdWZmMGRcdTVmMDBcdTU5Y2INCi1Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19GSU5JU0g9XHU1YjhjXHU2MjEwXHVmZjBkXHU1YjhjXHU2MjEwDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g9XHU1ZjAwXHU1OWNiXHVmZjBkXHU1YjhjXHU2MjEwDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19TVEFSVD1cdTVmMDBcdTU5Y2JcdWZmMGRcdTVmMDBcdTU5Y2INCi0NCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9TeW5jaHJvbml6ZWQ9XHU0ZTBlXHU2ZTkwXHU1NDBjXHU2YjY1DQotDQotRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb249XHU0ZjE4XHU1MzE2XHU3Njg0XHU2M2NmXHU4ZmYwXHVmZjFhDQotDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlPVx1ODlkMlx1ODI3Mg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTYzMDdcdTViOWFcdTYyNjdcdTg4NGNcdTZiNjRcdTRlZmJcdTUyYTFcdTYzY2ZcdThmZjBcdTdiMjZcdTc2ODRcdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTdiMjZcdTMwMDINCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE9XHU0ZTNiXHU4OTgxXHU2MjY3XHU4ODRjXHU4MDA1XHVmZjFhDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUyPVx1NTE3Nlx1NGVkNlx1NjI2N1x1ODg0Y1x1ODAwNVx1ZmYxYQ0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMz1cdThmODVcdTUyYTlcdTgwMDVcdWZmMWENCi0NCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249XHU2MjY3XHU4ODRjXHU2YjY0XHU0ZWZiXHU1MmExXHU2M2NmXHU4ZmYwXHU3YjI2XHU3Njg0XHU4ZjkzXHU1MTY1XHU1NDhjXHU4ZjkzXHU1MWZhXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU2M2NmXHU4ZmYwXHU3YjI2XHUzMDAyDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1cdTVmYzVcdTk3MDBcdThmOTNcdTUxNjVcdWZmMWENCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyPVx1NTNlZlx1OTAwOVx1OGY5M1x1NTE2NVx1ZmYxYQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTM9XHU1OTE2XHU5MGU4XHU4ZjkzXHU1MTY1XHVmZjFhDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlND1cdThmOTNcdTUxZmFcdWZmMWENCi0NCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uVGl0bGU9XHU0ZWZiXHU1MmExDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPVx1NmI2NFx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1N2IyNlx1NjYyZlx1NGVlNVx1NGUwYlx1NGVmYlx1NTJhMVx1NjNjZlx1OGZmMFx1N2IyNlx1NzY4NFx1NjI2N1x1ODg0Y1x1ODAwNVx1MzAwMg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMT1cdTRlM2JcdTg5ODFcdTYyNjdcdTg4NGNcdTgwMDVcdWZmMWENCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTI9XHU1MTc2XHU0ZWQ2XHU2MjY3XHU4ODRjXHU4MDA1XHVmZjFhDQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUzPVx1OGY4NVx1NTJhOVx1ODAwNVx1ZmYxYQ0KLQ0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTZiNjRcdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTdiMjZcdThkMWZcdThkMjNcdTU0OGNcdTRmZWVcdTY1MzlcdTRlZTVcdTRlMGJcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTYzY2ZcdThmZjBcdTdiMjZcdTMwMDINCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPVx1OGQxZlx1OGQyM1x1ZmYxYQ0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9XHU0ZmVlXHU2NTM5XHVmZjFhDQotDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1cdTg5ZDJcdTgyNzINCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPVx1NGVlNVx1NGUwYlx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1N2IyNlx1OGQxZlx1OGQyM1x1NTQ4Y1x1NGZlZVx1NjUzOVx1NmI2NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NjNjZlx1OGZmMFx1N2IyNlx1MzAwMg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE9XHU4ZDFmXHU4ZDIzXHVmZjFhDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMj1cdTRmZWVcdTY1MzlcdTgwMDVcdWZmMWENCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfVHlwZT1cdTdjN2JcdTU3OGJcdWZmMWENCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlPVx1NmQzYlx1NTJhOFx1OGZkYlx1NTE2NVx1NzJiNlx1NjAwMVx1ZmYxYQ0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZT1cdTZkM2JcdTUyYThcdTkwMDBcdTUxZmFcdTcyYjZcdTYwMDFcdWZmMWENCi0NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZT1cdTUzZWZcdTRlYTRcdTRlZDhcdTkwZThcdTRlZjYNCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbj1cdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjZcdTY3MDlcdTRlZTVcdTRlMGJcdTUzZWZcdTRlYTRcdTRlZDhcdTkwZThcdTRlZjZcdTMwMDINCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMT1cdTUzZWZcdTRlYTRcdTRlZDhcdTkwZThcdTRlZjYNCi0NCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25UaXRsZT1cdTU2ZTJcdTk2MWYNCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTZiNjRcdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTdiMjZcdTZkODlcdTUzY2FcdTRlZTVcdTRlMGJcdTU2ZTJcdTk2MWZcdTMwMDINCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMT1cdTU2ZTJcdTk2MWZcdWZmMWENCi0NCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvblRpdGxlPVx1ODlkMlx1ODI3Mg0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249XHU2YjY0XHU3ZWM0XHU1NDA4XHU4OWQyXHU4MjcyXHU2NzA5XHU0ZWU1XHU0ZTBiXHU4MDVhXHU5NmM2XHU4OWQyXHU4MjcyXHUzMDAyDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1RhYmxlMT1cdTgwNWFcdTk2YzZcdTg5ZDJcdTgyNzJcdWZmMWENCi0NCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25UaXRsZT1cdTg5ZDJcdTgyNzINCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTU0MTFcdTU2ZTJcdTk2MWZcdTY5ODJcdTg5ODFcdTY1ODdcdTRlZjZcdTZkZmJcdTUyYTBcdTg5ZDJcdTgyNzJcdTYyMTZcdTRlY2VcdTRlMmRcdTk2NjRcdTUzYmJcdTg5ZDJcdTgyNzJcdTMwMDINCi1UZWFtUHJvZmlsZV9Sb2xlX1RhYmxlMT1cdTg5ZDJcdTgyNzJcdWZmMWENCi0NCi1Qcm9jZXNzX1JpY2hUZXh0X0NvbGxhcHNlSW1hZ2U9Y29sbGFwc2VkLmdpZg0KLVByb2Nlc3NfUmljaFRleHRfRXhwYW5kSW1hZ2U9ZXhwYW5kZWQuZ2lmDQotUHJvY2Vzc19BZGQ9XHU2ZGZiXHU1MmEwLi4uDQotUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcz1cdTRlY2VcdTZkNDFcdTdhMGJcdTZkZmJcdTUyYTAuLi4NCi1Qcm9jZXNzX1JlbmFtZV9NZXNzYWdlPVx1NjBhOFx1ODk4MVx1NjZmNFx1NjUzOVx1NmI2NFx1NmQ0MVx1N2EwYlx1NzY4NFx1NTQwZFx1NzlmMFx1MzAwMlx1OGZkOVx1NWMwNlx1NGZkZFx1NWI1OFx1NmI2NFx1N2YxNlx1OGY5MVx1NTY2OFx1NWU3Nlx1NWMwNlx1NmQ0MVx1N2EwYlx1NjU4N1x1NGVmNlx1NTkzOVx1OTFjZFx1NTQ3ZFx1NTQwZFx1NGUzYVx1NjViMFx1NTQwZFx1NzlmMFx1MzAwMlx1ODk4MVx1N2VlN1x1N2VlZFx1NTQxN1x1ZmYxZg0KLVByb2Nlc3NfUmVtb3ZlPVx1OTY2NFx1NTNiYg0KLVByb2Nlc3NfVXA9XHU1NDExXHU0ZTBhDQotUHJvY2Vzc19Eb3duPVx1NTQxMVx1NGUwYg0KLVByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb249XHU1OTFhXHU0ZTJhXHU5MDA5XHU2MmU5DQotUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQ9XHU5NGZlXHU2M2E1XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwLi4uDQotDQotIyMgRXJyb3IvV2FybmluZw0KLVByb2Nlc3NfSW52YWxpZE5hbWVUaXRsZT1cdTY1ZTBcdTY1NDhcdTU0MGRcdTc5ZjANCi1Qcm9jZXNzX0ludmFsaWROYW1lPUlVUEEwMDgxRTogXHU1NDBkXHU3OWYwXHU0ZTBkXHU4MGZkXHU0ZTNhXHU3YTdhXHUzMDAyXHU4YmY3XHU2MzA3XHU1YjlhXHU2NzA5XHU2NTQ4XHU1NDBkXHU3OWYwXHUzMDAyDQotUHJvY2Vzc19SZW5hbWVfVGl0bGU9XHU5MWNkXHU1NDdkXHU1NDBkDQotUHJvY2Vzc19JbnZhbGlkUHJlc2VudGF0aW9uTmFtZT1JVVBBMDA4MkU6IFx1NjYzZVx1NzkzYVx1NTQwZFx1NzlmMFx1NGUwZFx1ODBmZFx1NGUzYVx1N2E3YVx1MzAwMlx1OGJmN1x1NjMwN1x1NWI5YVx1NjcwOVx1NjU0OFx1NzY4NFx1NjYzZVx1NzkzYVx1NTQwZFx1NzlmMFx1MzAwMg0KLVByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZT1cdTk0ZmVcdTYzYTVcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjANCi1Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudD1JVVBBMDA4M0U6IFx1NjVlMFx1NmNkNVx1OTRmZVx1NjNhNVx1NTIzMFx1MjAxY3swfVx1MjAxZFx1ZmYwY1x1NTZlMFx1NGUzYVx1NmI2NFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1NWRmMlx1NzUyOFx1NGU4ZVx1NzZmOFx1NTQwY1x1NzIzNlx1NGUwYlx1NzY4NFx1NTE3Nlx1NGVkNlx1NjNjZlx1OGZmMFx1N2IyNlx1MzAwMg0KLVByb2Nlc3NfQXNzaWdubWVudEluZm9UaXRsZT1cdTRmZTFcdTYwNmYNCi1Qcm9jZXNzX1RlYW1Bc3NpZ25FcnJvcj1JVVBBMDA4NEU6IFx1NjVlMFx1NmNkNVx1NWMwNlx1MjAxY3swfVx1MjAxZFx1NmRmYlx1NTJhMFx1NTIzMFx1NTZlMlx1OTYxZlx1MjAxY3sxfVx1MjAxZFxuXG5cdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTdiMjZcdTVmYzVcdTk4N2JcdTY3MDlcdTUxNzNcdTgwNTRcdTc2ODRcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTg5ZDJcdTgyNzJcdTRlZTVcdTRmOWJcdTUyMDZcdTkxNGRcdTdlZDlcdTU2ZTJcdTk2MWZcdTMwMDJcblxuXHU4YmY3XHU1MTQ4XHU0ZmVlXHU1OTBkXHU1MTczXHU4MDU0XHVmZjBjXHU3MTM2XHU1NDBlXHU5MWNkXHU4YmQ1XHUzMDAyDQotUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZT1cdTkwMDlcdTYyZTlcdTU2ZTJcdTk2MWYNCi1Qcm9jZXNzX1RlYW1EaWFsb2dUaXRsZT1cdTU2ZTJcdTk2MWYNCi0NCi1Qcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3I9SVVQQTAwODVFOiBcdTY1ZTBcdTZjZDVcdTVjMDZcdTIwMWN7MH1cdTIwMWRcdTZkZmJcdTUyYTBcdTUyMzBcdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjZcdTIwMWN7MX1cdTIwMWRcdWZmMGNcdTU2ZTBcdTRlM2FcdTViODNcdTZjYTFcdTY3MDlcdTUxNzNcdTgwNTRcdTc2ODRcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTMwMDINCi1Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcj1JVVBBMDA4NkU6IFx1NjVlMFx1NmNkNVx1NWMwNlx1MjAxY3swfVx1MjAxZFx1NmRmYlx1NTJhMFx1NTIzMFx1N2VjNFx1NTQwOFx1ODlkMlx1ODI3Mlx1MjAxY3sxfVx1MjAxZFx1ZmYwY1x1NTZlMFx1NGUzYVx1NWI4M1x1NmNhMVx1NjcwOVx1NTE3M1x1ODA1NFx1NzY4NFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1ODlkMlx1ODI3Mlx1MzAwMg0KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyTWVzc2FnZT1JVVBBMDA4N1c6IFx1OGJmN1x1OGY5M1x1NTE2NVx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYVx1NzY4NFx1NjcwOVx1NjU0OFx1N2YxNlx1NTNmN1x1MzAwMg0KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGU9XHU1MTQ4XHU4ODRjXHU0ZjVjXHU0ZTFhXHU2ODA3XHU4YmM2XHU2NWUwXHU2NTQ4DQotDQotUHJvY2Vzc19Ob0l0ZW1zPVx1NjcyYVx1OTAwOVx1NjJlOVx1NGVmYlx1NGY1NVx1OTg3OQ0KLVByb2Nlc3NfSXRlbXNTZWxlY3RlZD1cdTkwMDlcdTYyZTlcdTRlODYgezB9IFx1OTg3OQ0KLVByb2Nlc3NfTm9Qcm9wZXJ0aWVzQXZhaWxhYmxlPVx1NjVlMFx1NWM1ZVx1NjAyN1x1NTNlZlx1NzUyOA0KLQ0KLVByZWRlY2Vzc29yRGlhbG9nX1RpdGxlPVx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYVx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYg0KLVByZWRlY2Vzc29yRGlhbG9nX0hlYWRlck1lc3NhZ2U9XHU4ZjkzXHU1MTY1XHU1MTQ4XHU4ODRjXHU0ZjVjXHU0ZTFhXHU3Njg0XHU0ZjlkXHU4ZDU2XHU1MTczXHU3Y2ZiXHU3YzdiXHU1NzhiXHVmZjFhDQotUHJlZGVjZXNzb3JEaWFsb2dfSW5kZXg9XHU3ZDIyXHU1ZjE1XHVmZjFhDQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlc2VudGF0aW9uTmFtZT1cdTY2M2VcdTc5M2FcdTU0MGRcdTc5ZjBcdWZmMWENCi1QcmVkZWNlc3NvckRpYWxvZ19EZXBlbmRlbmN5PVx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYlx1ZmYxYQ0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZT1cdTUxNDhcdTg4NGNcdTRmNWNcdTRlMWENCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yTWVzc2FnZT1JVVBBMDA4OEU6IFx1NmI2NFx1NWRlNVx1NGY1Y1x1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1NWRmMlx1NWI1OFx1NTcyOFx1NTE3N1x1NjcwOVx1OGJlNVx1NjgwN1x1OGJjNlx1NzY4NFx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYVx1MzAwMg0KLQ0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c9SVVQQTAwOTBFOiBcdTdmMTZcdThmOTFcdTVjNWVcdTYwMjdcdTY1ZjZcdTUxZmFcdTk1MTlcdTMwMDINCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZz1JVVBBMDA4OVc6IFx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYVx1NTIxN1x1ODg2OFx1NjVlMFx1NjU0OA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTVkMjMxYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhDQotUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGU9XHU2NTg3XHU0ZWY2XHU4Y2M3XHU4YTBhDQotQWN0aXZpdHlfZ3VpZGFuY2VJbmZvcm1hdGlvblRpdGxlPVx1NjMwN1x1NWYxNQ0KLUJyZWFrZG93bkVsZW1lbnRfb3B0aW9uSW5mb3JtYXRpb25UaXRsZT1cdTUyMDZcdTg5ZTNcdTkwNzhcdTk4MDUNCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZT1cdTZiNjVcdTlhNWYNCi0NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzMDdcdTViOWFcdTU3ZjdcdTg4NGNcdTZiNjRcdTRmNWNcdTY5NmRcdTYzY2ZcdThmZjBcdTViNTBcdTc2ODRcdTZiNjVcdTlhNWZcdTMwMDINCi0NCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NmI2NHswfVx1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLVByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NmI2NHswfVx1NzY4NFx1NjU4N1x1NGVmNlx1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHU2M2QwXHU0ZjliXHU2YjY0XHU2M2NmXHU4ZmYwXHU1YjUwXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NjNjZlx1OGZmMFx1NWI1MFx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLU1pbGVzdG9uZV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzZDBcdTRmOWJcdTZiNjRcdTkxY2NcdTdhMGJcdTc4OTFcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1NaWxlc3RvbmVfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzZDBcdTRmOWJcdTZiNjRcdTkxY2NcdTdhMGJcdTc4OTFcdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTMwMDINCi0NCi1CcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NWRlNVx1NGY1Y1x1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRvbj1cdTYzZDBcdTRmOWJcdTZiNjRcdTYzY2ZcdThmZjBcdTViNTBcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1BY3Rpdml0eV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzZDBcdTRmOWJcdTZiNjRcdTZkM2JcdTUyZDVcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi0NCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzZDBcdTRmOWJcdTZiNjRcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTc2ODRcdTY1ODdcdTRlZjZcdThjYzdcdThhMGFcdTMwMDINCi1BY3Rpdml0eV9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHU2M2QwXHU0ZjliXHU2YjY0XHU2ZDNiXHU1MmQ1XHU3Njg0XHU2NTg3XHU0ZWY2XHU4Y2M3XHU4YTBhXHUzMDAyDQotRGVzY3JpcHRvcl9kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHU2M2QwXHU0ZjliXHU2YjY0XHU2M2NmXHU4ZmYwXHU1YjUwXHU3Njg0XHU2NTg3XHU0ZWY2XHU4Y2M3XHU4YTBhXHUzMDAyDQotUHJvY2Vzc19Ob25lPTw8IFx1NzEyMSA+Pg0KLVByb2Nlc3NfbmFtZT1cdTU0MGRcdTdhMzFcdWZmMWENCi1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9XHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxXHVmZjFhDQotUHJvY2Vzc19icmllZkRlc2NyaXB0aW9uPVx1N2MyMVx1ODk4MVx1OGFhYVx1NjYwZVx1ZmYxYQ0KLVByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uPSBcdTRlM2JcdTg5ODFcdThhYWFcdTY2MGVcdWZmMWENCi1Qcm9jZXNzX3B1cnBvc2U9XHU3NTI4XHU5MDE0XHVmZjFhDQotUHJvY2Vzc19wcmVmaXg9XHU1YjU3XHU5OTk2XHVmZjFhDQotDQotQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU9XHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwDQotDQotUHJvY2Vzc19UeXBlX1Rhc2s9XHU2NWI5XHU2Y2Q1XHU0ZjVjXHU2OTZkXHVmZjFhDQotUHJvY2Vzc19UeXBlX1JvbGU9XHU2NWI5XHU2Y2Q1XHU4OWQyXHU4MjcyXHVmZjFhDQotUHJvY2Vzc19UeXBlX1dvcmtQcm9kdWN0PVx1NjViOVx1NmNkNVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1ZmYxYQ0KLQ0KLVdvcmtQcm9kdWN0X1R5cGU9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU5ODVlXHU1NzhiXHVmZjFhDQotDQotQWN0aXZpdHlfTW9kZWxJbmZvPVx1NmEyMVx1NTc4Ylx1OGNjN1x1OGEwYVx1ZmYxYQ0KLUFjdGl2aXR5X1R5cGU9XHU2ZDNiXHU1MmQ1XHU5ODVlXHU1NzhiXHVmZjFhDQotQWN0aXZpdHlfcHJlc2VudGF0aW9uTmFtZT1cdTU0NDhcdTczZmVcdTU0MGRcdTdhMzFcdWZmMWENCi1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9XHU2NmZmXHU0ZWUzXHU2NWI5XHU2ODQ4XHVmZjFhDQotQWN0aXZpdHlfaG93VG9TdGFmZj1cdTU5ODJcdTRmNTVcdTkxNGRcdTdmNmVcdTRlYmFcdTU0ZTFcdWZmMWENCi1CcmVha2Rvd25FbGVtZW50X2tleUNvbnNpZGVyYXRpb25zPVx1NGUzYlx1ODk4MVx1ODAwM1x1OTFjZlx1ZmYxYQ0KLVByb2Nlc3NfdXNhZ2VHdWlkYW5jZT1cdTc1MjhcdTZjZDVcdTYzMDdcdTVmMTVcdWZmMWENCi0NCi1BY3Rpdml0eV9Sb2FkbWFwVGl0bGU9XHU1YzBlXHU4OWJkXHU1NzE2DQotQWN0aXZpdHlfUm9hZG1hcERlc2NyaXB0aW9uPVx1NGVlNVx1ODVjZFx1NTcxNlx1NjgzY1x1NWYwZlx1NjNkMFx1NGY5Ylx1NTE3Nlx1NGVkNlx1OGNjN1x1OGEwYVx1NzY4NFx1OTNjOFx1N2Q1MFx1MzAwMg0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlPVx1NGUwMFx1ODIyY1x1NjMwN1x1NWYxNQ0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uPVx1NGVlNVx1NjMwN1x1NWYxNVx1NWY2Mlx1NWYwZlx1NjNkMFx1NGY5Ylx1NTE3Nlx1NGVkNlx1OGNjN1x1OGEwYVx1NzY4NFx1OTNjOFx1N2Q1MFx1MzAwMg0KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbFRpdGxlPVx1OTAxYVx1OGEwYVx1OGNjN1x1NjU5OQ0KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPVx1NGVlNVx1OTAxYVx1OGEwYVx1OGNjN1x1NjU5OVx1NjgzY1x1NWYwZlx1NjNkMFx1NGY5Ylx1NTE3Nlx1NGVkNlx1OGNjN1x1OGEwYVx1NzY4NFx1OTNjOFx1N2Q1MFx1MzAwMg0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU9XHU2NTU5XHU4MGIyXHU4Y2M3XHU2NTk5DQotQWN0aXZpdHlfRWR1Y2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1cdTRlZTVcdTY1NTlcdTgwYjJcdThjYzdcdTY1OTlcdTY4M2NcdTVmMGZcdTYzZDBcdTRmOWJcdTUxNzZcdTRlZDZcdThjYzdcdThhMGFcdTc2ODRcdTkzYzhcdTdkNTBcdTMwMDINCi0NCi1BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwPVx1ODVjZFx1NTcxNlx1ZmYxYQ0KLUFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZT1cdTYzMDdcdTVmMTVcdWZmMWENCi1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9XHU5MDFhXHU4YTBhXHU4Y2M3XHU2NTk5XHVmZjFhDQotQWN0aXZpdHlfU2VsZWN0ZWRfRWR1Y2F0aW9uTWF0ZXJpYWw9XHU2NTU5XHU4MGIyXHU4Y2M3XHU2NTk5XHVmZjFhDQotDQotQWN0aXZpdHlfRGlhZ3JhbVRpdGxlPVx1NTcxNlx1ODllMw0KLUFjdGl2aXR5X0RpYWdyYW1EZXNjcmlwdGlvbiA9IFx1NjNkMFx1NGY5Ylx1NmI2NHswfVx1NzY4NFx1NTcxNlx1ODllM1x1NWY3MVx1NTBjZlx1MzAwMg0KLUFjdGl2aXR5X0FESW1hZ2U9XHU2ZDNiXHU1MmQ1XHU1NzE2DQotQWN0aXZpdHlfQURESW1hZ2U9XHU2ZDNiXHU1MmQ1XHU2NjBlXHU3ZDMwXHU1NzE2DQotQWN0aXZpdHlfV1BESW1hZ2U9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyXHU1NzE2DQotQWN0aXZpdHlfVXNlQURJbWFnZT1cdTRmN2ZcdTc1MjhcdTZkM2JcdTUyZDVcdTU3MTZcdTRmODZcdTc2N2NcdTg4NGMNCi1BY3Rpdml0eV9Vc2VBRERJbWFnZT1cdTRmN2ZcdTc1MjhcdTZkM2JcdTUyZDVcdTY2MGVcdTdkMzBcdTU3MTZcdTRmODZcdTc2N2NcdTg4NGMNCi1BY3Rpdml0eV9Vc2VXUERJbWFnZT1cdTRmN2ZcdTc1MjhcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTc2ZjhcdTRmOWRcdTk1ZGNcdTRmYzJcdTU3MTZcdTRmODZcdTc2N2NcdTg4NGMNCi1BY3Rpdml0eV9Bc3NpZ249XHU2MzA3XHU1YjlhLi4uDQotDQotVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM9XHU2YjY1XHU5YTVmXHVmZjFhDQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ1RpdGxlPVx1NmI2NVx1OWE1Zg0KLVRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dNZXNzYWdlPVx1OTA3OFx1NTNkNlx1NmI2NVx1OWE1Zg0KLQ0KLUFjdGl2aXR5X1dvcmtSb2xsdXA9XHU1ZGU1XHU0ZjVjXHU1ZjU5XHU3ZTNkDQotQWN0aXZpdHlfVGVhbVJvbGx1cD1cdTU3MThcdTk2OGFcdTVmNTlcdTdlM2QNCi1BY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXA9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU1ZjU5XHU3ZTNkDQotQWN0aXZpdHlfV29ya1JvbGx1cERlc2NyaXB0aW9uPVx1NTcyOFx1NjcyY1x1N2JjMFx1NWJlOVx1NjdlNVx1NmI2NFx1NmQzYlx1NTJkNVx1NzY4NFx1NWRlNVx1NGY1Y1x1NWY1OVx1N2UzZFx1MzAwMg0KLUFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbj1cdTU3MjhcdTY3MmNcdTdiYzBcdTViZTlcdTY3ZTVcdTZiNjRcdTZkM2JcdTUyZDVcdTc2ODRcdTU3MThcdTk2OGFcdTVmNTlcdTdlM2RcdTMwMDINCi1BY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXBEZXNjcmlwdGlvbj1cdTU3MjhcdTY3MmNcdTdiYzBcdTViZTlcdTY3ZTVcdTZiNjRcdTZkM2JcdTUyZDVcdTc2ODRcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTVmNTlcdTdlM2RcdTMwMDINCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9NdWx0aXBsZU9jdXJyYW5jZT1cdTU5MWFcdTZiMjFcdTUxZmFcdTczZmVcdTc2ODRcdTk4MDVcdTc2ZWUNCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9PcHRpb25hbD1cdTkwNzhcdTc1MjgNCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9QbGFubmVkPVx1ODk4Zlx1NTI4Mw0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N1cHJlc3NlZD1cdTUzZDdcdTYyOTFcdTUyMzYNCi0NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9FdmVudERyaXZlbj1cdTRlOGJcdTRlZjZcdTlhNDVcdTUyZDUNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9PbmdvaW5nPVx1NjMwMVx1N2U4Y1x1OTAzMlx1ODg0Y1x1NGUyZA0KLVdvcmtCcmVha2Rvd25FbGVtZW50X1JlcGVhdGFibGU9XHU1M2VmXHU5MWNkXHU4OTA3XHU3Njg0DQotV29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3JzPVx1NTI0ZFx1NGUwMFx1NzI0OFx1ZmYxYQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3k9XHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyXHVmZjFhDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfSURfVEVYVD1cdTdkMjJcdTVmMTUNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9QUkVTRU5UQVRJT05fTkFNRV9URVhUPVx1NTQ0OFx1NzNmZVx1NTQwZFx1N2EzMQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0RFUEVOREVOQ1lfVEVYVD1cdTc2ZjhcdTRmOWRcdTk1ZGNcdTRmYzINCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZD1cdTY1YjBcdTU4OWUNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQ9XHU3ZGU4XHU4ZjJmDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU9XHU3OWZiXHU5NjY0DQotDQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fU1RBUlQ9XHU1YjhjXHU2MjEwLVx1OTU4Ylx1NTljYg0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSD1cdTViOGNcdTYyMTAtXHU1YjhjXHU2MjEwDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g9XHU5NThiXHU1OWNiLVx1NWI4Y1x1NjIxMA0KLVdvcmtPcmRlclR5cGVfU1RBUlRfVE9fU1RBUlQ9XHU5NThiXHU1OWNiLVx1OTU4Ylx1NTljYg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZD1cdTgyMDdcdTRmODZcdTZlOTBcdTU0MGNcdTZiNjUNCi0NCi1EZXNjcmlwdG9yX1JlZmluZWREZXNjcmlwdGlvbj1cdThhNzNcdTdkMzBcdTc2ODRcdThhYWFcdTY2MGVcdWZmMWENCi0NCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9XHU4OWQyXHU4MjcyDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPVx1NjMwN1x1NWI5YVx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1NWI1MFx1NGY4Nlx1NTdmN1x1ODg0Y1x1NmI2NFx1NGY1Y1x1Njk2ZFx1NjNjZlx1OGZmMFx1NWI1MFx1MzAwMg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1cdTRlM2JcdTg5ODFcdTU3ZjdcdTg4NGNcdTgwMDVcdWZmMWENCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9XHU1MTc2XHU0ZWQ2XHU1N2Y3XHU4ODRjXHU4MDA1XHVmZjFhDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUzPVx1NTJhOVx1NzQwNlx1ZmYxYQ0KLQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTYzMDdcdTViOWFcdTZiNjRcdTRmNWNcdTY5NmRcdTYzY2ZcdThmZjBcdTViNTBcdTc2ODRcdThmMzhcdTUxNjVcdTUzY2FcdThmMzhcdTUxZmFcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTYzY2ZcdThmZjBcdTViNTBcdTMwMDINCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPVx1NWZjNVx1ODk4MVx1OGYzOFx1NTE2NVx1ZmYxYQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9XHU5MDc4XHU3NTI4XHU4ZjM4XHU1MTY1XHVmZjFhDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMz1cdTU5MTZcdTkwZThcdThmMzhcdTUxNjVcdWZmMWENCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGU0PVx1OGYzOFx1NTFmYVx1ZmYxYQ0KLQ0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25UaXRsZT1cdTRmNWNcdTY5NmQNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb249XHU2YjY0XHU4OWQyXHU4MjcyXHU2M2NmXHU4ZmYwXHU1YjUwXHU2NjJmXHU0ZTBiXHU1MjE3XHU0ZjVjXHU2OTZkXHU2M2NmXHU4ZmYwXHU1YjUwXHU3Njg0XHU1N2Y3XHU4ODRjXHU4MDA1XHUzMDAyDQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUxPVx1NGUzYlx1ODk4MVx1NTdmN1x1ODg0Y1x1ODAwNVx1ZmYxYQ0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMj1cdTUxNzZcdTRlZDZcdTU3ZjdcdTg4NGNcdTgwMDVcdWZmMWENCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTM9XHU1MmE5XHU3NDA2XHVmZjFhDQotDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZT1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uPVx1NmI2NFx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1NWI1MFx1OGNhMFx1OGNhY1x1NTQ4Y1x1NGZlZVx1NjUzOVx1NGUwYlx1NTIxN1x1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NjNjZlx1OGZmMFx1NWI1MFx1MzAwMg0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTE9XHU4Y2EwXHU4Y2FjXHVmZjFhDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1cdTRmZWVcdTY1MzlcdWZmMWENCi0NCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlPVx1ODlkMlx1ODI3Mg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb249XHU0ZTBiXHU1MjE3XHU4OWQyXHU4MjcyXHU2M2NmXHU4ZmYwXHU1YjUwXHU4Y2EwXHU4Y2FjXHU1NDhjXHU0ZmVlXHU2NTM5XHU2YjY0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU2M2NmXHU4ZmYwXHU1YjUwXHUzMDAyDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1cdThjYTBcdThjYWNcdWZmMWENCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUyPVx1NGZlZVx1NjUzOVx1ODAwNVx1ZmYxYQ0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9UeXBlPVx1OTg1ZVx1NTc4Ylx1ZmYxYQ0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGU9XHU2ZDNiXHU1MmQ1XHU5MDMyXHU1MTY1XHU3MmMwXHU2MTRiXHVmZjFhDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlPVx1NmQzYlx1NTJkNVx1N2Q1MFx1Njc1Zlx1NzJjMFx1NjE0Ylx1ZmYxYQ0KLQ0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvblRpdGxlPVx1NGVhNFx1NGVkOFx1OTgwNVx1NzZlZVx1N2Q0NFx1NGVmNg0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvbkRlc2NyaXB0aW9uPVx1NGVhNFx1NGVkOFx1OTgwNVx1NzZlZVx1NjcwOVx1NGUwYlx1NTIxN1x1NGVhNFx1NGVkOFx1OTgwNVx1NzZlZVx1MzAwMg0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfVGFibGUxPVx1NGVhNFx1NGVkOFx1OTgwNVx1NzZlZVx1N2Q0NFx1NGVmNg0KLQ0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvblRpdGxlPVx1NTcxOFx1OTY4YQ0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvbkRlc2NyaXB0aW9uPVx1NmI2NFx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1NWI1MFx1NTNjM1x1NzE2N1x1NGUwYlx1NTIxN1x1NTcxOFx1OTY4YVx1MzAwMg0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fVGFibGUxPVx1NTcxOFx1OTY4YVx1ZmYxYQ0KLQ0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU9XHU4OWQyXHU4MjcyDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTZiNjRcdTg5MDdcdTU0MDhcdTg5ZDJcdTgyNzJcdTY3MDlcdTRlMGJcdTUyMTdcdTgwNWFcdTk2YzZcdTg5ZDJcdTgyNzJcdTMwMDINCi1Db21wb3NpdGVSb2xlX1JvbGVfVGFibGUxPVx1ODA1YVx1OTZjNlx1ODlkMlx1ODI3Mlx1ZmYxYQ0KLQ0KLVRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvblRpdGxlPVx1ODlkMlx1ODI3Mg0KLVRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uPVx1NTcyOFx1NTcxOFx1OTY4YVx1OGEyZFx1NWI5YVx1NGUyZFx1NjViMFx1NTg5ZVx1NjIxNlx1NzlmYlx1OTY2NFx1ODlkMlx1ODI3Mlx1MzAwMg0KLVRlYW1Qcm9maWxlX1JvbGVfVGFibGUxPVx1ODlkMlx1ODI3Mlx1ZmYxYQ0KLQ0KLVByb2Nlc3NfUmljaFRleHRfQ29sbGFwc2VJbWFnZT1jb2xsYXBzZWQuZ2lmDQotUHJvY2Vzc19SaWNoVGV4dF9FeHBhbmRJbWFnZT1leHBhbmRlZC5naWYNCi1Qcm9jZXNzX0FkZD1cdTY1YjBcdTU4OWUuLi4NCi1Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzPVx1NWY5ZVx1N2EwYlx1NWU4Zlx1NjViMFx1NTg5ZS4uLg0KLVByb2Nlc3NfUmVuYW1lX01lc3NhZ2U9XHU2MGE4XHU1YzA3XHU4YjhhXHU2NmY0XHU2YjY0XHU3YTBiXHU1ZThmXHU3Njg0XHU1NDBkXHU3YTMxXHUzMDAyXHU5MDE5XHU2YTIzXHU2NzAzXHU1MTMyXHU1YjU4XHU2YjY0XHU3ZGU4XHU4ZjJmXHU1NjY4XHVmZjBjXHU0ZTI2XHU1YzA3XHU3YTBiXHU1ZThmXHU4Y2M3XHU2NTk5XHU1OTNlXHU5MWNkXHU2NWIwXHU1NDdkXHU1NDBkXHU3MGJhXHU2NWIwXHU1NDBkXHU3YTMxXHUzMDAyXHU4OTgxXHU3ZTdjXHU3ZThjXHU1NWNlXHVmZjFmDQotUHJvY2Vzc19SZW1vdmU9XHU3OWZiXHU5NjY0DQotUHJvY2Vzc19VcD1cdTRlMGENCi1Qcm9jZXNzX0Rvd249XHU0ZTBiDQotUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbj1cdTU5MWFcdTkxY2RcdTkwNzhcdTk4MDUNCi1Qcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudD1cdTkzYzhcdTdkNTBcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjAuLi4NCi0NCi0jIyBFcnJvci9XYXJuaW5nDQotUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlPVx1NzEyMVx1NjU0OFx1NTQwZFx1N2EzMQ0KLVByb2Nlc3NfSW52YWxpZE5hbWU9SVVQQTAwODFFOiBcdTU0MGRcdTdhMzFcdTRlMGRcdTgwZmRcdTdhN2FcdTc2N2RcdTMwMDJcdThhY2JcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTc2ODRcdTU0MGRcdTdhMzFcdTMwMDINCi1Qcm9jZXNzX1JlbmFtZV9UaXRsZT1cdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGQNCi1Qcm9jZXNzX0ludmFsaWRQcmVzZW50YXRpb25OYW1lPUlVUEEwMDgyRTogXHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxXHU0ZTBkXHU4MGZkXHU3YTdhXHU3NjdkXHUzMDAyXHU4YWNiXHU2MzA3XHU1YjlhXHU2NzA5XHU2NTQ4XHU3Njg0XHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxXHUzMDAyDQotUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlPVx1OTNjOFx1N2Q1MFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMA0KLVByb2Nlc3NfSW52YWxpZExpbmtNZXRob2RFbGVtZW50PUlVUEEwMDgzRTogXHU3MTIxXHU2Y2Q1XHU5MDIzXHU3ZDUwXHU4MWYzICcnezB9JydcdWZmMGNcdTU2ZTBcdTcwYmFcdTZiNjQgTWV0aG9kRWxlbWVudCBcdTVkZjJcdTc1MjhcdTY1YmNcdTc2ZjhcdTU0MGNcdTZiY2RcdTk4MDVcdTc2ODRcdTUxNzZcdTRlZDZcdTYzY2ZcdThmZjBcdTViNTBcdTMwMDINCi1Qcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGU9XHU4Y2M3XHU4YTBhDQotUHJvY2Vzc19UZWFtQXNzaWduRXJyb3I9SVVQQTAwODRFOiAnJ3swfScnIFx1NzEyMVx1NmNkNVx1NjViMFx1NTg5ZVx1ODFmM1x1NTcxOFx1OTY4YSAnJ3sxfScnIFxuXG5cdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTViNTBcdTVmYzVcdTk4MDhcdTY3MDlcdTc2ZjhcdTk1ZGNcdTc2ODRcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTg5ZDJcdTgyNzJcdWZmMGNcdTYyNGRcdTgwZmRcdTYzMDdcdTViOWFcdTdkNjZcdTU3MThcdTk2OGFcdTMwMDJcblxuXHU4YWNiXHU1MTQ4XHU0ZmVlXHU2YjYzXHU5NWRjXHU4MDZmXHVmZjBjXHU3MTM2XHU1ZjhjXHU1MThkXHU4YTY2XHU0ZTAwXHU2YjIxXHUzMDAyDQotUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZT1cdTkwNzhcdTUzZDZcdTU3MThcdTk2OGENCi1Qcm9jZXNzX1RlYW1EaWFsb2dUaXRsZT1cdTU3MThcdTk2OGENCi0NCi1Qcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3I9SVVQQTAwODVFOiAnJ3swfScnIFx1NzEyMVx1NmNkNVx1NjViMFx1NTg5ZVx1ODFmM1x1NGVhNFx1NGVkOFx1OTgwNVx1NzZlZSAnJ3sxfScnXHVmZjBjXHU1NmUwXHU3MGJhXHU2YzkyXHU2NzA5XHU3NmY4XHU5NWRjXHU3Njg0XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHUzMDAyDQotUHJvY2Vzc19Db21wb3NpdGVSb2xlQXNzaWduRXJyb3I9SVVQQTAwODZFOiAnJ3swfScnIFx1NzEyMVx1NmNkNVx1NjViMFx1NTg5ZVx1ODFmM1x1ODkwN1x1NTQwOFx1ODlkMlx1ODI3MiAnJ3sxfScnXHVmZjBjXHU1NmUwXHU3MGJhXHU2YzkyXHU2NzA5XHU3NmY4XHU5NWRjXHU3Njg0XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU4OWQyXHU4MjcyXHUzMDAyDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlPUlVUEEwMDg3VzogXHU4YWNiXHU4ZjM4XHU1MTY1XHU2NzA5XHU2NTQ4XHU3Njg0XHU1MjRkXHU0ZTAwXHU3MjQ4XHU2NTc4XHU3NmVlXHUzMDAyDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJUaXRsZT1cdTcxMjFcdTY1NDhcdTc2ODRcdTUyNGRcdTRlMDBcdTcyNDggSUQNCi0NCi1Qcm9jZXNzX05vSXRlbXM9XHU2NzJhXHU5MDc4XHU1M2Q2XHU5ODA1XHU3NmVlDQotUHJvY2Vzc19JdGVtc1NlbGVjdGVkPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU5ODA1XHU3NmVlDQotUHJvY2Vzc19Ob1Byb3BlcnRpZXNBdmFpbGFibGU9XHU2YzkyXHU2NzA5XHU1M2VmXHU3NTI4XHU3Njg0XHU1MTY3XHU1YmI5DQotDQotUHJlZGVjZXNzb3JEaWFsb2dfVGl0bGU9XHU1MjRkXHU0ZTAwXHU3MjQ4XHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyDQotUHJlZGVjZXNzb3JEaWFsb2dfSGVhZGVyTWVzc2FnZT1cdThmMzhcdTUxNjVcdTUyNGRcdTRlMDBcdTcyNDhcdTc2ODRcdTc2ZjhcdTRmOWRcdTk1ZGNcdTRmYzJcdTk4NWVcdTU3OGJcdWZmMWENCi1QcmVkZWNlc3NvckRpYWxvZ19JbmRleD1cdTdkMjJcdTVmMTVcdWZmMWENCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lPVx1NTQ0OFx1NzNmZVx1NTQwZFx1N2EzMVx1ZmYxYQ0KLVByZWRlY2Vzc29yRGlhbG9nX0RlcGVuZGVuY3k9XHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyXHVmZjFhDQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvckRpYWxvZ1RpdGxlPVx1NTI0ZFx1NGUwMFx1NzI0OA0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JNZXNzYWdlPUlVUEEwMDg4RTogXHU2YjY0XHU1ZGU1XHU0ZjVjXHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwXHU1ZGYyXHU1YjU4XHU1NzI4XHU2YjY0IElEIFx1NzY4NFx1NTI0ZFx1NGUwMFx1NzI0OFx1MzAwMg0KLQ0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c9SVVQQTAwOTBFOiBcdTdkZThcdThmMmZcdTUxNjdcdTViYjlcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdTMwMDINCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZz1JVVBBMDA4OVc6IFx1NzEyMVx1NjU0OFx1NzY4NFx1NTI0ZFx1NGUwMFx1NzI0OFx1NmUwNVx1NTVhZQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGRmODBlMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzFhNzVlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDIuamFyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAzNjlhMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS5ubDIuamFyID0gc3JjLw0KLW91dHB1dC5ubDIuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMi5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwZTdjYzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIENvbXBvc2VyIEF1dGhvcmluZyBVSSAoTkwyKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MWZmYzJjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgRVBGIC0gXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5IFx1MDQzOFx1MDQzZFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQ0NFx1MDQzNVx1MDQzOVx1MDQ0MQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgQ2F0ZWdvcnkNCi1tZXRob2RDYXRlZ29yeU5hbWU9XHUwNDFjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0DQotDQotIyBQZXJzcGVjdGl2ZQ0KLWF1dGhvcmluZ1BlcnNwZWN0aXZlTmFtZT1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUNCi1icm93c2luZ1BlcnNwZWN0aXZlTmFtZT1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDANCi0NCi0jIFZpZXdzDQotbGlicmFyeVZpZXdOYW1lPVx1MDQxMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzMA0KLWNvbmZpZ3VyYXRpb25WaWV3TmFtZT1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi1jb250ZW50Vmlld05hbWU9XHUwNDFjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotY29uZmlndXJhdGlvbkVycm9yTG9nVmlld05hbWU9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDNhXHUwNDNlXHUwNDNiIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzZVx1MDQzYSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi0NCi0jIEVkaXRvcnMNCi1tZXRob2RFbGVtZW50RWRpdG9yTmFtZT1cdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLWNvbmZpZ3VyYXRpb25FZGl0b3JOYW1lPVx1MDQyMFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1wcm9jZXNzRWRpdG9yTmFtZT1cdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyDQotYWN0aXZpdHlEaWFncmFtRWRpdG9yTmFtZT1cdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOQ0KLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvck5hbWU9XHUwNDIwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2MgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5DQotd29ya1Byb2R1Y3REZXBlZGVuY3lEaWFncmFtRWRpdG9yTmFtZT1cdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjIFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzOSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotDQotIyBDaGVhdCBTaGVldHMNCi1tZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWU9XHUwNDFmXHUwNDMwXHUwNDNjXHUwNDRmXHUwNDQyXHUwNDNhXHUwNDM4IFx1MDQzZlx1MDQzZSBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotQ2hlYXRzaGVldEdldHN0YXJ0ZWRDYXRlZ29yeVRleHQ9XHUwNDFkXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNiXHUwNDNlIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQ0Yg0KLUNoZWF0c2hlZXRSZXVzYWJsZUNvbnRlbnRDYXRlZ29yeVRleHQ9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzY1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzNSBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0NGIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotQ2hlYXRzaGVldFdyaXRlQ29udGVudENhdGVnb3J5VGV4dD1cdTA0MTdcdTA0MzBcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLUNoZWF0c2hlZXRQcm9jZXNzZXNDYXRlZ29yeVRleHQ9XHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDMwIFx1MDQ0MSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzBcdTA0M2NcdTA0MzgNCi1DaGVhdHNoZWV0TmF2aWdhdGVNZXRob2RDb250ZW50PVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MCBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzZVx1MDQzMVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZFBsdWdpbj1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDMxXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0YyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1DaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudD1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCwgXHUwNDNkXHUwNDMwXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQwIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzOCwgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4LCBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYNCi1DaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHM9XHUwNDIzXHUwNDQyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwIChcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzgsIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOCwgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0YiBcdTA0MzggXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmKSBcdTA0NDEgXHUwNDQzXHUwNDQ3XHUwNDM1XHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOQ0KLUNoZWF0c2hlZXRSZXBsYWNlTWVodG9kRWxlbWVudHM9XHUwNDE3XHUwNDMwXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwIChcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzgsIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOCwgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0YiBcdTA0MzggXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmKQ0KLUNoZWF0c2hlZXRBZGRNZXRob2RSZWZPckh5cGVybGluaz1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDQzIFx1MDQzZFx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzQgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzM1x1MDQzOFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQ0MyAoVVJMKQ0KLUNoZWF0c2hlZXRBcHBseUNhcGFiaWxpdHlQYXR0ZXJuPVx1MDQxZlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2QgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotQ2hlYXRzaGVldENyZWF0ZVByb2Nlc3M9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MSAoXHUwNDQ4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkIFx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzOSBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzOCkNCi0NCi0jIEFjdGlvbiBTZXQNCi1hdXRob3JpbmdBY3Rpb25TZXQ9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotY2hlYXRTaGVldHNBY3Rpb25TZXQ9XHUwNDFmXHUwNDMwXHUwNDNjXHUwNDRmXHUwNDQyXHUwNDNhXHUwNDM4DQotDQotIyBHbG9iYWwgQWN0aW9ucw0KLW5ld0xpYnJhcnlBY3Rpb249Jlx1MDQxMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1uZXdMaWJyYXJ5QWN0aW9uVG9vbHRpcD1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLW5ld1BsdWdpbkFjdGlvbj0mXHUwNDFjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLW5ld1BsdWdpbkFjdGlvblRvb2x0aXA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0YyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1uZXdDb25maWdBY3Rpb249Jlx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotb3BlbkxpYnJhcnlBY3Rpb249Jlx1MDQxMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1vcGVuTGlicmFyeUFjdGlvblRvb2x0aXA9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1vcGVuQ29uZmlnQWN0aW9uPSZcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1vcGVuQ2hlYXRTaGVldHM9XHUwNDFmXHUwNDMwXHUwNDNjXHUwNDRmXHUwNDQyXHUwNDNhXHUwNDM4Li4uDQotDQotIyBMaWJyYXJ5IFZpZXcgQWN0aW9ucw0KLWxpbmtXaXRoRWRpdG9yPVx1MDQyMVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDEgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDNjDQotbGlua1dpdGhFZGl0b3JUb29sdGlwPVx1MDQyMVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDEgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDNjDQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzPVx1MDQxZlx1MDQzZVx1MDQzYVx1MDQzMFx1MDQzN1x1MDQ0Ylx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5DQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcD1cdTA0MWZcdTA0M2VcdTA0M2FcdTA0MzBcdTA0MzdcdTA0NGJcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOQ0KLQ0KLSMgQ29uZmlndXJhdGlvbiBWaWV3IEFjdGlvbnMNCi1yZWZyZXNoQ29uZmlnPVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLXJlZnJlc2hDb25maWdUb29sdGlwPVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUNCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1ldGhvZEF1dGhvcmluZ1BhZ2U9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLXByb2Nlc3NFZGl0b3I9XHUwNDIwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzZVx1MDQzMg0KLWxpYnJhcnlPcHRpb25zPVx1MDQxZVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzgNCi1kaWFncmFtPVx1MDQxNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMA0KLXN0YXJ0dXBBbmRTaHV0ZG93bj1cdTA0MTdcdTA0MzBcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0M2EgXHUwNDM4IFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0OFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0NGINCi1kZWJ1Zz1cdTA0MWVcdTA0NDJcdTA0M2JcdTA0MzBcdTA0MzRcdTA0M2FcdTA0MzANCi0NCi0jIENvbW1hbmQgSGFuZGxlcg0KLXNlbGVjdEFsbD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDQxXHUwNDM1DQotDQotIyBQcm9wZXJ0aWVzIFZpZXcNCi1fVUlfUHJvY2Vzc0VkaXRvcl9tZW51PVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MQ0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jlx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0M2VcdTA0NDdcdTA0MzVcdTA0NDBcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyDQotX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyAmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNkXHUwNDNlXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0Mg0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPSZcdTA0MWZcdTA0M2VcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNiXHUwNDRjIFx1MDQ0MVx1MDQzMlx1MDQzZVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMg0KLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT0mXHUwNDFlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjDQotX1VJX1Byb3BlcnRpZXNfR2VuZXJhbD1cdTA0MWVcdTA0MzFcdTA0NDlcdTA0MzhcdTA0MzUNCi1fVUlfUHJvcGVydGllc19Eb2N1bWVudGF0aW9uPVx1MDQxNFx1MDQzZVx1MDQzYVx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLV9VSV9Qcm9wZXJ0aWVzX1dvcmtfUm9sbHVwPVx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzMi4gXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXA9XHUwNDIwXHUwNDMwXHUwNDM3XHUwNDMyLiBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGINCi0jIyBUaGUgZm9sbG93aW5nIHZhbHVlIG9mIHN0cmluZyBzaG91bGQgYmUgIldvcmsgUHJvZHVjdCBSb2xsdXAiLiBCdXQNCi0jIyBkdWUgdG8gbGltaXRhdGlvbi9idWcgaW4gRWNsaXBzZSBXVFAsIGl0J3MgYmVlbiB0cnVuY2F0ZWQgdG8gDQotIyMgIldvcmsgUHJvZCBSb2xsdXAiLiBTbyBkdXJpbmcgdHJhbnNsYXRpb24sIHBsZWFzZSB0YWtlIHRoaXMgaW50byBjb25zaWRlcmF0aW9uLg0KLV9VSV9Qcm9wZXJ0aWVzX1dQX1JvbGx1cD1cdTA0MjBcdTA0MzBcdTA0MzdcdTA0MzIuIFx1MDQyMFx1MDQxZg0KLV9VSV9Qcm9wZXJ0aWVzX1JvbGVzPVx1MDQyMFx1MDQzZVx1MDQzYlx1MDQzOA0KLV9VSV9Qcm9wZXJ0aWVzX1dvcmtQcm9kdWN0cz1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiDQotX1VJX1Byb3BlcnRpZXNfU3RlcHM9XHUwNDI4XHUwNDMwXHUwNDMzXHUwNDM4DQotX1VJX1Byb3BlcnRpZXNfVGVhbXM9XHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM2NzA4NzkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXByZXZpb3VzX25hbWVfbnVsbDE9XHUwNDFkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzZVx1MDQ0Mlx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUsIFx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQ0MyBcdTA0M2RcdTA0MzUgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNlx1MDQzZFx1MDQzNVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuDQotZXJyX25hbWVfZW1wdHk9XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQ0Ylx1MDQzYy4gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuDQotbW92ZUFjdGlvbl9sYWJlbD1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzhcdTA0NDJcdTA0NGMNCi0NCi1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDRjDQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M2IgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQ0Yw0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M2INCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnPUlYUkQwMDAyVzogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0MzRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNiIFx1MDQzMiBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NDMNCi1BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0PVx1MDQyMVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQ0Yw0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3NlbGVjdD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDRjDQotQWJzdHJhY3REaWFncmFtX0xpbmtfdG9vbHRpcD1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDRjDQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0PVx1MDQxZFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M2INCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M2INCi1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dD1cdTA0MjFcdTA0MzJcdTA0M2VcdTA0MzFcdTA0M2VcdTA0MzRcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyDQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzMlx1MDQzZVx1MDQzMVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDINCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0PVx1MDQxZlx1MDQzZVx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQzMCBcdTA0NDFcdTA0MzhcdTA0M2RcdTA0NDVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NDMgXHUwNDQxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0PVx1MDQyM1x1MDQzN1x1MDQzNVx1MDQzYiBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0M2RcdTA0NGZcdTA0NDJcdTA0MzhcdTA0NGYgXHUwNDQwXHUwNDM1XHUwNDQ4XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M2IgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNkXHUwNDRmXHUwNDQyXHUwNDM4XHUwNDRmIFx1MDQ0MFx1MDQzNVx1MDQ0OFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3RleHQ9XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQ0M1x1MDQzN1x1MDQzNVx1MDQzYg0KLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg9XHUwNDFmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM4IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzODoNCi1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNiDQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9XHUwNDFlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmDQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZQ0KLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1cdTA0MThcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZQ0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0PVx1MDQyZFx1MDQ0Mlx1MDQzMFx1MDQzZg0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0NDJcdTA0MzBcdTA0M2YNCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3RleHQ9XHUwNDE0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzOA0KLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PVx1MDQxNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMCBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMDoNCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzOA0KLUFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MSBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzgNCi1BY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2QgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotQWN0dml0aXZpdHlEaWFncmFtX1BoYXNlX3RleD1cdTA0MmRcdTA0NDJcdTA0MzBcdTA0M2YNCi1BY3R2aXRpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9XHUwNDE4XHUwNDQyXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmDQotQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9XHUwNDFlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmDQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PVx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1cdTA0MTJcdTA0NGJcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2RcdTA0MzhcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1cdTA0MWVcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDNlIFx1MDQzMVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQzZVx1MDQzOSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9XHUwNDFlXHUwNDQyXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0MzUuLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVx1MDQxM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZSBcdTA0M2ZcdTA0M2UgXHUwNDQxXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNkXHUwNDM1XHUwNDNjXHUwNDQzDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdTA0MTNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDNmXHUwNDNlIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0M2NcdTA0NDMNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVx1MDQxMlx1MDQzNVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZSBcdTA0M2ZcdTA0M2UgXHUwNDQxXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNkXHUwNDM1XHUwNDNjXHUwNDQzDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDNmXHUwNDNlIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0M2NcdTA0NDMNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9XHUwNDIxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IHswfQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNiDQotQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlPVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0M2UgXHUwNDMxXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM5DQotQWJzdHJhY3REaWFncmFtX0JlbmRQb2ludF9jcmVhdGU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQ0M1x1MDQzYw0KLQ0KLUFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NDMgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotcmVmcmVzaEFjdGlvbl9sYWJlbD1cdTA0MWVcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMNCi1yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw9XHUwNDFlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzZSBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzkNCi1kaWFncmFtX3NhdmVFcnJvcj1JVVBEMDAwMVc6IFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0Mw0KLQ0KLURlbGV0ZURpYWdyYW1fdGV4dD1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDQzDQotRGVsZXRlRGlhZ3JhbV9wcm9tcHQ9XHUwNDE3XHUwNDMwXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzOCBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDQzP1xuXHUwNDJkXHUwNDQyXHUwNDNlIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NGYgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzZVx1MDQ0Mlx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0Yy4NCi1hbGlnbl9iZW5kX3BvaW50X3RleHQ9XHUwNDEyXHUwNDRiXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDNkXHUwNDRmXHUwNDQyXHUwNDRjIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQ0M1x1MDQzYw0KLUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwPVx1MDQyMFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1kaWFncmFtX25vZGVfcHJvcGVydHlfdmFsdWVfcHJvYmxlbV9tc2c9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAgXHUwNDQzXHUwNDM3XHUwNDNiXHUwNDMwLg0KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwDQotDQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PVx1MDQyMVx1MDQzMVx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2NcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDIgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDRiDQotZXJyb3JEaWFsb2dfdGl0bGU9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwDQotY29tbWFuZF9jYW5ub3RFZGl0PUlVUEQwMDAzRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDQzDQotDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RpdGxlPVx1MDQxN1x1MDQzMFx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0MiBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzMA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0PVx1MDQxZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0MiB7MH0gXHUwNDM3XHUwNDMwXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyLiBcdTA0MTdcdTA0MzBcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDQyXHUwNDMwXHUwNDNhXHUwNDM2XHUwNDM1IHsxfT8NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTU2OGU5MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIxMyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRm9ybSBQYWdlIFRpdGxlcw0KLWFzc2lnblBhZ2VfdGl0bGU9XHUwNDFkXHUwNDMwXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotY2F0ZWdvcmllc1BhZ2VfdGl0bGU9XHUwNDFhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4DQotZGVsaXZlcmFibGVQYXJ0c1BhZ2VfdGl0bGU9XHUwNDFhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzANCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9XHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotZGlzY2lwbGluZXNQYWdlX3RpdGxlPVx1MDQxNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQ0Yg0KLWRpc2NhcmR1bnJlc29sdmVkcmVmPVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQ0Zlx1MDQ0Mlx1MDQ0YyBcdTA0M2RcdTA0MzVcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4DQotZ3VpZGFuY2VQYWdlX3RpdGxlPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLXByZXZpZXdQYWdlX3RpdGxlPVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMlx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDANCi1yZWZlcmVuY2VzUGFnZV90aXRsZT1cdTA0MjFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzgNCi1yZWZlcmVuY2VfdGV4dD1cdTA0MjFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0Mzg6DQotcmVmZXJlbmNlV29ya2Zsb3dQYWdlX3RpdGxlPVx1MDQyMVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0M2VcdTA0NDJcdTA0M2VcdTA0M2EgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5DQotcm9sZXNQYWdlX3RpdGxlPVx1MDQyMFx1MDQzZVx1MDQzYlx1MDQzOA0KLXJvbGVTZXRzUGFnZV90aXRsZT1cdTA0MWRcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5DQotc3RlcHNQYWdlX3RpdGxlPVx1MDQyOFx1MDQzMFx1MDQzM1x1MDQzOA0KLXRhc2tzUGFnZV90aXRsZT1cdTA0MTdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi10b29sTWVudG9yc1BhZ2VfdGl0bGU9XHUwNDIwXHUwNDQzXHUwNDNhXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzZlx1MDQzZSBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2MNCi13b3JrUHJvZHVjdHNQYWdlX3RpdGxlPVx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGINCi0NCi0jIFNlY3Rpb24gTmFtZXMgJiBEZXNjcmlwdGlvbg0KLWNoZWNrSXRlbXNTZWN0aW9uX25hbWU9XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0NGINCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIsIFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQ0Zlx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0MzIgXHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQ0My4NCi1kZXBlbmRlbmNpZXNTZWN0aW9uX25hbWU9XHUwNDE3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM4DQotZGVwZW5kZW5jaWVzU2VjdGlvbl9kZXNjPVx1MDQxMiBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzggXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mlx1MDQzMCBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDNlXHUwNDQyIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQ0NSBcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzINCi1kZXRhaWxTZWN0aW9uX25hbWU9XHUwNDFmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLWRldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2VcdTA0MzEgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDM1ICJ7MH0iLg0KLWdlbmVyYWxJbmZvU2VjdGlvbl9uYW1lPVx1MDQxZVx1MDQzMVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2VcdTA0MzEgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDM1ICJ7MH0iLg0KLWljb25TZWN0aW9uX25hbWU9XHUwNDE3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNlXHUwNDNhDQotaWNvblNlY3Rpb25fZGVzYz1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNhXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDJcdTA0MzAgInswfSIuDQotbm90YXRpb25TZWN0aW9uX25hbWU9XHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZSBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzUNCi1ub3RhdGlvblNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZSBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzUgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzMCAiezB9Ii4NCi1yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fbmFtZT1cdTA0MjFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4Og0KLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9kZXNjPVx1MDQxMiBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzgsIFx1MDQzZFx1MDQzMCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLg0KLXN0YWZmaW5nU2VjdGlvbl9uYW1lPVx1MDQxOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2UgXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDNiXHUwNDM1DQotc3RhZmZpbmdTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDNiXHUwNDM1IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4Lg0KLXN0ZXBzU2VjdGlvbl9uYW1lPVx1MDQyOFx1MDQzMFx1MDQzM1x1MDQzOA0KLXN0ZXBzU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDhcdTA0MzBcdTA0MzNcdTA0MzggXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4Lg0KLXRhaWxvcmluZ1NlY3Rpb25fbmFtZT1cdTA0MTRcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0M2FcdTA0MzANCi10YWlsb3JpbmdTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2UgXHUwNDM0XHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM0XHUwNDNhXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzMCAiezB9Ii4NCi12YXJpYWJpbGl0eVNlY3Rpb25fbmFtZT1cdTA0MTJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyDQotdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyICJ7MH0iIFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2EgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDQzICJ7MH0iLg0KLXZlcnNpb25JbmZvU2VjdGlvbl9uYW1lPVx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4DQotdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzMCAiezB9Ii4NCi0NCi0jIFVJICYgRWxlbWVudCBBdHRyaWJ1dGUgTGFiZWxzDQotYWRkaXRpb25hbEluZm9fdGV4dD1cdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmOg0KLWFwcGxpY2F0aW9uX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1Og0KLWFjdGlvbkxhYmVsX2VkaXQ9XHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjDQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1cdTA0MWZcdTA0M2VcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyIFx1MDQzZlx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQzOCBcdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzANCi1hbHRlcm5hdGl2ZXNfdGV4dD1cdTA0MTBcdTA0M2JcdTA0NGNcdTA0NDJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0NGI6DQotYXNzaWdubWVudEFwcHJvYWNoZXNfdGV4dD1cdTA0MWZcdTA0M2VcdTA0MzRcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGIgXHUwNDNhIFx1MDQzZFx1MDQzMFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZToNCi1hdXRob3JzX3RleHQ9XHUwNDEwXHUwNDMyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiOg0KLWJhY2tncm91bmRfdGV4dD1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NGJcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NGY6DQotYmFzZUVsZW1lbnRfdGV4dD1cdTA0MTFcdTA0MzBcdTA0MzdcdTA0MzA6DQotYmFzZUd1aWRhbmNlX3RleHQ9XHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNToNCi1icmllZkRlc2NyaXB0aW9uX3RleHQ9XHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1Og0KLWRlc2NyaXB0aW9uX3RleHQ9XHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1Og0KLWJhY2t1cGJlZm9yZXNhdmVfdGV4dD1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQwXHUwNDM1XHUwNDM3XHUwNDM1XHUwNDQwXHUwNDMyXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0ZSBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzQgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1XHUwNDNjDQotYnJpZWZPdXRsaW5lX3RleHQ9XHUwNDFhXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDNhXHUwNDMwXHUwNDRmIFx1MDQ0MVx1MDQ0NVx1MDQzNVx1MDQzY1x1MDQzMDoNCi1jaGFuZ2VEYXRlX3RleHQ9XHUwNDE0XHUwNDMwXHUwNDQyXHUwNDMwIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZjoNCi1jaGFuZ2VEZXNjcmlwdGlvbl90ZXh0PVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGY6DQotY2hlY2tJdGVtc190ZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDQyXHUwNDMwXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDQ2XHUwNDRiDQotY29udHJpYnV0ZXNfdGV4dD1cdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDINCi1sb2NhbENvbnRyaWJ1dGVzX3RleHQ9XHUwNDFiXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0Mg0KLWNvbnRyaWJ1dGVzX3RvX3RleHQ9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyDQotY29weXJpZ2h0X3RleHQ9XHUwNDEwXHUwNDMyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzMDoNCi1lZGl0b3JfdGV4dD1cdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDANCi1leHRlbmRzX3RleHQ9XHUwNDIwXHUwNDMwXHUwNDQxXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDRmXHUwNDM1XHUwNDQyDQotZXh0ZW5kX3RleHQ9XHUwNDIwXHUwNDMwXHUwNDQxXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDRjDQotZXh0ZXJuYWxEZXNjcmlwdGlvbl90ZXh0PVx1MDQxMlx1MDQzZFx1MDQzNVx1MDQ0OFx1MDQzZFx1MDQzNVx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzU6DQotZXh0ZXJuYWxJZF90ZXh0PVx1MDQxMlx1MDQzZFx1MDQzNVx1MDQ0OFx1MDQzZFx1MDQzOFx1MDQzOSBcdTA0MThcdTA0MTQ6DQotZ29hbHNfdGV4dD1cdTA0MjZcdTA0MzVcdTA0M2JcdTA0Mzg6DQotaW1wYWN0T2ZOb3RIYXZpbmdfdGV4dD1cdTA0MWZcdTA0M2VcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0NGYgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDRmOg0KLWtleUNvbnNpZGVyYXRpb25zX3RleHQ9XHUwNDFhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM1XHUwNDMyXHUwNDRiXHUwNDM1IFx1MDQ0M1x1MDQ0MVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0ZjoNCi1sZXZlbHNPZkFkb3B0aW9uX3RleHQ9XHUwNDIzXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDNkXHUwNDRjIFx1MDQzMlx1MDQzZFx1MDQzNVx1MDQzNFx1MDQ0MFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZjoNCi1tYWluRGVzY3JpcHRpb25fdGV4dD1cdTA0MWVcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1Og0KLW5ld0VsZW1lbnRfdGV4dD1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgezB9DQotbmFtZV90ZXh0PVx1MDQxOFx1MDQzY1x1MDQ0ZjoNCi1ub3RBcHBsaWNhYmxlX3RleHQ9XHUwNDFkXHUwNDM1XHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDNjXHUwNDNlDQotcGFja2FnaW5nR3VpZGFuY2VfdGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNmXHUwNDNlIFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZSBcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0MzA6DQotcHJlc2VudGF0aW9uTmFtZV90ZXh0PVx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGY6DQotcHJvbXB0Zm9ybGliYXJ5X3RleHQ9XHUwNDE3XHUwNDMwXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzY1x1MDQ0ZiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzUNCi1lbmFibGVIZWFsdGhDaGVja190ZXh0PVx1MDQxMlx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0M2RcdTA0NDNcdTA0NDJcdTA0NDBcdTA0MzVcdTA0M2RcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzZVx1MDQ0Mlx1MDQzYlx1MDQzMFx1MDQzNFx1MDQzYVx1MDQzOA0KLXByb2JsZW1fdGV4dD1cdTA0MWRcdTA0MzVcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0MzBcdTA0MzRcdTA0M2FcdTA0MzA6DQotcHVycG9zZV90ZXh0PVx1MDQxZFx1MDQzMFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNToNCi1yZWFzb25Gb3JOb3ROZWVkaW5nX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDQ3XHUwNDM4XHUwNDNkXHUwNDMwIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzA6DQotcmVwbGFjZXNfdGV4dD1cdTA0MTdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDINCi1sb2NhbFJlcGxhY2VzX3RleHQ9XHUwNDFiXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlIFx1MDQzN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0Mg0KLXJlcHJlc2VudGF0aW9uT3B0aW9uc190ZXh0PVx1MDQxZlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQ0MFx1MDQ0YiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGY6DQotdGVtcGxhdGVGaWxlX3RleHQ9XHUwNDI0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQzZVx1MDQzMjoNCi1za2lsbHNfdGV4dD1cdTA0MWRcdTA0MzBcdTA0MzJcdTA0NGJcdTA0M2FcdTA0Mzg6DQotc3RlcHNfdGV4dD1cdTA0MjhcdTA0MzBcdTA0MzNcdTA0Mzg6DQotc3RlcHNfbmFtZV90ZXh0PVx1MDQxOFx1MDQzY1x1MDQ0ZjoNCi1zdG9wX3RleHQ9XHUwNDIxXHUwNDQyXHUwNDNlXHUwNDNmDQotcHJpbnRfdGV4dD1cdTA0MWZcdTA0MzVcdTA0NDdcdTA0MzBcdTA0NDJcdTA0NGMNCi1zeW5vbnltc190ZXh0PVx1MDQyMVx1MDQzOFx1MDQzZFx1MDQzZVx1MDQzZFx1MDQzOFx1MDQzY1x1MDQ0YjoNCi10eXBlX3RleHQ9XHUwNDIyXHUwNDM4XHUwNDNmOg0KLWNvcHlfdGV4dD1cdTA0MjFcdTA0M2FcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMNCi1kZWVwQ29weV90ZXh0PVx1MDQyMFx1MDQzNVx1MDQzYVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzMlx1MDQzZFx1MDQzZVx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUNCi1iYWNrX3RleHQ9XHUwNDFkXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDM0DQotbmV3X3BsdWdpbj1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLW1vdmU9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDRjLi4uDQotdW5pcXVlSWRfdGV4dD1cdTA0MjNcdTA0M2RcdTA0MzhcdTA0M2FcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDE4XHUwNDE0Og0KLXZhcmlhYmlsaXR5VHlwZV90ZXh0PVx1MDQyMlx1MDQzOFx1MDQzZiBcdTA0MzJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0Mzg6DQotdmVyc2lvbl90ZXh0PVx1MDQxMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQ0ZjoNCi0NCi0jIEJ1dHRvbiBMYWJlbHMNCi1hZGRCdXR0b25fdGV4dD1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMuLi4NCi1hdHRhY2hCdXR0b25fdGV4dD1cdTA0MTJcdTA0M2JcdTA0M2VcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGMuLi4NCi1icm93c2VCdXR0b25fdGV4dD1cdTA0MWVcdTA0MzFcdTA0MzdcdTA0M2VcdTA0NDAuLi4NCi1jaGFuZ2VUeXBlQnV0dG9uX3RleHQ9XHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0Mlx1MDQzOFx1MDQzZi4uLg0KLWNsZWFyQnV0dG9uX3RleHQ9XHUwNDFlXHUwNDQ3XHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDRjDQotZGVsZXRlQnV0dG9uX3RleHQ9XHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDRjDQotZGV0YWNoQnV0dG9uX3RleHQ9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDM1XHUwNDNmXHUwNDM4XHUwNDQyXHUwNDRjDQotZGlhZ3JhbV9zYXZlRXJyb3I9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDRiDQotZG93bkJ1dHRvbl90ZXh0PVx1MDQxMlx1MDQzZFx1MDQzOFx1MDQzNw0KLWRpcmVjdG9yeV90ZXh0PVx1MDQxYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMzoNCi1vcmRlckJ1dHRvbl90ZXh0PVx1MDQxZlx1MDQzZVx1MDQ0MFx1MDQ0Zlx1MDQzNFx1MDQzZVx1MDQzYQ0KLWVkaXRCdXR0b25fdGV4dD1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMuLi4NCi1yZW1vdmVCdXR0b25fdGV4dD1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMNCi1yZW5hbWVBY3Rpb25fdGV4dD1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMuLi4NCi1yZW1vdmVfdGV4dD1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMNCi1yZW5hbWVfdGV4dD1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMNCi1TYXZlQXNfdGV4dD1cdTA0MjFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDMwXHUwNDNhDQotc2VsZWN0QnV0dG9uX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDRjLi4uDQotZGVzZWxlY3RCdXR0b25fdGV4dD1cdTA0MWVcdTA0NDJcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwDQotdXBCdXR0b25fdGV4dD1cdTA0MTJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDUNCi1tYWtlRGVmYXVsdEJ1dHRvbl90ZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlDQotdmlld0hpc3RvcnlCdXR0b25fdGV4dD1cdTA0MWZcdTA0M2VcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDMzXHUwNDM4XHUwNDRlLi4uDQotDQotIyBSb2xlIEVkaXRvciBUYXNrcyBQYWdlDQotcm9sZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1cdTA0MTdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MmRcdTA0NDJcdTA0MzAgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDRjIFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4Lg0KLXJvbGVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOA0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MWVcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjOg0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0YzoNCi1yb2xlVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0NzogezB9Lg0KLQ0KLSMgUm9sZSBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0YjoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGIsIFx1MDQzN1x1MDQzMCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0ZFx1MDQ0Mlx1MDQzMCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGMuDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGI6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MWVcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDdcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM3XHUwNDMwOg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1MDQxMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0NywgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDRmXHUwNDM1XHUwNDNjXHUwNDRiXHUwNDQ1IFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGNcdTA0NGU6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzMjogezB9Lg0KLQ0KLSMgUm9sZSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmDQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCBcdTA0M2RcdTA0MzAgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzIgXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQzOS4NCi1yb2xlR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPVx1MDQxNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGY6DQotcm9sZUd1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZjoNCi1yb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQzOTogezB9Lg0KLQ0KLSMgUm9sZSBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPVx1MDQxYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQzODoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NGZcdTA0M2NcdTA0MzgsIFx1MDQzYSBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0M2MgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQ0ZFx1MDQ0Mlx1MDQzMCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGMuDQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0Mzk6DQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1cdTA0MWZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4Og0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPVx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0Mzk6DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1MDQxZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0Mzg6DQotDQotIyBUYXNrIEVkaXRvciBSb2xlcyBQYWdlDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZT1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzgNCi10YXNrUm9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MWRcdTA0MzBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0NGNcdTA0NDJcdTA0MzUgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOC4NCi10YXNrUm9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1MDQxNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0Mzg6DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVx1MDQxZVx1MDQ0MVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGM6DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDM4Og0KLXRhc2tSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5OiB7MH0uDQotdGFza1JvbGVzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX21vZGlmeV9tZXNzYWdlPUlVUEEwMDA0NVc6IFx1MDQyMVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2VcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2RcdTA0NGJcdTA0M2MgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNjICcnezB9Jyc/DQotdGFza1JvbGVzUGFnZV9jb25maXJtX3RpdGxlPVx1MDQxZlx1MDQzZVx1MDQzNFx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNlXHUwNDQxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzOA0KLQ0KLSMgVGFzayBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0YiBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOC4NCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTA0MTRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9XHUwNDFlXHUwNDMxXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0Ylx1MDQzNToNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTA0MWRcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDRiXHUwNDM1Og0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwzPVx1MDQxMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0Ylx1MDQzNToNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0NDUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDMyOiB7MH0uDQotDQotIyBUYXNrIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYNCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzZFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzMiBcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzUgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM5Lg0KLXRhc2tHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZjoNCi10YXNrR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmOg0KLXRhc2tHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM5OiB7MH0uDQotDQotIyBUYXNrIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDFhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4DQotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDRmXHUwNDNjXHUwNDM4LCBcdTA0M2EgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDNjIFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0NGRcdTA0NDJcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDMwLg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTA0MTRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0NGINCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPVx1MDQxZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzgNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MTRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0NGI6DQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1MDQxZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0Mzg6DQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIFRhc2tzIFBhZ2UNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uTmFtZT1cdTA0MTdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb249XHUwNDJkXHUwNDQyXHUwNDNlXHUwNDQyIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDIgXHUwNDRmXHUwNDMyXHUwNDNiXHUwNDRmXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0Ylx1MDQzYyBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDMyXHUwNDRiXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDRiXHUwNDNjIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0NDUgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3Lg0KLVdvcmtQcm9kdWN0X1Rhc2tzX0F2YWlsYWJsZUxhYmVsPVx1MDQxNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsPVx1MDQxZVx1MDQzMVx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0M2RcdTA0M2VcdTA0Mzk6DQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDI9XHUwNDFkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzZVx1MDQzOToNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMz1cdTA0MTJcdTA0NGJcdTA0NDVcdTA0M2VcdTA0MzQ6DQotV29ya1Byb2R1Y3RfVGFza3NfTXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3OiB7MH0uDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIFJvbGVzIFBhZ2UNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzgNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUwNDIxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzOCBcdTA0M2VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDdcdTA0MzBcdTA0NGVcdTA0NDIgXHUwNDM3XHUwNDMwIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGZcdTA0NGVcdTA0NDIgXHUwNDM1XHUwNDMzXHUwNDNlLg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1MDQxNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzgNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVx1MDQxZVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGM6DQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDM4IFx1MDQ0MSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzBcdTA0M2NcdTA0MzggXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmOg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOTogezB9Lg0KLQ0KLSMjIFdvcmsgUHJvZHVjdCBFZGl0b3IgRGVsaXZlcmFibGUgUGFydHMgUGFnZQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDFhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzANCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0YiwgXHUwNDQxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDRmXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyLg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGIgXHUwNDNhXHUwNDMwXHUwNDNhIFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwOg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMDoNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQ0NSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0M2VcdTA0MzI6IHswfS4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzZFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzMiBcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzUgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM5Lg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPVx1MDQxNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGY6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGY6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM5OiB7MH0uDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDFhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Zlx1MDQzY1x1MDQzOCwgXHUwNDNhIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzYyBcdTA0M2VcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0MzhcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDQyIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDIuDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTA0MTRcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGINCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1cdTA0MjJcdTA0MzhcdTA0M2ZcdTA0NGIgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzMjoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMz1cdTA0MWZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4Og0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MTRcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2Q6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTA0MjJcdTA0MzhcdTA0M2ZcdTA0NGIgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzMjoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzPVx1MDQxZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0Mzg6DQotDQotIyBQcmFjdGljZSBFZGl0b3IgUmVmZXJlbmNlcyBQYWdlDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uTmFtZT1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzggXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzI6DQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsPVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzI6DQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1MDQxYVx1MDQzZVx1MDQzYlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzZSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMjogezB9Lg0KLQ0KLSMgQ2F0ZWdvcnkgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmXHUwNDNjXHUwNDM4LCBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0M2RcdTA0MzBcdTA0MzRcdTA0M2JcdTA0MzVcdTA0MzZcdTA0MzBcdTA0NDlcdTA0MzhcdTA0M2NcdTA0MzggXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDQzICJ7MH0iLg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTA0MTRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmOg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZjoNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM5OiB7MH0uDQotDQotIyBEaXNjaXBsaW5lIEdyb3VwaW5nIEVkaXRvciBEaXNjaXBsaW5lcyBQYWdlDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25OYW1lPVx1MDQxNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQ0Yg0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQzMFx1MDQzY1x1MDQzOCwgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDRmXHUwNDQ5XHUwNDM4XHUwNDNjXHUwNDM4IFx1MDQzMiBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDQzIFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZC4NCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQ0YjoNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MTRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0NGI6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZDogezB9Lg0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfVXNlRGVmYXVsdERpcmVjdG9yeUJ1dHRvbkxhYmVsPVx1MDQxOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZQ0KLQ0KLSMgRGlzY2lwbGluZSBFZGl0b3IgVGFza3MgUGFnZQ0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzY1x1MDQzOCwgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDRmXHUwNDQ5XHUwNDM4XHUwNDNjXHUwNDM4IFx1MDQzMiBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDQzLg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzODoNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4Og0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3OiB7MH0uDQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBSZWZlcmVuY2UgV29ya2Zsb3cgUGFnZQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDIxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQzYVx1MDQzOCBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzkNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDNjXHUwNDM4IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOSwgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDRmXHUwNDQ5XHUwNDM4XHUwNDNjXHUwNDM4IFx1MDQzMiBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDQzLg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0NDJcdTA0M2VcdTA0M2FcdTA0MzggXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5Og0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MjFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDNhXHUwNDM4IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOToNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0M2ZcdTA0M2VcdTA0NDJcdTA0M2VcdTA0M2FcdTA0M2VcdTA0MzIgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5OiB7MH0uDQotDQotIyBEb21haW4gRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0M2NcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwXHUwNDNjXHUwNDM4LCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDM0XHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQzLg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGI6DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGI6DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0NDUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDMyOiB7MH0uDQotDQotIyBXb3JrIFByb2R1Y3QgS2luZCBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzY1x1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzBcdTA0M2NcdTA0MzgsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0M2VcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NGZcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0NDJcdTA0MzhcdTA0M2ZcdTA0NDMgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMC4NCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1MDQxNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiOg0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiOg0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzMjogezB9Lg0KLQ0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPVx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2RcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDBcdTA0MzBcdTA0M2NcdTA0MzggXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5LCBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGZcdTA0NDlcdTA0MzhcdTA0M2NcdTA0MzggXHUwNDMyIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NDMgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOS4NCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0Mzk6DQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw9XHUwNDFkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDRiIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOToNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOTogezB9Lg0KLQ0KLSMgUm9sZSBTZXQgRWRpdG9yIFJvbGVzIFBhZ2UNCi1yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVx1MDQyMFx1MDQzZVx1MDQzYlx1MDQzOA0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGZcdTA0M2NcdTA0MzgsIFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQ0Zlx1MDQ0OVx1MDQzOFx1MDQzY1x1MDQzOCBcdTA0MzIgXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkuDQotcm9sZVNldFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTA0MTRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4Og0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0Mzg6DQotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0Mzk6IHswfS4NCi0NCi0jIFRvb2wgRWRpdG9yIFRvb2wgTWVudG9ycyBQYWdlDQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uTmFtZT1cdTA0MjBcdTA0NDNcdTA0M2FcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQzYw0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0NDNcdTA0M2FcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzBcdTA0M2NcdTA0MzggXHUwNDNmXHUwNDNlIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NDMuDQotdG9vbFRvb2xNZW50b3JzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTA0MTRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzZlx1MDQzZSBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2M6DQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWxlY3RlZExhYmVsPVx1MDQyMFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDNjOg0KLXRvb2xUb29sTWVudG9yc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MWFcdTA0M2VcdTA0M2JcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0M2UgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMiBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDNjOiB7MH0uDQotDQotIyBDdXN0b20gQ2F0ZWdvcnkgRWRpdG9yIEFzc2lnbiBQYWdlDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lPVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzINCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2NcdTA0MzggXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyLCBcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0M2NcdTA0MzggXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0ZS4NCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzI6DQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlbGVjdGVkTGFiZWw9XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMjoNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MWFcdTA0M2VcdTA0M2JcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0M2UgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzZVx1MDQzMiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzI6IHswfS4NCi0NCi0jIE5ldyBNZXRob2QgUGx1Zy1pbiBXaXphcmQNCi1uZXdQbHVnaW5XaXphcmRfdGl0bGU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0YyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0PVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYgXHUwNDM4IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzNSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAuDQotbmV3UGx1Z2luRXJyb3JfbXNnPUlVUEEwMDIxRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMC4NCi1uZXdQbHVnaW5FcnJvcl9yZWFzb249XHUwNDEyXHUwNDNkXHUwNDQzXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRmXHUwNDRmIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMC5cblwNCi1cblwNCi1cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuDQotDQotIyBHZW5lcmljIGRpYWxvZyB0aXRsZXMNCi1jcmVhdGVEaWFsb2dfdGl0bGU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mg0KLWRlbGV0ZURpYWxvZ190aXRsZT1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotZWRpdERpYWxvZ190aXRsZT1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotZXJyb3JEaWFsb2dfdGl0bGU9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwDQotbW92ZURpYWxvZ190aXRsZT1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotcmVuYW1lRGlhbG9nX3RpdGxlPVx1MDQxZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDINCi13YXJuaW5nRGlhbG9nX3RpdGxlPVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNlx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLQ0KLSMgQWRkIENvbmZpZ3VyYXRpb24gdG8gUHJvY2VzcyBFcnJvciBEaWFsb2cNCi1hZGRDb25maWdFcnJvckRpYWxvZ190aXRsZT1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzMiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDENCi0NCi0jIFNldCBEZWZhdWx0IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotc2V0RGVmYXVsdENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwDQotDQotIyBFZGl0IFByb2Nlc3MgRXJyb3IgRGlhbG9nDQotZWRpdFByb2Nlc3NFbGVtZW50RXJyb3JEaWFsb2dfdGl0bGU9XHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzANCi0NCi0jIE9wZW4gTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1cdTA0MWVcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RleHQ9XHUwNDIyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDMwXHUwNDRmIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDNkXHUwNDM1IFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzMCBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzAuIFx1MDQxOFx1MDQzM1x1MDQzZFx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0NDMgXHUwNDM4IFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0NDNcdTA0NGUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzPw0KLQ0KLSMgU2F2ZSBMaWJyYXJ5IERpYWxvZw0KLXNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dD1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzMCBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzAuIFx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGY/DQotDQotIyBVcGdyYWRlIExpYnJhcnkgRGlhbG9nDQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGU9XHUwNDFlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi0NCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cNCi1kZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiAnJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2QuIFx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDM4XHUwNDM3ICcnezF9Jyc/DQotDQotIyBFcnJvciBNZXNzYWdlcw0KLW5vT3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDBFOiBcdTA0MWRcdTA0MzVcdTA0NDIgXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuXG5cDQotXG5cDQotXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNjXHUwNDNlIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLlxuXA0KLVxuXA0KLVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUuDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZz1JVVBBMDAwMUU6IFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDM4XHUwNDNjXHUwNDRmIHswfS5cblwNCi1cblwNCi1cdTA0MTJcdTA0NDFcdTA0MzVcdTA0M2MgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDNjIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyIFx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzZFx1MDQ0YiBcdTA0MzFcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM1XHUwNDNkXHUwNDRiIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzMC5cblwNCi1cblwNCi1cdTA0MWRcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNkXHUwNDNlXHUwNDNmXHUwNDNhXHUwNDQzIE9LIFx1MDQzOCBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDM1IFx1MDQzOFx1MDQzY1x1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAuDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFOiBcdTA0MThcdTA0M2NcdTA0NGYgJyd7MH0nJyBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyLlxuXA0KLVxuXA0KLVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM1XHUwNDNkIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0M2RcdTA0MzhcdTA0M2FcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmLlxuXA0KLVxuXA0KLVx1MDQxZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgT0sgXHUwNDM4IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAuDQotY3JlYXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDAzRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMC4NCi1kZWxldGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDRXOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLg0KLWludGVybmFsRXJyb3JfbXNnPUlVUEEwMDA1RTogXHUwNDEyXHUwNDNkXHUwNDQzXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRmXHUwNDRmIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMC5cblwNCi1cblwNCi1cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuDQotaW52YWxpZFByZXNlbnRhdGlvbk5hbWVFcnJvcl9tc2c9SVVQQTAwMDZFOiBcdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDNkXHUwNDM1XHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQzOFx1MDQzY1x1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuIFxuXA0KLVxuXA0KLVx1MDQxZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgT0sgXHUwNDM4IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmLg0KLWludmFsaWRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDdFOiBcdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCAnJ3swfScnIFx1MDQzZFx1MDQzNSBcdTA0NGZcdTA0MzJcdTA0M2JcdTA0NGZcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDNjXHUwNDNkXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNlXHUwNDNjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZS4gXG5cDQotXG5cDQotXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQ0Nlx1MDQzNVx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAgXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNjXHUwNDNlLCBcdTA0NDdcdTA0NDJcdTA0M2VcdTA0MzFcdTA0NGIgXHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlIFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzMCBcdTA0M2RcdTA0MzBcdTA0MzRcdTA0M2NcdTA0M2RcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0M2VcdTA0M2MgXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQ0NSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzksIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0NDEgXHUwNDNkXHUwNDM4XHUwNDNjLiBcblwNCi1cblwNCi1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDQzXHUwNDRlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDMyXHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0YiBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzMiBcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlLg0KLXNldERlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDhFOiBcdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCAnJ3swfScnIFx1MDQzZFx1MDQzNSBcdTA0NGZcdTA0MzJcdTA0M2JcdTA0NGZcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNkXHUwNDMwXHUwNDM0XHUwNDNjXHUwNDNkXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNlXHUwNDNjIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQ0NSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzksIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0NDEgIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzZVx1MDQzYy4gXG5cDQotXG5cDQotXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQ0Nlx1MDQzNVx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAgXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNjXHUwNDNlLCBcdTA0NDdcdTA0NDJcdTA0M2VcdTA0MzFcdTA0NGIgXHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlIFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzMCBcdTA0M2RcdTA0MzBcdTA0MzRcdTA0M2NcdTA0M2RcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0M2VcdTA0M2MgXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQ0NSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzksIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0NDEgXHUwNDNkXHUwNDM4XHUwNDNjLiBcblwNCi1cblwNCi1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDQzXHUwNDRlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0YiBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlLg0KLW9wZW5MaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDA5RTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi5cblwNCi1cblwNCi1cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuDQotc2F2ZUxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTBFOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLg0KLXNhdmVMaWJyYXJ5VG9FcnJvcl9tc2c9SVVQQTAwMTBFOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzMiAnJ3swfScnLg0KLWVsZW1lbnRBbHJlYWR5RGVsZXRlZEVycm9yX21zZz1JVVBBMDAxMUU6IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiAnJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2QuDQotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTJFOiBcdTA0MWRcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2UgXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuDQotDQotIyBFcnJvciBSZWFzb25zDQotZXJyb3JfcmVhc29uPUlVUEEwMDE2RTogXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDQ4XHUwNDNiXHUwNDMwIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMC5cblwNCi1cblwNCi1cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuDQotaW50ZXJuYWxFcnJvcl9yZWFzb249SVVQQTAwMTdFOiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzhcdTA0MzdcdTA0M2VcdTA0NDhcdTA0M2JcdTA0MzAgXHUwNDMyXHUwNDNkXHUwNDQzXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRmXHUwNDRmIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMC5cblwNCi1cblwNCi1cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuDQotdXBncmFkZUxpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMThFOiBcdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzYVx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4gXG5cDQotXG5cDQotXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLXNhdmVVcGdyYWRlZExpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMTlFOiBcdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4gXG5cDQotXG5cDQotXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1cdTA0MWVcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4uLg0KLXNhdmluZ0xpYnJhcnlUYXNrX25hbWU9XHUwNDIxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuLi4NCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLi4uDQotbG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2tfbmFtZT1cdTA0MTdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0M2FcdTA0MzAgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuLi4NCi1zYXZpbmdVcGdyYWRlZEVsZW1lbnRzVGFza19uYW1lPVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0MzIgXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDNjIFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNS4uLg0KLXNhdmluZ1Rhc2tfbmFtZT1cdTA0MjFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgJyd7MH0nJy4uLg0KLXNhdmluZ0ZpbGVzVGFza19uYW1lPVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzIuLi4NCi1maXhpbmdDb250ZW50RGVzY3JpcHRpb25HVUlEc1Rhc2tfbmFtZT1cdTA0MThcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgR1VJRCBcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyLi4uDQotZGVsZXRpbmdJbnZhbGlkUmVmZXJlbmNlc1Rhc2tfbmFtZT1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNkXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDQ1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzZVx1MDQzYS4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IFx1MDQyZFx1MDQ0Mlx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzVcdTA0M2FcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNmXHUwNDNlXHUwNDM3XHUwNDMyXHUwNDNlXHUwNDNiXHUwNDRmXHUwNDM1XHUwNDQyIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0MzIgXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1IEhUTUwuIFx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzIgXHUwNDNkXHUwNDM1XHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0M2RcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2UuDQotDQotIyBDaGFuZ2UgSGlzdG9yeSBEaWFsb2cNCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX3RpdGxlPVx1MDQyNVx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzZVx1MDQzYlx1MDQzZVx1MDQzM1x1MDQzOFx1MDQ0ZiBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM5DQotQ2hhbmdlSGlzdG9yeURpYWxvZ19sYWJlbD1cdTA0MjVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzNcdTA0MzhcdTA0NGYgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5Og0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVsZXRlIEFjdGlvbg0KLWNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU9XHUwNDFmXHUwNDNlXHUwNDM0XHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnPVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyAnJ3swfScnPw0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnV2l0aFJlZmVyZW5jZT1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgJyd7MH0nJz9cblwNCi1cblwNCi1cdTA0MjFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzkgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQ0MVx1MDQzZVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQ0MiBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDNkXHUwNDMwIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQ0Zlx1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGI6IHsxfQ0KLQ0KLSMgTmV3IExpYnJhcnkgRGlhbG9nDQotZXJyb3JEaWFsb2dfbWVzc2FnZT1JVVBBMDAyMkU6IFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgJyd7MH0nJy4NCi1lcnJvckRpYWxvZ19lcnJvcj1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQ0ZiBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDNkXHUwNDQzXHUwNDQyXHUwNDQwXHUwNDM4IFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLg0KLWVycl9ub29wZW5saWJyYXJ5PUlVUEEwMDQwRTogXHUwNDFkXHUwNDM1XHUwNDQyIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLlxuXA0KLVxuXA0KLVx1MDQxNFx1MDQzYlx1MDQ0ZiBcdTA0MzRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRmIFx1MDQzZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzY1x1MDQzZSBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi5cblwNCi1cblwNCi1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlLg0KLWVycl9sb2FkaW5nbGlicmFyeT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNhXHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOA0KLW1zZ19yZWxvYWRMaWJyYXJ5PVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDNlXHUwNDQyXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1IFx1MDQzZFx1MDQzNVx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzMlx1MDQ0OFx1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0ZiBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLiBcdTA0MWRcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2NcdTA0M2UgXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0M1x1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLiANCi0jIFJlbG9hZCBMaWJyYXJ5IERpYWxvZw0KLXJlbG9hZERpYWxvZ19tZXNzYWdlPVx1MDQxZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzMlx1MDQzZVx1MDQ0MVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzVcdTA0MzUgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQ0MVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQ0Zlx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1yZWxvYWREaWFsb2dfdGl0bGU9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0Mw0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0NDlcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JNZXNzYWdlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM4DQotDQotIyBQcm9jZXNzIEZvcm0gRWRpdG9yDQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX3RpdGxlPVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMT1cdTA0MmRcdTA0NDJcdTA0M2UgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzOFx1MDQ0Zlx1MDQzNVx1MDQ0MiBcdTA0M2RcdTA0MzAgXHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0YiBcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDM1LiBcdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDMyIFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzNSBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDRiLiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGM/DQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UyPVx1MDQxOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzIgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM1IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NGIuIFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQ0Yz8NCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBQYWdlDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPVx1MDQxZlx1MDQzZVx1MDQzNFx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfbWVzc2FnZT1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1ICcnezB9Jyc/DQotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX3RpdGxlPVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNlx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb249XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmOg0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3cz1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotY29uZmlnVmlld1BhZ2Vfdmlld3M9XHUwNDFmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotY29sdW1uc2VsZWN0aW9uX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwIFx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQzMVx1MDQ0Nlx1MDQzMDoNCi1jb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dD1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1Li4uDQotY29uZmlnVmlld1BhZ2VfcmVtb3ZlVmlld0J1dHRvblRleHQ9XHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLWNvbmZpZ1ZpZXdQYWdlX21ha2VEZWZhdWx0QnV0dG9uVGV4dD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZQ0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlPUlVUEEwMDIzVzogXHUwNDFmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MSBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2MgJyd7MH0nJyBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyLg0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvblRpdGxlPVx1MDQxZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNkXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDMzXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uTWVzc2FnZT1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQzMlx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0MzIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguIFx1MDQxNFx1MDQzYlx1MDQ0ZiBcdTA0NDJcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDQ3XHUwNDQyXHUwNDNlXHUwNDMxXHUwNDRiIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUsIFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NDNcdTA0NGUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDRlIFx1MDQzMiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguIFx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NGYgXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDQyIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNVx1MDQzYywgXHUwNDMwIFx1MDQzNVx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzggXHUwNDM4IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgLSBcdTA0M2JcdTA0MzhcdTA0NDFcdTA0NDJcdTA0NGNcdTA0NGZcdTA0M2NcdTA0MzggXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM1XHUwNDMyXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi0NCi0jIERlc2NyaXB0aW9uIFRhYg0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX3RpdGxlPVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUNCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMT1JVVBBMDA0MFc6IFx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDMyIFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzNS4NCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMj1cdTA0MWRcdTA0MzVcdTA0NDIgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5LCBcdTA0NDFcdTA0M2VcdTA0MzJcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0NDUgXHUwNDQxIFx1MDQ0ZFx1MDQ0Mlx1MDQzOFx1MDQzYyBcdTA0NDJcdTA0MzhcdTA0M2ZcdTA0M2VcdTA0M2MuDQotDQotY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZT1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlDQotIyBBc3NvY2lhdGlvbiBGb3JtIFBhZ2UNCi1Bc3NvY2lhdGlvbkZvcm1QYWdlX0JyaWVmRGVzY3JpcHRpb25MYWJlbD1cdTA0MWFcdTA0NDBcdTA0MzBcdTA0NDJcdTA0M2FcdTA0M2VcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzA6DQotDQotIyBNZXRob2QgRWxlbWVudCBEZXNjcmlwdGlvbg0KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ190aXRsZT1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMA0KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ19tZXNzYWdlPVx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0M2RcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0NGJcdTA0M2MuDQotDQotIyBNZXRob2QgUGx1Zy1pbiBEZXNjcmlwdGlvbg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUmVtb3ZlUmVmQ29uZmlybV9tZXNzYWdlPVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzVcdTA0MzkgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRmICcnezB9JycgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzY1x1MDQzOCBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGZcdTA0M2NcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzYSBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2RcdTA0MzhcdTA0M2FcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGUgXHUwNDNkXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDQ1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzZVx1MDQzYSwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0NGIuXG5cDQotXG5cDQotXHUwNDJkXHUwNDQyXHUwNDNlIFx1MDQzNFx1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzOFx1MDQzNSBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NGYgXHUwNDNlXHUwNDQyXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjLiBcdTA0MTJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDQyXHUwNDQzIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZT8NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZT1cdTA0MThcdTA0M2NcdTA0NGYgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRmIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDNlIFx1MDQ0MSAnJ3swfScnIFx1MDQzZFx1MDQzMCAnJ3sxfScnLiBcdTA0MWZcdTA0NDBcdTA0MzggXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzIgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM1IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NGIsIFx1MDQzMCBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzMC4gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDRjPw0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lX3RpdGxlPVx1MDQxZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2Nhbm5vdFJlbmFtZVBsdWdpbkZvbGRlcj1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5MYWJlbD1cdTA0MTdcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2FcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5fbWVzc2FnZT1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNhXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0M2EgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRlIFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRiXHUwNDQ1IFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzMiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIsIFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzZFx1MDQzMFx1MDQzNFx1MDQzYlx1MDQzNVx1MDQzNlx1MDQzMFx1MDQ0OVx1MDQzOFx1MDQ0NSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGUgJyd7MH0nJy4gXHUwNDEyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0ZFx1MDQ0Mlx1MDQ0MyBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGU/DQotDQotIyBQcm9jZXNzIERlc2NyaXB0aW9uDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fdGl0bGU9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZT1cdTA0MThcdTA0M2NcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2UuIFx1MDQyMVx1MDQzZVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzAgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzZSwgXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYyBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzAuIFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQ0Yz8NCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbkRlc2NyaXB0aW9uPVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNToNCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25UaXRsZT1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzJcdTA0NDFcdTA0MzUgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAuIFx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzMFx1MDQ0ZiBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRmXHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzZlx1MDQzZSBcdTA0NDNcdTA0M2NcdTA0M2VcdTA0M2JcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUuIFx1MDQyZFx1MDQ0Mlx1MDQzMCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDNkXHUwNDMwIFx1MDQ0MVx1MDQzZVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NDFcdTA0MzUgXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbnM9XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Og0KLXByb2Nlc3NEZXNjcmlwdGlvbl9kZWZhdWx0PShcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlKQ0KLVByb2Nlc3NEZXNjcmlwdGlvbl9zZWxlY3RDb25maWd1cmF0aW9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQwPVx1MDQxOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzIgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM1IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDM4IFx1MDQzMlx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQ0Zlx1MDQ0MiBcdTA0MzIgXHUwNDQxXHUwNDM4XHUwNDNiXHUwNDQzLiBcdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgJyd7MH0nJz8NCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX3NlbGVjdERlc2NyaXB0b3JzVG9EZWxldGU9XHUwNDFmXHUwNDNlXHUwNDQxXHUwNDNiXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDMxXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM1IFx1MDQzZFx1MDQzOFx1MDQzM1x1MDQzNFx1MDQzNSBcdTA0M2RcdTA0MzUgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDQzXHUwNDRlXHUwNDQyXHUwNDQxXHUwNDRmLlxuXA0KLVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi0NCi0jIFZpZXcgSGVscGVyDQotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX3RpdGxlPVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzYVx1MDQzMCBcdTA0NDZcdTA0MzVcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzggXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4DQotdmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2s9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNhXHUwNDMwIFx1MDQ0Nlx1MDQzNVx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzguLi4NCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZT1cdTA0MjZcdTA0MzVcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzZFx1MDQzMC4gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDJcdTA0M2VcdTA0M2FcdTA0M2VcdTA0M2JcdTA0MzAuDQotDQotIyBBdHRhY2ggVGVtcGxhdGUgRmlsZSBEaWFsb2cNCi1hdHRhY2hUZW1wbGF0ZUZpbGVEaWFsb2dfdGl0bGU9XHUwNDEyXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0MzANCi0NCi0jIENyZWF0ZSBFbGVtZW50IEVycm9yIERpYWxvZw0KLWNyZWF0ZUVsZW1lbnREaWFsb2dfdGl0bGU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIHswfQ0KLWNyZWF0ZU5ld0VsZW1lbnRFcnJvcl9tc2c9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggezB9Lg0KLQ0KLWRsZ1RpdGxlX3JlbG9hZExpYnJhcnk9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0Mw0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9yZWFzb249XHUwNDE4XHUwNDNjXHUwNDRmIHswfSBcdTA0M2RcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0NGJcdTA0M2MuXG5cDQotXG5cDQotXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUuDQotZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uPVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDQxIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzZVx1MDQzYyAnJ3swfScnDQotDQotIyBDaGFuZ2VCb3VuZHNDb21tYW5kDQotZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw9XHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Nlx1MDQ0Yg0KLSMgQ2hhbmdlTmFtZUNvbW1hbmQNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw9XHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzY1x1MDQ0Zg0KLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF91bmRvTWVzc2FnZT1cdTA0MWRcdTA0MzVcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NGYgXHUwNDNlXHUwNDQyXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzguXG5cDQotXG5cDQotXHUwNDFkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzZVx1MDQ0Mlx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUsIFx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQ0MyBcdTA0M2RcdTA0MzUgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNlx1MDQzZFx1MDQzNVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuDQotIyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZA0KLWdlZl9jaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZF9sYWJlbD1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzZVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMA0KLSMgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZA0KLWdlZl9jcmVhdGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzVcdTA0M2NcdTA0NDNcdTA0M2MNCi0jIENyZWF0ZUxpbmtDb21tYW5kDQotZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzgNCi0jIENyZWF0ZU5vZGVDb21tYW5kDQotZ2VmX2NyZWF0ZU5vZGVDb21tYW5kX2xhYmVsPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M2INCi0jIERlbGV0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfZGVsZXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDNjXHUwNDQzXHUwNDNjDQotIyBEZWxldGVDb21tYW5kDQotZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw9XHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDRjDQotIyBEZWxldGVMaW5rQ29tbWFuZA0KLWdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbD1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1DQotIyBNb3ZlQmVuZHBvaW50Q29tbWFuZA0KLWdlZl9tb3ZlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDNjXHUwNDQzXHUwNDNjDQotIyBSZWNvbm5lY3RMaW5rQ29tbWFuZA0KLWdlZl9yZWNvbm5lY3RMaW5rQ29tbWFuZF9sYWJlbD1cdTA0MTdcdTA0MzBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2UgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQ0Yw0KLQ0KLSMgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyDQotZ2VmX3ZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQ0Ylx1MDQzYy4gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuDQotIyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQ0Ylx1MDQzYy4gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuDQotIyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydA0KLWdlZl93b3JrUHJvZHVjdE5vZGVFZGl0UGFydF92YWxpZGF0ZU1lc3NhZ2U9XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQ0Ylx1MDQzYy4gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuDQotDQotIyBFbGVtZW50c1ZpZXdEZWxldGVBY3Rpb24NCi1hY3Rpb25zX0VsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbl9tZXNzYWdlPVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiAnJ3swfScnIFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0M2MgJyd7MX0nJyBcdTA0MzggXHUwNDNkXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNlx1MDQzNVx1MDQ0MiBcdTA0MzFcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDMwLg0KLQ0KLSMgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JUaXRsZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JNZXNzYWdlPVx1MDQxZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzMFx1MDQ0Mlx1MDQ0Ylx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzY1x1MDQzMFx1MDQ0ZiBcdTA0MzhcdTA0NDFcdTA0M2FcdTA0M2JcdTA0NGVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDQzXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JSZWFzb249XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLQ0KLSMgTWV0aG9kRWxlbWVudEVkaXRvcg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOA0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMT1JVVBBMDAyMEU6IFx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM4IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzMA0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMj1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDQ0XHUwNDM4XHUwNDNhXHUwNDQxXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjE9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDMyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDJcdTA0M2VcdTA0M2FcdTA0M2VcdTA0M2JcdTA0MzANCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMj1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yTXNnPVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIsIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0Ylx1MDQzNSBcdTA0MzIgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM1LiBcdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzN1x1MDQzMFx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mi4NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvclRpdGxlPVx1MDQxZFx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0NDFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NGZcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDMwDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yTWVzc2FnZTE9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDNlXHUwNDMyICcnezB9JycNCi0NCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1yZW5hbWVFcnJvcl90aXRsZT1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotcmVuYW1lRXJyb3JfbXNnPUlVUEEwMDEzRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1TZWxlY3RFbGVtZW50RGlhbG9nX3NlbGVjdGVsZW1lbnRfdGV4dD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotDQotIyBFZGl0b3JDaG9vc2VyDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3RpdGxlPVx1MDQxZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZXNjcmlwdGlvbkxhYmVsPVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNToNCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWw9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MVx1MDQzNQ0KLU9wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGVfZWRpdF90ZXh0MD1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNFOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfSWNvbkZpbGVDaG9vc2VyRGlhbG9nX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeU5hbWU9XHUwNDFkXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDRmIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzMA0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZXNjcmlwdGlvbkxhYmVsPVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNToNCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCBcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQxM1x1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQzMlx1MDQzZSwgXHUwNDQ3XHUwNDQyXHUwNDNlXHUwNDMxXHUwNDRiIFx1MDQzOFx1MDQ0NSBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMuDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX0Rlc2VsZWN0QWxsQnV0dG9uTGFiZWw9XHUwNDFlXHUwNDQyXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQzZVx1MDQ0MCBcdTA0MzJcdTA0NDFcdTA0MzVcdTA0NDUNCi1FbGVtZW50c1ZpZXdfbWlncmF0aW9uX2Rpcl9kbGdfZGVzY3JpcHRpb25fdGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzZFx1MDQzNVx1MDQ0MVx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAgezB9IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMCB7MH0NCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPVx1MDQyMVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzY1x1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAuIFx1MDQxNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzAgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2RcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNkXHUwNDNlXHUwNDNmXHUwNDNhXHUwNDQzIFx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi5cblwNCi1cblwNCi1cdTA0MTdcdTA0MzBcdTA0M2FcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDNkXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzOFx1MDQzNyBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGJcdTA0NDUgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlLg0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU9XHUwNDFkXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDM1IFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzFFOiBcdTA0MjBcdTA0MzBcdTA0MzdcdTA0M2NcdTA0MzVcdTA0NDAgXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmICcnezB9JycgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDMyXHUwNDRiXHUwNDQ4XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQ0Ylx1MDQzOSAoezF9IFx1MDQzZFx1MDQzMCB7Mn0pLiBcdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDM1IFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNS4NCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGU9XHUwNDFkXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDM1IFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMkU6IFx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgJyd7MH0nJyBcdTA0M2RcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyLiBcdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDM1IFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNS4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDRjLi4uDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uPVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX0RlZmF1bHRCcmllZkRlc2NyaXB0aW9uPVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VEZXNjcmlwdGlvbj1cdTA0MTdcdTA0MzBcdTA0M2FcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Yi4gXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzYlx1MDQzMCBcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0NDJcdTA0NDBcdTA0MzVcdTA0MzFcdTA0NDNcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjLg0KLQ0KLSMgVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2UNCi1mb3Jtc19UZW1wbGF0ZURlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQzMlx1MDQzYlx1MDQzZVx1MDQzNlx1MDQzNVx1MDQzZCBcdTA0MzIgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDQyIFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZC4NCi0NCi0jIE5ldyBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLW5ld0xpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24xPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0M2RcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzYSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIC0gJyd7MH0nJy4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMj1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDMyICcnezB9JycuDQotbmV3TGlicmFyeUVycm9yX3JlYXNvbjM9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDMwXHUwNDNmXHUwNDNhXHUwNDQzICcnezB9JycgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuDQotbmV3TGlicmFyeUVycm9yX2FkdmljZT1cdTA0MWRcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgT0sgXHUwNDM4IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0M2ZcdTA0NDNcdTA0NDJcdTA0NGMgXHUwNDNhIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNS4NCi0NCi0jUHJvY2VzcyBsaXRlcmFscw0KLVByb2Nlc3NfRXh0ZXJuYWxJRD1cdTA0MTJcdTA0M2RcdTA0MzVcdTA0NDhcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDE4XHUwNDE0Og0KLVByb2Nlc3NfUHVycG9zZT1cdTA0MWRcdTA0MzBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzU6DQotUHJvY2Vzc19TY29wZT1cdTA0MWVcdTA0MzFcdTA0M2JcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NGM6DQotUHJvY2Vzc19Vc2FnZU5vdGVzPVx1MDQxN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlOg0KLVByb2Nlc3NfQWx0ZXJuYXRpdmVzPVx1MDQxMFx1MDQzYlx1MDQ0Y1x1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzZFx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQzMlx1MDQ0YjoNCi1Qcm9jZXNzX0hvd1RvU3RhZmY9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDNiOg0KLVByb2Nlc3NfS2V5Q29uc2lkZXJhdGlvbj1cdTA0MWVcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDM3XHUwNDMwXHUwNDNjXHUwNDM1XHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmOg0KLVByb2Nlc3NfU2NhbGU9XHUwNDFjXHUwNDMwXHUwNDQxXHUwNDQ4XHUwNDQyXHUwNDMwXHUwNDMxOg0KLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1cdTA0MjVcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDMwOg0KLVByb2Nlc3NfUmlza0xldmVsPVx1MDQyM1x1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzNVx1MDQzZFx1MDQ0YyBcdTA0NDBcdTA0MzhcdTA0NDFcdTA0M2FcdTA0MzA6DQotUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlPVx1MDQxY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzYVx1MDQzMCBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0Mzg6DQotUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPVx1MDQxYVx1MDQzMlx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0NDNcdTA0NDdcdTA0MzBcdTA0NDFcdTA0NDJcdTA0M2RcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDMwOg0KLVByb2Nlc3NfVHlwZU9mQ29udHJhY3Q9XHUwNDIyXHUwNDM4XHUwNDNmIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzMDoNCi0NCi0jIEVkaXRvciBQcmV2aWV3IE5hdmlnYXRpb24gQnV0dG9ucw0KLWJhY2tCdXR0b25fdGV4dD1cdTA0MWRcdTA0MzBcdTA0MzdcdTA0MzBcdTA0MzQNCi1mb3J3YXJkQnV0dG9uX3RleHQ9XHUwNDEyXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM0DQotZm9yd2FyZF90ZXh0PVx1MDQxMlx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNA0KLXN0b3BCdXR0b25fdGV4dD1cdTA0MjFcdTA0NDJcdTA0M2VcdTA0M2YNCi1yZWZyZXNoQnV0dG9uX3RleHQ9XHUwNDFlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjDQotcmVmcmVzaF90ZXh0PVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLW5ld25hbWVfdGV4dD1cdTA0MWRcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmOg0KLXByaW50QnV0dG9uX3RleHQ9XHUwNDFmXHUwNDM1XHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDRjDQotDQotIyBDb250ZXh0IG1lbnVzDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPSZcdTA0MWVcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMNCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT0mXHUwNDFmXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzMlx1MDQzZVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMA0KLQ0KLV9VSV9NZXRob2RFZGl0b3JfbWVudT0mXHUwNDIwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jlx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0Yw0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgJlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZFx1MDQzZVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDINCi0NCi1fVUlfU2VsZWN0aW9uUGFnZV9sYWJlbD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0M2VcdTA0NDANCi1fVUlfUGFyZW50UGFnZV9sYWJlbD1cdTA0MjBcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzkNCi1fVUlfTGlzdFBhZ2VfbGFiZWw9XHUwNDIxXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDNlXHUwNDNhDQotX1VJX1RyZWVQYWdlX2xhYmVsPVx1MDQxNFx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzMlx1MDQzZQ0KLV9VSV9UYWJsZVBhZ2VfbGFiZWw9XHUwNDIyXHUwNDMwXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDQ2XHUwNDMwDQotX1VJX1RhYmxlVHJlZVBhZ2VfbGFiZWw9XHUwNDE0XHUwNDM1XHUwNDQwXHUwNDM1XHUwNDMyXHUwNDNlDQotX1VJX09iamVjdENvbHVtbl9sYWJlbD1cdTA0MWVcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDINCi1fVUlfU2VsZkNvbHVtbl9sYWJlbD1cdTA0MjJcdTA0MzVcdTA0M2FcdTA0NDNcdTA0NDlcdTA0MzhcdTA0MzkgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyDQotDQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9XHUwNDFkXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZFx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UNCi1fVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0MjogezB9DQotX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzMjogezB9DQotDQotX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbD1cdTA0MWVcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwDQotDQotX1VJX1dpemFyZF9jYXRlZ29yeT1cdTA0MWNcdTA0MzBcdTA0NDFcdTA0NDJcdTA0MzVcdTA0NDBcdTA0NGIgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0MFx1MDQzZVx1MDQzMiBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzkgRU1GDQotDQotX1VJX01ldGhvZE1vZGVsV2l6YXJkX2xhYmVsPVx1MDQxY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQ0YyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfZGVzY3JpcHRpb249XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQ0YyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi0NCi1fVUlfTWV0aG9kRWRpdG9yX2xhYmVsPVx1MDQyMFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzkgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotDQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2U9XHUwNDFjXHUwNDNlXHUwNDM5DQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9uPVx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNA0KLQ0KLV9VSV9XaXphcmRfbGFiZWw9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjDQotDQotX1dBUk5fRmlsZW5hbWVFeHRlbnNpb249XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0M2RcdTA0M2UgXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDNkXHUwNDQ3XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzZFx1MDQzMCAnJy57MH0nJw0KLQ0KLV9VSV9Nb2RlbE9iamVjdD1cdTA0MWVcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDIgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM4DQotX1VJX1hNTEVuY29kaW5nPVx1MDQxYVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzYVx1MDQzMCBYTUwNCi1fVUlfWE1MRW5jb2RpbmdDaG9pY2VzPVVURi04IEFTQ0lJIFVURi0xNiBVVEYtMTZCRSBVVEYtMTZMRSBJU08tODg1OS0xDQotX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNjXHUwNDRiXHUwNDM5IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0MiBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzgNCi0NCi1fVUlfRmlsZUNvbmZsaWN0X2xhYmVsPVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzYlx1MDQzOFx1MDQzYVx1MDQ0MiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzINCi1fV0FSTl9GaWxlQ29uZmxpY3Q9XHUwNDFlXHUwNDMxXHUwNDNkXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDRiIFx1MDQzZFx1MDQzNVx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYsIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzYlx1MDQzOFx1MDQzYVx1MDQ0Mlx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDEgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmXHUwNDNjXHUwNDM4LCBcdTA0MzJcdTA0M2RcdTA0MzVcdTA0NDFcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0M2NcdTA0MzggXHUwNDMyXHUwNDNkXHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzMC4gXHUwNDFlXHUwNDQyXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDMyXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzMiBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzU/DQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1hZGRMaW5rRGlhbG9nX2xpbmtUeXBlPVx1MDQyMlx1MDQzOFx1MDQzZjoNCi1vcGVuTGlua0NoZWNrYm94X3RleHQ9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQ0MyBcdTA0MzIgXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDNjIFx1MDQzZVx1MDQzYVx1MDQzZFx1MDQzNQ0KLQ0KLSMgQWRkIEltYWdlIERpYWxvZw0KLWhlaWdodExhYmVsX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDQxXHUwNDNlXHUwNDQyXHUwNDMwOg0KLXdpZHRoTGFiZWxfdGV4dD1cdTA0MjhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M2RcdTA0MzA6DQotRWxlbWVudHNWaWV3XzIwPVx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZCBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkNCi1FbGVtZW50c1ZpZXdfMjE9XHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzOA0KLUVsZW1lbnRzVmlld18yMj1cdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDENCi1FbGVtZW50c1ZpZXdfMzU9ezB9IFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzNVx1MDQzZCBcdTA0NDJcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0N1x1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2RcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2NcdTA0M2UgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDQwXHUwNDM1XHUwNDQ4XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzN1x1MDQzMFx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQ0Yy4NCi1FbGVtZW50c1ZpZXdfMzY9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzYVx1MDQzOCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzgNCi1hbHRUYWdMYWJlbF90ZXh0PVx1MDQyMlx1MDQzNVx1MDQzMyBBTFQ6DQotaW1hZ2VTaXplTGFiZWxfdGV4dD1cdTA0MjhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M2RcdTA0MzAgXHUwNDM4IFx1MDQzMlx1MDQ0Ylx1MDQ0MVx1MDQzZVx1MDQ0Mlx1MDQzMCBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDNkXHUwNDRiIFx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQ1IFx1MDQzZVx1MDQ0MiAxMCBcdTA0MzRcdTA0M2UgNjAwLiBcdTA0MWRcdTA0MzVcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNkXHUwNDMwIFx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0NDFcdTA0M2VcdTA0NDJcdTA0MzAgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0MzIgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDM5IFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQ0MC4NCi0NCi0jIFByb2Nlc3MgRWRpdG9yDQotUHJvY2Vzc0VkaXRvcj1cdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyDQotUHJvY2Vzc0VkaXRvcl9OYW1lPVx1MDQxOFx1MDQzY1x1MDQ0Zg0KLVByb2Nlc3NFZGl0b3JfUHJlc2VudGF0aW9uTmFtZT1cdTA0MThcdTA0M2NcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotUHJvY2Vzc0VkaXRvcl9JbmRleD1cdTA0MThcdTA0M2RcdTA0MzRcdTA0MzVcdTA0M2FcdTA0NDENCi1Qcm9jZXNzRWRpdG9yX1ByZWRlY2Vzc29ycz1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDhcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0MzhcdTA0M2FcdTA0MzgNCi0jQ29uZmlndXJhdGlvblBhZ2VfU2VsZWN0ZWQ9U2VsZWN0ZWQ6IA0KLUNoZWNrbGlzdE9yZGVyX2Rlc2NyaXB0aW9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDM4IFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDQxIFx1MDQzZlx1MDQzZVx1MDQzY1x1MDQzZVx1MDQ0OVx1MDQ0Y1x1MDQ0ZSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2EgXHUwNDEyXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQ1IFx1MDQzOCBcdTA0MTJcdTA0M2RcdTA0MzhcdTA0MzcuDQotRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQ9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1Li4uDQotUHJvY2Vzc0VkaXRvcl9Nb2RlbEluZm89XHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzgNCi1Qcm9jZXNzRWRpdG9yX1ByZWZpeD1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0NDRcdTA0MzhcdTA0M2FcdTA0NDENCi1Nb3ZlRGlhbG9nX21vdmVfdGV4dD1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzhcdTA0NDJcdTA0NGMNCi1DaGVja2xpc3RPcmRlcl90aXRsZT1cdTA0MjNcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NGZcdTA0MzRcdTA0M2VcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQ0Yg0KLVByb2Nlc3NFZGl0b3JfUmVwZXRhYmxlPVx1MDQxZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Zlx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzOVx1MDQ0MVx1MDQ0Zg0KLVByb2Nlc3NFZGl0b3JfT25nb2luZz1cdTA0MTJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0NGZcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzlcdTA0NDFcdTA0NGYNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TeW5jaHJvbml6YXRpb249XHUwNDIxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjLi4uDQotUHJvY2Vzc0VkaXRvcl9FdmVudERyaXZlbj1cdTA0MjNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0NGZcdTA0MzVcdTA0M2NcdTA0NGJcdTA0MzkgXHUwNDQxXHUwNDNlXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDM4XHUwNDRmXHUwNDNjXHUwNDM4DQotUHJvY2Vzc0VkaXRvcl9EZWxpdmVyYWJsZT1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyDQotUHJvY2Vzc0VkaXRvcl9PcHRpb25hbD1cdTA0MWRcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzkNCi1GaWx0ZXJEaWFsb2dfVHlwZV90ZXh0PVx1MDQyMlx1MDQzOFx1MDQzZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwOg0KLUZpbHRlckRpYWxvZ19FeHBhbmRBbGw9XHUwNDIwXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNkXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MVx1MDQzNQ0KLU1vdmVEaWFsb2dfbW92aW5nX3RleHQ9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1Li4uDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uV2FybmluZz1JVVBBMDAyNVc6IFx1MDQxN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzZVx1MDQzYSBcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0NGIgXHUwNDM0XHUwNDNiXHUwNDRmIHswfSBcdTA0M2RcdTA0MzUgXHUwNDNkXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNkIFx1MDQzMiBcdTA0M2ZcdTA0NDNcdTA0NDJcdTA0Mzg6IHsxfQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yPUlVUEEwMDI1RTogXHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzMiBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNhXHUwNDMwIFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQ0YjogezB9DQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9OYW1lTGFiZWw9XHUwNDE4XHUwNDNjXHUwNDRmOg0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfTmFtZUxhYmVsPVx1MDQxOFx1MDQzY1x1MDQ0ZjoNCi1BdXRob3JpbmdVSVBsdWdpbl9uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VUaXRsZT1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLW5ld0xpYnJhcnlXaXphcmRfdGl0bGU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZVRpdGxlPVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdMaWJyYXJ5TWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYsIFx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzggXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzOSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb249XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCBcdTA0MzFcdTA0NGJcdTA0M2JcdTA0MzggXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDRiLiBcdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzNyBcdTA0M2RcdTA0MzhcdTA0NDUsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0NDJcdTA0NDBcdTA0MzVcdTA0MzFcdTA0NDNcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjLg0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPVx1MDQxZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25XaXphcmRfd2luZG93VGl0bGU9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1FbGVtZW50c1ZpZXdfcmVwbGFjZWluZ3dpdGhmb3JtYXRfdGV4dD1cdTA0MTdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzAgezB9Li4uDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25XYXJuaW5nPUlVUEEwMDI2VzogXHUwNDE3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNlXHUwNDNhIFx1MDQ0M1x1MDQzN1x1MDQzYlx1MDQzMCBcdTA0MzRcdTA0M2JcdTA0NGYgezB9IFx1MDQzZFx1MDQzNSBcdTA0M2RcdTA0MzBcdTA0MzlcdTA0MzRcdTA0MzVcdTA0M2QgXHUwNDMyIFx1MDQzZlx1MDQ0M1x1MDQ0Mlx1MDQzODogezF9DQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfdW5zZWxlY3RlZHBhY2thZ2VzPScnezB9JycgXHUwNDQxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDQyIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiwgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDMwXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1XHUwNDQxXHUwNDRmIFx1MDQzZFx1MDQzMCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDMyIFx1MDQzZFx1MDQzNVx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0MzBcdTA0NDUNCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbkVycm9yPUlVUEEwMDI2RTogXHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzMiBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNhXHUwNDMwIFx1MDQ0M1x1MDQzN1x1MDQzYlx1MDQzMDogezB9DQotU3RlcHNPcmRlckRpYWxvZ19zdGVwcz1cdTA0MjhcdTA0MzBcdTA0MzNcdTA0Mzg6IA0KLVN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU9XHUwNDFmXHUwNDNlXHUwNDQwXHUwNDRmXHUwNDM0XHUwNDNlXHUwNDNhIFx1MDQ0OFx1MDQzMFx1MDQzM1x1MDQzZVx1MDQzMiBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi1Qcm9jZXNzRWRpdG9yX1BsYW5uZWQ9XHUwNDE3XHUwNDMwXHUwNDNmXHUwNDNiXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5DQotc3BlY2lmeWRpcmVjdG9yeV90ZXh0PVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPVx1MDQxZFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzkNCi1Qcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU9XHUwNDIxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDRmXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZFx1MDQzMCBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzUNCi1Qcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZT1cdTA0MjFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NGZcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNkXHUwNDMwIFx1MDQzMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzNQ0KLXNlbGVjdENvbHVtbnN0b0FkZF90ZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0NDJcdTA0M2VcdTA0M2JcdTA0MzFcdTA0NDZcdTA0NGIgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLVByb2Nlc3NFZGl0b3JfVHlwZT1cdTA0MjJcdTA0MzhcdTA0M2YNCi1Qcm9jZXNzRWRpdG9yX1RlYW09XHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDMwDQotRmlsdGVyRGlhbG9nX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGI6IA0KLQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZD1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDM3ICZcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLi4uDQotRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsPVx1MDQyMVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzZFx1MDQ0M1x1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NDFcdTA0MzUNCi1PcGVuQ2hlYXRzaGVldFZpZXdfdGl0bGU9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQ0YyBcdTA0MWZcdTA0MzBcdTA0M2NcdTA0NGZcdTA0NDJcdTA0M2FcdTA0MzgNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsVXA9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDNhXHUwNDQwXHUwNDQzXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0NQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxEb3duPVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQzYVx1MDQ0MFx1MDQ0M1x1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0M2RcdTA0MzhcdTA0MzcNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA9XHUwNDEyXHUwNDMyJlx1MDQzNVx1MDQ0MFx1MDQ0NQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVEb3duPVx1MDQxMiZcdTA0M2RcdTA0MzhcdTA0MzcNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWw9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwJlx1MDQ0Ylx1MDQ0Mlx1MDQ0Yw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvcHk9Jlx1MDQxYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0Yy4uLg0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ9XHUwNDI4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkXHUwNDRiIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZCAoXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQzZlx1MDQzZVx1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGZcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDMwKTogDQotTWV0aG9kTGlicmFyeUVkaXRvcl90aXRsZT1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyOiANCi0jTWVzc2FnZVZpZXdfc2VsZWN0ZWRfdGV4dD1TZWxlY3RlZDogDQotTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ9XHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotRWxlbWVudHNWaWV3X2Vycl9zYXZpbmc9SVVQQTAwMjdFOiBcdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOCAnJ3swfScnezF9DQotDQotZXJyX2NvcHlpbmdfZmlsZV90aXRsZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0MzANCi1lcnJfY29weWluZ19maWxlX2Vycm9yPUlVUEEwMDI4RTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNlXHUwNDNhLiANCi1lcnJfY29weWluZ19maWxlX3JlYXNvbj1cdTA0MWZcdTA0NDBcdTA0MzggXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM4IFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0MzAgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNkXHUwNDM4XHUwNDNhXHUwNDNiXHUwNDMwIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMC4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0M2FcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDMwDQotZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcD1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlDQotZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0PUlVUEEwMDE1RTogXHUwNDFkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDINCi1TYXZlVGhpc0FjdGlvbl9zYXZlb2JqZWN0PVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyLi4uDQotRWxlbWVudHNWaWV3X3JlcGxhY2VfdGV4dD1cdTA0MTdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9FeHRlbmQ9Jlx1MDQyMFx1MDQzMFx1MDQ0MVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQ0Yy4uLg0KLU1vdmVEaWFsb2dfZGVzdGluYXRpb25fdGV4dD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNkXHUwNDMwXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzI6DQotY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhOg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzPSZcdTA0MWRcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDRiXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3MyPVx1MDQxZiZcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0NDBcdTA0NGIgXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Li4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXNzaWduVXNlckRpYWdyYW09XHUwNDFmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM1ICZcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NGIuLi4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdGl0bGU9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NGINCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRJbWFnZT1cdTA0MTRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0MzAgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5Og0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZGRJbWFnZT1cdTA0MTRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0MzAgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5IFx1MDQzZVx1MDQzMSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGZcdTA0NDU6DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3dwZEltYWdlPVx1MDQxNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMCBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMDoNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfbm90YUZpbGU9SVVQQTAwMDRFOiBcdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNSBcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDNhIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0My4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQ0Yy4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19lbnRlcmVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAyNEU6IFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNkXHUwNDM1XHUwNDQyIFx1MDQzMiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzUuIFx1MDQyM1x1MDQzMVx1MDQzNVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQ0MVx1MDQ0YyBcdTA0MzIgXHUwNDQyXHUwNDNlXHUwNDNjLCBcdTA0NDdcdTA0NDJcdTA0M2UgXHUwNDNmXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0M2VcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDNhXHUwNDNlXHUwNDQwXHUwNDNkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzM1x1MDQzMCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzguDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3NlbGVjdGVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAzMEU6IFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNkXHUwNDM1XHUwNDQyIFx1MDQzMiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzUuDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFESW1hZ2U9XHUwNDE4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NGIgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzAgXHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBRERJbWFnZT1cdTA0MThcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0YiBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzAgXHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VXUERJbWFnZT1cdTA0MThcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0YiBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzAgXHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvbnRyaWJ1dGU9XHUwNDFiXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JlcGxhY2U9XHUwNDFiXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQzN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzMA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0RpYWdyYW1zPVx1MDQxNFx1MDQzOFx1MDQzMCZcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NGINCi1Qcm9jZXNzRWRpdG9yX2FjdGlvbl9kZWVwQ29weT1cdTA0MjAmXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDMyXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNS4uLg0KLUZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uPVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNToNCi1Db25maWd1cmF0aW9uUGFnZV9oaWRlVG9vbFRpcD1cdTA0MjFcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMvXHUwNDNmXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNVx1MDQzZVx1MDQ0Mlx1MDQzY1x1MDQzNVx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGINCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbj1cdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzU6DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NBbGw9XHUwNDFkXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZFx1MDQzNSBcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMNCi1GaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbj1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0NGIgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDRmXHUwNDRlXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzN1x1MDQzMFx1MDQzZlx1MDQ0Zlx1MDQ0Mlx1MDQ0Ylx1MDQzY1x1MDQzOC4gKj1cdTA0M2JcdTA0NGVcdTA0MzFcdTA0MzBcdTA0NGYgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDNhXHUwNDMwLCA/PVx1MDQzYlx1MDQ0ZVx1MDQzMVx1MDQzZVx1MDQzOSBcdTA0NDFcdTA0MzhcdTA0M2NcdTA0MzJcdTA0M2VcdTA0M2INCi1Db25maWd1cmF0aW9uUGFnZV9UcmVlVGl0bGVMYWJlbD1cdTA0MWNcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0NGI6DQotQ29uZmlndXJhdGlvblBhZ2VfTG9hZGluZ01lc3NhZ2U9XHUwNDE3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNhXHUwNDMwIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCwgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDM2XHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1Li4uDQotTW92ZURpYWxvZ192YWxpZGRlc3RpbmF0aW9uX3RleHQ9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQzZFx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQ0Ylx1MDQzOSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQzNVx1MDQ0OVx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1Nb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uPUlVUEEwMDM0RTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZVx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNS4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw9XHUwNDFlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MVx1MDQzNQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5CYXNlQWN0aXZpdHk9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0M1x1MDQ0ZSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUNCi1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPSZcdTA0MjBcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0NDNcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDQxXHUwNDM1DQotUHJvY2Vzc0Zvcm1FZGl0b3JfY29sbGFwc2VBbGxBY3Rpb25MYWJlbD0mXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNkXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MVx1MDQzNQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURpYWdyYW09XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzNCZcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NDMgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbD1cdTA0MWRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGJcdTA0MzUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiIFx1MDQzMiBcdTA0M2ZcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0MzggXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzZFx1MDQ0YiBcdTA0MzFcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDRiIFx1MDQzMlx1MDQzZSBcdTA0MzhcdTA0MzdcdTA0MzFcdTA0MzVcdTA0MzZcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDMyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIuIFx1MDQxZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBPSywgXHUwNDQ3XHUwNDQyXHUwNDNlXHUwNDMxXHUwNDRiIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0NDUgXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQ0Yy4NCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfU2VsZWN0Q29sdW1ucz1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDNiXHUwNDMxXHUwNDQ2XHUwNDRiIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtPVx1MDQxZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM0Jlx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0MyBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfQ29sdW1uU2VsZWN0aW9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzZVx1MDQ0MCBcdTA0NDFcdTA0NDJcdTA0M2VcdTA0M2JcdTA0MzFcdTA0NDZcdTA0MzA6DQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N3aXRjaENvbmZpZ3VyYXRpb249XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzZFx1MDQzMCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwIFx1MDQzZlx1MDQzZSBcdTA0NDNcdTA0M2NcdTA0M2VcdTA0M2JcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQzOFx1MDQzOCBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N1cHByZXNzaW9uR3JvdXBUaXRsZT1cdTA0MjFcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0MzhcdTA0MzUNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGU9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQ0Zlx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0MzhcdTA0NGYNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbT1cdTA0MWVcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDQzICZcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsPVx1MDQxZVx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQ0Yy4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0luc2VydE5ld1BoYXNlPVx1MDQxMlx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0NGJcdTA0MzkgXHUwNDRkXHUwNDQyXHUwNDMwXHUwNDNmDQotVmlld0hlbHBlcl9yZWxvYWRMaWJPblJvbGxiYWNrRXJyb3I9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0MzJcdTA0M2VcdTA0NDFcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDRmXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzYlx1MDQzNSBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzggXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDNiXHUwNDM4XHUwNDQ5XHUwNDMwLiBcdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzJcdTA0M2VcdTA0NDFcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDM1XHUwNDM1IFx1MDQzOFx1MDQ0MVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0NDFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NGZcdTA0M2RcdTA0MzhcdTA0NGYuDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZF90ZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiAnJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2QuDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZGNvbmZpcm1fdGV4dD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgJyd7MH0nJyBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkLiBcdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzOFx1MDQzNyAnJ3sxfScnPw0KLUNvbmZpZ3VyYXRpb25QYWdlX0FkZE1pc3NpbmdUb29sVGlwPVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2RcdTA0MzVcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4DQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb249XHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm89XHUwNDFlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiANCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BcHBseVBhdHRlcm49XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjICZcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2QNCi1Nb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0Nlx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUuDQotTW92ZURpYWxvZ19ub21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZSBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQzNVx1MDQ0OVx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3Ryb3VibGVvYmplY3Q9LiAgXHUwNDFlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyIFx1MDQ0MSBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0M2VcdTA0Mzk6IA0KLU1lc3NhZ2VMYWJlbFByb3ZpZGVyX2VycmNoaWxkcGtncz1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDEgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0MiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDM0XHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDQwXHUwNDNkXHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzMCBcdTA0NDFcdTA0M2VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0NDIgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQ0MSBcdTA0M2RcdTA0MzVcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0M2NcdTA0MzggXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDMwXHUwNDNjXHUwNDM4DQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZT1cdTA0MWVcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0Yg0KLVByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfTWVzc2FnZT1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDRiLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNkXHUwNDQzXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YywgXHUwNDM4IFx1MDQzZVx1MDQ0Mlx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0M2VcdTA0NDAgXHUwNDQyXHUwNDM1XHUwNDQ1LCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNSBcdTA0M2RcdTA0NDNcdTA0MzZcdTA0M2RcdTA0M2UNCi1Qcm9jZXNzRWRpdG9yX1RpdGxlPVx1MDQyMFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0MzI6IA0KLVNhdmVBc3dpdGhkb3RzX3RleHQ9XHUwNDIxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzMFx1MDQzYS4uLg0KLVByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZT1cdTA0MjFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0MzAgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDRiDQotUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbj1cdTA0MjBcdTA0MzBcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmDQotUHJvY2Vzc0VkaXRvcl9Xb3JrUHJvZHVjdFVzYWdlPVx1MDQxOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotUHJvY2Vzc0VkaXRvcl9Db25zb2xpZGF0ZWRWaWV3PVx1MDQxZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzNFx1MDQzOFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1Qcm9jZXNzRWRpdG9yX2NvbmZpcm1BdXRvU3luY2g9XHUwNDJkXHUwNDQyXHUwNDNlIFx1MDQzNFx1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDNhIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MzJcdTA0NDFcdTA0MzVcdTA0NDUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQzZFx1MDQzOFx1MDQzNlx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5LCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDQ1IFx1MDQzZFx1MDQzMCBcdTA0MzJcdTA0M2FcdTA0M2JcdTA0MzBcdTA0MzRcdTA0M2FcdTA0MzUgXHUwNDFlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQzOCBcdTA0MjFcdTA0MzJcdTA0M2VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAgXHUwNDMyXHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDMwIFx1MDQzZVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQ0ZiAiXHUwNDIxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkIFx1MDQ0MSBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0MzhcdTA0M2FcdTA0M2VcdTA0M2MiLiBcdTA0MTRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0M2MgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDNjIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0M2RcdTA0MzBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzZVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCwgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0MVx1MDQzZSBcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM1XHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMC4gXHUwNDFlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzMlx1MDQzZFx1MDQzOFx1MDQzY1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSwgXHUwNDQ3XHUwNDQyXHUwNDNlIFx1MDQzNFx1MDQzOFx1MDQzZFx1MDQzMFx1MDQzY1x1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgKFx1MDQzMlx1MDQ0Ylx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0M2FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzJcdTA0M2VcdTA0M2MgXHUwNDM4IFx1MDQzN1x1MDQzNVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQ0Ylx1MDQzYyBcdTA0NDZcdTA0MzJcdTA0MzVcdTA0NDJcdTA0M2VcdTA0M2MpIFx1MDQzZFx1MDQzNSBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDRiLiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGM/DQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24xPVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0M2VcdTA0NDAgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM1XHUwNDM5IFx1MDQzOCBcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzINCi1OZXdMaWJyYXJ5RGlhbG9nX25ld2xpYnJhcnlfYXM9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2FcdTA0MzBcdTA0M2ENCi1OZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0YyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1TZWxlY3RFbGVtZW50RGlhbG9nX3RpdGxlX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNlXHUwNDM0XHUwNDNkXHUwNDNlIFx1MDQzOFx1MDQzNyBcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5Og0KLU9wZW5Db25maWdEaWFsb2duZXdjb25maWdfdGV4dD1cdTA0MWRcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmOg0KLXByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZV9CU0VkaXRvcj1cdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyDQotDQotIyBBYnN0cmFjdERpYWdyYW1FZGl0b3INCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9XHUwNDEyXHUwNDRiXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNkXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9XHUwNDFlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzZSBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzkgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0PVx1MDQxZVx1MDQ0Mlx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDJcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDM1Li4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1cdTA0MTNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDNmXHUwNDNlIFx1MDQ0MVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzZFx1MDQzNVx1MDQzY1x1MDQ0Mw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9XHUwNDEzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDNkXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlIFx1MDQzZlx1MDQzZSBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDNjXHUwNDQzDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDNmXHUwNDNlIFx1MDQ0MVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzZFx1MDQzNVx1MDQzY1x1MDQ0Mw0KLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGU9XHUwNDFlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLU1vdmVEaWFsb2dfaW52YWxpZF9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnPUlVUEEwMDQxRTogXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NGYgXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMiBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1Lg0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeT1cdTA0MjFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzOS4uLg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyb3JfZGlhbG9nX3RpdGxlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMA0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZV9saWJyYXJ5X3Byb2JsZW1fbXNnPUlVUEEwMDMzRTogXHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4Lg0KLU1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0PVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyAnJ3swfScnPw0KLUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX0NvbnRlbnRFbGVtZW50X3RleHQ9XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMjogDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Ccm93c2VCdXR0b25MYWJlbD1cdTA0MWVcdTA0MzFcdTA0MzdcdTA0M2VcdTA0NDAuLi4NCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYgXHUwNDM4IFx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMC4NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZVRpdGxlPVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDM4IFx1MDQzN1x1MDQzMFx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NDFcdTA0MzUgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDNmXHUwNDNlIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0M2NcdTA0NDMNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLUF0dGFjaG1lbnREaWFsb2dhdHRhY2hGaWxlX3RleHQ9XHUwNDEyXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYg0KLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ9XHUwNDFjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLU9wZW5Db25maWdEaWFsb2dvcGVuY29uZmlnX3RleHQ9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZQ0KLUVsZW1lbnRzVmlld19yZXBsYWNlQWN0aW9uX3RleHQ9XHUwNDE3XHUwNDMwXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZT1cdTA0MjFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgezB9DQotQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcD1cdTA0MWZcdTA0M2VcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDNhXHUwNDNlXHUwNDNiIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNlx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25Gb3JtUHJlZml4PVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZjogDQotQ2hlY2tsaXN0T3JkZXJfY2hlY2tsaXN0aXRlbXNfdGV4dD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQ0YjogDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPVx1MDQxZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M2INCi1Db25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzN1x1MDQzMFx1MDQzY1x1MDQ0Ylx1MDQzYVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSwgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDMyIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzOA0KLU5ld1BsdWdpbkRpYWxvZ19yZWZlcmVuY2VwbHVnaW5fdGV4dD1cdTA0MjFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4Og0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9jcmVhdGVGcmVlVGV4dF90ZXh0PVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzFcdTA0M2VcdTA0MzRcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfTGFiZWw9XHUwNDE3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNlXHUwNDNhIFx1MDQ0M1x1MDQzN1x1MDQzYlx1MDQzMDoNCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2Nvbm5lY3RfdGV4dD1JVVBBMDAzMlc6IFx1MDQxZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX3NhbWVwcmVkYW5kc3VjX3RleHQ9SVVQQTAwMzNXOiBcdTA0MWVcdTA0MzRcdTA0MzhcdTA0M2QgXHUwNDM4IFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0MzZcdTA0MzUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQ0YiBcdTA0M2RcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2VcdTA0MzRcdTA0M2RcdTA0M2VcdTA0MzJcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2RcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQ4XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDNjIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0M2MNCi0NCi0jIEVkaXRvckNob29zZXINCi1FZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZT1cdTA0MWVcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwDQotRWRpdG9yQ2hvb3Nlcl9SZXNvdXJjZXNFcnJvcj1cdTA0MmRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQ0MVx1MDQzZVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQ0MiBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzguIFx1MDQyMFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDQ1IFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzVcdTA0M2MgKFx1MDQ0MVx1MDQzYy4gXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmKS4gXG5cDQotXG5cDQotXHUwNDFkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MWVcdTA0MWEgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzFcdTA0MzVcdTA0MzcgXHUwNDM3XHUwNDMwXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwIFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzMC4gXHUwNDE3XHUwNDMwXHUwNDNhXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQ0ZFx1MDQ0Mlx1MDQzZSBcdTA0M2VcdTA0M2FcdTA0M2RcdTA0M2UgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzN1x1MDQzMFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMCBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzAuDQotQ29uZmlndXJhdGlvblBhZ2VfRm9ybVByZWZpeD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGY6IA0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbk5hbWU9XHUwNDE4XHUwNDNjXHUwNDRmOg0KLUF0dGFjaG1lbnREaWFsb2dGaWxlVVJMX3RleHQ9VVJMIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzMDoNCi1TdGVwc09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDhcdTA0MzBcdTA0MzMgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzY1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDMyIFx1MDQzZFx1MDQ0M1x1MDQzNlx1MDQzZFx1MDQzZVx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQxIFx1MDQzZlx1MDQzZVx1MDQzY1x1MDQzZVx1MDQ0OVx1MDQ0Y1x1MDQ0ZSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2EgXHUwNDEyXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQ1IFx1MDQzOCBcdTA0MTJcdTA0M2RcdTA0MzhcdTA0MzcuDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOA0KLU1lc3NhZ2VWaWV3X2VycmVsZW1lbnRfdGV4dD1cdTA0MjFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzlcdTA0NDFcdTA0NGYgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotTWVzc2FnZVZpZXdfcmVmZWxlbWVudF90ZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiwgXHUwNDNkXHUwNDMwIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzOSBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0NGJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDMwDQotDQotI0FjdGl2aXR5IERpYWdyYW0NCi1BY3Rpdml0eURpYWdyYW1FZGl0b3JfY3JlYXRlU3RhcnROb2RlX3RleHQ9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M2INCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAsIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQ0YiBcdTA0MzggXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDRiIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZFx1MDQ0M1x1MDQzNlx1MDQzZFx1MDQzZSBcdTA0MzJcdTA0M2FcdTA0M2JcdTA0NGVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDMyIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUuDQotQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb25fdGV4dD1cdTA0MWVcdTA0M2FcdTA0M2RcdTA0M2UgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Zlx1MDQzNFx1MDQzYVx1MDQzMCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzgNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsPVx1MDQxYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMzoNCi1Sb290UHJlZlBhZ2VfZW5hYmxlcHJvY2Vzc2NvbnRyaWJ1dGlvbl90ZXh0PVx1MDQxMlx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAuDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25MYWJlbD1cdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzU6DQotQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0M2VcdTA0NDAgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5IFx1MDQzNFx1MDQzYlx1MDQ0ZiAnJ3swfScnDQotRWxlbWVudHNWaWV3X29wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbl90ZXh0PVx1MDQxZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDEgXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDQ5XHUwNDRjXHUwNDRlIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzZVx1MDQzMiBcdTA0MzJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzgNCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9XHUwNDMyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzZVx1MDQzMiBcdTA0MzJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzggXHUwNDM0XHUwNDNiXHUwNDRmICcnezB9JycNCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdmlld2VyTGFiZWw9XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzMlx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQzMlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgJyd7MH0nJw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19MYWJlbD1cdTA0MTdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0M2VcdTA0M2EgXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDRiOg0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ9XHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZQ0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NDMgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl9kZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2UgXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1cdTA0MWVcdTA0NDdcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzhcdTA0NDJcdTA0NGMNCi1XUENvbXBhcnRtZW50RmlndXJlXzA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotcHJvbXB0Zm9yX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGRfdGV4dD1cdTA0MWVcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDRiIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOSwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZFx1MDQzNSBcdTA0MzFcdTA0NGJcdTA0M2JcdTA0MzggXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDRiIFx1MDQzMiBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyDQotcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVx1MDQxZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDQyXHUwNDRjIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0YiBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzkgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZFx1MDQzNVx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotDQotI0NvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm49XHUwNDI4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkXHUwNDRiIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZCAoXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQzZlx1MDQzZVx1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGZcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDMwKToNCi1zaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbD1cdTA0MWZcdTA0M2VcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyIFx1MDQzZlx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQzOCBcdTA0MWRcdTA0MzBcdTA0MzJcdTA0MzhcdTA0MzNcdTA0MzBcdTA0NDJcdTA0M2VcdTA0NDANCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19QYXR0ZXJuPVx1MDQyOFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQ0YiBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M2JcdTA0NGZcdTA0NGVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDM3XHUwNDMwXHUwNDNmXHUwNDRmXHUwNDQyXHUwNDRiXHUwNDNjXHUwNDM4LiAqPVx1MDQzYlx1MDQ0ZVx1MDQzMVx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M2VcdTA0M2FcdTA0MzAsID89XHUwNDNiXHUwNDRlXHUwNDMxXHUwNDNlXHUwNDM5IFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzMlx1MDQzZVx1MDQzYg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb249SVVQQTAwMjlFOiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzhcdTA0MzdcdTA0M2VcdTA0NDhcdTA0M2JcdTA0MzAgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0M2FcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDMwLiBcdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQ2F0ZWdvcnlUeXBlPVx1MDQyMlx1MDQzOFx1MDQzZiBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0Mzg6DQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1cdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzU6DQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfU2VsZWN0Q2F0ZWdvcmllcz1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4DQotDQotI2xvZyBtZXNzYWdlcw0KLWNoZWF0c2hlZXRfbG9hZF9mYWlsdXJlX2xvZ19tc2c9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDMwXHUwNDNjXHUwNDRmXHUwNDQyXHUwNDNhXHUwNDQzOiANCi0NCi1uZXdDb25maWd1cmF0aW9uV2lyYXpkX2NyZWF0ZUVycm9yPUlVUEEwMDM1RTogXHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzZFx1MDQzNSBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzANCi1uZXdQbHVnaW5XaXphcmRfY3JlYXRlRXJyb3I9SVVQQTAwMzZFOiBcdTA0MWNcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgXHUwNDNkXHUwNDM1IFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZA0KLWVycm9yRGlhbG9nX21vdmVFcnJvcj1JVVBBMDAzN0U6IFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mg0KLXJlbmFtZURpYWxvZ19yZW5hbWVFcnJvcj1JVVBBMDAzOEU6IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2RcdTA0MzUgXHUwNDMxXHUwNDRiXHUwNDNiIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZA0KLWVycm9yRGlhbG9nX2NyZWF0ZUVycm9yPUlVUEEwMDM5RTogXHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzZFx1MDQzNSBcdTA0MzFcdTA0NGJcdTA0M2IgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkDQotZHVwbGljYXRlUGx1Z2luTmFtZUVycm9yX21zZz1JVVBBMDEwMUU6IFx1MDQxOFx1MDQzY1x1MDQ0ZiAnJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIuIFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlLg0KLQ0KLSNOZXcgU3RyaW5ncyBmb3IgUHJvY2Vzc0VkaXRvciBDb250ZXh0IG1lbnUgZGlhZ3JhbSBpbWFnZXMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBREltYWdlPVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgQUQuLi4NCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZz1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzANCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBRERJbWFnZT1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IEFERC4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZFdQREltYWdlPVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgV1BELi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURJbWFnZUluUHVibGlzaGluZz1cdTA0MThcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IEFEIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlU3VwcHJlc3M9XHUwNDIxXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRiXHUwNDM1IFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0MzIgXHUwNDNmXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNiXHUwNDM4IFx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0M2RcdTA0NGIgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0MzJcdTA0M2UgXHUwNDM4XHUwNDM3XHUwNDMxXHUwNDM1XHUwNDM2XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzMiBcdTA0M2ZcdTA0M2VcdTA0NDFcdTA0M2JcdTA0MzUgXHUwNDQxXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDM4XHUwNDRmIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIuIFx1MDQxZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBPSywgXHUwNDQ3XHUwNDQyXHUwNDNlXHUwNDMxXHUwNDRiIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0NDUgXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQ0Yy4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBRERJbWFnZUluUHVibGlzaGluZz1cdTA0MThcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IEFERCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlV1BESW1hZ2VJblB1Ymxpc2hpbmc9XHUwNDE4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBXUEQgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLVByb2Nlc3NFZGl0b3JfRGlhZ3JhbUltYWdlX0lucHV0RGlhbG9nX2luaXRpYWxWYWx1ZT1cdTA0MWZcdTA0NDNcdTA0NDJcdTA0NGMgXHUwNDNhIFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1Nob3dMaW5rZWRFbGVtZW50aW5MaWJyYXJ5Vmlldz1cdTA0MWZcdTA0M2VcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0NDImXHUwNDRjIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDMyIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzgNCi1Qcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWw9XHUwNDFlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2UgXHUwNDQxXHUwNDNlXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDM4XHUwNDM4ICZcdTA0MzhcdTA0MzcgXHUwNDMxXHUwNDMwXHUwNDM3XHUwNDRiDQotUHJvY2Vzc0VkaXRvcl9Db250ZXh0TWVudV9EaWFncmFtSW1hZ2VzPVx1MDQxOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2MNCi0NCi0jU3RyaW5ncyBmb3Igc3luY2hyb25pemF0aW9uIHdpemFyZCBvbiBwcm9jZXNzIGVkaXRvcidzIEJTDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90aXRsZT1cdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0N1x1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0MFx1MDQ0YiBcdTA0NDFcdTA0MzhcdTA0M2RcdTA0NDVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSwgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRmXHUwNDM1XHUwNDNjXHUwNDQzXHUwNDRlIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDFcdTA0MzhcdTA0M2RcdTA0NDVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguIFwNCi1cdTA0MmRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwIFx1MDQzMlx1MDQzYlx1MDQzOFx1MDQ0Zlx1MDQzNVx1MDQ0MiBcdTA0M2RcdTA0MzAgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGIsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDFcdTA0MzhcdTA0M2RcdTA0NDVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWw9XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmOg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90aXRsZT1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDFcdTA0MzhcdTA0M2RcdTA0NDVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJvcGVydGllc19sYWJsZT1cdTA0MjFcdTA0MzJcdTA0M2VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzANCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbmFtZV9sYWJsZT1cdTA0MThcdTA0M2NcdTA0NGYNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJlc2VudGF0aW9uTmFtZV9sYWJsZT1cdTA0MThcdTA0M2NcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2JyaWVmRGVzY19sYWJsZT1cdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3B0aW9uYWxJbm91dHNfbGFiZWw9XHUwNDFkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQ0Yg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9tYW5kYXRvcnlJbnB1dHNfbGFibGU9XHUwNDFlXHUwNDMxXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQ0Yg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vdXRwdXRzX2xhYmVsPVx1MDQxMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQ0Yg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX2xhYmVsPVx1MDQxZVx1MDQ0MVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYWRkblBlcmZvcm1lcnNfbGFibGU9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQzOA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9yZXNwb25zaWJsZVJvbGVzX2xhYmxlPVx1MDQxZVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzgNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfY29udG5BcnRpZmFjdHNfbGFiZWw9XHUwNDIxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDM1XHUwNDQxXHUwNDRmIFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzNVx1MDQ0NFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbD1cdTA0MWFcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxTdGVwc19sYWJlbD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0M2VcdTA0NDAgXHUwNDQ4XHUwNDMwXHUwNDMzXHUwNDNlXHUwNDMyDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzZVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQzYlx1MDQzNVx1MDQzNlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0MzhcdTA0M2RcdTA0NDVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RpdGxlPVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMlx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDAgXHUwNDQxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzYlx1MDQzMFx1MDQzM1x1MDQzMFx1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQzNSBcdTA0MzRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzOFx1MDQzZFx1MDQ0NVx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzOFx1MDQzN1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1zZWxlY3RFZGl0b3JzVG9EaXNjYXJkQ29uZmxpY3RDaGFuZ2VzPVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0M2RcdTA0MzVcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0M2JcdTA0MzhcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zlx1MDQzY1x1MDQzOCwgXHUwNDMyXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDNjXHUwNDM4IFx1MDQzMlx1MDQzZFx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzAuXG5cDQotXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0YiwgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzMiBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0NDUgXHUwNDQxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQzYlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0Yy4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfdGl0bGVfdGV4dD1cdTA0MWNcdTA0MzBcdTA0NDFcdTA0NDJcdTA0MzVcdTA0NDAgXHUwNDQxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dD1cdTA0MWNcdTA0MzBcdTA0NDFcdTA0NDJcdTA0MzVcdTA0NDAgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MzJcdTA0NDFcdTA0MzVcdTA0NDUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQzZFx1MDQzOFx1MDQzNlx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5LCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDQ1IFx1MDQzZFx1MDQzMCBcdTA0MzJcdTA0M2FcdTA0M2JcdTA0MzBcdTA0MzRcdTA0M2FcdTA0MzUgXHUwNDFlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQzOCBcdTA0MjFcdTA0MzJcdTA0M2VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAgXHUwNDMyXHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDMwIFx1MDQzZVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQ0ZiAiXHUwNDIxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkIFx1MDQ0MSBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0MzhcdTA0M2FcdTA0M2VcdTA0M2MiLiAgXA0KLVx1MDQxMiBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzBcdTA0NDUgXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNiXHUwNDRmXHUwNDRlXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAsIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzIgXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDNjIFx1MDQzY1x1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzNS4gXA0KLVx1MDQxY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0NDJcdTA0MzBcdTA0M2FcdTA0MzZcdTA0MzUgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzYlx1MDQ0ZVx1MDQzMVx1MDQ0M1x1MDQ0ZSBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NDNcdTA0NGUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDMyXHUwNDRiXHUwNDQ3XHUwNDM4XHUwNDQxXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4gXA0KLVx1MDQxZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzJcdTA0M2RcdTA0MzhcdTA0M2NcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUsIFx1MDQ0N1x1MDQ0Mlx1MDQzZSBcdTA0MzRcdTA0MzhcdTA0M2RcdTA0MzBcdTA0M2NcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiIChcdTA0MzJcdTA0NGJcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDNhXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDMyXHUwNDNlXHUwNDNjIFx1MDQzOCBcdTA0MzdcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0NGJcdTA0M2MgXHUwNDQ2XHUwNDMyXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDNjKSBcdTA0M2RcdTA0MzUgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQ0Yi4NCi0NCi1vcGVuUlRFPVx1MDQxZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDNlXHUwNDQyXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQ0Mlx1MDQzMA0KLWNsb3NlUlRFPVx1MDQxN1x1MDQzMFx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDNlXHUwNDQyXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQ0Mlx1MDQzMA0KLQ0KLSNOZXcgU3RyaW5ncw0KLXJvbGVzZXRzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDQzIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOS4NCi1kaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Zlx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQzNS4NCi13b3JrcHJvZHVjdHR5cGVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDQyXHUwNDM4XHUwNDNmXHUwNDQzIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAuDQotZG9tYWluc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDM0XHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQzLg0KLXRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDQzLg0KLWN1c3RvbWNhdGVnb3J5X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQzOC4NCi0NCi1jb25jZXB0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ2XHUwNDM1XHUwNDNmXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLWNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Zlx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0MzUuDQotZXhhbXBsZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Zlx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjXHUwNDQzIFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0MFx1MDQ0My4NCi1ndWlkZWxpbmVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0M2VcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NGZcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0NDBcdTA0MzVcdTA0M2FcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotcm9hZG1hcF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Zlx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjXHUwNDQzIFx1MDQzZlx1MDQ0M1x1MDQ0Mlx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0ZS4NCi1yZXVzYWJsZWFzc2V0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDNjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDNlXHUwNDNjXHUwNDQzIFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQ0My4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0M2VcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NGZcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzOFx1MDQzYyBcdTA0MzJcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0MzNcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0M2MgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDMwXHUwNDNjLg0KLXJlcG9ydF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Zlx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjXHUwNDQzIFx1MDQzZVx1MDQ0Mlx1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQ0My4NCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Zlx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDM4XHUwNDNjIFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzYyBcdTA0M2VcdTA0M2ZcdTA0NDJcdTA0MzhcdTA0M2NcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0M2VcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NGZcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0NDMuDQotdGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0M2VcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NGZcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0M2VcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGUgXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDNjXHUwNDM4XHUwNDNkXHUwNDMwLg0KLXRvb2xtZW50b3JfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0M2VcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NGZcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0NDBcdTA0NDNcdTA0M2FcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDMgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0My4NCi13aGl0ZXBhcGVyX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDNlXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDNjXHUwNDQzIFx1MDQzMVx1MDQ0ZVx1MDQzYlx1MDQzYlx1MDQzNVx1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQ0ZS4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Zlx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQ0MFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDNhXHUwNDM1Lg0KLQ0KLQ0KLSNOZXcgU3RyaW5nIFNlY3Rpb24gRGVzY3JpcHRpb24NCi1yb2xlX2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzOC4NCi1yb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4Lg0KLXJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDMwIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQ0YyBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGNcdTA0NGUuDQotcm9sZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4Lg0KLQ0KLXRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM1Lg0KLXRhc2tfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzUuDQotdGFza192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDMwIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzMCBcdTA0NDEgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDM5IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzOS4NCi10YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzguDQotDQotYXJ0aWZhY3RfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDM1XHUwNDQ0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDM1Lg0KLWFydGlmYWN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDM1XHUwNDQ0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDM1Lg0KLWFydGlmYWN0X2ljb25TZWN0aW9uX2Rlc2M9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDM1XHUwNDQ0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDMwLg0KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzNSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDM1XHUwNDQ0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDMwLg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQzXHUwNDQyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDRmXHUwNDRlXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzNVx1MDQ0NFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzNS4NCi1hcnRpZmFjdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDM1XHUwNDQ0XHUwNDMwXHUwNDNhXHUwNDQyIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0NDEgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDNjIFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzNVx1MDQ0NFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzYy4NCi1hcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDM1XHUwNDQ0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDMwLg0KLQ0KLW91dGNvbWVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM1Lg0KLW91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0MzhcdTA0NDFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzUuDQotb3V0Y29tZV9pY29uU2VjdGlvbl9kZXNjPVx1MDQxZFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0M2FcdTA0MzggXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzOFx1MDQ0MVx1MDQ0NVx1MDQzZVx1MDQzNC4NCi1vdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzNSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDMwLg0KLW91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDNcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0NGZcdTA0NGVcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM1Lg0KLW91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDQyIFx1MDQzOFx1MDQ0MVx1MDQ0NVx1MDQzZVx1MDQzNCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzYyBcdTA0MzhcdTA0NDFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2MuDQotb3V0Y29tZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDMwLg0KLQ0KLWRlbGl2ZXJhYmxlX2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzYyBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzUuDQotZGVsaXZlcmFibGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0M2VcdTA0M2MgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDM1Lg0KLWRlbGl2ZXJhYmxlX2ljb25TZWN0aW9uX2Rlc2M9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAuDQotZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2UgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDM1IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwLg0KLWRlbGl2ZXJhYmxlX3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQzXHUwNDQyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDRmXHUwNDRlXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzYyBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzUuDQotZGVsaXZlcmFibGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDQyIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDIgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQ0MSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0M2MgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDNjIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzYy4NCi1kZWxpdmVyYWJsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMC4NCi0NCi1kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQzNS4NCi1kaXNjaXBsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDM0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDM1Lg0KLWRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDMwIFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQzMCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0M2VcdTA0MzkuDQotZGlzY2lwbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDM0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDRiLg0KLQ0KLWRvbWFpbl9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0MzRcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzUuDQotZG9tYWluX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDM0XHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1Lg0KLWRvbWFpbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDM0XHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0NDEgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDNjIFx1MDQzNFx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzYy4NCi1kb21haW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQzNFx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzMC4NCi0NCi13b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDQyXHUwNDM4XHUwNDNmXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAuDQotd29ya3Byb2R1Y3R0eXBlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDQyXHUwNDM4XHUwNDNmXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAuDQotd29ya3Byb2R1Y3R0eXBlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSwgXHUwNDNhXHUwNDMwXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0NDJcdTA0MzhcdTA0M2YgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzY1x1MDQzOCBcdTA0NDJcdTA0MzhcdTA0M2ZcdTA0MzBcdTA0M2NcdTA0MzggXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMC4NCi13b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQ0Mlx1MDQzOFx1MDQzZlx1MDQzMCBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwLg0KLQ0KLXJvbGVzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDM1IFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOS4NCi1yb2xlc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDM1IFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOS4NCi1yb2xlc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSwgXHUwNDNhXHUwNDMwXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0M2RcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDAgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5IFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0NDEgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDNjIFx1MDQzZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzYyBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkuDQotcm9sZXNldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDMwIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOS4NCi0NCi10b29sX2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzNS4NCi10b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDM1Lg0KLXRvb2xfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDQyIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzYyBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0M2MuDQotdG9vbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwLg0KLQ0KLWNvbmNlcHRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ2XHUwNDM1XHUwNDNmXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLWNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDZcdTA0MzVcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0MzguDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0MzAgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ2XHUwNDM1XHUwNDNmXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzMCBcdTA0NDEgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0Nlx1MDQzNVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzNVx1MDQzOS4NCi1jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDZcdTA0MzVcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0MzguDQotDQotY2hlY2tsaXN0X2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0MzUuDQotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzNS4NCi1jaGVja2xpc3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDMwIFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0MzAgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDMwIFx1MDQ0MSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzkgXHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzNVx1MDQzOS4NCi1jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0NGIuDQotDQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0NDBcdTA0MzUuDQotZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0MFx1MDQzNS4NCi1leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSwgXHUwNDNhXHUwNDMwXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0NDAgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQ0MSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0M2MgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQwXHUwNDNlXHUwNDNjLg0KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0MFx1MDQzMC4NCi0NCi1ndWlkZWxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOS4NCi1ndWlkZWxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0M2RcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDBcdTA0MzUgXHUwNDQwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5Lg0KLWd1aWRlbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwIFx1MDQ0MFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOSBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzYyBcdTA0M2RcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDBcdTA0M2VcdTA0M2MgXHUwNDQwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5Lg0KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDMwIFx1MDQ0MFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOS4NCi0NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0NDBcdTA0MzVcdTA0M2FcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDNlIFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQzZFx1MDQzYVx1MDQzNS4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQ0MFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDNhXHUwNDM1Lg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSwgXHUwNDNhXHUwNDMwXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzMCBcdTA0NDBcdTA0MzVcdTA0M2FcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNmXHUwNDNlIFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQzZFx1MDQzYVx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0NDBcdTA0MzVcdTA0M2FcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzVcdTA0MzkgXHUwNDNmXHUwNDNlIFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQzZFx1MDQzYVx1MDQzNS4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDQwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQzZSBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0MzUuDQotDQotcHJhY3RpY2VfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDNhXHUwNDQyXHUwNDM4XHUwNDNhXHUwNDM1IFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1wcmFjdGljZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuDQotcHJhY3RpY2VfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzMCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzkgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLXByYWN0aWNlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzggXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLQ0KLXJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0M2VcdTA0NDJcdTA0NDdcdTA0MzVcdTA0NDJcdTA0MzUuDQotcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDNlXHUwNDQyXHUwNDQ3XHUwNDM1XHUwNDQyXHUwNDM1Lg0KLXJlcG9ydF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDNlXHUwNDQyXHUwNDQ3XHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0NDEgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDNjIFx1MDQzZVx1MDQ0Mlx1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzYy4NCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQzZVx1MDQ0Mlx1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQzMC4NCi0NCi1yZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzY1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQzZVx1MDQzYyBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzUuDQotcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzY1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQzZVx1MDQzYyBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzUuDQotcmVzdWFibGVhc3NldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDNjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MSBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzYyBcdTA0M2NcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0NGJcdTA0M2MgXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNlXHUwNDNjLg0KLXJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQzY1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzAuDQotDQotcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0M2ZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0MzUuDQotcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzZlx1MDQ0M1x1MDQ0Mlx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQzNS4NCi1yb2FkbWFwX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSwgXHUwNDNhXHUwNDMwXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0M2ZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGMgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQ0MSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0M2MgXHUwNDNmXHUwNDQzXHUwNDQyXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNjLg0KLXJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQ0Mlx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Zi4NCi0NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDMyXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDMzXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDNjIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzNS4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0MzJcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0MzNcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0M2MgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDM1Lg0KLXN1cHBvcnRpbmdtYXRlcmlhbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDMyXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDMzXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYiBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzYyBcdTA0MzJcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0MzNcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0M2NcdTA0MzggXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDNjLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDMyXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDMzXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzMC4NCi0NCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0MzUuDQotdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0MzUuDQotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDQyIFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzYyBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0M2VcdTA0M2MuDQotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQzMC4NCi0NCi10ZXJtZGVmaW5pdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0M2VcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDNjXHUwNDM4XHUwNDNkXHUwNDMwLg0KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDNlXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM4IFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzY1x1MDQzOFx1MDQzZFx1MDQzMC4NCi10ZXJtZGVmaW5pdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2UgXHUwNDNlXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzY1x1MDQzOFx1MDQzZFx1MDQzMCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzYyBcdTA0M2VcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzVcdTA0M2MgXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDNjXHUwNDM4XHUwNDNkXHUwNDMwLg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCBcdTA0M2VcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDNjXHUwNDM4XHUwNDNkXHUwNDMwLg0KLQ0KLXRvb2xtZW50b3JfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1IFx1MDQzZlx1MDQzZSBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NDMuDQotdG9vbG1lbnRvcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNSBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDQzLg0KLXRvb2xtZW50b3JfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlIFx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzZSBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDQzIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZSBcdTA0NDEgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDNjIFx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzZVx1MDQzYyBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDQzLg0KLXRvb2xtZW50b3JfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCBcdTA0NDBcdTA0NDNcdTA0M2FcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0My4NCi0NCi13aGl0ZXBhcGVyX2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzZVx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzYyBcdTA0MzFcdTA0NGVcdTA0M2JcdTA0M2JcdTA0MzVcdTA0NDJcdTA0MzVcdTA0M2RcdTA0MzUuDQotd2hpdGVwYXBlcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzZVx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzYyBcdTA0MzFcdTA0NGVcdTA0M2JcdTA0M2JcdTA0MzVcdTA0NDJcdTA0MzVcdTA0M2RcdTA0MzUuDQotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDNlXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzMVx1MDQ0ZVx1MDQzYlx1MDQzYlx1MDQzNVx1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQ0YyBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzYyBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0M2VcdTA0M2RcdTA0M2RcdTA0NGJcdTA0M2MgXHUwNDMxXHUwNDRlXHUwNDNiXHUwNDNiXHUwNDM1XHUwNDQyXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNjLg0KLXdoaXRlcGFwZXJfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzZVx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0MzFcdTA0NGVcdTA0M2JcdTA0M2JcdTA0MzVcdTA0NDJcdTA0MzVcdTA0M2RcdTA0NGYuDQotDQotZGlzY2lwbGluZWdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQzNSBcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2QuDQotZGlzY2lwbGluZWdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDM1IFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZC4NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDMwIFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQzMCBcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2QgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDMwIFx1MDQ0MSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDNlXHUwNDM5IFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZC4NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0YiBcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2QuDQotDQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQzNSBcdTA0M2RcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDBcdTA0M2VcdTA0MzIgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5Lg0KLXJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQzNSBcdTA0M2RcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDBcdTA0M2VcdTA0MzIgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5Lg0KLXJvbGVzZXRncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0MzAgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDMwIFx1MDQzZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzMiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDMwIFx1MDQ0MSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDNlXHUwNDM5IFx1MDQzZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzMiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkuDQotcm9sZXNldGdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGIgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOS4NCi0NCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4Lg0KLWN1c3RvbWNhdGVnb3J5X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQzOC4NCi1jdXN0b21jYXRlZ29yeV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0MzAgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0ZiBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM1XHUwNDM5Lg0KLWN1c3RvbWNhdGVnb3J5X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4Lg0KLWN1c3RvbWNhdGVnb3J5X0ljb25TZWN0aW9uX2Rlc2M9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzguDQotDQotY29uY2VwdF9pY29uU2VjdGlvbl9kZXNjPVx1MDQxZFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0M2FcdTA0MzggXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0Nlx1MDQzNVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1jaGVja2xpc3RfaWNvblNlY3Rpb25fZGVzYz1cdTA0MWRcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNhXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDQyXHUwNDMwXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDQ2XHUwNDRiLg0KLXRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYz1cdTA0MWRcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNhXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDBcdTA0NDNcdTA0M2FcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzIgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0My4NCi13aGl0ZXBhcGVyX2ljb25TZWN0aW9uX2Rlc2M9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDNlXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzMVx1MDQ0ZVx1MDQzYlx1MDQzYlx1MDQzNVx1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQ0Zi4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjPVx1MDQxZFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0M2FcdTA0MzggXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0MFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDNhXHUwNDM1Lg0KLXRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNlXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzY1x1MDQzOFx1MDQzZFx1MDQzMC4NCi10ZW1wbGF0ZV9pY29uU2VjdGlvbl9kZXNjPVx1MDQxZFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0M2FcdTA0MzggXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQzMC4NCi1yZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzMC4NCi1yZXBvcnRfaWNvblNlY3Rpb25fZGVzYz1cdTA0MWRcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNhXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2VcdTA0NDJcdTA0NDdcdTA0MzVcdTA0NDJcdTA0MzAuDQotcHJhY3RpY2VfaWNvblNlY3Rpb25fZGVzYz1cdTA0MWRcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNhXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDNhXHUwNDQyXHUwNDM4XHUwNDNhXHUwNDM4IFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1leGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQwXHUwNDMwLg0KLWd1aWRlbGluZV9pY29uU2VjdGlvbl9kZXNjPVx1MDQxZFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0M2FcdTA0MzggXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0M2RcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDBcdTA0MzAgXHUwNDQwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5Lg0KLXJvYWRtYXBfaWNvblNlY3Rpb25fZGVzYz1cdTA0MWRcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNhXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGYuDQotc3VwcG9ydGluZ21hdGVyaWFsX2ljb25TZWN0aW9uX2Rlc2M9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDMyXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDMzXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzMC4NCi0NCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY190aXRsZT1cdTA0MjRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkDQotZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfbWVzc2FnZT1cdTA0MjRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDMxXHUwNDRiXHUwNDNiIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZCBcdTA0MzIgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM5IFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzY1x1MDQzNS4gXHUwNDE3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zj8NCi0NCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZT1cdTA0MTJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NGMgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnPVx1MDQxZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiAnJ3swfScnIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQzMlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0YyBcdTA0NDEgJyd7MX0nJywgXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDQzICcnezF9JycgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzNVx1MDQ0MiBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzRcdTA0M2VcdTA0NDdcdTA0MzVcdTA0NDBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzE9XHUwNDFlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmICcnezB9JycgXHUwNDNkXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNlx1MDQzNVx1MDQ0MiBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDMwXHUwNDQwXHUwNDM4XHUwNDMwXHUwNDQyXHUwNDM4XHUwNDMyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDRjIFx1MDQ0MSBcdTA0M2ZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0NDlcdTA0NGNcdTA0NGUgXHUwNDNlXHUwNDM0XHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzOFx1MDQzNyBcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzhcdTA0NDUgXHUwNDNkXHUwNDM1XHUwNDNmXHUwNDNlXHUwNDQxXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQ0NSBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDM4IFx1MDQzYlx1MDQ0ZVx1MDQzMVx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAuDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMj1cdTA0MWVcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgJyd7MH0nJyBcdTA0M2RcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NGMgXHUwNDQxICcnezF9JycsIFx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQ0MyBcdTA0NGRcdTA0NDJcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzYSBcdTA0NDZcdTA0MzhcdTA0M2FcdTA0M2JcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzkgXHUwNDM3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM4Lg0KLQ0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZA0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPVx1MDQxZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiAnJ3swfScnIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZCBcdTA0NDEgJyd7MX0nJywgXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDQzIFx1MDQ0ZFx1MDQ0Mlx1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDNhIFx1MDQ0Nlx1MDQzOFx1MDQzYVx1MDQzYlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzOSBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzguDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyPXwNCi1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc9XHUwNDFmXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQzYlx1MDQzMFx1MDQzNFx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0Nlx1MDQzMCBcdTA0M2RcdTA0MzVcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzZFx1MDQzMCBcdTA0M2ZcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0MzggXHUwNDExXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwDQotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZW1vdmVVbnJlc29sdmVkUmVmZXJlbmNlPVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2RcdTA0MzVcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDQzDQotcHJvbXB0RGVsZXRlQ3VzdG9tQ2F0ZWdvcnlCZWZvcmVSZW1vdmVMYXN0UmVmVG9JdD1cdTA0MTFcdTA0NDNcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDMwIFx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQzZFx1MDQ0Zlx1MDQ0ZiBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzAgXHUwNDNkXHUwNDMwIHswfSBcdTA0MzIgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM1LiBcdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQ0Yi4gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDRjPw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jQmVsb3cgcHJvcGVydHkgImVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcyIgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkDQotI0Rvbid0IGRlbGV0ZSBhIHNwYWNlIGFmdGVyICI6ICINCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLWVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcz06IA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2U4ZjAwOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9XHUwNDFlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLVByb2Nlc3NfRG9jdW1lbnRJbmZvcm1hdGlvblRpdGxlPVx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2UgXHUwNDM0XHUwNDNlXHUwNDNhXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotQWN0aXZpdHlfZ3VpZGFuY2VJbmZvcm1hdGlvblRpdGxlPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLUJyZWFrZG93bkVsZW1lbnRfb3B0aW9uSW5mb3JtYXRpb25UaXRsZT1cdTA0MWZcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0NDBcdTA0NGIgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDRiDQotVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uVGl0bGU9XHUwNDI4XHUwNDMwXHUwNDMzXHUwNDM4DQotDQotVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0OFx1MDQzMFx1MDQzM1x1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzguDQotDQotUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2VcdTA0MzEgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDM1ICJ7MH0iLg0KLVByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQzYVx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDQzICJ7MH0iLg0KLQ0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzUuDQotRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM1Lg0KLU1pbGVzdG9uZV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2FcdTA0MzUuDQotTWlsZXN0b25lX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDJcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDQyXHUwNDNlXHUwNDQ3XHUwNDNhXHUwNDM1Lg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDRiLg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0NGIuDQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdG9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM1Lg0KLUFjdGl2aXR5X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQzYVx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDNjXHUwNDQzIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0MyBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0NGIuDQotQWN0aXZpdHlfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQzYVx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1EZXNjcmlwdG9yX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZSBcdTA0MzRcdTA0M2VcdTA0M2FcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDNlIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NDMuDQotUHJvY2Vzc19Ob25lPTw8IFx1MDQzZFx1MDQzNVx1MDQ0MiA+Pg0KLVByb2Nlc3NfbmFtZT1cdTA0MThcdTA0M2NcdTA0NGY6DQotUHJvY2Vzc19QcmVzZW50YXRpb25OYW1lPVx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGY6DQotUHJvY2Vzc19icmllZkRlc2NyaXB0aW9uPVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNToNCi1Qcm9jZXNzX21haW5EZXNjcmlwdGlvbj0gXHUwNDFlXHUwNDQxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNToNCi1Qcm9jZXNzX3B1cnBvc2U9XHUwNDFkXHUwNDMwXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1Og0KLVByb2Nlc3NfcHJlZml4PVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQ0MToNCi0NCi1CcmVha2Rvd25FbGVtZW50X1R5cGVfTmFtZT1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDRiDQotDQotUHJvY2Vzc19UeXBlX1Rhc2s9XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMDoNCi1Qcm9jZXNzX1R5cGVfUm9sZT1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0NGMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwOg0KLVByb2Nlc3NfVHlwZV9Xb3JrUHJvZHVjdD1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMDoNCi0NCi1Xb3JrUHJvZHVjdF9UeXBlPVx1MDQyMlx1MDQzOFx1MDQzZiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwOg0KLQ0KLUFjdGl2aXR5X01vZGVsSW5mbz1cdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzODoNCi1BY3Rpdml0eV9UeXBlPVx1MDQyMlx1MDQzOFx1MDQzZiBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0Mzg6DQotQWN0aXZpdHlfcHJlc2VudGF0aW9uTmFtZT1cdTA0MThcdTA0M2NcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmOg0KLUFjdGl2aXR5X2FsdGVybmF0aXZlcz1cdTA0MTBcdTA0M2JcdTA0NGNcdTA0NDJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0NGI6DQotQWN0aXZpdHlfaG93VG9TdGFmZj1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0NDFcdTA0M2VcdTA0M2RcdTA0MzBcdTA0M2I6DQotQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucz1cdTA0MWFcdTA0M2JcdTA0NGVcdTA0NDdcdTA0MzVcdTA0MzJcdTA0NGJcdTA0MzUgXHUwNDQzXHUwNDQxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDRmOg0KLVByb2Nlc3NfdXNhZ2VHdWlkYW5jZT1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZToNCi0NCi1BY3Rpdml0eV9Sb2FkbWFwVGl0bGU9XHUwNDFmXHUwNDQzXHUwNDQyXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDM4DQotQWN0aXZpdHlfUm9hZG1hcERlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDNkXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDMyIFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzNSBcdTA0M2ZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzkuDQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlVGl0bGU9XHUwNDFlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDNkXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDMyIFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzNSBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzkuDQotQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsVGl0bGU9XHUwNDEwXHUwNDNkXHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0Yg0KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDNkXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDMyIFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzNSBcdTA0MzBcdTA0M2RcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0M2FcdTA0MzhcdTA0NDUgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyLg0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU9XHUwNDIzXHUwNDQ3XHUwNDM1XHUwNDMxXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzZVx1MDQzMVx1MDQzOFx1MDQ0Zg0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCBcdTA0M2RcdTA0MzAgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzIgXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDM1IFx1MDQ0M1x1MDQ0N1x1MDQzNVx1MDQzMVx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0M2ZcdTA0M2VcdTA0NDFcdTA0M2VcdTA0MzFcdTA0MzhcdTA0MzkuDQotDQotQWN0aXZpdHlfU2VsZWN0ZWRfUm9hZG1hcD1cdTA0MWZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0Mzg6DQotQWN0aXZpdHlfU2VsZWN0ZWRfR2VuZXJhbEd1aWRhbmNlPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZjoNCi1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9XHUwNDEwXHUwNDNkXHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0YjoNCi1BY3Rpdml0eV9TZWxlY3RlZF9FZHVjYXRpb25NYXRlcmlhbD1cdTA0MjNcdTA0NDdcdTA0MzVcdTA0MzFcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNlXHUwNDMxXHUwNDM4XHUwNDRmOg0KLQ0KLUFjdGl2aXR5X0RpYWdyYW1UaXRsZT1cdTA0MTRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0MzANCi1BY3Rpdml0eV9EaWFncmFtRGVzY3JpcHRpb24gPSBcdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDJcdTA0MzAgezB9Lg0KLUFjdGl2aXR5X0FESW1hZ2U9XHUwNDE0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDMwIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOQ0KLUFjdGl2aXR5X0FEREltYWdlPVx1MDQxZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0MzAgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5DQotQWN0aXZpdHlfV1BESW1hZ2U9XHUwNDE0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzOSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotQWN0aXZpdHlfVXNlQURJbWFnZT1cdTA0MWZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDQzIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOQ0KLUFjdGl2aXR5X1VzZUFEREltYWdlPVx1MDQxZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDQzIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOQ0KLUFjdGl2aXR5X1VzZVdQREltYWdlPVx1MDQxZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NDMgXHUwNDM3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQ0NSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0M2VcdTA0MzINCi1BY3Rpdml0eV9Bc3NpZ249XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM4XHUwNDQyXHUwNDRjLi4uDQotDQotVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM9XHUwNDI4XHUwNDMwXHUwNDMzXHUwNDM4Og0KLVRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dUaXRsZT1cdTA0MjhcdTA0MzBcdTA0MzNcdTA0MzgNCi1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nTWVzc2FnZT1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQ4XHUwNDMwXHUwNDMzXHUwNDM4DQotDQotQWN0aXZpdHlfV29ya1JvbGx1cD1cdTA0MjBcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0NGJcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotQWN0aXZpdHlfVGVhbVJvbGx1cD1cdTA0MjBcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0NGJcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiDQotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwPVx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Mlx1MDQ0Ylx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotQWN0aXZpdHlfV29ya1JvbGx1cERlc2NyaXB0aW9uPVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0NGJcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLUFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbj1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQyXHUwNDRiXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0YiBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1BY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXBEZXNjcmlwdGlvbj1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQyXHUwNDRiXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fTXVsdGlwbGVPY3VycmFuY2U9XHUwNDFkXHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNlx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX09wdGlvbmFsPVx1MDQxZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1BsYW5uZWQ9XHUwNDE3XHUwNDMwXHUwNDNmXHUwNDNiXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5DQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkPVx1MDQyMVx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0Ylx1MDQzOQ0KLQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0V2ZW50RHJpdmVuPVx1MDQyM1x1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYlx1MDQ0Zlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0NDFcdTA0M2VcdTA0MzFcdTA0NGJcdTA0NDJcdTA0MzhcdTA0NGZcdTA0M2NcdTA0MzgNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9PbmdvaW5nPVx1MDQxMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzOVx1MDQ0MVx1MDQ0Zg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X1JlcGVhdGFibGU9XHUwNDFmXHUwNDNlXHUwNDMyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRmXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM5XHUwNDQxXHUwNDRmDQotV29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3JzPVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzOFx1MDQzYVx1MDQzODoNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5PVx1MDQxN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0YzoNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9JRF9URVhUPVx1MDQxOFx1MDQzZFx1MDQzNFx1MDQzNVx1MDQzYVx1MDQ0MQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX1BSRVNFTlRBVElPTl9OQU1FX1RFWFQ9XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0RFUEVOREVOQ1lfVEVYVD1cdTA0MTdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NGMNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZD1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQ9XHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU9XHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDRjDQotDQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fU1RBUlQ9XHUwNDE3XHUwNDMwXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNCBcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M2JcdTA0M2VcdTA0M2MNCi1Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19GSU5JU0g9XHUwNDE3XHUwNDMwXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNCBcdTA0M2VcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzVcdTA0M2MNCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSD1cdTA0MWRcdTA0MzBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM0IFx1MDQzZVx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNVx1MDQzYw0KLVdvcmtPcmRlclR5cGVfU1RBUlRfVE9fU1RBUlQ9XHUwNDFkXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNCBcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M2JcdTA0M2VcdTA0M2MNCi0NCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9TeW5jaHJvbml6ZWQ9XHUwNDIxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkIFx1MDQ0MSBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0MzhcdTA0M2FcdTA0M2VcdTA0M2MNCi0NCi1EZXNjcmlwdG9yX1JlZmluZWREZXNjcmlwdGlvbj1cdTA0MjNcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1Og0KLQ0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzgNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb249XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOC4NCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE9XHUwNDFlXHUwNDQxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0YzoNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQzODoNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTM9XHUwNDFmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDQ5XHUwNDNkXHUwNDM4XHUwNDNhOg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9XHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDM4IFx1MDQzMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0NDUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOC4NCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPVx1MDQxZVx1MDQzMVx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzQ6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1cdTA0MWRcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0Og0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTM9XHUwNDEyXHUwNDNkXHUwNDM1XHUwNDQ4XHUwNDNkXHUwNDM4XHUwNDM5IFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNDoNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGU0PVx1MDQxMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNDoNCi0NCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uVGl0bGU9XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyZFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4IFx1MDQ0Zlx1MDQzMlx1MDQzYlx1MDQ0Zlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2MgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQ0NSBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0M2VcdTA0MzIgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4Lg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMT1cdTA0MWVcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjOg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMj1cdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDM4Og0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMz1cdTA0MWZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0NDlcdTA0M2RcdTA0MzhcdTA0M2E6DQotDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZT1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MmRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzOCBcdTA0M2VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDdcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM3XHUwNDMwIFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzMiBcdTA0MzggXHUwNDM4XHUwNDQ1IFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNS4NCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPVx1MDQxZVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0N1x1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzdcdTA0MzA6DQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDI6DQotDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzgNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyMVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5IFx1MDQzZVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0N1x1MDQzMFx1MDQ0ZVx1MDQ0MiBcdTA0MzdcdTA0MzAgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAgXHUwNDM4IFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Zlx1MDQ0ZVx1MDQ0MiBcdTA0MzVcdTA0MzNcdTA0M2UuDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1cdTA0MWVcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDdcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM3XHUwNDMwOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9XHUwNDI3XHUwNDM1XHUwNDNjIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZjoNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfVHlwZT1cdTA0MjJcdTA0MzhcdTA0M2Y6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZT1cdTA0MjFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NGZcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNkXHUwNDMwIFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0Mzg6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlPVx1MDQyMVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQ0Zlx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2RcdTA0MzAgXHUwNDMyXHUwNDRiXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzODoNCi0NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZT1cdTA0MWFcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyZFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyIFx1MDQzMlx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiLg0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfVGFibGUxPVx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotDQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uVGl0bGU9XHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiDQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uRGVzY3JpcHRpb249XHUwNDE0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM1XHUwNDNkIFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzYyBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0MzBcdTA0M2MuDQotUm9sZURlc2NyaXB0b3JfVGVhbV9UYWJsZTE9XHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiOg0KLQ0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDM4DQotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MTIgXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQ0MVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGMgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDRmXHUwNDQyIFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4Lg0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9UYWJsZTE9XHUwNDFlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzODoNCi0NCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25UaXRsZT1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzgNCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDMwIFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0Yi4NCi1UZWFtUHJvZmlsZV9Sb2xlX1RhYmxlMT1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0Mzg6DQotDQotUHJvY2Vzc19SaWNoVGV4dF9Db2xsYXBzZUltYWdlPWNvbGxhcHNlZC5naWYNCi1Qcm9jZXNzX1JpY2hUZXh0X0V4cGFuZEltYWdlPWV4cGFuZGVkLmdpZg0KLVByb2Nlc3NfQWRkPVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0Yy4uLg0KLVByb2Nlc3NfQWRkRnJvbVByb2Nlc3M9XHUwNDE0XHUwNDNlXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzNyBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAuLi4NCi1Qcm9jZXNzX1JlbmFtZV9NZXNzYWdlPVx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzZS4gXHUwNDIxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNjXHUwNDNlXHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzMCBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDNlLCBcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNjIFx1MDQzZlx1MDQzMFx1MDQzZlx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzMC4gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDRjPw0KLVByb2Nlc3NfUmVtb3ZlPVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLVByb2Nlc3NfVXA9XHUwNDEyXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQ1DQotUHJvY2Vzc19Eb3duPVx1MDQxMlx1MDQzZFx1MDQzOFx1MDQzNw0KLVByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwIFx1MDQzZFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzOFx1MDQ0NQ0KLVByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50PVx1MDQyMVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLi4uDQotDQotIyMgRXJyb3IvV2FybmluZw0KLVByb2Nlc3NfSW52YWxpZE5hbWVUaXRsZT1cdTA0MWRcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmDQotUHJvY2Vzc19JbnZhbGlkTmFtZT1JVVBBMDA4MUU6IFx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0M2RcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0NGJcdTA0M2MuIFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmLg0KLVByb2Nlc3NfUmVuYW1lX1RpdGxlPVx1MDQxZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0Yw0KLVByb2Nlc3NfSW52YWxpZFByZXNlbnRhdGlvbk5hbWU9SVVQQTAwODJFOiBcdTA0MThcdTA0M2NcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQ0Ylx1MDQzYy4gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLVByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZT1cdTA0MjFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLVByb2Nlc3NfSW52YWxpZExpbmtNZXRob2RFbGVtZW50PUlVUEEwMDgzRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQxICcnezB9JycsIFx1MDQzZlx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0NDdcdTA0NDJcdTA0M2UgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDQyIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQ0Zlx1MDQ0MiBcdTA0MzIgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDNjIFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzNSBcdTA0NDEgXHUwNDQyXHUwNDM1XHUwNDNjIFx1MDQzNlx1MDQzNSBcdTA0NDBcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0M2MgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDNjLg0KLVByb2Nlc3NfQXNzaWdubWVudEluZm9UaXRsZT1cdTA0MThcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi1Qcm9jZXNzX1RlYW1Bc3NpZ25FcnJvcj1JVVBBMDA4NEU6IFx1MDQxZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0MzRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyICcnezB9JycgXHUwNDMyIFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0MyAnJ3sxfScnIFxuXG5cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDM0XHUwNDNlXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzMCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzggXHUwNDMyIFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0MyBcdTA0M2RcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2NcdTA0M2UsIFx1MDQ0N1x1MDQ0Mlx1MDQzZVx1MDQzMVx1MDQ0YiBcdTA0NDEgXHUwNDNkXHUwNDM4XHUwNDNjIFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzMCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDRjIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAuXG5cblx1MDQxOFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQ0Y1x1MDQ0Mlx1MDQzNSBcdTA0MzJcdTA0MzdcdTA0MzBcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0NGMgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUuDQotUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZT1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiDQotUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGU9XHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiDQotDQotUHJvY2Vzc19EZWxpdmVyYWJsZUFzc2lnbkVycm9yPUlVUEEwMDg1RTogXHUwNDFkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NDIgJyd7MH0nJyBcdTA0MzIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0MiAnJ3sxfScnLCBcdTA0M2ZcdTA0M2VcdTA0NDFcdTA0M2FcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0NDMgXHUwNDQxIFx1MDQzZFx1MDQzOFx1MDQzYyBcdTA0M2RcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDIgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMC4NCi1Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcj1JVVBBMDA4NkU6IFx1MDQxZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0MzRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyICcnezB9JycgXHUwNDNhIFx1MDQ0MVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzggJyd7MX0nJywgXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDQzIFx1MDQ0MSBcdTA0M2RcdTA0MzhcdTA0M2MgXHUwNDNkXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzMCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMC4NCi1Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlck1lc3NhZ2U9SVVQQTAwODdXOiBcdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQzYlx1MDQzZSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQ4XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyLg0KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGU9XHUwNDFkXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDM5IFx1MDQzOFx1MDQzNFx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDhcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0MzhcdTA0M2FcdTA0MzANCi0NCi1Qcm9jZXNzX05vSXRlbXM9XHUwNDFkXHUwNDM1IFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGINCi1Qcm9jZXNzX0l0ZW1zU2VsZWN0ZWQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzZVx1MDQzMjogezB9DQotUHJvY2Vzc19Ob1Byb3BlcnRpZXNBdmFpbGFibGU9XHUwNDIxXHUwNDMyXHUwNDNlXHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzZFx1MDQzNVx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQ0Yg0KLQ0KLVByZWRlY2Vzc29yRGlhbG9nX1RpdGxlPVx1MDQxN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDhcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0MzhcdTA0M2FcdTA0MzANCi1QcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDJcdTA0MzhcdTA0M2YgXHUwNDM3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDhcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0MzhcdTA0M2FcdTA0MzANCi1QcmVkZWNlc3NvckRpYWxvZ19JbmRleD1cdTA0MThcdTA0M2RcdTA0MzRcdTA0MzVcdTA0M2FcdTA0NDE6DQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlc2VudGF0aW9uTmFtZT1cdTA0MThcdTA0M2NcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmOg0KLVByZWRlY2Vzc29yRGlhbG9nX0RlcGVuZGVuY3k9XHUwNDE3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDRjOg0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZT1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDhcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0MzhcdTA0M2ENCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yTWVzc2FnZT1JVVBBMDA4OEU6IFx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzOFx1MDQzYSBcdTA0NDEgXHUwNDQyXHUwNDMwXHUwNDNhXHUwNDM4XHUwNDNjIFx1MDQzOFx1MDQzNFx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzYyBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0NGIuDQotDQotUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX3RleHRFZGl0Q2VsbF9wcm9ibGVtX21zZz1JVVBBMDA5MEU6IFx1MDQxZlx1MDQ0MFx1MDQzOCBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzZFx1MDQzOFx1MDQzYVx1MDQzYlx1MDQzMCBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAuDQotUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX2NlbGxFZGl0b3JfaW52YWxpZFByZWRjZXNzb3JfcHJvYmxlbV9tc2c9SVVQQTAwODlXOiBcdTA0MWRcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0MzkgXHUwNDQxXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDNlXHUwNDNhIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTdjZGQ5NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVlOGMwMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDJhLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjdlNTRjMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UubmwyYS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMmEuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMmEuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhYmE1ZDMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvZnJhZ21lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZnJhZ21lbnROYW1lPUVQRiBDb21wb3NlciBBdXRob3JpbmcgVUkgKE5MMmEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY0NjU0YS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIGJydWdlcmdyXHUwMGU2bnNlZmxhZGUgdGlsIHJlZGlnZXJpbmcNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1ldG9kZQ0KLQ0KLSMgUGVyc3BlY3RpdmUNCi1hdXRob3JpbmdQZXJzcGVjdGl2ZU5hbWU9UmVkaWdlcmluZw0KLWJyb3dzaW5nUGVyc3BlY3RpdmVOYW1lPUdlbm5lbXNlDQotDQotIyBWaWV3cw0KLWxpYnJhcnlWaWV3TmFtZT1CaWJsaW90ZWsNCi1jb25maWd1cmF0aW9uVmlld05hbWU9S29uZmlndXJhdGlvbg0KLWNvbnRlbnRWaWV3TmFtZT1JbmRob2xkDQotY29uZmlndXJhdGlvbkVycm9yTG9nVmlld05hbWU9S29uZmlndXJhdGlvbnNmZWpsbG9nDQotDQotIyBFZGl0b3JzDQotbWV0aG9kRWxlbWVudEVkaXRvck5hbWU9TWV0b2RlZWxlbWVudGVkaXRvcg0KLWNvbmZpZ3VyYXRpb25FZGl0b3JOYW1lPUtvbmZpZ3VyYXRpb25zZWRpdG9yDQotcHJvY2Vzc0VkaXRvck5hbWU9UHJvY2VzZWRpdG9yDQotYWN0aXZpdHlEaWFncmFtRWRpdG9yTmFtZT1Ba3Rpdml0ZXRzZGlhZ3JhbWVkaXRvcg0KLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvck5hbWU9RWRpdG9yIHRpbCBha3Rpdml0ZXRzb3BseXNuaW5nc2RpYWdyYW0NCi13b3JrUHJvZHVjdERlcGVkZW5jeURpYWdyYW1FZGl0b3JOYW1lPUVkaXRvciB0aWwgZGlhZ3JhbSBmb3IgYXJiZWpkc3Byb2R1a3RhZmhcdTAwZTZuZ2lnaGVkDQotDQotIyBDaGVhdCBTaGVldHMNCi1tZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWU9U255ZGVhcmsgdGlsIG1ldG9kZXJlZGlnZXJpbmcNCi1DaGVhdHNoZWV0R2V0c3RhcnRlZENhdGVnb3J5VGV4dD1Lb20gZ29kdCBpIGdhbmcNCi1DaGVhdHNoZWV0UmV1c2FibGVDb250ZW50Q2F0ZWdvcnlUZXh0PU9wcmV0IGdlbmFudmVuZGVsaWd0IG1ldG9kZWluZGhvbGQNCi1DaGVhdHNoZWV0V3JpdGVDb250ZW50Q2F0ZWdvcnlUZXh0PVNrcml2IG1ldG9kZWluZGhvbGQNCi1DaGVhdHNoZWV0UHJvY2Vzc2VzQ2F0ZWdvcnlUZXh0PUFyYmVqZCBtZWQgcHJvY2Vzc2VyDQotQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudD1OYXZpZ1x1MDBlOXIgaSBtZXRvZGVpbmRob2xkDQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249T3ByZXQgZGluIGVnZW4gbWV0b2Rla29uZmlndXJhdGlvbg0KLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RQbHVnaW49T3ByZXQgZGluIGVnZW4gbWV0b2RlLXBsdWdpbg0KLUNoZWF0c2hlZXRBZGRNZXRob2RDb250ZW50PVRpbGZcdTAwZjhqIG55dCBtZXRvZGVpbmRob2xkLCBmLmVrcy4gcm9sbGVyLCBvcGdhdmVyLCBhcmJlamRzcHJvZHVrdGVyIGVsbGVyIHZlamxlZG5pbmcNCi1DaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHM9VGlscGFzIGVrc2lzdGVyZW5kZSBtZXRvZGVlbGVtZW50ZXIgKHJvbGxlciwgb3BnYXZlciwgYXJiZWpkc3Byb2R1a3RlciBlbGxlciB2ZWpsZWRuaW5nKSB2aGEuIGJpZHJhZw0KLUNoZWF0c2hlZXRSZXBsYWNlTWVodG9kRWxlbWVudHM9RXJzdGF0IGVrc2lzdGVyZW5kZSBtZXRvZGVlbGVtZW50ZXIgKHJvbGxlciwgb3BnYXZlciwgYXJiZWpkc3Byb2R1a3RlciBlbGxlciB2ZWpsZWRuaW5nKQ0KLUNoZWF0c2hlZXRBZGRNZXRob2RSZWZPckh5cGVybGluaz1UaWxmXHUwMGY4aiBtZXRvZGVyZWZlcmVuY2UgZWxsZXIgaHlwZXJsaW5rIChVUkwpDQotQ2hlYXRzaGVldEFwcGx5Q2FwYWJpbGl0eVBhdHRlcm49QW52ZW5kIGZ1bmt0aW9uc21cdTAwZjhuc3Rlcg0KLUNoZWF0c2hlZXRDcmVhdGVQcm9jZXNzPU9wcmV0IHByb2NlcyAoZnVua3Rpb25zbVx1MDBmOG5zdGVyIGVsbGVyIGxldmVyaW5nc3Byb2NlcykNCi0NCi0jIEFjdGlvbiBTZXQNCi1hdXRob3JpbmdBY3Rpb25TZXQ9UmVkaWdlcmluZw0KLWNoZWF0U2hlZXRzQWN0aW9uU2V0PVNueWRlYXJrDQotDQotIyBHbG9iYWwgQWN0aW9ucw0KLW5ld0xpYnJhcnlBY3Rpb249TWV0b2RlYmliJmxpb3Rlaw0KLW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwPU9wcmV0IGV0IG55dCBtZXRvZGViaWJsaW90ZWsNCi1uZXdQbHVnaW5BY3Rpb249TWV0b2RlLSZwbHVnaW4NCi1uZXdQbHVnaW5BY3Rpb25Ub29sdGlwPU9wcmV0IGVuIG55IG1ldG9kZS1wbHVnaW4NCi1uZXdDb25maWdBY3Rpb249TWV0b2RlJmtvbmZpZ3VyYXRpb24NCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPU9wcmV0IGVuIG55IG1ldG9kZWtvbmZpZ3VyYXRpb24NCi1vcGVuTGlicmFyeUFjdGlvbj1NZXRvZGViaWImbGlvdGVrDQotb3BlbkxpYnJhcnlBY3Rpb25Ub29sdGlwPVx1MDBjNWJuIGV0IGVrc2lzdGVyZW5kZSBtZXRvZGViaWJsaW90ZWsNCi1vcGVuQ29uZmlnQWN0aW9uPU1ldG9kZSZrb25maWd1cmF0aW9uDQotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9XHUwMGM1Ym4gZW4gZWtzaXN0ZXJlbmRlIG1ldG9kZWtvbmZpZ3VyYXRpb24NCi1vcGVuQ2hlYXRTaGVldHM9U255ZGVhcmsuLi4NCi0NCi0jIExpYnJhcnkgVmlldyBBY3Rpb25zDQotbGlua1dpdGhFZGl0b3I9TGluayBtZWQgZWRpdG9yDQotbGlua1dpdGhFZGl0b3JUb29sdGlwPUxpbmsgbWVkIGVkaXRvcg0KLXNob3dQcmVzZW50YXRpb25OYW1lcz1WaXMgcHJcdTAwZTZzZW50YXRpb25zbmF2bmUNCi1zaG93UHJlc2VudGF0aW9uTmFtZXNUb29sdGlwPVZpcyBwclx1MDBlNnNlbnRhdGlvbnNuYXZuZQ0KLQ0KLSMgQ29uZmlndXJhdGlvbiBWaWV3IEFjdGlvbnMNCi1yZWZyZXNoQ29uZmlnPU9wZnJpc2sNCi1yZWZyZXNoQ29uZmlnVG9vbHRpcD1PcGZyaXNrIGtvbmZpZ3VyYXRpb24NCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1ldGhvZEF1dGhvcmluZ1BhZ2U9TWV0b2RlcmVkaWdlcmluZw0KLXByb2Nlc3NFZGl0b3I9UHJvY2VzZWRpdG9yDQotbGlicmFyeU9wdGlvbnM9QmlibGlvdGVrc2luZHN0aWxsaW5nZXINCi1kaWFncmFtPURpYWdyYW0NCi1zdGFydHVwQW5kU2h1dGRvd249U3RhcnQgb2cgbmVkbHVrbmluZw0KLWRlYnVnPUZlamxmaW5kaW5nDQotDQotIyBDb21tYW5kIEhhbmRsZXINCi1zZWxlY3RBbGw9TWFya1x1MDBlOXIgYWxsZQ0KLQ0KLSMgUHJvcGVydGllcyBWaWV3DQotX1VJX1Byb2Nlc3NFZGl0b3JfbWVudT1Qcm9jZXMNCi1fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtPSZOeSB1bmRlcm9yZG5ldA0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1OJnkgc2lkZW9yZG5ldA0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPSZWaXMgb3ZlcnNpZ3RlbiBFZ2Vuc2thYmVyDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPU9wZiZyaXNrDQotX1VJX1Byb3BlcnRpZXNfR2VuZXJhbD1HZW5lcmVsdA0KLV9VSV9Qcm9wZXJ0aWVzX0RvY3VtZW50YXRpb249RG9rdW1lbnRhdGlvbg0KLV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlPVZlamxlZG5pbmcNCi1fVUlfUHJvcGVydGllc19Xb3JrX1JvbGx1cD1BcmJlamRza29ucy4NCi1fVUlfUHJvcGVydGllc19UZWFtX1JvbGx1cD1UZWFta29ucy4NCi0jIyBUaGUgZm9sbG93aW5nIHZhbHVlIG9mIHN0cmluZyBzaG91bGQgYmUgIldvcmsgUHJvZHVjdCBSb2xsdXAiLiBCdXQNCi0jIyBkdWUgdG8gbGltaXRhdGlvbi9idWcgaW4gRWNsaXBzZSBXVFAsIGl0J3MgYmVlbiB0cnVuY2F0ZWQgdG8gDQotIyMgIldvcmsgUHJvZCBSb2xsdXAiLiBTbyBkdXJpbmcgdHJhbnNsYXRpb24sIHBsZWFzZSB0YWtlIHRoaXMgaW50byBjb25zaWRlcmF0aW9uLg0KLV9VSV9Qcm9wZXJ0aWVzX1dQX1JvbGx1cD1BcmIucHJvZC5rb25zLg0KLV9VSV9Qcm9wZXJ0aWVzX1JvbGVzPVJvbGxlcg0KLV9VSV9Qcm9wZXJ0aWVzX1dvcmtQcm9kdWN0cz1BcmJlamRzcHJvZHVrdGVyDQotX1VJX1Byb3BlcnRpZXNfU3RlcHM9VHJpbg0KLV9VSV9Qcm9wZXJ0aWVzX1RlYW1zPVRlYW1zDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmFlMjVmNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXByZXZpb3VzX25hbWVfbnVsbDE9TmF2bmVcdTAwZTZuZHJpbmcga2FuIGlra2UgZm9ydHJ5ZGVzLCBodmlzIGRldCBmb3JyaWdlIG5hdm4gZXIgdG9tdC4NCi1lcnJfbmFtZV9lbXB0eT1OYXZuZXQgc2thbCB1ZGZ5bGRlcy4gQW5naXYgZXQgZ3lsZGlndCBuYXZuLg0KLW1vdmVBY3Rpb25fbGFiZWw9Rmx5dA0KLQ0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dD1WXHUwMGU2bGcNCi1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXA9Vlx1MDBlNmxnIG5vZGUgZWxsZXIgbGluaw0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPVRpbGZcdTAwZjhqIG5vZGUNCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnPUlYUkQwMDAyVzogTm9kZW4ga2FuIGlra2UgdGlsZlx1MDBmOGplcyB0aWwgZGlhZ3JhbQ0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQ9TGluaw0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3NlbGVjdD1WXHUwMGU2bGcgbGluaw0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA9T3ByZXQgbnl0IGxpbmsNCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQ9U3RhcnRub2RlDQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwPU9wcmV0IG55IHN0YXJ0bm9kZQ0KLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0PUZyaXRla3N0DQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXA9T3ByZXQgbnkgZnJpdGVrc3QNCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0PVN5bmtyb25pc2VyaW5nc2xpbmplDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcD1PcHJldCBueSBzeW5rcm9uaXNlcmluZ3NsaW5qZQ0KLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dD1CZXNsdXRuaW5nc25vZGUNCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA9T3ByZXQgbnkgYmVzbHV0bmluZ3Nub2RlDQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dD1TbHV0bm9kZQ0KLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg9QWt0aXZpdGV0c29wbHlzbmluZzoNCi1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwPU9wcmV0IG55IHNsdXRub2RlDQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9QWt0aXZpdGV0DQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA9T3ByZXQgbnkgYWt0aXZpdGV0DQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUdlbnRhZ2Vsc2UNCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXA9T3ByZXQgbnkgZ2VudGFnZWxzZQ0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0PUZhc2UNCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcD1PcHJldCBueSBmYXNlDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9T3BnYXZlZGVza3JpcHRvcg0KLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90ZXh0PVJvbGxlZGVza3JpcHRvcg0KLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PURpYWdyYW0gZm9yIGFyYmVqZHNwcm9kdWt0YWZoXHUwMGU2bmdpZ2hlZDoNCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1PcHJldCBueSByb2xsZWRlc2tyaXB0b3INCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcD1PcHJldCBueSBvcGdhdmVkZXNrcmlwdG9yDQotQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PUxldmVyaW5nc3Byb2Nlcw0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PUZ1bmt0aW9uc21cdTAwZjhuc3Rlcg0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg9RmFzZQ0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1HZW50YWdlbHNlDQotQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9QWt0aXZpdGV0DQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PUFyYmVqZHNwcm9kdWt0ZGVza3JpcHRvcg0KLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcD1PcHJldCBueSBhcmJlamRzcHJvZHVrdGRlc2tyaXB0b3INCi0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9SnVzdFx1MDBlOXINCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1PcGZyaXNrIGZyYSBiYXNpc2FrdGl2aXRldA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dD1Gb3JtYXRcdTAwZTlyIHRla3N0Ym9rcy4uLg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9VmFuZHJldCB0aWwgZ2VubmVtc25pdA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9VmFuZHJldCB0aWwgZlx1MDBmOHJzdGUgdmFsZ3RlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1Mb2RyZXQgdGlsIGdlbm5lbXNuaXQNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PUxvZHJldCB0aWwgZlx1MDBmOHJzdGUgdmFsZ3RlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1HZW0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPUdlbW1lciB7MH0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9Rmx5dCBub2RlDQotQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlPU9wZnJpc2sgZnJhIGJhc2lzDQotQWJzdHJhY3REaWFncmFtX0JlbmRQb2ludF9jcmVhdGU9T3ByZXQgYlx1MDBmOGpuaW5nc3B1bmt0DQotDQotQWN0aXZpdHlEaWFncmFtX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1cdTAwYzVibiBha3Rpdml0ZXRzb3BseXNuaW5nc2RpYWdyYW0NCi1yZWZyZXNoQWN0aW9uX2xhYmVsPU9wZnJpc2sNCi1yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw9T3BmcmlzayBmcmEgYmFzaXMNCi1kaWFncmFtX3NhdmVFcnJvcj1JVVBEMDAwMVc6IERpYWdyYW0ga2FuIGlra2UgZ2VtbWVzDQotDQotRGVsZXRlRGlhZ3JhbV90ZXh0PVNsZXQgZGlhZ3JhbQ0KLURlbGV0ZURpYWdyYW1fcHJvbXB0PUVyIGR1IHNpa2tlciBwXHUwMGU1LCBhdCBkdSB2aWwgc2xldHRlIGRldHRlIGRpYWdyYW0/XG5cdTAwYzZuZHJpbmdlbiBlciBwZXJtYW5lbnQgb2cga2FuIGlra2UgZm9ydHJ5ZGVzLg0KLWFsaWduX2JlbmRfcG9pbnRfdGV4dD1KdXN0XHUwMGU5ciBiXHUwMGY4am5pbmdzcHVua3QNCi1Db25maWd1cmF0aW9uRWRpdG9ySW5wdXRfY29uZmlnZWRpdG9yMD1Lb25maWd1cmF0aW9uc2VkaXRvcg0KLWRpYWdyYW1fbm9kZV9wcm9wZXJ0eV92YWx1ZV9wcm9ibGVtX21zZz1GZWpsIGkgbm9kZW5zIGVnZW5za2Fic3ZcdTAwZTZyZGkuDQotZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZV90ZXh0MD1GZWpsDQotDQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PVJlc2V0IGRpYWdyYW1sYXlvdXQNCi1lcnJvckRpYWxvZ190aXRsZT1GZWpsDQotY29tbWFuZF9jYW5ub3RFZGl0PUlVUEQwMDAzRTogS2FuIGlra2UgcmVkaWdlcmUgZGlhZ3JhbQ0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90aXRsZT1PdmVyb3JkbmV0IGVkaXRvciBsdWtrZXQNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGV4dD17MH0gZXIgbHVra2V0LiBWaWwgZHUgb2dzXHUwMGU1IGx1a2tlIHsxfT8NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MTI3ZjhmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRm9ybSBQYWdlIFRpdGxlcw0KLWFzc2lnblBhZ2VfdGl0bGU9VGlsZGVsDQotY2F0ZWdvcmllc1BhZ2VfdGl0bGU9S2F0ZWdvcmllcg0KLWRlbGl2ZXJhYmxlUGFydHNQYWdlX3RpdGxlPUxldmVyYW5jZWRlbGUNCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9QmVza3JpdmVsc2UNCi1kaXNjaXBsaW5lc1BhZ2VfdGl0bGU9RGlzY2lwbGluZXINCi1kaXNjYXJkdW5yZXNvbHZlZHJlZj1TbGV0IHVsXHUwMGY4c3RlIHJlZmVyZW5jZXINCi1ndWlkYW5jZVBhZ2VfdGl0bGU9VmVqbGVkbmluZw0KLXByZXZpZXdQYWdlX3RpdGxlPVJlc3VsdGF0DQotcmVmZXJlbmNlc1BhZ2VfdGl0bGU9UmVmZXJlbmNlcg0KLXJlZmVyZW5jZV90ZXh0PVJlZmVyZW5jZXI6DQotcmVmZXJlbmNlV29ya2Zsb3dQYWdlX3RpdGxlPVJlZmVyZW5jZWFyYmVqZHNnYW5nDQotcm9sZXNQYWdlX3RpdGxlPVJvbGxlcg0KLXJvbGVTZXRzUGFnZV90aXRsZT1Sb2xsZXNcdTAwZTZ0DQotc3RlcHNQYWdlX3RpdGxlPVRyaW4NCi10YXNrc1BhZ2VfdGl0bGU9T3BnYXZlcg0KLXRvb2xNZW50b3JzUGFnZV90aXRsZT1WXHUwMGU2cmt0XHUwMGY4anNtZW50b3Jlcg0KLXdvcmtQcm9kdWN0c1BhZ2VfdGl0bGU9QXJiZWpkc3Byb2R1a3Rlcg0KLQ0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uDQotY2hlY2tJdGVtc1NlY3Rpb25fbmFtZT1Lb250cm9sZWxlbWVudGVyDQotY2hlY2tJdGVtc1NlY3Rpb25fZGVzYz1BbmdpdiBkZSBrb250cm9sZWxlbWVudGVyLCBzb20gdWRnXHUwMGY4ciBkZW5uZSB0amVrbGlzdGUuDQotZGVwZW5kZW5jaWVzU2VjdGlvbl9uYW1lPUFmaFx1MDBlNm5naWdoZWRlcg0KLWRlcGVuZGVuY2llc1NlY3Rpb25fZGVzYz1BZnNuaXR0ZXQgdmlzZXIgZGVubmUgaW5kaG9sZHNwYWtrZXMgYWZoXHUwMGU2bmdpZ2hlZGVyIGFmIGFuZHJlIGluZGhvbGRzcGFra2VyLg0KLWRldGFpbFNlY3Rpb25fbmFtZT1EZXRhbGplcmVkZSBvcGx5c25pbmdlcg0KLWRldGFpbFNlY3Rpb25fZGVzYz1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSB7MH0uDQotZ2VuZXJhbEluZm9TZWN0aW9uX25hbWU9R2VuZXJlbGxlIG9wbHlzbmluZ2VyDQotZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIHswfS4NCi1pY29uU2VjdGlvbl9uYW1lPUlrb24NCi1pY29uU2VjdGlvbl9kZXNjPVRpbHBhcyBpa29uZXJuZSB0aWwgezB9Lg0KLW5vdGF0aW9uU2VjdGlvbl9uYW1lPUxldmVyYW5jZW9wbHlzbmluZ2VyDQotbm90YXRpb25TZWN0aW9uX2Rlc2M9QW5naXYgbGV2ZXJpbmdzb3BseXNuaW5nZXIgb20gezB9Lg0KLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9uYW1lPVJlZmVyZXJlZGUgcGx1Z2luczoNCi1yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fZGVzYz1BZnNuaXR0ZXQgdmlzZXIgcGx1Z2lucywgc29tIGRlbm5lIG1ldG9kZS1wbHVnaW4gcmVmZXJlcmVyIHRpbC4NCi1zdGFmZmluZ1NlY3Rpb25fbmFtZT1CZW1hbmRpbmdzb3BseXNuaW5nZXINCi1zdGFmZmluZ1NlY3Rpb25fZGVzYz1BbmdpdiBiZW1hbmRpbmdzb3BseXNuaW5nZXIgb20gZGVubmUgcm9sbGUuDQotc3RlcHNTZWN0aW9uX25hbWU9VHJpbg0KLXN0ZXBzU2VjdGlvbl9kZXNjPUFuZ2l2IHRyaW5lbmUgdGlsIHVkZlx1MDBmOHJlbHNlIGFmIGRlbm5lIG9wZ2F2ZS4NCi10YWlsb3JpbmdTZWN0aW9uX25hbWU9VGlscGFzbmluZw0KLXRhaWxvcmluZ1NlY3Rpb25fZGVzYz1BbmdpdiB0aWxwYXNuaW5nc29wbHlzbmluZ2VyIG9tIHswfS4NCi12YXJpYWJpbGl0eVNlY3Rpb25fbmFtZT1JbmRob2xkc3ZhcmlhYmlsaXRldA0KLXZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIHswfSBlciByZWxhdGVyZXQgdGlsIGVuIGFuZGVuIHswfS4NCi12ZXJzaW9uSW5mb1NlY3Rpb25fbmFtZT1WZXJzaW9uc29wbHlzbmluZ2VyDQotdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSB7MH0uDQotDQotIyBVSSAmIEVsZW1lbnQgQXR0cmlidXRlIExhYmVscw0KLWFkZGl0aW9uYWxJbmZvX3RleHQ9RmxlcmUgb3BseXNuaW5nZXI6DQotYXBwbGljYXRpb25fdGV4dD1Qcm9ncmFtOg0KLWFjdGlvbkxhYmVsX2VkaXQ9UmVkaWdcdTAwZTlyDQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1WaXMgaSBvdmVyc2lndGVuIEJpYmxpb3Rlaw0KLWFsdGVybmF0aXZlc190ZXh0PUFsdGVybmF0aXZlcjoNCi1hc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0PVRpbGRlbGluZ3NtXHUwMGU1ZGVyOg0KLWF1dGhvcnNfdGV4dD1Gb3JmYXR0ZXJlOg0KLWJhY2tncm91bmRfdGV4dD1CYWdncnVuZDoNCi1iYXNlRWxlbWVudF90ZXh0PUJhc2lzOg0KLWJhc2VHdWlkYW5jZV90ZXh0PUJhc2lzdmVqbGVkbmluZzoNCi1icmllZkRlc2NyaXB0aW9uX3RleHQ9S29ydCBiZXNrcml2ZWxzZToNCi1kZXNjcmlwdGlvbl90ZXh0PUJlc2tyaXZlbHNlOg0KLWJhY2t1cGJlZm9yZXNhdmVfdGV4dD1TaWtrZXJoZWRza29waVx1MDBlOXIgZlx1MDBmOHIgbGFncmluZw0KLWJyaWVmT3V0bGluZV90ZXh0PUtvcnQgb3ZlcnNpZ3Q6DQotY2hhbmdlRGF0ZV90ZXh0PVx1MDBjNm5kcmluZ3NkYXRvOg0KLWNoYW5nZURlc2NyaXB0aW9uX3RleHQ9XHUwMGM2bmRyaW5nc2Jlc2tyaXZlbHNlOg0KLWNoZWNrSXRlbXNfdGV4dD1Lb250cm9sZWxlbWVudGVyDQotY29udHJpYnV0ZXNfdGV4dD1CaWRyYWdlcg0KLWxvY2FsQ29udHJpYnV0ZXNfdGV4dD1Mb2thbGUgYmlkcmFnDQotY29udHJpYnV0ZXNfdG9fdGV4dD1CaWRyYWdlciB0aWwNCi1jb3B5cmlnaHRfdGV4dD1Db3B5cmlnaHQ6DQotZWRpdG9yX3RleHQ9RWRpdG9yDQotZXh0ZW5kc190ZXh0PVVkdmlkZXINCi1leHRlbmRfdGV4dD1VZHZpZA0KLWV4dGVybmFsRGVzY3JpcHRpb25fdGV4dD1Fa3N0ZXJuIGJlc2tyaXZlbHNlOg0KLWV4dGVybmFsSWRfdGV4dD1Fa3N0ZXJuIGlkOg0KLWdvYWxzX3RleHQ9TVx1MDBlNWw6DQotaW1wYWN0T2ZOb3RIYXZpbmdfdGV4dD1WaXJrbmluZyBhZiBpa2tlIGF0IGhhdmU6DQota2V5Q29uc2lkZXJhdGlvbnNfdGV4dD1OXHUwMGY4Z2xlb3ZlcnZlamVsc2VyOg0KLWxldmVsc09mQWRvcHRpb25fdGV4dD1BZG9wdGlvbnNuaXZlYXU6DQotbWFpbkRlc2NyaXB0aW9uX3RleHQ9T3Zlcm9yZG5ldCBiZXNrcml2ZWxzZToNCi1uZXdFbGVtZW50X3RleHQ9Tnl0IHswfQ0KLW5hbWVfdGV4dD1OYXZuOg0KLW5vdEFwcGxpY2FibGVfdGV4dD1Ja2tlIHJlbGV2YW50DQotcGFja2FnaW5nR3VpZGFuY2VfdGV4dD1QYWtrZXZlamxlZG5pbmc6DQotcHJlc2VudGF0aW9uTmFtZV90ZXh0PVByXHUwMGU2c2VudGF0aW9uc25hdm46DQotcHJvbXB0Zm9ybGliYXJ5X3RleHQ9U3BcdTAwZjhyZyBvbSBtZXRvZGViaWJsaW90ZWsgdmVkIHN0YXJ0DQotZW5hYmxlSGVhbHRoQ2hlY2tfdGV4dD1Ba3Rpdlx1MDBlOXIgaW50ZXJuZSBmZWpsZmluZGluZ3N2XHUwMGU2cmt0XHUwMGY4amVyDQotcHJvYmxlbV90ZXh0PVByb2JsZW06DQotcHVycG9zZV90ZXh0PUZvcm1cdTAwZTVsOg0KLXJlYXNvbkZvck5vdE5lZWRpbmdfdGV4dD1cdTAwYzVyc2FnIHRpbCBpa2tlIGF0IGJlaFx1MDBmOHZlOg0KLXJlcGxhY2VzX3RleHQ9RXJzdGF0dGVyDQotbG9jYWxSZXBsYWNlc190ZXh0PUxva2FsZSBlcnN0YXRuaW5nZXINCi1yZXByZXNlbnRhdGlvbk9wdGlvbnNfdGV4dD1JbmRzdGlsbGluZ2VyIGZvciByZXByXHUwMGU2c2VudGF0aW9uOg0KLXRlbXBsYXRlRmlsZV90ZXh0PVNrYWJlbG9uZmlsKGVyKToNCi1za2lsbHNfdGV4dD1Lb21wZXRlbmNlcjoNCi1zdGVwc190ZXh0PVRyaW46DQotc3RlcHNfbmFtZV90ZXh0PU5hdm46DQotc3RvcF90ZXh0PVN0b3ANCi1wcmludF90ZXh0PVVkc2tyaXYNCi1zeW5vbnltc190ZXh0PVN5bm9ueW1lcjoNCi10eXBlX3RleHQ9VHlwZToNCi1jb3B5X3RleHQ9S29waVx1MDBlOXINCi1kZWVwQ29weV90ZXh0PUR5YiBrb3BpZXJpbmcNCi1iYWNrX3RleHQ9VGlsYmFnZQ0KLW5ld19wbHVnaW49TnkgbWV0b2RlLXBsdWdpbg0KLW1vdmU9Rmx5dC4uLg0KLXVuaXF1ZUlkX3RleHQ9RW50eWRpZyBpZDoNCi12YXJpYWJpbGl0eVR5cGVfdGV4dD1WYXJpYWJpbGl0ZXRzdHlwZToNCi12ZXJzaW9uX3RleHQ9VmVyc2lvbjoNCi0NCi0jIEJ1dHRvbiBMYWJlbHMNCi1hZGRCdXR0b25fdGV4dD1UaWxmXHUwMGY4ai4uLg0KLWF0dGFjaEJ1dHRvbl90ZXh0PVZlZGhcdTAwZTZmdC4uLg0KLWJyb3dzZUJ1dHRvbl90ZXh0PUdlbm5lbXNlLi4uDQotY2hhbmdlVHlwZUJ1dHRvbl90ZXh0PVNraWZ0IHR5cGUuLi4NCi1jbGVhckJ1dHRvbl90ZXh0PVJ5ZA0KLWRlbGV0ZUJ1dHRvbl90ZXh0PVNsZXQNCi1kZXRhY2hCdXR0b25fdGV4dD1GcmlnXHUwMGY4cg0KLWRpYWdyYW1fc2F2ZUVycm9yPUZlamwgdW5kZXIgbGFncmluZyBhZiBkaWFncmFtDQotZG93bkJ1dHRvbl90ZXh0PU5lZA0KLWRpcmVjdG9yeV90ZXh0PUJpYmxpb3RlazoNCi1vcmRlckJ1dHRvbl90ZXh0PVJcdTAwZTZra2VmXHUwMGY4bGdlDQotZWRpdEJ1dHRvbl90ZXh0PVJlZGlnXHUwMGU5ci4uLg0KLXJlbW92ZUJ1dHRvbl90ZXh0PUZqZXJuDQotcmVuYW1lQWN0aW9uX3RleHQ9T21kXHUwMGY4Yi4uLg0KLXJlbW92ZV90ZXh0PUZqZXJuDQotcmVuYW1lX3RleHQ9T21kXHUwMGY4Yg0KLVNhdmVBc190ZXh0PUdlbSBzb20NCi1zZWxlY3RCdXR0b25fdGV4dD1WXHUwMGU2bGcuLi4NCi1kZXNlbGVjdEJ1dHRvbl90ZXh0PU9waFx1MDBlNnYgbWFya2VyaW5nDQotdXBCdXR0b25fdGV4dD1PcA0KLW1ha2VEZWZhdWx0QnV0dG9uX3RleHQ9QW5naXYgc29tIHN0YW5kYXJkDQotdmlld0hpc3RvcnlCdXR0b25fdGV4dD1WaXMgaGlzdG9yaWsuLi4NCi0NCi0jIFJvbGUgRWRpdG9yIFRhc2tzIFBhZ2UNCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25OYW1lPU9wZ2F2ZXINCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1EZW5uZSByb2xsZSB1ZGZcdTAwZjhyZXIgZlx1MDBmOGxnZW5kZSBvcGdhdmVyLg0KLXJvbGVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZ2Ugb3BnYXZlcg0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1QcmltXHUwMGU2ciB1ZGZcdTAwZjhyZW5kZToNCi1yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWwyPVlkZXJsaWdlcmUgdWRmXHUwMGY4cmVuZGU6DQotcm9sZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBvcGdhdmVyIGVyIHZhbGd0Lg0KLQ0KLSMgUm9sZSBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9QXJiZWpkc3Byb2R1a3RlcjoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QW5naXYgYXJiZWpkc3Byb2R1a3Rlciwgc29tIGRlbm5lIHJvbGxlIGVyIGFuc3ZhcmxpZyBmb3IuDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZ2UgYXJiZWpkc3Byb2R1a3RlcjoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPUFuc3ZhcmxpZyBmb3I6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9QXJiZWpkc3Byb2R1a3RlciBlciBvdXRwdXQgZnJhIG9wZ2F2ZXIsIHNvbSBkZW5uZSByb2xsZSB1ZGZcdTAwZjhyZXI6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gYXJiZWpkc3Byb2R1a3RlciBlciB2YWxndC4NCi0NCi0jIFJvbGUgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPVZlamxlZG5pbmcNCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1BbmdpdiBsaW5rIHRpbCBmbGVyZSBvcGx5c25pbmdlciBpIGZvcm0gYWYgdmVqbGVkbmluZy4NCi1yb2xlR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPVRpbGdcdTAwZTZuZ2VsaWcgdmVqbGVkbmluZzoNCi1yb2xlR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9VmVqbGVkbmluZzoNCi1yb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHZlamxlZG5pbmdlciBlciB2YWxndC4NCi0NCi0jIFJvbGUgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1LYXRlZ29yaWVyOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZSBrYXRlZ29yaWVyLCBzb20gZGVubmUgcm9sbGUgaFx1MDBmOHJlciB0aWwuDQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVJvbGxlc1x1MDBlNnQ6DQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1UaWxwYXNzZWRlIGthdGVnb3JpZXI6DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9Um9sbGVzXHUwMGU2dDoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9VGlscGFzc2VkZSBrYXRlZ29yaWVyOg0KLQ0KLSMgVGFzayBFZGl0b3IgUm9sZXMgUGFnZQ0KLXRhc2tSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9Um9sbGVyDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249VGlsZGVsIGRlIHJvbGxlciwgc29tIHNrYWwgdWRmXHUwMGY4cmUgZGVubmUgb3BnYXZlLg0KLXRhc2tSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZ2Ugcm9sbGVyOg0KLXRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1QcmltXHUwMGU2ciB1ZGZcdTAwZjhyZW5kZToNCi10YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVlkZXJsaWdlcmUgdWRmXHUwMGY4cmVuZGU6DQotdGFza1JvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSByb2xsZXIgZXIgdmFsZ3QuDQotdGFza1JvbGVzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX21vZGlmeV9tZXNzYWdlPUlVUEEwMDA0NVc6IFZpbCBkdSBcdTAwZTZuZHJlIGRlbiBwcmltXHUwMGU2cmUgdWRmXHUwMGY4cmVuZGUgdGlsICcnezB9Jyc/DQotdGFza1JvbGVzUGFnZV9jb25maXJtX3RpdGxlPUJla3JcdTAwZTZmdCBcdTAwZTZuZHJpbmcgYWYgcHJpbVx1MDBlNnIgcm9sbGUNCi0NCi0jIFRhc2sgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPUFyYmVqZHNwcm9kdWt0ZXINCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QW5naXYgaW5wdXQtIG9nIG91dHB1dGFyYmVqZHNwcm9kdWt0ZXIgZm9yIGRlbm5lIG9wZ2F2ZS4NCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1UaWxnXHUwMGU2bmdlbGlnZSBhcmJlamRzcHJvZHVrdGVyDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1QXHUwMGU1a3JcdTAwZTZ2ZWRlIGlucHV0Og0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPVZhbGdmcmkgaW5wdXQ6DQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDM9T3V0cHV0Og0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGFyYmVqZHNwcm9kdWt0ZXIgZXIgdmFsZ3QuDQotDQotIyBUYXNrIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1WZWpsZWRuaW5nDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QW5naXYgbGluayB0aWwgZmxlcmUgb3BseXNuaW5nZXIgaSBmb3JtIGFmIHZlamxlZG5pbmcuDQotdGFza0d1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1UaWxnXHUwMGU2bmdlbGlnIHZlamxlZG5pbmc6DQotdGFza0d1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPVZlamxlZG5pbmc6DQotdGFza0d1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB2ZWpsZWRuaW5nZXIgZXIgdmFsZ3QuDQotDQotIyBUYXNrIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9S2F0ZWdvcmllcg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZSBrYXRlZ29yaWVyLCBzb20gZGVubmUgb3BnYXZlIGhcdTAwZjhyZXIgdGlsLg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1EaXNjaXBsaW5lcg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9VGlscGFzc2VkZSBrYXRlZ29yaWVyDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9RGlzY2lwbGluZXI6DQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVRpbHBhc3NlZGUga2F0ZWdvcmllcjoNCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgVGFza3MgUGFnZQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25OYW1lPU9wZ2F2ZXINCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb249RGV0dGUgYXJiZWpkc3Byb2R1a3QgZXIgaW5wdXQgZWxsZXIgb3V0cHV0IGZvciBmXHUwMGY4bGdlbmRlIG9wZ2F2ZXIuDQotV29ya1Byb2R1Y3RfVGFza3NfQXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZ2Ugb3BnYXZlcg0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWw9UFx1MDBlNWtyXHUwMGU2dmV0IGlucHV0Og0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwyPVZhbGdmcml0IGlucHV0Og0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwzPU91dHB1dDoNCi1Xb3JrUHJvZHVjdF9UYXNrc19NdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBvcGdhdmVyIGVyIHZhbGd0Lg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBSb2xlcyBQYWdlDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9Um9sbGVyDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUZcdTAwZjhsZ2VuZGUgcm9sbGVyIGVyIGFuc3ZhcmxpZyBmb3IgZWxsZXIgXHUwMGU2bmRyZXIgZGV0dGUgYXJiZWpkc3Byb2R1a3QuDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZ2Ugcm9sbGVyDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1BbnN2YXJsaWcgcm9sbGU6DQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHUwMGM2bmRyZW5kZSByb2xsZXI6DQotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gcm9sbGVyIGVyIHZhbGd0Lg0KLQ0KLSMjIFdvcmsgUHJvZHVjdCBFZGl0b3IgRGVsaXZlcmFibGUgUGFydHMgUGFnZQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU9TGV2ZXJhbmNlZGVsZQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFuZ2l2IGRlIGFyYmVqZHNwcm9kdWt0ZXIsIHNvbSB1ZGdcdTAwZjhyIGRlbm5lIGxldmVyYW5jZS4NCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX2F2YWlsYWJsZUxhYmVsPVRpbGdcdTAwZTZuZ2VsaWdlIGFyYmVqZHNwcm9kdWt0ZXIgc29tIGRlbGUsIGRlciBrYW4gbGV2ZXJlczoNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlbGVjdGVkTGFiZWw9QXJiZWpkc3Byb2R1a3RlciBzb20gZGVsZSwgZGVyIGthbiBsZXZlcmVzOg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gYXJiZWpkc3Byb2R1a3RlciBlciB2YWxndC4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPVZlamxlZG5pbmcNCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QW5naXYgbGluayB0aWwgZmxlcmUgb3BseXNuaW5nZXIgaSBmb3JtIGFmIHZlamxlZG5pbmcuDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZyB2ZWpsZWRuaW5nOg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9VmVqbGVkbmluZzoNCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB2ZWpsZWRuaW5nZXIgZXIgdmFsZ3QuDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9S2F0ZWdvcmllcg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGUga2F0ZWdvcmllciwgc29tIGRldHRlIGFyYmVqZHNwcm9kdWt0IGhcdTAwZjhyZXIgdGlsLg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RG9tXHUwMGU2bmVyDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9QXJiZWpkc3Byb2R1a3R0eXBlcjoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMz1UaWxwYXNzZWRlIGthdGVnb3JpZXI6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPURvbVx1MDBlNm5lOg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9QXJiZWpkc3Byb2R1a3R0eXBlcjoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzPVRpbHBhc3NlZGUga2F0ZWdvcmllcjoNCi0NCi0jIFByYWN0aWNlIEVkaXRvciBSZWZlcmVuY2VzIFBhZ2UNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25OYW1lPUluZGhvbGRzZWxlbWVudGVyDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QW5naXYgZGUgaW5kaG9sZHNlbGVtZW50ZXIsIHNvbSBkZW5uZSBcdTAwZjh2ZWxzZSByZWZlcmVyZXIgdGlsLg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZ2UgaW5kaG9sZHNlbGVtZW50ZXI6DQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsPUluZGhvbGRzZWxlbWVudGVyOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gaW5kaG9sZHNlbGVtZW50ZXIgZXIgdmFsZ3QuDQotDQotIyBDYXRlZ29yeSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZT1WZWpsZWRuaW5nDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlbiB2ZWpsZWRuaW5nLCBzb20gaFx1MDBmOHJlciB0aWwgZGVubmUgezB9Lg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1UaWxnXHUwMGU2bmdlbGlnIHZlamxlZG5pbmc6DQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw9VmVqbGVkbmluZzoNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gdmVqbGVkbmluZ2VyIGVyIHZhbGd0Lg0KLQ0KLSMgRGlzY2lwbGluZSBHcm91cGluZyBFZGl0b3IgRGlzY2lwbGluZXMgUGFnZQ0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uTmFtZT1EaXNjaXBsaW5lcg0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZSBkaXNjaXBsaW5lciwgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIGRpc2NpcGxpbmdydXBwZS4NCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZ2UgZGlzY2lwbGluZXI6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw9RGlzY2lwbGluZXI6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGRpc2NpcGxpbmVyIGVyIHZhbGd0Lg0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfVXNlRGVmYXVsdERpcmVjdG9yeUJ1dHRvbkxhYmVsPUJydWcgc3RhbmRhcmRiaWJsaW90ZWsNCi0NCi0jIERpc2NpcGxpbmUgRWRpdG9yIFRhc2tzIFBhZ2UNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25OYW1lPU9wZ2F2ZXINCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlIG9wZ2F2ZXIsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZW5uZSBkaXNjaXBsaW4uDQotZGlzY2lwbGluZVRhc2tzUGFnZV9hdmFpbGFibGVMYWJlbD1UaWxnXHUwMGU2bmdlbGlnZSBvcGdhdmVyOg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1PcGdhdmVyOg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gb3BnYXZlciBlciB2YWxndC4NCi0NCi0jIERpc2NpcGxpbmUgRWRpdG9yIFJlZmVyZW5jZSBXb3JrZmxvdyBQYWdlDQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uTmFtZT1SZWZlcmVuY2VhcmJlamRzZ2FuZ2UNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlIHJlZmVyZW5jZWFyYmVqZHNnYW5nZSwgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIGRpc2NpcGxpbi4NCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX2F2YWlsYWJsZUxhYmVsPVRpbGdcdTAwZTZuZ2VsaWdlIHJlZmVyZW5jZWFyYmVqZHNnYW5nZToNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlbGVjdGVkTGFiZWw9UmVmZXJlbmNlYXJiZWpkc2dhbmdlOg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gcmVmZXJlbmNlYXJiZWpkc2dhbmdlIGVyIHZhbGd0Lg0KLQ0KLSMgRG9tYWluIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPUFyYmVqZHNwcm9kdWt0ZXINCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlIGFyYmVqZHNwcm9kdWt0ZXIsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZXR0ZSBkb21cdTAwZTZuZS4NCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVRpbGdcdTAwZTZuZ2VsaWdlIGFyYmVqZHNwcm9kdWt0ZXI6DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPUFyYmVqZHNwcm9kdWt0ZXI6DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBhcmJlamRzcHJvZHVrdGVyIGVyIHZhbGd0Lg0KLQ0KLSMgV29yayBQcm9kdWN0IEtpbmQgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9QXJiZWpkc3Byb2R1a3Rlcg0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGUgYXJiZWpkc3Byb2R1a3Rlciwgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIGFyYmVqZHNwcm9kdWt0dHlwZS4NCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVRpbGdcdTAwZTZuZ2VsaWdlIGFyYmVqZHNwcm9kdWt0ZXI6DQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPUFyYmVqZHNwcm9kdWt0ZXI6DQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBhcmJlamRzcHJvZHVrdGVyIGVyIHZhbGd0Lg0KLQ0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPVJvbGxlc1x1MDBlNnQNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGUgcm9sbGVzXHUwMGU2dCwgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIHJvbGxlc1x1MDBlNnRncnVwcGUuDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsPVRpbGdcdTAwZTZuZ2VsaWdlIHJvbGxlc1x1MDBlNnQ6DQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw9Um9sbGVzXHUwMGU2dDoNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gcm9sbGVzXHUwMGU2dCBlciB2YWxndC4NCi0NCi0jIFJvbGUgU2V0IEVkaXRvciBSb2xlcyBQYWdlDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1Sb2xsZXINCi1yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlIHJvbGxlciwgc29tIGhcdTAwZjhyZXIgdGlsIGRldHRlIHJvbGxlc1x1MDBlNnQuDQotcm9sZVNldFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1UaWxnXHUwMGU2bmdlbGlnZSByb2xsZXI6DQotcm9sZVNldFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVJvbGxlcjoNCi1yb2xlU2V0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHJvbGxlciBlciB2YWxndC4NCi0NCi0jIFRvb2wgRWRpdG9yIFRvb2wgTWVudG9ycyBQYWdlDQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uTmFtZT1WXHUwMGU2cmt0XHUwMGY4anNtZW50b3Jlcg0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGUgdlx1MDBlNnJrdFx1MDBmOGpzbWVudG9yZXIsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZXR0ZSB2XHUwMGU2cmt0XHUwMGY4ai4NCi10b29sVG9vbE1lbnRvcnNQYWdlX2F2YWlsYWJsZUxhYmVsPVRpbGdcdTAwZTZuZ2VsaWdlIHZcdTAwZTZya3RcdTAwZjhqc21lbnRvcmVyOg0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1WXHUwMGU2cmt0XHUwMGY4anNtZW50b3JlcjoNCi10b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHZcdTAwZTZya3RcdTAwZjhqc21lbnRvcmVyIGVyIHZhbGd0Lg0KLQ0KLSMgQ3VzdG9tIENhdGVnb3J5IEVkaXRvciBBc3NpZ24gUGFnZQ0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uTmFtZT1JbmRob2xkc2VsZW1lbnRlcg0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZSBpbmRob2xkc2VsZW1lbnRlciwgc29tIHVkZ1x1MDBmOHIgZGVubmUgdGlscGFzc2VkZSBrYXRlZ29yaS4NCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfYXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZ2UgaW5kaG9sZHNlbGVtZW50ZXI6DQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlbGVjdGVkTGFiZWw9SW5kaG9sZHNlbGVtZW50ZXI6DQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGluZGhvbGRzZWxlbWVudGVyIGVyIHZhbGd0Lg0KLQ0KLSMgTmV3IE1ldGhvZCBQbHVnLWluIFdpemFyZA0KLW5ld1BsdWdpbldpemFyZF90aXRsZT1OeSBtZXRvZGUtcGx1Z2luDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90aXRsZT1PcHJldCBlbiBueSBtZXRvZGUtcGx1Z2luDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0PUFuZ2l2IGV0IG5hdm4gc2FtdCBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGVuIG55ZSBtZXRvZGUtcGx1Z2luLg0KLW5ld1BsdWdpbkVycm9yX21zZz1JVVBBMDAyMUU6IEthbiBpa2tlIG9wcmV0dGUgbWV0b2RlLXBsdWdpbidlbi4NCi1uZXdQbHVnaW5FcnJvcl9yZWFzb249SW50ZXJuIGZlamwuXG5cDQotXG5cDQotS2xpayBwXHUwMGU1IE9wbHlzbmluZ2VyIGZvciBhdCBmXHUwMGU1IGZsZXJlIG9wbHlzbmluZ2VyLg0KLQ0KLSMgR2VuZXJpYyBkaWFsb2cgdGl0bGVzDQotY3JlYXRlRGlhbG9nX3RpdGxlPU9wcmV0IGVsZW1lbnQNCi1kZWxldGVEaWFsb2dfdGl0bGU9U2xldCBlbGVtZW50DQotZWRpdERpYWxvZ190aXRsZT1SZWRpZ1x1MDBlOXIgZWxlbWVudA0KLWVycm9yRGlhbG9nX3RpdGxlPUZlamwNCi1tb3ZlRGlhbG9nX3RpdGxlPUZseXQgZWxlbWVudA0KLXJlbmFtZURpYWxvZ190aXRsZT1PbWRcdTAwZjhiIGVsZW1lbnQNCi13YXJuaW5nRGlhbG9nX3RpdGxlPUFkdmFyc2VsDQotDQotIyBBZGQgQ29uZmlndXJhdGlvbiB0byBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWFkZENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPVRpbGZcdTAwZjhqIGtvbmZpZ3VyYXRpb24gdGlsIHByb2Nlcw0KLQ0KLSMgU2V0IERlZmF1bHQgQ29uZmlndXJhdGlvbiBFcnJvciBEaWFsb2cNCi1zZXREZWZhdWx0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9QW5naXYgc3RhbmRhcmRrb25maWd1cmF0aW9uIGZvciBwcm9jZXMNCi0NCi0jIEVkaXQgUHJvY2VzcyBFcnJvciBEaWFsb2cNCi1lZGl0UHJvY2Vzc0VsZW1lbnRFcnJvckRpYWxvZ190aXRsZT1SZWRpZ1x1MDBlOXIgcHJvY2VzZWxlbWVudA0KLQ0KLSMgT3BlbiBMaWJyYXJ5IERpYWxvZw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlPVx1MDBjNWJuIG1ldG9kZWJpYmxpb3Rlaw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RleHQ9RGV0IGFrdHVlbGxlIG1ldG9kZWJpYmxpb3RlayBlciBpa2tlIGdlbXQga29ycmVrdC4gVmlsIGR1IGlnbm9yZXJlIGZlamxlbiBvZyBcdTAwZTVibmUgZXQgYW5kZXQgYmlibGlvdGVrPw0KLQ0KLSMgU2F2ZSBMaWJyYXJ5IERpYWxvZw0KLXNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlPUdlbSBtZXRvZGViaWJsaW90ZWsNCi1zYXZlTGlicmFyeURpYWxvZ190ZXh0PURldCBha3R1ZWxsZSBtZXRvZGViaWJsaW90ZWsgZXIgXHUwMGU2bmRyZXQuIFZpbCBkdSBnZW1tZSBcdTAwZTZuZHJpbmdlcm5lPw0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPU9wZ3JhZFx1MDBlOXIgbWV0b2RlYmlibGlvdGVrDQotDQotIyBEZWxldGUgRWxlbWVudCBSZWZlcmVuY2UgRGlhbG9nDQotZGVsZXRlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD1FbGVtZW50ZXQgJyd7MH0nJyBlciBhbGxlcmVkZSBzbGV0dGV0LiBWaWwgZHUgZmplcm5lIGRldCBmcmEgJyd7MX0nJz8NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbm9PcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwMEU6IEludGV0IFx1MDBlNWJlbnQgbWV0b2RlYmlibGlvdGVrLlxuXA0KLVxuXA0KLUV0IG1ldG9kZWJpYmxpb3RlayBza2FsIHZcdTAwZTZyZSBcdTAwZTViZW50LCBmXHUwMGY4ciBldCBueXQgbWV0b2RlZWxlbWVudCBrYW4gdGlsZlx1MDBmOGplcy5cblwNCi1cblwNCi1PcHJldCBldCBueXQgbWV0b2RlYmlibGlvdGVrLCBlbGxlciBcdTAwZTVibiBldCBla3Npc3RlcmVuZGUgb2cgcHJcdTAwZjh2IGlnZW4uDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZz1JVVBBMDAwMUU6IE5hdm5ldCBwXHUwMGU1IHswfSBtYW5nbGVyLlxuXA0KLVxuXA0KLUFsbGUgbWV0b2RlLSBvZyBwcm9jZXNlbGVtZW50ZXIgc2thbCBoYXZlIGV0IG5hdm4uXG5cDQotXG5cDQotS2xpayBwXHUwMGU1IE9LLCBvZyBhbmdpdiBldCBneWxkaWd0IG5hdm4gcFx1MDBlNSBlbGVtZW50ZXQuDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFOiBOYXZuZXQgJyd7MH0nJyBmaW5kZXMgYWxsZXJlZGUuXG5cDQotXG5cDQotRXQgbWV0b2RlZWxlbWVudCBza2FsIGhhdmUgZXQgZW50eWRpZ3QgbmF2bi5cblwNCi1cblwNCi1LbGlrIHBcdTAwZTUgT0ssIG9nIGFuZ2l2IGV0IGFuZGV0IG5hdm4gcFx1MDBlNSBlbGVtZW50ZXQuDQotY3JlYXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDAzRTogTWV0b2Rla29uZmlndXJhdGlvbmVuIGthbiBpa2tlIG9wcmV0dGVzLg0KLWRlbGV0ZUNvbmZpZ0Vycm9yX21zZz1JVVBBMDAwNFc6IE1ldG9kZWtvbmZpZ3VyYXRpb25lbiBrYW4gaWtrZSBzbGV0dGVzLg0KLWludGVybmFsRXJyb3JfbXNnPUlVUEEwMDA1RTogRGVyIGVyIG9wc3RcdTAwZTVldCBlbiBpbnRlcm4gZmVqbC5cblwNCi1cblwNCi1LbGlrIHBcdTAwZTUgT3BseXNuaW5nZXIgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuDQotaW52YWxpZFByZXNlbnRhdGlvbk5hbWVFcnJvcl9tc2c9SVVQQTAwMDZFOiBEZXQgYW5naXZuZSBwclx1MDBlNnNlbnRhdGlvbnNuYXZuIGVyIHVneWxkaWd0LlxuXA0KLVxuXA0KLUtsaWsgcFx1MDBlNSBPSywgb2cgYW5naXYgZXQgYW5kZXQgbmF2bi4NCi1pbnZhbGlkQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDA3RTogRGVuIHZhbGd0ZSBtZXRvZGVrb25maWd1cmF0aW9uICcnezB9JycgZXIgaWtrZSBldCB1ZHNuaXQgYWYgcHJvY2Vzc2VucyBzdGFuZGFyZGtvbmZpZ3VyYXRpb24uXG5cDQotXG5cDQotRW4gcHJvY2VzJycgc3RhbmRhcmRrb25maWd1cmF0aW9uIHNrYWwgdlx1MDBlNnJlIGV0IHN1cGVyc1x1MDBlNnQgYWYgYWxsZSBhbmRyZSBrb25maWd1cmF0aW9uZXIsIGRlciBlciBrbnl0dGV0IHRpbCBwcm9jZXNzZW4sIGZvciBhdCBvcHJldGhvbGRlIGludGVncml0ZXRlbiBhZiBwcm9jZXNzZW4uXG5cDQotXG5cDQotVlx1MDBlNmxnIGVuIGFuZGVuIGtvbmZpZ3VyYXRpb24sIGVsbGVyIHJldmlkXHUwMGU5ciBzdGFuZGFyZGtvbmZpZ3VyYXRpb25lbiwgc1x1MDBlNSBkZW4gb21mYXR0ZXIgaW5kaG9sZGV0IGFmIGRlbiB2YWxndGUga29uZmlndXJhdGlvbiwgb2cgcHJcdTAwZjh2IGlnZW4uDQotc2V0RGVmYXVsdENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwOEU6IERlbiB2YWxndGUgbWV0b2Rla29uZmlndXJhdGlvbiAnJ3swfScnIGVyIGlra2UgZXQgc3VwZXJzXHUwMGU2dCBhZiBkZSBhbmRyZSBrb25maWd1cmF0aW9uZXIsIHNvbSBwcm9jZXNzZW4gaGVudmlzZXIgdGlsLlxuXA0KLVxuXA0KLUVuIHByb2NlcycnIHN0YW5kYXJka29uZmlndXJhdGlvbiBza2FsIHZcdTAwZTZyZSBldCBzdXBlcnNcdTAwZTZ0IGFmIGFsbGUgYW5kcmUga29uZmlndXJhdGlvbmVyLCBkZXIgZXIga255dHRldCB0aWwgcHJvY2Vzc2VuLCBmb3IgYXQgb3ByZXRob2xkZSBpbnRlZ3JpdGV0ZW4gYWYgcHJvY2Vzc2VuLlxuXA0KLVxuXA0KLVZcdTAwZTZsZyBlbiBhbmRlbiBrb25maWd1cmF0aW9uLCBlbGxlciByZXZpZFx1MDBlOXIgaW5kaG9sZGV0IGFmIGRlbiB2YWxndGUga29uZmlndXJhdGlvbiwgb2cgcHJcdTAwZjh2IGlnZW4uDQotb3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDlFOiBNZXRvZGViaWJsaW90ZWtldCBrYW4gaWtrZSBpbmRsXHUwMGU2c2VzLlxuXA0KLVxuXA0KLUtsaWsgcFx1MDBlNSBPcGx5c25pbmdlciBmb3IgYXQgZlx1MDBlNSBmbGVyZSBvcGx5c25pbmdlci4NCi1zYXZlTGlicmFyeUVycm9yX21zZz1JVVBBMDAxMEU6IE1ldG9kZWJpYmxpb3Rla2V0IGthbiBpa2tlIGdlbW1lcy4NCi1zYXZlTGlicmFyeVRvRXJyb3JfbXNnPUlVUEEwMDEwRTogTWV0b2RlYmlibGlvdGVrZXQga2FuIGlra2UgZ2VtbWVzIGkgJyd7MH0nJy4NCi1lbGVtZW50QWxyZWFkeURlbGV0ZWRFcnJvcl9tc2c9SVVQQTAwMTFFOiBFbGVtZW50ZXQgJyd7MH0nJyBlciBhbGxlcmVkZSBzbGV0dGV0Lg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEyRTogTWV0b2RlYmlibGlvdGVrZXQga2FuIGlra2Ugb3BncmFkZXJlcy4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQQTAwMTZFOiBEZXIgZXIgb3BzdFx1MDBlNWV0IGVuIGZlamwuXG5cDQotXG5cDQotS2xpayBwXHUwMGU1IE9wbHlzbmluZ2VyIGZvciBhdCBmXHUwMGU1IGZsZXJlIG9wbHlzbmluZ2VyLg0KLWludGVybmFsRXJyb3JfcmVhc29uPUlVUEEwMDE3RTogRGVyIGVyIG9wc3RcdTAwZTVldCBlbiBpbnRlcm4gZmVqbC5cblwNCi1cblwNCi1LbGlrIHBcdTAwZTUgT3BseXNuaW5nZXIgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuDQotdXBncmFkZUxpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMThFOiBEZXIgZXIgb3BzdFx1MDBlNWV0IGVuIGZlamwgdW5kZXIgaW5kbFx1MDBlNnNuaW5nIGFmIG1ldG9kZWJpYmxpb3Rla3NlbGVtZW50ZXJuZS5cblwNCi1cblwNCi1LbGlrIHBcdTAwZTUgT3BseXNuaW5nZXIgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuDQotc2F2ZVVwZ3JhZGVkTGlicmFyeUVycm9yX3JlYXNvbj1JVVBBMDAxOUU6IERlciBlciBvcHN0XHUwMGU1ZXQgZW4gZmVqbCB1bmRlciBsYWdyaW5nIGFmIGRldCBvcGdyYWRlcmVkZSBtZXRvZGViaWJsaW90ZWsuXG5cDQotXG5cDQotS2xpayBwXHUwMGU1IE9wbHlzbmluZ2VyIGZvciBhdCBmXHUwMGU1IGZsZXJlIG9wbHlzbmluZ2VyLg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1cdTAwYzVibmVyIG1ldG9kZWJpYmxpb3Rlay4uLg0KLXNhdmluZ0xpYnJhcnlUYXNrX25hbWU9R2VtbWVyIG1ldG9kZWJpYmxpb3Rlay4uLg0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9T3BncmFkZXJlciBtZXRvZGViaWJsaW90ZWsuLi4NCi1sb2FkaW5nTGlicmFyeUVsZW1lbnRzVGFza19uYW1lPUluZGxcdTAwZTZzZXIgbWV0b2RlYmlibGlvdGVrc2VsZW1lbnRlci4uLg0KLXNhdmluZ1VwZ3JhZGVkRWxlbWVudHNUYXNrX25hbWU9R2VtbWVyIG1ldG9kZWJpYmxpb3Rla3NlbGVtZW50ZXIgaSBueXQgZmlsZm9ybWF0Li4uDQotc2F2aW5nVGFza19uYW1lPUdlbW1lciAnJ3swfScnLi4uDQotc2F2aW5nRmlsZXNUYXNrX25hbWU9R2VtbWVyIGZpbGVyLi4uDQotZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU9UmV0dGVyIEdVSUQnZXIgbWVkIGluZGhvbGRzYmVza3JpdmVsc2UuLi4NCi1kZWxldGluZ0ludmFsaWRSZWZlcmVuY2VzVGFza19uYW1lPVNsZXR0ZXIgdWd5bGRpZ2UgcmVmZXJlbmNlci4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IFBlcnNwZWt0aXZldCBlciBzcGVjaWVsdCBkZXNpZ25ldCB0aWwgZGVuIGJlZHN0IG11bGlnZSBmcmVtdmlzbmluZyBhZiBIVE1MLXJlcHJcdTAwZTZzZW50YXRpb25lbiBhZiBtZXRvZGViaWJsaW90ZWtzZWxlbWVudGVybmUuIERldCBlciBpa2tlIG11bGlndCBhdCB0aWxmXHUwMGY4amUgZWxsZXIgdmlzZSBlbiBlZGl0b3IgaGVyLg0KLQ0KLSMgQ2hhbmdlIEhpc3RvcnkgRGlhbG9nDQotQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZT1IaXN0b3JpayBmb3IgXHUwMGU2bmRyaW5nc2Jlc2tyaXZlbHNlDQotQ2hhbmdlSGlzdG9yeURpYWxvZ19sYWJlbD1cdTAwYzZuZHJpbmdzaGlzdG9yaWs6DQotDQotIyBNZXRob2QgRWxlbWVudCBEZWxldGUgQWN0aW9uDQotY29uZmlybURlbGV0ZURpYWxvZ190aXRsZT1CZWtyXHUwMGU2ZnQgc2xldG5pbmcNCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZz1FciBkdSBzaWtrZXIgcFx1MDBlNSwgYXQgZHUgdmlsIHNsZXR0ZSAnJ3swfScnPw0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnV2l0aFJlZmVyZW5jZT1FciBkdSBzaWtrZXIgcFx1MDBlNSwgYXQgZHUgdmlsIHNsZXR0ZSAnJ3swfScnP1xuXA0KLVxuXA0KLUZcdTAwZjhsZ2VuZGUgZWxlbWVudChlcikgaW5kZWhvbGRlciByZWZlcmVuY2VyIHRpbCBlbGVtZW50KGVyKSwgZGVyIHNrYWwgc2xldHRlczogezF9DQotDQotIyBOZXcgTGlicmFyeSBEaWFsb2cNCi1lcnJvckRpYWxvZ19tZXNzYWdlPUlVUEEwMDIyRTogTWV0b2RlYmlibGlvdGVrZXQgJyd7MH0nJyBrYW4gaWtrZSBvcHJldHRlcy4NCi1lcnJvckRpYWxvZ19lcnJvcj1LYW4gaWtrZSBvcHJldHRlIGV0IG1ldG9kZWJpYmxpb3RlayBpbmRlIGkgZXQgYW5kZXQgbWV0b2RlYmlibGlvdGVrLg0KLWVycl9ub29wZW5saWJyYXJ5PUlVUEEwMDQwRTogSW50ZXQgXHUwMGU1YmVudCBtZXRvZGViaWJsaW90ZWsuXG5cDQotXG5cDQotRXQgbWV0b2RlYmlibGlvdGVrIHNrYWwgdlx1MDBlNnJlIFx1MDBlNWJlbnQsIGZcdTAwZjhyIGVuIG55IG1ldG9kZS1wbHVnaW4ga2FuIHRpbGZcdTAwZjhqZXMuXG5cDQotXG5cDQotT3ByZXQgZXQgbnl0IG1ldG9kZWJpYmxpb3RlaywgZWxsZXIgXHUwMGU1Ym4gZXQgZWtzaXN0ZXJlbmRlIG9nIHByXHUwMGY4diBpZ2VuLg0KLWVycl9sb2FkaW5nbGlicmFyeT1GZWpsIHVuZGVyIGluZGxcdTAwZTZzbmluZyBhZiBiaWJsaW90ZWsNCi1tc2dfcmVsb2FkTGlicmFyeT1GZWpsIHVuZGVyIGZvcnRyeWRlbHNlIGFmIGRlbiBtaXNseWtrZWRlIHNsZXRuaW5nLiBEZXQgYWt0dWVsbGUgbWV0b2RlYmlibGlvdGVrIHNrYWwgZ2VuaW5kbFx1MDBlNnNlcy4NCi0NCi0jIFJlbG9hZCBMaWJyYXJ5IERpYWxvZw0KLXJlbG9hZERpYWxvZ19tZXNzYWdlPUJpYmxpb3Rla2V0IHNrYWwgZ2VuaW5kbFx1MDBlNnNlcyBmb3IgYXQgZ2VuZGFubmUgZGV0cyBvcHJpbmRlbGlnZSB0aWxzdGFuZC4NCi1yZWxvYWREaWFsb2dfdGl0bGU9R2VuaW5kbFx1MDBlNnMgYmlibGlvdGVrDQotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yVGl0bGU9RmVqbCB1bmRlciBmbHl0bmluZw0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U9RmVqbCB1bmRlciBmbHl0bmluZw0KLQ0KLSMgUHJvY2VzcyBGb3JtIEVkaXRvcg0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZT1HZW0NCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTE9RGVubmUgXHUwMGU2bmRyaW5nIHBcdTAwZTV2aXJrZXIgYWxsZSBkaWFncmFtbWVyIGkgcHJvY2Vzc2VuLiBFZGl0b3JlbiBibGl2ZXIgZ2VtdCBlZnRlciBkaW4gXHUwMGU2bmRyaW5nLiBWaWwgZHUgZm9ydHNcdTAwZTZ0dGU/DQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UyPUVkaXRvcmVuIGJsaXZlciBnZW10IGVmdGVyIGRpbiBcdTAwZTZuZHJpbmcuIFZpbCBkdSBmb3J0c1x1MDBlNnR0ZT8NCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBQYWdlDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPUJla3JcdTAwZTZmdCBzbGV0bmluZw0KLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlPUVyIGR1IHNpa2tlciBwXHUwMGU1LCBhdCBkdSB2aWwgZmplcm5lIG92ZXJzaWd0ZW4gJyd7MH0nJz8NCi1jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfdGl0bGU9QWR2YXJzZWwNCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uPUtvbmZpZ3VyYXRpb246DQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdzPUtvbmZpZ3VyYXRpb25zb3ZlcnNpZ3Rlcg0KLWNvbmZpZ1ZpZXdQYWdlX3ZpZXdzPU92ZXJzaWd0ZXINCi1jb2x1bW5zZWxlY3Rpb25fdGV4dD1Lb2xvbm5ldmFsZzoNCi1jb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dD1UaWxmXHUwMGY4aiBvdmVyc2lndC4uLg0KLWNvbmZpZ1ZpZXdQYWdlX3JlbW92ZVZpZXdCdXR0b25UZXh0PUZqZXJuIG92ZXJzaWd0DQotY29uZmlnVmlld1BhZ2VfbWFrZURlZmF1bHRCdXR0b25UZXh0PUFuZ2l2IHNvbSBzdGFuZGFyZA0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlPUlVUEEwMDIzVzogT3ZlcnNpZ3RlbiAnJ3swfScnIGZpbmRlcyBhbGxlcmVkZS4NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25UaXRsZT1QdWJsaWNlcmVkZSBuYXZpZ2F0aW9uc292ZXJzaWd0ZXINCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25NZXNzYWdlPUFuZ2l2IGRlIG92ZXJzaWd0ZXIsIHNvbSBpbmtsdWRlcmVzLCBuXHUwMGU1ciBkZW5uZSBrb25maWd1cmF0aW9uIHB1YmxpY2VyZXMuIER1IG9wcmV0dGVyIGVuIG92ZXJzaWd0IHZlZCBhdCBrbGlra2UgcFx1MDBlNSBUaWxmXHUwMGY4aiBvdmVyc2lndCBvZyB2XHUwMGU2bGdlIGVuIHN0YW5kYXJkIGVsbGVyIHRpbHBhc3NldCBrYXRlZ29yaSBpIGtvbmZpZ3VyYXRpb25lbi4gRGVuIHZhbGd0ZSBrYXRlZ29yaSByZXByXHUwMGU2c2VudGVyZXIgb3ZlcnNpZ3Rlbiwgb2cga2F0ZWdvcmllbnMgdW5kZXJrYXRlZ29yaWVyIG9nIGluZGhvbGRzZWxlbWVudGVyIHJlcHJcdTAwZTZzZW50ZXJlciBvdmVyc2lndGVucyB0clx1MDBlNnN0cnVrdHVyZWxlbWVudGVyLg0KLQ0KLSMgRGVzY3JpcHRpb24gVGFiDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU9S29udmVydFx1MDBlOXIgdmVqbGVkbmluZw0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxPUlVUEEwMDQwVzogR2VtIGVkaXRvcmVuIGZcdTAwZjhyc3QuDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTI9RGVyIGVyIGluZ2VuIGtvbXBhdGliZWwgdmVqbGVkbmluZyBmb3IgZGVubmUgdHlwZS4NCi0NCi1jaGFuZ2VBY3Rpdml0eVR5cGVXYXJuaW5nRGlhbG9nX3RpdGxlPUtvbnZlcnRcdTAwZTlyIGFrdGl2aXRldA0KLSMgQXNzb2NpYXRpb24gRm9ybSBQYWdlDQotQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWw9S29ydCBiZXNrcml2ZWxzZSBhZiB2YWxndCBlbGVtZW50Og0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVzY3JpcHRpb24NCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfdGl0bGU9QW5naXYgZWxlbWVudG5hdm4NCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfbWVzc2FnZT1OYXZuZWZlbHRldCBtXHUwMGU1IGlra2Ugdlx1MDBlNnJlIHRvbXQuDQotDQotIyBNZXRob2QgUGx1Zy1pbiBEZXNjcmlwdGlvbg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUmVtb3ZlUmVmQ29uZmlybV9tZXNzYWdlPUh2aXMgZHUgZnJhdlx1MDBlNmxnZXIgZGVuIGVsbGVyIGRlIHJlZmVyZXJlZGUgcGx1Z2lucywgZGVyIGVyIGtueXR0ZXQgdGlsIHBsdWdpbicnZW4gJyd7MH0nJywgb3BzdFx1MDBlNXIgZGVyIHVneWxkaWdlIHJlbGF0aW9uZXIsIHNvbSB2aWwgYmxpdmUgc2xldHRldC5cblwNCi1cblwNCi1EZW5uZSBmdW5rdGlvbiBrYW4gaWtrZSBmb3J0cnlkZXMuIFZpbCBkdSBmb3JldGFnZSBkZW5uZSBcdTAwZTZuZHJpbmc/DQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU9RHUgZXIgdmVkIGF0IFx1MDBlNm5kcmUgbmF2biBwXHUwMGU1IGRlbm5lIG1ldG9kZS1wbHVnaW4gZnJhICcnezB9JycgdGlsIGRldCBueWUgbmF2biAnJ3sxfScnLiBEZW5uZSBmdW5rdGlvbiBnZW1tZXIgZWRpdG9yZW4gb2cgb21kXHUwMGY4YmVyIHBsdWdpbi1mb2xkZXJlbiB0aWwgZGV0IG55ZSBuYXZuLiBWaWwgZHUgZm9ydHNcdTAwZTZ0dGU/DQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWVfdGl0bGU9T21kXHUwMGY4YiBtZXRvZGUtcGx1Z2luDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2Nhbm5vdFJlbmFtZVBsdWdpbkZvbGRlcj1LYW4gaWtrZSBvbWRcdTAwZjhiZSBwbHVnaW4tZm9sZGVyIHRpbCBkZXQgbnllIG5hdm4NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbkxhYmVsPUxcdTAwZTVzIHBsdWdpbg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luX21lc3NhZ2U9TFx1MDBlNXNuaW5nIGFmIHBsdWdpbi1cdTAwZTZuZHJpbmcgZ2VtbWVyIG9nIGx1a2tlciBcdTAwZTVibmUgZWRpdG9yZXIgdGlsIGVsZW1lbnRlciwgc29tIGhcdTAwZjhyZXIgdGlsIHBsdWdpbicnZW4gJyd7MH0nJy4gVmlsIGR1IGZvcmV0YWdlIGRlbm5lIFx1MDBlNm5kcmluZz8NCi0NCi0jIFByb2Nlc3MgRGVzY3JpcHRpb24NCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV90aXRsZT1PbWRcdTAwZjhiDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZT1EdSBlciB2ZWQgYXQgXHUwMGU2bmRyZSBuYXZuZXQgcFx1MDBlNSBwcm9jZXNzZW4uIERlbm5lIGZ1bmt0aW9uIGdlbW1lciBlZGl0b3JlbiBvZyBvbWRcdTAwZjhiZXIgcHJvY2VzZm9sZGVyZW4gdGlsIGRldCBueWUgbmF2bi4gVmlsIGR1IGZvcnRzXHUwMGU2dHRlPw0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uRGVzY3JpcHRpb249QmVza3JpdmVsc2U6DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uVGl0bGU9S29uZmlndXJhdGlvbg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvbk1lc3NhZ2U9QW5naXYgYWxsZSBneWxkaWdlIGtvbmZpZ3VyYXRpb25lciBmb3IgZGVubmUgcHJvY2VzLiBWXHUwMGU2bGcgXHUwMGU5biBrb25maWd1cmF0aW9uIHNvbSBzdGFuZGFyZC4gRGVuIHNrYWwgdlx1MDBlNnJlIGV0IHN1cGVyc1x1MDBlNnQgYWYgYWxsZSBkZSBhbmRyZSBrb25maWd1cmF0aW9uZXIuDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25zPUtvbmZpZ3VyYXRpb25lcjoNCi1wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdD0oc3RhbmRhcmQpDQotUHJvY2Vzc0Rlc2NyaXB0aW9uX3NlbGVjdENvbmZpZ3VyYXRpb249Vlx1MDBlNmxnIGtvbmZpZ3VyYXRpb25lciwgZGVyIHNrYWwgdGlsZlx1MDBmOGplcw0KLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQwPURlbm5lIGZ1bmt0aW9uIGdlbW1lciBkZW4gYWt0dWVsbGUgZWRpdG9yLCBvZyBcdTAwZTZuZHJpbmdlbiB2aWwgdlx1MDBlNnJlIHBlcm1hbmVudC4gRXIgZHUgc2lra2VyIHBcdTAwZTUsIGF0IGR1IHZpbCBzbGV0dGUgJyd7MH0nJz8NCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX3NlbGVjdERlc2NyaXB0b3JzVG9EZWxldGU9Rlx1MDBmOGxnZW5kZSBkZXNrcmlwdG9yZXIgYnJ1Z2VzIGluZ2VuIHN0ZWRlciBlZnRlciBzbGV0bmluZyBhZiBkZSB2YWxndGUgZWxlbWVudGVyLlxuXA0KLVZcdTAwZTZsZyBkZSBkZXNrcmlwdG9yLCBkdSB2aWwgc2xldHRlLg0KLQ0KLSMgVmlldyBIZWxwZXINCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfdGl0bGU9SGVsYnJlZHN1bmRlcnNcdTAwZjhnZWxzZSBhZiBiaWJsaW90ZWsNCi12aWV3SGVscGVyX3BlcmZvcm1IZWFsdGhDaGVjaz1VZGZcdTAwZjhyZXIgaGVsYnJlZHN1bmRlcnNcdTAwZjhnZWxzZSBhZiBiaWJsaW90ZWsuLi4NCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZT1IZWxicmVkc3VuZGVyc1x1MDBmOGdlbHNlbiBhZiBcdTAwZTViZW50IGJpYmxpb3RlayBlciBhZnNsdXR0ZXQuIFJhcHBvcnRlbiBmaW5kZXMgaSBsb2dmaWxlbi4NCi0NCi0jIEF0dGFjaCBUZW1wbGF0ZSBGaWxlIERpYWxvZw0KLWF0dGFjaFRlbXBsYXRlRmlsZURpYWxvZ190aXRsZT1WZWRoXHUwMGU2ZnQgc2thYmVsb25maWwNCi0NCi0jIENyZWF0ZSBFbGVtZW50IEVycm9yIERpYWxvZw0KLWNyZWF0ZUVsZW1lbnREaWFsb2dfdGl0bGU9T3ByZXQgbnl0IHswfQ0KLWNyZWF0ZU5ld0VsZW1lbnRFcnJvcl9tc2c9RmVqbCB1bmRlciBvcHJldHRlbHNlIGFmIG55dCB7MH0uDQotDQotZGxnVGl0bGVfcmVsb2FkTGlicmFyeT1HZW5pbmRsXHUwMGU2cyBiaWJsaW90ZWsNCi1jcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uPU5hdm5ldCBwXHUwMGU1IHswfSBza2FsIHVkZnlsZGVzLlxuXA0KLVxuXA0KLUFuZ2l2IGV0IGd5bGRpZ3QgbmF2biwgb2cgcHJcdTAwZjh2IGlnZW4uDQotZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uPVByb2Nlc3NlbiAnJ3swfScnIHJlZmVyZXJlciB0aWwga29uZmlndXJhdGlvbmVuDQotDQotIyBDaGFuZ2VCb3VuZHNDb21tYW5kDQotZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw9UmV2aWRcdTAwZTlyIGdyXHUwMGU2bnNlcg0KLSMgQ2hhbmdlTmFtZUNvbW1hbmQNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw9UmV2aWRcdTAwZTlyIG5hdm4NCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U9S2FuIGlra2UgZm9ydHJ5ZGUgbmF2bmVcdTAwZTZuZHJpbmdlbi5cblwNCi1cblwNCi1OYXZuZVx1MDBlNm5kcmluZyBrYW4gaWtrZSBmb3J0cnlkZXMsIGh2aXMgZGV0IGZvcnJpZ2UgbmF2biBlciB0b210Lg0KLSMgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQNCi1nZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw9UmV2aWRcdTAwZTlyIGVnZW5za2Fic3ZcdTAwZTZyZGkNCi0jIENyZWF0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfY3JlYXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1PcHJldCBiXHUwMGY4am5pbmdzcHVua3QNCi0jIENyZWF0ZUxpbmtDb21tYW5kDQotZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsPUxpbmtvcHJldHRlbHNlDQotIyBDcmVhdGVOb2RlQ29tbWFuZA0KLWdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbD1PcHJldCBueSBub2RlDQotIyBEZWxldGVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9U2xldCBiXHUwMGY4am5pbmdzcHVua3QNCi0jIERlbGV0ZUNvbW1hbmQNCi1nZWZfZGVsZXRlQ29tbWFuZF9sYWJlbD1TbGV0DQotIyBEZWxldGVMaW5rQ29tbWFuZA0KLWdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbD1TbGV0IGZvcmJpbmRlbHNlDQotIyBNb3ZlQmVuZHBvaW50Q29tbWFuZA0KLWdlZl9tb3ZlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1GbHl0IGJcdTAwZjhqbmluZ3NwdW5rdA0KLSMgUmVjb25uZWN0TGlua0NvbW1hbmQNCi1nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw9Rm9yYmluZCBsaW5rIGlnZW4NCi0NCi0jIFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0PU5hdm5ldCBza2FsIHVkZnlsZGVzLiBBbmdpdiBldCBneWxkaWd0IG5hdm4uDQotIyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9TmF2bmV0IHNrYWwgdWRmeWxkZXMuIEFuZ2l2IGV0IGd5bGRpZ3QgbmF2bi4NCi0jIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0DQotZ2VmX3dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0X3ZhbGlkYXRlTWVzc2FnZT1OYXZuZXQgc2thbCB1ZGZ5bGRlcy4gQW5naXYgZXQgZ3lsZGlndCBuYXZuLg0KLQ0KLSMgRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uDQotYWN0aW9uc19FbGVtZW50c1ZpZXdEZWxldGVBY3Rpb25fbWVzc2FnZT1Lb25maWd1cmF0aW9uZW4gJyd7MH0nJyBrYW4gaWtrZSBzbGV0dGVzLCBmb3JkaSBkZW4gc3RhZGlnIGJydWdlcyBhZiBwcm9jZXNzZW4gJyd7MX0nJy4NCi0NCi0jIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcg0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU9RmVqbCB1bmRlciBzbGV0bmluZw0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yTWVzc2FnZT1VYmVoYW5kbGV0IHVuZHRhZ2Vsc2UNCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclJlYXNvbj1TZSBvcGx5c25pbmdlcg0KLQ0KLSMgTWV0aG9kRWxlbWVudEVkaXRvcg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZT1GZWpsIHVuZGVyIGxhZ3JpbmcNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTE9SVVQQTAwMjBFOiBGZWpsIHVuZGVyIGxhZ3JpbmcgYWYgZmlsDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UyPUZlamwgdW5kZXIgY29tbWl0DQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjE9RGVyIGVyIGZsZXJlIG9wbHlzbmluZ2VyIGkgbG9nZmlsZW4NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMj1TZSBvcGx5c25pbmdlcg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvclRpdGxlPUZlamwgdW5kZXIgb21kXHUwMGY4Ym5pbmcNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvck1zZz1FbiBlbGxlciBtYW5nZSBmaWxlciB0aWwgZGVubmUgZWRpdG9yIGVyIGZqZXJuZXQuIEVkaXRvcmVuIGVyIGlra2UgbFx1MDBlNm5nZXJlIGd5bGRpZyBvZyBza2FsIGx1a2tlcy4NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvclRpdGxlPVVneWxkaWcgZWRpdG9yDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yTWVzc2FnZTE9RmVqbCB1bmRlciBvbWRcdTAwZjhibmluZyBhZiBmaWwoZXIpICcnezB9JycNCi0NCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1yZW5hbWVFcnJvcl90aXRsZT1PbWRcdTAwZjhiIGVsZW1lbnQNCi1yZW5hbWVFcnJvcl9tc2c9SVVQQTAwMTNFOiBPbWRcdTAwZjhibmluZ2VuIGthbiBpa2tlIHVkZlx1MDBmOHJlcy4NCi1TZWxlY3RFbGVtZW50RGlhbG9nX3NlbGVjdGVsZW1lbnRfdGV4dD1WXHUwMGU2bGcgZWxlbWVudA0KLQ0KLSMgRWRpdG9yQ2hvb3Nlcg0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ190aXRsZT1cdTAwYzVibiBtZXRvZGVlZGl0b3INCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Rlc2NyaXB0aW9uTGFiZWw9QmVza3JpdmVsc2U6DQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX1NlbGVjdEFsbEJ1dHRvbkxhYmVsPU1hcmtcdTAwZTlyIGFsbGUNCi1PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDA9UmVkaWdcdTAwZTlyIGVsZW1lbnQNCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfbWVzc2FnZT1JVVBBMDAyM0U6IEthbiBpa2tlIFx1MDBlNWJuZSBlZGl0b3IsIGRlciBlciBrbnl0dGV0IHRpbCBkZXQgdmFsZ3RlIG1ldG9kZWVsZW1lbnQuDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9JY29uRmlsZUNob29zZXJEaWFsb2dfdGl0bGU9Vlx1MDBlNmxnIGJpbGxlZGZpbA0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVmYXVsdExpYnJhcnlOYW1lPU55dCBiaWJsaW90ZWsNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVzY3JpcHRpb25MYWJlbD1CZXNrcml2ZWxzZToNCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1WXHUwMGU2bGcgZW4gZWxsZXIgZmxlcmUgbWV0b2Rla29uZmlndXJhdGlvbmVyLCBvZyBrbGlrIHBcdTAwZTUgQWZzbHV0IGZvciBhdCBcdTAwZTVibmUgZGVtLg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsPU9waFx1MDBlNnYgbWFya2VyaW5nIGFmIGFsbGUNCi1FbGVtZW50c1ZpZXdfbWlncmF0aW9uX2Rpcl9kbGdfZGVzY3JpcHRpb25fdGV4dD1BbmdpdiBiaWJsaW90ZWtldCBtZWQgbnlsaWd0IG1pZ3JlcmV0IHswfSBmb3IgYXQgZXJzdGF0dGUgZGUgdmFsZ3RlIHswfQ0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19yZWFzb249RGVyIGVyIG9wc3RcdTAwZTVldCBlbiBzeXN0ZW1mZWpsLiBLbGlrIHBcdTAwZTUgT3BseXNuaW5nZXIgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuXG5cDQotXG5cDQotTHVrIG5vZ2xlIGFmIGRlIFx1MDBlNWJuZSBlZGl0b3Jlciwgb2cgcHJcdTAwZjh2IGlnZW4uDQotDQotIyBEZXNjcmlwdGlvbkZvcm1QYWdlDQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190aXRsZT1CaWxsZWRlIGVyIHVneWxkaWd0Lg0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzFFOiBEZXQgdmFsZ3RlIGJpbGxlZGUgJyd7MH0nJyBlciBzdFx1MDBmOHJyZSBlbmQgZGVuIHRpbGxhZHRlIHN0XHUwMGY4cnJlbHNlICh7MX0geCB7Mn0pLiBWXHUwMGU2bGcgZXQgYW5kZXQgYmlsbGVkZS4NCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGU9QmlsbGVkZSBlciB1Z3lsZGlndC4NCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzJFOiBEZW4gdmFsZ3RlIGZpbCAnJ3swfScnIGZpbmRlcyBpa2tlLiBWXHUwMGU2bGcgZXQgYW5kZXQgYmlsbGVkZS4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9Vlx1MDBlNmxnLi4uDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uPUJlc2tyaXZlbHNlIGFmIG1ldG9kZWJpYmxpb3Rlaw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1CZXNrcml2ZWxzZSBhZiBtZXRvZGVrb25maWd1cmF0aW9uDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VEZXNjcmlwdGlvbj1BbGxlIGVkaXRvcmVyIHNrYWwgbHVra2VzLiBWXHUwMGU2bGcgZGVtLCBkZXIgc2thbCBmXHUwMGY4cnN0IHNrYWwgZ2VtbWVzLCBodmlzIGRldCBlciByZWxldmFudC4NCi0NCi0jIFRlbXBsYXRlRGVzY3JpcHRpb25QYWdlDQotZm9ybXNfVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2VfYWxyZWFkeUF0dGFjaGVkX21zZz1EZW4gdmFsZ3RlIGZpbCBlciBhbGxlcmVkZSBlbiB2ZWRoXHUwMGU2ZnRuaW5nIHRpbCBkZW5uZSBza2FiZWxvbi4NCi0NCi0jIE5ldyBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLW5ld0xpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFOiBNZXRvZGViaWJsaW90ZWtldCBrYW4gaWtrZSBvcHJldHRlcy4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMT1EZW4gYW5naXZuZSBtZXRvZGViaWJsaW90ZWtzc3RpICcnezB9JycgZXIgdWd5bGRpZy4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMj1EZXIgZmluZGVzIGFsbGVyZWRlIGV0IG1ldG9kZWJpYmxpb3RlayBpICcnezB9JycuDQotbmV3TGlicmFyeUVycm9yX3JlYXNvbjM9RGVuIGFuZ2l2bmUgbWV0b2RlYmlibGlvdGVrc2ZvbGRlciAnJ3swfScnIGthbiBpa2tlIG9wcmV0dGVzLg0KLW5ld0xpYnJhcnlFcnJvcl9hZHZpY2U9Vlx1MDBlNmxnIE9LIGZvciBhdCBhbmdpdmUgZXQgYW5kZXQgbmF2biBlbGxlciBlbiBhbmRlbiBzdGkgZm9yIGJpYmxpb3Rla2V0Lg0KLQ0KLSNQcm9jZXNzIGxpdGVyYWxzDQotUHJvY2Vzc19FeHRlcm5hbElEPUVrc3Rlcm4gaWQ6DQotUHJvY2Vzc19QdXJwb3NlPUZvcm1cdTAwZTVsOg0KLVByb2Nlc3NfU2NvcGU9T21mYW5nOg0KLVByb2Nlc3NfVXNhZ2VOb3Rlcz1CcnVnc2JlbVx1MDBlNnJrbmluZ2VyOg0KLVByb2Nlc3NfQWx0ZXJuYXRpdmVzPUFsdGVybmF0aXZlcjoNCi1Qcm9jZXNzX0hvd1RvU3RhZmY9QmVtYW5kaW5nOg0KLVByb2Nlc3NfS2V5Q29uc2lkZXJhdGlvbj1OXHUwMGY4Z2xlb3ZlcnZlamVsc2VyOg0KLVByb2Nlc3NfU2NhbGU9U2thbGE6DQotUHJvY2Vzc19Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPVByb2pla3RrYXJha3RlcmlzdGlrYToNCi1Qcm9jZXNzX1Jpc2tMZXZlbD1SaXNpa29uaXZlYXU6DQotUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlPUVzdGltZXJpbmdzdGVrbmlrOg0KLVByb2Nlc3NfUHJvamVjdE1lbWJlckV4cGVydGlzZT1Qcm9qZWt0ZGVsdGFnZXItIGtvbXBldGVuY2U6DQotUHJvY2Vzc19UeXBlT2ZDb250cmFjdD1Lb250cmFrdHR5cGU6DQotDQotIyBFZGl0b3IgUHJldmlldyBOYXZpZ2F0aW9uIEJ1dHRvbnMNCi1iYWNrQnV0dG9uX3RleHQ9VGlsYmFnZQ0KLWZvcndhcmRCdXR0b25fdGV4dD1GcmVtDQotZm9yd2FyZF90ZXh0PUZyZW0NCi1zdG9wQnV0dG9uX3RleHQ9U3RvcA0KLXJlZnJlc2hCdXR0b25fdGV4dD1PcGZyaXNrDQotcmVmcmVzaF90ZXh0PU9wZnJpc2sNCi1uZXduYW1lX3RleHQ9Tnl0IG5hdm46DQotcHJpbnRCdXR0b25fdGV4dD1VZHNrcml2DQotDQotIyBDb250ZXh0IG1lbnVzDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPSZPcGZyaXNrDQotX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW09JlZpcyBlZ2Vuc2thYmVyDQotDQotX1VJX01ldGhvZEVkaXRvcl9tZW51PSZNZXRvZGVlZGl0b3INCi1fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtPSZOeQ0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1OJnkgc2lkZW9yZG5ldA0KLQ0KLV9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsPVZhbGcNCi1fVUlfUGFyZW50UGFnZV9sYWJlbD1PdmVyb3JkbmV0DQotX1VJX0xpc3RQYWdlX2xhYmVsPUxpc3RlDQotX1VJX1RyZWVQYWdlX2xhYmVsPVRyXHUwMGU2c3RydWt0dXINCi1fVUlfVGFibGVQYWdlX2xhYmVsPVRhYmVsDQotX1VJX1RhYmxlVHJlZVBhZ2VfbGFiZWw9VGFiZWx0clx1MDBlNnN0cnVrdHVyDQotX1VJX09iamVjdENvbHVtbl9sYWJlbD1PYmpla3QNCi1fVUlfU2VsZkNvbHVtbl9sYWJlbD1TZWx2DQotDQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9SW50ZXQgdmFsZ3QNCi1fVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQ9VmFsZ3Qgb2JqZWt0OiB7MH0NCi1fVUlfTXVsdGlPYmplY3RTZWxlY3RlZD17MH0gdmFsZ3RlIG9iamVrdGVyDQotDQotX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbD1cdTAwYzVibiBlZGl0b3INCi0NCi1fVUlfV2l6YXJkX2NhdGVnb3J5PUd1aWRlciB0aWwgb3ByZXR0ZWxzZSBhZiBla3NlbXBlbC1FTUYtbW9kZWwNCi0NCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfbGFiZWw9TWV0b2RlbW9kZWwNCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfZGVzY3JpcHRpb249T3ByZXQgZW4gbnkgbWV0b2RlbW9kZWwNCi0NCi1fVUlfTWV0aG9kRWRpdG9yX2xhYmVsPU1ldG9kZW1vZGVsZWRpdG9yDQotDQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2U9TWluDQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9uPW1ldG9kZQ0KLQ0KLV9VSV9XaXphcmRfbGFiZWw9TnkNCi0NCi1fV0FSTl9GaWxlbmFtZUV4dGVuc2lvbj1GaWxuYXZuZXQgc2thbCBzbHV0dGUgbWVkICcnLnswfScnDQotDQotX1VJX01vZGVsT2JqZWN0PU1vZGVsb2JqZWt0DQotX1VJX1hNTEVuY29kaW5nPVhNTC1rb2RuaW5nDQotX1VJX1hNTEVuY29kaW5nQ2hvaWNlcz1VVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQ0KLV9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb249Vlx1MDBlNmxnIGV0IG1vZGVsb2JqZWt0LCBkZXIgc2thbCBvcHJldHRlcw0KLQ0KLV9VSV9GaWxlQ29uZmxpY3RfbGFiZWw9Rmlsa29uZmxpa3QNCi1fV0FSTl9GaWxlQ29uZmxpY3Q9RGVyIGVyIGVuIGtvbmZsaWt0IG1lbGxlbSBpa2tlLWdlbXRlIFx1MDBlNm5kcmluZ2VyIG9nIFx1MDBlNm5kcmluZ2VyLCBkZXIgZXIgZm9yZXRhZ2V0IHVkZW4gZm9yIGVkaXRvcmVuLiBWaWwgZHUgc2xldHRlIFx1MDBlNm5kcmluZ2VybmUgaSBlZGl0b3Jlbj8NCi0NCi0jIEFkZCBMaW5rIERpYWxvZw0KLWFkZExpbmtEaWFsb2dfbGlua1R5cGU9VHlwZToNCi1vcGVuTGlua0NoZWNrYm94X3RleHQ9XHUwMGM1Ym4gbGluayBpIHNlcGFyYXQgYnJvd3NlcnZpbmR1ZQ0KLQ0KLSMgQWRkIEltYWdlIERpYWxvZw0KLWhlaWdodExhYmVsX3RleHQ9SFx1MDBmOGpkZToNCi13aWR0aExhYmVsX3RleHQ9QnJlZGRlOg0KLUVsZW1lbnRzVmlld18yMD1mdW5rdGlvbnNtXHUwMGY4bnN0ZXINCi1FbGVtZW50c1ZpZXdfMjE9bGV2ZXJpbmdzcHJvY2VzDQotRWxlbWVudHNWaWV3XzIyPXByb2Nlcw0KLUVsZW1lbnRzVmlld18zNT17MH0gZXIgc2tyaXZlYmVza3l0dGV0LiBHXHUwMGY4ciBkZXQgcmVkaWdcdTAwZTlyYmFydCwgZlx1MDBmOHIgZHUgZm9ydHNcdTAwZTZ0dGVyLg0KLUVsZW1lbnRzVmlld18zNj1GZWpsIHVuZGVyIGluZGxcdTAwZTZzbmluZyBhZiBiaWJsaW90ZWsNCi1hbHRUYWdMYWJlbF90ZXh0PUFMVC1rb2RlOg0KLWltYWdlU2l6ZUxhYmVsX3RleHQ9QmlsbGVkZXRzIGhcdTAwZjhqcmUgb2cgYnJlZGRlIHNrYWwgdlx1MDBlNnJlIG1pbmRzdCAxMCBvZyBoXHUwMGY4anN0IDYwMC4gVWd5bGRpZyBoXHUwMGY4amRlIG9nIGJyZWRkZSBibGl2ZXIga29udmVydGVyZXQgdGlsIGVuIHBhc3NlbmRlIHN0XHUwMGY4cnJlbHNlLg0KLQ0KLSMgUHJvY2VzcyBFZGl0b3INCi1Qcm9jZXNzRWRpdG9yPVByb2Nlc2VkaXRvcg0KLVByb2Nlc3NFZGl0b3JfTmFtZT1OYXZuDQotUHJvY2Vzc0VkaXRvcl9QcmVzZW50YXRpb25OYW1lPVByXHUwMGU2c2VudGF0aW9uc25hdm4NCi1Qcm9jZXNzRWRpdG9yX0luZGV4PUluZGVrcw0KLVByb2Nlc3NFZGl0b3JfUHJlZGVjZXNzb3JzPUZvcmdcdTAwZTZuZ2VyZQ0KLSNDb25maWd1cmF0aW9uUGFnZV9TZWxlY3RlZD1TZWxlY3RlZDogDQotQ2hlY2tsaXN0T3JkZXJfZGVzY3JpcHRpb249Vlx1MDBlNmxnIGV0IGtvbnRyb2xlbGVtZW50LCBvZyBrbGlrIHBcdTAwZTUgT3AgZWxsZXIgTmVkIGZvciBhdCBcdTAwZTZuZHJlIGRldHMgclx1MDBlNmtrZWZcdTAwZjhsZ2UuDQotRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQ9T21kXHUwMGY4YmVyLi4uDQotUHJvY2Vzc0VkaXRvcl9Nb2RlbEluZm89TW9kZWxvcGx5c25pbmdlcg0KLVByb2Nlc3NFZGl0b3JfUHJlZml4PVByXHUwMGU2Zmlrcw0KLU1vdmVEaWFsb2dfbW92ZV90ZXh0PUZseXQNCi1DaGVja2xpc3RPcmRlcl90aXRsZT1SXHUwMGU2a2tlZlx1MDBmOGxnZSBhZiBrb250cm9sZWxlbWVudGVyDQotUHJvY2Vzc0VkaXRvcl9SZXBldGFibGU9S2FuIGdlbnRhZ2VzDQotUHJvY2Vzc0VkaXRvcl9PbmdvaW5nPUlnYW5ndlx1MDBlNnJlbmRlDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uPVN5bmtyb25pc1x1MDBlOXIuLi4NCi1Qcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuPUFrdGl2aXRldHNzdHlyZXQNCi1Qcm9jZXNzRWRpdG9yX0RlbGl2ZXJhYmxlPUxldmVyYW5jZQ0KLVByb2Nlc3NFZGl0b3JfT3B0aW9uYWw9VmFsZ2ZyaXQNCi1GaWx0ZXJEaWFsb2dfVHlwZV90ZXh0PU1ldG9kZWVsZW1lbnR0eXBlOg0KLUZpbHRlckRpYWxvZ19FeHBhbmRBbGw9VWR2aWQgYWxsZQ0KLU1vdmVEaWFsb2dfbW92aW5nX3RleHQ9Rmx5dHRlci4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbldhcm5pbmc9SVVQQTAwMjVXOiBGb3JtaWtvbiBmb3IgezB9IGZpbmRlcyBpa2tlIGkgc3RpZW46IHsxfQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yPUlVUEEwMDI1RTogRmVqbDogRm9ybWlrb25hZnNuaXQ6IHswfQ0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfTmFtZUxhYmVsPU5hdm46DQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1PcHJldCBueSBtZXRvZGVrb25maWd1cmF0aW9uDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX05hbWVMYWJlbD1OYXZuOg0KLUF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU9TnkgbWV0b2Rla29uZmlndXJhdGlvbg0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0xpYnJhcnlNYWluUGFnZV9wYWdlVGl0bGU9T3ByZXQgbnl0IG1ldG9kZWJpYmxpb3Rlaw0KLW5ld0xpYnJhcnlXaXphcmRfdGl0bGU9Tnl0IG1ldG9kZWJpYmxpb3Rlaw0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlVGl0bGU9R2VtIFx1MDBlNm5kcmluZ2VyDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1BbmdpdiBuYXZuLCBiZXNrcml2ZWxzZSBvZyBkZXN0aW5hdGlvbnNiaWJsaW90ZWsgZm9yIGRldCBueWUgbWV0b2RlYmlibGlvdGVrLg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb249RXQgZWxsZXIgZmxlcmUgbWV0b2RlZWxlbWVudGVyIGVyIFx1MDBlNm5kcmV0LiBWXHUwMGU2bGcgZGVtLCBkZXIgc2thbCBnZW1tZXMuDQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU9XHUwMGM1Ym4gbWV0b2Rla29uZmlndXJhdGlvbmVyDQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25XaXphcmRfd2luZG93VGl0bGU9XHUwMGM1Ym4gbWV0b2Rla29uZmlndXJhdGlvbmVyDQotRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ9RXJzdGF0dGVyIHswfS4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uV2FybmluZz1JVVBBMDAyNlc6IE5vZGVpa29uIGZvciB7MH0gZmluZGVzIGlra2UgaSBzdGllbjogezF9DQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfdW5zZWxlY3RlZHBhY2thZ2VzPScnezB9JycgaW5kZWhvbGRlciBlbGVtZW50ZXIsIHNvbSByZWZlcmVyZXIgdGlsIGVsZW1lbnRlciBpIGlra2UtdmFsZ3RlIHBha2tlcg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3I9SVVQQTAwMjZFOiBGZWpsOiBOb2RlaWtvbmFmc25pdDogezB9DQotU3RlcHNPcmRlckRpYWxvZ19zdGVwcz1UcmluOiANCi1TdGVwc09yZGVyRGlhbG9nX3RpdGxlPVJcdTAwZTZra2VmXHUwMGY4bGdlIGFmIG9wZ2F2ZXRyaW4NCi1Qcm9jZXNzRWRpdG9yX1BsYW5uZWQ9UGxhbmxhZ3QNCi1zcGVjaWZ5ZGlyZWN0b3J5X3RleHQ9QW5naXYgZXQgYmlibGlvdGVrLCBodm9yIG1ldG9kZWJpYmxpb3Rla2V0IHNrYWwgZ2VtbWVzDQotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPUZsZXJlIGZvcmVrb21zdGVyDQotUHJvY2Vzc0VkaXRvcl9FbnRyeVN0YXRlPUluZGdhbmdzdGlsc3RhbmQNCi1Qcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZT1VZGdhbmdzdGlsc3RhbmQNCi1zZWxlY3RDb2x1bW5zdG9BZGRfdGV4dD1WXHUwMGU2bGcga29sb25uZXIsIGRlciBza2FsIHRpbGZcdTAwZjhqZXMNCi1Qcm9jZXNzRWRpdG9yX1R5cGU9VHlwZQ0KLVByb2Nlc3NFZGl0b3JfVGVhbT1UZWFtDQotRmlsdGVyRGlhbG9nX3RpdGxlPVZcdTAwZTZsZyBkaWFsb2c6IA0KLQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZD1UaWxmXHUwMGY4aiBmcmEgJm1ldG9kZWluZGhvbGQuLi4NCi1GaWx0ZXJEaWFsb2dfQ29sbGFwc2VBbGw9U2tqdWwgYWxsZQ0KLU9wZW5DaGVhdHNoZWV0Vmlld190aXRsZT1cdTAwYzVibiBvdmVyc2lndGVuIFNueWRlYXJrDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwPVJ1bCBvcA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxEb3duPVJ1bCBuZWQNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA9RiZseXQgb3ANCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlRG93bj1GbHl0ICZuZWQNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWw9JkFmZFx1MDBlNmsNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db3B5PSZLb3BpXHUwMGU5ci4uLg0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ9TmF2bmVtXHUwMGY4bnN0cmUgKG1hdGNoZW5kZSBuYXZuZSB2aXNlcyk6IA0KLU1ldGhvZExpYnJhcnlFZGl0b3JfdGl0bGU9TWV0b2RlYmlibGlvdGVrOiANCi0jTWVzc2FnZVZpZXdfc2VsZWN0ZWRfdGV4dD1TZWxlY3RlZDogDQotTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ9QmVza3JpdmVsc2UNCi1FbGVtZW50c1ZpZXdfZXJyX3NhdmluZz1JVVBBMDAyN0U6IEZlamwgdW5kZXIgbGFncmluZyBhZiAnJ3swfScnezF9DQotDQotZXJyX2NvcHlpbmdfZmlsZV90aXRsZT1GZWpsIHVuZGVyIGtvcGllcmluZyBhZiBmaWwNCi1lcnJfY29weWluZ19maWxlX2Vycm9yPUlVUEEwMDI4RTogSWtvbmVuIGthbiBpa2tlIHRpbGRlbGVzLiANCi1lcnJfY29weWluZ19maWxlX3JlYXNvbj1EZXIgZXIgb3BzdFx1MDBlNWV0IGVuIGZlamwgdW5kZXJrb3BpZXJpbmcgYWYgZGVuIHZhbGd0ZSBmaWwuIEtsaWsgcFx1MDBlNSBPcGx5c25pbmdlciBmb3IgYXQgZlx1MDBlNSBmbGVyZSBvcGx5c25pbmdlci4NCi1lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlPUZlamwgdW5kZXIgYmVoYW5kbGluZyBhZiBmaWwNCi1lZGl0Q29uZmlndXJhdGlvbl90b29sdGlwPVJlZGlnXHUwMGU5ciBrb25maWd1cmF0aW9uDQotZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0PUlVUEEwMDE1RTogS2FuIGlra2UgcmVkaWdlcmUgZWxlbWVudA0KLVNhdmVUaGlzQWN0aW9uX3NhdmVvYmplY3Q9R2VtIGRldHRlIG9iamVrdC4uLg0KLUVsZW1lbnRzVmlld19yZXBsYWNlX3RleHQ9RXJzdGF0DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kPVUmZHZpZC4uLg0KLU1vdmVEaWFsb2dfZGVzdGluYXRpb25fdGV4dD1WXHUwMGU2bGcgZGVzdGluYXRpb24gZm9yIGRldCBlbGxlciBkZSB2YWxndGUgZWxlbWVudGVyOg0KLWNob29zZURlZmF1bHREaXJlY3RvcnlfdGV4dD1WXHUwMGU2bGcgZXQgc3RhbmRhcmRiaWJsaW90ZWsgZm9yIGJpYmxpb3Rla2VyOg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzPSZVbmRlcnRyeWsNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczI9JlB1YmxpY2VyaW5nc2luZHN0aWxsaW5nZXIuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbT0mQnJ1Z2VyZGVmaW5lcmVkZSBkaWFncmFtbWVyLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3RpdGxlPVRpbGRlbCBicnVnZXJkZWZpbmVyZWRlIGRpYWdyYW1tZXINCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRJbWFnZT1Ba3Rpdml0ZXRzZGlhZ3JhbToNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRkSW1hZ2U9QWt0aXZpdGV0c29wbHlzbmluZ3NkaWFncmFtOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1EaWFncmFtIGZvciBhcmJlamRzcHJvZHVrdGFmaFx1MDBlNm5naWdoZWQ6DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX25vdGFGaWxlPUlVUEEwMDA0RTogRGVuIGFuZ2l2bmUgc3RpIGVyIGlra2UgZW4gZmlsLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b249Vlx1MDBlNmxnLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDI0RTogRGV0IGFuZ2l2bmUgYmlsbGVkZSBmaW5kZXMgaWtrZSBpIGJpYmxpb3Rla2V0LiBBbmdpdiBkZW4gcmVsYXRpdmUgc3RpIHRpbCBiaWJsaW90ZWtldHMgcm9kYmlibGlvdGVrLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ9SVVQQTAwMzBFOiBEZXQgdmFsZ3RlIGJpbGxlZGUgZmluZGVzIGlra2UgaSBiaWJsaW90ZWtldC4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZT1CcnVnIGJpbGxlZGUgYWYgYWt0aXZpdGV0c2RpYWdyYW0gdGlsIGdlbm5lbXN5biBvZyBwdWJsaWNlcmluZw0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBRERJbWFnZT1CcnVnIGJpbGxlZGUgYWYgYWt0aXZpdGV0c29wbHlzbmluZ3NkaWFncmFtIHRpbCBnZW5uZW1zeW4gb2cgcHVibGljZXJpbmcNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlV1BESW1hZ2U9QnJ1ZyBiaWxsZWRlIGFmIGRpYWdyYW0gZm9yIGFyYmVqZHNwcm9kdWt0YWZoXHUwMGU2bmdpZ2hlZCB0aWwgZ2VubmVtc3luIG9nIHB1YmxpY2VyaW5nDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29udHJpYnV0ZT1Mb2thbHQgYmlkcmFnDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZT1Mb2thbCBlcnN0YXRuaW5nDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRGlhZ3JhbXM9RGlhJmdyYW1tZXINCi1Qcm9jZXNzRWRpdG9yX2FjdGlvbl9kZWVwQ29weT0mRHliIGtvcGllcmluZy4uLg0KLUZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uPUtvcnQgYmVza3JpdmVsc2U6DQotQ29uZmlndXJhdGlvblBhZ2VfaGlkZVRvb2xUaXA9VmlzL3NranVsIHVtYXJrZXJlZGUgZWxlbWVudGVyDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb249QmVza3JpdmVsc2U6DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NBbGw9UHVibGljXHUwMGU5ciBpbmdlbg0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uPU1cdTAwZjhuc3RyZSBhZHNraWxsZXMgYWYga29tbWFlciwgaHZvciAqID0gZW4gdmlsa1x1MDBlNXJsaWcgc3RyZW5nLCA/ID0gZXQgdmlsa1x1MDBlNXJsaWd0IHRlZ24NCi1Db25maWd1cmF0aW9uUGFnZV9UcmVlVGl0bGVMYWJlbD1JbmRob2xkOg0KLUNvbmZpZ3VyYXRpb25QYWdlX0xvYWRpbmdNZXNzYWdlPUluZGxcdTAwZTZzZXIga29uZmlndXJhdGlvbi4gVmVudC4uLg0KLU1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0PURlbiBhbmdpdm5lIGZseXR0ZWRlc3RpbmF0aW9uIGVyIHVneWxkaWcuDQotTW92ZURpYWxvZ19jYW5ub3RNb2RpZnlEZXN0aW5hdGlvbj1JVVBBMDAzNEU6IERlbiB2YWxndGUgZGVzdGluYXRpb24ga2FuIGlra2UgXHUwMGU2bmRyZXMuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsQWxsPVB1YmxpY1x1MDBlOXIgYWxsZQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5CYXNlQWN0aXZpdHk9XHUwMGM1Ym4gYmFzaXNha3Rpdml0ZXQNCi1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPVVkJnZpZCBhbGxlDQotUHJvY2Vzc0Zvcm1FZGl0b3JfY29sbGFwc2VBbGxBY3Rpb25MYWJlbD1Ta2p1JmwgYWxsZQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURpYWdyYW09XHUwMGM1Ym4gJmFrdGl2aXRldHNkaWFncmFtDQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbD1EZSBpa2tlLXVuZGVydHJ5a3RlIGRlc2tyaXB0b3JlciBpIE9wbHlzbmluZ2VyIHNrYWwgc2xldHRlcyBmb3IgYXQgdW5kZ1x1MDBlNSBzYW1tZW5mYWxkIGVmdGVyIGFmZFx1MDBlNmtuaW5nIGFmIGRlIHZhbGd0ZSBlbGVtZW50ZXIuIEtsaWsgcFx1MDBlNSBPSywgaHZpcyBkdSB2aWwgc2xldHRlIGRlbSBvZyBmb3J0c1x1MDBlNnR0ZS4NCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfU2VsZWN0Q29sdW1ucz1WXHUwMGU2bGcga29sb25uZXIsIGRlciBza2FsIHRpbGZcdTAwZjhqZXMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtPVx1MDBjNWJuIGFrdGl2aXRldHNvcGx5c25pbmdzJmRpYWdyYW0NCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfQ29sdW1uU2VsZWN0aW9uPUtvbG9ubmV2YWxnOg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zd2l0Y2hDb25maWd1cmF0aW9uPVNraWZ0IHRpbCBwcm9jZXNzZW5zIHN0YW5kYXJka29uZmlndXJhdGlvbiwgblx1MDBlNXIgZW4gcHJvY2VzZWRpdG9yIGFrdGl2ZXJlcw0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zdXBwcmVzc2lvbkdyb3VwVGl0bGU9VW5kZXJ0cnlra2Vsc2UNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGU9T3ZlcnRhZyB1bmRlcnRyeWtrZWxzZXN0aWxzdGFuZGUNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbT1cdTAwYzVibiBkaWFncmFtICZmb3IgYXJiZWpkc3Byb2R1a3RhZmhcdTAwZTZuZ2lnaGVkDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9UnlkDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9Vlx1MDBlNmxnLi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fSW5zZXJ0TmV3UGhhc2U9SW5kc1x1MDBlNnQgbnkgZmFzZQ0KLVZpZXdIZWxwZXJfcmVsb2FkTGliT25Sb2xsYmFja0Vycm9yPUthbiBpa2tlIHJldGFibGVyZSBmcmEgZW4gcGVyc2lzdGVuc2ZlamwuIEJpYmxpb3Rla2V0IHNrYWwgZ2VuaW5kbFx1MDBlNnNlcyBmb3IgYXQgZ2VuZGFubmUgZGV0cyBvcHJpbmRlbGlnZSB0aWxzdGFuZC4NCi1WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkX3RleHQ9RWxlbWVudGV0ICcnezB9JycgZXIgYWxsZXJlZGUgc2xldHRldC4NCi1WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkY29uZmlybV90ZXh0PUVsZW1lbnRldCAnJ3swfScnIGVyIGFsbGVyZWRlIHNsZXR0ZXQuIFZpbCBkdSBmamVybmUgZGV0IGZyYSAnJ3sxfScnPw0KLUNvbmZpZ3VyYXRpb25QYWdlX0FkZE1pc3NpbmdUb29sVGlwPVRpbGZcdTAwZjhqIG1hbmdsZW5kZSByZWZlcmVuY2VyDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb249QmVza3JpdmVsc2UNCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25HZW5lcmFsSW5mbz1HZW5lcmVsbGUgb3BseXNuaW5nZXIgDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPUFudmVuZCBtXHUwMGY4bnMmdGVyDQotTW92ZURpYWxvZ19zZWxlY3RkZXN0aW5hdGlvbl90ZXh0PVZcdTAwZTZsZyBlbiBkZXN0aW5hdGlvbi4NCi1Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1EZXIgZXIgaWtrZSBhbmdpdmV0IGVuIGZseXR0ZWRlc3RpbmF0aW9uLg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdD0uIFByb2JsZW1vYmpla3Q6IA0KLU1lc3NhZ2VMYWJlbFByb3ZpZGVyX2VycmNoaWxkcGtncz1FbiB1bmRlcm9yZG5ldCBpbmRob2xkc3Bha2tlIGVsbGVyIHByb2NlcyBpbmRlaG9sZGVyIGVsZW1lbnRlciBtZWQgbWFuZ2xlbmRlIHJlZmVyZW5jZXINCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX1RpdGxlPUluZHN0aWxsaW5nZXIgZm9yIGRpYWdyYW1wdWJsaWNlcmluZw0KLVByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfTWVzc2FnZT1WXHUwMGU2bGcgZGV0IGVsbGVyIGRlIGRpYWdyYW1tZXIsIGRlciBza2FsIHB1YmxpY2VyZXMsIGVsbGVyIGZyYXZcdTAwZTZsZyBkZW0gZm9yIGlra2UgYXQgcHVibGljZXJlDQotUHJvY2Vzc0VkaXRvcl9UaXRsZT1Qcm9jZXNlZGl0b3I6IA0KLVNhdmVBc3dpdGhkb3RzX3RleHQ9R2VtIHNvbS4uLg0KLVByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZT1BcmJlamRzbmVkYnJ5ZG5pbmdzc3RydWt0dXINCi1Qcm9jZXNzRWRpdG9yX1RlYW1BbGxvY2F0aW9uPVRlYW1hbGxva2VyaW5nDQotUHJvY2Vzc0VkaXRvcl9Xb3JrUHJvZHVjdFVzYWdlPUFyYmVqZHNwcm9kdWt0YnJ1Zw0KLVByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldz1Lb25zb2xpZGVyZXQgb3ZlcnNpZ3QNCi1Qcm9jZXNzRWRpdG9yX2NvbmZpcm1BdXRvU3luY2g9RGVubmUgZnVua3Rpb24gb3Bmcmlza2VyIGRlIHZhbGd0ZSBkZXNrcmlwdG9yZXIgZWxsZXIgYWxsZSBkZXNrcmlwdG9yZXIgdW5kZXIgZGUgdmFsZ3RlIGFrdGl2aXRldGVyLCBkZXIgZXIgbWFya2VyZXQgc29tICJTeW5rcm9uaXNlcmV0IG1lZCBraWxkZSIgcFx1MDBlNSBza2lsbGVibGFkZXQgR2VuZXJlbHQgaSBkZXJlcyBlZ2Vuc2thYnNvdmVyc2lndC4gRGVuIG9wZnJpc2tlciBkZXNrcmlwdG9yZXJuZSBtZWQgZGUgb3ByaW5kZWxpZ2UgZWdlbnNrYWJlciBmb3IgZGUgbGlua2VkZSBtZXRvZGVpbmRob2xkc2VsZW1lbnRlciB1bmRlciBwcm9jZXNzZW5zIHN0YW5kYXJka29uZmlndXJhdGlvbi4gQmVtXHUwMGU2cmssIGF0IGRlbiBpa2tlIG9wZGF0ZXJlciBkeW5hbWlzayBsaW5rZWRlIChnclx1MDBmOG4ga3Vyc2l2KSBkZXNrcmlwdG9yZXIuIFZpbCBkdSBmb3J0c1x1MDBlNnR0ZT8NCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE9S29uZmlndXJhdGlvbg0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMj1WXHUwMGU2bGcgcGx1Z2luIG9nIHBha2tlDQotTmV3TGlicmFyeURpYWxvZ19uZXdsaWJyYXJ5X2FzPU9wcmV0IG55dCBiaWJsaW90ZWsgc29tDQotTmV3UGx1Z2luRGlhbG9nX25ld3BsdWdpbl90ZXh0PU55IG1ldG9kZS1wbHVnaW4NCi1TZWxlY3RFbGVtZW50RGlhbG9nX3RpdGxlX3RleHQ9Vlx1MDBlNmxnIGVsZW1lbnRldCBlbGxlciBlbiBhZiBkZXRzIGJpZHJhZ3lkZXJlOg0KLU9wZW5Db25maWdEaWFsb2duZXdjb25maWdfdGV4dD1OeSBrb25maWd1cmF0aW9uOg0KLXByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZV9CU0VkaXRvcj1Qcm9jZXNlZGl0b3INCi0NCi0jIEFic3RyYWN0RGlhZ3JhbUVkaXRvcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1KdXN0XHUwMGU5cg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PU9wZnJpc2sgZnJhIGJhc2lzYWt0aXZpdGV0DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0PUZvcm1hdFx1MDBlOXIgdGVrc3Rib2tzLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WYW5kcmV0IHRpbCBnZW5uZW1zbml0DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WYW5kcmV0IHRpbCBmXHUwMGY4cnN0ZSB2YWxndGUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PUxvZHJldCB0aWwgZ2VubmVtc25pdA0KLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGU9R2VuZXJlbGxlIG9wbHlzbmluZ2VyDQotTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9SVVQQTAwNDFFOiBEZXQgZWxsZXIgZGUgdmFsZ3RlIGVsZW1lbnRlciBrYW4gaWtrZSBmbHl0dGVzIHRpbCBkZW4gYW5naXZuZSBkZXN0aW5hdGlvbi4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVtb2RlbGxpYnJhcnk9R2VtbWVyIG1vZGVsYmlibGlvdGVrLi4uDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU9RmVqbA0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZV9saWJyYXJ5X3Byb2JsZW1fbXNnPUlVUEEwMDMzRTogRGVyIGVyIG9wc3RcdTAwZTVldCBldCBwcm9ibGVtIHVuZGVyIGxhZ3JpbmcgYWYgYmlibGlvdGVrLg0KLU1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0PUVyIGR1IHNpa2tlciBwXHUwMGU1LCBhdCBkdSB2aWwgc2xldHRlICcnezB9Jyc/DQotQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfQ29udGVudEVsZW1lbnRfdGV4dD1JbmRob2xkc2VsZW1lbnRlcjogDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Ccm93c2VCdXR0b25MYWJlbD1HZW5uZW1zZS4uLg0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249QW5naXYgbmF2biBwXHUwMGU1IG9nIGVuIGJlc2tyaXZlbHNlIGFmIGRlbiBueWUgbWV0b2Rla29uZmlndXJhdGlvbi4NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZVRpdGxlPUdlbSBcdTAwZTZuZHJpbmdlciwgb2cgbHVrIGFsbGUgZWRpdG9yZXINCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PUxvZHJldCB0aWwgZlx1MDBmOHJzdGUgdmFsZ3RlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1HZW0NCi1BdHRhY2htZW50RGlhbG9nYXR0YWNoRmlsZV90ZXh0PVZlZGhcdTAwZTZmdCBmaWwNCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50PUtvbmZpZ3VyYXRpb25zaW5kaG9sZA0KLU9wZW5Db25maWdEaWFsb2dvcGVuY29uZmlnX3RleHQ9XHUwMGM1Ym4ga29uZmlndXJhdGlvbg0KLUVsZW1lbnRzVmlld19yZXBsYWNlQWN0aW9uX3RleHQ9RXJzdGF0Li4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZT1HZW1tZXIgezB9DQotQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcD1WaXMgZnJlbXZpc2VyIHRpbCBrb25maWd1cmF0aW9uc2FkdmFyc2Vsc2xvZw0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkZvcm1QcmVmaXg9S29uZmlndXJhdGlvbjogDQotQ2hlY2tsaXN0T3JkZXJfY2hlY2tsaXN0aXRlbXNfdGV4dD1Lb250cm9sZWxlbWVudGVyOiANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9Rmx5dCBub2RlDQotQ29uZmlndXJhdGlvblBhZ2VfTWFrZUNsb3N1cmVUb29sVGlwPUZvcmV0YWcgbHVrbmluZyB2ZWQgYXQgcmV0dGUgZmVqbA0KLU5ld1BsdWdpbkRpYWxvZ19yZWZlcmVuY2VwbHVnaW5fdGV4dD1SZWZlcmVuY2UtcGx1Z2luczoNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfY3JlYXRlRnJlZVRleHRfdGV4dD1PcHJldCBmcml0ZWtzdA0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0xhYmVsPVJlc3VsdGF0IGFmIG5vZGVpa29uOg0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0PUlVUEEwMDMyVzogS2FuIGlra2Ugb3ByZXR0ZSBmb3JiaW5kZWxzZQ0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0PUlVUEEwMDMzVzogS2FuIGlra2UgaGF2ZSBkZXQgc2FtbWUgbmVkYnJ5ZG5pbmdzZWxlbWVudCBzb20gZm9yZ1x1MDBlNm5nZXIgZWxsZXIgZWZ0ZXJmXHUwMGY4bGdlcg0KLQ0KLSMgRWRpdG9yQ2hvb3Nlcg0KLUVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlPVx1MDBjNWJuIGVkaXRvcg0KLUVkaXRvckNob29zZXJfUmVzb3VyY2VzRXJyb3I9RGVyIGVyIGZlamwgaSBkZXR0ZSBlbGVtZW50LiBEdSBiXHUwMGY4ciByZXR0ZSBmZWpsZW5lLCBmXHUwMGY4ciBkdSBmb3J0c1x1MDBlNnR0ZXIgKHNlIG9wbHlzbmluZ2VyKS5cblwNCi1cblwNCi1LbGlrIHBcdTAwZTUgT0sgZm9yIGF0IGZvcnRzXHUwMGU2dHRlIHVkZW4gYXQgXHUwMGU1Ym5lIGVkaXRvcmVuLiBMdWsgZGVubmUgZGlhbG9nIGZvciBhdCBcdTAwZTVibmUgZWRpdG9yZW4uDQotQ29uZmlndXJhdGlvblBhZ2VfRm9ybVByZWZpeD1Lb25maWd1cmF0aW9uOiANCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25OYW1lPU5hdm46DQotQXR0YWNobWVudERpYWxvZ0ZpbGVVUkxfdGV4dD1GaWwtVVJMOg0KLVN0ZXBzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb249Vlx1MDBlNmxnIGV0IHRyaW4sIG9nIGtsaWsgcFx1MDBlNSBPcCBlbGxlciBOZWQgZm9yIGF0IFx1MDBlNm5kcmUgZGV0cyByXHUwMGU2a2tlZlx1MDBmOGxnZS4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX2Vycl9zYXZlPUZlamwgdW5kZXIgbGFncmluZw0KLU1lc3NhZ2VWaWV3X2VycmVsZW1lbnRfdGV4dD1SZWZlcmVyZW5kZSBlbGVtZW50DQotTWVzc2FnZVZpZXdfcmVmZWxlbWVudF90ZXh0PVJlZmVyZXJldCBlbGVtZW50DQotDQotI0FjdGl2aXR5IERpYWdyYW0NCi1BY3Rpdml0eURpYWdyYW1FZGl0b3JfY3JlYXRlU3RhcnROb2RlX3RleHQ9T3ByZXQgc3RhcnRub2RlDQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudERlc2NyaXB0aW9uPVZcdTAwZTZsZyBkZSBtZXRvZGUtcGx1Z2lucywgaW5kaG9sZHNwYWtrZXIgb2cgcHJvY2Vzc2VyLCBkZXIgc2thbCBpbmtsdWRlcmVzIGkgZGVubmUga29uZmlndXJhdGlvbi4NCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbl90ZXh0PVJcdTAwZTZra2VmXHUwMGY4bGdlIGFmIGluZGhvbGRzZWxlbWVudGVyIGkgdGlscGFzc2V0IGthdGVnb3JpDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EaXJlY3RvcnlMYWJlbD1CaWJsaW90ZWs6DQotUm9vdFByZWZQYWdlX2VuYWJsZXByb2Nlc3Njb250cmlidXRpb25fdGV4dD1Ba3Rpdlx1MDBlOXIgcHJvY2VzYmlkcmFnDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGVubmUgbWV0b2Rla29uZmlndXJhdGlvbi4NCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbkxhYmVsPUJlc2tyaXZlbHNlOg0KLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9Vlx1MDBlNmxnZXIgYmlkcmFneWRlcmUgZm9yICcnezB9JycNCi1FbGVtZW50c1ZpZXdfb3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uX3RleHQ9XHUwMGM1Ym4gdmlhIHZhcmlhYmlsaXRldHNlbGVtZW50ZXINCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9Vlx1MDBlNmxnZXIgdmFyaWFiaWxpdGV0c2VsZW1lbnRlciBmb3IgJyd7MH0nJw0KLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ192aWV3ZXJMYWJlbD1WYXJpYWJpbGl0ZXRzZWxlbWVudGVyIGZvciAnJ3swfScnDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsPVJlc3VsdGF0IGFmIGZvcm1pa29uOg0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ9S2FuIGlra2Ugc2xldHRlDQotQWN0aXZpdHlEaWFncmFtRWRpdG9yX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1cdTAwYzVibiBha3Rpdml0ZXRzb3BseXNuaW5nc2RpYWdyYW0gDQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl9kZXNjcmlwdGlvbj1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGV0dGUgbWV0b2RlYmlibGlvdGVrLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9UnlkDQotV1BDb21wYXJ0bWVudEZpZ3VyZV8wPU55IGFyYmVqZHNwcm9kdWt0ZGVza3JpcHRvcg0KLXByb21wdGZvcl9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkX3RleHQ9UHVibGljXHUwMGU5ciBlbGxlciBnZW5uZW1zZSBha3Rpdml0ZXRzb3BseXNuaW5nc2RpYWdyYW1tZXIsIHNvbSBpa2tlIGVyIG9wcmV0dGV0IGkgcHJvY2VzZWRpdG9yZW4NCi1wcm9tcHRfZm9yX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09UHVibGljXHUwMGU5ciBlbGxlciBnZW5uZW1zZSBha3Rpdml0ZXRzZGlhZ3JhbW1lciBmb3IgdVx1MDBlNm5kcmVkZSBha3Rpdml0ZXRzdWR2aWRlbHNlcg0KLQ0KLSNDb25maWdQcm9jZXNzVmlld0RpYWxvZw0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX05hbWVQYXR0ZXJuPU5hdm5lbVx1MDBmOG5zdHJlIChtYXRjaGVuZGUgbmF2bmUgdmlzZXMpOg0KLXNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uX2xhYmVsPVZpcyBpIHJlc3NvdXJjZW5hdmlnYXRvcg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1BhdHRlcm49TVx1MDBmOG5zdHJlIGFkc2tpbGxlcyBhZiBrb21tYWVyLCBodm9yICogPSBlbiB2aWxrXHUwMGU1cmxpZyBzdHJlbmcsID8gPSBldCB2aWxrXHUwMGU1cmxpZ3QgdGVnbg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb249SVVQQTAwMjlFOiBEZXIgZXIgb3BzdFx1MDBlNWV0IGVuIGZlamwgdW5kZXIgYmVoYW5kbGluZyBhZiBkZW4gdmFsZ3RlIGZpbC4gS2xpayBwXHUwMGU1IE9wbHlzbmluZ2VyIGZvciBhdCBmXHUwMGU1IGZsZXJlIG9wbHlzbmluZ2VyLg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX0NhdGVnb3J5VHlwZT1LYXRlZ29yaXR5cGU6DQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1Lb3J0IGJlc2tyaXZlbHNlOg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXM9Vlx1MDBlNmxnIGthdGVnb3JpZXINCi0NCi0jbG9nIG1lc3NhZ2VzDQotY2hlYXRzaGVldF9sb2FkX2ZhaWx1cmVfbG9nX21zZz1LYW4gaWtrZSBcdTAwZTVibmUgc255ZGVhcmtldDogDQotDQotbmV3Q29uZmlndXJhdGlvbldpcmF6ZF9jcmVhdGVFcnJvcj1JVVBBMDAzNUU6IEtvbmZpZ3VyYXRpb25lbiBrYW4gaWtrZSBvcHJldHRlcw0KLW5ld1BsdWdpbldpemFyZF9jcmVhdGVFcnJvcj1JVVBBMDAzNkU6IFBsdWdpbidlbiBrYW4gaWtrZSBvcHJldHRlcw0KLWVycm9yRGlhbG9nX21vdmVFcnJvcj1JVVBBMDAzN0U6IEVsZW1lbnRldCBrYW4gaWtrZSBmbHl0dGVzDQotcmVuYW1lRGlhbG9nX3JlbmFtZUVycm9yPUlVUEEwMDM4RTogRWxlbWVudGV0IGthbiBpa2tlIG9tZFx1MDBmOGJlcw0KLWVycm9yRGlhbG9nX2NyZWF0ZUVycm9yPUlVUEEwMDM5RTogRWxlbWVudGV0IGthbiBpa2tlIG9wcmV0dGVzDQotZHVwbGljYXRlUGx1Z2luTmFtZUVycm9yX21zZz1JVVBBMDEwMUU6IE5hdm5ldCAnJ3swfScnIGZpbmRlcyBhbGxlcmVkZS4gQW5naXYgZXQgYW5kZXQgbmF2biwgb2cgcHJcdTAwZjh2IGlnZW4uDQotDQotI05ldyBTdHJpbmdzIGZvciBQcm9jZXNzRWRpdG9yIENvbnRleHQgbWVudSBkaWFncmFtIGltYWdlcw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFESW1hZ2U9VGlsZGVsIEFELWJpbGxlZGUuLi4NCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlPU9wZnJpc2tuaW5nc2ZlamwNCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZz1GZWpsIHVuZGVyIG9wZnJpc2tuaW5nIGFmIGVkaXRvcg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlPVRpbGRlbCBBREQtYmlsbGVkZS4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZFdQREltYWdlPVRpbGRlbCBXUEQtYmlsbGVkZS4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFESW1hZ2VJblB1Ymxpc2hpbmc9QnJ1ZyBBRC1iaWxsZWRlIGkgcHVibGljZXJpbmcNCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlU3VwcHJlc3M9RGUgdW5kZXJ0cnlrdGUgZGVza3JpcHRvcmVyIGkgT3BseXNuaW5nZXIgc2thbCBzbGV0dGVzIGZvciBhdCB1bmRnXHUwMGU1IHNhbW1lbmZhbGQgZWZ0ZXIgdW5kZXJ0cnlra2Vsc2UgYWYgZGUgdmFsZ3RlIGVsZW1lbnRlci4gS2xpayBwXHUwMGU1IE9LLCBodmlzIGR1IHZpbCBzbGV0dGUgZGVtIG9nIGZvcnRzXHUwMGU2dHRlLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFEREltYWdlSW5QdWJsaXNoaW5nPUJydWcgQURELWJpbGxlZGUgaSBwdWJsaWNlcmluZw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZVdQREltYWdlSW5QdWJsaXNoaW5nPUJydWcgV1BELWJpbGxlZGUgaSBwdWJsaWNlcmluZw0KLVByb2Nlc3NFZGl0b3JfRGlhZ3JhbUltYWdlX0lucHV0RGlhbG9nX2luaXRpYWxWYWx1ZT1CaWxsZWRzdGkNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXc9JlZpcyBsaW5rZXQgZWxlbWVudCBpIG92ZXJzaWd0ZW4gQmlibGlvdGVrDQotUHJvY2Vzc0VkaXRvcl91cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uX2xhYmVsPU9wZGF0XHUwMGU5ciB1bmRlcnRyeWtrZWxzZSBmcmEgJmJhc2lzDQotUHJvY2Vzc0VkaXRvcl9Db250ZXh0TWVudV9EaWFncmFtSW1hZ2VzPURpYWdyYW1iaWxsZWRlcg0KLQ0KLSNTdHJpbmdzIGZvciBzeW5jaHJvbml6YXRpb24gd2l6YXJkIG9uIHByb2Nlc3MgZWRpdG9yJ3MgQlMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlPVN5bmtyb25pc2VyaW5nc2Jlc2tyaXZlbHNlDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0PUxcdTAwZTZzIG9wbHlzbmluZ2VybmUgbmVkZW5mb3IsIHNvbSBiZXNrcml2ZXIsIGh2YWQgdGlscGFzc2V0IHN5bmtyb25pc2VyaW5nIHZpbCBtZWRmXHUwMGY4cmUuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9Vlx1MDBlNmxnIGtvbmZpZ3VyYXRpb24NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVZcdTAwZTZsZyBkZW4ga29uZmlndXJhdGlvbiwgZHUgdmlsIGJydWdlIHRpbCBzeW5rcm9uaXNlcmluZ2VuLiBcDQotRGl0IHZhbGcgYmVzdGVtbWVyLCBodmlsa2UgYmlkcmFnIG9nIGVyc3RhdG5pbmdlciBkZXIgdmlsIGJsaXZlIGJydWd0IHRpbCBzeW5rcm9uaXNlcmluZ2VuLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX2NvbmZpZ0xhYmVsPUtvbmZpZ3VyYXRpb246DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RpdGxlPVZcdTAwZTZsZyBlZ2Vuc2thYmVyLCBkZXIgc2thbCBzeW5rcm9uaXNlcmVzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Byb3BlcnRpZXNfbGFibGU9RWdlbnNrYWJlcg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9uYW1lX2xhYmxlPU5hdm4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJlc2VudGF0aW9uTmFtZV9sYWJsZT1Qclx1MDBlNnNlbnRhdGlvbnNuYXZuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2JyaWVmRGVzY19sYWJsZT1Lb3J0IGJlc2tyaXZlbHNlDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsPVZhbGdmcmkgaW5wdXQNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbWFuZGF0b3J5SW5wdXRzX2xhYmxlPVBcdTAwZTVrclx1MDBlNnZlZGUgaW5wdXQNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3V0cHV0c19sYWJlbD1PdXRwdXQNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9sYWJlbD1QcmltXHUwMGU2ciB1ZGZcdTAwZjhyZW5kZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9hZGRuUGVyZm9ybWVyc19sYWJsZT1ZZGVybGlnZXJlIHVkZlx1MDBmOHJlbmRlDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGU9QW5zdmFybGlnZSByb2xsZXINCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfY29udG5BcnRpZmFjdHNfbGFiZWw9SW5kZWhvbGR0ZSBhcnRlZmFrdGVyDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2RpbHZlZFBhcnRzX2xhYmVsPUxldmVyYW5jZWRlbGUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfc2VsU3RlcHNfbGFiZWw9VmFsZyBhZiB0cmluDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RleHQ9Vlx1MDBlNmxnIGVnZW5za2FiZXJuZSBmb3IgZGV0IG1ldG9kZWluZGhvbGQsIGRlciBza2FsIG92ZXJ2ZWplcyBtZWQgaGVuc3luIHRpbCBzeW5rcm9uaXNlcmluZy4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGl0bGU9VmlzIHJlc3VsdGF0IGFmIHN5bmtyb25pc2VyaW5nDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQ9R2VubmVtc2UgZGUgZm9yZXNsXHUwMGU1ZWRlIHN5bmtyb25pc2VyaW5nc29wbHlzbmluZ2VyIG5lZGVuZm9yLg0KLXNlbGVjdEVkaXRvcnNUb0Rpc2NhcmRDb25mbGljdENoYW5nZXM9RGVyIGVyIGVuIGtvbmZsaWt0IG1lbGxlbSBpa2tlLWdlbXRlIFx1MDBlNm5kcmluZ2VyIG9nIFx1MDBlNm5kcmluZ2VyLCBkZXIgZXIgZm9yZXRhZ2V0IHVkZW4gZm9yIGVkaXRvcmVybmUuXG5cDQotVlx1MDBlNmxnIGRlIFx1MDBmOG5za2VkZSBlZGl0b3JlciBmb3IgYXQgc2xldHRlIGRlcmVzIFx1MDBlNm5kcmluZ2VyLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF90aXRsZV90ZXh0PVN5bmtyb25pc2VyaW5nc2d1aWRlDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dD1EZW5uZSBndWlkZSBoalx1MDBlNmxwZXIgbWVkIGF0IG9wZnJpc2tlIGRlIHZhbGd0ZSBkZXNrcmlwdG9yZXIgZWxsZXIgYWxsZSBkZXNrcmlwdG9yZXIgdW5kZXIgZGUgdmFsZ3RlIGFrdGl2aXRldGVyLCBkZXIgZXIgbWFya2VyZXQgc29tICJTeW5rcm9uaXNlcmV0IG1lZCBraWxkZSIgcFx1MDBlNSBza2lsbGVibGFkZXQgR2VuZXJlbHQgaSBkZXJlcyBlZ2Vuc2thYnNvdmVyc2lndC4gXA0KLUt1biBkZSBlZ2Vuc2thYmVyLCBzb20gZHUgdlx1MDBlNmxnZXIgaSBkZW5uZSBndWlkZSwgYmxpdmVyIG9wZnJpc2tldCBpIGRlc2tyaXB0b3Jlcm5lLiBcDQotRHUga2FuIG9nc1x1MDBlNSB2XHUwMGU2bGdlIGVuIGd5bGRpZyBrb25maWd1cmF0aW9uIGZvciBkaW4gcHJvY2VzLCBzb20gc2thbCBicnVnZXMgdmVkIGJlcmVnbmluZyBhZiBvcGZyaXNrbmluZ2VuLiBcDQotQmVtXHUwMGU2cmssIGF0IGd1aWRlbiBpa2tlIG9wZGF0ZXJlciBkeW5hbWlzayBsaW5rZWRlIChnclx1MDBmOG4ga3Vyc2l2KSBkZXNrcmlwdG9yZXIuDQotDQotb3BlblJURT1cdTAwYzVibiBSaWNoIFRleHQgRWRpdG9yDQotY2xvc2VSVEU9THVrIFJpY2ggVGV4dCBFZGl0b3INCi0NCi0jTmV3IFN0cmluZ3MNCi1yb2xlc2V0c19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGVuIHZlamxlZG5pbmcsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZXR0ZSByb2xsZXNcdTAwZTZ0Lg0KLWRpc2NpcGxpbmVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIGRpc2NpcGxpbi4NCi13b3JrcHJvZHVjdHR5cGVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIGFyYmVqZHNwcm9kdWt0dHlwZS4NCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRldHRlIGRvbVx1MDBlNm5lLg0KLXRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRldHRlIHZcdTAwZTZya3RcdTAwZjhqLg0KLWN1c3RvbWNhdGVnb3J5X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIHRpbHBhc3NlZGUga2F0ZWdvcmkuDQotDQotY29uY2VwdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGVuIHZlamxlZG5pbmcsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZXR0ZSBiZWdyZWIuDQotY2hlY2tsaXN0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIHRqZWtsaXN0ZS4NCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRldHRlIGVrc2VtcGVsLg0KLWd1aWRlbGluZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGVuIHZlamxlZG5pbmcsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZW5uZSByZXRuaW5nc2xpbmplLg0KLXJvYWRtYXBfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlbiB2ZWpsZWRuaW5nLCBzb20gaFx1MDBmOHJlciB0aWwgZGVubmUgdmVqdmlzZXIuDQotcmV1c2FibGVhc3NldF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGVuIHZlamxlZG5pbmcsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZXR0ZSBnZW5hbnZlbmRlbGlnZSBha3Rpdi4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlbiB2ZWpsZWRuaW5nLCBzb20gaFx1MDBmOHJlciB0aWwgZGV0dGUgc3RcdTAwZjh0dGVtYXRlcmlhbGUuDQotcmVwb3J0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIHJhcHBvcnQuDQotcHJhY3RpY2VfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlbiB2ZWpsZWRuaW5nLCBzb20gaFx1MDBmOHJlciB0aWwgZGVubmUgXHUwMGY4dmVsc2UuDQotdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlbiB2ZWpsZWRuaW5nLCBzb20gaFx1MDBmOHJlciB0aWwgZGVubmUgc2thYmVsb24uDQotdGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlbiB2ZWpsZWRuaW5nLCBzb20gaFx1MDBmOHJlciB0aWwgZGVubmUgdGVybWRlZmluaXRpb24uDQotdG9vbG1lbnRvcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGVuIHZlamxlZG5pbmcsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZW5uZSB2XHUwMGU2cmt0XHUwMGY4anNtZW50b3IuDQotd2hpdGVwYXBlcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGVuIHZlamxlZG5pbmcsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZW5uZSBodmlkYm9nLg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIGVzdGltZXJpbmdzb3ZlcnZlamVsc2UuDQotDQotDQotI05ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbg0KLXJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIHJvbGxlLg0KLXJvbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIHJvbGxlLg0KLXJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5naXYsIGh2b3JkYW4gZGVubmUgcm9sbGUgZXIgcmVsYXRlcmV0IHRpbCBlbiBhbmRlbiByb2xsZS4NCi1yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGVubmUgcm9sbGUuDQotDQotdGFza19kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGVubmUgb3BnYXZlLg0KLXRhc2tfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIG9wZ2F2ZS4NCi10YXNrX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIG9wZ2F2ZSBlciByZWxhdGVyZXQgdGlsIGVuIGFuZGVuIG9wZ2F2ZS4NCi10YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGVubmUgb3BnYXZlLg0KLQ0KLWFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYz1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSBkZXR0ZSBhcnRlZmFrdC4NCi1hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGV0dGUgYXJ0ZWZha3QuDQotYXJ0aWZhY3RfaWNvblNlY3Rpb25fZGVzYz1UaWxwYXMgaWtvbmVybmUgZm9yIGRldHRlIGFydGVmYWt0Lg0KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPUFuZ2l2IGxldmVyaW5nc29wbHlzbmluZ2VyIG9tIGRldHRlIGFydGVmYWt0Lg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1BbmdpdiB0aWxwYXNuaW5nc29wbHlzbmluZ2VyIG9tIGRldHRlIGFydGVmYWt0Lg0KLWFydGlmYWN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRldHRlIGFydGVmYWt0IGVyIHJlbGF0ZXJldCB0aWwgZXQgYW5kZXQgYXJ0ZWZha3QuDQotYXJ0aWZhY3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZXR0ZSBhcnRlZmFrdC4NCi0NCi1vdXRjb21lX2RldGFpbFNlY3Rpb25fZGVzYz1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSBkZXR0ZSByZXN1bHRhdC4NCi1vdXRjb21lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZXR0ZSByZXN1bHRhdC4NCi1vdXRjb21lX2ljb25TZWN0aW9uX2Rlc2M9VGlscGFzIGlrb25lcm5lIGZvciBkZXR0ZSByZXN1bHRhdC4NCi1vdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjPUFuZ2l2IGxldmVyaW5nc29wbHlzbmluZ2VyIG9tIGRldHRlIHJlc3VsdGF0Lg0KLW91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPUFuZ2l2IHRpbHBhc25pbmdzb3BseXNuaW5nZXIgb20gZGV0dGUgcmVzdWx0YXQuDQotb3V0Y29tZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZXR0ZSByZXN1bHRhdCBlciByZWxhdGVyZXQgdGlsIGV0IGFuZGV0IHJlc3VsdGF0Lg0KLW91dGNvbWVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZXR0ZSByZXN1bHRhdC4NCi0NCi1kZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGVubmUgbGV2ZXJhbmNlLg0KLWRlbGl2ZXJhYmxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZW5uZSBsZXZlcmFuY2UuDQotZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYz1UaWxwYXMgaWtvbmVybmUgZm9yIGRlbm5lIGxldmVyYW5jZS4NCi1kZWxpdmVyYWJsZV9ub3RhdGlvblNlY3Rpb25fZGVzYz1BbmdpdiBsZXZlcmluZ3NvcGx5c25pbmdlciBvbSBkZW5uZSBsZXZlcmFuY2UuDQotZGVsaXZlcmFibGVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPUFuZ2l2IHRpbHBhc25pbmdzb3BseXNuaW5nZXIgb20gZGVubmUgbGV2ZXJhbmNlLg0KLWRlbGl2ZXJhYmxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIGxldmVyYW5jZSBlciByZWxhdGVyZXQgdGlsIGVuIGFuZGVuIGxldmVyYW5jZS4NCi1kZWxpdmVyYWJsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiB2ZXJzaW9uc29wbHlzbmluZ2VyIG9tIGRlbm5lIGxldmVyYW5jZS4NCi0NCi1kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSBkZW5uZSBkaXNjaXBsaW4uDQotZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGVubmUgZGlzY2lwbGluLg0KLWRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5naXYsIGh2b3JkYW4gZGVubmUgZGlzY2lwbGluIGVyIHJlbGF0ZXJldCB0aWwgZW4gYW5kZW4gZGlzY2lwbGluLg0KLWRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZW5uZSBkaXNjaXBsaW4uDQotDQotZG9tYWluX2RldGFpbFNlY3Rpb25fZGVzYz1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSBkZXR0ZSBkb21cdTAwZTZuZS4NCi1kb21haW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRldHRlIGRvbVx1MDBlNm5lLg0KLWRvbWFpbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZXR0ZSBkb21cdTAwZTZuZSBlciByZWxhdGVyZXQgdGlsIGV0IGFuZGV0IGRvbVx1MDBlNm5lLg0KLWRvbWFpbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiB2ZXJzaW9uc29wbHlzbmluZ2VyIG9tIGRldHRlIGRvbVx1MDBlNm5lLg0KLQ0KLXdvcmtwcm9kdWN0dHlwZV9kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGVubmUgYXJiZWpkc3Byb2R1a3R0eXBlLg0KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGVubmUgYXJiZWpkc3Byb2R1a3R0eXBlLg0KLXdvcmtwcm9kdWN0dHlwZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZW5uZSBhcmJlamRzcHJvZHVrdHR5cGUgZXIgcmVsYXRlcmV0IHRpbCBlbiBhbmRlbiBhcmJlamRzcHJvZHVrdHR5cGUuDQotd29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGVubmUgYXJiZWpkc3Byb2R1a3R0eXBlLg0KLQ0KLXJvbGVzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRldHRlIHJvbGxlc1x1MDBlNnQuDQotcm9sZXNldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGV0dGUgcm9sbGVzXHUwMGU2dC4NCi1yb2xlc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRldHRlIHJvbGxlc1x1MDBlNnQgZXIgcmVsYXRlcmV0IHRpbCBldCBhbmRldCByb2xsZXNcdTAwZTZ0Lg0KLXJvbGVzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZXR0ZSByb2xsZXNcdTAwZTZ0Lg0KLQ0KLXRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRldHRlIHZcdTAwZTZya3RcdTAwZjhqLg0KLXRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRldHRlIHZcdTAwZTZya3RcdTAwZjhqLg0KLXRvb2xfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5naXYsIGh2b3JkYW4gZGV0dGUgdlx1MDBlNnJrdFx1MDBmOGogZXIgcmVsYXRlcmV0IHRpbCBldCBhbmRldCB2XHUwMGU2cmt0XHUwMGY4ai4NCi10b29sX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGV0dGUgdlx1MDBlNnJrdFx1MDBmOGouDQotDQotY29uY2VwdF9kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGV0dGUgYmVncmViLg0KLWNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRldHRlIGJlZ3JlYi4NCi1jb25jZXB0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRldHRlIGJlZ3JlYiBlciByZWxhdGVyZXQgdGlsIGV0IGFuZGV0IGJlZ3JlYi4NCi1jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGV0dGUgYmVncmViLg0KLQ0KLWNoZWNrbGlzdF9kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGVubmUgdGpla2xpc3RlLg0KLWNoZWNrbGlzdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGVubmUgdGpla2xpc3RlLg0KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZW5uZSB0amVrbGlzdGUgZXIgcmVsYXRlcmV0IHRpbCBlbiBhbmRlbiB0amVrbGlzdGUuDQotY2hlY2tsaXN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGVubmUgdGpla2xpc3RlLg0KLQ0KLWV4YW1wbGVfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRldHRlIGVrc2VtcGVsDQotZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGV0dGUgZWtzZW1wZWwuDQotZXhhbXBsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZXR0ZSBla3NlbXBlbCBlciByZWxhdGVyZXQgdGlsIGV0IGFuZGV0IGVrc2VtcGVsLg0KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZXR0ZSBla3NlbXBlbC4NCi0NCi1ndWlkZWxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIHJldG5pbmdzbGluamUuDQotZ3VpZGVsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZW5uZSByZXRuaW5nc2xpbmplLg0KLWd1aWRlbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZW5uZSByZXRuaW5nc2xpbmplIGVyIHJlbGF0ZXJldCB0aWwgZW4gYW5kZW4gcmV0bmluZ3NsaW5qZS4NCi1ndWlkZWxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZW5uZSByZXRuaW5nc2xpbmplLg0KLQ0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2RldGFpbFNlY3Rpb25fZGVzYz1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSBkZW5uZSBlc3RpbWVyaW5nc292ZXJ2ZWplbHNlLg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZW5uZSBlc3RpbWVyaW5nc292ZXJ2ZWplbHNlLg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIGVzdGltZXJpbmdzb3ZlcnZlamVsc2UgZXIgcmVsYXRlcmV0IHRpbCBlbiBhbmRlbiBlc3RpbWVyaW5nc292ZXJ2ZWplbHNlLg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGVubmUgZXN0aW1lcmluZ3NvdmVydmVqZWxzZS4NCi0NCi1wcmFjdGljZV9kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGVubmUgXHUwMGY4dmVsc2UuDQotcHJhY3RpY2VfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIFx1MDBmOHZlbHNlLg0KLXByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIFx1MDBmOHZlbHNlIGVyIHJlbGF0ZXJldCB0aWwgZW4gYW5kZW4gXHUwMGY4dmVsc2UuDQotcHJhY3RpY2VfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZW5uZSBcdTAwZjh2ZWxzZS4NCi0NCi1yZXBvcnRfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIHJhcHBvcnQuDQotcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZW5uZSByYXBwb3J0Lg0KLXJlcG9ydF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZW5uZSByYXBwb3J0IGVyIHJlbGF0ZXJldCB0aWwgZW4gYW5kZW4gcmFwcG9ydC4NCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZW5uZSByYXBwb3J0Lg0KLQ0KLXJlc3VhYmxlYXNzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRldHRlIGdlbmFudmVuZGVsaWdlIGFrdGl2Lg0KLXJlc3VhYmxlYXNzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRldHRlIGdlbmFudmVuZGVsaWdlIGFrdGl2Lg0KLXJlc3VhYmxlYXNzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5naXYsIGh2b3JkYW4gZGV0dGUgZ2VuYW52ZW5kZWxpZ2UgYWt0aXYgZXIgcmVsYXRlcmV0IHRpbCBldCBhbmRldCBnZW5hbnZlbmRlbGlndCBha3Rpdi4NCi1yZXN1YWJsZWFzc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGV0dGUgZ2VuYW52ZW5kZWxpZ2UgYWt0aXYuDQotDQotcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGVubmUgdmVqdmlzZXIuDQotcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGVubmUgdmVqdmlzZXIuDQotcm9hZG1hcF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZW5uZSB2ZWp2aXNlciBlciByZWxhdGVyZXQgdGlsIGVuIGFuZGVuIHZlanZpc2VyLg0KLXJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZW5uZSB2ZWp2aXNlci4NCi0NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRldHRlIHN0XHUwMGY4dHRlbWF0ZXJpYWxlLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGV0dGUgc3RcdTAwZjh0dGVtYXRlcmlhbGUuDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRldHRlIHN0XHUwMGY4dHRlbWF0ZXJpYWxlIGVyIHJlbGF0ZXJldCB0aWwgYW5kZXQgc3RcdTAwZjh0dGVtYXRlcmlhbGUuDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGV0dGUgc3RcdTAwZjh0dGVtYXRlcmlhbGUuDQotDQotdGVtcGxhdGVfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIHNrYWJlbG9uLg0KLXRlbXBsYXRlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZW5uZSBza2FiZWxvbi4NCi10ZW1wbGF0ZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZW5uZSBza2FiZWxvbiBlciByZWxhdGVyZXQgdGlsIGVuIGFuZGVuIHNrYWJlbG9uLg0KLXRlbXBsYXRlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGVubmUgc2thYmVsb24uDQotDQotdGVybWRlZmluaXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIHRlcm1kZWZpbml0aW9uLg0KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZW5uZSB0ZXJtZGVmaW5pdGlvbi4NCi10ZXJtZGVmaW5pdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZW5uZSB0ZXJtZGVmaW5pdGlvbiBlciByZWxhdGVyZXQgdGlsIGVuIGFuZGVuIHRlcm1kZWZpbml0aW9uLg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGVubmUgdGVybWRlZmluaXRpb24uDQotDQotdG9vbG1lbnRvcl9kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGVubmUgdlx1MDBlNnJrdFx1MDBmOGpzbWVudG9yLg0KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIHZcdTAwZTZya3RcdTAwZjhqc21lbnRvci4NCi10b29sbWVudG9yX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIHZcdTAwZTZya3RcdTAwZjhqc21lbnRvciBlciByZWxhdGVyZXQgdGlsIGVuIGFuZGVuIHZcdTAwZTZya3RcdTAwZjhqc21lbnRvci4NCi10b29sbWVudG9yX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGVubmUgdlx1MDBlNnJrdFx1MDBmOGpzbWVudG9yLg0KLQ0KLXdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIGh2aWRib2cuDQotd2hpdGVwYXBlcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGVubmUgaHZpZGJvZy4NCi13aGl0ZXBhcGVyX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIGh2aWRib2cgZXIgcmVsYXRlcmV0IHRpbCBlbiBhbmRlbiBodmlkYm9nLg0KLXdoaXRlcGFwZXJfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZW5uZSBodmlkYm9nLg0KLQ0KLWRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGVubmUgZGlzY2lwbGluZ3J1cHBlcmluZy4NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIGRpc2NpcGxpbmdydXBwZXJpbmcuDQotZGlzY2lwbGluZWdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIGRpc2NpcGxpbmdydXBwZXJpbmcgZXIgcmVsYXRlcmV0IHRpbCBlbiBhbmRlbiBkaXNjaXBsaW5ncnVwcGVyaW5nLg0KLWRpc2NpcGxpbmVncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiB2ZXJzaW9uc29wbHlzbmluZ2VyIG9tIGRlbm5lIGRpc2NpcGxpbmdydXBwZXJpbmcuDQotDQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSBkZW5uZSByb2xsZXNcdTAwZTZ0Z3J1cHBlcmluZy4NCi1yb2xlc2V0Z3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIHJvbGxlc1x1MDBlNnRncnVwcGVyaW5nLg0KLXJvbGVzZXRncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZW5uZSByb2xsZXNcdTAwZTZ0Z3J1cHBlcmluZyBlciByZWxhdGVyZXQgdGlsIGVuIGFuZGVuIHJvbGxlc1x1MDBlNnRncnVwcGVyaW5nLg0KLXJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiB2ZXJzaW9uc29wbHlzbmluZ2VyIG9tIGRlbm5lIHJvbGxlc1x1MDBlNnRncnVwcGVyaW5nLg0KLQ0KLWN1c3RvbWNhdGVnb3J5X2RldGFpbFNlY3Rpb25fZGVzYz1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSBkZW5uZSB0aWxwYXNzZWRlIGthdGVnb3JpLg0KLWN1c3RvbWNhdGVnb3J5X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZW5uZSB0aWxwYXNzZWRlIGthdGVnb3JpLg0KLWN1c3RvbWNhdGVnb3J5X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIHRpbHBhc3NlZGUga2F0ZWdvcmkgZXIgcmVsYXRlcmV0IHRpbCBlbiBhbmRlbiB0aWxwYXNzZXQga2F0ZWdvcmkuDQotY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZW5uZSB0aWxwYXNzZWRlIGthdGVnb3JpLg0KLWN1c3RvbWNhdGVnb3J5X0ljb25TZWN0aW9uX2Rlc2M9VGlscGFzIGlrb25lcm5lIGZvciBkZW5uZSB0aWxwYXNzZWRlIGthdGVnb3JpLg0KLQ0KLWNvbmNlcHRfaWNvblNlY3Rpb25fZGVzYz1UaWxwYXMgaWtvbmVybmUgZm9yIGRldHRlIGJlZ3JlYi4NCi1jaGVja2xpc3RfaWNvblNlY3Rpb25fZGVzYz1UaWxwYXMgaWtvbmVybmUgZm9yIGRlbm5lIHRqZWtsaXN0ZS4NCi10b29sbWVudG9yX2ljb25TZWN0aW9uX2Rlc2M9VGlscGFzIGlrb25lcm5lIGZvciBkZW5uZSB2XHUwMGU2cmt0XHUwMGY4anNtZW50b3IuDQotd2hpdGVwYXBlcl9pY29uU2VjdGlvbl9kZXNjPVRpbHBhcyBpa29uZXJuZSBmb3IgZGVubmUgaHZpZGJvZy4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjPVRpbHBhcyBpa29uZXJuZSBmb3IgZGVubmUgZXN0aW1lcmluZ3NvdmVydmVqZWxzZS4NCi10ZXJtZGVmaW5pdGlvbl9pY29uU2VjdGlvbl9kZXNjPVRpbHBhcyBpa29uZXJuZSBmb3IgZGVubmUgdGVybWRlZmluaXRpb24uDQotdGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYz1UaWxwYXMgaWtvbmVybmUgZm9yIGRlbm5lIHNrYWJlbG9uLg0KLXJldXNhYmxlYXNzZXRfaWNvblNlY3Rpb25fZGVzYz1UaWxwYXMgaWtvbmVybmUgZm9yIGRldHRlIGdlbmFudmVuZGVsaWdlIGFrdGl2Lg0KLXJlcG9ydF9pY29uU2VjdGlvbl9kZXNjPVRpbHBhcyBpa29uZXJuZSBmb3IgZGVubmUgcmFwcG9ydC4NCi1wcmFjdGljZV9pY29uU2VjdGlvbl9kZXNjPVRpbHBhcyBpa29uZXJuZSBmb3IgZGVubmUgXHUwMGY4dmVsc2UuDQotZXhhbXBsZV9pY29uU2VjdGlvbl9kZXNjPVRpbHBhcyBpa29uZXJuZSBmb3IgZGV0dGUgZWtzZW1wZWwuDQotZ3VpZGVsaW5lX2ljb25TZWN0aW9uX2Rlc2M9VGlscGFzIGlrb25lcm5lIGZvciBkZW5uZSByZXRuaW5nc2xpbmplLg0KLXJvYWRtYXBfaWNvblNlY3Rpb25fZGVzYz1UaWxwYXMgaWtvbmVybmUgZm9yIGRlbm5lIHZlanZpc2VyLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjPVRpbHBhcyBpa29uZXJuZSBmb3IgZGV0dGUgc3RcdTAwZjh0dGVtYXRlcmlhbGUuDQotDQotZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfdGl0bGU9RmlsZW4gZXIgXHUwMGU2bmRyZXQNCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY19tZXNzYWdlPUZpbGVuIGVyIFx1MDBlNm5kcmV0IGkgZmlsc3lzdGVtZXQuIFZpbCBkdSBpbmRsXHUwMGU2c2UgXHUwMGU2bmRyaW5nZXJuZT8NCi0NCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZT1Ba3Rpdml0ZXRzdmFyaWFiaWxpdGV0DQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnPUFrdGl2aXRldGVuICcnezB9Jycga2FuIGlra2UgYW5naXZlIHZhcmlhYmlsaXRldCBtZWQgJyd7MX0nJywgZm9yZGkgJyd7MX0nJyBhbGxlcmVkZSBoYXIgZW4gZWxsZXIgZmxlcmUgYmlkcmFnbmUvZXJzdGF0dGVkZSBha3Rpdml0ZXRlciBzb20gZGVucyB1bmRlcm9yZG5lZGUuDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMT1Ba3Rpdml0ZXRlbiAnJ3swfScnIGthbiBpa2tlIGFuZ2l2ZSB2YXJpYWJpbGl0ZXQgbWVkIGVuIGFmIGRlbnMgZGlyZWt0ZSBvdmVyb3JkbmVkZSBvZyBldmVudHVlbGxlIHByb2Nlc3Nlci4NCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cyPUFrdGl2aXRldGVuICcnezB9Jycga2FuIGlra2UgYW5naXZlIHZhcmlhYmlsaXRldCBtZWQgJyd7MX0nJywgZm9yZGkgZGV0IHZpbCByZXN1bHRlcmUgaSBjaXJrdWxcdTAwZTZyIGFmaFx1MDBlNm5naWdoZWQuDQotDQotYXBwbHlfcGF0dGVybl9lcnJvcl90aXRsZT1BbnZlbmQgbVx1MDBmOG5zdGVyDQotYXBwbHlfcGF0dGVybl9lcnJvcl9tc2c9QWt0aXZpdGV0ZW4gJyd7MH0nJyBrYW4gaWtrZSBhbnZlbmRlIG1cdTAwZjhuc3RlciBtZWQgJyd7MX0nJywgZm9yZGkgZGV0IHZpbCByZXN1bHRlcmUgaSBjaXJrdWxcdTAwZTZyIGFmaFx1MDBlNm5naWdoZWQuDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyPXwNCi1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc9VmlzIGVqZXIgYWYgZGVuIHVsXHUwMGY4c3RlIHJlZmVyZW5jZSBpIG92ZXJzaWd0ZW4gQmlibGlvdGVrDQotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZW1vdmVVbnJlc29sdmVkUmVmZXJlbmNlPUZqZXJuIGRlbiB1bFx1MDBmOHN0ZSByZWZlcmVuY2UNCi1wcm9tcHREZWxldGVDdXN0b21DYXRlZ29yeUJlZm9yZVJlbW92ZUxhc3RSZWZUb0l0PUR1IGVyIHZlZCBhdCBzbGV0dGUgZGVuIHNpZHN0ZSByZWZlcmVuY2UgdGlsIHswfSBpIHBsdWdpbicnZW4uIEVsZW1lbnQoZXIpIGJsaXZlciBzbGV0dGV0LiBWaWwgZHUgZm9ydHNcdTAwZTZ0dGU/DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSNCZWxvdyBwcm9wZXJ0eSAiZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzIiBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQNCi0jRG9uJ3QgZGVsZXRlIGEgc3BhY2UgYWZ0ZXIgIjogIg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzPTogDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2NmJmMmEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25UaXRsZT1HZW5lcmVsbGUgb3BseXNuaW5nZXINCi1Qcm9jZXNzX0RvY3VtZW50SW5mb3JtYXRpb25UaXRsZT1Eb2t1bWVudGF0aW9uc29wbHlzbmluZ2VyDQotQWN0aXZpdHlfZ3VpZGFuY2VJbmZvcm1hdGlvblRpdGxlPVZlamxlZG5pbmcNCi1CcmVha2Rvd25FbGVtZW50X29wdGlvbkluZm9ybWF0aW9uVGl0bGU9TmVkYnJ5ZG5pbmdzaW5kc3RpbGxpbmdlcg0KLVRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvblRpdGxlPVRyaW4NCi0NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1BbmdpdiB0cmluZW5lIHRpbCB1ZGZcdTAwZjhyZWxzZSBhZiBkZW5uZSBvcGdhdmVkZXNrcmlwdG9yLg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIHswfS4NCi1Qcm9jZXNzX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1BbmdpdiBkb2t1bWVudGF0aW9uc29wbHlzbmluZ2VyIG9tIHswfS4NCi0NCi1EZXNjcmlwdG9yX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZW5uZSBkZXNrcmlwdG9yLg0KLURlc2NyaXB0b3JfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSBkZW5uZSBkZXNrcmlwdG9yLg0KLU1pbGVzdG9uZV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGVubmUgbWlsZXBcdTAwZTZsLg0KLU1pbGVzdG9uZV9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIG1pbGVwXHUwMGU2bC4NCi0NCi1CcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZXR0ZSBuZWRicnlkbmluZ3NlbGVtZW50Lg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZXR0ZSBhcmJlamRzbmVkYnJ5ZG5pbmdzZWxlbWVudC4NCi1EZXNjcmlwdG9yX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0b249QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIGRlc2tyaXB0b3IuDQotQWN0aXZpdHlfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIGFrdGl2aXRldC4NCi0NCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1BbmdpdiBkb2t1bWVudGF0aW9uc29wbHlzbmluZ2VyIG9tIGRldHRlIG5lZGJyeWRuaW5nc2VsZW1lbnQuDQotQWN0aXZpdHlfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUFuZ2l2IGRva3VtZW50YXRpb25zb3BseXNuaW5nZXIgb20gZGVubmUgYWt0aXZpdGV0Lg0KLURlc2NyaXB0b3JfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUFuZ2l2IGRva3VtZW50YXRpb25zb3BseXNuaW5nZXIgb20gZGVubmUgZGVza3JpcHRvci4NCi1Qcm9jZXNzX05vbmU9PDwgSU5HRU4gPj4NCi1Qcm9jZXNzX25hbWU9TmF2bjoNCi1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9UHJcdTAwZTZzZW50YXRpb25zbmF2bjoNCi1Qcm9jZXNzX2JyaWVmRGVzY3JpcHRpb249S29ydCBiZXNrcml2ZWxzZToNCi1Qcm9jZXNzX21haW5EZXNjcmlwdGlvbj0gT3Zlcm9yZG5ldCBiZXNrcml2ZWxzZToNCi1Qcm9jZXNzX3B1cnBvc2U9Rm9ybVx1MDBlNWw6DQotUHJvY2Vzc19wcmVmaXg9UHJcdTAwZTZmaWtzOg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfVHlwZV9OYW1lPU5lZGJyeWRuaW5nc2VsZW1lbnQNCi0NCi1Qcm9jZXNzX1R5cGVfVGFzaz1NZXRvZGVvcGdhdmU6DQotUHJvY2Vzc19UeXBlX1JvbGU9TWV0b2Rlcm9sbGU6DQotUHJvY2Vzc19UeXBlX1dvcmtQcm9kdWN0PU1ldG9kZWFyYmVqZHNwcm9kdWt0Og0KLQ0KLVdvcmtQcm9kdWN0X1R5cGU9QXJiZWpkc3Byb2R1a3R0eXBlOg0KLQ0KLUFjdGl2aXR5X01vZGVsSW5mbz1Nb2RlbG9wbHlzbmluZ2VyOg0KLUFjdGl2aXR5X1R5cGU9QWt0aXZpdGV0c3R5cGU6DQotQWN0aXZpdHlfcHJlc2VudGF0aW9uTmFtZT1Qclx1MDBlNnNlbnRhdGlvbnNuYXZuOg0KLUFjdGl2aXR5X2FsdGVybmF0aXZlcz1BbHRlcm5hdGl2ZXI6DQotQWN0aXZpdHlfaG93VG9TdGFmZj1CZW1hbmRpbmc6DQotQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucz1OXHUwMGY4Z2xlb3ZlcnZlamVsc2VyOg0KLVByb2Nlc3NfdXNhZ2VHdWlkYW5jZT1CcnVnc3ZlamxlZG5pbmc6DQotDQotQWN0aXZpdHlfUm9hZG1hcFRpdGxlPVZlanZpc2VyZQ0KLUFjdGl2aXR5X1JvYWRtYXBEZXNjcmlwdGlvbj1BbmdpdiBsaW5rIHRpbCBmbGVyZSBvcGx5c25pbmdlciBpIGZvcm0gYWYgdmVqdmlzZXJlLg0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlPUdlbmVyZWwgdmVqbGVkbmluZw0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uPUFuZ2l2IGxpbmsgdGlsIGZsZXJlIG9wbHlzbmluZ2VyIGkgZm9ybSBhZiB2ZWpsZWRuaW5nLg0KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbFRpdGxlPUtvbW11bmlrYXRpb25zbWF0ZXJpYWxlDQotQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249QW5naXYgbGluayB0aWwgZmxlcmUgb3BseXNuaW5nZXIgaSBmb3JtIGFmIGtvbW11bmlrYXRpb25zbWF0ZXJpYWxlLg0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU9VWRkYW5uZWxzZXNtYXRlcmlhbGUNCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPUFuZ2l2IGxpbmsgdGlsIGZsZXJlIG9wbHlzbmluZ2VyIGkgZm9ybSBhZiB1ZGRhbm5lbHNlc21hdGVyaWFsZS4NCi0NCi1BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwPVZlanZpc2VyZToNCi1BY3Rpdml0eV9TZWxlY3RlZF9HZW5lcmFsR3VpZGFuY2U9VmVqbGVkbmluZzoNCi1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9S29tbXVuaWthdGlvbnNtYXRlcmlhbGU6DQotQWN0aXZpdHlfU2VsZWN0ZWRfRWR1Y2F0aW9uTWF0ZXJpYWw9VWRkYW5uZWxzZXNtYXRlcmlhbGU6DQotDQotQWN0aXZpdHlfRGlhZ3JhbVRpdGxlPURpYWdyYW0NCi1BY3Rpdml0eV9EaWFncmFtRGVzY3JpcHRpb24gPSBBbmdpdiBkaWFncmFtYmlsbGVkZXIgdGlsIGRldHRlIHswfS4NCi1BY3Rpdml0eV9BREltYWdlPUFrdGl2aXRldHNkaWFncmFtDQotQWN0aXZpdHlfQURESW1hZ2U9QWt0aXZpdGV0c29wbHlzbmluZ3NkaWFncmFtDQotQWN0aXZpdHlfV1BESW1hZ2U9RGlhZ3JhbSBmb3IgYXJiZWpkc3Byb2R1a3RhZmhcdTAwZTZuZ2lnaGVkDQotQWN0aXZpdHlfVXNlQURJbWFnZT1CcnVnIGFrdGl2aXRldHNkaWFncmFtIHRpbCBwdWJsaWNlcmluZw0KLUFjdGl2aXR5X1VzZUFEREltYWdlPUJydWcgYWt0aXZpdGV0c29wbHlzbmluZ3NkaWFncmFtIHRpbCBwdWJsaWNlcmluZw0KLUFjdGl2aXR5X1VzZVdQREltYWdlPUJydWcgZGlhZ3JhbSBmb3IgYXJiZWpkc3Byb2R1a3RhZmhcdTAwZTZuZ2lnaGVkIHRpbCBwdWJsaWNlcmluZw0KLUFjdGl2aXR5X0Fzc2lnbj1UaWxkZWwuLi4NCi0NCi1UYXNrRGVzY3JpcHRvcl9TZWxlY3RlZF9TdGVwcz1UcmluOg0KLVRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dUaXRsZT1UcmluDQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2U9Vlx1MDBlNmxnIHRyaW4NCi0NCi1BY3Rpdml0eV9Xb3JrUm9sbHVwPUFyYmVqZHNrb25zb2xpZGVyaW5nDQotQWN0aXZpdHlfVGVhbVJvbGx1cD1UZWFta29uc29saWRlcmluZw0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cD1BcmJlamRzcHJvZHVrdGtvbnNvbGlkZXJpbmcNCi1BY3Rpdml0eV9Xb3JrUm9sbHVwRGVzY3JpcHRpb249R2VubmVtc2UgYXJiZWpkc2tvbnNvbGlkZXJpbmcgZm9yIGFrdGl2aXRldGVuIGkgZGV0dGUgYWZzbml0Lg0KLUFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbj1HZW5uZW1zZSB0ZWFta29uc29saWRlcmluZyBmb3IgYWt0aXZpdGV0ZW4gaSBkZXR0ZSBhZnNuaXQuDQotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb249R2VubmVtc2UgYXJiZWpkc3Byb2R1a3Rrb25zb2xpZGVyaW5nIGZvciBha3Rpdml0ZXRlbiBpIGRldHRlIGFmc25pdC4NCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9NdWx0aXBsZU9jdXJyYW5jZT1GbGVyZSBmb3Jla29tc3Rlcg0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX09wdGlvbmFsPVZhbGdmcml0DQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fUGxhbm5lZD1QbGFubGFndA0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N1cHJlc3NlZD1VbmRlcnRyeWt0DQotDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRXZlbnREcml2ZW49QWt0aXZpdGV0c3N0eXJldA0KLVdvcmtCcmVha2Rvd25FbGVtZW50X09uZ29pbmc9SWdhbmd2XHUwMGU2cmVuZGUNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9SZXBlYXRhYmxlPUthbiBnZW50YWdlcw0KLVdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29ycz1Gb3JnXHUwMGU2bmdlcmU6DQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeT1BZmhcdTAwZTZuZ2lnaGVkOg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQ9SW5kZWtzDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfUFJFU0VOVEFUSU9OX05BTUVfVEVYVD1Qclx1MDBlNnNlbnRhdGlvbnNuYXZuDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfREVQRU5ERU5DWV9URVhUPUFmaFx1MDBlNm5naWdoZWQNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZD1UaWxmXHUwMGY4ag0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfRWRpdD1SZWRpZ1x1MDBlOXINCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X1JlbW92ZT1GamVybg0KLQ0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUPVNsdXQgdGlsIHN0YXJ0DQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fRklOSVNIPVNsdXQgdGlsIHNsdXQNCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSD1TdGFydCB0aWwgc2x1dA0KLVdvcmtPcmRlclR5cGVfU1RBUlRfVE9fU1RBUlQ9U3RhcnQgdGlsIHN0YXJ0DQotDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3luY2hyb25pemVkPVN5bmtyb25pc2VyZXQgbWVkIGtpbGRlDQotDQotRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb249RGV0YWxqZXJldCBiZXNrcml2ZWxzZToNCi0NCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9Um9sbGVyDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPVRpbGRlbCByb2xsZWRlc2tyaXB0b3Jlcm5lIHRpbCB1ZGZcdTAwZjhyZWxzZSBhZiBkZW5uZSBvcGdhdmVkZXNrcmlwdG9yDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUxPVByaW1cdTAwZTZyIHVkZlx1MDBmOHJlbmRlOg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMj1ZZGVybGlnZXJlIHVkZlx1MDBmOHJlbmRlOg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMz1Bc3Npc3RlcmV0IGFmOg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9QXJiZWpkc3Byb2R1a3Rlcg0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249QW5naXYgaW5wdXQtIG9nIG91dHB1dGFyYmVqZHNwcm9kdWt0ZGVza3JpcHRvcmVyIGZvciBkZW5uZSBvcGdhdmVkZXNrcmlwdG9yLg0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTE9UFx1MDBlNWtyXHUwMGU2dmV0IGlucHV0Og0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9VmFsZ2ZyaXQgaW5wdXQ6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMz1Fa3N0ZXJudCBpbnB1dDoNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGU0PU91dHB1dDoNCi0NCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uVGl0bGU9T3BnYXZlcg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbj1EZW5uZSByb2xsZWRlc2tyaXB0b3IgdWRmXHUwMGY4cmVyIGZcdTAwZjhsZ2VuZGUgb3BnYXZlZGVza3JpcHRvcmVyLg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMT1QcmltXHUwMGU2ciB1ZGZcdTAwZjhyZW5kZToNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTI9WWRlcmxpZ2VyZSB1ZGZcdTAwZjhyZW5kZToNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTM9QXNzaXN0ZXJldCBhZjoNCi0NCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPUFyYmVqZHNwcm9kdWt0ZXINCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uPURlbm5lIHJvbGxlZGVza3JpcHRvciBlciBhbnN2YXJsaWcgZm9yIG9nIFx1MDBlNm5kcmVyIGZcdTAwZjhsZ2VuZGUgYXJiZWpkc3Byb2R1a3RkZXNrcmlwdG9yZXIuDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1BbnN2YXJsaWcgZm9yOg0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9XHUwMGM2bmRyZXI6DQotDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1Sb2xsZXINCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPUZcdTAwZjhsZ2VuZGUgcm9sbGVkZXNrcmlwdG9yZXIgZXIgYW5zdmFybGlnIGZvciBvZyBcdTAwZTZuZHJlciBkZW5uZSBhcmJlamRzcHJvZHVrdGRlc2tyaXB0b3IuDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1BbnN2YXJsaWcgZm9yOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9XHUwMGM2bmRyZXQgYWY6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1R5cGU9VHlwZToNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlPUFrdGl2aXRldHNpbmRnYW5nc3RpbHN0YW5kOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZT1Ba3Rpdml0ZXRzdWRnYW5nc3RpbHN0YW5kOg0KLQ0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvblRpdGxlPUxldmVyYW5jZWRlbGUNCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbj1MZXZlcmFuY2VuIGhhciBmXHUwMGY4bGdlbmRlIGRlbGUsIHNvbSBrYW4gbGV2ZXJlcy4NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMT1MZXZlcmFuY2VkZWxlDQotDQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uVGl0bGU9VGVhbXMNCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25EZXNjcmlwdGlvbj1EZW5uZSByb2xsZWRlc2tyaXB0b3IgaGVudmlzZXIgdGlsIGZcdTAwZjhsZ2VuZGUgdGVhbXMuDQotUm9sZURlc2NyaXB0b3JfVGVhbV9UYWJsZTE9VGVhbXM6DQotDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25UaXRsZT1Sb2xsZXINCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uPURlbm5lIHNhbW1lbnNhdHRlIHJvbGxlIGhhciBmXHUwMGY4bGdlbmRlIHNhbWxlZGUgcm9sbGVyOg0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9UYWJsZTE9U2FtbGVkZSByb2xsZXI6DQotDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uVGl0bGU9Um9sbGVyDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249VGlsZlx1MDBmOGogdGlsIGVsbGVyIGZqZXJuIHJvbGxlciBmcmEgdGVhbXByb2ZpbGVuLg0KLVRlYW1Qcm9maWxlX1JvbGVfVGFibGUxPVJvbGxlcjoNCi0NCi1Qcm9jZXNzX1JpY2hUZXh0X0NvbGxhcHNlSW1hZ2U9Y29sbGFwc2VkLmdpZg0KLVByb2Nlc3NfUmljaFRleHRfRXhwYW5kSW1hZ2U9ZXhwYW5kZWQuZ2lmDQotUHJvY2Vzc19BZGQ9VGlsZlx1MDBmOGouLi4NCi1Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzPVRpbGZcdTAwZjhqIGZyYSBwcm9jZXMuLi4NCi1Qcm9jZXNzX1JlbmFtZV9NZXNzYWdlPUR1IGVyIHZlZCBhdCBcdTAwZTZuZHJlIG5hdm5ldCBwXHUwMGU1IHByb2Nlc3Nlbi4gRGVubmUgZnVua3Rpb24gZ2VtbWVyIGVkaXRvcmVuIG9nIG9tZFx1MDBmOGJlciBwcm9jZXNmb2xkZXJlbiB0aWwgZGV0IG55ZSBuYXZuLiBWaWwgZHUgZm9ydHNcdTAwZTZ0dGU/DQotUHJvY2Vzc19SZW1vdmU9Rmplcm4NCi1Qcm9jZXNzX1VwPU9wDQotUHJvY2Vzc19Eb3duPU5lZA0KLVByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb249RmxlcmUgdmFsZw0KLVByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50PUxpbmsgbWV0b2RlZWxlbWVudC4uLg0KLQ0KLSMjIEVycm9yL1dhcm5pbmcNCi1Qcm9jZXNzX0ludmFsaWROYW1lVGl0bGU9VWd5bGRpZ3QgbmF2bg0KLVByb2Nlc3NfSW52YWxpZE5hbWU9SVVQQTAwODFFOiBOYXZuZXQgc2thbCB1ZGZ5bGRlcy4gQW5naXYgZXQgZ3lsZGlndCBuYXZuLg0KLVByb2Nlc3NfUmVuYW1lX1RpdGxlPU9tZFx1MDBmOGINCi1Qcm9jZXNzX0ludmFsaWRQcmVzZW50YXRpb25OYW1lPUlVUEEwMDgyRTogUHJcdTAwZTZzZW50YXRpb25zbmF2bmV0IGthbiB1ZGZ5bGRlcy4gQW5naXYgZXQgZ3lsZGlndCBwclx1MDBlNnNlbnRhdGlvbnNuYXZuLg0KLVByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZT1MaW5rIG1ldG9kZWVsZW1lbnQNCi1Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudD1JVVBBMDA4M0U6IEthbiBpa2tlIGxpbmtlIHRpbCAnJ3swfScnLCBmb3JkaSBkZXR0ZSBtZXRvZGVlbGVtZW50IGFsbGVyZWRlIGJydWdlcyB0aWwgZW4gYW5kZW4gZGVza3JpcHRvciB1bmRlciBkZW4gc2FtbWUgb3Zlcm9yZG5lZGUuDQotUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlPU9wbHlzbmluZ2VyDQotUHJvY2Vzc19UZWFtQXNzaWduRXJyb3I9SVVQQTAwODRFOiBLYW4gaWtrZSB0aWxmXHUwMGY4amUgJyd7MH0nJyB0aWwgdGVhbWV0ICcnezF9JycgXG5cblJvbGxlZGVza3JpcHRvcihlcikgc2thbCBoYXZlIHRpbGtueXR0ZXQgbWV0b2RlZWxlbWVudHJvbGxlIGZvciBhdCBrdW5uZSB0aWxkZWxlcyB0aWwgdGVhbS5cblxuUmV0IHRpbGtueXRuaW5nZW4sIG9nIHByXHUwMGY4diBpZ2VuLg0KLVByb2Nlc3NfVGVhbURpYWxvZ01lc3NhZ2U9Vlx1MDBlNmxnIHRlYW1zDQotUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGU9VGVhbXMNCi0NCi1Qcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3I9SVVQQTAwODVFOiBLYW4gaWtrZSB0aWxmXHUwMGY4amUgJyd7MH0nJyB0aWwgZGVuIGxldlx1MDBlOXJiYXJlICcnezF9JycsIGZvcmRpIGRlciBpa2tlIGVyIHRpbGtueXR0ZXQgZXQgbWV0b2RlZWxlbWVudCBhZiB0eXBlbiBhcmJlamRzcHJvZHVrdC4NCi1Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcj1JVVBBMDA4NkU6IEthbiBpa2tlIHRpbGZcdTAwZjhqZSAnJ3swfScnIHRpbCBkZW4gc2FtbWVuc2F0dGUgcm9sbGUgJyd7MX0nJywgZm9yZGkgZGVyIGlra2UgZXIgdGlsa255dHRldCBlbiBtZXRvZGVlbGVtZW50cm9sbGUuDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlPUlVUEEwMDg3VzogQW5naXYgZXQgZ3lsZGlndCB0YWwgZm9yIGZvcmdcdTAwZTZuZ2VyZS4NCi1Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlclRpdGxlPVVneWxkaWcgZm9yZ1x1MDBlNm5nZXItaWQNCi0NCi1Qcm9jZXNzX05vSXRlbXM9SW5nZW4gZWxlbWVudGVyIHZhbGd0DQotUHJvY2Vzc19JdGVtc1NlbGVjdGVkPXswfSBlbGVtZW50ZXIgdmFsZ3QNCi1Qcm9jZXNzX05vUHJvcGVydGllc0F2YWlsYWJsZT1JbmdlbiBlZ2Vuc2thYmVyIHRpbGdcdTAwZTZuZ2VsaWdlDQotDQotUHJlZGVjZXNzb3JEaWFsb2dfVGl0bGU9Rm9yZ1x1MDBlNm5nZXJhZmhcdTAwZTZuZ2lnaGVkDQotUHJlZGVjZXNzb3JEaWFsb2dfSGVhZGVyTWVzc2FnZT1BbmdpdiBhZmhcdTAwZTZuZ2lnaGVkc3R5cGUgZm9yIGZvcmdcdTAwZTZuZ2VyOg0KLVByZWRlY2Vzc29yRGlhbG9nX0luZGV4PUluZGVrczoNCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lPVByXHUwMGU2c2VudGF0aW9uc25hdm46DQotUHJlZGVjZXNzb3JEaWFsb2dfRGVwZW5kZW5jeT1BZmhcdTAwZTZuZ2lnaGVkOg0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZT1Gb3JnXHUwMGU2bmdlcg0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JNZXNzYWdlPUlVUEEwMDg4RTogRm9yZ1x1MDBlNm5nZXIgbWVkIGRlbm5lIGlkIGZpbmRlcyBhbGxlcmVkZSBmb3IgZGV0dGUgYXJiZWpkc25lZGJyeWRuaW5nc2VsZW1lbnQuDQotDQotUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX3RleHRFZGl0Q2VsbF9wcm9ibGVtX21zZz1JVVBBMDA5MEU6IERlciBlciBvcHN0XHUwMGU1ZXQgZW4gZmVqbCB1bmRlciByZWRpZ2VyaW5nIGFmIGVuIGVnZW5za2FiLg0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc19jZWxsRWRpdG9yX2ludmFsaWRQcmVkY2Vzc29yX3Byb2JsZW1fbXNnPUlVUEEwMDg5VzogVWd5bGRpZyBmb3JnXHUwMGU2bmdlcmxpc3RlDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2MzFkZTkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlOTFhMmYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwxLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmJhc2U7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBmcmFnbWVudAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdkYTEzZGMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoNCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksDQotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotDQotZmVhdHVyZU5hbWU9RVBGIC0gQmFzaXMNCi0NCi1mZWF0dXJlVGV4dD1FUEYgLSBCYXNpc1xuXA0KLVxuXA0KLVZlcnNpb246IDEuMC4xLjAwIFxuXA0KLUJ1aWxkLUtlbm51bmc6IDIwMDYwMjA2XzA1NFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiBBbGxlIFJlY2h0ZSB2b3JiZWhhbHRlbi5cblwNCi1cbg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2VzLmh0bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9lcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OTFhZGI2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPg0KLTx0aXRsZT5BY2VyY2EgZGU8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJFUy1FUyI+DQotPGgyPkFjZXJjYSBkZWwgY29udGVuaWRvPC9oMj4NCi0gDQotPHA+MjQgZGUgZmVicmVybyBkZSAyMDA1PC9wPgkNCi08aDM+TGljZW5jaWE8L2gzPg0KLQ0KLTxwPkxhIEVjbGlwc2UgRm91bmRhdGlvbiBoYSBoZWNobyBxdWUgdG9kbyBlbCBDb250ZW5pZG8gZXN0w6kgZGlzcG9uaWJsZSBlbiBlc3RlDQotcGx1Zy1pbiAoJnF1b3Q7Q29udGVuaWRvJnF1b3Q7KS4gIEEgbWVub3MgcXVlIHNlIGluZGlxdWUgbG8gY29udHJhcmlvIG3DoXMNCi1hZGVsYW50ZSwgZWwgQ29udGVuaWRvIHNlIHByb3BvcmNpb25hIGFsIHVzdWFyaW8gYmFqbyBsb3MgdMOpcm1pbm9zIHkNCi1jb25kaWNpb25lcyBkZSBsYSBMaWNlbmNpYSBww7pibGljYSBkZSBFY2xpcHNlIFZlcnNpw7NuIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIA0KLVVuYSBjb3BpYSBkZSBsYSBFUEwgZXN0w6EgZGlzcG9uaWJsZSBlbg0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotUGFyYSBsb3MgZmluZXMgZGUgbGEgRVBMLCAmcXVvdDtQcm9ncmFtYSZxdW90OyBxdWllcmUgZGVjaXIgZWwgQ29udGVuaWRvLjwvcD4NCi0NCi08cD5TaSBubyByZWNpYmnDsyBlc3RlIENvbnRlbmlkbyBkaXJlY3RhbWVudGUgZGUgbGEgRWNsaXBzZSBGb3VuZGF0aW9uLCDDqXN0ZQ0KLWVzdMOhIHNpZW5kbyByZWRpc3RyaWJ1aWRvIHBvciB0ZXJjZXJvcyAoJnF1b3Q7UmVkaXN0cmlidWlkb3ImcXVvdDspIHkgcHVlZGVuDQotYXBsaWNhcnNlIHTDqXJtaW5vcyB5IGNvbmRpY2lvbmVzIGRpc3RpbnRvcyBhbCB1c28gZGUgY3VhbHF1aWVyIGPDs2RpZ28gZGUgb2JqZXRvDQotZGVsIENvbnRlbmlkby4NCi1Db21wcnVlYmUgbGEgbGljZW5jaWEgZGVsIFJlZGlzdHJpYnVpZG9yIHF1ZSBzZSBwcm9wb3JjaW9uw7MganVudG8gY29uIGVsDQotQ29udGVuaWRvLiAgU2kgbm8gZXhpc3RlIHRhbCBsaWNlbmNpYSwgcMOzbmdhc2UgZW4gY29udGFjdG8gY29uIGVsDQotUmVkaXN0cmlidWlkb3IuICBBIG1lbm9zIHF1ZSBzZSBpbmRpcXVlIGxvIGNvbnRyYXJpbyBtw6FzIGFkZWxhbnRlLCBsb3MgdMOpcm1pbm9zDQoteSBjb25kaWNpb25lcyBkZSBsYSBFUEwgc2Ugc2VndWlyw6FuIGFwbGljYW5kbyBhIGN1YWxxdWllciBjw7NkaWdvIGZ1ZW50ZSBkZWwNCi1Db250ZW5pZG8uPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhNWJhNWYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoNCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksDQotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotDQotZmVhdHVyZU5hbWU9RVBGIEJhc2UNCi0NCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXA0KLVxuXA0KLVZlcnNpXHUwMGYzbjogMS4wLjEuMDAgXG5cDQotRXRpcXVldGEgZGUgYnVpbGQ6IDIwMDYwMjA2XzA1NFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgQ29sYWJvcmFkb3JlcyBkZSBFY2xpcHNlIHkgb3Ryb3MgMjAwNCwgMjAwNi4gIFJlc2VydmFkb3MgdG9kb3MgbG9zIGRlcmVjaG9zLlxuXA0KLVxuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfZnIuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2ZyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4NzMzZTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfZnIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+DQotPHRpdGxlPkEgcHJvcG9zIGRlPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iRlItRlIiPg0KLTxoMj5BIHByb3BvcyBkZSBjZSBjb250ZW51PC9oMj4NCi0gDQotPHA+MjQgZsOpdnJpZXIgMjAwNTwvcD4JDQotPGgzPkxpY2VuY2U8L2gzPg0KLQ0KLTxwPkxhIEZvbmRhdGlvbiBFY2xpcHNlIGZvdXJuaXQgbCdlbnNlbWJsZSBkdSBjb250ZW51IGZpZ3VyYW50IGRhbnMgY2UgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudSZxdW90OykuICBTYXVmIGluZGljYXRpb24gY29udHJhaXJlIG1lbnRpb25uw6llIGNpLWRlc3NvdXMsIGxlIGNvbnRlbnUgdm91cyBlc3QgZm91cm5pIGNvbmZvcm3DqW1lbnQgYXV4IHRlcm1lcyBldCBjb25kaXRpb25zIGRlDQotbCdFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgVW5lIGNvcGllIGRlIGwnRVBMIGVzdCBkaXNwb25pYmxlIMOgIGwnYWRyZXNzZSBzdWl2YW50ZSA6IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotRGFucyBsZSBjYWRyZSBkZSBsJ0VQTCwgbGUgdGVybWUgJnF1b3Q7UHJvZ3JhbW1lJnF1b3Q7IHNpZ25pZmllICJDb250ZW51Ii48L3A+DQotDQotPHA+U2kgdm91cyBuJ2F2ZXogcGFzIHJlw6d1IGNlIGNvbnRlbnUgZGlyZWN0ZW1lbnQgdmlhIGxhIEZvbmRhdGlvbiBFY2xpcHNlLCB1bmUgYXV0cmUgcGFydGllIGVzdCBlbiB0cmFpbiBkZSBsZSByZWRpc3RyaWJ1ZXIgKCZxdW90O1JlZGlzdHJpYnV0ZXVyJnF1b3Q7KSBldCBkaWZmw6lyZW50cyB0ZXJtZXMgZXQgY29uZGl0aW9ucyBwZXV2ZW50DQotcydhcHBsaXF1ZXIgw6Agdm90cmUgdXRpbGlzYXRpb24gZGUgdG91dCBjb2RlIG9iamV0IGZpZ3VyYW50IGRhbnMgbGUgY29udGVudS4gIFbDqXJpZmlleiBsYSBsaWNlbmNlIGR1IHJlZGlzdHJpYnV0ZXVyIGZvdXJuaWUgYXZlYyBsZSBjb250ZW51LiAgU2kgdW5lIHRlbGxlIGxpY2VuY2UgbidleGlzdGUgcGFzLCBjb250YWN0ZXogbGUgcmVkaXN0cmlidXRldXIuICBTYXVmIGluZGljYXRpb24gY29udHJhaXJlIG1lbnRpb25uw6llIGNpLWRlc3NvdXMsDQotbGVzIHRlcm1lcyBldCBjb25kaXRpb25zIGRlIGwnRVBMIHMnYXBwbGlxdWVudCB0b3Vqb3VycyDDoCBuJ2ltcG9ydGUgcXVlbCBjb2RlIHNvdXJjZSBmaWd1cmFudCBkYW5zIGxlIGNvbnRlbnUuPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5NmU0MjkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoNCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksDQotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotDQotZmVhdHVyZU5hbWU9QmFzZSBFUEYNCi0NCi1mZWF0dXJlVGV4dD1CYXNlIEVQRiBcblwNCi1cblwNCi1WZXJzaW9uIDogMS4wLjEuMDAgXG5cDQotTGliZWxsXHUwMGU5IGRlIHZlcnNpb24gOiAyMDA2MDIwNl8wNTRcblwNCi1cblwNCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cDQotXG4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9pdC5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfaXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjY4NjY0Yy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9pdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4NCi08dGl0bGU+SW5mb3JtYXppb25pIHN1DQotPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iRU4tVVMiPg0KLTxoMj5JbmZvcm1hemlvbmkgc3UgcXVlc3RvIGNvbnRlbnV0bzoNCi08L2gyPg0KLSANCi08cD4yNCBGZWJicmFpbywgMjAwNTwvcD4JDQotPGgzPkxpY2VuemE8L2gzPg0KLQ0KLTxwPkVjbGlwc2UgRm91bmRhdGlvbiByZW5kZSBkaXNwb25pYmlsZSB0dXR0byBpbCBjb250ZW51dG8gaW4gcXVlc3RvIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiBBIG1lbm8gY2hlIG5vbiBzaWEgZGl2ZXJzYW1lbnRlIGluZGljYXRvIGRpIHNlZ3VpdG8sIGlsIENvbnRlbnQgw6ggZm9ybml0byBpbiBiYXNlIGFsbGUgY2xhdXNvbGUgZSBjb25kaXppb25pIGRpIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbmUgMS4wICgmcXVvdDtFUEwmcXVvdDspLiBVbmEgY29waWEgZGkgRVBMIMOoIGRpc3BvbmliaWxlIHByZXNzbyBpbCBzaXRvIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotICAgUGVyIGdsaSBzY29waSBkaSBFUEwsICZxdW90O1Byb2dyYW1tYSZxdW90OyB2b3Jyw6AgZGlyZSBDb250ZW51dG8uPC9wPg0KLQ0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQ0KLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UNCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmJjNGU2NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOg0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwNCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0NCi1mZWF0dXJlTmFtZT1FUEYgQmFzZQ0KLQ0KLWZlYXR1cmVUZXh0PUVQRiBCYXNlXG5cDQotXG5cDQotVmVyc2lvbmU6IDEuMC4xLjAwIFxuXA0KLUV0aWNoZXR0YSBidWlsZDogMjAwNjAyMDZfMDU0XG5cDQotXG5cDQotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuICBUdXR0aSBpIGRpcml0dGkgcmlzZXJ2YXRpLlxuXA0KLVxuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfamEuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2phLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiZjZlMzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfamEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KLTx0aXRsZT7jg5Djg7zjgrjjg6fjg7Pmg4XloLENCi08L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJKQS1KUCI+DQotPGgyPuacrOabuOOBq+OBpOOBhOOBpjwvaDI+DQotIA0KLTxwPjIwMDUg5bm0IDIg5pyIIDI0IOaXpTwvcD4JDQotPGgzPuODqeOCpOOCu+ODs+OCuTwvaDM+DQotDQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQ0KLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQ0KLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UNCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDE4NjhhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOg0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwNCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0NCi1mZWF0dXJlTmFtZT1FUEYgQmFzZQ0KLQ0KLWZlYXR1cmVUZXh0PUVQRiBCYXNlXG5cDQotXG5cDQotXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzOiAxLjAuMS4wMCBcblwNCi1cdTMwZDNcdTMwZWJcdTMwYzlcdTMwZmJcdTMwZTlcdTMwZDlcdTMwZWI6IDIwMDYwMjA2XzA1NFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwNCi1cbg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2tvLmh0bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9rby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkN2U5YmZkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2tvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCi08dGl0bGU+7KCc7ZKIIOygleuztDwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9IktPLUtSIj4NCi08aDI+7J20IOy7qO2FkOy4oCDsoJXrs7Q8L2gyPg0KLSANCi08cD4yMDA164WEIDLsm5QgMjTsnbw8L3A+CQ0KLTxoMz7rnbzsnbTshLzsiqQ8L2gzPg0KLQ0KLTxwPkVjbGlwc2UgRm91bmRhdGlvbuydgCDrs7gg7ZSM65+s6re47J247J2YIOuqqOuToCDsu6jthZDsuKAo7J207ZWYICZxdW90O+y7qO2FkOy4oCZxdW90Oynrpbwg7IKs7Jqp7ZWgIOyImCDsnojrj4TroZ0g7KCc6rO17ZWp64uI64ukLiDslYTrnpjsl5DshJwg64us66asIOuqheyLnO2VmOyngCDslYrsnYAg7ZWcLCDrs7gg7Luo7YWQ7Lig64qUIEVjbGlwc2Ug6rO17JqpIOudvOydtOyEvOyKpCDrsoTsoIQgMS4wKOydtO2VmCAmcXVvdDtFUEwmcXVvdDsp7J2YIOyhsOqxtOyXkCDsnZjqsbDtlZjsl6wNCi3soJzqs7XrkKnri4jri6QuIEVQTCDsgqzrs7jsnYAgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPuyXkOyEnCDtmZXsnbjtlaAg7IiYIOyeiOyKteuLiOuLpC4NCi1FUEzsnZgg66qp7KCB7IOBLCAmcXVvdDvtlITroZzqt7jrnqgmcXVvdDvsnbTrnoAg7Luo7YWQ7Lig66W8IOydmOuvuO2VqeuLiOuLpC48L3A+DQotDQotPHA+6reA7ZWY6rCAIOuzuCDsu6jthZDsuKDrpbwgRWNsaXBzZSBGb3VuZGF0aW9u7Jy866Gc67aA7YSwIOyngeygkSDsoJzqs7XrsJvsp4Ag7JWK7J2AIOqyveyasCwg67O4IOy7qO2FkOy4oOuKlCDsoJwz7J6QKOydtO2VmCAmcXVvdDvsnqzrsLDtj6zsnpAmcXVvdDsp7JeQIOydmO2VtCDsnqzrsLDtj6zrkJjqs6Ag7J6I7Jy866mwIOq3gO2VmOydmCDrs7gg7Luo7YWQ7Lig7J2YIOyYpOu4jOygne2KuCDsvZTrk5wg7IKs7Jqp7JeQIOuMgO2VmOyXrCDri6Trpbgg7KGw6rG07J20IOyggeyaqeuQqeuLiOuLpC4g67O4IOy7qO2FkOy4oOyZgCDtlajqu5gg7KCc6rO165CcIOyerOuwsO2PrOyekOydmCDrnbzsnbTshLzsiqTrpbwg7ZmV7J247ZWY7Iut7Iuc7JikLiDsnbTrn6ztlZwg65287J207IS87Iqk6rCAIOyXhuuKlCDqsr3smrAsIOyerOuwsO2PrOyekOyXkOqyjCDrrLjsnZjtlZjsi63si5zsmKQuIOyVhOuemOyXkOyEnCDri6zrpqwg66qF7Iuc7ZWY7KeAIOyViuuKlCDtlZwsIEVQTOydmCDsobDqsbTsnbQg67O4IOy7qO2FkOy4oOydmCDrqqjrk6Ag7IaM7IqkIOy9lOuTnOyXkCDsoIHsmqnrkKnri4jri6QuPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmYjNlMDQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoNCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksDQotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotDQotZmVhdHVyZU5hbWU9RVBGIFx1YWUzMFx1YmNmOA0KLQ0KLWZlYXR1cmVUZXh0PUVQRiBcdWFlMzBcdWJjZjhcblwNCi1cblwNCi1cdWJjODRcdWM4MDQgMS4wLjEuMDAgXG5cDQotXHViZTRjXHViNGRjIFx1YjgwOFx1Yzc3NFx1YmUxNDogMjAwNjAyMDZfMDU0XG5cDQotXG5cDQotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cDQotXG4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9wdF9CUi5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfcHRfQlIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI0ODUwMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9wdF9CUi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4NCi08dGl0bGU+U29icmUgPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iRU4tVVMiPg0KLTxoMj5Tb2JyZSBFc3RlIENvbnRlw7pkbzwvaDI+DQotIA0KLTxwPjI0IGRlIGZldmVyZWlybyBkZSAyMDA1PC9wPgkNCi08aDM+TGljZW7Dp2E8L2gzPg0KLQ0KLTxwPkEgRWNsaXBzZSBGb3VuZGF0aW9uIGRpc3BvbmliaWxpemEgdG9kbyBjb250ZcO6ZG8gbmVzdGUgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICANCi1BIG1lbm9zIHF1ZSBpbmRpY2FkbyBvIGNvbnRyw6FyaW8gYSBzZWd1aXIsIHRvZG8gQ29udGXDumRvIMOpIGZvcm5lY2lkbyBhIHZvY8OqIHNvYiBvcyB0ZXJtb3MNCi1lIGNvbmRpw6fDtWVzIGRvIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc8OjbyAxLjAgKCZxdW90O0VQTCZxdW90OykuICBVbWEgY8OzcGlhIGRvIEVQTA0KLWVzdMOhIGRpc3BvbsOtdmVsIGVtDQotPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBQYXJhIGZpbnMgZG8gRVBMLCAmcXVvdDtQcm9ncmFtYSZxdW90OyBzaWduaWZpY2Fyw6EgbyBDb250ZcO6ZG8uPC9wPg0KLQ0KLTxwPlNlIHZvY8OqIG7Do28gcmVjZWJldSBlc3RlIENvbnRlw7pkbyBkaXJldGFtZW50ZSBkYSBFY2xpcHNlIEZvdW5kYXRpb24sIG8gQ29udGXDumRvIGVzdMOhDQotc2VuZG8gcmVkaXN0cmlidcOtZG8gcG9yIG91dHJhIHBhcnRlICgmcXVvdDtSZWRpc3RyaWJ1aWRvciZxdW90OykgZSB0ZXJtb3MgZSBjb25kacOnw7Vlcw0KLWRpZmVyZW50ZXMgcG9kZW0gc2UgYXBsaWNhciBhbyB1c28gZGUgcXVhbHF1ZXIgY8OzZGlnbyBkZSBvYmpldG8gbm8gQ29udGXDumRvLiAgVmVyaWZpcXVlIGENCi1saWNlbsOnYSBkbyBSZWRpc3RyaWJ1aWRvciBxdWUgZm9pIGZvcm5lY2lkYSBjb20gbyBDb250ZcO6ZG8uICBTZSBuZW5odW1hIGxpY2Vuw6dhIGV4aXN0aXIsDQotZW50cmUgZW0gY29udGF0byBjb20gbyBSZWRpc3RyaWJ1aWRvci4gIEEgbWVub3MgcXVlIGluZGljYWRvIG8gY29udHLDoXJpbyBhIHNlZ3Vpciwgb3MNCi10ZXJtb3MgZSBjb25kacOnw7VlcyBkbyBFUEwgc2UgYXBsaWNhcsOjbyBhIHF1YWxxdWVyIGPDs2RpZ28tZm9udGUgbm8gQ29udGXDumRvLiAgPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5ODRiMGEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoNCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksDQotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotDQotZmVhdHVyZU5hbWU9QmFzZSBFUEYNCi0NCi1mZWF0dXJlVGV4dD1CYXNlIEVQRlxuXA0KLVxuXA0KLVZlcnNcdTAwZTNvOiAxLjAuMS4wMCBcblwNCi1SXHUwMGYzdHVsbyBkbyBCdWlsZDogMjAwNjAyMDZfMDU0XG5cDQotXG5cDQotKGMpIENvcHlyaWdodCBjb250cmlidWlkb3JlcyBkbyBFY2xpcHNlIGUgdGVyY2Vpcm9zIDIwMDQsIDIwMDYuICBUb2RvcyBvcyBEaXJlaXRvcyBSZXNlcnZhZG9zLlxuXA0KLVxuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfemhfQ04uaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X3poX0NOLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiM2NiNzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfemhfQ04uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KLTx0aXRsZT7lhbPkuo48L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJaSC1DTiI+DQotPGgyPuWFs+S6juatpOWGheWuuTwvaDI+DQotIA0KLTxwPjIwMDUg5bm0IDIg5pyIIDI0IOaXpTwvcD4JDQotPGgzPuiuuOWPr+ivgTwvaDM+DQotDQotPHA+RWNsaXBzZSBGb3VuZGF0aW9uIOaPkOS+m+atpOaPkuS7tu+8iOKAnOWGheWuueKAne+8ieS4reeahOaJgOacieWGheWuueOAgumZpOmdnuS4i+aWh+WPpuacieaMh+aYju+8jOWQpuWImeaCqOWcqOS9v+eUqOWGheWuueaXtuW/hemhu+mBteWuiCBFY2xpcHNlIOWFrOWFseiuuOWPr+ivge+8iEVQTO+8iVYxLjAg5Lit55qE5p2h5qy+5ZKM5p2h5Lu244CC5oKo5Y+v5Lul5Yiw5Lul5LiL572R5Z2A6I635b6XIEVQTO+8mgc8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+44CC5ZyoIEVQTCDnmoTkvb/nlKjkuK3vvIzigJznqIvluo/igJ3ljbPmjIfigJzlhoXlrrnigJ3jgII8L3A+DQotDQotPHA+5aaC5p6c5oKo5LiN5piv55u05o6l5LuOIEVjbGlwc2UgRm91bmRhdGlvbiDmlLbliLDmraTigJzlhoXlrrnigJ3vvIzljbPigJzlhoXlrrnigJ3nlLHnrKzkuInmlrnvvIjigJzova/ku7bplIDllK7llYbigJ3vvInlho3mrKHliIblj5HvvIzpgqPkuYgsIOaCqOS9v+eUqOKAnOWGheWuueKAneS4reeahOaJgOacieWvueixoeS7o+eggeaXtuWPr+iDveW/hemhu+mBteWuiOWFtuS7luadoeasvuWSjOadoeS7tuOAguivt+afpemYheKAnOWGheWuueKAnemaj+mZhOeahOeUsemUgOWUruWVhumigeWPkeeahOiuuOWPr+ivgeOAguWmguaenOatpOexu+iuuOWPr+ivgeS4jeWtmOWcqO+8jOivt+iBlOezu+mUgOWUruWVhuOAgumZpOmdnuS4i+aWh+S4reWPpuacieaMh+aYju+8jOWQpuWImSBFUEwg55qE5p2h5qy+5ZKM5p2h5Lu25LuN6YCC55So5LqO4oCc5YaF5a654oCd5Lit55qE5omA5pyJ5rqQ5Luj56CB44CCPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4ODNjNmEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfemhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoNCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksDQotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotDQotZmVhdHVyZU5hbWU9RVBGIEJhc2UNCi0NCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXA0KLVxuXA0KLVx1NzI0OFx1NjcyY1x1ZmYxYTEuMC4xLjAwIFxuXA0KLVx1Njc4NFx1NWVmYVx1NjgwN1x1N2I3ZVx1ZmYxYTIwMDYwMjA2XzA1NFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuIFxuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfemhfVFcuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X3poX1RXLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3ODQyMjYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfemhfVFcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KLTx0aXRsZT7pl5zmlrw8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJ6aC1UVyI+DQotPGgyPumXnOaWvOacrOWFp+WuuTwvaDI+DQotIA0KLTxwPjIwMDUg5bm0IDIg5pyIIDI0IOaXpTwvcD4JDQotPGgzPuaOiOasijwvaDM+DQotDQotPHA+RWNsaXBzZSBGb3VuZGF0aW9uIOeZvOS9iOacrOWkluaOm+eoi+W8j+S4reeahOaJgOacieWFp+Wuue+8iOOAjOWFp+WuueOAje+8ieOAguS7peS4i+mZpOWPpuacieiou+aYjuiAheWklu+8jOOAjOWFp+WuueOAjeWdh+S+neOAjEVjbGlwc2Ug5YWs5YWx5o6I5qyKIDEuMCDniYjjgI0oJnF1b3Q7RVBMJnF1b3Q7KSDkuYvmop3mrL7ogIzmj5Dkvpvmgqjkvb/nlKjjgIINCi08YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+IOS4iuW3suWFrOS9iOS4gOS7vSBFUEzjgIINCi3lsI0gRVBMIOiAjOiogO+8jOOAjOeoi+W8j+OAjeaEj+aMh+OAjOWFp+WuueOAjeOAgjwvcD4NCi0NCi08cD7oi6XpnZ7nm7TmjqXlvp4gRWNsaXBzZSBGb3VuZGF0aW9uIOaUtuWIsOacrOOAjOWFp+WuueOAje+8jOWJh+OAjOWFp+WuueOAjeeUseesrOS4ieaWue+8iOOAjOWGjeeZvOihjOiAheOAje+8iemHjeaWsOeZvOihjO+8jOOAjOWFp+WuueOAjeS4reS5i+S7u+S9leebrueahOeivOWPr+iDveacieS4jeWQjOeahOS9v+eUqOaineasvuOAgg0KLeiri+WPg+mWseOAjOWFp+WuueOAjemaqOmZhOS5i+OAjOWGjeeZvOihjOiAheOAjeaOiOasiuOAguiLpeacqumZhOS4iuaOiOasiu+8jOiri+iBr+e1oeOAjOWGjeeZvOihjOiAheOAjeOAguS7peS4i+mZpOWPpuacieiou+aYjuiAheWklu+8jEVQTCDmop3mrL7ku43pgannlKjmlrzjgIzlhaflrrnjgI3kuK3kuYvku7vkvZXljp/lp4vnorzjgII8L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU2YTY5NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOg0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwNCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0NCi1mZWF0dXJlTmFtZT1FUEYgQmFzZQ0KLQ0KLWZlYXR1cmVUZXh0PUVQRiBCYXNlXG5cDQotXG5cDQotXHU3MjQ4XHU2NzJjXHVmZjFhMS4wLjEuMDAgXG5cDQotXHU1ZWZhXHU3ZjZlXHU2YTE5XHU3YzY0XHVmZjFhMjAwNjAyMDZfMDU0XG5cDQotXG5cDQotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXA0KLVxuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlMDdlOGQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLXNvdXJjZS5ubDEuamFyID0gc3JjLw0KLW91dHB1dC5ubDEuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMS5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9lcy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcHRfQlIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9lcy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9pdC5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2l0LnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYzA5M2Y0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgQmFzZSAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmOTU0YmUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgLSBCYXNpcy1GZWF0dXJlDQotZmVhdHVyZVBsdWdpbk5hbWVOTD1FUEYgLSBCYXNpcy1GZWF0dXJlIChOTDEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWY2NzJkYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLWZlYXR1cmVQbHVnaW5OYW1lPUNhcmFjdGVyXHUwMGVkc3RpY2EgYlx1MDBlMXNpY2EgZGUgRVBGDQotZmVhdHVyZVBsdWdpbk5hbWVOTD1DYXJhY3Rlclx1MDBlZHN0aWNhIGJcdTAwZTFzaWNhIGRlIEVQRiAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmZTNiZDYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1Gb25jdGlvbiBkZSBiYXNlIEVQRg0KLWZlYXR1cmVQbHVnaW5OYW1lTkw9Rm9uY3Rpb24gZGUgYmFzZSBFUEYgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNzNmY2E0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9RnVuemlvbmUgRVBGIEJhc2UNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUZ1bnppb25lIEVQRiBCYXNlIChOTDEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9wbHVnaW5famEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWQ5MDA1Yy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLWZlYXR1cmVQbHVnaW5OYW1lPUVQRiBCYXNlIEZlYXR1cmUNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBCYXNlIEZlYXR1cmUgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZjBjMzIyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9RVBGIFx1YWUzMFx1YmNmOCBcdWFlMzBcdWIyYTUNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBcdWFlMzBcdWJjZjggXHVhZTMwXHViMmE1KE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYmZiOTMwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9UmVjdXJzbyBCYXNlIEVQRg0KLWZlYXR1cmVQbHVnaW5OYW1lTkw9UmVjdXJzbyBCYXNlIEVQRiAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0YmIyMWIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgQmFzZSBcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjYNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBCYXNlIFx1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNlx1ZmYwOE5MMVx1ZmYwOQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxZDFjNDUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgQmFzZSBcdTcyNzlcdTYwMjcNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBcdTU3ZmFcdTY3MmNcdTcyNzlcdTYwMjcgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzkyZWRjMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzkwY2M1Yy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDIuamFyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuYmFzZTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9hYm91dF9ydS5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDIvYWJvdXRfcnUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWIwNTU4Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9hYm91dF9ydS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+DQotDQotPHRpdGxlPtCeINC/0YDQvtC00YPQutGC0LU8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJSVS1SVSI+DQotPGgyPtCe0LEg0Y3RgtC+0Lwg0LzQvtC00YPQu9C1PC9oMj4NCi0gDQotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQ0KLTxoMz7Qm9C40YbQtdC90LfQuNGPPC9oMz4NCi0NCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlDQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Lg0KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+DQotDQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5DQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQ0KLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyL2Fib3V0X3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9hYm91dF9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNWIzMjUxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyL2Fib3V0X3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LA0KLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgYWJvdXQucHJvcGVydGllcw0KLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQ0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncw0KLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLg0KLQ0KLWZlYXR1cmVOYW1lPVx1MDQxMVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2JcdTA0MzVcdTA0M2FcdTA0NDIgRVBGDQotDQotZmVhdHVyZVRleHQ9XHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQzNVx1MDQzYVx1MDQ0MiBFUEZcblwNCi1cblwNCi1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0NGY6IDEuMC4xLjAwIFxuXA0KLVx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYVx1MDQzMDogMjAwNjAyMDZfMDU0XG5cDQotXG5cDQotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuICBcdTA0MTJcdTA0NDFcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQ0OVx1MDQzOFx1MDQ0OVx1MDQzNVx1MDQzZFx1MDQ0Yi5cblwNCi1cbg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4M2I2N2NlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS5ubDIuamFyID0gc3JjLw0KLW91dHB1dC5ubDIuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMi5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9ydS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9ydS5odG1sLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDIvZnJhZ21lbnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2JhY2I0Yy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIENvbXBvc2VyIEJhc2UgKE5MMikNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2M2RkYTE1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9XHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQzNVx1MDQzYVx1MDQ0MiBFUEYNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPVx1MDQxMVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2JcdTA0MzVcdTA0M2FcdTA0NDIgRVBGIChOTDEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzA5YjZiYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlmN2U3NGMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDJhLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmJhc2U7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBmcmFnbWVudAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDJhL2Fib3V0X2RhLmh0bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvYWJvdXRfZGEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTczYjNlNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvYWJvdXRfZGEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KLTx0aXRsZT5PbTwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9IkRBLURLIj4NCi08aDI+T20gZGV0dGUgaW5kaG9sZDwvaDI+DQotIA0KLTxwPjI0LiBmZWJydWFyIDIwMDU8L3A+CQ0KLTxoMz5MaWNlbnNlPC9oMz4NCi0NCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUNCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQ0KLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UNCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvYWJvdXRfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyYS9hYm91dF9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTAzOGU1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyYS9hYm91dF9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOg0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwNCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0NCi1mZWF0dXJlTmFtZT1FUEYgLSBiYXNpcw0KLQ0KLWZlYXR1cmVUZXh0PUVQRiAtIGJhc2lzXG5cDQotXG5cDQotVmVyc2lvbjogMS4wLjEuMDAgXG5cDQotQnlnZ2VldGlrZXQ6IDIwMDYwMjA2XzA1NFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXA0KLVxuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjQyMGIyNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLm5sMmEuamFyID0gc3JjLw0KLW91dHB1dC5ubDJhLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDJhLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGFib3V0X2RhLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGFib3V0X2RhLmh0bWwsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2NmJhOGUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgQmFzZSAoTkwyYSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjOTUwMTMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9RVBGIC0gYmFzaXNmdW5rdGlvbg0KLWZlYXR1cmVQbHVnaW5OYW1lTkw9RVBGIC0gYmFzaXNmdW5rdGlvbiAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzZhNmJhOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMzM4ZTU4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDEuamFyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfZGUuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfZGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWFlMmFjYy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X2RlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi0NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08TUVUQSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9IklCTSBXZWJTcGhlcmUgU3R1ZGlvIj4NCi08dGl0bGU+UGx1Zy1pbi1MaXplbnp2ZXJlaW5iYXJ1bmc8L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi08aDM+UGx1Zy1pbi1MaXplbnp2ZXJlaW5iYXJ1bmc8L2gzPg0KLQ0KLTxwPkRpZSBWZXJ3ZW5kdW5nIGRpZXNlcyBQbHVnLWlucyB1bnRlcmxpZWd0IGRlbnNlbGJlbiBCZWRpbmd1bmdlbiwgZGllIGbDvHIgZGllIFZlcndlbmR1bmcgZGVzIFByb2R1a3RzIGdlbHRlbiwgZGFzIGRpZXNlcyBQbHVnLWluIGVudGjDpGx0Lg0KLTwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfZXMuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGEzMTZiOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi0NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08TUVUQSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9IklCTSBXZWJTcGhlcmUgU3R1ZGlvIj4NCi08dGl0bGU+QWN1ZXJkbyBkZSBsaWNlbmNpYSBkZSBwbHVnLWluPC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotPGgzPkFjdWVyZG8gZGUgbGljZW5jaWEgZGUgcGx1Zy1pbjwvaDM+DQotDQotPHA+RWwgdXNvIGRlIGVzdGUgcGx1Zy1pbiBlc3TDoSBzdWpldG8gYSBsb3MgbWlzbW9zIHTDqXJtaW5vcyB5IGNvbmRpY2lvbmVzIHF1ZQ0KLXJpZ2VuIGVsIHVzbyBkZWwgUHJvZHVjdG8gcXVlIGluY2x1eWUgZXN0ZSBwbHVnLWluLjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfZnIuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfZnIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTVmZDJkZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X2ZyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi0NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08TUVUQSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9IklCTSBXZWJTcGhlcmUgU3R1ZGlvIj4NCi08dGl0bGU+Q29udHJhdCBkZSBsaWNlbmNlIGR1IHBsdWctaW48L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi08aDM+Q29udHJhdCBkZSBsaWNlbmNlIGR1IHBsdWctaW48L2gzPg0KLQ0KLTxwPkwndXRpbGlzYXRpb24gZGUgY2UgcGx1Zy1pbiBk6XBlbmQgZGVzIG3qbWVzIHRlcm1lcyBldCBjb25kaXRpb25zIHF1aSBy6Wdpc3NlbnQgbCd1dGlsaXNhdGlvbiBkdSBwcm9kdWl0IGluY2x1YW50IGNlIHBsdWctaW4uPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9hYm91dF9pdC5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9hYm91dF9pdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDU1ZWM3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfaXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLQ0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLTxNRVRBIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iSUJNIFdlYlNwaGVyZSBTdHVkaW8iPg0KLTx0aXRsZT5QbHVnLWluIExpY2Vuc2UgQWdyZWVtZW50PC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotPGgzPlBsdWctaW4gTGljZW5zZSBBZ3JlZW1lbnQ8L2gzPg0KLQ0KLTxwPkwndXNvIGRpIHF1ZXN0byBwbHVnLWluIOggc29nZ2V0dG8gYWdsaSBzdGVzc2kgdGVybWluaSBlIGNvbmRpemlvbmkgY2hlIHJlZ29sYW5vIGwndXNvIGRlbCBwcm9kb3R0byBjaGUgZm9ybmlzY2UgdGFsZSBwbHVnLWluLg0KLTwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfamEuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfamEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQ2NTYzMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X2phLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi0NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+DQotPE1FVEEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJJQk0gV2ViU3BoZXJlIFN0dWRpbyI+DQotPHRpdGxlPuODl+ODqeOCsOOCpOODs+OBruOBlOS9v+eUqOadoeS7tjwvdGl0bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5Pg0KLQ0KLTxoMz7jg5fjg6njgrDjgqTjg7Pjga7jgZTkvb/nlKjmnaHku7Y8L2gzPg0KLQ0KLTxwPuOBk+OBruODl+ODqeOCsOOCpOODs+OBruS9v+eUqOOBq+OBr+OAgeOBk+OBruODl+ODqeOCsOOCpOODs+OCkuWQq+OCgOijveWTgeOBruS9v+eUqOOBq+WvvuOBl+OBpumBqeeUqOOBleOCjOOCi+OCguOBruOBqOWQjOOBmOOBlOS9v+eUqOadoeS7tuOBjOmBqeeUqOOBleOCjOOBvuOBmeOAgjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfa28uaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfa28uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTE5YjIwYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X2tvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi0NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQotPE1FVEEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJJQk0gV2ViU3BoZXJlIFN0dWRpbyI+DQotPHRpdGxlPu2UjOufrOq3uOyduCDrnbzsnbTshLzsiqQg6rOE7JW9PC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotPGgzPu2UjOufrOq3uOyduCDrnbzsnbTshLzsiqQg6rOE7JW9PC9oMz4NCi0NCi08cD7rs7gg7ZSM65+s6re47J247J2YIOyCrOyaqeyXkCDrjIDtlbTshJzripQg67O4IO2UjOufrOq3uOyduOydhCDtj6ztlajtlZjripQg7KCc7ZKI7J2YIOyCrOyaqeyXkCDsoIHsmqnrkJjripQg64+Z7J287ZWcIOyhsOqxtOydtCDsoIHsmqnrkKnri4jri6QuPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9hYm91dF9wdF9CUi5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9hYm91dF9wdF9CUi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzE3MmY1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfcHRfQlIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLQ0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLTxNRVRBIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iSUJNIFdlYlNwaGVyZSBTdHVkaW8iPg0KLTx0aXRsZT5Db250cmF0byBkZSBMaWNlbsOnYSBkbyBQbHVnLWluPC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotPGgzPkNvbnRyYXRvIGRlIExpY2Vuw6dhIGRvIFBsdWctaW48L2gzPg0KLQ0KLTxwPk8gdXNvIGRlc3RlIFBsdWctaW4gZXN0w6Egc3VqZWl0byBhb3MgbWVzbW9zIHRlcm1vcyBlIGNvbmRpw6fDtWVzIHF1ZSBjb250cm9sYW0gbyB1c28gZG8NCi1Qcm9kdXRvIHF1ZSBpbmNsdWl1IGVzdGUgUGx1Zy1pbi48L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X3poX0NOLmh0bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X3poX0NOLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlNDU1NWEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9hYm91dF96aF9DTi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQotPGh0bWw+DQotDQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KLTxNRVRBIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iSUJNIFdlYlNwaGVyZSBTdHVkaW8iPg0KLTx0aXRsZT7mj5Lku7borrjlj6/or4HljY/orq48L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi08aDM+5o+S5Lu26K645Y+v6K+B5Y2P6K6uPC9oMz4NCi0NCi08cD7mraTmj5Lku7bnmoTkvb/nlKjlv4XpobvpgbXlvqrkuI7lhbbmiYDlsZ7kuqflk4Hnm7jlkIznmoTmnaHmrL7lkozmnaHku7bjgII8L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X3poX1RXLmh0bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X3poX1RXLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmMDExYWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9hYm91dF96aF9UVy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQotPGh0bWw+DQotDQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KLTxNRVRBIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iSUJNIFdlYlNwaGVyZSBTdHVkaW8iPg0KLTx0aXRsZT7lpJbmjpvnqIvlvI/mjojmrIrlkIjntIQ8L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi08aDM+5aSW5o6b56iL5byP5o6I5qyK5ZCI57SEPC9oMz4NCi0NCi08cD7kvb/nlKjmnKzlpJbmjpvnqIvlvI/lv4XpoIjpgbXlrojlkKvmnInmnKzlpJbmjpvnqIvlvI/nmoTnlKLlk4HnmoTnm7jlkIzkvb/nlKjmop3mrL7jgII8L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ4OTEyOGYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotc291cmNlLm5sMS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMS5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gbmwxLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfZGUuaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfZXMuaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfZnIuaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfaXQuaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfamEuaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfa28uaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfcHRfQlIuaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfemhfQ04uaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfemhfVFcuaHRtbCxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjlkNGI1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvZnJhZ21lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZnJhZ21lbnROYW1lPUVQRiBDb21wb3NlciBDb21tb24gKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGVmMWU2ZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBBbGxnZW1laW4NCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjc3YjgxMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1Db21cdTAwZmFuIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjcxNTA4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUNvbW1vbiBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5faXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWE4YzQxNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgQ29tbW9uDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhOGM0MTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIENvbW1vbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNTEwOTNmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdWFjZjVcdWQxYjUNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGI2NTRmOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgQ29tdW0NCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjBiOWQ1Mi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHU1MTZjXHU1MTcxDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhOGM0MTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIENvbW1vbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmM0MjM5ZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDIyNDE2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDIuamFyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvYWJvdXRfcnUuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvYWJvdXRfcnUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjMxNzJlNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyL2Fib3V0X3J1Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi0NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+DQotPE1FVEEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJJQk0gV2ViU3BoZXJlIFN0dWRpbyI+DQotPHRpdGxlPtCb0LjRhtC10L3Qt9C40L7QvdC90L7QtSDRgdC+0LPQu9Cw0YjQtdC90LjQtSDQvNC+0LTRg9C70Y88L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi08aDM+0JvQuNGG0LXQvdC30LjQvtC90L3QvtC1INGB0L7Qs9C70LDRiNC10L3QuNC1INC80L7QtNGD0LvRjzwvaDM+DQotDQotPHA+0JzQvtC00YPQu9GMINC/0YDQtdC00L7RgdGC0LDQstC70Y/QtdGC0YHRjyDQvdCwINGD0YHQu9C+0LLQuNGP0YUg0LvQuNGG0LXQvdC30LjQvtC90L3QvtCz0L4g0YHQvtCz0LvQsNGI0LXQvdC40Y8g0L7RgdC90L7QstC90L7Qs9C+INC/0YDQvtC00YPQutGC0LAsINGBINC60L7RgtC+0YDRi9C8INC+0L0g0L/QvtGB0YLQsNCy0LvRj9C10YLRgdGPLjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2ZkNjc2Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS5ubDIuamFyID0gc3JjLw0KLW91dHB1dC5ubDIuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMi5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9ydS5odG1sLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjNzYzNTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIENvbXBvc2VyIENvbW1vbiAoTkwyKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMWFjZDA5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDRcdTA0NDNcdTA0M2RcdTA0M2FcdTA0NDZcdTA0MzhcdTA0MzgNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMmEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTRjYjU5Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDJhPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjUwM2VmNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDJhLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS9hYm91dF9kYS5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMmEvYWJvdXRfZGEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTMyMzk0MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS9hYm91dF9kYS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQotPGh0bWw+DQotDQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KLTxNRVRBIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iSUJNIFdlYlNwaGVyZSBTdHVkaW8iPg0KLTx0aXRsZT5QbHVnaW4tbGljZW5zYWZ0YWxlPC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotPGgzPlBsdWdpbi1saWNlbnNhZnRhbGU8L2gzPg0KLQ0KLTxwPkJydWdlbiBhZiBkZW5uZSBwbHVnaW4gZXIgdW5kZXJsYWd0IGRlIHNhbW1lIHZpbGvDpXIsIHNvbSByZWd1bGVyZXIgYnJ1Z2VuIGFmIGRldCBwcm9kdWt0LCBkZXIgaW5kZWhvbGRlciBkZW5uZSBwbHVnaW4uPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDJhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1MDNkZjUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMmEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLm5sMmEuamFyID0gc3JjLw0KLW91dHB1dC5ubDJhLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDJhLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGFib3V0X2RhLmh0bWwsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzM2U1NDcyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgQ29tbW9uIChOTDJhKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4ZTk3YzQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIGdlbmVyZWwNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFiZmE2ZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNjYWMyOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIENvbW1vbiBXaW4zMiAoTkwxKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4NjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlN2IwMTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiODlhMWMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFdpbjMyIGFsbGdlbWVpbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxYjFlNGIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUNvbVx1MDBmYW4gV2luMzIgZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzU4ZmMxMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9Q29tbW9uIFdpbjMyIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0NWQxYTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBXaW4zMiBDb21tb24NCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDVkMWE3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgV2luMzIgQ29tbW9uDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmM2MjE1Zi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFdpbjMyIFx1YWNmNVx1ZDFiNQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIzN2FjMGIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBXaW4zMiBDb211bQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUwOGY1NDkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBXaW4zMiBcdTUxNmNcdTUxNzENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDVkMWE3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgV2luMzIgQ29tbW9uDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3ZGUxMzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3MDQ0YTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBDb21tb24gV2luMzIgKE5MMikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODY7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTRmY2E3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOGIzYjllLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQ0XHUwNDQzXHUwNDNkXHUwNDNhXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBXaW4zMg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyYS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMmEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlZmFkMTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDJhPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYjA2NWZjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIENvbW1vbiBXaW4zMiAoTkwyYSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NzY5MGQyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFdpbjMyIC0gZ2VuZXJlbA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjg4NDMyOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYmE3MjVhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBEYXRhIEV4Y2hhbmdyZSAoTkwxKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2U7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI2ZGM2OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9lcy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcHRfQlIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2l0LnByb3BlcnRpZXMNCi0NCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTA5OTk2NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLXBsdWdpbk5hbWU9RVBGIC0gUGx1Zy1pbiBmXHUwMGZjciBEYXRlbmF1c3RhdXNjaA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDdjNDdhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotcGx1Z2luTmFtZT1QbHVnLWluIGRlIGludGVyY2FtYmlvIGRlIGRhdG9zIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzVkN2RjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotcGx1Z2luTmFtZT1QbHVnLWluIGQnXHUwMGU5Y2hhbmdlIGRlIGRvbm5cdTAwZTllcyBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5faXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzk5NTIxNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLXBsdWdpbk5hbWU9UGx1Zy1pbiBzY2FtYmlvIGRhdGkgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3YmE5NjYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi1wbHVnaW5OYW1lPUVQRiBEYXRhIEV4Y2hhbmdlIFBsdWctaW4NCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWZiZmFjOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLXBsdWdpbk5hbWU9RVBGIFx1YjM3MFx1Yzc3NFx1ZDEzMCBcdWFkNTBcdWQ2NTggXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyMWNlYzkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi1wbHVnaW5OYW1lPVBsdWctaW4gZGUgVHJvY2EgZGUgRGFkb3MgZG8gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZhNDRhOGMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi1wbHVnaW5OYW1lPUVQRiBcdTY1NzBcdTYzNmVcdTRlYTRcdTYzNjJcdTYzZDJcdTRlZjYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTdiYTk2Ni4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLXBsdWdpbk5hbWU9RVBGIERhdGEgRXhjaGFuZ2UgUGx1Zy1pbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ4ZGQ3MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMjRjOWZiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBEYXRhIEV4Y2hhbmdyZSAoTkwyKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2U7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjU0ZmNhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTIxYWRiYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLXBsdWdpbk5hbWU9RVBGIC0gXHUwNDNlXHUwNDMxXHUwNDNjXHUwNDM1XHUwNDNkIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMGRjNWI2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTFkZjU5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgRGF0YSBFeGNoYW5ncmUgKE5MMmEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2U7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YjU5MTQ1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLXBsdWdpbk5hbWU9RVBGIC0gcGx1Z2luIHRpbCBkYXRhdWR2ZWtzbGluZw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNjgzODAzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2N2IwOTYxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgRGlhZ3JhbSAoTkwxKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlN2IwMTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3ZjFkYTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIERpYWdyYW1tbW9kZWxsDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGY2ZjgzYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9TW9kZWxvIGRlIGRpYWdyYW1hIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjMmMyYTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPU1vZFx1MDBlOGxlIGRlIGRpYWdyYW1tZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjc5NTAxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1Nb2RlbGxvIGRpYWdyYW1taSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxY2UwYzJmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgRGlhZ3JhbSBNb2RlbA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlM2U2ZWYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHViYWE4XHViMzc4DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDc5MzI1Zi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9TW9kZWxvIGRlIERpYWdyYW1hIGRvIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5NzkxNmUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTU2ZmVcdTZhMjFcdTU3OGINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxY2UwYzJmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgRGlhZ3JhbSBNb2RlbA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzUzNTkyNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi10eXBlX2FjdGl2aXR5PUFrdGl2aXRcdTAwZTR0c2RpYWdyYW1tDQotZGVmYXVsdEJhc2VOYW1lPXswfSAtIE5ldQ0KLXR5cGVfV1BEPUFyYmVpdHNlcmdlYm5pc2FiaFx1MDBlNG5naWdrZWl0c2RpYWdyYW1tDQotdHlwZV9hY3Rpdml0eURldGFpbD1Ba3Rpdml0XHUwMGU0dHNkZXRhaWxkaWFncmFtbQ0KLWFkZEZyZWVUeHQ9VGV4dCBtaXQgZnJlaWVtIEZvcm1hdCBoaW56dWZcdTAwZmNnZW4NCi10eXBlX3Vua25vd249VW5iZWthbm50DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNjZkNWQxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXR5cGVfYWN0aXZpdHk9RGlhZ3JhbWEgZGUgbGEgYWN0aXZpZGFkDQotZGVmYXVsdEJhc2VOYW1lPXswfSBudWV2bw0KLXR5cGVfV1BEPURpYWdyYW1hIGRlIGRlcGVuZGVuY2lhIGRlbCBwcm9kdWN0byBkZSB0cmFiYWpvDQotdHlwZV9hY3Rpdml0eURldGFpbD1EaWFncmFtYSBkZSBkZXRhbGxlcyBkZSBsYSBhY3RpdmlkYWQNCi1hZGRGcmVlVHh0PUFcdTAwZjFhZGlyIHRleHRvIGxpYnJlDQotdHlwZV91bmtub3duPURlc2Nvbm9jaWRvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjJkM2I2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXR5cGVfYWN0aXZpdHk9RGlhZ3JhbW1lIGQnYWN0aXZpdFx1MDBlOQ0KLWRlZmF1bHRCYXNlTmFtZT1Ob3V2ZWF1IHswfQ0KLXR5cGVfV1BEPURpYWdyYW1tZSBkZSBkXHUwMGU5cGVuZGFuY2UgZGUgcHJvZHVpdA0KLXR5cGVfYWN0aXZpdHlEZXRhaWw9RGlhZ3JhbW1lIGRcdTAwZTl0YWlsbFx1MDBlOSBkJ2FjdGl2aXRcdTAwZTkNCi1hZGRGcmVlVHh0PUFqb3V0ZXIgZHUgdGV4dGUgbGlicmUNCi10eXBlX3Vua25vd249SW5jb25udQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2E5OWY2Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi10eXBlX2FjdGl2aXR5PURpYWdyYW1tYSBhdHRpdml0XHUwMGUwDQotZGVmYXVsdEJhc2VOYW1lPU51b3ZvIHswfQ0KLXR5cGVfV1BEPURpYWdyYW1tYSBkaXBlbmRlbnplIHByb2RvdHRvIGRpIGxhdm9ybw0KLXR5cGVfYWN0aXZpdHlEZXRhaWw9RGlhZ3JhbW1hIGRldHRhZ2xpIGF0dGl2aXRcdTAwZTANCi1hZGRGcmVlVHh0PUFnZ2l1bmdpIHRlc3RvIGxpYmVybw0KLXR5cGVfdW5rbm93bj1TY29ub3NjaXV0byANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmNzUzYjguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotdHlwZV9hY3Rpdml0eT1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTU2ZjMNCi1kZWZhdWx0QmFzZU5hbWU9TmV3IHswfQ0KLXR5cGVfV1BEPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1NGY5ZFx1NWI1OFx1OTVhMlx1NGZjMlx1NTZmMw0KLXR5cGVfYWN0aXZpdHlEZXRhaWw9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU4YTczXHU3ZDMwXHU1NmYzDQotYWRkRnJlZVR4dD1cdTMwZDVcdTMwZWFcdTMwZmNcdTMwZmJcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNmVcdThmZmRcdTUyYTANCi10eXBlX3Vua25vd249XHU0ZTBkXHU2NjBlDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODYwYThiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXR5cGVfYWN0aXZpdHk9XHVkNjVjXHViM2Q5IFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOA0KLWRlZmF1bHRCYXNlTmFtZT1cdWMwYzggezB9DQotdHlwZV9XUEQ9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWM4ODVcdWMxOGRcdWMxMzEgXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4DQotdHlwZV9hY3Rpdml0eURldGFpbD1cdWQ2NWNcdWIzZDkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOA0KLWFkZEZyZWVUeHQ9XHViZTQ0XHVjODE1XHVkNjE1IFx1ZDE0ZFx1YzJhNFx1ZDJiOCBcdWNkOTRcdWFjMDANCi10eXBlX3Vua25vd249XHVjNTRjIFx1YzIxOCBcdWM1YzZcdWM3NGMNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU3YWE3MjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotdHlwZV9hY3Rpdml0eT1EaWFncmFtYSBkZSBBdGl2aWRhZGVzDQotZGVmYXVsdEJhc2VOYW1lPU5vdm8gezB9DQotdHlwZV9XUEQ9RGlhZ3JhbWEgZGUgRGVwZW5kXHUwMGVhbmNpYSBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotdHlwZV9hY3Rpdml0eURldGFpbD1EaWFncmFtYSBkZSBEZXRhbGhlcyBkZSBBdGl2aWRhZGVzDQotYWRkRnJlZVR4dD1JbmNsdWlyIFRleHRvIExpdnJlDQotdHlwZV91bmtub3duPURlc2NvbmhlY2lkbw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjEzNWE3Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi10eXBlX2FjdGl2aXR5PVx1NmQzYlx1NTJhOFx1NTZmZQ0KLWRlZmF1bHRCYXNlTmFtZT1cdTY1YjBcdTVlZmEgezB9DQotdHlwZV9XUEQ9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU0ZjlkXHU4ZDU2XHU1MTczXHU3Y2ZiXHU1NmZlDQotdHlwZV9hY3Rpdml0eURldGFpbD1cdTZkM2JcdTUyYThcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTU2ZmUNCi1hZGRGcmVlVHh0PVx1NmRmYlx1NTJhMFx1ODFlYVx1NzUzMVx1NjU4N1x1NjcyYw0KLXR5cGVfdW5rbm93bj1cdTY3MmFcdTc3ZTUNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3NGMyYjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotdHlwZV9hY3Rpdml0eT1cdTZkM2JcdTUyZDVcdTU3MTYNCi1kZWZhdWx0QmFzZU5hbWU9XHU2NWIwXHU1ZWZhIHswfQ0KLXR5cGVfV1BEPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NzZmOFx1NGY5ZFx1OTVkY1x1NGZjMlx1NTcxNg0KLXR5cGVfYWN0aXZpdHlEZXRhaWw9XHU2ZDNiXHU1MmQ1XHU2NjBlXHU3ZDMwXHU1NzE2DQotYWRkRnJlZVR4dD1cdTY1YjBcdTU4OWVcdTRlZmJcdTYxMGZcdTY1ODdcdTViNTcNCi10eXBlX3Vua25vd249XHU0ZTBkXHU2NjBlDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxZTNhMDEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhNWViYzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBEaWFncmFtIChOTDIpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMi9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjU0ZmNhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzMyZGQzMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDNiXHUwNDRjIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0Yg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU0OGM0MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi10eXBlX2FjdGl2aXR5PVx1MDQxNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMCBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzkNCi1kZWZhdWx0QmFzZU5hbWU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIHswfQ0KLXR5cGVfV1BEPVx1MDQxNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMCBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLXR5cGVfYWN0aXZpdHlEZXRhaWw9XHUwNDFmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMCBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzkNCi1hZGRGcmVlVHh0PVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzFcdTA0M2VcdTA0MzRcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyDQotdHlwZV91bmtub3duPVx1MDQxZFx1MDQzNVx1MDQzOFx1MDQzN1x1MDQzMlx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzZFx1MDQzZQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyYS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMmEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1NjI4YWIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDJhPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYWFiMzZhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIERpYWdyYW0gKE5MMmEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNjgyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMmEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGEucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmI4YmFjZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIGRpYWdyYW1tb2RlbA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiN2E2MGMzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi10eXBlX2FjdGl2aXR5PUFrdGl2aXRldHNkaWFncmFtDQotZGVmYXVsdEJhc2VOYW1lPU55dCB7MH0NCi10eXBlX1dQRD1EaWFncmFtIGZvciBhcmJlamRzcHJvZHVrdGFmaFx1MDBlNm5naWdoZWQNCi10eXBlX2FjdGl2aXR5RGV0YWlsPUFrdGl2aXRldHNvcGx5c25pbmdzZGlhZ3JhbQ0KLWFkZEZyZWVUeHQ9VGlsZlx1MDBmOGogZnJpdGVrc3QNCi10eXBlX3Vua25vd249VWtlbmR0DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5OGVjNjcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhOTg1N2YuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwxLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBmcmFnbWVudAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkYTJjOTEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLXNvdXJjZS5ubDEuamFyID0gc3JjLw0KLW91dHB1dC5ubDEuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMS5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9lcy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcHRfQlIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2l0LnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NjZiNDE3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgTVNQIEV4cG9ydCAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2M2NmNTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIEV4cG9ydCBuYWNoIE1pY3Jvc29mdCBQcm9qZWN0DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBXaXphcmRzDQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1NaWNyb3NvZnQgUHJvamVjdA0KLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uPUVpbmVuIFByb3plc3MgbmFjaCBNaWNyb3NvZnQgUHJvamVjdCBleHBvcnRpZXJlbi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4N2UwODliLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1Qcm95ZWN0byBkZSBNaWNyb3NvZnQgUHJvamVjdCBkZSBleHBvcnRhY2lcdTAwZjNuIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgV2l6YXJkcw0KLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZE5hbWU9UHJveWVjdG8gZGUgTWljcm9zb2Z0IFByb2plY3QNCi1leHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbj1FeHBvcnRhciB1biBwcm9jZXNvIGEgdW4gcHJveWVjdG8gZGUgTWljcm9zb2Z0IFByb2plY3QuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTE3ZmRjMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RXhwb3J0YXRpb24gZCdFUEYgdmVycyB1biBwcm9qZXQgTWljcm9zb2Z0DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBXaXphcmRzDQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1Qcm9qZXQgTWljcm9zb2Z0DQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkRGVzY3JpcHRpb249RXhwb3J0YXRpb24gZCd1biBwcm9jZXNzdXMgdmVycyB1biBwcm9qZXQgTWljcm9zb2Z0Lg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExNGMyY2YuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVByb2dldHRvIE1pY3Jvc29mdCBkaSBlc3BvcnRhemlvbmUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBXaXphcmRzDQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1Qcm9nZXR0byBNaWNyb3NvZnQNCi1leHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbj1Fc3BvcnRhcmUgdW4gcHJvY2Vzc28gaW4gdW4gcHJvZ2V0dG8gTWljcm9zb2Z0Lg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjNjBiZGUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIFdpemFyZHMNCi1leHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmROYW1lPU1pY3Jvc29mdCBQcm9qZWN0DQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkRGVzY3JpcHRpb249TWljcm9zb2Z0IFByb2plY3QgXHUzMDZiXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDkyXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTYxYjU0NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIE1pY3Jvc29mdCBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjggXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBXaXphcmRzDQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1NaWNyb3NvZnQgXHVkNTA0XHViODVjXHVjODFkXHVkMmI4DQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkRGVzY3JpcHRpb249XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHViOTdjIE1pY3Jvc29mdCBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjhcdWI4NWMgXHViMGI0XHViY2Y0XHViMGM1XHViMmM4XHViMmU0Lg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2ZTU1M2UuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVByb2pldG8gZGUgRXhwb3J0YVx1MDBlN1x1MDBlM28gZG8gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBXaXphcmRzDQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1NaWNyb3NvZnQgUHJvamVjdA0KLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uPUV4cG9ydGFyIHVtIHByb2Nlc3NvIHBhcmEgdW0gTWljcm9zb2Z0IFByb2plY3QuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWQ3Y2FlNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1NWJmY1x1NTFmYSBNaWNyb3NvZnQgUHJvamVjdA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgV2l6YXJkcw0KLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZE5hbWU9TWljcm9zb2Z0IFByb2plY3QNCi1leHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbj1cdTVjMDZcdTZkNDFcdTdhMGJcdTViZmNcdTUxZmFcdTgxZjMgTWljcm9zb2Z0IFByb2plY3RcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OWMxMDkxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBXaXphcmRzDQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1NaWNyb3NvZnQgUHJvamVjdA0KLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uPVx1NWMwN1x1N2EwYlx1NWU4Zlx1NTMyZlx1NTFmYVx1NTIzMCBNaWNyb3NvZnQgUHJvamVjdFx1MzAwMg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDgxYWQ5NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFdpemFyZA0KLWV4cG9ydE1TUFdpemFyZF90aXRsZT1FeHBvcnQgbmFjaCBNaWNyb3NvZnQgUHJvamVrdA0KLQ0KLSMgU2VsZWN0IFByb2Nlc3MgV2l6YXJkIFBhZ2UNCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90aXRsZT1Qcm96ZXNzIHVuZCBFeHBvcnRvcHRpb25lbiBhdXN3XHUwMGU0aGxlbg0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RleHQ9V1x1MDBlNGhsZW4gU2llIGVpbmVuIHp1IGV4cG9ydGllcmVuZGVuIFByb3plc3MgYXVzIHVuZCBnZWJlbiBTaWUgZGllIEV4cG9ydG9wdGlvbmVuIGFuLg0KLXByb2Nlc3NHcm91cF90ZXh0PVByb3plc3MNCi1jYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uX3RleHQ9UHJvemVzc211c3Rlcg0KLWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uX3RleHQ9QmVyZWl0c3RlbGx1bmdzcHJvemVzcw0KLW9wdGlvbnNHcm91cF90ZXh0PUV4cG9ydG9wdGlvbmVuDQotcHJvY2Vzc05hbWVMYWJlbF90ZXh0PU5hbWU6DQotY29udGV4dE5hbWVMYWJlbF90ZXh0PUtvbmZpZ3VyYXRpb246DQotcHVibGlzaENvbmZpZ3VyYXRpb25DaGVja0JveF90ZXh0PUF1c2dld1x1MDBlNGhsdGUgS29uZmlndXJhdGlvbiB2ZXJcdTAwZjZmZmVudGxpY2hlbg0KLWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHNDaGVja0JveF90ZXh0PU51ciBkaWUgZ2VwbGFudGVuIFN0cnVrdHVyZWxlbWVudGUgZXhwb3J0aWVyZW4NCi0NCi0jIFNlbGVjdCBQdWJsaXNoaW5nIE9wdGlvbnMgV2l6YXJkIFBhZ2UNCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU9VmVyXHUwMGY2ZmZlbnRsaWNodW5nc29wdGlvbmVuIGF1c3dcdTAwZTRobGVuDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RleHQ9V1x1MDBlNGhsZW4gU2llIGRpZSBWZXJcdTAwZjZmZmVudGxpY2h1bmdzb3B0aW9uZW4gYXVzLCBkaWUgZlx1MDBmY3IgZGllIFZlclx1MDBmNmZmZW50bGljaHVuZyBkZXIgYW5nZWdlYmVuZW4gS29uZmlndXJhdGlvbiB2ZXJ3ZW5kZXQgd2VyZGVuLg0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBEaXJlY3RvcnkgV2l6YXJkIHBhZ2UNCi1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RpdGxlPVByb2pla3RuYW1lbiB1bmQgRXhwb3J0dmVyemVpY2huaXMgYW5nZWJlbg0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1HZWJlbiBTaWUgZGVuIE1pY3Jvc29mdC1Qcm9qZWN0LU5hbWVuIHVuZCBkYXMgRXhwb3J0dmVyemVpY2huaXMgYW4uDQotcHJvamVjdE5hbWVMYWJlbF90ZXh0PU5hbWU6DQotZGlyTGFiZWxfdGV4dD1WZXJ6ZWljaG5pczoNCi1icm93c2VCdXR0b25fdGV4dD1EdXJjaHN1Y2hlbi4uLg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1leHBvcnRNU1BUYXNrX25hbWU9QXVzZ2V3XHUwMGU0aGx0ZXIgUHJvemVzcyB3aXJkIG5hY2ggTWljcm9zb2Z0IFByb2plY3QgZXhwb3J0aWVydC4uLg0KLQ0KLSMgQ29uZmlybWF0aW9uIE1lc3NhZ2VzDQotb3ZlcndyaXRlVGV4dF9tc2c9RXMgaXN0IGJlcmVpdHMgZWluZSBNaWNyb3NvZnQtUHJvamVjdC1EYXRlaSBtaXQgZGVtIE5hbWVuICcnezB9JycgaW4gJyd7MX0nJyB2b3JoYW5kZW4uXG5NXHUwMGY2Y2h0ZW4gU2llIGRpZXNlIERhdGVpIFx1MDBmY2JlcnNjaHJlaWJlbj8NCi1jb21wbGV0ZWRUZXh0X21zZz1EZXIgYXVzZ2V3XHUwMGU0aGx0ZSBQcm96ZXNzICcnezB9Jycgd3VyZGUgZXJmb2xncmVpY2ggaW4gZGllIE1pY3Jvc29mdC1Qcm9qZWN0LVhNTC1EYXRlaSAnJ3sxfScnIGV4cG9ydGllcnQuDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWV4cG9ydE1TUEVycm9yX21zZz1CZWltIEV4cG9ydGllcmVuIGRlcyBhdXNnZXdcdTAwZTRobHRlbiBQcm96ZXNzZXMgJyd7MH0nJyBpbiBkaWUgTWljcm9zb2Z0LVByb2plY3QtRGF0ZWkgJyd7MX0nJyBpc3QgZWluIEZlaGxlciBhdWZnZXRyZXRlbi4NCi1leHBvcnRNU1BFcnJvcl9yZWFzb249S2xpY2tlbiBTaWUgYXVmIERldGFpbHMsIHVtIHdlaXRlcmUgSW5mb3JtYXRpb25lbiB6dSBlcmhhbHRlbi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViODQ0ZmIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQNCi1leHBvcnRNU1BXaXphcmRfdGl0bGU9RXhwb3J0YXIgcHJveWVjdG8gZGUgTWljcm9zb2Z0IFByb2plY3QNCi0NCi0jIFNlbGVjdCBQcm9jZXNzIFdpemFyZCBQYWdlDQotc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGl0bGU9U2VsZWNjaW9uYXIgcHJvY2VzbyB5IG9wY2lvbmVzIGRlIGV4cG9ydGFjaVx1MDBmM24NCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90ZXh0PVNlbGVjY2lvbmFyIHVuIHByb2Nlc28gcGFyYSBleHBvcnRhcmxvIHkgZXNwZWNpZmljYXIgbGFzIG9wY2lvbmVzIGRlIGV4cG9ydGFjaVx1MDBmM24uDQotcHJvY2Vzc0dyb3VwX3RleHQ9UHJvY2Vzbw0KLWNhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b25fdGV4dD1QYXRyXHUwMGYzbiBkZSBwb3NpYmlsaWRhZA0KLWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uX3RleHQ9UHJvY2VzbyBkZSBlbnRyZWdhDQotb3B0aW9uc0dyb3VwX3RleHQ9T3BjaW9uZXMgZGUgZXhwb3J0YWNpXHUwMGYzbg0KLXByb2Nlc3NOYW1lTGFiZWxfdGV4dD1Ob21icmU6DQotY29udGV4dE5hbWVMYWJlbF90ZXh0PUNvbmZpZ3VyYWNpXHUwMGYzbjoNCi1wdWJsaXNoQ29uZmlndXJhdGlvbkNoZWNrQm94X3RleHQ9UHVibGljYXIgbGEgY29uZmlndXJhY2lcdTAwZjNuIHNlbGVjY2lvbmFkYQ0KLWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHNDaGVja0JveF90ZXh0PUV4cG9ydGFyIHNcdTAwZjNsbyBsb3MgZWxlbWVudG9zIGRlIGRlc2dsb3NlIHBsYW5pZmljYWRvcw0KLQ0KLSMgU2VsZWN0IFB1Ymxpc2hpbmcgT3B0aW9ucyBXaXphcmQgUGFnZQ0KLXNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90aXRsZT1TZWxlY2Npb25hciBvcGNpb25lcyBkZSBwdWJsaWNhY2lcdTAwZjNuDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RleHQ9U2VsZWNjaW9uYXIgbGFzIG9wY2lvbmVzIGRlIHB1YmxpY2FjaVx1MDBmM24gcXVlIHNlIHV0aWxpemFyXHUwMGUxbiBwYXJhIHB1YmxpY2FyIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBlc3BlY2lmaWNhZGEuDQotDQotIyBTZWxlY3QgRXhwb3J0IERpcmVjdG9yeSBXaXphcmQgcGFnZQ0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGl0bGU9RXNwZWNpZmljYXIgZWwgbm9tYnJlIGRlIHByb3llY3RvIHkgZWwgZGlyZWN0b3JpbyBkZSBleHBvcnRhY2lcdTAwZjNuLg0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1Fc3BlY2lmaWNhciBlbCBub21icmUgZGVsIHByb3llY3RvIGRlIE1pY3Jvc29mdCBQcm9qZWN0IHkgZWwgZGlyZWN0b3JpbyBkZSBleHBvcnRhY2lcdTAwZjNuLg0KLXByb2plY3ROYW1lTGFiZWxfdGV4dD1Ob21icmU6DQotZGlyTGFiZWxfdGV4dD1EaXJlY3RvcmlvOg0KLWJyb3dzZUJ1dHRvbl90ZXh0PUV4YW1pbmFyLi4uDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydE1TUFRhc2tfbmFtZT1FeHBvcnRhbmRvIGVsIHByb2Nlc28gc2VsZWNjaW9uYWRvIGEgcHJveWVjdG8gZGUgTWljcm9zb2Z0IFByb2plY3QuLi4NCi0NCi0jIENvbmZpcm1hdGlvbiBNZXNzYWdlcw0KLW92ZXJ3cml0ZVRleHRfbXNnPVlhIGV4aXN0ZSB1biBwcm95ZWN0byBkZSBNaWNyb3NvZnQgUHJvamVjdCAnJ3swfScnIGVuICcnezF9JycuXG5cdTAwYmZEZXNlYSBzb2JyZXNjcmliaXJsbz8NCi1jb21wbGV0ZWRUZXh0X21zZz1FbCBwcm9jZXNvIHNlbGVjY2lvbmFkbyAnJ3swfScnIHNlIGhhIGV4cG9ydGFkbyBzYXRpc2ZhY3RvcmlhbWVudGUgYWwgYXJjaGl2byBYTUwgJyd7MX0nJyBkZWwgcHJveWVjdG8gZGUgTWljcm9zb2Z0IFByb2plY3QuDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWV4cG9ydE1TUEVycm9yX21zZz1TZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgZXhwb3J0YXIgZWwgcHJvY2VzbyBzZWxlY2Npb25hZG8gJyd7MH0nJyBhbCBwcm95ZWN0byBkZSBNaWNyb3NvZnQgUHJvamVjdCAnJ3sxfScnLg0KLWV4cG9ydE1TUEVycm9yX3JlYXNvbj1QdWxzZSBlbiBEZXRhbGxlcyBwYXJhIG9idGVuZXIgbVx1MDBlMXMgaW5mb3JtYWNpXHUwMGYzbi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4MTA3MWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQNCi1leHBvcnRNU1BXaXphcmRfdGl0bGU9RXhwb3J0ZXIgdW4gcHJvamV0IE1pY3Jvc29mdA0KLQ0KLSMgU2VsZWN0IFByb2Nlc3MgV2l6YXJkIFBhZ2UNCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90aXRsZT1TXHUwMGU5bGVjdGlvbm5lciBkZXMgb3B0aW9ucyBkZSBwcm9jZXNzdXMgZXQgZCdleHBvcnRhdGlvbg0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RleHQ9U1x1MDBlOWxlY3Rpb25uZXogdW4gcHJvY2Vzc3VzIFx1MDBlMCBleHBvcnRlciBldCBzcFx1MDBlOWNpZmlleiBsZXMgb3B0aW9ucyBkJ2V4cG9ydGF0aW9uLg0KLXByb2Nlc3NHcm91cF90ZXh0PVByb2Nlc3N1cw0KLWNhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b25fdGV4dD1QYXR0ZXJuIGRlIGNhcGFjaXRcdTAwZTkNCi1kZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbl90ZXh0PVByb2Nlc3N1cyBkZSBsaXZyYWlzb24NCi1vcHRpb25zR3JvdXBfdGV4dD1PcHRpb25zIGQnZXhwb3J0YXRpb24NCi1wcm9jZXNzTmFtZUxhYmVsX3RleHQ9Tm9tIDoNCi1jb250ZXh0TmFtZUxhYmVsX3RleHQ9Q29uZmlndXJhdGlvbiA6DQotcHVibGlzaENvbmZpZ3VyYXRpb25DaGVja0JveF90ZXh0PVB1YmxpZXIgbGEgY29uZmlndXJhdGlvbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTllDQotZXhwb3J0T25seVBsYW5uZWRFbGVtZW50c0NoZWNrQm94X3RleHQ9RXhwb3J0ZXogdW5pcXVlbWVudCBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIHJcdTAwZTlwYXJ0aXRpb24gcXVpIHNvbnQgcGxhbmlmaVx1MDBlOXMNCi0NCi0jIFNlbGVjdCBQdWJsaXNoaW5nIE9wdGlvbnMgV2l6YXJkIFBhZ2UNCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU9U1x1MDBlOWxlY3Rpb25uZXIgbGVzIG9wdGlvbnMgZGUgcHVibGljYXRpb24NCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGV4dD1TXHUwMGU5bGVjdGlvbm5leiBsZXMgb3B0aW9ucyBkZSBwdWJsaWNhdGlvbiBxdWkgc2Vyb250IHV0aWxpc1x1MDBlOWVzIHBvdXIgcHVibGllciBsYSBjb25maWd1cmF0aW9uIHNwXHUwMGU5Y2lmaVx1MDBlOWUuDQotDQotIyBTZWxlY3QgRXhwb3J0IERpcmVjdG9yeSBXaXphcmQgcGFnZQ0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGl0bGU9U3BcdTAwZTljaWZpZXIgbGUgbm9tIGR1IHByb2pldCBldCBsZSByXHUwMGU5cGVydG9pcmUgZCdleHBvcnRhdGlvbg0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1TcFx1MDBlOWNpZmlleiBsZSBub20gZHUgcHJvamV0IE1pY3Jvc29mdCBldCBsZSByXHUwMGU5cGVydG9pcmUgZCdleHBvcnRhdGlvbi4NCi1wcm9qZWN0TmFtZUxhYmVsX3RleHQ9Tm9tIDoNCi1kaXJMYWJlbF90ZXh0PVJcdTAwZTlwZXJ0b2lyZSA6DQotYnJvd3NlQnV0dG9uX3RleHQ9UGFyY291cmlyLi4uDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydE1TUFRhc2tfbmFtZT1FeHBvcnRhdGlvbiBkdSBwcm9jZXNzdXMgc1x1MDBlOWxlY3Rpb25uXHUwMGU5IHZlcnMgbGUgcHJvamV0IE1pY3Jvc29mdC4uLg0KLQ0KLSMgQ29uZmlybWF0aW9uIE1lc3NhZ2VzDQotb3ZlcndyaXRlVGV4dF9tc2c9VW4gcHJvamV0IE1pY3Jvc29mdCAnJ3swfScnIGV4aXN0ZSBkXHUwMGU5alx1MDBlMCBkYW5zICcnezF9JycuXG5Wb3VsZXotdm91cyBsJydcdTAwZTljcmFzZXIgPw0KLWNvbXBsZXRlZFRleHRfbXNnPUxlIHByb2Nlc3N1cyBzXHUwMGU5bGVjdGlvbm5cdTAwZTkgJyd7MH0nJyBhIFx1MDBlOXRcdTAwZTkgY29ycmVjdGVtZW50IGV4cG9ydFx1MDBlOSBkYW5zIGxlIGZpY2hpZXIgWE1MIGR1IHByb2pldCBNaWNyb3NvZnQgJyd7MX0nJy4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotZXhwb3J0TVNQRXJyb3JfbXNnPVVuZSBlcnJldXIgcycnZXN0IHByb2R1aXRlIGxvcnMgZGUgbCcnZXhwb3J0YXRpb24gZHUgcHJvY2Vzc3VzIHNcdTAwZTlsZWN0aW9ublx1MDBlOSAnJ3swfScnIHZlcnMgbGUgcHJvamV0IE1pY3Jvc29mdCAnJ3sxfScnLg0KLWV4cG9ydE1TUEVycm9yX3JlYXNvbj1DbGlxdWV6IHN1ciBEXHUwMGU5dGFpbHMgcG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTU0MWUwMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFdpemFyZA0KLWV4cG9ydE1TUFdpemFyZF90aXRsZT1Fc3BvcnRhemlvbmUgcHJvZ2V0dG8gTWljcm9zb2Z0DQotDQotIyBTZWxlY3QgUHJvY2VzcyBXaXphcmQgUGFnZQ0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlPVNlbGV6aW9uYSBwcm9jZXNzbyBlIG9wemlvbmkgZGkgZXNwb3J0YXppb25lDQotc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dD1TZWxlemlvbmFyZSB1biBwcm9jZXNzbyBkYSBlc3BvcnRhcmUgZSBzcGVjaWZpY2FyZSBsZSBvcHppb25pIGRpIGVzcG9ydGF6aW9uZS4NCi1wcm9jZXNzR3JvdXBfdGV4dD1Qcm9jZXNzbw0KLWNhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b25fdGV4dD1Nb2RlbGxvIGRpIGNhcGFjaXRcdTAwZTANCi1kZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbl90ZXh0PVByb2Nlc3NvIGRpIHByb2R1emlvbmUNCi1vcHRpb25zR3JvdXBfdGV4dD1Fc3BvcnRhIG9wemlvbmkNCi1wcm9jZXNzTmFtZUxhYmVsX3RleHQ9Tm9tZToNCi1jb250ZXh0TmFtZUxhYmVsX3RleHQ9Q29uZmlndXJhemlvbmU6DQotcHVibGlzaENvbmZpZ3VyYXRpb25DaGVja0JveF90ZXh0PVB1YmJsaWNhIGxhIGNvbmZpZ3VyYXppb25lIHNlbGV6aW9uYXRhDQotZXhwb3J0T25seVBsYW5uZWRFbGVtZW50c0NoZWNrQm94X3RleHQ9RXNwb3J0YXJlIHNvbG8gZ2xpIGVsZW1lbnRpIHBpYW5pZmljYXRpIGRlbGxhIHN1ZGRpdmlzaW9uZQ0KLQ0KLSMgU2VsZWN0IFB1Ymxpc2hpbmcgT3B0aW9ucyBXaXphcmQgUGFnZQ0KLXNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90aXRsZT1TZWxlemlvbmEgb3B6aW9uaSBkaSBwdWJibGljYXppb25lDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RleHQ9U2VsZXppb25hcmUgbGUgb3B6aW9uaSBkaSBwdWJibGljYXppb25lIGNoZSB2ZXJyYW5ubyB1dGlsaXp6YXRlIHBlciBsYSBwdWJibGljYXppb25lIGRlbGxhIGNvbmZpZ3VyYXppb25lIHNwZWNpZmljYXRhLg0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBEaXJlY3RvcnkgV2l6YXJkIHBhZ2UNCi1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RpdGxlPVNwZWNpZmljYXJlIGlsIG5vbWUgZGVsIHByb2dldHRvIGUgbGEgZGlyZWN0b3J5IGRpIGVzcG9ydGF6aW9uZQ0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1TcGVjaWZpY2FyZSBpbCBub21lIGRlbCBwcm9nZXR0byBNaWNyb3NvZnQgZSBsYSBkaXJlY3RvcnkgZGkgZXNwb3J0YXppb25lLg0KLXByb2plY3ROYW1lTGFiZWxfdGV4dD1Ob21lOg0KLWRpckxhYmVsX3RleHQ9RGlyZWN0b3J5Og0KLWJyb3dzZUJ1dHRvbl90ZXh0PVNmb2dsaWEuLi4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotZXhwb3J0TVNQVGFza19uYW1lPUVzcG9ydGF6aW9uZSBkZWwgcHJvY2Vzc28gc2VsZXppb25hdG8gbmVsIHByb2dldHRvIE1pY3Jvc29mdC4uLg0KLQ0KLSMgQ29uZmlybWF0aW9uIE1lc3NhZ2VzDQotb3ZlcndyaXRlVGV4dF9tc2c9VW4gcHJvZ2V0dG8gTWljcm9zb2Z0ICcnezB9JycgZXNpc3RlIGdpXHUwMGUwIGluICcnezF9JycuXG5Tb3ZyYXNjcml2ZXJsbz8NCi1jb21wbGV0ZWRUZXh0X21zZz1JbCBwcm9jZXNzbyBzZWxlemlvbmF0byAnJ3swfScnIFx1MDBlOCBzdGF0byBlc3BvcnRhdG8gY29ycmV0dGFtZW50ZSBuZWwgZmlsZSBYTUwgZGVsIHByb2dldHRvIE1pY3Jvc29mdCAnJ3sxfScnLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1leHBvcnRNU1BFcnJvcl9tc2c9U2kgXHUwMGU4IHZlcmlmaWNhdG8gdW4gZXJyb3JlIGR1cmFudGUgbCcnZXNwb3J0YXppb25lIGRlbCBwcm9jZXNzbyBzZWxlemlvbmF0byAnJ3swfScnIG5lbCBwcm9nZXR0byBNaWNyb3NvZnQgJyd7MX0nJy4NCi1leHBvcnRNU1BFcnJvcl9yZWFzb249RmFyZSBjbGljIHN1IERldHRhZ2xpIHBlciB1bHRlcmlvcmkgaW5mb3JtYXppb25pLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfamEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTRiZDNjYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFdpemFyZA0KLWV4cG9ydE1TUFdpemFyZF90aXRsZT1NaWNyb3NvZnQgUHJvamVjdCBcdTMwNmVcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzgNCi0NCi0jIFNlbGVjdCBQcm9jZXNzIFdpemFyZCBQYWdlDQotc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGl0bGU9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDRhXHUzMDg4XHUzMDczXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGFhXHUzMGQ3XHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU5MDc4XHU2MjllDQotc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dD1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTlcdTMwOGJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwMDFcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1wcm9jZXNzR3JvdXBfdGV4dD1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1jYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uX3RleHQ9XHUzMGIxXHUzMGZjXHUzMGQxXHUzMGQzXHUzMGVhXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzDQotZGVsaXZlcnlQcm9jZXNzUmFkaW9CdXR0b25fdGV4dD1cdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1vcHRpb25zR3JvdXBfdGV4dD1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjMNCi1wcm9jZXNzTmFtZUxhYmVsX3RleHQ9XHU1NDBkXHU1MjRkOg0KLWNvbnRleHROYW1lTGFiZWxfdGV4dD1cdTY5Y2JcdTYyMTA6DQotcHVibGlzaENvbmZpZ3VyYXRpb25DaGVja0JveF90ZXh0PVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1NjljYlx1NjIxMFx1MzA2ZVx1NTE2Y1x1OTU4Yg0KLWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHNDaGVja0JveF90ZXh0PVx1OGEwOFx1NzUzYlx1NmUwOFx1MzA3Zlx1MzBkNlx1MzBlY1x1MzBmY1x1MzBhZlx1MzBjMFx1MzBhNlx1MzBmM1x1MzBmYlx1MzBhOFx1MzBlY1x1MzBlMVx1MzBmM1x1MzBjOFx1MzA2ZVx1MzA3Zlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOA0KLQ0KLSMgU2VsZWN0IFB1Ymxpc2hpbmcgT3B0aW9ucyBXaXphcmQgUGFnZQ0KLXNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90aXRsZT1cdTUxNmNcdTk1OGJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmVcdTkwNzhcdTYyOWUNCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGV4dD1cdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZcdTY5Y2JcdTYyMTBcdTMwOTJcdTUxNmNcdTk1OGJcdTMwNTlcdTMwOGJcdTMwNWZcdTMwODFcdTMwNmJcdTRmN2ZcdTc1MjhcdTMwNTlcdTMwOGJcdTUxNmNcdTk1OGJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIFNlbGVjdCBFeHBvcnQgRGlyZWN0b3J5IFdpemFyZCBwYWdlDQotc2VsZWN0RXhwb3J0RGlyV2l6YXJkUGFnZV90aXRsZT1cdTMwZDdcdTMwZWRcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTU0MGRcdTMwNGFcdTMwODhcdTMwNzNcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmVcdTYzMDdcdTViOWENCi1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RleHQ9TWljcm9zb2Z0IFByb2plY3QgXHU1NDBkXHUzMDRhXHUzMDg4XHUzMDczXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcHJvamVjdE5hbWVMYWJlbF90ZXh0PVx1NTQwZFx1NTI0ZDoNCi1kaXJMYWJlbF90ZXh0PVx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBmYzoNCi1icm93c2VCdXR0b25fdGV4dD1cdTUzYzJcdTcxNjcuLi4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotZXhwb3J0TVNQVGFza19uYW1lPVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA5MiBNaWNyb3NvZnQgUHJvamVjdCBcdTMwNmJcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi0NCi0jIENvbmZpcm1hdGlvbiBNZXNzYWdlcw0KLW92ZXJ3cml0ZVRleHRfbXNnPU1pY3Jvc29mdCBQcm9qZWN0ICcnezB9JycgXHUzMDZmICcnezF9JycgXHUzMDZiXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyXG5cdTRlMGFcdTY2ZjhcdTMwNGRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotY29tcGxldGVkVGV4dF9tc2c9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5ICcnezB9JycgXHUzMDRjXHUzMDAxTWljcm9zb2Z0IFByb2plY3QgWE1MIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiAnJ3sxfScnIFx1MzA2Ylx1NmI2M1x1NWUzOFx1MzA2Ylx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1leHBvcnRNU1BFcnJvcl9tc2c9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5ICcnezB9JycgXHUzMDkyXHUzMDAxTWljcm9zb2Z0IFByb2plY3QgJyd7MX0nJyBcdTMwNmJcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1leHBvcnRNU1BFcnJvcl9yZWFzb249XHU4YTczXHUzMDU3XHUzMDRmXHUzMDZmXHUzMDBjXHU4YTczXHU3ZDMwXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NDdmNTdiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkDQotZXhwb3J0TVNQV2l6YXJkX3RpdGxlPU1pY3Jvc29mdCBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjggXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwDQotDQotIyBTZWxlY3QgUHJvY2VzcyBXaXphcmQgUGFnZQ0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlPVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWJjMGYgXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwIFx1YzYzNVx1YzE1OCBcdWMxMjBcdWQwZGQNCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90ZXh0PVx1YjBiNFx1YmNmNFx1YjBiYyBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVhY2UwIFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMCBcdWM2MzVcdWMxNThcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXByb2Nlc3NHcm91cF90ZXh0PVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNA0KLWNhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b25fdGV4dD1cdWFlMzBcdWIyYTUgXHVkMzI4XHVkMTM0DQotZGVsaXZlcnlQcm9jZXNzUmFkaW9CdXR0b25fdGV4dD1cdWM4MDRcdWIyZWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotb3B0aW9uc0dyb3VwX3RleHQ9XHViMGI0XHViY2Y0XHViMGI0XHVhZTMwIFx1YzYzNVx1YzE1OA0KLXByb2Nlc3NOYW1lTGFiZWxfdGV4dD1cdWM3NzRcdWI5ODQ6DQotY29udGV4dE5hbWVMYWJlbF90ZXh0PVx1YWQ2Y1x1YzEzMToNCi1wdWJsaXNoQ29uZmlndXJhdGlvbkNoZWNrQm94X3RleHQ9XHVjMTIwXHVkMGRkXHVkNTVjIFx1YWQ2Y1x1YzEzMSBcdWFjZjVcdWFjMWMNCi1leHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzQ2hlY2tCb3hfdGV4dD1cdWFjYzRcdWQ2OGRcdWI0MWMgXHVjNzkxXHVjNWM1XHViZDg0XHViOTU4IFx1YzY5NFx1YzE4Y1x1YjljYyBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzANCi0NCi0jIFNlbGVjdCBQdWJsaXNoaW5nIE9wdGlvbnMgV2l6YXJkIFBhZ2UNCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU9XHVhY2Y1XHVhYzFjIFx1YzYzNVx1YzE1OCBcdWMxMjBcdWQwZGQNCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGV4dD1cdWM5YzBcdWM4MTVcdWI0MWMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YWNmNVx1YWMxY1x1ZDU1OFx1YWUzMCBcdWM3MDRcdWQ1NzQgXHVjMGFjXHVjNmE5XHViNDIwIFx1YWNmNVx1YWMxYyBcdWM2MzVcdWMxNThcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBEaXJlY3RvcnkgV2l6YXJkIHBhZ2UNCi1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RpdGxlPVx1ZDUwNFx1Yjg1Y1x1YzgxZFx1ZDJiOCBcdWM3NzRcdWI5ODQgXHViYzBmIFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMCBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWMgXHVjOWMwXHVjODE1DQotc2VsZWN0RXhwb3J0RGlyV2l6YXJkUGFnZV90ZXh0PU1pY3Jvc29mdCBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjggXHVjNzc0XHViOTg0IFx1YmMwZiBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1wcm9qZWN0TmFtZUxhYmVsX3RleHQ9XHVjNzc0XHViOTg0Og0KLWRpckxhYmVsX3RleHQ9XHViNTE0XHViODA5XHVkMWEwXHViOWFjOg0KLWJyb3dzZUJ1dHRvbl90ZXh0PVx1Y2MzZVx1YzU0NFx1YmNmNFx1YWUzMC4uLg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1leHBvcnRNU1BUYXNrX25hbWU9XHVjMTIwXHVkMGRkXHVkNTVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yjk3YyBNaWNyb3NvZnQgXHVkNTA0XHViODVjXHVjODFkXHVkMmI4XHViODVjIFx1YjBiNFx1YmNmNFx1YjBiNFx1YjI5NCBcdWM5MTEuLi4NCi0NCi0jIENvbmZpcm1hdGlvbiBNZXNzYWdlcw0KLW92ZXJ3cml0ZVRleHRfbXNnPU1pY3Jvc29mdCBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjggJyd7MH0nJ1x1Yzc3NChcdWFjMDApIFx1Yzc3NFx1YmJmOCAnJ3sxfScnIFx1YzcwNFx1Y2U1OFx1YzVkMCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuXG5cdWFjYjlcdWNjZDBcdWM0ZjBcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotY29tcGxldGVkVGV4dF9tc2c9XHVjMTIwXHVkMGRkXHVkNTVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCAnJ3swfScnXHVjNzQ0KFx1Yjk3YykgTWljcm9zb2Z0IFx1ZDUwNFx1Yjg1Y1x1YzgxZFx1ZDJiOCBYTUwgXHVkMzBjXHVjNzdjICcnezF9JycoXHVjNzNjKVx1Yjg1YyBcdWIwYjRcdWJjZjRcdWIwYzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWV4cG9ydE1TUEVycm9yX21zZz1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0ICcnezB9JydcdWM3NDQoXHViOTdjKSBNaWNyb3NvZnQgXHVkNTA0XHViODVjXHVjODFkXHVkMmI4ICcnezF9JycoXHVjNzNjKVx1Yjg1YyBcdWIwYjRcdWJjZjRcdWIwYjRcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotZXhwb3J0TVNQRXJyb3JfcmVhc29uPVx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHViY2Y0XHViODI0XHViYTc0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzNjYTQzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkDQotZXhwb3J0TVNQV2l6YXJkX3RpdGxlPUV4cG9ydGFyIE1pY3Jvc29mdCBQcm9qZWN0DQotDQotIyBTZWxlY3QgUHJvY2VzcyBXaXphcmQgUGFnZQ0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlPVNlbGVjaW9uYXIgcHJvY2Vzc28gZSBvcFx1MDBlN1x1MDBmNWVzIGV4cG9ydGFcdTAwZTdcdTAwZTNvDQotc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dD1TZWxlY2lvbmUgdW0gcHJvY2Vzc28gcGFyYSBleHBvcnRhciBlIGVzcGVjaWZpcXVlIGFzIG9wXHUwMGU3XHUwMGY1ZXMgZGUgZXhwb3J0YVx1MDBlN1x1MDBlM28uDQotcHJvY2Vzc0dyb3VwX3RleHQ9UHJvY2Vzc28NCi1jYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uX3RleHQ9UGFkclx1MDBlM28gZGUgUmVjdXJzbw0KLWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uX3RleHQ9UHJvY2Vzc28gZGUgRW50cmVnYQ0KLW9wdGlvbnNHcm91cF90ZXh0PU9wXHUwMGU3XHUwMGY1ZXMgZGUgRXhwb3J0YVx1MDBlN1x1MDBlM28NCi1wcm9jZXNzTmFtZUxhYmVsX3RleHQ9Tm9tZToNCi1jb250ZXh0TmFtZUxhYmVsX3RleHQ9Q29uZmlndXJhXHUwMGU3XHUwMGUzbzoNCi1wdWJsaXNoQ29uZmlndXJhdGlvbkNoZWNrQm94X3RleHQ9UHVibGljYXIgYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHNlbGVjaW9uYWRhDQotZXhwb3J0T25seVBsYW5uZWRFbGVtZW50c0NoZWNrQm94X3RleHQ9RXhwb3J0YXIgc29tZW50ZSBlbGVtZW50b3MgZGUgaW50ZXJydXBcdTAwZTdcdTAwZTNvIHBsYW5lamFkb3MNCi0NCi0jIFNlbGVjdCBQdWJsaXNoaW5nIE9wdGlvbnMgV2l6YXJkIFBhZ2UNCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU9U2VsZWNpb25hciBvcFx1MDBlN1x1MDBmNWVzIGRlIHB1YmxpY2FcdTAwZTdcdTAwZTNvDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RleHQ9U2VsZWNpb25lIGFzIG9wXHUwMGU3XHUwMGY1ZXMgZGUgcHVibGljYVx1MDBlN1x1MDBlM28gcXVlIHNlclx1MDBlM28gdXRpbGl6YWRhcyBwYXJhIHB1YmxpY2FyIGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBlc3BlY2lmaWNhZGEuDQotDQotIyBTZWxlY3QgRXhwb3J0IERpcmVjdG9yeSBXaXphcmQgcGFnZQ0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGl0bGU9RXNwZWNpZmlxdWUgbyBub21lIGRvIHByb2pldG8gZSBvIGRpcmV0XHUwMGYzcmlvIGRlIGV4cG9ydGFcdTAwZTdcdTAwZTNvDQotc2VsZWN0RXhwb3J0RGlyV2l6YXJkUGFnZV90ZXh0PUVzcGVjaWZpcXVlIG8gbm9tZSBlIG8gZGlyZXRcdTAwZjNyaW8gZGUgZXhwb3J0YVx1MDBlN1x1MDBlM28gZG8gTWljcm9zb2Z0IFByb2plY3QuDQotcHJvamVjdE5hbWVMYWJlbF90ZXh0PU5vbWU6DQotZGlyTGFiZWxfdGV4dD1EaXJldFx1MDBmM3JpbzoNCi1icm93c2VCdXR0b25fdGV4dD1Qcm9jdXJhci4uLg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1leHBvcnRNU1BUYXNrX25hbWU9RXhwb3J0YW5kbyBvIHByb2Nlc3NvIHNlbGVjaW9uYWRvIHBhcmEgbyBNaWNyb3NvZnQgUHJvamVjdC4uLg0KLQ0KLSMgQ29uZmlybWF0aW9uIE1lc3NhZ2VzDQotb3ZlcndyaXRlVGV4dF9tc2c9VW0gTWljcm9zb2Z0IFByb2plY3QgJyd7MH0nJyBqXHUwMGUxIGV4aXN0ZSBlbSAnJ3sxfScnLlxuRGVzZWphIHNvYnJlc2NyZXZcdTAwZWEtbG8/DQotY29tcGxldGVkVGV4dF9tc2c9TyBwcm9jZXNzbyBzZWxlY2lvbmFkbyAnJ3swfScnIGZvaSBleHBvcnRhZG8gY29tIFx1MDBlYXhpdG8gcGFyYSBvIGFycXVpdm8gWE1MIGRvIE1pY3Jvc29mdCBQcm9qZWN0ICcnezF9JycuDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWV4cG9ydE1TUEVycm9yX21zZz1PY29ycmV1IHVtIGVycm8gYW8gZXhwb3J0YXIgbyBwcm9jZXNzbyBzZWxlY2lvbmFkbyAnJ3swfScnIHBhcmEgbyBNaWNyb3NvZnQgUHJvamVjdCAnJ3sxfScnLg0KLWV4cG9ydE1TUEVycm9yX3JlYXNvbj1DbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjMDM0ZjUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQNCi1leHBvcnRNU1BXaXphcmRfdGl0bGU9XHU1YmZjXHU1MWZhIE1pY3Jvc29mdCBQcm9qZWN0DQotDQotIyBTZWxlY3QgUHJvY2VzcyBXaXphcmQgUGFnZQ0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlPVx1OTAwOVx1NjJlOVx1NmQ0MVx1N2EwYlx1NTQ4Y1x1NWJmY1x1NTFmYVx1OTAwOVx1OTg3OQ0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RleHQ9XHU5MDA5XHU2MmU5XHU4OTgxXHU1YmZjXHU1MWZhXHU3Njg0XHU2ZDQxXHU3YTBiXHVmZjBjXHU1ZTc2XHU2MzA3XHU1YjlhXHU1YmZjXHU1MWZhXHU5MDA5XHU5ODc5XHUzMDAyDQotcHJvY2Vzc0dyb3VwX3RleHQ9XHU2ZDQxXHU3YTBiDQotY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbl90ZXh0PVx1ODBmZFx1NTI5Ylx1NmEyMVx1NWYwZg0KLWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uX3RleHQ9XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiDQotb3B0aW9uc0dyb3VwX3RleHQ9XHU1YmZjXHU1MWZhXHU5MDA5XHU5ODc5DQotcHJvY2Vzc05hbWVMYWJlbF90ZXh0PVx1NTQwZFx1NzlmMFx1ZmYxYQ0KLWNvbnRleHROYW1lTGFiZWxfdGV4dD1cdTkxNGRcdTdmNmVcdWZmMWENCi1wdWJsaXNoQ29uZmlndXJhdGlvbkNoZWNrQm94X3RleHQ9XHU1M2QxXHU1ZTAzXHU5MDA5XHU1YjlhXHU3Njg0XHU5MTRkXHU3ZjZlDQotZXhwb3J0T25seVBsYW5uZWRFbGVtZW50c0NoZWNrQm94X3RleHQ9XHU1M2VhXHU1YmZjXHU1MWZhXHU1ZGYyXHU4OWM0XHU1MjEyXHU3Njg0XHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwDQotDQotIyBTZWxlY3QgUHVibGlzaGluZyBPcHRpb25zIFdpemFyZCBQYWdlDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RpdGxlPVx1OTAwOVx1NjJlOVx1NTNkMVx1NWUwM1x1OTAwOVx1OTg3OQ0KLXNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90ZXh0PVx1OTAwOVx1NjJlOVx1NWMwNlx1NzUyOFx1NGU4ZVx1NTNkMVx1NWUwM1x1NjMwN1x1NWI5YVx1OTE0ZFx1N2Y2ZVx1NzY4NFx1NTNkMVx1NWUwM1x1OTAwOVx1OTg3OVx1MzAwMg0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBEaXJlY3RvcnkgV2l6YXJkIHBhZ2UNCi1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RpdGxlPVx1NjMwN1x1NWI5YVx1OTg3OVx1NzZlZVx1NTQwZFx1NzlmMFx1NTQ4Y1x1NWJmY1x1NTFmYVx1NzZlZVx1NWY1NQ0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1cdTYzMDdcdTViOWEgTWljcm9zb2Z0IFByb2plY3QgXHU1NDBkXHU3OWYwXHU1NDhjXHU1YmZjXHU1MWZhXHU3NmVlXHU1ZjU1XHUzMDAyDQotcHJvamVjdE5hbWVMYWJlbF90ZXh0PVx1NTQwZFx1NzlmMFx1ZmYxYQ0KLWRpckxhYmVsX3RleHQ9XHU3NmVlXHU1ZjU1XHVmZjFhDQotYnJvd3NlQnV0dG9uX3RleHQ9XHU2ZDRmXHU4OWM4Li4uDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydE1TUFRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTVjMDZcdTkwMDlcdTViOWFcdTc2ODRcdTZkNDFcdTdhMGJcdTViZmNcdTUxZmFcdTgxZjMgTWljcm9zb2Z0IFByb2plY3QuLi4NCi0NCi0jIENvbmZpcm1hdGlvbiBNZXNzYWdlcw0KLW92ZXJ3cml0ZVRleHRfbXNnPVx1MjAxY3sxfVx1MjAxZFx1NGUyZFx1NWRmMlx1NWI1OFx1NTcyOCBNaWNyb3NvZnQgUHJvamVjdFx1MjAxY3swfVx1MjAxZFx1MzAwMlxuXHU4OTgxXHU4OTg2XHU3NmQ2XHU1YjgzXHU1NDE3XHVmZjFmDQotY29tcGxldGVkVGV4dF9tc2c9XHU5MDA5XHU1YjlhXHU3Njg0XHU2ZDQxXHU3YTBiXHUyMDFjezB9XHUyMDFkXHU1ZGYyXHU2MjEwXHU1MjlmXHU1YmZjXHU1MWZhXHU4MWYzIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBcdTY1ODdcdTRlZjZcdTIwMWN7MX1cdTIwMWRcdTMwMDINCi0jIEVycm9yIE1lc3NhZ2VzDQotZXhwb3J0TVNQRXJyb3JfbXNnPVx1NWMwNlx1OTAwOVx1NWI5YVx1NzY4NFx1NmQ0MVx1N2EwYlx1MjAxY3swfVx1MjAxZFx1NWJmY1x1NTFmYVx1ODFmMyBNaWNyb3NvZnQgUHJvamVjdFx1MjAxY3sxfVx1MjAxZFx1NjVmNlx1NTFmYVx1OTUxOVx1MzAwMg0KLWV4cG9ydE1TUEVycm9yX3JlYXNvbj1cdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTIwMWRcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdTRmZTFcdTYwNmZcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4NGMwZmIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQNCi1leHBvcnRNU1BXaXphcmRfdGl0bGU9XHU1MzJmXHU1MWZhIE1pY3Jvc29mdCBQcm9qZWN0DQotDQotIyBTZWxlY3QgUHJvY2VzcyBXaXphcmQgUGFnZQ0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlPVx1OTA3OFx1NTNkNlx1NmQ0MVx1N2EwYlx1NTQ4Y1x1NTMyZlx1NTFmYVx1OTA3OFx1OTgwNQ0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RleHQ9XHU5MDc4XHU1M2Q2XHU4OTgxXHU1MzJmXHU1MWZhXHU3Njg0XHU3YTBiXHU1ZThmXHVmZjBjXHU0ZTI2XHU2MzA3XHU1YjlhXHU1MzJmXHU1MWZhXHU5MDc4XHU5ODA1XHUzMDAyDQotcHJvY2Vzc0dyb3VwX3RleHQ9XHU3YTBiXHU1ZThmDQotY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbl90ZXh0PVx1NTI5Zlx1ODBmZFx1NTc4Ylx1NmEyMw0KLWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uX3RleHQ9XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiDQotb3B0aW9uc0dyb3VwX3RleHQ9XHU1MzJmXHU1MWZhXHU5MDc4XHU5ODA1DQotcHJvY2Vzc05hbWVMYWJlbF90ZXh0PVx1NTQwZFx1N2EzMVx1ZmYxYQ0KLWNvbnRleHROYW1lTGFiZWxfdGV4dD1cdTkxNGRcdTdmNmVcdWZmMWENCi1wdWJsaXNoQ29uZmlndXJhdGlvbkNoZWNrQm94X3RleHQ9XHU3NjdjXHU0ZjQ4XHU5MDc4XHU1M2Q2XHU3Njg0XHU5MTRkXHU3ZjZlDQotZXhwb3J0T25seVBsYW5uZWRFbGVtZW50c0NoZWNrQm94X3RleHQ9XHU1M2VhXHU1MzJmXHU1MWZhXHU1ZGYyXHU4OThmXHU1MjgzXHU3Njg0XHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwDQotDQotIyBTZWxlY3QgUHVibGlzaGluZyBPcHRpb25zIFdpemFyZCBQYWdlDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RpdGxlPVx1OTA3OFx1NTNkNlx1NzY3Y1x1NGY0OFx1OTA3OFx1OTgwNQ0KLXNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90ZXh0PVx1OTA3OFx1NTNkNlx1NzY3Y1x1NGY0OFx1OTA3OFx1OTgwNVx1ZmYwY1x1NWMwN1x1NzUyOFx1NGY4Nlx1NzY3Y1x1NGY0OFx1NjMwN1x1NWI5YVx1NzY4NFx1OTE0ZFx1N2Y2ZVx1MzAwMg0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBEaXJlY3RvcnkgV2l6YXJkIHBhZ2UNCi1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RpdGxlPVx1NjMwN1x1NWI5YVx1NWMwOFx1Njg0OFx1NTQwZFx1N2EzMVx1NTQ4Y1x1NTMyZlx1NTFmYVx1NzZlZVx1OTMwNA0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1cdTYzMDdcdTViOWEgTWljcm9zb2Z0IFByb2plY3QgXHU1NDBkXHU3YTMxXHU1NDhjXHU1MzJmXHU1MWZhXHU3NmVlXHU5MzA0XHUzMDAyDQotcHJvamVjdE5hbWVMYWJlbF90ZXh0PVx1NTQwZFx1N2EzMVx1ZmYxYQ0KLWRpckxhYmVsX3RleHQ9XHU3NmVlXHU5MzA0XHVmZjFhDQotYnJvd3NlQnV0dG9uX3RleHQ9XHU3MDBmXHU4OWJkLi4uDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydE1TUFRhc2tfbmFtZT1cdTVjMDdcdTkwNzhcdTUzZDZcdTc2ODRcdTdhMGJcdTVlOGZcdTUzMmZcdTUxZmFcdTUyMzAgTWljcm9zb2Z0IFByb2plY3QuLi4NCi0NCi0jIENvbmZpcm1hdGlvbiBNZXNzYWdlcw0KLW92ZXJ3cml0ZVRleHRfbXNnPU1pY3Jvc29mdCBQcm9qZWN0ICcnezB9JycgXHU1ZGYyXHU1YjU4XHU1NzI4ICcnezF9JycgXHU0ZTJkXHUzMDAyXG5cdTYwYThcdTg5ODFcdTg5ODZcdTViZWJcdTViODNcdTU1Y2VcdWZmMWYNCi1jb21wbGV0ZWRUZXh0X21zZz1cdTkwNzhcdTUzZDZcdTc2ODRcdTdhMGJcdTVlOGYgJyd7MH0nJyBcdTVkZjJcdTk4MDZcdTUyMjlcdTUzMmZcdTUxZmFcdTUyMzAgTWljcm9zb2Z0IFByb2plY3QgWE1MIFx1NmE5NCAnJ3sxfScnXHUzMDAyDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWV4cG9ydE1TUEVycm9yX21zZz1cdTVjMDdcdTkwNzhcdTUzZDZcdTc2ODRcdTdhMGJcdTVlOGYgJyd7MH0nJyBcdTUzMmZcdTUxZmFcdTUyMzAgTWljcm9zb2Z0IFByb2plY3QgJyd7MX0nJyBcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdTMwMDINCi1leHBvcnRNU1BFcnJvcl9yZWFzb249XHU1OTgyXHU5NzAwXHU3NmY4XHU5NWRjXHU4Y2M3XHU4YTBhXHVmZjBjXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHUzMDBkXHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAxYzA3MTAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlhMTA0YzYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwyLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBmcmFnbWVudAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwMzY5YTAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLm5sMi5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMi5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gbmwyLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmNkYmEwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgTVNQIEV4cG9ydCAoTkwyKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViYzY4ZGIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyIE1pY3Jvc29mdA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgV2l6YXJkcw0KLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZE5hbWU9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyIE1pY3Jvc29mdA0KLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uPVx1MDQyZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAgXHUwNDMyIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNVx1MDQzYVx1MDQ0MiBNaWNyb3NvZnQuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MDg3ZmY4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkDQotZXhwb3J0TVNQV2l6YXJkX3RpdGxlPVx1MDQyZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyIE1pY3Jvc29mdA0KLQ0KLSMgU2VsZWN0IFByb2Nlc3MgV2l6YXJkIFBhZ2UNCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90aXRsZT1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxIFx1MDQzOCBcdTA0M2ZcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0NDBcdTA0NGIgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwDQotc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzAgXHUwNDM4IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0NDBcdTA0NGIgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwLg0KLXByb2Nlc3NHcm91cF90ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MQ0KLWNhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b25fdGV4dD1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2QgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotZGVsaXZlcnlQcm9jZXNzUmFkaW9CdXR0b25fdGV4dD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDEgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDM4DQotb3B0aW9uc0dyb3VwX3RleHQ9XHUwNDFlXHUwNDNmXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMA0KLXByb2Nlc3NOYW1lTGFiZWxfdGV4dD1cdTA0MThcdTA0M2NcdTA0NGY6DQotY29udGV4dE5hbWVMYWJlbF90ZXh0PVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZjoNCi1wdWJsaXNoQ29uZmlndXJhdGlvbkNoZWNrQm94X3RleHQ9XHUwNDFlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUNCi1leHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzQ2hlY2tCb3hfdGV4dD1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQyXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzZlx1MDQzYlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDRiDQotDQotIyBTZWxlY3QgUHVibGlzaGluZyBPcHRpb25zIFdpemFyZCBQYWdlDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOCwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBEaXJlY3RvcnkgV2l6YXJkIHBhZ2UNCi1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RpdGxlPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDMwIFx1MDQzOCBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMA0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzMCBNaWNyb3NvZnQgXHUwNDM4IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwLg0KLXByb2plY3ROYW1lTGFiZWxfdGV4dD1cdTA0MThcdTA0M2NcdTA0NGY6DQotZGlyTGFiZWxfdGV4dD1cdTA0MWFcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzM6DQotYnJvd3NlQnV0dG9uX3RleHQ9XHUwNDFlXHUwNDMxXHUwNDM3XHUwNDNlXHUwNDQwLi4uDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydE1TUFRhc2tfbmFtZT1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMCBcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyIE1pY3Jvc29mdC4uLg0KLQ0KLSMgQ29uZmlybWF0aW9uIE1lc3NhZ2VzDQotb3ZlcndyaXRlVGV4dF9tc2c9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyIE1pY3Jvc29mdCAnJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDMyICcnezF9JycuXG5cdTA0MTdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM1XHUwNDMzXHUwNDNlPw0KLWNvbXBsZXRlZFRleHRfbXNnPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDEgJyd7MH0nJyBcdTA0NDNcdTA0NDFcdTA0M2ZcdTA0MzVcdTA0NDhcdTA0M2RcdTA0M2UgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkIFx1MDQzMiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgWE1MIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzMCBNaWNyb3NvZnQgJyd7MX0nJy4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotZXhwb3J0TVNQRXJyb3JfbXNnPVx1MDQxZlx1MDQ0MFx1MDQzOCBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwICcnezB9JycgXHUwNDMyIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNVx1MDQzYVx1MDQ0MiBNaWNyb3NvZnQgJyd7MX0nJyBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2RcdTA0MzhcdTA0M2FcdTA0M2JcdTA0MzAgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwLg0KLWV4cG9ydE1TUEVycm9yX3JlYXNvbj1cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTAwY2JhOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmZjhjYjUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDJhLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBmcmFnbWVudAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjdlNTRjMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLm5sMmEuamFyID0gc3JjLw0KLW91dHB1dC5ubDJhLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDJhLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3YTY5ZTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgTVNQIEV4cG9ydCAoTkwyYSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiOWM0MDAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBla3Nwb3J0IGFmIE1pY3Jvc29mdCBQcm9qZWN0DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBXaXphcmRzDQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1NaWNyb3NvZnQgUHJvamVjdA0KLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uPUVrc3BvcnRcdTAwZTlyIGVuIHByb2NlcyB0aWwgTWljcm9zb2Z0IFByb2plY3QuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkYTI3OWYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkDQotZXhwb3J0TVNQV2l6YXJkX3RpdGxlPUVrc3BvcnRcdTAwZTlyIE1pY3Jvc29mdCBQcm9qZWN0DQotDQotIyBTZWxlY3QgUHJvY2VzcyBXaXphcmQgUGFnZQ0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlPVZcdTAwZTZsZyBwcm9jZXMgb2cgZWtzcG9ydGluZHN0aWxsaW5nZXINCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90ZXh0PVZcdTAwZTZsZyBlbiBwcm9jZXMsIGRlciBza2FsIGVrc3BvcnRlcmVzLCBvZyBhbmdpdiBla3Nwb3J0dmFsZ2VuZS4NCi1wcm9jZXNzR3JvdXBfdGV4dD1Qcm9jZXMNCi1jYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uX3RleHQ9RnVua3Rpb25zbVx1MDBmOG5zdGVyDQotZGVsaXZlcnlQcm9jZXNzUmFkaW9CdXR0b25fdGV4dD1MZXZlcmluZ3Nwcm9jZXMNCi1vcHRpb25zR3JvdXBfdGV4dD1Fa3Nwb3J0dmFsZw0KLXByb2Nlc3NOYW1lTGFiZWxfdGV4dD1OYXZuOg0KLWNvbnRleHROYW1lTGFiZWxfdGV4dD1Lb25maWd1cmF0aW9uOg0KLXB1Ymxpc2hDb25maWd1cmF0aW9uQ2hlY2tCb3hfdGV4dD1QdWJsaWNcdTAwZTlyIGRlbiB2YWxndGUga29uZmlndXJhdGlvbg0KLWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHNDaGVja0JveF90ZXh0PUVrc3BvcnRcdTAwZTlyIGt1biBwbGFubGFndGUgbmVkYnJ5ZG5pbmdzZWxlbWVudGVyDQotDQotIyBTZWxlY3QgUHVibGlzaGluZyBPcHRpb25zIFdpemFyZCBQYWdlDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RpdGxlPVZcdTAwZTZsZyBwdWJsaWNlcmluZ3NpbmRzdGlsbGluZ2VyDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RleHQ9Vlx1MDBlNmxnIGRlIHB1YmxpY2VyaW5nc2luZHN0aWxsaW5nZXIsIGRlciBza2FsIGJydWdlcyB0aWwgYXQgcHVibGljZXJlIGRlbiBhbmdpdm5lIGtvbmZpZ3VyYXRpb24uDQotDQotIyBTZWxlY3QgRXhwb3J0IERpcmVjdG9yeSBXaXphcmQgcGFnZQ0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGl0bGU9QW5naXYgcHJvamVrdG5hdm4gb2cgZWtzcG9ydGJpYmxpb3Rlaw0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1BbmdpdiBNaWNyb3NvZnQgUHJvamVjdC1uYXZuZXQgb2cgZWtzcG9ydGJpYmxpb3Rla2V0Lg0KLXByb2plY3ROYW1lTGFiZWxfdGV4dD1OYXZuOg0KLWRpckxhYmVsX3RleHQ9QmlibGlvdGVrOg0KLWJyb3dzZUJ1dHRvbl90ZXh0PUdlbm5lbXNlLi4uDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydE1TUFRhc2tfbmFtZT1Fa3Nwb3J0ZXJlciBkZW4gdmFsZ3RlIHByb2NlcyB0aWwgTWljcm9zb2Z0IFByb2plY3QuLi4NCi0NCi0jIENvbmZpcm1hdGlvbiBNZXNzYWdlcw0KLW92ZXJ3cml0ZVRleHRfbXNnPU1pY3Jvc29mdCBQcm9qZWN0LXByb2pla3RldCAnJ3swfScnIGZpbmRlcyBhbGxlcmVkZSBpICcnezF9JycuXG5WaWwgZHUgb3ZlcnNrcml2ZT8NCi1jb21wbGV0ZWRUZXh0X21zZz1EZW4gdmFsZ3RlIHByb2NlcywgJyd7MH0nJywgZXIgZWtzcG9ydGVyZXQgdGlsIE1pY3Jvc29mdCBQcm9qZWN0IFhNTC1maWxlbiAnJ3sxfScnLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1leHBvcnRNU1BFcnJvcl9tc2c9RGVyIGVyIG9wc3RcdTAwZTVldCBlbiBmZWpsIHVuZGVyIGVrc3BvcnQgYWYgcHJvY2Vzc2VuICcnezB9JycgdGlsIE1pY3Jvc29mdCBQcm9qZWN0ICcnezF9JycuDQotZXhwb3J0TVNQRXJyb3JfcmVhc29uPUtsaWsgcFx1MDBlNSBPcGx5c25pbmdlciBmb3IgYXQgZlx1MDBlNSBmbGVyZSBvcGx5c25pbmdlci4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5YzFlYzguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzg5NmEzOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgRXhwb3J0IChOTDEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTdiMDEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OWZiZDQzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIEV4cG9ydA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgUGVyc3BlY3RpdmUNCi1wYWNrYWdpbmdQZXJzcGVjdGl2ZU5hbWU9UGFja2VuDQotDQotIyBDYXRlZ29yeQ0KLXBhY2thZ2luZ0NhdGVnb3J5TmFtZT1QYWNrZW4NCi0NCi0jIFZpZXdzDQotcGFja2FnaW5nVmlld05hbWU9TWV0aG9kZW5iaWJsaW90aGVrIHBhY2tlbg0KLXBhY2thZ2luZ01lc3NhZ2VWaWV3TmFtZT1OYWNocmljaHRlbiB6dW0gUGFja2VuIGRlciBCaWJsaW90aGVrDQotDQotIyBBY3Rpb24gU2V0DQotcGFja2FnaW5nQWN0aW9uU2V0PVBhY2tlbg0KLQ0KLSMgQWN0aW9ucw0KLW5ld0NvbmZpZ0FjdGlvbj0mS29uZmlndXJhdGlvbg0KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9TmV1ZSBCaWJsaW90aGVrc2tvbmZpZ3VyYXRpb24gZXJzdGVsbGVuDQotb3BlbkNvbmZpZ0FjdGlvbj0mS29uZmlndXJhdGlvbg0KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPVZvcmhhbmRlbmUgQmlibGlvdGhla3Nrb25maWd1cmF0aW9uIFx1MDBmNmZmbmVuDQotDQotIyBFeHBvcnQgV2l6YXJkIENhdGVnb3J5DQotZXhwb3J0Q2F0ZWdvcnlOYW1lPU1ldGhvZGUNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPUJpYmxpb3RoZWtza29uZmlndXJhdGlvbg0KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uPUVpbmUgQmlibGlvdGhla3Nrb25maWd1cmF0aW9uIGV4cG9ydGllcmVuDQotDQotIyBFeHBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWV4cG9ydE1ldGhvZFBsdWdpbnNXaXphcmROYW1lPU1ldGhvZGVuLVBsdWctaW5zDQotZXhwb3J0TWV0aG9kUGx1Z2lucz1FaW5lIG9kZXIgbWVocmVyZSBNZXRob2Rlbi1QbHVnLWlucyBleHBvcnRpZXJlbi4NCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTc1MTgyMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FeHBvcnRhY2lcdTAwZjNuIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgUGVyc3BlY3RpdmUNCi1wYWNrYWdpbmdQZXJzcGVjdGl2ZU5hbWU9RW1wYXF1ZXRhZG8NCi0NCi0jIENhdGVnb3J5DQotcGFja2FnaW5nQ2F0ZWdvcnlOYW1lPUVtcGFxdWV0YWRvDQotDQotIyBWaWV3cw0KLXBhY2thZ2luZ1ZpZXdOYW1lPUJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGRlIGVtcGFxdWV0YWRvDQotcGFja2FnaW5nTWVzc2FnZVZpZXdOYW1lPU1lbnNhamUgZGUgZW1wYXF1ZXRhZG8gZGUgbGEgYmlibGlvdGVjYQ0KLQ0KLSMgQWN0aW9uIFNldA0KLXBhY2thZ2luZ0FjdGlvblNldD1FbXBhcXVldGFkbw0KLQ0KLSMgQWN0aW9ucw0KLW5ld0NvbmZpZ0FjdGlvbj0mQ29uZmlndXJhY2lcdTAwZjNuDQotbmV3Q29uZmlnQWN0aW9uVG9vbHRpcD1DcmVhciB1bmEgbnVldmEgY29uZmlndXJhY2lcdTAwZjNuIGRlIGJpYmxpb3RlY2ENCi1vcGVuQ29uZmlnQWN0aW9uPSZDb25maWd1cmFjaVx1MDBmM24NCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1BYnJpciB1bmEgY29uZmlndXJhY2lcdTAwZjNuIGRlIGJpYmxpb3RlY2EgZXhpc3RlbnRlDQotDQotIyBFeHBvcnQgV2l6YXJkIENhdGVnb3J5DQotZXhwb3J0Q2F0ZWdvcnlOYW1lPU1cdTAwZTl0b2RvDQotDQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1Db25maWd1cmFjaVx1MDBmM24gZGUgbGEgYmlibGlvdGVjYQ0KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uPUV4cG9ydGFyIHVuYSBjb25maWd1cmFjaVx1MDBmM24gZGUgbGEgYmlibGlvdGVjYS4NCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9UGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8NCi1leHBvcnRNZXRob2RQbHVnaW5zPUV4cG9ydGFyIHVubyBvIHZhcmlvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kby4NCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmEyODA5ZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FeHBvcnRhdGlvbiBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIFBlcnNwZWN0aXZlDQotcGFja2FnaW5nUGVyc3BlY3RpdmVOYW1lPVJlZ3JvdXBlbWVudA0KLQ0KLSMgQ2F0ZWdvcnkNCi1wYWNrYWdpbmdDYXRlZ29yeU5hbWU9UmVncm91cGVtZW50DQotDQotIyBWaWV3cw0KLXBhY2thZ2luZ1ZpZXdOYW1lPUJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZGUgcmVncm91cGVtZW50DQotcGFja2FnaW5nTWVzc2FnZVZpZXdOYW1lPU1lc3NhZ2UgZGUgcmVncm91cGVtZW50IGRlIGJpYmxpb3RoXHUwMGU4cXVlcw0KLQ0KLSMgQWN0aW9uIFNldA0KLXBhY2thZ2luZ0FjdGlvblNldD1SZWdyb3VwZW1lbnQNCi0NCi0jIEFjdGlvbnMNCi1uZXdDb25maWdBY3Rpb249JkNvbmZpZ3VyYXRpb24NCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPUNyXHUwMGU5ZXIgdW5lIG5vdXZlbGxlIGNvbmZpZ3VyYXRpb24gZGUgYmlibGlvdGhcdTAwZThxdWUNCi1vcGVuQ29uZmlnQWN0aW9uPSZDb25maWd1cmF0aW9uDQotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9T3V2cmlyIHVuZSBjb25maWd1cmF0aW9uIGRlIGJpYmxpb3RoXHUwMGU4cXVlIGV4aXN0YW50ZQ0KLQ0KLSMgRXhwb3J0IFdpemFyZCBDYXRlZ29yeQ0KLWV4cG9ydENhdGVnb3J5TmFtZT1NXHUwMGU5dGhvZGUNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPUNvbmZpZ3VyYXRpb24gZGUgYmlibGlvdGhcdTAwZThxdWUNCi1leHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbj1FeHBvcnRlciB1bmUgY29uZmlndXJhdGlvbiBkZSBiaWJsaW90aFx1MDBlOHF1ZS4NCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9UGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlDQotZXhwb3J0TWV0aG9kUGx1Z2lucz1FeHBvcnRlciB1biBvdSBwbHVzaWV1cnMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlLg0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDE1Nzg2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVzcG9ydGEgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBQZXJzcGVjdGl2ZQ0KLXBhY2thZ2luZ1BlcnNwZWN0aXZlTmFtZT1DcmVhemlvbmUgZGkgcGFjY2hldHRpDQotDQotIyBDYXRlZ29yeQ0KLXBhY2thZ2luZ0NhdGVnb3J5TmFtZT1DcmVhemlvbmUgZGkgcGFjY2hldHRpDQotDQotIyBWaWV3cw0KLXBhY2thZ2luZ1ZpZXdOYW1lPUNyZWF6aW9uZSBwYWNjaGV0dGkgbGlicmVyaWUgZGVpIG1ldG9kaQ0KLXBhY2thZ2luZ01lc3NhZ2VWaWV3TmFtZT1NZXNzYWdnaW8gY3JlYXppb25lIHBhY2NoZXR0aSBkaSBsaWJyZXJpZQ0KLQ0KLSMgQWN0aW9uIFNldA0KLXBhY2thZ2luZ0FjdGlvblNldD1DcmVhemlvbmUgZGkgcGFjY2hldHRpDQotDQotIyBBY3Rpb25zDQotbmV3Q29uZmlnQWN0aW9uPSZDb25maWd1cmF6aW9uZQ0KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9Q3JlYSB1bmEgbnVvdmEgY29uZmlndXJhemlvbmUgZGkgbGlicmVyaWENCi1vcGVuQ29uZmlnQWN0aW9uPSZDb25maWd1cmF6aW9uZQ0KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPUFwcmkgdW5hIGNvbmZpZ3VyYXppb25lIGRpIGxpYnJlcmlhIGVzaXN0ZW50ZQ0KLQ0KLSMgRXhwb3J0IFdpemFyZCBDYXRlZ29yeQ0KLWV4cG9ydENhdGVnb3J5TmFtZT1NZXRvZG8NCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPUNvbmZpZ3VyYXppb25lIGRpIGxpYnJlcmlhDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb249RXNwb3J0YXJlIHVuYSBjb25maWd1cmF6aW9uZSBkaSBsaWJyZXJpYS4NCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9UGx1Zy1pbiBkZWwgbWV0b2RvDQotZXhwb3J0TWV0aG9kUGx1Z2lucz1Fc3BvcnRhcmUgdW5vIG8gcGlcdTAwZjkgcGx1Zy1pbiBkZWwgbWV0b2RvLg0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMmU3MjhmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBFeHBvcnQNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIFBlcnNwZWN0aXZlDQotcGFja2FnaW5nUGVyc3BlY3RpdmVOYW1lPVx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOFx1NTMxNg0KLQ0KLSMgQ2F0ZWdvcnkNCi1wYWNrYWdpbmdDYXRlZ29yeU5hbWU9XHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHU1MzE2DQotDQotIyBWaWV3cw0KLXBhY2thZ2luZ1ZpZXdOYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOFx1NTMxNg0KLXBhY2thZ2luZ01lc3NhZ2VWaWV3TmFtZT1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjhcdTUzMTZcdTMwZTFcdTMwYzNcdTMwYmJcdTMwZmNcdTMwYjgNCi0NCi0jIEFjdGlvbiBTZXQNCi1wYWNrYWdpbmdBY3Rpb25TZXQ9XHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHU1MzE2DQotDQotIyBBY3Rpb25zDQotbmV3Q29uZmlnQWN0aW9uPVx1NjljYlx1NjIxMCgmQykNCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NjljYlx1NjIxMFx1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLW9wZW5Db25maWdBY3Rpb249XHU2OWNiXHU2MjEwKCZDKQ0KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NjljYlx1NjIxMFx1MzA5Mlx1OTU4Ylx1MzA0Zg0KLQ0KLSMgRXhwb3J0IFdpemFyZCBDYXRlZ29yeQ0KLWV4cG9ydENhdGVnb3J5TmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzkNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NjljYlx1NjIxMA0KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NjljYlx1NjIxMFx1MzA5Mlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgRXhwb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1leHBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjMNCi1leHBvcnRNZXRob2RQbHVnaW5zPTEgXHUzMDY0XHU0ZWU1XHU0ZTBhXHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDkyXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlODYxNDQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgUGVyc3BlY3RpdmUNCi1wYWNrYWdpbmdQZXJzcGVjdGl2ZU5hbWU9XHVkMzI4XHVkMGE0XHVjOWQ1DQotDQotIyBDYXRlZ29yeQ0KLXBhY2thZ2luZ0NhdGVnb3J5TmFtZT1cdWQzMjhcdWQwYTRcdWM5ZDUNCi0NCi0jIFZpZXdzDQotcGFja2FnaW5nVmlld05hbWU9XHVkMzI4XHVkMGE0XHVjOWQ1IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMNCi1wYWNrYWdpbmdNZXNzYWdlVmlld05hbWU9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1ZDMyOFx1ZDBhNFx1YzlkNSBcdWJhNTRcdWMyZGNcdWM5YzANCi0NCi0jIEFjdGlvbiBTZXQNCi1wYWNrYWdpbmdBY3Rpb25TZXQ9XHVkMzI4XHVkMGE0XHVjOWQ1DQotDQotIyBBY3Rpb25zDQotbmV3Q29uZmlnQWN0aW9uPVx1YWQ2Y1x1YzEzMSgmQykNCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPVx1YzBjOCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVhZDZjXHVjMTMxIFx1Yzc5MVx1YzEzMQ0KLW9wZW5Db25maWdBY3Rpb249XHVhZDZjXHVjMTMxKCZDKQ0KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPVx1YWUzMFx1Yzg3NCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVhZDZjXHVjMTMxIFx1YzVmNFx1YWUzMA0KLQ0KLSMgRXhwb3J0IFdpemFyZCBDYXRlZ29yeQ0KLWV4cG9ydENhdGVnb3J5TmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWFkNmNcdWMxMzENCi1leHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbj1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YjBiNFx1YmNmNFx1YjBjNVx1YjJjOFx1YjJlNC4NCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9XHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OA0KLWV4cG9ydE1ldGhvZFBsdWdpbnM9XHVkNTU4XHViMDk4IFx1Yzc3NFx1YzBjMVx1Yzc1OCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzQ0IFx1YjBiNFx1YmNmNFx1YjBjNVx1YjJjOFx1YjJlNC4NCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjE0NmI3OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FeHBvcnRhXHUwMGU3XHUwMGUzbyBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIFBlcnNwZWN0aXZlDQotcGFja2FnaW5nUGVyc3BlY3RpdmVOYW1lPUVtcGFjb3RhbWVudG8NCi0NCi0jIENhdGVnb3J5DQotcGFja2FnaW5nQ2F0ZWdvcnlOYW1lPUVtcGFjb3RhbWVudG8NCi0NCi0jIFZpZXdzDQotcGFja2FnaW5nVmlld05hbWU9QmlibGlvdGVjYSBkZSBNXHUwMGU5dG9kb3MgZGUgRW1wYWNvdGFtZW50bw0KLXBhY2thZ2luZ01lc3NhZ2VWaWV3TmFtZT1NZW5zYWdlbSBkZSBFbXBhY290YW1lbnRvIGRlIEJpYmxpb3RlY2ENCi0NCi0jIEFjdGlvbiBTZXQNCi1wYWNrYWdpbmdBY3Rpb25TZXQ9RW1wYWNvdGFtZW50bw0KLQ0KLSMgQWN0aW9ucw0KLW5ld0NvbmZpZ0FjdGlvbj0mQ29uZmlndXJhXHUwMGU3XHUwMGUzbw0KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9Q3JpYXIgdW1hIG5vdmEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBiaWJsaW90ZWNhDQotb3BlbkNvbmZpZ0FjdGlvbj0mQ29uZmlndXJhXHUwMGU3XHUwMGUzbw0KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPUFicmlyIHVtYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIGJpYmxpb3RlY2EgZXhpc3RlbnRlDQotDQotIyBFeHBvcnQgV2l6YXJkIENhdGVnb3J5DQotZXhwb3J0Q2F0ZWdvcnlOYW1lPU1cdTAwZTl0b2RvDQotDQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1Db25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIEJpYmxpb3RlY2ENCi1leHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbj1FeHBvcnRhciB1bWEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBiaWJsaW90ZWNhLg0KLQ0KLSMgRXhwb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1leHBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1QbHVnLWlucyBkZSBNXHUwMGU5dG9kbw0KLWV4cG9ydE1ldGhvZFBsdWdpbnM9RXhwb3J0YXIgdW0gb3UgbWFpcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kby4NCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQ2NmYyNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHU1YmZjXHU1MWZhDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBQZXJzcGVjdGl2ZQ0KLXBhY2thZ2luZ1BlcnNwZWN0aXZlTmFtZT1cdTYyNTNcdTUzMDUNCi0NCi0jIENhdGVnb3J5DQotcGFja2FnaW5nQ2F0ZWdvcnlOYW1lPVx1NjI1M1x1NTMwNQ0KLQ0KLSMgVmlld3MNCi1wYWNrYWdpbmdWaWV3TmFtZT1cdTYyNTNcdTUzMDVcdTY1YjlcdTZjZDVcdTVlOTMNCi1wYWNrYWdpbmdNZXNzYWdlVmlld05hbWU9XHU1ZTkzXHU2MjUzXHU1MzA1XHU2ZDg4XHU2MDZmDQotDQotIyBBY3Rpb24gU2V0DQotcGFja2FnaW5nQWN0aW9uU2V0PVx1NjI1M1x1NTMwNQ0KLQ0KLSMgQWN0aW9ucw0KLW5ld0NvbmZpZ0FjdGlvbj1cdTkxNGRcdTdmNmUoJkMpDQotbmV3Q29uZmlnQWN0aW9uVG9vbHRpcD1cdTUyMWJcdTVlZmFcdTY1YjBcdTVlOTNcdTkxNGRcdTdmNmUNCi1vcGVuQ29uZmlnQWN0aW9uPVx1OTE0ZFx1N2Y2ZSgmQykNCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1cdTYyNTNcdTVmMDBcdTczYjBcdTY3MDlcdTVlOTNcdTkxNGRcdTdmNmUNCi0NCi0jIEV4cG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1leHBvcnRDYXRlZ29yeU5hbWU9XHU2NWI5XHU2Y2Q1DQotDQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1cdTVlOTNcdTkxNGRcdTdmNmUNCi1leHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbj1cdTViZmNcdTUxZmFcdTVlOTNcdTkxNGRcdTdmNmVcdTMwMDINCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2DQotZXhwb3J0TWV0aG9kUGx1Z2lucz1cdTViZmNcdTUxZmFcdTRlMDBcdTRlMmFcdTYyMTZcdTU5MWFcdTRlMmFcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjZcdTMwMDINCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTcwMjcyNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgRXhwb3J0DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBQZXJzcGVjdGl2ZQ0KLXBhY2thZ2luZ1BlcnNwZWN0aXZlTmFtZT1cdTU5NTdcdTg4ZGQNCi0NCi0jIENhdGVnb3J5DQotcGFja2FnaW5nQ2F0ZWdvcnlOYW1lPVx1NTk1N1x1ODhkZA0KLQ0KLSMgVmlld3MNCi1wYWNrYWdpbmdWaWV3TmFtZT1cdTU5NTdcdTg4ZGRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWINCi1wYWNrYWdpbmdNZXNzYWdlVmlld05hbWU9XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1OTU3XHU4OGRkXHU4YTBhXHU2MDZmDQotDQotIyBBY3Rpb24gU2V0DQotcGFja2FnaW5nQWN0aW9uU2V0PVx1NTk1N1x1ODhkZA0KLQ0KLSMgQWN0aW9ucw0KLW5ld0NvbmZpZ0FjdGlvbj1cdTkxNGRcdTdmNmUoJkMpDQotbmV3Q29uZmlnQWN0aW9uVG9vbHRpcD1cdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmUNCi1vcGVuQ29uZmlnQWN0aW9uPVx1OTE0ZFx1N2Y2ZSgmQykNCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1cdTk1OGJcdTU1NWZcdTczZmVcdTY3MDlcdTc2ODRcdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmUNCi0NCi0jIEV4cG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1leHBvcnRDYXRlZ29yeU5hbWU9XHU2NWI5XHU2Y2Q1DQotDQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1cdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmUNCi1leHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbj1cdTUzMmZcdTUxZmFcdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmVcdTMwMDINCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotZXhwb3J0TWV0aG9kUGx1Z2lucz1cdTUzMmZcdTUxZmFcdTRlMDBcdTYyMTZcdTU5MWFcdTUwMGJcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTMwMDINCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWVhMzc4Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAwMDBFIC0gSVVQRTAwOTlFDQotIw0KLQ0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1leHBvcnRDb25maWdXaXphcmRfdGl0bGU9QmlibGlvdGhla3Nrb25maWd1cmF0aW9uIGV4cG9ydGllcmVuDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGU9RXhwb3J0dHlwIGF1c3dcdTAwZTRobGVuDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1XXHUwMGU0aGxlbiBTaWUgZGVuIFR5cCBkZXIgenUgZXhwb3J0aWVyZW5kZW4gQmlibGlvdGhla3Nrb25maWd1cmF0aW9uIGF1cy4NCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0PU1ldGhvZGVua29uZmlndXJhdGlvbiBtaXQgYWxsZW4gTWV0aG9kZW4tUGx1Zy1pbnMgZXhwb3J0aWVyZW4NCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdTcGVjc0xhYmVsX3RleHQ9RWluZSBvZGVyIG1laHJlcmUgU3BlemlmaWthdGlvbmVuIGZcdTAwZmNyIE1ldGhvZGVua29uZmlndXJhdGlvbmVuIGV4cG9ydGllcmVuDQotc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1NZXRob2RlbmtvbmZpZ3VyYXRpb24gYXVzd1x1MDBlNGhsZW4NCi1zZWxlY3RDb25maWdQYWdlX2Rlc2M9V1x1MDBlNGhsZW4gU2llIGVpbmUgenUgZXhwb3J0aWVyZW5kZSBNZXRob2RlbmtvbmZpZ3VyYXRpb24gYXVzLiBBbGxlIHJlZmVyZW56aWVydGVuIE1ldGhvZGVuLVBsdWctaW5zIGluIGRlciBhdXNnZXdcdTAwZTRobHRlbiBLb25maWd1cmF0aW9uIHdlcmRlbiBpbiBkZW4gRXhwb3J0IGVpbmdlc2NobG9zc2VuLg0KLXNlbGVjdENvbmZpZ1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ9TWV0aG9kZW5rb25maWd1cmF0aW9uZW46DQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX3RpdGxlPUtvbmZpZ3VyYXRpb25zc3BlemlmaWthdGlvbmVuIGF1c3dcdTAwZTRobGVuDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2M9V1x1MDBlNGhsZW4gU2llIGRpZSB6dSBleHBvcnRpZXJlbmRlbiBTcGV6aWZpa2F0aW9uZW4gZlx1MDBmY3IgTWV0aG9kZW5rb25maWd1cmF0aW9uZW4gYXVzLg0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dD1NZXRob2RlbmtvbmZpZ3VyYXRpb25lbjoNCi1jaGVja0NvbmZpZ1BhZ2VfdGl0bGU9S29uZmlndXJhdGlvbnNmZWhsZXIgcHJcdTAwZmNmZW4NCi1jaGVja0NvbmZpZ1BhZ2VfZGVzYz1GXHUwMGZjciBkaWUgYXVzZ2V3XHUwMGU0aGx0ZSBNZXRob2RlbmtvbmZpZ3VyYXRpb24gd3VyZGUgZWluZSBJbnRlZ3JpdFx1MDBlNHRzcHJcdTAwZmNmdW5nIGR1cmNoZ2VmXHUwMGZjaHJ0LiBTZWhlbiBTaWUgc2ljaCBkZW4gRmVobGVyYmVyaWNodCBhbiB1bmQgZlx1MDBmY2hyZW4gU2llIGRpZSBlcmZvcmRlcmxpY2hlbiBGZWhsZXJiZXJpY2h0aWd1bmdlbiBkdXJjaC4NCi1zZWxlY3REZXN0aW5hdGlvblBhZ2VfdGl0bGU9RXhwb3J0dmVyemVpY2huaXMgYW5nZWJlbg0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV9kZXNjPUdlYmVuIFNpZSBlaW4gWmllbHZlcnplaWNobmlzIGFuLCBpbiBkZW0gZGllIGV4cG9ydGllcnRlIEtvbmZpZ3VyYXRpb24gZ2VzcGVpY2hlcnQgd2VyZGVuIHNvbGwuDQotDQotIyBFeHBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWV4cG9ydFBsdWdpbnNXaXphcmRfdGl0bGU9TWV0aG9kZW4tUGx1Zy1pbnMgZXhwb3J0aWVyZW4NCi1zZWxlY3RQbHVnaW5zUGFnZV90aXRsZT1NZXRob2Rlbi1QbHVnLWlucyBhdXN3XHUwMGU0aGxlbg0KLXNlbGVjdFBsdWdpbnNQYWdlX2Rlc2M9V1x1MDBlNGhsZW4gU2llIG1pbmRlc3RlbnMgZWluIHp1IGV4cG9ydGllcmVuZGVzIE1ldGhvZGVuLVBsdWctaW4gYXVzLg0KLXNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PU1ldGhvZGVuLVBsdWctaW5zOg0KLXJldmlld1BsdWdpbnNQYWdlX3RpdGxlPUFiaFx1MDBlNG5naWdrZWl0ZW4gcHJcdTAwZmNmZW4NCi1yZXZpZXdQbHVnaW5zUGFnZV9kZXNjPVdcdTAwZTRobGVuIFNpZSBqZWRlcyBNZXRob2Rlbi1QbHVnLWluIGF1cywgdW0gZGllIEFiaFx1MDBlNG5naWdrZWl0ZW4genUgcHJcdTAwZmNmZW4uIEtsaWNrZW4gU2llIGF1ZiBadXJcdTAwZmNjaywgdW0gZGllIGFiaFx1MDBlNG5naWdlbiBQbHVnLWlucyBhdXN6dXdcdTAwZTRobGVuLCBmYWxscyBkaWVzZSBpbiBkZW4gRXhwb3J0IGVpbmdlc2NobG9zc2VuIHdlcmRlbiBtXHUwMGZjc3Nlbi4NCi1yZXZpZXdQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dD1NZXRob2Rlbi1QbHVnLWluczoNCi1yZXZpZXdQbHVnaW5zUGFnZV9kZXBlbmRlbnRQbHVnaW5zTGFiZWxfdGV4dD1BYmhcdTAwZTRuZ2lnZSBNZXRob2Rlbi1QbHVnLWluczoNCi1yZXZpZXdQbHVnaW5zUGFnZV9hc3NvY2lhdGVkQ29uZmlnc0xhYmVsX3RleHQ9WnVnZW9yZG5ldGUgTWV0aG9kZW5rb25maWd1cmF0aW9uZW46DQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfdGl0bGU9RXhwb3J0IGJlc3RcdTAwZTR0aWdlbg0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX2Rlc2M9QmVzdFx1MDBlNHRpZ2VuIFNpZSBkaWUgenUgZXhwb3J0aWVyZW5kZW4gTWV0aG9kZW4tUGx1Zy1pbnMuDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2Vfbm9QbHVnaW5fdGV4dD1FcyB3dXJkZSBrZWluIE1ldGhvZGVuLVBsdWctaW4gYXVzZ2V3XHUwMGU0aGx0Lg0KLXNwZWNpZnlQYXRoUGFnZV90aXRsZT1FeHBvcnR2ZXJ6ZWljaG5pcyBhbmdlYmVuDQotc3BlY2lmeVBhdGhQYWdlX2Rlc2M9R2ViZW4gU2llIGVpbiBaaWVsdmVyemVpY2huaXMgYW4sIGluIGRlbSBkaWUgZXhwb3J0aWVydGVuIE1ldGhvZGVuLVBsdWctaW5zIGdlc3BlaWNoZXJ0IHdlcmRlbiBzb2xsZW4uDQotU2F2ZVBsdWdpblBhZ2VfZGVzYz1FeHBvcnRpZXJlbiBTaWUgZGllIGF1c2dld1x1MDBlNGhsdGVuIFBsdWctaW5zIHVuZCBLb25maWd1cmF0aW9uZW4gaW4gZGFzIGFuZ2VnZWJlbmUgWmllbHZlcnplaWNobmlzLg0KLUV4cG9ydFBsdWdpbldpemFyZF90aXRsZT1GZWhsZXIgaW0gRXhwb3J0YXNzaXN0ZW50ZW4gZlx1MDBmY3IgTWV0aG9kZW4tUGx1Zy1pbnMNCi1FeHBvcnRQbHVnaW5FcnJvcl9tc2c9SVVQRTAwMDBFOiBGZWhsZXIgYmVpbSBFeHBvcnQNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9QmlibGlvdGhla3Nrb25maWd1cmF0aW9uIGV4cG9ydGllcmVuDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfbXNnPUlVUEUwMDAxRTogRGllIEV4cG9ydG9wZXJhdGlvbiBrYW5uIG5pY2h0IGZvcnRnZXNldHp0IHdlcmRlbi4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotYW5hbHl6aW5nQ29uZmlnVGFza19uYW1lPUJpYmxpb3RoZWtza29uZmlndXJhdGlvbiB3aXJkIGFuYWx5c2llcnQuLi4NCi0NCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzA9S29uZmlndXJhdGlvbiB3aXJkIGV4cG9ydGllcnQuLi4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzE9RGVyIEV4cG9ydCBpc3QgYWJnZXNjaGxvc3Nlbi4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8xPURpZSBJbnRlZ3JpdFx1MDBlNHQgZGVyIGF1c2dld1x1MDBlNGhsdGVuIEtvbmZpZ3VyYXRpb24gd2lyZCBnZXByXHUwMGZjZnQuLi5cbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzI9RXMgd3VyZGUga2VpbmUgS29uZmlndXJhdGlvbiBhdXNnZXdcdTAwZTRobHQuXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8zPUVzIHd1cmRlIGtlaW4gRmVobGVyIGluIGRlciBhdXNnZXdcdTAwZTRobHRlbiBLb25maWd1cmF0aW9uIGdlZnVuZGVuLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfND1FcyB3dXJkZW4gezB9IEZlaGxlciBpbiBkZXIgYXVzZ2V3XHUwMGU0aGx0ZW4gS29uZmlndXJhdGlvbiBnZWZ1bmRlbi5cblNpZSBrXHUwMGY2bm5lbiBkZW4gS29uZmlndXJhdGlvbnNlZGl0b3IgXHUwMGY2ZmZuZW4gdW5kIGRpZXNlIEZlaGxlciBiZWhlYmVuLlxuU2llIGtcdTAwZjZubmVuIGRpZSBGZWhsZXIgYWJlciBhdWNoIGlnbm9yaWVyZW4gdW5kIGRpZSBPcGVyYXRpb24gZm9ydHNldHplbi4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2VfY2hlY2tpbmc9S29uZmlndXJhdGlvbiB3aXJkIGdlcHJcdTAwZmNmdC4gQml0dGUgd2FydGVuLi4uDQotRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZV90aXRsZT1NZXRob2RlbmtvbmZpZ3VyYXRpb24gYXVzd1x1MDBlNGhsZW4NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfYnJvd3NlPUR1cmNoc3VjaGVuLi4uDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RlZmF1bHRfZGlyPVN0YW5kYXJkdmVyemVpY2huaXMgdmVyd2VuZGVuDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMD1Lb25maWd1cmF0aW9uIHdpcmQgZXhwb3J0aWVydC4uLg0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzI9SVVQRTAwMDJFOiBFeHBvcnQgZmVobGdlc2NobGFnZW46IEZlaGxlciBiZWltIExhZGVuIGRlciBCaWJsaW90aGVrDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHND1JVVBFMDAwM0U6IEV4cG9ydCBmZWhsZ2VzY2hsYWdlbjogRmVobGVyIGJlaW0gS29waWVyZW4gZGVyIEJpYmxpb3RoZWsNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RTogRXhwb3J0IGZlaGxnZXNjaGxhZ2VuOiBGZWhsZXIgYmVpbSBFcnN0ZWxsZW4gZGVyIGFiZ2VzY2hsb3NzZW5lbiBLb25maWd1cmF0aW9uDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHOT1JVVBFMDAwNUU6IEV4cG9ydCBmZWhsZ2VzY2hsYWdlbjogRmVobGVyIGJlaW0gU3BlaWNoZXJuIGRlciBCaWJsaW90aGVrDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX25hbWU9TmFtZToNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGlyPVZlcnplaWNobmlzOg0KLUV4cG9ydFBsdWdpbldpemFyZF9lcnJvcj1GZWhsZXINCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfdGl0bGU9U3RhbmRhcmR0aXRlbA0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjPVN0YW5kYXJkYmVzY2hyZWlidW5nOg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMD1QbHVnLWlucyB3ZXJkZW4gZXhwb3J0aWVydC4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMT1FeHBvcnR2ZXJ6ZWljaG5pcyB3aXJkIGVyc3RlbGx0Li4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyPURhdGVpZW4gd2VyZGVuIGtvcGllcnQuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzM9QmlibGlvdGhlayB1bmQgUmVzc291cmNlbmRhdGVpIHdlcmRlbiBnZW5lcmllcnQuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzQ9RGVyIEV4cG9ydCBpc3QgYWJnZXNjaGxvc3Nlbi4NCi1TYXZlTGlicmFyeVBhZ2VfdGl0bGU9TWV0aG9kZW4tUGx1Zy1pbiBleHBvcnRpZXJlbg0KLVNhdmVQbHVnaW5QYWdlX2xhYmVsX25hbWU9RXhwb3J0bmFtZToNCi1TYXZlTGlicmFyeVBhZ2VfZGVzYz1FeHBvcnRpZXJlbiBTaWUgZGllIGF1c2dld1x1MDBlNGhsdGVuIE1ldGhvZGVuLVBsdWctaW5zIHVuZCBkaWUgenVnZW9yZG5ldGVuIEtvbmZpZ3VyYXRpb25lbi4NCi1FeHBvcnRQbHVnaW5XaXphcmRfTVNHMT1CaWJsaW90aGVrc2tvbmZpZ3VyYXRpb24gd2lyZCBhbmFseXNpZXJ0Li4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwYTU1ZTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMDAwRSAtIElVUEUwMDk5RQ0KLSMNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0Q29uZmlnV2l6YXJkX3RpdGxlPUV4cG9ydGFyIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBsYSBiaWJsaW90ZWNhDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGU9U2VsZWNjaW9uYXIgdGlwbyBkZSBleHBvcnRhY2lcdTAwZjNuDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1TZWxlY2Npb25lIGVsIHRpcG8gZGUgY29uZmlndXJhY2lcdTAwZjNuIGRlIGxhIGJpYmxpb3RlY2EgcGFyYSBleHBvcnRhci4NCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0PUV4cG9ydGFyIHVuYSBjb25maWd1cmFjaVx1MDBmM24gZGUgbVx1MDBlOXRvZG8geSB0b2RvcyBzdXMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8NCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdTcGVjc0xhYmVsX3RleHQ9RXhwb3J0YXIgdW5hIG8gdmFyaWFzIGVzcGVjaWZpY2FjaW9uZXMgZGUgbGEgY29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvDQotc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TZWxlY2Npb25hciBjb25maWd1cmFjaVx1MDBmM24gZGUgbVx1MDBlOXRvZG8NCi1zZWxlY3RDb25maWdQYWdlX2Rlc2M9U2VsZWNjaW9uZSB1bmEgY29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvIHBhcmEgZXhwb3J0YXIuIFRvZG9zIGxvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbyBjb24gcmVmZXJlbmNpYXMgZGUgbGEgY29uZmlndXJhY2lcdTAwZjNuIHNlbGVjY2lvbmFkYSBzZSBpbmNsdWlyXHUwMGUxbiBlbiBsYSBleHBvcnRhY2lcdTAwZjNuLg0KLXNlbGVjdENvbmZpZ1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ9Q29uZmlndXJhY2lvbmVzIGRlbCBtXHUwMGU5dG9kbzoNCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfdGl0bGU9U2VsZWNjaW9uYXIgZXNwZWNpZmljYWNpb25lcyBkZSBsYSBjb25maWd1cmFjaVx1MDBmM24NCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfZGVzYz1TZWxlY2Npb25lIHVuYSBvIHZhcmlhcyBlc3BlY2lmaWNhY2lvbmVzIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBwYXJhIGV4cG9ydGFyLg0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dD1Db25maWd1cmFjaW9uZXMgZGVsIG1cdTAwZTl0b2RvOg0KLWNoZWNrQ29uZmlnUGFnZV90aXRsZT1SZXZpc2FyIGVycm9yZXMgZGUgY29uZmlndXJhY2lcdTAwZjNuDQotY2hlY2tDb25maWdQYWdlX2Rlc2M9U2UgaGEgcmVhbGl6YWRvIHVuYSBjb21wcm9iYWNpXHUwMGYzbiBkZSBpbnRlZ3JpZGFkIGVuIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbyBzZWxlY2Npb25hZGEuIFJldmlzZSBlbCBpbmZvcm1lIGRlIGVycm9yZXMgeSByZWFsaWNlIGxhcyBhY2Npb25lcyBjb3JyZWN0aXZhcyBuZWNlc2FyaWFzLg0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV90aXRsZT1Fc3BlY2lmaWNhciBkaXJlY3RvcmlvIGRlIGV4cG9ydGFjaVx1MDBmM24NCi1zZWxlY3REZXN0aW5hdGlvblBhZ2VfZGVzYz1Fc3BlY2lmaXF1ZSB1biBkaXJlY3RvcmlvIGRlIGRlc3Rpbm8gcGFyYSBhbG1hY2VuYXIgbGEgY29uZmlndXJhY2lcdTAwZjNuIGV4cG9ydGFkYS4NCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0UGx1Z2luc1dpemFyZF90aXRsZT1FeHBvcnRhciBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbw0KLXNlbGVjdFBsdWdpbnNQYWdlX3RpdGxlPVNlbGVjY2lvbmFyIHBsdWctaW5zIGRlIG1cdTAwZTl0b2RvDQotc2VsZWN0UGx1Z2luc1BhZ2VfZGVzYz1TZWxlY2Npb25lIHVubyBvIHZhcmlvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbyBwYXJhIGV4cG9ydGFyLg0KLXNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PVBsdWctaW5zIGRlIG1cdTAwZTl0b2RvOg0KLXJldmlld1BsdWdpbnNQYWdlX3RpdGxlPVJldmlzYXIgZGVwZW5kZW5jaWFzDQotcmV2aWV3UGx1Z2luc1BhZ2VfZGVzYz1TZWxlY2Npb25lIGNhZGEgcGx1Zy1pbiBkZSBtXHUwMGU5dG9kbyBwYXJhIHJldmlzYXIgc3VzIGRlcGVuZGVuY2lhcy4gUHVsc2UgQW50ZXJpb3IgcGFyYSBzZWxlY2Npb25hciBsb3MgcGx1Zy1pbnMgZGVwZW5kaWVudGVzIHNpIGVzIG5lY2VzYXJpbyBpbmNsdWlybG9zIGVuIGxhIGV4cG9ydGFjaVx1MDBmM24uDQotcmV2aWV3UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9UGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG86DQotcmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQ9UGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8gZGVwZW5kaWVudGVzOg0KLXJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dD1Db25maWd1cmFjaW9uZXMgZGVsIG1cdTAwZTl0b2RvIGFzb2NpYWRhczoNCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV90aXRsZT1Db25maXJtYXIgZXhwb3J0YWNpXHUwMGYzbg0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX2Rlc2M9Q29uZmlybWFyIGxvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbyBxdWUgc2UgZXhwb3J0YXJcdTAwZTFuLg0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX25vUGx1Z2luX3RleHQ9Tm8gc2UgaGEgc2VsZWNjaW9uYWRvIG5pbmdcdTAwZmFuIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8uDQotc3BlY2lmeVBhdGhQYWdlX3RpdGxlPUVzcGVjaWZpY2FyIGRpcmVjdG9yaW8gZGUgZXhwb3J0YWNpXHUwMGYzbg0KLXNwZWNpZnlQYXRoUGFnZV9kZXNjPUVzcGVjaWZpcXVlIHVuIGRpcmVjdG9yaW8gZGUgZGVzdGlubyBwYXJhIGFsbWFjZW5hciBsb3MgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8gZXhwb3J0YWRvcy4NCi1TYXZlUGx1Z2luUGFnZV9kZXNjPUV4cG9ydGUgbG9zIHBsdWctaW5zIHkgbGFzIGNvbmZpZ3VyYWNpb25lcyBzZWxlY2Npb25hZG9zIGFsIGRpcmVjdG9yaW8gZGUgZGVzdGlubyBlc3BlY2lmaWNhZG8uDQotRXhwb3J0UGx1Z2luV2l6YXJkX3RpdGxlPUVycm9yIGRlbCBhc2lzdGVudGUgZGUgZXhwb3J0YWNpXHUwMGYzbiBkZSBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbw0KLUV4cG9ydFBsdWdpbkVycm9yX21zZz1JVVBFMDAwMEU6IFNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBkdXJhbnRlIGxhIGV4cG9ydGFjaVx1MDBmM24NCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9RXhwb3J0YXIgY29uZmlndXJhY2lcdTAwZjNuIGRlIGxhIGJpYmxpb3RlY2ENCi1leHBvcnRDb25maWdFcnJvckRpYWxvZ19tc2c9SVVQRTAwMDFFOiBMYSBvcGVyYWNpXHUwMGYzbiBkZSBleHBvcnRhY2lcdTAwZjNuIG5vIHB1ZWRlIGNvbnRpbnVhci4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotYW5hbHl6aW5nQ29uZmlnVGFza19uYW1lPUFuYWxpemFuZG8gbGEgY29uZmlndXJhY2lcdTAwZjNuIGRlIGxhIGJpYmxpb3RlY2EuLi4NCi0NCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzA9RXhwb3J0YW5kbyBjb25maWd1cmFjaVx1MDBmM24uLi4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzE9TGEgZXhwb3J0YWNpXHUwMGYzbiBoYSBjb25jbHVpZG8uDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMT1Db21wcm9iYW5kbyBsYSBpbnRlZ3JpZGFkIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBzZWxlY2Npb25hZGEuLi5cbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzI9Tm8gc2UgaGEgc2VsZWNjaW9uYWRvIG5pbmd1bmEgY29uZmlndXJhY2lcdTAwZjNuLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMz1MYSBjb25maWd1cmFjaVx1MDBmM24gc2VsZWNjaW9uYWRhIG5vIHRpZW5lIG5pbmdcdTAwZmFuIHByb2JsZW1hLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfND1IYXkgezB9IHByb2JsZW1hcyBlbiBsYSBjb25maWd1cmFjaVx1MDBmM24gc2VsZWNjaW9uYWRhLlxuUHVlZGUgYWJyaXIgZWwgZWRpdG9yIGRlIGNvbmZpZ3VyYWNpXHUwMGYzbiB5IGFycmVnbGFyIGVzb3MgcHJvYmxlbWFzLiBcbk8gcHVlZGUgb21pdGlyIGVzb3MgcHJvYmxlbWFzIHkgY29udGludWFyLg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9jaGVja2luZz1Db21wcm9iYW5kbyBsYSBjb25maWd1cmFjaVx1MDBmM24sIGVzcGVyZS4uLg0KLUV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9RXNjb2dlciBjb25maWd1cmFjaVx1MDBmM24gZGUgbVx1MDBlOXRvZG8NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfYnJvd3NlPUV4YW1pbmFyLi4uDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RlZmF1bHRfZGlyPVV0aWxpemFyIGRpcmVjdG9yaW8gcG9yIG9taXNpXHUwMGYzbg0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzA9RXhwb3J0YW5kbyBjb25maWd1cmFjaVx1MDBmM24uLi4NCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyPUlVUEUwMDAyRTogTGEgZXhwb3J0YWNpXHUwMGYzbiBoYSBmYWxsYWRvOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgY2FyZ2FyIGxhIGJpYmxpb3RlY2ENCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c0PUlVUEUwMDAzRTogTGEgZXhwb3J0YWNpXHUwMGYzbiBoYSBmYWxsYWRvOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgY29waWFyIGxhIGJpYmxpb3RlY2ENCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RTogTGEgZXhwb3J0YWNpXHUwMGYzbiBoYSBmYWxsYWRvOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgY2VycmFyIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBsYSBiaWJsaW90ZWNhDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHOT1JVVBFMDAwNUU6IExhIGV4cG9ydGFjaVx1MDBmM24gaGEgZmFsbGFkbzogU2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGFsIGd1YXJkYXIgbGEgYmlibGlvdGVjYQ0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPU5vbWJyZToNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGlyPURpcmVjdG9yaW86DQotRXhwb3J0UGx1Z2luV2l6YXJkX2Vycm9yPUVycm9yDQotRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlPVRcdTAwZWR0dWxvIHBvciBvbWlzaVx1MDBmM24NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYz1EZXNjcmlwY2lcdTAwZjNuIHBvciBvbWlzaVx1MDBmM246DQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwPUV4cG9ydGFuZG8gcGx1Zy1pbnMuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE9Q3JlYW5kbyBkaXJlY3RvcmlvIGRlIGV4cG9ydGFjaVx1MDBmM24uLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzI9Q29waWFuZG8gYXJjaGl2b3MuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzM9R2VuZXJhbmRvIGFyY2hpdm8gZGUgcmVjdXJzb3MgeSBiaWJsaW90ZWNhLi4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0c0PUxhIGV4cG9ydGFjaVx1MDBmM24gaGEgY29uY2x1aWRvLg0KLVNhdmVMaWJyYXJ5UGFnZV90aXRsZT1FeHBvcnRhciBwbHVnLWluIGRlIG1cdTAwZTl0b2RvDQotU2F2ZVBsdWdpblBhZ2VfbGFiZWxfbmFtZT1Ob21icmUgZGUgZXhwb3J0YWNpXHUwMGYzbjoNCi1TYXZlTGlicmFyeVBhZ2VfZGVzYz1FeHBvcnRlIGxvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbyBzZWxlY2Npb25hZG9zIHkgbGFzIGNvbmZpZ3VyYWNpb25lcyBhc29jaWFkYXMNCi1FeHBvcnRQbHVnaW5XaXphcmRfTVNHMT1BbmFsaXphbmRvIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBsYSBiaWJsaW90ZWNhLi4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxZTNkYjIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMDAwRSAtIElVUEUwMDk5RQ0KLSMNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0Q29uZmlnV2l6YXJkX3RpdGxlPUV4cG9ydGVyIGxhIGNvbmZpZ3VyYXRpb24gZGUgbGEgYmlibGlvdGhcdTAwZThxdWUNCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZT1TXHUwMGU5bGVjdGlvbm5lciBsZSB0eXBlIGQnZXhwb3J0YXRpb24NCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVNcdTAwZTlsZWN0aW9ubmVyIGxlIHR5cGUgZGUgY29uZmlndXJhdGlvbiBkZSBiaWJsaW90aFx1MDBlOHF1ZSBcdTAwZTAgZXhwb3J0ZXIuDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnTGFiZWxfdGV4dD1FeHBvcnRleiB1bmUgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUgZXQgdG91cyBzZXMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnU3BlY3NMYWJlbF90ZXh0PUV4cG9ydGV6IHVuZSBvdSBwbHVzaWV1cnMgc3BcdTAwZTljaWZpY2F0aW9ucyBkZSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLXNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9U1x1MDBlOWxlY3Rpb25uZXIgbGEgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUNCi1zZWxlY3RDb25maWdQYWdlX2Rlc2M9U1x1MDBlOWxlY3Rpb25uZXogdW5lIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlIFx1MDBlMCBleHBvcnRlci4gVG91cyBsZXMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlIHJcdTAwZTlmXHUwMGU5cmVuY1x1MDBlOXMgZGFucyBsYSBjb25maWd1cmF0aW9uIHNcdTAwZTlsZWN0aW9ublx1MDBlOWUgc2Vyb250IGluY2x1cyBkYW5zIGwnZXhwb3J0YXRpb24uDQotc2VsZWN0Q29uZmlnUGFnZV9jb25maWdzTGFiZWxfdGV4dD1Db25maWd1cmF0aW9ucyBkZSBtXHUwMGU5dGhvZGUgOg0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV90aXRsZT1TXHUwMGU5bGVjdGlvbm5lciBsZXMgc3BcdTAwZTljaWZpY2F0aW9ucyBkZSBjb25maWd1cmF0aW9uDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2M9U1x1MDBlOWxlY3Rpb25uZXogdW5lIG91IHBsdXNpZXVycyBzcFx1MDBlOWNpZmljYXRpb25zIGRlIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlIFx1MDBlMCBleHBvcnRlci4NCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ9Q29uZmlndXJhdGlvbnMgZGUgbVx1MDBlOXRob2RlIDoNCi1jaGVja0NvbmZpZ1BhZ2VfdGl0bGU9Ulx1MDBlOXZpc2VyIGxlcyBlcnJldXJzIGRlIGNvbmZpZ3VyYXRpb24NCi1jaGVja0NvbmZpZ1BhZ2VfZGVzYz1VbiBjb250clx1MDBmNGxlIGQnaW50XHUwMGU5Z3JpdFx1MDBlOSBhIFx1MDBlOXRcdTAwZTkgclx1MDBlOWFsaXNcdTAwZTkgc3VyIGxhIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlIHNcdTAwZTlsZWN0aW9ublx1MDBlOWUuIFJcdTAwZTl2aXNleiBsZSByYXBwb3J0IGQnZXJyZXVycyBldCBlZmZlY3R1ZXogbGVzIGFjdGlvbnMgY29ycmVjdGl2ZXMgblx1MDBlOWNlc3NhaXJlcy4NCi1zZWxlY3REZXN0aW5hdGlvblBhZ2VfdGl0bGU9U3BcdTAwZTljaWZpZXIgbGUgclx1MDBlOXBlcnRvaXJlIGQnZXhwb3J0YXRpb24NCi1zZWxlY3REZXN0aW5hdGlvblBhZ2VfZGVzYz1TcFx1MDBlOWNpZmlleiB1biByXHUwMGU5cGVydG9pcmUgZGUgZGVzdGluYXRpb24gcG91ciBzdG9ja2VyIGxhIGNvbmZpZ3VyYXRpb24gZXhwb3J0XHUwMGU5ZS4NCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0UGx1Z2luc1dpemFyZF90aXRsZT1FeHBvcnRlciBsZXMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlDQotc2VsZWN0UGx1Z2luc1BhZ2VfdGl0bGU9U1x1MDBlOWxlY3Rpb25uZXIgbGVzIHBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZQ0KLXNlbGVjdFBsdWdpbnNQYWdlX2Rlc2M9U1x1MDBlOWxlY3Rpb25uZXogdW4gb3UgcGx1c2lldXJzIHBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZSBcdTAwZTAgZXhwb3J0ZXIuDQotc2VsZWN0UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9UGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlIDoNCi1yZXZpZXdQbHVnaW5zUGFnZV90aXRsZT1SXHUwMGU5dmlzZXIgbGVzIGRcdTAwZTlwZW5kYW5jZXMNCi1yZXZpZXdQbHVnaW5zUGFnZV9kZXNjPVNcdTAwZTlsZWN0aW9ubmV6IGNoYXF1ZSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZSBwb3VyIHJcdTAwZTl2aXNlciBzZXMgZFx1MDBlOXBlbmRhbmNlcy4gQ2xpcXVleiBzdXIgUHJcdTAwZTljXHUwMGU5ZGVudCBwb3VyIHNcdTAwZTlsZWN0aW9ubmVyIGxlcyBwbHVnLWlucyBkXHUwMGU5cGVuZGFudHMgcydpbHMgZG9pdmVudCBcdTAwZWF0cmUgaW5jbHVzIGRhbnMgbCdleHBvcnRhdGlvbi4NCi1yZXZpZXdQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dD1QbHVnLWlucyBkZSBtXHUwMGU5dGhvZGUgOg0KLXJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0PVBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZSBkXHUwMGU5cGVuZGFudHMgOg0KLXJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dD1Db25maWd1cmF0aW9ucyBkZSBtXHUwMGU5dGhvZGUgYXNzb2NpXHUwMGU5ZXMgOg0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX3RpdGxlPUNvbmZpcm1lciBsJ2V4cG9ydGF0aW9uDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfZGVzYz1Db25maXJtZXogbGVzIHBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZSBcdTAwZTAgZXhwb3J0ZXIuDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2Vfbm9QbHVnaW5fdGV4dD1BdWN1biBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZSBuJ2EgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTkuDQotc3BlY2lmeVBhdGhQYWdlX3RpdGxlPVNwXHUwMGU5Y2lmaWVyIGxlIHJcdTAwZTlwZXJ0b2lyZSBkJ2V4cG9ydGF0aW9uDQotc3BlY2lmeVBhdGhQYWdlX2Rlc2M9U3BcdTAwZTljaWZpZXogdW4gclx1MDBlOXBlcnRvaXJlIGRlIGRlc3RpbmF0aW9uIHBvdXIgc3RvY2tlciBsZXMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlIGV4cG9ydFx1MDBlOXMuDQotU2F2ZVBsdWdpblBhZ2VfZGVzYz1FeHBvcnRleiBsZXMgcGx1Zy1pbnMgZXQgY29uZmlndXJhdGlvbnMgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cyB2ZXJzIGxlIHJcdTAwZTlwZXJ0b2lyZSBkZSBkZXN0aW5hdGlvbiBpbmRpcXVcdTAwZTkuDQotRXhwb3J0UGx1Z2luV2l6YXJkX3RpdGxlPUVycmV1ciBkZSBsJ2Fzc2lzdGFudCBFeHBvcnRlciBsZSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZQ0KLUV4cG9ydFBsdWdpbkVycm9yX21zZz1JVVBFMDAwMEUgOiBFcnJldXIgbG9ycyBkZSBsJ2V4cG9ydGF0aW9uDQotDQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIEVycm9yIERpYWxvZw0KLWV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPUV4cG9ydGVyIGxhIGNvbmZpZ3VyYXRpb24gZGUgbGEgYmlibGlvdGhcdTAwZThxdWUNCi1leHBvcnRDb25maWdFcnJvckRpYWxvZ19tc2c9SVVQRTAwMDFFIDogTCdvcFx1MDBlOXJhdGlvbiBkJ2V4cG9ydGF0aW9uIG5lIHBldXQgcGFzIHNlIHBvdXJzdWl2cmUuDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWFuYWx5emluZ0NvbmZpZ1Rhc2tfbmFtZT1BbmFseXNlIGRlIGxhIGNvbmZpZ3VyYXRpb24gZGUgbGEgYmlibGlvdGhcdTAwZThxdWUuLi4NCi0NCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzA9RXhwb3J0YXRpb24gZGUgbGEgY29uZmlndXJhdGlvbi4uLg0KLUNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMT1FeHBvcnRhdGlvbiB0ZXJtaW5cdTAwZTllLg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzE9Vlx1MDBlOXJpZmljYXRpb24gZGUgbCdpbnRcdTAwZTlncml0XHUwMGU5IGRlIGxhIGNvbmZpZ3VyYXRpb24gc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZS4uLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMj1BdWN1bmUgY29uZmlndXJhdGlvbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTllLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMz1BdWN1biBwcm9ibFx1MDBlOG1lIGRhbnMgbGEgY29uZmlndXJhdGlvbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTllLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfND1MYSBjb25maWd1cmF0aW9uIHNcdTAwZTlsZWN0aW9ublx1MDBlOWUgY29udGllbnQgezB9IHByb2JsXHUwMGU4bWVzLiBcblZvdXMgcG91dmV6IG91dnJpciBsJydcdTAwZTlkaXRldXIgZGUgY29uZmlndXJhdGlvbiBldCBjb3JyaWdlciBjZXMgcHJvYmxcdTAwZThtZXMuIFxuVm91cyBwb3V2ZXogXHUwMGU5Z2FsZW1lbnQgY2hvaXNpciBkJydpZ25vcmVyIGNlcyBwcm9ibFx1MDBlOG1lcyBldCBjb250aW51ZXIuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX2NoZWNraW5nPVZcdTAwZTlyaWZpY2F0aW9uIGRlIGxhIGNvbmZpZ3VyYXRpb24sIHZldWlsbGV6IHBhdGllbnRlci4uLg0KLUV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9Q2hvaXNpciBsYSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9icm93c2U9UGFyY291cmlyLi4uDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RlZmF1bHRfZGlyPVV0aWxpc2VyIGxlIHJcdTAwZTlwZXJ0b2lyZSBwYXIgZFx1MDBlOWZhdXQNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwPUV4cG9ydGF0aW9uIGRlIGxhIGNvbmZpZ3VyYXRpb24uLi4NCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyPUlVUEUwMDAyRSA6IEVjaGVjIGRlIGwnZXhwb3J0YXRpb24gOiBFcnJldXIgbG9ycyBkdSBjaGFyZ2VtZW50IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHND1JVVBFMDAwM0UgOiBFY2hlYyBkZSBsJ2V4cG9ydGF0aW9uIDogRXJyZXVyIGxvcnMgZGUgbGEgY29waWUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RSA6IEVjaGVjIGRlIGwnZXhwb3J0YXRpb24gOiBFcnJldXIgbG9ycyBkZSBsYSBmZXJtZXR1cmUgZGUgbGEgY29uZmlndXJhdGlvbiBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZQ0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzk9SVVQRTAwMDVFIDogRWNoZWMgZGUgbCdleHBvcnRhdGlvbiA6IEVycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfbmFtZT1Ob20gOg0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kaXI9Ulx1MDBlOXBlcnRvaXJlIDoNCi1FeHBvcnRQbHVnaW5XaXphcmRfZXJyb3I9RXJyZXVyDQotRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlPVRpdHJlIHBhciBkXHUwMGU5ZmF1dA0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjPURlc2NyaXB0aW9uIHBhciBkXHUwMGU5ZmF1dCA6DQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwPUV4cG9ydGF0aW9uIGRlcyBwbHVnLWlucy4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMT1Dclx1MDBlOWF0aW9uIGR1IHJcdTAwZTlwZXJ0b2lyZSBkJ2V4cG9ydGF0aW9uLi4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyPUNvcGllIGRlcyBmaWNoaWVycyBlbiBjb3Vycy4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMz1HXHUwMGU5blx1MDBlOXJhdGlvbiBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBldCBkZXMgZmljaGllcnMgZGUgcmVzc291cmNlcy4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHND1FeHBvcnRhdGlvbiB0ZXJtaW5cdTAwZTllLg0KLVNhdmVMaWJyYXJ5UGFnZV90aXRsZT1FeHBvcnRlciB1biBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZQ0KLVNhdmVQbHVnaW5QYWdlX2xhYmVsX25hbWU9Tm9tIGQnZXhwb3J0YXRpb24gOg0KLVNhdmVMaWJyYXJ5UGFnZV9kZXNjPUV4cG9ydGVyIGxlcyBwbHVnLWlucyBkZSBtXHUwMGU5dGhvZGUgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cyBldCBsZXMgY29uZmlndXJhdGlvbnMgYXNzb2NpXHUwMGU5ZXMNCi1FeHBvcnRQbHVnaW5XaXphcmRfTVNHMT1BbmFseXNlIGRlIGxhIGNvbmZpZ3VyYXRpb24gZGUgbGEgYmlibGlvdGhcdTAwZThxdWUuLi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDI5NjI2ZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAwMDBFIC0gSVVQRTAwOTlFDQotIw0KLQ0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1leHBvcnRDb25maWdXaXphcmRfdGl0bGU9RXNwb3J0YSBjb25maWd1cmF6aW9uZSBsaWJyZXJpYQ0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX3RpdGxlPVNlbGV6aW9uYSB0aXBvIGRpIGVzcG9ydGF6aW9uZQ0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M9U2VsZXppb25hcmUgaWwgdGlwbyBkaSBjb25maWd1cmF6aW9uZSBkaSBsaWJyZXJpYSBkYSBlc3BvcnRhcmUuDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnTGFiZWxfdGV4dD1Fc3BvcnRhcmUgdW5hIGNvbmZpZ3VyYXppb25lIGRpIG1ldG9kbyBlIHR1dHRpIGkgcmVsYXRpdmkgcGx1Zy1pbiBkaSBtZXRvZG8uDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnU3BlY3NMYWJlbF90ZXh0PUVzcG9ydGFyZSB1bmEgbyBwaVx1MDBmOSBzcGVjaWZpY2hlIGRpIGNvbmZpZ3VyYXppb25lIGRpIG1ldG9kby4NCi1zZWxlY3RDb25maWdQYWdlX3RpdGxlPVNlbGV6aW9uYSBjb25maWd1cmF6aW9uZSBtZXRvZG8NCi1zZWxlY3RDb25maWdQYWdlX2Rlc2M9U2VsZXppb25hcmUgdW5hIGNvbmZpZ3VyYXppb25lIGRpIG1ldG9kbyBkYSBlc3BvcnRhcmUuIFR1dHRpIGkgcGx1Zy1pbiBkaSBtZXRvZG8gYSBjdWkgc2kgZmEgcmlmZXJpbWVudG8gbmVsbGEgY29uZmlndXJhemlvbmUgc2VsZXppb25hdGEgdmVycmFubm8gaW5jbHVzaSBuZWxsJ2VzcG9ydGF6aW9uZS4NCi1zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PUNvbmZpZ3VyYXppb25pIGRpIG1ldG9kbzoNCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfdGl0bGU9U2VsZXppb25hIHNwZWNpZmljaGUgZGkgY29uZmlndXJhemlvbmUNCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfZGVzYz1TZWxlemlvbmFyZSB1bmEgbyBwaVx1MDBmOSBzcGVjaWZpY2hlIGRpIGNvbmZpZ3VyYXppb25lIGRpIG1ldG9kbyBkYSBlc3BvcnRhcmUuDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PUNvbmZpZ3VyYXppb25pIGRpIG1ldG9kbzoNCi1jaGVja0NvbmZpZ1BhZ2VfdGl0bGU9RXNhbWluYSBlcnJvcmkgZGkgY29uZmlndXJhemlvbmUNCi1jaGVja0NvbmZpZ1BhZ2VfZGVzYz1cdTAwYzggc3RhdGEgZXNlZ3VpdGEgdW5hIHZlcmlmaWNhIGRlbGwnaW50ZWdyaXRcdTAwZTAgc3VsbGEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvIHNlbGV6aW9uYXRhLiBFc2FtaW5hcmUgaWwgcmVwb3J0IGRlZ2xpIGVycm9yaSBlZCBlc2VndWlyZSBsZSBhemlvbmkgY29ycmV0dGl2ZSBuZWNlc3NhcmllLg0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV90aXRsZT1TcGVjaWZpY2EgZGlyZWN0b3J5IGRpIGVzcG9ydGF6aW9uZQ0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV9kZXNjPVNwZWNpZmljYXJlIHVuYSBkaXJlY3RvcnkgZGkgZGVzdGluYXppb25lIGluIGN1aSBtZW1vcml6emFyZSBsYSBjb25maWd1cmF6aW9uZSBlc3BvcnRhdGEuDQotDQotIyBFeHBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWV4cG9ydFBsdWdpbnNXaXphcmRfdGl0bGU9RXNwb3J0YSBwbHVnLWluIGRpIG1ldG9kbw0KLXNlbGVjdFBsdWdpbnNQYWdlX3RpdGxlPVNlbGV6aW9uYSBwbHVnLWluIGRpIG1ldG9kbw0KLXNlbGVjdFBsdWdpbnNQYWdlX2Rlc2M9U2VsZXppb25hcmUgdW5vIG8gcGlcdTAwZjkgcGx1Zy1pbiBkaSBtZXRvZG8gZGEgZXNwb3J0YXJlLg0KLXNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PVBsdWctaW4gZGkgbWV0b2RvOg0KLXJldmlld1BsdWdpbnNQYWdlX3RpdGxlPUVzYW1pbmEgZGlwZW5kZW56ZQ0KLXJldmlld1BsdWdpbnNQYWdlX2Rlc2M9U2VsZXppb25hcmUgY2lhc2N1biBwbHVnLWluIGRpIG1ldG9kbyBwZXIgZXNhbWluYXJuZSBsZSBkaXBlbmRlbnplLiBGYXJlIGNsaWMgc3UgSW5kaWV0cm8gcGVyIHNlbGV6aW9uYXJlIGkgcGx1Zy1pbiBkaXBlbmRlbnRpIG5lbCBjYXNvIGluIGN1aSBkZWJiYW5vIGVzc2VyZSBpbmNsdXNpIG5lbGwnZXNwb3J0YXppb25lLg0KLXJldmlld1BsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PVBsdWctaW4gZGkgbWV0b2RvOg0KLXJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0PVBsdWctaW4gZGkgbWV0b2RvIGRpcGVuZGVudGk6DQotcmV2aWV3UGx1Z2luc1BhZ2VfYXNzb2NpYXRlZENvbmZpZ3NMYWJlbF90ZXh0PUNvbmZpZ3VyYXppb25pIGRpIG1ldG9kbyBhc3NvY2lhdGU6DQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfdGl0bGU9Q29uZmVybWEgZXNwb3J0YXppb25lDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfZGVzYz1Db25mZXJtYXJlIGkgcGx1Zy1pbiBkaSBtZXRvZG8gY2hlIHZlcnJhbm5vIGVzcG9ydGF0aS4NCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9ub1BsdWdpbl90ZXh0PU5vbiBcdTAwZTggc3RhdG8gc2VsZXppb25hdG8gYWxjdW4gcGx1Zy1pbiBkaSBtZXRvZG8uDQotc3BlY2lmeVBhdGhQYWdlX3RpdGxlPVNwZWNpZmljYSBkaXJlY3RvcnkgZGkgZXNwb3J0YXppb25lDQotc3BlY2lmeVBhdGhQYWdlX2Rlc2M9U3BlY2lmaWNhcmUgdW5hIGRpcmVjdG9yeSBkaSBlc3BvcnRhemlvbmUgaW4gY3VpIG1lbW9yaXp6YXJlIGkgcGx1Zy1pbiBkaSBtZXRvZG8gZXNwb3J0YXRpLg0KLVNhdmVQbHVnaW5QYWdlX2Rlc2M9RXNwb3J0YXJlIGkgcGx1Zy1pbiBlIGxlIGNvbmZpZ3VyYXppb25pIHNlbGV6aW9uYXRlIG5lbGxhIGRpcmVjdG9yeSBkaSBkZXN0aW5hemlvbmUgc3BlY2lmaWNhdGEuDQotRXhwb3J0UGx1Z2luV2l6YXJkX3RpdGxlPUVycm9yZSBwcm9jZWR1cmEgZ3VpZGF0YSBFc3BvcnRhIHBsdWctaW4gZGkgbWV0b2RvDQotRXhwb3J0UGx1Z2luRXJyb3JfbXNnPUlVUEUwMDAwRTogUmlsZXZhdG8gZXJyb3JlIGR1cmFudGUgbCdlc3BvcnRhemlvbmUNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9RXNwb3J0YSBjb25maWd1cmF6aW9uZSBsaWJyZXJpYQ0KLWV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX21zZz1JVVBFMDAwMUU6IEltcG9zc2liaWxlIGNvbnRpbnVhcmUgbCdlc3BvcnRhemlvbmUuDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWFuYWx5emluZ0NvbmZpZ1Rhc2tfbmFtZT1BbmFsaXNpIGRlbGxhIGNvbmZpZ3VyYXppb25lIGRlbGxhIGxpYnJlcmlhIGluIGNvcnNvLi4uDQotDQotIyBUaGUgZm9sbG93aW5nIG1lc3NhZ2VzIGhhdmUgbm90IGJlZW4gcmV2aWV3ZWQuDQotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cwPUVzcG9ydGF6aW9uZSBkZWxsYSBjb25maWd1cmF6aW9uZSBpbiBjb3Jzby4uLg0KLUNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMT1Fc3BvcnRhemlvbmUgY29tcGxldGF0YQ0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzE9VmVyaWZpY2EgZGVsbCdpbnRlZ3JpdFx1MDBlMCBkZWxsYSBjb25maWd1cmF6aW9uZSBzZWxlemlvbmF0YSBpbiBjb3Jzby4uLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMj1OZXNzdW5hIGNvbmZpZ3VyYXppb25lIHNlbGV6aW9uYXRhLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMz1Ob24gYydcdTAwZTggYWxjdW4gcHJvYmxlbWEgbmVsbGEgY29uZmlndXJhemlvbmUgc2VsZXppb25hdGEuXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV80PUNpIHNvbm8gezB9IHByb2JsZW1pIG5lbGxhIGNvbmZpZ3VyYXppb25lIHNlbGV6aW9uYXRhLiBcblx1MDBjOCBwb3NzaWJpbGUgYXByaXJlIGwnJ2VkaXRvciBkaSBjb25maWd1cmF6aW9uaSBlIHJpc29sdmVyZSBxdWVzdGkgcHJvYmxlbWkuIFxuT3BwdXJlIFx1MDBlOCBwb3NzaWJpbGUgc2NlZ2xpZXJlIGRpIGlnbm9yYXJlIHF1ZXN0aSBwcm9ibGVtaSBlIGNvbnRpbnVhcmUuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX2NoZWNraW5nPVx1MDBjOCBpbiBjb3JzbyBsYSB2ZXJpZmljYSBkZWxsYSBjb25maWd1cmF6aW9uZSwgYXR0ZW5kZXJlLi4uDQotRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TY2VnbGkgY29uZmlndXJhemlvbmUgbWV0b2RvDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Jyb3dzZT1TZm9nbGlhLi4uDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RlZmF1bHRfZGlyPVV0aWxpenphIGRpcmVjdG9yeSBwcmVkZWZpbml0YQ0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzA9RXNwb3J0YXppb25lIGRlbGxhIGNvbmZpZ3VyYXppb25lIGluIGNvcnNvLi4uDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMj1JVVBFMDAwMkU6IEVzcG9ydGF6aW9uZSBub24gcml1c2NpdGE6IEVycm9yZSBkdXJhbnRlIGlsIGNhcmljYW1lbnRvIGRlbGxhIGxpYnJlcmlhDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHND1JVVBFMDAwM0U6IEVzcG9ydGF6aW9uZSBub24gcml1c2NpdGE6IEVycm9yZSBkdXJhbnRlIGxhIGNvcGlhIGRlbGxhIGxpYnJlcmlhDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMT1JVVBFMDAwNEU6IEVzcG9ydGF6aW9uZSBub24gcml1c2NpdGE6IEVycm9yZSBkdXJhbnRlIGxhIGNyZWF6aW9uZSBkZWxsYSBjaGl1c3VyYSBkZWxsYSBjb25maWd1cmF6aW9uZSBkZWxsYSBsaWJyZXJpYQ0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzk9SVVQRTAwMDVFOiBFc3BvcnRhemlvbmUgbm9uIHJpdXNjaXRhOiBFcnJvcmUgZHVyYW50ZSBpbCBzYWx2YXRhZ2dpbyBkZWxsYSBsaWJyZXJpYQ0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPU5vbWU6DQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Rpcj1EaXJlY3Rvcnk6DQotRXhwb3J0UGx1Z2luV2l6YXJkX2Vycm9yPUVycm9yZQ0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV90aXRsZT1UaXRvbG8gcHJlZGVmaW5pdG8NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYz1EZXNjcml6aW9uZSBwcmVkZWZpbml0YToNCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzA9RXNwb3J0YXppb25lIGRlaSBwbHVnLWluIGluIGNvcnNvLi4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cxPUNyZWF6aW9uZSBkZWxsYSBkaXJlY3RvcnkgZGkgZXNwb3J0YXppb25lIGluIGNvcnNvLi4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyPUNvcGlhIGRlaSBmaWxlIGluIGNvcnNvLi4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0czPUdlbmVyYXppb25lIGRlbGxhIGxpYnJlcmlhIGUgZGVsIGZpbGUgZGkgcmlzb3JzZSBpbiBjb3Jzby4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHND1Fc3BvcnRhemlvbmUgY29tcGxldGF0YQ0KLVNhdmVMaWJyYXJ5UGFnZV90aXRsZT1Fc3BvcnRhIHBsdWctaW4gZGkgbWV0b2RvDQotU2F2ZVBsdWdpblBhZ2VfbGFiZWxfbmFtZT1Ob21lIGRpIGVzcG9ydGF6aW9uZToNCi1TYXZlTGlicmFyeVBhZ2VfZGVzYz1Fc3BvcnRhcmUgaSBwbHVnLWluIGRpIG1ldG9kbyBzZWxlemlvbmF0aSBlIGxlIGNvbmZpZ3VyYXppb25pIGFzc29jaWF0ZQ0KLUV4cG9ydFBsdWdpbldpemFyZF9NU0cxPUFuYWxpc2kgZGVsbGEgY29uZmlndXJhemlvbmUgZGVsbGEgbGlicmVyaWEgaW4gY29yc28uLi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDE0ZDdkMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAwMDBFIC0gSVVQRTAwOTlFDQotIw0KLQ0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1leHBvcnRDb25maWdXaXphcmRfdGl0bGU9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU2OWNiXHU2MjEwXHUzMDZlXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4DQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGU9XHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGJmXHUzMGE0XHUzMGQ3XHUzMDZlXHU5MDc4XHU2MjllDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTlcdTMwOGJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTY5Y2JcdTYyMTBcdTMwNmVcdTMwYmZcdTMwYTRcdTMwZDdcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA2OFx1MzA1ZFx1MzA2ZVx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOA0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ1NwZWNzTGFiZWxfdGV4dD0xIFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1NGVkNVx1NjlkOFx1MzA5Mlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOA0KLXNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHUzMDZlXHU5MDc4XHU2MjllDQotc2VsZWN0Q29uZmlnUGFnZV9kZXNjPVx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1OVx1MzA4Ylx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTY5Y2JcdTYyMTBcdTUxODVcdTMwNjdcdTUzYzJcdTcxNjdcdTMwNTVcdTMwOGNcdTMwOGJcdTMwNTlcdTMwNzlcdTMwNjZcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNGNcdTMwMDFcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNmJcdTU0MmJcdTMwN2VcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDINCi1zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMDoNCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfdGl0bGU9XHU2OWNiXHU2MjEwXHU0ZWQ1XHU2OWQ4XHUzMDZlXHU5MDc4XHU2MjllDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2M9XHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU5XHUzMDhiIDEgXHUzMDY0XHU0ZWU1XHU0ZTBhXHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHU0ZWQ1XHU2OWQ4XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMDoNCi1jaGVja0NvbmZpZ1BhZ2VfdGl0bGU9XHU2OWNiXHU2MjEwXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDZlXHU2OTFjXHU4YTBlDQotY2hlY2tDb25maWdQYWdlX2Rlc2M9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHUzMDY3XHU2NTc0XHU1NDA4XHU2MDI3XHU2OTFjXHU2N2ZiXHUzMDRjXHU1YjlmXHU4ODRjXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIFx1MzBhOFx1MzBlOVx1MzBmY1x1MzBmYlx1MzBlY1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA5Mlx1NjkxY1x1OGEwZVx1MzA1N1x1MzA2Nlx1MzAwMVx1NWZjNVx1ODk4MVx1MzA2YVx1NGZlZVx1NmI2M1x1MzBhMlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1NWI5Zlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV90aXRsZT1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmVcdTYzMDdcdTViOWENCi1zZWxlY3REZXN0aW5hdGlvblBhZ2VfZGVzYz1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTdcdTMwNWZcdTY5Y2JcdTYyMTBcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNTlcdTMwOGJcdTViOWJcdTUxNDhcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0UGx1Z2luc1dpemFyZF90aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzgNCi1zZWxlY3RQbHVnaW5zUGFnZV90aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTkwNzhcdTYyOWUNCi1zZWxlY3RQbHVnaW5zUGFnZV9kZXNjPVx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1OVx1MzA4YiAxIFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmMzoNCi1yZXZpZXdQbHVnaW5zUGFnZV90aXRsZT1cdTRmOWRcdTViNThcdTk1YTJcdTRmYzJcdTMwNmVcdTY5MWNcdThhMGUNCi1yZXZpZXdQbHVnaW5zUGFnZV9kZXNjPVx1NTQwNFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzAwMVx1MzA1ZFx1MzA2ZVx1NGY5ZFx1NWI1OFx1OTVhMlx1NGZjMlx1MzA5Mlx1NjkxY1x1OGEwZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwMGNcdTYyM2JcdTMwOGJcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwMDFcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNmJcdTdkNDRcdTMwN2ZcdThmYmNcdTMwODBcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGJcdTRmOWRcdTViNThcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNGNcdTMwNDJcdTMwOGNcdTMwNzBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yZXZpZXdQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjM6DQotcmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQ9XHU0ZjlkXHU1YjU4XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzOg0KLXJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dD1cdTk1YTJcdTkwMjNcdTMwNTlcdTMwOGJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTA6DQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfdGl0bGU9XHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZlXHU3OGJhXHU4YThkDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfZGVzYz1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTlcdTMwOGJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwOTJcdTc4YmFcdThhOGRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9ub1BsdWdpbl90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLXNwZWNpZnlQYXRoUGFnZV90aXRsZT1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmVcdTYzMDdcdTViOWENCi1zcGVjaWZ5UGF0aFBhZ2VfZGVzYz1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTdcdTMwNWZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNTlcdTMwOGJcdTViOWJcdTUxNDhcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1TYXZlUGx1Z2luUGFnZV9kZXNjPVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA2OFx1NjljYlx1NjIxMFx1MzA5Mlx1MzAwMVx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1NWI5Ylx1NTE0OFx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBmY1x1MzA2Ylx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLUV4cG9ydFBsdWdpbldpemFyZF90aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwZmJcdTMwYTZcdTMwYTNcdTMwYjZcdTMwZmNcdTMwYzlcdTMwNjdcdTMwNmVcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYThcdTMwZTlcdTMwZmMNCi1FeHBvcnRQbHVnaW5FcnJvcl9tc2c9SVVQRTAwMDBFOiBcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTY2NDJcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU2OWNiXHU2MjEwXHUzMDZlXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4DQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfbXNnPUlVUEUwMDAxRTogXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHU2NGNkXHU0ZjVjXHUzMDkyXHU3ZDlhXHU4ODRjXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWFuYWx5emluZ0NvbmZpZ1Rhc2tfbmFtZT1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTY5Y2JcdTYyMTBcdTMwOTJcdTUyMDZcdTY3OTBcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi0NCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzA9XHU2OWNiXHU2MjEwXHUzMDkyXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cxPVx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA0Y1x1NWI4Y1x1NGU4Nlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzE9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHU2OWNiXHU2MjEwXHUzMDZlXHU2NTc0XHU1NDA4XHU2MDI3XHUzMDkyXHU2OTFjXHU2N2ZiXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8yPVx1NjljYlx1NjIxMFx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMz1cdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTY5Y2JcdTYyMTBcdTMwNmJcdTU1NGZcdTk4NGNcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzQ9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHU2OWNiXHU2MjEwXHUzMDZiIHswfSBcdTUwMGJcdTMwNmVcdTU1NGZcdTk4NGNcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDJcblx1NjljYlx1NjIxMFx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0NFx1MzA2Nlx1MzAwMVx1MzA1M1x1MzA4Y1x1MzA4OVx1MzA2ZVx1NTU0Zlx1OTg0Y1x1MzA5Mlx1NGZlZVx1NmI2M1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMlxuXHUzMDdlXHUzMDVmXHUzMDZmXHUzMDAxXHUzMDUzXHUzMDhjXHUzMDg5XHUzMDZlXHU1NTRmXHU5ODRjXHUzMDkyXHU3MTIxXHU4OTk2XHUzMDU3XHUzMDY2XHU3ZDlhXHU4ODRjXHUzMDU5XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDgyXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDU5XHUzMDAyDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX2NoZWNraW5nPVx1NjljYlx1NjIxMFx1MzA2ZVx1NjkxY1x1NjdmYlx1NGUyZFx1MzA2N1x1MzA1OVx1MzAwMVx1MzA0YVx1NWY4NVx1MzA2MVx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NC4uLg0KLUV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHUzMDZlXHU5MDc4XHU2MjllDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Jyb3dzZT1cdTUzYzJcdTcxNjcuLi4NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGVmYXVsdF9kaXI9XHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGZiXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDZlXHU0ZjdmXHU3NTI4DQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMD1cdTY5Y2JcdTYyMTBcdTMwOTJcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyPUlVUEUwMDAyRTogXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwYzlcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c0PUlVUEUwMDAzRTogXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwYjNcdTMwZDRcdTMwZmNcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RTogXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTY5Y2JcdTYyMTBcdTMwNmVcdTY4M2NcdTdkMGRcdTZhNWZcdTY5Y2JcdTMwOTJcdTRmNWNcdTYyMTBcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c5PUlVUEUwMDA1RTogXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTRmZGRcdTdiYTFcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfbmFtZT1cdTU0MGRcdTUyNGQ6DQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Rpcj1cdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmM6DQotRXhwb3J0UGx1Z2luV2l6YXJkX2Vycm9yPVx1MzBhOFx1MzBlOVx1MzBmYw0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV90aXRsZT1cdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmVcdTg4NjhcdTk4NGMNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYz1cdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmVcdThhYWNcdTY2MGU6DQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwPVx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMT1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzI9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHUzMGIzXHUzMGQ0XHUzMGZjXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0czPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2OFx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzBmYlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NzUxZlx1NjIxMFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHND1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNGNcdTViOGNcdTRlODZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1TYXZlTGlicmFyeVBhZ2VfdGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDZlXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4DQotU2F2ZVBsdWdpblBhZ2VfbGFiZWxfbmFtZT1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTU0MGQ6DQotU2F2ZUxpYnJhcnlQYWdlX2Rlc2M9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDRhXHUzMDg4XHUzMDczXHU5NWEyXHU5MDIzXHUzMDU5XHUzMDhiXHU2OWNiXHU2MjEwXHUzMDkyXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotRXhwb3J0UGx1Z2luV2l6YXJkX01TRzE9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU2OWNiXHU2MjEwXHUzMDkyXHU1MjA2XHU2NzkwXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiMDJjYWUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMDAwRSAtIElVUEUwMDk5RQ0KLSMNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0Q29uZmlnV2l6YXJkX3RpdGxlPVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWFkNmNcdWMxMzEgXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGU9XHViMGI0XHViY2Y0XHViMGI0XHVhZTMwIFx1YzcyMFx1ZDYxNSBcdWMxMjBcdWQwZGQNCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVx1YjBiNFx1YmNmNFx1YjBiYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVhZDZjXHVjMTMxIFx1YzcyMFx1ZDYxNVx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnTGFiZWxfdGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVhY2ZjIFx1ZDU3NFx1YjJmOVx1ZDU1OFx1YjI5NCBcdWJhYThcdWI0ZTAgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzANCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdTcGVjc0xhYmVsX3RleHQ9XHVkNTU4XHViMDk4IFx1Yzc3NFx1YzBjMVx1Yzc1OCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxIFx1YzJhNFx1ZDM5OSBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzANCi1zZWxlY3RDb25maWdQYWdlX3RpdGxlPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzEgXHVjMTIwXHVkMGRkDQotc2VsZWN0Q29uZmlnUGFnZV9kZXNjPVx1YjBiNFx1YmNmNFx1YjBiYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gXHVjMTIwXHVkMGRkXHVkNTVjIFx1YWQ2Y1x1YzEzMVx1Yzc1OCBcdWJhYThcdWI0ZTAgXHVjYzM4XHVjODcwXHViNDFjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NzQgXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwXHVjNWQwIFx1ZDNlY1x1ZDU2OFx1YjQyOVx1YjJjOFx1YjJlNC4NCi1zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzE6DQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX3RpdGxlPVx1YWQ2Y1x1YzEzMSBcdWMyYTRcdWQzOTkgXHVjMTIwXHVkMGRkDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2M9XHViMGI0XHViY2Y0XHViMGJjIFx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMSBcdWMyYTRcdWQzOTlcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxOg0KLWNoZWNrQ29uZmlnUGFnZV90aXRsZT1cdWFkNmNcdWMxMzEgXHVjNjI0XHViOTU4IFx1YWM4MFx1ZDFhMA0KLWNoZWNrQ29uZmlnUGFnZV9kZXNjPVx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJiMzRcdWFjYjBcdWMxMzEgXHVhYzgwXHVjMGFjXHVhYzAwIFx1YzIxOFx1ZDU4OVx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNjI0XHViOTU4IFx1YmNmNFx1YWNlMFx1YzExY1x1Yjk3YyBcdWFjODBcdWQxYTBcdWQ1NThcdWFjZTAgXHVkNTQ0XHVjNjk0XHVkNTVjIFx1YzIxOFx1YzgxNSBcdWM4NzBcdWNlNThcdWI5N2MgXHVjMjE4XHVkNTg5XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV90aXRsZT1cdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHViNTE0XHViODA5XHVkMWEwXHViOWFjIFx1YzljMFx1YzgxNQ0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV9kZXNjPVx1YjBiNFx1YmNmNFx1YjBiNFx1YjI5NCBcdWFkNmNcdWMxMzFcdWM3NDQgXHVjODAwXHVjN2E1XHVkNTYwIFx1YjMwMFx1YzBjMSBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWNcdWI5N2MgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgRXhwb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1leHBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzggXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwDQotc2VsZWN0UGx1Z2luc1BhZ2VfdGl0bGU9XHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWMxMjBcdWQwZGQNCi1zZWxlY3RQbHVnaW5zUGFnZV9kZXNjPVx1YjBiNFx1YmNmNFx1YjBiYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzQ0IFx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzEgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3Nzg6DQotcmV2aWV3UGx1Z2luc1BhZ2VfdGl0bGU9XHVjODg1XHVjMThkXHVjMTMxIFx1YWM4MFx1ZDFhMA0KLXJldmlld1BsdWdpbnNQYWdlX2Rlc2M9XHVjODg1XHVjMThkXHVjMTMxXHVjNzQ0IFx1YWM4MFx1ZDFhMFx1ZDU2MCBcdWFjMDEgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuIFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMFx1YzVkMCBcdWQzZWNcdWQ1NjhcdWQ1NzRcdWM1N2MgXHVkNTYwIFx1Yzg4NVx1YzE4ZFx1YzgwMSBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHViODI0XHViYTc0IFx1Yzc3NFx1YzgwNFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcmV2aWV3UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3ODoNCi1yZXZpZXdQbHVnaW5zUGFnZV9kZXBlbmRlbnRQbHVnaW5zTGFiZWxfdGV4dD1cdWM4ODVcdWMxOGRcdWM4MDEgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3ODoNCi1yZXZpZXdQbHVnaW5zUGFnZV9hc3NvY2lhdGVkQ29uZmlnc0xhYmVsX3RleHQ9XHVjNWYwXHVhZDAwXHViNDFjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzE6DQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfdGl0bGU9XHViMGI0XHViY2Y0XHViMGI0XHVhZTMwIFx1ZDY1NVx1Yzc3OA0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX2Rlc2M9XHViMGI0XHViY2Y0XHViMGJjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVkNjU1XHVjNzc4XHVkNTY5XHViMmM4XHViMmU0Lg0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX25vUGx1Z2luX3RleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNTU4XHVjMmI1XHViMmM4XHViMmU0Lg0KLXNwZWNpZnlQYXRoUGFnZV90aXRsZT1cdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHViNTE0XHViODA5XHVkMWEwXHViOWFjIFx1YzljMFx1YzgxNQ0KLXNwZWNpZnlQYXRoUGFnZV9kZXNjPVx1YjBiNFx1YmNmNFx1YjBiNFx1YjI5NCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzQ0IFx1YzgwMFx1YzdhNVx1ZDU2MCBcdWIzMDBcdWMwYzEgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1TYXZlUGx1Z2luUGFnZV9kZXNjPVx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWFjZmMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzljMFx1YzgxNVx1YjQxYyBcdWIzMDBcdWMwYzEgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHViODVjIFx1YjBiNFx1YmNmNFx1YjBjNVx1YjJjOFx1YjJlNC4NCi1FeHBvcnRQbHVnaW5XaXphcmRfdGl0bGU9XHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHViOWM4XHViYzk1XHVjMGFjIFx1YzYyNFx1Yjk1OA0KLUV4cG9ydFBsdWdpbkVycm9yX21zZz1JVVBFMDAwMEU6IFx1YjBiNFx1YmNmNFx1YjBiNFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YWQ2Y1x1YzEzMSBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzANCi1leHBvcnRDb25maWdFcnJvckRpYWxvZ19tc2c9SVVQRTAwMDFFOiBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHVjODcwXHVjNzkxXHVjNzQ0IFx1YzljNFx1ZDU4OVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1hbmFseXppbmdDb25maWdUYXNrX25hbWU9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YWQ2Y1x1YzEzMSBcdWJkODRcdWMxMWQgXHVjOTExLi4uDQotDQotIyBUaGUgZm9sbG93aW5nIG1lc3NhZ2VzIGhhdmUgbm90IGJlZW4gcmV2aWV3ZWQuDQotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cwPVx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWIwYjRcdWJjZjRcdWIwYjRcdWIyOTQgXHVjOTExLi4uDQotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cxPVx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMFx1YWMwMCBcdWM2NDRcdWI4Y2NcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMT1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVhZDZjXHVjMTMxXHVjNzU4IFx1YmIzNFx1YWNiMFx1YzEzMVx1Yzc0NCBcdWFjODBcdWMwYWNcdWQ1NThcdWIyOTQgXHVjOTExLi4uXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8yPVx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNTU4XHVjMmI1XHViMmM4XHViMmU0LlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMz1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVhZDZjXHVjMTMxXHVjNWQwIFx1YmIzOFx1YzgxY1x1YWMwMCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV80PVx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWFkNmNcdWMxMzFcdWM1ZDAgezB9IFx1YmIzOFx1YzgxY1x1YzgxMFx1Yzc3NCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuXG5cdWFkNmNcdWMxMzEgXHVkM2I4XHVjOWQxXHVhZTMwXHViOTdjIFx1YzVmNFx1YWNlMCBcdWM3NzQgXHViYjM4XHVjODFjXHVjODEwXHVjNzQ0IFx1YzIxOFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LlxuXHViNjEwXHViMjk0IFx1Yzc3NCBcdWJiMzhcdWM4MWNcdWM4MTBcdWM3NDQgXHViYjM0XHVjMmRjXHVkNTU4XHVhY2UwIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YjNjNFx1Yjg1ZCBcdWMxMjBcdWQwZGRcdWQ1NjAgXHVjMjE4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2VfY2hlY2tpbmc9XHVhZDZjXHVjMTMxXHVjNzQ0IFx1YWM4MFx1YzBhY1x1ZDU1OFx1YjI5NCBcdWM5MTFcdWM3ODVcdWIyYzhcdWIyZTQuIFx1YWUzMFx1YjJlNFx1YjlhY1x1YzJlZFx1YzJkY1x1YzYyNC4NCi1FeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlX3RpdGxlPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzEgXHVjMTIwXHVkMGRkDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Jyb3dzZT1cdWNjM2VcdWM1NDRcdWJjZjRcdWFlMzAuLi4NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGVmYXVsdF9kaXI9XHVhZTMwXHViY2Y4IFx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhYyBcdWMwYWNcdWM2YTkNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwPVx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWIwYjRcdWJjZjRcdWIwYjRcdWIyOTQgXHVjOTExLi4uDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMj1JVVBFMDAwMkU6IFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMCBcdWMyZTRcdWQzMjg6IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWI4NWNcdWI0ZGNcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHND1JVVBFMDAwM0U6IFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMCBcdWMyZTRcdWQzMjg6IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWJjZjVcdWMwYWNcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMT1JVVBFMDAwNEU6IFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMCBcdWMyZTRcdWQzMjg6IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWFkNmNcdWMxMzFcdWM3NDQgXHViMmViXHViMjk0IFx1YzkxMVx1YzVkMCBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzk9SVVQRTAwMDVFOiBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHVjMmU0XHVkMzI4OiBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjODAwXHVjN2E1XHVkNTU4XHViMjk0IFx1YzkxMVx1YzVkMCBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPVx1Yzc3NFx1Yjk4NDoNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGlyPVx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhYzoNCi1FeHBvcnRQbHVnaW5XaXphcmRfZXJyb3I9XHVjNjI0XHViOTU4DQotRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlPVx1YWUzMFx1YmNmOCBcdWM4MWNcdWJhYTkNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYz1cdWFlMzBcdWJjZjggXHVjMTI0XHViYTg1Og0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMD1cdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHViMGI0XHViY2Y0XHViMGI0XHViMjk0IFx1YzkxMS4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMT1cdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHViOTdjIFx1Yzc5MVx1YzEzMVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzI9XHVkMzBjXHVjNzdjXHVjNzQ0IFx1YmNmNVx1YzBhY1x1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzM9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YmMwZiBcdWM3OTBcdWM2ZDAgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzBkZFx1YzEzMVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzQ9XHViMGI0XHViY2Y0XHViMGI0XHVhZTMwXHVhYzAwIFx1YzY0NFx1YjhjY1x1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1TYXZlTGlicmFyeVBhZ2VfdGl0bGU9XHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzANCi1TYXZlUGx1Z2luUGFnZV9sYWJlbF9uYW1lPVx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMCBcdWM3NzRcdWI5ODQ6DQotU2F2ZUxpYnJhcnlQYWdlX2Rlc2M9XHVjMTIwXHVkMGRkXHVkNTVjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzggXHViYzBmIFx1YzVmMFx1YWQwMFx1YjQxYyBcdWFkNmNcdWMxMzFcdWM3NDQgXHViMGI0XHViY2Y0XHViMGM1XHViMmM4XHViMmU0Lg0KLUV4cG9ydFBsdWdpbldpemFyZF9NU0cxPVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWFkNmNcdWMxMzEgXHViZDg0XHVjMTFkIFx1YzkxMS4uLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNGRlNjk5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBFMDAwMEUgLSBJVVBFMDA5OUUNCi0jDQotDQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWV4cG9ydENvbmZpZ1dpemFyZF90aXRsZT1FeHBvcnRhciBDb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIEJpYmxpb3RlY2ENCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZT1TZWxlY2lvbmFyIHRpcG8gZGUgZXhwb3J0YVx1MDBlN1x1MDBlM28NCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVNlbGVjaW9uZSBvIHRpcG8gZGUgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBiaWJsaW90ZWNhIGEgc2VyIGV4cG9ydGFkYS4NCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0PUV4cG9ydGFyIHVtYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvIGUgdG9kb3Mgb3Mgc2V1cyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbw0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ1NwZWNzTGFiZWxfdGV4dD1FeHBvcnRhciB1bWEgb3UgbWFpcyBlc3BlY2lmaWNhXHUwMGU3XHUwMGY1ZXMgZGUgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBtXHUwMGU5dG9kbw0KLXNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9U2VsZWNpb25hciBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvDQotc2VsZWN0Q29uZmlnUGFnZV9kZXNjPVNlbGVjaW9uZSB1bWEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBtXHUwMGU5dG9kbyBwYXJhIGV4cG9ydGFyLiBUb2RvcyBvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbyByZWZlcmVuY2lhZG9zIG5hIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gc2VsZWNpb25hZGEgc2VyXHUwMGUzbyBpbmNsdVx1MDBlZGRvcyBuYSBleHBvcnRhXHUwMGU3XHUwMGUzby4NCi1zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PUNvbmZpZ3VyYVx1MDBlN1x1MDBmNWVzIGRlIG1cdTAwZTl0b2RvOg0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV90aXRsZT1TZWxlY2lvbmFyIGVzcGVjaWZpY2FcdTAwZTdcdTAwZjVlcyBkZSBjb25maWd1cmFcdTAwZTdcdTAwZTNvDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2M9U2VsZWNpb25lIHVtYSBvdSBtYWlzIGNvbmZpZ3VyYVx1MDBlN1x1MDBmNWVzIGRlIG1cdTAwZTl0b2RvIHBhcmEgZXhwb3J0YVx1MDBlN1x1MDBlM28uDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PUNvbmZpZ3VyYVx1MDBlN1x1MDBmNWVzIGRlIG1cdTAwZTl0b2RvOg0KLWNoZWNrQ29uZmlnUGFnZV90aXRsZT1SZXZpc2FyIGVycm9zIGRlIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi1jaGVja0NvbmZpZ1BhZ2VfZGVzYz1VbWEgdmVyaWZpY2FcdTAwZTdcdTAwZTNvIGRlIGludGVncmlkYWRlIGZvaSBleGVjdXRhZGEgbmEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBtXHUwMGU5dG9kbyBzZWxlY2lvbmFkYS4gUmV2aXNlIG8gcmVsYXRcdTAwZjNyaW8gZGUgZXJyb3MgZSBleGVjdXRlIGFzIGFcdTAwZTdcdTAwZjVlcyBjb3JyZXRpdmFzIG5lY2Vzc1x1MDBlMXJpYXMuDQotc2VsZWN0RGVzdGluYXRpb25QYWdlX3RpdGxlPUVzcGVjaWZpY2FyIGRpcmV0XHUwMGYzcmlvIGRlIGV4cG9ydGFcdTAwZTdcdTAwZTNvDQotc2VsZWN0RGVzdGluYXRpb25QYWdlX2Rlc2M9RXNwZWNpZmlxdWUgdW0gZGlyZXRcdTAwZjNyaW8gZGUgZGVzdGlubyBwYXJhIGFybWF6ZW5hciBhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZXhwb3J0YWRhLg0KLQ0KLSMgRXhwb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1leHBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPUV4cG9ydGFyIFBsdWctaW5zIGRlIE1cdTAwZTl0b2RvDQotc2VsZWN0UGx1Z2luc1BhZ2VfdGl0bGU9U2VsZWNpb25hciBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbw0KLXNlbGVjdFBsdWdpbnNQYWdlX2Rlc2M9U2VsZWNpb25lIHVtIG91IG1haXMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8gcGFyYSBleHBvcnRhXHUwMGU3XHUwMGUzby4NCi1zZWxlY3RQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dD1QbHVnLWlucyBkZSBtXHUwMGU5dG9kbzoNCi1yZXZpZXdQbHVnaW5zUGFnZV90aXRsZT1SZXZpc2FyIGRlcGVuZFx1MDBlYW5jaWFzDQotcmV2aWV3UGx1Z2luc1BhZ2VfZGVzYz1TZWxlY2lvbmUgY2FkYSBwbHVnLWluIGRlIG1cdTAwZTl0b2RvIHBhcmEgcmV2aXNhciBzdWFzIGRlcGVuZFx1MDBlYW5jaWFzLiBDbGlxdWUgZW0gVm9sdGFyIHBhcmEgc2VsZWNpb25hciBvcyBwbHVnLWlucyBkZXBlbmRlbnRlcyBzZSBlbGVzIHByZWNpc2FyZW0gc2VyIGluY2x1XHUwMGVkZG9zIG5hIGV4cG9ydGFcdTAwZTdcdTAwZTNvLg0KLXJldmlld1BsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PVBsdWctaW5zIGRlIE1cdTAwZTl0b2RvOg0KLXJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0PVBsdWctaW5zIGRlIG1cdTAwZTl0b2RvIGRlcGVuZGVudGVzOg0KLXJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dD1Db25maWd1cmFcdTAwZTdcdTAwZjVlcyBkZSBtXHUwMGU5dG9kbyBhc3NvY2lhZGFzOg0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX3RpdGxlPUNvbmZpcm1hciBleHBvcnRhXHUwMGU3XHUwMGUzbw0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX2Rlc2M9Q29uZmlybWUgb3MgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8gcXVlIHNlclx1MDBlM28gZXhwb3J0YWRvcy4NCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9ub1BsdWdpbl90ZXh0PU5lbmh1bSBwbHVnLWluIGRlIG1cdTAwZTl0b2RvIGZvaSBzZWxlY2lvbmFkby4NCi1zcGVjaWZ5UGF0aFBhZ2VfdGl0bGU9RXNwZWNpZmljYXIgZGlyZXRcdTAwZjNyaW8gZGUgZXhwb3J0YVx1MDBlN1x1MDBlM28NCi1zcGVjaWZ5UGF0aFBhZ2VfZGVzYz1Fc3BlY2lmaXF1ZSB1bSBkaXJldFx1MDBmM3JpbyBkZSBkZXN0aW5vIHBhcmEgYXJtYXplbmFyIG9zIHBsdWctaW5zIGRlIG1cdTAwZTl0b2RvIGV4cG9ydGFkb3MuDQotU2F2ZVBsdWdpblBhZ2VfZGVzYz1FeHBvcnRlIG9zIFBsdWctaW5zIGUgYXMgQ29uZmlndXJhXHUwMGU3XHUwMGY1ZXMgc2VsZWNpb25hZG9zIHBhcmEgbyBkaXJldFx1MDBmM3JpbyBkZSBkZXN0aW5vIGVzcGVjaWZpY2Fkby4NCi1FeHBvcnRQbHVnaW5XaXphcmRfdGl0bGU9RXJybyBkbyBBc3Npc3RlbnRlIGRlIEV4cG9ydGFcdTAwZTdcdTAwZTNvIGRlIFBsdWctaW4gZGUgTVx1MDBlOXRvZG8NCi1FeHBvcnRQbHVnaW5FcnJvcl9tc2c9SVVQRTAwMDBFOiBFcnJvIGVuY29udHJhZG8gbmEgZXhwb3J0YVx1MDBlN1x1MDBlM28NCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9RXhwb3J0YXIgQ29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBCaWJsaW90ZWNhDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfbXNnPUlVUEUwMDAxRTogTlx1MDBlM28gXHUwMGU5IHBvc3NcdTAwZWR2ZWwgcHJvc3NlZ3VpciBhIG9wZXJhXHUwMGU3XHUwMGUzbyBkZSBleHBvcnRhXHUwMGU3XHUwMGUzby4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotYW5hbHl6aW5nQ29uZmlnVGFza19uYW1lPUFuYWxpc2FuZG8gYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRhIGJpYmxpb3RlY2EuLi4NCi0NCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzA9RXhwb3J0YW5kbyBjb25maWd1cmFcdTAwZTdcdTAwZTNvLi4uDQotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cxPUV4cG9ydGFcdTAwZTdcdTAwZTNvIGNvbmNsdVx1MDBlZGRhLg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzE9VmVyaWZpY2FuZG8gYSBpbnRlZ3JpZGFkZSBkYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHNlbGVjaW9uYWRhLi4uXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8yPU5lbmh1bWEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBzZWxlY2lvbmFkYS5cbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzM9Tlx1MDBlM28gZXhpc3RlIG5lbmh1bSBwcm9ibGVtYSBuYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHNlbGVjaW9uYWRhLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfND1FeGlzdGVtIHswfSBwcm9ibGVtYXMgbmEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBzZWxlY2lvbmFkYS4gXG5BYnJhIG8gZWRpdG9yIGRlIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZSBjb3JyaWphIGVzc2VzIHByb2JsZW1hcy4gXG5PdSBvcHRlIHBvciBpZ25vcmFyIGVzc2VzIHByb2JsZW1hcyBlIGNvbnRpbnVhci4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2VfY2hlY2tpbmc9VmVyaWZpY2FuZG8gYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvLCBhZ3VhcmRlLi4uDQotRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZV90aXRsZT1Fc2NvbGhlciBDb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIE1cdTAwZTl0b2RvDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Jyb3dzZT1Qcm9jdXJhci4uLg0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kZWZhdWx0X2Rpcj1VdGlsaXphciBkaXJldFx1MDBmM3JpbyBwYWRyXHUwMGUzbw0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzA9RXhwb3J0YW5kbyBjb25maWd1cmFcdTAwZTdcdTAwZTNvLi4uDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMj1JVVBFMDAwMkU6IEZhbGhhIG5hIGV4cG9ydGFcdTAwZTdcdTAwZTNvOiBFcnJvIGFvIGNhcnJlZ2FyIGJpYmxpb3RlY2ENCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c0PUlVUEUwMDAzRTogRmFsaGEgbmEgZXhwb3J0YVx1MDBlN1x1MDBlM286IEVycm8gYW8gY29waWFyIGJpYmxpb3RlY2ENCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RTogRmFsaGEgbmEgZXhwb3J0YVx1MDBlN1x1MDBlM286IEVycm8gYW8gZmF6ZXIgbyBmZWNoYW1lbnRvIGRhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGEgYmlibGlvdGVjYQ0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzk9SVVQRTAwMDVFOiBGYWxoYSBuYSBleHBvcnRhXHUwMGU3XHUwMGUzbzogRXJybyBhbyBzYWx2YXIgYmlibGlvdGVjYQ0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPU5vbWU6DQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Rpcj1EaXJldFx1MDBmM3JpbzoNCi1FeHBvcnRQbHVnaW5XaXphcmRfZXJyb3I9RXJybw0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV90aXRsZT1UXHUwMGVkdHVsbyBQYWRyXHUwMGUzbw0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjPURlc2NyaVx1MDBlN1x1MDBlM28gUGFkclx1MDBlM286DQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwPUV4cG9ydGFuZG8gcGx1Zy1pbnMuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE9Q3JpYW5kbyBkaXJldFx1MDBmM3JpbyBkZSBleHBvcnRhXHUwMGU3XHUwMGUzby4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMj1Db3BpYW5kbyBhcnF1aXZvcy4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMz1HZXJhbmRvIGJpYmxpb3RlY2EgZSBhcnF1aXZvIGRlIHJlY3Vyc29zLi4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0c0PUV4cG9ydGFcdTAwZTdcdTAwZTNvIGNvbmNsdVx1MDBlZGRhLg0KLVNhdmVMaWJyYXJ5UGFnZV90aXRsZT1FeHBvcnRhciBQbHVnLWluIGRlIE1cdTAwZTl0b2RvDQotU2F2ZVBsdWdpblBhZ2VfbGFiZWxfbmFtZT1Ob21lIGRhIGV4cG9ydGFcdTAwZTdcdTAwZTNvOg0KLVNhdmVMaWJyYXJ5UGFnZV9kZXNjPUV4cG9ydGUgb3MgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8gc2VsZWNpb25hZG9zIGUgYXMgY29uZmlndXJhXHUwMGU3XHUwMGY1ZXMgYXNzb2NpYWRhcw0KLUV4cG9ydFBsdWdpbldpemFyZF9NU0cxPUFuYWxpc2FuZG8gYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRhIGJpYmxpb3RlY2EuLi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTY1MzVlOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAwMDBFIC0gSVVQRTAwOTlFDQotIw0KLQ0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1leHBvcnRDb25maWdXaXphcmRfdGl0bGU9XHU1YmZjXHU1MWZhXHU1ZTkzXHU5MTRkXHU3ZjZlDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGU9XHU5MDA5XHU2MmU5XHU1YmZjXHU1MWZhXHU3YzdiXHU1NzhiDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1cdTkwMDlcdTYyZTlcdTg5ODFcdTViZmNcdTUxZmFcdTc2ODRcdTVlOTNcdTkxNGRcdTdmNmVcdTdjN2JcdTU3OGJcdTMwMDINCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0PVx1NWJmY1x1NTFmYVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1NTNjYVx1NTE3Nlx1NjI0MFx1NjcwOVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ1NwZWNzTGFiZWxfdGV4dD1cdTViZmNcdTUxZmFcdTRlMDBcdTRlMmFcdTYyMTZcdTU5MWFcdTRlMmFcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTg5YzRcdTgzMDMNCi1zZWxlY3RDb25maWdQYWdlX3RpdGxlPVx1OTAwOVx1NjJlOVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLXNlbGVjdENvbmZpZ1BhZ2VfZGVzYz1cdTkwMDlcdTYyZTlcdTg5ODFcdTViZmNcdTUxZmFcdTc2ODRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDJcdThiZTVcdTViZmNcdTUxZmFcdTVjMDZcdTUzMDVcdTU0MmJcdTkwMDlcdTViOWFcdTkxNGRcdTdmNmVcdTRlMmRcdTYyNDBcdTY3MDlcdTVmMTVcdTc1MjhcdTc2ODRcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjZcdTMwMDINCi1zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ZmYxYQ0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV90aXRsZT1cdTkwMDlcdTYyZTlcdTkxNGRcdTdmNmVcdTg5YzRcdTgzMDMNCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfZGVzYz1cdTkwMDlcdTYyZTlcdTg5ODFcdTViZmNcdTUxZmFcdTc2ODRcdTRlMDBcdTRlMmFcdTYyMTZcdTU5MWFcdTRlMmFcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTg5YzRcdTgzMDNcdTMwMDINCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ9XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHVmZjFhDQotY2hlY2tDb25maWdQYWdlX3RpdGxlPVx1NjhjMFx1NjdlNVx1OTE0ZFx1N2Y2ZVx1OTUxOVx1OGJlZg0KLWNoZWNrQ29uZmlnUGFnZV9kZXNjPVx1NWRmMlx1NWJmOVx1OTAwOVx1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1NjI2N1x1ODg0Y1x1NWI4Y1x1NjU3NFx1NjAyN1x1NjhjMFx1NjdlNVx1MzAwMlx1OGJmN1x1OTYwNVx1OGJmYlx1OTUxOVx1OGJlZlx1NjJhNVx1NTQ0YVx1ZmYwY1x1NzEzNlx1NTQwZVx1NjI2N1x1ODg0Y1x1NWZjNVx1ODk4MVx1NzY4NFx1NjZmNFx1NmI2M1x1NjRjZFx1NGY1Y1x1MzAwMg0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV90aXRsZT1cdTYzMDdcdTViOWFcdTViZmNcdTUxZmFcdTc2ZWVcdTVmNTUNCi1zZWxlY3REZXN0aW5hdGlvblBhZ2VfZGVzYz1cdTYzMDdcdTViOWFcdTViNThcdTUwYThcdTViZmNcdTUxZmFcdTkxNGRcdTdmNmVcdTc2ODRcdTc2ZWVcdTY4MDdcdTc2ZWVcdTVmNTVcdTMwMDINCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0UGx1Z2luc1dpemFyZF90aXRsZT1cdTViZmNcdTUxZmFcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi1zZWxlY3RQbHVnaW5zUGFnZV90aXRsZT1cdTkwMDlcdTYyZTlcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi1zZWxlY3RQbHVnaW5zUGFnZV9kZXNjPVx1OTAwOVx1NjJlOVx1ODk4MVx1NWJmY1x1NTFmYVx1NzY4NFx1NGUwMFx1NGUyYVx1NjIxNlx1NTkxYVx1NGUyYVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNlx1MzAwMg0KLXNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNlx1ZmYxYQ0KLXJldmlld1BsdWdpbnNQYWdlX3RpdGxlPVx1NjhjMFx1NjdlNVx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYg0KLXJldmlld1BsdWdpbnNQYWdlX2Rlc2M9XHU5MDA5XHU2MmU5XHU2YmNmXHU0ZTJhXHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHVmZjBjXHU2N2U1XHU3NzBiXHU1MTc2XHU0ZjlkXHU4ZDU2XHU1MTczXHU3Y2ZiXHUzMDAyXHU1OTgyXHU2NzljXHU1YmZjXHU1MWZhXHU0ZTJkXHU1ZmM1XHU5ODdiXHU1MzA1XHU1NDJiXHU0ZjlkXHU4ZDU2XHU2M2QyXHU0ZWY2XHVmZjBjXHU4YmY3XHU1MzU1XHU1MWZiXHUyMDFjXHU0ZTBhXHU0ZTAwXHU2YjY1XHUyMDFkXHU5MDA5XHU2MmU5XHU0ZjlkXHU4ZDU2XHU2M2QyXHU0ZWY2XHUzMDAyDQotcmV2aWV3UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHVmZjFhDQotcmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQ9XHU0ZjlkXHU4ZDU2XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHVmZjFhDQotcmV2aWV3UGx1Z2luc1BhZ2VfYXNzb2NpYXRlZENvbmZpZ3NMYWJlbF90ZXh0PVx1NTE3M1x1ODA1NFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ZmYxYQ0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX3RpdGxlPVx1Nzg2ZVx1OGJhNFx1NWJmY1x1NTFmYQ0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX2Rlc2M9XHU3ODZlXHU4YmE0XHU1YzA2XHU1YmZjXHU1MWZhXHU3Njg0XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHUzMDAyDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2Vfbm9QbHVnaW5fdGV4dD1cdTY3MmFcdTkwMDlcdTYyZTlcdTRlZmJcdTRmNTVcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjZcdTMwMDINCi1zcGVjaWZ5UGF0aFBhZ2VfdGl0bGU9XHU2MzA3XHU1YjlhXHU1YmZjXHU1MWZhXHU3NmVlXHU1ZjU1DQotc3BlY2lmeVBhdGhQYWdlX2Rlc2M9XHU2MzA3XHU1YjlhXHU1YjU4XHU1MGE4XHU1YmZjXHU1MWZhXHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHU3Njg0XHU3NmVlXHU2ODA3XHU3NmVlXHU1ZjU1XHUzMDAyDQotU2F2ZVBsdWdpblBhZ2VfZGVzYz1cdTVjMDZcdTkwMDlcdTViOWFcdTc2ODRcdTYzZDJcdTRlZjZcdTU0OGNcdTkxNGRcdTdmNmVcdTViZmNcdTUxZmFcdTUyMzBcdTYzMDdcdTViOWFcdTc2ZWVcdTY4MDdcdTc2ZWVcdTVmNTVcdTMwMDINCi1FeHBvcnRQbHVnaW5XaXphcmRfdGl0bGU9XHU1YmZjXHU1MWZhXHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHU1NDExXHU1YmZjXHU5NTE5XHU4YmVmDQotRXhwb3J0UGx1Z2luRXJyb3JfbXNnPUlVUEUwMDAwRTogXHU1YmZjXHU1MWZhXHU2NWY2XHU1M2QxXHU3NTFmXHU5NTE5XHU4YmVmDQotDQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIEVycm9yIERpYWxvZw0KLWV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPVx1NWJmY1x1NTFmYVx1NWU5M1x1OTE0ZFx1N2Y2ZQ0KLWV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX21zZz1JVVBFMDAwMUU6IFx1NWJmY1x1NTFmYVx1NjRjZFx1NGY1Y1x1NjVlMFx1NmNkNVx1N2VlN1x1N2VlZFx1MzAwMg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1hbmFseXppbmdDb25maWdUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU1MjA2XHU2NzkwXHU1ZTkzXHU5MTRkXHU3ZjZlLi4uDQotDQotIyBUaGUgZm9sbG93aW5nIG1lc3NhZ2VzIGhhdmUgbm90IGJlZW4gcmV2aWV3ZWQuDQotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cwPVx1NmI2M1x1NTcyOFx1NWJmY1x1NTFmYVx1OTE0ZFx1N2Y2ZS4uLg0KLUNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMT1cdTViZmNcdTUxZmFcdTViOGNcdTYyMTBcdTMwMDINCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8xPVx1NmI2M1x1NTcyOFx1NjhjMFx1NjdlNVx1OTAwOVx1NWI5YVx1OTE0ZFx1N2Y2ZVx1NzY4NFx1NWI4Y1x1NjU3NFx1NjAyNy4uLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMj1cdTY3MmFcdTkwMDlcdTYyZTlcdTRlZmJcdTRmNTVcdTkxNGRcdTdmNmVcdTMwMDJcbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzM9XHU5MDA5XHU1YjlhXHU3Njg0XHU5MTRkXHU3ZjZlXHU0ZTJkXHU2NWUwXHU0ZWZiXHU0ZjU1XHU5NWVlXHU5ODk4XHUzMDAyXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV80PVx1OTAwOVx1NWI5YVx1NzY4NFx1OTE0ZFx1N2Y2ZVx1NGUyZFx1NjcwOSB7MH0gXHU0ZTJhXHU5NWVlXHU5ODk4XHUzMDAyXG5cdTYwYThcdTUzZWZcdTRlZTVcdTYyNTNcdTVmMDBcdTkxNGRcdTdmNmVcdTdmMTZcdThmOTFcdTU2NjhcdWZmMGNcdTRmZWVcdTU5MGRcdThmZDlcdTRlOWJcdTk1ZWVcdTk4OThcdTMwMDJcblx1NGU1Zlx1NTNlZlx1NGVlNVx1OTAwOVx1NjJlOVx1NWZmZFx1NzU2NVx1OGZkOVx1NGU5Ylx1OTVlZVx1OTg5OFx1NWU3Nlx1N2VlN1x1N2VlZFx1NjRjZFx1NGY1Y1x1MzAwMg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9jaGVja2luZz1cdTZiNjNcdTU3MjhcdTY4YzBcdTY3ZTVcdTkxNGRcdTdmNmVcdWZmMGNcdThiZjdcdTdhMGRcdTUwMTkuLi4NCi1FeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlX3RpdGxlPVx1OTAwOVx1NjJlOVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9icm93c2U9XHU2ZDRmXHU4OWM4Li4uDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RlZmF1bHRfZGlyPVx1NGY3Zlx1NzUyOFx1N2YzYVx1NzcwMVx1NzZlZVx1NWY1NQ0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzA9XHU2YjYzXHU1NzI4XHU1YmZjXHU1MWZhXHU5MTRkXHU3ZjZlLi4uDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMj1JVVBFMDAwMkU6IFx1NWJmY1x1NTFmYVx1NTkzMVx1OGQyNVx1ZmYxYVx1ODhjNVx1NTE2NVx1NWU5M1x1NjVmNlx1NTFmYVx1OTUxOQ0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzQ9SVVQRTAwMDNFOiBcdTViZmNcdTUxZmFcdTU5MzFcdThkMjVcdWZmMWFcdTU5MGRcdTUyMzZcdTVlOTNcdTY1ZjZcdTUxZmFcdTk1MTkNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RTogXHU1YmZjXHU1MWZhXHU1OTMxXHU4ZDI1XHVmZjFhXHU3ZWQzXHU2NzVmXHU1ZTkzXHU5MTRkXHU3ZjZlXHU2NWY2XHU1MWZhXHU5NTE5DQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHOT1JVVBFMDAwNUU6IFx1NWJmY1x1NTFmYVx1NTkzMVx1OGQyNVx1ZmYxYVx1NGZkZFx1NWI1OFx1NWU5M1x1NjVmNlx1NTFmYVx1OTUxOQ0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPVx1NTQwZFx1NzlmMFx1ZmYxYQ0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kaXI9XHU3NmVlXHU1ZjU1XHVmZjFhDQotRXhwb3J0UGx1Z2luV2l6YXJkX2Vycm9yPVx1OTUxOVx1OGJlZg0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV90aXRsZT1cdTdmM2FcdTc3MDFcdTY4MDdcdTk4OTgNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYz1cdTdmM2FcdTc3MDFcdTYzY2ZcdThmZjBcdWZmMWENCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzA9XHU2YjYzXHU1NzI4XHU1YmZjXHU1MWZhXHU2M2QyXHU0ZWY2Li4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cxPVx1NmI2M1x1NTcyOFx1NTIxYlx1NWVmYVx1NWJmY1x1NTFmYVx1NzZlZVx1NWY1NS4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMj1cdTZiNjNcdTU3MjhcdTU5MGRcdTUyMzZcdTY1ODdcdTRlZjYuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzM9XHU2YjYzXHU1NzI4XHU3NTFmXHU2MjEwXHU1ZTkzXHU1NDhjXHU4ZDQ0XHU2ZTkwXHU2NTg3XHU0ZWY2Li4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0c0PVx1NWJmY1x1NTFmYVx1NWI4Y1x1NjIxMFx1MzAwMg0KLVNhdmVMaWJyYXJ5UGFnZV90aXRsZT1cdTViZmNcdTUxZmFcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi1TYXZlUGx1Z2luUGFnZV9sYWJlbF9uYW1lPVx1NWJmY1x1NTFmYVx1NTQwZFx1NzlmMFx1ZmYxYQ0KLVNhdmVMaWJyYXJ5UGFnZV9kZXNjPVx1NWJmY1x1NTFmYVx1OTAwOVx1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNlx1NTQ4Y1x1NTE3M1x1ODA1NFx1OTE0ZFx1N2Y2ZQ0KLUV4cG9ydFBsdWdpbldpemFyZF9NU0cxPVx1NmI2M1x1NTcyOFx1NTIwNlx1Njc5MFx1NWU5M1x1OTE0ZFx1N2Y2ZS4uLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYWU1MjllLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBFMDAwMEUgLSBJVVBFMDA5OUUNCi0jDQotDQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWV4cG9ydENvbmZpZ1dpemFyZF90aXRsZT1cdTUzMmZcdTUxZmFcdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmUNCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZT1cdTkwNzhcdTUzZDZcdTUzMmZcdTUxZmFcdTk4NWVcdTU3OGINCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVx1OTA3OFx1NTNkNlx1ODk4MVx1NTMyZlx1NTFmYVx1NzY4NFx1N2EwYlx1NWYwZlx1NWVhYlx1OTE0ZFx1N2Y2ZVx1OTg1ZVx1NTc4Ylx1MzAwMg0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ0xhYmVsX3RleHQ9XHU1MzJmXHU1MWZhXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHU1M2NhXHU1MTc2XHU2MjQwXHU2NzA5XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnU3BlY3NMYWJlbF90ZXh0PVx1NTMyZlx1NTFmYVx1NGUwMFx1NjIxNlx1NTkxYVx1NTAwYlx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ODk4Zlx1NjgzYw0KLXNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHU5MDc4XHU1M2Q2XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotc2VsZWN0Q29uZmlnUGFnZV9kZXNjPVx1OTA3OFx1NTNkNlx1ODk4MVx1NTMyZlx1NTFmYVx1NzY4NFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1MzAwMlx1NTcyOFx1OTA3OFx1NTNkNlx1NzY4NFx1OTE0ZFx1N2Y2ZVx1NGUyZFx1NTNjM1x1NzE2N1x1NzY4NFx1NjI0MFx1NjcwOVx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1OTBmZFx1NWMwN1x1NTMyZlx1NTFmYVx1MzAwMg0KLXNlbGVjdENvbmZpZ1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ9XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHVmZjFhDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX3RpdGxlPVx1OTA3OFx1NTNkNlx1OTE0ZFx1N2Y2ZVx1ODk4Zlx1NjgzYw0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV9kZXNjPVx1OTA3OFx1NTNkNlx1ODk4MVx1NTMyZlx1NTFmYVx1NzY4NFx1NGUwMFx1NjIxNlx1NTkxYVx1NTAwYlx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ODk4Zlx1NjgzY1x1MzAwMg0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dD1cdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdWZmMWENCi1jaGVja0NvbmZpZ1BhZ2VfdGl0bGU9XHU1YmU5XHU2N2U1XHU5MTRkXHU3ZjZlXHU5MzJmXHU4YWE0DQotY2hlY2tDb25maWdQYWdlX2Rlc2M9XHU5MDc4XHU1M2Q2XHU3Njg0XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHU0ZTBhXHU1ZGYyXHU1N2Y3XHU4ODRjXHU1YjhjXHU2NTc0XHU2MDI3XHU2YWEyXHU2N2U1XHUzMDAyXHU4YWNiXHU1YmU5XHU2N2U1XHU5MzJmXHU4YWE0XHU1ODMxXHU1NDRhXHVmZjBjXHU0ZTI2XHU2M2ExXHU1M2Q2XHU1ZmM1XHU4OTgxXHU3Njg0XHU2NmY0XHU2YjYzXHU1MmQ1XHU0ZjVjXHUzMDAyDQotc2VsZWN0RGVzdGluYXRpb25QYWdlX3RpdGxlPVx1NjMwN1x1NWI5YVx1NTMyZlx1NTFmYVx1NzZlZVx1OTMwNA0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV9kZXNjPVx1NjMwN1x1NWI5YVx1NzZlZVx1NmExOVx1NzZlZVx1OTMwNFx1NGY4Nlx1NTEzMlx1NWI1OFx1NTMyZlx1NTFmYVx1NzY4NFx1OTE0ZFx1N2Y2ZVx1MzAwMg0KLQ0KLSMgRXhwb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1leHBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPVx1NTMyZlx1NTFmYVx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLXNlbGVjdFBsdWdpbnNQYWdlX3RpdGxlPVx1OTA3OFx1NTNkNlx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLXNlbGVjdFBsdWdpbnNQYWdlX2Rlc2M9XHU5MDc4XHU1M2Q2XHU4OTgxXHU1MzJmXHU1MWZhXHU3Njg0XHU0ZTAwXHU2MjE2XHU1OTFhXHU1MDBiXHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHUzMDAyDQotc2VsZWN0UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHVmZjFhDQotcmV2aWV3UGx1Z2luc1BhZ2VfdGl0bGU9XHU1YmU5XHU2N2U1XHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyDQotcmV2aWV3UGx1Z2luc1BhZ2VfZGVzYz1cdTkwNzhcdTUzZDZcdTZiY2ZcdTRlMDBcdTUwMGJcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTRmODZcdTZhYTJcdTg5OTZcdTc2ZjhcdTRmOWRcdTk1ZGNcdTRmYzJcdTMwMDJcdTU5ODJcdTY3OWNcdTY3MDlcdTc2ZjhcdTRmOWRcdTc2ODRcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTVmYzVcdTk4MDhcdTUzMmZcdTUxZmFcdWZmMGNcdThhY2JcdTYzMDlcdTMwMGNcdTRlMGFcdTRlMDBcdTZiNjVcdTMwMGRcdTRmODZcdTkwNzhcdTUzZDZcdTMwMDINCi1yZXZpZXdQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dD1cdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdWZmMWENCi1yZXZpZXdQbHVnaW5zUGFnZV9kZXBlbmRlbnRQbHVnaW5zTGFiZWxfdGV4dD1cdTc2ZjhcdTRmOWRcdTc2ODRcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdWZmMWENCi1yZXZpZXdQbHVnaW5zUGFnZV9hc3NvY2lhdGVkQ29uZmlnc0xhYmVsX3RleHQ9XHU3NmY4XHU5NWRjXHU3Njg0XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHVmZjFhDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfdGl0bGU9XHU3OGJhXHU4YThkXHU1MzJmXHU1MWZhDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfZGVzYz1cdTc4YmFcdThhOGRcdTVjMDdcdTUzMmZcdTUxZmFcdTc2ODRcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTMwMDINCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9ub1BsdWdpbl90ZXh0PVx1NjcyYVx1OTA3OFx1NTNkNlx1NGVmYlx1NGY1NVx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1MzAwMg0KLXNwZWNpZnlQYXRoUGFnZV90aXRsZT1cdTYzMDdcdTViOWFcdTUzMmZcdTUxZmFcdTc2ZWVcdTkzMDQNCi1zcGVjaWZ5UGF0aFBhZ2VfZGVzYz1cdTYzMDdcdTViOWFcdTc2ZWVcdTZhMTlcdTc2ZWVcdTkzMDRcdTRmODZcdTUxMzJcdTViNThcdTUzMmZcdTUxZmFcdTc2ODRcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTMwMDINCi1TYXZlUGx1Z2luUGFnZV9kZXNjPVx1NWMwN1x1OTA3OFx1NTNkNlx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1NTQ4Y1x1OTE0ZFx1N2Y2ZVx1NTMyZlx1NTFmYVx1ODFmM1x1NjMwN1x1NWI5YVx1NzY4NFx1NzZlZVx1NmExOVx1NzZlZVx1OTMwNFx1MzAwMg0KLUV4cG9ydFBsdWdpbldpemFyZF90aXRsZT1cdTUzMmZcdTUxZmFcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTdjYmVcdTk3NDhcdTkzMmZcdThhYTQNCi1FeHBvcnRQbHVnaW5FcnJvcl9tc2c9SVVQRTAwMDBFOiBcdTUzMmZcdTUxZmFcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTQNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9XHU1MzJmXHU1MWZhXHU3YTBiXHU1ZjBmXHU1ZWFiXHU5MTRkXHU3ZjZlDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfbXNnPUlVUEUwMDAxRTogXHU3MTIxXHU2Y2Q1XHU3ZTdjXHU3ZThjXHU1MzJmXHU1MWZhXHU0ZjVjXHU2OTZkXHUzMDAyDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWFuYWx5emluZ0NvbmZpZ1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTUyMDZcdTY3OTBcdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmUuLi4NCi0NCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzA9XHU2YjYzXHU1NzI4XHU1MzJmXHU1MWZhXHU5MTRkXHU3ZjZlLi4uDQotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cxPVx1NTMyZlx1NTFmYVx1NWI4Y1x1NjIxMFx1MzAwMg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzE9XHU2YjYzXHU1NzI4XHU2YWEyXHU2N2U1XHU5MDc4XHU1YjlhXHU5MTRkXHU3ZjZlXHU3Njg0XHU1YjhjXHU2NTc0XHU2MDI3Li4uXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8yPVx1NjcyYVx1OTA3OFx1NTNkNlx1OTE0ZFx1N2Y2ZVx1MzAwMlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMz1cdTkwNzhcdTUzZDZcdTc2ODRcdTkxNGRcdTdmNmVcdTZjOTJcdTY3MDlcdTU1NGZcdTk4NGNcdTMwMDJcbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzQ9XHU5MDc4XHU1M2Q2XHU3Njg0XHU5MTRkXHU3ZjZlXHU2NzA5IHswfSBcdTUwMGJcdTU1NGZcdTk4NGNcdTMwMDJcblx1NjBhOFx1NTNlZlx1NGVlNVx1OTU4Ylx1NTU1Zlx1OTE0ZFx1N2Y2ZVx1N2RlOFx1OGYyZlx1NTY2OFx1ZmYwY1x1NGUyNlx1NGZlZVx1NmI2M1x1OTAxOVx1NGU5Ylx1NTU0Zlx1OTg0Y1x1MzAwMlxuXHU2MjE2XHU4MDA1XHVmZjBjXHU5MDc4XHU2NGM3XHU1ZmZkXHU3NTY1XHU5MDE5XHU0ZTliXHU1NTRmXHU5ODRjXHVmZjBjXHU0ZTI2XHU3ZTdjXHU3ZThjXHU5MDMyXHU4ODRjXHUzMDAyDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX2NoZWNraW5nPVx1NmI2M1x1NTcyOFx1NmFhMlx1NjdlNVx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1OGFjYlx1N2EwZFx1NTAxOS4uLg0KLUV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHU5MDc4XHU2NGM3XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Jyb3dzZT1cdTcwMGZcdTg5YmQuLi4NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGVmYXVsdF9kaXI9XHU0ZjdmXHU3NTI4XHU5ODEwXHU4YTJkXHU3NmVlXHU5MzA0DQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMD1cdTZiNjNcdTU3MjhcdTUzMmZcdTUxZmFcdTkxNGRcdTdmNmUuLi4NCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyPUlVUEUwMDAyRTogXHU1MzJmXHU1MWZhXHU1OTMxXHU2NTU3XHVmZjFhXHU4ZjA5XHU1MTY1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHND1JVVBFMDAwM0U6IFx1NTMyZlx1NTFmYVx1NTkzMVx1NjU1N1x1ZmYxYVx1ODkwN1x1ODhmZFx1N2EwYlx1NWYwZlx1NWVhYlx1NjY0Mlx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNA0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzE9SVVQRTAwMDRFOiBcdTUzMmZcdTUxZmFcdTU5MzFcdTY1NTdcdWZmMWFcdTVlZmFcdTdhY2JcdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmVcdTkwOGFcdTc1NGNcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTQNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c5PUlVUEUwMDA1RTogXHU1MzJmXHU1MWZhXHU1OTMxXHU2NTU3XHVmZjFhXHU1MTMyXHU1YjU4XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX25hbWU9XHU1NDBkXHU3YTMxXHVmZjFhDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Rpcj1cdTc2ZWVcdTkzMDRcdWZmMWENCi1FeHBvcnRQbHVnaW5XaXphcmRfZXJyb3I9XHU5MzJmXHU4YWE0DQotRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlPVx1OTgxMFx1OGEyZFx1NmExOVx1OTg0Yw0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjPVx1OTgxMFx1OGEyZFx1OGFhYVx1NjYwZVx1ZmYxYQ0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMD1cdTZiNjNcdTU3MjhcdTUzMmZcdTUxZmFcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE9XHU2YjYzXHU1NzI4XHU1ZWZhXHU3YWNiXHU1MzJmXHU1MWZhXHU3NmVlXHU5MzA0Li4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyPVx1NmI2M1x1NTcyOFx1ODkwN1x1ODhmZFx1NmE5NFx1Njg0OC4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMz1cdTZiNjNcdTU3MjhcdTc1MjJcdTc1MWZcdTdhMGJcdTVmMGZcdTVlYWJcdTU0OGNcdThjYzdcdTZlOTBcdTZhOTQuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzQ9XHU1MzJmXHU1MWZhXHU1YjhjXHU2MjEwXHUzMDAyDQotU2F2ZUxpYnJhcnlQYWdlX3RpdGxlPVx1NTMyZlx1NTFmYVx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLVNhdmVQbHVnaW5QYWdlX2xhYmVsX25hbWU9XHU1MzJmXHU1MWZhXHU1NDBkXHU3YTMxXHVmZjFhDQotU2F2ZUxpYnJhcnlQYWdlX2Rlc2M9XHU1MzJmXHU1MWZhXHU5MDc4XHU1M2Q2XHU3Njg0XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHU1M2NhXHU3NmY4XHU5NWRjXHU3Njg0XHU5MTRkXHU3ZjZlDQotRXhwb3J0UGx1Z2luV2l6YXJkX01TRzE9XHU2YjYzXHU1NzI4XHU1MjA2XHU2NzkwXHU3YTBiXHU1ZjBmXHU1ZWFiXHU5MTRkXHU3ZjZlLi4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MWU3ZTZiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZhZWMxMDAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIEV4cG9ydCAoTkwyKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjU0ZmNhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODY4NDgwYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBQZXJzcGVjdGl2ZQ0KLXBhY2thZ2luZ1BlcnNwZWN0aXZlTmFtZT1cdTA0MWZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0NGINCi0NCi0jIENhdGVnb3J5DQotcGFja2FnaW5nQ2F0ZWdvcnlOYW1lPVx1MDQxZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mlx1MDQ0Yg0KLQ0KLSMgVmlld3MNCi1wYWNrYWdpbmdWaWV3TmFtZT1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzINCi1wYWNrYWdpbmdNZXNzYWdlVmlld05hbWU9XHUwNDIxXHUwNDNlXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZSBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDMwIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOA0KLQ0KLSMgQWN0aW9uIFNldA0KLXBhY2thZ2luZ0FjdGlvblNldD1cdTA0MWZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0NGINCi0NCi0jIEFjdGlvbnMNCi1uZXdDb25maWdBY3Rpb249Jlx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzgNCi1vcGVuQ29uZmlnQWN0aW9uPSZcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1cdTA0MWVcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOA0KLQ0KLSMgRXhwb3J0IFdpemFyZCBDYXRlZ29yeQ0KLWV4cG9ydENhdGVnb3J5TmFtZT1cdTA0MWNcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzQNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzgNCi1leHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbj1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOC4NCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9XHUwNDFjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLWV4cG9ydE1ldGhvZFBsdWdpbnM9XHUwNDJkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzZCBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzNVx1MDQzOSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1ZjMxMmEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMDAwRSAtIElVUEUwMDk5RQ0KLSMNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0Q29uZmlnV2l6YXJkX3RpdGxlPVx1MDQyZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4DQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGU9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0Mlx1MDQzOFx1MDQzZiBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzANCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDJcdTA0MzhcdTA0M2YgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwLg0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ0xhYmVsX3RleHQ9XHUwNDJkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDM4IFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnU3BlY3NMYWJlbF90ZXh0PVx1MDQyZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2QgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzZFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0NDFcdTA0M2ZcdTA0MzVcdTA0NDZcdTA0MzhcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLXNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1zZWxlY3RDb25maWdQYWdlX2Rlc2M9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMC4gXHUwNDExXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0NDJcdTA0MzBcdTA0M2FcdTA0MzZcdTA0MzUgXHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAsIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzA6DQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0M2ZcdTA0MzVcdTA0NDZcdTA0MzhcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5DQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2M9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQzNSBcdTA0NDFcdTA0M2ZcdTA0MzVcdTA0NDZcdTA0MzhcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMC4NCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ9XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMDoNCi1jaGVja0NvbmZpZ1BhZ2VfdGl0bGU9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDQyXHUwNDRjIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzOCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1jaGVja0NvbmZpZ1BhZ2VfZGVzYz1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2RcdTA0MzAgXHUwNDQxXHUwNDNlXHUwNDMzXHUwNDNiXHUwNDMwXHUwNDQxXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDNlXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZVx1MDQzMSBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzBcdTA0NDUgXHUwNDM4IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQ0Y1x1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0NDUuDQotc2VsZWN0RGVzdGluYXRpb25QYWdlX3RpdGxlPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMA0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDZcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0UGx1Z2luc1dpemFyZF90aXRsZT1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLXNlbGVjdFBsdWdpbnNQYWdlX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotc2VsZWN0UGx1Z2luc1BhZ2VfZGVzYz1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwLg0KLXNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PVx1MDQxY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzI6DQotcmV2aWV3UGx1Z2luc1BhZ2VfdGl0bGU9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwIFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzOQ0KLXJldmlld1BsdWdpbnNQYWdlX2Rlc2M9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0YyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDM3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5LiBcdTA0MWRcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDFkXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDM0IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0M2VcdTA0NDBcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDQ1IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzNVx1MDQzOSwgXHUwNDM1XHUwNDQxXHUwNDNiXHUwNDM4IFx1MDQzOFx1MDQ0NSBcdTA0NDJcdTA0MzBcdTA0M2FcdTA0MzZcdTA0MzUgXHUwNDNkXHUwNDQzXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0Yy4NCi1yZXZpZXdQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dD1cdTA0MWNcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyOg0KLXJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0PVx1MDQxN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQ0Ylx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyOg0KLXJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMjoNCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV90aXRsZT1cdTA0MWZcdTA0M2VcdTA0MzRcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfZGVzYz1cdTA0MWZcdTA0M2VcdTA0MzRcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzNVx1MDQzOSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMC4NCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9ub1BsdWdpbl90ZXh0PVx1MDQxZFx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0NGIgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4NCi1zcGVjaWZ5UGF0aFBhZ2VfdGl0bGU9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwDQotc3BlY2lmeVBhdGhQYWdlX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0Nlx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQ0NSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzVcdTA0MzkgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotU2F2ZVBsdWdpblBhZ2VfZGVzYz1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0MzggXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzMiBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzLg0KLUV4cG9ydFBsdWdpbldpemFyZF90aXRsZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDMwIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMCBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzVcdTA0MzkgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotRXhwb3J0UGx1Z2luRXJyb3JfbXNnPUlVUEUwMDAwRTogXHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMA0KLQ0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBFcnJvciBEaWFsb2cNCi1leHBvcnRDb25maWdFcnJvckRpYWxvZ190aXRsZT1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOA0KLWV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX21zZz1JVVBFMDAwMUU6IFx1MDQxZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyLg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1hbmFseXppbmdDb25maWdUYXNrX25hbWU9XHUwNDEwXHUwNDNkXHUwNDMwXHUwNDNiXHUwNDM4XHUwNDM3IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzguLi4NCi0NCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzA9XHUwNDJkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4uLg0KLUNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMT1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkLg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzE9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNhXHUwNDMwIFx1MDQ0MVx1MDQzZVx1MDQzM1x1MDQzYlx1MDQzMFx1MDQ0MVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Li4uXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8yPVx1MDQxZFx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMz1cdTA0MTIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2RcdTA0MzVcdTA0NDIgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNlXHUwNDNhLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfND1cdTA0MTIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCB7MH0gXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNlXHUwNDNhLlxuXHUwNDE4XHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0ZFx1MDQ0Mlx1MDQzOCBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzMiBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4LiBcblx1MDQxOFx1MDQ0NSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2UgXHUwNDQyXHUwNDMwXHUwNDNhXHUwNDM2XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzOFx1MDQzM1x1MDQzZFx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDRjLg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9jaGVja2luZz1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2FcdTA0MzAgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4LCBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzZcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzUuLi4NCi1FeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Jyb3dzZT1cdTA0MWVcdTA0MzFcdTA0MzdcdTA0M2VcdTA0NDAuLi4NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGVmYXVsdF9kaXI9XHUwNDE4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMD1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Li4uDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMj1JVVBFMDAwMkU6IFx1MDQyZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0M2RcdTA0MzUgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkOiBcdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNhXHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOA0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzQ9SVVQRTAwMDNFOiBcdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDNkXHUwNDM1IFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZDogXHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzgNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RTogXHUwNDJkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFx1MDQzZFx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2Q6IFx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNkXHUwNDM1XHUwNDQwXHUwNDMwIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzgNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c5PUlVUEUwMDA1RTogXHUwNDJkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFx1MDQzZFx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2Q6IFx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOA0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPVx1MDQxOFx1MDQzY1x1MDQ0ZjoNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGlyPVx1MDQxYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMzoNCi1FeHBvcnRQbHVnaW5XaXphcmRfZXJyb3I9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwDQotRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlPVx1MDQxZFx1MDQzMFx1MDQzN1x1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlDQotRGVzdGluYXRpb25Db21tb25QYWdlX2Rlc2M9XHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzZSBcdTA0NDNcdTA0M2NcdTA0M2VcdTA0M2JcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGU6DQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwPVx1MDQyZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzVcdTA0MzkuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzM1x1MDQzMCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwLi4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyPVx1MDQxYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzIuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzM9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0MzggXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDMwIFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzZVx1MDQzMi4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHND1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkLg0KLVNhdmVMaWJyYXJ5UGFnZV90aXRsZT1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLVNhdmVQbHVnaW5QYWdlX2xhYmVsX25hbWU9XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMDoNCi1TYXZlTGlicmFyeVBhZ2VfZGVzYz1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDM4IFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1FeHBvcnRQbHVnaW5XaXphcmRfTVNHMT1cdTA0MTBcdTA0M2RcdTA0MzBcdTA0M2JcdTA0MzhcdTA0MzcgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOC4uLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTk4ZGIwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NWY5OGY3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgRXhwb3J0IChOTDJhKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNjgyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWQ1MjdjMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gZWtzcG9ydA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgUGVyc3BlY3RpdmUNCi1wYWNrYWdpbmdQZXJzcGVjdGl2ZU5hbWU9UGFrbmluZw0KLQ0KLSMgQ2F0ZWdvcnkNCi1wYWNrYWdpbmdDYXRlZ29yeU5hbWU9UGFrbmluZw0KLQ0KLSMgVmlld3MNCi1wYWNrYWdpbmdWaWV3TmFtZT1QYWtrZW1ldG9kZWJpYmxpb3Rlaw0KLXBhY2thZ2luZ01lc3NhZ2VWaWV3TmFtZT1CaWJsaW90ZWtzcGFra2VtZWRkZWxlbHNlDQotDQotIyBBY3Rpb24gU2V0DQotcGFja2FnaW5nQWN0aW9uU2V0PVBha25pbmcNCi0NCi0jIEFjdGlvbnMNCi1uZXdDb25maWdBY3Rpb249JktvbmZpZ3VyYXRpb24NCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPU9wcmV0IG55IGJpYmxpb3Rla3Nrb25maWd1cmF0aW9uDQotb3BlbkNvbmZpZ0FjdGlvbj0mS29uZmlndXJhdGlvbg0KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPVx1MDBjNWJuIGVuIGVrc2lzdGVyZW5kZSBiaWJsaW90ZWtza29uZmlndXJhdGlvbg0KLQ0KLSMgRXhwb3J0IFdpemFyZCBDYXRlZ29yeQ0KLWV4cG9ydENhdGVnb3J5TmFtZT1NZXRvZGUNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPUJpYmxpb3Rla3Nrb25maWd1cmF0aW9uDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb249RWtzcG9ydFx1MDBlOXIgZW4gYmlibGlvdGVrc2tvbmZpZ3VyYXRpb24uDQotDQotIyBFeHBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWV4cG9ydE1ldGhvZFBsdWdpbnNXaXphcmROYW1lPU1ldG9kZS1wbHVnaW5zDQotZXhwb3J0TWV0aG9kUGx1Z2lucz1Fa3Nwb3J0XHUwMGU5ciBlbiBlbGxlciBmbGVyZSBtZXRvZGUtcGx1Z2lucy4NCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDBlMTZmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAwMDBFIC0gSVVQRTAwOTlFDQotIw0KLQ0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1leHBvcnRDb25maWdXaXphcmRfdGl0bGU9RWtzcG9ydFx1MDBlOXIgYmlibGlvdGVrc2tvbmZpZ3VyYXRpb24NCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZT1WXHUwMGU2bGcgZWtzcG9ydHR5cGUNCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVZcdTAwZTZsZyBkZW4gdHlwZSBiaWJsaW90ZWtza29uZmlndXJhdGlvbiwgZGVyIHNrYWwgZWtzcG9ydGVyZXMuDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnTGFiZWxfdGV4dD1Fa3Nwb3J0XHUwMGU5ciBlbiBtZXRvZGVrb25maWd1cmF0aW9uIG9nIGFsbGUgZGVucyBtZXRvZGUtcGx1Z2lucw0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ1NwZWNzTGFiZWxfdGV4dD1Fa3Nwb3J0XHUwMGU5ciBlbiBlbGxlciBmbGVyZSBtZXRvZGVrb25maWd1cmF0aW9uc3NwZWNpZmlrYXRpb25lcg0KLXNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9Vlx1MDBlNmxnIG1ldG9kZWtvbmZpZ3VyYXRpb24NCi1zZWxlY3RDb25maWdQYWdlX2Rlc2M9Vlx1MDBlNmxnIGVuIG1ldG9kZWtvbmZpZ3VyYXRpb24sIGRlciBza2FsIGVrc3BvcnRlcmVzLiBBbGxlIHJlZmVyZXJlZGUgbWV0b2RlLXBsdWdpbnMgaSBkZW4gdmFsZ3RlIGtvbmZpZ3VyYXRpb24gYmxpdmVyIGlua2x1ZGVyZXQgaSBla3Nwb3J0ZW4uDQotc2VsZWN0Q29uZmlnUGFnZV9jb25maWdzTGFiZWxfdGV4dD1NZXRvZGVrb25maWd1cmF0aW9uZXI6DQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX3RpdGxlPVZcdTAwZTZsZyBrb25maWd1cmF0aW9uc3NwZWNpZmlrYXRpb25lcg0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV9kZXNjPVZcdTAwZTZsZyBlbiBlbGxlciBmbGVyZSBtZXRvZGVrb25maWd1cmF0aW9uc3NwZWNpZmlrYXRpb25lciwgZGVyIHNrYWwgZWtzcG9ydGVyZXMuDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PU1ldG9kZWtvbmZpZ3VyYXRpb25lcjoNCi1jaGVja0NvbmZpZ1BhZ2VfdGl0bGU9R2VubmVtc2Uga29uZmlndXJhdGlvbnNmZWpsDQotY2hlY2tDb25maWdQYWdlX2Rlc2M9RGVyIGVyIHVkZlx1MDBmOHJ0IGludGVncml0ZXRza29udHJvbCBhZiBkZW4gdmFsZ3RlIG1ldG9kZWtvbmZpZ3VyYXRpb24uIEdlbm5lbXNlIGZlamxyYXBwb3J0ZW4sIG9nIGZvcmV0YWcgZGUgblx1MDBmOGR2ZW5kaWdlIHJldHRlbHNlci4NCi1zZWxlY3REZXN0aW5hdGlvblBhZ2VfdGl0bGU9QW5naXYgZWtzcG9ydGJpYmxpb3Rlaw0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV9kZXNjPUFuZ2l2IGV0IGRlc3RpbmF0aW9uc2JpYmxpb3RlayB0aWwgbGFncmluZyBhZiBkZW4gZWtzcG9ydGVyZWRlIGtvbmZpZ3VyYXRpb24uDQotDQotIyBFeHBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWV4cG9ydFBsdWdpbnNXaXphcmRfdGl0bGU9RWtzcG9ydFx1MDBlOXIgbWV0b2RlLXBsdWdpbnMNCi1zZWxlY3RQbHVnaW5zUGFnZV90aXRsZT1WXHUwMGU2bGcgbWV0b2RlLXBsdWdpbnMNCi1zZWxlY3RQbHVnaW5zUGFnZV9kZXNjPVZcdTAwZTZsZyBlbiBlbGxlciBmbGVyZSBtZXRvZGUtcGx1Z2lucywgZGVyIHNrYWwgZWtzcG9ydGVyZXMuDQotc2VsZWN0UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9TWV0b2RlLXBsdWdpbnM6DQotcmV2aWV3UGx1Z2luc1BhZ2VfdGl0bGU9R2VubmVtc2UgYWZoXHUwMGU2bmdpZ2hlZGVyDQotcmV2aWV3UGx1Z2luc1BhZ2VfZGVzYz1WXHUwMGU2bGcgaHZlciBtZXRvZGUtcGx1Z2luIGZvciBhdCBnZW5uZW1zZSBkZW5zIGFmaFx1MDBlNm5naWdoZWRlci4gS2xpayBwXHUwMGU1IFRpbGJhZ2UgZm9yIGF0IHZcdTAwZTZsZ2UgZGUgYWZoXHUwMGU2bmdpZ2UgcGx1Z2lucywgaHZpcyBkZSBza2FsIGlua2x1ZGVyZXMgaSBla3Nwb3J0ZW4uDQotcmV2aWV3UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9TWV0b2RlLXBsdWdpbnM6DQotcmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQ9QWZoXHUwMGU2bmdpZ2UgbWV0b2RlLXBsdWdpbnM6DQotcmV2aWV3UGx1Z2luc1BhZ2VfYXNzb2NpYXRlZENvbmZpZ3NMYWJlbF90ZXh0PVRpbGtueXR0ZWRlIG1ldG9kZWtvbmZpZ3VyYXRpb25lcjoNCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV90aXRsZT1CZWtyXHUwMGU2ZnQgZWtzcG9ydA0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX2Rlc2M9QmVrclx1MDBlNmZ0IGRlIG1ldG9kZS1wbHVnaW5zLCBkZXIgdmlsIGJsaXZlIGVrc3BvcnRlcmV0Lg0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX25vUGx1Z2luX3RleHQ9RGVyIGVyIGlra2UgdmFsZ3QgZW4gbWV0b2RlLXBsdWdpbi4NCi1zcGVjaWZ5UGF0aFBhZ2VfdGl0bGU9QW5naXYgZWtzcG9ydGJpYmxpb3Rlaw0KLXNwZWNpZnlQYXRoUGFnZV9kZXNjPUFuZ2l2IGV0IGRlc3RpbmF0aW9uc2JpYmxpb3RlayB0aWwgbGFncmluZyBhZiBkZSBla3Nwb3J0ZXJlZGUgbWV0b2RlLXBsdWdpbnMuDQotU2F2ZVBsdWdpblBhZ2VfZGVzYz1Fa3Nwb3J0XHUwMGU5ciBkZSB2YWxndGUgcGx1Z2lucyBvZyBrb25maWd1cmF0aW9uZXIgdGlsIGRldCBhbmdpdm5lIGRlc3RpbmF0aW9uc2JpYmxpb3Rlay4NCi1FeHBvcnRQbHVnaW5XaXphcmRfdGl0bGU9RmVqbCBpIGd1aWRlbiBFa3Nwb3J0XHUwMGU5ciBtZXRvZGUtcGx1Z2luDQotRXhwb3J0UGx1Z2luRXJyb3JfbXNnPUlVUEUwMDAwRTogRGVyIGVyIG9wc3RcdTAwZTVldCBmZWpsIHVuZGVyIGVrc3BvcnQNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9RWtzcG9ydFx1MDBlOXIgYmlibGlvdGVrc2tvbmZpZ3VyYXRpb24NCi1leHBvcnRDb25maWdFcnJvckRpYWxvZ19tc2c9SVVQRTAwMDFFOiBFa3Nwb3J0ZW4ga2FuIGlra2UgZm9ydHNcdTAwZTZ0dGUuDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWFuYWx5emluZ0NvbmZpZ1Rhc2tfbmFtZT1BbmFseXNlcmVyIGJpYmxpb3Rla3Nrb25maWd1cmF0aW9uLi4uDQotDQotIyBUaGUgZm9sbG93aW5nIG1lc3NhZ2VzIGhhdmUgbm90IGJlZW4gcmV2aWV3ZWQuDQotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cwPUVrc3BvcnRlcmVyIGtvbmZpZ3VyYXRpb24uLi4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzE9RWtzcG9ydCBlciB1ZGZcdTAwZjhydC4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8xPUtvbnRyb2xsZXJlciBkZW4gdmFsZ3RlIGtvbmZpZ3VyYXRpb25zIGludGVncml0ZXQuLi5cbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzI9RGVyIGVyIGlra2UgdmFsZ3QgZW4ga29uZmlndXJhdGlvbi5cbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzM9RGVyIGVyIGluZ2VuIHByb2JsZW1lciBpIGRlbiB2YWxndGUga29uZmlndXJhdGlvbi5cbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzQ9RGVyIGVyIHswfSBwcm9ibGVtZXIgaSBkZW4gdmFsZ3RlIGtvbmZpZ3VyYXRpb24uIFxuRHUga2FuIFx1MDBlNWJuZSBrb25maWd1cmF0aW9uc2VkaXRvcmVuIG9nIHJldHRlIGZlamxlbmUuIFxuRHUga2FuIG9nc1x1MDBlNSB2XHUwMGU2bGdlIGF0IGlnbm9yZXJlIHByb2JsZW1lcm5lIG9nIGZvcnRzXHUwMGU2dHRlLg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9jaGVja2luZz1Lb250cm9sbGVyZXIga29uZmlndXJhdGlvbi4gVmVudC4uLg0KLUV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9Vlx1MDBlNmxnIG1ldG9kZWtvbmZpZ3VyYXRpb24NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfYnJvd3NlPUdlbm5lbXNlLi4uDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RlZmF1bHRfZGlyPUJydWcgc3RhbmRhcmRiaWJsaW90ZWsNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwPUVrc3BvcnRlcmVyIGtvbmZpZ3VyYXRpb24uLi4NCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyPUlVUEUwMDAyRTogRWtzcG9ydCBlciBpa2tlIHVkZlx1MDBmOHJ0LiBGZWpsIHVuZGVyIGluZGxcdTAwZTZzbmluZyBhZiBiaWJsaW90ZWsuDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHND1JVVBFMDAwM0U6IEVrc3BvcnQgZXIgaWtrZSB1ZGZcdTAwZjhydC4gRmVqbCB1bmRlciBrb3BpZXJpbmcgYWYgYmlibGlvdGVrLg0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzE9SVVQRTAwMDRFOiBFa3Nwb3J0IGVyIGlra2UgdWRmXHUwMGY4cnQuIEZlamwgdW5kZXIgbHVrbmluZyBhZiBiaWJsaW90ZWtza29uZmlndXJhdGlvbi4NCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c5PUlVUEUwMDA1RTogRWtzcG9ydCBlciBpa2tlIHVkZlx1MDBmOHJ0LiBGZWpsIHVuZGVyIGxhZ3JpbmcgYWYgYmlibGlvdGVrLg0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPU5hdm46DQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Rpcj1CaWJsaW90ZWs6DQotRXhwb3J0UGx1Z2luV2l6YXJkX2Vycm9yPUZlamwNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfdGl0bGU9U3RhbmRhcmR0aXRlbA0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjPVN0YW5kYXJkYmVza3JpdmVsc2U6DQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwPUVrc3BvcnRlcmVyIHBsdWdpbnMuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE9T3ByZXR0ZXIgZWtzcG9ydGJpYmxpb3Rlay4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMj1Lb3BpZXJlciBmaWxlci4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMz1PcHJldHRlciBiaWJsaW90ZWsgb2cgcmVzc291cmNlZmlsLi4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0c0PUVrc3BvcnQgZXIgdWRmXHUwMGY4cnQuDQotU2F2ZUxpYnJhcnlQYWdlX3RpdGxlPUVrc3BvcnRcdTAwZTlyIG1ldG9kZS1wbHVnaW4NCi1TYXZlUGx1Z2luUGFnZV9sYWJlbF9uYW1lPUVrc3BvcnRuYXZuOg0KLVNhdmVMaWJyYXJ5UGFnZV9kZXNjPUVrc3BvcnRcdTAwZTlyIGRlIHZhbGd0ZSBtZXRvZGUtcGx1Z2lucyBvZyB0aWxrbnl0dGVkZSBrb25maWd1cmF0aW9uZXINCi1FeHBvcnRQbHVnaW5XaXphcmRfTVNHMT1BbmFseXNlcmVyIGJpYmxpb3Rla3Nrb25maWd1cmF0aW9uLi4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjYzkxZDAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxYTY1MDkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBYTUwgRXhwb3J0IChOTDEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmU3YjAxMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9pdC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQ5OWE3OC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFBsdWctaW4gZlx1MDBmY3IgWE1MLUV4cG9ydA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmROYW1lPVhNTA0KLWV4cG9ydFhNTFdpemFyZERlc2NyaXB0aW9uPUluaGFsdCBlaW5lciBNZXRob2RlbmJpYmxpb3RoZWsgaW4gZWluZSBYTUwtRGF0ZWkgZXhwb3J0aWVyZW4uDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmY3ODU1Mi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVBsdWctaW4gZGUgWE1MIGRlIGV4cG9ydGFjaVx1MDBmM24gZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZE5hbWU9WE1MDQotZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249RXhwb3J0YXIgY29udGVuaWRvIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGEgdW4gYXJjaGl2byBYTUwuDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGU2ZjI2Zi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVBsdWctaW4gWE1MIGQnZXhwb3J0YXRpb24gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZE5hbWU9WE1MDQotZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249RXhwb3J0ZXogbGUgY29udGVudSBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIHZlcnMgdW4gZmljaGllciBYTUwuDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5faXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGFkNTFiOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVBsdWctaW4gWE1MIGRpIGVzcG9ydGF6aW9uZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEV4cG9ydCBYTUwgV2l6YXJkDQotZXhwb3J0WE1MV2l6YXJkTmFtZT1YTUwNCi1leHBvcnRYTUxXaXphcmREZXNjcmlwdGlvbj1Fc3BvcnRhIGlsIGNvbnRlbnV0byBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIHN1IHVuIGZpbGUgWE1MLg0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4N2JiOWMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgRXhwb3J0IFhNTCBQbHVnLWluDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZE5hbWU9WE1MDQotZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDkyIFhNTCBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmJcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjlmZTU1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFhNTCBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZE5hbWU9WE1MDQotZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgWE1MIFx1ZDMwY1x1Yzc3Y1x1Yjg1YyBcdWIwYjRcdWJjZjRcdWIwYzVcdWIyYzhcdWIyZTQuDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzQ5ZTY2MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVBsdWctaW4gWE1MIGRlIEV4cG9ydGFcdTAwZTdcdTAwZTNvIGRvIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmROYW1lPVhNTA0KLWV4cG9ydFhNTFdpemFyZERlc2NyaXB0aW9uPUV4cG9ydGUgbyBjb250ZVx1MDBmYWRvIGRhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG8gcGFyYSB1bSBhcnF1aXZvIFhNTC4NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYWNmNzliLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1NWJmY1x1NTFmYSBYTUwgXHU2M2QyXHU0ZWY2DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZE5hbWU9WE1MDQotZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249XHU1YzA2XHU2NWI5XHU2Y2Q1XHU1ZTkzXHU1MTg1XHU1YmI5XHU1YmZjXHU1MWZhXHU1MjMwIFhNTCBcdTY1ODdcdTRlZjZcdTMwMDINCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOGVkYTEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIEV4cG9ydCBYTUwgUGx1Zy1pbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmROYW1lPVhNTA0KLWV4cG9ydFhNTFdpemFyZERlc2NyaXB0aW9uPVx1NWMwN1x1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NzY4NFx1NTE2N1x1NWJiOVx1NTMyZlx1NTFmYVx1NTIzMCBYTUwgXHU2YTk0XHUzMDAyDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNTRiMDEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmRfdGl0bGU9WE1MIGV4cG9ydGllcmVuDQotDQotIyBTZWxlY3QgRXhwb3J0IFR5cGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVdcdTAwZTRobGVuIFNpZSBkZW4gVHlwIGRlcyB6dSBleHBvcnRpZXJlbmRlbiBNZXRob2RlbmJpYmxpb3RoZWtzaW5oYWx0cyBhdXMuDQotZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uX3RleHQ9R2VzYW10ZSBNZXRob2RlbmJpYmxpb3RoZWsgZXhwb3J0aWVyZW4NCi1leHBvcnRQbHVnaW5zUmFkaW9CdXR0b25fdGV4dD1NZXRob2Rlbi1QbHVnLWlucyBleHBvcnRpZXJlbg0KLWV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbl90ZXh0PU1ldGhvZGVua29uZmlndXJhdGlvbiBleHBvcnRpZXJlbg0KLQ0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9RXhwb3J0ZGF0ZWkgYW5nZWJlbg0KLXNlbGVjdFhNTEZpbGVQYWdlX2Rlc2M9R2ViZW4gU2llIGVpbmUgWE1MLVppZWxkYXRlaSBhbiwgaW4gZGVyIGRlciBleHBvcnRpZXJ0ZSBNZXRob2RlbmJpYmxpb3RoZWtzaW5oYWx0IGdlc3BlaWNoZXJ0IHdlcmRlbiBzb2xsLg0KLWZpbGVMYWJlbF90ZXh0PVhNTC1EYXRlaToNCi1icm93c2VCdXR0b25fdGV4dD1EdXJjaHN1Y2hlbi4uLg0KLQ0KLSMgT3ZlcndyaXRlIENvbmZpcm1hdGlvbiBEaWFsb2cNCi1vdmVyd3JpdGVUZXh0X21zZz0nJ3swfScnIGlzdCBiZXJlaXRzIHZvcmhhbmRlbi5cbk1cdTAwZjZjaHRlbiBTaWUgZGllc2UgRGF0ZWkgXHUwMGZjYmVyc2NocmVpYmVuPw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1leHBvcnRpbmdYTUxfdGV4dD1JbmhhbHQgZWluZXIgTWV0aG9kZW5iaWJsaW90aGVrIGluIGVpbmUgWE1MLURhdGVpIGV4cG9ydGllcmVuLi4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWRYTUxGaWxlX2Vycm9yPURpZSBhbmdlZ2ViZW5lIFhNTC1EYXRlaSBpc3QgbmljaHQgZ1x1MDBmY2x0aWcuDQotZXhwb3J0WE1MV2l6YXJkX2Vycm9yPUlVUE0wMDAwRTogRXhwb3J0IGZlaGxnZXNjaGxhZ2VuOiB7MH0NCi1leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nPURlciBFeHBvcnQgaXN0IGFiZ2VzY2hsb3NzZW4uIFNlaGVuIFNpZSBzaWNoIGRpZSBQcm90b2tvbGxkYXRlaWVuIGltIEV4cG9ydHZlcnplaWNobmlzIGFuLg0KLWV4cG9ydFhNTFNlcnZpY2VfZXJyb3I9RmVobGVyIGJlaW0gRXhwb3J0aWVyZW4gZGVyIEJpYmxpb3RoZWs6IHswfQ0KLWV4cG9ydFhNTFNlcnZpY2VfZmVhdHVyZV9lcnJvcj1GZWhsZXIgYmVpbSBTZXR6ZW4gZGVzIEZlYXR1cmUtV2VydHM6OiBFbGVtZW50PXswfSwgRmVhdHVyZT17MX0NCi14bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sPURpZSBYTUwtUXVlbGxlICcnezB9Jycga2FubiBuaWNodCBnZWxhZGVuIHdlcmRlbi4NCi14bWxMaWJyYXJ5X25vX3BsdWdpbj1FcyBpc3Qga2VpbiBNZXRob2Rlbi1QbHVnLWluIGZcdTAwZmNyIElEIHswfSB2b3JoYW5kZW4uDQoteG1sTGlicmFyeV9ub19mZWF0dXJlPURhcyBYTUwtRmVhdHVyZSBmXHUwMGZjciB7MH1fezF9IGthbm4gbmljaHQgYWJnZXJ1ZmVuIHdlcmRlbi4NCi14bWxMaWJyYXJ5X25vX2NsYXNzPURpZSBFQ2xhc3MgZlx1MDBmY3IgezB9IGthbm4gbmljaHQgYWJnZXJ1ZmVuIHdlcmRlbi4NCi14bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PUZlaGxlciBiZWltIEVyc3RlbGxlbiBkZXMgRWxlbWVudHMuIEVzIGthbm4gbmljaHQgYmVzdGltbXQgd2VyZGVuLCB3aWUgZGVyIFdlcnQgZlx1MDBmY3IgZGFzIEZlYXR1cmUgezB9IGdlc2V0enQgd2lyZC4NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZT1GZWhsZXIgYmVpbSBFcnN0ZWxsZW4gZGVzIEVsZW1lbnRzLiBEZXIgV2VydCB7MH0ga2FubiBuaWNodCBhdWYgZGVuIENvbnRhaW5lciB7MX0gZ2VzZXR6dCB3ZXJkZW4uDQoteG1sTGlicmFyeV9pbnZhbGlkX2ZlYXR1cmVfdmFsdWU9VW5nXHUwMGZjbHRpZ2VyIEF0dHJpYnV0LUZlYXR1cmUtV2VydCBmXHUwMGZjciBGZWF0dXJlIHswfSBtaXQgZGVtIFdlcnQgezF9DQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMj1GZWhsZXIgYmVpbSBTZXR6ZW4gZGVzIEF0dHJpYnV0cy4gRGVyIFdlcnQgZlx1MDBmY3IgRmVhdHVyZSB7MH0sIE9iamVrdCB7MX0sIFdlcnQgezJ9IGthbm4gbmljaHQgZ2VzZXR6dCB3ZXJkZW4uDQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMz1FcyBrYW5uIG5pY2h0IGJlc3RpbW10IHdlcmRlbiwgd2llIGRlciBXZXJ0IGZcdTAwZmNyIEZlYXR1cmUgezB9LCBPYmpla3QgezF9LCBXZXJ0IHsyfSBnZXNldHp0IHdpcmQuDQoteG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPUZlaGxlciBiZWltIERlZmluaWVyZW4gZGVyIFJlZmVyZW56LiBEZXIgV2VydCBmXHUwMGZjciBGZWF0dXJlIHswfSwgT2JqZWt0IHsxfSwgV2VydCB7Mn0ga2FubiBuaWNodCBnZXNldHp0IHdlcmRlbi4NCi14bWxMaWJyYXJ5X2Vycm9yX3Byb2Nlc3Nfd3JvbmdfY29udGFpbmVyPURlciBQcm96ZXNzICcnezB9JycgaGF0IGtlaW5lbiBnXHUwMGZjbHRpZ2VuIENvbnRhaW5lci4gRGVyIENvbnRhaW5lciBoYXQgZGVuIFR5cCAnJ3sxfScnIHVuZCBpc3QgZGFtaXQga2VpbiBQcm96ZXNzcGFrZXQuDQoteG1sTGlicmFyeV9uZXdfaWQ9RGVtIEVsZW1lbnQgezB9IHd1cmRlIGRpZSBuZXVlIElEIHsxfSB6dWdlb3JkbmV0LCB3ZWlsIGVzIGtlaW5lIGdcdTAwZmNsdGlnZSBJRCBoYXR0ZS4NCi14bWxMaWJyYXJ5X2lkX25vdF91bmlxdWU9RGllIEVsZW1lbnQtSUQgJyd7MH0nJyB3aXJkIHZvbiBtZWhyZXJlbiBFbGVtZW50ZW4gdmVyd2VuZGV0Lg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGQyZDg0OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOg0KLSMNCi0NCi0jIEV4cG9ydCBYTUwgV2l6YXJkDQotZXhwb3J0WE1MV2l6YXJkX3RpdGxlPUV4cG9ydGFyIFhNTA0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBUeXBlIFdpemFyZCBQYWdlDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1TZWxlY2Npb25lIGVsIHRpcG8gZGUgY29udGVuaWRvIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIHBhcmEgZXhwb3J0YXIuDQotZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uX3RleHQ9RXhwb3J0YXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZW50ZXJhDQotZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ9RXhwb3J0YXIgdW5vIG8gbVx1MDBlMXMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8NCi1leHBvcnRDb25maWdzUmFkaW9CdXR0b25fdGV4dD1FeHBvcnRhciB1bmEgY29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvDQotDQotIyBTZWxlY3QgRGVzdGluYXRpb24gWE1MIEZpbGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1Fc3BlY2lmaWNhciBhcmNoaXZvIGRlIGV4cG9ydGFjaVx1MDBmM24NCi1zZWxlY3RYTUxGaWxlUGFnZV9kZXNjPUVzcGVjaWZpcXVlIHVuIGFyY2hpdm8gWE1MIGRlIGRlc3Rpbm8gcGFyYSBhbG1hY2VuYXIgZWwgY29udGVuaWRvIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGV4cG9ydGFkYS4NCi1maWxlTGFiZWxfdGV4dD1BcmNoaXZvIFhNTDoNCi1icm93c2VCdXR0b25fdGV4dD1FeGFtaW5hci4uLg0KLQ0KLSMgT3ZlcndyaXRlIENvbmZpcm1hdGlvbiBEaWFsb2cNCi1vdmVyd3JpdGVUZXh0X21zZz0nJ3swfScnIHlhIGV4aXN0ZS5cblx1MDBiZkRlc2VhIHNvYnJlc2NyaWJpcmxvPw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1leHBvcnRpbmdYTUxfdGV4dD1FeHBvcnRhbmRvIGNvbnRlbmlkbyBkZSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhIGFyY2hpdm8gWE1MLi4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWRYTUxGaWxlX2Vycm9yPUVsIGFyY2hpdm8gWE1MIGVzcGVjaWZpY2FkbyBubyBlcyB2XHUwMGUxbGlkby4NCi1leHBvcnRYTUxXaXphcmRfZXJyb3I9SVVQTTAwMDBFOiBMYSBleHBvcnRhY2lcdTAwZjNuIGhhIGZhbGxhZG86IHswfQ0KLWV4cG9ydFhNTFdpemFyZF9yZXZpZXdMb2c9TGEgZXhwb3J0YWNpXHUwMGYzbiBoYSBjb25jbHVpZG8uIFJldmlzZSBsb3MgYXJjaGl2b3MgZGUgcmVnaXN0cm8gYmFqbyBlbCBkaXJlY3RvcmlvIGRlIGV4cG9ydGFjaVx1MDBmM24uDQotZXhwb3J0WE1MU2VydmljZV9lcnJvcj1FcnJvciBhbCBleHBvcnRhciBsYSBiaWJsaW90ZWNhOiB7MH0NCi1leHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3I9RXJyb3IgYWwgZXN0YWJsZWNlciBlbCB2YWxvciBkZSBsYSBjYXJhY3Rlclx1MDBlZHN0aWNhOiBFbGVtZW50bz17MH0sIGNhcmFjdGVyXHUwMGVkc3RpY2E9ezF9DQoteG1sTGlicmFyeV9lcnJvcl9sb2FkX3htbD1ObyBzZSBoYSBwb2RpZG8gY2FyZ2FyIGVsIGFyY2hpdm8gZnVlbnRlIFhNTCAnJ3swfScnDQoteG1sTGlicmFyeV9ub19wbHVnaW49Tm8gaGF5IG5pbmdcdTAwZmFuIE1ldGhvZFBsdWdpbiBwYXJhIGVsIElEIHswfQ0KLXhtbExpYnJhcnlfbm9fZmVhdHVyZT1ObyBzZSBoYSBwb2RpZG8gb2J0ZW5lciBsYSBjYXJhY3Rlclx1MDBlZHN0aWNhIFhtbCBwYXJhIHswfV97MX0NCi14bWxMaWJyYXJ5X25vX2NsYXNzPU5vIHNlIGhhIHBvZGlkbyBvYnRlbmVyIEVDbGFzcyBwYXJhIHswfQ0KLXhtbExpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9RXJyb3IgYWwgY3JlYXIgZWxlbWVudG8sIG5vIHNlIHNhYmUgY1x1MDBmM21vIGVzdGFibGVjZXIgZWwgdmFsb3IgcGFyYSBsYSBjYXJhY3Rlclx1MDBlZHN0aWNhIHswfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlPUVycm9yIGFsIGNyZWFyIGVsZW1lbnRvLCBubyBzZSBwdWVkZSBlc3RhYmxlY2VyIGVsIHZhbG9yIHswfSBlbiBlbCBjb250ZW5lZG9yIHsxfQ0KLXhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlPVZhbG9yIGRlIGNhcmFjdGVyXHUwMGVkc3RpY2EgZGUgYXRyaWJ1dG8gbm8gdlx1MDBlMWxpZG8gcGFyYSBsYSBjYXJhY3Rlclx1MDBlZHN0aWNhIHswfSwgY29uIGVsIHZhbG9yIHsxfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzI9RXJyb3IgYWwgZXN0YWJsZWNlciBhdHJpYnV0bywgbm8gc2UgcHVlZGUgZXN0YWJsZWNlciBlbCB2YWxvciBwYXJhIGxhIGNhcmFjdGVyXHUwMGVkc3RpY2E9ezB9LCBvYmpldG89ezF9LCB2YWxvcj17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8zPU5vIHNlIHNhYmUgY1x1MDBmM21vIGVzdGFibGVjZXIgZWwgdmFsb3IgcGFyYSBsYSBjYXJhY3Rlclx1MDBlZHN0aWNhPXswfSwgb2JqZXRvPXsxfSwgdmFsb3I9ezJ9DQoteG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPUVycm9yIGFsIGVzdGFibGVjZXIgcmVmZXJlbmNpYSwgbm8gc2UgcHVlZGUgZXN0YWJsZWNlciBlbCB2YWxvciBwYXJhIGxhIGNhcmFjdGVyXHUwMGVkc3RpY2E9ezB9LCBvYmpldG89ezF9LCB2YWxvcj17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3Byb2Nlc3Nfd3JvbmdfY29udGFpbmVyPUVsIHByb2Nlc28gJyd7MH0nJyBubyB0aWVuZSB1biBjb250ZW5lZG9yIHZcdTAwZTFsaWRvLiBFbCBjb250ZW5lZG9yIGVzIGRlbCB0aXBvICcnezF9JycsIHF1ZSBubyBlcyB1biBQcm9jZXNzcGFja2FnZQ0KLXhtbExpYnJhcnlfbmV3X2lkPUVsIGVsZW1lbnRvIHswfSBzZSBoYSBhc2lnbmFkbyBjb24gdW4gSUQgbnVldm8gezF9IHBvcnF1ZSBubyB0aWVuZSB1bm8gdlx1MDBlMWxpZG8NCi14bWxMaWJyYXJ5X2lkX25vdF91bmlxdWU9TVx1MDBlMXMgZGUgdW4gZWxlbWVudG8gdXRpbGl6YSBlbCBJRCBkZSBlbGVtZW50byAnJ3swfScnDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZWVmMWUwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmRfdGl0bGU9RXhwb3J0ZXIgZW4gbGFuZ2FnZSBYTUwNCi0NCi0jIFNlbGVjdCBFeHBvcnQgVHlwZSBXaXphcmQgUGFnZQ0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M9U1x1MDBlOWxlY3Rpb25uZXogbGUgdHlwZSBkZSBjb250ZW51IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgXHUwMGUwIGV4cG9ydGVyLg0KLWV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbl90ZXh0PUV4cG9ydGVyIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZW50aVx1MDBlOHJlDQotZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ9RXhwb3J0ZXIgdW4gb3UgcGx1c2lldXJzIHBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZQ0KLWV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbl90ZXh0PUV4cG9ydGVyIHVuZSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLQ0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9U3BcdTAwZTljaWZpZXIgdW4gZmljaGllciBkJ2V4cG9ydGF0aW9uDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1TcFx1MDBlOWNpZmlleiB1biBmaWNoaWVyIFhNTCBkZSBkZXN0aW5hdGlvbiBwb3VyIHN0b2NrZXIgbGUgY29udGVudSBleHBvcnRcdTAwZTkgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy4NCi1maWxlTGFiZWxfdGV4dD1GaWNoaWVyIFhNTCA6DQotYnJvd3NlQnV0dG9uX3RleHQ9UGFyY291cmlyLi4uDQotDQotIyBPdmVyd3JpdGUgQ29uZmlybWF0aW9uIERpYWxvZw0KLW92ZXJ3cml0ZVRleHRfbXNnPScnezB9JycgZXhpc3RlIGRcdTAwZTlqXHUwMGUwLlxuVm91bGV6LXZvdXMgbCcnXHUwMGU5Y3Jhc2VyID8NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotZXhwb3J0aW5nWE1MX3RleHQ9RXhwb3J0YXRpb24gZHUgY29udGVudSBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGRhbnMgbGUgZmljaGllciBYTUwuLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9TGUgZmljaGllciBYTUwgc3BcdTAwZTljaWZpXHUwMGU5IGVzdCBub24gdmFsaWRlLg0KLWV4cG9ydFhNTFdpemFyZF9lcnJvcj1JVVBNMDAwMEUgOiBFY2hlYyBkZSBsJydleHBvcnRhdGlvbiA6IHswfQ0KLWV4cG9ydFhNTFdpemFyZF9yZXZpZXdMb2c9RXhwb3J0YXRpb24gdGVybWluXHUwMGU5ZS4gQ29uc3VsdGV6IGxlcyBmaWNoaWVycyBqb3VybmF1eCBkYW5zIGxlIHJcdTAwZTlwZXJ0b2lyZSBkJ2V4cG9ydGF0aW9uLg0KLWV4cG9ydFhNTFNlcnZpY2VfZXJyb3I9RXJyZXVyIGxvcnMgZGUgbCcnZXhwb3J0YXRpb24gZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgOiB7MH0NCi1leHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3I9RXJyZXVyIGxvcnMgZGUgbGEgZFx1MDBlOWZpbml0aW9uIGRlIGxhIHZhbGV1ciBkZSBsYSBmb25jdGlvbiA6IEVsZW1lbnQ9ezB9LCBmZWF0dXJlPXsxfQ0KLXhtbExpYnJhcnlfZXJyb3JfbG9hZF94bWw9SW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGxhIHNvdXJjZSBYTUwgJyd7MH0nJw0KLXhtbExpYnJhcnlfbm9fcGx1Z2luPVBhcyBkZSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZSBwb3VyIGwnJ2lkZW50aWZpY2F0ZXVyIHswfQ0KLXhtbExpYnJhcnlfbm9fZmVhdHVyZT1JbXBvc3NpYmxlIGQnJ29idGVuaXIgbGEgZm9uY3Rpb24gWE1MIHBvdXIgezB9X3sxfQ0KLXhtbExpYnJhcnlfbm9fY2xhc3M9SW1wb3NzaWJsZSBkJydvYnRlbmlyIEVDbGFzcyBwb3VyIHswfQ0KLXhtbExpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9RXJyZXVyIGxvcnMgZGUgbGEgY3JcdTAwZTlhdGlvbiBkJyd1biBcdTAwZTlsXHUwMGU5bWVudCwgSWdub3JlIGNvbW1lbnQgZFx1MDBlOWZpbmlyIGxhIHZhbGV1ciBkZSBsYSBmb25jdGlvbiB7MH0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZT1FcnJldXIgbG9ycyBkZSBsYSBjclx1MDBlOWF0aW9uIGQnJ3VuIFx1MDBlOWxcdTAwZTltZW50LCBJbXBvc3NpYmxlIGRlIGRcdTAwZTlmaW5pciBsYSB2YWxldXIgezB9IHBvdXIgbGUgY29udGVuZXVyIHsxfQ0KLXhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlPVZhbGV1ciBkZSBsYSBmb25jdGlvbiBkJydhdHRyaWJ1dCBub24gdmFsaWRlIHBvdXIgbGEgZm9uY3Rpb24gezB9LCBhdmVjIGxhIHZhbGV1ciB7MX0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8yPUVycmV1ciBsb3JzIGRlIGxhIGRcdTAwZTlmaW5pdGlvbiBkJyd1biBhdHRyaWJ1dCwgSW1wb3NzaWJsZSBkZSBkXHUwMGU5ZmluaXIgdW5lIHZhbGV1ciBwb3VyIGZlYXR1cmU9ezB9LCBvYmplY3Q9ezF9LCB2YWx1ZT17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8zPUlnbm9yZSBjb21tZW50IGRcdTAwZTlmaW5pciB1bmUgdmFsZXVyIHBvdXIgZmVhdHVyZT17MH0sIG9iamVjdD17MX0sIHZhbHVlPXsyfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1FcnJldXIgbG9ycyBkZSBsYSBkXHUwMGU5ZmluaXRpb24gZCcndW5lIHJcdTAwZTlmXHUwMGU5cmVuY2UsIEltcG9zc2libGUgZGUgZFx1MDBlOWZpbmlyIHVuZSB2YWxldXIgcG91ciBmZWF0dXJlPXswfSwgb2JqZWN0PXsxfSwgdmFsdWU9ezJ9DQoteG1sTGlicmFyeV9lcnJvcl9wcm9jZXNzX3dyb25nX2NvbnRhaW5lcj1MZSBwcm9jZXNzdXMgJyd7MH0nJyBuJydhIHBhcyBkZSBjb250ZW5ldXIgdmFsaWRlLiBMZSBjb250ZW5ldXIgZXN0IGRlIHR5cGUgJyd7MX0nJyBxdWkgbicnZXN0IHBhcyB1biBwYWNrYWdlIGRlIHByb2Nlc3N1cw0KLXhtbExpYnJhcnlfbmV3X2lkPUwnJ1x1MDBlOWxcdTAwZTltZW50IHswfSBlc3QgYWZmZWN0XHUwMGU5IFx1MDBlMCB1biBub3V2ZWwgaWRlbnRpZmljYXRldXIgezF9IGNhciBpbCBuZSBkaXNwb3NlIHBhcyBkJyd1biBpZGVudGlmaWNhdGV1ciB2YWxpZGUNCi14bWxMaWJyYXJ5X2lkX25vdF91bmlxdWU9TCcnaWRlbnRpZmljYXRldXIgZGUgbCcnXHUwMGU5bFx1MDBlOW1lbnQgJyd7MH0nJyBlc3QgdXRpbGlzXHUwMGU5IHBhciBwbHVzaWV1cnMgXHUwMGU5bFx1MDBlOW1lbnRzDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDllZTI0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmRfdGl0bGU9RXNwb3J0YSBYTUwNCi0NCi0jIFNlbGVjdCBFeHBvcnQgVHlwZSBXaXphcmQgUGFnZQ0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M9U2VsZXppb25hcmUgaWwgdGlwbyBkaSBjb250ZW51dG8gZGVsbGEgbGlicmVyaWEgZGVsIG1ldG9kbyBkYSBlc3BvcnRhcmUuDQotZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uX3RleHQ9RXNwb3J0YSBsJ2ludGVyYSBsaWJyZXJpYSBkZWwgbWV0b2RvDQotZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ9RXNwb3J0YSB1bm8gbyBwaVx1MDBmOSBwbHVnLWluIGRlbCBtZXRvZG8NCi1leHBvcnRDb25maWdzUmFkaW9CdXR0b25fdGV4dD1Fc3BvcnRhIHVuYSBjb25maWd1cmF6aW9uZSBtZXRvZG8NCi0NCi0jIFNlbGVjdCBEZXN0aW5hdGlvbiBYTUwgRmlsZSBXaXphcmQgUGFnZQ0KLXNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlPVNwZWNpZmljYSBpbCBmaWxlIGRpIGVzcG9ydGF6aW9uZQ0KLXNlbGVjdFhNTEZpbGVQYWdlX2Rlc2M9U3BlY2lmaWNhcmUgdW4gZmlsZSBkaSBkZXN0aW5hemlvbmUgWE1MIHBlciBtZW1vcml6emFyZSBpbCBjb250ZW51dG8gZGVsbGEgbGlicmVyaWEgZGVsIG1ldG9kbyBlc3BvcnRhdG8uDQotZmlsZUxhYmVsX3RleHQ9RmlsZSBYTUw6DQotYnJvd3NlQnV0dG9uX3RleHQ9U2ZvZ2xpYS4uLg0KLQ0KLSMgT3ZlcndyaXRlIENvbmZpcm1hdGlvbiBEaWFsb2cNCi1vdmVyd3JpdGVUZXh0X21zZz0nJ3swfScnIGVzaXN0ZSBnaVx1MDBlMC5cblNvdnJhc2NyaXZlcmxvPw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1leHBvcnRpbmdYTUxfdGV4dD1Fc3BvcnRhemlvbmUgZGVsIGNvbnRlbnV0byBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIHN1IHVuIGZpbGUgWE1MIGluIGNvcnNvLi4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWRYTUxGaWxlX2Vycm9yPUlsIGZpbGUgWE1MIHNwZWNpZmljYXRvIG5vbiBcdTAwZTggdmFsaWRvLg0KLWV4cG9ydFhNTFdpemFyZF9lcnJvcj1JVVBNMDAwMEU6IEVzcG9ydGF6aW9uZSBub24gcml1c2NpdGE6IHswfQ0KLWV4cG9ydFhNTFdpemFyZF9yZXZpZXdMb2c9RXNwb3J0YXppb25lIGNvbXBsZXRhdGEuIFJpZXNhbWluYXJlIGkgZmlsZSBkaSBsb2cgbmVsbGEgZGlyZWN0b3J5IGRpIGVzcG9ydGF6aW9uZS4NCi1leHBvcnRYTUxTZXJ2aWNlX2Vycm9yPUVycm9yZSBkdXJhbnRlIGwnJ2VzcG9ydGF6aW9uZSBkZWxsYSBsaWJyZXJpYTogezB9DQotZXhwb3J0WE1MU2VydmljZV9mZWF0dXJlX2Vycm9yPUVycm9yZSBkdXJhbnRlIGwnJ2ltcG9zdGF6aW9uZSBkZWwgdmFsb3JlIGZ1bnppb25lOjogRWxlbWVudG89ezB9LCBmdW56aW9uZT17MX0NCi14bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sPUltcG9zc2liaWxlIGNhcmljYXJlIGwnJ29yaWdpbmUgeG1sICcnezB9JycNCi14bWxMaWJyYXJ5X25vX3BsdWdpbj1OZXNzdW4gTWV0aG9kUGx1Z2luIHBlciBsJydpZCB7MH0NCi14bWxMaWJyYXJ5X25vX2ZlYXR1cmU9SW1wb3NzaWJpbGUgb3R0ZW5lcmUgbGEgZnVuemlvbmUgWG1sIHBlciB7MH1fezF9DQoteG1sTGlicmFyeV9ub19jbGFzcz1JbXBvc3NpYmlsZSBvdHRlbmVyZSBFQ2xhc3MgcGVyIHswfQ0KLXhtbExpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9RXJyb3JlIGR1cmFudGUgbGEgY3JlYXppb25lIGRlbGwnJ2VsZW1lbnRvLiBJbXBvc3NpYmlsZSBpbXBvc3RhcmUgaWwgdmFsb3JlIGRlbGxhIGZ1bnppb25lIHswfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlPUVycm9yZSBkdXJhbnRlIGxhIGNyZWF6aW9uZSBkZWxsJydlbGVtZW50by4gSW1wb3NzaWJpbGUgaW1wb3N0YXJlICBpbCB2YWxvcmUgezB9IHN1bCBjb250ZW5pdG9yZSB7MX0NCi14bWxMaWJyYXJ5X2ludmFsaWRfZmVhdHVyZV92YWx1ZT1WYWxvcmUgZnVuemlvbmUgYXR0cmlidXRvIG5vbiB2YWxpZG8gcGVyIGxhIGZ1bnppb25lIHswfSwgY29uIHZhbG9yZSB7MX0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8yPUVycm9yZSBkdXJhbnRlIGwnJ2ltcG9zdGF6aW9uZSBkZWxsJydhdHRyaWJ1dG8uIEltcG9zc2liaWxlIGltcG9zdGFyZSBpbCB2YWxvcmUgcGVyIGZ1bnppb25lPXswfSwgb2dnZXR0bz17MX0sIHZhbG9yZT17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8zPUltcG9zc2liaWxlIGltcG9zdGFyZSBpbCB2YWxvcmUgcGVyIGZ1bnppb25lPXswfSwgb2dnZXR0bz17MX0sIHZhbG9yZT17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9RXJyb3JlIGR1cmFudGUgbCcnaW1wb3N0YXppb25lIGRlbCByaWZlcmltZW50by4gSW1wb3NzaWJpbGUgaW1wb3N0YXJlIGlsIHZhbG9yZSBwZXIgZnVuemlvbmU9ezB9LCBvZ2dldHRvPXsxfSwgdmFsb3JlPXsyfQ0KLXhtbExpYnJhcnlfZXJyb3JfcHJvY2Vzc193cm9uZ19jb250YWluZXI9SWwgcHJvY2Vzc28gJyd7MH0nJyBub24gZGlzcG9uZSBkaSB1biBjb250ZW5pdG9yZSB2YWxpZG8uIElsIGNvbnRlbml0b3JlIFx1MDBlOCBkaSB0aXBvICcnezF9JycsIGNoZSBub24gXHUwMGU4IHVuIFByb2Nlc3NwYWNrYWdlDQoteG1sTGlicmFyeV9uZXdfaWQ9QWxsJydlbGVtZW50byB7MH0gdmllbmUgYXNzZWduYXRvIHVuIG51b3ZvIGlkIHsxfSBwb2ljaFx1MDBlOSBub24gbmUgZGlzcG9uZSBkaSB1bm8gdmFsaWRvDQoteG1sTGlicmFyeV9pZF9ub3RfdW5pcXVlPUwnJ0lkIGVsZW1lbnRvICcnezB9JycgdmllbmUgdXNhdG8gZGEgcGlcdTAwZjkgZGkgdW4gZWxlbWVudG8gDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NWViNjYxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmRfdGl0bGU9WE1MIFx1MzA2ZVx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOA0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBUeXBlIFdpemFyZCBQYWdlDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTlcdTMwOGJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNmVcdTMwYmZcdTMwYTRcdTMwZDdcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1leHBvcnRMaWJyYXJ5UmFkaW9CdXR0b25fdGV4dD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTUxNjhcdTRmNTNcdTMwOTJcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzgNCi1leHBvcnRQbHVnaW5zUmFkaW9CdXR0b25fdGV4dD0xIFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOA0KLWV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbl90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOA0KLQ0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9XHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHU2MzA3XHU1YjlhDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNTlcdTMwOGIgWE1MIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWZpbGVMYWJlbF90ZXh0PVhNTCBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWI6DQotYnJvd3NlQnV0dG9uX3RleHQ9XHU1M2MyXHU3MTY3Li4uDQotDQotIyBPdmVyd3JpdGUgQ29uZmlybWF0aW9uIERpYWxvZw0KLW92ZXJ3cml0ZVRleHRfbXNnPScnezB9JycgXHUzMDZmXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyXG5cdTRlMGFcdTY2ZjhcdTMwNGRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydGluZ1hNTF90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA5MiBYTUwgXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZiXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDdlXHUzMDU5Li4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWRYTUxGaWxlX2Vycm9yPVx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1ZiBYTUwgXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyDQotZXhwb3J0WE1MV2l6YXJkX2Vycm9yPUlVUE0wMDAwRTogXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZmXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0NCi1leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nPVx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA0Y1x1NWI4Y1x1NGU4Nlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmJcdTMwNDJcdTMwOGJcdTMwZWRcdTMwYjBcdTMwZmJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTc4YmFcdThhOGRcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1leHBvcnRYTUxTZXJ2aWNlX2Vycm9yPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzBmYlx1MzBhOFx1MzBlOVx1MzBmYzogezB9DQotZXhwb3J0WE1MU2VydmljZV9mZWF0dXJlX2Vycm9yPVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzBmY1x1NTAyNDo6IFx1ODk4MVx1N2QyMD17MH1cdTMwMDFcdTMwZDVcdTMwYTNcdTMwZmNcdTMwYzFcdTMwZTNcdTMwZmM9ezF9IFx1MzA2ZVx1OGEyZFx1NWI5YVx1MzBhOFx1MzBlOVx1MzBmYw0KLXhtbExpYnJhcnlfZXJyb3JfbG9hZF94bWw9eG1sIFx1MzBiZFx1MzBmY1x1MzBiOSAnJ3swfScnIFx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLXhtbExpYnJhcnlfbm9fcGx1Z2luPUlEIHswfSBcdTMwNmUgTWV0aG9kUGx1Z2luIFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLXhtbExpYnJhcnlfbm9fZmVhdHVyZT17MH1fezF9IFx1MzA2ZSBYbWwgXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGZjXHUzMDkyXHU1M2Q2XHU1Zjk3XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzDQoteG1sTGlicmFyeV9ub19jbGFzcz17MH0gXHUzMDZlIEVDbGFzcyBcdTMwOTJcdTUzZDZcdTVmOTdcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMNCi14bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PVx1ODk4MVx1N2QyMFx1MzA2ZVx1NGY1Y1x1NjIxMFx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OVx1MzAwMlx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzBmYyB7MH0gXHUzMDZlXHU1MDI0XHUzMDZlXHU4YTJkXHU1YjlhXHU2NWI5XHU2Y2Q1XHUzMDRjXHU0ZTBkXHU2NjBlXHUzMDY3XHUzMDU5DQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWU9XHU4OTgxXHU3ZDIwXHUzMDZlXHU0ZjVjXHU2MjEwXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5XHUzMDAyXHU1MDI0IHswfSBcdTMwOTJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwZmMgezF9IFx1MzA2Ylx1OGEyZFx1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLXhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlPVx1NTAyNCB7MX0gXHUzMDkyXHU2MzAxXHUzMDY0XHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGZjIHswfSBcdTMwNmVcdTVjNWVcdTYwMjdcdTMwZDVcdTMwYTNcdTMwZmNcdTMwYzFcdTMwZTNcdTMwZmNcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTkNCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8yPVx1NWM1ZVx1NjAyN1x1MzA2ZVx1OGEyZFx1NWI5YVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OVx1MzAwMlx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzBmYz17MH1cdTMwMDFcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzg9ezF9XHUzMDAxXHU1MDI0PXsyfSBcdTMwNmVcdTUwMjRcdTMwOTJcdThhMmRcdTViOWFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMNCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8zPVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzBmYz17MH1cdTMwMDFcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzg9ezF9XHUzMDAxXHU1MDI0PXsyfSBcdTMwNmVcdTUwMjRcdTMwNmVcdThhMmRcdTViOWFcdTY1YjlcdTZjZDVcdTMwNGNcdTRlMGRcdTY2MGVcdTMwNjdcdTMwNTkNCi14bWxMaWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9XHU1M2MyXHU3MTY3XHUzMDZlXHU4YTJkXHU1YjlhXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5XHUzMDAyXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGZjPXswfVx1MzAwMVx1MzBhYVx1MzBkNlx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOD17MX1cdTMwMDFcdTUwMjQ9ezJ9IFx1MzA2ZVx1NTAyNFx1MzA5Mlx1OGEyZFx1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLXhtbExpYnJhcnlfZXJyb3JfcHJvY2Vzc193cm9uZ19jb250YWluZXI9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5ICcnezB9JycgXHUzMDZiXHU2NzA5XHU1MmI5XHUzMDZhXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMGZjXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyIFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzBmY1x1MzA2ZVx1MzBiZlx1MzBhNFx1MzBkNyAnJ3sxfScnIFx1MzA2ZiBQcm9jZXNzcGFja2FnZSBcdTMwNjdcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMNCi14bWxMaWJyYXJ5X25ld19pZD1cdTg5ODFcdTdkMjAgezB9IFx1MzA2Ylx1NjcwOVx1NTJiOVx1MzA2YSBJRCBcdTMwNGNcdTMwNmFcdTMwNDRcdTMwNWZcdTMwODFcdTMwMDFcdTY1YjBcdTg5OGYgSUQgezF9IFx1MzA0Y1x1NTI3Mlx1MzA4YVx1NWY1M1x1MzA2Nlx1MzA4OVx1MzA4Y1x1MzA3ZVx1MzA1OQ0KLXhtbExpYnJhcnlfaWRfbm90X3VuaXF1ZT1cdTg5ODFcdTdkMjAgSUQgJyd7MH0nJyBcdTMwNmZcdTg5MDdcdTY1NzBcdTMwNmVcdTg5ODFcdTdkMjBcdTMwNmJcdTMwODhcdTMwNjNcdTMwNjZcdTRmN2ZcdTc1MjhcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkNCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ2Y2MzM2IuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZToNCi0jDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZF90aXRsZT1YTUwgXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwDQotDQotIyBTZWxlY3QgRXhwb3J0IFR5cGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVx1YjBiNFx1YmNmNFx1YjBiYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1Y2VlOFx1ZDE1MFx1Y2UyMFx1Yzc1OCBcdWM3MjBcdWQ2MTVcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbl90ZXh0PVx1YzgwNFx1Y2NiNCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMA0KLWV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbl90ZXh0PVx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzANCi1leHBvcnRDb25maWdzUmFkaW9CdXR0b25fdGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxIFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMA0KLQ0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9XHViMGI0XHViY2Y0XHViMGI0XHVhZTMwIFx1ZDMwY1x1Yzc3YyBcdWM5YzBcdWM4MTUNCi1zZWxlY3RYTUxGaWxlUGFnZV9kZXNjPVx1YjBiNFx1YmNmNFx1YjBiYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1Y2VlOFx1ZDE1MFx1Y2UyMFx1Yjk3YyBcdWM4MDBcdWM3YTVcdWQ1NjAgXHViMzAwXHVjMGMxIFhNTCBcdWQzMGNcdWM3N2NcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWZpbGVMYWJlbF90ZXh0PVhNTCBcdWQzMGNcdWM3N2M6DQotYnJvd3NlQnV0dG9uX3RleHQ9XHVjYzNlXHVjNTQ0XHViY2Y0XHVhZTMwLi4uDQotDQotIyBPdmVyd3JpdGUgQ29uZmlybWF0aW9uIERpYWxvZw0KLW92ZXJ3cml0ZVRleHRfbXNnPScnezB9JycgXHVkNTZkXHViYWE5XHVjNzc0IFx1Yzc3NFx1YmJmOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuXG5cdWFjYjlcdWNjZDBcdWM0ZjBcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydGluZ1hNTF90ZXh0PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjZWU4XHVkMTUwXHVjZTIwXHViOTdjIFhNTCBcdWQzMGNcdWM3N2NcdWI4NWMgXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwLi4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWRYTUxGaWxlX2Vycm9yPVx1YzljMFx1YzgxNVx1ZDU1YyBYTUwgXHVkMzBjXHVjNzdjXHVjNzc0IFx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWMyYjVcdWIyYzhcdWIyZTQuDQotZXhwb3J0WE1MV2l6YXJkX2Vycm9yPUlVUE0wMDAwRTogXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwIFx1YzJlNFx1ZDMyODogezB9DQotZXhwb3J0WE1MV2l6YXJkX3Jldmlld0xvZz1cdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzBcdWFjMDAgXHVjNjQ0XHViOGNjXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LiBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHVjNWQwIFx1Yzc4OFx1YjI5NCBcdWI4NWNcdWFkZjggXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YWM4MFx1ZDFhMFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1leHBvcnRYTUxTZXJ2aWNlX2Vycm9yPVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHVjNjI0XHViOTU4OiB7MH0NCi1leHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3I9XHVhZTMwXHViMmE1IFx1YWMxMiBcdWMxMjRcdWM4MTUgXHVjNjI0XHViOTU4OjogXHVjNjk0XHVjMThjPXswfSwgXHVhZTMwXHViMmE1PXsxfQ0KLXhtbExpYnJhcnlfZXJyb3JfbG9hZF94bWw9WE1MIFx1YzE4Y1x1YzJhNCAnJ3swfScnXHVjNzQ0KFx1Yjk3YykgXHViODVjXHViNGRjXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQoteG1sTGlicmFyeV9ub19wbHVnaW49SUQgezB9XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzc0IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi14bWxMaWJyYXJ5X25vX2ZlYXR1cmU9ezB9X3sxfVx1YzVkMCBcdWIzMDBcdWQ1NWMgWE1MIFx1YWUzMFx1YjJhNVx1Yzc0NCBcdWFjMDBcdWM4MzhcdWM2MmMgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi14bWxMaWJyYXJ5X25vX2NsYXNzPXswfVx1YzVkMCBcdWIzMDBcdWQ1NWMgRUNsYXNzXHViOTdjIFx1YWMwMFx1YzgzOFx1YzYyYyBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXhtbExpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9XHVjNjk0XHVjMThjIFx1Yzc5MVx1YzEzMSBcdWM2MjRcdWI5NTguIFx1YWUzMFx1YjJhNSB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1YWMxMlx1Yzc0NCBcdWMxMjRcdWM4MTVcdWQ1NThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzU0YyBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlPVx1YzY5NFx1YzE4YyBcdWM3OTFcdWMxMzEgXHVjNjI0XHViOTU4LiB7MH0gXHVhYzEyXHVjNzQ0IHsxfSBcdWNlZThcdWQxNGNcdWM3NzRcdWIxMDhcdWI4NWMgXHVjMTI0XHVjODE1XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQoteG1sTGlicmFyeV9pbnZhbGlkX2ZlYXR1cmVfdmFsdWU9XHVhYzEyIHsxfVx1Yzc0NChcdWI5N2MpIFx1YWMwMFx1YzljNCBcdWFlMzBcdWIyYTUgezB9XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YzE4ZFx1YzEzMSBcdWFlMzBcdWIyYTUgXHVhYzEyDQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMj1cdWMxOGRcdWMxMzEgXHVjMTI0XHVjODE1IFx1YzYyNFx1Yjk1OC4gXHVhZTMwXHViMmE1PXswfSwgXHVjNjI0XHViZTBjXHVjODFkXHVkMmI4PXsxfSwgXHVhYzEyPXsyfVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVhYzEyXHVjNzQ0IFx1YzEyNFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzM9XHVhZTMwXHViMmE1PXswfSwgXHVjNjI0XHViZTBjXHVjODFkXHVkMmI4PXsxfSwgXHVhYzEyPXsyfVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVhYzEyXHVjNzQ0IFx1YzEyNFx1YzgxNVx1ZDU1OFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjNTRjIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQoteG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPVx1Y2MzOFx1Yzg3MCBcdWMxMjRcdWM4MTUgXHVjNjI0XHViOTU4LiBcdWFlMzBcdWIyYTU9ezB9LCBcdWM2MjRcdWJlMGNcdWM4MWRcdWQyYjg9ezF9LCBcdWFjMTI9ezJ9XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWFjMTJcdWM3NDQgXHVjMTI0XHVjODE1XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQoteG1sTGlicmFyeV9lcnJvcl9wcm9jZXNzX3dyb25nX2NvbnRhaW5lcj0nJ3swfScnIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1YWMwMCBcdWM2MmNcdWJjMTRcdWI5NzggXHVjZWU4XHVkMTRjXHVjNzc0XHViMTA4XHViOTdjIFx1YWMwMFx1YzljMFx1YWNlMCBcdWM3ODhcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LiBcdWNlZThcdWQxNGNcdWM3NzRcdWIxMDhcdWM3NTggXHVjNzIwXHVkNjE1XHVjNzc0ICcnezF9JydcdWM3NzRcdWJhNzAgUHJvY2Vzc3BhY2thZ2VcdWFjMDAgXHVjNTQ0XHViMmQ5XHViMmM4XHViMmU0Lg0KLXhtbExpYnJhcnlfbmV3X2lkPXswfSBcdWM2OTRcdWMxOGNcdWFjMDAgXHVjNjJjXHViYzE0XHViOTc4IElEXHViOTdjIFx1YWMwMFx1YzljMFx1YzljMCBcdWM1NGFcdWFlMzAgXHViNTRjXHViYjM4XHVjNWQwIFx1YzBjOCBJRCB7MX1cdWM3NzQoXHVhYzAwKSBcdWM5YzBcdWM4MTVcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQoteG1sTGlicmFyeV9pZF9ub3RfdW5pcXVlPVx1YzY5NFx1YzE4YyBJRCAnJ3swfScnXHVjNzQwKFx1YjI5NCkgXHViNDU4IFx1Yzc3NFx1YzBjMVx1Yzc1OCBcdWM2OTRcdWMxOGNcdWM1ZDAgXHVjNzU4XHVkNTc0IFx1YzBhY1x1YzZhOVx1YjQyOVx1YjJjOFx1YjJlNC4NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdhNjk3NzEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZToNCi0jDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZF90aXRsZT1FeHBvcnRhciBYTUwNCi0NCi0jIFNlbGVjdCBFeHBvcnQgVHlwZSBXaXphcmQgUGFnZQ0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M9U2VsZWNpb25lIG8gdGlwbyBkZSBjb250ZVx1MDBmYWRvIGRlIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG8gYSBzZXIgZXhwb3J0YWRvLg0KLWV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbl90ZXh0PUV4cG9ydGFyIGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kbyBpbnRlaXJhDQotZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ9RXhwb3J0YXIgdW0gb3UgbWFpcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbw0KLWV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbl90ZXh0PUV4cG9ydGFyIHVtYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvDQotDQotIyBTZWxlY3QgRGVzdGluYXRpb24gWE1MIEZpbGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1Fc3BlY2lmaWNhciBhcnF1aXZvIGRlIGV4cG9ydGFcdTAwZTdcdTAwZTNvDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1Fc3BlY2lmaXF1ZSB1bSBhcnF1aXZvIFhNTCBkZSBkZXN0aW5vIHBhcmEgYXJtYXplbmFyIG8gY29udGVcdTAwZmFkbyBleHBvcnRhZG8gZGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kby4NCi1maWxlTGFiZWxfdGV4dD1BcnF1aXZvIFhNTDoNCi1icm93c2VCdXR0b25fdGV4dD1Qcm9jdXJhci4uLg0KLQ0KLSMgT3ZlcndyaXRlIENvbmZpcm1hdGlvbiBEaWFsb2cNCi1vdmVyd3JpdGVUZXh0X21zZz0nJ3swfScnIGpcdTAwZTEgZXhpc3RlLlxuRGVzZWphIHNvYnJlc2NyZXZcdTAwZWEtbG8/DQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydGluZ1hNTF90ZXh0PUV4cG9ydGFyIGNvbnRlXHUwMGZhZG8gZGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kbyBwYXJhIG8gYXJxdWl2byBYTUwuLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9TyBhcnF1aXZvIFhNTCBlc3BlY2lmaWNhZG8gblx1MDBlM28gXHUwMGU5IHZcdTAwZTFsaWRvLg0KLWV4cG9ydFhNTFdpemFyZF9lcnJvcj1JVVBNMDAwMEU6IEEgZXhwb3J0YVx1MDBlN1x1MDBlM28gZmFsaG91OiB7MH0NCi1leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nPUV4cG9ydGFcdTAwZTdcdTAwZTNvIGNvbmNsdVx1MDBlZGRhLiBSZXZpc2Ugb3MgYXJxdWl2b3MgZGUgbG9nIG5vIGRpcmV0XHUwMGYzcmlvIGRlIGV4cG9ydGFcdTAwZTdcdTAwZTNvLg0KLWV4cG9ydFhNTFNlcnZpY2VfZXJyb3I9RXJybyBhbyBleHBvcnRhciBiaWJsaW90ZWNhOiB7MH0NCi1leHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3I9RXJybyBhbyBkZWZpbmlyIHZhbG9yIGRlIHJlY3Vyc286OiBFbGVtZW50bz17MH0sIHJlY3Vyc289ezF9DQoteG1sTGlicmFyeV9lcnJvcl9sb2FkX3htbD1JbXBvc3NcdTAwZWR2ZWwgY2FycmVnYXIgb3JpZ2VtIHhtbCAnJ3swfScnDQoteG1sTGlicmFyeV9ub19wbHVnaW49TmVuaHVtIE1ldGhvZFBsdWdpbiBwYXJhIG8gaWQgezB9DQoteG1sTGlicmFyeV9ub19mZWF0dXJlPUltcG9zc1x1MDBlZHZlbCBvYnRlciByZWN1cnNvIFhtbCBwYXJhIHswfV97MX0NCi14bWxMaWJyYXJ5X25vX2NsYXNzPUltcG9zc1x1MDBlZHZlbCBvYnRlciBFQ2xhc3MgcGFyYSB7MH0NCi14bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PUVycm8gYW8gY3JpYXIgZWxlbWVudG87IHNlbSBzYWJlciBjb21vIGRlZmluaXIgbyB2YWxvciBkbyByZWN1cnNvIHswfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlPUVycm8gYW8gY3JpYXIgZWxlbWVudG87IG5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGRlZmluaXIgbyB2YWxvciB7MH0gcGFyYSBvIGNvbnRcdTAwZWFpbmVyIHsxfQ0KLXhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlPVZhbG9yIGRlIHJlY3Vyc28gZGUgYXRyaWJ1dG8gaW52XHUwMGUxbGlkbyBwYXJhIG8gcmVjdXJzbyB7MH0sIGNvbSBvIHZhbG9yIHsxfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzI9RXJybyBhbyBkZWZpbmlyIGF0cmlidXRvOyBuXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCBkZWZpbmlyIHZhbG9yIHBhcmEgcmVjdXJzbz17MH0sIG9iamV0bz17MX0sIHZhbG9yPXsyfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzM9U2VtIHNhYmVyIGNvbW8gZGVmaW5pciB2YWxvciBwYXJhIHJlY3Vyc289ezB9LCBvYmpldG89ezF9LCB2YWxvcj17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9RXJybyBhbyBkZWZpbmlyIHJlZmVyXHUwMGVhbmNpYTsgblx1MDBlM28gXHUwMGU5IHBvc3NcdTAwZWR2ZWwgZGVmaW5pciB2YWxvciBwYXJhIHJlY3Vyc289ezB9LCBvYmpldG89ezF9LCB2YWxvcj17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3Byb2Nlc3Nfd3JvbmdfY29udGFpbmVyPXByb2Nlc3NvICcnezB9Jycgblx1MDBlM28gdGVtIHVtIGNvbnRcdTAwZWFpbmVyIHZcdTAwZTFsaWRvLiBPIGNvbnRcdTAwZWFpbmVyIFx1MDBlOSBkbyB0aXBvICcnezF9JycsIHF1ZSBuXHUwMGUzbyBcdTAwZTkgdW0gUHJvY2Vzc3BhY2thZ2UNCi14bWxMaWJyYXJ5X25ld19pZD1PIGVsZW1lbnRvIHswfSByZWNlYmV1IHVtIG5vdm8gaWQgezF9IHBvcnF1ZSBuXHUwMGUzbyB0ZW0gdW0gdlx1MDBlMWxpZG8NCi14bWxMaWJyYXJ5X2lkX25vdF91bmlxdWU9TyBJZCAnJ3swfScnIGRvIGVsZW1lbnRvIFx1MDBlOSB1dGlsaXphZG8gcG9yIG1haXMgZGUgdW0gZWxlbWVudG8NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViNTdiMzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZToNCi0jDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZF90aXRsZT1cdTViZmNcdTUxZmEgWE1MDQotDQotIyBTZWxlY3QgRXhwb3J0IFR5cGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVx1OTAwOVx1NjJlOVx1ODk4MVx1NWJmY1x1NTFmYVx1NzY4NFx1NjViOVx1NmNkNVx1NWU5M1x1NTE4NVx1NWJiOVx1NzY4NFx1N2M3Ylx1NTc4Ylx1MzAwMg0KLWV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbl90ZXh0PVx1NWJmY1x1NTFmYVx1NjU3NFx1NGUyYVx1NjViOVx1NmNkNVx1NWU5Mw0KLWV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbl90ZXh0PVx1NWJmY1x1NTFmYVx1NGUwMFx1NGUyYVx1NjIxNlx1NTkxYVx1NGUyYVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLWV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbl90ZXh0PVx1NWJmY1x1NTFmYVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLQ0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9XHU2MzA3XHU1YjlhXHU1YmZjXHU1MWZhXHU2NTg3XHU0ZWY2DQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1cdTYzMDdcdTViOWFcdTRlMDBcdTRlMmFcdTc2ZWVcdTY4MDcgWE1MIFx1NjU4N1x1NGVmNlx1ZmYwY1x1NzUyOFx1NGU4ZVx1NWI1OFx1NTBhOFx1NWJmY1x1NTFmYVx1NzY4NFx1NjViOVx1NmNkNVx1NWU5M1x1NTE4NVx1NWJiOVx1MzAwMg0KLWZpbGVMYWJlbF90ZXh0PVhNTCBcdTY1ODdcdTRlZjZcdWZmMWENCi1icm93c2VCdXR0b25fdGV4dD1cdTZkNGZcdTg5YzguLi4NCi0NCi0jIE92ZXJ3cml0ZSBDb25maXJtYXRpb24gRGlhbG9nDQotb3ZlcndyaXRlVGV4dF9tc2c9XHUyMDFjezB9XHUyMDFkXHU1ZGYyXHU3ZWNmXHU1YjU4XHU1NzI4XHUzMDAyXG5cdTg5ODFcdTg5ODZcdTc2ZDZcdTViODNcdTU0MTdcdWZmMWYNCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotZXhwb3J0aW5nWE1MX3RleHQ9XHU1YzA2XHU2NWI5XHU2Y2Q1XHU1ZTkzXHU1MTg1XHU1YmI5XHU1YmZjXHU1MWZhXHU1MjMwIFhNTCBcdTY1ODdcdTRlZjYuLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9XHU2MzA3XHU1YjlhXHU3Njg0IFhNTCBcdTY1ODdcdTRlZjZcdTY1ZTBcdTY1NDhcdTMwMDINCi1leHBvcnRYTUxXaXphcmRfZXJyb3I9SVVQTTAwMDBFOiBcdTViZmNcdTUxZmFcdTU5MzFcdThkMjVcdWZmMWF7MH0NCi1leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nPVx1NWJmY1x1NTFmYVx1NWI4Y1x1NjIxMFx1MzAwMlx1OGJmN1x1NjdlNVx1NzcwYlx1NWJmY1x1NTFmYVx1NzZlZVx1NWY1NVx1NGUwYlx1NzY4NFx1NjVlNVx1NWZkN1x1NjU4N1x1NGVmNlx1MzAwMg0KLWV4cG9ydFhNTFNlcnZpY2VfZXJyb3I9XHU1YmZjXHU1MWZhXHU1ZTkzXHU2NWY2XHU1MWZhXHU5NTE5XHVmZjFhezB9DQotZXhwb3J0WE1MU2VydmljZV9mZWF0dXJlX2Vycm9yPVx1OGJiZVx1N2Y2ZVx1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNlx1NTAzY1x1NjVmNlx1NTFmYVx1OTUxOVx1ZmYxYUVsZW1lbnQ9ezB9XHVmZjBjZmVhdHVyZT17MX0NCi14bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sPVx1NjVlMFx1NmNkNVx1ODhjNVx1NTE2NSBYTUwgXHU2ZTkwXHUyMDFjezB9XHUyMDFkDQoteG1sTGlicmFyeV9ub19wbHVnaW49XHU0ZTBkXHU1YjU4XHU1NzI4XHU2ODA3XHU4YmM2XHU0ZTNhIHswfSBcdTc2ODRcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi14bWxMaWJyYXJ5X25vX2ZlYXR1cmU9XHU2NWUwXHU2Y2Q1XHU4M2I3XHU1Zjk3IHswfV97MX0gXHU3Njg0IFhtTCBcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjYNCi14bWxMaWJyYXJ5X25vX2NsYXNzPVx1NjVlMFx1NmNkNVx1ODNiN1x1NWY5NyB7MH0gXHU3Njg0IEVDbGFzcw0KLXhtbExpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9XHU1MjFiXHU1ZWZhXHU1MTQzXHU3ZDIwXHU2NWY2XHU1MWZhXHU5NTE5XHVmZjBjXHU0ZTBkXHU3N2U1XHU5MDUzXHU1OTgyXHU0ZjU1XHU4YmJlXHU3ZjZlXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2IHswfSBcdTc2ODRcdTUwM2NcdTMwMDINCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZT1cdTUyMWJcdTVlZmFcdTUxNDNcdTdkMjBcdTY1ZjZcdTUxZmFcdTk1MTlcdWZmMGNcdTY1ZTBcdTZjZDVcdTRlM2FcdTViYjlcdTU2NjggezF9IFx1OGJiZVx1N2Y2ZVx1NTAzYyB7MH1cdTMwMDINCi14bWxMaWJyYXJ5X2ludmFsaWRfZmVhdHVyZV92YWx1ZT1cdTUyOWZcdTgwZmRcdTkwZThcdTRlZjYgezB9IFx1NzY4NFx1NWM1ZVx1NjAyN1x1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNlx1NTAzYyB7MX0gXHU2NWUwXHU2NTQ4DQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMj1cdThiYmVcdTdmNmVcdTVjNWVcdTYwMjdcdTY1ZjZcdTUxZmFcdTk1MTlcdWZmMGNcdTY1ZTBcdTZjZDVcdThiYmVcdTdmNmVcdTUwM2NcdWZmMGNcdTUzNzNcdTY1ZTBcdTZjZDVcdThiYmVcdTdmNmUgZmVhdHVyZT17MH1cdTMwMDFvYmplY3Q9ezF9XHUzMDAxdmFsdWU9ezJ9DQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMz1cdTRlMGRcdTc3ZTVcdTkwNTNcdTU5ODJcdTRmNTVcdThiYmVcdTdmNmVcdTUwM2NcdWZmMGNcdTUzNzNcdTRlMGRcdTc3ZTVcdTkwNTNcdTU5ODJcdTRmNTVcdThiYmVcdTdmNmUgZmVhdHVyZT17MH1cdTMwMDFvYmplY3Q9ezF9XHUzMDAxdmFsdWU9ezJ9DQoteG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPVx1OGJiZVx1N2Y2ZVx1NWYxNVx1NzUyOFx1NjVmNlx1NTFmYVx1OTUxOVx1ZmYwY1x1NjVlMFx1NmNkNVx1OGJiZVx1N2Y2ZVx1NTAzY1x1ZmYwY1x1NTM3M1x1NjVlMFx1NmNkNVx1OGJiZVx1N2Y2ZSBmZWF0dXJlPXswfVx1MzAwMW9iamVjdD17MX1cdTMwMDF2YWx1ZT17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3Byb2Nlc3Nfd3JvbmdfY29udGFpbmVyPVx1NmQ0MVx1N2EwYiB7MH0gXHU2Y2ExXHU2NzA5XHU2NzA5XHU2NTQ4XHU3Njg0XHU1YmI5XHU1NjY4XHUzMDAyIFx1NWJiOVx1NTY2OFx1N2M3Ylx1NTc4Ylx1NGUzYVx1MjAxY3sxfVx1MjAxZFx1ZmYwY1x1OGJlNVx1N2M3Ylx1NTc4Ylx1NGUwZFx1NjYyZlx1NmQ0MVx1N2EwYlx1NTMwNQ0KLXhtbExpYnJhcnlfbmV3X2lkPVx1NzUzMVx1NGU4ZVx1NTE0M1x1N2QyMCB7MH0gXHU2Y2ExXHU2NzA5XHU2NzA5XHU2NTQ4XHU3Njg0XHU2ODA3XHU4YmM2XHVmZjBjXHU1NmUwXHU4MDBjXHU1ZGYyXHU4OGFiXHU1MjA2XHU5MTRkXHU0ZTg2XHU2NWIwXHU2ODA3XHU4YmM2IHsxfQ0KLXhtbExpYnJhcnlfaWRfbm90X3VuaXF1ZT1cdTUxNDNcdTdkMjBcdTY4MDdcdThiYzYgezB9IFx1ODhhYlx1NTkxYVx1NGUyYVx1NTE0M1x1N2QyMFx1NGY3Zlx1NzUyOA0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2EwY2Y4Ni4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOg0KLSMNCi0NCi0jIEV4cG9ydCBYTUwgV2l6YXJkDQotZXhwb3J0WE1MV2l6YXJkX3RpdGxlPVx1NTMyZlx1NTFmYSBYTUwNCi0NCi0jIFNlbGVjdCBFeHBvcnQgVHlwZSBXaXphcmQgUGFnZQ0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M9XHU5MDc4XHU1M2Q2XHU4OTgxXHU1MzJmXHU1MWZhXHU3Njg0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1MTY3XHU1YmI5XHU3Njg0XHU5ODVlXHU1NzhiXHUzMDAyDQotZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uX3RleHQ9XHU1MzJmXHU1MWZhXHU2NTc0XHU1MDBiXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiDQotZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ9XHU1MzJmXHU1MWZhXHU0ZTAwXHU2MjE2XHU1OTFhXHU1MDBiXHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uX3RleHQ9XHU1MzJmXHU1MWZhXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotDQotIyBTZWxlY3QgRGVzdGluYXRpb24gWE1MIEZpbGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1cdTYzMDdcdTViOWFcdTUzMmZcdTUxZmFcdTZhOTQNCi1zZWxlY3RYTUxGaWxlUGFnZV9kZXNjPVx1NjMwN1x1NWI5YVx1NzZlZVx1NzY4NFx1NTczMCBYTUwgXHU2YTk0XHVmZjBjXHU3NTI4XHU0Zjg2XHU1MTMyXHU1YjU4XHU1MzJmXHU1MWZhXHU3Njg0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1MTY3XHU1YmI5XHUzMDAyDQotZmlsZUxhYmVsX3RleHQ9WE1MIFx1NmE5NFx1ZmYxYQ0KLWJyb3dzZUJ1dHRvbl90ZXh0PVx1NzAwZlx1ODliZC4uLg0KLQ0KLSMgT3ZlcndyaXRlIENvbmZpcm1hdGlvbiBEaWFsb2cNCi1vdmVyd3JpdGVUZXh0X21zZz0nJ3swfScnIFx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlxuXHU2MGE4XHU4OTgxXHU4OTg2XHU1YmViXHU1YjgzXHU1NWNlXHVmZjFmDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydGluZ1hNTF90ZXh0PVx1NWMwN1x1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NzY4NFx1NTE2N1x1NWJiOVx1NTMyZlx1NTFmYVx1NTIzMCBYTUwgXHU2YTk0Li4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWRYTUxGaWxlX2Vycm9yPVx1NjMwN1x1NWI5YVx1NzY4NCBYTUwgXHU2YTk0XHU3MTIxXHU2NTQ4XHUzMDAyDQotZXhwb3J0WE1MV2l6YXJkX2Vycm9yPUlVUE0wMDAwRTogXHU1MzJmXHU1MWZhXHU1OTMxXHU2NTU3XHVmZjFhezB9DQotZXhwb3J0WE1MV2l6YXJkX3Jldmlld0xvZz1cdTUzMmZcdTUxZmFcdTViOGNcdTYyMTBcdTMwMDJcDQotXHU4YWNiXHU2N2U1XHU5NWIxXHU1MzJmXHU1MWZhXHU3NmVlXHU5MzA0XHU0ZTBiXHU3Njg0XHU2NWU1XHU4YThjXHU2YTk0XHUzMDAyDQotZXhwb3J0WE1MU2VydmljZV9lcnJvcj1cdTUzMmZcdTUxZmFcdTdhMGJcdTVmMGZcdTVlYWJcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdWZmMWF7MH0NCi1leHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3I9XHU4YTJkXHU1YjlhXHU3Mjc5XHU2MDI3XHU1MDNjXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHVmZjFhXHU1MTQzXHU3ZDIwPXswfVx1ZmYwY1x1NzI3OVx1NjAyNz17MX0NCi14bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sPVx1NzEyMVx1NmNkNVx1OGYwOVx1NTE2NSBYTUwgXHU0Zjg2XHU2ZTkwICcnezB9JycNCi14bWxMaWJyYXJ5X25vX3BsdWdpbj1JRCB7MH0gXHU2YzkyXHU2NzA5IE1ldGhvZFBsdWdpbg0KLXhtbExpYnJhcnlfbm9fZmVhdHVyZT1cdTcxMjFcdTZjZDVcdTUzZDZcdTVmOTcgezB9X3sxfSBcdTc2ODQgWE1MIFx1NzI3OVx1NjAyNw0KLXhtbExpYnJhcnlfbm9fY2xhc3M9XHU3MTIxXHU2Y2Q1XHU1M2Q2XHU1Zjk3IHswfSBcdTc2ODQgRUNsYXNzDQoteG1sTGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudD1cdTVlZmFcdTdhY2JcdTUxNDNcdTdkMjBcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdWZmMGNcdTRlMGRcdTc3ZTVcdTU5ODJcdTRmNTVcdThhMmRcdTViOWFcdTcyNzlcdTYwMjcgezB9IFx1NzY4NFx1NTAzYw0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlPVx1NWVmYVx1N2FjYlx1NTE0M1x1N2QyMFx1NjY0Mlx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNFx1ZmYwY1x1NzEyMVx1NmNkNVx1NWMwN1x1NTAzYyB7MH0gXHU4YTJkXHU3MGJhXHU1MTMyXHU1YjU4XHU1NjY4IHsxfQ0KLXhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlPVx1NzI3OVx1NjAyNyB7MH0gXHU3Njg0XHU1YzZjXHU2MDI3XHU3Mjc5XHU2MDI3XHU1MDNjXHU3MTIxXHU2NTQ4XHVmZjBjXHU1MDNjXHU3MGJhIHsxfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzI9XHU4YTJkXHU1YjlhXHU1YzZjXHU2MDI3XHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHVmZjBjXHU3MTIxXHU2Y2Q1XHU4YTJkXHU1YjlhXHU1MDNjXHVmZjBjXHU3Mjc5XHU2MDI3PXswfVx1ZmYwY1x1NzI2OVx1NGVmNj17MX1cdWZmMGNcdTUwM2M9ezJ9DQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMz1cdTRlMGRcdTc3ZTVcdTU5ODJcdTRmNTVcdThhMmRcdTViOWFcdTUwM2NcdWZmMGNcdTcyNzlcdTYwMjc9ezB9XHVmZjBjXHU3MjY5XHU0ZWY2PXsxfVx1ZmYwY1x1NTAzYz17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9XHU4YTJkXHU1YjlhXHU1M2MzXHU3MTY3XHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHVmZjBjXHU3MTIxXHU2Y2Q1XHU4YTJkXHU1YjlhXHU1MDNjXHVmZjBjXHU3Mjc5XHU2MDI3PXswfVx1ZmYwY1x1NzI2OVx1NGVmNj17MX1cdWZmMGNcdTUwM2M9ezJ9DQoteG1sTGlicmFyeV9lcnJvcl9wcm9jZXNzX3dyb25nX2NvbnRhaW5lcj1cdTZkNDFcdTdhMGIgJyd7MH0nJyBcdTdmM2FcdTVjMTFcdTY3MDlcdTY1NDhcdTc2ODRcdTUxMzJcdTViNThcdTU2NjhcdTMwMDJcdTUxMzJcdTViNThcdTU2NjhcdTY2MmYgJyd7MX0nJyBcdTk4NWVcdTU3OGJcdWZmMGNcdTRlMGRcdTY2MmYgUHJvY2Vzc3BhY2thZ2UNCi14bWxMaWJyYXJ5X25ld19pZD1cdTUxNDNcdTdkMjAgezB9IFx1N2YzYVx1NWMxMVx1NjcwOVx1NjU0OFx1NzY4NCBJRFx1ZmYwY1x1NWRmMlx1NjMwN1x1NmQzZVx1NjViMFx1NzY4NCBJRCB7MX0NCi14bWxMaWJyYXJ5X2lkX25vdF91bmlxdWU9XHU2NzA5XHU1OTFhXHU1MDBiXHU1MTQzXHU3ZDIwXHU0ZjdmXHU3NTI4XHU1MTQzXHU3ZDIwIElEICcnezB9JycNCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGJiNjU3Zi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGY2YWIxNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIFhNTCBFeHBvcnQgKE5MMikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWw7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTRmY2E3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMjMxNGFhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFx1MDQzMiBYTUwNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEV4cG9ydCBYTUwgV2l6YXJkDQotZXhwb3J0WE1MV2l6YXJkTmFtZT1YTUwNCi1leHBvcnRYTUxXaXphcmREZXNjcmlwdGlvbj1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDMyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBYTUwuDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDg0MzUxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmRfdGl0bGU9XHUwNDJkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFhNTA0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBUeXBlIFdpemFyZCBQYWdlDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQyXHUwNDM4XHUwNDNmIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzAuDQotZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uX3RleHQ9XHUwNDJkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MVx1MDQ0ZSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ9XHUwNDJkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzZCBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzNVx1MDQzOSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1leHBvcnRDb25maWdzUmFkaW9CdXR0b25fdGV4dD1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLQ0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFhNTCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMiBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M2NcdTA0M2VcdTA0MzkgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4NCi1maWxlTGFiZWxfdGV4dD1cdTA0MjRcdTA0MzBcdTA0MzlcdTA0M2IgWE1MOg0KLWJyb3dzZUJ1dHRvbl90ZXh0PVx1MDQxZVx1MDQzMVx1MDQzN1x1MDQzZVx1MDQ0MC4uLg0KLQ0KLSMgT3ZlcndyaXRlIENvbmZpcm1hdGlvbiBEaWFsb2cNCi1vdmVyd3JpdGVUZXh0X21zZz0nJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIuXG5cdTA0MTdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM1XHUwNDMzXHUwNDNlPw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1leHBvcnRpbmdYTUxfdGV4dD1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDMyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBYTUwuLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQzZFx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQ0Ylx1MDQzOSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgWE1MLg0KLWV4cG9ydFhNTFdpemFyZF9lcnJvcj1JVVBNMDAwMEU6IFx1MDQyZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0M2RcdTA0MzUgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkOiB7MH0NCi1leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nPVx1MDQyZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDhcdTA0MzVcdTA0M2QuIFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDMwIFx1MDQzMiBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzNcdTA0MzUgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwLg0KLWV4cG9ydFhNTFNlcnZpY2VfZXJyb3I9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4OiB7MH0NCi1leHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3I9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmOiBFbGVtZW50PXswfSwgZmVhdHVyZT17MX0NCi14bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sPVx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQ0MVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDIgeG1sICcnezB9JycNCi14bWxMaWJyYXJ5X25vX3BsdWdpbj1cdTA0MWRcdTA0MzVcdTA0NDIgTWV0aG9kUGx1Z2luIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MThcdTA0MTQgezB9DQoteG1sTGlicmFyeV9ub19mZWF0dXJlPVx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDQzXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRjIFhtbCBcdTA0MzRcdTA0M2JcdTA0NGYgezB9X3sxfQ0KLXhtbExpYnJhcnlfbm9fY2xhc3M9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NDNcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NGMgRUNsYXNzIFx1MDQzNFx1MDQzYlx1MDQ0ZiB7MH0NCi14bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwLiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzZVx1MDQzMSBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzNFx1MDQzYlx1MDQ0ZiB7MH0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMC4gXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IHswfSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzVcdTA0MzlcdTA0M2RcdTA0MzVcdTA0NDBcdTA0NDMgezF9DQoteG1sTGlicmFyeV9pbnZhbGlkX2ZlYXR1cmVfdmFsdWU9XHUwNDFkXHUwNDM1XHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzBcdTA0NDJcdTA0NDBcdTA0MzhcdTA0MzFcdTA0NDNcdTA0NDJcdTA0MzAgXHUwNDM0XHUwNDNiXHUwNDRmIHswfSwgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IHsxfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzI9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzMFx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQzMVx1MDQ0M1x1MDQ0Mlx1MDQzMCwgZmVhdHVyZT17MH0sIG9iamVjdD17MX0sIHZhbHVlPXsyfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzM9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDFcdTA0M2VcdTA0MzEgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiwgZmVhdHVyZT17MH0sIG9iamVjdD17MX0sIHZhbHVlPXsyfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4LCBmZWF0dXJlPXswfSwgb2JqZWN0PXsxfSwgdmFsdWU9ezJ9DQoteG1sTGlicmFyeV9lcnJvcl9wcm9jZXNzX3dyb25nX2NvbnRhaW5lcj1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDEgJyd7MH0nJyBcdTA0M2RcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDM1XHUwNDQyIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzVcdTA0MzlcdTA0M2RcdTA0MzVcdTA0NDBcdTA0MzAuIFx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0Mlx1MDQzNVx1MDQzOVx1MDQzZFx1MDQzNVx1MDQ0MCBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0MzVcdTA0NDIgXHUwNDQyXHUwNDM4XHUwNDNmICcnezF9JycsIFx1MDQzZVx1MDQ0Mlx1MDQzYlx1MDQzOFx1MDQ0N1x1MDQzMFx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzOVx1MDQ0MVx1MDQ0ZiBcdTA0M2VcdTA0NDIgUHJvY2Vzc3BhY2thZ2UNCi14bWxMaWJyYXJ5X25ld19pZD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NDMgezB9IFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQ0MVx1MDQzMlx1MDQzZVx1MDQzNVx1MDQzZCBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0NGJcdTA0MzkgXHUwNDE4XHUwNDE0IHsxfSwgXHUwNDQyXHUwNDMwXHUwNDNhIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0M2VcdTA0M2QgXHUwNDNkXHUwNDM1IFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzYiBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDE4XHUwNDE0DQoteG1sTGlicmFyeV9pZF9ub3RfdW5pcXVlPVx1MDQxOFx1MDQxNCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAgJyd7MH0nJyBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NDNcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDM4XHUwNDNjXHUwNDM4IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQzY1x1MDQzOA0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyYS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMmEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU2MWU2YzguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMzBkYWI3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIFhNTCBFeHBvcnQgKE5MMmEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNjgyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMmEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGEucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDNlMDEyNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBwbHVnaW4gdGlsIGVrc3BvcnQgYWYgWE1MDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZE5hbWU9WE1MDQotZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249RWtzcG9ydFx1MDBlOXIgbWV0b2RlYmlibGlvdGVrc2luZGhvbGQgdGlsIGVuIFhNTC1maWwuDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEyZDQ2YTEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmRfdGl0bGU9RWtzcG9ydFx1MDBlOXIgWE1MDQotDQotIyBTZWxlY3QgRXhwb3J0IFR5cGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVZcdTAwZTZsZyBkZW4gdHlwZSBtZXRvZGViaWJsaW90ZWtzaW5kaG9sZCwgZGVyIHNrYWwgZWtzcG9ydGVyZXMuDQotZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uX3RleHQ9RWtzcG9ydFx1MDBlOXIgaGVsZSBtZXRvZGViaWJsaW90ZWtldA0KLWV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbl90ZXh0PUVrc3BvcnRcdTAwZTlyIGVuIGVsbGVyIGZsZXJlIG1ldG9kZS1wbHVnaW5zDQotZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uX3RleHQ9RWtzcG9ydFx1MDBlOXIgZW4gbWV0b2Rla29uZmlndXJhdGlvbg0KLQ0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9QW5naXYgZWtzcG9ydGZpbA0KLXNlbGVjdFhNTEZpbGVQYWdlX2Rlc2M9QW5naXYgZW4gWE1MLWRlc3RpbmF0aW9uc2ZpbCwgaHZvciBkZXQgZWtzcG9ydGVyZWRlIG1ldG9kZWJpYmxpb3Rla3NpbmRob2xkIHNrYWwgZ2VtbWVzLg0KLWZpbGVMYWJlbF90ZXh0PVhNTC1maWw6DQotYnJvd3NlQnV0dG9uX3RleHQ9R2VubmVtc2UuLi4NCi0NCi0jIE92ZXJ3cml0ZSBDb25maXJtYXRpb24gRGlhbG9nDQotb3ZlcndyaXRlVGV4dF9tc2c9Jyd7MH0nJyBmaW5kZXMgYWxsZXJlZGUuXG5WaWwgZHUgb3ZlcnNrcml2ZT8NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotZXhwb3J0aW5nWE1MX3RleHQ9RWtzcG9ydGVyZXIgbWV0b2RlYmlibGlvdGVrc2luZGhvbGQgdGlsIFhNTC1maWwuLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9RGVuIGFuZ2l2bmUgWE1MLWZpbCBlciBpa2tlIGd5bGRpZy4NCi1leHBvcnRYTUxXaXphcmRfZXJyb3I9SVVQTTAwMDBFOiBFa3Nwb3J0IGVyIGlra2UgdWRmXHUwMGY4cnQ6IHswfQ0KLWV4cG9ydFhNTFdpemFyZF9yZXZpZXdMb2c9RWtzcG9ydCBlciB1ZGZcdTAwZjhydC4gR2VubmVtc2UgbG9nZmlsZXJuZSBpIGVrc3BvcnRiaWJsaW90ZWtldC4NCi1leHBvcnRYTUxTZXJ2aWNlX2Vycm9yPUZlamwgdW5kZXIgZWtzcG9ydCBhZiBiaWJsaW90ZWs6IHswfQ0KLWV4cG9ydFhNTFNlcnZpY2VfZmVhdHVyZV9lcnJvcj1GZWpsIHVuZGVyIGFuZ2l2ZWxzZSBhZiBmdW5rdGlvbnN2XHUwMGU2cmRpOiBFbGVtZW50PXswfSwgZnVua3Rpb249ezF9DQoteG1sTGlicmFyeV9lcnJvcl9sb2FkX3htbD1LYW4gaWtrZSBpbmRsXHUwMGU2c2UgWE1MLWtpbGRlbiAnJ3swfScnDQoteG1sTGlicmFyeV9ub19wbHVnaW49SW5nZW4gbWV0b2RlLXBsdWdpbiBmb3IgaWQnJ2VuIHswfQ0KLXhtbExpYnJhcnlfbm9fZmVhdHVyZT1LYW4gaWtrZSBoZW50ZSBYTUwtZnVua3Rpb24gZm9yIHswfV97MX0NCi14bWxMaWJyYXJ5X25vX2NsYXNzPUthbiBpa2tlIGhlbnRlIEVDbGFzcyBmb3IgezB9DQoteG1sTGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudD1GZWpsIHVuZGVyIG9wcmV0dGVsc2UgYWYgZWxlbWVudC4gRGV0IHZpZGVzIGlra2UsIGh2b3JkYW4gdlx1MDBlNnJkaSBmb3IgZnVua3Rpb25lbiB7MH0gc2thbCBhbmdpdmVzLg0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlPUZlamwgdW5kZXIgb3ByZXR0ZWxzZSBhZiBlbGVtZW50LiBLYW4gaWtrZSBhbmdpdmUgdlx1MDBlNnJkaWVuIHswfSBmb3Igb3BiZXZhcmluZ3NzdGVkZXQgezF9DQoteG1sTGlicmFyeV9pbnZhbGlkX2ZlYXR1cmVfdmFsdWU9VWd5bGRpZyBhdHRyaWJ1dGZ1bmt0aW9uc3ZcdTAwZTZyZGkgZm9yIGZ1bmt0aW9uZW4gezB9IG1lZCB2XHUwMGU2cmRpZW4gezF9DQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMj1GZWpsIHVuZGVyIGFuZ2l2ZWxzZSBhZiBhdHRyaWJ1dC4gS2FuIGlra2UgYW5naXZlIHZcdTAwZTZyZGkgZm9yIGZ1bmt0aW9uPXswfSwgb2JqZWt0PXsxfSwgdlx1MDBlNnJkaT17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8zPURldCB2aWRlcyBpa2tlLCBodm9yZGFuIHZcdTAwZTZyZGkgZm9yIGZ1bmt0aW9uPXswfSwgb2JqZWt0PXsxfSwgdlx1MDBlNnJkaT17Mn0gc2thbCBhbmdpdmVzLg0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1GZWpsIHVuZGVyIGFuZ2l2ZWxzZSBhZiByZWZlcmVuY2UuIEthbiBpa2tlIGFuZ2l2ZSB2XHUwMGU2cmRpIGZvciBmdW5rdGlvbj17MH0sIG9iamVrdD17MX0sIHZcdTAwZTZyZGk9ezJ9DQoteG1sTGlicmFyeV9lcnJvcl9wcm9jZXNzX3dyb25nX2NvbnRhaW5lcj1wcm9jZXNzZW4gJyd7MH0nJyBoYXIgaWtrZSBldCBneWxkaWd0IG9wYmV2YXJpbmdzc3RlZC4gT3BiZXZhcmluZ3NzdGVkZXQgZXIgYWYgdHlwZW4gJyd7MX0nJywgc29tIGlra2UgZXIgZW4gcHJvY2VzcGFra2UuDQoteG1sTGlicmFyeV9uZXdfaWQ9RWxlbWVudGV0IHswfSBlciB0aWxkZWx0IG1lZCBlbiBueSBpZCwgezF9LCBmb3JkaSBkZXQgaWtrZSBoYXIgZW4gZ3lsZGlnLg0KLXhtbExpYnJhcnlfaWRfbm90X3VuaXF1ZT1FbGVtZW50LWlkJydlbiAnJ3swfScnIGJydWdlcyBhZiBtZXJlIGVuZCBldCBlbGVtZW50Lg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4ODEzMmUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MWQwNTdkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwxLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE2NGYzMTQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1zb3VyY2UubmwxLmphciA9IHNyYy8NCi1vdXRwdXQubmwxLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDEuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgbmwvLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2l0LnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmOTFjMjYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgSGVscCBEb2N1bWVudHMgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwMDZkMTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBEb2t1bWVudGF0aW9uDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxM2U3ZTE0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RG9jdW1lbnRhY2lcdTAwZjNuIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzAxNzE2Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPURvY3VtZW50YXRpb24gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YzVjZDZhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RG9jdW1lbnRhemlvbmUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NmExN2Y5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIERvY3VtZW50YXRpb24NCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjMmIyNzUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHViYjM4XHVjMTFjDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OGMxNmYzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RG9jdW1lbnRhXHUwMGU3XHUwMGUzbyBkbyBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5YTgxNDMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHU2NTg3XHU2ODYzDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NmExN2Y5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIERvY3VtZW50YXRpb24NCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiY2I1YTg3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQwMDMzZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc3BhdGg6IG5sMi5qYXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYztidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NTZhOTJlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UubmwyLmphciA9IHNyYy8NCi1vdXRwdXQubmwyLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDIuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcnUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgbmwvLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDIvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZTM1ODQ0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIENvbXBvc2VyIEhlbHAgRG9jdW1lbnRzIChOTDIpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNmE1ZDcwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9XHUwNDE0XHUwNDNlXHUwNDNhXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzQ3NWNkNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YWNmOTg0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDJhLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDJjNDVmMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS5ubDJhLmphciA9IHNyYy8NCi1vdXRwdXQubmwyYS5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gbmwyYS5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBubC8sXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvZnJhZ21lbnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjkwMjNlNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgSGVscCBEb2N1bWVudHMgKE5MMmEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzZGU2MzEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gZG9rdW1lbnRhdGlvbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODE5NmEzMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMThkYmMwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBJbXBvcnQgKE5MMSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2YTRhNmYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9pdC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyNTk3ZDMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gSW1wb3J0aWVyZW4NCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1pbXBvcnRDYXRlZ29yeU5hbWU9TWV0aG9kZQ0KLQ0KLSMgSW1wb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZE5hbWU9QmlibGlvdGhla3Nrb25maWd1cmF0aW9uDQotaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmRUZXh0PUltcG9ydGllcmVuIFNpZSBlaW5lIEJpYmxpb3RoZWtza29uZmlndXJhdGlvbi4NCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9TWV0aG9kZW4tUGx1Zy1pbnMNCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkVGV4dD1JbXBvcnRpZXJlbiBTaWUgZWluZSBvZGVyIG1laHJlcmUgTWV0aG9kZW4tUGx1Zy1pbnMuDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhYzBkZDYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9SW1wb3J0YWNpXHUwMGYzbiBkZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1pbXBvcnRDYXRlZ29yeU5hbWU9TVx1MDBlOXRvZG8NCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPUNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBsYSBiaWJsaW90ZWNhDQotaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmRUZXh0PUltcG9ydGFyIHVuYSBjb25maWd1cmFjaVx1MDBmM24gZGUgbGEgYmlibGlvdGVjYS4NCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9UGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8NCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkVGV4dD1JbXBvcnRhciB1bm8gbyB2YXJpb3MgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8uDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyMGIwY2IuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9SW1wb3J0YXRpb24gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgV2l6YXJkIENhdGVnb3J5DQotaW1wb3J0Q2F0ZWdvcnlOYW1lPU1cdTAwZTl0aG9kZQ0KLQ0KLSMgSW1wb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZE5hbWU9Q29uZmlndXJhdGlvbiBkZSBiaWJsaW90aFx1MDBlOHF1ZQ0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkVGV4dD1JbXBvcnRhdGlvbiBkJ3VuZSBjb25maWd1cmF0aW9uIGRlIGJpYmxpb3RoXHUwMGU4cXVlLg0KLQ0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1QbHVnLWlucyBkZSBtXHUwMGU5dGhvZGUNCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkVGV4dD1JbXBvcnRhdGlvbiBkJ3VuIG91IHBsdXNpZXVycyBwbHVnLWlucyBkZSBtXHUwMGU5dGhvZGUuDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxY2UyNmYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9SW1wb3J0YSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1pbXBvcnRDYXRlZ29yeU5hbWU9TWV0b2RvDQotDQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1Db25maWd1cmF6aW9uZSBkaSBsaWJyZXJpYQ0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkVGV4dD1JbXBvcnRhcmUgdW5hIGNvbmZpZ3VyYXppb25lIGRpIGxpYnJlcmlhLg0KLQ0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1QbHVnLWluIGRlbCBtZXRvZG8NCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkVGV4dD1JbXBvcnRhcmUgdW5vIG8gcGlcdTAwZjkgcGx1Zy1pbiBkaSBtZXRvZG8uDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0MTIyOTEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIEltcG9ydA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgSW1wb3J0IFdpemFyZCBDYXRlZ29yeQ0KLWltcG9ydENhdGVnb3J5TmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzkNCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NjljYlx1NjIxMA0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkVGV4dD1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTY5Y2JcdTYyMTBcdTMwOTJcdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzDQotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZFRleHQ9MSBcdTMwNjRcdTRlZTVcdTRlMGFcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwOTJcdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTNmMzJlNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHVhYzAwXHVjODM4XHVjNjI0XHVhZTMwDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgV2l6YXJkIENhdGVnb3J5DQotaW1wb3J0Q2F0ZWdvcnlOYW1lPVx1YmE1NFx1YzE4Y1x1YjRkYw0KLQ0KLSMgSW1wb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZE5hbWU9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YWQ2Y1x1YzEzMQ0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkVGV4dD1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YWMwMFx1YzgzOFx1YzYzNVx1YjJjOFx1YjJlNC4NCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9XHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OA0KLWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmRUZXh0PVx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWFjMDBcdWM4MzhcdWM2MzVcdWIyYzhcdWIyZTQuDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjNDE3ODMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9SW1wb3J0YVx1MDBlN1x1MDBlM28gZG8gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgV2l6YXJkIENhdGVnb3J5DQotaW1wb3J0Q2F0ZWdvcnlOYW1lPU1cdTAwZTl0b2RvDQotDQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1Db25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIEJpYmxpb3RlY2ENCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZFRleHQ9SW1wb3J0YXIgdW1hIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgYmlibGlvdGVjYS4NCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9UGx1Zy1pbnMgZGUgTVx1MDBlOXRvZG8NCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkVGV4dD1JbXBvcnRhciB1bSBvdSBtYWlzIHBsdWctaW5zIGRlIG1cdTAwZTl0b2RvLg0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMzEyMGFlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTViZmNcdTUxNjUNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1pbXBvcnRDYXRlZ29yeU5hbWU9XHU2NWI5XHU2Y2Q1DQotDQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1cdTVlOTNcdTkxNGRcdTdmNmUNCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZFRleHQ9XHU1YmZjXHU1MTY1XHU1ZTkzXHU5MTRkXHU3ZjZlXHUzMDAyDQotDQotIyBJbXBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmROYW1lPVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmRUZXh0PVx1NWJmY1x1NTE2NVx1NGUwMFx1NGUyYVx1NjIxNlx1NTkxYVx1NGUyYVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNlx1MzAwMg0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MWUzOGQzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBJbXBvcnQNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1pbXBvcnRDYXRlZ29yeU5hbWU9XHU2NWI5XHU2Y2Q1DQotDQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1cdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmUNCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZFRleHQ9XHU1MzJmXHU1MTY1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU5MTRkXHU3ZjZlXHUzMDAyDQotDQotIyBJbXBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmROYW1lPVx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmRUZXh0PVx1NTMyZlx1NTE2NVx1NGUwMFx1NjIxNlx1NTkxYVx1NTAwYlx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1MzAwMg0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTg4ZTg4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBFMDIwMEUgLSBJVVBFMDI5OUUNCi0jDQotDQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWltcG9ydENvbmZpZ1dpemFyZF90aXRsZT1CaWJsaW90aGVrc2tvbmZpZ3VyYXRpb24gaW1wb3J0aWVyZW4NCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RpdGxlPUltcG9ydHZlcnplaWNobmlzIGFuZ2ViZW4NCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ9R2ViZW4gU2llIGRhcyBWZXJ6ZWljaG5pcyBtaXQgZGVyIHp1IGltcG9ydGllcmVuZGVuIEJpYmxpb3RoZWtza29uZmlndXJhdGlvbiBhbi4NCi1yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90aXRsZT1BbiBkZXIgQmlibGlvdGhlayB2b3JnZW5vbW1lbmUgXHUwMGM0bmRlcnVuZ2VuIHByXHUwMGZjZmVuDQotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dD1Qclx1MDBmY2ZlbiBTaWUgZGllIFx1MDBjNG5kZXJ1bmdlbiwgZGllIGFuIGRlciBha3R1ZWxsZW4gTWV0aG9kZW5iaWJsaW90aGVrIHZvcmdlbm9tbWVuIHdlcmRlbi4NCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGU9S29uZmlndXJhdGlvbnNzcGV6aWZpa2F0aW9uZW4gYXVzd1x1MDBlNGhsZW4NCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGV4dD1XXHUwMGU0aGxlbiBTaWUgbWluZGVzdGVucyBlaW5lIHp1IGltcG9ydGllcmVuZGUgS29uZmlndXJhdGlvbnNzcGV6aWZpa2F0aW9uIGF1cy4NCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZT1NZXRob2Rlbi1QbHVnLWlucyBpbXBvcnRpZXJlbg0KLXNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RpdGxlPUltcG9ydHZlcnplaWNobmlzIGFuZ2ViZW4NCi1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90ZXh0PUdlYmVuIFNpZSBkYXMgVmVyemVpY2huaXMgbWl0IGRlbiB6dSBpbXBvcnRpZXJlbmRlbiBNZXRob2Rlbi1QbHVnLWlucyBhbi4NCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZT1NZXRob2Rlbi1QbHVnLWlucyBhdXN3XHUwMGU0aGxlbg0KLXNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RleHQ9V1x1MDBlNGhsZW4gU2llIG1pbmRlc3RlbnMgZWluIHp1IGltcG9ydGllcmVuZGVzIE1ldGhvZGVuLVBsdWctaW4gYXVzLiBXZW5uIGVpbiBhdXNnZXdcdTAwZTRobHRlcyBQbHVnLWluIGJlcmVpdHMgaW4gZGVyIGFrdHVlbGxlbiBNZXRob2RlbmJpYmxpb3RoZWsgdm9yaGFuZGVuIGlzdCwgXHUwMGZjYmVycHJcdTAwZmNmZW4gU2llIGRpZSBWZXJzaW9uc2RpZmZlcmVuemVuLg0KLWltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW49SW1wb3J0IGRlcyBQbHVnLWlucyBmZWhsZ2VzY2hsYWdlbg0KLQ0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzA9QXVzZ2V3XHUwMGU0aGx0ZSBCaWJsaW90aGVrc2tvbmZpZ3VyYXRpb24gd2lyZCB2YWxpZGllcnQuLi4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cxPURhcyBhbmdlZ2ViZW5lIFZlcnplaWNobmlzIGVudGhcdTAwZTRsdCBrZWluZSBnXHUwMGZjbHRpZ2UgS29uZmlndXJhdGlvbi4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0czPU1ldGhvZGVua29uZmlndXJhdGlvbiB3aXJkIGltcG9ydGllcnQuLi4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cyPURpZSBkZXJ6ZWl0IGdlXHUwMGY2ZmZuZXRlIEJpYmxpb3RoZWsga2FubiBuaWNodCBpbiBzaWNoIHNlbGJzdCBpbXBvcnRpZXJ0IHdlcmRlbi4NCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX01TRzE9TWV0aG9kZW5rb25maWd1cmF0aW9uIHdpcmQgaW1wb3J0aWVydC4uLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uPUltcG9ydCBkZXIgS29uZmlndXJhdGlvbiBmZWhsZ2VzY2hsYWdlbg0KLQ0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF90aXRsZT1BdXNjaGVja2VuIGZlaGxnZXNjaGxhZ2VuDQotRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX21zZz1FaW5pZ2UgRGF0ZWllbiB3dXJkZW4gbmljaHQgYXVzZ2VjaGVja3QuIE1cdTAwZjZjaHRlbiBTaWUgZGVuIFZvcmdhbmcgd2llZGVyaG9sZW4/DQotDQotSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZT1Lb25maWd1cmF0aW9uc2JlcmljaHQgaW1wb3J0aWVyZW4NCi1JbXBvcnRQbHVnaW5XaXphcmRfcmVhZG9ubHk9SVVQRTAyMDFFOiBEaWUgQmlibGlvdGhlayBpc3Qgc2NocmVpYmdlc2NoXHUwMGZjdHp0Lg0KLUltcG9ydFBsdWdpbldpemFyZF9NU0cxPU1ldGhvZGVuLVBsdWctaW4gd2lyZCBpbXBvcnRpZXJ0Li4uDQotSW1wb3J0UGx1Z2luV2l6YXJkX2Vycm9yPUZlaGxlcg0KLUltcG9ydFBsdWdpbldpemFyZF93YXJuX2V4aXN0aW5nX3BsdWdpbnM9SVVQRTAyMDBFOiBEaWUgZm9sZ2VuZGVuIGF1c2dld1x1MDBlNGhsdGVuIFBsdWctaW5zIHNpbmQgYmVyZWl0cyB2b3JoYW5kZW4uIFdlbm4gU2llIGRpZXNlIFBsdWctaW5zIGVybmV1dCBpbXBvcnRpZXJlbiwgd2VyZGVuIGRpZSB2b3JoYW5kZW5lbiBcdTAwZmNiZXJzY2hyaWViZW46XG5cbiB7MH0gXG5cbk1cdTAwZjZjaHRlbiBTaWUgZGVuIFZvcmdhbmcgZm9ydHNldHplbj8NCi1JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZT1cblxuTVx1MDBmNmNodGVuIFNpZSBkZW4gVm9yZ2FuZyB3aXJrbGljaCBmb3J0c2V0emVuPw0KLQ0KLVNlbGVjdENvbmZpZ3NUb0ltcG9ydF9sYWJlbDE9RGllIGZvbGdlbmRlbiBFbGVtZW50ZSB3ZXJkZW4gaW1wb3J0aWVydDoNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yPUZlaGxlcg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfTVNHMT1BbmFseXNlIGxcdTAwZTR1ZnQNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV90aXRsZTI9WnUgaW1wb3J0aWVyZW5kZSBLb25maWd1cmF0aW9uc3NwZXppZmlrYXRpb25lbiBhdXN3XHUwMGU0aGxlbg0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub3RfdXNlZD1ub3RfdXNlZA0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19wYXRoPURhcyBhbmdlZ2ViZW5lIFZlcnplaWNobmlzIGlzdCBuaWNodCB2b3JoYW5kZW4uDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX2Rpcj1FcyB3dXJkZSBrZWluIFZlcnplaWNobmlzIGFuZ2VnZWJlbi4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfcGx1Z2lucz1WZXJmXHUwMGZjZ2JhcmUgUGx1Zy1pbnMgaW0gSW1wb3J0dmVyemVpY2huaXM6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcj1BdXRvcjoNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbj1WZXJzaW9uOg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9kZXNjPUt1cnpiZXNjaHJlaWJ1bmc6DQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IERpZSBCaWJsaW90aGVrIGlzdCBzY2hyZWliZ2VzY2hcdTAwZmN0enQuDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cwPUF1c2dld1x1MDBlNGhsdGUgUGx1Zy1pbnMgd2VyZGVuIHZhbGlkaWVydC4uLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMT1EZXIgYW5nZWdlYmVuZSBQZmFkIGVudGhcdTAwZTRsdCBrZWluIGdcdTAwZmNsdGlnZXMgTWV0aG9kZW4tUGx1Zy1pbi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzM9TWV0aG9kZW4tUGx1Zy1pbiB3aXJkIGltcG9ydGllcnQuLi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzU9RGFzIGF1c2dld1x1MDBlNGhsdGUgTWV0aG9kZW4tUGx1Zy1pbiBrYW5uIG5pY2h0IGltcG9ydGllcnQgd2VyZGVuLiBEYXMgenVnZWhcdTAwZjZyaWdlIGFiaFx1MDBlNG5naWdlIFBsdWctaW4gJyd7MH0nJyB3dXJkZSBuaWNodCBpbiBkZXIgYWt0dWVsbGVuIE1ldGhvZGVuYmlibGlvdGhlayBnZWZ1bmRlbi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzY9RGFzIGF1c2dld1x1MDBlNGhsdGUgTWV0aG9kZW4tUGx1Zy1pbiBrYW5uIG5pY2h0IGltcG9ydGllcnQgd2VyZGVuLiBFaW4genVnZWhcdTAwZjZyaWdlcyBhYmhcdTAwZTRuZ2lnZXMgUGx1Zy1pbiB3dXJkZSBuaWNodCBpbiBkZXIgYWt0dWVsbGVuIE1ldGhvZGVuYmlibGlvdGhlayBnZWZ1bmRlbi4NCi1EaWZmUmVwb3J0Vmlld2VyX2NvbnRlbnQ9SW5oYWx0DQotRGlmZlJlcG9ydFZpZXdlcl9pbl9pbXBvcnQ9SW0gSW1wb3J0DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X01TRzE9RGF0ZWllbiB3ZXJkZW4gYW5hbHlzaWVydC4uLg0KLURpZmZSZXBvcnRMYWJlbFByb3ZpZGVyX3llcz1KYQ0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9lcnJvcj1GZWhsZXINCi1EaWZmUmVwb3J0Vmlld2VyX2luX2xpYj1JbiBkZXIgQmlibGlvdGhlaw0KLURpZmZSZXBvcnRWaWV3ZXJfc3RhdHVzPVN0YXR1cw0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzPUF1c2dld1x1MDBlNGhsdGVzIFBsdWctaW4gd3VyZGUgaW4gYWt0dWVsbGVyIEJpYmxpb3RoZWsgZ2VmdW5kZW4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbk5vdEV4aXN0cz1BdXNnZXdcdTAwZTRobHRlcyBQbHVnLWluIHd1cmRlIG5pY2h0IGluIGFrdHVlbGxlciBCaWJsaW90aGVrIGdlZnVuZGVuDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHM9S29uZmlndXJhdGlvbiB3dXJkZSBpbiBkZXIgYWt0dWVsbGVuIEJpYmxpb3RoZWsgZ2VmdW5kZW4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjTm9TZWxlY3Rpb249RXMgd3VyZGUga2VpbmUgS29uZmlndXJhdGlvbnNzcGV6aWZpa2F0aW9uIGF1c2dld1x1MDBlNGhsdC4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsPUF1c2dld1x1MDBlNGhsdGUgS29uZmlndXJhdGlvbiBpbSBJbXBvcnR2ZXJ6ZWljaG5pcw0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3M9VmVyZlx1MDBmY2diYXJlIEtvbmZpZ3VyYXRpb25zc3BlemlmaWthdGlvbmVuIGltIEltcG9ydHZlcnplaWNobmlzOg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQ9bm90X3VzZWQNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjPUt1cnpiZXNjaHJlaWJ1bmc6DQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoPURlciBhbmdlZ2ViZW5lIFBmYWQgaXN0IG5pY2h0IHZvcmhhbmRlbi4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luTm9TZWxlY3Rpb249RXMgd3VyZGUga2VpbiBQbHVnLWluIGF1c2dld1x1MDBlNGhsdC4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX2Rpcj1FcyB3dXJkZSBrZWluIFZlcnplaWNobmlzIGFuZ2VnZWJlbi4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9yZWFkb25seT1EYXMgUGx1Zy1pbiB7MH0gaXN0IHNjaHJlaWJnZXNjaFx1MDBmY3R6dC5cbg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX2xvY2tlZD1JVVBFMDIwM0U6IERhcyBQbHVnLWluIHswfSBpc3QgZ2VzcGVycnQuXG4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX2Vycm9yX25vdF91cGRhdGFibGU9RWluaWdlIGRlciBQbHVnLWlucyBpbiBkZXIgQmlibGlvdGhlayBpc3QgZ2VzcGVycnQgb2RlciBzY2hyZWliZ2VzY2hcdTAwZmN0enQuXG5HZWJlbiBTaWUgZGllIFBsdWctaW5zIGZyZWkgdW5kIHN0ZWxsZW4gU2llIHNpY2hlciwgZGFzcyBkaWUgRGF0ZWllbiBha3R1YWxpc2llcnQgd2VyZGVuIGtcdTAwZjZubmVuLg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw9QXVzZ2V3XHUwMGU0aGx0ZXMgUGx1Zy1pbiBpbSBJbXBvcnR2ZXJ6ZWljaG5pcw0KLURpZmZSZXBvcnRWaWV3ZXJfdHlwZT1JbmhhbHRzdHlwDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHM9RGllIGF1c2dld1x1MDBlNGhsdGUgS29uZmlndXJhdGlvbiB3dXJkZSBuaWNodCBpbiBkZXIgYWt0dWVsbGVuIEJpYmxpb3RoZWsgZ2VmdW5kZW4uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGE9SVVQRTAyMDRFOiBEaWUgYW5nZWdlYmVuZW4gRGF0ZWllbiB3dXJkZW4gbWl0IGVpbmVyIGZyXHUwMGZjaGVyZW4gVmVyc2lvbiAoezB9KSB2b24gezF9IGV4cG9ydGllcnQuIFNpZSBtXHUwMGZjc3NlbiBEYXRlaWVuIG1pdCBkZXIgYWt0dWVsbGVuIFZlcnNpb24gdm9uIHsxfSBleHBvcnRpZXJlbi4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duPUlVUEUwMjA1RTogRGllIGFuZ2VnZWJlbmVuIERhdGVpZW4gd3VyZGVuIG1pdCBlaW5lciBmclx1MDBmY2hlcmVuIFZlcnNpb24gdm9uIHswfSBleHBvcnRpZXJ0LiBTaWUgbVx1MDBmY3NzZW4gRGF0ZWllbiBtaXQgZGVyIGFrdHVlbGxlbiBWZXJzaW9uIHZvbiB7MH0gZXhwb3J0aWVyZW4uDQotdmVyc2lvbk1pc21hdGNoX29sZFRvb2w9SVVQRTAyMDZFOiBEaWUgYW5nZWdlYmVuZW4gRGF0ZWllbiB3dXJkZW4gbWl0IGVpbmVyIG5ldWVyZW4gVmVyc2lvbiAoezB9KSB2b24gezF9IGV4cG9ydGllcnQuIFNpZSBtXHUwMGZjc3NlbiBlaW5lbiBVcGdyYWRlIHZvbiB7MX0gZHVyY2hmXHUwMGZjaHJlbiwgdW0gZGllIERhdGVpZW4gaW1wb3J0aWVyZW4genUga1x1MDBmNm5uZW4uIA0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQRTAyMDdFOiBEaWUgYW5nZWdlYmVuZW4gRGF0ZWllbiBrXHUwMGY2bm5lbiBuaWNodCBnZVx1MDBmNmZmbmV0IHdlcmRlbi4gU2llIG1cdTAwZmNzc2VuIGVpbmVuIFVwZ3JhZGUgdm9uIHswfSBkdXJjaGZcdTAwZmNocmVuLCB1bSBkaWUgRGF0ZWllbiBpbXBvcnRpZXJlbiB6dSBrXHUwMGY2bm5lbi4gDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlMWU2MDYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMjAwRSAtIElVUEUwMjk5RQ0KLSMNCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlPUltcG9ydGFyIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBsYSBiaWJsaW90ZWNhDQotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90aXRsZT1Fc3BlY2lmaWNhciBkaXJlY3RvcmlvIGRlIGltcG9ydGFjaVx1MDBmM24NCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ9RXNwZWNpZmlxdWUgZWwgZGlyZWN0b3JpbyBxdWUgY29udGllbmUgbGEgY29uZmlndXJhY2lcdTAwZjNuIGRlIGxhIGJpYmxpb3RlY2EgcGFyYSBpbXBvcnRhci4NCi1yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90aXRsZT1SZXZpc2FyIGNhbWJpb3MgZGUgbGEgYmlibGlvdGVjYQ0KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RleHQ9UmV2aXNlIGxvcyBjYW1iaW9zIHF1ZSBzZSByZWFsaXphclx1MDBlMW4gZW4gbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYWN0dWFsLg0KLXNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90aXRsZT1TZWxlY2Npb25hciBlc3BlY2lmaWNhY2lvbmVzIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbg0KLXNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90ZXh0PVNlbGVjY2lvbmUgdW5hIG8gdmFyaWFzIGVzcGVjaWZpY2FjaW9uZXMgZGUgbGEgY29uZmlndXJhY2lcdTAwZjNuIHBhcmEgaW1wb3J0YXIuDQotDQotIyBJbXBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU9SW1wb3J0YXIgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8NCi1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90aXRsZT1Fc3BlY2lmaWNhciBkaXJlY3RvcmlvIGRlIGltcG9ydGFjaVx1MDBmM24NCi1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90ZXh0PUVzcGVjaWZpcXVlIGVsIGRpcmVjdG9yaW8gcXVlIGNvbnRpZW5lIGxvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbyBwYXJhIGltcG9ydGFyLg0KLXNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RpdGxlPVNlbGVjY2lvbmFyIHBsdWctaW5zIGRlIG1cdTAwZTl0b2RvDQotc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGV4dD1TZWxlY2Npb25lIHVubyBvIHZhcmlvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbyBwYXJhIGltcG9ydGFyLiBTaSB5YSBoYXkgdW4gcGx1Zy1pbiBzZWxlY2Npb25hZG8gZW4gbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYWN0dWFsLCBjb21wcnVlYmUgbGFzIGRpZmVyZW5jaWFzIGRlIGxhIHZlcnNpXHUwMGYzbi4NCi1pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luPUxhIGltcG9ydGFjaVx1MDBmM24gZGVsIHBsdWctaW4gaGEgZmFsbGFkbw0KLQ0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzA9VmFsaWRhbmRvIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBsYSBiaWJsaW90ZWNhIHNlbGVjY2lvbmFkYS4uLg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzE9RWwgZGlyZWN0b3JpbyBlc3BlY2lmaWNhZG8gbm8gY29udGllbmUgdW5hIGNvbmZpZ3VyYWNpXHUwMGYzbiB2XHUwMGUxbGlkYS4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0czPUltcG9ydGFuZG8gbGEgY29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvLi4uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMj1ObyBwdWVkZSBpbXBvcnRhcnNlIHNvYnJlIHNcdTAwZWQgbWlzbWEgbGEgYmlibGlvdGVjYSBhYmllcnRhIGFjdHVhbG1lbnRlLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfTVNHMT1JbXBvcnRhbmRvIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kby4uLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uPUxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBsYSBpbXBvcnRhY2lcdTAwZjNuIGhhIGZhbGxhZG8NCi0NCi1GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfdGl0bGU9TGEgY29uZmlybWFjaVx1MDBmM24gaGEgZmFsbGFkbw0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c9QWxndW5vcyBhcmNoaXZvcyBubyBzZSBoYW4gY29uZmlybWFkbywgXHUwMGJmZGVzZWEgaW50ZW50YXJsbyBkZSBudWV2bz8NCi0NCi1JbXBvcnRDb25maWdSZXBvcnRQYWdlX3RpdGxlPUltcG9ydGFuZG8gZWwgaW5mb3JtZSBkZSBjb25maWd1cmFjaVx1MDBmM24NCi1JbXBvcnRQbHVnaW5XaXphcmRfcmVhZG9ubHk9SVVQRTAyMDFFOiBMYSBiaWJsaW90ZWNhIGVzIGRlIHNcdTAwZjNsbyBsZWN0dXJhLg0KLUltcG9ydFBsdWdpbldpemFyZF9NU0cxPUltcG9ydGFuZG8gZWwgcGx1Zy1pbiBkZSBtXHUwMGU5dG9kby4uLg0KLUltcG9ydFBsdWdpbldpemFyZF9lcnJvcj1FcnJvcg0KLUltcG9ydFBsdWdpbldpemFyZF93YXJuX2V4aXN0aW5nX3BsdWdpbnM9SVVQRTAyMDBFOiBFbCBzaWd1aWVudGUgcGx1Zy1pbiBzZWxlY2Npb25hZG8geWEgZXhpc3RlIHksIHNpIHNlIHZ1ZWx2ZSBhIGltcG9ydGFyLCBzb2JyZXNjcmliaXJcdTAwZTEgZWwgcGx1Zy1pbiBleGlzdGVudGU6XG5cbiB7MH0gXG5cblx1MDBiZkVzdFx1MDBlMSBzZWd1cm8gZGUgcXVlIGRlc2VhIGNvbnRpbnVhcj8NCi1JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZT1cblxuXHUwMGJmRXN0XHUwMGUxIHNlZ3VybyBkZSBxdWUgZGVzZWEgY29udGludWFyPw0KLQ0KLVNlbGVjdENvbmZpZ3NUb0ltcG9ydF9sYWJlbDE9U2UgaW1wb3J0YXJcdTAwZTFuIGxvcyBzaWd1aWVudGVzIGVsZW1lbnRvczoNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yPUVycm9yDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9NU0cxPUFuYWxpemFuZG8NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV90aXRsZTI9U2VsZWNjaW9uYXIgZXNwZWNpZmljYWNpb25lcyBkZSBsYSBjb25maWd1cmFjaVx1MDBmM24gcGFyYSBpbXBvcnRhcg0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub3RfdXNlZD1ubyBzZSB1dGlsaXphDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX3BhdGg9RWwgZGlyZWN0b3JpbyBlc3BlY2lmaWNhZG8gbm8gZXhpc3RlLg0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19kaXI9Tm8gc2UgaGEgZXNwZWNpZmljYWRvIG5pbmdcdTAwZmFuIGRpcmVjdG9yaW8NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfcGx1Z2lucz1QbHVnLWlucyBkaXNwb25pYmxlcyBlbiBlbCBkaXJlY3RvcmlvIGRlIGltcG9ydGFjaVx1MDBmM246DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcj1BdXRvcjoNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbj1WZXJzaVx1MDBmM246DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2Rlc2M9RGVzY3JpcGNpXHUwMGYzbiBicmV2ZToNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogTGEgYmlibGlvdGVjYSBlcyBkZSBzXHUwMGYzbG8gbGVjdHVyYS4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzA9VmFsaWRhbmRvIGxvcyBwbHVnLWlucyBzZWxlY2Npb25hZG9zLi4uDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cxPUxhIHZcdTAwZWRhIGRlIGFjY2VzbyBlc3BlY2lmaWNhZGEgbm8gY29udGllbmUgdW4gcGx1Zy1pbiBkZSBtXHUwMGU5dG9kbyB2XHUwMGUxbGlkby4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzM9SW1wb3J0YW5kbyBlbCBwbHVnLWluIGRlIG1cdTAwZTl0b2RvLi4uDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c1PU5vIHNlIHB1ZWRlIGltcG9ydGFyIGVsIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8gc2VsZWNjaW9uYWRvLiBFbCBwbHVnLWluIGRlcGVuZGllbnRlICcnezB9Jycgbm8gc2UgcHVlZGUgZW5jb250cmFyIGVuIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGFjdHVhbC4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzY9Tm8gc2UgcHVlZGUgaW1wb3J0YXIgZWwgcGx1Zy1pbiBkZSBtXHUwMGU5dG9kbyBzZWxlY2Npb25hZG8uIE5vIHNlIHB1ZWRlIGVuY29udHJhciB1biBwbHVnLWluIGRlcGVuZGllbnRlIGVuIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGFjdHVhbC4NCi1EaWZmUmVwb3J0Vmlld2VyX2NvbnRlbnQ9Q29udGVuaWRvDQotRGlmZlJlcG9ydFZpZXdlcl9pbl9pbXBvcnQ9RW4gaW1wb3J0YWNpXHUwMGYzbg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9NU0cxPUFuYWxpemFuZG8gYXJjaGl2b3MuLi4NCi1EaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM9U1x1MDBlZA0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9lcnJvcj1FcnJvcg0KLURpZmZSZXBvcnRWaWV3ZXJfaW5fbGliPUVuIGxhIGJpYmxpb3RlY2ENCi1EaWZmUmVwb3J0Vmlld2VyX3N0YXR1cz1Fc3RhZG8NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbkV4aXN0cz1TZSBoYSBlbmNvbnRyYWRvIGVsIHBsdWctaW4gc2VsZWNjaW9uYWRvIGVuIGxhIGJpYmxpb3RlY2EgYWN0dWFsDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5Ob3RFeGlzdHM9Tm8gc2UgaGEgcG9kaWRvIGVuY29udHJhciBlbCBwbHVnLWluIHNlbGVjY2lvbmFkbyBlbiBsYSBiaWJsaW90ZWNhIGFjdHVhbA0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjRXhpc3RzPVNlIGhhIGVuY29udHJhZG8gbGEgY29uZmlndXJhY2lcdTAwZjNuIGVuIGxhIGJpYmxpb3RlY2EgYWN0dWFsDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY05vU2VsZWN0aW9uPU5vIHNlIGhhIHNlbGVjY2lvbmFkbyBuaW5ndW5hIGVzcGVjaWZpY2FjaVx1MDBmM24gZGUgbGEgY29uZmlndXJhY2lcdTAwZjNuLg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNEYXRhTGFiZWw9Q29uZmlndXJhY2lcdTAwZjNuIHNlbGVjY2lvbmFkYSBlbiBlbCBkaXJlY3RvcmlvIGRlIGltcG9ydGFjaVx1MDBmM24NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9jb25maWdzPUVzcGVjaWZpY2FjaW9uZXMgZGUgbGEgY29uZmlndXJhY2lcdTAwZjNuIGRpc3BvbmlibGVzIGVuIGVsIGRpcmVjdG9yaW8gZGUgaW1wb3J0YWNpXHUwMGYzbjoNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkPW5vIHNlIHV0aWxpemENCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjPURlc2NyaXBjaVx1MDBmM24gYnJldmU6DQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoPUxhIHZcdTAwZWRhIGRlIGFjY2VzbyBlc3BlY2lmaWNhZGEgbm8gZXhpc3RlLg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbj1ObyBzZSBoYSBzZWxlY2Npb25hZG8gbmluZ1x1MDBmYW4gcGx1Zy1pbi4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX2Rpcj1ObyBzZSBoYSBlc3BlY2lmaWNhZG8gbmluZ1x1MDBmYW4gZGlyZWN0b3Jpbw0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX3JlYWRvbmx5PUVsIHBsdWctaW4gezB9IGVzIGRlIHNcdTAwZjNsbyBsZWN0dXJhXG4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9sb2NrZWQ9SVVQRTAyMDNFOiBFbCBwbHVnLWluIHswfSBlc3RcdTAwZTEgYmxvcXVlYWRvXG4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX2Vycm9yX25vdF91cGRhdGFibGU9QWxndW5vcyBkZSBsb3MgcGx1Zy1pbnMgZGUgbGEgYmlibGlvdGVjYSBlc3RcdTAwZTFuIGJsb3F1ZWFkb3MgbyBzb24gZGUgc1x1MDBmM2xvIGxlY3R1cmEuXG4gRGVzYmxvcXVlZSBsb3MgcGx1Zy1pbnMgeSBhc2VnXHUwMGZhcmVzZSBkZSBxdWUgbG9zIGFyY2hpdm9zIHNlIHB1ZWRlbiBhY3R1YWxpemFyLg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw9UGx1Zy1pbiBzZWxlY2Npb25hZG8gZW4gZWwgZGlyZWN0b3JpbyBkZSBpbXBvcnRhY2lcdTAwZjNuDQotRGlmZlJlcG9ydFZpZXdlcl90eXBlPVRpcG8gZGUgY29udGVuaWRvDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHM9Tm8gc2UgaGEgcG9kaWRvIGVuY29udHJhciBsYSBjb25maWd1cmFjaVx1MDBmM24gc2VsZWNjaW9uYWRhIGVuIGxhIGJpYmxpb3RlY2EgYWN0dWFsLg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUEUwMjA0RTogVW5hIHZlcnNpXHUwMGYzbiBhbnRlcmlvciAoezB9KSBkZSB7MX0gaGEgZXhwb3J0YWRvIGxvcyBhcmNoaXZvcyBlc3BlY2lmaWNhZG9zLiBEZWJlIGV4cG9ydGFyIGFyY2hpdm9zIHV0aWxpemFuZG8gbGEgdmVyc2lcdTAwZjNuIGFjdHVhbCBkZSB7MX0uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBFMDIwNUU6IFVuYSB2ZXJzaVx1MDBmM24gYW50ZXJpb3IgZGUgezB9IGhhIGV4cG9ydGFkbyBsb3MgYXJjaGl2b3MgZXNwZWNpZmljYWRvcy4gRGViZSBleHBvcnRhciBhcmNoaXZvcyB1dGlsaXphbmRvIGxhIHZlcnNpXHUwMGYzbiBhY3R1YWwgZGUgezB9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUEUwMjA2RTogVW5hIHZlcnNpXHUwMGYzbiBtXHUwMGUxcyByZWNpZW50ZSAoezB9KSBkZSB7MX0gaGEgZXhwb3J0YWRvIGxvcyBhcmNoaXZvcyBlc3BlY2lmaWNhZG9zLiBEZWJlIGFjdHVhbGl6YXIgezF9IHBhcmEgaW1wb3J0YXIgbG9zIGFyY2hpdm9zLiAgDQotdmVyc2lvbk1pc21hdGNoX29sZFRvb2xfdW5rbm93bj1JVVBFMDIwN0U6IE5vIHNlIHB1ZWRlbiBhYnJpciBsb3MgYXJjaGl2b3MgZXNwZWNpZmljYWRvcy4gRGViZSBhY3R1YWxpemFyIHswfSBwYXJhIGltcG9ydGFyIGxvcyBhcmNoaXZvcy4gIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NWU1OGJkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBFMDIwMEUgLSBJVVBFMDI5OUUNCi0jDQotDQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWltcG9ydENvbmZpZ1dpemFyZF90aXRsZT1JbXBvcnRlciB1bmUgY29uZmlndXJhdGlvbiBkZSBiaWJsaW90aFx1MDBlOHF1ZQ0KLXNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGl0bGU9U3BcdTAwZTljaWZpZXIgdW4gclx1MDBlOXBlcnRvaXJlIGQnaW1wb3J0YXRpb24NCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ9U3BcdTAwZTljaWZpZXogbGUgclx1MDBlOXBlcnRvaXJlIGNvbnRlbmFudCBsYSBjb25maWd1cmF0aW9uIGRlIGJpYmxpb3RoXHUwMGU4cXVlIFx1MDBlMCBpbXBvcnRlci4NCi1yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90aXRsZT1SXHUwMGU5dmlzZXIgbGVzIG1vZGlmaWNhdGlvbnMgYXBwb3J0XHUwMGU5ZXMgXHUwMGUwIGxhIGJpYmxpb3RoXHUwMGU4cXVlDQotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dD1SXHUwMGU5dmlzZXogbGVzIG1vZGlmaWNhdGlvbnMgcXVpIHNlcm9udCBhcHBvcnRcdTAwZTllcyBcdTAwZTAgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBlbiBjb3Vycy4NCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGU9U1x1MDBlOWxlY3Rpb25uZXIgbGVzIHNwXHUwMGU5Y2lmaWNhdGlvbnMgZGUgY29uZmlndXJhdGlvbg0KLXNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90ZXh0PVNcdTAwZTlsZWN0aW9ubmV6IHVuZSBvdSBwbHVzaWV1cnMgc3BcdTAwZTljaWZpY2F0aW9ucyBkZSBjb25maWd1cmF0aW9uIFx1MDBlMCBpbXBvcnRlci4NCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZT1JbXBvcnRlciBkZXMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlDQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGl0bGU9U3BcdTAwZTljaWZpZXIgdW4gclx1MDBlOXBlcnRvaXJlIGQnaW1wb3J0YXRpb24NCi1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90ZXh0PVNwXHUwMGU5Y2lmaWV6IGxlIHJcdTAwZTlwZXJ0b2lyZSBjb250ZW5hbnQgbGVzIHBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZSBcdTAwZTAgaW1wb3J0ZXIuDQotc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGl0bGU9U1x1MDBlOWxlY3Rpb25uZXIgbGVzIHBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZQ0KLXNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RleHQ9U1x1MDBlOWxlY3Rpb25uZXogdW4gb3UgcGx1c2lldXJzIHBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZSBcdTAwZTAgaW1wb3J0ZXIuIFNpIHVuIHBsdWctaW4gc1x1MDBlOWxlY3Rpb25uXHUwMGU5IGV4aXN0ZSBkXHUwMGU5alx1MDBlMCBkYW5zIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZW4gY291cnMsIHZcdTAwZTlyaWZpZXogbGVzIGRpZmZcdTAwZTlyZW5jZXMgZW50cmUgbGVzIHZlcnNpb25zLg0KLWltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW49RWNoZWMgZGUgbCdpbXBvcnRhdGlvbiBkdSBwbHVnLWluDQotDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMD1WYWxpZGF0aW9uIGRlIGxhIGNvbmZpZ3VyYXRpb24gZGUgYmlibGlvdGhcdTAwZThxdWUgc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZS4uLg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzE9TGUgclx1MDBlOXBlcnRvaXJlIHNwXHUwMGU5Y2lmaVx1MDBlOSBuZSBjb250aWVudCBwYXMgZGUgY29uZmlndXJhdGlvbiB2YWxpZGUuDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMz1JbXBvcnRhdGlvbiBkZSBsYSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZS4uLg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzI9SW1wb3NzaWJsZSBkJ2ltcG9ydGVyIGxhIGJpYmxpb3RoXHUwMGU4cXVlIG91dmVydGUgZGFucyBlbGxlLW1cdTAwZWFtZS4NCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX01TRzE9SW1wb3J0YXRpb24gZGUgbGEgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUuLi4NCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX0VSUl9JbXBvcnRfY29uZmlndXJhdGlvbj1FY2hlYyBkZSBsJ2ltcG9ydGF0aW9uIGRlIGxhIGNvbmZpZ3VyYXRpb24NCi0NCi1GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfdGl0bGU9RWNoZWMgZGUgbGEgclx1MDBlOXNlcnZhdGlvbg0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c9Q2VydGFpbnMgZmljaGllcnMgbmUgc29udCBwYXMgclx1MDBlOXNlcnZcdTAwZTlzLCB2b3VsZXotdm91cyByXHUwMGU5ZXNzYXllciA/DQotDQotSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZT1JbXBvcnRlciB1biByYXBwb3J0IGRlIGNvbmZpZ3VyYXRpb24NCi1JbXBvcnRQbHVnaW5XaXphcmRfcmVhZG9ubHk9SVVQRTAyMDFFIDogTGEgYmlibGlvdGhcdTAwZThxdWUgZXN0IGVuIGxlY3R1cmUgc2V1bGVtZW50Lg0KLUltcG9ydFBsdWdpbldpemFyZF9NU0cxPUltcG9ydGF0aW9uIGR1IHBsdWctaW4gZGUgbVx1MDBlOXRob2RlLi4uDQotSW1wb3J0UGx1Z2luV2l6YXJkX2Vycm9yPUVycmV1cg0KLUltcG9ydFBsdWdpbldpemFyZF93YXJuX2V4aXN0aW5nX3BsdWdpbnM9SVVQRTAyMDBFIDogTGUocykgcGx1Zy1pbihzKSBzXHUwMGU5bGVjdGlvbm5cdTAwZTkocykgc3VpdmFudChzKSBleGlzdGUobnQpIGRcdTAwZTlqXHUwMGUwIGV0IGxlIGZhaXQgZGUgclx1MDBlOWltcG9ydGVyIGxlKHMpIG1cdTAwZWFtZShzKSBwbHVnLWluKHMpIFx1MDBlOWNyYXNlcmEgbGUocykgcGx1Zy1pbihzKSBleGlzdGFudChzKSA6XG5cbiB7MH0gXG5cbkV0ZXMtdm91cyBzXHUwMGZiciBkZSB2b3Vsb2lyIGNvbnRpbnVlciA/DQotSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU9XG5cbkV0ZXMtdm91cyBzXHUwMGZiciBkZSB2b3Vsb2lyIGNvbnRpbnVlciA/DQotDQotU2VsZWN0Q29uZmlnc1RvSW1wb3J0X2xhYmVsMT1MZXMgXHUwMGU5bFx1MDBlOW1lbnRzIHN1aXZhbnRzIHNlcm9udCBpbXBvcnRcdTAwZTlzIDoNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yPUVycmV1cg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfTVNHMT1BbmFseXNlIGVuIGNvdXJzDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfdGl0bGUyPVNcdTAwZTlsZWN0aW9ubmVyIGxlcyBzcFx1MDBlOWNpZmljYXRpb25zIGRlIGNvbmZpZ3VyYXRpb24gXHUwMGUwIGltcG9ydGVyDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vdF91c2VkPW5vbl91dGlsaXNcdTAwZTkNCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fcGF0aD1MZSByXHUwMGU5cGVydG9pcmUgc3BcdTAwZTljaWZpXHUwMGU5IG4nZXhpc3RlIHBhcy4NCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fZGlyPUF1Y3VuIHJcdTAwZTlwZXJ0b2lyZSBuJ2EgXHUwMGU5dFx1MDBlOSBzcFx1MDBlOWNpZmlcdTAwZTkNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfcGx1Z2lucz1QbHVnLWlucyBkaXNwb25pYmxlcyBkYW5zIGxlIHJcdTAwZTlwZXJ0b2lyZSBkJ2ltcG9ydGF0aW9uIDoNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfYXV0aG9yPUF1dGV1ciA6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb249VmVyc2lvbiA6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2Rlc2M9RGVzY3JpcHRpZiBjb3VydCA6DQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUUgOiBMYSBiaWJsaW90aFx1MDBlOHF1ZSBlc3QgZW4gbGVjdHVyZSBzZXVsZW1lbnQuDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cwPVZhbGlkYXRpb24gZGVzIHBsdWctaW5zIHNcdTAwZTlsZWN0aW9ublx1MDBlOXMuLi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzE9TGUgY2hlbWluIHNwXHUwMGU5Y2lmaVx1MDBlOSBuZSBjb250aWVudCBwYXMgZGUgcGx1Zy1pbiBkZSBtXHUwMGU5dGhvZGUgdmFsaWRlLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMz1JbXBvcnRhdGlvbiBkdSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZS4uLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNT1JbXBvc3NpYmxlIGQnJ2ltcG9ydGVyIGxlIHBsdWctaW4gZGUgbVx1MDBlOXRob2RlIHNcdTAwZTlsZWN0aW9ublx1MDBlOS4gU29uIHBsdWctaW4gZFx1MDBlOXBlbmRhbnQgJyd7MH0nJyBlc3QgaW50cm91dmFibGUgZGFucyBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGVuIGNvdXJzLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNj1JbXBvc3NpYmxlIGQnaW1wb3J0ZXIgbGUgcGx1Zy1pbiBkZSBtXHUwMGU5dGhvZGUgc1x1MDBlOWxlY3Rpb25uXHUwMGU5LiBBdWN1biBwbHVnLWluIGRcdTAwZTlwZW5kYW50IG4nYSBcdTAwZTl0XHUwMGU5IHRyb3V2XHUwMGU5IGRhbnMgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBlbiBjb3Vycy4NCi1EaWZmUmVwb3J0Vmlld2VyX2NvbnRlbnQ9Q29udGVudQ0KLURpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0PURhbnMgbCdpbXBvcnRhdGlvbg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9NU0cxPUFuYWx5c2UgZGVzIGZpY2hpZXJzLi4uDQotRGlmZlJlcG9ydExhYmVsUHJvdmlkZXJfeWVzPU91aQ0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9lcnJvcj1FcnJldXINCi1EaWZmUmVwb3J0Vmlld2VyX2luX2xpYj1EYW5zIGxhIGJpYmxpb3RoXHUwMGU4cXVlDQotRGlmZlJlcG9ydFZpZXdlcl9zdGF0dXM9RXRhdA0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzPVBsdWctaW4gc1x1MDBlOWxlY3Rpb25uXHUwMGU5IHRyb3V2XHUwMGU5IGRhbnMgbGEgYmlibGlvdGhcdTAwZThxdWUgZW4gY291cnMNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbk5vdEV4aXN0cz1QbHVnLWluIHNcdTAwZTlsZWN0aW9ublx1MDBlOSBpbnRyb3V2YWJsZSBkYW5zIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGVuIGNvdXJzDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHM9Q29uZmlndXJhdGlvbiB0cm91dlx1MDBlOWUgZGFucyBsYSBiaWJsaW90aFx1MDBlOHF1ZSBlbiBjb3Vycw0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNOb1NlbGVjdGlvbj1BdWN1bmUgc3BcdTAwZTljaWZpY2F0aW9uIGRlIGNvbmZpZ3VyYXRpb24gbidhIFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZS4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsPUNvbmZpZ3VyYXRpb24gc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZSBkYW5zIGxlIHJcdTAwZTlwZXJ0b2lyZSBkJ2ltcG9ydGF0aW9uDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfY29uZmlncz1TcFx1MDBlOWNpZmljYXRpb25zIGRlIGNvbmZpZ3VyYXRpb24gZGlzcG9uaWJsZXMgZGFucyBsZSByXHUwMGU5cGVydG9pcmUgZCdpbXBvcnRhdGlvbiA6DQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZD1ub25fdXRpbGlzXHUwMGU5DQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfZGVzYz1EZXNjcmlwdGlmIGNvdXJ0IDoNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX3BhdGg9TGUgY2hlbWluIHNwXHUwMGU5Y2lmaVx1MDBlOSBuJ2V4aXN0ZSBwYXMuDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X3BsdWdpbk5vU2VsZWN0aW9uPUF1Y3VuIHBsdWctaW4gc1x1MDBlOWxlY3Rpb25uXHUwMGU5Lg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fZGlyPUF1Y3VuIHJcdTAwZTlwZXJ0b2lyZSBuJ2EgXHUwMGU5dFx1MDBlOSBzcFx1MDBlOWNpZmlcdTAwZTkNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9yZWFkb25seT1MZSBwbHVnLWluIHswfSBlc3QgZW4gbGVjdHVyZSBzZXVsZW1lbnRcbg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX2xvY2tlZD1JVVBFMDIwM0UgOiBMZSBwbHVnLWluIHswfSBlc3QgdmVycm91aWxsXHUwMGU5XG4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX2Vycm9yX25vdF91cGRhdGFibGU9VW4gb3UgcGx1c2lldXJzIGRlcyBwbHVnLWluKHMpIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIHNvbnQgdmVycm91aWxsXHUwMGU5cyBvdSBlbiBsZWN0dXJlIHNldWxlbWVudC5cbiBEXHUwMGU5dmVycm91aWxsZXogbGVzIHBsdWctaW5zIGV0IGFzc3VyZXotdm91cyBxdWUgbGVzIGZpY2hpZXJzIHBldXZlbnQgXHUwMGVhdHJlIG1pcyBcdTAwZTAgam91ci4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luRGF0YUxhYmVsPVBsdWctaW4gc1x1MDBlOWxlY3Rpb25uXHUwMGU5IGRhbnMgbGUgclx1MDBlOXBlcnRvaXJlIGQnaW1wb3J0YXRpb24NCi1EaWZmUmVwb3J0Vmlld2VyX3R5cGU9VHlwZSBkZSBjb250ZW51DQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHM9Q29uZmlndXJhdGlvbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTllIGludHJvdXZhYmxlIGRhbnMgbGEgYmlibGlvdGhcdTAwZThxdWUgZW4gY291cnMuDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGE9SVVQRTAyMDRFIDogTGVzIGZpY2hpZXJzIHNwXHUwMGU5Y2lmaVx1MDBlOXMgb250IFx1MDBlOXRcdTAwZTkgZXhwb3J0XHUwMGU5cyBwYXIgdW5lIHZlcnNpb24gYW50XHUwMGU5cmlldXJlICh7MH0pIGRlIHsxfS4gVm91cyBkZXZleiBleHBvcnRlciBsZXMgZmljaGllcnMgZW4gdXRpbGlzYW50IGxhIHZlcnNpb24gYWN0dWVsbGUgZGUgezF9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQRTAyMDVFIDogTGVzIGZpY2hpZXJzIHNwXHUwMGU5Y2lmaVx1MDBlOXMgb250IFx1MDBlOXRcdTAwZTkgZXhwb3J0XHUwMGU5cyBwYXIgdW5lIHZlcnNpb24gYW50XHUwMGU5cmlldXJlIGRlIHswfS4gVm91cyBkZXZleiBleHBvcnRlciBsZXMgZmljaGllcnMgZW4gdXRpbGlzYW50IGxhIHZlcnNpb24gYWN0dWVsbGUgZGUgezB9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUEUwMjA2RSA6IExlcyBmaWNoaWVycyBzcFx1MDBlOWNpZmlcdTAwZTlzIG9udCBcdTAwZTl0XHUwMGU5IGV4cG9ydFx1MDBlOXMgcGFyIHVuZSB2ZXJzaW9uIHBsdXMgclx1MDBlOWNlbnRlICh7MH0pIGRlIHsxfS4gVm91cyBkZXZleiBlZmZlY3R1ZXIgdW5lIG1pc2UgXHUwMGUwIG5pdmVhdSBkZSB7MX0gcG91ciBpbXBvcnRlciBsZXMgZmljaGllcnMuICANCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUEUwMjA3RTogSW1wb3NzaWJsZSBkJydvdXZyaXIgbGVzIGZpY2hpZXJzIHNwXHUwMGU5Y2lmaVx1MDBlOXMuIFZvdXMgZGV2ZXogZWZmZWN0dWVyIHVuZSBtaXNlIFx1MDBlMCBuaXZlYXUgZGUgezB9IHBvdXIgaW1wb3J0ZXIgbGVzIGZpY2hpZXJzLiAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjMGU1NDEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMjAwRSAtIElVUEUwMjk5RQ0KLSMNCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlPUltcG9ydGEgY29uZmlndXJhemlvbmUgZGkgbGlicmVyaWENCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RpdGxlPVNwZWNpZmljYSBkaXJlY3RvcnkgZGkgaW1wb3J0YXppb25lDQotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90ZXh0PVNwZWNpZmljYXJlIGxhIGRpcmVjdG9yeSBjaGUgY29udGllbmUgbGEgY29uZmlndXJhemlvbmUgZGkgbGlicmVyaWEgZGEgaW1wb3J0YXJlLg0KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RpdGxlPUVzYW1pbmEgbW9kaWZpY2hlIGxpYnJlcmlhDQotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dD1Fc2FtaW5hcmUgbGUgbW9kaWZpY2hlIGNoZSB2ZXJyYW5ubyBhcHBvcnRhdGUgYWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGNvcnJlbnRlLg0KLXNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90aXRsZT1TZWxlemlvbmEgc3BlY2lmaWNoZSBkaSBjb25maWd1cmF6aW9uZQ0KLXNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90ZXh0PVNlbGV6aW9uYXJlIHVuYSBvIHBpXHUwMGY5IHNwZWNpZmljaGUgZGkgY29uZmlndXJhemlvbmUgZGEgaW1wb3J0YXJlLg0KLQ0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPUltcG9ydGEgcGx1Zy1pbiBkaSBtZXRvZG8NCi1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90aXRsZT1TcGVjaWZpY2EgZGlyZWN0b3J5IGRpIGltcG9ydGF6aW9uZQ0KLXNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RleHQ9U3BlY2lmaWNhcmUgbGEgZGlyZWN0b3J5IGNoZSBjb250aWVuZSBpIHBsdWctaW4gZGkgbWV0b2RvIGRhIGltcG9ydGFyZS4NCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZT1TZWxlemlvbmEgcGx1Zy1pbiBkaSBtZXRvZG8NCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0PVNlbGV6aW9uYXJlIHVubyBvIHBpXHUwMGY5IHBsdWctaW4gZGkgbWV0b2RvIGRhIGltcG9ydGFyZS4gU2UgdW4gcGx1Zy1pbiBzZWxlemlvbmF0byBlc2lzdGUgZ2lcdTAwZTAgbmVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBjb3JyZW50ZSwgdmVyaWZpY2FyZSBsZSBkaWZmZXJlbnplIHRyYSBsZSB2ZXJzaW9uaS4NCi1pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luPUltcG9ydGF6aW9uZSBkZWwgcGx1Z2luIG5vbiByaXVzY2l0YQ0KLQ0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzA9Q29udmFsaWRhIGRlbGxhIGNvbmZpZ3VyYXppb25lIGRpIGxpYnJlcmlhIHNlbGV6aW9uYXRhIGluIGNvcnNvLi4uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMT1MYSBkaXJlY3Rvcnkgc3BlY2lmaWNhdGEgbm9uIGNvbnRpZW5lIHVuYSBjb25maWd1cmF6aW9uZSB2YWxpZGEuDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMz1JbXBvcnRhemlvbmUgZGVsbGEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvIGluIGNvcnNvLi4uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMj1JbXBvc3NpYmlsZSBpbXBvcnRhcmUgbGEgbGlicmVyaWEgYXR0dWFsbWVudGUgYXBlcnRhIGRlbnRybyBzXHUwMGU5IHN0ZXNzYS4NCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX01TRzE9SW1wb3J0YXppb25lIGRlbGxhIGNvbmZpZ3VyYXppb25lIGRpIG1ldG9kbyBpbiBjb3Jzby4uLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uPUltcG9ydGF6aW9uZSBkZWxsYSBjb25maWd1cmF6aW9uZSBub24gcml1c2NpdGENCi0NCi1GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfdGl0bGU9RXN0cmF6aW9uZSBub24gcml1c2NpdGENCi1GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfbXNnPUFsY3VuaSBmaWxlIG5vbiBzb25vIHN0YXRpIGNvbnRyb2xsYXRpLCByaXBldGVyZSBsJ29wZXJhemlvbmU/DQotDQotSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZT1JbXBvcnRhemlvbmUgZGVsIHJlcG9ydCBkaSBjb25maWd1cmF6aW9uZQ0KLUltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IExhIGxpYnJlcmlhIFx1MDBlOCBkaSBzb2xhIGxldHR1cmEuDQotSW1wb3J0UGx1Z2luV2l6YXJkX01TRzE9SW1wb3J0YXppb25lIGRlbCBwbHVnLWluIGRpIG1ldG9kbyBpbiBjb3Jzby4uLg0KLUltcG9ydFBsdWdpbldpemFyZF9lcnJvcj1FcnJvcmUNCi1JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zPUlVUEUwMjAwRTogSSBzZWd1ZW50aSBwbHVnLWluIHNlbGV6aW9uYXRpIGVzaXN0b25vIGdpXHUwMGUwIGUgc2Ugc2kgcmVpbXBvcnRhbm8gZ2xpIHN0ZXNzaSBwbHVnLWluLCBxdWVsbGkgZXNpc3RlbnRpIHZlcnJhbm5vIHNvdnJhc2NyaXR0aTpcblxuIHswfSBcblxuQ29udGludWFyZT8NCi1JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZT1cblxuQ29udGludWFyZT8NCi0NCi1TZWxlY3RDb25maWdzVG9JbXBvcnRfbGFiZWwxPUkgc2VndWVudGkgZWxlbWVudGkgdmVycmFubm8gaW1wb3J0YXRpOg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfZXJyb3I9RXJyb3JlDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9NU0cxPUFuYWxpc2kNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV90aXRsZTI9U2VsZXppb25hIHNwZWNpZmljaGUgZGVsbGEgY29uZmlndXJhemlvbmUgZGEgaW1wb3J0YXJlDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vdF91c2VkPW5vdF91c2VkDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX3BhdGg9TGEgZGlyZWN0b3J5IHNwZWNpZmljYXRhIG5vbiBlc2lzdGUuDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX2Rpcj1OZXNzdW5hIGRpcmVjdG9yeSBzcGVjaWZpY2F0YQ0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zPVBsdWctaW4gZGlzcG9uaWJpbGkgbmVsbGEgZGlyZWN0b3J5IGRpIGltcG9ydGF6aW9uZToNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfYXV0aG9yPUF1dG9yZToNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbj1WZXJzaW9uZToNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfZGVzYz1CcmV2ZSBkZXNjcml6aW9uZToNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogTGEgbGlicmVyaWEgXHUwMGU4IGRpIHNvbGEgbGV0dHVyYS4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzA9Q29udmFsaWRhIGRlaSBwbHVnLWluIHNlbGV6aW9uYXRpIGluIGNvcnNvLi4uDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cxPUlsIHBlcmNvcnNvIHNwZWNpZmljYXRvIG5vbiBjb250aWVuZSB1biBwbHVnLWluIGRpIG1ldG9kbyB2YWxpZG8uDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0czPUltcG9ydGF6aW9uZSBkZWwgcGx1Zy1pbiBkaSBtZXRvZG8gaW4gY29yc28uLi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzU9SWwgcGx1Zy1pbiBzZWxlemlvbmF0byBub24gcHVcdTAwZjIgZXNzZXJlIGltcG9ydGF0by4gSW1wb3NzaWJpbGUgdHJvdmFyZSBpbCByZWxhdGl2byBwbHVnLWluIGRpcGVuZGVudGUgJyd7MH0nJyBuZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGNvcnJlbnRlLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNj1JbCBwbHVnLWluIHNlbGV6aW9uYXRvIG5vbiBwdVx1MDBmMiBlc3NlcmUgaW1wb3J0YXRvLiBJbXBvc3NpYmlsZSB0cm92YXJlIHVuIHBsdWctaW4gZGlwZW5kZW50ZSBuZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGNvcnJlbnRlLg0KLURpZmZSZXBvcnRWaWV3ZXJfY29udGVudD1Db250ZW51dG8NCi1EaWZmUmVwb3J0Vmlld2VyX2luX2ltcG9ydD1JbiBpbXBvcnRhemlvbmUNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfTVNHMT1BbmFsaXNpIGRlaSBmaWxlIGluIGNvcnNvLi4uDQotRGlmZlJlcG9ydExhYmVsUHJvdmlkZXJfeWVzPVNcdTAwZWMNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfZXJyb3I9RXJyb3JlDQotRGlmZlJlcG9ydFZpZXdlcl9pbl9saWI9TmVsbGEgbGlicmVyaWENCi1EaWZmUmVwb3J0Vmlld2VyX3N0YXR1cz1TdGF0bw0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzPVBsdWctaW4gc2VsZXppb25hdG8gdHJvdmF0byBuZWxsYSBsaWJyZXJpYSBjb3JyZW50ZQ0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luTm90RXhpc3RzPVBsdWctaW4gc2VsZXppb25hdG8gbm9uIHRyb3ZhdG8gbmVsbGEgbGlicmVyaWEgY29ycmVudGUNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY0V4aXN0cz1Db25maWd1cmF6aW9uZSB0cm92YXRhIG5lbGxhIGxpYnJlcmlhIGNvcnJlbnRlDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY05vU2VsZWN0aW9uPU5lc3N1bmEgc3BlY2lmaWNhIGRlbGxhIGNvbmZpZ3VyYXppb25lIHNlbGV6aW9uYXRhLg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNEYXRhTGFiZWw9Q29uZmlndXJhemlvbmUgc2VsZXppb25hdGEgbmVsbGEgZGlyZWN0b3J5IGRpIGltcG9ydGF6aW9uZQ0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3M9U3BlY2lmaWNoZSBkZWxsYSBjb25maWd1cmF6aW9uZSBkaXNwb25pYmlsaSBuZWxsYSBkaXJlY3RvcnkgZGkgaW1wb3J0YXppb25lOg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQ9bm90X3VzZWQNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjPUJyZXZlIGRlc2NyaXppb25lOg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fcGF0aD1JbCBwZXJjb3JzbyBzcGVjaWZpY2F0byBub24gZXNpc3RlLg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbj1OZXNzdW4gcGx1Zy1pbiBzZWxlemlvbmF0by4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX2Rpcj1OZXNzdW5hIGRpcmVjdG9yeSBzcGVjaWZpY2F0YQ0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX3JlYWRvbmx5PUlsIHBsdWdpbiB7MH0gXHUwMGU4IGRpIHNvbGEgbGV0dHVyYSBcbg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX2xvY2tlZD1JVVBFMDIwM0U6IElsIHBsdWdpbiB7MH0gXHUwMGU4IGJsb2NjYXRvXG4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX2Vycm9yX25vdF91cGRhdGFibGU9QWxjdW5pIHBsdWdpbiBkZWxsYSBsaWJyZXJpYSBzb25vIGJsb2NjYXRpIG8gZGkgc29sYSBsZXR0dXJhLlxuU2Jsb2NjYXJlIGkgcGx1Z2luIGUgdmVyaWZpY2FyZSBjaGUgaSBmaWxlIHNpYW5vIGFnZ2lvcm5hYmlsaS4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luRGF0YUxhYmVsPVBsdWctaW4gc2VsZXppb25hdG8gbmVsbGEgZGlyZWN0b3J5IGRpIGltcG9ydGF6aW9uZQ0KLURpZmZSZXBvcnRWaWV3ZXJfdHlwZT1UaXBvIGRpIGNvbnRlbnV0bw0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzPUNvbmZpZ3VyYXppb25lIHNlbGV6aW9uYXRhIG5vbiB0cm92YXRhIG5lbGxhIGxpYnJlcmlhIGNvcnJlbnRlLg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUEUwMjA0RTogaSBmaWxlIHNwZWNpZmljYXRpIHNvbm8gc3RhdGkgZXNwb3J0YXRpIGRhIHVuYSBwcmVjZWRlbnRlIHZlcnNpb25lICh7MH0pIGRpIHsxfS4gXHUwMGM4IG5lY2Vzc2FyaW8gZXNwb3J0YXJlIGkgZmlsZSB1dGlsaXp6YW5kbyBsYSB2ZXJzaW9uZSBjb3JyZW50ZSBkaSB7MX0uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBFMDIwNUU6IGkgZmlsZSBzcGVjaWZpY2F0aSBzb25vIHN0YXRpIGVzcG9ydGF0aSBkYSB1bmEgcHJlY2VkZW50ZSB2ZXJzaW9uZSBkaSB7MH0uIFx1MDBjOCBuZWNlc3NhcmlvIGVzcG9ydGFyZSBpIGZpbGUgdXRpbGl6emFuZG8gbGEgdmVyc2lvbmUgY29ycmVudGUgZGkgezB9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUEUwMjA2RTogaSBmaWxlIHNwZWNpZmljYXRpIHNvbm8gc3RhdGkgZXNwb3J0YXRpIGRhIHVuYSB2ZXJzaW9uZSBwaVx1MDBmOSBhZ2dpb3JuYXRhICh7MH0pIGRpIHsxfS4gXHUwMGM4IG5lY2Vzc2FyaW8gYWdnaW9ybmFyZSB7MX0gcGVyIGltcG9ydGFyZSBpIGZpbGUuICANCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUEUwMjA3RTogSW1wb3NzaWJpbGUgYXByaXJlIGkgZmlsZSBzcGVjaWZpY2F0aS4gXHUwMGM4IG5lY2Vzc2FyaW8gYWdnaW9ybmFyZSB7MH0gcGVyIGltcG9ydGFyZSBpIGZpbGUuICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmRmNGY1OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAyMDBFIC0gSVVQRTAyOTlFDQotIw0KLQ0KLSMgSW1wb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1pbXBvcnRDb25maWdXaXphcmRfdGl0bGU9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU2OWNiXHU2MjEwXHUzMDZlXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4DQotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90aXRsZT1cdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmVcdTYzMDdcdTViOWENCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ9XHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU5XHUzMDhiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU2OWNiXHU2MjEwXHUzMDkyXHU1NDJiXHUzMDgwXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGl0bGU9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHU1OTA5XHU2NmY0XHU1MTg1XHU1YmI5XHUzMDZlXHU2OTFjXHU4YTBlDQotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dD1cdTczZmVcdTg4NGNcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmJcdTUyYTBcdTMwNDhcdTMwODlcdTMwOGNcdTMwOGJcdTU5MDlcdTY2ZjRcdTMwOTJcdTY5MWNcdThhMGVcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGU9XHU2OWNiXHU2MjEwXHU0ZWQ1XHU2OWQ4XHUzMDZlXHU5MDc4XHU2MjllDQotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RleHQ9XHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU5XHUzMDhiIDEgXHUzMDY0XHU0ZWU1XHU0ZTBhXHUzMDZlXHU2OWNiXHU2MjEwXHU0ZWQ1XHU2OWQ4XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBJbXBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDZlXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4DQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGl0bGU9XHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDZlXHU2MzA3XHU1YjlhDQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dD1cdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTlcdTMwOGJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwOTJcdTU0MmJcdTMwODBcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTkwNzhcdTYyOWUNCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0PVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA1OVx1MzA4YiAxIFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNGNcdTczZmVcdTg4NGNcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmJcdTViNThcdTU3MjhcdTMwNTlcdTMwOGJcdTU4MzRcdTU0MDhcdTMwMDFcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTMwNmVcdTkwNTVcdTMwNDRcdTMwOTJcdTc4YmFcdThhOGRcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luPVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA0Y1x1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zg0KLQ0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzA9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU2OWNiXHU2MjEwXHUzMDkyXHU2OTFjXHU4YTNjXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMT1cdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmJcdTMwNmZcdTY3MDlcdTUyYjlcdTMwNmFcdTY5Y2JcdTYyMTBcdTMwNGNcdTU0MmJcdTMwN2VcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0czPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzI9XHU3M2ZlXHU1NzI4XHU5NThiXHUzMDQ0XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHUzMDVkXHUzMDZlXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU4MWVhXHU0ZjUzXHUzMDZiXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU5XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9NU0cxPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uPVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1NjljYlx1NjIxMFx1MzA0Y1x1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zg0KLQ0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF90aXRsZT1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwYTJcdTMwYTZcdTMwYzhcdTU5MzFcdTY1NTcNCi1GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfbXNnPVx1NGUwMFx1OTBlOFx1MzA2ZVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2Zlx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1MzBhMlx1MzBhNlx1MzBjOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi0NCi1JbXBvcnRDb25maWdSZXBvcnRQYWdlX3RpdGxlPVx1NjljYlx1NjIxMFx1MzBlY1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA2ZVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOA0KLUltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IFx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Zlx1OGFhZFx1MzA3Zlx1NTNkNlx1MzA4YVx1NWMwMlx1NzUyOFx1MzA2N1x1MzA1OVx1MzAwMg0KLUltcG9ydFBsdWdpbldpemFyZF9NU0cxPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLUltcG9ydFBsdWdpbldpemFyZF9lcnJvcj1cdTMwYThcdTMwZTlcdTMwZmMNCi1JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zPUlVUEUwMjAwRTogXHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHU2YjIxXHUzMDZlXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDZmXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyXHU1NDBjXHUzMDU4XHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDkyXHU1MThkXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU5XHUzMDhiXHUzMDY4XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDRjXHU0ZTBhXHU2NmY4XHUzMDRkXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5OlxuXG4gezB9IFxuXG5cdTdkOWFcdTg4NGNcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU9XG5cblx1N2Q5YVx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi0NCi1TZWxlY3RDb25maWdzVG9JbXBvcnRfbGFiZWwxPVx1NmIyMVx1MzA2ZVx1ODk4MVx1N2QyMFx1MzA0Y1x1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OToNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yPVx1MzBhOFx1MzBlOVx1MzBmYw0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfTVNHMT1cdTUyMDZcdTY3OTBcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV90aXRsZTI9XHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU5XHUzMDhiXHU2OWNiXHU2MjEwXHU0ZWQ1XHU2OWQ4XHUzMDZlXHU5MDc4XHU2MjllDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vdF91c2VkPW5vdF91c2VkDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX3BhdGg9XHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDZmXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX2Rpcj1cdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfcGx1Z2lucz1cdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTUxODVcdTMwNmVcdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTMwNmFcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjM6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcj1cdTRmNWNcdTYyMTBcdTgwMDU6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb249XHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzOg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9kZXNjPVx1ODk4MVx1NjVlODoNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZmXHU4YWFkXHUzMDdmXHU1M2Q2XHUzMDhhXHU1YzAyXHU3NTI4XHUzMDY3XHUzMDU5XHUzMDAyDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cwPVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1NjkxY1x1OGEzY1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMT1cdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZDFcdTMwYjlcdTMwNmJcdTMwNmZcdTY3MDlcdTUyYjlcdTMwNmFcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNGNcdTU0MmJcdTMwN2VcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzM9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDkyXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c1PVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMiBcdTRmOWRcdTViNThcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNjdcdTMwNDJcdTMwOGIgJyd7MH0nJyBcdTMwNGNcdTMwMDFcdTczZmVcdTg4NGNcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmJcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzY9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDkyXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyIFx1NGY5ZFx1NWI1OFx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA0Y1x1NzNmZVx1ODg0Y1x1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Ylx1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLURpZmZSZXBvcnRWaWV3ZXJfY29udGVudD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQNCi1EaWZmUmVwb3J0Vmlld2VyX2luX2ltcG9ydD1cdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTUxODUNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfTVNHMT1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTUyMDZcdTY3OTBcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1EaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM9XHUzMDZmXHUzMDQ0DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2Vycm9yPVx1MzBhOFx1MzBlOVx1MzBmYw0KLURpZmZSZXBvcnRWaWV3ZXJfaW5fbGliPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NTE4NQ0KLURpZmZSZXBvcnRWaWV3ZXJfc3RhdHVzPVx1NzJiNlx1NmNjMQ0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzPVx1NzNmZVx1ODg0Y1x1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NTE4NVx1MzA2ZVx1OTA3OFx1NjI5ZVx1NmUwOFx1MzA3Zlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmMw0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luTm90RXhpc3RzPVx1NzNmZVx1ODg0Y1x1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Ylx1MzA2YVx1MzA0NFx1OTA3OFx1NjI5ZVx1NmUwOFx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmMw0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjRXhpc3RzPVx1NzNmZVx1ODg0Y1x1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NTE4NVx1MzA2ZVx1NjljYlx1NjIxMA0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNOb1NlbGVjdGlvbj1cdTY5Y2JcdTYyMTBcdTRlZDVcdTY5ZDhcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsPVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzBmYlx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBmY1x1NTE4NVx1MzA2ZVx1OTA3OFx1NjI5ZVx1NmUwOFx1MzA3Zlx1MzA2ZVx1NjljYlx1NjIxMA0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3M9XHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHU1MTg1XHUzMDZlXHU5MDc4XHU2MjllXHU1M2VmXHU4MGZkXHUzMDZhXHU2OWNiXHU2MjEwXHU0ZWQ1XHU2OWQ4Og0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQ9bm90X3VzZWQNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjPVx1ODk4MVx1NjVlODoNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX3BhdGg9XHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGQxXHUzMGI5XHUzMDZmXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X3BsdWdpbk5vU2VsZWN0aW9uPVx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fZGlyPVx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBmY1x1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX3JlYWRvbmx5PVx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmMyB7MH0gXHUzMDZmXHU4YWFkXHUzMDdmXHU1M2Q2XHUzMDhhXHU1YzAyXHU3NTI4XHUzMDY3XHUzMDU5XG4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9sb2NrZWQ9SVVQRTAyMDNFOiBcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjMgezB9IFx1MzA2Zlx1MzBlZFx1MzBjM1x1MzBhZlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVxuDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NTE4NVx1MzA2ZVx1NGUwMFx1OTBlOFx1MzA2ZVx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA0Y1x1MzAwMVx1MzBlZFx1MzBjM1x1MzBhZlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzA0Ylx1OGFhZFx1MzA3Zlx1NTNkNlx1MzA4YVx1NWMwMlx1NzUyOFx1MzA2Ylx1MzA2YVx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMlxuIFx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1MzBhMlx1MzBmM1x1MzBlZFx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzAwMVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NjZmNFx1NjViMFx1NTNlZlx1ODBmZFx1MzA2N1x1MzA0Mlx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA5Mlx1NzhiYVx1OGE4ZFx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw9XHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHU1MTg1XHUzMDZlXHU5MDc4XHU2MjllXHU2ZTA4XHUzMDdmXHUzMDZlXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzDQotRGlmZlJlcG9ydFZpZXdlcl90eXBlPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzBmYlx1MzBiZlx1MzBhNFx1MzBkNw0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzPVx1NzNmZVx1ODg0Y1x1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Ylx1MzA2YVx1MzA0NFx1NjljYlx1NjIxMFx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUEUwMjA0RTogXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHUzMDAxezF9IFx1MzA2ZVx1NTI0ZFx1MzA2ZVx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmMyAoezB9KSBcdTMwNmJcdTMwODhcdTMwNjNcdTMwNjZcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmVcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNmYgezF9IFx1MzA2ZVx1NzNmZVx1ODg0Y1x1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1MzA5Mlx1NGY3Zlx1MzA2M1x1MzA2Nlx1ODg0Y1x1MzA0Nlx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQRTAyMDVFOiBcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNGNcdTMwMDF7MH0gXHUzMDZlXHU1MjRkXHUzMDZlXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHUzMDZiXHUzMDg4XHUzMDYzXHUzMDY2XHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZmIHswfSBcdTMwNmVcdTczZmVcdTg4NGNcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTMwOTJcdTRmN2ZcdTMwNjNcdTMwNjZcdTg4NGNcdTMwNDZcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBFMDIwNkU6IFx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1MzAwMXsxfSBcdTMwNmVcdTY1YjBcdTg5OGZcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjMgKHswfSkgXHUzMDZiXHUzMDg4XHUzMDYzXHUzMDY2XHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU5XHUzMDhiXHUzMDZiXHUzMDZmXHUzMDAxezF9IFx1MzA2Ylx1MzBhMlx1MzBjM1x1MzBkN1x1MzBiMFx1MzBlY1x1MzBmY1x1MzBjOVx1MzA1OVx1MzA4Ylx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQRTAyMDdFOiBcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTk1OGJcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTlcdTMwOGJcdTMwNmJcdTMwNmZcdTMwMDF7MH0gXHUzMDZiXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGIwXHUzMGVjXHUzMGZjXHUzMGM5XHUzMDU5XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4ZmY3YjYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMjAwRSAtIElVUEUwMjk5RQ0KLSMNCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlPVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWFkNmNcdWMxMzEgXHVhYzAwXHVjODM4XHVjNjI0XHVhZTMwDQotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90aXRsZT1cdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAgXHViNTE0XHViODA5XHVkMWEwXHViOWFjIFx1YzljMFx1YzgxNQ0KLXNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGV4dD1cdWFjMDBcdWM4MzhcdWM2MmMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWQzZWNcdWQ1NjhcdWQ1NThcdWIyOTQgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90aXRsZT1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHViY2MwXHVhY2JkXHVjMGFjXHVkNTZkIFx1YWM4MFx1ZDFhMA0KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RleHQ9XHVkNjA0XHVjN2FjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM3NTggXHViY2MwXHVhY2JkXHVjMGFjXHVkNTZkXHVjNzQ0IFx1YWM4MFx1ZDFhMFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGU9XHVhZDZjXHVjMTMxIFx1YzJhNFx1ZDM5OSBcdWMxMjBcdWQwZGQNCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGV4dD1cdWFjMDBcdWM4MzhcdWM2MmMgXHVkNTU4XHViMDk4IFx1Yzc3NFx1YzBjMVx1Yzc1OCBcdWFkNmNcdWMxMzEgXHVjMmE0XHVkMzk5XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4IFx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMA0KLXNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RpdGxlPVx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMCBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWMgXHVjOWMwXHVjODE1DQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dD1cdWFjMDBcdWM4MzhcdWM2MmMgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWQzZWNcdWQ1NjhcdWQ1NThcdWIyOTQgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4IFx1YzEyMFx1ZDBkZA0KLXNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RleHQ9XHVhYzAwXHVjODM4XHVjNjJjIFx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuIFx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NzQgXHVkNjA0XHVjN2FjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM1ZDAgXHVjNzc0XHViYmY4IFx1Yzc4OFx1Yzc0NCBcdWFjYmRcdWM2YjAgXHViYzg0XHVjODA0IFx1Y2MyOFx1Yzc3NFx1Yjk3YyBcdWQ2NTVcdWM3NzhcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotaW1wb3J0UGx1Z2luc1dpemFyZF9FUlJfSW1wb3J0X3BsdWdpbj1cdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVhYzAwXHVjODM4XHVjNjI0XHVjOWMwIFx1YmFiYlx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cwPVx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVhZDZjXHVjMTMxXHVjNzU4IFx1YzcyMFx1ZDZhOFx1YzEzMSBcdWFjODBcdWM5OWQgXHVjOTExLi4uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMT1cdWM5YzBcdWM4MTVcdWQ1NWMgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHVjNWQwIFx1YzYyY1x1YmMxNFx1Yjk3OCBcdWFkNmNcdWMxMzFcdWM3NzQgXHVkM2VjXHVkNTY4XHViNDE4XHVjNWI0IFx1Yzc4OFx1YzljMCBcdWM1NGFcdWMyYjVcdWIyYzhcdWIyZTQuDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMz1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YWMwMFx1YzgzOFx1YzYyNFx1YjI5NCBcdWM5MTEuLi4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cyPVx1ZDYwNFx1YzdhYyBcdWM1ZjRcdWI5YjAgXHVjMGMxXHVkMGRjXHVjNzc4IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM3OTBcdWNjYjRcdWI4NWMgXHVhYzAwXHVjODM4XHVjNjJjIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9NU0cxPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzFcdWM3NDQgXHVhYzAwXHVjODM4XHVjNjI0XHViMjk0IFx1YzkxMS4uLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uPVx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWFjMDBcdWM4MzhcdWM2MjRcdWM5YzAgXHViYWJiXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF90aXRsZT1cdWNjYjRcdWQwNmNcdWM1NDRcdWM2YzMgXHVjMmU0XHVkMzI4DQotRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX21zZz1cdWM3N2NcdWJkODAgXHVkMzBjXHVjNzdjXHVjNzc0IFx1Y2NiNFx1ZDA2Y1x1YzU0NFx1YzZjM1x1YjQxOFx1YzljMCBcdWM1NGFcdWM1NThcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YjJlNFx1YzJkYyBcdWMyZGNcdWIzYzRcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotDQotSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZT1cdWFkNmNcdWMxMzEgXHViY2Y0XHVhY2UwXHVjMTFjIFx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMA0KLUltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YWMwMCBcdWM3N2RcdWFlMzAgXHVjODA0XHVjNmE5XHVjNzg1XHViMmM4XHViMmU0Lg0KLUltcG9ydFBsdWdpbldpemFyZF9NU0cxPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVhYzAwXHVjODM4XHVjNjI0XHViMjk0IFx1YzkxMS4uLg0KLUltcG9ydFBsdWdpbldpemFyZF9lcnJvcj1cdWM2MjRcdWI5NTgNCi1JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zPUlVUEUwMjAwRTogXHVjMTIwXHVkMGRkXHVkNTVjIFx1YjJlNFx1Yzc0YyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NzQgXHVjNzc0XHViYmY4IFx1Yzc4OFx1YWUzMCBcdWI1NGNcdWJiMzhcdWM1ZDAgXHViM2Q5XHVjNzdjXHVkNTVjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWIyZTRcdWMyZGMgXHVhYzAwXHVjODM4XHVjNjI0XHViYTc0IFx1YWUzMFx1Yzg3NCBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVhY2I5XHVjY2QwXHVjNTAxXHViMmM4XHViMmU0LlxuXG4gezB9IFxuXG5cdWFjYzRcdWMxOGRcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU9XG5cblx1YWNjNFx1YzE4ZFx1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCi0NCi1TZWxlY3RDb25maWdzVG9JbXBvcnRfbGFiZWwxPVx1YWMwMFx1YzgzOFx1YzYyYyBcdWM2OTRcdWMxOGM6DQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvcj1cdWM2MjRcdWI5NTgNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX01TRzE9XHViZDg0XHVjMTFkIFx1YzkxMQ0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX3RpdGxlMj1cdWFjMDBcdWM4MzhcdWM2MmMgXHVhZDZjXHVjMTMxIFx1YzJhNFx1ZDM5OSBcdWMxMjBcdWQwZGQNCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm90X3VzZWQ9bm90X3VzZWQNCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fcGF0aD1cdWM5YzBcdWM4MTVcdWQ1NWMgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHVhYzAwIFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fZGlyPVx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1Yjk3YyBcdWM5YzBcdWM4MTVcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNTU4XHVjMmI1XHViMmM4XHViMmU0Lg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zPVx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMCBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWNcdWM1ZDBcdWMxMWMgXHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3Nzg6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcj1cdWM3OTFcdWMxMzFcdWM3OTA6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb249XHViYzg0XHVjODA0Og0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9kZXNjPVx1YWMwNFx1YjdiNVx1ZDU1YyBcdWMxMjRcdWJhODU6DQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YWMwMCBcdWM3N2RcdWFlMzAgXHVjODA0XHVjNmE5XHVjNzg1XHViMmM4XHViMmU0Lg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMD1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzU4IFx1YzcyMFx1ZDZhOFx1YzEzMSBcdWFjODBcdWM5OWQgXHVjOTExLi4uDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cxPVx1YzljMFx1YzgxNVx1ZDU1YyBcdWFjYmRcdWI4NWNcdWM1ZDAgXHVjNjJjXHViYzE0XHViOTc4IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NzQgXHVkM2VjXHVkNTY4XHViNDE4XHVjNWI0IFx1Yzc4OFx1YzljMCBcdWM1NGFcdWMyYjVcdWIyYzhcdWIyZTQuDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0czPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVhYzAwXHVjODM4XHVjNjI0XHViMjk0IFx1YzkxMS4uLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNT1cdWMxMjBcdWQwZGRcdWQ1NWMgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWFjMDBcdWM4MzhcdWM2MmMgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVkNjA0XHVjN2FjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM1ZDBcdWMxMWMgXHVkNTc0XHViMmY5XHVkNTU4XHViMjk0IFx1Yzg4NVx1YzE4ZFx1YzgwMSBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzggJyd7MH0nJ1x1Yzc0NChcdWI5N2MpIFx1Y2MzZVx1Yzc0NCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNj1cdWMxMjBcdWQwZGRcdWQ1NWMgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWFjMDBcdWM4MzhcdWM2MmMgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVkNjA0XHVjN2FjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM1ZDBcdWMxMWMgXHVkNTc0XHViMmY5XHVkNTU4XHViMjk0IFx1Yzg4NVx1YzE4ZFx1YzgwMSBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVjYzNlXHVjNzQ0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotRGlmZlJlcG9ydFZpZXdlcl9jb250ZW50PVx1Y2VlOFx1ZDE1MFx1Y2UyMA0KLURpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0PVx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMCBcdWIwYjRcdWJkODANCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfTVNHMT1cdWQzMGNcdWM3N2MgXHViZDg0XHVjMTFkIFx1YzkxMS4uLg0KLURpZmZSZXBvcnRMYWJlbFByb3ZpZGVyX3llcz1cdWM2MDgNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfZXJyb3I9XHVjNjI0XHViOTU4DQotRGlmZlJlcG9ydFZpZXdlcl9pbl9saWI9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YjBiNFx1YmQ4MA0KLURpZmZSZXBvcnRWaWV3ZXJfc3RhdHVzPVx1YzBjMVx1ZDBkYw0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzPVx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NzQgXHVkNjA0XHVjN2FjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5Ob3RFeGlzdHM9XHVjMTIwXHVkMGRkXHVkNTVjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc3NCBcdWQ2MDRcdWM3YWMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVjNWQwIFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY0V4aXN0cz1cdWFkNmNcdWMxMzFcdWM3NzQgXHVkNjA0XHVjN2FjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY05vU2VsZWN0aW9uPVx1YWQ2Y1x1YzEzMSBcdWMyYTRcdWQzOTlcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjOWMwIFx1YzU0YVx1YzU1OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsPVx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMCBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWNcdWM3NTggXHVjMTIwXHVkMGRkXHViNDFjIFx1YWQ2Y1x1YzEzMQ0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3M9XHVhYzAwXHVjODM4XHVjNjI0XHVhZTMwIFx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1YzVkMFx1YzExYyBcdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTVjIFx1YWQ2Y1x1YzEzMSBcdWMyYTRcdWQzOTk6DQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZD1ub3RfdXNlZA0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2Rlc2M9XHVhYzA0XHViN2I1XHVkNTVjIFx1YzEyNFx1YmE4NToNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX3BhdGg9XHVjOWMwXHVjODE1XHVkNTVjIFx1YWNiZFx1Yjg1Y1x1YWMwMCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X3BsdWdpbk5vU2VsZWN0aW9uPVx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNTU4XHVjMmI1XHViMmM4XHViMmU0Lg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fZGlyPVx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1Yjk3YyBcdWM5YzBcdWM4MTVcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNTU4XHVjMmI1XHViMmM4XHViMmU0Lg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX3JlYWRvbmx5PXswfSBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NzQgXHVjNzdkXHVhZTMwIFx1YzgwNFx1YzZhOVx1Yzc4NVx1YjJjOFx1YjJlNC5cbg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX2xvY2tlZD1JVVBFMDIwM0U6IHswfSBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NzQgXHVjN2EwXHVhZTA4IFx1YzBjMVx1ZDBkY1x1Yzc4NVx1YjJjOFx1YjJlNC5cbg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfZXJyb3Jfbm90X3VwZGF0YWJsZT1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM3NTggXHVjNzdjXHViZDgwIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc3NCBcdWM3YTBcdWFlMDggXHVjMGMxXHVkMGRjXHVjNzc0XHVhYzcwXHViMDk4IFx1Yzc3ZFx1YWUzMCBcdWM4MDRcdWM2YTlcdWM3ODVcdWIyYzhcdWIyZTQuXG4gXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzU4IFx1YzdhMFx1YWUwOFx1Yzc0NCBcdWQ1NzRcdWM4MWNcdWQ1NThcdWFjNzBcdWIwOTggXHVkMzBjXHVjNzdjXHVjNzc0IFx1YWMzMVx1YzJlMCBcdWFjMDBcdWIyYTVcdWQ1NWNcdWM5YzAgXHVkNjU1XHVjNzc4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw9XHVhYzAwXHVjODM4XHVjNjI0XHVhZTMwIFx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1YzVkMFx1YzExYyBcdWMxMjBcdWQwZGRcdWI0MWMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotRGlmZlJlcG9ydFZpZXdlcl90eXBlPVx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWM3MjBcdWQ2MTUNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY05vdEV4aXN0cz1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVhZDZjXHVjMTMxXHVjNzc0IFx1ZDYwNFx1YzdhYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM1ZDAgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUEUwMjA0RTogXHVjOWMwXHVjODE1XHViNDFjIFx1ZDMwY1x1Yzc3Y1x1Yzc3NCB7MX0gXHVjNzc0XHVjODA0IFx1YmM4NFx1YzgwNCh7MH0pXHVjNWQwXHVjMTFjIFx1YjBiNFx1YmNmNFx1YjBiNFx1Yzg0Y1x1YzJiNVx1YjJjOFx1YjJlNC4gezF9IFx1ZDYwNFx1YzdhYyBcdWJjODRcdWM4MDRcdWM3NDQgXHVjMGFjXHVjNmE5XHVkNTU4XHVjNWVjIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWIwYjRcdWJjZjRcdWIwYjRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQRTAyMDVFOiBcdWM5YzBcdWM4MTVcdWI0MWMgXHVkMzBjXHVjNzdjXHVjNzc0IHswfSBcdWM3NzRcdWM4MDQgXHViYzg0XHVjODA0XHVjNWQwXHVjMTFjIFx1YjBiNFx1YmNmNFx1YjBiNFx1Yzg0Y1x1YzJiNVx1YjJjOFx1YjJlNC4gezB9IFx1ZDYwNFx1YzdhYyBcdWJjODRcdWM4MDRcdWM3NDQgXHVjMGFjXHVjNmE5XHVkNTU4XHVjNWVjIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWIwYjRcdWJjZjRcdWIwYjRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUEUwMjA2RTogXHVjOWMwXHVjODE1XHViNDFjIFx1ZDMwY1x1Yzc3Y1x1Yzc3NCB7MX0gXHVjMGM4IFx1YmM4NFx1YzgwNCh7MH0pXHVjNWQwXHVjMTFjIFx1YjBiNFx1YmNmNFx1YjBiNFx1Yzg0Y1x1YzJiNVx1YjJjOFx1YjJlNC4gXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YWMwMFx1YzgzOFx1YzYyNFx1YjgyNFx1YmE3NCB7MX0gXHViYzg0XHVjODA0XHVjNzQ0IFx1YzVjNVx1YWRmOFx1YjgwOFx1Yzc3NFx1YjRkY1x1ZDU3NFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuIA0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQRTAyMDdFOiBcdWM5YzBcdWM4MTVcdWQ1NWMgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzVmNCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWQzMGNcdWM3N2NcdWM3NDQgXHVhYzAwXHVjODM4XHVjNjI0XHViODI0XHViYTc0IHswfSBcdWJjODRcdWM4MDRcdWM3NDQgXHVjNWM1XHVhZGY4XHViODA4XHVjNzc0XHViNGRjXHVkNTc0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC4gDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2YzE0NzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMjAwRSAtIElVUEUwMjk5RQ0KLSMNCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlPUltcG9ydGFyIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgQmlibGlvdGVjYQ0KLXNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGl0bGU9RXNwZWNpZmljYXIgZGlyZXRcdTAwZjNyaW8gZGUgaW1wb3J0YVx1MDBlN1x1MDBlM28NCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ9RXNwZWNpZmlxdWUgbyBkaXJldFx1MDBmM3JpbyBxdWUgY29udFx1MDBlOW0gYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIGJpYmxpb3RlY2EgcGFyYSBpbXBvcnRhXHUwMGU3XHUwMGUzby4NCi1yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90aXRsZT1SZXZpc2FyIGFsdGVyYVx1MDBlN1x1MDBmNWVzIGRhIGJpYmxpb3RlY2ENCi1yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90ZXh0PVJldmlzZSBhcyBhbHRlcmFcdTAwZTdcdTAwZjVlcyBxdWUgc2VyXHUwMGUzbyBmZWl0YXMgbmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYXR1YWwuDQotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RpdGxlPVNlbGVjaW9uYXIgZXNwZWNpZmljYVx1MDBlN1x1MDBmNWVzIGRlIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGV4dD1TZWxlY2lvbmUgdW1hIG91IG1haXMgZXNwZWNpZmljYVx1MDBlN1x1MDBmNWVzIGRlIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gcGFyYSBpbXBvcnRhXHUwMGU3XHUwMGUzby4NCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZT1JbXBvcnRhciBQbHVnLWlucyBkZSBNXHUwMGU5dG9kbw0KLXNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RpdGxlPUVzcGVjaWZpY2FyIGRpcmV0XHUwMGYzcmlvIGRlIGltcG9ydGFcdTAwZTdcdTAwZTNvDQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dD1Fc3BlY2lmaXF1ZSBvIGRpcmV0XHUwMGYzcmlvIHF1ZSBjb250XHUwMGU5bSBvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbyBwYXJhIGltcG9ydGFcdTAwZTdcdTAwZTNvLg0KLXNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RpdGxlPVNlbGVjaW9uYXIgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8NCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0PVNlbGVjaW9uZSB1bSBvdSBtYWlzIHBsdWctaW5zIGRlIG1cdTAwZTl0b2RvIHBhcmEgaW1wb3J0YVx1MDBlN1x1MDBlM28uIFNlIHVtIHBsdWctaW4gc2VsZWNpb25hZG8galx1MDBlMSBleGlzdGlyIG5hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGF0dWFsLCB2ZXJpZmlxdWUgYXMgZGlmZXJlblx1MDBlN2FzIGRlIHZlcnNcdTAwZjVlcy4NCi1pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luPUZhbGhhIGFvIGltcG9ydGFyIHBsdWdpbg0KLQ0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzA9VmFsaWRhbmRvIGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkYSBiaWJsaW90ZWNhIHNlbGVjaW9uYWRhLi4uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMT1PIGRpcmV0XHUwMGYzcmlvIGVzcGVjaWZpY2FkbyBuXHUwMGUzbyBjb250XHUwMGU5bSB1bWEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyB2XHUwMGUxbGlkYS4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0czPUltcG9ydGFuZG8gY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBtXHUwMGU5dG9kby4uLg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzI9SW1wb3NzXHUwMGVkdmVsIGltcG9ydGFyIGEgYmlibGlvdGVjYSBhYmVydGEgYXR1YWxtZW50ZSBwYXJhIGRlbnRybyBkZWxhIG1lc21hLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfTVNHMT1JbXBvcnRhbmRvIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgbVx1MDBlOXRvZG8uLi4NCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX0VSUl9JbXBvcnRfY29uZmlndXJhdGlvbj1GYWxoYSBhbyBpbXBvcnRhciBjb25maWd1cmFcdTAwZTdcdTAwZTNvDQotDQotRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX3RpdGxlPUZhbGhhIG5vIHJlZ2lzdHJvIGRlIHNhXHUwMGVkZGENCi1GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfbXNnPUEgc2FcdTAwZWRkYSBkZSBhbGd1bnMgYXJxdWl2b3Mgblx1MDBlM28gZm9pIGVmZXR1YWRhOyBkZXNlamEgdGVudGFyIG5vdmFtZW50ZT8NCi0NCi1JbXBvcnRDb25maWdSZXBvcnRQYWdlX3RpdGxlPUltcG9ydGFuZG8gUmVsYXRcdTAwZjNyaW8gZGUgQ29uZmlndXJhXHUwMGU3XHUwMGUzbw0KLUltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IEEgYmlibGlvdGVjYSBcdTAwZTkgZGUgbGVpdHVyYS4NCi1JbXBvcnRQbHVnaW5XaXphcmRfTVNHMT1JbXBvcnRhbmRvIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8uLi4NCi1JbXBvcnRQbHVnaW5XaXphcmRfZXJyb3I9RXJybw0KLUltcG9ydFBsdWdpbldpemFyZF93YXJuX2V4aXN0aW5nX3BsdWdpbnM9SVVQRTAyMDBFOiBPcyBzZWd1aW50ZXMgcGx1Zy1pbnMgc2VsZWNpb25hZG9zIGpcdTAwZTEgZXhpc3RlbSBlIGEgcmVpbXBvcnRhXHUwMGU3XHUwMGUzbyBkb3MgbWVzbW9zIHBsdWctaW5zIHNvYnJlc2NyZXZlclx1MDBlMSBvcyBleGlzdGVudGVzOlxuXG4gezB9IFxuXG5UZW0gY2VydGV6YSBkZSBxdWUgZGVzZWphIGNvbnRpbnVhcj8NCi1JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZT1cblxuVGVtIGNlcnRlemEgZGUgcXVlIGRlc2VqYSBjb250aW51YXI/DQotDQotU2VsZWN0Q29uZmlnc1RvSW1wb3J0X2xhYmVsMT1PcyBzZWd1aW50ZXMgZWxlbWVudG9zIHNlclx1MDBlM28gaW1wb3J0YWRvczoNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yPUVycm8NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX01TRzE9QW5hbGlzYW5kbw0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX3RpdGxlMj1TZWxlY2lvbmFyIGVzcGVjaWZpY2FcdTAwZTdcdTAwZjVlcyBkZSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHBhcmEgaW1wb3J0YVx1MDBlN1x1MDBlM28NCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm90X3VzZWQ9blx1MDBlM29fdXRpbGl6YWRvDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX3BhdGg9TyBkaXJldFx1MDBmM3JpbyBlc3BlY2lmaWNhZG8gblx1MDBlM28gZXhpc3RlLg0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19kaXI9TmVuaHVtIGRpcmV0XHUwMGYzcmlvIGVzcGVjaWZpY2Fkbw0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zPVBsdWctaW5zIGRpc3Bvblx1MDBlZHZlaXMgbm8gZGlyZXRcdTAwZjNyaW8gZGUgaW1wb3J0YVx1MDBlN1x1MDBlM286DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcj1BdXRvcjoNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbj1WZXJzXHUwMGUzbzoNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfZGVzYz1EZXNjcmlcdTAwZTdcdTAwZTNvIHJlc3VtaWRhOg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfcmVhZG9ubHk9SVVQRTAyMDFFOiBBIGJpYmxpb3RlY2EgXHUwMGU5IGRlIGxlaXR1cmEuDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cwPVZhbGlkYW5kbyBvcyBwbHVnLWlucyBzZWxlY2lvbmFkb3MuLi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzE9TyBjYW1pbmhvIGVzcGVjaWZpY2FkbyBuXHUwMGUzbyBjb250XHUwMGU5bSB1bSBwbHVnLWluIGRlIG1cdTAwZTl0b2RvIHZcdTAwZTFsaWRvLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMz1JbXBvcnRhbmRvIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8uLi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzU9Tlx1MDBlM28gXHUwMGU5IHBvc3NcdTAwZWR2ZWwgaW1wb3J0YXIgbyBwbHVnLWluIGRlIG1cdTAwZTl0b2RvIHNlbGVjaW9uYWRvLiBTZXUgcGx1Zy1pbiBkZXBlbmRlbnRlICcnezB9Jycgblx1MDBlM28gZm9pIGxvY2FsaXphZG8gbmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYXR1YWwuDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c2PU5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGltcG9ydGFyIG8gcGx1Zy1pbiBkZSBtXHUwMGU5dG9kbyBzZWxlY2lvbmFkby4gTlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgbG9jYWxpemFyIHVtIHBsdWctaW4gZGVwZW5kZW50ZSBuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhdHVhbC4NCi1EaWZmUmVwb3J0Vmlld2VyX2NvbnRlbnQ9Q29udGVcdTAwZmFkbw0KLURpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0PU5hIEltcG9ydGFcdTAwZTdcdTAwZTNvDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X01TRzE9QW5hbGlzYW5kbyBhcnF1aXZvcy4uLg0KLURpZmZSZXBvcnRMYWJlbFByb3ZpZGVyX3llcz1TaW0NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfZXJyb3I9RXJybw0KLURpZmZSZXBvcnRWaWV3ZXJfaW5fbGliPU5hIEJpYmxpb3RlY2ENCi1EaWZmUmVwb3J0Vmlld2VyX3N0YXR1cz1TdGF0dXMNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbkV4aXN0cz1PIHBsdWctaW4gc2VsZWNpb25hZG8gZm9pIGxvY2FsaXphZG8gbmEgYmlibGlvdGVjYSBhdHVhbC4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbk5vdEV4aXN0cz1PIHBsdWctaW4gc2VsZWNpb25hZG8gblx1MDBlM28gZm9pIGxvY2FsaXphZG8gbmEgYmlibGlvdGVjYSBhdHVhbC4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY0V4aXN0cz1BIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZm9pIGxvY2FsaXphZGEgbmEgYmlibGlvdGVjYSBhdHVhbC4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjTm9TZWxlY3Rpb249TmVuaHVtYSBlc3BlY2lmaWNhXHUwMGU3XHUwMGUzbyBkZSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHNlbGVjaW9uYWRhLg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNEYXRhTGFiZWw9Q29uZmlndXJhXHUwMGU3XHUwMGUzbyBzZWxlY2lvbmFkYSBubyBkaXJldFx1MDBmM3JpbyBkZSBpbXBvcnRhXHUwMGU3XHUwMGUzby4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9jb25maWdzPUVzcGVjaWZpY2FcdTAwZTdcdTAwZjVlcyBkZSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRpc3Bvblx1MDBlZHZlaXMgbm8gZGlyZXRcdTAwZjNyaW8gZGUgaW1wb3J0YVx1MDBlN1x1MDBlM286DQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZD1uXHUwMGUzb191dGlsaXphZG8NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjPURlc2NyaVx1MDBlN1x1MDBlM28gcmVzdW1pZGE6DQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoPU8gY2FtaW5obyBlc3BlY2lmaWNhZG8gblx1MDBlM28gZXhpc3RlLg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbj1OZW5odW0gcGx1Zy1pbiBzZWxlY2lvbmFkby4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX2Rpcj1OZW5odW0gZGlyZXRcdTAwZjNyaW8gZXNwZWNpZmljYWRvDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fcmVhZG9ubHk9TyBwbHVnLWluIHswfSBcdTAwZTkgZGUgbGVpdHVyYVxuDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fbG9ja2VkPUlVUEUwMjAzRTogTyBwbHVnLWluIHswfSBlc3RcdTAwZTEgYmxvcXVlYWRvXG4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX2Vycm9yX25vdF91cGRhdGFibGU9QWxndW0obnMpIGRvKHMpIHBsdWctaW4ocykgZGEgYmlibGlvdGVjYSBlc3RcdTAwZTNvIGJsb3F1ZWFkb3Mgb3Ugc1x1MDBlM28gZGUgbGVpdHVyYS5cbkRlc2Jsb3F1ZWllIG9zIHBsdWctaW5zIGUgY2VydGlmaXF1ZS1zZSBkZSBxdWUgb3MgYXJxdWl2b3Mgc1x1MDBlM28gYXR1YWxpelx1MDBlMXZlaXMuDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X3BsdWdpbkRhdGFMYWJlbD1QbHVnLWluIHNlbGVjaW9uYWRvIG5vIGRpcmV0XHUwMGYzcmlvIGRlIGltcG9ydGFcdTAwZTdcdTAwZTNvLg0KLURpZmZSZXBvcnRWaWV3ZXJfdHlwZT1UaXBvIGRlIENvbnRlXHUwMGZhZG8NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY05vdEV4aXN0cz1BIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gc2VsZWNpb25hZGEgblx1MDBlM28gZm9pIGxvY2FsaXphZGEgbmEgYmlibGlvdGVjYSBhdHVhbC4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBFMDIwNEU6IE9zIGFycXVpdm9zIGVzcGVjaWZpY2Fkb3MgZm9yYW0gZXhwb3J0YWRvcyBwb3IgdW1hIHZlcnNcdTAwZTNvIGFudGVyaW9yICh7MH0pIGRlIHsxfS4gT3MgYXJxdWl2b3MgZGV2ZW0gc2VyIGV4cG9ydGFkb3MgdXNhbmRvIGEgdmVyc1x1MDBlM28gYXR1YWwgZG8gezF9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQRTAyMDVFOiBPcyBhcnF1aXZvcyBlc3BlY2lmaWNhZG9zIGZvcmFtIGV4cG9ydGFkb3MgcG9yIHVtYSB2ZXJzXHUwMGUzbyBhbnRlcmlvciBkZSB7MH0uIE9zIGFycXVpdm9zIGRldmVtIHNlciBleHBvcnRhZG9zIHVzYW5kbyBhIHZlcnNcdTAwZTNvIGF0dWFsIGRvIHswfS4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBFMDIwNkU6IE9zIGFycXVpdm9zIGVzcGVjaWZpY2Fkb3MgZm9yYW0gZXhwb3J0YWRvcyBwb3IgdW1hIHZlcnNcdTAwZTNvIG1haXMgcmVjZW50ZSAoezB9KSBkZSB7MX0uIFZvY1x1MDBlYSBkZXZlIGZhemVyIHVwZ3JhZGUgZGUgezF9IHBhcmEgaW1wb3J0YXIgb3MgYXJxdWl2b3MuICANCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUEUwMjA3RTogT3MgYXJxdWl2b3MgZXNwZWNpZmljYWRvcyBuXHUwMGUzbyBwdWRlcmFtIHNlciBhYmVydG9zLiBWb2NcdTAwZWEgZGV2ZSBmYXplciB1cGdyYWRlIGRlIHswfSBwYXJhIGltcG9ydGFyIG9zIGFycXVpdm9zLiAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1ZGQ5ZmQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMjAwRSAtIElVUEUwMjk5RQ0KLSMNCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlPVx1NWJmY1x1NTE2NVx1NWU5M1x1OTE0ZFx1N2Y2ZQ0KLXNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGl0bGU9XHU2MzA3XHU1YjlhXHU1YmZjXHU1MTY1XHU3NmVlXHU1ZjU1DQotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90ZXh0PVx1NjMwN1x1NWI5YVx1NTMwNVx1NTQyYlx1ODk4MVx1NWJmY1x1NTE2NVx1NzY4NFx1NWU5M1x1OTE0ZFx1N2Y2ZVx1NzY4NFx1NzZlZVx1NWY1NVx1MzAwMg0KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RpdGxlPVx1NjhjMFx1NjdlNVx1NWU5M1x1NjZmNFx1NjUzOQ0KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RleHQ9XHU2OGMwXHU2N2U1XHU1YzA2XHU1YmY5XHU1ZjUzXHU1MjRkXHU2NWI5XHU2Y2Q1XHU1ZTkzXHU0ZjVjXHU1MWZhXHU3Njg0XHU2NmY0XHU2NTM5XHUzMDAyDQotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RpdGxlPVx1OTAwOVx1NjJlOVx1OTE0ZFx1N2Y2ZVx1ODljNFx1ODMwMw0KLXNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90ZXh0PVx1OTAwOVx1NjJlOVx1ODk4MVx1NWJmY1x1NTE2NVx1NzY4NFx1NGUwMFx1NGUyYVx1NjIxNlx1NTkxYVx1NGUyYVx1OTE0ZFx1N2Y2ZVx1ODljNFx1ODMwM1x1MzAwMg0KLQ0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPVx1NWJmY1x1NTE2NVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLXNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RpdGxlPVx1NjMwN1x1NWI5YVx1NWJmY1x1NTE2NVx1NzZlZVx1NWY1NQ0KLXNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RleHQ9XHU2MzA3XHU1YjlhXHU1MzA1XHU1NDJiXHU4OTgxXHU1YmZjXHU1MTY1XHU3Njg0XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHU3Njg0XHU3NmVlXHU1ZjU1XHUzMDAyDQotc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGl0bGU9XHU5MDA5XHU2MmU5XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2DQotc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGV4dD1cdTkwMDlcdTYyZTlcdTg5ODFcdTViZmNcdTUxNjVcdTc2ODRcdTRlMDBcdTRlMmFcdTYyMTZcdTU5MWFcdTRlMmFcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjZcdTMwMDJcdTU5ODJcdTY3OWNcdTkwMDlcdTViOWFcdTc2ODRcdTYzZDJcdTRlZjZcdTVkZjJcdTViNThcdTU3MjhcdTRlOGVcdTVmNTNcdTUyNGRcdTY1YjlcdTZjZDVcdTVlOTNcdTRlMmRcdWZmMGNcdThiZjdcdTlhOGNcdThiYzFcdTcyNDhcdTY3MmNcdTY3MDlcdTRlYzBcdTRlNDhcdTVkZWVcdTVmMDJcdTMwMDINCi1pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luPVx1NWJmY1x1NTE2NVx1NjNkMlx1NGVmNlx1NTkzMVx1OGQyNQ0KLQ0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzA9XHU2YjYzXHU1NzI4XHU5YThjXHU4YmMxXHU5MDA5XHU1YjlhXHU3Njg0XHU1ZTkzXHU5MTRkXHU3ZjZlLi4uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMT1cdTYzMDdcdTViOWFcdTc2ODRcdTc2ZWVcdTVmNTVcdTRlMGRcdTUzMDVcdTU0MmJcdTY3MDlcdTY1NDhcdTkxNGRcdTdmNmVcdTMwMDINCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0czPVx1NmI2M1x1NTcyOFx1NWJmY1x1NTE2NVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZS4uLg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzI9XHU2NWUwXHU2Y2Q1XHU1YzA2XHU1ZjUzXHU1MjRkXHU2MjUzXHU1ZjAwXHU3Njg0XHU1ZTkzXHU1YmZjXHU1MTY1XHU1MTc2XHU2NzJjXHU4ZWFiXHUzMDAyDQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9NU0cxPVx1NmI2M1x1NTcyOFx1NWJmY1x1NTE2NVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZS4uLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uPVx1NWJmY1x1NTE2NVx1OTE0ZFx1N2Y2ZVx1NTkzMVx1OGQyNQ0KLQ0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF90aXRsZT1cdTY4YzBcdTUxZmFcdTU5MzFcdThkMjUNCi1GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfbXNnPVx1NjcwOVx1NGU5Ylx1NjU4N1x1NGVmNlx1NWMxYVx1NjcyYVx1NjhjMFx1NTFmYVx1ZmYwY1x1NjYyZlx1NTQyNlx1ODk4MVx1OTFjZFx1OGJkNVx1ZmYxZg0KLQ0KLUltcG9ydENvbmZpZ1JlcG9ydFBhZ2VfdGl0bGU9XHU1YmZjXHU1MTY1XHU5MTRkXHU3ZjZlXHU2MmE1XHU1NDRhDQotSW1wb3J0UGx1Z2luV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogXHU1ZTkzXHU0ZTNhXHU1M2VhXHU4YmZiXHUzMDAyDQotSW1wb3J0UGx1Z2luV2l6YXJkX01TRzE9XHU2YjYzXHU1NzI4XHU1YmZjXHU1MTY1XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2Li4uDQotSW1wb3J0UGx1Z2luV2l6YXJkX2Vycm9yPVx1OTUxOVx1OGJlZg0KLUltcG9ydFBsdWdpbldpemFyZF93YXJuX2V4aXN0aW5nX3BsdWdpbnM9SVVQRTAyMDBFOiBcdTRlZTVcdTRlMGJcdTkwMDlcdTViOWFcdTc2ODRcdTYzZDJcdTRlZjZcdTVkZjJcdTViNThcdTU3MjhcdWZmMGNcdTkxY2RcdTY1YjBcdTViZmNcdTUxNjVcdTc2ZjhcdTU0MGNcdTYzZDJcdTRlZjZcdTVjMDZcdTg5ODZcdTc2ZDZcdTczYjBcdTY3MDlcdTYzZDJcdTRlZjZcdWZmMWFcblxuIHswfSBcblxuXHU3ODZlXHU1YjllXHU4OTgxXHU3ZWU3XHU3ZWVkXHU1NDE3XHVmZjFmDQotSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU9XG5cblx1Nzg2ZVx1NWI5YVx1ODk4MVx1N2VlN1x1N2VlZFx1NTQxN1x1ZmYxZg0KLQ0KLVNlbGVjdENvbmZpZ3NUb0ltcG9ydF9sYWJlbDE9XHU1YzA2XHU1YmZjXHU1MTY1XHU0ZWU1XHU0ZTBiXHU1MTQzXHU3ZDIwXHVmZjFhDQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvcj1cdTk1MTlcdThiZWYNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX01TRzE9XHU2YjYzXHU1NzI4XHU1MjA2XHU2NzkwDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfdGl0bGUyPVx1OTAwOVx1NjJlOVx1ODk4MVx1NWJmY1x1NTE2NVx1NzY4NFx1OTE0ZFx1N2Y2ZVx1ODljNFx1ODMwMw0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub3RfdXNlZD1cdTY3MmFcdTRmN2ZcdTc1MjgNCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fcGF0aD1cdTYzMDdcdTViOWFcdTc2ODRcdTc2ZWVcdTVmNTVcdTRlMGRcdTViNThcdTU3MjhcdTMwMDINCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fZGlyPVx1NjcyYVx1NjMwN1x1NWI5YVx1NGVmYlx1NGY1NVx1NzZlZVx1NWY1NQ0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zPVx1NWJmY1x1NTE2NVx1NzZlZVx1NWY1NVx1NGUyZFx1NzY4NFx1NTNlZlx1NzUyOFx1NjNkMlx1NGVmNlx1ZmYxYQ0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9hdXRob3I9XHU0ZjVjXHU4MDA1XHVmZjFhDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb249XHU3MjQ4XHU2NzJjXHVmZjFhDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2Rlc2M9XHU3YjgwXHU4OTgxXHU2M2NmXHU4ZmYwXHVmZjFhDQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IFx1NWU5M1x1NGUzYVx1NTNlYVx1OGJmYlx1MzAwMg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMD1cdTZiNjNcdTU3MjhcdTlhOGNcdThiYzFcdTkwMDlcdTViOWFcdTc2ODRcdTYzZDJcdTRlZjYuLi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzE9XHU2MzA3XHU1YjlhXHU4ZGVmXHU1Zjg0XHU0ZTBkXHU1MzA1XHU1NDJiXHU2NzA5XHU2NTQ4XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHUzMDAyDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0czPVx1NmI2M1x1NTcyOFx1NWJmY1x1NTE2NVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNi4uLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNT1cdTY1ZTBcdTZjZDVcdTViZmNcdTUxNjVcdTkwMDlcdTViOWFcdTc2ODRcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjZcdTMwMDJcdTY1ZTBcdTZjZDVcdTU3MjhcdTVmNTNcdTUyNGRcdTY1YjlcdTZjZDVcdTVlOTNcdTRlMmRcdTYyN2VcdTUyMzBcdTViODNcdTc2ODRcdTRmOWRcdThkNTZcdTYzZDJcdTRlZjZcdTIwMWN7MH1cdTIwMWRcdTMwMDINCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzY9XHU2NWUwXHU2Y2Q1XHU1YmZjXHU1MTY1XHU5MDA5XHU1YjlhXHU3Njg0XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHUzMDAyXHU2N2QwXHU0ZTJhXHU0ZjlkXHU4ZDU2XHU2M2QyXHU0ZWY2XHU1NzI4XHU1ZjUzXHU1MjRkXHU2NWI5XHU2Y2Q1XHU1ZTkzXHU0ZTJkXHU2NWUwXHU2Y2Q1XHU2MjdlXHU1MjMwXHUzMDAyDQotRGlmZlJlcG9ydFZpZXdlcl9jb250ZW50PVx1NTE4NVx1NWJiOQ0KLURpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0PVx1NWJmY1x1NTE2NVx1NGUyZA0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9NU0cxPVx1NmI2M1x1NTcyOFx1NTIwNlx1Njc5MFx1NjU4N1x1NGVmNi4uLg0KLURpZmZSZXBvcnRMYWJlbFByb3ZpZGVyX3llcz1cdTY2MmYNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfZXJyb3I9XHU5NTE5XHU4YmVmDQotRGlmZlJlcG9ydFZpZXdlcl9pbl9saWI9XHU1NzI4XHU1ZTkzXHU0ZTJkDQotRGlmZlJlcG9ydFZpZXdlcl9zdGF0dXM9XHU3MmI2XHU2MDAxDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5FeGlzdHM9XHU1ZjUzXHU1MjRkXHU1ZTkzXHU0ZTJkXHU2MjdlXHU1MjMwXHU3Njg0XHU5MDA5XHU1YjlhXHU2M2QyXHU0ZWY2DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5Ob3RFeGlzdHM9XHU2NzJhXHU1NzI4XHU1ZjUzXHU1MjRkXHU1ZTkzXHU0ZTJkXHU2MjdlXHU1MjMwXHU5MDA5XHU1YjlhXHU3Njg0XHU2M2QyXHU0ZWY2DQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHM9XHU1NzI4XHU1ZjUzXHU1MjRkXHU1ZTkzXHU0ZTJkXHU2MjdlXHU1MjMwXHU0ZTg2XHU5MTRkXHU3ZjZlDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY05vU2VsZWN0aW9uPVx1NjcyYVx1OTAwOVx1NjJlOVx1NGVmYlx1NGY1NVx1OTE0ZFx1N2Y2ZVx1ODljNFx1ODMwM1x1MzAwMg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNEYXRhTGFiZWw9XHU1YmZjXHU1MTY1XHU3NmVlXHU1ZjU1XHU0ZTJkXHU3Njg0XHU5MDA5XHU1YjlhXHU5MTRkXHU3ZjZlDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfY29uZmlncz1cdTViZmNcdTUxNjVcdTc2ZWVcdTVmNTVcdTRlMmRcdTc2ODRcdTUzZWZcdTc1MjhcdTkxNGRcdTdmNmVcdTg5YzRcdTgzMDNcdWZmMWENCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkPVx1NjcyYVx1NGY3Zlx1NzUyOA0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2Rlc2M9XHU3YjgwXHU4OTgxXHU2M2NmXHU4ZmYwXHVmZjFhDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoPVx1NjMwN1x1NWI5YVx1OGRlZlx1NWY4NFx1NGUwZFx1NWI1OFx1NTcyOFx1MzAwMg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbj1cdTY3MmFcdTkwMDlcdTYyZTlcdTRlZmJcdTRmNTVcdTYzZDJcdTRlZjZcdTMwMDINCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX2Rpcj1cdTY3MmFcdTYzMDdcdTViOWFcdTRlZmJcdTRmNTVcdTc2ZWVcdTVmNTUNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9yZWFkb25seT1cdTYzZDJcdTRlZjYgezB9IFx1NGUzYVx1NTNlYVx1OGJmYlxuDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fbG9ja2VkPUlVUEUwMjAzRTogXHU1ZGYyXHU5NTAxXHU1YjlhXHU2M2QyXHU0ZWY2IHswfVxuDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlPVx1NWU5M1x1NGUyZFx1NzY4NFx1NjdkMFx1NGU5Ylx1NjNkMlx1NGVmNlx1ODhhYlx1OTUwMVx1NWI5YVx1NjIxNlx1NGUzYVx1NTNlYVx1OGJmYlx1MzAwMlxuIFx1OGJmN1x1ODllM1x1OTUwMVx1OGZkOVx1NGU5Ylx1NjNkMlx1NGVmNlx1ZmYwY1x1NWU3Nlx1Nzg2ZVx1NGZkZFx1NjU4N1x1NGVmNlx1NTNlZlx1NjZmNFx1NjViMFx1MzAwMg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw9XHU1YmZjXHU1MTY1XHU3NmVlXHU1ZjU1XHU0ZTJkXHU3Njg0XHU5MDA5XHU1YjlhXHU2M2QyXHU0ZWY2DQotRGlmZlJlcG9ydFZpZXdlcl90eXBlPVx1NTE4NVx1NWJiOVx1N2M3Ylx1NTc4Yg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzPVx1NjcyYVx1NTcyOFx1NWY1M1x1NTI0ZFx1NWU5M1x1NGUyZFx1NjI3ZVx1NTIzMFx1OTAwOVx1NWI5YVx1NzY4NFx1OTE0ZFx1N2Y2ZVx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUEUwMjA0RTogXHU2MzA3XHU1YjlhXHU3Njg0XHU2NTg3XHU0ZWY2XHU2NjJmXHU3NTMxIHsxfSBcdTc2ODRcdTUxNDhcdTUyNGRcdTcyNDhcdTY3MmMgezB9IFx1NWJmY1x1NTFmYVx1NzY4NFx1MzAwMlx1NWZjNVx1OTg3Ylx1NGY3Zlx1NzUyOCB7MX0gXHU3Njg0XHU1ZjUzXHU1MjRkXHU3MjQ4XHU2NzJjXHU1YmZjXHU1MWZhXHU4ZmQ5XHU0ZTliXHU2NTg3XHU0ZWY2XHUzMDAyDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBFMDIwNUU6IFx1NjMwN1x1NWI5YVx1NzY4NFx1NjU4N1x1NGVmNlx1NjYyZlx1NzUzMSB7MH0gXHU3Njg0XHU1MTQ4XHU1MjRkXHU3MjQ4XHU2NzJjXHU1YmZjXHU1MWZhXHU3Njg0XHUzMDAyXHU1ZmM1XHU5ODdiXHU0ZjdmXHU3NTI4IHswfSBcdTc2ODRcdTVmNTNcdTUyNGRcdTcyNDhcdTY3MmNcdTViZmNcdTUxZmFcdThmZDlcdTRlOWJcdTY1ODdcdTRlZjZcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBFMDIwNkU6IFx1NjMwN1x1NWI5YVx1NzY4NFx1NjU4N1x1NGVmNlx1NjYyZlx1NzUzMSB7MX0gXHU3Njg0XHU2NmY0XHU2NWIwXHU3MjQ4XHU2NzJjIHswfSBcdTViZmNcdTUxZmFcdTc2ODRcdTMwMDJcdTYwYThcdTVmYzVcdTk4N2JcdTUzNDdcdTdlYTcgezF9IFx1NjI0ZFx1ODBmZFx1NWJmY1x1NTE2NVx1OGZkOVx1NGU5Ylx1NjU4N1x1NGVmNlx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQRTAyMDdFXHVmZjFhXHU2NWUwXHU2Y2Q1XHU2MjUzXHU1ZjAwXHU2MzA3XHU1YjlhXHU3Njg0XHU2NTg3XHU0ZWY2XHUzMDAyXHU2MGE4XHU1ZmM1XHU5ODdiXHU1MzQ3XHU3ZWE3IHswfSBcdTYyNGRcdTgwZmRcdTViZmNcdTUxNjVcdThmZDlcdTRlOWJcdTY1ODdcdTRlZjZcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTFjODg0OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAyMDBFIC0gSVVQRTAyOTlFDQotIw0KLQ0KLSMgSW1wb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1pbXBvcnRDb25maWdXaXphcmRfdGl0bGU9XHU1MzJmXHU1MTY1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU5MTRkXHU3ZjZlDQotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90aXRsZT1cdTYzMDdcdTViOWFcdTUzMmZcdTUxNjVcdTc2ZWVcdTkzMDQNCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ9XHU2MzA3XHU1YjlhXHU4OTgxXHU1MzJmXHU1MTY1XHU3Njg0XHU3YTBiXHU1ZjBmXHU1ZWFiXHU5MTRkXHU3ZjZlXHU2MjQwXHU1NzI4XHU3Njg0XHU3NmVlXHU5MzA0XHUzMDAyDQotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGl0bGU9XHU1YmU5XHU2N2U1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU4YjhhXHU2NmY0DQotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dD1cdTViZTlcdTY3ZTVcdTg5ODFcdTVjMGRcdTczZmVcdTg4NGNcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTYyNDBcdTUwNWFcdTc2ODRcdThiOGFcdTY2ZjRcdTMwMDINCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGU9XHU5MDc4XHU1M2Q2XHU5MTRkXHU3ZjZlXHU4OThmXHU2ODNjDQotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RleHQ9XHU5MDc4XHU1M2Q2XHU4OTgxXHU1MzJmXHU1MTY1XHU3Njg0XHU0ZTAwXHU2MjE2XHU1OTFhXHU1MDBiXHU5MTRkXHU3ZjZlXHU4OThmXHU2ODNjXHUzMDAyDQotDQotIyBJbXBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU9XHU1MzJmXHU1MTY1XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGl0bGU9XHU2MzA3XHU1YjlhXHU1MzJmXHU1MTY1XHU3NmVlXHU5MzA0DQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dD1cdTYzMDdcdTViOWFcdTg5ODFcdTUzMmZcdTUxNjVcdTc2ODRcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTYyNDBcdTU3MjhcdTc2ODRcdTc2ZWVcdTkzMDRcdTMwMDINCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZT1cdTkwNzhcdTUzZDZcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYNCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0PVx1OTA3OFx1NTNkNlx1ODk4MVx1NTMyZlx1NTE2NVx1NzY4NFx1NGUwMFx1NjIxNlx1NTkxYVx1NTAwYlx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1MzAwMlx1NTk4Mlx1Njc5Y1x1OTA3OFx1NTNkNlx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1NWRmMlx1NWI1OFx1NTcyOFx1NzNmZVx1ODg0Y1x1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1ZmYwY1x1OGFjYlx1OWE1N1x1OGI0OVx1NzI0OFx1NjcyY1x1NWRlZVx1NzU3MFx1MzAwMg0KLWltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW49XHU1MzJmXHU1MTY1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHU1OTMxXHU2NTU3DQotDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMD1cdTZiNjNcdTU3MjhcdTlhNTdcdThiNDlcdTkwNzhcdTUzZDZcdTc2ODRcdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmUuLi4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cxPVx1NjMwN1x1NWI5YVx1NzY4NFx1NzZlZVx1OTMwNFx1NGUwZFx1NTQyYlx1NjcwOVx1NjU0OFx1NzY4NFx1OTE0ZFx1N2Y2ZVx1MzAwMg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzM9XHU2YjYzXHU1NzI4XHU1MzJmXHU1MTY1XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlLi4uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMj1cdTc2ZWVcdTUyNGRcdTk1OGJcdTU1NWZcdTc2ODRcdTdhMGJcdTVmMGZcdTVlYWJcdTcxMjFcdTZjZDVcdTUzMmZcdTUxNjVcdTY3MmNcdThlYWJcdTMwMDINCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX01TRzE9XHU2YjYzXHU1NzI4XHU1MzJmXHU1MTY1XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlLi4uDQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9FUlJfSW1wb3J0X2NvbmZpZ3VyYXRpb249XHU1MzJmXHU1MTY1XHU5MTRkXHU3ZjZlXHU1OTMxXHU2NTU3DQotDQotRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX3RpdGxlPVx1NzlmYlx1NTFmYVx1NTkzMVx1NjU1Nw0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c9XHU5MGU4XHU0ZWZkXHU2YTk0XHU2ODQ4XHU2NzJhXHU3OWZiXHU1MWZhXHVmZjBjXHU4OTgxXHU5MWNkXHU4YTY2XHU1NWNlXHVmZjFmDQotDQotSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZT1cdTZiNjNcdTU3MjhcdTUzMmZcdTUxNjVcdTkxNGRcdTdmNmVcdTU4MzFcdTU0NGENCi1JbXBvcnRQbHVnaW5XaXphcmRfcmVhZG9ubHk9SVVQRTAyMDFFOiBcdTdhMGJcdTVmMGZcdTVlYWJcdTY2MmZcdTU1MmZcdThiODBcdTc2ODRcdTMwMDINCi1JbXBvcnRQbHVnaW5XaXphcmRfTVNHMT1cdTZiNjNcdTU3MjhcdTUzMmZcdTUxNjVcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYuLi4NCi1JbXBvcnRQbHVnaW5XaXphcmRfZXJyb3I9XHU5MzJmXHU4YWE0DQotSW1wb3J0UGx1Z2luV2l6YXJkX3dhcm5fZXhpc3RpbmdfcGx1Z2lucz1JVVBFMDIwMEU6IFx1NGUwYlx1NTIxN1x1OTA3OFx1NTNkNlx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1NWRmMlx1NWI1OFx1NTcyOFx1ZmYwY1x1OTFjZFx1NjViMFx1NTMyZlx1NTE2NVx1NzZmOFx1NTQwY1x1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1NjcwM1x1ODk4Nlx1NWJlYlx1NzNmZVx1NjcwOVx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1ZmYxYVxuXG57MH1cblxuXHU2MGE4XHU3OGJhXHU1YjlhXHU4OTgxXHU3ZTdjXHU3ZThjXHU1NWNlXHVmZjFmDQotSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU9XG5cblx1NzhiYVx1NWI5YVx1ODk4MVx1N2U3Y1x1N2U4Y1x1NTVjZVx1ZmYxZg0KLQ0KLVNlbGVjdENvbmZpZ3NUb0ltcG9ydF9sYWJlbDE9XHU1YzA3XHU1MzJmXHU1MTY1XHU0ZTBiXHU1MjE3XHU1MTQzXHU3ZDIwXHVmZjFhDQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvcj1cdTkzMmZcdThhYTQNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX01TRzE9XHU2YjYzXHU1NzI4XHU1MjA2XHU2NzkwDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfdGl0bGUyPVx1OTA3OFx1NTNkNlx1ODk4MVx1NTMyZlx1NTE2NVx1NzY4NFx1OTE0ZFx1N2Y2ZVx1ODk4Zlx1NjgzYw0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub3RfdXNlZD1ub3RfdXNlZA0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19wYXRoPVx1NjMwN1x1NWI5YVx1NzY4NFx1NzZlZVx1OTMwNFx1NGUwZFx1NWI1OFx1NTcyOFx1MzAwMg0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19kaXI9XHU2NzJhXHU2MzA3XHU1YjlhXHU3NmVlXHU5MzA0DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3BsdWdpbnM9XHU1NzI4XHU1MzJmXHU1MTY1XHU3NmVlXHU5MzA0XHU0ZTJkXHU1M2VmXHU3NTI4XHU3Njg0XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHVmZjFhDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcj1cdTRmNWNcdTgwMDVcdWZmMWENCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbj1cdTcyNDhcdTY3MmNcdWZmMWENCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfZGVzYz1cdTdjMjFcdTg5ODFcdThhYWFcdTY2MGVcdWZmMWENCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogXHU3YTBiXHU1ZjBmXHU1ZWFiXHU2NjJmXHU1NTJmXHU4YjgwXHU3Njg0XHUzMDAyDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cwPVx1NmI2M1x1NTcyOFx1OWE1N1x1OGI0OVx1OTA3OFx1NTNkNlx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZi4uLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMT1cdTYzMDdcdTViOWFcdTc2ODRcdThkZWZcdTVmOTFcdTRlMGRcdTU0MmJcdTY3MDlcdTY1NDhcdTc2ODRcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTMwMDINCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzM9XHU2YjYzXHU1NzI4XHU1MzJmXHU1MTY1XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmLi4uDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c1PVx1NzEyMVx1NmNkNVx1NTMyZlx1NTE2NVx1OTA3OFx1NTNkNlx1NzY4NFx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1MzAwMlx1NTcyOFx1NzNmZVx1ODg0Y1x1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NjI3ZVx1NGUwZFx1NTIzMFx1NTE3Nlx1NzZmOFx1NGY5ZFx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZiAnJ3swfScnXHUzMDAyDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c2PVx1NzEyMVx1NmNkNVx1NTMyZlx1NTE2NVx1OTA3OFx1NTNkNlx1NzY4NFx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1MzAwMlx1NTcyOFx1NzNmZVx1ODg0Y1x1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NjI3ZVx1NGUwZFx1NTIzMFx1NzZmOFx1NGY5ZFx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1MzAwMg0KLURpZmZSZXBvcnRWaWV3ZXJfY29udGVudD1cdTUxNjdcdTViYjkNCi1EaWZmUmVwb3J0Vmlld2VyX2luX2ltcG9ydD1cdTU3MjhcdTUzMmZcdTUxNjVcdTRlMmQNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfTVNHMT1cdTZiNjNcdTU3MjhcdTUyMDZcdTY3OTBcdTZhOTRcdTY4NDguLi4NCi1EaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM9XHU2NjJmDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2Vycm9yPVx1OTMyZlx1OGFhNA0KLURpZmZSZXBvcnRWaWV3ZXJfaW5fbGliPVx1NTcyOFx1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZA0KLURpZmZSZXBvcnRWaWV3ZXJfc3RhdHVzPVx1NzJjMFx1NjE0Yg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzPVx1NTcyOFx1NzNmZVx1ODg0Y1x1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NjI3ZVx1NTIzMFx1OTA3OFx1NTNkNlx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luTm90RXhpc3RzPVx1NTcyOFx1NzNmZVx1ODg0Y1x1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NjI3ZVx1NGUwZFx1NTIzMFx1OTA3OFx1NTNkNlx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjRXhpc3RzPVx1NTcyOFx1NzNmZVx1ODg0Y1x1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NjI3ZVx1NTIzMFx1OTE0ZFx1N2Y2ZQ0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNOb1NlbGVjdGlvbj1cdTY3MmFcdTkwNzhcdTUzZDZcdTkxNGRcdTdmNmVcdTg5OGZcdTY4M2NcdTMwMDINCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsPVx1NTcyOFx1NTMyZlx1NTE2NVx1NzZlZVx1OTMwNFx1NGUyZFx1OTA3OFx1NTNkNlx1NzY4NFx1OTE0ZFx1N2Y2ZQ0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3M9XHU1NzI4XHU1MzJmXHU1MTY1XHU3NmVlXHU5MzA0XHU0ZTJkXHU1M2VmXHU3NTI4XHU3Njg0XHU5MTRkXHU3ZjZlXHU4OThmXHU2ODNjXHVmZjFhDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZD1ub3RfdXNlZA0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2Rlc2M9XHU3YzIxXHU4OTgxXHU4YWFhXHU2NjBlXHVmZjFhDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoPVx1NjMwN1x1NWI5YVx1NzY4NFx1OGRlZlx1NWY5MVx1NGUwZFx1NWI1OFx1NTcyOFx1MzAwMg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbj1cdTY3MmFcdTkwNzhcdTUzZDZcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTMwMDINCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX2Rpcj1cdTY3MmFcdTYzMDdcdTViOWFcdTc2ZWVcdTkzMDQNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9yZWFkb25seT1cdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYgezB9IFx1NjYyZlx1NTUyZlx1OGI4MFx1NzY4NFxuDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fbG9ja2VkPUlVUEUwMjAzRTogXHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmIHswfSBcdTVkZjJcdTkzOTZcdTViOWFcbg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfZXJyb3Jfbm90X3VwZGF0YWJsZT1cdTdhMGJcdTVmMGZcdTVlYWJcdTRlMmRcdTY3MDlcdTRlOWJcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTVkZjJcdTkzOTZcdTViOWFcdTYyMTZcdTU1MmZcdThiODBcdTMwMDJcblx1OGFjYlx1ODllM1x1OTY2NFx1OTM5Nlx1NWI5YVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1ZmYwY1x1NzhiYVx1NWI5YVx1NTNlZlx1NGVlNVx1NjZmNFx1NjViMFx1NmE5NFx1Njg0OFx1MzAwMg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw9XHU1NzI4XHU1MzJmXHU1MTY1XHU3NmVlXHU5MzA0XHU0ZTJkXHU5MDc4XHU1M2Q2XHU3Njg0XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotRGlmZlJlcG9ydFZpZXdlcl90eXBlPVx1NTE2N1x1NWJiOVx1OTg1ZVx1NTc4Yg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzPVx1NTcyOFx1NzNmZVx1ODg0Y1x1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NjI3ZVx1NGUwZFx1NTIzMFx1OTA3OFx1NTNkNlx1NzY4NFx1OTE0ZFx1N2Y2ZQ0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUEUwMjA0RTogXHU2MzA3XHU1YjlhXHU3Njg0XHU2YTk0XHU2ODQ4XHU2NjJmXHU1ZjllXHU4MjBhXHU3MjQ4ICh7MH0pIFx1NzY4NCB7MX0gXHU1MzJmXHU1MWZhXHUzMDAyXHU2YTk0XHU2ODQ4XHU1ZmM1XHU5ODA4XHU0ZWU1IHsxfSBcdTczZmVcdTg4NGNcdTcyNDhcdTY3MmNcdTUzMmZcdTUxZmFcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duPUlVUEUwMjA1RTogXHU2MzA3XHU1YjlhXHU3Njg0XHU2YTk0XHU2ODQ4XHU2NjJmXHU1ZjllXHU4MjBhXHU3MjQ4XHU3Njg0IHswfSBcdTUzMmZcdTUxZmFcdTMwMDJcdTZhOTRcdTY4NDhcdTVmYzVcdTk4MDhcdTRlZTUgezB9IFx1NzNmZVx1ODg0Y1x1NzI0OFx1NjcyY1x1NTMyZlx1NTFmYVx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUEUwMjA2RTogXHU2MzA3XHU1YjlhXHU3Njg0XHU2YTk0XHU2ODQ4XHU2NjJmXHU1ZjllXHU4ZjAzXHU2NWIwXHU3MjQ4ICh7MH0pIFx1NzY4NCB7MX0gXHU1MzJmXHU1MWZhXHUzMDAyXHU2MGE4XHU1ZmM1XHU5ODA4XHU1MzQ3XHU3ZDFhIHsxfSBcdTYyNGRcdTgwZmRcdTUzMmZcdTUxNjVcdTZhOTRcdTY4NDhcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUEUwMjA3RTogXHU3MTIxXHU2Y2Q1XHU5NThiXHU1NTVmXHU2MzA3XHU1YjlhXHU3Njg0XHU2YTk0XHU2ODQ4XHUzMDAyXHU2MGE4XHU1ZmM1XHU5ODA4XHU1MzQ3XHU3ZDFhIHswfSBcdTYyNGRcdTgwZmRcdTUzMmZcdTUxNjVcdTZhOTRcdTY4NDhcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMi8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlNGY1ZmEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmRjNGY4YS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgSW1wb3J0IChOTDIpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmltcG9ydDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMi9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTRmY2E3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcnUucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODdlMTRlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVx1MDQxOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1pbXBvcnRDYXRlZ29yeU5hbWU9XHUwNDFjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0DQotDQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4DQotaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmRUZXh0PVx1MDQxOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4Lg0KLQ0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1cdTA0MWNcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZFRleHQ9XHUwNDE4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzZCBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzNVx1MDQzOSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4OGRlODguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMjAwRSAtIElVUEUwMjk5RQ0KLSMNCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlPVx1MDQxOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4DQotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90aXRsZT1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzANCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyBcdTA0NDEgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM1XHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwLg0KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RpdGxlPVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MCBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4DQotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NGNcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQzMlx1MDQzZFx1MDQzNVx1MDQ0MVx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuDQotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0M2ZcdTA0MzVcdTA0NDZcdTA0MzhcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5DQotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0MyBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwLg0KLQ0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPVx1MDQxOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGl0bGU9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwDQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQ0MSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGZcdTA0M2NcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzAuDQotc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGl0bGU9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzAuIFx1MDQxNVx1MDQ0MVx1MDQzYlx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDMyIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIsIFx1MDQ0MVx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0NDUgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4Lg0KLWltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW49XHUwNDE4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0ZiBcdTA0M2RcdTA0MzUgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkDQotDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2FcdTA0MzAgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOC4uLg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzE9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyBcdTA0M2RcdTA0MzUgXHUwNDQxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDQyIFx1MDQzZFx1MDQ0M1x1MDQzNlx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUuDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMz1cdTA0MThcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4uLg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzI9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDQzXHUwNDRlIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NGYgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMiBcdTA0NDFcdTA0MzBcdTA0M2NcdTA0NDMgXHUwNDQxXHUwNDM1XHUwNDMxXHUwNDRmLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfTVNHMT1cdTA0MThcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4uLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzAgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotDQotRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX3RpdGxlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDM4XHUwNDM3XHUwNDMyXHUwNDNiXHUwNDM1XHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM4DQotRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX21zZz1cdTA0MWRcdTA0MzVcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQzZFx1MDQzNSBcdTA0MzFcdTA0NGJcdTA0M2JcdTA0MzggXHUwNDM4XHUwNDM3XHUwNDMyXHUwNDNiXHUwNDM1XHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDRiLCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDRiXHUwNDQyXHUwNDNhXHUwNDQzPw0KLQ0KLUltcG9ydENvbmZpZ1JlcG9ydFBhZ2VfdGl0bGU9XHUwNDFlXHUwNDQyXHUwNDQ3XHUwNDM1XHUwNDQyIFx1MDQzZVx1MDQzMSBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotSW1wb3J0UGx1Z2luV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogXHUwNDExXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQzMCBcdTA0NDJcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0N1x1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1JbXBvcnRQbHVnaW5XaXphcmRfTVNHMT1cdTA0MThcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0Zi4uLg0KLUltcG9ydFBsdWdpbldpemFyZF9lcnJvcj1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzANCi1JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zPUlVUEUwMjAwRTogXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQyLiBcdTA0MWZcdTA0NDBcdTA0MzggXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzZFx1MDQzOCBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDRiOlxuIFxuIHswfSBcblxuXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDRjPw0KLUltcG9ydFBsdWdpbldpemFyZF9jb25maXJtX2NvbnRpbnVlPVxuXG5cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGM/DQotDQotU2VsZWN0Q29uZmlnc1RvSW1wb3J0X2xhYmVsMT1cdTA0MTFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDRiIFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGI6DQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvcj1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzANCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX01TRzE9XHUwNDEwXHUwNDNkXHUwNDMwXHUwNDNiXHUwNDM4XHUwNDM3DQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfdGl0bGUyPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0M2ZcdTA0MzVcdTA0NDZcdTA0MzhcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzANCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm90X3VzZWQ9bm90X3VzZWQNCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fcGF0aD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQzZFx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIuDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX2Rpcj1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMw0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zPVx1MDQxNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzggXHUwNDMyIFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzM1x1MDQzNSBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzA6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcj1cdTA0MTBcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDA6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb249XHUwNDEyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDRmOg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9kZXNjPVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNToNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogXHUwNDExXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQzMCBcdTA0NDJcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0N1x1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzA9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNhXHUwNDMwIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzVcdTA0MzkuLi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzE9XHUwNDEyIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzYyBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzNcdTA0MzUgXHUwNDNkXHUwNDM1XHUwNDQyIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGYgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMz1cdTA0MThcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0Zi4uLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNT1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0Zi4gXHUwNDE1XHUwNDMzXHUwNDNlIFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQ0Ylx1MDQzOSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgJyd7MH0nJyBcdTA0M2RcdTA0MzUgXHUwNDNkXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNkIFx1MDQzMiBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDNcdTA0NDlcdTA0MzVcdTA0MzkgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM1IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzY9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNCBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGYuIFx1MDQxN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQ0Ylx1MDQzOSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgXHUwNDNkXHUwNDM1IFx1MDQzZFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzZCBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuDQotRGlmZlJlcG9ydFZpZXdlcl9jb250ZW50PVx1MDQxY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0Yg0KLURpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0PVx1MDQxMiBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzUNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfTVNHMT1cdTA0MTBcdTA0M2RcdTA0MzBcdTA0M2JcdTA0MzhcdTA0MzcgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDNlXHUwNDMyLi4uDQotRGlmZlJlcG9ydExhYmVsUHJvdmlkZXJfeWVzPVx1MDQxNFx1MDQzMA0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9lcnJvcj1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzANCi1EaWZmUmVwb3J0Vmlld2VyX2luX2xpYj1cdTA0MTIgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM1DQotRGlmZlJlcG9ydFZpZXdlcl9zdGF0dXM9XHUwNDIxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDRmXHUwNDNkXHUwNDM4XHUwNDM1DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5FeGlzdHM9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0YyBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNQ0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luTm90RXhpc3RzPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgXHUwNDNkXHUwNDM1IFx1MDQzZFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzZCBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNQ0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjRXhpc3RzPVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNQ0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNOb1NlbGVjdGlvbj1cdTA0MWRcdTA0MzUgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDMwIFx1MDQ0MVx1MDQzZlx1MDQzNVx1MDQ0Nlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY0RhdGFMYWJlbD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzMiBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzNcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfY29uZmlncz1cdTA0MTRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDNmXHUwNDM1XHUwNDQ2XHUwNDM4XHUwNDQ0XHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzIgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzXHUwNDM1IFx1MDQzOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMDoNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkPW5vdF91c2VkDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfZGVzYz1cdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzU6DQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgXHUwNDNkXHUwNDM1IFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQzNVx1MDQ0Mi4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luTm9TZWxlY3Rpb249XHUwNDFkXHUwNDM1IFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZCBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMuDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19kaXI9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9yZWFkb25seT1cdTA0MWNcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgezB9IFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzNVx1MDQzZCBcdTA0NDJcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0N1x1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZlxuDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fbG9ja2VkPUlVUEUwMjAzRTogXHUwNDFjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIHswfSBcdTA0MzdcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2FcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2Rcbg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfZXJyb3Jfbm90X3VwZGF0YWJsZT1cdTA0MWRcdTA0MzVcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDM4XHUwNDM3IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzNVx1MDQzOSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNhXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDRiIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0M2RcdTA0NGIgXHUwNDQyXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDdcdTA0NDJcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuXG5cdTA0MjBcdTA0MzBcdTA0MzdcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2FcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4IFx1MDQzOCBcdTA0M2VcdTA0MzFcdTA0MzVcdTA0NDFcdTA0M2ZcdTA0MzVcdTA0NDdcdTA0NGNcdTA0NDJcdTA0MzUgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDRjIFx1MDQzN1x1MDQzMFx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzOC4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luRGF0YUxhYmVsPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgXHUwNDMyIFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzM1x1MDQzNSBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzANCi1EaWZmUmVwb3J0Vmlld2VyX3R5cGU9XHUwNDIyXHUwNDM4XHUwNDNmIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNkXHUwNDM1IFx1MDQzZFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzMCBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNS4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBFMDIwNEU6IFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDRiIFx1MDQzMiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NGJcdTA0MzRcdTA0NDNcdTA0NDlcdTA0MzVcdTA0MzkgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4ICh7MH0pIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMCB7MX0uIFx1MDQxZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzY1x1MDQzZSBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQ0MSBcdTA0M2ZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0NDlcdTA0NGNcdTA0NGUgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCB7MX0uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBFMDIwNUU6IFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDMxXHUwNDRiXHUwNDNiXHUwNDM4IFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDRiXHUwNDM0XHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCB7MH0uIFx1MDQxZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzY1x1MDQzZSBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQ0MSBcdTA0M2ZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0NDlcdTA0NGNcdTA0NGUgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCB7MH0uDQotdmVyc2lvbk1pc21hdGNoX29sZFRvb2w9SVVQRTAyMDZFOiBcdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzOCBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0NGIgXHUwNDMyIFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzOSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggKHswfSkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwIHsxfS4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMCBcdTA0NGRcdTA0NDJcdTA0MzhcdTA0NDUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQzZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzY1x1MDQzZSBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgezF9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQRTAyMDdFOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiLiBcdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwIFx1MDQ0ZFx1MDQ0Mlx1MDQzOFx1MDQ0NSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNjXHUwNDNlIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyB7MH0uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdlMzkyMWUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxZDA3ODcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBJbXBvcnQgKE5MMmEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQ7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNjQ1ODcyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBpbXBvcnQNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1pbXBvcnRDYXRlZ29yeU5hbWU9TWV0b2RlDQotDQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1CaWJsaW90ZWtza29uZmlndXJhdGlvbg0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkVGV4dD1JbXBvcnRcdTAwZTlyIGVuIGJpYmxpb3Rla3Nrb25maWd1cmF0aW9uLg0KLQ0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1NZXRvZGUtcGx1Z2lucw0KLWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmRUZXh0PUltcG9ydFx1MDBlOXIgZW4gZWxsZXIgZmxlcmUgbWV0b2RlLXBsdWdpbnMuDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjdhNTUzZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMjAwRSAtIElVUEUwMjk5RQ0KLSMNCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlPUltcG9ydFx1MDBlOXIgYmlibGlvdGVrc2tvbmZpZ3VyYXRpb24NCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RpdGxlPUFuZ2l2IGltcG9ydGJpYmxpb3Rlaw0KLXNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGV4dD1BbmdpdiBiaWJsaW90ZWtldCBtZWQgZGVuIGJpYmxpb3Rla3Nrb25maWd1cmF0aW9uLCBkZXIgc2thbCBpbXBvcnRlcmVzLg0KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RpdGxlPUdlbm5lbXNlIGJpYmxpb3Rla3NcdTAwZTZuZHJpbmdlcg0KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RleHQ9R2VubmVtc2UgZGUgXHUwMGU2bmRyaW5nZXIsIGRlciB2aWwgYmxpdmUgZm9yZXRhZ2V0IGkgZGV0IGFrdHVlbGxlIG1ldG9kZWJpYmxpb3Rlay4NCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGU9Vlx1MDBlNmxnIGtvbmZpZ3VyYXRpb25zc3BlY2lmaWthdGlvbmVyDQotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RleHQ9Vlx1MDBlNmxnIGVuIGVsbGVyIGZsZXJlIGtvbmZpZ3VyYXRpb25zc3BlY2lmaWthdGlvbmVyLCBkZXIgc2thbCBpbXBvcnRlcmVzLg0KLQ0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPUltcG9ydFx1MDBlOXIgbWV0b2RlLXBsdWdpbnMNCi1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90aXRsZT1BbmdpdiBpbXBvcnRiaWJsaW90ZWsNCi1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90ZXh0PUFuZ2l2IGJpYmxpb3Rla2V0IG1lZCBkZSBtZXRvZGUtcGx1Z2lucywgZGVyIHNrYWwgaW1wb3J0ZXJlcy4NCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZT1WXHUwMGU2bGcgbWV0b2RlLXBsdWdpbnMNCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0PVZcdTAwZTZsZyBlbiBlbGxlciBmbGVyZSBtZXRvZGUtcGx1Z2lucywgZGVyIHNrYWwgaW1wb3J0ZXJlcy4gSHZpcyBlbiB2YWxndCBwbHVnaW4gYWxsZXJlZGUgZmluZGVzIGkgZGV0IGFrdHVlbGxlIG1ldG9kZWJpYmxpb3Rlaywgc2thbCBkdSBrb250cm9sbGVyZSB2ZXJzaW9uc2ZvcnNrZWxsZW5lLg0KLWltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW49SW1wb3J0IGFmIHBsdWdpbiBpa2tlIHVkZlx1MDBmOHJ0DQotDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMD1WYWxpZGVyZXIgdmFsZ3QgYmlibGlvdGVrc2tvbmZpZ3VyYXRpb24uLi4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cxPURldCBhbmdpdm5lIGJpYmxpb3RlayBpbmRlaG9sZGVyIGlra2UgZW4gZ3lsZGlnIGtvbmZpZ3VyYXRpb24uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMz1JbXBvcnRlcmVyIG1ldG9kZWtvbmZpZ3VyYXRpb24uLi4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cyPUthbiBpa2tlIGltcG9ydGVyZSBkZXQgYWt0dWVsdCBcdTAwZTVibmUgYmlibGlvdGVrIHRpbCBzaWcgc2Vsdi4NCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX01TRzE9SW1wb3J0ZXJlciBtZXRvZGVrb25maWd1cmF0aW9uLi4uDQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9FUlJfSW1wb3J0X2NvbmZpZ3VyYXRpb249SW1wb3J0IGFmIGtvbmZpZ3VyYXRpb24gaWtrZSB1ZGZcdTAwZjhydA0KLQ0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF90aXRsZT1GZWpsIGkgdWR0amVrbmluZw0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c9Tm9nbGUgYWYgZmlsZXJuZSBlciBpa2tlIHRqZWtrZXQgdWQuIFZpbCBkdSBwclx1MDBmOHZlIGlnZW4/DQotDQotSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZT1JbXBvcnRlcmVyIGtvbmZpZ3VyYXRpb25zcmFwcG9ydA0KLUltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IEJpYmxpb3RlayBlciBza3JpdmViZXNreXR0ZXQuDQotSW1wb3J0UGx1Z2luV2l6YXJkX01TRzE9SW1wb3J0ZXJlciBtZXRvZGUtcGx1Z2luLi4uDQotSW1wb3J0UGx1Z2luV2l6YXJkX2Vycm9yPUZlamwNCi1JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zPUlVUEUwMjAwRTogRlx1MDBmOGxnZW5kZSB2YWxndGUgcGx1Z2lucyBmaW5kZXMgYWxsZXJlZGUuIEh2aXMgZHUgaW1wb3J0ZXJlciBkZSBzYW1tZSBwbHVnaW5zIGlnZW4sIG92ZXJza3JpdmVzIGRlIGVrc2lzdGVyZW5kZTpcblxuIHswfSBcblxuRXIgZHUgc2lra2VyIHBcdTAwZTUsIGF0IGR1IHZpbCBmb3J0c1x1MDBlNnR0ZT8NCi1JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZT1cblxuIEVyIGR1IHNpa2tlciBwXHUwMGU1LCBhdCBkdSB2aWwgZm9ydHNcdTAwZTZ0dGU/DQotDQotU2VsZWN0Q29uZmlnc1RvSW1wb3J0X2xhYmVsMT1GXHUwMGY4bGdlbmRlIGVsZW1lbnRlciBibGl2ZXIgaW1wb3J0ZXJldDoNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yPUZlamwNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX01TRzE9QW5hbHlzZXJlcg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX3RpdGxlMj1WXHUwMGU2bGcga29uZmlndXJhdGlvbnNzcGVjaWZpa2F0aW9uZXIsIGRlciBza2FsIGltcG9ydGVyZXMNCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm90X3VzZWQ9aWtrZV9iZW55dHRldA0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19wYXRoPURldCBhbmdpdm5lIGJpYmxpb3RlayBmaW5kZXMgaWtrZS4NCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fZGlyPURlciBlciBpa2tlIGFuZ2l2ZXQgZXQgYmlibGlvdGVrDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3BsdWdpbnM9VGlsZ1x1MDBlNm5nZWxpZ2UgcGx1Z2lucyBpIGltcG9ydGJpYmxpb3Rla2V0Og0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9hdXRob3I9Rm9yZmF0dGVyOg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF92ZXJzaW9uPVZlcnNpb246DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2Rlc2M9S29ydCBiZXNrcml2ZWxzZToNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogQmlibGlvdGVrIGVyIHNrcml2ZWJlc2t5dHRldC4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzA9VmFsaWRlcmVyIHZhbGd0ZSBwbHVnaW5zLi4uDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cxPURlbiBhbmdpdm5lIHN0aSBpbmRlaG9sZGVyIGlra2UgZW4gZ3lsZGlnIHBsdWdpbi1tZXRvZGUuDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0czPUltcG9ydGVyZXIgbWV0b2RlLXBsdWdpbi4uLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNT1EZW4gdmFsZ3RlIG1ldG9kZS1wbHVnaW4ga2FuIGlra2UgaW1wb3J0ZXJlcy4gRGVucyBhZmhcdTAwZTZuZ2lnZSBwbHVnaW4gJyd7MH0nJyBmaW5kZXMgaWtrZSBpIGRldCBha3R1ZWxsZSBtZXRvZGViaWJsaW90ZWsuDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c2PURlbiB2YWxndGUgbWV0b2RlLXBsdWdpbiBrYW4gaWtrZSBpbXBvcnRlcmVzLiBFbiBhZmhcdTAwZTZuZ2lnIHBsdWdpbiBmaW5kZXMgaWtrZSBpIGRldCBha3R1ZWxsZSBtZXRvZGViaWJsaW90ZWsuDQotRGlmZlJlcG9ydFZpZXdlcl9jb250ZW50PUluZGhvbGQNCi1EaWZmUmVwb3J0Vmlld2VyX2luX2ltcG9ydD1JIGltcG9ydA0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9NU0cxPUFuYWx5c2VyZXIgZmlsZXIuLi4NCi1EaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM9SmENCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfZXJyb3I9RmVqbA0KLURpZmZSZXBvcnRWaWV3ZXJfaW5fbGliPUkgYmlibGlvdGVrDQotRGlmZlJlcG9ydFZpZXdlcl9zdGF0dXM9U3RhdHVzDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5FeGlzdHM9VmFsZ3QgcGx1Z2luIGZpbmRlcyBpIGRldCBha3R1ZWxsZSBiaWJsaW90ZWsNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbk5vdEV4aXN0cz1WYWxndCBwbHVnaW4gZmluZGVzIGlra2UgaSBkZXQgYWt0dWVsbGUgYmlibGlvdGVrDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHM9S29uZmlndXJhdGlvbiBmaW5kZXMgaSBkZXQgYWt0dWVsbGUgYmlibGlvdGVrDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY05vU2VsZWN0aW9uPURlciBlciBpa2tlIHZhbGd0IGVuIGtvbmZpZ3VyYXRpb25zc3BlY2lmaWthdGlvbi4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsPVZhbGd0IGtvbmZpZ3VyYXRpb24gaSBpbXBvcnRiaWJsaW90ZWtldA0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3M9VGlsZ1x1MDBlNm5nZWxpZ2Uga29uZmlndXJhdGlvbnNzcGVjaWZpa2F0aW9uZXIgaSBpbXBvcnRiaWJsaW90ZWtldDoNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkPWlra2VfYmVueXR0ZXQNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjPUtvcnQgYmVza3JpdmVsc2U6DQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoPURlbiBhbmdpdm5lIHN0aSBmaW5kZXMgaWtrZS4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luTm9TZWxlY3Rpb249RGVyIGVyIGlra2UgdmFsZ3QgZW4gcGx1Z2luLg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fZGlyPURlciBlciBpa2tlIGFuZ2l2ZXQgZXQgYmlibGlvdGVrDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fcmVhZG9ubHk9UGx1Z2luJydlbiB7MH0gZXIgc2tyaXZlYmVza3l0dGV0XG4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9sb2NrZWQ9SVVQRTAyMDNFOiBQbHVnaW4nJ2VuIHswfSBlciBsXHUwMGU1c3Rcbg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfZXJyb3Jfbm90X3VwZGF0YWJsZT1Ob2dsZSBwbHVnaW5zIGkgYmlibGlvdGVrZXQgZXIgbFx1MDBlNXN0IGVsbGVyIHNrcml2ZWJlc2t5dHRldC5cbkxcdTAwZTVzIGRlIHJlbGV2YW50ZSBwbHVnaW5zIG9wLCBvZyBrb250cm9sbFx1MDBlOXIsIGF0IGZpbGVybmUga2FuIG9wZGF0ZXJlcy4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luRGF0YUxhYmVsPVZhbGd0IHBsdWdpbiBpIGltcG9ydGJpYmxpb3Rla2V0DQotRGlmZlJlcG9ydFZpZXdlcl90eXBlPUluZGhvbGRzdHlwZQ0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzPVZhbGd0IGtvbmZpZ3VyYXRpb24gZmluZGVzIGlra2UgaSBkZXQgYWt0dWVsbGUgYmlibGlvdGVrLg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUEUwMjA0RTogRGUgYW5naXZuZSBmaWxlciBlciBla3Nwb3J0ZXJldCBtZWQgZW4gdGlkbGlnZXJlIHZlcnNpb24gKHswfSkgYWYgezF9LiBGaWxlcm5lIHNrYWwgZWtzcG9ydGVyZXMgbWVkIGRlbiBha3R1ZWxsZSB2ZXJzaW9uIGFmIHsxfS4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duPUlVUEUwMjA1RTogRGUgYW5naXZuZSBmaWxlciBlciBla3Nwb3J0ZXJldCBtZWQgZW4gdGlkbGlnZXJlIHZlcnNpb24gYWYgezB9LiBGaWxlcm5lIHNrYWwgZWtzcG9ydGVyZXMgbWVkIGRlbiBha3R1ZWxsZSB2ZXJzaW9uIGFmIHswfS4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBFMDIwNkU6IERlIGFuZ2l2bmUgZmlsZXIgZXIgZWtzcG9ydGVyZXQgbWVkIGVuIG55ZXJlIHZlcnNpb24gKHswfSkgYWYgezF9LiBEdSBza2FsIG9wZ3JhZGVyZSB7MX0gZm9yIGF0IGt1bm5lIGltcG9ydGVyZSBmaWxlcm5lLiANCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUEUwMjA3RTogRGUgYW5naXZuZSBmaWxlciBrYW4gaWtrZSBcdTAwZTVibmVzLiBEdSBza2FsIG9wZ3JhZGVyZSB7MH0gZm9yIGF0IGt1bm5lIGltcG9ydGVyZSBmaWxlcm5lLiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmMyN2E5NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODE1YTY0NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIFhNTCBJbXBvcnQgKE5MMSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWw7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTdiMDEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9lcy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcHRfQlIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2l0LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYjNmMDQxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gUGx1Zy1pbiBmXHUwMGZjciBYTUwtSW1wb3J0DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgWE1MIFdpemFyZA0KLWltcG9ydFhNTFdpemFyZE5hbWU9WE1MDQotaW1wb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249RGVuIGluIGVpbmVyIFhNTC1EYXRlaSBnZXNwZWljaGVydGVuIEluaGFsdCBlaW5lciBNZXRob2RlbmJpYmxpb3RoZWsgaW1wb3J0aWVyZW4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGRmOWQ0Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVBsdWctaW4gZGUgWE1MIGRlIGltcG9ydGFjaVx1MDBmM24gZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgWE1MIFdpemFyZA0KLWltcG9ydFhNTFdpemFyZE5hbWU9WE1MDQotaW1wb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249SW1wb3J0YXIgY29udGVuaWRvIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGVuIHVuIGFyY2hpdm8gWE1MLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1MDJmNDEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1QbHVnLWluIFhNTCBkJ2ltcG9ydGF0aW9uIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgSW1wb3J0IFhNTCBXaXphcmQNCi1pbXBvcnRYTUxXaXphcmROYW1lPVhNTA0KLWltcG9ydFhNTFdpemFyZERlc2NyaXB0aW9uPUltcG9ydGV6IGxlIGNvbnRlbnUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBzdG9ja1x1MDBlOSBkYW5zIHVuIGZpY2hpZXIgWE1MLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQwMmI1NDIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1QbHVnLWluIFhNTCBkaSBpbXBvcnRhemlvbmUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgWE1MIFdpemFyZA0KLWltcG9ydFhNTFdpemFyZE5hbWU9WE1MDQotaW1wb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249SW1wb3J0YSBpbCBjb250ZW51dG8gZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBtZW1vcml6emF0byBpbiB1biBmaWxlIFhNTC4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODQyMGUwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIEltcG9ydCBYTUwgUGx1Zy1pbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgSW1wb3J0IFhNTCBXaXphcmQNCi1pbXBvcnRYTUxXaXphcmROYW1lPVhNTA0KLWltcG9ydFhNTFdpemFyZERlc2NyaXB0aW9uPVhNTCBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmJcdTRmZGRcdTdiYTFcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwOTJcdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZjA4YTI0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFhNTCBcdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgWE1MIFdpemFyZA0KLWltcG9ydFhNTFdpemFyZE5hbWU9WE1MDQotaW1wb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249WE1MIFx1ZDMwY1x1Yzc3Y1x1YzVkMCBcdWM4MDBcdWM3YTVcdWI0MWMgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgXHVhYzAwXHVjODM4XHVjNjM1XHViMmM4XHViMmU0Lg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3NTdhZmIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1QbHVnLWluIFhNTCBkZSBJbXBvcnRhXHUwMGU3XHUwMGUzbyBkbyBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBYTUwgV2l6YXJkDQotaW1wb3J0WE1MV2l6YXJkTmFtZT1YTUwNCi1pbXBvcnRYTUxXaXphcmREZXNjcmlwdGlvbj1JbXBvcnRlIG8gY29udGVcdTAwZmFkbyBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvIGVtIHVtIGFycXVpdm8gWE1MLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1YTYzYzEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHU1YmZjXHU1MTY1IFhNTCBcdTYzZDJcdTRlZjYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBYTUwgV2l6YXJkDQotaW1wb3J0WE1MV2l6YXJkTmFtZT1YTUwNCi1pbXBvcnRYTUxXaXphcmREZXNjcmlwdGlvbj1cdTViZmNcdTUxNjVcdTViNThcdTUwYThcdTU3MjggWE1MIFx1NjU4N1x1NGVmNlx1NGUyZFx1NzY4NFx1NWI1OFx1NTBhOFx1NWU5M1x1NTE4NVx1NWJiOVx1MzAwMg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljYmU0ZGUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgSW1wb3J0IFhNTCBQbHVnLWluDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgWE1MIFdpemFyZA0KLWltcG9ydFhNTFdpemFyZE5hbWU9WE1MDQotaW1wb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249XHU1MzJmXHU1MTY1IFhNTCBcdTZhOTRcdTRlMmRcdTUxMzJcdTViNThcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTUxNjdcdTViYjlcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmY2U3OGIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZToNCi0jDQotDQotIyBJbXBvcnQgWE1MIFdpemFyZA0KLWltcG9ydFhNTFdpemFyZF90aXRsZT1YTUwgaW1wb3J0aWVyZW4NCi0NCi0jIFNlbGVjdCBJbXBvcnQgWE1MIEZpbGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1JbXBvcnRkYXRlaSBhbmdlYmVuDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1HZWJlbiBTaWUgZGllIFhNTC1EYXRlaSBhbiwgZGllIGRlbiB6dSBpbXBvcnRpZXJlbmRlbiBJbmhhbHQgZGVyIE1ldGhvZGVuYmlibGlvdGhlayBlbnRoXHUwMGU0bHQsIHVuZCB3XHUwMGU0aGxlbiBTaWUgZGllIGF1c3p1Zlx1MDBmY2hyZW5kZSBJbXBvcnRvcGVyYXRpb24gYXVzLg0KLWZpbGVMYWJlbF90ZXh0PVhNTC1EYXRlaToNCi1icm93c2VCdXR0b25fdGV4dD1EdXJjaHN1Y2hlbi4uLg0KLW9wdGlvbkdyb3VwX3RleHQ9SW1wb3J0b3B0aW9uDQotb3ZlcndyaXRlUmFkaW9CdXR0b25fdGV4dD1Wb3JoYW5kZW5lbiBJbmhhbHQgZGVyIE1ldGhvZGVuYmlibGlvdGhlayBkdXJjaCBkZW4gaW1wb3J0aWVydGVuIEluaGFsdCBcdTAwZmNiZXJzY2hyZWliZW4NCi1tZXJnZVJhZGlvQnV0dG9uX3RleHQ9SW1wb3J0aWVydGVuIEluaGFsdCBpbiBkaWUgdm9yaGFuZGVuZSBNZXRob2RlbmJpYmxpb3RoZWsgZWluZlx1MDBmY2dlbg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1pbXBvcnRpbmdYTUxfdGV4dD1YTUwtQmlibGlvdGhla3NpbmhhbHQgaW4gZGllIGFrdHVlbGxlIE1ldGhvZGVuYmlibGlvdGhlayBpbXBvcnRpZXJlbi4uLg0KLQ0KLSMgSW1wb3J0IFhNTCBFcnJvciBEaWFsb2cNCi1yZXZpZXdfbG9nX2ZpbGVzPURpZSBJbXBvcnRvcGVyYXRpb24gaXN0IGFiZ2VzY2hsb3NzZW4uIFN1Y2hlbiBTaWUgaW4gZGVuIFByb3Rva29sbGRhdGVpZW5cbmltIE9yZG5lciAnJ3swfScnIG5hY2ggRmVobGVybi4NCi1pbXBvcnRYTUxFcnJvcl9tc2c9SVVQTTAwMDBFOiBEaWUgSW1wb3J0b3BlcmF0aW9uIGthbm4gbmljaHQgZm9ydGdlc2V0enQgd2VyZGVuLg0KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IERpZSBha3R1ZWxsZSBCaWJsaW90aGVrIGlzdCBzY2hyZWliZ2VzY2hcdTAwZmN0enQuXG5cblN0ZWxsZW4gU2llIHNpY2hlciwgZGFzcyBkZXIgU2NocmVpYnp1Z3JpZmYgYXVmICcnezB9JycgbVx1MDBmNmdsaWNoIGlzdCwgb2RlciBlcnN0ZWxsZW4gU2llIGVpbmUgbmV1ZSBNZXRob2RlbmJpYmxpb3RoZWsgdW5kIHdpZWRlcmhvbGVuIFNpZSBkZW4gVm9yZ2FuZy4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9RGllIGFuZ2VnZWJlbmUgWE1MLURhdGVpIGlzdCBuaWNodCBnXHUwMGZjbHRpZy4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBNMDAxMEU6IERpZSBhbmdlZ2ViZW5lIFhNTC1EYXRlaSB3dXJkZSBtaXQgZWluZXIgZnJcdTAwZmNoZXJlbiBWZXJzaW9uICh7MH0pIHZvbiB7MX0gZXhwb3J0aWVydC4gRGllIERhdGVpZW4gbVx1MDBmY3NzZW4gbWl0IGRlciBha3R1ZWxsZW4gVmVyc2lvbiB2b24gezF9IGV4cG9ydGllcnQgd2VyZGVuLg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQTTAwMTFFOiBEaWUgYW5nZWdlYmVuZSBYTUwtRGF0ZWkgd3VyZGUgbWl0IGVpbmVyIGZyXHUwMGZjaGVyZW4gVmVyc2lvbiB2b24gezB9IGV4cG9ydGllcnQuIERpZSBEYXRlaWVuIG1cdTAwZmNzc2VuIG1pdCBkZXIgYWt0dWVsbGVuIFZlcnNpb24gdm9uIHswfSBleHBvcnRpZXJ0IHdlcmRlbi4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBNMDAxMkU6IERpZSBhbmdlZ2ViZW5lIFhNTC1EYXRlaSB3dXJkZSBtaXQgZWluZXIgbmV1ZXJlbiBWZXJzaW9uICh7MH0pIHZvbiB7MX0gZXhwb3J0aWVydC4gU2llIG1cdTAwZmNzc2VuIGVpbmVuIFVwZ3JhZGUgdm9uIHsxfSBkdXJjaGZcdTAwZmNocmVuLCB1bSBkaWUgRGF0ZWkgaW1wb3J0aWVyZW4genUga1x1MDBmNm5uZW4uIA0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQTTAwMTNFOiBEaWUgYXVzZ2V3XHUwMGU0aGx0ZSBYTUwtRGF0ZWkga2FubiBuaWNodCBnZVx1MDBmNmZmbmV0IHdlcmRlbi4gU2llIG1cdTAwZmNzc2VuIGVpbmVuIFVwZ3JhZGUgdm9uIHswfSBkdXJjaGZcdTAwZmNocmVuLCB1bSBkaWUgRGF0ZWkgaW1wb3J0aWVyZW4genUga1x1MDBmNm5uZW4uIA0KLQ0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZD1OaWNodCBiZWFyYmVpdGV0ZXMgRWxlbWVudDogezB9DQotaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQ9RWxlbWVudCBvaG5lIElEOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX2ltcG9ydF9mYWlsZWQ9SW1wb3J0IGZlaGxnZXNjaGxhZ2VuOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luPURhcyBlcmZvcmRlcmxpY2hlIFBsdWctaW4gezB9IGZlaGx0Lg0KLWltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zPUVzIGZlaGxlbiBlcmZvcmRlcmxpY2hlIFBsdWctaW5zLiBTdWNoZW4gU2llIGluIGRlbiBQcm90b2tvbGxkYXRlaWVuIG5hY2ggRWluemVsaGVpdGVuLg0KLQ0KLWxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzPUZlaGxlciBiZWltIEVyc3RlbGxlbiBkZXIgSW5oYWx0c2thdGVnb3JpZTogRGllIEVDbGFzcyBmXHUwMGZjciB7MH0ga2FubiBuaWNodCBhYmdlcnVmZW4gd2VyZGVuLg0KLWxpYnJhcnlfbm9fcGFja2FnZT1EYXMgUGFrZXQgZlx1MDBmY3IgZGFzIE9iamVrdCB7MH0gd3VyZGUgbmljaHQgZ2VmdW5kZW4uDQotbGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudD1GZWhsZXIgYmVpbSBFcnN0ZWxsZW4gZGVzIEVsZW1lbnRzOiB7MH0NCi1saWJyYXJ5X29iamVjdF9zdHJpbmc9T2JqZWt0IHswfSwgRmVhdHVyZSB7MX0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMj1GZWhsZXIgYmVpbSBTZXR6ZW4gZGVzIEF0dHJpYnV0czogRGVyIEZlYXR1cmUtV2VydCB7MH0gaXN0IHVuZ1x1MDBmY2x0aWcuDQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlPUZlaGxlciBiZWltIFNldHplbiBkZXMgQXR0cmlidXRzIGZcdTAwZmNyIE9iamVrdCB7MH0sIEZlYXR1cmUgezF9IHVuZCBXZXJ0IHsyfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8zPUVzIGthbm4gbmljaHQgYmVzdGltbXQgd2VyZGVuLCB3aWUgZGFzIEF0dHJpYnV0IGZcdTAwZmNyIE9iamVrdCB7MH0sIEZlYXR1cmUgezF9IHVuZCBXZXJ0IHsyfSBnZXNldHp0IHdlcmRlbiBrYW5uLg0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1GZWhsZXIgYmVpbSBEZWZpbmllcmVuIGRlciBSZWZlcmVueiBmXHUwMGZjciBGZWF0dXJlIHswfTogRXMgaXN0IGtlaW4gRWxlbWVudCBtaXQgZGVyIElEIHsxfSB2b3JoYW5kZW4uDQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlXzI9RmVobGVyIGJlaW0gRGVmaW5pZXJlbiBkZXIgUmVmZXJlbnogZlx1MDBmY3IgT2JqZWt0IHswfSwgRmVhdHVyZSB7MX0gdW5kIFdlcnQgezJ9DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YTIyYzE3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgSW1wb3J0IFhNTCBXaXphcmQNCi1pbXBvcnRYTUxXaXphcmRfdGl0bGU9SW1wb3J0YXIgWE1MDQotDQotIyBTZWxlY3QgSW1wb3J0IFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9RXNwZWNpZmljYXIgYXJjaGl2byBkZSBpbXBvcnRhY2lcdTAwZjNuDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1Fc3BlY2lmaXF1ZSBlbCBhcmNoaXZvIFhNTCBlbiBlbCBxdWUgc2UgZW5jdWVudHJhIGVsIGNvbnRlbmlkbyBkZSBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyB5IHNlbGVjY2lvbmUgbGEgb3BlcmFjaVx1MDBmM24gZGUgaW1wb3J0YWNpXHUwMGYzbiBhZGVjdWFkYSBxdWUgc2UgZGViZSByZWFsaXphci4NCi1maWxlTGFiZWxfdGV4dD1BcmNoaXZvIFhNTDoNCi1icm93c2VCdXR0b25fdGV4dD1FeGFtaW5hci4uLg0KLW9wdGlvbkdyb3VwX3RleHQ9T3BjaVx1MDBmM24gSW1wb3J0YXINCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PVNvYnJlZXNjcmliaXIgZWwgY29udGVuaWRvIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGV4aXN0ZW50ZSBjb24gZWwgY29udGVuaWRvIGltcG9ydGFkbw0KLW1lcmdlUmFkaW9CdXR0b25fdGV4dD1GdXNpb25hciBlbCBjb250ZW5pZG8gaW1wb3J0YWRvIGVuIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGV4aXN0ZW50ZQ0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1pbXBvcnRpbmdYTUxfdGV4dD1JbXBvcnRhbmRvIGNvbnRlbmlkbyBkZSBsYSBiaWJsaW90ZWNhIFhNTCBhIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGFjdHVhbC4uLg0KLQ0KLSMgSW1wb3J0IFhNTCBFcnJvciBEaWFsb2cNCi1yZXZpZXdfbG9nX2ZpbGVzPUxhIG9wZXJhY2lcdTAwZjNuIGRlIGltcG9ydGFjaVx1MDBmM24gc2UgaGEgY29tcGxldGFkby4gUmV2aXNlIGxvcyBhcmNoaXZvcyBkZSByZWdpc3RybyBkZVxubGEgY2FycGV0YSAnJ3swfScnIHBhcmEgdmVyIHNpIGhheSBlcnJvcmVzLg0KLWltcG9ydFhNTEVycm9yX21zZz1JVVBNMDAwMEU6IExhIG9wZXJhY2lcdTAwZjNuIGRlIGltcG9ydGFjaVx1MDBmM24gbm8gcHVlZGUgY29udGludWFyLg0KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IExhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGFjdHVhbCBlcyBkZSBzXHUwMGYzbG8gbGVjdHVyYS5cblxuQXNlZ1x1MDBmYXJlc2UgZGUgcXVlICcnezB9JycgZXMgZ3JhYmFibGUgbyBjcmVlIHVuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBudWV2YSB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWRYTUxGaWxlX2Vycm9yPUVsIGFyY2hpdm8gWE1MIGVzcGVjaWZpY2FkbyBubyBlcyB2XHUwMGUxbGlkby4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBNMDAxMEU6IFVuYSB2ZXJzaVx1MDBmM24gYW50ZXJpb3IgezB9KSBkZSB7MX0gaGEgZXhwb3J0YWRvIGVsIGFyY2hpdm8gWE1MIGVzcGVjaWZpY2Fkby4gIExvcyBhcmNoaXZvcyBzZSBkZWJlbiBleHBvcnRhciBjb24gbGEgdmVyc2lcdTAwZjNuIGFjdHVhbCBkZSB7MX0uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUU6IFVuYSB2ZXJzaVx1MDBmM24gYW50ZXJpb3IgZGUgezB9IGhhIGV4cG9ydGFkbyBlbCBhcmNoaXZvIFhNTCBlc3BlY2lmaWNhZG8uICBMb3MgYXJjaGl2b3Mgc2UgZGViZW4gZXhwb3J0YXIgY29uIGxhIHZlcnNpXHUwMGYzbiBhY3R1YWwgZGUgezB9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUE0wMDEyRTogVW5hIHZlcnNpXHUwMGYzbiBtXHUwMGUxcyByZWNpZW50ZSAoezB9KSBkZSB7MX0gaGEgZXhwb3J0YWRvIGVsIGFyY2hpdm8gWE1MIGVzcGVjaWZpY2Fkby4gRGViZSBhY3R1YWxpemFyIHsxfSBwYXJhIGltcG9ydGFyIGVsIGFyY2hpdm8uICANCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUE0wMDEzRTogTm8gc2UgcHVlZGUgYWJyaXIgZWwgYXJjaGl2byBYTUwgZXNwZWNpZmljYWRvLiBEZWJlIGFjdHVhbGl6YXIgezB9IHBhcmEgaW1wb3J0YXIgZWwgYXJjaGl2by4gIA0KLQ0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZD1FbGVtZW50byBubyBnZXN0aW9uYWRvOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfd2l0aG91dF9pZD1FbGVtZW50byBzaW4gSUQ6IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZD1MYSBpbXBvcnRhY2lcdTAwZjNuIGhhIGZhbGxhZG86IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfbWlzc2luZ19wbHVnaW49RmFsdGEgZWwgcGx1Zy1pbiBuZWNlc2FyaW8gezB9DQotaW1wb3J0WE1MU2VydmljZV9lcnJvcl9taXNzaW5nX3BsdWdpbnM9RmFsdGEobikgcGx1Zy1pbihzKSBuZWNlc2FyaW8ocykuIENvbXBydWViZSBsb3MgZGV0YWxsZXMgZW4gbG9zIGFyY2hpdm9zIGRlIHJlZ2lzdHJvDQotDQotbGlicmFyeV9lcnJvcl9ub19lY2xhc3M9RXJyb3IgYWwgY3JlYXIgQ29udGVudENhdGVnb3J5OiBObyBzZSBoYSBwb2RpZG8gb2J0ZW5lciBFQ2xhc3MgcGFyYSB7MH0NCi1saWJyYXJ5X25vX3BhY2thZ2U9Tm8gc2UgaGEgcG9kaWRvIGVuY29udHJhciBlbCBwYXF1ZXRlIGRlIHByb3BpZWRhZCBkZWwgb2JqZXRvIHswfQ0KLWxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9RXJyb3IgYWwgY3JlYXIgZWwgZWxlbWVudG86IHswfQ0KLWxpYnJhcnlfb2JqZWN0X3N0cmluZz1vYmpldG8gezB9LCBjYXJhY3Rlclx1MDBlZHN0aWNhIHsxfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8yPUVycm9yIGFsIGVzdGFibGVjZXIgZWwgYXRyaWJ1dG86IFZhbG9yIGRlIGNhcmFjdGVyXHUwMGVkc3RpY2EgZGUgYXRyaWJ1dG8gbm8gdlx1MDBlMWxpZGEgezB9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlPUVycm9yIGFsIGVzdGFibGVjZXIgZWwgYXRyaWJ1dG8gZGVsIG9iamV0byB7MH0sIGNhcmFjdGVyXHUwMGVkc3RpY2EgezF9IHkgdmFsb3IgezJ9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzM9U2UgaWdub3JhIGNcdTAwZjNtbyBlc3RhYmxlY2VyIGVsIGF0cmlidXRvIGRlbCBvYmpldG8gezB9LCBjYXJhY3Rlclx1MDBlZHN0aWNhIHsxfSB5IHZhbG9yIHsyfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1FcnJvciBhbCBlc3RhYmxlY2VyIHJlZmVyZW5jaWEgcGFyYSBsYSBjYXJhY3Rlclx1MDBlZHN0aWNhIHswfTogbm8gaGF5IG5pbmdcdTAwZmFuIGVsZW1lbnRvIGNvbiBlbCBJRCB7MX0NCi1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMj1FcnJvciBhbCBlc3RhYmxlY2VyIHJlZmVyZW5jaWEgcGFyYSBlbCBvYmpldG8gezB9LCBjYXJhY3Rlclx1MDBlZHN0aWNhIHsxfSB5IHZhbG9yIHsyfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmY4NTAyNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOg0KLSMNCi0NCi0jIEltcG9ydCBYTUwgV2l6YXJkDQotaW1wb3J0WE1MV2l6YXJkX3RpdGxlPUltcG9ydGVyIGR1IGxhbmdhZ2UgWE1MDQotDQotIyBTZWxlY3QgSW1wb3J0IFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9U3BcdTAwZTljaWZpZXIgdW4gZmljaGllciBkJ2ltcG9ydGF0aW9uDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1TcFx1MDBlOWNpZmlleiBsZSBmaWNoaWVyIFhNTCBpbmNsdWFudCBsZSBjb250ZW51IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgXHUwMGUwIGltcG9ydGVyIGV0IHNcdTAwZTlsZWN0aW9ubmV6IGwnb3BcdTAwZTlyYXRpb24gZCdpbXBvcnRhdGlvbiBhZFx1MDBlOXF1YXRlIFx1MDBlMCBlZmZlY3R1ZXIuDQotZmlsZUxhYmVsX3RleHQ9RmljaGllciBYTUwgOg0KLWJyb3dzZUJ1dHRvbl90ZXh0PVBhcmNvdXJpci4uLg0KLW9wdGlvbkdyb3VwX3RleHQ9T3B0aW9uIGQnaW1wb3J0YXRpb24NCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PUVjcmFzZXogbGUgY29udGVudSBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGV4aXN0YW50ZSBhdmVjIGxlIGNvbnRlbnUgaW1wb3J0XHUwMGU5DQotbWVyZ2VSYWRpb0J1dHRvbl90ZXh0PUZ1c2lvbm5leiBsZSBjb250ZW51IGltcG9ydFx1MDBlOSBkYW5zIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZXhpc3RhbnRlDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWltcG9ydGluZ1hNTF90ZXh0PUltcG9ydGF0aW9uIGR1IGNvbnRlbnUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgWE1MIGRhbnMgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBlbiBjb3Vycy4uLg0KLQ0KLSMgSW1wb3J0IFhNTCBFcnJvciBEaWFsb2cNCi1yZXZpZXdfbG9nX2ZpbGVzPUwnJ29wXHUwMGU5cmF0aW9uIGQnJ2ltcG9ydGF0aW9uIGVzdCB0ZXJtaW5cdTAwZTllLiBSXHUwMGU5dmlzZXogbGVzIGZpY2hpZXJzIGpvdXJuYXV4IGRhbnMgbGUgZG9zc2llciBcbicnezB9JycgZW4gY2FzIGQnJ2VycmV1ci4NCi1pbXBvcnRYTUxFcnJvcl9tc2c9SVVQTTAwMDBFIDogTCdvcFx1MDBlOXJhdGlvbiBkJ2ltcG9ydGF0aW9uIG5lIHBldXQgcGFzIHNlIHBvdXJzdWl2cmUuDQotaW1wb3J0WE1MRXJyb3JfcmVhc29uPUlVUE0wMDA5RSA6IExhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZW4gY291cnMgZXN0IGVuIGxlY3R1cmUgc2V1bGVtZW50LlxuXG5Bc3N1cmV6LXZvdXMgcXVlICcnezB9JycgZXN0IG1vZGlmaWFibGUgb3UgY3JcdTAwZTlleiB1bmUgbm91dmVsbGUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBldCByXHUwMGU5ZXNzYXllei4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9TGUgZmljaGllciBYTUwgc3BcdTAwZTljaWZpXHUwMGU5IGVzdCBub24gdmFsaWRlLg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUE0wMDEwRSA6IExlIGZpY2hpZXIgWE1MIHNwXHUwMGU5Y2lmaVx1MDBlOSBhIFx1MDBlOXRcdTAwZTkgZXhwb3J0XHUwMGU5IHBhciB1bmUgdmVyc2lvbiBhbnRcdTAwZTlyaWV1cmUgKHswfSkgZGUgezF9LiBWb3VzIGRldmV6IGV4cG9ydGVyIGxlcyBmaWNoaWVycyBlbiB1dGlsaXNhbnQgbGEgdmVyc2lvbiBhY3R1ZWxsZSBkZSB7MX0uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUUgOiBMZSBmaWNoaWVyIFhNTCBzcFx1MDBlOWNpZmlcdTAwZTkgYSBcdTAwZTl0XHUwMGU5IGV4cG9ydFx1MDBlOSBwYXIgdW5lIHZlcnNpb24gYW50XHUwMGU5cmlldXJlIGRlIHswfS4gVm91cyBkZXZleiBleHBvcnRlciBsZXMgZmljaGllcnMgZW4gdXRpbGlzYW50IGxhIHZlcnNpb24gYWN0dWVsbGUgZGUgezB9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUE0wMDEyRSA6IExlIGZpY2hpZXIgWE1MIHNwXHUwMGU5Y2lmaVx1MDBlOSBhIFx1MDBlOXRcdTAwZTkgZXhwb3J0XHUwMGU5IHBhciB1bmUgdmVyc2lvbiBwbHVzIHJcdTAwZTljZW50ZSAoezB9KSBkZSB7MX0uIFZvdXMgZGV2ZXogZWZmZWN0dWVyIHVuZSBtaXNlIFx1MDBlMCBuaXZlYXUgZGUgezF9IHBvdXIgaW1wb3J0ZXIgbGUgZmljaGllci4gIA0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQTTAwMTNFOiBJbXBvc3NpYmxlIGQnJ291dnJpciBsZSBmaWNoaWVyIFhNTCBzcFx1MDBlOWNpZmlcdTAwZTkuIFZvdXMgZGV2ZXogZWZmZWN0dWVyIHVuZSBtaXNlIFx1MDBlMCBuaXZlYXUgZGUgezB9IHBvdXIgaW1wb3J0ZXIgbGUgZmljaGllci4gIA0KLQ0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZD1FbFx1MDBlOW1lbnQgbm9uIGdcdTAwZTlyXHUwMGU5IDogezB9DQotaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQ9RWxcdTAwZTltZW50IHNhbnMgaWRlbnRpZmljYXRldXIgOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX2ltcG9ydF9mYWlsZWQ9RWNoZWMgZGUgbCcnaW1wb3J0YXRpb24gOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luPVBsdWctaW4gcmVxdWlzIG1hbnF1YW50IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zPVBsdWctaW4ocykgcmVxdWlzIG1hbnF1YW50cy4gVlx1MDBlOXJpZmlleiBsZXMgZmljaGllcnMgam91cm5hdXggcG91ciBwbHVzIGRlIGRcdTAwZTl0YWlscy4NCi0NCi1saWJyYXJ5X2Vycm9yX25vX2VjbGFzcz1FcnJldXIgbG9ycyBkZSBsYSBjclx1MDBlOWF0aW9uIGQnJ3VuZSBjYXRcdTAwZTlnb3JpZSBkZSBjb250ZW51IDogSW1wb3NzaWJsZSBkJydvYnRlbmlyIEVDbGFzcyBwb3VyIHswfQ0KLWxpYnJhcnlfbm9fcGFja2FnZT1JbXBvc3NpYmxlIGRlIHRyb3V2ZXIgbGUgcGFja2FnZSBkJydhcHBhcnRlbmFuY2UgcG91ciBsJydvYmpldCB7MH0NCi1saWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PUVycmV1ciBsb3JzIGRlIGxhIGNyXHUwMGU5YXRpb24gZGUgbCcnXHUwMGU5bFx1MDBlOW1lbnQgOiB7MH0NCi1saWJyYXJ5X29iamVjdF9zdHJpbmc9b2JqZXQgezB9LCBmb25jdGlvbiB7MX0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMj1FcnJldXIgbG9ycyBkZSBsYSBkXHUwMGU5ZmluaXRpb24gZCcndW4gYXR0cmlidXQgOiBWYWxldXIgZGUgbGEgZm9uY3Rpb24gZCcnYXR0cmlidXQgbm9uIHZhbGlkZSB7MH0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGU9RXJyZXVyIGxvcnMgZGUgbGEgZFx1MDBlOWZpbml0aW9uIGQnJ3VuIGF0dHJpYnV0IHBvdXIgbCcnb2JqZXQgezB9LCBsYSBmb25jdGlvbiB7MX0gZXQgbGEgdmFsZXVyIHsyfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8zPUlnbm9yZSBjb21tZW50IGRcdTAwZTlmaW5pciB1biBhdHRyaWJ1dCBwb3VyIGwnJ29iamV0IHswfSwgbGEgZm9uY3Rpb24gezF9IGV0IGxhIHZhbGV1ciB7Mn0NCi1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9RXJyZXVyIGxvcnMgZGUgbGEgZFx1MDBlOWZpbml0aW9uIGQnJ3VuZSByXHUwMGU5Zlx1MDBlOXJlbmNlIHBvdXIgbGEgZm9uY3Rpb24gezB9OiBhdWN1biBcdTAwZTlsXHUwMGU5bWVudCBjb250ZW5hbnQgdW4gaWRlbnRpZmljYXRldXIgezF9DQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlXzI9RXJyZXVyIGxvcnMgZGUgbGEgZFx1MDBlOWZpbml0aW9uIGQnJ3VuZSByXHUwMGU5Zlx1MDBlOXJlbmNlIHBvdXIgbCcnb2JqZXQgezB9LCBsYSBmb25jdGlvbiB7MX0gZXQgbGEgdmFsZXVyIHsyfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzYyMmJmZi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOg0KLSMNCi0NCi0jIEltcG9ydCBYTUwgV2l6YXJkDQotaW1wb3J0WE1MV2l6YXJkX3RpdGxlPUltcG9ydGEgWE1MDQotDQotIyBTZWxlY3QgSW1wb3J0IFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9U3BlY2lmaWNhIGZpbGUgZGkgaW1wb3J0YXppb25lDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1TcGVjaWZpY2FyZSBpbCBmaWxlIFhNTCBpbiBjdWkgc2kgdHJvdmEgaWwgY29udGVudXRvIGRlbGxhIGxpYnJlcmlhIGRlaSBtZXRvZGkgZGEgaW1wb3J0YXJlIGUgc2VsZXppb25hcmUgbCdvcGVyYXppb25lIGRpIGltcG9ydGF6aW9uZSBhcHByb3ByaWF0YSBkYSBlc2VndWlyZS4NCi1maWxlTGFiZWxfdGV4dD1GaWxlIFhNTDoNCi1icm93c2VCdXR0b25fdGV4dD1TZm9nbGlhLi4uDQotb3B0aW9uR3JvdXBfdGV4dD1JbXBvcnRhIG9wemlvbmUNCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PVNvdnJhc2NyaXZpIGlsIGNvbnRlbnV0byBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGVzaXN0ZW50ZSBjb24gaWwgY29udGVudXRvIGltcG9ydGF0bw0KLW1lcmdlUmFkaW9CdXR0b25fdGV4dD1VbmlzY2kgaWwgY29udGVudXRvIGltcG9ydGF0byBuZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGVzaXN0ZW50ZQ0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1pbXBvcnRpbmdYTUxfdGV4dD1JbXBvcnRhemlvbmUgZGVsIGNvbnRlbnV0byBkZWxsYSBsaWJyZXJpYSBYTUwgbmVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBjb3JyZW50ZSBpbiBjb3Jzby4uLg0KLQ0KLSMgSW1wb3J0IFhNTCBFcnJvciBEaWFsb2cNCi1yZXZpZXdfbG9nX2ZpbGVzPUwnJ29wZXJhemlvbmUgZGkgaW1wb3J0YXppb25lIFx1MDBlOCBzdGF0YSBjb21wbGV0YXRhLiBQZXIgZXZlbnR1YWxpIGVycm9yaSwgcml2ZWRlcmUgaSBmaWxlIGRpIGxvZyBuZWxsYSBjYXJ0ZWxsYSBcbiAnJ3swfScnLg0KLWltcG9ydFhNTEVycm9yX21zZz1JVVBNMDAwMEU6IEltcG9zc2liaWxlIGNvbnRpbnVhcmUgbCdvcGVyYXppb25lIGRpIGltcG9ydGF6aW9uZS4NCi1pbXBvcnRYTUxFcnJvcl9yZWFzb249SVVQTTAwMDlFOiBMYSBMaWJyZXJpYSBkZWkgbWV0b2RpIGNvcnJlbnRlIFx1MDBlOCBkaSBzb2xhIGxldHR1cmEuXG5cbkFzc2ljdXJhcnNpIGNoZSAnJ3swfScnIHNpYSBzY3JpdmliaWxlIG9wcHVyZSBjcmVhcmUgdW5hIG51b3ZhIGxpYnJlcmlhIGRlaSBtZXRvZGkgZSBwcm92YXJlIGRpIG51b3ZvLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkWE1MRmlsZV9lcnJvcj1JbCBmaWxlIFhNTCBzcGVjaWZpY2F0byBub24gXHUwMGU4IHZhbGlkby4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBNMDAxMEU6IGlsIGZpbGUgWE1MIHNwZWNpZmljYXRvIFx1MDBlOCBzdGF0byBlc3BvcnRhdG8gZGEgdW5hIHByZWNlZGVudGUgdmVyc2lvbmUgKHswfSkgZGkgezF9LiBFJycgbmVjZXNzYXJpbyBlc3BvcnRhcmUgaSBmaWxlIHV0aWxpenphbmRvIGxhIHZlcnNpb25lIGNvcnJlbnRlIGRpIHsxfS4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duPUlVUE0wMDExRTogaWwgZmlsZSBYTUwgc3BlY2lmaWNhdG8gXHUwMGU4IHN0YXRvIGVzcG9ydGF0byBkYSB1bmEgcHJlY2VkZW50ZSB2ZXJzaW9uZSBkaSB7MH0uIEUnJyBuZWNlc3NhcmlvIGVzcG9ydGFyZSBpIGZpbGUgdXRpbGl6emFuZG8gbGEgdmVyc2lvbmUgY29ycmVudGUgZGkgezB9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUE0wMDEyRTogaWwgZmlsZSBYTUwgc3BlY2lmaWNhdG8gXHUwMGU4IHN0YXRvIGVzcG9ydGF0byBkYSB1bmEgdmVyc2lvbmUgcGlcdTAwZjkgYWdnaW9ybmF0YSAoezB9KSBkaSB7MX0uIFx1MDBjOCBuZWNlc3NhcmlvIGFnZ2lvcm5hcmUgezF9IHBlciBpbXBvcnRhcmUgaWwgZmlsZS4gIA0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQTTAwMTNFOiBpbXBvc3NpYmlsZSBhcHJpcmUgaWwgZmlsZSBYTUwgc3BlY2lmaWNhdG8uIFx1MDBjOCBuZWNlc3NhcmlvIGFnZ2lvcm5hcmUgezB9IHBlciBpbXBvcnRhcmUgaWwgZmlsZS4gIA0KLQ0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZD1FbGVtZW50byBub24gZ2VzdGl0bzogezB9DQotaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQ9RWxlbWVudG8gc2VuemEgSUQ6IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZD1JbXBvcnRhemlvbmUgbm9uIHJpdXNjaXRhOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luPVBsdWdpbiByaWNoaWVzdG8gbWFuY2FudGUgezB9DQotaW1wb3J0WE1MU2VydmljZV9lcnJvcl9taXNzaW5nX3BsdWdpbnM9UGx1Z2luIHJpY2hpZXN0byBtYW5jYW50ZS4gUGVyIHVsdGVyaW9yaSBkZXR0YWdsaSwgY29udHJvbGxhcmUgaSBmaWxlIGRpIGxvZw0KLQ0KLWxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzPUVycm9yZSBkdXJhbnRlIGxhIGNyZWF6aW9uZSBkaSBDb250ZW50Q2F0ZWdvcnk6IGltcG9zc2liaWxlIHJpY2hpYW1hcmUgRUNsYXNzIHBlciB7MH0NCi1saWJyYXJ5X25vX3BhY2thZ2U9SW1wb3NzaWJpbGUgdHJvdmFyZSBpbCBwYWNjaGV0dG8gZGkgb3JpZ2luZSBkZWxsJydvZ2dldHRvIHswfQ0KLWxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9RXJyb3JlIGR1cmFudGUgbGEgY3JlYXppb25lIGRlbGwnJ2VsZW1lbnRvOiB7MH0NCi1saWJyYXJ5X29iamVjdF9zdHJpbmc9b2dnZXR0byB7MH0sIGZ1bnppb25lIHsxfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8yPUVycm9yZSBkdXJhbnRlIGwnJ2ltcG9zdGF6aW9uZSBkZWxsJydhdHRyaWJ1dG86IHZhbG9yZSBmdW56aW9uZSBhdHRyaWJ1dG8gbm9uIHZhbGlkbyB7MH0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGU9RXJyb3JlIGR1cmFudGUgbCcnaW1wb3N0YXppb25lIGRlbGwnJ2F0dHJpYnV0byBwZXIgbCcnb2dnZXR0byB7MH0sIGxhIGZ1bnppb25lIHsxfSBlIGlsIHZhbG9yZSB7Mn0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMz1JbXBvc3NpYmlsZSBpbXBvc3RhcmUgbCcnYXR0cmlidXRvIHBlciBsJydvZ2dldHRvIHswfSwgbGEgZnVuemlvbmUgezF9IGUgaWwgdmFsb3JlIHsyfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1FcnJvcmUgZHVyYW50ZSBsJydpbXBvc3RhemlvbmUgZGVsIHJpZmVyaW1lbnRvIHBlciBsYSBmdW56aW9uZSB7MH06IG5lc3N1biBlbGVtZW50byBjb24gaWQgezF9DQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlXzI9RXJyb3JlIGR1cmFudGUgbCcnaW1wb3N0YXppb25lIGRlbCByaWZlcmltZW50byBwZXIgbCcnb2dnZXR0byB7MH0sIGxhIGZ1bnppb25lIHsxfSBlIGlsIHZhbG9yZSB7Mn0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlZTI5ZWEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZToNCi0jDQotDQotIyBJbXBvcnQgWE1MIFdpemFyZA0KLWltcG9ydFhNTFdpemFyZF90aXRsZT1YTUwgXHUzMDZlXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4DQotDQotIyBTZWxlY3QgSW1wb3J0IFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9XHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHU2MzA3XHU1YjlhDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1cdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTlcdTMwOGJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwOTJcdTU0MmJcdTMwODAgWE1MIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzAwMVx1NWI5Zlx1ODg0Y1x1MzA1OVx1MzA4Ylx1OTA2OVx1NTIwN1x1MzA2YVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1NjRjZFx1NGY1Y1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWZpbGVMYWJlbF90ZXh0PVhNTCBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWI6DQotYnJvd3NlQnV0dG9uX3RleHQ9XHU1M2MyXHU3MTY3Li4uDQotb3B0aW9uR3JvdXBfdGV4dD1cdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjMNCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA5Mlx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA2N1x1MzBhYVx1MzBmY1x1MzBkMFx1MzBmY1x1MzBlOVx1MzBhNFx1MzBjOQ0KLW1lcmdlUmFkaW9CdXR0b25fdGV4dD1cdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwOTJcdTY1ZTJcdTViNThcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmJcdTMwZGVcdTMwZmNcdTMwYjgNCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotaW1wb3J0aW5nWE1MX3RleHQ9WE1MIFx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA5Mlx1NzNmZVx1ODg0Y1x1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Ylx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1NGUyZC4uLg0KLQ0KLSMgSW1wb3J0IFhNTCBFcnJvciBEaWFsb2cNCi1yZXZpZXdfbG9nX2ZpbGVzPVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1NjRjZFx1NGY1Y1x1MzA0Y1x1NWI4Y1x1NGU4Nlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTMwNmFcdTMwNDRcdTMwNGJcdTMwNjlcdTMwNDZcdTMwNGIgJyd7MH0nJyBcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzBcdTMwZmNcdTUxODVcdTMwNmVcblx1MzBlZFx1MzBiMFx1MzBmYlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NzhiYVx1OGE4ZFx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWltcG9ydFhNTEVycm9yX21zZz1JVVBNMDAwMEU6IFx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1NjRjZFx1NGY1Y1x1MzA5Mlx1N2Q5YVx1ODg0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IFx1NzNmZVx1ODg0Y1x1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Zlx1OGFhZFx1MzA3Zlx1NTNkNlx1MzA4YVx1NWMwMlx1NzUyOFx1MzA2N1x1MzA1OVx1MzAwMlxuXG4nJ3swfScnIFx1MzA0Y1x1NjZmOFx1MzA0ZFx1OGZiY1x1MzA3Zlx1NTNlZlx1ODBmZFx1MzA2N1x1MzA0Mlx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA5Mlx1NzhiYVx1OGE4ZFx1MzA1OVx1MzA4Ylx1MzA0Ylx1MzAwMVx1NjViMFx1ODk4Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1MzAwMVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkWE1MRmlsZV9lcnJvcj1cdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWYgWE1MIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OVx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUE0wMDEwRTogXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmIFhNTCBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNGNcdTMwMDF7MX0gXHUzMDZlXHU1MjRkXHUzMDZlXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzICh7MH0pIFx1MzA2Ylx1MzA4OFx1MzA2M1x1MzA2Nlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZVx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA2ZiB7MX0gXHUzMDZlXHU3M2ZlXHU4ODRjXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHUzMDkyXHU0ZjdmXHUzMDYzXHUzMDY2XHU4ODRjXHUzMDQ2XHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUU6IFx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1ZiBYTUwgXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHUzMDAxezB9IFx1MzA2ZVx1NTI0ZFx1MzA2ZVx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1MzA2Ylx1MzA4OFx1MzA2M1x1MzA2Nlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZVx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA2ZiB7MH0gXHUzMDZlXHU3M2ZlXHU4ODRjXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHUzMDkyXHU0ZjdmXHUzMDYzXHUzMDY2XHU4ODRjXHUzMDQ2XHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotdmVyc2lvbk1pc21hdGNoX29sZFRvb2w9SVVQTTAwMTJFOiBcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWYgWE1MIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1MzAwMXsxfSBcdTMwNmVcdTY1YjBcdTg5OGZcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjMgKHswfSkgXHUzMDZiXHUzMDg4XHUzMDYzXHUzMDY2XHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU5XHUzMDhiXHUzMDZiXHUzMDZmXHUzMDAxezF9IFx1MzA2Ylx1MzBhMlx1MzBjM1x1MzBkN1x1MzBiMFx1MzBlY1x1MzBmY1x1MzBjOVx1MzA1OVx1MzA4Ylx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQTTAwMTNFOiBcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWYgWE1MIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1OTU4Ylx1MzA0Zlx1MzA1M1x1MzA2OFx1MzA0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA1OVx1MzA4Ylx1MzA2Ylx1MzA2Zlx1MzAwMXswfSBcdTMwNmJcdTMwYTJcdTMwYzNcdTMwZDdcdTMwYjBcdTMwZWNcdTMwZmNcdTMwYzlcdTMwNTlcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQ9XHU1MWU2XHU3NDA2XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDZhXHUzMDQ0XHU4OTgxXHU3ZDIwOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfd2l0aG91dF9pZD1JRCBcdTMwNmVcdTMwNmFcdTMwNDRcdTg5ODFcdTdkMjA6IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZD1cdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNmZcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWY6IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfbWlzc2luZ19wbHVnaW49XHU1ZmM1XHU4OTgxXHUzMDZhXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzIHswfSBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMNCi1pbXBvcnRYTUxTZXJ2aWNlX2Vycm9yX21pc3NpbmdfcGx1Z2lucz1cdTVmYzVcdTg5ODFcdTMwNmFcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgXHU4YTczXHU3ZDMwXHUzMDZiXHUzMDY0XHUzMDQ0XHUzMDY2XHUzMDZmXHUzMDAxXHUzMGVkXHUzMGIwXHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHU3OGJhXHU4YThkXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0DQotDQotbGlicmFyeV9lcnJvcl9ub19lY2xhc3M9Q29udGVudENhdGVnb3J5IFx1MzA2ZVx1NGY1Y1x1NjIxMFx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OVx1MzAwMnswfSBcdTMwNmUgRUNsYXNzIFx1MzA5Mlx1NTNkNlx1NWY5N1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLWxpYnJhcnlfbm9fcGFja2FnZT1cdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzggezB9IFx1MzA2ZVx1NjI0MFx1NjcwOVx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOFx1MzA5Mlx1NjkxY1x1N2QyMlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLWxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9XHU4OTgxXHU3ZDIwIHswfSBcdTMwNmVcdTRmNWNcdTYyMTBcdTMwYThcdTMwZTlcdTMwZmMNCi1saWJyYXJ5X29iamVjdF9zdHJpbmc9XHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4IHswfVx1MzAwMVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzBmYyB7MX0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMj1cdTVjNWVcdTYwMjdcdTMwNmVcdThhMmRcdTViOWFcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTlcdTMwMDJcdTcxMjFcdTUyYjlcdTMwNmFcdTVjNWVcdTYwMjdcdTMwZDVcdTMwYTNcdTMwZmNcdTMwYzFcdTMwZTNcdTMwZmNcdTUwMjQgezB9IFx1MzA2N1x1MzA1OQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZT1cdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzggezB9XHUzMDAxXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGZjIHsxfVx1MzAwMVx1MzA0YVx1MzA4OFx1MzA3M1x1NTAyNCB7Mn0gXHUzMDZlXHU1YzVlXHU2MDI3XHUzMDZlXHU4YTJkXHU1YjlhXHUzMGE4XHUzMGU5XHUzMGZjDQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzM9XHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4IHswfVx1MzAwMVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzBmYyB7MX1cdTMwMDFcdTMwNGFcdTMwODhcdTMwNzNcdTUwMjQgezJ9IFx1MzA2ZVx1NWM1ZVx1NjAyN1x1MzA2ZVx1OGEyZFx1NWI5YVx1NjViOVx1NmNkNVx1MzA0Y1x1NGUwZFx1NjYwZVx1MzA2N1x1MzA1OQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1cdTMwZDVcdTMwYTNcdTMwZmNcdTMwYzFcdTMwZTNcdTMwZmMgezB9IFx1MzA2ZVx1NTNjMlx1NzE2N1x1MzA2ZVx1OGEyZFx1NWI5YVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OVx1MzAwMklEIHsxfSBcdTMwNmVcdTg5ODFcdTdkMjBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMNCi1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMj1cdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzggezB9XHUzMDAxXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGZjIHsxfVx1MzAwMVx1MzA0YVx1MzA4OFx1MzA3M1x1NTAyNCB7Mn0gXHUzMDZlXHU1M2MyXHU3MTY3XHUzMDZlXHU4YTJkXHU1YjlhXHUzMGE4XHUzMGU5XHUzMGZjDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYjg5ZjBjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgSW1wb3J0IFhNTCBXaXphcmQNCi1pbXBvcnRYTUxXaXphcmRfdGl0bGU9WE1MIFx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMA0KLQ0KLSMgU2VsZWN0IEltcG9ydCBYTUwgRmlsZSBXaXphcmQgUGFnZQ0KLXNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlPVx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMCBcdWQzMGNcdWM3N2MgXHVjOWMwXHVjODE1DQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1cdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzBcdWQ1NjAgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgXHVkM2VjXHVkNTY4XHVkNTU4XHVhY2UwIFx1Yzc4OFx1YjI5NCBYTUwgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YWNlMCBcdWMyMThcdWQ1ODlcdWQ1NjAgXHVjODAxXHVjODA4XHVkNTVjIFx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMCBcdWM4NzBcdWM3OTFcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWZpbGVMYWJlbF90ZXh0PVhNTCBcdWQzMGNcdWM3N2M6DQotYnJvd3NlQnV0dG9uX3RleHQ9XHVjYzNlXHVjNTQ0XHViY2Y0XHVhZTMwLi4uDQotb3B0aW9uR3JvdXBfdGV4dD1cdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAgXHVjNjM1XHVjMTU4DQotb3ZlcndyaXRlUmFkaW9CdXR0b25fdGV4dD1cdWFlMzBcdWM4NzQgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgXHVhYzAwXHVjODM4XHVjNjI0XHViMjk0IFx1Y2VlOFx1ZDE1MFx1Y2UyMFx1Yjg1YyBcdWFjYjlcdWNjZDBcdWM1MDFcdWIyYzhcdWIyZTQuDQotbWVyZ2VSYWRpb0J1dHRvbl90ZXh0PVx1YWMwMFx1YzgzOFx1YzYyNFx1YjI5NCBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgXHVhZTMwXHVjODc0IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM1ZDAgXHViY2QxXHVkNTY5XHVkNTY5XHViMmM4XHViMmU0Lg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1pbXBvcnRpbmdYTUxfdGV4dD1YTUwgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1Y2VlOFx1ZDE1MFx1Y2UyMFx1Yjk3YyBcdWQ2MDRcdWM3YWMgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjg1YyBcdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAgXHVjOTExLi4uDQotDQotIyBJbXBvcnQgWE1MIEVycm9yIERpYWxvZw0KLXJldmlld19sb2dfZmlsZXM9XHVhYzAwXHVjODM4XHVjNjI0XHVhZTMwIFx1Yzg3MFx1Yzc5MVx1Yzc3NCBcdWM2NDRcdWI4Y2NcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YzYyNFx1Yjk1OFx1YzVkMCBcdWIzMDBcdWQ1NzRcdWMxMWNcdWIyOTQgJyd7MH0nJyBcdWQzZjRcdWIzNTRcdWM1ZDAgXHVjNzg4XHViMjk0XG5cdWI4NWNcdWFkZjggXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YWM4MFx1ZDFhMFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1pbXBvcnRYTUxFcnJvcl9tc2c9SVVQTTAwMDBFOiBcdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAgXHVjODcwXHVjNzkxXHVjNzQ0IFx1YzljNFx1ZDU4OVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IFx1ZDYwNFx1YzdhYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViMjk0IFx1Yzc3ZFx1YWUzMCBcdWM4MDRcdWM2YTlcdWM3ODVcdWIyYzhcdWIyZTQuXG5cbicnezB9JydcdWM3NzQoXHVhYzAwKSBcdWM0ZjBcdWFlMzAgXHVhYzAwXHViMmE1XHVkNTVjXHVjOWMwIFx1ZDY1NVx1Yzc3OFx1ZDU1OFx1YWM3MFx1YjA5OCBcdWMwYzggXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM3OTFcdWMxMzFcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9XHVjOWMwXHVjODE1XHVkNTVjIFhNTCBcdWQzMGNcdWM3N2NcdWM3NzQgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBNMDAxMEU6IFx1YzljMFx1YzgxNVx1YjQxYyBYTUwgXHVkMzBjXHVjNzdjXHVjNzc0IHsxfSBcdWM3NzRcdWM4MDQgXHViYzg0XHVjODA0KHswfSlcdWM1ZDBcdWMxMWMgXHViMGI0XHViY2Y0XHViMGI0XHVjODRjXHVjMmI1XHViMmM4XHViMmU0LiB7MX0gXHVkNjA0XHVjN2FjIFx1YmM4NFx1YzgwNFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWQ1NThcdWM1ZWMgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YjBiNFx1YmNmNFx1YjBiNFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUU6IFx1YzljMFx1YzgxNVx1YjQxYyBYTUwgXHVkMzBjXHVjNzdjXHVjNzc0IHswfSBcdWM3NzRcdWM4MDQgXHViYzg0XHVjODA0XHVjNWQwXHVjMTFjIFx1YjBiNFx1YmNmNFx1YjBiNFx1Yzg0Y1x1YzJiNVx1YjJjOFx1YjJlNC4gezB9IFx1ZDYwNFx1YzdhYyBcdWJjODRcdWM4MDRcdWM3NDQgXHVjMGFjXHVjNmE5XHVkNTU4XHVjNWVjIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWIwYjRcdWJjZjRcdWIwYjRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUE0wMDEyRTogXHVjOWMwXHVjODE1XHViNDFjIFhNTCBcdWQzMGNcdWM3N2NcdWM3NzQgezF9IFx1YzBjOCBcdWJjODRcdWM4MDQoezB9KVx1YzVkMFx1YzExYyBcdWIwYjRcdWJjZjRcdWIwYjRcdWM4NGNcdWMyYjVcdWIyYzhcdWIyZTQuIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWFjMDBcdWM4MzhcdWM2MjRcdWI4MjRcdWJhNzQgezF9IFx1YmM4NFx1YzgwNFx1Yzc0NCBcdWM1YzVcdWFkZjhcdWI4MDhcdWM3NzRcdWI0ZGNcdWQ1NzRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0LiANCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUE0wMDEzRTogXHVjOWMwXHVjODE1XHVkNTVjIFhNTCBcdWQzMGNcdWM3N2NcdWM3NDQgXHVjNWY0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWFjMDBcdWM4MzhcdWM2MjRcdWI4MjRcdWJhNzQgezB9IFx1YmM4NFx1YzgwNFx1Yzc0NCBcdWM1YzVcdWFkZjhcdWI4MDhcdWM3NzRcdWI0ZGNcdWQ1NzRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0LiANCi0NCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQ9XHVjYzk4XHViOWFjXHViNDE4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWM2OTRcdWMxOGM6IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF93aXRob3V0X2lkPUlEXHVhYzAwIFx1YzVjNlx1YjI5NCBcdWM2OTRcdWMxOGM6IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZD1cdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAgXHVjMmU0XHVkMzI4OiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luPVx1ZDU0NFx1YzIxOCBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzggezB9IFx1YjIwNFx1Yjc3ZA0KLWltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zPVx1ZDU0NFx1YzIxOCBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NzQgXHViMjA0XHViNzdkXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LiBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NDAgXHViODVjXHVhZGY4IFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWQ2NTVcdWM3NzhcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotbGlicmFyeV9lcnJvcl9ub19lY2xhc3M9Q29udGVudENhdGVnb3J5IFx1Yzc5MVx1YzEzMSBcdWM2MjRcdWI5NTg6IHswfVx1YzVkMCBcdWIzMDBcdWQ1NWMgRUNsYXNzXHViOTdjIFx1YWMwMFx1YzgzOFx1YzYyYyBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWxpYnJhcnlfbm9fcGFja2FnZT1cdWM2MjRcdWJlMGNcdWM4MWRcdWQyYjggezB9XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWMxOGNcdWM3MjAgXHVkMzI4XHVkMGE0XHVjOWMwXHViOTdjIFx1Y2MzZVx1Yzc0NCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9XHVjNjk0XHVjMThjIFx1Yzc5MVx1YzEzMSBcdWM2MjRcdWI5NTg6IHswfQ0KLWxpYnJhcnlfb2JqZWN0X3N0cmluZz1cdWM2MjRcdWJlMGNcdWM4MWRcdWQyYjggezB9LCBcdWFlMzBcdWIyYTUgezF9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzI9XHVjMThkXHVjMTMxIFx1YzEyNFx1YzgxNSBcdWM2MjRcdWI5NTg6IFx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWM3NDAgXHVjMThkXHVjMTMxIFx1YWUzMFx1YjJhNSBcdWFjMTIgezB9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlPVx1YzYyNFx1YmUwY1x1YzgxZFx1ZDJiOCB7MH0sIFx1YWUzMFx1YjJhNSB7MX0gXHViYzBmIFx1YWMxMiB7Mn1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzE4ZFx1YzEzMSBcdWMxMjRcdWM4MTUgXHVjNjI0XHViOTU4DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzM9XHVjNjI0XHViZTBjXHVjODFkXHVkMmI4IHswfSwgXHVhZTMwXHViMmE1IHsxfSBcdWJjMGYgXHVhYzEyIHsyfVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjMThkXHVjMTMxIFx1YzEyNFx1YzgxNSBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjNTRjIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPVx1YWUzMFx1YjJhNSB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1Y2MzOFx1Yzg3MCBcdWMxMjRcdWM4MTUgXHVjNjI0XHViOTU4OiBJRCB7MX1cdWM3NDQoXHViOTdjKSBcdWFjMDBcdWM5YzQgXHVjNjk0XHVjMThjXHVhYzAwIFx1YzVjNlx1Yzc0Yw0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZV8yPVx1YzYyNFx1YmUwY1x1YzgxZFx1ZDJiOCB7MH0sIFx1YWUzMFx1YjJhNSB7MX0gXHViYzBmIFx1YWMxMiB7Mn1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1Y2MzOFx1Yzg3MCBcdWMxMjRcdWM4MTUgXHVjNjI0XHViOTU4DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlN2RhYTVjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgSW1wb3J0IFhNTCBXaXphcmQNCi1pbXBvcnRYTUxXaXphcmRfdGl0bGU9SW1wb3J0YXIgWE1MDQotDQotIyBTZWxlY3QgSW1wb3J0IFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9RXNwZWNpZmljYXIgYXJxdWl2byBkZSBpbXBvcnRhXHUwMGU3XHUwMGUzbw0KLXNlbGVjdFhNTEZpbGVQYWdlX2Rlc2M9RXNwZWNpZmlxdWUgbyBhcnF1aXZvIFhNTCBxdWUgY29udFx1MDBlOW0gbyBjb250ZVx1MDBmYWRvIGRhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG8gYSBzZXIgaW1wb3J0YWRvIGUgc2VsZWNpb25lIGEgb3BlcmFcdTAwZTdcdTAwZTNvIGRlIGltcG9ydGFcdTAwZTdcdTAwZTNvIGFwcm9wcmlhZGEgYSBzZXIgZXhlY3V0YWRhLg0KLWZpbGVMYWJlbF90ZXh0PUFycXVpdm8gWE1MOg0KLWJyb3dzZUJ1dHRvbl90ZXh0PVByb2N1cmFyLi4uDQotb3B0aW9uR3JvdXBfdGV4dD1PcFx1MDBlN1x1MDBlM28gZGUgaW1wb3J0YVx1MDBlN1x1MDBlM28NCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PVN1YnN0aXR1aXIgY29udGVcdTAwZmFkbyBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvIGV4aXN0ZW50ZSBwZWxvIGNvbnRlXHUwMGZhZG8gaW1wb3J0YWRvDQotbWVyZ2VSYWRpb0J1dHRvbl90ZXh0PU1lc2NsYXIgY29udGVcdTAwZmFkbyBpbXBvcnRhZG8gbmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kbyBleGlzdGVudGUNCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotaW1wb3J0aW5nWE1MX3RleHQ9SW1wb3J0YW5kbyBvIGNvbnRlXHUwMGZhZG8gZGEgYmlibGlvdGVjYSBYTUwgbmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kbyBhdHVhbC4uLg0KLQ0KLSMgSW1wb3J0IFhNTCBFcnJvciBEaWFsb2cNCi1yZXZpZXdfbG9nX2ZpbGVzPUEgb3BlcmFcdTAwZTdcdTAwZTNvIGRlIGltcG9ydGFcdTAwZTdcdTAwZTNvIGZvaSBjb25jbHVcdTAwZWRkYS4gUmV2ZWphIG9zIGFycXVpdm9zIGRlIHJlZ2lzdHJvIG5hIFxucGFzdGEgJyd7MH0nJyBlbSBidXNjYSBkZSBxdWFscXVlciBlcnJvLg0KLWltcG9ydFhNTEVycm9yX21zZz1JVVBNMDAwMEU6IEEgb3BlcmFcdTAwZTdcdTAwZTNvIGRlIGltcG9ydGFcdTAwZTdcdTAwZTNvIG5cdTAwZTNvIHBvZGUgY29udGludWFyLg0KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IEEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kbyBhdHVhbCBcdTAwZTkgZGUgbGVpdHVyYS5cblxuQ2VydGlmaXF1ZS1zZSBkZSBxdWUgJyd7MH0nJyBzZWphIGdyYXZcdTAwZTF2ZWwgb3UgY3JpZSB1bWEgbm92YSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvIGUgdGVudGUgbm92YW1lbnRlLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkWE1MRmlsZV9lcnJvcj1PIGFycXVpdm8gWE1MIGVzcGVjaWZpY2FkbyBuXHUwMGUzbyBcdTAwZTkgdlx1MDBlMWxpZG8uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGE9SVVQTTAwMTBFOiBPIGFycXVpdm8gWE1MIGVzcGVjaWZpY2FkbyBmb2kgZXhwb3J0YWRvIHBvciB1bWEgdmVyc1x1MDBlM28gYW50ZXJpb3IgKHswfSkgZGUgezF9LiBPcyBhcnF1aXZvcyBkZXZlbSBzZXIgZXhwb3J0YWRvcyB1c2FuZG8gYSB2ZXJzXHUwMGUzbyBhdHVhbCBkbyB7MX0uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUU6IE8gYXJxdWl2byBYTUwgZXNwZWNpZmljYWRvIGZvaSBleHBvcnRhZG8gcG9yIHVtYSB2ZXJzXHUwMGUzbyBhbnRlcmlvciBkZSB7MH0uIE9zIGFycXVpdm9zIGRldmVtIHNlciBleHBvcnRhZG9zIHVzYW5kbyBhIHZlcnNcdTAwZTNvIGF0dWFsIGRvIHswfS4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBNMDAxMkU6IE8gYXJxdWl2byBYTUwgZXNwZWNpZmljYWRvIGZvaSBleHBvcnRhZG8gcG9yIHVtYSB2ZXJzXHUwMGUzbyBtYWlzIHJlY2VudGUgKHswfSkgZGUgezF9LiBWb2NcdTAwZWEgZGV2ZSBmYXplciB1cGdyYWRlIGRlIHsxfSBwYXJhIGltcG9ydGFyIG8gYXJxdWl2by4gIA0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQTTAwMTNFOiBPIGFycXVpdm8gWE1MIGVzcGVjaWZpY2FkbyBuXHUwMGUzbyBwb2RlIHNlciBhYmVydG8uIFZvY1x1MDBlYSBkZXZlIGZhemVyIHVwZ3JhZGUgZGUgezB9IHBhcmEgaW1wb3J0YXIgbyBhcnF1aXZvLiAgDQotDQotaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X25vdF9oYW5kbGVkPUVsZW1lbnRvIG5cdTAwZTNvIGlkZW50aWZpY2FkbzogezB9DQotaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQ9RWxlbWVudG8gc2VtIElEOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX2ltcG9ydF9mYWlsZWQ9RmFsaGEgYW8gaW1wb3J0YXI6IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfbWlzc2luZ19wbHVnaW49RmFsdGEgbyBwbHVnaW4gb2JyaWdhdFx1MDBmM3JpbyB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX2Vycm9yX21pc3NpbmdfcGx1Z2lucz1Fc3RcdTAwZTNvIGZhbHRhbmRvIHBsdWdpbihzKSBvYnJpZ2F0XHUwMGYzcmlvKHMpLiBWZXJpZmlxdWUgZGV0YWxoZXMgbm9zIGFycXVpdm9zIGRlIHJlZ2lzdHJvDQotDQotbGlicmFyeV9lcnJvcl9ub19lY2xhc3M9RXJybyBhbyBjcmlhciBDb250ZW50Q2F0ZWdvcnk6IGltcG9zc1x1MDBlZHZlbCBvYnRlciBFQ2xhc3MgcGFyYSB7MH0NCi1saWJyYXJ5X25vX3BhY2thZ2U9SW1wb3NzXHUwMGVkdmVsIGVuY29udHJhciBwYWNvdGUgcHJvcHJpZXRcdTAwZTFyaW8gZG8gb2JqZXRvIHswfQ0KLWxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9RXJybyBhbyBjcmlhciBlbGVtZW50bzogezB9DQotbGlicmFyeV9vYmplY3Rfc3RyaW5nPW9iamV0byB7MH0sIHJlY3Vyc28gezF9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzI9RXJybyBhbyBkZWZpbmlyIGF0cmlidXRvOiB2YWxvciBkZSByZWN1cnNvIGRlIGF0cmlidXRvIGludlx1MDBlMWxpZG8gezB9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlPUVycm8gYW8gZGVmaW5pciBhdHJpYnV0byBwYXJhIG9iamV0byB7MH0sIHJlY3Vyc28gezF9IGUgdmFsb3IgezJ9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzM9U2VtIHNhYmVyIGNvbW8gZGVmaW5pciBhdHJpYnV0byBwYXJhIG9iamV0byB7MH0sIHJlY3Vyc28gezF9IGUgdmFsb3IgezJ9DQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPUVycm8gYW8gZGVmaW5pciByZWZlclx1MDBlYW5jaWEgcGFyYSByZWN1cnNvIHswfTogbmVuaHVtIGVsZW1lbnRvIGNvbSBvIGlkIHsxfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZV8yPUVycm8gYW8gZGVmaW5pciByZWZlclx1MDBlYW5jaWEgcGFyYSBvYmpldG8gezB9LCByZWN1cnNvIHsxfSBlIHZhbG9yIHsyfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGQxNmZlOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOg0KLSMNCi0NCi0jIEltcG9ydCBYTUwgV2l6YXJkDQotaW1wb3J0WE1MV2l6YXJkX3RpdGxlPVx1NWJmY1x1NTE2NSBYTUwNCi0NCi0jIFNlbGVjdCBJbXBvcnQgWE1MIEZpbGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1cdTYzMDdcdTViOWFcdTViZmNcdTUxNjVcdTY1ODdcdTRlZjYNCi1zZWxlY3RYTUxGaWxlUGFnZV9kZXNjPVx1OGJmN1x1NjMwN1x1NWI5YVx1NTMwNVx1NTQyYlx1ODk4MVx1NWJmY1x1NTE2NVx1NzY4NFx1NjViOVx1NmNkNVx1NWU5M1x1NzY4NCBYTUwgXHU2NTg3XHU0ZWY2XHVmZjBjXHU1ZTc2XHU5MDA5XHU2MmU5XHU4OTgxXHU2MjY3XHU4ODRjXHU3Njg0XHU3NmY4XHU1ZTk0XHU1YmZjXHU1MTY1XHU2NGNkXHU0ZjVjXHUzMDAyDQotZmlsZUxhYmVsX3RleHQ9WE1MIFx1NjU4N1x1NGVmNlx1ZmYxYQ0KLWJyb3dzZUJ1dHRvbl90ZXh0PVx1NmQ0Zlx1ODljOC4uLg0KLW9wdGlvbkdyb3VwX3RleHQ9XHU1YmZjXHU1MTY1XHU5MDA5XHU5ODc5DQotb3ZlcndyaXRlUmFkaW9CdXR0b25fdGV4dD1cdTc1MjhcdTViZmNcdTUxNjVcdTc2ODRcdTUxODVcdTViYjlcdTg5ODZcdTc2ZDZcdTczYjBcdTY3MDlcdTc2ODRcdTY1YjlcdTZjZDVcdTVlOTNcdTUxODVcdTViYjkNCi1tZXJnZVJhZGlvQnV0dG9uX3RleHQ9XHU1YzA2XHU1YmZjXHU1MTY1XHU3Njg0XHU1MTg1XHU1YmI5XHU1NDA4XHU1ZTc2XHU1MjMwXHU3M2IwXHU2NzA5XHU3Njg0XHU2NWI5XHU2Y2Q1XHU1ZTkzXHU0ZTJkDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWltcG9ydGluZ1hNTF90ZXh0PVx1NmI2M1x1NTcyOFx1NWMwNiBYTUwgXHU1ZTkzXHU1MTg1XHU1YmI5XHU1YmZjXHU1MTY1XHU1MjMwXHU1ZjUzXHU1MjRkXHU2NWI5XHU2Y2Q1XHU1ZTkzXHU0ZTJkLi4uDQotDQotIyBJbXBvcnQgWE1MIEVycm9yIERpYWxvZw0KLXJldmlld19sb2dfZmlsZXM9XHU1YmZjXHU1MTY1XHU2NGNkXHU0ZjVjXHU1ZGYyXHU1YjhjXHU2MjEwXHUzMDAyXHU4YmY3XHU2N2U1XHU3NzBiIHswfSBcdTY1ODdcdTRlZjZcdTU5MzlcdTRlMmRcdTc2ODRcblx1NjVlNVx1NWZkN1x1NjU4N1x1NGVmNlx1ZmYwY1x1NGVlNVx1Nzg2ZVx1OGJhNFx1NjYyZlx1NTQyNlx1NWI1OFx1NTcyOFx1OTUxOVx1OGJlZlx1MzAwMg0KLWltcG9ydFhNTEVycm9yX21zZz1JVVBNMDAwMEU6IFx1NWJmY1x1NTE2NVx1NjRjZFx1NGY1Y1x1NjVlMFx1NmNkNVx1N2VlN1x1N2VlZFx1MzAwMg0KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IFx1NWY1M1x1NTI0ZFx1NjViOVx1NmNkNVx1NWU5M1x1NGUzYVx1NTNlYVx1OGJmYlx1MzAwMlxuXG5cdThiZjdcdTc4NmVcdTRmZGRcdTIwMWN7MH1cdTIwMWRcdTRlM2FcdTUzZWZcdThiZmJcdWZmMGNcdTYyMTZcdTUyMWJcdTVlZmFcdTY1YjBcdTY1YjlcdTZjZDVcdTVlOTNcdTVlNzZcdTkxY2RcdThiZDVcdTMwMDINCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9XHU2MzA3XHU1YjlhXHU3Njg0IFhNTCBcdTY1ODdcdTRlZjZcdTY1ZTBcdTY1NDhcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBNMDAxMEU6IFx1NjMwN1x1NWI5YVx1NzY4NCBYTUwgXHU2NTg3XHU0ZWY2XHU2NjJmXHU3NTMxIHsxfSBcdTc2ODRcdTUxNDhcdTUyNGRcdTcyNDhcdTY3MmMgezB9IFx1NWJmY1x1NTFmYVx1NzY4NFx1MzAwMlx1NWZjNVx1OTg3Ylx1NGY3Zlx1NzUyOCB7MX0gXHU3Njg0XHU1ZjUzXHU1MjRkXHU3MjQ4XHU2NzJjXHU1YmZjXHU1MWZhXHU4ZmQ5XHU0ZTliXHU2NTg3XHU0ZWY2XHUzMDAyDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUU6IFx1NjMwN1x1NWI5YVx1NzY4NCBYTUwgXHU2NTg3XHU0ZWY2XHU2NjJmXHU3NTMxIHswfSBcdTc2ODRcdTUxNDhcdTUyNGRcdTcyNDhcdTY3MmNcdTViZmNcdTUxZmFcdTc2ODRcdTMwMDJcdTVmYzVcdTk4N2JcdTRmN2ZcdTc1MjggezB9IFx1NzY4NFx1NWY1M1x1NTI0ZFx1NzI0OFx1NjcyY1x1NWJmY1x1NTFmYVx1OGZkOVx1NGU5Ylx1NjU4N1x1NGVmNlx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUE0wMDEyRTogXHU2MzA3XHU1YjlhXHU3Njg0IFhNTCBcdTY1ODdcdTRlZjZcdTY2MmZcdTc1MzEgezF9IFx1NzY4NFx1NjZmNFx1NjViMFx1NzI0OFx1NjcyYyB7MH0gXHU1YmZjXHU1MWZhXHU3Njg0XHUzMDAyXHU2MGE4XHU1ZmM1XHU5ODdiXHU1MzQ3XHU3ZWE3IHsxfSBcdTYyNGRcdTgwZmRcdTViZmNcdTUxNjVcdThmZDlcdTRlOWJcdTY1ODdcdTRlZjZcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUE0wMDEzRVx1ZmYxYVx1NjVlMFx1NmNkNVx1NjI1M1x1NWYwMFx1NjMwN1x1NWI5YVx1NzY4NCBYTUwgXHU2NTg3XHU0ZWY2XHUzMDAyXHU2MGE4XHU1ZmM1XHU5ODdiXHU1MzQ3XHU3ZWE3IHswfSBcdTYyNGRcdTgwZmRcdTViZmNcdTUxNjVcdThiZTVcdTY1ODdcdTRlZjZcdTMwMDINCi0NCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQ9XHU1MTQzXHU3ZDIwXHU2NzJhXHU1OTA0XHU3NDA2XHVmZjFhezB9DQotaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQ9XHU2NWUwXHU2ODA3XHU4YmM2XHU3Njg0XHU1MTQzXHU3ZDIwXHVmZjFhezB9DQotaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkPVx1NWJmY1x1NTE2NVx1NTkzMVx1OGQyNVx1ZmYxYXswfQ0KLWltcG9ydFhNTFNlcnZpY2VfbWlzc2luZ19wbHVnaW49XHU3ZjNhXHU1YzExXHU1ZmM1XHU5NzAwXHU3Njg0XHU2M2QyXHU0ZWY2IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zPVx1N2YzYVx1NWMxMVx1NWZjNVx1OTcwMFx1NzY4NFx1NjNkMlx1NGVmNlx1MzAwMlx1OGJmN1x1NjdlNVx1OTYwNVx1NjVlNVx1NWZkN1x1NjU4N1x1NGVmNlx1ZmYwY1x1NGVlNVx1NGU4Nlx1ODllM1x1OGJlNlx1N2VjNlx1NmQ4OFx1NjA2Zg0KLQ0KLWxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzPVx1NTIxYlx1NWVmYVx1NTE4NVx1NWJiOVx1N2M3Ylx1NTIyYlx1NjVmNlx1NTFmYVx1OTUxOVx1ZmYxYVx1NjVlMFx1NmNkNVx1ODNiN1x1NWY5NyB7MH0gXHU3Njg0IEVDbGFzc1x1MzAwMg0KLWxpYnJhcnlfbm9fcGFja2FnZT1cdTY1ZTBcdTZjZDVcdTYyN2VcdTUyMzBcdTViZjlcdThjNjEgezB9IFx1NjI0MFx1NWM1ZVx1NzY4NFx1NjU3MFx1NjM2ZVx1NTMwNVx1MzAwMg0KLWxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9XHU1MjFiXHU1ZWZhXHU1MTQzXHU3ZDIwXHU2NWY2XHU1MWZhXHU5NTE5XHVmZjFhezB9DQotbGlicmFyeV9vYmplY3Rfc3RyaW5nPVx1NWJmOVx1OGM2MSB7MH1cdWZmMGNcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjYgezF9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzI9XHU4YmJlXHU3ZjZlXHU1YzVlXHU2MDI3XHU2NWY2XHU1MWZhXHU5NTE5XHVmZjFhXHU2NWUwXHU2NTQ4XHU3Njg0XHU1YzVlXHU2MDI3XHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2XHU1MDNjIHswfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZT1cdThiYmVcdTdmNmVcdTViZjlcdThjNjEgezB9XHUzMDAxXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2IHsxfSBcdTU0OGNcdTUwM2MgezJ9IFx1NzY4NFx1NWM1ZVx1NjAyN1x1NjVmNlx1NTFmYVx1OTUxOVx1MzAwMg0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8zPVx1NGUwZFx1NzdlNVx1OTA1M1x1NTk4Mlx1NGY1NVx1OGJiZVx1N2Y2ZVx1NWJmOVx1OGM2MSB7MH1cdTMwMDFcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjYgezF9IFx1NTQ4Y1x1NTAzYyB7Mn0gXHU3Njg0XHU1YzVlXHU2MDI3XHUzMDAyDQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPVx1OGJiZVx1N2Y2ZVx1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNiB7MH0gXHU3Njg0XHU1ZjE1XHU3NTI4XHU2NWY2XHU1MWZhXHU5NTE5XHVmZjFhXHU0ZTBkXHU1YjU4XHU1NzI4XHU1ZTI2XHU2NzA5XHU2ODA3XHU4YmM2IHsxfSBcdTc2ODRcdTUxNDNcdTdkMjANCi1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMj1cdThiYmVcdTdmNmVcdTViZjlcdThjNjEgezB9XHUzMDAxXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2IHsxfSBcdTU0OGNcdTUwM2MgezJ9IFx1NzY4NFx1NWYxNVx1NzUyOFx1NjVmNlx1NTFmYVx1OTUxOVx1MzAwMg0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDA5NGI2Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOg0KLSMNCi0NCi0jIEltcG9ydCBYTUwgV2l6YXJkDQotaW1wb3J0WE1MV2l6YXJkX3RpdGxlPVx1NTMyZlx1NTE2NSBYTUwNCi0NCi0jIFNlbGVjdCBJbXBvcnQgWE1MIEZpbGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1cdTYzMDdcdTViOWFcdTUzMmZcdTUxNjVcdTZhOTQNCi1zZWxlY3RYTUxGaWxlUGFnZV9kZXNjPVx1NjMwN1x1NWI5YSBYTUwgXHU2YTk0XHVmZjBjXHU1MTY3XHU1NDJiXHU4OTgxXHU1MzJmXHU1MTY1XHU3Njg0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1MTY3XHU1YmI5XHVmZjBjXHU0ZTI2XHU5MDc4XHU1M2Q2XHU5MDY5XHU3NTc2XHU3Njg0XHU1MzJmXHU1MTY1XHU0ZjVjXHU2OTZkXHU0Zjg2XHU1N2Y3XHU4ODRjXHUzMDAyDQotZmlsZUxhYmVsX3RleHQ9WE1MIFx1NmE5NFx1ZmYxYQ0KLWJyb3dzZUJ1dHRvbl90ZXh0PVx1NzAwZlx1ODliZC4uLg0KLW9wdGlvbkdyb3VwX3RleHQ9XHU1MzJmXHU1MTY1XHU5MDc4XHU5ODA1DQotb3ZlcndyaXRlUmFkaW9CdXR0b25fdGV4dD1cdTRlZTVcdTUzMmZcdTUxNjVcdTc2ODRcdTUxNjdcdTViYjlcdTRmODZcdTdmNmVcdTYzZGJcdTczZmVcdTY3MDlcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTUxNjdcdTViYjkNCi1tZXJnZVJhZGlvQnV0dG9uX3RleHQ9XHU1YzA3XHU1MzJmXHU1MTY1XHU3Njg0XHU1MTY3XHU1YmI5XHU1NDA4XHU0Zjc1XHU4MWYzXHU3M2ZlXHU2NzA5XHU3Njg0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWltcG9ydGluZ1hNTF90ZXh0PVx1NmI2M1x1NTcyOFx1NWMwNyBYTUwgXHU3YTBiXHU1ZjBmXHU1ZWFiXHU1MTY3XHU1YmI5XHU1MzJmXHU1MTY1XHU3M2ZlXHU4ODRjXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiLi4uDQotDQotIyBJbXBvcnQgWE1MIEVycm9yIERpYWxvZw0KLXJldmlld19sb2dfZmlsZXM9XHU1MzJmXHU1MTY1XHU0ZjVjXHU2OTZkXHU1ZGYyXHU1YjhjXHU2MjEwXHUzMDAyXHU4YWNiXHU2N2U1XHU5NWIxXG4nJ3swfScnIFx1OGNjN1x1NjU5OVx1NTkzZVx1NGUyZFx1NzY4NFx1NjVlNVx1OGE4Y1x1NmE5NFx1NjYyZlx1NTQyNlx1NjcwOVx1NGVmYlx1NGY1NVx1OTMyZlx1OGFhNFx1MzAwMg0KLWltcG9ydFhNTEVycm9yX21zZz1JVVBNMDAwMEU6IFx1NzEyMVx1NmNkNVx1N2U3Y1x1N2U4Y1x1NTMyZlx1NTE2NVx1NGY1Y1x1Njk2ZFx1MzAwMg0KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IFx1NzNmZVx1ODg0Y1x1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NjYyZlx1NTUyZlx1OGI4MFx1NzY4NFx1MzAwMlxuXG5cdThhY2JcdTc4YmFcdTViOWFcdTUzZWZcdTViZWJcdTUxNjUgJyd7MH0nJ1x1ZmYwY1x1NjIxNlx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkWE1MRmlsZV9lcnJvcj1cdTYzMDdcdTViOWFcdTc2ODQgWE1MIFx1NmE5NFx1NzEyMVx1NjU0OFx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUE0wMDEwRTogXHU2MzA3XHU1YjlhXHU3Njg0IFhNTCBcdTZhOTRcdTY2MmZcdTVmOWVcdTgyMGFcdTcyNDggKHswfSkgXHU3Njg0IHsxfSBcdTUzMmZcdTUxZmFcdTMwMDJcdTZhOTRcdTY4NDhcdTVmYzVcdTk4MDhcdTRlZTUgezF9IFx1NzNmZVx1ODg0Y1x1NzI0OFx1NjcyY1x1NTMyZlx1NTFmYVx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQTTAwMTFFOiBcdTYzMDdcdTViOWFcdTc2ODQgWE1MIFx1NmE5NFx1NjYyZlx1NWY5ZVx1ODIwYVx1NzI0OFx1NzY4NCB7MH0gXHU1MzJmXHU1MWZhXHUzMDAyXHU2YTk0XHU2ODQ4XHU1ZmM1XHU5ODA4XHU0ZWU1IHswfSBcdTczZmVcdTg4NGNcdTcyNDhcdTY3MmNcdTUzMmZcdTUxZmFcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBNMDAxMkU6IFx1NjMwN1x1NWI5YVx1NzY4NCBYTUwgXHU2YTk0XHU2NjJmXHU1ZjllXHU4ZjAzXHU2NWIwXHU3MjQ4ICh7MH0pIFx1NzY4NCB7MX0gXHU1MzJmXHU1MWZhXHUzMDAyXHU2MGE4XHU1ZmM1XHU5ODA4XHU1MzQ3XHU3ZDFhIHsxfSBcdTYyNGRcdTgwZmRcdTUzMmZcdTUxNjVcdTZhOTRcdTY4NDhcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUE0wMDEzRTogXHU3MTIxXHU2Y2Q1XHU5NThiXHU1NTVmXHU2MzA3XHU1YjlhXHU3Njg0IFhNTCBcdTZhOTRcdTY4NDhcdTMwMDJcdTYwYThcdTVmYzVcdTk4MDhcdTUzNDdcdTdkMWEgezB9IFx1NjI0ZFx1ODBmZFx1NTMyZlx1NTE2NVx1NmE5NFx1Njg0OFx1MzAwMg0KLQ0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZD1cdTY3MmFcdTg2NTVcdTc0MDZcdTc2ODRcdTUxNDNcdTdkMjBcdWZmMWF7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfd2l0aG91dF9pZD1cdTcxMjEgSUQgXHU3Njg0XHU1MTQzXHU3ZDIwXHVmZjFhezB9DQotaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkPVx1NTMyZlx1NTE2NVx1NTkzMVx1NjU1N1x1ZmYxYXswfQ0KLWltcG9ydFhNTFNlcnZpY2VfbWlzc2luZ19wbHVnaW49XHU5MDdhXHU2ZjBmXHU1ZmM1XHU4OTgxXHU3Njg0XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmIHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zPVx1OTA3YVx1NmYwZlx1NWZjNVx1ODk4MVx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1MzAwMlx1NTk4Mlx1OTcwMFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1ZmYwY1x1OGFjYlx1NTNjM1x1OTViMVx1NjVlNVx1OGE4Y1x1NmE5NA0KLQ0KLWxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzPVx1NWVmYVx1N2FjYiBDb250ZW50Q2F0ZWdvcnkgXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHVmZjFhXHU3MTIxXHU2Y2Q1XHU1M2Q2XHU1Zjk3IHswfSBcdTc2ODQgRUNsYXNzDQotbGlicmFyeV9ub19wYWNrYWdlPVx1NjI3ZVx1NGUwZFx1NTIzMFx1NzI2OVx1NGVmNiB7MH0gXHU3Njg0XHU0ZTNiXHU2M2E3XHU1OTU3XHU0ZWY2DQotbGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudD1cdTVlZmFcdTdhY2JcdTUxNDNcdTdkMjBcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdWZmMWF7MH0NCi1saWJyYXJ5X29iamVjdF9zdHJpbmc9XHU3MjY5XHU0ZWY2IHswfVx1ZmYwY1x1NzI3OVx1NjAyNyB7MX0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMj1cdThhMmRcdTViOWFcdTVjNmNcdTYwMjdcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdWZmMWFcdTVjNmNcdTYwMjdcdTcyNzlcdTYwMjdcdTUwM2MgezB9IFx1NzEyMVx1NjU0OA0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZT1cdThhMmRcdTViOWFcdTVjNmNcdTYwMjdcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdWZmMWFcdTcyNjlcdTRlZjYgezB9XHVmZjBjXHU3Mjc5XHU2MDI3IHsxfVx1ZmYwY1x1NTAzYyB7Mn0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMz1cdTRlMGRcdTc3ZTVcdTU5ODJcdTRmNTVcdThhMmRcdTViOWFcdTVjNmNcdTYwMjdcdWZmMWFcdTcyNjlcdTRlZjYgezB9XHVmZjBjXHU3Mjc5XHU2MDI3IHsxfVx1ZmYwY1x1NTAzYyB7Mn0NCi1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9XHU4YTJkXHU1YjlhXHU3Mjc5XHU2MDI3IHswfSBcdTc2ODRcdTUzYzNcdTcxNjdcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdWZmMWFcdTYyN2VcdTRlMGRcdTUyMzAgSUQgezF9IFx1NzY4NFx1NTE0M1x1N2QyMA0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZV8yPVx1OGEyZFx1NWI5YVx1NTNjM1x1NzE2N1x1NjY0Mlx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNFx1ZmYxYVx1NzI2OVx1NGVmNiB7MH1cdWZmMGNcdTcyNzlcdTYwMjcgezF9XHVmZjBjXHU1MDNjIHsyfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMi8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNjRiMDZkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYjBkNTkwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgWE1MIEltcG9ydCAoTkwyKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NGZjYTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcnUucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmN2YzMjIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgWE1MDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgWE1MIFdpemFyZA0KLWltcG9ydFhNTFdpemFyZE5hbWU9WE1MDQotaW1wb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249XHUwNDE4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzOFx1MDQzNyBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzIgWE1MLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjllYzljZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOg0KLSMNCi0NCi0jIEltcG9ydCBYTUwgV2l6YXJkDQotaW1wb3J0WE1MV2l6YXJkX3RpdGxlPVx1MDQxOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBYTUwNCi0NCi0jIFNlbGVjdCBJbXBvcnQgWE1MIEZpbGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzANCi1zZWxlY3RYTUxGaWxlUGFnZV9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgWE1MIFx1MDQ0MSBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0MzBcdTA0M2NcdTA0MzggXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwIFx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDNlXHUwNDNlXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzAuDQotZmlsZUxhYmVsX3RleHQ9XHUwNDI0XHUwNDMwXHUwNDM5XHUwNDNiIFhNTDoNCi1icm93c2VCdXR0b25fdGV4dD1cdTA0MWVcdTA0MzFcdTA0MzdcdTA0M2VcdTA0NDAuLi4NCi1vcHRpb25Hcm91cF90ZXh0PVx1MDQxZVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzANCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PVx1MDQxN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDNjXHUwNDM4IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzMFx1MDQzY1x1MDQzOA0KLW1lcmdlUmFkaW9CdXR0b25fdGV4dD1cdTA0MWVcdTA0MzFcdTA0NGFcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0YiBcdTA0NDEgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzOSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotaW1wb3J0aW5nWE1MX3RleHQ9XHUwNDE4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggWE1MIFx1MDQzMiBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDNcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4uLg0KLQ0KLSMgSW1wb3J0IFhNTCBFcnJvciBEaWFsb2cNCi1yZXZpZXdfbG9nX2ZpbGVzPVx1MDQxOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2QuIFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDMwIFx1MDQzMiBcblx1MDQzZlx1MDQzMFx1MDQzZlx1MDQzYVx1MDQzNSAnJ3swfScnIFx1MDQzZFx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M2NcdTA0MzVcdTA0NDIgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNlXHUwNDNhLg0KLWltcG9ydFhNTEVycm9yX21zZz1JVVBNMDAwMEU6IFx1MDQxZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyLg0KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IFx1MDQxMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDMwIFx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDQ3XHUwNDQyXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLlxuXG5cdTA0MjNcdTA0MzFcdTA0MzVcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0NDFcdTA0NGMsIFx1MDQ0N1x1MDQ0Mlx1MDQzZSBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDRjIFx1MDQzMiAnJ3swfScnLCBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQ0M1x1MDQ0ZSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDRiXHUwNDQyXHUwNDNhXHUwNDQzLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkWE1MRmlsZV9lcnJvcj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDNkXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDM5IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBYTUwuDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGE9SVVQTTAwMTBFOiBcdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFhNTCBcdTA0MzFcdTA0NGJcdTA0M2IgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkIFx1MDQzMiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NGJcdTA0MzRcdTA0NDNcdTA0NDlcdTA0MzVcdTA0MzkgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4ICh7MH0pIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMCB7MX0uIFx1MDQxZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzY1x1MDQzZSBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQ0MSBcdTA0M2ZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0NDlcdTA0NGNcdTA0NGUgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCB7MX0uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUU6IFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgWE1MIFx1MDQzMVx1MDQ0Ylx1MDQzYiBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2QgXHUwNDMyIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0Ylx1MDQzNFx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzOSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggezB9LiBcdTA0MWRcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2NcdTA0M2UgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0YiBcdTA0NDEgXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDQ5XHUwNDRjXHUwNDRlIFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzOSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggezB9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUE0wMDEyRTogXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBYTUwgXHUwNDMxXHUwNDRiXHUwNDNiIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZCBcdTA0MzIgXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM5IFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCAoezB9KSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAgezF9LiBcdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0MzAgXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNjXHUwNDNlIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyB7MX0uIA0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQTTAwMTNFOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFhNTC4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMCBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDMwIFx1MDQzZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzY1x1MDQzZSBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgezB9LiANCi0NCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQ9XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzZFx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0M2Q6IHswfS4NCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfd2l0aG91dF9pZD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDMxXHUwNDM1XHUwNDM3IFx1MDQxOFx1MDQxNDogezB9DQotaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkPVx1MDQxOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0M2RcdTA0MzUgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luPVx1MDQxZVx1MDQ0Mlx1MDQ0MVx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0M2VcdTA0MzFcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zPVx1MDQxZVx1MDQ0Mlx1MDQ0MVx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0ZVx1MDQ0MiBcdTA0M2VcdTA0MzFcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4LiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzMiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDJcdTA0M2VcdTA0M2FcdTA0M2VcdTA0M2JcdTA0MzUuDQotDQotbGlicmFyeV9lcnJvcl9ub19lY2xhc3M9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggQ29udGVudENhdGVnb3J5OiBcdTA0M2RcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0M1x1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0YyBFQ2xhc3MgXHUwNDM0XHUwNDNiXHUwNDRmIHswfQ0KLWxpYnJhcnlfbm9fcGFja2FnZT1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzZFx1MDQzMFx1MDQzOVx1MDQ0Mlx1MDQzOCBcdTA0MzJcdTA0M2JcdTA0MzBcdTA0MzRcdTA0MzVcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzkgXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDJcdTA0MzAgezB9DQotbGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudD1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzA6IHswfQ0KLWxpYnJhcnlfb2JqZWN0X3N0cmluZz1cdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDIgezB9LCBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2JcdTA0MzVcdTA0M2FcdTA0NDIgezF9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzI9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDMwXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDMxXHUwNDQzXHUwNDQyXHUwNDMwOiBcdTA0M2RcdTA0MzVcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0MzBcdTA0NDJcdTA0NDBcdTA0MzhcdTA0MzFcdTA0NDNcdTA0NDJcdTA0MzAgezB9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM4IFx1MDQzMFx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQzMVx1MDQ0M1x1MDQ0Mlx1MDQzMDogXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyIHswfSwgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDRjIHsxfSwgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IHsyfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8zPVx1MDQxZFx1MDQzNSBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0M2QgXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNlXHUwNDMxIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzBcdTA0NDJcdTA0NDBcdTA0MzhcdTA0MzFcdTA0NDNcdTA0NDJcdTA0MzA6IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0MiB7MH0sIFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0YyB7MX0sIFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSB7Mn0NCi1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzZFx1MDQzMCBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NGMgezB9OiBcdTA0M2RcdTA0MzVcdTA0NDIgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwIFx1MDQ0MSBcdTA0MThcdTA0MTQgezF9DQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlXzI9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4OiBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDIgezB9LCBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NGMgezF9LCBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgezJ9DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzJhODA4MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRkOWNlZDEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgWE1MIEltcG9ydCAoTkwyYSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYTQzZGNkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIHBsdWdpbiB0aWwgaW1wb3J0IGFmIFhNTA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgSW1wb3J0IFhNTCBXaXphcmQNCi1pbXBvcnRYTUxXaXphcmROYW1lPVhNTA0KLWltcG9ydFhNTFdpemFyZERlc2NyaXB0aW9uPUltcG9ydFx1MDBlOXIgbWV0b2RlYmlibGlvdGVrc2luZGhvbGQgaSBlbiBYTUwtZmlsLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZTY5YWNhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOg0KLSMNCi0NCi0jIEltcG9ydCBYTUwgV2l6YXJkDQotaW1wb3J0WE1MV2l6YXJkX3RpdGxlPUltcG9ydFx1MDBlOXIgWE1MDQotDQotIyBTZWxlY3QgSW1wb3J0IFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9QW5naXYgaW1wb3J0ZmlsDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1BbmdpdiBkZW4gWE1MLWZpbCwgc29tIGluZGVob2xkZXIgZGV0IG1ldG9kZWJpYmxpb3Rla3NpbmRob2xkLCBkdSB2aWwgaW1wb3J0ZXJlLCBvZyB2XHUwMGU2bGcgZGVuIHJlbGV2YW50ZSBpbXBvcnRmdW5rdGlvbiwgZGVyIHNrYWwgdWRmXHUwMGY4cmVzLg0KLWZpbGVMYWJlbF90ZXh0PVhNTC1maWw6DQotYnJvd3NlQnV0dG9uX3RleHQ9R2VubmVtc2UuLi4NCi1vcHRpb25Hcm91cF90ZXh0PUltcG9ydHZhbGcNCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PVRpbHNpZGVzXHUwMGU2dCBla3Npc3RlcmVuZGUgbWV0b2RlYmlibGlvdGVrc2luZGhvbGQgbWVkIGltcG9ydGVyZXQgaW5kaG9sZA0KLW1lcmdlUmFkaW9CdXR0b25fdGV4dD1GbGV0IGltcG9ydGVyZXQgaW5kaG9sZCBpbmQgaSBla3Npc3RlcmVuZGUgbWV0b2RlYmlibGlvdGVrDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWltcG9ydGluZ1hNTF90ZXh0PUltcG9ydGVyZXIgWE1MLWJpYmxpb3Rla3NpbmRob2xkIHRpbCBkZXQgYWt0dWVsbGUgbWV0b2RlYmlibGlvdGVrLi4uDQotDQotIyBJbXBvcnQgWE1MIEVycm9yIERpYWxvZw0KLXJldmlld19sb2dfZmlsZXM9SW1wb3J0ZW4gZXIgdWRmXHUwMGY4cnQuIEdlbm5lbXNlIGxvZ2ZpbGVybmUgaSBcbmZvbGRlcmVuICcnezB9JycgZm9yIGF0IGZpbmRlIGV2ZW50dWVsbGUgZmVqbC4NCi1pbXBvcnRYTUxFcnJvcl9tc2c9SVVQTTAwMDBFOiBJbXBvcnRlbiBrYW4gaWtrZSBmb3J0c1x1MDBlNnR0ZS4NCi1pbXBvcnRYTUxFcnJvcl9yZWFzb249SVVQTTAwMDlFOiBEZXQgYWt0dWVsbGUgbWV0b2RlYmlibGlvdGVrIGVyIHNrcml2ZWJlc2t5dHRldC5cblxuS29udHJvbGxcdTAwZTlyLCBhdCAnJ3swfScnIGthbiByZWRpZ2VyZXMsIGVsbGVyIG9wcmV0IGV0IG55dCBtZXRvZGViaWJsaW90ZWssIG9nIHByXHUwMGY4diBpZ2VuLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkWE1MRmlsZV9lcnJvcj1EZW4gYW5naXZuZSBYTUwtZmlsIGVyIGlra2UgZ3lsZGlnLg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUE0wMDEwRTogRGVuIGFuZ2l2bmUgWE1MLWZpbCBlciBla3Nwb3J0ZXJldCBtZWQgZW4gdGlkbGlnZXJlIHZlcnNpb24gKHswfSkgYWYgezF9LiBGaWxlcm5lIHNrYWwgZWtzcG9ydGVyZXMgbWVkIGRlbiBha3R1ZWxsZSB2ZXJzaW9uIGFmIHsxfS4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duPUlVUE0wMDExRTogRGVuIGFuZ2l2bmUgWE1MLWZpbCBlciBla3Nwb3J0ZXJldCBtZWQgZW4gdGlkbGlnZXJlIHZlcnNpb24gYWYgezB9LiBGaWxlcm5lIHNrYWwgZWtzcG9ydGVyZXMgbWVkIGRlbiBha3R1ZWxsZSB2ZXJzaW9uIGFmIHswfS4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBNMDAxMkU6IERlbiBhbmdpdm5lIFhNTC1maWwgZXIgZWtzcG9ydGVyZXQgbWVkIGVuIG55ZXJlIHZlcnNpb24gKHswfSkgYWYgezF9LiBEdSBza2FsIG9wZ3JhZGVyZSB7MX0gZm9yIGF0IGt1bm5lIGltcG9ydGVyZSBmaWxlbi4gDQotdmVyc2lvbk1pc21hdGNoX29sZFRvb2xfdW5rbm93bj1JVVBNMDAxM0U6IERlbiBhbmdpdm5lIFhNTC1maWwga2FuIGlra2UgXHUwMGU1Ym5lcy4gRHUgc2thbCBvcGdyYWRlcmUgezB9IGZvciBhdCBrdW5uZSBpbXBvcnRlcmUgZmlsZW4uIA0KLQ0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZD1FbGVtZW50IGlra2UgaFx1MDBlNW5kdGVyZXQ6IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF93aXRob3V0X2lkPUVsZW1lbnQgdWRlbiBpZDogezB9DQotaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkPUltcG9ydCBlciBpa2tlIHVkZlx1MDBmOHJ0OiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luPU1hbmdsZXIgcFx1MDBlNWtyXHUwMGU2dmV0IHBsdWdpbjogezB9DQotaW1wb3J0WE1MU2VydmljZV9lcnJvcl9taXNzaW5nX3BsdWdpbnM9TWFuZ2xlciBlbiBlbGxlciBmbGVyZSBwXHUwMGU1a3JcdTAwZTZ2ZWRlIHBsdWdpbnMuIERlciBlciBmbGVyZSBvcGx5c25pbmdlciBpIGxvZ2ZpbGVuLg0KLQ0KLWxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzPUZlamwgdW5kZXIgb3ByZXR0ZWxzZSBhZiBpbmRob2xkc2thdGVnb3JpLiBLYW4gaWtrZSBoZW50ZSBFQ2xhc3MgZm9yIHswfQ0KLWxpYnJhcnlfbm9fcGFja2FnZT1LYW4gaWtrZSBmaW5kZSBlamVycGFra2UgZm9yIG9iamVrdGV0IHswfQ0KLWxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9RmVqbCB1bmRlciBvcHJldHRlbHNlIGFmIGVsZW1lbnQ6IHswfQ0KLWxpYnJhcnlfb2JqZWN0X3N0cmluZz1vYmpla3QgezB9LCBmdW5rdGlvbiB7MX0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMj1GZWpsIHVuZGVyIGFuZ2l2ZWxzZSBhZiBhdHRyaWJ1dDogVWd5bGRpZyBhdHRyaWJ1dGZ1bmt0aW9uc3ZcdTAwZTZyZGk6IHswfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZT1GZWpsIHVuZGVyIGFuZ2l2ZWxzZSBhZiBhdHRyaWJ1dCBmb3Igb2JqZWt0IHswfSwgZnVua3Rpb24gezF9IG9nIHZcdTAwZTZyZGkgezJ9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzM9VmVkIGlra2UsIGh2b3JkYW4gYXR0cmlidXQgZm9yIG9iamVrdCB7MH0sIGZ1bmt0aW9uIHsxfSBvZyB2XHUwMGU2cmRpIHsyfSBza2FsIGFuZ2l2ZXMNCi1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9RmVqbCB1bmRlciBhbmdpdmVsc2UgYWYgcmVmZXJlbmNlIGZvciBmdW5rdGlvbiB7MH06IEluZ2VuIGVsZW1lbnQgbWVkIGlkJydlbiB7MX0NCi1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMj1GZWpsIHVuZGVyIGFuZ2l2ZWxzZSBhZiByZWZlcmVuY2UgZm9yIG9iamVrdCB7MH0sIGZ1bmt0aW9uIHsxfSBvZyB2XHUwMGU2cmRpIHsyfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTk5ZTE5Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzI0ZmNiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBMaWJyYXJ5IEVkaXQgKE5MMSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlN2IwMTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9pdC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdkYTkzMWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gQmlibGlvdGhlayBiZWFyYmVpdGVuDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotX1VJX0NvbnRlbnRfZ3JvdXA9TWV0aG9kZW5pbmhhbHQNCi0NCi1fVUlfRGlzY2lwbGluZXNfZ3JvdXA9RGlzemlwbGluZW4NCi1fVUlfRG9tYWluc19ncm91cD1Eb21cdTAwZTRuZW4NCi1fVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cD1BcnRlbiB2b24gQXJiZWl0c2VyZ2Vibmlzc2VuDQotX1VJX1JvbGVfU2V0c19ncm91cD1Sb2xsZW5ncnVwcGVuDQotX1VJX1Rvb2xzX2dyb3VwPVRvb2xzDQotX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXA9U3RhbmRhcmRrYXRlZ29yaWVuDQotX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwPUFuZ2VwYXNzdGUgS2F0ZWdvcmllbg0KLV9VSV9NZXRob2RDb250ZW50X2dyb3VwPUluaGFsdHNwYWtldGUNCi0NCi1fVUlfUHJvY2Vzc2VzX2dyb3VwPVByb3plc3NlDQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPVBsYW51bmdzdm9ybGFnZW4NCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5zX3RleHQ9UHJvemVzc211c3Rlcg0KLV9VSV9EZWxpdmVyeVByb2Nlc3Nlc190ZXh0PUJlcmVpdHN0ZWxsdW5nc3Byb3plc3NlDQotX1VJX1Byb2Nlc3NDb250cmlidXRpb25zX3RleHQ9VW50ZXJzY2hpZWRsaWNoZSBQcm96ZXNzZQ0KLV9VSV9QbGFubmluZ1RlbXBsYXRlc190ZXh0PVBsYW51bmdzdm9ybGFnZW4NCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1Qcm96ZXNzbXVzdGVyDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PUJlcmVpdHN0ZWxsdW5nc3Byb3plc3MNCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PVVudGVyc2NoaWVkbGljaGVyIFByb3plc3MNCi0NCi1fVUlfQ29uZmlndXJhdGlvbnNfdGV4dD1Lb25maWd1cmF0aW9uZW4NCi0NCi1fVUlfUHJvY2Vzc0ZhbWlsaWVzX3RleHQ9UHJvemVzc2ZhbWlsaWVuDQotDQotX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dD1OaWNodCBrYXRlZ29yaXNpZXJ0DQotX1VJX1VuY2F0ZWdvcml6ZWRfVGFza3NfdGV4dD1OaWNodCBrYXRlZ29yaXNpZXJ0ZSBBdWZnYWJlbg0KLV9VSV9VbmNhdGVnb3JpemVkX1JvbGVzX3RleHQ9TmljaHQga2F0ZWdvcmlzaWVydGUgUm9sbGVuDQotDQotX1VJX0d1aWRhbmNlc19ncm91cD1BbmxlaXR1bmcNCi1fVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHM9UHJcdTAwZmNmbGlzdGVuDQotX1VJX0d1aWRhbmNlc19Db25jZXB0cz1Lb256ZXB0ZQ0KLV9VSV9HdWlkYW5jZXNfRXhhbXBsZXM9QmVpc3BpZWxlDQotX1VJX0d1aWRhbmNlc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM9SGlud2Vpc2UgenVtIFNjaFx1MDBlNHR6ZW4NCi1fVUlfR3VpZGFuY2VzX1ByYWN0aWNlcz1WZXJmYWhyZW4NCi1fVUlfR3VpZGFuY2VzX1JlcG9ydHM9QmVyaWNodGUNCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPVdpZWRlcnZlcndlbmRiYXJlIEFzc2V0cw0KLV9VSV9HdWlkYW5jZXNfUm9hZG1hcD1Sb2FkbWFwDQotX1VJX0d1aWRhbmNlc19TdXBwb3J0aW5nTWF0ZXJpYWxzPVVudGVyc3RcdTAwZmN0emVuZGVzIE1hdGVyaWFsDQotX1VJX0d1aWRhbmNlc19UZWNobmlxdWVzPVRlY2huaWtlbg0KLV9VSV9HdWlkYW5jZXNfVGVtcGxhdGVzPVZvcmxhZ2VuDQotX1VJX0d1aWRhbmNlc19UZXJtRGVmaW5pdGlvbnM9QmVncmlmZnNkZWZpbml0aW9uZW4NCi1fVUlfR3VpZGFuY2VzX1Rvb2xNZW50b3JzPVRvb2xtZW50b3Jlbg0KLV9VSV9HdWlkYW5jZXNfV2hpdGVwYXBlcnM9V2hpdGUgUGFwZXINCi1fVUlfR3VpZGFuY2VzX1dvcmtQcm9kdWN0R3VpZGVsaW5lcz1SaWNodGxpbmllbg0KLQ0KLQ0KLV9VSV9Sb2xlc19ncm91cD1Sb2xsZW4NCi1fVUlfVGFza3NfZ3JvdXA9QXVmZ2FiZW4NCi1fVUlfV29ya1Byb2R1Y3RzX2dyb3VwPUFyYmVpdHNlcmdlYm5pc3NlDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5NDljYWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RWRpY2lcdTAwZjNuIGRlIGJpYmxpb3RlY2EgZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotX1VJX0NvbnRlbnRfZ3JvdXA9Q29udGVuaWRvIGRlbCBtXHUwMGU5dG9kbw0KLQ0KLV9VSV9EaXNjaXBsaW5lc19ncm91cD1EaXNjaXBsaW5hcw0KLV9VSV9Eb21haW5zX2dyb3VwPURvbWluaW9zDQotX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXA9Q2xhc2VzIGRlIHByb2R1Y3RvIGRlIHRyYWJham8NCi1fVUlfUm9sZV9TZXRzX2dyb3VwPUNvbmp1bnRvcyBkZSByb2xlcw0KLV9VSV9Ub29sc19ncm91cD1IZXJyYW1pZW50YXMNCi1fVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cD1DYXRlZ29yXHUwMGVkYXMgZXN0XHUwMGUxbmRhcg0KLV9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cD1DYXRlZ29yXHUwMGVkYXMgcGVyc29uYWxpemFkYXMNCi1fVUlfTWV0aG9kQ29udGVudF9ncm91cD1QYXF1ZXRlcyBkZSBjb250ZW5pZG8NCi0NCi1fVUlfUHJvY2Vzc2VzX2dyb3VwPVByb2Nlc29zDQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPVBsYW50aWxsYXMgZGUgcGxhbmlmaWNhY2lcdTAwZjNuDQotDQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuc190ZXh0PVBhdHJvbmVzIGRlIHBvc2liaWxpZGFkDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ9UHJvY2Vzb3MgZGUgZW50cmVnYQ0KLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uc190ZXh0PVByb2Nlc29zIGRpZmVyZW5jaWFsZXMNCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dD1QbGFudGlsbGFzIGRlIHBsYW5pZmljYWNpXHUwMGYzbg0KLQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PVBhdHJcdTAwZjNuIGRlIHBvc2liaWxpZGFkDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PVByb2Nlc28gZGUgZW50cmVnYQ0KLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9UHJvY2VzbyBkaWZlcmVuY2lhbA0KLQ0KLV9VSV9Db25maWd1cmF0aW9uc190ZXh0PUNvbmZpZ3VyYWNpb25lcw0KLQ0KLV9VSV9Qcm9jZXNzRmFtaWxpZXNfdGV4dD1GYW1pbGlhcyBkZWwgcHJvY2Vzbw0KLQ0KLV9VSV9VbmNhdGVnb3JpemVkX3RleHQ9U2luIGNhdGVnb3JpemFyDQotX1VJX1VuY2F0ZWdvcml6ZWRfVGFza3NfdGV4dD1UYXJlYXMgc2luIGNhdGVnb3JpemFyDQotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1Sb2xlcyBzaW4gY2F0ZWdvcml6YXINCi0NCi1fVUlfR3VpZGFuY2VzX2dyb3VwPUd1XHUwMGVkYQ0KLV9VSV9HdWlkYW5jZXNfQ2hlY2tsaXN0cz1MaXN0YXMgZGUgY29tcHJvYmFjaVx1MDBmM24NCi1fVUlfR3VpZGFuY2VzX0NvbmNlcHRzPUNvbmNlcHRvcw0KLV9VSV9HdWlkYW5jZXNfRXhhbXBsZXM9RWplbXBsb3MNCi1fVUlfR3VpZGFuY2VzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucz1Db25zaWRlcmFjaW9uZXMgc29icmUgZWwgY1x1MDBlMWxjdWxvDQotX1VJX0d1aWRhbmNlc19QcmFjdGljZXM9UHJcdTAwZTFjdGljYXMNCi1fVUlfR3VpZGFuY2VzX1JlcG9ydHM9SW5mb3JtZXMNCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPUFjdGl2b3MgcmV1dGlsaXphYmxlcw0KLV9VSV9HdWlkYW5jZXNfUm9hZG1hcD1NYXBhDQotX1VJX0d1aWRhbmNlc19TdXBwb3J0aW5nTWF0ZXJpYWxzPU1hdGVyaWFsZXMgZGUgc29wb3J0ZQ0KLV9VSV9HdWlkYW5jZXNfVGVjaG5pcXVlcz1UXHUwMGU5Y25pY2FzDQotX1VJX0d1aWRhbmNlc19UZW1wbGF0ZXM9UGxhbnRpbGxhcw0KLV9VSV9HdWlkYW5jZXNfVGVybURlZmluaXRpb25zPURlZmluaWNpb25lcyBkZWwgdFx1MDBlOXJtaW5vDQotX1VJX0d1aWRhbmNlc19Ub29sTWVudG9ycz1HdVx1MDBlZGFzIGRlIGxhIGhlcnJhbWllbnRhDQotX1VJX0d1aWRhbmNlc19XaGl0ZXBhcGVycz1Eb2N1bWVudGFjaVx1MDBmM24NCi1fVUlfR3VpZGFuY2VzX1dvcmtQcm9kdWN0R3VpZGVsaW5lcz1EaXJlY3RyaWNlcw0KLQ0KLQ0KLV9VSV9Sb2xlc19ncm91cD1Sb2xlcw0KLV9VSV9UYXNrc19ncm91cD1UYXJlYXMNCi1fVUlfV29ya1Byb2R1Y3RzX2dyb3VwPVByb2R1Y3RvcyBkZSB0cmFiYWpvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZhZWVkNTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9TW9kaWZpY2F0aW9uIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLV9VSV9Db250ZW50X2dyb3VwPUNvbnRlbnUgZGUgbGEgbVx1MDBlOXRob2RlDQotDQotX1VJX0Rpc2NpcGxpbmVzX2dyb3VwPURpc2NpcGxpbmVzDQotX1VJX0RvbWFpbnNfZ3JvdXA9RG9tYWluZXMNCi1fVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cD1UeXBlcyBkZSBwcm9kdWl0cw0KLV9VSV9Sb2xlX1NldHNfZ3JvdXA9RW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMNCi1fVUlfVG9vbHNfZ3JvdXA9T3V0aWxzDQotX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXA9Q2F0XHUwMGU5Z29yaWVzIHN0YW5kYXJkDQotX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwPUNhdFx1MDBlOWdvcmllcyBwZXJzb25uYWxpc1x1MDBlOWVzDQotX1VJX01ldGhvZENvbnRlbnRfZ3JvdXA9UGFja2FnZXMgZGUgY29udGVudQ0KLQ0KLV9VSV9Qcm9jZXNzZXNfZ3JvdXA9UHJvY2Vzc3VzDQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPUNhbmV2YXMgZGUgcGxhbmlmaWNhdGlvbg0KLQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dD1QYXR0ZXJucyBkZSBjYXBhY2l0XHUwMGU5DQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ9UHJvY2Vzc3VzIGRlIGxpdnJhaXNvbg0KLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uc190ZXh0PVByb2Nlc3N1cyBkaWZmXHUwMGU5cmVudGllbHMNCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dD1DYW5ldmFzIGRlIHBsYW5pZmljYXRpb24NCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1QYXR0ZXJuIGRlIGNhcGFjaXRcdTAwZTkNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQ9UHJvY2Vzc3VzIGRlIGxpdnJhaXNvbg0KLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9UHJvY2Vzc3VzIGRpZmZcdTAwZTlyZW50aWVsDQotDQotX1VJX0NvbmZpZ3VyYXRpb25zX3RleHQ9Q29uZmlndXJhdGlvbnMNCi0NCi1fVUlfUHJvY2Vzc0ZhbWlsaWVzX3RleHQ9RmFtaWxsZXMgZGUgcHJvY2Vzc3VzDQotDQotX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dD1Ob24gYWZmZWN0XHUwMGU5IFx1MDBlMCB1bmUgY2F0XHUwMGU5Z29yaWUNCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PVRcdTAwZTJjaGVzIG5vbiBhZmZlY3RcdTAwZTllcyBcdTAwZTAgdW5lIGNhdFx1MDBlOWdvcmllDQotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1SXHUwMGY0bGVzIG5vbiBhZmZlY3RcdTAwZTlzIFx1MDBlMCB1bmUgY2F0XHUwMGU5Z29yaWUNCi0NCi1fVUlfR3VpZGFuY2VzX2dyb3VwPUNvbnNlaWwNCi1fVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHM9TGlzdGVzIGRlIGNvbnRyXHUwMGY0bGUNCi1fVUlfR3VpZGFuY2VzX0NvbmNlcHRzPUNvbmNlcHRzDQotX1VJX0d1aWRhbmNlc19FeGFtcGxlcz1FeGVtcGxlcw0KLV9VSV9HdWlkYW5jZXNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPUNvbnNpZFx1MDBlOXJhdGlvbnMgcmVsYXRpdmVzIFx1MDBlMCBsJ2VzdGltYXRpb24NCi1fVUlfR3VpZGFuY2VzX1ByYWN0aWNlcz1QcmF0aXF1ZXMNCi1fVUlfR3VpZGFuY2VzX1JlcG9ydHM9UmFwcG9ydHMNCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPVJlc3NvdXJjZXMgclx1MDBlOXV0aWxpc2FibGVzDQotX1VJX0d1aWRhbmNlc19Sb2FkbWFwPUZldWlsbGUgZGUgcm91dGUNCi1fVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHM9RG9jdW1lbnRzIGQnYWNjb21wYWduZW1lbnQNCi1fVUlfR3VpZGFuY2VzX1RlY2huaXF1ZXM9VGVjaG5pcXVlcw0KLV9VSV9HdWlkYW5jZXNfVGVtcGxhdGVzPUNhbmV2YXMNCi1fVUlfR3VpZGFuY2VzX1Rlcm1EZWZpbml0aW9ucz1EXHUwMGU5ZmluaXRpb25zIGRlIHRlcm1lcw0KLV9VSV9HdWlkYW5jZXNfVG9vbE1lbnRvcnM9R3VpZGVzIGQndXRpbGlzYXRpb24gZGUgbCdvdXRpbA0KLV9VSV9HdWlkYW5jZXNfV2hpdGVwYXBlcnM9TGl2cmVzIGJsYW5jcw0KLV9VSV9HdWlkYW5jZXNfV29ya1Byb2R1Y3RHdWlkZWxpbmVzPUluc3RydWN0aW9ucw0KLQ0KLQ0KLV9VSV9Sb2xlc19ncm91cD1SXHUwMGY0bGVzDQotX1VJX1Rhc2tzX2dyb3VwPVRcdTAwZTJjaGVzDQotX1VJX1dvcmtQcm9kdWN0c19ncm91cD1Qcm9kdWl0cw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYjk2ZTljLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPU1vZGlmaWNhIGxpYnJlcmlhIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLV9VSV9Db250ZW50X2dyb3VwPUNvbnRlbnV0byBkaSBtZXRvZG8NCi0NCi1fVUlfRGlzY2lwbGluZXNfZ3JvdXA9RGlzY2lwbGluZQ0KLV9VSV9Eb21haW5zX2dyb3VwPURvbWluaQ0KLV9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwPVRpcGkgZGkgcHJvZG90dG8gZGkgbGF2b3JvDQotX1VJX1JvbGVfU2V0c19ncm91cD1JbnNpZW1pIGRpIHJ1b2xpDQotX1VJX1Rvb2xzX2dyb3VwPVRvb2wNCi1fVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cD1DYXRlZ29yaWUgc3RhbmRhcmQNCi1fVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXA9Q2F0ZWdvcmllIHBlcnNvbmFsaXp6YXRlDQotX1VJX01ldGhvZENvbnRlbnRfZ3JvdXA9UGFjY2hldHRpIGRlbCBjb250ZW51dG8NCi0NCi1fVUlfUHJvY2Vzc2VzX2dyb3VwPVByb2Nlc3NpDQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPVBpYW5pZmljYXppb25lIGRlaSBtb2RlbGxpDQotDQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuc190ZXh0PU1vZGVsbGkgZGkgY2FwYWNpdFx1MDBlMA0KLV9VSV9EZWxpdmVyeVByb2Nlc3Nlc190ZXh0PVByb2Nlc3NpIGRpIHByb2R1emlvbmUNCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbnNfdGV4dD1Qcm9jZXNzaSBkaWZmZXJlbnppYWxpDQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX3RleHQ9UGlhbmlmaWNhemlvbmUgZGVpIG1vZGVsbGkNCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1Nb2RlbGxvIGRpIGNhcGFjaXRcdTAwZTANCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQ9UHJvY2Vzc28gZGkgcHJvZHV6aW9uZQ0KLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9UHJvY2Vzc28gZGlmZmVyZW56aWFsZQ0KLQ0KLV9VSV9Db25maWd1cmF0aW9uc190ZXh0PUNvbmZpZ3VyYXppb25pDQotDQotX1VJX1Byb2Nlc3NGYW1pbGllc190ZXh0PUZhbWlnbGllIHByb2Nlc3NpDQotDQotX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dD1TZW56YSBjYXRlZ29yaWENCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PU9wZXJhemlvbmkgc2VuemEgY2F0ZWdvcmlhDQotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1SdW9saSBzZW56YSBjYXRlZ29yaWENCi0NCi1fVUlfR3VpZGFuY2VzX2dyb3VwPUd1aWRhDQotX1VJX0d1aWRhbmNlc19DaGVja2xpc3RzPUVsZW5jaGkgZGkgY29udHJvbGxvDQotX1VJX0d1aWRhbmNlc19Db25jZXB0cz1Db25jZXR0aQ0KLV9VSV9HdWlkYW5jZXNfRXhhbXBsZXM9RXNlbXBpDQotX1VJX0d1aWRhbmNlc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM9Q29uc2lkZXJhemlvbmkgc3VsbGEgdmFsdXRhemlvbmUNCi1fVUlfR3VpZGFuY2VzX1ByYWN0aWNlcz1QcmF0aWNoZQ0KLV9VSV9HdWlkYW5jZXNfUmVwb3J0cz1SZXBvcnQNCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPVJpc29yc2Ugcml1dGlsaXp6YWJpbGkNCi1fVUlfR3VpZGFuY2VzX1JvYWRtYXA9Um9hZG1hcA0KLV9VSV9HdWlkYW5jZXNfU3VwcG9ydGluZ01hdGVyaWFscz1NYXRlcmlhbGUgZGkgc3VwcG9ydG8NCi1fVUlfR3VpZGFuY2VzX1RlY2huaXF1ZXM9VGVjbmljaGUNCi1fVUlfR3VpZGFuY2VzX1RlbXBsYXRlcz1Nb2RlbGxpDQotX1VJX0d1aWRhbmNlc19UZXJtRGVmaW5pdGlvbnM9RGVmaW5pemlvbmkgdGVybWluaQ0KLV9VSV9HdWlkYW5jZXNfVG9vbE1lbnRvcnM9R3VpZGEgYWwgdG9vbA0KLV9VSV9HdWlkYW5jZXNfV2hpdGVwYXBlcnM9V2hpdGVwYXBlcg0KLV9VSV9HdWlkYW5jZXNfV29ya1Byb2R1Y3RHdWlkZWxpbmVzPUxpbmVlIGd1aWRhDQotDQotDQotX1VJX1JvbGVzX2dyb3VwPVJ1b2xpDQotX1VJX1Rhc2tzX2dyb3VwPU9wZXJhemlvbmkNCi1fVUlfV29ya1Byb2R1Y3RzX2dyb3VwPVByb2RvdHRpIGRpIGxhdm9ybw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTU4ZDVlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBMaWJyYXJ5IEVkaXQNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi1fVUlfQ29udGVudF9ncm91cD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQNCi0NCi1fVUlfRGlzY2lwbGluZXNfZ3JvdXA9XHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlDQotX1VJX0RvbWFpbnNfZ3JvdXA9XHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzDQotX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXA9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU5ODVlDQotX1VJX1JvbGVfU2V0c19ncm91cD1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzgNCi1fVUlfVG9vbHNfZ3JvdXA9XHUzMGM0XHUzMGZjXHUzMGViDQotX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXA9XHU2YTE5XHU2ZTk2XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjDQotX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwPVx1MzBhYlx1MzBiOVx1MzBiZlx1MzBlMFx1MzBmYlx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmYw0KLV9VSV9NZXRob2RDb250ZW50X2dyb3VwPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzBmYlx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOA0KLQ0KLV9VSV9Qcm9jZXNzZXNfZ3JvdXA9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5DQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPVx1OGEwOFx1NzUzYlx1MzBjNlx1MzBmM1x1MzBkN1x1MzBlY1x1MzBmY1x1MzBjOA0KLQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dD1cdTMwYjFcdTMwZmNcdTMwZDFcdTMwZDNcdTMwZWFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjMNCi1fVUlfRGVsaXZlcnlQcm9jZXNzZXNfdGV4dD1cdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbnNfdGV4dD1cdTVmYWVcdTUyMDZcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dD1cdThhMDhcdTc1M2JcdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzgNCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1cdTMwYjFcdTMwZmNcdTMwZDFcdTMwZDNcdTMwZWFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjMNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQ9XHUzMGM3XHUzMGVhXHUzMGQwXHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5DQotX1VJX1Byb2Nlc3NDb250cmlidXRpb25fdGV4dD1cdTVmYWVcdTUyMDZcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi0NCi1fVUlfQ29uZmlndXJhdGlvbnNfdGV4dD1cdTY5Y2JcdTYyMTANCi0NCi1fVUlfUHJvY2Vzc0ZhbWlsaWVzX3RleHQ9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGRmXHUzMGVhXHUzMGZjDQotDQotX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dD1cdTY3MmFcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTUzMTYNCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PVx1NjcyYVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1NTMxNlx1MzBiZlx1MzBiOVx1MzBhZg0KLV9VSV9VbmNhdGVnb3JpemVkX1JvbGVzX3RleHQ9XHU2NzJhXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHU1MzE2XHUzMGVkXHUzMGZjXHUzMGViDQotDQotX1VJX0d1aWRhbmNlc19ncm91cD1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjkNCi1fVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHM9XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMGVhXHUzMGI5XHUzMGM4DQotX1VJX0d1aWRhbmNlc19Db25jZXB0cz1cdTY5ODJcdTVmZjUNCi1fVUlfR3VpZGFuY2VzX0V4YW1wbGVzPVx1NGY4Yg0KLV9VSV9HdWlkYW5jZXNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPVx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YVx1ODAwM1x1NjE2ZVx1NGU4Ylx1OTgwNQ0KLV9VSV9HdWlkYW5jZXNfUHJhY3RpY2VzPVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOQ0KLV9VSV9HdWlkYW5jZXNfUmVwb3J0cz1cdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzgNCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPVx1NTE4ZFx1NTIyOVx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2YVx1MzBhMlx1MzBiYlx1MzBjM1x1MzBjOA0KLV9VSV9HdWlkYW5jZXNfUm9hZG1hcD1cdTMwZWRcdTMwZmNcdTMwYzlcdTMwZGVcdTMwYzNcdTMwZDcNCi1fVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHM9XHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHU4Y2M3XHU2NTk5DQotX1VJX0d1aWRhbmNlc19UZWNobmlxdWVzPVx1NjI4MFx1NmNkNQ0KLV9VSV9HdWlkYW5jZXNfVGVtcGxhdGVzPVx1MzBjNlx1MzBmM1x1MzBkN1x1MzBlY1x1MzBmY1x1MzBjOA0KLV9VSV9HdWlkYW5jZXNfVGVybURlZmluaXRpb25zPVx1NzUyOFx1OGE5ZVx1NWI5YVx1N2ZhOQ0KLV9VSV9HdWlkYW5jZXNfVG9vbE1lbnRvcnM9XHUzMGM0XHUzMGZjXHUzMGViXHUzMGZiXHUzMGUxXHUzMGYzXHUzMGJmXHUzMGZjDQotX1VJX0d1aWRhbmNlc19XaGl0ZXBhcGVycz1cdTMwZGJcdTMwZWZcdTMwYTRcdTMwYzhcdTMwZmJcdTMwZGFcdTMwZmNcdTMwZDFcdTMwZmMNCi1fVUlfR3VpZGFuY2VzX1dvcmtQcm9kdWN0R3VpZGVsaW5lcz1cdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjMNCi0NCi0NCi1fVUlfUm9sZXNfZ3JvdXA9XHUzMGVkXHUzMGZjXHUzMGViDQotX1VJX1Rhc2tzX2dyb3VwPVx1MzBiZlx1MzBiOVx1MzBhZg0KLV9VSV9Xb3JrUHJvZHVjdHNfZ3JvdXA9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyYWMwNGMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWQzYjhcdWM5ZDENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi1fVUlfQ29udGVudF9ncm91cD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjZWU4XHVkMTUwXHVjZTIwDQotDQotX1VJX0Rpc2NpcGxpbmVzX2dyb3VwPVx1YzZkMFx1Y2U1OQ0KLV9VSV9Eb21haW5zX2dyb3VwPVx1YjNjNFx1YmE1NFx1Yzc3OA0KLV9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1DQotX1VJX1JvbGVfU2V0c19ncm91cD1cdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4DQotX1VJX1Rvb2xzX2dyb3VwPVx1YjNjNFx1YWQ2Yw0KLV9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwPVx1ZDQ1Y1x1YzkwMCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMNCi1fVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXA9XHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMNCi1fVUlfTWV0aG9kQ29udGVudF9ncm91cD1cdWNlZThcdWQxNTBcdWNlMjAgXHVkMzI4XHVkMGE0XHVjOWMwDQotDQotX1VJX1Byb2Nlc3Nlc19ncm91cD1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfZ3JvdXA9XHVhY2M0XHVkNjhkIFx1ZDE1Y1x1ZDUwY1x1YjlhY1x1ZDJiOA0KLQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dD1cdWFlMzBcdWIyYTUgXHVkMzI4XHVkMTM0DQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ9XHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNA0KLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uc190ZXh0PVx1Y2MyOFx1YjRmMSBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dD1cdWFjYzRcdWQ2OGQgXHVkMTVjXHVkNTBjXHViOWFjXHVkMmI4DQotDQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9XHVhZTMwXHViMmE1IFx1ZDMyOFx1ZDEzNA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1cdWM4MDRcdWIyZWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotX1VJX1Byb2Nlc3NDb250cmlidXRpb25fdGV4dD1cdWNjMjhcdWI0ZjEgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotDQotX1VJX0NvbmZpZ3VyYXRpb25zX3RleHQ9XHVhZDZjXHVjMTMxDQotDQotX1VJX1Byb2Nlc3NGYW1pbGllc190ZXh0PVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWFjYzRcdWM1ZjQNCi0NCi1fVUlfVW5jYXRlZ29yaXplZF90ZXh0PVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhY1x1ZDY1NFx1YjQxOFx1YzljMCBcdWM1NGFcdWM3NGMNCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhY1x1ZDY1NFx1YjQxOFx1YzljMCBcdWM1NGFcdWM3NDAgXHVkMGMwXHVjMmE0XHVkMDZjDQotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1cdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWNcdWQ2NTRcdWI0MThcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YzVlZFx1ZDU2MA0KLQ0KLV9VSV9HdWlkYW5jZXNfZ3JvdXA9XHVjNTQ4XHViMGI0DQotX1VJX0d1aWRhbmNlc19DaGVja2xpc3RzPVx1Y2NiNFx1ZDA2Y1x1YjlhY1x1YzJhNFx1ZDJiOA0KLV9VSV9HdWlkYW5jZXNfQ29uY2VwdHM9XHVhYzFjXHViMTUwDQotX1VJX0d1aWRhbmNlc19FeGFtcGxlcz1cdWM2MDhcdWM4MWMNCi1fVUlfR3VpZGFuY2VzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucz1cdWM2MDhcdWMwYzEgXHVhY2UwXHViODI0XHVjMGFjXHVkNTZkDQotX1VJX0d1aWRhbmNlc19QcmFjdGljZXM9XHVjMGFjXHViODQwDQotX1VJX0d1aWRhbmNlc19SZXBvcnRzPVx1YmNmNFx1YWNlMFx1YzExYw0KLV9VSV9HdWlkYW5jZXNfUmV1c2FibGVBc3NldHM9XHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMA0KLV9VSV9HdWlkYW5jZXNfUm9hZG1hcD1cdWI4NWNcdWI0ZGNcdWI5ZjUNCi1fVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHM9XHVjOWMwXHVjNmQwIFx1Yzc5MFx1YjhjYw0KLV9VSV9HdWlkYW5jZXNfVGVjaG5pcXVlcz1cdWFlMzBcdWJjOTUNCi1fVUlfR3VpZGFuY2VzX1RlbXBsYXRlcz1cdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjgNCi1fVUlfR3VpZGFuY2VzX1Rlcm1EZWZpbml0aW9ucz1cdWM2YTlcdWM1YjQgXHVjODE1XHVjNzU4DQotX1VJX0d1aWRhbmNlc19Ub29sTWVudG9ycz1cdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5IFx1YjNjNFx1YzZjMFx1YjlkMA0KLV9VSV9HdWlkYW5jZXNfV2hpdGVwYXBlcnM9XHViYzMxXHVjMTFjDQotX1VJX0d1aWRhbmNlc19Xb3JrUHJvZHVjdEd1aWRlbGluZXM9XHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4DQotDQotDQotX1VJX1JvbGVzX2dyb3VwPVx1YzVlZFx1ZDU2MA0KLV9VSV9UYXNrc19ncm91cD1cdWQwYzBcdWMyYTRcdWQwNmMNCi1fVUlfV29ya1Byb2R1Y3RzX2dyb3VwPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU2NTA2ZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FZGlcdTAwZTdcdTAwZTNvIGRhIEJpYmxpb3RlY2EgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotX1VJX0NvbnRlbnRfZ3JvdXA9Q29udGVcdTAwZmFkbyBkbyBNXHUwMGU5dG9kbw0KLQ0KLV9VSV9EaXNjaXBsaW5lc19ncm91cD1EaXNjaXBsaW5hcw0KLV9VSV9Eb21haW5zX2dyb3VwPURvbVx1MDBlZG5pb3MNCi1fVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cD1UaXBvcyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotX1VJX1JvbGVfU2V0c19ncm91cD1Db25qdW50b3MgZGUgRnVuXHUwMGU3XHUwMGY1ZXMNCi1fVUlfVG9vbHNfZ3JvdXA9RmVycmFtZW50YXMNCi1fVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cD1DYXRlZ29yaWFzIFBhZHJcdTAwZTNvDQotX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwPUNhdGVnb3JpYXMgUGVyc29uYWxpemFkYXMNCi1fVUlfTWV0aG9kQ29udGVudF9ncm91cD1QYWNvdGVzIGRlIENvbnRlXHUwMGZhZG8NCi0NCi1fVUlfUHJvY2Vzc2VzX2dyb3VwPVByb2Nlc3Nvcw0KLV9VSV9QbGFubmluZ1RlbXBsYXRlc19ncm91cD1HYWJhcml0b3MgZGUgUGxhbmVqYW1lbnRvDQotDQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuc190ZXh0PVBhZHJcdTAwZjVlcyBkZSBSZWN1cnNvDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ9UHJvY2Vzc29zIGRlIEVudHJlZ2ENCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbnNfdGV4dD1Qcm9jZXNzb3MgRGlmZXJlbmNpYWlzDQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX3RleHQ9R2FiYXJpdG9zIGRlIFBsYW5lamFtZW50bw0KLQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PVBhZHJcdTAwZTNvIGRlIFJlY3Vyc28NCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQ9UHJvY2Vzc28gZGUgRW50cmVnYQ0KLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9UHJvY2Vzc28gRGlmZXJlbmNpYWwNCi0NCi1fVUlfQ29uZmlndXJhdGlvbnNfdGV4dD1Db25maWd1cmFcdTAwZTdcdTAwZjVlcw0KLQ0KLV9VSV9Qcm9jZXNzRmFtaWxpZXNfdGV4dD0gICAgRmFtXHUwMGVkbGlhcyBkZSBQcm9jZXNzb3MNCi0NCi1fVUlfVW5jYXRlZ29yaXplZF90ZXh0PVNlbSBDYXRlZ29yaWENCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PVRhcmVmYXMgc2VtIENhdGVnb3JpYQ0KLV9VSV9VbmNhdGVnb3JpemVkX1JvbGVzX3RleHQ9RnVuXHUwMGU3XHUwMGY1ZXMgc2VtIENhdGVnb3JpYQ0KLQ0KLV9VSV9HdWlkYW5jZXNfZ3JvdXA9T3JpZW50YVx1MDBlN1x1MDBlM28NCi1fVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHM9TGlzdGFzIGRlIFZlcmlmaWNhXHUwMGU3XHUwMGUzbw0KLV9VSV9HdWlkYW5jZXNfQ29uY2VwdHM9Q29uY2VpdG9zDQotX1VJX0d1aWRhbmNlc19FeGFtcGxlcz1FeGVtcGxvcw0KLV9VSV9HdWlkYW5jZXNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPUNvbnNpZGVyYVx1MDBlN1x1MDBmNWVzIEVzdGltYXRpdmFzDQotX1VJX0d1aWRhbmNlc19QcmFjdGljZXM9UHJcdTAwZTF0aWNhcw0KLV9VSV9HdWlkYW5jZXNfUmVwb3J0cz1SZWxhdFx1MDBmM3Jpb3MNCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPVJlY3Vyc29zIFJldXRpbGl6XHUwMGUxdmVpcw0KLV9VSV9HdWlkYW5jZXNfUm9hZG1hcD1Sb3RlaXJvDQotX1VJX0d1aWRhbmNlc19TdXBwb3J0aW5nTWF0ZXJpYWxzPU1hdGVyaWFpcyBkZSBTdXBvcnRlDQotX1VJX0d1aWRhbmNlc19UZWNobmlxdWVzPVRcdTAwZTljbmljYXMNCi1fVUlfR3VpZGFuY2VzX1RlbXBsYXRlcz1HYWJhcml0b3MNCi1fVUlfR3VpZGFuY2VzX1Rlcm1EZWZpbml0aW9ucz1EZWZpbmlcdTAwZTdcdTAwZjVlcyBkZSBUZXJtb3MNCi1fVUlfR3VpZGFuY2VzX1Rvb2xNZW50b3JzPU1lbnRvcmVzIGRlIEZlcnJhbWVudGFzDQotX1VJX0d1aWRhbmNlc19XaGl0ZXBhcGVycz1XaGl0ZSBwYXBlcnMNCi1fVUlfR3VpZGFuY2VzX1dvcmtQcm9kdWN0R3VpZGVsaW5lcz1EaXJldHJpemVzDQotDQotDQotX1VJX1JvbGVzX2dyb3VwPUZ1blx1MDBlN1x1MDBmNWVzDQotX1VJX1Rhc2tzX2dyb3VwPVRhcmVmYXMNCi1fVUlfV29ya1Byb2R1Y3RzX2dyb3VwPVByb2R1dG9zICAgICAgICAgICBkZSBUcmFiYWxobw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOWM5N2IxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTVlOTNcdTdmMTZcdThmOTENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi1fVUlfQ29udGVudF9ncm91cD1cdTY1YjlcdTZjZDVcdTUxODVcdTViYjkNCi0NCi1fVUlfRGlzY2lwbGluZXNfZ3JvdXA9XHU4OWM0XHU3YTBiDQotX1VJX0RvbWFpbnNfZ3JvdXA9XHU1N2RmDQotX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXA9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiDQotX1VJX1JvbGVfU2V0c19ncm91cD1cdTg5ZDJcdTgyNzJcdTk2YzYNCi1fVUlfVG9vbHNfZ3JvdXA9XHU1ZGU1XHU1MTc3DQotX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXA9XHU2ODA3XHU1MWM2XHU3YzdiXHU1MjJiDQotX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwPVx1NWI5YVx1NTIzNlx1N2M3Ylx1NTIyYg0KLV9VSV9NZXRob2RDb250ZW50X2dyb3VwPVx1NTE4NVx1NWJiOVx1NTMwNQ0KLQ0KLV9VSV9Qcm9jZXNzZXNfZ3JvdXA9XHU2ZDQxXHU3YTBiDQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPVx1ODljNFx1NTIxMlx1NmEyMVx1Njc3Zg0KLQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dD1cdTgwZmRcdTUyOWJcdTZhMjFcdTVmMGYNCi1fVUlfRGVsaXZlcnlQcm9jZXNzZXNfdGV4dD1cdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGINCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbnNfdGV4dD1cdTVkZWVcdTVmMDJcdTUzMTZcdThmYzdcdTdhMGINCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dD1cdTg5YzRcdTUyMTJcdTZhMjFcdTY3N2YNCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1cdTgwZmRcdTUyOWJcdTZhMjFcdTVmMGYNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQ9XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiDQotX1VJX1Byb2Nlc3NDb250cmlidXRpb25fdGV4dD1cdTVkZWVcdTVmMDJcdTUzMTZcdThmYzdcdTdhMGINCi0NCi1fVUlfQ29uZmlndXJhdGlvbnNfdGV4dD1cdTkxNGRcdTdmNmUNCi0NCi1fVUlfUHJvY2Vzc0ZhbWlsaWVzX3RleHQ9XHU2ZDQxXHU3YTBiXHU3Y2ZiXHU1MjE3DQotDQotX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dD1cdTY3MmFcdTUyMDZcdTdjN2INCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PVx1NjcyYVx1NTIwNlx1N2M3Ylx1NGVmYlx1NTJhMQ0KLV9VSV9VbmNhdGVnb3JpemVkX1JvbGVzX3RleHQ9XHU2NzJhXHU1MjA2XHU3YzdiXHU4OWQyXHU4MjcyDQotDQotX1VJX0d1aWRhbmNlc19ncm91cD1cdTYzMDdcdTViZmNcdTRmZTFcdTYwNmYNCi1fVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHM9XHU2ODM4XHU1YmY5XHU4ODY4DQotX1VJX0d1aWRhbmNlc19Db25jZXB0cz1cdTY5ODJcdTVmZjUNCi1fVUlfR3VpZGFuY2VzX0V4YW1wbGVzPVx1NzkzYVx1NGY4Yg0KLV9VSV9HdWlkYW5jZXNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPVx1NGYzMFx1N2I5N1x1NmNlOFx1NjEwZlx1NGU4Ylx1OTg3OQ0KLV9VSV9HdWlkYW5jZXNfUHJhY3RpY2VzPVx1NWI5ZVx1OGRmNQ0KLV9VSV9HdWlkYW5jZXNfUmVwb3J0cz1cdTYyYTVcdTU0NGENCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPVx1NTNlZlx1OTFjZFx1NzUyOFx1OGQ0NFx1NGVhNw0KLV9VSV9HdWlkYW5jZXNfUm9hZG1hcD1cdThkZWZcdTdlYmZcdTU2ZmUNCi1fVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHM9XHU2NTJmXHU2MzAxXHU2NzUwXHU2NTk5DQotX1VJX0d1aWRhbmNlc19UZWNobmlxdWVzPVx1NjI4MFx1NjcyZg0KLV9VSV9HdWlkYW5jZXNfVGVtcGxhdGVzPVx1NmEyMVx1Njc3Zg0KLV9VSV9HdWlkYW5jZXNfVGVybURlZmluaXRpb25zPVx1NjcyZlx1OGJlZFx1NWI5YVx1NGU0OQ0KLV9VSV9HdWlkYW5jZXNfVG9vbE1lbnRvcnM9XHU1ZGU1XHU1MTc3XHU1NDExXHU1YmZjDQotX1VJX0d1aWRhbmNlc19XaGl0ZXBhcGVycz1cdTc2N2RcdTc2YWVcdTRlNjYNCi1fVUlfR3VpZGFuY2VzX1dvcmtQcm9kdWN0R3VpZGVsaW5lcz1cdTYzMDdcdTUzNTcNCi0NCi1fVUlfUm9sZXNfZ3JvdXA9XHU4OWQyXHU4MjcyDQotX1VJX1Rhc2tzX2dyb3VwPVx1NGVmYlx1NTJhMQ0KLV9VSV9Xb3JrUHJvZHVjdHNfZ3JvdXA9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkMTcwODguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIExpYnJhcnkgRWRpdA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLV9VSV9Db250ZW50X2dyb3VwPVx1NjViOVx1NmNkNVx1NTE2N1x1NWJiOQ0KLQ0KLV9VSV9EaXNjaXBsaW5lc19ncm91cD1cdTg5OGZcdTdiYzQNCi1fVUlfRG9tYWluc19ncm91cD1cdTk4MThcdTU3ZGYNCi1fVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTk4NWVcdTU3OGINCi1fVUlfUm9sZV9TZXRzX2dyb3VwPVx1ODlkMlx1ODI3Mlx1OTZjNg0KLV9VSV9Ub29sc19ncm91cD1cdTVkZTVcdTUxNzcNCi1fVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cD1cdTZhMTlcdTZlOTZcdTdhMmVcdTk4NWUNCi1fVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXA9XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlDQotX1VJX01ldGhvZENvbnRlbnRfZ3JvdXA9XHU1MTY3XHU1YmI5XHU1OTU3XHU0ZWY2DQotDQotX1VJX1Byb2Nlc3Nlc19ncm91cD1cdTdhMGJcdTVlOGYNCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfZ3JvdXA9XHU4OThmXHU1MjgzXHU3YmM0XHU2NzJjDQotDQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuc190ZXh0PVx1NTI5Zlx1ODBmZFx1NTc4Ylx1NmEyMw0KLV9VSV9EZWxpdmVyeVByb2Nlc3Nlc190ZXh0PVx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYg0KLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uc190ZXh0PVx1NWRlZVx1NzU3MFx1NmQ0MVx1N2EwYg0KLV9VSV9QbGFubmluZ1RlbXBsYXRlc190ZXh0PVx1ODk4Zlx1NTI4M1x1N2JjNFx1NjcyYw0KLQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PVx1NTI5Zlx1ODBmZFx1NTc4Ylx1NmEyMw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1cdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGINCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PVx1NWRlZVx1NzU3MFx1NmQ0MVx1N2EwYg0KLQ0KLV9VSV9Db25maWd1cmF0aW9uc190ZXh0PVx1OTE0ZFx1N2Y2ZQ0KLQ0KLV9VSV9Qcm9jZXNzRmFtaWxpZXNfdGV4dD1cdTdhMGJcdTVlOGZcdTdjZmJcdTUyMTcNCi0NCi1fVUlfVW5jYXRlZ29yaXplZF90ZXh0PVx1NjcyYVx1NTIwNlx1OTg1ZQ0KLV9VSV9VbmNhdGVnb3JpemVkX1Rhc2tzX3RleHQ9XHU2NzJhXHU1MjA2XHU5ODVlXHU0ZjVjXHU2OTZkDQotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1cdTY3MmFcdTUyMDZcdTk4NWVcdTg5ZDJcdTgyNzINCi0NCi1fVUlfR3VpZGFuY2VzX2dyb3VwPVx1NjMwN1x1NWYxNQ0KLV9VSV9HdWlkYW5jZXNfQ2hlY2tsaXN0cz1cdTY4MzhcdTVjMGRcdTZlMDVcdTU1YWUNCi1fVUlfR3VpZGFuY2VzX0NvbmNlcHRzPVx1Njk4Mlx1NWZmNQ0KLV9VSV9HdWlkYW5jZXNfRXhhbXBsZXM9XHU3YmM0XHU0ZjhiDQotX1VJX0d1aWRhbmNlc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM9XHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmDQotX1VJX0d1aWRhbmNlc19QcmFjdGljZXM9XHU3ZGY0XHU3ZmQyDQotX1VJX0d1aWRhbmNlc19SZXBvcnRzPVx1NTgzMVx1NTQ0YQ0KLV9VSV9HdWlkYW5jZXNfUmV1c2FibGVBc3NldHM9XHU1M2VmXHU5MWNkXHU4OTA3XHU0ZjdmXHU3NTI4XHU3Njg0XHU4Y2M3XHU3NTIyDQotX1VJX0d1aWRhbmNlc19Sb2FkbWFwPVx1NWMwZVx1ODliZFx1NTcxNg0KLV9VSV9HdWlkYW5jZXNfU3VwcG9ydGluZ01hdGVyaWFscz1cdTY1MmZcdTYzZjRcdThjYzdcdTY1OTkNCi1fVUlfR3VpZGFuY2VzX1RlY2huaXF1ZXM9XHU2MjgwXHU4ODUzDQotX1VJX0d1aWRhbmNlc19UZW1wbGF0ZXM9XHU3YmM0XHU2NzJjDQotX1VJX0d1aWRhbmNlc19UZXJtRGVmaW5pdGlvbnM9XHU4YTVlXHU1ZjU5XHU1YjlhXHU3ZmE5DQotX1VJX0d1aWRhbmNlc19Ub29sTWVudG9ycz1cdTVkZTVcdTUxNzdcdThmMTRcdTUyYTkNCi1fVUlfR3VpZGFuY2VzX1doaXRlcGFwZXJzPVx1NzY3ZFx1NzZhZVx1NjZmOA0KLV9VSV9HdWlkYW5jZXNfV29ya1Byb2R1Y3RHdWlkZWxpbmVzPVx1NmU5Nlx1NTI0Nw0KLQ0KLQ0KLV9VSV9Sb2xlc19ncm91cD1cdTg5ZDJcdTgyNzINCi1fVUlfVGFza3NfZ3JvdXA9XHU0ZjVjXHU2OTZkDQotX1VJX1dvcmtQcm9kdWN0c19ncm91cD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzFlNmZiZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgR2VuZXJpYyBEaWFsb2cgVGl0bGVzDQotbW92ZURpYWxvZ190aXRsZT1WZXJzY2hpZWJlbg0KLWRlbGV0ZURpYWxvZ190aXRsZT1FbGVtZW50IGxcdTAwZjZzY2hlbg0KLWVycm9yRGlhbG9nX3RpdGxlPUZlaGxlcg0KLWVycm9yRGlhbG9nX2Nhbm5vdFJlbmFtZT17MH0gJyd7MX0nJyBrYW5uIG5pY2h0IGluICcnezJ9JycgdW1iZW5hbm50IHdlcmRlbi4gQmVoZWJlbiBTaWUgZGFzIGluIGRlbiBEZXRhaWxzIGJlc2NocmllYmVuZSBQcm9ibGVtIHVuZCBrbGlja2VuIFNpZSBhbnNjaGxpZVx1MDBkZmVuZCBhdWYgT0ssIHVtIGRpZSBPcGVyYXRpb24gZm9ydHp1c2V0emVuLCBvZGVyIGF1ZiBBYmJyZWNoZW4sIHVtIGRpZSBPcGVyYXRpb24gYWJ6dWJyZWNoZW4uDQotDQotIyBDb25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbCBEaWFsb2cNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlPUVudGZlcm5lbiBkZXIgUmVmZXJlbnplbiBiZXN0XHUwMGU0dGlnZW4NCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RleHQ9QXVmIGRpZSBFbGVtZW50ZSwgZGllIFNpZSB6dW0gTFx1MDBmNnNjaGVuIGF1c2dld1x1MDBlNGhsdCBoYWJlbiwgdmVyd2Vpc2VuIG5vY2ggYW5kZXJlIEVsZW1lbnRlIGluIGRlciBNZXRob2RlbmJpYmxpb3RoZWsuIFdlbm4gU2llIGRpZXNlIEVsZW1lbnRlIGxcdTAwZjZzY2hlbiwgd2VyZGVuIGRpZSBSZWZlcmVuemVuIGF1ZiBkaWVzZSBFbGVtZW50ZSBnZWxcdTAwZjZzY2h0LiBEZXNoYWxiIHdlcmRlbiBkaWUgcmVmZXJlbnppZXJlbmRlbiBFbGVtZW50ZSBlYmVuZmFsbHMgYWt0dWFsaXNpZXJ0LiBWZXJnZXdpc3Nlcm4gU2llIHNpY2ggdm9yIGRlbSBBbmtsaWNrZW4gdm9uIE9LLCBkYXNzIFNpZSBiZXJlY2h0aWd0IHNpbmQsIGRpZSByZWZlcmVuemllcmVuZGVuIEVsZW1lbnRlIHp1IGFrdHVhbGlzaWVyZW4uIEtsaWNrZW4gU2llIGF1ZiBEZXRhaWxzLCB1bSBkaWUgTGlzdGUgZGVyIEVsZW1lbnRlIHp1IHByXHUwMGZjZmVuLCBkaWUgYXVmIGRpZSBFbGVtZW50ZSB2ZXJ3ZWlzZW4sIGRpZSBTaWUgbFx1MDBmNnNjaGVuIG1cdTAwZjZjaHRlbi4NCi0NCi0jIFJlc29sdmUgTmFtZSBDb25mbGljdCBEaWFsb2cNCi1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlPUtvbmZsaWt0IGJlaSBFbGVtZW50bmFtZW4gYmVoZWJlbg0KLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGV4dD17MH0gKG5ldSkgZlx1MDBmY3IgJyd7MX0nJyBlaW5nZWJlbjoNCi0NCi0jIFNlbGVjdCBEZWxpdmVyYWJsZXMgRGlhbG9nDQotc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RpdGxlPUxpZWZlcmdlZ2Vuc3RcdTAwZTRuZGUgYXVzd1x1MDBlNGhsZW4NCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGV4dD1XXHUwMGU0aGxlbiBTaWUgZWluZW4gTGllZmVyZ2VnZW5zdGFuZCBhdXMsIGRlbSBTaWUgZGFzIEFyYmVpdHNlcmdlYm5pcyAnJ3swfScnIHp1b3JkbmVuIG1cdTAwZjZjaHRlbi4NCi0NCi0jIE5ldyBQcm9jZXNzIENvbXBvbmVudCBEaWFsb2cNCi1uZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nX3RpdGxlPU5ldWUgUHJvemVzc2tvbXBvbmVudGUNCi1uYW1lTGFiZWxfdGV4dD1OYW1lOg0KLWRlZmF1bHRDb25maWdMYWJlbF90ZXh0PVN0YW5kYXJka29uZmlndXJhdGlvbjoNCi1iYXNlUHJvY2Vzc0xhYmVsX3RleHQ9QmFzaXNwcm96ZXNzOg0KLWJhc2VkT25Qcm9jZXNzZXNMYWJlbF90ZXh0PUJhc2llcnQgYXVmIFByb3plc3NlbjoNCi0NCi0jIFJvbGUgQXNzb2NpYXRpb24gRGlhbG9nDQotc2VsZWN0QXNzb2NpYXRpb25MYWJlbF90ZXh0PVp1b3JkbnVuZyBmXHUwMGZjciBkaWUgQXVmZ2FiZSAnJ3swfScnIGF1c3dcdTAwZTRobGVuDQotDQotIyBSZW1vdmUgQXNzb2NpYXRpb24gZGlhbG9nDQotcmVtb3ZlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD1adW9yZG51bmcgZW50ZmVybmVuDQotDQotIyBTZWxlY3QgVGVhbXMgRGlhbG9nDQotc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGU9VGVhbXMgYXVzd1x1MDBlNGhsZW4NCi1zZWxlY3RUZWFtc0RpYWxvZ190ZXh0PVdcdTAwZTRobGVuIFNpZSBlaW4gVGVhbSBhdXMsIGRlbSBTaWUgZWluZSBSb2xsZSAnJ3swfScnIHp1b3JkbmVuIG1cdTAwZjZjaHRlbi4NCi0NCi0jIFRhc2wgU2VsZWN0aW9uIERpYWxvZw0KLXRhc2tTZWxlY3Rpb25EaWFsb2dfdGl0bGU9QXVmZ2FiZW5hdXN3YWhsDQotdGl0bGVMYWJlbF90ZXh0PUF1ZmdhYmVuIGF1c3dcdTAwZTRobGVuLi4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDBFOiBEZXIgTmFtZSBmXHUwMGZjciB7MH0gZmVobHQuXG5cbkFsbGUgTWV0aG9kZW4tIHVuZCBQcm96ZXNzZWxlbWVudGUgbVx1MDBmY3NzZW4gZWluZW4gTmFtZW4gaGFiZW4uXG5cbkdlYmVuIFNpZSBlaW5lbiBnXHUwMGZjbHRpZ2VuIE5hbWVuIGVpbiB1bmQgd2llZGVyaG9sZW4gU2llIGRlbiBWb3JnYW5nLg0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPURlciBOYW1lIG11c3MgYW5nZWdlYmVuIHdlcmRlbi4gR2ViZW4gU2llIGVpbmVuIGdcdTAwZmNsdGlnZW4gTmFtZW4gYW4uDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDFFOiBEZXIgTmFtZSAnJ3swfScnIGlzdCBiZXJlaXRzIHZvcmhhbmRlbi5cblxuRWluIE1ldGhvZGVuZWxlbWVudCBtdXNzIGVpbmVuIGVpbmRldXRpZ2VuIE5hbWVuIGhhYmVuLlxuXG5HZWJlbiBTaWUgZWluZW4gYW5kZXJlbiBOYW1lbiBlaW4gdW5kIHdpZWRlcmhvbGVuIFNpZSBkZW4gVm9yZ2FuZy4NCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9RGVyIEVsZW1lbnRuYW1lIGlzdCBiZXJlaXRzIHZvcmhhbmRlbi4gR2ViZW4gU2llIGVpbmVuIGFuZGVyZW4gTmFtZW4gYW4uDQotaW52YWxpZEVsZW1lbnROYW1lRXJyb3IxX21zZz1JVVBMMDEwMkU6IERlciBOYW1lICcnezB9JycgaXN0IHVuZ1x1MDBmY2x0aWcuXG5cbkRlciBOYW1lIGVpbmVzIE1ldGhvZGVuZWxlbWVudHMgZGFyZiBuaWNodCBtaXQgZWluZW0gTGVlcnplaWNoZW4gYmVnaW5uZW4uXG5cbkdlYmVuIFNpZSBlaW5lbiBnXHUwMGZjbHRpZ2VuIE5hbWVuIGVpbiB1bmQgd2llZGVyaG9sZW4gU2llIGRlbiBWb3JnYW5nLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c9SVVQTDAxMDNFOiBEZXIgTmFtZSAnJ3swfScnIGlzdCB1bmdcdTAwZmNsdGlnLlxuXG5EZXIgTmFtZSBlaW5lcyBNZXRob2RlbmVsZW1lbnRzIGRhcmYgbmljaHQgbWl0IGVpbmVtIFB1bmt0IGVuZGVuLlxuXG5HZWJlbiBTaWUgZWluZW4gZ1x1MDBmY2x0aWdlbiBOYW1lbiBlaW4gdW5kIHdpZWRlcmhvbGVuIFNpZSBkZW4gVm9yZ2FuZy4NCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnPUlVUEwwMTA0RTogRGVyIE5hbWUgJyd7MH0nJyBpc3QgdW5nXHUwMGZjbHRpZy5cblxuRGllIGZvbGdlbmRlbiBaZWljaGVuIHNpbmQgaW4gTmFtZW4gZlx1MDBmY3IgTWV0aG9kZW5lbGVtZW50IG5pY2h0IHp1bFx1MDBlNHNzaWc6IFxcIC8gOiAqID8gIiA8ID4gOyB8XG5cbkdlYmVuIFNpZSBlaW5lbiBnXHUwMGZjbHRpZ2VuIE5hbWVuIGVpbiwgdW5kIHdpZWRlcmhvbGVuIFNpZSBkZW4gVm9yZ2FuZy4NCi1ub0NvbmZpZ0Vycm9yX21zZz1JVVBMMDEwNUU6IERpZSBha3R1ZWxsZSBNZXRob2RlbmJpYmxpb3RoZWsgZW50aFx1MDBlNGx0IGtlaW5lIE1ldGhvZGVua29uZmlndXJhdGlvbi5cblxuWnVtIEVyc3RlbGxlbiBlaW5lcyBuZXVlbiBQcm96ZXNzZXMgaXN0IGVpbmUgTWV0aG9kZW5rb25maWd1cmF0aW9uIGVyZm9yZGVybGljaC5cblxuRXJzdGVsbGVuIFNpZSBlaW5lIE1ldGhvZGVua29uZmlndXJhdGlvbiB1bmQgd2llZGVyaG9sZW4gU2llIGRlbiBWb3JnYW5nLg0KLW5vRGVsaXZlcnlQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA2RTogRGllIGFrdHVlbGxlIE1ldGhvZGVuYmlibGlvdGhlayBlbnRoXHUwMGU0bHQga2VpbmVuIEJlcmVpdHN0ZWxsdW5nc3Byb3plc3MuXG5cblp1bSBFcnN0ZWxsZW4gZWluZXMgbmV1ZW4gUHJvemVzc2JlaXRyYWdzIGlzdCBlaW4gQmFzaXNiZXJlaXRzdGVsbHVuZ3Nwcm96ZXNzIGVyZm9yZGVybGljaC5cblxuRXJzdGVsbGVuIFNpZSBlaW5lbiBCZXJlaXRzdGVsbHVuZ3Nwcm96ZXNzIHVuZCB3aWVkZXJob2xlbiBTaWUgZGVuIFZvcmdhbmcuDQotbm9EZWZhdWx0Q29uZmlnRXJyb3JfbXNnPUlVUEwwMTA3RTogRXMgd3VyZGUga2VpbmUgTWV0aG9kZW5rb25maWd1cmF0aW9uIGF1c2dld1x1MDBlNGhsdC5cblxuRGVtIG5ldWVuIFByb3plc3MgbXVzcyBlaW5lIFN0YW5kYXJkbWV0aG9kZW5rb25maWd1cmF0aW9uIHp1Z2VvcmRuZXQgd2VyZGVuLlxuXG5XXHUwMGU0aGxlbiBTaWUgZWluZSBNZXRob2RlbmtvbmZpZ3VyYXRpb24gYXVzIHVuZCB3aWVkZXJob2xlbiBTaWUgZGVuIFZvcmdhbmcuDQotbm9CYXNlUHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwOEU6IEVzIHd1cmRlIGtlaW4gQmVyZWl0c3RlbGx1bmdzcHJvemVzcyBhdXNnZXdcdTAwZTRobHQuXG5cbkVpbiBQcm96ZXNzYmVpdHJhZyBzZXR6dCBlaW5lbiBCYXNpc2JlcmVpdHN0ZWxsdW5nc3Byb3plc3Mgdm9yYXVzLlxuXG5XXHUwMGU0aGxlbiBTaWUgZWluZW4gQmVyZWl0c3RlbGx1bmdzcHJvemVzcyBhdXMgdW5kIHdpZWRlcmhvbGVuIFNpZSBkZW4gVm9yZ2FuZy4NCi1jcmVhdGVQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA5RTogRGVyIFByb3plc3Mga2FubiBuaWNodCBmZWhsZXJmcmVpIGVyc3RlbGx0IHdlcmRlbi4NCi1jcmVhdGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTEwRTogRGFzIEVsZW1lbnQga2FubiBuaWNodCBmZWhsZXJmcmVpIGVyc3RlbGx0IHdlcmRlbi4NCi1kZWxldGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTExRTogRGFzIEVsZW1lbnQga2FubiBuaWNodCBmZWhsZXJmcmVpIGdlbFx1MDBmNnNjaHQgd2VyZGVuLg0KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnPUlVUEwwMTEyRTogRGllIEluaGFsdHNkYXRlaSBmXHUwMGZjciBkYXMgRWxlbWVudCBrYW5uIG5pY2h0IGVyc3RlbGx0IHdlcmRlbi5cblxuRGllIERhdGVpICcnezB9JycgaXN0IGJlcmVpdHMgdm9yaGFuZGVuLlxuXG5HZWJlbiBTaWUgZWluZW4gYW5kZXJlbiBOYW1lbiBlaW4gdW5kIHdpZWRlcmhvbGVuIFNpZSBkZW4gVm9yZ2FuZy4NCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c9RXMgaXN0IGJlcmVpdHMgZWluZSBJbmhhbHRzZGF0ZWkgbWl0IGRpZXNlbSBOYW1lbiB2b3JoYW5kZW4uIEdlYmVuIFNpZSBlaW5lbiBhbmRlcmVuIE5hbWVuIGFuLg0KLXVuZG9Db21tYW5kRXJyb3JfbXNnPUlVUEwwMTEzRTogRGVyIFdpZGVycnVmYmVmZWhsICcnezB9Jycga2FubiBuaWNodCBhdXNnZWZcdTAwZmNocnQgd2VyZGVuLlxuXG5FcyBpc3QgZWluIEZlaGxlciBhdWZnZXRyZXRlbjogezF9DQotaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnPUlVUEwwMTE0RTogRGVyIGFuZ2VnZWJlbmUgVm9yZ1x1MDBlNG5nZXJpbmRleCBpc3QgdW5nXHUwMGZjbHRpZy5cblxuRWluIFZvcmdcdTAwZTRuZ2VyaW5kZXggbXVzcyBlaW4gZ2FuenphaGxpZ2VyIFdlcnQgYXVzIGRlciBTcGFsdGUgJ0luZGV4JyBzZWluLlxuXG5HZWJlbiBTaWUgZWluZW4gZ1x1MDBmY2x0aWdlbiBXZXJ0IGVpbiB1bmQgd2llZGVyaG9sZW4gU2llIGRlbiBWb3JnYW5nLg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHM9SVVQTDAxMDBXOiAnJ3swfScnIGlzdCBiZXJlaXRzICcnezF9JycgenVnZW9yZG5ldC4gRXMgaXN0IG51ciBlaW5lIFp1b3JkbnVuZyBkaWVzZXIgQXJ0IHp1bFx1MDBlNHNzaWcuIFdlbm4gU2llICcnezB9JycgJyd7Mn0nJyB6dW9yZG5lbiBtXHUwMGY2Y2h0ZW4sIG1cdTAwZmNzc2VuIFNpZSBkYXMgRWxlbWVudCBlcnN0IGF1cyAnJ3sxfScnIGVudGZlcm5lbi4NCi1lcnJvcl9tc2dXaXRoRGV0YWlscz1JVVBMMDExNkU6IEVzIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBLbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLg0KLWVycm9yX21zZz1JVVBMMDExN0U6IEVzIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBTdWNoZW4gU2llIGluIGRlciBQcm90b2tvbGxkYXRlaSBuYWNoIHdlaXRlcmVuIEVpbnplbGhlaXRlbi4NCi1TdXBwcmVzc2lvbl9uYW1lRHVwbGljYXRpb249SVVQTDAxMThFOiBOYWNoIGRpZXNlciBPcGVyYXRpb24gdHJpdHQgZWluZSBOYW1lbnN1bnZlcnRyXHUwMGU0Z2xpY2hrZWl0IGF1Zi4gXHUwMGRjYmVycHJcdTAwZmNmZW4gU2llLCBvYiBkZXIgRWxlbWVudG5hbWUgYmVyZWl0cyB2b3JoYW5kZW4gaXN0LCB1bmQgd2llZGVyaG9sZW4gU2llIGRhbm4gZGllIE9wZXJhdGlvbi4NCi1TdXBwcmVzc2lvbl9wcmVzZW50YXRpb25OYW1lRHVwbGljYXRpb249SVVQTDAxMTlFOiBOYWNoIGRpZXNlciBPcGVyYXRpb24gdHJpdHQgZWluZSBOYW1lbnN1bnZlcnRyXHUwMGU0Z2xpY2hrZWl0IGF1Zi4gXHUwMGRjYmVycHJcdTAwZmNmZW4gU2llLCBvYiBkZXIgUHJcdTAwZTRzZW50YXRpb25zbmFtZSBkZXMgRWxlbWVudHMgYmVyZWl0cyB2b3JoYW5kZW4gaXN0LCB1bmQgd2llZGVyaG9sZW4gU2llIGRhbm4gZGllIE9wZXJhdGlvbi4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249RXMgaXN0IGVpbiBGZWhsZXIgYXVmZ2V0cmV0ZW4uIEtsaWNrZW4gU2llIGF1ZiBEZXRhaWxzLCB1bSB3ZWl0ZXJlIEluZm9ybWF0aW9uZW4genUgZXJoYWx0ZW4uDQotc2F2ZVByb2Nlc3NFcnJvcl9yZWFzb249QmVpbSBTcGVpY2hlcm4gZGVzIFByb3plc3NlcyAnJ3swfScnIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBLbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLg0KLWRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb249QmVpbSBFbnRmZXJuZW4gZGVyIFJlZmVyZW56ZW4sIGRpZSBkaWVzZW0gRWxlbWVudCB6dWdlb3JkbmV0IHNpbmQsIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBLbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLg0KLXNhdmVGaWxlRXJyb3JfcmVhc29uPUJlaW0gU3BlaWNoZXJuIGRlciBEYXRlaSAnJ3swfScnIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBLbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLg0KLWludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uPUVzIHd1cmRlbiBNZXRob2RlbmVsZW1lbnRlIG1pdCB1bmdcdTAwZmNsdGlnZW4gUmVmZXJlbnplbiBnZWZ1bmRlbiwgZGllIGF1ZiBlaW5lIFBsdWctaW4tXHUwMGZjYmVyZ3JlaWZlbmRlIEtvcGllcm9wZXJhdGlvbiB6dXJcdTAwZmNja3p1Zlx1MDBmY2hyZW4gc2luZC5cbkRpZXNlIFJlZmVyZW56ZW4gd2VyZGVuIGVudGZlcm50LiBGb3J0ZmFocmVuPw0KLXVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb249RWluIG5pY2h0IGF1ZmdlbFx1MDBmNnN0ZXMgT2JqZWt0IGthbm4gbmljaHQgZ2VcdTAwZTRuZGVydCB3ZXJkZW46IHswfShVUkkgPSB7MX0pezJ9DQotDQotIyBXYXJuaW5nIG1lc3NhZ2VzDQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE4VzogTWluZGVzdGVucyBlaW4gUXVlbGxlbmVsZW1lbnQgd3VyZGUgbmljaHQgZ2VmdW5kZW4uIERpZSB6dWdlb3JkbmV0ZW4gRGF0ZWllbiBpbSBSZXNzb3VyY2Vub3JkbmVyIHdlcmRlbiBuaWNodCBrb3BpZXJ0Lg0KLUFjdGl2aXR5QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMTlXOiBNaW5kZXN0ZW5zIGVpbiBRdWVsbGVuZWxlbWVudCB3dXJkZSBuaWNodCBnZWZ1bmRlbi4gRGllIHp1Z2VvcmRuZXRlbiBQcm96ZXNzcGFrZXRlIHdlcmRlbiBuaWNodCBrb3BpZXJ0Lg0KLUFjdGl2aXR5RHJvcENvbW1hbmRfZGVlcENvcHlfcHJvbXB0Q29uZmlndXJhdGlvbk1zZz1NXHUwMGY2Y2h0ZW4gU2llIGFsbGUgRGVza3JpcHRvcmVuIGtvcGllcmVuP1xuXG5XZW5uIFNpZSBhdWYgTmVpbiBrbGlja2VuLCB3ZXJkZW4gbnVyIGRpZSBEZXNrcmlwdG9yZW4ga29waWVydCwgZGllIHp1ciBha3R1ZWxsZW4gS29uZmlndXJhdGlvbiBnZWhcdTAwZjZyZW4uDQotZGVlcENvcHlfcHJvbXB0TXNnPVNpZSBlcmhhbHRlbiBlaW5lIEtvcGllIGFsbGVyIGR5bmFtaXNjaCB2ZXJrblx1MDBmY3BmdGVuIEVsZW1lbnRlLCBkaWUgU2llIGFiIHNvZm9ydCBzZXBhcmF0IHZlcndhbHRlbiBtXHUwMGZjc3Nlbi4gRm9ydGZhaHJlbj8NCi1kZWVwQ29weV90aXRsZT1UaWVmZSBLb3BpZQ0KLQ0KLSMgUHJvZ3Jlc3MgbWVzc2FnZXMNCi1jcmVhdGluZ1Byb2Nlc3NDb21wb25lbnRUYXNrX25hbWU9UHJvemVzc2tvbXBvbmVudGUgJyd7MH0nJyB3aXJkIGVyc3RlbGx0Li4uDQotcHJvY2Vzc2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9UmVmZXJlbnplbiB3ZXJkZW4gdmVyYXJiZWl0ZXQuLi4NCi1kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lPUVsZW1lbnRlIHVuZCB6dWdlb3JkbmV0ZSBEYXRlaWVuIHdlcmRlbiBnZWxcdTAwZjZzY2h0Li4uDQotY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lPVJlZmVyZW56ZW4gd2VyZGVuIGdlc3VjaHQuLi4NCi1yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU9UmVmZXJlbnplbiB3ZXJkZW4gZW50ZmVybnQuLi4NCi1zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lPUdlXHUwMGU0bmRlcnRlIERhdGVpZW4gd2VyZGVuIGdlc3BlaWNoZXJ0Li4uDQotY2hlY2tBZmZlY3RlZFJlc291cmNlc1Rhc2tfbmFtZT1CZXRyb2ZmZW5lIFJlc3NvdXJjZW4gd2VyZGVuIGdlcHJcdTAwZmNmdC4uLg0KLW1vdmluZ1Rhc2tfbmFtZT1WZXJzY2hpZWJlbi4uLg0KLW1vdmluZ0ZpbGVzVGFza19uYW1lPURhdGVpZW4gd2VyZGVuIHZlcnNjaG9iZW4uLi4NCi1jb3B5aW5nUmVzb3VyY2VzVGFza19uYW1lPVJlc3NvdXJjZW4gd2VyZGVuIGtvcGllcnQuLi4NCi1jb3B5aW5nQWN0aXZpdGllc19tc2c9QWt0aXZpdFx1MDBlNHQgJyd7MH0nJyB3aXJkIGtvcGllcnQNCi1zYXZpbmdGaWxlVGFza19uYW1lPURhdGVpICcnezB9Jycgd2lyZCBnZXNwZWljaGVydC4uLg0KLQ0KLSMgVUkgVGV4dA0KLWVsZW1lbnRfdGV4dD1FbGVtZW50DQotY3JlYXRlRWxlbWVudF90ZXh0PUVsZW1lbnQgZXJzdGVsbGVuDQotY3JlYXRlUHJvY2Vzc190ZXh0PVByb3plc3MgZXJzdGVsbGVuDQotY29udHJpYnV0ZXNUb190ZXh0PUJlaXRyYWcgenUNCi1sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dD1Mb2thbGVyIEJlaXRyYWcgenUNCi1leHRlbmRzX3RleHQ9RXJ3ZWl0ZXJ1bmcNCi1yZXBsYWNlc190ZXh0PUVyc2V0enVuZw0KLWxvY2FsUmVwbGFjZXNfdGV4dD1Mb2thbGUgRXJzZXR6dW5nIGZcdTAwZmNyDQotbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5X3RleHQ9TG9rYWxlIEVyc2V0enVuZyB1bmQgdGllZmUgS29waWUNCi1lbGVtZW50VHlwZV90ZXh0PXswfTogezF9DQotZGVsaXZlcmFibGVzX3RleHQ9TGllZmVyZ2VnZW5zdFx1MDBlNG5kZQ0KLWNvbnRyaWJ1dGVUb0FjdGl2aXR5X3RleHQ9QmVpdHJhZyB6dSBBa3Rpdml0XHUwMGU0dA0KLUFjdGl2aXR5RHJvcENvbW1hbmRfbGFiZWw9QWt0aXZpdFx1MDBlNHQgbFx1MDBmNnNjaGVuDQotcmVwbGFjZUFjdGl2aXR5X3RleHQ9QWt0aXZpdFx1MDBlNHQgZXJzZXR6ZW4NCi1maWxlX3RleHQ9RGF0ZWkNCi1kaXJlY3RvcnlfdGV4dD1WZXJ6ZWljaG5pcw0KLXVucmVzb2x2ZWRfdGV4dD0oJyd7MH0nJyBuaWNodCBhdWZnZWxcdTAwZjZzdCkNCi1hc3Npc3RzX3RleHQ9VW50ZXJzdFx1MDBmY3R6dA0KLXVua25vd25fdGV4dD1VbmJla2FubnQNCi1jb21tYW5kX2RvbmU9RmVydGlnDQotDQotIyBUaGUgZm9sbG93aW5nIFVJIHRleHQgc2hvdWxkIGJlIHJldmlld2VkLg0KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5d2l0aHBsdWdpbl9pbmZvPXswfSAoezF9ICcnezJ9JycgaW4gJyd7M30nJykNCi1VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eV9pbmZvPXswfSAoezF9ICcnezJ9JycpDQotdWlfcmVmX2RlbGV0ZT1EZXIgRGVza3JpcHRvciAnJ3swfScnIGhhdCBkaWUgZm9sZ2VuZGVuIFJlZmVyZW56ZW4sIGRpZSBuaWNodCB2ZXJ3ZW5kZXQgd2VyZGVuLlxuV1x1MDBlNGhsZW4gU2llIGRpZSBSZWZlcmVuemVuIGF1cywgZGllIFNpZSBsXHUwMGY2c2NoZW4gbVx1MDBmNmNodGVuOg0KLXVpX3JlZl9kZWxldGUyPURpZSBmb2xnZW5kZW4gUmVmZXJlbnplbiB3ZXJkZW4gbmljaHQgdmVyd2VuZGV0LlxuV1x1MDBlNGhsZW4gU2llIGRpZSBSZWZlcmVuemVuIGF1cywgZGllIFNpZSBsXHUwMGY2c2NoZW4gbVx1MDBmNmNodGVuOg0KLXVpX3JlZmVyZW5jZXM9UmVmZXJlbnplbg0KLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249RGVyIEFyYmVpdHNlcmdlYm5pc2Rlc2tyaXB0b3IgJyd7MH0nJyBpc3QgKGRlciBBdXNnYWJlIHZvbikgQXVmZ2FiZW5kZXNrcmlwdG9yICcnezF9JycgenVnZW9yZG5ldC4NCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3Jfb3B0aW9ucz1PcHRpb25lbg0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbD1BcmJlaXRzZXJnZWJuaXNkZXNrcmlwdG9yIGFscyBBdXNnYWJlIGRlcyBBdWZnYWJlbmRlc2tyaXB0b3JzIGVudGZlcm5lbg0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9kZWxldGVfdGFzaz1BdWZnYWJlbmRlc2tyaXB0b3IgYXVzIEFrdGl2aXRcdTAwZTR0IGxcdTAwZjZzY2hlbg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2s9RGFzIGF1c2dld1x1MDBlNGhsdGUgRWxlbWVudCAnJ3swfScnIGlzdCBuaWNodCBpbiBkZXIgU3RhbmRhcmRrb25maWd1cmF0aW9uIGRlcyBQcm96ZXNzZXMgZW50aGFsdGVuLlxuTVx1MDBmNmNodGVuIFNpZSBkYXMgRWxlbWVudCB1bmQgZGllIEFiaFx1MDBlNG5naWdrZWl0ZW4gZGVyIFN0YW5kYXJka29uZmlndXJhdGlvbiBoaW56dWZcdTAwZmNnZW4/DQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2dlbmVyaWNFcnJfbWVzc2FnZV90ZXh0PUVzIHNpbmQgRmVobGVyIGluIGRlciBPcGVyYXRpb24gYXVmZ2V0cmV0ZW4uIEtsaWNrZW4gU2llIGF1ZiBEZXRhaWxzLCB1bSB3ZWl0ZXJlIEluZm9ybWF0aW9uZW4genUgZXJoYWx0ZW4uDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoPUVzIHd1cmRlIGtlaW4gRGVza3JpcHRvciBtaXQgZGVtIHZlcmxpbmt0ZW4gTWV0aG9kZW5lbGVtZW50IGdlZnVuZGVuLCBkZXIgc3luY2hyb25pc2llcnQgd2VyZGVuIGtcdTAwZjZubnRlLg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXI9RmVobGVyIGJlaW0gQWt0dWFsaXNpZXJlbiBkZXMgVmlld2VyDQotY29uZmlybV9yZW1vdmVfcmVmZXJlbmNlc190ZXh0PURpZSB1bnRlciBEZXRhaWxzIGF1ZmdlZlx1MDBmY2hydGVuIEVsZW1lbnRlIGVudGhhbHRlbiBuYWNoIGRlciBLb252ZXJ0aWVydW5nIG1cdTAwZjZnbGljaGVyd2Vpc2UgdW5nXHUwMGZjbHRpZ2UgUmVmZXJlbnplbiBhdWYgZGllc2UgQW5sZWl0dW5nLiBLbGlja2VuIFNpZSBhdWYgT0ssIHdlbm4gU2llIHNpZSBsXHUwMGY2c2NoZW4gdW5kIGZvcnRmYWhyZW4gbVx1MDBmNmNodGVuLg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3VuaGFuZGxlZF9leGNlcHRpb249TmljaHQgYmVoYW5kZWx0ZSBBdXNuYWhtZQ0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfYnJlYWtkb3duX2VsZW1lbnQ9RWluIFN0cnVrdHVyZWxlbWVudCBrYW5uIG5pY2h0IGdsZWljaHplaXRpZyBWb3JnXHUwMGU0bmdlciB1bmQgTmFjaGZvbGdlciBzZWluLg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93cGxpc3RkbGdfbXNnPURhcyBBcmJlaXRzZXJnZWJuaXMgJyd7MH0nJyBpc3QgZWluZSBBdXNnYWJlIGZcdTAwZmNyIGRpZSBmb2xnZW5kZW4gQXVmZ2FiZW4uXG5XXHUwMGU0aGxlbiBTaWUgZGllIEF1ZmdhYmVuIGF1cywgZlx1MDBmY3IgZGllIFNpZSBkaWUgZW50c3ByZWNoZW5kZW4gRGVza3JpcHRvcmVuIGVyc3RlbGxlbiBtXHUwMGY2Y2h0ZW4uDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZz1EaWUgUm9sbGUgJyd7MH0nJyBpc3QgZlx1MDBmY3IgZGllIGZvbGdlbmRlbiBBcmJlaXRzZXJnZWJuaXNzZSB2ZXJhbnR3b3J0bGljaC5cbldcdTAwZTRobGVuIFNpZSBkaWUgQXJiZWl0c2VyZ2Vibmlzc2UgYXVzLCBmXHUwMGZjciBkaWUgU2llIGRpZSBlbnRzcHJlY2hlbmRlbiBEZXNrcmlwdG9yZW4gZXJzdGVsbGVuIG1cdTAwZjZjaHRlbi4NCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9mYXRhbGVycj1TY2h3ZXJ3aWVnZW5kZXIgRmVobGVyDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dvcmtwcm9kdWN0cz1BcmJlaXRzZXJnZWJuaXNzZQ0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfc3ViX2VsZW1lbnQ9RWluIFN0cnVrdHVyZWxlbWVudCBrYW5uIG5pY2h0IG1pdCBlaW5lbSBzZWluZXIgVW50ZXJlbGVtZW50ZSB2ZXJsaW5rdCB3ZXJkZW4uDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudD1WZXJsaW5rZW4gaXN0IG51ciBtaXQgZWluZW0gUHJvamVrdHN0cnVrdHVyZWxlbWVudCBtXHUwMGY2Z2xpY2guDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfY2hpbGRfZWxlbWVudD1FaW4gU3RydWt0dXJlbGVtZW50IGthbm4gbmljaHQgbWl0IGVpbmVtIHNlaW5lciBVbnRlcmVsZW1lbnRlIHZlcmxpbmt0IHdlcmRlbi4NCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfdGFza3M9QXVmZ2FiZW4NCi11aV9hc3NvY2lhdGlvbl90YXNrX3NlbGVjdGlvbj1BdWZnYWJlbmF1c3dhaGwuLi4NCi11dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlcj1cIFwgdW50ZXJnZW9yZG5ldGVyIEFkYXB0ZXI6IA0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NldHBhcmVudD1cdTAwZGNiZXJnZW9yZG5ldGVyIEVpbnRyYWcgZlx1MDBmY3IgRWludHJhZyBrb25udGUgbmljaHQgZ2VzZXR6dCB3ZXJkZW4uDQotdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlPVJlc3NvdXJjZSBrYW5uIG5pY2h0IGJlYXJiZWl0ZXQgd2VyZGVuLg0KLXV0aWxfUHJvY2Vzc1V0aWxfY29udHJpYnV0ZXN0bz1pc3QgZWluIEJlaXRyYWcgenUgJyd7MH0nJw0KLXV0aWxfUHJvY2Vzc1V0aWxfbG9jYWxDb250cmlidXRlc3RvPUxva2FsZXIgQmVpdHJhZyBmXHUwMGZjciAnJ3swfScnDQotcHJvY2Vzc19leHRlbmRzPUVyd2VpdGVydW5nIGZcdTAwZmNyICcnezB9JycNCi1wcm9jZXNzX3JlcGxhY2VzPWVyc2V0enQgJyd7MH0nJw0KLXByb2Nlc3NfbG9jYWxSZXBsYWNlcz1Mb2thbGUgRXJzZXR6dW5nIGZcdTAwZmNyICcnezB9JycNCi0jIEZpbHRlciBjb25zdGFudHMgZXh0ZXJuYWxpemVkIHN0cmluZ3MuDQotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVzX3RleHQ9RGlzemlwbGluZW4NCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZWdyb3VwaW5nc190ZXh0PVp1c2FtbWVuZmFzc3VuZ2VuIHZvbiBEaXN6aXBsaW5lbg0KLUZpbHRlckNvbnN0YW50c193aGl0ZXBhcGVyc190ZXh0PVdoaXRlIFBhcGVyDQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xtZW50b3JzX3RleHQ9VG9vbG1lbnRvcmVuDQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ9VG9vbHMNCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNfdGV4dD1Sb2xsZW4NCi1GaWx0ZXJDb25zdGFudHNfdGFza3NfdGV4dD1BdWZnYWJlbg0KLUZpbHRlckNvbnN0YW50c19yZXVzYWJsZWFzc2V0c190ZXh0PVdpZWRlcnZlcndlbmRiYXJlIEFzc2V0cw0KLUZpbHRlckNvbnN0YW50c19hbGxfdGV4dD1BbGxlDQotRmlsdGVyQ29uc3RhbnRzX3Byb2Nlc3Nlc190ZXh0PVByb3plc3NlDQotRmlsdGVyQ29uc3RhbnRzX3ByYWN0aWNlc190ZXh0PVZlcmZhaHJlbg0KLUZpbHRlckNvbnN0YW50c190ZW1wbGF0ZXNfdGV4dD1Wb3JsYWdlbg0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHNfdGV4dD1BcmJlaXRzZXJnZWJuaXNzZQ0KLUZpbHRlckNvbnN0YW50c19jaGVja2xpc3RzX3RleHQ9UHJcdTAwZmNmbGlzdGVuDQotRmlsdGVyQ29uc3RhbnRzX2d1aWRlbGluZXNfdGV4dD1SaWNodGxpbmllbg0KLUZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0PVJvbGxlbmdydXBwZW4NCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dD1BbmxlaXR1bmcNCi1GaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dD1Lb256ZXB0ZQ0KLUZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0PUJlaXNwaWVsZQ0KLUZpbHRlckNvbnN0YW50c19jb250ZW50cGFja2FnZXNfdGV4dD1JbmhhbHRzcGFrZXRlDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0PVJvbGxlbmRlc2tyaXB0b3Jlbg0KLUZpbHRlckNvbnN0YW50c19yb2xlc2V0Z3JvcHVpbmdzX3RleHQ9WnVzYW1tZW5mYXNzdW5nZW4gdm9uIFJvbGxlbmdydXBwZW4NCi1GaWx0ZXJDb25zdGFudHNfdGFza2Rlc2NyaXB0b3JzX3RleHQ9QXVmZ2FiZW5kZXNrcmlwdG9yZW4NCi1GaWx0ZXJDb25zdGFudHNfY29udGVudGVsZW1lbnRzX3RleHQ9SW5oYWx0c2VsZW1lbnRlDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9wcmVwYXJlPVN5bmNocm9uaXNhdGlvbiB3aXJkIHZvcmJlcmVpdGV0Li4uDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnNfdGV4dD1BcmJlaXRzZXJnZWJuaXNkZXNrcmlwdG9yZW4NCi1GaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ9QWxsZSBJbmhhbHRzZWxlbWVudGUNCi1GaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0PVVudGVyc3RcdTAwZmN0emVuZGVzIE1hdGVyaWFsDQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlcz1GZWhsZXIgYmVpbSBTcGVpY2hlcm4gZGVyIERhdGVpKGVuKQ0KLUZpbHRlckNvbnN0YW50c19jdXN0b21jYXRlZ29yaWVzX3RleHQ9QW5nZXBhc3N0ZSBLYXRlZ29yaWVuDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0dHlwZXNfdGV4dD1BcnRlbiB2b24gQXJiZWl0c2VyZ2Vibmlzc2VuDQotRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZz1MXHUwMGY2c2Nodm9yZ2FuZyBtaXQgV2FybnVuZyBhYmdlc2NobG9zc2VuDQotRmlsdGVyQ29uc3RhbnRzX21ldGhvZHBsdWdpbnNfdGV4dD1NZXRob2Rlbi1QbHVnLWlucw0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9sb2NrZWRQbHVnaW49SVVQTDAxMjBFOiBEYXMgUGx1Zy1pbiAnJ3swfScnIGlzdCBnZXNwZXJydC4NCi1GaWx0ZXJDb25zdGFudHNfZG9tYWluc190ZXh0PURvbVx1MDBlNG5lbg0KLUZpbHRlckNvbnN0YW50c19yb2FkbWFwX3RleHQ9Um9hZG1hcHMNCi1GaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0PUJlcmljaHRlDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbD0mU3RhbmRhcmRzeW5jaHJvbmlzYXRpb25zIGF1cyBNZXRob2RlbmluaGFsdA0KLU1hbnVhbFN5bmNocm9uaXplQ29tbWFuZF9sYWJlbD1BbmdlcGFzc3RlIFN5bmNocm9uJmlzYXRpb24uLi4NCi1BdXRvU3luY2hyb25pemVDb21tYW5kX3N1Y2Vzc2Z1bD1EaWUgU3luY2hyb25pc2F0aW9uIHd1cmRlIGZlaGxlcmZyZWkgZHVyY2hnZWZcdTAwZmNocnQuDQotDQotIyBVc2VySW50ZXJhY3Rpb25IZWxwZXINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZT1OYW1lOg0KLQ0KLSMgTWV0aG9kQ3JlYXRlQ2hpbGRDb21tYW5kDQotbmV3RWxlbWVudF90ZXh0PXswfSAtIE5ldQ0KLXVwZGF0ZV9vdXRvZnN5bmNoX3RpdGxlPUFrdHVhbGlzaWVydW5nc2tvbmZsaWt0DQotdXBkYXRlX291dG9mc3luY2hfbXNnPURpZSBEYXRlaShlbikgd3VyZGUobikgaW0gRGF0ZWlzeXN0ZW0gZ2VcdTAwZTRuZGVydC4gTVx1MDBmNmNodGVuIFNpZSBkaWUgXHUwMGM0bmRlcnVuZ2VuIHNwZWljaGVybj8NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTJiMGY4Yy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgR2VuZXJpYyBEaWFsb2cgVGl0bGVzDQotbW92ZURpYWxvZ190aXRsZT1Nb3Zlcg0KLWRlbGV0ZURpYWxvZ190aXRsZT1TdXByaW1pciBlbGVtZW50bw0KLWVycm9yRGlhbG9nX3RpdGxlPUVycm9yDQotZXJyb3JEaWFsb2dfY2Fubm90UmVuYW1lPU5vIHNlIHB1ZWRlIGNhbWJpYXIgZWwgbm9tYnJlIGRlIHswfSAnJ3sxfScnIHBvciAnJ3syfScnLiBTb2x1Y2lvbmUgZWwgcHJvYmxlbWEgcXVlIHNlIG11ZXN0cmEgZW4gZGV0YWxsZXMgeSBwdWxzZSBBY2VwdGFyIHBhcmEgY29udGludWFyIG8gQ2FuY2VsYXIgcGFyYSBjYW5jZWxhciBsYSBvcGVyYWNpXHUwMGYzbiBhbm9ybWFsbWVudGUuDQotDQotIyBDb25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbCBEaWFsb2cNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlPUNvbmZpcm1hciBlbGltaW5hY2lcdTAwZjNuIGRlIHJlZmVyZW5jaWFzDQotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190ZXh0PUVsIGVsZW1lbnRvIHF1ZSBlc3RcdTAwZTEgYSBwdW50byBkZSBzdXByaW1pciB0b2Rhdlx1MDBlZGEgdGllbmUgcmVmZXJlbmNpYXMgZGUgb3Ryb3MgZWxlbWVudG9zIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLiBTaSBzdXByaW1lIGVzdG9zIGVsZW1lbnRvcywgc2Ugc3VwcmltaXJcdTAwZTFuIHRvZGFzIGxhcyByZWZlcmVuY2lhcyBhIGVsbG9zLCBwb3IgbG8gcXVlIHRhbWJpXHUwMGU5biBzZSBhY3R1YWxpemFyXHUwMGUxbiBsb3MgZWxlbWVudG9zIHF1ZSBoYWNlbiBsYSByZWZlcmVuY2lhLiAgQXNlZ1x1MDBmYXJlc2UgZGUgcXVlIHRpZW5lIHBlcm1pc28gcGFyYSBhY3R1YWxpemFyIGxvcyBlbGVtZW50b3MgcXVlIGhhY2VuIHJlZmVyZW5jaWEgYW50ZXMgZGUgcHVsc2FyIEFjZXB0YXIuICBQdWxzZSBEZXRhbGxlcyBwYXJhIHJldmlzYXIgbGEgbGlzdGEgZGUgZWxlbWVudG9zIHF1ZSBoYWNlbiByZWZlcmVuY2lhIGFsIGVsZW1lbnRvIHF1ZSB2YSBhIHN1cHJpbWlyLg0KLQ0KLSMgUmVzb2x2ZSBOYW1lIENvbmZsaWN0IERpYWxvZw0KLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGl0bGU9UmVzb2x2ZXIgY29uZmxpY3RvIGRlIG5vbWJyZXMgZGUgZWxlbWVudG8NCi1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQ9RXNjcmliYSB1biB7MH0gbnVldm8gcGFyYSAnJ3sxfScnOg0KLQ0KLSMgU2VsZWN0IERlbGl2ZXJhYmxlcyBEaWFsb2cNCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGl0bGU9U2VsZWNjaW9uYXIgcHJvZHVjdG9zIGZpbmFsZXMNCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGV4dD1TZWxlY2Npb25lIHVuIHByb2R1Y3RvIGZpbmFsIGRvbmRlIGRlc2VlIHF1ZSBzZSBhc2lnbmUgZWwgcHJvZHVjdG8gZGUgdHJhYmFqbyAnJ3swfScnLg0KLQ0KLSMgTmV3IFByb2Nlc3MgQ29tcG9uZW50IERpYWxvZw0KLW5ld1Byb2Nlc3NDb21wb25lbnREaWFsb2dfdGl0bGU9TnVldm8gY29tcG9uZW50ZSBkZWwgcHJvY2Vzbw0KLW5hbWVMYWJlbF90ZXh0PU5vbWJyZToNCi1kZWZhdWx0Q29uZmlnTGFiZWxfdGV4dD1Db25maWd1cmFjaVx1MDBmM24gcG9yIG9taXNpXHUwMGYzbjoNCi1iYXNlUHJvY2Vzc0xhYmVsX3RleHQ9UHJvY2VzbyBiXHUwMGUxc2ljbzoNCi1iYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dD1CYXNhZG8gZW4gcHJvY2Vzb3M6DQotDQotIyBSb2xlIEFzc29jaWF0aW9uIERpYWxvZw0KLXNlbGVjdEFzc29jaWF0aW9uTGFiZWxfdGV4dD1TZWxlY2Npb25lIHVuYSBhc29jaWFjaVx1MDBmM24gcGFyYSBsYSB0YXJlYSAnJ3swfScnDQotDQotIyBSZW1vdmUgQXNzb2NpYXRpb24gZGlhbG9nDQotcmVtb3ZlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD1FbGltaW5hciBhc29jaWFjaVx1MDBmM24NCi0NCi0jIFNlbGVjdCBUZWFtcyBEaWFsb2cNCi1zZWxlY3RUZWFtc0RpYWxvZ190aXRsZT1TZWxlY2Npb25hciBlcXVpcG9zDQotc2VsZWN0VGVhbXNEaWFsb2dfdGV4dD1TZWxlY2Npb25lIHVuIGVxdWlwbyBkb25kZSBkZXNlZSBxdWUgc2UgYXNpZ25lIHVuIHJvbCAnJ3swfScnLg0KLQ0KLSMgVGFzbCBTZWxlY3Rpb24gRGlhbG9nDQotdGFza1NlbGVjdGlvbkRpYWxvZ190aXRsZT1TZWxlY2NpXHUwMGYzbiBkZSB0YXJlYXMNCi10aXRsZUxhYmVsX3RleHQ9U2VsZWNjaW9uZSBsYXMgdGFyZWFzLi4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDBFOiBGYWx0YSBlbCBub21icmUgZGUgezB9LlxuXG5Ub2RvcyBsb3MgZWxlbWVudG9zIGRlIHByb2Nlc28geSBtXHUwMGU5dG9kbyBkZWJlbiB0ZW5lciB1biBub21icmUuXG5cbkVzY3JpYmEgdW4gbm9tYnJlIHZcdTAwZTFsaWRvIHkgdnVlbHZhIGEgaW50ZW50YXJsby4NCi1lbXB0eUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1FbCBub21icmUgbm8gcHVlZGUgZXN0YXIgdmFjXHUwMGVkby4gRXNwZWNpZmlxdWUgdW4gbm9tYnJlIHZcdTAwZTFsaWRvLg0KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAxRTogRWwgbm9tYnJlICcnezB9JycgeWEgZXhpc3RlLiBcblxuVW4gZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gZGViZSB0ZW5lciB1biBub21icmUgZXhjbHVzaXZvLlxuXG5Fc2NyaWJhIHVuIG5vbWJyZSBkaWZlcmVudGUgeSB2dWVsdmEgYSBpbnRlbnRhcmxvLg0KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1ZYSBleGlzdGUgZWwgbWlzbW8gbm9tYnJlIGRlIGVsZW1lbnRvLiBFc3BlY2lmaXF1ZSBvdHJvIG5vbWJyZS4NCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjFfbXNnPUlVUEwwMTAyRTogRWwgbm9tYnJlICcnezB9Jycgbm8gZXMgdlx1MDBlMWxpZG8uXG5cblVuIG5vbWJyZSBkZSBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyBubyBwdWVkZSBlbXBlemFyIGNvbiB1biBlc3BhY2lvLlxuXG5Fc2NyaWJhIHVuIG5vbWJyZSB2XHUwMGUxbGlkbyB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotaW52YWxpZEVsZW1lbnROYW1lRXJyb3IyX21zZz1JVVBMMDEwM0U6IEVsIG5vbWJyZSAnJ3swfScnIG5vIGVzIHZcdTAwZTFsaWRvLlxuXG5VbiBub21icmUgZGUgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gbm8gcHVlZGUgdGVybWluYXIgY29uIHVuIHB1bnRvLlxuXG5Fc2NyaWJhIHVuIG5vbWJyZSB2XHUwMGUxbGlkbyB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotaW52YWxpZEVsZW1lbnROYW1lRXJyb3IzX21zZz1JVVBMMDEwNEU6IEVsIG5vbWJyZSAnJ3swfScnIG5vIGVzIHZcdTAwZTFsaWRvLlxuXG5VbiBub21icmUgZGUgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gbm8gcHVlZGUgY29udGVuZXIgZXN0b3MgY2FyYWN0ZXJlczogXFwgLyA6ICogPyAiIDwgPiA7IHxcblxuRXNjcmliYSB1biBub21icmUgdlx1MDBlMWxpZG8geSB2dWVsdmEgYSBpbnRlbnRhcmxvLg0KLW5vQ29uZmlnRXJyb3JfbXNnPUlVUEwwMTA1RTogTGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYWN0dWFsIG5vIGNvbnRpZW5lIG5pbmd1bmEgY29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvLlxuXG5FcyBuZWNlc2FyaWEgdW5hIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbyBwYXJhIGNyZWFyIHVuIHByb2Nlc28gbnVldm8uXG5cbkNyZWUgdW5hIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbyB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotbm9EZWxpdmVyeVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDZFOiBMYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhY3R1YWwgbm8gY29udGllbmUgbmluZ1x1MDBmYW4gcHJvY2VzbyBkZSBlbnRyZWdhLlxuXG5FcyBuZWNlc2FyaW8gdW4gcHJvY2VzbyBkZSBlbnRyZWdhIGJcdTAwZTFzaWNvIHBhcmEgY3JlYXIgdW5hIGNvbnRyaWJ1Y2lcdTAwZjNuIG51ZXZhIGFsIHByb2Nlc28uXG5cbkNyZWUgdW4gcHJvY2VzbyBkZSBlbnRyZWdhIHkgdnVlbHZhIGEgaW50ZW50YXJsby4NCi1ub0RlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQTDAxMDdFOiBObyBzZSBoYSBzZWxlY2Npb25hZG8gbmluZ3VuYSBjb25maWd1cmFjaVx1MDBmM24gZGUgbVx1MDBlOXRvZG8uXG5cbkRlYmUgYXNpZ25hciB1bmEgY29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvIHBvciBvbWlzaVx1MDBmM24gYWwgcHJvY2VzbyBudWV2by5cblxuU2VsZWNjaW9uZSB1bmEgY29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvIHkgdnVlbHZhIGEgaW50ZW50YXJsby4NCi1ub0Jhc2VQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA4RTogTm8gc2UgaGEgc2VsZWNjaW9uYWRvIG5pbmdcdTAwZmFuIHByb2Nlc28gZGUgZW50cmVnYS5cblxuVW5hIGNvbnRyaWJ1Y2lcdTAwZjNuIGFsIHByb2Nlc28gcmVxdWllcmUgdW4gcHJvY2VzbyBkZSBlbnRyZWdhIGJcdTAwZTFzaWNvLlxuXG5TZWxlY2Npb25lIHVuIHByb2Nlc28gZGUgZW50cmVnYSB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotY3JlYXRlUHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwOUU6IE5vIHNlIHB1ZWRlIGNyZWFyIGVsIHByb2Nlc28gc2F0aXNmYWN0b3JpYW1lbnRlLg0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9tc2c9SVVQTDAxMTBFOiBObyBzZSBwdWVkZSBjcmVhciBlbCBlbGVtZW50byBzYXRpc2ZhY3RvcmlhbWVudGUuDQotZGVsZXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMUU6IE5vIHNlIHB1ZWRlIHN1cHJpbWlyIGVsIGVsZW1lbnRvIHNhdGlzZmFjdG9yaWFtZW50ZS4NCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX21zZz1JVVBMMDExMkU6IE5vIHNlIHB1ZWRlIGNyZWFyIGVsIGFyY2hpdm8gZGUgY29udGVuaWRvIHBhcmEgZWwgZWxlbWVudG8uXG5cbllhIGV4aXN0ZSB1biBhcmNoaXZvICcnezB9JycuXG5cbkVzY3JpYmEgdW4gbm9tYnJlIGRpZmVyZW50ZSB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9zaW1wbGVfbXNnPVlhIGV4aXN0ZSB1biBhcmNoaXZvIGRlIGNvbnRlbmlkbyBjb24gZWwgbWlzbW8gbm9tYnJlLiBFc3BlY2lmaXF1ZSBvdHJvIG5vbWJyZS4NCi11bmRvQ29tbWFuZEVycm9yX21zZz1JVVBMMDExM0U6IEVsIG1hbmRhdG8gZGUgZGVzaGFjZXIgJyd7MH0nJyBubyBzZSBwdWVkZSBjb21wbGV0YXIuXG5cblNlIGhhIHByb2R1Y2lkbyB1biBlcnJvcjogezF9DQotaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnPUlVUEwwMTE0RTogRWwgXHUwMGVkbmRpY2UgZGUgcHJlZGVjZXNvciBlc3BlY2lmaWNhZG8gbm8gZXMgdlx1MDBlMWxpZG8uXG5cblVuIFx1MDBlZG5kaWNlIGRlIHByZWRlY2Vzb3IgZGViZSBzZXIgdW4gdmFsb3IgZW50ZXJvIGRlIGxhIGNvbHVtbmEgJ1x1MDBjZG5kaWNlJy5cblxuRXNwZWNpZmlxdWUgdW4gdmFsb3Igdlx1MDBlMWxpZG8geSB2dWVsdmEgYSBpbnRlbnRhcmxvLg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHM9SVVQTDAxMDBXOiAnJ3swfScnIHlhIGVzdFx1MDBlMSBhc29jaWFkbyBhICcnezF9JycuICBTXHUwMGYzbG8gc2UgcGVybWl0ZSB1bmEgYXNvY2lhY2lcdTAwZjNuIGRlIGVzdGEgY2xhc2UuICBQYXJhIGFzaWduYXIgJyd7MH0nJyBhICcnezJ9JycsIGFudGVzIGRlYmUgZWxpbWluYXJsbyBkZSAnJ3sxfScnLg0KLWVycm9yX21zZ1dpdGhEZXRhaWxzPUlVUEwwMTE2RTogU2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yLiBQdWxzZSBlbiBEZXRhbGxlcyBwYXJhIG9idGVuZXIgbVx1MDBlMXMgaW5mb3JtYWNpXHUwMGYzbi4NCi1lcnJvcl9tc2c9SVVQTDAxMTdFOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IuIENvbnN1bHRlIGVsIHJlZ2lzdHJvIGRlIGVycm9yZXMgcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGRldGFsbGVzLg0KLVN1cHByZXNzaW9uX25hbWVEdXBsaWNhdGlvbj1JVVBMMDExOEU6IFNlIHByb2R1Y2UgdW4gY29uZmxpY3RvIGRlIG5vbWJyZXMgZGVzcHVcdTAwZTlzIGRlIGVzdGEgb3BlcmFjaVx1MDBmM24uIENvbXBydWViZSBlbCBub21icmUgZGVsIGVsZW1lbnRvIHBhcmEgdmVyIGxhIGR1cGxpY2FjaVx1MDBmM24geSB2dWVsdmEgYSBpbnRlbnRhcmxvDQotU3VwcHJlc3Npb25fcHJlc2VudGF0aW9uTmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE5RTogU2UgcHJvZHVjZSB1biBjb25mbGljdG8gZGUgbm9tYnJlcyBkZXNwdVx1MDBlOXMgZGUgZXN0YSBvcGVyYWNpXHUwMGYzbi4gQ29tcHJ1ZWJlIGVsIG5vbWJyZSBkZSBwcmVzZW50YWNpXHUwMGYzbiBkZWwgZWxlbWVudG8gcGFyYSB2ZXIgbGEgZHVwbGljYWNpXHUwMGYzbiB5IHZ1ZWx2YSBhIGludGVudGFybG8NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249U2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yLiBQdWxzZSBlbiBEZXRhbGxlcyBwYXJhIG9idGVuZXIgbVx1MDBlMXMgaW5mb3JtYWNpXHUwMGYzbi4NCi1zYXZlUHJvY2Vzc0Vycm9yX3JlYXNvbj1TZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgZ3VhcmRhciBlbCBwcm9jZXNvICcnezB9JycuIFB1bHNlIGVuIERldGFsbGVzIHBhcmEgb2J0ZW5lciBtXHUwMGUxcyBpbmZvcm1hY2lcdTAwZjNuLg0KLWRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb249U2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGFsIGVsaW1pbmFyIGxhcyByZWZlcmVuY2lhcyBhc29jaWFkYXMgYSBlc3RlIGVsZW1lbnRvLiBQdWxzZSBlbiBEZXRhbGxlcyBwYXJhIG9idGVuZXIgbVx1MDBlMXMgaW5mb3JtYWNpXHUwMGYzbi4NCi1zYXZlRmlsZUVycm9yX3JlYXNvbj1TZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgZ3VhcmRhciBlbCBhcmNoaXZvICcnezB9JycuIFB1bHNlIGVuIERldGFsbGVzIHBhcmEgb2J0ZW5lciBtXHUwMGUxcyBpbmZvcm1hY2lcdTAwZjNuLg0KLWludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uPVNlIGhhbiBkZXRlY3RhZG8gZWxlbWVudG9zIGRlIG1cdTAwZTl0b2RvIGNvbiByZWZlcmVuY2lhcyBubyB2XHUwMGUxbGlkYXMgY29tbyByZXN1bHRhZG8gZGUgbGEgY29waWEgZGUgcGx1Zy1pbnMgY3J1emFkb3MuXG5Fc3RhcyByZWZlcmVuY2lhcyBzZSBoYW4gZWxpbWluYWRvLiBcdTAwYmZEZXNlYSBjb250aW51YXI/DQotdW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbj1ObyBzZSBwdWVkZSBtb2RpZmljYXIgdW4gb2JqZXRvIHNpbiByZXNvbHZlcjogezB9KFVSSSA9IHsxfSl7Mn0NCi0NCi0jIFdhcm5pbmcgbWVzc2FnZXMNCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMThXOiBObyBzZSBoYSBwb2RpZG8gZW5jb250cmFyIHVubyBvIG1cdTAwZTFzIGVsZW1lbnRvcyBkZSBvcmlnZW4uIExvcyBhcmNoaXZvcyBhc29jaWFkb3MgZGUgbGEgY2FycGV0YSBkZSByZWN1cnNvcyBubyBzZSBjb3BpYXJcdTAwZTFuLg0KLUFjdGl2aXR5QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMTlXOiBObyBzZSBoYSBwb2RpZG8gZW5jb250cmFyIHVubyBvIG1cdTAwZTFzIGVsZW1lbnRvcyBkZSBvcmlnZW4uIExvcyBwYXF1ZXRlcyBkZSBwcm9jZXNvIGFzb2NpYWRvcyBubyBzZSBjb3BpYXJcdTAwZTFuLg0KLUFjdGl2aXR5RHJvcENvbW1hbmRfZGVlcENvcHlfcHJvbXB0Q29uZmlndXJhdGlvbk1zZz1cdTAwYmZEZXNlYSBjb3BpYXIgdG9kb3MgbG9zIGRlc2NyaXB0b3Jlcz9cblxuU2kgcHVsc2EgZW4gTm8gc2UgY29waWFyXHUwMGUxbiBzXHUwMGYzbG8gbG9zIGRlc2NyaXB0b3JlcyBxdWUgZm9ybWVuIHBhcnRlIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBhY3R1YWwuDQotZGVlcENvcHlfcHJvbXB0TXNnPU9idGVuZHJcdTAwZTEgdW5hIGNvcGlhIGRlIHRvZG9zIGxvcyBlbGVtZW50b3MgZW5sYXphZG9zIGRlIGZvcm1hIGRpblx1MDBlMW1pY2EgcXVlIHRlbmdhIHF1ZSBtYW50ZW5lciBwb3Igc2VwYXJhZG8gZGUgYWhvcmEgZW4gYWRlbGFudGUuIFx1MDBiZkRlc2VhIGNvbnRpbnVhcj8NCi1kZWVwQ29weV90aXRsZT1Db3BpYSBlbiBwcm9mdW5kaWRhZA0KLQ0KLSMgUHJvZ3Jlc3MgbWVzc2FnZXMNCi1jcmVhdGluZ1Byb2Nlc3NDb21wb25lbnRUYXNrX25hbWU9Q3JlYW5kbyBjb21wb25lbnRlIGRlbCBwcm9jZXNvICcnezB9JycuLi4NCi1wcm9jZXNzaW5nUmVmZXJlbmNlc1Rhc2tfbmFtZT1Qcm9jZXNhbmRvIHJlZmVyZW5jaWFzLi4uDQotZGVsZXRpbmdFbGVtZW50c1Rhc2tfbmFtZT1TdXByaW1pZW5kbyBlbGVtZW50b3MgeSBhcmNoaXZvcyBhc29jaWFkb3MuLi4NCi1jaGVja2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9Q29tcHJvYmFuZG8gcmVmZXJlbmNpYXMuLi4NCi1yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU9RWxpbWluYW5kbyByZWZlcmVuY2lhcy4uLg0KLXNhdmluZ01vZGlmaWVkRmlsZXNUYXNrX25hbWU9R3VhcmRhbmRvIGFyY2hpdm8ocykgbW9kaWZpY2FkbyhzKS4uLg0KLWNoZWNrQWZmZWN0ZWRSZXNvdXJjZXNUYXNrX25hbWU9Q29tcHJvYmFuZG8gbG9zIHJlY3Vyc29zIGFmZWN0YWRvcy4uLg0KLW1vdmluZ1Rhc2tfbmFtZT1Nb3ZpZW5kby4uLg0KLW1vdmluZ0ZpbGVzVGFza19uYW1lPU1vdmllbmRvIGFyY2hpdm9zLi4uDQotY29weWluZ1Jlc291cmNlc1Rhc2tfbmFtZT1Db3BpYW5kbyByZWN1cnNvcy4uLg0KLWNvcHlpbmdBY3Rpdml0aWVzX21zZz1Db3BpYW5kbyBhY3RpdmlkYWQgJyd7MH0nJw0KLXNhdmluZ0ZpbGVUYXNrX25hbWU9R3VhcmRhbmRvIGVsIGFyY2hpdm8gJyd7MH0nJy4uLg0KLQ0KLSMgVUkgVGV4dA0KLWVsZW1lbnRfdGV4dD1lbGVtZW50bw0KLWNyZWF0ZUVsZW1lbnRfdGV4dD1DcmVhciBlbGVtZW50bw0KLWNyZWF0ZVByb2Nlc3NfdGV4dD1DcmVhciBwcm9jZXNvDQotY29udHJpYnV0ZXNUb190ZXh0PUNvbnRyaWJ1eWUgYQ0KLWxvY2FsQ29udHJpYnV0ZXNUb190ZXh0PUNvbnRyaWJ1eWUgbG9jYWxtZW50ZSBhDQotZXh0ZW5kc190ZXh0PUFtcGxcdTAwZWRhDQotcmVwbGFjZXNfdGV4dD1SZWVtcGxhemENCi1sb2NhbFJlcGxhY2VzX3RleHQ9U3VzdGl0dXllIGxvY2FsbWVudGUNCi1sb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHlfdGV4dD1TdXN0aXR1Y2lcdTAwZjNuIGxvY2FsIHkgY29waWEgZW4gcHJvZnVuZGlkYWQNCi1lbGVtZW50VHlwZV90ZXh0PXswfTogezF9DQotZGVsaXZlcmFibGVzX3RleHQ9UHJvZHVjdG9zIGZpbmFsZXMNCi1jb250cmlidXRlVG9BY3Rpdml0eV90ZXh0PUNvbnRyaWJ1aXIgYSBsYSBhY3RpdmlkYWQNCi1BY3Rpdml0eURyb3BDb21tYW5kX2xhYmVsPVNvbHRhciBhY3RpdmlkYWQNCi1yZXBsYWNlQWN0aXZpdHlfdGV4dD1SZWVtcGxhemFyIGFjdGl2aWRhZA0KLWZpbGVfdGV4dD1hcmNoaXZvDQotZGlyZWN0b3J5X3RleHQ9ZGlyZWN0b3Jpbw0KLXVucmVzb2x2ZWRfdGV4dD0oJyd7MH0nJyBzaW4gcmVzb2x2ZXIpDQotYXNzaXN0c190ZXh0PUF5dWRhIGENCi11bmtub3duX3RleHQ9RGVzY29ub2NpZG8NCi1jb21tYW5kX2RvbmU9VGVybWluYWRvDQotDQotIyBUaGUgZm9sbG93aW5nIFVJIHRleHQgc2hvdWxkIGJlIHJldmlld2VkLg0KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5d2l0aHBsdWdpbl9pbmZvPXswfSAoezF9ICcnezJ9JycgZW4gJyd7M30nJykNCi1VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eV9pbmZvPXswfSAoezF9ICcnezJ9JycpDQotdWlfcmVmX2RlbGV0ZT1FbCBkZXNjcmlwdG9yICcnezB9JycgdGllbmUgbGFzIHNpZ3VpZW50ZXMgcmVmZXJlbmNpYXMgcXVlIG5vIHNlIHV0aWxpemFuIGVuIG5pbmdcdTAwZmFuIHNpdGlvLlxuU2VsZWNjaW9uZSBsYXMgcXVlIGRlc2VlIHN1cHJpbWlyOg0KLXVpX3JlZl9kZWxldGUyPUxhcyByZWZlcmVuY2lhcyBzaWd1aWVudGVzIG5vIHNlIHV0aWxpemFuIGVuIG5pbmd1bmEgcGFydGUuXG5TZWxlY2Npb25lIGxhcyBxdWUgZGVzZWUgc3VwcmltaXI6DQotdWlfcmVmZXJlbmNlcz1SZWZlcmVuY2lhcw0KLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249RWwgZGVzY3JpcHRvciBkZSBwcm9kdWN0b3MgZGUgdHJhYmFqbyAnJ3swfScnIGVzdFx1MDBlMSBhc29jaWFkbyAoU2FsaWRhIGRlKSBjb24gZWwgZGVzY3JpcHRvciBkZSB0YXJlYXMgJyd7MX0nJw0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vcHRpb25zPU9wY2lvbmVzDQotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX291dHB1dGxhYmVsPUVsaW1pbmFyIGVsIGRlc2NyaXB0b3IgZGUgcHJvZHVjdG9zIGRlIHRyYWJham8gY29tbyBzYWxpZGEgZGVsIGRlc2NyaXB0b3IgZGUgdGFyZWFzDQotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX2RlbGV0ZV90YXNrPVN1cHJpbWlyIGVsIGRlc2NyaXB0b3IgZGUgdGFyZWFzIGRlIGxhIGFjdGl2aWRhZA0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2s9RWwgZWxlbWVudG8gc2VsZWNjaW9uYWRvICcnezB9Jycgbm8gc2UgZW5jdWVudHJhIGVuIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBwb3Igb21pc2lcdTAwZjNuIGRlbCBwcm9jZXNvLlxuXHUwMGJmRGVzZWEgYVx1MDBmMWFkaXIgZWwgZWxlbWVudG8geSBzdXMgZGVwZW5kZW5jaWFzIGEgbGEgY29uZmlndXJhY2lcdTAwZjNuIHBvciBvbWlzaVx1MDBmM24/DQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2dlbmVyaWNFcnJfbWVzc2FnZV90ZXh0PVNlIGhhbiBwcm9kdWNpZG8gZXJyb3JlcyBkdXJhbnRlIGxhIG9wZXJhY2lcdTAwZjNuLiBQdWxzZSBlbiBEZXRhbGxlcyBwYXJhIG9idGVuZXIgbVx1MDBlMXMgaW5mb3JtYWNpXHUwMGYzbg0KLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fbm9EZXNjcmlwdG9yVG9TeW5jaD1ObyBzZSBoYSBlbmNvbnRyYWRvIG5pbmdcdTAwZmFuIGRlc2NyaXB0b3IgY29uIGVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvIGVubGF6YWRvIHBhcmEgc2luY3Jvbml6YXINCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9yZWZlcnNoaW5ndmlld2VyPVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCByZW5vdmFyIGVsIHZpc29yDQotY29uZmlybV9yZW1vdmVfcmVmZXJlbmNlc190ZXh0PVB1ZWRlIHF1ZSBsb3MgZWxlbWVudG9zIGxpc3RhZG9zIGVuIERldGFsbGVzIHRlbmdhbiByZWZlcmVuY2lhcyBubyB2XHUwMGUxbGlkYXMgYSBlc3RhIGd1XHUwMGVkYSwgZGVzcHVcdTAwZTlzIGRlIGxhIGNvbnZlcnNpXHUwMGYzbi4gUHVsc2UgQWNlcHRhciBzaSBkZXNlYSBzdXByaW1pcmxvcyB5IGNvbnRpbnVhci4NCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl91bmhhbmRsZWRfZXhjZXB0aW9uPUV4Y2VwY2lcdTAwZjNuIG5vIGNvbnRyb2xhZGENCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX2JyZWFrZG93bl9lbGVtZW50PU5vIHNlIHB1ZWRlIHRlbmVyIGVsIG1pc21vIGVsZW1lbnRvIGRlIGRlc2dsb3NlIGNvbW8gcHJlZGVjZXNvciB5IHN1Y2Vzb3IuDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dwbGlzdGRsZ19tc2c9RWwgcHJvZHVjdG8gZGUgdHJhYmFqbyAnJ3swfScnIGVzIHVuYSBzYWxpZGEgZGUgbGFzIHRhcmVhcyBzaWd1aWVudGVzLlxuU2VsZWNjaW9uZSBsYXMgdGFyZWFzIHBhcmEgbGFzIHF1ZSBkZXNlZSBjcmVhciBsb3MgZGVzY3JpcHRvcmVzIGNvcnJlc3BvbmRpZW50ZXMuDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZz1FbCByb2wgJyd7MH0nJyB0aWVuZSBsb3Mgc2lndWllbnRlcyBwcm9kdWN0b3MgZGUgdHJhYmFqbyByZXNwb25zYWJsZXMuXG5TZWxlY2Npb25lIGxvcyBwcm9kdWN0b3MgZGUgdHJhYmFqbyBwYXJhIGxvcyBxdWUgZGVzZWUgY3JlYXIgbG9zIGRlc2NyaXB0b3JlcyBjb3JyZXNwb25kaWVudGVzLg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyPUVycm9yIG11eSBncmF2ZQ0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93b3JrcHJvZHVjdHM9UHJvZHVjdG9zIGRlIHRyYWJham8NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX3N1Yl9lbGVtZW50PU5vIHNlIHB1ZWRlIGVubGF6YXIgdW4gZWxlbWVudG8gZGUgZGVzZ2xvc2UgYSB1bm8gZGUgc3VzIHN1YmVsZW1lbnRvcw0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3dyb25nX2VsZW1lbnQ9QWwgZWxlbWVudG8gc1x1MDBmM2xvIHNlIHB1ZWRlIGVubGF6YXIgZWwgZWxlbWVudG8gZGUgZGVzZ2xvc2UgZGUgdHJhYmFqby4NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9jaGlsZF9lbGVtZW50PU5vIHNlIHB1ZWRlIGVubGF6YXIgdW4gZWxlbWVudG8gZGUgZGVzZ2xvc2UgYSB1bm8gZGUgc3VzIGhpam9zLg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrcz1UYXJlYXMNCi11aV9hc3NvY2lhdGlvbl90YXNrX3NlbGVjdGlvbj1TZWxlY2NpXHUwMGYzbiBkZSB0YXJlYXMuLi4NCi11dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlcj1cIFwgYWRhcHRhZG9yIGRlbCBoaWpvOg0KLQ0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NldHBhcmVudD1ObyBzZSBoYSBwb2RpZG8gZXN0YWJsZWNlciBlbCBwYWRyZSBkZWwgaGlqbw0KLXV0aWxfdG5ndXRpbF9jYW5ub3RfZWRpdF9yZXNvdXJjZT1ObyBzZSBwdWVkZSBlZGl0YXIgZWwgcmVjdXJzby4NCi11dGlsX1Byb2Nlc3NVdGlsX2NvbnRyaWJ1dGVzdG89Y29udHJpYnV5ZSBhICcnezB9JycNCi11dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bz1sb2NhbG1lbnRlIGNvbnRyaWJ1eWUgYSAnJ3swfScnDQotcHJvY2Vzc19leHRlbmRzPWFtcGxcdTAwZWRhICcnezB9JycNCi1wcm9jZXNzX3JlcGxhY2VzPXJlZW1wbGF6YSAnJ3swfScnDQotcHJvY2Vzc19sb2NhbFJlcGxhY2VzPWxvY2FsbWVudGUgcmVlbXBsYXphIGEgJyd7MH0nJw0KLSMgRmlsdGVyIGNvbnN0YW50cyBleHRlcm5hbGl6ZWQgc3RyaW5ncy4NCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZXNfdGV4dD1EaXNjaXBsaW5hcw0KLUZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lZ3JvdXBpbmdzX3RleHQ9QWdydXBhY2lvbmVzIGRlIGRpc2NpcGxpbmFzDQotRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ9RG9jdW1lbnRhY2lcdTAwZjNuDQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xtZW50b3JzX3RleHQ9R3VcdTAwZWRhcyBkZSBsYSBoZXJyYW1pZW50YQ0KLUZpbHRlckNvbnN0YW50c190b29sc190ZXh0PUhlcnJhbWllbnRhcw0KLUZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0PVJvbGVzDQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ9VGFyZWFzDQotRmlsdGVyQ29uc3RhbnRzX3JldXNhYmxlYXNzZXRzX3RleHQ9QWN0aXZvcyByZXV0aWxpemFibGVzDQotRmlsdGVyQ29uc3RhbnRzX2FsbF90ZXh0PVRvZG9zDQotRmlsdGVyQ29uc3RhbnRzX3Byb2Nlc3Nlc190ZXh0PVByb2Nlc29zDQotRmlsdGVyQ29uc3RhbnRzX3ByYWN0aWNlc190ZXh0PVByXHUwMGUxY3RpY2FzDQotRmlsdGVyQ29uc3RhbnRzX3RlbXBsYXRlc190ZXh0PVBsYW50aWxsYXMNCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RzX3RleHQ9UHJvZHVjdG9zIGRlIHRyYWJham8NCi1GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0PUxpc3RhcyBkZSBjb21wcm9iYWNpXHUwMGYzbg0KLUZpbHRlckNvbnN0YW50c19ndWlkZWxpbmVzX3RleHQ9RGlyZWN0cmljZXMNCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNldHNfdGV4dD1Db25qdW50b3MgZGUgcm9sZXMNCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dD1HdVx1MDBlZGENCi1GaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dD1Db25jZXB0b3MNCi1GaWx0ZXJDb25zdGFudHNfZXhhbXBsZXNfdGV4dD1FamVtcGxvcw0KLUZpbHRlckNvbnN0YW50c19jb250ZW50cGFja2FnZXNfdGV4dD1QYXF1ZXRlcyBkZSBjb250ZW5pZG8NCi1GaWx0ZXJDb25zdGFudHNfcm9sZWRlc2NyaXB0b3JzX3RleHQ9RGVzY3JpcHRvcmVzIGRlIHJvbGVzDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dD1BZ3J1cGFjaW9uZXMgZGVsIGNvbmp1bnRvIGRlIHJvbGVzDQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tkZXNjcmlwdG9yc190ZXh0PURlc2NyaXB0b3JlcyBkZSB0YXJlYQ0KLUZpbHRlckNvbnN0YW50c19jb250ZW50ZWxlbWVudHNfdGV4dD1FbGVtZW50b3MgZGUgY29udGVuaWRvDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9wcmVwYXJlPVByZXBhcmFuZG8gbGEgc2luY3Jvbml6YWNpXHUwMGYzbi4uLg0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdGRlc2NyaXB0b3JzX3RleHQ9RGVzY3JpcHRvcmVzIGRlbCBwcm9kdWN0byBkZSB0cmFiYWpvDQotRmlsdGVyQ29uc3RhbnRzX2FsbGNvbnRlbnRlbGVtZW50c190ZXh0PVRvZG9zIGxvcyBlbGVtZW50b3MgZGUgY29udGVuaWRvDQotRmlsdGVyQ29uc3RhbnRzX3N1cHBvcnRpbmdtYXRlcmlhbHNfdGV4dD1NYXRlcmlhbGVzIGRlIHNvcG9ydGUNCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzPVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBndWFyZGFyIGVsIGFyY2hpdm8NCi1GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0PUNhdGVnb3JcdTAwZWRhcyBwZXJzb25hbGl6YWRhcw0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHR5cGVzX3RleHQ9Q2xhc2VzIGRlIHByb2R1Y3RvIGRlIHRyYWJham8NCi1EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZF93YXJuaW5nTXNnPVN1cHJlc2lcdTAwZjNuIGZpbmFsaXphZGEgY29uIGF2aXNvDQotRmlsdGVyQ29uc3RhbnRzX21ldGhvZHBsdWdpbnNfdGV4dD1QbHVnLWlucyBkZSBtXHUwMGU5dG9kbw0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9sb2NrZWRQbHVnaW49SVVQTDAxMjBFOiBFbCBwbHVnLWluICcnezB9JycgZXN0XHUwMGUxIGJsb3F1ZWFkby4NCi1GaWx0ZXJDb25zdGFudHNfZG9tYWluc190ZXh0PURvbWluaW9zDQotRmlsdGVyQ29uc3RhbnRzX3JvYWRtYXBfdGV4dD1NYXBhcw0KLUZpbHRlckNvbnN0YW50c19yZXBvcnRzX3RleHQ9SW5mb3JtZXMNCi1BdXRvU3luY2hyb25pemVDb21tYW5kX2xhYmVsPVNpbmNyb25pemFjaVx1MDBmM24gcG9yIG9taXNpXHUwMGYzbiBkZXNkZSBlbCBjb250ZW5pZG8gZGVsIG1cdTAwZTl0b2RvDQotTWFudWFsU3luY2hyb25pemVDb21tYW5kX2xhYmVsPVBlcnNvbmFsaXphciBzaW5jcm9uaXphY2lcdTAwZjNuLi4uDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWw9TGEgc2luY3Jvbml6YWNpXHUwMGYzbiBzZSBoYSBjb21wbGV0YWRvIHNhdGlzZmFjdG9yaWFtZW50ZS4NCi0NCi0jIFVzZXJJbnRlcmFjdGlvbkhlbHBlcg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9Qcm9jZXNzUGFja2FnZV9OYW1lPU5vbWJyZToNCi0NCi0jIE1ldGhvZENyZWF0ZUNoaWxkQ29tbWFuZA0KLW5ld0VsZW1lbnRfdGV4dD17MH0gbnVldm8NCi11cGRhdGVfb3V0b2ZzeW5jaF90aXRsZT1Db25mbGljdG8gZGUgYWN0dWFsaXphY2lvbmVzDQotdXBkYXRlX291dG9mc3luY2hfbXNnPUVsIGFyY2hpdm8gbyBhcmNoaXZvcyBzZSBoYW4gY2FtYmlhZG8gZW4gZWwgc2lzdGVtYSBkZSBhcmNoaXZvcy4gXHUwMGJmRGVzZWEgc29icmVzY3JpYmlyIGxvcyBjYW1iaW9zPw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YTNjOGZlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBHZW5lcmljIERpYWxvZyBUaXRsZXMNCi1tb3ZlRGlhbG9nX3RpdGxlPURcdTAwZTlwbGFjZXINCi1kZWxldGVEaWFsb2dfdGl0bGU9U3VwcHJpbWVyIHVuIFx1MDBlOWxcdTAwZTltZW50DQotZXJyb3JEaWFsb2dfdGl0bGU9RXJyZXVyDQotZXJyb3JEaWFsb2dfY2Fubm90UmVuYW1lPUltcG9zc2libGUgZGUgcmVub21tZXIgezB9ICcnezF9JycgZW4gJyd7Mn0nJy4gUlx1MDBlOXNvbHZleiBsZSBwcm9ibFx1MDBlOG1lIGFmZmljaFx1MDBlOSBkYW5zIERcdTAwZTl0YWlscyBldCBjbGlxdWV6IHN1ciBPSyBwb3VyIGNvbnRpbnVlciBvdSBzdXIgQW5udWxlciBwb3VyIGFiYW5kb25uZXIgY2V0dGUgb3BcdTAwZTlyYXRpb24uDQotDQotIyBDb25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbCBEaWFsb2cNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlPUNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RleHQ9TGUocykgXHUwMGU5bFx1MDBlOW1lbnQocykgcXVlIHZvdXMgXHUwMGVhdGVzIHN1ciBsZSBwb2ludCBkZSBzdXBwcmltZXIgc29udCB0b3Vqb3VycyB1dGlsaXNcdTAwZTlzIHBhciBkJ2F1dHJlcyBcdTAwZTlsXHUwMGU5bWVudHMgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy4gTGEgc3VwcHJlc3Npb24gZGUgY2VzIFx1MDBlOWxcdTAwZTltZW50cyBlbnRyYVx1MDBlZW5lcmEgbGEgc3VwcHJlc3Npb24gZGUgbGV1cnMgclx1MDBlOWZcdTAwZTlyZW5jZXMgZXQgbWV0dHJhIGRvbmMgXHUwMGUwIGpvdXIgbGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSByXHUwMGU5Zlx1MDBlOXJlbmNlbWVudC4gIFZcdTAwZTlyaWZpZXogcXVlIHZvdXMgXHUwMGVhdGVzIGF1dG9yaXNcdTAwZTkgXHUwMGUwIG1ldHRyZSBcdTAwZTAgam91ciBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIHJcdTAwZTlmXHUwMGU5cmVuY2VtZW50IGF2YW50IGRlIGNsaXF1ZXIgc3VyIE9LLiAgQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgclx1MDBlOXZpc2VyIGxhIGxpc3RlIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgdXRpbGlzYW50IGxlKHMpIFx1MDBlOWxcdTAwZTltZW50KHMpIHF1ZSB2b3VzIFx1MDBlYXRlcyBzdXIgbGUgcG9pbnQgZGUgc3VwcHJpbWVyLg0KLQ0KLSMgUmVzb2x2ZSBOYW1lIENvbmZsaWN0IERpYWxvZw0KLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGl0bGU9Ulx1MDBlOXNvdWRyZSB1biBjb25mbGl0IGRlIG5vbSBkJ1x1MDBlOWxcdTAwZTltZW50DQotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0PVNhaXNpc3NleiB1biBub3V2ZWF1IHswfSBwb3VyICcnezF9JycgOg0KLQ0KLSMgU2VsZWN0IERlbGl2ZXJhYmxlcyBEaWFsb2cNCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGl0bGU9U1x1MDBlOWxlY3Rpb25uZXIgbGVzIGxpdnJhYmxlcw0KLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190ZXh0PVNcdTAwZTlsZWN0aW9ubmV6IHVuIGxpdnJhYmxlIGRhbnMgbGVxdWVsIHZvdXMgdm91bGV6IGFmZmVjdGVyIGxlIHByb2R1aXQgJyd7MH0nJy4NCi0NCi0jIE5ldyBQcm9jZXNzIENvbXBvbmVudCBEaWFsb2cNCi1uZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nX3RpdGxlPU5vdXZlYXUgY29tcG9zYW50IGRlIHByb2Nlc3N1cw0KLW5hbWVMYWJlbF90ZXh0PU5vbSA6DQotZGVmYXVsdENvbmZpZ0xhYmVsX3RleHQ9Q29uZmlndXJhdGlvbiBwYXIgZFx1MDBlOWZhdXQgOg0KLWJhc2VQcm9jZXNzTGFiZWxfdGV4dD1Qcm9jZXNzdXMgZGUgYmFzZSA6DQotYmFzZWRPblByb2Nlc3Nlc0xhYmVsX3RleHQ9QmFzXHUwMGU5IHN1ciBsZXMgcHJvY2Vzc3VzIDoNCi0NCi0jIFJvbGUgQXNzb2NpYXRpb24gRGlhbG9nDQotc2VsZWN0QXNzb2NpYXRpb25MYWJlbF90ZXh0PVNcdTAwZTlsZWN0aW9ubmV6IHVuZSBhc3NvY2lhdGlvbiBwb3VyIGxhIHRcdTAwZTJjaGUgJyd7MH0nJw0KLQ0KLSMgUmVtb3ZlIEFzc29jaWF0aW9uIGRpYWxvZw0KLXJlbW92ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ9U3VwcHJpbWV6IHVuZSBhc3NvY2lhdGlvbg0KLQ0KLSMgU2VsZWN0IFRlYW1zIERpYWxvZw0KLXNlbGVjdFRlYW1zRGlhbG9nX3RpdGxlPVNcdTAwZTlsZWN0aW9ubmVyIGxlcyBcdTAwZTlxdWlwZXMNCi1zZWxlY3RUZWFtc0RpYWxvZ190ZXh0PVNcdTAwZTlsZWN0aW9ubmV6IHVuZSBcdTAwZTlxdWlwZSBcdTAwZTAgbGFxdWVsbGUgdm91cyBzb3VoYWl0ZXogYWZmZWN0ZXIgdW4gclx1MDBmNGxlICcnezB9JycuDQotDQotIyBUYXNsIFNlbGVjdGlvbiBEaWFsb2cNCi10YXNrU2VsZWN0aW9uRGlhbG9nX3RpdGxlPVNcdTAwZTlsZWN0aW9ubmVyIGRlcyB0XHUwMGUyY2hlcw0KLXRpdGxlTGFiZWxfdGV4dD1TXHUwMGU5bGVjdGlvbm5leiBkZXMgdFx1MDBlMmNoZXMuLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMEUgOiBMZSBub20gezB9IGVzdCBtYW5xdWFudC5cblxuVG91cyBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIG1cdTAwZTl0aG9kZSBldCBkZSBwcm9jZXNzdXMgZG9pdmVudCBhdm9pciB1biBub20uXG5cblNhaXNzZXogdW4gbm9tIHZhbGlkZSBldCByXHUwMGU5ZXNzYXllei4NCi1lbXB0eUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1MZSBub20gbmUgcGV1dCBwYXMgXHUwMGVhdHJlIHZpZGUuIFZldWlsbGV6IGluZGlxdWVyIHVuIG5vbSB2YWxpZGUuDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDFFOiBMZSBub20gJyd7MH0nJyBleGlzdGUgZFx1MDBlOWpcdTAwZTAuIFxuXG5VbiBcdTAwZTlsXHUwMGU5bWVudCBkZSBtXHUwMGU5dGhvZGUgZG9pdCBhdm9pciB1biBub20gdW5pcXVlLlxuXG5TYWlzaXNzZXogdW4gYXV0cmUgbm9tIGV0IHJcdTAwZTllc3NheWV6Lg0KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1DZSBub20gZCdcdTAwZTlsXHUwMGU5bWVudCBleGlzdGUgZFx1MDBlOWpcdTAwZTAuIENob2lzaXNzZXogdW4gYXV0cmUgbm9tLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMV9tc2c9SVVQTDAxMDJFIDogTGUgbm9tICcnezB9JycgZXN0IG5vbiB2YWxpZGUuXG5cblVuIG5vbSBkJydcdTAwZTlsXHUwMGU5bWVudCBkZSBtXHUwMGU5dGhvZGUgbmUgcGV1dCBwYXMgY29tbWVuY2VyIHBhciB1biBlc3BhY2UuXG5cblNhaXNzZXogdW4gbm9tIHZhbGlkZSBldCByXHUwMGU5ZXNzYXllei4NCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjJfbXNnPUlVUEwwMTAzRSA6IExlIG5vbSAnJ3swfScnIGVzdCBub24gdmFsaWRlLlxuXG5VbiBub20gZCcnXHUwMGU5bFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlIG5lIHBldXQgcGFzIHNlIHRlcm1pbmVyIHBhciB1biBwb2ludC5cblxuU2Fpc3NleiB1biBub20gdmFsaWRlIGV0IHJcdTAwZTllc3NheWV6Lg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2c9SVVQTDAxMDRFIDogTGUgbm9tICcnezB9JycgZXN0IG5vbiB2YWxpZGUuXG5cblVuIG5vbSBkJydcdTAwZTlsXHUwMGU5bWVudCBkZSBtXHUwMGU5dGhvZGUgbmUgcGV1dCBwYXMgY29udGVuaXIgbGVzIGNhcmFjdFx1MDBlOHJlcyBzdWl2YW50cyA6IFxcIC8gOiAqID8gIiA8ID4gOyB8XG5cblNhaXNpc3NleiB1biBub20gdmFsaWRlIGV0IHJcdTAwZTllc3NheWV6Lg0KLW5vQ29uZmlnRXJyb3JfbXNnPUlVUEwwMTA1RSA6IExhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZW4gY291cnMgbmUgY29udGllbnQgYXVjdW5lIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlLlxuXG5VbmUgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUgZXN0IG5cdTAwZTljZXNzYWlyZSBwb3VyIGNyXHUwMGU5ZXIgdW4gbm91dmVhdSBwcm9jZXNzdXMuXG5cbkNyXHUwMGU5ZXogdW5lIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlIGV0IHJcdTAwZTllc3NheWV6Lg0KLW5vRGVsaXZlcnlQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA2RSA6IExhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZW4gY291cnMgbmUgY29udGllbnQgYXVjdW4gcHJvY2Vzc3VzIGRlIGxpdnJhaXNvbi5cblxuVW4gcHJvY2Vzc3VzIGRlIGxpdnJhaXNvbiBkZSBiYXNlIGVzdCBuXHUwMGU5Y2Vzc2FpcmUgcG91ciBjclx1MDBlOWVyIHVuZSBub3V2ZWxsZSBjb250cmlidXRpb24gZGUgcHJvY2Vzc3VzLlxuXG5Dclx1MDBlOWV6IHVuIHByb2Nlc3N1cyBkZSBsaXZyYWlzb24gZXQgclx1MDBlOWVzc2F5ZXouDQotbm9EZWZhdWx0Q29uZmlnRXJyb3JfbXNnPUlVUEwwMTA3RSA6IEF1Y3VuZSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZSBuJ2EgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTllLlxuXG5VbmUgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUgcGFyIGRcdTAwZTlmYXV0IGRvaXQgXHUwMGVhdHJlIGFmZmVjdFx1MDBlOWUgYXUgbm91dmVhdSBwcm9jZXNzdXMuXG5cblNcdTAwZTlsZWN0aW9ubmV6IHVuZSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZSBldCByXHUwMGU5ZXNzYXllei4NCi1ub0Jhc2VQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA4RSA6IEF1Y3VuIHByb2Nlc3N1cyBkZSBsaXZyYWlzb24gbidhIFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5LlxuXG5VbmUgY29udHJpYnV0aW9uIGRlIHByb2Nlc3N1cyByZXF1aWVydCB1biBwcm9jZXNzdXMgZGUgbGl2cmFpc29uIGRlIGJhc2UuXG5cblNcdTAwZTlsZWN0aW9ubmV6IHVuIHByb2Nlc3N1cyBkZSBsaXZyYWlzb24gZXQgclx1MDBlOWVzc2F5ZXouDQotY3JlYXRlUHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwOUUgOiBJbXBvc3NpYmxlIGRlIGNyXHUwMGU5ZXIgdW4gcHJvY2Vzc3VzLg0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9tc2c9SVVQTDAxMTBFIDogSW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIHVuIFx1MDBlOWxcdTAwZTltZW50Lg0KLWRlbGV0ZUVsZW1lbnRFcnJvcl9tc2c9SVVQTDAxMTFFIDogSW1wb3NzaWJsZSBkZSBzdXBwcmltZXIgdW4gXHUwMGU5bFx1MDBlOW1lbnQuDQotZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9tc2c9SVVQTDAxMTJFIDogSW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIGxlIGZpY2hpZXIgZGUgY29udGVudSBkZSBsJydcdTAwZTlsXHUwMGU5bWVudC5cblxuVW4gZmljaGllciAnJ3swfScnIGV4aXN0ZSBkXHUwMGU5alx1MDBlMC5cblxuU2Fpc2lzc2V6IHVuIGF1dHJlIG5vbSBldCByXHUwMGU5ZXNzYXllei4NCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c9VW4gZmljaGllciBkZSBjb250ZW51IHBvcnRhbnQgbGUgbVx1MDBlYW1lIG5vbSBleGlzdGUgZFx1MDBlOWpcdTAwZTAuIENob2lzaXNzZXogdW4gYXV0cmUgbm9tLg0KLXVuZG9Db21tYW5kRXJyb3JfbXNnPUlVUEwwMTEzRSA6IEltcG9zc2libGUgZCcnYXBwbGlxdWVyIGxhIGNvbW1hbmRlIGQnJ2FubnVsYXRpb24gJyd7MH0nJy5cblxuVW5lIGVycmV1ciBzJydlc3QgcHJvZHVpdGUgOiB7MX0NCi1pbnZhbGlkUHJlZGVjZXNzb3JFcnJvcl9tc2c9SVVQTDAxMTRFIDogTCdpbmRleCBkdSBwclx1MDBlOWRcdTAwZTljZXNzZXVyIHNwXHUwMGU5Y2lmaVx1MDBlOSBlc3Qgbm9uIHZhbGlkZS5cblxuVW4gaW5kZXggZGUgcHJcdTAwZTlkXHUwMGU5Y2Vzc2V1ciBkb2l0IFx1MDBlYXRyZSB1biBlbnRpZXIgZGFucyBsYSBjb2xvbm5lICdJbmRleCcuXG5cblNwXHUwMGU5Y2lmaWV6IHVuZSB2YWxldXIgdmFsaWRlIGV0IHJcdTAwZTllc3NheWV6Lg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHM9SVVQTDAxMDBXIDogJyd7MH0nJyBlc3QgZFx1MDBlOWpcdTAwZTAgYXNzb2NpXHUwMGU5IFx1MDBlMCAnJ3sxfScnLiAgVW5lIHNldWxlIGFzc29jaWF0aW9uIGRlIGNlIHR5cGUgZXN0IHBlcm1pc2UuICBQb3VyIGFmZmVjdGVyICcnezB9JycgXHUwMGUwICcnezJ9JycsIHZvdXMgZGV2ZXogYXUgcHJcdTAwZTlhbGFibGUgbGUgc3VwcHJpbWVyIGRlICcnezF9JycuDQotZXJyb3JfbXNnV2l0aERldGFpbHM9SVVQTDAxMTZFIDogVW5lIGVycmV1ciBzJ2VzdCBwcm9kdWl0ZS4gQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy4NCi1lcnJvcl9tc2c9SVVQTDAxMTdFIDogVW5lIGVycmV1ciBzJ2VzdCBwcm9kdWl0ZS4gQWZmaWNoZXogbGUgam91cm5hbCBkZXMgZXJyZXVycyBwb3VyIHBsdXMgZCdpbmZvcm1hdGlvbnMuDQotU3VwcHJlc3Npb25fbmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE4RSA6IFVuIGNvbmZsaXQgZGUgbm9tIHZhIHNlIHByb2R1aXJlIHN1aXRlIFx1MDBlMCBjZXR0ZSBvcFx1MDBlOXJhdGlvbi4gPlZcdTAwZTlyaWZpZXogcXVlIGxlIG5vbSBkZSBsJ1x1MDBlOWxcdTAwZTltZW50IG4nZXN0IHBhcyBlbiBkb3VibGUgZXQgclx1MDBlOWVzc2F5ZXoNCi1TdXBwcmVzc2lvbl9wcmVzZW50YXRpb25OYW1lRHVwbGljYXRpb249SVVQTDAxMTlFIDogVW4gY29uZmxpdCBkZSBub20gdmEgc2UgcHJvZHVpcmUgc3VpdGUgXHUwMGUwIGNldHRlIG9wXHUwMGU5cmF0aW9uLiA+Vlx1MDBlOXJpZmlleiBxdWUgbGUgbm9tIGRlIHByXHUwMGU5c2VudGF0aW9uIGRlIGwnXHUwMGU5bFx1MDBlOW1lbnQgbidlc3QgcGFzIGVuIGRvdWJsZSBldCByXHUwMGU5ZXNzYXlleg0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1VbmUgZXJyZXVyIHMnZXN0IHByb2R1aXRlLiBDbGlxdWV6IHN1ciBEXHUwMGU5dGFpbHMgcG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLg0KLXNhdmVQcm9jZXNzRXJyb3JfcmVhc29uPVVuZSBlcnJldXIgcycnZXN0IHByb2R1aXRlIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkdSBwcm9jZXNzdXMgJyd7MH0nJy4gQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJydpbmZvcm1hdGlvbnMuDQotZGVsZXRlUmVmZXJlbmNlc0Vycm9yX3JlYXNvbj1VbmUgZXJyZXVyIHMnZXN0IHByb2R1aXRlIGxvcnMgZGUgbGEgc3VwcHJlc3Npb24gZGVzIHJcdTAwZTlmXHUwMGU5cmVuY2VzIGFzc29jaVx1MDBlOWVzIFx1MDBlMCBjZXQgXHUwMGU5bFx1MDBlOW1lbnQuIENsaXF1ZXogc3VyIERcdTAwZTl0YWlscyBwb3VyIHBsdXMgZCdpbmZvcm1hdGlvbnMuDQotc2F2ZUZpbGVFcnJvcl9yZWFzb249VW5lIGVycmV1ciBzJydlc3QgcHJvZHVpdGUgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlIGR1IGZpY2hpZXIgJyd7MH0nJy4gQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJydpbmZvcm1hdGlvbnMuDQotaW52YWxpZFJlZmVyZW5jZXNFcnJvcl9yZWFzb249RGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSBtXHUwMGU5dGhvZGUgY29udGVuYW50IGRlcyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBub24gdmFsaWRlcyBpc3N1ZXMgZGUgY29waWVzIGVudHJlIHBsdWctaW5zIG9udCBcdTAwZTl0XHUwMGU5IGRcdTAwZTl0ZWN0XHUwMGU5cy5cbkNlcyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBzZXJvbnQgc3VwcHJpbVx1MDBlOWVzLiBWb3VsZXotdm91cyBjb250aW51ZXIgPw0KLXVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb249TW9kaWZpY2F0aW9uIGQnJ3VuIG9iamV0IG5vbiByXHUwMGU5c29sdSBpbXBvc3NpYmxlIDogezB9KFVSSSA9IHsxfSl7Mn0NCi0NCi0jIFdhcm5pbmcgbWVzc2FnZXMNCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMThXIDogVW4gb3UgcGx1c2lldXJzIFx1MDBlOWxcdTAwZTltZW50cyBzb3VyY2Ugc29udCBpbnRyb3V2YWJsZXMuIExlcyBmaWNoaWVycyBhc3NvY2lcdTAwZTlzIGR1IGRvc3NpZXIgZGVzIHJlc3NvdXJjZXMgbmUgc2Vyb250IHBhcyBjb3BpXHUwMGU5cy4NCi1BY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE5VyA6IFVuIG91IHBsdXNpZXVycyBcdTAwZTlsXHUwMGU5bWVudHMgc291cmNlIHNvbnQgaW50cm91dmFibGVzLiBMZXMgcGFja2FnZXMgZGUgcHJvY2Vzc3VzIGFzc29jaVx1MDBlOXMgbmUgc2Vyb250IHBhcyBjb3BpXHUwMGU5cy4NCi1BY3Rpdml0eURyb3BDb21tYW5kX2RlZXBDb3B5X3Byb21wdENvbmZpZ3VyYXRpb25Nc2c9Vm91bGV6LXZvdXMgY29waWVyIHRvdXMgbGVzIGRlc2NyaXB0ZXVycyA/XG5cblNpIHZvdXMgY2xpcXVleiBzdXIgTm9uLCBzZXVscyBsZXMgZGVzY3JpcHRldXJzIGZhaXNhbnQgcGFydGllIGRlIGxhIGNvbmZpZ3VyYXRpb24gZW4gY291cnMgc2Vyb250IGNvcGlcdTAwZTlzLg0KLWRlZXBDb3B5X3Byb21wdE1zZz1Wb3VzIG9idGllbmRyZXogdW5lIGNvcGllIGRlIHRvdXMgbGVzIFx1MDBlOWxcdTAwZTltZW50cyBsaVx1MDBlOXMgZHluYW1pcXVlbWVudCBxdWUgdm91cyBkZXZleiBkXHUwMGU5c29ybWFpcyBjb25zZXJ2ZXIgc1x1MDBlOXBhclx1MDBlOW1lbnQuIFZvdWxlei12b3VzIGNvbnRpbnVlciA/DQotZGVlcENvcHlfdGl0bGU9Q29waWUgcHJvZm9uZGUNCi0NCi0jIFByb2dyZXNzIG1lc3NhZ2VzDQotY3JlYXRpbmdQcm9jZXNzQ29tcG9uZW50VGFza19uYW1lPUNyXHUwMGU5YXRpb24gZHUgY29tcG9zYW50IGRlIHByb2Nlc3N1cyAnJ3swfScnLi4uDQotcHJvY2Vzc2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9VHJhaXRlbWVudCBkZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMuLi4NCi1kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lPVN1cHByZXNzaW9uIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgZXQgZmljaGllcnMgYXNzb2NpXHUwMGU5cy4uLg0KLWNoZWNraW5nUmVmZXJlbmNlc1Rhc2tfbmFtZT1SZWNoZXJjaGUgZGUgclx1MDBlOWZcdTAwZTlyZW5jZXMuLi4NCi1yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU9U3VwcHJlc3Npb24gZGUgclx1MDBlOWZcdTAwZTlyZW5jZXMuLi4NCi1zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lPVNhdXZlZ2FyZGUgZHUoZGVzKSBmaWNoaWVyKHMpIG1vZGlmaVx1MDBlOShzKS4uLg0KLWNoZWNrQWZmZWN0ZWRSZXNvdXJjZXNUYXNrX25hbWU9Vlx1MDBlOXJpZmljYXRpb24gZGVzIHJlc3NvdXJjZXMgYWZmZWN0XHUwMGU5ZXMuLi4NCi1tb3ZpbmdUYXNrX25hbWU9RFx1MDBlOXBsYWNlbWVudC4uLg0KLW1vdmluZ0ZpbGVzVGFza19uYW1lPURcdTAwZTlwbGFjZW1lbnQgZGUgZmljaGllcnMuLi4NCi1jb3B5aW5nUmVzb3VyY2VzVGFza19uYW1lPUNvcGllIGRlIHJlc3NvdXJjZXMuLi4NCi1jb3B5aW5nQWN0aXZpdGllc19tc2c9Q29waWUgZGUgbCcnYWN0aXZpdFx1MDBlOSAnJ3swfScnDQotc2F2aW5nRmlsZVRhc2tfbmFtZT1TYXV2ZWdhcmRlIGR1IGZpY2hpZXIgJyd7MH0nJy4uLg0KLQ0KLSMgVUkgVGV4dA0KLWVsZW1lbnRfdGV4dD1cdTAwZTlsXHUwMGU5bWVudA0KLWNyZWF0ZUVsZW1lbnRfdGV4dD1Dclx1MDBlOWVyIHVuIFx1MDBlOWxcdTAwZTltZW50DQotY3JlYXRlUHJvY2Vzc190ZXh0PUNyXHUwMGU5ZXIgdW4gcHJvY2Vzc3VzDQotY29udHJpYnV0ZXNUb190ZXh0PUNvbnRyaWJ1ZSBcdTAwZTANCi1sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dD1Db250cmlidWUgbG9jYWxlbWVudCBcdTAwZTANCi1leHRlbmRzX3RleHQ9RXRlbmQNCi1yZXBsYWNlc190ZXh0PVJlbXBsYWNlDQotbG9jYWxSZXBsYWNlc190ZXh0PVJlbXBsYWNlIGxvY2FsZW1lbnQNCi1sb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHlfdGV4dD1SZW1wbGFjZW1lbnQgbG9jYWwgZXQgY29waWUgcHJvZm9uZGUNCi1lbGVtZW50VHlwZV90ZXh0PXswfSA6IHsxfQ0KLWRlbGl2ZXJhYmxlc190ZXh0PUxpdnJhYmxlcw0KLWNvbnRyaWJ1dGVUb0FjdGl2aXR5X3RleHQ9Q29udHJpYnVlciBcdTAwZTAgbCdhY3Rpdml0XHUwMGU5DQotQWN0aXZpdHlEcm9wQ29tbWFuZF9sYWJlbD1TdXBwcmltZXIgbCdhY3Rpdml0XHUwMGU5DQotcmVwbGFjZUFjdGl2aXR5X3RleHQ9UmVtcGxhY2VyIGwnYWN0aXZpdFx1MDBlOQ0KLWZpbGVfdGV4dD1maWNoaWVyDQotZGlyZWN0b3J5X3RleHQ9clx1MDBlOXBlcnRvaXJlDQotdW5yZXNvbHZlZF90ZXh0PSgnJ3swfScnIG5vbiByXHUwMGU5c29sdSkNCi1hc3Npc3RzX3RleHQ9Rm91cm5pdCBkZSBsJ2FpZGUNCi11bmtub3duX3RleHQ9SW5jb25udQ0KLWNvbW1hbmRfZG9uZT1UZXJtaW5cdTAwZTkNCi0NCi0jIFRoZSBmb2xsb3dpbmcgVUkgdGV4dCBzaG91bGQgYmUgcmV2aWV3ZWQuDQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHl3aXRocGx1Z2luX2luZm89ezB9ICh7MX0gJyd7Mn0nJyBkYW5zICcnezN9JycpDQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHlfaW5mbz17MH0gKHsxfSAnJ3syfScnKQ0KLXVpX3JlZl9kZWxldGU9TGUgZGVzY3JpcHRldXIgJyd7MH0nJyBjb250aWVudCBsZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgc3VpdmFudGVzIHF1aSBuZSBzb250IHV0aWxpc1x1MDBlOWVzIG51bGxlIHBhcnQuXG5TXHUwMGU5bGVjdGlvbm5leiBjZWxsZXMgcXVlIHZvdXMgc291aGFpdGV6IHN1cHByaW1lciA6DQotdWlfcmVmX2RlbGV0ZTI9TGVzIHJcdTAwZTlmXHUwMGU5cmVuY2VzIHN1aXZhbnRlcyBuZSBzb250IHV0aWxpc1x1MDBlOWVzIG51bGxlIHBhcnQuXG5TXHUwMGU5bGVjdGlvbm5leiBjZWxsZXMgcXVlIHZvdXMgc291aGFpdGV6IHN1cHByaW1lciA6DQotdWlfcmVmZXJlbmNlcz1SXHUwMGU5Zlx1MDBlOXJlbmNlcw0KLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249TGUgZGVzY3JpcHRldXIgZGUgcHJvZHVpdCAnJ3swfScnIGVzdCBhc3NvY2lcdTAwZTkgKHNvcnRpZSBkZSkgYXUgZGVzY3JpcHRldXIgZGUgdFx1MDBlMmNoZSAnJ3sxfScnDQotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX29wdGlvbnM9T3B0aW9ucw0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbD1TdXBwcmltZXIgbGUgZGVzY3JpcHRldXIgZGUgcHJvZHVpdCBlbiB0YW50IHF1ZSBzb3J0aWUgZHUgZGVzY3JpcHRldXIgZGUgdFx1MDBlMmNoZQ0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9kZWxldGVfdGFzaz1TdXBwcmltZXIgbGUgZGVzY3JpcHRldXIgZGUgdFx1MDBlMmNoZSBkZSBsJ2FjdGl2aXRcdTAwZTkNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZGVmYXVsdGNvbmZpZ2NoZWNrPUwnJ1x1MDBlOWxcdTAwZTltZW50IHNcdTAwZTlsZWN0aW9ublx1MDBlOSAnJ3swfScnIG5lIGZpZ3VyZSBwYXMgZGFucyBsYSBjb25maWd1cmF0aW9uIHBhciBkXHUwMGU5ZmF1dCBkZSB2b3RyZSBwcm9jZXNzdXMuXG5Tb3VoYWl0ZXotdm91cyBham91dGVyIGNlIGRlcm5pZXIgZXQgc2VzIGRcdTAwZTlwZW5kYW5jZXMgXHUwMGUwIGxhIGNvbmZpZ3VyYXRpb24gcGFyIGRcdTAwZTlmYXV0ID8NCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZ2VuZXJpY0Vycl9tZXNzYWdlX3RleHQ9RGVzIGVycmV1cnMgc2Ugc29udCBwcm9kdWl0ZXMgcGVuZGFudCBsJ29wXHUwMGU5cmF0aW9uLiBDbGlxdWV6IHN1ciBEXHUwMGU5dGFpbHMgcG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLg0KLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fbm9EZXNjcmlwdG9yVG9TeW5jaD1BdWN1biBkZXNjcmlwdGV1ciBjb250ZW5hbnQgdW4gXHUwMGU5bFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlIGxpXHUwMGU5IG4nYSBcdTAwZTl0XHUwMGU5IHRyb3V2XHUwMGU5IGVuIHZ1ZSBkJ3VuZSBzeW5jaHJvbmlzYXRpb24NCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9yZWZlcnNoaW5ndmlld2VyPUVycmV1ciBkJ2FjdHVhbGlzYXRpb24gZGUgbCdhZmZpY2hldXINCi1jb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQ9TGUgb3UgbGVzIFx1MDBlOWxcdTAwZTltZW50cyByXHUwMGU5cGVydG9yaVx1MDBlOXMgZGFucyBEXHUwMGU5dGFpbHMgc29udCBzdXNjZXB0aWJsZXMgZGUgY29tcG9ydGVyIHVuZSByXHUwMGU5Zlx1MDBlOXJlbmNlIGludGVyZGl0ZSBcdTAwZTAgY2UgbWVzc2FnZSBkXHUwMGU5Y2lzaW9ubmVsIGFwclx1MDBlOHMgY29udmVyc2lvbi4gQ2xpcXVleiBzdXIgT0sgcG91ciBsZXMgc3VwcHJpbWVyIGV0IGNvbnRpbnVlci4NCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl91bmhhbmRsZWRfZXhjZXB0aW9uPUV4Y2VwdGlvbiBub24gZ1x1MDBlOXJcdTAwZTllDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9icmVha2Rvd25fZWxlbWVudD1OZSBwZXV0IHBhcyBhdm9pciBsZSBtXHUwMGVhbWUgXHUwMGU5bFx1MDBlOW1lbnQgZGUgclx1MDBlOXBhcnRpdGlvbiBxdWUgbGUgcHJcdTAwZTlkXHUwMGU5Y2Vzc2V1ciBldCBsZSBzdWNjZXNzZXVyDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dwbGlzdGRsZ19tc2c9TGUgcHJvZHVpdCAnJ3swfScnIGVzdCB1bmUgc29ydGllIGRlcyB0XHUwMGUyY2hlcyBzdWl2YW50ZXMuXG5TXHUwMGU5bGVjdGlvbm5leiBsZXMgdFx1MDBlMmNoZXMgcG91ciBsZXNxdWVsbGVzIHZvdXMgc291aGFpdGV6IGNyXHUwMGU5ZXIgbGVzIGRlc2NyaXB0ZXVycyBjb3JyZXNwb25kYW50cy4NCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfcm9sZWxpc3RkbGdfbXNnPUxlIHJcdTAwZjRsZSAnJ3swfScnIGNvbXBvcnRlIGxlcyBwcm9kdWl0cyByZXNwb25zYWJsZXMgc3VpdmFudHMuXG5TXHUwMGU5bGVjdGlvbm5leiBsZXMgcHJvZHVpdHMgcG91ciBsZXNxdWVscyB2b3VzIHNvdWhhaXRleiBjclx1MDBlOWVyIGxlcyBkZXNjcmlwdGV1cnMgY29ycmVzcG9uZGFudHMuDQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfZmF0YWxlcnI9RXJyZXVyIGJsb3F1YW50ZQ0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93b3JrcHJvZHVjdHM9UHJvZHVpdHMNCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX3N1Yl9lbGVtZW50PUltcG9zc2libGUgZGUgcmVsaWVyIHVuIFx1MDBlOWxcdTAwZTltZW50IGRlIHJcdTAwZTlwYXJ0aXRpb24gXHUwMGUwIGwndW4gZGUgc2VzIHNvdXMtXHUwMGU5bFx1MDBlOW1lbnRzDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudD1JbXBvc3NpYmxlIGRlIHJlbGllciBcdTAwZTAgdW4gXHUwMGU5bFx1MDBlOW1lbnQgYXV0cmUgcXUndW4gXHUwMGU5bFx1MDBlOW1lbnQgZGUgclx1MDBlOXBhcnRpdGlvbiBkdSB0cmF2YWlsLg0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ9SW1wb3NzaWJsZSBkZSByZWxpZXIgdW4gXHUwMGU5bFx1MDBlOW1lbnQgZGUgclx1MDBlOXBhcnRpdGlvbiBcdTAwZTAgbCd1biBkZSBzZXMgZW5mYW50cy4NCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfdGFza3M9VFx1MDBlMmNoZXMNCi11aV9hc3NvY2lhdGlvbl90YXNrX3NlbGVjdGlvbj1TXHUwMGU5bGVjdGlvbiBkZXMgdFx1MDBlMmNoZXMuLi4NCi11dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlcj1cIFwgYWRhcHRhdGV1ciBkZSBsJ2VuZmFudCA6DQotDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2V0cGFyZW50PUltcG9zc2libGUgZGUgZFx1MDBlOWZpbmlyIHVuIHBhcmVudCBwb3VyIGwnZW5mYW50DQotdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlPUltcG9zc2libGUgZGUgbW9kaWZpZXIgbGEgcmVzc291cmNlLg0KLXV0aWxfUHJvY2Vzc1V0aWxfY29udHJpYnV0ZXN0bz1jb250cmlidWUgXHUwMGUwICcnezB9JycNCi11dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bz1jb250cmlidWUgbG9jYWxlbWVudCBcdTAwZTAgJyd7MH0nJw0KLXByb2Nlc3NfZXh0ZW5kcz1cdTAwZTl0ZW5kICcnezB9JycNCi1wcm9jZXNzX3JlcGxhY2VzPXJlbXBsYWNlICcnezB9JycNCi1wcm9jZXNzX2xvY2FsUmVwbGFjZXM9cmVtcGxhY2UgbG9jYWxlbWVudCAnJ3swfScnDQotIyBGaWx0ZXIgY29uc3RhbnRzIGV4dGVybmFsaXplZCBzdHJpbmdzLg0KLUZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lc190ZXh0PURpc2NpcGxpbmVzDQotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVncm91cGluZ3NfdGV4dD1SZWdyb3VwZW1lbnRzIGRlIGRpc2NpcGxpbmVzDQotRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ9TGl2cmVzIGJsYW5jcw0KLUZpbHRlckNvbnN0YW50c190b29sbWVudG9yc190ZXh0PUd1aWRlcyBkJ3V0aWxpc2F0aW9uIGRlIGwnb3V0aWwNCi1GaWx0ZXJDb25zdGFudHNfdG9vbHNfdGV4dD1PdXRpbHMNCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNfdGV4dD1SXHUwMGY0bGVzDQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ9VFx1MDBlMmNoZXMNCi1GaWx0ZXJDb25zdGFudHNfcmV1c2FibGVhc3NldHNfdGV4dD1SZXNzb3VyY2VzIHJcdTAwZTl1dGlsaXNhYmxlcw0KLUZpbHRlckNvbnN0YW50c19hbGxfdGV4dD1Ub3VzDQotRmlsdGVyQ29uc3RhbnRzX3Byb2Nlc3Nlc190ZXh0PVByb2Nlc3N1cw0KLUZpbHRlckNvbnN0YW50c19wcmFjdGljZXNfdGV4dD1QcmF0aXF1ZXMNCi1GaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ9Q2FuZXZhcw0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHNfdGV4dD1Qcm9kdWl0cw0KLUZpbHRlckNvbnN0YW50c19jaGVja2xpc3RzX3RleHQ9TGlzdGVzIGRlIGNvbnRyXHUwMGY0bGUNCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGVsaW5lc190ZXh0PUluc3RydWN0aW9ucw0KLUZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0PUVuc2VtYmxlcyBkZSByXHUwMGY0bGVzDQotRmlsdGVyQ29uc3RhbnRzX2d1aWRhbmNlX3RleHQ9Q29uc2VpbA0KLUZpbHRlckNvbnN0YW50c19jb25jZXB0c190ZXh0PUNvbmNlcHRzDQotRmlsdGVyQ29uc3RhbnRzX2V4YW1wbGVzX3RleHQ9RXhlbXBsZXMNCi1GaWx0ZXJDb25zdGFudHNfY29udGVudHBhY2thZ2VzX3RleHQ9UGFja2FnZXMgZGUgY29udGVudQ0KLUZpbHRlckNvbnN0YW50c19yb2xlZGVzY3JpcHRvcnNfdGV4dD1EZXNjcmlwdGV1cnMgZGUgclx1MDBmNGxlDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dD1SZWdyb3VwZW1lbnRzIGQnZW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMNCi1GaWx0ZXJDb25zdGFudHNfdGFza2Rlc2NyaXB0b3JzX3RleHQ9RGVzY3JpcHRldXJzIGRlIHRcdTAwZTJjaGVzDQotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRlbGVtZW50c190ZXh0PUVsXHUwMGU5bWVudHMgZGUgY29udGVudQ0KLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZT1Qclx1MDBlOXBhcmF0aW9uIGRlIGxhIHN5bmNocm9uaXNhdGlvbi4uLg0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdGRlc2NyaXB0b3JzX3RleHQ9RGVzY3JpcHRldXJzIGRlIHByb2R1aXRzDQotRmlsdGVyQ29uc3RhbnRzX2FsbGNvbnRlbnRlbGVtZW50c190ZXh0PVRvdXMgbGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSBjb250ZW51DQotRmlsdGVyQ29uc3RhbnRzX3N1cHBvcnRpbmdtYXRlcmlhbHNfdGV4dD1Eb2N1bWVudHMgZCdhY2NvbXBhZ25lbWVudA0KLU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX2Vycm9yU2F2aW5nRmlsZXM9RXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkdShkZXMpIGZpY2hpZXIocykNCi1GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0PUNhdFx1MDBlOWdvcmllcyBwZXJzb25uYWxpc1x1MDBlOWVzDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0dHlwZXNfdGV4dD1UeXBlcyBkZSBwcm9kdWl0cw0KLURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kX3dhcm5pbmdNc2c9U3VwcHJlc3Npb24gdGVybWluXHUwMGU5ZSBhdmVjIGF2ZXJ0aXNzZW1lbnQNCi1GaWx0ZXJDb25zdGFudHNfbWV0aG9kcGx1Z2luc190ZXh0PVBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZQ0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9sb2NrZWRQbHVnaW49SVVQTDAxMjBFIDogTGUgcGx1Zy1pbiAnJ3swfScnIGVzdCB2ZXJyb3VpbGxcdTAwZTkuDQotRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dD1Eb21haW5lcw0KLUZpbHRlckNvbnN0YW50c19yb2FkbWFwX3RleHQ9RmV1aWxsZXMgZGUgcm91dGUNCi1GaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0PVJhcHBvcnRzDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbD1TJnluY2hyb25pc2F0aW9uIHBhciBkXHUwMGU5ZmF1dCBcdTAwZTAgcGFydGlyIGR1IGNvbnRlbnUgZGUgbVx1MDBlOXRob2RlDQotTWFudWFsU3luY2hyb25pemVDb21tYW5kX2xhYmVsPVN5bmNocm9uaSZzYXRpb24gcGVyc29ubmFsaXNcdTAwZTllLi4uDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWw9U3luY2hyb25pc2F0aW9uIHRlcm1pblx1MDBlOWUgYXZlYyBzdWNjXHUwMGU4cy4NCi0NCi0jIFVzZXJJbnRlcmFjdGlvbkhlbHBlcg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9Qcm9jZXNzUGFja2FnZV9OYW1lPU5vbSA6DQotDQotIyBNZXRob2RDcmVhdGVDaGlsZENvbW1hbmQNCi1uZXdFbGVtZW50X3RleHQ9Tm91dmVhdShub3V2ZWxsZSkgezB9DQotdXBkYXRlX291dG9mc3luY2hfdGl0bGU9Q29uZmxpdCBkZSBtaXNlIFx1MDBlMCBqb3VyDQotdXBkYXRlX291dG9mc3luY2hfbXNnPUxlIG91IGxlcyBmaWNoaWVycyBvbnQgXHUwMGU5dFx1MDBlOSBtb2RpZmlcdTAwZTlzIHN1ciBsZSBzeXN0XHUwMGU4bWUgZGUgZmljaGllcnMuIFNvdWhhaXRlei12b3VzIFx1MDBlOWNyYXNlciBsZXMgbW9kaWZpY2F0aW9ucyA/DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwZWQ3NGEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEdlbmVyaWMgRGlhbG9nIFRpdGxlcw0KLW1vdmVEaWFsb2dfdGl0bGU9U3Bvc3RhDQotZGVsZXRlRGlhbG9nX3RpdGxlPUVsaW1pbmEgZWxlbWVudG8NCi1lcnJvckRpYWxvZ190aXRsZT1FcnJvcmUNCi1lcnJvckRpYWxvZ19jYW5ub3RSZW5hbWU9SW1wb3NzaWJpbGUgcmlub21pbmFyZSB7MH0gJyd7MX0nJyBpbiAnJ3syfScnLiBSaXNvbHZlcmUgaWwgcHJvYmxlbWEgcmlwb3J0YXRvIGluIERldHRhZ2xpIGUgZmFyZSBjbGljIHN1IE9LIHBlciBjb250aW51YXJlIG9wcHVyZSBzdSBBbm51bGxhIHBlciBpbnRlcnJvbXBlcmUgcXVlc3RhIG9wZXJhemlvbmUuDQotDQotIyBDb25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbCBEaWFsb2cNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlPUNvbmZlcm1hIHJpbW96aW9uZSByaWZlcmltZW50aQ0KLWRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGV4dD1BbGwnZWxlbWVudG8gbyBhZ2xpIGVsZW1lbnRpIGNoZSBzaSBzdGFubm8gcGVyIGVsaW1pbmFyZSBzb25vIGFuY29yYSBhc3NvY2lhdGkgcmlmZXJpbWVudGkgZGkgYWx0cmkgZWxlbWVudGkgZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaS4gQ29uIGwnZWxpbWluYXppb25lIHZlcnJhbm5vIHJpbW9zc2kgaSByaWZlcmltZW50aSBlIG5lbCBjb250ZW1wbyB2ZXJyYW5ubyBhZ2dpb3JuYXRpIGdsaSBlbGVtZW50aSBjaGUgbmUgZmFubm8gdXNvLiAgQXNzaWN1cmFyc2kgZGkgZGlzcG9ycmUgZGVsbCdhdXRvcml6emF6aW9uZSBwZXIgYWdnaW9ybmFyZSBnbGkgZWxlbWVudGkgY2hlIGZhbm5vIHVzbyBkaSByaWZlcmltZW50aSBwcmltYSBkaSBzY2VnbGllcmUgT0suICBGYXJlIGNsaWMgc3UgRGV0dGFnbGkgcGVyIGVzYW1pbmFyZSBsJ2VsZW5jbyBkZWdsaSBlbGVtZW50aSBjaGUgZmFubm8gcmlmZXJpbWVudG8gYWdsaSBlbGVtZW50aSBjaGUgc2kgc3RhIHBlciBlbGltaW5hcmUuDQotDQotIyBSZXNvbHZlIE5hbWUgQ29uZmxpY3QgRGlhbG9nDQotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZT1SaXNvbHZpIGNvbmZsaXR0byBub21pIGVsZW1lbnRpDQotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0PUltbWV0dGVyZSB1biBudW92byB7MH0gcGVyICcnezF9Jyc6DQotDQotIyBTZWxlY3QgRGVsaXZlcmFibGVzIERpYWxvZw0KLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190aXRsZT1TZWxlemlvbmEgY29tcG9uZW50ZSBkaXN0cmlidWliaWxlDQotc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RleHQ9U2VsZXppb25hcmUgdW4gY29tcG9uZW50ZSBkaXN0cmlidWliaWxlIGluIGN1aSBzaSBkZXNpZGVyYSBhc3NlZ25hcmUgaWwgcHJvZG90dG8gZGkgbGF2b3JvICcnezB9JycuDQotDQotIyBOZXcgUHJvY2VzcyBDb21wb25lbnQgRGlhbG9nDQotbmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZT1OdW92byBjb21wb25lbnRlIHByb2Nlc3NvDQotbmFtZUxhYmVsX3RleHQ9Tm9tZToNCi1kZWZhdWx0Q29uZmlnTGFiZWxfdGV4dD1Db25maWd1cmF6aW9uZSBwcmVkZWZpbml0YToNCi1iYXNlUHJvY2Vzc0xhYmVsX3RleHQ9UHJvY2Vzc28gZGkgYmFzZToNCi1iYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dD1CYXNhdG8gc3UgcHJvY2Vzc2k6DQotDQotIyBSb2xlIEFzc29jaWF0aW9uIERpYWxvZw0KLXNlbGVjdEFzc29jaWF0aW9uTGFiZWxfdGV4dD1TZWxlemlvbmEgYXNzb2NpYXppb25lIHBlciBsJydvcGVyYXppb25lICcnezB9JycNCi0NCi0jIFJlbW92ZSBBc3NvY2lhdGlvbiBkaWFsb2cNCi1yZW1vdmVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PVJpbXVvdmkgYXNzb2NpYXppb25lDQotDQotIyBTZWxlY3QgVGVhbXMgRGlhbG9nDQotc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGU9U2VsZXppb25hIHRlYW0NCi1zZWxlY3RUZWFtc0RpYWxvZ190ZXh0PVNlbGV6aW9uYXJlIHVuIHRlYW0gaW4gY3VpIHNpIGRlc2lkZXJhIGFzc2VnbmFyZSB1biBydW9sbyAnJ3swfScnLg0KLQ0KLSMgVGFzbCBTZWxlY3Rpb24gRGlhbG9nDQotdGFza1NlbGVjdGlvbkRpYWxvZ190aXRsZT1TZWxlemlvbmUgb3BlcmF6aW9uZQ0KLXRpdGxlTGFiZWxfdGV4dD1TZWxlemlvbmEgb3BlcmF6aW9uaS4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDBFOiBJbCBub21lIHswfSBtYW5jYS5cblxuVHV0dGkgZ2xpIGVsZW1lbnRpIGRpIG1ldG9kbyBlIGRpIHByb2Nlc3NvIGRldm9ubyBhdmVyZSB1biBub21lLlxuXG5JbW1ldHRlcmUgdW4gbm9tZSB2YWxpZG8gZSBwcm92YXJlIGRpIG51b3ZvLg0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPUlsIG5vbWUgbm9uIHB1XHUwMGYyIGVzc2VyZSB2dW90by4gU3BlY2lmaWNhcmUgdW4gbm9tZSB2YWxpZG8uDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDFFOiBJbCBub21lICcnezB9JycgZXNpc3RlIGdpXHUwMGUwLiBcblxuR2xpIGVsZW1lbnRpIGRpIG1ldG9kbyBkZXZvbm8gYXZlcmUgdW4gbm9tZSB1bml2b2NvLlxuXG5JbW1ldHRlcmUgdW4gYWx0cm8gbm9tZSBlIHByb3ZhcmUgZGkgbnVvdm8uDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPUxvIHN0ZXNzbyBub21lIGRpIGVsZW1lbnRvIGVzaXN0ZSBnaVx1MDBlMC4gU3BlY2lmaWNhcmUgdW4gYWx0cm8gbm9tZS4NCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjFfbXNnPUlVUEwwMTAyRTogSWwgbm9tZSAnJ3swfScnIG5vbiBcdTAwZTggdmFsaWRvLlxuXG5JIG5vbWkgZGVnbGkgZWxlbWVudGkgZGkgbWV0b2RvIG5vbiBwb3Nzb25vIGluaXppYXJlIGNvbiB1bm8gc3BhemlvLlxuXG5JbW1ldHRlcmUgdW4gbm9tZSB2YWxpZG8gZSBwcm92YXJlIGRpIG51b3ZvLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c9SVVQTDAxMDNFOiBJbCBub21lICcnezB9Jycgbm9uIFx1MDBlOCB2YWxpZG8uXG5cbkkgbm9taSBkZWdsaSBlbGVtZW50aSBkaSBtZXRvZG8gbm9uIHBvc3Nvbm8gdGVybWluYXJlIGNvbiB1biBwdW50by5cblxuSW1tZXR0ZXJlIHVuIG5vbWUgdmFsaWRvIGUgcHJvdmFyZSBkaSBudW92by4NCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnPUlVUEwwMTA0RTogSWwgbm9tZSAnJ3swfScnIG5vbiBcdTAwZTggdmFsaWRvLlxuXG5JIG5vbWkgZGVnbGkgZWxlbWVudGkgZGkgbWV0b2RvIG5vbiBwb3Nzb25vIGNvbnRlbmVyZSBpIHNlZ3VlbnRpIGNhcmF0dGVyaTogXFwgLyA6ICogPyAiIDwgPiA7IHxcblxuSW1tZXR0ZXJlIHVuIG5vbWUgdmFsaWRvIGUgcmlwcm92YXJlIGRpIG51b3ZvLg0KLW5vQ29uZmlnRXJyb3JfbXNnPUlVUEwwMTA1RTogTGEgbGlicmVyaWEgZGVpIG1ldG9kaSBjb3JyZW50ZSBub24gY29udGllbmUgY29uZmlndXJhemlvbmkgZGkgbWV0b2RvLlxuXG5QZXIgY3JlYXJlIHVuIG51b3ZvIHByb2Nlc3NvLCBvY2NvcnJlIHVuYSBjb25maWd1cmF6aW9uZSBkaSBtZXRvZG8uXG5cbkNyZWFyZSB1bmEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvIGUgcHJvdmFyZSBkaSBudW92by4NCi1ub0RlbGl2ZXJ5UHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwNkU6IExhIGxpYnJlcmlhIGRlaSBtZXRvZGkgY29ycmVudGUgbm9uIGNvbnRpZW5lIHByb2Nlc3NpIGRpIHByb2R1emlvbmUuXG5cblBlciBjcmVhcmUgdW4gbnVvdm8gY29udHJpYnV0byBhbCBwcm9jZXNzbywgb2Njb3JyZSB1biBwcm9jZXNzbyBkaSBwcm9kdXppb25lIGRpIGJhc2UuXG5cbkNyZWFyZSB1biBwcm9jZXNzbyBkaSBwcm9kdXppb25lIGUgcHJvdmFyZSBkaSBudW92by4NCi1ub0RlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQTDAxMDdFOiBOb24gXHUwMGU4IHN0YXRhIHNlbGV6aW9uYXRhIGFsY3VuYSBjb25maWd1cmF6aW9uZSBkaSBtZXRvZG8uXG5cblx1MDBjOCBuZWNlc3NhcmlvIGFzc2VnbmFyZSBhbCBudW92byBwcm9jZXNzbyB1bmEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvIHByZWRlZmluaXRhLlxuXG5TZWxlemlvbmFyZSB1bmEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvIGUgcHJvdmFyZSBkaSBudW92by4NCi1ub0Jhc2VQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA4RTogTm9uIFx1MDBlOCBzdGF0byBzZWxlemlvbmF0byBhbGN1biBwcm9jZXNzbyBkaSBwcm9kdXppb25lLlxuXG5JIGNvbnRyaWJ1dGkgYWkgcHJvY2Vzc2kgcmljaGllZG9ubyB1biBwcm9jZXNzbyBkaSBwcm9kdXppb25lIGRpIGJhc2UuXG5cblNlbGV6aW9uYXJlIHVuIHByb2Nlc3NvIGRpIHByb2R1emlvbmUgZSBwcm92YXJlIGRpIG51b3ZvLg0KLWNyZWF0ZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDlFOiBJbXBvc3NpYmlsZSBjcmVhcmUgaWwgcHJvY2Vzc28gY29ycmV0dGFtZW50ZS4NCi1jcmVhdGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTEwRTogSW1wb3NzaWJpbGUgY3JlYXJlIGwnZWxlbWVudG8gY29ycmV0dGFtZW50ZS4NCi1kZWxldGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTExRTogSW1wb3NzaWJpbGUgZWxpbWluYXJlIGwnZWxlbWVudG8gY29ycmV0dGFtZW50ZS4NCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX21zZz1JVVBMMDExMkU6IEltcG9zc2liaWxlIGNyZWFyZSBpbCBmaWxlIGRlbCBjb250ZW51dG8gcGVyIGwnJ2VsZW1lbnRvLlxuXG5VbiBmaWxlICcnezB9JycgZXNpc3RlIGdpXHUwMGUwLlxuXG5JbW1ldHRlcmUgdW4gYWx0cm8gbm9tZSBlIHByb3ZhcmUgZGkgbnVvdm8uDQotZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9zaW1wbGVfbXNnPVVuIGZpbGUgZGVsIGNvbnRlbnV0byBjb24gbG8gc3Rlc3NvIG5vbWUgZXNpc3RlIGdpXHUwMGUwLiBTcGVjaWZpY2FyZSB1biBhbHRybyBub21lLg0KLXVuZG9Db21tYW5kRXJyb3JfbXNnPUlVUEwwMTEzRTogSW1wb3NzaWJpbGUgY29tcGxldGFyZSBpbCBjb21hbmRvICcnezB9JycuXG5cblNpIFx1MDBlOCB2ZXJpZmljYXRvIHVuIGVycm9yZTogezF9DQotaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnPUlVUEwwMTE0RTogTCdpbmRpY2UgZGVsIHByZWRlY2Vzc29yZSBzcGVjaWZpY2F0byBub24gXHUwMGU4IHZhbGlkby5cblxuR2xpIGluZGljaSBkZWkgcHJlZGVjZXNzb3JpIGRldm9ubyBlc3NlcmUgdmFsb3JpIGludGVyaSBwcmVzZW50aSBuZWxsYSBjb2xvbm5hICdJbmRpY2UnLlxuXG5TcGVjaWZpY2FyZSB1biB2YWxvcmUgdmFsaWRvIGUgcHJvdmFyZSBkaSBudW92by4NCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzPUlVUEwwMTAwVzogJyd7MH0nJyBcdTAwZTggZ2lcdTAwZTAgYXNzb2NpYXRvIGEgJyd7MX0nJy4gIFx1MDBjOCBjb25zZW50aXRhIHVuYSBzb2xhIGFzc29jaWF6aW9uZSBkaSBxdWVzdG8gdGlwby4gIFBlciBhc3NlZ25hcmUgJyd7MH0nJyBhICcnezJ9JycgXHUwMGU4IG5lY2Vzc2FyaW8gcHJpbWEgZWxpbWluYXJsbyBkYSAnJ3sxfScnLg0KLWVycm9yX21zZ1dpdGhEZXRhaWxzPUlVUEwwMTE2RTogU2kgXHUwMGU4IHZlcmlmaWNhdG8gdW4gZXJyb3JlLiBGYXJlIGNsaWMgc3UgRGV0dGFnbGkgcGVyIHVsdGVyaW9yaSBpbmZvcm1hemlvbmkuDQotZXJyb3JfbXNnPUlVUEwwMTE3RTogU2kgXHUwMGU4IHZlcmlmaWNhdG8gdW4gZXJyb3JlLiBDb250cm9sbGFyZSBpbCBsb2cgZGVnbGkgZXJyb3JpIHBlciB1bHRlcmlvcmkgZGV0dGFnbGkuDQotU3VwcHJlc3Npb25fbmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE4RTogRG9wbyBxdWVzdGEgb3BlcmF6aW9uZSBzaSB2ZXJpZmljaGVyXHUwMGUwIHVuIGNvbmZsaXR0byBkaSBub21lLiBDb250cm9sbGFyZSBpbCBub21lIGRlbGwnZWxlbWVudG8gcGVyIGxhIGR1cGxpY2F6aW9uZSBlIHByb3ZhcmUgbnVvdmFtZW50ZQ0KLVN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbj1JVVBMMDExOUU6IERvcG8gcXVlc3RhIG9wZXJhemlvbmUgc2kgdmVyaWZpY2hlclx1MDBlMCB1biBjb25mbGl0dG8gZGkgbm9tZS4gQ29udHJvbGxhcmUgaWwgbm9tZSBkZWxsYSBwcmVzZW50YXppb25lIGRlbGwnZWxlbWVudG8gcGVyIGxhIGR1cGxpY2F6aW9uZSBlIHByb3ZhcmUgbnVvdmFtZW50ZQ0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1TaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUuIEZhcmUgY2xpYyBzdSBEZXR0YWdsaSBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4NCi1zYXZlUHJvY2Vzc0Vycm9yX3JlYXNvbj1TaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUgZHVyYW50ZSBpbCBzYWx2YXRhZ2dpbyBkZWwgcHJvY2Vzc28gJyd7MH0nJy4gRmFyZSBjbGljIHN1IERldHRhZ2xpIHBlciB1bHRlcmlvcmkgaW5mb3JtYXppb25pLg0KLWRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb249U2kgXHUwMGU4IHZlcmlmaWNhdG8gdW4gZXJyb3JlIGR1cmFudGUgbGEgcmltb3ppb25lIGRlaSByaWZlcmltZW50aSBhc3NvY2lhdGkgYSBxdWVzdG8gZWxlbWVudG8uIEZhcmUgY2xpYyBzdSBEZXR0YWdsaSBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4NCi1zYXZlRmlsZUVycm9yX3JlYXNvbj1TaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUgZHVyYW50ZSBpbCBzYWx2YXRhZ2dpbyBkZWwgZmlsZSAnJ3swfScnLiBGYXJlIGNsaWMgc3UgRGV0dGFnbGkgcGVyIHVsdGVyaW9yaSBpbmZvcm1hemlvbmkuDQotaW52YWxpZFJlZmVyZW5jZXNFcnJvcl9yZWFzb249UmlsZXZhdGkgZWxlbWVudGkgZGkgbWV0b2RvIGNvbiByaWZlcmltZW50aSBub24gdmFsaWRpIGNvbWUgcmlzdWx0YXRvIGRpIHVuYSBjb3BpYSBkYSB1biBwbHVnLWluIGFsbCdhbHRyby5cblF1ZXN0aSByaWZlcmltZW50aSB2ZXJyYW5ubyByaW1vc3NpLiBDb250aW51YXJlPw0KLXVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb249Tm9uIFx1MDBlOCBwb3NzaWJpbGUgbW9kaWZpY2FyZSB1biBvZ2dldHRvIGNoZSBub24gXHUwMGU4IHN0YXRvIHJpc29sdG86IHswfShVUkkgPSB7MX0pezJ9DQotDQotIyBXYXJuaW5nIG1lc3NhZ2VzDQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE4VzogSW1wb3NzaWJpbGUgdHJvdmFyZSB1bm8gbyBwaVx1MDBmOSBlbGVtZW50aSBkaSBvcmlnaW5lLiBJIGZpbGUgYXNzb2NpYXRpIG5lbGxhIGNhcnRlbGxhIGRlbGxlIHJpc29yc2Ugbm9uIHZlcnJcdTAwZTAgY29waWF0by4NCi1BY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE5VzogSW1wb3NzaWJpbGUgdHJvdmFyZSB1bm8gbyBwaVx1MDBmOSBlbGVtZW50aSBkaSBvcmlnaW5lLiBJIHBhY2NoZXR0aSBkZWwgcHJvY2Vzc28gYXNzb2NpYXRpIG5vbiB2ZXJyYW5ubyBjb3BpYXRpLg0KLUFjdGl2aXR5RHJvcENvbW1hbmRfZGVlcENvcHlfcHJvbXB0Q29uZmlndXJhdGlvbk1zZz1Db3BpYXJlIHR1dHRpIGkgZGVzY3JpdHRvcmk/XG5cbkZhY2VuZG8gY2xpYyBzdSBObyBzaSBjb3BpYW5vIHNvbG8gaSBkZXNjcml0dG9yaSBjaGUgZmFubm8gcGFydGUgZGVsbGEgY29uZmlndXJhemlvbmUgY29ycmVudGUuDQotZGVlcENvcHlfcHJvbXB0TXNnPVNpIG90dGllbmUgdW5hIGNvcGlhIGRpIHR1dHRpIGdsaSBlbGVtZW50aSBjb2xsZWdhdGkgaW4gbW9kbyBkaW5hbWljbyBuZWNlc3NhcmlhIHBlciBtYW50ZW5lcmxpIHNlcGFyYXRpIGQnb3JhIGluIHBvaS4gQ29udGludWFyZT8NCi1kZWVwQ29weV90aXRsZT1Db3BpYSBwcm9mb25kYQ0KLQ0KLSMgUHJvZ3Jlc3MgbWVzc2FnZXMNCi1jcmVhdGluZ1Byb2Nlc3NDb21wb25lbnRUYXNrX25hbWU9Q3JlYXppb25lIGRlbCBjb21wb25lbnRlIGRlbCBwcm9jZXNzbyAnJ3swfScnIGluIGNvcnNvLi4uDQotcHJvY2Vzc2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9RWxhYm9yYXppb25lIGRlaSByaWZlcmltZW50aSBpbiBjb3Jzby4uLg0KLWRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWU9RWxpbWluYXppb25lIGRlZ2xpIGVsZW1lbnRpIGUgZGVpIGZpbGUgYXNzb2NpYXRpIGluIGNvcnNvLi4uDQotY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lPVZlcmlmaWNhIGRlaSByaWZlcmltZW50aSBpbiBjb3Jzby4uLg0KLXJlbW92aW5nUmVmZXJlbmNlc3Rhc2tfbmFtZT1SaW1vemlvbmUgZGVpIHJpZmVyaW1lbnRpIGluIGNvcnNvLi4uDQotc2F2aW5nTW9kaWZpZWRGaWxlc1Rhc2tfbmFtZT1TYWx2YXRhZ2dpbyBkZWkgZmlsZSBtb2RpZmljYXRpIGluIGNvcnNvLi4uDQotY2hlY2tBZmZlY3RlZFJlc291cmNlc1Rhc2tfbmFtZT1WZXJpZmljYSBkZWxsZSByaXNvcnNlIGNvaW52b2x0ZS4uLg0KLW1vdmluZ1Rhc2tfbmFtZT1TcG9zdGFtZW50byBpbiBjb3Jzby4uLg0KLW1vdmluZ0ZpbGVzVGFza19uYW1lPVNwb3N0YW1lbnRvIGRlaSBmaWxlIGluIGNvcnNvLi4uDQotY29weWluZ1Jlc291cmNlc1Rhc2tfbmFtZT1Db3BpYSBkZWxsZSByaXNvcnNlIGluIGNvcnNvLi4uDQotY29weWluZ0FjdGl2aXRpZXNfbXNnPUNvcGlhIGRlbGwnJ2F0dGl2aXRcdTAwZTAgJyd7MH0nJw0KLXNhdmluZ0ZpbGVUYXNrX25hbWU9U2FsdmF0YWdnaW8gZGVsIGZpbGUgJyd7MH0nJyBpbiBjb3Jzby4uLg0KLQ0KLSMgVUkgVGV4dA0KLWVsZW1lbnRfdGV4dD1lbGVtZW50bw0KLWNyZWF0ZUVsZW1lbnRfdGV4dD1DcmVhIGVsZW1lbnRvDQotY3JlYXRlUHJvY2Vzc190ZXh0PUNyZWEgcHJvY2Vzc28NCi1jb250cmlidXRlc1RvX3RleHQ9Q29udHJpYnVpc2NlIGENCi1sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dD1Db250cmlidWlzY2UgbG9jYWxtZW50ZSBhDQotZXh0ZW5kc190ZXh0PUVzdGVuZGUNCi1yZXBsYWNlc190ZXh0PVNvc3RpdHVpc2NlDQotbG9jYWxSZXBsYWNlc190ZXh0PVNvc3RpdHVpc2NlIGxvY2FsbWVudGUNCi1sb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHlfdGV4dD1Tb3N0aXR1emlvbmUgbG9jYWxlIGUgY29waWEgcHJvZm9uZGENCi1lbGVtZW50VHlwZV90ZXh0PXswfTogezF9DQotZGVsaXZlcmFibGVzX3RleHQ9Q29tcG9uZW50aSBkaXN0cmlidWliaWxpDQotY29udHJpYnV0ZVRvQWN0aXZpdHlfdGV4dD1Db250cmlidWlzY2kgYWQgYXR0aXZpdFx1MDBlMA0KLUFjdGl2aXR5RHJvcENvbW1hbmRfbGFiZWw9QXR0aXZpdFx1MDBlMCBkaSByaWxhc2Npbw0KLXJlcGxhY2VBY3Rpdml0eV90ZXh0PVNvc3RpdHVpc2NpIGF0dGl2aXRcdTAwZTANCi1maWxlX3RleHQ9ZmlsZQ0KLWRpcmVjdG9yeV90ZXh0PWRpcmVjdG9yeQ0KLXVucmVzb2x2ZWRfdGV4dD0obm9uIHJpc29sdG8gJyd7MH0nJykNCi1hc3Npc3RzX3RleHQ9QXNzaXN0ZQ0KLXVua25vd25fdGV4dD1TY29ub3NjaXV0byANCi1jb21tYW5kX2RvbmU9Q29tcGxldGF0bw0KLQ0KLSMgVGhlIGZvbGxvd2luZyBVSSB0ZXh0IHNob3VsZCBiZSByZXZpZXdlZC4NCi1VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eXdpdGhwbHVnaW5faW5mbz17MH0gKHsxfSAnJ3syfScnIGluICcnezN9JycpDQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHlfaW5mbz17MH0gKHsxfSAnJ3syfScnKQ0KLXVpX3JlZl9kZWxldGU9SWwgZGVzY3JpdHRvcmUgJyd7MH0nJyBkaXNwb25lIGRlaSBzZWd1ZW50aSByaWZlcmltZW50aSBjaGUgbm9uIHNvbm8gdXRpbGl6emF0aSBhbHRyb3ZlLlxuU2VsZXppb25hcmUgaSByaWZlcmltZW50aSBjaGUgc2kgZGVzaWRlcmEgZWxpbWluYXJlOg0KLXVpX3JlZl9kZWxldGUyPUkgc2VndWVudGkgcmlmZXJpbWVudGkgbm9uIHNvbm8gdXRpbGl6emF0aSBkYSBuZXNzdW5hIHBhcnRlLlxuU2VsZXppb25hcmUgaSByaWZlcmltZW50aSBjaGUgc2kgZGVzaWRlcmEgZWxpbWluYXJlOg0KLXVpX3JlZmVyZW5jZXM9UmlmZXJpbWVudGkNCi11aV93b3JrcHJvZHVjdF9kZXNjcmlwdG9yX2Rlc2NyaXB0aW9uPUlsIGRlc2NyaXR0b3JlIGRpIHByb2RvdHRpIGRpIGxhdm9ybyAnJ3swfScnIFx1MDBlOCBhc3NvY2lhdG8gKE91dHB1dCBkaSkgYWwgZGVzY3JpdHRvcmUgZGkgb3BlcmF6aW9uaSAnJ3sxfScnDQotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX29wdGlvbnM9T3B6aW9uaQ0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbD1SaW11b3ZpIGRlc2NyaXR0b3JlIGRpIHByb2RvdHRpIGRpIGxhdm9ybyBjb21lIG91dHB1dCBkZWwgZGVzY3JpdHRvcmUgZGkgb3BlcmF6aW9uaQ0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9kZWxldGVfdGFzaz1FbGltaW5hIGRlc2NyaXR0b3JlIGRpIG9wZXJhemlvbmkgZGFsbCdhdHRpdml0XHUwMGUwDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2RlZmF1bHRjb25maWdjaGVjaz1MJydlbGVtZW50byBzZWxlemlvbmF0byAnJ3swfScnIG5vbiBcdTAwZTggbGEgY29uZmlndXJhemlvbmUgcHJlZGVmaW5pdGEgZGVsIHByb2Nlc3NvLlxuQWdnaXVuZ2VyZSBxdWVzdG8gZWxlbWVudG8gZSBsZSByZWxhdGl2ZSBkaXBlbmRlbnplIGFsbGEgY29uZmlndXJhemlvbmUgcHJlZGVmaW5pdGE/DQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2dlbmVyaWNFcnJfbWVzc2FnZV90ZXh0PUVycm9yaSBkdXJhbnRlIGwnb3BlcmF6aW9uZS4gRmFyZSBjbGljIHN1IGRldHRhZ2xpIHBlciB1bHRlcmlvcmkgaW5mb3JtYXppb25pLg0KLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fbm9EZXNjcmlwdG9yVG9TeW5jaD1OZXNzdW4gZGVzY3JpdHRvcmUgY29uIGVsZW1lbnRvIGRpIG1ldG9kbyBjb2xsZWdhdG8gcmlsZXZhdG8gcGVyIGxhIHNpbmNyb25penphemlvbmUNCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9yZWZlcnNoaW5ndmlld2VyPUVycm9yZSBkdXJhbnRlIGwnYWdnaW9ybmFtZW50byBkZWwgdmlzdWFsaXp6YXRvcmUNCi1jb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQ9R2xpIGVsZW1lbnRpIGVsZW5jYXRpIG5laSBkZXR0YWdsaSBwb3RyZWJiZXJvIGF2ZXJlIHJpZmVyaW1lbnRpIGlsbGVnYWxpIGEgcXVlc3RhIGd1aWRhIGRvcG8gbGEgY29udmVyc2lvbmUuIEZhcmUgY2xpYyBzdSBPSyBwZXIgcmltdW92ZXJsaSBlIGNvbnRpbnVhcmUuDQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfdW5oYW5kbGVkX2V4Y2VwdGlvbj1FY2NlemlvbmUgbm9uIGdlc3RpdGENCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX2JyZWFrZG93bl9lbGVtZW50PUltcG9zc2liaWxlIGF2ZXJlIGxvIHN0ZXNzbyBlbGVtZW50byBkaSBpbnRlcnJ1emlvbmUgY29tZSBwcmVkZWNlc3NvcmUgZSBzdWNjZXNzb3JlDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dwbGlzdGRsZ19tc2c9SWwgcHJvZG90dG8gZGVsIGxhdm9ybyAnJ3swfScnIFx1MDBlOCB1biBvdXRwdXQgZGVsbGUgc2VndWVudGkgb3BlcmF6aW9uaS5cblNlbGV6aW9uYXJlIGxlIG9wZXJhemlvbmkgcGVyIGxlIHF1YWxpIHNpIGRlc2lkZXJhIGNyZWFyZSBpIGRlc2NyaXR0b3JpIGNvcnJpc3BvbmRlbnRpLg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9yb2xlbGlzdGRsZ19tc2c9TGEgcmVnb2xhICcnezB9JycgXHUwMGU4IHJlc3BvbnNhYmlsZSBkZWkgc2VndWVudGkgcHJvZG90dGkgZGkgbGF2b3JvLlxuU2VsZXppb25hcmUgaSBwcm9kb3R0aSBkaSBsYXZvcm8gcGVyIGkgcXVhbGkgc2kgZGVzaWRlcmEgY3JlYXJlIGkgZGVzY3JpdHRvcmkgY29ycmlzcG9uZGVudGkuDQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfZmF0YWxlcnI9RXJyb3JlIGlycmV2ZXJzaWJpbGUNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd29ya3Byb2R1Y3RzPVByb2RvdHRpIGRpIGxhdm9ybw0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfc3ViX2VsZW1lbnQ9SW1wb3NzaWJpbGUgY29sbGVnYXJlIHVuIGVsZW1lbnRvIGRlbGxhIHN1ZGRpdmlzaW9uZSBhIHVubyBkZWkgcmVsYXRpdmkgZWxlbWVudGkgY2hpbGQNCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl93cm9uZ19lbGVtZW50PUltcG9zc2liaWxlIGNvbGxlZ2FyZSBhbGwnZWxlbWVudG8gdW4gZWxlbWVudG8gZGl2ZXJzbyBkYSBxdWVsbG8gZGVsbGEgc3VkZGl2aXNpb25lIGRpIGxhdm9yby4NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9jaGlsZF9lbGVtZW50PUltcG9zc2liaWxlIGNvbGxlZ2FyZSB1biBlbGVtZW50byBkZWxsYSBzdWRkaXZpc2lvbmUgYSB1bm8gZGVpIHJlbGF0aXZpIGVsZW1lbnRpIGNoaWxkLg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrcz1PcGVyYXppb25pDQotdWlfYXNzb2NpYXRpb25fdGFza19zZWxlY3Rpb249U2VsZXppb25lIG9wZXJhemlvbmkuLi4NCi11dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlcj1cIFwgYWRhdHRhdG9yZSBkZWxsJ2VsZW1lbnRvIGNoaWxkOiANCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zZXRwYXJlbnQ9SW1wb3NzaWJpbGUgaW1wb3N0YXJlIGVsZW1lbnRvIHBhcmVudCBwZXIgZWxlbWVudG8gY2hpbGQNCi11dGlsX3RuZ3V0aWxfY2Fubm90X2VkaXRfcmVzb3VyY2U9SW1wb3NzaWJpbGUgbW9kaWZpY2FyZSByaXNvcnNhLg0KLXV0aWxfUHJvY2Vzc1V0aWxfY29udHJpYnV0ZXN0bz1jb250cmlidWlzY2UgYSAnJ3swfScnDQotdXRpbF9Qcm9jZXNzVXRpbF9sb2NhbENvbnRyaWJ1dGVzdG89Y29udHJpYnVpc2NlIGxvY2FsbWVudGUgYSAnJ3swfScnDQotcHJvY2Vzc19leHRlbmRzPWVzdGVuZGUgJyd7MH0nJw0KLXByb2Nlc3NfcmVwbGFjZXM9c29zdGl0dWlzY2UgJyd7MH0nJw0KLXByb2Nlc3NfbG9jYWxSZXBsYWNlcz1zb3N0aXR1aXNjZSBsb2NhbG1lbnRlICcnezB9JycNCi0jIEZpbHRlciBjb25zdGFudHMgZXh0ZXJuYWxpemVkIHN0cmluZ3MuDQotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVzX3RleHQ9RGlzY2lwbGluZQ0KLUZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lZ3JvdXBpbmdzX3RleHQ9UmFnZ3J1cHBhbWVudGkgZGlzY2lwbGluZQ0KLUZpbHRlckNvbnN0YW50c193aGl0ZXBhcGVyc190ZXh0PVdoaXRlcGFwZXINCi1GaWx0ZXJDb25zdGFudHNfdG9vbG1lbnRvcnNfdGV4dD1HdWlkYSBhbCB0b29sDQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ9VG9vbA0KLUZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0PVJ1b2xpDQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ9T3BlcmF6aW9uaQ0KLUZpbHRlckNvbnN0YW50c19yZXVzYWJsZWFzc2V0c190ZXh0PVJpc29yc2Ugcml1dGlsaXp6YWJpbGkNCi1GaWx0ZXJDb25zdGFudHNfYWxsX3RleHQ9VHV0dG8NCi1GaWx0ZXJDb25zdGFudHNfcHJvY2Vzc2VzX3RleHQ9UHJvY2Vzc2kNCi1GaWx0ZXJDb25zdGFudHNfcHJhY3RpY2VzX3RleHQ9UHJhdGljaGUNCi1GaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ9TW9kZWxsaQ0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHNfdGV4dD1Qcm9kb3R0aSBkaSBsYXZvcm8NCi1GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0PUVsZW5jaGkgZGkgY29udHJvbGxvDQotRmlsdGVyQ29uc3RhbnRzX2d1aWRlbGluZXNfdGV4dD1MaW5lZSBndWlkYQ0KLUZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0PUluc2llbWkgZGkgcnVvbGkNCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dD1HdWlkYQ0KLUZpbHRlckNvbnN0YW50c19jb25jZXB0c190ZXh0PUNvbmNldHRpDQotRmlsdGVyQ29uc3RhbnRzX2V4YW1wbGVzX3RleHQ9RXNlbXBpDQotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRwYWNrYWdlc190ZXh0PVBhY2NoZXR0aSBkZWwgY29udGVudXRvDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0PURlc2NyaXR0b3JpIGRpIHJ1b2xpDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dD1SYWdncnVwcGFtZW50aSBpbnNpZW1pIGRpIHJ1b2xpDQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tkZXNjcmlwdG9yc190ZXh0PURlc2NyaXR0b3JpIGRpIG9wZXJhemlvbmkNCi1GaWx0ZXJDb25zdGFudHNfY29udGVudGVsZW1lbnRzX3RleHQ9RWxlbWVudGkgZGVsIGNvbnRlbnV0bw0KLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZT1QcmVwYXJhemlvbmUgYWxsYSBzaW5jcm9uaXp6YXppb25lIGluIGNvcnNvLi4uDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnNfdGV4dD1EZXNjcml0dG9yaSBkaSBwcm9kb3R0aSBkaSBsYXZvcm8NCi1GaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ9VHV0dGkgZ2xpIGVsZW1lbnRpIGRlbCBjb250ZW51dG8NCi1GaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0PU1hdGVyaWFsZSBkaSBzdXBwb3J0bw0KLU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX2Vycm9yU2F2aW5nRmlsZXM9RXJyb3JlIGR1cmFudGUgaWwgc2FsdmF0YWdnaW8gZGVpIGZpbGUNCi1GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0PUNhdGVnb3JpZSBwZXJzb25hbGl6emF0ZQ0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHR5cGVzX3RleHQ9VGlwaSBkaSBwcm9kb3R0byBkaSBsYXZvcm8NCi1EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZF93YXJuaW5nTXNnPUVsaW1pbmF6aW9uZSBjb21wbGV0YXRhIGNvbiBhdnZpc28NCi1GaWx0ZXJDb25zdGFudHNfbWV0aG9kcGx1Z2luc190ZXh0PVBsdWctaW4gZGVsIG1ldG9kbw0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9sb2NrZWRQbHVnaW49SVVQTDAxMjBFOiBJbCBwbHVnaW4gJyd7MH0nJyBcdTAwZTggYmxvY2NhdG8uDQotRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dD1Eb21pbmkNCi1GaWx0ZXJDb25zdGFudHNfcm9hZG1hcF90ZXh0PVJvYWRtYXANCi1GaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0PVJlcG9ydA0KLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9UyZpbmNyb25penphemlvbmUgcHJlZGVmaW5pdGEgZGFsIGNvbnRlbnV0byBkZWwgbWV0b2RvDQotTWFudWFsU3luY2hyb25pemVDb21tYW5kX2xhYmVsPVNpbmNyb25penphemlvbmUgJnBlcnNvbmFsaXp6YXRhIGluIGNvcnNvLi4uDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWw9U2luY3Jvbml6emF6aW9uZSBjb21wbGV0YXRhIGNvcnJldHRhbWVudGUuDQotDQotIyBVc2VySW50ZXJhY3Rpb25IZWxwZXINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZT1Ob21lOiANCi0jIE1ldGhvZENyZWF0ZUNoaWxkQ29tbWFuZA0KLW5ld0VsZW1lbnRfdGV4dD1OdW92byB7MH0NCi11cGRhdGVfb3V0b2ZzeW5jaF90aXRsZT1Db25mbGl0dG8gZGkgYWdnaW9ybmFtZW50bw0KLXVwZGF0ZV9vdXRvZnN5bmNoX21zZz1JIGZpbGUgc29ubyBzdGF0aSBtb2RpZmljYXRpIG5lbCBmaWxlIHN5c3RlbS4gU292cmFzY3JpdmVyZSBsZSBtb2RpZmljaGU/DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfamEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczMGJjZDQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEdlbmVyaWMgRGlhbG9nIFRpdGxlcw0KLW1vdmVEaWFsb2dfdGl0bGU9XHU3OWZiXHU1MmQ1DQotZGVsZXRlRGlhbG9nX3RpdGxlPVx1ODk4MVx1N2QyMFx1MzA2ZVx1NTI0YVx1OTY2NA0KLWVycm9yRGlhbG9nX3RpdGxlPVx1MzBhOFx1MzBlOVx1MzBmYw0KLWVycm9yRGlhbG9nX2Nhbm5vdFJlbmFtZT17MH0gJyd7MX0nJyBcdTMwOTIgJyd7Mn0nJyBcdTMwNmJcdTU0MGRcdTUyNGRcdTU5MDlcdTY2ZjRcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgXHUzMDBjXHU4YTczXHU3ZDMwXHUzMDBkXHUzMDZiXHU3OTNhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHU1NTRmXHU5ODRjXHUzMDkyXHU4OWUzXHU2YzdhXHUzMDU3XHUzMDY2XHUzMDRiXHUzMDg5XHUzMDBjT0tcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTdkOWFcdTg4NGNcdTMwNTlcdTMwOGJcdTMwNGJcdTMwMDFcdTMwMGNcdTMwYWRcdTMwZTNcdTMwZjNcdTMwYmJcdTMwZWJcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTY0Y2RcdTRmNWNcdTMwOTJcdTYyNTNcdTMwNjFcdTUyMDdcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIENvbmZpcm0gUmVmZXJlbmNlcyBSZW1vdmFsIERpYWxvZw0KLWRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGl0bGU9XHU1M2MyXHU3MTY3XHUzMDZlXHU5NjY0XHU1M2JiXHUzMDZlXHU3OGJhXHU4YThkDQotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190ZXh0PVx1NTI0YVx1OTY2NFx1MzA1N1x1MzA4OFx1MzA0Nlx1MzA2OFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1ODk4MVx1N2QyMFx1MzA2Zlx1MzAwMVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NTE4NVx1MzA2ZVx1NTIyNVx1MzA2ZVx1ODk4MVx1N2QyMFx1MzA2Ylx1MzA4OFx1MzA2M1x1MzA2Nlx1NTNjMlx1NzE2N1x1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwNTNcdTMwOGNcdTMwODlcdTMwNmVcdTg5ODFcdTdkMjBcdTMwOTJcdTUyNGFcdTk2NjRcdTMwNTlcdTMwOGJcdTMwNjhcdTMwMDFcdTMwNWRcdTMwNmVcdTg5ODFcdTdkMjBcdTMwNzhcdTMwNmVcdTUzYzJcdTcxNjdcdTMwODJcdTUyNGFcdTk2NjRcdTMwNTVcdTMwOGNcdTMwOGJcdTMwNWZcdTMwODFcdTMwMDFcdTUzYzJcdTcxNjdcdTMwNTlcdTMwOGJcdTUwNzRcdTMwNmVcdTg5ODFcdTdkMjBcdTMwODJcdTU0MGNcdTY5ZDhcdTMwNmJcdTY2ZjRcdTY1YjBcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIgIFx1MzAwY09LXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU5XHUzMDhiXHU1MjRkXHUzMDZiXHUzMDAxXHU1M2MyXHU3MTY3XHUzMDU5XHUzMDhiXHU1MDc0XHUzMDZlXHU4OTgxXHU3ZDIwXHUzMDkyXHU2NmY0XHU2NWIwXHUzMDU5XHUzMDhiXHU4YTMxXHU1M2VmXHUzMDRjXHUzMDQyXHUzMDhiXHUzMDUzXHUzMDY4XHUzMDkyXHU3OGJhXHU4YThkXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyICBcdTMwMGNcdThhNzNcdTdkMzBcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwMDFcdTUyNGFcdTk2NjRcdTViZmVcdThjNjFcdTMwNjdcdTMwNDJcdTMwOGJcdTg5ODFcdTdkMjBcdTMwOTJcdTUzYzJcdTcxNjdcdTMwNTlcdTMwOGJcdTg5ODFcdTdkMjBcdTMwNmVcdTMwZWFcdTMwYjlcdTMwYzhcdTMwOTJcdTY5MWNcdThhMGVcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi0NCi0jIFJlc29sdmUgTmFtZSBDb25mbGljdCBEaWFsb2cNCi1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlPVx1ODk4MVx1N2QyMFx1NTQwZFx1MzA2ZVx1N2FmNlx1NTQwOFx1MzA2ZVx1ODllM1x1NmM3YQ0KLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGV4dD0nJ3sxfScnIFx1MzA2Ylx1NWJmZVx1MzA1N1x1MzA2Nlx1NjViMFx1ODk4ZiB7MH0gXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0Og0KLQ0KLSMgU2VsZWN0IERlbGl2ZXJhYmxlcyBEaWFsb2cNCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGl0bGU9XHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDZlXHU5MDc4XHU2MjllDQotc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4ICcnezB9JycgXHUzMDkyXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2XHUzMDVmXHUzMDQ0XHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBOZXcgUHJvY2VzcyBDb21wb25lbnQgRGlhbG9nDQotbmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZT1cdTY1YjBcdTg5OGZcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwZGRcdTMwZmNcdTMwY2RcdTMwZjNcdTMwYzgNCi1uYW1lTGFiZWxfdGV4dD1cdTU0MGRcdTUyNGQ6DQotZGVmYXVsdENvbmZpZ0xhYmVsX3RleHQ9XHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHU2OWNiXHU2MjEwOg0KLWJhc2VQcm9jZXNzTGFiZWxfdGV4dD1cdTU3ZmFcdTY3MmNcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjk6DQotYmFzZWRPblByb2Nlc3Nlc0xhYmVsX3RleHQ9XHU1N2ZhXHU2NzJjXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5Og0KLQ0KLSMgUm9sZSBBc3NvY2lhdGlvbiBEaWFsb2cNCi1zZWxlY3RBc3NvY2lhdGlvbkxhYmVsX3RleHQ9XHUzMGJmXHUzMGI5XHUzMGFmICcnezB9JycgXHUzMDZlXHU5NWEyXHU5MDIzXHUzMDkyXHU5MDc4XHU2MjllDQotDQotIyBSZW1vdmUgQXNzb2NpYXRpb24gZGlhbG9nDQotcmVtb3ZlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD1cdTk1YTJcdTkwMjNcdTMwNmVcdTk2NjRcdTUzYmINCi0NCi0jIFNlbGVjdCBUZWFtcyBEaWFsb2cNCi1zZWxlY3RUZWFtc0RpYWxvZ190aXRsZT1cdTMwYzFcdTMwZmNcdTMwZTBcdTMwNmVcdTkwNzhcdTYyOWUNCi1zZWxlY3RUZWFtc0RpYWxvZ190ZXh0PVx1MzBlZFx1MzBmY1x1MzBlYiAnJ3swfScnIFx1MzA5Mlx1NTI3Mlx1MzA4YVx1NWY1M1x1MzA2Nlx1MzA1Zlx1MzA0NFx1MzBjMVx1MzBmY1x1MzBlMFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgVGFzbCBTZWxlY3Rpb24gRGlhbG9nDQotdGFza1NlbGVjdGlvbkRpYWxvZ190aXRsZT1cdTMwYmZcdTMwYjlcdTMwYWZcdTMwNmVcdTkwNzhcdTYyOWUNCi10aXRsZUxhYmVsX3RleHQ9XHUzMGJmXHUzMGI5XHUzMGFmXHUzMDZlXHU5MDc4XHU2MjllLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMEU6IHswfSBcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcblxuXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDRhXHUzMDg4XHUzMDczXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU4OTgxXHU3ZDIwXHUzMDZiXHUzMDZmXHU1NDBkXHU1MjRkXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyXG5cblx1NjcwOVx1NTJiOVx1MzA2YVx1NTQwZFx1NTI0ZFx1MzA5Mlx1NTE2NVx1NTI5Ylx1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPVx1NTQwZFx1NTI0ZFx1MzA5Mlx1N2E3YVx1MzA2Ylx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMiBcdTY3MDlcdTUyYjlcdTMwNmFcdTU0MGRcdTUyNGRcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMUU6IFx1NTQwZFx1NTI0ZCAnJ3swfScnIFx1MzA2Zlx1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMlxuXG5cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTg5ODFcdTdkMjBcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNmZcdTU2ZmFcdTY3MDlcdTMwNjdcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNmFcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcblxuXHU1MjI1XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRiXHUzMDg5XHU1MThkXHU4YTY2XHU4ODRjXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPVx1NTQwY1x1MzA1OFx1ODk4MVx1N2QyMFx1NTQwZFx1MzA0Y1x1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiBcdTUyMjVcdTMwNmVcdTU0MGRcdTUyNGRcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjFfbXNnPUlVUEwwMTAyRTogXHU1NDBkXHU1MjRkICcnezB9JycgXHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXG5cblx1MzBiOVx1MzBkYVx1MzBmY1x1MzBiOVx1MzA2N1x1NTljYlx1MzA3ZVx1MzA4Ylx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1NTQwZFx1MzA2Zlx1NjMwN1x1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXG5cdTY3MDlcdTUyYjlcdTMwNmFcdTU0MGRcdTUyNGRcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjJfbXNnPUlVUEwwMTAzRTogXHU1NDBkXHU1MjRkICcnezB9JycgXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXG5cblx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1NTQwZFx1MzA2ZVx1NjcyYlx1NWMzZVx1MzA2Ylx1MzBkNFx1MzBlYVx1MzBhYVx1MzBjOVx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXG5cdTY3MDlcdTUyYjlcdTMwNmFcdTU0MGRcdTUyNGRcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnPUlVUEwwMTA0RTogXHU1NDBkXHU1MjRkICcnezB9JycgXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXG5cblx1NmIyMVx1MzA2ZVx1NjU4N1x1NWI1N1x1MzA5Mlx1NTQyYlx1MzA4MFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1NTQwZFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzogXFwgLyA6ICogPyAiIDwgPiA7IHxcblxuXHU2NzA5XHU1MmI5XHUzMDZhXHU1NDBkXHU1MjRkXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRiXHUzMDg5XHU1MThkXHU4YTY2XHU4ODRjXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotbm9Db25maWdFcnJvcl9tc2c9SVVQTDAxMDVFOiBcdTczZmVcdTg4NGNcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTBcdTMwNGNcdTU0MmJcdTMwN2VcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcblxuXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHUzMDZmXHUzMDAxXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZlXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwXHUzMDZiXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyXG5cblx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLW5vRGVsaXZlcnlQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA2RTogXHU3M2ZlXHU1NzI4XHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZiXHUzMGM3XHUzMGVhXHUzMGQwXHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDRjXHU1NDJiXHUzMDdlXHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cblx1NTdmYVx1NjcyY1x1MzBjN1x1MzBlYVx1MzBkMFx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2Zlx1MzAwMVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1NWJjNFx1NGUwZVx1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMFx1MzA2Ylx1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OVx1MzAwMlxuXG5cdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1ub0RlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQTDAxMDdFOiBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTBcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcblxuXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHUzMDkyXHU2NWIwXHU4OThmXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZiXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyXG5cblx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLW5vQmFzZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDhFOiBcdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcblxuXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU1YmM0XHU0ZTBlXHUzMDZiXHUzMDZmXHUzMDAxXHU1N2ZhXHU2NzJjXHUzMGM3XHUzMGVhXHUzMGQwXHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyXG5cblx1MzBjN1x1MzBlYVx1MzBkMFx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWNyZWF0ZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDlFOiBcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwOTJcdTZiNjNcdTVlMzhcdTMwNmJcdTRmNWNcdTYyMTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1jcmVhdGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTEwRTogXHU4OTgxXHU3ZDIwXHUzMDkyXHU2YjYzXHU1ZTM4XHUzMDZiXHU0ZjVjXHU2MjEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotZGVsZXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMUU6IFx1ODk4MVx1N2QyMFx1MzA5Mlx1NmI2M1x1NWUzOFx1MzA2Ylx1NTI0YVx1OTY2NFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnPUlVUEwwMTEyRTogXHU4OTgxXHU3ZDIwXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cblx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiAnJ3swfScnIFx1MzA2Zlx1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMlxuXG5cdTUyMjVcdTMwNmVcdTU0MGRcdTUyNGRcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c9XHU1NDBjXHUzMDU4XHU1NDBkXHU1MjRkXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIFx1NTIyNVx1MzA2ZVx1NTQwZFx1NTI0ZFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXVuZG9Db21tYW5kRXJyb3JfbXNnPUlVUEwwMTEzRTogXHU1M2Q2XHUzMDhhXHU2ZDg4XHUzMDU3XHUzMGIzXHUzMGRlXHUzMGYzXHUzMGM5ICcnezB9JycgXHUzMDkyXHU1YjhjXHU0ZTg2XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cblx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZjogezF9DQotaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnPUlVUEwwMTE0RTogXHU3MTIxXHU1MmI5XHUzMDZhXHU1MTQ4XHU4ODRjXHUzMGJmXHUzMGI5XHUzMGFmXHUzMDZlXHUzMGE0XHUzMGYzXHUzMGM3XHUzMGMzXHUzMGFmXHUzMGI5XHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyXG5cblx1NTE0OFx1ODg0Y1x1MzBiZlx1MzBiOVx1MzBhZlx1MzA2ZVx1MzBhNFx1MzBmM1x1MzBjN1x1MzBjM1x1MzBhZlx1MzBiOVx1MzA2Zlx1MzAwY1x1MzBhNFx1MzBmM1x1MzBjN1x1MzBjM1x1MzBhZlx1MzBiOVx1MzAwZFx1NTIxN1x1MzA2Ylx1MzA0Mlx1MzA4Ylx1NjU3NFx1NjU3MFx1NTAyNFx1MzA2N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA2YVx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXG5cdTY3MDlcdTUyYjlcdTMwNmFcdTUwMjRcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzPUlVUEwwMTAwVzogJyd7MH0nJyBcdTMwNmZcdTY1ZTJcdTMwNmIgJyd7MX0nJyBcdTMwNmJcdTk1YTJcdTkwMjNcdTRlZDhcdTMwNTFcdTMwODlcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIgIFx1MzA1M1x1MzA2ZVx1N2EyZVx1OTg1ZVx1MzA2ZVx1OTVhMlx1OTAyM1x1NGVkOFx1MzA1MVx1MzA2ZiAxIFx1MzA2NFx1MzA1N1x1MzA0Ylx1OGEzMVx1NTNlZlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMiAgJyd7MH0nJyBcdTMwOTIgJyd7Mn0nJyBcdTMwNmJcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjZcdTMwOGJcdTMwNmJcdTMwNmZcdTMwMDFcdTY3MDBcdTUyMWRcdTMwNmIgJyd7MX0nJyBcdTMwNGJcdTMwODlcdTUyNGFcdTk2NjRcdTMwNTlcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi1lcnJvcl9tc2dXaXRoRGV0YWlscz1JVVBMMDExNkU6IFx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdThhNzNcdTMwNTdcdTMwNGZcdTMwNmZcdTMwMGNcdThhNzNcdTdkMzBcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1lcnJvcl9tc2c9SVVQTDAxMTdFOiBcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHU4YTczXHUzMDU3XHUzMDRmXHUzMDZmXHUzMGE4XHUzMGU5XHUzMGZjXHUzMGZiXHUzMGVkXHUzMGIwXHUzMDkyXHU1M2MyXHU3MTY3XHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotU3VwcHJlc3Npb25fbmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE4RTogXHUzMDUzXHUzMDZlXHU2NGNkXHU0ZjVjXHUzMDZlXHU1ZjhjXHUzMDY3XHUzMDAxXHU1NDBkXHU1MjRkXHUzMDZlXHU3YWY2XHU1NDA4XHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFx1ODk4MVx1N2QyMFx1MzA2ZVx1NTQwZFx1NTI0ZFx1MzA0Y1x1OTFjZFx1ODkwN1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA2YVx1MzA0NFx1MzA1M1x1MzA2OFx1MzA5Mlx1NzhiYVx1OGE4ZFx1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1MzAwMVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLVN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbj1JVVBMMDExOUU6IFx1MzA1M1x1MzA2ZVx1NjRjZFx1NGY1Y1x1MzA2ZVx1NWY4Y1x1MzA2N1x1MzAwMVx1NTQwZFx1NTI0ZFx1MzA2ZVx1N2FmNlx1NTQwOFx1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTg5ODFcdTdkMjBcdTMwNmVcdTg4NjhcdTc5M2FcdTU0MGRcdTMwNGNcdTkxY2RcdTg5MDdcdTMwNTdcdTMwNjZcdTMwNDRcdTMwNmFcdTMwNDRcdTMwNTNcdTMwNjhcdTMwOTJcdTc4YmFcdThhOGRcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTMwMDFcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249XHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIFx1OGE3M1x1MzA1N1x1MzA0Zlx1MzA2Zlx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXNhdmVQcm9jZXNzRXJyb3JfcmVhc29uPVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOSAnJ3swfScnIFx1MzA2ZVx1NGZkZFx1N2JhMVx1NGUyZFx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdThhNzNcdTMwNTdcdTMwNGZcdTMwNmZcdTMwMGNcdThhNzNcdTdkMzBcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1kZWxldGVSZWZlcmVuY2VzRXJyb3JfcmVhc29uPVx1MzA1M1x1MzA2ZVx1ODk4MVx1N2QyMFx1MzA2Ylx1OTVhMlx1OTAyM1x1MzA1OVx1MzA4Ylx1NTNjMlx1NzE2N1x1MzA2ZVx1OTY2NFx1NTNiYlx1NGUyZFx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdThhNzNcdTMwNTdcdTMwNGZcdTMwNmZcdTMwMGNcdThhNzNcdTdkMzBcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1zYXZlRmlsZUVycm9yX3JlYXNvbj1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgJyd7MH0nJyBcdTMwNmVcdTRmZGRcdTdiYTFcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHU4YTczXHUzMDU3XHUzMDRmXHUzMDZmXHUzMDBjXHU4YTczXHU3ZDMwXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotaW52YWxpZFJlZmVyZW5jZXNFcnJvcl9yZWFzb249XHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHU5NTkzXHUzMGIzXHUzMGQ0XHUzMGZjXHUzMDZlXHU3ZDUwXHU2NzljXHUzMDY4XHUzMDU3XHUzMDY2XHUzMDAxXHU3MTIxXHU1MmI5XHUzMDZhXHU1M2MyXHU3MTY3XHUzMDkyXHU2MzAxXHUzMDY0XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU4OTgxXHU3ZDIwXHUzMDkyXHU2OTFjXHU1MWZhXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyXG5cdTMwNTNcdTMwOGNcdTMwODlcdTMwNmVcdTUzYzJcdTcxNjdcdTMwNmZcdTk2NjRcdTUzYmJcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIgXHU3ZDlhXHU4ODRjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPw0KLXVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb249XHU2NzJhXHU4OWUzXHU2YzdhXHUzMDZlXHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDZmXHU1OTA5XHU2NmY0XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzOiB7MH0oVVJJID0gezF9KXsyfQ0KLQ0KLSMgV2FybmluZyBtZXNzYWdlcw0KLU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZz1JVVBMMDExOFc6IDEgXHUzMDY0XHU0ZWU1XHU0ZTBhXHUzMDZlXHUzMGJkXHUzMGZjXHUzMGI5XHU4OTgxXHU3ZDIwXHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyIFx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzBmYlx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1NTE4NVx1MzA2ZVx1OTVhMlx1OTAyM1x1MzA1OVx1MzA4Ylx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2Zlx1MzBiM1x1MzBkNFx1MzBmY1x1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLUFjdGl2aXR5QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMTlXOiAxIFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBiZFx1MzBmY1x1MzBiOVx1ODk4MVx1N2QyMFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMiBcdTk1YTJcdTkwMjNcdTMwNTlcdTMwOGJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjhcdTMwNmZcdTMwYjNcdTMwZDRcdTMwZmNcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1BY3Rpdml0eURyb3BDb21tYW5kX2RlZXBDb3B5X3Byb21wdENvbmZpZ3VyYXRpb25Nc2c9XHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDkyXHUzMDU5XHUzMDc5XHUzMDY2XHUzMGIzXHUzMGQ0XHUzMGZjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiP1xuXG5cdTMwMGNcdTMwNDRcdTMwNDRcdTMwNDhcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTlcdTMwOGJcdTMwNjhcdTMwMDFcdTczZmVcdTg4NGNcdTY5Y2JcdTYyMTBcdTMwNmVcdTRlMDBcdTkwZThcdTMwNjdcdTMwNDJcdTMwOGJcdThhMThcdThmZjBcdTViNTBcdTMwNmVcdTMwN2ZcdTMwNGNcdTMwYjNcdTMwZDRcdTMwZmNcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDINCi1kZWVwQ29weV9wcm9tcHRNc2c9XHU0ZWNhXHU1ZjhjXHUzMDZmXHU1MDBiXHU1MjI1XHUzMDZiXHU0ZmRkXHU1Yjg4XHUzMDU5XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhiXHUzMDAxXHU1MmQ1XHU3Njg0XHUzMDZiXHUzMGVhXHUzMGYzXHUzMGFmXHUzMDU1XHUzMDhjXHUzMDVmXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHU4OTgxXHU3ZDIwXHUzMDZlXHUzMGIzXHUzMGQ0XHUzMGZjXHUzMDkyXHU1M2Q2XHU1Zjk3XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFx1N2Q5YVx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi1kZWVwQ29weV90aXRsZT1cdTMwYzdcdTMwYTNcdTMwZmNcdTMwZDdcdTMwZmJcdTMwYjNcdTMwZDRcdTMwZmMNCi0NCi0jIFByb2dyZXNzIG1lc3NhZ2VzDQotY3JlYXRpbmdQcm9jZXNzQ29tcG9uZW50VGFza19uYW1lPVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzBmYlx1MzBiM1x1MzBmM1x1MzBkZFx1MzBmY1x1MzBjZFx1MzBmM1x1MzBjOCAnJ3swfScnIFx1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLXByb2Nlc3NpbmdSZWZlcmVuY2VzVGFza19uYW1lPVx1NTNjMlx1NzE2N1x1MzA5Mlx1NTFlNlx1NzQwNlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWU9XHU4OTgxXHU3ZDIwXHUzMDRhXHUzMDg4XHUzMDczXHU5NWEyXHU5MDIzXHUzMDU5XHUzMDhiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHU1MjRhXHU5NjY0XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lPVx1NTNjMlx1NzE2N1x1MzA5Mlx1NjkxY1x1NjdmYlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLXJlbW92aW5nUmVmZXJlbmNlc3Rhc2tfbmFtZT1cdTUzYzJcdTcxNjdcdTMwOTJcdTk2NjRcdTUzYmJcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lPVx1NTkwOVx1NjZmNFx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NGZkZFx1N2JhMVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWNoZWNrQWZmZWN0ZWRSZXNvdXJjZXNUYXNrX25hbWU9XHU1ZjcxXHU5N2ZmXHUzMDkyXHU1M2Q3XHUzMDUxXHUzMDhiXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDkyXHU2OTFjXHU2N2ZiXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotbW92aW5nVGFza19uYW1lPVx1NzlmYlx1NTJkNVx1NGUyZC4uLg0KLW1vdmluZ0ZpbGVzVGFza19uYW1lPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NzlmYlx1NTJkNVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWNvcHlpbmdSZXNvdXJjZXNUYXNrX25hbWU9XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDkyXHUzMGIzXHUzMGQ0XHUzMGZjXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotY29weWluZ0FjdGl2aXRpZXNfbXNnPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmYyAnJ3swfScnIFx1MzA5Mlx1MzBiM1x1MzBkNFx1MzBmY1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQ0KLXNhdmluZ0ZpbGVUYXNrX25hbWU9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViICcnezB9JycgXHUzMDkyXHU0ZmRkXHU3YmExXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotDQotIyBVSSBUZXh0DQotZWxlbWVudF90ZXh0PVx1ODk4MVx1N2QyMA0KLWNyZWF0ZUVsZW1lbnRfdGV4dD1cdTg5ODFcdTdkMjBcdTMwNmVcdTRmNWNcdTYyMTANCi1jcmVhdGVQcm9jZXNzX3RleHQ9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZlXHU0ZjVjXHU2MjEwDQotY29udHJpYnV0ZXNUb190ZXh0PVx1NWJjNFx1NGUwZVx1NWJmZVx1OGM2MQ0KLWxvY2FsQ29udHJpYnV0ZXNUb190ZXh0PVx1MzBlZFx1MzBmY1x1MzBhYlx1MzBlYlx1MzA2N1x1MzA2ZVx1NWJjNFx1NGUwZVx1NWJmZVx1OGM2MQ0KLWV4dGVuZHNfdGV4dD1cdTYyZTFcdTVmMzUNCi1yZXBsYWNlc190ZXh0PVx1N2Y2ZVx1NjNkYg0KLWxvY2FsUmVwbGFjZXNfdGV4dD1cdTMwZWRcdTMwZmNcdTMwYWJcdTMwZWJcdTMwNjdcdTdmNmVcdTYzZGINCi1sb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHlfdGV4dD1cdTMwZWRcdTMwZmNcdTMwYWJcdTMwZWJcdTdmNmVcdTYzZGJcdTMwNGFcdTMwODhcdTMwNzNcdTMwYzdcdTMwYTNcdTMwZmNcdTMwZDdcdTMwZmJcdTMwYjNcdTMwZDRcdTMwZmMNCi1lbGVtZW50VHlwZV90ZXh0PXswfTogezF9DQotZGVsaXZlcmFibGVzX3RleHQ9XHU3ZDBkXHU1MTY1XHU3MjY5DQotY29udHJpYnV0ZVRvQWN0aXZpdHlfdGV4dD1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwNzhcdTMwNmVcdTViYzRcdTRlMGUNCi1BY3Rpdml0eURyb3BDb21tYW5kX2xhYmVsPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1OTY2NFx1NTNiYg0KLXJlcGxhY2VBY3Rpdml0eV90ZXh0PVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1N2Y2ZVx1NjNkYg0KLWZpbGVfdGV4dD1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWINCi1kaXJlY3RvcnlfdGV4dD1cdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmMNCi11bnJlc29sdmVkX3RleHQ9KFx1NjcyYVx1ODllM1x1NmM3YVx1MzA2ZSAnJ3swfScnKQ0KLWFzc2lzdHNfdGV4dD1cdTY1MmZcdTYzZjQNCi11bmtub3duX3RleHQ9XHU0ZTBkXHU2NjBlDQotY29tbWFuZF9kb25lPVx1NWI4Y1x1NGU4Ng0KLQ0KLSMgVGhlIGZvbGxvd2luZyBVSSB0ZXh0IHNob3VsZCBiZSByZXZpZXdlZC4NCi1VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eXdpdGhwbHVnaW5faW5mbz17MH0gKCcnezN9JycgXHUzMDZlIHsxfSAnJ3syfScnKQ0KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5X2luZm89ezB9ICh7MX0gJyd7Mn0nJykNCi11aV9yZWZfZGVsZXRlPVx1OGExOFx1OGZmMFx1NWI1MCAnJ3swfScnIFx1MzA2ZVx1NmIyMVx1MzA2ZVx1NTNjMlx1NzE2N1x1MzA2Zlx1NGY3Zlx1NzUyOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXHU1MjRhXHU5NjY0XHUzMDU5XHUzMDhiXHUzMDgyXHUzMDZlXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotdWlfcmVmX2RlbGV0ZTI9XHU2YjIxXHUzMDZlXHU1M2MyXHU3MTY3XHUzMDZmXHUzMDQ0XHUzMDVhXHUzMDhjXHUzMDgyXHU0ZjdmXHU3NTI4XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cdTUyNGFcdTk2NjRcdTMwNTlcdTMwOGJcdTMwODJcdTMwNmVcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi11aV9yZWZlcmVuY2VzPVx1NTNjMlx1NzE2Nw0KLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwICcnezB9JycgXHUzMDZmXHUzMGJmXHUzMGI5XHUzMGFmXHU4YTE4XHU4ZmYwXHU1YjUwICcnezF9JycgXHUzMDZiXHU5NWEyXHU5MDIzXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5IChcdTMwNTNcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdThhMThcdThmZjBcdTViNTBcdTMwNGNcdTUxZmFcdTUyOWJcdTUxNDMpXHUzMDAyDQotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX29wdGlvbnM9XHUzMGFhXHUzMGQ3XHUzMGI3XHUzMGU3XHUzMGYzDQotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX291dHB1dGxhYmVsPVx1MzBiZlx1MzBiOVx1MzBhZlx1OGExOFx1OGZmMFx1NWI1MFx1MzA2ZVx1NTFmYVx1NTI5Ylx1MzA2OFx1MzA1N1x1MzA2Nlx1NzUxZlx1MzA1OFx1MzA4Ylx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1OGExOFx1OGZmMFx1NWI1MFx1MzA2ZVx1OTY2NFx1NTNiYg0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9kZWxldGVfdGFzaz1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwNGJcdTMwODlcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdThhMThcdThmZjBcdTViNTBcdTMwNmVcdTUyNGFcdTk2NjQNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZGVmYXVsdGNvbmZpZ2NoZWNrPVx1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA1Zlx1ODk4MVx1N2QyMCAnJ3swfScnIFx1MzA2Zlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2ZVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1NjljYlx1NjIxMFx1MzA2Ylx1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHU2OWNiXHU2MjEwXHUzMDZiXHUzMDUzXHUzMDZlXHU4OTgxXHU3ZDIwXHUzMDRhXHUzMDg4XHUzMDczXHUzMDVkXHUzMDZlXHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyXHUzMDkyXHU4ZmZkXHU1MmEwXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPw0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9nZW5lcmljRXJyX21lc3NhZ2VfdGV4dD1cdTY0Y2RcdTRmNWNcdTMwNjdcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHU4YTczXHUzMDU3XHUzMDRmXHUzMDZmXHUzMDBjXHU4YTczXHU3ZDMwXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoPVx1NTQwY1x1NjcxZlx1NWJmZVx1OGM2MVx1MzA2ZVx1MzAwMVx1MzBlYVx1MzBmM1x1MzBhZlx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1MzA5Mlx1NjMwMVx1MzA2NFx1OGExOFx1OGZmMFx1NWI1MFx1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXI9XHUzMGQzXHUzMGU1XHUzMGZjXHUzMGEyXHUzMGZjXHUzMDZlXHU2NmY0XHU2NWIwXHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjDQotY29uZmlybV9yZW1vdmVfcmVmZXJlbmNlc190ZXh0PVx1NTkwOVx1NjNkYlx1NWY4Y1x1MzAwMVx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA2Ylx1MzBlYVx1MzBiOVx1MzBjOFx1MzA1NVx1MzA4Y1x1MzA1Zlx1ODk4MVx1N2QyMFx1MzA2Ylx1MzA2Zlx1MzA1M1x1MzA2ZVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA3OFx1MzA2ZVx1NzEyMVx1OGEzMVx1NTNlZlx1MzA2ZVx1NTNjMlx1NzE2N1x1MzA0Y1x1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA4Ylx1NTNlZlx1ODBmZFx1NjAyN1x1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMlx1MzAwY09LXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDVkXHUzMDhjXHUzMDg5XHUzMDkyXHU5NjY0XHU1M2JiXHUzMDU3XHUzMDAxXHU3ZDlhXHU4ODRjXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfdW5oYW5kbGVkX2V4Y2VwdGlvbj1cdTY3MmFcdTUxZTZcdTc0MDZcdTMwNmVcdTRmOGJcdTU5MTYNCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX2JyZWFrZG93bl9lbGVtZW50PVx1NTE0OFx1ODg0Y1x1MzBiZlx1MzBiOVx1MzBhZlx1MzA0YVx1MzA4OFx1MzA3M1x1NWY4Y1x1N2Q5YVx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2OFx1NTQwY1x1MzA1OFx1MzBkNlx1MzBlY1x1MzBmY1x1MzBhZlx1MzBjMFx1MzBhNlx1MzBmM1x1MzBmYlx1MzBhOFx1MzBlY1x1MzBlMVx1MzBmM1x1MzBjOFx1MzA2Zlx1NjMwMVx1MzA2Nlx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93cGxpc3RkbGdfbXNnPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOCAnJ3swfScnIFx1MzA2Zlx1NmIyMVx1MzA2ZVx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2Ylx1NWJmZVx1MzA1OVx1MzA4Ylx1NTFmYVx1NTI5Ylx1MzA2N1x1MzA1OVx1MzAwMlxuXHU1YmZlXHU1ZmRjXHUzMDU5XHUzMDhiXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDU3XHUzMDVmXHUzMDQ0XHUzMGJmXHUzMGI5XHUzMGFmXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZz1cdTMwZWRcdTMwZmNcdTMwZWIgJyd7MH0nJyBcdTMwNmJcdTMwNmZcdTZiMjFcdTMwNmVcdTYyYzVcdTVmNTNcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDJcblx1NWJmZVx1NWZkY1x1MzA1OVx1MzA4Ylx1OGExOFx1OGZmMFx1NWI1MFx1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA1N1x1MzA1Zlx1MzA0NFx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyPVx1ODFmNFx1NTQ3ZFx1NzY4NFx1MzBhOFx1MzBlOVx1MzBmYw0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93b3JrcHJvZHVjdHM9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9zdWJfZWxlbWVudD1cdTMwZDZcdTMwZWNcdTMwZmNcdTMwYWZcdTMwYzBcdTMwYTZcdTMwZjNcdTMwZmJcdTMwYThcdTMwZWNcdTMwZTFcdTMwZjNcdTMwYzhcdTMwOTJcdTMwMDFcdTMwNWRcdTMwNmVcdTMwNDRcdTMwNWFcdTMwOGNcdTMwNGJcdTMwNmVcdTMwYjVcdTMwZDZcdTg5ODFcdTdkMjBcdTMwNmJcdTMwZWFcdTMwZjNcdTMwYWZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl93cm9uZ19lbGVtZW50PVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkNlx1MzBlY1x1MzBmY1x1MzBhZlx1MzBjMFx1MzBhNlx1MzBmM1x1MzBmYlx1MzBhOFx1MzBlY1x1MzBlMVx1MzBmM1x1MzBjOFx1NGVlNVx1NTkxNlx1MzA2ZVx1ODk4MVx1N2QyMFx1MzA2Ylx1MzA2Zlx1MzBlYVx1MzBmM1x1MzBhZlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ9XHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4XHUzMDkyXHUzMDAxXHUzMDVkXHUzMDZlXHUzMDQ0XHUzMDVhXHUzMDhjXHUzMDRiXHUzMDZlXHU1YjUwXHUzMDZiXHUzMGVhXHUzMGYzXHUzMGFmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3Rhc2tzPVx1MzBiZlx1MzBiOVx1MzBhZg0KLXVpX2Fzc29jaWF0aW9uX3Rhc2tfc2VsZWN0aW9uPVx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2ZVx1OTA3OFx1NjI5ZS4uLg0KLXV0aWxfUHJvY2Vzc1V0aWxfY2hpbGRhZGFwdGVyPVwgXCBcdTViNTBcdTMwNmVcdTMwYTJcdTMwYzBcdTMwZDdcdTMwYmZcdTMwZmM6DQotDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2V0cGFyZW50PVx1NWI1MFx1MzA2ZVx1ODlhYVx1MzA5Mlx1OGEyZFx1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zg0KLXV0aWxfdG5ndXRpbF9jYW5ub3RfZWRpdF9yZXNvdXJjZT1cdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwOTJcdTdkZThcdTk2YzZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi11dGlsX1Byb2Nlc3NVdGlsX2NvbnRyaWJ1dGVzdG89Jyd7MH0nJyBcdTMwNzhcdTMwNmVcdTViYzRcdTRlMGUNCi11dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bz1cdTMwZWRcdTMwZmNcdTMwYWJcdTMwZWJcdTMwNjcgJyd7MH0nJyBcdTMwNzhcdTViYzRcdTRlMGUNCi1wcm9jZXNzX2V4dGVuZHM9Jyd7MH0nJyBcdTMwOTJcdTYyZTFcdTVmMzUNCi1wcm9jZXNzX3JlcGxhY2VzPScnezB9JycgXHUzMDkyXHU3ZjZlXHU2M2RiDQotcHJvY2Vzc19sb2NhbFJlcGxhY2VzPVx1MzBlZFx1MzBmY1x1MzBhYlx1MzBlYlx1MzA2NyAnJ3swfScnIFx1MzA5Mlx1N2Y2ZVx1NjNkYg0KLSMgRmlsdGVyIGNvbnN0YW50cyBleHRlcm5hbGl6ZWQgc3RyaW5ncy4NCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZXNfdGV4dD1cdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2UNCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZWdyb3VwaW5nc190ZXh0PVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzA2ZVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1NTMxNg0KLUZpbHRlckNvbnN0YW50c193aGl0ZXBhcGVyc190ZXh0PVx1MzBkYlx1MzBlZlx1MzBhNFx1MzBjOFx1MzBmYlx1MzBkYVx1MzBmY1x1MzBkMVx1MzBmYw0KLUZpbHRlckNvbnN0YW50c190b29sbWVudG9yc190ZXh0PVx1MzBjNFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBlMVx1MzBmM1x1MzBiZlx1MzBmYw0KLUZpbHRlckNvbnN0YW50c190b29sc190ZXh0PVx1MzBjNFx1MzBmY1x1MzBlYg0KLUZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0PVx1MzBlZFx1MzBmY1x1MzBlYg0KLUZpbHRlckNvbnN0YW50c190YXNrc190ZXh0PVx1MzBiZlx1MzBiOVx1MzBhZg0KLUZpbHRlckNvbnN0YW50c19yZXVzYWJsZWFzc2V0c190ZXh0PVx1NTE4ZFx1NTIyOVx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2YVx1MzBhMlx1MzBiYlx1MzBjM1x1MzBjOA0KLUZpbHRlckNvbnN0YW50c19hbGxfdGV4dD1cdTMwNTlcdTMwNzlcdTMwNjYNCi1GaWx0ZXJDb25zdGFudHNfcHJvY2Vzc2VzX3RleHQ9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5DQotRmlsdGVyQ29uc3RhbnRzX3ByYWN0aWNlc190ZXh0PVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOQ0KLUZpbHRlckNvbnN0YW50c190ZW1wbGF0ZXNfdGV4dD1cdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzgNCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RzX3RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotRmlsdGVyQ29uc3RhbnRzX2NoZWNrbGlzdHNfdGV4dD1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwZWFcdTMwYjlcdTMwYzgNCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGVsaW5lc190ZXh0PVx1MzBhY1x1MzBhNFx1MzBjOVx1MzBlOVx1MzBhNFx1MzBmMw0KLUZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0PVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOA0KLUZpbHRlckNvbnN0YW50c19ndWlkYW5jZV90ZXh0PVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOQ0KLUZpbHRlckNvbnN0YW50c19jb25jZXB0c190ZXh0PVx1Njk4Mlx1NWZmNQ0KLUZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0PVx1NGY4Yg0KLUZpbHRlckNvbnN0YW50c19jb250ZW50cGFja2FnZXNfdGV4dD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwZmJcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjgNCi1GaWx0ZXJDb25zdGFudHNfcm9sZWRlc2NyaXB0b3JzX3RleHQ9XHUzMGVkXHUzMGZjXHUzMGViXHU4YTE4XHU4ZmYwXHU1YjUwDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dD1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzhcdTMwNmVcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTUzMTYNCi1GaWx0ZXJDb25zdGFudHNfdGFza2Rlc2NyaXB0b3JzX3RleHQ9XHUzMGJmXHUzMGI5XHUzMGFmXHU4YTE4XHU4ZmYwXHU1YjUwDQotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRlbGVtZW50c190ZXh0PVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1ODk4MVx1N2QyMA0KLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZT1cdTU0MGNcdTY3MWZcdTMwNmVcdTZlOTZcdTUwOTlcdTRlMmQuLi4NCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RkZXNjcmlwdG9yc190ZXh0PVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1OGExOFx1OGZmMFx1NWI1MA0KLUZpbHRlckNvbnN0YW50c19hbGxjb250ZW50ZWxlbWVudHNfdGV4dD1cdTMwNTlcdTMwNzlcdTMwNjZcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTg5ODFcdTdkMjANCi1GaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0PVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1OGNjN1x1NjU5OQ0KLU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX2Vycm9yU2F2aW5nRmlsZXM9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU0ZmRkXHU3YmExXHU2NjQyXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjDQotRmlsdGVyQ29uc3RhbnRzX2N1c3RvbWNhdGVnb3JpZXNfdGV4dD1cdTMwYWJcdTMwYjlcdTMwYmZcdTMwZTBcdTMwZmJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmMNCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3R0eXBlc190ZXh0PVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1OTg1ZQ0KLURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kX3dhcm5pbmdNc2c9XHU1MjRhXHU5NjY0XHUzMDRjXHU4YjY2XHU1NDRhXHUzMDkyXHU1MWZhXHUzMDU3XHUzMDY2XHU1YjhjXHU0ZTg2XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyDQotRmlsdGVyQ29uc3RhbnRzX21ldGhvZHBsdWdpbnNfdGV4dD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjMNCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfbG9ja2VkUGx1Z2luPUlVUEwwMTIwRTogXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzICcnezB9JycgXHUzMDZmXHUzMGVkXHUzMGMzXHUzMGFmXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dD1cdTMwYzlcdTMwZTFcdTMwYTRcdTMwZjMNCi1GaWx0ZXJDb25zdGFudHNfcm9hZG1hcF90ZXh0PVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkNw0KLUZpbHRlckNvbnN0YW50c19yZXBvcnRzX3RleHQ9XHUzMGVjXHUzMGRkXHUzMGZjXHUzMGM4DQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNGJcdTMwODlcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTU0MGNcdTY3MWYoJlkpDQotTWFudWFsU3luY2hyb25pemVDb21tYW5kX2xhYmVsPVx1MzBhYlx1MzBiOVx1MzBiZlx1MzBlMFx1NTQwY1x1NjcxZigmWikuLi4NCi1BdXRvU3luY2hyb25pemVDb21tYW5kX3N1Y2Vzc2Z1bD1cdTU0MGNcdTY3MWZcdTMwNmZcdTZiNjNcdTVlMzhcdTMwNmJcdTViOGNcdTRlODZcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIFVzZXJJbnRlcmFjdGlvbkhlbHBlcg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9Qcm9jZXNzUGFja2FnZV9OYW1lPVx1NTQwZFx1NTI0ZDoNCi0NCi0jIE1ldGhvZENyZWF0ZUNoaWxkQ29tbWFuZA0KLW5ld0VsZW1lbnRfdGV4dD1cdTY1YjBcdTg5OGYgezB9DQotdXBkYXRlX291dG9mc3luY2hfdGl0bGU9XHU2NmY0XHU2NWIwXHUzMDZlXHU3YWY2XHU1NDA4DQotdXBkYXRlX291dG9mc3luY2hfbXNnPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzBmYlx1MzBiN1x1MzBiOVx1MzBjNlx1MzBlMFx1MzA2N1x1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NTkwOVx1NjZmNFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdTU5MDlcdTY2ZjRcdTUxODVcdTViYjlcdTMwOTJcdTRlMGFcdTY2ZjhcdTMwNGRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzZDM0MTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEdlbmVyaWMgRGlhbG9nIFRpdGxlcw0KLW1vdmVEaWFsb2dfdGl0bGU9XHVjNzc0XHViM2Q5DQotZGVsZXRlRGlhbG9nX3RpdGxlPVx1YzY5NFx1YzE4YyBcdWMwYWRcdWM4MWMNCi1lcnJvckRpYWxvZ190aXRsZT1cdWM2MjRcdWI5NTgNCi1lcnJvckRpYWxvZ19jYW5ub3RSZW5hbWU9ezB9ICcnezF9JydcdWM3NDQoXHViOTdjKSAnJ3syfScnKFx1YzczYylcdWI4NWMgXHVjNzc0XHViOTg0XHVjNzQ0IFx1YmMxNFx1YWZjMCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM1ZDAgXHVkNDVjXHVjMmRjXHViNDFjIFx1YmIzOFx1YzgxY1x1YzgxMFx1Yzc0NCBcdWQ1NzRcdWFjYjBcdWQ1NThcdWFjZTAsIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWQ2NTVcdWM3NzhcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVhY2UwIFx1Yzc3NCBcdWM4NzBcdWM3OTFcdWM3NDQgXHVjOTExXHViMmU4XHVkNTU4XHViODI0XHViYTc0IFx1Y2RlOFx1YzE4Y1x1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotIyBDb25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbCBEaWFsb2cNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlPVx1Y2MzOFx1Yzg3MCBcdWM4MWNcdWFjNzAgXHVkNjU1XHVjNzc4DQotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190ZXh0PVx1YzBhZFx1YzgxY1x1ZDU1OFx1YjgyNFx1YjI5NCBcdWM2OTRcdWMxOGNcdWI5N2MgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yzc1OCBcdWIyZTRcdWI5NzggXHVjNjk0XHVjMThjXHVjNWQwXHVjMTFjIFx1Y2MzOFx1Yzg3MFx1ZDU1OFx1YWNlMCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yzc3NCBcdWM2OTRcdWMxOGNcdWI5N2MgXHVjMGFkXHVjODFjXHVkNTU4XHViYTc0IFx1Yzc3NCBcdWM2OTRcdWMxOGNcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Y2MzOFx1Yzg3MFx1YWMwMCBcdWM4MWNcdWFjNzBcdWI0MThcdWJiYzBcdWI4NWMsIFx1Y2MzOFx1Yzg3MFx1ZDU1OFx1YjI5NCBcdWM2OTRcdWMxOGNcdWIzYzQgXHVhYzMxXHVjMmUwXHViNDI5XHViMmM4XHViMmU0LiBcdWQ2NTVcdWM3NzhcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVhZTMwIFx1YzgwNFx1YzVkMCBcdWNjMzhcdWM4NzBcdWQ1NThcdWIyOTQgXHVjNjk0XHVjMThjXHViOTdjIFx1YWMzMVx1YzJlMFx1ZDU2MCBcdWMyMTggXHVjNzg4XHViMjk0IFx1YWQ4Y1x1ZDU1Y1x1Yzc3NCBcdWM3ODhcdWIyOTRcdWM5YzAgXHVkNjU1XHVjNzc4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWMwYWRcdWM4MWNcdWQ1NThcdWI4MjRcdWIyOTQgXHVjNjk0XHVjMThjXHViOTdjIFx1Y2MzOFx1Yzg3MFx1ZDU1OFx1YjI5NCBcdWM2OTRcdWMxOGMgXHViYWE5XHViODVkXHVjNzQ0IFx1YWM4MFx1ZDFhMFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgUmVzb2x2ZSBOYW1lIENvbmZsaWN0IERpYWxvZw0KLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGl0bGU9XHVjNjk0XHVjMThjIFx1Yzc3NFx1Yjk4NCBcdWNkYTlcdWIzY2MgXHVkNTc0XHVhY2IwDQotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0PScnezF9JydcdWM1ZDAgXHViMzAwXHVkNTc0IFx1YzBjOFx1Yjg1Y1x1YzZiNCB7MH1cdWM3NDQoXHViOTdjKSBcdWM3ODVcdWI4MjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotIyBTZWxlY3QgRGVsaXZlcmFibGVzIERpYWxvZw0KLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190aXRsZT1cdWM3NzhcdWIzYzRcdWJiM2MgXHVjMTIwXHVkMGRkDQotc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RleHQ9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyAnJ3swfScnXHVjNzQ0KFx1Yjk3YykgXHVjOWMwXHVjODE1XHVkNTYwIFx1Yzc3OFx1YjNjNFx1YmIzY1x1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotIyBOZXcgUHJvY2VzcyBDb21wb25lbnQgRGlhbG9nDQotbmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZT1cdWMwYzggXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1Y2VmNFx1ZDNlY1x1YjEwY1x1ZDJiOA0KLW5hbWVMYWJlbF90ZXh0PVx1Yzc3NFx1Yjk4NDoNCi1kZWZhdWx0Q29uZmlnTGFiZWxfdGV4dD1cdWFlMzBcdWM4NzQgXHVhZDZjXHVjMTMxOg0KLWJhc2VQcm9jZXNzTGFiZWxfdGV4dD1cdWFlMzBcdWJjZjggXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0Og0KLWJhc2VkT25Qcm9jZXNzZXNMYWJlbF90ZXh0PVx1YWUzMFx1YmNmOCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQ6DQotDQotIyBSb2xlIEFzc29jaWF0aW9uIERpYWxvZw0KLXNlbGVjdEFzc29jaWF0aW9uTGFiZWxfdGV4dD0nJ3swfScnIFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNWYwXHVhZDAwXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIFJlbW92ZSBBc3NvY2lhdGlvbiBkaWFsb2cNCi1yZW1vdmVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PVx1YzVmMFx1YWQwMCBcdWM4MWNcdWFjNzANCi0NCi0jIFNlbGVjdCBUZWFtcyBEaWFsb2cNCi1zZWxlY3RUZWFtc0RpYWxvZ190aXRsZT1cdWQzMDAgXHVjMTIwXHVkMGRkDQotc2VsZWN0VGVhbXNEaWFsb2dfdGV4dD0nJ3swfScnIFx1YzVlZFx1ZDU2MFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NjAgXHVkMzAwXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIFRhc2wgU2VsZWN0aW9uIERpYWxvZw0KLXRhc2tTZWxlY3Rpb25EaWFsb2dfdGl0bGU9XHVkMGMwXHVjMmE0XHVkMDZjIFx1YzEyMFx1ZDBkZA0KLXRpdGxlTGFiZWxfdGV4dD1cdWQwYzBcdWMyYTRcdWQwNmMgXHVjMTIwXHVkMGRkLi4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDBFOiB7MH0gXHVjNzc0XHViOTg0XHVjNzc0IFx1YjIwNFx1Yjc3ZFx1YjQxOFx1YzViNCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuXG5cblx1YmFhOFx1YjRlMCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViYzBmIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWM2OTRcdWMxOGNcdWM1ZDBcdWIyOTQgXHVjNzc0XHViOTg0XHVjNzc0IFx1Yzc4OFx1YzViNFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuXG5cblx1YzYyY1x1YmMxNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjNzg1XHViODI1XHVkNTU4XHVhY2UwIFx1YjJlNFx1YzJkYyBcdWMyZGNcdWIzYzRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9XHVjNzc0XHViOTg0XHVjNzQ0IFx1YmU0NFx1YzZjY1x1YjQ1OCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWM2MmNcdWJjMTRcdWI5NzggXHVjNzc0XHViOTg0XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMUU6IFx1Yzc3NFx1Yjk4NFx1Yzc3NCAnJ3swfScnXHVjNzc4IFx1ZDU2ZFx1YmFhOVx1Yzc3NCBcdWM3NzRcdWJiZjggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjXHVjNWQwIFx1YWNlMFx1YzcyMFx1ZDU1YyBcdWM3NzRcdWI5ODRcdWM3NzQgXHVjNzg4XHVjNWI0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC5cblxuXHViMmU0XHViOTc4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM3ODVcdWI4MjVcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9XHViM2Q5XHVjNzdjXHVkNTVjIFx1YzY5NFx1YzE4YyBcdWM3NzRcdWI5ODRcdWM3NzQgXHVjNzc0XHViYmY4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHViMmU0XHViOTc4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotaW52YWxpZEVsZW1lbnROYW1lRXJyb3IxX21zZz1JVVBMMDEwMkU6ICcnezB9JycgXHVjNzc0XHViOTg0XHVjNzc0IFx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWMyYjVcdWIyYzhcdWIyZTQuXG5cblx1YmE1NFx1YzE4Y1x1YjRkYyBcdWM2OTRcdWMxOGMgXHVjNzc0XHViOTg0XHVjNzQwIFx1YWNmNVx1YmMzMVx1YzczY1x1Yjg1YyBcdWMyZGNcdWM3OTFcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC5cblxuXHVjNjJjXHViYzE0XHViOTc4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM3ODVcdWI4MjVcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjJfbXNnPUlVUEwwMTAzRTogJyd7MH0nJyBcdWM3NzRcdWI5ODRcdWM3NzQgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC5cblxuXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4YyBcdWM3NzRcdWI5ODRcdWM3NDAgXHViOWM4XHVjZTY4XHVkNDVjXHViODVjIFx1YjA1ZFx1YjBhMCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWM2MmNcdWJjMTRcdWI5NzggXHVjNzc0XHViOTg0XHVjNzQ0IFx1Yzc4NVx1YjgyNVx1ZDU1OFx1YWNlMCBcdWIyZTRcdWMyZGMgXHVjMmRjXHViM2M0XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2c9SVVQTDAxMDRFOiAnJ3swfScnIFx1Yzc3NFx1Yjk4NFx1Yzc3NCBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjIFx1Yzc3NFx1Yjk4NFx1YzVkMCBcXCAvIDogKiA/ICIgPCA+IDsgfCBcdWJiMzhcdWM3OTBcdWFjMDAgXHVkM2VjXHVkNTY4XHViNDIwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cblx1YzYyY1x1YmMxNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjNzg1XHViODI1XHVkNTU4XHVhY2UwIFx1YjJlNFx1YzJkYyBcdWMyZGNcdWIzYzRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotbm9Db25maWdFcnJvcl9tc2c9SVVQTDAxMDVFOiBcdWQ2MDRcdWM3YWMgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNzc0IFx1ZDNlY1x1ZDU2OFx1YjQxOFx1YzViNCBcdWM3ODhcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LiBcblxuXHVjMGM4IFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yjk3YyBcdWM3OTFcdWMxMzFcdWQ1NThcdWI4MjRcdWJhNzQgXHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMVx1Yzc3NCBcdWQ1NDRcdWM2OTRcdWQ1NjlcdWIyYzhcdWIyZTQuXG5cblx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzFcdWM3NDQgXHVjNzkxXHVjMTMxXHVkNTU4XHVhY2UwIFx1YjJlNFx1YzJkYyBcdWMyZGNcdWIzYzRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotbm9EZWxpdmVyeVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDZFOiBcdWQ2MDRcdWM3YWMgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMCBcdWM4MDRcdWIyZWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVhYzAwIFx1ZDNlY1x1ZDU2OFx1YjQxOFx1YzViNCBcdWM3ODhcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LiBcblxuXHVjMGM4IFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWNlZThcdWQyYjhcdWI5YWNcdWJkZjBcdWMxNThcdWM3NDQgXHVjNzkxXHVjMTMxXHVkNTU4XHViODI0XHViYTc0IFx1YWUzMFx1YmNmOCBcdWM4MDRcdWIyZWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVhYzAwIFx1ZDU0NFx1YzY5NFx1ZDU2OVx1YjJjOFx1YjJlNC5cblxuXHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yjk3YyBcdWM3OTFcdWMxMzFcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1ub0RlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQTDAxMDdFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzljMCBcdWM1NGFcdWM1NThcdWMyYjVcdWIyYzhcdWIyZTQuXG5cblx1YWUzMFx1YmNmOCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzBjOCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWM1ZDAgXHVjOWMwXHVjODE1XHVkNTc0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC5cblxuXHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1ub0Jhc2VQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA4RTogXHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNTU4XHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVjZWU4XHVkMmI4XHViOWFjXHViZGYwXHVjMTU4XHVjNWQwXHViMjk0IFx1YWUzMFx1YmNmOCBcdWM4MDRcdWIyZWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVhYzAwIFx1ZDU0NFx1YzY5NFx1ZDU2OVx1YjJjOFx1YjJlNC5cblxuXHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1jcmVhdGVQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA5RTogXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHViOTdjIFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9tc2c9SVVQTDAxMTBFOiBcdWM2OTRcdWMxOGNcdWI5N2MgXHVjNzkxXHVjMTMxXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotZGVsZXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMUU6IFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWMwYWRcdWM4MWNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX21zZz1JVVBMMDExMkU6IFx1YzY5NFx1YzE4Y1x1Yzc1OCBcdWNlZThcdWQxNTBcdWNlMjAgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXG4nJ3swfScnIFx1ZDMwY1x1Yzc3Y1x1Yzc3NCBcdWM3NzRcdWJiZjggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWIyZTRcdWI5NzggXHVjNzc0XHViOTg0XHVjNzQ0IFx1Yzc4NVx1YjgyNVx1ZDU1OFx1YWNlMCBcdWIyZTRcdWMyZGMgXHVjMmRjXHViM2M0XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3Jfc2ltcGxlX21zZz1cdWIzZDlcdWM3N2NcdWQ1NWMgXHVjNzc0XHViOTg0XHVjNzU4IFx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWQzMGNcdWM3N2NcdWM3NzQgXHVjNzc0XHViYmY4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHViMmU0XHViOTc4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdW5kb0NvbW1hbmRFcnJvcl9tc2c9SVVQTDAxMTNFOiAnJ3swfScnIFx1YzJlNFx1ZDU4OSBcdWNkZThcdWMxOGMgXHViYTg1XHViODM5XHVjNzQ0IFx1YzY0NFx1YjhjY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXG57MX0gXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1pbnZhbGlkUHJlZGVjZXNzb3JFcnJvcl9tc2c9SVVQTDAxMTRFOiBcdWM5YzBcdWM4MTVcdWQ1NWMgXHVjMTIwXHVkNTg5IFx1YzBjOVx1Yzc3OFx1Yzc3NCBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWMxMjBcdWQ1ODkgXHVjMGM5XHVjNzc4XHVjNzQwICdcdWMwYzlcdWM3NzgnIFx1YzVmNFx1Yzc1OCBcdWM4MTVcdWMyMTggXHVhYzEyXHVjNzc0XHVjNWI0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC5cblxuXHVjNjJjXHViYzE0XHViOTc4IFx1YWMxMlx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzPUlVUEwwMTAwVzogJyd7MH0nJyBcdWQ1NmRcdWJhYTlcdWM3NzQgXHVjNzc0XHViYmY4ICcnezF9JydcdWFjZmMoXHVjNjQwKSBcdWM1ZjBcdWFkMDBcdWI0MThcdWM1YjQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3NzQgXHVjNzIwXHVkNjE1XHVjNzU4IFx1YzVmMFx1YWQwMFx1Yzc0MCBcdWQ1NThcdWIwOThcdWI5Y2MgXHVkNWM4XHVjNmE5XHViNDI5XHViMmM4XHViMmU0LiAnJ3swfScnXHVjNzQ0KFx1Yjk3YykgJyd7Mn0nJ1x1YzVkMCBcdWM5YzBcdWM4MTVcdWQ1NThcdWI4MjRcdWJhNzQgXHViYTNjXHVjODAwICcnezF9JydcdWM1ZDBcdWMxMWMgXHVjODFjXHVhYzcwXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWVycm9yX21zZ1dpdGhEZXRhaWxzPUlVUEwwMTE2RTogXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWJjZjRcdWI4MjRcdWJhNzQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkXHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1lcnJvcl9tc2c9SVVQTDAxMTdFOiBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzYyNFx1Yjk1OCBcdWI4NWNcdWFkZjhcdWI5N2MgXHVjYzM4XHVjODcwXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLVN1cHByZXNzaW9uX25hbWVEdXBsaWNhdGlvbj1JVVBMMDExOEU6IFx1Yzc3NCBcdWM4NzBcdWM3OTFcdWM3NzQgXHViMDVkXHViMDljIFx1ZDZjNCwgXHVjNzc0XHViOTg0IFx1Y2RhOVx1YjNjY1x1Yzc3NCBcdWJjMWNcdWMwZGRcdWQ1NjlcdWIyYzhcdWIyZTQuIFx1YzY5NFx1YzE4Y1x1Yzc1OCBcdWM5MTFcdWJjZjVcdWI0MWMgXHVjNzc0XHViOTg0XHVjNzQ0IFx1ZDY1NVx1Yzc3OFx1ZDU1OFx1YWNlMCBcdWIyZTRcdWMyZGMgXHVjMmRjXHViM2M0XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLVN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbj1JVVBMMDExOUU6IFx1Yzc3NCBcdWM4NzBcdWM3OTFcdWM3NzQgXHViMDVkXHViMDljIFx1ZDZjNCwgXHVjNzc0XHViOTg0IFx1Y2RhOVx1YjNjY1x1Yzc3NCBcdWJjMWNcdWMwZGRcdWQ1NjlcdWIyYzhcdWIyZTQuIFx1YzY5NFx1YzE4Y1x1Yzc1OCBcdWM5MTFcdWJjZjVcdWI0MWMgXHVkNDVjXHVjMmRjIFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWQ2NTVcdWM3NzhcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249XHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWJjZjRcdWI4MjRcdWJhNzQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkXHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1zYXZlUHJvY2Vzc0Vycm9yX3JlYXNvbj0nJ3swfScnIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yjk3YyBcdWM4MDBcdWM3YTVcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHViY2Y0XHViODI0XHViYTc0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZGVsZXRlUmVmZXJlbmNlc0Vycm9yX3JlYXNvbj1cdWM3NzQgXHVjNjk0XHVjMThjXHVjNjQwIFx1YzVmMFx1YWQwMFx1YjQxYyBcdWNjMzhcdWM4NzBcdWI5N2MgXHVjODFjXHVhYzcwXHVkNTU4XHViMjk0IFx1YzkxMVx1YzVkMCBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YmNmNFx1YjgyNFx1YmE3NCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXNhdmVGaWxlRXJyb3JfcmVhc29uPScnezB9JycgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzgwMFx1YzdhNVx1ZDU1OFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWJjZjRcdWI4MjRcdWJhNzQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkXHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1pbnZhbGlkUmVmZXJlbmNlc0Vycm9yX3JlYXNvbj1cdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVhZDUwXHVjYzI4IFx1YmNmNVx1YzBhY1x1ZDU1YyBcdWFjYjBcdWFjZmMsIFx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWM3NDAgXHVjYzM4XHVjODcwXHViOTdjIFx1YWMwMFx1YzljNCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjXHVhYzAwIFx1YmMxY1x1YWNhY1x1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4gXG5cdWM3NzQgXHVjYzM4XHVjODcwXHViMjk0IFx1YzgxY1x1YWM3MFx1YjQyOVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLXVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb249XHVkNTc0XHVjMTFkXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWIyOTQgXHVjNjI0XHViZTBjXHVjODFkXHVkMmI4XHViOTdjIFx1YzIxOFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjNzRjOiB7MH0oVVJJID0gezF9KXsyfQ0KLQ0KLSMgV2FybmluZyBtZXNzYWdlcw0KLU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZz1JVVBMMDExOFc6IFx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHVjNmQwXHViY2Y4IFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWNjM2VcdWM3NDQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzkwXHVjNmQwIFx1ZDNmNFx1YjM1NFx1Yzc1OCBcdWM1ZjBcdWFkMDBcdWI0MWMgXHVkMzBjXHVjNzdjXHVjNzc0IFx1YmNmNVx1YzBhY1x1YjQxOFx1YzljMCBcdWM1NGFcdWMyYjVcdWIyYzhcdWIyZTQuDQotQWN0aXZpdHlBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZz1JVVBMMDExOVc6IFx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHVjNmQwXHViY2Y4IFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWNjM2VcdWM3NDQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNWYwXHVhZDAwXHViNDFjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWQzMjhcdWQwYTRcdWM5YzBcdWFjMDAgXHViY2Y1XHVjMGFjXHViNDE4XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi1BY3Rpdml0eURyb3BDb21tYW5kX2RlZXBDb3B5X3Byb21wdENvbmZpZ3VyYXRpb25Nc2c9XHViYWE4XHViNGUwIFx1YzEyNFx1YmE4NVx1Yzc5MFx1Yjk3YyBcdWJjZjVcdWMwYWNcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/XG5cblx1YzU0NFx1YjJjOFx1YzYyNFx1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWJhNzQgXHVkNjA0XHVjN2FjIFx1YWQ2Y1x1YzEzMVx1Yzc1OCBcdWM3N2NcdWJkODBcdWM3NzggXHVjMTI0XHViYTg1XHVjNzkwXHViOWNjIFx1YmNmNVx1YzBhY1x1ZDU2OVx1YjJjOFx1YjJlNC4NCi1kZWVwQ29weV9wcm9tcHRNc2c9XHVjNzc0XHVjODFjXHViZDgwXHVkMTMwIFx1YWMxY1x1YmNjNFx1YzgwMVx1YzczY1x1Yjg1YyBcdWM3MjBcdWM5YzBcdWJjZjRcdWMyMThcdWQ1NThcdWFlMzAgXHVjNzA0XHVkNTc0IFx1ZDU0NFx1YzY5NFx1ZDU1YyBcdWJhYThcdWI0ZTAgXHViM2Q5XHVjODAxIFx1YjljMVx1ZDA2YyBcdWM2OTRcdWMxOGNcdWM3NTggXHVjMGFjXHViY2Y4XHVjNzQ0IFx1YzViYlx1YWM4YyBcdWI0MjlcdWIyYzhcdWIyZTQuIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCi1kZWVwQ29weV90aXRsZT1cdWM4MDRcdWNjYjQgXHViY2Y1XHVjMGFjKERlZXAgQ29weSkNCi0NCi0jIFByb2dyZXNzIG1lc3NhZ2VzDQotY3JlYXRpbmdQcm9jZXNzQ29tcG9uZW50VGFza19uYW1lPVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWNlZjRcdWQzZWNcdWIxMGNcdWQyYjggJyd7MH0nJ1x1Yzc0NChcdWI5N2MpIFx1Yzc5MVx1YzEzMVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1wcm9jZXNzaW5nUmVmZXJlbmNlc1Rhc2tfbmFtZT1cdWNjMzhcdWM4NzBcdWI5N2MgXHVjYzk4XHViOWFjXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLWRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWU9XHVjNjk0XHVjMThjIFx1YmMwZiBcdWM1ZjBcdWFkMDBcdWI0MWMgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzBhZFx1YzgxY1x1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1jaGVja2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9XHVjYzM4XHVjODcwXHViOTdjIFx1YWM4MFx1YzBhY1x1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU9XHVjYzM4XHVjODcwXHViOTdjIFx1YzgxY1x1YWM3MFx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lPVx1YzIxOFx1YzgxNVx1YjQxYyBcdWQzMGNcdWM3N2NcdWM3NDQgXHVjODAwXHVjN2E1XHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLWNoZWNrQWZmZWN0ZWRSZXNvdXJjZXNUYXNrX25hbWU9XHVjNjAxXHVkNWE1IFx1YmMxYlx1YjI5NCBcdWM3OTBcdWM2ZDBcdWM3NDQgXHVhYzgwXHVjMGFjXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLW1vdmluZ1Rhc2tfbmFtZT1cdWM3NzRcdWIzZDkgXHVjOTExLi4uDQotbW92aW5nRmlsZXNUYXNrX25hbWU9XHVkMzBjXHVjNzdjXHVjNzQ0IFx1Yzc3NFx1YjNkOVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1jb3B5aW5nUmVzb3VyY2VzVGFza19uYW1lPVx1Yzc5MFx1YzZkMFx1Yzc0NCBcdWJjZjVcdWMwYWNcdWQ1NThcdWIyOTQgXHVjOTExLi4uDQotY29weWluZ0FjdGl2aXRpZXNfbXNnPScnezB9JycgXHVkNjVjXHViM2Q5XHVjNzQ0IFx1YmNmNVx1YzBhY1x1ZDU1OFx1YjI5NCBcdWM5MTENCi1zYXZpbmdGaWxlVGFza19uYW1lPScnezB9JycgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzgwMFx1YzdhNVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi0NCi0jIFVJIFRleHQNCi1lbGVtZW50X3RleHQ9XHVjNjk0XHVjMThjDQotY3JlYXRlRWxlbWVudF90ZXh0PVx1YzY5NFx1YzE4YyBcdWM3OTFcdWMxMzENCi1jcmVhdGVQcm9jZXNzX3RleHQ9XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1Yzc5MVx1YzEzMQ0KLWNvbnRyaWJ1dGVzVG9fdGV4dD1cdWNlZThcdWQyYjhcdWI5YWNcdWJkZjBcdWMxNTggXHViMzAwXHVjMGMxDQotbG9jYWxDb250cmlidXRlc1RvX3RleHQ9XHViODVjXHVjZWVjIFx1Y2VlOFx1ZDJiOFx1YjlhY1x1YmRmMFx1YzE1OCBcdWIzMDBcdWMwYzENCi1leHRlbmRzX3RleHQ9XHVkNjU1XHVjN2E1DQotcmVwbGFjZXNfdGV4dD1cdWJjMTRcdWFmYjhcdWFlMzANCi1sb2NhbFJlcGxhY2VzX3RleHQ9XHViODVjXHVjZWVjIFx1YmMxNFx1YWZiOFx1YWUzMA0KLWxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weV90ZXh0PVx1Yjg1Y1x1Y2VlYyBcdWJjMTRcdWFmYjhcdWFlMzAgXHViYzBmIFx1YzgwNFx1Y2NiNCBcdWJjZjVcdWMwYWMNCi1lbGVtZW50VHlwZV90ZXh0PXswfTogezF9DQotZGVsaXZlcmFibGVzX3RleHQ9XHVjNzc4XHViM2M0XHViYjNjDQotY29udHJpYnV0ZVRvQWN0aXZpdHlfdGV4dD1cdWNlZThcdWQyYjhcdWI5YWNcdWJkZjBcdWMxNTggXHViMzAwXHVjMGMxIFx1ZDY1Y1x1YjNkOQ0KLUFjdGl2aXR5RHJvcENvbW1hbmRfbGFiZWw9XHVkNjVjXHViM2Q5IFx1YjE5M1x1YWUzMA0KLXJlcGxhY2VBY3Rpdml0eV90ZXh0PVx1ZDY1Y1x1YjNkOSBcdWJjMTRcdWFmYjhcdWFlMzANCi1maWxlX3RleHQ9XHVkMzBjXHVjNzdjDQotZGlyZWN0b3J5X3RleHQ9XHViNTE0XHViODA5XHVkMWEwXHViOWFjDQotdW5yZXNvbHZlZF90ZXh0PShcdWQ1NzRcdWMxMWRcdWI0MThcdWM5YzAgXHVjNTRhXHVjNzQwICcnezB9JycpDQotYXNzaXN0c190ZXh0PVx1YzljMFx1YzZkMA0KLXVua25vd25fdGV4dD1cdWM1NGMgXHVjMjE4IFx1YzVjNlx1Yzc0Yw0KLWNvbW1hbmRfZG9uZT1cdWM2NDRcdWI4Y2MNCi0NCi0jIFRoZSBmb2xsb3dpbmcgVUkgdGV4dCBzaG91bGQgYmUgcmV2aWV3ZWQuDQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHl3aXRocGx1Z2luX2luZm89ezB9ICgnJ3szfScnXHVjNzU4IHsxfSAnJ3syfScnKQ0KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5X2luZm89ezB9ICh7MX0gJyd7Mn0nJykNCi11aV9yZWZfZGVsZXRlPScnezB9JycgXHVjMTI0XHViYTg1XHVjNzkwXHVjNWQwIFx1YzBhY1x1YzZhOVx1YjQxOFx1YzljMCBcdWM1NGFcdWM3NDAgXHViMmU0XHVjNzRjIFx1Y2MzOFx1Yzg3MFx1YWMwMCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuXG5cdWMwYWRcdWM4MWNcdWQ1NjAgXHVkNTZkXHViYWE5XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi11aV9yZWZfZGVsZXRlMj1cdWIyZTRcdWM3NGMgXHVjYzM4XHVjODcwXHViMjk0IFx1YzViNFx1YjI5MCBcdWFjZjNcdWM1ZDBcdWMxMWNcdWIzYzQgXHVjMGFjXHVjNmE5XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cdWMwYWRcdWM4MWNcdWQ1NjAgXHVkNTZkXHViYWE5XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi11aV9yZWZlcmVuY2VzPVx1Y2MzOFx1Yzg3MA0KLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWMxMjRcdWJhODVcdWM3OTAgJyd7MH0nJ1x1Yzc3NChcdWFjMDApICcnezF9JycgXHVkMGMwXHVjMmE0XHVkMDZjIFx1YzEyNFx1YmE4NVx1Yzc5MFx1YzY0MCBcdWM1ZjBcdWFkMDBcdWI0MThcdWM1YjQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0KFx1YzBiMFx1Y2Q5YyBcdWM5YzBcdWM4MTApLg0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vcHRpb25zPVx1YzYzNVx1YzE1OA0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1YzEyNFx1YmE4NVx1Yzc5MFx1Yjk3YyBcdWQwYzBcdWMyYTRcdWQwNmMgXHVjMTI0XHViYTg1XHVjNzkwXHVjNzU4IFx1YzBiMFx1Y2Q5Y1x1YmIzY1x1Yjg1YyBcdWM4MWNcdWFjNzANCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3JfZGVsZXRlX3Rhc2s9XHVkMGMwXHVjMmE0XHVkMDZjIFx1YzEyNFx1YmE4NVx1Yzc5MFx1Yjk3YyBcdWQ2NWNcdWIzZDlcdWM1ZDBcdWMxMWMgXHVjMGFkXHVjODFjDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2RlZmF1bHRjb25maWdjaGVjaz1cdWMxMjBcdWQwZGRcdWQ1NWMgJyd7MH0nJyBcdWM2OTRcdWMxOGNcdWFjMDAgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVjNzU4IFx1YWUzMFx1YmNmOCBcdWFkNmNcdWMxMzFcdWM1ZDAgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXHVjNzc0IFx1YzY5NFx1YzE4Y1x1YzY0MCBcdWM2OTRcdWMxOGNcdWM3NTggXHVjODg1XHVjMThkXHVjMTMxXHVjNzQ0IFx1YWUzMFx1YmNmOCBcdWFkNmNcdWMxMzFcdWM1ZDAgXHVjZDk0XHVhYzAwXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9nZW5lcmljRXJyX21lc3NhZ2VfdGV4dD1cdWM4NzBcdWM3OTEgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHViY2Y0XHViODI0XHViYTc0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoPVx1YjNkOVx1YWUzMFx1ZDY1NFx1YjQyMCBcdWI5YzFcdWQwNmNcdWI0MWMgXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4Y1x1Yzc1OCBcdWMxMjRcdWJhODVcdWM3OTBcdWFjMDAgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXI9XHVkNDVjXHVjMmRjXHVhZTMwXHViOTdjIFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OCBcdWJjMWNcdWMwZGQNCi1jb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQ9XHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkXHVjNWQwIFx1YjA5OFx1YzVmNFx1YjQxYyBcdWM2OTRcdWMxOGNcdWFjMDAgXHVjNzc0IFx1YzU0OFx1YjBiNFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWNjMzhcdWM4NzBcdWI5N2MgXHViY2MwXHVkNjU4IFx1ZDZjNFx1YzVkMCBcdWFjMTZcdWFjOGMgXHViNDI5XHViMmM4XHViMmU0LiBcdWM3OTBcdWIzZDlcdWM3M2NcdWI4NWMgXHVjODFjXHVhYzcwXHVkNTU4XHVhY2UwIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWQ2NTVcdWM3NzhcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3VuaGFuZGxlZF9leGNlcHRpb249XHVjYzk4XHViOWFjXHViNDE4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWM2MDhcdWM2NzgNCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX2JyZWFrZG93bl9lbGVtZW50PVx1YzEyMFx1ZDU4OSBcdWJjMGYgXHVkNmM0XHVkNTg5XHVhY2ZjIFx1YjNkOVx1Yzc3Y1x1ZDU1YyBcdWJkODRcdWI5NTggXHVjNjk0XHVjMThjXHViOTdjIFx1YWMwMFx1YzljOCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93cGxpc3RkbGdfbXNnPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgJyd7MH0nJ1x1Yzc0MChcdWIyOTQpIFx1YjJlNFx1Yzc0YyBcdWQwYzBcdWMyYTRcdWQwNmNcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzBiMFx1Y2Q5Y1x1YmIzY1x1Yzc4NVx1YjJjOFx1YjJlNC5cblx1ZDU3NFx1YjJmOVx1ZDU1OFx1YjI5NCBcdWMxMjRcdWJhODVcdWM3OTBcdWI5N2MgXHVjNzkxXHVjMTMxXHVkNTYwIFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZz1cdWM1ZWRcdWQ1NjAgJyd7MH0nJ1x1YzVkMCBcdWIyZTRcdWM3NGNcdWFjZmMgXHVhYzE5XHVjNzQwIFx1Y2M0NVx1Yzc4NCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNzc0IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC5cblx1ZDU3NFx1YjJmOVx1ZDU1OFx1YjI5NCBcdWMxMjRcdWJhODVcdWM3OTBcdWI5N2MgXHVjNzkxXHVjMTMxXHVkNTYwIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2NcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyPVx1YzJlY1x1YWMwMVx1ZDU1YyBcdWM2MjRcdWI5NTgNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd29ya3Byb2R1Y3RzPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX3N1Yl9lbGVtZW50PVx1YmQ4NFx1Yjk1OCBcdWM2OTRcdWMxOGNcdWI5N2MgXHVkNTc0XHViMmY5XHVkNTU4XHViMjk0IFx1ZDU1OFx1YzcwNCBcdWM2OTRcdWMxOGMgXHVjOTExIFx1ZDU1OFx1YjA5OFx1YzVkMCBcdWI5YzFcdWQwNmNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl93cm9uZ19lbGVtZW50PVx1Yzc5MVx1YzVjNVx1YmQ4NFx1Yjk1OCBcdWM2OTRcdWMxOGMgXHVjNzc0XHVjNjc4XHVjNzU4IFx1YzY5NFx1YzE4Y1x1YzVkMCBcdWI5YzFcdWQwNmNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9jaGlsZF9lbGVtZW50PVx1YmQ4NFx1Yjk1OCBcdWM2OTRcdWMxOGNcdWI5N2MgXHVkNTc0XHViMmY5XHVkNTU4XHViMjk0IFx1ZDU1OFx1YzcwNCBcdWM5MTEgXHVkNTU4XHViMDk4XHVjNWQwIFx1YjljMVx1ZDA2Y1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrcz1cdWQwYzBcdWMyYTRcdWQwNmMNCi11aV9hc3NvY2lhdGlvbl90YXNrX3NlbGVjdGlvbj1cdWQwYzBcdWMyYTRcdWQwNmMgXHVjMTIwXHVkMGRkLi4uDQotdXRpbF9Qcm9jZXNzVXRpbF9jaGlsZGFkYXB0ZXI9XCBcIFx1ZDU1OFx1YzcwNFx1Yzc1OCBcdWM1YjRcdWIzMTFcdWQxMzA6DQotDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2V0cGFyZW50PVx1ZDU1OFx1YzcwNFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjMGMxXHVjNzA0XHViOTdjIFx1YzEyNFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjNzRjDQotdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlPVx1Yzc5MFx1YzZkMFx1Yzc0NCBcdWQzYjhcdWM5ZDFcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi11dGlsX1Byb2Nlc3NVdGlsX2NvbnRyaWJ1dGVzdG89Jyd7MH0nJyhcdWM3M2MpXHViODVjIFx1Y2VlOFx1ZDJiOFx1YjlhY1x1YmRmMFx1YzE1OA0KLXV0aWxfUHJvY2Vzc1V0aWxfbG9jYWxDb250cmlidXRlc3RvPScnezB9JydcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yjg1Y1x1Y2VlYyBcdWNlZThcdWQyYjhcdWI5YWNcdWJkZjBcdWMxNTgNCi1wcm9jZXNzX2V4dGVuZHM9Jyd7MH0nJyBcdWQ2NTVcdWM3YTUNCi1wcm9jZXNzX3JlcGxhY2VzPScnezB9JycgXHViYzE0XHVhZmI4XHVhZTMwDQotcHJvY2Vzc19sb2NhbFJlcGxhY2VzPScnezB9JycgXHViODVjXHVjZWVjIFx1YmMxNFx1YWZiOFx1YWUzMA0KLSMgRmlsdGVyIGNvbnN0YW50cyBleHRlcm5hbGl6ZWQgc3RyaW5ncy4NCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZXNfdGV4dD1cdWM2ZDBcdWNlNTkNCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZWdyb3VwaW5nc190ZXh0PVx1YzZkMFx1Y2U1OSBcdWFkZjhcdWI4ZjkNCi1GaWx0ZXJDb25zdGFudHNfd2hpdGVwYXBlcnNfdGV4dD1cdWJjMzFcdWMxMWMNCi1GaWx0ZXJDb25zdGFudHNfdG9vbG1lbnRvcnNfdGV4dD1cdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5IFx1YjNjNFx1YzZjMFx1YjlkMA0KLUZpbHRlckNvbnN0YW50c190b29sc190ZXh0PVx1YjNjNFx1YWQ2Yw0KLUZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0PVx1YzVlZFx1ZDU2MA0KLUZpbHRlckNvbnN0YW50c190YXNrc190ZXh0PVx1ZDBjMFx1YzJhNFx1ZDA2Yw0KLUZpbHRlckNvbnN0YW50c19yZXVzYWJsZWFzc2V0c190ZXh0PVx1YzdhY1x1YzBhY1x1YzZhOVx1YWMwMFx1YjJhNVx1ZDU1YyBcdWM3OTBcdWMwYjANCi1GaWx0ZXJDb25zdGFudHNfYWxsX3RleHQ9XHViYWE4XHViNDUwDQotRmlsdGVyQ29uc3RhbnRzX3Byb2Nlc3Nlc190ZXh0PVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNA0KLUZpbHRlckNvbnN0YW50c19wcmFjdGljZXNfdGV4dD1cdWMwYWNcdWI4NDANCi1GaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ9XHVkMTVjXHVkNTBjXHViOWFjXHVkMmI4DQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0c190ZXh0PVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi1GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0PVx1Y2NiNFx1ZDA2Y1x1YjlhY1x1YzJhNFx1ZDJiOA0KLUZpbHRlckNvbnN0YW50c19ndWlkZWxpbmVzX3RleHQ9XHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4DQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRzX3RleHQ9XHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOA0KLUZpbHRlckNvbnN0YW50c19ndWlkYW5jZV90ZXh0PVx1YzU0OFx1YjBiNA0KLUZpbHRlckNvbnN0YW50c19jb25jZXB0c190ZXh0PVx1YWMxY1x1YjE1MA0KLUZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0PVx1YzYwOFx1YzgxYw0KLUZpbHRlckNvbnN0YW50c19jb250ZW50cGFja2FnZXNfdGV4dD1cdWNlZThcdWQxNTBcdWNlMjAgXHVkMzI4XHVkMGE0XHVjOWMwDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0PVx1YzVlZFx1ZDU2MCBcdWMxMjRcdWJhODVcdWM3OTANCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNldGdyb3B1aW5nc190ZXh0PVx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjggXHVhZGY4XHViOGY5DQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tkZXNjcmlwdG9yc190ZXh0PVx1ZDBjMFx1YzJhNFx1ZDA2YyBcdWMxMjRcdWJhODVcdWM3OTANCi1GaWx0ZXJDb25zdGFudHNfY29udGVudGVsZW1lbnRzX3RleHQ9XHVjZWU4XHVkMTUwXHVjZTIwIFx1YzY5NFx1YzE4Yw0KLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZT1cdWIzZDlcdWFlMzBcdWQ2NTQgXHVjOTAwXHViZTQ0IFx1YzkxMS4uLg0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdGRlc2NyaXB0b3JzX3RleHQ9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWMxMjRcdWJhODVcdWM3OTANCi1GaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ9XHViYWE4XHViNGUwIFx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWM2OTRcdWMxOGMNCi1GaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0PVx1YzljMFx1YzZkMCBcdWM3OTBcdWI4Y2MNCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzPVx1ZDMwY1x1Yzc3YyBcdWM4MDBcdWM3YTUgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OCBcdWJjMWNcdWMwZGQNCi1GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0PVx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NTggXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0dHlwZXNfdGV4dD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1YzcyMFx1ZDYxNQ0KLURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kX3dhcm5pbmdNc2c9XHVhY2JkXHVhY2UwXHVjNjQwIFx1ZDU2OFx1YWVkOCBcdWMwYWRcdWM4MWMgXHVjNjQ0XHViOGNjDQotRmlsdGVyQ29uc3RhbnRzX21ldGhvZHBsdWdpbnNfdGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotVXNlckludGVyYWN0aW9uSGVscGVyX2xvY2tlZFBsdWdpbj1JVVBMMDEyMEU6ICcnezB9JycgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzc0IFx1YzdhMFx1YWNhOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dD1cdWIzYzRcdWJhNTRcdWM3NzgNCi1GaWx0ZXJDb25zdGFudHNfcm9hZG1hcF90ZXh0PVx1Yjg1Y1x1YjRkY1x1YjlmNQ0KLUZpbHRlckNvbnN0YW50c19yZXBvcnRzX3RleHQ9XHViY2Y0XHVhY2UwXHVjMTFjDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbD1cdWJhNTRcdWMxOGNcdWQyYjggXHVjZWU4XHVkMTUwXHVjZTIwXHVjNWQwXHVjMTFjIFx1YWUzMFx1YmNmOCBcdWIzZDlcdWFlMzBcdWQ2NTQoJlkpDQotTWFudWFsU3luY2hyb25pemVDb21tYW5kX2xhYmVsPVx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NTggXHViM2Q5XHVhZTMwXHVkNjU0KCZaKS4uLg0KLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfc3VjZXNzZnVsPVx1YjNkOVx1YWUzMFx1ZDY1NFx1YWMwMCBcdWMxMzFcdWFjZjVcdWM4MDFcdWM3M2NcdWI4NWMgXHVjNjQ0XHViOGNjXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgVXNlckludGVyYWN0aW9uSGVscGVyDQotVXNlckludGVyYWN0aW9uSGVscGVyX1Byb2Nlc3NQYWNrYWdlX05hbWU9XHVjNzc0XHViOTg0Og0KLQ0KLSMgTWV0aG9kQ3JlYXRlQ2hpbGRDb21tYW5kDQotbmV3RWxlbWVudF90ZXh0PVx1YzBjOCB7MH0NCi11cGRhdGVfb3V0b2ZzeW5jaF90aXRsZT1cdWFjMzFcdWMyZTAgXHVjZGE5XHViM2NjDQotdXBkYXRlX291dG9mc3luY2hfbXNnPVx1ZDMwY1x1Yzc3Y1x1Yzc3NCBcdWQzMGNcdWM3N2MgXHVjMmRjXHVjMmE0XHVkMTVjXHVjNWQwXHVjMTFjIFx1YmNjMFx1YWNiZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4gXHViY2MwXHVhY2JkXHVjMGFjXHVkNTZkXHVjNzQ0IFx1YWNiOVx1Y2NkMFx1YzRmMFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2QyZmMxOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgR2VuZXJpYyBEaWFsb2cgVGl0bGVzDQotbW92ZURpYWxvZ190aXRsZT1Nb3Zlcg0KLWRlbGV0ZURpYWxvZ190aXRsZT1FeGNsdWlyIEVsZW1lbnRvDQotZXJyb3JEaWFsb2dfdGl0bGU9RXJybw0KLWVycm9yRGlhbG9nX2Nhbm5vdFJlbmFtZT1JbXBvc3NcdTAwZWR2ZWwgcmVub21lYXIgezB9ICcnezF9JycgcGFyYSAnJ3syfScnLiBSZXNvbHZhIG8gcHJvYmxlbWEgbW9zdHJhZG8gZW0gRGV0YWxoZXMgZSBjbGlxdWUgZW0gT0sgcGFyYSBjb250aW51YXIgb3UgZW0gQ2FuY2VsYXIgcGFyYSBpbnRlcnJvbXBlciBlc3RhIG9wZXJhXHUwMGU3XHUwMGUzby4NCi0NCi0jIENvbmZpcm0gUmVmZXJlbmNlcyBSZW1vdmFsIERpYWxvZw0KLWRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGl0bGU9Q29uZmlybWFyIFJlbW9cdTAwZTdcdTAwZTNvIGRlIFJlZmVyXHUwMGVhbmNpYXMNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RleHQ9T3MgZWxlbWVudG9zIHF1ZSB2b2NcdTAwZWEgZXN0XHUwMGUxIHByZXN0ZXMgYSBleGNsdWlyIGFpbmRhIGVzdFx1MDBlM28gc2VuZG8gcmVmZXJlbmNpYWRvcyBwb3Igb3V0cm9zIGVsZW1lbnRvcyBuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4gQSBleGNsdXNcdTAwZTNvIGRlc3NlcyBlbGVtZW50b3MgcmVtb3Zlclx1MDBlMSByZWZlclx1MDBlYW5jaWFzIGEgZWxlcywgcG9ydGFudG8sIHRhbWJcdTAwZTltIGF0dWFsaXphclx1MDBlMSBvcyBlbGVtZW50b3MgcXVlIGZhemVtIGFzIHJlZmVyXHUwMGVhbmNpYXMuIENlcnRpZmlxdWUtc2UgZGUgdGVyIHBlcm1pc3NcdTAwZTNvIHBhcmEgYXR1YWxpemFyIG9zIGVsZW1lbnRvcyBxdWUgZmF6ZW0gYXMgcmVmZXJcdTAwZWFuY2lhcyBhbnRlcyBkZSBjbGljYXIgZW0gT0suIENsaXF1ZSBlbSBEZXRhbGhlcyBwYXJhIHJldmlzYXIgYSBsaXN0YSBkZSBlbGVtZW50b3MgcXVlIHJlZmVyZW5jaWFtIG9zIGVsZW1lbnRvcyBxdWUgdm9jXHUwMGVhIGVzdFx1MDBlMSBwcmVzdGVzIGEgZXhjbHVpci4NCi0NCi0jIFJlc29sdmUgTmFtZSBDb25mbGljdCBEaWFsb2cNCi1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlPVJlc29sdmVyIENvbmZsaXRvIGRlIE5vbWVzIGRlIEVsZW1lbnRvcw0KLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGV4dD1EaWdpdGUgdW0gbm92byB7MH0gcGFyYSAnJ3sxfScnOg0KLQ0KLSMgU2VsZWN0IERlbGl2ZXJhYmxlcyBEaWFsb2cNCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGl0bGU9U2VsZWNpb25hciBEaXN0cmlidVx1MDBlZHZlaXMNCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGV4dD1TZWxlY2lvbmUgdW0gZGlzdHJpYnVcdTAwZWR2ZWwgbm8gcXVhbCB2b2NcdTAwZWEgZGVzZWphIHF1ZSBvIHByb2R1dG8gZGUgdHJhYmFsaG8gJyd7MH0nJyBzZWphIGRlc2lnbmFkby4NCi0NCi0jIE5ldyBQcm9jZXNzIENvbXBvbmVudCBEaWFsb2cNCi1uZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nX3RpdGxlPU5vdm8gQ29tcG9uZW50ZSBkZSBQcm9jZXNzbw0KLW5hbWVMYWJlbF90ZXh0PU5vbWU6DQotZGVmYXVsdENvbmZpZ0xhYmVsX3RleHQ9Q29uZmlndXJhXHUwMGU3XHUwMGUzbyBQYWRyXHUwMGUzbzoNCi1iYXNlUHJvY2Vzc0xhYmVsX3RleHQ9UHJvY2Vzc28gZGUgQmFzZToNCi1iYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dD1CYXNlYWRvIG5vcyBQcm9jZXNzb3M6DQotDQotIyBSb2xlIEFzc29jaWF0aW9uIERpYWxvZw0KLXNlbGVjdEFzc29jaWF0aW9uTGFiZWxfdGV4dD1TZWxlY2lvbmFyIGFzc29jaWFcdTAwZTdcdTAwZTNvIHBhcmEgYSB0YXJlZmEgJyd7MH0nJw0KLQ0KLSMgUmVtb3ZlIEFzc29jaWF0aW9uIGRpYWxvZw0KLXJlbW92ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ9UmVtb3ZlciBBc3NvY2lhXHUwMGU3XHUwMGUzbw0KLQ0KLSMgU2VsZWN0IFRlYW1zIERpYWxvZw0KLXNlbGVjdFRlYW1zRGlhbG9nX3RpdGxlPVNlbGVjaW9uYXIgRXF1aXBlcw0KLXNlbGVjdFRlYW1zRGlhbG9nX3RleHQ9U2VsZWNpb25lIHVtYSBlcXVpcGUgbmEgcXVhbCB2b2NcdTAwZWEgZGVzZWphIHF1ZSB1bWEgZnVuXHUwMGU3XHUwMGUzbyAnJ3swfScnIHNlamEgZGVzaWduYWRhLg0KLQ0KLSMgVGFzbCBTZWxlY3Rpb24gRGlhbG9nDQotdGFza1NlbGVjdGlvbkRpYWxvZ190aXRsZT1TZWxlXHUwMGU3XHUwMGUzbyBkZSBUYXJlZmFzDQotdGl0bGVMYWJlbF90ZXh0PVNlbGVjaW9uYXIgdGFyZWZhcy4uLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAwRTogTyBub21lIHswfSBcdTAwZTkgbmVjZXNzXHUwMGUxcmlvLlxuXG5Ub2RvcyBvcyBlbGVtZW50b3MgZGUgbVx1MDBlOXRvZG8gZSBkZSBwcm9jZXNzbyBkZXZlbSB0ZXIgdW0gbm9tZS5cblxuRGlnaXRlIHVtIG5vbWUgdlx1MDBlMWxpZG8gZSB0ZW50ZSBub3ZhbWVudGUuDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9TyBub21lIG5cdTAwZTNvIHBvZGUgZXN0YXIgdmF6aW8uIEVzcGVjaWZpcXVlIHVtIG5vbWUgdlx1MDBlMWxpZG8uDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDFFOiBPIG5vbWUgJyd7MH0nJyBqXHUwMGUxIGV4aXN0ZS5cblxuVW0gZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gZGV2ZSB0ZXIgdW0gbm9tZSBleGNsdXNpdm8uXG5cbkRpZ2l0ZSB1bSBub21lIGRpZmVyZW50ZSBlIHRlbnRlIG5vdmFtZW50ZS4NCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9TyBtZXNtbyBub21lIGRlIGVsZW1lbnRvIGpcdTAwZTEgZXhpc3RlLiBFc3BlY2lmaXF1ZSBvdXRybyBub21lLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMV9tc2c9SVVQTDAxMDJFOiBPIG5vbWUgJyd7MH0nJyBcdTAwZTkgaW52XHUwMGUxbGlkby5cblxuVW0gbm9tZSBkZSBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyBuXHUwMGUzbyBwb2RlIGluaWNpYXIgY29tIHVtIGVzcGFcdTAwZTdvLlxuXG5EaWdpdGUgdW0gbm9tZSB2XHUwMGUxbGlkbyBlIHRlbnRlIG5vdmFtZW50ZS4NCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjJfbXNnPUlVUEwwMTAzRTogTyBub21lICcnezB9JycgXHUwMGU5IGludlx1MDBlMWxpZG8uXG5cblVtIG5vbWUgZGUgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gblx1MDBlM28gcG9kZSB0ZXJtaW5hciBjb20gdW0gcG9udG8uXG5cbkRpZ2l0ZSB1bSBub21lIHZcdTAwZTFsaWRvIGUgdGVudGUgbm92YW1lbnRlLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2c9SVVQTDAxMDRFOiBPIG5vbWUgJyd7MH0nJyBcdTAwZTkgaW52XHUwMGUxbGlkby5cblxuVW0gbm9tZSBkZSBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyBuXHUwMGUzbyBwb2RlIGNvbnRlciBlc3RlcyBjYXJhY3RlcmVzOiBcXCAvIDogKiA/ICIgPCA+IDsgfFxuXG5EaWdpdGUgdW0gbm9tZSB2XHUwMGUxbGlkbyBlIHRlbnRlIG5vdmFtZW50ZS4NCi1ub0NvbmZpZ0Vycm9yX21zZz1JVVBMMDEwNUU6IEEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYXR1YWwgblx1MDBlM28gY29udFx1MDBlOW0gbmVuaHVtYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvLlxuXG5cdTAwYzkgbmVjZXNzXHUwMGUxcmlhIHVtYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvIHBhcmEgY3JpYXIgdW0gbm92byBwcm9jZXNzby5cblxuQ3JpZSB1bWEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBtXHUwMGU5dG9kbyBlIHRlbnRlIG5vdmFtZW50ZS4NCi1ub0RlbGl2ZXJ5UHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwNkU6IEEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYXR1YWwgblx1MDBlM28gY29udFx1MDBlOW0gbmVuaHVtIHByb2Nlc3NvIGRlIGVudHJlZ2EuXG5cblx1MDBjOSBuZWNlc3NcdTAwZTFyaW8gdW0gcHJvY2Vzc28gZGUgZW50cmVnYSBkZSBiYXNlIHBhcmEgY3JpYXIgdW1hIG5vdmEgY29udHJpYnVpXHUwMGU3XHUwMGUzbyBkZSBwcm9jZXNzby5cblxuQ3JpZSB1bSBwcm9jZXNzbyBkZSBlbnRyZWdhIGUgdGVudGUgbm92YW1lbnRlLg0KLW5vRGVmYXVsdENvbmZpZ0Vycm9yX21zZz1JVVBMMDEwN0U6IE5lbmh1bWEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBtXHUwMGU5dG9kbyBmb2kgc2VsZWNpb25hZGEuXG5cblVtYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvIHBhZHJcdTAwZTNvIGRldmUgc2VyIGRlc2lnbmFkYSBwYXJhIG8gbm92byBwcm9jZXNzby5cblxuU2VsZWNpb25lIHVtYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvIGUgdGVudGUgbm92YW1lbnRlLg0KLW5vQmFzZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDhFOiBOZW5odW0gcHJvY2Vzc28gZGUgZW50cmVnYSBmb2kgc2VsZWNpb25hZG8uXG5cblVtYSBjb250cmlidWlcdTAwZTdcdTAwZTNvIGRlIHByb2Nlc3NvIGV4aWdlIHVtIHByb2Nlc3NvIGRlIGVudHJlZ2EgZGUgYmFzZS5cblxuU2VsZWNpb25lIHVtIHByb2Nlc3NvIGRlIGVudHJlZ2EgZSB0ZW50ZSBub3ZhbWVudGUuDQotY3JlYXRlUHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwOUU6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGNyaWFyIG8gcHJvY2Vzc28gY29tIFx1MDBlYXhpdG8uDQotY3JlYXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMEU6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGNyaWFyIG8gZWxlbWVudG8gY29tIFx1MDBlYXhpdG8uDQotZGVsZXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMUU6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGV4Y2x1aXIgbyBlbGVtZW50byBjb20gXHUwMGVheGl0by4NCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX21zZz1JVVBMMDExMkU6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGNyaWFyIG8gYXJxdWl2byBkZSBjb250ZVx1MDBmYWRvIHBhcmEgbyBlbGVtZW50by5cblxuSlx1MDBlMSBleGlzdGUgdW0gYXJxdWl2byAnJ3swfScnLlxuXG5EaWdpdGUgdW0gbm9tZSBkaWZlcmVudGUgZSB0ZW50ZSBub3ZhbWVudGUuDQotZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9zaW1wbGVfbXNnPUV4aXN0ZSB1bSBhcnF1aXZvIGRlIGNvbnRlXHUwMGZhZG8gY29tIG8gbWVzbW8gbm9tZS4gRXNwZWNpZmlxdWUgb3V0cm8gbm9tZS4NCi11bmRvQ29tbWFuZEVycm9yX21zZz1JVVBMMDExM0U6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGNvbmNsdWlyIG8gY29tYW5kbyBkZSBkZXNmYXplciAnJ3swfScnLlxuXG5PY29ycmV1IHVtIGVycm86IHsxfQ0KLWludmFsaWRQcmVkZWNlc3NvckVycm9yX21zZz1JVVBMMDExNEU6IE8gXHUwMGVkbmRpY2UgZGUgcHJlZGVjZXNzb3IgZXNwZWNpZmljYWRvIFx1MDBlOSBpbnZcdTAwZTFsaWRvLlxuXG5VbSBcdTAwZWRuZGljZSBkZSBwcmVkZWNlc3NvciBkZXZlIHNlciB1bSB2YWxvciBpbnRlaXJvIGRhIGNvbHVuYSAnXHUwMGNkbmRpY2UnLlxuXG5Fc3BlY2lmaXF1ZSB1bSB2YWxvciB2XHUwMGUxbGlkbyBlIHRlbnRlIG5vdmFtZW50ZS4NCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzPUlVUEwwMTAwVzogJyd7MH0nJyBqXHUwMGUxIGVzdFx1MDBlMSBhc3NvY2lhZG8gYSAnJ3sxfScnLiAgU29tZW50ZSB1bWEgYXNzb2NpYVx1MDBlN1x1MDBlM28gZGVzdGUgdGlwbyBcdTAwZTkgcGVybWl0aWRhLiBQYXJhIGRlc2lnbmFyICcnezB9JycgcGFyYSAnJ3syfScnLCBwcmltZWlybyBcdTAwZTkgbmVjZXNzXHUwMGUxcmlvIHJlbW92XHUwMGVhLWxvIGRlICcnezF9JycuDQotZXJyb3JfbXNnV2l0aERldGFpbHM9SVVQTDAxMTZFOiBPY29ycmV1IHVtIGVycm8uIENsaXF1ZSBlbSBEZXRhbGhlcyBwYXJhIG9idGVyIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzLg0KLWVycm9yX21zZz1JVVBMMDExN0U6IE9jb3JyZXUgdW0gZXJyby4gQ29uc3VsdGUgbyByZWdpc3RybyBkZSBlcnJvcyBwYXJhIG9idGVyIGRldGFsaGVzIGFkaWNpb25haXMuDQotU3VwcHJlc3Npb25fbmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE4RTogT2NvcnJlclx1MDBlMSB1bSBjb25mbGl0byBkZSBub21lcyBhcFx1MDBmM3MgZXN0YSBvcGVyYVx1MDBlN1x1MDBlM28uIFByb2N1cmUgcG9yIGR1cGxpY2FcdTAwZTdcdTAwZjVlcyBubyBub21lIGRvIGVsZW1lbnRvIGUgdGVudGUgbm92YW1lbnRlLg0KLVN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbj1JVVBMMDExOUU6IE9jb3JyZXJcdTAwZTEgdW0gY29uZmxpdG8gZGUgbm9tZXMgYXBcdTAwZjNzIGVzdGEgb3BlcmFcdTAwZTdcdTAwZTNvLiBQcm9jdXJlIHBvciBkdXBsaWNhXHUwMGU3XHUwMGY1ZXMgbm8gbm9tZSBkZSBhcHJlc2VudGFcdTAwZTdcdTAwZTNvIGUgdGVudGUgbm92YW1lbnRlLg0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1PY29ycmV1IHVtIGVycm8uIENsaXF1ZSBlbSBEZXRhbGhlcyBwYXJhIG9idGVyIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzLg0KLXNhdmVQcm9jZXNzRXJyb3JfcmVhc29uPU9jb3JyZXUgdW0gZXJybyBhbyBzYWx2YXIgbyBwcm9jZXNzbyAnJ3swfScnLiBDbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4NCi1kZWxldGVSZWZlcmVuY2VzRXJyb3JfcmVhc29uPU9jb3JyZXUgdW0gZXJybyBhbyByZW1vdmVyIHJlZmVyXHUwMGVhbmNpYXMgYXNzb2NpYWRhcyBhIGVzdGUgZWxlbWVudG8uIENsaXF1ZSBlbSBEZXRhbGhlcyBwYXJhIG9idGVyIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzLg0KLXNhdmVGaWxlRXJyb3JfcmVhc29uPU9jb3JyZXUgdW0gZXJybyBhbyBzYWx2YXIgbyBhcnF1aXZvICcnezB9JycuIENsaXF1ZSBlbSBEZXRhbGhlcyBwYXJhIG9idGVyIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzLg0KLWludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uPUZvcmFtIGRldGVjdGFkb3MgZWxlbWVudG9zIGRlIG1cdTAwZTl0b2RvIGNvbSByZWZlclx1MDBlYW5jaWFzIGludlx1MDBlMWxpZGFzIGNvbW8gcmVzdWx0YWRvIGRlIGNcdTAwZjNwaWEgZW50cmUgcGx1Zy1pbnMuXG5Fc3NhcyByZWZlclx1MDBlYW5jaWFzIHNlclx1MDBlM28gcmVtb3ZpZGFzLiBEZXNlamEgY29udGludWFyPw0KLXVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb249SW1wb3NzXHUwMGVkdmVsIG1vZGlmaWNhciB1bSBvYmpldG8gblx1MDBlM28gcmVzb2x2aWRvOiB7MH0oVVJJID0gezF9KXsyfQ0KLQ0KLSMgV2FybmluZyBtZXNzYWdlcw0KLU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZz1JVVBMMDExOFc6IE5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIGxvY2FsaXphciB1bSBvdSBtYWlzIGVsZW1lbnRvcyBkZSBvcmlnZW0uIE9zIGFycXVpdm9zIGFzc29jaWFkb3MgbmEgcGFzdGEgZGUgcmVjdXJzb3Mgblx1MDBlM28gc2VyXHUwMGUzbyBjb3BpYWRvcy4NCi1BY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE5VzogTlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgbG9jYWxpemFyIHVtIG91IG1haXMgZWxlbWVudG9zIGRlIG9yaWdlbS4gT3MgUGFjb3RlcyBkZSBQcm9jZXNzbyBhc3NvY2lhZG9zIG5cdTAwZTNvIHNlclx1MDBlM28gY29waWFkb3MuDQotQWN0aXZpdHlEcm9wQ29tbWFuZF9kZWVwQ29weV9wcm9tcHRDb25maWd1cmF0aW9uTXNnPURlc2VqYSBjb3BpYXIgdG9kb3Mgb3MgZGVzY3JpdG9yZXM/XG5cbkNsaWNhciBlbSBOXHUwMGUzbyBjb3BpYXJcdTAwZTEgc29tZW50ZSBvcyBkZXNjcml0b3JlcyBxdWUgZmF6ZW0gcGFydGUgZGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBhdHVhbC4NCi1kZWVwQ29weV9wcm9tcHRNc2c9Vm9jXHUwMGVhIHJlY2ViZXJcdTAwZTEgdW1hIGNcdTAwZjNwaWEgZGUgdG9kb3Mgb3MgZWxlbWVudG9zIHZpbmN1bGFkb3MgZGluYW1pY2FtZW50ZSBxdWUgcHJlY2lzYSBtYW50ZXIgc2VwYXJhZG9zIGRhcXVpIHBvciBkaWFudGUuIERlc2VqYSBjb250aW51YXI/DQotZGVlcENvcHlfdGl0bGU9Q1x1MDBmM3BpYSBQcm9mdW5kYQ0KLQ0KLSMgUHJvZ3Jlc3MgbWVzc2FnZXMNCi1jcmVhdGluZ1Byb2Nlc3NDb21wb25lbnRUYXNrX25hbWU9Q3JpYW5kbyBvIGNvbXBvbmVudGUgZGUgcHJvY2Vzc28gJyd7MH0nJy4uLg0KLXByb2Nlc3NpbmdSZWZlcmVuY2VzVGFza19uYW1lPVByb2Nlc3NhbmRvIHJlZmVyXHUwMGVhbmNpYXMuLi4NCi1kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lPUV4Y2x1aW5kbyBlbGVtZW50b3MgZSBhcnF1aXZvcyBhc3NvY2lhZG9zLi4uDQotY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lPVZlcmlmaWNhbmRvIHJlZmVyXHUwMGVhbmNpYXMuLi4NCi1yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU9UmVtb3ZlbmRvIHJlZmVyXHUwMGVhbmNpYXMuLi4NCi1zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lPVNhbHZhbmRvIGFycXVpdm9zIG1vZGlmaWNhZG9zLi4uDQotY2hlY2tBZmZlY3RlZFJlc291cmNlc1Rhc2tfbmFtZT1WZXJpZmljYW5kbyByZWN1cnNvcyBhZmV0YWRvcy4uLg0KLW1vdmluZ1Rhc2tfbmFtZT1Nb3ZlbmRvLi4uDQotbW92aW5nRmlsZXNUYXNrX25hbWU9TW92ZW5kbyBhcnF1aXZvcy4uLg0KLWNvcHlpbmdSZXNvdXJjZXNUYXNrX25hbWU9Q29waWFuZG8gcmVjdXJzb3MuLi4NCi1jb3B5aW5nQWN0aXZpdGllc19tc2c9Q29waWFuZG8gYXRpdmlkYWRlICcnezB9JycNCi1zYXZpbmdGaWxlVGFza19uYW1lPVNhbHZhbmRvIG8gYXJxdWl2byAnJ3swfScnLi4uDQotDQotIyBVSSBUZXh0DQotZWxlbWVudF90ZXh0PWVsZW1lbnRvDQotY3JlYXRlRWxlbWVudF90ZXh0PUNyaWFyIEVsZW1lbnRvDQotY3JlYXRlUHJvY2Vzc190ZXh0PUNyaWFyIFByb2Nlc3NvDQotY29udHJpYnV0ZXNUb190ZXh0PUNvbnRyaWJ1aSBwYXJhDQotbG9jYWxDb250cmlidXRlc1RvX3RleHQ9Q29udHJpYnVpIGxvY2FsbWVudGUgcGFyYQ0KLWV4dGVuZHNfdGV4dD1FeHRlbnNcdTAwZjVlcw0KLXJlcGxhY2VzX3RleHQ9U3Vic3RpdHVpDQotbG9jYWxSZXBsYWNlc190ZXh0PVN1YnN0aXR1aSBsb2NhbG1lbnRlDQotbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5X3RleHQ9U3Vic3RpdHVpXHUwMGU3XHUwMGUzbyBMb2NhbCBlIENcdTAwZjNwaWEgUHJvZnVuZGENCi1lbGVtZW50VHlwZV90ZXh0PXswfTp7MX0NCi1kZWxpdmVyYWJsZXNfdGV4dD1EaXN0cmlidVx1MDBlZHZlaXMNCi1jb250cmlidXRlVG9BY3Rpdml0eV90ZXh0PUNvbnRyaWJ1aXIgcGFyYSBBdGl2aWRhZGUNCi1BY3Rpdml0eURyb3BDb21tYW5kX2xhYmVsPUF0aXZpZGFkZSBkZSBRdWVkYQ0KLXJlcGxhY2VBY3Rpdml0eV90ZXh0PVN1YnN0aXR1aXIgQXRpdmlkYWRlDQotZmlsZV90ZXh0PWFycXVpdm8NCi1kaXJlY3RvcnlfdGV4dD1kaXJldFx1MDBmM3Jpbw0KLXVucmVzb2x2ZWRfdGV4dD0oJyd7MH0nJyBuXHUwMGUzbyByZXNvbHZpZG8pDQotYXNzaXN0c190ZXh0PUFzc2lzdGUNCi11bmtub3duX3RleHQ9RGVzY29uaGVjaWRvDQotY29tbWFuZF9kb25lPUNvbmNsdVx1MDBlZGRvDQotDQotIyBUaGUgZm9sbG93aW5nIFVJIHRleHQgc2hvdWxkIGJlIHJldmlld2VkLg0KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5d2l0aHBsdWdpbl9pbmZvPXswfSAoezF9ICcnezJ9JycgZW0gJyd7M30nJykNCi1VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eV9pbmZvPXswfSAoezF9ICcnezJ9JycpDQotdWlfcmVmX2RlbGV0ZT1PIGRlc2NyaXRvciAnJ3swfScnIHRlbSBhcyByZWZlclx1MDBlYW5jaWFzIGEgc2VndWlyLCBxdWUgblx1MDBlM28gc1x1MDBlM28gdXRpbGl6YWRhcyBlbSBuZW5odW0gbHVnYXIuXG5TZWxlY2lvbmUgYXF1ZWxhcyBxdWUgdm9jXHUwMGVhIGRlc2VqZSBleGNsdWlyOg0KLXVpX3JlZl9kZWxldGUyPUFzIHNlZ3VpbnRlcyByZWZlclx1MDBlYW5jaWFzIG5cdTAwZTNvIGVzdFx1MDBlM28gc2VuZG8gdXRpbGl6YWRhcyBlbSBuZW5odW0gbHVnYXIuXG5TZWxlY2lvbmUgYXF1ZWxhcyBxdWUgdm9jXHUwMGVhIGRlc2VqZSBleGNsdWlyOg0KLXVpX3JlZmVyZW5jZXM9UmVmZXJcdTAwZWFuY2lhcw0KLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249TyBkZXNjcml0b3IgZGUgcHJvZHV0byBkZSB0cmFiYWxobyAnJ3swfScnIGVzdFx1MDBlMSBhc3NvY2lhZG8gKFNhXHUwMGVkZGEgRGUpIGFvIGRlc2NyaXRvciBkZSB0YXJlZmEgJyd7MX0nJw0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vcHRpb25zPU9wY2lvbmFpcw0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbD1SZW1vdmVyIGRlc2NyaXRvciBkZSBwcm9kdXRvIGNvbSBzYVx1MDBlZGRhIGRvIGRlc2NyaXRvciBkZSB0YXJlZmENCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3JfZGVsZXRlX3Rhc2s9RXhjbHVpciBkZXNjcml0b3IgZGUgdGFyZWZhIGRhIGF0aXZpZGFkZQ0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2s9TyBlbGVtZW50byBzZWxlY2lvbmFkbyAnJ3swfScnIG5cdTAwZTNvIGVzdFx1MDBlMSBuYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHBhZHJcdTAwZTNvIGRvIHByb2Nlc3NvLlxuRGVzZWphIGluY2x1XHUwMGVkLWxvIGUgc3VhcyBkZXBlbmRcdTAwZWFuY2lhcyBuYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHBhZHJcdTAwZTNvPw0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9nZW5lcmljRXJyX21lc3NhZ2VfdGV4dD1PY29ycmVyYW0gZXJyb3MgbmEgb3BlcmFcdTAwZTdcdTAwZTNvLiBDbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4NCi1Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX25vRGVzY3JpcHRvclRvU3luY2g9Tlx1MDBlM28gZm9pIGxvY2FsaXphZG8gbmVuaHVtIGRlc2NyaXRvciBjb20gZWxlbWVudG8gZGUgbVx1MDBlOWRvY28gdmluY3VsYWRvIHBhcmEgc2luY3Jvbml6YXIuDQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfcmVmZXJzaGluZ3ZpZXdlcj1FcnJvIGFvIGF0dWFsaXphciBvIHZpc3VhbGl6YWRvcg0KLWNvbmZpcm1fcmVtb3ZlX3JlZmVyZW5jZXNfdGV4dD1EZXBvaXMgZGEgY29udmVyc1x1MDBlM28sIG8ocykgZWxlbWVudG8ocykgbGlzdGFkbyhzKSBlbSBEZXRhbGhlcyBwb2RlKG0pIHRlciByZWZlclx1MDBlYW5jaWFzIGlsZWdhaXMgZW0gcmVsYVx1MDBlN1x1MDBlM28gYSBlc3RhIG9yaWVudGFcdTAwZTdcdTAwZTNvLiBDbGlxdWUgZW0gT0sgcGFyYSByZW1vdlx1MDBlYS1sb3MgZSBjb250aW51YXIuDQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfdW5oYW5kbGVkX2V4Y2VwdGlvbj1FeGNlXHUwMGU3XHUwMGUzbyBuXHUwMGUzbyBtYW5pcHVsYWRhDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9icmVha2Rvd25fZWxlbWVudD1OXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCB0ZXIgbyBtZXNtbyBlbGVtZW50byBkZSBkaXZpc1x1MDBlM28gY29tbyBwcmVkZWNlc3NvciBlIHN1Y2Vzc29yDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dwbGlzdGRsZ19tc2c9TyBwcm9kdXRvIGRlIHRyYWJhbGhvICcnezB9JycgXHUwMGU5IHVtYSBzYVx1MDBlZGRhIHBhcmEgYXMgdGFyZWZhcyBhIHNlZ3Vpci5cblNlbGVjaW9uZSBhcyB0YXJlZmFzIHBhcmEgYXMgcXVhaXMgZGVzZWplIGNyaWFyIG9zIGRlc2NyaXRvcmVzIGNvcnJlc3BvbmRlbnRlcy4NCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfcm9sZWxpc3RkbGdfbXNnPUEgZnVuXHUwMGU3XHUwMGUzbyAnJ3swfScnIHBvc3N1aSBvcyBzZWd1aW50ZXMgcHJvZHV0b3MgZGUgdHJhYmFsaG8gcmVzcG9uc1x1MDBlMXZlaXMuXG5TZWxlY2lvbmUgb3MgcHJvZHV0b3MgZGUgdHJhYmFsaG8gcGFyYSBvcyBxdWFpcyBkZXNlamUgY3JpYXIgb3MgZGVzY3JpdG9yZXMgY29ycmVzcG9uZGVudGVzLg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyPUVycm8gZmF0YWwNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd29ya3Byb2R1Y3RzPVByb2R1dG9zIGRlIFRyYWJhbGhvDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9zdWJfZWxlbWVudD1JbXBvc3NcdTAwZWR2ZWwgdmluY3VsYXIgdW0gZWxlbWVudG8gZGUgZGl2aXNcdTAwZTNvIGEgdW0gZGUgc2V1cyBzdWJlbGVtZW50b3MNCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl93cm9uZ19lbGVtZW50PUltcG9zc1x1MDBlZHZlbCB2aW5jdWxhciBhIHVtIGVsZW1lbnRvIHF1ZSBuXHUwMGUzbyBzZWphIHVtIGVsZW1lbnRvIGRlIGRpdmlzXHUwMGUzbyBkZSB0cmFiYWxoby4NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9jaGlsZF9lbGVtZW50PUltcG9zc1x1MDBlZHZlbCB2aW5jdWxhciB1bSBlbGVtZW50byBkZSBkaXZpc1x1MDBlM28gYSB1bSBkZSBzZXVzIGZpbGhvcy4NCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfdGFza3M9VGFyZWZhcw0KLXVpX2Fzc29jaWF0aW9uX3Rhc2tfc2VsZWN0aW9uPVNlbGVcdTAwZTdcdTAwZTNvIGRlIFRhcmVmYXMuLi4NCi11dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlcj1cIFwgYWRhcHRhZG9yIGRvIGZpbGhvOiANCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zZXRwYXJlbnQ9Tlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgY29uZmlndXJhciBwYWkgcGFyYSBvIGZpbGhvDQotdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlPUltcG9zc1x1MDBlZHZlbCBlZGl0YXIgbyByZWN1cnNvLg0KLXV0aWxfUHJvY2Vzc1V0aWxfY29udHJpYnV0ZXN0bz1jb250cmlidWkgcGFyYSAnJ3swfScnDQotdXRpbF9Qcm9jZXNzVXRpbF9sb2NhbENvbnRyaWJ1dGVzdG89Y29udHJpYnVpIGxvY2FsbWVudGUgcGFyYSAnJ3swfScnDQotcHJvY2Vzc19leHRlbmRzPWVzdGVuZGUgJyd7MH0nJw0KLXByb2Nlc3NfcmVwbGFjZXM9c3Vic3RpdHVpICcnezB9JycNCi1wcm9jZXNzX2xvY2FsUmVwbGFjZXM9c3Vic3RpdHVpIGxvY2FsbWVudGUgJyd7MH0nJw0KLSMgRmlsdGVyIGNvbnN0YW50cyBleHRlcm5hbGl6ZWQgc3RyaW5ncy4NCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZXNfdGV4dD1EaXNjaXBsaW5hcw0KLUZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lZ3JvdXBpbmdzX3RleHQ9QWdydXBhbWVudG9zIGRlIERpc2NpcGxpbmFzDQotRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ9V2hpdGUgcGFwZXJzDQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xtZW50b3JzX3RleHQ9TWVudG9yZXMgZGUgRmVycmFtZW50YXMNCi1GaWx0ZXJDb25zdGFudHNfdG9vbHNfdGV4dD1GZXJyYW1lbnRhcw0KLUZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0PUZ1blx1MDBlN1x1MDBmNWVzDQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ9VGFyZWZhcw0KLUZpbHRlckNvbnN0YW50c19yZXVzYWJsZWFzc2V0c190ZXh0PVJlY3Vyc29zIFJldXRpbGl6XHUwMGUxdmVpcw0KLUZpbHRlckNvbnN0YW50c19hbGxfdGV4dD1Ub2Rvcw0KLUZpbHRlckNvbnN0YW50c19wcm9jZXNzZXNfdGV4dD1Qcm9jZXNzb3MNCi1GaWx0ZXJDb25zdGFudHNfcHJhY3RpY2VzX3RleHQ9UHJcdTAwZTF0aWNhcw0KLUZpbHRlckNvbnN0YW50c190ZW1wbGF0ZXNfdGV4dD1HYWJhcml0b3MNCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RzX3RleHQ9UHJvZHV0b3MgZGUgVHJhYmFsaG8NCi1GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0PUxpc3RhcyBkZSBWZXJpZmljYVx1MDBlN1x1MDBlM28NCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGVsaW5lc190ZXh0PURpcmV0cml6ZXMNCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNldHNfdGV4dD1Db25qdW50b3MgZGUgRnVuXHUwMGU3XHUwMGY1ZXMNCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dD1PcmllbnRhXHUwMGU3XHUwMGUzbw0KLUZpbHRlckNvbnN0YW50c19jb25jZXB0c190ZXh0PUNvbmNlaXRvcw0KLUZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0PUV4ZW1wbG9zDQotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRwYWNrYWdlc190ZXh0PVBhY290ZXMgZGUgQ29udGVcdTAwZmFkbw0KLUZpbHRlckNvbnN0YW50c19yb2xlZGVzY3JpcHRvcnNfdGV4dD1EZXNjcml0b3JlcyBkZSBGdW5cdTAwZTdcdTAwZTNvDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dD1BZ3J1cGFtZW50b3MgZGUgQ29uanVudG8gZGUgRnVuXHUwMGU3XHUwMGY1ZXMNCi1GaWx0ZXJDb25zdGFudHNfdGFza2Rlc2NyaXB0b3JzX3RleHQ9RGVzY3JpdG9yZXMgZGUgVGFyZWZhDQotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRlbGVtZW50c190ZXh0PUVsZW1lbnRvcyBkZSBDb250ZVx1MDBmYWRvDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9wcmVwYXJlPVByZXBhcmFuZG8gc2luY3Jvbml6YVx1MDBlN1x1MDBlM28uLi4NCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RkZXNjcmlwdG9yc190ZXh0PURlc2NyaXRvcmVzIGRlIFByb2R1dG8gZGUgVHJhYmFsaG8NCi1GaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ9VG9kb3Mgb3MgRWxlbWVudG9zIGRlIENvbnRlXHUwMGZhZG8NCi1GaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0PU1hdGVyaWFpcyBkZSBTdXBvcnRlDQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlcz1FcnJvIGFvIHNhbHZhciBhcnF1aXZvKHMpDQotRmlsdGVyQ29uc3RhbnRzX2N1c3RvbWNhdGVnb3JpZXNfdGV4dD1DYXRlZ29yaWFzIFBlcnNvbmFsaXphZGFzDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0dHlwZXNfdGV4dD1UaXBvcyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZz1FeGNsdXNcdTAwZTNvIGNvbmNsdVx1MDBlZGRhIGNvbSBhdmlzbw0KLUZpbHRlckNvbnN0YW50c19tZXRob2RwbHVnaW5zX3RleHQ9UGx1Zy1pbnMgZGUgTVx1MDBlOXRvZG8NCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfbG9ja2VkUGx1Z2luPUlVUEwwMTIwRTogTyBwbHVnaW4gJyd7MH0nJyBlc3RcdTAwZTEgYmxvcXVlYWRvLg0KLUZpbHRlckNvbnN0YW50c19kb21haW5zX3RleHQ9RG9tXHUwMGVkbmlvcw0KLUZpbHRlckNvbnN0YW50c19yb2FkbWFwX3RleHQ9TWFwYXMgZGUgUm90YXMNCi1GaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0PVJlbGF0XHUwMGYzcmlvcw0KLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9UyZpbmNyb25pemFcdTAwZTdcdTAwZTNvIFBhZHJcdTAwZTNvIGRvIENvbnRlXHUwMGZhZG8gZG8gTVx1MDBlOXRvZG8NCi1NYW51YWxTeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9U2luY3JvbmkmemFcdTAwZTdcdTAwZTNvIEN1c3RvbWl6YWRhLi4uDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWw9QSBzaW5jcm9uaXphXHUwMGU3XHUwMGUzbyBmb2kgY29uY2x1XHUwMGVkZGEgY29tIFx1MDBlYXhpdG8uDQotDQotIyBVc2VySW50ZXJhY3Rpb25IZWxwZXINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZT1Ob21lOg0KLQ0KLSMgTWV0aG9kQ3JlYXRlQ2hpbGRDb21tYW5kDQotbmV3RWxlbWVudF90ZXh0PU5vdm8gezB9DQotdXBkYXRlX291dG9mc3luY2hfdGl0bGU9Q29uZmxpdG8gZGUgYXR1YWxpemFcdTAwZTdcdTAwZTNvDQotdXBkYXRlX291dG9mc3luY2hfbXNnPU9zIGFycXVpdm9zIGZvcmFtIGFsdGVyYWRvcyBubyBzaXN0ZW1hIGRlIGFycXVpdm9zLiBEZXNlamEgc29icmVzY3JldmVyIGFzIGFsdGVyYVx1MDBlN1x1MDBmNWVzPw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZGEyYzUzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBHZW5lcmljIERpYWxvZyBUaXRsZXMNCi1tb3ZlRGlhbG9nX3RpdGxlPVx1NzlmYlx1NTJhOA0KLWRlbGV0ZURpYWxvZ190aXRsZT1cdTUyMjBcdTk2NjRcdTUxNDNcdTdkMjANCi1lcnJvckRpYWxvZ190aXRsZT1cdTk1MTlcdThiZWYNCi1lcnJvckRpYWxvZ19jYW5ub3RSZW5hbWU9XHU2NWUwXHU2Y2Q1XHU1YzA2IHswfVx1MjAxY3sxfVx1MjAxZFx1OTFjZFx1NTQ3ZFx1NTQwZFx1NGUzYVx1MjAxY3syfVx1MjAxZFx1MzAwMlx1OGJmN1x1ODllM1x1NTFiM1x1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1NGUyZFx1NjYzZVx1NzkzYVx1NzY4NFx1OTVlZVx1OTg5OFx1ZmYwY1x1NzEzNlx1NTQwZVx1NTM1NVx1NTFmYlx1MjAxY1x1Nzg2ZVx1NWI5YVx1MjAxZFx1N2VlN1x1N2VlZFx1ZmYwY1x1NjIxNlx1NTM1NVx1NTFmYlx1MjAxY1x1NTNkNlx1NmQ4OFx1MjAxZFx1NjUzZVx1NWYwM1x1NmI2NFx1NjRjZFx1NGY1Y1x1MzAwMg0KLQ0KLSMgQ29uZmlybSBSZWZlcmVuY2VzIFJlbW92YWwgRGlhbG9nDQotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190aXRsZT1cdTc4NmVcdThiYTRcdTk2NjRcdTUzYmJcdTVmMTVcdTc1MjgNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RleHQ9XHU2NWI5XHU2Y2Q1XHU1ZTkzXHU0ZTJkXHU3Njg0XHU1MTc2XHU0ZWQ2XHU1MTQzXHU3ZDIwXHU0ZWNkXHU3MTM2XHU1NzI4XHU1ZjE1XHU3NTI4XHU1YzA2XHU4OTgxXHU1MjIwXHU5NjY0XHU3Njg0XHU1MTQzXHU3ZDIwXHUzMDAyXHU1MjIwXHU5NjY0XHU4ZmQ5XHU0ZTliXHU1MTQzXHU3ZDIwXHU1YzA2XHU5NjY0XHU1M2JiXHU1YmY5XHU4ZmQ5XHU0ZTliXHU1MTQzXHU3ZDIwXHU3Njg0XHU1ZjE1XHU3NTI4XHVmZjBjXHU1NmUwXHU2YjY0XHU4YmU1XHU2NGNkXHU0ZjVjXHU4ZmQ4XHU1YzA2XHU2NmY0XHU2NWIwXHU1ZjE1XHU3NTI4XHU1MTQzXHU3ZDIwXHUzMDAyXHU1NzI4XHU1MzU1XHU1MWZiXHUyMDFjXHU3ODZlXHU1YjlhXHUyMDFkXHU0ZTRiXHU1MjRkXHVmZjBjXHU4YmY3XHU3ODZlXHU0ZmRkXHU2MGE4XHU2NzA5XHU2NzQzXHU2NmY0XHU2NWIwXHU1ZjE1XHU3NTI4XHU1MTQzXHU3ZDIwXHUzMDAyXHU1MzU1XHU1MWZiXHUyMDFjXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUyMDFkXHVmZjBjXHU1M2VmXHU2OGMwXHU2N2U1XHU1ZjE1XHU3NTI4XHU1Zjg1XHU1MjIwXHU5NjY0XHU1MTQzXHU3ZDIwXHU3Njg0XHU1MTQzXHU3ZDIwXHU1MjE3XHU4ODY4XHUzMDAyDQotDQotIyBSZXNvbHZlIE5hbWUgQ29uZmxpY3QgRGlhbG9nDQotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZT1cdTg5ZTNcdTUxYjNcdTUxNDNcdTdkMjBcdTU0MGRcdTc5ZjBcdTUxYjJcdTdhODENCi1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQ9XHU0ZTNhXHUyMDFjezF9XHUyMDFkXHU4ZjkzXHU1MTY1XHU2NWIwIHswfVx1ZmYxYQ0KLQ0KLSMgU2VsZWN0IERlbGl2ZXJhYmxlcyBEaWFsb2cNCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGl0bGU9XHU5MDA5XHU2MmU5XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2DQotc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RleHQ9XHU5MDA5XHU2MmU5XHU1ZTBjXHU2NzFiXHU1MjA2XHU5MTRkXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHUyMDFjezB9XHUyMDFkXHU3Njg0XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHUzMDAyDQotDQotIyBOZXcgUHJvY2VzcyBDb21wb25lbnQgRGlhbG9nDQotbmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZT1cdTY1YjBcdTVlZmFcdTZkNDFcdTdhMGJcdTdlYzRcdTRlZjYNCi1uYW1lTGFiZWxfdGV4dD1cdTU0MGRcdTc5ZjBcdWZmMWENCi1kZWZhdWx0Q29uZmlnTGFiZWxfdGV4dD1cdTdmM2FcdTc3MDFcdTkxNGRcdTdmNmVcdWZmMWENCi1iYXNlUHJvY2Vzc0xhYmVsX3RleHQ9XHU1N2ZhXHU2NzJjXHU2ZDQxXHU3YTBiXHVmZjFhDQotYmFzZWRPblByb2Nlc3Nlc0xhYmVsX3RleHQ9XHU1N2ZhXHU0ZThlXHU2ZDQxXHU3YTBiXHVmZjFhDQotDQotIyBSb2xlIEFzc29jaWF0aW9uIERpYWxvZw0KLXNlbGVjdEFzc29jaWF0aW9uTGFiZWxfdGV4dD1cdTkwMDlcdTYyZTlcdTRlZmJcdTUyYTFcdTIwMWN7MH1cdTIwMWRcdTc2ODRcdTUxNzNcdTgwNTQNCi0NCi0jIFJlbW92ZSBBc3NvY2lhdGlvbiBkaWFsb2cNCi1yZW1vdmVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PVx1OTY2NFx1NTNiYlx1NTE3M1x1ODA1NA0KLQ0KLSMgU2VsZWN0IFRlYW1zIERpYWxvZw0KLXNlbGVjdFRlYW1zRGlhbG9nX3RpdGxlPVx1OTAwOVx1NjJlOVx1NTZlMlx1OTYxZg0KLXNlbGVjdFRlYW1zRGlhbG9nX3RleHQ9XHU5MDA5XHU2MmU5XHU1ZTBjXHU2NzFiXHU1MjA2XHU5MTRkXHU4OWQyXHU4MjcyXHUyMDFjezB9XHUyMDFkXHU3Njg0XHU1NmUyXHU5NjFmXHUzMDAyDQotDQotIyBUYXNsIFNlbGVjdGlvbiBEaWFsb2cNCi10YXNrU2VsZWN0aW9uRGlhbG9nX3RpdGxlPVx1NGVmYlx1NTJhMVx1OTAwOVx1NjJlOQ0KLXRpdGxlTGFiZWxfdGV4dD1cdTkwMDlcdTYyZTlcdTRlZmJcdTUyYTEuLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAwRTogXHU3ZjNhXHU1YzExezB9XHU1NDBkXHU3OWYwXHUzMDAyXG5cblx1NjI0MFx1NjcwOVx1NjViOVx1NmNkNVx1NTQ4Y1x1NmQ0MVx1N2EwYlx1NTE0M1x1N2QyMFx1OTBmZFx1NWZjNVx1OTg3Ylx1NjcwOVx1NTQwZFx1NzlmMFx1MzAwMlxuXG5cdThiZjdcdThmOTNcdTUxNjVcdTY3MDlcdTY1NDhcdTU0MGRcdTc5ZjBcdWZmMGNcdTcxMzZcdTU0MGVcdTkxY2RcdThiZDVcdTMwMDINCi1lbXB0eUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1cdTU0MGRcdTc5ZjBcdTRlMGRcdTgwZmRcdTRlM2FcdTdhN2FcdTMwMDJcdThiZjdcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTU0MGRcdTc5ZjBcdTMwMDINCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMUU6IFx1NTQwZFx1NzlmMFx1MjAxY3swfVx1MjAxZFx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlxuXG5cdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTVmYzVcdTk4N2JcdTY3MDlcdTU1MmZcdTRlMDBcdTU0MGRcdTc5ZjBcdTMwMDJcblxuXHU4YmY3XHU4ZjkzXHU1MTY1XHU1M2U2XHU0ZTAwXHU0ZTJhXHU1NDBkXHU3OWYwXHVmZjBjXHU3MTM2XHU1NDBlXHU5MWNkXHU4YmQ1XHUzMDAyDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPVx1NzZmOFx1NTQwY1x1NTE0M1x1N2QyMFx1NTQwZFx1NzlmMFx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlx1OGJmN1x1NjMwN1x1NWI5YVx1NTNlNlx1NGUwMFx1NGUyYVx1NTQwZFx1NzlmMFx1MzAwMg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMV9tc2c9SVVQTDAxMDJFOiBcdTU0MGRcdTc5ZjBcdTIwMWN7MH1cdTIwMWRcdTY1ZTBcdTY1NDhcdTMwMDJcblxuXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3OWYwXHU0ZTBkXHU4MGZkXHU0ZWU1XHU3YTdhXHU2ODNjXHU1ZjAwXHU1OTM0XHUzMDAyXG5cblx1OGJmN1x1OGY5M1x1NTE2NVx1NjcwOVx1NjU0OFx1NTQwZFx1NzlmMFx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c9SVVQTDAxMDNFOiBcdTU0MGRcdTc5ZjBcdTIwMWN7MH1cdTIwMWRcdTY1ZTBcdTY1NDhcdTMwMDJcblxuXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3OWYwXHU0ZTBkXHU4MGZkXHU0ZWU1XHU1M2U1XHU3MGI5XHU3ZWQzXHU1YzNlXHUzMDAyXG5cblx1OGJmN1x1OGY5M1x1NTE2NVx1NjcwOVx1NjU0OFx1NTQwZFx1NzlmMFx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2c9SVVQTDAxMDRFOiBcdTU0MGRcdTc5ZjBcdTIwMWN7MH1cdTIwMWRcdTY1ZTBcdTY1NDhcdTMwMDJcblxuXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3OWYwXHU0ZTBkXHU4MGZkXHU1MzA1XHU1NDJiXHU0ZWU1XHU0ZTBiXHU1YjU3XHU3YjI2XHVmZjFhXFwgLyA6ICogPyAiIDwgPiA7IHxcblxuXHU4YmY3XHU4ZjkzXHU1MTY1XHU2NzA5XHU2NTQ4XHU1NDBkXHU3OWYwXHVmZjBjXHU3MTM2XHU1NDBlXHU5MWNkXHU4YmQ1XHUzMDAyDQotbm9Db25maWdFcnJvcl9tc2c9SVVQTDAxMDVFOiBcdTVmNTNcdTUyNGRcdTY1YjlcdTZjZDVcdTVlOTNcdTRlMGRcdTUzMDVcdTU0MmJcdTRlZmJcdTRmNTVcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDJcblxuXHU1ZmM1XHU5ODdiXHU2NzA5XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHVmZjBjXHU2MjRkXHU4MGZkXHU1MjFiXHU1ZWZhXHU2NWIwXHU2ZDQxXHU3YTBiXHUzMDAyXG5cblx1OGJmN1x1NTIxYlx1NWVmYVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLW5vRGVsaXZlcnlQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA2RTogXHU1ZjUzXHU1MjRkXHU2NWI5XHU2Y2Q1XHU1ZTkzXHU0ZTBkXHU1MzA1XHU1NDJiXHU0ZWZiXHU0ZjU1XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiXHUzMDAyXG5cblx1NWZjNVx1OTg3Ylx1NjcwOVx1NTdmYVx1NjcyY1x1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYlx1ZmYwY1x1NjI0ZFx1ODBmZFx1NTIxYlx1NWVmYVx1NjViMFx1NmQ0MVx1N2EwYlx1NjNkMFx1NGY5Ylx1MzAwMlxuXG5cdThiZjdcdTUyMWJcdTVlZmFcdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGJcdWZmMGNcdTcxMzZcdTU0MGVcdTkxY2RcdThiZDVcdTMwMDINCi1ub0RlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQTDAxMDdFOiBcdTY3MmFcdTkwMDlcdTYyZTlcdTRlZmJcdTRmNTVcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDJcblxuXHU1ZmM1XHU5ODdiXHU0ZTNhXHU2NWIwXHU2ZDQxXHU3YTBiXHU1MjA2XHU5MTRkXHU3ZjNhXHU3NzAxXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHUzMDAyXG5cblx1OGJmN1x1OTAwOVx1NjJlOVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLW5vQmFzZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDhFOiBcdTY3MmFcdTkwMDlcdTYyZTlcdTRlZmJcdTRmNTVcdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGJcdTMwMDJcblxuXHU2ZDQxXHU3YTBiXHU2M2QwXHU0ZjliXHU4OTgxXHU2YzQyXHU2NzA5XHU1N2ZhXHU2NzJjXHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiXHUzMDAyXG5cblx1OGJmN1x1OTAwOVx1NjJlOVx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYlx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLWNyZWF0ZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDlFOiBcdTY1ZTBcdTZjZDVcdTYyMTBcdTUyOWZcdTUyMWJcdTVlZmFcdTZkNDFcdTdhMGJcdTMwMDINCi1jcmVhdGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTEwRTogXHU2NWUwXHU2Y2Q1XHU2MjEwXHU1MjlmXHU1MjFiXHU1ZWZhXHU1MTQzXHU3ZDIwXHUzMDAyDQotZGVsZXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMUU6IFx1NjVlMFx1NmNkNVx1NjIxMFx1NTI5Zlx1NTIyMFx1OTY2NFx1NTE0M1x1N2QyMFx1MzAwMg0KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnPUlVUEwwMTEyRTogXHU2NWUwXHU2Y2Q1XHU1MjFiXHU1ZWZhXHU1MTQzXHU3ZDIwXHU3Njg0XHU1MTg1XHU1YmI5XHU2NTg3XHU0ZWY2XHUzMDAyXG5cblx1NjU4N1x1NGVmNlx1MjAxY3swfVx1MjAxZFx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlxuXG5cdThiZjdcdThmOTNcdTUxNjVcdTUzZTZcdTRlMDBcdTRlMmFcdTU0MGRcdTc5ZjBcdWZmMGNcdTcxMzZcdTU0MGVcdTkxY2RcdThiZDVcdTMwMDINCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c9XHU1MTc3XHU2NzA5XHU3NmY4XHU1NDBjXHU1NDBkXHU3OWYwXHU3Njg0XHU1MTg1XHU1YmI5XHU2NTg3XHU0ZWY2XHU1ZGYyXHU1YjU4XHU1NzI4XHUzMDAyXHU4YmY3XHU2MzA3XHU1YjlhXHU1M2U2XHU0ZTAwXHU0ZTJhXHU1NDBkXHU3OWYwXHUzMDAyDQotdW5kb0NvbW1hbmRFcnJvcl9tc2c9SVVQTDAxMTNFOiBcdTY0YTRcdTZkODhcdTU0N2RcdTRlZTRcdTIwMWN7MH1cdTIwMWRcdTY1ZTBcdTZjZDVcdTViOGNcdTYyMTBcdTMwMDJcblxuXHU1M2QxXHU3NTFmXHU5NTE5XHU4YmVmXHVmZjFhezF9DQotaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnPUlVUEwwMTE0RTogXHU2MzA3XHU1YjlhXHU3Njg0XHU1MTQ4XHU4ODRjXHU0ZjVjXHU0ZTFhXHU3ZDIyXHU1ZjE1XHU2NWUwXHU2NTQ4XHUzMDAyXG5cblx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYVx1N2QyMlx1NWYxNVx1NWZjNVx1OTg3Ylx1NjYyZlx1Njc2NVx1ODFlYVx1MjAxY1x1N2QyMlx1NWYxNVx1MjAxZFx1NTIxN1x1NzY4NFx1NjU3NFx1NjU3MFx1NTAzY1x1MzAwMlxuXG5cdThiZjdcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTUwM2NcdWZmMGNcdTcxMzZcdTU0MGVcdTkxY2RcdThiZDVcdTMwMDINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzPUlVUEwwMTAwVzpcdTIwMWN7MH1cdTIwMWRcdTVkZjJcdTRlMGVcdTIwMWN7MX1cdTIwMWRcdTUxNzNcdTgwNTRcdTMwMDJcdTUzZWFcdTUxNDFcdThiYjhcdTRlMDBcdTRlMmFcdTZiNjRcdTdjN2JcdTU3OGJcdTc2ODRcdTUxNzNcdTgwNTRcdTMwMDJcdTg5ODFcdTVjMDZcdTIwMWN7MH1cdTIwMWRcdTUyMDZcdTkxNGRcdTdlZDlcdTIwMWN7Mn1cdTIwMWRcdWZmMGNcdTk3MDBcdTg5ODFcdTk5OTZcdTUxNDhcdTVjMDZcdTViODNcdTRlY2VcdTIwMWN7MX1cdTIwMWRcdTk2NjRcdTUzYmJcdTMwMDINCi1lcnJvcl9tc2dXaXRoRGV0YWlscz1JVVBMMDExNkU6IFx1NTNkMVx1NzUxZlx1OTUxOVx1OGJlZlx1MzAwMlx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMg0KLWVycm9yX21zZz1JVVBMMDExN0U6IFx1NTNkMVx1NzUxZlx1OTUxOVx1OGJlZlx1MzAwMlx1OGJmN1x1NTNjMlx1OTYwNVx1OTUxOVx1OGJlZlx1NjVlNVx1NWZkN1x1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLVN1cHByZXNzaW9uX25hbWVEdXBsaWNhdGlvbj1JVVBMMDExOEU6IFx1NTcyOFx1NmI2NFx1NjRjZFx1NGY1Y1x1NTQwZVx1NWMwNlx1NTFmYVx1NzNiMFx1NTQwZFx1NzlmMFx1NTFiMlx1N2E4MVx1MzAwMlx1OGJmN1x1NjhjMFx1NjdlNVx1NTE0M1x1N2QyMFx1NTQwZFx1NzlmMFx1NjYyZlx1NTQyNlx1OTFjZFx1NTkwZFx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNQ0KLVN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbj1JVVBMMDExOUU6IFx1NTcyOFx1NmI2NFx1NjRjZFx1NGY1Y1x1NTQwZVx1NWMwNlx1NTFmYVx1NzNiMFx1NTQwZFx1NzlmMFx1NTFiMlx1N2E4MVx1MzAwMlx1OGJmN1x1NjhjMFx1NjdlNVx1NTE0M1x1N2QyMFx1NjYzZVx1NzkzYVx1NTQwZFx1NzlmMFx1NjYyZlx1NTQyNlx1OTFjZFx1NTkwZFx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNQ0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1cdTUzZDFcdTc1MWZcdTk1MTlcdThiZWZcdTMwMDJcdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTIwMWRcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdTRmZTFcdTYwNmZcdTMwMDINCi1zYXZlUHJvY2Vzc0Vycm9yX3JlYXNvbj1cdTRmZGRcdTViNThcdTZkNDFcdTdhMGJcdTIwMWN7MH1cdTIwMWRcdTY1ZjZcdTUzZDFcdTc1MWZcdTk1MTlcdThiZWZcdTMwMDJcdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTIwMWRcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdTRmZTFcdTYwNmZcdTMwMDINCi1kZWxldGVSZWZlcmVuY2VzRXJyb3JfcmVhc29uPVx1OTY2NFx1NTNiYlx1NGUwZVx1NmI2NFx1NTE0M1x1N2QyMFx1NTE3M1x1ODA1NFx1NzY4NFx1NWYxNVx1NzUyOFx1NjVmNlx1NTNkMVx1NzUxZlx1OTUxOVx1OGJlZlx1MzAwMlx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMg0KLXNhdmVGaWxlRXJyb3JfcmVhc29uPVx1NGZkZFx1NWI1OFx1NjU4N1x1NGVmNlx1MjAxY3swfVx1MjAxZFx1NjVmNlx1NTNkMVx1NzUxZlx1OTUxOVx1OGJlZlx1MzAwMlx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMg0KLWludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uPVx1NjhjMFx1NmQ0Ylx1NTIzMFx1NzUzMVx1NGU4ZVx1NGVhNFx1NTNjOVx1NjNkMlx1NGVmNlx1NTkwZFx1NTIzNlx1ODAwY1x1NWYxNVx1OGQ3N1x1NzY4NFx1NWUyNlx1NjcwOVx1NjVlMFx1NjU0OFx1NWYxNVx1NzUyOFx1NzY4NFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1MzAwMlxuXHU1YzA2XHU5NjY0XHU1M2JiXHU4ZmQ5XHU0ZTliXHU1ZjE1XHU3NTI4XHUzMDAyXHU4OTgxXHU3ZWU3XHU3ZWVkXHU1NDE3XHVmZjFmDQotdW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbj1cdTY1ZTBcdTZjZDVcdTRmZWVcdTY1MzlcdTY3MmFcdTg5ZTNcdTY3OTBcdTc2ODRcdTViZjlcdThjNjFcdWZmMWF7MH1cdWZmMDhVUkkgPSB7MX1cdWZmMDl7Mn0NCi0NCi0jIFdhcm5pbmcgbWVzc2FnZXMNCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMThXOiBcdTY1ZTBcdTZjZDVcdTYyN2VcdTUyMzBcdTRlMDBcdTRlMmFcdTYyMTZcdTU5MWFcdTRlMmFcdTZlOTBcdTUxNDNcdTdkMjBcdTMwMDJcdTVjMDZcdTRlMGRcdTU5MGRcdTUyMzZcdThkNDRcdTZlOTBcdTY1ODdcdTRlZjZcdTU5MzlcdTRlMmRcdTc2ODRcdTUxNzNcdTgwNTRcdTY1ODdcdTRlZjZcdTMwMDINCi1BY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE5VzogXHU2NWUwXHU2Y2Q1XHU2MjdlXHU1MjMwXHU0ZTAwXHU0ZTJhXHU2MjE2XHU1OTFhXHU0ZTJhXHU2ZTkwXHU1MTQzXHU3ZDIwXHUzMDAyXHU1YzA2XHU0ZTBkXHU1OTBkXHU1MjM2XHU1MTczXHU4MDU0XHU3Njg0XHU2ZDQxXHU3YTBiXHU1MzA1XHUzMDAyDQotQWN0aXZpdHlEcm9wQ29tbWFuZF9kZWVwQ29weV9wcm9tcHRDb25maWd1cmF0aW9uTXNnPVx1ODk4MVx1NTkwZFx1NTIzNlx1NjI0MFx1NjcwOVx1NzY4NFx1NjNjZlx1OGZmMFx1N2IyNlx1NTQxN1x1ZmYxZlxuXG5cdTU5ODJcdTY3OWNcdTUzNTVcdTUxZmJcdTIwMWNcdTU0MjZcdTIwMWRcdTVjMDZcdTUzZWFcdTU5MGRcdTUyMzZcdTRmNWNcdTRlM2FcdTVmNTNcdTUyNGRcdTkxNGRcdTdmNmVcdTRlMDBcdTkwZThcdTUyMDZcdTc2ODRcdTYzY2ZcdThmZjBcdTdiMjZcdTMwMDINCi1kZWVwQ29weV9wcm9tcHRNc2c9XHU2MGE4XHU1YzA2XHU4M2I3XHU1Zjk3XHU0ZWNlXHU3M2IwXHU1NzI4XHU4ZDc3XHU1YzA2XHU5NzAwXHU4OTgxXHU1MzU1XHU3MmVjXHU3ZWY0XHU2MmE0XHU3Njg0XHU2MjQwXHU2NzA5XHU1MmE4XHU2MDAxXHU5NGZlXHU2M2E1XHU1MTQzXHU3ZDIwXHU3Njg0XHU1MjZmXHU2NzJjXHUzMDAyXHU4OTgxXHU3ZWU3XHU3ZWVkXHU1NDE3XHVmZjFmDQotZGVlcENvcHlfdGl0bGU9XHU2ZGYxXHU1YzQyXHU1OTBkXHU1MjM2DQotDQotIyBQcm9ncmVzcyBtZXNzYWdlcw0KLWNyZWF0aW5nUHJvY2Vzc0NvbXBvbmVudFRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTUyMWJcdTVlZmFcdTZkNDFcdTdhMGJcdTdlYzRcdTRlZjZcdTIwMWN7MH1cdTIwMWQuLi4NCi1wcm9jZXNzaW5nUmVmZXJlbmNlc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTU5MDRcdTc0MDZcdTVmMTVcdTc1MjguLi4NCi1kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTIyMFx1OTY2NFx1NTE0M1x1N2QyMFx1NTQ4Y1x1NTE3M1x1ODA1NFx1NzY4NFx1NjU4N1x1NGVmNi4uLg0KLWNoZWNraW5nUmVmZXJlbmNlc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTY4YzBcdTY3ZTVcdTVmMTVcdTc1MjguLi4NCi1yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU9XHU2YjYzXHU1NzI4XHU5NjY0XHU1M2JiXHU1ZjE1XHU3NTI4Li4uDQotc2F2aW5nTW9kaWZpZWRGaWxlc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTRmZGRcdTViNThcdTRmZWVcdTY1MzlcdTc2ODRcdTY1ODdcdTRlZjYuLi4NCi1jaGVja0FmZmVjdGVkUmVzb3VyY2VzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NjhjMFx1NjdlNVx1NTNkN1x1NWY3MVx1NTRjZFx1NzY4NFx1OGQ0NFx1NmU5MC4uLg0KLW1vdmluZ1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTc5ZmJcdTUyYTguLi4NCi1tb3ZpbmdGaWxlc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTc5ZmJcdTUyYThcdTY1ODdcdTRlZjYuLi4NCi1jb3B5aW5nUmVzb3VyY2VzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTkwZFx1NTIzNlx1OGQ0NFx1NmU5MC4uLg0KLWNvcHlpbmdBY3Rpdml0aWVzX21zZz1cdTZiNjNcdTU3MjhcdTU5MGRcdTUyMzZcdTZkM2JcdTUyYThcdTIwMWN7MH1cdTIwMWQNCi1zYXZpbmdGaWxlVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NGZkZFx1NWI1OFx1NjU4N1x1NGVmNlx1MjAxY3swfVx1MjAxZC4uLg0KLQ0KLSMgVUkgVGV4dA0KLWVsZW1lbnRfdGV4dD1cdTUxNDNcdTdkMjANCi1jcmVhdGVFbGVtZW50X3RleHQ9XHU1MjFiXHU1ZWZhXHU1MTQzXHU3ZDIwDQotY3JlYXRlUHJvY2Vzc190ZXh0PVx1NTIxYlx1NWVmYVx1NmQ0MVx1N2EwYg0KLWNvbnRyaWJ1dGVzVG9fdGV4dD1cdTYzZDBcdTRmOWJcdTUyMzANCi1sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dD1cdTRlY2VcdTY3MmNcdTU3MzBcdTYzZDBcdTRmOWJcdTUyMzANCi1leHRlbmRzX3RleHQ9XHU2MjY5XHU1YzU1DQotcmVwbGFjZXNfdGV4dD1cdTY2ZmZcdTYzNjINCi1sb2NhbFJlcGxhY2VzX3RleHQ9XHU2NzJjXHU1NzMwXHU2NmZmXHU2MzYyDQotbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5X3RleHQ9XHU2NzJjXHU1NzMwXHU2NmZmXHU2MzYyXHU1NDhjXHU2ZGYxXHU1YzQyXHU1OTBkXHU1MjM2DQotZWxlbWVudFR5cGVfdGV4dD17MH1cdWZmMWF7MX0NCi1kZWxpdmVyYWJsZXNfdGV4dD1cdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjYNCi1jb250cmlidXRlVG9BY3Rpdml0eV90ZXh0PVx1NjNkMFx1NGY5Ylx1NTIzMFx1NmQzYlx1NTJhOA0KLUFjdGl2aXR5RHJvcENvbW1hbmRfbGFiZWw9XHU1ZTlmXHU1ZjAzXHU2ZDNiXHU1MmE4DQotcmVwbGFjZUFjdGl2aXR5X3RleHQ9XHU2NmZmXHU2MzYyXHU2ZDNiXHU1MmE4DQotZmlsZV90ZXh0PVx1NjU4N1x1NGVmNg0KLWRpcmVjdG9yeV90ZXh0PVx1NzZlZVx1NWY1NQ0KLXVucmVzb2x2ZWRfdGV4dD1cdWZmMDhcdTY3MmFcdTg5ZTNcdTY3OTBcdTc2ODRcdTIwMWN7MH1cdTIwMWRcdWZmMDkNCi1hc3Npc3RzX3RleHQ9XHU4Zjg1XHU1MmE5DQotdW5rbm93bl90ZXh0PVx1NjcyYVx1NzdlNQ0KLWNvbW1hbmRfZG9uZT1cdTViOGNcdTYyMTANCi0NCi0jIFRoZSBmb2xsb3dpbmcgVUkgdGV4dCBzaG91bGQgYmUgcmV2aWV3ZWQuDQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHl3aXRocGx1Z2luX2luZm89ezB9XHVmZjA4XHUyMDFjezN9XHUyMDFkXHU0ZTJkXHU3Njg0IHsxfVx1MjAxY3syfVx1MjAxZFx1ZmYwOQ0KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5X2luZm89ezB9XHVmZjA4ezF9XHUyMDFjezJ9XHUyMDFkXHVmZjA5DQotdWlfcmVmX2RlbGV0ZT1cdTYzY2ZcdThmZjBcdTdiMjZcdTIwMWN7MH1cdTIwMWRcdTY3MDlcdTRlZTVcdTRlMGJcdTY3MmFcdTU3MjhcdTRlZmJcdTRmNTVcdTRmNGRcdTdmNmVcdTRmN2ZcdTc1MjhcdTc2ODRcdTVmMTVcdTc1MjhcdTMwMDJcblx1OGJmN1x1OTAwOVx1NjJlOVx1NWUwY1x1NjcxYlx1NTIyMFx1OTY2NFx1NzY4NFx1NWYxNVx1NzUyOFx1ZmYxYQ0KLXVpX3JlZl9kZWxldGUyPVx1NjVlMFx1NGVmYlx1NGY1NVx1NTczMFx1NjViOVx1NTcyOFx1NGY3Zlx1NzUyOFx1NGVlNVx1NGUwYlx1OGZkOVx1NGU5Ylx1NWYxNVx1NzUyOFx1MzAwMlxuXHU4YmY3XHU5MDA5XHU2MmU5XHU1ZTBjXHU2NzFiXHU1MjIwXHU5NjY0XHU3Njg0XHU1ZjE1XHU3NTI4XHVmZjFhDQotdWlfcmVmZXJlbmNlcz1cdTVmMTVcdTc1MjgNCi11aV93b3JrcHJvZHVjdF9kZXNjcmlwdG9yX2Rlc2NyaXB0aW9uPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NjNjZlx1OGZmMFx1N2IyNlx1MjAxY3swfVx1MjAxZFx1NGUwZVx1NGVmYlx1NTJhMVx1NjNjZlx1OGZmMFx1N2IyNlx1MjAxY3sxfVx1MjAxZFx1NTE3M1x1ODA1NFx1ZmYwOFx1OGY5M1x1NTFmYVx1ODFlYVx1ZmYwOQ0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vcHRpb25zPVx1OTAwOVx1OTg3OQ0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbD1cdTRmNWNcdTRlM2FcdTRlZmJcdTUyYTFcdTYzY2ZcdThmZjBcdTdiMjZcdTc2ODRcdThmOTNcdTUxZmFcdTk2NjRcdTUzYmJcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTYzY2ZcdThmZjBcdTdiMjYNCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3JfZGVsZXRlX3Rhc2s9XHU0ZWNlXHU2ZDNiXHU1MmE4XHU1MjIwXHU5NjY0XHU0ZWZiXHU1MmExXHU2M2NmXHU4ZmYwXHU3YjI2DQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2RlZmF1bHRjb25maWdjaGVjaz1cdTkwMDlcdTViOWFcdTc2ODRcdTUxNDNcdTdkMjBcdTIwMWN7MH1cdTIwMWRcdTRlMGRcdTU3MjhcdTZkNDFcdTdhMGJcdTc2ODRcdTdmM2FcdTc3MDFcdTkxNGRcdTdmNmVcdTRlMmRcdTMwMDJcblx1NjYyZlx1NTQyNlx1ODk4MVx1NWMwNlx1OGJlNVx1NTE0M1x1N2QyMFx1NTNjYVx1NTE3Nlx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYlx1NmRmYlx1NTJhMFx1NTIzMFx1N2YzYVx1NzcwMVx1OTE0ZFx1N2Y2ZVx1ZmYxZg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9nZW5lcmljRXJyX21lc3NhZ2VfdGV4dD1cdTY0Y2RcdTRmNWNcdTRlMmRcdTUzZDFcdTc1MWZcdTk1MTlcdThiZWZcdTMwMDJcdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTIwMWRcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdTRmZTFcdTYwNmYNCi1Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX25vRGVzY3JpcHRvclRvU3luY2g9XHU2NWUwXHU0ZWZiXHU0ZjU1XHU2M2NmXHU4ZmYwXHU3YjI2XHU1MzA1XHU1NDJiXHU4OTgxXHU1NDBjXHU2YjY1XHU3Njg0XHU5NGZlXHU2M2E1XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwDQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfcmVmZXJzaGluZ3ZpZXdlcj1cdTUyMzdcdTY1YjBcdTY3ZTVcdTc3MGJcdTU2NjhcdTY1ZjZcdTUzZDFcdTc1MWZcdTk1MTlcdThiZWYNCi1jb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQ9XHU4ZjZjXHU2MzYyXHU1NDBlXHVmZjBjXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU0ZTJkXHU2MjQwXHU1MjE3XHU3Njg0XHU1MTQzXHU3ZDIwXHU1M2VmXHU4MGZkXHU2NzA5XHU1YmY5XHU2YjY0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHU3Njg0XHU5NzVlXHU2Y2Q1XHU1ZjE1XHU3NTI4XHUzMDAyXHU1MzU1XHU1MWZiXHUyMDFjXHU3ODZlXHU1YjlhXHUyMDFkXHU5NjY0XHU1M2JiXHU4ZmQ5XHU0ZTliXHU1ZjE1XHU3NTI4XHU1ZTc2XHU3ZWU3XHU3ZWVkXHUzMDAyDQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfdW5oYW5kbGVkX2V4Y2VwdGlvbj1cdTY3MmFcdTU5MDRcdTc0MDZcdTc2ODRcdTVmMDJcdTVlMzgNCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX2JyZWFrZG93bl9lbGVtZW50PVx1NGUwZFx1ODBmZFx1NWMwNlx1NTQwY1x1NGUwMFx1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1NTQwY1x1NjVmNlx1NGY1Y1x1NGUzYVx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYVx1NTQ4Y1x1NTQwZVx1N2VlZFx1NGY1Y1x1NGUxYQ0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93cGxpc3RkbGdfbXNnPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1MjAxY3swfVx1MjAxZFx1NjYyZlx1NGVlNVx1NGUwYlx1NGVmYlx1NTJhMVx1NzY4NFx1OGY5M1x1NTFmYVx1MzAwMlxuXHU4YmY3XHU5MDA5XHU2MmU5XHU1ZTBjXHU2NzFiXHU1MjFiXHU1ZWZhXHU3NmY4XHU1ZTk0XHU2M2NmXHU4ZmYwXHU3YjI2XHU3Njg0XHU0ZWZiXHU1MmExXHUzMDAyDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZz1cdTg5ZDJcdTgyNzJcdTIwMWN7MH1cdTIwMWRcdThkMWZcdThkMjNcdTRlZTVcdTRlMGJcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTMwMDJcblx1OGJmN1x1OTAwOVx1NjJlOVx1NWUwY1x1NjcxYlx1NTIxYlx1NWVmYVx1NzZmOFx1NWU5NFx1NjNjZlx1OGZmMFx1N2IyNlx1NzY4NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1MzAwMg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyPVx1ODFmNFx1NTQ3ZFx1OTUxOVx1OGJlZg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93b3JrcHJvZHVjdHM9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9zdWJfZWxlbWVudD1cdTY1ZTBcdTZjZDVcdTVjMDZcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTk0ZmVcdTYzYTVcdTUyMzBcdTViODNcdTc2ODRcdTRlMDBcdTRlMmFcdTViNTBcdTUxNDNcdTdkMjANCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl93cm9uZ19lbGVtZW50PVx1NjVlMFx1NmNkNVx1OTRmZVx1NjNhNVx1NTIzMFx1OTY2NFx1NWRlNVx1NGY1Y1x1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1NGU0Ylx1NTkxNlx1NzY4NFx1NTE0M1x1N2QyMFx1MzAwMg0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ9XHU2NWUwXHU2Y2Q1XHU1YzA2XHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwXHU5NGZlXHU2M2E1XHU1MjMwXHU1YjgzXHU3Njg0XHU0ZTAwXHU0ZTJhXHU1YjUwXHU1MTQzXHU3ZDIwXHUzMDAyDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3Rhc2tzPVx1NGVmYlx1NTJhMQ0KLXVpX2Fzc29jaWF0aW9uX3Rhc2tfc2VsZWN0aW9uPVx1NGVmYlx1NTJhMVx1OTAwOVx1NjJlOS4uLg0KLXV0aWxfUHJvY2Vzc1V0aWxfY2hpbGRhZGFwdGVyPVwgXCBcdTViNTBcdTRlZTNcdTc2ODRcdTkwMDJcdTkxNGRcdTU2NjhcdWZmMWENCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zZXRwYXJlbnQ9XHU2NWUwXHU2Y2Q1XHU4YmJlXHU3ZjZlXHU1YjUwXHU0ZWUzXHU3Njg0XHU3MjM2XHU0ZWUzDQotdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlPVx1NjVlMFx1NmNkNVx1N2YxNlx1OGY5MVx1OGQ0NFx1NmU5MFx1MzAwMg0KLXV0aWxfUHJvY2Vzc1V0aWxfY29udHJpYnV0ZXN0bz1cdTYzZDBcdTRmOWJcdTUyMzBcdTIwMWN7MH1cdTIwMWQNCi11dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bz1cdTY3MmNcdTU3MzBcdTYzZDBcdTRmOWJcdTUyMzBcdTIwMWN7MH1cdTIwMWQNCi1wcm9jZXNzX2V4dGVuZHM9XHU2MjY5XHU1YzU1XHUyMDFjezB9XHUyMDFkDQotcHJvY2Vzc19yZXBsYWNlcz1cdTY2ZmZcdTYzNjJcdTIwMWN7MH1cdTIwMWQNCi1wcm9jZXNzX2xvY2FsUmVwbGFjZXM9XHU2NzJjXHU1NzMwXHU2NmZmXHU2MzYyXHUyMDFjezB9XHUyMDFkDQotIyBGaWx0ZXIgY29uc3RhbnRzIGV4dGVybmFsaXplZCBzdHJpbmdzLg0KLUZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lc190ZXh0PVx1ODljNFx1N2EwYg0KLUZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lZ3JvdXBpbmdzX3RleHQ9XHU4OWM0XHU3YTBiXHU1MjA2XHU3ZWM0DQotRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ9XHU3NjdkXHU3NmFlXHU0ZTY2DQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xtZW50b3JzX3RleHQ9XHU1ZGU1XHU1MTc3XHU1NDExXHU1YmZjDQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ9XHU1ZGU1XHU1MTc3DQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzX3RleHQ9XHU4OWQyXHU4MjcyDQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ9XHU0ZWZiXHU1MmExDQotRmlsdGVyQ29uc3RhbnRzX3JldXNhYmxlYXNzZXRzX3RleHQ9XHU1M2VmXHU5MWNkXHU3NTI4XHU4ZDQ0XHU0ZWE3DQotRmlsdGVyQ29uc3RhbnRzX2FsbF90ZXh0PVx1NTE2OFx1OTBlOA0KLUZpbHRlckNvbnN0YW50c19wcm9jZXNzZXNfdGV4dD1cdTZkNDFcdTdhMGINCi1GaWx0ZXJDb25zdGFudHNfcHJhY3RpY2VzX3RleHQ9XHU1YjllXHU4ZGY1DQotRmlsdGVyQ29uc3RhbnRzX3RlbXBsYXRlc190ZXh0PVx1NmEyMVx1Njc3Zg0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHNfdGV4dD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzENCi1GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0PVx1NjgzOFx1NWJmOVx1ODg2OA0KLUZpbHRlckNvbnN0YW50c19ndWlkZWxpbmVzX3RleHQ9XHU2MzA3XHU1MzU3DQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRzX3RleHQ9XHU4OWQyXHU4MjcyXHU5NmM2DQotRmlsdGVyQ29uc3RhbnRzX2d1aWRhbmNlX3RleHQ9XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmDQotRmlsdGVyQ29uc3RhbnRzX2NvbmNlcHRzX3RleHQ9XHU2OTgyXHU1ZmY1DQotRmlsdGVyQ29uc3RhbnRzX2V4YW1wbGVzX3RleHQ9XHU3OTNhXHU0ZjhiDQotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRwYWNrYWdlc190ZXh0PVx1NTE4NVx1NWJiOVx1NTMwNQ0KLUZpbHRlckNvbnN0YW50c19yb2xlZGVzY3JpcHRvcnNfdGV4dD1cdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTdiMjYNCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNldGdyb3B1aW5nc190ZXh0PVx1ODlkMlx1ODI3Mlx1OTZjNlx1NTIwNlx1N2VjNA0KLUZpbHRlckNvbnN0YW50c190YXNrZGVzY3JpcHRvcnNfdGV4dD1cdTRlZmJcdTUyYTFcdTYzY2ZcdThmZjBcdTdiMjYNCi1GaWx0ZXJDb25zdGFudHNfY29udGVudGVsZW1lbnRzX3RleHQ9XHU1MTg1XHU1YmI5XHU1MTQzXHU3ZDIwDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9wcmVwYXJlPVx1NmI2M1x1NTcyOFx1NTFjNlx1NTkwN1x1NTQwY1x1NmI2NS4uLg0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdGRlc2NyaXB0b3JzX3RleHQ9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU2M2NmXHU4ZmYwXHU3YjI2DQotRmlsdGVyQ29uc3RhbnRzX2FsbGNvbnRlbnRlbGVtZW50c190ZXh0PVx1NjI0MFx1NjcwOVx1NTE4NVx1NWJiOVx1NTE0M1x1N2QyMA0KLUZpbHRlckNvbnN0YW50c19zdXBwb3J0aW5nbWF0ZXJpYWxzX3RleHQ9XHU2NTJmXHU2MzAxXHU2NzUwXHU2NTk5DQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlcz1cdTRmZGRcdTViNThcdTY1ODdcdTRlZjZcdTUxZmFcdTk1MTkNCi1GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0PVx1NWI5YVx1NTIzNlx1N2M3Ylx1NTIyYg0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHR5cGVzX3RleHQ9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiDQotRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZz1cdTUyMjBcdTk2NjRcdTViOGNcdTYyMTBcdWZmMGNcdTRmNDZcdTVlMjZcdTY3MDlcdThiNjZcdTU0NGFcdTMwMDINCi1GaWx0ZXJDb25zdGFudHNfbWV0aG9kcGx1Z2luc190ZXh0PVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9sb2NrZWRQbHVnaW49SVVQTDAxMjBFOiBcdTYzZDJcdTRlZjZcdTIwMWN7MH1cdTIwMWRcdTVkZjJcdTk1MDFcdTViOWFcdTMwMDINCi1GaWx0ZXJDb25zdGFudHNfZG9tYWluc190ZXh0PVx1NTdkZg0KLUZpbHRlckNvbnN0YW50c19yb2FkbWFwX3RleHQ9XHU4ZGVmXHU3ZWJmXHU1NmZlDQotRmlsdGVyQ29uc3RhbnRzX3JlcG9ydHNfdGV4dD1cdTYyYTVcdTU0NGENCi1BdXRvU3luY2hyb25pemVDb21tYW5kX2xhYmVsPVx1NGVjZVx1NjViOVx1NmNkNVx1NTE4NVx1NWJiOVx1N2YzYVx1NzcwMVx1NTQwY1x1NmI2NSgmWSkNCi1NYW51YWxTeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9XHU1YjlhXHU1MjM2XHU1NDBjXHU2YjY1KCZaKS4uLg0KLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfc3VjZXNzZnVsPVx1NTQwY1x1NmI2NVx1NWRmMlx1NjIxMFx1NTI5Zlx1NWI4Y1x1NjIxMFx1MzAwMg0KLQ0KLSMgVXNlckludGVyYWN0aW9uSGVscGVyDQotVXNlckludGVyYWN0aW9uSGVscGVyX1Byb2Nlc3NQYWNrYWdlX05hbWU9XHU1NDBkXHU3OWYwXHVmZjFhDQotDQotIyBNZXRob2RDcmVhdGVDaGlsZENvbW1hbmQNCi1uZXdFbGVtZW50X3RleHQ9XHU2NWIwXHU1ZWZhIHswfQ0KLXVwZGF0ZV9vdXRvZnN5bmNoX3RpdGxlPVx1NjZmNFx1NjViMFx1NTFiMlx1N2E4MQ0KLXVwZGF0ZV9vdXRvZnN5bmNoX21zZz1cdTVkZjJcdTU3MjhcdTY1ODdcdTRlZjZcdTdjZmJcdTdlZGZcdTRlMGFcdTY2ZjRcdTY1MzlcdTRlODZcdTY1ODdcdTRlZjZcdTMwMDJcdTg5ODFcdTg5ODZcdTc2ZDZcdTY2ZjRcdTY1MzlcdTU0MTdcdWZmMWYNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDkwODMxZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgR2VuZXJpYyBEaWFsb2cgVGl0bGVzDQotbW92ZURpYWxvZ190aXRsZT1cdTc5ZmJcdTUyZDUNCi1kZWxldGVEaWFsb2dfdGl0bGU9XHU1MjJhXHU5NjY0XHU1MTQzXHU3ZDIwDQotZXJyb3JEaWFsb2dfdGl0bGU9XHU5MzJmXHU4YWE0DQotZXJyb3JEaWFsb2dfY2Fubm90UmVuYW1lPXswfSAnJ3sxfScnIFx1NzEyMVx1NmNkNVx1OTFjZFx1NjViMFx1NTQ3ZFx1NTQwZFx1NzBiYSAnJ3syfScnXHUzMDAyXHU4YWNiXHU4OWUzXHU2YzdhXHUzMDBjXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHUzMDBkXHU0ZTJkXHU5ODZmXHU3OTNhXHU3Njg0XHU1NTRmXHU5ODRjXHVmZjBjXHU1MThkXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU3OGJhXHU1YjlhXHUzMDBkXHU3ZTdjXHU3ZThjXHVmZjBjXHU2MjE2XHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU1M2Q2XHU2ZDg4XHUzMDBkXHU0ZTJkXHU2YjYyXHU5MDE5XHU5ODA1XHU0ZjVjXHU2OTZkXHUzMDAyDQotDQotIyBDb25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbCBEaWFsb2cNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlPVx1NzhiYVx1OGE4ZFx1NTNjM1x1NzE2N1x1NzlmYlx1OTY2NA0KLWRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGV4dD1cdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTRlMmRcdTY3MDlcdTUxNzZcdTRlZDZcdTUxNDNcdTdkMjBcdTRlY2RcdTU3MjhcdTUzYzNcdTcxNjdcdTYwYThcdTVjMDdcdTg5ODFcdTUyMmFcdTk2NjRcdTc2ODRcdTUxNDNcdTdkMjBcdTMwMDJcdTUyMmFcdTk2NjRcdTkwMTlcdTRlOWJcdTUxNDNcdTdkMjBcdTVjMDdcdTc5ZmJcdTk2NjRcdTUzYzNcdTcxNjdcdWZmMGNcdTU2ZTBcdTZiNjRcdWZmMGNcdTRlNWZcdTVjMDdcdTY2ZjRcdTY1YjBcdTkwMTlcdTRlOWJcdTUzYzNcdTcxNjdcdTUxNDNcdTdkMjBcdTMwMDJcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTc4YmFcdTViOWFcdTMwMGRcdTRlNGJcdTUyNGRcdWZmMGNcdThhY2JcdTc4YmFcdTViOWFcdTYwYThcdTY3MDlcdTZiMGFcdTk2NTBcdTY2ZjRcdTY1YjBcdTkwMTlcdTRlOWJcdTUzYzNcdTcxNjdcdTUxNDNcdTdkMjBcdTMwMDJcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMGRcdWZmMGNcdTg5MDdcdTY3ZTVcdTUxNDNcdTdkMjBcdTZlMDVcdTU1YWVcdWZmMGNcdTkwMTlcdTRlOWJcdTUxNDNcdTdkMjBcdTUzYzNcdTcxNjdcdTYwYThcdTVjMDdcdTg5ODFcdTUyMmFcdTk2NjRcdTc2ODRcdTUxNDNcdTdkMjBcdTMwMDINCi0NCi0jIFJlc29sdmUgTmFtZSBDb25mbGljdCBEaWFsb2cNCi1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlPVx1ODllM1x1NmM3YVx1NTE0M1x1N2QyMFx1NTQwZFx1N2EzMVx1ODg1ZFx1N2E4MQ0KLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGV4dD1cdTcwYmEgJyd7MX0nJyBcdThmMzhcdTUxNjVcdTY1YjBcdTc2ODQgezB9XHVmZjFhDQotDQotIyBTZWxlY3QgRGVsaXZlcmFibGVzIERpYWxvZw0KLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190aXRsZT1cdTkwNzhcdTUzZDZcdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWUNCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGV4dD1cdTkwNzhcdTUzZDZcdTYwYThcdTg5ODFcdTYzMDdcdTViOWFcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMgJyd7MH0nJyBcdTc2ODRcdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWVcdTMwMDINCi0NCi0jIE5ldyBQcm9jZXNzIENvbXBvbmVudCBEaWFsb2cNCi1uZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nX3RpdGxlPVx1NjViMFx1NWVmYVx1N2EwYlx1NWU4Zlx1NTE0M1x1NGVmNg0KLW5hbWVMYWJlbF90ZXh0PVx1NTQwZFx1N2EzMVx1ZmYxYQ0KLWRlZmF1bHRDb25maWdMYWJlbF90ZXh0PVx1OTgxMFx1OGEyZFx1OTE0ZFx1N2Y2ZVx1ZmYxYQ0KLWJhc2VQcm9jZXNzTGFiZWxfdGV4dD1cdTU3ZmFcdTY3MmNcdTdhMGJcdTVlOGZcdWZmMWENCi1iYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dD1cdTU3ZmFcdTY1YmNcdTdhMGJcdTVlOGZcdWZmMWENCi0NCi0jIFJvbGUgQXNzb2NpYXRpb24gRGlhbG9nDQotc2VsZWN0QXNzb2NpYXRpb25MYWJlbF90ZXh0PVx1OTA3OFx1NTNkNlx1NGY1Y1x1Njk2ZCAnJ3swfScnIFx1NzY4NFx1OTVkY1x1ODA2Zg0KLQ0KLSMgUmVtb3ZlIEFzc29jaWF0aW9uIGRpYWxvZw0KLXJlbW92ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ9XHU3OWZiXHU5NjY0XHU5NWRjXHU4MDZmDQotDQotIyBTZWxlY3QgVGVhbXMgRGlhbG9nDQotc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGU9XHU5MDc4XHU1M2Q2XHU1NzE4XHU5NjhhDQotc2VsZWN0VGVhbXNEaWFsb2dfdGV4dD1cdTkwNzhcdTUzZDZcdTYwYThcdTg5ODFcdTYzMDdcdTViOWFcdTg5ZDJcdTgyNzIgJyd7MH0nJyBcdTc2ODRcdTU3MThcdTk2OGFcdTMwMDINCi0NCi0jIFRhc2wgU2VsZWN0aW9uIERpYWxvZw0KLXRhc2tTZWxlY3Rpb25EaWFsb2dfdGl0bGU9XHU0ZjVjXHU2OTZkXHU5MDc4XHU2NGM3DQotdGl0bGVMYWJlbF90ZXh0PVx1OTA3OFx1NTNkNlx1NGY1Y1x1Njk2ZFx1MzAwMg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAwRTogXHU5MDdhXHU2ZjBmezB9XHU1NDBkXHU3YTMxXHUzMDAyXG5cblx1NjI0MFx1NjcwOVx1NjViOVx1NmNkNVx1NTQ4Y1x1N2EwYlx1NWU4Zlx1NTE0M1x1N2QyMFx1OTBmZFx1NWZjNVx1OTgwOFx1NjcwOVx1NTQwZFx1N2EzMVx1MzAwMlxuXG5cdThhY2JcdThmMzhcdTUxNjVcdTY3MDlcdTY1NDhcdTc2ODRcdTU0MGRcdTdhMzFcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi1lbXB0eUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1cdTU0MGRcdTdhMzFcdTRlMGRcdTgwZmRcdTdhN2FcdTc2N2RcdTMwMDJcdThhY2JcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTc2ODRcdTU0MGRcdTdhMzFcdTMwMDINCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMUU6IFx1NTQwZFx1N2EzMSAnJ3swfScnIFx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlxuXG5cdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTVmYzVcdTk4MDhcdTY3MDlcdTU1MmZcdTRlMDBcdTU0MGRcdTdhMzFcdTMwMDJcblxuXHU4YWNiXHU4ZjM4XHU1MTY1XHU0ZTBkXHU1NDBjXHU1NDBkXHU3YTMxXHVmZjBjXHU3MTM2XHU1ZjhjXHU1MThkXHU4YTY2XHU0ZTAwXHU2YjIxXHUzMDAyDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPVx1NzZmOFx1NTQwY1x1NzY4NFx1NTE0M1x1N2QyMFx1NTQwZFx1N2EzMVx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlx1OGFjYlx1NjMwN1x1NWI5YVx1NTNlNlx1NGUwMFx1NTAwYlx1NTQwZFx1N2EzMVx1MzAwMg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMV9tc2c9SVVQTDAxMDJFOiBcdTU0MGRcdTdhMzEgJyd7MH0nJyBcdTcxMjFcdTY1NDhcdTMwMDJcblxuXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3YTMxXHU0ZTBkXHU4MGZkXHU0ZWU1XHU3YTdhXHU2ODNjXHU1MDVhXHU3MGJhXHU5NThiXHU5ODJkXHUzMDAyXG5cblx1OGFjYlx1OGYzOFx1NTE2NVx1NjcwOVx1NjU0OFx1NzY4NFx1NTQwZFx1N2EzMVx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c9SVVQTDAxMDNFOiBcdTU0MGRcdTdhMzEgJyd7MH0nJyBcdTcxMjFcdTY1NDhcdTMwMDJcblxuXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3YTMxXHU0ZTBkXHU4MGZkXHU0ZWU1XHU1M2U1XHU5ZWRlXHU1MDVhXHU3MGJhXHU3ZDUwXHU1YzNlXHUzMDAyXG5cblx1OGFjYlx1OGYzOFx1NTE2NVx1NjcwOVx1NjU0OFx1NzY4NFx1NTQwZFx1N2EzMVx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2c9SVVQTDAxMDRFOiBcdTU0MGRcdTdhMzEgJyd7MH0nJyBcdTcxMjFcdTY1NDhcdTMwMDJcblxuXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3YTMxXHU0ZTBkXHU4MGZkXHU1MzA1XHU1NDJiXHU5MDE5XHU0ZTliXHU1YjU3XHU1MTQzXHVmZjFhXFwgLyA6ICogPyAiIDwgPiA7IHxcblxuXHU4YWNiXHU4ZjM4XHU1MTY1XHU2NzA5XHU2NTQ4XHU3Njg0XHU1NDBkXHU3YTMxXHVmZjBjXHU3MTM2XHU1ZjhjXHU1MThkXHU4YTY2XHU0ZTAwXHU2YjIxXHUzMDAyDQotbm9Db25maWdFcnJvcl9tc2c9SVVQTDAxMDVFOiBcdTczZmVcdTg4NGNcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTRlMGRcdTU0MmJcdTRlZmJcdTRmNTVcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDJcblxuXHU5NzAwXHU4OTgxXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHU2MjRkXHU4MGZkXHU1ZWZhXHU3YWNiXHU2NWIwXHU3Njg0XHU3YTBiXHU1ZThmXHUzMDAyXG5cblx1OGFjYlx1NWVmYVx1N2FjYlx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLW5vRGVsaXZlcnlQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA2RTogXHU3M2ZlXHU4ODRjXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU0ZTBkXHU1NDJiXHU0ZWZiXHU0ZjU1XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiXHUzMDAyXG5cblx1OTcwMFx1ODk4MVx1NTdmYVx1NjcyY1x1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYlx1NjI0ZFx1ODBmZFx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1N2EwYlx1NWU4Zlx1OTY0NFx1NTJhMFx1ODk4MVx1N2QyMFx1MzAwMlxuXG5cdThhY2JcdTVlZmFcdTdhY2JcdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGJcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi1ub0RlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQTDAxMDdFOiBcdTY3MmFcdTkwNzhcdTUzZDZcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDJcblxuXHU1ZmM1XHU5ODA4XHU2MzA3XHU1YjlhXHU5ODEwXHU4YTJkXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHU3ZDY2XHU2NWIwXHU3Njg0XHU3YTBiXHU1ZThmXHUzMDAyXG5cblx1OGFjYlx1OTA3OFx1NTNkNlx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLW5vQmFzZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDhFOiBcdTY3MmFcdTkwNzhcdTUzZDZcdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGJcdTMwMDJcblxuXHU3YTBiXHU1ZThmXHU5NjQ0XHU1MmEwXHU4OTgxXHU3ZDIwXHU5NzAwXHU4OTgxXHU1N2ZhXHU2NzJjXHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiXHUzMDAyXG5cblx1OGFjYlx1OTA3OFx1NTNkNlx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYlx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLWNyZWF0ZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDlFOiBcdTcxMjFcdTZjZDVcdTk4MDZcdTUyMjlcdTVlZmFcdTdhY2JcdTdhMGJcdTVlOGZcdTMwMDINCi1jcmVhdGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTEwRTogXHU3MTIxXHU2Y2Q1XHU5ODA2XHU1MjI5XHU1ZWZhXHU3YWNiXHU1MTQzXHU3ZDIwXHUzMDAyDQotZGVsZXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMUU6IFx1NzEyMVx1NmNkNVx1OTgwNlx1NTIyOVx1NTIyYVx1OTY2NFx1NTE0M1x1N2QyMFx1MzAwMg0KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnPUlVUEwwMTEyRTogXHU3MTIxXHU2Y2Q1XHU1ZWZhXHU3YWNiXHU1MTQzXHU3ZDIwXHU3Njg0XHU1MTY3XHU1YmI5XHU2YTk0XHU2ODQ4XHUzMDAyXG5cblx1NmE5NFx1Njg0OCAnJ3swfScnIFx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlxuXG5cdThhY2JcdThmMzhcdTUxNjVcdTRlMGRcdTU0MGNcdTU0MGRcdTdhMzFcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c9XHU3NmY4XHU1NDBjXHU1NDBkXHU3YTMxXHU3Njg0XHU1MTY3XHU1YmI5XHU2YTk0XHU2ODQ4XHU1ZGYyXHU1YjU4XHU1NzI4XHUzMDAyXHU4YWNiXHU2MzA3XHU1YjlhXHU1M2U2XHU0ZTAwXHU1MDBiXHU1NDBkXHU3YTMxXHUzMDAyDQotdW5kb0NvbW1hbmRFcnJvcl9tc2c9SVVQTDAxMTNFOiBcdTcxMjFcdTZjZDVcdTViOGNcdTYyMTBcdTVmYTlcdTUzOWZcdTYzMDdcdTRlZTQgJyd7MH0nJ1x1MzAwMlxuXG5cdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdWZmMWF7MX0NCi1pbnZhbGlkUHJlZGVjZXNzb3JFcnJvcl9tc2c9SVVQTDAxMTRFOiBcdTYzMDdcdTViOWFcdTc2ODRcdTUyNGRcdTRlMDBcdTcyNDhcdTdkMjJcdTVmMTVcdTcxMjFcdTY1NDhcdTMwMDJcblxuXHU1MjRkXHU0ZTAwXHU3MjQ4XHU3ZDIyXHU1ZjE1XHU1ZmM1XHU5ODA4XHU2NjJmICdJbmRleCcgXHU3NmY0XHU2YjA0XHU0ZTJkXHU3Njg0XHU2NTc0XHU2NTc4XHU1MDNjXHUzMDAyXG5cblx1OGFjYlx1NjMwN1x1NWI5YVx1NjcwOVx1NjU0OFx1NzY4NFx1NTAzY1x1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHM9SVVQTDAxMDBXOiAnJ3swfScnIFx1ODIwNyAnJ3sxfScnIFx1NWRmMlx1NjcwOVx1OTVkY1x1ODA2Zlx1MzAwMlx1NTNlYVx1NWJiOVx1OGEzMVx1NGUwMFx1NTAwYlx1OTAxOVx1N2EyZVx1OTVkY1x1ODA2Zlx1MzAwMlx1ODJlNVx1ODk4MVx1NWMwNyAnJ3swfScnIFx1NjMwN1x1NWI5YVx1ODFmMyAnJ3syfScnXHVmZjBjXHU1ZmM1XHU5ODA4XHU1MTQ4XHU1ZjllICcnezF9JycgXHU0ZTJkXHU3OWZiXHU5NjY0XHUzMDAyDQotZXJyb3JfbXNnV2l0aERldGFpbHM9SVVQTDAxMTZFOiBcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdTMwMDJcdTU5ODJcdTk3MDBcdTc2ZjhcdTk1ZGNcdThjYzdcdThhMGFcdWZmMGNcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMGRcdTMwMDINCi1lcnJvcl9tc2c9SVVQTDAxMTdFOiBcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdTMwMDJcdTU5ODJcdTk3MDBcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdWZmMGNcdThhY2JcdTUzYzNcdTk1YjFcdTkzMmZcdThhYTRcdTY1ZTVcdThhOGNcdTMwMDINCi1TdXBwcmVzc2lvbl9uYW1lRHVwbGljYXRpb249SVVQTDAxMThFOiBcdTU3MjhcdTZiNjRcdTY0Y2RcdTRmNWNcdTRlNGJcdTVmOGNcdTY3MDNcdTc2N2NcdTc1MWZcdTU0MGRcdTdhMzFcdTg4NWRcdTdhODFcdTMwMDJcdTZhYTJcdTY3ZTVcdTUxNDNcdTdkMjBcdTc2ODRcdTU0MGRcdTdhMzFcdTY2MmZcdTU0MjZcdTkxY2RcdTg5MDdcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjENCi1TdXBwcmVzc2lvbl9wcmVzZW50YXRpb25OYW1lRHVwbGljYXRpb249SVVQTDAxMTlFOiBcdTU3MjhcdTZiNjRcdTY0Y2RcdTRmNWNcdTRlNGJcdTVmOGNcdTY3MDNcdTc2N2NcdTc1MWZcdTU0MGRcdTdhMzFcdTg4NWRcdTdhODFcdTMwMDJcdTZhYTJcdTY3ZTVcdTUxNDNcdTdkMjBcdTc2ODRcdTU0NDhcdTczZmVcdTU0MGRcdTdhMzFcdTY2MmZcdTU0MjZcdTkxY2RcdTg5MDdcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjENCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249XHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHUzMDAyXHU1OTgyXHU5NzAwXHU3NmY4XHU5NWRjXHU4Y2M3XHU4YTBhXHVmZjBjXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHUzMDBkXHUzMDAyDQotc2F2ZVByb2Nlc3NFcnJvcl9yZWFzb249XHU1MTMyXHU1YjU4XHU3YTBiXHU1ZThmICcnezB9JycgXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHUzMDAyXHU1OTgyXHU5NzAwXHU3NmY4XHU5NWRjXHU4Y2M3XHU4YTBhXHVmZjBjXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHUzMDBkXHUzMDAyDQotZGVsZXRlUmVmZXJlbmNlc0Vycm9yX3JlYXNvbj1cdTc5ZmJcdTk2NjRcdTZiNjRcdTUxNDNcdTdkMjBcdTc2ZjhcdTk1ZGNcdTc2ODRcdTUzYzNcdTcxNjdcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdTMwMDJcdTU5ODJcdTk3MDBcdTc2ZjhcdTk1ZGNcdThjYzdcdThhMGFcdWZmMGNcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMGRcdTMwMDINCi1zYXZlRmlsZUVycm9yX3JlYXNvbj1cdTUxMzJcdTViNThcdTZhOTRcdTY4NDggJyd7MH0nJyBcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdTMwMDJcdTU5ODJcdTk3MDBcdTc2ZjhcdTk1ZGNcdThjYzdcdThhMGFcdWZmMGNcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMGRcdTMwMDINCi1pbnZhbGlkUmVmZXJlbmNlc0Vycm9yX3JlYXNvbj1cdThkZThcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTg5MDdcdTg4ZmRcdTc2ODRcdTdkNTBcdTY3OWNcdTUwNzVcdTZlMmNcdTUyMzBcdTUxNzdcdTY3MDlcdTcxMjFcdTY1NDhcdTUzYzNcdTcxNjdcdTc2ODRcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTMwMDJcblx1NWMwN1x1NzlmYlx1OTY2NFx1OTAxOVx1NGU5Ylx1NTNjM1x1NzE2N1x1MzAwMlx1ODk4MVx1N2U3Y1x1N2U4Y1x1NTVjZVx1ZmYxZg0KLXVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb249XHU3MTIxXHU2Y2Q1XHU0ZmVlXHU2NTM5XHU2NzJhXHU4OWUzXHU2NzkwXHU3Njg0XHU3MjY5XHU0ZWY2XHVmZjFhezB9KFVSSSA9IHsxfSl7Mn0NCi0NCi0jIFdhcm5pbmcgbWVzc2FnZXMNCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMThXOiBcdTYyN2VcdTRlMGRcdTUyMzBcdTRlMDBcdTYyMTZcdTU5MWFcdTUwMGJcdTRmODZcdTZlOTBcdTUxNDNcdTdkMjBcdTMwMDJcdTVjMDdcdTRlMGRcdTY3MDNcdTg5MDdcdTg4ZmRcdThjYzdcdTZlOTBcdThjYzdcdTY1OTlcdTU5M2VcdTRlMmRcdTc2ODRcdTc2ZjhcdTk1ZGNcdTZhOTRcdTY4NDhcdTMwMDINCi1BY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE5VzogXHU2MjdlXHU0ZTBkXHU1MjMwXHU0ZTAwXHU2MjE2XHU1OTFhXHU1MDBiXHU0Zjg2XHU2ZTkwXHU1MTQzXHU3ZDIwXHUzMDAyXHU1YzA3XHU0ZTBkXHU2NzAzXHU4OTA3XHU4OGZkXHU3NmY4XHU5NWRjXHU3Njg0XHUzMDBjXHU2ZDQxXHU3YTBiXHU1OTU3XHU0ZWY2XHUzMDBkXHUzMDAyDQotQWN0aXZpdHlEcm9wQ29tbWFuZF9kZWVwQ29weV9wcm9tcHRDb25maWd1cmF0aW9uTXNnPVx1ODk4MVx1ODkwN1x1ODhmZFx1NjI0MFx1NjcwOVx1NjNjZlx1OGZmMFx1NWI1MFx1NTVjZVx1ZmYxZlxuXG5cdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTU0MjZcdTMwMGRcdTUzZWFcdTY3MDNcdTg5MDdcdTg4ZmRcdTczZmVcdTg4NGNcdTkxNGRcdTdmNmVcdTRlMmRcdTc2ODRcdTYzY2ZcdThmZjBcdTViNTBcdTMwMDINCi1kZWVwQ29weV9wcm9tcHRNc2c9XHU2MGE4XHU1YzA3XHU1M2Q2XHU1Zjk3XHU1ZjllXHU3M2ZlXHU1NzI4XHU5NThiXHU1OWNiXHU4OTgxXHU1MjA2XHU5NThiXHU3ZGFkXHU4Yjc3XHU3Njg0XHU2MjQwXHU2NzA5XHU1MmQ1XHU2MTRiXHU5MDIzXHU3ZDUwXHU1MTQzXHU3ZDIwXHU3Njg0XHU4OTA3XHU2NzJjXHUzMDAyXHU4OTgxXHU3ZTdjXHU3ZThjXHU1NWNlXHVmZjFmDQotZGVlcENvcHlfdGl0bGU9XHU2ZGYxXHU1YzY0XHU4OTA3XHU4OGZkDQotDQotIyBQcm9ncmVzcyBtZXNzYWdlcw0KLWNyZWF0aW5nUHJvY2Vzc0NvbXBvbmVudFRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTVlZmFcdTdhY2JcdTdhMGJcdTVlOGZcdTUxNDNcdTRlZjYgJyd7MH0nJy4uLg0KLXByb2Nlc3NpbmdSZWZlcmVuY2VzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1ODY1NVx1NzQwNlx1NTNjM1x1NzE2Ny4uLg0KLWRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU1MjJhXHU5NjY0XHU1MTQzXHU3ZDIwXHU1M2NhXHU3NmY4XHU5NWRjXHU2YTk0XHU2ODQ4Li4uDQotY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NmFhMlx1NjdlNVx1NTNjM1x1NzE2Ny4uLg0KLXJlbW92aW5nUmVmZXJlbmNlc3Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTc5ZmJcdTk2NjRcdTUzYzNcdTcxNjcuLi4NCi1zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTEzMlx1NWI1OFx1NWRmMlx1NGZlZVx1NjUzOVx1NzY4NFx1NmE5NFx1Njg0OC4uLg0KLWNoZWNrQWZmZWN0ZWRSZXNvdXJjZXNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU2YWEyXHU2N2U1XHU1M2Q3XHU1ZjcxXHU5N2ZmXHU3Njg0XHU4Y2M3XHU2ZTkwLi4uDQotbW92aW5nVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzlmYlx1NTJkNS4uLg0KLW1vdmluZ0ZpbGVzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzlmYlx1NTJkNVx1NmE5NFx1Njg0OC4uLg0KLWNvcHlpbmdSZXNvdXJjZXNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU4OTA3XHU4OGZkXHU4Y2M3XHU2ZTkwLi4uDQotY29weWluZ0FjdGl2aXRpZXNfbXNnPVx1NmI2M1x1NTcyOFx1ODkwN1x1ODhmZFx1NmQzYlx1NTJkNSAnJ3swfScnDQotc2F2aW5nRmlsZVRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTUxMzJcdTViNThcdTZhOTRcdTY4NDggJyd7MH0nJy4uLg0KLQ0KLSMgVUkgVGV4dA0KLWVsZW1lbnRfdGV4dD1cdTUxNDNcdTdkMjANCi1jcmVhdGVFbGVtZW50X3RleHQ9XHU1ZWZhXHU3YWNiXHU1MTQzXHU3ZDIwDQotY3JlYXRlUHJvY2Vzc190ZXh0PVx1NWVmYVx1N2FjYlx1N2EwYlx1NWU4Zg0KLWNvbnRyaWJ1dGVzVG9fdGV4dD1cdTYzZDBcdTUxZmFcdTgxZjMNCi1sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dD1cdTU3MjhcdTY3MmNcdTdhZWZcdTYzZDBcdTUxZmFcdTgxZjMNCi1leHRlbmRzX3RleHQ9XHU1ZWY2XHU0ZjM4DQotcmVwbGFjZXNfdGV4dD1cdTUzZDZcdTRlZTMNCi1sb2NhbFJlcGxhY2VzX3RleHQ9XHU1NzI4XHU2NzJjXHU3YWVmXHU1M2Q2XHU0ZWUzDQotbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5X3RleHQ9XHU2NzJjXHU3YWVmXHU1M2Q2XHU0ZWUzXHU1NDhjXHU2ZGYxXHU1YzY0XHU4OTA3XHU4OGZkDQotZWxlbWVudFR5cGVfdGV4dD17MH06IHsxfQ0KLWRlbGl2ZXJhYmxlc190ZXh0PVx1NGVhNFx1NGVkOFx1OTgwNVx1NzZlZQ0KLWNvbnRyaWJ1dGVUb0FjdGl2aXR5X3RleHQ9XHU2M2QwXHU1MWZhXHU4MWYzXHU2ZDNiXHU1MmQ1DQotQWN0aXZpdHlEcm9wQ29tbWFuZF9sYWJlbD1cdTYzNjhcdTY4YzRcdTZkM2JcdTUyZDUNCi1yZXBsYWNlQWN0aXZpdHlfdGV4dD1cdTUzZDZcdTRlZTNcdTZkM2JcdTUyZDUNCi1maWxlX3RleHQ9XHU2YTk0XHU2ODQ4DQotZGlyZWN0b3J5X3RleHQ9XHU3NmVlXHU5MzA0DQotdW5yZXNvbHZlZF90ZXh0PVx1ZmYwOFx1NjcyYVx1ODllM1x1Njc5MFx1NzY4NCAnJ3swfScnXHVmZjA5DQotYXNzaXN0c190ZXh0PVx1OGYxNFx1NTJhOQ0KLXVua25vd25fdGV4dD1cdTRlMGRcdTY2MGUNCi1jb21tYW5kX2RvbmU9XHU1YjhjXHU2MjEwDQotDQotIyBUaGUgZm9sbG93aW5nIFVJIHRleHQgc2hvdWxkIGJlIHJldmlld2VkLg0KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5d2l0aHBsdWdpbl9pbmZvPXswfVx1ZmYwOCcnezN9JycgXHU0ZTJkXHU3Njg0IHsxfSAnJ3syfScnXHVmZjA5DQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHlfaW5mbz17MH0gKHsxfSAnJ3syfScnKQ0KLXVpX3JlZl9kZWxldGU9XHU2M2NmXHU4ZmYwXHU1YjUwICcnezB9JycgXHU1MTc3XHU2NzA5XHU0ZTBiXHU1MjE3XHU2NzJhXHU0ZjdmXHU3NTI4XHU3Njg0XHU1M2MzXHU3MTY3XHUzMDAyXG5cdThhY2JcdTkwNzhcdTUzZDZcdTYwYThcdTg5ODFcdTUyMmFcdTk2NjRcdTc2ODRcdTUzYzNcdTcxNjdcdWZmMWENCi11aV9yZWZfZGVsZXRlMj1cdTRlMGJcdTUyMTdcdTkwMTlcdTRlOWJcdTUzYzNcdTcxNjdcdTY3MmFcdTRmN2ZcdTc1MjhcdTMwMDJcblx1OGFjYlx1OTA3OFx1NTNkNlx1NjBhOFx1ODk4MVx1NTIyYVx1OTY2NFx1NzY4NFx1NTNjM1x1NzE2N1x1ZmYxYQ0KLXVpX3JlZmVyZW5jZXM9XHU1M2MzXHU3MTY3DQotdWlfd29ya3Byb2R1Y3RfZGVzY3JpcHRvcl9kZXNjcmlwdGlvbj1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTYzY2ZcdThmZjBcdTViNTAgJyd7MH0nJyBcdTgyMDdcdTRmNWNcdTY5NmRcdTYzY2ZcdThmZjBcdTViNTAgJyd7MX0nJyBcdTY3MDlcdTk1ZGNcdTgwNmZcdWZmMDhcdThmMzhcdTUxZmFcdTRmODZcdTZlOTBcdWZmMDkNCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3Jfb3B0aW9ucz1cdTkwNzhcdTk4MDUNCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3Jfb3V0cHV0bGFiZWw9XHU3OWZiXHU5NjY0XHU1MDVhXHU3MGJhXHU0ZjVjXHU2OTZkXHU2M2NmXHU4ZmYwXHU1YjUwXHU4ZjM4XHU1MWZhXHU3Njg0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU2M2NmXHU4ZmYwXHU1YjUwDQotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX2RlbGV0ZV90YXNrPVx1NWY5ZVx1NmQzYlx1NTJkNVx1NGUyZFx1NTIyYVx1OTY2NFx1NGY1Y1x1Njk2ZFx1NjNjZlx1OGZmMFx1NWI1MA0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2s9XHU5MDc4XHU1M2Q2XHU3Njg0XHU1MTQzXHU3ZDIwICcnezB9JycgXHU0ZTBkXHU1NzI4XHU3YTBiXHU1ZThmXHU3Njg0XHU5ODEwXHU4YTJkXHU5MTRkXHU3ZjZlXHU0ZTJkXHUzMDAyXG5cdTYwYThcdTg5ODFcdTVjMDdcdTZiNjRcdTUxNDNcdTdkMjBcdTUzY2FcdTc2ZjhcdTRmOWRcdTk1ZGNcdTRmYzJcdTY1YjBcdTU4OWVcdTgxZjNcdTk4MTBcdThhMmRcdTkxNGRcdTdmNmVcdTU1Y2VcdWZmMWYNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZ2VuZXJpY0Vycl9tZXNzYWdlX3RleHQ9XHU0ZjVjXHU2OTZkXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHUzMDAyXHU1OTgyXHU5NzAwXHU3NmY4XHU5NWRjXHU4Y2M3XHU4YTBhXHVmZjBjXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHUzMDAyDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoPVx1NjI3ZVx1NGUwZFx1NTIzMFx1NTE3N1x1NjcwOVx1OTNjOFx1N2Q1MFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1NzY4NFx1NjNjZlx1OGZmMFx1NWI1MFx1NTNlZlx1NTQwY1x1NmI2NVx1NTMxNg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXI9XHU5MWNkXHU2NWIwXHU2NTc0XHU3NDA2XHU2YWEyXHU4OTk2XHU1NjY4XHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotY29uZmlybV9yZW1vdmVfcmVmZXJlbmNlc190ZXh0PVx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwZFx1NGUyZFx1NTIxN1x1NTFmYVx1NzY4NFx1NTE0M1x1N2QyMFx1NTcyOFx1OGY0OVx1NjNkYlx1NGU0Ylx1NWY4Y1x1ZmYwY1x1NWMwZFx1OTAxOVx1NTAwYlx1NjMwN1x1NWYxNVx1NzY4NFx1NTNjM1x1NzE2N1x1NTNlZlx1ODBmZFx1NjcwM1x1NzEyMVx1NjU0OFx1MzAwMlx1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1NzhiYVx1NWI5YVx1MzAwZFx1NGY4Nlx1NzlmYlx1OTY2NFx1ZmYwY1x1NGUyNlx1N2U3Y1x1N2U4Y1x1OTAzMlx1ODg0Y1x1MzAwMg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3VuaGFuZGxlZF9leGNlcHRpb249XHU3MTIxXHU2Y2Q1XHU4NjU1XHU3NDA2XHU3Njg0XHU3NTcwXHU1ZTM4XHU3MmMwXHU2Y2MxDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9icmVha2Rvd25fZWxlbWVudD1cdTc2ZjhcdTU0MGNcdTc2ODRcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTRlMGRcdTgwZmRcdTU0MGNcdTY2NDJcdTcwYmFcdTUyNGRcdTRlMDBcdTcyNDhcdTU0OGNcdTRlMGJcdTRlMDBcdTcyNDgNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd3BsaXN0ZGxnX21zZz1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMgJyd7MH0nJyBcdTY2MmZcdTYzZDBcdTRmOWJcdTdkNjZcdTRlMGJcdTUyMTdcdTRmNWNcdTY5NmRcdTc2ODRcdThmMzhcdTUxZmFcdTMwMDJcblx1OTA3OFx1NTNkNlx1NjBhOFx1ODk4MVx1NWVmYVx1N2FjYlx1NzZmOFx1NWMwZFx1NjFjOVx1NjNjZlx1OGZmMFx1NWI1MFx1NzY4NFx1NGY1Y1x1Njk2ZFx1MzAwMg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9yb2xlbGlzdGRsZ19tc2c9XHU4OWQyXHU4MjcyICcnezB9JycgXHU4Y2EwXHU4Y2FjXHU0ZTBiXHU1MjE3XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHUzMDAyXG5cdTkwNzhcdTUzZDZcdTYwYThcdTg5ODFcdTVlZmFcdTdhY2JcdTc2ZjhcdTVjMGRcdTYxYzlcdTYzY2ZcdThmZjBcdTViNTBcdTc2ODRcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTMwMDINCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9mYXRhbGVycj1cdTU2YjRcdTkxY2RcdTkzMmZcdThhYTQNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd29ya3Byb2R1Y3RzPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfc3ViX2VsZW1lbnQ9XHU3MTIxXHU2Y2Q1XHU1YzA3XHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwXHU5MDIzXHU3ZDUwXHU4MWYzXHU1MTc2XHU0ZTJkXHU0ZTAwXHU1MDBiXHU1YjUwXHU1MTQzXHU3ZDIwXHUzMDAyDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudD1cdTcxMjFcdTZjZDVcdTkwMjNcdTdkNTBcdTgxZjNcdTVkZTVcdTRmNWNcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTRlZTVcdTU5MTZcdTc2ODRcdTUxNDNcdTdkMjBcdTMwMDINCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9jaGlsZF9lbGVtZW50PVx1NzEyMVx1NmNkNVx1NWMwN1x1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1OTAyM1x1N2Q1MFx1ODFmM1x1NTE3Nlx1NGUyZFx1NGUwMFx1NTAwYlx1NWI1MFx1NTE0M1x1N2QyMFx1MzAwMg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrcz1cdTRmNWNcdTY5NmQNCi11aV9hc3NvY2lhdGlvbl90YXNrX3NlbGVjdGlvbj1cdTRmNWNcdTY5NmRcdTkwNzhcdTY0YzcuLi4NCi11dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlcj1cIFwgXHU1YjUwXHU5ODA1XHU5MTRkXHU2M2E1XHU1NjY4XHVmZjFhDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2V0cGFyZW50PVx1NzEyMVx1NmNkNVx1OGEyZFx1NWI5YVx1NWI1MFx1OTgwNVx1NzY4NFx1NmJjZFx1OTgwNQ0KLXV0aWxfdG5ndXRpbF9jYW5ub3RfZWRpdF9yZXNvdXJjZT1cdTcxMjFcdTZjZDVcdTdkZThcdThmMmZcdThjYzdcdTZlOTBcdTMwMDINCi11dGlsX1Byb2Nlc3NVdGlsX2NvbnRyaWJ1dGVzdG89XHU2M2QwXHU1MWZhXHU4MWYzICcnezB9JycNCi11dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bz1cdTU3MjhcdTY3MmNcdTdhZWZcdTYzZDBcdTUxZmFcdTgxZjMgJyd7MH0nJw0KLXByb2Nlc3NfZXh0ZW5kcz1cdTVlZjZcdTRmMzggJyd7MH0nJw0KLXByb2Nlc3NfcmVwbGFjZXM9XHU1M2Q2XHU0ZWUzICcnezB9JycNCi1wcm9jZXNzX2xvY2FsUmVwbGFjZXM9XHU1NzI4XHU2NzJjXHU3YWVmXHU1M2Q2XHU0ZWUzICcnezB9JycNCi0jIEZpbHRlciBjb25zdGFudHMgZXh0ZXJuYWxpemVkIHN0cmluZ3MuDQotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVzX3RleHQ9XHU4OThmXHU3YmM0DQotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVncm91cGluZ3NfdGV4dD1cdTg5OGZcdTdiYzRcdTUyMDZcdTdkNDQNCi1GaWx0ZXJDb25zdGFudHNfd2hpdGVwYXBlcnNfdGV4dD1cdTc2N2RcdTc2YWVcdTY2ZjgNCi1GaWx0ZXJDb25zdGFudHNfdG9vbG1lbnRvcnNfdGV4dD1cdTVkZTVcdTUxNzdcdThmMTRcdTUyYTkNCi1GaWx0ZXJDb25zdGFudHNfdG9vbHNfdGV4dD1cdTVkZTVcdTUxNzcNCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNfdGV4dD1cdTg5ZDJcdTgyNzINCi1GaWx0ZXJDb25zdGFudHNfdGFza3NfdGV4dD1cdTRmNWNcdTY5NmQNCi1GaWx0ZXJDb25zdGFudHNfcmV1c2FibGVhc3NldHNfdGV4dD1cdTUzZWZcdTkxY2RcdTg5MDdcdTRmN2ZcdTc1MjhcdTc2ODRcdThjYzdcdTc1MjINCi1GaWx0ZXJDb25zdGFudHNfYWxsX3RleHQ9XHU1MTY4XHU5MGU4DQotRmlsdGVyQ29uc3RhbnRzX3Byb2Nlc3Nlc190ZXh0PVx1N2EwYlx1NWU4Zg0KLUZpbHRlckNvbnN0YW50c19wcmFjdGljZXNfdGV4dD1cdTdkZjRcdTdmZDINCi1GaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ9XHU3YmM0XHU2NzJjDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0c190ZXh0PVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLUZpbHRlckNvbnN0YW50c19jaGVja2xpc3RzX3RleHQ9XHU2ODM4XHU1YzBkXHU2ZTA1XHU1NWFlDQotRmlsdGVyQ29uc3RhbnRzX2d1aWRlbGluZXNfdGV4dD1cdTZlOTZcdTUyNDcNCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNldHNfdGV4dD1cdTg5ZDJcdTgyNzJcdTk2YzYNCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dD1cdTYzMDdcdTVmMTUNCi1GaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dD1cdTY5ODJcdTVmZjUNCi1GaWx0ZXJDb25zdGFudHNfZXhhbXBsZXNfdGV4dD1cdTdiYzRcdTRmOGINCi1GaWx0ZXJDb25zdGFudHNfY29udGVudHBhY2thZ2VzX3RleHQ9XHU1MTY3XHU1YmI5XHU1OTU3XHU0ZWY2DQotRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0PVx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1NWI1MA0KLUZpbHRlckNvbnN0YW50c19yb2xlc2V0Z3JvcHVpbmdzX3RleHQ9XHU4OWQyXHU4MjcyXHU5NmM2XHU1MjA2XHU3ZDQ0DQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tkZXNjcmlwdG9yc190ZXh0PVx1NGY1Y1x1Njk2ZFx1NjNjZlx1OGZmMFx1NWI1MA0KLUZpbHRlckNvbnN0YW50c19jb250ZW50ZWxlbWVudHNfdGV4dD1cdTUxNjdcdTViYjlcdTUxNDNcdTdkMjANCi1Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX3ByZXBhcmU9XHU2YjYzXHU1NzI4XHU2ZTk2XHU1MDk5XHU1NDBjXHU2YjY1XHU1MzE2Li4uDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnNfdGV4dD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTYzY2ZcdThmZjBcdTViNTANCi1GaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ9XHU2MjQwXHU2NzA5XHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwDQotRmlsdGVyQ29uc3RhbnRzX3N1cHBvcnRpbmdtYXRlcmlhbHNfdGV4dD1cdTY1MmZcdTYzZjRcdThjYzdcdTY1OTkNCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzPVx1NTEzMlx1NWI1OFx1NmE5NFx1Njg0OFx1NjY0Mlx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNA0KLUZpbHRlckNvbnN0YW50c19jdXN0b21jYXRlZ29yaWVzX3RleHQ9XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0dHlwZXNfdGV4dD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTk4NWVcdTU3OGINCi1EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZF93YXJuaW5nTXNnPVx1NTIyYVx1OTY2NFx1NWI4Y1x1NjIxMFx1NGY0Nlx1NjcwOVx1OGI2Nlx1NTQ0YQ0KLUZpbHRlckNvbnN0YW50c19tZXRob2RwbHVnaW5zX3RleHQ9XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotVXNlckludGVyYWN0aW9uSGVscGVyX2xvY2tlZFBsdWdpbj1JVVBMMDEyMEU6IFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZiAnJ3swfScnIFx1NWRmMlx1OTM5Nlx1NWI5YVx1MzAwMg0KLUZpbHRlckNvbnN0YW50c19kb21haW5zX3RleHQ9XHU5ODE4XHU1N2RmDQotRmlsdGVyQ29uc3RhbnRzX3JvYWRtYXBfdGV4dD1cdTVjMGVcdTg5YmRcdTU3MTYNCi1GaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0PVx1NTgzMVx1NTQ0YQ0KLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9XHU5ODEwXHU4YTJkXHU1ZjllXHU2NWI5XHU2Y2Q1XHU1MTY3XHU1YmI5XHU1NDBjXHU2YjY1XHU1MzE2KCZZKQ0KLU1hbnVhbFN5bmNocm9uaXplQ29tbWFuZF9sYWJlbD1cdTgxZWFcdThhMDJcdTU0MGNcdTZiNjVcdTUzMTYoJlopLi4uDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWw9XHU1ZGYyXHU5ODA2XHU1MjI5XHU1YjhjXHU2MjEwXHU1NDBjXHU2YjY1XHU1MzE2XHUzMDAyDQotDQotIyBVc2VySW50ZXJhY3Rpb25IZWxwZXINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZT1cdTU0MGRcdTdhMzFcdWZmMWENCi0NCi0jIE1ldGhvZENyZWF0ZUNoaWxkQ29tbWFuZA0KLW5ld0VsZW1lbnRfdGV4dD1cdTY1YjBcdTVlZmEgezB9DQotdXBkYXRlX291dG9mc3luY2hfdGl0bGU9XHU2NmY0XHU2NWIwXHU4ODVkXHU3YTgxDQotdXBkYXRlX291dG9mc3luY2hfbXNnPVx1NmE5NFx1Njg0OFx1N2NmYlx1N2Q3MVx1NGUwYVx1NzY4NFx1NmE5NFx1Njg0OFx1NWRmMlx1OGI4YVx1NjZmNFx1MzAwMlx1ODk4MVx1NjUzOVx1NWJlYlx1OGI4YVx1NjZmNFx1NTVjZVx1ZmYxZg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ2Zjg2ZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDU0OGY5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBMaWJyYXJ5IEVkaXQgKE5MMikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NGZjYTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM2ZTJlZGUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9XHUwNDExXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIEVQRiAtIFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLV9VSV9Db250ZW50X2dyb3VwPVx1MDQxY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0YiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi0NCi1fVUlfRGlzY2lwbGluZXNfZ3JvdXA9XHUwNDE0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDRiDQotX1VJX0RvbWFpbnNfZ3JvdXA9XHUwNDE0XHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRiDQotX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXA9XHUwNDIyXHUwNDM4XHUwNDNmXHUwNDRiIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQ0NSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0M2VcdTA0MzINCi1fVUlfUm9sZV9TZXRzX2dyb3VwPVx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1fVUlfVG9vbHNfZ3JvdXA9XHUwNDE4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiDQotX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXA9XHUwNDIxXHUwNDQyXHUwNDMwXHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQzOA0KLV9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cD1cdTA0MWZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4DQotX1VJX01ldGhvZENvbnRlbnRfZ3JvdXA9XHUwNDFmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDRiIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMg0KLQ0KLV9VSV9Qcm9jZXNzZXNfZ3JvdXA9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDRiDQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPVx1MDQyOFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQ0YiBcdTA0M2ZcdTA0M2JcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYNCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5zX3RleHQ9XHUwNDI4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkXHUwNDRiIFx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzOQ0KLV9VSV9EZWxpdmVyeVByb2Nlc3Nlc190ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQ0YiBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzgNCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbnNfdGV4dD1cdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNhIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMFx1MDQzYw0KLV9VSV9QbGFubmluZ1RlbXBsYXRlc190ZXh0PVx1MDQyOFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQ0YiBcdTA0M2ZcdTA0M2JcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYNCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2QgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MSBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzgNCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PVx1MDQxNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2EgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDQzDQotDQotX1VJX0NvbmZpZ3VyYXRpb25zX3RleHQ9XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotDQotX1VJX1Byb2Nlc3NGYW1pbGllc190ZXh0PVx1MDQyMVx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0MzINCi0NCi1fVUlfVW5jYXRlZ29yaXplZF90ZXh0PVx1MDQxMVx1MDQzNVx1MDQzNyBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzgNCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PVx1MDQxN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOCBcdTA0MzJcdTA0M2RcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM5DQotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzggXHUwNDMyXHUwNDNkXHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQzOQ0KLQ0KLV9VSV9HdWlkYW5jZXNfZ3JvdXA9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX0d1aWRhbmNlc19DaGVja2xpc3RzPVx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0NGINCi1fVUlfR3VpZGFuY2VzX0NvbmNlcHRzPVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0Nlx1MDQzNVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOA0KLV9VSV9HdWlkYW5jZXNfRXhhbXBsZXM9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQwXHUwNDRiDQotX1VJX0d1aWRhbmNlc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM9XHUwNDIwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQzZSBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0MzUNCi1fVUlfR3VpZGFuY2VzX1ByYWN0aWNlcz1cdTA0MWZcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzggXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX0d1aWRhbmNlc19SZXBvcnRzPVx1MDQxZVx1MDQ0Mlx1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQ0Yg0KLV9VSV9HdWlkYW5jZXNfUmV1c2FibGVBc3NldHM9XHUwNDFjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQ0Yg0KLV9VSV9HdWlkYW5jZXNfUm9hZG1hcD1cdTA0MWZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGMNCi1fVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHM9XHUwNDIxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0Yg0KLV9VSV9HdWlkYW5jZXNfVGVjaG5pcXVlcz1cdTA0MWNcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2FcdTA0MzgNCi1fVUlfR3VpZGFuY2VzX1RlbXBsYXRlcz1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0NGINCi1fVUlfR3VpZGFuY2VzX1Rlcm1EZWZpbml0aW9ucz1cdTA0MWVcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDNjXHUwNDM4XHUwNDNkXHUwNDNlXHUwNDMyDQotX1VJX0d1aWRhbmNlc19Ub29sTWVudG9ycz1cdTA0MjBcdTA0NDNcdTA0M2FcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQzYw0KLV9VSV9HdWlkYW5jZXNfV2hpdGVwYXBlcnM9XHUwNDE4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDNlXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzMVx1MDQ0ZVx1MDQzYlx1MDQzYlx1MDQzNVx1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQzOA0KLV9VSV9HdWlkYW5jZXNfV29ya1Byb2R1Y3RHdWlkZWxpbmVzPVx1MDQyMFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLQ0KLQ0KLV9VSV9Sb2xlc19ncm91cD1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzgNCi1fVUlfVGFza3NfZ3JvdXA9XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotX1VJX1dvcmtQcm9kdWN0c19ncm91cD1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkOTI5NTMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEdlbmVyaWMgRGlhbG9nIFRpdGxlcw0KLW1vdmVEaWFsb2dfdGl0bGU9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDRjDQotZGVsZXRlRGlhbG9nX3RpdGxlPVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDINCi1lcnJvckRpYWxvZ190aXRsZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzANCi1lcnJvckRpYWxvZ19jYW5ub3RSZW5hbWU9XHUwNDFkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyB7MH0gJyd7MX0nJyBcdTA0MzIgJyd7Mn0nJy4gXHUwNDIzXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQ0N1x1MDQzOFx1MDQzZFx1MDQ0MyBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzgsIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzIgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zlx1MDQ0NSwgXHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MWVcdTA0MWEgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDFlXHUwNDQyXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDMwIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzAgXHUwNDNlXHUwNDQyIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotDQotIyBDb25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbCBEaWFsb2cNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlPVx1MDQxZlx1MDQzZVx1MDQzNFx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNlXHUwNDNhDQotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190ZXh0PVx1MDQxZFx1MDQzMCBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0NGZcdTA0MzVcdTA0M2NcdTA0NGJcdTA0MzUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDM4XHUwNDM3IFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQ0NSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4gXHUwNDFmXHUwNDQwXHUwNDM4IFx1MDQzOFx1MDQ0NSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0NDJcdTA0MzBcdTA0M2FcdTA0MzZcdTA0MzUgXHUwNDRkXHUwNDQyXHUwNDM4IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCwgXHUwNDQyXHUwNDNlIFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0YyBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQzZVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIuIFx1MDQyM1x1MDQzMVx1MDQzNVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQ0MVx1MDQ0YywgXHUwNDQ3XHUwNDQyXHUwNDNlIFx1MDQ0MyBcdTA0MzJcdTA0MzBcdTA0NDEgXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0MzAgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0NDUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyLCBcdTA0MzdcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2MgXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IE9LLiAgXHUwNDFkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDQ3XHUwNDQyXHUwNDNlXHUwNDMxXHUwNDRiIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0M2VcdTA0M2EgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyLCBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0NDVcdTA0NDFcdTA0NGYgXHUwNDNkXHUwNDMwIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQ0Zlx1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQzOSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIuDQotDQotIyBSZXNvbHZlIE5hbWUgQ29uZmxpY3QgRGlhbG9nDQotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZT1cdTA0MjNcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDNiXHUwNDM4XHUwNDNhXHUwNDQyIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzINCi1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQ9XHUwNDEyXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzOSB7MH0gXHUwNDM0XHUwNDNiXHUwNDRmICcnezF9Jyc6DQotDQotIyBTZWxlY3QgRGVsaXZlcmFibGVzIERpYWxvZw0KLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190aXRsZT1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190ZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQ0MVx1MDQzMlx1MDQzZVx1MDQzNVx1MDQzZCBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyICcnezB9JycuDQotDQotIyBOZXcgUHJvY2VzcyBDb21wb25lbnQgRGlhbG9nDQotbmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZT1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMA0KLW5hbWVMYWJlbF90ZXh0PVx1MDQxOFx1MDQzY1x1MDQ0ZjoNCi1kZWZhdWx0Q29uZmlnTGFiZWxfdGV4dD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZToNCi1iYXNlUHJvY2Vzc0xhYmVsX3RleHQ9XHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MToNCi1iYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dD1cdTA0MWRcdTA0MzAgXHUwNDNlXHUwNDQxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzZVx1MDQzMjoNCi0NCi0jIFJvbGUgQXNzb2NpYXRpb24gRGlhbG9nDQotc2VsZWN0QXNzb2NpYXRpb25MYWJlbF90ZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0NGMgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOCAnJ3swfScnDQotDQotIyBSZW1vdmUgQXNzb2NpYXRpb24gZGlhbG9nDQotcmVtb3ZlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDRjDQotDQotIyBTZWxlY3QgVGVhbXMgRGlhbG9nDQotc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGU9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0Yg0KLXNlbGVjdFRlYW1zRGlhbG9nX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0MywgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDM5IFx1MDQzZFx1MDQ0M1x1MDQzNlx1MDQzZFx1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDRjICcnezB9JycuDQotDQotIyBUYXNsIFNlbGVjdGlvbiBEaWFsb2cNCi10YXNrU2VsZWN0aW9uRGlhbG9nX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzZVx1MDQ0MCBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi10aXRsZUxhYmVsX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOC4uLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAwRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZSBcdTA0MzhcdTA0M2NcdTA0NGYgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwICJ7MH0iLlxuXG5cdTA0MTJcdTA0NDFcdTA0MzVcdTA0M2MgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDNjIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyIFx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzZFx1MDQ0YiBcdTA0MzFcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM1XHUwNDNkXHUwNDRiIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzMC5cblxuXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0M2ZcdTA0NGJcdTA0NDJcdTA0M2FcdTA0NDMuDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQ0Ylx1MDQzYy4gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDFFOiBcdTA0MThcdTA0M2NcdTA0NGYgJyd7MH0nJyBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyLiBcblxuXHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzVcdTA0M2QgXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQyXHUwNDRjIFx1MDQ0M1x1MDQzZFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuXG5cblx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDRiXHUwNDQyXHUwNDNhXHUwNDQzLg0KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDQxIFx1MDQ0Mlx1MDQzMFx1MDQzYVx1MDQzOFx1MDQzYyBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2MgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQzNVx1MDQ0Mi4gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuDQotaW52YWxpZEVsZW1lbnROYW1lRXJyb3IxX21zZz1JVVBMMDEwMkU6IFx1MDQxZFx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYgJyd7MH0nJy5cblxuXHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDNkXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNlx1MDQzNVx1MDQ0MiBcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzhcdTA0M2RcdTA0MzBcdTA0NDJcdTA0NGNcdTA0NDFcdTA0NGYgXHUwNDQxIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzNVx1MDQzYlx1MDQzMC4gXG5cblx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDRiXHUwNDQyXHUwNDNhXHUwNDQzLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c9SVVQTDAxMDNFOiBcdTA0MWRcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmICcnezB9JycuXG5cblx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDNkXHUwNDQ3XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQ0Mlx1MDQzZVx1MDQ0N1x1MDQzYVx1MDQzZVx1MDQzOS4gXG5cblx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDRiXHUwNDQyXHUwNDNhXHUwNDQzLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2c9SVVQTDAxMDRFOiBcdTA0MWRcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmICcnezB9JycuXG5cblx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMyXHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzMlx1MDQzZVx1MDQzYlx1MDQ0YiBcXCAvIDogKiA/ICIgPCA+IDsgfFxuXG5cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDM1IFx1MDQzOFx1MDQzY1x1MDQ0ZiBcdTA0MzggXHUwNDNmXHUwNDNlXHUwNDMyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZS4NCi1ub0NvbmZpZ0Vycm9yX21zZz1JVVBMMDEwNUU6IFx1MDQxMiBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDNcdTA0NDlcdTA0MzVcdTA0MzkgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM1IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0M2RcdTA0MzVcdTA0NDIgXHUwNDNkXHUwNDM4IFx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLlxuXG5cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzZVx1MDQzMiBcdTA0NDJcdTA0NDBcdTA0MzVcdTA0MzFcdTA0NDNcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi5cblxuXHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0M2ZcdTA0NGJcdTA0NDJcdTA0M2FcdTA0NDMuDQotbm9EZWxpdmVyeVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDZFOiBcdTA0MTIgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDNkXHUwNDM1XHUwNDQyIFx1MDQzZFx1MDQzOCBcdTA0M2VcdTA0MzRcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzOC5cblxuXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwIFx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzMVx1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzOC5cblxuXHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MSBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzggXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUuDQotbm9EZWZhdWx0Q29uZmlnRXJyb3JfbXNnPUlVUEwwMTA3RTogXHUwNDFkXHUwNDM1IFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzMCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLlxuXG5cdTA0MWRcdTA0M2VcdTA0MzJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDQzIFx1MDQzZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzY1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlLlxuXG5cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0MzggXHUwNDNmXHUwNDNlXHUwNDMyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzZlx1MDQ0Ylx1MDQ0Mlx1MDQzYVx1MDQ0My4NCi1ub0Jhc2VQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA4RTogXHUwNDFkXHUwNDM1IFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDEgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDM4LlxuXG5cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2EgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDQzIFx1MDQzZFx1MDQ0M1x1MDQzNlx1MDQzNVx1MDQzZCBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzOC4gXG5cblx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDEgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDM4IFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlLg0KLWNyZWF0ZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDlFOiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDEgXHUwNDNkXHUwNDM1IFx1MDQzMVx1MDQ0Ylx1MDQzYiBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2QuDQotY3JlYXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMEU6IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2RcdTA0MzUgXHUwNDMxXHUwNDRiXHUwNDNiIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZC4NCi1kZWxldGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTExRTogXHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzZFx1MDQzNSBcdTA0MzFcdTA0NGJcdTA0M2IgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkLg0KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnPUlVUEwwMTEyRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAuXG5cblx1MDQyNFx1MDQzMFx1MDQzOVx1MDQzYiAnJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIuXG5cblx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDRiXHUwNDQyXHUwNDNhXHUwNDQzLg0KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3Jfc2ltcGxlX21zZz1cdTA0MjRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQ0MSBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0M2MgXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNjIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIuIFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmLg0KLXVuZG9Db21tYW5kRXJyb3JfbXNnPUlVUEwwMTEzRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNjXHUwNDMwXHUwNDNkXHUwNDM0XHUwNDQzIFx1MDQzZVx1MDQ0Mlx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0YiAnJ3swfScnLlxuXG5cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzA6IHsxfQ0KLWludmFsaWRQcmVkZWNlc3NvckVycm9yX21zZz1JVVBMMDExNEU6IFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0M2RcdTA0MzVcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDM0XHUwNDM1XHUwNDNhXHUwNDQxIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzOFx1MDQzYVx1MDQzMC5cblxuXHUwNDE4XHUwNDNkXHUwNDM0XHUwNDM1XHUwNDNhXHUwNDQxIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzOFx1MDQzYVx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzVcdTA0M2QgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQ0Nlx1MDQzNVx1MDQzYlx1MDQ0Ylx1MDQzYyBcdTA0NDdcdTA0MzhcdTA0NDFcdTA0M2JcdTA0M2VcdTA0M2MgXHUwNDM4XHUwNDM3IFx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQzMVx1MDQ0Nlx1MDQzMCAnXHUwNDE4XHUwNDNkXHUwNDM0XHUwNDM1XHUwNDNhXHUwNDQxJy5cblxuXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUuDQotVXNlckludGVyYWN0aW9uSGVscGVyX2VyclJlbGF0aW9uc2hpcEV4aXN0cz1JVVBMMDEwMFc6ICcnezB9JycgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0NDEgJyd7MX0nJy4gIFx1MDQxNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzMCBcdTA0NDJcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDNlXHUwNDM0XHUwNDNkXHUwNDMwIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQ0YyBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDMyXHUwNDM4XHUwNDM0XHUwNDMwLiBcdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDQyXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQ0N1x1MDQ0Mlx1MDQzZVx1MDQzMVx1MDQ0YiBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgJyd7MH0nJyBcdTA0NDEgJyd7Mn0nJywgXHUwNDQxXHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNiXHUwNDMwIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0NGMgXHUwNDQxICcnezF9JycuDQotZXJyb3JfbXNnV2l0aERldGFpbHM9SVVQTDAxMTZFOiBcdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAuIFx1MDQxNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzAgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2RcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNkXHUwNDNlXHUwNDNmXHUwNDNhXHUwNDQzIFx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1lcnJvcl9tc2c9SVVQTDAxMTdFOiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzhcdTA0MzdcdTA0M2VcdTA0NDhcdTA0M2JcdTA0MzAgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwLiBcdTA0MWZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzMCBcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDM1IFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzZVx1MDQzYS4NCi1TdXBwcmVzc2lvbl9uYW1lRHVwbGljYXRpb249SVVQTDAxMThFOiBcdTA0MmRcdTA0NDJcdTA0MzAgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0M2EgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDNiXHUwNDM4XHUwNDNhXHUwNDQyXHUwNDQzIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZC4gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRjXHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Zlx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNVx1MDQ0MVx1MDQ0ZiBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzAgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDRiXHUwNDQyXHUwNDNhXHUwNDQzDQotU3VwcHJlc3Npb25fcHJlc2VudGF0aW9uTmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE5RTogXHUwNDJkXHUwNDQyXHUwNDMwIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDNhIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzYlx1MDQzOFx1MDQzYVx1MDQ0Mlx1MDQ0MyBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2QuIFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Y1x1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGZcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzVcdTA0NDFcdTA0NGYgXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0M2ZcdTA0NGJcdTA0NDJcdTA0M2FcdTA0NDMNCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDQ4XHUwNDNiXHUwNDMwIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMC4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLXNhdmVQcm9jZXNzRXJyb3JfcmVhc29uPVx1MDQxZlx1MDQ0MFx1MDQzOCBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwICcnezB9JycgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDQ4XHUwNDNiXHUwNDMwIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMC4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLWRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb249XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNlXHUwNDNhLCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDQxIFx1MDQ0ZFx1MDQ0Mlx1MDQzOFx1MDQzYyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0M2MuIFx1MDQxNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzAgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2RcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNkXHUwNDNlXHUwNDNmXHUwNDNhXHUwNDQzIFx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1zYXZlRmlsZUVycm9yX3JlYXNvbj1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0MzAgJyd7MH0nJy4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLWludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uPVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwIFx1MDQ0MSBcdTA0M2RcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0M2NcdTA0MzggXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDMwXHUwNDNjXHUwNDM4LCBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2RcdTA0MzhcdTA0M2FcdTA0NDhcdTA0MzhcdTA0M2NcdTA0MzggXHUwNDMyIFx1MDQ0MFx1MDQzNVx1MDQzN1x1MDQ0M1x1MDQzYlx1MDQ0Y1x1MDQ0Mlx1MDQzMFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQzOFx1MDQzNyBcdTA0M2VcdTA0MzRcdTA0M2RcdTA0MzhcdTA0NDUgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM1XHUwNDM5IFx1MDQzMiBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0MzUuIFxuXHUwNDJkXHUwNDQyXHUwNDM4IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDRiLiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGM/DQotdW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbj1cdTA0MWRcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2UgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNVx1MDQzZVx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDI6IHswfShVUkkgPSB7MX0pezJ9DQotDQotIyBXYXJuaW5nIG1lc3NhZ2VzDQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE4VzogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2RcdTA0MzBcdTA0MzlcdTA0NDJcdTA0MzggXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNkIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0M2RcdTA0MzVcdTA0NDFcdTA0M2FcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzZVx1MDQzMi4gXHUwNDIxXHUwNDNlXHUwNDNlXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0YiBcdTA0MzhcdTA0MzcgXHUwNDNmXHUwNDMwXHUwNDNmXHUwNDNhXHUwNDM4IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzZVx1MDQzMiBcdTA0M2RcdTA0MzUgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQ0Yi4NCi1BY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE5VzogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2RcdTA0MzBcdTA0MzlcdTA0NDJcdTA0MzggXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNkIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0M2RcdTA0MzVcdTA0NDFcdTA0M2FcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzZVx1MDQzMi4gXHUwNDIxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mlx1MDQ0YiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0MzIgXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDRiIFx1MDQzZFx1MDQzNSBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIuDQotQWN0aXZpdHlEcm9wQ29tbWFuZF9kZWVwQ29weV9wcm9tcHRDb25maWd1cmF0aW9uTXNnPVx1MDQyMVx1MDQzYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NDFcdTA0MzUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiP1xuXG5cdTA0MWZcdTA0NDBcdTA0MzggXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDM1IFx1MDQxZFx1MDQzNVx1MDQ0MiBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDRiIFx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIsIFx1MDQ0Zlx1MDQzMlx1MDQzYlx1MDQ0Zlx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNVx1MDQ0MVx1MDQ0ZiBcdTA0NDdcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NGNcdTA0NGUgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1kZWVwQ29weV9wcm9tcHRNc2c9XHUwNDExXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0M2FcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0MzggXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDQ1IFx1MDQzNFx1MDQzOFx1MDQzZFx1MDQzMFx1MDQzY1x1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzOCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDMyXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzMVx1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2JcdTA0NGZcdTA0NDJcdTA0NGMuIFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQ0Yz8NCi1kZWVwQ29weV90aXRsZT1cdTA0MjBcdTA0MzVcdTA0M2FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotDQotIyBQcm9ncmVzcyBtZXNzYWdlcw0KLWNyZWF0aW5nUHJvY2Vzc0NvbXBvbmVudFRhc2tfbmFtZT1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMCAnJ3swfScnLi4uDQotcHJvY2Vzc2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9XHUwNDFlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDMwIFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzZVx1MDQzYS4uLg0KLWRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWU9XHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzZVx1MDQzMiBcdTA0MzggXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzZVx1MDQzMi4uLg0KLWNoZWNraW5nUmVmZXJlbmNlc1Rhc2tfbmFtZT1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2FcdTA0MzAgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNlXHUwNDNhLi4uDQotcmVtb3ZpbmdSZWZlcmVuY2VzdGFza19uYW1lPVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2VcdTA0M2EuLi4NCi1zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lPVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDNlXHUwNDMyLi4uDQotY2hlY2tBZmZlY3RlZFJlc291cmNlc1Rhc2tfbmFtZT1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2FcdTA0MzAgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzZVx1MDQzMi4uLg0KLW1vdmluZ1Rhc2tfbmFtZT1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0NDlcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUuLi4NCi1tb3ZpbmdGaWxlc1Rhc2tfbmFtZT1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0NDlcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDNlXHUwNDMyLi4uDQotY29weWluZ1Jlc291cmNlc1Rhc2tfbmFtZT1cdTA0MWFcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNlXHUwNDMyLi4uDQotc2F2aW5nRmlsZVRhc2tfbmFtZT1cdTA0MjFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDMwICcnezB9JycuLi4NCi0NCi0jIFVJIFRleHQNCi1lbGVtZW50X3RleHQ9XHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotY3JlYXRlRWxlbWVudF90ZXh0PVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDINCi1jcmVhdGVQcm9jZXNzX3RleHQ9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MQ0KLWNvbnRyaWJ1dGVzVG9fdGV4dD1cdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDINCi1sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dD1cdTA0MWJcdTA0M2VcdTA0M2FcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyDQotZXh0ZW5kc190ZXh0PVx1MDQyMFx1MDQzMFx1MDQ0MVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQ0Zlx1MDQzNVx1MDQ0Mg0KLXJlcGxhY2VzX3RleHQ9XHUwNDE3XHUwNDMwXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyDQotbG9jYWxSZXBsYWNlc190ZXh0PVx1MDQxYlx1MDQzZVx1MDQzYVx1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZSBcdTA0MzdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDINCi1sb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHlfdGV4dD1cdTA0MWJcdTA0M2VcdTA0M2FcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDM3XHUwNDMwXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDMwIFx1MDQzOCBcdTA0NDBcdTA0MzVcdTA0M2FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotZWxlbWVudFR5cGVfdGV4dD17MH06IHsxfQ0KLWRlbGl2ZXJhYmxlc190ZXh0PVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGINCi1jb250cmlidXRlVG9BY3Rpdml0eV90ZXh0PVx1MDQxZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1BY3Rpdml0eURyb3BDb21tYW5kX2xhYmVsPVx1MDQxZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1yZXBsYWNlQWN0aXZpdHlfdGV4dD1cdTA0MWVcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDM3XHUwNDMwXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRiDQotZmlsZV90ZXh0PVx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYg0KLWRpcmVjdG9yeV90ZXh0PVx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMw0KLXVucmVzb2x2ZWRfdGV4dD0oXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0MiAnJ3swfScnKQ0KLWFzc2lzdHNfdGV4dD1cdTA0MWZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0MzNcdTA0MzBcdTA0MzVcdTA0NDINCi11bmtub3duX3RleHQ9XHUwNDFkXHUwNDM1XHUwNDM4XHUwNDM3XHUwNDMyXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDNkXHUwNDNlDQotY29tbWFuZF9kb25lPVx1MDQxM1x1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQzMlx1MDQzZQ0KLQ0KLSMgVGhlIGZvbGxvd2luZyBVSSB0ZXh0IHNob3VsZCBiZSByZXZpZXdlZC4NCi1VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eXdpdGhwbHVnaW5faW5mbz17MH0gKHsxfSAnJ3syfScnIFx1MDQzMiAnJ3szfScnKQ0KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5X2luZm89ezB9ICh7MX0gJyd7Mn0nJykNCi11aV9yZWZfZGVsZXRlPVx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCAnJ3swfScnIFx1MDQ0MVx1MDQzZVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQ0MiBcdTA0M2RcdTA0MzVcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M2NcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4LlxuXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmOg0KLXVpX3JlZl9kZWxldGUyPVx1MDQyMVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDNkXHUwNDM4XHUwNDMzXHUwNDM0XHUwNDM1IFx1MDQzZFx1MDQzNSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NDNcdTA0NGVcdTA0NDJcdTA0NDFcdTA0NGYuXG5cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGY6DQotdWlfcmVmZXJlbmNlcz1cdTA0MjFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzgNCi11aV93b3JrcHJvZHVjdF9kZXNjcmlwdG9yX2Rlc2NyaXB0aW9uPVx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwICcnezB9JycgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkIChcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0NGZcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNlXHUwNDMxXHUwNDNlXHUwNDM5IFx1MDQzMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNCkgXHUwNDQxIFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzYyBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzggJyd7MX0nJw0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vcHRpb25zPVx1MDQxZlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQ0MFx1MDQ0Yg0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbD1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAgXHUwNDMyIFx1MDQzYVx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOA0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9kZWxldGVfdGFzaz1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOCBcdTA0MzhcdTA0MzcgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2RlZmF1bHRjb25maWdjaGVjaz1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyICcnezB9JycgXHUwNDNkXHUwNDM1IFx1MDQ0MVx1MDQzZVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0MzIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMCBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlLlxuXHUwNDE0XHUwNDNlXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzNVx1MDQzM1x1MDQzZSBcdTA0MzggXHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0MzIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZlx1MDQzZSBcdTA0NDNcdTA0M2NcdTA0M2VcdTA0M2JcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGU/DQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2dlbmVyaWNFcnJfbWVzc2FnZV90ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzZFx1MDQzOFx1MDQzYVx1MDQzYlx1MDQzMCBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAuIFx1MDQxNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzAgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2RcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNkXHUwNDNlXHUwNDNmXHUwNDNhXHUwNDQzIFx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX25vRGVzY3JpcHRvclRvU3luY2g9XHUwNDFkXHUwNDM1IFx1MDQzZFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzZCBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDQxXHUwNDNlIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzYyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDFcdTA0MzhcdTA0M2RcdTA0NDVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9yZWZlcnNoaW5ndmlld2VyPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMA0KLWNvbmZpcm1fcmVtb3ZlX3JlZmVyZW5jZXNfdGV4dD1cdTA0MWZcdTA0M2VcdTA0NDFcdTA0M2JcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzMiBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0NDdcdTA0MzhcdTA0NDFcdTA0M2JcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDQ1IFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzZFx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2RcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzZFx1MDQzMCBcdTA0NGRcdTA0NDJcdTA0M2UgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1LiBcdTA0MWRcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDFlXHUwNDFhLCBcdTA0NDdcdTA0NDJcdTA0M2VcdTA0MzFcdTA0NGIgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQ0NSBcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZS4NCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl91bmhhbmRsZWRfZXhjZXB0aW9uPVx1MDQxZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzMFx1MDQ0Mlx1MDQ0Ylx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzY1x1MDQzMFx1MDQ0ZiBcdTA0MzhcdTA0NDFcdTA0M2FcdTA0M2JcdTA0NGVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDQzXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9icmVha2Rvd25fZWxlbWVudD1cdTA0MWVcdTA0MzRcdTA0MzhcdTA0M2QgXHUwNDM4IFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0MzZcdTA0MzUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQ0YiBcdTA0M2RcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2VcdTA0MzRcdTA0M2RcdTA0M2VcdTA0MzJcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2RcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQ4XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDNjIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0M2MNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd3BsaXN0ZGxnX21zZz1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyICcnezB9JycgXHUwNDRmXHUwNDMyXHUwNDNiXHUwNDRmXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0Ylx1MDQzYyBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDQxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDQ1IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0Ny5cblx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgsIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0NDUgXHUwNDQxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0M2VcdTA0M2VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiLg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9yb2xlbGlzdGRsZ19tc2c9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDRjICcnezB9JycgXHUwNDQxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDQyIFx1MDQzZFx1MDQzOFx1MDQzNlx1MDQzNVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yi5cblx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiLCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDQ1IFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDNlXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Yi4NCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9mYXRhbGVycj1cdTA0MWRcdTA0MzVcdTA0NDNcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0M2NcdTA0MzBcdTA0NGYgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dvcmtwcm9kdWN0cz1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9zdWJfZWxlbWVudD1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDRiIFx1MDQ0MVx1MDQzZSBcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzhcdTA0M2MgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDNjDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudD1cdTA0MWNcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2UgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQ0YyBcdTA0NDJcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDQxIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQzY1x1MDQzOCBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0NGIgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmLg0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQ0YiBcdTA0NDEgXHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzZFx1MDQzOFx1MDQzYyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0M2MuDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3Rhc2tzPVx1MDQxN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOA0KLXVpX2Fzc29jaWF0aW9uX3Rhc2tfc2VsZWN0aW9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzZVx1MDQ0MCBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzguLi4NCi11dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlcj1cIFwgXHUwNDMwXHUwNDM0XHUwNDMwXHUwNDNmXHUwNDQyXHUwNDM1XHUwNDQwIFx1MDQzNFx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzZFx1MDQzNVx1MDQzM1x1MDQzZToNCi0NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zZXRwYXJlbnQ9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzRcdTA0M2VcdTA0NDdcdTA0MzVcdTA0NDBcdTA0M2RcdTA0MzVcdTA0MzNcdTA0M2UNCi11dGlsX3RuZ3V0aWxfY2Fubm90X2VkaXRfcmVzb3VyY2U9XHUwNDFkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDEuDQotdXRpbF9Qcm9jZXNzVXRpbF9jb250cmlidXRlc3RvPVx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0MiAnJ3swfScnDQotdXRpbF9Qcm9jZXNzVXRpbF9sb2NhbENvbnRyaWJ1dGVzdG89XHUwNDNiXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0MiAnJ3swfScnDQotcHJvY2Vzc19leHRlbmRzPVx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQ0Zlx1MDQzNVx1MDQ0MiAnJ3swfScnDQotcHJvY2Vzc19yZXBsYWNlcz1cdTA0MzdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDIgJyd7MH0nJw0KLXByb2Nlc3NfbG9jYWxSZXBsYWNlcz1cdTA0M2JcdTA0M2VcdTA0M2FcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDM3XHUwNDMwXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyICcnezB9JycNCi0jIEZpbHRlciBjb25zdGFudHMgZXh0ZXJuYWxpemVkIHN0cmluZ3MuDQotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVzX3RleHQ9XHUwNDE0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDRiDQotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVncm91cGluZ3NfdGV4dD1cdTA0MTNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGIgXHUwNDM0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkDQotRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ9XHUwNDE4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDNlXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzMVx1MDQ0ZVx1MDQzYlx1MDQzYlx1MDQzNVx1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQzOA0KLUZpbHRlckNvbnN0YW50c190b29sbWVudG9yc190ZXh0PVx1MDQyMFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDNjDQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ9XHUwNDE4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzX3RleHQ9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDM4DQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ9XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotRmlsdGVyQ29uc3RhbnRzX3JldXNhYmxlYXNzZXRzX3RleHQ9XHUwNDFjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQ0Yg0KLUZpbHRlckNvbnN0YW50c19hbGxfdGV4dD1cdTA0MTJcdTA0NDFcdTA0MzUNCi1GaWx0ZXJDb25zdGFudHNfcHJvY2Vzc2VzX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDRiDQotRmlsdGVyQ29uc3RhbnRzX3ByYWN0aWNlc190ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1GaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ9XHUwNDI4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkXHUwNDRiDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0c190ZXh0PVx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGINCi1GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0PVx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0NGINCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGVsaW5lc190ZXh0PVx1MDQyMFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLUZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0PVx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYNCi1GaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDZcdTA0MzVcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0MzgNCi1GaWx0ZXJDb25zdGFudHNfZXhhbXBsZXNfdGV4dD1cdTA0MWZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0NDBcdTA0NGINCi1GaWx0ZXJDb25zdGFudHNfY29udGVudHBhY2thZ2VzX3RleHQ9XHUwNDFmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDRiIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMg0KLUZpbHRlckNvbnN0YW50c19yb2xlZGVzY3JpcHRvcnNfdGV4dD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5DQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dD1cdTA0MTNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGIgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOQ0KLUZpbHRlckNvbnN0YW50c190YXNrZGVzY3JpcHRvcnNfdGV4dD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3DQotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRlbGVtZW50c190ZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzINCi1Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX3ByZXBhcmU9XHUwNDFmXHUwNDNlXHUwNDM0XHUwNDMzXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDMwIFx1MDQzYSBcdTA0NDFcdTA0MzhcdTA0M2RcdTA0NDVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguLi4NCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RkZXNjcmlwdG9yc190ZXh0PVx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0NDUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDMyDQotRmlsdGVyQ29uc3RhbnRzX2FsbGNvbnRlbnRlbGVtZW50c190ZXh0PVx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyDQotRmlsdGVyQ29uc3RhbnRzX3N1cHBvcnRpbmdtYXRlcmlhbHNfdGV4dD1cdTA0MjFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlcz1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzINCi1GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0PVx1MDQxZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzgNCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3R0eXBlc190ZXh0PVx1MDQyMlx1MDQzOFx1MDQzZlx1MDQ0YiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0NDUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDMyDQotRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZz1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDNlIFx1MDQ0MSBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDNcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGZcdTA0M2NcdTA0MzgNCi1GaWx0ZXJDb25zdGFudHNfbWV0aG9kcGx1Z2luc190ZXh0PVx1MDQxY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfbG9ja2VkUGx1Z2luPUlVUEwwMTIwRTogXHUwNDFjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjICcnezB9JycgXHUwNDM3XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNhXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkLg0KLUZpbHRlckNvbnN0YW50c19kb21haW5zX3RleHQ9XHUwNDE0XHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRiDQotRmlsdGVyQ29uc3RhbnRzX3JvYWRtYXBfdGV4dD1cdTA0MWZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0MzgNCi1GaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0PVx1MDQxZVx1MDQ0Mlx1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQ0Yg0KLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9Jlx1MDQyMVx1MDQzOFx1MDQzZFx1MDQ0NVx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzOFx1MDQzN1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlIFx1MDQzOFx1MDQzNyBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotTWFudWFsU3luY2hyb25pemVDb21tYW5kX2xhYmVsPSZcdTA0MWZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgXHUwNDQxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmLi4uDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWw9XHUwNDIxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzMCBcdTA0NDNcdTA0NDFcdTA0M2ZcdTA0MzVcdTA0NDhcdTA0M2RcdTA0M2UuDQotDQotIyBVc2VySW50ZXJhY3Rpb25IZWxwZXINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZT1cdTA0MThcdTA0M2NcdTA0NGY6DQotDQotIyBNZXRob2RDcmVhdGVDaGlsZENvbW1hbmQNCi1uZXdFbGVtZW50X3RleHQ9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIHswfQ0KLXVwZGF0ZV9vdXRvZnN5bmNoX3RpdGxlPVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0M2JcdTA0MzhcdTA0M2FcdTA0NDINCi11cGRhdGVfb3V0b2ZzeW5jaF9tc2c9XHUwNDI0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzOCBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDMyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzOSBcdTA0NDFcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzVcdTA0M2NcdTA0MzUuIFx1MDQxN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGY/DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjYzYzNDEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3MGJiYjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBMaWJyYXJ5IEVkaXQgKE5MMmEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZmVjMjJlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBiaWJsaW90ZWtzcmVkaWdlcmluZw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLV9VSV9Db250ZW50X2dyb3VwPU1ldG9kZWluZGhvbGQNCi0NCi1fVUlfRGlzY2lwbGluZXNfZ3JvdXA9RGlzY2lwbGluZXINCi1fVUlfRG9tYWluc19ncm91cD1Eb21cdTAwZTZuZXINCi1fVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cD1BcmJlamRzcHJvZHVrdHR5cGVyDQotX1VJX1JvbGVfU2V0c19ncm91cD1Sb2xsZXNcdTAwZTZ0DQotX1VJX1Rvb2xzX2dyb3VwPVZcdTAwZTZya3RcdTAwZjhqZXINCi1fVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cD1TdGFuZGFyZGthdGVnb3JpZXINCi1fVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXA9VGlscGFzc2VkZSBrYXRlZ29yaWVyDQotX1VJX01ldGhvZENvbnRlbnRfZ3JvdXA9SW5kaG9sZHNwYWtrZXINCi0NCi1fVUlfUHJvY2Vzc2VzX2dyb3VwPVByb2Nlc3Nlcg0KLV9VSV9QbGFubmluZ1RlbXBsYXRlc19ncm91cD1QbGFubFx1MDBlNmduaW5nc3NrYWJlbG9uZXINCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5zX3RleHQ9RnVua3Rpb25zbVx1MDBmOG5zdHJlDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ9TGV2ZXJpbmdzcHJvY2Vzc2VyDQotX1VJX1Byb2Nlc3NDb250cmlidXRpb25zX3RleHQ9Rm9yc2tlbHNwcm9jZXNzZXINCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dD1QbGFubFx1MDBlNmduaW5nc3NrYWJlbG9uZXINCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1GdW5rdGlvbnNtXHUwMGY4bnN0ZXINCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQ9TGV2ZXJpbmdzcHJvY2VzDQotX1VJX1Byb2Nlc3NDb250cmlidXRpb25fdGV4dD1Gb3Jza2Vsc3Byb2Nlcw0KLQ0KLV9VSV9Db25maWd1cmF0aW9uc190ZXh0PUtvbmZpZ3VyYXRpb25lcg0KLQ0KLV9VSV9Qcm9jZXNzRmFtaWxpZXNfdGV4dD1Qcm9jZXNmYW1pbGllcg0KLQ0KLV9VSV9VbmNhdGVnb3JpemVkX3RleHQ9VWthdGVnb3Jpc2VyZXQNCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PVVrYXRlZ29yaXNlcmVkZSBvcGdhdmVyDQotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1Va2F0YWdvcmlzZXJlZGUgcm9sbGVyDQotDQotX1VJX0d1aWRhbmNlc19ncm91cD1WZWpsZWRuaW5nDQotX1VJX0d1aWRhbmNlc19DaGVja2xpc3RzPVRqZWtsaXN0ZXINCi1fVUlfR3VpZGFuY2VzX0NvbmNlcHRzPUJlZ3JlYmVyDQotX1VJX0d1aWRhbmNlc19FeGFtcGxlcz1Fa3NlbXBsZXINCi1fVUlfR3VpZGFuY2VzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucz1Fc3RpbWVyaW5nc292ZXJ2ZWplbHNlcg0KLV9VSV9HdWlkYW5jZXNfUHJhY3RpY2VzPVx1MDBkOHZlbHNlcg0KLV9VSV9HdWlkYW5jZXNfUmVwb3J0cz1SYXBwb3J0ZXINCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPUdlbmFudmVuZGVsaWdlIGFrdGl2ZXINCi1fVUlfR3VpZGFuY2VzX1JvYWRtYXA9VmVqdmlzZXINCi1fVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHM9U3RcdTAwZjh0dGVtYXRlcmlhbGUNCi1fVUlfR3VpZGFuY2VzX1RlY2huaXF1ZXM9VGVrbmlra2VyDQotX1VJX0d1aWRhbmNlc19UZW1wbGF0ZXM9U2thYmVsb25lcg0KLV9VSV9HdWlkYW5jZXNfVGVybURlZmluaXRpb25zPVVkdHJ5a3NkZWZpbml0aW9uZXINCi1fVUlfR3VpZGFuY2VzX1Rvb2xNZW50b3JzPVZcdTAwZTZya3RcdTAwZjhqc21lbnRvcmVyDQotX1VJX0d1aWRhbmNlc19XaGl0ZXBhcGVycz1IdmlkYlx1MDBmOGdlcg0KLV9VSV9HdWlkYW5jZXNfV29ya1Byb2R1Y3RHdWlkZWxpbmVzPVJldG5pbmdzbGluamVyDQotDQotDQotX1VJX1JvbGVzX2dyb3VwPVJvbGxlcg0KLV9VSV9UYXNrc19ncm91cD1PcGdhdmVyDQotX1VJX1dvcmtQcm9kdWN0c19ncm91cD1BcmJlamRzcHJvZHVrdGVyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2FlNTc5NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEdlbmVyaWMgRGlhbG9nIFRpdGxlcw0KLW1vdmVEaWFsb2dfdGl0bGU9Rmx5dA0KLWRlbGV0ZURpYWxvZ190aXRsZT1TbGV0IGVsZW1lbnQNCi1lcnJvckRpYWxvZ190aXRsZT1GZWpsDQotZXJyb3JEaWFsb2dfY2Fubm90UmVuYW1lPUthbiBpa2tlIG9tZFx1MDBmOGJlIHswfSAnJ3sxfScnIHRpbCAnJ3syfScnLiBMXHUwMGY4cyBwcm9ibGVtZXQsIHNvbSBlciB2aXN0IGkgT3BseXNuaW5nZXIsIG9nIGtsaWsgcFx1MDBlNSBPSyBmb3IgYXQgZm9ydHNcdTAwZTZ0dGUgZWxsZXIgQW5udWxsXHUwMGU5ciBmb3IgYXQgYWZicnlkZSBmdW5rdGlvbmVuLg0KLQ0KLSMgQ29uZmlybSBSZWZlcmVuY2VzIFJlbW92YWwgRGlhbG9nDQotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190aXRsZT1CZWtyXHUwMGU2ZnQgZmplcm5lbHNlIGFmIHJlZmVyZW5jZXINCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RleHQ9QW5kcmUgZWxlbWVudGVyIGkgbWV0b2RlYmlibGlvdGVrZXQgcmVmZXJlcmVyIHN0YWRpZyB0aWwgZGV0IGVsbGVyIGRlIGVsZW1lbnRlciwgZHUgZXIgdmVkIGF0IHNsZXR0ZS4gSHZpcyBkdSBzbGV0dGVyIGVsZW1lbnRlcm5lLCBibGl2ZXIgcmVmZXJlbmNlcm5lIHRpbCBkZW0gZmplcm5ldCwgb2cgZGUgcmVmZXJlcmVuZGUgZWxlbWVudGVyIGJsaXZlciBkZXJmb3Igb2dzXHUwMGU1IG9wZGF0ZXJldC4gS29udHJvbGxcdTAwZTlyLCBhdCBkdSBoYXIgdGlsbGFkZWxzZSB0aWwgYXQgb3BkYXRlcmUgZGUgcmVmZXJlcmVuZGUgZWxlbWVudGVyLCBmXHUwMGY4ciBkdSBrbGlra2VyIHBcdTAwZTUgT0suIEtsaWsgcFx1MDBlNSBPcGx5c25pbmdlciBmb3IgYXQgZ2VubmVtc2UgbGlzdGVuIG92ZXIgZWxlbWVudGVyLCBzb20gcmVmZXJlcmVyIHRpbCBkZXQgZWxsZXIgZGUgZWxlbWVudGVyLCBkdSBlciB2ZWQgYXQgc2xldHRlLg0KLQ0KLSMgUmVzb2x2ZSBOYW1lIENvbmZsaWN0IERpYWxvZw0KLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGl0bGU9QWZrbGFyIGVsZW1lbnRuYXZuZWtvbmZsaWt0DQotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0PUFuZ2l2IGV0IG55dCB7MH0gZm9yICcnezF9Jyc6DQotDQotIyBTZWxlY3QgRGVsaXZlcmFibGVzIERpYWxvZw0KLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190aXRsZT1WXHUwMGU2bGcgbGV2ZXJhbmNlcg0KLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190ZXh0PVZcdTAwZTZsZyBlbiBsZXZlcmFuY2UsIGh2b3IgYXJiZWpkc3Byb2R1a3RldCAnJ3swfScnIHNrYWwgdGlsZGVsZXMuDQotDQotIyBOZXcgUHJvY2VzcyBDb21wb25lbnQgRGlhbG9nDQotbmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZT1OeSBwcm9jZXNrb21wb25lbnQNCi1uYW1lTGFiZWxfdGV4dD1OYXZuOg0KLWRlZmF1bHRDb25maWdMYWJlbF90ZXh0PVN0YW5kYXJka29uZmlndXJhdGlvbjoNCi1iYXNlUHJvY2Vzc0xhYmVsX3RleHQ9QmFzaXNwcm9jZXM6DQotYmFzZWRPblByb2Nlc3Nlc0xhYmVsX3RleHQ9QmFzZXJldCBwXHUwMGU1IHByb2Nlc3NlcjoNCi0NCi0jIFJvbGUgQXNzb2NpYXRpb24gRGlhbG9nDQotc2VsZWN0QXNzb2NpYXRpb25MYWJlbF90ZXh0PVZcdTAwZTZsZyB0aWxrbnl0bmluZyBmb3Igb3BnYXZlbiAnJ3swfScnDQotDQotIyBSZW1vdmUgQXNzb2NpYXRpb24gZGlhbG9nDQotcmVtb3ZlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD1GamVybiB0aWxrbnl0bmluZw0KLQ0KLSMgU2VsZWN0IFRlYW1zIERpYWxvZw0KLXNlbGVjdFRlYW1zRGlhbG9nX3RpdGxlPVZcdTAwZTZsZyB0ZWFtcw0KLXNlbGVjdFRlYW1zRGlhbG9nX3RleHQ9Vlx1MDBlNmxnIGV0IHRlYW0sIGh2b3Igcm9sbGVuICcnezB9Jycgc2thbCB0aWxkZWxlcy4NCi0NCi0jIFRhc2wgU2VsZWN0aW9uIERpYWxvZw0KLXRhc2tTZWxlY3Rpb25EaWFsb2dfdGl0bGU9T3BnYXZldmFsZw0KLXRpdGxlTGFiZWxfdGV4dD1WXHUwMGU2bGcgb3BnYXZlci4uLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAwRTogTmF2bmV0IHBcdTAwZTUgezB9IG1hbmdsZXIuXG5cbkFsbGUgbWV0b2RlLSBvZyBwcm9jZXNlbGVtZW50ZXIgc2thbCBoYXZlIGV0IG5hdm4uXG5cbkFuZ2l2IGV0IGd5bGRpZ3QgbmF2biwgb2cgcHJcdTAwZjh2IGlnZW4uDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9TmF2bmV0IHNrYWwgdWRmeWxkZXMuIEFuZ2l2IGV0IGd5bGRpZ3QgbmF2bi4NCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMUU6IE5hdm5ldCAnJ3swfScnIGZpbmRlcyBhbGxlcmVkZS5cblxuRXQgbWV0b2RlZWxlbWVudCBza2FsIGhhdmUgZXQgZW50eWRpZ3QgbmF2bi5cblxuQW5naXYgZXQgYW5kZXQgbmF2biwgb2cgcHJcdTAwZjh2IGlnZW4uDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPUVsZW1lbnRuYXZuZXQgZmluZGVzIGFsbGVyZWRlLiBBbmdpdiBldCBhbmRldCBuYXZuLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMV9tc2c9SVVQTDAxMDJFOiBOYXZuZXQgJyd7MH0nJyBlciB1Z3lsZGlndC5cblxuRXQgbWV0b2RlZWxlbWVudG5hdm4gbVx1MDBlNSBpa2tlIHN0YXJ0ZSBtZWQgZXQgbWVsbGVtcnVtLlxuXG5BbmdpdiBldCBneWxkaWd0IG5hdm4sIG9nIHByXHUwMGY4diBpZ2VuLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c9SVVQTDAxMDNFOiBOYXZuZXQgJyd7MH0nJyBlciB1Z3lsZGlndC5cblxuRXQgbWV0b2RlZWxlbWVudG5hdm4gbVx1MDBlNSBpa2tlIHNsdXR0ZSBtZWQgZXQgcHVua3R1bS5cblxuQW5naXYgZXQgZ3lsZGlndCBuYXZuLCBvZyBwclx1MDBmOHYgaWdlbi4NCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnPUlVUEwwMTA0RTogTmF2bmV0ICcnezB9JycgZXIgdWd5bGRpZ3QuXG5cbkV0IG1ldG9kZWVsZW1lbnRuYXZuIG1cdTAwZTUgaWtrZSBpbmRlaG9sZGUgZlx1MDBmOGxnZW5kZSB0ZWduOiBcXCAvIDogKiA/ICIgPCA+IDsgfFxuXG5BbmdpdiBldCBneWxkaWd0IG5hdm4sIG9nIHByXHUwMGY4diBpZ2VuLg0KLW5vQ29uZmlnRXJyb3JfbXNnPUlVUEwwMTA1RTogRGV0IGFrdHVlbGxlIG1ldG9kZWJpYmxpb3RlayBpbmRlaG9sZGVyIGluZ2VuIG1ldG9kZWtvbmZpZ3VyYXRpb24uXG5cbkRlciBza2FsIGJydWdlcyBlbiBtZXRvZGVrb25maWd1cmF0aW9uIHRpbCBhdCBvcHJldHRlIGVuIG55IHByb2Nlcy5cblxuT3ByZXQgZW4gbWV0b2Rla29uZmlndXJhdGlvbiwgb2cgcHJcdTAwZjh2IGlnZW4uDQotbm9EZWxpdmVyeVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDZFOiBEZXQgYWt0dWVsbGUgbWV0b2RlYmlibGlvdGVrIGluZGVob2xkZXIgaW5nZW4gbGV2ZXJpbmdzcHJvY2VzLlxuXG5EZXIgc2thbCBicnVnZXMgZW4gYmFzaXNsZXZlcmluZ3Nwcm9jZXMgdGlsIGF0IG9wcmV0dGUgZXQgbnl0IHByb2Nlc2JpZHJhZy5cblxuT3ByZXQgZW4gbGV2ZXJpbmdzcHJvY2VzLCBvZyBwclx1MDBmOHYgaWdlbi4NCi1ub0RlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQTDAxMDdFOiBEZXIgZXIgaWtrZSB2YWxndCBlbiBtZXRvZGVrb25maWd1cmF0aW9uLlxuXG5EZXIgc2thbCB0aWxkZWxlcyBlbiBzdGFuZGFyZG1ldG9kZWtvbmZpZ3VyYXRpb24gdGlsIGRlbiBueWUgcHJvY2VzLlxuXG5WXHUwMGU2bGcgZW4gbWV0b2Rla29uZmlndXJhdGlvbiwgb2cgcHJcdTAwZjh2IGlnZW4uDQotbm9CYXNlUHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwOEU6IERlciBlciBpa2tlIHZhbGd0IGVuIGxldmVyaW5nc3Byb2Nlcy5cblxuRXQgcHJvY2VzYmlkcmFnIGtyXHUwMGU2dmVyIGVuIGJhc2lzbGV2ZXJpbmdzcHJvY2VzLlxuXG5WXHUwMGU2bGcgZW4gbGV2ZXJpbmdzcHJvY2VzLCBvZyBwclx1MDBmOHYgaWdlbi4NCi1jcmVhdGVQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA5RTogUHJvY2Vzc2VuIGthbiBpa2tlIG9wcmV0dGVzLg0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9tc2c9SVVQTDAxMTBFOiBFbGVtZW50ZXQga2FuIGlra2Ugb3ByZXR0ZXMuDQotZGVsZXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMUU6IEVsZW1lbnRldCBrYW4gaWtrZSBzbGV0dGVzLg0KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnPUlVUEwwMTEyRTogSW5kaG9sZHNmaWxlbiBmb3IgZWxlbWVudGV0IGthbiBpa2tlIG9wcmV0dGVzLlxuXG5GaWxlbiAnJ3swfScnIGZpbmRlcyBhbGxlcmVkZS5cblxuQW5naXYgZXQgYW5kZXQgbmF2biwgb2cgcHJcdTAwZjh2IGlnZW4uDQotZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9zaW1wbGVfbXNnPUVuIGluZGhvbGRzZmlsIG1lZCBzYW1tZSBuYXZuIGZpbmRlcyBhbGxlcmVkZS4gQW5naXYgZXQgYW5kZXQgbmF2bi4NCi11bmRvQ29tbWFuZEVycm9yX21zZz1JVVBMMDExM0U6IEZvcnRyeWRlbHNlc2tvbW1hbmRvZW4gJyd7MH0nJyBrYW4gaWtrZSB1ZGZcdTAwZjhyZXMuXG5cbkRlciBlciBvcHN0XHUwMGU1ZXQgZW4gZmVqbDogezF9DQotaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnPUlVUEwwMTE0RTogRGV0IGFuZ2l2bmUgZm9yZ1x1MDBlNm5nZXJpbmRla3MgZXIgdWd5bGRpZ3QuXG5cbkV0IGZvcmdcdTAwZTZuZ2VyaW5kZWtzIHNrYWwgdlx1MDBlNnJlIGVuIGhlbHRhbHN2XHUwMGU2cmRpIGZyYSBrb2xvbm5lbiAnSW5kZWtzJy5cblxuQW5naXYgZW4gZ3lsZGlnIHZcdTAwZTZyZGksIG9nIHByXHUwMGY4diBpZ2VuLg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHM9SVVQTDAxMDBXOiAnJ3swfScnIGVyIGFsbGVyZWRlIGtueXR0ZXQgdGlsICcnezF9JycuIEt1biBcdTAwZTluIHRpbGtueXRuaW5nIGFmIGRlbm5lIHR5cGUgZXIgdGlsbGFkdC4gSHZpcyBkdSB2aWwga255dHRlICcnezB9JycgdGlsICcnezJ9JycsIHNrYWwgZHUgZlx1MDBmOHJzdCBmamVybmUgZGVuIGZyYSAnJ3sxfScnLg0KLWVycm9yX21zZ1dpdGhEZXRhaWxzPUlVUEwwMTE2RTogRGVyIGVyIG9wc3RcdTAwZTVldCBlbiBmZWpsLiBLbGlrIHBcdTAwZTUgT3BseXNuaW5nZXIgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuDQotZXJyb3JfbXNnPUlVUEwwMTE3RTogRGVyIGVyIG9wc3RcdTAwZTVldCBlbiBmZWpsLiBEZXIgZXIgZmxlcmUgb3BseXNuaW5nZXIgaSBmZWpsbG9nZ2VuLg0KLVN1cHByZXNzaW9uX25hbWVEdXBsaWNhdGlvbj1JVVBMMDExOEU6IERlciB2aWwgb3BzdFx1MDBlNSBlbiBuYXZuZWtvbmZsaWt0IGVmdGVyIGRlbm5lIGZ1bmt0aW9uLiBVbmRlcnNcdTAwZjhnLCBvbSBkZXIgZXIgc2FtbWVuZmFsZCBtaHQuIGVsZW1lbnRldHMgbmF2biwgb2cgcHJcdTAwZjh2IGlnZW4uDQotU3VwcHJlc3Npb25fcHJlc2VudGF0aW9uTmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE5RTogRGVyIHZpbCBvcHN0XHUwMGU1IGVuIG5hdm5la29uZmxpa3QgZWZ0ZXIgZGVubmUgZnVua3Rpb24uIFVuZGVyc1x1MDBmOGcsIG9tIGRlciBlciBzYW1tZW5mYWxkIG1odC4gZWxlbWVudGV0cyBwclx1MDBlNnNlbnRhdGlvbnNuYXZuLCBvZyBwclx1MDBmOHYgaWdlbi4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249RGVyIGVyIG9wc3RcdTAwZTVldCBlbiBmZWpsLiBLbGlrIHBcdTAwZTUgT3BseXNuaW5nZXIgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuDQotc2F2ZVByb2Nlc3NFcnJvcl9yZWFzb249RGVyIGVyIG9wc3RcdTAwZTVldCBlbiBmZWpsIHVuZGVyIGxhZ3JpbmcgYWYgcHJvY2Vzc2VuICcnezB9JycuIEtsaWsgcFx1MDBlNSBPcGx5c25pbmdlciBmb3IgYXQgZlx1MDBlNSBmbGVyZSBvcGx5c25pbmdlci4NCi1kZWxldGVSZWZlcmVuY2VzRXJyb3JfcmVhc29uPURlciBlciBvcHN0XHUwMGU1ZXQgZW4gZmVqbCB1bmRlciBmamVybmVsc2UgYWYgcmVmZXJlbmNlciwgZGVyIGVyIGtueXR0ZXQgdGlsIGRldHRlIGVsZW1lbnQuIEtsaWsgcFx1MDBlNSBPcGx5c25pbmdlciBmb3IgYXQgZlx1MDBlNSBmbGVyZSBvcGx5c25pbmdlci4NCi1zYXZlRmlsZUVycm9yX3JlYXNvbj1EZXIgZXIgb3BzdFx1MDBlNWV0IGVuIGZlamwgdW5kZXIgbGFncmluZyBhZiBmaWxlbiAnJ3swfScnLiBLbGlrIHBcdTAwZTUgT3BseXNuaW5nZXIgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuDQotaW52YWxpZFJlZmVyZW5jZXNFcnJvcl9yZWFzb249RGVyIGVyIGZ1bmRldCBtZXRvZGVlbGVtZW50ZXIgbWVkIHVneWxkaWdlIHJlZmVyZW5jZXIgc29tIGZcdTAwZjhsZ2UgYWYga29waWVyaW5nIHBcdTAwZTUgdHZcdTAwZTZycyBhZiBwbHVnaW5zLlxuUmVmZXJlbmNlcm5lIGJsaXZlciBmamVybmV0LiBWaWwgZHUgZm9ydHNcdTAwZTZ0dGU/DQotdW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbj1LYW4gaWtrZSBcdTAwZTZuZHJlIGV0IHVhZmtsYXJldCBvYmpla3Q6IHswfShVUkkgPSB7MX0pezJ9DQotDQotIyBXYXJuaW5nIG1lc3NhZ2VzDQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE4VzogRXQgZWxsZXIgZmxlcmUga2lsZGVlbGVtZW50ZXIgZmluZGVzIGlra2UuIFRpbGtueXR0ZWRlIGZpbGVyIGkgcmVzc291cmNlZm9sZGVyZW4gYmxpdmVyIGlra2Uga29waWVyZXQuDQotQWN0aXZpdHlBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZz1JVVBMMDExOVc6IEV0IGVsbGVyIGZsZXJlIGtpbGRlZWxlbWVudGVyIGZpbmRlcyBpa2tlLiBUaWxrbnl0dGVkZSBwcm9jZXNwYWtrZXIgYmxpdmVyIGlra2Uga29waWVyZXQuDQotQWN0aXZpdHlEcm9wQ29tbWFuZF9kZWVwQ29weV9wcm9tcHRDb25maWd1cmF0aW9uTXNnPVZpbCBkdSBrb3BpZXJlIGFsbGUgZGVza3JpcHRvcmVyP1xuXG5IdmlzIGR1IGtsaWtrZXIgcFx1MDBlNSBOZWosIGtvcGllcmVzIGt1biBkZSBkZXNrcmlwdG9yZXIsIGRlciBlciBkZWwgYWYgZGVuIGFrdHVlbGxlIGtvbmZpZ3VyYXRpb24uDQotZGVlcENvcHlfcHJvbXB0TXNnPUR1IG9wcmV0dGVyIGVuIGtvcGkgYWYgYWxsZSBkeW5hbWlzayBsaW5rZWRlIGVsZW1lbnRlciwgc29tIGR1IGZyZW1vdmVyIHNrYWwgdmVkbGlnZWhvbGRlIHNlcGFyYXQuIFZpbCBkdSBmb3J0c1x1MDBlNnR0ZT8NCi1kZWVwQ29weV90aXRsZT1EeWIga29waWVyaW5nDQotDQotIyBQcm9ncmVzcyBtZXNzYWdlcw0KLWNyZWF0aW5nUHJvY2Vzc0NvbXBvbmVudFRhc2tfbmFtZT1PcHJldHRlciBwcm9jZXNrb21wb25lbnRlbiAnJ3swfScnLi4uDQotcHJvY2Vzc2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9QmVoYW5kbGVyIHJlZmVyZW5jZXIuLi4NCi1kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lPVNsZXR0ZXIgZWxlbWVudGVyIG9nIHRpbGtueXR0ZWRlIGZpbGVyLi4uDQotY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lPVVuZGVyc1x1MDBmOGdlciByZWZlcmVuY2VyLi4uDQotcmVtb3ZpbmdSZWZlcmVuY2VzdGFza19uYW1lPUZqZXJuZXIgcmVmZXJlbmNlci4uLg0KLXNhdmluZ01vZGlmaWVkRmlsZXNUYXNrX25hbWU9R2VtbWVyIFx1MDBlNm5kcmVkZSBmaWxlci4uLg0KLWNoZWNrQWZmZWN0ZWRSZXNvdXJjZXNUYXNrX25hbWU9VW5kZXJzXHUwMGY4Z2VyIHBcdTAwZTV2aXJrZWRlIHJlc3NvdXJjZXIuLi4NCi1tb3ZpbmdUYXNrX25hbWU9Rmx5dHRlci4uLg0KLW1vdmluZ0ZpbGVzVGFza19uYW1lPUZseXR0ZXIgZmlsZXIuLi4NCi1jb3B5aW5nUmVzb3VyY2VzVGFza19uYW1lPUtvcGllcmVyIHJlc3NvdXJjZXIuLi4NCi1jb3B5aW5nQWN0aXZpdGllc19tc2c9S29waWVyZXIgYWt0aXZpdGV0ZW4gJyd7MH0nJw0KLXNhdmluZ0ZpbGVUYXNrX25hbWU9R2VtbWVyIGZpbGVuICcnezB9JycuLi4NCi0NCi0jIFVJIFRleHQNCi1lbGVtZW50X3RleHQ9ZWxlbWVudA0KLWNyZWF0ZUVsZW1lbnRfdGV4dD1PcHJldCBlbGVtZW50DQotY3JlYXRlUHJvY2Vzc190ZXh0PU9wcmV0IHByb2Nlcw0KLWNvbnRyaWJ1dGVzVG9fdGV4dD1CaWRyYWdlciB0aWwNCi1sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dD1CaWRyYWdlciBsb2thbHQgdGlsDQotZXh0ZW5kc190ZXh0PVVkdmlkZXINCi1yZXBsYWNlc190ZXh0PUVyc3RhdHRlcg0KLWxvY2FsUmVwbGFjZXNfdGV4dD1FcnN0YXR0ZXIgbG9rYWx0DQotbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5X3RleHQ9TG9rYWwgZXJzdGF0bmluZyBvZyBkeWIga29waWVyaW5nDQotZWxlbWVudFR5cGVfdGV4dD17MH06IHsxfQ0KLWRlbGl2ZXJhYmxlc190ZXh0PUxldmVyYW5jZXINCi1jb250cmlidXRlVG9BY3Rpdml0eV90ZXh0PUJpZHJhZyB0aWwgYWt0aXZpdGV0DQotQWN0aXZpdHlEcm9wQ29tbWFuZF9sYWJlbD1TbGV0IGFrdGl2aXRldA0KLXJlcGxhY2VBY3Rpdml0eV90ZXh0PUVyc3RhdCBha3Rpdml0ZXQNCi1maWxlX3RleHQ9ZmlsDQotZGlyZWN0b3J5X3RleHQ9YmlibGlvdGVrDQotdW5yZXNvbHZlZF90ZXh0PSh1bFx1MDBmOHN0ICcnezB9JycpDQotYXNzaXN0c190ZXh0PUhqXHUwMGU2bHBlcg0KLXVua25vd25fdGV4dD1Va2VuZHQNCi1jb21tYW5kX2RvbmU9VWRmXHUwMGY4cnQNCi0NCi0jIFRoZSBmb2xsb3dpbmcgVUkgdGV4dCBzaG91bGQgYmUgcmV2aWV3ZWQuDQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHl3aXRocGx1Z2luX2luZm89ezB9ICh7MX0gJyd7Mn0nJyBpICcnezN9JycpDQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHlfaW5mbz17MH0gKHsxfSAnJ3syfScnKQ0KLXVpX3JlZl9kZWxldGU9RGVza3JpcHRvcmVuICcnezB9JycgaGFyIGZcdTAwZjhsZ2VuZGUgcmVmZXJlbmNlciwgc29tIGlra2UgYnJ1Z2VzIG5vZ2VuIHN0ZWRlci5cblZcdTAwZTZsZyBkZW0sIGR1IHZpbCBzbGV0dGU6DQotdWlfcmVmX2RlbGV0ZTI9Rlx1MDBmOGxnZW5kZSByZWZlcmVuY2VyIGJydWdlcyBpbmdlbiBzdGVkZXIuXG5WXHUwMGU2bGcgZGVtLCBkdSB2aWwgc2xldHRlOg0KLXVpX3JlZmVyZW5jZXM9UmVmZXJlbmNlcg0KLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249QXJiZWpkc3Byb2R1a3RkZXNrcmlwdG9yZW4gJyd7MH0nJyBlciB0aWxrbnl0dGV0IChPdXRwdXQgZnJhKSBtZWQgb3BnYXZlZGVza3JpcHRvcmVuICcnezF9JycNCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3Jfb3B0aW9ucz1JbmRzdGlsbGluZ2VyDQotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX291dHB1dGxhYmVsPUZqZXJuIGFyYmVqZHNwcm9kdWt0ZGVza3JpcHRvciBzb20gb3V0cHV0IGZvciBvcGdhdmVkZXNrcmlwdG9yZW4NCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3JfZGVsZXRlX3Rhc2s9U2xldCBvcGdhdmVkZXNrcmlwdG9yIGZyYSBha3Rpdml0ZXRlbg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2s9RGVuIHZhbGd0ZSBlbGVtZW50ICcnezB9JycgZmluZGVzIGlra2UgaSBzdGFuZGFyZGtvbmZpZ3VyYXRpb25lbiBhZiBkaW4gcHJvY2VzLlxuVmlsIGR1IHRpbGZcdTAwZjhqZSBkZW4gb2cgZGVucyBhZmhcdTAwZTZuZ2lnaGVkZXIgdGlsIHN0YW5kYXJka29uZmlndXJhdGlvbmVuPw0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9nZW5lcmljRXJyX21lc3NhZ2VfdGV4dD1EZXIgZXIgb3BzdFx1MDBlNWV0IGZlamwgaSBmdW5rdGlvbmVuLiBLbGlrIHBcdTAwZTUgT3BseXNuaW5nZXIgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoPURlciBlciBpbmdlbiBkZXNrcmlwdG9yIG1lZCBsaW5rZXQgbWV0b2RlZWxlbWVudCwgc29tIGthbiBzeW5rcm9uaXNlcmVzLg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXI9RmVqbCB1bmRlciBvcGZyaXNrbmluZyBhZiBmcmVtdmlzZXINCi1jb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQ9RWxlbWVudChlciksIHNvbSBlciB2aXN0IHVuZGVyIE9wbHlzbmluZ2VyLCBrYW4gbXVsaWd2aXMgaGF2ZSB1Z3lsZGlnIHJlZmVyZW5jZSB0aWwgZGVubmUgdmVqbGVkbmluZyBlZnRlciBrb252ZXJ0ZXJpbmcuIEtsaWsgcFx1MDBlNSBPSyBmb3IgYXQgZmplcm5lIGRlbSBvZyBmb3J0c1x1MDBlNnR0ZS4NCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl91bmhhbmRsZWRfZXhjZXB0aW9uPVViZWhhbmRsZXQgdW5kdGFnZWxzZQ0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfYnJlYWtkb3duX2VsZW1lbnQ9S2FuIGlra2UgaGF2ZSBkZXQgc2FtbWUgbmVkYnJ5ZG5pbmdzZWxlbWVudCBzb20gZm9yZ1x1MDBlNm5nZXIgZWxsZXIgZWZ0ZXJmXHUwMGY4bGdlcg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93cGxpc3RkbGdfbXNnPUFyYmVqZHNwcm9kdWt0ZXQgJyd7MH0nJyBlciBldCBvdXRwdXQgdGlsIGZcdTAwZjhsZ2VuZGUgb3BnYXZlci5cblZcdTAwZTZsZyBkZSBvcGdhdmVyLCBzb20gZHUgdmlsIG9wcmV0dGUgZGUgdGlsc3ZhcmVuZGUgZGVza3JpcHRvcmVyIGZvci4NCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfcm9sZWxpc3RkbGdfbXNnPVJvbGxlbiAnJ3swfScnIGhhciBmXHUwMGY4bGdlbmRlIGFuc3ZhcmxpZ2UgYXJiZWpkc3Byb2R1a3Rlci5cblZcdTAwZTZsZyBkZSBhcmJlamRzcHJvZHVrdGVyLCBzb20gZHUgdmlsIG9wcmV0dGUgZGUgdGlsc3ZhcmVuZGUgZGVza3JpcHRvcmVyIGZvci4NCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9mYXRhbGVycj1Vb3ByZXR0ZWxpZyBmZWpsDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dvcmtwcm9kdWN0cz1BcmJlamRzcHJvZHVrdGVyDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9zdWJfZWxlbWVudD1LYW4gaWtrZSBsaW5rZSBldCBuZWRicnlkbmluZ3NlbGVtZW50IHRpbCBldCBhZiBkZXRzIHVuZGVyZWxlbWVudGVyDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudD1LYW4gaWtrZSBsaW5rZSB0aWwgZXQgYW5kZXQgZWxlbWVudCBlbmQgYXJiZWpkc25lZGJyeWRuaW5nc2VsZW1lbnRldC4NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9jaGlsZF9lbGVtZW50PUthbiBpa2tlIGxpbmtlIGV0IG5lZGJyeWRuaW5nc2VsZW1lbnQgdGlsIGVuIGFmIGRldHMgdW5kZXJvcmRuZWRlLg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrcz1PcGdhdmVyDQotdWlfYXNzb2NpYXRpb25fdGFza19zZWxlY3Rpb249T3BnYXZldmFsZy4uLg0KLXV0aWxfUHJvY2Vzc1V0aWxfY2hpbGRhZGFwdGVyPVwgXCB1bmRlcm9yZG5ldHMgYWRhcHRlcjoNCi0NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zZXRwYXJlbnQ9S2FuIGlra2UgYW5naXZlIG92ZXJvcmRuZXQgZm9yIHVuZGVyb3JkbmV0DQotdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlPUthbiBpa2tlIHJlZGlnZXJlIHJlc3NvdXJjZS4NCi11dGlsX1Byb2Nlc3NVdGlsX2NvbnRyaWJ1dGVzdG89YmlkcmFnZXIgdGlsICcnezB9JycNCi11dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bz1iaWRyYWdlciBsb2thbHQgdGlsICcnezB9JycNCi1wcm9jZXNzX2V4dGVuZHM9dWR2aWRlciAnJ3swfScnDQotcHJvY2Vzc19yZXBsYWNlcz1lcnN0YXR0ZXIgJyd7MH0nJw0KLXByb2Nlc3NfbG9jYWxSZXBsYWNlcz1lcnN0YXR0ZXIgJyd7MH0nJyBsb2thbHQNCi0jIEZpbHRlciBjb25zdGFudHMgZXh0ZXJuYWxpemVkIHN0cmluZ3MuDQotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVzX3RleHQ9RGlzY2lwbGluZXINCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZWdyb3VwaW5nc190ZXh0PURpc2NpcGxpbmdydXBwZXJpbmcNCi1GaWx0ZXJDb25zdGFudHNfd2hpdGVwYXBlcnNfdGV4dD1IdmlkYlx1MDBmOGdlcg0KLUZpbHRlckNvbnN0YW50c190b29sbWVudG9yc190ZXh0PVZcdTAwZTZya3RcdTAwZjhqc21lbnRvcmVyDQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ9Vlx1MDBlNnJrdFx1MDBmOGplcg0KLUZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0PVJvbGxlcg0KLUZpbHRlckNvbnN0YW50c190YXNrc190ZXh0PU9wZ2F2ZXINCi1GaWx0ZXJDb25zdGFudHNfcmV1c2FibGVhc3NldHNfdGV4dD1HZW5hbnZlbmRlbGlnZSBha3RpdmVyDQotRmlsdGVyQ29uc3RhbnRzX2FsbF90ZXh0PUFsbGUNCi1GaWx0ZXJDb25zdGFudHNfcHJvY2Vzc2VzX3RleHQ9UHJvY2Vzc2VyDQotRmlsdGVyQ29uc3RhbnRzX3ByYWN0aWNlc190ZXh0PVx1MDBkOHZlbHNlcg0KLUZpbHRlckNvbnN0YW50c190ZW1wbGF0ZXNfdGV4dD1Ta2FiZWxvbmVyDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0c190ZXh0PUFyYmVqZHNwcm9kdWt0ZXINCi1GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0PVRqZWtsaXN0ZXINCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGVsaW5lc190ZXh0PVJldG5pbmdzbGluamVyDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRzX3RleHQ9Um9sbGVzXHUwMGU2dA0KLUZpbHRlckNvbnN0YW50c19ndWlkYW5jZV90ZXh0PVZlamxlZG5pbmcNCi1GaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dD1CZWdyZWJlcg0KLUZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0PUVrc2VtcGxlcg0KLUZpbHRlckNvbnN0YW50c19jb250ZW50cGFja2FnZXNfdGV4dD1JbmRob2xkc3Bha2tlcg0KLUZpbHRlckNvbnN0YW50c19yb2xlZGVzY3JpcHRvcnNfdGV4dD1Sb2xsZWRlc2tyaXB0b3Jlcg0KLUZpbHRlckNvbnN0YW50c19yb2xlc2V0Z3JvcHVpbmdzX3RleHQ9Um9sbGVzXHUwMGU2dHNncnVwcGVyaW5nZXINCi1GaWx0ZXJDb25zdGFudHNfdGFza2Rlc2NyaXB0b3JzX3RleHQ9T3BnYXZlZGVza3JpcHRvcmVyDQotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRlbGVtZW50c190ZXh0PUluZGhvbGRzZWxlbWVudGVyDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9wcmVwYXJlPUZvcmJlcmVkZXIgc3lua3JvbmlzZXJpbmcuLi4NCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RkZXNjcmlwdG9yc190ZXh0PUFyYmVqZHNwcm9kdWt0ZGVza3JpcHRvcmVyDQotRmlsdGVyQ29uc3RhbnRzX2FsbGNvbnRlbnRlbGVtZW50c190ZXh0PUFsbGUgaW5kaG9sZHNlbGVtZW50ZXINCi1GaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0PVN0XHUwMGY4dHRlbWF0ZXJpYWxlDQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlcz1GZWpsIHVuZGVyIGxhZ3JpbmcgYWYgZmlsKGVyKQ0KLUZpbHRlckNvbnN0YW50c19jdXN0b21jYXRlZ29yaWVzX3RleHQ9VGlscGFzc2VkZSBrYXRlZ29yaWVyDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0dHlwZXNfdGV4dD1BcmJlamRzcHJvZHVrdHR5cGVyDQotRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZz1TbGV0bmluZyBlciB1ZGZcdTAwZjhydCBtZWQgYWR2YXJzZWwNCi1GaWx0ZXJDb25zdGFudHNfbWV0aG9kcGx1Z2luc190ZXh0PU1ldG9kZS1wbHVnaW5zDQotVXNlckludGVyYWN0aW9uSGVscGVyX2xvY2tlZFBsdWdpbj1JVVBMMDEyMEU6IFBsdWdpbicnZW4gJyd7MH0nJyBlciBsXHUwMGU1c3QuDQotRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dD1Eb21cdTAwZTZuZXINCi1GaWx0ZXJDb25zdGFudHNfcm9hZG1hcF90ZXh0PVZlanZpc2VyZQ0KLUZpbHRlckNvbnN0YW50c19yZXBvcnRzX3RleHQ9UmFwcG9ydGVyDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbD1TdGFuZGFyZHMmeW5rcm9uaXNlcmluZyBmcmEgbWV0b2RlaW5kaG9sZA0KLU1hbnVhbFN5bmNocm9uaXplQ29tbWFuZF9sYWJlbD0mVGlscGFzc2V0IHN5bmtyb25pc2VyaW5nLi4uDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWw9U3lua3JvbmlzZXJpbmcgZXIgdWRmXHUwMGY4cnQuDQotDQotIyBVc2VySW50ZXJhY3Rpb25IZWxwZXINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZT1OYXZuOiANCi0NCi0jIE1ldGhvZENyZWF0ZUNoaWxkQ29tbWFuZA0KLW5ld0VsZW1lbnRfdGV4dD1OeXQgezB9DQotdXBkYXRlX291dG9mc3luY2hfdGl0bGU9T3BkYXRlcmluZ3Nrb25mbGlrdA0KLXVwZGF0ZV9vdXRvZnN5bmNoX21zZz1GaWwoZXJuZSkgZXIgXHUwMGU2bmRyZXQgaSBmaWxzeXN0ZW1ldC4gVmlsIGR1IG92ZXJza3JpdmUgXHUwMGU2bmRyaW5nZXJuZT8NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTRmNmI2Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWQxN2UyMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDEuamFyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTZmYTk5ZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotc291cmNlLm5sMS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMS5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gbmwxLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGxheW91dC8sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0M2RlMWIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvZnJhZ21lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZnJhZ21lbnROYW1lPUVQRiBDb21wb3NlciBMaWJyYXJ5IChOTDEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvY29udGVudHBhZ2VfZGUuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9kZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzA1MTgzMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9kZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCA9IGZhbHNlOw0KLXZhciBmaXJzdFNlY3Rpb247DQotdmFyIGV4cGFuZEltYWdlOw0KLXZhciBjb2xsYXBzZUltYWdlOw0KLXZhciBleHBhbmRBbGxJbWFnZTsNCi12YXIgY29sbGFwc2VBbGxJbWFnZTsNCi12YXIgYmFja1RvVG9wSW1hZ2U7DQotdmFyIHNoaW1JbWFnZTsNCi12YXIgZXhwYW5kTWVzc2FnZSA9ICJBbGxlIEFic2Nobml0dHN0cnVrdHVyZW4gZWluYmxlbmRlbiI7DQotdmFyIGNvbGxhcHNlTWVzc2FnZSA9ICJBbGxlIEFic2Nobml0dHNzdHJ1a3R1cmVuIGF1c2JsZW5kZW4iOw0KLXZhciBiYWNrTWVzc2FnZSA9ICJTZWl0ZW5hbmZhbmciOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHNlY3Rpb24gbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlU2VjdGlvbkxpbmtzKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IsIGltZ1BhdGgpIHsNCi0JZXhwYW5kSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZC5naWYnOwkNCi0JY29sbGFwc2VJbWFnZSA9IGltZ1BhdGggKyAnY29sbGFwc2UuZ2lmJzsNCi0JZXhwYW5kQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJzsJDQotCWNvbGxhcHNlQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlX2FsbC5naWYnOw0KLQliYWNrVG9Ub3BJbWFnZSA9IGltZ1BhdGggKyAnYmFja190b190b3AuZ2lmJzsNCi0Jc2hpbUltYWdlID0gaW1nUGF0aCArICdzaGltLmdpZic7DQotCQ0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJdmFyIHNlY3Rpb25FbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOw0KLQkJdmFyIHRvdGFsTGlua3MgPSAwOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsNCi0JCQkJc2VjdGlvbkVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCXNlY3Rpb25FbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOw0KLQkJc2VjdGlvbkNvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJZmlyc3RTZWN0aW9uID0gc2VjdGlvbkVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7CQ0KLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOw0KLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsNCi0JCQkJdmFyIG5leHRFbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2kgKyAxXTsNCi0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwgJiYgbmV4dFNpYmxpbmcuY2xhc3NOYW1lICE9ICdjb3B5cmlnaHQnKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3Moc2VjdGlvbkVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCS8vIEFkZCBhIHNwYWNpbmcgYmV0d2VlbiB0aGUgc2VjdGlvbnMuDQotCQl2YXIgc2VjdGlvblNlcGFyYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJc2VjdGlvblNlcGFyYXRvci5zcmMgPSBzaGltSW1hZ2U7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmhlaWdodCA9ICczJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYm9yZGVyID0gJzAnOw0KLQkJc2VjdGlvblNlcGFyYXRvci5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzZWN0aW9uU2VwYXJhdG9yLCBlbGVtZW50KTsNCi0JCQ0KLQkJLy8gQWRkIGEgZXhwYW5kL2NvbGxhcHNlIGxpbmsgdG8gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTZWN0aW9uOw0KLQkJc2VjdGlvbkNvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotICAgIAkNCi0JCS8vIEFkZCBhIEJhY2sgVG8gVG9wIGxpbmsgaW4gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCWNyZWF0ZUJhY2tUb1RvcExpbmsoc2libGluZ0NvbnRhaW5lcik7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIEJhY2sgdG8gdG9wIGxpbmsuDQotZnVuY3Rpb24gY3JlYXRlQmFja1RvVG9wTGluayhlbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQ0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gYmFja1RvVG9wSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYmFja01lc3NhZ2UpKTsJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZGl2KTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50Lg0KLWZ1bmN0aW9uIGV4cGFuZENvbGxhcHNlU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTZWN0aW9ucyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGw7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZE1lc3NhZ2UpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7CQkJCQkJDQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGw7DQotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VNZXNzYWdlKSk7CQkJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJLyoNCi0JCXZhciBvdmVydmlld1NlcGFyYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdmVydmlld1NlcGFyYXRvciIpOw0KLQkJb3ZlcnZpZXdTZXBhcmF0b3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBvdmVydmlld1NlcGFyYXRvcik7DQotCQkqLw0KLQkJaWYgKGZpcnN0U2VjdGlvbiAhPSBudWxsKSB7DQotCQkJZmlyc3RTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTZWN0aW9uKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBleHBhbmRBbGwoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHNlY3Rpb25zLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gVGhpcyB0ZW1wb3JhcnkgZnVuY3Rpb24gaGVscHMgdG8gcmVzb2x2ZSBKYXZhc2NyaXB0IGVycm9ycyBpbiB0aGUgbWlncmF0ZWQgUlVQDQotLy8gY29udGVudCBwYWdlcy4gSXQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgLmpzIGZpbGVzIGFyZSBiZWluZw0KLS8vIG1pZ3JhdGVkIGFsb25nIHdpdGggdGhlIEhUTUwgY29udGVudCBwYWdlcy4NCi1mdW5jdGlvbiBSZWZlcmVuY2VIZWxwVG9waWMgKHRvcGljTmFtZSwgYm9vayAsIGZpbGVOYW1lKSB7DQotICAgZG9jdW1lbnQud3JpdGUoIjxpPiIrIHRvcGljTmFtZSArICI8XC9pPiIpOw0KLX0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9lcy5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX2VzLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MmZlYjVjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX2VzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0ID0gZmFsc2U7DQotdmFyIGZpcnN0U2VjdGlvbjsNCi12YXIgZXhwYW5kSW1hZ2U7DQotdmFyIGNvbGxhcHNlSW1hZ2U7DQotdmFyIGV4cGFuZEFsbEltYWdlOw0KLXZhciBjb2xsYXBzZUFsbEltYWdlOw0KLXZhciBiYWNrVG9Ub3BJbWFnZTsNCi12YXIgc2hpbUltYWdlOw0KLXZhciBleHBhbmRNZXNzYWdlID0gIkV4cGFuZGlyIHRvZGFzIGxhcyBzZWNjaW9uZXMiOw0KLXZhciBjb2xsYXBzZU1lc3NhZ2UgPSAiQ29udHJhZXIgdG9kYXMgbGFzIHNlY2Npb25lcyI7DQotdmFyIGJhY2tNZXNzYWdlID0gIlZvbHZlciBhbCBpbmljaW8iOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHNlY3Rpb24gbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlU2VjdGlvbkxpbmtzKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IsIGltZ1BhdGgpIHsNCi0JZXhwYW5kSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZC5naWYnOwkNCi0JY29sbGFwc2VJbWFnZSA9IGltZ1BhdGggKyAnY29sbGFwc2UuZ2lmJzsNCi0JZXhwYW5kQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJzsJDQotCWNvbGxhcHNlQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlX2FsbC5naWYnOw0KLQliYWNrVG9Ub3BJbWFnZSA9IGltZ1BhdGggKyAnYmFja190b190b3AuZ2lmJzsNCi0Jc2hpbUltYWdlID0gaW1nUGF0aCArICdzaGltLmdpZic7DQotCQ0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJdmFyIHNlY3Rpb25FbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOw0KLQkJdmFyIHRvdGFsTGlua3MgPSAwOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsNCi0JCQkJc2VjdGlvbkVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCXNlY3Rpb25FbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOw0KLQkJc2VjdGlvbkNvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJZmlyc3RTZWN0aW9uID0gc2VjdGlvbkVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7CQ0KLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOw0KLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsNCi0JCQkJdmFyIG5leHRFbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2kgKyAxXTsNCi0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwgJiYgbmV4dFNpYmxpbmcuY2xhc3NOYW1lICE9ICdjb3B5cmlnaHQnKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3Moc2VjdGlvbkVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCS8vIEFkZCBhIHNwYWNpbmcgYmV0d2VlbiB0aGUgc2VjdGlvbnMuDQotCQl2YXIgc2VjdGlvblNlcGFyYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJc2VjdGlvblNlcGFyYXRvci5zcmMgPSBzaGltSW1hZ2U7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmhlaWdodCA9ICczJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYm9yZGVyID0gJzAnOw0KLQkJc2VjdGlvblNlcGFyYXRvci5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzZWN0aW9uU2VwYXJhdG9yLCBlbGVtZW50KTsNCi0JCQ0KLQkJLy8gQWRkIGEgZXhwYW5kL2NvbGxhcHNlIGxpbmsgdG8gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTZWN0aW9uOw0KLQkJc2VjdGlvbkNvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotICAgIAkNCi0JCS8vIEFkZCBhIEJhY2sgVG8gVG9wIGxpbmsgaW4gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCWNyZWF0ZUJhY2tUb1RvcExpbmsoc2libGluZ0NvbnRhaW5lcik7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIEJhY2sgdG8gdG9wIGxpbmsuDQotZnVuY3Rpb24gY3JlYXRlQmFja1RvVG9wTGluayhlbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQ0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gYmFja1RvVG9wSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYmFja01lc3NhZ2UpKTsJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZGl2KTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50Lg0KLWZ1bmN0aW9uIGV4cGFuZENvbGxhcHNlU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTZWN0aW9ucyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGw7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZE1lc3NhZ2UpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7CQkJCQkJDQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGw7DQotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VNZXNzYWdlKSk7CQkJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJLyoNCi0JCXZhciBvdmVydmlld1NlcGFyYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdmVydmlld1NlcGFyYXRvciIpOw0KLQkJb3ZlcnZpZXdTZXBhcmF0b3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBvdmVydmlld1NlcGFyYXRvcik7DQotCQkqLw0KLQkJaWYgKGZpcnN0U2VjdGlvbiAhPSBudWxsKSB7DQotCQkJZmlyc3RTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTZWN0aW9uKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBleHBhbmRBbGwoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHNlY3Rpb25zLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gVGhpcyB0ZW1wb3JhcnkgZnVuY3Rpb24gaGVscHMgdG8gcmVzb2x2ZSBKYXZhc2NyaXB0IGVycm9ycyBpbiB0aGUgbWlncmF0ZWQgUlVQDQotLy8gY29udGVudCBwYWdlcy4gSXQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgLmpzIGZpbGVzIGFyZSBiZWluZw0KLS8vIG1pZ3JhdGVkIGFsb25nIHdpdGggdGhlIEhUTUwgY29udGVudCBwYWdlcy4NCi1mdW5jdGlvbiBSZWZlcmVuY2VIZWxwVG9waWMgKHRvcGljTmFtZSwgYm9vayAsIGZpbGVOYW1lKSB7DQotICAgZG9jdW1lbnQud3JpdGUoIjxpPiIrIHRvcGljTmFtZSArICI8XC9pPiIpOw0KLX0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9mci5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX2ZyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkODllNmExLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX2ZyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0ID0gZmFsc2U7DQotdmFyIGZpcnN0U2VjdGlvbjsNCi12YXIgZXhwYW5kSW1hZ2U7DQotdmFyIGNvbGxhcHNlSW1hZ2U7DQotdmFyIGV4cGFuZEFsbEltYWdlOw0KLXZhciBjb2xsYXBzZUFsbEltYWdlOw0KLXZhciBiYWNrVG9Ub3BJbWFnZTsNCi12YXIgc2hpbUltYWdlOw0KLXZhciBleHBhbmRNZXNzYWdlID0gIkTDqXZlbG9wcGVyIHRvdXRlcyBsZXMgc2VjdGlvbnMiOw0KLXZhciBjb2xsYXBzZU1lc3NhZ2UgPSAiQ29uZGVuc2VyIHRvdXRlcyBsZXMgc2VjdGlvbnMiOw0KLXZhciBiYWNrTWVzc2FnZSA9ICJIYXV0IGRlIHBhZ2UiOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHNlY3Rpb24gbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlU2VjdGlvbkxpbmtzKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IsIGltZ1BhdGgpIHsNCi0JZXhwYW5kSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZC5naWYnOwkNCi0JY29sbGFwc2VJbWFnZSA9IGltZ1BhdGggKyAnY29sbGFwc2UuZ2lmJzsNCi0JZXhwYW5kQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJzsJDQotCWNvbGxhcHNlQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlX2FsbC5naWYnOw0KLQliYWNrVG9Ub3BJbWFnZSA9IGltZ1BhdGggKyAnYmFja190b190b3AuZ2lmJzsNCi0Jc2hpbUltYWdlID0gaW1nUGF0aCArICdzaGltLmdpZic7DQotCQ0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJdmFyIHNlY3Rpb25FbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOw0KLQkJdmFyIHRvdGFsTGlua3MgPSAwOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsNCi0JCQkJc2VjdGlvbkVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCXNlY3Rpb25FbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOw0KLQkJc2VjdGlvbkNvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJZmlyc3RTZWN0aW9uID0gc2VjdGlvbkVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7CQ0KLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOw0KLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsNCi0JCQkJdmFyIG5leHRFbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2kgKyAxXTsNCi0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwgJiYgbmV4dFNpYmxpbmcuY2xhc3NOYW1lICE9ICdjb3B5cmlnaHQnKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3Moc2VjdGlvbkVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCS8vIEFkZCBhIHNwYWNpbmcgYmV0d2VlbiB0aGUgc2VjdGlvbnMuDQotCQl2YXIgc2VjdGlvblNlcGFyYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJc2VjdGlvblNlcGFyYXRvci5zcmMgPSBzaGltSW1hZ2U7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmhlaWdodCA9ICczJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYm9yZGVyID0gJzAnOw0KLQkJc2VjdGlvblNlcGFyYXRvci5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzZWN0aW9uU2VwYXJhdG9yLCBlbGVtZW50KTsNCi0JCQ0KLQkJLy8gQWRkIGEgZXhwYW5kL2NvbGxhcHNlIGxpbmsgdG8gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTZWN0aW9uOw0KLQkJc2VjdGlvbkNvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotICAgIAkNCi0JCS8vIEFkZCBhIEJhY2sgVG8gVG9wIGxpbmsgaW4gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCWNyZWF0ZUJhY2tUb1RvcExpbmsoc2libGluZ0NvbnRhaW5lcik7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIEJhY2sgdG8gdG9wIGxpbmsuDQotZnVuY3Rpb24gY3JlYXRlQmFja1RvVG9wTGluayhlbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQ0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gYmFja1RvVG9wSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYmFja01lc3NhZ2UpKTsJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZGl2KTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50Lg0KLWZ1bmN0aW9uIGV4cGFuZENvbGxhcHNlU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTZWN0aW9ucyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGw7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZE1lc3NhZ2UpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7CQkJCQkJDQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGw7DQotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VNZXNzYWdlKSk7CQkJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJLyoNCi0JCXZhciBvdmVydmlld1NlcGFyYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdmVydmlld1NlcGFyYXRvciIpOw0KLQkJb3ZlcnZpZXdTZXBhcmF0b3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBvdmVydmlld1NlcGFyYXRvcik7DQotCQkqLw0KLQkJaWYgKGZpcnN0U2VjdGlvbiAhPSBudWxsKSB7DQotCQkJZmlyc3RTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTZWN0aW9uKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBleHBhbmRBbGwoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHNlY3Rpb25zLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gVGhpcyB0ZW1wb3JhcnkgZnVuY3Rpb24gaGVscHMgdG8gcmVzb2x2ZSBKYXZhc2NyaXB0IGVycm9ycyBpbiB0aGUgbWlncmF0ZWQgUlVQDQotLy8gY29udGVudCBwYWdlcy4gSXQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgLmpzIGZpbGVzIGFyZSBiZWluZw0KLS8vIG1pZ3JhdGVkIGFsb25nIHdpdGggdGhlIEhUTUwgY29udGVudCBwYWdlcy4NCi1mdW5jdGlvbiBSZWZlcmVuY2VIZWxwVG9waWMgKHRvcGljTmFtZSwgYm9vayAsIGZpbGVOYW1lKSB7DQotICAgZG9jdW1lbnQud3JpdGUoIjxpPiIrIHRvcGljTmFtZSArICI8XC9pPiIpOw0KLX0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9pdC5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX2l0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNGU0Y2RlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX2l0LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0ID0gZmFsc2U7DQotdmFyIGZpcnN0U2VjdGlvbjsNCi12YXIgZXhwYW5kSW1hZ2U7DQotdmFyIGNvbGxhcHNlSW1hZ2U7DQotdmFyIGV4cGFuZEFsbEltYWdlOw0KLXZhciBjb2xsYXBzZUFsbEltYWdlOw0KLXZhciBiYWNrVG9Ub3BJbWFnZTsNCi12YXIgc2hpbUltYWdlOw0KLXZhciBleHBhbmRNZXNzYWdlID0gIkVzcGFuZGkgdHV0dGUgbGUgc2V6aW9uaSI7DQotdmFyIGNvbGxhcHNlTWVzc2FnZSA9ICJDb21wcmltaSB0dXR0ZSBsZSBzZXppb25pIjsNCi12YXIgYmFja01lc3NhZ2UgPSAiVG9ybmEgYWxsJ2luaXppbyI7DQotDQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc2VjdGlvbiBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVTZWN0aW9uTGlua3ModGFnTmFtZSwgY2xhc3NTZWxlY3RvciwgaW1nUGF0aCkgew0KLQlleHBhbmRJbWFnZSA9IGltZ1BhdGggKyAnZXhwYW5kLmdpZic7CQ0KLQljb2xsYXBzZUltYWdlID0gaW1nUGF0aCArICdjb2xsYXBzZS5naWYnOw0KLQlleHBhbmRBbGxJbWFnZSA9IGltZ1BhdGggKyAnZXhwYW5kX2FsbC5naWYnOwkNCi0JY29sbGFwc2VBbGxJbWFnZSA9IGltZ1BhdGggKyAnY29sbGFwc2VfYWxsLmdpZic7DQotCWJhY2tUb1RvcEltYWdlID0gaW1nUGF0aCArICdiYWNrX3RvX3RvcC5naWYnOw0KLQlzaGltSW1hZ2UgPSBpbWdQYXRoICsgJ3NoaW0uZ2lmJzsNCi0JDQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgew0KLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7DQotCQl2YXIgc2VjdGlvbkVsZW1lbnRzID0gbmV3IEFycmF5KGVsZW1lbnRzLmxlbmd0aCk7DQotCQl2YXIgdG90YWxMaW5rcyA9IDA7DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsNCi0JCQlpZiAoZWxlbWVudC5jbGFzc05hbWUgPT0gY2xhc3NTZWxlY3Rvcikgew0KLQkJCQlzZWN0aW9uRWxlbWVudHNbdG90YWxMaW5rcysrXSA9IGVsZW1lbnQ7DQotCQkJfQ0KLQkJfQ0KLQkJc2VjdGlvbkVsZW1lbnRzLmxlbmd0aCA9IHRvdGFsTGlua3M7DQotCQlzZWN0aW9uQ29sbGFwc2VEaXZzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJc2VjdGlvbkNvbGxhcHNlTGlua3MgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlmaXJzdFNlY3Rpb24gPSBzZWN0aW9uRWxlbWVudHNbMF07DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25FbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2ldOw0KLQkJCXZhciBzaWJsaW5nQ29udGFpbmVyOw0KLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsJDQotCQkJCXZhciBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dFNpYmxpbmc7DQotCQkJCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2libGluZ0NvbnRhaW5lciwgbmV4dFNpYmxpbmcpOw0KLQkJCQl2YXIgbmV4dEVsZW1lbnQgPSBzZWN0aW9uRWxlbWVudHNbaSArIDFdOw0KLQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbmV4dEVsZW1lbnQgJiYgbmV4dFNpYmxpbmcgIT0gbnVsbCAmJiBuZXh0U2libGluZy5jbGFzc05hbWUgIT0gJ2NvcHlyaWdodCcpIHsNCi0JCQkJCXZhciB0b01vdmUgPSBuZXh0U2libGluZzsNCi0JCQkJCW5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmcubmV4dFNpYmxpbmc7DQotCQkJCQlzaWJsaW5nQ29udGFpbmVyLmFwcGVuZENoaWxkKHRvTW92ZSk7DQotCQkJCX0NCi0JCQkJaWYgKGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsNCi0gICAgCQkJCXNpYmxpbmdDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0gICAgCQkJfQ0KLSAgICAJCQlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldID0gc2libGluZ0NvbnRhaW5lcjsNCi0gICAgCQkJY3JlYXRlQ29sbGFwc2libGVTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGkpOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCX0NCi0JCWNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU2VjdGlvbnNMaW5rcyhzZWN0aW9uRWxlbWVudHNbMF0pOw0KLQl9DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBjb2xsYXBzaWJsZSBzZWN0aW9uLg0KLWZ1bmN0aW9uIGNyZWF0ZUNvbGxhcHNpYmxlU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpbmRleCkgew0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkgew0KLQkJLy8gQWRkIGEgc3BhY2luZyBiZXR3ZWVuIHRoZSBzZWN0aW9ucy4NCi0JCXZhciBzZWN0aW9uU2VwYXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlzZWN0aW9uU2VwYXJhdG9yLnNyYyA9IHNoaW1JbWFnZTsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuaGVpZ2h0ID0gJzMnOw0KLQkJc2VjdGlvblNlcGFyYXRvci5ib3JkZXIgPSAnMCc7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNlY3Rpb25TZXBhcmF0b3IsIGVsZW1lbnQpOw0KLQkJDQotCQkvLyBBZGQgYSBleHBhbmQvY29sbGFwc2UgbGluayB0byB0aGUgc2VjdGlvbiBoZWFkaW5nLg0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY29sbGFwc2VEaXYgPSBzaWJsaW5nQ29udGFpbmVyOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpZiAoY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCkgew0KLQkJCWltYWdlLnNyYyA9IGV4cGFuZEltYWdlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JCX0NCi0JCWltYWdlLndpZHRoID0gJzE3JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNSc7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRDb2xsYXBzZVNlY3Rpb247DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpbmRleF0gPSBsaW5rOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuaW5zZXJ0QmVmb3JlKHNwYW4sIGVsZW1lbnQuZmlyc3RDaGlsZCk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0gICAgCQ0KLQkJLy8gQWRkIGEgQmFjayBUbyBUb3AgbGluayBpbiB0aGUgc2VjdGlvbiBoZWFkaW5nLg0KLQkJY3JlYXRlQmFja1RvVG9wTGluayhzaWJsaW5nQ29udGFpbmVyKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgQmFjayB0byB0b3AgbGluay4NCi1mdW5jdGlvbiBjcmVhdGVCYWNrVG9Ub3BMaW5rKGVsZW1lbnQpIHsNCi0JdmFyIGRpdjsNCi0JDQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsNCi0JCWRpdi5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlkaXYuYWxpZ24gPSAncmlnaHQnOw0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBiYWNrVG9Ub3BJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOwkJDQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShiYWNrTWVzc2FnZSkpOwkJDQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkaXYpOw0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgb3IgY29sbGFwc2VzIGEgc2VjdGlvbiBiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgZXZlbnQuDQotZnVuY3Rpb24gZXhwYW5kQ29sbGFwc2VTZWN0aW9uKGV2dCkgew0KLQlpZiAodGhpcy5jb2xsYXBzZURpdi5zdHlsZS5kaXNwbGF5ID09ICcnKSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWVsc2Ugew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ3JlYXRlcyB0aGUgRXhwYW5kIEFsbCBhbmQgQ29sbGFwc2UgQWxsIFNlY3Rpb25zIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU2VjdGlvbnNMaW5rcyhmaXJzdEVsZW1lbnQpIHsNCi0JdmFyIGRpdjsNCi0JCQ0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlkaXYuYWxpZ24gPSAncmlnaHQnOw0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBleHBhbmRBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOwkJDQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZEFsbDsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZXhwYW5kTWVzc2FnZSkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsJCQkJCQkNCi0JCQ0KLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGNvbGxhcHNlQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBjb2xsYXBzZUFsbDsNCi0JCXNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2xsYXBzZU1lc3NhZ2UpKTsJCQkJDQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJDQotCQkvKg0KLQkJdmFyIG92ZXJ2aWV3U2VwYXJhdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm92ZXJ2aWV3U2VwYXJhdG9yIik7DQotCQlvdmVydmlld1NlcGFyYXRvci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIG92ZXJ2aWV3U2VwYXJhdG9yKTsNCi0JCSovDQotCQlpZiAoZmlyc3RTZWN0aW9uICE9IG51bGwpIHsNCi0JCQlmaXJzdFNlY3Rpb24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBmaXJzdFNlY3Rpb24pOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgYWxsIHNlY3Rpb25zLg0KLWZ1bmN0aW9uIGV4cGFuZEFsbChldnQpIHsNCi0JIGZvciAodmFyIGkgPSAwOyBpIDwgc2VjdGlvbkNvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkgCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkgCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JIH0NCi0JIGlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCSAJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCSB9DQotCSByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENvbGxhcHNlcyBhbGwgc2VjdGlvbnMuDQotZnVuY3Rpb24gY29sbGFwc2VBbGwoZXZ0KSB7DQotCWZvciAodmFyIGkgPSAwOyBpIDwgc2VjdGlvbkNvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJc2VjdGlvbkNvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBUaGlzIHRlbXBvcmFyeSBmdW5jdGlvbiBoZWxwcyB0byByZXNvbHZlIEphdmFzY3JpcHQgZXJyb3JzIGluIHRoZSBtaWdyYXRlZCBSVVANCi0vLyBjb250ZW50IHBhZ2VzLiBJdCB3aWxsIGJlIHJlbW92ZWQgb25jZSB0aGUgY29ycmVzcG9uZGluZyAuanMgZmlsZXMgYXJlIGJlaW5nDQotLy8gbWlncmF0ZWQgYWxvbmcgd2l0aCB0aGUgSFRNTCBjb250ZW50IHBhZ2VzLg0KLWZ1bmN0aW9uIFJlZmVyZW5jZUhlbHBUb3BpYyAodG9waWNOYW1lLCBib29rICwgZmlsZU5hbWUpIHsNCi0gICBkb2N1bWVudC53cml0ZSgiPGk+IisgdG9waWNOYW1lICsgIjxcL2k+Iik7DQotfQ0KLQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX2phLmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvY29udGVudHBhZ2VfamEuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkZDI0ZjkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvY29udGVudHBhZ2VfamEuanMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotdmFyIGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQgPSBmYWxzZTsNCi12YXIgZmlyc3RTZWN0aW9uOw0KLXZhciBleHBhbmRJbWFnZTsNCi12YXIgY29sbGFwc2VJbWFnZTsNCi12YXIgZXhwYW5kQWxsSW1hZ2U7DQotdmFyIGNvbGxhcHNlQWxsSW1hZ2U7DQotdmFyIGJhY2tUb1RvcEltYWdlOw0KLXZhciBzaGltSW1hZ2U7DQotdmFyIGV4cGFuZE1lc3NhZ2UgPSAi44K744Kv44K344On44Oz44KS44GZ44G544Gm5bGV6ZaLIjsNCi12YXIgY29sbGFwc2VNZXNzYWdlID0gIuOCu+OCr+OCt+ODp+ODs+OCkuOBmeOBueOBpue4ruWwj+ihqOekuiAiOw0KLXZhciBiYWNrTWVzc2FnZSA9ICLkuIrjgavmiLvjgosgIjsNCi0NCi0vLyBDcmVhdGVzIHRoZSBjb2xsYXBzaWJsZSBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVNlY3Rpb25MaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yLCBpbWdQYXRoKSB7DQotCWV4cGFuZEltYWdlID0gaW1nUGF0aCArICdleHBhbmQuZ2lmJzsJDQotCWNvbGxhcHNlSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlLmdpZic7DQotCWV4cGFuZEFsbEltYWdlID0gaW1nUGF0aCArICdleHBhbmRfYWxsLmdpZic7CQ0KLQljb2xsYXBzZUFsbEltYWdlID0gaW1nUGF0aCArICdjb2xsYXBzZV9hbGwuZ2lmJzsNCi0JYmFja1RvVG9wSW1hZ2UgPSBpbWdQYXRoICsgJ2JhY2tfdG9fdG9wLmdpZic7DQotCXNoaW1JbWFnZSA9IGltZ1BhdGggKyAnc2hpbS5naWYnOw0KLQkNCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7DQotCQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsNCi0JCXZhciBzZWN0aW9uRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXNlY3Rpb25FbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlzZWN0aW9uRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U2VjdGlvbiA9IHNlY3Rpb25FbGVtZW50c1swXTsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgc2VjdGlvbkVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBzZWN0aW9uRWxlbWVudHNbaV07DQotCQkJdmFyIHNpYmxpbmdDb250YWluZXI7DQotCQkJaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKHNpYmxpbmdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkgJiYgc2libGluZ0NvbnRhaW5lci5zdHlsZSkgewkNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsICYmIG5leHRTaWJsaW5nLmNsYXNzTmFtZSAhPSAnY29weXJpZ2h0Jykgew0KLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOw0KLQkJCQkJbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy5uZXh0U2libGluZzsNCi0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsNCi0JCQkJfQ0KLQkJCQlpZiAoY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCkgew0KLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQl9DQotICAgIAkJCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOw0KLSAgICAJCQljcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKHNlY3Rpb25FbGVtZW50c1swXSk7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHNlY3Rpb24uDQotZnVuY3Rpb24gY3JlYXRlQ29sbGFwc2libGVTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4KSB7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7DQotCQkvLyBBZGQgYSBzcGFjaW5nIGJldHdlZW4gdGhlIHNlY3Rpb25zLg0KLQkJdmFyIHNlY3Rpb25TZXBhcmF0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCXNlY3Rpb25TZXBhcmF0b3Iuc3JjID0gc2hpbUltYWdlOw0KLQkJc2VjdGlvblNlcGFyYXRvci5oZWlnaHQgPSAnMyc7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmJvcmRlciA9ICcwJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2VjdGlvblNlcGFyYXRvciwgZWxlbWVudCk7DQotCQkNCi0JCS8vIEFkZCBhIGV4cGFuZC9jb2xsYXBzZSBsaW5rIHRvIHRoZSBzZWN0aW9uIGhlYWRpbmcuDQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotCQkJaW1hZ2Uuc3JjID0gZXhwYW5kSW1hZ2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkJfQ0KLQkJaW1hZ2Uud2lkdGggPSAnMTcnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZENvbGxhcHNlU2VjdGlvbjsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLSAgICAJDQotCQkvLyBBZGQgYSBCYWNrIFRvIFRvcCBsaW5rIGluIHRoZSBzZWN0aW9uIGhlYWRpbmcuDQotCQljcmVhdGVCYWNrVG9Ub3BMaW5rKHNpYmxpbmdDb250YWluZXIpOw0KLQl9DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBCYWNrIHRvIHRvcCBsaW5rLg0KLWZ1bmN0aW9uIGNyZWF0ZUJhY2tUb1RvcExpbmsoZWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGJhY2tUb1RvcEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGJhY2tNZXNzYWdlKSk7CQkNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRpdik7DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBvciBjb2xsYXBzZXMgYSBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVNlY3Rpb24oZXZ0KSB7DQotCWlmICh0aGlzLmNvbGxhcHNlRGl2LnN0eWxlLmRpc3BsYXkgPT0gJycpIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JZWxzZSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU2VjdGlvbnMgbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKGZpcnN0RWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQkJDQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsNCi0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGV4cGFuZEFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQWxsOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShleHBhbmRNZXNzYWdlKSk7DQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwkJCQkJCQ0KLQkJDQotCQlpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGNvbGxhcHNlQWxsOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlTWVzc2FnZSkpOwkJCQkNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQkNCi0JCS8qDQotCQl2YXIgb3ZlcnZpZXdTZXBhcmF0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3ZlcnZpZXdTZXBhcmF0b3IiKTsNCi0JCW92ZXJ2aWV3U2VwYXJhdG9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgb3ZlcnZpZXdTZXBhcmF0b3IpOw0KLQkJKi8NCi0JCWlmIChmaXJzdFNlY3Rpb24gIT0gbnVsbCkgew0KLQkJCWZpcnN0U2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGZpcnN0U2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc2VjdGlvbnMuDQotZnVuY3Rpb24gZXhwYW5kQWxsKGV2dCkgew0KLQkgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCSAJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCSAJc2VjdGlvbkNvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkgfQ0KLQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JIAlldnQucHJldmVudERlZmF1bHQoKTsNCi0JIH0NCi0JIHJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ29sbGFwc2VzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBjb2xsYXBzZUFsbChldnQpIHsNCi0JZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCQlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIFRoaXMgdGVtcG9yYXJ5IGZ1bmN0aW9uIGhlbHBzIHRvIHJlc29sdmUgSmF2YXNjcmlwdCBlcnJvcnMgaW4gdGhlIG1pZ3JhdGVkIFJVUA0KLS8vIGNvbnRlbnQgcGFnZXMuIEl0IHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZSBjb3JyZXNwb25kaW5nIC5qcyBmaWxlcyBhcmUgYmVpbmcNCi0vLyBtaWdyYXRlZCBhbG9uZyB3aXRoIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuDQotZnVuY3Rpb24gUmVmZXJlbmNlSGVscFRvcGljICh0b3BpY05hbWUsIGJvb2sgLCBmaWxlTmFtZSkgew0KLSAgIGRvY3VtZW50LndyaXRlKCI8aT4iKyB0b3BpY05hbWUgKyAiPFwvaT4iKTsNCi19DQotDQotDQotDQotDQotDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvY29udGVudHBhZ2Vfa28uanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9rby5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjc1MGU3OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9rby5qcworKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCA9IGZhbHNlOw0KLXZhciBmaXJzdFNlY3Rpb247DQotdmFyIGV4cGFuZEltYWdlOw0KLXZhciBjb2xsYXBzZUltYWdlOw0KLXZhciBleHBhbmRBbGxJbWFnZTsNCi12YXIgY29sbGFwc2VBbGxJbWFnZTsNCi12YXIgYmFja1RvVG9wSW1hZ2U7DQotdmFyIHNoaW1JbWFnZTsNCi12YXIgZXhwYW5kTWVzc2FnZSA9ICLrqqjrk6Ag7IS57IWYIO2OvOy5mOq4sCI7DQotdmFyIGNvbGxhcHNlTWVzc2FnZSA9ICLrqqjrk6Ag7IS57IWYIOygkeq4sCI7DQotdmFyIGJhY2tNZXNzYWdlID0gIuunqCDsnITroZwiOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHNlY3Rpb24gbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlU2VjdGlvbkxpbmtzKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IsIGltZ1BhdGgpIHsNCi0JZXhwYW5kSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZC5naWYnOwkNCi0JY29sbGFwc2VJbWFnZSA9IGltZ1BhdGggKyAnY29sbGFwc2UuZ2lmJzsNCi0JZXhwYW5kQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJzsJDQotCWNvbGxhcHNlQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlX2FsbC5naWYnOw0KLQliYWNrVG9Ub3BJbWFnZSA9IGltZ1BhdGggKyAnYmFja190b190b3AuZ2lmJzsNCi0Jc2hpbUltYWdlID0gaW1nUGF0aCArICdzaGltLmdpZic7DQotCQ0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJdmFyIHNlY3Rpb25FbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOw0KLQkJdmFyIHRvdGFsTGlua3MgPSAwOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsNCi0JCQkJc2VjdGlvbkVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCXNlY3Rpb25FbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOw0KLQkJc2VjdGlvbkNvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJZmlyc3RTZWN0aW9uID0gc2VjdGlvbkVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7CQ0KLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOw0KLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsNCi0JCQkJdmFyIG5leHRFbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2kgKyAxXTsNCi0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwgJiYgbmV4dFNpYmxpbmcuY2xhc3NOYW1lICE9ICdjb3B5cmlnaHQnKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3Moc2VjdGlvbkVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCS8vIEFkZCBhIHNwYWNpbmcgYmV0d2VlbiB0aGUgc2VjdGlvbnMuDQotCQl2YXIgc2VjdGlvblNlcGFyYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJc2VjdGlvblNlcGFyYXRvci5zcmMgPSBzaGltSW1hZ2U7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmhlaWdodCA9ICczJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYm9yZGVyID0gJzAnOw0KLQkJc2VjdGlvblNlcGFyYXRvci5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzZWN0aW9uU2VwYXJhdG9yLCBlbGVtZW50KTsNCi0JCQ0KLQkJLy8gQWRkIGEgZXhwYW5kL2NvbGxhcHNlIGxpbmsgdG8gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTZWN0aW9uOw0KLQkJc2VjdGlvbkNvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotICAgIAkNCi0JCS8vIEFkZCBhIEJhY2sgVG8gVG9wIGxpbmsgaW4gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCWNyZWF0ZUJhY2tUb1RvcExpbmsoc2libGluZ0NvbnRhaW5lcik7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIEJhY2sgdG8gdG9wIGxpbmsuDQotZnVuY3Rpb24gY3JlYXRlQmFja1RvVG9wTGluayhlbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQ0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gYmFja1RvVG9wSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYmFja01lc3NhZ2UpKTsJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZGl2KTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50Lg0KLWZ1bmN0aW9uIGV4cGFuZENvbGxhcHNlU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTZWN0aW9ucyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGw7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZE1lc3NhZ2UpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7CQkJCQkJDQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGw7DQotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VNZXNzYWdlKSk7CQkJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJLyoNCi0JCXZhciBvdmVydmlld1NlcGFyYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdmVydmlld1NlcGFyYXRvciIpOw0KLQkJb3ZlcnZpZXdTZXBhcmF0b3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBvdmVydmlld1NlcGFyYXRvcik7DQotCQkqLw0KLQkJaWYgKGZpcnN0U2VjdGlvbiAhPSBudWxsKSB7DQotCQkJZmlyc3RTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTZWN0aW9uKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBleHBhbmRBbGwoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHNlY3Rpb25zLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gVGhpcyB0ZW1wb3JhcnkgZnVuY3Rpb24gaGVscHMgdG8gcmVzb2x2ZSBKYXZhc2NyaXB0IGVycm9ycyBpbiB0aGUgbWlncmF0ZWQgUlVQDQotLy8gY29udGVudCBwYWdlcy4gSXQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgLmpzIGZpbGVzIGFyZSBiZWluZw0KLS8vIG1pZ3JhdGVkIGFsb25nIHdpdGggdGhlIEhUTUwgY29udGVudCBwYWdlcy4NCi1mdW5jdGlvbiBSZWZlcmVuY2VIZWxwVG9waWMgKHRvcGljTmFtZSwgYm9vayAsIGZpbGVOYW1lKSB7DQotICAgZG9jdW1lbnQud3JpdGUoIjxpPiIrIHRvcGljTmFtZSArICI8XC9pPiIpOw0KLX0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9wdF9CUi5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX3B0X0JSLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YWY2MGRhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX3B0X0JSLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0ID0gZmFsc2U7DQotdmFyIGZpcnN0U2VjdGlvbjsNCi12YXIgZXhwYW5kSW1hZ2U7DQotdmFyIGNvbGxhcHNlSW1hZ2U7DQotdmFyIGV4cGFuZEFsbEltYWdlOw0KLXZhciBjb2xsYXBzZUFsbEltYWdlOw0KLXZhciBiYWNrVG9Ub3BJbWFnZTsNCi12YXIgc2hpbUltYWdlOw0KLXZhciBleHBhbmRNZXNzYWdlID0gIkV4cGFuZGlyIFRvZGFzIGFzIFNlw6fDtWVzIjsNCi12YXIgY29sbGFwc2VNZXNzYWdlID0gIlJlZHV6aXIgVG9kYXMgYXMgU2XDp8O1ZXMiOw0KLXZhciBiYWNrTWVzc2FnZSA9ICJWb2x0YXIgYW8gSW7DrWNpbyBkYSBQw6FnaW5hIjsNCi0NCi0vLyBDcmVhdGVzIHRoZSBjb2xsYXBzaWJsZSBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVNlY3Rpb25MaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yLCBpbWdQYXRoKSB7DQotCWV4cGFuZEltYWdlID0gaW1nUGF0aCArICdleHBhbmQuZ2lmJzsJDQotCWNvbGxhcHNlSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlLmdpZic7DQotCWV4cGFuZEFsbEltYWdlID0gaW1nUGF0aCArICdleHBhbmRfYWxsLmdpZic7CQ0KLQljb2xsYXBzZUFsbEltYWdlID0gaW1nUGF0aCArICdjb2xsYXBzZV9hbGwuZ2lmJzsNCi0JYmFja1RvVG9wSW1hZ2UgPSBpbWdQYXRoICsgJ2JhY2tfdG9fdG9wLmdpZic7DQotCXNoaW1JbWFnZSA9IGltZ1BhdGggKyAnc2hpbS5naWYnOw0KLQkNCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7DQotCQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsNCi0JCXZhciBzZWN0aW9uRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXNlY3Rpb25FbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlzZWN0aW9uRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U2VjdGlvbiA9IHNlY3Rpb25FbGVtZW50c1swXTsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgc2VjdGlvbkVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBzZWN0aW9uRWxlbWVudHNbaV07DQotCQkJdmFyIHNpYmxpbmdDb250YWluZXI7DQotCQkJaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKHNpYmxpbmdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkgJiYgc2libGluZ0NvbnRhaW5lci5zdHlsZSkgewkNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsICYmIG5leHRTaWJsaW5nLmNsYXNzTmFtZSAhPSAnY29weXJpZ2h0Jykgew0KLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOw0KLQkJCQkJbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy5uZXh0U2libGluZzsNCi0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsNCi0JCQkJfQ0KLQkJCQlpZiAoY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCkgew0KLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQl9DQotICAgIAkJCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOw0KLSAgICAJCQljcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKHNlY3Rpb25FbGVtZW50c1swXSk7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHNlY3Rpb24uDQotZnVuY3Rpb24gY3JlYXRlQ29sbGFwc2libGVTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4KSB7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7DQotCQkvLyBBZGQgYSBzcGFjaW5nIGJldHdlZW4gdGhlIHNlY3Rpb25zLg0KLQkJdmFyIHNlY3Rpb25TZXBhcmF0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCXNlY3Rpb25TZXBhcmF0b3Iuc3JjID0gc2hpbUltYWdlOw0KLQkJc2VjdGlvblNlcGFyYXRvci5oZWlnaHQgPSAnMyc7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmJvcmRlciA9ICcwJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2VjdGlvblNlcGFyYXRvciwgZWxlbWVudCk7DQotCQkNCi0JCS8vIEFkZCBhIGV4cGFuZC9jb2xsYXBzZSBsaW5rIHRvIHRoZSBzZWN0aW9uIGhlYWRpbmcuDQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotCQkJaW1hZ2Uuc3JjID0gZXhwYW5kSW1hZ2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkJfQ0KLQkJaW1hZ2Uud2lkdGggPSAnMTcnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZENvbGxhcHNlU2VjdGlvbjsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLSAgICAJDQotCQkvLyBBZGQgYSBCYWNrIFRvIFRvcCBsaW5rIGluIHRoZSBzZWN0aW9uIGhlYWRpbmcuDQotCQljcmVhdGVCYWNrVG9Ub3BMaW5rKHNpYmxpbmdDb250YWluZXIpOw0KLQl9DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBCYWNrIHRvIHRvcCBsaW5rLg0KLWZ1bmN0aW9uIGNyZWF0ZUJhY2tUb1RvcExpbmsoZWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGJhY2tUb1RvcEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGJhY2tNZXNzYWdlKSk7CQkNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRpdik7DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBvciBjb2xsYXBzZXMgYSBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVNlY3Rpb24oZXZ0KSB7DQotCWlmICh0aGlzLmNvbGxhcHNlRGl2LnN0eWxlLmRpc3BsYXkgPT0gJycpIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JZWxzZSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU2VjdGlvbnMgbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKGZpcnN0RWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQkJDQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsNCi0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGV4cGFuZEFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQWxsOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShleHBhbmRNZXNzYWdlKSk7DQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwkJCQkJCQ0KLQkJDQotCQlpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGNvbGxhcHNlQWxsOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlTWVzc2FnZSkpOwkJCQkNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQkNCi0JCS8qDQotCQl2YXIgb3ZlcnZpZXdTZXBhcmF0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3ZlcnZpZXdTZXBhcmF0b3IiKTsNCi0JCW92ZXJ2aWV3U2VwYXJhdG9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgb3ZlcnZpZXdTZXBhcmF0b3IpOw0KLQkJKi8NCi0JCWlmIChmaXJzdFNlY3Rpb24gIT0gbnVsbCkgew0KLQkJCWZpcnN0U2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGZpcnN0U2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc2VjdGlvbnMuDQotZnVuY3Rpb24gZXhwYW5kQWxsKGV2dCkgew0KLQkgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCSAJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCSAJc2VjdGlvbkNvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkgfQ0KLQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JIAlldnQucHJldmVudERlZmF1bHQoKTsNCi0JIH0NCi0JIHJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ29sbGFwc2VzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBjb2xsYXBzZUFsbChldnQpIHsNCi0JZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCQlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIFRoaXMgdGVtcG9yYXJ5IGZ1bmN0aW9uIGhlbHBzIHRvIHJlc29sdmUgSmF2YXNjcmlwdCBlcnJvcnMgaW4gdGhlIG1pZ3JhdGVkIFJVUA0KLS8vIGNvbnRlbnQgcGFnZXMuIEl0IHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZSBjb3JyZXNwb25kaW5nIC5qcyBmaWxlcyBhcmUgYmVpbmcNCi0vLyBtaWdyYXRlZCBhbG9uZyB3aXRoIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuDQotZnVuY3Rpb24gUmVmZXJlbmNlSGVscFRvcGljICh0b3BpY05hbWUsIGJvb2sgLCBmaWxlTmFtZSkgew0KLSAgIGRvY3VtZW50LndyaXRlKCI8aT4iKyB0b3BpY05hbWUgKyAiPFwvaT4iKTsNCi19DQotDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvY29udGVudHBhZ2VfemhfQ04uanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV96aF9DTi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNhMzI3OC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV96aF9DTi5qcworKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCA9IGZhbHNlOw0KLXZhciBmaXJzdFNlY3Rpb247DQotdmFyIGV4cGFuZEltYWdlOw0KLXZhciBjb2xsYXBzZUltYWdlOw0KLXZhciBleHBhbmRBbGxJbWFnZTsNCi12YXIgY29sbGFwc2VBbGxJbWFnZTsNCi12YXIgYmFja1RvVG9wSW1hZ2U7DQotdmFyIHNoaW1JbWFnZTsNCi12YXIgZXhwYW5kTWVzc2FnZSA9ICLlsZXlvIDmiYDmnInpg6jliIYiOw0KLXZhciBjb2xsYXBzZU1lc3NhZ2UgPSAi5oqY5Y+g5omA5pyJ6YOo5YiGIjsNCi12YXIgYmFja01lc3NhZ2UgPSAi5Zue5Yiw6aG26YOoIjsNCi0NCi0vLyBDcmVhdGVzIHRoZSBjb2xsYXBzaWJsZSBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVNlY3Rpb25MaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yLCBpbWdQYXRoKSB7DQotCWV4cGFuZEltYWdlID0gaW1nUGF0aCArICdleHBhbmQuZ2lmJzsJDQotCWNvbGxhcHNlSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlLmdpZic7DQotCWV4cGFuZEFsbEltYWdlID0gaW1nUGF0aCArICdleHBhbmRfYWxsLmdpZic7CQ0KLQljb2xsYXBzZUFsbEltYWdlID0gaW1nUGF0aCArICdjb2xsYXBzZV9hbGwuZ2lmJzsNCi0JYmFja1RvVG9wSW1hZ2UgPSBpbWdQYXRoICsgJ2JhY2tfdG9fdG9wLmdpZic7DQotCXNoaW1JbWFnZSA9IGltZ1BhdGggKyAnc2hpbS5naWYnOw0KLQkNCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7DQotCQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsNCi0JCXZhciBzZWN0aW9uRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXNlY3Rpb25FbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlzZWN0aW9uRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U2VjdGlvbiA9IHNlY3Rpb25FbGVtZW50c1swXTsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgc2VjdGlvbkVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBzZWN0aW9uRWxlbWVudHNbaV07DQotCQkJdmFyIHNpYmxpbmdDb250YWluZXI7DQotCQkJaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKHNpYmxpbmdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkgJiYgc2libGluZ0NvbnRhaW5lci5zdHlsZSkgewkNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsICYmIG5leHRTaWJsaW5nLmNsYXNzTmFtZSAhPSAnY29weXJpZ2h0Jykgew0KLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOw0KLQkJCQkJbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy5uZXh0U2libGluZzsNCi0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsNCi0JCQkJfQ0KLQkJCQlpZiAoY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCkgew0KLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQl9DQotICAgIAkJCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOw0KLSAgICAJCQljcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKHNlY3Rpb25FbGVtZW50c1swXSk7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHNlY3Rpb24uDQotZnVuY3Rpb24gY3JlYXRlQ29sbGFwc2libGVTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4KSB7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7DQotCQkvLyBBZGQgYSBzcGFjaW5nIGJldHdlZW4gdGhlIHNlY3Rpb25zLg0KLQkJdmFyIHNlY3Rpb25TZXBhcmF0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCXNlY3Rpb25TZXBhcmF0b3Iuc3JjID0gc2hpbUltYWdlOw0KLQkJc2VjdGlvblNlcGFyYXRvci5oZWlnaHQgPSAnMyc7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmJvcmRlciA9ICcwJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2VjdGlvblNlcGFyYXRvciwgZWxlbWVudCk7DQotCQkNCi0JCS8vIEFkZCBhIGV4cGFuZC9jb2xsYXBzZSBsaW5rIHRvIHRoZSBzZWN0aW9uIGhlYWRpbmcuDQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotCQkJaW1hZ2Uuc3JjID0gZXhwYW5kSW1hZ2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkJfQ0KLQkJaW1hZ2Uud2lkdGggPSAnMTcnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZENvbGxhcHNlU2VjdGlvbjsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLSAgICAJDQotCQkvLyBBZGQgYSBCYWNrIFRvIFRvcCBsaW5rIGluIHRoZSBzZWN0aW9uIGhlYWRpbmcuDQotCQljcmVhdGVCYWNrVG9Ub3BMaW5rKHNpYmxpbmdDb250YWluZXIpOw0KLQl9DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBCYWNrIHRvIHRvcCBsaW5rLg0KLWZ1bmN0aW9uIGNyZWF0ZUJhY2tUb1RvcExpbmsoZWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGJhY2tUb1RvcEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGJhY2tNZXNzYWdlKSk7CQkNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRpdik7DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBvciBjb2xsYXBzZXMgYSBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVNlY3Rpb24oZXZ0KSB7DQotCWlmICh0aGlzLmNvbGxhcHNlRGl2LnN0eWxlLmRpc3BsYXkgPT0gJycpIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JZWxzZSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU2VjdGlvbnMgbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKGZpcnN0RWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQkJDQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsNCi0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGV4cGFuZEFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQWxsOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShleHBhbmRNZXNzYWdlKSk7DQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwkJCQkJCQ0KLQkJDQotCQlpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGNvbGxhcHNlQWxsOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlTWVzc2FnZSkpOwkJCQkNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQkNCi0JCS8qDQotCQl2YXIgb3ZlcnZpZXdTZXBhcmF0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3ZlcnZpZXdTZXBhcmF0b3IiKTsNCi0JCW92ZXJ2aWV3U2VwYXJhdG9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgb3ZlcnZpZXdTZXBhcmF0b3IpOw0KLQkJKi8NCi0JCWlmIChmaXJzdFNlY3Rpb24gIT0gbnVsbCkgew0KLQkJCWZpcnN0U2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGZpcnN0U2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc2VjdGlvbnMuDQotZnVuY3Rpb24gZXhwYW5kQWxsKGV2dCkgew0KLQkgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCSAJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCSAJc2VjdGlvbkNvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkgfQ0KLQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JIAlldnQucHJldmVudERlZmF1bHQoKTsNCi0JIH0NCi0JIHJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ29sbGFwc2VzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBjb2xsYXBzZUFsbChldnQpIHsNCi0JZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCQlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIFRoaXMgdGVtcG9yYXJ5IGZ1bmN0aW9uIGhlbHBzIHRvIHJlc29sdmUgSmF2YXNjcmlwdCBlcnJvcnMgaW4gdGhlIG1pZ3JhdGVkIFJVUA0KLS8vIGNvbnRlbnQgcGFnZXMuIEl0IHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZSBjb3JyZXNwb25kaW5nIC5qcyBmaWxlcyBhcmUgYmVpbmcNCi0vLyBtaWdyYXRlZCBhbG9uZyB3aXRoIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuDQotZnVuY3Rpb24gUmVmZXJlbmNlSGVscFRvcGljICh0b3BpY05hbWUsIGJvb2sgLCBmaWxlTmFtZSkgew0KLSAgIGRvY3VtZW50LndyaXRlKCI8aT4iKyB0b3BpY05hbWUgKyAiPFwvaT4iKTsNCi19DQotDQotDQotDQotDQotDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvY29udGVudHBhZ2VfemhfVFcuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV96aF9UVy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTEzZjJhMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV96aF9UVy5qcworKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCA9IGZhbHNlOw0KLXZhciBmaXJzdFNlY3Rpb247DQotdmFyIGV4cGFuZEltYWdlOw0KLXZhciBjb2xsYXBzZUltYWdlOw0KLXZhciBleHBhbmRBbGxJbWFnZTsNCi12YXIgY29sbGFwc2VBbGxJbWFnZTsNCi12YXIgYmFja1RvVG9wSW1hZ2U7DQotdmFyIHNoaW1JbWFnZTsNCi12YXIgZXhwYW5kTWVzc2FnZSA9ICLlsZXplovlhajpg6jljYDmrrUiOw0KLXZhciBjb2xsYXBzZU1lc3NhZ2UgPSAi5pS25ZCI5YWo6YOo5Y2A5q61IjsNCi12YXIgYmFja01lc3NhZ2UgPSAi5Zue5Yiw6aCC56uvIjsNCi0NCi0vLyBDcmVhdGVzIHRoZSBjb2xsYXBzaWJsZSBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVNlY3Rpb25MaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yLCBpbWdQYXRoKSB7DQotCWV4cGFuZEltYWdlID0gaW1nUGF0aCArICdleHBhbmQuZ2lmJzsJDQotCWNvbGxhcHNlSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlLmdpZic7DQotCWV4cGFuZEFsbEltYWdlID0gaW1nUGF0aCArICdleHBhbmRfYWxsLmdpZic7CQ0KLQljb2xsYXBzZUFsbEltYWdlID0gaW1nUGF0aCArICdjb2xsYXBzZV9hbGwuZ2lmJzsNCi0JYmFja1RvVG9wSW1hZ2UgPSBpbWdQYXRoICsgJ2JhY2tfdG9fdG9wLmdpZic7DQotCXNoaW1JbWFnZSA9IGltZ1BhdGggKyAnc2hpbS5naWYnOw0KLQkNCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7DQotCQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsNCi0JCXZhciBzZWN0aW9uRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXNlY3Rpb25FbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlzZWN0aW9uRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U2VjdGlvbiA9IHNlY3Rpb25FbGVtZW50c1swXTsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgc2VjdGlvbkVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBzZWN0aW9uRWxlbWVudHNbaV07DQotCQkJdmFyIHNpYmxpbmdDb250YWluZXI7DQotCQkJaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKHNpYmxpbmdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkgJiYgc2libGluZ0NvbnRhaW5lci5zdHlsZSkgewkNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsICYmIG5leHRTaWJsaW5nLmNsYXNzTmFtZSAhPSAnY29weXJpZ2h0Jykgew0KLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOw0KLQkJCQkJbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy5uZXh0U2libGluZzsNCi0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsNCi0JCQkJfQ0KLQkJCQlpZiAoY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCkgew0KLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQl9DQotICAgIAkJCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOw0KLSAgICAJCQljcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKHNlY3Rpb25FbGVtZW50c1swXSk7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHNlY3Rpb24uDQotZnVuY3Rpb24gY3JlYXRlQ29sbGFwc2libGVTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4KSB7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7DQotCQkvLyBBZGQgYSBzcGFjaW5nIGJldHdlZW4gdGhlIHNlY3Rpb25zLg0KLQkJdmFyIHNlY3Rpb25TZXBhcmF0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCXNlY3Rpb25TZXBhcmF0b3Iuc3JjID0gc2hpbUltYWdlOw0KLQkJc2VjdGlvblNlcGFyYXRvci5oZWlnaHQgPSAnMyc7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmJvcmRlciA9ICcwJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2VjdGlvblNlcGFyYXRvciwgZWxlbWVudCk7DQotCQkNCi0JCS8vIEFkZCBhIGV4cGFuZC9jb2xsYXBzZSBsaW5rIHRvIHRoZSBzZWN0aW9uIGhlYWRpbmcuDQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotCQkJaW1hZ2Uuc3JjID0gZXhwYW5kSW1hZ2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkJfQ0KLQkJaW1hZ2Uud2lkdGggPSAnMTcnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZENvbGxhcHNlU2VjdGlvbjsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLSAgICAJDQotCQkvLyBBZGQgYSBCYWNrIFRvIFRvcCBsaW5rIGluIHRoZSBzZWN0aW9uIGhlYWRpbmcuDQotCQljcmVhdGVCYWNrVG9Ub3BMaW5rKHNpYmxpbmdDb250YWluZXIpOw0KLQl9DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBCYWNrIHRvIHRvcCBsaW5rLg0KLWZ1bmN0aW9uIGNyZWF0ZUJhY2tUb1RvcExpbmsoZWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGJhY2tUb1RvcEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGJhY2tNZXNzYWdlKSk7CQkNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRpdik7DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBvciBjb2xsYXBzZXMgYSBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVNlY3Rpb24oZXZ0KSB7DQotCWlmICh0aGlzLmNvbGxhcHNlRGl2LnN0eWxlLmRpc3BsYXkgPT0gJycpIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JZWxzZSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU2VjdGlvbnMgbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKGZpcnN0RWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQkJDQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsNCi0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGV4cGFuZEFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQWxsOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShleHBhbmRNZXNzYWdlKSk7DQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwkJCQkJCQ0KLQkJDQotCQlpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGNvbGxhcHNlQWxsOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlTWVzc2FnZSkpOwkJCQkNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQkNCi0JCS8qDQotCQl2YXIgb3ZlcnZpZXdTZXBhcmF0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3ZlcnZpZXdTZXBhcmF0b3IiKTsNCi0JCW92ZXJ2aWV3U2VwYXJhdG9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgb3ZlcnZpZXdTZXBhcmF0b3IpOw0KLQkJKi8NCi0JCWlmIChmaXJzdFNlY3Rpb24gIT0gbnVsbCkgew0KLQkJCWZpcnN0U2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGZpcnN0U2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc2VjdGlvbnMuDQotZnVuY3Rpb24gZXhwYW5kQWxsKGV2dCkgew0KLQkgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCSAJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCSAJc2VjdGlvbkNvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkgfQ0KLQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JIAlldnQucHJldmVudERlZmF1bHQoKTsNCi0JIH0NCi0JIHJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ29sbGFwc2VzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBjb2xsYXBzZUFsbChldnQpIHsNCi0JZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCQlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIFRoaXMgdGVtcG9yYXJ5IGZ1bmN0aW9uIGhlbHBzIHRvIHJlc29sdmUgSmF2YXNjcmlwdCBlcnJvcnMgaW4gdGhlIG1pZ3JhdGVkIFJVUA0KLS8vIGNvbnRlbnQgcGFnZXMuIEl0IHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZSBjb3JyZXNwb25kaW5nIC5qcyBmaWxlcyBhcmUgYmVpbmcNCi0vLyBtaWdyYXRlZCBhbG9uZyB3aXRoIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuDQotZnVuY3Rpb24gUmVmZXJlbmNlSGVscFRvcGljICh0b3BpY05hbWUsIGJvb2sgLCBmaWxlTmFtZSkgew0KLSAgIGRvY3VtZW50LndyaXRlKCI8aT4iKyB0b3BpY05hbWUgKyAiPFwvaT4iKTsNCi19DQotDQotDQotDQotDQotDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvc3RlcHNfZGUuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19kZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTFlZjdlOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19kZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTdGVwc0J5RGVmYXVsdCA9IHRydWU7DQotdmFyIHN0ZXBJbWdCYWNrUGF0aCA9ICcuLi8uLi8nOw0KLXZhciBleHBhbmRBbGxUZXh0ID0gIkFsbGUgU2Nocml0dHN0cnVrdHVyZW4gZWluYmxlbmRlbiI7DQotdmFyIGNvbGxhcHNlQWxsVGV4dCA9ICJBbGxlIFNjaHJpdHRzdHJ1a3R1cmVuIGF1c2JsZW5kZW4iOw0KLXZhciBmaXJzdFN0ZXBTZWN0aW9uOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHN0ZXAgc2VjdGlvbiBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVTdGVwTGlua3ModGFnTmFtZSwgY2xhc3NTZWxlY3Rvcikgew0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSByZXR1cm47DQotCQl2YXIgc3RlcEVsZW1lbnRzID0gbmV3IEFycmF5KGVsZW1lbnRzLmxlbmd0aCk7DQotCQl2YXIgdG90YWxMaW5rcyA9IDA7DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsNCi0JCQlpZiAoZWxlbWVudC5jbGFzc05hbWUgPT0gY2xhc3NTZWxlY3Rvcikgew0KLQkJCQlzdGVwRWxlbWVudHNbdG90YWxMaW5rcysrXSA9IGVsZW1lbnQ7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKHRvdGFsTGlua3MgPT0gMCkgcmV0dXJuOw0KLQkJc3RlcEVsZW1lbnRzLmxlbmd0aCA9IHRvdGFsTGlua3M7DQotCQlzdGVwQ29sbGFwc2VEaXZzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJc3RlcENvbGxhcHNlTGlua3MgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlmaXJzdFN0ZXBTZWN0aW9uID0gc3RlcEVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7DQotCQkJCXZhciBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dFNpYmxpbmc7DQotCQkJCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2libGluZ0NvbnRhaW5lciwgbmV4dFNpYmxpbmcpOw0KLQkJCQl2YXIgbmV4dEVsZW1lbnQgPSBzdGVwRWxlbWVudHNbaSArIDFdOw0KLQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbmV4dEVsZW1lbnQgJiYgbmV4dFNpYmxpbmcgIT0gbnVsbCkgew0KLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOw0KLQkJCQkJbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy5uZXh0U2libGluZzsNCi0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsNCi0JCQkJfQ0KLQkJCQlpZiAoY29sbGFwc2VTdGVwc0J5RGVmYXVsdCkgew0KLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQl9DQotICAgIAkJCXNpYmxpbmdDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0gICAgCQkJc3RlcENvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTdGVwc0xpbmtzKHN0ZXBFbGVtZW50c1swXSk7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHN0ZXAgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVN0ZXBTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4KSB7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotCQkJaW1hZ2Uuc3JjID0gZXhwYW5kSW1hZ2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkJfQ0KLQkJaW1hZ2Uud2lkdGggPSAnMTcnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZENvbGxhcHNlU3RlcFNlY3Rpb247DQotCQlzdGVwQ29sbGFwc2VMaW5rc1tpbmRleF0gPSBsaW5rOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuaW5zZXJ0QmVmb3JlKHNwYW4sIGVsZW1lbnQuZmlyc3RDaGlsZCk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHN0ZXAgc2VjdGlvbiBiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgZXZlbnQuDQotZnVuY3Rpb24gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTdGVwcyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsNCi0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7CQkNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQWxsU3RlcHM7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZEFsbFRleHQpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGxTdGVwczsNCi0JCXNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2xsYXBzZUFsbFRleHQpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQkNCi0JCWlmIChmaXJzdFN0ZXBTZWN0aW9uKSB7DQotCQkJZmlyc3RTdGVwU2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGZpcnN0U3RlcFNlY3Rpb24pOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGV4cGFuZEFsbFN0ZXBzKGV2dCkgew0KLQkgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCSAJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCSAJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkgfQ0KLQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JIAlldnQucHJldmVudERlZmF1bHQoKTsNCi0JIH0NCi0JIHJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ29sbGFwc2VzIGFsbCBzdGVwcy4NCi1mdW5jdGlvbiBjb2xsYXBzZUFsbFN0ZXBzKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXN0ZXBDb2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvc3RlcHNfZXMuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19lcy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2I1NmFjYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19lcy5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTdGVwc0J5RGVmYXVsdCA9IHRydWU7DQotdmFyIHN0ZXBJbWdCYWNrUGF0aCA9ICcuLi8uLi8nOw0KLXZhciBleHBhbmRBbGxUZXh0ID0gIkV4cGFuZGlyIHRvZG9zIGxvcyBwYXNvcyI7DQotdmFyIGNvbGxhcHNlQWxsVGV4dCA9ICJDb250cmFlciB0b2RvcyBsb3MgcGFzb3MiOw0KLXZhciBmaXJzdFN0ZXBTZWN0aW9uOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHN0ZXAgc2VjdGlvbiBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVTdGVwTGlua3ModGFnTmFtZSwgY2xhc3NTZWxlY3Rvcikgew0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSByZXR1cm47DQotCQl2YXIgc3RlcEVsZW1lbnRzID0gbmV3IEFycmF5KGVsZW1lbnRzLmxlbmd0aCk7DQotCQl2YXIgdG90YWxMaW5rcyA9IDA7DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsNCi0JCQlpZiAoZWxlbWVudC5jbGFzc05hbWUgPT0gY2xhc3NTZWxlY3Rvcikgew0KLQkJCQlzdGVwRWxlbWVudHNbdG90YWxMaW5rcysrXSA9IGVsZW1lbnQ7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKHRvdGFsTGlua3MgPT0gMCkgcmV0dXJuOw0KLQkJc3RlcEVsZW1lbnRzLmxlbmd0aCA9IHRvdGFsTGlua3M7DQotCQlzdGVwQ29sbGFwc2VEaXZzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJc3RlcENvbGxhcHNlTGlua3MgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlmaXJzdFN0ZXBTZWN0aW9uID0gc3RlcEVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7DQotCQkJCXZhciBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dFNpYmxpbmc7DQotCQkJCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2libGluZ0NvbnRhaW5lciwgbmV4dFNpYmxpbmcpOw0KLQkJCQl2YXIgbmV4dEVsZW1lbnQgPSBzdGVwRWxlbWVudHNbaSArIDFdOw0KLQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbmV4dEVsZW1lbnQgJiYgbmV4dFNpYmxpbmcgIT0gbnVsbCkgew0KLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOw0KLQkJCQkJbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy5uZXh0U2libGluZzsNCi0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsNCi0JCQkJfQ0KLQkJCQlpZiAoY29sbGFwc2VTdGVwc0J5RGVmYXVsdCkgew0KLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQl9DQotICAgIAkJCXNpYmxpbmdDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0gICAgCQkJc3RlcENvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTdGVwc0xpbmtzKHN0ZXBFbGVtZW50c1swXSk7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHN0ZXAgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVN0ZXBTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4KSB7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotCQkJaW1hZ2Uuc3JjID0gZXhwYW5kSW1hZ2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkJfQ0KLQkJaW1hZ2Uud2lkdGggPSAnMTcnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZENvbGxhcHNlU3RlcFNlY3Rpb247DQotCQlzdGVwQ29sbGFwc2VMaW5rc1tpbmRleF0gPSBsaW5rOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuaW5zZXJ0QmVmb3JlKHNwYW4sIGVsZW1lbnQuZmlyc3RDaGlsZCk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHN0ZXAgc2VjdGlvbiBiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgZXZlbnQuDQotZnVuY3Rpb24gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTdGVwcyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsNCi0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7CQkNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQWxsU3RlcHM7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZEFsbFRleHQpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGxTdGVwczsNCi0JCXNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2xsYXBzZUFsbFRleHQpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQkNCi0JCWlmIChmaXJzdFN0ZXBTZWN0aW9uKSB7DQotCQkJZmlyc3RTdGVwU2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGZpcnN0U3RlcFNlY3Rpb24pOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGV4cGFuZEFsbFN0ZXBzKGV2dCkgew0KLQkgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCSAJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCSAJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkgfQ0KLQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JIAlldnQucHJldmVudERlZmF1bHQoKTsNCi0JIH0NCi0JIHJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ29sbGFwc2VzIGFsbCBzdGVwcy4NCi1mdW5jdGlvbiBjb2xsYXBzZUFsbFN0ZXBzKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXN0ZXBDb2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvc3RlcHNfZnIuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19mci5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzUzZGI0YS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19mci5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTdGVwc0J5RGVmYXVsdCA9IHRydWU7DQotdmFyIHN0ZXBJbWdCYWNrUGF0aCA9ICcuLi8uLi8nOw0KLXZhciBleHBhbmRBbGxUZXh0ID0gIkTDqXZlbG9wcGVyIHRvdXRlcyBsZXMgw6l0YXBlcyI7DQotdmFyIGNvbGxhcHNlQWxsVGV4dCA9ICJDb25kZW5zZXIgdG91dGVzIGxlcyDDqXRhcGVzIjsNCi12YXIgZmlyc3RTdGVwU2VjdGlvbjsNCi0NCi0vLyBDcmVhdGVzIHRoZSBjb2xsYXBzaWJsZSBzdGVwIHNlY3Rpb24gbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlU3RlcExpbmtzKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IpIHsNCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7DQotCQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsNCi0JCWlmIChlbGVtZW50cy5sZW5ndGggPT0gMCkgcmV0dXJuOw0KLQkJdmFyIHN0ZXBFbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOw0KLQkJdmFyIHRvdGFsTGlua3MgPSAwOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsNCi0JCQkJc3RlcEVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCWlmICh0b3RhbExpbmtzID09IDApIHJldHVybjsNCi0JCXN0ZXBFbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOw0KLQkJc3RlcENvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJZmlyc3RTdGVwU2VjdGlvbiA9IHN0ZXBFbGVtZW50c1swXTsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBzdGVwRWxlbWVudHNbaV07DQotCQkJdmFyIHNpYmxpbmdDb250YWluZXI7DQotCQkJaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKHNpYmxpbmdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkgJiYgc2libGluZ0NvbnRhaW5lci5zdHlsZSkgew0KLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOw0KLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsNCi0JCQkJdmFyIG5leHRFbGVtZW50ID0gc3RlcEVsZW1lbnRzW2kgKyAxXTsNCi0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwpIHsNCi0JCQkJCXZhciB0b01vdmUgPSBuZXh0U2libGluZzsNCi0JCQkJCW5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmcubmV4dFNpYmxpbmc7DQotCQkJCQlzaWJsaW5nQ29udGFpbmVyLmFwcGVuZENoaWxkKHRvTW92ZSk7DQotCQkJCX0NCi0JCQkJaWYgKGNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsNCi0gICAgCQkJCXNpYmxpbmdDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0gICAgCQkJfQ0KLSAgICAJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCXN0ZXBDb2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOw0KLSAgICAJCQljcmVhdGVDb2xsYXBzaWJsZVN0ZXBTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGkpOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCX0NCi0JCWNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhzdGVwRWxlbWVudHNbMF0pOw0KLQl9DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBjb2xsYXBzaWJsZSBzdGVwIHNlY3Rpb24uDQotZnVuY3Rpb24gY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpbmRleCkgew0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkgew0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY29sbGFwc2VEaXYgPSBzaWJsaW5nQ29udGFpbmVyOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpZiAoY29sbGFwc2VTdGVwc0J5RGVmYXVsdCkgew0KLQkJCWltYWdlLnNyYyA9IGV4cGFuZEltYWdlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JCX0NCi0JCWltYWdlLndpZHRoID0gJzE3JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNSc7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uOw0KLQkJc3RlcENvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBvciBjb2xsYXBzZXMgYSBzdGVwIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50Lg0KLWZ1bmN0aW9uIGV4cGFuZENvbGxhcHNlU3RlcFNlY3Rpb24oZXZ0KSB7DQotCWlmICh0aGlzLmNvbGxhcHNlRGl2LnN0eWxlLmRpc3BsYXkgPT0gJycpIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JZWxzZSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU3RlcHMgbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTdGVwc0xpbmtzKGZpcnN0RWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlkaXYuYWxpZ24gPSAncmlnaHQnOwkJDQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGV4cGFuZEFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZEFsbFN0ZXBzOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShleHBhbmRBbGxUZXh0KSk7DQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJDQotCQlpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGNvbGxhcHNlQWxsU3RlcHM7DQotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VBbGxUZXh0KSk7DQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJDQotCQlpZiAoZmlyc3RTdGVwU2VjdGlvbikgew0KLQkJCWZpcnN0U3RlcFNlY3Rpb24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBmaXJzdFN0ZXBTZWN0aW9uKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIGFsbCBzdGVwcy4NCi1mdW5jdGlvbiBleHBhbmRBbGxTdGVwcyhldnQpIHsNCi0JIGZvciAodmFyIGkgPSAwOyBpIDwgc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkgCXN0ZXBDb2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkgCXN0ZXBDb2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JIH0NCi0JIGlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCSAJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCSB9DQotCSByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENvbGxhcHNlcyBhbGwgc3RlcHMuDQotZnVuY3Rpb24gY29sbGFwc2VBbGxTdGVwcyhldnQpIHsNCi0JZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCQlzdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQlzdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX2l0LmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvc3RlcHNfaXQuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdlOTRmNzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvc3RlcHNfaXQuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotdmFyIGNvbGxhcHNlU3RlcHNCeURlZmF1bHQgPSB0cnVlOw0KLXZhciBzdGVwSW1nQmFja1BhdGggPSAnLi4vLi4vJzsNCi12YXIgZXhwYW5kQWxsVGV4dCA9ICJFc3BhbmRpIHR1dHRpIGkgcGFzc2kiOw0KLXZhciBjb2xsYXBzZUFsbFRleHQgPSAiQ29tcHJpbWkgdHV0dGkgaSBwYXNzaSI7DQotdmFyIGZpcnN0U3RlcFNlY3Rpb247DQotDQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVN0ZXBMaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yKSB7DQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgew0KLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7DQotCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybjsNCi0JCXZhciBzdGVwRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXN0ZXBFbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlpZiAodG90YWxMaW5rcyA9PSAwKSByZXR1cm47DQotCQlzdGVwRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXN0ZXBDb2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzdGVwQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U3RlcFNlY3Rpb24gPSBzdGVwRWxlbWVudHNbMF07DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gc3RlcEVsZW1lbnRzW2ldOw0KLQkJCXZhciBzaWJsaW5nQ29udGFpbmVyOw0KLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQlzdGVwQ29sbGFwc2VEaXZzW2ldID0gc2libGluZ0NvbnRhaW5lcjsNCi0gICAgCQkJY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3Moc3RlcEVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uLg0KLWZ1bmN0aW9uIGNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbjsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgb3IgY29sbGFwc2VzIGEgc3RlcCBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uKGV2dCkgew0KLQlpZiAodGhpcy5jb2xsYXBzZURpdi5zdHlsZS5kaXNwbGF5ID09ICcnKSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWVsc2Ugew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ3JlYXRlcyB0aGUgRXhwYW5kIEFsbCBhbmQgQ29sbGFwc2UgQWxsIFN0ZXBzIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhmaXJzdEVsZW1lbnQpIHsNCi0JdmFyIGRpdjsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsJCQ0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBleHBhbmRBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGxTdGVwczsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZXhwYW5kQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCQ0KLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGNvbGxhcHNlQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBjb2xsYXBzZUFsbFN0ZXBzOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJaWYgKGZpcnN0U3RlcFNlY3Rpb24pIHsNCi0JCQlmaXJzdFN0ZXBTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTdGVwU2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc3RlcHMuDQotZnVuY3Rpb24gZXhwYW5kQWxsU3RlcHMoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsU3RlcHMoZXZ0KSB7DQotCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19qYS5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX2phLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMjFmODFiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX2phLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0ID0gdHJ1ZTsNCi12YXIgc3RlcEltZ0JhY2tQYXRoID0gJy4uLy4uLyc7DQotdmFyIGV4cGFuZEFsbFRleHQgPSAi44K544OG44OD44OX44KS44GZ44G544Gm5bGV6ZaLIjsNCi12YXIgY29sbGFwc2VBbGxUZXh0ID0gIuOCueODhuODg+ODl+OCkuOBmeOBueOBpue4ruWwj+ihqOekuiI7DQotdmFyIGZpcnN0U3RlcFNlY3Rpb247DQotDQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVN0ZXBMaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yKSB7DQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgew0KLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7DQotCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybjsNCi0JCXZhciBzdGVwRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXN0ZXBFbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlpZiAodG90YWxMaW5rcyA9PSAwKSByZXR1cm47DQotCQlzdGVwRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXN0ZXBDb2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzdGVwQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U3RlcFNlY3Rpb24gPSBzdGVwRWxlbWVudHNbMF07DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gc3RlcEVsZW1lbnRzW2ldOw0KLQkJCXZhciBzaWJsaW5nQ29udGFpbmVyOw0KLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQlzdGVwQ29sbGFwc2VEaXZzW2ldID0gc2libGluZ0NvbnRhaW5lcjsNCi0gICAgCQkJY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3Moc3RlcEVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uLg0KLWZ1bmN0aW9uIGNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbjsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgb3IgY29sbGFwc2VzIGEgc3RlcCBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uKGV2dCkgew0KLQlpZiAodGhpcy5jb2xsYXBzZURpdi5zdHlsZS5kaXNwbGF5ID09ICcnKSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWVsc2Ugew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ3JlYXRlcyB0aGUgRXhwYW5kIEFsbCBhbmQgQ29sbGFwc2UgQWxsIFN0ZXBzIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhmaXJzdEVsZW1lbnQpIHsNCi0JdmFyIGRpdjsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsJCQ0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBleHBhbmRBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGxTdGVwczsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZXhwYW5kQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCQ0KLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGNvbGxhcHNlQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBjb2xsYXBzZUFsbFN0ZXBzOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJaWYgKGZpcnN0U3RlcFNlY3Rpb24pIHsNCi0JCQlmaXJzdFN0ZXBTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTdGVwU2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc3RlcHMuDQotZnVuY3Rpb24gZXhwYW5kQWxsU3RlcHMoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsU3RlcHMoZXZ0KSB7DQotCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19rby5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX2tvLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NWFlNDU1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX2tvLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0ID0gdHJ1ZTsNCi12YXIgc3RlcEltZ0JhY2tQYXRoID0gJy4uLy4uLyc7DQotdmFyIGV4cGFuZEFsbFRleHQgPSAi66qo65OgIOuLqOqzhCDtjrzsuZjquLAiOw0KLXZhciBjb2xsYXBzZUFsbFRleHQgPSAi66qo65OgIOuLqOqzhCDsoJHquLAiOw0KLXZhciBmaXJzdFN0ZXBTZWN0aW9uOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHN0ZXAgc2VjdGlvbiBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVTdGVwTGlua3ModGFnTmFtZSwgY2xhc3NTZWxlY3Rvcikgew0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSByZXR1cm47DQotCQl2YXIgc3RlcEVsZW1lbnRzID0gbmV3IEFycmF5KGVsZW1lbnRzLmxlbmd0aCk7DQotCQl2YXIgdG90YWxMaW5rcyA9IDA7DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsNCi0JCQlpZiAoZWxlbWVudC5jbGFzc05hbWUgPT0gY2xhc3NTZWxlY3Rvcikgew0KLQkJCQlzdGVwRWxlbWVudHNbdG90YWxMaW5rcysrXSA9IGVsZW1lbnQ7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKHRvdGFsTGlua3MgPT0gMCkgcmV0dXJuOw0KLQkJc3RlcEVsZW1lbnRzLmxlbmd0aCA9IHRvdGFsTGlua3M7DQotCQlzdGVwQ29sbGFwc2VEaXZzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJc3RlcENvbGxhcHNlTGlua3MgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlmaXJzdFN0ZXBTZWN0aW9uID0gc3RlcEVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7DQotCQkJCXZhciBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dFNpYmxpbmc7DQotCQkJCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2libGluZ0NvbnRhaW5lciwgbmV4dFNpYmxpbmcpOw0KLQkJCQl2YXIgbmV4dEVsZW1lbnQgPSBzdGVwRWxlbWVudHNbaSArIDFdOw0KLQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbmV4dEVsZW1lbnQgJiYgbmV4dFNpYmxpbmcgIT0gbnVsbCkgew0KLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOw0KLQkJCQkJbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy5uZXh0U2libGluZzsNCi0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsNCi0JCQkJfQ0KLQkJCQlpZiAoY29sbGFwc2VTdGVwc0J5RGVmYXVsdCkgew0KLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQl9DQotICAgIAkJCXNpYmxpbmdDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0gICAgCQkJc3RlcENvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTdGVwc0xpbmtzKHN0ZXBFbGVtZW50c1swXSk7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHN0ZXAgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVN0ZXBTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4KSB7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotCQkJaW1hZ2Uuc3JjID0gZXhwYW5kSW1hZ2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkJfQ0KLQkJaW1hZ2Uud2lkdGggPSAnMTcnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZENvbGxhcHNlU3RlcFNlY3Rpb247DQotCQlzdGVwQ29sbGFwc2VMaW5rc1tpbmRleF0gPSBsaW5rOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuaW5zZXJ0QmVmb3JlKHNwYW4sIGVsZW1lbnQuZmlyc3RDaGlsZCk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHN0ZXAgc2VjdGlvbiBiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgZXZlbnQuDQotZnVuY3Rpb24gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTdGVwcyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsNCi0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7CQkNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQWxsU3RlcHM7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZEFsbFRleHQpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGxTdGVwczsNCi0JCXNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2xsYXBzZUFsbFRleHQpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQkNCi0JCWlmIChmaXJzdFN0ZXBTZWN0aW9uKSB7DQotCQkJZmlyc3RTdGVwU2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGZpcnN0U3RlcFNlY3Rpb24pOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGV4cGFuZEFsbFN0ZXBzKGV2dCkgew0KLQkgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCSAJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCSAJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkgfQ0KLQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JIAlldnQucHJldmVudERlZmF1bHQoKTsNCi0JIH0NCi0JIHJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ29sbGFwc2VzIGFsbCBzdGVwcy4NCi1mdW5jdGlvbiBjb2xsYXBzZUFsbFN0ZXBzKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXN0ZXBDb2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvc3RlcHNfcHRfQlIuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19wdF9CUi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjg3YmI5Ni4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19wdF9CUi5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTdGVwc0J5RGVmYXVsdCA9IHRydWU7DQotdmFyIHN0ZXBJbWdCYWNrUGF0aCA9ICcuLi8uLi8nOw0KLXZhciBleHBhbmRBbGxUZXh0ID0gIkV4cGFuZGlyIFRvZGFzIGFzIEV0YXBhcyI7DQotdmFyIGNvbGxhcHNlQWxsVGV4dCA9ICJSZWR1emlyIFRvZGFzIGFzIEV0YXBhcyI7DQotdmFyIGZpcnN0U3RlcFNlY3Rpb247DQotDQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVN0ZXBMaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yKSB7DQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgew0KLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7DQotCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybjsNCi0JCXZhciBzdGVwRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXN0ZXBFbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlpZiAodG90YWxMaW5rcyA9PSAwKSByZXR1cm47DQotCQlzdGVwRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXN0ZXBDb2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzdGVwQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U3RlcFNlY3Rpb24gPSBzdGVwRWxlbWVudHNbMF07DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gc3RlcEVsZW1lbnRzW2ldOw0KLQkJCXZhciBzaWJsaW5nQ29udGFpbmVyOw0KLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQlzdGVwQ29sbGFwc2VEaXZzW2ldID0gc2libGluZ0NvbnRhaW5lcjsNCi0gICAgCQkJY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3Moc3RlcEVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uLg0KLWZ1bmN0aW9uIGNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbjsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgb3IgY29sbGFwc2VzIGEgc3RlcCBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uKGV2dCkgew0KLQlpZiAodGhpcy5jb2xsYXBzZURpdi5zdHlsZS5kaXNwbGF5ID09ICcnKSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWVsc2Ugew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ3JlYXRlcyB0aGUgRXhwYW5kIEFsbCBhbmQgQ29sbGFwc2UgQWxsIFN0ZXBzIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhmaXJzdEVsZW1lbnQpIHsNCi0JdmFyIGRpdjsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsJCQ0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBleHBhbmRBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGxTdGVwczsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZXhwYW5kQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCQ0KLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGNvbGxhcHNlQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBjb2xsYXBzZUFsbFN0ZXBzOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJaWYgKGZpcnN0U3RlcFNlY3Rpb24pIHsNCi0JCQlmaXJzdFN0ZXBTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTdGVwU2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc3RlcHMuDQotZnVuY3Rpb24gZXhwYW5kQWxsU3RlcHMoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsU3RlcHMoZXZ0KSB7DQotCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc196aF9DTi5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX3poX0NOLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDc4MDc0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX3poX0NOLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0ID0gdHJ1ZTsNCi12YXIgc3RlcEltZ0JhY2tQYXRoID0gJy4uLy4uLyc7DQotdmFyIGV4cGFuZEFsbFRleHQgPSAi5bGV5byA5omA5pyJ5q2l6aqkIjsNCi12YXIgY29sbGFwc2VBbGxUZXh0ID0gIuaKmOWPoOaJgOacieatpemqpCI7DQotdmFyIGZpcnN0U3RlcFNlY3Rpb247DQotDQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVN0ZXBMaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yKSB7DQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgew0KLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7DQotCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybjsNCi0JCXZhciBzdGVwRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXN0ZXBFbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlpZiAodG90YWxMaW5rcyA9PSAwKSByZXR1cm47DQotCQlzdGVwRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXN0ZXBDb2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzdGVwQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U3RlcFNlY3Rpb24gPSBzdGVwRWxlbWVudHNbMF07DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gc3RlcEVsZW1lbnRzW2ldOw0KLQkJCXZhciBzaWJsaW5nQ29udGFpbmVyOw0KLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQlzdGVwQ29sbGFwc2VEaXZzW2ldID0gc2libGluZ0NvbnRhaW5lcjsNCi0gICAgCQkJY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3Moc3RlcEVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uLg0KLWZ1bmN0aW9uIGNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbjsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgb3IgY29sbGFwc2VzIGEgc3RlcCBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uKGV2dCkgew0KLQlpZiAodGhpcy5jb2xsYXBzZURpdi5zdHlsZS5kaXNwbGF5ID09ICcnKSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWVsc2Ugew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ3JlYXRlcyB0aGUgRXhwYW5kIEFsbCBhbmQgQ29sbGFwc2UgQWxsIFN0ZXBzIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhmaXJzdEVsZW1lbnQpIHsNCi0JdmFyIGRpdjsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsJCQ0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBleHBhbmRBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGxTdGVwczsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZXhwYW5kQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCQ0KLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGNvbGxhcHNlQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBjb2xsYXBzZUFsbFN0ZXBzOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJaWYgKGZpcnN0U3RlcFNlY3Rpb24pIHsNCi0JCQlmaXJzdFN0ZXBTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTdGVwU2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc3RlcHMuDQotZnVuY3Rpb24gZXhwYW5kQWxsU3RlcHMoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsU3RlcHMoZXZ0KSB7DQotCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc196aF9UVy5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX3poX1RXLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjE5Yjc5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX3poX1RXLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0ID0gdHJ1ZTsNCi12YXIgc3RlcEltZ0JhY2tQYXRoID0gJy4uLy4uLyc7DQotdmFyIGV4cGFuZEFsbFRleHQgPSAi5bGV6ZaL5YWo6YOo5q2l6amfIjsNCi12YXIgY29sbGFwc2VBbGxUZXh0ID0gIuaUtuWQiOWFqOmDqOatpempnyI7DQotdmFyIGZpcnN0U3RlcFNlY3Rpb247DQotDQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVN0ZXBMaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yKSB7DQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgew0KLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7DQotCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybjsNCi0JCXZhciBzdGVwRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXN0ZXBFbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlpZiAodG90YWxMaW5rcyA9PSAwKSByZXR1cm47DQotCQlzdGVwRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXN0ZXBDb2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzdGVwQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U3RlcFNlY3Rpb24gPSBzdGVwRWxlbWVudHNbMF07DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gc3RlcEVsZW1lbnRzW2ldOw0KLQkJCXZhciBzaWJsaW5nQ29udGFpbmVyOw0KLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQlzdGVwQ29sbGFwc2VEaXZzW2ldID0gc2libGluZ0NvbnRhaW5lcjsNCi0gICAgCQkJY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3Moc3RlcEVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uLg0KLWZ1bmN0aW9uIGNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbjsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgb3IgY29sbGFwc2VzIGEgc3RlcCBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uKGV2dCkgew0KLQlpZiAodGhpcy5jb2xsYXBzZURpdi5zdHlsZS5kaXNwbGF5ID09ICcnKSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWVsc2Ugew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ3JlYXRlcyB0aGUgRXhwYW5kIEFsbCBhbmQgQ29sbGFwc2UgQWxsIFN0ZXBzIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhmaXJzdEVsZW1lbnQpIHsNCi0JdmFyIGRpdjsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsJCQ0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBleHBhbmRBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGxTdGVwczsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZXhwYW5kQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCQ0KLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGNvbGxhcHNlQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBjb2xsYXBzZUFsbFN0ZXBzOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJaWYgKGZpcnN0U3RlcFNlY3Rpb24pIHsNCi0JCQlmaXJzdFN0ZXBTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTdGVwU2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc3RlcHMuDQotZnVuY3Rpb24gZXhwYW5kQWxsU3RlcHMoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsU3RlcHMoZXZ0KSB7DQotCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy90cmVlYnJvd3Nlcl9kZS5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2RlLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNWUxMDY5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2RlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gSGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSA9ICJEaWUgS29uZmlndXJhdGlvbiB3aXJkIGJlcmVpdHMgbWl0IFNpY2h0ZW4gYW5nZXplaWd0IjsNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgPSAiU2ljaHRlbiBhbnplaWdlbiI7DQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UzID0gIkhvbWUiOw0KLQ0KLWZ1bmN0aW9uIGxvYWRUb3AoKQ0KLXsNCi0gIGlmKHBhcmVudC5mcmFtZXMubGVuZ3RoIT0wICYmIChwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIiB8fCBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jX2ZyYW1lIikgKQ0KLSAgew0KLSAgICAgYWxlcnQodHJlZWJyb3dzZXJfanNfTUVTU0FHRTEpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7DQotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7DQotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsNCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7DQotICAgIAkNCi0gICAgdmFyIG1haW5JbmRleF9hID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIm1haW5JbmRleCIpOyANCi0JdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7IA0KLQlpZiAoICBtYWluSW5kZXhfYSAhPSBudWxsICkgeyANCi0gICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZjsgDQotCX0gDQotDQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkNCi0gICAgew0KLQlpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApDQotCXsNCi0JCXdpbmRvdy5jbG9zZSgpOw0KLQkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOwkJDQotCX0NCi0JZWxzZQ0KLQl7DQotCSAgICAgICAJdG9wLmxvY2F0aW9uID0gbmV3X29yeV9kb2NfbG9jOw0KLQl9DQotICAgIH0NCi0gICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldEltYWdlVXJsKGltYWdlKQ0KLXsNCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYz1udWxsOyAgICANCi0gICAgdmFyIG1haW5JbmRleF9hID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIm1haW5JbmRleCIpOyANCi0gICAgbmV3X29yeV9kb2NfbG9jID0gbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmLnN1YnN0cmluZygwLG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5sYXN0SW5kZXhPZigiLyIpKTsNCi0gICAgbmV3X29yeV9kb2NfbG9jID0gbmV3X29yeV9kb2NfbG9jICsgIiIgKyBpbWFnZTsNCi0gICAgcmV0dXJuIG5ld19vcnlfZG9jX2xvYzsgICAgDQotfQ0KLQ0KLU1TRlBob3ZlciA9DQotKCgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gMyApKSB8fA0KLSAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApKSk7DQotDQotICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpDQotICB7DQotICAgICB2YXIgYT1uZXcgSW1hZ2UoKTsNCi0gICAgIGEuc3JjPWltZzsNCi0gICAgIHJldHVybiBhOw0KLSAgfQ0KLQ0KLSAgICBpZihNU0ZQaG92ZXIpDQotICAgIHsNCi0gICAgICAgIFJ1cEdyYXk9TVNGUHByZWxvYWQoZ2V0SW1hZ2VVcmwoJy9pbWFnZXMvZGlzcGxheV92aWV3cy5naWYnKSk7DQotICAgICAgICBSdXBCbHVlPU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3NfYS5naWYnKSk7DQotICAgIH0NCi0NCi0NCi0vL25ldyBjb2RlIHRvIGRpc3BsYXkgdGhlIGxvYWQgYnV0dG9uIG9yIG5vdA0KLXZhciBvcnlfdG9jX2V4aXN0ID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jOw0KLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7DQotICAgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvY19mcmFtZTsNCi19DQotDQotaWYgKG9yeV90b2NfZXhpc3QgPT0gInVuZGVmaW5lZCIpIHsNCi0JZG9jdW1lbnQud3JpdGUoIjxhIGNsYXNzPVwiZXhwYW5kQ29sbGFwc2VMaW5rXCIgaHJlZj1cIkphdmFTY3JpcHQ6bG9hZFRvcCgpO1wiIG9ubW91c2VvdmVyPVwiaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBCbHVlLnNyYzsgc2VsZi5zdGF0dXM9dHJlZWJyb3dzZXJfanNfTUVTU0FHRTI7IHJldHVybiB0cnVlXCIgb25tb3VzZW91dD1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwR3JheS5zcmM7IHNlbGYuc3RhdHVzPSAnICc7cmV0dXJuIHRydWVcIj4gPGJyPiA8aW1nIHNyYz1cIiIgKyBiYWNrUGF0aCArICJpbWFnZXMvZGlzcGxheV92aWV3cy5naWYiKTsNCi0JZG9jdW1lbnQud3JpdGUoIlwiICBib3JkZXI9XCIwXCIgYWxpZ249XCJhYnNtaWRkbGVcIiBhbHQ9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgKyAiXCIgbmFtZT1cIiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMyArICJcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj4iICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgKyAiPFwvYT4iKTsNCi19DQotZWxzZSB7DQotCWRvY3VtZW50LndyaXRlKCImbmJzcDsiKTsNCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfZXMuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy90cmVlYnJvd3Nlcl9lcy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmUyOTA5Zi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy90cmVlYnJvd3Nlcl9lcy5qcworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIEhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTEgPSAiTGEgY29uZmlndXJhY2nDs24geWEgc2UgbXVlc3RyYSBtZWRpYW50ZSBsYXMgdmlzdGFzIjsNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgPSAiTW9zdHJhciBsYXMgdmlzdGFzIjsNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgPSAiSW5pY2lvIjsNCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiAocGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIgfHwgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvY19mcmFtZSIpICkNCi0gIHsNCi0gICAgIGFsZXJ0KHRyZWVicm93c2VyX2pzX01FU1NBR0UxKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOw0KLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArDQotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOw0KLSAgICAJDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotCXZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOyANCi0JaWYgKCAgbWFpbkluZGV4X2EgIT0gbnVsbCApIHsgDQotICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWY7IA0KLQl9IA0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsJCQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkNCi17DQotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsgICAgDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5zdWJzdHJpbmcoMCxtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7DQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7DQotICAgIHJldHVybiBuZXdfb3J5X2RvY19sb2M7ICAgIA0KLX0NCi0NCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0NCi0gICAgaWYoTVNGUGhvdmVyKQ0KLSAgICB7DQotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOw0KLSAgICAgICAgUnVwQmx1ZT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmJykpOw0KLSAgICB9DQotDQotDQotLy9uZXcgY29kZSB0byBkaXNwbGF5IHRoZSBsb2FkIGJ1dHRvbiBvciBub3QNCi12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsNCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLSAgIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2NfZnJhbWU7DQotfQ0KLQ0KLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7DQotCWRvY3VtZW50LndyaXRlKCI8YSBjbGFzcz1cImV4cGFuZENvbGxhcHNlTGlua1wiIGhyZWY9XCJKYXZhU2NyaXB0OmxvYWRUb3AoKTtcIiBvbm1vdXNlb3Zlcj1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IHNlbGYuc3RhdHVzPXRyZWVicm93c2VyX2pzX01FU1NBR0UyOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIiICsgYmFja1BhdGggKyAiaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmIik7DQotLy9TVEFSVCBOT04tVFJBTlNMQVRBQkxFDQotCWRvY3VtZW50LndyaXRlKCJcIiAgYm9yZGVyPVwiMFwiIGFsaWduPVwiYWJzbWlkZGxlXCIgYWx0PVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIlwiIG5hbWU9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgKyAiXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+IiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIjxcL2E+Iik7DQotLy9FTkQgTk9OLVRSQU5TTEFUQUJMRQ0KLX0NCi1lbHNlIHsNCi0JZG9jdW1lbnQud3JpdGUoIiZuYnNwOyIpOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy90cmVlYnJvd3Nlcl9mci5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2ZyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNTE4MGQyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2ZyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gSGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSA9ICJMYSBjb25maWd1cmF0aW9uIGVzdCBkw6lqw6AgYWZmaWNow6llIMOgIGwnYWlkZSBkZXMgdnVlcyI7DQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UyID0gIkFmZmljaGVyIGxlcyB2dWVzIjsNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgPSAiSG9tZSI7DQotDQotZnVuY3Rpb24gbG9hZFRvcCgpDQotew0KLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgKHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2MiIHx8IHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2NfZnJhbWUiKSApDQotICB7DQotICAgICBhbGVydCh0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsNCi0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsNCi0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKw0KLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsNCi0gICAgCQ0KLSAgICB2YXIgbWFpbkluZGV4X2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWFpbkluZGV4Iik7IA0KLQl2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsgDQotCWlmICggIG1haW5JbmRleF9hICE9IG51bGwgKSB7IA0KLSAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmOyANCi0JfSANCi0NCi0gICAgaWYobmV3X29yeV9kb2NfbG9jIT1udWxsKQ0KLSAgICB7DQotCWlmKCBzZWxmLm5hbWUgPT0gIm9yeV9kb2MiICkNCi0Jew0KLQkJd2luZG93LmNsb3NlKCk7DQotCQl3aW5kb3cub3BlbiggbmV3X29yeV9kb2NfbG9jICk7CQkNCi0JfQ0KLQllbHNlDQotCXsNCi0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7DQotCX0NCi0gICAgfQ0KLSAgIH0NCi19DQotDQotZnVuY3Rpb24gZ2V0SW1hZ2VVcmwoaW1hZ2UpDQotew0KLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jPW51bGw7ICAgIA0KLSAgICB2YXIgbWFpbkluZGV4X2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWFpbkluZGV4Iik7IA0KLSAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYuc3Vic3RyaW5nKDAsbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmLmxhc3RJbmRleE9mKCIvIikpOw0KLSAgICBuZXdfb3J5X2RvY19sb2MgPSBuZXdfb3J5X2RvY19sb2MgKyAiIiArIGltYWdlOw0KLSAgICByZXR1cm4gbmV3X29yeV9kb2NfbG9jOyAgICANCi19DQotDQotTVNGUGhvdmVyID0NCi0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8DQotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsNCi0NCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykNCi0gIHsNCi0gICAgIHZhciBhPW5ldyBJbWFnZSgpOw0KLSAgICAgYS5zcmM9aW1nOw0KLSAgICAgcmV0dXJuIGE7DQotICB9DQotDQotICAgIGlmKE1TRlBob3ZlcikNCi0gICAgew0KLSAgICAgICAgUnVwR3JheT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZicpKTsNCi0gICAgICAgIFJ1cEJsdWU9TVNGUHByZWxvYWQoZ2V0SW1hZ2VVcmwoJy9pbWFnZXMvZGlzcGxheV92aWV3c19hLmdpZicpKTsNCi0gICAgfQ0KLQ0KLQ0KLS8vbmV3IGNvZGUgdG8gZGlzcGxheSB0aGUgbG9hZCBidXR0b24gb3Igbm90DQotdmFyIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2M7DQotaWYgKG9yeV90b2NfZXhpc3QgPT0gInVuZGVmaW5lZCIpIHsNCi0gICBvcnlfdG9jX2V4aXN0ID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jX2ZyYW1lOw0KLX0NCi0NCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLQlkb2N1bWVudC53cml0ZSgiPGEgY2xhc3M9XCJleHBhbmRDb2xsYXBzZUxpbmtcIiBocmVmPVwiSmF2YVNjcmlwdDpsb2FkVG9wKCk7XCIgb25tb3VzZW92ZXI9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEJsdWUuc3JjOyBzZWxmLnN0YXR1cz10cmVlYnJvd3Nlcl9qc19NRVNTQUdFMjsgcmV0dXJuIHRydWVcIiBvbm1vdXNlb3V0PVwiaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBHcmF5LnNyYzsgc2VsZi5zdGF0dXM9ICcgJztyZXR1cm4gdHJ1ZVwiPiA8YnI+IDxpbWcgc3JjPVwiIiArIGJhY2tQYXRoICsgImltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZiIpOw0KLQlkb2N1bWVudC53cml0ZSgiXCIgIGJvcmRlcj1cIjBcIiBhbGlnbj1cImFic21pZGRsZVwiIGFsdD1cIiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiArICJcIiBuYW1lPVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UzICsgIlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiArICI8XC9hPiIpOw0KLX0NCi1lbHNlIHsNCi0JZG9jdW1lbnQud3JpdGUoIiZuYnNwOyIpOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy90cmVlYnJvd3Nlcl9pdC5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2l0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZTJmYWEwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2l0LmpzCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gSGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSA9ICJMYSBjb25maWd1cmF6aW9uZSB2aWVuZSBnacOgIHZpc3VhbGl6emF0YSBtZWRpYW50ZSBsZSB2aXN0ZSI7DQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UyID0gIlZpc3VhbGl6emEgdmlzdGUiOw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMyA9ICJIb21lIjsNCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiAocGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIgfHwgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvY19mcmFtZSIpICkNCi0gIHsNCi0gICAgIGFsZXJ0KHRyZWVicm93c2VyX2pzX01FU1NBR0UxKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOw0KLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArDQotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOw0KLSAgICAJDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotCXZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOyANCi0JaWYgKCAgbWFpbkluZGV4X2EgIT0gbnVsbCApIHsgDQotICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWY7IA0KLQl9IA0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsJCQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkNCi17DQotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsgICAgDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5zdWJzdHJpbmcoMCxtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7DQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7DQotICAgIHJldHVybiBuZXdfb3J5X2RvY19sb2M7ICAgIA0KLX0NCi0NCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0NCi0gICAgaWYoTVNGUGhvdmVyKQ0KLSAgICB7DQotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOw0KLSAgICAgICAgUnVwQmx1ZT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmJykpOw0KLSAgICB9DQotDQotDQotLy9uZXcgY29kZSB0byBkaXNwbGF5IHRoZSBsb2FkIGJ1dHRvbiBvciBub3QNCi12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsNCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLSAgIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2NfZnJhbWU7DQotfQ0KLQ0KLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7DQotCWRvY3VtZW50LndyaXRlKCI8YSBjbGFzcz1cImV4cGFuZENvbGxhcHNlTGlua1wiIGhyZWY9XCJKYXZhU2NyaXB0OmxvYWRUb3AoKTtcIiBvbm1vdXNlb3Zlcj1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IHNlbGYuc3RhdHVzPXRyZWVicm93c2VyX2pzX01FU1NBR0UyOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIiICsgYmFja1BhdGggKyAiaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmIik7DQotCWRvY3VtZW50LndyaXRlKCJcIiAgYm9yZGVyPVwiMFwiIGFsaWduPVwiYWJzbWlkZGxlXCIgYWx0PVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIlwiIG5hbWU9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgKyAiXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+IiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIjxcL2E+Iik7DQotfQ0KLWVsc2Ugew0KLQlkb2N1bWVudC53cml0ZSgiJm5ic3A7Iik7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2phLmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfamEuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlZTU5N2QuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfamEuanMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBIZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UxID0gIuani+aIkOOBr+aXouOBq+ODk+ODpeODvOOCkuS9v+eUqOOBl+OBpuihqOekuuOBleOCjOOBpuOBhOOBvuOBmeOAgiAiOw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiA9ICLjg5Pjg6Xjg7zjga7ooajnpLoiOw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMyA9ICLjg5vjg7zjg6AiOw0KLQ0KLWZ1bmN0aW9uIGxvYWRUb3AoKQ0KLXsNCi0gIGlmKHBhcmVudC5mcmFtZXMubGVuZ3RoIT0wICYmIChwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIiB8fCBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jX2ZyYW1lIikgKQ0KLSAgew0KLSAgICAgYWxlcnQodHJlZWJyb3dzZXJfanNfTUVTU0FHRTEpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7DQotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7DQotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsNCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7DQotICAgIAkNCi0gICAgdmFyIG1haW5JbmRleF9hID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIm1haW5JbmRleCIpOyANCi0JdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7IA0KLQlpZiAoICBtYWluSW5kZXhfYSAhPSBudWxsICkgeyANCi0gICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZjsgDQotCX0gDQotDQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkNCi0gICAgew0KLQlpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApDQotCXsNCi0JCXdpbmRvdy5jbG9zZSgpOw0KLQkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOwkJDQotCX0NCi0JZWxzZQ0KLQl7DQotCSAgICAgICAJdG9wLmxvY2F0aW9uID0gbmV3X29yeV9kb2NfbG9jOw0KLQl9DQotICAgIH0NCi0gICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldEltYWdlVXJsKGltYWdlKQ0KLXsNCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYz1udWxsOyAgICANCi0gICAgdmFyIG1haW5JbmRleF9hID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIm1haW5JbmRleCIpOyANCi0gICAgbmV3X29yeV9kb2NfbG9jID0gbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmLnN1YnN0cmluZygwLG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5sYXN0SW5kZXhPZigiLyIpKTsNCi0gICAgbmV3X29yeV9kb2NfbG9jID0gbmV3X29yeV9kb2NfbG9jICsgIiIgKyBpbWFnZTsNCi0gICAgcmV0dXJuIG5ld19vcnlfZG9jX2xvYzsgICAgDQotfQ0KLQ0KLU1TRlBob3ZlciA9DQotKCgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gMyApKSB8fA0KLSAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApKSk7DQotDQotICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpDQotICB7DQotICAgICB2YXIgYT1uZXcgSW1hZ2UoKTsNCi0gICAgIGEuc3JjPWltZzsNCi0gICAgIHJldHVybiBhOw0KLSAgfQ0KLQ0KLSAgICBpZihNU0ZQaG92ZXIpDQotICAgIHsNCi0gICAgICAgIFJ1cEdyYXk9TVNGUHByZWxvYWQoZ2V0SW1hZ2VVcmwoJy9pbWFnZXMvZGlzcGxheV92aWV3cy5naWYnKSk7DQotICAgICAgICBSdXBCbHVlPU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3NfYS5naWYnKSk7DQotICAgIH0NCi0NCi0NCi0vL25ldyBjb2RlIHRvIGRpc3BsYXkgdGhlIGxvYWQgYnV0dG9uIG9yIG5vdA0KLXZhciBvcnlfdG9jX2V4aXN0ID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jOw0KLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7DQotICAgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvY19mcmFtZTsNCi19DQotDQotaWYgKG9yeV90b2NfZXhpc3QgPT0gInVuZGVmaW5lZCIpIHsNCi0JZG9jdW1lbnQud3JpdGUoIjxhIGNsYXNzPVwiZXhwYW5kQ29sbGFwc2VMaW5rXCIgaHJlZj1cIkphdmFTY3JpcHQ6bG9hZFRvcCgpO1wiIG9ubW91c2VvdmVyPVwiaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBCbHVlLnNyYzsgc2VsZi5zdGF0dXM9dHJlZWJyb3dzZXJfanNfTUVTU0FHRTI7IHJldHVybiB0cnVlXCIgb25tb3VzZW91dD1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwR3JheS5zcmM7IHNlbGYuc3RhdHVzPSAnICc7cmV0dXJuIHRydWVcIj4gPGJyPiA8aW1nIHNyYz1cIiIgKyBiYWNrUGF0aCArICJpbWFnZXMvZGlzcGxheV92aWV3cy5naWYiKTsNCi0vL1NUQVJUIE5PTi1UUkFOU0xBVEFCTEUNCi0JZG9jdW1lbnQud3JpdGUoIlwiICBib3JkZXI9XCIwXCIgYWxpZ249XCJhYnNtaWRkbGVcIiBhbHQ9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgKyAiXCIgbmFtZT1cIiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMyArICJcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj4iICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgKyAiPFwvYT4iKTsNCi0vL0VORCBOT04tVFJBTlNMQVRBQkxFDQotfQ0KLWVsc2Ugew0KLQlkb2N1bWVudC53cml0ZSgiJm5ic3A7Iik7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2tvLmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfa28uanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlMzc0MzUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfa28uanMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBIZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UxID0gIuq1rOyEseydtCDsnbTrr7gg67O06riw66W8IOyCrOyaqe2VmOyXrCDtkZzsi5zrkJjsl4jsirXri4jri6QuIjsNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgPSAi67O06riwIO2RnOyLnCI7DQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UzID0gIu2ZiCI7DQotDQotZnVuY3Rpb24gbG9hZFRvcCgpDQotew0KLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgKHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2MiIHx8IHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2NfZnJhbWUiKSApDQotICB7DQotICAgICBhbGVydCh0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsNCi0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsNCi0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKw0KLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsNCi0gICAgCQ0KLSAgICB2YXIgbWFpbkluZGV4X2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWFpbkluZGV4Iik7IA0KLQl2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsgDQotCWlmICggIG1haW5JbmRleF9hICE9IG51bGwgKSB7IA0KLSAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmOyANCi0JfSANCi0NCi0gICAgaWYobmV3X29yeV9kb2NfbG9jIT1udWxsKQ0KLSAgICB7DQotCWlmKCBzZWxmLm5hbWUgPT0gIm9yeV9kb2MiICkNCi0Jew0KLQkJd2luZG93LmNsb3NlKCk7DQotCQl3aW5kb3cub3BlbiggbmV3X29yeV9kb2NfbG9jICk7CQkNCi0JfQ0KLQllbHNlDQotCXsNCi0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7DQotCX0NCi0gICAgfQ0KLSAgIH0NCi19DQotDQotZnVuY3Rpb24gZ2V0SW1hZ2VVcmwoaW1hZ2UpDQotew0KLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jPW51bGw7ICAgIA0KLSAgICB2YXIgbWFpbkluZGV4X2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWFpbkluZGV4Iik7IA0KLSAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYuc3Vic3RyaW5nKDAsbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmLmxhc3RJbmRleE9mKCIvIikpOw0KLSAgICBuZXdfb3J5X2RvY19sb2MgPSBuZXdfb3J5X2RvY19sb2MgKyAiIiArIGltYWdlOw0KLSAgICByZXR1cm4gbmV3X29yeV9kb2NfbG9jOyAgICANCi19DQotDQotTVNGUGhvdmVyID0NCi0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8DQotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsNCi0NCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykNCi0gIHsNCi0gICAgIHZhciBhPW5ldyBJbWFnZSgpOw0KLSAgICAgYS5zcmM9aW1nOw0KLSAgICAgcmV0dXJuIGE7DQotICB9DQotDQotICAgIGlmKE1TRlBob3ZlcikNCi0gICAgew0KLSAgICAgICAgUnVwR3JheT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZicpKTsNCi0gICAgICAgIFJ1cEJsdWU9TVNGUHByZWxvYWQoZ2V0SW1hZ2VVcmwoJy9pbWFnZXMvZGlzcGxheV92aWV3c19hLmdpZicpKTsNCi0gICAgfQ0KLQ0KLQ0KLS8vbmV3IGNvZGUgdG8gZGlzcGxheSB0aGUgbG9hZCBidXR0b24gb3Igbm90DQotdmFyIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2M7DQotaWYgKG9yeV90b2NfZXhpc3QgPT0gInVuZGVmaW5lZCIpIHsNCi0gICBvcnlfdG9jX2V4aXN0ID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jX2ZyYW1lOw0KLX0NCi0NCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLQlkb2N1bWVudC53cml0ZSgiPGEgY2xhc3M9XCJleHBhbmRDb2xsYXBzZUxpbmtcIiBocmVmPVwiSmF2YVNjcmlwdDpsb2FkVG9wKCk7XCIgb25tb3VzZW92ZXI9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEJsdWUuc3JjOyBzZWxmLnN0YXR1cz10cmVlYnJvd3Nlcl9qc19NRVNTQUdFMjsgcmV0dXJuIHRydWVcIiBvbm1vdXNlb3V0PVwiaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBHcmF5LnNyYzsgc2VsZi5zdGF0dXM9ICcgJztyZXR1cm4gdHJ1ZVwiPiA8YnI+IDxpbWcgc3JjPVwiIiArIGJhY2tQYXRoICsgImltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZiIpOw0KLS8vU1RBUlQgTk9OLVRSQU5TTEFUQUJMRQ0KLQlkb2N1bWVudC53cml0ZSgiXCIgIGJvcmRlcj1cIjBcIiBhbGlnbj1cImFic21pZGRsZVwiIGFsdD1cIiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiArICJcIiBuYW1lPVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UzICsgIlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiArICI8XC9hPiIpOw0KLS8vRU5EIE5PTi1UUkFOU0xBVEFCTEUNCi19DQotZWxzZSB7DQotCWRvY3VtZW50LndyaXRlKCImbmJzcDsiKTsNCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfcHRfQlIuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy90cmVlYnJvd3Nlcl9wdF9CUi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmNkN2EzZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy90cmVlYnJvd3Nlcl9wdF9CUi5qcworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIEhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTEgPSAiQSBjb25maWd1cmHDp8OjbyBqw6Egw6kgZXhpYmlkYSB1dGlsaXphbmRvIHZpc3VhbGl6YcOnw7VlcyI7DQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UyID0gIkV4aWJpciB2aXN1YWxpemHDp8O1ZXMiOw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMyA9ICJIb21lIjsNCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiAocGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIgfHwgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvY19mcmFtZSIpICkNCi0gIHsNCi0gICAgIGFsZXJ0KHRyZWVicm93c2VyX2pzX01FU1NBR0UxKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOw0KLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArDQotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOw0KLSAgICAJDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotCXZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOyANCi0JaWYgKCAgbWFpbkluZGV4X2EgIT0gbnVsbCApIHsgDQotICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWY7IA0KLQl9IA0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsJCQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkNCi17DQotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsgICAgDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5zdWJzdHJpbmcoMCxtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7DQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7DQotICAgIHJldHVybiBuZXdfb3J5X2RvY19sb2M7ICAgIA0KLX0NCi0NCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0NCi0gICAgaWYoTVNGUGhvdmVyKQ0KLSAgICB7DQotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOw0KLSAgICAgICAgUnVwQmx1ZT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmJykpOw0KLSAgICB9DQotDQotDQotLy9uZXcgY29kZSB0byBkaXNwbGF5IHRoZSBsb2FkIGJ1dHRvbiBvciBub3QNCi12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsNCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLSAgIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2NfZnJhbWU7DQotfQ0KLQ0KLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7DQotCWRvY3VtZW50LndyaXRlKCI8YSBjbGFzcz1cImV4cGFuZENvbGxhcHNlTGlua1wiIGhyZWY9XCJKYXZhU2NyaXB0OmxvYWRUb3AoKTtcIiBvbm1vdXNlb3Zlcj1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IHNlbGYuc3RhdHVzPXRyZWVicm93c2VyX2pzX01FU1NBR0UyOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIiICsgYmFja1BhdGggKyAiaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmIik7DQotCWRvY3VtZW50LndyaXRlKCJcIiAgYm9yZGVyPVwiMFwiIGFsaWduPVwiYWJzbWlkZGxlXCIgYWx0PVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIlwiIG5hbWU9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgKyAiXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+IiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIjxcL2E+Iik7DQotfQ0KLWVsc2Ugew0KLQlkb2N1bWVudC53cml0ZSgiJm5ic3A7Iik7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX3poX0NOLmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfemhfQ04uanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3MjY1NTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfemhfQ04uanMKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBIZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UxID0gIumFjee9ruW3suS9v+eUqOinhuWbvuaYvuekuiI7DQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UyID0gIuaYvuekuuinhuWbviI7DQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UzID0gIuS4u+mhtSI7DQotDQotZnVuY3Rpb24gbG9hZFRvcCgpDQotew0KLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgKHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2MiIHx8IHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2NfZnJhbWUiKSApDQotICB7DQotICAgICBhbGVydCh0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsNCi0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsNCi0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKw0KLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsNCi0gICAgCQ0KLSAgICB2YXIgbWFpbkluZGV4X2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWFpbkluZGV4Iik7IA0KLQl2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsgDQotCWlmICggIG1haW5JbmRleF9hICE9IG51bGwgKSB7IA0KLSAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmOyANCi0JfSANCi0NCi0gICAgaWYobmV3X29yeV9kb2NfbG9jIT1udWxsKQ0KLSAgICB7DQotCWlmKCBzZWxmLm5hbWUgPT0gIm9yeV9kb2MiICkNCi0Jew0KLQkJd2luZG93LmNsb3NlKCk7DQotCQl3aW5kb3cub3BlbiggbmV3X29yeV9kb2NfbG9jICk7CQkNCi0JfQ0KLQllbHNlDQotCXsNCi0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7DQotCX0NCi0gICAgfQ0KLSAgIH0NCi19DQotDQotZnVuY3Rpb24gZ2V0SW1hZ2VVcmwoaW1hZ2UpDQotew0KLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jPW51bGw7ICAgIA0KLSAgICB2YXIgbWFpbkluZGV4X2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWFpbkluZGV4Iik7IA0KLSAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYuc3Vic3RyaW5nKDAsbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmLmxhc3RJbmRleE9mKCIvIikpOw0KLSAgICBuZXdfb3J5X2RvY19sb2MgPSBuZXdfb3J5X2RvY19sb2MgKyAiIiArIGltYWdlOw0KLSAgICByZXR1cm4gbmV3X29yeV9kb2NfbG9jOyAgICANCi19DQotDQotTVNGUGhvdmVyID0NCi0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8DQotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsNCi0NCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykNCi0gIHsNCi0gICAgIHZhciBhPW5ldyBJbWFnZSgpOw0KLSAgICAgYS5zcmM9aW1nOw0KLSAgICAgcmV0dXJuIGE7DQotICB9DQotDQotICAgIGlmKE1TRlBob3ZlcikNCi0gICAgew0KLSAgICAgICAgUnVwR3JheT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZicpKTsNCi0gICAgICAgIFJ1cEJsdWU9TVNGUHByZWxvYWQoZ2V0SW1hZ2VVcmwoJy9pbWFnZXMvZGlzcGxheV92aWV3c19hLmdpZicpKTsNCi0gICAgfQ0KLQ0KLQ0KLS8vbmV3IGNvZGUgdG8gZGlzcGxheSB0aGUgbG9hZCBidXR0b24gb3Igbm90DQotdmFyIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2M7DQotaWYgKG9yeV90b2NfZXhpc3QgPT0gInVuZGVmaW5lZCIpIHsNCi0gICBvcnlfdG9jX2V4aXN0ID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jX2ZyYW1lOw0KLX0NCi0NCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLQlkb2N1bWVudC53cml0ZSgiPGEgY2xhc3M9XCJleHBhbmRDb2xsYXBzZUxpbmtcIiBocmVmPVwiSmF2YVNjcmlwdDpsb2FkVG9wKCk7XCIgb25tb3VzZW92ZXI9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEJsdWUuc3JjOyBzZWxmLnN0YXR1cz10cmVlYnJvd3Nlcl9qc19NRVNTQUdFMjsgcmV0dXJuIHRydWVcIiBvbm1vdXNlb3V0PVwiaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBHcmF5LnNyYzsgc2VsZi5zdGF0dXM9ICcgJztyZXR1cm4gdHJ1ZVwiPiA8YnI+IDxpbWcgc3JjPVwiIiArIGJhY2tQYXRoICsgImltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZiIpOw0KLQlkb2N1bWVudC53cml0ZSgiXCIgIGJvcmRlcj1cIjBcIiBhbGlnbj1cImFic21pZGRsZVwiIGFsdD1cIiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiArICJcIiBuYW1lPVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UzICsgIlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiArICI8XC9hPiIpOw0KLX0NCi1lbHNlIHsNCi0JZG9jdW1lbnQud3JpdGUoIiZuYnNwOyIpOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy90cmVlYnJvd3Nlcl96aF9UVy5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX3poX1RXLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YzYxYmNiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX3poX1RXLmpzCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gSGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSA9ICLlt7Lkvb/nlKjoppblnJbkvobpoa/npLrphY3nva4iOw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiA9ICLpoa/npLroppblnJYiOw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMyA9ICJIb21lIjsNCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiAocGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIgfHwgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvY19mcmFtZSIpICkNCi0gIHsNCi0gICAgIGFsZXJ0KHRyZWVicm93c2VyX2pzX01FU1NBR0UxKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOw0KLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArDQotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOw0KLSAgICAJDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotCXZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOyANCi0JaWYgKCAgbWFpbkluZGV4X2EgIT0gbnVsbCApIHsgDQotICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWY7IA0KLQl9IA0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsJCQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkNCi17DQotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsgICAgDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5zdWJzdHJpbmcoMCxtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7DQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7DQotICAgIHJldHVybiBuZXdfb3J5X2RvY19sb2M7ICAgIA0KLX0NCi0NCi0NCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0NCi0gICAgaWYoTVNGUGhvdmVyKQ0KLSAgICB7DQotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOw0KLSAgICAgICAgUnVwQmx1ZT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmJykpOw0KLSAgICB9DQotDQotDQotLy9uZXcgY29kZSB0byBkaXNwbGF5IHRoZSBsb2FkIGJ1dHRvbiBvciBub3QNCi12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsNCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLSAgIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2NfZnJhbWU7DQotfQ0KLQ0KLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7DQotCWRvY3VtZW50LndyaXRlKCI8YSBjbGFzcz1cImV4cGFuZENvbGxhcHNlTGlua1wiIGhyZWY9XCJKYXZhU2NyaXB0OmxvYWRUb3AoKTtcIiBvbm1vdXNlb3Zlcj1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IHNlbGYuc3RhdHVzPXRyZWVicm93c2VyX2pzX01FU1NBR0UyOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIiICsgYmFja1BhdGggKyAiaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmIik7DQotCWRvY3VtZW50LndyaXRlKCJcIiAgYm9yZGVyPVwiMFwiIGFsaWduPVwiYWJzbWlkZGxlXCIgYWx0PVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIlwiIG5hbWU9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgKyAiXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+IiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIjxcL2E+Iik7DQotfQ0KLWVsc2Ugew0KLQlkb2N1bWVudC53cml0ZSgiJm5ic3A7Iik7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDYwZDEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLWFkZGl0aW9uYWxJbmZvVGV4dD1adXNcdTAwZTR0emxpY2hlIEluZm9ybWF0aW9uZW4NCi1hZGRpdGlvbmFsUGVyZm9ybWVyVGV4dD1adXNcdTAwZTR0emxpY2hlIEF1c2ZcdTAwZmNocmVuZGUNCi1hZ2dyZWdhdGVzVGV4dD1adXNhbW1lbmZhc3N1bmdlbg0KLWFsdGVybmF0aXZlc1RleHQ9QWx0ZXJuYXRpdmVuDQotYXBwbGljYXRpb25UZXh0PUFud2VuZHVuZw0KLWFydGlmYWN0VGV4dD1BcnRlZmFrdA0KLWFzc2V0c1RleHQ9QXNzZXRzDQotYXNzaWdubWVudEFwcHJvYWNoZXNUZXh0PVp1b3JkbnVuZ3NzdHJhdGVnaWVuDQotYXNzaXN0aW5nVGV4dD1VbnRlcnN0XHUwMGZjdHplbmRlIFJvbGxlbg0KLWJhY2tncm91bmRUZXh0PUhpbnRlcmdydW5kDQotYnJpZWZPdXRsaW5lVGV4dD1LdXJ6ZSBHbGllZGVydW5nDQotY2hlY2tJdGVtc1RleHQ9UHJcdTAwZmNmbGlzdGVuZWludHJcdTAwZTRnZQ0KLWNoZWNrbGlzdHNUZXh0PVByXHUwMGZjZmxpc3Rlbg0KLWNvbGxhcHNlQWxsVGV4dD1BbGxlIFByXHUwMGZjZmxpc3RlbmVpbnRyXHUwMGU0Z2UgYXVzYmxlbmRlbg0KLWNvbXBvc2l0ZVJvbGVUZXh0PUtvbWJpbmllcnRlIFJvbGxlDQotY29uY2VwdHNUZXh0PUtvbnplcHRlDQotY29udGFpbmVkQXJ0aWZhY3RzVGV4dD1FbnRoYWx0ZW5lIEFydGVmYWt0ZQ0KLWNvbnRhaW5lckFydGlmYWN0VGV4dD1Db250YWluZXJhcnRlZmFrdA0KLWNvbnRlbnRFbGVtZW50c1RleHQ9S2F0ZWdvcmlzaWVydGUgRWxlbWVudGUNCi1jb250ZW50UmVmZXJlbmNlc1RleHQ9SW5oYWx0c3JlZmVyZW56ZW4NCi1kZWxpdmVyYWJsZVRleHQ9TGllZmVyZ2VnZW5zdGFuZA0KLWRlbGl2ZXJhYmxlUHJvcGVydGllc1RleHQ9TWVya21hbGUgZGVzIExpZWZlcmdlZ2Vuc3RhbmRzDQotZGVsaXZlcmVkUGFydHNUZXh0PVRlaWxlIGRlcyBMaWVmZXJnZWdlbnN0YW5kcw0KLWRlbGl2ZXJlZFdvcmtQcm9kdWN0c1RleHQ9R2VsaWVmZXJ0ZSBBcmJlaXRzZXJnZWJuaXNzZQ0KLWRlcGVuZGVudFRleHQ9QWJoXHUwMGU0bmdpZ2UgQXJiZWl0c2VyZ2Vibmlzc2UNCi1kZXNjcmlwdGlvblRleHQ9QmVzY2hyZWlidW5nDQotZGlzY2lwbGluZVRleHQ9RGlzemlwbGluDQotZGlzY2lwbGluZXNUZXh0PURpc3ppcGxpbmVuDQotc3ViZGlzY2lwbGluZXNUZXh0PVVudGVyZGlzemlwbGluZW4NCi1kb21haW5UZXh0PURvbVx1MDBlNG5lDQotZG9tYWluc1RleHQ9RG9tXHUwMGU0bmVuDQotZXhhbXBsZXNUZXh0PUJlaXNwaWVsZQ0KLWV4cGFuZEFsbFRleHQ9QWxsZSBQclx1MDBmY2ZsaXN0ZW5laW50clx1MDBlNGdlIGVpbmJsZW5kZW4NCi1leHRlbmRzVGV4dD1FcndlaXRlcnVuZw0KLWV4dGVybmFsVGV4dD1FeHRlcm4NCi1leHRlcm5hbERlc2NyaXB0aW9uVGV4dD1FeHRlcm5lIEJlc2NocmVpYnVuZw0KLWdvYWxzVGV4dD1aaWVsZQ0KLWd1aWRlbGluZXNUZXh0PVJpY2h0bGluaWVuDQotaWxsdXN0cmF0aW9uc1RleHQ9QWJiaWxkdW5nZW4NCi1pbXBhY3RPZk5vdEhhdmluZ1RleHQ9QXVzd2lya3VuZ2VuIGJlaSBOaWNodHZlcndlbmR1bmcNCi1pbXBhY3RpbmdUZXh0PU1hXHUwMGRmZ2VibGljaGUgQXJiZWl0c2VyZ2Vibmlzc2UNCi1pbnB1dHNUZXh0PUVpbmdhYmVuDQotaW5wdXRUb1RleHQ9RWluZ2FiZSBmXHUwMGZjcg0KLWl0ZW1zVGV4dD1FaW50clx1MDBlNGdlDQota2V5Q29uc2lkZXJhdGlvbnNUZXh0PVdpY2h0aWdlIEhpbndlaXNlDQotbGV2ZWxzT2ZBZG9wdGlvblRleHQ9RWluZlx1MDBmY2hydW5nc3N0dWZlbg0KLW1hbmRhdG9yeVRleHQ9VmVyYmluZGxpY2gNCi1tYWluVGV4dD1IYXVwdHJvbGxlbg0KLW1haW5EZXNjcmlwdGlvblRleHQ9SGF1cHRiZXNjaHJlaWJ1bmcNCi1tYWluUmVzcG9uc2libGVUZXh0PUhhdXB0dmVyYW50d29ydGxpY2hlDQotbWV0aG9kVGV4dD1NZXRob2RlbmFyYmVpdHNlcmdlYm5pcw0KLW1vZGlmaWVkQnlUZXh0PUdlXHUwMGU0bmRlcnQgdm9uDQotbW9yZUluZm9UZXh0PVdlaXRlcmUgSW5mb3JtYXRpb25lbg0KLW5vdGF0aW9uVGV4dD1Ob3RhdGlvbg0KLW9wdGlvbmFsVGV4dD1PcHRpb25hbA0KLW91dGNvbWVUZXh0PVJlc3VsdGF0DQotb3V0cHV0RnJvbVRleHQ9QXVzZ2FiZSB2b24NCi1vdXRwdXRzVGV4dD1BdXNnYWJlbg0KLXBhY2thZ2luZ0luc3RydWN0aW9uc1RleHQ9QW53ZWlzdW5nZW4genVtIFBhY2tlbg0KLXBhY2thZ2luZ0d1aWRhbmNlVGV4dD1BbmxlaXR1bmcgenVtIFBhY2tlbg0KLXBlcmZvcm1pbmdSb2xlc1RleHQ9QXVzZlx1MDBmY2hyZW5kZSBSb2xsZW4NCi1wcmltYXJ5UGVyZm9ybWVyVGV4dD1QcmltXHUwMGU0cmVyIEF1c2ZcdTAwZmNocmVuZGVyDQotcHJvYmxlbVRleHQ9UHJvYmxlbQ0KLXByb3BlcnRpZXNUZXh0PUVpZ2Vuc2NoYWZ0ZW4NCi1wdXJwb3NlVGV4dD1ad2Vjaw0KLXJlYXNvbnNGb3JOb3ROZWVkaW5nVGV4dD1Hclx1MDBmY25kZSBmXHUwMGZjciBOaWNodHZlcndlbmR1bmcNCi1yZWZlcmVuY2VXb3JrZmxvd3NUZXh0PVJlZmVyZW56d29ya2Zsb3dzDQotcmVsYXRlZEVsZW1lbnRzVGV4dD1adWdlaFx1MDBmNnJpZ2UgRWxlbWVudGUNCi1yZWxhdGlvbnNoaXBzVGV4dD1CZXppZWh1bmdlbg0KLXJlcG9ydHNUZXh0PUJlcmljaHRlDQotcmVwcmVzZW50YXRpb25PcHRpb25zVGV4dD1EYXJzdGVsbHVuZ3NvcHRpb25lbg0KLXJlc3BvbnNpYmxlVGV4dD1WZXJhbnR3b3J0bGljaA0KLXJlc3BvbnNpYmxlRm9yVGV4dD1WZXJhbnR3b3J0bGljaCBmXHUwMGZjcg0KLXJldXNhYmxlQXNzZXRzVGV4dD1XaWVkZXJ2ZXJ3ZW5kYmFyZSBBc3NldHMNCi1yb2xlVGV4dD1Sb2xsZQ0KLXJvbGVzVGV4dD1Sb2xsZW4NCi1yb2xlU2V0c1RleHQ9Um9sbGVuZ3J1cHBlbg0KLXNraWxsc1RleHQ9S25vdy1ob3cNCi1zdGFmZmluZ1RleHQ9TWl0YXJiZWl0ZXJhdXN3YWhsDQotc3RlcHNUZXh0PVNjaHJpdHRlDQotc3ViY2F0ZWdvcmllc1RleHQ9VW50ZXJrYXRlZ29yaWVuIA0KLXN1YmRvbWFpbnNUZXh0PVVudGVyZG9tXHUwMGU0bmVuDQotc3ViUHJhY3RpY2VzVGV4dD1VbnRlcmdlb3JkbmV0ZSBWZXJmYWhyZW4NCi1zdXBlclRlYW1UZXh0PVByb2ZpbCBkZXMgU3VwZXJ0ZWFtcw0KLXN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0PVVudGVyc3RcdTAwZmN0emVuZGVzIE1hdGVyaWFsDQotc3VidGVhbXNUZXh0PVByb2ZpbGUgdm9uIHVudGVyZ2VvcmRuZXRlbiBUZWFtcw0KLXN5bm9ueW1zVGV4dD1TeW5vbnltZQ0KLXRhaWxvcmluZ1RleHQ9QW5wYXNzdW5nDQotdGFza1RleHQ9QXVmZ2FiZQ0KLXRhc2tzVGV4dD1BdWZnYWJlbg0KLXRic1RleHQ9VGVhbXp1b3JkbnVuZw0KLXRlYW1Qcm9maWxlVGV4dD1UZWFtcHJvZmlsDQotdGVhbVJvbGVzVGV4dD1Sb2xsZW4gaW0gVGVhbXByb2ZpbA0KLXRlY2huaXF1ZXNUZXh0PVJpY2h0bGluaWVuDQotdGVtcGxhdGVGaWxlc1RleHQ9Vm9ybGFnZW5kYXRlaWVuDQotdGVtcGxhdGVzVGV4dD1Wb3JsYWdlbg0KLXRvb2xNZW50b3JzVGV4dD1Ub29sbWVudG9yZW4NCi10b29sVGV4dD1Ub29sDQotdXNhZ2VUZXh0PVZlcndlbmR1bmcNCi13YnNUZXh0PVByb2pla3RzdHJ1a3R1cnBsYW4NCi13aGl0ZXBhcGVyc1RleHQ9V2hpdGUgUGFwZXINCi13b3JrUHJvZHVjdHNUZXh0PUFyYmVpdHNlcmdlYm5pc3NlDQotd29ya1Byb2R1Y3RUeXBlc1RleHQ9QXJ0ZW4gdm9uIEFyYmVpdHNlcmdlYm5pc3Nlbg0KLXdwYnNUZXh0PVZlcndlbmR1bmcgZGVyIEFyYmVpdHNlcmdlYm5pc3NlDQotd29ya0JyZWFrZG93blRleHQ9UHJvamVrdHN0cnVrdHVyDQotd29ya2Zsb3dUZXh0PVdvcmtmbG93DQotd29ya1Byb2R1Y3RCcmVha2Rvd25UZXh0PUFyYmVpdHNlcmdlYm5pc3N0cnVrdHVyDQotd29ya1Byb2R1Y3REZXBlbmRlbmNpZXNUZXh0PUFyYmVpdHNlcmdlYm5pc2FiaFx1MDBlNG5naWdrZWl0ZW4NCi10ZWFtUHJvZmlsZUJyZWFrZG93blRleHQ9VGVhbXN0cnVrdHVyDQotdGVhbVN0cnVjdHVyZVRleHQ9VGVhbXp1c2FtbWVuc2V0enVuZw0KLXBhZ2VOb3RJbnN0YWxsZWRUZXh0PVNlaXRlIG5pY2h0IGluc3RhbGxpZXJ0DQotZWxlbWVudERvZXNOb3RFeGlzdFRleHQ9RWxlbWVudCBuaWNodCB2b3JoYW5kZW4NCi1pc05vdFZhbGlkVGV4dD1EYXMgcmVmZXJlbnppZXJ0ZSBFbGVtZW50IGlzdCBrZWluIGdcdTAwZmNsdGlnZXMgRWxlbWVudCBpbiBkZXIgYWt0dWVsbGVuIEJpYmxpb3RoZWsuDQotZWxlbWVudE1pZ2h0QmVEZWxldGVkVGV4dD1EYXMgRWxlbWVudCB3dXJkZSBtXHUwMGY2Z2xpY2hlcndlaXNlIGF1cyBkZXIgQmlibGlvdGhlayBnZWxcdTAwZjZzY2h0Lg0KLXBsZWFzZUZpeExpbmtUZXh0PVx1MDBkY2JlcnByXHUwMGZjZmVuIFNpZSBkaWUgSW5oYWx0c2JpYmxpb3RoZWsgdW5kIGtvcnJpZ2llcmVuIFNpZSBkZW4gTGluay4NCi1pbmZvQWJvdXRNaXNzaW5nRWxlbWVudFRleHQ9SW5mb3JtYXRpb25lbiB6dW0gZmVobGVuZGVuIEVsZW1lbnQ6DQotZWxlbWVudE5hbWVUZXh0PUVsZW1lbnRuYW1lOg0KLWd1aWRUZXh0PUdVSUQ6DQotbWlzc2luZ0VsZW1lbnRUZXh0PURpZSByZWZlcmVuemllcnRlIFNlaXRlIGlzdCBuaWNodCBpbiBkZXIgS29uZmlndXJhdGlvbiBlbnRoYWx0ZW4uDQotbm90QXZhaWxhYmxlVGV4dD1EaWUgcmVmZXJlbnppZXJ0ZSBTZWl0ZSBpc3QgbmljaHQgaW4gZGVyIGFrdHVlbGxlbiBLb25maWd1cmF0aW9uIHZlcmZcdTAwZmNnYmFyLiBNXHUwMGY2Z2xpY2hlcndlaXNlIGlzdCBkaWVzZSBTZWl0ZSBpbiBlaW5lciBhbmRlcmVuIFByb3plc3Nrb25maWd1cmF0aW9uIHZlcmZcdTAwZmNnYmFyLg0KLWVsZW1lbnRUeXBlVGV4dD1FbGVtZW50dHlwOg0KLXBsdWdpbk5hbWVUZXh0PVBsdWctaW4tTmFtZToNCi1wcmVkZWNlc3NvclRleHQ9Vm9yZ1x1MDBlNG5nZXINCi1wbGFubmluZ0RhdGFUZXh0PVBsYW5uaW5nRGF0YQ0KLW11bHRpcGxlT2NjdXJyZW5jZXNUZXh0PU1laHJlcmUgVm9ya29tbWVuDQotZXZlbnREcml2ZW5UZXh0PUVyZWlnbmlzZ2VzdGV1ZXJ0DQotb25nb2luZ1RleHQ9Rm9ydGxhdWZlbmQNCi1wbGFubmVkVGV4dD1HZXBsYW50DQotcmVwZWF0YWJsZVRleHQ9V2llZGVyaG9sdCBhbndlbmRiYXINCi11c2FnZUd1aWRhbmNlVGV4dD1BbmxlaXR1bmcgenVyIFZlcndlbmR1bmcNCi1pbnB1dHNUZXh0PUVpbmdhYmVuDQotb3V0cHV0c1RleHQ9QXVzZ2FiZW4NCi1hY3Rpdml0eUVudHJ5U3RhdGVUZXh0PUFuZmFuZ3N6dXN0YW5kIGRlciBBa3Rpdml0XHUwMGU0dA0KLWFjdGl2aXR5RXhpdFN0YXRlVGV4dD1FbmR6dXN0YW5kIGRlciBBa3Rpdml0XHUwMGU0dA0KLXByZWZpeFRleHQ9UHJcdTAwZTRmaXgNCi1leHRlcm5hbElkVGV4dD1FeHRlcm5lIElEDQotc2NvcGVUZXh0PVNjb3BlDQotcm9hZG1hcFRleHQ9Um9hZG1hcA0KLXR5cGVvZkNvbnRyYWN0VGV4dD1UeXAgZGVzIFZlcnRyYWdzDQotcHJvamVjdENoYXJhY3RlcmlzdGljc1RleHQ9UHJvamVrdG1lcmttYWxlDQotcHJvamVjdE1lbWJlckV4cGVydGlzZVRleHQ9S25vdy1ob3cgZGVyIFByb2pla3RtaXRhcmJlaXRlcg0KLXJpc2tMZXZlbFRleHQ9UmlzaWtvc3R1ZmUNCi1zY2FsZVRleHQ9U2thbGllcnVuZw0KLXVzYWdlTm90ZXNUZXh0PVZlcndlbmR1bmdzaGlud2Vpc2UNCi1jb250ZXh0VGV4dD1Lb250ZXh0DQotcGFyZW50QWN0aXZpdGllc1RleHQ9XHUwMGRjYmVyZ2VvcmRuZXRlIEFrdGl2aXRcdTAwZTR0ZW4NCi1pbmNsdWRlZFBhdHRlcm5zVGV4dD1FaW5nZXNjaGxvc3NlbmUgTXVzdGVyDQotY2hlY2tsaXN0VGV4dD1Qclx1MDBmY2ZsaXN0ZQ0KLWNvbW11bmljYXRpb25zTWF0ZXJpYWxzVGV4dD1Lb21tdW5pa2F0aW9uc21hdGVyaWFsDQotZWR1Y2F0aW9uTWF0ZXJpYWxzVGV4dD1MZXJubWF0ZXJpYWwNCi1lc3RpbWF0aW5nVGVjaG5pcXVlVGV4dD1TY2hcdTAwZTR0enZlcmZhaHJlbg0KLWFkZGl0aW9uYWxUZXh0PVp1c1x1MDBlNHR6bGljaGUgUm9sbGVuDQotbW9kaWZpZXNUZXh0PVx1MDBjNG5kZXJ1bmcNCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQ9WnVzXHUwMGU0dHpsaWNoZSBBdWZnYWJlbjoNCi1pbmRleFRleHQ9SW5kZXgNCi1wcmVmaXhUZXh0PVByXHUwMGU0Zml4DQotYnJlYWtkb3duRWxlbWVudFRleHQ9U3RydWt0dXJlbGVtZW50DQotc3RlcHNUZXh0PVNjaHJpdHRlDQotcHJlZGVjZXNzb3JzVGV4dD1Wb3JnXHUwMGU0bmdlcg0KLXJlcGVhdGFibGVUZXh0PVdpZWRlcmhvbHQgYW53ZW5kYmFyDQotdHlwZVRleHQ9VHlwDQotb25nb2luZ1RleHQ9Rm9ydGxhdWZlbmQNCi1ldmVudERyaXZlblRleHQ9RXJlaWduaXNnZXN0ZXVlcnQNCi1tb2RlbEluZm9UZXh0PU1vZGVsbGluZm8NCi1lbnRyeVN0YXRlVGV4dD1BbmZhbmdzenVzdGFuZA0KLWV4aXRTdGF0ZVRleHQ9RW5kenVzdGFuZA0KLXRlYW1UZXh0PVRlYW0NCi1wYXJlbnRQYWNrYWdlVGV4dD1cdTAwZGNiZXJnZW9yZG5ldGUgUGFrZXRlDQotY29udGFpbmVkUGFja2FnZXNUZXh0PUVudGhhbHRlbmUgUGFrZXRlDQotY29udGVudHNUZXh0PUluaGFsdA0KLWJhc2VkT25NZXRob2RSb2xlVGV4dD1CYXNpZXJ0IGF1ZiBNZXRob2RlbnJvbGxlDQotYmFzZWRPbk1ldGhvZFRhc2tUZXh0PUJhc2llcnQgYXVmIE1ldGhvZGVuYXVmZ2FiZQ0KLWJhc2VkT25NZXRob2RXb3JrUHJvZHVjdFRleHQ9QmFzaWVydCBhdWYgTWV0aG9kZW5hcmJlaXRzZXJnZWJuaXMNCi1zdW1tYXJ5VGV4dD1adXNhbW1lbmZhc3N1bmcNCi1wZXJmb3Jtc1RleHQ9QXVzZlx1MDBmY2hydW5nDQotcmVwbGFjZXNUZXh0PUVyc2V0enVuZw0KLWNvbnRyaWJ1dGVzVGV4dD1CZWl0cmFnDQotbm9uZVRleHQ9T2huZQ0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQ9SGlud2Vpc2UgenVtIFNjaFx1MDBlNHR6ZW4NCi1hY3Rpdml0eVJlZmVyZW5jZXNUZXh0PUFrdGl2aXRcdTAwZTR0c3JlZmVyZW56ZW4NCi1uYW1lVGV4dD1OYW1lDQotcHJlc2VudGF0aW9uTmFtZVRleHQ9UHJcdTAwZTRzZW50YXRpb25zbmFtZQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDcxZWJhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLWFkZGl0aW9uYWxJbmZvVGV4dD1JbmZvcm1hY2lcdTAwZjNuIGFkaWNpb25hbA0KLWFkZGl0aW9uYWxQZXJmb3JtZXJUZXh0PU90cmFzIGFjdGl2aWRhZGVzIGFkaWNpb25hbGVzIHF1ZSByZWFsaXphDQotYWdncmVnYXRlc1RleHQ9QVx1MDBmMWFkZQ0KLWFsdGVybmF0aXZlc1RleHQ9QWx0ZXJuYXRpdmFzDQotYXBwbGljYXRpb25UZXh0PUFwbGljYWNpXHUwMGYzbg0KLWFydGlmYWN0VGV4dD1BcnRlZmFjdG8NCi1hc3NldHNUZXh0PUFjdGl2b3MNCi1hc3NpZ25tZW50QXBwcm9hY2hlc1RleHQ9UHJvcHVlc3RhcyBkZSBhc2lnbmFjaVx1MDBmM24NCi1hc3Npc3RpbmdUZXh0PUFzaXN0ZW5jaWENCi1iYWNrZ3JvdW5kVGV4dD1Gb25kbw0KLWJyaWVmT3V0bGluZVRleHQ9RXNxdWVtYXRpemFjaVx1MDBmM24gYnJldmUNCi1jaGVja0l0ZW1zVGV4dD1FbGVtZW50b3MgZGUgY29tcHJvYmFjaVx1MDBmM24NCi1jaGVja2xpc3RzVGV4dD1MaXN0YXMgZGUgY29tcHJvYmFjaVx1MDBmM24NCi1jb2xsYXBzZUFsbFRleHQ9Q29udHJhZXIgdG9kb3MgbG9zIGVsZW1lbnRvcyBkZSBjb21wcm9iYWNpXHUwMGYzbg0KLWNvbXBvc2l0ZVJvbGVUZXh0PVJvbCBjb21wdWVzdG8NCi1jb25jZXB0c1RleHQ9Q29uY2VwdG9zDQotY29udGFpbmVkQXJ0aWZhY3RzVGV4dD1BcnRlZmFjdG9zIGNvbnRlbmlkb3MNCi1jb250YWluZXJBcnRpZmFjdFRleHQ9QXJ0ZWZhY3RvIGRlbCBjb250ZW5lZG9yDQotY29udGVudEVsZW1lbnRzVGV4dD1FbGVtZW50b3MgY2F0ZWdvcml6YWRvcw0KLWNvbnRlbnRSZWZlcmVuY2VzVGV4dD1SZWZlcmVuY2lhcyBkZSBjb250ZW5pZG8NCi1kZWxpdmVyYWJsZVRleHQ9UHJvZHVjdG8gZmluYWwNCi1kZWxpdmVyYWJsZVByb3BlcnRpZXNUZXh0PVByb3BpZWRhZGVzIGRlIHByb2R1Y3RvIGZpbmFsDQotZGVsaXZlcmVkUGFydHNUZXh0PUNvbXBvbmVudGVzIGRlIHByb2R1Y3RvIGZpbmFsDQotZGVsaXZlcmVkV29ya1Byb2R1Y3RzVGV4dD1Qcm9kdWN0b3MgZGUgdHJhYmFqbyBlbnRyZWdhZG9zDQotZGVwZW5kZW50VGV4dD1Qcm9kdWN0b3MgZGUgdHJhYmFqbyBkZXBlbmRpZW50ZXMNCi1kZXNjcmlwdGlvblRleHQ9RGVzY3JpcGNpXHUwMGYzbg0KLWRpc2NpcGxpbmVUZXh0PURpc2NpcGxpbmENCi1kaXNjaXBsaW5lc1RleHQ9RGlzY2lwbGluYXMNCi1zdWJkaXNjaXBsaW5lc1RleHQ9U3ViZGlzY2lwbGluYXMNCi1kb21haW5UZXh0PURvbWluaW8NCi1kb21haW5zVGV4dD1Eb21pbmlvcw0KLWV4YW1wbGVzVGV4dD1FamVtcGxvcw0KLWV4cGFuZEFsbFRleHQ9RXhwYW5kaXIgdG9kb3MgbG9zIGVsZW1lbnRvcyBkZSBjb21wcm9iYWNpXHUwMGYzbg0KLWV4dGVuZHNUZXh0PUFtcGxcdTAwZWRhDQotZXh0ZXJuYWxUZXh0PUV4dGVybmENCi1leHRlcm5hbERlc2NyaXB0aW9uVGV4dD1EZXNjcmlwY2lcdTAwZjNuIGV4dGVybmENCi1nb2Fsc1RleHQ9T2JqZXRpdm9zDQotZ3VpZGVsaW5lc1RleHQ9RGlyZWN0cmljZXMNCi1pbGx1c3RyYXRpb25zVGV4dD1JbHVzdHJhY2lvbmVzCQ0KLWltcGFjdE9mTm90SGF2aW5nVGV4dD1JbXBhY3RvIGRlIG5vIHRlbmVyDQotaW1wYWN0aW5nVGV4dD1Qcm9kdWN0b3MgZGUgdHJhYmFqbyBhZmVjdGFkb3MNCi1pbnB1dHNUZXh0PUVudHJhZGFzDQotaW5wdXRUb1RleHQ9RW50cmFkYSBhDQotaXRlbXNUZXh0PUVsZW1lbnRvcw0KLWtleUNvbnNpZGVyYXRpb25zVGV4dD1GYWN0b3JlcyBjbGF2ZQ0KLWxldmVsc09mQWRvcHRpb25UZXh0PU5pdmVsZXMgZGUgYWRvcGNpXHUwMGYzbg0KLW1hbmRhdG9yeVRleHQ9T2JsaWdhdG9yaWENCi1tYWluVGV4dD1QcmluY2lwYWwNCi1tYWluRGVzY3JpcHRpb25UZXh0PURlc2NyaXBjaVx1MDBmM24gcHJpbmNpcGFsDQotbWFpblJlc3BvbnNpYmxlVGV4dD1SZXNwb25zYWJsZSBwcmluY2lwYWwNCi1tZXRob2RUZXh0PVByb2R1Y3RvIGRlIHRyYWJham8gZGUgbVx1MDBlOXRvZG8NCi1tb2RpZmllZEJ5VGV4dD1Nb2RpZmljYWRvIHBvcg0KLW1vcmVJbmZvVGV4dD1NXHUwMGUxcyBpbmZvcm1hY2lcdTAwZjNuDQotbm90YXRpb25UZXh0PU5vdGFjaVx1MDBmM24NCi1vcHRpb25hbFRleHQ9T3BjaW9uYWwNCi1vdXRjb21lVGV4dD1SZXN1bHRhZG8NCi1vdXRwdXRGcm9tVGV4dD1TYWxpZGEgZGUNCi1vdXRwdXRzVGV4dD1TYWxpZGFzDQotcGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dD1JbnN0cnVjY2lvbmVzIGRlIGVtcGFxdWV0YWRvDQotcGFja2FnaW5nR3VpZGFuY2VUZXh0PUd1XHUwMGVkYSBkZSBlbXBhcXVldGFkbw0KLXBlcmZvcm1pbmdSb2xlc1RleHQ9Um9sZXMgZGUgcmVhbGl6YWNpXHUwMGYzbg0KLXByaW1hcnlQZXJmb3JtZXJUZXh0PVJlYWxpemFkb3IgcHJpbmNpcGFsDQotcHJvYmxlbVRleHQ9UHJvYmxlbWENCi1wcm9wZXJ0aWVzVGV4dD1Qcm9waWVkYWRlcw0KLXB1cnBvc2VUZXh0PU9iamV0aXZvDQotcmVhc29uc0Zvck5vdE5lZWRpbmdUZXh0PVJhem9uZXMgcGFyYSBubyBuZWNlc2l0YXINCi1yZWZlcmVuY2VXb3JrZmxvd3NUZXh0PUZsdWpvcyBkZSB0cmFiYWpvIGRlIHJlZmVyZW5jaWENCi1yZWxhdGVkRWxlbWVudHNUZXh0PUVsZW1lbnRvcyByZWxhY2lvbmFkb3MNCi1yZWxhdGlvbnNoaXBzVGV4dD1SZWxhY2lvbmVzDQotcmVwb3J0c1RleHQ9SW5mb3JtZXMNCi1yZXByZXNlbnRhdGlvbk9wdGlvbnNUZXh0PU9wY2lvbmVzIGRlIHJlcHJlc2VudGFjaVx1MDBmM24NCi1yZXNwb25zaWJsZVRleHQ9UmVzcG9uc2FibGUNCi1yZXNwb25zaWJsZUZvclRleHQ9UmVzcG9uc2FibGUgZGUNCi1yZXVzYWJsZUFzc2V0c1RleHQ9QWN0aXZvcyByZXV0aWxpemFibGVzDQotcm9sZVRleHQ9Um9sDQotcm9sZXNUZXh0PVJvbGVzDQotcm9sZVNldHNUZXh0PUNvbmp1bnRvcyBkZSByb2xlcw0KLXNraWxsc1RleHQ9SGFiaWxpZGFkZXMNCi1zdGFmZmluZ1RleHQ9UGVyc29uYWwNCi1zdGVwc1RleHQ9UGFzb3MNCi1zdWJjYXRlZ29yaWVzVGV4dD1TdWJjYXRlZ29yXHUwMGVkYXMNCi1zdWJkb21haW5zVGV4dD1TdWJkb21pbmlvcw0KLXN1YlByYWN0aWNlc1RleHQ9U3VicHJcdTAwZTFjdGljYXMNCi1zdXBlclRlYW1UZXh0PVBlcmZpbCBkZSBzdXBlcmVxdWlwbw0KLXN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0PU1hdGVyaWFsZXMgZGUgc29wb3J0ZQ0KLXN1YnRlYW1zVGV4dD1QZXJmaWxlcyBkZSBzdWJlcXVpcG9zDQotc3lub255bXNUZXh0PVNpblx1MDBmM25pbW9zDQotdGFpbG9yaW5nVGV4dD1QZXJzb25hbGl6YWNpXHUwMGYzbg0KLXRhc2tUZXh0PVRhcmVhDQotdGFza3NUZXh0PVRhcmVhcw0KLXRic1RleHQ9QXNpZ25hY2lcdTAwZjNuIGRlIGVxdWlwb3MNCi10ZWFtUHJvZmlsZVRleHQ9UGVyZmlsIGRlbCBlcXVpcG8NCi10ZWFtUm9sZXNUZXh0PVJvbGVzIGRlbCBwZXJmaWwgZGVsIGVxdWlwbw0KLXRlY2huaXF1ZXNUZXh0PURpcmVjdHJpY2VzDQotdGVtcGxhdGVGaWxlc1RleHQ9QXJjaGl2b3MgZGUgcGxhbnRpbGxhDQotdGVtcGxhdGVzVGV4dD1QbGFudGlsbGFzDQotdG9vbE1lbnRvcnNUZXh0PUd1XHUwMGVkYXMgZGUgbGEgaGVycmFtaWVudGENCi10b29sVGV4dD1IZXJyYW1pZW50YQ0KLXVzYWdlVGV4dD1VdGlsaXphY2lcdTAwZjNuDQotd2JzVGV4dD1Fc3RydWN0dXJhIGRlIGRlc2dsb3NlIGRlIHRyYWJham8NCi13aGl0ZXBhcGVyc1RleHQ9RG9jdW1lbnRhY2lcdTAwZjNuDQotd29ya1Byb2R1Y3RzVGV4dD1Qcm9kdWN0b3MgZGUgdHJhYmFqbw0KLXdvcmtQcm9kdWN0VHlwZXNUZXh0PUNsYXNlcyBkZSBwcm9kdWN0byBkZSB0cmFiYWpvDQotd3Bic1RleHQ9VXRpbGl6YWNpXHUwMGYzbiBkZWwgcHJvZHVjdG8gZGUgdHJhYmFqbw0KLXdvcmtCcmVha2Rvd25UZXh0PUFub21hbFx1MDBlZGEgZGVsIHRyYWJham8NCi13b3JrZmxvd1RleHQ9Rmx1am8gZGUgdHJhYmFqbw0KLXdvcmtQcm9kdWN0QnJlYWtkb3duVGV4dD1Bbm9tYWxcdTAwZWRhIGRlbCBwcm9kdWN0byBkZSB0cmFiYWpvDQotd29ya1Byb2R1Y3REZXBlbmRlbmNpZXNUZXh0PURlcGVuZGVuY2lhcyBkZWwgcHJvZHVjdG8gZGUgdHJhYmFqbw0KLXRlYW1Qcm9maWxlQnJlYWtkb3duVGV4dD1Bbm9tYWxcdTAwZWRhIGRlbCBlcXVpcG8NCi10ZWFtU3RydWN0dXJlVGV4dD1Fc3RydWN0dXJhIGRlbCBlcXVpcG8NCi1wYWdlTm90SW5zdGFsbGVkVGV4dD1QXHUwMGUxZ2luYSBubyBpbnN0YWxhZGENCi1lbGVtZW50RG9lc05vdEV4aXN0VGV4dD1FbCBlbGVtZW50byBubyBleGlzdGUNCi1pc05vdFZhbGlkVGV4dD1FbCBlbGVtZW50byBhbCBxdWUgc2UgaGEgaGVjaG8gcmVmZXJlbmNpYSBubyBlcyB1biBlbGVtZW50byB2XHUwMGUxbGlkbyBkZSBsYSBiaWJsaW90ZWNhIGFjdHVhbC4NCi1lbGVtZW50TWlnaHRCZURlbGV0ZWRUZXh0PUVzIHBvc2libGUgcXVlIGVsIGVsZW1lbnRvIHNlIGhheWEgc3VwcmltaWRvIGRlIGxhIGJpYmxpb3RlY2EuDQotcGxlYXNlRml4TGlua1RleHQ9Q29tcHJ1ZWJlIGVsIGNvbnRlbmlkbyBkZSBsYSBiaWJsaW90ZWNhIHkgYXJyZWdsZSBlbCBlbmxhY2UuDQotaW5mb0Fib3V0TWlzc2luZ0VsZW1lbnRUZXh0PUluZm9ybWFjaVx1MDBmM24gc29icmUgZWwgZWxlbWVudG8gcXVlIGZhbHRhOg0KLWVsZW1lbnROYW1lVGV4dD1Ob21icmUgZGVsIGVsZW1lbnRvDQotZ3VpZFRleHQ9R1VJRDoNCi1taXNzaW5nRWxlbWVudFRleHQ9TGEgcFx1MDBlMWdpbmEgYSBsYSBxdWUgc2UgaGEgaGVjaG8gcmVmZXJlbmNpYSBubyBzZSBlbmN1ZW50cmEgZW4gZXN0YSBjb25maWd1cmFjaVx1MDBmM24NCi1ub3RBdmFpbGFibGVUZXh0PUxhIHBcdTAwZTFnaW5hIGEgbGEgcXVlIHNlIGhhIGhlY2hvIHJlZmVyZW5jaWEgbm8gc2UgZW5jdWVudHJhIGVuIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBhY3R1YWwuIEVzIHBvc2libGUgcXVlIGVzdGEgcFx1MDBlMWdpbmEgZXN0XHUwMGU5IGVuIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBvdHJvIHByb2Nlc28uDQotZWxlbWVudFR5cGVUZXh0PVRpcG8gZGUgZWxlbWVudG86DQotcGx1Z2luTmFtZVRleHQ9Tm9tYnJlIGRlbCBwbHVnLWluOg0KLXByZWRlY2Vzc29yVGV4dD1QcmVkZWNlc29yDQotcGxhbm5pbmdEYXRhVGV4dD1EYXRvcyBkZSBwbGFuaWZpY2FjaVx1MDBmM24NCi1tdWx0aXBsZU9jY3VycmVuY2VzVGV4dD1WYXJpYXMgYXBhcmljaW9uZXMNCi1ldmVudERyaXZlblRleHQ9Q29uZGljaW9uYWRvIHBvciBzdWNlc29zDQotb25nb2luZ1RleHQ9Q29udGludW8NCi1wbGFubmVkVGV4dD1QbGFuZWFkbw0KLXJlcGVhdGFibGVUZXh0PVNlIHB1ZWRlIHJlcGV0aXINCi11c2FnZUd1aWRhbmNlVGV4dD1HdVx1MDBlZGEgZGUgdXRpbGl6YWNpXHUwMGYzbg0KLWlucHV0c1RleHQ9RW50cmFkYXMNCi1vdXRwdXRzVGV4dD1TYWxpZGFzDQotYWN0aXZpdHlFbnRyeVN0YXRlVGV4dD1Fc3RhZG8gZGUgZW50cmFkYSBkZSBhY3RpdmlkYWQNCi1hY3Rpdml0eUV4aXRTdGF0ZVRleHQ9RXN0YWRvIGRlIHNhbGlkYSBkZSBhY3RpdmlkYWQNCi1wcmVmaXhUZXh0PVByZWZpam8NCi1leHRlcm5hbElkVGV4dD1JRCBleHRlcm5vDQotc2NvcGVUZXh0PVx1MDBjMW1iaXRvDQotcm9hZG1hcFRleHQ9TWFwYQ0KLXR5cGVvZkNvbnRyYWN0VGV4dD1UaXBvIGRlIGNvbnRyYXRvDQotcHJvamVjdENoYXJhY3RlcmlzdGljc1RleHQ9Q2FyYWN0ZXJcdTAwZWRzdGljYXMgZGVsIHByb3llY3RvDQotcHJvamVjdE1lbWJlckV4cGVydGlzZVRleHQ9RXNwZWNpYWxpZGFkIGRlIG1pZW1icm8gZGVsIHByb3llY3RvDQotcmlza0xldmVsVGV4dD1OaXZlbCBkZSByaWVzZ28NCi1zY2FsZVRleHQ9RXNjYWxhDQotdXNhZ2VOb3Rlc1RleHQ9Tm90YXMgZGUgdXRpbGl6YWNpXHUwMGYzbg0KLWNvbnRleHRUZXh0PUNvbnRleHRvDQotcGFyZW50QWN0aXZpdGllc1RleHQ9QWN0aXZpZGFkZXMgcHJpbmNpcGFsZXMNCi1pbmNsdWRlZFBhdHRlcm5zVGV4dD1QYXRyb25lcyBpbmNsdWlkb3MNCi1jaGVja2xpc3RUZXh0PUxpc3RhIGRlIGNvbXByb2JhY2lcdTAwZjNuDQotY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNUZXh0PU1hdGVyaWFsZXMgZGUgY29tdW5pY2FjaVx1MDBmM24NCi1lZHVjYXRpb25NYXRlcmlhbHNUZXh0PU1hdGVyaWFsZXMgZGUgZm9ybWFjaVx1MDBmM24NCi1lc3RpbWF0aW5nVGVjaG5pcXVlVGV4dD1UXHUwMGU5Y25pY2EgZGUgY1x1MDBlMWxjdWxvDQotYWRkaXRpb25hbFRleHQ9QWRpY2lvbmFsDQotbW9kaWZpZXNUZXh0PU1vZGlmaWNhDQotYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0PUFkaWNpb25hbG1lbnRlIHJlYWxpemENCi1pbmRleFRleHQ9XHUwMGNkbmRpY2UNCi1wcmVmaXhUZXh0PVByZWZpam8NCi1icmVha2Rvd25FbGVtZW50VGV4dD1FbGVtZW50byBkZSBkZXNnbG9zZQ0KLXN0ZXBzVGV4dD1QYXNvcw0KLXByZWRlY2Vzc29yc1RleHQ9UHJlZGVjZXNvcmVzDQotcmVwZWF0YWJsZVRleHQ9U2UgcHVlZGUgcmVwZXRpcg0KLXR5cGVUZXh0PVRpcG8NCi1vbmdvaW5nVGV4dD1Db250aW51bw0KLWV2ZW50RHJpdmVuVGV4dD1Db25kaWNpb25hZG8gcG9yIHN1Y2Vzb3MNCi1tb2RlbEluZm9UZXh0PUluZm9ybWFjaVx1MDBmM24gZGVsIG1vZGVsbw0KLWVudHJ5U3RhdGVUZXh0PUVzdGFkbyBkZSBlbnRyYWRhDQotZXhpdFN0YXRlVGV4dD1Fc3RhZG8gZGUgc2FsaWRhDQotdGVhbVRleHQ9RXF1aXBvDQotcGFyZW50UGFja2FnZVRleHQ9UGFxdWV0ZSBwYWRyZQ0KLWNvbnRhaW5lZFBhY2thZ2VzVGV4dD1QYXF1ZXRlcyBjb250ZW5pZG9zDQotY29udGVudHNUZXh0PUNvbnRlbmlkbw0KLWJhc2VkT25NZXRob2RSb2xlVGV4dD1CYXNhZG8gZW4gZWwgcm9sIGRlIG1cdTAwZTl0b2RvDQotYmFzZWRPbk1ldGhvZFRhc2tUZXh0PUJhc2FkbyBlbiBsYSB0YXJlYSBkZSBtXHUwMGU5dG9kbw0KLWJhc2VkT25NZXRob2RXb3JrUHJvZHVjdFRleHQ9QmFzYWRvIGVuIGVsIHByb2R1Y3RvIGRlIHRyYWJham8gZGUgbVx1MDBlOXRvZG8NCi1zdW1tYXJ5VGV4dD1SZXN1bWVuDQotcGVyZm9ybXNUZXh0PVJlYWxpemENCi1yZXBsYWNlc1RleHQ9UmVlbXBsYXphDQotY29udHJpYnV0ZXNUZXh0PUNvbnRyaWJ1eWUNCi1ub25lVGV4dD1OaW5ndW5vDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zVGV4dD1Db25zaWRlcmFjaW9uZXMgc29icmUgZWwgY1x1MDBlMWxjdWxvDQotYWN0aXZpdHlSZWZlcmVuY2VzVGV4dD1SZWZlcmVuY2lhcyBkZSBhY3RpdmlkYWQNCi1uYW1lVGV4dD1Ob21icmUNCi1wcmVzZW50YXRpb25OYW1lVGV4dD1Ob21icmUgZGUgcHJlc2VudGFjaVx1MDBmM24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc19mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3hzbC9yZXNvdXJjZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU5MDVkYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4NCi0NCi1hZGRpdGlvbmFsSW5mb1RleHQ9SW5mb3JtYXRpb24gY29tcGxcdTAwZTltZW50YWlyZXMNCi1hZGRpdGlvbmFsUGVyZm9ybWVyVGV4dD1FeFx1MDBlOWN1dGFudCBzdXBwbFx1MDBlOW1lbnRhaXJlcw0KLWFnZ3JlZ2F0ZXNUZXh0PUFnclx1MDBlOWdhdHMNCi1hbHRlcm5hdGl2ZXNUZXh0PUFsdGVybmF0aXZlcw0KLWFwcGxpY2F0aW9uVGV4dD1BcHBsaWNhdGlvbg0KLWFydGlmYWN0VGV4dD1BcnRlZmFjdA0KLWFzc2V0c1RleHQ9UmVzc291cmNlcw0KLWFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dD1BcHByb2NoZXMgZCdhZmZlY3RhdGlvbg0KLWFzc2lzdGluZ1RleHQ9QXV4aWxpYWlyZQ0KLWJhY2tncm91bmRUZXh0PUFycmlcdTAwZThyZS1wbGFuDQotYnJpZWZPdXRsaW5lVGV4dD1CcmVmIGFwZXJcdTAwZTd1DQotY2hlY2tJdGVtc1RleHQ9RWxcdTAwZTltZW50cyBkZSB2XHUwMGU5cmlmaWNhdGlvbg0KLWNoZWNrbGlzdHNUZXh0PUxpc3RlcyBkZSBjb250clx1MDBmNGxlDQotY29sbGFwc2VBbGxUZXh0PUNvbmRlbnNlciB0b3VzIGxlcyBcdTAwZTlsXHUwMGU5bWVudHMgZGUgdlx1MDBlOXJpZmljYXRpb24NCi1jb21wb3NpdGVSb2xlVGV4dD1SXHUwMGY0bGUgY29tcG9zaXRlDQotY29uY2VwdHNUZXh0PUNvbmNlcHRzDQotY29udGFpbmVkQXJ0aWZhY3RzVGV4dD1BcnRlZmFjdHMgY29udGVudXMNCi1jb250YWluZXJBcnRpZmFjdFRleHQ9QXJ0ZWZhY3QgZGUgY29udGVuZXVyDQotY29udGVudEVsZW1lbnRzVGV4dD1FbFx1MDBlOW1lbnRzIGNhdFx1MDBlOWdvcmlzXHUwMGU5cw0KLWNvbnRlbnRSZWZlcmVuY2VzVGV4dD1SXHUwMGU5Zlx1MDBlOXJlbmNlcyBkZSBjb250ZW51DQotZGVsaXZlcmFibGVUZXh0PUxpdnJhYmxlDQotZGVsaXZlcmFibGVQcm9wZXJ0aWVzVGV4dD1Qcm9wcmlcdTAwZTl0XHUwMGU5cyBsaXZyYWJsZXMNCi1kZWxpdmVyZWRQYXJ0c1RleHQ9Q29tcG9zYW50cyBsaXZyYWJsZXMNCi1kZWxpdmVyZWRXb3JrUHJvZHVjdHNUZXh0PVByb2R1aXRzIGxpdnJcdTAwZTlzDQotZGVwZW5kZW50VGV4dD1Qcm9kdWl0cyBkXHUwMGU5cGVuZGFudHMNCi1kZXNjcmlwdGlvblRleHQ9RGVzY3JpcHRpb24NCi1kaXNjaXBsaW5lVGV4dD1EaXNjaXBsaW5lDQotZGlzY2lwbGluZXNUZXh0PURpc2NpcGxpbmVzDQotc3ViZGlzY2lwbGluZXNUZXh0PVNvdXMtZGlzY2lwbGluZXMNCi1kb21haW5UZXh0PURvbWFpbmUNCi1kb21haW5zVGV4dD1Eb21haW5lcw0KLWV4YW1wbGVzVGV4dD1FeGVtcGxlcw0KLWV4cGFuZEFsbFRleHQ9RFx1MDBlOXZlbG9wcGVyIHRvdXMgbGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSB2XHUwMGU5cmlmaWNhdGlvbg0KLWV4dGVuZHNUZXh0PUV0ZW5kDQotZXh0ZXJuYWxUZXh0PUV4dGVybmUNCi1leHRlcm5hbERlc2NyaXB0aW9uVGV4dD1EZXNjcmlwdGlvbiBleHRlcm5lDQotZ29hbHNUZXh0PU9iamVjdGlmcw0KLWd1aWRlbGluZXNUZXh0PUluc3RydWN0aW9ucw0KLWlsbHVzdHJhdGlvbnNUZXh0PUlsbHVzdHJhdGlvbnMJDQotaW1wYWN0T2ZOb3RIYXZpbmdUZXh0PUluY2lkZW5jZSBkdSBtYW5xdWUNCi1pbXBhY3RpbmdUZXh0PVByb2R1aXRzIGF5YW50IHVuZSBpbmNpZGVuY2UNCi1pbnB1dHNUZXh0PUVudHJcdTAwZTllcw0KLWlucHV0VG9UZXh0PUVudHJcdTAwZTllIHZlcnMNCi1pdGVtc1RleHQ9RWxcdTAwZTltZW50cw0KLWtleUNvbnNpZGVyYXRpb25zVGV4dD1Db25zaWRcdTAwZTlyYXRpb25zIGNsXHUwMGU5cw0KLWxldmVsc09mQWRvcHRpb25UZXh0PU5pdmVhdXggZCdhZG9wdGlvbg0KLW1hbmRhdG9yeVRleHQ9T2JsaWdhdG9pcmUNCi1tYWluVGV4dD1QcmluY2lwYWwNCi1tYWluRGVzY3JpcHRpb25UZXh0PURlc2NyaXB0aW9uIHByaW5jaXBhbGUNCi1tYWluUmVzcG9uc2libGVUZXh0PVByaW5jaXBhbCByZXNwb25zYWJsZQ0KLW1ldGhvZFRleHQ9UHJvZHVpdCBkZSBtXHUwMGU5dGhvZGUNCi1tb2RpZmllZEJ5VGV4dD1Nb2RpZmlcdTAwZTkgcGFyDQotbW9yZUluZm9UZXh0PVBsdXMgZCdpbmZvcm1hdGlvbnMNCi1ub3RhdGlvblRleHQ9Tm90YXRpb24NCi1vcHRpb25hbFRleHQ9RmFjdWx0YXRpZg0KLW91dGNvbWVUZXh0PVNvcnRpZQ0KLW91dHB1dEZyb21UZXh0PVNvcnRpZSBkZQ0KLW91dHB1dHNUZXh0PVNvcnRpZXMNCi1wYWNrYWdpbmdJbnN0cnVjdGlvbnNUZXh0PUluc3RydWN0aW9ucyBkZSBtaXNlIGVuIGZvcm1lDQotcGFja2FnaW5nR3VpZGFuY2VUZXh0PUNvbnNlaWwgZGUgbWlzZSBlbiBmb3JtZQ0KLXBlcmZvcm1pbmdSb2xlc1RleHQ9RXhcdTAwZTljdXRpb24gZGVzIHJcdTAwZjRsZXMNCi1wcmltYXJ5UGVyZm9ybWVyVGV4dD1FeFx1MDBlOWN1dGFudCBwcmluY2lwYWwNCi1wcm9ibGVtVGV4dD1Qcm9ibFx1MDBlOG1lDQotcHJvcGVydGllc1RleHQ9UHJvcHJpXHUwMGU5dFx1MDBlOXMNCi1wdXJwb3NlVGV4dD1PYmpldA0KLXJlYXNvbnNGb3JOb3ROZWVkaW5nVGV4dD1DYXVzZXMganVzdGlmaWFudCBsZSBtYW5xdWUgZGUgblx1MDBlOWNlc3NpdFx1MDBlOQ0KLXJlZmVyZW5jZVdvcmtmbG93c1RleHQ9RW5jaGFcdTAwZWVuZW1lbnRzIGQnYWN0aXZpdFx1MDBlOXMgZGUgclx1MDBlOWZcdTAwZTlyZW5jZQ0KLXJlbGF0ZWRFbGVtZW50c1RleHQ9RWxcdTAwZTltZW50cyBjb25uZXhlcw0KLXJlbGF0aW9uc2hpcHNUZXh0PVJlbGF0aW9ucw0KLXJlcG9ydHNUZXh0PVJhcHBvcnRzDQotcmVwcmVzZW50YXRpb25PcHRpb25zVGV4dD1PcHRpb25zIGRlIHJlcHJcdTAwZTlzZW50YXRpb24NCi1yZXNwb25zaWJsZVRleHQ9UmVzcG9uc2FibGUNCi1yZXNwb25zaWJsZUZvclRleHQ9UmVzcG9uc2FibGUgZGUNCi1yZXVzYWJsZUFzc2V0c1RleHQ9UmVzc291cmNlcyByXHUwMGU5dXRpbGlzYWJsZXMNCi1yb2xlVGV4dD1SXHUwMGY0bGUNCi1yb2xlc1RleHQ9Ulx1MDBmNGxlcw0KLXJvbGVTZXRzVGV4dD1FbnNlbWJsZXMgZGUgclx1MDBmNGxlcw0KLXNraWxsc1RleHQ9Q29tcFx1MDBlOXRlbmNlcw0KLXN0YWZmaW5nVGV4dD1BZmZlY3RhdGlvbiBkdSBwZXJzb25uZWwNCi1zdGVwc1RleHQ9RXRhcGVzDQotc3ViY2F0ZWdvcmllc1RleHQ9U291cy1jYXRcdTAwZTlnb3JpZXMJDQotc3ViZG9tYWluc1RleHQ9U291cy1kb21haW5lcw0KLXN1YlByYWN0aWNlc1RleHQ9U291cy1wcmF0aXF1ZXMNCi1zdXBlclRlYW1UZXh0PVByb2ZpbCBkZSBzdXBlciBcdTAwZTlxdWlwZQ0KLXN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0PURvY3VtZW50cyBkJ2FjY29tcGFnbmVtZW50DQotc3VidGVhbXNUZXh0PVByb2ZpbHMgZGVzIHNvdXMtXHUwMGU5cXVpcGVzDQotc3lub255bXNUZXh0PVN5bm9ueW1lcw0KLXRhaWxvcmluZ1RleHQ9UGVyc29ubmFsaXNhdGlvbg0KLXRhc2tUZXh0PVRcdTAwZTJjaGUNCi10YXNrc1RleHQ9VFx1MDBlMmNoZXMNCi10YnNUZXh0PUFmZmVjdGF0aW9uIGRlIGwnXHUwMGU5cXVpcGUNCi10ZWFtUHJvZmlsZVRleHQ9UHJvZmlsIGRlIGwnXHUwMGU5cXVpcGUNCi10ZWFtUm9sZXNUZXh0PVJcdTAwZjRsZXMgZHUgcHJvZmlsIGRlIGwnXHUwMGU5cXVpcGUNCi10ZWNobmlxdWVzVGV4dD1JbnN0cnVjdGlvbnMNCi10ZW1wbGF0ZUZpbGVzVGV4dD1GaWNoaWVycyBtb2RcdTAwZThsZXMNCi10ZW1wbGF0ZXNUZXh0PUNhbmV2YXMNCi10b29sTWVudG9yc1RleHQ9R3VpZGVzIGQndXRpbGlzYXRpb24gZGUgbCdvdXRpbA0KLXRvb2xUZXh0PU91dGlsDQotdXNhZ2VUZXh0PVV0aWxpc2F0aW9uDQotd2JzVGV4dD1TdHJ1Y3R1cmUgZGUgclx1MDBlOXBhcnRpdGlvbiBkdSB0cmF2YWlsDQotd2hpdGVwYXBlcnNUZXh0PUxpdnJlcyBibGFuY3MNCi13b3JrUHJvZHVjdHNUZXh0PVByb2R1aXRzDQotd29ya1Byb2R1Y3RUeXBlc1RleHQ9VHlwZXMgZGUgcHJvZHVpdHMNCi13cGJzVGV4dD1VdGlsaXNhdGlvbiBkdSBwcm9kdWl0DQotd29ya0JyZWFrZG93blRleHQ9Ulx1MDBlOXBhcnRpdGlvbiBkdSB0cmF2YWlsDQotd29ya2Zsb3dUZXh0PUVuY2hhXHUwMGVlbmVtZW50IGQnYWN0aXZpdFx1MDBlOXMNCi13b3JrUHJvZHVjdEJyZWFrZG93blRleHQ9Ulx1MDBlOXBhcnRpdGlvbiBkZXMgcHJvZHVpdHMNCi13b3JrUHJvZHVjdERlcGVuZGVuY2llc1RleHQ9RFx1MDBlOXBlbmRhbmNlcyBkZXMgcHJvZHVpdHMNCi10ZWFtUHJvZmlsZUJyZWFrZG93blRleHQ9Ulx1MDBlOXBhcnRpdGlvbiBkZSBsJ1x1MDBlOXF1aXBlDQotdGVhbVN0cnVjdHVyZVRleHQ9U3RydWN0dXJlIGRlIGwnXHUwMGU5cXVpcGUNCi1wYWdlTm90SW5zdGFsbGVkVGV4dD1QYWdlIG5vbiBpbnN0YWxsXHUwMGU5ZQ0KLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PUNldCBcdTAwZTlsXHUwMGU5bWVudCBuJ2V4aXN0ZSBwYXMNCi1pc05vdFZhbGlkVGV4dD1MJ1x1MDBlOWxcdTAwZTltZW50IHJcdTAwZTlmXHUwMGU5cmVuY1x1MDBlOSBuJ2VzdCBwYXMgdW4gXHUwMGU5bFx1MDBlOW1lbnQgdmFsaWRlIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGVuIGNvdXJzLg0KLWVsZW1lbnRNaWdodEJlRGVsZXRlZFRleHQ9Q2V0IFx1MDBlOWxcdTAwZTltZW50IHBldXQgYXZvaXIgXHUwMGU5dFx1MDBlOSBzdXBwcmltXHUwMGU5IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlLg0KLXBsZWFzZUZpeExpbmtUZXh0PVZcdTAwZTlyaWZpZXogdm90cmUgYmlibGlvdGhcdTAwZThxdWUgZGUgY29udGVudSBldCBjb3JyaWdleiBsZSBsaWVuLg0KLWluZm9BYm91dE1pc3NpbmdFbGVtZW50VGV4dD1JbmZvcm1hdGlvbnMgcmVsYXRpdmVzIFx1MDBlMCBsJ1x1MDBlOWxcdTAwZTltZW50IG1hbnF1YW50IDoNCi1lbGVtZW50TmFtZVRleHQ9Tm9tIGRlIGwnXHUwMGU5bFx1MDBlOW1lbnQgOg0KLWd1aWRUZXh0PUlkZW50aWZpY2F0ZXVyIGdsb2JhbCB1bmlxdWUgOg0KLW1pc3NpbmdFbGVtZW50VGV4dD1MYSBwYWdlIHJcdTAwZTlmXHUwMGU5cmVuY1x1MDBlOWUgbmUgZmlndXJlIHBhcyBkYW5zIGNldHRlIGNvbmZpZ3VyYXRpb24NCi1ub3RBdmFpbGFibGVUZXh0PUxhIHBhZ2Ugclx1MDBlOWZcdTAwZTlyZW5jXHUwMGU5ZSBuJ2VzdCBwYXMgZGlzcG9uaWJsZSBkYW5zIGxhIGNvbmZpZ3VyYXRpb24gZW4gY291cnMuIENldHRlIHBhZ2UgZXN0IHBldXQtXHUwMGVhdHJlIGRpc3BvbmlibGUgZGFucyB1bmUgYXV0cmUgY29uZmlndXJhdGlvbiBkZSBwcm9jZXNzdXMuDQotZWxlbWVudFR5cGVUZXh0PVR5cGUgZCdcdTAwZTlsXHUwMGU5bWVudCA6DQotcGx1Z2luTmFtZVRleHQ9Tm9tIGRlIHBsdWctaW4gOg0KLXByZWRlY2Vzc29yVGV4dD1Qclx1MDBlOWRcdTAwZTljZXNzZXVyDQotcGxhbm5pbmdEYXRhVGV4dD1Eb25uXHUwMGU5ZXMgZGUgcGxhbmlmaWNhdGlvbg0KLW11bHRpcGxlT2NjdXJyZW5jZXNUZXh0PVBsdXNpZXVycyBvY2N1cnJlbmNlcw0KLWV2ZW50RHJpdmVuVGV4dD1Db21tYW5kXHUwMGU5IHBhciBsZXMgXHUwMGU5dlx1MDBlOW5lbWVudHMNCi1vbmdvaW5nVGV4dD1FbiBjb3Vycw0KLXBsYW5uZWRUZXh0PVBsYW5pZmlcdTAwZTkNCi1yZXBlYXRhYmxlVGV4dD1SXHUwMGU5aXRcdTAwZTlyYWJsZQ0KLXVzYWdlR3VpZGFuY2VUZXh0PUNvbnNlaWxzIGQndXRpbGlzYXRpb24NCi1pbnB1dHNUZXh0PUVudHJcdTAwZTllcw0KLW91dHB1dHNUZXh0PVNvcnRpZXMNCi1hY3Rpdml0eUVudHJ5U3RhdGVUZXh0PUV0YXQgZCdlbnRyXHUwMGU5ZSBkJ2FjdGl2aXRcdTAwZTkNCi1hY3Rpdml0eUV4aXRTdGF0ZVRleHQ9RXRhdCBkZSBzb3J0aWUgZCdhY3Rpdml0XHUwMGU5DQotcHJlZml4VGV4dD1Qclx1MDBlOWZpeGUNCi1leHRlcm5hbElkVGV4dD1JZGVudGlmaWNhdGV1ciBleHRlcm5lDQotc2NvcGVUZXh0PVBvcnRcdTAwZTllDQotcm9hZG1hcFRleHQ9RmV1aWxsZSBkZSByb3V0ZQ0KLXR5cGVvZkNvbnRyYWN0VGV4dD1UeXBlIGRlIGNvbnRyYXQNCi1wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzVGV4dD1DYXJhY3RcdTAwZTlyaXN0aXF1ZXMgZGUgcHJvamV0DQotcHJvamVjdE1lbWJlckV4cGVydGlzZVRleHQ9RXhwZXJ0aXNlIGR1IG1lbWJyZSBkZSBwcm9qZXQNCi1yaXNrTGV2ZWxUZXh0PU5pdmVhdSBkZSByaXNxdWUNCi1zY2FsZVRleHQ9RWNoZWxsZQ0KLXVzYWdlTm90ZXNUZXh0PU5vdGVzIGQndXRpbGlzYXRpb24NCi1jb250ZXh0VGV4dD1Db250ZXh0ZQ0KLXBhcmVudEFjdGl2aXRpZXNUZXh0PUFjdGl2aXRcdTAwZTlzIHBhcmVudGVzDQotaW5jbHVkZWRQYXR0ZXJuc1RleHQ9UGF0dGVybnMgaW5jbHVzDQotY2hlY2tsaXN0VGV4dD1MaXN0ZSBkZSBjb250clx1MDBmNGxlDQotY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNUZXh0PVN1cHBvcnRzIGRlIGNvbW11bmljYXRpb24NCi1lZHVjYXRpb25NYXRlcmlhbHNUZXh0PURvY3VtZW50cyBkZSBmb3JtYXRpb24NCi1lc3RpbWF0aW5nVGVjaG5pcXVlVGV4dD1UZWNobmlxdWUgZCdlc3RpbWF0aW9uDQotYWRkaXRpb25hbFRleHQ9Q29tcGxcdTAwZTltZW50YWlyZQ0KLW1vZGlmaWVzVGV4dD1Nb2RpZmllDQotYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0PUVmZmVjdHVlIFx1MDBlOWdhbGVtZW50DQotaW5kZXhUZXh0PUluZGV4DQotcHJlZml4VGV4dD1Qclx1MDBlOWZpeGUNCi1icmVha2Rvd25FbGVtZW50VGV4dD1FbFx1MDBlOW1lbnQgZGUgclx1MDBlOXBhcnRpdGlvbg0KLXN0ZXBzVGV4dD1FdGFwZXMNCi1wcmVkZWNlc3NvcnNUZXh0PVByXHUwMGU5ZFx1MDBlOWNlc3NldXJzDQotcmVwZWF0YWJsZVRleHQ9Ulx1MDBlOWl0XHUwMGU5cmFibGUNCi10eXBlVGV4dD1UeXBlDQotb25nb2luZ1RleHQ9RW4gY291cnMNCi1ldmVudERyaXZlblRleHQ9Q29tbWFuZFx1MDBlOSBwYXIgbGVzIFx1MDBlOXZcdTAwZTluZW1lbnRzDQotbW9kZWxJbmZvVGV4dD1JbmZvcm1hdGlvbnMgcmVsYXRpdmVzIGF1IG1vZFx1MDBlOGxlDQotZW50cnlTdGF0ZVRleHQ9RXRhdCBkJ2VudHJcdTAwZTllDQotZXhpdFN0YXRlVGV4dD1FdGF0IGRlIHNvcnRpZQ0KLXRlYW1UZXh0PUVxdWlwZQ0KLXBhcmVudFBhY2thZ2VUZXh0PVBhY2thZ2UgcGFyZW50DQotY29udGFpbmVkUGFja2FnZXNUZXh0PVBhY2thZ2VzIGNvbnRlbnVzDQotY29udGVudHNUZXh0PVNvbW1haXJlDQotYmFzZWRPbk1ldGhvZFJvbGVUZXh0PUJhc1x1MDBlOSBzdXIgdW4gclx1MDBmNGxlIGRlIG1cdTAwZTl0aG9kZQ0KLWJhc2VkT25NZXRob2RUYXNrVGV4dD1CYXNcdTAwZTkgc3VyIHVuZSB0XHUwMGUyY2hlIGRlIG1cdTAwZTl0aG9kZQ0KLWJhc2VkT25NZXRob2RXb3JrUHJvZHVjdFRleHQ9QmFzXHUwMGU5IHN1ciB1biBwcm9kdWl0IGRlIG1cdTAwZTl0aG9kZQ0KLXN1bW1hcnlUZXh0PVJcdTAwZTlzdW1cdTAwZTkNCi1wZXJmb3Jtc1RleHQ9RWZmZWN0dWUNCi1yZXBsYWNlc1RleHQ9UmVtcGxhY2UNCi1jb250cmlidXRlc1RleHQ9Q29udHJpYnVlDQotbm9uZVRleHQ9QXVjdW4NCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNUZXh0PUNvbnNpZFx1MDBlOXJhdGlvbnMgcmVsYXRpdmVzIFx1MDBlMCBsJ2VzdGltYXRpb24NCi1hY3Rpdml0eVJlZmVyZW5jZXNUZXh0PVJcdTAwZTlmXHUwMGU5cmVuY2VzIGQnYWN0aXZpdFx1MDBlOQ0KLW5hbWVUZXh0PU5vbQ0KLXByZXNlbnRhdGlvbk5hbWVUZXh0PU5vbSBkZSBwclx1MDBlOXNlbnRhdGlvbg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmN2NkNmIxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLWFkZGl0aW9uYWxJbmZvVGV4dD1JbmZvcm1hemlvbmkgYWdnaXVudGl2ZQ0KLWFkZGl0aW9uYWxQZXJmb3JtZXJUZXh0PUVzZWN1dG9yaSBhZ2dpdW50aXZpDQotYWdncmVnYXRlc1RleHQ9QWdncmVnYQ0KLWFsdGVybmF0aXZlc1RleHQ9QWx0ZXJuYXRpdm8NCi1hcHBsaWNhdGlvblRleHQ9QXBwbGljYXppb25lDQotYXJ0aWZhY3RUZXh0PUFydGVmYXR0bw0KLWFzc2V0c1RleHQ9Umlzb3JzZQ0KLWFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dD1BcHByb2NjaSBhc3NlZ25hemlvbmUNCi1hc3Npc3RpbmdUZXh0PUFzc2lzdGVuemENCi1iYWNrZ3JvdW5kVGV4dD1CYWNrZ3JvdW5kDQotYnJpZWZPdXRsaW5lVGV4dD1CcmV2ZSBwcm9maWxvDQotY2hlY2tJdGVtc1RleHQ9Vm9jaSBlbGVuY2hpIGRpIG9wZXJhemlvbmkNCi1jaGVja2xpc3RzVGV4dD1FbGVuY2hpIGRpIGNvbnRyb2xsbw0KLWNvbGxhcHNlQWxsVGV4dD1Db21wcmltaSB0dXR0ZSBsZSB2b2NpIGRpIGVsZW5jbyBkaSBjb250cm9sbG8NCi1jb21wb3NpdGVSb2xlVGV4dD1SdW9sbyBjb21wb3NpdG8NCi1jb25jZXB0c1RleHQ9Q29uY2V0dGkNCi1jb250YWluZWRBcnRpZmFjdHNUZXh0PUFydGVmYXR0aSBjb250ZW51dGkNCi1jb250YWluZXJBcnRpZmFjdFRleHQ9Q29udGVuaXRvcmUgQXJ0ZWZhdHRvDQotY29udGVudEVsZW1lbnRzVGV4dD1FbGVtZW50aSBjYXRlZ29yaXp6YXRpDQotY29udGVudFJlZmVyZW5jZXNUZXh0PVJpZmVyaW1lbnRpIGNvbnRlbnV0bw0KLWRlbGl2ZXJhYmxlVGV4dD1Db21wb25lbnRlIGRpc3RyaWJ1aWJpbGUNCi1kZWxpdmVyYWJsZVByb3BlcnRpZXNUZXh0PVByb3ByaWV0XHUwMGUwIGNvbXBvbmVudGkgZGlzdHJpYnVpYmlsaQ0KLWRlbGl2ZXJlZFBhcnRzVGV4dD1QYXJ0aSBkaXN0cmlidWliaWxpDQotZGVsaXZlcmVkV29ya1Byb2R1Y3RzVGV4dD1Qcm9kb3R0aSBkaSBsYXZvcm8gZGlzdHJpYnVpdGkNCi1kZXBlbmRlbnRUZXh0PVByb2RvdHRpIGRpIGxhdm9ybyBkaXBlbmRlbnRpDQotZGVzY3JpcHRpb25UZXh0PURlc2NyaXppb25lDQotZGlzY2lwbGluZVRleHQ9RGlzY2lwbGluYQ0KLWRpc2NpcGxpbmVzVGV4dD1EaXNjaXBsaW5hcw0KLXN1YmRpc2NpcGxpbmVzVGV4dD1Tb3R0b2Rpc2NpcGxpbmFzDQotZG9tYWluVGV4dD1Eb21pbmlvDQotZG9tYWluc1RleHQ9RG9taW5pDQotZXhhbXBsZXNUZXh0PUVzZW1waQ0KLWV4cGFuZEFsbFRleHQ9RXNwYW5kaSB0dXR0ZSBsZSB2b2NpIGRpIGVsZW5jbyBkaSBjb250cm9sbG8NCi1leHRlbmRzVGV4dD1Fc3RlbmRlDQotZXh0ZXJuYWxUZXh0PUVzdGVybm8NCi1leHRlcm5hbERlc2NyaXB0aW9uVGV4dD1EZXNjcml6aW9uZSBlc3Rlcm5hDQotZ29hbHNUZXh0PU9iaWV0dGl2aQ0KLWd1aWRlbGluZXNUZXh0PUxpbmVlIGd1aWRhDQotaWxsdXN0cmF0aW9uc1RleHQ9SWxsdXN0cmF6aW9uaQkNCi1pbXBhY3RPZk5vdEhhdmluZ1RleHQ9SW1wYXR0byBkZWxsYSBub24gZGlzcG9uaWJpbGl0XHUwMGUwDQotaW1wYWN0aW5nVGV4dD1Qcm9kb3R0aSBkaSBsYXZvcm8gY2hlIGdlbmVyYW5vIGltcGF0dG8NCi1pbnB1dHNUZXh0PUlucHV0DQotaW5wdXRUb1RleHQ9SW5wdXQgaW4NCi1pdGVtc1RleHQ9RWxlbWVudGkNCi1rZXlDb25zaWRlcmF0aW9uc1RleHQ9Q29uc2lkZXJhemlvbmkgY2hpYXZlDQotbGV2ZWxzT2ZBZG9wdGlvblRleHQ9TGl2ZWxsaSBkaSBhZG96aW9uZQ0KLW1hbmRhdG9yeVRleHQ9T2JibGlnYXRvcmlvDQotbWFpblRleHQ9UHJpbmNpcGFsZQ0KLW1haW5EZXNjcmlwdGlvblRleHQ9RGVzY3JpemlvbmUgcHJpbmNpcGFsZQ0KLW1haW5SZXNwb25zaWJsZVRleHQ9UmVzcG9uc2FiaWxlIHByaW5jaXBhbGUNCi1tZXRob2RUZXh0PVByb2RvdHRpIGRpIGxhdm9ybyBkaSBtZXRvZG8NCi1tb2RpZmllZEJ5VGV4dD1Nb2RpZmljYXRvIGRhDQotbW9yZUluZm9UZXh0PVVsdGVyaW9yaSBpbmZvcm1hemlvbmkNCi1ub3RhdGlvblRleHQ9Tm90YXppb25lDQotb3B0aW9uYWxUZXh0PUZhY29sdGF0aXZvDQotb3V0Y29tZVRleHQ9UmlzdWx0YXRvDQotb3V0cHV0RnJvbVRleHQ9T3V0cHV0IGRpDQotb3V0cHV0c1RleHQ9T3V0cHV0DQotcGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dD1Jc3RydXppb25pIHBlciBsYSBjcmVhemlvbmUgZGkgcGFjY2hldHRpDQotcGFja2FnaW5nR3VpZGFuY2VUZXh0PUd1aWRhIGFsbGEgY3JlYXppb25lIHBhY2NoZXR0aQ0KLXBlcmZvcm1pbmdSb2xlc1RleHQ9UnVvbGkgZXNlY3V0aXZpDQotcHJpbWFyeVBlcmZvcm1lclRleHQ9RXNlY3V0b3JlIHByaW1hcmlvDQotcHJvYmxlbVRleHQ9UHJvYmxlbWENCi1wcm9wZXJ0aWVzVGV4dD1Qcm9wcmlldFx1MDBlMA0KLXB1cnBvc2VUZXh0PVNjb3BvDQotcmVhc29uc0Zvck5vdE5lZWRpbmdUZXh0PU1vdGl2byBkZWxsYSBub24gbmVjZXNzaXRcdTAwZTANCi1yZWZlcmVuY2VXb3JrZmxvd3NUZXh0PUZsdXNzaSBkaSBsYXZvcm8gZGkgcmlmZXJpbWVudG8NCi1yZWxhdGVkRWxlbWVudHNUZXh0PUVsZW1lbnRpIGNvcnJlbGF0aQ0KLXJlbGF0aW9uc2hpcHNUZXh0PVJlbGF6aW9uaQ0KLXJlcG9ydHNUZXh0PVJlcG9ydA0KLXJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQ9T3B6aW9uaSBkaSByYXBwcmVzZW50YXppb25lDQotcmVzcG9uc2libGVUZXh0PVJlc3BvbnNhYmlsZQ0KLXJlc3BvbnNpYmxlRm9yVGV4dD1SZXNwb25zYWJpbGUgZGkNCi1yZXVzYWJsZUFzc2V0c1RleHQ9Umlzb3JzZSByaXV0aWxpenphYmlsaQ0KLXJvbGVUZXh0PVJ1b2xvDQotcm9sZXNUZXh0PVJ1b2xpDQotcm9sZVNldHNUZXh0PUluc2llbWkgZGkgcnVvbGkNCi1za2lsbHNUZXh0PVNraWxsDQotc3RhZmZpbmdUZXh0PVBlcnNvbmFsZQ0KLXN0ZXBzVGV4dD1QYXNzaQ0KLXN1YmNhdGVnb3JpZXNUZXh0PVNvdHRvY2F0ZWdvcmllCQ0KLXN1YmRvbWFpbnNUZXh0PVNvdHRvZG9taW5pDQotc3ViUHJhY3RpY2VzVGV4dD1Tb3R0b3ByYXRpY2hlDQotc3VwZXJUZWFtVGV4dD1Qcm9maWxvIHN1cGVydGVhbQ0KLXN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0PU1hdGVyaWFsZSBkaSBzdXBwb3J0bw0KLXN1YnRlYW1zVGV4dD1Qcm9maWxpIHNvdHRvdGVhbQ0KLXN5bm9ueW1zVGV4dD1TaW5vbmltaQ0KLXRhaWxvcmluZ1RleHQ9UGVyc29uYWxpenphemlvbmUNCi10YXNrVGV4dD1PcGVyYXppb25lDQotdGFza3NUZXh0PU9wZXJhemlvbmkNCi10YnNUZXh0PUFsbG9jYXppb25lIHRlYW0NCi10ZWFtUHJvZmlsZVRleHQ9UHJvZmlsbyB0ZWFtDQotdGVhbVJvbGVzVGV4dD1SdW9saSBwcm9maWxvIHRlYW0NCi10ZWNobmlxdWVzVGV4dD1MaW5lZSBndWlkYQ0KLXRlbXBsYXRlRmlsZXNUZXh0PUZpbGUgZGkgbW9kZWxsbw0KLXRlbXBsYXRlc1RleHQ9TW9kZWxsaQ0KLXRvb2xNZW50b3JzVGV4dD1HdWlkYSBhbCB0b29sDQotdG9vbFRleHQ9VG9vbA0KLXVzYWdlVGV4dD1VdGlsaXp6bw0KLXdic1RleHQ9RWxlbWVudG8gZGVsbGEgc3VkZGl2aXNpb25lIGRlbCBsYXZvcm8NCi13aGl0ZXBhcGVyc1RleHQ9V2hpdGVwYXBlcg0KLXdvcmtQcm9kdWN0c1RleHQ9UHJvZG90dGkgZGkgbGF2b3JvDQotd29ya1Byb2R1Y3RUeXBlc1RleHQ9VGlwaSBkaSBwcm9kb3R0byBkaSBsYXZvcm8NCi13cGJzVGV4dD1VdGlsaXp6byBkZWwgcHJvZG90dG8gZGkgbGF2b3JvDQotd29ya0JyZWFrZG93blRleHQ9U3VkZGl2aXNpb25lIGxhdm9ybw0KLXdvcmtmbG93VGV4dD1GbHVzc28gZGkgbGF2b3JvDQotd29ya1Byb2R1Y3RCcmVha2Rvd25UZXh0PVN1ZGRpdmlzaW9uZSBwcm9kb3R0byBkaSBsYXZvcm8NCi13b3JrUHJvZHVjdERlcGVuZGVuY2llc1RleHQ9RGlwZW5kZW56ZSBwcm9kb3R0aSBkaSBsYXZvcm8NCi10ZWFtUHJvZmlsZUJyZWFrZG93blRleHQ9U3VkZGl2aXNpb25lIHRlYW0NCi10ZWFtU3RydWN0dXJlVGV4dD1TdHJ1dHR1cmEgdGVhbQ0KLXBhZ2VOb3RJbnN0YWxsZWRUZXh0PVBhZ2luYSBub24gaW5zdGFsbGF0YQ0KLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PUwnZWxlbWVudG8gbm9uIGVzaXN0ZQ0KLWlzTm90VmFsaWRUZXh0PUwnZWxlbWVudG8gYSBjdWkgc2kgZmEgcmlmZXJpbWVudG8gbm9uIFx1MDBlOCB1biBlbGVtZW50byB2YWxpZG8gZGVsbGEgbGlicmVyaWEgY29ycmVudGUuDQotZWxlbWVudE1pZ2h0QmVEZWxldGVkVGV4dD1cdTAwYzggcG9zc2liaWxlIGNoZSBsJ2VsZW1lbnRvIHNpYSBzdGF0byBlbGltaW5hdG8gZGFsbGEgbGlicmVyaWEuDQotcGxlYXNlRml4TGlua1RleHQ9Q29udHJvbGxhcmUgbGEgbGlicmVyaWEgZGVsIGNvbnRlbnV0byBlIHJpcGFyYXJlIGlsIGNvbGxlZ2FtZW50by4NCi1pbmZvQWJvdXRNaXNzaW5nRWxlbWVudFRleHQ9SW5mb3JtYXppb25pIHN1bGwnZWxlbWVudG8gbWFuY2FudGU6DQotZWxlbWVudE5hbWVUZXh0PU5vbWUgZWxlbWVudG86DQotZ3VpZFRleHQ9R1VJRDoNCi1taXNzaW5nRWxlbWVudFRleHQ9TGEgcGFnaW5hIGEgY3VpIHNpIGZhIHJpZmVyaW1lbnRvIG5vbiBzaSB0cm92YSBpbiBxdWVzdGEgY29uZmlndXJhemlvbmUNCi1ub3RBdmFpbGFibGVUZXh0PUxhIHBhZ2luYSBhIGN1aSBzaSBmYSByaWZlcmltZW50byBub24gXHUwMGU4IGRpc3BvbmliaWxpIG5lbGxhIGNvbmZpZ3VyYXppb25lIGNvcnJlbnRlLiBcdTAwYzggcG9zc2liaWxlIGNoZSBxdWVzdGEgcGFnaW5hIHNpYSBkaXNwb25pYmlsZSBpbiB1biBhbHRyYSBjb25maWd1cmF6aW9uZSBkaSBwcm9jZXNzby4NCi1lbGVtZW50VHlwZVRleHQ9VGlwbyBkaSBlbGVtZW50bzoNCi1wbHVnaW5OYW1lVGV4dD1Ob21lIHBsdWctaW46DQotcHJlZGVjZXNzb3JUZXh0PVByZWRlY2Vzc29yZQ0KLXBsYW5uaW5nRGF0YVRleHQ9UGlhbmlmaWNhemlvbmUgZGF0aQ0KLW11bHRpcGxlT2NjdXJyZW5jZXNUZXh0PVJpY29ycmVuemUgbXVsdGlwbGUNCi1ldmVudERyaXZlblRleHQ9QXR0aXZhdG8gZGEgZXZlbnRvDQotb25nb2luZ1RleHQ9SW4gY29yc28NCi1wbGFubmVkVGV4dD1QaWFuaWZpY2F0bw0KLXJlcGVhdGFibGVUZXh0PVJpcGV0aWJpbGUNCi11c2FnZUd1aWRhbmNlVGV4dD1HdWlkYSBhbGwndXNvDQotaW5wdXRzVGV4dD1JbnB1dA0KLW91dHB1dHNUZXh0PU91dHB1dA0KLWFjdGl2aXR5RW50cnlTdGF0ZVRleHQ9U3RhdG8gaW5ncmVzc28gYXR0aXZpdFx1MDBlMA0KLWFjdGl2aXR5RXhpdFN0YXRlVGV4dD1TdGF0byB1c2NpdGEgYXR0aXZpdFx1MDBlMA0KLXByZWZpeFRleHQ9UHJlZmlzc28NCi1leHRlcm5hbElkVGV4dD1JRCBlc3Rlcm5vDQotc2NvcGVUZXh0PUFtYml0bw0KLXJvYWRtYXBUZXh0PVJvYWRtYXANCi10eXBlb2ZDb250cmFjdFRleHQ9VGlwbyBkaSBjb250cmF0dG8NCi1wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzVGV4dD1DYXJhdHRlcmlzdGljaGUgZGVsIHByb2dldHRvDQotcHJvamVjdE1lbWJlckV4cGVydGlzZVRleHQ9RXNwZXJpZW56YSBtZW1icm8gZGVsIHByb2dldHRvDQotcmlza0xldmVsVGV4dD1MaXZlbGxvIGRpIHJpc2NoaW8NCi1zY2FsZVRleHQ9U2NhbGENCi11c2FnZU5vdGVzVGV4dD1Ob3RlIHN1bGwndXRpbGl6em8NCi1jb250ZXh0VGV4dD1Db250ZXN0bw0KLXBhcmVudEFjdGl2aXRpZXNUZXh0PUF0dGl2aXRcdTAwZTAgcGFyZW50DQotaW5jbHVkZWRQYXR0ZXJuc1RleHQ9TW9kZWxsbyBpbmNsdXNpDQotY2hlY2tsaXN0VGV4dD1FbGVuY28gZGkgY29udHJvbGxvDQotY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNUZXh0PU1hdGVyaWFsaSBwZXIgbGEgY29tdW5pY2F6aW9uZQ0KLWVkdWNhdGlvbk1hdGVyaWFsc1RleHQ9TWF0ZXJpYWxlIGRpZGF0dGljbw0KLWVzdGltYXRpbmdUZWNobmlxdWVUZXh0PVZhbHV0YXppb25lIGRlbGxhIHRlY25pY2ENCi1hZGRpdGlvbmFsVGV4dD1BZ2dpdW50aXZvDQotbW9kaWZpZXNUZXh0PU1vZGlmaWNhDQotYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0PUVzZWd1ZSBhbmNoZQ0KLWluZGV4VGV4dD1JbmRpY2UNCi1wcmVmaXhUZXh0PVByZWZpc3NvDQotYnJlYWtkb3duRWxlbWVudFRleHQ9RWxlbWVudG8gZGVsbGEgc3VkZGl2aXNpb25lDQotc3RlcHNUZXh0PVBhc3NpDQotcHJlZGVjZXNzb3JzVGV4dD1QcmVkZWNlc3NvcmkNCi1yZXBlYXRhYmxlVGV4dD1SaXBldGliaWxlDQotdHlwZVRleHQ9VGlwbw0KLW9uZ29pbmdUZXh0PUluIGNvcnNvDQotZXZlbnREcml2ZW5UZXh0PUF0dGl2YXRvIGRhIGV2ZW50bw0KLW1vZGVsSW5mb1RleHQ9SW5mbyBtb2RlbGxvDQotZW50cnlTdGF0ZVRleHQ9U3RhdG8gZGkgaW5ncmVzc28NCi1leGl0U3RhdGVUZXh0PVN0YXRvIGRpIHVzY2l0YQ0KLXRlYW1UZXh0PVRlYW0NCi1wYXJlbnRQYWNrYWdlVGV4dD1QYWNjaGV0dG8gcGFyZW50DQotY29udGFpbmVkUGFja2FnZXNUZXh0PVBhY2NoZXR0aSBjb250ZW51dGkNCi1jb250ZW50c1RleHQ9Q29udGVudXRvDQotYmFzZWRPbk1ldGhvZFJvbGVUZXh0PUJhc2F0byBzdSBydW9sbyBtZXRvZG8NCi1iYXNlZE9uTWV0aG9kVGFza1RleHQ9QmFzYXRvIHN1IG9wZXJhemlvbmUgbWV0b2RvDQotYmFzZWRPbk1ldGhvZFdvcmtQcm9kdWN0VGV4dD1CYXNhdG8gc3UgcHJvZG90dG8gZGkgbGF2b3JvIG1ldG9kbw0KLXN1bW1hcnlUZXh0PVJpZXBpbG9nbw0KLXBlcmZvcm1zVGV4dD1Fc2VndWUNCi1yZXBsYWNlc1RleHQ9U29zdGl0dWlzY2UNCi1jb250cmlidXRlc1RleHQ9Q29udHJpYnVpc2NlDQotbm9uZVRleHQ9TmVzc3Vubw0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQ9Q29uc2lkZXJhemlvbmkgc3VsbGEgdmFsdXRhemlvbmUNCi1hY3Rpdml0eVJlZmVyZW5jZXNUZXh0PVJpZmVyaW1lbnRpIGF0dGl2aXRcdTAwZTANCi1uYW1lVGV4dD1Ob21lDQotcHJlc2VudGF0aW9uTmFtZVRleHQ9Tm9tZSBwcmVzZW50YXppb25lDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3hzbC9yZXNvdXJjZXNfamEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4MGFhYWMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3hzbC9yZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIFRoZSBVSSB0ZXh0IGluIHRoZSBYU0wgc3R5bGVzaGVldHMuDQotDQotYWRkaXRpb25hbEluZm9UZXh0PVx1OGZmZFx1NTJhMFx1NjBjNVx1NTgzMQ0KLWFkZGl0aW9uYWxQZXJmb3JtZXJUZXh0PVx1OGZmZFx1NTJhMFx1NWI5Zlx1ODg0Y1x1ODAwNQ0KLWFnZ3JlZ2F0ZXNUZXh0PVx1OTZjNlx1N2QwNA0KLWFsdGVybmF0aXZlc1RleHQ9XHU0ZWUzXHU2ODQ4DQotYXBwbGljYXRpb25UZXh0PVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmMw0KLWFydGlmYWN0VGV4dD1cdTYyMTBcdTY3OWNcdTcyNjkNCi1hc3NldHNUZXh0PVx1MzBhMlx1MzBiYlx1MzBjM1x1MzBjOA0KLWFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dD1cdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjZcdTY1YjlcdTZjZDUNCi1hc3Npc3RpbmdUZXh0PVx1NjUyZlx1NjNmNA0KLWJhY2tncm91bmRUZXh0PVx1ODBjY1x1NjY2Zg0KLWJyaWVmT3V0bGluZVRleHQ9XHU2OTgyXHU4OTgxDQotY2hlY2tJdGVtc1RleHQ9XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHU5ODA1XHU3NmVlDQotY2hlY2tsaXN0c1RleHQ9XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMGVhXHUzMGI5XHUzMGM4DQotY29sbGFwc2VBbGxUZXh0PVx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1OTgwNVx1NzZlZVx1MzA5Mlx1MzA1OVx1MzA3OVx1MzA2Nlx1N2UyZVx1NWMwZlx1ODg2OFx1NzkzYQ0KLWNvbXBvc2l0ZVJvbGVUZXh0PVx1MzBiM1x1MzBmM1x1MzBkZFx1MzBiOFx1MzBjM1x1MzBjOFx1MzBmYlx1MzBlZFx1MzBmY1x1MzBlYg0KLWNvbmNlcHRzVGV4dD1cdTY5ODJcdTVmZjUNCi1jb250YWluZWRBcnRpZmFjdHNUZXh0PVx1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA4Ylx1NjIxMFx1Njc5Y1x1NzI2OQ0KLWNvbnRhaW5lckFydGlmYWN0VGV4dD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwZmNcdTYyMTBcdTY3OWNcdTcyNjkNCi1jb250ZW50RWxlbWVudHNUZXh0PVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1NTMxNlx1ODk4MVx1N2QyMA0KLWNvbnRlbnRSZWZlcmVuY2VzVGV4dD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTUzYzJcdTcxNjcNCi1kZWxpdmVyYWJsZVRleHQ9XHU3ZDBkXHU1MTY1XHU3MjY5DQotZGVsaXZlcmFibGVQcm9wZXJ0aWVzVGV4dD1cdTdkMGRcdTUxNjVcdTcyNjlcdTMwNmVcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmMNCi1kZWxpdmVyZWRQYXJ0c1RleHQ9XHU3ZDBkXHU1MTY1XHU3MjY5DQotZGVsaXZlcmVkV29ya1Byb2R1Y3RzVGV4dD1cdTdkMGRcdTUxNjVcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzgNCi1kZXBlbmRlbnRUZXh0PVx1NWY5M1x1NWM1ZVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLWRlc2NyaXB0aW9uVGV4dD1cdThhYWNcdTY2MGUNCi1kaXNjaXBsaW5lVGV4dD1cdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2UNCi1kaXNjaXBsaW5lc1RleHQ9XHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlDQotc3ViZGlzY2lwbGluZXNUZXh0PVx1MzBiNVx1MzBkNlx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZQ0KLWRvbWFpblRleHQ9XHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzDQotZG9tYWluc1RleHQ9XHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzDQotZXhhbXBsZXNUZXh0PVx1NGY4Yg0KLWV4cGFuZEFsbFRleHQ9XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHU5ODA1XHU3NmVlXHUzMDkyXHUzMDU5XHUzMDc5XHUzMDY2XHU2MmUxXHU1ZjM1XHU4ODY4XHU3OTNhDQotZXh0ZW5kc1RleHQ9XHU2MmUxXHU1ZjM1DQotZXh0ZXJuYWxUZXh0PVx1NTkxNlx1OTBlOA0KLWV4dGVybmFsRGVzY3JpcHRpb25UZXh0PVx1NTkxNlx1OTBlOFx1OGExOFx1OGZmMA0KLWdvYWxzVGV4dD1cdTc2ZWVcdTZhMTkNCi1ndWlkZWxpbmVzVGV4dD1cdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjMNCi1pbGx1c3RyYXRpb25zVGV4dD1cdTU2ZjMJDQotaW1wYWN0T2ZOb3RIYXZpbmdUZXh0PVx1MzA2YVx1MzA0NFx1NTgzNFx1NTQwOFx1MzA2ZVx1NWY3MVx1OTdmZg0KLWltcGFjdGluZ1RleHQ9XHU1ZjcxXHU5N2ZmXHUzMDkyXHU0ZTBlXHUzMDQ4XHUzMDhiXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotaW5wdXRzVGV4dD1cdTUxNjVcdTUyOWINCi1pbnB1dFRvVGV4dD1cdTUxNjVcdTUyOWJcdTUxNDgNCi1pdGVtc1RleHQ9XHU5ODA1XHU3NmVlDQota2V5Q29uc2lkZXJhdGlvbnNUZXh0PVx1NGUzYlx1MzA2YVx1ODAwM1x1NjE2ZVx1NGU4Ylx1OTgwNQ0KLWxldmVsc09mQWRvcHRpb25UZXh0PVx1NjNhMVx1NzUyOFx1MzA2ZVx1MzBlY1x1MzBkOVx1MzBlYg0KLW1hbmRhdG9yeVRleHQ9XHU1ZmM1XHU5ODA4DQotbWFpblRleHQ9XHU0ZTNiXHU4OTgxDQotbWFpbkRlc2NyaXB0aW9uVGV4dD1cdThhYWNcdTY2MGUNCi1tYWluUmVzcG9uc2libGVUZXh0PVx1NGUzYlx1NjJjNVx1NWY1M1x1ODAwNQ0KLW1ldGhvZFRleHQ9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotbW9kaWZpZWRCeVRleHQ9XHU1OTA5XHU2NmY0XHU4MDA1DQotbW9yZUluZm9UZXh0PVx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMQ0KLW5vdGF0aW9uVGV4dD1cdTg4NjhcdThhMTgNCi1vcHRpb25hbFRleHQ9XHUzMGFhXHUzMGQ3XHUzMGI3XHUzMGU3XHUzMGYzDQotb3V0Y29tZVRleHQ9XHU3ZDUwXHU2NzljDQotb3V0cHV0RnJvbVRleHQ9XHU1MWZhXHU1MjliXHU1MTQzDQotb3V0cHV0c1RleHQ9XHU1MWZhXHU1MjliDQotcGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dD1cdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjhcdTUzMTZcdTMwNmVcdThhYWNcdTY2MGUNCi1wYWNrYWdpbmdHdWlkYW5jZVRleHQ9XHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHU1MzE2XHUzMDZlXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5DQotcGVyZm9ybWluZ1JvbGVzVGV4dD1cdTViOWZcdTg4NGNcdTMwZWRcdTMwZmNcdTMwZWINCi1wcmltYXJ5UGVyZm9ybWVyVGV4dD1cdTU3ZmFcdTY3MmNcdTViOWZcdTg4NGNcdTgwMDUNCi1wcm9ibGVtVGV4dD1cdTU1NGZcdTk4NGMNCi1wcm9wZXJ0aWVzVGV4dD1cdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmMNCi1wdXJwb3NlVGV4dD1cdTc2ZWVcdTc2ODQNCi1yZWFzb25zRm9yTm90TmVlZGluZ1RleHQ9XHU1ZmM1XHU4OTgxXHUzMDZlXHUzMDZhXHUzMDQ0XHU3NDA2XHU3NTMxDQotcmVmZXJlbmNlV29ya2Zsb3dzVGV4dD1cdTUzYzJcdTcxNjdcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZDVcdTMwZWRcdTMwZmMNCi1yZWxhdGVkRWxlbWVudHNUZXh0PVx1OTVhMlx1NGZjMlx1MzA1OVx1MzA4Ylx1ODk4MVx1N2QyMA0KLXJlbGF0aW9uc2hpcHNUZXh0PVx1OTVhMlx1NGZjMg0KLXJlcG9ydHNUZXh0PVx1MzBlY1x1MzBkZFx1MzBmY1x1MzBjOA0KLXJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQ9XHU4ODY4XHU3OTNhXHUzMGFhXHUzMGQ3XHUzMGI3XHUzMGU3XHUzMGYzDQotcmVzcG9uc2libGVUZXh0PVx1NjJjNVx1NWY1M1x1ODAwNQ0KLXJlc3BvbnNpYmxlRm9yVGV4dD1cdTYyYzVcdTVmNTMNCi1yZXVzYWJsZUFzc2V0c1RleHQ9XHU1MThkXHU1MjI5XHU3NTI4XHU1M2VmXHU4MGZkXHUzMDZhXHUzMGEyXHUzMGJiXHUzMGMzXHUzMGM4DQotcm9sZVRleHQ9XHUzMGVkXHUzMGZjXHUzMGViDQotcm9sZXNUZXh0PVx1MzBlZFx1MzBmY1x1MzBlYg0KLXJvbGVTZXRzVGV4dD1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzgNCi1za2lsbHNUZXh0PVx1MzBiOVx1MzBhZFx1MzBlYg0KLXN0YWZmaW5nVGV4dD1cdTkxNGRcdTVjNWUNCi1zdGVwc1RleHQ9XHUzMGI5XHUzMGM2XHUzMGMzXHUzMGQ3DQotc3ViY2F0ZWdvcmllc1RleHQ9XHUzMGI1XHUzMGQ2XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjCQ0KLXN1YmRvbWFpbnNUZXh0PVx1MzBiNVx1MzBkNlx1MzBjOVx1MzBlMVx1MzBhNFx1MzBmMw0KLXN1YlByYWN0aWNlc1RleHQ9XHUzMGI1XHUzMGQ2XHUzMGQ3XHUzMGU5XHUzMGFmXHUzMGM2XHUzMGEzXHUzMGI5DQotc3VwZXJUZWFtVGV4dD1cdTMwYjlcdTMwZmNcdTMwZDFcdTMwZmNcdTMwZmJcdTMwYzFcdTMwZmNcdTMwZTBcdTMwNmVcdTMwZDdcdTMwZWRcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWINCi1zdXBwb3J0aW5nTWF0ZXJpYWxzVGV4dD1cdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzhcdThjYzdcdTY1OTkNCi1zdWJ0ZWFtc1RleHQ9XHUzMGI1XHUzMGQ2XHUzMGMxXHUzMGZjXHUzMGUwXHUzMDZlXHUzMGQ3XHUzMGVkXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViDQotc3lub255bXNUZXh0PVx1NTQwY1x1N2ZhOVx1OGE5ZQ0KLXRhaWxvcmluZ1RleHQ9XHU4YWJmXHU2NTc0DQotdGFza1RleHQ9XHUzMGJmXHUzMGI5XHUzMGFmDQotdGFza3NUZXh0PVx1MzBiZlx1MzBiOVx1MzBhZg0KLXRic1RleHQ9XHUzMGMxXHUzMGZjXHUzMGUwXHUzMDZlXHU1MjcyXHUzMDhhXHU2MzJmXHUzMDhhDQotdGVhbVByb2ZpbGVUZXh0PVx1MzBjMVx1MzBmY1x1MzBlMFx1MzBmYlx1MzBkN1x1MzBlZFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYg0KLXRlYW1Sb2xlc1RleHQ9XHUzMGMxXHUzMGZjXHUzMGUwXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMGZiXHUzMGVkXHUzMGZjXHUzMGViDQotdGVjaG5pcXVlc1RleHQ9XHUzMGFjXHUzMGE0XHUzMGM5XHUzMGU5XHUzMGE0XHUzMGYzDQotdGVtcGxhdGVGaWxlc1RleHQ9XHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViDQotdGVtcGxhdGVzVGV4dD1cdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzgNCi10b29sTWVudG9yc1RleHQ9XHUzMGM0XHUzMGZjXHUzMGViXHUzMGZiXHUzMGUxXHUzMGYzXHUzMGJmXHUzMGZjDQotdG9vbFRleHQ9XHUzMGM0XHUzMGZjXHUzMGViDQotdXNhZ2VUZXh0PVx1NGY3Zlx1NzUyOFx1NmNkNQ0KLXdic1RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGI5XHUzMGM4XHUzMGU5XHUzMGFmXHUzMGMxXHUzMGUzXHUzMGZjDQotd2hpdGVwYXBlcnNUZXh0PVx1MzBkYlx1MzBlZlx1MzBhNFx1MzBjOFx1MzBmYlx1MzBkYVx1MzBmY1x1MzBkMVx1MzBmYw0KLXdvcmtQcm9kdWN0c1RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotd29ya1Byb2R1Y3RUeXBlc1RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU5ODVlDQotd3Bic1RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDZlXHU0ZjdmXHU3NTI4XHU3MmI2XHU2Y2MxDQotd29ya0JyZWFrZG93blRleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzDQotd29ya2Zsb3dUZXh0PVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBkNVx1MzBlZFx1MzBmYw0KLXdvcmtQcm9kdWN0QnJlYWtkb3duVGV4dD1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTMwNmVcdTMwZDZcdTMwZWNcdTMwZmNcdTMwYWZcdTMwYzBcdTMwYTZcdTMwZjMNCi13b3JrUHJvZHVjdERlcGVuZGVuY2llc1RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDZlXHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyDQotdGVhbVByb2ZpbGVCcmVha2Rvd25UZXh0PVx1MzBjMVx1MzBmY1x1MzBlMFx1MzA2ZVx1MzBkNlx1MzBlY1x1MzBmY1x1MzBhZlx1MzBjMFx1MzBhNlx1MzBmMw0KLXRlYW1TdHJ1Y3R1cmVUZXh0PVx1MzBjMVx1MzBmY1x1MzBlMFx1NjljYlx1NjIxMA0KLXBhZ2VOb3RJbnN0YWxsZWRUZXh0PVx1NjcyYVx1MzBhNFx1MzBmM1x1MzBiOVx1MzBjOFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBkYVx1MzBmY1x1MzBiOA0KLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PVx1ODk4MVx1N2QyMFx1MzA0Y1x1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1Ylx1MzA5Mw0KLWlzTm90VmFsaWRUZXh0PVx1NTNjMlx1NzE2N1x1NWJmZVx1OGM2MVx1MzA2ZVx1ODk4MVx1N2QyMFx1MzA2Zlx1MzAwMVx1NzNmZVx1ODg0Y1x1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2N1x1NjcwOVx1NTJiOVx1MzA2YVx1ODk4MVx1N2QyMFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLWVsZW1lbnRNaWdodEJlRGVsZXRlZFRleHQ9XHUzMDUzXHUzMDZlXHU4OTgxXHU3ZDIwXHUzMDZmXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDRiXHUzMDg5XHU1MjRhXHU5NjY0XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHU1M2VmXHU4MGZkXHU2MDI3XHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotcGxlYXNlRml4TGlua1RleHQ9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHU3OGJhXHU4YThkXHUzMDU3XHUzMDY2XHUzMDAxXHUzMGVhXHUzMGYzXHUzMGFmXHUzMDkyXHU0ZmVlXHU2YjYzXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotaW5mb0Fib3V0TWlzc2luZ0VsZW1lbnRUZXh0PVx1NmIyMFx1ODQzZFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1ODk4MVx1N2QyMFx1MzA2ZVx1NjBjNVx1NTgzMToNCi1lbGVtZW50TmFtZVRleHQ9XHU4OTgxXHU3ZDIwXHU1NDBkOg0KLWd1aWRUZXh0PUdVSUQ6DQotbWlzc2luZ0VsZW1lbnRUZXh0PVx1NTNjMlx1NzE2N1x1NWJmZVx1OGM2MVx1MzA2ZVx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2Zlx1MzA1M1x1MzA2ZVx1NjljYlx1NjIxMFx1MzA2Ylx1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLW5vdEF2YWlsYWJsZVRleHQ9XHU1M2MyXHU3MTY3XHU1YmZlXHU4YzYxXHUzMDZlXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZmXHU3M2ZlXHU1NzI4XHUzMDZlXHU2OWNiXHU2MjEwXHUzMDY3XHUzMDZmXHU0ZjdmXHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyIFx1MzA1M1x1MzA2ZVx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2Zlx1NGVkNlx1MzA2ZVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1NjljYlx1NjIxMFx1MzA2N1x1NGY3Zlx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2YVx1NTgzNFx1NTQwOFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMg0KLWVsZW1lbnRUeXBlVGV4dD1cdTg5ODFcdTdkMjBcdTMwYmZcdTMwYTRcdTMwZDc6DQotcGx1Z2luTmFtZVRleHQ9XHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHU1NDBkOg0KLXByZWRlY2Vzc29yVGV4dD1cdTUxNDhcdTg4NGNcdTMwYmZcdTMwYjlcdTMwYWYNCi1wbGFubmluZ0RhdGFUZXh0PVBsYW5uaW5nRGF0YQ0KLW11bHRpcGxlT2NjdXJyZW5jZXNUZXh0PVx1ODkwN1x1NjU3MFx1MzA2ZVx1NTFmYVx1NzNmZQ0KLWV2ZW50RHJpdmVuVGV4dD1cdTMwYTRcdTMwZDlcdTMwZjNcdTMwYzhcdTk5YzZcdTUyZDUNCi1vbmdvaW5nVGV4dD1cdTkwMzJcdTg4NGNcdTRlMmQNCi1wbGFubmVkVGV4dD1cdThhMDhcdTc1M2JcdTZlMDhcdTMwN2YNCi1yZXBlYXRhYmxlVGV4dD1cdTUzY2RcdTVmYTlcdTUzZWZcdTgwZmQNCi11c2FnZUd1aWRhbmNlVGV4dD1cdTRmN2ZcdTc1MjhcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjkNCi1pbnB1dHNUZXh0PVx1NTE2NVx1NTI5Yg0KLW91dHB1dHNUZXh0PVx1NTFmYVx1NTI5Yg0KLWFjdGl2aXR5RW50cnlTdGF0ZVRleHQ9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU5NThiXHU1OWNiXHU3MmI2XHU2MTRiDQotYWN0aXZpdHlFeGl0U3RhdGVUZXh0PVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1N2Q0Mlx1NGU4Nlx1NzJiNlx1NjE0Yg0KLXByZWZpeFRleHQ9XHUzMGQ3XHUzMGVjXHUzMGQ1XHUzMGEzXHUzMGMzXHUzMGFmXHUzMGI5DQotZXh0ZXJuYWxJZFRleHQ9XHU1OTE2XHU5MGU4IElEDQotc2NvcGVUZXh0PVx1MzBiOVx1MzBiM1x1MzBmY1x1MzBkNw0KLXJvYWRtYXBUZXh0PVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkNw0KLXR5cGVvZkNvbnRyYWN0VGV4dD1cdTU5NTFcdTdkMDRcdTMwNmVcdTMwYmZcdTMwYTRcdTMwZDcNCi1wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzVGV4dD1cdTMwZDdcdTMwZWRcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTMwNmVcdTcyNzlcdTYwMjcNCi1wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlVGV4dD1cdTMwZDdcdTMwZWRcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTMwZmJcdTMwZTFcdTMwZjNcdTMwZDBcdTMwZmNcdTMwNmVcdTVjMDJcdTk1ODBcdTc3ZTVcdThiNTgNCi1yaXNrTGV2ZWxUZXh0PVx1MzBlYVx1MzBiOVx1MzBhZlx1MzBmYlx1MzBlY1x1MzBkOVx1MzBlYg0KLXNjYWxlVGV4dD1cdTMwYjlcdTMwYjFcdTMwZmNcdTMwZWINCi11c2FnZU5vdGVzVGV4dD1cdTRmN2ZcdTc1MjhcdTRlMGFcdTMwNmVcdTZjZThcdTYxMGYNCi1jb250ZXh0VGV4dD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzgNCi1wYXJlbnRBY3Rpdml0aWVzVGV4dD1cdTg5YWFcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmMNCi1pbmNsdWRlZFBhdHRlcm5zVGV4dD1cdTUzMDVcdTU0MmJcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjMNCi1jaGVja2xpc3RUZXh0PVx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1MzBlYVx1MzBiOVx1MzBjOA0KLWNvbW11bmljYXRpb25zTWF0ZXJpYWxzVGV4dD1cdTMwYjNcdTMwZGZcdTMwZTVcdTMwY2JcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdThjYzdcdTY1OTkNCi1lZHVjYXRpb25NYXRlcmlhbHNUZXh0PVx1NjU1OVx1ODBiMlx1OGNjN1x1NjU5OQ0KLWVzdGltYXRpbmdUZWNobmlxdWVUZXh0PVx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YVx1NjI0Ylx1NmNkNQ0KLWFkZGl0aW9uYWxUZXh0PVx1OGZmZFx1NTJhMA0KLW1vZGlmaWVzVGV4dD1cdTU5MDlcdTY2ZjQNCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQ9XHU4ZmZkXHU1MmEwXHU1YjlmXHU4ODRjDQotaW5kZXhUZXh0PVx1N2QyMlx1NWYxNQ0KLXByZWZpeFRleHQ9XHUzMGQ3XHUzMGVjXHUzMGQ1XHUzMGEzXHUzMGMzXHUzMGFmXHUzMGI5DQotYnJlYWtkb3duRWxlbWVudFRleHQ9XHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4DQotc3RlcHNUZXh0PVx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkNw0KLXByZWRlY2Vzc29yc1RleHQ9XHU1MTQ4XHU4ODRjXHUzMGJmXHUzMGI5XHUzMGFmDQotcmVwZWF0YWJsZVRleHQ9XHU1M2NkXHU1ZmE5XHU1M2VmXHU4MGZkDQotdHlwZVRleHQ9XHUzMGJmXHUzMGE0XHUzMGQ3DQotb25nb2luZ1RleHQ9XHU5MDMyXHU4ODRjXHU0ZTJkDQotZXZlbnREcml2ZW5UZXh0PVx1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1OTljNlx1NTJkNQ0KLW1vZGVsSW5mb1RleHQ9XHUzMGUyXHUzMGM3XHUzMGViXHU2MGM1XHU1ODMxDQotZW50cnlTdGF0ZVRleHQ9XHU5NThiXHU1OWNiXHU3MmI2XHU2MTRiDQotZXhpdFN0YXRlVGV4dD1cdTdkNDJcdTRlODZcdTcyYjZcdTYxNGINCi10ZWFtVGV4dD1cdTMwYzFcdTMwZmNcdTMwZTANCi1wYXJlbnRQYWNrYWdlVGV4dD1cdTg5YWFcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjgNCi1jb250YWluZWRQYWNrYWdlc1RleHQ9XHU1NDJiXHUzMDdlXHUzMDhjXHUzMDhiXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4DQotY29udGVudHNUZXh0PVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNA0KLWJhc2VkT25NZXRob2RSb2xlVGV4dD1cdTU3ZmFcdTY3MmNcdTMwNjhcdTMwNmFcdTMwOGJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWINCi1iYXNlZE9uTWV0aG9kVGFza1RleHQ9XHU1N2ZhXHU2NzJjXHUzMDY4XHUzMDZhXHUzMDhiXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDZlXHUzMGJmXHUzMGI5XHUzMGFmDQotYmFzZWRPbk1ldGhvZFdvcmtQcm9kdWN0VGV4dD1cdTU3ZmFcdTY3MmNcdTMwNjhcdTMwNmFcdTMwOGJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwNmVcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzgNCi1zdW1tYXJ5VGV4dD1cdTg5ODFcdTdkMDQNCi1wZXJmb3Jtc1RleHQ9XHU1YjlmXHU4ODRjDQotcmVwbGFjZXNUZXh0PVx1N2Y2ZVx1NjNkYg0KLWNvbnRyaWJ1dGVzVGV4dD1cdTViYzRcdTRlMGUNCi1ub25lVGV4dD1cdTMwNmFcdTMwNTcNCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNUZXh0PVx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YVx1ODAwM1x1NjE2ZVx1NGU4Ylx1OTgwNQ0KLWFjdGl2aXR5UmVmZXJlbmNlc1RleHQ9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU1M2MyXHU3MTY3DQotbmFtZVRleHQ9XHU1NDBkXHU1MjRkDQotcHJlc2VudGF0aW9uTmFtZVRleHQ9XHU4ODY4XHU3OTNhXHU1NDBkDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3hzbC9yZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjNTI2Y2MuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3hzbC9yZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIFRoZSBVSSB0ZXh0IGluIHRoZSBYU0wgc3R5bGVzaGVldHMuDQotDQotYWRkaXRpb25hbEluZm9UZXh0PVx1Y2Q5NFx1YWMwMCBcdWM4MTVcdWJjZjQNCi1hZGRpdGlvbmFsUGVyZm9ybWVyVGV4dD1cdWNkOTRcdWFjMDAgXHVjMjE4XHVkNTg5XHVjNzkwDQotYWdncmVnYXRlc1RleHQ9XHVjOWQxXHVhY2M0DQotYWx0ZXJuYXRpdmVzVGV4dD1cdWIzMDBcdWNjYjQNCi1hcHBsaWNhdGlvblRleHQ9XHVjNzUxXHVjNmE5XHVkNTA0XHViODVjXHVhZGY4XHViN2E4DQotYXJ0aWZhY3RUZXh0PVx1YzU0NFx1ZDJmMFx1ZDMyOVx1ZDJiOA0KLWFzc2V0c1RleHQ9XHVjNzkwXHVjMGIwDQotYXNzaWdubWVudEFwcHJvYWNoZXNUZXh0PVx1YzljMFx1YzgxNSBcdWM4MTFcdWFkZmMgXHViYzI5XHVjMmRkDQotYXNzaXN0aW5nVGV4dD1cdWM5YzBcdWM2ZDANCi1iYWNrZ3JvdW5kVGV4dD1cdWJjMzBcdWFjYmQNCi1icmllZk91dGxpbmVUZXh0PVx1YWMwNFx1YjdiNVx1ZDU1YyBcdWM1NDRcdWM2YzNcdWI3N2NcdWM3NzgNCi1jaGVja0l0ZW1zVGV4dD1cdWFjODBcdWMwYWMgXHVkNTZkXHViYWE5DQotY2hlY2tsaXN0c1RleHQ9XHVjY2I0XHVkMDZjXHViOWFjXHVjMmE0XHVkMmI4DQotY29sbGFwc2VBbGxUZXh0PVx1YzEyMFx1ZDBkZCBcdWQ1NmRcdWJhYTkgXHViYWE4XHViNDUwIFx1YzgxMVx1YWUzMA0KLWNvbXBvc2l0ZVJvbGVUZXh0PVx1Y2VmNFx1ZDNlY1x1YzljMFx1ZDJiOCBcdWM1ZWRcdWQ1NjANCi1jb25jZXB0c1RleHQ9XHVhYzFjXHViMTUwDQotY29udGFpbmVkQXJ0aWZhY3RzVGV4dD1cdWQzZWNcdWQ1NjhcdWI0MWMgXHVjNTQ0XHVkMmYwXHVkMzI5XHVkMmI4DQotY29udGFpbmVyQXJ0aWZhY3RUZXh0PVx1Y2VlOFx1ZDE0Y1x1Yzc3NFx1YjEwOCBcdWM1NDRcdWQyZjBcdWQzMjlcdWQyYjgNCi1jb250ZW50RWxlbWVudHNUZXh0PVx1YmQ4NFx1Yjk1OFx1YjQxYyBcdWM2OTRcdWMxOGMNCi1jb250ZW50UmVmZXJlbmNlc1RleHQ9XHVjZWU4XHVkMTUwXHVjZTIwIFx1Y2MzOFx1Yzg3MA0KLWRlbGl2ZXJhYmxlVGV4dD1cdWM3NzhcdWIzYzRcdWJiM2MNCi1kZWxpdmVyYWJsZVByb3BlcnRpZXNUZXh0PVx1Yzc3OFx1YjNjNFx1YmIzYyBcdWQyYjlcdWMxMzENCi1kZWxpdmVyZWRQYXJ0c1RleHQ9XHVjNzc4XHViM2M0XHViYjNjIFx1ZDMwY1x1ZDJiOA0KLWRlbGl2ZXJlZFdvcmtQcm9kdWN0c1RleHQ9XHVjNzc4XHViM2M0XHViNDFjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi1kZXBlbmRlbnRUZXh0PVx1Yzg4NVx1YzE4ZCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjDQotZGVzY3JpcHRpb25UZXh0PVx1YzEyNFx1YmE4NQ0KLWRpc2NpcGxpbmVUZXh0PVx1YzZkMFx1Y2U1OQ0KLWRpc2NpcGxpbmVzVGV4dD1cdWM2ZDBcdWNlNTkNCi1zdWJkaXNjaXBsaW5lc1RleHQ9XHVjNmQwXHVjZTU5DQotZG9tYWluVGV4dD1cdWIzYzRcdWJhNTRcdWM3NzgNCi1kb21haW5zVGV4dD1cdWIzYzRcdWJhNTRcdWM3NzgNCi1leGFtcGxlc1RleHQ9XHVjNjA4XHVjODFjDQotZXhwYW5kQWxsVGV4dD1cdWMxMjBcdWQwZGQgXHVkNTZkXHViYWE5IFx1YmFhOFx1YjQ1MCBcdWQzYmNcdWNlNThcdWFlMzANCi1leHRlbmRzVGV4dD1cdWQ2NTVcdWM3YTUNCi1leHRlcm5hbFRleHQ9XHVjNjc4XHViZDgwDQotZXh0ZXJuYWxEZXNjcmlwdGlvblRleHQ9XHVjNjc4XHViZDgwIFx1YzEyNFx1YmE4NQ0KLWdvYWxzVGV4dD1cdWJhYTlcdWM4MDENCi1ndWlkZWxpbmVzVGV4dD1cdWFjMDBcdWM3NzRcdWI0ZGNcdWI3N2NcdWM3NzgNCi1pbGx1c3RyYXRpb25zVGV4dD1cdWM2MDhcdWMyZGMNCi1pbXBhY3RPZk5vdEhhdmluZ1RleHQ9XHViZDgwXHVjN2FjXHVjNWQwIFx1YjUzMFx1Yjk3OCBcdWM2MDFcdWQ1YTUNCi1pbXBhY3RpbmdUZXh0PVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2NcdWM1ZDAgXHVjNjAxXHVkNWE1IFx1YzhmY1x1YWUzMA0KLWlucHV0c1RleHQ9XHVjNzg1XHViODI1DQotaW5wdXRUb1RleHQ9XHVjNzg1XHViODI1IFx1YjMwMFx1YzBjMQ0KLWl0ZW1zVGV4dD1cdWQ1NmRcdWJhYTkNCi1rZXlDb25zaWRlcmF0aW9uc1RleHQ9XHVkNTc1XHVjMmVjIFx1YWNlMFx1YjgyNFx1YzBhY1x1ZDU2ZA0KLWxldmVsc09mQWRvcHRpb25UZXh0PVx1Y2M0NFx1ZDBkZCBcdWI4MDhcdWJjYTgNCi1tYW5kYXRvcnlUZXh0PVx1ZDU0NFx1YzIxOA0KLW1haW5UZXh0PVx1YWUzMFx1YmNmOA0KLW1haW5EZXNjcmlwdGlvblRleHQ9XHVhZTMwXHViY2Y4IFx1YzEyNFx1YmE4NQ0KLW1haW5SZXNwb25zaWJsZVRleHQ9XHVhZTMwXHViY2Y4IFx1Y2M0NVx1Yzc4NA0KLW1ldGhvZFRleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi1tb2RpZmllZEJ5VGV4dD1cdWMyMThcdWM4MTVcdWM3OTANCi1tb3JlSW5mb1RleHQ9XHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNA0KLW5vdGF0aW9uVGV4dD1cdWQ0NWNcdWFlMzBcdWJjOTUNCi1vcHRpb25hbFRleHQ9XHVjMTIwXHVkMGRkXHVjODAxDQotb3V0Y29tZVRleHQ9XHVhY2IwXHVhY2ZjXHViYjNjDQotb3V0cHV0RnJvbVRleHQ9XHVjMGIwXHVjZDljIFx1YzljMFx1YzgxMA0KLW91dHB1dHNUZXh0PVx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLXBhY2thZ2luZ0luc3RydWN0aW9uc1RleHQ9XHVkMzI4XHVkMGE0XHVjOWQ1IFx1YzljMFx1YzJkY1x1YzBhY1x1ZDU2ZA0KLXBhY2thZ2luZ0d1aWRhbmNlVGV4dD1cdWQzMjhcdWQwYTRcdWM5ZDUgXHVjNTQ4XHViMGI0DQotcGVyZm9ybWluZ1JvbGVzVGV4dD1cdWMyMThcdWQ1ODkgXHVjNWVkXHVkNTYwDQotcHJpbWFyeVBlcmZvcm1lclRleHQ9XHVhZTMwXHViY2Y4IFx1YzIxOFx1ZDU4OVx1Yzc5MA0KLXByb2JsZW1UZXh0PVx1YmIzOFx1YzgxY1x1YzgxMA0KLXByb3BlcnRpZXNUZXh0PVx1ZDJiOVx1YzEzMQ0KLXB1cnBvc2VUZXh0PVx1YmFhOVx1YzgwMQ0KLXJlYXNvbnNGb3JOb3ROZWVkaW5nVGV4dD1cdWQ1NDRcdWM2OTQgXHVjNWM2XHViMjk0IFx1Yzc3NFx1YzcyMA0KLXJlZmVyZW5jZVdvcmtmbG93c1RleHQ9XHVjYzM4XHVjODcwIFx1YzZjY1x1ZDA2Y1x1ZDUwY1x1Yjg1Y1x1YzZiMA0KLXJlbGF0ZWRFbGVtZW50c1RleHQ9XHVhZDAwXHViODI4IFx1YzY5NFx1YzE4Yw0KLXJlbGF0aW9uc2hpcHNUZXh0PVx1YWQwMFx1YWNjNA0KLXJlcG9ydHNUZXh0PVx1YmNmNFx1YWNlMFx1YzExYw0KLXJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQ9XHVkNDVjXHVjMmRjIFx1YzYzNVx1YzE1OA0KLXJlc3BvbnNpYmxlVGV4dD1cdWNjNDVcdWM3ODRcdWM3NzQgXHVjNzg4XHVjNzRjDQotcmVzcG9uc2libGVGb3JUZXh0PVx1Y2M0NVx1Yzc4NCBcdWMwYWNcdWQ1NmQ6DQotcmV1c2FibGVBc3NldHNUZXh0PVx1YzdhY1x1YzBhY1x1YzZhOVx1YWMwMFx1YjJhNVx1ZDU1YyBcdWM3OTBcdWMwYjANCi1yb2xlVGV4dD1cdWM1ZWRcdWQ1NjANCi1yb2xlc1RleHQ9XHVjNWVkXHVkNTYwDQotcm9sZVNldHNUZXh0PVx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjgNCi1za2lsbHNUZXh0PVx1YzJhNFx1ZDBhYw0KLXN0YWZmaW5nVGV4dD1cdWM3NzhcdWI4MjUgXHVhZDZjXHVjMTMxDQotc3RlcHNUZXh0PVx1YjJlOFx1YWNjNA0KLXN1YmNhdGVnb3JpZXNUZXh0PVx1YzExY1x1YmUwY1x1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYw0KLXN1YmRvbWFpbnNUZXh0PVx1YzExY1x1YmUwYyBcdWIzYzRcdWJhNTRcdWM3NzgNCi1zdWJQcmFjdGljZXNUZXh0PVx1ZDU1OFx1YzcwNCBcdWMyZTRcdWQ1ODkNCi1zdXBlclRlYW1UZXh0PVx1YzBjMVx1YzcwNCBcdWQzMDAgXHVkNTA0XHViODVjXHVkMzBjXHVjNzdjDQotc3VwcG9ydGluZ01hdGVyaWFsc1RleHQ9XHVjOWMwXHVjNmQwIFx1Yzc5MFx1YjhjYw0KLXN1YnRlYW1zVGV4dD1cdWQ1NThcdWM3MDQgXHVkMzAwIFx1ZDUwNFx1Yjg1Y1x1ZDMwY1x1Yzc3Yw0KLXN5bm9ueW1zVGV4dD1cdWIzZDlcdWM3NThcdWM1YjQNCi10YWlsb3JpbmdUZXh0PVx1Yzg3MFx1YzgxNQ0KLXRhc2tUZXh0PVx1ZDBjMFx1YzJhNFx1ZDA2Yw0KLXRhc2tzVGV4dD1cdWQwYzBcdWMyYTRcdWQwNmMNCi10YnNUZXh0PVx1ZDMwMCBcdWQ1NjBcdWIyZjkNCi10ZWFtUHJvZmlsZVRleHQ9XHVkMzAwIFx1ZDUwNFx1Yjg1Y1x1ZDMwY1x1Yzc3Yw0KLXRlYW1Sb2xlc1RleHQ9XHVkMzAwIFx1ZDUwNFx1Yjg1Y1x1ZDMwY1x1Yzc3YyBcdWM1ZWRcdWQ1NjANCi10ZWNobmlxdWVzVGV4dD1cdWFjMDBcdWM3NzRcdWI0ZGNcdWI3N2NcdWM3NzgNCi10ZW1wbGF0ZUZpbGVzVGV4dD1cdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjggXHVkMzBjXHVjNzdjDQotdGVtcGxhdGVzVGV4dD1cdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjgNCi10b29sTWVudG9yc1RleHQ9XHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDANCi10b29sVGV4dD1cdWIzYzRcdWFkNmMNCi11c2FnZVRleHQ9XHVjMGFjXHVjNmE5DQotd2JzVGV4dD1cdWM3OTFcdWM1YzVcdWJkODRcdWI5NThcdWNjYjRcdWFjYzQoV0JTKQ0KLXdoaXRlcGFwZXJzVGV4dD1cdWJjMzFcdWMxMWMNCi13b3JrUHJvZHVjdHNUZXh0PVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi13b3JrUHJvZHVjdFR5cGVzVGV4dD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1YzcyMFx1ZDYxNQ0KLXdwYnNUZXh0PVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjMGFjXHVjNmE5XHViYzk1DQotd29ya0JyZWFrZG93blRleHQ9XHVjNzkxXHVjNWM1XHViZDg0XHViOTU4DQotd29ya2Zsb3dUZXh0PVx1YzZjY1x1ZDA2Y1x1ZDUwY1x1Yjg1Y1x1YzZiMA0KLXdvcmtQcm9kdWN0QnJlYWtkb3duVGV4dD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1Yzc5MVx1YzVjNVx1YmQ4NFx1Yjk1OA0KLXdvcmtQcm9kdWN0RGVwZW5kZW5jaWVzVGV4dD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1Yzg4NVx1YzE4ZFx1YzEzMQ0KLXRlYW1Qcm9maWxlQnJlYWtkb3duVGV4dD1cdWQzMDAgXHVjNzkxXHVjNWM1XHViZDg0XHViOTU4DQotdGVhbVN0cnVjdHVyZVRleHQ9XHVkMzAwIFx1YWQ2Y1x1Yzg3MA0KLXBhZ2VOb3RJbnN0YWxsZWRUZXh0PVx1ZDM5OFx1Yzc3NFx1YzljMFx1YWMwMCBcdWMxMjRcdWNlNThcdWI0MThcdWM5YzAgXHVjNTRhXHVjNzRjDQotZWxlbWVudERvZXNOb3RFeGlzdFRleHQ9XHVjNjk0XHVjMThjXHVhYzAwIFx1YzVjNlx1Yzc0Yw0KLWlzTm90VmFsaWRUZXh0PVx1Y2MzOFx1Yzg3MCBcdWM2OTRcdWMxOGNcdWFjMDAgXHVkNjA0XHVjN2FjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMFx1YzExYyBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0Lg0KLWVsZW1lbnRNaWdodEJlRGVsZXRlZFRleHQ9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVjNWQwXHVjMTFjIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWMwYWRcdWM4MWNcdWI0MThcdWM1YzhcdWM3NDQgXHVjMjE4XHViM2M0IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1wbGVhc2VGaXhMaW5rVGV4dD1cdWQ2MDRcdWM3YWMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1ZDY1NVx1Yzc3OFx1ZDU1OFx1YWNlMCBcdWI5YzFcdWQwNmNcdWI5N2MgXHVjMjE4XHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWluZm9BYm91dE1pc3NpbmdFbGVtZW50VGV4dD1cdWIyMDRcdWI3N2RcdWI0MWMgXHVjNjk0XHVjMThjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM4MTVcdWJjZjQ6DQotZWxlbWVudE5hbWVUZXh0PVx1YzY5NFx1YzE4YyBcdWM3NzRcdWI5ODQ6DQotZ3VpZFRleHQ9R1VJRDoNCi1taXNzaW5nRWxlbWVudFRleHQ9XHVjYzM4XHVjODcwIFx1ZDM5OFx1Yzc3NFx1YzljMFx1YWMwMCBcdWM3NzQgXHVhZDZjXHVjMTMxXHVjNWQwIFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1ub3RBdmFpbGFibGVUZXh0PVx1ZDYwNFx1YzdhYyBcdWFkNmNcdWMxMzFcdWM1ZDBcdWMxMWMgXHVjYzM4XHVjODcwIFx1ZDM5OFx1Yzc3NFx1YzljMFx1Yjk3YyBcdWMwYWNcdWM2YTlcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzc0IFx1ZDM5OFx1Yzc3NFx1YzljMFx1YjI5NCBcdWIyZTRcdWI5NzggXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1YWQ2Y1x1YzEzMVx1YzVkMFx1YzExYyBcdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTYwIFx1YzIxOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotZWxlbWVudFR5cGVUZXh0PVx1YzY5NFx1YzE4YyBcdWM3MjBcdWQ2MTU6DQotcGx1Z2luTmFtZVRleHQ9XHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4IFx1Yzc3NFx1Yjk4NDoNCi1wcmVkZWNlc3NvclRleHQ9XHVjMTIwXHVkNTg5DQotcGxhbm5pbmdEYXRhVGV4dD1QbGFubmluZ0RhdGENCi1tdWx0aXBsZU9jY3VycmVuY2VzVGV4dD1cdWIyZTRcdWM5MTEgXHViYzFjXHVjMGRkDQotZXZlbnREcml2ZW5UZXh0PVx1Yzc3NFx1YmNhNFx1ZDJiOFx1Yjg1YyBcdWFkNmNcdWIzZDlcdWI0MjgNCi1vbmdvaW5nVGV4dD1cdWM5YzRcdWQ1ODkgXHVjOTExXHVjNzg0DQotcGxhbm5lZFRleHQ9XHVhY2M0XHVkNjhkXHViNDI4DQotcmVwZWF0YWJsZVRleHQ9XHViYzE4XHViY2Y1IFx1YWMwMFx1YjJhNVx1ZDU2OA0KLXVzYWdlR3VpZGFuY2VUZXh0PVx1YzBhY1x1YzZhOVx1YmM5NSBcdWM1NDhcdWIwYjQNCi1pbnB1dHNUZXh0PVx1Yzc4NVx1YjgyNQ0KLW91dHB1dHNUZXh0PVx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLWFjdGl2aXR5RW50cnlTdGF0ZVRleHQ9XHVkNjVjXHViM2Q5IFx1YzJkY1x1Yzc5MSBcdWMwYzFcdWQwZGMNCi1hY3Rpdml0eUV4aXRTdGF0ZVRleHQ9XHVkNjVjXHViM2Q5IFx1Yzg4NVx1YjhjYyBcdWMwYzFcdWQwZGMNCi1wcmVmaXhUZXh0PVx1YzgxMVx1YjQ1MFx1YmQ4MA0KLWV4dGVybmFsSWRUZXh0PVx1YzY3OFx1YmQ4MCBJRA0KLXNjb3BlVGV4dD1cdWJjOTRcdWM3MDQNCi1yb2FkbWFwVGV4dD1cdWI4NWNcdWI0ZGNcdWI5ZjUNCi10eXBlb2ZDb250cmFjdFRleHQ9XHVhY2M0XHVjNTdkIFx1YzcyMFx1ZDYxNQ0KLXByb2plY3RDaGFyYWN0ZXJpc3RpY3NUZXh0PVx1ZDUwNFx1Yjg1Y1x1YzgxZFx1ZDJiOCBcdWQyYjlcdWMxMzENCi1wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlVGV4dD1cdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjggXHVhZDZjXHVjMTMxXHVjNmQwIFx1YzgwNFx1YmIzOCBcdWM5YzBcdWMyZGQNCi1yaXNrTGV2ZWxUZXh0PVx1YzcwNFx1ZDVkOFx1YzEzMSBcdWI4MDhcdWJjYTgNCi1zY2FsZVRleHQ9XHVjMmE0XHVjZjAwXHVjNzdjDQotdXNhZ2VOb3Rlc1RleHQ9XHVjMGFjXHVjNmE5XHViYzk1IFx1YjE3OFx1ZDJiOA0KLWNvbnRleHRUZXh0PVx1Y2VlOFx1ZDE0ZFx1YzJhNFx1ZDJiOA0KLXBhcmVudEFjdGl2aXRpZXNUZXh0PVx1YzBjMVx1YzcwNCBcdWQ2NWNcdWIzZDkNCi1pbmNsdWRlZFBhdHRlcm5zVGV4dD1cdWQzZWNcdWQ1NjhcdWI0MWMgXHVkMzI4XHVkMTM0DQotY2hlY2tsaXN0VGV4dD1cdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjgNCi1jb21tdW5pY2F0aW9uc01hdGVyaWFsc1RleHQ9XHVjZWU0XHViYmE0XHViMmM4XHVjZjAwXHVjNzc0XHVjMTU4IFx1Yzc5MFx1YjhjYw0KLWVkdWNhdGlvbk1hdGVyaWFsc1RleHQ9XHVhZDUwXHVjNzIxIFx1Yzc5MFx1YjhjYw0KLWVzdGltYXRpbmdUZWNobmlxdWVUZXh0PVx1YzYwOFx1YzBjMSBcdWFlMzBcdWJjOTUNCi1hZGRpdGlvbmFsVGV4dD1cdWNkOTRcdWFjMDANCi1tb2RpZmllc1RleHQ9XHVjMjE4XHVjODE1DQotYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0PVx1Y2Q5NFx1YWMwMCBcdWMyMThcdWQ1ODkNCi1pbmRleFRleHQ9XHVjMGM5XHVjNzc4DQotcHJlZml4VGV4dD1cdWM4MTFcdWI0NTBcdWJkODANCi1icmVha2Rvd25FbGVtZW50VGV4dD1cdWM3OTFcdWM1YzVcdWJkODRcdWI5NTggXHVjNjk0XHVjMThjKEJyZWFrZG93biBFbGVtZW50KQ0KLXN0ZXBzVGV4dD1cdWIyZThcdWFjYzQNCi1wcmVkZWNlc3NvcnNUZXh0PVx1YzEyMFx1ZDU4OQ0KLXJlcGVhdGFibGVUZXh0PVx1YmMxOFx1YmNmNSBcdWFjMDBcdWIyYTVcdWQ1NjgNCi10eXBlVGV4dD1cdWM3MjBcdWQ2MTUNCi1vbmdvaW5nVGV4dD1cdWM5YzRcdWQ1ODkgXHVjOTExXHVjNzg0DQotZXZlbnREcml2ZW5UZXh0PVx1Yzc3NFx1YmNhNFx1ZDJiOFx1Yjg1YyBcdWFkNmNcdWIzZDlcdWI0MjgNCi1tb2RlbEluZm9UZXh0PVx1YmFhOFx1YjM3OCBcdWM4MTVcdWJjZjQNCi1lbnRyeVN0YXRlVGV4dD1cdWMyZGNcdWM3OTEgXHVjMGMxXHVkMGRjDQotZXhpdFN0YXRlVGV4dD1cdWM4ODVcdWI4Y2MgXHVjMGMxXHVkMGRjDQotdGVhbVRleHQ9XHVkMzAwDQotcGFyZW50UGFja2FnZVRleHQ9XHVjMGMxXHVjNzA0IFx1ZDMyOFx1ZDBhNFx1YzljMA0KLWNvbnRhaW5lZFBhY2thZ2VzVGV4dD1cdWQzZWNcdWQ1NjhcdWI0MWMgXHVkMzI4XHVkMGE0XHVjOWMwDQotY29udGVudHNUZXh0PVx1Y2VlOFx1ZDE1MFx1Y2UyMA0KLWJhc2VkT25NZXRob2RSb2xlVGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNWVkXHVkNTYwXHVjNzQ0IFx1YWUzMFx1Y2QwOFx1Yjg1YyBcdWQ1NjgNCi1iYXNlZE9uTWV0aG9kVGFza1RleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1Yjk3YyBcdWFlMzBcdWNkMDhcdWI4NWMgXHVkNTY4DQotYmFzZWRPbk1ldGhvZFdvcmtQcm9kdWN0VGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzY1x1Yzc0NCBcdWFlMzBcdWNkMDhcdWI4NWMgXHVkNTY4DQotc3VtbWFyeVRleHQ9XHVjNjk0XHVjNTdkDQotcGVyZm9ybXNUZXh0PVx1YzIxOFx1ZDU4OVx1ZDU2OA0KLXJlcGxhY2VzVGV4dD1cdWJjMTRcdWFmYjhcdWFlMzANCi1jb250cmlidXRlc1RleHQ9XHVjZWU4XHVkMmI4XHViOWFjXHViZGYwXHVjMTU4DQotbm9uZVRleHQ9XHVjNWM2XHVjNzRjDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zVGV4dD1cdWM2MDhcdWMwYzEgXHVhY2UwXHViODI0XHVjMGFjXHVkNTZkDQotYWN0aXZpdHlSZWZlcmVuY2VzVGV4dD1cdWQ2NWNcdWIzZDkgXHVjYzM4XHVjODcwDQotbmFtZVRleHQ9XHVjNzc0XHViOTg0DQotcHJlc2VudGF0aW9uTmFtZVRleHQ9XHVkNDVjXHVjMmRjIFx1Yzc3NFx1Yjk4NA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ODRjMGUyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLWFkZGl0aW9uYWxJbmZvVGV4dD1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgQWRpY2lvbmFpcw0KLWFkZGl0aW9uYWxQZXJmb3JtZXJUZXh0PUV4ZWN1dG9yZXMgQWRpY2lvbmFpcw0KLWFnZ3JlZ2F0ZXNUZXh0PUFncmVnYWRvcw0KLWFsdGVybmF0aXZlc1RleHQ9QWx0ZXJuYXRpdmFzDQotYXBwbGljYXRpb25UZXh0PUFwbGljYXRpdm8NCi1hcnRpZmFjdFRleHQ9QXJ0ZWZhdG8NCi1hc3NldHNUZXh0PUF0aXZvcw0KLWFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dD1BYm9yZGFnZW5zIGRhIERlc2lnbmFcdTAwZTdcdTAwZTNvDQotYXNzaXN0aW5nVGV4dD1Bc3Npc3RlbnRlDQotYmFja2dyb3VuZFRleHQ9SW5mb3JtYVx1MDBlN1x1MDBmNWVzIERldGFsaGFkYXMNCi1icmllZk91dGxpbmVUZXh0PUJyZXZlIFJlc3Vtbw0KLWNoZWNrSXRlbXNUZXh0PUl0ZW5zIGRlIFZlcmlmaWNhXHUwMGU3XHUwMGUzbw0KLWNoZWNrbGlzdHNUZXh0PUxpc3RhcyBkZSBWZXJpZmljYVx1MDBlN1x1MDBlM28NCi1jb2xsYXBzZUFsbFRleHQ9UmVkdXppciBUb2RvcyBvcyBJdGVucyBkZSBWZXJpZmljYVx1MDBlN1x1MDBlM28NCi1jb21wb3NpdGVSb2xlVGV4dD1GdW5cdTAwZTdcdTAwZTNvIGRlIENvbXBvc2lcdTAwZTdcdTAwZTNvDQotY29uY2VwdHNUZXh0PUNvbmNlaXRvcw0KLWNvbnRhaW5lZEFydGlmYWN0c1RleHQ9QXJ0ZWZhdG8gQ29udGlkbw0KLWNvbnRhaW5lckFydGlmYWN0VGV4dD1BcnRlZmF0byBkbyBDb250XHUwMGVhaW5lcg0KLWNvbnRlbnRFbGVtZW50c1RleHQ9RWxlbWVudG9zIENhdGVnb3JpemFkb3MNCi1jb250ZW50UmVmZXJlbmNlc1RleHQ9UmVmZXJcdTAwZWFuY2lhcyBkZSBDb250ZVx1MDBmYWRvDQotZGVsaXZlcmFibGVUZXh0PURpc3RyaWJ1XHUwMGVkdmVsDQotZGVsaXZlcmFibGVQcm9wZXJ0aWVzVGV4dD1Qcm9wcmllZGFkZXMgRGlzdHJpYnVcdTAwZWR2ZWlzDQotZGVsaXZlcmVkUGFydHNUZXh0PVBhcnRlcyBEaXN0cmlidVx1MDBlZHZlaXMNCi1kZWxpdmVyZWRXb3JrUHJvZHVjdHNUZXh0PVByb2R1dG9zIGRlIFRyYWJhbGhvIEVudHJlZ3Vlcw0KLWRlcGVuZGVudFRleHQ9UHJvZHV0b3MgZGUgVHJhYmFsaG8gRGVwZW5kZW50ZXMNCi1kZXNjcmlwdGlvblRleHQ9RGVzY3JpXHUwMGU3XHUwMGUzbw0KLWRpc2NpcGxpbmVUZXh0PURpc2NpcGxpbmENCi1kaXNjaXBsaW5lc1RleHQ9RGlzY2lwbGluYXMNCi1zdWJkaXNjaXBsaW5lc1RleHQ9U3ViZGlzY2lwbGluYXMNCi1kb21haW5UZXh0PURvbVx1MDBlZG5pbw0KLWRvbWFpbnNUZXh0PURvbVx1MDBlZG5pb3MNCi1leGFtcGxlc1RleHQ9RXhlbXBsb3MNCi1leHBhbmRBbGxUZXh0PUV4cGFuZGlyIFRvZG9zIG9zIEl0ZW5zIGRlIFZlcmlmaWNhXHUwMGU3XHUwMGUzbw0KLWV4dGVuZHNUZXh0PUV4dGVuc1x1MDBmNWVzDQotZXh0ZXJuYWxUZXh0PUV4dGVybm8NCi1leHRlcm5hbERlc2NyaXB0aW9uVGV4dD1EZXNjcmlcdTAwZTdcdTAwZTNvIEV4dGVybmENCi1nb2Fsc1RleHQ9TWV0YXMNCi1ndWlkZWxpbmVzVGV4dD1EaXJldHJpemVzDQotaWxsdXN0cmF0aW9uc1RleHQ9SWx1c3RyYVx1MDBlN1x1MDBmNWVzCQ0KLWltcGFjdE9mTm90SGF2aW5nVGV4dD1JbXBhY3RvIGRlIG5cdTAwZTNvIHRlcg0KLWltcGFjdGluZ1RleHQ9UHJvZHV0b3MgZGUgVHJhYmFsaG8gSW1wYWN0YW50ZXMNCi1pbnB1dHNUZXh0PUVudHJhZGFzDQotaW5wdXRUb1RleHQ9RW50cmFkYSBwYXJhDQotaXRlbXNUZXh0PUl0ZW5zDQota2V5Q29uc2lkZXJhdGlvbnNUZXh0PUNvbnNpZGVyYVx1MDBlN1x1MDBmNWVzIGRlIFRlY2xhcw0KLWxldmVsc09mQWRvcHRpb25UZXh0PU5cdTAwZWR2ZWlzIGRlIEFkb1x1MDBlN1x1MDBlM28NCi1tYW5kYXRvcnlUZXh0PU9icmlnYXRcdTAwZjNyaW8NCi1tYWluVGV4dD1QcmluY2lwYWwNCi1tYWluRGVzY3JpcHRpb25UZXh0PURlc2NyaVx1MDBlN1x1MDBlM28gUHJpbmNpcGFsDQotbWFpblJlc3BvbnNpYmxlVGV4dD1SZXNwb25zXHUwMGUxdmVsIFByaW5jaXBhbA0KLW1ldGhvZFRleHQ9TVx1MDBlOXRvZG8gZG8gUHJvZHV0byBkZSBUcmFiYWxobw0KLW1vZGlmaWVkQnlUZXh0PU1vZGlmaWNhZG8gUG9yDQotbW9yZUluZm9UZXh0PUluZm9ybWFcdTAwZTdcdTAwZjVlcyBBZGljaW9uYWlzDQotbm90YXRpb25UZXh0PU5vdGFcdTAwZTdcdTAwZTNvDQotb3B0aW9uYWxUZXh0PU9wY2lvbmFsDQotb3V0Y29tZVRleHQ9UmVzdWx0YWRvDQotb3V0cHV0RnJvbVRleHQ9U2FcdTAwZWRkYSBkZQ0KLW91dHB1dHNUZXh0PVNhXHUwMGVkZGFzDQotcGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dD1JbnN0cnVcdTAwZTdcdTAwZjVlcyBkZSBFbWJhbGFnZW0NCi1wYWNrYWdpbmdHdWlkYW5jZVRleHQ9T3JpZW50YVx1MDBlN1x1MDBlM28gZGUgUGFjb3RlDQotcGVyZm9ybWluZ1JvbGVzVGV4dD1EZXNlbXBlbmhhbmRvIEZ1blx1MDBlN1x1MDBmNWVzDQotcHJpbWFyeVBlcmZvcm1lclRleHQ9RXhlY3V0b3IgUHJpbVx1MDBlMXJpbw0KLXByb2JsZW1UZXh0PVByb2JsZW1hDQotcHJvcGVydGllc1RleHQ9UHJvcHJpZWRhZGVzDQotcHVycG9zZVRleHQ9T2JqZXRpdm8NCi1yZWFzb25zRm9yTm90TmVlZGluZ1RleHQ9TW90aXZvcyBQYXJhIE5cdTAwZTNvIFByZWNpc2FyDQotcmVmZXJlbmNlV29ya2Zsb3dzVGV4dD1GbHV4b3MgZGUgVHJhYmFsaG8gZGUgUmVmZXJcdTAwZWFuY2lhDQotcmVsYXRlZEVsZW1lbnRzVGV4dD1FbGVtZW50b3MgUmVsYWNpb25hZG9zDQotcmVsYXRpb25zaGlwc1RleHQ9UmVsYWNpb25hbWVudG9zDQotcmVwb3J0c1RleHQ9UmVsYXRcdTAwZjNyaW9zDQotcmVwcmVzZW50YXRpb25PcHRpb25zVGV4dD1PcFx1MDBlN1x1MDBmNWVzIGRlIFJlcHJlc2VudGFcdTAwZTdcdTAwZTNvDQotcmVzcG9uc2libGVUZXh0PVJlc3BvbnNcdTAwZTF2ZWwNCi1yZXNwb25zaWJsZUZvclRleHQ9UmVzcG9uc1x1MDBlMXZlbCBwb3INCi1yZXVzYWJsZUFzc2V0c1RleHQ9UmVjdXJzb3MgUmV1dGlsaXpcdTAwZTF2ZWlzDQotcm9sZVRleHQ9RnVuXHUwMGU3XHUwMGUzbw0KLXJvbGVzVGV4dD1GdW5cdTAwZTdcdTAwZjVlcw0KLXJvbGVTZXRzVGV4dD1Db25qdW50b3MgZGUgRnVuXHUwMGU3XHUwMGY1ZXMNCi1za2lsbHNUZXh0PUhhYmlsaWRhZGVzDQotc3RhZmZpbmdUZXh0PUNyaWFcdTAwZTdcdTAwZTNvIGRhIEVxdWlwZQ0KLXN0ZXBzVGV4dD1FdGFwYXMNCi1zdWJjYXRlZ29yaWVzVGV4dD1TdWJjYXRlZ29yaWFzDQotc3ViZG9tYWluc1RleHQ9U3ViZG9tXHUwMGVkbmlvcw0KLXN1YlByYWN0aWNlc1RleHQ9U3VicHJcdTAwZTF0aWNhcw0KLXN1cGVyVGVhbVRleHQ9UGVyZmlsIGRhIFN1cGVyIEVxdWlwZQ0KLXN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0PU1hdGVyaWFpcyBkZSBTdXBvcnRlDQotc3VidGVhbXNUZXh0PVBlcmZpcyBkYXMgU3ViLWVxdWlwZXMNCi1zeW5vbnltc1RleHQ9U2luXHUwMGY0bmltb3MNCi10YWlsb3JpbmdUZXh0PUFkYXB0YVx1MDBlN1x1MDBlM28NCi10YXNrVGV4dD1UYXJlZmENCi10YXNrc1RleHQ9VGFyZWZhcw0KLXRic1RleHQ9QWxvY2FcdTAwZTdcdTAwZTNvIGRlIEVxdWlwZQ0KLXRlYW1Qcm9maWxlVGV4dD1QZXJmaWwgZGEgRXF1aXBlDQotdGVhbVJvbGVzVGV4dD1GdW5cdTAwZTdcdTAwZjVlcyBkbyBQZXJmaWwgZGEgRXF1aXBlDQotdGVjaG5pcXVlc1RleHQ9RGlyZXRyaXplcw0KLXRlbXBsYXRlRmlsZXNUZXh0PUFycXVpdm9zIGRlIEdhYmFyaXRvDQotdGVtcGxhdGVzVGV4dD1HYWJhcml0b3MNCi10b29sTWVudG9yc1RleHQ9TWVudG9yZXMgZGUgRmVycmFtZW50YXMNCi10b29sVGV4dD1GZXJyYW1lbnRhDQotdXNhZ2VUZXh0PVVzbw0KLXdic1RleHQ9RXN0cnV0dXJhIGRlIERlY29tcG9zaVx1MDBlN1x1MDBlM28gZGUgVHJhYmFsaG8NCi13aGl0ZXBhcGVyc1RleHQ9V2hpdGUgcGFwZXJzDQotd29ya1Byb2R1Y3RzVGV4dD1Qcm9kdXRvcyAgICAgICAgICAgZGUgVHJhYmFsaG8NCi13b3JrUHJvZHVjdFR5cGVzVGV4dD1UaXBvcyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotd3Bic1RleHQ9VXNvIGRlIFByb2R1dG8gZGUgVHJhYmFsaG8NCi13b3JrQnJlYWtkb3duVGV4dD1JbnRlcnJ1cFx1MDBlN1x1MDBlM28gZG8gVHJhYmFsaG8NCi13b3JrZmxvd1RleHQ9RGV0YWxoZSBkbyBGbHV4byBkZSBUcmFiYWxobzoNCi13b3JrUHJvZHVjdEJyZWFrZG93blRleHQ9SW50ZXJydXBcdTAwZTdcdTAwZTNvIGRvIFByb2R1dG8gZGUgVHJhYmFsaG8NCi13b3JrUHJvZHVjdERlcGVuZGVuY2llc1RleHQ9RGVwZW5kXHUwMGVhbmNpYXMgZG8gUHJvZHV0byBkZSBUcmFiYWxobw0KLXRlYW1Qcm9maWxlQnJlYWtkb3duVGV4dD1JbnRlcnJ1cFx1MDBlN1x1MDBlM28gZGUgRXF1aXBlDQotdGVhbVN0cnVjdHVyZVRleHQ9RXN0cnV0dXJhIGRhIEVxdWlwZQ0KLXBhZ2VOb3RJbnN0YWxsZWRUZXh0PVBcdTAwZTFnaW5hIE5cdTAwZTNvIEluc3RhbGFkYQ0KLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PUVsZW1lbnRvIE5cdTAwZTNvIEV4aXN0ZQ0KLWlzTm90VmFsaWRUZXh0PU8gZWxlbWVudG8gcmVmZXJlbmNpYWRvIG5cdTAwZTNvIFx1MDBlOSB1bSBlbGVtZW50byB2XHUwMGUxbGlkbyBuYSBiaWJsaW90ZWNhIGF0dWFsLg0KLWVsZW1lbnRNaWdodEJlRGVsZXRlZFRleHQ9TyBlbGVtZW50byBwb2RlIHRlciBzaWRvIGV4Y2x1XHUwMGVkZG8gZGEgYmlibGlvdGVjYS4NCi1wbGVhc2VGaXhMaW5rVGV4dD1WZXJpZmlxdWUgc3VhIGJpYmxpb3RlY2EgZGUgY29udGVcdTAwZmFkbyBlIGNvcnJpamEgbyBsaW5rLg0KLWluZm9BYm91dE1pc3NpbmdFbGVtZW50VGV4dD1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgc29icmUgbyBlbGVtZW50byBhdXNlbnRlOg0KLWVsZW1lbnROYW1lVGV4dD1Ob21lIGRvIEVsZW1lbnRvOg0KLWd1aWRUZXh0PUdVSUQ6DQotbWlzc2luZ0VsZW1lbnRUZXh0PUEgcFx1MDBlMWdpbmEgcmVmZXJlbmNpYWRhIG5cdTAwZTNvIGVzdFx1MDBlMSBuZXN0YSBjb25maWd1cmFcdTAwZTdcdTAwZTNvDQotbm90QXZhaWxhYmxlVGV4dD1BIHBcdTAwZTFnaW5hIHJlZmVyZW5jaWFkYSBuXHUwMGUzbyBlc3RcdTAwZTEgZGlzcG9uXHUwMGVkdmVsIG5hIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gYXR1YWwuIEVzdGEgcFx1MDBlMWdpbmEgcG9kZSBlc3RhciBkaXNwb25cdTAwZWR2ZWwgZW0gb3V0cmEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkbyBwcm9jZXNzby4NCi1lbGVtZW50VHlwZVRleHQ9VGlwbyBkZSBFbGVtZW50bzoNCi1wbHVnaW5OYW1lVGV4dD1Ob21lIGRvIFBsdWctaW46DQotcHJlZGVjZXNzb3JUZXh0PVByZWRlY2Vzc29yDQotcGxhbm5pbmdEYXRhVGV4dD1QbGFubmluZ0RhdGENCi1tdWx0aXBsZU9jY3VycmVuY2VzVGV4dD1NXHUwMGZhbHRpcGxhcyBPY29yclx1MDBlYW5jaWFzDQotZXZlbnREcml2ZW5UZXh0PU9yaWVudGFkbyBwb3IgRXZlbnRvDQotb25nb2luZ1RleHQ9RW0gQW5kYW1lbnRvDQotcGxhbm5lZFRleHQ9UGxhbmVqYWRvDQotcmVwZWF0YWJsZVRleHQ9UmVwZXRcdTAwZWR2ZWwNCi11c2FnZUd1aWRhbmNlVGV4dD1PcmllbnRhXHUwMGU3XHUwMGUzbyBkZSBVc28NCi1pbnB1dHNUZXh0PUVudHJhZGFzDQotb3V0cHV0c1RleHQ9U2FcdTAwZWRkYXMNCi1hY3Rpdml0eUVudHJ5U3RhdGVUZXh0PUVzdGFkbyBkZSBFbnRyYWRhIGRhIEF0aXZpZGFkZQ0KLWFjdGl2aXR5RXhpdFN0YXRlVGV4dD1Fc3RhZG8gZGUgU2FcdTAwZWRkYSBkYSBBdGl2aWRhZGUNCi1wcmVmaXhUZXh0PVByZWZpeG8NCi1leHRlcm5hbElkVGV4dD1JRCBleHRlcm5vDQotc2NvcGVUZXh0PUVzY29wbw0KLXJvYWRtYXBUZXh0PVJvdGVpcm8NCi10eXBlb2ZDb250cmFjdFRleHQ9VGlwbyBkZSBDb250cmF0bw0KLXByb2plY3RDaGFyYWN0ZXJpc3RpY3NUZXh0PUNhcmFjdGVyXHUwMGVkc3RpY2FzIGRvIFByb2pldG8NCi1wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlVGV4dD1Db25oZWNpbWVudG8gZG8gTWVtYnJvIGRvIFByb2pldG8NCi1yaXNrTGV2ZWxUZXh0PU5cdTAwZWR2ZWwgZGUgUmlzY28NCi1zY2FsZVRleHQ9RXNjYWxhDQotdXNhZ2VOb3Rlc1RleHQ9Tm90YXMgZGUgVXNvDQotY29udGV4dFRleHQ9Q29udGV4dG8NCi1wYXJlbnRBY3Rpdml0aWVzVGV4dD1BdGl2aWRhZGVzIFBhaQ0KLWluY2x1ZGVkUGF0dGVybnNUZXh0PVBhZHJcdTAwZTNvIEluY2x1XHUwMGVkZG8NCi1jaGVja2xpc3RUZXh0PUxpc3RhIGRlIFZlcmlmaWNhXHUwMGU3XHUwMGUzbw0KLWNvbW11bmljYXRpb25zTWF0ZXJpYWxzVGV4dD1NYXRlcmlhaXMgZGUgQ29tdW5pY2FcdTAwZTdcdTAwZjVlcw0KLWVkdWNhdGlvbk1hdGVyaWFsc1RleHQ9TWF0ZXJpYWlzIGRlIEVkdWNhXHUwMGU3XHUwMGUzbw0KLWVzdGltYXRpbmdUZWNobmlxdWVUZXh0PVRcdTAwZTljbmljYSBkZSBFc3RpbWF0aXZhDQotYWRkaXRpb25hbFRleHQ9QWRpY2lvbmFsDQotbW9kaWZpZXNUZXh0PU1vZGlmaWNhDQotYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0PUFkaWNpb25hbG1lbnRlIERlc2VtcGVuaGENCi1pbmRleFRleHQ9XHUwMGNkbmRpY2UNCi1wcmVmaXhUZXh0PVByZWZpeG8NCi1icmVha2Rvd25FbGVtZW50VGV4dD1FbGVtZW50byBkZSBEaXZpc1x1MDBlM28NCi1zdGVwc1RleHQ9RXRhcGFzDQotcHJlZGVjZXNzb3JzVGV4dD1QcmVkZWNlc3NvcmVzDQotcmVwZWF0YWJsZVRleHQ9UmVwZXRcdTAwZWR2ZWwNCi10eXBlVGV4dD1UaXBvDQotb25nb2luZ1RleHQ9RW0gQW5kYW1lbnRvDQotZXZlbnREcml2ZW5UZXh0PU9yaWVudGFkbyBhIEV2ZW50bw0KLW1vZGVsSW5mb1RleHQ9SW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRvIE1vZGVsbw0KLWVudHJ5U3RhdGVUZXh0PUVzdGFkbyBkZSBFbnRyYWRhDQotZXhpdFN0YXRlVGV4dD1Fc3RhZG8gZGUgU2FcdTAwZWRkYQ0KLXRlYW1UZXh0PUVxdWlwZQ0KLXBhcmVudFBhY2thZ2VUZXh0PVBhY290ZSBQYWkNCi1jb250YWluZWRQYWNrYWdlc1RleHQ9UGFjb3RlcyBJbmNsdVx1MDBlZGRvcw0KLWNvbnRlbnRzVGV4dD1Db250ZVx1MDBmYWRvDQotYmFzZWRPbk1ldGhvZFJvbGVUZXh0PUJhc2VhZG8gZW0gRnVuXHUwMGU3XHUwMGUzbyBkZSBNXHUwMGU5dG9kbw0KLWJhc2VkT25NZXRob2RUYXNrVGV4dD1CYXNlYWRvIGVtIFRhcmVmYSBkZSBNXHUwMGU5dG9kbw0KLWJhc2VkT25NZXRob2RXb3JrUHJvZHVjdFRleHQ9QmFzZWFkbyBubyBNXHUwMGU5dG9kbyBkbyBQcm9kdXRvIGRlIFRyYWJhbGhvDQotc3VtbWFyeVRleHQ9UmVzdW1vDQotcGVyZm9ybXNUZXh0PURlc2VtcGVuaGENCi1yZXBsYWNlc1RleHQ9U3Vic3RpdHVpDQotY29udHJpYnV0ZXNUZXh0PUNvbnRyaWJ1aQ0KLW5vbmVUZXh0PU5lbmh1bQ0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQ9Q29uc2lkZXJhXHUwMGU3XHUwMGY1ZXMgRXN0aW1hdGl2YXMNCi1hY3Rpdml0eVJlZmVyZW5jZXNUZXh0PVJlZmVyXHUwMGVhbmNpYXMgZGUgQXRpdmlkYWRlDQotbmFtZVRleHQ9Tm9tZQ0KLXByZXNlbnRhdGlvbk5hbWVUZXh0PU5vbWUgZGEgYXByZXNlbnRhXHUwMGU3XHUwMGUzbw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDI0ZmE5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLWFkZGl0aW9uYWxJbmZvVGV4dD1cdTUxNzZcdTRlZDZcdTRmZTFcdTYwNmYNCi1hZGRpdGlvbmFsUGVyZm9ybWVyVGV4dD1cdTUxNzZcdTRlZDZcdTYyNjdcdTg4NGNcdTgwMDUNCi1hZ2dyZWdhdGVzVGV4dD1cdTgwNWFcdTk2YzYNCi1hbHRlcm5hdGl2ZXNUZXh0PVx1NjZmZlx1NGVlM1x1NjViOVx1Njg0OA0KLWFwcGxpY2F0aW9uVGV4dD1cdTVlOTRcdTc1MjhcdTdhMGJcdTVlOGYNCi1hcnRpZmFjdFRleHQ9XHU1ZGU1XHU0ZWY2DQotYXNzZXRzVGV4dD1cdThkNDRcdTRlYTcNCi1hc3NpZ25tZW50QXBwcm9hY2hlc1RleHQ9XHU1MjA2XHU5MTRkXHU2NWI5XHU2Y2Q1DQotYXNzaXN0aW5nVGV4dD1cdThmODVcdTUyYTkNCi1iYWNrZ3JvdW5kVGV4dD1cdTgwY2NcdTY2NmYNCi1icmllZk91dGxpbmVUZXh0PVx1N2I4MFx1OGZmMA0KLWNoZWNrSXRlbXNUZXh0PVx1NjhjMFx1NjdlNVx1OTg3OQ0KLWNoZWNrbGlzdHNUZXh0PVx1NjgzOFx1NWJmOVx1ODg2OA0KLWNvbGxhcHNlQWxsVGV4dD1cdTYyOThcdTUzZTBcdTYyNDBcdTY3MDlcdTY4YzBcdTY3ZTVcdTk4NzkNCi1jb21wb3NpdGVSb2xlVGV4dD1cdTdlYzRcdTU0MDhcdTg5ZDJcdTgyNzINCi1jb25jZXB0c1RleHQ9XHU2OTgyXHU1ZmY1DQotY29udGFpbmVkQXJ0aWZhY3RzVGV4dD1cdTUzMDVcdTU0MmJcdTc2ODRcdTVkZTVcdTRlZjYNCi1jb250YWluZXJBcnRpZmFjdFRleHQ9XHU1YmI5XHU1NjY4XHU1ZGU1XHU0ZWY2DQotY29udGVudEVsZW1lbnRzVGV4dD1cdTUyMDZcdTdjN2JcdTUxNDNcdTdkMjANCi1jb250ZW50UmVmZXJlbmNlc1RleHQ9XHU1MTg1XHU1YmI5XHU1ZjE1XHU3NTI4DQotZGVsaXZlcmFibGVUZXh0PVx1NTNlZlx1NGVhNFx1NGVkOFx1NGVmNg0KLWRlbGl2ZXJhYmxlUHJvcGVydGllc1RleHQ9XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHU1YzVlXHU2MDI3DQotZGVsaXZlcmVkUGFydHNUZXh0PVx1NTNlZlx1NGVhNFx1NGVkOFx1OTBlOFx1NGVmNg0KLWRlbGl2ZXJlZFdvcmtQcm9kdWN0c1RleHQ9XHU0ZWE0XHU0ZWQ4XHU3Njg0XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotZGVwZW5kZW50VGV4dD1cdTRmOWRcdThkNTZcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzENCi1kZXNjcmlwdGlvblRleHQ9XHU2M2NmXHU4ZmYwDQotZGlzY2lwbGluZVRleHQ9XHU4OWM0XHU3YTBiDQotZGlzY2lwbGluZXNUZXh0PVx1ODljNFx1N2EwYg0KLXN1YmRpc2NpcGxpbmVzVGV4dD1cdTViNTBcdTg5YzRcdTdhMGINCi1kb21haW5UZXh0PVx1NTdkZg0KLWRvbWFpbnNUZXh0PVx1NTdkZg0KLWV4YW1wbGVzVGV4dD1cdTc5M2FcdTRmOGINCi1leHBhbmRBbGxUZXh0PVx1NWM1NVx1NWYwMFx1NjI0MFx1NjcwOVx1NjhjMFx1NjdlNVx1OTg3OQ0KLWV4dGVuZHNUZXh0PVx1NjI2OVx1NWM1NQ0KLWV4dGVybmFsVGV4dD1cdTU5MTZcdTkwZTgNCi1leHRlcm5hbERlc2NyaXB0aW9uVGV4dD1cdTU5MTZcdTkwZThcdTYzY2ZcdThmZjANCi1nb2Fsc1RleHQ9XHU3NmVlXHU2ODA3DQotZ3VpZGVsaW5lc1RleHQ9XHU2MzA3XHU1MzU3DQotaWxsdXN0cmF0aW9uc1RleHQ9XHU1NmZlXHU3OTNhDQotaW1wYWN0T2ZOb3RIYXZpbmdUZXh0PVx1NGUwZFx1NTE3N1x1NjcwOVx1NzY4NFx1NWY3MVx1NTRjZA0KLWltcGFjdGluZ1RleHQ9XHU0ZWE3XHU3NTFmXHU1ZjcxXHU1NGNkXHU3Njg0XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotaW5wdXRzVGV4dD1cdThmOTNcdTUxNjUNCi1pbnB1dFRvVGV4dD1cdThmOTNcdTUxNjVcdTgxZjMNCi1pdGVtc1RleHQ9XHU5ODc5DQota2V5Q29uc2lkZXJhdGlvbnNUZXh0PVx1NTE3M1x1OTUyZVx1NmNlOFx1NjEwZlx1NGU4Ylx1OTg3OQ0KLWxldmVsc09mQWRvcHRpb25UZXh0PVx1OTFjN1x1NzUyOFx1NzY4NFx1N2VhN1x1NTIyYg0KLW1hbmRhdG9yeVRleHQ9XHU1ZmM1XHU5NzAwDQotbWFpblRleHQ9XHU0ZTNiXHU4OTgxDQotbWFpbkRlc2NyaXB0aW9uVGV4dD1cdTRlM2JcdTg5ODFcdTYzY2ZcdThmZjANCi1tYWluUmVzcG9uc2libGVUZXh0PVx1NGUzYlx1ODk4MVx1OGQyM1x1NGVmYg0KLW1ldGhvZFRleHQ9XHU2NWI5XHU2Y2Q1XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotbW9kaWZpZWRCeVRleHQ9XHU0ZmVlXHU2NTM5XHU4MDA1DQotbW9yZUluZm9UZXh0PVx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zg0KLW5vdGF0aW9uVGV4dD1cdTZjZThcdTkxY2ENCi1vcHRpb25hbFRleHQ9XHU1M2VmXHU5MDA5DQotb3V0Y29tZVRleHQ9XHU3ZWQzXHU2NzljDQotb3V0cHV0RnJvbVRleHQ9XHU4ZjkzXHU1MWZhXHU4MWVhDQotb3V0cHV0c1RleHQ9XHU4ZjkzXHU1MWZhDQotcGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dD1cdTYyNTNcdTUzMDVcdTc2ODRcdTYzMDdcdTc5M2FcdTRmZTFcdTYwNmYNCi1wYWNrYWdpbmdHdWlkYW5jZVRleHQ9XHU2MjUzXHU1MzA1XHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmDQotcGVyZm9ybWluZ1JvbGVzVGV4dD1cdTYyNjdcdTg4NGNcdTg5ZDJcdTgyNzINCi1wcmltYXJ5UGVyZm9ybWVyVGV4dD1cdTRlM2JcdTYyNjdcdTg4NGNcdTgwMDUNCi1wcm9ibGVtVGV4dD1cdTk1ZWVcdTk4OTgNCi1wcm9wZXJ0aWVzVGV4dD1cdTVjNWVcdTYwMjcNCi1wdXJwb3NlVGV4dD1cdTc1MjhcdTkwMTQNCi1yZWFzb25zRm9yTm90TmVlZGluZ1RleHQ9XHU0ZTBkXHU5NzAwXHU4OTgxXHU3Njg0XHU1MzlmXHU1NmUwDQotcmVmZXJlbmNlV29ya2Zsb3dzVGV4dD1cdTVmMTVcdTc1MjhcdTVkZTVcdTRmNWNcdTZkNDENCi1yZWxhdGVkRWxlbWVudHNUZXh0PVx1NzZmOFx1NTE3M1x1NTE0M1x1N2QyMA0KLXJlbGF0aW9uc2hpcHNUZXh0PVx1NTE3M1x1N2NmYg0KLXJlcG9ydHNUZXh0PVx1NjJhNVx1NTQ0YQ0KLXJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQ9XHU4YmY0XHU2NjBlXHU5MDA5XHU5ODc5DQotcmVzcG9uc2libGVUZXh0PVx1OGQxZlx1OGQyM1x1NGViYQ0KLXJlc3BvbnNpYmxlRm9yVGV4dD1cdThkMWZcdThkMjMNCi1yZXVzYWJsZUFzc2V0c1RleHQ9XHU1M2VmXHU5MWNkXHU3NTI4XHU4ZDQ0XHU0ZWE3DQotcm9sZVRleHQ9XHU4OWQyXHU4MjcyDQotcm9sZXNUZXh0PVx1ODlkMlx1ODI3Mg0KLXJvbGVTZXRzVGV4dD1cdTg5ZDJcdTgyNzJcdTk2YzYNCi1za2lsbHNUZXh0PVx1NjI4MFx1ODBmZA0KLXN0YWZmaW5nVGV4dD1cdTRlYmFcdTU0NThcdTkxNGRcdTU5MDcNCi1zdGVwc1RleHQ9XHU2YjY1XHU5YWE0DQotc3ViY2F0ZWdvcmllc1RleHQ9XHU1YjUwXHU3YzdiXHU1MjJiDQotc3ViZG9tYWluc1RleHQ9XHU1YjUwXHU1N2RmDQotc3ViUHJhY3RpY2VzVGV4dD1cdTViNTBcdTViOWVcdThkZjUNCi1zdXBlclRlYW1UZXh0PVx1OGQ4NVx1NTZlMlx1OTYxZlx1Njk4Mlx1ODk4MVx1NjU4N1x1NGVmNg0KLXN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0PVx1NjUyZlx1NjMwMVx1Njc1MFx1NjU5OQ0KLXN1YnRlYW1zVGV4dD1cdTViNTBcdTU2ZTJcdTk2MWZcdTY5ODJcdTg5ODFcdTY1ODdcdTRlZjYNCi1zeW5vbnltc1RleHQ9XHU1NDBjXHU0ZTQ5XHU4YmNkDQotdGFpbG9yaW5nVGV4dD1cdTViOWFcdTUyMzYNCi10YXNrVGV4dD1cdTRlZmJcdTUyYTENCi10YXNrc1RleHQ9XHU0ZWZiXHU1MmExDQotdGJzVGV4dD1cdTU2ZTJcdTk2MWZcdTUyMDZcdTkxNGQNCi10ZWFtUHJvZmlsZVRleHQ9XHU1NmUyXHU5NjFmXHU2OTgyXHU4OTgxXHU2NTg3XHU0ZWY2DQotdGVhbVJvbGVzVGV4dD1cdTU2ZTJcdTk2MWZcdTY5ODJcdTg5ODFcdTY1ODdcdTRlZjZcdTg5ZDJcdTgyNzINCi10ZWNobmlxdWVzVGV4dD1cdTYzMDdcdTUzNTcNCi10ZW1wbGF0ZUZpbGVzVGV4dD1cdTZhMjFcdTY3N2ZcdTY1ODdcdTRlZjYNCi10ZW1wbGF0ZXNUZXh0PVx1NmEyMVx1Njc3Zg0KLXRvb2xNZW50b3JzVGV4dD1cdTVkZTVcdTUxNzdcdTU0MTFcdTViZmMNCi10b29sVGV4dD1cdTVkZTVcdTUxNzcNCi11c2FnZVRleHQ9XHU0ZjdmXHU3NTI4DQotd2JzVGV4dD1cdTVkZTVcdTRmNWNcdTUyMDZcdTg5ZTNcdTdlZDNcdTY3ODQNCi13aGl0ZXBhcGVyc1RleHQ9XHU3NjdkXHU3NmFlXHU0ZTY2DQotd29ya1Byb2R1Y3RzVGV4dD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzENCi13b3JrUHJvZHVjdFR5cGVzVGV4dD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTdjN2JcdTU3OGINCi13cGJzVGV4dD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTRmN2ZcdTc1MjgNCi13b3JrQnJlYWtkb3duVGV4dD1cdTVkZTVcdTRmNWNcdTUyMDZcdTg5ZTMNCi13b3JrZmxvd1RleHQ9XHU1ZGU1XHU0ZjVjXHU2ZDQxDQotd29ya1Byb2R1Y3RCcmVha2Rvd25UZXh0PVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NTIwNlx1ODllMw0KLXdvcmtQcm9kdWN0RGVwZW5kZW5jaWVzVGV4dD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTRmOWRcdThkNTZcdTUxNzNcdTdjZmINCi10ZWFtUHJvZmlsZUJyZWFrZG93blRleHQ9XHU1NmUyXHU5NjFmXHU1MjA2XHU4OWUzDQotdGVhbVN0cnVjdHVyZVRleHQ9XHU1NmUyXHU5NjFmXHU3ZWQzXHU2Nzg0DQotcGFnZU5vdEluc3RhbGxlZFRleHQ9XHU5ODc1XHU5NzYyXHU2NzJhXHU1Yjg5XHU4OGM1DQotZWxlbWVudERvZXNOb3RFeGlzdFRleHQ9XHU1MTQzXHU3ZDIwXHU0ZTBkXHU1YjU4XHU1NzI4DQotaXNOb3RWYWxpZFRleHQ9XHU1ZjE1XHU3NTI4XHU3Njg0XHU1MTQzXHU3ZDIwXHU1NzI4XHU1ZjUzXHU1MjRkXHU1ZTkzXHU0ZTJkXHU0ZTBkXHU2NjJmXHU2NzA5XHU2NTQ4XHU1MTQzXHU3ZDIwXHUzMDAyDQotZWxlbWVudE1pZ2h0QmVEZWxldGVkVGV4dD1cdThiZTVcdTUxNDNcdTdkMjBcdTUzZWZcdTgwZmRcdTVkZjJcdTRlY2VcdTVlOTNcdTRlMmRcdTUyMjBcdTk2NjRcdTMwMDINCi1wbGVhc2VGaXhMaW5rVGV4dD1cdThiZjdcdTY4YzBcdTY3ZTVcdTUxODVcdTViYjlcdTVlOTNcdTVlNzZcdTRmZWVcdTZiNjNcdTk0ZmVcdTYzYTVcdTMwMDINCi1pbmZvQWJvdXRNaXNzaW5nRWxlbWVudFRleHQ9XHU1MTczXHU0ZThlXHU3ZjNhXHU1YzExXHU3Njg0XHU1MTQzXHU3ZDIwXHU3Njg0XHU0ZmUxXHU2MDZmXHVmZjFhDQotZWxlbWVudE5hbWVUZXh0PVx1NTE0M1x1N2QyMFx1NTQwZFx1NzlmMFx1ZmYxYQ0KLWd1aWRUZXh0PUdVSURcdWZmMWENCi1taXNzaW5nRWxlbWVudFRleHQ9XHU1ZjE1XHU3NTI4XHU3Njg0XHU5ODc1XHU5NzYyXHU0ZTBkXHU1NzI4XHU2YjY0XHU5MTRkXHU3ZjZlXHU0ZTJkDQotbm90QXZhaWxhYmxlVGV4dD1cdTVmMTVcdTc1MjhcdTc2ODRcdTk4NzVcdTk3NjJcdTU3MjhcdTVmNTNcdTUyNGRcdTkxNGRcdTdmNmVcdTRlMmRcdTRlMGRcdTUzZWZcdTc1MjhcdTMwMDJcdTZiNjRcdTk4NzVcdTk3NjJcdTU3MjhcdTUzZTZcdTRlMDBcdTZkNDFcdTdhMGJcdTkxNGRcdTdmNmVcdTRlMmRcdTUzZWZcdTgwZmRcdTUzZWZcdTc1MjhcdTMwMDINCi1lbGVtZW50VHlwZVRleHQ9XHU1MTQzXHU3ZDIwXHU3YzdiXHU1NzhiXHVmZjFhDQotcGx1Z2luTmFtZVRleHQ9XHU2M2QyXHU0ZWY2XHU1NDBkXHU3OWYwXHVmZjFhDQotcHJlZGVjZXNzb3JUZXh0PVx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYQ0KLXBsYW5uaW5nRGF0YVRleHQ9XHU4OWM0XHU1MjEyXHU2NTcwXHU2MzZlDQotbXVsdGlwbGVPY2N1cnJlbmNlc1RleHQ9XHU1OTFhXHU2YjIxXHU1MWZhXHU3M2IwDQotZXZlbnREcml2ZW5UZXh0PVx1NGU4Ylx1NGVmNlx1OWE3MVx1NTJhOA0KLW9uZ29pbmdUZXh0PVx1NmI2M1x1NTcyOFx1OGZkYlx1ODg0Yw0KLXBsYW5uZWRUZXh0PVx1NWRmMlx1ODljNFx1NTIxMg0KLXJlcGVhdGFibGVUZXh0PVx1NTNlZlx1OTFjZFx1NTkwZA0KLXVzYWdlR3VpZGFuY2VUZXh0PVx1NGY3Zlx1NzUyOFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLWlucHV0c1RleHQ9XHU4ZjkzXHU1MTY1DQotb3V0cHV0c1RleHQ9XHU4ZjkzXHU1MWZhDQotYWN0aXZpdHlFbnRyeVN0YXRlVGV4dD1cdTZkM2JcdTUyYThcdThmZGJcdTUxNjVcdTcyYjZcdTYwMDENCi1hY3Rpdml0eUV4aXRTdGF0ZVRleHQ9XHU2ZDNiXHU1MmE4XHU5MDAwXHU1MWZhXHU3MmI2XHU2MDAxDQotcHJlZml4VGV4dD1cdTUyNGRcdTdmMDANCi1leHRlcm5hbElkVGV4dD1cdTU5MTZcdTkwZThcdTY4MDdcdThiYzYNCi1zY29wZVRleHQ9XHU4MzAzXHU1NmY0DQotcm9hZG1hcFRleHQ9XHU4ZGVmXHU3ZWJmXHU1NmZlDQotdHlwZW9mQ29udHJhY3RUZXh0PVx1NTQwOFx1NTQwY1x1NzY4NFx1N2M3Ylx1NTc4Yg0KLXByb2plY3RDaGFyYWN0ZXJpc3RpY3NUZXh0PVx1OTg3OVx1NzZlZVx1NzI3OVx1NWY4MQ0KLXByb2plY3RNZW1iZXJFeHBlcnRpc2VUZXh0PVx1OTg3OVx1NzZlZVx1NjIxMFx1NTQ1OFx1NGUxM1x1OTU3Zg0KLXJpc2tMZXZlbFRleHQ9XHU5OGNlXHU5NjY5XHU3ZWE3XHU1MjJiDQotc2NhbGVUZXh0PVx1N2YyOVx1NjUzZVx1NmJkNFx1NGY4Yg0KLXVzYWdlTm90ZXNUZXh0PVx1NGY3Zlx1NzUyOFx1OGJmNFx1NjYwZQ0KLWNvbnRleHRUZXh0PVx1NzNhZlx1NTg4Mw0KLXBhcmVudEFjdGl2aXRpZXNUZXh0PVx1NzIzNlx1NGVlM1x1NmQzYlx1NTJhOA0KLWluY2x1ZGVkUGF0dGVybnNUZXh0PVx1NTMwNVx1NTQyYlx1NzY4NFx1NmEyMVx1NWYwZg0KLWNoZWNrbGlzdFRleHQ9XHU2ODM4XHU1YmY5XHU4ODY4DQotY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNUZXh0PVx1OTAxYVx1NGZlMVx1Njc1MFx1NjU5OQ0KLWVkdWNhdGlvbk1hdGVyaWFsc1RleHQ9XHU2NTU5XHU1YjY2XHU2NzUwXHU2NTk5DQotZXN0aW1hdGluZ1RlY2huaXF1ZVRleHQ9XHU0ZjMwXHU3Yjk3XHU2MjgwXHU2NzJmDQotYWRkaXRpb25hbFRleHQ9XHU1MTc2XHU0ZWQ2DQotbW9kaWZpZXNUZXh0PVx1NGZlZVx1NjUzOQ0KLWFkZGl0aW9uYWxseVBlcmZvcm1zVGV4dD1cdThmZDhcdTYyNjdcdTg4NGMNCi1pbmRleFRleHQ9XHU3ZDIyXHU1ZjE1DQotcHJlZml4VGV4dD1cdTUyNGRcdTdmMDANCi1icmVha2Rvd25FbGVtZW50VGV4dD1cdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjANCi1zdGVwc1RleHQ9XHU2YjY1XHU5YWE0DQotcHJlZGVjZXNzb3JzVGV4dD1cdTUxNDhcdTg4NGNcdTRmNWNcdTRlMWENCi1yZXBlYXRhYmxlVGV4dD1cdTUzZWZcdTkxY2RcdTU5MGQNCi10eXBlVGV4dD1cdTdjN2JcdTU3OGINCi1vbmdvaW5nVGV4dD1cdTZiNjNcdTU3MjhcdThmZGJcdTg4NGMNCi1ldmVudERyaXZlblRleHQ9XHU0ZThiXHU0ZWY2XHU5YTcxXHU1MmE4DQotbW9kZWxJbmZvVGV4dD1cdTZhMjFcdTU3OGJcdTRmZTFcdTYwNmYNCi1lbnRyeVN0YXRlVGV4dD1cdThmZGJcdTUxNjVcdTcyYjZcdTYwMDENCi1leGl0U3RhdGVUZXh0PVx1OTAwMFx1NTFmYVx1NzJiNlx1NjAwMQ0KLXRlYW1UZXh0PVx1NTZlMlx1OTYxZg0KLXBhcmVudFBhY2thZ2VUZXh0PVx1NzIzNlx1NGVlM1x1NTMwNQ0KLWNvbnRhaW5lZFBhY2thZ2VzVGV4dD1cdTUzMDVcdTU0MmJcdTc2ODRcdTUzMDUNCi1jb250ZW50c1RleHQ9XHU1MTg1XHU1YmI5DQotYmFzZWRPbk1ldGhvZFJvbGVUZXh0PVx1NTdmYVx1NGU4ZVx1NjViOVx1NmNkNVx1ODlkMlx1ODI3Mg0KLWJhc2VkT25NZXRob2RUYXNrVGV4dD1cdTU3ZmFcdTRlOGVcdTY1YjlcdTZjZDVcdTRlZmJcdTUyYTENCi1iYXNlZE9uTWV0aG9kV29ya1Byb2R1Y3RUZXh0PVx1NTdmYVx1NGU4ZVx1NjViOVx1NmNkNVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLXN1bW1hcnlUZXh0PVx1NjQ1OFx1ODk4MQ0KLXBlcmZvcm1zVGV4dD1cdTYyNjdcdTg4NGMNCi1yZXBsYWNlc1RleHQ9XHU2NmZmXHU2MzYyDQotY29udHJpYnV0ZXNUZXh0PVx1NjNkMFx1NGY5Yg0KLW5vbmVUZXh0PVx1NjVlMA0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQ9XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5DQotYWN0aXZpdHlSZWZlcmVuY2VzVGV4dD1cdTZkM2JcdTUyYThcdTVmMTVcdTc1MjgNCi1uYW1lVGV4dD1cdTU0MGRcdTc5ZjANCi1wcmVzZW50YXRpb25OYW1lVGV4dD1cdTY2M2VcdTc5M2FcdTU0MGRcdTc5ZjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3hzbC9yZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmRiOTlhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4NCi0NCi1hZGRpdGlvbmFsSW5mb1RleHQ9XHU1MTc2XHU0ZWQ2XHU4Y2M3XHU4YTBhDQotYWRkaXRpb25hbFBlcmZvcm1lclRleHQ9XHU1MTc2XHU0ZWQ2XHU1N2Y3XHU4ODRjXHU4MDA1DQotYWdncmVnYXRlc1RleHQ9XHU1ZjU5XHU3ZTNkDQotYWx0ZXJuYXRpdmVzVGV4dD1cdTY2ZmZcdTRlZTNcdTY1YjlcdTY4NDgNCi1hcHBsaWNhdGlvblRleHQ9XHU2MWM5XHU3NTI4XHU3YTBiXHU1ZjBmDQotYXJ0aWZhY3RUZXh0PVx1NjljYlx1NGVmNg0KLWFzc2V0c1RleHQ9XHU4Y2M3XHU3NTIyDQotYXNzaWdubWVudEFwcHJvYWNoZXNUZXh0PVx1NjMwN1x1NmQzZVx1NjViOVx1NmNkNQ0KLWFzc2lzdGluZ1RleHQ9XHU1MzU0XHU1MmE5DQotYmFja2dyb3VuZFRleHQ9XHU4MGNjXHU2NjZmDQotYnJpZWZPdXRsaW5lVGV4dD1cdTY5ODJcdTc1NjVcdThmMmFcdTVlZDMNCi1jaGVja0l0ZW1zVGV4dD1cdTZhYTJcdTY3ZTVcdTk4MDVcdTc2ZWUNCi1jaGVja2xpc3RzVGV4dD1cdTY4MzhcdTVjMGRcdTZlMDVcdTU1YWUNCi1jb2xsYXBzZUFsbFRleHQ9XHU2NTM2XHU1NDA4XHU1MTY4XHU5MGU4XHU2YWEyXHU2N2U1XHU5ODA1XHU3NmVlDQotY29tcG9zaXRlUm9sZVRleHQ9XHU4OTA3XHU1NDA4XHU4OWQyXHU4MjcyDQotY29uY2VwdHNUZXh0PVx1Njk4Mlx1NWZmNQ0KLWNvbnRhaW5lZEFydGlmYWN0c1RleHQ9XHU1MTY3XHU1NDJiXHU3Njg0XHU2OWNiXHU0ZWY2DQotY29udGFpbmVyQXJ0aWZhY3RUZXh0PVx1NTEzMlx1NWI1OFx1NTY2OFx1NjljYlx1NGVmNg0KLWNvbnRlbnRFbGVtZW50c1RleHQ9XHU1ZGYyXHU1MjA2XHU5ODVlXHU3Njg0XHU1MTQzXHU3ZDIwDQotY29udGVudFJlZmVyZW5jZXNUZXh0PVx1NTE2N1x1NWJiOVx1NTNjM1x1NzE2Nw0KLWRlbGl2ZXJhYmxlVGV4dD1cdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWUNCi1kZWxpdmVyYWJsZVByb3BlcnRpZXNUZXh0PVx1NGVhNFx1NGVkOFx1OTgwNVx1NzZlZVx1NTE2N1x1NWJiOQ0KLWRlbGl2ZXJlZFBhcnRzVGV4dD1cdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWVcdTdkNDRcdTRlZjYNCi1kZWxpdmVyZWRXb3JrUHJvZHVjdHNUZXh0PVx1OTA1ZVx1OTAwMVx1NzY4NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLWRlcGVuZGVudFRleHQ9XHU3NmY4XHU0ZjlkXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljDQotZGVzY3JpcHRpb25UZXh0PVx1OGFhYVx1NjYwZQ0KLWRpc2NpcGxpbmVUZXh0PVx1ODk4Zlx1N2JjNA0KLWRpc2NpcGxpbmVzVGV4dD1cdTg5OGZcdTdiYzQNCi1zdWJkaXNjaXBsaW5lc1RleHQ9XHU1YjUwXHU4OThmXHU3YmM0DQotZG9tYWluVGV4dD1cdTk4MThcdTU3ZGYNCi1kb21haW5zVGV4dD1cdTk4MThcdTU3ZGYNCi1leGFtcGxlc1RleHQ9XHU3YmM0XHU0ZjhiDQotZXhwYW5kQWxsVGV4dD1cdTVjNTVcdTk1OGJcdTUxNjhcdTkwZThcdTZhYTJcdTY3ZTVcdTk4MDVcdTc2ZWUNCi1leHRlbmRzVGV4dD1cdTVlZjZcdTRmMzgNCi1leHRlcm5hbFRleHQ9XHU1OTE2XHU5MGU4DQotZXh0ZXJuYWxEZXNjcmlwdGlvblRleHQ9XHU1OTE2XHU5MGU4XHU4YWFhXHU2NjBlDQotZ29hbHNUZXh0PVx1NzZlZVx1NmExOQ0KLWd1aWRlbGluZXNUZXh0PVx1NmU5Nlx1NTI0Nw0KLWlsbHVzdHJhdGlvbnNUZXh0PVx1NTcxNlx1NGY4Yg0KLWltcGFjdE9mTm90SGF2aW5nVGV4dD1cdTZiMjBcdTdmM2FcdTRlMGJcdTUyMTdcdTk4MDVcdTc2ZWVcdTc2ODRcdTVmNzFcdTk3ZmYNCi1pbXBhY3RpbmdUZXh0PVx1NWY3MVx1OTdmZlx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLWlucHV0c1RleHQ9XHU4ZjM4XHU1MTY1DQotaW5wdXRUb1RleHQ9XHU4ZjM4XHU1MTY1XHU4MWYzDQotaXRlbXNUZXh0PVx1OTgwNVx1NzZlZQ0KLWtleUNvbnNpZGVyYXRpb25zVGV4dD1cdTRlM2JcdTg5ODFcdTgwMDNcdTkxY2YNCi1sZXZlbHNPZkFkb3B0aW9uVGV4dD1cdTYzYTFcdTc1MjhcdTVjNjRcdTZiMjENCi1tYW5kYXRvcnlUZXh0PVx1NWYzN1x1NTIzNg0KLW1haW5UZXh0PVx1NGUzYlx1ODk4MQ0KLW1haW5EZXNjcmlwdGlvblRleHQ9XHU0ZTNiXHU4OTgxXHU4YWFhXHU2NjBlDQotbWFpblJlc3BvbnNpYmxlVGV4dD1cdTRlM2JcdTg5ODFcdThjYWNcdTRlZmINCi1tZXRob2RUZXh0PVx1NjViOVx1NmNkNVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLW1vZGlmaWVkQnlUZXh0PVx1NGZlZVx1NjUzOVx1ODAwNQ0KLW1vcmVJbmZvVGV4dD1cdThhNzNcdTdkMzBcdThjYzdcdThhMGENCi1ub3RhdGlvblRleHQ9XHU4ODY4XHU3OTNhXHU2Y2Q1DQotb3B0aW9uYWxUZXh0PVx1OTA3OFx1NzUyOA0KLW91dGNvbWVUZXh0PVx1OGYzOFx1NTFmYVx1N2Q1MFx1Njc5Yw0KLW91dHB1dEZyb21UZXh0PVx1OGYzOFx1NTFmYVx1NGY4Nlx1NmU5MA0KLW91dHB1dHNUZXh0PVx1OGYzOFx1NTFmYQ0KLXBhY2thZ2luZ0luc3RydWN0aW9uc1RleHQ9XHU1MzA1XHU4OGRkXHU2MzA3XHU3OTNhDQotcGFja2FnaW5nR3VpZGFuY2VUZXh0PVx1NTMwNVx1ODhkZFx1NjMwN1x1NWYxNQ0KLXBlcmZvcm1pbmdSb2xlc1RleHQ9XHU1N2Y3XHU4ODRjXHU4OWQyXHU4MjcyDQotcHJpbWFyeVBlcmZvcm1lclRleHQ9XHU0ZTNiXHU4OTgxXHU1N2Y3XHU4ODRjXHU4MDA1DQotcHJvYmxlbVRleHQ9XHU1NTRmXHU5ODRjDQotcHJvcGVydGllc1RleHQ9XHU1MTY3XHU1YmI5DQotcHVycG9zZVRleHQ9XHU3NmVlXHU3Njg0DQotcmVhc29uc0Zvck5vdE5lZWRpbmdUZXh0PVx1NGUwZFx1OTcwMFx1ODk4MVx1NzY4NFx1NTM5Zlx1NTZlMA0KLXJlZmVyZW5jZVdvcmtmbG93c1RleHQ9XHU1M2MzXHU3MTY3XHU1ZGU1XHU0ZjVjXHU2ZDQxXHU3YTBiDQotcmVsYXRlZEVsZW1lbnRzVGV4dD1cdTc2ZjhcdTk1ZGNcdTUxNDNcdTdkMjANCi1yZWxhdGlvbnNoaXBzVGV4dD1cdTk1ZGNcdTRmYzINCi1yZXBvcnRzVGV4dD1cdTU4MzFcdTU0NGENCi1yZXByZXNlbnRhdGlvbk9wdGlvbnNUZXh0PVx1ODg2OFx1NzkzYVx1NmNkNVx1OTA3OFx1OTgwNQ0KLXJlc3BvbnNpYmxlVGV4dD1cdThjYTBcdThjYWMNCi1yZXNwb25zaWJsZUZvclRleHQ9XHU4Y2EwXHU4Y2FjXHU1YzBkXHU4YzYxDQotcmV1c2FibGVBc3NldHNUZXh0PVx1NTNlZlx1OTFjZFx1ODkwN1x1NGY3Zlx1NzUyOFx1NzY4NFx1OGNjN1x1NzUyMg0KLXJvbGVUZXh0PVx1ODlkMlx1ODI3Mg0KLXJvbGVzVGV4dD1cdTg5ZDJcdTgyNzINCi1yb2xlU2V0c1RleHQ9XHU4OWQyXHU4MjcyXHU5NmM2DQotc2tpbGxzVGV4dD1cdTYyODBcdTVkZTcNCi1zdGFmZmluZ1RleHQ9XHU0ZWJhXHU1NGUxXHU5MTRkXHU3ZjZlDQotc3RlcHNUZXh0PVx1NmI2NVx1OWE1Zg0KLXN1YmNhdGVnb3JpZXNUZXh0PVx1NWI1MFx1N2EyZVx1OTg1ZQ0KLXN1YmRvbWFpbnNUZXh0PVx1NWI1MFx1OTgxOFx1NTdkZg0KLXN1YlByYWN0aWNlc1RleHQ9XHU1YjUwXHU3ZGY0XHU3ZmQyDQotc3VwZXJUZWFtVGV4dD1cdThkODVcdTdkMWFcdTU3MThcdTk2OGFcdThjYzdcdTY1OTkNCi1zdXBwb3J0aW5nTWF0ZXJpYWxzVGV4dD1cdTY1MmZcdTYzZjRcdThjYzdcdTY1OTkNCi1zdWJ0ZWFtc1RleHQ9XHU4ZDg1XHU3ZDFhXHU1NzE4XHU5NjhhXHU4Y2M3XHU2NTk5DQotc3lub255bXNUZXh0PVx1NTQwY1x1N2ZhOVx1NWI1Nw0KLXRhaWxvcmluZ1RleHQ9XHU4YWJmXHU2NTc0DQotdGFza1RleHQ9XHU0ZjVjXHU2OTZkDQotdGFza3NUZXh0PVx1NGY1Y1x1Njk2ZA0KLXRic1RleHQ9XHU1NzE4XHU5NjhhXHU5MTRkXHU3ZjZlDQotdGVhbVByb2ZpbGVUZXh0PVx1NTcxOFx1OTY4YVx1OGEyZFx1NWI5YVx1NmE5NA0KLXRlYW1Sb2xlc1RleHQ9XHU1NzE4XHU5NjhhXHU4Y2M3XHU2NTk5XHU4OWQyXHU4MjcyDQotdGVjaG5pcXVlc1RleHQ9XHU2ZTk2XHU1MjQ3DQotdGVtcGxhdGVGaWxlc1RleHQ9XHU3YmM0XHU2NzJjXHU2YTk0DQotdGVtcGxhdGVzVGV4dD1cdTdiYzRcdTY3MmMNCi10b29sTWVudG9yc1RleHQ9XHU1ZGU1XHU1MTc3XHU4ZjE0XHU1MmE5DQotdG9vbFRleHQ9XHU1ZGU1XHU1MTc3DQotdXNhZ2VUZXh0PVx1NzUyOFx1NmNkNQ0KLXdic1RleHQ9XHU1ZGU1XHU0ZjVjXHU1MjA2XHU4OWUzXHU3ZDUwXHU2OWNiDQotd2hpdGVwYXBlcnNUZXh0PVx1NzY3ZFx1NzZhZVx1NjZmOA0KLXdvcmtQcm9kdWN0c1RleHQ9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljDQotd29ya1Byb2R1Y3RUeXBlc1RleHQ9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU5ODVlXHU1NzhiDQotd3Bic1RleHQ9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU3NTI4XHU2Y2Q1DQotd29ya0JyZWFrZG93blRleHQ9XHU5MDRiXHU0ZjVjXHU1MjA2XHU4OWUzDQotd29ya2Zsb3dUZXh0PVx1NWRlNVx1NGY1Y1x1NmQ0MVx1N2EwYg0KLXdvcmtQcm9kdWN0QnJlYWtkb3duVGV4dD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTUyMDZcdTg5ZTMNCi13b3JrUHJvZHVjdERlcGVuZGVuY2llc1RleHQ9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU3NmY4XHU0ZjlkXHU2MDI3DQotdGVhbVByb2ZpbGVCcmVha2Rvd25UZXh0PVx1NTcxOFx1OTY4YVx1NTIwNlx1ODllMw0KLXRlYW1TdHJ1Y3R1cmVUZXh0PVx1NTcxOFx1OTY4YVx1N2Q1MFx1NjljYg0KLXBhZ2VOb3RJbnN0YWxsZWRUZXh0PVx1NjcyYVx1NWI4OVx1ODhkZFx1NzY4NFx1OTgwMVx1OTc2Mg0KLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PVx1NGUwZFx1NWI1OFx1NTcyOFx1NzY4NFx1NTE0M1x1N2QyMA0KLWlzTm90VmFsaWRUZXh0PVx1NTNjM1x1NzE2N1x1NzY4NFx1NTE0M1x1N2QyMFx1NTcyOFx1NzNmZVx1ODg0Y1x1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NGUwZFx1NjYyZlx1NjcwOVx1NjU0OFx1NTE0M1x1N2QyMFx1MzAwMg0KLWVsZW1lbnRNaWdodEJlRGVsZXRlZFRleHQ9XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1M2VmXHU4MGZkXHU1ZGYyXHU1MjJhXHU5NjY0XHU1MTQzXHU3ZDIwXHUzMDAyDQotcGxlYXNlRml4TGlua1RleHQ9XHU4YWNiXHU2YWEyXHU2N2U1XHU1MTY3XHU1YmI5XHU3YTBiXHU1ZjBmXHU1ZWFiXHU0ZTI2XHU0ZmVlXHU2YjYzXHU5M2M4XHU3ZDUwXHUzMDAyDQotaW5mb0Fib3V0TWlzc2luZ0VsZW1lbnRUZXh0PVx1OTA3YVx1NmYwZlx1NTE0M1x1N2QyMFx1NzY4NFx1NzZmOFx1OTVkY1x1OGNjN1x1OGEwYVx1ZmYxYQ0KLWVsZW1lbnROYW1lVGV4dD1cdTUxNDNcdTdkMjBcdTU0MGRcdTdhMzFcdWZmMWENCi1ndWlkVGV4dD1HVUlEXHVmZjFhDQotbWlzc2luZ0VsZW1lbnRUZXh0PVx1NTNjM1x1NzE2N1x1NzY4NFx1OTgwMVx1OTc2Mlx1NGUwZFx1NTcyOFx1NmI2NFx1OTE0ZFx1N2Y2ZVx1NGUyZA0KLW5vdEF2YWlsYWJsZVRleHQ9XHU1M2MzXHU3MTY3XHU3Njg0XHU5ODAxXHU5NzYyXHU0ZTBkXHU1YjU4XHU1NzI4XHU3M2ZlXHU4ODRjXHU5MTRkXHU3ZjZlXHU0ZTJkXHUzMDAyXHU2YjY0XHU5ODAxXHU5NzYyXHU1M2VmXHU4MGZkXHU1NzI4XHU1MTc2XHU0ZWQ2XHU2ZDQxXHU3YTBiXHU5MTRkXHU3ZjZlXHU0ZTJkXHUzMDAyDQotZWxlbWVudFR5cGVUZXh0PVx1NTE0M1x1N2QyMFx1OTg1ZVx1NTc4Ylx1ZmYxYQ0KLXBsdWdpbk5hbWVUZXh0PVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1NTQwZFx1N2EzMVx1ZmYxYQ0KLXByZWRlY2Vzc29yVGV4dD1cdTUyNGRcdTRlMDBcdTcyNDgNCi1wbGFubmluZ0RhdGFUZXh0PVBsYW5uaW5nRGF0YQ0KLW11bHRpcGxlT2NjdXJyZW5jZXNUZXh0PVx1NTkxYVx1NmIyMVx1NTFmYVx1NzNmZVx1NzY4NFx1OTgwNVx1NzZlZQ0KLWV2ZW50RHJpdmVuVGV4dD1cdTRlOGJcdTRlZjZcdTlhNDVcdTUyZDUNCi1vbmdvaW5nVGV4dD1cdTYzMDFcdTdlOGNcdTkwMzJcdTg4NGNcdTRlMmQNCi1wbGFubmVkVGV4dD1cdTg5OGZcdTUyODMNCi1yZXBlYXRhYmxlVGV4dD1cdTUzZWZcdTkxY2RcdTg5MDdcdTc2ODQNCi11c2FnZUd1aWRhbmNlVGV4dD1cdTc1MjhcdTZjZDVcdTYzMDdcdTVmMTUNCi1pbnB1dHNUZXh0PVx1OGYzOFx1NTE2NQ0KLW91dHB1dHNUZXh0PVx1OGYzOFx1NTFmYQ0KLWFjdGl2aXR5RW50cnlTdGF0ZVRleHQ9XHU2ZDNiXHU1MmQ1XHU5MDMyXHU1MTY1XHU3MmMwXHU2MTRiDQotYWN0aXZpdHlFeGl0U3RhdGVUZXh0PVx1NmQzYlx1NTJkNVx1N2Q1MFx1Njc1Zlx1NzJjMFx1NjE0Yg0KLXByZWZpeFRleHQ9XHU1YjU3XHU5OTk2DQotZXh0ZXJuYWxJZFRleHQ9XHU1OTE2XHU5MGU4IElEDQotc2NvcGVUZXh0PVx1N2JjNFx1NTcwZA0KLXJvYWRtYXBUZXh0PVx1NWMwZVx1ODliZFx1NTcxNg0KLXR5cGVvZkNvbnRyYWN0VGV4dD1cdTU0MDhcdTdkMDRcdTk4NWVcdTU3OGINCi1wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzVGV4dD1cdTVjMDhcdTY4NDhcdTYwMjdcdThjZWENCi1wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlVGV4dD1cdTVjMDhcdTY4NDhcdTYyMTBcdTU0ZTFcdTVjMDhcdTY5NmRcdTc3ZTVcdThiNTgNCi1yaXNrTGV2ZWxUZXh0PVx1OThhOFx1OTZhYVx1NWM2NFx1NmIyMQ0KLXNjYWxlVGV4dD1cdThhYmZcdTY1NzRcdTZiZDRcdTRmOGINCi11c2FnZU5vdGVzVGV4dD1cdTRmN2ZcdTc1MjhcdTZjZThcdTYxMGZcdTRlOGJcdTk4MDUNCi1jb250ZXh0VGV4dD1cdTc0YjBcdTU4ODNcdTViOWFcdTdmYTkNCi1wYXJlbnRBY3Rpdml0aWVzVGV4dD1cdTZiY2RcdTk4MDVcdTZkM2JcdTUyZDUNCi1pbmNsdWRlZFBhdHRlcm5zVGV4dD1cdTUxNjdcdTU0MmJcdTU3OGJcdTZhMjMNCi1jaGVja2xpc3RUZXh0PVx1NjgzOFx1NWMwZFx1NmUwNVx1NTVhZQ0KLWNvbW11bmljYXRpb25zTWF0ZXJpYWxzVGV4dD1cdTZlOWRcdTkwMWFcdThjYzdcdTY1OTkNCi1lZHVjYXRpb25NYXRlcmlhbHNUZXh0PVx1NjU1OVx1ODBiMlx1OGNjN1x1NjU5OQ0KLWVzdGltYXRpbmdUZWNobmlxdWVUZXh0PVx1OTgxMFx1NGYzMFx1NjI4MFx1ODg1Mw0KLWFkZGl0aW9uYWxUZXh0PVx1NTE3Nlx1NGVkNlx1NzY4NA0KLW1vZGlmaWVzVGV4dD1cdTRmZWVcdTY1MzlcdTk4MDVcdTc2ZWUNCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQ9XHU5ODRkXHU1OTE2XHU1N2Y3XHU4ODRjDQotaW5kZXhUZXh0PVx1N2QyMlx1NWYxNQ0KLXByZWZpeFRleHQ9XHU1YjU3XHU5OTk2DQotYnJlYWtkb3duRWxlbWVudFRleHQ9XHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwDQotc3RlcHNUZXh0PVx1NmI2NVx1OWE1Zg0KLXByZWRlY2Vzc29yc1RleHQ9XHU1MjRkXHU0ZTAwXHU3MjQ4DQotcmVwZWF0YWJsZVRleHQ9XHU1M2VmXHU5MWNkXHU4OTA3XHU3Njg0DQotdHlwZVRleHQ9XHU5ODVlXHU1NzhiDQotb25nb2luZ1RleHQ9XHU2MzAxXHU3ZThjXHU5MDMyXHU4ODRjXHU0ZTJkDQotZXZlbnREcml2ZW5UZXh0PVx1NGU4Ylx1NGVmNlx1OWE0NVx1NTJkNQ0KLW1vZGVsSW5mb1RleHQ9XHU2YTIxXHU1NzhiXHU4Y2M3XHU4YTBhDQotZW50cnlTdGF0ZVRleHQ9XHU5MDMyXHU1MTY1XHU3MmMwXHU2MTRiDQotZXhpdFN0YXRlVGV4dD1cdTdkNTBcdTY3NWZcdTcyYzBcdTYxNGINCi10ZWFtVGV4dD1cdTU3MThcdTk2OGENCi1wYXJlbnRQYWNrYWdlVGV4dD1cdTZiY2RcdTk4MDVcdTU5NTdcdTRlZjYNCi1jb250YWluZWRQYWNrYWdlc1RleHQ9XHU1MTY3XHU1NDJiXHU1OTU3XHU0ZWY2DQotY29udGVudHNUZXh0PVx1NTE2N1x1NWJiOQ0KLWJhc2VkT25NZXRob2RSb2xlVGV4dD1cdTY4MzlcdTY0ZGFcdTY1YjlcdTZjZDVcdTg5ZDJcdTgyNzINCi1iYXNlZE9uTWV0aG9kVGFza1RleHQ9XHU2ODM5XHU2NGRhXHU2NWI5XHU2Y2Q1XHU0ZjVjXHU2OTZkDQotYmFzZWRPbk1ldGhvZFdvcmtQcm9kdWN0VGV4dD1cdTY4MzlcdTY0ZGFcdTY1YjlcdTZjZDVcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCi1zdW1tYXJ5VGV4dD1cdTY0NThcdTg5ODENCi1wZXJmb3Jtc1RleHQ9XHU1N2Y3XHU4ODRjDQotcmVwbGFjZXNUZXh0PVx1NTNkNlx1NGVlMw0KLWNvbnRyaWJ1dGVzVGV4dD1cdTYzZDBcdTUxZmENCi1ub25lVGV4dD1cdTcxMjENCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNUZXh0PVx1OTgxMFx1NGYzMFx1ODAwM1x1OTFjZg0KLWFjdGl2aXR5UmVmZXJlbmNlc1RleHQ9XHU2ZDNiXHU1MmQ1XHU1M2MzXHU3MTY3DQotbmFtZVRleHQ9XHU1NDBkXHU3YTMxDQotcHJlc2VudGF0aW9uTmFtZVRleHQ9XHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTAyNDllMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gQmlibGlvdGhlaw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxMDMwNzkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUJpYmxpb3RlY2EgZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTA0ODNlNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9QmlibGlvdGhcdTAwZThxdWUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5faXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTU2MGYyMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9TGlicmVyaWEgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5famEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGE1ZmU4My4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIExpYnJhcnkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzU2ZTgwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjhlMDEwYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9QmlibGlvdGVjYSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNzcxYzE3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHU1ZTkzDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGE1ZmU4My4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIExpYnJhcnkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1OTExMjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXVua25vd25fdGV4dD1VbmJla2FubnQNCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lbXB0eUxpYnJhcnlQYXRoRXJyb3JfcmVhc29uPURlciBQZmFkIGRlciBNZXRob2RlbmJpYmxpb3RoZWsgaXN0IGxlZXIuDQotbWlzc2luZ0xpYnJhcnlGaWxlRXJyb3JfcmVhc29uPURpZSBNb2RlbGxkYXRlaSBmXHUwMGZjciBkaWUgTWV0aG9kZW5iaWJsaW90aGVrIGlzdCBuaWNodCB2b3JoYW5kZW4uDQotdW5yZXNvbHZlZFByb3h5RXJyb3JfcmVhc29uPURpZSBhdXNnZXdcdTAwZTRobHRlIE1ldGhvZGVuYmlibGlvdGhlayBlbnRoXHUwMGU0bHQgbmljaHQgYXVmZ2VsXHUwMGY2c3RlIEVsZW1lbnRyZWZlcmVuemVuLiBEaWVzZXMgUHJvYmxlbSB0cml0dCBpbiBkZXIgUmVnZWwgYXVmLCB3ZW5uIFhNSS1EYXRlaWVuIGltIEJpYmxpb3RoZWtzb3JkbmVyIGZlaGxlbiBvZGVyIGFuIGRpZSBmYWxzY2hlIFBvc2l0aW9uIGtvcGllcnQgd3VyZGVuLlxuXG5TY2hsaWVcdTAwZGZlbiBTaWUgZGVuIERpYWxvZyB1bmQgcnVmZW4gU2llIGRpZSBTaWNodCAiUHJvYmxlbWUiIGF1ZiwgdW0gZGllIG5pY2h0IGF1ZmdlbFx1MDBmNnN0ZW4gUmVmZXJlbnplbiB6dSBlcm1pdHRlbG4uIFVtIGRpZSBCaWJsaW90aGVrIG5pY2h0IHp1IGJlc2NoXHUwMGU0ZGlnZW4sIHdpcmQgZHJpbmdlbmQgZW1wZm9obGVuLCBkaWUgUmVmZXJlbnplbiB6dWVyc3QgYXVmenVsXHUwMGY2c2VuLCBiZXZvciBkZXIgQmlibGlvdGhlayB3ZWl0ZXJlIFx1MDBjNG5kZXJ1bmdlbiBoaW56dWdlZlx1MDBmY2d0IHdlcmRlbi4NCi0NCi0jIFdhcm5pbmcgTWVzc2FnZXMNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cxPUlVUEwwMDA3VzogSW4gbWluZGVzdGVucyBlaW5lbSB1bnRlcmdlb3JkbmV0ZW4gRWxlbWVudCBmZWhsZW4gUmVmZXJlbnplbi4NCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cyPUlVUEwwMDA4VzogRGllc2VzIEVsZW1lbnQgc29sbHRlIGF1c2dld1x1MDBlNGhsdCB3ZXJkZW4sIHVtIGZlaGxlbmRlIFJlZmVyZW56ZW4gYXVmenVsXHUwMGY2c2VuLg0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzM9SVVQTDAwMDlXOiBEaWVzZXMgRWxlbWVudCB2ZXJ3ZWlzdCBhdWYgbWluZGVzdGVucyBlaW4gRWxlbWVudCBpbiBlaW5lbSBuaWNodCBhdXNnZXdcdTAwZTRobHRlbiBQYWtldC4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbG9hZFJlc291cmNlc0Vycm9yX21zZz1JVVBMMDAwMEU6IERpZSBNZXRob2RlbmJpYmxpb3RoZWsgd3VyZGUgendhciBnZWxhZGVuLCBhYmVyIGVzIHNpbmQgZWluaWdlIEZlaGxlciBhdWZnZXRyZXRlbi4NCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZz1JVVBMMDAwMUU6IERpZXNlIEFubGVpdHVuZyBrYW5uIG5pY2h0IGluIGVpbmVuIGFuZGVyZW4gVHlwIGtvbnZlcnRpZXJ0IHdlcmRlbi4NCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDJFOiBEaWVzZSBBbmxlaXR1bmcga2FubiBuaWNodCBpbiBkZW4gWmllbHR5cCBrb252ZXJ0aWVydCB3ZXJkZW4uDQotc2F2ZUNvbnZlcnRlZEd1aWRhbmNlRXJyb3JfbXNnPUlVUEwwMDAzRTogRGllIGtvbnZlcnRpZXJ0ZSBBbmxlaXR1bmcgJyd7MH0nJyBrYW5uIG5pY2h0IGdlc3BlaWNoZXJ0IHdlcmRlbi4NCi0NCi0jIENvbnZlcnQgYWN0aXZpdHkNCi1jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZT1GZWhsZXIgYmVpbSBLb252ZXJ0aWVyZW4gZGVzIEFrdGl2aXRcdTAwZTR0c3R5cHMNCi1jb252ZXJ0QWN0aXZpdHlFcnJvcl9tc2c9SVVQTDAwMDZFOiBEaWVzZSBBa3Rpdml0XHUwMGU0dCBrYW5uIG5pY2h0IGluIGRlbiBaaWVsdHlwIGtvbnZlcnRpZXJ0IHdlcmRlbi4NCi1zYXZlQ29udmVydGVkQWN0aXZpdHlFcnJvcl9tc2c9SVVQTDAwMDdFOiBEaWUga29udmVydGllcnRlIEFrdGl2aXRcdTAwZTR0ICcnezB9Jycga2FubiBuaWNodCBnZXNwZWljaGVydCB3ZXJkZW4uDQotDQotIyBFcnJvciBSZWFzb25zDQotZXJyb3JfcmVhc29uPUlVUEwwMDA0RTogRXMgaXN0IGVpbiBGZWhsZXIgYXVmZ2V0cmV0ZW4uIEtsaWNrZW4gU2llIGF1ZiAiT0siLCB1bSB3ZWl0ZXJlIEluZm9ybWF0aW9uZW4genUgZXJoYWx0ZW4uDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9yZWFzb249RXMgaXN0IGtlaW4ga29tcGF0aWJsZXIgQW5sZWl0dW5nc3R5cCBmXHUwMGZjciB7MH0gdm9yaGFuZGVuLg0KLWludmFsaWRMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1VbmdcdTAwZmNsdGlnZXIgQmlibGlvdGhla3NwZmFkLiBEaWUgRGF0ZWkgbWl0IGRlciBFcndlaXRlcnVuZyAucHJvamVjdCBrb25udGUgbmljaHQgZXJzdGVsbHQgd2VyZGVuLg0KLWNvdWxkTm90TG9ja0xpYnJhcnlfcmVhc29uPURpZSBCaWJsaW90aGVrIGtvbm50ZSBuaWNodCBnZXNwZXJydCB3ZXJkZW4uDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWNvcHlpbmdBdHRhY2htZW50c1Rhc2tfbmFtZT1BbmhcdTAwZTRuZ2Ugd2VyZGVuIGtvcGllcnQuLi4NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nDQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlPUFubGVpdHVuZ3N0eXAga29udmVydGllcmVuDQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RleHQ9V1x1MDBlNGhsZW4gU2llIGRlbiBaaWVsYW5sZWl0dW5nc3R5cCBhdXMuDQotDQotIyBHdWlkYW5jZSB0eXBlIG5hbWVzIGZvciBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZyAtIHNob3VsZCBiZSByZWZhY3RvcmVkIGludG8gbGlicmFyeS51aQ0KLWNoZWNrbGlzdF90ZXh0PVByXHUwMGZjZmxpc3RlDQotY29uY2VwdF90ZXh0PUtvbnplcHQNCi1leGFtcGxlX3RleHQ9QmVpc3BpZWwNCi1ndWlkZWxpbmVfdGV4dD1SaWNodGxpbmllDQotZXN0aW1hdGVfdGV4dD1TY2hcdTAwZTR0emVuDQotZXN0aW1hdGluZ01ldHJpY190ZXh0PVNjaFx1MDBlNHR6bWV0cmlrDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9SGlud2Vpc2UgenVtIFNjaFx1MDBlNHR6ZW4NCi1yZXBvcnRfdGV4dD1CZXJpY2h0DQotdGVtcGxhdGVfdGV4dD1Wb3JsYWdlDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9VW50ZXJzdFx1MDBmY3R6ZW5kZXMgTWF0ZXJpYWwNCi10b29sTWVudG9yX3RleHQ9VG9vbG1lbnRvcg0KLXdoaXRlcGFwZXJfdGV4dD1XaGl0ZSBQYXBlcg0KLXRlcm1EZWZpbml0aW9uX3RleHQ9QmVncmlmZnNkZWZpbml0aW9uDQotcHJhY3RpY2VfdGV4dD1WZXJmYWhyZW4NCi1yZXVzYWJsZUFzc2V0X3RleHQ9V2llZGVydmVyd2VuZGJhcmVzIEFzc2V0DQotDQotI2FjdGl2aXR5IGJyZWFrZG93biBpbmZvIHN0cmluZ3MNCi1BY3Rpdml0eUxheW91dF9wcmltYXJ5VGFza3NfdGV4dD1BdXNmXHUwMGZjaHJ1bmcgYWxzIEVpZ25lcg0KLUFjdGl2aXR5TGF5b3V0X2FkZGl0aW9uYWxUYXNrc190ZXh0PUF1c2ZcdTAwZmNocnVuZyBhbHMgenVzXHUwMGU0dHpsaWNoZXIgQXVzZlx1MDBmY2hyZW5kZXINCi0NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRXJyb3IgTWVzc2FnZXMNCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl90aXRsZT1GZWhsZXIgYmVpbSBLb252ZXJ0aWVyZW4gZGVzIEFubGVpdHVuZ3N0eXBzDQotDQotIyBMb2FkIFJlc291cmNlcyBFcnJvciBEaWFsb2cNCi1sb2FkUmVzb3VyY2VzRXJyb3JfdGl0bGU9RmVobGVyIGJlaW0gXHUwMGQ2ZmZuZW4gZGVyIE1ldGhvZGVuYmlibGlvdGhlaw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb249RWluaWdlIEJpYmxpb3RoZWtzcmVzc291cmNlbiBrb25udGVuIG5pY2h0IGdlbGFkZW4gd2VyZGVuLlxuXG5LbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gc2ljaCBkaWUgRmVobGVyIGFuenVzZWhlbiB1bmQgenUgYmVoZWJlbiwgYmV2b3IgU2llIGRlciBCaWJsaW90aGVrIHdlaXRlcmUgXHUwMGM0bmRlcnVuZ2VuIGhpbnp1Zlx1MDBmY2dlbi4NCi0NCi0jIFJvbGUgRGlhZ3JhbXMNCi1yb2xlRGlhZ3JhbVBlcmZvcm1zX3RleHQ9Zlx1MDBmY2hydCBhdXMNCi1yb2xlRGlhZ3JhbVJlc3BvbnNpYmxlRm9yX3RleHQ9dmVyYW50d29ydGxpY2ggZlx1MDBmY3INCi0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cwPVJlZmVyZW56aWVydGVzIEVsZW1lbnQ6IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE9SW5mbzogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHND1XYXJudW5nOiB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c3PUZlaGxlcjogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9RGFzIHJlZmVyZW56aWVydGUgRWxlbWVudCB7MH0gaXN0IG5pY2h0IHZvcmhhbmRlbi4NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMT1FbGVtZW50IGZcdTAwZmNyIGd1aWQgezB9IHd1cmRlIG5pY2h0IGdlZnVuZGVuLg0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEyPURpZSBEYXRlaSAnJ3swfScnIHZlcndlaXN0IGF1ZiBkaWUgbmljaHQgdm9yaGFuZGVuZSBSZXNzb3VyY2UgJyd7MX0nJy4NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNT1EaWUgUmVzc291cmNlbmRhdGVpICcnezB9JycgaXN0IG5pY2h0IHZvcmhhbmRlbi4NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNz1FcyBrYW5uIGtlaW5lIFZlcmJpbmR1bmcgenVtIFVSTCAnJ3swfScnIGhlcmdlc3RlbGx0IHdlcmRlbi4NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxOT1FcyBrYW5uIGtlaW5lIFZlcmJpbmR1bmcgenVtIFVSTCAnJ3swfScnIGhlcmdlc3RlbGx0IHdlcmRlbjogezF9DQotSW1wb3J0RXhwb3J0VXRpbF9NU0c4PURpZSBEYXRlaSAnJ3swfScnIHd1cmRlIG5pY2h0IGdlZnVuZGVuLg0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOT1EYXMgdGVtcG9yXHUwMGU0cmUgVmVyemVpY2huaXMgJyd7MH0nJyBrb25udGUgbmljaHQgZXJzdGVsbHQgd2VyZGVuLg0KLXVua25vd25HdWlkYW5jZV90ZXh0PVVuYmVrYW5udA0KLQ0KLUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb25fbG9nX25vQ29udGVudFBhdGg9Q29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5IYW5kbGVBdHRhY2htZW50c1BsdWdpbjogRXMgaXN0IGtlaW4gY29udGVudFBhdGggZlx1MDBmY3IgezB9IHZvcmhhbmRlbi4NCi1MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyX2Nhbm5vdFVwZGF0ZT1JVVBMMDAwNlc6IHswfSB7MX0ga2FubiBuaWNodCBha3R1YWxpc2llcnQgd2VyZGVuLg0KLXdhcm5pbmdEbGdfdGl0bGU9V2FybnVuZw0KLWVycm9yRGxnX3RpdGxlPUZlaGxlcg0KLWVycm9yRGxnX3NhdmVFcnJvcj1JVVBMMDAwNUU6IEZlaGxlciBiZWltIFNwZWljaGVybiBkZXIgXHUwMGM0bmRlcnVuZ2VuIGluIGRlciBEYXRlaSAnJ3swfScnDQotDQotIyBhY3Rpdml0eSBkaWFncmFtIG5hbWVzDQotYWN0aXZpdHlEaWFncmFtTmFtZT1Ba3Rpdml0XHUwMGU0dHNkaWFncmFtbTogezB9DQotYWN0aXZpdHlEZXRhaWxEaWFncmFtTmFtZT1Ba3Rpdml0XHUwMGU0dHNkZXRhaWxkaWFncmFtbTogezB9DQotd3BEZXBlbmRlbmN5RGlhZ3JhbU5hbWU9QXJiZWl0c2VyZ2VibmlzYWJoXHUwMGU0bmdpZ2tlaXRzZGlhZ3JhbW06IHswfQ0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFJvbGUgZGlhZ3JhbSBmb250cyBhbmQgbGF5b3V0DQotcm9sZURpYWdyYW1Gb250X25hbWU9QXJpYWwNCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMj1BcmlhbA0KLXJvbGVEaWFncmFtRm9udF9zaXplPTEwDQotcm9sZURpYWdyYW1Gb250X3NpemVfd2luMzI9MTANCi1yb2xlRGlhZ3JhbV94TWFyZ2luPTIwMA0KLXJvbGVEaWFncmFtX3hTcGFjaW5nPTcwDQotcm9sZURpYWdyYW1feVNwYWNpbmc9MzANCi0NCi0jIGxvY2FsaXplIHRoZSB2YWx1ZSBiYXNlZCBvbiBsb2NhbGUuICBmb3IgZXhhbXBsZSwgDQotIyBmb3IgRW5nbGlzaCwgdGhlIHZhbHVlIGlzICIuICINCi0jY29sb25fd2l0aF9zcGFjZT06IA0KLSMgZm9yIGZyZW5jaCwgdGhlIHZhbHVlIGlzICIgLiAiLCB5b3UgbmVlZCB0byB1c2UgYSBcIHRvIHByZXNlcnZlIHRoZSBsZWFkaW5nIHNwYWNlDQotI2NvbG9uX3dpdGhfc3BhY2U9XCA6IA0KLSMgZm9yIGNoaW5lc2UsIHRoZSBjb2xvbiBzaG91bGQgYmUgZG91YmxlIGJ5dGVzDQotIyBEb250IHRyaW0gdGhlIHNwYWNlcyBhZnRlciB0aGUgY29sb24uDQotY29sb25fd2l0aF9zcGFjZT06IA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAyNTYwZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotdW5rbm93bl90ZXh0PURlc2Nvbm9jaWRvDQotDQotIyBFcnJvciBSZWFzb25zDQotZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1MYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBlc3RcdTAwZTEgdmFjXHUwMGVkYS4NCi1taXNzaW5nTGlicmFyeUZpbGVFcnJvcl9yZWFzb249RmFsdGEgZWwgYXJjaGl2byBkZWwgbW9kZWxvIGRlIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLg0KLXVucmVzb2x2ZWRQcm94eUVycm9yX3JlYXNvbj1MYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBzZWxlY2Npb25hZGEgY29udGllbmUgcmVmZXJlbmNpYXMgYSBlbGVtZW50b3Mgc2luIHJlc29sdmVyLiBFc3RvIHN1ZWxlIGRlYmVyc2UgYSBhcmNoaXZvcyBYTUkgcXVlIGZhbHRhbiBvIHF1ZSBlc3RcdTAwZTFuIGRlc3BsYXphZG9zIGVuIGxhIGNhcnBldGEgZGUgYmlibGlvdGVjYS5cblxuQ2llcnJlIGVzdGUgZGlcdTAwZTFsb2dvIHkgYWJyYSBsYSB2aXN0YSBQcm9ibGVtYXMgcGFyYSBpZGVudGlmaWNhciBsYXMgcmVmZXJlbmNpYXMgbm8gcmVzdWVsdGFzLiBQYXJhIG5vIGRhXHUwMGYxYXIgbGEgYmlibGlvdGVjYSwgZXMgbXV5IHJlY29tZW5kYWJsZSByZXNvbHZlciBlc3RhcyByZWZlcmVuY2lhcyBhbnRlcyBkZSBhXHUwMGYxYWRpciBtXHUwMGUxcyBjYW1iaW9zIGEgbGEgYmlibGlvdGVjYS4NCi0NCi0jIFdhcm5pbmcgTWVzc2FnZXMNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cxPUlVUEwwMDA3VzogSGF5IHVubyBvIHZhcmlvcyBlbGVtZW50b3MgaGlqbyBxdWUgY29udGllbmVuIHJlZmVyZW5jaWFzIGF1c2VudGVzDQotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMj1JVVBMMDAwOFc6IERlYmUgc2VsZWNjaW9uYXIgZXN0ZSBlbGVtZW50byBwYXJhIHJlc29sdmVyIHVuYSBvIHZhcmlhcyBkZSBsYXMgcmVmZXJlbmNpYXMgYXVzZW50ZXMNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2czPUlVUEwwMDA5VzogRXN0ZSBlbGVtZW50byBoYWNlIHJlZmVyZW5jaWEgYSB1bm8gbyB2YXJpb3MgZWxlbWVudG9zIGRlIHVuIHBhcXVldGUgbm8gc2VsZWNjaW9uYWRvDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9tc2c9SVVQTDAwMDBFOiBTZSBoYSBjYXJnYWRvIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLCBwZXJvIHNlIGhhbiBkZXRlY3RhZG8gdmFyaW9zIGVycm9yZXMuDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9tc2c9SVVQTDAwMDFFOiBFc3RhIGd1XHUwMGVkYSBubyBzZSBwdWVkZSBjb252ZXJ0aXIgZW4gb3RybyB0aXBvLg0KLWNvbnZlcnRHdWlkYW5jZUVycm9yX21zZz1JVVBMMDAwMkU6IEVzdGEgZ3VcdTAwZWRhIG5vIHNlIHB1ZWRlIGNvbnZlcnRpciBlbiBvdHJvIHRpcG8gZGUgZGVzdGluby4NCi1zYXZlQ29udmVydGVkR3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDNFOiBMYSBndVx1MDBlZGEgY29udmVydGlkYSAnJ3swfScnIG5vIHNlIHB1ZWRlIGd1YXJkYXIuDQotDQotIyBDb252ZXJ0IGFjdGl2aXR5DQotY29udmVydEFjdGl2aXR5RXJyb3JfdGl0bGU9Q29udmVydGlyIGVycm9yIGRlIHRpcG8gZGUgYWN0aXZpZGFkDQotY29udmVydEFjdGl2aXR5RXJyb3JfbXNnPUlVUEwwMDA2RTogRXN0YSBhY3RpdmlkYWQgbm8gc2UgcHVlZGUgY29udmVydGlyIGVuIG90cm8gdGlwbyBkZSBkZXN0aW5vLg0KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0U6IExhIGFjdGl2aWRhZCBjb252ZXJ0aWRhICcnezB9Jycgbm8gc2UgcHVlZGUgZ3VhcmRhci4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQTDAwMDRFOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IuIFB1bHNlIEFjZXB0YXIgcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGluZm9ybWFjaVx1MDBmM24uDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9yZWFzb249Tm8gaGF5IG5pbmdcdTAwZmFuIHRpcG8gZGUgZ3VcdTAwZWRhIGNvbXBhdGlibGUgcGFyYSB7MH0uDQotaW52YWxpZExpYnJhcnlQYXRoRXJyb3JfcmVhc29uPUxhIHZcdTAwZWRhIGRlIGFjY2VzbyBkZSBsYSBiaWJsaW90ZWNhIG5vIGVzIHZcdTAwZTFsaWRhLiBObyBzZSBoYSBwb2RpZG8gY3JlYXIgZWwgYXJjaGl2byAucHJvamVjdC4NCi1jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbj1ObyBzZSBoYSBwb2RpZG8gYmxvcXVlYXIgbGEgYmlibGlvdGVjYS4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotY29weWluZ0F0dGFjaG1lbnRzVGFza19uYW1lPUNvcGlhbmRvIGFyY2hpdm9zIGRlIGRhdG9zIGFkanVudG9zLi4uDQotDQotIyBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZw0KLWNvbnZlcnRHdWlkYW5jZURpYWxvZ190aXRsZT1Db252ZXJ0aXIgdGlwbyBkZSBndVx1MDBlZGENCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGV4dD1TZWxlY2Npb25lIGVsIHRpcG8gZGUgZ3VcdTAwZWRhIGRlIGRlc3Rpbm8uDQotDQotIyBHdWlkYW5jZSB0eXBlIG5hbWVzIGZvciBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZyAtIHNob3VsZCBiZSByZWZhY3RvcmVkIGludG8gbGlicmFyeS51aQ0KLWNoZWNrbGlzdF90ZXh0PUxpc3RhIGRlIGNvbXByb2JhY2lcdTAwZjNuDQotY29uY2VwdF90ZXh0PUNvbmNlcHRvDQotZXhhbXBsZV90ZXh0PUVqZW1wbG8NCi1ndWlkZWxpbmVfdGV4dD1EaXJlY3RyaXoNCi1lc3RpbWF0ZV90ZXh0PUNcdTAwZTFsY3Vsbw0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dD1DXHUwMGUxbGN1bG8gZGUgbGEgbWVkaWRhDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9Q29uc2lkZXJhY2lvbmVzIHNvYnJlIGVsIGNcdTAwZTFsY3Vsbw0KLXJlcG9ydF90ZXh0PUluZm9ybWUNCi10ZW1wbGF0ZV90ZXh0PVBsYW50aWxsYQ0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PU1hdGVyaWFsIGRlIHNvcG9ydGUNCi10b29sTWVudG9yX3RleHQ9R3VcdTAwZWRhIGRlIGxhIGhlcnJhbWllbnRhDQotd2hpdGVwYXBlcl90ZXh0PURvY3VtZW50YWNpXHUwMGYzbg0KLXRlcm1EZWZpbml0aW9uX3RleHQ9RGVmaW5pY2lcdTAwZjNuIGRlIHRcdTAwZTlybWlub3MNCi1wcmFjdGljZV90ZXh0PVByXHUwMGUxY3RpY2ENCi1yZXVzYWJsZUFzc2V0X3RleHQ9QWN0aXZvIHJldXRpbGl6YWJsZQ0KLQ0KLSNhY3Rpdml0eSBicmVha2Rvd24gaW5mbyBzdHJpbmdzDQotQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQ9QWN0XHUwMGZhYSBjb21vIHByb3BpZXRhcmlvDQotQWN0aXZpdHlMYXlvdXRfYWRkaXRpb25hbFRhc2tzX3RleHQ9QWN0XHUwMGZhYSBjb21vIGFkaWNpb25hbA0KLQ0KLQ0KLSMgQ29udmVydCBHdWlkYW5jZSBFcnJvciBNZXNzYWdlcw0KLWNvbnZlcnRHdWlkYW5jZUVycm9yX3RpdGxlPUNvbnZlcnRpciBlcnJvciBkZSB0aXBvIGRlIGd1XHUwMGVkYQ0KLQ0KLSMgTG9hZCBSZXNvdXJjZXMgRXJyb3IgRGlhbG9nDQotbG9hZFJlc291cmNlc0Vycm9yX3RpdGxlPVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBhYnJpciBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb249Tm8gc2UgaGFuIHBvZGlkbyBjYXJnYXIgYWxndW5vcyByZWN1cnNvcyBkZSBsYSBiaWJsaW90ZWNhLlxuXG5QdWxzZSBEZXRhbGxlcyBwYXJhIHJldmlzYXIgbG9zIGVycm9yZXMgeSBzb2x1Y2lvbmFybG9zIGFudGVzIGRlIGFcdTAwZjFhZGlyIG1cdTAwZTFzIGNhbWJpb3MgYSBsYSBiaWJsaW90ZWNhLg0KLQ0KLSMgUm9sZSBEaWFncmFtcw0KLXJvbGVEaWFncmFtUGVyZm9ybXNfdGV4dD1yZWFsaXphDQotcm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0PXJlc3BvbnNhYmxlIGRlDQotDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMD1FbGVtZW50byBjb24gcmVmZXJlbmNpYXM6IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE9SW5mb3JtYWNpXHUwMGYzbjogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHND1BdmlzbzogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNz1FcnJvcjogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9RWxlbWVudG8gY29uIHJlZmVyZW5jaWFzIGF1c2VudGUgezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTE9Tm8gc2UgaGEgcG9kaWRvIGVuY29udHJhciBlbCBlbGVtZW50byBwYXJhIGVsIEdVSUQgezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTI9RWwgYXJjaGl2byAnJ3swfScnIGhhY2UgcmVmZXJlbmNpYSBhbCByZWN1cnNvIGF1c2VudGUgJyd7MX0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE1PWZhbHRhIGVsIGFyY2hpdm8gZGUgcmVjdXJzb3MgJyd7MH0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE3PU5vIHNlIGhhIHBvZGlkbyBjb25lY3RhciBhIGxhIHVybCAnJ3swfScnDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTk9Tm8gc2UgaGEgcG9kaWRvIGNvbmVjdGFyIGEgbGEgdXJsICcnezB9Jyc6IHsxfQ0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOD1ObyBzZSBoYSBwb2RpZG8gZW5jb250cmFyIGVsIGFyY2hpdm8gJyd7MH0nJy4NCi1JbXBvcnRFeHBvcnRVdGlsX01TRzk9Tm8gc2UgaGEgcG9kaWRvIGNyZWFyIGVsIGRpcmVjdG9yaW8gdGVtcG9yYWwgJyd7MH0nJy4NCi11bmtub3duR3VpZGFuY2VfdGV4dD1EZXNjb25vY2lkbw0KLQ0KLUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb25fbG9nX25vQ29udGVudFBhdGg9Q29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5IYW5kbGVBdHRhY2htZW50c1BsdWdpbjogbm8gaGF5IG5pbmd1bmEgdlx1MDBlZGEgZGUgYWNjZXNvIGRlIGNvbnRlbmlkbyBwYXJhIHswfQ0KLUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXJfY2Fubm90VXBkYXRlPUlVUEwwMDA2VzogTm8gc2UgcHVlZGUgYWN0dWFsaXphciB7MH0gezF9DQotd2FybmluZ0RsZ190aXRsZT1Bdmlzbw0KLWVycm9yRGxnX3RpdGxlPUVycm9yDQotZXJyb3JEbGdfc2F2ZUVycm9yPUlVUEwwMDA1RTogU2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGFsIGd1YXJkYXIgbG9zIGNhbWJpb3MgZW4gZWwgYXJjaGl2byAnJ3swfScnDQotDQotIyBhY3Rpdml0eSBkaWFncmFtIG5hbWVzDQotYWN0aXZpdHlEaWFncmFtTmFtZT1EaWFncmFtYSBkZSBsYSBhY3RpdmlkYWQ6IHswfQ0KLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbU5hbWU9RGlhZ3JhbWEgZGUgZGV0YWxsZSBkZSBsYSBhY3RpdmlkYWQ6IHswfQ0KLXdwRGVwZW5kZW5jeURpYWdyYW1OYW1lPURpYWdyYW1hIGRlIGRlcGVuZGVuY2lhIGRlbCBwcm9kdWN0byBkZSB0cmFiYWpvOiB7MH0NCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBSb2xlIGRpYWdyYW0gZm9udHMgYW5kIGxheW91dA0KLXJvbGVEaWFncmFtRm9udF9uYW1lPUFyaWFsDQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI9QXJpYWwNCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZT0xMA0KLXJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyPTEwDQotcm9sZURpYWdyYW1feE1hcmdpbj0yMDANCi1yb2xlRGlhZ3JhbV94U3BhY2luZz03MA0KLXJvbGVEaWFncmFtX3lTcGFjaW5nPTMwDQotDQotIyBsb2NhbGl6ZSB0aGUgdmFsdWUgYmFzZWQgb24gbG9jYWxlLiAgZm9yIGV4YW1wbGUsIA0KLSMgZm9yIEVuZ2xpc2gsIHRoZSB2YWx1ZSBpcyAiLiAiDQotI2NvbG9uX3dpdGhfc3BhY2U9OiANCi0jIGZvciBmcmVuY2gsIHRoZSB2YWx1ZSBpcyAiIC4gIiwgeW91IG5lZWQgdG8gdXNlIGEgXCB0byBwcmVzZXJ2ZSB0aGUgbGVhZGluZyBzcGFjZQ0KLSNjb2xvbl93aXRoX3NwYWNlPVwgOiANCi0jIGZvciBjaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcw0KLSMgRG9udCB0cmltIHRoZSBzcGFjZXMgYWZ0ZXIgdGhlIGNvbG9uLg0KLWNvbG9uX3dpdGhfc3BhY2U9OiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1ZTdmYzYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXVua25vd25fdGV4dD1JbmNvbm51DQotDQotIyBFcnJvciBSZWFzb25zDQotZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1MZSBjaGVtaW4gZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBlc3QgdmlkZS4NCi1taXNzaW5nTGlicmFyeUZpbGVFcnJvcl9yZWFzb249TGUgZmljaGllciBkZSBtb2RcdTAwZThsZSBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGVzdCBtYW5xdWFudC4NCi11bnJlc29sdmVkUHJveHlFcnJvcl9yZWFzb249TGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBzXHUwMGU5bGVjdGlvbm5cdTAwZTllIGNvbnRpZW50IGRlcyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBkJ1x1MDBlOWxcdTAwZTltZW50cyBub24gclx1MDBlOXNvbHVlcy4gQ2VjaSBlc3QgZ1x1MDBlOW5cdTAwZTlyYWxlbWVudCBkXHUwMGZiIFx1MDBlMCBkZXMgZmljaGllcnMgWE1JIG1hbnF1YW50cyBvdSBheWFudCBcdTAwZTl0XHUwMGU5IGRcdTAwZTlwbGFjXHUwMGU5cyBkYW5zIGxlIGRvc3NpZXIgQmlibGlvdGhcdTAwZThxdWUuXG5cbkZlcm1leiBjZXR0ZSBib1x1MDBlZXRlIGRlIGRpYWxvZ3VlIGV0IGFmZmljaGV6IGxhIHZ1ZSBQcm9ibFx1MDBlOG1lcyBhZmluIGQnaWRlbnRpZmllciBsZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgbm9uIHJcdTAwZTlzb2x1ZXMuIEFmaW4gZCdcdTAwZTl2aXRlciBkJ2VuZG9tbWFnZXIgbGEgYmlibGlvdGhcdTAwZThxdWUsIGlsIGVzdCBmb3J0ZW1lbnQgcmVjb21tYW5kXHUwMGU5IGRlIGNvbW1lbmNlciBwYXIgclx1MDBlOXNvdWRyZSBjZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgYXZhbnQgZCdham91dGVyIGQnYXV0cmVzIG1vZGlmaWNhdGlvbnMgXHUwMGUwIGxhIGJpYmxpb3RoXHUwMGU4cXVlLg0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcw0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzE9SVVQTDAwMDdXIDogdW4gb3UgcGx1c2lldXJzIFx1MDBlOWxcdTAwZTltZW50cyBlbmZhbnQgY29udGllbm5lbnQgZGVzIHJcdTAwZTlmXHUwMGU5cmVuY2VzIG1hbnF1YW50ZXMNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cyPUlVUEwwMDA4VzogQ2V0IFx1MDBlOWxcdTAwZTltZW50IGRvaXQgXHUwMGVhdHJlIHNcdTAwZTlsZWN0aW9ublx1MDBlOSBhZmluIGRlIHJcdTAwZTlzb3VkcmUgdW5lIG91IHBsdXNpZXVycyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBtYW5xdWFudGVzDQotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMz1JVVBMMDAwOVc6IENldCBcdTAwZTlsXHUwMGU5bWVudCByXHUwMGU5Zlx1MDBlOXJlbmNlIHVuIG91IHBsdXNpZXVycyBcdTAwZTlsXHUwMGU5bWVudHMgZCd1biBwYWNrYWdlIG5vbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTkNCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbG9hZFJlc291cmNlc0Vycm9yX21zZz1JVVBMMDAwMEUgOiBMYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGEgXHUwMGU5dFx1MDBlOSBjaGFyZ1x1MDBlOWUgbWFpcyBkZXMgZXJyZXVycyBvbnQgXHUwMGU5dFx1MDBlOSBkXHUwMGU5dGVjdFx1MDBlOWVzLg0KLXVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfbXNnPUlVUEwwMDAxRSA6IENlIGNvbnNlaWwgbmUgcGV1dCBwYXMgXHUwMGVhdHJlIGNvbnZlcnRpIGRhbnMgdW4gYXV0cmUgdHlwZS4NCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDJFIDogQ2UgY29uc2VpbCBuZSBwZXV0IHBhcyBcdTAwZWF0cmUgY29udmVydGkgZGFucyBsZSB0eXBlIGNpYmxlLg0KLXNhdmVDb252ZXJ0ZWRHdWlkYW5jZUVycm9yX21zZz1JVVBMMDAwM0UgOiBJbXBvc3NpYmxlIGRlIHNhdXZlZ2FyZGVyIGxlIGNvbnNlaWwgY29udmVydGkgJyd7MH0nJy4NCi0NCi0jIENvbnZlcnQgYWN0aXZpdHkNCi1jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZT1FcnJldXIgZGUgY29udmVyc2lvbiBkZSB0eXBlIGQnYWN0aXZpdFx1MDBlOQ0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwNkUgOiBDZXR0ZSBhY3Rpdml0XHUwMGU5IG5lIHBldXQgcGFzIFx1MDBlYXRyZSBjb252ZXJ0aWUgZGFucyBsZSB0eXBlIGNpYmxlLg0KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0UgOiBJbXBvc3NpYmxlIGRlIHNhdXZlZ2FyZGVyIGwnJ2FjdGl2aXRcdTAwZTkgY29udmVydGllICcnezB9JycuDQotDQotIyBFcnJvciBSZWFzb25zDQotZXJyb3JfcmVhc29uPUlVUEwwMDA0RSA6IFVuZSBlcnJldXIgcydlc3QgcHJvZHVpdGUuIENsaXF1ZXogc3VyIE9LIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy4NCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX3JlYXNvbj1JbCBuJydleGlzdGUgYXVjdW4gdHlwZSBkZSBjb25zZWlsIGNvbXBhdGlibGUgcG91ciB7MH0uDQotaW52YWxpZExpYnJhcnlQYXRoRXJyb3JfcmVhc29uPUNoZW1pbiBkZSBiaWJsaW90aFx1MDBlOHF1ZSBub24gdmFsaWRlLiBMZSBmaWNoaWVyIHByb2pldCBuJ2EgcGFzIHB1IFx1MDBlYXRyZSBjclx1MDBlOVx1MDBlOS4NCi1jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbj1JbXBvc3NpYmxlIGRlIHZlcnJvdWlsbGVyIGxhIGJpYmxpb3RoXHUwMGU4cXVlLg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1jb3B5aW5nQXR0YWNobWVudHNUYXNrX25hbWU9Q29waWUgZGVzIHBpXHUwMGU4Y2VzIGpvaW50ZXMuLi4NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nDQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlPUNvbnZlcnRpciBsZSB0eXBlIGRlIGNvbnNlaWwNCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGV4dD1TXHUwMGU5bGVjdGlvbm5leiBsZSB0eXBlIGRlIGNvbnNlaWwgY2libGUuDQotDQotIyBHdWlkYW5jZSB0eXBlIG5hbWVzIGZvciBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZyAtIHNob3VsZCBiZSByZWZhY3RvcmVkIGludG8gbGlicmFyeS51aQ0KLWNoZWNrbGlzdF90ZXh0PUxpc3RlIGRlIGNvbnRyXHUwMGY0bGUNCi1jb25jZXB0X3RleHQ9Q29uY2VwdA0KLWV4YW1wbGVfdGV4dD1FeGVtcGxlDQotZ3VpZGVsaW5lX3RleHQ9SW5zdHJ1Y3Rpb25zDQotZXN0aW1hdGVfdGV4dD1Fc3RpbWF0aW9uDQotZXN0aW1hdGluZ01ldHJpY190ZXh0PU1lc3VyZSBkJ2VzdGltYXRpb24NCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dD1Db25zaWRcdTAwZTlyYXRpb25zIHJlbGF0aXZlcyBcdTAwZTAgbCdlc3RpbWF0aW9uDQotcmVwb3J0X3RleHQ9UmFwcG9ydA0KLXRlbXBsYXRlX3RleHQ9Q2FuZXZhcw0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PURvY3VtZW50IGQnYWNjb21wYWduZW1lbnQNCi10b29sTWVudG9yX3RleHQ9R3VpZGUgZCd1dGlsaXNhdGlvbiBkZSBsJ291dGlsDQotd2hpdGVwYXBlcl90ZXh0PUxpdnJlIGJsYW5jDQotdGVybURlZmluaXRpb25fdGV4dD1EXHUwMGU5ZmluaXRpb24gZGUgdGVybWUNCi1wcmFjdGljZV90ZXh0PVByYXRpcXVlDQotcmV1c2FibGVBc3NldF90ZXh0PVJlc3NvdXJjZSByXHUwMGU5dXRpbGlzYWJsZQ0KLQ0KLSNhY3Rpdml0eSBicmVha2Rvd24gaW5mbyBzdHJpbmdzDQotQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQ9RWZmZWN0dWUgZW4gdGFudCBxdWUgcHJvcHJpXHUwMGU5dGFpcmUNCi1BY3Rpdml0eUxheW91dF9hZGRpdGlvbmFsVGFza3NfdGV4dD1FZmZlY3R1ZSBlbiBzdXBwbFx1MDBlOW1lbnQNCi0NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRXJyb3IgTWVzc2FnZXMNCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl90aXRsZT1FcnJldXIgZGUgY29udmVyc2lvbiBkdSB0eXBlIGRlIGNvbnNlaWwNCi0NCi0jIExvYWQgUmVzb3VyY2VzIEVycm9yIERpYWxvZw0KLWxvYWRSZXNvdXJjZXNFcnJvcl90aXRsZT1FcnJldXIgZCdvdXZlcnR1cmUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb249Q2VydGFpbmVzIHJlc3NvdXJjZXMgZGUgYmlibGlvdGhcdTAwZThxdWUgbidvbnQgcGFzIHB1IFx1MDBlYXRyZSBjaGFyZ1x1MDBlOWVzLlxuXG5DbGlxdWV6IHN1ciBEXHUwMGU5dGFpbHMgcG91ciByXHUwMGU5dmlzZXIgbGVzIGVycmV1cnMgZXQgbGVzIHJcdTAwZTlzb3VkcmUgYXZhbnQgZCdham91dGVyIGRhdmFudGFnZSBkZSBtb2RpZmljYXRpb25zIFx1MDBlMCBsYSBiaWJsaW90aFx1MDBlOHF1ZS4NCi0NCi0jIFJvbGUgRGlhZ3JhbXMNCi1yb2xlRGlhZ3JhbVBlcmZvcm1zX3RleHQ9ZXhcdTAwZTljdXRlDQotcm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0PXJlc3BvbnNhYmxlIGRlDQotDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMD1FbFx1MDBlOW1lbnQgclx1MDBlOWZcdTAwZTlyZW5jXHUwMGU5IDogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMT1JbmZvIDogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHND1BdmVydGlzc2VtZW50IDogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNz1FcnJldXIgOiB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMD1FbFx1MDBlOW1lbnQgclx1MDBlOWZcdTAwZTlyZW5jXHUwMGU5IHswfSBtYW5xdWFudA0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzExPUltcG9zc2libGUgZGUgdHJvdXZlciBkJydcdTAwZTlsXHUwMGU5bWVudCBwb3VyIGwnJ2lkZW50aWZpY2F0ZXVyIGdsb2JhbCB1bmlxdWUgezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTI9TGUgZmljaGllciAnJ3swfScnIHJcdTAwZTlmXHUwMGU5cmVuY2UgbGEgcmVzc291cmNlIG1hbnF1YW50ZSAnJ3sxfScnDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTU9RmljaGllciBkZSByZXNzb3VyY2VzICcnezB9JycgbWFucXVhbnQNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNz1Db25uZXhpb24gXHUwMGUwIGwnJ1VSTCAnJ3swfScnIGltcG9zc2libGUNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxOT1Db25uZXhpb24gXHUwMGUwIGwnJ1VSTCAnJ3swfScnIGltcG9zc2libGUgOiB7MX0NCi1JbXBvcnRFeHBvcnRVdGlsX01TRzg9RmljaGllciAnJ3swfScnIGludHJvdXZhYmxlLg0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOT1JbXBvc3NpYmxlIGRlIGNyXHUwMGU5ZXIgbGUgclx1MDBlOXBlcnRvaXJlIHRlbXBvcmFpcmUgJyd7MH0nJy4NCi11bmtub3duR3VpZGFuY2VfdGV4dD1JbmNvbm51DQotDQotQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbl9sb2dfbm9Db250ZW50UGF0aD1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uLkhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luOiBhdWN1biBjaGVtaW4gZGUgY29udGVudSBwb3VyIHswfQ0KLUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXJfY2Fubm90VXBkYXRlPUlVUEwwMDA2VyA6IEltcG9zc2libGUgZGUgbWV0dHJlIFx1MDBlMCBqb3VyIHswfSB7MX0NCi13YXJuaW5nRGxnX3RpdGxlPUF2ZXJ0aXNzZW1lbnQNCi1lcnJvckRsZ190aXRsZT1FcnJldXINCi1lcnJvckRsZ19zYXZlRXJyb3I9SVVQTDAwMDVFIDogRXJyZXVyIGxvcnMgZGUgbCcnZW5yZWdpc3RyZW1lbnQgZGVzIG1vZGlmaWNhdGlvbnMgZGFucyBsZSBmaWNoaWVyICcnezB9JycNCi0NCi0jIGFjdGl2aXR5IGRpYWdyYW0gbmFtZXMNCi1hY3Rpdml0eURpYWdyYW1OYW1lPURpYWdyYW1tZSBkJydhY3Rpdml0XHUwMGU5IDogezB9DQotYWN0aXZpdHlEZXRhaWxEaWFncmFtTmFtZT1EaWFncmFtbWUgZFx1MDBlOXRhaWxsXHUwMGU5IGQnJ2FjdGl2aXRcdTAwZTkgOiB7MH0NCi13cERlcGVuZGVuY3lEaWFncmFtTmFtZT1EaWFncmFtbWUgZGUgZFx1MDBlOXBlbmRhbmNlIGRlIHByb2R1aXQgZGUgdHJhdmFpbCA6IHswfQ0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFJvbGUgZGlhZ3JhbSBmb250cyBhbmQgbGF5b3V0DQotcm9sZURpYWdyYW1Gb250X25hbWU9QXJpYWwNCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMj1BcmlhbA0KLXJvbGVEaWFncmFtRm9udF9zaXplPTEwDQotcm9sZURpYWdyYW1Gb250X3NpemVfd2luMzI9MTANCi1yb2xlRGlhZ3JhbV94TWFyZ2luPTIwMA0KLXJvbGVEaWFncmFtX3hTcGFjaW5nPTcwDQotcm9sZURpYWdyYW1feVNwYWNpbmc9MzANCi0NCi0jIGxvY2FsaXplIHRoZSB2YWx1ZSBiYXNlZCBvbiBsb2NhbGUuICBmb3IgZXhhbXBsZSwgDQotIyBmb3IgRW5nbGlzaCwgdGhlIHZhbHVlIGlzICIuICINCi0jY29sb25fd2l0aF9zcGFjZT06IA0KLSMgZm9yIGZyZW5jaCwgdGhlIHZhbHVlIGlzICIgLiAiLCB5b3UgbmVlZCB0byB1c2UgYSBcIHRvIHByZXNlcnZlIHRoZSBsZWFkaW5nIHNwYWNlDQotI2NvbG9uX3dpdGhfc3BhY2U9XCA6IA0KLSMgZm9yIGNoaW5lc2UsIHRoZSBjb2xvbiBzaG91bGQgYmUgZG91YmxlIGJ5dGVzDQotIyBEb250IHRyaW0gdGhlIHNwYWNlcyBhZnRlciB0aGUgY29sb24uDQotY29sb25fd2l0aF9zcGFjZT1cIDogDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMTdhYzkzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi11bmtub3duX3RleHQ9U2Nvbm9zY2l1dG8gDQotIyBFcnJvciBSZWFzb25zDQotZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1JbCBwZXJjb3JzbyBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIFx1MDBlOCB2dW90by4NCi1taXNzaW5nTGlicmFyeUZpbGVFcnJvcl9yZWFzb249SWwgZmlsZSBkZWwgbW9kZWxsbyBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIG1hbmNhLg0KLXVucmVzb2x2ZWRQcm94eUVycm9yX3JlYXNvbj1MYSBsaWJyZXJpYSBkZWkgbWV0b2RpIHNlbGV6aW9uYXRhIGNvbnRpZW5lIHJpZmVyaW1lbnRpIGFkIGVsZW1lbnRpIG5vbiByaXNvbHRpLiBEaSBzb2xpdG8sIHF1ZXN0byBwcm9ibGVtYSBcdTAwZTggY2F1c2F0byBkYSBmaWxlIFhNSSBjaGUgbWFuY2FubyBvIGNoZSBzb25vIHN0YXRpIHNwb3N0YXRpIG5lbGxhIGNhcnRlbGxhIGRlbGxlIGxpYnJlcmllLlxuXG5DaGl1ZGVyZSBxdWVzdGEgZmluZXN0cmEgZGkgZGlhbG9nbyBlIHZpc3VhbGl6emFyZSBsYSB2aXN0YSBQcm9ibGVtaSBwZXIgaWRlbnRpZmljYXJlIGkgcmlmZXJpbWVudGkgbm9uIHJpc29sdGkuIFBlciBldml0YXJlIGNoZSBsYSBsaWJyZXJpYSBzaSBkYW5uZWdnaSwgc2kgY29uc2lnbGlhIGRpIHJpc29sdmVyZSBxdWVzdGkgcmlmZXJpbWVudGkgcHJpbWEgZGkgYXBwb3J0YXJlIHVsdGVyaW9yaSBtb2RpZmljaGUgYWxsYSBsaWJyZXJpYS4NCi0NCi0jIFdhcm5pbmcgTWVzc2FnZXMNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cxPUlVUEwwMDA3VzogVW5vIG8gcGlcdTAwZjkgZWxlbWVudGkgY2hpbGQgY29udGVuZ29ubyByaWZlcmltZW50aSBtYW5jYW50aQ0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzI9SVVQTDAwMDhXOiBRdWVzdG8gZWxlbWVudG8gZG92cmViYmUgZXNzZXJlIHNlbGV6aW9uYXRvIHBlciByaXNvbHZlcmUgdW5vIG8gcGlcdTAwZjkgZWxlbWVudGkgbWFuY2FudGkNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2czPUlVUEwwMDA5VzogUXVlc3RvIGVsZW1lbnRvIGZhIHJpZmVyaW1lbnRvIGEgdW5vIG8gcGlcdTAwZjkgZWxlbWVudGkgZGkgdW4gcGFjY2hldHRvIG5vbiBzZWxlemlvbmF0bw0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1sb2FkUmVzb3VyY2VzRXJyb3JfbXNnPUlVUEwwMDAwRTogTGEgbGlicmVyaWEgZGVpIG1ldG9kaSBcdTAwZTggc3RhdGEgY2FyaWNhdGEsIG1hIHNvbm8gc3RhdGkgcmlsZXZhdGkgYWxjdW5pIGVycm9yaS4NCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZz1JVVBMMDAwMUU6IFF1ZXN0YSBndWlkYSBub24gcHVcdTAwZjIgZXNzZXJlIGNvbnZlcnRpdGEgaW4gdW4gYWx0cm8gdGlwby4NCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDJFOiBRdWVzdGEgZ3VpZGEgbm9uIHB1XHUwMGYyIGVzc2VyZSBjb252ZXJ0aXRhIG5lbCB0aXBvIGRpIGRlc3RpbmF6aW9uZS4NCi1zYXZlQ29udmVydGVkR3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDNFOiBMYSBndWlkYSBjb252ZXJ0aXRhICcnezB9Jycgbm9uIHB1XHUwMGYyIGVzc2VyZSBzYWx2YXRhLg0KLQ0KLSMgQ29udmVydCBhY3Rpdml0eQ0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlPUVycm9yZSBkdXJhbnRlIGxhIGNvbnZlcnNpb25lIGRlbCB0aXBvIGRpIGF0dGl2aXRcdTAwZTANCi1jb252ZXJ0QWN0aXZpdHlFcnJvcl9tc2c9SVVQTDAwMDZFOiBRdWVzdGEgYXR0aXZpdFx1MDBlMCBub24gcHVcdTAwZjIgZXNzZXJlIGNvbnZlcnRpdGEgbmVsIHRpcG8gZGkgZGVzdGluYXppb25lLg0KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0U6IEwnJ2F0dGl2aXRcdTAwZTAgY29udmVydGl0YSAnJ3swfScnIG5vbiBwdVx1MDBmMiBlc3NlcmUgc2FsdmF0YS4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQTDAwMDRFOiBTaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUuIEZhcmUgY2xpYyBzdSBPSyBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4NCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX3JlYXNvbj1Ob24gYycnXHUwMGU4IHVuIHRpcG8gZGkgZ3VpZGEgY29tcGF0aWJpbGUgcGVyIHswfS4NCi1pbnZhbGlkTGlicmFyeVBhdGhFcnJvcl9yZWFzb249UGVyY29yc28gZGVsbGEgbGlicmVyaWEgbm9uIHZhbGlkby4gSW1wb3NzaWJpbGUgY3JlYXJlIGlsIGZpbGUgLnByb2plY3QuDQotY291bGROb3RMb2NrTGlicmFyeV9yZWFzb249SW1wb3NzaWJpbGUgYmxvY2NhcmUgbGEgbGlicmVyaWEuDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWNvcHlpbmdBdHRhY2htZW50c1Rhc2tfbmFtZT1Db3BpYSBkZWdsaSBhbGxlZ2F0aSBpbiBjb3Jzby4uLg0KLQ0KLSMgQ29udmVydCBHdWlkYW5jZSBEaWFsb2cNCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGU9Q29udmVydGkgdGlwbyBkaSBndWlkYQ0KLWNvbnZlcnRHdWlkYW5jZURpYWxvZ190ZXh0PVNlbGV6aW9uYXJlIGlsIHRpcG8gZGkgZ3VpZGEgZGkgZGVzdGluYXppb25lLg0KLQ0KLSMgR3VpZGFuY2UgdHlwZSBuYW1lcyBmb3IgQ29udmVydCBHdWlkYW5jZSBEaWFsb2cgLSBzaG91bGQgYmUgcmVmYWN0b3JlZCBpbnRvIGxpYnJhcnkudWkNCi1jaGVja2xpc3RfdGV4dD1FbGVuY28gZGkgY29udHJvbGxvDQotY29uY2VwdF90ZXh0PUNvbmNldHRvDQotZXhhbXBsZV90ZXh0PUVzZW1waW8NCi1ndWlkZWxpbmVfdGV4dD1MaW5lYSBndWlkYQ0KLWVzdGltYXRlX3RleHQ9VmFsdXRhemlvbmUNCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9TWV0cmljYSBkaSB2YWx1dGF6aW9uZQ0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PUNvbnNpZGVyYXppb25pIHN1bGxhIHZhbHV0YXppb25lDQotcmVwb3J0X3RleHQ9UmVwb3J0DQotdGVtcGxhdGVfdGV4dD1Nb2RlbGxvDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9TWF0ZXJpYWxlIGRpIHN1cHBvcnRvDQotdG9vbE1lbnRvcl90ZXh0PUd1aWRhIGFsIHRvb2wNCi13aGl0ZXBhcGVyX3RleHQ9V2hpdGVwYXBlcg0KLXRlcm1EZWZpbml0aW9uX3RleHQ9RGVmaW5pemlvbmUgdGVybWluZQ0KLXByYWN0aWNlX3RleHQ9UHJvY2VkdXJhDQotcmV1c2FibGVBc3NldF90ZXh0PVJpc29yc2Egcml1dGlsaXp6YWJpbGUNCi0NCi0jYWN0aXZpdHkgYnJlYWtkb3duIGluZm8gc3RyaW5ncw0KLUFjdGl2aXR5TGF5b3V0X3ByaW1hcnlUYXNrc190ZXh0PUVzZWd1ZSBjb21lIHByb3ByaWV0YXJpbw0KLUFjdGl2aXR5TGF5b3V0X2FkZGl0aW9uYWxUYXNrc190ZXh0PUVzZWd1ZSBjb21lIGFnZ2l1bnRpdm8NCi0NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRXJyb3IgTWVzc2FnZXMNCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl90aXRsZT1FcnJvcmUgZHVyYW50ZSBsYSBjb252ZXJzaW9uZSBkZWwgdGlwbyBkaSBndWlkYQ0KLQ0KLSMgTG9hZCBSZXNvdXJjZXMgRXJyb3IgRGlhbG9nDQotbG9hZFJlc291cmNlc0Vycm9yX3RpdGxlPUVycm9yZSBkdXJhbnRlIGwnYXBlcnR1cmEgZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaQ0KLWxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb249Tm9uIFx1MDBlOCBzdGF0byBwb3NzaWJpbGUgY2FyaWNhcmUgYWxjdW5lIHJpc29yc2UgZGVsbGEgbGlicmVyaWEuXG5cbkZhcmUgY2xpYyBzdSBEZXR0YWdsaSBwZXIgZXNhbWluYXJlIGdsaSBlcnJvcmkgZSByaXNvbHZlcmxpIHByaW1hIGRpIGFwcG9ydGFyZSB1bHRlcmlvcmkgbW9kaWZpY2hlIGFsbGEgbGlicmVyaWEuDQotDQotIyBSb2xlIERpYWdyYW1zDQotcm9sZURpYWdyYW1QZXJmb3Jtc190ZXh0PWVzZWd1ZQ0KLXJvbGVEaWFncmFtUmVzcG9uc2libGVGb3JfdGV4dD1yZXNwb25zYWJpbGUgZGkNCi0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cwPUVsZW1lbnRvIGEgY3VpIHNpIGZhIHJpZmVyaW1lbnRvOiB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxPUluZm86IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzQ9QXZ2aXNvOiB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c3PUVycm9yZTogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9RWxlbWVudG8gYSBjdWkgc2kgZmEgcmlmZXJpbWVudG8gbWFuY2FudGUgezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTE9SW1wb3NzaWJpbGUgdHJvdmFyZSBsJydlbGVtZW50byBwZXIgaWwgZ3VpZCB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMj1JbCBmaWxlICcnezB9JycgZmEgcmlmZXJpbWVudG8gYWxsYSByaXNvcnNhIG1hbmNhbnRlICcnezF9JycNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNT1GaWxlIGRpIHJpc29yc2UgbWFuY2FudGUgJyd7MH0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE3PUltcG9zc2liaWxlIGNvbm5ldHRlcnNpIGFsbCcnVVJMICcnezB9JycNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxOT1JbXBvc3NpYmlsZSBjb25uZXR0ZXJzaSBhbGwnJ1VSTCAnJ3swfScnOiB7MX0NCi1JbXBvcnRFeHBvcnRVdGlsX01TRzg9SW1wb3NzaWJpbGUgdHJvdmFyZSBpbCBmaWxlICcnezB9JycuDQotSW1wb3J0RXhwb3J0VXRpbF9NU0c5PUltcG9zc2liaWxlIGNyZWFyZSBsYSBkaXJlY3RvcnkgdGVtcCAnJ3swfScnLg0KLXVua25vd25HdWlkYW5jZV90ZXh0PVNjb25vc2NpdXRvIA0KLUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb25fbG9nX25vQ29udGVudFBhdGg9Q29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5IYW5kbGVBdHRhY2htZW50c1BsdWdpbjogbm8gY29udGVudFBhdGggZm9yIHswfQ0KLUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXJfY2Fubm90VXBkYXRlPUlVUEwwMDA2VzogSW1wb3NzaWJpbGUgYWdnaW9ybmFyZSB7MH0gezF9DQotd2FybmluZ0RsZ190aXRsZT1BdnZpc28NCi1lcnJvckRsZ190aXRsZT1FcnJvcmUNCi1lcnJvckRsZ19zYXZlRXJyb3I9SVVQTDAwMDVFOiBTaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUgZHVyYW50ZSBsZSBtb2RpZmljaGUgYWwgZmlsZSAnJ3swfScnDQotDQotIyBhY3Rpdml0eSBkaWFncmFtIG5hbWVzDQotYWN0aXZpdHlEaWFncmFtTmFtZT1EaWFncmFtbWEgYXR0aXZpdFx1MDBlMDogezB9DQotYWN0aXZpdHlEZXRhaWxEaWFncmFtTmFtZT1EaWFncmFtbWEgZGV0dGFnbGkgYXR0aXZpdFx1MDBlMDogezB9DQotd3BEZXBlbmRlbmN5RGlhZ3JhbU5hbWU9RGlhZ3JhbW1hIGRpcGVuZGVuemUgcHJvZG90dG8gZGkgbGF2b3JvOiB7MH0NCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBSb2xlIGRpYWdyYW0gZm9udHMgYW5kIGxheW91dA0KLXJvbGVEaWFncmFtRm9udF9uYW1lPUFyaWFsDQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI9QXJpYWwNCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZT0xMA0KLXJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyPTEwDQotcm9sZURpYWdyYW1feE1hcmdpbj0yMDANCi1yb2xlRGlhZ3JhbV94U3BhY2luZz03MA0KLXJvbGVEaWFncmFtX3lTcGFjaW5nPTMwDQotDQotIyBsb2NhbGl6ZSB0aGUgdmFsdWUgYmFzZWQgb24gbG9jYWxlLiAgZm9yIGV4YW1wbGUsIA0KLSMgZm9yIEVuZ2xpc2gsIHRoZSB2YWx1ZSBpcyAiLiAiDQotI2NvbG9uX3dpdGhfc3BhY2U9OiANCi0jIGZvciBmcmVuY2gsIHRoZSB2YWx1ZSBpcyAiIC4gIiwgeW91IG5lZWQgdG8gdXNlIGEgXCB0byBwcmVzZXJ2ZSB0aGUgbGVhZGluZyBzcGFjZQ0KLSNjb2xvbl93aXRoX3NwYWNlPVwgOiANCi0jIGZvciBjaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcw0KLSMgRG9udCB0cmltIHRoZSBzcGFjZXMgYWZ0ZXIgdGhlIGNvbG9uLg0KLWNvbG9uX3dpdGhfc3BhY2U9OiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhZGUzYTAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXVua25vd25fdGV4dD1cdTRlMGRcdTY2MGUNCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lbXB0eUxpYnJhcnlQYXRoRXJyb3JfcmVhc29uPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkMVx1MzBiOVx1MzA0Y1x1N2E3YVx1MzA2N1x1MzA1OVx1MzAwMg0KLW1pc3NpbmdMaWJyYXJ5RmlsZUVycm9yX3JlYXNvbj1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZTJcdTMwYzdcdTMwZWJcdTMwZmJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi11bnJlc29sdmVkUHJveHlFcnJvcl9yZWFzb249XHU2NzJhXHU4OWUzXHU2YzdhXHUzMDZlXHU4OTgxXHU3ZDIwXHU1M2MyXHU3MTY3XHUzMDRjXHU1NDJiXHUzMDdlXHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDRjXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIFx1MzA1M1x1MzA4Y1x1MzA2Zlx1OTAxYVx1NWUzOFx1MzAwMVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1NTE4NVx1MzA2YiBYTUkgXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHUzMDZhXHUzMDQ0XHUzMDRiXHU3OWZiXHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDVmXHUzMDUzXHUzMDY4XHUzMDRjXHU1MzlmXHU1NmUwXHUzMDY3XHUzMDU5XHUzMDAyXG5cblx1MzA1M1x1MzA2ZVx1MzBjMFx1MzBhNFx1MzBhMlx1MzBlZFx1MzBiMFx1MzA5Mlx1OTU4OVx1MzA1OFx1MzA2Nlx1MzAwMVx1NjcyYVx1ODllM1x1NmM3YVx1MzA2ZVx1NTNjMlx1NzE2N1x1MzA5Mlx1OGI1OFx1NTIyNVx1MzA1OVx1MzA4Ylx1MzA2ZVx1MzA2Ylx1NGZiZlx1NTIyOVx1MzA2YVx1MzAwY1x1NTU0Zlx1OTg0Y1x1MzAwZFx1MzBkM1x1MzBlNVx1MzBmY1x1MzA5Mlx1OGQ3N1x1NTJkNVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTc4MzRcdTY0MGRcdTMwOTJcdTk2MzJcdTMwNTBcdTMwNWZcdTMwODFcdTMwMDFcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmJcdTMwNTVcdTMwODlcdTMwNmJcdTU5MDlcdTY2ZjRcdTMwOTJcdTUyYTBcdTMwNDhcdTMwOGJcdTUyNGRcdTMwNmJcdTMwMDFcdTMwNTNcdTMwOGNcdTMwODlcdTMwNmVcdTUzYzJcdTcxNjdcdTMwOTJcdTg5ZTNcdTZjN2FcdTMwNTdcdTMwNjZcdTMwNGFcdTMwNGZcdTMwNTNcdTMwNjhcdTMwOTJcdTVmMzdcdTMwNGZcdTMwNGFcdTUyZTdcdTMwODFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIFdhcm5pbmcgTWVzc2FnZXMNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cxPUlVUEwwMDA3VzogMSBcdTMwNjRcdTRlZTVcdTRlMGFcdTMwNmVcdTViNTBcdTg5ODFcdTdkMjBcdTMwNmJcdTMwMDFcdTZiMjBcdTg0M2RcdTMwNTdcdTMwNWZcdTUzYzJcdTcxNjdcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cyPUlVUEwwMDA4VzogMSBcdTMwNjRcdTRlZTVcdTRlMGFcdTMwNmVcdTZiMjBcdTg0M2RcdTMwNTdcdTMwNWZcdTUzYzJcdTcxNjdcdTMwOTJcdTg5ZTNcdTZjN2FcdTMwNTlcdTMwOGJcdTMwNWZcdTMwODFcdTMwNmJcdTMwMDFcdTMwNTNcdTMwNmVcdTg5ODFcdTdkMjBcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2czPUlVUEwwMDA5VzogXHUzMDUzXHUzMDZlXHU4OTgxXHU3ZDIwXHUzMDZmXHUzMDAxXHU2NzJhXHU5MDc4XHU2MjllXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHU1MTg1XHUzMDZlIDEgXHUzMDY0XHU0ZWU1XHU0ZTBhXHUzMDZlXHU4OTgxXHU3ZDIwXHUzMDkyXHU1M2MyXHU3MTY3XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9tc2c9SVVQTDAwMDBFOiBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNGNcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwNGNcdTMwMDFcdTMwNDRcdTMwNGZcdTMwNjRcdTMwNGJcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTY5MWNcdTUxZmFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZz1JVVBMMDAwMUU6IFx1MzA1M1x1MzA2ZVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA2Zlx1NTIyNVx1MzA2ZVx1MzBiZlx1MzBhNFx1MzBkN1x1MzA2Ylx1NTkwOVx1NjNkYlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLWNvbnZlcnRHdWlkYW5jZUVycm9yX21zZz1JVVBMMDAwMkU6IFx1MzA1M1x1MzA2ZVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA2Zlx1MzBiZlx1MzBmY1x1MzBiMlx1MzBjM1x1MzBjOFx1MzBmYlx1MzBiZlx1MzBhNFx1MzBkN1x1MzA2Ylx1NTkwOVx1NjNkYlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLXNhdmVDb252ZXJ0ZWRHdWlkYW5jZUVycm9yX21zZz1JVVBMMDAwM0U6IFx1NTkwOVx1NjNkYlx1NmUwOFx1MzA3Zlx1MzA2ZVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOSAnJ3swfScnIFx1MzA5Mlx1NGZkZFx1N2JhMVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLQ0KLSMgQ29udmVydCBhY3Rpdml0eQ0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzBmYlx1MzBiZlx1MzBhNFx1MzBkN1x1MzBmYlx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2ZVx1NTkwOVx1NjNkYg0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwNkU6IFx1MzA1M1x1MzA2ZVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2Zlx1MzBiZlx1MzBmY1x1MzBiMlx1MzBjM1x1MzBjOFx1MzBmYlx1MzBiZlx1MzBhNFx1MzBkN1x1MzA2Ylx1NTkwOVx1NjNkYlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0U6IFx1NTkwOVx1NjNkYlx1NmUwOFx1MzA3Zlx1MzA2ZVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmYyAnJ3swfScnIFx1MzA5Mlx1NGZkZFx1N2JhMVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1JVVBMMDAwNEU6IFx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdThhNzNcdTMwNTdcdTMwNGZcdTMwNmZcdTMwMDFcdTMwMGNPS1x1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfcmVhc29uPXswfSBcdTMwNmJcdTMwNmZcdTMwMDFcdTRlOTJcdTYzZGJcdTYwMjdcdTMwNmVcdTMwNDJcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwZmJcdTMwYmZcdTMwYTRcdTMwZDdcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1pbnZhbGlkTGlicmFyeVBhdGhFcnJvcl9yZWFzb249XHU3MTIxXHU1MmI5XHUzMDZhXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQxXHUzMGI5XHUzMDAyIC5wcm9qZWN0IFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLWNvdWxkTm90TG9ja0xpYnJhcnlfcmVhc29uPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1MzBlZFx1MzBjM1x1MzBhZlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1jb3B5aW5nQXR0YWNobWVudHNUYXNrX25hbWU9XHU2ZGZiXHU0ZWQ4XHUzMDkyXHUzMGIzXHUzMGQ0XHUzMGZjXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotDQotIyBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZw0KLWNvbnZlcnRHdWlkYW5jZURpYWxvZ190aXRsZT1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwZmJcdTMwYmZcdTMwYTRcdTMwZDdcdTMwNmVcdTU5MDlcdTYzZGINCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGV4dD1cdTMwYmZcdTMwZmNcdTMwYjJcdTMwYzNcdTMwYzhcdTMwNmVcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwZmJcdTMwYmZcdTMwYTRcdTMwZDdcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIEd1aWRhbmNlIHR5cGUgbmFtZXMgZm9yIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nIC0gc2hvdWxkIGJlIHJlZmFjdG9yZWQgaW50byBsaWJyYXJ5LnVpDQotY2hlY2tsaXN0X3RleHQ9XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMGVhXHUzMGI5XHUzMGM4DQotY29uY2VwdF90ZXh0PVx1Njk4Mlx1NWZmNQ0KLWV4YW1wbGVfdGV4dD1cdTRmOGINCi1ndWlkZWxpbmVfdGV4dD1cdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjMNCi1lc3RpbWF0ZV90ZXh0PVx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YQ0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dD1cdTg5OGJcdTdhNGRcdTMwODJcdTMwOGFcdTMwZTFcdTMwYzhcdTMwZWFcdTMwYzNcdTMwYWYNCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dD1cdTg5OGJcdTdhNGRcdTMwODJcdTMwOGFcdTgwMDNcdTYxNmVcdTRlOGJcdTk4MDUNCi1yZXBvcnRfdGV4dD1cdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzgNCi10ZW1wbGF0ZV90ZXh0PVx1MzBjNlx1MzBmM1x1MzBkN1x1MzBlY1x1MzBmY1x1MzBjOA0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1OGNjN1x1NjU5OQ0KLXRvb2xNZW50b3JfdGV4dD1cdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmMNCi13aGl0ZXBhcGVyX3RleHQ9XHUzMGRiXHUzMGVmXHUzMGE0XHUzMGM4XHUzMGZiXHUzMGRhXHUzMGZjXHUzMGQxXHUzMGZjDQotdGVybURlZmluaXRpb25fdGV4dD1cdTc1MjhcdThhOWVcdTViOWFcdTdmYTkNCi1wcmFjdGljZV90ZXh0PVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOQ0KLXJldXNhYmxlQXNzZXRfdGV4dD1cdTUxOGRcdTUyMjlcdTc1MjhcdTUzZWZcdTgwZmRcdTMwNmFcdTMwYTJcdTMwYmJcdTMwYzNcdTMwYzgNCi0NCi0jYWN0aXZpdHkgYnJlYWtkb3duIGluZm8gc3RyaW5ncw0KLUFjdGl2aXR5TGF5b3V0X3ByaW1hcnlUYXNrc190ZXh0PVx1NjI0MFx1NjcwOVx1ODAwNVx1MzA2OFx1MzA1N1x1MzA2Nlx1NWI5Zlx1ODg0Yw0KLUFjdGl2aXR5TGF5b3V0X2FkZGl0aW9uYWxUYXNrc190ZXh0PVx1OGZmZFx1NTJhMFx1MzA2OFx1MzA1N1x1MzA2Nlx1NWI5Zlx1ODg0Yw0KLQ0KLQ0KLSMgQ29udmVydCBHdWlkYW5jZSBFcnJvciBNZXNzYWdlcw0KLWNvbnZlcnRHdWlkYW5jZUVycm9yX3RpdGxlPVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzBmYlx1MzBiZlx1MzBhNFx1MzBkN1x1MzBmYlx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2ZVx1NTkwOVx1NjNkYg0KLQ0KLSMgTG9hZCBSZXNvdXJjZXMgRXJyb3IgRGlhbG9nDQotbG9hZFJlc291cmNlc0Vycm9yX3RpdGxlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzBmYlx1MzBhOFx1MzBlOVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0Zg0KLWxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb249XHU0ZTAwXHU5MGU4XHUzMDZlXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDkyXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyXG5cblx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Ylx1MzA1NVx1MzA4OVx1MzA2Ylx1NTkwOVx1NjZmNFx1MzA5Mlx1NTJhMFx1MzA0OFx1MzA4Ylx1NTI0ZFx1MzA2Ylx1MzAwMVx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzBhOFx1MzBlOVx1MzBmY1x1MzA5Mlx1NjkxY1x1OGEwZVx1MzA1N1x1MzAwMVx1ODllM1x1NmM3YVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLQ0KLSMgUm9sZSBEaWFncmFtcw0KLXJvbGVEaWFncmFtUGVyZm9ybXNfdGV4dD1cdTViOWZcdTg4NGMNCi1yb2xlRGlhZ3JhbVJlc3BvbnNpYmxlRm9yX3RleHQ9XHU2MmM1XHU1ZjUzDQotDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMD1cdTUzYzJcdTcxNjdcdTViZmVcdThjNjFcdTMwNmVcdTg5ODFcdTdkMjA6IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE9XHU2MGM1XHU1ODMxOiB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c0PVx1OGI2Nlx1NTQ0YTogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNz1cdTMwYThcdTMwZTlcdTMwZmM6IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEwPVx1NTNjMlx1NzE2N1x1NWJmZVx1OGM2MVx1MzA2ZVx1ODk4MVx1N2QyMFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MyB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMT1ndWlkIHswfSBcdTMwNmVcdTg5ODFcdTdkMjBcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMj1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgJyd7MH0nJyBcdTMwNmZcdTMwMDFcdTZiMjBcdTg0M2RcdTMwNTdcdTMwNWZcdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjkgJyd7MX0nJyBcdTMwOTJcdTUzYzJcdTcxNjdcdTMwNTdcdTMwN2VcdTMwNTkNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNT1cdTZiMjBcdTg0M2RcdTMwNTdcdTMwNWZcdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwZmJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgJyd7MH0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE3PVVSTCAnJ3swfScnIFx1MzA2Ylx1NjNhNVx1N2Q5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE5PVVSTCAnJ3swfScnOiB7MX0gXHUzMDZiXHU2M2E1XHU3ZDlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzDQotSW1wb3J0RXhwb3J0VXRpbF9NU0c4PVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiAnJ3swfScnIFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOT1cdTRlMDBcdTY2NDJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmMgJyd7MH0nJyBcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDINCi11bmtub3duR3VpZGFuY2VfdGV4dD1cdTRlMGRcdTY2MGUNCi0NCi1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uX2xvZ19ub0NvbnRlbnRQYXRoPUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uSGFuZGxlQXR0YWNobWVudHNQbHVnaW46IHswfSBcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwZmJcdTMwZDFcdTMwYjlcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMNCi1MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyX2Nhbm5vdFVwZGF0ZT1JVVBMMDAwNlc6IHswfSB7MX0gXHUzMDkyXHU2NmY0XHU2NWIwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzDQotd2FybmluZ0RsZ190aXRsZT1cdThiNjZcdTU0NGENCi1lcnJvckRsZ190aXRsZT1cdTMwYThcdTMwZTlcdTMwZmMNCi1lcnJvckRsZ19zYXZlRXJyb3I9SVVQTDAwMDVFOiBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgJyd7MH0nJyBcdTMwNzhcdTMwNmVcdTU5MDlcdTY2ZjRcdTMwNmVcdTRmZGRcdTdiYTFcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYNCi0NCi0jIGFjdGl2aXR5IGRpYWdyYW0gbmFtZXMNCi1hY3Rpdml0eURpYWdyYW1OYW1lPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1NTZmMzogezB9DQotYWN0aXZpdHlEZXRhaWxEaWFncmFtTmFtZT1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdThhNzNcdTdkMzBcdTU2ZjM6IHswfQ0KLXdwRGVwZW5kZW5jeURpYWdyYW1OYW1lPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1NGY5ZFx1NWI1OFx1OTVhMlx1NGZjMlx1NTZmMzogezB9DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgUm9sZSBkaWFncmFtIGZvbnRzIGFuZCBsYXlvdXQNCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZT1cdTMwYzBcdTMwYTRcdTMwYTJcdTMwZWRcdTMwYjANCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMj1NUyBHb3RoaWMNCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZT0xMA0KLXJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyPTEwDQotcm9sZURpYWdyYW1feE1hcmdpbj0yMDANCi1yb2xlRGlhZ3JhbV94U3BhY2luZz03MA0KLXJvbGVEaWFncmFtX3lTcGFjaW5nPTMwDQotDQotIyBsb2NhbGl6ZSB0aGUgdmFsdWUgYmFzZWQgb24gbG9jYWxlLiAgZm9yIGV4YW1wbGUsIA0KLSMgZm9yIEVuZ2xpc2gsIHRoZSB2YWx1ZSBpcyAiLiAiDQotI2NvbG9uX3dpdGhfc3BhY2U9OiANCi0jIGZvciBmcmVuY2gsIHRoZSB2YWx1ZSBpcyAiIC4gIiwgeW91IG5lZWQgdG8gdXNlIGEgXCB0byBwcmVzZXJ2ZSB0aGUgbGVhZGluZyBzcGFjZQ0KLSNjb2xvbl93aXRoX3NwYWNlPVwgOiANCi0jIGZvciBjaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcw0KLSMgRG9udCB0cmltIHRoZSBzcGFjZXMgYWZ0ZXIgdGhlIGNvbG9uLg0KLWNvbG9uX3dpdGhfc3BhY2U9OiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkN2IzOTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXVua25vd25fdGV4dD1cdWM1NGMgXHVjMjE4IFx1YzVjNlx1Yzc0Yw0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVtcHR5TGlicmFyeVBhdGhFcnJvcl9yZWFzb249XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWFjYmRcdWI4NWNcdWFjMDAgXHViZTQ0XHVjNWI0IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1taXNzaW5nTGlicmFyeUZpbGVFcnJvcl9yZWFzb249XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWJhYThcdWIzNzggXHVkMzBjXHVjNzdjXHVjNzc0IFx1YjIwNFx1Yjc3ZFx1YjQxOFx1YzViNCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotdW5yZXNvbHZlZFByb3h5RXJyb3JfcmVhc29uPVx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVjNWQwIFx1ZDU3NFx1YzExZFx1ZDU2MCBcdWMyMTggXHVjNWM2XHViMjk0IFx1YzY5NFx1YzE4YyBcdWNjMzhcdWM4NzBcdWFjMDAgXHVkM2VjXHVkNTY4XHViNDE4XHVjNWI0IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHViMzAwXHVhYzFjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWQzZjRcdWIzNTRcdWM3NTggWE1JIFx1ZDMwY1x1Yzc3Y1x1Yzc3NCBcdWIyMDRcdWI3N2RcdWI0MThcdWM1YzhcdWFjNzBcdWIwOTggXHVjNzA0XHVjZTU4XHVhYzAwIFx1YmMxNFx1YjAwY1x1YzVjOFx1YWUzMCBcdWI1NGNcdWJiMzhcdWM3ODVcdWIyYzhcdWIyZTQuXG5cblx1Yzc3NCBcdWIzMDBcdWQ2NTQgXHVjMGMxXHVjNzkwXHViOTdjIFx1YjJlYlx1YWNlMCBcdWJiMzhcdWM4MWNcdWM4MTAgXHViY2Y0XHVhZTMwXHViOTdjIFx1ZDQ1Y1x1YzJkY1x1ZDU1OFx1YzVlYyBcdWQ1NzRcdWMxMWRcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YjI5NCBcdWNjMzhcdWM4NzBcdWI5N2MgXHVjMmRkXHViY2M0XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM3NTggXHVjMTkwXHVjMGMxXHVjNzQ0IFx1YmMyOVx1YzljMFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM1ZDAgXHViMmU0XHViOTc4IFx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWNkOTRcdWFjMDBcdWQ1NThcdWFlMzAgXHVjODA0XHVjNWQwIFx1Yzc3NCBcdWNjMzhcdWM4NzBcdWI5N2MgXHVkNTc0XHVjMTFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcw0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzE9SVVQTDAwMDdXOiBcdWQ1NThcdWIwOTggXHVjNzc0XHVjMGMxXHVjNzU4IFx1ZDU1OFx1YzcwNCBcdWM2OTRcdWMxOGNcdWM1ZDAgXHViMjA0XHViNzdkXHViNDFjIFx1Y2MzOFx1Yzg3MFx1YWMwMCBcdWQzZWNcdWQ1NjhcdWI0MThcdWM1YjQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzI9SVVQTDAwMDhXOiBcdWQ1NThcdWIwOTggXHVjNzc0XHVjMGMxXHVjNzU4IFx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWNjMzhcdWM4NzBcdWI5N2MgXHVkNTc0XHVjMTFkXHVkNTU4XHViODI0XHViYTc0IFx1Yzc3NCBcdWM2OTRcdWMxOGNcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTc0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC4NCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2czPUlVUEwwMDA5VzogXHVjNzc0IFx1YzY5NFx1YzE4Y1x1YzVkMFx1YzExYyBcdWMxMjBcdWQwZGRcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNzQwIFx1ZDMyOFx1ZDBhNFx1YzljMFx1Yzc1OCBcdWM2OTRcdWMxOGNcdWI5N2MgXHVkNTU4XHViMDk4IFx1Yzc3NFx1YzBjMSBcdWNjMzhcdWM4NzBcdWQ1NjlcdWIyYzhcdWIyZTQuDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9tc2c9SVVQTDAwMDBFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1Yjg1Y1x1YjRkY1x1ZDU4OFx1YzljMFx1YjljYyBcdWM3N2NcdWJkODAgXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YWNhY1x1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZz1JVVBMMDAwMUU6IFx1Yzc3NCBcdWM1NDhcdWIwYjRcdWI5N2MgXHViMmU0XHViOTc4IFx1YzcyMFx1ZDYxNVx1YzczY1x1Yjg1YyBcdWJjYzBcdWQ2NThcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDJFOiBcdWM3NzQgXHVjNTQ4XHViMGI0XHViOTdjIFx1YjMwMFx1YzBjMSBcdWM3MjBcdWQ2MTVcdWM3M2NcdWI4NWMgXHViY2MwXHVkNjU4XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotc2F2ZUNvbnZlcnRlZEd1aWRhbmNlRXJyb3JfbXNnPUlVUEwwMDAzRTogXHViY2MwXHVkNjU4XHViNDFjIFx1YzU0OFx1YjBiNCAnJ3swfScnXHVjNzQ0KFx1Yjk3YykgXHVjODAwXHVjN2E1XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBDb252ZXJ0IGFjdGl2aXR5DQotY29udmVydEFjdGl2aXR5RXJyb3JfdGl0bGU9XHVkNjVjXHViM2Q5IFx1YzcyMFx1ZDYxNSBcdWJjYzBcdWQ2NTggXHVjNjI0XHViOTU4DQotY29udmVydEFjdGl2aXR5RXJyb3JfbXNnPUlVUEwwMDA2RTogXHVjNzc0IFx1ZDY1Y1x1YjNkOVx1Yzc0NCBcdWIzMDBcdWMwYzEgXHVjNzIwXHVkNjE1XHVjNzNjXHViODVjIFx1YmNjMFx1ZDY1OFx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0U6IFx1YmNjMFx1ZDY1OFx1YjQxYyBcdWM1NDhcdWIwYjQgJyd7MH0nJ1x1Yzc0NChcdWI5N2MpIFx1YzgwMFx1YzdhNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1JVVBMMDAwNEU6IFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHViY2Y0XHViODI0XHViYTc0IFx1ZDY1NVx1Yzc3OFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9yZWFzb249ezB9XHVjNWQwIFx1YjMwMFx1ZDU3NCBcdWQ2MzhcdWQ2NTggXHVhYzAwXHViMmE1XHVkNTVjIFx1YzU0OFx1YjBiNCBcdWM3MjBcdWQ2MTVcdWM3NzQgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWludmFsaWRMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1cdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjNzQwIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWFjYmRcdWI4NWNcdWM3ODVcdWIyYzhcdWIyZTQuIC5wcm9qZWN0IFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWM3OTFcdWMxMzFcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbj1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjN2EwXHVhZTAwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWNvcHlpbmdBdHRhY2htZW50c1Rhc2tfbmFtZT1cdWNjYThcdWJkODBcdWI5N2MgXHViY2Y1XHVjMGFjXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLQ0KLSMgQ29udmVydCBHdWlkYW5jZSBEaWFsb2cNCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGU9XHVjNTQ4XHViMGI0IFx1YzcyMFx1ZDYxNSBcdWJjYzBcdWQ2NTgNCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGV4dD1cdWIzMDBcdWMwYzEgXHVjNTQ4XHViMGI0IFx1YzcyMFx1ZDYxNVx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotIyBHdWlkYW5jZSB0eXBlIG5hbWVzIGZvciBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZyAtIHNob3VsZCBiZSByZWZhY3RvcmVkIGludG8gbGlicmFyeS51aQ0KLWNoZWNrbGlzdF90ZXh0PVx1Y2NiNFx1ZDA2Y1x1YjlhY1x1YzJhNFx1ZDJiOA0KLWNvbmNlcHRfdGV4dD1cdWFjMWNcdWIxNTANCi1leGFtcGxlX3RleHQ9XHVjNjA4XHVjODFjDQotZ3VpZGVsaW5lX3RleHQ9XHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4DQotZXN0aW1hdGVfdGV4dD1cdWM2MDhcdWMwYzENCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9XHVjNjA4XHVjMGMxIFx1YmE1NFx1ZDJiOFx1YjlhZA0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PVx1YzYwOFx1YzBjMSBcdWFjZTBcdWI4MjRcdWMwYWNcdWQ1NmQNCi1yZXBvcnRfdGV4dD1cdWJjZjRcdWFjZTBcdWMxMWMNCi10ZW1wbGF0ZV90ZXh0PVx1ZDE1Y1x1ZDUwY1x1YjlhY1x1ZDJiOA0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PVx1YzljMFx1YzZkMCBcdWM3OTBcdWI4Y2MNCi10b29sTWVudG9yX3RleHQ9XHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDANCi13aGl0ZXBhcGVyX3RleHQ9XHViYzMxXHVjMTFjDQotdGVybURlZmluaXRpb25fdGV4dD1cdWM2YTlcdWM1YjQgXHVjODE1XHVjNzU4DQotcHJhY3RpY2VfdGV4dD1cdWMwYWNcdWI4NDANCi1yZXVzYWJsZUFzc2V0X3RleHQ9XHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMA0KLQ0KLSNhY3Rpdml0eSBicmVha2Rvd24gaW5mbyBzdHJpbmdzDQotQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQ9XHVjMThjXHVjNzIwXHVjNzkwXHViODVjIFx1YzIxOFx1ZDU4OVx1ZDU2OA0KLUFjdGl2aXR5TGF5b3V0X2FkZGl0aW9uYWxUYXNrc190ZXh0PVx1Y2Q5NFx1YWMwMFx1Yjg1YyBcdWMyMThcdWQ1ODlcdWQ1NjgNCi0NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRXJyb3IgTWVzc2FnZXMNCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl90aXRsZT1cdWM1NDhcdWIwYjQgXHVjNzIwXHVkNjE1IFx1YmNjMFx1ZDY1OCBcdWM2MjRcdWI5NTgNCi0NCi0jIExvYWQgUmVzb3VyY2VzIEVycm9yIERpYWxvZw0KLWxvYWRSZXNvdXJjZXNFcnJvcl90aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YzVmNFx1YWUzMCBcdWM2MjRcdWI5NTgNCi1sb2FkUmVzb3VyY2VzRXJyb3JfcmVhc29uPVx1Yzc3Y1x1YmQ4MCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjNzkwXHVjNmQwXHVjNzQ0IFx1Yjg1Y1x1YjRkY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM1ZDAgXHViMmU0XHViOTc4IFx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWNkOTRcdWFjMDBcdWQ1NThcdWFlMzAgXHVjODA0XHVjNWQwIFx1YzYyNFx1Yjk1OFx1Yjk3YyBcdWFjODBcdWQxYTAgXHViYzBmIFx1ZDU3NFx1YWNiMFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgUm9sZSBEaWFncmFtcw0KLXJvbGVEaWFncmFtUGVyZm9ybXNfdGV4dD1cdWMyMThcdWQ1ODkNCi1yb2xlRGlhZ3JhbVJlc3BvbnNpYmxlRm9yX3RleHQ9XHVjYzQ1XHVjNzg0IFx1YzBhY1x1ZDU2ZDoNCi0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cwPVx1Y2MzOFx1Yzg3MFx1YjQxYyBcdWM2OTRcdWMxOGM6IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE9XHVjODE1XHViY2Y0OiB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c0PVx1YWNiZFx1YWNlMDogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNz1cdWM2MjRcdWI5NTg6IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEwPVx1Y2MzOFx1Yzg3MFx1YjQxYyBcdWM2OTRcdWMxOGMgezB9XHVjNzc0KFx1YWMwMCkgXHViMjA0XHViNzdkXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzExPUdVSUQgezB9XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM2OTRcdWMxOGNcdWI5N2MgXHVjYzNlXHVjNzQ0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTI9Jyd7MH0nJyBcdWQzMGNcdWM3N2NcdWM1ZDBcdWMxMWMgXHViMjA0XHViNzdkXHViNDFjIFx1Yzc5MFx1YzZkMCAnJ3sxfScnXHVjNzQ0KFx1Yjk3YykgXHVjYzM4XHVjODcwXHVkNTY5XHViMmM4XHViMmU0Lg0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE1PScnezB9JycgXHVjNzkwXHVjNmQwIFx1ZDMwY1x1Yzc3Y1x1Yzc3NCBcdWIyMDRcdWI3N2RcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTc9Jyd7MH0nJyBVUkxcdWM1ZDAgXHVjNWYwXHVhY2IwXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTk9Jyd7MH0nJyBVUkxcdWM1ZDAgXHVjNWYwXHVhY2IwXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWM3NGM6IHsxfQ0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOD0nJ3swfScnIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWNjM2VcdWM3NDQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1JbXBvcnRFeHBvcnRVdGlsX01TRzk9Jyd7MH0nJyBcdWM3ODRcdWMyZGMgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHViOTdjIFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXVua25vd25HdWlkYW5jZV90ZXh0PVx1YzU0YyBcdWMyMTggXHVjNWM2XHVjNzRjDQotDQotQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbl9sb2dfbm9Db250ZW50UGF0aD1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uLkhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luOiB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWFjYmRcdWI4NWNcdWFjMDAgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXJfY2Fubm90VXBkYXRlPUlVUEwwMDA2VzogezB9IHsxfVx1Yzc0NChcdWI5N2MpIFx1YWMzMVx1YzJlMFx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXdhcm5pbmdEbGdfdGl0bGU9XHVhY2JkXHVhY2UwDQotZXJyb3JEbGdfdGl0bGU9XHVjNjI0XHViOTU4DQotZXJyb3JEbGdfc2F2ZUVycm9yPUlVUEwwMDA1RTogJyd7MH0nJyBcdWQzMGNcdWM3N2NcdWM3NTggXHViY2MwXHVhY2JkXHVjMGFjXHVkNTZkXHVjNzQ0IFx1YzgwMFx1YzdhNVx1ZDU1OFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4IFx1YmMxY1x1YzBkZA0KLQ0KLSMgYWN0aXZpdHkgZGlhZ3JhbSBuYW1lcw0KLWFjdGl2aXR5RGlhZ3JhbU5hbWU9XHVkNjVjXHViM2Q5IFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhODogezB9DQotYWN0aXZpdHlEZXRhaWxEaWFncmFtTmFtZT1cdWQ2NWNcdWIzZDkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhODogezB9DQotd3BEZXBlbmRlbmN5RGlhZ3JhbU5hbWU9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWM4ODVcdWMxOGRcdWMxMzEgXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4OiB7MH0NCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBSb2xlIGRpYWdyYW0gZm9udHMgYW5kIGxheW91dA0KLXJvbGVEaWFncmFtRm9udF9uYW1lPVx1YjMwMFx1ZDY1NCBcdWMwYzFcdWM3OTANCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMj1cdWFkNzRcdWI5YmNcdWNjYjQNCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZT0xMA0KLXJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyPTEwDQotcm9sZURpYWdyYW1feE1hcmdpbj0yMDANCi1yb2xlRGlhZ3JhbV94U3BhY2luZz03MA0KLXJvbGVEaWFncmFtX3lTcGFjaW5nPTMwDQotDQotIyBsb2NhbGl6ZSB0aGUgdmFsdWUgYmFzZWQgb24gbG9jYWxlLiAgZm9yIGV4YW1wbGUsIA0KLSMgZm9yIEVuZ2xpc2gsIHRoZSB2YWx1ZSBpcyAiLiAiDQotI2NvbG9uX3dpdGhfc3BhY2U9OiANCi0jIGZvciBmcmVuY2gsIHRoZSB2YWx1ZSBpcyAiIC4gIiwgeW91IG5lZWQgdG8gdXNlIGEgXCB0byBwcmVzZXJ2ZSB0aGUgbGVhZGluZyBzcGFjZQ0KLSNjb2xvbl93aXRoX3NwYWNlPVwgOiANCi0jIGZvciBjaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcw0KLSMgRG9udCB0cmltIHRoZSBzcGFjZXMgYWZ0ZXIgdGhlIGNvbG9uLg0KLWNvbG9uX3dpdGhfc3BhY2U9OiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzMzA4YTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXVua25vd25fdGV4dD1EZXNjb25oZWNpZG8NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lbXB0eUxpYnJhcnlQYXRoRXJyb3JfcmVhc29uPU8gY2FtaW5obyBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBlc3RcdTAwZTEgdmF6aW8uDQotbWlzc2luZ0xpYnJhcnlGaWxlRXJyb3JfcmVhc29uPU8gYXJxdWl2byBkZSBtb2RlbG8gZGUgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZXN0XHUwMGUxIGF1c2VudGUuDQotdW5yZXNvbHZlZFByb3h5RXJyb3JfcmVhc29uPUEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3Mgc2VsZWNpb25hZGEgY29udFx1MDBlOW0gcmVmZXJcdTAwZWFuY2lhcyBkZSBlbGVtZW50b3Mgblx1MDBlM28gcmVzb2x2aWRhcy4gSXNzbyBnZXJhbG1lbnRlIFx1MDBlOSBjYXVzYWRvIHBvciBhcnF1aXZvcyBYTUkgYXVzZW50ZXMgb3UgY29sb2NhZG9zIGVtIGxvY2FsIGluY29ycmV0byBuYSBwYXN0YSBkYSBiaWJsaW90ZWNhLlxuXG5GZWNoZSBlc3RlIGRpXHUwMGUxbG9nbyBlIHRvcm5lIHZpc1x1MDBlZHZlbCBhIHZpc3VhbGl6YVx1MDBlN1x1MDBlM28gUHJvYmxlbWFzIHBhcmEgYWp1ZGFyIGEgaWRlbnRpZmljYXIgYXMgcmVmZXJcdTAwZWFuY2lhcyBuXHUwMGUzbyByZXNvbHZpZGFzLiBQYXJhIGV2aXRhciBjb3Jyb21wZXIgYSBiaWJsaW90ZWNhLCBcdTAwZTkgYWx0YW1lbnRlIHJlY29tZW5kXHUwMGUxdmVsIHJlc29sdmVyIGVzc2FzIHJlZmVyXHUwMGVhbmNpYXMgcHJpbWVpcm8sIGFudGVzIGRlIGluY2x1aXIgbWFpcyBhbHRlcmFcdTAwZTdcdTAwZjVlcyBuYSBiaWJsaW90ZWNhLg0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcw0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzE9SVVQTDAwMDdXOiBIXHUwMGUxIHJlZmVyXHUwMGVhbmNpYXMgYXVzZW50ZXMgZW0gdW0gb3UgbWFpcyBlbGVtZW50b3MgZmlsaG9zDQotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMj1JVVBMMDAwOFc6IEVzdGUgZWxlbWVudG8gZGV2ZXJpYSBzZXIgc2VsZWNpb25hZG8gcGFyYSByZXNvbHZlciB1bWEgb3UgbWFpcyByZWZlclx1MDBlYW5jaWFzIGF1c2VudGVzDQotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMz1JVVBMMDAwOVc6IEVzdGUgZWxlbWVudG8gcmVmZXJlbmNpYSB1bSBvdSBtYWlzIGVsZW1lbnRvcyBlbSB1bSBwYWNvdGUgblx1MDBlM28tc2VsZWNpb25hZG8gDQotIyBFcnJvciBNZXNzYWdlcw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9tc2c9SVVQTDAwMDBFOiBBIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGZvaSBjYXJyZWdhZGEsIG1hcyBhbGd1bnMgZXJyb3MgZm9yYW0gZGV0ZWN0YWRvcy4NCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZz1JVVBMMDAwMUU6IEVzdGEgb3JpZW50YVx1MDBlN1x1MDBlM28gblx1MDBlM28gcG9kZSBzZXIgY29udmVydGlkYSBlbSBvdXRybyB0aXBvLg0KLWNvbnZlcnRHdWlkYW5jZUVycm9yX21zZz1JVVBMMDAwMkU6IEVzdGEgb3JpZW50YVx1MDBlN1x1MDBlM28gblx1MDBlM28gcG9kZSBzZXIgY29udmVydGlkYSBubyB0aXBvIGRlIGRlc3Rpbm8uDQotc2F2ZUNvbnZlcnRlZEd1aWRhbmNlRXJyb3JfbXNnPUlVUEwwMDAzRTogTlx1MDBlM28gXHUwMGU5IHBvc3NcdTAwZWR2ZWwgc2FsdmFyIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gY29udmVydGlkYSAnJ3swfScnLg0KLQ0KLSMgQ29udmVydCBhY3Rpdml0eQ0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlPUNvbnZlcnRlciBFcnJvIGRlIFRpcG8gZGUgQXRpdmlkYWRlDQotY29udmVydEFjdGl2aXR5RXJyb3JfbXNnPUlVUEwwMDA2RTogRXN0YSBhdGl2aWRhZGUgblx1MDBlM28gcG9kZSBzZXIgY29udmVydGlkYSBwYXJhIG8gdGlwbyBkZSBkZXN0aW5vLg0KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0U6IEEgYXRpdmlkYWRlIGNvbnZlcnRpZGEgJyd7MH0nJyBuXHUwMGUzbyBwb2RlIHNlciBzYWx2YS4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQTDAwMDRFOiBPY29ycmV1IHVtIGVycm8uIENsaXF1ZSBlbSBPSyBwYXJhIG9idGVyIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzLg0KLXVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfcmVhc29uPU5cdTAwZTNvIGV4aXN0ZSB1bSB0aXBvIGRlIG9yaWVudGFcdTAwZTdcdTAwZTNvIGNvbXBhdFx1MDBlZHZlbCBwYXJhIHswfS4NCi1pbnZhbGlkTGlicmFyeVBhdGhFcnJvcl9yZWFzb249Q2FtaW5obyBkZSBiaWJsaW90ZWNhIGludlx1MDBlMWxpZG8uIE5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIGNyaWFyIG8gYXJxdWl2byAucHJvamVjdC4NCi1jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbj1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBibG9xdWVhciBhIGJpYmxpb3RlY2EuDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWNvcHlpbmdBdHRhY2htZW50c1Rhc2tfbmFtZT1Db3BpYW5kbyBhbmV4b3MuLi4NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nDQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlPUNvbnZlcnRlciBUaXBvIGRlIE9yaWVudGFcdTAwZTdcdTAwZTNvDQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RleHQ9U2VsZWNpb25lIG8gdGlwbyBkZSBvcmllbnRhXHUwMGU3XHUwMGUzbyBkZSBkZXN0aW5vLg0KLQ0KLSMgR3VpZGFuY2UgdHlwZSBuYW1lcyBmb3IgQ29udmVydCBHdWlkYW5jZSBEaWFsb2cgLSBzaG91bGQgYmUgcmVmYWN0b3JlZCBpbnRvIGxpYnJhcnkudWkNCi1jaGVja2xpc3RfdGV4dD1MaXN0YSBkZSBWZXJpZmljYVx1MDBlN1x1MDBlM28NCi1jb25jZXB0X3RleHQ9Q29uY2VpdG8NCi1leGFtcGxlX3RleHQ9RXhlbXBsbw0KLWd1aWRlbGluZV90ZXh0PURpcmV0cml6DQotZXN0aW1hdGVfdGV4dD1Fc3RpbWFyDQotZXN0aW1hdGluZ01ldHJpY190ZXh0PU1cdTAwZTl0cmljYSBFc3RpbWF0aXZhDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9Q29uc2lkZXJhXHUwMGU3XHUwMGY1ZXMgRXN0aW1hdGl2YXMNCi1yZXBvcnRfdGV4dD1SZWxhdFx1MDBmM3Jpbw0KLXRlbXBsYXRlX3RleHQ9VGVtcGxhdGUNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dD1NYXRlcmlhbCBTdXBvcnRhZG8NCi10b29sTWVudG9yX3RleHQ9TWVudG9yIGRlIEZlcnJhbWVudGFzDQotd2hpdGVwYXBlcl90ZXh0PVdoaXRlcGFwZXINCi10ZXJtRGVmaW5pdGlvbl90ZXh0PURlZmluaVx1MDBlN1x1MDBlM28gZGUgVGVybW8NCi1wcmFjdGljZV90ZXh0PVByXHUwMGUxdGljYQ0KLXJldXNhYmxlQXNzZXRfdGV4dD1SZWN1cnNvIFJldXRpbGl6XHUwMGUxdmVsDQotDQotI2FjdGl2aXR5IGJyZWFrZG93biBpbmZvIHN0cmluZ3MNCi1BY3Rpdml0eUxheW91dF9wcmltYXJ5VGFza3NfdGV4dD1FeGVjdXRhIGNvbW8gUHJvcHJpZXRcdTAwZTFyaW8NCi1BY3Rpdml0eUxheW91dF9hZGRpdGlvbmFsVGFza3NfdGV4dD1FeGVjdXRhIGNvbW8gQWRpY2lvbmFsDQotDQotDQotIyBDb252ZXJ0IEd1aWRhbmNlIEVycm9yIE1lc3NhZ2VzDQotY29udmVydEd1aWRhbmNlRXJyb3JfdGl0bGU9RXJybyBkZSBDb252ZXJzXHUwMGUzbyBkZSBUaXBvIGRlIE9yaWVudGFcdTAwZTdcdTAwZTNvDQotDQotIyBMb2FkIFJlc291cmNlcyBFcnJvciBEaWFsb2cNCi1sb2FkUmVzb3VyY2VzRXJyb3JfdGl0bGU9RXJybyBkZSBBYmVydHVyYSBkZSBCaWJsaW90ZWNhIGRlIE1cdTAwZTl0b2Rvcw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb249Tlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgY2FycmVnYXIgYWxndW5zIHJlY3Vyc29zIGRhIGJpYmxpb3RlY2EuXG5cbkNsaXF1ZSBlbSBEZXRhbGhlcyBwYXJhIHJldmlzYXIgb3MgZXJyb3MgZSByZXNvbHZcdTAwZWEtbG9zIGFudGVzIGRlIGluY2x1aXIgbWFpcyBhbHRlcmFcdTAwZTdcdTAwZjVlcyBuYSBiaWJsaW90ZWNhLg0KLQ0KLSMgUm9sZSBEaWFncmFtcw0KLXJvbGVEaWFncmFtUGVyZm9ybXNfdGV4dD1kZXNlbXBlbmhhDQotcm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0PXJlc3BvbnNcdTAwZTF2ZWwgcG9yDQotDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMD1FbGVtZW50byByZWZlcmVuY2lhZG86IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE9SW5mb3JtYVx1MDBlN1x1MDBlM286IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzQ9QXZpc286IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzc9RXJybzogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9RWxlbWVudG8gcmVmZXJlbmNpYWRvIGF1c2VudGUgezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTE9Tlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgbG9jYWxpemFyIG8gZWxlbWVudG8gcGFyYSBvIGd1aWQgezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTI9TyBhcnF1aXZvICcnezB9JycgcmVmZXJlbmNpYSBvIHJlY3Vyc28gYXVzZW50ZSAnJ3sxfScnDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTU9YXJxdWl2byBkZSByZWN1cnNvcyBhdXNlbnRlICcnezB9JycNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNz1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBjb25lY3RhciBjb20gYSBVUkwgJyd7MH0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE5PU5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIGNvbmVjdGFyIGNvbSBhIFVSTCAnJ3swfScnOiB7MX0NCi1JbXBvcnRFeHBvcnRVdGlsX01TRzg9Tlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgbG9jYWxpemFyIG8gYXJxdWl2byAnJ3swfScnLg0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOT1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBjcmlhciBvIGRpcmV0XHUwMGYzcmlvICcnezB9JycuDQotdW5rbm93bkd1aWRhbmNlX3RleHQ9RGVzY29uaGVjaWRvDQotDQotQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbl9sb2dfbm9Db250ZW50UGF0aD1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uLkhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luOiBuXHUwMGUzbyBleGlzdGUgY29udGVudFBhdGggcGFyYSB7MH0NCi1MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyX2Nhbm5vdFVwZGF0ZT1JVVBMMDAwNlc6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGF0dWFsaXphciB7MH0gezF9DQotd2FybmluZ0RsZ190aXRsZT1Bdmlzbw0KLWVycm9yRGxnX3RpdGxlPUVycm8NCi1lcnJvckRsZ19zYXZlRXJyb3I9SVVQTDAwMDVFOiBFcnJvIGFvIHNhbHZhciBhbHRlcmFcdTAwZTdcdTAwZTNvIG5vIGFycXVpdm8gJyd7MH0nJw0KLQ0KLSMgYWN0aXZpdHkgZGlhZ3JhbSBuYW1lcw0KLWFjdGl2aXR5RGlhZ3JhbU5hbWU9RGlhZ3JhbWEgZGUgYXRpdmlkYWRlOiB7MH0NCi1hY3Rpdml0eURldGFpbERpYWdyYW1OYW1lPURpYWdyYW1hIGRlIGRldGFsaGUgZGUgYXRpdmlkYWRlOiB7MH0NCi13cERlcGVuZGVuY3lEaWFncmFtTmFtZT1EaWFncmFtYSBkZSBkZXBlbmRcdTAwZWFuY2lhIGRvIHByb2R1dG8gZGUgdHJhYmFsaG86IHswfQ0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFJvbGUgZGlhZ3JhbSBmb250cyBhbmQgbGF5b3V0DQotcm9sZURpYWdyYW1Gb250X25hbWU9QXJpYWwNCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMj1BcmlhbA0KLXJvbGVEaWFncmFtRm9udF9zaXplPTEwDQotcm9sZURpYWdyYW1Gb250X3NpemVfd2luMzI9MTANCi1yb2xlRGlhZ3JhbV94TWFyZ2luPTIwMA0KLXJvbGVEaWFncmFtX3hTcGFjaW5nPTcwDQotcm9sZURpYWdyYW1feVNwYWNpbmc9MzANCi0NCi0jIGxvY2FsaXplIHRoZSB2YWx1ZSBiYXNlZCBvbiBsb2NhbGUuICBmb3IgZXhhbXBsZSwgDQotIyBmb3IgRW5nbGlzaCwgdGhlIHZhbHVlIGlzICIuICINCi0jY29sb25fd2l0aF9zcGFjZT06IA0KLSMgZm9yIGZyZW5jaCwgdGhlIHZhbHVlIGlzICIgLiAiLCB5b3UgbmVlZCB0byB1c2UgYSBcIHRvIHByZXNlcnZlIHRoZSBsZWFkaW5nIHNwYWNlDQotI2NvbG9uX3dpdGhfc3BhY2U9XCA6IA0KLSMgZm9yIGNoaW5lc2UsIHRoZSBjb2xvbiBzaG91bGQgYmUgZG91YmxlIGJ5dGVzDQotIyBEb250IHRyaW0gdGhlIHNwYWNlcyBhZnRlciB0aGUgY29sb24uDQotY29sb25fd2l0aF9zcGFjZT06IA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2EyYzExNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotdW5rbm93bl90ZXh0PVx1NjcyYVx1NzdlNQ0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVtcHR5TGlicmFyeVBhdGhFcnJvcl9yZWFzb249XHU2NWI5XHU2Y2Q1XHU1ZTkzXHU4ZGVmXHU1Zjg0XHU0ZTNhXHU3YTdhXHUzMDAyDQotbWlzc2luZ0xpYnJhcnlGaWxlRXJyb3JfcmVhc29uPVx1N2YzYVx1NWMxMVx1NjViOVx1NmNkNVx1NWU5M1x1NmEyMVx1NTc4Ylx1NjU4N1x1NGVmNlx1MzAwMg0KLXVucmVzb2x2ZWRQcm94eUVycm9yX3JlYXNvbj1cdTkwMDlcdTViOWFcdTc2ODRcdTY1YjlcdTZjZDVcdTVlOTNcdTUzMDVcdTU0MmJcdTY3MmFcdTg5ZTNcdTY3OTBcdTc2ODRcdTUxNDNcdTdkMjBcdTVmMTVcdTc1MjhcdTMwMDJcdTZiNjRcdTYwYzVcdTUxYjVcdTkwMWFcdTVlMzhcdTY2MmZcdTc1MzFcdTRlOGVcdTVlOTNcdTY1ODdcdTRlZjZcdTU5MzlcdTRlMmRcdTdmM2FcdTVjMTEgWE1JIFx1NjU4N1x1NGVmNlx1NjIxNiBYTUkgXHU2NTg3XHU0ZWY2XHU2NTNlXHU3ZjZlXHU5NTE5XHU4YmVmXHU4MDBjXHU1ZjE1XHU4ZDc3XHU3Njg0XHUzMDAyXG5cblx1OGJmN1x1NTE3M1x1OTVlZFx1NmI2NFx1NWJmOVx1OGJkZFx1Njg0Nlx1ZmYwY1x1NzEzNlx1NTQwZVx1NjI1M1x1NWYwMFx1MjAxY1x1OTVlZVx1OTg5OFx1MjAxZFx1ODljNlx1NTZmZVx1ZmYwY1x1NWUyZVx1NTJhOVx1Nzg2ZVx1NWI5YVx1NjcyYVx1ODllM1x1Njc5MFx1NzY4NFx1NWYxNVx1NzUyOFx1MzAwMlx1NGUzYVx1OTA3Zlx1NTE0ZFx1NjM1Zlx1NTc0Zlx1NWU5M1x1ZmYwY1x1NWYzYVx1NzBjOFx1NWVmYVx1OGJhZVx1NTcyOFx1NWJmOVx1NWU5M1x1NjI2N1x1ODg0Y1x1NjZmNFx1NTkxYVx1NjZmNFx1NjUzOVx1NGU0Ylx1NTI0ZFx1NTE0OFx1ODllM1x1Njc5MFx1OGZkOVx1NGU5Ylx1NWYxNVx1NzUyOFx1MzAwMg0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcw0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzE9SVVQTDAwMDdXOiBcdTRlMDBcdTRlMmFcdTYyMTZcdTU5MWFcdTRlMmFcdTViNTBcdTUxNDNcdTdkMjBcdTUzMDVcdTU0MmJcdTdmM2FcdTVjMTFcdTc2ODRcdTVmMTVcdTc1MjgNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cyPUlVUEwwMDA4VzogXHU1ZTk0XHU5MDA5XHU2MmU5XHU2YjY0XHU1MTQzXHU3ZDIwXHU0ZWU1XHU4OWUzXHU2NzkwXHU0ZTAwXHU0ZTJhXHU2MjE2XHU1OTFhXHU0ZTJhXHU3ZjNhXHU1YzExXHU3Njg0XHU1ZjE1XHU3NTI4DQotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMz1JVVBMMDAwOVc6IFx1NmI2NFx1NTE0M1x1N2QyMFx1NWYxNVx1NzUyOFx1NjcyYVx1OTAwOVx1NWI5YVx1N2EwYlx1NWU4Zlx1NTMwNVx1NGUyZFx1NzY4NFx1NGUwMFx1NGUyYVx1NjIxNlx1NTkxYVx1NGUyYVx1NTE0M1x1N2QyMA0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1sb2FkUmVzb3VyY2VzRXJyb3JfbXNnPUlVUEwwMDAwRTogXHU1ZGYyXHU4OGM1XHU1MTY1XHU2NWI5XHU2Y2Q1XHU1ZTkzXHVmZjBjXHU0ZjQ2XHU2NjJmXHU2OGMwXHU2ZDRiXHU1MjMwXHU0ZTAwXHU0ZTliXHU5NTE5XHU4YmVmXHUzMDAyDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9tc2c9SVVQTDAwMDFFOiBcdTY1ZTBcdTZjZDVcdTVjMDZcdTZiNjRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdThmNmNcdTYzNjJcdTRlM2FcdTUzZTZcdTRlMDBcdTc5Y2RcdTdjN2JcdTU3OGJcdTMwMDINCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDJFOiBcdTY1ZTBcdTZjZDVcdTVjMDZcdTZiNjRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdThmNmNcdTYzNjJcdTRlM2FcdTc2ZWVcdTY4MDdcdTdjN2JcdTU3OGJcdTMwMDINCi1zYXZlQ29udmVydGVkR3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDNFOiBcdTY1ZTBcdTZjZDVcdTRmZGRcdTViNThcdThmNmNcdTYzNjJcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTIwMWN7MH1cdTIwMWRcdTMwMDINCi0NCi0jIENvbnZlcnQgYWN0aXZpdHkNCi1jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZT1cdThmNmNcdTYzNjJcdTZkM2JcdTUyYThcdTdjN2JcdTU3OGJcdTk1MTlcdThiZWYNCi1jb252ZXJ0QWN0aXZpdHlFcnJvcl9tc2c9SVVQTDAwMDZFOiBcdTY1ZTBcdTZjZDVcdTVjMDZcdTZiNjRcdTZkM2JcdTUyYThcdThmNmNcdTYzNjJcdTRlM2FcdTc2ZWVcdTY4MDdcdTdjN2JcdTU3OGJcdTMwMDINCi1zYXZlQ29udmVydGVkQWN0aXZpdHlFcnJvcl9tc2c9SVVQTDAwMDdFOiBcdTY1ZTBcdTZjZDVcdTRmZGRcdTViNThcdThmNmNcdTYzNjJcdTc2ODRcdTZkM2JcdTUyYThcdTIwMWN7MH1cdTIwMWRcdTMwMDINCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQTDAwMDRFOiBcdTUzZDFcdTc1MWZcdTk1MTlcdThiZWZcdTMwMDJcdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdTc4NmVcdTViOWFcdTIwMWRcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdTRmZTFcdTYwNmZcdTMwMDINCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX3JlYXNvbj17MH0gXHU2Y2ExXHU2NzA5XHU1MTdjXHU1YmI5XHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHU3YzdiXHU1NzhiXHUzMDAyDQotaW52YWxpZExpYnJhcnlQYXRoRXJyb3JfcmVhc29uPVx1NWU5M1x1OGRlZlx1NWY4NFx1NjVlMFx1NjU0OFx1MzAwMlx1NjVlMFx1NmNkNVx1NTIxYlx1NWVmYSAucHJvamVjdCBcdTY1ODdcdTRlZjZcdTMwMDINCi1jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbj1cdTY1ZTBcdTZjZDVcdTk1MDFcdTViOWFcdTVlOTNcdTMwMDINCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotY29weWluZ0F0dGFjaG1lbnRzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTkwZFx1NTIzNlx1OTY0NFx1NGVmNi4uLg0KLQ0KLSMgQ29udmVydCBHdWlkYW5jZSBEaWFsb2cNCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGU9XHU4ZjZjXHU2MzYyXHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHU3YzdiXHU1NzhiDQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RleHQ9XHU5MDA5XHU2MmU5XHU3NmVlXHU2ODA3XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHU3YzdiXHU1NzhiXHUzMDAyDQotDQotIyBHdWlkYW5jZSB0eXBlIG5hbWVzIGZvciBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZyAtIHNob3VsZCBiZSByZWZhY3RvcmVkIGludG8gbGlicmFyeS51aQ0KLWNoZWNrbGlzdF90ZXh0PVx1NjgzOFx1NWJmOVx1ODg2OA0KLWNvbmNlcHRfdGV4dD1cdTY5ODJcdTVmZjUNCi1leGFtcGxlX3RleHQ9XHU3OTNhXHU0ZjhiDQotZ3VpZGVsaW5lX3RleHQ9XHU2MzA3XHU1MzU3DQotZXN0aW1hdGVfdGV4dD1cdTRmMzBcdTdiOTcNCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9XHU0ZjMwXHU3Yjk3XHU1ZWE2XHU5MWNmXHU1MDNjDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5DQotcmVwb3J0X3RleHQ9XHU2MmE1XHU1NDRhDQotdGVtcGxhdGVfdGV4dD1cdTZhMjFcdTY3N2YNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dD1cdTY1MmZcdTYzMDFcdTY3NTBcdTY1OTkNCi10b29sTWVudG9yX3RleHQ9XHU1ZGU1XHU1MTc3XHU1NDExXHU1YmZjDQotd2hpdGVwYXBlcl90ZXh0PVx1NzY3ZFx1NzZhZVx1NGU2Ng0KLXRlcm1EZWZpbml0aW9uX3RleHQ9XHU2NzJmXHU4YmVkXHU1YjlhXHU0ZTQ5DQotcHJhY3RpY2VfdGV4dD1cdTViOWVcdThkZjUNCi1yZXVzYWJsZUFzc2V0X3RleHQ9XHU1M2VmXHU5MWNkXHU3NTI4XHU4ZDQ0XHU0ZWE3DQotDQotI2FjdGl2aXR5IGJyZWFrZG93biBpbmZvIHN0cmluZ3MNCi1BY3Rpdml0eUxheW91dF9wcmltYXJ5VGFza3NfdGV4dD1cdTRmNWNcdTRlM2FcdTYyZTVcdTY3MDlcdTgwMDVcdTYyNjdcdTg4NGMNCi1BY3Rpdml0eUxheW91dF9hZGRpdGlvbmFsVGFza3NfdGV4dD1cdTRmNWNcdTRlM2FcdTUxNzZcdTRlZDZcdTc1MjhcdTYyMzdcdTYyNjdcdTg4NGMNCi0NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRXJyb3IgTWVzc2FnZXMNCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl90aXRsZT1cdThmNmNcdTYzNjJcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTdjN2JcdTU3OGJcdTk1MTlcdThiZWYNCi0NCi0jIExvYWQgUmVzb3VyY2VzIEVycm9yIERpYWxvZw0KLWxvYWRSZXNvdXJjZXNFcnJvcl90aXRsZT1cdTYyNTNcdTVmMDBcdTY1YjlcdTZjZDVcdTVlOTNcdTk1MTlcdThiZWYNCi1sb2FkUmVzb3VyY2VzRXJyb3JfcmVhc29uPVx1NjVlMFx1NmNkNVx1ODhjNVx1NTE2NVx1NjdkMFx1NGU5Ylx1NWU5M1x1OGQ0NFx1NmU5MFx1MzAwMlxuXG5cdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTIwMWRcdWZmMGNcdTY4YzBcdTY3ZTVcdTk1MTlcdThiZWZcdTVlNzZcdTg5ZTNcdTUxYjNcdTViODNcdTRlZWNcdWZmMGNcdTcxMzZcdTU0MGVcdTUxOGRcdTViZjlcdTVlOTNcdTYyNjdcdTg4NGNcdTY2ZjRcdTU5MWFcdTY2ZjRcdTY1MzlcdTMwMDINCi0NCi0jIFJvbGUgRGlhZ3JhbXMNCi1yb2xlRGlhZ3JhbVBlcmZvcm1zX3RleHQ9XHU2MjY3XHU4ODRjDQotcm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0PVx1OGQxZlx1OGQyMw0KLQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzA9XHU4OGFiXHU1ZjE1XHU3NTI4XHU1MTQzXHU3ZDIwXHVmZjFhezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMT1cdTRmZTFcdTYwNmZcdWZmMWF7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c0PVx1OGI2Nlx1NTQ0YVx1ZmYxYXswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzc9XHU5NTE5XHU4YmVmXHVmZjFhezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9XHU3ZjNhXHU1YzExXHU4OGFiXHU1ZjE1XHU3NTI4XHU1MTQzXHU3ZDIwIHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzExPVx1NjVlMFx1NmNkNVx1NjI3ZVx1NTIzMCBndWlkIHswfSBcdTc2ODRcdTUxNDNcdTdkMjANCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMj1cdTY1ODdcdTRlZjZcdTIwMWN7MH1cdTIwMWRcdTVmMTVcdTc1MjhcdTdmM2FcdTVjMTFcdThkNDRcdTZlOTBcdTIwMWN7MX1cdTIwMWQNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNT1cdTdmM2FcdTVjMTFcdThkNDRcdTZlOTBcdTY1ODdcdTRlZjZcdTIwMWN7MH1cdTIwMWQNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNz1cdTY1ZTBcdTZjZDVcdThmZGVcdTYzYTVcdTUyMzAgdXJsXHUyMDFjezB9XHUyMDFkDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTk9XHU2NWUwXHU2Y2Q1XHU4ZmRlXHU2M2E1XHU1MjMwIHVybFx1MjAxY3swfVx1MjAxZFx1ZmYxYXsxfQ0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOD1cdTY1ZTBcdTZjZDVcdTYyN2VcdTUyMzBcdTY1ODdcdTRlZjZcdTIwMWN7MH1cdTIwMWRcdTMwMDINCi1JbXBvcnRFeHBvcnRVdGlsX01TRzk9XHU2NWUwXHU2Y2Q1XHU1MjFiXHU1ZWZhXHU0ZTM0XHU2NWY2XHU3NmVlXHU1ZjU1XHUyMDFjezB9XHUyMDFkXHUzMDAyDQotdW5rbm93bkd1aWRhbmNlX3RleHQ9XHU2NzJhXHU3N2U1DQotDQotQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbl9sb2dfbm9Db250ZW50UGF0aD1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uLkhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luXHVmZjFhXHU2NWUwIHswfSBcdTc2ODRcdTUxODVcdTViYjlcdThkZWZcdTVmODQNCi1MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyX2Nhbm5vdFVwZGF0ZT1JVVBMMDAwNlc6IFx1NjVlMFx1NmNkNVx1NjZmNFx1NjViMCB7MH0gezF9DQotd2FybmluZ0RsZ190aXRsZT1cdThiNjZcdTU0NGENCi1lcnJvckRsZ190aXRsZT1cdTk1MTlcdThiZWYNCi1lcnJvckRsZ19zYXZlRXJyb3I9SVVQTDAwMDVFOiBcdTVjMDZcdTY2ZjRcdTY1MzlcdTRmZGRcdTViNThcdTUyMzBcdTY1ODdcdTRlZjZcdTIwMWN7MH1cdTIwMWRcdTY1ZjZcdTUxZmFcdTk1MTkNCi0NCi0jIGFjdGl2aXR5IGRpYWdyYW0gbmFtZXMNCi1hY3Rpdml0eURpYWdyYW1OYW1lPVx1NmQzYlx1NTJhOFx1NTZmZVx1ZmYxYXswfQ0KLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbU5hbWU9XHU2ZDNiXHU1MmE4XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU1NmZlXHVmZjFhezB9DQotd3BEZXBlbmRlbmN5RGlhZ3JhbU5hbWU9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU0ZjlkXHU4ZDU2XHU1MTczXHU3Y2ZiXHU1NmZlXHVmZjFhezB9DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgUm9sZSBkaWFncmFtIGZvbnRzIGFuZCBsYXlvdXQNCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZT1cdTViZjlcdThiZGRcdTY4NDYNCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMj1cdTllZDFcdTRmNTMNCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZT0xMA0KLXJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyPTEwDQotcm9sZURpYWdyYW1feE1hcmdpbj0yMDANCi1yb2xlRGlhZ3JhbV94U3BhY2luZz03MA0KLXJvbGVEaWFncmFtX3lTcGFjaW5nPTMwDQotDQotIyBsb2NhbGl6ZSB0aGUgdmFsdWUgYmFzZWQgb24gbG9jYWxlLiAgZm9yIGV4YW1wbGUsIA0KLSMgZm9yIEVuZ2xpc2gsIHRoZSB2YWx1ZSBpcyAiLiAiDQotI2NvbG9uX3dpdGhfc3BhY2U9OiANCi0jIGZvciBmcmVuY2gsIHRoZSB2YWx1ZSBpcyAiIC4gIiwgeW91IG5lZWQgdG8gdXNlIGEgXCB0byBwcmVzZXJ2ZSB0aGUgbGVhZGluZyBzcGFjZQ0KLSNjb2xvbl93aXRoX3NwYWNlPVwgOiANCi0jIGZvciBjaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcw0KLSMgRG9udCB0cmltIHRoZSBzcGFjZXMgYWZ0ZXIgdGhlIGNvbG9uLg0KLWNvbG9uX3dpdGhfc3BhY2U9XHVmZjFhDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDgyZTY2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi11bmtub3duX3RleHQ9XHU0ZTBkXHU2NjBlDQotDQotIyBFcnJvciBSZWFzb25zDQotZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1cdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdThkZWZcdTVmOTFcdTdhN2FcdTc2N2RcdTMwMDINCi1taXNzaW5nTGlicmFyeUZpbGVFcnJvcl9yZWFzb249XHU5MDdhXHU2ZjBmXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2YTIxXHU1NzhiXHU2YTk0XHUzMDAyDQotdW5yZXNvbHZlZFByb3h5RXJyb3JfcmVhc29uPVx1OTA3OFx1NTNkNlx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NTMwNVx1NTQyYlx1NjcyYVx1ODllM1x1Njc5MFx1NzY4NFx1NTE0M1x1N2QyMFx1NTNjM1x1NzE2N1x1MzAwMlx1OTAxOVx1OTAxYVx1NWUzOFx1NjYyZlx1NTZlMFx1NzBiYVx1N2EwYlx1NWYwZlx1NWVhYlx1OGNjN1x1NjU5OVx1NTkzZVx1NGUyZFx1OTA3YVx1NmYwZlx1NjIxNlx1NzlmYlx1OTY2NCBYTUkgXHU2YTk0XHU2ODQ4XHUzMDAyXG5cblx1OGFjYlx1OTVkY1x1OTU4OVx1NmI2NFx1NWMwZFx1OGE3MVx1Njg0Nlx1NGY4Nlx1OTg2Zlx1NzkzYVx1MzAwY1x1NTU0Zlx1OTg0Y1x1MzAwZFx1ODk5Nlx1NTcxNlx1ZmYwY1x1NjI3ZVx1NTFmYVx1NjcyYVx1ODllM1x1Njc5MFx1NzY4NFx1NTNjM1x1NzE2N1x1MzAwMlx1NzBiYVx1NGU4Nlx1OTA3Zlx1NTE0ZFx1N2EwYlx1NWYwZlx1NWVhYlx1NmJjMFx1NjQwZFx1ZmYwY1x1NTcyOFx1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NTJhMFx1NTE2NVx1NjZmNFx1NTkxYVx1OGI4YVx1NjZmNFx1NGU0Ylx1NTI0ZFx1ZmYwY1x1NWVmYVx1OGI3MFx1NjBhOFx1NGUwMFx1NWI5YVx1ODk4MVx1NTE0OFx1ODllM1x1Njc5MFx1OTAxOVx1NGU5Ylx1NTNjM1x1NzE2N1x1MzAwMg0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcw0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzE9SVVQTDAwMDdXOiBcdTRlMDBcdTYyMTZcdTU5MWFcdTUwMGJcdTViNTBcdTUxNDNcdTdkMjBcdTUzMDVcdTU0MmJcdTkwN2FcdTZmMGZcdTc2ODRcdTUzYzNcdTcxNjcNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cyPUlVUEwwMDA4VzogXHU2MWM5XHU4YTcyXHU5MDc4XHU1M2Q2XHU2YjY0XHU1MTQzXHU3ZDIwXHU0Zjg2XHU4OWUzXHU2NzkwXHU0ZTAwXHU2MjE2XHU1OTFhXHU1MDBiXHU5MDdhXHU2ZjBmXHU3Njg0XHU1M2MzXHU3MTY3DQotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMz1JVVBMMDAwOVc6IFx1NmI2NFx1NTE0M1x1N2QyMFx1NTNjM1x1NzE2N1x1NjcyYVx1OTA3OFx1NTNkNlx1NzY4NFx1NTk1N1x1NGVmNlx1NGUyZFx1NzY4NFx1NGUwMFx1NjIxNlx1NTkxYVx1NTAwYlx1NTE0M1x1N2QyMA0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1sb2FkUmVzb3VyY2VzRXJyb3JfbXNnPUlVUEwwMDAwRTogXHU1ZGYyXHU4ZjA5XHU1MTY1XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHVmZjBjXHU0ZjQ2XHU1MDc1XHU2ZTJjXHU1MjMwXHU0ZTAwXHU0ZTliXHU5MzJmXHU4YWE0XHUzMDAyDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9tc2c9SVVQTDAwMDFFOiBcdTZiNjRcdTYzMDdcdTVmMTVcdTcxMjFcdTZjZDVcdThmNDlcdTYzZGJcdTcwYmFcdTUzZTZcdTRlMDBcdTdhMmVcdTk4NWVcdTU3OGJcdTMwMDINCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDJFOiBcdTZiNjRcdTYzMDdcdTVmMTVcdTcxMjFcdTZjZDVcdThmNDlcdTYzZGJcdTcwYmFcdTc2ZWVcdTZhMTlcdTk4NWVcdTU3OGJcdTMwMDINCi1zYXZlQ29udmVydGVkR3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDNFOiBcdTcxMjFcdTZjZDVcdTUxMzJcdTViNThcdTVkZjJcdThmNDlcdTYzZGJcdTc2ODRcdTYzMDdcdTVmMTUgJyd7MH0nJ1x1MzAwMg0KLQ0KLSMgQ29udmVydCBhY3Rpdml0eQ0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlPVx1OGY0OVx1NjNkYlx1NmQzYlx1NTJkNVx1OTg1ZVx1NTc4Ylx1OTMyZlx1OGFhNA0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwNkU6IFx1NmI2NFx1NmQzYlx1NTJkNVx1NzEyMVx1NmNkNVx1OGY0OVx1NjNkYlx1NzBiYVx1NzZlZVx1NmExOVx1OTg1ZVx1NTc4Ylx1MzAwMg0KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0U6IFx1NzEyMVx1NmNkNVx1NTEzMlx1NWI1OFx1NWRmMlx1OGY0OVx1NjNkYlx1NzY4NFx1NmQzYlx1NTJkNSAnJ3swfScnXHUzMDAyDQotDQotIyBFcnJvciBSZWFzb25zDQotZXJyb3JfcmVhc29uPUlVUEwwMDA0RTogXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHUzMDAyXHU1OTgyXHU5NzAwXHU3NmY4XHU5NWRjXHU4Y2M3XHU4YTBhXHVmZjBjXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU3OGJhXHU1YjlhXHUzMDBkXHUzMDAyDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9yZWFzb249ezB9IFx1NmM5Mlx1NjcwOVx1NzZmOFx1NWJiOVx1NzY4NFx1NjMwN1x1NWYxNVx1OTg1ZVx1NTc4Ylx1MzAwMg0KLWludmFsaWRMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1cdTdhMGJcdTVmMGZcdTVlYWJcdThkZWZcdTVmOTFcdTcxMjFcdTY1NDhcdTMwMDJcdTcxMjFcdTZjZDVcdTVlZmFcdTdhY2IgLnByb2plY3QgXHU2YTk0XHU2ODQ4XHUzMDAyDQotY291bGROb3RMb2NrTGlicmFyeV9yZWFzb249XHU3MTIxXHU2Y2Q1XHU5Mzk2XHU1YjlhXHU3YTBiXHU1ZjBmXHU1ZWFiXHUzMDAyDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWNvcHlpbmdBdHRhY2htZW50c1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTg5MDdcdTg4ZmRcdTk2NDRcdTRlZjYuLi4NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nDQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlPVx1OGY0OVx1NjNkYlx1NjMwN1x1NWYxNVx1OTg1ZVx1NTc4Yg0KLWNvbnZlcnRHdWlkYW5jZURpYWxvZ190ZXh0PVx1OTA3OFx1NTNkNlx1NzZlZVx1NmExOVx1NjMwN1x1NWYxNVx1OTg1ZVx1NTc4Ylx1MzAwMg0KLQ0KLSMgR3VpZGFuY2UgdHlwZSBuYW1lcyBmb3IgQ29udmVydCBHdWlkYW5jZSBEaWFsb2cgLSBzaG91bGQgYmUgcmVmYWN0b3JlZCBpbnRvIGxpYnJhcnkudWkNCi1jaGVja2xpc3RfdGV4dD1cdTY4MzhcdTVjMGRcdTZlMDVcdTU1YWUNCi1jb25jZXB0X3RleHQ9XHU2OTgyXHU1ZmY1DQotZXhhbXBsZV90ZXh0PVx1N2JjNFx1NGY4Yg0KLWd1aWRlbGluZV90ZXh0PVx1NmU5Nlx1NTI0Nw0KLWVzdGltYXRlX3RleHQ9XHU5ODEwXHU0ZjMwDQotZXN0aW1hdGluZ01ldHJpY190ZXh0PVx1OTgxMFx1NGYzMFx1NmUyY1x1OTFjZlx1NTAzYw0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PVx1OTgxMFx1NGYzMFx1ODAwM1x1OTFjZg0KLXJlcG9ydF90ZXh0PVx1NTgzMVx1NTQ0YQ0KLXRlbXBsYXRlX3RleHQ9XHU3YmM0XHU2NzJjDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9XHU2NTJmXHU2M2Y0XHU4Y2M3XHU2NTk5DQotdG9vbE1lbnRvcl90ZXh0PVx1NWRlNVx1NTE3N1x1OGYxNFx1NTJhOQ0KLXdoaXRlcGFwZXJfdGV4dD1cdTc2N2RcdTc2YWVcdTY2ZjgNCi10ZXJtRGVmaW5pdGlvbl90ZXh0PVx1OGE1ZVx1NWY1OVx1NWI5YVx1N2ZhOQ0KLXByYWN0aWNlX3RleHQ9XHU3ZGY0XHU3ZmQyDQotcmV1c2FibGVBc3NldF90ZXh0PVx1NTNlZlx1OTFjZFx1ODkwN1x1NGY3Zlx1NzUyOFx1NzY4NFx1OGNjN1x1NzUyMg0KLQ0KLSNhY3Rpdml0eSBicmVha2Rvd24gaW5mbyBzdHJpbmdzDQotQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQ9XHU0ZWU1XHU2NGMxXHU2NzA5XHU4MDA1XHU4ZWFiXHU1MjA2XHU0Zjg2XHU1N2Y3XHU4ODRjDQotQWN0aXZpdHlMYXlvdXRfYWRkaXRpb25hbFRhc2tzX3RleHQ9XHU0ZWU1XHU1MTc2XHU0ZWQ2XHU4ZWFiXHU1MjA2XHU0Zjg2XHU1N2Y3XHU4ODRjDQotDQotDQotIyBDb252ZXJ0IEd1aWRhbmNlIEVycm9yIE1lc3NhZ2VzDQotY29udmVydEd1aWRhbmNlRXJyb3JfdGl0bGU9XHU4ZjQ5XHU2M2RiXHU2MzA3XHU1ZjE1XHU5ODVlXHU1NzhiXHU5MzJmXHU4YWE0DQotDQotIyBMb2FkIFJlc291cmNlcyBFcnJvciBEaWFsb2cNCi1sb2FkUmVzb3VyY2VzRXJyb3JfdGl0bGU9XHU5NThiXHU1NTVmXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU5MzJmXHU4YWE0DQotbG9hZFJlc291cmNlc0Vycm9yX3JlYXNvbj1cdTcxMjFcdTZjZDVcdThmMDlcdTUxNjVcdTRlMDBcdTRlOWJcdTdhMGJcdTVmMGZcdTVlYWJcdThjYzdcdTZlOTBcdTMwMDJcblxuXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHUzMDBkXHU0Zjg2XHU2YWEyXHU4OTk2XHU5MzJmXHU4YWE0XHVmZjBjXHU0ZTI2XHU2NWJjXHU3YTBiXHU1ZjBmXHU1ZWFiXHU0ZTJkXHU1MmEwXHU1MTY1XHU2NmY0XHU1OTFhXHU4YjhhXHU2NmY0XHU0ZTRiXHU1MjRkXHU4OWUzXHU2YzdhXHU5MzJmXHU4YWE0XHUzMDAyDQotDQotIyBSb2xlIERpYWdyYW1zDQotcm9sZURpYWdyYW1QZXJmb3Jtc190ZXh0PVx1NTdmN1x1ODg0Yw0KLXJvbGVEaWFncmFtUmVzcG9uc2libGVGb3JfdGV4dD1cdThjYTBcdThjYWMNCi0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cwPVx1NTNjM1x1NzE2N1x1NzY4NFx1NTE0M1x1N2QyMFx1ZmYxYXswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE9XHU4Y2M3XHU4YTBhXHVmZjFhezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHND1cdThiNjZcdTU0NGFcdWZmMWF7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c3PVx1OTMyZlx1OGFhNFx1ZmYxYXswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEwPVx1OTA3YVx1NmYwZlx1NTNjM1x1NzE2N1x1NzY4NFx1NTE0M1x1N2QyMCB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMT1cdTYyN2VcdTRlMGRcdTUyMzAgZ3VpZCB7MH0gXHU3Njg0XHU1MTQzXHU3ZDIwDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTI9XHU2YTk0XHU2ODQ4ICcnezB9JycgXHU1M2MzXHU3MTY3XHU1MjMwXHU5MDdhXHU2ZjBmXHU3Njg0XHU4Y2M3XHU2ZTkwICcnezF9JycNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNT1cdTkwN2FcdTZmMGZcdThjYzdcdTZlOTBcdTZhOTQgJyd7MH0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE3PVx1NzEyMVx1NmNkNVx1OTAyM1x1NjNhNSB1cmwgJyd7MH0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE5PVx1NzEyMVx1NmNkNVx1OTAyM1x1NjNhNSB1cmwgJyd7MH0nJ1x1ZmYxYXsxfQ0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOD1cdTYyN2VcdTRlMGRcdTUyMzBcdTZhOTRcdTY4NDggJyd7MH0nJ1x1MzAwMg0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOT1cdTcxMjFcdTZjZDVcdTVlZmFcdTdhY2JcdTY2YWJcdTY2NDJcdTc2ZWVcdTkzMDQgJyd7MH0nJ1x1MzAwMg0KLXVua25vd25HdWlkYW5jZV90ZXh0PVx1NGUwZFx1NjYwZQ0KLQ0KLUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb25fbG9nX25vQ29udGVudFBhdGg9Q29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5IYW5kbGVBdHRhY2htZW50c1BsdWdpbjogezB9IFx1NmM5Mlx1NjcwOSBjb250ZW50UGF0aA0KLUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXJfY2Fubm90VXBkYXRlPUlVUEwwMDA2VzogXHU3MTIxXHU2Y2Q1XHU2NmY0XHU2NWIwezB9IHsxfQ0KLXdhcm5pbmdEbGdfdGl0bGU9XHU4YjY2XHU1NDRhDQotZXJyb3JEbGdfdGl0bGU9XHU5MzJmXHU4YWE0DQotZXJyb3JEbGdfc2F2ZUVycm9yPUlVUEwwMDA1RTogXHU1MTMyXHU1YjU4XHU2YTk0XHU2ODQ4ICcnezB9JycgXHU3Njg0XHU4YjhhXHU2NmY0XHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotDQotIyBhY3Rpdml0eSBkaWFncmFtIG5hbWVzDQotYWN0aXZpdHlEaWFncmFtTmFtZT1cdTZkM2JcdTUyZDVcdTU3MTZcdWZmMWF7MH0NCi1hY3Rpdml0eURldGFpbERpYWdyYW1OYW1lPVx1NmQzYlx1NTJkNVx1NjYwZVx1N2QzMFx1NTcxNlx1ZmYxYXswfQ0KLXdwRGVwZW5kZW5jeURpYWdyYW1OYW1lPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NzZmOFx1NGY5ZFx1OTVkY1x1NGZjMlx1NTcxNlx1ZmYxYXswfQ0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFJvbGUgZGlhZ3JhbSBmb250cyBhbmQgbGF5b3V0DQotcm9sZURpYWdyYW1Gb250X25hbWU9RGlhbG9nDQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI9XHU3ZDMwXHU2NjBlXHU5YWQ0DQotcm9sZURpYWdyYW1Gb250X3NpemU9MTANCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZV93aW4zMj0xMA0KLXJvbGVEaWFncmFtX3hNYXJnaW49MjAwDQotcm9sZURpYWdyYW1feFNwYWNpbmc9NzANCi1yb2xlRGlhZ3JhbV95U3BhY2luZz0zMA0KLQ0KLSMgbG9jYWxpemUgdGhlIHZhbHVlIGJhc2VkIG9uIGxvY2FsZS4gIGZvciBleGFtcGxlLCANCi0jIGZvciBFbmdsaXNoLCB0aGUgdmFsdWUgaXMgIi4gIg0KLSNjb2xvbl93aXRoX3NwYWNlPTogDQotIyBmb3IgZnJlbmNoLCB0aGUgdmFsdWUgaXMgIiAuICIsIHlvdSBuZWVkIHRvIHVzZSBhIFwgdG8gcHJlc2VydmUgdGhlIGxlYWRpbmcgc3BhY2UNCi0jY29sb25fd2l0aF9zcGFjZT1cIDogDQotIyBmb3IgY2hpbmVzZSwgdGhlIGNvbG9uIHNob3VsZCBiZSBkb3VibGUgYnl0ZXMNCi0jIERvbnQgdHJpbSB0aGUgc3BhY2VzIGFmdGVyIHRoZSBjb2xvbi4NCi1jb2xvbl93aXRoX3NwYWNlPVx1ZmYxYSANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDBhNGZiMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGYwYzJlNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDIuamFyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNiMmIzNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UubmwyLmphciA9IHNyYy8NCi1vdXRwdXQubmwyLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDIuamFyLFwNCi0gICAgICAgICAgICAgICBsYXlvdXQvLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcnUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxZDk2MWMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvZnJhZ21lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZnJhZ21lbnROYW1lPUVQRiBDb21wb3NlciBMaWJyYXJ5IChOTDIpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvbGF5b3V0L3NjcmlwdHMvY29udGVudHBhZ2VfcnUuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9ydS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTNiMTg0OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9ydS5qcworKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCA9IGZhbHNlOw0KLXZhciBmaXJzdFNlY3Rpb247DQotdmFyIGV4cGFuZEltYWdlOw0KLXZhciBjb2xsYXBzZUltYWdlOw0KLXZhciBleHBhbmRBbGxJbWFnZTsNCi12YXIgY29sbGFwc2VBbGxJbWFnZTsNCi12YXIgYmFja1RvVG9wSW1hZ2U7DQotdmFyIHNoaW1JbWFnZTsNCi12YXIgZXhwYW5kTWVzc2FnZSA9ICLQoNCw0LfQstC10YDQvdGD0YLRjCDQstGB0LUg0YDQsNC30LTQtdC70YsiOw0KLXZhciBjb2xsYXBzZU1lc3NhZ2UgPSAi0KHQstC10YDQvdGD0YLRjCDQstGB0LUg0YDQsNC30LTQtdC70YsiOw0KLXZhciBiYWNrTWVzc2FnZSA9ICLQkiDQvdCw0YfQsNC70L4iOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHNlY3Rpb24gbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlU2VjdGlvbkxpbmtzKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IsIGltZ1BhdGgpIHsNCi0JZXhwYW5kSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZC5naWYnOwkNCi0JY29sbGFwc2VJbWFnZSA9IGltZ1BhdGggKyAnY29sbGFwc2UuZ2lmJzsNCi0JZXhwYW5kQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJzsJDQotCWNvbGxhcHNlQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlX2FsbC5naWYnOw0KLQliYWNrVG9Ub3BJbWFnZSA9IGltZ1BhdGggKyAnYmFja190b190b3AuZ2lmJzsNCi0Jc2hpbUltYWdlID0gaW1nUGF0aCArICdzaGltLmdpZic7DQotCQ0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJdmFyIHNlY3Rpb25FbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOw0KLQkJdmFyIHRvdGFsTGlua3MgPSAwOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsNCi0JCQkJc2VjdGlvbkVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCXNlY3Rpb25FbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOw0KLQkJc2VjdGlvbkNvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJZmlyc3RTZWN0aW9uID0gc2VjdGlvbkVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7CQ0KLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOw0KLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsNCi0JCQkJdmFyIG5leHRFbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2kgKyAxXTsNCi0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwgJiYgbmV4dFNpYmxpbmcuY2xhc3NOYW1lICE9ICdjb3B5cmlnaHQnKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3Moc2VjdGlvbkVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCS8vIEFkZCBhIHNwYWNpbmcgYmV0d2VlbiB0aGUgc2VjdGlvbnMuDQotCQl2YXIgc2VjdGlvblNlcGFyYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJc2VjdGlvblNlcGFyYXRvci5zcmMgPSBzaGltSW1hZ2U7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmhlaWdodCA9ICczJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYm9yZGVyID0gJzAnOw0KLQkJc2VjdGlvblNlcGFyYXRvci5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzZWN0aW9uU2VwYXJhdG9yLCBlbGVtZW50KTsNCi0JCQ0KLQkJLy8gQWRkIGEgZXhwYW5kL2NvbGxhcHNlIGxpbmsgdG8gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTZWN0aW9uOw0KLQkJc2VjdGlvbkNvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotICAgIAkNCi0JCS8vIEFkZCBhIEJhY2sgVG8gVG9wIGxpbmsgaW4gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCWNyZWF0ZUJhY2tUb1RvcExpbmsoc2libGluZ0NvbnRhaW5lcik7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIEJhY2sgdG8gdG9wIGxpbmsuDQotZnVuY3Rpb24gY3JlYXRlQmFja1RvVG9wTGluayhlbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQ0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gYmFja1RvVG9wSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYmFja01lc3NhZ2UpKTsJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZGl2KTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50Lg0KLWZ1bmN0aW9uIGV4cGFuZENvbGxhcHNlU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTZWN0aW9ucyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGw7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZE1lc3NhZ2UpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7CQkJCQkJDQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGw7DQotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VNZXNzYWdlKSk7CQkJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJLyoNCi0JCXZhciBvdmVydmlld1NlcGFyYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdmVydmlld1NlcGFyYXRvciIpOw0KLQkJb3ZlcnZpZXdTZXBhcmF0b3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBvdmVydmlld1NlcGFyYXRvcik7DQotCQkqLw0KLQkJaWYgKGZpcnN0U2VjdGlvbiAhPSBudWxsKSB7DQotCQkJZmlyc3RTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTZWN0aW9uKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBleHBhbmRBbGwoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHNlY3Rpb25zLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gVGhpcyB0ZW1wb3JhcnkgZnVuY3Rpb24gaGVscHMgdG8gcmVzb2x2ZSBKYXZhc2NyaXB0IGVycm9ycyBpbiB0aGUgbWlncmF0ZWQgUlVQDQotLy8gY29udGVudCBwYWdlcy4gSXQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgLmpzIGZpbGVzIGFyZSBiZWluZw0KLS8vIG1pZ3JhdGVkIGFsb25nIHdpdGggdGhlIEhUTUwgY29udGVudCBwYWdlcy4NCi1mdW5jdGlvbiBSZWZlcmVuY2VIZWxwVG9waWMgKHRvcGljTmFtZSwgYm9vayAsIGZpbGVOYW1lKSB7DQotICAgZG9jdW1lbnQud3JpdGUoIjxpPiIrIHRvcGljTmFtZSArICI8XC9pPiIpOw0KLX0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9sYXlvdXQvc2NyaXB0cy9zdGVwc19ydS5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyL2xheW91dC9zY3JpcHRzL3N0ZXBzX3J1LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDYxYTY1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyL2xheW91dC9zY3JpcHRzL3N0ZXBzX3J1LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0ID0gdHJ1ZTsNCi12YXIgc3RlcEltZ0JhY2tQYXRoID0gJy4uLy4uLyc7DQotdmFyIGV4cGFuZEFsbFRleHQgPSAi0KDQsNC30LLQtdGA0L3Rg9GC0Ywg0LLRgdC1INGI0LDQs9C4IjsNCi12YXIgY29sbGFwc2VBbGxUZXh0ID0gItCh0LLQtdGA0L3Rg9GC0Ywg0LLRgdC1INGI0LDQs9C4IjsNCi12YXIgZmlyc3RTdGVwU2VjdGlvbjsNCi0NCi0vLyBDcmVhdGVzIHRoZSBjb2xsYXBzaWJsZSBzdGVwIHNlY3Rpb24gbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlU3RlcExpbmtzKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IpIHsNCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7DQotCQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsNCi0JCWlmIChlbGVtZW50cy5sZW5ndGggPT0gMCkgcmV0dXJuOw0KLQkJdmFyIHN0ZXBFbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOw0KLQkJdmFyIHRvdGFsTGlua3MgPSAwOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsNCi0JCQkJc3RlcEVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCWlmICh0b3RhbExpbmtzID09IDApIHJldHVybjsNCi0JCXN0ZXBFbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOw0KLQkJc3RlcENvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJZmlyc3RTdGVwU2VjdGlvbiA9IHN0ZXBFbGVtZW50c1swXTsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBzdGVwRWxlbWVudHNbaV07DQotCQkJdmFyIHNpYmxpbmdDb250YWluZXI7DQotCQkJaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKHNpYmxpbmdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkgJiYgc2libGluZ0NvbnRhaW5lci5zdHlsZSkgew0KLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOw0KLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsNCi0JCQkJdmFyIG5leHRFbGVtZW50ID0gc3RlcEVsZW1lbnRzW2kgKyAxXTsNCi0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwpIHsNCi0JCQkJCXZhciB0b01vdmUgPSBuZXh0U2libGluZzsNCi0JCQkJCW5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmcubmV4dFNpYmxpbmc7DQotCQkJCQlzaWJsaW5nQ29udGFpbmVyLmFwcGVuZENoaWxkKHRvTW92ZSk7DQotCQkJCX0NCi0JCQkJaWYgKGNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsNCi0gICAgCQkJCXNpYmxpbmdDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0gICAgCQkJfQ0KLSAgICAJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCXN0ZXBDb2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOw0KLSAgICAJCQljcmVhdGVDb2xsYXBzaWJsZVN0ZXBTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGkpOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCX0NCi0JCWNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhzdGVwRWxlbWVudHNbMF0pOw0KLQl9DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBjb2xsYXBzaWJsZSBzdGVwIHNlY3Rpb24uDQotZnVuY3Rpb24gY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpbmRleCkgew0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkgew0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY29sbGFwc2VEaXYgPSBzaWJsaW5nQ29udGFpbmVyOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpZiAoY29sbGFwc2VTdGVwc0J5RGVmYXVsdCkgew0KLQkJCWltYWdlLnNyYyA9IGV4cGFuZEltYWdlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JCX0NCi0JCWltYWdlLndpZHRoID0gJzE3JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNSc7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uOw0KLQkJc3RlcENvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBvciBjb2xsYXBzZXMgYSBzdGVwIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50Lg0KLWZ1bmN0aW9uIGV4cGFuZENvbGxhcHNlU3RlcFNlY3Rpb24oZXZ0KSB7DQotCWlmICh0aGlzLmNvbGxhcHNlRGl2LnN0eWxlLmRpc3BsYXkgPT0gJycpIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JZWxzZSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU3RlcHMgbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTdGVwc0xpbmtzKGZpcnN0RWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlkaXYuYWxpZ24gPSAncmlnaHQnOwkJDQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGV4cGFuZEFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZEFsbFN0ZXBzOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShleHBhbmRBbGxUZXh0KSk7DQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJDQotCQlpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGNvbGxhcHNlQWxsU3RlcHM7DQotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VBbGxUZXh0KSk7DQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJDQotCQlpZiAoZmlyc3RTdGVwU2VjdGlvbikgew0KLQkJCWZpcnN0U3RlcFNlY3Rpb24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBmaXJzdFN0ZXBTZWN0aW9uKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIGFsbCBzdGVwcy4NCi1mdW5jdGlvbiBleHBhbmRBbGxTdGVwcyhldnQpIHsNCi0JIGZvciAodmFyIGkgPSAwOyBpIDwgc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkgCXN0ZXBDb2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkgCXN0ZXBDb2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JIH0NCi0JIGlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCSAJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCSB9DQotCSByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENvbGxhcHNlcyBhbGwgc3RlcHMuDQotZnVuY3Rpb24gY29sbGFwc2VBbGxTdGVwcyhldnQpIHsNCi0JZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCQlzdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQlzdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX3J1LmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfcnUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgxOGMwNzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfcnUuanMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBIZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UxID0gItCa0L7QvdGE0LjQs9GD0YDQsNGG0LjRjyDRg9C20LUg0L/QvtC60LDQt9Cw0L3QsCDQsiDQv9Cw0L3QtdC70Y/RhSI7DQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UyID0gItCf0L7QutCw0LfQsNGC0Ywg0L/QsNC90LXQu9C4IjsNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgPSAi0JIg0L3QsNGH0LDQu9C+IjsNCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiAocGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIgfHwgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvY19mcmFtZSIpICkNCi0gIHsNCi0gICAgIGFsZXJ0KHRyZWVicm93c2VyX2pzX01FU1NBR0UxKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOw0KLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArDQotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOw0KLSAgICAJDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotCXZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOyANCi0JaWYgKCAgbWFpbkluZGV4X2EgIT0gbnVsbCApIHsgDQotICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWY7IA0KLQl9IA0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsJCQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkNCi17DQotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsgICAgDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5zdWJzdHJpbmcoMCxtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7DQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7DQotICAgIHJldHVybiBuZXdfb3J5X2RvY19sb2M7ICAgIA0KLX0NCi0NCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0NCi0gICAgaWYoTVNGUGhvdmVyKQ0KLSAgICB7DQotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOw0KLSAgICAgICAgUnVwQmx1ZT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmJykpOw0KLSAgICB9DQotDQotDQotLy9uZXcgY29kZSB0byBkaXNwbGF5IHRoZSBsb2FkIGJ1dHRvbiBvciBub3QNCi12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsNCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLSAgIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2NfZnJhbWU7DQotfQ0KLQ0KLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7DQotCWRvY3VtZW50LndyaXRlKCI8YSBjbGFzcz1cImV4cGFuZENvbGxhcHNlTGlua1wiIGhyZWY9XCJKYXZhU2NyaXB0OmxvYWRUb3AoKTtcIiBvbm1vdXNlb3Zlcj1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IHNlbGYuc3RhdHVzPXRyZWVicm93c2VyX2pzX01FU1NBR0UyOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIiICsgYmFja1BhdGggKyAiaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmIik7DQotLy9TVEFSVCBOT04tVFJBTlNMQVRBQkxFDQotCWRvY3VtZW50LndyaXRlKCJcIiAgYm9yZGVyPVwiMFwiIGFsaWduPVwiYWJzbWlkZGxlXCIgYWx0PVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIlwiIG5hbWU9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgKyAiXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+IiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIjxcL2E+Iik7DQotLy9FTkQgTk9OLVRSQU5TTEFUQUJMRQ0KLX0NCi1lbHNlIHsNCi0JZG9jdW1lbnQud3JpdGUoIiZuYnNwOyIpOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9sYXlvdXQveHNsL3Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvbGF5b3V0L3hzbC9yZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjA5ZDUwOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9sYXlvdXQveHNsL3Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4NCi0NCi1hZGRpdGlvbmFsSW5mb1RleHQ9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLWFkZGl0aW9uYWxQZXJmb3JtZXJUZXh0PVx1MDQxNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0MzgNCi1hZ2dyZWdhdGVzVGV4dD1cdTA0MjFcdTA0M2VcdTA0MzJcdTA0M2VcdTA0M2FcdTA0NDNcdTA0M2ZcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDMyXHUwNDM1XHUwNDNiXHUwNDM4XHUwNDQ3XHUwNDM4XHUwNDNkXHUwNDRiDQotYWx0ZXJuYXRpdmVzVGV4dD1cdTA0MTBcdTA0M2JcdTA0NGNcdTA0NDJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0NGINCi1hcHBsaWNhdGlvblRleHQ9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1DQotYXJ0aWZhY3RUZXh0PVx1MDQxMFx1MDQ0MFx1MDQ0Mlx1MDQzNVx1MDQ0NFx1MDQzMFx1MDQzYVx1MDQ0Mg0KLWFzc2V0c1RleHQ9XHUwNDIwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDRiDQotYXNzaWdubWVudEFwcHJvYWNoZXNUZXh0PVx1MDQxZlx1MDQzZVx1MDQzNFx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQ0YiBcdTA0M2EgXHUwNDNkXHUwNDMwXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRlDQotYXNzaXN0aW5nVGV4dD1cdTA0MWZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0NDlcdTA0NGMNCi1iYWNrZ3JvdW5kVGV4dD1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NGJcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NGYNCi1icmllZk91dGxpbmVUZXh0PVx1MDQxYVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQzYVx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0NDVcdTA0MzVcdTA0M2NcdTA0MzANCi1jaGVja0l0ZW1zVGV4dD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQ0Yg0KLWNoZWNrbGlzdHNUZXh0PVx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0NGINCi1jb2xsYXBzZUFsbFRleHQ9XHUwNDIxXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNkXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGINCi1jb21wb3NpdGVSb2xlVGV4dD1cdTA0MjFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDRjDQotY29uY2VwdHNUZXh0PVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0Nlx1MDQzNVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOA0KLWNvbnRhaW5lZEFydGlmYWN0c1RleHQ9XHUwNDIxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDM1XHUwNDQxXHUwNDRmIFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzNVx1MDQ0NFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLWNvbnRhaW5lckFydGlmYWN0VGV4dD1cdTA0MTBcdTA0NDBcdTA0NDJcdTA0MzVcdTA0NDRcdTA0MzBcdTA0M2FcdTA0NDItXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNkXHUwNDM1XHUwNDQwDQotY29udGVudEVsZW1lbnRzVGV4dD1cdTA0MWFcdTA0M2JcdTA0MzBcdTA0NDFcdTA0NDFcdTA0MzhcdTA0NDRcdTA0MzhcdTA0NDZcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiDQotY29udGVudFJlZmVyZW5jZXNUZXh0PVx1MDQyMVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCBcdTA0M2RcdTA0MzAgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotZGVsaXZlcmFibGVUZXh0PVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDINCi1kZWxpdmVyYWJsZVByb3BlcnRpZXNUZXh0PVx1MDQyMVx1MDQzMlx1MDQzZVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotZGVsaXZlcmVkUGFydHNUZXh0PVx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotZGVsaXZlcmVkV29ya1Byb2R1Y3RzVGV4dD1cdTA0MTRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLWRlcGVuZGVudFRleHQ9XHUwNDE3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGINCi1kZXNjcmlwdGlvblRleHQ9XHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotZGlzY2lwbGluZVRleHQ9XHUwNDE0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDMwDQotZGlzY2lwbGluZXNUZXh0PVx1MDQxNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQ0Yg0KLXN1YmRpc2NpcGxpbmVzVGV4dD1cdTA0MTRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0NGINCi1kb21haW5UZXh0PVx1MDQxNFx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZA0KLWRvbWFpbnNUZXh0PVx1MDQxNFx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Yg0KLWV4YW1wbGVzVGV4dD1cdTA0MWZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0NDBcdTA0NGINCi1leHBhbmRBbGxUZXh0PVx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzZFx1MDQ0M1x1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NDFcdTA0MzUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiDQotZXh0ZW5kc1RleHQ9XHUwNDIwXHUwNDMwXHUwNDQxXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDRmXHUwNDM1XHUwNDQyDQotZXh0ZXJuYWxUZXh0PVx1MDQxMlx1MDQzZFx1MDQzNVx1MDQ0OFx1MDQzZFx1MDQzOFx1MDQzOQ0KLWV4dGVybmFsRGVzY3JpcHRpb25UZXh0PVx1MDQxMlx1MDQzZFx1MDQzNVx1MDQ0OFx1MDQzZFx1MDQzNVx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUNCi1nb2Fsc1RleHQ9XHUwNDI2XHUwNDM1XHUwNDNiXHUwNDM4DQotZ3VpZGVsaW5lc1RleHQ9XHUwNDIwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotaWxsdXN0cmF0aW9uc1RleHQ9XHUwNDE4XHUwNDNiXHUwNDNiXHUwNDRlXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IA0KLWltcGFjdE9mTm90SGF2aW5nVGV4dD1cdTA0MWZcdTA0M2VcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0NGYgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDRmDQotaW1wYWN0aW5nVGV4dD1cdTA0MTJcdTA0M2JcdTA0MzhcdTA0NGZcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLWlucHV0c1RleHQ9XHUwNDEyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDRiDQotaW5wdXRUb1RleHQ9XHUwNDEyXHUwNDQ1XHUwNDNlXHUwNDM0IFx1MDQzNFx1MDQzYlx1MDQ0Zg0KLWl0ZW1zVGV4dD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGINCi1rZXlDb25zaWRlcmF0aW9uc1RleHQ9XHUwNDFhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM1XHUwNDMyXHUwNDRiXHUwNDM1IFx1MDQ0M1x1MDQ0MVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Zg0KLWxldmVsc09mQWRvcHRpb25UZXh0PVx1MDQyM1x1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzZFx1MDQzOCBcdTA0MzJcdTA0M2RcdTA0MzVcdTA0MzRcdTA0NDBcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1tYW5kYXRvcnlUZXh0PVx1MDQxZVx1MDQzMVx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOQ0KLW1haW5UZXh0PVx1MDQxM1x1MDQzYlx1MDQzMFx1MDQzMlx1MDQzZFx1MDQ0Ylx1MDQzOQ0KLW1haW5EZXNjcmlwdGlvblRleHQ9XHUwNDFlXHUwNDQxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNQ0KLW1haW5SZXNwb25zaWJsZVRleHQ9XHUwNDEzXHUwNDNiXHUwNDMwXHUwNDMyXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzZVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOQ0KLW1ldGhvZFRleHQ9XHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0MiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1tb2RpZmllZEJ5VGV4dD1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2QNCi1tb3JlSW5mb1RleHQ9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLW5vdGF0aW9uVGV4dD1cdTA0MWRcdTA0M2VcdTA0NDJcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi1vcHRpb25hbFRleHQ9XHUwNDFkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM5DQotb3V0Y29tZVRleHQ9XHUwNDE4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0DQotb3V0cHV0RnJvbVRleHQ9XHUwNDEyXHUwNDRiXHUwNDQ1XHUwNDNlXHUwNDM0IFx1MDQzOFx1MDQzNw0KLW91dHB1dHNUZXh0PVx1MDQxMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQ0Yg0KLXBhY2thZ2luZ0luc3RydWN0aW9uc1RleHQ9XHUwNDE4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQzZSBcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUgXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDMyDQotcGFja2FnaW5nR3VpZGFuY2VUZXh0PVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0M2UgXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlIFx1MDQzZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzMg0KLXBlcmZvcm1pbmdSb2xlc1RleHQ9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDM4IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzOQ0KLXByaW1hcnlQZXJmb3JtZXJUZXh0PVx1MDQxZVx1MDQ0MVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGMNCi1wcm9ibGVtVGV4dD1cdTA0MWRcdTA0MzVcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0MzBcdTA0MzRcdTA0M2FcdTA0MzANCi1wcm9wZXJ0aWVzVGV4dD1cdTA0MjFcdTA0MzJcdTA0M2VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzANCi1wdXJwb3NlVGV4dD1cdTA0MWRcdTA0MzBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1yZWFzb25zRm9yTm90TmVlZGluZ1RleHQ9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDQ3XHUwNDM4XHUwNDNkXHUwNDRiIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzANCi1yZWZlcmVuY2VXb3JrZmxvd3NUZXh0PVx1MDQyMVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0NDJcdTA0M2VcdTA0M2FcdTA0MzggXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5DQotcmVsYXRlZEVsZW1lbnRzVGV4dD1cdTA0MjFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiDQotcmVsYXRpb25zaGlwc1RleHQ9XHUwNDEyXHUwNDM3XHUwNDMwXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDM4DQotcmVwb3J0c1RleHQ9XHUwNDFlXHUwNDQyXHUwNDQ3XHUwNDM1XHUwNDQyXHUwNDRiDQotcmVwcmVzZW50YXRpb25PcHRpb25zVGV4dD1cdTA0MWVcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotcmVzcG9uc2libGVUZXh0PVx1MDQxZVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOQ0KLXJlc3BvbnNpYmxlRm9yVGV4dD1cdTA0MWVcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDM3XHUwNDMwDQotcmV1c2FibGVBc3NldHNUZXh0PVx1MDQxY1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0NGINCi1yb2xlVGV4dD1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0NGMNCi1yb2xlc1RleHQ9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDM4DQotcm9sZVNldHNUZXh0PVx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1za2lsbHNUZXh0PVx1MDQxYVx1MDQzMlx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLXN0YWZmaW5nVGV4dD1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0NDFcdTA0M2VcdTA0M2RcdTA0MzBcdTA0M2INCi1zdGVwc1RleHQ9XHUwNDI4XHUwNDMwXHUwNDMzXHUwNDM4DQotc3ViY2F0ZWdvcmllc1RleHQ9XHUwNDFmXHUwNDNlXHUwNDM0XHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4IA0KLXN1YmRvbWFpbnNUZXh0PVx1MDQxZlx1MDQzZVx1MDQzNFx1MDQzNFx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Yg0KLXN1YlByYWN0aWNlc1RleHQ9XHUwNDEyXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1zdXBlclRlYW1UZXh0PVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiDQotc3VwcG9ydGluZ01hdGVyaWFsc1RleHQ9XHUwNDIxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0Yg0KLXN1YnRlYW1zVGV4dD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDMyXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZg0KLXN5bm9ueW1zVGV4dD1cdTA0MjFcdTA0MzhcdTA0M2RcdTA0M2VcdTA0M2RcdTA0MzhcdTA0M2NcdTA0NGINCi10YWlsb3JpbmdUZXh0PVx1MDQxNFx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQzYVx1MDQzMA0KLXRhc2tUZXh0PVx1MDQxN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzMA0KLXRhc2tzVGV4dD1cdTA0MTdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi10YnNUZXh0PVx1MDQyMFx1MDQzMFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2YNCi10ZWFtUHJvZmlsZVRleHQ9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0Yg0KLXRlYW1Sb2xlc1RleHQ9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzMCBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGINCi10ZWNobmlxdWVzVGV4dD1cdTA0MjBcdTA0MzVcdTA0M2FcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi10ZW1wbGF0ZUZpbGVzVGV4dD1cdTA0MjRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDQ4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkXHUwNDNlXHUwNDMyDQotdGVtcGxhdGVzVGV4dD1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0NGINCi10b29sTWVudG9yc1RleHQ9XHUwNDIwXHUwNDQzXHUwNDNhXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzZlx1MDQzZSBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2MNCi10b29sVGV4dD1cdTA0MThcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDINCi11c2FnZVRleHQ9XHUwNDE4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotd2JzVGV4dD1cdTA0MjFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0MzAgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDRiDQotd2hpdGVwYXBlcnNUZXh0PVx1MDQxOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzZVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzFcdTA0NGVcdTA0M2JcdTA0M2JcdTA0MzVcdTA0NDJcdTA0MzVcdTA0M2RcdTA0MzgNCi13b3JrUHJvZHVjdHNUZXh0PVx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGINCi13b3JrUHJvZHVjdFR5cGVzVGV4dD1cdTA0MjJcdTA0MzhcdTA0M2ZcdTA0NGIgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzMg0KLXdwYnNUZXh0PVx1MDQxOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotd29ya0JyZWFrZG93blRleHQ9XHUwNDIxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDMwDQotd29ya2Zsb3dUZXh0PVx1MDQxZlx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQzYSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzkNCi13b3JrUHJvZHVjdEJyZWFrZG93blRleHQ9XHUwNDIxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDMwIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzANCi13b3JrUHJvZHVjdERlcGVuZGVuY2llc1RleHQ9XHUwNDE3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM4IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzANCi10ZWFtUHJvZmlsZUJyZWFrZG93blRleHQ9XHUwNDIxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDMwIFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0Yg0KLXRlYW1TdHJ1Y3R1cmVUZXh0PVx1MDQyMVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQzMCBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGINCi1wYWdlTm90SW5zdGFsbGVkVGV4dD1cdTA0MjFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDZcdTA0MzAgXHUwNDNkXHUwNDM1IFx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzMA0KLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2RcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyDQotaXNOb3RWYWxpZFRleHQ9XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyLCBcdTA0M2RcdTA0MzAgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM5IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQ0Ylx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzAsIFx1MDQzZFx1MDQzNSBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDIgXHUwNDMyIFx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQzYlx1MDQzZSBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0NDUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzOSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzguDQotZWxlbWVudE1pZ2h0QmVEZWxldGVkVGV4dD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDNjXHUwNDNlXHUwNDMzIFx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2QgXHUwNDM4XHUwNDM3IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOC4NCi1wbGVhc2VGaXhMaW5rVGV4dD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NGNcdTA0NDJcdTA0MzUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMiBcdTA0MzggXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDRjXHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQ0My4NCi1pbmZvQWJvdXRNaXNzaW5nRWxlbWVudFRleHQ9XHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZSBcdTA0M2RcdTA0MzVcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzVcdTA0M2MgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDM1Og0KLWVsZW1lbnROYW1lVGV4dD1cdTA0MThcdTA0M2NcdTA0NGYgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwOg0KLWd1aWRUZXh0PUdVSUQ6DQotbWlzc2luZ0VsZW1lbnRUZXh0PVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDZcdTA0MzAgXHUwNDNkXHUwNDM1IFx1MDQzZFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzMCBcdTA0MzIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotbm90QXZhaWxhYmxlVGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQ2XHUwNDMwIFx1MDQzZFx1MDQzNSBcdTA0M2RcdTA0MzBcdTA0MzlcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzAgXHUwNDMyIFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguIFx1MDQxNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDZcdTA0MzAgXHUwNDNjXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0M2RcdTA0MzAgXHUwNDMyIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwLg0KLWVsZW1lbnRUeXBlVGV4dD1cdTA0MjJcdTA0MzhcdTA0M2YgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwOg0KLXBsdWdpbk5hbWVUZXh0PVx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGY6DQotcHJlZGVjZXNzb3JUZXh0PVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzOFx1MDQzYQ0KLXBsYW5uaW5nRGF0YVRleHQ9XHUwNDE0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQzYlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLW11bHRpcGxlT2NjdXJyZW5jZXNUZXh0PVx1MDQxZFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzkNCi1ldmVudERyaXZlblRleHQ9XHUwNDIzXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDRmXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQ0MVx1MDQzZVx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQzOFx1MDQ0Zlx1MDQzY1x1MDQzOA0KLW9uZ29pbmdUZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzOVx1MDQ0MVx1MDQ0Zg0KLXBsYW5uZWRUZXh0PVx1MDQxN1x1MDQzMFx1MDQzZlx1MDQzYlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOQ0KLXJlcGVhdGFibGVUZXh0PVx1MDQxZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Zlx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzOVx1MDQ0MVx1MDQ0Zg0KLXVzYWdlR3VpZGFuY2VUZXh0PVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlDQotaW5wdXRzVGV4dD1cdTA0MTJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGINCi1vdXRwdXRzVGV4dD1cdTA0MTJcdTA0NGJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGINCi1hY3Rpdml0eUVudHJ5U3RhdGVUZXh0PVx1MDQyMVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQ0Zlx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2RcdTA0MzAgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLWFjdGl2aXR5RXhpdFN0YXRlVGV4dD1cdTA0MjFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NGZcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNkXHUwNDMwIFx1MDQzMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1wcmVmaXhUZXh0PVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQ0MQ0KLWV4dGVybmFsSWRUZXh0PVx1MDQxMlx1MDQzZFx1MDQzNVx1MDQ0OFx1MDQzZFx1MDQzOFx1MDQzOSBcdTA0MThcdTA0MTQNCi1zY29wZVRleHQ9XHUwNDFlXHUwNDMxXHUwNDNiXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDRjDQotcm9hZG1hcFRleHQ9XHUwNDFmXHUwNDQzXHUwNDQyXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjDQotdHlwZW9mQ29udHJhY3RUZXh0PVx1MDQyMlx1MDQzOFx1MDQzZiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzANCi1wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzVGV4dD1cdTA0MjVcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDMwDQotcHJvamVjdE1lbWJlckV4cGVydGlzZVRleHQ9XHUwNDFhXHUwNDMyXHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQ0XHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQ0M1x1MDQ0N1x1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQzZFx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzVcdTA0M2FcdTA0NDJcdTA0MzANCi1yaXNrTGV2ZWxUZXh0PVx1MDQyMVx1MDQ0Mlx1MDQzNVx1MDQzZlx1MDQzNVx1MDQzZFx1MDQ0YyBcdTA0NDBcdTA0MzhcdTA0NDFcdTA0M2FcdTA0MzANCi1zY2FsZVRleHQ9XHUwNDFjXHUwNDMwXHUwNDQxXHUwNDQ4XHUwNDQyXHUwNDMwXHUwNDMxDQotdXNhZ2VOb3Rlc1RleHQ9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQzZSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUNCi1jb250ZXh0VGV4dD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDINCi1wYXJlbnRBY3Rpdml0aWVzVGV4dD1cdTA0MjBcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotaW5jbHVkZWRQYXR0ZXJuc1RleHQ9XHUwNDEyXHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQ0Yg0KLWNoZWNrbGlzdFRleHQ9XHUwNDIxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzMA0KLWNvbW11bmljYXRpb25zTWF0ZXJpYWxzVGV4dD1cdTA0MTBcdTA0M2RcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzUgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotZWR1Y2F0aW9uTWF0ZXJpYWxzVGV4dD1cdTA0MjNcdTA0NDdcdTA0MzVcdTA0MzFcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNlXHUwNDMxXHUwNDM4XHUwNDRmDQotZXN0aW1hdGluZ1RlY2huaXF1ZVRleHQ9XHUwNDFjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNhXHUwNDMwIFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQzZFx1MDQzYVx1MDQzOA0KLWFkZGl0aW9uYWxUZXh0PVx1MDQxNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZQ0KLW1vZGlmaWVzVGV4dD1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDINCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQ9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlIFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0Mg0KLWluZGV4VGV4dD1cdTA0MThcdTA0M2RcdTA0MzRcdTA0MzVcdTA0M2FcdTA0NDENCi1wcmVmaXhUZXh0PVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQ0MQ0KLWJyZWFrZG93bkVsZW1lbnRUZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0NGINCi1zdGVwc1RleHQ9XHUwNDI4XHUwNDMwXHUwNDMzXHUwNDM4DQotcHJlZGVjZXNzb3JzVGV4dD1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDhcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0MzhcdTA0M2FcdTA0MzgNCi1yZXBlYXRhYmxlVGV4dD1cdTA0MWZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGZcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzlcdTA0NDFcdTA0NGYNCi10eXBlVGV4dD1cdTA0MjJcdTA0MzhcdTA0M2YNCi1vbmdvaW5nVGV4dD1cdTA0MTJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0NGZcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzlcdTA0NDFcdTA0NGYNCi1ldmVudERyaXZlblRleHQ9XHUwNDIzXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDRmXHUwNDM1XHUwNDNjXHUwNDRiXHUwNDM5IFx1MDQ0MVx1MDQzZVx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQzOFx1MDQ0Zlx1MDQzY1x1MDQzOA0KLW1vZGVsSW5mb1RleHQ9XHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzgNCi1lbnRyeVN0YXRlVGV4dD1cdTA0MjFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NGZcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNkXHUwNDMwIFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzNQ0KLWV4aXRTdGF0ZVRleHQ9XHUwNDIxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDRmXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZFx1MDQzMCBcdTA0MzJcdTA0NGJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzUNCi10ZWFtVGV4dD1cdTA0MTNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0MzANCi1wYXJlbnRQYWNrYWdlVGV4dD1cdTA0MjBcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzkgXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyDQotY29udGFpbmVkUGFja2FnZXNUZXh0PVx1MDQyMVx1MDQzZVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzMFx1MDQ0OVx1MDQzOFx1MDQzNVx1MDQ0MVx1MDQ0ZiBcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0NGINCi1jb250ZW50c1RleHQ9XHUwNDFjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotYmFzZWRPbk1ldGhvZFJvbGVUZXh0PVx1MDQxZFx1MDQzMCBcdTA0M2VcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzUgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLWJhc2VkT25NZXRob2RUYXNrVGV4dD1cdTA0MWRcdTA0MzAgXHUwNDNlXHUwNDQxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM1IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1iYXNlZE9uTWV0aG9kV29ya1Byb2R1Y3RUZXh0PVx1MDQxZFx1MDQzMCBcdTA0M2VcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1zdW1tYXJ5VGV4dD1cdTA0MjFcdTA0MzJcdTA0M2VcdTA0MzRcdTA0M2FcdTA0MzANCi1wZXJmb3Jtc1RleHQ9XHUwNDEyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyDQotcmVwbGFjZXNUZXh0PVx1MDQxN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0Mg0KLWNvbnRyaWJ1dGVzVGV4dD1cdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDINCi1ub25lVGV4dD1cdTA0MWRcdTA0MzVcdTA0NDINCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNUZXh0PVx1MDQyMFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDNhXHUwNDM1DQotYWN0aXZpdHlSZWZlcmVuY2VzVGV4dD1cdTA0MjFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDNkXHUwNDMwIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLW5hbWVUZXh0PVx1MDQxOFx1MDQzY1x1MDQ0Zg0KLXByZXNlbnRhdGlvbk5hbWVUZXh0PVx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNmZkMWMzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YjI0NmRkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi11bmtub3duX3RleHQ9XHUwNDFkXHUwNDM1XHUwNDM4XHUwNDM3XHUwNDMyXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDNkXHUwNDNlDQotDQotIyBFcnJvciBSZWFzb25zDQotZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1cdTA0MWZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNmXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzYSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLg0KLW1pc3NpbmdMaWJyYXJ5RmlsZUVycm9yX3JlYXNvbj1cdTA0MWVcdTA0NDJcdTA0NDFcdTA0NDNcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzOCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLg0KLXVucmVzb2x2ZWRQcm94eUVycm9yX3JlYXNvbj1cdTA0MTIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNVx1MDQzZVx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDNkXHUwNDMwIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0Yi4gXHUwNDFlXHUwNDMxXHUwNDRiXHUwNDQ3XHUwNDNkXHUwNDNlIFx1MDQ0ZFx1MDQ0Mlx1MDQzZSBcdTA0MzJcdTA0NGJcdTA0MzdcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDM1XHUwNDNjIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0M2RcdTA0MzVcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0M2MgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1XHUwNDNjIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzZVx1MDQzMiBYTUkgXHUwNDMyIFx1MDQzZlx1MDQzMFx1MDQzZlx1MDQzYVx1MDQzNSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzguIFxuXG5cdTA0MTdcdTA0MzBcdTA0M2FcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDRkXHUwNDQyXHUwNDNlIFx1MDQzZVx1MDQzYVx1MDQzZFx1MDQzZSBcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQzZVx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2VcdTA0MzEgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwXHUwNDQ1IFx1MDQzMiBcdTA0M2ZcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0MzggXHUwNDFkXHUwNDM1XHUwNDNmXHUwNDNlXHUwNDNiXHUwNDMwXHUwNDM0XHUwNDNhXHUwNDM4LiBcdTA0MTJcdTA0M2UgXHUwNDM4XHUwNDM3XHUwNDMxXHUwNDM1XHUwNDM2XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0MFx1MDQzNVx1MDQzNlx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDQwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDQzXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQ0MVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NDFcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzY1x1MDQzOCBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzQgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmXHUwNDNjXHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOC4NCi0NCi0jIFdhcm5pbmcgTWVzc2FnZXMNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cxPUlVUEwwMDA3VzogXHUwNDEyIFx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzZVx1MDQzYyBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDM4XHUwNDQ1IFx1MDQzNFx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzZFx1MDQzOFx1MDQ0NSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0NDUgXHUwNDNkXHUwNDM1IFx1MDQ0NVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2VcdTA0M2ENCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cyPUlVUEwwMDA4VzogXHUwNDFkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNjXHUwNDNlIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDQ1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzZVx1MDQzYQ0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzM9SVVQTDAwMDlXOiBcdTA0MmRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2RcdTA0MzAgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzMiBcdTA0M2RcdTA0MzVcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0M2MgXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDM1DQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9tc2c9SVVQTDAwMDBFOiBcdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzAgXHUwNDQxIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMFx1MDQzY1x1MDQzOC4NCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZz1JVVBMMDAwMUU6IFx1MDQxNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzNSBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNkXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDM3XHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2EgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDNjXHUwNDQzIFx1MDQ0Mlx1MDQzOFx1MDQzZlx1MDQ0My4NCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDJFOiBcdTA0MTRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNhIFx1MDQ0Nlx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0NDJcdTA0MzhcdTA0M2ZcdTA0NDMuDQotc2F2ZUNvbnZlcnRlZEd1aWRhbmNlRXJyb3JfbXNnPUlVUEwwMDAzRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSAnJ3swfScnLg0KLQ0KLSMgQ29udmVydCBhY3Rpdml0eQ0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDQyXHUwNDM4XHUwNDNmXHUwNDMwIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwNkU6IFx1MDQyZFx1MDQ0Mlx1MDQzMCBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNkXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNlx1MDQzNVx1MDQ0MiBcdTA0MzFcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDMwIFx1MDQzMiBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQyXHUwNDM4XHUwNDNmLg0KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0U6IFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgJyd7MH0nJy4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQTDAwMDRFOiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzhcdTA0MzdcdTA0M2VcdTA0NDhcdTA0M2JcdTA0MzAgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwLiBcdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDQzXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IE9LLg0KLXVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfcmVhc29uPVx1MDQxNFx1MDQzYlx1MDQ0ZiB7MH0gXHUwNDNkXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzZVx1MDQzMlx1MDQzY1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQ0Ylx1MDQ0NSBcdTA0NDJcdTA0MzhcdTA0M2ZcdTA0M2VcdTA0MzIgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM5Lg0KLWludmFsaWRMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1cdTA0MWRcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzYSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzUuIFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiAucHJvamVjdC4NCi1jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbj1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzN1x1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzYVx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMuDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWNvcHlpbmdBdHRhY2htZW50c1Rhc2tfbmFtZT1cdTA0MWFcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDMyXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5Li4uDQotDQotIyBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZw0KLWNvbnZlcnRHdWlkYW5jZURpYWxvZ190aXRsZT1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQyXHUwNDM4XHUwNDNmIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLWNvbnZlcnRHdWlkYW5jZURpYWxvZ190ZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDZcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzkgXHUwNDQyXHUwNDM4XHUwNDNmIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi0NCi0jIEd1aWRhbmNlIHR5cGUgbmFtZXMgZm9yIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nIC0gc2hvdWxkIGJlIHJlZmFjdG9yZWQgaW50byBsaWJyYXJ5LnVpDQotY2hlY2tsaXN0X3RleHQ9XHUwNDIxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzMA0KLWNvbmNlcHRfdGV4dD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDZcdTA0MzVcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0NGYNCi1leGFtcGxlX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQwDQotZ3VpZGVsaW5lX3RleHQ9XHUwNDIwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmDQotZXN0aW1hdGVfdGV4dD1cdTA0MWVcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0MzANCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9XHUwNDFmXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjIFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQzZFx1MDQzYVx1MDQzOA0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PVx1MDQyMFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDNhXHUwNDM1DQotcmVwb3J0X3RleHQ9XHUwNDFlXHUwNDQyXHUwNDQ3XHUwNDM1XHUwNDQyDQotdGVtcGxhdGVfdGV4dD1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2QNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dD1cdTA0MjFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotdG9vbE1lbnRvcl90ZXh0PVx1MDQyMFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzZSBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDQzDQotd2hpdGVwYXBlcl90ZXh0PVx1MDQxOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzZVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0MzFcdTA0NGVcdTA0M2JcdTA0M2JcdTA0MzVcdTA0NDJcdTA0MzVcdTA0M2RcdTA0NGMNCi10ZXJtRGVmaW5pdGlvbl90ZXh0PVx1MDQxZVx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0M2NcdTA0MzhcdTA0M2RcdTA0MzANCi1wcmFjdGljZV90ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzMCBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1yZXVzYWJsZUFzc2V0X3RleHQ9XHUwNDFjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MQ0KLQ0KLSNhY3Rpdml0eSBicmVha2Rvd24gaW5mbyBzdHJpbmdzDQotQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0MzJcdTA0M2JcdTA0MzBcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0NDYNCi1BY3Rpdml0eUxheW91dF9hZGRpdGlvbmFsVGFza3NfdGV4dD1cdTA0MTJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDIgXHUwNDNhXHUwNDMwXHUwNDNhIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0M1x1MDQ0ZQ0KLQ0KLQ0KLSMgQ29udmVydCBHdWlkYW5jZSBFcnJvciBNZXNzYWdlcw0KLWNvbnZlcnRHdWlkYW5jZUVycm9yX3RpdGxlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDQyXHUwNDM4XHUwNDNmXHUwNDMwIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLQ0KLSMgTG9hZCBSZXNvdXJjZXMgRXJyb3IgRGlhbG9nDQotbG9hZFJlc291cmNlc0Vycm9yX3RpdGxlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDM4XHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1sb2FkUmVzb3VyY2VzRXJyb3JfcmVhc29uPVx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0NGIgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4LlxuXG5cdTA0MWRcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNkXHUwNDNlXHUwNDNmXHUwNDNhXHUwNDQzIFx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwXHUwNDQ1IFx1MDQzOCBcdTA0NDNcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDM4IFx1MDQzNFx1MDQzZSBcdTA0MzJcdTA0M2RcdTA0MzVcdTA0NDFcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDM1XHUwNDM5XHUwNDQ4XHUwNDM4XHUwNDQ1IFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOSBcdTA0MzIgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzLg0KLQ0KLSMgUm9sZSBEaWFncmFtcw0KLXJvbGVEaWFncmFtUGVyZm9ybXNfdGV4dD1cdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDINCi1yb2xlRGlhZ3JhbVJlc3BvbnNpYmxlRm9yX3RleHQ9XHUwNDNlXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzN1x1MDQzMA0KLQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzA9XHUwNDIxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MjogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMT1cdTA0MThcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGY6IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzQ9XHUwNDFmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1OiB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c3PVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMDogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9XHUwNDFlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTE9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2RcdTA0MzBcdTA0MzlcdTA0NDJcdTA0MzggXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBHVUlEIHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEyPVx1MDQyNFx1MDQzMFx1MDQzOVx1MDQzYiAnJ3swfScnIFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2RcdTA0MzAgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM5IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MSAnJ3sxfScnDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTU9XHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M2VcdTA0MzIgJyd7MH0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE3PVx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzYSB1cmwgJyd7MH0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE5PVx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzYSB1cmwgJyd7MH0nJzogezF9DQotSW1wb3J0RXhwb3J0VXRpbF9NU0c4PVx1MDQyNFx1MDQzMFx1MDQzOVx1MDQzYiAnJ3swfScnIFx1MDQzZFx1MDQzNSBcdTA0M2RcdTA0MzBcdTA0MzlcdTA0MzRcdTA0MzVcdTA0M2QuDQotSW1wb3J0RXhwb3J0VXRpbF9NU0c5PVx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgJyd7MH0nJy4NCi11bmtub3duR3VpZGFuY2VfdGV4dD1cdTA0MWRcdTA0MzVcdTA0MzhcdTA0MzdcdTA0MzJcdTA0MzVcdTA0NDFcdTA0NDJcdTA0M2RcdTA0M2UNCi0NCi1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uX2xvZ19ub0NvbnRlbnRQYXRoPUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uSGFuZGxlQXR0YWNobWVudHNQbHVnaW46IFx1MDQzZFx1MDQzNVx1MDQ0MiBjb250ZW50UGF0aCBcdTA0MzRcdTA0M2JcdTA0NGYgezB9DQotTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcl9jYW5ub3RVcGRhdGU9SVVQTDAwMDZXOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyB7MH0gezF9DQotd2FybmluZ0RsZ190aXRsZT1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDNcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1lcnJvckRsZ190aXRsZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzANCi1lcnJvckRsZ19zYXZlRXJyb3I9SVVQTDAwMDVFOiBcdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDMyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzNSAnJ3swfScnDQotDQotIyBhY3Rpdml0eSBkaWFncmFtIG5hbWVzDQotYWN0aXZpdHlEaWFncmFtTmFtZT1cdTA0MTRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0MzAgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5OiB7MH0NCi1hY3Rpdml0eURldGFpbERpYWdyYW1OYW1lPVx1MDQxNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMCBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDNlXHUwNDMxIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zlx1MDQ0NTogezB9DQotd3BEZXBlbmRlbmN5RGlhZ3JhbU5hbWU9XHUwNDE0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzOSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwOiB7MH0NCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBSb2xlIGRpYWdyYW0gZm9udHMgYW5kIGxheW91dA0KLXJvbGVEaWFncmFtRm9udF9uYW1lPUFyaWFsDQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI9QXJpYWwNCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZT0xMA0KLXJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyPTEwDQotcm9sZURpYWdyYW1feE1hcmdpbj0yMDANCi1yb2xlRGlhZ3JhbV94U3BhY2luZz03MA0KLXJvbGVEaWFncmFtX3lTcGFjaW5nPTMwDQotDQotIyBsb2NhbGl6ZSB0aGUgdmFsdWUgYmFzZWQgb24gbG9jYWxlLiAgZm9yIGV4YW1wbGUsIA0KLSMgZm9yIEVuZ2xpc2gsIHRoZSB2YWx1ZSBpcyAiLiAiDQotI2NvbG9uX3dpdGhfc3BhY2U9OiANCi0jIGZvciBmcmVuY2gsIHRoZSB2YWx1ZSBpcyAiIC4gIiwgeW91IG5lZWQgdG8gdXNlIGEgXCB0byBwcmVzZXJ2ZSB0aGUgbGVhZGluZyBzcGFjZQ0KLSNjb2xvbl93aXRoX3NwYWNlPVwgOiANCi0jIGZvciBjaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcw0KLSMgRG9udCB0cmltIHRoZSBzcGFjZXMgYWZ0ZXIgdGhlIGNvbG9uLg0KLWNvbG9uX3dpdGhfc3BhY2U9OiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjE2NTMyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWViYmE2NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc3BhdGg6IG5sMmEuamFyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjRhNTI2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UubmwyYS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMmEuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMmEuamFyLFwNCi0gICAgICAgICAgICAgICBsYXlvdXQvLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvZnJhZ21lbnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzFkMmExNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvZnJhZ21lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZnJhZ21lbnROYW1lPUVQRiBDb21wb3NlciBMaWJyYXJ5IChOTDJhKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9kYS5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9kYS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2E0M2E2Yy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvbGF5b3V0L3NjcmlwdHMvY29udGVudHBhZ2VfZGEuanMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotdmFyIGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQgPSBmYWxzZTsNCi12YXIgZmlyc3RTZWN0aW9uOw0KLXZhciBleHBhbmRJbWFnZTsNCi12YXIgY29sbGFwc2VJbWFnZTsNCi12YXIgZXhwYW5kQWxsSW1hZ2U7DQotdmFyIGNvbGxhcHNlQWxsSW1hZ2U7DQotdmFyIGJhY2tUb1RvcEltYWdlOw0KLXZhciBzaGltSW1hZ2U7DQotdmFyIGV4cGFuZE1lc3NhZ2UgPSAiVWR2aWQgYWxsZSBhZnNuaXQiOw0KLXZhciBjb2xsYXBzZU1lc3NhZ2UgPSAiU2tqdWwgYWxsZSBhZnNuaXQiOw0KLXZhciBiYWNrTWVzc2FnZSA9ICJUaWxiYWdlIHRpbCB0b3AiOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHNlY3Rpb24gbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlU2VjdGlvbkxpbmtzKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IsIGltZ1BhdGgpIHsNCi0JZXhwYW5kSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZC5naWYnOwkNCi0JY29sbGFwc2VJbWFnZSA9IGltZ1BhdGggKyAnY29sbGFwc2UuZ2lmJzsNCi0JZXhwYW5kQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJzsJDQotCWNvbGxhcHNlQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlX2FsbC5naWYnOw0KLQliYWNrVG9Ub3BJbWFnZSA9IGltZ1BhdGggKyAnYmFja190b190b3AuZ2lmJzsNCi0Jc2hpbUltYWdlID0gaW1nUGF0aCArICdzaGltLmdpZic7DQotCQ0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJdmFyIHNlY3Rpb25FbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOw0KLQkJdmFyIHRvdGFsTGlua3MgPSAwOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsNCi0JCQkJc2VjdGlvbkVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCXNlY3Rpb25FbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOw0KLQkJc2VjdGlvbkNvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJZmlyc3RTZWN0aW9uID0gc2VjdGlvbkVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7CQ0KLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOw0KLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsNCi0JCQkJdmFyIG5leHRFbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2kgKyAxXTsNCi0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwgJiYgbmV4dFNpYmxpbmcuY2xhc3NOYW1lICE9ICdjb3B5cmlnaHQnKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3Moc2VjdGlvbkVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCS8vIEFkZCBhIHNwYWNpbmcgYmV0d2VlbiB0aGUgc2VjdGlvbnMuDQotCQl2YXIgc2VjdGlvblNlcGFyYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJc2VjdGlvblNlcGFyYXRvci5zcmMgPSBzaGltSW1hZ2U7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmhlaWdodCA9ICczJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYm9yZGVyID0gJzAnOw0KLQkJc2VjdGlvblNlcGFyYXRvci5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzZWN0aW9uU2VwYXJhdG9yLCBlbGVtZW50KTsNCi0JCQ0KLQkJLy8gQWRkIGEgZXhwYW5kL2NvbGxhcHNlIGxpbmsgdG8gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTZWN0aW9uOw0KLQkJc2VjdGlvbkNvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotICAgIAkNCi0JCS8vIEFkZCBhIEJhY2sgVG8gVG9wIGxpbmsgaW4gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCWNyZWF0ZUJhY2tUb1RvcExpbmsoc2libGluZ0NvbnRhaW5lcik7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIEJhY2sgdG8gdG9wIGxpbmsuDQotZnVuY3Rpb24gY3JlYXRlQmFja1RvVG9wTGluayhlbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQ0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gYmFja1RvVG9wSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYmFja01lc3NhZ2UpKTsJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZGl2KTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50Lg0KLWZ1bmN0aW9uIGV4cGFuZENvbGxhcHNlU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTZWN0aW9ucyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGw7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZE1lc3NhZ2UpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7CQkJCQkJDQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGw7DQotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VNZXNzYWdlKSk7CQkJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJLyoNCi0JCXZhciBvdmVydmlld1NlcGFyYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdmVydmlld1NlcGFyYXRvciIpOw0KLQkJb3ZlcnZpZXdTZXBhcmF0b3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBvdmVydmlld1NlcGFyYXRvcik7DQotCQkqLw0KLQkJaWYgKGZpcnN0U2VjdGlvbiAhPSBudWxsKSB7DQotCQkJZmlyc3RTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTZWN0aW9uKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBleHBhbmRBbGwoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHNlY3Rpb25zLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gVGhpcyB0ZW1wb3JhcnkgZnVuY3Rpb24gaGVscHMgdG8gcmVzb2x2ZSBKYXZhc2NyaXB0IGVycm9ycyBpbiB0aGUgbWlncmF0ZWQgUlVQDQotLy8gY29udGVudCBwYWdlcy4gSXQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgLmpzIGZpbGVzIGFyZSBiZWluZw0KLS8vIG1pZ3JhdGVkIGFsb25nIHdpdGggdGhlIEhUTUwgY29udGVudCBwYWdlcy4NCi1mdW5jdGlvbiBSZWZlcmVuY2VIZWxwVG9waWMgKHRvcGljTmFtZSwgYm9vayAsIGZpbGVOYW1lKSB7DQotICAgZG9jdW1lbnQud3JpdGUoIjxpPiIrIHRvcGljTmFtZSArICI8XC9pPiIpOw0KLX0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvbGF5b3V0L3NjcmlwdHMvc3RlcHNfZGEuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvbGF5b3V0L3NjcmlwdHMvc3RlcHNfZGEuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0YmZjNjIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhL2xheW91dC9zY3JpcHRzL3N0ZXBzX2RhLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0ID0gdHJ1ZTsNCi12YXIgc3RlcEltZ0JhY2tQYXRoID0gJy4uLy4uLyc7DQotdmFyIGV4cGFuZEFsbFRleHQgPSAiVWR2aWQgYWxsZSB0cmluIjsNCi12YXIgY29sbGFwc2VBbGxUZXh0ID0gIlNranVsIGFsbGUgdHJpbiI7DQotdmFyIGZpcnN0U3RlcFNlY3Rpb247DQotDQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVN0ZXBMaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yKSB7DQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgew0KLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7DQotCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybjsNCi0JCXZhciBzdGVwRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXN0ZXBFbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlpZiAodG90YWxMaW5rcyA9PSAwKSByZXR1cm47DQotCQlzdGVwRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXN0ZXBDb2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzdGVwQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U3RlcFNlY3Rpb24gPSBzdGVwRWxlbWVudHNbMF07DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gc3RlcEVsZW1lbnRzW2ldOw0KLQkJCXZhciBzaWJsaW5nQ29udGFpbmVyOw0KLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQlzdGVwQ29sbGFwc2VEaXZzW2ldID0gc2libGluZ0NvbnRhaW5lcjsNCi0gICAgCQkJY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3Moc3RlcEVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uLg0KLWZ1bmN0aW9uIGNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbjsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgb3IgY29sbGFwc2VzIGEgc3RlcCBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uKGV2dCkgew0KLQlpZiAodGhpcy5jb2xsYXBzZURpdi5zdHlsZS5kaXNwbGF5ID09ICcnKSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWVsc2Ugew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ3JlYXRlcyB0aGUgRXhwYW5kIEFsbCBhbmQgQ29sbGFwc2UgQWxsIFN0ZXBzIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhmaXJzdEVsZW1lbnQpIHsNCi0JdmFyIGRpdjsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsJCQ0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBleHBhbmRBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGxTdGVwczsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZXhwYW5kQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCQ0KLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGNvbGxhcHNlQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBjb2xsYXBzZUFsbFN0ZXBzOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJaWYgKGZpcnN0U3RlcFNlY3Rpb24pIHsNCi0JCQlmaXJzdFN0ZXBTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTdGVwU2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc3RlcHMuDQotZnVuY3Rpb24gZXhwYW5kQWxsU3RlcHMoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsU3RlcHMoZXZ0KSB7DQotCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfZGEuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfZGEuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhNDU0NzguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2RhLmpzCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gSGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSA9ICJLb25maWd1cmF0aW9uIGVyIGFsbGVyZWRlIHZpc3QgaSBvdmVyc2lndGVyIjsNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgPSAiVmlzIG92ZXJzaWd0ZXIiOw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMyA9ICJIamVtIjsNCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiAocGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIgfHwgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvY19mcmFtZSIpICkNCi0gIHsNCi0gICAgIGFsZXJ0KHRyZWVicm93c2VyX2pzX01FU1NBR0UxKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOw0KLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArDQotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOw0KLSAgICAJDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotCXZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOyANCi0JaWYgKCAgbWFpbkluZGV4X2EgIT0gbnVsbCApIHsgDQotICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWY7IA0KLQl9IA0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsJCQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkNCi17DQotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsgICAgDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5zdWJzdHJpbmcoMCxtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7DQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7DQotICAgIHJldHVybiBuZXdfb3J5X2RvY19sb2M7ICAgIA0KLX0NCi0NCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0NCi0gICAgaWYoTVNGUGhvdmVyKQ0KLSAgICB7DQotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOw0KLSAgICAgICAgUnVwQmx1ZT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmJykpOw0KLSAgICB9DQotDQotDQotLy9uZXcgY29kZSB0byBkaXNwbGF5IHRoZSBsb2FkIGJ1dHRvbiBvciBub3QNCi12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsNCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLSAgIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2NfZnJhbWU7DQotfQ0KLQ0KLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7DQotCWRvY3VtZW50LndyaXRlKCI8YSBjbGFzcz1cImV4cGFuZENvbGxhcHNlTGlua1wiIGhyZWY9XCJKYXZhU2NyaXB0OmxvYWRUb3AoKTtcIiBvbm1vdXNlb3Zlcj1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IHNlbGYuc3RhdHVzPXRyZWVicm93c2VyX2pzX01FU1NBR0UyOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIiICsgYmFja1BhdGggKyAiaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmIik7DQotLy9TVEFSVCBOT04tVFJBTlNMQVRBQkxFDQotCWRvY3VtZW50LndyaXRlKCJcIiAgYm9yZGVyPVwiMFwiIGFsaWduPVwiYWJzbWlkZGxlXCIgYWx0PVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIlwiIG5hbWU9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgKyAiXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+IiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIjxcL2E+Iik7DQotLy9FTkQgTk9OLVRSQU5TTEFUQUJMRQ0KLX0NCi1lbHNlIHsNCi0JZG9jdW1lbnQud3JpdGUoIiZuYnNwOyIpOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvbGF5b3V0L3hzbC9yZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9sYXlvdXQveHNsL3Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYjNlNDgzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9sYXlvdXQveHNsL3Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4NCi0NCi1hZGRpdGlvbmFsSW5mb1RleHQ9RmxlcmUgb3BseXNuaW5nZXINCi1hZGRpdGlvbmFsUGVyZm9ybWVyVGV4dD1ZZGVybGlnZXJlIHVkZlx1MDBmOHJlbmRlDQotYWdncmVnYXRlc1RleHQ9U2FtbGluZ2VyDQotYWx0ZXJuYXRpdmVzVGV4dD1BbHRlcm5hdGl2ZXINCi1hcHBsaWNhdGlvblRleHQ9UHJvZ3JhbQ0KLWFydGlmYWN0VGV4dD1BcnRlZmFrdA0KLWFzc2V0c1RleHQ9QWt0aXZlcg0KLWFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dD1UaWxkZWxpbmdzbVx1MDBlNWRlcg0KLWFzc2lzdGluZ1RleHQ9SGpcdTAwZTZscGVyDQotYmFja2dyb3VuZFRleHQ9QmFnZ3J1bmQNCi1icmllZk91dGxpbmVUZXh0PUtvcnQgb3ZlcnNpZ3QNCi1jaGVja0l0ZW1zVGV4dD1Lb250cm9sZWxlbWVudGVyDQotY2hlY2tsaXN0c1RleHQ9VGpla2xpc3Rlcg0KLWNvbGxhcHNlQWxsVGV4dD1Ta2p1bCBhbGxlIGtvbnRyb2xlbGVtZW50ZXINCi1jb21wb3NpdGVSb2xlVGV4dD1TYW1tZW5zYXQgcm9sbGUNCi1jb25jZXB0c1RleHQ9QmVncmViZXINCi1jb250YWluZWRBcnRpZmFjdHNUZXh0PUluZGVob2xkdGUgYXJ0ZWZha3Rlcg0KLWNvbnRhaW5lckFydGlmYWN0VGV4dD1PcGJldmFyaW5nc3N0ZWRzYXJ0ZWZha3QNCi1jb250ZW50RWxlbWVudHNUZXh0PUthdGVnb3Jpc2VyZWRlIGVsZW1lbnRlcg0KLWNvbnRlbnRSZWZlcmVuY2VzVGV4dD1JbmRob2xkc3JlZmVyZW5jZXINCi1kZWxpdmVyYWJsZVRleHQ9TGV2ZXJhbmNlDQotZGVsaXZlcmFibGVQcm9wZXJ0aWVzVGV4dD1MZXZlcmFuY2VlZ2Vuc2thYmVyDQotZGVsaXZlcmVkUGFydHNUZXh0PUxldmVyYW5jZWRlbGUNCi1kZWxpdmVyZWRXb3JrUHJvZHVjdHNUZXh0PUxldmVyZWRlIGFyYmVqZHNwcm9kdWt0ZXINCi1kZXBlbmRlbnRUZXh0PUFmaFx1MDBlNm5naWdlIGFyYmVqZHNwcm9kdWt0ZXINCi1kZXNjcmlwdGlvblRleHQ9QmVza3JpdmVsc2UNCi1kaXNjaXBsaW5lVGV4dD1EaXNjaXBsaW4NCi1kaXNjaXBsaW5lc1RleHQ9RGlzY2lwbGluZXINCi1zdWJkaXNjaXBsaW5lc1RleHQ9VW5kZXJkaXNjaXBsaW5lcg0KLWRvbWFpblRleHQ9RG9tXHUwMGU2bmUNCi1kb21haW5zVGV4dD1Eb21cdTAwZTZuZXINCi1leGFtcGxlc1RleHQ9RWtzZW1wbGVyDQotZXhwYW5kQWxsVGV4dD1VZHZpZCBhbGxlIGtvbnRyb2xlbGVtZW50ZXINCi1leHRlbmRzVGV4dD1VZHZpZGVyDQotZXh0ZXJuYWxUZXh0PUVrc3Rlcm4NCi1leHRlcm5hbERlc2NyaXB0aW9uVGV4dD1Fa3N0ZXJuIGJlc2tyaXZlbHNlDQotZ29hbHNUZXh0PU1cdTAwZTVsDQotZ3VpZGVsaW5lc1RleHQ9UmV0bmluZ3NsaW5qZXINCi1pbGx1c3RyYXRpb25zVGV4dD1JbGx1c3RyYXRpb25lcgkNCi1pbXBhY3RPZk5vdEhhdmluZ1RleHQ9Vmlya25pbmcgYWYgaWtrZSBhdCBoYXZlDQotaW1wYWN0aW5nVGV4dD1QXHUwMGU1dmlya2VyIGFyYmVqZHNwcm9kdWt0ZXINCi1pbnB1dHNUZXh0PUlucHV0DQotaW5wdXRUb1RleHQ9SW5wdXQgdGlsDQotaXRlbXNUZXh0PUVsZW1lbnRlcg0KLWtleUNvbnNpZGVyYXRpb25zVGV4dD1OXHUwMGY4Z2xlb3ZlcnZlamVsc2VyDQotbGV2ZWxzT2ZBZG9wdGlvblRleHQ9QWRvcHRpb25zbml2ZWF1ZXINCi1tYW5kYXRvcnlUZXh0PVBcdTAwZTVrclx1MDBlNnZldA0KLW1haW5UZXh0PU92ZXJvcmRuZXQNCi1tYWluRGVzY3JpcHRpb25UZXh0PU92ZXJvcmRuZXQgYmVza3JpdmVsc2UNCi1tYWluUmVzcG9uc2libGVUZXh0PU92ZXJvcmRuZXQgYW5zdmFybGlnDQotbWV0aG9kVGV4dD1NZXRvZGVhcmJlamRzcHJvZHVrdA0KLW1vZGlmaWVkQnlUZXh0PVx1MDBjNm5kcmV0IGFmDQotbW9yZUluZm9UZXh0PUZsZXJlIG9wbHlzbmluZ2VyDQotbm90YXRpb25UZXh0PU5vdGF0aW9uDQotb3B0aW9uYWxUZXh0PVZhbGdmcml0DQotb3V0Y29tZVRleHQ9UmVzdWx0YXQNCi1vdXRwdXRGcm9tVGV4dD1PdXRwdXQgZnJhDQotb3V0cHV0c1RleHQ9T3V0cHV0DQotcGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dD1QYWtrZWluc3RydWt0aW9uZXINCi1wYWNrYWdpbmdHdWlkYW5jZVRleHQ9UGFra2V2ZWpsZWRuaW5nDQotcGVyZm9ybWluZ1JvbGVzVGV4dD1VZGZcdTAwZjhyZW5kZSByb2xsZXINCi1wcmltYXJ5UGVyZm9ybWVyVGV4dD1QcmltXHUwMGU2ciB1ZGZcdTAwZjhyZW5kZQ0KLXByb2JsZW1UZXh0PVByb2JsZW0NCi1wcm9wZXJ0aWVzVGV4dD1FZ2Vuc2thYmVyDQotcHVycG9zZVRleHQ9Rm9ybVx1MDBlNWwNCi1yZWFzb25zRm9yTm90TmVlZGluZ1RleHQ9XHUwMGM1cnNhZ2VyIHRpbCBpa2tlIGF0IGJlaFx1MDBmOHZlDQotcmVmZXJlbmNlV29ya2Zsb3dzVGV4dD1SZWZlcmVuY2VhcmJlamRzZ2FuZ2UNCi1yZWxhdGVkRWxlbWVudHNUZXh0PVJlbGF0ZXJlZGUgZWxlbWVudGVyDQotcmVsYXRpb25zaGlwc1RleHQ9UmVsYXRpb25lcg0KLXJlcG9ydHNUZXh0PVJhcHBvcnRlcg0KLXJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQ9SW5kc3RpbGxpbmdlciBmb3IgcmVwclx1MDBlNnNlbnRhdGlvbg0KLXJlc3BvbnNpYmxlVGV4dD1BbnN2YXJsaWcNCi1yZXNwb25zaWJsZUZvclRleHQ9QW5zdmFybGlnIGZvcg0KLXJldXNhYmxlQXNzZXRzVGV4dD1HZW5hbnZlbmRlbGlnZSBha3RpdmVyDQotcm9sZVRleHQ9Um9sbGUNCi1yb2xlc1RleHQ9Um9sbGVyDQotcm9sZVNldHNUZXh0PVJvbGxlc1x1MDBlNnQNCi1za2lsbHNUZXh0PUtvbXBldGVuY2VyDQotc3RhZmZpbmdUZXh0PUJlbWFuZGluZw0KLXN0ZXBzVGV4dD1UcmluDQotc3ViY2F0ZWdvcmllc1RleHQ9VW5kZXJrYXRlZ29yaWVyCQ0KLXN1YmRvbWFpbnNUZXh0PVVuZGVyZG9tXHUwMGU2bmVyDQotc3ViUHJhY3RpY2VzVGV4dD1VbmRlclx1MDBmOHZlbHNlcg0KLXN1cGVyVGVhbVRleHQ9U3VwZXJ0ZWFtcHJvZmlsDQotc3VwcG9ydGluZ01hdGVyaWFsc1RleHQ9U3RcdTAwZjh0dGVtYXRlcmlhbGUNCi1zdWJ0ZWFtc1RleHQ9VW5kZXJ0ZWFtcHJvZmlsDQotc3lub255bXNUZXh0PVN5bm9ueW1lcg0KLXRhaWxvcmluZ1RleHQ9VGlscGFzbmluZw0KLXRhc2tUZXh0PU9wZ2F2ZQ0KLXRhc2tzVGV4dD1PcGdhdmVyDQotdGJzVGV4dD1UZWFtYWxsb2tlcmluZw0KLXRlYW1Qcm9maWxlVGV4dD1UZWFtcHJvZmlsDQotdGVhbVJvbGVzVGV4dD1UZWFtcHJvZmlscm9sbGVyDQotdGVjaG5pcXVlc1RleHQ9UmV0bmluZ3NsaW5qZXINCi10ZW1wbGF0ZUZpbGVzVGV4dD1Ta2FiZWxvbmZpbGVyDQotdGVtcGxhdGVzVGV4dD1Ta2FiZWxvbmVyDQotdG9vbE1lbnRvcnNUZXh0PVZcdTAwZTZya3RcdTAwZjhqc21lbnRvcmVyDQotdG9vbFRleHQ9Vlx1MDBlNnJrdFx1MDBmOGoNCi11c2FnZVRleHQ9QnJ1Zw0KLXdic1RleHQ9QXJiZWpkc25lZGJyeWRuaW5nc3N0cnVrdHVyDQotd2hpdGVwYXBlcnNUZXh0PUh2aWRiXHUwMGY4Z2VyDQotd29ya1Byb2R1Y3RzVGV4dD1BcmJlamRzcHJvZHVrdGVyDQotd29ya1Byb2R1Y3RUeXBlc1RleHQ9QXJiZWpkc3Byb2R1a3R0eXBlcg0KLXdwYnNUZXh0PUFyYmVqZHNwcm9kdWt0YnJ1Zw0KLXdvcmtCcmVha2Rvd25UZXh0PUFyYmVqZHNuZWRicnlkbmluZw0KLXdvcmtmbG93VGV4dD1BcmJlamRzZ2FuZw0KLXdvcmtQcm9kdWN0QnJlYWtkb3duVGV4dD1BcmJlamRzcHJvZHVrdG5lZGJyeWRuaW5nDQotd29ya1Byb2R1Y3REZXBlbmRlbmNpZXNUZXh0PUFyYmVqZHNwcm9kdWt0YWZoXHUwMGU2bmdpZ2hlZGVyDQotdGVhbVByb2ZpbGVCcmVha2Rvd25UZXh0PVRlYW1uZWRicnlkbmluZw0KLXRlYW1TdHJ1Y3R1cmVUZXh0PVRlYW1zdHJ1a3R1cg0KLXBhZ2VOb3RJbnN0YWxsZWRUZXh0PVNpZGUgZXIgaWtrZSBpbnN0YWxsZXJldA0KLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PUVsZW1lbnQgZmluZGVzIGlra2UNCi1pc05vdFZhbGlkVGV4dD1EZXQgcmVmZXJlcmVkZSBlbGVtZW50IGVyIGlra2UgZXQgZ3lsZGlndCBlbGVtZW50IGkgZGV0IGFrdHVlbGxlIGJpYmxpb3Rlay4NCi1lbGVtZW50TWlnaHRCZURlbGV0ZWRUZXh0PUVsZW1lbnRldCBlciBtdWxpZ3ZpcyBzbGV0dGV0IGZyYSBiaWJsaW90ZWtldC4NCi1wbGVhc2VGaXhMaW5rVGV4dD1Lb250cm9sbFx1MDBlOXIgaW5kaG9sZHNiaWJsaW90ZWtldCwgb2cgcmV0IGxpbmtldC4NCi1pbmZvQWJvdXRNaXNzaW5nRWxlbWVudFRleHQ9T3BseXNuaW5nZXIgb20gZGV0IG1hbmdsZW5kZSBlbGVtZW50Og0KLWVsZW1lbnROYW1lVGV4dD1FbGVtZW50bmF2bjoNCi1ndWlkVGV4dD1HVUlEOg0KLW1pc3NpbmdFbGVtZW50VGV4dD1SZWZlcmVyZXQgc2lkZSBmaW5kZXMgaWtrZSBpIGRlbm5lIGtvbmZpZ3VyYXRpb24NCi1ub3RBdmFpbGFibGVUZXh0PURlbiByZWZlcmVyZWRlIHNpZGUgZXIgaWtrZSB0aWxnXHUwMGU2bmdlbGlnIGkgZGVuIGFrdHVlbGxlIGtvbmZpZ3VyYXRpb24uIFNpZGVuIGVyIG11bGlndmlzIHRpbGdcdTAwZTZuZ2VsaWcgaSBlbiBhbmRlbiBwcm9jZXNrb25maWd1cmF0aW9uLg0KLWVsZW1lbnRUeXBlVGV4dD1FbGVtZW50dHlwZToNCi1wbHVnaW5OYW1lVGV4dD1QbHVnaW4tbmF2bjoNCi1wcmVkZWNlc3NvclRleHQ9Rm9yZ1x1MDBlNm5nZXINCi1wbGFubmluZ0RhdGFUZXh0PVBsYW5sXHUwMGU2Z25pbmdzZGF0YQ0KLW11bHRpcGxlT2NjdXJyZW5jZXNUZXh0PUZsZXJlIGZvcmVrb21zdGVyDQotZXZlbnREcml2ZW5UZXh0PUFrdGl2aXRldHNzdHlyZXQNCi1vbmdvaW5nVGV4dD1JZ2FuZ3ZcdTAwZTZyZW5kZQ0KLXBsYW5uZWRUZXh0PVBsYW5sYWd0DQotcmVwZWF0YWJsZVRleHQ9S2FuIGdlbnRhZ2VzDQotdXNhZ2VHdWlkYW5jZVRleHQ9QnJ1Z3N2ZWpsZWRuaW5nDQotaW5wdXRzVGV4dD1JbnB1dA0KLW91dHB1dHNUZXh0PU91dHB1dA0KLWFjdGl2aXR5RW50cnlTdGF0ZVRleHQ9QWt0aXZpdGV0c2luZGdhbmdzdGlsc3RhbmQNCi1hY3Rpdml0eUV4aXRTdGF0ZVRleHQ9QWt0aXZpdGV0c3VkZ2FuZ3N0aWxzdGFuZA0KLXByZWZpeFRleHQ9UHJcdTAwZTZmaWtzDQotZXh0ZXJuYWxJZFRleHQ9RWtzdGVybiBpZA0KLXNjb3BlVGV4dD1PbWZhbmcNCi1yb2FkbWFwVGV4dD1WZWp2aXNlcg0KLXR5cGVvZkNvbnRyYWN0VGV4dD1Lb250cmFrdHR5cGUNCi1wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzVGV4dD1Qcm9qZWt0a2FyYWt0ZXJpc3Rpa2ENCi1wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlVGV4dD1Qcm9qZWt0ZGVsdGFnZXJrb21wZXRlbmNlDQotcmlza0xldmVsVGV4dD1SaXNpa29uaXZlYXUNCi1zY2FsZVRleHQ9U2thbGENCi11c2FnZU5vdGVzVGV4dD1CcnVnc2JlbVx1MDBlNnJrbmluZ2VyDQotY29udGV4dFRleHQ9S29udGVrc3QNCi1wYXJlbnRBY3Rpdml0aWVzVGV4dD1PdmVyb3JkbmVkZSBha3Rpdml0ZXRlcg0KLWluY2x1ZGVkUGF0dGVybnNUZXh0PUlua2x1ZGVyZWRlIG1cdTAwZjhuc3RyZQ0KLWNoZWNrbGlzdFRleHQ9VGpla2xpc3RlDQotY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNUZXh0PUtvbW11bmlrYXRpb25zbWF0ZXJpYWxlDQotZWR1Y2F0aW9uTWF0ZXJpYWxzVGV4dD1VZGRhbm5lbHNlc21hdGVyaWFsZQ0KLWVzdGltYXRpbmdUZWNobmlxdWVUZXh0PUVzdGltZXJpbmdzdGVrbmlrDQotYWRkaXRpb25hbFRleHQ9WWRlcmxpZ2VyZQ0KLW1vZGlmaWVzVGV4dD1cdTAwYzZuZHJlcg0KLWFkZGl0aW9uYWxseVBlcmZvcm1zVGV4dD1VZGZcdTAwZjhyZXIgeWRlcmxpZ2VyZQ0KLWluZGV4VGV4dD1JbmRla3MNCi1wcmVmaXhUZXh0PVByXHUwMGU2Zmlrcw0KLWJyZWFrZG93bkVsZW1lbnRUZXh0PU5lZGJyeWRuaW5nc2VsZW1lbnQNCi1zdGVwc1RleHQ9VHJpbg0KLXByZWRlY2Vzc29yc1RleHQ9Rm9yZ1x1MDBlNm5nZXJlDQotcmVwZWF0YWJsZVRleHQ9S2FuIGdlbnRhZ2VzDQotdHlwZVRleHQ9VHlwZQ0KLW9uZ29pbmdUZXh0PUlnYW5ndlx1MDBlNnJlbmRlDQotZXZlbnREcml2ZW5UZXh0PUFrdGl2aXRldHNzdHlyZXQNCi1tb2RlbEluZm9UZXh0PU1vZGVsb3BseXNuaW5nZXINCi1lbnRyeVN0YXRlVGV4dD1JbmRnYW5nc3RpbHN0YW5kDQotZXhpdFN0YXRlVGV4dD1VZGdhbmdzdGlsc3RhbmQNCi10ZWFtVGV4dD1UZWFtDQotcGFyZW50UGFja2FnZVRleHQ9T3Zlcm9yZG5ldCBwYWtrZQ0KLWNvbnRhaW5lZFBhY2thZ2VzVGV4dD1JbmRlaG9sZHRlIHBha2tlcg0KLWNvbnRlbnRzVGV4dD1JbmRob2xkDQotYmFzZWRPbk1ldGhvZFJvbGVUZXh0PUJhc2VyZXQgcFx1MDBlNSBtZXRvZGVyb2xsZQ0KLWJhc2VkT25NZXRob2RUYXNrVGV4dD1CYXNlcmV0IHBcdTAwZTUgbWV0b2Rlb3BnYXZlDQotYmFzZWRPbk1ldGhvZFdvcmtQcm9kdWN0VGV4dD1CYXNlcmV0IHBcdTAwZTUgbWV0b2RlYXJiZWpkc3Byb2R1a3QNCi1zdW1tYXJ5VGV4dD1PdmVyc2lndA0KLXBlcmZvcm1zVGV4dD1VZGZcdTAwZjhyZXINCi1yZXBsYWNlc1RleHQ9RXJzdGF0dGVyDQotY29udHJpYnV0ZXNUZXh0PUJpZHJhZ2VyDQotbm9uZVRleHQ9SW5nZW4NCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNUZXh0PUVzdGltZXJpbmdzb3ZlcnZlamVsc2VyDQotYWN0aXZpdHlSZWZlcmVuY2VzVGV4dD1Ba3Rpdml0ZXRzcmVmZXJlbmNlcg0KLW5hbWVUZXh0PU5hdm4NCi1wcmVzZW50YXRpb25OYW1lVGV4dD1Qclx1MDBlNnNlbnRhdGlvbnNuYXZuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MTlkNjQ0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gYmlibGlvdGVrDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhNjhmZmEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi11bmtub3duX3RleHQ9VWtlbmR0DQotDQotIyBFcnJvciBSZWFzb25zDQotZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1TdGllbiB0aWwgbWV0b2RlYmlibGlvdGVrIGVyIHRvbS4NCi1taXNzaW5nTGlicmFyeUZpbGVFcnJvcl9yZWFzb249TW9kZWxmaWxlbiB0aWwgbWV0b2RlYmlibGlvdGVrIG1hbmdsZXIuDQotdW5yZXNvbHZlZFByb3h5RXJyb3JfcmVhc29uPURldCB2YWxndGUgbWV0b2RlYmlibGlvdGVrIGluZGVob2xkZSB1bFx1MDBmOHN0ZSBlbGVtZW50cmVmZXJlbmNlci4gRGV0IHNreWxkZXMgbm9ybWFsdCBtYW5nbGVuZGUgZWxsZXIgZm9ya2VydCBwbGFjZXJlZGUgWE1JLWZpbGVyIGkgYmlibGlvdGVrc2ZvbGRlcmVuLlxuXG5MdWsgZGVubmUgZGlhbG9nLCBvZyBcdTAwZTVibiBvdmVyc2lndGVuIFByb2JsZW1lciBmb3IgYXQgZmluZGUgZGUgdWxcdTAwZjhzdGUgcmVmZXJlbmNlci4gRHUgYlx1MDBmOHIgbFx1MDBmOHNlIGRpc3NlIHJlZmVyZW5jZXIsIGZcdTAwZjhyIGR1IGZvcmV0YWdlciBmbGVyZSBcdTAwZTZuZHJpbmdlciBpIGJpYmxpb3Rla2V0LCBmb3IgYXQgdW5kZ1x1MDBlNSBhdCBiZXNrYWRpZ2UgYmlibGlvdGVrZXQuDQotDQotIyBXYXJuaW5nIE1lc3NhZ2VzDQotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMT1JVVBMMDAwN1c6IEVuIGVsbGVyIGZsZXJlIHVuZGVyb3JkbmVkZSBlbGVtZW50ZXIgaW5kZWhvbGRlciBtYW5nbGVuZGUgcmVmZXJlbmNlcg0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzI9SVVQTDAwMDhXOiBWXHUwMGU2bGcgZWxlbWVudGV0IGZvciBhdCBsXHUwMGY4c2UgZW4gZWxsZXIgZmxlcmUgbWFuZ2xlbmRlIHJlZmVyZW5jZXINCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2czPUlVUEwwMDA5VzogRWxlbWVudGV0IHJlZmVyZXJlciB0aWwgZW4gZWxsZXIgZmxlcmUgZWxlbWVudGVyIGkgZW4gaWtrZSB2YWxndCBwYWtrZQ0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1sb2FkUmVzb3VyY2VzRXJyb3JfbXNnPUlVUEwwMDAwRTogTWV0b2RlYmlibGlvdGVrZXQgZXIgaW5kbFx1MDBmOHN0LCBtZW4gZGVyIGVyIHJlZ2lzdHJlcmV0IGZlamwuDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9tc2c9SVVQTDAwMDFFOiBWZWpsZWRuaW5nZW4ga2FuIGlra2Uga29udmVydGVyZXMgdGlsIGVuIGFuZGVuIHR5cGUuDQotY29udmVydEd1aWRhbmNlRXJyb3JfbXNnPUlVUEwwMDAyRTogVmVqbGVkbmluZ2VuIGthbiBpa2tlIGtvbnZlcnRlcmVzIHRpbCBtXHUwMGU1bHR5cGVuLg0KLXNhdmVDb252ZXJ0ZWRHdWlkYW5jZUVycm9yX21zZz1JVVBMMDAwM0U6IERlbiBrb252ZXJ0ZXJlZGUgdmVqbGVkbmluZyAnJ3swfScnIGthbiBpa2tlIGdlbW1lcy4NCi0NCi0jIENvbnZlcnQgYWN0aXZpdHkNCi1jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZT1GZWpsIGkga29udmVydGVyaW5nIGFmIGFrdGl2aXRldHN0eXBlDQotY29udmVydEFjdGl2aXR5RXJyb3JfbXNnPUlVUEwwMDA2RTogQWt0aXZpdGV0ZW4ga2FuIGlra2Uga29udmVydGVyZXMgdGlsIG1cdTAwZTVsdHlwZW4uDQotc2F2ZUNvbnZlcnRlZEFjdGl2aXR5RXJyb3JfbXNnPUlVUEwwMDA3RTogRGVuIGtvbnZlcnRlcmVkZSBha3Rpdml0ZXQgJyd7MH0nJyBrYW4gaWtrZSBnZW1tZXMuDQotDQotIyBFcnJvciBSZWFzb25zDQotZXJyb3JfcmVhc29uPUlVUEwwMDA0RTogRGVyIGVyIG9wc3RcdTAwZTVldCBlbiBmZWpsLiBLbGlrIHBcdTAwZTUgT0sgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9yZWFzb249RGVyIGVyIGluZ2VuIGtvbXBhdGliZWwgdmVqbGVkbmluZ3N0eXBlIGZvciB7MH0uDQotaW52YWxpZExpYnJhcnlQYXRoRXJyb3JfcmVhc29uPVVneWxkaWcgYmlibGlvdGVrc3N0aS4gRmlsZW4gLnByb2plY3Qga2FuIGlra2Ugb3ByZXR0ZXMuDQotY291bGROb3RMb2NrTGlicmFyeV9yZWFzb249S2FuIGlra2UgbFx1MDBlNXNlIGJpYmxpb3Rlay4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotY29weWluZ0F0dGFjaG1lbnRzVGFza19uYW1lPUtvcGllcmVyIHZlZGhcdTAwZTZmdG5pbmdlci4uLg0KLQ0KLSMgQ29udmVydCBHdWlkYW5jZSBEaWFsb2cNCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGU9S29udmVydFx1MDBlOXIgdmVqbGVkbmluZ3N0eXBlDQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RleHQ9Vlx1MDBlNmxnIG1cdTAwZTVsdmVqbGVkbmluZ3N0eXBlbi4NCi0NCi0jIEd1aWRhbmNlIHR5cGUgbmFtZXMgZm9yIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nIC0gc2hvdWxkIGJlIHJlZmFjdG9yZWQgaW50byBsaWJyYXJ5LnVpDQotY2hlY2tsaXN0X3RleHQ9VGpla2xpc3RlDQotY29uY2VwdF90ZXh0PUJlZ3JlYg0KLWV4YW1wbGVfdGV4dD1Fa3NlbXBlbA0KLWd1aWRlbGluZV90ZXh0PVJldG5pbmdzbGluamUNCi1lc3RpbWF0ZV90ZXh0PUVzdGltYXQNCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9RXN0aW1lcmluZ3NtXHUwMGU1bGVzeXN0ZW0NCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dD1Fc3RpbWVyaW5nc292ZXJ2ZWplbHNlcg0KLXJlcG9ydF90ZXh0PVJhcHBvcnQNCi10ZW1wbGF0ZV90ZXh0PVNrYWJlbG9uDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9U3RcdTAwZjh0dGVtYXRlcmlhbGUNCi10b29sTWVudG9yX3RleHQ9Vlx1MDBlNnJrdFx1MDBmOGpzbWVudG9yDQotd2hpdGVwYXBlcl90ZXh0PUh2aWRib2cNCi10ZXJtRGVmaW5pdGlvbl90ZXh0PVRlcm1kZWZpbml0aW9uDQotcHJhY3RpY2VfdGV4dD1cdTAwZDh2ZWxzZQ0KLXJldXNhYmxlQXNzZXRfdGV4dD1HZW5hbnZlbmRlbGlndCBha3Rpdg0KLQ0KLSNhY3Rpdml0eSBicmVha2Rvd24gaW5mbyBzdHJpbmdzDQotQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQ9VWRmXHUwMGY4cmVyIHNvbSBlamVyDQotQWN0aXZpdHlMYXlvdXRfYWRkaXRpb25hbFRhc2tzX3RleHQ9VWRmXHUwMGY4cmVyIHNvbSB5ZGVybGlnZXJlDQotDQotDQotIyBDb252ZXJ0IEd1aWRhbmNlIEVycm9yIE1lc3NhZ2VzDQotY29udmVydEd1aWRhbmNlRXJyb3JfdGl0bGU9RmVqbCBpIGtvbnZlcnRlcmluZyBhZiB2ZWpsZWRuaW5nDQotDQotIyBMb2FkIFJlc291cmNlcyBFcnJvciBEaWFsb2cNCi1sb2FkUmVzb3VyY2VzRXJyb3JfdGl0bGU9RmVqbCBpIFx1MDBlNWJuaW5nIGFmIG1ldG9kZWJpYmxpb3Rlaw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb249Tm9nbGUgYmlibGlvdGVrc3Jlc3NvdXJjZXIga2FuIGlra2UgaW5kbFx1MDBlNnNlcy5cblxuS2xpayBwXHUwMGU1IE9wbHlzbmluZ2VyIGZvciBhdCBnZW5uZW1zZSBmZWpsZW5lLCBvZyByZXQgZGVtLCBmXHUwMGY4ciBkdSBmb3JldGFnZXIgZmxlcmUgXHUwMGU2bmRyaW5nZXIgaSBiaWJsaW90ZWtldC4NCi0NCi0jIFJvbGUgRGlhZ3JhbXMNCi1yb2xlRGlhZ3JhbVBlcmZvcm1zX3RleHQ9dWRmXHUwMGY4cmVyDQotcm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0PWFuc3ZhcmxpZyBmb3INCi0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cwPVJlZmVyZXJldCBlbGVtZW50OiB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxPUluZm86IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzQ9QWR2YXJzZWw6IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzc9RmVqbDogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9TWFuZ2xlciByZWZlcmVyZXQgZWxlbWVudCB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMT1LYW4gaWtrZSBmaW5kZSBlbGVtZW50IGZvciBHVUlEIHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEyPUZpbGVuICcnezB9JycgcmVmZXJlcmVyIHRpbCBkZW4gbWFuZ2xlZGUgcmVzc291cmNlICcnezF9JycNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNT1tYW5nbGVyIHJlc3NvdXJjZWZpbGVuICcnezB9JycNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNz1LYW4gaWtrZSBvcHJldHRlIGZvcmJpbmRlbHNlIHRpbCBVUkwnJ2VuICcnezB9JycNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxOT1LYW4gaWtrZSBvcHJldHRlIGZvcmJpbmRlbHNlIHRpbCBVUkwnJ2VuICcnezB9Jyc6IHsxfQ0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOD1LYW4gaWtrZSBmaW5kZSBmaWxlbiAnJ3swfScnLg0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOT1LYW4gaWtrZSBvcHJldHRlIGRldCBtaWRsZXJ0aWRpZ2UgYmlibGlvdGVrICcnezB9JycuDQotdW5rbm93bkd1aWRhbmNlX3RleHQ9VWtlbmR0DQotDQotQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbl9sb2dfbm9Db250ZW50UGF0aD1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uLkhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luOiBpbmdlbiBjb250ZW50UGF0aCB0aWwgezB9DQotTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcl9jYW5ub3RVcGRhdGU9SVVQTDAwMDZXOiBLYW4gaWtrZSBvcGRhdGVyZSB7MH0gezF9DQotd2FybmluZ0RsZ190aXRsZT1BZHZhcnNlbA0KLWVycm9yRGxnX3RpdGxlPUZlamwNCi1lcnJvckRsZ19zYXZlRXJyb3I9SVVQTDAwMDVFOiBGZWpsIHVuZGVyIGxhZ3JpbmcgYWYgXHUwMGU2bmRyaW5nZXIgdGlsIGZpbGVuICcnezB9JycNCi0NCi0jIGFjdGl2aXR5IGRpYWdyYW0gbmFtZXMNCi1hY3Rpdml0eURpYWdyYW1OYW1lPUFrdGl2aXRldHNkaWFncmFtOiB7MH0NCi1hY3Rpdml0eURldGFpbERpYWdyYW1OYW1lPUFrdGl2aXRldHNvcGx5c25pbmdzZGlhZ3JhbTogezB9DQotd3BEZXBlbmRlbmN5RGlhZ3JhbU5hbWU9RGlhZ3JhbSBmb3IgYXJiZWpkc3Byb2R1a3RhZmhcdTAwZTZuZ2lnaGVkOiB7MH0NCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBSb2xlIGRpYWdyYW0gZm9udHMgYW5kIGxheW91dA0KLXJvbGVEaWFncmFtRm9udF9uYW1lPUFyaWFsDQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI9QXJpYWwNCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZT0xMA0KLXJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyPTEwDQotcm9sZURpYWdyYW1feE1hcmdpbj0yMDANCi1yb2xlRGlhZ3JhbV94U3BhY2luZz03MA0KLXJvbGVEaWFncmFtX3lTcGFjaW5nPTMwDQotDQotIyBsb2NhbGl6ZSB0aGUgdmFsdWUgYmFzZWQgb24gbG9jYWxlLiAgZm9yIGV4YW1wbGUsIA0KLSMgZm9yIEVuZ2xpc2gsIHRoZSB2YWx1ZSBpcyAiLiAiDQotI2NvbG9uX3dpdGhfc3BhY2U9OiANCi0jIGZvciBmcmVuY2gsIHRoZSB2YWx1ZSBpcyAiIC4gIiwgeW91IG5lZWQgdG8gdXNlIGEgXCB0byBwcmVzZXJ2ZSB0aGUgbGVhZGluZyBzcGFjZQ0KLSNjb2xvbl93aXRoX3NwYWNlPVwgOiANCi0jIGZvciBjaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcw0KLSMgRG9udCB0cmltIHRoZSBzcGFjZXMgYWZ0ZXIgdGhlIGNvbG9uLg0KLWNvbG9uX3dpdGhfc3BhY2U9OiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTc4ZDZmMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjVjYjk0Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIExpYnJhcnkgUGVyc2lzdGVuY2UgKE5MMSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2U7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTdiMDEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9lcy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcHRfQlIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2l0LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYzM5MWVmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBCaWJsaW90aGVrc3BlcnNpc3RlbnoNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjdmNGIyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9UGVyc2lzdGVuY2lhIGRlIGJpYmxpb3RlY2EgZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExM2Q5ODguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVBlcnNpc3RhbmNlIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Y2MwZmI2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1QZXJzaXN0ZW56YSBsaWJyZXJpYSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5famEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2IyYWFiZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIExpYnJhcnkgUGVyc2lzdGVuY2UNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjIzMzVkZi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWM5YzBcdWMxOGRcdWMxMzENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTAzMjczNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9UGVyc2lzdFx1MDBlYW5jaWEgZGEgQmlibGlvdGVjYSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTliNTg3ZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1NWU5M1x1NjMwMVx1NGU0NVx1NjAyNw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjJhYWJkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgTGlicmFyeSBQZXJzaXN0ZW5jZQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk5NGNjMjAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWROYW1lRXJyb3JfbXNnPURlciBOYW1lICcnezB9JycgaXN0IHVuZ1x1MDBmY2x0aWcuIERpZSBmb2xnZW5kZW4gWmVpY2hlbiBzaW5kIGluIE5hbWVuIGZcdTAwZmNyIE1ldGhvZGVuZWxlbWVudGUgbmljaHQgenVsXHUwMGU0c3NpZzogXFwgLyA6ICogPyAiIDwgPiB8DQotb2JqTm90Rm91bmRFcnJvcl9tc2c9RXMgd3VyZGUga2VpbiBPYmpla3QgbWl0IGRlciBJRCAnJ3swfScnIGdlZnVuZGVuLg0KLWxvYWRMaWJyYXJ5RXJyb3JfbXNnPUZlaGxlciBiZWltIExhZGVuIGRlciBNZXRob2RlbmJpYmxpb3RoZWs6DQotbG9hZExpYnJhcnlFcnJvcl9kZXRhaWxzPVwgXCBaZWlsZTogezB9LCBTcGFsdGU6IHsxfSwgTmFjaHJpY2h0OiB7Mn0NCi1yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2c9RGllIFJlc3NvdXJjZSAnJ3swfScnIGtvbm50ZSBuaWNodCB3aWVkZXJoZXJnZXN0ZWxsdCB3ZXJkZW4uDQotRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5PURpZSBEYXRlaSAnJ3swfScnIGlzdCBzY2hyZWliZ2VzY2hcdTAwZmN0enQuDQotRXJyTXNnX0NvdWxkTm90RGVsZXRlPXswfSBrb25udGUgbmljaHQgZ2VsXHUwMGY2c2NodCB3ZXJkZW4uIHsxfQ0KLXJlbmFtZUVycm9yX21zZz0nJ3swfScnIGtvbm50ZSBuaWNodCBpbiAnJ3sxfScnIHVtYmVuYW5udCB3ZXJkZW4uDQotYmFja3VwRXJyb3JfbXNnPURpZSBSZXNzb3VyY2UgJyd7MH0nJyBrb25udGUgbmljaHQgZ2VzaWNoZXJ0IHdlcmRlbi4NCi1tYXJrZXJfZXJyX2Nhbm5vdFJlc29sdmVQcm94eT1EZXIgUHJveHkgezB9IGtvbm50ZSBuaWNodCBhdWZnZWxcdTAwZjZzdCB3ZXJkZW4uDQotbW9kaWZ5RmlsZUVycm9yX21zZz1EaWUgRGF0ZWkgJyd7MH0nJyBrYW5uIG5pY2h0IGdlXHUwMGU0bmRlcnQgd2VyZGVuLg0KLWxvYWRSZXNvdXJjZUVycm9yX21zZz1EaWUgUmVzc291cmNlICcnezB9Jycga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuLg0KLWxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c9RGllIFJlc3NvdXJjZSAnJ3swfScnIGtvbm50ZSBuaWNodCBnZWxhZGVuIHdlcmRlbi4gVXJzYWNoZTogezF9DQotaW52YWxpZExpYnJhcnlGaWxlRXJyb3JfbXNnPVVuZ1x1MDBmY2x0aWdlIE1ldGhvZGVuYmlibGlvdGhla3NkYXRlaToNCi1maWxlTm90Rm91bmRFcnJvcl9tc2c9IEVzIHd1cmRlIGtlaW5lIE1ldGhvZGVuYmlibGlvdGhla3NkYXRlaSBpbSBBcmJlaXRzYmVyZWljaCAnJ3swfScnIGdlZnVuZGVuLg0KLW5vcm1hbGl6ZVVSSUVycm9yX21zZz1EZXIgbm9ybWFsaXNpZXJ0ZSBVUkkgZlx1MDBmY3IgJyd7MH0nJyB3dXJkZSBuaWNodCBnZWZ1bmRlbi4NCi1tb3ZlRXJyb3JfbXNnPScnezB9Jycga29ubnRlIG5pY2h0IG5hY2ggJyd7MX0nJyB2ZXJzY2hvYmVuIHdlcmRlbi4gRGFzIFppZWwgaXN0IGJlcmVpdHMgdm9yaGFuZGVuLg0KLW1vZGlmeVJlYWRPbmx5RmlsZUVycm9yX21zZz1EaWUgZm9sZ2VuZGVuIHNjaHJlaWJnZXNjaFx1MDBmY3R6dGVuIERhdGVpZW4ga1x1MDBmNm5uZW4gbmljaHQgZ2VcdTAwZTRuZGVydCB3ZXJkZW46IHswfQ0KLW1vdmVSZXNvdXJjZUVycm9yX21zZz1EaWUgUmVzc291cmNlICcnezB9JycgaXN0IGFuIGVpbmVyIFBlcnNpc3RlbnpvcGVyYXRpb24gYmV0ZWlsaWd0LCBkaWUgbm9jaCBuaWNodCBmZXN0Z2VzY2hyaWViZW4gd3VyZGUuDQotbW9kaWZ5RmlsZXNFcnJvcl9tc2c9TWluZGVzdGVucyBlaW5lIERhdGVpIGtvbm50ZSBuaWNodCBnZVx1MDBlNG5kZXJ0IHdlcmRlbi4NCi1yZXNvdXJjZU91dE9mU3luY2hfbXNnPURpZSBSZXNzb3VyY2UgaXN0IG5pY2h0IHN5bmNocm9uaXNpZXJ0IHVuZCBtdXNzIGVybmV1dCBnZWxhZGVuIHdlcmRlbjogezB9DQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPU1ldGhvZGVuYmlibGlvdGhlayB3aXJkIGdlbGFkZW4uLi4NCi1tb3ZlRGF0YVRhc2tfbmFtZT1EYXRlbiB3ZXJkZW4gdmVyc2Nob2Jlbi4uLg0KLXNhdmVMaWJyYXJ5VGFza19uYW1lPU1ldGhvZGVuYmlibGlvdGhlayB3aXJkIGdlc3BlaWNoZXJ0Li4uDQotbG9hZFJlc291cmNlc1Rhc2tfbmFtZT1BbGxlIFJlc3NvdXJjZW4gd2VyZGVuIGluIGRlbiBIYXVwdHNwZWljaGVyIGdlbGFkZW4uLi4NCi1taWdyYXRlQ29udGVudERlc2NyaXB0aW9uc1Rhc2tfbmFtZT1Qcm96ZXNzaW5oYWx0c2Jlc2NocmVpYnVuZ2VuIHdlcmRlbiBtaWdyaWVydC4uLg0KLWZpeFByZXNlbnRhdGlvbk5hbWVUYXNrX25hbWU9TmljaHQgdm9yaGFuZGVuZXIvbGVlcmVyIFByXHUwMGU0c2VudGF0aW9uc25hbWUgamVkZXMgU3RydWt0dXJlbGVtZW50cyB3aXJkIGF1ZiBkZW4gZW50c3ByZWNoZW5kZW4gTmFtZW4gZ2VzZXR6dC4uLg0KLVVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXJfY291bGROb3RSZXNvbHZlUHJveHk9RGVyIFByb3h5ICcnezB9Jycga29ubnRlIG5pY2h0IGF1ZmdlbFx1MDBmNnN0IHdlcmRlbi4NCi1yZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lPUJpYmxpb3RoZWtzZGF0ZWllbiBpbSBBcmJlaXRzYmVyZWljaCB3ZXJkZW4gYWt0dWFsaXNpZXJ0Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPURpZSBhdXNnZXdcdTAwZTRobHRlbiBEYXRlaWVuIHdlcmRlbiBuaWNodCB1bnRlcnN0XHUwMGZjdHp0LiBGXHUwMGZjaHJlbiBTaWUgZWluZW4gVXBncmFkZSBhdWYgZWluZSBuZXVlcmUgVmVyc2lvbiB2b24gezB9IGR1cmNoLiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3MDFjYjAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWROYW1lRXJyb3JfbXNnPUVsIG5vbWJyZSAnJ3swfScnIG5vIGVzIHZcdTAwZTFsaWRvLiBFbCBub21icmUgZGUgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gbm8gcHVlZGUgY29udGVuZXIgZXN0b3MgY2FyYWN0ZXJlczogXFwgLyA6ICogPyAiIDwgPiB8DQotb2JqTm90Rm91bmRFcnJvcl9tc2c9Tm8gc2UgaGEgcG9kaWRvIGVuY29udHJhciBlbCBvYmpldG8gY29uIGVsIElEICcnezB9JycNCi1sb2FkTGlicmFyeUVycm9yX21zZz1TZSBoYW4gcHJvZHVjaWRvIGVycm9yZXMgYWwgY2FyZ2FyIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zOg0KLWxvYWRMaWJyYXJ5RXJyb3JfZGV0YWlscz1cIFwgbFx1MDBlZG5lYTogezB9LCBjb2x1bW5hOiB7MX0sIG1zZzogezJ9DQotcmVzdG9yZVJlc291cmNlRXJyb3JfbXNnPU5vIHNlIGhhIHBvZGlkbyByZXN0YXVyYXIgZWwgcmVjdXJzbyAnJ3swfScnDQotRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5PUVsIGFyY2hpdm8gJyd7MH0nJyBlcyBkZSBzXHUwMGYzbG8gbGVjdHVyYQ0KLUVyck1zZ19Db3VsZE5vdERlbGV0ZT1ObyBzZSBoYSBwb2RpZG8gc3VwcmltaXIgezB9LiB7MX0NCi1yZW5hbWVFcnJvcl9tc2c9Tm8gc2UgaGEgcG9kaWRvIHJlbm9tYnJhciAnJ3swfScnIGNvbW8gJyd7MX0nJw0KLWJhY2t1cEVycm9yX21zZz1ObyBzZSBwb2RpZG8gcmVhbGl6YXIgdW5hIGNvcGlhIGRlIHNlZ3VyaWRhZCBkZWwgcmVjdXJzbyAnJ3swfScnDQotbWFya2VyX2Vycl9jYW5ub3RSZXNvbHZlUHJveHk9Tm8gc2UgaGEgcG9kaWRvIHJlc29sdmVyIGVsIHByb3h5IHswfQ0KLW1vZGlmeUZpbGVFcnJvcl9tc2c9Tm8gc2UgcHVlZGUgbW9kaWZpY2FyIGVsIGFyY2hpdm8gJyd7MH0nJw0KLWxvYWRSZXNvdXJjZUVycm9yX21zZz1ObyBzZSBoYSBwb2RpZG8gY2FyZ2FyIGVsIHJlY3Vyc28gJyd7MH0nJw0KLWxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c9Tm8gc2UgaGEgcG9kaWRvIGNhcmdhciBlbCByZWN1cnNvICcnezB9JycuIE1vdGl2bzogezF9DQotaW52YWxpZExpYnJhcnlGaWxlRXJyb3JfbXNnPUFyY2hpdm8gZGUgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3Mgbm8gdlx1MDBlMWxpZG86DQotZmlsZU5vdEZvdW5kRXJyb3JfbXNnPU5vIHNlIGhhIHBvZGlkbyB1YmljYXIgbmluZ1x1MDBmYW4gYXJjaGl2byBkZSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBlbiBlbCBlc3BhY2lvIGRlIHRyYWJham8gJyd7MH0nJw0KLW5vcm1hbGl6ZVVSSUVycm9yX21zZz1ObyBzZSBoYSBwb2RpZG8gZW5jb250cmFyIGVsIFVSSSBub3JtYWxpemFkbyBwYXJhICcnezB9JycNCi1tb3ZlRXJyb3JfbXNnPU5vIHNlIGhhIHBvZGlkbyBtb3ZlciAnJ3swfScnIGEgJyd7MX0nJy4gRWwgZGVzdGlubyB5YSBleGlzdGUuDQotbW9kaWZ5UmVhZE9ubHlGaWxlRXJyb3JfbXNnPU5vIHNlIHB1ZWRlIG1vZGlmaWNhciBlbCBhcmNoaXZvIGRlIHNcdTAwZjNsbyBsZWN0dXJhOiB7MH0NCi1tb3ZlUmVzb3VyY2VFcnJvcl9tc2c9RWwgcmVjdXJzbyAnJ3swfScnIGVzdFx1MDBlMSBpbXBsaWNhZG8gZW4gdW5hIG9wZXJhY2lcdTAwZjNuIGRlIHBlcm1hbmVuY2lhIHF1ZSBubyBzZSBoYSBjb25maXJtYWRvLg0KLW1vZGlmeUZpbGVzRXJyb3JfbXNnPU5vIHNlIGhhbiBwb2RpZG8gbW9kaWZpY2FyIHVubyBvIHZhcmlvcyBhcmNoaXZvcw0KLXJlc291cmNlT3V0T2ZTeW5jaF9tc2c9RWwgcmVjdXJzbyBubyBlc3RcdTAwZTEgc2luY3Jvbml6YWRvIHkgc2UgdGllbmUgcXVlIGNhcmdhciBkZSBudWV2bzogezB9DQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPUNhcmdhbmRvIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLi4uDQotbW92ZURhdGFUYXNrX25hbWU9TW92aWVuZG8gbG9zIGRhdG9zLi4uDQotc2F2ZUxpYnJhcnlUYXNrX25hbWU9R3VhcmRhbmRvIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLi4uDQotbG9hZFJlc291cmNlc1Rhc2tfbmFtZT1DYXJnYW5kbyB0b2RvcyBsb3MgcmVjdXJzb3MgZW4gbGEgbWVtb3JpYS4uLg0KLW1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb25zVGFza19uYW1lPU1pZ3JhbmRvIGxhcyBkZXNjcmlwY2lvbmVzIGRlIGNvbnRlbmlkbyBkZWwgcHJvY2Vzby4uLg0KLWZpeFByZXNlbnRhdGlvbk5hbWVUYXNrX25hbWU9RXN0YWJsZWNpZW5kbyBlbCBub21icmUgZGUgcHJlc2VudGFjaVx1MDBmM24gbnVsby92YWNcdTAwZWRvIGRlIHRvZG9zIGxvcyBlbGVtZW50b3MgZGUgZGVzZ2xvc2UgZW4gc3Ugbm9tYnJlLi4uDQotVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eT1ObyBzZSBoYSBwb2RpZG8gcmVzb2x2ZXIgZWwgcHJveHkgJyd7MH0nJw0KLXJlZnJlc2hMaWJyYXJ5RmlsZXNUYXNrX25hbWU9UmVub3ZhbmRvIGFyY2hpdm9zIGRlIGJpYmxpb3RlY2EgZW4gZWwgZXNwYWNpbyBkZSB0cmFiYWpvDQotdmVyc2lvbk1pc21hdGNoX29sZFRvb2w9TG9zIGFyY2hpdm9zIHNlbGVjY2lvbmFkb3Mgbm8gZXN0XHUwMGUxbiBzb3BvcnRhZG9zLCBhY3R1YWxpY2UgYSB1bmEgdmVyc2lcdTAwZjNuIG1cdTAwZTFzIHJlY2llbnRlIGRlIHswfS4gDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOGE5YWNmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkTmFtZUVycm9yX21zZz1MZSBub20gJyd7MH0nJyBlc3Qgbm9uIHZhbGlkZS4gTGUgbm9tIGRlIGwnJ1x1MDBlOWxcdTAwZTltZW50IGRlIG1cdTAwZTl0aG9kZSBuZSBwZXV0IHBhcyBjb250ZW5pciBsZXMgY2FyYWN0XHUwMGU4cmVzIHN1aXZhbnRzIDogXFwgLyA6ICogPyAiIDwgPiB8DQotb2JqTm90Rm91bmRFcnJvcl9tc2c9SW1wb3NzaWJsZSBkZSB0cm91dmVyIGRlcyBvYmpldHMgZG9udCBsJydpZGVudGlmaWNhdGV1ciBlc3QgJyd7MH0nJw0KLWxvYWRMaWJyYXJ5RXJyb3JfbXNnPURlcyBlcnJldXJzIHNlIHNvbnQgcHJvZHVpdGVzIGxvcnMgZHUgY2hhcmdlbWVudCBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIDoNCi1sb2FkTGlicmFyeUVycm9yX2RldGFpbHM9XCBcIGxpZ25lIDogezB9LCBjb2xvbm5lIDogezF9LCBtZXNzYWdlIDogezJ9DQotcmVzdG9yZVJlc291cmNlRXJyb3JfbXNnPUltcG9zc2libGUgZGUgcmVzdGF1cmVyIGxhIHJlc3NvdXJjZSAnJ3swfScnDQotRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5PUxlIGZpY2hpZXIgJyd7MH0nJyBlc3QgZW4gbGVjdHVyZSBzZXVsZW1lbnQNCi1FcnJNc2dfQ291bGROb3REZWxldGU9SW1wb3NzaWJsZSBkZSBzdXBwcmltZXIgezB9LiB7MX0NCi1yZW5hbWVFcnJvcl9tc2c9SW1wb3NzaWJsZSBkZSByZW5vbW1lciAnJ3swfScnIGVuICcnezF9JycNCi1iYWNrdXBFcnJvcl9tc2c9SW1wb3NzaWJsZSBkZSBzYXV2ZWdhcmRlciBsYSByZXNzb3VyY2UgJyd7MH0nJw0KLW1hcmtlcl9lcnJfY2Fubm90UmVzb2x2ZVByb3h5PUltcG9zc2libGUgZGUgclx1MDBlOXNvdWRyZSBsZSBwcm94eSB7MH0NCi1tb2RpZnlGaWxlRXJyb3JfbXNnPUltcG9zc2libGUgZGUgbW9kaWZpZXIgbGUgZmljaGllciAnJ3swfScnDQotbG9hZFJlc291cmNlRXJyb3JfbXNnPUltcG9zc2libGUgZGUgY2hhcmdlciBsYSByZXNzb3VyY2UgJyd7MH0nJw0KLWxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c9SW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGxhIHJlc3NvdXJjZSAnJ3swfScnLiBDYXVzZSA6IHsxfQ0KLWludmFsaWRMaWJyYXJ5RmlsZUVycm9yX21zZz1GaWNoaWVyIGRlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgbm9uIHZhbGlkZSA6DQotZmlsZU5vdEZvdW5kRXJyb3JfbXNnPUltcG9zc2libGUgZGUgbG9jYWxpc2VyIHVuIGZpY2hpZXIgZGUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBkYW5zIGwnJ2VzcGFjZSBkZSB0cmF2YWlsICcnezB9JycNCi1ub3JtYWxpemVVUklFcnJvcl9tc2c9SW1wb3NzaWJsZSBkZSBsb2NhbGlzZXIgbCcnaWRlbnRpZmljYXRldXIgVVJJIG5vcm1hbGlzXHUwMGU5IHBvdXIgJyd7MH0nJw0KLW1vdmVFcnJvcl9tc2c9SW1wb3NzaWJsZSBkZSBkXHUwMGU5cGxhY2VyICcnezB9JycgdmVycyAnJ3sxfScnLiBDZXR0ZSBkZXN0aW5hdGlvbiBleGlzdGUgZFx1MDBlOWpcdTAwZTAuDQotbW9kaWZ5UmVhZE9ubHlGaWxlRXJyb3JfbXNnPUltcG9zc2libGUgZGUgbW9kaWZpZXIgbGUocykgZmljaGllcihzKSBlbiBsZWN0dXJlIHNldWxlbWVudCA6IHswfQ0KLW1vdmVSZXNvdXJjZUVycm9yX21zZz1MYSByZXNzb3VyY2UgJyd7MH0nJyBlc3QgdXRpbGlzXHUwMGU5ZSBkYW5zIHVuZSBvcFx1MDBlOXJhdGlvbiBkZSBwZXJzaXN0YW5jZSBub24gdmFsaWRcdTAwZTllLg0KLW1vZGlmeUZpbGVzRXJyb3JfbXNnPUltcG9zc2libGUgZGUgbW9kaWZpZXIgdW4gb3UgcGx1c2lldXJzIGZpY2hpZXJzDQotcmVzb3VyY2VPdXRPZlN5bmNoX21zZz1MYSByZXNzb3VyY2UgZXN0IGluY29oXHUwMGU5cmVudGUgZXQgZG9pdCBcdTAwZWF0cmUgcmVjaGFyZ1x1MDBlOWUgOiB7MH0NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotbG9hZExpYnJhcnlUYXNrX25hbWU9Q2hhcmdlbWVudCBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzLi4uDQotbW92ZURhdGFUYXNrX25hbWU9RFx1MDBlOXBsYWNlbWVudCBkZXMgZG9ublx1MDBlOWVzLi4uDQotc2F2ZUxpYnJhcnlUYXNrX25hbWU9U2F1dmVnYXJkZSBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzLi4uDQotbG9hZFJlc291cmNlc1Rhc2tfbmFtZT1DaGFyZ2VtZW50IGRlIHRvdXRlcyBsZXMgcmVzc291cmNlcyBkYW5zIGxhIG1cdTAwZTltb2lyZS4uLg0KLW1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb25zVGFza19uYW1lPU1pZ3JhdGlvbiBkZXMgZGVzY3JpcHRpb25zIGR1IGNvbnRlbnUgZGUgcHJvY2Vzc3VzLi4uDQotZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZT1DaGFuZ2VtZW50IGR1IG5vbSBkZSBwclx1MDBlOXNlbnRhdGlvbiBudWxsL3ZpZGUgZGUgY2hhcXVlIFx1MDBlOWxcdTAwZTltZW50IGRlIHJcdTAwZTlwYXJ0aXRpb24gYXUgcHJvZml0IGRlIHNvbiBub20uLi4NCi1VbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyX2NvdWxkTm90UmVzb2x2ZVByb3h5PUltcG9zc2libGUgZGUgclx1MDBlOXNvdWRyZSBsZSBwcm94eSAnJ3swfScnDQotcmVmcmVzaExpYnJhcnlGaWxlc1Rhc2tfbmFtZT1BY3R1YWxpc2F0aW9uIGRlcyBmaWNoaWVycyBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkYW5zIGwnZXNwYWNlIGRlIHRyYXZhaWwNCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1MZXMgZmljaGllcnMgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cyBuZSBzb250IHBhcyBwcmlzIGVuIGNoYXJnZSAtIGVmZmVjdHVleiB1bmUgbWlzZSBcdTAwZTAgbml2ZWF1IHZlcnMgdW5lIHZlcnNpb24gcGx1cyByXHUwMGU5Y2VudGUgZGUgezB9LiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5OTAxNGEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWROYW1lRXJyb3JfbXNnPUlsIG5vbWUgJyd7MH0nJyBub24gXHUwMGU4IHZhbGlkby4gSWwgbm9tZSBkZWxsJydlbGVtZW50byBkZWwgbWV0b2RvIG5vbiBwdVx1MDBmMiBjb250ZW5lcmUgaSBzZWd1ZW50aSBjYXJhdHRlcmk6IFxcIC8gOiAqID8gIiA8ID4gfA0KLW9iak5vdEZvdW5kRXJyb3JfbXNnPUltcG9zc2liaWxlIHRyb3ZhcmUgbCcnb2dnZXR0byBjb24gbCcnaWQgJyd7MH0nJw0KLWxvYWRMaWJyYXJ5RXJyb3JfbXNnPVJpbGV2YXRpIGVycm9yaSBkdXJhbnRlIGlsIGNhcmljYW1lbnRvIGRlbGxhIGxpYnJlcmlhIGRlaSBtZXRvZGk6DQotbG9hZExpYnJhcnlFcnJvcl9kZXRhaWxzPVwgXCByaWdhOiB7MH0sIGNvbG9ubmE6IHsxfSwgbXNnOiB7Mn0NCi1yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2c9SW1wb3NzaWJpbGUgcmlwcmlzdGluYXJlIGxhIHJpc29yc2EgJyd7MH0nJw0KLUZpbGVNYW5hZ2VyX2ZpbGVSZWFkT25seT1JbCBmaWxlICcnezB9JycgXHUwMGU4IGRpIHNvbGEgbGV0dHVyYQ0KLUVyck1zZ19Db3VsZE5vdERlbGV0ZT1JbXBvc3NpYmlsZSBlbGltaW5hcmUgezB9LiB7MX0NCi1yZW5hbWVFcnJvcl9tc2c9SW1wb3NzaWJpbGUgcmlub21pbmFyZSAnJ3swfScnIGluICcnezF9JycNCi1iYWNrdXBFcnJvcl9tc2c9SW1wb3NzaWJpbGUgZXNlZ3VpcmUgaWwgYmFja3VwIGRlbGxhIHJpc29yc2EgJyd7MH0nJw0KLW1hcmtlcl9lcnJfY2Fubm90UmVzb2x2ZVByb3h5PUltcG9zc2liaWxlIHJpc29sdmVyZSBpbCBwcm94eSB7MH0NCi1tb2RpZnlGaWxlRXJyb3JfbXNnPUltcG9zc2liaWxlIG1vZGlmaWNhcmUgaWwgZmlsZSAnJ3swfScnDQotbG9hZFJlc291cmNlRXJyb3JfbXNnPUltcG9zc2liaWxlIGNhcmljYXJlIGxhIHJpc29yc2EgJyd7MH0nJw0KLWxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c9SW1wb3NzaWJpbGUgY2FyaWNhcmUgbGEgcmlzb3JzYSAnJ3swfScnLiBNb3Rpdm86IHsxfQ0KLWludmFsaWRMaWJyYXJ5RmlsZUVycm9yX21zZz1GaWxlIGRlbGxhIGxpYnJlcmlhIGRlaSBtZXRvZGkgbm9uIHZhbGlkbzoNCi1maWxlTm90Rm91bmRFcnJvcl9tc2c9SW1wb3NzaWJpbGUgaW5kaXZpZHVhcmUgZmlsZSBsaWJyZXJpYSBkZWkgbWV0b2RpIG5lbGxvIHNwYXppbyBkaSBsYXZvcm8gJyd7MH0nJw0KLW5vcm1hbGl6ZVVSSUVycm9yX21zZz1JbXBvc3NpYmlsZSB0cm92YXJlIGwnJ1VSSSBub3JtYWxpenphdG8gcGVyICcnezB9JycNCi1tb3ZlRXJyb3JfbXNnPUltcG9zc2liaWxlIHNwb3N0YXJlICcnezB9JycgaW4gJyd7MX0nJy4gTGEgZGVzdGluYXppb25lIGVzaXN0ZSBnaVx1MDBlMC4NCi1tb2RpZnlSZWFkT25seUZpbGVFcnJvcl9tc2c9SW1wb3NzaWJpbGUgbW9kaWZpY2FyZSBmaWxlIGRpIHNvbGEgbGV0dHVyYTogezB9DQotbW92ZVJlc291cmNlRXJyb3JfbXNnPUxhIHJpc29yc2EgJyd7MH0nJyBcdTAwZTggY29pbnZvbHRhIGluIHVuJydvcGVyYXppb25lIGRpIHBlcnNpc3RlbnphIGNoZSBub24gXHUwMGU4IHN0YXRhIGVzZWd1aXRhLg0KLW1vZGlmeUZpbGVzRXJyb3JfbXNnPUltcG9zc2liaWxlIG1vZGlmaWNhcmUgdW5vIG8gcGlcdTAwZjkgZmlsZQ0KLXJlc291cmNlT3V0T2ZTeW5jaF9tc2c9TGEgcmlzb3JzYSBub24gXHUwMGU4IHNpbmNyb25penphdGEgZSBkZXZlIGVzc2VyZSByaWNhcmljYXRhOiB7MH0NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotbG9hZExpYnJhcnlUYXNrX25hbWU9Q2FyaWNhbWVudG8gZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBpbiBjb3Jzby4uLg0KLW1vdmVEYXRhVGFza19uYW1lPVRyYXNmZXJpbWVudG8gZGVpIGRhdGkgaW4gY29yc28uLi4NCi1zYXZlTGlicmFyeVRhc2tfbmFtZT1TYWx2YXRhZ2dpbyBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGluIGNvcnNvLi4uDQotbG9hZFJlc291cmNlc1Rhc2tfbmFtZT1DYXJpY2FtZW50byBkaSB0dXR0ZSBsZSByaXNvcnNlIG5lbGxhIG1lbW9yaWEgaW4gY29yc28uLi4NCi1taWdyYXRlQ29udGVudERlc2NyaXB0aW9uc1Rhc2tfbmFtZT1NaWdyYXppb25lIGRlbGxlIGRlc2NyaXppb25pIGRlaSBjb250ZW51dGkgZGVpIHByb2Nlc3NpIGluIGNvcnNvLi4uDQotZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZT1JbXBvc3RhemlvbmUgaW4gY29yc28gZGVsIG5vbWUgZGkgcHJlc2VudGF6aW9uZSB2dW90by9udWxsbyBkaSBvZ25pIGVsZW1lbnRvIGRlbGxhIHN1ZGRpdmlzaW9uZSBzdWwgcmVsYXRpdm8gbm9tZS4uLg0KLVVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXJfY291bGROb3RSZXNvbHZlUHJveHk9SW1wb3NzaWJpbGUgcmlzb2x2ZXJlIGlsIHByb3h5ICcnezB9JycNCi1yZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lPUFnZ2lvcm5hbWVudG8gZGVpIGZpbGUgZGVsbGEgbGlicmVyaWEgbmVsbCdhcmVhIGRpIGxhdm9ybw0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUkgZmlsZSBzZWxlemlvbmF0aSBub24gc29ubyBzdXBwb3J0YXRpIC0gcGFzc2FyZSBhZCB1bmEgdmVyc2lvbmUgcGlcdTAwZjkgYWdnaW9ybmF0YSBkaSB7MH0uIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfamEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjEwOTdiMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZE5hbWVFcnJvcl9tc2c9XHU1NDBkXHU1MjRkICcnezB9JycgXHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyIFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1NTQwZFx1MzA2N1x1MzA2Zlx1MzAwMVx1NmIyMVx1MzA2ZVx1NjU4N1x1NWI1N1x1MzA2Zlx1NGY3Zlx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzogXFwgLyA6ICogPyAiIDwgPiB8DQotb2JqTm90Rm91bmRFcnJvcl9tc2c9SUQgXHUzMDRjICcnezB9JycgXHUzMDZlXHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDZmXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyDQotbG9hZExpYnJhcnlFcnJvcl9tc2c9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGM5XHU0ZTJkXHUzMDZiXHUzMDAxXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOg0KLWxvYWRMaWJyYXJ5RXJyb3JfZGV0YWlscz1cIFwgXHU4ODRjOiB7MH1cdTMwMDFcdTUyMTc6IHsxfVx1MzAwMVx1MzBlMVx1MzBjM1x1MzBiYlx1MzBmY1x1MzBiODogezJ9DQotcmVzdG9yZVJlc291cmNlRXJyb3JfbXNnPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOSAnJ3swfScnIFx1MzA5Mlx1NWZhOVx1NTE0M1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLUZpbGVNYW5hZ2VyX2ZpbGVSZWFkT25seT1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgJyd7MH0nJyBcdTMwNmZcdThhYWRcdTMwN2ZcdTUzZDZcdTMwOGFcdTVjMDJcdTc1MjhcdTMwNjdcdTMwNTlcdTMwMDINCi1FcnJNc2dfQ291bGROb3REZWxldGU9ezB9IFx1MzA5Mlx1NTI0YVx1OTY2NFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMiB7MX0NCi1yZW5hbWVFcnJvcl9tc2c9XHU1NDBkXHU1MjRkICcnezB9JycgXHUzMDkyICcnezF9JycgXHUzMDZiXHU1OTA5XHU2NmY0XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyDQotYmFja3VwRXJyb3JfbXNnPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOSAnJ3swfScnIFx1MzA5Mlx1MzBkMFx1MzBjM1x1MzBhZlx1MzBhMlx1MzBjM1x1MzBkN1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLW1hcmtlcl9lcnJfY2Fubm90UmVzb2x2ZVByb3h5PVx1MzBkN1x1MzBlZFx1MzBhZFx1MzBiN1x1MzBmYyB7MH0gXHUzMDkyXHU4OWUzXHU2YzdhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyDQotbW9kaWZ5RmlsZUVycm9yX21zZz1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgJyd7MH0nJyBcdTMwNmZcdTU5MDlcdTY2ZjRcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1sb2FkUmVzb3VyY2VFcnJvcl9tc2c9XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5ICcnezB9JycgXHUzMDkyXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyDQotbG9hZFJlc291cmNlRXJyb3JXaXRoUmVhc29uX21zZz1cdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjkgJyd7MH0nJyBcdTMwOTJcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDIgXHU3NDA2XHU3NTMxOiB7MX0NCi1pbnZhbGlkTGlicmFyeUZpbGVFcnJvcl9tc2c9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyDQotZmlsZU5vdEZvdW5kRXJyb3JfbXNnPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBiOVx1MzBkYVx1MzBmY1x1MzBiOSAnJ3swfScnIFx1MzA2N1x1MzA2Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLW5vcm1hbGl6ZVVSSUVycm9yX21zZz0nJ3swfScnIFx1MzA2Ylx1NWJmZVx1MzA1OVx1MzA4Ylx1NmI2M1x1ODk4Zlx1NTMxNlx1MzA1NVx1MzA4Y1x1MzA1ZiBVUkkgXHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyDQotbW92ZUVycm9yX21zZz0nJ3swfScnIFx1MzA5MiAnJ3sxfScnIFx1MzA2Ylx1NzlmYlx1NTJkNVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMiBcdTMwNTNcdTMwNmVcdTViOWJcdTUxNDhcdTMwNmZcdTY1ZTJcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi1tb2RpZnlSZWFkT25seUZpbGVFcnJvcl9tc2c9XHU4YWFkXHUzMDdmXHU1M2Q2XHUzMDhhXHU1YzAyXHU3NTI4XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZmXHU1OTA5XHU2NmY0XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzOiB7MH0NCi1tb3ZlUmVzb3VyY2VFcnJvcl9tc2c9XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5ICcnezB9JycgXHUzMDRjXHUzMDAxXHUzMGIzXHUzMGRmXHUzMGMzXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDZhXHUzMDQ0XHUzMGQxXHUzMGZjXHUzMGI3XHUzMGI5XHUzMGJmXHUzMGYzXHUzMGI5XHU2NGNkXHU0ZjVjXHUzMDZiXHU1NDJiXHUzMDdlXHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotbW9kaWZ5RmlsZXNFcnJvcl9tc2c9MSBcdTMwNjRcdTRlZTVcdTRlMGFcdTMwNmVcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTU5MDlcdTY2ZjRcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDINCi1yZXNvdXJjZU91dE9mU3luY2hfbXNnPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOSB7MH0gXHUzMDZmXHU1NDBjXHU2NzFmXHUzMDRjXHU1M2Q2XHUzMDhjXHUzMDY2XHUzMDRhXHUzMDg5XHUzMDVhXHUzMDAxXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU5XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLW1vdmVEYXRhVGFza19uYW1lPVx1MzBjN1x1MzBmY1x1MzBiZlx1MzA5Mlx1NzlmYlx1NTJkNVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLXNhdmVMaWJyYXJ5VGFza19uYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1NGZkZFx1N2JhMVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWxvYWRSZXNvdXJjZXNUYXNrX25hbWU9XHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDkyXHUzMGUxXHUzMGUyXHUzMGVhXHUzMGZjXHUzMDZiXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotbWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbnNUYXNrX25hbWU9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXHU4YWFjXHU2NjBlXHUzMDkyXHUzMGRlXHUzMGE0XHUzMGIwXHUzMGVjXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZT1cdTMwNTlcdTMwNzlcdTMwNjZcdTMwNmVcdTMwZDZcdTMwZWNcdTMwZmNcdTMwYWZcdTMwYzBcdTMwYTZcdTMwZjNcdTMwZmJcdTMwYThcdTMwZWNcdTMwZTFcdTMwZjNcdTMwYzhcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNmJcdTMwY2NcdTMwZWIvXHU3YTdhXHUzMDZlXHU4ODY4XHU3OTNhXHU1NDBkXHUzMDkyXHU4YTJkXHU1YjlhXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eT1cdTMwZDdcdTMwZWRcdTMwYWRcdTMwYjdcdTMwZmMgJyd7MH0nJyBcdTMwOTJcdTg5ZTNcdTZjN2FcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDINCi1yZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBiOVx1MzBkYVx1MzBmY1x1MzBiOVx1MzA2N1x1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NjZmNFx1NjViMFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPVx1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2Zlx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlx1NjViMFx1MzA1N1x1MzA0NFx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1MzA2ZSB7MH0gXHUzMDZiXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGIwXHUzMGVjXHUzMGZjXHUzMGM5XHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTNiMGU2NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZE5hbWVFcnJvcl9tc2c9Jyd7MH0nJyBcdWM3NzRcdWI5ODRcdWM3NzQgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4gXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4YyBcdWM3NzRcdWI5ODRcdWM1ZDBcdWIyOTQgXHViMmU0XHVjNzRjIFx1YmIzOFx1Yzc5MFx1Yjk3YyBcdWQzZWNcdWQ1NjhcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNDogXFwgLyA6ICogPyAiIDwgPiB8DQotb2JqTm90Rm91bmRFcnJvcl9tc2c9SURcdWFjMDAgJyd7MH0nJ1x1Yzc3OCBcdWM2MjRcdWJlMGNcdWM4MWRcdWQyYjhcdWI5N2MgXHVjYzNlXHVjNzQ0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotbG9hZExpYnJhcnlFcnJvcl9tc2c9XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWI4NWNcdWI0ZGNcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotbG9hZExpYnJhcnlFcnJvcl9kZXRhaWxzPVwgXCBcdWQ1ODk6IHswfSwgXHVjNWY0OiB7MX0sIFx1YmE1NFx1YzJkY1x1YzljMDogezJ9DQotcmVzdG9yZVJlc291cmNlRXJyb3JfbXNnPScnezB9JycgXHVjNzkwXHVjNmQwXHVjNzQ0IFx1YmNmNVx1YzZkMFx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLUZpbGVNYW5hZ2VyX2ZpbGVSZWFkT25seT0nJ3swfScnIFx1ZDMwY1x1Yzc3Y1x1Yzc0MCBcdWM3N2RcdWFlMzAgXHVjODA0XHVjNmE5XHVjNzg1XHViMmM4XHViMmU0Lg0KLUVyck1zZ19Db3VsZE5vdERlbGV0ZT17MH0gXHVkNTZkXHViYWE5XHVjNzQ0IFx1YzBhZFx1YzgxY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiB7MX0NCi1yZW5hbWVFcnJvcl9tc2c9XHVjNzc0XHViOTg0XHVjNzQ0ICcnezB9JydcdWM1ZDBcdWMxMWMgJyd7MX0nJyhcdWM3M2MpXHViODVjIFx1YmMxNFx1YWZjMCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWJhY2t1cEVycm9yX21zZz0nJ3swfScnIFx1Yzc5MFx1YzZkMFx1Yzc0NCBcdWJjMzFcdWM1YzVcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1tYXJrZXJfZXJyX2Nhbm5vdFJlc29sdmVQcm94eT17MH0gXHVkNTA0XHViODVkXHVjMmRjXHViOTdjIFx1ZDU3NFx1YzExZFx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLW1vZGlmeUZpbGVFcnJvcl9tc2c9Jyd7MH0nJyBcdWQzMGNcdWM3N2NcdWM3NDQgXHVjMjE4XHVjODE1XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotbG9hZFJlc291cmNlRXJyb3JfbXNnPScnezB9JycgXHVjNzkwXHVjNmQwXHVjNzQ0IFx1Yjg1Y1x1YjRkY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c9Jyd7MH0nJyBcdWM3OTBcdWM2ZDBcdWM3NDQgXHViODVjXHViNGRjXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yzc3NFx1YzcyMDogezF9DQotaW52YWxpZExpYnJhcnlGaWxlRXJyb3JfbXNnPVx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWM3NDAgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWQzMGNcdWM3N2M6DQotZmlsZU5vdEZvdW5kRXJyb3JfbXNnPVx1Yzc5MVx1YzVjNVx1YWNmNVx1YWMwNCAnJ3swfScnXHVjNWQwXHVjMTFjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1Y2MzZVx1Yzc0NCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLW5vcm1hbGl6ZVVSSUVycm9yX21zZz0nJ3swfScnXHVjNzU4IFx1Yzc3Y1x1YmMxOFx1ZDY1NFx1YjQxYyBVUklcdWI5N2MgXHVjYzNlXHVjNzQ0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotbW92ZUVycm9yX21zZz0nJ3swfScnXHVjNzQ0KFx1Yjk3YykgJyd7MX0nJyhcdWM3M2MpXHViODVjIFx1Yzc3NFx1YjNkOVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWIzMDBcdWMwYzFcdWM3NzQgXHVjNzc0XHViYmY4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1tb2RpZnlSZWFkT25seUZpbGVFcnJvcl9tc2c9XHVjNzdkXHVhZTMwIFx1YzgwNFx1YzZhOSBcdWQzMGNcdWM3N2NcdWM3NDQgXHVjMjE4XHVjODE1XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWM3NGM6IHswfQ0KLW1vdmVSZXNvdXJjZUVycm9yX21zZz0nJ3swfScnIFx1Yzc5MFx1YzZkMFx1Yzc3NCBcdWQ2NTVcdWM1N2RcdWI0MThcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YzljMFx1YzE4ZFx1YzEzMSBcdWM4NzBcdWM3OTFcdWM1ZDAgXHVhZDAwXHViODI4XHViNDI5XHViMmM4XHViMmU0Lg0KLW1vZGlmeUZpbGVzRXJyb3JfbXNnPVx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzIxOFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXJlc291cmNlT3V0T2ZTeW5jaF9tc2c9XHVjNzkwXHVjNmQwXHVjNzc0IFx1YjNkOVx1YWUzMFx1ZDY1NFx1YjQxOFx1YzljMCBcdWM1NGFcdWM3M2NcdWJhNzAgXHViMmU0XHVjMmRjIFx1Yjg1Y1x1YjRkY1x1YjQxOFx1YzViNFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuIHswfQ0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1sb2FkTGlicmFyeVRhc2tfbmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1Yjg1Y1x1YjRkYyBcdWM5MTEuLi4NCi1tb3ZlRGF0YVRhc2tfbmFtZT1cdWIzNzBcdWM3NzRcdWQxMzAgXHVjNzc0XHViM2Q5IFx1YzkxMS4uLg0KLXNhdmVMaWJyYXJ5VGFza19uYW1lPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjODAwXHVjN2E1IFx1YzkxMS4uLg0KLWxvYWRSZXNvdXJjZXNUYXNrX25hbWU9XHViYWE4XHViNGUwIFx1Yzc5MFx1YzZkMFx1Yzc0NCBcdWJhNTRcdWJhYThcdWI5YWNcdWM1ZDAgXHViODVjXHViNGRjXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLW1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb25zVGFza19uYW1lPVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWNlZThcdWQxNTBcdWNlMjAgXHVjMTI0XHViYTg1IFx1Yzc3NFx1YzhmYyBcdWM5MTEuLi4NCi1maXhQcmVzZW50YXRpb25OYW1lVGFza19uYW1lPVx1YmFhOFx1YjRlMCBcdWM3OTFcdWM1YzVcdWJkODRcdWI5NTggXHVjNjk0XHVjMThjXHVjNzU4IFx1YjExMChudWxsKSBcdWI2MTBcdWIyOTQgXHViZTQ4IFx1ZDQ1Y1x1YzJkYyBcdWM3NzRcdWI5ODRcdWM3NDQgXHVkNTc0XHViMmY5IFx1Yzc3NFx1Yjk4NFx1YzczY1x1Yjg1YyBcdWMxMjRcdWM4MTVcdWQ1NThcdWIyOTQgXHVjOTExLi4uDQotVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eT0nJ3swfScnIFx1ZDUwNFx1Yjg1ZFx1YzJkY1x1Yjk3YyBcdWQ1NzRcdWMxMWRcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1yZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lPVx1Yzc5MVx1YzVjNVx1YWNmNVx1YWMwNFx1Yzc1OCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVkMzBjXHVjNzdjIFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWFlMzANCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVkMzBjXHVjNzdjXHVjNzQwIFx1YzljMFx1YzZkMFx1YjQxOFx1YzljMCBcdWM1NGFcdWMyYjVcdWIyYzhcdWIyZTQuIHswfSBcdWMwYzggXHViYzg0XHVjODA0XHVjNzNjXHViODVjIFx1YzVjNVx1YWRmOFx1YjgwOFx1Yzc3NFx1YjRkY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhM2I0Y2U0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkTmFtZUVycm9yX21zZz1PIG5vbWUgJyd7MH0nJyBcdTAwZTkgaW52XHUwMGUxbGlkby4gTyBub21lIGRvIGVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvIG5cdTAwZTNvIHBvZGUgY29udGVyIG9zIHNlZ3VpbnRlcyBjYXJhY3RlcmVzOiBcXCAvIDogKiA/ICIgPCA+IHwNCi1vYmpOb3RGb3VuZEVycm9yX21zZz1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBsb2NhbGl6YXIgbyBvYmpldG8gY29tIG8gaWQgJyd7MH0nJw0KLWxvYWRMaWJyYXJ5RXJyb3JfbXNnPUVycm9zIGVuY29udHJhZG9zIGR1cmFudGUgbyBjYXJyZWdhbWVudG8gZGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3M6DQotbG9hZExpYnJhcnlFcnJvcl9kZXRhaWxzPVwgXCBsaW5oYTogezB9LCBjb2x1bmE6IHsxfSwgbWVuc2FnZW06IHsyfQ0KLXJlc3RvcmVSZXNvdXJjZUVycm9yX21zZz1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCByZXN0YXVyYXIgbyByZWN1cnNvICcnezB9JycNCi1GaWxlTWFuYWdlcl9maWxlUmVhZE9ubHk9TyBhcnF1aXZvICcnezB9JycgXHUwMGU5IGRlIGxlaXR1cmENCi1FcnJNc2dfQ291bGROb3REZWxldGU9Tlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgZXhjbHVpciB7MH0uIHsxfQ0KLXJlbmFtZUVycm9yX21zZz1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCByZW5vbWVhciAnJ3swfScnIHBhcmEgJyd7MX0nJw0KLWJhY2t1cEVycm9yX21zZz1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBmYXplciBvIGJhY2t1cCBkbyByZWN1cnNvICcnezB9JycNCi1tYXJrZXJfZXJyX2Nhbm5vdFJlc29sdmVQcm94eT1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCByZXNvbHZlciBvIHByb3h5IHswfQ0KLW1vZGlmeUZpbGVFcnJvcl9tc2c9Tlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgbW9kaWZpY2FyIG8gYXJxdWl2byAnJ3swfScnDQotbG9hZFJlc291cmNlRXJyb3JfbXNnPU5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIGNhcnJlZ2FyIG8gcmVjdXJzbyAnJ3swfScnDQotbG9hZFJlc291cmNlRXJyb3JXaXRoUmVhc29uX21zZz1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBjYXJyZWdhciBvIHJlY3Vyc28gJyd7MH0nJy4gTW90aXZvOiB7MX0NCi1pbnZhbGlkTGlicmFyeUZpbGVFcnJvcl9tc2c9QXJxdWl2byBkZSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBpbnZcdTAwZTFsaWRvOg0KLWZpbGVOb3RGb3VuZEVycm9yX21zZz1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBsb2NhbGl6YXIgcXVhbHF1ZXIgYXJxdWl2byBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBubyBlc3BhXHUwMGU3byBkZSB0cmFiYWxobyAnJ3swfScnDQotbm9ybWFsaXplVVJJRXJyb3JfbXNnPU5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIGxvY2FsaXphciBvIFVSSSBub3JtYWxpemFkbyBwYXJhICcnezB9JycNCi1tb3ZlRXJyb3JfbXNnPU5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIG1vdmVyICcnezB9JycgcGFyYSAnJ3sxfScnLiBPIGRlc3Rpbm8galx1MDBlMSBleGlzdGUuDQotbW9kaWZ5UmVhZE9ubHlGaWxlRXJyb3JfbXNnPU5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIG1vZGlmaWNhciBvKHMpIGFycXVpdm8ocykgZGUgbGVpdHVyYTogezB9DQotbW92ZVJlc291cmNlRXJyb3JfbXNnPU8gcmVjdXJzbyAnJ3swfScnIGVzdFx1MDBlMSBlbnZvbHZpZG8gZW0gdW1hIG9wZXJhXHUwMGU3XHUwMGUzbyBwZXJzaXN0ZW50ZSBxdWUgblx1MDBlM28gZm9pIGNvbmZpcm1hZGEuDQotbW9kaWZ5RmlsZXNFcnJvcl9tc2c9Tlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgbW9kaWZpY2FyIHVtIG91IG1haXMgYXJxdWl2b3MNCi1yZXNvdXJjZU91dE9mU3luY2hfbXNnPU8gcmVjdXJzbyBlc3RcdTAwZTEgZm9yYSBkZSBzaW5jcm9uaXphXHUwMGU3XHUwMGUzbyBlIHByZWNpc2Egc2VyIHJlY2FycmVnYWRvOiB7MH0NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotbG9hZExpYnJhcnlUYXNrX25hbWU9Q2FycmVnYW5kbyBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4uLg0KLW1vdmVEYXRhVGFza19uYW1lPU1vdmVuZG8gZGFkb3MuLi4NCi1zYXZlTGlicmFyeVRhc2tfbmFtZT1TYWx2YW5kbyBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4uLg0KLWxvYWRSZXNvdXJjZXNUYXNrX25hbWU9Q2FycmVnYW5kbyB0b2RvcyBvcyByZWN1cnNvcyBuYSBtZW1cdTAwZjNyaWEuLi4NCi1taWdyYXRlQ29udGVudERlc2NyaXB0aW9uc1Rhc2tfbmFtZT1NaWdyYW5kbyBkZXNjcmlcdTAwZTdcdTAwZjVlcyBkZSBjb250ZVx1MDBmYWRvIGRlIHByb2Nlc3Nvcy4uLg0KLWZpeFByZXNlbnRhdGlvbk5hbWVUYXNrX25hbWU9Q29uZmlndXJhbmRvIG8gbm9tZSBkYSBhcHJlc2VudGFcdTAwZTdcdTAwZTNvIG51bGEvdmF6aWEgZGUgdG9kb3Mgb3MgZWxlbWVudG9zIGRlIGRpdmlzXHUwMGUzbyBwYXJhIHNldXMgbm9tZXMuLi4NCi1VbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyX2NvdWxkTm90UmVzb2x2ZVByb3h5PU5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIHJlc29sdmVyIG8gcHJveHkgJyd7MH0nJw0KLXJlZnJlc2hMaWJyYXJ5RmlsZXNUYXNrX25hbWU9QXR1YWxpemFuZG8gYXJxdWl2b3MgZGUgYmlibGlvdGVjYSBubyBlc3BhXHUwMGU3byBkZSB0cmFiYWxobw0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPU9zIGFycXVpdm9zIHNlbGVjaW9uYWRvcyBuXHUwMGUzbyBzXHUwMGUzbyBzdXBvcnRhZG9zIC0gZmFcdTAwZTdhIHVwZ3JhZGUgcGFyYSB1bWEgdmVyc1x1MDBlM28gbWFpcyByZWNlbnRlIGRvIHswfS4gDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTk3OGFjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkTmFtZUVycm9yX21zZz1cdTU0MGRcdTc5ZjBcdTIwMWN7MH1cdTIwMWRcdTY1ZTBcdTY1NDhcdTMwMDJcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTU0MGRcdTc5ZjBcdTRlMGRcdTgwZmRcdTUzMDVcdTU0MmJcdThmZDlcdTRlOWJcdTViNTdcdTdiMjZcdWZmMWFcXCAvIDogKiA/ICIgPCA+IHwNCi1vYmpOb3RGb3VuZEVycm9yX21zZz1cdTYyN2VcdTRlMGRcdTUyMzBcdTY4MDdcdThiYzZcdTRlM2FcdTIwMWN7MH1cdTIwMWRcdTc2ODRcdTViZjlcdThjNjENCi1sb2FkTGlicmFyeUVycm9yX21zZz1cdTg4YzVcdTUxNjVcdTY1YjlcdTZjZDVcdTVlOTNcdTY1ZjZcdTkwNDdcdTUyMzBcdTk1MTlcdThiZWZcdWZmMWENCi1sb2FkTGlicmFyeUVycm9yX2RldGFpbHM9XCBcIFx1ODg0Y1x1ZmYxYXswfVx1ZmYwY1x1NTIxN1x1ZmYxYXsxfVx1ZmYwY1x1NmQ4OFx1NjA2Zlx1ZmYxYXsyfQ0KLXJlc3RvcmVSZXNvdXJjZUVycm9yX21zZz1cdTY1ZTBcdTZjZDVcdTYwNjJcdTU5MGRcdThkNDRcdTZlOTBcdTIwMWN7MH1cdTIwMWQNCi1GaWxlTWFuYWdlcl9maWxlUmVhZE9ubHk9XHU2NTg3XHU0ZWY2XHUyMDFjezB9XHUyMDFkXHU0ZTNhXHU1M2VhXHU4YmZiDQotRXJyTXNnX0NvdWxkTm90RGVsZXRlPVx1NjcyYVx1ODBmZFx1NTIyMFx1OTY2NCB7MH1cdTMwMDJ7MX0NCi1yZW5hbWVFcnJvcl9tc2c9XHU2NWUwXHU2Y2Q1XHU1YzA2XHUyMDFjezB9XHUyMDFkXHU5MWNkXHU1NDdkXHU1NDBkXHU0ZTNhXHUyMDFjezF9XHUyMDFkDQotYmFja3VwRXJyb3JfbXNnPVx1NjVlMFx1NmNkNVx1NTkwN1x1NGVmZFx1OGQ0NFx1NmU5MFx1MjAxY3swfVx1MjAxZA0KLW1hcmtlcl9lcnJfY2Fubm90UmVzb2x2ZVByb3h5PVx1NjVlMFx1NmNkNVx1ODllM1x1Njc5MFx1NGVlM1x1NzQwNlx1NjcwZFx1NTJhMVx1NTY2OCB7MH0NCi1tb2RpZnlGaWxlRXJyb3JfbXNnPVx1NjVlMFx1NmNkNVx1NGZlZVx1NjUzOVx1NjU4N1x1NGVmNlx1MjAxY3swfVx1MjAxZA0KLWxvYWRSZXNvdXJjZUVycm9yX21zZz1cdTY1ZTBcdTZjZDVcdTg4YzVcdTUxNjVcdThkNDRcdTZlOTBcdTIwMWN7MH1cdTIwMWQNCi1sb2FkUmVzb3VyY2VFcnJvcldpdGhSZWFzb25fbXNnPVx1NjVlMFx1NmNkNVx1ODhjNVx1NTE2NVx1OGQ0NFx1NmU5MFx1MjAxY3swfVx1MjAxZFx1MzAwMlx1NTM5Zlx1NTZlMFx1ZmYxYXsxfQ0KLWludmFsaWRMaWJyYXJ5RmlsZUVycm9yX21zZz1cdTY1YjlcdTZjZDVcdTVlOTNcdTY1ODdcdTRlZjZcdTY1ZTBcdTY1NDhcdWZmMWENCi1maWxlTm90Rm91bmRFcnJvcl9tc2c9XHU1NzI4XHU1ZGU1XHU0ZjVjXHU3YTdhXHU5NWY0XHUyMDFjezB9XHUyMDFkXHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwXHU0ZWZiXHU0ZjU1XHU2NWI5XHU2Y2Q1XHU1ZTkzXHU2NTg3XHU0ZWY2DQotbm9ybWFsaXplVVJJRXJyb3JfbXNnPVx1NjI3ZVx1NGUwZFx1NTIzMFx1MjAxY3swfVx1MjAxZFx1NzY4NFx1ODljNFx1ODMwM1x1NTMxNiBVUkkNCi1tb3ZlRXJyb3JfbXNnPVx1NjVlMFx1NmNkNVx1NWMwNlx1MjAxY3swfVx1MjAxZFx1NzlmYlx1NTJhOFx1NTIzMFx1MjAxY3sxfVx1MjAxZFx1MzAwMlx1NzZlZVx1NjgwN1x1NGY0ZFx1N2Y2ZVx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMg0KLW1vZGlmeVJlYWRPbmx5RmlsZUVycm9yX21zZz1cdTY1ZTBcdTZjZDVcdTRmZWVcdTY1MzlcdTUzZWFcdThiZmJcdTY1ODdcdTRlZjZcdWZmMWF7MH0NCi1tb3ZlUmVzb3VyY2VFcnJvcl9tc2c9XHU4ZDQ0XHU2ZTkwXHUyMDFjezB9XHUyMDFkXHU2ZDg5XHU1M2NhXHU1MjMwXHU4ZmQ4XHU2NzJhXHU2M2QwXHU0ZWE0XHU3Njg0XHU2MzAxXHU0ZTQ1XHU2MDI3XHU2NGNkXHU0ZjVjXHUzMDAyDQotbW9kaWZ5RmlsZXNFcnJvcl9tc2c9XHU2NWUwXHU2Y2Q1XHU0ZmVlXHU2NTM5XHU0ZTAwXHU0ZTJhXHU2MjE2XHU1OTFhXHU0ZTJhXHU2NTg3XHU0ZWY2DQotcmVzb3VyY2VPdXRPZlN5bmNoX21zZz1cdThkNDRcdTZlOTBcdTRlMGRcdTU0MGNcdTZiNjVcdWZmMGNcdTk3MDBcdTg5ODFcdTkxY2RcdTY1YjBcdTg4YzVcdTUxNjVcdWZmMWF7MH0NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotbG9hZExpYnJhcnlUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU4OGM1XHU1MTY1XHU2NWI5XHU2Y2Q1XHU1ZTkzLi4uDQotbW92ZURhdGFUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU3OWZiXHU1MmE4XHU2NTcwXHU2MzZlLi4uDQotc2F2ZUxpYnJhcnlUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU0ZmRkXHU1YjU4XHU2NWI5XHU2Y2Q1XHU1ZTkzLi4uDQotbG9hZFJlc291cmNlc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTVjMDZcdTYyNDBcdTY3MDlcdThkNDRcdTZlOTBcdTg4YzVcdTUxNjVcdTUxODVcdTViNTguLi4NCi1taWdyYXRlQ29udGVudERlc2NyaXB0aW9uc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdThmYzFcdTc5ZmJcdTZkNDFcdTdhMGJcdTUxODVcdTViYjlcdTYzY2ZcdThmZjAuLi4NCi1maXhQcmVzZW50YXRpb25OYW1lVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NWMwNlx1NmJjZlx1NGUyYVx1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1NzY4NFx1N2E3YVx1NjYzZVx1NzkzYVx1NTQwZFx1NzlmMFx1OGJiZVx1N2Y2ZVx1NGUzYVx1NTE0M1x1N2QyMFx1NTQwNFx1ODFlYVx1NzY4NFx1NTQwZFx1NzlmMC4uLg0KLVVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXJfY291bGROb3RSZXNvbHZlUHJveHk9XHU2NWUwXHU2Y2Q1XHU4OWUzXHU2NzkwXHU0ZWUzXHU3NDA2XHU2NzBkXHU1MmExXHU1NjY4XHUyMDFjezB9XHUyMDFkDQotcmVmcmVzaExpYnJhcnlGaWxlc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTUyMzdcdTY1YjBcdTVkZTVcdTRmNWNcdTdhN2FcdTk1ZjRcdTRlMmRcdTc2ODRcdTVlOTNcdTY1ODdcdTRlZjYNCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1cdTkwMDlcdTViOWFcdTc2ODRcdTY1ODdcdTRlZjZcdTRlMGRcdTUzZDdcdTY1MmZcdTYzMDFcdWZmMGNcdThiZjdcdTUzNDdcdTdlYTdcdTUyMzAgezB9IFx1NzY4NFx1NjZmNFx1NjViMFx1NzI0OFx1NjcyY1x1MzAwMg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU2ZjMwMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZE5hbWVFcnJvcl9tc2c9XHU1NDBkXHU3YTMxICcnezB9JycgXHU3MTIxXHU2NTQ4XHUzMDAyXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3YTMxXHU0ZTBkXHU4MGZkXHU1MzA1XHU1NDJiXHU0ZTBiXHU1MjE3XHU1YjU3XHU1MTQzXHVmZjFhXFwgLyA6ICogPyAiIDwgPiB8DQotb2JqTm90Rm91bmRFcnJvcl9tc2c9XHU2MjdlXHU0ZTBkXHU1MjMwIElEIFx1NzBiYSAnJ3swfScnIFx1NzY4NFx1NzI2OVx1NGVmNg0KLWxvYWRMaWJyYXJ5RXJyb3JfbXNnPVx1NTcyOFx1OGYwOVx1NTE2NVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NjY0Mlx1NzY3Y1x1NzNmZVx1OTMyZlx1OGFhNFx1ZmYxYQ0KLWxvYWRMaWJyYXJ5RXJyb3JfZGV0YWlscz1cIFwgXHU4ODRjXHVmZjFhezB9XHVmZjBjXHU3NmY0XHU2YjA0XHVmZjFhezF9XHVmZjBjXHU4YTBhXHU2MDZmXHVmZjFhezJ9DQotcmVzdG9yZVJlc291cmNlRXJyb3JfbXNnPVx1NzEyMVx1NmNkNVx1OTA4NFx1NTM5Zlx1OGNjN1x1NmU5MCAnJ3swfScnDQotRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5PVx1NmE5NFx1Njg0OCAnJ3swfScnIFx1NjYyZlx1NTUyZlx1OGI4MFx1NzY4NA0KLUVyck1zZ19Db3VsZE5vdERlbGV0ZT1cdTcxMjFcdTZjZDVcdTUyMmFcdTk2NjQgezB9XHUzMDAyezF9DQotcmVuYW1lRXJyb3JfbXNnPVx1NzEyMVx1NmNkNVx1NWMwNyAnJ3swfScnIFx1OTFjZFx1NjViMFx1NTQ3ZFx1NTQwZFx1NzBiYSAnJ3sxfScnDQotYmFja3VwRXJyb3JfbXNnPVx1NzEyMVx1NmNkNVx1NTA5OVx1NGVmZFx1OGNjN1x1NmU5MCAnJ3swfScnDQotbWFya2VyX2Vycl9jYW5ub3RSZXNvbHZlUHJveHk9XHU3MTIxXHU2Y2Q1XHU4OWUzXHU2NzkwIFByb3h5IHswfQ0KLW1vZGlmeUZpbGVFcnJvcl9tc2c9XHU3MTIxXHU2Y2Q1XHU0ZmVlXHU2NTM5XHU2YTk0XHU2ODQ4ICcnezB9JycNCi1sb2FkUmVzb3VyY2VFcnJvcl9tc2c9XHU3MTIxXHU2Y2Q1XHU4ZjA5XHU1MTY1XHU4Y2M3XHU2ZTkwICcnezB9JycNCi1sb2FkUmVzb3VyY2VFcnJvcldpdGhSZWFzb25fbXNnPVx1NzEyMVx1NmNkNVx1OGYwOVx1NTE2NVx1OGNjN1x1NmU5MCAnJ3swfScnXHUzMDAyXHU1MzlmXHU1NmUwXHVmZjFhezF9DQotaW52YWxpZExpYnJhcnlGaWxlRXJyb3JfbXNnPVx1NzEyMVx1NjU0OFx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NmE5NFx1ZmYxYQ0KLWZpbGVOb3RGb3VuZEVycm9yX21zZz1cdTU3MjhcdTVkZTVcdTRmNWNcdTUzNDAgJyd7MH0nJyBcdTRlMmRcdTYyN2VcdTRlMGRcdTUyMzBcdTRlZmJcdTRmNTVcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTZhOTRcdTY4NDgNCi1ub3JtYWxpemVVUklFcnJvcl9tc2c9XHU2MjdlXHU0ZTBkXHU1MjMwICcnezB9JycgXHU3Njg0XHU2YTE5XHU2ZTk2XHU1MzE2IFVSSQ0KLW1vdmVFcnJvcl9tc2c9XHU3MTIxXHU2Y2Q1XHU1YzA3ICcnezB9JycgXHU3OWZiXHU4MWYzICcnezF9JydcdTMwMDJcdTc2ZWVcdTc2ODRcdTU3MzBcdTVkZjJcdTViNThcdTU3MjhcdTMwMDINCi1tb2RpZnlSZWFkT25seUZpbGVFcnJvcl9tc2c9XHU3MTIxXHU2Y2Q1XHU0ZmVlXHU2NTM5XHU1NTJmXHU4YjgwXHU2YTk0XHVmZjFhezB9DQotbW92ZVJlc291cmNlRXJyb3JfbXNnPVx1OGNjN1x1NmU5MCAnJ3swfScnIFx1NmQ4OVx1NTNjYVx1NWMxYVx1NjcyYVx1NzhiYVx1NWI5YVx1NzY4NFx1NjMwMVx1N2U4Y1x1NjAyN1x1NGY1Y1x1Njk2ZFx1MzAwMg0KLW1vZGlmeUZpbGVzRXJyb3JfbXNnPVx1NzEyMVx1NmNkNVx1NGZlZVx1NjUzOVx1NGUwMFx1NjIxNlx1NTkxYVx1NTAwYlx1NmE5NFx1Njg0OA0KLXJlc291cmNlT3V0T2ZTeW5jaF9tc2c9XHU4Y2M3XHU2ZTkwXHU0ZTBkXHU1NDBjXHU2YjY1XHVmZjBjXHU1ZmM1XHU5ODA4XHU5MWNkXHU2NWIwXHU4ZjA5XHU1MTY1XHVmZjFhezB9DQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1OGYwOVx1NTE2NVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYi4uLg0KLW1vdmVEYXRhVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzlmYlx1NTJkNVx1OGNjN1x1NjU5OS4uLg0KLXNhdmVMaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTEzMlx1NWI1OFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYi4uLg0KLWxvYWRSZXNvdXJjZXNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU1YzA3XHU2MjQwXHU2NzA5XHU3Njg0XHU4Y2M3XHU2ZTkwXHU4ZjA5XHU1MTY1XHU1MjMwXHU4YTE4XHU2MWI2XHU5YWQ0XHU0ZTJkLi4uDQotbWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbnNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU3OWZiXHU4ZjQ5XHU3YTBiXHU1ZThmXHU1MTY3XHU1YmI5XHU4YWFhXHU2NjBlLi4uDQotZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTVjMDdcdTZiY2ZcdTRlMDBcdTUwMGJcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTc2ODRcdTdhN2FcdTUwM2MvXHU3YTdhXHU3NjdkXHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxXHU4YTJkXHU1YjlhXHU3MGJhXHU1MTc2XHU1NDBkXHU3YTMxLi4uDQotVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eT1cdTcxMjFcdTZjZDVcdTg5ZTNcdTY3OTAgUHJveHkgJyd7MH0nJw0KLXJlZnJlc2hMaWJyYXJ5RmlsZXNUYXNrX25hbWU9XHU5MWNkXHU2NWIwXHU2NTc0XHU3NDA2XHU1ZGU1XHU0ZjVjXHU1MzQwXHU3Njg0XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2YTk0XHU2ODQ4DQotdmVyc2lvbk1pc21hdGNoX29sZFRvb2w9XHU0ZTBkXHU2NTJmXHU2M2Y0XHU5MDc4XHU1M2Q2XHU3Njg0XHU2YTk0XHU2ODQ4IC0gXHU4YWNiXHU1MzQ3XHU3ZDFhXHU4MWYzXHU4ZjAzXHU2NWIwXHU3Njg0IHswfSBcdTcyNDhcdTY3MmNcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNThlNWE5MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjdlMWU0Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIExpYnJhcnkgUGVyc2lzdGVuY2UgKE5MMikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2U7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTRmY2E3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZWRkYWRiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgRVBGIC0gXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDNiXHUwNDM4XHUwNDQ5XHUwNDM1DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODExZmZhMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZE5hbWVFcnJvcl9tc2c9XHUwNDFkXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDM1IFx1MDQzOFx1MDQzY1x1MDQ0ZiAnJ3swfScnLiBcdTA0MTIgXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDNkXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0MzFcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDQ1IFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzMlx1MDQzZVx1MDQzYlx1MDQzZVx1MDQzMjogXFwgLyA6ICogPyAiIDwgPiB8DQotb2JqTm90Rm91bmRFcnJvcl9tc2c9XHUwNDFkXHUwNDM1IFx1MDQzZFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzZCBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDIgXHUwNDQxIFx1MDQxOFx1MDQxNCAnJ3swfScnDQotbG9hZExpYnJhcnlFcnJvcl9tc2c9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0M2FcdTA0MzUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMjoNCi1sb2FkTGlicmFyeUVycm9yX2RldGFpbHM9XCBcIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYVx1MDQzMDogezB9LCBcdTA0NDFcdTA0NDJcdTA0M2VcdTA0M2JcdTA0MzFcdTA0MzVcdTA0NDY6IHsxfSwgXHUwNDQxXHUwNDNlXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1OiB7Mn0NCi1yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2c9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0MzJcdTA0M2VcdTA0NDFcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxICcnezB9JycNCi1GaWxlTWFuYWdlcl9maWxlUmVhZE9ubHk9XHUwNDI0XHUwNDMwXHUwNDM5XHUwNDNiICcnezB9JycgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDM1XHUwNDNkIFx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDQ3XHUwNDQyXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotRXJyTXNnX0NvdWxkTm90RGVsZXRlPVx1MDQxZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgezB9LiB7MX0NCi1yZW5hbWVFcnJvcl9tc2c9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgJyd7MH0nJyBcdTA0MzIgJyd7MX0nJw0KLWJhY2t1cEVycm9yX21zZz1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDBcdTA0MzVcdTA0MzdcdTA0MzVcdTA0NDBcdTA0MzJcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDRlIFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzMCAnJ3swfScnDQotbWFya2VyX2Vycl9jYW5ub3RSZXNvbHZlUHJveHk9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0NDJcdTA0NGMgcHJveHkgezB9DQotbW9kaWZ5RmlsZUVycm9yX21zZz1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgJyd7MH0nJw0KLWxvYWRSZXNvdXJjZUVycm9yX21zZz1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDEgJyd7MH0nJw0KLWxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxICcnezB9JycuIFx1MDQxZlx1MDQ0MFx1MDQzOFx1MDQ0N1x1MDQzOFx1MDQzZFx1MDQzMDogIHsxfQ0KLWludmFsaWRMaWJyYXJ5RmlsZUVycm9yX21zZz1cdTA0MWRcdTA0MzVcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzI6DQotZmlsZU5vdEZvdW5kRXJyb3JfbXNnPVx1MDQxZFx1MDQzNSBcdTA0M2RcdTA0MzBcdTA0MzlcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzAgXHUwNDNkXHUwNDM4IFx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzMCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzMiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzkgXHUwNDNlXHUwNDMxXHUwNDNiXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDM4ICcnezB9JycNCi1ub3JtYWxpemVVUklFcnJvcl9tc2c9XHUwNDFkXHUwNDM1IFx1MDQzZFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzZCBcdTA0M2RcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0M2JcdTA0MzhcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgVVJJIFx1MDQzNFx1MDQzYlx1MDQ0ZiAnJ3swfScnDQotbW92ZUVycm9yX21zZz1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQ0YyAnJ3swfScnIFx1MDQzMiAnJ3sxfScnLiBcdTA0MjZcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIuDQotbW9kaWZ5UmVhZE9ubHlGaWxlRXJyb3JfbXNnPVx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0YiwgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNkXHUwNDMwXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDQ3XHUwNDQyXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmOiB7MH0NCi1tb3ZlUmVzb3VyY2VFcnJvcl9tc2c9XHUwNDIwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxICcnezB9JycgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzMiBcdTA0M2RcdTA0MzVcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDhcdTA0MzVcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzYlx1MDQzOFx1MDQ0OVx1MDQzMC4NCi1tb2RpZnlGaWxlc0Vycm9yX21zZz1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2QgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzZFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzINCi1yZXNvdXJjZU91dE9mU3luY2hfbXNnPVx1MDQyMFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MSBcdTA0M2RcdTA0MzUgXHUwNDQxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkIFx1MDQzOCBcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzVcdTA0M2QgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZDogezB9DQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPVx1MDQxN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzYVx1MDQzMCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLi4uDQotbW92ZURhdGFUYXNrX25hbWU9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NS4uLg0KLXNhdmVMaWJyYXJ5VGFza19uYW1lPVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLi4uDQotbG9hZFJlc291cmNlc1Rhc2tfbmFtZT1cdTA0MTdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0M2FcdTA0MzAgXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDQ1IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzZVx1MDQzMiBcdTA0MzIgXHUwNDNmXHUwNDMwXHUwNDNjXHUwNDRmXHUwNDQyXHUwNDRjLi4uDQotbWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbnNUYXNrX25hbWU9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzOSBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyLi4uDQotZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZT1cdTA0MTdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzAgXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDRiXHUwNDQ1IFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZCBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDQwXHUwNDM1XHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDNjXHUwNDM4IFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzMFx1MDQzY1x1MDQzOCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDRiLi4uDQotVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eT1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzMFx1MDQ0Mlx1MDQ0YyBwcm94eSAnJ3swfScnDQotcmVmcmVzaExpYnJhcnlGaWxlc1Rhc2tfbmFtZT1cdTA0MWVcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0MzIgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDM5IFx1MDQzZVx1MDQzMVx1MDQzYlx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQzOA0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDNkXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQ0ZVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiAtIFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IHswfS4gDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmEwMmQwMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliZTdiM2QuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgTGlicmFyeSBQZXJzaXN0ZW5jZSAoTkwyYSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMGQ3ZTI4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gYmlibGlvdGVrc3BlcnNpc3RlbnMNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzMDVjY2UuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkTmFtZUVycm9yX21zZz1OYXZuZXQgJyd7MH0nJyBlciB1Z3lsZGlndC4gTWV0b2RlZWxlbWVudG5hdm5ldCBtXHUwMGU1IGlra2UgaW5kZWhvbGRlIGZcdTAwZjhsZ2VuZGUgdGVnbjogXFwgLyA6ICogPyAiIDwgPiB8DQotb2JqTm90Rm91bmRFcnJvcl9tc2c9S2FuIGlra2UgZmluZGUgb2JqZWt0IG1lZCBpZCcnZW4gJyd7MH0nJw0KLWxvYWRMaWJyYXJ5RXJyb3JfbXNnPURlciBlciBvcHN0XHUwMGU1ZXQgZmVqbCB1bmRlciBpbmRsXHUwMGU2c25pbmcgYWYgbWV0b2RlYmlibGlvdGVrOg0KLWxvYWRMaWJyYXJ5RXJyb3JfZGV0YWlscz1cIFwgbGluamU6IHswfSwga29sb25uZTogezF9LCBtZWRkZWxlbHNlOiB7Mn0NCi1yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2c9S2FuIGlra2UgZ2VuZGFubmUgcmVzc291cmNlbiAnJ3swfScnDQotRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5PUZpbGVuICcnezB9JycgZXIgc2tyaXZlYmVza3l0dGV0DQotRXJyTXNnX0NvdWxkTm90RGVsZXRlPUthbiBpa2tlIHNsZXR0ZSB7MH0uIHsxfQ0KLXJlbmFtZUVycm9yX21zZz1LYW4gaWtrZSBvbWRcdTAwZjhiZSAnJ3swfScnIHRpbCAnJ3sxfScnDQotYmFja3VwRXJyb3JfbXNnPUthbiBpa2tlIHNpa2tlcmhlZHNrb3BpZXJlIHJlc3NvdXJjZW4gJyd7MH0nJw0KLW1hcmtlcl9lcnJfY2Fubm90UmVzb2x2ZVByb3h5PUthbiBpa2tlIG9wbFx1MDBmOHNlIHByb3h5ZW4gezB9DQotbW9kaWZ5RmlsZUVycm9yX21zZz1LYW4gaWtrZSBcdTAwZTZuZHJlIGZpbGVuICcnezB9JycNCi1sb2FkUmVzb3VyY2VFcnJvcl9tc2c9S2FuIGlra2UgaW5kbFx1MDBlNnNlIHJlc3NvdXJjZW4gJyd7MH0nJw0KLWxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c9S2FuIGlra2UgaW5kbFx1MDBlNnNlIHJlc3NvdXJjZW4gJyd7MH0nJy4gXHUwMGM1cnNhZzogezF9DQotaW52YWxpZExpYnJhcnlGaWxlRXJyb3JfbXNnPVVneWxkaWcgbWV0b2RlYmlibGlvdGVrc2ZpbDoNCi1maWxlTm90Rm91bmRFcnJvcl9tc2c9S2FuIGlra2UgZmluZGUgbm9nZW4gbWV0b2RlYmlibGlvdGVrc2ZpbCBpIGFyYmVqZHNvbXJcdTAwZTVkZXQgJyd7MH0nJw0KLW5vcm1hbGl6ZVVSSUVycm9yX21zZz1LYW4gaWtrZSBmaW5kZSBub3JtYWxpc2VyZXQgVVJJIGZvciAnJ3swfScnDQotbW92ZUVycm9yX21zZz1LYW4gaWtrZSBmbHl0dGUgJyd7MH0nJyB0aWwgJyd7MX0nJy4gRGVzdGluYXRpb25lbiBmaW5kZXMgYWxsZXJlZGUuDQotbW9kaWZ5UmVhZE9ubHlGaWxlRXJyb3JfbXNnPUthbiBpa2tlIFx1MDBlNm5kcmUgZW4gZWxsZXIgZmxlcmUgc2tyaXZlYmVza3l0dGVkZSBmaWxlcjogezB9DQotbW92ZVJlc291cmNlRXJyb3JfbXNnPVJlc3NvdXJjZW4gJyd7MH0nJyBlciBvbWZhdHRldCBhZiBlbiBwZXJzaXN0ZW5zZnVua3Rpb24sIHNvbSBpa2tlIGVyIGNvbW1pdHRldC4NCi1tb2RpZnlGaWxlc0Vycm9yX21zZz1LYW4gaWtrZSBcdTAwZTZuZHJlIGVuIGVsbGVyIGZsZXJlIGZpbGVyDQotcmVzb3VyY2VPdXRPZlN5bmNoX21zZz1SZXNzb3VyY2VuIGVyIGlra2Ugc3lua3JvbmlzZXJldCBvZyBza2FsIGluZGxcdTAwZTZzZXMgaWdlbjogezB9DQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPUluZGxcdTAwZTZzZXIgbWV0b2RlYmlibGlvdGVrLi4uDQotbW92ZURhdGFUYXNrX25hbWU9Rmx5dHRlciBkYXRhLi4uDQotc2F2ZUxpYnJhcnlUYXNrX25hbWU9R2VtbWVyIG1ldG9kZWJpYmxpb3Rlay4uLg0KLWxvYWRSZXNvdXJjZXNUYXNrX25hbWU9SW5kbFx1MDBlNnNlciBhbGxlIHJlc3NvdXJjZXIgaSBodWtvbW1lbHNlLi4uDQotbWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbnNUYXNrX25hbWU9T3ZlcmZcdTAwZjhyZXIgcHJvY2VzaW5kaG9sZHNiZXNrcml2ZWxzZXIuLi4NCi1maXhQcmVzZW50YXRpb25OYW1lVGFza19uYW1lPUluZHN0aWxsZXIgTlVMTC90b210IHByXHUwMGU2c2VudGF0aW9uc25hdm4gcFx1MDBlNSBodmVydCBuZWRicnlkbmluZ3NlbGVtZW50IHRpbCBkZXRzIG5hdm4uLi4NCi1VbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyX2NvdWxkTm90UmVzb2x2ZVByb3h5PUthbiBpa2tlIG9wbFx1MDBmOHNlIHByb3h5ZW4gJyd7MH0nJw0KLXJlZnJlc2hMaWJyYXJ5RmlsZXNUYXNrX25hbWU9T3Bmcmlza2VyIGJpYmxpb3Rla3NmaWxlciBpIGFyYmVqZHNvbXJcdTAwZTVkZQ0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPURlIHZhbGd0ZSBmaWxlciB1bmRlcnN0XHUwMGY4dHRlcyBpa2tlLiBPcGdyYWRcdTAwZTlyIHRpbCBlbiBueWVyZSB2ZXJzaW9uIGFmIHswfS4gDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3YjY1OTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjY2M1ZGYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBMaWJyYXJ5IFVJIChOTDEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmU3YjAxMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9pdC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWZjODU5YS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gQmVudXR6ZXJzY2huaXR0c3RlbGxlIGZcdTAwZmNyIEJpYmxpb3RoZWtlbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIERlZmF1bHQgTWV0aG9kIExpYnJhcnkgUGF0aC4NCi1saWJyYXJ5UGF0aD08dXNlci5ob21lPi88YXBwLm5hbWU+L01ldGhvZCBMaWJyYXJpZXMvbGlicmFyeTENCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YzUwNDhhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1VSSBkZSBiaWJsaW90ZWNhIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIERlZmF1bHQgTWV0aG9kIExpYnJhcnkgUGF0aC4NCi1saWJyYXJ5UGF0aD08dXNlci5ob21lPi88YXBwLm5hbWU+L01ldGhvZCBMaWJyYXJpZXMvbGlicmFyeTENCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNGZlZjliLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1JbnRlcmZhY2UgdXRpbGlzYXRldXIgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgRGVmYXVsdCBNZXRob2QgTGlicmFyeSBQYXRoLg0KLWxpYnJhcnlQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vTWV0aG9kIExpYnJhcmllcy9saWJyYXJ5MQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjZjQ2MTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVVJIGxpYnJlcmlhIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIERlZmF1bHQgTWV0aG9kIExpYnJhcnkgUGF0aC4NCi1saWJyYXJ5UGF0aD08dXNlci5ob21lPi88YXBwLm5hbWU+L01ldGhvZCBMaWJyYXJpZXMvbGlicmFyeTENCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTBiOWY2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgTGlicmFyeSBVSQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIERlZmF1bHQgTWV0aG9kIExpYnJhcnkgUGF0aC4NCi1saWJyYXJ5UGF0aD08dXNlci5ob21lPi88YXBwLm5hbWU+L01ldGhvZCBMaWJyYXJpZXMvbGlicmFyeTENCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OGMzNGViLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFVJDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgRGVmYXVsdCBNZXRob2QgTGlicmFyeSBQYXRoLg0KLWxpYnJhcnlQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vTWV0aG9kIExpYnJhcmllcy9saWJyYXJ5MQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4YzhmOWYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVVJIGRhIEJpYmxpb3RlY2EgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgRGVmYXVsdCBNZXRob2QgTGlicmFyeSBQYXRoLg0KLWxpYnJhcnlQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vTWV0aG9kIExpYnJhcmllcy9saWJyYXJ5MQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkMGVhZjcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTVlOTNcdTc1MjhcdTYyMzdcdTc1NGNcdTk3NjINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IE1ldGhvZCBMaWJyYXJ5IFBhdGguDQotbGlicmFyeVBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9NZXRob2QgTGlicmFyaWVzL2xpYnJhcnkxDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWUwYjlmNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIExpYnJhcnkgVUkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IE1ldGhvZCBMaWJyYXJ5IFBhdGguDQotbGlicmFyeVBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9NZXRob2QgTGlicmFyaWVzL2xpYnJhcnkxDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODZmMDE5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChTaW5ndWxhcikNCi1hY3Rpdml0eV90ZXh0PUFrdGl2aXRcdTAwZTR0DQotYXJ0aWZhY3RfdGV4dD1BcnRlZmFrdA0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9UHJvemVzc211c3Rlcg0KLWNoZWNrbGlzdF90ZXh0PVByXHUwMGZjZmxpc3RlDQotY2hlY2tJdGVtX3RleHQ9UHJcdTAwZmNmbGlzdGVuZWludHJhZw0KLWNvbXBvc2l0ZVJvbGVfdGV4dD1Lb21iaW5pZXJ0ZSBSb2xsZQ0KLWNvbmNlcHRfdGV4dD1Lb256ZXB0DQotY29udGVudFBhY2thZ2VfdGV4dD1JbmhhbHRzcGFrZXQNCi1jdXN0b21DYXRlZ29yeV90ZXh0PUFuZ2VwYXNzdGUgS2F0ZWdvcmllDQotZGVsaXZlcmFibGVfdGV4dD1MaWVmZXJnZWdlbnN0YW5kDQotZGVsaXZlcnlQcm9jZXNzX3RleHQ9QmVyZWl0c3RlbGx1bmdzcHJvemVzcw0KLWRlc2NyaXB0b3JfdGV4dD1EZXNrcmlwdG9yDQotZGlzY2lwbGluZV90ZXh0PURpc3ppcGxpbg0KLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0PVp1c2FtbWVuZmFzc3VuZyB2b24gRGlzemlwbGluZW4NCi1kb21haW5fdGV4dD1Eb21cdTAwZTRuZQ0KLWVzdGltYXRlX3RleHQ9U2NoXHUwMGU0dHplbg0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dD1TY2hcdTAwZTR0em1ldHJpaw0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PUhpbndlaXNlIHp1bSBTY2hcdTAwZTR0emVuDQotZXhhbXBsZV90ZXh0PUJlaXNwaWVsDQotZ3VpZGFuY2VfdGV4dD1BbmxlaXR1bmcNCi1ndWlkZWxpbmVfdGV4dD1SaWNodGxpbmllDQotaXRlcmF0aW9uX3RleHQ9SXRlcmF0aW9uDQotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0PU1ldGhvZGVua29uZmlndXJhdGlvbg0KLW1ldGhvZENvbnRlbnRfdGV4dD1NZXRob2RlbmluaGFsdA0KLW1ldGhvZExpYnJhcnlfdGV4dD1NZXRob2RlbmJpYmxpb3RoZWsNCi1tZXRob2RQYWNrYWdlX3RleHQ9TWV0aG9kZW5wYWtldA0KLW1ldGhvZFBsdWdpbl90ZXh0PU1ldGhvZGVuLVBsdWctaW4NCi1taWxlc3RvbmVfdGV4dD1NZWlsZW5zdGVpbg0KLW91dGNvbWVfdGV4dD1SZXN1bHRhdA0KLXBoYXNlX3RleHQ9UGhhc2UNCi1wcmFjdGljZV90ZXh0PVZlcmZhaHJlbg0KLXByb2Nlc3NfdGV4dD1Qcm96ZXNzDQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PVVudGVyc2NoaWVkbGljaGVyIFByb3plc3MNCi1wcm9jZXNzRmFtaWx5X3RleHQ9UHJvemVzc2ZhbWlsaWUNCi1wcm9jZXNzUGFja2FnZV90ZXh0PVByb3plc3NwYWtldA0KLXJlcG9ydF90ZXh0PUJlcmljaHQNCi1yZXVzYWJsZUFzc2V0X3RleHQ9V2llZGVydmVyd2VuZGJhcmVzIEFzc2V0DQotcm9hZG1hcF90ZXh0PVJvYWRtYXANCi1yb2xlRGVzY3JpcHRvcl90ZXh0PVJvbGxlbmRlc2tyaXB0b3INCi1yb2xlX3RleHQ9Um9sbGUNCi1yb2xlU2V0X3RleHQ9Um9sbGVuZ3J1cHBlDQotcm9sZVNldEdyb3VwaW5nX3RleHQ9WnVzYW1tZW5mYXNzdW5nIHZvbiBSb2xsZW5ncnVwcGVuDQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0PVN0YW5kYXJka2F0ZWdvcmllDQotc3RlcF90ZXh0PVNjaHJpdHQNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dD1VbnRlcnN0XHUwMGZjdHplbmRlcyBNYXRlcmlhbA0KLXRhc2tfdGV4dD1BdWZnYWJlDQotdGFza0Rlc2NyaXB0b3JfdGV4dD1BdWZnYWJlbmRlc2tyaXB0b3INCi10ZWFtUHJvZmlsZV90ZXh0PVRlYW1wcm9maWwNCi10ZW1wbGF0ZV90ZXh0PVZvcmxhZ2UNCi10ZXJtRGVmaW5pdGlvbl90ZXh0PUJlZ3JpZmZzZGVmaW5pdGlvbg0KLXRvb2xfdGV4dD1Ub29sDQotdG9vbE1lbnRvcl90ZXh0PVRvb2xtZW50b3INCi13aGl0ZXBhcGVyX3RleHQ9V2hpdGUgUGFwZXINCi13b3JrUHJvZHVjdF90ZXh0PUFyYmVpdHNlcmdlYm5pcw0KLXdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PUFyYmVpdHNlcmdlYm5pc2Rlc2tyaXB0b3INCi13b3JrUHJvZHVjdEVsZW1lbnRfdGV4dD1BcmJlaXRzZXJnZWJuaXNlbGVtZW50DQotd29ya1Byb2R1Y3RUeXBlX3RleHQ9QXJ0IGRlcyBBcmJlaXRzZXJnZWJuaXNzZXMNCi0NCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChQbHVyYWwpDQotYWN0aXZpdHlfdGV4dF9wbHVyYWw9QWt0aXZpdFx1MDBlNHRlbg0KLWFydGlmYWN0X3RleHRfcGx1cmFsPUFydGVmYWt0ZQ0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsPVByb3plc3NtdXN0ZXINCi1jaGVja2xpc3RfdGV4dF9wbHVyYWw9UHJcdTAwZmNmbGlzdGVuDQotY2hlY2tJdGVtX3RleHRfcGx1cmFsPVByXHUwMGZjZmxpc3RlbmVpbnRyXHUwMGU0Z2UNCi1jb21wb3NpdGVSb2xlX3RleHRfcGx1cmFsPUtvbWJpbmllcnRlIFJvbGxlbg0KLWNvbmNlcHRfdGV4dF9wbHVyYWw9S29uemVwdGUNCi1jb250ZW50UGFja2FnZV90ZXh0X3BsdXJhbD1JbmhhbHRzcGFrZXRlDQotY3VzdG9tQ2F0ZWdvcnlfdGV4dF9wbHVyYWw9QW5nZXBhc3N0ZSBLYXRlZ29yaWVuDQotZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw9TGllZmVyZ2VnZW5zdFx1MDBlNG5kZQ0KLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0X3BsdXJhbD1CZXJlaXRzdGVsbHVuZ3Nwcm96ZXNzZQ0KLWRlc2NyaXB0b3JfdGV4dF9wbHVyYWw9RGVza3JpcHRvcmVuDQotZGlzY2lwbGluZV90ZXh0X3BsdXJhbD1EaXN6aXBsaW5lbg0KLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0X3BsdXJhbD1adXNhbW1lbmZhc3N1bmdlbiB2b24gRGlzemlwbGluZW4NCi1kb21haW5fdGV4dF9wbHVyYWw9RG9tXHUwMGU0bmVuDQotZXN0aW1hdGVfdGV4dF9wbHVyYWw9U2NoXHUwMGU0dHp1bmdlbg0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw9U2NoXHUwMGU0dHptZXRyaWtlbg0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0X3BsdXJhbD1IaW53ZWlzZSB6dW0gU2NoXHUwMGU0dHplbg0KLWV4YW1wbGVfdGV4dF9wbHVyYWw9QmVpc3BpZWxlDQotZ3VpZGFuY2VfdGV4dF9wbHVyYWw9QW5sZWl0dW5nZW4NCi1ndWlkZWxpbmVfdGV4dF9wbHVyYWw9UmljaHRsaW5pZW4NCi1pdGVyYXRpb25fdGV4dF9wbHVyYWw9SXRlcmF0aW9uZW4NCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsPU1ldGhvZGVua29uZmlndXJhdGlvbmVuDQotbWV0aG9kQ29udGVudF90ZXh0X3BsdXJhbD1NZXRob2RlbmluaGFsdA0KLW1ldGhvZExpYnJhcnlfdGV4dF9wbHVyYWw9TWV0aG9kZW5iaWJsaW90aGVrZW4NCi1tZXRob2RQYWNrYWdlX3RleHRfcGx1cmFsPU1ldGhvZGVucGFrZXRlDQotbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsPU1ldGhvZGVuLVBsdWctaW5zDQotbWlsZXN0b25lX3RleHRfcGx1cmFsPU1laWxlbnN0ZWluZQ0KLW91dGNvbWVfdGV4dF9wbHVyYWw9UmVzdWx0YXRlDQotcGhhc2VfdGV4dF9wbHVyYWw9UGhhc2VuDQotcHJhY3RpY2VfdGV4dF9wbHVyYWw9VmVyZmFocmVuDQotcHJvY2Vzc190ZXh0X3BsdXJhbD1Qcm96ZXNzZQ0KLXByb2Nlc3NDb250cmlidXRpb25fdGV4dF9wbHVyYWw9VW50ZXJzY2hpZWRsaWNoZSBQcm96ZXNzZQ0KLXByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw9UHJvemVzc2ZhbWlsaWVuDQotcHJvY2Vzc1BhY2thZ2VfdGV4dF9wbHVyYWw9UHJvemVzc3Bha2V0ZQ0KLXJlcG9ydF90ZXh0X3BsdXJhbD1CZXJpY2h0ZQ0KLXJldXNhYmxlQXNzZXRfdGV4dF9wbHVyYWw9V2llZGVydmVyd2VuZGJhcmUgQXNzZXRzDQotcm9hZG1hcF90ZXh0X3BsdXJhbD1Sb2FkbWFwcw0KLXJvbGVEZXNjcmlwdG9yX3RleHRfcGx1cmFsPVJvbGxlbmRlc2tyaXB0b3Jlbg0KLXJvbGVfdGV4dF9wbHVyYWw9Um9sbGVuDQotcm9sZVNldF90ZXh0X3BsdXJhbD1Sb2xsZW5ncnVwcGVuDQotcm9sZVNldEdyb3VwaW5nX3RleHRfcGx1cmFsPVp1c2FtbWVuZmFzc3VuZ2VuIHZvbiBSb2xsZW5ncnVwcGVuDQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0X3BsdXJhbD1TdGFuZGFyZGthdGVnb3JpZW4NCi1zdGVwX3RleHRfcGx1cmFsPVNjaHJpdHRlDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHRfcGx1cmFsPVVudGVyc3RcdTAwZmN0emVuZGVzIE1hdGVyaWFsDQotdGFza190ZXh0X3BsdXJhbD1BdWZnYWJlbg0KLXRhc2tEZXNjcmlwdG9yX3RleHRfcGx1cmFsPUF1ZmdhYmVuZGVza3JpcHRvcmVuDQotdGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw9VGVhbXByb2ZpbGUNCi10ZW1wbGF0ZV90ZXh0X3BsdXJhbD1Wb3JsYWdlbg0KLXRlcm1EZWZpbml0aW9uX3RleHRfcGx1cmFsPUJlZ3JpZmZzZGVmaW5pdGlvbmVuDQotdG9vbF90ZXh0X3BsdXJhbD1Ub29scw0KLXRvb2xNZW50b3JfdGV4dF9wbHVyYWw9VG9vbG1lbnRvcmVuDQotd2hpdGVwYXBlcl90ZXh0X3BsdXJhbD1XaGl0ZSBQYXBlcg0KLXdvcmtQcm9kdWN0X3RleHRfcGx1cmFsPUFyYmVpdHNlcmdlYm5pc3NlDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHRfcGx1cmFsPUFyYmVpdHNlcmdlYm5pc2Rlc2tyaXB0b3Jlbg0KLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0X3BsdXJhbD1BcmJlaXRzZXJnZWJuaXNlbGVtZW50ZQ0KLXdvcmtQcm9kdWN0VHlwZV90ZXh0X3BsdXJhbD1BcnRlbiB2b24gQXJiZWl0c2VyZ2Vibmlzc2VuDQotDQotIyBBcHBsaWNhdGlvbiB0aXRsZS4NCi1hcHBsaWNhdGlvbl90aXRsZT17MH0gLSB7MX0NCi0NCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRGlhbG9nDQotb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU9TWV0aG9kZW5iaWJsaW90aGVrIFx1MDBmNmZmbmVuDQotb3BlbkxpYnJhcnlEaWFsb2dBcmVhX3RpdGxlPU1ldGhvZGVuYmlibGlvdGhlayBhdXN3XHUwMGU0aGxlbg0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90ZXh0PXswfSBzcGVpY2hlcnQgTWV0aG9kZW4gdW5kIFByb3plc3NlIGluIGVpbmVtIE9yZG5lciwgZGVyXG5hbHMgTWV0aG9kZW5iaWJsaW90aGVrIGJlemVpY2huZXQgd2lyZC4gV1x1MDBlNGhsZW4gU2llIGVpbmVuIE1ldGhvZGVuYmlibGlvdGhla3NvcmRuZXIgZlx1MDBmY3IgZGllc2UgU2l0enVuZyBhdXMuDQotbGlicmFyeUxhYmVsX3RleHQ9QmlibGlvdGhlazoNCi1icm93c2VCdXR0b25fdGV4dD1EdXJjaHN1Y2hlbi4uLg0KLXByb21wdEZvckxpYnJhcnlDaGVja2JveF90ZXh0PUFscyBTdGFuZGFyZCB2ZXJ3ZW5kZW4gdW5kIG5pY2h0IGVybmV1dCBhbmZyYWdlbi4NCi1vcGVuTGlicmFyeURpYWxvZ19uZXdMaWJyYXJ5X3RleHQ9RXMgaXN0IGtlaW5lIE1ldGhvZGVuYmlibGlvdGhlayBpbiAnJ3swfScnIHZvcmhhbmRlbi5cbkVzIHdpcmQgZWluZSBuZXVlIE1ldGhvZGVuYmlibGlvdGhlayBpbSBhbmdlZ2ViZW5lbiBWZXJ6ZWljaG5pcyBlcnN0ZWxsdCB1bmQgZ2VcdTAwZjZmZm5ldC5cblxuS2xpY2tlbiBTaWUgYXVmIE9LLCB1bSBkaWUgT3BlcmF0aW9uIGZvcnR6dXNldHplbiwgb2RlciBrbGlja2VuIFNpZSBhdWYgQWJicmVjaGVuLFxudW0gZWluZW4gYW5kZXJlbiBNZXRob2RlbmJpYmxpb3RoZWtzcGZhZCBhbnp1Z2ViZW4uDQotDQotIyBTZWxlY3QgTWV0aG9kIExpYnJhcnkgRm9sZGVyIERpYWxvZw0KLXNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGl0bGU9TWV0aG9kZW5iaWJsaW90aGVrIGF1c3dcdTAwZTRobGVuDQotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0PVdcdTAwZTRobGVuIFNpZSBlaW5lbiBNZXRob2RlbmJpYmxpb3RoZWtzb3JkbmVyIGF1cy4NCi0NCi0jIE9wZW4gTGlicmFyeSBQcm9ncmVzcyBNZXNzYWdlDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9TWV0aG9kZW5iaWJsaW90aGVrIHdpcmQgZ2VcdTAwZjZmZm5ldC4uLg0KLQ0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBFcnJvciBEaWFsb2cNCi1pbnZhbGlkTGlicmFyeVBhdGhfbXNnPUlVUEwwMzAwRTogRGllIGFuZ2VnZWJlbmUgTWV0aG9kZW5iaWJsaW90aGVrIGthbm4gbmljaHQgZ2VcdTAwZjZmZm5ldCB3ZXJkZW4uDQotaW52YWxpZExpYnJhcnlQYXRoX3JlYXNvbj1EZXIgYXVzZ2V3XHUwMGU0aGx0ZSBNZXRob2RlbmJpYmxpb3RoZWtzb3JkbmVyIGlzdCB1bmdcdTAwZmNsdGlnLCBuaWNodCB2b3JoYW5kZW4sIG9kZXIgU2llIHNpbmQgbmljaHQgYmVyZWNodGlndCwgYXVmIGRlbiBPcmRuZXIgenV6dWdyZWlmZW4uXG5cbktsaWNrZW4gU2llIGF1ZiBPSywgdW0gZWluZW4gYW5kZXJlbiBCaWJsaW90aGVrc29yZG5lciBhdXN6dXdcdTAwZTRobGVuLg0KLQ0KLSMgTGlicmFyeSBMb2NrZWQgRXJyb3IgRGlhbG9nDQotbGlicmFyeUxvY2tlZF9tc2c9SVVQTDAzMDNFOiBEaWUgYW5nZWdlYmVuZSBNZXRob2RlbmJpYmxpb3RoZWsga2FubiBuaWNodCBnZVx1MDBmNmZmbmV0IHdlcmRlbi5cblxuRGllIGF1c2dld1x1MDBlNGhsdGUgTWV0aG9kZW5iaWJsaW90aGVrIHNjaGVpbnQgaW0gR2VicmF1Y2ggenUgc2Vpbi4gS2xpY2tlbiBTaWUgYXVmIEFiYnJlY2hlbiwgdW0gZWluZW4gYW5kZXJlbiBCaWJsaW90aGVrc29yZG5lciBhdXN6dXdcdTAwZTRobGVuLCBvZGVyIGtsaWNrZW4gU2llIGF1ZiBcdTAwZDZmZm5lbiBlcnp3aW5nZW4sIHdlbm4gU2llIGRpZSBCaWJsaW90aGVrIHRyb3R6ZGVtIFx1MDBmNmZmbmVuIG1cdTAwZjZjaHRlbi5cblxuV0FSTlVORzogRGllIHBhcmFsbGVsZSBWZXJ3ZW5kdW5nIGVpbmVyIE1ldGhvZGVuYmlibGlvdGhlayBrYW5uIHp1ciBCZXNjaFx1MDBlNGRpZ3VuZyBkaWVzZXIgQmlibGlvdGhlayBmXHUwMGZjaHJlbi4NCi1saWJyYXJ5TG9ja2VkX29wZW5CdXR0b25fdGV4dD1cdTAwZDZmZm5lbiBlcnp3aW5nZW4NCi0NCi0jIFJlYWQtb25seSBQcm9qZWN0IEZpbGUgRXJyb3IgRGlhbG9nDQotcmVhZE9ubHlQcm9qZWN0RmlsZV90ZXh0PUlVUEwwMzAyRTogJyd7MH0nJyBpc3Qgc2NocmVpYmdlc2NoXHUwMGZjdHp0LiBCZXZvciBTaWUgZGVuIFZvcmdhbmcgZm9ydHNldHplbiwgbVx1MDBmY3NzZW4gU2llIGRhZlx1MDBmY3Igc29yZ2VuLCBkYXNzIGluIGRpZSBEYXRlaSBnZXNjaHJpZWJlbiB3ZXJkZW4ga2Fubi4NCi1yZXRyeUJ1dHRvbl90ZXh0PVdpZWRlcmhvbGVuDQotY2FuY2VsQnV0dG9uX3RleHQ9QWJicmVjaGVuDQotDQotIyBWZXJzaW9uIE1pc21hdGNoIERpYWxvZw0KLXZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0PUlVUEwzMDVFOiBEaWUgYXVzZ2V3XHUwMGU0aGx0ZSBCaWJsaW90aGVrIGthbm4gbmljaHQgZ2VcdTAwZjZmZm5ldCB3ZXJkZW4uIFNpZSBtXHUwMGZjc3NlbiBlaW5lbiBVcGdyYWRlIHZvbiB7MH0gYXVmIFZlcnNpb24gezF9IG9kZXIgaFx1MDBmNmhlciBkdXJjaGZcdTAwZmNocmVuLCB1bSBkaWVzZSBCaWJsaW90aGVrIFx1MDBmNmZmbmVuIHp1IGtcdTAwZjZubmVuLg0KLXZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0X3Vua25vd249SVVQTDMwNkU6IERpZSBhdXNnZXdcdTAwZTRobHRlIEJpYmxpb3RoZWsga2FubiBuaWNodCBnZVx1MDBmNmZmbmV0IHdlcmRlbi4gU2llIG1cdTAwZmNzc2VuIGVpbmVuIFVwZ3JhZGUgdm9uIHswfSBhdWYgZWluZSBoXHUwMGY2aGVyZSBWZXJzaW9uIGR1cmNoZlx1MDBmY2hyZW4sIHVtIGRpZXNlIEJpYmxpb3RoZWsgXHUwMGY2ZmZuZW4genUga1x1MDBmNm5uZW4uDQotDQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPU1ldGhvZGVuYmlibGlvdGhlayBha3R1YWxpc2llcmVuDQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dD1EaWUgYXVzZ2V3XHUwMGU0aGx0ZSBCaWJsaW90aGVrIG11c3MgYXVmIGRpZSBuZXVlIEJpYmxpb3RoZWtzc3RydWt0dXIgYWt0dWFsaXNpZXJ0IHdlcmRlbi5cblxuTVx1MDBmNmNodGVuIFNpZSBkZW4gVXBncmFkZSBmb3J0c2V0emVuPw0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9VXBncmFkZSBmXHUwMGZjciBNZXRob2RlbmJpYmxpb3RoZWsgd2lyZCBkdXJjaGdlZlx1MDBmY2hydC4uLg0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEwwMzAxRTogRmVobGVyIGJlaW0gVXBncmFkZSBkZXIgTWV0aG9kZW5iaWJsaW90aGVrLiBTdWNoZW4gU2llIGluIGRlciBQcm90b2tvbGxkYXRlaSBuYWNoIHdlaXRlcmVuIEVpbnplbGhlaXRlbi4NCi0NCi0jIFN3aXRjaCBDb25maWd1cmF0aW9uIERpYWxvZw0KLXN3aXRjaENvbmZpZ0RpYWxvZ190aXRsZT1Lb25maWd1cmF0aW9uIHdlY2hzZWxuDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RleHQ9TVx1MDBmNmNodGVuIFNpZSB2b24gZGVyIGFrdHVlbGxlbiBLb25maWd1cmF0aW9uIHp1ciBTdGFuZGFyZGtvbmZpZ3VyYXRpb24gJyd7MH0nJywgZGllIGRlbSBhdXNnZXdcdTAwZTRobHRlbiBQcm96ZXNzIHp1Z2VvcmRuZXQgaXN0LCB3ZWNoc2Vsbj8NCi0JDQotIyBDb25maWd1cmF0aW9uIENvbWJvDQotY3VycmVudENvbmZpZ0xhYmVsX3RleHQ9QWt0dWVsbGUgS29uZmlndXJhdGlvbjoNCi1zZWxlY3RDb25maWdMYWJlbF90ZXh0PVdcdTAwZTRobGVuIFNpZSBlaW5lIEtvbmZpZ3VyYXRpb24gYXVzLg0KLQ0KLSMgRGVsZXRlIEZpbGVzIENvbmZpcm1hdGlvbiBNZXNzYWdlDQotZGVsZXRlRmlsZXNDb25maXJtYXRpb25fbXNnPURlciBhbmdlZ2ViZW5lIFBmYWQgJyd7MH0nJyBpc3QgYmVyZWl0cyB2b3JoYW5kZW4uIEVzIHdlcmRlbiBhbGxlIERhdGVpZW4gaW0gT3JkbmVyIGdlbFx1MDBmNnNjaHQuIEZvcnRmYWhyZW4/DQotDQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcw0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPURlciBQZmFkICcnezB9JycgZW50aFx1MDBlNGx0IG1pbmRlc3RlbnMgZWluZSBEYXRlaSwgZGllIG5pY2h0IGdlbFx1MDBmNnNjaHQgd2VyZGVuIGthbm4uXG5cbldcdTAwZTRobGVuIFNpZSBlaW5lbiBhbmRlcmVuIFBmYWQgYXVzIHVuZCB3aWVkZXJob2xlbiBTaWUgZGVuIFZvcmdhbmcuDQotY3JlYXRlUGF0aEVycm9yX3JlYXNvbj1EZXIgUGZhZCAnJ3swfScnIGthbm4gbmljaHQgZXJzdGVsbHQgd2VyZGVuLlxuXG5XXHUwMGU0aGxlbiBTaWUgZWluZW4gYW5kZXJlbiBQZmFkIGF1cyB1bmQgd2llZGVyaG9sZW4gU2llIGRlbiBWb3JnYW5nLg0KLWludmFsaWRQYXRoX21zZz1EZXIgYW5nZWdlYmVuZSBQZmFkIGlzdCBuaWNodCBnXHUwMGZjbHRpZy4NCi0NCi0jIEJhY2t1cCBMaWJyYXJ5IERpYWxvZw0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGl0bGU9U2ljaGVydW5nc2JpYmxpb3RoZWsNCi1iYWNrdXBMaWJyYXJ5RGlhbG9nX3RleHQ9RXMgd2lyZCBkcmluZ2VuZCBlbXBmb2hsZW4sIGRpZSBha3R1ZWxsZSBNZXRob2RlbmJpYmxpb3RoZWsgenUgc2ljaGVybiwgYmV2b3IgU2llIGRlbiBWb3JnYW5nIGZvcnRzZXR6ZW4uXG5cbktsaWNrZW4gU2llIGF1ZiBPSywgdW0gZWluZSBTaWNoZXJ1bmdza29waWUgZGVyIEJpYmxpb3RoZWsgaW0gYW5nZWdlYmVuZW4gVmVyemVpY2huaXMgenUgZXJzdGVsbGVuLiBLbGlja2VuIFNpZSBhdWYgIlx1MDBkY2JlcnNwcmluZ2VuIiwgdW0gZGVuIFZvcmdhbmcgb2huZSBFcnN0ZWxsdW5nIGRlciBTaWNoZXJ1bmcgZm9ydHp1c2V0emVuLg0KLWJhY2tpbmdVcExpYnJhcnlUYXNrX25hbWU9U2ljaGVydW5nc2tvcGllIGRlciBCaWJsaW90aGVrc2RhdGVpZW4gd2lyZCBlcnN0ZWxsdC4uLg0KLQ0KLSMgUGF0aCBTZWxlY3Rpb24gRGlhbG9nDQotcGF0aFNlbGVjdGlvbkVycm9yX21zZz1WZXJ6ZWljaG5pcyBrYW5uIG5pY2h0IGVyc3RlbGx0IHdlcmRlbg0KLW9rQnV0dG9uX3RleHQ9T0sNCi1za2lwQnV0dG9uX3RleHQ9XHUwMGRjYmVyc3ByaW5nZW4NCi0NCi0jIFByb2Nlc3MgRWRpdG9yIHByZWZlcmVuY2VzDQotYWx3YXlzQnV0dG9uX3RleHQ9SW1tZXINCi1uZXZlckJ1dHRvbl90ZXh0PU5pZQ0KLXByb21wdEJ1dHRvbl90ZXh0PUFuZnJhZ2UNCi0NCi0jIEFkZCBMaW5rIERpYWxvZw0KLWxpbmtUb1VSTF9uYW1lPVVSTA0KLWxpbmtUb0ZpbGVfbmFtZT1EYXRlaQ0KLWVsZW1lbnRMaW5rX25hbWU9TWV0aG9kZW5lbGVtZW50DQotZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lPU1ldGhvZGVuZWxlbWVudCBtaXQgVHlwcHJcdTAwZTRmaXgNCi1lbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lPU1ldGhvZGVuZWxlbWVudCBtaXQgYmVudXR6ZXJkZWZpbmllcnRlbSBUZXh0DQotDQotIyBDb252ZXJ0IEFjdGl2aXR5IFR5cGUgRGlhbG9nDQotY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlPUFrdGl2aXRcdTAwZTR0c3R5cCBrb252ZXJ0aWVyZW4NCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGV4dD1XXHUwMGU0aGxlbiBTaWUgZGVuIFppZWxha3Rpdml0XHUwMGU0dHN0eXAgYXVzLg0KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX21zZz1JVVBMMDMwNEU6IERpZXNlIEFrdGl2aXRcdTAwZTR0IGthbm4gbmljaHQgaW4gZWluZW4gYW5kZXJlbiBUeXAga29udmVydGllcnQgd2VyZGVuLg0KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX3JlYXNvbj1FcyBnaWJ0IGtlaW5lbiBrb21wYXRpYmxlbiBBa3Rpdml0XHUwMGU0dHN0eXAgZlx1MDBmY3IgezB9Lg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODY2OWU0ZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoU2luZ3VsYXIpDQotYWN0aXZpdHlfdGV4dD1BY3RpdmlkYWQNCi1hcnRpZmFjdF90ZXh0PUFydGVmYWN0bw0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9UGF0clx1MDBmM24gZGUgcG9zaWJpbGlkYWQNCi1jaGVja2xpc3RfdGV4dD1MaXN0YSBkZSBjb21wcm9iYWNpXHUwMGYzbg0KLWNoZWNrSXRlbV90ZXh0PUVsZW1lbnRvIGRlIGNvbXByb2JhY2lcdTAwZjNuDQotY29tcG9zaXRlUm9sZV90ZXh0PVJvbCBjb21wdWVzdG8NCi1jb25jZXB0X3RleHQ9Q29uY2VwdG8NCi1jb250ZW50UGFja2FnZV90ZXh0PVBhcXVldGUgZGUgY29udGVuaWRvDQotY3VzdG9tQ2F0ZWdvcnlfdGV4dD1DYXRlZ29yXHUwMGVkYSBwZXJzb25hbGl6YWRhDQotZGVsaXZlcmFibGVfdGV4dD1Qcm9kdWN0byBmaW5hbA0KLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0PVByb2Nlc28gZGUgZW50cmVnYQ0KLWRlc2NyaXB0b3JfdGV4dD1EZXNjcmlwdG9yDQotZGlzY2lwbGluZV90ZXh0PURpc2NpcGxpbmENCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dD1BZ3J1cGFjaVx1MDBmM24gZGUgZGlzY2lwbGluYXMNCi1kb21haW5fdGV4dD1Eb21pbmlvDQotZXN0aW1hdGVfdGV4dD1DXHUwMGUxbGN1bG8NCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9Q1x1MDBlMWxjdWxvIGRlIGxhIG1lZGlkYQ0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PUNvbnNpZGVyYWNpb25lcyBzb2JyZSBlbCBjXHUwMGUxbGN1bG8NCi1leGFtcGxlX3RleHQ9RWplbXBsbw0KLWd1aWRhbmNlX3RleHQ9R3VcdTAwZWRhDQotZ3VpZGVsaW5lX3RleHQ9RGlyZWN0cml6DQotaXRlcmF0aW9uX3RleHQ9SXRlcmFjaVx1MDBmM24NCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHQ9Q29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvDQotbWV0aG9kQ29udGVudF90ZXh0PUNvbnRlbmlkbyBkZWwgbVx1MDBlOXRvZG8NCi1tZXRob2RMaWJyYXJ5X3RleHQ9QmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MNCi1tZXRob2RQYWNrYWdlX3RleHQ9UGFxdWV0ZSBkZWwgbVx1MDBlOXRvZG8NCi1tZXRob2RQbHVnaW5fdGV4dD1QbHVnLWluIGRlIG1cdTAwZTl0b2RvDQotbWlsZXN0b25lX3RleHQ9T2JqZXRpdm8NCi1vdXRjb21lX3RleHQ9UmVzdWx0YWRvDQotcGhhc2VfdGV4dD1GYXNlDQotcHJhY3RpY2VfdGV4dD1Qclx1MDBlMWN0aWNhDQotcHJvY2Vzc190ZXh0PVByb2Nlc28NCi1wcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9UHJvY2VzbyBkaWZlcmVuY2lhbA0KLXByb2Nlc3NGYW1pbHlfdGV4dD1GYW1pbGlhIGRlbCBwcm9jZXNvDQotcHJvY2Vzc1BhY2thZ2VfdGV4dD1QYXF1ZXRlIGRlIHByb2Nlc28NCi1yZXBvcnRfdGV4dD1JbmZvcm1lDQotcmV1c2FibGVBc3NldF90ZXh0PUFjdGl2byByZXV0aWxpemFibGUNCi1yb2FkbWFwX3RleHQ9TWFwYQ0KLXJvbGVEZXNjcmlwdG9yX3RleHQ9RGVzY3JpcHRvciBkZSByb2xlcw0KLXJvbGVfdGV4dD1Sb2wNCi1yb2xlU2V0X3RleHQ9Q29uanVudG8gZGUgcm9sZXMNCi1yb2xlU2V0R3JvdXBpbmdfdGV4dD1BZ3J1cGFjaVx1MDBmM24gZGUgY29uanVudG9zIGRlIHJvbGVzDQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0PUNhdGVnb3JcdTAwZWRhIGVzdFx1MDBlMW5kYXINCi1zdGVwX3RleHQ9UGFzbw0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PU1hdGVyaWFsIGRlIHNvcG9ydGUNCi10YXNrX3RleHQ9VGFyZWENCi10YXNrRGVzY3JpcHRvcl90ZXh0PURlc2NyaXB0b3IgZGUgdGFyZWFzDQotdGVhbVByb2ZpbGVfdGV4dD1QZXJmaWwgZGVsIGVxdWlwbw0KLXRlbXBsYXRlX3RleHQ9UGxhbnRpbGxhDQotdGVybURlZmluaXRpb25fdGV4dD1EZWZpbmljaVx1MDBmM24gZGUgdFx1MDBlOXJtaW5vcw0KLXRvb2xfdGV4dD1IZXJyYW1pZW50YQ0KLXRvb2xNZW50b3JfdGV4dD1HdVx1MDBlZGEgZGUgbGEgaGVycmFtaWVudGENCi13aGl0ZXBhcGVyX3RleHQ9RG9jdW1lbnRhY2lcdTAwZjNuDQotd29ya1Byb2R1Y3RfdGV4dD1Qcm9kdWN0byBkZSB0cmFiYWpvDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9RGVzY3JpcHRvciBkZSBwcm9kdWN0b3MgZGUgdHJhYmFqbw0KLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0PUVsZW1lbnRvIGRlIHByb2R1Y3RvIGRlIHRyYWJham8NCi13b3JrUHJvZHVjdFR5cGVfdGV4dD1DbGFzZSBkZSBwcm9kdWN0byBkZSB0cmFiYWpvDQotDQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoUGx1cmFsKQ0KLWFjdGl2aXR5X3RleHRfcGx1cmFsPUFjdGl2aWRhZGVzDQotYXJ0aWZhY3RfdGV4dF9wbHVyYWw9QXJ0ZWZhY3Rvcw0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsPVBhdHJvbmVzIGRlIHBvc2liaWxpZGFkDQotY2hlY2tsaXN0X3RleHRfcGx1cmFsPUxpc3RhcyBkZSBjb21wcm9iYWNpXHUwMGYzbg0KLWNoZWNrSXRlbV90ZXh0X3BsdXJhbD1FbGVtZW50b3MgZGUgY29tcHJvYmFjaVx1MDBmM24NCi1jb21wb3NpdGVSb2xlX3RleHRfcGx1cmFsPVJvbGVzIGNvbXB1ZXN0b3MNCi1jb25jZXB0X3RleHRfcGx1cmFsPUNvbmNlcHRvcw0KLWNvbnRlbnRQYWNrYWdlX3RleHRfcGx1cmFsPVBhcXVldGVzIGRlIGNvbnRlbmlkbw0KLWN1c3RvbUNhdGVnb3J5X3RleHRfcGx1cmFsPUNhdGVnb3JcdTAwZWRhcyBwZXJzb25hbGl6YWRhcw0KLWRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsPVByb2R1Y3RvcyBmaW5hbGVzDQotZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsPVByb2Nlc29zIGRlIGVudHJlZ2ENCi1kZXNjcmlwdG9yX3RleHRfcGx1cmFsPURlc2NyaXB0b3Jlcw0KLWRpc2NpcGxpbmVfdGV4dF9wbHVyYWw9RGlzY2lwbGluYXMNCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dF9wbHVyYWw9QWdydXBhY2lvbmVzIGRlIGRpc2NpcGxpbmFzDQotZG9tYWluX3RleHRfcGx1cmFsPURvbWluaW9zDQotZXN0aW1hdGVfdGV4dF9wbHVyYWw9Q1x1MDBlMWxjdWxvcw0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw9Q1x1MDBlMWxjdWxvIGRlIGxhIG1lZGlkYQ0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0X3BsdXJhbD1Db25zaWRlcmFjaW9uZXMgc29icmUgZWwgY1x1MDBlMWxjdWxvDQotZXhhbXBsZV90ZXh0X3BsdXJhbD1FamVtcGxvcw0KLWd1aWRhbmNlX3RleHRfcGx1cmFsPUd1XHUwMGVkYXMNCi1ndWlkZWxpbmVfdGV4dF9wbHVyYWw9RGlyZWN0cmljZXMNCi1pdGVyYXRpb25fdGV4dF9wbHVyYWw9SXRlcmFjaW9uZXMNCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsPUNvbmZpZ3VyYWNpb25lcyBkZWwgbVx1MDBlOXRvZG8NCi1tZXRob2RDb250ZW50X3RleHRfcGx1cmFsPUNvbnRlbmlkbyBkZWwgbVx1MDBlOXRvZG8NCi1tZXRob2RMaWJyYXJ5X3RleHRfcGx1cmFsPUJpYmxpb3RlY2FzIGRlIG1cdTAwZTl0b2Rvcw0KLW1ldGhvZFBhY2thZ2VfdGV4dF9wbHVyYWw9UGFxdWV0ZXMgZGVsIG1cdTAwZTl0b2RvDQotbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsPVBsdWctaW5zIGRlIG1cdTAwZTl0b2RvDQotbWlsZXN0b25lX3RleHRfcGx1cmFsPU9iamV0aXZvcw0KLW91dGNvbWVfdGV4dF9wbHVyYWw9UmVzdWx0YWRvcw0KLXBoYXNlX3RleHRfcGx1cmFsPUZhc2VzDQotcHJhY3RpY2VfdGV4dF9wbHVyYWw9UHJcdTAwZTFjdGljYXMNCi1wcm9jZXNzX3RleHRfcGx1cmFsPVByb2Nlc29zDQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbD1Qcm9jZXNvcyBkaWZlcmVuY2lhbGVzDQotcHJvY2Vzc0ZhbWlseV90ZXh0X3BsdXJhbD1GYW1pbGlhcyBkZWwgcHJvY2Vzbw0KLXByb2Nlc3NQYWNrYWdlX3RleHRfcGx1cmFsPVBhcXVldGVzIGRlbCBwcm9jZXNvDQotcmVwb3J0X3RleHRfcGx1cmFsPUluZm9ybWVzDQotcmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbD1BY3Rpdm9zIHJldXRpbGl6YWJsZXMNCi1yb2FkbWFwX3RleHRfcGx1cmFsPU1hcGFzDQotcm9sZURlc2NyaXB0b3JfdGV4dF9wbHVyYWw9RGVzY3JpcHRvcmVzIGRlIHJvbGVzDQotcm9sZV90ZXh0X3BsdXJhbD1Sb2xlcw0KLXJvbGVTZXRfdGV4dF9wbHVyYWw9Q29uanVudG9zIGRlIHJvbGVzDQotcm9sZVNldEdyb3VwaW5nX3RleHRfcGx1cmFsPUFncnVwYWNpb25lcyBkZWwgY29uanVudG8gZGUgcm9sZXMNCi1zdGFuZGFyZENhdGVnb3J5X3RleHRfcGx1cmFsPUNhdGVnb3JcdTAwZWRhcyBlc3RcdTAwZTFuZGFyDQotc3RlcF90ZXh0X3BsdXJhbD1QYXNvcw0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0X3BsdXJhbD1NYXRlcmlhbGVzIGRlIHNvcG9ydGUNCi10YXNrX3RleHRfcGx1cmFsPVRhcmVhcw0KLXRhc2tEZXNjcmlwdG9yX3RleHRfcGx1cmFsPURlc2NyaXB0b3JlcyBkZSB0YXJlYQ0KLXRlYW1Qcm9maWxlX3RleHRfcGx1cmFsPVBlcmZpbGVzIGRlbCBlcXVpcG8NCi10ZW1wbGF0ZV90ZXh0X3BsdXJhbD1QbGFudGlsbGFzDQotdGVybURlZmluaXRpb25fdGV4dF9wbHVyYWw9RGVmaW5pY2lvbmVzIGRlbCB0XHUwMGU5cm1pbm8NCi10b29sX3RleHRfcGx1cmFsPUhlcnJhbWllbnRhcw0KLXRvb2xNZW50b3JfdGV4dF9wbHVyYWw9R3VcdTAwZWRhcyBkZSBsYSBoZXJyYW1pZW50YQ0KLXdoaXRlcGFwZXJfdGV4dF9wbHVyYWw9RG9jdW1lbnRhY2lcdTAwZjNuDQotd29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw9UHJvZHVjdG9zIGRlIHRyYWJham8NCi13b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw9RGVzY3JpcHRvcmVzIGRlbCBwcm9kdWN0byBkZSB0cmFiYWpvDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHRfcGx1cmFsPUVsZW1lbnRvcyBkZSBwcm9kdWN0byBkZSB0cmFiYWpvDQotd29ya1Byb2R1Y3RUeXBlX3RleHRfcGx1cmFsPUNsYXNlcyBkZSBwcm9kdWN0byBkZSB0cmFiYWpvDQotDQotIyBBcHBsaWNhdGlvbiB0aXRsZS4NCi1hcHBsaWNhdGlvbl90aXRsZT17MH0gLSB7MX0NCi0NCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRGlhbG9nDQotb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU9QWJyaXIgdW5hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zDQotb3BlbkxpYnJhcnlEaWFsb2dBcmVhX3RpdGxlPVNlbGVjY2lvbmFyIHVuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcw0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90ZXh0PXswfSBhbG1hY2VuYSBtXHUwMGU5dG9kb3MgeSBwcm9jZXNvcyBlbiB1bmEgY2FycGV0YSBsbGFtYWRhIFxuYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuIFNlbGVjY2lvbmUgdW5hIGNhcnBldGEgZGUgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgcGFyYSB1dGlsaXphciBlbiBlc3RhIHNlc2lcdTAwZjNuLg0KLWxpYnJhcnlMYWJlbF90ZXh0PUJpYmxpb3RlY2E6DQotYnJvd3NlQnV0dG9uX3RleHQ9RXhhbWluYXIuLi4NCi1wcm9tcHRGb3JMaWJyYXJ5Q2hlY2tib3hfdGV4dD1VdGlsaXphciBlc3RhIGJpYmxpb3RlY2EgY29tbyBwb3Igb21pc2lcdTAwZjNuIHkgbm8gdm9sdmVyIGEgcHJlZ3VudGFyLg0KLW9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dD1ObyBleGlzdGUgbmluZ3VuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBlbiAnJ3swfScnLiBcblNlIGNyZWFyXHUwMGUxIHkgYWJyaXJcdTAwZTEgYXV0b21cdTAwZTF0aWNhbWVudGUgdW5hIG51ZXZhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGVuIGVsIGRpcmVjdG9yaW8gZXNwZWNpZmljYWRvLlxuXG5QdWxzZSBBY2VwdGFyIHBhcmEgY29udGludWFyIG8gQ2FuY2VsYXIgcGFyYSBlc3BlY2lmaWNhciBvdHJhIHZcdTAwZWRhIGRlIGFjY2VzbyBwYXJhIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLg0KLQ0KLSMgU2VsZWN0IE1ldGhvZCBMaWJyYXJ5IEZvbGRlciBEaWFsb2cNCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlPVNlbGVjY2lvbmFyIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zDQotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0PVNlbGVjY2lvbmUgdW5hIGNhcnBldGEgZGUgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuDQotDQotIyBPcGVuIExpYnJhcnkgUHJvZ3Jlc3MgTWVzc2FnZQ0KLW9wZW5pbmdMaWJyYXJ5VGFza19uYW1lPUFicmllbmRvIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLi4uDQotDQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLWludmFsaWRMaWJyYXJ5UGF0aF9tc2c9SVVQTDAzMDBFOiBObyBzZSBoYSBwb2RpZG8gYWJyaXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZXNwZWNpZmljYWRhLg0KLWludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb249TGEgY2FycGV0YSBkZSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBzZWxlY2Npb25hZGEgbm8gZXMgdlx1MDBlMWxpZGEsIG5vIGV4aXN0ZSBvIG5vIHRpZW5lIGVsIHBlcm1pc28gYWRlY3VhZG8gcGFyYSBhY2NlZGVyIGEgZWxsYS5cblxuUHVsc2UgQWNlcHRhciBwYXJhIHNlbGVjY2lvbmFyIG90cmEgY2FycGV0YSBkZSBiaWJsaW90ZWNhLg0KLQ0KLSMgTGlicmFyeSBMb2NrZWQgRXJyb3IgRGlhbG9nDQotbGlicmFyeUxvY2tlZF9tc2c9SVVQTDAzMDNFOiBObyBzZSBoYSBwb2RpZG8gYWJyaXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZXNwZWNpZmljYWRhLlxuXG5MYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBzZWxlY2Npb25hZGEgcGFyZWNlIHF1ZSBzZSBlc3RcdTAwZTEgdXRpbGl6YW5kby4gUHVsc2UgQ2FuY2VsYXIgcGFyYSBzZWxlY2Npb25hciBvdHJhIGNhcnBldGEgZGUgYmlibGlvdGVjYSwgbyBwdWxzZSBGb3J6YXIgYWJyaXIgc2kgZGVzZWEgYWJyaXIgbGEgYmlibGlvdGVjYSBkZSB0b2RhcyBmb3JtYXMuXG5cbkFWSVNPOiBFbCB1c28gY29uY3VycmVudGUgZGUgdW5hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIHB1ZWRlIGNvcnJvbXBlciBsYSBiaWJsaW90ZWNhLg0KLWxpYnJhcnlMb2NrZWRfb3BlbkJ1dHRvbl90ZXh0PUZvcnphciBhYnJpcg0KLQ0KLSMgUmVhZC1vbmx5IFByb2plY3QgRmlsZSBFcnJvciBEaWFsb2cNCi1yZWFkT25seVByb2plY3RGaWxlX3RleHQ9SVVQTDAzMDJFOiAnJ3swfScnIGVzIGRlIHNcdTAwZjNsbyBsZWN0dXJhLiBTZWxlY2Npb25lIGxhIG9wY2lcdTAwZjNuIHBhcmEgcXVlIHNlIHB1ZWRhIGVzY3JpYmlyIGFudGVzIGRlIGNvbnRpbnVhci4NCi1yZXRyeUJ1dHRvbl90ZXh0PVJlaW50ZW50YXINCi1jYW5jZWxCdXR0b25fdGV4dD1DYW5jZWxhcg0KLQ0KLSMgVmVyc2lvbiBNaXNtYXRjaCBEaWFsb2cNCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dD1JVVBMMzA1RTogTm8gc2UgcHVlZGUgYWJyaXIgbGEgYmlibGlvdGVjYSBzZWxlY2Npb25hZGEuIERlYmUgYWN0dWFsaXphciB7MH0gYSB1bmEgdmVyc2lcdTAwZjNuIHsxfSBvIHN1cGVyaW9yIHBhcmEgYWJyaXIgZXN0YSBiaWJsaW90ZWNhLg0KLXZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0X3Vua25vd249SVVQTDMwNkU6IE5vIHNlIHB1ZWRlIGFicmlyIGxhIGJpYmxpb3RlY2Egc2VsZWNjaW9uYWRhLiBEZWJlIGFjdHVhbGl6YXIgezB9IGEgdW5hIHZlcnNpXHUwMGYzbiBzdXBlcmlvciBwYXJhIGFicmlyIGVzdGEgYmlibGlvdGVjYS4NCi0NCi0jIFVwZ3JhZGUgTWV0aG9kIExpYnJhcnkgRGlhbG9nDQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGU9QWN0dWFsaXphciBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RleHQ9TGEgYmlibGlvdGVjYSBxdWUgaGEgc2VsZWNjaW9uYWRvIHRpZW5lIHF1ZSBhY3R1YWxpemFyc2UgYSBsYSBudWV2YSBlc3RydWN0dXJhIGRlIGJpYmxpb3RlY2FzLlxuXG5cdTAwYmZEZXNlYSBjb250aW51YXIgY29uIGxhIGFjdHVhbGl6YWNpXHUwMGYzbj8NCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPUFjdHVhbGl6YW5kbyBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4uLg0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEwwMzAxRTogTm8gc2UgaGEgcG9kaWRvIGFjdHVhbGl6YXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuIENvbnN1bHRlIGVsIGFyY2hpdm8gZGUgcmVnaXN0cm8gcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGRldGFsbGVzLg0KLQ0KLSMgU3dpdGNoIENvbmZpZ3VyYXRpb24gRGlhbG9nDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlPUNhbWJpYXIgY29uZmlndXJhY2lcdTAwZjNuDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RleHQ9XHUwMGJmRGVzZWEgY2FtYmlhciBsYSBjb25maWd1cmFjaVx1MDBmM24gYWN0dWFsIHBvciBsYSBjb25maWd1cmFjaVx1MDBmM24gcG9yIG9taXNpXHUwMGYzbiwgJyd7MH0nJywgYXNvY2lhZGEgY29uIGVsIHByb2Nlc28gc2VsZWNjaW9uYWRvPw0KLQkNCi0jIENvbmZpZ3VyYXRpb24gQ29tYm8NCi1jdXJyZW50Q29uZmlnTGFiZWxfdGV4dD1Db25maWd1cmFjaVx1MDBmM24gYWN0dWFsOg0KLXNlbGVjdENvbmZpZ0xhYmVsX3RleHQ9U2VsZWNjaW9uZSB1bmEgY29uZmlndXJhY2lcdTAwZjNuDQotDQotIyBEZWxldGUgRmlsZXMgQ29uZmlybWF0aW9uIE1lc3NhZ2UNCi1kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2c9TGEgdlx1MDBlZGEgZGUgYWNjZXNvIGVzcGVjaWZpY2FkYSAnJ3swfScnIHlhIGV4aXN0ZS4gU2Ugc3VwcmltaXJcdTAwZTFuIHRvZG9zIGxvcyBhcmNoaXZvcyBkZSBsYSBjYXJwZXRhLiBcdTAwYmZEZXNlYSBjb250aW51YXI/DQotDQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcw0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPUxhIHZcdTAwZWRhIGRlIGFjY2VzbyAnJ3swfScnIGNvbnRpZW5lIHVubyBvIHZhcmlvcyBhcmNoaXZvcyBxdWUgbm8gc2UgcHVlZGVuIHN1cHJpbWlyLlxuXG5TZWxlY2Npb25lIG90cmEgdlx1MDBlZGEgZGUgYWNjZXNvIHkgdnVlbHZhIGEgaW50ZW50YXJsby4NCi1jcmVhdGVQYXRoRXJyb3JfcmVhc29uPU5vIHNlIGhhIHBvZGlkbyBsYSB2XHUwMGVkYSBkZSBhY2Nlc28gJyd7MH0nJy5cblxuU2VsZWNjaW9uZSBvdHJhIHZcdTAwZWRhIGRlIGFjY2VzbyB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotaW52YWxpZFBhdGhfbXNnPUxhIHZcdTAwZWRhIGRlIGFjY2VzbyBlc3BlY2lmaWNhZGEgbm8gZXMgdlx1MDBlMWxpZGEuDQotDQotIyBCYWNrdXAgTGlicmFyeSBEaWFsb2cNCi1iYWNrdXBMaWJyYXJ5RGlhbG9nX3RpdGxlPVJlYWxpemFyIGNvcGlhIGRlIHNlZ3VyaWRhZCBkZSBsYSBiaWJsaW90ZWNhDQotYmFja3VwTGlicmFyeURpYWxvZ190ZXh0PUVzIG11eSByZWNvbWVuZGFibGUgcXVlIGhhZ2EgdW5hIGNvcGlhIGRlIHNlZ3VyaWRhZCBkZSBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhY3R1YWwgYW50ZXMgZGUgY29udGludWFyLlxuXG5QdWxzZSBBY2VwdGFyIHBhcmEgY3JlYXIgdW5hIGNvcGlhIGRlIHNlZ3VyaWRhZCBkZSBsYSBiaWJsaW90ZWNhIGVuIGVsIGRpcmVjdG9yaW8gZXNwZWNpZmljYWRvLiBQdWxzZSBPbWl0aXIgcGFyYSBjb250aW51YXIgc2luIGNyZWFyIHVuYSBjb3BpYSBkZSBzZWd1cmlkYWQuDQotYmFja2luZ1VwTGlicmFyeVRhc2tfbmFtZT1SZWFsaXphbmRvIHVuYSBjb3BpYSBkZSBzZWd1cmlkYWQgZGUgbG9zIGFyY2hpdm9zIGRlIGxhIGJpYmxpb3RlY2EuLi4NCi0NCi0jIFBhdGggU2VsZWN0aW9uIERpYWxvZw0KLXBhdGhTZWxlY3Rpb25FcnJvcl9tc2c9Tm8gc2UgaGEgcG9kaWRvIGNyZWFyIGVsIGRpcmVjdG9yaW8NCi1va0J1dHRvbl90ZXh0PUFjZXB0YXINCi1za2lwQnV0dG9uX3RleHQ9T21pdGlyDQotDQotIyBQcm9jZXNzIEVkaXRvciBwcmVmZXJlbmNlcw0KLWFsd2F5c0J1dHRvbl90ZXh0PVNpZW1wcmUNCi1uZXZlckJ1dHRvbl90ZXh0PU51bmNhDQotcHJvbXB0QnV0dG9uX3RleHQ9UHJlZ3VudGFyDQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1saW5rVG9VUkxfbmFtZT1VUkwNCi1saW5rVG9GaWxlX25hbWU9QXJjaGl2bw0KLWVsZW1lbnRMaW5rX25hbWU9RWxlbWVudG8gZGUgbVx1MDBlOXRvZG8NCi1lbGVtZW50TGlua1dpdGhUeXBlX25hbWU9RWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gY29uIHByZWZpam8gdGlwbw0KLWVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0X25hbWU9RWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gY29uIHRleHRvIHBlcnNvbmFsaXphZG8NCi0NCi0jIENvbnZlcnQgQWN0aXZpdHkgVHlwZSBEaWFsb2cNCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGl0bGU9Q29udmVydGlyIHRpcG8gZGUgYWN0aXZpZGFkDQotY29udmVydEFjdGl2aXR5RGlhbG9nX3RleHQ9U2VsZWNjaW9uYXIgdGlwbyBkZSBhY3RpdmlkYWQgZGUgZGVzdGluby4NCi11bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9tc2c9SVVQTDAzMDRFOiBFc3RhIGFjdGl2aWRhZCBubyBzZSBwdWVkZSBjb252ZXJ0aXIgZW4gb3RybyB0aXBvLg0KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX3JlYXNvbj1ObyBoYXkgbmluZ1x1MDBmYW4gdGlwbyBkZSBhY3RpdmlkYWQgY29tcGF0aWJsZSBwYXJhIHswfS4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlMzI3MzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFNpbmd1bGFyKQ0KLWFjdGl2aXR5X3RleHQ9QWN0aXZpdFx1MDBlOQ0KLWFydGlmYWN0X3RleHQ9QXJ0ZWZhY3QNCi1jYXBhYmlsaXR5UGF0dGVybl90ZXh0PVBhdHRlcm4gZGUgY2FwYWNpdFx1MDBlOQ0KLWNoZWNrbGlzdF90ZXh0PUxpc3RlIGRlIGNvbnRyXHUwMGY0bGUNCi1jaGVja0l0ZW1fdGV4dD1FbFx1MDBlOW1lbnQgZGUgdlx1MDBlOXJpZmljYXRpb24NCi1jb21wb3NpdGVSb2xlX3RleHQ9Ulx1MDBmNGxlIGNvbXBvc2l0ZQ0KLWNvbmNlcHRfdGV4dD1Db25jZXB0DQotY29udGVudFBhY2thZ2VfdGV4dD1QYWNrYWdlIGRlIGNvbnRlbnUNCi1jdXN0b21DYXRlZ29yeV90ZXh0PUNhdFx1MDBlOWdvcmllIHBlcnNvbm5hbGlzXHUwMGU5ZQ0KLWRlbGl2ZXJhYmxlX3RleHQ9TGl2cmFibGUNCi1kZWxpdmVyeVByb2Nlc3NfdGV4dD1Qcm9jZXNzdXMgZGUgbGl2cmFpc29uDQotZGVzY3JpcHRvcl90ZXh0PURlc2NyaXB0ZXVyDQotZGlzY2lwbGluZV90ZXh0PURpc2NpcGxpbmUNCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dD1SZWdyb3VwZW1lbnQgZGUgZGlzY2lwbGluZQ0KLWRvbWFpbl90ZXh0PURvbWFpbmUNCi1lc3RpbWF0ZV90ZXh0PUVzdGltYXRpb24NCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9TWVzdXJlIGQnZXN0aW1hdGlvbg0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PUNvbnNpZFx1MDBlOXJhdGlvbnMgcmVsYXRpdmVzIFx1MDBlMCBsJ2VzdGltYXRpb24NCi1leGFtcGxlX3RleHQ9RXhlbXBsZQ0KLWd1aWRhbmNlX3RleHQ9Q29uc2VpbA0KLWd1aWRlbGluZV90ZXh0PUluc3RydWN0aW9ucw0KLWl0ZXJhdGlvbl90ZXh0PUl0XHUwMGU5cmF0aW9uDQotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0PUNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlDQotbWV0aG9kQ29udGVudF90ZXh0PUNvbnRlbnUgZGUgbGEgbVx1MDBlOXRob2RlDQotbWV0aG9kTGlicmFyeV90ZXh0PUJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMNCi1tZXRob2RQYWNrYWdlX3RleHQ9UGFja2FnZSBkZSBtXHUwMGU5dGhvZGUNCi1tZXRob2RQbHVnaW5fdGV4dD1QbHVnLWluIGRlIG1cdTAwZTl0aG9kZQ0KLW1pbGVzdG9uZV90ZXh0PUphbG9uDQotb3V0Y29tZV90ZXh0PVNvcnRpZQ0KLXBoYXNlX3RleHQ9UGhhc2UNCi1wcmFjdGljZV90ZXh0PVByYXRpcXVlDQotcHJvY2Vzc190ZXh0PVByb2Nlc3N1cw0KLXByb2Nlc3NDb250cmlidXRpb25fdGV4dD1Qcm9jZXNzdXMgZGlmZlx1MDBlOXJlbnRpZWwNCi1wcm9jZXNzRmFtaWx5X3RleHQ9RmFtaWxsZSBkZSBwcm9jZXNzdXMNCi1wcm9jZXNzUGFja2FnZV90ZXh0PVBhY2thZ2UgZGUgcHJvY2Vzc3VzDQotcmVwb3J0X3RleHQ9UmFwcG9ydA0KLXJldXNhYmxlQXNzZXRfdGV4dD1SZXNzb3VyY2Ugclx1MDBlOXV0aWxpc2FibGUNCi1yb2FkbWFwX3RleHQ9RmV1aWxsZSBkZSByb3V0ZQ0KLXJvbGVEZXNjcmlwdG9yX3RleHQ9RGVzY3JpcHRldXIgZGUgclx1MDBmNGxlDQotcm9sZV90ZXh0PVJcdTAwZjRsZQ0KLXJvbGVTZXRfdGV4dD1FbnNlbWJsZSBkZSByXHUwMGY0bGVzDQotcm9sZVNldEdyb3VwaW5nX3RleHQ9UmVncm91cGVtZW50IGQnZW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMNCi1zdGFuZGFyZENhdGVnb3J5X3RleHQ9Q2F0XHUwMGU5Z29yaWUgc3RhbmRhcmQNCi1zdGVwX3RleHQ9RXRhcGUNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dD1Eb2N1bWVudCBkJ2FjY29tcGFnbmVtZW50DQotdGFza190ZXh0PVRcdTAwZTJjaGUNCi10YXNrRGVzY3JpcHRvcl90ZXh0PURlc2NyaXB0ZXVyIGRlIHRcdTAwZTJjaGUNCi10ZWFtUHJvZmlsZV90ZXh0PVByb2ZpbCBkZSBsJ1x1MDBlOXF1aXBlDQotdGVtcGxhdGVfdGV4dD1DYW5ldmFzDQotdGVybURlZmluaXRpb25fdGV4dD1EXHUwMGU5ZmluaXRpb24gZGUgdGVybWUNCi10b29sX3RleHQ9T3V0aWwNCi10b29sTWVudG9yX3RleHQ9R3VpZGUgZCd1dGlsaXNhdGlvbiBkZSBsJ291dGlsDQotd2hpdGVwYXBlcl90ZXh0PUxpdnJlIGJsYW5jDQotd29ya1Byb2R1Y3RfdGV4dD1Qcm9kdWl0DQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9RGVzY3JpcHRldXIgZGUgcHJvZHVpdA0KLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0PUVsXHUwMGU5bWVudCBkZSBwcm9kdWl0DQotd29ya1Byb2R1Y3RUeXBlX3RleHQ9VHlwZSBkZSBwcm9kdWl0DQotDQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoUGx1cmFsKQ0KLWFjdGl2aXR5X3RleHRfcGx1cmFsPUFjdGl2aXRcdTAwZTlzDQotYXJ0aWZhY3RfdGV4dF9wbHVyYWw9QXJ0ZWZhY3RzDQotY2FwYWJpbGl0eVBhdHRlcm5fdGV4dF9wbHVyYWw9UGF0dGVybnMgZGUgY2FwYWNpdFx1MDBlOQ0KLWNoZWNrbGlzdF90ZXh0X3BsdXJhbD1MaXN0ZXMgZGUgY29udHJcdTAwZjRsZQ0KLWNoZWNrSXRlbV90ZXh0X3BsdXJhbD1FbFx1MDBlOW1lbnRzIGRlIHZcdTAwZTlyaWZpY2F0aW9uDQotY29tcG9zaXRlUm9sZV90ZXh0X3BsdXJhbD1SXHUwMGY0bGVzIGNvbXBvc2l0ZXMNCi1jb25jZXB0X3RleHRfcGx1cmFsPUNvbmNlcHRzDQotY29udGVudFBhY2thZ2VfdGV4dF9wbHVyYWw9UGFja2FnZXMgZGUgY29udGVudQ0KLWN1c3RvbUNhdGVnb3J5X3RleHRfcGx1cmFsPUNhdFx1MDBlOWdvcmllcyBwZXJzb25uYWxpc1x1MDBlOWVzDQotZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw9TGl2cmFibGVzDQotZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsPVByb2Nlc3N1cyBkZSBsaXZyYWlzb24NCi1kZXNjcmlwdG9yX3RleHRfcGx1cmFsPURlc2NyaXB0ZXVycw0KLWRpc2NpcGxpbmVfdGV4dF9wbHVyYWw9RGlzY2lwbGluZXMNCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dF9wbHVyYWw9UmVncm91cGVtZW50cyBkZSBkaXNjaXBsaW5lcw0KLWRvbWFpbl90ZXh0X3BsdXJhbD1Eb21haW5lcw0KLWVzdGltYXRlX3RleHRfcGx1cmFsPUVzdGltYXRpb25zDQotZXN0aW1hdGluZ01ldHJpY190ZXh0X3BsdXJhbD1NZXN1cmVzIGQnZXN0aW1hdGlvbg0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0X3BsdXJhbD1Db25zaWRcdTAwZTlyYXRpb25zIHJlbGF0aXZlcyBcdTAwZTAgbCdlc3RpbWF0aW9uDQotZXhhbXBsZV90ZXh0X3BsdXJhbD1FeGVtcGxlcw0KLWd1aWRhbmNlX3RleHRfcGx1cmFsPUNvbnNlaWxzDQotZ3VpZGVsaW5lX3RleHRfcGx1cmFsPUluc3RydWN0aW9ucw0KLWl0ZXJhdGlvbl90ZXh0X3BsdXJhbD1JdFx1MDBlOXJhdGlvbnMNCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsPUNvbmZpZ3VyYXRpb25zIGRlIG1cdTAwZTl0aG9kZQ0KLW1ldGhvZENvbnRlbnRfdGV4dF9wbHVyYWw9Q29udGVudXMgZGUgbVx1MDBlOXRob2RlDQotbWV0aG9kTGlicmFyeV90ZXh0X3BsdXJhbD1CaWJsaW90aFx1MDBlOHF1ZXMgZGUgbVx1MDBlOXRob2Rlcw0KLW1ldGhvZFBhY2thZ2VfdGV4dF9wbHVyYWw9UGFja2FnZXMgZGUgbVx1MDBlOXRob2RlDQotbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsPVBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZQ0KLW1pbGVzdG9uZV90ZXh0X3BsdXJhbD1KYWxvbnMNCi1vdXRjb21lX3RleHRfcGx1cmFsPVNvcnRpZXMNCi1waGFzZV90ZXh0X3BsdXJhbD1QaGFzZXMNCi1wcmFjdGljZV90ZXh0X3BsdXJhbD1QcmF0aXF1ZXMNCi1wcm9jZXNzX3RleHRfcGx1cmFsPVByb2Nlc3N1cw0KLXByb2Nlc3NDb250cmlidXRpb25fdGV4dF9wbHVyYWw9UHJvY2Vzc3VzIGRpZmZcdTAwZTlyZW50aWVscw0KLXByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw9RmFtaWxsZXMgZGUgcHJvY2Vzc3VzDQotcHJvY2Vzc1BhY2thZ2VfdGV4dF9wbHVyYWw9UGFja2FnZXMgZGUgcHJvY2Vzc3VzDQotcmVwb3J0X3RleHRfcGx1cmFsPVJhcHBvcnRzDQotcmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbD1SZXNzb3VyY2VzIHJcdTAwZTl1dGlsaXNhYmxlcw0KLXJvYWRtYXBfdGV4dF9wbHVyYWw9Q2FsZW5kcmllcnMNCi1yb2xlRGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1EZXNjcmlwdGV1cnMgZGUgclx1MDBmNGxlDQotcm9sZV90ZXh0X3BsdXJhbD1SXHUwMGY0bGVzDQotcm9sZVNldF90ZXh0X3BsdXJhbD1FbnNlbWJsZXMgZGUgclx1MDBmNGxlcw0KLXJvbGVTZXRHcm91cGluZ190ZXh0X3BsdXJhbD1SZWdyb3VwZW1lbnRzIGQnZW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMNCi1zdGFuZGFyZENhdGVnb3J5X3RleHRfcGx1cmFsPUNhdFx1MDBlOWdvcmllcyBzdGFuZGFyZA0KLXN0ZXBfdGV4dF9wbHVyYWw9RXRhcGVzDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHRfcGx1cmFsPURvY3VtZW50cyBkJ2FjY29tcGFnbmVtZW50DQotdGFza190ZXh0X3BsdXJhbD1UXHUwMGUyY2hlcw0KLXRhc2tEZXNjcmlwdG9yX3RleHRfcGx1cmFsPURlc2NyaXB0ZXVycyBkZSB0XHUwMGUyY2hlcw0KLXRlYW1Qcm9maWxlX3RleHRfcGx1cmFsPVByb2ZpbHMgZGUgbCdcdTAwZTlxdWlwZQ0KLXRlbXBsYXRlX3RleHRfcGx1cmFsPUNhbmV2YXMNCi10ZXJtRGVmaW5pdGlvbl90ZXh0X3BsdXJhbD1EXHUwMGU5ZmluaXRpb25zIGRlIHRlcm1lcw0KLXRvb2xfdGV4dF9wbHVyYWw9T3V0aWxzDQotdG9vbE1lbnRvcl90ZXh0X3BsdXJhbD1HdWlkZXMgZCd1dGlsaXNhdGlvbiBkZSBsJ291dGlsDQotd2hpdGVwYXBlcl90ZXh0X3BsdXJhbD1MaXZyZXMgYmxhbmNzDQotd29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw9UHJvZHVpdHMNCi13b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw9RGVzY3JpcHRldXJzIGRlIHByb2R1aXRzDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHRfcGx1cmFsPUVsXHUwMGU5bWVudHMgZGUgcHJvZHVpdA0KLXdvcmtQcm9kdWN0VHlwZV90ZXh0X3BsdXJhbD1UeXBlcyBkZSBwcm9kdWl0cw0KLQ0KLSMgQXBwbGljYXRpb24gdGl0bGUuDQotYXBwbGljYXRpb25fdGl0bGU9ezB9IC0gezF9DQotDQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlPU91dnJpciB1bmUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcw0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90aXRsZT1TXHUwMGU5bGVjdGlvbm5lciB1bmUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcw0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90ZXh0PXswfSBzdG9ja2UgbGVzIG1cdTAwZTl0aG9kZXMgZXQgbGVzIHByb2Nlc3N1cyBkYW5zIHVuIGRvc3NpZXIgZFx1MDBlOW5vbW1cdTAwZTkgXG5iaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzLiBTXHUwMGU5bGVjdGlvbm5leiBsZSBkb3NzaWVyIGRlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgXHUwMGUwIHV0aWxpc2VyIHBvdXIgY2V0dGUgc2Vzc2lvbi4NCi1saWJyYXJ5TGFiZWxfdGV4dD1CaWJsaW90aFx1MDBlOHF1ZSA6DQotYnJvd3NlQnV0dG9uX3RleHQ9UGFyY291cmlyLi4uDQotcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94X3RleHQ9VXRpbGlzZXotbGUgcGFyIGRcdTAwZTlmYXV0IGV0IG5lIHBsdXMgcmVwb3NlciBsYSBxdWVzdGlvbi4NCi1vcGVuTGlicmFyeURpYWxvZ19uZXdMaWJyYXJ5X3RleHQ9QXVjdW5lIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZGFucyAnJ3swfScnLlxuVW5lIG5vdXZlbGxlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgc2VyYSBjclx1MDBlOVx1MDBlOWUgZXQgb3V2ZXJ0ZSBhdXRvbWF0aXF1ZW1lbnQgZGFucyBsZSByXHUwMGU5cGVydG9pcmUgaW5kaXF1XHUwMGU5LlxuXG5DbGlxdWV6IHN1ciBPSyBwb3VyIGNvbnRpbnVlciBvdSBzdXIgQW5udWxlciBwb3VyIGluZGlxdWVyIHVuIGF1dHJlIGNoZW1pbiBkZSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzLg0KLQ0KLSMgU2VsZWN0IE1ldGhvZCBMaWJyYXJ5IEZvbGRlciBEaWFsb2cNCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlPVNcdTAwZTlsZWN0aW9ubmVyIHVuZSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzDQotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0PVNcdTAwZTlsZWN0aW9ubmV6IHVuIGRvc3NpZXIgZGUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy4NCi0NCi0jIE9wZW4gTGlicmFyeSBQcm9ncmVzcyBNZXNzYWdlDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9T3V2ZXJ0dXJlIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMuLi4NCi0NCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRXJyb3IgRGlhbG9nDQotaW52YWxpZExpYnJhcnlQYXRoX21zZz1JVVBMMDMwMEUgOiBJbXBvc3NpYmxlIGQnb3V2cmlyIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgc3BcdTAwZTljaWZpXHUwMGU5ZS4NCi1pbnZhbGlkTGlicmFyeVBhdGhfcmVhc29uPUxlIGRvc3NpZXIgZGUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBzXHUwMGU5bGVjdGlvbm5cdTAwZTkgZXN0IG5vbiB2YWxpZGUsIG4nZXhpc3RlIHBhcyBvdSB2b3VzIG4nXHUwMGVhdGVzIHBhcyBhdXRvcmlzXHUwMGU5IFx1MDBlMCB5IGFjY1x1MDBlOWRlci5cblxuQ2xpcXVleiBzdXIgT0sgcG91ciBzXHUwMGU5bGVjdGlvbm5lciB1biBhdXRyZSBkb3NzaWVyIGRlIGJpYmxpb3RoXHUwMGU4cXVlLg0KLQ0KLSMgTGlicmFyeSBMb2NrZWQgRXJyb3IgRGlhbG9nDQotbGlicmFyeUxvY2tlZF9tc2c9SVVQTDAzMDNFIDogSW1wb3NzaWJsZSBkJ291dnJpciBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIHNwXHUwMGU5Y2lmaVx1MDBlOWUuXG5cbkxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZSBzZW1ibGUgXHUwMGVhdHJlIGVuIGNvdXJzIGQndXRpbGlzYXRpb24uIENsaXF1ZXogc3VyIEFubnVsZXIgcG91ciBzXHUwMGU5bGVjdGlvbm5lciB1biBhdXRyZSByXHUwMGU5cGVydG9pcmUgZGUgYmlibGlvdGhcdTAwZThxdWUgb3UgY2xpcXVleiBzdXIgRm9yY2VyIGwnb3V2ZXJ0dXJlIHNpIHZvdXMgc291aGFpdGV6IGVuY29yZSBvdXZyaXIgbGEgYmlibGlvdGhcdTAwZThxdWUuXG5cbkFWRVJUSVNTRU1FTlQgOiBMJ3V0aWxpc2F0aW9uIHNpbXVsdGFuXHUwMGU5ZSBkJ3VuZSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIHBldXQgZW5kb21tYWdlciBjZXR0ZSBkZXJuaVx1MDBlOHJlLg0KLWxpYnJhcnlMb2NrZWRfb3BlbkJ1dHRvbl90ZXh0PUZvcmNlciBsJ291dmVydHVyZQ0KLQ0KLSMgUmVhZC1vbmx5IFByb2plY3QgRmlsZSBFcnJvciBEaWFsb2cNCi1yZWFkT25seVByb2plY3RGaWxlX3RleHQ9SVVQTDAzMDJFIDogJyd7MH0nJyBlc3QgZW4gbGVjdHVyZSBzZXVsZW1lbnQuIEF2YW50IGRlIGNvbnRpbnVlciwgZmFpdGVzIGVuIHNvcnRlIHF1JydpbCBzb2l0IG1vZGlmaWFibGUuDQotcmV0cnlCdXR0b25fdGV4dD1SXHUwMGU5ZXNzYXllcg0KLWNhbmNlbEJ1dHRvbl90ZXh0PUFubnVsZXINCi0NCi0jIFZlcnNpb24gTWlzbWF0Y2ggRGlhbG9nDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHQ9SVVQTDMwNUUgOiBJbXBvc3NpYmxlIGQnJ291dnJpciBsYSBiaWJsaW90aFx1MDBlOHF1ZSBzXHUwMGU5bGVjdGlvbm5cdTAwZTllLiBWb3VzIGRldmV6IGVmZmVjdHVlciB1bmUgbWlzZSBcdTAwZTAgbml2ZWF1IGRlIHswfSB2ZXJzIGxhIHZlcnNpb24gezF9IG91IHN1cFx1MDBlOXJpZXVyZSBhZmluIGQnJ291dnJpciBjZXR0ZSBiaWJsaW90aFx1MDBlOHF1ZS4NCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duPUlVUEwzMDZFOiBJbXBvc3NpYmxlIGQnJ291dnJpciBsYSBiaWJsaW90aFx1MDBlOHF1ZSBzXHUwMGU5bGVjdGlvbm5cdTAwZTllLiBWb3VzIGRldmV6IGVmZmVjdHVlciB1bmUgbWlzZSBcdTAwZTAgbml2ZWF1IGRlIGxhIHZlcnNpb24gezB9IFx1MDBlMCB1bmUgdmVyc2lvbiBzdXBcdTAwZTlyaWV1cmUgYWZpbiBkJydvdXZyaXIgY2V0dGUgYmlibGlvdGhcdTAwZThxdWUuDQotDQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPU1ldHRyZSBcdTAwZTAgbml2ZWF1IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMNCi11cGdyYWRlTGlicmFyeURpYWxvZ190ZXh0PUxhIGJpYmxpb3RoXHUwMGU4cXVlIHF1ZSB2b3VzIGF2ZXogc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZSBkb2l0IFx1MDBlYXRyZSBtaXNlIFx1MDBlMCBuaXZlYXUgdmVycyBsYSBub3V2ZWxsZSBzdHJ1Y3R1cmUgZGUgYmlibGlvdGhcdTAwZThxdWUuXG5cblZvdWxlei12b3VzIGVmZmVjdHVlciBsYSBtaXNlIFx1MDBlMCBuaXZlYXUgPw0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9TWlzZSBcdTAwZTAgbml2ZWF1IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMuLi4NCi0NCi0jIFVwZ3JhZGUgTGlicmFyeSBFcnJvciBEaWFsb2cNCi11cGdyYWRlTGlicmFyeUVycm9yX21zZz1JVVBMMDMwMUUgOiBFY2hlYyBkZSBsYSBtaXNlIFx1MDBlMCBuaXZlYXUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy4gQ29uc3VsdGV6IGxlIGZpY2hpZXIgam91cm5hbCBwb3VyIHBsdXMgZGUgZFx1MDBlOXRhaWxzLg0KLQ0KLSMgU3dpdGNoIENvbmZpZ3VyYXRpb24gRGlhbG9nDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlPUNoYW5nZXIgbGEgY29uZmlndXJhdGlvbg0KLXN3aXRjaENvbmZpZ0RpYWxvZ190ZXh0PVZvdWxlei12b3VzIGNoYW5nZXIgbGEgY29uZmlndXJhdGlvbiBlbiBjb3VycyBhdSBwcm9maXQgZGUgbGEgY29uZmlndXJhdGlvbiBwYXIgZFx1MDBlOWZhdXQsICcnezB9JycsIGFzc29jaVx1MDBlOWUgYXUgcHJvY2Vzc3VzIHNcdTAwZTlsZWN0aW9ublx1MDBlOSA/DQotCQ0KLSMgQ29uZmlndXJhdGlvbiBDb21ibw0KLWN1cnJlbnRDb25maWdMYWJlbF90ZXh0PUNvbmZpZ3VyYXRpb24gZW4gY291cnMgOg0KLXNlbGVjdENvbmZpZ0xhYmVsX3RleHQ9U1x1MDBlOWxlY3Rpb25uZXogdW5lIGNvbmZpZ3VyYXRpb24NCi0NCi0jIERlbGV0ZSBGaWxlcyBDb25maXJtYXRpb24gTWVzc2FnZQ0KLWRlbGV0ZUZpbGVzQ29uZmlybWF0aW9uX21zZz1MZSBjaGVtaW4gc3BcdTAwZTljaWZpXHUwMGU5ICcnezB9JycgZXhpc3RlIGRcdTAwZTlqXHUwMGUwLiBUb3VzIGxlcyBmaWNoaWVycyBkdSBkb3NzaWVyIHNlcm9udCBzdXBwcmltXHUwMGU5cy4gVm91bGV6LXZvdXMgY29udGludWVyID8NCi0NCi0jIFBhdGhzL0ZpbGVzIEVycm9yIE1lc3NhZ2VzDQotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249TGUgY2hlbWluICcnezB9JycgY29udGllbnQgdW4gb3UgcGx1c2lldXJzIGZpY2hpZXJzIHF1aSBuZSBwZXV2ZW50IHBhcyBcdTAwZWF0cmUgc3VwcHJpbVx1MDBlOXMuXG5cblNcdTAwZTlsZWN0aW9ubmV6IHVuIGF1dHJlIGNoZW1pbiBldCByXHUwMGU5ZXNzYXllei4NCi1jcmVhdGVQYXRoRXJyb3JfcmVhc29uPUltcG9zc2libGUgZGUgY3JcdTAwZTllciBsZSBjaGVtaW4gJyd7MH0nJy5cblxuU1x1MDBlOWxlY3Rpb25uZXogdW4gYXV0cmUgY2hlbWluIGV0IHJcdTAwZTllc3NheWV6Lg0KLWludmFsaWRQYXRoX21zZz1MZSBjaGVtaW4gc3BcdTAwZTljaWZpXHUwMGU5IGVzdCBub24gdmFsaWRlLg0KLQ0KLSMgQmFja3VwIExpYnJhcnkgRGlhbG9nDQotYmFja3VwTGlicmFyeURpYWxvZ190aXRsZT1TYXV2ZWdhcmRlciBsYSBiaWJsaW90aFx1MDBlOHF1ZQ0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dD1JbCBlc3QgZm9ydGVtZW50IGNvbnNlaWxsXHUwMGU5IGRlIHNhdXZlZ2FyZGVyIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZW4gY291cnMgYXZhbnQgZGUgcG91cnN1aXZyZS5cblxuQ2xpcXVleiBzdXIgT0sgcG91ciBjclx1MDBlOWVyIHVuZSBjb3BpZSBkZSBzYXV2ZWdhcmRlIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRhbnMgbGUgclx1MDBlOXBlcnRvaXJlIHNwXHUwMGU5Y2lmaVx1MDBlOS4gQ2xpcXVleiBzdXIgSWdub3JlciBwb3VyIGNvbnRpbnVlciBzYW5zIGNyXHUwMGU5ZXIgbGEgc2F1dmVnYXJkZS4NCi1iYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lPUNyXHUwMGU5YXRpb24gZCd1bmUgY29waWUgZGUgc2F1dmVnYXJkZSBkZXMgZmljaGllcnMgZGUgYmlibGlvdGhcdTAwZThxdWUuLi4NCi0NCi0jIFBhdGggU2VsZWN0aW9uIERpYWxvZw0KLXBhdGhTZWxlY3Rpb25FcnJvcl9tc2c9SW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIGxlIHJcdTAwZTlwZXJ0b2lyZQ0KLW9rQnV0dG9uX3RleHQ9T0sNCi1za2lwQnV0dG9uX3RleHQ9SWdub3Jlcg0KLQ0KLSMgUHJvY2VzcyBFZGl0b3IgcHJlZmVyZW5jZXMNCi1hbHdheXNCdXR0b25fdGV4dD1Ub3Vqb3Vycw0KLW5ldmVyQnV0dG9uX3RleHQ9SmFtYWlzDQotcHJvbXB0QnV0dG9uX3RleHQ9RGVtYW5kZXINCi0NCi0jIEFkZCBMaW5rIERpYWxvZw0KLWxpbmtUb1VSTF9uYW1lPVVSTA0KLWxpbmtUb0ZpbGVfbmFtZT1GaWNoaWVyDQotZWxlbWVudExpbmtfbmFtZT1FbFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlDQotZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lPUVsXHUwMGU5bWVudCBkZSBtXHUwMGU5dGhvZGUgYXZlYyBwclx1MDBlOWZpeGUgZGUgdHlwZQ0KLWVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0X25hbWU9RWxcdTAwZTltZW50IGRlIG1cdTAwZTl0aG9kZSBhdmVjIHRleHRlIHBlcnNvbm5hbGlzXHUwMGU5DQotDQotIyBDb252ZXJ0IEFjdGl2aXR5IFR5cGUgRGlhbG9nDQotY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlPUNvbnZlcnRpciBsZSB0eXBlIGQnYWN0aXZpdFx1MDBlOQ0KLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0PVNcdTAwZTlsZWN0aW9ubmVyIGxlIHR5cGUgZCdhY3Rpdml0XHUwMGU5IGNpYmxlLg0KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX21zZz1JVVBMMDMwNEUgOiBDZXR0ZSBhY3Rpdml0XHUwMGU5IG5lIHBldXQgcGFzIFx1MDBlYXRyZSBjb252ZXJ0aWUgZGFucyB1biBhdXRyZSB0eXBlLg0KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX3JlYXNvbj1BdWN1biB0eXBlIGQnJ2FjdGl2aXRcdTAwZTkgbicnZXN0IGNvbXBhdGlibGUgcG91ciB7MH0uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZjA4NjQwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChTaW5ndWxhcikNCi1hY3Rpdml0eV90ZXh0PUF0dGl2aXRcdTAwZTANCi1hcnRpZmFjdF90ZXh0PUFydGVmYXR0bw0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9TW9kZWxsbyBkaSBjYXBhY2l0XHUwMGUwDQotY2hlY2tsaXN0X3RleHQ9RWxlbmNvIGRpIGNvbnRyb2xsbw0KLWNoZWNrSXRlbV90ZXh0PVZvY2UgZWxlbmNvIGRpIGNvbnRyb2xsbw0KLWNvbXBvc2l0ZVJvbGVfdGV4dD1SdW9sbyBjb21wb3NpdG8NCi1jb25jZXB0X3RleHQ9Q29uY2V0dG8NCi1jb250ZW50UGFja2FnZV90ZXh0PVBhY2NoZXR0byBkZWwgY29udGVudXRvDQotY3VzdG9tQ2F0ZWdvcnlfdGV4dD1DYXRlZ29yaWEgcGVyc29uYWxpenphdGENCi1kZWxpdmVyYWJsZV90ZXh0PUNvbXBvbmVudGUgZGlzdHJpYnVpYmlsZQ0KLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0PVByb2Nlc3NvIGRpIHByb2R1emlvbmUNCi1kZXNjcmlwdG9yX3RleHQ9RGVzY3JpdHRvcmUNCi1kaXNjaXBsaW5lX3RleHQ9RGlzY2lwbGluYQ0KLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0PVJhZ2dydXBwYW1lbnRvIGRpc2NpcGxpbmUNCi1kb21haW5fdGV4dD1Eb21pbmlvDQotZXN0aW1hdGVfdGV4dD1WYWx1dGF6aW9uZQ0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dD1NZXRyaWNhIGRpIHZhbHV0YXppb25lDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9Q29uc2lkZXJhemlvbmkgc3VsbGEgdmFsdXRhemlvbmUNCi1leGFtcGxlX3RleHQ9RXNlbXBpbw0KLWd1aWRhbmNlX3RleHQ9R3VpZGENCi1ndWlkZWxpbmVfdGV4dD1MaW5lYSBndWlkYQ0KLWl0ZXJhdGlvbl90ZXh0PUl0ZXJhemlvbmUNCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHQ9Q29uZmlndXJhemlvbmUgZGkgbWV0b2RvDQotbWV0aG9kQ29udGVudF90ZXh0PUNvbnRlbnV0byBkaSBtZXRvZG8NCi1tZXRob2RMaWJyYXJ5X3RleHQ9TGlicmVyaWEgZGVpIG1ldG9kaQ0KLW1ldGhvZFBhY2thZ2VfdGV4dD1QYWNjaGV0dG8gZGkgbWV0b2RvDQotbWV0aG9kUGx1Z2luX3RleHQ9UGx1Zy1pbiBkaSBtZXRvZG8NCi1taWxlc3RvbmVfdGV4dD1NaWxlc3RvbmUNCi1vdXRjb21lX3RleHQ9UmlzdWx0YXRvDQotcGhhc2VfdGV4dD1GYXNlDQotcHJhY3RpY2VfdGV4dD1Qcm9jZWR1cmENCi1wcm9jZXNzX3RleHQ9UHJvY2Vzc28NCi1wcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9UHJvY2Vzc28gZGlmZmVyZW56aWFsZQ0KLXByb2Nlc3NGYW1pbHlfdGV4dD1GYW1pZ2xpYSBwcm9jZXNzbw0KLXByb2Nlc3NQYWNrYWdlX3RleHQ9UGFjY2hldHRvIHByb2Nlc3NvDQotcmVwb3J0X3RleHQ9UmVwb3J0DQotcmV1c2FibGVBc3NldF90ZXh0PVJpc29yc2Egcml1dGlsaXp6YWJpbGUNCi1yb2FkbWFwX3RleHQ9Um9hZG1hcA0KLXJvbGVEZXNjcmlwdG9yX3RleHQ9RGVzY3JpdHRvcmUgZGkgcnVvbGkNCi1yb2xlX3RleHQ9UnVvbG8NCi1yb2xlU2V0X3RleHQ9SW5zaWVtZSBkaSBydW9saQ0KLXJvbGVTZXRHcm91cGluZ190ZXh0PVJhZ2dydXBwYW1lbnRvIGluc2llbWkgZGkgcnVvbGkNCi1zdGFuZGFyZENhdGVnb3J5X3RleHQ9Q2F0ZWdvcmlhIHN0YW5kYXJkDQotc3RlcF90ZXh0PVBhc3NvDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9TWF0ZXJpYWxlIGRpIHN1cHBvcnRvDQotdGFza190ZXh0PU9wZXJhemlvbmUNCi10YXNrRGVzY3JpcHRvcl90ZXh0PURlc2NyaXR0b3JlIGRpIG9wZXJhemlvbmkNCi10ZWFtUHJvZmlsZV90ZXh0PVByb2ZpbG8gdGVhbQ0KLXRlbXBsYXRlX3RleHQ9TW9kZWxsbw0KLXRlcm1EZWZpbml0aW9uX3RleHQ9RGVmaW5pemlvbmUgdGVybWluZQ0KLXRvb2xfdGV4dD1Ub29sDQotdG9vbE1lbnRvcl90ZXh0PUd1aWRhIGFsIHRvb2wNCi13aGl0ZXBhcGVyX3RleHQ9V2hpdGVwYXBlcg0KLXdvcmtQcm9kdWN0X3RleHQ9UHJvZG90dG8gZGkgbGF2b3JvDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9RGVzY3JpdHRvcmUgZGkgcHJvZG90dGkgZGkgbGF2b3JvDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHQ9RWxlbWVudG8gcHJvZG90dG8gZGkgbGF2b3JvDQotd29ya1Byb2R1Y3RUeXBlX3RleHQ9VGlwbyBkaSBwcm9kb3R0byBkaSBsYXZvcm8NCi0NCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChQbHVyYWwpDQotYWN0aXZpdHlfdGV4dF9wbHVyYWw9QXR0aXZpdFx1MDBlMA0KLWFydGlmYWN0X3RleHRfcGx1cmFsPUFydGVmYXR0aQ0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsPU1vZGVsbGkgZGkgY2FwYWNpdFx1MDBlMA0KLWNoZWNrbGlzdF90ZXh0X3BsdXJhbD1FbGVuY2hpIGRpIGNvbnRyb2xsbw0KLWNoZWNrSXRlbV90ZXh0X3BsdXJhbD1Wb2NpIGVsZW5jaGkgZGkgb3BlcmF6aW9uaQ0KLWNvbXBvc2l0ZVJvbGVfdGV4dF9wbHVyYWw9UnVvbGkgY29tcG9zaXRpDQotY29uY2VwdF90ZXh0X3BsdXJhbD1Db25jZXR0aQ0KLWNvbnRlbnRQYWNrYWdlX3RleHRfcGx1cmFsPVBhY2NoZXR0aSBkZWwgY29udGVudXRvDQotY3VzdG9tQ2F0ZWdvcnlfdGV4dF9wbHVyYWw9Q2F0ZWdvcmllIHBlcnNvbmFsaXp6YXRlDQotZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw9Q29tcG9uZW50aSBkaXN0cmlidWliaWxpDQotZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsPVByb2Nlc3NpIGRpIHByb2R1emlvbmUNCi1kZXNjcmlwdG9yX3RleHRfcGx1cmFsPURlc2NyaXR0b3JpDQotZGlzY2lwbGluZV90ZXh0X3BsdXJhbD1EaXNjaXBsaW5lDQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHRfcGx1cmFsPVJhZ2dydXBwYW1lbnRpIGRpc2NpcGxpbmUNCi1kb21haW5fdGV4dF9wbHVyYWw9RG9taW5pDQotZXN0aW1hdGVfdGV4dF9wbHVyYWw9VmFsdXRhemlvbmkNCi1lc3RpbWF0aW5nTWV0cmljX3RleHRfcGx1cmFsPU1ldHJpY2hlIGRpIHZhbHV0YXppb25lDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHRfcGx1cmFsPUNvbnNpZGVyYXppb25pIHN1bGxhIHZhbHV0YXppb25lDQotZXhhbXBsZV90ZXh0X3BsdXJhbD1Fc2VtcGkNCi1ndWlkYW5jZV90ZXh0X3BsdXJhbD1HdWlkZQ0KLWd1aWRlbGluZV90ZXh0X3BsdXJhbD1MaW5lZSBndWlkYQ0KLWl0ZXJhdGlvbl90ZXh0X3BsdXJhbD1JdGVyYXppb25pDQotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0X3BsdXJhbD1Db25maWd1cmF6aW9uaSBkaSBtZXRvZG8NCi1tZXRob2RDb250ZW50X3RleHRfcGx1cmFsPUNvbnRlbnV0aSBkaSBtZXRvZG8NCi1tZXRob2RMaWJyYXJ5X3RleHRfcGx1cmFsPUxpYnJlcmllIGRlaSBtZXRvZGkNCi1tZXRob2RQYWNrYWdlX3RleHRfcGx1cmFsPVBhY2NoZXR0aSBtZXRvZG8NCi1tZXRob2RQbHVnaW5fdGV4dF9wbHVyYWw9UGx1Zy1pbiBkZWwgbWV0b2RvDQotbWlsZXN0b25lX3RleHRfcGx1cmFsPU1pbGVzdG9uZQ0KLW91dGNvbWVfdGV4dF9wbHVyYWw9UmlzdWx0YXRpDQotcGhhc2VfdGV4dF9wbHVyYWw9RmFzaQ0KLXByYWN0aWNlX3RleHRfcGx1cmFsPVByYXRpY2hlDQotcHJvY2Vzc190ZXh0X3BsdXJhbD1Qcm9jZXNzaQ0KLXByb2Nlc3NDb250cmlidXRpb25fdGV4dF9wbHVyYWw9UHJvY2Vzc2kgZGlmZmVyZW56aWFsaQ0KLXByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw9RmFtaWdsaWUgcHJvY2Vzc2kNCi1wcm9jZXNzUGFja2FnZV90ZXh0X3BsdXJhbD1QYWNjaGV0dGkgcHJvY2Vzc28NCi1yZXBvcnRfdGV4dF9wbHVyYWw9UmVwb3J0DQotcmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbD1SaXNvcnNlIHJpdXRpbGl6emFiaWxpDQotcm9hZG1hcF90ZXh0X3BsdXJhbD1Sb2FkbWFwDQotcm9sZURlc2NyaXB0b3JfdGV4dF9wbHVyYWw9RGVzY3JpdHRvcmkgZGkgcnVvbGkNCi1yb2xlX3RleHRfcGx1cmFsPVJ1b2xpDQotcm9sZVNldF90ZXh0X3BsdXJhbD1JbnNpZW1pIGRpIHJ1b2xpDQotcm9sZVNldEdyb3VwaW5nX3RleHRfcGx1cmFsPVJhZ2dydXBwYW1lbnRpIGluc2llbWkgZGkgcnVvbGkNCi1zdGFuZGFyZENhdGVnb3J5X3RleHRfcGx1cmFsPUNhdGVnb3JpZSBzdGFuZGFyZA0KLXN0ZXBfdGV4dF9wbHVyYWw9UGFzc2kNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dF9wbHVyYWw9TWF0ZXJpYWxlIGRpIHN1cHBvcnRvDQotdGFza190ZXh0X3BsdXJhbD1PcGVyYXppb25pDQotdGFza0Rlc2NyaXB0b3JfdGV4dF9wbHVyYWw9RGVzY3JpdHRvcmkgZGkgb3BlcmF6aW9uaQ0KLXRlYW1Qcm9maWxlX3RleHRfcGx1cmFsPVByb2ZpbGkgdGVhbQ0KLXRlbXBsYXRlX3RleHRfcGx1cmFsPU1vZGVsbGkNCi10ZXJtRGVmaW5pdGlvbl90ZXh0X3BsdXJhbD1EZWZpbml6aW9uaSB0ZXJtaW5pDQotdG9vbF90ZXh0X3BsdXJhbD1Ub29sDQotdG9vbE1lbnRvcl90ZXh0X3BsdXJhbD1HdWlkYSBhbCB0b29sDQotd2hpdGVwYXBlcl90ZXh0X3BsdXJhbD1XaGl0ZXBhcGVyDQotd29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw9UHJvZG90dGkgZGkgbGF2b3JvDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHRfcGx1cmFsPURlc2NyaXR0b3JpIGRpIHByb2RvdHRpIGRpIGxhdm9ybw0KLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0X3BsdXJhbD1FbGVtZW50aSBwcm9kb3R0byBkaSBsYXZvcm8NCi13b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw9VGlwaSBkaSBwcm9kb3R0byBkaSBsYXZvcm8NCi0NCi0jIEFwcGxpY2F0aW9uIHRpdGxlLg0KLWFwcGxpY2F0aW9uX3RpdGxlPXswfSAtIHsxfQ0KLQ0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1BcHJpIGxpYnJlcmlhIGRlaSBtZXRvZGkNCi1vcGVuTGlicmFyeURpYWxvZ0FyZWFfdGl0bGU9U2VsZXppb25hIGxpYnJlcmlhIGRlaSBtZXRvZGkNCi1vcGVuTGlicmFyeURpYWxvZ0FyZWFfdGV4dD17MH0gbWVtb3JpenphIG1ldG9kaSBlIHByb2Nlc3NpIGluIHVuYSBjYXJ0ZWxsYSBjaGlhbWF0YSBcbmxpYnJlcmlhIGRlaSBtZXRvZGkuIFNlbGV6aW9uYXJlIHVuYSBjYXJ0ZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIHBlciBxdWVzdGEgc2Vzc2lvbmUuDQotbGlicmFyeUxhYmVsX3RleHQ9TGlicmVyaWE6DQotYnJvd3NlQnV0dG9uX3RleHQ9U2ZvZ2xpYS4uLg0KLXByb21wdEZvckxpYnJhcnlDaGVja2JveF90ZXh0PVV0aWxpenphIHF1ZXN0YSBjb21lIHByZWRlZmluaXRhIGUgbm9uIHZpc3VhbGl6emFyZSBwaVx1MDBmOSBxdWVzdG8gbWVzc2FnZ2lvLg0KLW9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dD1Ob24gZXNpc3RlIGFsY3VuYSBsaWJyZXJpYSBkaSBtZXRvZGkgaW4gJyd7MH0nJy5cblVuYSBudW92YSBsaWJyZXJpYSBkZWkgbWV0b2RpIHZlcnJcdTAwZTAgY3JlYXRhIGUgYXBlcnRhIG5lbGxhIGRpcmVjdG9yeSBzcGVjaWZpY2F0YS5cblxuRmFyZSBjbGljIHN1IE9LIHBlciBwcm9jZWRlcmUgb3BwdXJlIEFubnVsbGEgcGVyIHNwZWNpZmljYXJlIHVuIGFsdHJvIHBlcmNvcnNvIGRlbGxhIGxpYnJlcmlhIGRlaSBtZXRvZGkuDQotDQotIyBTZWxlY3QgTWV0aG9kIExpYnJhcnkgRm9sZGVyIERpYWxvZw0KLXNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGl0bGU9U2VsZXppb25hIGxpYnJlcmlhIGRlaSBtZXRvZGkNCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RleHQ9U2VsZXppb25hcmUgdW5hIGNhcnRlbGxhIGxpYnJlcmlhIGRlaSBtZXRvZGkuDQotDQotIyBPcGVuIExpYnJhcnkgUHJvZ3Jlc3MgTWVzc2FnZQ0KLW9wZW5pbmdMaWJyYXJ5VGFza19uYW1lPUFwZXJ0dXJhIGRlbGxhIGxpYnJlcmlhIGRlaSBtZXRvZGkgaW4gY29yc28uLi4NCi0NCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRXJyb3IgRGlhbG9nDQotaW52YWxpZExpYnJhcnlQYXRoX21zZz1JVVBMMDMwMEU6IEltcG9zc2liaWxlIGFwcmlyZSBsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIHNwZWNpZmljYXRhLg0KLWludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb249TGEgY2FydGVsbGEgZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBzZWxlemlvbmF0YSBub24gXHUwMGU4IHZhbGlkYSwgbm9uIGVzaXN0ZSBvcHB1cmUgbm9uIHNpIGRpc3BvbmUgZGVsbGUgYXV0b3JpenphemlvbmkgYXBwcm9wcmlhdGUgcGVyIGFjY2VkZXJ2aS5cblxuRmFyZSBjbGljIHN1IE9LIHBlciBzZWxlemlvbmFyZSB1bidhbHRyYSBjYXJ0ZWxsYSBkaSBsaWJyZXJpYSBkZWkgbWV0b2RpLg0KLQ0KLSMgTGlicmFyeSBMb2NrZWQgRXJyb3IgRGlhbG9nDQotbGlicmFyeUxvY2tlZF9tc2c9SVVQTDAzMDNFOiBJbXBvc3NpYmlsZSBhcHJpcmUgbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBzcGVjaWZpY2F0YS5cblxuTGEgbGlicmVyaWEgZGVpIG1ldG9kaSBzZWxlemlvbmF0YSBcdTAwZTggaW4gdXNvLiBGYXJlIGNsaWMgc3UgQW5udWxsYSBwZXIgc2VsZXppb25hcmUgdW4nYWx0cmEgY2FydGVsbGEgbGlicmVyaWEgbyBmYXJlIGNsaWMgc3UgRm9yemEgYXBlcnR1cmEgcGVyIGFwcmlyZSBjb211bnF1ZSBsYSBsaWJyZXJpYS5cblxuQVZWSVNPOiBsJ3VzbyBzaW11bHRhbmVvIGRpIHVuYSBsaWJyZXJpYSBkZWkgbWV0b2RpIHBvdHJlYmJlIGRhbm5lZ2dpYXJlIHF1ZWxsYSBsaWJyZXJpYS4NCi1saWJyYXJ5TG9ja2VkX29wZW5CdXR0b25fdGV4dD1Gb3J6YSBhcGVydHVyYQ0KLQ0KLSMgUmVhZC1vbmx5IFByb2plY3QgRmlsZSBFcnJvciBEaWFsb2cNCi1yZWFkT25seVByb2plY3RGaWxlX3RleHQ9SVVQTDAzMDJFOiAnJ3swfScnIFx1MDBlOCBkaSBzb2xhIGxldHR1cmEuIFBlciBjb250aW51YXJlLCBcdTAwZTggbmVjZXNzYXJpbyByZW5kZXJsbyBzY3JpdmliaWxlLg0KLXJldHJ5QnV0dG9uX3RleHQ9Umlwcm92YQ0KLWNhbmNlbEJ1dHRvbl90ZXh0PUFubnVsbGENCi0NCi0jIFZlcnNpb24gTWlzbWF0Y2ggRGlhbG9nDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHQ9SVVQTDMwNUU6IGltcG9zc2liaWxlIGFwcmlyZSBsYSBsaWJyZXJpYSBzZWxlemlvbmF0YS4gXHUwMGM4IG5lY2Vzc2FyaW8gYWdnaW9ybmFyZSB7MH0gYSB1bmEgdmVyc2lvbmUgezF9IG8gc3VwZXJpb3JlIHBlciBhcHJpcmUgcXVlc3RhIGxpYnJlcmlhLg0KLXZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0X3Vua25vd249SVVQTDMwNkU6IGltcG9zc2liaWxlIGFwcmlyZSBsYSBsaWJyZXJpYSBzZWxlemlvbmF0YS4gXHUwMGM4IG5lY2Vzc2FyaW8gYWdnaW9ybmFyZSB7MH0gYSB1bmEgdmVyc2lvbmUgc3VwZXJpb3JlIHBlciBwb3RlciBhcHJpcmUgcXVlc3RhIGxpYnJlcmlhLg0KLQ0KLSMgVXBncmFkZSBNZXRob2QgTGlicmFyeSBEaWFsb2cNCi11cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZT1BZ2dpb3JuYSBsaWJyZXJpYSBkZWkgbWV0b2RpDQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dD1MYSBsaWJyZXJpYSBzZWxlemlvbmF0YSBkZXZlIGVzc2VyZSBhZ2dpb3JuYXRhIGFsbGEgbnVvdmEgc3RydXR0dXJhIGRpIGxpYnJlcmlhLlxuXG5Db250aW51YXJlIGwnYWdnaW9ybmFtZW50bz8NCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPUFnZ2lvcm5hbWVudG8gZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBpbiBjb3Jzby4uLg0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEwwMzAxRTogSW1wb3NzaWJpbGUgYWdnaW9ybmFyZSBsYSBsaWJyZXJpYSBkZWkgbWV0b2RpLiBDb250cm9sbGFyZSBpbCBmaWxlIGRpIGxvZyBwZXIgdWx0ZXJpb3JpIGRldHRhZ2xpLg0KLQ0KLSMgU3dpdGNoIENvbmZpZ3VyYXRpb24gRGlhbG9nDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlPUNhbWJpYSBjb25maWd1cmF6aW9uZQ0KLXN3aXRjaENvbmZpZ0RpYWxvZ190ZXh0PVBhc3NhcmUgZGFsbGEgY29uZmlndXJhemlvbmUgY29ycmVudGUgYSBxdWVsbGEgcHJlZGVmaW5pdGEsICcnezB9JycsIGFzc29jaWF0YSBhbCBwcm9jZXNzbyBzZWxlemlvbmF0bz8NCi0JDQotIyBDb25maWd1cmF0aW9uIENvbWJvDQotY3VycmVudENvbmZpZ0xhYmVsX3RleHQ9Q29uZmlndXJhemlvbmUgY29ycmVudGU6DQotc2VsZWN0Q29uZmlnTGFiZWxfdGV4dD1TZWxlemlvbmEgY29uZmlndXJhemlvbmUNCi0NCi0jIERlbGV0ZSBGaWxlcyBDb25maXJtYXRpb24gTWVzc2FnZQ0KLWRlbGV0ZUZpbGVzQ29uZmlybWF0aW9uX21zZz1JbCBwZXJjb3JzbyBzcGVjaWZpY2F0byAnJ3swfScnIGVzaXN0ZSBnaVx1MDBlMC4gVHV0dGkgaSBmaWxlIG5lbGxhIGNhcnRlbGxhIHZlcnJhbm5vIGVsaW1pbmF0aS4gUHJvY2VkZXJlPw0KLQ0KLSMgUGF0aHMvRmlsZXMgRXJyb3IgTWVzc2FnZXMNCi1kZWxldGVGaWxlc0Vycm9yX3JlYXNvbj1JbCBwZXJjb3JzbyAnJ3swfScnIGNvbnRpZW5lIHVubyBvIHBpXHUwMGY5IGZpbGUgY2hlIG5vbiBwb3Nzb25vIGVzc2VyZSBlbGltaW5hdGkuXG5cblNlbGV6aW9uYXJlIHVuIGFsdHJvIHBlcmNvcnNvIGUgcHJvdmFyZSBkaSBudW92by4NCi1jcmVhdGVQYXRoRXJyb3JfcmVhc29uPUltcG9zc2liaWxlIGNyZWFyZSBpbCBwZXJjb3JzbyAnJ3swfScnLlxuXG5TZWxlemlvbmFyZSB1biBhbHRybyBwZXJjb3JzbyBlIHByb3ZhcmUgZGkgbnVvdm8uDQotaW52YWxpZFBhdGhfbXNnPUlsIHBlcmNvcnNvIHNwZWNpZmljYXRvIG5vbiBcdTAwZTggdmFsaWRvLg0KLQ0KLSMgQmFja3VwIExpYnJhcnkgRGlhbG9nDQotYmFja3VwTGlicmFyeURpYWxvZ190aXRsZT1Fc2VndWkgYmFja3VwIGxpYnJlcmlhDQotYmFja3VwTGlicmFyeURpYWxvZ190ZXh0PVNpIGNvbnNpZ2xpYSBkaSBlc2VndWlyZSBpbCBiYWNrdXAgZGVsbGEgbGlicmVyaWEgY29ycmVudGUgcHJpbWEgZGkgcHJvY2VkZXJlIGNvbiBsJ2FnZ2lvcm5hbWVudG8uXG5cbkZhcmUgY2xpYyBzdSBPSyBwZXIgY3JlYXJlIHVuYSBjb3BpYSBkaSBiYWNrdXAgZGVsbGEgbGlicmVyaWEgbmVsbGEgZGlyZWN0b3J5IHNwZWNpZmljYXRhLiBGYXJlIGNsaWMgc3UgSWdub3JhIHBlciBjb250aW51YXJlIHNlbnphIGNyZWFyZSBpbCBiYWNrdXAuDQotYmFja2luZ1VwTGlicmFyeVRhc2tfbmFtZT1Fc2VjdXppb25lIGRpIHVuYSBjb3BpYSBkaSBiYWNrdXAgZGVpIGZpbGUgZGVsbGEgbGlicmVyaWEgaW4gY29yc28uLi4NCi0NCi0jIFBhdGggU2VsZWN0aW9uIERpYWxvZw0KLXBhdGhTZWxlY3Rpb25FcnJvcl9tc2c9SW1wb3NzaWJpbGUgY3JlYXJlIGRpcg0KLW9rQnV0dG9uX3RleHQ9T0sNCi1za2lwQnV0dG9uX3RleHQ9SWdub3JhDQotDQotIyBQcm9jZXNzIEVkaXRvciBwcmVmZXJlbmNlcw0KLWFsd2F5c0J1dHRvbl90ZXh0PVNlbXByZQ0KLW5ldmVyQnV0dG9uX3RleHQ9TWFpDQotcHJvbXB0QnV0dG9uX3RleHQ9UmljaGllZGkNCi0NCi0jIEFkZCBMaW5rIERpYWxvZw0KLWxpbmtUb1VSTF9uYW1lPVVSTA0KLWxpbmtUb0ZpbGVfbmFtZT1JbCBmaWxlDQotZWxlbWVudExpbmtfbmFtZT1FbGVtZW50byBkZWwgbWV0b2RvDQotZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lPUVsZW1lbnRvIGRlbCBtZXRvZG8gY29uIHByZWZpc3NvIHRpcG8NCi1lbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lPUVsZW1lbnRvIGRlbCBtZXRvZG8gY29uIHRlc3RvIHBlcnNvbmFsaXp6YXRvDQotDQotIyBDb252ZXJ0IEFjdGl2aXR5IFR5cGUgRGlhbG9nDQotY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlPUNvbnZlcnRpIHRpcG8gZGkgYXR0aXZpdFx1MDBlMA0KLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0PVNlbGV6aW9uYXJlIGlsIHRpcG8gZGkgYXR0aXZpdFx1MDBlMCBkaSBkZXN0aW5hemlvbmUuDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfbXNnPUlVUEwwMzA0RTogUXVlc3RhIGF0dGl2aXRcdTAwZTAgbm9uIHB1XHUwMGYyIGVzc2VyZSBjb252ZXJ0aXRhIGluIHVuIGFsdHJvIHRpcG8uDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uPU5vbiBjJydcdTAwZTggdW4gdGlwbyBkaSBhdHRpdml0XHUwMGUwIGNvbXBhdGliaWxlIHBlciB7MH0uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjIyYmUyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChTaW5ndWxhcikNCi1hY3Rpdml0eV90ZXh0PVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmYw0KLWFydGlmYWN0X3RleHQ9XHU2MjEwXHU2NzljXHU3MjY5DQotY2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1cdTMwYjFcdTMwZmNcdTMwZDFcdTMwZDNcdTMwZWFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjMNCi1jaGVja2xpc3RfdGV4dD1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwZWFcdTMwYjlcdTMwYzgNCi1jaGVja0l0ZW1fdGV4dD1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk4MDVcdTc2ZWUNCi1jb21wb3NpdGVSb2xlX3RleHQ9XHUzMGIzXHUzMGYzXHUzMGRkXHUzMGI4XHUzMGMzXHUzMGM4XHUzMGZiXHUzMGVkXHUzMGZjXHUzMGViDQotY29uY2VwdF90ZXh0PVx1Njk4Mlx1NWZmNQ0KLWNvbnRlbnRQYWNrYWdlX3RleHQ9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMGZiXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4DQotY3VzdG9tQ2F0ZWdvcnlfdGV4dD1cdTMwYWJcdTMwYjlcdTMwYmZcdTMwZTBcdTMwZmJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmMNCi1kZWxpdmVyYWJsZV90ZXh0PVx1N2QwZFx1NTE2NVx1NzI2OQ0KLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0PVx1MzBjN1x1MzBlYVx1MzBkMFx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOQ0KLWRlc2NyaXB0b3JfdGV4dD1cdThhMThcdThmZjBcdTViNTANCi1kaXNjaXBsaW5lX3RleHQ9XHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlDQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ9XHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3DQotZG9tYWluX3RleHQ9XHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzDQotZXN0aW1hdGVfdGV4dD1cdTg5OGJcdTdhNGRcdTMwODJcdTMwOGENCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9XHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHUzMGUxXHUzMGM4XHUzMGVhXHUzMGMzXHUzMGFmDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9XHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1DQotZXhhbXBsZV90ZXh0PVx1NGY4Yg0KLWd1aWRhbmNlX3RleHQ9XHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5DQotZ3VpZGVsaW5lX3RleHQ9XHUzMGFjXHUzMGE0XHUzMGM5XHUzMGU5XHUzMGE0XHUzMGYzDQotaXRlcmF0aW9uX3RleHQ9XHU1M2NkXHU1ZmE5DQotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMA0KLW1ldGhvZENvbnRlbnRfdGV4dD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQNCi1tZXRob2RMaWJyYXJ5X3RleHQ9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjDQotbWV0aG9kUGFja2FnZV90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOA0KLW1ldGhvZFBsdWdpbl90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmMw0KLW1pbGVzdG9uZV90ZXh0PVx1MzBkZVx1MzBhNFx1MzBlYlx1MzBiOVx1MzBjOFx1MzBmY1x1MzBmMw0KLW91dGNvbWVfdGV4dD1cdTdkNTBcdTY3OWMNCi1waGFzZV90ZXh0PVx1MzBkNVx1MzBhN1x1MzBmY1x1MzBiYQ0KLXByYWN0aWNlX3RleHQ9XHUzMGQ3XHUzMGU5XHUzMGFmXHUzMGM2XHUzMGEzXHUzMGI5DQotcHJvY2Vzc190ZXh0PVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOQ0KLXByb2Nlc3NDb250cmlidXRpb25fdGV4dD1cdTVmYWVcdTUyMDZcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1wcm9jZXNzRmFtaWx5X3RleHQ9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGRmXHUzMGVhXHUzMGZjDQotcHJvY2Vzc1BhY2thZ2VfdGV4dD1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjgNCi1yZXBvcnRfdGV4dD1cdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzgNCi1yZXVzYWJsZUFzc2V0X3RleHQ9XHU1MThkXHU1MjI5XHU3NTI4XHU1M2VmXHU4MGZkXHUzMDZhXHUzMGEyXHUzMGJiXHUzMGMzXHUzMGM4DQotcm9hZG1hcF90ZXh0PVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkNw0KLXJvbGVEZXNjcmlwdG9yX3RleHQ9XHUzMGVkXHUzMGZjXHUzMGViXHU4YTE4XHU4ZmYwXHU1YjUwDQotcm9sZV90ZXh0PVx1MzBlZFx1MzBmY1x1MzBlYg0KLXJvbGVTZXRfdGV4dD1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzgNCi1yb2xlU2V0R3JvdXBpbmdfdGV4dD1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzhcdTMwZmJcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDcNCi1zdGFuZGFyZENhdGVnb3J5X3RleHQ9XHU2YTE5XHU2ZTk2XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjDQotc3RlcF90ZXh0PVx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkNw0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1OGNjN1x1NjU5OQ0KLXRhc2tfdGV4dD1cdTMwYmZcdTMwYjlcdTMwYWYNCi10YXNrRGVzY3JpcHRvcl90ZXh0PVx1MzBiZlx1MzBiOVx1MzBhZlx1OGExOFx1OGZmMFx1NWI1MA0KLXRlYW1Qcm9maWxlX3RleHQ9XHUzMGMxXHUzMGZjXHUzMGUwXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViDQotdGVtcGxhdGVfdGV4dD1cdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzgNCi10ZXJtRGVmaW5pdGlvbl90ZXh0PVx1NzUyOFx1OGE5ZVx1NWI5YVx1N2ZhOQ0KLXRvb2xfdGV4dD1cdTMwYzRcdTMwZmNcdTMwZWINCi10b29sTWVudG9yX3RleHQ9XHUzMGM0XHUzMGZjXHUzMGViXHUzMGZiXHUzMGUxXHUzMGYzXHUzMGJmXHUzMGZjDQotd2hpdGVwYXBlcl90ZXh0PVx1MzBkYlx1MzBlZlx1MzBhNFx1MzBjOFx1MzBmYlx1MzBkYVx1MzBmY1x1MzBkMVx1MzBmYw0KLXdvcmtQcm9kdWN0X3RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4OTgxXHU3ZDIwDQotd29ya1Byb2R1Y3RUeXBlX3RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU5ODVlDQotDQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoUGx1cmFsKQ0KLWFjdGl2aXR5X3RleHRfcGx1cmFsPVx1NGY1Y1x1Njk2ZA0KLWFydGlmYWN0X3RleHRfcGx1cmFsPVx1NjIxMFx1Njc5Y1x1NzI2OQ0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsPVx1MzBiMVx1MzBmY1x1MzBkMVx1MzBkM1x1MzBlYVx1MzBjNlx1MzBhM1x1MzBmY1x1MzBmYlx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmMw0KLWNoZWNrbGlzdF90ZXh0X3BsdXJhbD1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwZWFcdTMwYjlcdTMwYzgNCi1jaGVja0l0ZW1fdGV4dF9wbHVyYWw9XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHU5ODA1XHU3NmVlDQotY29tcG9zaXRlUm9sZV90ZXh0X3BsdXJhbD1cdTMwYjNcdTMwZjNcdTMwZGRcdTMwYjhcdTMwYzNcdTMwYzhcdTMwZmJcdTMwZWRcdTMwZmNcdTMwZWINCi1jb25jZXB0X3RleHRfcGx1cmFsPVx1Njk4Mlx1NWZmNQ0KLWNvbnRlbnRQYWNrYWdlX3RleHRfcGx1cmFsPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzBmYlx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOA0KLWN1c3RvbUNhdGVnb3J5X3RleHRfcGx1cmFsPVx1MzBhYlx1MzBiOVx1MzBiZlx1MzBlMFx1MzBmYlx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmYw0KLWRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsPVx1N2QwZFx1NTE2NVx1NzI2OQ0KLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0X3BsdXJhbD1cdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1kZXNjcmlwdG9yX3RleHRfcGx1cmFsPVx1OGExOFx1OGZmMFx1NWI1MA0KLWRpc2NpcGxpbmVfdGV4dF9wbHVyYWw9XHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlDQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHRfcGx1cmFsPVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzA2ZVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1NTMxNg0KLWRvbWFpbl90ZXh0X3BsdXJhbD1cdTMwYzlcdTMwZTFcdTMwYTRcdTMwZjMNCi1lc3RpbWF0ZV90ZXh0X3BsdXJhbD1cdTg5OGJcdTdhNGRcdTMwODJcdTMwOGENCi1lc3RpbWF0aW5nTWV0cmljX3RleHRfcGx1cmFsPVx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YVx1MzBlMVx1MzBjOFx1MzBlYVx1MzBjM1x1MzBhZg0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0X3BsdXJhbD1cdTg5OGJcdTdhNGRcdTMwODJcdTMwOGFcdTgwMDNcdTYxNmVcdTRlOGJcdTk4MDUNCi1leGFtcGxlX3RleHRfcGx1cmFsPVx1NGY4Yg0KLWd1aWRhbmNlX3RleHRfcGx1cmFsPVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOQ0KLWd1aWRlbGluZV90ZXh0X3BsdXJhbD1cdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjMNCi1pdGVyYXRpb25fdGV4dF9wbHVyYWw9XHU1M2NkXHU1ZmE5DQotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0X3BsdXJhbD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTANCi1tZXRob2RDb250ZW50X3RleHRfcGx1cmFsPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNA0KLW1ldGhvZExpYnJhcnlfdGV4dF9wbHVyYWw9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjDQotbWV0aG9kUGFja2FnZV90ZXh0X3BsdXJhbD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjgNCi1tZXRob2RQbHVnaW5fdGV4dF9wbHVyYWw9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzDQotbWlsZXN0b25lX3RleHRfcGx1cmFsPVx1MzBkZVx1MzBhNFx1MzBlYlx1MzBiOVx1MzBjOFx1MzBmY1x1MzBmMw0KLW91dGNvbWVfdGV4dF9wbHVyYWw9XHU3ZDUwXHU2NzljDQotcGhhc2VfdGV4dF9wbHVyYWw9XHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGJhDQotcHJhY3RpY2VfdGV4dF9wbHVyYWw9XHUzMGQ3XHUzMGU5XHUzMGFmXHUzMGM2XHUzMGEzXHUzMGI5DQotcHJvY2Vzc190ZXh0X3BsdXJhbD1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1wcm9jZXNzQ29udHJpYnV0aW9uX3RleHRfcGx1cmFsPVx1NWZhZVx1NTIwNlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOQ0KLXByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGRmXHUzMGVhXHUzMGZjDQotcHJvY2Vzc1BhY2thZ2VfdGV4dF9wbHVyYWw9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4DQotcmVwb3J0X3RleHRfcGx1cmFsPVx1MzBlY1x1MzBkZFx1MzBmY1x1MzBjOA0KLXJldXNhYmxlQXNzZXRfdGV4dF9wbHVyYWw9XHU1MThkXHU1MjI5XHU3NTI4XHU1M2VmXHU4MGZkXHUzMDZhXHUzMGEyXHUzMGJiXHUzMGMzXHUzMGM4DQotcm9hZG1hcF90ZXh0X3BsdXJhbD1cdTMwZWRcdTMwZmNcdTMwYzlcdTMwZGVcdTMwYzNcdTMwZDcNCi1yb2xlRGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1cdTMwZWRcdTMwZmNcdTMwZWJcdThhMThcdThmZjBcdTViNTANCi1yb2xlX3RleHRfcGx1cmFsPVx1MzBlZFx1MzBmY1x1MzBlYg0KLXJvbGVTZXRfdGV4dF9wbHVyYWw9XHUzMGVkXHUzMGZjXHUzMGViXHUzMGZiXHUzMGJiXHUzMGMzXHUzMGM4DQotcm9sZVNldEdyb3VwaW5nX3RleHRfcGx1cmFsPVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOFx1MzA2ZVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1NTMxNg0KLXN0YW5kYXJkQ2F0ZWdvcnlfdGV4dF9wbHVyYWw9XHU2YTE5XHU2ZTk2XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjDQotc3RlcF90ZXh0X3BsdXJhbD1cdTMwYjlcdTMwYzZcdTMwYzNcdTMwZDcNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dF9wbHVyYWw9XHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHU4Y2M3XHU2NTk5DQotdGFza190ZXh0X3BsdXJhbD1cdTMwYmZcdTMwYjlcdTMwYWYNCi10YXNrRGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1cdTMwYmZcdTMwYjlcdTMwYWZcdThhMThcdThmZjBcdTViNTANCi10ZWFtUHJvZmlsZV90ZXh0X3BsdXJhbD1cdTMwYzFcdTMwZmNcdTMwZTBcdTMwZmJcdTMwZDdcdTMwZWRcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWINCi10ZW1wbGF0ZV90ZXh0X3BsdXJhbD1cdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzgNCi10ZXJtRGVmaW5pdGlvbl90ZXh0X3BsdXJhbD1cdTc1MjhcdThhOWVcdTViOWFcdTdmYTkNCi10b29sX3RleHRfcGx1cmFsPVx1MzBjNFx1MzBmY1x1MzBlYg0KLXRvb2xNZW50b3JfdGV4dF9wbHVyYWw9XHUzMGM0XHUzMGZjXHUzMGViXHUzMGZiXHUzMGUxXHUzMGYzXHUzMGJmXHUzMGZjDQotd2hpdGVwYXBlcl90ZXh0X3BsdXJhbD1cdTMwZGJcdTMwZWZcdTMwYTRcdTMwYzhcdTMwZmJcdTMwZGFcdTMwZmNcdTMwZDFcdTMwZmMNCi13b3JrUHJvZHVjdF90ZXh0X3BsdXJhbD1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzgNCi13b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHRfcGx1cmFsPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1ODk4MVx1N2QyMA0KLXdvcmtQcm9kdWN0VHlwZV90ZXh0X3BsdXJhbD1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTk4NWUNCi0NCi0jIEFwcGxpY2F0aW9uIHRpdGxlLg0KLWFwcGxpY2F0aW9uX3RpdGxlPXswfSAtIHsxfQ0KLQ0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGYNCi1vcGVuTGlicmFyeURpYWxvZ0FyZWFfdGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHU5MDc4XHU2MjllDQotb3BlbkxpYnJhcnlEaWFsb2dBcmVhX3RleHQ9ezB9IFx1MzA2Zlx1MzAwMVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2OFx1NTQ3Y1x1MzA3MFx1MzA4Y1x1MzA4Ylx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1MzA2YlxuXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDY4XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDkyXHU0ZmRkXHU3YmExXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyXHUzMDUzXHUzMDZlXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZiXHU0ZjdmXHU3NTI4XHUzMDU5XHUzMDhiXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ1XHUzMGE5XHUzMGViXHUzMGMwXHUzMGZjXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotbGlicmFyeUxhYmVsX3RleHQ9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjOg0KLWJyb3dzZUJ1dHRvbl90ZXh0PVx1NTNjMlx1NzE2Ny4uLg0KLXByb21wdEZvckxpYnJhcnlDaGVja2JveF90ZXh0PVx1MzA1M1x1MzA2ZVx1OTA3OFx1NjI5ZVx1MzA5Mlx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA2OFx1MzA1N1x1MzA2Nlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzAwMVx1NGVjYVx1NWY4Y1x1MzA1M1x1MzA2ZVx1OGNlYVx1NTU0Zlx1MzA5Mlx1ODg2OFx1NzkzYVx1MzA1N1x1MzA2YVx1MzA0NFx1MzAwMg0KLW9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dD0nJ3swfScnIFx1MzA2Ylx1MzA2Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA0Y1x1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZmXHUzMDAxXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDVmXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDY3XHU0ZjVjXHU2MjEwXHUzMDU1XHUzMDhjXHUzMDY2XHU5NThiXHUzMDRiXHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyXG5cblx1MzAwY09LXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHU1MTQ4XHUzMDc4XHU5MDMyXHUzMDgwXHUzMDRiXHUzMDAxXHUzMDBjXHUzMGFkXHUzMGUzXHUzMGYzXHUzMGJiXHUzMGViXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHU0ZWQ2XHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQxXHUzMGI5XHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotDQotIyBTZWxlY3QgTWV0aG9kIExpYnJhcnkgRm9sZGVyIERpYWxvZw0KLXNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHU5MDc4XHU2MjllDQotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgT3BlbiBMaWJyYXJ5IFByb2dyZXNzIE1lc3NhZ2UNCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNDRcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi0NCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRXJyb3IgRGlhbG9nDQotaW52YWxpZExpYnJhcnlQYXRoX21zZz1JVVBMMDMwMEU6IFx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLWludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb249XHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ1XHUzMGE5XHUzMGViXHUzMGMwXHUzMGZjXHUzMDRjXHU3MTIxXHU1MmI5XHUzMDdlXHUzMDVmXHUzMDZmXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDZhXHUzMDQ0XHUzMDRiXHUzMDAxXHUzMDUzXHUzMDZlXHUzMGQ1XHUzMGE5XHUzMGViXHUzMGMwXHUzMGZjXHUzMDZiXHUzMGEyXHUzMGFmXHUzMGJiXHUzMGI5XHUzMDU5XHUzMDhiXHU5MDY5XHU1MjA3XHUzMDZhXHU4YTMxXHU1M2VmXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cblx1MzAwY09LXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDAxXHU1MjI1XHUzMDZlXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ1XHUzMGE5XHUzMGViXHUzMGMwXHUzMGZjXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotDQotIyBMaWJyYXJ5IExvY2tlZCBFcnJvciBEaWFsb2cNCi1saWJyYXJ5TG9ja2VkX21zZz1JVVBMMDMwM0U6IFx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXG5cdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmZcdTRmN2ZcdTc1MjhcdTRlMmRcdTMwNmVcdTMwODhcdTMwNDZcdTMwNjdcdTMwNTlcdTMwMDIgXHUzMDBjXHUzMGFkXHUzMGUzXHUzMGYzXHUzMGJiXHUzMGViXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHU1MjI1XHUzMDZlXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ1XHUzMGE5XHUzMGViXHUzMGMwXHUzMGZjXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU5XHUzMDhiXHUzMDRiXHUzMDAxXHUzMDVkXHUzMDZlXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHU5NThiXHUzMDRmXHU1ODM0XHU1NDA4XHUzMDZiXHUzMDZmXHUzMDBjXHU1ZjM3XHU1MjM2XHUzMGFhXHUzMGZjXHUzMGQ3XHUzMGYzXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyXG5cblx1OGI2Nlx1NTQ0YTogXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGFiXHUzMGVjXHUzMGYzXHUzMGM4XHU0ZjdmXHU3NTI4XHUzMDZmXHUzMDAxXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU3ODM0XHU2NDBkXHUzMDZlXHU1MzlmXHU1NmUwXHUzMDZiXHUzMDZhXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotbGlicmFyeUxvY2tlZF9vcGVuQnV0dG9uX3RleHQ9XHU1ZjM3XHU1MjM2XHUzMGFhXHUzMGZjXHUzMGQ3XHUzMGYzDQotDQotIyBSZWFkLW9ubHkgUHJvamVjdCBGaWxlIEVycm9yIERpYWxvZw0KLXJlYWRPbmx5UHJvamVjdEZpbGVfdGV4dD1JVVBMMDMwMkU6ICcnezB9JycgXHUzMDZmXHU4YWFkXHUzMDdmXHU1M2Q2XHUzMDhhXHU1YzAyXHU3NTI4XHUzMDY3XHUzMDU5XHUzMDAyIFx1N2Q5YVx1ODg0Y1x1MzA1OVx1MzA4Ylx1NTI0ZFx1MzA2Ylx1NjZmOFx1MzA0ZFx1OGZiY1x1MzA3Zlx1NTNlZlx1ODBmZFx1MzA2Ylx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXJldHJ5QnV0dG9uX3RleHQ9XHU1MThkXHU4YTY2XHU4ODRjDQotY2FuY2VsQnV0dG9uX3RleHQ9XHUzMGFkXHUzMGUzXHUzMGYzXHUzMGJiXHUzMGViDQotDQotIyBWZXJzaW9uIE1pc21hdGNoIERpYWxvZw0KLXZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0PUlVUEwzMDVFOiBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTMwNTNcdTMwNmVcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGZcdTMwNmJcdTMwNmZcdTMwMDF7MH0gXHUzMDkyXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzIHsxfSBcdTRlZTVcdTk2NGRcdTMwNmJcdTMwYTJcdTMwYzNcdTMwZDdcdTMwYjBcdTMwZWNcdTMwZmNcdTMwYzlcdTMwNTlcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duPUlVUEwzMDZFOiBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTMwNTNcdTMwNmVcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGZcdTMwNmJcdTMwNmZcdTMwMDF7MH0gXHUzMDkyXHUzMDg4XHUzMDhhXHU5YWQ4XHUzMDQ0XHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHUzMDZiXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGIwXHUzMGVjXHUzMGZjXHUzMGM5XHUzMDU5XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBhMlx1MzBjM1x1MzBkN1x1MzBiMFx1MzBlY1x1MzBmY1x1MzBjOQ0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RleHQ9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZmXHUzMDAxXHU2NWIwXHU4OThmXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU2OWNiXHU5MDIwXHUzMDZiXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGIwXHUzMGVjXHUzMGZjXHUzMGM5XHUzMDU5XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyXG5cblx1MzBhMlx1MzBjM1x1MzBkN1x1MzBiMFx1MzBlY1x1MzBmY1x1MzBjOVx1MzA5Mlx1N2Q5YVx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1MzBhMlx1MzBjM1x1MzBkN1x1MzBiMFx1MzBlY1x1MzBmY1x1MzBjOVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEwwMzAxRTogXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGIwXHUzMGVjXHUzMGZjXHUzMGM5XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIFx1OGE3M1x1MzA1N1x1MzA0Zlx1MzA2Zlx1MzAwMVx1MzBlZFx1MzBiMFx1MzBmYlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NTNjMlx1NzE2N1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLQ0KLSMgU3dpdGNoIENvbmZpZ3VyYXRpb24gRGlhbG9nDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlPVx1NjljYlx1NjIxMFx1MzA2ZVx1NTIwN1x1MzA4YVx1NjZmZlx1MzA0OA0KLXN3aXRjaENvbmZpZ0RpYWxvZ190ZXh0PVx1NzNmZVx1ODg0Y1x1MzA2ZVx1NjljYlx1NjIxMFx1MzA5Mlx1MzAwMVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2Ylx1OTVhMlx1OTAyM1x1MzA1OVx1MzA4Ylx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1NjljYlx1NjIxMCAnJ3swfScnIFx1MzA2Ylx1NTIwN1x1MzA4YVx1NjZmZlx1MzA0OFx1MzA3ZVx1MzA1OVx1MzA0Yj8NCi0JDQotIyBDb25maWd1cmF0aW9uIENvbWJvDQotY3VycmVudENvbmZpZ0xhYmVsX3RleHQ9XHU3M2ZlXHU4ODRjXHUzMDZlXHU2OWNiXHU2MjEwOg0KLXNlbGVjdENvbmZpZ0xhYmVsX3RleHQ9XHU2OWNiXHU2MjEwXHUzMDZlXHU5MDc4XHU2MjllDQotDQotIyBEZWxldGUgRmlsZXMgQ29uZmlybWF0aW9uIE1lc3NhZ2UNCi1kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2c9XHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGQxXHUzMGI5ICcnezB9JycgXHUzMDZmXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzA1M1x1MzA2ZVx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1NTE4NVx1MzA2ZVx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NTI0YVx1OTY2NFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTdkOWFcdTg4NGNcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotDQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcw0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVx1MzBkMVx1MzBiOSAnJ3swfScnIFx1MzA2Ylx1MzAwMVx1NTI0YVx1OTY2NFx1MzA2N1x1MzA0ZFx1MzA2YVx1MzA0NCAxIFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMlxuXG5cdTUyMjVcdTMwNmVcdTMwZDFcdTMwYjlcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1jcmVhdGVQYXRoRXJyb3JfcmVhc29uPVx1MzBkMVx1MzBiOSAnJ3swfScnIFx1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXG5cdTUyMjVcdTMwNmVcdTMwZDFcdTMwYjlcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1pbnZhbGlkUGF0aF9tc2c9XHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGQxXHUzMGI5XHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyDQotDQotIyBCYWNrdXAgTGlicmFyeSBEaWFsb2cNCi1iYWNrdXBMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1MzBkMFx1MzBjM1x1MzBhZlx1MzBhMlx1MzBjM1x1MzBkN1x1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmYw0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dD1cdTdkOWFcdTg4NGNcdTMwNTlcdTMwOGJcdTUyNGRcdTMwNmJcdTMwMDFcdTczZmVcdTg4NGNcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTMwZDBcdTMwYzNcdTMwYWZcdTMwYTJcdTMwYzNcdTMwZDdcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwOTJcdTVmMzdcdTMwNGZcdTMwNGFcdTUyZTdcdTMwODFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDJcblxuXHUzMDBjT0tcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTlcdTMwOGJcdTMwNjhcdTMwMDFcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwZDBcdTMwYzNcdTMwYWZcdTMwYTJcdTMwYzNcdTMwZDdcdTMwZmJcdTMwYjNcdTMwZDRcdTMwZmNcdTMwNGNcdTRmNWNcdTYyMTBcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMDBjXHUzMGI5XHUzMGFkXHUzMGMzXHUzMGQ3XHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU5XHUzMDhiXHUzMDY4XHUzMDAxXHUzMGQwXHUzMGMzXHUzMGFmXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDViXHUzMDVhXHUzMDZiXHU3ZDlhXHU4ODRjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotYmFja2luZ1VwTGlicmFyeVRhc2tfbmFtZT1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmVcdTMwZDBcdTMwYzNcdTMwYWZcdTMwYTJcdTMwYzNcdTMwZDdcdTMwZmJcdTMwYjNcdTMwZDRcdTMwZmNcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkgLi4uDQotDQotIyBQYXRoIFNlbGVjdGlvbiBEaWFsb2cNCi1wYXRoU2VsZWN0aW9uRXJyb3JfbXNnPVx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBmY1x1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLW9rQnV0dG9uX3RleHQ9T0sNCi1za2lwQnV0dG9uX3RleHQ9XHUzMGI5XHUzMGFkXHUzMGMzXHUzMGQ3DQotDQotIyBQcm9jZXNzIEVkaXRvciBwcmVmZXJlbmNlcw0KLWFsd2F5c0J1dHRvbl90ZXh0PVx1NWUzOFx1NjY0Mg0KLW5ldmVyQnV0dG9uX3RleHQ9XHU4ODRjXHUzMDhmXHUzMDZhXHUzMDQ0DQotcHJvbXB0QnV0dG9uX3RleHQ9XHUzMGQ3XHUzMGVkXHUzMGYzXHUzMGQ3XHUzMGM4XHUzMDkyXHU1MWZhXHUzMDU5DQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1saW5rVG9VUkxfbmFtZT1VUkwNCi1saW5rVG9GaWxlX25hbWU9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViDQotZWxlbWVudExpbmtfbmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTg5ODFcdTdkMjANCi1lbGVtZW50TGlua1dpdGhUeXBlX25hbWU9XHUzMGJmXHUzMGE0XHUzMGQ3XHUzMGZiXHUzMGQ3XHUzMGVjXHUzMGQ1XHUzMGEzXHUzMGMzXHUzMGFmXHUzMGI5XHU0ZWQ4XHUzMDRkXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU4OTgxXHU3ZDIwDQotZWxlbWVudExpbmtXaXRoVXNlclRleHRfbmFtZT1cdTMwYWJcdTMwYjlcdTMwYmZcdTMwZTBcdTMwZmJcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTRlZDhcdTMwNGRcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTg5ODFcdTdkMjANCi0NCi0jIENvbnZlcnQgQWN0aXZpdHkgVHlwZSBEaWFsb2cNCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGl0bGU9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGJmXHUzMGE0XHUzMGQ3XHUzMDZlXHU1OTA5XHU2M2RiDQotY29udmVydEFjdGl2aXR5RGlhbG9nX3RleHQ9XHUzMGJmXHUzMGZjXHUzMGIyXHUzMGMzXHUzMGM4XHUzMDZlXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGJmXHUzMGE0XHUzMGQ3XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfbXNnPUlVUEwwMzA0RTogXHUzMDUzXHUzMDZlXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHUzMDZmXHU1MjI1XHUzMDZlXHUzMGJmXHUzMGE0XHUzMGQ3XHUzMDZiXHU1OTA5XHU2M2RiXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uPXswfSBcdTMwNmJcdTMwNmZcdTMwMDFcdTRlOTJcdTYzZGJcdTYwMjdcdTMwNmVcdTMwNDJcdTMwOGJcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwYmZcdTMwYTRcdTMwZDdcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxMTMwYWUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFNpbmd1bGFyKQ0KLWFjdGl2aXR5X3RleHQ9XHVkNjVjXHViM2Q5DQotYXJ0aWZhY3RfdGV4dD1cdWM1NDRcdWQyZjBcdWQzMjlcdWQyYjgNCi1jYXBhYmlsaXR5UGF0dGVybl90ZXh0PVx1YWUzMFx1YjJhNSBcdWQzMjhcdWQxMzQNCi1jaGVja2xpc3RfdGV4dD1cdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjgNCi1jaGVja0l0ZW1fdGV4dD1cdWFjODBcdWMwYWMgXHVkNTZkXHViYWE5DQotY29tcG9zaXRlUm9sZV90ZXh0PVx1Y2VmNFx1ZDNlY1x1YzljMFx1ZDJiOCBcdWM1ZWRcdWQ1NjANCi1jb25jZXB0X3RleHQ9XHVhYzFjXHViMTUwDQotY29udGVudFBhY2thZ2VfdGV4dD1cdWNlZThcdWQxNTBcdWNlMjAgXHVkMzI4XHVkMGE0XHVjOWMwDQotY3VzdG9tQ2F0ZWdvcnlfdGV4dD1cdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYw0KLWRlbGl2ZXJhYmxlX3RleHQ9XHVjNzc4XHViM2M0XHViYjNjDQotZGVsaXZlcnlQcm9jZXNzX3RleHQ9XHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNA0KLWRlc2NyaXB0b3JfdGV4dD1cdWMxMjRcdWJhODVcdWM3OTANCi1kaXNjaXBsaW5lX3RleHQ9XHVjNmQwXHVjZTU5DQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ9XHVjNmQwXHVjZTU5IFx1YWRmOFx1YjhmOVx1ZDY1NA0KLWRvbWFpbl90ZXh0PVx1YjNjNFx1YmE1NFx1Yzc3OA0KLWVzdGltYXRlX3RleHQ9XHVjNjA4XHVjMGMxDQotZXN0aW1hdGluZ01ldHJpY190ZXh0PVx1YzYwOFx1YzBjMSBcdWJhNTRcdWQyYjhcdWI5YWQNCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dD1cdWM2MDhcdWMwYzEgXHVhY2UwXHViODI0XHVjMGFjXHVkNTZkDQotZXhhbXBsZV90ZXh0PVx1YzYwOFx1YzgxYw0KLWd1aWRhbmNlX3RleHQ9XHVjNTQ4XHViMGI0DQotZ3VpZGVsaW5lX3RleHQ9XHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4DQotaXRlcmF0aW9uX3RleHQ9XHViYzE4XHViY2Y1DQotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzENCi1tZXRob2RDb250ZW50X3RleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1Y2VlOFx1ZDE1MFx1Y2UyMA0KLW1ldGhvZExpYnJhcnlfdGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjDQotbWV0aG9kUGFja2FnZV90ZXh0PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQzMjhcdWQwYTRcdWM5YzANCi1tZXRob2RQbHVnaW5fdGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotbWlsZXN0b25lX3RleHQ9XHVjNzc0XHVjODE1XHVkNDVjDQotb3V0Y29tZV90ZXh0PVx1YWNiMFx1YWNmY1x1YmIzYw0KLXBoYXNlX3RleHQ9XHViMmU4XHVhY2M0DQotcHJhY3RpY2VfdGV4dD1cdWMwYWNcdWI4NDANCi1wcm9jZXNzX3RleHQ9XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PVx1Y2MyOFx1YjRmMSBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1wcm9jZXNzRmFtaWx5X3RleHQ9XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1YWNjNFx1YzVmNA0KLXByb2Nlc3NQYWNrYWdlX3RleHQ9XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1ZDMyOFx1ZDBhNFx1YzljMA0KLXJlcG9ydF90ZXh0PVx1YmNmNFx1YWNlMFx1YzExYw0KLXJldXNhYmxlQXNzZXRfdGV4dD1cdWM3YWNcdWMwYWNcdWM2YTlcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjNzkwXHVjMGIwDQotcm9hZG1hcF90ZXh0PVx1Yjg1Y1x1YjRkY1x1YjlmNQ0KLXJvbGVEZXNjcmlwdG9yX3RleHQ9XHVjNWVkXHVkNTYwIFx1YzEyNFx1YmE4NVx1Yzc5MA0KLXJvbGVfdGV4dD1cdWM1ZWRcdWQ1NjANCi1yb2xlU2V0X3RleHQ9XHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOA0KLXJvbGVTZXRHcm91cGluZ190ZXh0PVx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjggXHVhZGY4XHViOGY5XHVkNjU0DQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0PVx1ZDQ1Y1x1YzkwMCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMNCi1zdGVwX3RleHQ9XHViMmU4XHVhY2M0DQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9XHVjOWMwXHVjNmQwIFx1Yzc5MFx1YjhjYw0KLXRhc2tfdGV4dD1cdWQwYzBcdWMyYTRcdWQwNmMNCi10YXNrRGVzY3JpcHRvcl90ZXh0PVx1ZDBjMFx1YzJhNFx1ZDA2YyBcdWMxMjRcdWJhODVcdWM3OTANCi10ZWFtUHJvZmlsZV90ZXh0PVx1ZDMwMCBcdWQ1MDRcdWI4NWNcdWQzMGNcdWM3N2MNCi10ZW1wbGF0ZV90ZXh0PVx1ZDE1Y1x1ZDUwY1x1YjlhY1x1ZDJiOA0KLXRlcm1EZWZpbml0aW9uX3RleHQ9XHVjNmE5XHVjNWI0IFx1YzgxNVx1Yzc1OA0KLXRvb2xfdGV4dD1cdWIzYzRcdWFkNmMNCi10b29sTWVudG9yX3RleHQ9XHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDANCi13aGl0ZXBhcGVyX3RleHQ9XHViYzMxXHVjMTFjDQotd29ya1Byb2R1Y3RfdGV4dD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWMxMjRcdWJhODVcdWM3OTANCi13b3JrUHJvZHVjdEVsZW1lbnRfdGV4dD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1YzY5NFx1YzE4Yw0KLXdvcmtQcm9kdWN0VHlwZV90ZXh0PVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1DQotDQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoUGx1cmFsKQ0KLWFjdGl2aXR5X3RleHRfcGx1cmFsPVx1ZDY1Y1x1YjNkOQ0KLWFydGlmYWN0X3RleHRfcGx1cmFsPVx1YzU0NFx1ZDJmMFx1ZDMyOVx1ZDJiOA0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsPVx1YWUzMFx1YjJhNSBcdWQzMjhcdWQxMzQNCi1jaGVja2xpc3RfdGV4dF9wbHVyYWw9XHVjY2I0XHVkMDZjXHViOWFjXHVjMmE0XHVkMmI4DQotY2hlY2tJdGVtX3RleHRfcGx1cmFsPVx1YWM4MFx1YzBhYyBcdWQ1NmRcdWJhYTkNCi1jb21wb3NpdGVSb2xlX3RleHRfcGx1cmFsPVx1Y2VmNFx1ZDNlY1x1YzljMFx1ZDJiOCBcdWM1ZWRcdWQ1NjANCi1jb25jZXB0X3RleHRfcGx1cmFsPVx1YWMxY1x1YjE1MA0KLWNvbnRlbnRQYWNrYWdlX3RleHRfcGx1cmFsPVx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWQzMjhcdWQwYTRcdWM5YzANCi1jdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbD1cdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYw0KLWRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsPVx1Yzc3OFx1YjNjNFx1YmIzYw0KLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0X3BsdXJhbD1cdWM4MDRcdWIyZWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotZGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1cdWMxMjRcdWJhODVcdWM3OTANCi1kaXNjaXBsaW5lX3RleHRfcGx1cmFsPVx1YzZkMFx1Y2U1OQ0KLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0X3BsdXJhbD1cdWM2ZDBcdWNlNTkgXHVhZGY4XHViOGY5DQotZG9tYWluX3RleHRfcGx1cmFsPVx1YjNjNFx1YmE1NFx1Yzc3OA0KLWVzdGltYXRlX3RleHRfcGx1cmFsPVx1YzYwOFx1YzBjMQ0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw9XHVjNjA4XHVjMGMxIFx1YmE1NFx1ZDJiOFx1YjlhZA0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0X3BsdXJhbD1cdWM2MDhcdWMwYzEgXHVhY2UwXHViODI0XHVjMGFjXHVkNTZkDQotZXhhbXBsZV90ZXh0X3BsdXJhbD1cdWM2MDhcdWM4MWMNCi1ndWlkYW5jZV90ZXh0X3BsdXJhbD1cdWM1NDhcdWIwYjQNCi1ndWlkZWxpbmVfdGV4dF9wbHVyYWw9XHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4DQotaXRlcmF0aW9uX3RleHRfcGx1cmFsPVx1YmMxOFx1YmNmNQ0KLW1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dF9wbHVyYWw9XHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMQ0KLW1ldGhvZENvbnRlbnRfdGV4dF9wbHVyYWw9XHViYTU0XHVjMThjXHViNGRjIFx1Y2VlOFx1ZDE1MFx1Y2UyMA0KLW1ldGhvZExpYnJhcnlfdGV4dF9wbHVyYWw9XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYw0KLW1ldGhvZFBhY2thZ2VfdGV4dF9wbHVyYWw9XHViYTU0XHVjMThjXHViNGRjIFx1ZDMyOFx1ZDBhNFx1YzljMA0KLW1ldGhvZFBsdWdpbl90ZXh0X3BsdXJhbD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotbWlsZXN0b25lX3RleHRfcGx1cmFsPVx1Yzc3NFx1YzgxNVx1ZDQ1Yw0KLW91dGNvbWVfdGV4dF9wbHVyYWw9XHVhY2IwXHVhY2ZjXHViYjNjDQotcGhhc2VfdGV4dF9wbHVyYWw9XHViMmU4XHVhY2M0DQotcHJhY3RpY2VfdGV4dF9wbHVyYWw9XHVjMGFjXHViODQwDQotcHJvY2Vzc190ZXh0X3BsdXJhbD1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1wcm9jZXNzQ29udHJpYnV0aW9uX3RleHRfcGx1cmFsPVx1Y2MyOFx1YjRmMSBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1wcm9jZXNzRmFtaWx5X3RleHRfcGx1cmFsPVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWFjYzRcdWM1ZjQNCi1wcm9jZXNzUGFja2FnZV90ZXh0X3BsdXJhbD1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVkMzI4XHVkMGE0XHVjOWMwDQotcmVwb3J0X3RleHRfcGx1cmFsPVx1YmNmNFx1YWNlMFx1YzExYw0KLXJldXNhYmxlQXNzZXRfdGV4dF9wbHVyYWw9XHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMA0KLXJvYWRtYXBfdGV4dF9wbHVyYWw9XHViODVjXHViNGRjXHViOWY1DQotcm9sZURlc2NyaXB0b3JfdGV4dF9wbHVyYWw9XHVjNWVkXHVkNTYwIFx1YzEyNFx1YmE4NVx1Yzc5MA0KLXJvbGVfdGV4dF9wbHVyYWw9XHVjNWVkXHVkNTYwDQotcm9sZVNldF90ZXh0X3BsdXJhbD1cdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4DQotcm9sZVNldEdyb3VwaW5nX3RleHRfcGx1cmFsPVx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjggXHVhZGY4XHViOGY5DQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0X3BsdXJhbD1cdWQ0NWNcdWM5MDAgXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjDQotc3RlcF90ZXh0X3BsdXJhbD1cdWIyZThcdWFjYzQNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dF9wbHVyYWw9XHVjOWMwXHVjNmQwIFx1Yzc5MFx1YjhjYw0KLXRhc2tfdGV4dF9wbHVyYWw9XHVkMGMwXHVjMmE0XHVkMDZjDQotdGFza0Rlc2NyaXB0b3JfdGV4dF9wbHVyYWw9XHVkMGMwXHVjMmE0XHVkMDZjIFx1YzEyNFx1YmE4NVx1Yzc5MA0KLXRlYW1Qcm9maWxlX3RleHRfcGx1cmFsPVx1ZDMwMCBcdWQ1MDRcdWI4NWNcdWQzMGNcdWM3N2MNCi10ZW1wbGF0ZV90ZXh0X3BsdXJhbD1cdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjgNCi10ZXJtRGVmaW5pdGlvbl90ZXh0X3BsdXJhbD1cdWM2YTlcdWM1YjQgXHVjODE1XHVjNzU4DQotdG9vbF90ZXh0X3BsdXJhbD1cdWIzYzRcdWFkNmMNCi10b29sTWVudG9yX3RleHRfcGx1cmFsPVx1YjNjNFx1YWQ2YyBcdWMwYWNcdWM2YTkgXHViM2M0XHVjNmMwXHViOWQwDQotd2hpdGVwYXBlcl90ZXh0X3BsdXJhbD1cdWJjMzFcdWMxMWMNCi13b3JrUHJvZHVjdF90ZXh0X3BsdXJhbD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHRfcGx1cmFsPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjMTI0XHViYTg1XHVjNzkwDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHRfcGx1cmFsPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNjk0XHVjMThjDQotd29ya1Byb2R1Y3RUeXBlX3RleHRfcGx1cmFsPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1DQotDQotIyBBcHBsaWNhdGlvbiB0aXRsZS4NCi1hcHBsaWNhdGlvbl90aXRsZT17MH0gLSB7MX0NCi0NCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRGlhbG9nDQotb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU9XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWM1ZjRcdWFlMzANCi1vcGVuTGlicmFyeURpYWxvZ0FyZWFfdGl0bGU9XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWMxMjBcdWQwZGQNCi1vcGVuTGlicmFyeURpYWxvZ0FyZWFfdGV4dD17MH0gXHVjODFjXHVkNDg4XHVjNzQwIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI3N2NcdWIyOTQgXHVkM2Y0XHViMzU0XHVjNWQwIFx1YmE1NFx1YzE4Y1x1YjRkY1x1YzY0MFxuXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHViOTdjIFx1YzgwMFx1YzdhNVx1ZDU2OVx1YjJjOFx1YjJlNC4gXHVjNzc0IFx1YzEzOFx1YzE1OFx1YzVkMCBcdWMwYWNcdWM2YTlcdWQ1NjAgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWQzZjRcdWIzNTRcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWxpYnJhcnlMYWJlbF90ZXh0PVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYzoNCi1icm93c2VCdXR0b25fdGV4dD1cdWNjM2VcdWM1NDRcdWJjZjRcdWFlMzAuLi4NCi1wcm9tcHRGb3JMaWJyYXJ5Q2hlY2tib3hfdGV4dD1cdWM3NzRcdWI5N2MgXHVhZTMwXHViY2Y4XHVhYzEyXHVjNzNjXHViODVjIFx1YzBhY1x1YzZhOVx1ZDU1OFx1YWNlMCBcdWIyZTRcdWMyZGMgXHVkNDVjXHVjMmRjXHVkNTU4XHVjOWMwIFx1YzU0YVx1Yzc0Yw0KLW9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVhYzAwICcnezB9JydcdWM1ZDAgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXHVjMGM4IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWFjMDAgXHVjOWMwXHVjODE1XHViNDFjIFx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1YzVkMFx1YzExYyBcdWM3OTFcdWMxMzFcdWI0MThcdWM1YjQgXHVjNWY0XHViOWJkXHViMmM4XHViMmU0LlxuXG5cdWQ2NTVcdWM3NzhcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjNWVjIFx1YzljNFx1ZDU4OVx1ZDU1OFx1YWM3MFx1YjA5OCBcdWNkZThcdWMxOGNcdWI5N2MgXHVkMDc0XHViOWFkXHVkNTU4XHVjNWVjIFx1YjJlNFx1Yjk3OCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YWNiZFx1Yjg1Y1x1Yjk3YyBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotIyBTZWxlY3QgTWV0aG9kIExpYnJhcnkgRm9sZGVyIERpYWxvZw0KLXNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGl0bGU9XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWMxMjBcdWQwZGQNCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWQzZjRcdWIzNTRcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgT3BlbiBMaWJyYXJ5IFByb2dyZXNzIE1lc3NhZ2UNCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzVlY1x1YjI5NCBcdWM5MTEuLi4NCi0NCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRXJyb3IgRGlhbG9nDQotaW52YWxpZExpYnJhcnlQYXRoX21zZz1JVVBMMDMwMEU6IFx1YzljMFx1YzgxNVx1ZDU1YyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzVmNCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb249XHVjMTIwXHVkMGRkXHVkNTVjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVkM2Y0XHViMzU0XHVhYzAwIFx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWFjNzBcdWIwOTgsIFx1YzVjNlx1YWM3MFx1YjA5OCwgXHVjMGFjXHVjNmE5XHVjNzkwXHVhYzAwIFx1Yzc3NFx1Yjk3YyBcdWM1NjFcdWMxMzhcdWMyYTRcdWQ1NjAgXHVjMjE4IFx1Yzc4OFx1YjI5NCBcdWM2MmNcdWJjMTRcdWI5NzggXHVhZDhjXHVkNTVjXHVjNzQ0IFx1YWMxNlx1YWNlMCBcdWM3ODhcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWIyZTRcdWI5NzggXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1ZDNmNFx1YjM1NFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWI4MjRcdWJhNzQgXHVkNjU1XHVjNzc4XHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIExpYnJhcnkgTG9ja2VkIEVycm9yIERpYWxvZw0KLWxpYnJhcnlMb2NrZWRfbXNnPUlVUEwwMzAzRTogXHVjOWMwXHVjODE1XHVkNTVjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjNWY0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cblx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVhYzAwIFx1YzBhY1x1YzZhOSBcdWM5MTFcdWM3ODVcdWIyYzhcdWIyZTQuIFx1Y2RlOFx1YzE4Y1x1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWM1ZWMgXHViMmU0XHViOTc4IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWQzZjRcdWIzNTRcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjNWY0XHViODI0XHViYTc0IFx1YWMxNVx1YzgxYyBcdWM1ZjRcdWFlMzBcdWI5N2MgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LlxuXG5cdWFjYmRcdWFjZTA6IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHViM2Q5XHVjMmRjXHVjNWQwIFx1YzBhY1x1YzZhOVx1ZDU1OFx1YmE3NCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWFjMDAgXHVjMTkwXHVjMGMxXHViNDIwIFx1YzIxOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotbGlicmFyeUxvY2tlZF9vcGVuQnV0dG9uX3RleHQ9XHVhYzE1XHVjODFjIFx1YzVmNFx1YWUzMA0KLQ0KLSMgUmVhZC1vbmx5IFByb2plY3QgRmlsZSBFcnJvciBEaWFsb2cNCi1yZWFkT25seVByb2plY3RGaWxlX3RleHQ9SVVQTDAzMDJFOiAnJ3swfScnXHVjNzQwKFx1YjI5NCkgXHVjNzdkXHVhZTMwIFx1YzgwNFx1YzZhOVx1Yzc4NVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVhZTMwIFx1YzgwNFx1YzVkMCBcdWM0ZjBcdWFlMzAgXHVhYzAwXHViMmE1XHVjNzNjXHViODVjIFx1YjljY1x1YjRkY1x1YzJlZFx1YzJkY1x1YzYyNC4NCi1yZXRyeUJ1dHRvbl90ZXh0PVx1YzdhY1x1YzJkY1x1YjNjNA0KLWNhbmNlbEJ1dHRvbl90ZXh0PVx1Y2RlOFx1YzE4Yw0KLQ0KLSMgVmVyc2lvbiBNaXNtYXRjaCBEaWFsb2cNCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dD1JVVBMMzA1RTogXHVjMTIwXHVkMGRkXHVkNTVjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM1ZjQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzc0IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM1ZjRcdWI4MjRcdWJhNzQgezB9IFx1YmM4NFx1YzgwNFx1Yzc0NCB7MX0gXHVjNzc0XHVjMGMxXHVjNzNjXHViODVjIFx1YzVjNVx1YWRmOFx1YjgwOFx1Yzc3NFx1YjRkY1x1ZDU3NFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHRfdW5rbm93bj1JVVBMMzA2RTogXHVjMTIwXHVkMGRkXHVkNTVjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM1ZjQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzc0IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM1ZjRcdWI4MjRcdWJhNzQgezB9IFx1YmM4NFx1YzgwNFx1Yzc0NCBcdWMwYzFcdWM3MDQgXHViYzg0XHVjODA0XHVjNzNjXHViODVjIFx1YzVjNVx1YWRmOFx1YjgwOFx1Yzc3NFx1YjRkY1x1ZDU3NFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuDQotDQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjNWM1XHVhZGY4XHViODA4XHVjNzc0XHViNGRjDQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dD1cdWMxMjBcdWQwZGRcdWQ1NWMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzBjOCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVhZDZjXHVjODcwXHViODVjIFx1YzVjNVx1YWRmOFx1YjgwOFx1Yzc3NFx1YjRkY1x1ZDU3NFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuXG5cblx1YzVjNVx1YWRmOFx1YjgwOFx1Yzc3NFx1YjRkY1x1Yjk3YyBcdWFjYzRcdWMxOGRcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotdXBncmFkaW5nTGlicmFyeVRhc2tfbmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzVjNVx1YWRmOFx1YjgwOFx1Yzc3NFx1YjRkY1x1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi0NCi0jIFVwZ3JhZGUgTGlicmFyeSBFcnJvciBEaWFsb2cNCi11cGdyYWRlTGlicmFyeUVycm9yX21zZz1JVVBMMDMwMUU6IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjNWM1XHVhZGY4XHViODA4XHVjNzc0XHViNGRjXHVkNTU4XHVjOWMwIFx1YmFiYlx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWI4NWNcdWFkZjggXHVkMzBjXHVjNzdjXHVjNzQ0IFx1Y2MzOFx1Yzg3MFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIFN3aXRjaCBDb25maWd1cmF0aW9uIERpYWxvZw0KLXN3aXRjaENvbmZpZ0RpYWxvZ190aXRsZT1cdWFkNmNcdWMxMzEgXHVjODA0XHVkNjU4DQotc3dpdGNoQ29uZmlnRGlhbG9nX3RleHQ9XHVkNjA0XHVjN2FjIFx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWMxMjBcdWQwZGRcdWI0MWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVjNjQwIFx1YzVmMFx1YWQwMFx1YjQxYyBcdWFlMzBcdWJjZjggXHVhZDZjXHVjMTMxXHVjNzc4ICcnezB9JycoXHVjNzNjKVx1Yjg1YyBcdWM4MDRcdWQ2NThcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotCQ0KLSMgQ29uZmlndXJhdGlvbiBDb21ibw0KLWN1cnJlbnRDb25maWdMYWJlbF90ZXh0PVx1ZDYwNFx1YzdhYyBcdWFkNmNcdWMxMzE6DQotc2VsZWN0Q29uZmlnTGFiZWxfdGV4dD1cdWFkNmNcdWMxMzEgXHVjMTIwXHVkMGRkDQotDQotIyBEZWxldGUgRmlsZXMgQ29uZmlybWF0aW9uIE1lc3NhZ2UNCi1kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2c9XHVjOWMwXHVjODE1XHVkNTVjICcnezB9JycgXHVhY2JkXHViODVjXHVhYzAwIFx1Yzc3NFx1YmJmOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1ZDNmNFx1YjM1NFx1Yzc1OCBcdWJhYThcdWI0ZTAgXHVkMzBjXHVjNzdjXHVjNzc0IFx1YzBhZFx1YzgxY1x1YjQyOVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLQ0KLSMgUGF0aHMvRmlsZXMgRXJyb3IgTWVzc2FnZXMNCi1kZWxldGVGaWxlc0Vycm9yX3JlYXNvbj0nJ3swfScnIFx1YWNiZFx1Yjg1Y1x1YzVkMCBcdWMwYWRcdWM4MWNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YjI5NCBcdWQ1NThcdWIwOTggXHVjNzc0XHVjMGMxXHVjNzU4IFx1ZDMwY1x1Yzc3Y1x1Yzc3NCBcdWQzZWNcdWQ1NjhcdWI0MThcdWM1YjQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWIyZTRcdWI5NzggXHVhY2JkXHViODVjXHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YWNlMCBcdWIyZTRcdWMyZGMgXHVjMmRjXHViM2M0XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWNyZWF0ZVBhdGhFcnJvcl9yZWFzb249Jyd7MH0nJyBcdWFjYmRcdWI4NWNcdWI5N2MgXHVjNzkxXHVjMTMxXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cblx1YjJlNFx1Yjk3OCBcdWFjYmRcdWI4NWNcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVhY2UwIFx1YjJlNFx1YzJkYyBcdWMyZGNcdWIzYzRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotaW52YWxpZFBhdGhfbXNnPVx1YzljMFx1YzgxNVx1ZDU1YyBcdWFjYmRcdWI4NWNcdWFjMDAgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIEJhY2t1cCBMaWJyYXJ5IERpYWxvZw0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGl0bGU9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YmMzMVx1YzVjNQ0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dD1cdWFjYzRcdWMxOGRcdWQ1NThcdWFlMzAgXHVjODA0XHVjNWQwIFx1ZDYwNFx1YzdhYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YmMzMVx1YzVjNVx1ZDU2MCBcdWFjODNcdWM3NDQgXHVhZDhjXHVjN2E1XHVkNTY5XHViMmM4XHViMmU0LiBcblxuXHVjOWMwXHVjODE1XHVkNTVjIFx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1YzVkMCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM3NTggXHViYzMxXHVjNWM1IFx1YzBhY1x1YmNmOFx1Yzc0NCBcdWM3OTFcdWMxMzFcdWQ1NThcdWI4MjRcdWJhNzQgXHVkNjU1XHVjNzc4XHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC5cblx1YmMzMVx1YzVjNVx1Yzc0NCBcdWM3OTFcdWMxMzFcdWQ1NThcdWM5YzAgXHVjNTRhXHVhY2UwIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWFjNzRcdWIxMDhcdWI2ZjBcdWFlMzBcdWI5N2MgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWJhY2tpbmdVcExpYnJhcnlUYXNrX25hbWU9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1ZDMwY1x1Yzc3Y1x1Yzc1OCBcdWJjMzFcdWM1YzUgXHVjMGFjXHViY2Y4XHVjNzQ0IFx1Yzc5MVx1YzEzMVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi0NCi0jIFBhdGggU2VsZWN0aW9uIERpYWxvZw0KLXBhdGhTZWxlY3Rpb25FcnJvcl9tc2c9XHViNTE0XHViODA5XHVkMWEwXHViOWFjXHViOTdjIFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjNzRjDQotb2tCdXR0b25fdGV4dD1cdWQ2NTVcdWM3NzgNCi1za2lwQnV0dG9uX3RleHQ9XHVhYzc0XHViMTA4XHViNmYwXHVhZTMwDQotDQotIyBQcm9jZXNzIEVkaXRvciBwcmVmZXJlbmNlcw0KLWFsd2F5c0J1dHRvbl90ZXh0PVx1ZDU2ZFx1YzBjMQ0KLW5ldmVyQnV0dG9uX3RleHQ9XHVjMjE4XHVkNTg5IFx1YzU0OFx1ZDU2OA0KLXByb21wdEJ1dHRvbl90ZXh0PVx1ZDUwNFx1Yjg2Y1x1ZDUwNFx1ZDJiOA0KLQ0KLSMgQWRkIExpbmsgRGlhbG9nDQotbGlua1RvVVJMX25hbWU9VVJMDQotbGlua1RvRmlsZV9uYW1lPVx1ZDMwY1x1Yzc3Y1x1Yzc3NA0KLWVsZW1lbnRMaW5rX25hbWU9XHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4Yw0KLWVsZW1lbnRMaW5rV2l0aFR5cGVfbmFtZT1cdWM3MjBcdWQ2MTUgXHVjODExXHViNDUwXHViZDgwXHVhYzAwIFx1Yzc4OFx1YjI5NCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjDQotZWxlbWVudExpbmtXaXRoVXNlclRleHRfbmFtZT1cdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1ZDE0ZFx1YzJhNFx1ZDJiOFx1YWMwMCBcdWM3ODhcdWIyOTQgXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4Yw0KLQ0KLSMgQ29udmVydCBBY3Rpdml0eSBUeXBlIERpYWxvZw0KLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190aXRsZT1cdWQ2NWNcdWIzZDkgXHVjNzIwXHVkNjE1IFx1YmNjMFx1ZDY1OA0KLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0PVx1YjMwMFx1ZDU2ZCBcdWQ2NWNcdWIzZDkgXHVjNzIwXHVkNjE1XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi11bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9tc2c9SVVQTDAzMDRFOiBcdWM3NzQgXHVkNjVjXHViM2Q5XHVjNzQ0IFx1YjJlNFx1Yjk3OCBcdWM3MjBcdWQ2MTVcdWM3M2NcdWI4NWMgXHViY2MwXHVkNjU4XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uPXswfVx1YzVkMCBcdWIzMDBcdWQ1NzQgXHVkNjM4XHVkNjU4IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWQ2NWNcdWIzZDkgXHVjNzIwXHVkNjE1XHVjNzc0IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmNDgyNDIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFNpbmd1bGFyKQ0KLWFjdGl2aXR5X3RleHQ9QXRpdmlkYWRlDQotYXJ0aWZhY3RfdGV4dD1BcnRlZmF0bw0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9UGFkclx1MDBlM28gZGUgUmVjdXJzbw0KLWNoZWNrbGlzdF90ZXh0PUxpc3RhIGRlIFZlcmlmaWNhXHUwMGU3XHUwMGUzbw0KLWNoZWNrSXRlbV90ZXh0PUl0ZW0gZGUgVmVyaWZpY2FcdTAwZTdcdTAwZTNvDQotY29tcG9zaXRlUm9sZV90ZXh0PUZ1blx1MDBlN1x1MDBlM28gZGUgQ29tcG9zaVx1MDBlN1x1MDBlM28NCi1jb25jZXB0X3RleHQ9Q29uY2VpdG8NCi1jb250ZW50UGFja2FnZV90ZXh0PVBhY290ZSBkZSBDb250ZVx1MDBmYWRvDQotY3VzdG9tQ2F0ZWdvcnlfdGV4dD1DYXRlZ29yaWEgUGVyc29uYWxpemFkYQ0KLWRlbGl2ZXJhYmxlX3RleHQ9RGlzdHJpYnVcdTAwZWR2ZWwNCi1kZWxpdmVyeVByb2Nlc3NfdGV4dD1Qcm9jZXNzbyBkZSBFbnRyZWdhDQotZGVzY3JpcHRvcl90ZXh0PURlc2NyaXRvcg0KLWRpc2NpcGxpbmVfdGV4dD1EaXNjaXBsaW5hDQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ9QWdydXBhbWVudG8gZGUgRGlzY2lwbGluYQ0KLWRvbWFpbl90ZXh0PURvbVx1MDBlZG5pbw0KLWVzdGltYXRlX3RleHQ9RXN0aW1hcg0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dD1NXHUwMGU5dHJpY2EgRXN0aW1hdGl2YQ0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PUNvbnNpZGVyYVx1MDBlN1x1MDBmNWVzIEVzdGltYXRpdmFzDQotZXhhbXBsZV90ZXh0PUV4ZW1wbG8NCi1ndWlkYW5jZV90ZXh0PU9yaWVudGFcdTAwZTdcdTAwZTNvDQotZ3VpZGVsaW5lX3RleHQ9RGlyZXRyaXoNCi1pdGVyYXRpb25fdGV4dD1JdGVyYVx1MDBlN1x1MDBlM28NCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHQ9Q29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBNXHUwMGU5dG9kbw0KLW1ldGhvZENvbnRlbnRfdGV4dD1Db250ZVx1MDBmYWRvIGRvIE1cdTAwZTl0b2RvDQotbWV0aG9kTGlicmFyeV90ZXh0PUJpYmxpb3RlY2EgZGUgTVx1MDBlOXRvZG9zDQotbWV0aG9kUGFja2FnZV90ZXh0PVBhY290ZSBkZSBNXHUwMGU5dG9kbw0KLW1ldGhvZFBsdWdpbl90ZXh0PVBsdWctaW4gZGUgTVx1MDBlOXRvZG8NCi1taWxlc3RvbmVfdGV4dD1NYXJjbw0KLW91dGNvbWVfdGV4dD1SZXN1bHRhZG8NCi1waGFzZV90ZXh0PUZhc2UNCi1wcmFjdGljZV90ZXh0PVByXHUwMGUxdGljYQ0KLXByb2Nlc3NfdGV4dD1Qcm9jZXNzbw0KLXByb2Nlc3NDb250cmlidXRpb25fdGV4dD1Qcm9jZXNzbyBEaWZlcmVuY2lhbA0KLXByb2Nlc3NGYW1pbHlfdGV4dD1GYW1cdTAwZWRsaWEgZGUgUHJvY2Vzc28NCi1wcm9jZXNzUGFja2FnZV90ZXh0PVBhY290ZSBkZSBQcm9jZXNzbw0KLXJlcG9ydF90ZXh0PVJlbGF0XHUwMGYzcmlvDQotcmV1c2FibGVBc3NldF90ZXh0PVJlY3Vyc28gUmV1dGlsaXpcdTAwZTF2ZWwNCi1yb2FkbWFwX3RleHQ9Um90ZWlybw0KLXJvbGVEZXNjcmlwdG9yX3RleHQ9RGVzY3JpdG9yIGRhIEZ1blx1MDBlN1x1MDBlM28NCi1yb2xlX3RleHQ9RnVuXHUwMGU3XHUwMGUzbw0KLXJvbGVTZXRfdGV4dD1EZWZpbmlcdTAwZTdcdTAwZTNvIGRlIEZ1blx1MDBlN1x1MDBlM28NCi1yb2xlU2V0R3JvdXBpbmdfdGV4dD1BZ3J1cGFtZW50byBkZSBDb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIEZ1blx1MDBlN1x1MDBmNWVzDQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0PUNhdGVnb3JpYSBQYWRyXHUwMGUzbw0KLXN0ZXBfdGV4dD1FdGFwYQ0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PU1hdGVyaWFsIFN1cG9ydGFkbw0KLXRhc2tfdGV4dD1UYXJlZmENCi10YXNrRGVzY3JpcHRvcl90ZXh0PURlc2NyaXRvciBkZSBUYXJlZmFzDQotdGVhbVByb2ZpbGVfdGV4dD1QZXJmaWwgZGEgRXF1aXBlDQotdGVtcGxhdGVfdGV4dD1UZW1wbGF0ZQ0KLXRlcm1EZWZpbml0aW9uX3RleHQ9RGVmaW5pXHUwMGU3XHUwMGUzbyBkZSBUZXJtbw0KLXRvb2xfdGV4dD1GZXJyYW1lbnRhDQotdG9vbE1lbnRvcl90ZXh0PU1lbnRvciBkZSBGZXJyYW1lbnRhcw0KLXdoaXRlcGFwZXJfdGV4dD1XaGl0ZXBhcGVyDQotd29ya1Byb2R1Y3RfdGV4dD1Qcm9kdXRvIGRlIFRyYWJhbGhvDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9RGVzY3JpdG9yIGRvIFByb2R1dG8gZGUgVHJhYmFsaG8NCi13b3JrUHJvZHVjdEVsZW1lbnRfdGV4dD1FbGVtZW50byBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotd29ya1Byb2R1Y3RUeXBlX3RleHQ9VGlwbyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotDQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoUGx1cmFsKQ0KLWFjdGl2aXR5X3RleHRfcGx1cmFsPUF0aXZpZGFkZXMNCi1hcnRpZmFjdF90ZXh0X3BsdXJhbD1BcnRlZmF0b3MNCi1jYXBhYmlsaXR5UGF0dGVybl90ZXh0X3BsdXJhbD1QYWRyXHUwMGY1ZXMgZGUgUmVjdXJzbw0KLWNoZWNrbGlzdF90ZXh0X3BsdXJhbD1MaXN0YXMgZGUgVmVyaWZpY2FcdTAwZTdcdTAwZTNvDQotY2hlY2tJdGVtX3RleHRfcGx1cmFsPUl0ZW5zIGRlIFZlcmlmaWNhXHUwMGU3XHUwMGUzbw0KLWNvbXBvc2l0ZVJvbGVfdGV4dF9wbHVyYWw9RnVuXHUwMGU3XHUwMGY1ZXMgQ29tcG9zdGFzDQotY29uY2VwdF90ZXh0X3BsdXJhbD1Db25jZWl0b3MNCi1jb250ZW50UGFja2FnZV90ZXh0X3BsdXJhbD1QYWNvdGVzIGRlIENvbnRlXHUwMGZhZG8NCi1jdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbD1DYXRlZ29yaWFzIFBlcnNvbmFsaXphZGFzDQotZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw9RGlzdHJpYnVcdTAwZWR2ZWlzDQotZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsPVByb2Nlc3NvcyBkZSBFbnRyZWdhDQotZGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1EZXNjcml0b3Jlcw0KLWRpc2NpcGxpbmVfdGV4dF9wbHVyYWw9RGlzY2lwbGluYXMNCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dF9wbHVyYWw9QWdydXBhbWVudG9zIGRlIERpc2NpcGxpbmFzDQotZG9tYWluX3RleHRfcGx1cmFsPURvbVx1MDBlZG5pb3MNCi1lc3RpbWF0ZV90ZXh0X3BsdXJhbD1Fc3RpbWF0aXZhcw0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw9TVx1MDBlOXRyaWNhcyBkZSBFc3RpbWF0aXZhDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHRfcGx1cmFsPUNvbnNpZGVyYVx1MDBlN1x1MDBmNWVzIEVzdGltYXRpdmFzDQotZXhhbXBsZV90ZXh0X3BsdXJhbD1FeGVtcGxvcw0KLWd1aWRhbmNlX3RleHRfcGx1cmFsPU9yaWVudGFcdTAwZTdcdTAwZjVlcw0KLWd1aWRlbGluZV90ZXh0X3BsdXJhbD1EaXJldHJpemVzDQotaXRlcmF0aW9uX3RleHRfcGx1cmFsPUl0ZXJhXHUwMGU3XHUwMGY1ZXMNCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsPUNvbmZpZ3VyYVx1MDBlN1x1MDBmNWVzIGRlIE1cdTAwZTl0b2RvDQotbWV0aG9kQ29udGVudF90ZXh0X3BsdXJhbD1Db250ZVx1MDBmYWRvcyBkZSBNXHUwMGU5dG9kbw0KLW1ldGhvZExpYnJhcnlfdGV4dF9wbHVyYWw9QmlibGlvdGVjYXMgZGUgTVx1MDBlOXRvZG9zDQotbWV0aG9kUGFja2FnZV90ZXh0X3BsdXJhbD1QYWNvdGVzIGRlIE1cdTAwZTl0b2RvDQotbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsPVBsdWctaW5zIGRlIE1cdTAwZTl0b2RvDQotbWlsZXN0b25lX3RleHRfcGx1cmFsPU1hcmNvcw0KLW91dGNvbWVfdGV4dF9wbHVyYWw9UmVzdWx0YWRvcw0KLXBoYXNlX3RleHRfcGx1cmFsPUZhc2VzDQotcHJhY3RpY2VfdGV4dF9wbHVyYWw9UHJcdTAwZTF0aWNhcw0KLXByb2Nlc3NfdGV4dF9wbHVyYWw9UHJvY2Vzc29zDQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbD1Qcm9jZXNzb3MgRGlmZXJlbmNpYWlzDQotcHJvY2Vzc0ZhbWlseV90ZXh0X3BsdXJhbD0gICAgRmFtXHUwMGVkbGlhcyBkZSBQcm9jZXNzb3MNCi1wcm9jZXNzUGFja2FnZV90ZXh0X3BsdXJhbD1QYWNvdGVzIGRlIFByb2Nlc3NvDQotcmVwb3J0X3RleHRfcGx1cmFsPVJlbGF0XHUwMGYzcmlvcw0KLXJldXNhYmxlQXNzZXRfdGV4dF9wbHVyYWw9UmVjdXJzb3MgUmV1dGlsaXpcdTAwZTF2ZWlzDQotcm9hZG1hcF90ZXh0X3BsdXJhbD1NYXBhcyBkZSBSb3Rhcw0KLXJvbGVEZXNjcmlwdG9yX3RleHRfcGx1cmFsPURlc2NyaXRvcmVzIGRlIEZ1blx1MDBlN1x1MDBlM28NCi1yb2xlX3RleHRfcGx1cmFsPUZ1blx1MDBlN1x1MDBmNWVzDQotcm9sZVNldF90ZXh0X3BsdXJhbD1Db25qdW50b3MgZGUgRnVuXHUwMGU3XHUwMGY1ZXMNCi1yb2xlU2V0R3JvdXBpbmdfdGV4dF9wbHVyYWw9QWdydXBhbWVudG9zIGRlIENvbmp1bnRvIGRlIEZ1blx1MDBlN1x1MDBmNWVzDQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0X3BsdXJhbD1DYXRlZ29yaWFzIFBhZHJcdTAwZTNvDQotc3RlcF90ZXh0X3BsdXJhbD1FdGFwYXMNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dF9wbHVyYWw9TWF0ZXJpYWlzIGRlIFN1cG9ydGUNCi10YXNrX3RleHRfcGx1cmFsPVRhcmVmYXMNCi10YXNrRGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1EZXNjcml0b3JlcyBkZSBUYXJlZmENCi10ZWFtUHJvZmlsZV90ZXh0X3BsdXJhbD1QZXJmaXMgZGUgRXF1aXBlDQotdGVtcGxhdGVfdGV4dF9wbHVyYWw9R2FiYXJpdG9zDQotdGVybURlZmluaXRpb25fdGV4dF9wbHVyYWw9RGVmaW5pXHUwMGU3XHUwMGY1ZXMgZGUgVGVybW9zDQotdG9vbF90ZXh0X3BsdXJhbD1GZXJyYW1lbnRhcw0KLXRvb2xNZW50b3JfdGV4dF9wbHVyYWw9TWVudG9yZXMgZGUgRmVycmFtZW50YXMNCi13aGl0ZXBhcGVyX3RleHRfcGx1cmFsPVdoaXRlIHBhcGVycw0KLXdvcmtQcm9kdWN0X3RleHRfcGx1cmFsPVByb2R1dG9zICAgICAgICAgICBkZSBUcmFiYWxobw0KLXdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1EZXNjcml0b3JlcyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHRfcGx1cmFsPUVsZW1lbnRvcyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotd29ya1Byb2R1Y3RUeXBlX3RleHRfcGx1cmFsPVRpcG9zIGRlIFByb2R1dG8gZGUgVHJhYmFsaG8NCi0NCi0jIEFwcGxpY2F0aW9uIHRpdGxlLg0KLWFwcGxpY2F0aW9uX3RpdGxlPXswfSAtIHsxfQ0KLQ0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1BYnJpciBCaWJsaW90ZWNhIGRlIE1cdTAwZTl0b2Rvcw0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90aXRsZT1TZWxlY2lvbmUgdW1hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zDQotb3BlbkxpYnJhcnlEaWFsb2dBcmVhX3RleHQ9TyB7MH0gYXJtYXplbmEgbVx1MDBlOXRvZG9zIGUgcHJvY2Vzc29zIGVtIHVtYSBwYXN0YSBjaGFtYWRhIFxudW1hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLiBTZWxlY2lvbmUgdW1hIHBhc3RhIGRlIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIHBhcmEgdXRpbGl6YXIgcGFyYSBlc3RhIHNlc3NcdTAwZTNvLg0KLWxpYnJhcnlMYWJlbF90ZXh0PUJpYmxpb3RlY2E6DQotYnJvd3NlQnV0dG9uX3RleHQ9UHJvY3VyYXIuLi4NCi1wcm9tcHRGb3JMaWJyYXJ5Q2hlY2tib3hfdGV4dD1VdGlsaXphciBlc3RhIGNvbW8gcGFkclx1MDBlM28gZSBuXHUwMGUzbyBwZXJndW50YXIgbm92YW1lbnRlLg0KLW9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dD1OXHUwMGUzbyBoXHUwMGUxIG5lbmh1bWEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZW0gJyd7MH0nJy5cblVtYSBub3ZhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIHNlclx1MDBlMSBjcmlhZGEgZSBhYmVydGEgcGFyYSB2b2NcdTAwZWEgbm8gZGlyZXRcdTAwZjNyaW8gZXNwZWNpZmljYWRvLlxuXG5DbGlxdWUgZW0gT0sgcGFyYSBwcm9zc2VndWlyIG91IENhbmNlbGFyIHBhcmEgZXNwZWNpZmljYXIgb3V0cm8gY2FtaW5obyBwYXJhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLg0KLQ0KLSMgU2VsZWN0IE1ldGhvZCBMaWJyYXJ5IEZvbGRlciBEaWFsb2cNCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlPVNlbGVjaW9uYXIgQmlibGlvdGVjYSBkZSBNXHUwMGU5dG9kb3MNCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RleHQ9U2VsZWNpb25lIHVtYSBwYXN0YSBkZSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4NCi0NCi0jIE9wZW4gTGlicmFyeSBQcm9ncmVzcyBNZXNzYWdlDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9QWJyaW5kbyBhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLi4uDQotDQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLWludmFsaWRMaWJyYXJ5UGF0aF9tc2c9SVVQTDAzMDBFOiBOXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBhYnJpciBhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGVzcGVjaWZpY2FkYS4NCi1pbnZhbGlkTGlicmFyeVBhdGhfcmVhc29uPUEgcGFzdGEgZGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3Mgc2VsZWNpb25hZGEgXHUwMGU5IGludlx1MDBlMWxpZGEsIG5cdTAwZTNvIGV4aXN0ZSBvdSB2b2NcdTAwZWEgblx1MDBlM28gdGVtIGEgcGVybWlzc1x1MDBlM28gY29ycmV0YSBwYXJhIGFjZXNzXHUwMGUxLWxhLlxuXG5DbGlxdWUgZW0gT0sgcGFyYSBzZWxlY2lvbmFyIG91dHJhIHBhc3RhIGRlIGJpYmxpb3RlY2EuDQotDQotIyBMaWJyYXJ5IExvY2tlZCBFcnJvciBEaWFsb2cNCi1saWJyYXJ5TG9ja2VkX21zZz1JVVBMMDMwM0U6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGFicmlyIGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kbyBlc3BlY2lmaWNhZGEuXG5cbkEgYmlibGl0ZWNhIGRlIG1cdTAwZTl0b2RvIHNlbGVjaW9uYWRhIHBhcmVjZSBlc3RhciBzZW5kbyB1dGlsaXphZGEuIENsaXF1ZSBlbSBDYW5jZWxhciBwYXJhIHNlbGVjaW9uYXIgb3V0cmEgcGFzdGEgZGEgYmlibGlvdGVjYSBvdSBjbGlxdWUgZW0gRm9yXHUwMGU3YXIgQWJlcnR1cmEgc2UgZGVzZWphciBhYnJpciBhIGJpYmxpb3RlY2EgZGUgcXVhbHF1ZXIgbWFuZWlyYS5cblxuQVZJU086IEEgdXRpbGl6YVx1MDBlN1x1MDBlM28gc2ltdWx0XHUwMGUybmVhIGRlIHVtYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvIHBvZGUgY29ycm9tcGVyIGEgYmlibGlvdGVjYS4NCi1saWJyYXJ5TG9ja2VkX29wZW5CdXR0b25fdGV4dD1Gb3JcdTAwZTdhciBBYmVydHVyYQ0KLQ0KLSMgUmVhZC1vbmx5IFByb2plY3QgRmlsZSBFcnJvciBEaWFsb2cNCi1yZWFkT25seVByb2plY3RGaWxlX3RleHQ9SVVQTDAzMDJFOiAnJ3swfScnIFx1MDBlOSBkZSBsZWl0dXJhLiBUb3JuZS1vIGdyYXZcdTAwZTF2ZWwgYW50ZXMgZGUgY29udGludWFyLg0KLXJldHJ5QnV0dG9uX3RleHQ9UmVwZXRpcg0KLWNhbmNlbEJ1dHRvbl90ZXh0PUNhbmNlbGFyDQotDQotIyBWZXJzaW9uIE1pc21hdGNoIERpYWxvZw0KLXZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0PUlVUEwzMDVFOiBBIGJpYmxpb3RlY2Egc2VsZWNpb25hZGEgblx1MDBlM28gcG9kZSBzZXIgYWJlcnRhLiBWb2NcdTAwZWEgZGV2ZSBmYXplciBvIHVwZ3JhZGUgZGUgezB9IHBhcmEgYSB2ZXJzXHUwMGUzbyB7MX0gb3Ugc3VwZXJpb3IgcGFyYSBhYnJpciBlc3NhIGJpYmxpb3RlY2EuDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHRfdW5rbm93bj1JVVBMMzA2RTogQSBiaWJsaW90ZWNhIHNlbGVjaW9uYWRhIG5cdTAwZTNvIHBvZGUgc2VyIGFiZXJ0YS4gVm9jXHUwMGVhIGRldmUgZmF6ZXIgbyB1cGdyYWRlIGRlIHswfSBwYXJhIHVtYSB2ZXJzXHUwMGUzbyBtYWlzIHJlY2VudGUgcGFyYSBhYnJpciBlc3NhIGJpYmxpb3RlY2EuDQotDQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPUZhemVyIFVwZ3JhZGUgZGUgQmlibGlvdGVjYSBkZSBNXHUwMGU5dG9kb3MNCi11cGdyYWRlTGlicmFyeURpYWxvZ190ZXh0PUEgYmlibGlvdGVjYSBzZWxlY2lvbmFkYSBwcmVjaXNhIHRlciB1cGdyYWRlIGZlaXRvIHBhcmEgYSBub3ZhIGVzdHJ1dHVyYSBkYSBiaWJsaW90ZWNhLlxuXG5EZXNlamEgcHJvc3NlZ3VpciBjb20gbyB1cGdyYWRlPw0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9RmF6ZW5kbyB1cGdyYWRlIGRhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLi4uDQotDQotIyBVcGdyYWRlIExpYnJhcnkgRXJyb3IgRGlhbG9nDQotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQTDAzMDFFOiBOXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBmYXplciB1cGdyYWRlIGRhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLiBDb25zdWx0ZSBvIGFycXVpdm8gZGUgcmVnaXN0cm8gcGFyYSBvYnRlciBkZXRhbGhlcyBhZGljaW9uYWlzLg0KLQ0KLSMgU3dpdGNoIENvbmZpZ3VyYXRpb24gRGlhbG9nDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlPUFsdGVybmFyIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi1zd2l0Y2hDb25maWdEaWFsb2dfdGV4dD1EZXNlamEgYWx0ZXJuYXIgYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGF0dWFsIHBhcmEgYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHBhZHJcdTAwZTNvLCAnJ3swfScnLCBhc3NvY2lhZGEgYW8gcHJvY2Vzc28gc2VsZWNpb25hZG8/DQotCQ0KLSMgQ29uZmlndXJhdGlvbiBDb21ibw0KLWN1cnJlbnRDb25maWdMYWJlbF90ZXh0PUNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gYXR1YWw6DQotc2VsZWN0Q29uZmlnTGFiZWxfdGV4dD1TZWxlY2lvbmUgdW1hIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi0NCi0jIERlbGV0ZSBGaWxlcyBDb25maXJtYXRpb24gTWVzc2FnZQ0KLWRlbGV0ZUZpbGVzQ29uZmlybWF0aW9uX21zZz1PIGNhbWluaG8gZXNwZWNpZmljYWRvICcnezB9Jycgalx1MDBlMSBleGlzdGUuIFRvZG9zIG9zIGFycXVpdm9zIG5hIHBhc3RhIHNlclx1MDBlM28gZXhjbHVcdTAwZWRkb3MuIERlc2VqYSBjb250aW51YXI/DQotDQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcw0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPU8gY2FtaW5obyAnJ3swfScnIGNvbnRcdTAwZTltIHVtIG91IG1haXMgYXJxdWl2b3MgcXVlIG5cdTAwZTNvIHBvZGVtIHNlciBleGNsdVx1MDBlZGRvcy5cblxuU2VsZWNpb25lIG91dHJvIGNhbWluaG8gZSB0ZW50ZSBub3ZhbWVudGUuDQotY3JlYXRlUGF0aEVycm9yX3JlYXNvbj1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBjcmlhciBvIGNhbWluaG8gJyd7MH0nJy5cblxuU2VsZWNpb25lIG91dHJvIGNhbWluaG8gZSB0ZW50ZSBub3ZhbWVudGUuDQotaW52YWxpZFBhdGhfbXNnPU8gY2FtaW5obyBlc3BlY2lmaWNhZG8gblx1MDBlM28gXHUwMGU5IHZcdTAwZTFsaWRvLg0KLQ0KLSMgQmFja3VwIExpYnJhcnkgRGlhbG9nDQotYmFja3VwTGlicmFyeURpYWxvZ190aXRsZT1GYXplciBCYWNrdXAgZGEgQmlibGlvdGVjYQ0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dD1cdTAwYzkgYWx0YW1lbnRlIHJlY29tZW5kXHUwMGUxdmVsIGZhemVyIGJhY2t1cCBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhdHVhbCBhbnRlcyBkZSBwcm9zc2VndWlyLlxuXG5DbGlxdWUgZW0gT0sgcGFyYSBjcmlhciB1bWEgY1x1MDBmM3BpYSBkZSBiYWNrdXAgZGEgYmlibGlvdGVjYSBubyBkaXJldFx1MDBmM3JpbyBlc3BlY2lmaWNhZG8uIENsaXF1ZSBlbSBJZ25vcmFyIHBhcmEgY29udGludWFyIHNlbSBjcmlhciBvIGJhY2t1cC4NCi1iYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lPUZhemVuZG8gdW1hIGNcdTAwZjNwaWEgZGUgYmFja3VwIGRvcyBhcnF1aXZvcyBkYSBiaWJsaW90ZWNhLi4uDQotDQotIyBQYXRoIFNlbGVjdGlvbiBEaWFsb2cNCi1wYXRoU2VsZWN0aW9uRXJyb3JfbXNnPU5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIGNyaWFyIG8gZGlyZXRcdTAwZjNyaW8NCi1va0J1dHRvbl90ZXh0PU9LDQotc2tpcEJ1dHRvbl90ZXh0PUlnbm9yYXINCi0NCi0jIFByb2Nlc3MgRWRpdG9yIHByZWZlcmVuY2VzDQotYWx3YXlzQnV0dG9uX3RleHQ9U2VtcHJlDQotbmV2ZXJCdXR0b25fdGV4dD1OdW5jYQ0KLXByb21wdEJ1dHRvbl90ZXh0PUF2aXNhcg0KLQ0KLSMgQWRkIExpbmsgRGlhbG9nDQotbGlua1RvVVJMX25hbWU9VVJMDQotbGlua1RvRmlsZV9uYW1lPUFycXVpdm8NCi1lbGVtZW50TGlua19uYW1lPUVsZW1lbnRvIGRlIE1cdTAwZTl0b2RvDQotZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lPUVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvIGNvbSBwcmVmaXhvIGRlIHRpcG8NCi1lbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lPUVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvIGNvbSB0ZXh0byBwZXJzb25hbGl6YWRvDQotDQotIyBDb252ZXJ0IEFjdGl2aXR5IFR5cGUgRGlhbG9nDQotY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlPUNvbnZlcnRlciBUaXBvIGRlIEF0aXZpZGFkZQ0KLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0PVNlbGVjaW9uYXIgbyB0aXBvIGRlIGF0aXZpZGFkZSBkZSBkZXN0aW5vLg0KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX21zZz1JVVBMMDMwNEU6IEVzdGEgYXRpdmlkYWRlIG5cdTAwZTNvIHBvZGUgc2VyIGNvbnZlcnRpZGEgcGFyYSBvdXRybyB0aXBvLg0KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX3JlYXNvbj1OXHUwMGUzbyBoXHUwMGUxIHRpcG8gZGUgYXRpdmlkYWRlIGNvbXBhdFx1MDBlZHZlbCBjb20gezB9Lg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGVjMWU2NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoU2luZ3VsYXIpDQotYWN0aXZpdHlfdGV4dD1cdTZkM2JcdTUyYTgNCi1hcnRpZmFjdF90ZXh0PVx1NWRlNVx1NGVmNg0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9XHU4MGZkXHU1MjliXHU2YTIxXHU1ZjBmDQotY2hlY2tsaXN0X3RleHQ9XHU2ODM4XHU1YmY5XHU4ODY4DQotY2hlY2tJdGVtX3RleHQ9XHU2OGMwXHU2N2U1XHU5ODc5DQotY29tcG9zaXRlUm9sZV90ZXh0PVx1N2VjNFx1NTQwOFx1ODlkMlx1ODI3Mg0KLWNvbmNlcHRfdGV4dD1cdTY5ODJcdTVmZjUNCi1jb250ZW50UGFja2FnZV90ZXh0PVx1NTE4NVx1NWJiOVx1NTMwNQ0KLWN1c3RvbUNhdGVnb3J5X3RleHQ9XHU1YjlhXHU1MjM2XHU3YzdiXHU1MjJiDQotZGVsaXZlcmFibGVfdGV4dD1cdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjYNCi1kZWxpdmVyeVByb2Nlc3NfdGV4dD1cdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGINCi1kZXNjcmlwdG9yX3RleHQ9XHU2M2NmXHU4ZmYwXHU3YjI2DQotZGlzY2lwbGluZV90ZXh0PVx1ODljNFx1N2EwYg0KLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0PVx1ODljNFx1N2EwYlx1NTIwNlx1N2VjNA0KLWRvbWFpbl90ZXh0PVx1NTdkZg0KLWVzdGltYXRlX3RleHQ9XHU0ZjMwXHU3Yjk3DQotZXN0aW1hdGluZ01ldHJpY190ZXh0PVx1NGYzMFx1N2I5N1x1NWVhNlx1OTFjZlx1NTAzYw0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PVx1NGYzMFx1N2I5N1x1NmNlOFx1NjEwZlx1NGU4Ylx1OTg3OQ0KLWV4YW1wbGVfdGV4dD1cdTc5M2FcdTRmOGINCi1ndWlkYW5jZV90ZXh0PVx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLWd1aWRlbGluZV90ZXh0PVx1NjMwN1x1NTM1Nw0KLWl0ZXJhdGlvbl90ZXh0PVx1OGZlZFx1NGVlMw0KLW1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dD1cdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi1tZXRob2RDb250ZW50X3RleHQ9XHU2NWI5XHU2Y2Q1XHU1MTg1XHU1YmI5DQotbWV0aG9kTGlicmFyeV90ZXh0PVx1NjViOVx1NmNkNVx1NWU5Mw0KLW1ldGhvZFBhY2thZ2VfdGV4dD1cdTY1YjlcdTZjZDVcdTUzMDUNCi1tZXRob2RQbHVnaW5fdGV4dD1cdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi1taWxlc3RvbmVfdGV4dD1cdTkxY2NcdTdhMGJcdTc4OTENCi1vdXRjb21lX3RleHQ9XHU3ZWQzXHU2NzljDQotcGhhc2VfdGV4dD1cdTk2MzZcdTZiYjUNCi1wcmFjdGljZV90ZXh0PVx1NWI5ZVx1OGRmNQ0KLXByb2Nlc3NfdGV4dD1cdTZkNDFcdTdhMGINCi1wcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9XHU1ZGVlXHU1ZjAyXHU1MzE2XHU4ZmM3XHU3YTBiDQotcHJvY2Vzc0ZhbWlseV90ZXh0PVx1NmQ0MVx1N2EwYlx1N2NmYlx1NTIxNw0KLXByb2Nlc3NQYWNrYWdlX3RleHQ9XHU2ZDQxXHU3YTBiXHU1MzA1DQotcmVwb3J0X3RleHQ9XHU2MmE1XHU1NDRhDQotcmV1c2FibGVBc3NldF90ZXh0PVx1NTNlZlx1OTFjZFx1NzUyOFx1OGQ0NFx1NGVhNw0KLXJvYWRtYXBfdGV4dD1cdThkZWZcdTdlYmZcdTU2ZmUNCi1yb2xlRGVzY3JpcHRvcl90ZXh0PVx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1N2IyNg0KLXJvbGVfdGV4dD1cdTg5ZDJcdTgyNzINCi1yb2xlU2V0X3RleHQ9XHU4OWQyXHU4MjcyXHU5NmM2DQotcm9sZVNldEdyb3VwaW5nX3RleHQ9XHU4OWQyXHU4MjcyXHU5NmM2XHU1MjA2XHU3ZWM0DQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0PVx1NjgwN1x1NTFjNlx1N2M3Ylx1NTIyYg0KLXN0ZXBfdGV4dD1cdTZiNjVcdTlhYTQNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dD1cdTY1MmZcdTYzMDFcdTY3NTBcdTY1OTkNCi10YXNrX3RleHQ9XHU0ZWZiXHU1MmExDQotdGFza0Rlc2NyaXB0b3JfdGV4dD1cdTRlZmJcdTUyYTFcdTYzY2ZcdThmZjBcdTdiMjYNCi10ZWFtUHJvZmlsZV90ZXh0PVx1NTZlMlx1OTYxZlx1Njk4Mlx1ODk4MVx1NjU4N1x1NGVmNg0KLXRlbXBsYXRlX3RleHQ9XHU2YTIxXHU2NzdmDQotdGVybURlZmluaXRpb25fdGV4dD1cdTY3MmZcdThiZWRcdTViOWFcdTRlNDkNCi10b29sX3RleHQ9XHU1ZGU1XHU1MTc3DQotdG9vbE1lbnRvcl90ZXh0PVx1NWRlNVx1NTE3N1x1NTQxMVx1NWJmYw0KLXdoaXRlcGFwZXJfdGV4dD1cdTc2N2RcdTc2YWVcdTRlNjYNCi13b3JrUHJvZHVjdF90ZXh0PVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLXdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NjNjZlx1OGZmMFx1N2IyNg0KLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0PVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NTE0M1x1N2QyMA0KLXdvcmtQcm9kdWN0VHlwZV90ZXh0PVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1N2M3Ylx1NTc4Yg0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFBsdXJhbCkNCi1hY3Rpdml0eV90ZXh0X3BsdXJhbD1cdTZkM2JcdTUyYTgNCi1hcnRpZmFjdF90ZXh0X3BsdXJhbD1cdTVkZTVcdTRlZjYNCi1jYXBhYmlsaXR5UGF0dGVybl90ZXh0X3BsdXJhbD1cdTgwZmRcdTUyOWJcdTZhMjFcdTVmMGYNCi1jaGVja2xpc3RfdGV4dF9wbHVyYWw9XHU2ODM4XHU1YmY5XHU4ODY4DQotY2hlY2tJdGVtX3RleHRfcGx1cmFsPVx1NjhjMFx1NjdlNVx1OTg3OQ0KLWNvbXBvc2l0ZVJvbGVfdGV4dF9wbHVyYWw9XHU3ZWM0XHU1NDA4XHU4OWQyXHU4MjcyDQotY29uY2VwdF90ZXh0X3BsdXJhbD1cdTY5ODJcdTVmZjUNCi1jb250ZW50UGFja2FnZV90ZXh0X3BsdXJhbD1cdTUxODVcdTViYjlcdTUzMDUNCi1jdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbD1cdTViOWFcdTUyMzZcdTdjN2JcdTUyMmINCi1kZWxpdmVyYWJsZV90ZXh0X3BsdXJhbD1cdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjYNCi1kZWxpdmVyeVByb2Nlc3NfdGV4dF9wbHVyYWw9XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiDQotZGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1cdTYzY2ZcdThmZjBcdTdiMjYNCi1kaXNjaXBsaW5lX3RleHRfcGx1cmFsPVx1ODljNFx1N2EwYg0KLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0X3BsdXJhbD1cdTg5YzRcdTdhMGJcdTUyMDZcdTdlYzQNCi1kb21haW5fdGV4dF9wbHVyYWw9XHU1N2RmDQotZXN0aW1hdGVfdGV4dF9wbHVyYWw9XHU0ZjMwXHU3Yjk3DQotZXN0aW1hdGluZ01ldHJpY190ZXh0X3BsdXJhbD1cdTRmMzBcdTdiOTdcdTVlYTZcdTkxY2YNCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dF9wbHVyYWw9XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5DQotZXhhbXBsZV90ZXh0X3BsdXJhbD1cdTc5M2FcdTRmOGINCi1ndWlkYW5jZV90ZXh0X3BsdXJhbD1cdTYzMDdcdTViZmNcdTRmZTFcdTYwNmYNCi1ndWlkZWxpbmVfdGV4dF9wbHVyYWw9XHU2MzA3XHU1MzU3DQotaXRlcmF0aW9uX3RleHRfcGx1cmFsPVx1OGZlZFx1NGVlMw0KLW1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dF9wbHVyYWw9XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotbWV0aG9kQ29udGVudF90ZXh0X3BsdXJhbD1cdTY1YjlcdTZjZDVcdTUxODVcdTViYjkNCi1tZXRob2RMaWJyYXJ5X3RleHRfcGx1cmFsPVx1NjViOVx1NmNkNVx1NWU5Mw0KLW1ldGhvZFBhY2thZ2VfdGV4dF9wbHVyYWw9XHU2NWI5XHU2Y2Q1XHU1MzA1DQotbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsPVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLW1pbGVzdG9uZV90ZXh0X3BsdXJhbD1cdTkxY2NcdTdhMGJcdTc4OTENCi1vdXRjb21lX3RleHRfcGx1cmFsPVx1N2VkM1x1Njc5Yw0KLXBoYXNlX3RleHRfcGx1cmFsPVx1OTYzNlx1NmJiNQ0KLXByYWN0aWNlX3RleHRfcGx1cmFsPVx1NWI5ZVx1OGRmNQ0KLXByb2Nlc3NfdGV4dF9wbHVyYWw9XHU2ZDQxXHU3YTBiDQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbD1cdTVkZWVcdTVmMDJcdTUzMTZcdThmYzdcdTdhMGINCi1wcm9jZXNzRmFtaWx5X3RleHRfcGx1cmFsPVx1NmQ0MVx1N2EwYlx1N2NmYlx1NTIxNw0KLXByb2Nlc3NQYWNrYWdlX3RleHRfcGx1cmFsPVx1NmQ0MVx1N2EwYlx1NTMwNQ0KLXJlcG9ydF90ZXh0X3BsdXJhbD1cdTYyYTVcdTU0NGENCi1yZXVzYWJsZUFzc2V0X3RleHRfcGx1cmFsPVx1NTNlZlx1OTFjZFx1NzUyOFx1OGQ0NFx1NGVhNw0KLXJvYWRtYXBfdGV4dF9wbHVyYWw9XHU4ZGVmXHU3ZWJmXHU1NmZlDQotcm9sZURlc2NyaXB0b3JfdGV4dF9wbHVyYWw9XHU4OWQyXHU4MjcyXHU2M2NmXHU4ZmYwXHU3YjI2DQotcm9sZV90ZXh0X3BsdXJhbD1cdTg5ZDJcdTgyNzINCi1yb2xlU2V0X3RleHRfcGx1cmFsPVx1ODlkMlx1ODI3Mlx1OTZjNg0KLXJvbGVTZXRHcm91cGluZ190ZXh0X3BsdXJhbD1cdTg5ZDJcdTgyNzJcdTk2YzZcdTUyMDZcdTdlYzQNCi1zdGFuZGFyZENhdGVnb3J5X3RleHRfcGx1cmFsPVx1NjgwN1x1NTFjNlx1N2M3Ylx1NTIyYg0KLXN0ZXBfdGV4dF9wbHVyYWw9XHU2YjY1XHU5YWE0DQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHRfcGx1cmFsPVx1NjUyZlx1NjMwMVx1Njc1MFx1NjU5OQ0KLXRhc2tfdGV4dF9wbHVyYWw9XHU0ZWZiXHU1MmExDQotdGFza0Rlc2NyaXB0b3JfdGV4dF9wbHVyYWw9XHU0ZWZiXHU1MmExXHU2M2NmXHU4ZmYwXHU3YjI2DQotdGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw9XHU1NmUyXHU5NjFmXHU2OTgyXHU4OTgxXHU2NTg3XHU0ZWY2DQotdGVtcGxhdGVfdGV4dF9wbHVyYWw9XHU2YTIxXHU2NzdmDQotdGVybURlZmluaXRpb25fdGV4dF9wbHVyYWw9XHU2NzJmXHU4YmVkXHU1YjlhXHU0ZTQ5DQotdG9vbF90ZXh0X3BsdXJhbD1cdTVkZTVcdTUxNzcNCi10b29sTWVudG9yX3RleHRfcGx1cmFsPVx1NWRlNVx1NTE3N1x1NTQxMVx1NWJmYw0KLXdoaXRlcGFwZXJfdGV4dF9wbHVyYWw9XHU3NjdkXHU3NmFlXHU0ZTY2DQotd29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHRfcGx1cmFsPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NjNjZlx1OGZmMFx1N2IyNg0KLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0X3BsdXJhbD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTUxNDNcdTdkMjANCi13b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiDQotDQotIyBBcHBsaWNhdGlvbiB0aXRsZS4NCi1hcHBsaWNhdGlvbl90aXRsZT17MH0gXHVmZjBkIHsxfQ0KLQ0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1cdTYyNTNcdTVmMDBcdTY1YjlcdTZjZDVcdTVlOTMNCi1vcGVuTGlicmFyeURpYWxvZ0FyZWFfdGl0bGU9XHU5MDA5XHU2MmU5XHU2NWI5XHU2Y2Q1XHU1ZTkzDQotb3BlbkxpYnJhcnlEaWFsb2dBcmVhX3RleHQ9ezB9IFx1NWMwNlx1NjViOVx1NmNkNVx1NTQ4Y1x1NmQ0MVx1N2EwYlx1NWI1OFx1NTBhOFx1NTcyOFx1NzlmMFx1NGUzYVx1NjViOVx1NmNkNVx1NWU5M1x1NzY4NFxuXHU2NTg3XHU0ZWY2XHU1OTM5XHU0ZTJkXHUzMDAyXHU4YmY3XHU5MDA5XHU2MmU5XHU3NTI4XHU0ZThlXHU2YjY0XHU0ZjFhXHU4YmRkXHU3Njg0XHU2NWI5XHU2Y2Q1XHU1ZTkzXHU2NTg3XHU0ZWY2XHU1OTM5XHUzMDAyDQotbGlicmFyeUxhYmVsX3RleHQ9XHU1ZTkzXHVmZjFhDQotYnJvd3NlQnV0dG9uX3RleHQ9XHU2ZDRmXHU4OWM4Li4uDQotcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94X3RleHQ9XHU0ZjdmXHU3NTI4XHU1YjgzXHU0ZjVjXHU0ZTNhXHU3ZjNhXHU3NzAxXHU1MDNjXHVmZjBjXHU0ZWU1XHU1NDBlXHU0ZTBkXHU4OTgxXHU1MThkXHU4YmUyXHU5NWVlXHUzMDAyDQotb3BlbkxpYnJhcnlEaWFsb2dfbmV3TGlicmFyeV90ZXh0PVx1MjAxY3swfVx1MjAxZFx1NGUyZFx1NmNhMVx1NjcwOVx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMlxuXHU1YzA2XHU1NzI4XHU2MzA3XHU1YjlhXHU3NmVlXHU1ZjU1XHU0ZTNhXHU2MGE4XHU1MjFiXHU1ZWZhXHU1ZTc2XHU2MjUzXHU1ZjAwXHU2NWIwXHU2NWI5XHU2Y2Q1XHU1ZTkzXHUzMDAyXG5cblx1NTM1NVx1NTFmYlx1MjAxY1x1Nzg2ZVx1NWI5YVx1MjAxZFx1N2VlN1x1N2VlZFx1ZmYwY1x1NjIxNlx1NTM1NVx1NTFmYlx1MjAxY1x1NTNkNlx1NmQ4OFx1MjAxZFx1NjMwN1x1NWI5YVx1NTNlNlx1NGUwMFx1NGUyYVx1NjViOVx1NmNkNVx1NWU5M1x1OGRlZlx1NWY4NFx1MzAwMg0KLQ0KLSMgU2VsZWN0IE1ldGhvZCBMaWJyYXJ5IEZvbGRlciBEaWFsb2cNCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlPVx1OTAwOVx1NjJlOVx1NjViOVx1NmNkNVx1NWU5Mw0KLXNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGV4dD1cdTkwMDlcdTYyZTlcdTY1YjlcdTZjZDVcdTVlOTNcdTY1ODdcdTRlZjZcdTU5MzlcdTMwMDINCi0NCi0jIE9wZW4gTGlicmFyeSBQcm9ncmVzcyBNZXNzYWdlDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU2MjUzXHU1ZjAwXHU2NWI5XHU2Y2Q1XHU1ZTkzLi4uDQotDQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLWludmFsaWRMaWJyYXJ5UGF0aF9tc2c9SVVQTDAzMDBFOiBcdTY1ZTBcdTZjZDVcdTYyNTNcdTVmMDBcdTYzMDdcdTViOWFcdTc2ODRcdTY1YjlcdTZjZDVcdTVlOTNcdTMwMDINCi1pbnZhbGlkTGlicmFyeVBhdGhfcmVhc29uPVx1OTAwOVx1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1NWU5M1x1NjU4N1x1NGVmNlx1NTkzOVx1NjVlMFx1NjU0OFx1MzAwMVx1NGUwZFx1NWI1OFx1NTcyOFx1NjIxNlx1NjBhOFx1NmNhMVx1NjcwOVx1OTAwMlx1NWY1M1x1NzY4NFx1OGJiOFx1NTNlZlx1Njc0M1x1OGJiZlx1OTVlZVx1NmI2NFx1NjViOVx1NmNkNVx1NWU5M1x1NjU4N1x1NGVmNlx1NTkzOVx1MzAwMlxuXG5cdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdTc4NmVcdTViOWFcdTIwMWRcdWZmMGNcdTkwMDlcdTYyZTlcdTUzZTZcdTRlMDBcdTRlMmFcdTVlOTNcdTY1ODdcdTRlZjZcdTU5MzlcdTMwMDINCi0NCi0jIExpYnJhcnkgTG9ja2VkIEVycm9yIERpYWxvZw0KLWxpYnJhcnlMb2NrZWRfbXNnPUlVUEwwMzAzRTogXHU2NWUwXHU2Y2Q1XHU2MjUzXHU1ZjAwXHU2MzA3XHU1YjlhXHU3Njg0XHU2NWI5XHU2Y2Q1XHU1ZTkzXHUzMDAyXG5cblx1NGYzY1x1NGU0ZVx1NmI2M1x1NTcyOFx1NGY3Zlx1NzUyOFx1OTAwOVx1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMlx1NTM1NVx1NTFmYlx1MjAxY1x1NTNkNlx1NmQ4OFx1MjAxZFx1OTAwOVx1NjJlOVx1NTNlNlx1NGUwMFx1NGUyYVx1NWU5M1x1NjU4N1x1NGVmNlx1NTkzOVx1ZmYwY1x1NjIxNlx1NTM1NVx1NTFmYlx1MjAxY1x1NWYzYVx1NTIzNlx1NjI1M1x1NWYwMFx1MjAxZFx1ZmYwY1x1OGZkOVx1NjgzN1x1NjVlMFx1OGJiYVx1NTk4Mlx1NGY1NVx1OTBmZFx1NjI1M1x1NWYwMFx1NWU5M1x1MzAwMlxuXG5cdThiNjZcdTU0NGFcdWZmMWFcdTVlNzZcdTg4NGNcdTRmN2ZcdTc1MjhcdTY1YjlcdTZjZDVcdTVlOTNcdTUzZWZcdTgwZmRcdTRmMWFcdTYzNWZcdTU3NGZcdThiZTVcdTVlOTNcdTMwMDINCi1saWJyYXJ5TG9ja2VkX29wZW5CdXR0b25fdGV4dD1cdTVmM2FcdTUyMzZcdTYyNTNcdTVmMDANCi0NCi0jIFJlYWQtb25seSBQcm9qZWN0IEZpbGUgRXJyb3IgRGlhbG9nDQotcmVhZE9ubHlQcm9qZWN0RmlsZV90ZXh0PUlVUEwwMzAyRTogXHUyMDFjezB9XHUyMDFkXHU0ZTNhXHU1M2VhXHU4YmZiXHUzMDAyXHU4YmY3XHU1YzA2XHU1YjgzXHU4YmJlXHU0ZTNhXHU1M2VmXHU1MTk5XHVmZjBjXHU3MTM2XHU1NDBlXHU1MThkXHU3ZWU3XHU3ZWVkXHUzMDAyDQotcmV0cnlCdXR0b25fdGV4dD1cdTkxY2RcdThiZDUNCi1jYW5jZWxCdXR0b25fdGV4dD1cdTUzZDZcdTZkODgNCi0NCi0jIFZlcnNpb24gTWlzbWF0Y2ggRGlhbG9nDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHQ9SVVQTDMwNUU6IFx1NjVlMFx1NmNkNVx1NjI1M1x1NWYwMFx1OTAwOVx1NWI5YVx1NzY4NFx1NWU5M1x1MzAwMlx1NWZjNVx1OTg3Ylx1NWMwNiB7MH0gXHU1MzQ3XHU3ZWE3XHU1MjMwIFZ7MX0gXHU2MjE2XHU2NmY0XHU5YWQ4XHU3MjQ4XHU2NzJjXHU2MjRkXHU4MGZkXHU2MjUzXHU1ZjAwXHU4YmU1XHU1ZTkzXHUzMDAyDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHRfdW5rbm93bj1JVVBMMzA2RVx1ZmYxYVx1NjVlMFx1NmNkNVx1NjI1M1x1NWYwMFx1OTAwOVx1NWI5YVx1NzY4NFx1NWU5M1x1MzAwMlx1NWZjNVx1OTg3Ylx1NWMwNiB7MH0gXHU1MzQ3XHU3ZWE3XHU1MjMwXHU2NmY0XHU5YWQ4XHU3MjQ4XHU2NzJjXHU2MjRkXHU4MGZkXHU2MjUzXHU1ZjAwXHU4YmU1XHU1ZTkzXHUzMDAyDQotDQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1NTM0N1x1N2VhN1x1NjViOVx1NmNkNVx1NWU5Mw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RleHQ9XHU2MGE4XHU5MDA5XHU1YjlhXHU3Njg0XHU1ZTkzXHU5NzAwXHU4OTgxXHU1MzQ3XHU3ZWE3XHU1MjMwXHU2NWIwXHU3Njg0XHU1ZTkzXHU3ZWQzXHU2Nzg0XHUzMDAyXG5cblx1ODk4MVx1N2VlN1x1N2VlZFx1NTM0N1x1N2VhN1x1NTQxN1x1ZmYxZg0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU1MzQ3XHU3ZWE3XHU2NWI5XHU2Y2Q1XHU1ZTkzLi4uDQotDQotIyBVcGdyYWRlIExpYnJhcnkgRXJyb3IgRGlhbG9nDQotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQTDAzMDFFOiBcdTY3MmFcdTgwZmRcdTUzNDdcdTdlYTdcdTY1YjlcdTZjZDVcdTVlOTNcdTMwMDJcdThiZjdcdTUzYzJcdTk2MDVcdTY1ZTVcdTVmZDdcdTY1ODdcdTRlZjZcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi0jIFN3aXRjaCBDb25maWd1cmF0aW9uIERpYWxvZw0KLXN3aXRjaENvbmZpZ0RpYWxvZ190aXRsZT1cdTUyMDdcdTYzNjJcdTkxNGRcdTdmNmUNCi1zd2l0Y2hDb25maWdEaWFsb2dfdGV4dD1cdTY2MmZcdTU0MjZcdTg5ODFcdTVjMDZcdTVmNTNcdTUyNGRcdTkxNGRcdTdmNmVcdTUyMDdcdTYzNjJcdTRlM2FcdTRlMGVcdTkwMDlcdTViOWFcdTZkNDFcdTdhMGJcdTUxNzNcdTgwNTRcdTc2ODRcdTdmM2FcdTc3MDFcdTkxNGRcdTdmNmVcdTIwMWN7MH1cdTIwMWRcdWZmMWYNCi0JDQotIyBDb25maWd1cmF0aW9uIENvbWJvDQotY3VycmVudENvbmZpZ0xhYmVsX3RleHQ9XHU1ZjUzXHU1MjRkXHU5MTRkXHU3ZjZlXHVmZjFhDQotc2VsZWN0Q29uZmlnTGFiZWxfdGV4dD1cdTkwMDlcdTYyZTlcdTkxNGRcdTdmNmUNCi0NCi0jIERlbGV0ZSBGaWxlcyBDb25maXJtYXRpb24gTWVzc2FnZQ0KLWRlbGV0ZUZpbGVzQ29uZmlybWF0aW9uX21zZz1cdTYzMDdcdTViOWFcdThkZWZcdTVmODRcdTIwMWN7MH1cdTIwMWRcdTVkZjJcdTViNThcdTU3MjhcdTMwMDJcdTVjMDZcdTUyMjBcdTk2NjRcdThiZTVcdTY1ODdcdTRlZjZcdTU5MzlcdTRlMmRcdTc2ODRcdTYyNDBcdTY3MDlcdTY1ODdcdTRlZjZcdTMwMDJcdTY2MmZcdTU0MjZcdTg5ODFcdTdlZTdcdTdlZWRcdWZmMWYNCi0NCi0jIFBhdGhzL0ZpbGVzIEVycm9yIE1lc3NhZ2VzDQotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249XHU4ZGVmXHU1Zjg0XHUyMDFjezB9XHUyMDFkXHU1MzA1XHU1NDJiXHU0ZTAwXHU0ZTJhXHU2MjE2XHU1OTFhXHU0ZTJhXHU2NWUwXHU2Y2Q1XHU1MjIwXHU5NjY0XHU3Njg0XHU2NTg3XHU0ZWY2XHUzMDAyXG5cblx1OGJmN1x1OTAwOVx1NjJlOVx1NTNlNlx1NGUwMFx1NGUyYVx1OGRlZlx1NWY4NFx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLWNyZWF0ZVBhdGhFcnJvcl9yZWFzb249XHU2NWUwXHU2Y2Q1XHU1MjFiXHU1ZWZhXHU4ZGVmXHU1Zjg0XHUyMDFjezB9XHUyMDFkXHUzMDAyXG5cblx1OGJmN1x1OTAwOVx1NjJlOVx1NTNlNlx1NGUwMFx1NGUyYVx1OGRlZlx1NWY4NFx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLWludmFsaWRQYXRoX21zZz1cdTYzMDdcdTViOWFcdThkZWZcdTVmODRcdTY1ZTBcdTY1NDhcdTMwMDINCi0NCi0jIEJhY2t1cCBMaWJyYXJ5IERpYWxvZw0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGl0bGU9XHU1OTA3XHU0ZWZkXHU1ZTkzDQotYmFja3VwTGlicmFyeURpYWxvZ190ZXh0PVx1NWYzYVx1NzBjOFx1NWVmYVx1OGJhZVx1NTcyOFx1N2VlN1x1N2VlZFx1NjRjZFx1NGY1Y1x1NGU0Ylx1NTI0ZFx1NTkwN1x1NGVmZFx1NWY1M1x1NTI0ZFx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMlxuXG5cdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdTc4NmVcdTViOWFcdTIwMWRcdWZmMGNcdTU3MjhcdTYzMDdcdTViOWFcdTc2ZWVcdTVmNTVcdTRlMmRcdTUyMWJcdTVlZmFcdTVlOTNcdTc2ODRcdTU5MDdcdTRlZmRcdTUyNmZcdTY3MmNcdTMwMDJcdTUzNTVcdTUxZmJcdTIwMWNcdThkZjNcdThmYzdcdTIwMWRcdTUzZWZcdTdlZTdcdTdlZWRcdTY0Y2RcdTRmNWNcdWZmMGNcdTgwMGNcdTRlMGRcdTUyMWJcdTVlZmFcdTU5MDdcdTRlZmRcdTMwMDINCi1iYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NWVmYVx1N2FjYlx1NWU5M1x1NjU4N1x1NGVmNlx1NzY4NFx1NTkwN1x1NGVmZFx1NTI2Zlx1NjcyYyAuLi4NCi0NCi0jIFBhdGggU2VsZWN0aW9uIERpYWxvZw0KLXBhdGhTZWxlY3Rpb25FcnJvcl9tc2c9XHU2NWUwXHU2Y2Q1XHU1MjFiXHU1ZWZhXHU3NmVlXHU1ZjU1DQotb2tCdXR0b25fdGV4dD1cdTc4NmVcdTViOWENCi1za2lwQnV0dG9uX3RleHQ9XHU4ZGYzXHU4ZmM3DQotDQotIyBQcm9jZXNzIEVkaXRvciBwcmVmZXJlbmNlcw0KLWFsd2F5c0J1dHRvbl90ZXh0PVx1NTljYlx1N2VjOA0KLW5ldmVyQnV0dG9uX3RleHQ9XHU0ZWNlXHU0ZTBkDQotcHJvbXB0QnV0dG9uX3RleHQ9XHU2M2QwXHU3OTNhDQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1saW5rVG9VUkxfbmFtZT1VUkwNCi1saW5rVG9GaWxlX25hbWU9XHU2NTg3XHU0ZWY2DQotZWxlbWVudExpbmtfbmFtZT1cdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjANCi1lbGVtZW50TGlua1dpdGhUeXBlX25hbWU9XHU1ZTI2XHU2NzA5XHU3YzdiXHU1NzhiXHU1MjRkXHU3ZjAwXHU3Njg0XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwDQotZWxlbWVudExpbmtXaXRoVXNlclRleHRfbmFtZT1cdTVlMjZcdTY3MDlcdTViOWFcdTUyMzZcdTY1ODdcdTY3MmNcdTc2ODRcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjANCi0NCi0jIENvbnZlcnQgQWN0aXZpdHkgVHlwZSBEaWFsb2cNCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGl0bGU9XHU4ZjZjXHU2MzYyXHU2ZDNiXHU1MmE4XHU3YzdiXHU1NzhiDQotY29udmVydEFjdGl2aXR5RGlhbG9nX3RleHQ9XHU5MDA5XHU2MmU5XHU3NmVlXHU2ODA3XHU2ZDNiXHU1MmE4XHU3YzdiXHU1NzhiXHUzMDAyDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfbXNnPUlVUEwwMzA0RTogXHU2NWUwXHU2Y2Q1XHU1YzA2XHU2YjY0XHU2ZDNiXHU1MmE4XHU4ZjZjXHU2MzYyXHU0ZTNhXHU1M2U2XHU0ZTAwXHU3OWNkXHU3YzdiXHU1NzhiXHUzMDAyDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uPXswfSBcdTZjYTFcdTY3MDlcdTUxN2NcdTViYjlcdTc2ODRcdTZkM2JcdTUyYThcdTdjN2JcdTU3OGJcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ0ZDRhYWYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFNpbmd1bGFyKQ0KLWFjdGl2aXR5X3RleHQ9XHU2ZDNiXHU1MmQ1DQotYXJ0aWZhY3RfdGV4dD1cdTY5Y2JcdTRlZjYNCi1jYXBhYmlsaXR5UGF0dGVybl90ZXh0PVx1NTI5Zlx1ODBmZFx1NTc4Ylx1NmEyMw0KLWNoZWNrbGlzdF90ZXh0PVx1NjgzOFx1NWMwZFx1NmUwNVx1NTVhZQ0KLWNoZWNrSXRlbV90ZXh0PVx1NmFhMlx1NjdlNVx1OTgwNVx1NzZlZQ0KLWNvbXBvc2l0ZVJvbGVfdGV4dD1cdTg5MDdcdTU0MDhcdTg5ZDJcdTgyNzINCi1jb25jZXB0X3RleHQ9XHU2OTgyXHU1ZmY1DQotY29udGVudFBhY2thZ2VfdGV4dD1cdTUxNjdcdTViYjlcdTU5NTdcdTRlZjYNCi1jdXN0b21DYXRlZ29yeV90ZXh0PVx1ODFlYVx1OGEwMlx1N2EyZVx1OTg1ZQ0KLWRlbGl2ZXJhYmxlX3RleHQ9XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlDQotZGVsaXZlcnlQcm9jZXNzX3RleHQ9XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiDQotZGVzY3JpcHRvcl90ZXh0PVx1NjNjZlx1OGZmMFx1NWI1MA0KLWRpc2NpcGxpbmVfdGV4dD1cdTg5OGZcdTdiYzQNCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dD1cdTg5OGZcdTdiYzRcdTUyMDZcdTdkNDQNCi1kb21haW5fdGV4dD1cdTk4MThcdTU3ZGYNCi1lc3RpbWF0ZV90ZXh0PVx1OTgxMFx1NGYzMA0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dD1cdTk4MTBcdTRmMzBcdTZlMmNcdTkxY2ZcdTUwM2MNCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dD1cdTk4MTBcdTRmMzBcdTgwMDNcdTkxY2YNCi1leGFtcGxlX3RleHQ9XHU3YmM0XHU0ZjhiDQotZ3VpZGFuY2VfdGV4dD1cdTYzMDdcdTVmMTUNCi1ndWlkZWxpbmVfdGV4dD1cdTZlOTZcdTUyNDcNCi1pdGVyYXRpb25fdGV4dD1cdTUzY2RcdTg5ODYNCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHQ9XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotbWV0aG9kQ29udGVudF90ZXh0PVx1NjViOVx1NmNkNVx1NTE2N1x1NWJiOQ0KLW1ldGhvZExpYnJhcnlfdGV4dD1cdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWINCi1tZXRob2RQYWNrYWdlX3RleHQ9XHU2NWI5XHU2Y2Q1XHU1OTU3XHU0ZWY2DQotbWV0aG9kUGx1Z2luX3RleHQ9XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotbWlsZXN0b25lX3RleHQ9XHU3YmExXHU1MjM2XHU5ZWRlDQotb3V0Y29tZV90ZXh0PVx1OGYzOFx1NTFmYVx1N2Q1MFx1Njc5Yw0KLXBoYXNlX3RleHQ9XHU5NjhlXHU2YmI1DQotcHJhY3RpY2VfdGV4dD1cdTdkZjRcdTdmZDINCi1wcm9jZXNzX3RleHQ9XHU3YTBiXHU1ZThmDQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PVx1NWRlZVx1NzU3MFx1NmQ0MVx1N2EwYg0KLXByb2Nlc3NGYW1pbHlfdGV4dD1cdTdhMGJcdTVlOGZcdTdjZmJcdTUyMTcNCi1wcm9jZXNzUGFja2FnZV90ZXh0PVx1N2EwYlx1NWU4Zlx1NTk1N1x1NGVmNg0KLXJlcG9ydF90ZXh0PVx1NTgzMVx1NTQ0YQ0KLXJldXNhYmxlQXNzZXRfdGV4dD1cdTUzZWZcdTkxY2RcdTg5MDdcdTRmN2ZcdTc1MjhcdTc2ODRcdThjYzdcdTc1MjINCi1yb2FkbWFwX3RleHQ9XHU1YzBlXHU4OWJkXHU1NzE2DQotcm9sZURlc2NyaXB0b3JfdGV4dD1cdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTViNTANCi1yb2xlX3RleHQ9XHU4OWQyXHU4MjcyDQotcm9sZVNldF90ZXh0PVx1ODlkMlx1ODI3Mlx1OTZjNg0KLXJvbGVTZXRHcm91cGluZ190ZXh0PVx1ODlkMlx1ODI3Mlx1OTZjNlx1NTIwNlx1N2Q0NA0KLXN0YW5kYXJkQ2F0ZWdvcnlfdGV4dD1cdTZhMTlcdTZlOTZcdTdhMmVcdTk4NWUNCi1zdGVwX3RleHQ9XHU2YjY1XHU5YTVmDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9XHU2NTJmXHU2M2Y0XHU4Y2M3XHU2NTk5DQotdGFza190ZXh0PVx1NGY1Y1x1Njk2ZA0KLXRhc2tEZXNjcmlwdG9yX3RleHQ9XHU0ZjVjXHU2OTZkXHU2M2NmXHU4ZmYwXHU1YjUwDQotdGVhbVByb2ZpbGVfdGV4dD1cdTU3MThcdTk2OGFcdThhMmRcdTViOWFcdTZhOTQNCi10ZW1wbGF0ZV90ZXh0PVx1N2JjNFx1NjcyYw0KLXRlcm1EZWZpbml0aW9uX3RleHQ9XHU4YTVlXHU1ZjU5XHU1YjlhXHU3ZmE5DQotdG9vbF90ZXh0PVx1NWRlNVx1NTE3Nw0KLXRvb2xNZW50b3JfdGV4dD1cdTVkZTVcdTUxNzdcdThmMTRcdTUyYTkNCi13aGl0ZXBhcGVyX3RleHQ9XHU3NjdkXHU3NmFlXHU2NmY4DQotd29ya1Byb2R1Y3RfdGV4dD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCi13b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTYzY2ZcdThmZjBcdTViNTANCi13b3JrUHJvZHVjdEVsZW1lbnRfdGV4dD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTUxNDNcdTdkMjANCi13b3JrUHJvZHVjdFR5cGVfdGV4dD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTk4NWVcdTU3OGINCi0NCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChQbHVyYWwpDQotYWN0aXZpdHlfdGV4dF9wbHVyYWw9XHU2ZDNiXHU1MmQ1DQotYXJ0aWZhY3RfdGV4dF9wbHVyYWw9XHU2OWNiXHU0ZWY2DQotY2FwYWJpbGl0eVBhdHRlcm5fdGV4dF9wbHVyYWw9XHU1MjlmXHU4MGZkXHU1NzhiXHU2YTIzDQotY2hlY2tsaXN0X3RleHRfcGx1cmFsPVx1NjgzOFx1NWMwZFx1NmUwNVx1NTVhZQ0KLWNoZWNrSXRlbV90ZXh0X3BsdXJhbD1cdTZhYTJcdTY3ZTVcdTk4MDVcdTc2ZWUNCi1jb21wb3NpdGVSb2xlX3RleHRfcGx1cmFsPVx1ODkwN1x1NTQwOFx1ODlkMlx1ODI3Mg0KLWNvbmNlcHRfdGV4dF9wbHVyYWw9XHU2OTgyXHU1ZmY1DQotY29udGVudFBhY2thZ2VfdGV4dF9wbHVyYWw9XHU1MTY3XHU1YmI5XHU1OTU3XHU0ZWY2DQotY3VzdG9tQ2F0ZWdvcnlfdGV4dF9wbHVyYWw9XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlDQotZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw9XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlDQotZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsPVx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYg0KLWRlc2NyaXB0b3JfdGV4dF9wbHVyYWw9XHU2M2NmXHU4ZmYwXHU1YjUwDQotZGlzY2lwbGluZV90ZXh0X3BsdXJhbD1cdTg5OGZcdTdiYzQNCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dF9wbHVyYWw9XHU4OThmXHU3YmM0XHU1MjA2XHU3ZDQ0DQotZG9tYWluX3RleHRfcGx1cmFsPVx1OTgxOFx1NTdkZg0KLWVzdGltYXRlX3RleHRfcGx1cmFsPVx1OTgxMFx1NGYzMA0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw9XHU5ODEwXHU0ZjMwXHU2ZTJjXHU5MWNmXHU1MDNjDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHRfcGx1cmFsPVx1OTgxMFx1NGYzMFx1ODAwM1x1OTFjZg0KLWV4YW1wbGVfdGV4dF9wbHVyYWw9XHU3YmM0XHU0ZjhiDQotZ3VpZGFuY2VfdGV4dF9wbHVyYWw9XHU2MzA3XHU1ZjE1DQotZ3VpZGVsaW5lX3RleHRfcGx1cmFsPVx1NmU5Nlx1NTI0Nw0KLWl0ZXJhdGlvbl90ZXh0X3BsdXJhbD1cdTUzY2RcdTg5ODYNCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsPVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLW1ldGhvZENvbnRlbnRfdGV4dF9wbHVyYWw9XHU2NWI5XHU2Y2Q1XHU1MTY3XHU1YmI5DQotbWV0aG9kTGlicmFyeV90ZXh0X3BsdXJhbD1cdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWINCi1tZXRob2RQYWNrYWdlX3RleHRfcGx1cmFsPVx1NjViOVx1NmNkNVx1NTk1N1x1NGVmNg0KLW1ldGhvZFBsdWdpbl90ZXh0X3BsdXJhbD1cdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYNCi1taWxlc3RvbmVfdGV4dF9wbHVyYWw9XHU5MWNjXHU3YTBiXHU3ODkxDQotb3V0Y29tZV90ZXh0X3BsdXJhbD1cdThmMzhcdTUxZmFcdTdkNTBcdTY3OWMNCi1waGFzZV90ZXh0X3BsdXJhbD1cdTk2OGVcdTZiYjUNCi1wcmFjdGljZV90ZXh0X3BsdXJhbD1cdTdkZjRcdTdmZDINCi1wcm9jZXNzX3RleHRfcGx1cmFsPVx1N2EwYlx1NWU4Zg0KLXByb2Nlc3NDb250cmlidXRpb25fdGV4dF9wbHVyYWw9XHU1ZGVlXHU3NTcwXHU2ZDQxXHU3YTBiDQotcHJvY2Vzc0ZhbWlseV90ZXh0X3BsdXJhbD1cdTdhMGJcdTVlOGZcdTdjZmJcdTUyMTcNCi1wcm9jZXNzUGFja2FnZV90ZXh0X3BsdXJhbD1cdTdhMGJcdTVlOGZcdTU5NTdcdTRlZjYNCi1yZXBvcnRfdGV4dF9wbHVyYWw9XHU1ODMxXHU1NDRhDQotcmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbD1cdTUzZWZcdTkxY2RcdTg5MDdcdTRmN2ZcdTc1MjhcdTc2ODRcdThjYzdcdTc1MjINCi1yb2FkbWFwX3RleHRfcGx1cmFsPVx1NWMwZVx1ODliZFx1NTcxNg0KLXJvbGVEZXNjcmlwdG9yX3RleHRfcGx1cmFsPVx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1NWI1MA0KLXJvbGVfdGV4dF9wbHVyYWw9XHU4OWQyXHU4MjcyDQotcm9sZVNldF90ZXh0X3BsdXJhbD1cdTg5ZDJcdTgyNzJcdTk2YzYNCi1yb2xlU2V0R3JvdXBpbmdfdGV4dF9wbHVyYWw9XHU4OWQyXHU4MjcyXHU5NmM2XHU1MjA2XHU3ZDQ0DQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0X3BsdXJhbD1cdTZhMTlcdTZlOTZcdTdhMmVcdTk4NWUNCi1zdGVwX3RleHRfcGx1cmFsPVx1NmI2NVx1OWE1Zg0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0X3BsdXJhbD1cdTY1MmZcdTYzZjRcdThjYzdcdTY1OTkNCi10YXNrX3RleHRfcGx1cmFsPVx1NGY1Y1x1Njk2ZA0KLXRhc2tEZXNjcmlwdG9yX3RleHRfcGx1cmFsPVx1NGY1Y1x1Njk2ZFx1NjNjZlx1OGZmMFx1NWI1MA0KLXRlYW1Qcm9maWxlX3RleHRfcGx1cmFsPVx1NTcxOFx1OTY4YVx1OGEyZFx1NWI5YVx1NmE5NA0KLXRlbXBsYXRlX3RleHRfcGx1cmFsPVx1N2JjNFx1NjcyYw0KLXRlcm1EZWZpbml0aW9uX3RleHRfcGx1cmFsPVx1OGE1ZVx1NWY1OVx1NWI5YVx1N2ZhOQ0KLXRvb2xfdGV4dF9wbHVyYWw9XHU1ZGU1XHU1MTc3DQotdG9vbE1lbnRvcl90ZXh0X3BsdXJhbD1cdTVkZTVcdTUxNzdcdThmMTRcdTUyYTkNCi13aGl0ZXBhcGVyX3RleHRfcGx1cmFsPVx1NzY3ZFx1NzZhZVx1NjZmOA0KLXdvcmtQcm9kdWN0X3RleHRfcGx1cmFsPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLXdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTYzY2ZcdThmZjBcdTViNTANCi13b3JrUHJvZHVjdEVsZW1lbnRfdGV4dF9wbHVyYWw9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU1MTQzXHU3ZDIwDQotd29ya1Byb2R1Y3RUeXBlX3RleHRfcGx1cmFsPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1OTg1ZVx1NTc4Yg0KLQ0KLSMgQXBwbGljYXRpb24gdGl0bGUuDQotYXBwbGljYXRpb25fdGl0bGU9ezB9IC0gezF9DQotDQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlPVx1OTU4Ylx1NTU1Zlx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYg0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90aXRsZT1cdTkwNzhcdTUzZDZcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWINCi1vcGVuTGlicmFyeURpYWxvZ0FyZWFfdGV4dD17MH0gXHU2NzAzXHU1YzA3XHU2NWI5XHU2Y2Q1XHU1NDhjXHU3YTBiXHU1ZThmXHU1MTMyXHU1YjU4XHU1NzI4XHU4Y2M3XHU2NTk5XHU1OTNlXHVmZjBjXHU2YjY0XHU4Y2M3XHU2NTk5XHU1OTNlXHU3YTMxXHU3MGJhXG5cdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMDJcdThhY2JcdTkwNzhcdTUzZDZcdTZiNjRcdTk2OGVcdTZiYjVcdTRmNWNcdTY5NmRcdTRmN2ZcdTc1MjhcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdThjYzdcdTY1OTlcdTU5M2VcdTMwMDINCi1saWJyYXJ5TGFiZWxfdGV4dD1cdTdhMGJcdTVmMGZcdTVlYWJcdWZmMWENCi1icm93c2VCdXR0b25fdGV4dD1cdTcwMGZcdTg5YmQuLi4NCi1wcm9tcHRGb3JMaWJyYXJ5Q2hlY2tib3hfdGV4dD1cdTRlZTVcdTZiNjRcdTcwYmFcdTk4MTBcdThhMmRcdTUwM2NcdWZmMGNcdTRlMGRcdTg5ODFcdTUxOGRcdThhNjJcdTU1NGZcdTMwMDINCi1vcGVuTGlicmFyeURpYWxvZ19uZXdMaWJyYXJ5X3RleHQ9Jyd7MH0nJyBcdTRlMGFcdTZjOTJcdTY3MDlcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMDJcblx1NWMwN1x1NTcyOFx1NjMwN1x1NWI5YVx1NzY4NFx1NzZlZVx1OTMwNFx1NGUyZFx1NWVmYVx1N2FjYlx1NGUyNlx1OTU4Ylx1NTU1Zlx1NjViMFx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1MzAwMlxuXG5cdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTc4YmFcdTViOWFcdTMwMGRcdWZmMGNcdTYyMTZcdTYzMDlcdTMwMGNcdTUzZDZcdTZkODhcdTMwMGRcdTRlMjZcdTYzMDdcdTViOWFcdTUzZTZcdTRlMDBcdTUwMGJcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdThkZWZcdTVmOTFcdTMwMDINCi0NCi0jIFNlbGVjdCBNZXRob2QgTGlicmFyeSBGb2xkZXIgRGlhbG9nDQotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190aXRsZT1cdTkwNzhcdTUzZDZcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWINCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RleHQ9XHU5MDc4XHU1M2Q2XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU4Y2M3XHU2NTk5XHU1OTNlXHUzMDAyDQotDQotIyBPcGVuIExpYnJhcnkgUHJvZ3Jlc3MgTWVzc2FnZQ0KLW9wZW5pbmdMaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1OTU4Ylx1NTU1Zlx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYi4uLg0KLQ0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBFcnJvciBEaWFsb2cNCi1pbnZhbGlkTGlicmFyeVBhdGhfbXNnPUlVUEwwMzAwRTogXHU3MTIxXHU2Y2Q1XHU5NThiXHU1NTVmXHU2MzA3XHU1YjlhXHU3Njg0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHUzMDAyDQotaW52YWxpZExpYnJhcnlQYXRoX3JlYXNvbj1cdTkwNzhcdTUzZDZcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdThjYzdcdTY1OTlcdTU5M2VcdTcxMjFcdTY1NDhcdTMwMDFcdTRlMGRcdTViNThcdTU3MjhcdTYyMTZcdTYwYThcdTZjOTJcdTY3MDlcdTkwNjlcdTc1NzZcdTc2ODRcdTViNThcdTUzZDZcdTZiMGFcdTk2NTBcdTMwMDJcblxuXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU3OGJhXHU1YjlhXHUzMDBkXHVmZjBjXHU5MDc4XHU1M2Q2XHU1M2U2XHU0ZTAwXHU1MDBiXHU3YTBiXHU1ZjBmXHU1ZWFiXHU4Y2M3XHU2NTk5XHU1OTNlXHUzMDAyDQotDQotIyBMaWJyYXJ5IExvY2tlZCBFcnJvciBEaWFsb2cNCi1saWJyYXJ5TG9ja2VkX21zZz1JVVBMMDMwM0U6IFx1NzEyMVx1NmNkNVx1OTU4Ylx1NTU1Zlx1NjMwN1x1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1MzAwMlxuXG5cdTkwNzhcdTUzZDZcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTk4NmZcdTc5M2FcdTZiNjNcdTU3MjhcdTRmN2ZcdTc1MjhcdTRlMmRcdTMwMDJcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTUzZDZcdTZkODhcdTMwMGRcdTRmODZcdTkwNzhcdTUzZDZcdTUzZTZcdTRlMDBcdTUwMGJcdTdhMGJcdTVmMGZcdTVlYWJcdThjYzdcdTY1OTlcdTU5M2VcdWZmMGNcdTU5ODJcdTY3OWNcdTRlMDBcdTViOWFcdTg5ODFcdTk1OGJcdTU1NWZcdTdhMGJcdTVmMGZcdTVlYWJcdWZmMGNcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTVmMzdcdTUyMzZcdTk1OGJcdTU1NWZcdTMwMGRcdTMwMDJcblxuXHU4YjY2XHU1NDRhXHVmZjFhXHU0ZTI2XHU4ODRjXHU0ZjdmXHU3NTI4XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1M2VmXHU4MGZkXHU1YzBlXHU4MWY0XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2YmMwXHU2NDBkXHUzMDAyDQotbGlicmFyeUxvY2tlZF9vcGVuQnV0dG9uX3RleHQ9XHU1ZjM3XHU1MjM2XHU5NThiXHU1NTVmDQotDQotIyBSZWFkLW9ubHkgUHJvamVjdCBGaWxlIEVycm9yIERpYWxvZw0KLXJlYWRPbmx5UHJvamVjdEZpbGVfdGV4dD1JVVBMMDMwMkU6ICcnezB9JycgXHU2NjJmXHU1NTJmXHU4YjgwXHU3Njg0XHUzMDAyXHU3ZTdjXHU3ZThjXHU0ZTRiXHU1MjRkXHVmZjBjXHU4YWNiXHU1MTQ4XHU4YTJkXHU3MGJhXHU1M2VmXHU1YmViXHU1MTY1XHUzMDAyDQotcmV0cnlCdXR0b25fdGV4dD1cdTkxY2RcdThhNjYNCi1jYW5jZWxCdXR0b25fdGV4dD1cdTUzZDZcdTZkODgNCi0NCi0jIFZlcnNpb24gTWlzbWF0Y2ggRGlhbG9nDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHQ9SVVQTDMwNUU6IFx1NzEyMVx1NmNkNVx1OTU4Ylx1NTU1Zlx1OTA3OFx1NTNkNlx1NzY4NFx1N2EwYlx1NWYwZlx1NWVhYlx1MzAwMlx1NjBhOFx1NWZjNVx1OTgwOFx1NWMwNyB7MH0gXHU1MzQ3XHU3ZDFhXHU1MjMwIHsxfSBcdTcyNDhcdTYyMTZcdTY2ZjRcdTY1YjBcdTc2ODRcdTcyNDhcdTY3MmNcdWZmMGNcdTYyNGRcdTgwZmRcdTk1OGJcdTU1NWZcdTkwMTlcdTUwMGJcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duPUlVUEwzMDZFOiBcdTcxMjFcdTZjZDVcdTk1OGJcdTU1NWZcdTkwNzhcdTUzZDZcdTc2ODRcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMDJcdTYwYThcdTVmYzVcdTk4MDhcdTVjMDcgezB9IFx1NTM0N1x1N2QxYVx1NTIzMFx1NjZmNFx1NjViMFx1NzY4NFx1NzI0OFx1NjcyY1x1ZmYwY1x1NjI0ZFx1ODBmZFx1OTU4Ylx1NTU1Zlx1OTAxOVx1NTAwYlx1N2EwYlx1NWYwZlx1NWVhYlx1MzAwMg0KLQ0KLSMgVXBncmFkZSBNZXRob2QgTGlicmFyeSBEaWFsb2cNCi11cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZT1cdTUzNDdcdTdkMWFcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWINCi11cGdyYWRlTGlicmFyeURpYWxvZ190ZXh0PVx1NjBhOFx1OTA3OFx1NTNkNlx1NzY4NFx1N2EwYlx1NWYwZlx1NWVhYlx1NWZjNVx1OTgwOFx1NTM0N1x1N2QxYVx1NTIzMFx1NjViMFx1NzY4NFx1N2EwYlx1NWYwZlx1NWVhYlx1N2Q1MFx1NjljYlx1MzAwMlxuXG5cdTg5ODFcdTdlN2NcdTdlOGNcdTUzNDdcdTdkMWFcdTU1Y2VcdWZmMWYNCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTM0N1x1N2QxYVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYi4uLg0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEwwMzAxRTogXHU3MTIxXHU2Y2Q1XHU1MzQ3XHU3ZDFhXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHUzMDAyXHU1OTgyXHU5NzAwXHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHVmZjBjXHU4YWNiXHU1M2MzXHU5NWIxXHU2NWU1XHU4YThjXHU2YTk0XHUzMDAyDQotDQotIyBTd2l0Y2ggQ29uZmlndXJhdGlvbiBEaWFsb2cNCi1zd2l0Y2hDb25maWdEaWFsb2dfdGl0bGU9XHU1MjA3XHU2M2RiXHU5MTRkXHU3ZjZlDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RleHQ9XHU2MGE4XHU4OTgxXHU1ZjllXHU3M2ZlXHU4ODRjXHU5MTRkXHU3ZjZlXHU1MjA3XHU2M2RiXHU4MWYzXHU5MDc4XHU1YjlhXHU3YTBiXHU1ZThmXHU3NmY4XHU5NWRjXHU3Njg0XHU5ODEwXHU4YTJkXHU5MTRkXHU3ZjZlICcnezB9JycgXHU1NWNlXHVmZjFmDQotCQ0KLSMgQ29uZmlndXJhdGlvbiBDb21ibw0KLWN1cnJlbnRDb25maWdMYWJlbF90ZXh0PVx1NzNmZVx1ODg0Y1x1OTE0ZFx1N2Y2ZVx1ZmYxYQ0KLXNlbGVjdENvbmZpZ0xhYmVsX3RleHQ9XHU5MDc4XHU1M2Q2XHU5MTRkXHU3ZjZlDQotDQotIyBEZWxldGUgRmlsZXMgQ29uZmlybWF0aW9uIE1lc3NhZ2UNCi1kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2c9XHU2MzA3XHU1YjlhXHU3Njg0XHU4ZGVmXHU1ZjkxICcnezB9JycgXHU1ZGYyXHU1YjU4XHU1NzI4XHUzMDAyXHU1YzA3XHU1MjJhXHU5NjY0XHU4Y2M3XHU2NTk5XHU1OTNlXHU0ZTJkXHU3Njg0XHU2MjQwXHU2NzA5XHU2YTk0XHU2ODQ4XHUzMDAyXHU4OTgxXHU3ZTdjXHU3ZThjXHU1NWNlXHVmZjFmDQotDQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcw0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVx1OGRlZlx1NWY5MSAnJ3swfScnIFx1NTMwNVx1NTQyYlx1NGUwMFx1NjIxNlx1NTkxYVx1NTAwYlx1NzEyMVx1NmNkNVx1NTIyYVx1OTY2NFx1NzY4NFx1NmE5NFx1Njg0OFx1MzAwMlxuXG5cdThhY2JcdTkwNzhcdTUzZDZcdTUzZTZcdTRlMDBcdTUwMGJcdThkZWZcdTVmOTFcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi1jcmVhdGVQYXRoRXJyb3JfcmVhc29uPVx1NzEyMVx1NmNkNVx1NWVmYVx1N2FjYlx1OGRlZlx1NWY5MSAnJ3swfScnXHUzMDAyXG5cblx1OGFjYlx1OTA3OFx1NTNkNlx1NTNlNlx1NGUwMFx1NTAwYlx1OGRlZlx1NWY5MVx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLWludmFsaWRQYXRoX21zZz1cdTYzMDdcdTViOWFcdTc2ODRcdThkZWZcdTVmOTFcdTcxMjFcdTY1NDhcdTMwMDINCi0NCi0jIEJhY2t1cCBMaWJyYXJ5IERpYWxvZw0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGl0bGU9XHU1MDk5XHU0ZWZkXHU3YTBiXHU1ZjBmXHU1ZWFiDQotYmFja3VwTGlicmFyeURpYWxvZ190ZXh0PVx1N2U3Y1x1N2U4Y1x1NGU0Ylx1NTI0ZFx1ZmYwY1x1NWYzN1x1NzBjOFx1NWVmYVx1OGI3MFx1NjBhOFx1NTA5OVx1NGVmZFx1NzNmZVx1ODg0Y1x1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1MzAwMlxuXG5cdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTc4YmFcdTViOWFcdTMwMGRcdWZmMGNcdTUzZWZcdTRlZTVcdTU3MjhcdTYzMDdcdTViOWFcdTc2ODRcdTc2ZWVcdTkzMDRcdTRlMmRcdTVlZmFcdTdhY2JcdTdhMGJcdTVmMGZcdTVlYWJcdTc2ODRcdTUwOTlcdTRlZmRcdTMwMDJcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdThkZjNcdTkwNGVcdTMwMGRcdTUzZWZcdTdlN2NcdTdlOGNcdWZmMGNcdTRmNDZcdTRlMGRcdTVlZmFcdTdhY2JcdTUwOTlcdTRlZmRcdTMwMDINCi1iYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NWVmYVx1N2FjYlx1N2EwYlx1NWYwZlx1NWVhYlx1NmE5NFx1Njg0OFx1NzY4NFx1NTA5OVx1NGVmZC4uLg0KLQ0KLSMgUGF0aCBTZWxlY3Rpb24gRGlhbG9nDQotcGF0aFNlbGVjdGlvbkVycm9yX21zZz1cdTcxMjFcdTZjZDVcdTVlZmFcdTdhY2JcdTc2ZWVcdTkzMDQNCi1va0J1dHRvbl90ZXh0PVx1NzhiYVx1NWI5YQ0KLXNraXBCdXR0b25fdGV4dD1cdThkZjNcdTkwNGUNCi0NCi0jIFByb2Nlc3MgRWRpdG9yIHByZWZlcmVuY2VzDQotYWx3YXlzQnV0dG9uX3RleHQ9XHU0ZTAwXHU1ZjhiDQotbmV2ZXJCdXR0b25fdGV4dD1cdTdkNTVcdTRlMGQNCi1wcm9tcHRCdXR0b25fdGV4dD1cdTYzZDBcdTc5M2ENCi0NCi0jIEFkZCBMaW5rIERpYWxvZw0KLWxpbmtUb1VSTF9uYW1lPVVSTA0KLWxpbmtUb0ZpbGVfbmFtZT1cdTZhOTRcdTY4NDgNCi1lbGVtZW50TGlua19uYW1lPVx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMA0KLWVsZW1lbnRMaW5rV2l0aFR5cGVfbmFtZT1cdTUxNzdcdTY3MDlcdTk4NWVcdTU3OGJcdTViNTdcdTk5OTZcdTc2ODRcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjANCi1lbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lPVx1NTE3N1x1NjcwOVx1ODFlYVx1OGEwMlx1NjU4N1x1NWI1N1x1NzY4NFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMA0KLQ0KLSMgQ29udmVydCBBY3Rpdml0eSBUeXBlIERpYWxvZw0KLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190aXRsZT1cdThmNDlcdTYzZGJcdTZkM2JcdTUyZDVcdTk4NWVcdTU3OGINCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGV4dD1cdTkwNzhcdTUzZDZcdTc2ZWVcdTZhMTlcdTZkM2JcdTUyZDVcdTk4NWVcdTU3OGJcdTMwMDINCi11bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9tc2c9SVVQTDAzMDRFOiBcdTZiNjRcdTZkM2JcdTUyZDVcdTcxMjFcdTZjZDVcdThmNDlcdTYzZGJcdTcwYmFcdTUzZTZcdTRlMDBcdTdhMmVcdTk4NWVcdTU3OGJcdTMwMDINCi11bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9yZWFzb249ezB9XHU2YzkyXHU2NzA5XHU3NmY4XHU1YmI5XHU3Njg0XHU2ZDNiXHU1MmQ1XHU5ODVlXHU1NzhiXHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxYzVlYjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjMWUyNWIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBMaWJyYXJ5IFVJIChOTDIpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMi9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjU0ZmNhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTEwOGU2NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9XHUwNDExXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIEVQRiAtIFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0NDRcdTA0MzVcdTA0MzlcdTA0NDENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IE1ldGhvZCBMaWJyYXJ5IFBhdGguDQotbGlicmFyeVBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9NZXRob2QgTGlicmFyaWVzL2xpYnJhcnkxDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMzUyZmI1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChTaW5ndWxhcikNCi1hY3Rpdml0eV90ZXh0PVx1MDQxZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLWFydGlmYWN0X3RleHQ9XHUwNDEwXHUwNDQwXHUwNDQyXHUwNDM1XHUwNDQ0XHUwNDMwXHUwNDNhXHUwNDQyDQotY2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2QgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotY2hlY2tsaXN0X3RleHQ9XHUwNDIxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzMA0KLWNoZWNrSXRlbV90ZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDQyXHUwNDMwXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDQ2XHUwNDRiDQotY29tcG9zaXRlUm9sZV90ZXh0PVx1MDQyMVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGMNCi1jb25jZXB0X3RleHQ9XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQ2XHUwNDM1XHUwNDNmXHUwNDQ2XHUwNDM4XHUwNDRmDQotY29udGVudFBhY2thZ2VfdGV4dD1cdTA0MWZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDIgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyDQotY3VzdG9tQ2F0ZWdvcnlfdGV4dD1cdTA0MWZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDRmDQotZGVsaXZlcmFibGVfdGV4dD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyDQotZGVsaXZlcnlQcm9jZXNzX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzOA0KLWRlc2NyaXB0b3JfdGV4dD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDANCi1kaXNjaXBsaW5lX3RleHQ9XHUwNDE0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDMwDQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ9XHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDMwIFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZA0KLWRvbWFpbl90ZXh0PVx1MDQxNFx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZA0KLWVzdGltYXRlX3RleHQ9XHUwNDFlXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDNhXHUwNDMwDQotZXN0aW1hdGluZ01ldHJpY190ZXh0PVx1MDQxZlx1MDQzZVx1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0YyBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0MzgNCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dD1cdTA0MjBcdTA0MzVcdTA0M2FcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDNlIFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQzZFx1MDQzYVx1MDQzNQ0KLWV4YW1wbGVfdGV4dD1cdTA0MWZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0NDANCi1ndWlkYW5jZV90ZXh0PVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLWd1aWRlbGluZV90ZXh0PVx1MDQyMFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLWl0ZXJhdGlvbl90ZXh0PVx1MDQxOFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLW1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotbWV0aG9kQ29udGVudF90ZXh0PVx1MDQxY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0YiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1tZXRob2RMaWJyYXJ5X3RleHQ9XHUwNDExXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLW1ldGhvZFBhY2thZ2VfdGV4dD1cdTA0MWZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotbWV0aG9kUGx1Z2luX3RleHQ9XHUwNDFjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLW1pbGVzdG9uZV90ZXh0PVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2FcdTA0MzANCi1vdXRjb21lX3RleHQ9XHUwNDE4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0DQotcGhhc2VfdGV4dD1cdTA0MmRcdTA0NDJcdTA0MzBcdTA0M2YNCi1wcmFjdGljZV90ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzMCBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1wcm9jZXNzX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxDQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PVx1MDQxNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2EgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDQzDQotcHJvY2Vzc0ZhbWlseV90ZXh0PVx1MDQyMVx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0MzINCi1wcm9jZXNzUGFja2FnZV90ZXh0PVx1MDQxZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0MzINCi1yZXBvcnRfdGV4dD1cdTA0MWVcdTA0NDJcdTA0NDdcdTA0MzVcdTA0NDINCi1yZXVzYWJsZUFzc2V0X3RleHQ9XHUwNDFjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MQ0KLXJvYWRtYXBfdGV4dD1cdTA0MWZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGMNCi1yb2xlRGVzY3JpcHRvcl90ZXh0PVx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzgNCi1yb2xlX3RleHQ9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDRjDQotcm9sZVNldF90ZXh0PVx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1yb2xlU2V0R3JvdXBpbmdfdGV4dD1cdTA0MTNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGIgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOQ0KLXN0YW5kYXJkQ2F0ZWdvcnlfdGV4dD1cdTA0MjFcdTA0NDJcdTA0MzBcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDRmDQotc3RlcF90ZXh0PVx1MDQyOFx1MDQzMFx1MDQzMw0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PVx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0NGINCi10YXNrX3RleHQ9XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDMwDQotdGFza0Rlc2NyaXB0b3JfdGV4dD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotdGVhbVByb2ZpbGVfdGV4dD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiDQotdGVtcGxhdGVfdGV4dD1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2QNCi10ZXJtRGVmaW5pdGlvbl90ZXh0PVx1MDQxZVx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0M2NcdTA0MzhcdTA0M2RcdTA0MzANCi10b29sX3RleHQ9XHUwNDE4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotdG9vbE1lbnRvcl90ZXh0PVx1MDQyMFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzZSBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDQzDQotd2hpdGVwYXBlcl90ZXh0PVx1MDQxOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzZVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0MzFcdTA0NGVcdTA0M2JcdTA0M2JcdTA0MzVcdTA0NDJcdTA0MzVcdTA0M2RcdTA0NGMNCi13b3JrUHJvZHVjdF90ZXh0PVx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDINCi13b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzANCi13b3JrUHJvZHVjdFR5cGVfdGV4dD1cdTA0MjJcdTA0MzhcdTA0M2YgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFBsdXJhbCkNCi1hY3Rpdml0eV90ZXh0X3BsdXJhbD1cdTA0MWVcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1hcnRpZmFjdF90ZXh0X3BsdXJhbD1cdTA0MTBcdTA0NDBcdTA0NDJcdTA0MzVcdTA0NDRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0NGINCi1jYXBhYmlsaXR5UGF0dGVybl90ZXh0X3BsdXJhbD1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0NGIgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotY2hlY2tsaXN0X3RleHRfcGx1cmFsPVx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0NGINCi1jaGVja0l0ZW1fdGV4dF9wbHVyYWw9XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0NGINCi1jb21wb3NpdGVSb2xlX3RleHRfcGx1cmFsPVx1MDQyMVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzgNCi1jb25jZXB0X3RleHRfcGx1cmFsPVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0Nlx1MDQzNVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOA0KLWNvbnRlbnRQYWNrYWdlX3RleHRfcGx1cmFsPVx1MDQxZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzINCi1jdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbD1cdTA0MWZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4DQotZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw9XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0X3BsdXJhbD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0NGIgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDM4DQotZGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGINCi1kaXNjaXBsaW5lX3RleHRfcGx1cmFsPVx1MDQxNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQ0Yg0KLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0X3BsdXJhbD1cdTA0MTNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGIgXHUwNDM0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkDQotZG9tYWluX3RleHRfcGx1cmFsPVx1MDQxNFx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Yg0KLWVzdGltYXRlX3RleHRfcGx1cmFsPVx1MDQxZVx1MDQ0Nlx1MDQzNVx1MDQzZFx1MDQzYVx1MDQzOA0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw9XHUwNDFmXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0MzgNCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dF9wbHVyYWw9XHUwNDIwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQzZSBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0MzUNCi1leGFtcGxlX3RleHRfcGx1cmFsPVx1MDQxZlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0MFx1MDQ0Yg0KLWd1aWRhbmNlX3RleHRfcGx1cmFsPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLWd1aWRlbGluZV90ZXh0X3BsdXJhbD1cdTA0MjBcdTA0MzVcdTA0M2FcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1pdGVyYXRpb25fdGV4dF9wbHVyYWw9XHUwNDE4XHUwNDQyXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0X3BsdXJhbD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotbWV0aG9kQ29udGVudF90ZXh0X3BsdXJhbD1cdTA0MWNcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0NGIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotbWV0aG9kTGlicmFyeV90ZXh0X3BsdXJhbD1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotbWV0aG9kUGFja2FnZV90ZXh0X3BsdXJhbD1cdTA0MWZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0NGIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsPVx1MDQxY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1taWxlc3RvbmVfdGV4dF9wbHVyYWw9XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0Mlx1MDQzZVx1MDQ0N1x1MDQzYVx1MDQzOA0KLW91dGNvbWVfdGV4dF9wbHVyYWw9XHUwNDE4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDRiDQotcGhhc2VfdGV4dF9wbHVyYWw9XHUwNDJkXHUwNDQyXHUwNDMwXHUwNDNmXHUwNDRiDQotcHJhY3RpY2VfdGV4dF9wbHVyYWw9XHUwNDFmXHUwNDQwXHUwNDMwXHUwNDNhXHUwNDQyXHUwNDM4XHUwNDNhXHUwNDM4IFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLXByb2Nlc3NfdGV4dF9wbHVyYWw9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDRiDQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbD1cdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNhIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMFx1MDQzYw0KLXByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw9XHUwNDIxXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzZVx1MDQzMg0KLXByb2Nlc3NQYWNrYWdlX3RleHRfcGx1cmFsPVx1MDQxZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mlx1MDQ0YiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0MzINCi1yZXBvcnRfdGV4dF9wbHVyYWw9XHUwNDFlXHUwNDQyXHUwNDQ3XHUwNDM1XHUwNDQyXHUwNDRiDQotcmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbD1cdTA0MWNcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0NGJcdTA0MzUgXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDRiDQotcm9hZG1hcF90ZXh0X3BsdXJhbD1cdTA0MWZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0MzgNCi1yb2xlRGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5DQotcm9sZV90ZXh0X3BsdXJhbD1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzgNCi1yb2xlU2V0X3RleHRfcGx1cmFsPVx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1yb2xlU2V0R3JvdXBpbmdfdGV4dF9wbHVyYWw9XHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiIFx1MDQzZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzMiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1zdGFuZGFyZENhdGVnb3J5X3RleHRfcGx1cmFsPVx1MDQyMVx1MDQ0Mlx1MDQzMFx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzgNCi1zdGVwX3RleHRfcGx1cmFsPVx1MDQyOFx1MDQzMFx1MDQzM1x1MDQzOA0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0X3BsdXJhbD1cdTA0MjFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotdGFza190ZXh0X3BsdXJhbD1cdTA0MTdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi10YXNrRGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3DQotdGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZg0KLXRlbXBsYXRlX3RleHRfcGx1cmFsPVx1MDQyOFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQ0Yg0KLXRlcm1EZWZpbml0aW9uX3RleHRfcGx1cmFsPVx1MDQxZVx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0M2NcdTA0MzhcdTA0M2RcdTA0M2VcdTA0MzINCi10b29sX3RleHRfcGx1cmFsPVx1MDQxOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0Yg0KLXRvb2xNZW50b3JfdGV4dF9wbHVyYWw9XHUwNDIwXHUwNDQzXHUwNDNhXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzZlx1MDQzZSBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2MNCi13aGl0ZXBhcGVyX3RleHRfcGx1cmFsPVx1MDQxOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzZVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzFcdTA0NGVcdTA0M2JcdTA0M2JcdTA0MzVcdTA0NDJcdTA0MzVcdTA0M2RcdTA0MzgNCi13b3JrUHJvZHVjdF90ZXh0X3BsdXJhbD1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHRfcGx1cmFsPVx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0NDUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDMyDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHRfcGx1cmFsPVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzANCi13b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw9XHUwNDIyXHUwNDM4XHUwNDNmXHUwNDRiIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQ0NSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0M2VcdTA0MzINCi0NCi0jIEFwcGxpY2F0aW9uIHRpdGxlLg0KLWFwcGxpY2F0aW9uX3RpdGxlPXswfSAtIHsxfQ0KLQ0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1cdTA0MWVcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90aXRsZT1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90ZXh0PXswfSBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDRiIFx1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0NGIgXHUwNDMyIFx1MDQzZlx1MDQzMFx1MDQzZlx1MDQzYVx1MDQzNSwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDRmIFx1MDQzZFx1MDQzMFx1MDQzN1x1MDQ0Ylx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcblx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzOSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuIFx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQ0MVx1MDQzNVx1MDQzMFx1MDQzZFx1MDQ0MVx1MDQzMC4NCi1saWJyYXJ5TGFiZWxfdGV4dD1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzA6DQotYnJvd3NlQnV0dG9uX3RleHQ9XHUwNDFlXHUwNDMxXHUwNDM3XHUwNDNlXHUwNDQwLi4uDQotcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94X3RleHQ9XHUwNDE4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0ZFx1MDQ0Mlx1MDQzZSBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZSBcdTA0MzIgXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDM1XHUwNDM5XHUwNDQ4XHUwNDM1XHUwNDNjLg0KLW9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dD1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzZVx1MDQ0Mlx1MDQ0MVx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0MzIgJyd7MH0nJy5cblx1MDQxMiBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0M2MgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzXHUwNDM1IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDM4IFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQzMCBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NGYgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4gXG5cblx1MDQxZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBPSyBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MWVcdTA0NDJcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzAgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQzMCBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzkgXHUwNDNmXHUwNDMwXHUwNDNmXHUwNDNhXHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuDQotDQotIyBTZWxlY3QgTWV0aG9kIExpYnJhcnkgRm9sZGVyIERpYWxvZw0KLXNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGl0bGU9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzMFx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4NCi0NCi0jIE9wZW4gTGlicmFyeSBQcm9ncmVzcyBNZXNzYWdlDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuLi4NCi0NCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRXJyb3IgRGlhbG9nDQotaW52YWxpZExpYnJhcnlQYXRoX21zZz1JVVBMMDMwMEU6IFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLg0KLWludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQzZlx1MDQzMFx1MDQzZlx1MDQzYVx1MDQzMCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzZFx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQ0MyBcdTA0MzJcdTA0MzBcdTA0NDEgXHUwNDNkXHUwNDM1XHUwNDQyIFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMiBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0MzAgXHUwNDNhIFx1MDQzZFx1MDQzNVx1MDQzOS5cblxuXHUwNDFkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBPSyBcdTA0MzggXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQ0M1x1MDQ0ZSBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4Lg0KLQ0KLSMgTGlicmFyeSBMb2NrZWQgRXJyb3IgRGlhbG9nDQotbGlicmFyeUxvY2tlZF9tc2c9SVVQTDAzMDNFOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi5cblxuXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Zi4gXHUwNDFkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQxZVx1MDQ0Mlx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzMCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDMwIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0MzggXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MWVcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNkXHUwNDQzXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlLCBcdTA0NDdcdTA0NDJcdTA0M2VcdTA0MzFcdTA0NGIgXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZFx1MDQzZSBcdTA0NGRcdTA0NDJcdTA0NDMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzLlxuXG5cdTA0MTJcdTA0M2RcdTA0MzhcdTA0M2NcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzU6IFx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzNSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDMyXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDM4IFx1MDQzYSBcdTA0MzVcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDMyXHUwNDQwXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRlLg0KLWxpYnJhcnlMb2NrZWRfb3BlbkJ1dHRvbl90ZXh0PVx1MDQxZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0M2RcdTA0NDNcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UNCi0NCi0jIFJlYWQtb25seSBQcm9qZWN0IEZpbGUgRXJyb3IgRGlhbG9nDQotcmVhZE9ubHlQcm9qZWN0RmlsZV90ZXh0PUlVUEwwMzAyRTogJyd7MH0nJyBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0MzVcdTA0M2QgXHUwNDQyXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDdcdTA0NDJcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuIFx1MDQxNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNjXHUwNDNlIFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQ0MFx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzdcdTA0MzBcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0NGMuDQotcmV0cnlCdXR0b25fdGV4dD1cdTA0MWZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0NGMNCi1jYW5jZWxCdXR0b25fdGV4dD1cdTA0MWVcdTA0NDJcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzANCi0NCi0jIFZlcnNpb24gTWlzbWF0Y2ggRGlhbG9nDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHQ9SVVQTDMwNUU6IFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMuIFx1MDQxNFx1MDQzYlx1MDQ0ZiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0NGIgXHUwNDQxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0M2VcdTA0MzkgXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNjXHUwNDNlIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyB7MH0gXHUwNDM0XHUwNDNlIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCB7MX0gXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzMVx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzdcdTA0MzRcdTA0M2RcdTA0MzVcdTA0MzkuDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHRfdW5rbm93bj1JVVBMMzA2RTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0My4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQ0YiBcdTA0NDEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzOSBcdTA0M2RcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2NcdTA0M2UgXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIHswfSBcdTA0MzRcdTA0M2UgXHUwNDMxXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM1IFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzOSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzguDQotDQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dD1cdTA0MWRcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2NcdTA0M2UgXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQ0MyBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4LlxuXG5cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1Pw0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9XHUwNDFlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuLi4NCi0NCi0jIFVwZ3JhZGUgTGlicmFyeSBFcnJvciBEaWFsb2cNCi11cGdyYWRlTGlicmFyeUVycm9yX21zZz1JVVBMMDMwMUU6IFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuIFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDMyIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQzNS4NCi0NCi0jIFN3aXRjaCBDb25maWd1cmF0aW9uIERpYWxvZw0KLXN3aXRjaENvbmZpZ0RpYWxvZ190aXRsZT1cdTA0MjFcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RleHQ9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzZFx1MDQzMCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZSAnJ3swfScnLCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDQxIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzYyBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0M2M/DQotCQ0KLSMgQ29uZmlndXJhdGlvbiBDb21ibw0KLWN1cnJlbnRDb25maWdMYWJlbF90ZXh0PVx1MDQyMlx1MDQzNVx1MDQzYVx1MDQ0M1x1MDQ0OVx1MDQzMFx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGY6DQotc2VsZWN0Q29uZmlnTGFiZWxfdGV4dD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlDQotDQotIyBEZWxldGUgRmlsZXMgQ29uZmlybWF0aW9uIE1lc3NhZ2UNCi1kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2c9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyAnJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIuIFx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDMyIFx1MDQzZlx1MDQzMFx1MDQzZlx1MDQzYVx1MDQzNSBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDRiLiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGM/DQotDQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcw0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVx1MDQxMiBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzNcdTA0MzUgJyd7MH0nJyBcdTA0M2RcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2UgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIuXG5cblx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzkgXHUwNDNmXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDRiXHUwNDQyXHUwNDNhXHUwNDQzLg0KLWNyZWF0ZVBhdGhFcnJvcl9yZWFzb249XHUwNDFkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0NDMgJyd7MH0nJy5cblxuXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0M2ZcdTA0NDNcdTA0NDJcdTA0NGMgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0M2ZcdTA0NGJcdTA0NDJcdTA0M2FcdTA0NDMuDQotaW52YWxpZFBhdGhfbXNnPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0M2RcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQzXHUwNDQyXHUwNDRjLg0KLQ0KLSMgQmFja3VwIExpYnJhcnkgRGlhbG9nDQotYmFja3VwTGlicmFyeURpYWxvZ190aXRsZT1cdTA0MjBcdTA0MzVcdTA0MzdcdTA0MzVcdTA0NDBcdTA0MzJcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOA0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dD1cdTA0MWRcdTA0MzBcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NGZcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDQwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDQzXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NGUgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLlxuXG5cdTA0MWRcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgT0sgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0NDBcdTA0MzVcdTA0MzdcdTA0MzVcdTA0NDBcdTA0MzJcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0MzIgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDNjIFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzM1x1MDQzNS4gXHUwNDFkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQ0YywgXHUwNDQ3XHUwNDQyXHUwNDNlXHUwNDMxXHUwNDRiIFx1MDQzZFx1MDQzNSBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQwXHUwNDM1XHUwNDM3XHUwNDM1XHUwNDQwXHUwNDMyXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0ZS4NCi1iYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0MzdcdTA0MzVcdTA0NDBcdTA0MzJcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDM4IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzZVx1MDQzMiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzguLi4NCi0NCi0jIFBhdGggU2VsZWN0aW9uIERpYWxvZw0KLXBhdGhTZWxlY3Rpb25FcnJvcl9tc2c9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzDQotb2tCdXR0b25fdGV4dD1cdTA0MWVcdTA0MWENCi1za2lwQnV0dG9uX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDRjDQotDQotIyBQcm9jZXNzIEVkaXRvciBwcmVmZXJlbmNlcw0KLWFsd2F5c0J1dHRvbl90ZXh0PVx1MDQxMlx1MDQ0MVx1MDQzNVx1MDQzM1x1MDQzNFx1MDQzMA0KLW5ldmVyQnV0dG9uX3RleHQ9XHUwNDFkXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMzXHUwNDM0XHUwNDMwDQotcHJvbXB0QnV0dG9uX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDMzXHUwNDNiXHUwNDMwXHUwNDQ4XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1DQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1saW5rVG9VUkxfbmFtZT1VUkwNCi1saW5rVG9GaWxlX25hbWU9XHUwNDI0XHUwNDMwXHUwNDM5XHUwNDNiDQotZWxlbWVudExpbmtfbmFtZT1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lPVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDQxIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQ0MVx1MDQzZVx1MDQzYyBcdTA0NDJcdTA0MzhcdTA0M2ZcdTA0MzANCi1lbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lPVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDQxIFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzYyBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDJcdTA0M2VcdTA0M2MNCi0NCi0jIENvbnZlcnQgQWN0aXZpdHkgVHlwZSBEaWFsb2cNCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGl0bGU9XHUwNDFmXHUwNDQwXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0Mlx1MDQzOFx1MDQzZiBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGV4dD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQ2XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM5IFx1MDQ0Mlx1MDQzOFx1MDQzZiBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfbXNnPUlVUEwwMzA0RTogXHUwNDE0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzYSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDQyXHUwNDM4XHUwNDNmXHUwNDQzLg0KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX3JlYXNvbj1cdTA0MTRcdTA0M2JcdTA0NGYgezB9IFx1MDQzZFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M2VcdTA0MzJcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0NDUgXHUwNDQyXHUwNDM4XHUwNDNmXHUwNDNlXHUwNDMyIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOS4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MjI0NmNmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWZlZmQ0MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBMaWJyYXJ5IFVJIChOTDJhKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0ZTY4MjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkOTA2OTUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBicnVnZXJnclx1MDBlNm5zZWZsYWRlIHRpbCBiaWJsaW90ZWsNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IE1ldGhvZCBMaWJyYXJ5IFBhdGguDQotbGlicmFyeVBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9NZXRob2QgTGlicmFyaWVzL2xpYnJhcnkxDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2ODMzMTUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChTaW5ndWxhcikNCi1hY3Rpdml0eV90ZXh0PUFrdGl2aXRldA0KLWFydGlmYWN0X3RleHQ9QXJ0ZWZha3QNCi1jYXBhYmlsaXR5UGF0dGVybl90ZXh0PUZ1bmt0aW9uc21cdTAwZjhuc3Rlcg0KLWNoZWNrbGlzdF90ZXh0PVRqZWtsaXN0ZQ0KLWNoZWNrSXRlbV90ZXh0PUtvbnRyb2xlbGVtZW50DQotY29tcG9zaXRlUm9sZV90ZXh0PVNhbW1lbnNhdCByb2xsZQ0KLWNvbmNlcHRfdGV4dD1CZWdyZWINCi1jb250ZW50UGFja2FnZV90ZXh0PUluZGhvbGRzcGFra2UNCi1jdXN0b21DYXRlZ29yeV90ZXh0PVRpbHBhc3NldCBrYXRlZ29yaQ0KLWRlbGl2ZXJhYmxlX3RleHQ9TGV2ZXJhbmNlDQotZGVsaXZlcnlQcm9jZXNzX3RleHQ9TGV2ZXJpbmdzcHJvY2VzDQotZGVzY3JpcHRvcl90ZXh0PURlc2tyaXB0b3INCi1kaXNjaXBsaW5lX3RleHQ9RGlzY2lwbGluDQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ9RGlzY2lwbGluZ3J1cHBlcmluZw0KLWRvbWFpbl90ZXh0PURvbVx1MDBlNm5lDQotZXN0aW1hdGVfdGV4dD1Fc3RpbWF0DQotZXN0aW1hdGluZ01ldHJpY190ZXh0PUVzdGltZXJpbmdzbVx1MDBlNWxlc3lzdGVtDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9RXN0aW1lcmluZ3NvdmVydmVqZWxzZXINCi1leGFtcGxlX3RleHQ9RWtzZW1wZWwNCi1ndWlkYW5jZV90ZXh0PVZlamxlZG5pbmcNCi1ndWlkZWxpbmVfdGV4dD1SZXRuaW5nc2xpbmplDQotaXRlcmF0aW9uX3RleHQ9R2VudGFnZWxzZQ0KLW1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dD1NZXRvZGVrb25maWd1cmF0aW9uDQotbWV0aG9kQ29udGVudF90ZXh0PU1ldG9kZWluZGhvbGQNCi1tZXRob2RMaWJyYXJ5X3RleHQ9TWV0b2RlYmlibGlvdGVrDQotbWV0aG9kUGFja2FnZV90ZXh0PU1ldG9kZXBha2tlDQotbWV0aG9kUGx1Z2luX3RleHQ9TWV0b2RlLXBsdWdpbg0KLW1pbGVzdG9uZV90ZXh0PU1pbGVwXHUwMGU2bA0KLW91dGNvbWVfdGV4dD1SZXN1bHRhdA0KLXBoYXNlX3RleHQ9RmFzZQ0KLXByYWN0aWNlX3RleHQ9XHUwMGQ4dmVsc2UNCi1wcm9jZXNzX3RleHQ9UHJvY2VzDQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PUZvcnNrZWxzcHJvY2VzDQotcHJvY2Vzc0ZhbWlseV90ZXh0PVByb2Nlc2ZhbWlsaWUNCi1wcm9jZXNzUGFja2FnZV90ZXh0PVByb2Nlc3Bha2tlDQotcmVwb3J0X3RleHQ9UmFwcG9ydA0KLXJldXNhYmxlQXNzZXRfdGV4dD1HZW5hbnZlbmRlbGlndCBha3Rpdg0KLXJvYWRtYXBfdGV4dD1WZWp2aXNlcg0KLXJvbGVEZXNjcmlwdG9yX3RleHQ9Um9sbGVkZXNrcmlwdG9yDQotcm9sZV90ZXh0PVJvbGxlDQotcm9sZVNldF90ZXh0PVJvbGxlc1x1MDBlNnQNCi1yb2xlU2V0R3JvdXBpbmdfdGV4dD1Sb2xsZXNcdTAwZTZ0c2dydXBwZXJpbmcNCi1zdGFuZGFyZENhdGVnb3J5X3RleHQ9U3RhbmRhcmRrYXRlZ29yaQ0KLXN0ZXBfdGV4dD1UcmluDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9U3RcdTAwZjh0dGVtYXRlcmlhbGUNCi10YXNrX3RleHQ9T3BnYXZlDQotdGFza0Rlc2NyaXB0b3JfdGV4dD1PcGdhdmVkZXNrcmlwdG9yDQotdGVhbVByb2ZpbGVfdGV4dD1UZWFtcHJvZmlsDQotdGVtcGxhdGVfdGV4dD1Ta2FiZWxvbg0KLXRlcm1EZWZpbml0aW9uX3RleHQ9VGVybWRlZmluaXRpb24NCi10b29sX3RleHQ9Vlx1MDBlNnJrdFx1MDBmOGoNCi10b29sTWVudG9yX3RleHQ9Vlx1MDBlNnJrdFx1MDBmOGpzbWVudG9yDQotd2hpdGVwYXBlcl90ZXh0PUh2aWRib2cNCi13b3JrUHJvZHVjdF90ZXh0PUFyYmVqZHNwcm9kdWt0DQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9QXJiZWpkc3Byb2R1a3RkZXNrcmlwdG9yDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHQ9QXJiZWpkc3Byb2R1a3RlbGVtZW50DQotd29ya1Byb2R1Y3RUeXBlX3RleHQ9QXJiZWpkc3Byb2R1a3R0eXBlDQotDQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoUGx1cmFsKQ0KLWFjdGl2aXR5X3RleHRfcGx1cmFsPUFrdGl2aXRldGVyDQotYXJ0aWZhY3RfdGV4dF9wbHVyYWw9QXJ0ZWZha3Rlcg0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsPUZ1bmt0aW9uc21cdTAwZjhuc3RyZQ0KLWNoZWNrbGlzdF90ZXh0X3BsdXJhbD1UamVrbGlzdGVyDQotY2hlY2tJdGVtX3RleHRfcGx1cmFsPUtvbnRyb2xlbGVtZW50ZXINCi1jb21wb3NpdGVSb2xlX3RleHRfcGx1cmFsPVNhbW1lbnNhdHRlIHJvbGxlcg0KLWNvbmNlcHRfdGV4dF9wbHVyYWw9QmVncmViZXINCi1jb250ZW50UGFja2FnZV90ZXh0X3BsdXJhbD1JbmRob2xkc3Bha2tlcg0KLWN1c3RvbUNhdGVnb3J5X3RleHRfcGx1cmFsPVRpbHBhc3NlZGUga2F0ZWdvcmllcg0KLWRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsPUxldmVyYW5jZXINCi1kZWxpdmVyeVByb2Nlc3NfdGV4dF9wbHVyYWw9TGV2ZXJpbmdzcHJvY2Vzc2VyDQotZGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1EZXNrcmlwdG9yZXINCi1kaXNjaXBsaW5lX3RleHRfcGx1cmFsPURpc2NpcGxpbmVyDQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHRfcGx1cmFsPURpc2NpcGxpbmdydXBwZXJpbmcNCi1kb21haW5fdGV4dF9wbHVyYWw9RG9tXHUwMGU2bmVyDQotZXN0aW1hdGVfdGV4dF9wbHVyYWw9RXN0aW1hdGVyDQotZXN0aW1hdGluZ01ldHJpY190ZXh0X3BsdXJhbD1Fc3RpbWVyaW5nc21cdTAwZTVsZXN5c3RlbWVyDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHRfcGx1cmFsPUVzdGltZXJpbmdzb3ZlcnZlamVsc2VyDQotZXhhbXBsZV90ZXh0X3BsdXJhbD1Fa3NlbXBsZXINCi1ndWlkYW5jZV90ZXh0X3BsdXJhbD1WZWpsZWRuaW5nZXINCi1ndWlkZWxpbmVfdGV4dF9wbHVyYWw9UmV0bmluZ3NsaW5qZXINCi1pdGVyYXRpb25fdGV4dF9wbHVyYWw9R2VudGFnZWxzZXINCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsPU1ldG9kZWtvbmZpZ3VyYXRpb25lcg0KLW1ldGhvZENvbnRlbnRfdGV4dF9wbHVyYWw9TWV0b2RlaW5kaG9sZA0KLW1ldGhvZExpYnJhcnlfdGV4dF9wbHVyYWw9TWV0b2RlYmlibGlvdGVrZXINCi1tZXRob2RQYWNrYWdlX3RleHRfcGx1cmFsPU1ldG9kZXBha2tlcg0KLW1ldGhvZFBsdWdpbl90ZXh0X3BsdXJhbD1NZXRvZGUtcGx1Z2lucw0KLW1pbGVzdG9uZV90ZXh0X3BsdXJhbD1NaWxlcFx1MDBlNmxlDQotb3V0Y29tZV90ZXh0X3BsdXJhbD1SZXN1bHRhdGVyDQotcGhhc2VfdGV4dF9wbHVyYWw9RmFzZXINCi1wcmFjdGljZV90ZXh0X3BsdXJhbD1cdTAwZDh2ZWxzZXINCi1wcm9jZXNzX3RleHRfcGx1cmFsPVByb2Nlc3Nlcg0KLXByb2Nlc3NDb250cmlidXRpb25fdGV4dF9wbHVyYWw9Rm9yc2tlbHNwcm9jZXNzZXINCi1wcm9jZXNzRmFtaWx5X3RleHRfcGx1cmFsPVByb2Nlc2ZhbWlsaWVyDQotcHJvY2Vzc1BhY2thZ2VfdGV4dF9wbHVyYWw9UHJvY2VzcGFra2VyDQotcmVwb3J0X3RleHRfcGx1cmFsPVJhcHBvcnRlcg0KLXJldXNhYmxlQXNzZXRfdGV4dF9wbHVyYWw9R2VuYW52ZW5kZWxpZ2UgYWt0aXZlcg0KLXJvYWRtYXBfdGV4dF9wbHVyYWw9VmVqdmlzZXJlDQotcm9sZURlc2NyaXB0b3JfdGV4dF9wbHVyYWw9Um9sbGVkZXNrcmlwdG9yZXINCi1yb2xlX3RleHRfcGx1cmFsPVJvbGxlcg0KLXJvbGVTZXRfdGV4dF9wbHVyYWw9Um9sbGVzXHUwMGU2dA0KLXJvbGVTZXRHcm91cGluZ190ZXh0X3BsdXJhbD1Sb2xsZXNcdTAwZTZ0c2dydXBwZXJpbmdlcg0KLXN0YW5kYXJkQ2F0ZWdvcnlfdGV4dF9wbHVyYWw9U3RhbmRhcmRrYXRlZ29yaWVyDQotc3RlcF90ZXh0X3BsdXJhbD1UcmluDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHRfcGx1cmFsPVN0XHUwMGY4dHRlbWF0ZXJpYWxlDQotdGFza190ZXh0X3BsdXJhbD1PcGdhdmVyDQotdGFza0Rlc2NyaXB0b3JfdGV4dF9wbHVyYWw9T3BnYXZlZGVza3JpcHRvcmVyDQotdGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw9VGVhbXByb2ZpbGVyDQotdGVtcGxhdGVfdGV4dF9wbHVyYWw9U2thYmVsb25lcg0KLXRlcm1EZWZpbml0aW9uX3RleHRfcGx1cmFsPVVkdHJ5a3NkZWZpbml0aW9uZXINCi10b29sX3RleHRfcGx1cmFsPVZcdTAwZTZya3RcdTAwZjhqZXINCi10b29sTWVudG9yX3RleHRfcGx1cmFsPVZcdTAwZTZya3RcdTAwZjhqc21lbnRvcmVyDQotd2hpdGVwYXBlcl90ZXh0X3BsdXJhbD1IdmlkYlx1MDBmOGdlcg0KLXdvcmtQcm9kdWN0X3RleHRfcGx1cmFsPUFyYmVqZHNwcm9kdWt0ZXINCi13b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw9QXJiZWpkc3Byb2R1a3RkZXNrcmlwdG9yZXINCi13b3JrUHJvZHVjdEVsZW1lbnRfdGV4dF9wbHVyYWw9QXJiZWpkc3Byb2R1a3RlbGVtZW50ZXINCi13b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw9QXJiZWpkc3Byb2R1a3R0eXBlcg0KLQ0KLSMgQXBwbGljYXRpb24gdGl0bGUuDQotYXBwbGljYXRpb25fdGl0bGU9ezB9IC0gezF9DQotDQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlPVx1MDBjNWJuIG1ldG9kZWJpYmxpb3Rlaw0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90aXRsZT1WXHUwMGU2bGcgZXQgbWV0b2RlYmlibGlvdGVrDQotb3BlbkxpYnJhcnlEaWFsb2dBcmVhX3RleHQ9ezB9IGdlbW1lciBtZXRvZGVyIG9nIHByb2Nlc3NlciBpIGVuIGZvbGRlciwgXG5zb20ga2FsZGVzIGV0IG1ldG9kZWJpYmxpb3Rlay4gVlx1MDBlNmxnIGVuIG1ldG9kZWJpYmxpb3Rla3Nmb2xkZXIsIHNvbSBkdSB2aWwgYnJ1Z2UgdGlsIGRlbm5lIHNlc3Npb24uDQotbGlicmFyeUxhYmVsX3RleHQ9QmlibGlvdGVrOg0KLWJyb3dzZUJ1dHRvbl90ZXh0PUdlbm5lbXNlLi4uDQotcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94X3RleHQ9QnJ1ZyBkZXR0ZSBzb20gc3RhbmRhcmQsIG9nIHNwXHUwMGY4cmcgaWtrZSBpZ2VuLg0KLW9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dD1EZXIgZXIgaWtrZSBub2dldCBtZXRvZGViaWJsaW90ZWsgaSAnJ3swfScnLlxuRGVyIG9wcmV0dGVzIG9nIFx1MDBlNWJuZXMgZXQgbnl0IG1ldG9kZWJpYmxpb3RlayBpIGRldCBhbmdpdm5lIGJpYmxpb3Rlay5cblxuS2xpayBwXHUwMGU1IE9LIGZvciBhdCBmb3J0c1x1MDBlNnR0ZSBlbGxlciBBbm51bGxcdTAwZTlyIGZvciBhdCBhbmdpdmUgZW4gYW5kZW4gc3RpIHRpbCBtZXRvZGViaWJsaW90ZWtldC4NCi0NCi0jIFNlbGVjdCBNZXRob2QgTGlicmFyeSBGb2xkZXIgRGlhbG9nDQotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190aXRsZT1WXHUwMGU2bGcgbWV0b2RlYmlibGlvdGVrDQotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0PVZcdTAwZTZsZyBlbiBtZXRvZGViaWJsaW90ZWtzZm9sZGVyLg0KLQ0KLSMgT3BlbiBMaWJyYXJ5IFByb2dyZXNzIE1lc3NhZ2UNCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1cdTAwYzVibmVyIG1ldG9kZWJpYmxpb3Rlay4uLg0KLQ0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBFcnJvciBEaWFsb2cNCi1pbnZhbGlkTGlicmFyeVBhdGhfbXNnPUlVUEwwMzAwRTogRGV0IGFuZ2l2bmUgbWV0b2RlYmlibGlvdGVrIGthbiBpa2tlIFx1MDBlNWJuZXMuDQotaW52YWxpZExpYnJhcnlQYXRoX3JlYXNvbj1EZW4gdmFsZ3RlIG1ldG9kZWJpYmxpb3Rla3Nmb2xkZXIgZXIgdWd5bGRpZywgZWxsZXIgZHUgaGFyIGlra2UgZGVuIHJldHRlIHRpbGxhZGVsc2UgdGlsIGF0IGZcdTAwZTUgYWRnYW5nIHRpbCBkZW4uXG5cbktsaWsgcFx1MDBlNSBPSyBmb3IgYXQgdlx1MDBlNmxnZSBlbiBhbmRlbiBiaWJsaW90ZWtzZm9sZGVyLg0KLQ0KLSMgTGlicmFyeSBMb2NrZWQgRXJyb3IgRGlhbG9nDQotbGlicmFyeUxvY2tlZF9tc2c9SVVQTDAzMDNFOiBEZXQgYW5naXZuZSBtZXRvZGViaWJsaW90ZWsga2FuIGlra2UgXHUwMGU1Ym5lcy5cblxuRGV0IGFuZ2l2bmUgbWV0b2RlYmlibGlvdGVrIGVyIG11bGlnaGVkIGFsbGVyZWRlIGkgYnJ1Zy4gS2xpayBwXHUwMGU1IEFubnVsbFx1MDBlOXIgZm9yIGF0IHZcdTAwZTZsZ2UgZW4gYW5kZW4gYmlibGlvdGVrc2ZvbGRlciwgZWxsZXIga2xpayBwXHUwMGU1IEdlbm5lbXR2aW5nIFx1MDBlNWJuaW5nIGZvciBhdCBcdTAwZTVibmUgYmlibGlvdGVrZXQgYWxsaWdldmVsLlxuXG5BZHZhcnNlbDogU2FtdGlkaWcgYnJ1ZyBhZiBldCBtZXRvZGViaWJsaW90ZWsga2FuIGJlc2thZGlnZSBiaWJsaW90ZWtldC4NCi1saWJyYXJ5TG9ja2VkX29wZW5CdXR0b25fdGV4dD1HZW5uZW10dmluZyBcdTAwZTVibmluZw0KLQ0KLSMgUmVhZC1vbmx5IFByb2plY3QgRmlsZSBFcnJvciBEaWFsb2cNCi1yZWFkT25seVByb2plY3RGaWxlX3RleHQ9SVVQTDAzMDJFOiAnJ3swfScnIGVyIHNrcml2ZWJlc2t5dHRldC4gR1x1MDBmOHIgZGV0IHJlZGlnXHUwMGU5cmJhcnQsIGZcdTAwZjhyIGR1IGZvcnRzXHUwMGU2dHRlci4NCi1yZXRyeUJ1dHRvbl90ZXh0PVByXHUwMGY4diBpZ2VuDQotY2FuY2VsQnV0dG9uX3RleHQ9QW5udWxsXHUwMGU5cg0KLQ0KLSMgVmVyc2lvbiBNaXNtYXRjaCBEaWFsb2cNCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dD1JVVBMMzA1RTogRGV0IHZhbGd0ZSBiaWJsaW90ZWsga2FuIGlra2UgXHUwMGU1Ym5lcy4gRHUgc2thbCBvcGdyYWRlcmUgezB9IHRpbCB2ZXJzaW9uIHsxfSBlbGxlciBueWVyZSBmb3IgYXQga3VubmUgXHUwMGU1Ym5lIGRldHRlIGJpYmxpb3Rlay4NCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duPUlVUEwzMDZFOiBEZXQgdmFsZ3RlIGJpYmxpb3RlayBrYW4gaWtrZSBcdTAwZTVibmVzLiBEdSBza2FsIG9wZ3JhZGVyZSB7MH0gdGlsIGVuIG55ZXJlIHZlcnNpb24gZm9yIGF0IGt1bm5lIFx1MDBlNWJuZSBkZXR0ZSBiaWJsaW90ZWsuDQotDQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPU9wZ3JhZFx1MDBlOXIgbWV0b2RlYmlibGlvdGVrDQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dD1EZXQgdmFsZ3RlIGJpYmxpb3RlayBza2FsIG9wZ3JhZGVyZXMgdGlsIGRlbiBueWUgYmlibGlvdGVrc3N0cnVrdHVyLiBcblxuVmlsIGR1IGZvcmV0YWdlIGRlbm5lIG9wZ3JhZGVyaW5nPw0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9T3BncmFkZXJlciBtZXRvZGViaWJsaW90ZWsuLi4NCi0NCi0jIFVwZ3JhZGUgTGlicmFyeSBFcnJvciBEaWFsb2cNCi11cGdyYWRlTGlicmFyeUVycm9yX21zZz1JVVBMMDMwMUU6IE1ldG9kZWJpYmxpb3Rla2V0IGthbiBpa2tlIG9wZ3JhZGVyZXMuIERlciBlciBmbGVyZSBvcGx5c25pbmdlciBpIGxvZ2ZpbGVuLg0KLQ0KLSMgU3dpdGNoIENvbmZpZ3VyYXRpb24gRGlhbG9nDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlPVNraWZ0IGtvbmZpZ3VyYXRpb24NCi1zd2l0Y2hDb25maWdEaWFsb2dfdGV4dD1WaWwgZHUgc2tpZnRlIGRlbiBha3R1ZWxsZSBrb25maWd1cmF0aW9uIHRpbCBzdGFuZGFyZGtvbmZpZ3VyYXRpb25lbiAnJ3swfScnLCBzb20gZXIga255dHRldCB0aWwgZGVuIHZhbGd0ZSBwcm9jZXM/DQotCQ0KLSMgQ29uZmlndXJhdGlvbiBDb21ibw0KLWN1cnJlbnRDb25maWdMYWJlbF90ZXh0PUFrdHVlbCBrb25maWd1cmF0aW9uOg0KLXNlbGVjdENvbmZpZ0xhYmVsX3RleHQ9Vlx1MDBlNmxnIGVuIGtvbmZpZ3VyYXRpb24NCi0NCi0jIERlbGV0ZSBGaWxlcyBDb25maXJtYXRpb24gTWVzc2FnZQ0KLWRlbGV0ZUZpbGVzQ29uZmlybWF0aW9uX21zZz1TdGllbiAnJ3swfScnIGZpbmRlcyBhbGxlcmVkZS4gQWxsZSBmaWxlciBpIGZvbGRlcmVuIGJsaXZlciBzbGV0dGV0LiBWaWwgZHUgZm9ydHNcdTAwZTZ0dGU/DQotDQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcw0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVN0aWVuICcnezB9JycgaW5kZWhvbGRlciBlbiBlbGxlciBmbGVyZSBmaWxlciwgc29tIGlra2Uga2FuIHNsZXR0ZXMuXG5cblZcdTAwZTZsZyBlbiBhbmRlbiBzdGksIG9nIHByXHUwMGY4diBpZ2VuLg0KLWNyZWF0ZVBhdGhFcnJvcl9yZWFzb249S2FuIGlra2Ugb3ByZXR0ZSBzdGllbiAnJ3swfScnLlxuXG5WXHUwMGU2bGcgZW4gYW5kZW4gc3RpLCBvZyBwclx1MDBmOHYgaWdlbi4NCi1pbnZhbGlkUGF0aF9tc2c9U3RpZW4gZXIgaWtrZSBneWxkaWcuDQotDQotIyBCYWNrdXAgTGlicmFyeSBEaWFsb2cNCi1iYWNrdXBMaWJyYXJ5RGlhbG9nX3RpdGxlPVNpa2tlcmhlZHNrb3BpYmlibGlvdGVrDQotYmFja3VwTGlicmFyeURpYWxvZ190ZXh0PURldCBhbmJlZmFsZXMsIGF0IGR1IHNpa2tlcmhlZHNrb3BpZXJlciBkZXQgYWt0dWVsbGUgbWV0b2RlYmlibGlvdGVrLCBmXHUwMGY4ciBkdSBmb3J0c1x1MDBlNnR0ZXIuXG5cbktsaWsgcFx1MDBlNSBPSyBmb3IgYXQgb3ByZXR0ZSBlbiBzaWtrZXJoZWRza29waSBhZiBiaWJsaW90ZWtldCBpIGRldCBhbmdpdm5lIGJpYmxpb3Rlay4gS2xpayBwXHUwMGU1IFNwcmluZyBvdmVyIGZvciBhdCBmb3J0c1x1MDBlNnR0ZSB1ZGVuIGF0IHNpa2tlcmhlZHNrb3BpZXJlLg0KLWJhY2tpbmdVcExpYnJhcnlUYXNrX25hbWU9T3ByZXR0ZXIgZW4gc2lra2VyaGVkc2tvcGkgYWYgYmlibGlvdGVrc2ZpbGVyLi4uDQotDQotIyBQYXRoIFNlbGVjdGlvbiBEaWFsb2cNCi1wYXRoU2VsZWN0aW9uRXJyb3JfbXNnPUthbiBpa2tlIG9wcmV0dGUgYmlibGlvdGVrDQotb2tCdXR0b25fdGV4dD1PSw0KLXNraXBCdXR0b25fdGV4dD1TcHJpbmcgb3Zlcg0KLQ0KLSMgUHJvY2VzcyBFZGl0b3IgcHJlZmVyZW5jZXMNCi1hbHdheXNCdXR0b25fdGV4dD1BbHRpZA0KLW5ldmVyQnV0dG9uX3RleHQ9QWxkcmlnDQotcHJvbXB0QnV0dG9uX3RleHQ9U3BcdTAwZjhyZw0KLQ0KLSMgQWRkIExpbmsgRGlhbG9nDQotbGlua1RvVVJMX25hbWU9VVJMDQotbGlua1RvRmlsZV9uYW1lPUZpbA0KLWVsZW1lbnRMaW5rX25hbWU9TWV0b2RlZWxlbWVudA0KLWVsZW1lbnRMaW5rV2l0aFR5cGVfbmFtZT1NZXRvZGVlbGVtZW50IG1lZCB0eXBlcHJcdTAwZTZmaWtzDQotZWxlbWVudExpbmtXaXRoVXNlclRleHRfbmFtZT1NZXRvZGVlbGVtZW50IG1lZCB0aWxwYXNzZXQgdGVrc3QNCi0NCi0jIENvbnZlcnQgQWN0aXZpdHkgVHlwZSBEaWFsb2cNCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGl0bGU9S29udmVydFx1MDBlOXIgYWt0aXZpdGV0c3R5cGUNCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGV4dD1WXHUwMGU2bGcgbVx1MDBlNWxha3Rpdml0ZXRzdHlwZW4uDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfbXNnPUlVUEwwMzA0RTogQWt0aXZpdGV0ZW4ga2FuIGlra2Uga29udmVydGVyZXMgdGlsIGVuIGFuZGVuIHR5cGUuDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uPURlciBlciBpbmdlbiBrb21wYXRpYmVsIGFrdGl2aXRldHN0eXBlIGZvciB7MH0uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGY0NmQ2MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZmOGUwNzkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgTGlicmFyeSBYTUkgKE5MMSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmU3YjAxMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmRkYzIxNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFhNSS1CaWJsaW90aGVrDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDhmMTk4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9QmlibGlvdGVjYSBYTUkgZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjI0ZWI5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9QmlibGlvdGhcdTAwZThxdWUgWE1ZIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5faXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTRiZTU3NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUxpYnJlcmlhIFhNSSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyNjFlYTQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgWE1JIExpYnJhcnkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY4Y2Y0OWYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgWE1JIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2QwYjhhYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUJpYmxpb3RlY2EgRVBGIFhNSQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzE5NjBkZi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBYTUkgXHU1ZTkzDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MjYxZWE0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFhNSSBMaWJyYXJ5DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjJhYTA3NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZpbGVQYXRoPURhdGVpcGZhZA0KLWNhbm5vdFdyaXRlVG9GaWxlcz1TY2hyZWliZW4gaW4gRGF0ZWkoZW4pIGlzdCBuaWNodCBtXHUwMGY2Z2xpY2guDQotcmVhZE9ubHlGaWxlc190aXRsZT1TY2hyZWliZ2VzY2hcdTAwZmN0enRlIERhdGVpKGVuKQ0KLXJlYWRPbmx5RmlsZXNfbXNnPURpZSBEYXRlaWVuIHVudGVyIERldGFpbHMgc2luZCBzY2hyZWliZ2VzY2hcdTAwZmN0enQuIEhlYmVuIFNpZSBkZW4gU2NocmVpYnNjaHV0eiBhdWYsIHVuZCBrbGlja2VuIFNpZSBhdWYgV2llZGVyaG9sZW4sIHVtIGZvcnR6dWZhaHJlbi4NCi1lbGVtZW50UGF0aD1FbGVtZW50cGZhZA0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c9RGllIGZvbGdlbmRlbiBEYXRlaWVuIGZlaGxlbi4gS2xpY2tlbiBTaWUgYXVmIE9LLCB3ZW5uIFNpZSBhbGxlIFJlZmVyZW56ZW4gYXVmIGRpZSBhdXNnZXdcdTAwZTRobHRlbiBEYXRlaWVuIGluIGRlciBCaWJsaW90aGVrIGxcdTAwZjZzY2hlbiBtXHUwMGY2Y2h0ZW4uDQotbWlzc2luZ0ZpbGVzX3RpdGxlPUZlaGxlbmRlIERhdGVpKGVuKQ0KLWxvYWRFcnJvcj1GZWhsZXIgYmVpbSBMYWRlbg0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb0ZpbGVzV2l0aExvYWRFcnJvcnNfbXNnPURpZSBmb2xnZW5kZW4gRGF0ZWllbiBrXHUwMGY2bm5lbiBuaWNodCBnZWxhZGVuIHdlcmRlbi4gS2xpY2tlbiBTaWUgYXVmIE9LLCB3ZW5uIFNpZSBhbGxlIFJlZmVyZW56ZW4gYXVmIGRpZSBhdXNnZXdcdTAwZTRobHRlbiBEYXRlaWVuIGluIGRlciBCaWJsaW90aGVrIGxcdTAwZjZzY2hlbiBtXHUwMGY2Y2h0ZW4uDQotZmlsZXNXaXRoTG9hZEVycm9yc190aXRsZT1EYXRlaShlbikgbWl0IEZlaGxlcm4gYmVpbSBMYWRlbg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5Nzg0ZTQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1maWxlUGF0aD1WXHUwMGVkYSBkZSBhY2Nlc28gZGUgYXJjaGl2byhzKQ0KLWNhbm5vdFdyaXRlVG9GaWxlcz1ObyBzZSBwdWVkZSBlc2NyaWJpciBlbiBlbCBhcmNoaXZvIG8gYXJjaGl2b3MNCi1yZWFkT25seUZpbGVzX3RpdGxlPUFyY2hpdm8ocykgc29sYW1lbnRlIGRlIGxlY3R1cmENCi1yZWFkT25seUZpbGVzX21zZz1Mb3MgYXJjaGl2b3MgbGlzdGFkb3MgZW4gRGV0YWxsZXMgc29uIHNvbGFtZW50ZSBkZSBsZWN0dXJhLiBIXHUwMGUxZ2Fsb3Mgc29icmVlc2NyaWJpYmxlcyB5IHB1bHNlIGVuIFJlaW50ZW50YXIgcGFyYSBjb250aW51YXIuDQotZWxlbWVudFBhdGg9Vlx1MDBlZGEgZGUgYWNjZXNvIGEgZWxlbWVudG8NCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9NaXNzaW5nRmlsZXNfbXNnPUZhbHRhbiBsb3MgYXJjaGl2b3Mgc2lndWllbnRlcy4gUHVsc2UgQWNlcHRhciBzaSBkZXNlYSBlbGltaW5hciBjdWFscXVpZXIgcmVmZXJlbmNpYSBhIGxvcyBhcmNoaXZvcyBzZWxlY2Npb25hZG9zIGVuIGxhIGJpYmxpb3RlY2ENCi1taXNzaW5nRmlsZXNfdGl0bGU9QXJjaGl2b3MgcXVlIGZhbHRhbg0KLWxvYWRFcnJvcj1FcnJvciBkZSBjYXJnYQ0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb0ZpbGVzV2l0aExvYWRFcnJvcnNfbXNnPU5vIHNlIGhhbiBwb2RpZG8gY2FyZ2FyIGxvcyBhcmNoaXZvcyBzaWd1aWVudGVzLiBQdWxzZSBBY2VwdGFyIHNpIGRlc2VhIGVsaW1pbmFyIGN1YWxxdWllciByZWZlcmVuY2lhIGEgbG9zIGFyY2hpdm9zIHNlbGVjY2lvbmFkb3MgZW4gbGEgYmlibGlvdGVjYQ0KLWZpbGVzV2l0aExvYWRFcnJvcnNfdGl0bGU9QXJjaGl2byhzKSBjb24gZXJyb3JlcyBkZSBjYXJnYQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5ZDUwYTkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1maWxlUGF0aD1DaGVtaW4gZCdhY2NcdTAwZThzIGR1IGZpY2hpZXINCi1jYW5ub3RXcml0ZVRvRmlsZXM9SW1wb3NzaWJsZSBkJ2VucmVnaXN0cmVyIGRhbnMgbGUocykgZmljaGllcihzKQ0KLXJlYWRPbmx5RmlsZXNfdGl0bGU9RmljaGllcihzKSBlbiBsZWN0dXJlIHNldWxlbWVudA0KLXJlYWRPbmx5RmlsZXNfbXNnPUxlcyBmaWNoaWVycyByXHUwMGU5cGVydG9yaVx1MDBlOXMgZGFucyBEXHUwMGU5dGFpbHMgc29udCBlbiBsZWN0dXJlIHNldWxlbWVudC4gUmVuZGV6LWxlcyBpbnNjcmlwdGlibGVzIGV0IGNsaXF1ZXogc3VyIFJcdTAwZTllc3NheWVyIHBvdXIgY29udGludWVyLg0KLWVsZW1lbnRQYXRoPUNoZW1pbiBkJ2FjY1x1MDBlOHMgZGUgbCdcdTAwZTlsXHUwMGU5bWVudA0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c9TGVzIGZpY2hpZXJzIHN1aXZhbnRzIHNvbnQgbWFucXVhbnRzLiBDbGlxdWV6IHN1ciBPSyBzaSB2b3VzIHZvdWxleiBzdXBwcmltZXIgY2hhcXVlIHJcdTAwZTlmXHUwMGU5cmVuY2UgYXV4IGZpY2hpZXJzIHNcdTAwZTlsZWN0aW9ublx1MDBlOXMgZGFucyBsYSBiaWJsaW90aFx1MDBlOHF1ZQ0KLW1pc3NpbmdGaWxlc190aXRsZT1GaWNoaWVyKHMpIG1hbnF1YW50KHMpDQotbG9hZEVycm9yPUVycmV1ciBkZSBjaGFyZ2VtZW50DQotcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvRmlsZXNXaXRoTG9hZEVycm9yc19tc2c9SW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGxlKHMpIGZpY2hpZXIocykgc3VpdmFudChzKS4gQ2xpcXVleiBzdXIgT0sgc2kgdm91cyB2b3VsZXogc3VwcHJpbWVyIGNoYXF1ZSByXHUwMGU5Zlx1MDBlOXJlbmNlIGF1eCBmaWNoaWVycyBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzIGRhbnMgbGEgYmlibGlvdGhcdTAwZThxdWUNCi1maWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlPUZpY2hpZXIocykgcHJcdTAwZTlzZW50YW50IHVuZSBlcnJldXIgZGUgY2hhcmdlbWVudA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0NjZlZTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1maWxlUGF0aD1QZXJjb3JzbyBmaWxlDQotY2Fubm90V3JpdGVUb0ZpbGVzPUltcG9zc2liaWxlIHNjcml2ZXJlIHN1aSBmaWxlDQotcmVhZE9ubHlGaWxlc190aXRsZT1GaWxlIGEgc29sYSBsZXR0dXJhDQotcmVhZE9ubHlGaWxlc19tc2c9SSBmaWxlIGVsZW5jYXRpIGluIERldHRhZ2xpIHNvbm8gYSBzb2xhIGxldHR1cmEuIFJlbmRlcmxpIGFjY2Vzc2liaWxpIGluIHNjcml0dHVyYSBlIGUgZmFyZSBjbGljIHN1IFJpcHJvdmEgcGVyIGNvbnRpbnVhcmUuDQotZWxlbWVudFBhdGg9UGVyY29yc28gZWxlbWVudG8NCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9NaXNzaW5nRmlsZXNfbXNnPU1hbmNhbm8gaSBzZWd1ZW50aSBmaWxlLiBGYXJlIGNsaWMgc3UgT0sgcGVyIGVsaW1pbmFyZSB0dXR0aSBpIHJpZmVyaW1lbnRpIGFpIGZpbGUgc2VsZXppb25hdGkgbmVsbGEgbGlicmVyaWEuDQotbWlzc2luZ0ZpbGVzX3RpdGxlPUZpbGUgbWFuY2FudGkNCi1sb2FkRXJyb3I9RXJyb3JlIGRpIGNhcmljYW1lbnRvDQotcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvRmlsZXNXaXRoTG9hZEVycm9yc19tc2c9SW1wb3NzaWJpbGUgY2FyaWNhcmUgaSBzZWd1ZW50aSBmaWxlLiBGYXJlIAdjbGljIHN1IE9LIHBlciBlbGltaW5hcmUgdHV0dGkgaSByaWZlcmltZW50aSBhaSBmaWxlIHNlbGV6aW9uYXRpIG5lbGxhIGxpYnJlcmlhLg0KLWZpbGVzV2l0aExvYWRFcnJvcnNfdGl0bGU9RmlsZSBjb24gZXJyb3JpIGRpIGNhcmljYW1lbnRvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTljMjU5Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZpbGVQYXRoPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzBmYlx1MzBkMVx1MzBiOQ0KLWNhbm5vdFdyaXRlVG9GaWxlcz1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmJcdTY2ZjhcdTMwNGRcdThmYmNcdTMwODFcdTMwN2VcdTMwNWJcdTMwOTMNCi1yZWFkT25seUZpbGVzX3RpdGxlPVx1OGFhZFx1MzA3Zlx1NTNkNlx1MzA4YVx1NWMwMlx1NzUyOFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYg0KLXJlYWRPbmx5RmlsZXNfbXNnPVx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA2Ylx1MzBlYVx1MzBiOVx1MzBjOFx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2Zlx1OGFhZFx1MzA3Zlx1NTNkNlx1MzA4YVx1NWMwMlx1NzUyOFx1MzA2N1x1MzA1OVx1MzAwMlx1N2Q5YVx1ODg0Y1x1MzA1OVx1MzA4Ylx1MzA2Ylx1MzA2Zlx1MzAwMVx1NjZmOFx1MzA0ZFx1OGZiY1x1MzA3Zlx1NTNlZlx1ODBmZFx1MzA2Ylx1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1MzAwY1x1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWVsZW1lbnRQYXRoPVx1ODk4MVx1N2QyMFx1MzBkMVx1MzBiOQ0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c9XHU2YjIxXHUzMDZlXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU1MTg1XHUzMDZlXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDc4XHUzMDZlXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHU1M2MyXHU3MTY3XHUzMDkyXHU1MjRhXHU5NjY0XHUzMDU5XHUzMDhiXHUzMDZiXHUzMDZmXHUzMDBjT0tcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1taXNzaW5nRmlsZXNfdGl0bGU9XHU2YjIwXHU4NDNkXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViDQotbG9hZEVycm9yPVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBmYlx1MzBhOFx1MzBlOVx1MzBmYw0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb0ZpbGVzV2l0aExvYWRFcnJvcnNfbXNnPVx1NmIyMVx1MzA2ZVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NTE4NVx1MzA2ZVx1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA3OFx1MzA2ZVx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1NTNjMlx1NzE2N1x1MzA5Mlx1NTI0YVx1OTY2NFx1MzA1OVx1MzA4Ylx1MzA2Ylx1MzA2Zlx1MzAwY09LXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotZmlsZXNXaXRoTG9hZEVycm9yc190aXRsZT1cdTMwZWRcdTMwZmNcdTMwYzlcdTMwZmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNmVcdTMwNDJcdTMwOGJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZmQzOTAzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotZmlsZVBhdGg9XHVkMzBjXHVjNzdjIFx1YWNiZFx1Yjg1Yw0KLWNhbm5vdFdyaXRlVG9GaWxlcz1cdWQzMGNcdWM3N2NcdWM1ZDAgXHVhZTMwXHViODVkXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotcmVhZE9ubHlGaWxlc190aXRsZT1cdWM3N2RcdWFlMzAgXHVjODA0XHVjNmE5IFx1ZDMwY1x1Yzc3Yw0KLXJlYWRPbmx5RmlsZXNfbXNnPVx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1YzVkMCBcdWIwOThcdWM1ZjRcdWI0MWMgXHVkMzBjXHVjNzdjXHVjNzc0IFx1Yzc3ZFx1YWUzMCBcdWM4MDRcdWM2YTlcdWM3ODVcdWIyYzhcdWIyZTQuIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWM0ZjBcdWFlMzAgXHVhYzAwXHViMmE1XHVjNzNjXHViODVjIFx1YjljY1x1YjRlNFx1YWNlMCBcdWM3YWNcdWMyZGNcdWIzYzRcdWI5N2MgXHVkMDc0XHViOWFkXHVkNTU4XHVjNWVjIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1lbGVtZW50UGF0aD1cdWM2OTRcdWMxOGMgXHVhY2JkXHViODVjDQotcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvTWlzc2luZ0ZpbGVzX21zZz1cdWIyZTRcdWM3NGMgXHVkMzBjXHVjNzdjXHVjNzc0IFx1YjIwNFx1Yjc3ZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4gXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVjNWQwXHVjMTFjIFx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWQzMGNcdWM3N2NcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmFhOFx1YjRlMCBcdWNjMzhcdWM4NzBcdWI5N2MgXHVjODFjXHVhYzcwXHVkNTU4XHViODI0XHViYTc0IFx1ZDY1NVx1Yzc3OFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotbWlzc2luZ0ZpbGVzX3RpdGxlPVx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWQzMGNcdWM3N2MNCi1sb2FkRXJyb3I9XHViODVjXHViNGRjIFx1YzYyNFx1Yjk1OA0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb0ZpbGVzV2l0aExvYWRFcnJvcnNfbXNnPVx1YjJlNFx1Yzc0YyBcdWQzMGNcdWM3N2NcdWM3NDQgXHViODVjXHViNGRjXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMFx1YzExYyBcdWMxMjBcdWQwZGRcdWQ1NWMgXHVkMzBjXHVjNzdjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJhYThcdWI0ZTAgXHVjYzM4XHVjODcwXHViOTdjIFx1YzgxY1x1YWM3MFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWQ2NTVcdWM3NzhcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWZpbGVzV2l0aExvYWRFcnJvcnNfdGl0bGU9XHViODVjXHViNGRjIFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1NWMgXHVkMzBjXHVjNzdjDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDk2Yzk1OC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZpbGVQYXRoPUNhbWluaG8gZG8gYXJxdWl2bw0KLWNhbm5vdFdyaXRlVG9GaWxlcz1OXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCBncmF2YXIgbm8ocykgYXJxdWl2byhzKQ0KLXJlYWRPbmx5RmlsZXNfdGl0bGU9QXJxdWl2byhzKSBkZSBsZWl0dXJhDQotcmVhZE9ubHlGaWxlc19tc2c9T3MgYXJxdWl2b3MgbGlzdGFkb3Mgbm9zIERldGFsaGVzIHNcdTAwZTNvIGRlIGxlaXR1cmEuIFRvcm5lLW9zIGdyYXZcdTAwZTF2ZWlzIGUgY2xpcXVlIGVtIFRlbnRhciBOb3ZhbWVudGUgcGFyYSBjb250aW51YXIuDQotZWxlbWVudFBhdGg9Q2FtaW5obyBkZSBFbGVtZW50bw0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c9T3MgYXJxdWl2b3MgYSBzZWd1aXIgZXN0XHUwMGUzbyBhdXNlbnRlcy4gQ2xpcXVlIGVtIE9LIHNlIGRlc2VqYXIgcmVtb3ZlciB0b2RhcyBhcyByZWZlclx1MDBlYW5jaWFzIGFvcyBhcnF1aXZvcyBzZWxlY2lvbmFkb3MgbmEgYmlibGlvdGVjYQ0KLW1pc3NpbmdGaWxlc190aXRsZT1BcnF1aXZvKHMpIGF1c2VudGUocykNCi1sb2FkRXJyb3I9RXJybyBkZSBjYXJyZWdhbWVudG8NCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9GaWxlc1dpdGhMb2FkRXJyb3JzX21zZz1PKHMpIHNlZ3VpbnRlKHMpIGFycXVpdm8ocykgblx1MDBlM28gcFx1MDBmNGRlKHB1ZGVyYW0pIHNlciBjYXJyZWdhZG8ocykuIENsaXF1ZSBlbSBPSyBzZSBkZXNlamFyIHJlbW92ZXIgdG9kYXMgYXMgcmVmZXJcdTAwZWFuY2lhcyBhb3MgYXJxdWl2b3Mgc2VsZWNpb25hZG9zIG5hIGJpYmxpb3RlY2ENCi1maWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlPUFycXVpdm8ocykgY29tIGVycm8gZGUgY2FycmVnYW1lbnRvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTc2MzhmOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZpbGVQYXRoPVx1NjU4N1x1NGVmNlx1OGRlZlx1NWY4NA0KLWNhbm5vdFdyaXRlVG9GaWxlcz1cdTY1ZTBcdTZjZDVcdTUxOTlcdTUxNjVcdTY1ODdcdTRlZjYNCi1yZWFkT25seUZpbGVzX3RpdGxlPVx1NTNlYVx1OGJmYlx1NjU4N1x1NGVmNg0KLXJlYWRPbmx5RmlsZXNfbXNnPVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1NGUyZFx1NjI0MFx1NTIxN1x1NzY4NFx1NjU4N1x1NGVmNlx1NjYyZlx1NTNlYVx1OGJmYlx1NjU4N1x1NGVmNlx1MzAwMlx1OGJmN1x1NGY3Zlx1NWI4M1x1NGVlY1x1NTNlZlx1NTE5OVx1NWU3Nlx1NTM1NVx1NTFmYlx1MjAxY1x1OTFjZFx1OGJkNVx1MjAxZFx1N2VlN1x1N2VlZFx1MzAwMg0KLWVsZW1lbnRQYXRoPVx1NTE0M1x1N2QyMFx1OGRlZlx1NWY4NA0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c9XHU3ZjNhXHU1YzExXHU0ZWU1XHU0ZTBiXHU2NTg3XHU0ZWY2XHUzMDAyXHU1OTgyXHU2NzljXHU4OTgxXHU5NjY0XHU1M2JiXHU1YmY5XHU1ZTkzXHU0ZTJkXHU5MDA5XHU1YjlhXHU2NTg3XHU0ZWY2XHU3Njg0XHU2MjQwXHU2NzA5XHU1ZjE1XHU3NTI4XHVmZjBjXHU4YmY3XHU1MzU1XHU1MWZiXHUyMDFjXHU3ODZlXHU1YjlhXHUyMDFkXHUzMDAyDQotbWlzc2luZ0ZpbGVzX3RpdGxlPVx1N2YzYVx1NWMxMVx1NzY4NFx1NjU4N1x1NGVmNg0KLWxvYWRFcnJvcj1cdTg4YzVcdTUxNjVcdTk1MTlcdThiZWYNCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9GaWxlc1dpdGhMb2FkRXJyb3JzX21zZz1cdTY1ZTBcdTZjZDVcdTg4YzVcdTUxNjVcdTRlZTVcdTRlMGJcdTY1ODdcdTRlZjZcdTMwMDJcdTU5ODJcdTY3OWNcdTg5ODFcdTk2NjRcdTUzYmJcdTViZjlcdTVlOTNcdTRlMmRcdTkwMDlcdTViOWFcdTY1ODdcdTRlZjZcdTc2ODRcdTYyNDBcdTY3MDlcdTVmMTVcdTc1MjhcdWZmMGNcdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdTc4NmVcdTViOWFcdTIwMWRcdTMwMDINCi1maWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlPVx1NTNkMVx1NzUxZlx1ODhjNVx1NTE2NVx1OTUxOVx1OGJlZlx1NzY4NFx1NjU4N1x1NGVmNg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyZjIwMjUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1maWxlUGF0aD1cdTZhOTRcdTY4NDhcdThkZWZcdTVmOTENCi1jYW5ub3RXcml0ZVRvRmlsZXM9XHU3MTIxXHU2Y2Q1XHU1YmViXHU1MTY1XHU2YTk0XHU2ODQ4DQotcmVhZE9ubHlGaWxlc190aXRsZT1cdTU1MmZcdThiODBcdTZhOTRcdTY4NDgNCi1yZWFkT25seUZpbGVzX21zZz1cdTMwMGNcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMGRcdTRlMmRcdTUyMTdcdTUxZmFcdTc2ODRcdTZhOTRcdTY4NDhcdTY2MmZcdTU1MmZcdThiODBcdTc2ODRcdTMwMDJcdThhY2JcdThhMmRcdTcwYmFcdTUzZWZcdTViZWJcdTUxNjVcdWZmMGNcdTUxOGRcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTkxY2RcdThhNjZcdTMwMGRcdTRmODZcdTdlN2NcdTdlOGNcdTkwMzJcdTg4NGNcdTMwMDINCi1lbGVtZW50UGF0aD1cdTUxNDNcdTdkMjBcdThkZWZcdTVmOTENCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9NaXNzaW5nRmlsZXNfbXNnPVx1OTA3YVx1NmYwZlx1NGUwYlx1NTIxN1x1NmE5NFx1Njg0OFx1MzAwMlx1ODJlNVx1ODk4MVx1NTcyOFx1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NzlmYlx1OTY2NFx1NWMwZFx1NjI0MFx1OTA3OFx1NmE5NFx1Njg0OFx1NzY4NFx1NmJjZlx1NGUwMFx1NTAwYlx1NTNjM1x1NzE2N1x1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1NzhiYVx1NWI5YVx1MzAwZFx1MzAwMg0KLW1pc3NpbmdGaWxlc190aXRsZT1cdTkwN2FcdTZmMGZcdTZhOTRcdTY4NDgNCi1sb2FkRXJyb3I9XHU4ZjA5XHU1MTY1XHU5MzJmXHU4YWE0DQotcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvRmlsZXNXaXRoTG9hZEVycm9yc19tc2c9XHU3MTIxXHU2Y2Q1XHU4ZjA5XHU1MTY1XHU0ZTBiXHU1MjE3XHU2YTk0XHU2ODQ4XHUzMDAyXHU4MmU1XHU4OTgxXHU1NzI4XHU3YTBiXHU1ZjBmXHU1ZWFiXHU0ZTJkXHU3OWZiXHU5NjY0XHU1YzBkXHU2MjQwXHU5MDc4XHU2YTk0XHU2ODQ4XHU3Njg0XHU2YmNmXHU0ZTAwXHU1MDBiXHU1M2MzXHU3MTY3XHVmZjBjXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU3OGJhXHU1YjlhXHUzMDBkXHUzMDAyDQotZmlsZXNXaXRoTG9hZEVycm9yc190aXRsZT1cdThmMDlcdTUxNjVcdTkzMmZcdThhYTRcdTc2ODRcdTZhOTRcdTY4NDgNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZTNlOGE4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjBjYzBlNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBMaWJyYXJ5IFhNSSAoTkwyKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTRmY2E3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMjE2ZTUwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIFhNSQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJlYzcyNjEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1maWxlUGF0aD1cdTA0MWZcdTA0NDNcdTA0NDJcdTA0NGMgXHUwNDNhIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0Mw0KLWNhbm5vdFdyaXRlVG9GaWxlcz1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzN1x1MDQzMFx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzOCBcdTA0MzIgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiDQotcmVhZE9ubHlGaWxlc190aXRsZT1cdTA0MjRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDQyXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDdcdTA0NDJcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1yZWFkT25seUZpbGVzX21zZz1cdTA0MjRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIsIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzIgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmXHUwNDQ1LCBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M2RcdTA0MzBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDQyXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDdcdTA0NDJcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuIFx1MDQyMFx1MDQzMFx1MDQzN1x1MDQ0MFx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzdcdTA0MzBcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0NGMgXHUwNDMyIFx1MDQzZFx1MDQzOFx1MDQ0NSBcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MWZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1lbGVtZW50UGF0aD1cdTA0MWZcdTA0NDNcdTA0NDJcdTA0NGMgXHUwNDNhIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0Mw0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c9XHUwNDIxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0YiBcdTA0M2RcdTA0MzUgXHUwNDNkXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDRiLiBcdTA0MWRcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDFlXHUwNDFhLCBcdTA0NDdcdTA0NDJcdTA0M2VcdTA0MzFcdTA0NGIgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDNkXHUwNDMwIFx1MDQ0ZFx1MDQ0Mlx1MDQzOCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDM4XHUwNDM3IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOA0KLW1pc3NpbmdGaWxlc190aXRsZT1cdTA0MWVcdTA0NDJcdTA0NDFcdTA0NDNcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiDQotbG9hZEVycm9yPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNhXHUwNDM1DQotcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvRmlsZXNXaXRoTG9hZEVycm9yc19tc2c9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDQ3XHUwNDM4XHUwNDQxXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0YiBcdTA0M2RcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzOFx1MDQ0Mlx1MDQ0Yy4gXHUwNDFkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQxZVx1MDQxYSwgXHUwNDQ3XHUwNDQyXHUwNDNlXHUwNDMxXHUwNDRiIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NDFcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzZFx1MDQzMCBcdTA0NGRcdTA0NDJcdTA0MzggXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQzOFx1MDQzNyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzgNCi1maWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNhXHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzZVx1MDQzMg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTY2YWYyZi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMDk2MzhmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBMaWJyYXJ5IFhNSSAoTkwyYSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNjgyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGQ5NTJhOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgWE1JLWJpYmxpb3Rlaw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTc2NWRmZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1maWxlUGF0aD1GaWxzdGkNCi1jYW5ub3RXcml0ZVRvRmlsZXM9S2FuIGlra2Ugc2tyaXZlIHRpbCBmaWwoZXIpDQotcmVhZE9ubHlGaWxlc190aXRsZT1Ta3JpdmViZXNreXR0ZWRlIGZpbChlcikNCi1yZWFkT25seUZpbGVzX21zZz1GaWxlcm5lIHVuZGVyIE9wbHlzbmluZ2VyIGVyIHNrcml2ZWJlc2t5dHRlZGUuIE9waFx1MDBlNnYgc2tyaXZlYmVza3l0dGVsc2VuLCBvZyBrbGlrIHBcdTAwZTUgUHJcdTAwZjh2IGlnZW4gZm9yIGF0IGZvcnRzXHUwMGU2dHRlLg0KLWVsZW1lbnRQYXRoPUVsZW1lbnRzdGkNCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9NaXNzaW5nRmlsZXNfbXNnPUZcdTAwZjhsZ2VuZGUgZmlsZXIgbWFuZ2xlci4gS2xpayBwXHUwMGU1IE9LLCBodmlzIGR1IHZpbCBzbGV0dGUgYWxsZSByZWZlcmVuY2VyIHRpbCBkZSB2YWxndGUgZmlsZXIgaSBiaWJsaW90ZWtldC4NCi1taXNzaW5nRmlsZXNfdGl0bGU9TWFuZ2xlbmRlIGZpbChlcikNCi1sb2FkRXJyb3I9SW5kbFx1MDBlNnNuaW5nc2ZlamwNCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9GaWxlc1dpdGhMb2FkRXJyb3JzX21zZz1GXHUwMGY4bGdlbmRlIGZpbChlcikga2FuIGlra2UgaW5kbFx1MDBlNnNlcy4gS2xpayBwXHUwMGU1IE9LLCBodmlzIGR1IHZpbCBzbGV0dGUgYWxsZSByZWZlcmVuY2VyIHRpbCBkZSB2YWxndGUgZmlsZXIgaSBiaWJsaW90ZWtldC4NCi1maWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlPUZpbChlcikgbWVkIGluZGxcdTAwZTZzbmluZ3NmZWpsDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MjBmMDUzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3Y2ZiMGUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIE1TUHJvamVjdCAoTkwxKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmU3YjAxMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9lcy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcHRfQlIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2l0LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmVmYzdjYy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5fZGUucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjM3IGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBNb2RlbGwgZlx1MDBmY3IgTWljcm9zb2Z0IFByb2plY3QgMjAwMw0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiZTllZmUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgPGNvcHlyaWdodD4NCi0jIDwvY29weXJpZ2h0Pg0KLSMNCi0jICRJZDogcGx1Z2luX2VzLnByb3BlcnRpZXMsdiAxLjEgMjAwNi8xMS8wMiAwMDo1MDozNyBqdGhhbSBFeHAgJA0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIFRvIGNvZGUgZGV2ZWxvcGVyOg0KLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1wbHVnaW5OYW1lID0gTW9kZWxvIE1pY3Jvc29mdCBQcm9qZWN0IDIwMDMNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjFmYTIyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+DQotIyA8L2NvcHlyaWdodD4NCi0jDQotIyAkSWQ6IHBsdWdpbl9mci5wcm9wZXJ0aWVzLHYgMS4xIDIwMDYvMTEvMDIgMDA6NTA6MzcganRoYW0gRXhwICQNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcGx1Z2luTmFtZSA9IE1vZFx1MDBlOGxlIE1pY3Jvc29mdCBQcm9qZWN0IDIwMDMNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OTMzODVmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+DQotIyA8L2NvcHlyaWdodD4NCi0jDQotIyAkSWQ6IHBsdWdpbl9pdC5wcm9wZXJ0aWVzLHYgMS4xIDIwMDYvMTEvMDIgMDA6NTA6MzcganRoYW0gRXhwICQNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcGx1Z2luTmFtZSA9IE1vZGVsbG8gTWljcm9zb2Z0IFByb2plY3QgMjAwMw0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5NjEyZDEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgPGNvcHlyaWdodD4NCi0jIDwvY29weXJpZ2h0Pg0KLSMNCi0jICRJZDogcGx1Z2luX2phLnByb3BlcnRpZXMsdiAxLjEgMjAwNi8xMS8wMiAwMDo1MDozNyBqdGhhbSBFeHAgJA0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIFRvIGNvZGUgZGV2ZWxvcGVyOg0KLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1wbHVnaW5OYW1lID0gTWljcm9zb2Z0IFByb2plY3QgMjAwMyBNb2RlbA0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxNzc0ZjkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgPGNvcHlyaWdodD4NCi0jIDwvY29weXJpZ2h0Pg0KLSMNCi0jICRJZDogcGx1Z2luX2tvLnByb3BlcnRpZXMsdiAxLjEgMjAwNi8xMS8wMiAwMDo1MDozNyBqdGhhbSBFeHAgJA0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIFRvIGNvZGUgZGV2ZWxvcGVyOg0KLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1wbHVnaW5OYW1lID0gTWljcm9zb2Z0IFByb2plY3QgMjAwMyBcdWJhYThcdWIzNzgNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZTQ5MTI1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+DQotIyA8L2NvcHlyaWdodD4NCi0jDQotIyAkSWQ6IHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLHYgMS4xIDIwMDYvMTEvMDIgMDA6NTA6MzcganRoYW0gRXhwICQNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcGx1Z2luTmFtZSA9IE1vZGVsbyBNaWNyb3NvZnQgUHJvamVjdCAyMDAzDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWQ0YjE2OC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5femhfQ04ucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjM3IGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBNaWNyb3NvZnQgUHJvamVjdCAyMDAzIFx1NmEyMVx1NTc4Yg0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwZDExZWMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgPGNvcHlyaWdodD4NCi0jIDwvY29weXJpZ2h0Pg0KLSMNCi0jICRJZDogcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsdiAxLjEgMjAwNi8xMS8wMiAwMDo1MDozNyBqdGhhbSBFeHAgJA0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIFRvIGNvZGUgZGV2ZWxvcGVyOg0KLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1wbHVnaW5OYW1lID0gTWljcm9zb2Z0IFByb2plY3QgMjAwMyBNb2RlbA0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MDY3MzQ5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxMDZhMDIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIE1TUHJvamVjdCAoTkwyKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjU0ZmNhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDdkYTQwNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5fcnUucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjM3IGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBcdTA0MWNcdTA0M2VcdTA0MzRcdTA0MzVcdTA0M2JcdTA0NGMgTWljcm9zb2Z0IFByb2plY3QgMjAwMw0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1YzI3ODQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxNDNkYjEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBNU1Byb2plY3QgKE5MMmEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZGMzZDlkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5fZGEucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjQ4IGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBNb2RlbCB0aWwgTWljcm9zb2Z0IFByb2plY3QgMjAwMw0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTM0ODUxMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI2MTc4M2UuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgUGxhdGZvcm0gKE5MMSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmYzN2E4NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0jDQotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQ0KLQ0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGxhdGZvcm0gMy4xLjEgbWl0IEVNRiB1bmQgR0VGIA0KLQ0KLWJsdXJiPUVjbGlwc2UgUGxhdGZvcm1cblwNCi1cblwNCi1WZXJzaW9uOiAzLjEuMVxuXA0KLUJ1aWxkLUlEOiBNMjAwNTA5MjktMDg0MFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA1LiBBbGxlIFJlY2h0ZSB2b3JiZWhhbHRlbi5cblwNCi1CZXN1Y2hlbiBTaWUgZGllIFdlYnNlaXRlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm0uXG5cDQotXG5cDQotRGllc2VzIFByb2R1a3QgZW50aFx1MDBlNGx0IFNvZnR3YXJlLCBkaWUgdm9uIGRlclxuXA0KLUFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKSBlbnR3aWNrZWx0IHd1cmRlLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9lcy5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2VzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5MWFkYjYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPg0KLTx0aXRsZT5BY2VyY2EgZGU8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJFUy1FUyI+DQotPGgyPkFjZXJjYSBkZWwgY29udGVuaWRvPC9oMj4NCi0gDQotPHA+MjQgZGUgZmVicmVybyBkZSAyMDA1PC9wPgkNCi08aDM+TGljZW5jaWE8L2gzPg0KLQ0KLTxwPkxhIEVjbGlwc2UgRm91bmRhdGlvbiBoYSBoZWNobyBxdWUgdG9kbyBlbCBDb250ZW5pZG8gZXN0w6kgZGlzcG9uaWJsZSBlbiBlc3RlDQotcGx1Zy1pbiAoJnF1b3Q7Q29udGVuaWRvJnF1b3Q7KS4gIEEgbWVub3MgcXVlIHNlIGluZGlxdWUgbG8gY29udHJhcmlvIG3DoXMNCi1hZGVsYW50ZSwgZWwgQ29udGVuaWRvIHNlIHByb3BvcmNpb25hIGFsIHVzdWFyaW8gYmFqbyBsb3MgdMOpcm1pbm9zIHkNCi1jb25kaWNpb25lcyBkZSBsYSBMaWNlbmNpYSBww7pibGljYSBkZSBFY2xpcHNlIFZlcnNpw7NuIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIA0KLVVuYSBjb3BpYSBkZSBsYSBFUEwgZXN0w6EgZGlzcG9uaWJsZSBlbg0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotUGFyYSBsb3MgZmluZXMgZGUgbGEgRVBMLCAmcXVvdDtQcm9ncmFtYSZxdW90OyBxdWllcmUgZGVjaXIgZWwgQ29udGVuaWRvLjwvcD4NCi0NCi08cD5TaSBubyByZWNpYmnDsyBlc3RlIENvbnRlbmlkbyBkaXJlY3RhbWVudGUgZGUgbGEgRWNsaXBzZSBGb3VuZGF0aW9uLCDDqXN0ZQ0KLWVzdMOhIHNpZW5kbyByZWRpc3RyaWJ1aWRvIHBvciB0ZXJjZXJvcyAoJnF1b3Q7UmVkaXN0cmlidWlkb3ImcXVvdDspIHkgcHVlZGVuDQotYXBsaWNhcnNlIHTDqXJtaW5vcyB5IGNvbmRpY2lvbmVzIGRpc3RpbnRvcyBhbCB1c28gZGUgY3VhbHF1aWVyIGPDs2RpZ28gZGUgb2JqZXRvDQotZGVsIENvbnRlbmlkby4NCi1Db21wcnVlYmUgbGEgbGljZW5jaWEgZGVsIFJlZGlzdHJpYnVpZG9yIHF1ZSBzZSBwcm9wb3JjaW9uw7MganVudG8gY29uIGVsDQotQ29udGVuaWRvLiAgU2kgbm8gZXhpc3RlIHRhbCBsaWNlbmNpYSwgcMOzbmdhc2UgZW4gY29udGFjdG8gY29uIGVsDQotUmVkaXN0cmlidWlkb3IuICBBIG1lbm9zIHF1ZSBzZSBpbmRpcXVlIGxvIGNvbnRyYXJpbyBtw6FzIGFkZWxhbnRlLCBsb3MgdMOpcm1pbm9zDQoteSBjb25kaWNpb25lcyBkZSBsYSBFUEwgc2Ugc2VndWlyw6FuIGFwbGljYW5kbyBhIGN1YWxxdWllciBjw7NkaWdvIGZ1ZW50ZSBkZWwNCi1Db250ZW5pZG8uPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDZkOTljNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0jDQotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQ0KLQ0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGxhdGZvcm0gMy4xLjEgY29uIEVNRiB5IEdFRiANCi0NCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cDQotXG5cDQotVmVyc2lcdTAwZjNuOiAzLjEuMVxuXA0KLUlEIGRlIGJ1aWxkOiBNMjAwNTA5MjktMDg0MFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgQ29sYWJvcmFkb3JlcyBkZSBFY2xpcHNlIHkgb3Ryb3MgMjAwMCwgMjAwNS4gIFJlc2VydmFkb3MgdG9kb3MgbG9zIGRlcmVjaG9zLlxuXA0KLVZpc2l0ZSBsYSBwXHUwMGUxZ2luYSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cDQotXG5cDQotRXN0ZSBwcm9kdWN0byBpbmNsdXllIHNvZnR3YXJlIGRlc2Fycm9sbGFkbyBwb3IgbGFcblwNCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2ZyLmh0bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfZnIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzg3MzNlOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfZnIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+DQotPHRpdGxlPkEgcHJvcG9zIGRlPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iRlItRlIiPg0KLTxoMj5BIHByb3BvcyBkZSBjZSBjb250ZW51PC9oMj4NCi0gDQotPHA+MjQgZsOpdnJpZXIgMjAwNTwvcD4JDQotPGgzPkxpY2VuY2U8L2gzPg0KLQ0KLTxwPkxhIEZvbmRhdGlvbiBFY2xpcHNlIGZvdXJuaXQgbCdlbnNlbWJsZSBkdSBjb250ZW51IGZpZ3VyYW50IGRhbnMgY2UgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudSZxdW90OykuICBTYXVmIGluZGljYXRpb24gY29udHJhaXJlIG1lbnRpb25uw6llIGNpLWRlc3NvdXMsIGxlIGNvbnRlbnUgdm91cyBlc3QgZm91cm5pIGNvbmZvcm3DqW1lbnQgYXV4IHRlcm1lcyBldCBjb25kaXRpb25zIGRlDQotbCdFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgVW5lIGNvcGllIGRlIGwnRVBMIGVzdCBkaXNwb25pYmxlIMOgIGwnYWRyZXNzZSBzdWl2YW50ZSA6IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotRGFucyBsZSBjYWRyZSBkZSBsJ0VQTCwgbGUgdGVybWUgJnF1b3Q7UHJvZ3JhbW1lJnF1b3Q7IHNpZ25pZmllICJDb250ZW51Ii48L3A+DQotDQotPHA+U2kgdm91cyBuJ2F2ZXogcGFzIHJlw6d1IGNlIGNvbnRlbnUgZGlyZWN0ZW1lbnQgdmlhIGxhIEZvbmRhdGlvbiBFY2xpcHNlLCB1bmUgYXV0cmUgcGFydGllIGVzdCBlbiB0cmFpbiBkZSBsZSByZWRpc3RyaWJ1ZXIgKCZxdW90O1JlZGlzdHJpYnV0ZXVyJnF1b3Q7KSBldCBkaWZmw6lyZW50cyB0ZXJtZXMgZXQgY29uZGl0aW9ucyBwZXV2ZW50DQotcydhcHBsaXF1ZXIgw6Agdm90cmUgdXRpbGlzYXRpb24gZGUgdG91dCBjb2RlIG9iamV0IGZpZ3VyYW50IGRhbnMgbGUgY29udGVudS4gIFbDqXJpZmlleiBsYSBsaWNlbmNlIGR1IHJlZGlzdHJpYnV0ZXVyIGZvdXJuaWUgYXZlYyBsZSBjb250ZW51LiAgU2kgdW5lIHRlbGxlIGxpY2VuY2UgbidleGlzdGUgcGFzLCBjb250YWN0ZXogbGUgcmVkaXN0cmlidXRldXIuICBTYXVmIGluZGljYXRpb24gY29udHJhaXJlIG1lbnRpb25uw6llIGNpLWRlc3NvdXMsDQotbGVzIHRlcm1lcyBldCBjb25kaXRpb25zIGRlIGwnRVBMIHMnYXBwbGlxdWVudCB0b3Vqb3VycyDDoCBuJ2ltcG9ydGUgcXVlbCBjb2RlIHNvdXJjZSBmaWd1cmFudCBkYW5zIGxlIGNvbnRlbnUuPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGNjN2Q2NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0jDQotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQ0KLQ0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGxhdGZvcm0gMy4xLjEgYXZlYyBFTUYgZXQgR0VGIA0KLQ0KLWJsdXJiPVBsYXRlZm9ybWUgRWNsaXBzZVxuXA0KLVxuXA0KLVZlcnNpb24gOiAzLjEuMVxuXA0KLUlkZW50aWZpY2F0ZXVyIGRlIGNvbnN0cnVjdGlvbiA6IE0yMDA1MDkyOS0wODQwXG5cDQotXG5cDQotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXA0KLVZpc2l0ZXogbGEgcGFnZSBzdWl2YW50ZSA6IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm1cblwNCi1cblwNCi1DZSBwcm9kdWl0IGNvbnRpZW50IGRlcyBsb2dpY2llbHMgZFx1MDBlOXZlbG9wcFx1MDBlOXMgcGFyXG5cDQotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnLw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9pdC5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2l0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2ODY2NGMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2l0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPg0KLTx0aXRsZT5JbmZvcm1hemlvbmkgc3UNCi08L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJFTi1VUyI+DQotPGgyPkluZm9ybWF6aW9uaSBzdSBxdWVzdG8gY29udGVudXRvOg0KLTwvaDI+DQotIA0KLTxwPjI0IEZlYmJyYWlvLCAyMDA1PC9wPgkNCi08aDM+TGljZW56YTwvaDM+DQotDQotPHA+RWNsaXBzZSBGb3VuZGF0aW9uIHJlbmRlIGRpc3BvbmliaWxlIHR1dHRvIGlsIGNvbnRlbnV0byBpbiBxdWVzdG8gcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuIEEgbWVubyBjaGUgbm9uIHNpYSBkaXZlcnNhbWVudGUgaW5kaWNhdG8gZGkgc2VndWl0bywgaWwgQ29udGVudCDDqCBmb3JuaXRvIGluIGJhc2UgYWxsZSBjbGF1c29sZSBlIGNvbmRpemlvbmkgZGkgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uZSAxLjAgKCZxdW90O0VQTCZxdW90OykuIFVuYSBjb3BpYSBkaSBFUEwgw6ggZGlzcG9uaWJpbGUgcHJlc3NvIGlsIHNpdG8gPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBQZXIgZ2xpIHNjb3BpIGRpIEVQTCwgJnF1b3Q7UHJvZ3JhbW1hJnF1b3Q7IHZvcnLDoCBkaXJlIENvbnRlbnV0by48L3A+DQotDQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5DQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQ0KLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVhZTdlMjYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotIw0KLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30NCi0NCi1mZWF0dXJlTmFtZT1QaWF0dGFmb3JtYSBFY2xpcHNlIDMuMS4xIGNvbiBFTUYgZSBHRUYgDQotDQotYmx1cmI9UGlhdHRhZm9ybWEgRWNsaXBzZVxuXA0KLVxuXA0KLVZlcnNpb25lOiAzLjEuMVxuXA0KLUlEIGJ1aWxkOiBNMjAwNTA5MjktMDg0MFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgQ29udHJpYnV0b3IgRWNsaXBzZSBlIGFsdHJpIDIwMDAsIDIwMDUuICBUdXR0aSBpIGRpcml0dGkgcmlzZXJ2YXRpLlxuXA0KLVZpc2l0YXJlIGwnaW5kaXJpenpvIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm1cblwNCi1cblwNCi1RdWVzdG8gcHJvZG90dG8gaW5jbHVkZSBzb2Z0d2FyZSBzdmlsdXBwYXRvIGRhXG5cDQotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnLw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9qYS5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2phLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiZjZlMzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2phLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4NCi08dGl0bGU+44OQ44O844K444On44Oz5oOF5aCxDQotPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iSkEtSlAiPg0KLTxoMj7mnKzmm7jjgavjgaTjgYTjgaY8L2gyPg0KLSANCi08cD4yMDA1IOW5tCAyIOaciCAyNCDml6U8L3A+CQ0KLTxoMz7jg6njgqTjgrvjg7Pjgrk8L2gzPg0KLQ0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUNCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkNCi1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlDQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjI5NDZjMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0jDQotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQ0KLQ0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgXHUzMGQ3XHUzMGU5XHUzMGMzXHUzMGM4XHUzMGQ1XHUzMGE5XHUzMGZjXHUzMGUwIDMuMS4xIChFTUYgXHUzMDRhXHUzMDg4XHUzMDczIEdFRiBcdTRlZDhcdTMwNGQpIA0KLQ0KLWJsdXJiPUVjbGlwc2UgXHUzMGQ3XHUzMGU5XHUzMGMzXHUzMGM4XHUzMGQ1XHUzMGE5XHUzMGZjXHUzMGUwXG5cDQotXG5cDQotXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzOiAzLjEuMVxuXA0KLVx1MzBkM1x1MzBlYlx1MzBjOSBJRDogTTIwMDUwOTI5LTA4NDBcblwNCi1cblwNCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cDQotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybSBcdTMwOTJcdTUzYzJcdTcxNjdcdTMwMDJcblwNCi1cblwNCi1cdTMwNTNcdTMwNmVcdTg4ZmRcdTU0YzFcdTMwNmJcdTMwNmZcdTMwMDFBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLylcblwNCi1cdTMwNmJcdTMwODhcdTMwOGFcdTk1OGJcdTc2N2FcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYmRcdTMwZDVcdTMwYzhcdTMwYTZcdTMwYTdcdTMwYTJcdTMwNGNcdTU0MmJcdTMwN2VcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfa28uaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9rby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkN2U5YmZkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9rby5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQotPHRpdGxlPuygnO2SiCDsoJXrs7Q8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJLTy1LUiI+DQotPGgyPuydtCDsu6jthZDsuKAg7KCV67O0PC9oMj4NCi0gDQotPHA+MjAwNeuFhCAy7JuUIDI07J28PC9wPgkNCi08aDM+65287J207IS87IqkPC9oMz4NCi0NCi08cD5FY2xpcHNlIEZvdW5kYXRpb27snYAg67O4IO2UjOufrOq3uOyduOydmCDrqqjrk6Ag7Luo7YWQ7LigKOydtO2VmCAmcXVvdDvsu6jthZDsuKAmcXVvdDsp66W8IOyCrOyaqe2VoCDsiJgg7J6I64+E66GdIOygnOqzte2VqeuLiOuLpC4g7JWE656Y7JeQ7IScIOuLrOumrCDrqoXsi5ztlZjsp4Ag7JWK7J2AIO2VnCwg67O4IOy7qO2FkOy4oOuKlCBFY2xpcHNlIOqzteyaqSDrnbzsnbTshLzsiqQg67KE7KCEIDEuMCjsnbTtlZggJnF1b3Q7RVBMJnF1b3Q7KeydmCDsobDqsbTsl5Ag7J2Y6rGw7ZWY7JesDQot7KCc6rO165Cp64uI64ukLiBFUEwg7IKs67O47J2AIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT7sl5DshJwg7ZmV7J247ZWgIOyImCDsnojsirXri4jri6QuDQotRVBM7J2YIOuqqeyggeyDgSwgJnF1b3Q77ZSE66Gc6re4656oJnF1b3Q77J20656AIOy7qO2FkOy4oOulvCDsnZjrr7jtlanri4jri6QuPC9wPg0KLQ0KLTxwPuq3gO2VmOqwgCDrs7gg7Luo7YWQ7Lig66W8IEVjbGlwc2UgRm91bmRhdGlvbuycvOuhnOu2gO2EsCDsp4HsoJEg7KCc6rO167Cb7KeAIOyViuydgCDqsr3smrAsIOuzuCDsu6jthZDsuKDripQg7KCcM+yekCjsnbTtlZggJnF1b3Q77J6s67Cw7Y+s7J6QJnF1b3Q7KeyXkCDsnZjtlbQg7J6s67Cw7Y+s65CY6rOgIOyeiOycvOupsCDqt4DtlZjsnZgg67O4IOy7qO2FkOy4oOydmCDsmKTruIzsoJ3tirgg7L2U65OcIOyCrOyaqeyXkCDrjIDtlZjsl6wg64uk66W4IOyhsOqxtOydtCDsoIHsmqnrkKnri4jri6QuIOuzuCDsu6jthZDsuKDsmYAg7ZWo6ruYIOygnOqzteuQnCDsnqzrsLDtj6zsnpDsnZgg65287J207IS87Iqk66W8IO2ZleyduO2VmOyLreyLnOyYpC4g7J2065+s7ZWcIOudvOydtOyEvOyKpOqwgCDsl4bripQg6rK97JqwLCDsnqzrsLDtj6zsnpDsl5Dqsowg66y47J2Y7ZWY7Iut7Iuc7JikLiDslYTrnpjsl5DshJwg64us66asIOuqheyLnO2VmOyngCDslYrripQg7ZWcLCBFUEzsnZgg7KGw6rG07J20IOuzuCDsu6jthZDsuKDsnZgg66qo65OgIOyGjOyKpCDsvZTrk5zsl5Ag7KCB7Jqp65Cp64uI64ukLjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlODUzMjIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotIw0KLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30NCi0NCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFx1ZDUwY1x1YjdhYlx1ZDNmYyAzLjEuMShFTUYgXHViYzBmIEdFRiBcdWQzZWNcdWQ1NjgpIA0KLQ0KLWJsdXJiPUVjbGlwc2UgXHVkNTBjXHViN2FiXHVkM2ZjXG5cDQotXG5cDQotXHViYzg0XHVjODA0OiAzLjEuMVxuXA0KLVx1YmU0Y1x1YjRkYyBJRDogTTIwMDUwOTI5LTA4NDBcblwNCi1cblwNCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwNCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXHVjNzQ0IFx1YmMyOVx1YmIzOFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC5cblwNCi1cblwNCi1cdWM3NzQgXHVjODFjXHVkNDg4XHVjNWQwXHViMjk0IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pXHVjNWQwXHVjMTFjIFxuXA0KLVx1YWMxY1x1YmMxY1x1ZDU1YyBcdWMxOGNcdWQ1MDRcdWQyYjhcdWM2ZThcdWM1YjRcdWFjMDAgXHVkM2VjXHVkNTY4XHViNDE4XHVjNWI0IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfcHRfQlIuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9wdF9CUi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjQ4NTAzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9wdF9CUi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4NCi08dGl0bGU+U29icmUgPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iRU4tVVMiPg0KLTxoMj5Tb2JyZSBFc3RlIENvbnRlw7pkbzwvaDI+DQotIA0KLTxwPjI0IGRlIGZldmVyZWlybyBkZSAyMDA1PC9wPgkNCi08aDM+TGljZW7Dp2E8L2gzPg0KLQ0KLTxwPkEgRWNsaXBzZSBGb3VuZGF0aW9uIGRpc3BvbmliaWxpemEgdG9kbyBjb250ZcO6ZG8gbmVzdGUgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICANCi1BIG1lbm9zIHF1ZSBpbmRpY2FkbyBvIGNvbnRyw6FyaW8gYSBzZWd1aXIsIHRvZG8gQ29udGXDumRvIMOpIGZvcm5lY2lkbyBhIHZvY8OqIHNvYiBvcyB0ZXJtb3MNCi1lIGNvbmRpw6fDtWVzIGRvIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc8OjbyAxLjAgKCZxdW90O0VQTCZxdW90OykuICBVbWEgY8OzcGlhIGRvIEVQTA0KLWVzdMOhIGRpc3BvbsOtdmVsIGVtDQotPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBQYXJhIGZpbnMgZG8gRVBMLCAmcXVvdDtQcm9ncmFtYSZxdW90OyBzaWduaWZpY2Fyw6EgbyBDb250ZcO6ZG8uPC9wPg0KLQ0KLTxwPlNlIHZvY8OqIG7Do28gcmVjZWJldSBlc3RlIENvbnRlw7pkbyBkaXJldGFtZW50ZSBkYSBFY2xpcHNlIEZvdW5kYXRpb24sIG8gQ29udGXDumRvIGVzdMOhDQotc2VuZG8gcmVkaXN0cmlidcOtZG8gcG9yIG91dHJhIHBhcnRlICgmcXVvdDtSZWRpc3RyaWJ1aWRvciZxdW90OykgZSB0ZXJtb3MgZSBjb25kacOnw7Vlcw0KLWRpZmVyZW50ZXMgcG9kZW0gc2UgYXBsaWNhciBhbyB1c28gZGUgcXVhbHF1ZXIgY8OzZGlnbyBkZSBvYmpldG8gbm8gQ29udGXDumRvLiAgVmVyaWZpcXVlIGENCi1saWNlbsOnYSBkbyBSZWRpc3RyaWJ1aWRvciBxdWUgZm9pIGZvcm5lY2lkYSBjb20gbyBDb250ZcO6ZG8uICBTZSBuZW5odW1hIGxpY2Vuw6dhIGV4aXN0aXIsDQotZW50cmUgZW0gY29udGF0byBjb20gbyBSZWRpc3RyaWJ1aWRvci4gIEEgbWVub3MgcXVlIGluZGljYWRvIG8gY29udHLDoXJpbyBhIHNlZ3Vpciwgb3MNCi10ZXJtb3MgZSBjb25kacOnw7VlcyBkbyBFUEwgc2UgYXBsaWNhcsOjbyBhIHF1YWxxdWVyIGPDs2RpZ28tZm9udGUgbm8gQ29udGXDumRvLiAgPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmRiOTM1Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0jDQotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQ0KLQ0KLWZlYXR1cmVOYW1lPVBsYXRhZm9ybWEgRWNsaXBzZSAzLjEuMSBjb20gRU1GIGUgR0VGIA0KLQ0KLWJsdXJiPVBsYXRhZm9ybWEgRWNsaXBzZVxuXA0KLVxuXA0KLVZlcnNcdTAwZTNvOiAzLjEuMVxuXA0KLUlEIGRvIEJ1aWxkOiBNMjAwNTA5MjktMDg0MFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgY29udHJpYnVpZG9yZXMgRWNsaXBzZSBlIG91dHJvcyAyMDAwLCAyMDA1LiAgVG9kb3Mgb3MgZGlyZWl0b3MgcmVzZXJ2YWRvcy5cblwNCi1WaXNpdGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXA0KLVxuXA0KLUVzdGUgcHJvZHV0byBpbmNsdWkgc29mdHdhcmUgZGVzZW52b2x2aWRvIHBlbGFcblwNCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X3poX0NOLmh0bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfemhfQ04uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDNkNWU0MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfemhfQ04uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KLTx0aXRsZT7lhbPkuo48L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJaSC1DSCI+DQotPGgyPuWFs+S6juacrOKAnOWGheWuueKAnTwvaDI+DQotIA0KLTxwPjIwMDUg5bm0IDIg5pyIIDI0IOaXpTwvcD4JDQotPGgzPuiuuOWPr+ivgTwvaDM+DQotDQotPHA+RWNsaXBzZSBGb3VuZGF0aW9uIOaPkOS+m+atpOaPkuS7tu+8iOKAnOWGheWuueKAne+8ieS4reeahOaJgOacieWGheWuueOAgumZpOmdnuS4i+aWh+WPpuacieaMh+aYju+8jOWQpuWImeaCqOWcqOS9v+eUqOWGheWuueaXtuW/hemhu+mBteWuiCBFY2xpcHNlIOWFrOWFseiuuOWPr+ivge+8iEVQTO+8iVYxLjAg5Lit55qE5p2h5qy+5ZKM5p2h5Lu244CC5oKo5Y+v5Lul5Yiw5Lul5LiL572R5Z2A6I635b6XIEVQTO+8mgc8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+44CC5ZyoIEVQTCDnmoTkvb/nlKjkuK3vvIzigJznqIvluo/igJ3ljbPmjIfigJzlhoXlrrnigJ3jgII8L3A+DQotDQotPHA+5aaC5p6c5oKo5LiN5piv55u05o6l5LuOIEVjbGlwc2UgRm91bmRhdGlvbiDmlLbliLDmraTigJzlhoXlrrnigJ3vvIzljbPigJzlhoXlrrnigJ3nlLHnrKzkuInmlrnvvIjigJzova/ku7bplIDllK7llYbigJ3vvInlho3mrKHliIblj5HvvIzpgqPkuYgsIOaCqOS9v+eUqOKAnOWGheWuueKAneS4reeahOaJgOacieWvueixoeS7o+eggeaXtuWPr+iDveW/hemhu+mBteWuiOWFtuS7luadoeasvuWSjOadoeS7tuOAguivt+afpemYheKAnOWGheWuueKAnemaj+mZhOeahOeUsemUgOWUruWVhumigeWPkeeahOiuuOWPr+ivgeOAguWmguaenOatpOexu+iuuOWPr+ivgeS4jeWtmOWcqO+8jOivt+iBlOezu+mUgOWUruWVhuOAgumZpOmdnuS4i+aWh+S4reWPpuacieaMh+aYju+8jOWQpuWImSBFUEwg55qE5p2h5qy+5ZKM5p2h5Lu25LuN6YCC55So5LqO4oCc5YaF5a654oCd5Lit55qE5omA5pyJ5rqQ5Luj56CB44CCPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzZlOGRmMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfemhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0jDQotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQ0KLQ0KLWZlYXR1cmVOYW1lPVx1NWUyNlx1NjcwOSBFTUYgXHU1NDhjIEdFRiBcdTc2ODQgRWNsaXBzZSBQbGF0Zm9ybSAzLjEuMQ0KLQ0KLWJsdXJiPUVjbGlwc2UgUGxhdGZvcm1cblwNCi1cblwNCi1cdTcyNDhcdTY3MmNcdWZmMWEzLjEuMVxuXA0KLVx1NWRlNVx1NGY1Y1x1NzI0OFx1NjcyY1x1NjgwN1x1OGJjNlx1ZmYxYU0yMDA1MDkyOS0wODQwXG5cDQotXG5cDQotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXA0KLVx1OGJmN1x1OGJiZlx1OTVlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cDQotXG5cDQotXHU2NzJjXHU0ZWE3XHU1NGMxXHU1MzA1XHU1NDJiXHU3NTMxIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uXHVmZjA4aHR0cDovL3d3dy5hcGFjaGUub3JnL1x1ZmYwOVx1NWYwMFx1NTNkMVx1NzY4NFx1OGY2Zlx1NGVmNlxuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X3poX1RXLmh0bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfemhfVFcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDc4NDIyNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfemhfVFcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KLTx0aXRsZT7pl5zmlrw8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJ6aC1UVyI+DQotPGgyPumXnOaWvOacrOWFp+WuuTwvaDI+DQotIA0KLTxwPjIwMDUg5bm0IDIg5pyIIDI0IOaXpTwvcD4JDQotPGgzPuaOiOasijwvaDM+DQotDQotPHA+RWNsaXBzZSBGb3VuZGF0aW9uIOeZvOS9iOacrOWkluaOm+eoi+W8j+S4reeahOaJgOacieWFp+Wuue+8iOOAjOWFp+WuueOAje+8ieOAguS7peS4i+mZpOWPpuacieiou+aYjuiAheWklu+8jOOAjOWFp+WuueOAjeWdh+S+neOAjEVjbGlwc2Ug5YWs5YWx5o6I5qyKIDEuMCDniYjjgI0oJnF1b3Q7RVBMJnF1b3Q7KSDkuYvmop3mrL7ogIzmj5Dkvpvmgqjkvb/nlKjjgIINCi08YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+IOS4iuW3suWFrOS9iOS4gOS7vSBFUEzjgIINCi3lsI0gRVBMIOiAjOiogO+8jOOAjOeoi+W8j+OAjeaEj+aMh+OAjOWFp+WuueOAjeOAgjwvcD4NCi0NCi08cD7oi6XpnZ7nm7TmjqXlvp4gRWNsaXBzZSBGb3VuZGF0aW9uIOaUtuWIsOacrOOAjOWFp+WuueOAje+8jOWJh+OAjOWFp+WuueOAjeeUseesrOS4ieaWue+8iOOAjOWGjeeZvOihjOiAheOAje+8iemHjeaWsOeZvOihjO+8jOOAjOWFp+WuueOAjeS4reS5i+S7u+S9leebrueahOeivOWPr+iDveacieS4jeWQjOeahOS9v+eUqOaineasvuOAgg0KLeiri+WPg+mWseOAjOWFp+WuueOAjemaqOmZhOS5i+OAjOWGjeeZvOihjOiAheOAjeaOiOasiuOAguiLpeacqumZhOS4iuaOiOasiu+8jOiri+iBr+e1oeOAjOWGjeeZvOihjOiAheOAjeOAguS7peS4i+mZpOWPpuacieiou+aYjuiAheWklu+8jEVQTCDmop3mrL7ku43pgannlKjmlrzjgIzlhaflrrnjgI3kuK3kuYvku7vkvZXljp/lp4vnorzjgII8L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfemhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDNhNjhlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgYWJvdXQucHJvcGVydGllcw0KLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQ0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncw0KLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLg0KLSMNCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9DQotDQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjEuMVx1ZmYwY1x1NjQyZFx1OTE0ZCBFTUYgXHU4MjA3IEdFRiANCi0NCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cDQotXG5cDQotXHU3MjQ4XHU2NzJjXHVmZjFhMy4xLjFcblwNCi1cdTVlZmFcdTdmNmUgSURcdWZmMWFNMjAwNTA5MjktMDg0MFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwNCi1cdThhY2JcdTkwMjBcdThhMmEgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXA0KLVxuXA0KLVx1NjcyY1x1NzUyMlx1NTRjMVx1NTMwNVx1NTQyYiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvXG5cDQotXHU2MjQwXHU5NThiXHU3NjdjXHU3Njg0XHU4ZWRmXHU5YWQ0DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTJkNTEzMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgYWJvdXRfZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfamEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfcHRfQlIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfemhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfemhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGFib3V0X2l0LnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGFib3V0X2RlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmIxYmZjZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgLSBQbGF0dGZvcm0tRmVhdHVyZQ0KLWZlYXR1cmVQbHVnaW5OYW1lTkw9RVBGIC0gUGxhdHRmb3JtLUZlYXR1cmUgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMwZGFmZDEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9Q2FyYWN0ZXJcdTAwZWRzdGljYSBkZSBsYSBwbGF0YWZvcm1hIGRlIEVQRg0KLWZlYXR1cmVQbHVnaW5OYW1lTkw9Q2FyYWN0ZXJcdTAwZWRzdGljYSBkZSBsYSBwbGF0YWZvcm1hIGRlIEVQRiAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODcwOGE1Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1Gb25jdGlvbiBwbGF0ZWZvcm1lIEVQRg0KLWZlYXR1cmVQbHVnaW5OYW1lTkw9Rm9uY3Rpb24gcGxhdGVmb3JtZSBFUEYgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1OTcyNTMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9RnVuemlvbmUgcGlhdHRhZm9ybWEgRVBGDQotZmVhdHVyZVBsdWdpbk5hbWVOTD1GdW56aW9uZSBQaWF0dGFmb3JtYSBFUEYgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2YjU0YzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9RVBGIFBsYXRmb3JtIEZlYXR1cmUNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBcdTMwZDdcdTMwZTlcdTMwYzNcdTMwYzhcdTMwZDVcdTMwYTlcdTMwZmNcdTMwZTBcdTZhNWZcdTgwZmQgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiNGQyMTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9RVBGIFx1ZDUwY1x1YjdhYlx1ZDNmYyBcdWFlMzBcdWIyYTUNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBcdWQ1MGNcdWI3YWJcdWQzZmMgXHVhZTMwXHViMmE1KE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM2MDE1ZGEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9UmVjdXJzbyBkYSBQbGF0YWZvcm1hIEVQRg0KLWZlYXR1cmVQbHVnaW5OYW1lTkw9UmVjdXJzbyBkYSBQbGF0YWZvcm1hIEVQRiAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTM0ZGMzNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgXHU1ZTczXHU1M2YwXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2DQotZmVhdHVyZVBsdWdpbk5hbWVOTD1FUEYgXHU1ZTczXHU1M2YwXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2XHVmZjA4TkwxXHVmZjA5DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNzRjNTRkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLWZlYXR1cmVQbHVnaW5OYW1lPUVQRiBcdTVlNzNcdTUzZjBcdTcyNzlcdTYwMjcNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBcdTVlNzNcdTUzZjBcdTcyNzlcdTYwMjcgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NWI4YmQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzA1YTY2My4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBQbGF0Zm9ybSAoTkwyKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDIvYWJvdXRfcnUuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi9hYm91dF9ydS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODkyMzMwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi9hYm91dF9ydS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+DQotDQotPHRpdGxlPtCeINC/0YDQvtC00YPQutGC0LU8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJSVS1SVSI+DQotPGgyPtCe0LEg0Y3RgtC+0Lwg0LzQvtC00YPQu9C1PC9oMj4NCi0gDQotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQ0KLTxoMz7Qm9C40YbQtdC90LfQuNGPPC9oMz4NCi0NCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlDQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Lg0KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+DQotDQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5DQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQ0KLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi9hYm91dF9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyL2Fib3V0X3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhZGI2MDIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyL2Fib3V0X3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotIw0KLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30NCi0NCi1mZWF0dXJlTmFtZT1cdTA0MWZcdTA0M2JcdTA0MzBcdTA0NDJcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzAgRWNsaXBzZSAzLjEuMSBcdTA0NDEgRU1GIFx1MDQzOCBHRUYgDQotDQotYmx1cmI9XHUwNDFmXHUwNDNiXHUwNDMwXHUwNDQyXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwIEVjbGlwc2VcblwNCi1cblwNCi1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0NGY6IDMuMS4xXG5cDQotXHUwNDE4XHUwNDE0IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYVx1MDQzODogTTIwMDUwOTI5LTA4NDBcblwNCi1cblwNCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gIFx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDRiLlxuXA0KLVx1MDQxZlx1MDQzZVx1MDQ0MVx1MDQzNVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDZcdTA0NDMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXA0KLVxuXA0KLVx1MDQxMiBcdTA0NDFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzIgXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMCBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDIgXHUwNDNhXHUwNDNlXHUwNDM0LCBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzlcblwNCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjk3YTFhNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcnUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfcnUuaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfcnUucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTA4ZWY0MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1cdTA0MWZcdTA0M2JcdTA0MzBcdTA0NDJcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzAgRVBGDQotZmVhdHVyZVBsdWdpbk5hbWVOTD1cdTA0MWZcdTA0M2JcdTA0MzBcdTA0NDJcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzAgRVBGIChOTDEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NmRhYTUzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDJhPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkNmVkMzguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIFBsYXRmb3JtIChOTDJhKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS9hYm91dF9kYS5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS9hYm91dF9kYS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZGVhMTM4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEvYWJvdXRfZGEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KLTx0aXRsZT5PbTwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9IkRBLURLIj4NCi08aDI+T20gZGV0dGUgaW5kaG9sZDwvaDI+DQotIA0KLTxwPjI0LiBmZWJydWFyIDIwMDU8L3A+CQ0KLTxoMz5MaWNlbnNlPC9oMz4NCi0NCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUNCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQ0KLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UNCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDJhL2Fib3V0X2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDJhL2Fib3V0X2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiODNlNTkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS9hYm91dF9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgYWJvdXQucHJvcGVydGllcw0KLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQ0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncw0KLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLg0KLSMNCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9DQotDQotZmVhdHVyZU5hbWU9RWNsaXBzZS1wbGF0Zm9ybSAzLjEuMSBtZWQgRU1GIG9nIEdFRiANCi0NCi1ibHVyYj1FY2xpcHNlLXBsYXRmb3JtXG5cDQotXG5cDQotVmVyc2lvbjogMy4xLjFcblwNCi1CeWctaWQ6IE0yMDA1MDkyOS0wODQwXG5cDQotXG5cDQotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cDQotQmVzXHUwMGY4ZyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cDQotXG5cDQotRGV0dGUgcHJvZHVrdCBpbmRlaG9sZGVyIHNvZnR3YXJlLCBkZXIgZXIgdWR2aWtsZXQgYWZcblwNCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDc0OWU0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfZGEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfZGEuaHRtbA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MTExMDVjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgLSBwbGF0Zm9ybXNmdW5rdGlvbg0KLWZlYXR1cmVQbHVnaW5OYW1lTkw9RVBGIC0gcGxhdGZvcm1zZnVua3Rpb24gKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUzMDZlNGIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzA5MTVkNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgUHVibGlzaGVyIChOTDEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlcjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NjU3NDEzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MTM0YTY3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFB1Ymxpc2hlcg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLXB1Ymxpc2hlckxhYmVsPVZlclx1MDBmNmZmZW50bGljaGVuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkY2FkYzUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9UHVibGljYWRvciBkZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi1wdWJsaXNoZXJMYWJlbD1QdWJsaWNhcg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YTkzZGMwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPURpZmZ1c2V1ciBkZSBwdWJsaWNhdGlvbnMgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotcHVibGlzaGVyTGFiZWw9UHVibGllcg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMWVkNjU0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBQdWJsaXNoZXINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi1wdWJsaXNoZXJMYWJlbD1QdWJibGljYQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTU4MzdhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBQdWJsaXNoZXINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi1wdWJsaXNoZXJMYWJlbD1cdTUxNmNcdTk1OGINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjY3MWYzZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHVhY2Y1XHVhYzFjXHVjNzkwDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotcHVibGlzaGVyTGFiZWw9XHVhY2Y1XHVhYzFjDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4YThhZjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9UHVibGljYWRvciBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi1wdWJsaXNoZXJMYWJlbD1QdWJsaWNhcg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOWJjZTZjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTUzZDFcdTVlMDNcdTdhMGJcdTVlOGYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi1wdWJsaXNoZXJMYWJlbD1cdTUzZDFcdTVlMDMNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmIxYzY4NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgUHVibGlzaGVyDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotcHVibGlzaGVyTGFiZWw9XHU3NjdjXHU0ZjQ4DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZDIwMzJkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkMGFmOGEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIFB1Ymxpc2hlciAoTkwyKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXI7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjU0ZmNhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDBmOWFhYy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1cdTA0MThcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGMgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotcHVibGlzaGVyTGFiZWw9XHUwNDFlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjZjIxMzMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE2ZWRiN2QuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBQdWJsaXNoZXIgKE5MMmEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXI7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MjhjYTA0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgUHVibGlzaGVyDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotcHVibGlzaGVyTGFiZWw9UHVibGljXHUwMGU5cg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTZmZTVlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQ5ZDNjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc3BhdGg6IG5sMS5qYXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDRmNTE1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1zb3VyY2UubmwxLmphciA9IHNyYy8NCi1vdXRwdXQubmwxLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDEuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgZG9jcm9vdC8sXA0KLSAgICAgICAgICAgICAgIHhzbC8sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF9kZS5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X2RlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkN2U1NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X2RlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi0NCi08aHRtbD4NCi08IS0tIA0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICAgIENvbnRyaWJ1dG9yczoNCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS0tPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4NCi0JPHRpdGxlPkluZm9ybWF0aW9uZW4NCi08L3RpdGxlPg0KLTxzY3JpcHQgc3JjPSJzY3JpcHRzL2NvbW1vbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+DQotCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQotCQlib2R5IHsNCi0JCQltYXJnaW46IDhweDsNCi0JCX0NCi0JPC9zdHlsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotCTxpbWcgc3JjPSIuL2ltYWdlcy9pY29uX2Fib3V0LmdpZiIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbHQ9IlN5bWJvbCBmw7xyIFByb2R1a3RpbmZvcm1hdGlvbmVuIiBib3JkZXI9IjAiLz48YnIgLz48YnIgLz4NCi08c3BhbiBjbGFzcz0icG9wIj5PcGVuVVAvQmFzaWM8YnIgLz4NCi1WZXJzaW9uIDEuMDxiciAvPg0KLTxiciAvPg0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgPGJyIC8+DQotQWxsZSBSZWNodGUgdm9yYmVoYWx0ZW4uPC9zcGFuPjxiciAvPjxiciAvPg0KLQk8dGFibGUgc3VtbWFyeT0iIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iNCIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iamF2YXNjcmlwdDpzZWxmLmNsb3NlKCk7Ij48c3BhbiBjbGFzcz0iYnV0dG9udHh0Ij4mbmJzcDtTY2hsaWXDn2VuJm5ic3A7PC9zcGFuPjwvYT48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyIgIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQk8L3RhYmxlPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF9lcy5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X2VzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhjZDlhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X2VzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi0NCi08aHRtbD4NCi08IS0tIA0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICAgIENvbnRyaWJ1dG9yczoNCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS0tPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4NCi0JPHRpdGxlPkFjZXJjYSBkZTwvdGl0bGU+DQotPHNjcmlwdCBzcmM9InNjcmlwdHMvY29tbW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4NCi0JPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCi0JCWJvZHkgew0KLQkJCW1hcmdpbjogOHB4Ow0KLQkJfQ0KLQk8L3N0eWxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi0JPGltZyBzcmM9Ii4vaW1hZ2VzL2ljb25fYWJvdXQuZ2lmIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsdD0iaWNvbm8gYWNlcmNhIGRlIiBib3JkZXI9IjAiLz48YnIgLz48YnIgLz4NCi08c3BhbiBjbGFzcz0icG9wIj5PcGVuVVAvQmFzaWM8YnIgLz4NCi1WZXJzacOzbiAxLjA8YnIgLz4NCi08YnIgLz4NCi0oYykgQ29weXJpZ2h0IENvbGFib3JhZG9yZXMgZGUgRWNsaXBzZSB5IG90cm9zIDIwMDQsIDIwMDYuPGJyIC8+DQotUmVzZXJ2YWRvcyB0b2RvcyBsb3MgZGVyZWNob3MuPC9zcGFuPjxiciAvPjxiciAvPg0KLQk8dGFibGUgc3VtbWFyeT0iIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iNCIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+DQotPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iamF2YXNjcmlwdDpzZWxmLmNsb3NlKCk7Ij48c3BhbiBjbGFzcz0iYnV0dG9udHh0Ij4mbmJzcDtDZXJyYXImbmJzcDs8L3NwYW4+PC9hPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93IiAgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCTwvdGFibGU+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X2ZyLmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvYWJvdXRfZnIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWQ0NjE3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvYWJvdXRfZnIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLQ0KLTxodG1sPg0KLTwhLS0gDQotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gICAgQ29udHJpYnV0b3JzOg0KLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLS0+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIvPg0KLQk8dGl0bGU+QSBwcm9wb3MgZGU8L3RpdGxlPg0KLTxzY3JpcHQgc3JjPSJzY3JpcHRzL2NvbW1vbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+DQotCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQotCQlib2R5IHsNCi0JCQltYXJnaW46IDhweDsNCi0JCX0NCi0JPC9zdHlsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotCTxpbWcgc3JjPSIuL2ltYWdlcy9pY29uX2Fib3V0LmdpZiIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbHQ9Imlj9G5lIEEgcHJvcG9zIGRlIiBib3JkZXI9IjAiLz48YnIgLz48YnIgLz4NCi08c3BhbiBjbGFzcz0icG9wIj5PcGVuVVAvQmFzaWM8YnIgLz4NCi1WZXJzaW9uIDEuMDxiciAvPg0KLTxiciAvPg0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LjxiciAvPg0KLUFsbCBSaWdodHMgUmVzZXJ2ZWQuPC9zcGFuPjxiciAvPjxiciAvPg0KLQk8dGFibGUgc3VtbWFyeT0iIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iNCIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iamF2YXNjcmlwdDpzZWxmLmNsb3NlKCk7Ij48c3BhbiBjbGFzcz0iYnV0dG9udHh0Ij4mbmJzcDtGZXJtZXImbmJzcDs8L3NwYW4+PC9hPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93IiAgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCTwvdGFibGU+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X2l0Lmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvYWJvdXRfaXQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmRjZmM5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvYWJvdXRfaXQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLQ0KLTxodG1sPg0KLTwhLS0gDQotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gICAgQ29udHJpYnV0b3JzOg0KLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLS0+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIvPg0KLQk8dGl0bGU+SW5mb3JtYXppb25pIHN1DQotPC90aXRsZT4NCi08c2NyaXB0IHNyYz0ic2NyaXB0cy9jb21tb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0Pg0KLQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KLQkJYm9keSB7DQotCQkJbWFyZ2luOiA4cHg7DQotCQl9DQotCTwvc3R5bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5Pg0KLQ0KLQk8aW1nIHNyYz0iLi9pbWFnZXMvaWNvbl9hYm91dC5naWYiIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWx0PSJhYm91dCBpY29uIiBib3JkZXI9IjAiLz48YnIgLz48YnIgLz4NCi08c3BhbiBjbGFzcz0icG9wIj5PcGVuVVAvQmFzaWM8YnIgLz4NCi1WZXJzaW9uZSAxLjA8YnIgLz4NCi08YnIgLz4NCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi48YnIgLz4NCi1UdXR0aSBpIGRpcml0dGkgcmlzZXJ2YXRpLjwvc3Bhbj48YnIgLz48YnIgLz4NCi0JPHRhYmxlIHN1bW1hcnk9IiIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPg0KLQkgIDx0cj4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjQiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSIyIiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxhIGNsYXNzPSJidXR0b24iIGhyZWY9ImphdmFzY3JpcHQ6c2VsZi5jbG9zZSgpOyI+PHNwYW4gY2xhc3M9ImJ1dHRvbnR4dCI+Jm5ic3A7Q2hpdWRpJm5ic3A7PC9zcGFuPjwvYT48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyIgIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQk8L3RhYmxlPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF9qYS5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X2phLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2N2U1Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X2phLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi0NCi08aHRtbD4NCi08IS0tIA0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICAgIENvbnRyaWJ1dG9yczoNCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS0tPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ii8+DQotCTx0aXRsZT7jg5Djg7zjgrjjg6fjg7Pmg4XloLENCi08L3RpdGxlPg0KLTxzY3JpcHQgc3JjPSJzY3JpcHRzL2NvbW1vbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+DQotCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQotCQlib2R5IHsNCi0JCQltYXJnaW46IDhweDsNCi0JCX0NCi0JPC9zdHlsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotCTxpbWcgc3JjPSIuL2ltYWdlcy9pY29uX2Fib3V0LmdpZiIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbHQ9IuODkOODvOOCuOODp+ODs+aDheWgseOCouOCpOOCs+ODsyIgYm9yZGVyPSIwIi8+PGJyIC8+PGJyIC8+DQotPHNwYW4gY2xhc3M9InBvcCI+T3BlblVQL0Jhc2ljPGJyIC8+DQot44OQ44O844K444On44OzIDEuMDxiciAvPg0KLTxiciAvPg0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgPGJyIC8+DQotQWxsIFJpZ2h0cyBSZXNlcnZlZC48L3NwYW4+PGJyIC8+PGJyIC8+DQotCTx0YWJsZSBzdW1tYXJ5PSIiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4NCi0JICA8dHI+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSI0IiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iMiIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48YSBjbGFzcz0iYnV0dG9uIiBocmVmPSJqYXZhc2NyaXB0OnNlbGYuY2xvc2UoKTsiPjxzcGFuIGNsYXNzPSJidXR0b250eHQiPiZuYnNwO+mWieOBmOOCiyZuYnNwOzwvc3Bhbj48L2E+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciICByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JPC90YWJsZT4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvYWJvdXRfa28uaHRtIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF9rby5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiY2E3MjAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF9rby5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotDQotPGh0bWw+DQotPCEtLSANCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAgICBDb250cmlidXRvcnM6DQotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0tLT4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIvPg0KLQk8dGl0bGU+7KCc7ZKIIOygleuztDwvdGl0bGU+DQotPHNjcmlwdCBzcmM9InNjcmlwdHMvY29tbW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4NCi0JPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCi0JCWJvZHkgew0KLQkJCW1hcmdpbjogOHB4Ow0KLQkJfQ0KLQk8L3N0eWxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi0JPGltZyBzcmM9Ii4vaW1hZ2VzL2ljb25fYWJvdXQuZ2lmIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsdD0i7KCc7ZKIIOygleuztCDslYTsnbTsvZgiIGJvcmRlcj0iMCIvPjxiciAvPjxiciAvPg0KLTxzcGFuIGNsYXNzPSJwb3AiPk9wZW5VUC9CYXNpYzxiciAvPg0KLeuyhOyghCAxLjA8YnIgLz4NCi08YnIgLz4NCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi48YnIgLz4NCi1BbGwgUmlnaHRzIFJlc2VydmVkLjwvc3Bhbj48YnIgLz48YnIgLz4NCi0JPHRhYmxlIHN1bW1hcnk9IiIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPg0KLQkgIDx0cj4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjQiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSIyIiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxhIGNsYXNzPSJidXR0b24iIGhyZWY9ImphdmFzY3JpcHQ6c2VsZi5jbG9zZSgpOyI+PHNwYW4gY2xhc3M9ImJ1dHRvbnR4dCI+Jm5ic3A764ur6riwJm5ic3A7PC9zcGFuPjwvYT48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyIgIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQk8L3RhYmxlPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF9wdF9CUi5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X3B0X0JSLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZhZDRhMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X3B0X0JSLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi0NCi08aHRtbD4NCi08IS0tIA0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICAgIENvbnRyaWJ1dG9yczoNCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS0tPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4NCi0JPHRpdGxlPlNvYnJlIDwvdGl0bGU+DQotPHNjcmlwdCBzcmM9InNjcmlwdHMvY29tbW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4NCi0JPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCi0JCWJvZHkgew0KLQkJCW1hcmdpbjogOHB4Ow0KLQkJfQ0KLQk8L3N0eWxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi0JPGltZyBzcmM9Ii4vaW1hZ2VzL2ljb25fYWJvdXQuZ2lmIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsdD0iw61jb25lIHNvYnJlIiBib3JkZXI9IjAiLz48YnIgLz48YnIgLz4NCi08c3BhbiBjbGFzcz0icG9wIj5PcGVuVVAvQmFzaWM8YnIgLz4NCi1WZXJzw6NvIDEuMDxiciAvPg0KLTxiciAvPg0KLShjKSBDb3B5cmlnaHQgY29udHJpYnVpZG9yZXMgZG8gRWNsaXBzZSBlIHRlcmNlaXJvcyAyMDA0LCAyMDA2LiAgPGJyIC8+DQotVG9kb3Mgb3MgRGlyZWl0b3MgUmVzZXJ2YWRvcy48L3NwYW4+PGJyIC8+PGJyIC8+DQotCTx0YWJsZSBzdW1tYXJ5PSIiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4NCi0JICA8dHI+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSI0IiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iMiIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48YSBjbGFzcz0iYnV0dG9uIiBocmVmPSJqYXZhc2NyaXB0OnNlbGYuY2xvc2UoKTsiPjxzcGFuIGNsYXNzPSJidXR0b250eHQiPiZuYnNwO0ZlY2hhciZuYnNwOzwvc3Bhbj48L2E+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciICByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JPC90YWJsZT4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvYWJvdXRfemhfQ04uaHRtIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF96aF9DTi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYTA0NTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF96aF9DTi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotDQotPGh0bWw+DQotPCEtLSANCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAgICBDb250cmlidXRvcnM6DQotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0tLT4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIvPg0KLQk8dGl0bGU+5YWz5LqOPC90aXRsZT4NCi08c2NyaXB0IHNyYz0ic2NyaXB0cy9jb21tb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0Pg0KLQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KLQkJYm9keSB7DQotCQkJbWFyZ2luOiA4cHg7DQotCQl9DQotCTwvc3R5bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5Pg0KLQ0KLQk8aW1nIHNyYz0iLi9pbWFnZXMvaWNvbl9hYm91dC5naWYiIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWx0PSLlhbPkuo7lm77moIciIGJvcmRlcj0iMCIvPjxiciAvPjxiciAvPg0KLTxzcGFuIGNsYXNzPSJwb3AiPk9wZW5VUC9CYXNpYzxiciAvPg0KLVYxLjA8YnIgLz4NCi08YnIgLz4NCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi48YnIgLz4NCi1BbGwgUmlnaHRzIFJlc2VydmVkLjwvc3Bhbj48YnIgLz48YnIgLz4NCi0JPHRhYmxlIHN1bW1hcnk9IiIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPg0KLQkgIDx0cj4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjQiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSIyIiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxhIGNsYXNzPSJidXR0b24iIGhyZWY9ImphdmFzY3JpcHQ6c2VsZi5jbG9zZSgpOyI+PHNwYW4gY2xhc3M9ImJ1dHRvbnR4dCI+5YWz6ZetPC9zcGFuPjwvYT48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyIgIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQk8L3RhYmxlPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF96aF9UVy5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X3poX1RXLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmNDYzYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X3poX1RXLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi0NCi08aHRtbD4NCi08IS0tIA0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICAgIENvbnRyaWJ1dG9yczoNCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS0tPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+DQotCTx0aXRsZT7pl5zmlrw8L3RpdGxlPg0KLTxzY3JpcHQgc3JjPSJzY3JpcHRzL2NvbW1vbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+DQotCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQotCQlib2R5IHsNCi0JCQltYXJnaW46IDhweDsNCi0JCX0NCi0JPC9zdHlsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotCTxpbWcgc3JjPSIuL2ltYWdlcy9pY29uX2Fib3V0LmdpZiIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbHQ9IumXnOaWvOWcluekuiIgYm9yZGVyPSIwIi8+PGJyIC8+PGJyIC8+DQotPHNwYW4gY2xhc3M9InBvcCI+T3BlblVQL0Jhc2ljPGJyIC8+DQotMS4wIOeJiDxiciAvPg0KLTxiciAvPg0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LjxiciAvPg0KLUFsbCBSaWdodHMgUmVzZXJ2ZWQuPC9zcGFuPjxiciAvPjxiciAvPg0KLQk8dGFibGUgc3VtbWFyeT0iIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iNCIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iamF2YXNjcmlwdDpzZWxmLmNsb3NlKCk7Ij48c3BhbiBjbGFzcz0iYnV0dG9udHh0Ij4mbmJzcDvpl5zplokmbmJzcDs8L3NwYW4+PC9hPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93IiAgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCTwvdGFibGU+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfZGUuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfZGUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OTM1YTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX2RlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIGphdmFzY3JpcHQgZm9yIHRoZSBib29rbWFya3MgZnJhbWUgKCB0aGUgb3J5X3RvY19mcmFtZSBmcmFtZSkNCi0vLyB0aGlzIGZyYW1lIGNvbnRhaW5zIGEgY2hpbGQgaWZyYW1lIChvcnlfdG9jKQ0KLQ0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQNCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEgPSAiRGllc2UgU2VpdGUgd3VyZGUgbmljaHQgaW4gZGVyIE5hdmlnYXRpb25zc3RydWt0dXJzaWNodCBnZWZ1bmRlbi4iOw0KLQ0KLWZ1bmN0aW9uIGRpc3BsYXlUcmVlKHRhYikNCi17DQotCXVybCA9IHRhYi5nZXRBdHRyaWJ1dGUoJ3VybCcpOw0KLQ0KLQlpZiAoIHNlbGVjdGVkVGFiICE9IG51bGwgKQ0KLQl7DQotCQlzZWxlY3RlZFRhYi5jbGFzc05hbWUgPSAidGFiIg0KLQl9DQotCXRhYi5jbGFzc05hbWUgPSAic2VsZWN0ZWRUYWIiDQotCXNlbGVjdGVkVGFiID0gdGFiOw0KLQ0KLQlsb2FkSWZyYW1lKCJvcnlfdG9jIiwgdXJsKTsNCi19DQotDQotZnVuY3Rpb24gbG9hZElmcmFtZShpZnJhbWVOYW1lLCB1cmwpDQotew0KLQlpZiAoIHdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0gKQ0KLQl7DQotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLnRvY19sb2FkZWQgPSBmYWxzZTsNCi0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0ubG9jYXRpb24gPSB1cmw7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQllbHNlIHJldHVybiBmYWxzZTsNCi19DQotDQotZnVuY3Rpb24gc2hvd1BhZ2UoKQ0KLXsNCi0NCi0JcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmxvY2F0aW9uLmhyZWYgPSB1bmVzY2FwZSh0b3BpY1RvRGlzcGxheSk7DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIGZpbmQgYSB0b3BpYyBpbiB0aGUgdHJlZTogdGhlIHRvcGljIGlzIHNldCBpbiB0b3BpY1RvRGlzcGxheQ0KLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzDQotICovDQotZnVuY3Rpb24gZmluZFRvY1RvcGljKCkNCi17DQotCXZhciB0b2Nfd2luZG93ID0gd2luZG93LmZyYW1lc1sib3J5X3RvYyJdOw0KLQ0KLQkvL2FsZXJ0KHRvY193aW5kb3cudG9jX2xvYWRlZCk7DQotCS8vIGNoZWNrIGZvciBmYWxzZSBpcyBub3Qgc2FmZSBzaW5jZSB0aGUgdmFsdWUgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHRoZSBmcmFtZSBpcyBub3QgbG9hZGVkIHlldA0KLQkvL2lmICh0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gZmFsc2UgKQ0KLQlpZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCAhPSB0cnVlICkNCi0Jew0KLQkJLy9pZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSB1bmRlZmluZWQgKQ0KLQkJLy97DQotCQkvLwlhbGVydCgiZ290IGl0ISIpOw0KLQkJLy99DQotCQl3aW5kb3cuc2V0VGltZW91dCgiZmluZFRvY1RvcGljKCkiLCAyMDApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJaWYgKCB0b3BpY1RvRGlzcGxheSA9PSBudWxsICkNCi0JCXsNCi0JCQl0b3BpY1RvRGlzcGxheSA9IHRvY193aW5kb3cuZ2V0Rmlyc3RUb3BpY1VybCgpOw0KLQkJfQ0KLQkNCi0JCXZhciB0b3BpYyA9IHRvcGljVG9EaXNwbGF5Ow0KLQ0KLQkJLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdmlldywgaWYgbm90LCBsb29rIGZvciB0aGUgbmV4dCB2aWV3DQotCQlpZiAoIHRvY193aW5kb3cuc2VsZWN0VG9waWModG9waWMpID09IGZhbHNlICkNCi0JCXsNCi0JCQlpZiAoIGxvYWRpbmdUYWJJbmRleCA8IHZpZXdUYWJzLmxlbmd0aCAtMSApDQotCQkJew0KLQkJCQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXgrK10pOw0KLQkJCQlmaW5kVG9jVG9waWMoKTsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJLy8gZW5kIGZpbmRpbmcgYW5kIGdvdCBub3RoaW5nDQotCQkJCS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQNCi0JCQkJYWxlcnQoYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSk7DQotCQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJCXNob3dQYWdlKCk7DQotCQkJfQ0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJLy8gZmluZCBzdWNjZXNzZnVsLCBkaXNwbGF5IHRoZSB0b3BpYyBwYWdlDQotCQkJc2hvd1BhZ2UoKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0NCi0NCi0vLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB0YWINCi1mdW5jdGlvbiB3aGVyZUFtSSgpDQotew0KLQl2YXIgdXJsID0gcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmRvY3VtZW50LlVSTDsNCi0JDQotCWlmICggdXJsICE9IG51bGwgKQ0KLQl7DQotCQl0b3BpY1RvRGlzcGxheSA9IHVybDsNCi0JCWZpbmRUb2NUb3BpYygpOw0KLQl9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHRvZ1ZpZXdzKCkNCi17DQotCS8vIGlmIGN1cnJlbnRseSB2aXNpYmxlLCBoaWRlIGFsbCBleGNlcHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZA0KLQlpc1ZpZXdzVmlzaWJsZSA9ICghaXNWaWV3c1Zpc2libGUpOw0KLQkNCi0JZm9yICggdmFyIGkgPSAwOyAgaSA8IHZpZXdUYWJzLmxlbmd0aDsgaSsrKQ0KLQl7DQotCQl2YXIgc2hvdyA9IGlzVmlld3NWaXNpYmxlIHx8ICh2aWV3VGFic1tpXSA9PSBzZWxlY3RlZFRhYik7DQotCQlpZiAoIHNob3cgKQ0KLQkJewkJDQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOw0KLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsNCi0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJfQ0KLQl9DQotCQkNCi0JCQ0KLQ0KLX0NCi0NCi0NCi0vLyBkaXNwbGF5IHRoZSBkZWZhdWx0IHBhZ2UgYW5kIG5hdmlnYXRlIHRvIHRoZSBub2RlDQotLy8gaWYgbm8gZGVmYXVsdCBwYWdlIGlzIHNldCwgZGlzcGxheSB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgZmlyc3Qgdmlldw0KLWZ1bmN0aW9uIGluaXQoKQ0KLXsNCi0JbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JdmFyIHRhYnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpOw0KLQl2YXIgdGFiY291bnQgPSAwOw0KLQlmb3IgKHZhciBpPTA7IGk8dGFicy5sZW5ndGg7IGkrKykNCi0Jew0KLQkJaWYgKCB0YWJzW2ldLmdldEF0dHJpYnV0ZSgndXJsJykgIT0gbnVsbCApDQotCQl7CQkJDQotCQkJdmFyIGlzRGVmYXVsdFZpZXcgPSB0YWJzW2ldLmdldEF0dHJpYnV0ZSgnaXNEZWZhdWx0VmlldycpOw0KLQkJCWlmICggaXNEZWZhdWx0VmlldyA9PSAidHJ1ZSIgKQ0KLQkJCXsNCi0JCQkJbG9hZGluZ1RhYkluZGV4ID0gdGFiY291bnQ7DQotCQkJfQ0KLQkJCQ0KLQkJCXZpZXdUYWJzW3RhYmNvdW50KytdID0gdGFic1tpXTsNCi0JCX0NCi0JfQ0KLQ0KLQl0b3BpY1RvRGlzcGxheSA9IHBhcmVudC5nZXRDb29raWUoInJ1cF9vcnlfZG9jIik7DQotCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleF0pOw0KLQlmaW5kVG9jVG9waWMoKTsNCi19DQotDQotDQotdmFyIHNlbGVjdGVkVGFiID0gbnVsbDsNCi12YXIgdmlld1RhYnMgPSBuZXcgQXJyYXkoKTs7DQotdmFyIGxvYWRpbmdUYWJJbmRleCA9IDA7DQotdmFyIHRvcGljVG9EaXNwbGF5ID0gbnVsbDsNCi12YXIgaXNWaWV3c1Zpc2libGUgPSB0cnVlOw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c19lcy5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c19lcy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzMDhlNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfZXMuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gamF2YXNjcmlwdCBmb3IgdGhlIGJvb2ttYXJrcyBmcmFtZSAoIHRoZSBvcnlfdG9jX2ZyYW1lIGZyYW1lKQ0KLS8vIHRoaXMgZnJhbWUgY29udGFpbnMgYSBjaGlsZCBpZnJhbWUgKG9yeV90b2MpDQotDQotLy8gbWVzc2FnZXMgdG8gYmUgZXh0ZXJuaXplZA0KLS8vIGhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMNCi12YXIgYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSA9ICJFc3RhIHDDoWdpbmEgbm8gaGEgcG9kaWRvIGVuY29udHJhcnNlIGVuIGxhIHZpc3RhIGRlbCDDoXJib2wgZGUgbmF2ZWdhY2nDs24uIjsNCi0NCi1mdW5jdGlvbiBkaXNwbGF5VHJlZSh0YWIpDQotew0KLQl1cmwgPSB0YWIuZ2V0QXR0cmlidXRlKCd1cmwnKTsNCi0NCi0JaWYgKCBzZWxlY3RlZFRhYiAhPSBudWxsICkNCi0Jew0KLQkJc2VsZWN0ZWRUYWIuY2xhc3NOYW1lID0gInRhYiINCi0JfQ0KLQl0YWIuY2xhc3NOYW1lID0gInNlbGVjdGVkVGFiIg0KLQlzZWxlY3RlZFRhYiA9IHRhYjsNCi0NCi0JbG9hZElmcmFtZSgib3J5X3RvYyIsIHVybCk7DQotfQ0KLQ0KLWZ1bmN0aW9uIGxvYWRJZnJhbWUoaWZyYW1lTmFtZSwgdXJsKQ0KLXsNCi0JaWYgKCB3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdICkNCi0Jew0KLQkJd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXS50b2NfbG9hZGVkID0gZmFsc2U7DQotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLmxvY2F0aW9uID0gdXJsOw0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JZWxzZSByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLWZ1bmN0aW9uIHNob3dQYWdlKCkNCi17DQotDQotCXBhcmVudC5mcmFtZXNbIm9yeV9kb2MiXS5sb2NhdGlvbi5ocmVmID0gdW5lc2NhcGUodG9waWNUb0Rpc3BsYXkpOw0KLX0NCi0NCi0NCi0vKioNCi0gKiBmaW5kIGEgdG9waWMgaW4gdGhlIHRyZWU6IHRoZSB0b3BpYyBpcyBzZXQgaW4gdG9waWNUb0Rpc3BsYXkNCi0gKiByZXR1cm5zIHRydWUgaWYgc3VjY2Vzcw0KLSAqLw0KLWZ1bmN0aW9uIGZpbmRUb2NUb3BpYygpDQotew0KLQl2YXIgdG9jX3dpbmRvdyA9IHdpbmRvdy5mcmFtZXNbIm9yeV90b2MiXTsNCi0NCi0JLy9hbGVydCh0b2Nfd2luZG93LnRvY19sb2FkZWQpOw0KLQkvLyBjaGVjayBmb3IgZmFsc2UgaXMgbm90IHNhZmUgc2luY2UgdGhlIHZhbHVlIG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB0aGUgZnJhbWUgaXMgbm90IGxvYWRlZCB5ZXQNCi0JLy9pZiAodG9jX3dpbmRvdy50b2NfbG9hZGVkID09IGZhbHNlICkNCi0JaWYgKCB0b2Nfd2luZG93LnRvY19sb2FkZWQgIT0gdHJ1ZSApDQotCXsNCi0JCS8vaWYgKCB0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gdW5kZWZpbmVkICkNCi0JCS8vew0KLQkJLy8JYWxlcnQoImdvdCBpdCEiKTsNCi0JCS8vfQ0KLQkJd2luZG93LnNldFRpbWVvdXQoImZpbmRUb2NUb3BpYygpIiwgMjAwKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCWlmICggdG9waWNUb0Rpc3BsYXkgPT0gbnVsbCApDQotCQl7DQotCQkJdG9waWNUb0Rpc3BsYXkgPSB0b2Nfd2luZG93LmdldEZpcnN0VG9waWNVcmwoKTsNCi0JCX0NCi0JDQotCQl2YXIgdG9waWMgPSB0b3BpY1RvRGlzcGxheTsNCi0NCi0JCS8vIGZpbmQgdGhlIHRvcGljIGluIHRoZSBjdXJyZW50IHZpZXcsIGlmIG5vdCwgbG9vayBmb3IgdGhlIG5leHQgdmlldw0KLQkJaWYgKCB0b2Nfd2luZG93LnNlbGVjdFRvcGljKHRvcGljKSA9PSBmYWxzZSApDQotCQl7DQotCQkJaWYgKCBsb2FkaW5nVGFiSW5kZXggPCB2aWV3VGFicy5sZW5ndGggLTEgKQ0KLQkJCXsNCi0JCQkJZGlzcGxheVRyZWUodmlld1RhYnNbbG9hZGluZ1RhYkluZGV4KytdKTsNCi0JCQkJZmluZFRvY1RvcGljKCk7DQotCQkJfQ0KLQkJCWVsc2UNCi0JCQl7DQotCQkJCS8vIGVuZCBmaW5kaW5nIGFuZCBnb3Qgbm90aGluZw0KLQkJCQkvLyBkaXNwbGF5IHRoZSBkZWZhdWx0DQotCQkJCWFsZXJ0KGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEpOw0KLQkJCQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQkJCQlzaG93UGFnZSgpOw0KLQkJCX0NCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQkJCS8vIGZpbmQgc3VjY2Vzc2Z1bCwgZGlzcGxheSB0aGUgdG9waWMgcGFnZQ0KLQkJCXNob3dQYWdlKCk7DQotCQl9DQotCX0NCi19DQotDQotDQotDQotLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdGFiDQotZnVuY3Rpb24gd2hlcmVBbUkoKQ0KLXsNCi0JdmFyIHVybCA9IHBhcmVudC5mcmFtZXNbIm9yeV9kb2MiXS5kb2N1bWVudC5VUkw7DQotCQ0KLQlpZiAoIHVybCAhPSBudWxsICkNCi0Jew0KLQkJdG9waWNUb0Rpc3BsYXkgPSB1cmw7DQotCQlmaW5kVG9jVG9waWMoKTsNCi0JfQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiB0b2dWaWV3cygpDQotew0KLQkvLyBpZiBjdXJyZW50bHkgdmlzaWJsZSwgaGlkZSBhbGwgZXhjZXB0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQNCi0JaXNWaWV3c1Zpc2libGUgPSAoIWlzVmlld3NWaXNpYmxlKTsNCi0JDQotCWZvciAoIHZhciBpID0gMDsgIGkgPCB2aWV3VGFicy5sZW5ndGg7IGkrKykNCi0Jew0KLQkJdmFyIHNob3cgPSBpc1ZpZXdzVmlzaWJsZSB8fCAodmlld1RhYnNbaV0gPT0gc2VsZWN0ZWRUYWIpOw0KLQkJaWYgKCBzaG93ICkNCi0JCXsJCQ0KLQkJCS8vdmlld1RhYnNbaV0uc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsNCi0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQotCQkJdmlld1RhYnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCX0NCi0JfQ0KLQkJDQotCQkNCi0NCi19DQotDQotDQotLy8gZGlzcGxheSB0aGUgZGVmYXVsdCBwYWdlIGFuZCBuYXZpZ2F0ZSB0byB0aGUgbm9kZQ0KLS8vIGlmIG5vIGRlZmF1bHQgcGFnZSBpcyBzZXQsIGRpc3BsYXkgdGhlIGZpcnN0IG5vZGUgb2YgdGhlIGZpcnN0IHZpZXcNCi1mdW5jdGlvbiBpbml0KCkNCi17DQotCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCXZhciB0YWJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKTsNCi0JdmFyIHRhYmNvdW50ID0gMDsNCi0JZm9yICh2YXIgaT0wOyBpPHRhYnMubGVuZ3RoOyBpKyspDQotCXsNCi0JCWlmICggdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ3VybCcpICE9IG51bGwgKQ0KLQkJewkJCQ0KLQkJCXZhciBpc0RlZmF1bHRWaWV3ID0gdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ2lzRGVmYXVsdFZpZXcnKTsNCi0JCQlpZiAoIGlzRGVmYXVsdFZpZXcgPT0gInRydWUiICkNCi0JCQl7DQotCQkJCWxvYWRpbmdUYWJJbmRleCA9IHRhYmNvdW50Ow0KLQkJCX0NCi0JCQkNCi0JCQl2aWV3VGFic1t0YWJjb3VudCsrXSA9IHRhYnNbaV07DQotCQl9DQotCX0NCi0NCi0JdG9waWNUb0Rpc3BsYXkgPSBwYXJlbnQuZ2V0Q29va2llKCJydXBfb3J5X2RvYyIpOw0KLQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXhdKTsNCi0JZmluZFRvY1RvcGljKCk7DQotfQ0KLQ0KLQ0KLXZhciBzZWxlY3RlZFRhYiA9IG51bGw7DQotdmFyIHZpZXdUYWJzID0gbmV3IEFycmF5KCk7Ow0KLXZhciBsb2FkaW5nVGFiSW5kZXggPSAwOw0KLXZhciB0b3BpY1RvRGlzcGxheSA9IG51bGw7DQotdmFyIGlzVmlld3NWaXNpYmxlID0gdHJ1ZTsNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfZnIuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfZnIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNjI2ZWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX2ZyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIGphdmFzY3JpcHQgZm9yIHRoZSBib29rbWFya3MgZnJhbWUgKCB0aGUgb3J5X3RvY19mcmFtZSBmcmFtZSkNCi0vLyB0aGlzIGZyYW1lIGNvbnRhaW5zIGEgY2hpbGQgaWZyYW1lIChvcnlfdG9jKQ0KLQ0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQNCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEgPSAiSW1wb3NzaWJsZSBkZSB0cm91dmVyIGNldHRlIHBhZ2UgZGFucyBsYSB2dWUgZGUgbCdhcmJyZSBkZSBuYXZpZ2F0aW9uLiI7DQotDQotZnVuY3Rpb24gZGlzcGxheVRyZWUodGFiKQ0KLXsNCi0JdXJsID0gdGFiLmdldEF0dHJpYnV0ZSgndXJsJyk7DQotDQotCWlmICggc2VsZWN0ZWRUYWIgIT0gbnVsbCApDQotCXsNCi0JCXNlbGVjdGVkVGFiLmNsYXNzTmFtZSA9ICJ0YWIiDQotCX0NCi0JdGFiLmNsYXNzTmFtZSA9ICJzZWxlY3RlZFRhYiINCi0Jc2VsZWN0ZWRUYWIgPSB0YWI7DQotDQotCWxvYWRJZnJhbWUoIm9yeV90b2MiLCB1cmwpOw0KLX0NCi0NCi1mdW5jdGlvbiBsb2FkSWZyYW1lKGlmcmFtZU5hbWUsIHVybCkNCi17DQotCWlmICggd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXSApDQotCXsNCi0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0udG9jX2xvYWRlZCA9IGZhbHNlOw0KLQkJd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXS5sb2NhdGlvbiA9IHVybDsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCWVsc2UgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi1mdW5jdGlvbiBzaG93UGFnZSgpDQotew0KLQ0KLQlwYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0ubG9jYXRpb24uaHJlZiA9IHVuZXNjYXBlKHRvcGljVG9EaXNwbGF5KTsNCi19DQotDQotDQotLyoqDQotICogZmluZCBhIHRvcGljIGluIHRoZSB0cmVlOiB0aGUgdG9waWMgaXMgc2V0IGluIHRvcGljVG9EaXNwbGF5DQotICogcmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3MNCi0gKi8NCi1mdW5jdGlvbiBmaW5kVG9jVG9waWMoKQ0KLXsNCi0JdmFyIHRvY193aW5kb3cgPSB3aW5kb3cuZnJhbWVzWyJvcnlfdG9jIl07DQotDQotCS8vYWxlcnQodG9jX3dpbmRvdy50b2NfbG9hZGVkKTsNCi0JLy8gY2hlY2sgZm9yIGZhbHNlIGlzIG5vdCBzYWZlIHNpbmNlIHRoZSB2YWx1ZSBtaWdodCBiZSB1bmRlZmluZWQgaWYgdGhlIGZyYW1lIGlzIG5vdCBsb2FkZWQgeWV0DQotCS8vaWYgKHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSBmYWxzZSApDQotCWlmICggdG9jX3dpbmRvdy50b2NfbG9hZGVkICE9IHRydWUgKQ0KLQl7DQotCQkvL2lmICggdG9jX3dpbmRvdy50b2NfbG9hZGVkID09IHVuZGVmaW5lZCApDQotCQkvL3sNCi0JCS8vCWFsZXJ0KCJnb3QgaXQhIik7DQotCQkvL30NCi0JCXdpbmRvdy5zZXRUaW1lb3V0KCJmaW5kVG9jVG9waWMoKSIsIDIwMCk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQlpZiAoIHRvcGljVG9EaXNwbGF5ID09IG51bGwgKQ0KLQkJew0KLQkJCXRvcGljVG9EaXNwbGF5ID0gdG9jX3dpbmRvdy5nZXRGaXJzdFRvcGljVXJsKCk7DQotCQl9DQotCQ0KLQkJdmFyIHRvcGljID0gdG9waWNUb0Rpc3BsYXk7DQotDQotCQkvLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB2aWV3LCBpZiBub3QsIGxvb2sgZm9yIHRoZSBuZXh0IHZpZXcNCi0JCWlmICggdG9jX3dpbmRvdy5zZWxlY3RUb3BpYyh0b3BpYykgPT0gZmFsc2UgKQ0KLQkJew0KLQkJCWlmICggbG9hZGluZ1RhYkluZGV4IDwgdmlld1RhYnMubGVuZ3RoIC0xICkNCi0JCQl7DQotCQkJCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleCsrXSk7DQotCQkJCWZpbmRUb2NUb3BpYygpOw0KLQkJCX0NCi0JCQllbHNlDQotCQkJew0KLQkJCQkvLyBlbmQgZmluZGluZyBhbmQgZ290IG5vdGhpbmcNCi0JCQkJLy8gZGlzcGxheSB0aGUgZGVmYXVsdA0KLQkJCQlhbGVydChib29rbWFya3ZpZXdzX2pzX01FU1NBR0UxKTsNCi0JCQkJbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JCQkJc2hvd1BhZ2UoKTsNCi0JCQl9DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JCQkvLyBmaW5kIHN1Y2Nlc3NmdWwsIGRpc3BsYXkgdGhlIHRvcGljIHBhZ2UNCi0JCQlzaG93UGFnZSgpOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLQ0KLQ0KLS8vIGZpbmQgdGhlIHRvcGljIGluIHRoZSBjdXJyZW50IHRhYg0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkNCi17DQotCXZhciB1cmwgPSBwYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0uZG9jdW1lbnQuVVJMOw0KLQkNCi0JaWYgKCB1cmwgIT0gbnVsbCApDQotCXsNCi0JCXRvcGljVG9EaXNwbGF5ID0gdXJsOw0KLQkJZmluZFRvY1RvcGljKCk7DQotCX0NCi19DQotDQotDQotZnVuY3Rpb24gdG9nVmlld3MoKQ0KLXsNCi0JLy8gaWYgY3VycmVudGx5IHZpc2libGUsIGhpZGUgYWxsIGV4Y2VwdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkDQotCWlzVmlld3NWaXNpYmxlID0gKCFpc1ZpZXdzVmlzaWJsZSk7DQotCQ0KLQlmb3IgKCB2YXIgaSA9IDA7ICBpIDwgdmlld1RhYnMubGVuZ3RoOyBpKyspDQotCXsNCi0JCXZhciBzaG93ID0gaXNWaWV3c1Zpc2libGUgfHwgKHZpZXdUYWJzW2ldID09IHNlbGVjdGVkVGFiKTsNCi0JCWlmICggc2hvdyApDQotCQl7CQkNCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7DQotCQkJdmlld1RhYnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCS8vdmlld1RhYnNbaV0uc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOw0KLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl9DQotCX0NCi0JCQ0KLQkJDQotDQotfQ0KLQ0KLQ0KLS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQgcGFnZSBhbmQgbmF2aWdhdGUgdG8gdGhlIG5vZGUNCi0vLyBpZiBubyBkZWZhdWx0IHBhZ2UgaXMgc2V0LCBkaXNwbGF5IHRoZSBmaXJzdCBub2RlIG9mIHRoZSBmaXJzdCB2aWV3DQotZnVuY3Rpb24gaW5pdCgpDQotew0KLQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQl2YXIgdGFicyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIik7DQotCXZhciB0YWJjb3VudCA9IDA7DQotCWZvciAodmFyIGk9MDsgaTx0YWJzLmxlbmd0aDsgaSsrKQ0KLQl7DQotCQlpZiAoIHRhYnNbaV0uZ2V0QXR0cmlidXRlKCd1cmwnKSAhPSBudWxsICkNCi0JCXsJCQkNCi0JCQl2YXIgaXNEZWZhdWx0VmlldyA9IHRhYnNbaV0uZ2V0QXR0cmlidXRlKCdpc0RlZmF1bHRWaWV3Jyk7DQotCQkJaWYgKCBpc0RlZmF1bHRWaWV3ID09ICJ0cnVlIiApDQotCQkJew0KLQkJCQlsb2FkaW5nVGFiSW5kZXggPSB0YWJjb3VudDsNCi0JCQl9DQotCQkJDQotCQkJdmlld1RhYnNbdGFiY291bnQrK10gPSB0YWJzW2ldOw0KLQkJfQ0KLQl9DQotDQotCXRvcGljVG9EaXNwbGF5ID0gcGFyZW50LmdldENvb2tpZSgicnVwX29yeV9kb2MiKTsNCi0JZGlzcGxheVRyZWUodmlld1RhYnNbbG9hZGluZ1RhYkluZGV4XSk7DQotCWZpbmRUb2NUb3BpYygpOw0KLX0NCi0NCi0NCi12YXIgc2VsZWN0ZWRUYWIgPSBudWxsOw0KLXZhciB2aWV3VGFicyA9IG5ldyBBcnJheSgpOzsNCi12YXIgbG9hZGluZ1RhYkluZGV4ID0gMDsNCi12YXIgdG9waWNUb0Rpc3BsYXkgPSBudWxsOw0KLXZhciBpc1ZpZXdzVmlzaWJsZSA9IHRydWU7DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX2l0LmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX2l0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2I5ZTY5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c19pdC5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBqYXZhc2NyaXB0IGZvciB0aGUgYm9va21hcmtzIGZyYW1lICggdGhlIG9yeV90b2NfZnJhbWUgZnJhbWUpDQotLy8gdGhpcyBmcmFtZSBjb250YWlucyBhIGNoaWxkIGlmcmFtZSAob3J5X3RvYykNCi0NCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkDQotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLXZhciBib29rbWFya3ZpZXdzX2pzX01FU1NBR0UxID0gIkltcG9zc2liaWxlIHRyb3ZhcmUgcXVlc3RhIHBhZ2luYSBuZWxsYSB2aXN0YSBkZWxsYSBzdHJ1dHR1cmEgZGkgbmF2aWdhemlvbmUuIjsNCi0NCi1mdW5jdGlvbiBkaXNwbGF5VHJlZSh0YWIpDQotew0KLQl1cmwgPSB0YWIuZ2V0QXR0cmlidXRlKCd1cmwnKTsNCi0NCi0JaWYgKCBzZWxlY3RlZFRhYiAhPSBudWxsICkNCi0Jew0KLQkJc2VsZWN0ZWRUYWIuY2xhc3NOYW1lID0gInRhYiINCi0JfQ0KLQl0YWIuY2xhc3NOYW1lID0gInNlbGVjdGVkVGFiIg0KLQlzZWxlY3RlZFRhYiA9IHRhYjsNCi0NCi0JbG9hZElmcmFtZSgib3J5X3RvYyIsIHVybCk7DQotfQ0KLQ0KLWZ1bmN0aW9uIGxvYWRJZnJhbWUoaWZyYW1lTmFtZSwgdXJsKQ0KLXsNCi0JaWYgKCB3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdICkNCi0Jew0KLQkJd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXS50b2NfbG9hZGVkID0gZmFsc2U7DQotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLmxvY2F0aW9uID0gdXJsOw0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JZWxzZSByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLWZ1bmN0aW9uIHNob3dQYWdlKCkNCi17DQotDQotCXBhcmVudC5mcmFtZXNbIm9yeV9kb2MiXS5sb2NhdGlvbi5ocmVmID0gdW5lc2NhcGUodG9waWNUb0Rpc3BsYXkpOw0KLX0NCi0NCi0NCi0vKioNCi0gKiBmaW5kIGEgdG9waWMgaW4gdGhlIHRyZWU6IHRoZSB0b3BpYyBpcyBzZXQgaW4gdG9waWNUb0Rpc3BsYXkNCi0gKiByZXR1cm5zIHRydWUgaWYgc3VjY2Vzcw0KLSAqLw0KLWZ1bmN0aW9uIGZpbmRUb2NUb3BpYygpDQotew0KLQl2YXIgdG9jX3dpbmRvdyA9IHdpbmRvdy5mcmFtZXNbIm9yeV90b2MiXTsNCi0NCi0JLy9hbGVydCh0b2Nfd2luZG93LnRvY19sb2FkZWQpOw0KLQkvLyBjaGVjayBmb3IgZmFsc2UgaXMgbm90IHNhZmUgc2luY2UgdGhlIHZhbHVlIG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB0aGUgZnJhbWUgaXMgbm90IGxvYWRlZCB5ZXQNCi0JLy9pZiAodG9jX3dpbmRvdy50b2NfbG9hZGVkID09IGZhbHNlICkNCi0JaWYgKCB0b2Nfd2luZG93LnRvY19sb2FkZWQgIT0gdHJ1ZSApDQotCXsNCi0JCS8vaWYgKCB0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gdW5kZWZpbmVkICkNCi0JCS8vew0KLQkJLy8JYWxlcnQoImdvdCBpdCEiKTsNCi0JCS8vfQ0KLQkJd2luZG93LnNldFRpbWVvdXQoImZpbmRUb2NUb3BpYygpIiwgMjAwKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCWlmICggdG9waWNUb0Rpc3BsYXkgPT0gbnVsbCApDQotCQl7DQotCQkJdG9waWNUb0Rpc3BsYXkgPSB0b2Nfd2luZG93LmdldEZpcnN0VG9waWNVcmwoKTsNCi0JCX0NCi0JDQotCQl2YXIgdG9waWMgPSB0b3BpY1RvRGlzcGxheTsNCi0NCi0JCS8vIGZpbmQgdGhlIHRvcGljIGluIHRoZSBjdXJyZW50IHZpZXcsIGlmIG5vdCwgbG9vayBmb3IgdGhlIG5leHQgdmlldw0KLQkJaWYgKCB0b2Nfd2luZG93LnNlbGVjdFRvcGljKHRvcGljKSA9PSBmYWxzZSApDQotCQl7DQotCQkJaWYgKCBsb2FkaW5nVGFiSW5kZXggPCB2aWV3VGFicy5sZW5ndGggLTEgKQ0KLQkJCXsNCi0JCQkJZGlzcGxheVRyZWUodmlld1RhYnNbbG9hZGluZ1RhYkluZGV4KytdKTsNCi0JCQkJZmluZFRvY1RvcGljKCk7DQotCQkJfQ0KLQkJCWVsc2UNCi0JCQl7DQotCQkJCS8vIGVuZCBmaW5kaW5nIGFuZCBnb3Qgbm90aGluZw0KLQkJCQkvLyBkaXNwbGF5IHRoZSBkZWZhdWx0DQotCQkJCWFsZXJ0KGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEpOw0KLQkJCQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQkJCQlzaG93UGFnZSgpOw0KLQkJCX0NCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQkJCS8vIGZpbmQgc3VjY2Vzc2Z1bCwgZGlzcGxheSB0aGUgdG9waWMgcGFnZQ0KLQkJCXNob3dQYWdlKCk7DQotCQl9DQotCX0NCi19DQotDQotDQotDQotLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdGFiDQotZnVuY3Rpb24gd2hlcmVBbUkoKQ0KLXsNCi0JdmFyIHVybCA9IHBhcmVudC5mcmFtZXNbIm9yeV9kb2MiXS5kb2N1bWVudC5VUkw7DQotCQ0KLQlpZiAoIHVybCAhPSBudWxsICkNCi0Jew0KLQkJdG9waWNUb0Rpc3BsYXkgPSB1cmw7DQotCQlmaW5kVG9jVG9waWMoKTsNCi0JfQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiB0b2dWaWV3cygpDQotew0KLQkvLyBpZiBjdXJyZW50bHkgdmlzaWJsZSwgaGlkZSBhbGwgZXhjZXB0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQNCi0JaXNWaWV3c1Zpc2libGUgPSAoIWlzVmlld3NWaXNpYmxlKTsNCi0JDQotCWZvciAoIHZhciBpID0gMDsgIGkgPCB2aWV3VGFicy5sZW5ndGg7IGkrKykNCi0Jew0KLQkJdmFyIHNob3cgPSBpc1ZpZXdzVmlzaWJsZSB8fCAodmlld1RhYnNbaV0gPT0gc2VsZWN0ZWRUYWIpOw0KLQkJaWYgKCBzaG93ICkNCi0JCXsJCQ0KLQkJCS8vdmlld1RhYnNbaV0uc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsNCi0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQotCQkJdmlld1RhYnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCX0NCi0JfQ0KLQkJDQotCQkNCi0NCi19DQotDQotDQotLy8gZGlzcGxheSB0aGUgZGVmYXVsdCBwYWdlIGFuZCBuYXZpZ2F0ZSB0byB0aGUgbm9kZQ0KLS8vIGlmIG5vIGRlZmF1bHQgcGFnZSBpcyBzZXQsIGRpc3BsYXkgdGhlIGZpcnN0IG5vZGUgb2YgdGhlIGZpcnN0IHZpZXcNCi1mdW5jdGlvbiBpbml0KCkNCi17DQotCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCXZhciB0YWJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKTsNCi0JdmFyIHRhYmNvdW50ID0gMDsNCi0JZm9yICh2YXIgaT0wOyBpPHRhYnMubGVuZ3RoOyBpKyspDQotCXsNCi0JCWlmICggdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ3VybCcpICE9IG51bGwgKQ0KLQkJewkJCQ0KLQkJCXZhciBpc0RlZmF1bHRWaWV3ID0gdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ2lzRGVmYXVsdFZpZXcnKTsNCi0JCQlpZiAoIGlzRGVmYXVsdFZpZXcgPT0gInRydWUiICkNCi0JCQl7DQotCQkJCWxvYWRpbmdUYWJJbmRleCA9IHRhYmNvdW50Ow0KLQkJCX0NCi0JCQkNCi0JCQl2aWV3VGFic1t0YWJjb3VudCsrXSA9IHRhYnNbaV07DQotCQl9DQotCX0NCi0NCi0JdG9waWNUb0Rpc3BsYXkgPSBwYXJlbnQuZ2V0Q29va2llKCJydXBfb3J5X2RvYyIpOw0KLQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXhdKTsNCi0JZmluZFRvY1RvcGljKCk7DQotfQ0KLQ0KLQ0KLXZhciBzZWxlY3RlZFRhYiA9IG51bGw7DQotdmFyIHZpZXdUYWJzID0gbmV3IEFycmF5KCk7Ow0KLXZhciBsb2FkaW5nVGFiSW5kZXggPSAwOw0KLXZhciB0b3BpY1RvRGlzcGxheSA9IG51bGw7DQotdmFyIGlzVmlld3NWaXNpYmxlID0gdHJ1ZTsNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfamEuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfamEuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDhlOTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX2phLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIGphdmFzY3JpcHQgZm9yIHRoZSBib29rbWFya3MgZnJhbWUgKCB0aGUgb3J5X3RvY19mcmFtZSBmcmFtZSkNCi0vLyB0aGlzIGZyYW1lIGNvbnRhaW5zIGEgY2hpbGQgaWZyYW1lIChvcnlfdG9jKQ0KLQ0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQNCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEgPSAi44GT44Gu44Oa44O844K444KS44OK44OT44Ky44O844K344On44Oz44O744OE44Oq44O844O744OT44Ol44O844Gn6KaL44Gk44GR44KL44GT44Go44GM44Gn44GN44G+44Gb44KT44Gn44GX44Gf44CCICI7DQotDQotZnVuY3Rpb24gZGlzcGxheVRyZWUodGFiKQ0KLXsNCi0JdXJsID0gdGFiLmdldEF0dHJpYnV0ZSgndXJsJyk7DQotDQotCWlmICggc2VsZWN0ZWRUYWIgIT0gbnVsbCApDQotCXsNCi0JCXNlbGVjdGVkVGFiLmNsYXNzTmFtZSA9ICJ0YWIiDQotCX0NCi0JdGFiLmNsYXNzTmFtZSA9ICJzZWxlY3RlZFRhYiINCi0Jc2VsZWN0ZWRUYWIgPSB0YWI7DQotDQotCWxvYWRJZnJhbWUoIm9yeV90b2MiLCB1cmwpOw0KLX0NCi0NCi1mdW5jdGlvbiBsb2FkSWZyYW1lKGlmcmFtZU5hbWUsIHVybCkNCi17DQotCWlmICggd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXSApDQotCXsNCi0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0udG9jX2xvYWRlZCA9IGZhbHNlOw0KLQkJd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXS5sb2NhdGlvbiA9IHVybDsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCWVsc2UgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi1mdW5jdGlvbiBzaG93UGFnZSgpDQotew0KLQ0KLQlwYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0ubG9jYXRpb24uaHJlZiA9IHVuZXNjYXBlKHRvcGljVG9EaXNwbGF5KTsNCi19DQotDQotDQotLyoqDQotICogZmluZCBhIHRvcGljIGluIHRoZSB0cmVlOiB0aGUgdG9waWMgaXMgc2V0IGluIHRvcGljVG9EaXNwbGF5DQotICogcmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3MNCi0gKi8NCi1mdW5jdGlvbiBmaW5kVG9jVG9waWMoKQ0KLXsNCi0JdmFyIHRvY193aW5kb3cgPSB3aW5kb3cuZnJhbWVzWyJvcnlfdG9jIl07DQotDQotCS8vYWxlcnQodG9jX3dpbmRvdy50b2NfbG9hZGVkKTsNCi0JLy8gY2hlY2sgZm9yIGZhbHNlIGlzIG5vdCBzYWZlIHNpbmNlIHRoZSB2YWx1ZSBtaWdodCBiZSB1bmRlZmluZWQgaWYgdGhlIGZyYW1lIGlzIG5vdCBsb2FkZWQgeWV0DQotCS8vaWYgKHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSBmYWxzZSApDQotCWlmICggdG9jX3dpbmRvdy50b2NfbG9hZGVkICE9IHRydWUgKQ0KLQl7DQotCQkvL2lmICggdG9jX3dpbmRvdy50b2NfbG9hZGVkID09IHVuZGVmaW5lZCApDQotCQkvL3sNCi0JCS8vCWFsZXJ0KCJnb3QgaXQhIik7DQotCQkvL30NCi0JCXdpbmRvdy5zZXRUaW1lb3V0KCJmaW5kVG9jVG9waWMoKSIsIDIwMCk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQlpZiAoIHRvcGljVG9EaXNwbGF5ID09IG51bGwgKQ0KLQkJew0KLQkJCXRvcGljVG9EaXNwbGF5ID0gdG9jX3dpbmRvdy5nZXRGaXJzdFRvcGljVXJsKCk7DQotCQl9DQotCQ0KLQkJdmFyIHRvcGljID0gdG9waWNUb0Rpc3BsYXk7DQotDQotCQkvLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB2aWV3LCBpZiBub3QsIGxvb2sgZm9yIHRoZSBuZXh0IHZpZXcNCi0JCWlmICggdG9jX3dpbmRvdy5zZWxlY3RUb3BpYyh0b3BpYykgPT0gZmFsc2UgKQ0KLQkJew0KLQkJCWlmICggbG9hZGluZ1RhYkluZGV4IDwgdmlld1RhYnMubGVuZ3RoIC0xICkNCi0JCQl7DQotCQkJCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleCsrXSk7DQotCQkJCWZpbmRUb2NUb3BpYygpOw0KLQkJCX0NCi0JCQllbHNlDQotCQkJew0KLQkJCQkvLyBlbmQgZmluZGluZyBhbmQgZ290IG5vdGhpbmcNCi0JCQkJLy8gZGlzcGxheSB0aGUgZGVmYXVsdA0KLQkJCQlhbGVydChib29rbWFya3ZpZXdzX2pzX01FU1NBR0UxKTsNCi0JCQkJbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JCQkJc2hvd1BhZ2UoKTsNCi0JCQl9DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JCQkvLyBmaW5kIHN1Y2Nlc3NmdWwsIGRpc3BsYXkgdGhlIHRvcGljIHBhZ2UNCi0JCQlzaG93UGFnZSgpOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLQ0KLQ0KLS8vIGZpbmQgdGhlIHRvcGljIGluIHRoZSBjdXJyZW50IHRhYg0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkNCi17DQotCXZhciB1cmwgPSBwYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0uZG9jdW1lbnQuVVJMOw0KLQkNCi0JaWYgKCB1cmwgIT0gbnVsbCApDQotCXsNCi0JCXRvcGljVG9EaXNwbGF5ID0gdXJsOw0KLQkJZmluZFRvY1RvcGljKCk7DQotCX0NCi19DQotDQotDQotZnVuY3Rpb24gdG9nVmlld3MoKQ0KLXsNCi0JLy8gaWYgY3VycmVudGx5IHZpc2libGUsIGhpZGUgYWxsIGV4Y2VwdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkDQotCWlzVmlld3NWaXNpYmxlID0gKCFpc1ZpZXdzVmlzaWJsZSk7DQotCQ0KLQlmb3IgKCB2YXIgaSA9IDA7ICBpIDwgdmlld1RhYnMubGVuZ3RoOyBpKyspDQotCXsNCi0JCXZhciBzaG93ID0gaXNWaWV3c1Zpc2libGUgfHwgKHZpZXdUYWJzW2ldID09IHNlbGVjdGVkVGFiKTsNCi0JCWlmICggc2hvdyApDQotCQl7CQkNCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7DQotCQkJdmlld1RhYnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCS8vdmlld1RhYnNbaV0uc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOw0KLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl9DQotCX0NCi0JCQ0KLQkJDQotDQotfQ0KLQ0KLQ0KLS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQgcGFnZSBhbmQgbmF2aWdhdGUgdG8gdGhlIG5vZGUNCi0vLyBpZiBubyBkZWZhdWx0IHBhZ2UgaXMgc2V0LCBkaXNwbGF5IHRoZSBmaXJzdCBub2RlIG9mIHRoZSBmaXJzdCB2aWV3DQotZnVuY3Rpb24gaW5pdCgpDQotew0KLQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQl2YXIgdGFicyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIik7DQotCXZhciB0YWJjb3VudCA9IDA7DQotCWZvciAodmFyIGk9MDsgaTx0YWJzLmxlbmd0aDsgaSsrKQ0KLQl7DQotCQlpZiAoIHRhYnNbaV0uZ2V0QXR0cmlidXRlKCd1cmwnKSAhPSBudWxsICkNCi0JCXsJCQkNCi0JCQl2YXIgaXNEZWZhdWx0VmlldyA9IHRhYnNbaV0uZ2V0QXR0cmlidXRlKCdpc0RlZmF1bHRWaWV3Jyk7DQotCQkJaWYgKCBpc0RlZmF1bHRWaWV3ID09ICJ0cnVlIiApDQotCQkJew0KLQkJCQlsb2FkaW5nVGFiSW5kZXggPSB0YWJjb3VudDsNCi0JCQl9DQotCQkJDQotCQkJdmlld1RhYnNbdGFiY291bnQrK10gPSB0YWJzW2ldOw0KLQkJfQ0KLQl9DQotDQotCXRvcGljVG9EaXNwbGF5ID0gcGFyZW50LmdldENvb2tpZSgicnVwX29yeV9kb2MiKTsNCi0JZGlzcGxheVRyZWUodmlld1RhYnNbbG9hZGluZ1RhYkluZGV4XSk7DQotCWZpbmRUb2NUb3BpYygpOw0KLX0NCi0NCi0NCi12YXIgc2VsZWN0ZWRUYWIgPSBudWxsOw0KLXZhciB2aWV3VGFicyA9IG5ldyBBcnJheSgpOzsNCi12YXIgbG9hZGluZ1RhYkluZGV4ID0gMDsNCi12YXIgdG9waWNUb0Rpc3BsYXkgPSBudWxsOw0KLXZhciBpc1ZpZXdzVmlzaWJsZSA9IHRydWU7DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX2tvLmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX2tvLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjg0MzQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c19rby5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBqYXZhc2NyaXB0IGZvciB0aGUgYm9va21hcmtzIGZyYW1lICggdGhlIG9yeV90b2NfZnJhbWUgZnJhbWUpDQotLy8gdGhpcyBmcmFtZSBjb250YWlucyBhIGNoaWxkIGlmcmFtZSAob3J5X3RvYykNCi0NCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkDQotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLXZhciBib29rbWFya3ZpZXdzX2pzX01FU1NBR0UxID0gIuydtCDtjpjsnbTsp4DripQg7YOQ7IOJIO2KuOumrCDrs7TquLDsl5DshJwg7LC+7J2EIOyImCDsl4bsirXri4jri6QuIjsNCi0NCi1mdW5jdGlvbiBkaXNwbGF5VHJlZSh0YWIpDQotew0KLQl1cmwgPSB0YWIuZ2V0QXR0cmlidXRlKCd1cmwnKTsNCi0NCi0JaWYgKCBzZWxlY3RlZFRhYiAhPSBudWxsICkNCi0Jew0KLQkJc2VsZWN0ZWRUYWIuY2xhc3NOYW1lID0gInRhYiINCi0JfQ0KLQl0YWIuY2xhc3NOYW1lID0gInNlbGVjdGVkVGFiIg0KLQlzZWxlY3RlZFRhYiA9IHRhYjsNCi0NCi0JbG9hZElmcmFtZSgib3J5X3RvYyIsIHVybCk7DQotfQ0KLQ0KLWZ1bmN0aW9uIGxvYWRJZnJhbWUoaWZyYW1lTmFtZSwgdXJsKQ0KLXsNCi0JaWYgKCB3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdICkNCi0Jew0KLQkJd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXS50b2NfbG9hZGVkID0gZmFsc2U7DQotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLmxvY2F0aW9uID0gdXJsOw0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JZWxzZSByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLWZ1bmN0aW9uIHNob3dQYWdlKCkNCi17DQotDQotCXBhcmVudC5mcmFtZXNbIm9yeV9kb2MiXS5sb2NhdGlvbi5ocmVmID0gdW5lc2NhcGUodG9waWNUb0Rpc3BsYXkpOw0KLX0NCi0NCi0NCi0vKioNCi0gKiBmaW5kIGEgdG9waWMgaW4gdGhlIHRyZWU6IHRoZSB0b3BpYyBpcyBzZXQgaW4gdG9waWNUb0Rpc3BsYXkNCi0gKiByZXR1cm5zIHRydWUgaWYgc3VjY2Vzcw0KLSAqLw0KLWZ1bmN0aW9uIGZpbmRUb2NUb3BpYygpDQotew0KLQl2YXIgdG9jX3dpbmRvdyA9IHdpbmRvdy5mcmFtZXNbIm9yeV90b2MiXTsNCi0NCi0JLy9hbGVydCh0b2Nfd2luZG93LnRvY19sb2FkZWQpOw0KLQkvLyBjaGVjayBmb3IgZmFsc2UgaXMgbm90IHNhZmUgc2luY2UgdGhlIHZhbHVlIG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB0aGUgZnJhbWUgaXMgbm90IGxvYWRlZCB5ZXQNCi0JLy9pZiAodG9jX3dpbmRvdy50b2NfbG9hZGVkID09IGZhbHNlICkNCi0JaWYgKCB0b2Nfd2luZG93LnRvY19sb2FkZWQgIT0gdHJ1ZSApDQotCXsNCi0JCS8vaWYgKCB0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gdW5kZWZpbmVkICkNCi0JCS8vew0KLQkJLy8JYWxlcnQoImdvdCBpdCEiKTsNCi0JCS8vfQ0KLQkJd2luZG93LnNldFRpbWVvdXQoImZpbmRUb2NUb3BpYygpIiwgMjAwKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCWlmICggdG9waWNUb0Rpc3BsYXkgPT0gbnVsbCApDQotCQl7DQotCQkJdG9waWNUb0Rpc3BsYXkgPSB0b2Nfd2luZG93LmdldEZpcnN0VG9waWNVcmwoKTsNCi0JCX0NCi0JDQotCQl2YXIgdG9waWMgPSB0b3BpY1RvRGlzcGxheTsNCi0NCi0JCS8vIGZpbmQgdGhlIHRvcGljIGluIHRoZSBjdXJyZW50IHZpZXcsIGlmIG5vdCwgbG9vayBmb3IgdGhlIG5leHQgdmlldw0KLQkJaWYgKCB0b2Nfd2luZG93LnNlbGVjdFRvcGljKHRvcGljKSA9PSBmYWxzZSApDQotCQl7DQotCQkJaWYgKCBsb2FkaW5nVGFiSW5kZXggPCB2aWV3VGFicy5sZW5ndGggLTEgKQ0KLQkJCXsNCi0JCQkJZGlzcGxheVRyZWUodmlld1RhYnNbbG9hZGluZ1RhYkluZGV4KytdKTsNCi0JCQkJZmluZFRvY1RvcGljKCk7DQotCQkJfQ0KLQkJCWVsc2UNCi0JCQl7DQotCQkJCS8vIGVuZCBmaW5kaW5nIGFuZCBnb3Qgbm90aGluZw0KLQkJCQkvLyBkaXNwbGF5IHRoZSBkZWZhdWx0DQotCQkJCWFsZXJ0KGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEpOw0KLQkJCQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQkJCQlzaG93UGFnZSgpOw0KLQkJCX0NCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQkJCS8vIGZpbmQgc3VjY2Vzc2Z1bCwgZGlzcGxheSB0aGUgdG9waWMgcGFnZQ0KLQkJCXNob3dQYWdlKCk7DQotCQl9DQotCX0NCi19DQotDQotDQotDQotLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdGFiDQotZnVuY3Rpb24gd2hlcmVBbUkoKQ0KLXsNCi0JdmFyIHVybCA9IHBhcmVudC5mcmFtZXNbIm9yeV9kb2MiXS5kb2N1bWVudC5VUkw7DQotCQ0KLQlpZiAoIHVybCAhPSBudWxsICkNCi0Jew0KLQkJdG9waWNUb0Rpc3BsYXkgPSB1cmw7DQotCQlmaW5kVG9jVG9waWMoKTsNCi0JfQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiB0b2dWaWV3cygpDQotew0KLQkvLyBpZiBjdXJyZW50bHkgdmlzaWJsZSwgaGlkZSBhbGwgZXhjZXB0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQNCi0JaXNWaWV3c1Zpc2libGUgPSAoIWlzVmlld3NWaXNpYmxlKTsNCi0JDQotCWZvciAoIHZhciBpID0gMDsgIGkgPCB2aWV3VGFicy5sZW5ndGg7IGkrKykNCi0Jew0KLQkJdmFyIHNob3cgPSBpc1ZpZXdzVmlzaWJsZSB8fCAodmlld1RhYnNbaV0gPT0gc2VsZWN0ZWRUYWIpOw0KLQkJaWYgKCBzaG93ICkNCi0JCXsJCQ0KLQkJCS8vdmlld1RhYnNbaV0uc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsNCi0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQotCQkJdmlld1RhYnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCX0NCi0JfQ0KLQkJDQotCQkNCi0NCi19DQotDQotDQotLy8gZGlzcGxheSB0aGUgZGVmYXVsdCBwYWdlIGFuZCBuYXZpZ2F0ZSB0byB0aGUgbm9kZQ0KLS8vIGlmIG5vIGRlZmF1bHQgcGFnZSBpcyBzZXQsIGRpc3BsYXkgdGhlIGZpcnN0IG5vZGUgb2YgdGhlIGZpcnN0IHZpZXcNCi1mdW5jdGlvbiBpbml0KCkNCi17DQotCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCXZhciB0YWJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKTsNCi0JdmFyIHRhYmNvdW50ID0gMDsNCi0JZm9yICh2YXIgaT0wOyBpPHRhYnMubGVuZ3RoOyBpKyspDQotCXsNCi0JCWlmICggdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ3VybCcpICE9IG51bGwgKQ0KLQkJewkJCQ0KLQkJCXZhciBpc0RlZmF1bHRWaWV3ID0gdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ2lzRGVmYXVsdFZpZXcnKTsNCi0JCQlpZiAoIGlzRGVmYXVsdFZpZXcgPT0gInRydWUiICkNCi0JCQl7DQotCQkJCWxvYWRpbmdUYWJJbmRleCA9IHRhYmNvdW50Ow0KLQkJCX0NCi0JCQkNCi0JCQl2aWV3VGFic1t0YWJjb3VudCsrXSA9IHRhYnNbaV07DQotCQl9DQotCX0NCi0NCi0JdG9waWNUb0Rpc3BsYXkgPSBwYXJlbnQuZ2V0Q29va2llKCJydXBfb3J5X2RvYyIpOw0KLQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXhdKTsNCi0JZmluZFRvY1RvcGljKCk7DQotfQ0KLQ0KLQ0KLXZhciBzZWxlY3RlZFRhYiA9IG51bGw7DQotdmFyIHZpZXdUYWJzID0gbmV3IEFycmF5KCk7Ow0KLXZhciBsb2FkaW5nVGFiSW5kZXggPSAwOw0KLXZhciB0b3BpY1RvRGlzcGxheSA9IG51bGw7DQotdmFyIGlzVmlld3NWaXNpYmxlID0gdHJ1ZTsNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfcHRfQlIuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfcHRfQlIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NjE3YzMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX3B0X0JSLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIGphdmFzY3JpcHQgZm9yIHRoZSBib29rbWFya3MgZnJhbWUgKCB0aGUgb3J5X3RvY19mcmFtZSBmcmFtZSkNCi0vLyB0aGlzIGZyYW1lIGNvbnRhaW5zIGEgY2hpbGQgaWZyYW1lIChvcnlfdG9jKQ0KLQ0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQNCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEgPSAiRXN0YSBww6FnaW5hIG7Do28gcMO0ZGUgc2VyIGVuY29udHJhZGEgbmEgdmlzdWFsaXphw6fDo28gZGEgw6Fydm9yZSBkZSBuYXZlZ2HDp8Ojby4iOw0KLQ0KLWZ1bmN0aW9uIGRpc3BsYXlUcmVlKHRhYikNCi17DQotCXVybCA9IHRhYi5nZXRBdHRyaWJ1dGUoJ3VybCcpOw0KLQ0KLQlpZiAoIHNlbGVjdGVkVGFiICE9IG51bGwgKQ0KLQl7DQotCQlzZWxlY3RlZFRhYi5jbGFzc05hbWUgPSAidGFiIg0KLQl9DQotCXRhYi5jbGFzc05hbWUgPSAic2VsZWN0ZWRUYWIiDQotCXNlbGVjdGVkVGFiID0gdGFiOw0KLQ0KLQlsb2FkSWZyYW1lKCJvcnlfdG9jIiwgdXJsKTsNCi19DQotDQotZnVuY3Rpb24gbG9hZElmcmFtZShpZnJhbWVOYW1lLCB1cmwpDQotew0KLQlpZiAoIHdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0gKQ0KLQl7DQotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLnRvY19sb2FkZWQgPSBmYWxzZTsNCi0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0ubG9jYXRpb24gPSB1cmw7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQllbHNlIHJldHVybiBmYWxzZTsNCi19DQotDQotZnVuY3Rpb24gc2hvd1BhZ2UoKQ0KLXsNCi0NCi0JcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmxvY2F0aW9uLmhyZWYgPSB1bmVzY2FwZSh0b3BpY1RvRGlzcGxheSk7DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIGZpbmQgYSB0b3BpYyBpbiB0aGUgdHJlZTogdGhlIHRvcGljIGlzIHNldCBpbiB0b3BpY1RvRGlzcGxheQ0KLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzDQotICovDQotZnVuY3Rpb24gZmluZFRvY1RvcGljKCkNCi17DQotCXZhciB0b2Nfd2luZG93ID0gd2luZG93LmZyYW1lc1sib3J5X3RvYyJdOw0KLQ0KLQkvL2FsZXJ0KHRvY193aW5kb3cudG9jX2xvYWRlZCk7DQotCS8vIGNoZWNrIGZvciBmYWxzZSBpcyBub3Qgc2FmZSBzaW5jZSB0aGUgdmFsdWUgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHRoZSBmcmFtZSBpcyBub3QgbG9hZGVkIHlldA0KLQkvL2lmICh0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gZmFsc2UgKQ0KLQlpZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCAhPSB0cnVlICkNCi0Jew0KLQkJLy9pZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSB1bmRlZmluZWQgKQ0KLQkJLy97DQotCQkvLwlhbGVydCgiZ290IGl0ISIpOw0KLQkJLy99DQotCQl3aW5kb3cuc2V0VGltZW91dCgiZmluZFRvY1RvcGljKCkiLCAyMDApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJaWYgKCB0b3BpY1RvRGlzcGxheSA9PSBudWxsICkNCi0JCXsNCi0JCQl0b3BpY1RvRGlzcGxheSA9IHRvY193aW5kb3cuZ2V0Rmlyc3RUb3BpY1VybCgpOw0KLQkJfQ0KLQkNCi0JCXZhciB0b3BpYyA9IHRvcGljVG9EaXNwbGF5Ow0KLQ0KLQkJLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdmlldywgaWYgbm90LCBsb29rIGZvciB0aGUgbmV4dCB2aWV3DQotCQlpZiAoIHRvY193aW5kb3cuc2VsZWN0VG9waWModG9waWMpID09IGZhbHNlICkNCi0JCXsNCi0JCQlpZiAoIGxvYWRpbmdUYWJJbmRleCA8IHZpZXdUYWJzLmxlbmd0aCAtMSApDQotCQkJew0KLQkJCQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXgrK10pOw0KLQkJCQlmaW5kVG9jVG9waWMoKTsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJLy8gZW5kIGZpbmRpbmcgYW5kIGdvdCBub3RoaW5nDQotCQkJCS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQNCi0JCQkJYWxlcnQoYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSk7DQotCQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJCXNob3dQYWdlKCk7DQotCQkJfQ0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJLy8gZmluZCBzdWNjZXNzZnVsLCBkaXNwbGF5IHRoZSB0b3BpYyBwYWdlDQotCQkJc2hvd1BhZ2UoKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0NCi0NCi0vLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB0YWINCi1mdW5jdGlvbiB3aGVyZUFtSSgpDQotew0KLQl2YXIgdXJsID0gcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmRvY3VtZW50LlVSTDsNCi0JDQotCWlmICggdXJsICE9IG51bGwgKQ0KLQl7DQotCQl0b3BpY1RvRGlzcGxheSA9IHVybDsNCi0JCWZpbmRUb2NUb3BpYygpOw0KLQl9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHRvZ1ZpZXdzKCkNCi17DQotCS8vIGlmIGN1cnJlbnRseSB2aXNpYmxlLCBoaWRlIGFsbCBleGNlcHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZA0KLQlpc1ZpZXdzVmlzaWJsZSA9ICghaXNWaWV3c1Zpc2libGUpOw0KLQkNCi0JZm9yICggdmFyIGkgPSAwOyAgaSA8IHZpZXdUYWJzLmxlbmd0aDsgaSsrKQ0KLQl7DQotCQl2YXIgc2hvdyA9IGlzVmlld3NWaXNpYmxlIHx8ICh2aWV3VGFic1tpXSA9PSBzZWxlY3RlZFRhYik7DQotCQlpZiAoIHNob3cgKQ0KLQkJewkJDQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOw0KLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsNCi0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJfQ0KLQl9DQotCQkNCi0JCQ0KLQ0KLX0NCi0NCi0NCi0vLyBkaXNwbGF5IHRoZSBkZWZhdWx0IHBhZ2UgYW5kIG5hdmlnYXRlIHRvIHRoZSBub2RlDQotLy8gaWYgbm8gZGVmYXVsdCBwYWdlIGlzIHNldCwgZGlzcGxheSB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgZmlyc3Qgdmlldw0KLWZ1bmN0aW9uIGluaXQoKQ0KLXsNCi0JbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JdmFyIHRhYnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpOw0KLQl2YXIgdGFiY291bnQgPSAwOw0KLQlmb3IgKHZhciBpPTA7IGk8dGFicy5sZW5ndGg7IGkrKykNCi0Jew0KLQkJaWYgKCB0YWJzW2ldLmdldEF0dHJpYnV0ZSgndXJsJykgIT0gbnVsbCApDQotCQl7CQkJDQotCQkJdmFyIGlzRGVmYXVsdFZpZXcgPSB0YWJzW2ldLmdldEF0dHJpYnV0ZSgnaXNEZWZhdWx0VmlldycpOw0KLQkJCWlmICggaXNEZWZhdWx0VmlldyA9PSAidHJ1ZSIgKQ0KLQkJCXsNCi0JCQkJbG9hZGluZ1RhYkluZGV4ID0gdGFiY291bnQ7DQotCQkJfQ0KLQkJCQ0KLQkJCXZpZXdUYWJzW3RhYmNvdW50KytdID0gdGFic1tpXTsNCi0JCX0NCi0JfQ0KLQ0KLQl0b3BpY1RvRGlzcGxheSA9IHBhcmVudC5nZXRDb29raWUoInJ1cF9vcnlfZG9jIik7DQotCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleF0pOw0KLQlmaW5kVG9jVG9waWMoKTsNCi19DQotDQotDQotdmFyIHNlbGVjdGVkVGFiID0gbnVsbDsNCi12YXIgdmlld1RhYnMgPSBuZXcgQXJyYXkoKTs7DQotdmFyIGxvYWRpbmdUYWJJbmRleCA9IDA7DQotdmFyIHRvcGljVG9EaXNwbGF5ID0gbnVsbDsNCi12YXIgaXNWaWV3c1Zpc2libGUgPSB0cnVlOw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c196aF9DTi5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c196aF9DTi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFkYjBlNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfemhfQ04uanMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gamF2YXNjcmlwdCBmb3IgdGhlIGJvb2ttYXJrcyBmcmFtZSAoIHRoZSBvcnlfdG9jX2ZyYW1lIGZyYW1lKQ0KLS8vIHRoaXMgZnJhbWUgY29udGFpbnMgYSBjaGlsZCBpZnJhbWUgKG9yeV90b2MpDQotDQotLy8gbWVzc2FnZXMgdG8gYmUgZXh0ZXJuaXplZA0KLS8vIGhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMNCi12YXIgYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSA9ICLml6Dms5XlnKjlr7zoiKrmoJHop4blm77kuK3mib7liLDmraTpobXpnaLjgIIiOw0KLQ0KLWZ1bmN0aW9uIGRpc3BsYXlUcmVlKHRhYikNCi17DQotCXVybCA9IHRhYi5nZXRBdHRyaWJ1dGUoJ3VybCcpOw0KLQ0KLQlpZiAoIHNlbGVjdGVkVGFiICE9IG51bGwgKQ0KLQl7DQotCQlzZWxlY3RlZFRhYi5jbGFzc05hbWUgPSAidGFiIg0KLQl9DQotCXRhYi5jbGFzc05hbWUgPSAic2VsZWN0ZWRUYWIiDQotCXNlbGVjdGVkVGFiID0gdGFiOw0KLQ0KLQlsb2FkSWZyYW1lKCJvcnlfdG9jIiwgdXJsKTsNCi19DQotDQotZnVuY3Rpb24gbG9hZElmcmFtZShpZnJhbWVOYW1lLCB1cmwpDQotew0KLQlpZiAoIHdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0gKQ0KLQl7DQotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLnRvY19sb2FkZWQgPSBmYWxzZTsNCi0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0ubG9jYXRpb24gPSB1cmw7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQllbHNlIHJldHVybiBmYWxzZTsNCi19DQotDQotZnVuY3Rpb24gc2hvd1BhZ2UoKQ0KLXsNCi0NCi0JcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmxvY2F0aW9uLmhyZWYgPSB1bmVzY2FwZSh0b3BpY1RvRGlzcGxheSk7DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIGZpbmQgYSB0b3BpYyBpbiB0aGUgdHJlZTogdGhlIHRvcGljIGlzIHNldCBpbiB0b3BpY1RvRGlzcGxheQ0KLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzDQotICovDQotZnVuY3Rpb24gZmluZFRvY1RvcGljKCkNCi17DQotCXZhciB0b2Nfd2luZG93ID0gd2luZG93LmZyYW1lc1sib3J5X3RvYyJdOw0KLQ0KLQkvL2FsZXJ0KHRvY193aW5kb3cudG9jX2xvYWRlZCk7DQotCS8vIGNoZWNrIGZvciBmYWxzZSBpcyBub3Qgc2FmZSBzaW5jZSB0aGUgdmFsdWUgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHRoZSBmcmFtZSBpcyBub3QgbG9hZGVkIHlldA0KLQkvL2lmICh0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gZmFsc2UgKQ0KLQlpZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCAhPSB0cnVlICkNCi0Jew0KLQkJLy9pZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSB1bmRlZmluZWQgKQ0KLQkJLy97DQotCQkvLwlhbGVydCgiZ290IGl0ISIpOw0KLQkJLy99DQotCQl3aW5kb3cuc2V0VGltZW91dCgiZmluZFRvY1RvcGljKCkiLCAyMDApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJaWYgKCB0b3BpY1RvRGlzcGxheSA9PSBudWxsICkNCi0JCXsNCi0JCQl0b3BpY1RvRGlzcGxheSA9IHRvY193aW5kb3cuZ2V0Rmlyc3RUb3BpY1VybCgpOw0KLQkJfQ0KLQkNCi0JCXZhciB0b3BpYyA9IHRvcGljVG9EaXNwbGF5Ow0KLQ0KLQkJLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdmlldywgaWYgbm90LCBsb29rIGZvciB0aGUgbmV4dCB2aWV3DQotCQlpZiAoIHRvY193aW5kb3cuc2VsZWN0VG9waWModG9waWMpID09IGZhbHNlICkNCi0JCXsNCi0JCQlpZiAoIGxvYWRpbmdUYWJJbmRleCA8IHZpZXdUYWJzLmxlbmd0aCAtMSApDQotCQkJew0KLQkJCQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXgrK10pOw0KLQkJCQlmaW5kVG9jVG9waWMoKTsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJLy8gZW5kIGZpbmRpbmcgYW5kIGdvdCBub3RoaW5nDQotCQkJCS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQNCi0JCQkJYWxlcnQoYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSk7DQotCQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJCXNob3dQYWdlKCk7DQotCQkJfQ0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJLy8gZmluZCBzdWNjZXNzZnVsLCBkaXNwbGF5IHRoZSB0b3BpYyBwYWdlDQotCQkJc2hvd1BhZ2UoKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0NCi0NCi0vLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB0YWINCi1mdW5jdGlvbiB3aGVyZUFtSSgpDQotew0KLQl2YXIgdXJsID0gcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmRvY3VtZW50LlVSTDsNCi0JDQotCWlmICggdXJsICE9IG51bGwgKQ0KLQl7DQotCQl0b3BpY1RvRGlzcGxheSA9IHVybDsNCi0JCWZpbmRUb2NUb3BpYygpOw0KLQl9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHRvZ1ZpZXdzKCkNCi17DQotCS8vIGlmIGN1cnJlbnRseSB2aXNpYmxlLCBoaWRlIGFsbCBleGNlcHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZA0KLQlpc1ZpZXdzVmlzaWJsZSA9ICghaXNWaWV3c1Zpc2libGUpOw0KLQkNCi0JZm9yICggdmFyIGkgPSAwOyAgaSA8IHZpZXdUYWJzLmxlbmd0aDsgaSsrKQ0KLQl7DQotCQl2YXIgc2hvdyA9IGlzVmlld3NWaXNpYmxlIHx8ICh2aWV3VGFic1tpXSA9PSBzZWxlY3RlZFRhYik7DQotCQlpZiAoIHNob3cgKQ0KLQkJewkJDQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOw0KLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsNCi0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJfQ0KLQl9DQotCQkNCi0JCQ0KLQ0KLX0NCi0NCi0NCi0vLyBkaXNwbGF5IHRoZSBkZWZhdWx0IHBhZ2UgYW5kIG5hdmlnYXRlIHRvIHRoZSBub2RlDQotLy8gaWYgbm8gZGVmYXVsdCBwYWdlIGlzIHNldCwgZGlzcGxheSB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgZmlyc3Qgdmlldw0KLWZ1bmN0aW9uIGluaXQoKQ0KLXsNCi0JbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JdmFyIHRhYnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpOw0KLQl2YXIgdGFiY291bnQgPSAwOw0KLQlmb3IgKHZhciBpPTA7IGk8dGFicy5sZW5ndGg7IGkrKykNCi0Jew0KLQkJaWYgKCB0YWJzW2ldLmdldEF0dHJpYnV0ZSgndXJsJykgIT0gbnVsbCApDQotCQl7CQkJDQotCQkJdmFyIGlzRGVmYXVsdFZpZXcgPSB0YWJzW2ldLmdldEF0dHJpYnV0ZSgnaXNEZWZhdWx0VmlldycpOw0KLQkJCWlmICggaXNEZWZhdWx0VmlldyA9PSAidHJ1ZSIgKQ0KLQkJCXsNCi0JCQkJbG9hZGluZ1RhYkluZGV4ID0gdGFiY291bnQ7DQotCQkJfQ0KLQkJCQ0KLQkJCXZpZXdUYWJzW3RhYmNvdW50KytdID0gdGFic1tpXTsNCi0JCX0NCi0JfQ0KLQ0KLQl0b3BpY1RvRGlzcGxheSA9IHBhcmVudC5nZXRDb29raWUoInJ1cF9vcnlfZG9jIik7DQotCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleF0pOw0KLQlmaW5kVG9jVG9waWMoKTsNCi19DQotDQotDQotdmFyIHNlbGVjdGVkVGFiID0gbnVsbDsNCi12YXIgdmlld1RhYnMgPSBuZXcgQXJyYXkoKTs7DQotdmFyIGxvYWRpbmdUYWJJbmRleCA9IDA7DQotdmFyIHRvcGljVG9EaXNwbGF5ID0gbnVsbDsNCi12YXIgaXNWaWV3c1Zpc2libGUgPSB0cnVlOw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c196aF9UVy5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c196aF9UVy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JlODk5MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfemhfVFcuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gamF2YXNjcmlwdCBmb3IgdGhlIGJvb2ttYXJrcyBmcmFtZSAoIHRoZSBvcnlfdG9jX2ZyYW1lIGZyYW1lKQ0KLS8vIHRoaXMgZnJhbWUgY29udGFpbnMgYSBjaGlsZCBpZnJhbWUgKG9yeV90b2MpDQotDQotLy8gbWVzc2FnZXMgdG8gYmUgZXh0ZXJuaXplZA0KLS8vIGhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMNCi12YXIgYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSA9ICLlnKjlsI7opr3nm67pjITmqLnoppblnJbkuK3mib7kuI3liLDpgJnkuIDpoIHjgIIiOw0KLQ0KLWZ1bmN0aW9uIGRpc3BsYXlUcmVlKHRhYikNCi17DQotCXVybCA9IHRhYi5nZXRBdHRyaWJ1dGUoJ3VybCcpOw0KLQ0KLQlpZiAoIHNlbGVjdGVkVGFiICE9IG51bGwgKQ0KLQl7DQotCQlzZWxlY3RlZFRhYi5jbGFzc05hbWUgPSAidGFiIg0KLQl9DQotCXRhYi5jbGFzc05hbWUgPSAic2VsZWN0ZWRUYWIiDQotCXNlbGVjdGVkVGFiID0gdGFiOw0KLQ0KLQlsb2FkSWZyYW1lKCJvcnlfdG9jIiwgdXJsKTsNCi19DQotDQotZnVuY3Rpb24gbG9hZElmcmFtZShpZnJhbWVOYW1lLCB1cmwpDQotew0KLQlpZiAoIHdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0gKQ0KLQl7DQotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLnRvY19sb2FkZWQgPSBmYWxzZTsNCi0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0ubG9jYXRpb24gPSB1cmw7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQllbHNlIHJldHVybiBmYWxzZTsNCi19DQotDQotZnVuY3Rpb24gc2hvd1BhZ2UoKQ0KLXsNCi0NCi0JcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmxvY2F0aW9uLmhyZWYgPSB1bmVzY2FwZSh0b3BpY1RvRGlzcGxheSk7DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIGZpbmQgYSB0b3BpYyBpbiB0aGUgdHJlZTogdGhlIHRvcGljIGlzIHNldCBpbiB0b3BpY1RvRGlzcGxheQ0KLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzDQotICovDQotZnVuY3Rpb24gZmluZFRvY1RvcGljKCkNCi17DQotCXZhciB0b2Nfd2luZG93ID0gd2luZG93LmZyYW1lc1sib3J5X3RvYyJdOw0KLQ0KLQkvL2FsZXJ0KHRvY193aW5kb3cudG9jX2xvYWRlZCk7DQotCS8vIGNoZWNrIGZvciBmYWxzZSBpcyBub3Qgc2FmZSBzaW5jZSB0aGUgdmFsdWUgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHRoZSBmcmFtZSBpcyBub3QgbG9hZGVkIHlldA0KLQkvL2lmICh0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gZmFsc2UgKQ0KLQlpZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCAhPSB0cnVlICkNCi0Jew0KLQkJLy9pZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSB1bmRlZmluZWQgKQ0KLQkJLy97DQotCQkvLwlhbGVydCgiZ290IGl0ISIpOw0KLQkJLy99DQotCQl3aW5kb3cuc2V0VGltZW91dCgiZmluZFRvY1RvcGljKCkiLCAyMDApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJaWYgKCB0b3BpY1RvRGlzcGxheSA9PSBudWxsICkNCi0JCXsNCi0JCQl0b3BpY1RvRGlzcGxheSA9IHRvY193aW5kb3cuZ2V0Rmlyc3RUb3BpY1VybCgpOw0KLQkJfQ0KLQkNCi0JCXZhciB0b3BpYyA9IHRvcGljVG9EaXNwbGF5Ow0KLQ0KLQkJLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdmlldywgaWYgbm90LCBsb29rIGZvciB0aGUgbmV4dCB2aWV3DQotCQlpZiAoIHRvY193aW5kb3cuc2VsZWN0VG9waWModG9waWMpID09IGZhbHNlICkNCi0JCXsNCi0JCQlpZiAoIGxvYWRpbmdUYWJJbmRleCA8IHZpZXdUYWJzLmxlbmd0aCAtMSApDQotCQkJew0KLQkJCQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXgrK10pOw0KLQkJCQlmaW5kVG9jVG9waWMoKTsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJLy8gZW5kIGZpbmRpbmcgYW5kIGdvdCBub3RoaW5nDQotCQkJCS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQNCi0JCQkJYWxlcnQoYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSk7DQotCQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJCXNob3dQYWdlKCk7DQotCQkJfQ0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJLy8gZmluZCBzdWNjZXNzZnVsLCBkaXNwbGF5IHRoZSB0b3BpYyBwYWdlDQotCQkJc2hvd1BhZ2UoKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0NCi0NCi0vLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB0YWINCi1mdW5jdGlvbiB3aGVyZUFtSSgpDQotew0KLQl2YXIgdXJsID0gcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmRvY3VtZW50LlVSTDsNCi0JDQotCWlmICggdXJsICE9IG51bGwgKQ0KLQl7DQotCQl0b3BpY1RvRGlzcGxheSA9IHVybDsNCi0JCWZpbmRUb2NUb3BpYygpOw0KLQl9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHRvZ1ZpZXdzKCkNCi17DQotCS8vIGlmIGN1cnJlbnRseSB2aXNpYmxlLCBoaWRlIGFsbCBleGNlcHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZA0KLQlpc1ZpZXdzVmlzaWJsZSA9ICghaXNWaWV3c1Zpc2libGUpOw0KLQkNCi0JZm9yICggdmFyIGkgPSAwOyAgaSA8IHZpZXdUYWJzLmxlbmd0aDsgaSsrKQ0KLQl7DQotCQl2YXIgc2hvdyA9IGlzVmlld3NWaXNpYmxlIHx8ICh2aWV3VGFic1tpXSA9PSBzZWxlY3RlZFRhYik7DQotCQlpZiAoIHNob3cgKQ0KLQkJewkJDQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOw0KLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsNCi0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJfQ0KLQl9DQotCQkNCi0JCQ0KLQ0KLX0NCi0NCi0NCi0vLyBkaXNwbGF5IHRoZSBkZWZhdWx0IHBhZ2UgYW5kIG5hdmlnYXRlIHRvIHRoZSBub2RlDQotLy8gaWYgbm8gZGVmYXVsdCBwYWdlIGlzIHNldCwgZGlzcGxheSB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgZmlyc3Qgdmlldw0KLWZ1bmN0aW9uIGluaXQoKQ0KLXsNCi0JbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JdmFyIHRhYnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpOw0KLQl2YXIgdGFiY291bnQgPSAwOw0KLQlmb3IgKHZhciBpPTA7IGk8dGFicy5sZW5ndGg7IGkrKykNCi0Jew0KLQkJaWYgKCB0YWJzW2ldLmdldEF0dHJpYnV0ZSgndXJsJykgIT0gbnVsbCApDQotCQl7CQkJDQotCQkJdmFyIGlzRGVmYXVsdFZpZXcgPSB0YWJzW2ldLmdldEF0dHJpYnV0ZSgnaXNEZWZhdWx0VmlldycpOw0KLQkJCWlmICggaXNEZWZhdWx0VmlldyA9PSAidHJ1ZSIgKQ0KLQkJCXsNCi0JCQkJbG9hZGluZ1RhYkluZGV4ID0gdGFiY291bnQ7DQotCQkJfQ0KLQkJCQ0KLQkJCXZpZXdUYWJzW3RhYmNvdW50KytdID0gdGFic1tpXTsNCi0JCX0NCi0JfQ0KLQ0KLQl0b3BpY1RvRGlzcGxheSA9IHBhcmVudC5nZXRDb29raWUoInJ1cF9vcnlfZG9jIik7DQotCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleF0pOw0KLQlmaW5kVG9jVG9waWMoKTsNCi19DQotDQotDQotdmFyIHNlbGVjdGVkVGFiID0gbnVsbDsNCi12YXIgdmlld1RhYnMgPSBuZXcgQXJyYXkoKTs7DQotdmFyIGxvYWRpbmdUYWJJbmRleCA9IDA7DQotdmFyIHRvcGljVG9EaXNwbGF5ID0gbnVsbDsNCi12YXIgaXNWaWV3c1Zpc2libGUgPSB0cnVlOw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9kZS5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfZGUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTRjYWI4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9kZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy9EVEQgSFRNTCA0LjAxLy9FTiINCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KLTxIVE1MPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLTxtZXRhIG5hbWU9Im1ldGFfdGFnZ2VkIiBjb250ZW50PSJ0cnVlIj4NCi08dGl0bGU+R2xvc3NhciAtIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms8L3RpdGxlPg0KLTwvaGVhZD4NCi08ZnJhbWVzZXQgcm93cz0iMjUsKiI+DQotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X25hdiIgc3JjPSJuYXZpZy5odG0iIHNjcm9sbGluZz0ibm8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSJOYXZpZ2F0aW9uc2JlcmVpY2giPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSJJbmhhbHRzYmVyZWljaCI+DQotPC9mcmFtZXNldD4NCi08L0hUTUw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4X2VzLmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9lcy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MmEyNDIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4X2VzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDL0RURCBIVE1MIDQuMDEvL0VOIg0KLSAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+DQotPEhUTUw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQotPG1ldGEgbmFtZT0ibWV0YV90YWdnZWQiIGNvbnRlbnQ9InRydWUiPg0KLTx0aXRsZT5HbG9zYXJpbyAtIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms8L3RpdGxlPg0KLTwvaGVhZD4NCi08ZnJhbWVzZXQgcm93cz0iMjUsKiI+DQotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X25hdiIgc3JjPSJuYXZpZy5odG0iIHNjcm9sbGluZz0ibm8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSLBcmVhIGRlIG5hdmVnYWNp824iPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSLBcmVhIGRlIGNvbnRlbmlkbyI+DQotPC9mcmFtZXNldD4NCi08L0hUTUw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4X2ZyLmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9mci5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmN2ViNDMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4X2ZyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDL0RURCBIVE1MIDQuMDEvL0VOIg0KLSAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+DQotPEhUTUw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQotPG1ldGEgbmFtZT0ibWV0YV90YWdnZWQiIGNvbnRlbnQ9InRydWUiPg0KLTx0aXRsZT5HbG9zc2FpcmUgLSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrPC90aXRsZT4NCi08L2hlYWQ+DQotPGZyYW1lc2V0IHJvd3M9IjI1LCoiPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9uYXYiIHNyYz0ibmF2aWcuaHRtIiBzY3JvbGxpbmc9Im5vIiBtYXJnaW5oZWlnaHQ9IjIiIG1hcmdpbndpZHRoPSIyIiB0aXRsZT0iWm9uZSBkZSBuYXZpZ2F0aW9uIj4NCi08ZnJhbWUgbmFtZT0iZ2xvc3NhcnlfZG9jIiBzcmM9Ii4uL2dsb3NzYXJ5Lmh0bSIgbWFyZ2luaGVpZ2h0PSIwIiBtYXJnaW53aWR0aD0iMiIgc2Nyb2xsaW5nPSJhdXRvIiB0aXRsZT0iWm9uZSBkZSBjb250ZW51Ij4NCi08L2ZyYW1lc2V0Pg0KLTwvSFRNTD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfaXQuaHRtIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4X2l0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0ZTMyZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfaXQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvRFREIEhUTUwgNC4wMS8vRU4iDQotICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4NCi08SFRNTD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSI+DQotPHRpdGxlPkdsb3NzYXJpbyAtIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms8L3RpdGxlPg0KLTwvaGVhZD4NCi08ZnJhbWVzZXQgcm93cz0iMjUsKiI+DQotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X25hdiIgc3JjPSJuYXZpZy5odG0iIHNjcm9sbGluZz0ibm8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSJBcmVhIGRpIG5hdmlnYXppb25lIj4NCi08ZnJhbWUgbmFtZT0iZ2xvc3NhcnlfZG9jIiBzcmM9Ii4uL2dsb3NzYXJ5Lmh0bSIgbWFyZ2luaGVpZ2h0PSIwIiBtYXJnaW53aWR0aD0iMiIgc2Nyb2xsaW5nPSJhdXRvIiB0aXRsZT0iQXJlYSBjb250ZW51dGkiPg0KLTwvZnJhbWVzZXQ+DQotPC9IVE1MPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9qYS5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfamEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjlmYTliLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9qYS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy9EVEQgSFRNTCA0LjAxLy9FTiINCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KLTxIVE1MPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4NCi08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSI+DQotPHRpdGxlPueUqOiqnumbhiAtIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms8L3RpdGxlPg0KLTwvaGVhZD4NCi08ZnJhbWVzZXQgcm93cz0iMjUsKiI+DQotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X25hdiIgc3JjPSJuYXZpZy5odG0iIHNjcm9sbGluZz0ibm8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSLjg4rjg5PjgrLjg7zjgrfjg6fjg7PpoJjln58iPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSLjgrPjg7Pjg4bjg7Pjg4TpoJjln58iPg0KLTwvZnJhbWVzZXQ+DQotPC9IVE1MPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9rby5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfa28uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmM5NDExLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9rby5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy9EVEQgSFRNTCA0LjAxLy9FTiINCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KLTxIVE1MPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCi08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSI+DQotPHRpdGxlPuyaqeyWtOynkS0gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yazwvdGl0bGU+DQotPC9oZWFkPg0KLTxmcmFtZXNldCByb3dzPSIyNSwqIj4NCi08ZnJhbWUgbmFtZT0iZ2xvc3NhcnlfbmF2IiBzcmM9Im5hdmlnLmh0bSIgc2Nyb2xsaW5nPSJubyIgbWFyZ2luaGVpZ2h0PSIyIiBtYXJnaW53aWR0aD0iMiIgdGl0bGU9Iu2DkOyDiSDsmIHsl60iPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSLsu6jthZDsuKAg7JiB7JetIj4NCi08L2ZyYW1lc2V0Pg0KLTwvSFRNTD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfcHRfQlIuaHRtIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4X3B0X0JSLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1NDhmYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfcHRfQlIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvRFREIEhUTUwgNC4wMS8vRU4iDQotICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4NCi08SFRNTD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSI+DQotPHRpdGxlPkdsb3Nzw6FyaW8gLSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrPC90aXRsZT4NCi08L2hlYWQ+DQotPGZyYW1lc2V0IHJvd3M9IjI1LCoiPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9uYXYiIHNyYz0ibmF2aWcuaHRtIiBzY3JvbGxpbmc9Im5vIiBtYXJnaW5oZWlnaHQ9IjIiIG1hcmdpbndpZHRoPSIyIiB0aXRsZT0iw4FyZWEgZGUgTmF2ZWdhw6fDo28iPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSLDgXJlYSBkZSBDb250ZcO6ZG8iPg0KLTwvZnJhbWVzZXQ+DQotPC9IVE1MPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF96aF9DTi5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfemhfQ04uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjA3MWQwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF96aF9DTi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy9EVEQgSFRNTCA0LjAxLy9FTiINCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KLTxIVE1MPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4NCi08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSI+DQotPHRpdGxlPuivjeaxh+ihqCDvvI0gRWNsaXBzZSDmtYHnqIvmoYbmnrY8L3RpdGxlPg0KLTwvaGVhZD4NCi08ZnJhbWVzZXQgcm93cz0iMjUsKiI+DQotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X25hdiIgc3JjPSJuYXZpZy5odG0iIHNjcm9sbGluZz0ibm8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSLlr7zoiKrljLrln58iPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSLlhoXlrrnljLrln58iPg0KLTwvZnJhbWVzZXQ+DQotPC9IVE1MPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF96aF9UVy5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfemhfVFcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQyMDUzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF96aF9UVy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy9EVEQgSFRNTCA0LjAxLy9FTiINCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KLTxIVE1MPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCi08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSI+DQotPHRpdGxlPuWQjeipnuino+mHiyAtIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms8L3RpdGxlPg0KLTwvaGVhZD4NCi08ZnJhbWVzZXQgcm93cz0iMjUsKiI+DQotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X25hdiIgc3JjPSJuYXZpZy5odG0iIHNjcm9sbGluZz0ibm8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSLlsI7opr3ljYAiPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSLlhaflrrnljYAiPg0KLTwvZnJhbWVzZXQ+DQotPC9IVE1MPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfZGUuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X2RlLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTk5NTE1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfZGUuanMKKysrIC9kZXYvbnVsbApAQCAtMSw3ODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gbWVzc2FnZXMgdG8gYmUgZXh0ZXJuaXplZA0KLS8vIGhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMNCi0NCi12YXIgdG9wbmF2X2pzX01FU1NBR0UxID0gIkRlciBCYXVtc3RydWt0dXJicm93c2VyIGlzdCBub2NoIG5pY2h0IGdlbGFkZW4hXG5CaXR0ZSB3YXJ0ZW4hIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0UyID0gIkVzIGlzdCBrZWluZSBTZWl0ZSAnezB9JyBmw7xyIGRpZXNlIFNlaXRlIHZvcmhhbmRlbi5cblZlcndlbmRlbiBTaWUgZWluZSBkZXIgYW5kZXJlbiBOYXZpZ2F0aW9uc3NjaGFsdGZsw6RjaGVuLiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMyA9ICJFcyBpc3Qga2VpbmUgU2VpdGUgezB9IHZvcmhhbmRlbiEiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9wcmV2ID0gInp1csO8Y2siOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9uZXh0ID0gIndlaXRlciI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3VwID0gIm5hY2ggb2JlbiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNCA9ICJEaWUgYWt0dWVsbGUgRGF0ZWkgaXN0IG5pY2h0IGltIEJhdW1zdHJ1a3R1cmJyb3dzZXIgZW50aGFsdGVuLiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNSA9ICJEaWUgdmVyw7ZmZmVudGxpY2hlIFNpdGUgd2lyZCBiZXJlaXRzIG1pdCBSYWhtZW4gYW5nZXplaWd0LiI7DQotDQotZnVuY3Rpb24gZm9ybWF0U3RyaW5nKG1lc3NhZ2UsIHJlcGxhY2UwKQ0KLXsNCi0gICAJcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgvXHswXH0vLCByZXBsYWNlMCk7DQotfSANCi0NCi0vLyB0aGlzIHNjcmlwdCBpcyBmb3IgdGhlIHRvcG5hdi5odG1sDQotLy8gdGhpcyBpcyBOT1QgZm9yIGdlbmVyYWwgdXNlDQotTVNGUGhvdmVyID0NCi0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8DQotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsNCi0NCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykNCi0gIHsNCi0gICAgIHZhciBhPW5ldyBJbWFnZSgpOw0KLSAgICAgYS5zcmM9aW1nOw0KLSAgICAgcmV0dXJuIGE7DQotICB9DQotICANCi12YXIgdG91ciA9IDA7DQotDQotZnVuY3Rpb24gb3BlbkZpcnN0VG91ciAoKQ0KLS8vIG9wZW4gdGhlIGd1aWRlZCB0b3VyIC9oYWFrYW4gOTkwMzI0DQotew0KLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpDQotICAgIHsNCi0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5Ub3VyICgpDQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQNCi17DQotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHRvdXIgPSBvcGVuKCIuL3RvdXIvdG91ci5odG0iLCJ0b3VyX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MzUwLGhlaWdodD03MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotLy9BZGRpdGlvbiBieSBDaGluaCBWbyAwMy8yOC8wMA0KLSBmdW5jdGlvbiBkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKQ0KLSB7DQotIAl2YXIgcGFnZVBhdHRlcm4gPSAvb3Z1X3Byb2MvOw0KLSAJdmFyIG1haW5QYWdlID0gd2luZG93LnBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQ0KLSAJaWYgKCBwYWdlUGF0dGVybi50ZXN0KCBtYWluUGFnZSApICkgew0KLSAgICAJaWYgKGdldENvb2tpZSgiUlVQIikgIT0gImNoZWNrZWQiKSB7IG9wZW5GaXJzdFRvdXIoKTsgfQ0KLQl9DQotCWVsc2Ugew0KLQkJc2V0VGltZW91dCggImRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpIiwgMTAwMCApOw0KLQl9DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldENvb2tpZSAobmFtZSkNCi17DQotICB2YXIgZGNvb2tpZSA9IGRvY3VtZW50LmNvb2tpZTsNCi0gIHZhciBjbmFtZSA9IG5hbWUgKyAiPSI7DQotICB2YXIgY2xlbiA9IGRjb29raWUubGVuZ3RoOw0KLSAgdmFyIGNiZWdpbiA9IDA7DQotICB3aGlsZSAoY2JlZ2luIDwgY2xlbikNCi0gIHsNCi0gICAgdmFyIHZiZWdpbiA9IGNiZWdpbiArIGNuYW1lLmxlbmd0aDsNCi0gICAgaWYgKGRjb29raWUuc3Vic3RyaW5nKGNiZWdpbiwgdmJlZ2luKSA9PSBjbmFtZSkNCi0gICAgew0KLSAgICAgIHZhciB2ZW5kID0gZGNvb2tpZS5pbmRleE9mICgiOyIsIHZiZWdpbik7DQotICAgICAgaWYgKHZlbmQgPT0gLTEpDQotICAgICAgew0KLSAgICAgICAgdmVuZCA9IGNsZW47DQotICAgICAgfQ0KLSAgICAgIHJldHVybiB1bmVzY2FwZShkY29va2llLnN1YnN0cmluZyh2YmVnaW4sIHZlbmQpKTsNCi0gICAgfQ0KLSAgICBjYmVnaW4gPSBkY29va2llLmluZGV4T2YoIiAiLCBjYmVnaW4pICsgMTsNCi0gICAgaWYgKGNiZWdpbiA9PSAwKQ0KLSAgICB7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiBudWxsOw0KLSB9DQotDQotDQotICB2YXIgaW5kZXg9bnVsbDsNCi0gIHZhciB0b3VyPW51bGw7DQotICB2YXIgc2VhcmNoPW51bGw7DQotICB2YXIgZ2xvc3Nhcnk9bnVsbDsNCi0gIHZhciBmZWVkYmFjaz1udWxsOw0KLSAgdmFyIHRyZWVMb2FkZWQ9ZmFsc2U7DQotICBmdW5jdGlvbiBjaGVja1RyZWVMb2FkZWQoKQ0KLSAgew0KLSAgICBpZih0cmVlTG9hZGVkKQ0KLSAgICB7DQotICAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsDQotICAgICAgICAmJiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeSgpKQ0KLSAgICAgew0KLSAgICAgICB0cmVlTG9hZGVkID0gdHJ1ZTsNCi0gICAgIH0NCi0gICAgICovDQotICAgICBpZihwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQgIT0gbnVsbCkNCi0gICAgIHsNCi0gICAgICAJdmFyIG1ldGhvZCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeTsNCi0JIGlmIChtZXRob2QgIT0gInVuZGVmaW5lZCIpIHsNCi0JCWlmIChwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeSgpKQ0KLQkJew0KLSAgICAgICAJCQl0cmVlTG9hZGVkID0gdHJ1ZTsNCi0JCX0NCi0NCi0JICB9DQotDQotICAgICB9DQotDQotICAgICByZXR1cm4gdHJlZUxvYWRlZDsNCi0gICB9DQotDQotDQotICAgIGZ1bmN0aW9uIHNob3dBbGVydE5vdExvYWRlZCgpDQotICAgIHsNCi0gICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTEpOw0KLSAgICB9DQotDQotZnVuY3Rpb24gc2hvd1N0YXR1c05vdExvYWRlZCgpDQotICB7DQotICAgIC8vcmV0dXJuICJUaGUgVHJlZUJyb3dzZSBpcyBub3QgeWV0IGxvYWRlZCFcblBsZWFzZSB3YWl0ISI7DQotICAgIHJldHVybiB0b3BuYXZfanNfTUVTU0FHRTE7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93QWxlcnROb1BhZ2UodGV4dCkNCi0gIHsNCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYocGFyZW50TGFiZWwhPSIiICYmIHBhcmVudExhYmVsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMuIik7DQotICAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMiKTsNCi0gICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7DQotICAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93U3RhdHVzTm9QYWdlKHRleHQpDQotICB7DQotDQotICAgICB2YXIgcGFyZW50TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBtc2c7DQotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpDQotICAgICB7DQotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOw0KLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOw0KLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7DQotICAgICB9DQotDQotICAgICByZXR1cm4gbXNnOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1BhcmVudExhYmVsKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgcGFyZW50dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHBhcmVudHVybCE9IiIgJiYgcGFyZW50dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInVwIik7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd0hvbWVMYWJlbCgpDQotICB7DQotICAgIHNlbGYuc3RhdHVzID0gIkhvbWUiOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1ByZXZpb3VzTGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIHByZXZ1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwcmV2dXJsIT0iIiAmJiBwcmV2dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJwcmV2aW91cyIpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dOZXh0TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgbmV4dHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIG5leHR1cmwhPSIiICYmIG5leHR1cmwhPW51bGwpDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgICB9DQotICAgICAgZWxzZQ0KLSAgICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb1BhZ2UoIm5leHQiKTsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZFByZXZpb3VzKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJQcmV2aW91cyIpOw0KLQl9DQotCSAgICAgIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9wcmV2KTsNCi0gICAgIH0NCi0gICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZE5leHQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJOZXh0Iik7DQotCX0NCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLQ0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX25leHQpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUGFyZW50KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfdXApOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0JdmFyIHN0YXR1cyA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgIAlpZiggc3RhdHVzID09IGZhbHNlICkNCi0Jew0KLQkJYWxlcnQoIHRvcG5hdl9qc19NRVNTQUdFNCApOw0KLQl9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHVwQXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS51cEFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGRvd25BcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmRvd25BcnJvdygpOw0KLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgfQ0KLQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICAgIGZ1bmN0aW9uIGxlZnRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUubGVmdEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gcmlnaHRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUucmlnaHRBcnJvdygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotDQotZnVuY3Rpb24gbG9hZFRvcCgpDQotew0KLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIpDQotICB7DQotICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTUpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7DQotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7DQotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsNCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7DQotDQotICAgIHZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOw0KLQ0KLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkNCi0gICAgew0KLSAgICAgICBpZihkb2N1bWVudC5saW5rc1tpXS5ocmVmLmluZGV4T2YoImluZGV4Lmh0bSIpIT0tMSkNCi0gICAgICAgew0KLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IGRvY3VtZW50LmxpbmtzW2ldLmhyZWY7DQotICAgICAgICAgYnJlYWs7DQotICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7DQotCX0NCi0gICAgfQ0KLSAgIH0NCi19DQotDQotDQotZnVuY3Rpb24gb3Blbk9yeSAocGFnZSwgdGFyZ2V0KQ0KLXsNCi0gICAgaWYoIWluZGV4IHx8IGluZGV4LmNsb3NlZCkNCi0gICAgew0KLSAgICAgIGluZGV4ID0gb3BlbihwYWdlLHRhcmdldCwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM5NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBpbmRleC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5TZWFyY2goKQ0KLXsNCi0gICAgaWYoIXNlYXJjaCB8fCBzZWFyY2guY2xvc2VkKQ0KLSAgICB7DQotICAgICAgc2VhcmNoID0gb3BlbigiLi9hcHBsZXQvc2VhcmNoLmh0bSIsInNlYXJjaF9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9bm8sd2lkdGg9NjMwLGhlaWdodD00NTAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNlYXJjaC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5JbmRleCgpDQotew0KLSAgIG9wZW5PcnkoIi4vaW5kZXgvaW5kZXguaHRtIiwiaW5kZXhfd2luIik7DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5HbG9zc2FyeSgpDQotew0KLSBpZighZ2xvc3NhcnkgfHwgZ2xvc3NhcnkuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgZ2xvc3NhcnkgPSBvcGVuKCIuL3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXguaHRtIiwiZ2xvc3Nhcnlfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM4NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBnbG9zc2FyeS5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIHByaW50UGFnZSgpDQotew0KLSBwYXJlbnQub3J5X2RvYy5mb2N1cygpOw0KLSBwYXJlbnQub3J5X2RvYy5wcmludCgpOw0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kRmVlZGJhY2sodXJsKQ0KLXsNCi0JaWYgKCB1cmwgPT0gbnVsbCB8fCB1cmwgPT0gJycgKQ0KLQl7DQotCQlyZXR1cm47DQotCX0NCi0JDQotCWlmICggdXJsLmluZGV4T2YoIm1haWx0bzoiKSA+PSAwICkNCi0Jew0KLQkJc2VuZG1haWwodXJsKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCQ0KLSAJICAgIGlmKCFmZWVkYmFjayB8fCBmZWVkYmFjay5jbG9zZWQpDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrID0gb3Blbih1cmwsImZlZWRiYWNrX3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD02MDAsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotCSAgICB9DQotCSAgICBlbHNlDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrLmZvY3VzKCk7DQotCSAgICB9DQotICAgIAl9DQotICAgIAkNCi19DQotDQotDQotZnVuY3Rpb24gc2VuZG1haWwodXJsKQ0KLXsNCi0JaWYgKCB1cmwuaW5kZXhPZigiP3N1YmplY3QiKSA9PSAtMSApDQotCXsNCi0JCXZhciBsaW5rPXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQkJdXJsID0gdXJsICsgJz9zdWJqZWN0PUZlZWRiYWNrOiAtICcrbGluazsNCi0JfQ0KLQlsb2NhdGlvbi5yZXBsYWNlKHVybCk7DQotfQ0KLQ0KLS8vY2FsY3VsYXRlcyByZWxhdGl2ZSBwYXRoDQotLy9wYXRoIG11c3QgYmUgYWxsIHJlbGF0aXZlIGZyb20gd2Vic2l0ZSBiYXNlIG9yIGNvbnRhaW4gZnVsbCB1cmxzDQotZnVuY3Rpb24gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHNvdXJjZVBhdGgsIHRhcmdldFBhdGgpDQotew0KLQlpZiAodGFyZ2V0UGF0aC5pbmRleE9mKCJodHRwOi8iKSAhPSAtMSkNCi0Jew0KLQkJcmV0dXJuIHRhcmdldFBhdGg7DQotCX0NCi0NCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0Jc291cmNlUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0JdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXFwvZywiLyIpOw0KLQ0KLQkvL2FsZXJ0KCJSZXBsYWNlKFNvdXJjZSk9PiIgKyBzb3VyY2VQYXRoKTsNCi0JLy9hbGVydCgiUmVwbGFjZSh0YXJnZXQpPT4iICsgdGFyZ2V0UGF0aCk7DQotDQotDQotCXNvdXJjZUFycmF5ID0gc291cmNlUGF0aC5zcGxpdCgiLyIpOw0KLQl0YXJnZXRBcnJheSA9IHRhcmdldFBhdGguc3BsaXQoIi8iKTsNCi0NCi0JdmFyIHRoZVJlbFBhdGggPSAiIjsNCi0NCi0JLy9sb29wIHVudGlsIHdlIGZpbmQgYSBkaWZmZXJlbmNlDQotCXZhciBpZHggPSAwOw0KLQlmb3IoaWR4ID0gMDsgaWR4IDwgc291cmNlQXJyYXkubGVuZ3RoOyBpZHgrKykNCi0Jew0KLQkJaWYgKGlkeCA+IHRhcmdldFBhdGgubGVuZ3RoKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQ0KLQkJaWYgKHNvdXJjZUFycmF5W2lkeF0gIT0gdGFyZ2V0QXJyYXlbaWR4XSkNCi0JCXsNCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQ0KLQkvL2FwcGVuZCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIC4vDQotCXZhciBtYXhJZHggPSBzb3VyY2VBcnJheS5sZW5ndGggLSAxOw0KLQlmb3IgKHZhciBpID0gaWR4OyBpIDwgbWF4SWR4OyBpKyspDQotCXsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgIi4vIjsNCi0NCi0JCS8vYWxlcnQoIlJlbFBhdGg9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FwcGVuZCBhbnkgcmVtYWluaW5nIHRhcmdldCBwYXRoDQotCXdoaWxlKGlkeCA8IHRhcmdldEFycmF5Lmxlbmd0aCkNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyB0YXJnZXRBcnJheVtpZHgrK10gKyAiLyI7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKGZpbmFsKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vcmVtb3ZlIHRoZSBsYXN0IHBhdGggc2VwYXJhdG9yDQotCWlmICh0aGVSZWxQYXRoLmxlbmd0aCA+IDApDQotCXsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aC5zdWJzdHJpbmcoMCwgKHRoZVJlbFBhdGgubGVuZ3RoIC0gMSkpOw0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJSZXR1cm4gUmVsYXRpdmUgUGF0aCA9PiAiICsgdGhlUmVsUGF0aCk7DQotDQotCXJldHVybiB0aGVSZWxQYXRoOw0KLX0NCi0NCi1mdW5jdGlvbiBnZXRUcmVlUGF0aCgpDQotew0KLQlyZXR1cm4gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCk7DQotfQ0KLQ0KLS8vVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgdGhlIHdlYnNpdGUgYmFzZSBmcm9tIHRoZSB1cmwNCi1mdW5jdGlvbiBjYWxjdWxhdEN1cnJlbnRQYWdlKGN1cnJVUkwpIHsNCi0NCi0JdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCS8vcmVwbGFjZSBhbGwgJ1wnIHdpdGggJy8nDQotCXRoZUN1cnJlbnRMb2NhdGlvbiA9IHRoZUN1cnJlbnRMb2NhdGlvbi5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQljdXJyVVJMID0gY3VyclVSTC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQ0KLQl2YXIgc291cmNlQXJyYXkgPSB0aGVDdXJyZW50TG9jYXRpb24uc3BsaXQoIi8iKTsNCi0JdmFyIGN1cnJBcnJheSA9IGN1cnJVUkwuc3BsaXQoIi8iKTsNCi0NCi0JdmFyIG51bVRvUmVtb3ZlID0gc291cmNlQXJyYXkubGVuZ3RoIC0gMjsNCi0JdmFyIGlkeCA9IDA7DQotCXZhciB0aGVSZXR1cm5QYXRoID0gIiI7DQotCWZvciAoaWR4ID0gbnVtVG9SZW1vdmU7IGlkeCA8IGN1cnJBcnJheS5sZW5ndGg7IGlkeCsrKSB7DQotCQlpZiAodGhlUmV0dXJuUGF0aCAhPSAiIikgew0KLQkJCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgIi8iOw0KLQkJfQ0KLQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyBjdXJyQXJyYXlbaWR4XTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJBcnJheVRlc3Q9PiIgKyBjdXJyVVJMICsgIiwiICsgdGhlUmV0dXJuUGF0aCk7DQotCXJldHVybiB0aGVSZXR1cm5QYXRoOw0KLX0NCi0NCi0vL2J1aWxkcyB0cmVlIHBhdGgNCi1mdW5jdGlvbiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKQ0KLXsNCi0JdmFyIHRoZURlbGltaXRlciA9ICIjIyoiOw0KLQl2YXIgdGhpc1BhZ2UgPSAiYXBwbGV0L3J1cF90b3BuYXYuaHRtIjsNCi0JdmFyIHRoZUxvYyA9ICIiOw0KLQ0KLQ0KLQ0KLQlpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0Jew0KLQkJdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCQl0aGlzUGFnZSA9IGNhbGN1bGF0Q3VycmVudFBhZ2UodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlBhdGhOYW1lOiIgKyB0aGlzUGFnZSk7DQotDQotCQkvL2FsZXJ0KCJUcnlpbmcgdG8gZmluZCB0aGUgcGF0aCBmb3IgPT4iICsgdGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCXZhciB0aGVQYXRoID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmdldFRyZWVQYXRoQXJyYXkodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlRoZSBUcmVlIFBhdGg6ICIgKyB0aGVQYXRoKTsNCi0NCi0JCXRoZVBhdGhTdHJpbmcgPSB0aGVQYXRoICsgIiI7DQotICAgIAkJYXJyYXlGcm9tU3RyaW5nID0gdGhlUGF0aFN0cmluZy5zcGxpdCh0aGVEZWxpbWl0ZXIpOw0KLQ0KLQkJLy9idWlsZCB0aGUgcGF0aCBmcm9tIHRoZSBhcnJheQ0KLQkJLy9wYXJhbSAxID0gcGF0aCB0byBpY29uLCBwYXJhbSAyIC0gbGFiZWwsIHBhcmFtIDMgLSBwYXRoIHRvIGZpbGUNCi0JCXZhciBjb3VudGVyID0gMDsNCi0JCXZhciB0aGVMYWJlbDsNCi0JCXZhciB0aGVSZWxQYXRoOw0KLQkJaWYgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggPiAyKQ0KLQkJew0KLQkJICAgdGhlTG9jID0gIiI7DQotCQkgICBmb3IodmFyIGkgPSAwOyBpIDwgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggLSAxKSA7IGkrKykNCi0JCSAgIHsNCi0JCQkvL2l0J3MgdGhlIGljb24gcGF0aA0KLQkJCWlmIChjb3VudGVyIDwgMikNCi0JCQl7DQotCQkJCWlmIChjb3VudGVyID4gMCkNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsgIiAmZ3Q7ICI7DQotCQkJCX0NCi0NCi0JCQkJLy9hbGVydCgiQ2FsY3VsYXRpbmcgcGF0aCBmcm9tKDEpICIgKyB0aGlzUGFnZSArICIgPT4gIiArIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotDQotCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiXFwiKSA9PSAtMSAmJiBhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiLyIpID09IC0xKQ0KLQkJCQl7DQotCQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJCXsNCi0JCQkJCQl0aGVSZWxQYXRoID0gImFwcGxldC9pbWFnZXMvIiArIGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCB0aGVSZWxQYXRoKTsNCi0JCQkJCX0NCi0JCQkJCS8vYWxlcnQoIk1vZGlmeWluZyBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCX0NCi0NCi0JCQkJaWYgKHRoZVJlbFBhdGggIT0gIm51bGwiKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJCSAiPGltZyBib3JkZXI9MCBzcmM9XCIiICsNCi0JCQkJCQkgdGhlUmVsUGF0aCAgKw0KLQkJCQkJCSAiXCI+IjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDI7DQotCQkJfQ0KLQkJCS8vIGl0J3MgdGhlIGxhYmVsDQotCQkJZWxzZSBpZiAoY291bnRlciA9PSAyKQ0KLQkJCXsNCi0JCQkJdGhlTGFiZWwgPSBhcnJheUZyb21TdHJpbmdbaV07DQotCQkJCWNvdW50ZXIgPSAzOw0KLQkJCX0NCi0JCQllbHNlIGlmIChjb3VudGVyID09IDMpDQotCQkJew0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMykgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCQlpZiAodGhlUmVsUGF0aCAhPSAiIikgew0KLQkJCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCIgdGFyZ2V0PVwib3J5X2RvY1wiIGhyZWY9XCIiICsNCi0JCQkJCQkJIHRoZVJlbFBhdGggKw0KLQkJCQkJIAkJIlwiPiIgKw0KLQkJCQkJIAkJdGhlTGFiZWwgKw0KLQkJCQkJIAkJIjxcL2E+XG4iOw0KLQkJCQkJIH0NCi0JCQkJCSBlbHNlIHsNCi0JCQkJCSAJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIj4iICArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQl9DQotCQkJCWVsc2UNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJdGhlTGFiZWwgKw0KLQkJCQkJIAkiPFwvYT5cbiI7DQotCQkJCX0NCi0JCQkJLy9hbGVydCgidGhlIGN1cnIgcGF0aD0+IiArIHRoZUxvYyk7DQotCQkJCWNvdW50ZXIgPSAxOw0KLQkJCQl0aGVSZWxQYXRoID0gIm51bGwiOw0KLQkJCQl0aGVMYWJlbCA9ICJudWxsIjsNCi0JCQl9DQotCQkgICB9DQotDQotCQkvL2FsZXJ0KCJGaW5pc2hlZCBCdWlsZGluZyA9PiAiICsgdGhlTG9jKTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQkvL3RoZUxvYyA9ICJDdXJyZW50IExvY2F0aW9uJm5ic3A7JiMwNDU7Jm5ic3A7IiArIHRoZUxvYzsNCi0NCi0JLy9hbGVydCgidGhlIEZpbmFsIFN0cmluZz0+IiArIHRoZUxvYyk7DQotDQotCS8vZG9jdW1lbnQud3JpdGUodGhlTG9jKTsNCi0JcmV0dXJuIHRoZUxvYzsNCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9lcy5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfZXMuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZTdkMGUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9lcy5qcworKysgL2Rldi9udWxsCkBAIC0xLDc4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkDQotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLQ0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTEgPSAiRWwgw6FyYm9sIGRlIG5hdmVnYWNpw7NuIHRvZGF2w61hIG5vIHNlIGhhIGNhcmdhZG8uXG5Fc3BlcmUuIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0UyID0gIk5vIGhheSBuaW5ndW5hIHDDoWdpbmEgJ3swfScgcGFyYSBlc3RhIHDDoWdpbmEuXG5QcnVlYmUgb3RybyBib3TDs24gZGUgbmF2ZWdhY2nDs24uIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0UzID0gIk5vIGhheSBuaW5ndW5hIHDDoWdpbmEgezB9LiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3ByZXYgPSAiYW50ZXJpb3IiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9uZXh0ID0gInNpZ3VpZW50ZSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3VwID0gImFycmliYSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNCA9ICJFbCBhcmNoaXZvIGFjdHVhbCBubyBzZSBlbmN1ZW50cmEgZW4gZWwgw6FyYm9sIGRlIG5hdmVnYWNpw7NuLiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNSA9ICJFbCBzaXRpbyBwdWJsaWNhZG8geWEgc2UgbXVlc3RyYSBjb24gbWFyY29zIjsNCi0NCi1mdW5jdGlvbiBmb3JtYXRTdHJpbmcobWVzc2FnZSwgcmVwbGFjZTApDQotew0KLSAgIAlyZXR1cm4gbWVzc2FnZS5yZXBsYWNlKC9cezBcfS8sIHJlcGxhY2UwKTsNCi19IA0KLQ0KLS8vIHRoaXMgc2NyaXB0IGlzIGZvciB0aGUgdG9wbmF2Lmh0bWwNCi0vLyB0aGlzIGlzIE5PVCBmb3IgZ2VuZXJhbCB1c2UNCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0gIA0KLXZhciB0b3VyID0gMDsNCi0NCi1mdW5jdGlvbiBvcGVuRmlyc3RUb3VyICgpDQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQNCi17DQotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHRvdXIgPSBvcGVuKCIuL3RvdXIvdG91ci5odG0iLCJ0b3VyX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MzUwLGhlaWdodD03MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlblRvdXIgKCkNCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNA0KLXsNCi1pZighdG91ciB8fCB0b3VyPT1udWxsIHx8IHRvdXIuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi0vL0FkZGl0aW9uIGJ5IENoaW5oIFZvIDAzLzI4LzAwDQotIGZ1bmN0aW9uIGRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpDQotIHsNCi0gCXZhciBwYWdlUGF0dGVybiA9IC9vdnVfcHJvYy87DQotIAl2YXIgbWFpblBhZ2UgPSB3aW5kb3cucGFyZW50Lm9yeV9kb2MubG9jYXRpb247DQotDQotIAlpZiAoIHBhZ2VQYXR0ZXJuLnRlc3QoIG1haW5QYWdlICkgKSB7DQotICAgIAlpZiAoZ2V0Q29va2llKCJSVVAiKSAhPSAiY2hlY2tlZCIpIHsgb3BlbkZpcnN0VG91cigpOyB9DQotCX0NCi0JZWxzZSB7DQotCQlzZXRUaW1lb3V0KCAiZGlzcGxheUdldHRpbmdTdGFydGVkKCkiLCAxMDAwICk7DQotCX0NCi19DQotDQotZnVuY3Rpb24gZ2V0Q29va2llIChuYW1lKQ0KLXsNCi0gIHZhciBkY29va2llID0gZG9jdW1lbnQuY29va2llOw0KLSAgdmFyIGNuYW1lID0gbmFtZSArICI9IjsNCi0gIHZhciBjbGVuID0gZGNvb2tpZS5sZW5ndGg7DQotICB2YXIgY2JlZ2luID0gMDsNCi0gIHdoaWxlIChjYmVnaW4gPCBjbGVuKQ0KLSAgew0KLSAgICB2YXIgdmJlZ2luID0gY2JlZ2luICsgY25hbWUubGVuZ3RoOw0KLSAgICBpZiAoZGNvb2tpZS5zdWJzdHJpbmcoY2JlZ2luLCB2YmVnaW4pID09IGNuYW1lKQ0KLSAgICB7DQotICAgICAgdmFyIHZlbmQgPSBkY29va2llLmluZGV4T2YgKCI7IiwgdmJlZ2luKTsNCi0gICAgICBpZiAodmVuZCA9PSAtMSkNCi0gICAgICB7DQotICAgICAgICB2ZW5kID0gY2xlbjsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHVuZXNjYXBlKGRjb29raWUuc3Vic3RyaW5nKHZiZWdpbiwgdmVuZCkpOw0KLSAgICB9DQotICAgIGNiZWdpbiA9IGRjb29raWUuaW5kZXhPZigiICIsIGNiZWdpbikgKyAxOw0KLSAgICBpZiAoY2JlZ2luID09IDApDQotICAgIHsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIG51bGw7DQotIH0NCi0NCi0NCi0gIHZhciBpbmRleD1udWxsOw0KLSAgdmFyIHRvdXI9bnVsbDsNCi0gIHZhciBzZWFyY2g9bnVsbDsNCi0gIHZhciBnbG9zc2FyeT1udWxsOw0KLSAgdmFyIGZlZWRiYWNrPW51bGw7DQotICB2YXIgdHJlZUxvYWRlZD1mYWxzZTsNCi0gIGZ1bmN0aW9uIGNoZWNrVHJlZUxvYWRlZCgpDQotICB7DQotICAgIGlmKHRyZWVMb2FkZWQpDQotICAgIHsNCi0gICAgICByZXR1cm4gdHJlZUxvYWRlZDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgaWYocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0ICE9IG51bGwNCi0gICAgICAgICYmIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpDQotICAgICB7DQotICAgICAgIHRyZWVMb2FkZWQgPSB0cnVlOw0KLSAgICAgfQ0KLSAgICAgKi8NCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsKQ0KLSAgICAgew0KLSAgICAgIAl2YXIgbWV0aG9kID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5Ow0KLQkgaWYgKG1ldGhvZCAhPSAidW5kZWZpbmVkIikgew0KLQkJaWYgKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpDQotCQl7DQotICAgICAgIAkJCXRyZWVMb2FkZWQgPSB0cnVlOw0KLQkJfQ0KLQ0KLQkgIH0NCi0NCi0gICAgIH0NCi0NCi0gICAgIHJldHVybiB0cmVlTG9hZGVkOw0KLSAgIH0NCi0NCi0NCi0gICAgZnVuY3Rpb24gc2hvd0FsZXJ0Tm90TG9hZGVkKCkNCi0gICAgew0KLSAgICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFMSk7DQotICAgIH0NCi0NCi1mdW5jdGlvbiBzaG93U3RhdHVzTm90TG9hZGVkKCkNCi0gIHsNCi0gICAgLy9yZXR1cm4gIlRoZSBUcmVlQnJvd3NlIGlzIG5vdCB5ZXQgbG9hZGVkIVxuUGxlYXNlIHdhaXQhIjsNCi0gICAgcmV0dXJuIHRvcG5hdl9qc19NRVNTQUdFMTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dBbGVydE5vUGFnZSh0ZXh0KQ0KLSAgew0KLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpDQotICAgICB7DQotICAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucy4iKTsNCi0gICAgICAgICAgYWxlcnQoZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMiwgdGV4dCkpOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucyIpOw0KLSAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsNCi0gICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dTdGF0dXNOb1BhZ2UodGV4dCkNCi0gIHsNCi0NCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG1zZzsNCi0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7DQotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7DQotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsNCi0gICAgIH0NCi0NCi0gICAgIHJldHVybiBtc2c7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93UGFyZW50TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBwYXJlbnR1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotDQotICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgcGFyZW50dXJsIT0iIiAmJiBwYXJlbnR1cmwhPW51bGwpDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vUGFnZSgidXAiKTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93SG9tZUxhYmVsKCkNCi0gIHsNCi0gICAgc2VsZi5zdGF0dXMgPSAiSW5pY2lvIjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dQcmV2aW91c0xhYmVsKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBwcmV2dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzVXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotDQotICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgcHJldnVybCE9IiIgJiYgcHJldnVybCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vUGFnZSgicHJldmlvdXMiKTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93TmV4dExhYmVsKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIG5leHR1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBuZXh0dXJsIT0iIiAmJiBuZXh0dXJsIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICAgfQ0KLSAgICAgIGVsc2UNCi0gICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9ICBzaG93U3RhdHVzTm9QYWdlKCJuZXh0Iik7DQotICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9ICBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGxvYWRQcmV2aW91cygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICB2YXIgbmV3TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzVXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotDQotICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICB7DQotDQotCWlmICgobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0Iik9PS0xKSAmJiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3Iik9PS0xKSkNCi0Jew0KLQkJcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKSE9LTEpDQotCXsNCi0JIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0QXBwbGV0UGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwpOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpIT0tMSkNCi0Jew0KLQkJbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0SHR0cFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsLCAiUHJldmlvdXMiKTsNCi0JfQ0KLQkgICAgICAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfcHJldik7DQotICAgICB9DQotICAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGxvYWROZXh0KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICB7DQotDQotCWlmICgobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0Iik9PS0xKSAmJiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3Iik9PS0xKSkNCi0Jew0KLQkJcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKSE9LTEpDQotCXsNCi0JIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0QXBwbGV0UGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwpOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpIT0tMSkNCi0Jew0KLQkJbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0SHR0cFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsLCAiTmV4dCIpOw0KLQl9DQotICAgICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsNCi0NCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9uZXh0KTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZFBhcmVudCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX3VwKTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi1mdW5jdGlvbiB3aGVyZUFtSSgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotCXZhciBzdGF0dXMgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAJaWYoIHN0YXR1cyA9PSBmYWxzZSApDQotCXsNCi0JCWFsZXJ0KCB0b3BuYXZfanNfTUVTU0FHRTQgKTsNCi0JfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiB1cEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUudXBBcnJvdygpOw0KLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBkb3duQXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5kb3duQXJyb3coKTsNCi0gICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgIH0NCi0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgICBmdW5jdGlvbiBsZWZ0QXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmxlZnRBcnJvdygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICAgIGZ1bmN0aW9uIHJpZ2h0QXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnJpZ2h0QXJyb3coKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLQ0KLWZ1bmN0aW9uIGxvYWRUb3AoKQ0KLXsNCi0gIGlmKHBhcmVudC5mcmFtZXMubGVuZ3RoIT0wICYmIHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2MiKQ0KLSAgew0KLSAgICAgYWxlcnQodG9wbmF2X2pzX01FU1NBR0U1KTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOw0KLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArDQotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOw0KLQ0KLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsNCi0NCi0gICAgZm9yKGk9ZG9jdW1lbnQubGlua3MubGVuZ3RoLTE7aT49MDtpLS0pDQotICAgIHsNCi0gICAgICAgaWYoZG9jdW1lbnQubGlua3NbaV0uaHJlZi5pbmRleE9mKCJpbmRleC5odG0iKSE9LTEpDQotICAgICAgIHsNCi0gICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBkb2N1bWVudC5saW5rc1tpXS5ocmVmOw0KLSAgICAgICAgIGJyZWFrOw0KLSAgICAgICB9DQotICAgIH0NCi0NCi0gICAgaWYobmV3X29yeV9kb2NfbG9jIT1udWxsKQ0KLSAgICB7DQotCWlmKCBzZWxmLm5hbWUgPT0gIm9yeV9kb2MiICkNCi0Jew0KLQkJd2luZG93LmNsb3NlKCk7DQotCQl3aW5kb3cub3BlbiggbmV3X29yeV9kb2NfbG9jICk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCSAgICAgICAJdG9wLmxvY2F0aW9uID0gbmV3X29yeV9kb2NfbG9jOw0KLQl9DQotICAgIH0NCi0gICB9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIG9wZW5PcnkgKHBhZ2UsIHRhcmdldCkNCi17DQotICAgIGlmKCFpbmRleCB8fCBpbmRleC5jbG9zZWQpDQotICAgIHsNCi0gICAgICBpbmRleCA9IG9wZW4ocGFnZSx0YXJnZXQsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zOTUsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgaW5kZXguZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuU2VhcmNoKCkNCi17DQotICAgIGlmKCFzZWFyY2ggfHwgc2VhcmNoLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHNlYXJjaCA9IG9wZW4oIi4vYXBwbGV0L3NlYXJjaC5odG0iLCJzZWFyY2hfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPW5vLHdpZHRoPTYzMCxoZWlnaHQ9NDUwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzZWFyY2guZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuSW5kZXgoKQ0KLXsNCi0gICBvcGVuT3J5KCIuL2luZGV4L2luZGV4Lmh0bSIsImluZGV4X3dpbiIpOw0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuR2xvc3NhcnkoKQ0KLXsNCi0gaWYoIWdsb3NzYXJ5IHx8IGdsb3NzYXJ5LmNsb3NlZCkNCi0gICAgew0KLSAgICAgIGdsb3NzYXJ5ID0gb3BlbigiLi9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4Lmh0bSIsImdsb3NzYXJ5X3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zODUsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgZ2xvc3NhcnkuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBwcmludFBhZ2UoKQ0KLXsNCi0gcGFyZW50Lm9yeV9kb2MuZm9jdXMoKTsNCi0gcGFyZW50Lm9yeV9kb2MucHJpbnQoKTsNCi19DQotDQotDQotZnVuY3Rpb24gc2VuZEZlZWRiYWNrKHVybCkNCi17DQotCWlmICggdXJsID09IG51bGwgfHwgdXJsID09ICcnICkNCi0Jew0KLQkJcmV0dXJuOw0KLQl9DQotCQ0KLQlpZiAoIHVybC5pbmRleE9mKCJtYWlsdG86IikgPj0gMCApDQotCXsNCi0JCXNlbmRtYWlsKHVybCk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQkNCi0gCSAgICBpZighZmVlZGJhY2sgfHwgZmVlZGJhY2suY2xvc2VkKQ0KLQkgICAgew0KLQkgICAgICBmZWVkYmFjayA9IG9wZW4odXJsLCJmZWVkYmFja193aW4iLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9NjAwLGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLQkgICAgfQ0KLQkgICAgZWxzZQ0KLQkgICAgew0KLQkgICAgICBmZWVkYmFjay5mb2N1cygpOw0KLQkgICAgfQ0KLSAgICAJfQ0KLSAgICAJDQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHNlbmRtYWlsKHVybCkNCi17DQotCWlmICggdXJsLmluZGV4T2YoIj9zdWJqZWN0IikgPT0gLTEgKQ0KLQl7DQotCQl2YXIgbGluaz1wYXJlbnQub3J5X2RvYy5sb2NhdGlvbjsNCi0JCXVybCA9IHVybCArICc/c3ViamVjdD1GZWVkYmFjazogLSAnK2xpbms7DQotCX0NCi0JbG9jYXRpb24ucmVwbGFjZSh1cmwpOw0KLX0NCi0NCi0vL2NhbGN1bGF0ZXMgcmVsYXRpdmUgcGF0aA0KLS8vcGF0aCBtdXN0IGJlIGFsbCByZWxhdGl2ZSBmcm9tIHdlYnNpdGUgYmFzZSBvciBjb250YWluIGZ1bGwgdXJscw0KLWZ1bmN0aW9uIGNhbGN1bGF0ZVJlbGF0aXZlUGF0aChzb3VyY2VQYXRoLCB0YXJnZXRQYXRoKQ0KLXsNCi0JaWYgKHRhcmdldFBhdGguaW5kZXhPZigiaHR0cDovIikgIT0gLTEpDQotCXsNCi0JCXJldHVybiB0YXJnZXRQYXRoOw0KLQl9DQotDQotCS8vcmVwbGFjZSBhbGwgJ1wnIHdpdGggJy8nDQotCXNvdXJjZVBhdGggPSBzb3VyY2VQYXRoLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotCXRhcmdldFBhdGggPSB0YXJnZXRQYXRoLnJlcGxhY2UoL1xcL2csIi8iKTsNCi0NCi0JLy9hbGVydCgiUmVwbGFjZShTb3VyY2UpPT4iICsgc291cmNlUGF0aCk7DQotCS8vYWxlcnQoIlJlcGxhY2UodGFyZ2V0KT0+IiArIHRhcmdldFBhdGgpOw0KLQ0KLQ0KLQlzb3VyY2VBcnJheSA9IHNvdXJjZVBhdGguc3BsaXQoIi8iKTsNCi0JdGFyZ2V0QXJyYXkgPSB0YXJnZXRQYXRoLnNwbGl0KCIvIik7DQotDQotCXZhciB0aGVSZWxQYXRoID0gIiI7DQotDQotCS8vbG9vcCB1bnRpbCB3ZSBmaW5kIGEgZGlmZmVyZW5jZQ0KLQl2YXIgaWR4ID0gMDsNCi0JZm9yKGlkeCA9IDA7IGlkeCA8IHNvdXJjZUFycmF5Lmxlbmd0aDsgaWR4KyspDQotCXsNCi0JCWlmIChpZHggPiB0YXJnZXRQYXRoLmxlbmd0aCkNCi0JCXsNCi0JCQlicmVhazsNCi0JCX0NCi0NCi0JCWlmIChzb3VyY2VBcnJheVtpZHhdICE9IHRhcmdldEFycmF5W2lkeF0pDQotCQl7DQotCQkJYnJlYWs7DQotCQl9DQotCX0NCi0NCi0JLy9hcHBlbmQgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiAuLw0KLQl2YXIgbWF4SWR4ID0gc291cmNlQXJyYXkubGVuZ3RoIC0gMTsNCi0JZm9yICh2YXIgaSA9IGlkeDsgaSA8IG1heElkeDsgaSsrKQ0KLQl7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aCArICIuLyI7DQotDQotCQkvL2FsZXJ0KCJSZWxQYXRoPT4iICsgdGhlUmVsUGF0aCk7DQotCX0NCi0NCi0JLy9hcHBlbmQgYW55IHJlbWFpbmluZyB0YXJnZXQgcGF0aA0KLQl3aGlsZShpZHggPCB0YXJnZXRBcnJheS5sZW5ndGgpDQotCXsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgdGFyZ2V0QXJyYXlbaWR4KytdICsgIi8iOw0KLQkJLy9hbGVydCgiUmVsUGF0aChmaW5hbCk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL3JlbW92ZSB0aGUgbGFzdCBwYXRoIHNlcGFyYXRvcg0KLQlpZiAodGhlUmVsUGF0aC5sZW5ndGggPiAwKQ0KLQl7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKFRyaW0xKT0+IiArIHRoZVJlbFBhdGgpOw0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGguc3Vic3RyaW5nKDAsICh0aGVSZWxQYXRoLmxlbmd0aCAtIDEpKTsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7DQotCX0NCi0NCi0JLy9hbGVydCgiUmV0dXJuIFJlbGF0aXZlIFBhdGggPT4gIiArIHRoZVJlbFBhdGgpOw0KLQ0KLQlyZXR1cm4gdGhlUmVsUGF0aDsNCi19DQotDQotZnVuY3Rpb24gZ2V0VHJlZVBhdGgoKQ0KLXsNCi0JcmV0dXJuIGJ1aWxkVHJlZVBhdGhMb2NhdGlvbigpOw0KLX0NCi0NCi0vL1RoaXMgbWV0aG9kIHdpbGwgcmVtb3ZlIHRoZSB3ZWJzaXRlIGJhc2UgZnJvbSB0aGUgdXJsDQotZnVuY3Rpb24gY2FsY3VsYXRDdXJyZW50UGFnZShjdXJyVVJMKSB7DQotDQotCXZhciB0aGVDdXJyZW50TG9jYXRpb24gPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmOw0KLQkvL3JlcGxhY2UgYWxsICdcJyB3aXRoICcvJw0KLQl0aGVDdXJyZW50TG9jYXRpb24gPSB0aGVDdXJyZW50TG9jYXRpb24ucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0JY3VyclVSTCA9IGN1cnJVUkwucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0NCi0JdmFyIHNvdXJjZUFycmF5ID0gdGhlQ3VycmVudExvY2F0aW9uLnNwbGl0KCIvIik7DQotCXZhciBjdXJyQXJyYXkgPSBjdXJyVVJMLnNwbGl0KCIvIik7DQotDQotCXZhciBudW1Ub1JlbW92ZSA9IHNvdXJjZUFycmF5Lmxlbmd0aCAtIDI7DQotCXZhciBpZHggPSAwOw0KLQl2YXIgdGhlUmV0dXJuUGF0aCA9ICIiOw0KLQlmb3IgKGlkeCA9IG51bVRvUmVtb3ZlOyBpZHggPCBjdXJyQXJyYXkubGVuZ3RoOyBpZHgrKykgew0KLQkJaWYgKHRoZVJldHVyblBhdGggIT0gIiIpIHsNCi0JCQl0aGVSZXR1cm5QYXRoID0gdGhlUmV0dXJuUGF0aCArICIvIjsNCi0JCX0NCi0JCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgY3VyckFycmF5W2lkeF07DQotCX0NCi0NCi0JLy9hbGVydCgiQXJyYXlUZXN0PT4iICsgY3VyclVSTCArICIsIiArIHRoZVJldHVyblBhdGgpOw0KLQlyZXR1cm4gdGhlUmV0dXJuUGF0aDsNCi19DQotDQotLy9idWlsZHMgdHJlZSBwYXRoDQotZnVuY3Rpb24gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCkNCi17DQotCXZhciB0aGVEZWxpbWl0ZXIgPSAiIyMqIjsNCi0JdmFyIHRoaXNQYWdlID0gImFwcGxldC9ydXBfdG9wbmF2Lmh0bSI7DQotCXZhciB0aGVMb2MgPSAiIjsNCi0NCi0NCi0NCi0JaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotCXsNCi0JCXZhciB0aGVDdXJyZW50TG9jYXRpb24gPSBwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5sb2NhdGlvbi5ocmVmOw0KLQkJdGhpc1BhZ2UgPSBjYWxjdWxhdEN1cnJlbnRQYWdlKHRoZUN1cnJlbnRMb2NhdGlvbik7DQotDQotCQkvL2FsZXJ0KCJQYXRoTmFtZToiICsgdGhpc1BhZ2UpOw0KLQ0KLQkJLy9hbGVydCgiVHJ5aW5nIHRvIGZpbmQgdGhlIHBhdGggZm9yID0+IiArIHRoZUN1cnJlbnRMb2NhdGlvbik7DQotDQotCQl2YXIgdGhlUGF0aCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5nZXRUcmVlUGF0aEFycmF5KHRoZUN1cnJlbnRMb2NhdGlvbik7DQotDQotCQkvL2FsZXJ0KCJUaGUgVHJlZSBQYXRoOiAiICsgdGhlUGF0aCk7DQotDQotCQl0aGVQYXRoU3RyaW5nID0gdGhlUGF0aCArICIiOw0KLSAgICAJCWFycmF5RnJvbVN0cmluZyA9IHRoZVBhdGhTdHJpbmcuc3BsaXQodGhlRGVsaW1pdGVyKTsNCi0NCi0JCS8vYnVpbGQgdGhlIHBhdGggZnJvbSB0aGUgYXJyYXkNCi0JCS8vcGFyYW0gMSA9IHBhdGggdG8gaWNvbiwgcGFyYW0gMiAtIGxhYmVsLCBwYXJhbSAzIC0gcGF0aCB0byBmaWxlDQotCQl2YXIgY291bnRlciA9IDA7DQotCQl2YXIgdGhlTGFiZWw7DQotCQl2YXIgdGhlUmVsUGF0aDsNCi0JCWlmIChhcnJheUZyb21TdHJpbmcubGVuZ3RoID4gMikNCi0JCXsNCi0JCSAgIHRoZUxvYyA9ICIiOw0KLQkJICAgZm9yKHZhciBpID0gMDsgaSA8IChhcnJheUZyb21TdHJpbmcubGVuZ3RoIC0gMSkgOyBpKyspDQotCQkgICB7DQotCQkJLy9pdCdzIHRoZSBpY29uIHBhdGgNCi0JCQlpZiAoY291bnRlciA8IDIpDQotCQkJew0KLQkJCQlpZiAoY291bnRlciA+IDApDQotCQkJCXsNCi0JCQkJCXRoZUxvYyA9IHRoZUxvYyArICIgJmd0OyAiOw0KLQkJCQl9DQotDQotCQkJCS8vYWxlcnQoIkNhbGN1bGF0aW5nIHBhdGggZnJvbSgxKSAiICsgdGhpc1BhZ2UgKyAiID0+ICIgKyBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQ0KLQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldLmluZGV4T2YoIlxcIikgPT0gLTEgJiYgYXJyYXlGcm9tU3RyaW5nW2ldLmluZGV4T2YoIi8iKSA9PSAtMSkNCi0JCQkJew0KLQkJCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpDQotCQkJCQl7DQotCQkJCQkJdGhlUmVsUGF0aCA9ICJhcHBsZXQvaW1hZ2VzLyIgKyBhcnJheUZyb21TdHJpbmdbaV07DQotCQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgdGhlUmVsUGF0aCk7DQotCQkJCQl9DQotCQkJCQkvL2FsZXJ0KCJNb2RpZnlpbmcgUGF0aCA9PiAiICsgdGhlUmVsUGF0aCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQkJCQl9DQotDQotCQkJCWlmICh0aGVSZWxQYXRoICE9ICJudWxsIikNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCQkgIjxpbWcgYm9yZGVyPTAgc3JjPVwiIiArDQotCQkJCQkJIHRoZVJlbFBhdGggICsNCi0JCQkJCQkgIlwiPiI7DQotCQkJCX0NCi0NCi0JCQkJLy9hbGVydCgidGhlIGN1cnIgcGF0aD0+IiArIHRoZUxvYyk7DQotCQkJCWNvdW50ZXIgPSAyOw0KLQkJCX0NCi0JCQkvLyBpdCdzIHRoZSBsYWJlbA0KLQkJCWVsc2UgaWYgKGNvdW50ZXIgPT0gMikNCi0JCQl7DQotCQkJCXRoZUxhYmVsID0gYXJyYXlGcm9tU3RyaW5nW2ldOw0KLQkJCQljb3VudGVyID0gMzsNCi0JCQl9DQotCQkJZWxzZSBpZiAoY291bnRlciA9PSAzKQ0KLQkJCXsNCi0JCQkJLy9hbGVydCgiQ2FsY3VsYXRpbmcgcGF0aCBmcm9tKDMpICIgKyB0aGlzUGFnZSArICIgPT4gIiArIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0gIT0gIm51bGwiKQ0KLQkJCQl7DQotCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQkJCQkJaWYgKHRoZVJlbFBhdGggIT0gIiIpIHsNCi0JCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkJIjxhIGNsYXNzPVwiaG90dGV4dFwiIHRhcmdldD1cIm9yeV9kb2NcIiBocmVmPVwiIiArDQotCQkJCQkJCSB0aGVSZWxQYXRoICsNCi0JCQkJCSAJCSJcIj4iICsNCi0JCQkJCSAJCXRoZUxhYmVsICsNCi0JCQkJCSAJCSI8XC9hPlxuIjsNCi0JCQkJCSB9DQotCQkJCQkgZWxzZSB7DQotCQkJCQkgCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCI+IiAgKw0KLQkJCQkJIAkJdGhlTGFiZWwgKw0KLQkJCQkJIAkJIjxcL2E+XG4iOw0KLQkJCQkJIH0NCi0JCQkJfQ0KLQkJCQllbHNlDQotCQkJCXsNCi0JCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCSI8YSBjbGFzcz1cImhvdHRleHRcIj4iICArDQotCQkJCQkgCXRoZUxhYmVsICsNCi0JCQkJCSAJIjxcL2E+XG4iOw0KLQkJCQl9DQotCQkJCS8vYWxlcnQoInRoZSBjdXJyIHBhdGg9PiIgKyB0aGVMb2MpOw0KLQkJCQljb3VudGVyID0gMTsNCi0JCQkJdGhlUmVsUGF0aCA9ICJudWxsIjsNCi0JCQkJdGhlTGFiZWwgPSAibnVsbCI7DQotCQkJfQ0KLQkJICAgfQ0KLQ0KLQkJLy9hbGVydCgiRmluaXNoZWQgQnVpbGRpbmcgPT4gIiArIHRoZUxvYyk7DQotCQl9DQotDQotCX0NCi0NCi0JLy90aGVMb2MgPSAiQ3VycmVudCBMb2NhdGlvbiZuYnNwOyYjMDQ1OyZuYnNwOyIgKyB0aGVMb2M7DQotDQotCS8vYWxlcnQoInRoZSBGaW5hbCBTdHJpbmc9PiIgKyB0aGVMb2MpOw0KLQ0KLQkvL2RvY3VtZW50LndyaXRlKHRoZUxvYyk7DQotCXJldHVybiB0aGVMb2M7DQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfZnIuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X2ZyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDVkMDUxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfZnIuanMKKysrIC9kZXYvbnVsbApAQCAtMSw3ODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gbWVzc2FnZXMgdG8gYmUgZXh0ZXJuaXplZA0KLS8vIGhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMNCi0NCi12YXIgdG9wbmF2X2pzX01FU1NBR0UxID0gIkxlIGNoYXJnZW1lbnQgZHUgbmF2aWdhdGV1ciBkJ2FyYnJlIG4nZXN0IHBhcyB0ZXJtaW7DqSAhXG5WZXVpbGxleiBwYXRpZW50ZXIgISI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMiA9ICJJbCBuJ2V4aXN0ZSBhdWN1bmUgcGFnZSAnezB9JyBwb3VyIGNldHRlIHBhZ2UuXG5Fc3NheWV6IGwndW4gZGVzIGF1dHJlcyBib3V0b25zIGRlIG5hdmlnYXRpb24uIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0UzID0gIklsIG4nZXhpc3RlIHBhcyBkZSBwYWdlIHswfS4iOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9wcmV2ID0gInByw6ljw6lkZW50IjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0VfbmV4dCA9ICJzdWl2YW50IjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0VfdXAgPSAiaGF1dCI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNCA9ICJMZSBmaWNoaWVyIGVuIGNvdXJzIG5lIHNlIHRyb3V2ZSBwYXMgZGFucyBsZSBuYXZpZ2F0ZXVyIGQnYXJicmUuIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0U1ID0gIkxlIHNpdGUgcHVibGnDqSBlc3QgZMOpasOgIGFmZmljaMOpIGVuIHV0aWxpc2FudCBkZXMgY2FkcmVzIjsNCi0NCi1mdW5jdGlvbiBmb3JtYXRTdHJpbmcobWVzc2FnZSwgcmVwbGFjZTApDQotew0KLSAgIAlyZXR1cm4gbWVzc2FnZS5yZXBsYWNlKC9cezBcfS8sIHJlcGxhY2UwKTsNCi19IA0KLQ0KLS8vIHRoaXMgc2NyaXB0IGlzIGZvciB0aGUgdG9wbmF2Lmh0bWwNCi0vLyB0aGlzIGlzIE5PVCBmb3IgZ2VuZXJhbCB1c2UNCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0gIA0KLXZhciB0b3VyID0gMDsNCi0NCi1mdW5jdGlvbiBvcGVuRmlyc3RUb3VyICgpDQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQNCi17DQotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHRvdXIgPSBvcGVuKCIuL3RvdXIvdG91ci5odG0iLCJ0b3VyX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MzUwLGhlaWdodD03MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlblRvdXIgKCkNCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNA0KLXsNCi1pZighdG91ciB8fCB0b3VyPT1udWxsIHx8IHRvdXIuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi0vL0FkZGl0aW9uIGJ5IENoaW5oIFZvIDAzLzI4LzAwDQotIGZ1bmN0aW9uIGRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpDQotIHsNCi0gCXZhciBwYWdlUGF0dGVybiA9IC9vdnVfcHJvYy87DQotIAl2YXIgbWFpblBhZ2UgPSB3aW5kb3cucGFyZW50Lm9yeV9kb2MubG9jYXRpb247DQotDQotIAlpZiAoIHBhZ2VQYXR0ZXJuLnRlc3QoIG1haW5QYWdlICkgKSB7DQotICAgIAlpZiAoZ2V0Q29va2llKCJSVVAiKSAhPSAiY2hlY2tlZCIpIHsgb3BlbkZpcnN0VG91cigpOyB9DQotCX0NCi0JZWxzZSB7DQotCQlzZXRUaW1lb3V0KCAiZGlzcGxheUdldHRpbmdTdGFydGVkKCkiLCAxMDAwICk7DQotCX0NCi19DQotDQotZnVuY3Rpb24gZ2V0Q29va2llIChuYW1lKQ0KLXsNCi0gIHZhciBkY29va2llID0gZG9jdW1lbnQuY29va2llOw0KLSAgdmFyIGNuYW1lID0gbmFtZSArICI9IjsNCi0gIHZhciBjbGVuID0gZGNvb2tpZS5sZW5ndGg7DQotICB2YXIgY2JlZ2luID0gMDsNCi0gIHdoaWxlIChjYmVnaW4gPCBjbGVuKQ0KLSAgew0KLSAgICB2YXIgdmJlZ2luID0gY2JlZ2luICsgY25hbWUubGVuZ3RoOw0KLSAgICBpZiAoZGNvb2tpZS5zdWJzdHJpbmcoY2JlZ2luLCB2YmVnaW4pID09IGNuYW1lKQ0KLSAgICB7DQotICAgICAgdmFyIHZlbmQgPSBkY29va2llLmluZGV4T2YgKCI7IiwgdmJlZ2luKTsNCi0gICAgICBpZiAodmVuZCA9PSAtMSkNCi0gICAgICB7DQotICAgICAgICB2ZW5kID0gY2xlbjsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHVuZXNjYXBlKGRjb29raWUuc3Vic3RyaW5nKHZiZWdpbiwgdmVuZCkpOw0KLSAgICB9DQotICAgIGNiZWdpbiA9IGRjb29raWUuaW5kZXhPZigiICIsIGNiZWdpbikgKyAxOw0KLSAgICBpZiAoY2JlZ2luID09IDApDQotICAgIHsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIG51bGw7DQotIH0NCi0NCi0NCi0gIHZhciBpbmRleD1udWxsOw0KLSAgdmFyIHRvdXI9bnVsbDsNCi0gIHZhciBzZWFyY2g9bnVsbDsNCi0gIHZhciBnbG9zc2FyeT1udWxsOw0KLSAgdmFyIGZlZWRiYWNrPW51bGw7DQotICB2YXIgdHJlZUxvYWRlZD1mYWxzZTsNCi0gIGZ1bmN0aW9uIGNoZWNrVHJlZUxvYWRlZCgpDQotICB7DQotICAgIGlmKHRyZWVMb2FkZWQpDQotICAgIHsNCi0gICAgICByZXR1cm4gdHJlZUxvYWRlZDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgaWYocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0ICE9IG51bGwNCi0gICAgICAgICYmIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpDQotICAgICB7DQotICAgICAgIHRyZWVMb2FkZWQgPSB0cnVlOw0KLSAgICAgfQ0KLSAgICAgKi8NCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsKQ0KLSAgICAgew0KLSAgICAgIAl2YXIgbWV0aG9kID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5Ow0KLQkgaWYgKG1ldGhvZCAhPSAidW5kZWZpbmVkIikgew0KLQkJaWYgKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpDQotCQl7DQotICAgICAgIAkJCXRyZWVMb2FkZWQgPSB0cnVlOw0KLQkJfQ0KLQ0KLQkgIH0NCi0NCi0gICAgIH0NCi0NCi0gICAgIHJldHVybiB0cmVlTG9hZGVkOw0KLSAgIH0NCi0NCi0NCi0gICAgZnVuY3Rpb24gc2hvd0FsZXJ0Tm90TG9hZGVkKCkNCi0gICAgew0KLSAgICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFMSk7DQotICAgIH0NCi0NCi1mdW5jdGlvbiBzaG93U3RhdHVzTm90TG9hZGVkKCkNCi0gIHsNCi0gICAgLy9yZXR1cm4gIlRoZSBUcmVlQnJvd3NlIGlzIG5vdCB5ZXQgbG9hZGVkIVxuUGxlYXNlIHdhaXQhIjsNCi0gICAgcmV0dXJuIHRvcG5hdl9qc19NRVNTQUdFMTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dBbGVydE5vUGFnZSh0ZXh0KQ0KLSAgew0KLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpDQotICAgICB7DQotICAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucy4iKTsNCi0gICAgICAgICAgYWxlcnQoZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMiwgdGV4dCkpOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucyIpOw0KLSAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsNCi0gICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dTdGF0dXNOb1BhZ2UodGV4dCkNCi0gIHsNCi0NCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG1zZzsNCi0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7DQotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7DQotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsNCi0gICAgIH0NCi0NCi0gICAgIHJldHVybiBtc2c7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93UGFyZW50TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBwYXJlbnR1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotDQotICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgcGFyZW50dXJsIT0iIiAmJiBwYXJlbnR1cmwhPW51bGwpDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vUGFnZSgidXAiKTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93SG9tZUxhYmVsKCkNCi0gIHsNCi0gICAgc2VsZi5zdGF0dXMgPSAiSG9tZSI7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93UHJldmlvdXNMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgcHJldnVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHByZXZ1cmwhPSIiICYmIHByZXZ1cmwhPW51bGwpDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInByZXZpb3VzIik7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd05leHRMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBuZXh0dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgbmV4dHVybCE9IiIgJiYgbmV4dHVybCE9bnVsbCkNCi0gICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vUGFnZSgibmV4dCIpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUHJldmlvdXMoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLQ0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpDQotCXsNCi0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQ0KLQl7DQotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpDQotCXsNCi0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIlByZXZpb3VzIik7DQotCX0NCi0JICAgICAgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX3ByZXYpOw0KLSAgICAgfQ0KLSAgICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkTmV4dCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICB2YXIgbmV3TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLQ0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpDQotCXsNCi0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQ0KLQl7DQotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpDQotCXsNCi0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIk5leHQiKTsNCi0JfQ0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotDQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfbmV4dCk7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGxvYWRQYXJlbnQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV91cCk7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotZnVuY3Rpb24gd2hlcmVBbUkoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLQl2YXIgc3RhdHVzID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgCWlmKCBzdGF0dXMgPT0gZmFsc2UgKQ0KLQl7DQotCQlhbGVydCggdG9wbmF2X2pzX01FU1NBR0U0ICk7DQotCX0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gdXBBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnVwQXJyb3coKTsNCi0gICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gZG93bkFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZG93bkFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotDQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gbGVmdEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5sZWZ0QXJyb3coKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgICBmdW5jdGlvbiByaWdodEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5yaWdodEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIikNCi0gIHsNCi0gICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFNSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsNCi0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsNCi0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKw0KLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsNCi0NCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7DQotDQotICAgIGZvcihpPWRvY3VtZW50LmxpbmtzLmxlbmd0aC0xO2k+PTA7aS0tKQ0KLSAgICB7DQotICAgICAgIGlmKGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuaW5kZXhPZigiaW5kZXguaHRtIikhPS0xKQ0KLSAgICAgICB7DQotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZjsNCi0gICAgICAgICBicmVhazsNCi0gICAgICAgfQ0KLSAgICB9DQotDQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkNCi0gICAgew0KLQlpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApDQotCXsNCi0JCXdpbmRvdy5jbG9zZSgpOw0KLQkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBvcGVuT3J5IChwYWdlLCB0YXJnZXQpDQotew0KLSAgICBpZighaW5kZXggfHwgaW5kZXguY2xvc2VkKQ0KLSAgICB7DQotICAgICAgaW5kZXggPSBvcGVuKHBhZ2UsdGFyZ2V0LCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzk1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGluZGV4LmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlblNlYXJjaCgpDQotew0KLSAgICBpZighc2VhcmNoIHx8IHNlYXJjaC5jbG9zZWQpDQotICAgIHsNCi0gICAgICBzZWFyY2ggPSBvcGVuKCIuL2FwcGxldC9zZWFyY2guaHRtIiwic2VhcmNoX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz1ubyx3aWR0aD02MzAsaGVpZ2h0PTQ1MCxyZXNpemFibGU9eWVzIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2VhcmNoLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlbkluZGV4KCkNCi17DQotICAgb3Blbk9yeSgiLi9pbmRleC9pbmRleC5odG0iLCJpbmRleF93aW4iKTsNCi19DQotDQotZnVuY3Rpb24gb3Blbkdsb3NzYXJ5KCkNCi17DQotIGlmKCFnbG9zc2FyeSB8fCBnbG9zc2FyeS5jbG9zZWQpDQotICAgIHsNCi0gICAgICBnbG9zc2FyeSA9IG9wZW4oIi4vcHJvY2Vzcy9nbG9zc2FyeS9pbmRleC5odG0iLCJnbG9zc2FyeV93aW4iLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzg1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGdsb3NzYXJ5LmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gcHJpbnRQYWdlKCkNCi17DQotIHBhcmVudC5vcnlfZG9jLmZvY3VzKCk7DQotIHBhcmVudC5vcnlfZG9jLnByaW50KCk7DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHNlbmRGZWVkYmFjayh1cmwpDQotew0KLQlpZiAoIHVybCA9PSBudWxsIHx8IHVybCA9PSAnJyApDQotCXsNCi0JCXJldHVybjsNCi0JfQ0KLQkNCi0JaWYgKCB1cmwuaW5kZXhPZigibWFpbHRvOiIpID49IDAgKQ0KLQl7DQotCQlzZW5kbWFpbCh1cmwpOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJDQotIAkgICAgaWYoIWZlZWRiYWNrIHx8IGZlZWRiYWNrLmNsb3NlZCkNCi0JICAgIHsNCi0JICAgICAgZmVlZGJhY2sgPSBvcGVuKHVybCwiZmVlZGJhY2tfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTYwMCxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0JICAgIH0NCi0JICAgIGVsc2UNCi0JICAgIHsNCi0JICAgICAgZmVlZGJhY2suZm9jdXMoKTsNCi0JICAgIH0NCi0gICAgCX0NCi0gICAgCQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kbWFpbCh1cmwpDQotew0KLQlpZiAoIHVybC5pbmRleE9mKCI/c3ViamVjdCIpID09IC0xICkNCi0Jew0KLQkJdmFyIGxpbms9cGFyZW50Lm9yeV9kb2MubG9jYXRpb247DQotCQl1cmwgPSB1cmwgKyAnP3N1YmplY3Q9RmVlZGJhY2s6IC0gJytsaW5rOw0KLQl9DQotCWxvY2F0aW9uLnJlcGxhY2UodXJsKTsNCi19DQotDQotLy9jYWxjdWxhdGVzIHJlbGF0aXZlIHBhdGgNCi0vL3BhdGggbXVzdCBiZSBhbGwgcmVsYXRpdmUgZnJvbSB3ZWJzaXRlIGJhc2Ugb3IgY29udGFpbiBmdWxsIHVybHMNCi1mdW5jdGlvbiBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgoc291cmNlUGF0aCwgdGFyZ2V0UGF0aCkNCi17DQotCWlmICh0YXJnZXRQYXRoLmluZGV4T2YoImh0dHA6LyIpICE9IC0xKQ0KLQl7DQotCQlyZXR1cm4gdGFyZ2V0UGF0aDsNCi0JfQ0KLQ0KLQkvL3JlcGxhY2UgYWxsICdcJyB3aXRoICcvJw0KLQlzb3VyY2VQYXRoID0gc291cmNlUGF0aC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQl0YXJnZXRQYXRoID0gdGFyZ2V0UGF0aC5yZXBsYWNlKC9cXC9nLCIvIik7DQotDQotCS8vYWxlcnQoIlJlcGxhY2UoU291cmNlKT0+IiArIHNvdXJjZVBhdGgpOw0KLQkvL2FsZXJ0KCJSZXBsYWNlKHRhcmdldCk9PiIgKyB0YXJnZXRQYXRoKTsNCi0NCi0NCi0Jc291cmNlQXJyYXkgPSBzb3VyY2VQYXRoLnNwbGl0KCIvIik7DQotCXRhcmdldEFycmF5ID0gdGFyZ2V0UGF0aC5zcGxpdCgiLyIpOw0KLQ0KLQl2YXIgdGhlUmVsUGF0aCA9ICIiOw0KLQ0KLQkvL2xvb3AgdW50aWwgd2UgZmluZCBhIGRpZmZlcmVuY2UNCi0JdmFyIGlkeCA9IDA7DQotCWZvcihpZHggPSAwOyBpZHggPCBzb3VyY2VBcnJheS5sZW5ndGg7IGlkeCsrKQ0KLQl7DQotCQlpZiAoaWR4ID4gdGFyZ2V0UGF0aC5sZW5ndGgpDQotCQl7DQotCQkJYnJlYWs7DQotCQl9DQotDQotCQlpZiAoc291cmNlQXJyYXlbaWR4XSAhPSB0YXJnZXRBcnJheVtpZHhdKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQl9DQotDQotCS8vYXBwZW5kIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgLi8NCi0JdmFyIG1heElkeCA9IHNvdXJjZUFycmF5Lmxlbmd0aCAtIDE7DQotCWZvciAodmFyIGkgPSBpZHg7IGkgPCBtYXhJZHg7IGkrKykNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyAiLi8iOw0KLQ0KLQkJLy9hbGVydCgiUmVsUGF0aD0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vYXBwZW5kIGFueSByZW1haW5pbmcgdGFyZ2V0IHBhdGgNCi0Jd2hpbGUoaWR4IDwgdGFyZ2V0QXJyYXkubGVuZ3RoKQ0KLQl7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aCArIHRhcmdldEFycmF5W2lkeCsrXSArICIvIjsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoZmluYWwpPT4iICsgdGhlUmVsUGF0aCk7DQotCX0NCi0NCi0JLy9yZW1vdmUgdGhlIGxhc3QgcGF0aCBzZXBhcmF0b3INCi0JaWYgKHRoZVJlbFBhdGgubGVuZ3RoID4gMCkNCi0Jew0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoLnN1YnN0cmluZygwLCAodGhlUmVsUGF0aC5sZW5ndGggLSAxKSk7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKFRyaW0xKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vYWxlcnQoIlJldHVybiBSZWxhdGl2ZSBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0NCi0JcmV0dXJuIHRoZVJlbFBhdGg7DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldFRyZWVQYXRoKCkNCi17DQotCXJldHVybiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKTsNCi19DQotDQotLy9UaGlzIG1ldGhvZCB3aWxsIHJlbW92ZSB0aGUgd2Vic2l0ZSBiYXNlIGZyb20gdGhlIHVybA0KLWZ1bmN0aW9uIGNhbGN1bGF0Q3VycmVudFBhZ2UoY3VyclVSTCkgew0KLQ0KLQl2YXIgdGhlQ3VycmVudExvY2F0aW9uID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0JdGhlQ3VycmVudExvY2F0aW9uID0gdGhlQ3VycmVudExvY2F0aW9uLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotCWN1cnJVUkwgPSBjdXJyVVJMLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotDQotCXZhciBzb3VyY2VBcnJheSA9IHRoZUN1cnJlbnRMb2NhdGlvbi5zcGxpdCgiLyIpOw0KLQl2YXIgY3VyckFycmF5ID0gY3VyclVSTC5zcGxpdCgiLyIpOw0KLQ0KLQl2YXIgbnVtVG9SZW1vdmUgPSBzb3VyY2VBcnJheS5sZW5ndGggLSAyOw0KLQl2YXIgaWR4ID0gMDsNCi0JdmFyIHRoZVJldHVyblBhdGggPSAiIjsNCi0JZm9yIChpZHggPSBudW1Ub1JlbW92ZTsgaWR4IDwgY3VyckFycmF5Lmxlbmd0aDsgaWR4KyspIHsNCi0JCWlmICh0aGVSZXR1cm5QYXRoICE9ICIiKSB7DQotCQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyAiLyI7DQotCQl9DQotCQl0aGVSZXR1cm5QYXRoID0gdGhlUmV0dXJuUGF0aCArIGN1cnJBcnJheVtpZHhdOw0KLQl9DQotDQotCS8vYWxlcnQoIkFycmF5VGVzdD0+IiArIGN1cnJVUkwgKyAiLCIgKyB0aGVSZXR1cm5QYXRoKTsNCi0JcmV0dXJuIHRoZVJldHVyblBhdGg7DQotfQ0KLQ0KLS8vYnVpbGRzIHRyZWUgcGF0aA0KLWZ1bmN0aW9uIGJ1aWxkVHJlZVBhdGhMb2NhdGlvbigpDQotew0KLQl2YXIgdGhlRGVsaW1pdGVyID0gIiMjKiI7DQotCXZhciB0aGlzUGFnZSA9ICJhcHBsZXQvcnVwX3RvcG5hdi5odG0iOw0KLQl2YXIgdGhlTG9jID0gIiI7DQotDQotDQotDQotCWlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLQl7DQotCQl2YXIgdGhlQ3VycmVudExvY2F0aW9uID0gcGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCi0JCXRoaXNQYWdlID0gY2FsY3VsYXRDdXJyZW50UGFnZSh0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJLy9hbGVydCgiUGF0aE5hbWU6IiArIHRoaXNQYWdlKTsNCi0NCi0JCS8vYWxlcnQoIlRyeWluZyB0byBmaW5kIHRoZSBwYXRoIGZvciA9PiIgKyB0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJdmFyIHRoZVBhdGggPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuZ2V0VHJlZVBhdGhBcnJheSh0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJLy9hbGVydCgiVGhlIFRyZWUgUGF0aDogIiArIHRoZVBhdGgpOw0KLQ0KLQkJdGhlUGF0aFN0cmluZyA9IHRoZVBhdGggKyAiIjsNCi0gICAgCQlhcnJheUZyb21TdHJpbmcgPSB0aGVQYXRoU3RyaW5nLnNwbGl0KHRoZURlbGltaXRlcik7DQotDQotCQkvL2J1aWxkIHRoZSBwYXRoIGZyb20gdGhlIGFycmF5DQotCQkvL3BhcmFtIDEgPSBwYXRoIHRvIGljb24sIHBhcmFtIDIgLSBsYWJlbCwgcGFyYW0gMyAtIHBhdGggdG8gZmlsZQ0KLQkJdmFyIGNvdW50ZXIgPSAwOw0KLQkJdmFyIHRoZUxhYmVsOw0KLQkJdmFyIHRoZVJlbFBhdGg7DQotCQlpZiAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCA+IDIpDQotCQl7DQotCQkgICB0aGVMb2MgPSAiIjsNCi0JCSAgIGZvcih2YXIgaSA9IDA7IGkgPCAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCAtIDEpIDsgaSsrKQ0KLQkJICAgew0KLQkJCS8vaXQncyB0aGUgaWNvbiBwYXRoDQotCQkJaWYgKGNvdW50ZXIgPCAyKQ0KLQkJCXsNCi0JCQkJaWYgKGNvdW50ZXIgPiAwKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKyAiICZndDsgIjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMSkgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0NCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCJcXCIpID09IC0xICYmIGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCIvIikgPT0gLTEpDQotCQkJCXsNCi0JCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0gIT0gIm51bGwiKQ0KLQkJCQkJew0KLQkJCQkJCXRoZVJlbFBhdGggPSAiYXBwbGV0L2ltYWdlcy8iICsgYXJyYXlGcm9tU3RyaW5nW2ldOw0KLQkJCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIHRoZVJlbFBhdGgpOw0KLQkJCQkJfQ0KLQkJCQkJLy9hbGVydCgiTW9kaWZ5aW5nIFBhdGggPT4gIiArIHRoZVJlbFBhdGgpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJfQ0KLQ0KLQkJCQlpZiAodGhlUmVsUGF0aCAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkJICI8aW1nIGJvcmRlcj0wIHNyYz1cIiIgKw0KLQkJCQkJCSB0aGVSZWxQYXRoICArDQotCQkJCQkJICJcIj4iOw0KLQkJCQl9DQotDQotCQkJCS8vYWxlcnQoInRoZSBjdXJyIHBhdGg9PiIgKyB0aGVMb2MpOw0KLQkJCQljb3VudGVyID0gMjsNCi0JCQl9DQotCQkJLy8gaXQncyB0aGUgbGFiZWwNCi0JCQllbHNlIGlmIChjb3VudGVyID09IDIpDQotCQkJew0KLQkJCQl0aGVMYWJlbCA9IGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJY291bnRlciA9IDM7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKGNvdW50ZXIgPT0gMykNCi0JCQl7DQotCQkJCS8vYWxlcnQoIkNhbGN1bGF0aW5nIHBhdGggZnJvbSgzKSAiICsgdGhpc1BhZ2UgKyAiID0+ICIgKyBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJew0KLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJCWlmICh0aGVSZWxQYXRoICE9ICIiKSB7DQotCQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIiB0YXJnZXQ9XCJvcnlfZG9jXCIgaHJlZj1cIiIgKw0KLQkJCQkJCQkgdGhlUmVsUGF0aCArDQotCQkJCQkgCQkiXCI+IiArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQkJIGVsc2Ugew0KLQkJCQkJIAl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJCXRoZUxhYmVsICsNCi0JCQkJCSAJCSI8XC9hPlxuIjsNCi0JCQkJCSB9DQotCQkJCX0NCi0JCQkJZWxzZQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkiPGEgY2xhc3M9XCJob3R0ZXh0XCI+IiAgKw0KLQkJCQkJIAl0aGVMYWJlbCArDQotCQkJCQkgCSI8XC9hPlxuIjsNCi0JCQkJfQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDE7DQotCQkJCXRoZVJlbFBhdGggPSAibnVsbCI7DQotCQkJCXRoZUxhYmVsID0gIm51bGwiOw0KLQkJCX0NCi0JCSAgIH0NCi0NCi0JCS8vYWxlcnQoIkZpbmlzaGVkIEJ1aWxkaW5nID0+ICIgKyB0aGVMb2MpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCS8vdGhlTG9jID0gIkN1cnJlbnQgTG9jYXRpb24mbmJzcDsmIzA0NTsmbmJzcDsiICsgdGhlTG9jOw0KLQ0KLQkvL2FsZXJ0KCJ0aGUgRmluYWwgU3RyaW5nPT4iICsgdGhlTG9jKTsNCi0NCi0JLy9kb2N1bWVudC53cml0ZSh0aGVMb2MpOw0KLQlyZXR1cm4gdGhlTG9jOw0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X2l0LmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9pdC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1MThiYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X2l0LmpzCisrKyAvZGV2L251bGwKQEAgLTEsNzg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQNCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotDQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMSA9ICJJbCBicm93c2VyIGRlbGxhIHN0cnV0dHVyYSBub24gw6ggc3RhdG8gYW5jb3JhIGNhcmljYXRvIVxuQXR0ZW5kZXJlISI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMiA9ICJOb24gZXNpc3RlIGFsY3VuYSBwYWdpbmEgJ3swfScgcGVyIHF1ZXN0YSBwYWdpbmEuXG5Qcm92YXJlIHVuIGFsdHJvIHB1bHNhbnRlIGRpIG5hdmlnYXppb25lLiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMyA9ICJOb24gZXNpc3RlIGFsY3VuYSBwYWdpbmEgezB9ISI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3ByZXYgPSAicHJlY2VkZW50ZSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX25leHQgPSAic3VjY2Vzc2l2byI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3VwID0gInN1IjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0U0ID0gIklsIGZpbGUgY29ycmVudGUgbm9uIHNpIHRyb3ZhIG5lbCBicm93c2VyIGRlbGxhIHN0cnV0dHVyYS4iOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTUgPSAiSWwgc2l0byBwdWJibGljYXRvIHZpZW5lIGdpw6AgdmlzdWFsaXp6YXRvIG1lZGlhbnRlIGkgZnJhbWUiOw0KLQ0KLWZ1bmN0aW9uIGZvcm1hdFN0cmluZyhtZXNzYWdlLCByZXBsYWNlMCkNCi17DQotICAgCXJldHVybiBtZXNzYWdlLnJlcGxhY2UoL1x7MFx9LywgcmVwbGFjZTApOw0KLX0gDQotDQotLy8gdGhpcyBzY3JpcHQgaXMgZm9yIHRoZSB0b3BuYXYuaHRtbA0KLS8vIHRoaXMgaXMgTk9UIGZvciBnZW5lcmFsIHVzZQ0KLU1TRlBob3ZlciA9DQotKCgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gMyApKSB8fA0KLSAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApKSk7DQotDQotICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpDQotICB7DQotICAgICB2YXIgYT1uZXcgSW1hZ2UoKTsNCi0gICAgIGEuc3JjPWltZzsNCi0gICAgIHJldHVybiBhOw0KLSAgfQ0KLSAgDQotdmFyIHRvdXIgPSAwOw0KLQ0KLWZ1bmN0aW9uIG9wZW5GaXJzdFRvdXIgKCkNCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNA0KLXsNCi1pZighdG91ciB8fCB0b3VyPT1udWxsIHx8IHRvdXIuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuVG91ciAoKQ0KLS8vIG9wZW4gdGhlIGd1aWRlZCB0b3VyIC9oYWFrYW4gOTkwMzI0DQotew0KLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpDQotICAgIHsNCi0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLS8vQWRkaXRpb24gYnkgQ2hpbmggVm8gMDMvMjgvMDANCi0gZnVuY3Rpb24gZGlzcGxheUdldHRpbmdTdGFydGVkKCkNCi0gew0KLSAJdmFyIHBhZ2VQYXR0ZXJuID0gL292dV9wcm9jLzsNCi0gCXZhciBtYWluUGFnZSA9IHdpbmRvdy5wYXJlbnQub3J5X2RvYy5sb2NhdGlvbjsNCi0NCi0gCWlmICggcGFnZVBhdHRlcm4udGVzdCggbWFpblBhZ2UgKSApIHsNCi0gICAgCWlmIChnZXRDb29raWUoIlJVUCIpICE9ICJjaGVja2VkIikgeyBvcGVuRmlyc3RUb3VyKCk7IH0NCi0JfQ0KLQllbHNlIHsNCi0JCXNldFRpbWVvdXQoICJkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKSIsIDEwMDAgKTsNCi0JfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRDb29raWUgKG5hbWUpDQotew0KLSAgdmFyIGRjb29raWUgPSBkb2N1bWVudC5jb29raWU7DQotICB2YXIgY25hbWUgPSBuYW1lICsgIj0iOw0KLSAgdmFyIGNsZW4gPSBkY29va2llLmxlbmd0aDsNCi0gIHZhciBjYmVnaW4gPSAwOw0KLSAgd2hpbGUgKGNiZWdpbiA8IGNsZW4pDQotICB7DQotICAgIHZhciB2YmVnaW4gPSBjYmVnaW4gKyBjbmFtZS5sZW5ndGg7DQotICAgIGlmIChkY29va2llLnN1YnN0cmluZyhjYmVnaW4sIHZiZWdpbikgPT0gY25hbWUpDQotICAgIHsNCi0gICAgICB2YXIgdmVuZCA9IGRjb29raWUuaW5kZXhPZiAoIjsiLCB2YmVnaW4pOw0KLSAgICAgIGlmICh2ZW5kID09IC0xKQ0KLSAgICAgIHsNCi0gICAgICAgIHZlbmQgPSBjbGVuOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gdW5lc2NhcGUoZGNvb2tpZS5zdWJzdHJpbmcodmJlZ2luLCB2ZW5kKSk7DQotICAgIH0NCi0gICAgY2JlZ2luID0gZGNvb2tpZS5pbmRleE9mKCIgIiwgY2JlZ2luKSArIDE7DQotICAgIGlmIChjYmVnaW4gPT0gMCkNCi0gICAgew0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9DQotICByZXR1cm4gbnVsbDsNCi0gfQ0KLQ0KLQ0KLSAgdmFyIGluZGV4PW51bGw7DQotICB2YXIgdG91cj1udWxsOw0KLSAgdmFyIHNlYXJjaD1udWxsOw0KLSAgdmFyIGdsb3NzYXJ5PW51bGw7DQotICB2YXIgZmVlZGJhY2s9bnVsbDsNCi0gIHZhciB0cmVlTG9hZGVkPWZhbHNlOw0KLSAgZnVuY3Rpb24gY2hlY2tUcmVlTG9hZGVkKCkNCi0gIHsNCi0gICAgaWYodHJlZUxvYWRlZCkNCi0gICAgew0KLSAgICAgIHJldHVybiB0cmVlTG9hZGVkOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICBpZihwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQgIT0gbnVsbA0KLSAgICAgICAgJiYgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHkoKSkNCi0gICAgIHsNCi0gICAgICAgdHJlZUxvYWRlZCA9IHRydWU7DQotICAgICB9DQotICAgICAqLw0KLSAgICAgaWYocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0ICE9IG51bGwpDQotICAgICB7DQotICAgICAgCXZhciBtZXRob2QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHk7DQotCSBpZiAobWV0aG9kICE9ICJ1bmRlZmluZWQiKSB7DQotCQlpZiAocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHkoKSkNCi0JCXsNCi0gICAgICAgCQkJdHJlZUxvYWRlZCA9IHRydWU7DQotCQl9DQotDQotCSAgfQ0KLQ0KLSAgICAgfQ0KLQ0KLSAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7DQotICAgfQ0KLQ0KLQ0KLSAgICBmdW5jdGlvbiBzaG93QWxlcnROb3RMb2FkZWQoKQ0KLSAgICB7DQotICAgICAgYWxlcnQodG9wbmF2X2pzX01FU1NBR0UxKTsNCi0gICAgfQ0KLQ0KLWZ1bmN0aW9uIHNob3dTdGF0dXNOb3RMb2FkZWQoKQ0KLSAgew0KLSAgICAvL3JldHVybiAiVGhlIFRyZWVCcm93c2UgaXMgbm90IHlldCBsb2FkZWQhXG5QbGVhc2Ugd2FpdCEiOw0KLSAgICByZXR1cm4gdG9wbmF2X2pzX01FU1NBR0UxOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd0FsZXJ0Tm9QYWdlKHRleHQpDQotICB7DQotICAgICB2YXIgcGFyZW50TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgICAgLy9hbGVydCgiVGhlcmUgaXMgbm8gJyIgKyB0ZXh0ICsgIicgcGFnZSBmb3IgdGhpcyBwYWdlLlxuVHJ5IG9uZSBvZiB0aGUgb3RoZXIgbmF2aWdhdGlvbiBidXR0b25zLiIpOw0KLSAgICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICAgLy9hbGVydCgiVGhlcmUgaXMgbm8gJyIgKyB0ZXh0ICsgIicgcGFnZSBmb3IgdGhpcyBwYWdlLlxuVHJ5IG9uZSBvZiB0aGUgb3RoZXIgbmF2aWdhdGlvbiBidXR0b25zIik7DQotICAgICAgICAgYWxlcnQoZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMiwgdGV4dCkpOw0KLSAgICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1N0YXR1c05vUGFnZSh0ZXh0KQ0KLSAgew0KLQ0KLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbXNnOw0KLSAgICAgaWYocGFyZW50TGFiZWwhPSIiICYmIHBhcmVudExhYmVsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICAgLy9tc2cgPSAiVGhlcmUgaXMgbm8gIiArIHRleHQgKyAiIHBhZ2UhIjsNCi0gICAgICAgIG1zZyA9IGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTMsIHRleHQpOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgLy9tc2cgPSAiVGhlcmUgaXMgbm8gIiArIHRleHQgKyAiIHBhZ2UhIjsNCi0gICAgICAgIG1zZyA9IGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTMsIHRleHQpOw0KLSAgICAgfQ0KLQ0KLSAgICAgcmV0dXJuIG1zZzsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dQYXJlbnRMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIHBhcmVudHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwYXJlbnR1cmwhPSIiICYmIHBhcmVudHVybCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJ1cCIpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dIb21lTGFiZWwoKQ0KLSAgew0KLSAgICBzZWxmLnN0YXR1cyA9ICJIb21lIjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dQcmV2aW91c0xhYmVsKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBwcmV2dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzVXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotDQotICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgcHJldnVybCE9IiIgJiYgcHJldnVybCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vUGFnZSgicHJldmlvdXMiKTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93TmV4dExhYmVsKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIG5leHR1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBuZXh0dXJsIT0iIiAmJiBuZXh0dXJsIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICAgfQ0KLSAgICAgIGVsc2UNCi0gICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9ICBzaG93U3RhdHVzTm9QYWdlKCJuZXh0Iik7DQotICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9ICBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGxvYWRQcmV2aW91cygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICB2YXIgbmV3TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzVXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotDQotICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICB7DQotDQotCWlmICgobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0Iik9PS0xKSAmJiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3Iik9PS0xKSkNCi0Jew0KLQkJcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKSE9LTEpDQotCXsNCi0JIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0QXBwbGV0UGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwpOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpIT0tMSkNCi0Jew0KLQkJbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0SHR0cFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsLCAiUHJldmlvdXMiKTsNCi0JfQ0KLQkgICAgICAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfcHJldik7DQotICAgICB9DQotICAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGxvYWROZXh0KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICB7DQotDQotCWlmICgobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0Iik9PS0xKSAmJiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3Iik9PS0xKSkNCi0Jew0KLQkJcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKSE9LTEpDQotCXsNCi0JIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0QXBwbGV0UGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwpOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpIT0tMSkNCi0Jew0KLQkJbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0SHR0cFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsLCAiTmV4dCIpOw0KLQl9DQotICAgICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsNCi0NCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9uZXh0KTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZFBhcmVudCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX3VwKTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi1mdW5jdGlvbiB3aGVyZUFtSSgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotCXZhciBzdGF0dXMgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAJaWYoIHN0YXR1cyA9PSBmYWxzZSApDQotCXsNCi0JCWFsZXJ0KCB0b3BuYXZfanNfTUVTU0FHRTQgKTsNCi0JfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiB1cEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUudXBBcnJvdygpOw0KLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBkb3duQXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5kb3duQXJyb3coKTsNCi0gICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgIH0NCi0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgICBmdW5jdGlvbiBsZWZ0QXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmxlZnRBcnJvdygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICAgIGZ1bmN0aW9uIHJpZ2h0QXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnJpZ2h0QXJyb3coKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLQ0KLWZ1bmN0aW9uIGxvYWRUb3AoKQ0KLXsNCi0gIGlmKHBhcmVudC5mcmFtZXMubGVuZ3RoIT0wICYmIHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2MiKQ0KLSAgew0KLSAgICAgYWxlcnQodG9wbmF2X2pzX01FU1NBR0U1KTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOw0KLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArDQotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOw0KLQ0KLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsNCi0NCi0gICAgZm9yKGk9ZG9jdW1lbnQubGlua3MubGVuZ3RoLTE7aT49MDtpLS0pDQotICAgIHsNCi0gICAgICAgaWYoZG9jdW1lbnQubGlua3NbaV0uaHJlZi5pbmRleE9mKCJpbmRleC5odG0iKSE9LTEpDQotICAgICAgIHsNCi0gICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBkb2N1bWVudC5saW5rc1tpXS5ocmVmOw0KLSAgICAgICAgIGJyZWFrOw0KLSAgICAgICB9DQotICAgIH0NCi0NCi0gICAgaWYobmV3X29yeV9kb2NfbG9jIT1udWxsKQ0KLSAgICB7DQotCWlmKCBzZWxmLm5hbWUgPT0gIm9yeV9kb2MiICkNCi0Jew0KLQkJd2luZG93LmNsb3NlKCk7DQotCQl3aW5kb3cub3BlbiggbmV3X29yeV9kb2NfbG9jICk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCSAgICAgICAJdG9wLmxvY2F0aW9uID0gbmV3X29yeV9kb2NfbG9jOw0KLQl9DQotICAgIH0NCi0gICB9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIG9wZW5PcnkgKHBhZ2UsIHRhcmdldCkNCi17DQotICAgIGlmKCFpbmRleCB8fCBpbmRleC5jbG9zZWQpDQotICAgIHsNCi0gICAgICBpbmRleCA9IG9wZW4ocGFnZSx0YXJnZXQsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zOTUsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgaW5kZXguZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuU2VhcmNoKCkNCi17DQotICAgIGlmKCFzZWFyY2ggfHwgc2VhcmNoLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHNlYXJjaCA9IG9wZW4oIi4vYXBwbGV0L3NlYXJjaC5odG0iLCJzZWFyY2hfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPW5vLHdpZHRoPTYzMCxoZWlnaHQ9NDUwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzZWFyY2guZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuSW5kZXgoKQ0KLXsNCi0gICBvcGVuT3J5KCIuL2luZGV4L2luZGV4Lmh0bSIsImluZGV4X3dpbiIpOw0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuR2xvc3NhcnkoKQ0KLXsNCi0gaWYoIWdsb3NzYXJ5IHx8IGdsb3NzYXJ5LmNsb3NlZCkNCi0gICAgew0KLSAgICAgIGdsb3NzYXJ5ID0gb3BlbigiLi9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4Lmh0bSIsImdsb3NzYXJ5X3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zODUsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgZ2xvc3NhcnkuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBwcmludFBhZ2UoKQ0KLXsNCi0gcGFyZW50Lm9yeV9kb2MuZm9jdXMoKTsNCi0gcGFyZW50Lm9yeV9kb2MucHJpbnQoKTsNCi19DQotDQotDQotZnVuY3Rpb24gc2VuZEZlZWRiYWNrKHVybCkNCi17DQotCWlmICggdXJsID09IG51bGwgfHwgdXJsID09ICcnICkNCi0Jew0KLQkJcmV0dXJuOw0KLQl9DQotCQ0KLQlpZiAoIHVybC5pbmRleE9mKCJtYWlsdG86IikgPj0gMCApDQotCXsNCi0JCXNlbmRtYWlsKHVybCk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQkNCi0gCSAgICBpZighZmVlZGJhY2sgfHwgZmVlZGJhY2suY2xvc2VkKQ0KLQkgICAgew0KLQkgICAgICBmZWVkYmFjayA9IG9wZW4odXJsLCJmZWVkYmFja193aW4iLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9NjAwLGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLQkgICAgfQ0KLQkgICAgZWxzZQ0KLQkgICAgew0KLQkgICAgICBmZWVkYmFjay5mb2N1cygpOw0KLQkgICAgfQ0KLSAgICAJfQ0KLSAgICAJDQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHNlbmRtYWlsKHVybCkNCi17DQotCWlmICggdXJsLmluZGV4T2YoIj9zdWJqZWN0IikgPT0gLTEgKQ0KLQl7DQotCQl2YXIgbGluaz1wYXJlbnQub3J5X2RvYy5sb2NhdGlvbjsNCi0JCXVybCA9IHVybCArICc/c3ViamVjdD1GZWVkYmFjazogLSAnK2xpbms7DQotCX0NCi0JbG9jYXRpb24ucmVwbGFjZSh1cmwpOw0KLX0NCi0NCi0vL2NhbGN1bGF0ZXMgcmVsYXRpdmUgcGF0aA0KLS8vcGF0aCBtdXN0IGJlIGFsbCByZWxhdGl2ZSBmcm9tIHdlYnNpdGUgYmFzZSBvciBjb250YWluIGZ1bGwgdXJscw0KLWZ1bmN0aW9uIGNhbGN1bGF0ZVJlbGF0aXZlUGF0aChzb3VyY2VQYXRoLCB0YXJnZXRQYXRoKQ0KLXsNCi0JaWYgKHRhcmdldFBhdGguaW5kZXhPZigiaHR0cDovIikgIT0gLTEpDQotCXsNCi0JCXJldHVybiB0YXJnZXRQYXRoOw0KLQl9DQotDQotCS8vcmVwbGFjZSBhbGwgJ1wnIHdpdGggJy8nDQotCXNvdXJjZVBhdGggPSBzb3VyY2VQYXRoLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotCXRhcmdldFBhdGggPSB0YXJnZXRQYXRoLnJlcGxhY2UoL1xcL2csIi8iKTsNCi0NCi0JLy9hbGVydCgiUmVwbGFjZShTb3VyY2UpPT4iICsgc291cmNlUGF0aCk7DQotCS8vYWxlcnQoIlJlcGxhY2UodGFyZ2V0KT0+IiArIHRhcmdldFBhdGgpOw0KLQ0KLQ0KLQlzb3VyY2VBcnJheSA9IHNvdXJjZVBhdGguc3BsaXQoIi8iKTsNCi0JdGFyZ2V0QXJyYXkgPSB0YXJnZXRQYXRoLnNwbGl0KCIvIik7DQotDQotCXZhciB0aGVSZWxQYXRoID0gIiI7DQotDQotCS8vbG9vcCB1bnRpbCB3ZSBmaW5kIGEgZGlmZmVyZW5jZQ0KLQl2YXIgaWR4ID0gMDsNCi0JZm9yKGlkeCA9IDA7IGlkeCA8IHNvdXJjZUFycmF5Lmxlbmd0aDsgaWR4KyspDQotCXsNCi0JCWlmIChpZHggPiB0YXJnZXRQYXRoLmxlbmd0aCkNCi0JCXsNCi0JCQlicmVhazsNCi0JCX0NCi0NCi0JCWlmIChzb3VyY2VBcnJheVtpZHhdICE9IHRhcmdldEFycmF5W2lkeF0pDQotCQl7DQotCQkJYnJlYWs7DQotCQl9DQotCX0NCi0NCi0JLy9hcHBlbmQgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiAuLw0KLQl2YXIgbWF4SWR4ID0gc291cmNlQXJyYXkubGVuZ3RoIC0gMTsNCi0JZm9yICh2YXIgaSA9IGlkeDsgaSA8IG1heElkeDsgaSsrKQ0KLQl7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aCArICIuLyI7DQotDQotCQkvL2FsZXJ0KCJSZWxQYXRoPT4iICsgdGhlUmVsUGF0aCk7DQotCX0NCi0NCi0JLy9hcHBlbmQgYW55IHJlbWFpbmluZyB0YXJnZXQgcGF0aA0KLQl3aGlsZShpZHggPCB0YXJnZXRBcnJheS5sZW5ndGgpDQotCXsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgdGFyZ2V0QXJyYXlbaWR4KytdICsgIi8iOw0KLQkJLy9hbGVydCgiUmVsUGF0aChmaW5hbCk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL3JlbW92ZSB0aGUgbGFzdCBwYXRoIHNlcGFyYXRvcg0KLQlpZiAodGhlUmVsUGF0aC5sZW5ndGggPiAwKQ0KLQl7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKFRyaW0xKT0+IiArIHRoZVJlbFBhdGgpOw0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGguc3Vic3RyaW5nKDAsICh0aGVSZWxQYXRoLmxlbmd0aCAtIDEpKTsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7DQotCX0NCi0NCi0JLy9hbGVydCgiUmV0dXJuIFJlbGF0aXZlIFBhdGggPT4gIiArIHRoZVJlbFBhdGgpOw0KLQ0KLQlyZXR1cm4gdGhlUmVsUGF0aDsNCi19DQotDQotZnVuY3Rpb24gZ2V0VHJlZVBhdGgoKQ0KLXsNCi0JcmV0dXJuIGJ1aWxkVHJlZVBhdGhMb2NhdGlvbigpOw0KLX0NCi0NCi0vL1RoaXMgbWV0aG9kIHdpbGwgcmVtb3ZlIHRoZSB3ZWJzaXRlIGJhc2UgZnJvbSB0aGUgdXJsDQotZnVuY3Rpb24gY2FsY3VsYXRDdXJyZW50UGFnZShjdXJyVVJMKSB7DQotDQotCXZhciB0aGVDdXJyZW50TG9jYXRpb24gPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmOw0KLQkvL3JlcGxhY2UgYWxsICdcJyB3aXRoICcvJw0KLQl0aGVDdXJyZW50TG9jYXRpb24gPSB0aGVDdXJyZW50TG9jYXRpb24ucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0JY3VyclVSTCA9IGN1cnJVUkwucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0NCi0JdmFyIHNvdXJjZUFycmF5ID0gdGhlQ3VycmVudExvY2F0aW9uLnNwbGl0KCIvIik7DQotCXZhciBjdXJyQXJyYXkgPSBjdXJyVVJMLnNwbGl0KCIvIik7DQotDQotCXZhciBudW1Ub1JlbW92ZSA9IHNvdXJjZUFycmF5Lmxlbmd0aCAtIDI7DQotCXZhciBpZHggPSAwOw0KLQl2YXIgdGhlUmV0dXJuUGF0aCA9ICIiOw0KLQlmb3IgKGlkeCA9IG51bVRvUmVtb3ZlOyBpZHggPCBjdXJyQXJyYXkubGVuZ3RoOyBpZHgrKykgew0KLQkJaWYgKHRoZVJldHVyblBhdGggIT0gIiIpIHsNCi0JCQl0aGVSZXR1cm5QYXRoID0gdGhlUmV0dXJuUGF0aCArICIvIjsNCi0JCX0NCi0JCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgY3VyckFycmF5W2lkeF07DQotCX0NCi0NCi0JLy9hbGVydCgiQXJyYXlUZXN0PT4iICsgY3VyclVSTCArICIsIiArIHRoZVJldHVyblBhdGgpOw0KLQlyZXR1cm4gdGhlUmV0dXJuUGF0aDsNCi19DQotDQotLy9idWlsZHMgdHJlZSBwYXRoDQotZnVuY3Rpb24gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCkNCi17DQotCXZhciB0aGVEZWxpbWl0ZXIgPSAiIyMqIjsNCi0JdmFyIHRoaXNQYWdlID0gImFwcGxldC9ydXBfdG9wbmF2Lmh0bSI7DQotCXZhciB0aGVMb2MgPSAiIjsNCi0NCi0NCi0NCi0JaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotCXsNCi0JCXZhciB0aGVDdXJyZW50TG9jYXRpb24gPSBwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5sb2NhdGlvbi5ocmVmOw0KLQkJdGhpc1BhZ2UgPSBjYWxjdWxhdEN1cnJlbnRQYWdlKHRoZUN1cnJlbnRMb2NhdGlvbik7DQotDQotCQkvL2FsZXJ0KCJQYXRoTmFtZToiICsgdGhpc1BhZ2UpOw0KLQ0KLQkJLy9hbGVydCgiVHJ5aW5nIHRvIGZpbmQgdGhlIHBhdGggZm9yID0+IiArIHRoZUN1cnJlbnRMb2NhdGlvbik7DQotDQotCQl2YXIgdGhlUGF0aCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5nZXRUcmVlUGF0aEFycmF5KHRoZUN1cnJlbnRMb2NhdGlvbik7DQotDQotCQkvL2FsZXJ0KCJUaGUgVHJlZSBQYXRoOiAiICsgdGhlUGF0aCk7DQotDQotCQl0aGVQYXRoU3RyaW5nID0gdGhlUGF0aCArICIiOw0KLSAgICAJCWFycmF5RnJvbVN0cmluZyA9IHRoZVBhdGhTdHJpbmcuc3BsaXQodGhlRGVsaW1pdGVyKTsNCi0NCi0JCS8vYnVpbGQgdGhlIHBhdGggZnJvbSB0aGUgYXJyYXkNCi0JCS8vcGFyYW0gMSA9IHBhdGggdG8gaWNvbiwgcGFyYW0gMiAtIGxhYmVsLCBwYXJhbSAzIC0gcGF0aCB0byBmaWxlDQotCQl2YXIgY291bnRlciA9IDA7DQotCQl2YXIgdGhlTGFiZWw7DQotCQl2YXIgdGhlUmVsUGF0aDsNCi0JCWlmIChhcnJheUZyb21TdHJpbmcubGVuZ3RoID4gMikNCi0JCXsNCi0JCSAgIHRoZUxvYyA9ICIiOw0KLQkJICAgZm9yKHZhciBpID0gMDsgaSA8IChhcnJheUZyb21TdHJpbmcubGVuZ3RoIC0gMSkgOyBpKyspDQotCQkgICB7DQotCQkJLy9pdCdzIHRoZSBpY29uIHBhdGgNCi0JCQlpZiAoY291bnRlciA8IDIpDQotCQkJew0KLQkJCQlpZiAoY291bnRlciA+IDApDQotCQkJCXsNCi0JCQkJCXRoZUxvYyA9IHRoZUxvYyArICIgJmd0OyAiOw0KLQkJCQl9DQotDQotCQkJCS8vYWxlcnQoIkNhbGN1bGF0aW5nIHBhdGggZnJvbSgxKSAiICsgdGhpc1BhZ2UgKyAiID0+ICIgKyBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQ0KLQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldLmluZGV4T2YoIlxcIikgPT0gLTEgJiYgYXJyYXlGcm9tU3RyaW5nW2ldLmluZGV4T2YoIi8iKSA9PSAtMSkNCi0JCQkJew0KLQkJCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpDQotCQkJCQl7DQotCQkJCQkJdGhlUmVsUGF0aCA9ICJhcHBsZXQvaW1hZ2VzLyIgKyBhcnJheUZyb21TdHJpbmdbaV07DQotCQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgdGhlUmVsUGF0aCk7DQotCQkJCQl9DQotCQkJCQkvL2FsZXJ0KCJNb2RpZnlpbmcgUGF0aCA9PiAiICsgdGhlUmVsUGF0aCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQkJCQl9DQotDQotCQkJCWlmICh0aGVSZWxQYXRoICE9ICJudWxsIikNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCQkgIjxpbWcgYm9yZGVyPTAgc3JjPVwiIiArDQotCQkJCQkJIHRoZVJlbFBhdGggICsNCi0JCQkJCQkgIlwiPiI7DQotCQkJCX0NCi0NCi0JCQkJLy9hbGVydCgidGhlIGN1cnIgcGF0aD0+IiArIHRoZUxvYyk7DQotCQkJCWNvdW50ZXIgPSAyOw0KLQkJCX0NCi0JCQkvLyBpdCdzIHRoZSBsYWJlbA0KLQkJCWVsc2UgaWYgKGNvdW50ZXIgPT0gMikNCi0JCQl7DQotCQkJCXRoZUxhYmVsID0gYXJyYXlGcm9tU3RyaW5nW2ldOw0KLQkJCQljb3VudGVyID0gMzsNCi0JCQl9DQotCQkJZWxzZSBpZiAoY291bnRlciA9PSAzKQ0KLQkJCXsNCi0JCQkJLy9hbGVydCgiQ2FsY3VsYXRpbmcgcGF0aCBmcm9tKDMpICIgKyB0aGlzUGFnZSArICIgPT4gIiArIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0gIT0gIm51bGwiKQ0KLQkJCQl7DQotCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQkJCQkJaWYgKHRoZVJlbFBhdGggIT0gIiIpIHsNCi0JCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkJIjxhIGNsYXNzPVwiaG90dGV4dFwiIHRhcmdldD1cIm9yeV9kb2NcIiBocmVmPVwiIiArDQotCQkJCQkJCSB0aGVSZWxQYXRoICsNCi0JCQkJCSAJCSJcIj4iICsNCi0JCQkJCSAJCXRoZUxhYmVsICsNCi0JCQkJCSAJCSI8XC9hPlxuIjsNCi0JCQkJCSB9DQotCQkJCQkgZWxzZSB7DQotCQkJCQkgCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCI+IiAgKw0KLQkJCQkJIAkJdGhlTGFiZWwgKw0KLQkJCQkJIAkJIjxcL2E+XG4iOw0KLQkJCQkJIH0NCi0JCQkJfQ0KLQkJCQllbHNlDQotCQkJCXsNCi0JCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCSI8YSBjbGFzcz1cImhvdHRleHRcIj4iICArDQotCQkJCQkgCXRoZUxhYmVsICsNCi0JCQkJCSAJIjxcL2E+XG4iOw0KLQkJCQl9DQotCQkJCS8vYWxlcnQoInRoZSBjdXJyIHBhdGg9PiIgKyB0aGVMb2MpOw0KLQkJCQljb3VudGVyID0gMTsNCi0JCQkJdGhlUmVsUGF0aCA9ICJudWxsIjsNCi0JCQkJdGhlTGFiZWwgPSAibnVsbCI7DQotCQkJfQ0KLQkJICAgfQ0KLQ0KLQkJLy9hbGVydCgiRmluaXNoZWQgQnVpbGRpbmcgPT4gIiArIHRoZUxvYyk7DQotCQl9DQotDQotCX0NCi0NCi0JLy90aGVMb2MgPSAiQ3VycmVudCBMb2NhdGlvbiZuYnNwOyYjMDQ1OyZuYnNwOyIgKyB0aGVMb2M7DQotDQotCS8vYWxlcnQoInRoZSBGaW5hbCBTdHJpbmc9PiIgKyB0aGVMb2MpOw0KLQ0KLQkvL2RvY3VtZW50LndyaXRlKHRoZUxvYyk7DQotCXJldHVybiB0aGVMb2M7DQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfamEuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X2phLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmJmZjg3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfamEuanMKKysrIC9kZXYvbnVsbApAQCAtMSw3ODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gbWVzc2FnZXMgdG8gYmUgZXh0ZXJuaXplZA0KLS8vIGhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMNCi0NCi12YXIgdG9wbmF2X2pzX01FU1NBR0UxID0gIlRyZWVCcm93c2Ug44Gu44Ot44O844OJ44Gv5a6M5LqG44GX44Gm44GE44G+44Gb44KT44CCXG7jgYrlvoXjgaHjgY/jgaDjgZXjgYTjgIIiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTIgPSAi44GT44Gu44Oa44O844K444GrICd7MH0nIOODmuODvOOCuOOBr+OBguOCiuOBvuOBm+OCk+OAglxu5Yil44Gu44OK44OT44Ky44O844K344On44Oz44O744Oc44K/44Oz44KS44GK6Kmm44GX44GP44Gg44GV44GE44CCICI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMyA9ICJ7MH0g44Oa44O844K444Gv44GC44KK44G+44Gb44KT44CCIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0VfcHJldiA9ICLliY3jgbgiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9uZXh0ID0gIuasoeOBuCI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3VwID0gIuS4iuOBuCI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNCA9ICLjg4Tjg6rjg7zjg7vjg5bjg6njgqbjgrbjg7zjgavnj77ooYzjg5XjgqHjgqTjg6vjgYzjgYLjgorjgb7jgZvjgpPjgIIgIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0U1ID0gIuWFrOmWi+OBleOCjOOBn+OCteOCpOODiOOBr+ODleODrOODvOODoOOCkuS9v+eUqOOBl+OBpuaXouOBq+ihqOekuuOBleOCjOOBpuOBhOOBvuOBmSAiOw0KLQ0KLWZ1bmN0aW9uIGZvcm1hdFN0cmluZyhtZXNzYWdlLCByZXBsYWNlMCkNCi17DQotICAgCXJldHVybiBtZXNzYWdlLnJlcGxhY2UoL1x7MFx9LywgcmVwbGFjZTApOw0KLX0gDQotDQotLy8gdGhpcyBzY3JpcHQgaXMgZm9yIHRoZSB0b3BuYXYuaHRtbA0KLS8vIHRoaXMgaXMgTk9UIGZvciBnZW5lcmFsIHVzZQ0KLU1TRlBob3ZlciA9DQotKCgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gMyApKSB8fA0KLSAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApKSk7DQotDQotICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpDQotICB7DQotICAgICB2YXIgYT1uZXcgSW1hZ2UoKTsNCi0gICAgIGEuc3JjPWltZzsNCi0gICAgIHJldHVybiBhOw0KLSAgfQ0KLSAgDQotdmFyIHRvdXIgPSAwOw0KLQ0KLWZ1bmN0aW9uIG9wZW5GaXJzdFRvdXIgKCkNCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNA0KLXsNCi1pZighdG91ciB8fCB0b3VyPT1udWxsIHx8IHRvdXIuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuVG91ciAoKQ0KLS8vIG9wZW4gdGhlIGd1aWRlZCB0b3VyIC9oYWFrYW4gOTkwMzI0DQotew0KLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpDQotICAgIHsNCi0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLS8vQWRkaXRpb24gYnkgQ2hpbmggVm8gMDMvMjgvMDANCi0gZnVuY3Rpb24gZGlzcGxheUdldHRpbmdTdGFydGVkKCkNCi0gew0KLSAJdmFyIHBhZ2VQYXR0ZXJuID0gL292dV9wcm9jLzsNCi0gCXZhciBtYWluUGFnZSA9IHdpbmRvdy5wYXJlbnQub3J5X2RvYy5sb2NhdGlvbjsNCi0NCi0gCWlmICggcGFnZVBhdHRlcm4udGVzdCggbWFpblBhZ2UgKSApIHsNCi0gICAgCWlmIChnZXRDb29raWUoIlJVUCIpICE9ICJjaGVja2VkIikgeyBvcGVuRmlyc3RUb3VyKCk7IH0NCi0JfQ0KLQllbHNlIHsNCi0JCXNldFRpbWVvdXQoICJkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKSIsIDEwMDAgKTsNCi0JfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRDb29raWUgKG5hbWUpDQotew0KLSAgdmFyIGRjb29raWUgPSBkb2N1bWVudC5jb29raWU7DQotICB2YXIgY25hbWUgPSBuYW1lICsgIj0iOw0KLSAgdmFyIGNsZW4gPSBkY29va2llLmxlbmd0aDsNCi0gIHZhciBjYmVnaW4gPSAwOw0KLSAgd2hpbGUgKGNiZWdpbiA8IGNsZW4pDQotICB7DQotICAgIHZhciB2YmVnaW4gPSBjYmVnaW4gKyBjbmFtZS5sZW5ndGg7DQotICAgIGlmIChkY29va2llLnN1YnN0cmluZyhjYmVnaW4sIHZiZWdpbikgPT0gY25hbWUpDQotICAgIHsNCi0gICAgICB2YXIgdmVuZCA9IGRjb29raWUuaW5kZXhPZiAoIjsiLCB2YmVnaW4pOw0KLSAgICAgIGlmICh2ZW5kID09IC0xKQ0KLSAgICAgIHsNCi0gICAgICAgIHZlbmQgPSBjbGVuOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gdW5lc2NhcGUoZGNvb2tpZS5zdWJzdHJpbmcodmJlZ2luLCB2ZW5kKSk7DQotICAgIH0NCi0gICAgY2JlZ2luID0gZGNvb2tpZS5pbmRleE9mKCIgIiwgY2JlZ2luKSArIDE7DQotICAgIGlmIChjYmVnaW4gPT0gMCkNCi0gICAgew0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9DQotICByZXR1cm4gbnVsbDsNCi0gfQ0KLQ0KLQ0KLSAgdmFyIGluZGV4PW51bGw7DQotICB2YXIgdG91cj1udWxsOw0KLSAgdmFyIHNlYXJjaD1udWxsOw0KLSAgdmFyIGdsb3NzYXJ5PW51bGw7DQotICB2YXIgZmVlZGJhY2s9bnVsbDsNCi0gIHZhciB0cmVlTG9hZGVkPWZhbHNlOw0KLSAgZnVuY3Rpb24gY2hlY2tUcmVlTG9hZGVkKCkNCi0gIHsNCi0gICAgaWYodHJlZUxvYWRlZCkNCi0gICAgew0KLSAgICAgIHJldHVybiB0cmVlTG9hZGVkOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICBpZihwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQgIT0gbnVsbA0KLSAgICAgICAgJiYgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHkoKSkNCi0gICAgIHsNCi0gICAgICAgdHJlZUxvYWRlZCA9IHRydWU7DQotICAgICB9DQotICAgICAqLw0KLSAgICAgaWYocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0ICE9IG51bGwpDQotICAgICB7DQotICAgICAgCXZhciBtZXRob2QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHk7DQotCSBpZiAobWV0aG9kICE9ICJ1bmRlZmluZWQiKSB7DQotCQlpZiAocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHkoKSkNCi0JCXsNCi0gICAgICAgCQkJdHJlZUxvYWRlZCA9IHRydWU7DQotCQl9DQotDQotCSAgfQ0KLQ0KLSAgICAgfQ0KLQ0KLSAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7DQotICAgfQ0KLQ0KLQ0KLSAgICBmdW5jdGlvbiBzaG93QWxlcnROb3RMb2FkZWQoKQ0KLSAgICB7DQotICAgICAgYWxlcnQodG9wbmF2X2pzX01FU1NBR0UxKTsNCi0gICAgfQ0KLQ0KLWZ1bmN0aW9uIHNob3dTdGF0dXNOb3RMb2FkZWQoKQ0KLSAgew0KLSAgICAvL3JldHVybiAiVGhlIFRyZWVCcm93c2UgaXMgbm90IHlldCBsb2FkZWQhXG5QbGVhc2Ugd2FpdCEiOw0KLSAgICByZXR1cm4gdG9wbmF2X2pzX01FU1NBR0UxOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd0FsZXJ0Tm9QYWdlKHRleHQpDQotICB7DQotICAgICB2YXIgcGFyZW50TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgICAgLy9hbGVydCgiVGhlcmUgaXMgbm8gJyIgKyB0ZXh0ICsgIicgcGFnZSBmb3IgdGhpcyBwYWdlLlxuVHJ5IG9uZSBvZiB0aGUgb3RoZXIgbmF2aWdhdGlvbiBidXR0b25zLiIpOw0KLSAgICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICAgLy9hbGVydCgiVGhlcmUgaXMgbm8gJyIgKyB0ZXh0ICsgIicgcGFnZSBmb3IgdGhpcyBwYWdlLlxuVHJ5IG9uZSBvZiB0aGUgb3RoZXIgbmF2aWdhdGlvbiBidXR0b25zIik7DQotICAgICAgICAgYWxlcnQoZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMiwgdGV4dCkpOw0KLSAgICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1N0YXR1c05vUGFnZSh0ZXh0KQ0KLSAgew0KLQ0KLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbXNnOw0KLSAgICAgaWYocGFyZW50TGFiZWwhPSIiICYmIHBhcmVudExhYmVsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICAgLy9tc2cgPSAiVGhlcmUgaXMgbm8gIiArIHRleHQgKyAiIHBhZ2UhIjsNCi0gICAgICAgIG1zZyA9IGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTMsIHRleHQpOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgLy9tc2cgPSAiVGhlcmUgaXMgbm8gIiArIHRleHQgKyAiIHBhZ2UhIjsNCi0gICAgICAgIG1zZyA9IGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTMsIHRleHQpOw0KLSAgICAgfQ0KLQ0KLSAgICAgcmV0dXJuIG1zZzsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dQYXJlbnRMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIHBhcmVudHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwYXJlbnR1cmwhPSIiICYmIHBhcmVudHVybCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJ1cCIpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dIb21lTGFiZWwoKQ0KLSAgew0KLSAgICBzZWxmLnN0YXR1cyA9ICLjg5vjg7zjg6AiOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1ByZXZpb3VzTGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIHByZXZ1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwcmV2dXJsIT0iIiAmJiBwcmV2dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJwcmV2aW91cyIpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dOZXh0TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgbmV4dHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIG5leHR1cmwhPSIiICYmIG5leHR1cmwhPW51bGwpDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgICB9DQotICAgICAgZWxzZQ0KLSAgICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb1BhZ2UoIm5leHQiKTsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZFByZXZpb3VzKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJQcmV2aW91cyIpOw0KLQl9DQotCSAgICAgIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9wcmV2KTsNCi0gICAgIH0NCi0gICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZE5leHQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJOZXh0Iik7DQotCX0NCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLQ0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX25leHQpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUGFyZW50KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfdXApOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0JdmFyIHN0YXR1cyA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgIAlpZiggc3RhdHVzID09IGZhbHNlICkNCi0Jew0KLQkJYWxlcnQoIHRvcG5hdl9qc19NRVNTQUdFNCApOw0KLQl9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHVwQXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS51cEFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGRvd25BcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmRvd25BcnJvdygpOw0KLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgfQ0KLQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICAgIGZ1bmN0aW9uIGxlZnRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUubGVmdEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gcmlnaHRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUucmlnaHRBcnJvdygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotDQotZnVuY3Rpb24gbG9hZFRvcCgpDQotew0KLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIpDQotICB7DQotICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTUpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7DQotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7DQotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsNCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7DQotDQotICAgIHZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOw0KLQ0KLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkNCi0gICAgew0KLSAgICAgICBpZihkb2N1bWVudC5saW5rc1tpXS5ocmVmLmluZGV4T2YoImluZGV4Lmh0bSIpIT0tMSkNCi0gICAgICAgew0KLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IGRvY3VtZW50LmxpbmtzW2ldLmhyZWY7DQotICAgICAgICAgYnJlYWs7DQotICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7DQotCX0NCi0gICAgfQ0KLSAgIH0NCi19DQotDQotDQotZnVuY3Rpb24gb3Blbk9yeSAocGFnZSwgdGFyZ2V0KQ0KLXsNCi0gICAgaWYoIWluZGV4IHx8IGluZGV4LmNsb3NlZCkNCi0gICAgew0KLSAgICAgIGluZGV4ID0gb3BlbihwYWdlLHRhcmdldCwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM5NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBpbmRleC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5TZWFyY2goKQ0KLXsNCi0gICAgaWYoIXNlYXJjaCB8fCBzZWFyY2guY2xvc2VkKQ0KLSAgICB7DQotICAgICAgc2VhcmNoID0gb3BlbigiLi9hcHBsZXQvc2VhcmNoLmh0bSIsInNlYXJjaF9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9bm8sd2lkdGg9NjMwLGhlaWdodD00NTAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNlYXJjaC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5JbmRleCgpDQotew0KLSAgIG9wZW5PcnkoIi4vaW5kZXgvaW5kZXguaHRtIiwiaW5kZXhfd2luIik7DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5HbG9zc2FyeSgpDQotew0KLSBpZighZ2xvc3NhcnkgfHwgZ2xvc3NhcnkuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgZ2xvc3NhcnkgPSBvcGVuKCIuL3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXguaHRtIiwiZ2xvc3Nhcnlfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM4NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBnbG9zc2FyeS5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIHByaW50UGFnZSgpDQotew0KLSBwYXJlbnQub3J5X2RvYy5mb2N1cygpOw0KLSBwYXJlbnQub3J5X2RvYy5wcmludCgpOw0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kRmVlZGJhY2sodXJsKQ0KLXsNCi0JaWYgKCB1cmwgPT0gbnVsbCB8fCB1cmwgPT0gJycgKQ0KLQl7DQotCQlyZXR1cm47DQotCX0NCi0JDQotCWlmICggdXJsLmluZGV4T2YoIm1haWx0bzoiKSA+PSAwICkNCi0Jew0KLQkJc2VuZG1haWwodXJsKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCQ0KLSAJICAgIGlmKCFmZWVkYmFjayB8fCBmZWVkYmFjay5jbG9zZWQpDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrID0gb3Blbih1cmwsImZlZWRiYWNrX3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD02MDAsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotCSAgICB9DQotCSAgICBlbHNlDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrLmZvY3VzKCk7DQotCSAgICB9DQotICAgIAl9DQotICAgIAkNCi19DQotDQotDQotZnVuY3Rpb24gc2VuZG1haWwodXJsKQ0KLXsNCi0JaWYgKCB1cmwuaW5kZXhPZigiP3N1YmplY3QiKSA9PSAtMSApDQotCXsNCi0JCXZhciBsaW5rPXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQkJdXJsID0gdXJsICsgJz9zdWJqZWN0PUZlZWRiYWNrOiAtICcrbGluazsNCi0JfQ0KLQlsb2NhdGlvbi5yZXBsYWNlKHVybCk7DQotfQ0KLQ0KLS8vY2FsY3VsYXRlcyByZWxhdGl2ZSBwYXRoDQotLy9wYXRoIG11c3QgYmUgYWxsIHJlbGF0aXZlIGZyb20gd2Vic2l0ZSBiYXNlIG9yIGNvbnRhaW4gZnVsbCB1cmxzDQotZnVuY3Rpb24gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHNvdXJjZVBhdGgsIHRhcmdldFBhdGgpDQotew0KLQlpZiAodGFyZ2V0UGF0aC5pbmRleE9mKCJodHRwOi8iKSAhPSAtMSkNCi0Jew0KLQkJcmV0dXJuIHRhcmdldFBhdGg7DQotCX0NCi0NCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0Jc291cmNlUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0JdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXFwvZywiLyIpOw0KLQ0KLQkvL2FsZXJ0KCJSZXBsYWNlKFNvdXJjZSk9PiIgKyBzb3VyY2VQYXRoKTsNCi0JLy9hbGVydCgiUmVwbGFjZSh0YXJnZXQpPT4iICsgdGFyZ2V0UGF0aCk7DQotDQotDQotCXNvdXJjZUFycmF5ID0gc291cmNlUGF0aC5zcGxpdCgiLyIpOw0KLQl0YXJnZXRBcnJheSA9IHRhcmdldFBhdGguc3BsaXQoIi8iKTsNCi0NCi0JdmFyIHRoZVJlbFBhdGggPSAiIjsNCi0NCi0JLy9sb29wIHVudGlsIHdlIGZpbmQgYSBkaWZmZXJlbmNlDQotCXZhciBpZHggPSAwOw0KLQlmb3IoaWR4ID0gMDsgaWR4IDwgc291cmNlQXJyYXkubGVuZ3RoOyBpZHgrKykNCi0Jew0KLQkJaWYgKGlkeCA+IHRhcmdldFBhdGgubGVuZ3RoKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQ0KLQkJaWYgKHNvdXJjZUFycmF5W2lkeF0gIT0gdGFyZ2V0QXJyYXlbaWR4XSkNCi0JCXsNCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQ0KLQkvL2FwcGVuZCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIC4vDQotCXZhciBtYXhJZHggPSBzb3VyY2VBcnJheS5sZW5ndGggLSAxOw0KLQlmb3IgKHZhciBpID0gaWR4OyBpIDwgbWF4SWR4OyBpKyspDQotCXsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgIi4vIjsNCi0NCi0JCS8vYWxlcnQoIlJlbFBhdGg9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FwcGVuZCBhbnkgcmVtYWluaW5nIHRhcmdldCBwYXRoDQotCXdoaWxlKGlkeCA8IHRhcmdldEFycmF5Lmxlbmd0aCkNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyB0YXJnZXRBcnJheVtpZHgrK10gKyAiLyI7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKGZpbmFsKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vcmVtb3ZlIHRoZSBsYXN0IHBhdGggc2VwYXJhdG9yDQotCWlmICh0aGVSZWxQYXRoLmxlbmd0aCA+IDApDQotCXsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aC5zdWJzdHJpbmcoMCwgKHRoZVJlbFBhdGgubGVuZ3RoIC0gMSkpOw0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJSZXR1cm4gUmVsYXRpdmUgUGF0aCA9PiAiICsgdGhlUmVsUGF0aCk7DQotDQotCXJldHVybiB0aGVSZWxQYXRoOw0KLX0NCi0NCi1mdW5jdGlvbiBnZXRUcmVlUGF0aCgpDQotew0KLQlyZXR1cm4gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCk7DQotfQ0KLQ0KLS8vVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgdGhlIHdlYnNpdGUgYmFzZSBmcm9tIHRoZSB1cmwNCi1mdW5jdGlvbiBjYWxjdWxhdEN1cnJlbnRQYWdlKGN1cnJVUkwpIHsNCi0NCi0JdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCS8vcmVwbGFjZSBhbGwgJ1wnIHdpdGggJy8nDQotCXRoZUN1cnJlbnRMb2NhdGlvbiA9IHRoZUN1cnJlbnRMb2NhdGlvbi5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQljdXJyVVJMID0gY3VyclVSTC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQ0KLQl2YXIgc291cmNlQXJyYXkgPSB0aGVDdXJyZW50TG9jYXRpb24uc3BsaXQoIi8iKTsNCi0JdmFyIGN1cnJBcnJheSA9IGN1cnJVUkwuc3BsaXQoIi8iKTsNCi0NCi0JdmFyIG51bVRvUmVtb3ZlID0gc291cmNlQXJyYXkubGVuZ3RoIC0gMjsNCi0JdmFyIGlkeCA9IDA7DQotCXZhciB0aGVSZXR1cm5QYXRoID0gIiI7DQotCWZvciAoaWR4ID0gbnVtVG9SZW1vdmU7IGlkeCA8IGN1cnJBcnJheS5sZW5ndGg7IGlkeCsrKSB7DQotCQlpZiAodGhlUmV0dXJuUGF0aCAhPSAiIikgew0KLQkJCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgIi8iOw0KLQkJfQ0KLQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyBjdXJyQXJyYXlbaWR4XTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJBcnJheVRlc3Q9PiIgKyBjdXJyVVJMICsgIiwiICsgdGhlUmV0dXJuUGF0aCk7DQotCXJldHVybiB0aGVSZXR1cm5QYXRoOw0KLX0NCi0NCi0vL2J1aWxkcyB0cmVlIHBhdGgNCi1mdW5jdGlvbiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKQ0KLXsNCi0JdmFyIHRoZURlbGltaXRlciA9ICIjIyoiOw0KLQl2YXIgdGhpc1BhZ2UgPSAiYXBwbGV0L3J1cF90b3BuYXYuaHRtIjsNCi0JdmFyIHRoZUxvYyA9ICIiOw0KLQ0KLQ0KLQ0KLQlpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0Jew0KLQkJdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCQl0aGlzUGFnZSA9IGNhbGN1bGF0Q3VycmVudFBhZ2UodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlBhdGhOYW1lOiIgKyB0aGlzUGFnZSk7DQotDQotCQkvL2FsZXJ0KCJUcnlpbmcgdG8gZmluZCB0aGUgcGF0aCBmb3IgPT4iICsgdGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCXZhciB0aGVQYXRoID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmdldFRyZWVQYXRoQXJyYXkodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlRoZSBUcmVlIFBhdGg6ICIgKyB0aGVQYXRoKTsNCi0NCi0JCXRoZVBhdGhTdHJpbmcgPSB0aGVQYXRoICsgIiI7DQotICAgIAkJYXJyYXlGcm9tU3RyaW5nID0gdGhlUGF0aFN0cmluZy5zcGxpdCh0aGVEZWxpbWl0ZXIpOw0KLQ0KLQkJLy9idWlsZCB0aGUgcGF0aCBmcm9tIHRoZSBhcnJheQ0KLQkJLy9wYXJhbSAxID0gcGF0aCB0byBpY29uLCBwYXJhbSAyIC0gbGFiZWwsIHBhcmFtIDMgLSBwYXRoIHRvIGZpbGUNCi0JCXZhciBjb3VudGVyID0gMDsNCi0JCXZhciB0aGVMYWJlbDsNCi0JCXZhciB0aGVSZWxQYXRoOw0KLQkJaWYgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggPiAyKQ0KLQkJew0KLQkJICAgdGhlTG9jID0gIiI7DQotCQkgICBmb3IodmFyIGkgPSAwOyBpIDwgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggLSAxKSA7IGkrKykNCi0JCSAgIHsNCi0JCQkvL2l0J3MgdGhlIGljb24gcGF0aA0KLQkJCWlmIChjb3VudGVyIDwgMikNCi0JCQl7DQotCQkJCWlmIChjb3VudGVyID4gMCkNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsgIiAmZ3Q7ICI7DQotCQkJCX0NCi0NCi0JCQkJLy9hbGVydCgiQ2FsY3VsYXRpbmcgcGF0aCBmcm9tKDEpICIgKyB0aGlzUGFnZSArICIgPT4gIiArIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotDQotCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiXFwiKSA9PSAtMSAmJiBhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiLyIpID09IC0xKQ0KLQkJCQl7DQotCQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJCXsNCi0JCQkJCQl0aGVSZWxQYXRoID0gImFwcGxldC9pbWFnZXMvIiArIGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCB0aGVSZWxQYXRoKTsNCi0JCQkJCX0NCi0JCQkJCS8vYWxlcnQoIk1vZGlmeWluZyBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCX0NCi0NCi0JCQkJaWYgKHRoZVJlbFBhdGggIT0gIm51bGwiKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJCSAiPGltZyBib3JkZXI9MCBzcmM9XCIiICsNCi0JCQkJCQkgdGhlUmVsUGF0aCAgKw0KLQkJCQkJCSAiXCI+IjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDI7DQotCQkJfQ0KLQkJCS8vIGl0J3MgdGhlIGxhYmVsDQotCQkJZWxzZSBpZiAoY291bnRlciA9PSAyKQ0KLQkJCXsNCi0JCQkJdGhlTGFiZWwgPSBhcnJheUZyb21TdHJpbmdbaV07DQotCQkJCWNvdW50ZXIgPSAzOw0KLQkJCX0NCi0JCQllbHNlIGlmIChjb3VudGVyID09IDMpDQotCQkJew0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMykgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCQlpZiAodGhlUmVsUGF0aCAhPSAiIikgew0KLQkJCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCIgdGFyZ2V0PVwib3J5X2RvY1wiIGhyZWY9XCIiICsNCi0JCQkJCQkJIHRoZVJlbFBhdGggKw0KLQkJCQkJIAkJIlwiPiIgKw0KLQkJCQkJIAkJdGhlTGFiZWwgKw0KLQkJCQkJIAkJIjxcL2E+XG4iOw0KLQkJCQkJIH0NCi0JCQkJCSBlbHNlIHsNCi0JCQkJCSAJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIj4iICArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQl9DQotCQkJCWVsc2UNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJdGhlTGFiZWwgKw0KLQkJCQkJIAkiPFwvYT5cbiI7DQotCQkJCX0NCi0JCQkJLy9hbGVydCgidGhlIGN1cnIgcGF0aD0+IiArIHRoZUxvYyk7DQotCQkJCWNvdW50ZXIgPSAxOw0KLQkJCQl0aGVSZWxQYXRoID0gIm51bGwiOw0KLQkJCQl0aGVMYWJlbCA9ICJudWxsIjsNCi0JCQl9DQotCQkgICB9DQotDQotCQkvL2FsZXJ0KCJGaW5pc2hlZCBCdWlsZGluZyA9PiAiICsgdGhlTG9jKTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQkvL3RoZUxvYyA9ICJDdXJyZW50IExvY2F0aW9uJm5ic3A7JiMwNDU7Jm5ic3A7IiArIHRoZUxvYzsNCi0NCi0JLy9hbGVydCgidGhlIEZpbmFsIFN0cmluZz0+IiArIHRoZUxvYyk7DQotDQotCS8vZG9jdW1lbnQud3JpdGUodGhlTG9jKTsNCi0JcmV0dXJuIHRoZUxvYzsNCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9rby5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfa28uanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYjNmYTAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9rby5qcworKysgL2Rldi9udWxsCkBAIC0xLDc4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkDQotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLQ0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTEgPSAi7Yq466asIOu4jOudvOyasOyggOqwgCDslYTsp4Eg66Gc65Oc65CY7KeAIOyViuyVmOyKteuLiOuLpCFcbuq4sOuLpOumrOyLreyLnOyYpC4iOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTIgPSAi7J20IO2OmOydtOyngOyXkCAnezB9J+ydtCjqsIApIOyXhuyKteuLiOuLpC5cbuuLpOuluCDtg5Dsg4kg64uo7LaU66W8IOyCrOyaqe2VmOyLreyLnOyYpC4iOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTMgPSAiezB9IO2OmOydtOyngOqwgCDsl4bsirXri4jri6QhIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0VfcHJldiA9ICLsnbTsoIQiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9uZXh0ID0gIuuLpOydjCI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3VwID0gIuychOuhnCI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNCA9ICLtmITsnqwg7YyM7J287J20IO2KuOumrCDruIzrnbzsmrDsoIDsl5Ag7JeG7Iq164uI64ukLiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNSA9ICLqs7XqsJzrkJwg7IKs7J207Yq464qUIO2UhOugiOyehOyXkCDsnbTrr7gg7ZGc7Iuc65CY7JeI7Iq164uI64ukLiI7DQotDQotZnVuY3Rpb24gZm9ybWF0U3RyaW5nKG1lc3NhZ2UsIHJlcGxhY2UwKQ0KLXsNCi0gICAJcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgvXHswXH0vLCByZXBsYWNlMCk7DQotfSANCi0NCi0vLyB0aGlzIHNjcmlwdCBpcyBmb3IgdGhlIHRvcG5hdi5odG1sDQotLy8gdGhpcyBpcyBOT1QgZm9yIGdlbmVyYWwgdXNlDQotTVNGUGhvdmVyID0NCi0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8DQotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsNCi0NCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykNCi0gIHsNCi0gICAgIHZhciBhPW5ldyBJbWFnZSgpOw0KLSAgICAgYS5zcmM9aW1nOw0KLSAgICAgcmV0dXJuIGE7DQotICB9DQotICANCi12YXIgdG91ciA9IDA7DQotDQotZnVuY3Rpb24gb3BlbkZpcnN0VG91ciAoKQ0KLS8vIG9wZW4gdGhlIGd1aWRlZCB0b3VyIC9oYWFrYW4gOTkwMzI0DQotew0KLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpDQotICAgIHsNCi0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5Ub3VyICgpDQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQNCi17DQotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHRvdXIgPSBvcGVuKCIuL3RvdXIvdG91ci5odG0iLCJ0b3VyX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MzUwLGhlaWdodD03MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotLy9BZGRpdGlvbiBieSBDaGluaCBWbyAwMy8yOC8wMA0KLSBmdW5jdGlvbiBkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKQ0KLSB7DQotIAl2YXIgcGFnZVBhdHRlcm4gPSAvb3Z1X3Byb2MvOw0KLSAJdmFyIG1haW5QYWdlID0gd2luZG93LnBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQ0KLSAJaWYgKCBwYWdlUGF0dGVybi50ZXN0KCBtYWluUGFnZSApICkgew0KLSAgICAJaWYgKGdldENvb2tpZSgiUlVQIikgIT0gImNoZWNrZWQiKSB7IG9wZW5GaXJzdFRvdXIoKTsgfQ0KLQl9DQotCWVsc2Ugew0KLQkJc2V0VGltZW91dCggImRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpIiwgMTAwMCApOw0KLQl9DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldENvb2tpZSAobmFtZSkNCi17DQotICB2YXIgZGNvb2tpZSA9IGRvY3VtZW50LmNvb2tpZTsNCi0gIHZhciBjbmFtZSA9IG5hbWUgKyAiPSI7DQotICB2YXIgY2xlbiA9IGRjb29raWUubGVuZ3RoOw0KLSAgdmFyIGNiZWdpbiA9IDA7DQotICB3aGlsZSAoY2JlZ2luIDwgY2xlbikNCi0gIHsNCi0gICAgdmFyIHZiZWdpbiA9IGNiZWdpbiArIGNuYW1lLmxlbmd0aDsNCi0gICAgaWYgKGRjb29raWUuc3Vic3RyaW5nKGNiZWdpbiwgdmJlZ2luKSA9PSBjbmFtZSkNCi0gICAgew0KLSAgICAgIHZhciB2ZW5kID0gZGNvb2tpZS5pbmRleE9mICgiOyIsIHZiZWdpbik7DQotICAgICAgaWYgKHZlbmQgPT0gLTEpDQotICAgICAgew0KLSAgICAgICAgdmVuZCA9IGNsZW47DQotICAgICAgfQ0KLSAgICAgIHJldHVybiB1bmVzY2FwZShkY29va2llLnN1YnN0cmluZyh2YmVnaW4sIHZlbmQpKTsNCi0gICAgfQ0KLSAgICBjYmVnaW4gPSBkY29va2llLmluZGV4T2YoIiAiLCBjYmVnaW4pICsgMTsNCi0gICAgaWYgKGNiZWdpbiA9PSAwKQ0KLSAgICB7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiBudWxsOw0KLSB9DQotDQotDQotICB2YXIgaW5kZXg9bnVsbDsNCi0gIHZhciB0b3VyPW51bGw7DQotICB2YXIgc2VhcmNoPW51bGw7DQotICB2YXIgZ2xvc3Nhcnk9bnVsbDsNCi0gIHZhciBmZWVkYmFjaz1udWxsOw0KLSAgdmFyIHRyZWVMb2FkZWQ9ZmFsc2U7DQotICBmdW5jdGlvbiBjaGVja1RyZWVMb2FkZWQoKQ0KLSAgew0KLSAgICBpZih0cmVlTG9hZGVkKQ0KLSAgICB7DQotICAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsDQotICAgICAgICAmJiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeSgpKQ0KLSAgICAgew0KLSAgICAgICB0cmVlTG9hZGVkID0gdHJ1ZTsNCi0gICAgIH0NCi0gICAgICovDQotICAgICBpZihwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQgIT0gbnVsbCkNCi0gICAgIHsNCi0gICAgICAJdmFyIG1ldGhvZCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeTsNCi0JIGlmIChtZXRob2QgIT0gInVuZGVmaW5lZCIpIHsNCi0JCWlmIChwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeSgpKQ0KLQkJew0KLSAgICAgICAJCQl0cmVlTG9hZGVkID0gdHJ1ZTsNCi0JCX0NCi0NCi0JICB9DQotDQotICAgICB9DQotDQotICAgICByZXR1cm4gdHJlZUxvYWRlZDsNCi0gICB9DQotDQotDQotICAgIGZ1bmN0aW9uIHNob3dBbGVydE5vdExvYWRlZCgpDQotICAgIHsNCi0gICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTEpOw0KLSAgICB9DQotDQotZnVuY3Rpb24gc2hvd1N0YXR1c05vdExvYWRlZCgpDQotICB7DQotICAgIC8vcmV0dXJuICJUaGUgVHJlZUJyb3dzZSBpcyBub3QgeWV0IGxvYWRlZCFcblBsZWFzZSB3YWl0ISI7DQotICAgIHJldHVybiB0b3BuYXZfanNfTUVTU0FHRTE7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93QWxlcnROb1BhZ2UodGV4dCkNCi0gIHsNCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYocGFyZW50TGFiZWwhPSIiICYmIHBhcmVudExhYmVsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMuIik7DQotICAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMiKTsNCi0gICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7DQotICAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93U3RhdHVzTm9QYWdlKHRleHQpDQotICB7DQotDQotICAgICB2YXIgcGFyZW50TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBtc2c7DQotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpDQotICAgICB7DQotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOw0KLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOw0KLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7DQotICAgICB9DQotDQotICAgICByZXR1cm4gbXNnOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1BhcmVudExhYmVsKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgcGFyZW50dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHBhcmVudHVybCE9IiIgJiYgcGFyZW50dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInVwIik7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd0hvbWVMYWJlbCgpDQotICB7DQotICAgIHNlbGYuc3RhdHVzID0gIu2ZiCI7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93UHJldmlvdXNMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgcHJldnVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHByZXZ1cmwhPSIiICYmIHByZXZ1cmwhPW51bGwpDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInByZXZpb3VzIik7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd05leHRMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBuZXh0dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgbmV4dHVybCE9IiIgJiYgbmV4dHVybCE9bnVsbCkNCi0gICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vUGFnZSgibmV4dCIpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUHJldmlvdXMoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLQ0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpDQotCXsNCi0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQ0KLQl7DQotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpDQotCXsNCi0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIlByZXZpb3VzIik7DQotCX0NCi0JICAgICAgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX3ByZXYpOw0KLSAgICAgfQ0KLSAgICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkTmV4dCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICB2YXIgbmV3TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLQ0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpDQotCXsNCi0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQ0KLQl7DQotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpDQotCXsNCi0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIk5leHQiKTsNCi0JfQ0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotDQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfbmV4dCk7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGxvYWRQYXJlbnQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV91cCk7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotZnVuY3Rpb24gd2hlcmVBbUkoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLQl2YXIgc3RhdHVzID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgCWlmKCBzdGF0dXMgPT0gZmFsc2UgKQ0KLQl7DQotCQlhbGVydCggdG9wbmF2X2pzX01FU1NBR0U0ICk7DQotCX0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gdXBBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnVwQXJyb3coKTsNCi0gICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gZG93bkFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZG93bkFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotDQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gbGVmdEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5sZWZ0QXJyb3coKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgICBmdW5jdGlvbiByaWdodEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5yaWdodEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIikNCi0gIHsNCi0gICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFNSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsNCi0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsNCi0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKw0KLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsNCi0NCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7DQotDQotICAgIGZvcihpPWRvY3VtZW50LmxpbmtzLmxlbmd0aC0xO2k+PTA7aS0tKQ0KLSAgICB7DQotICAgICAgIGlmKGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuaW5kZXhPZigiaW5kZXguaHRtIikhPS0xKQ0KLSAgICAgICB7DQotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZjsNCi0gICAgICAgICBicmVhazsNCi0gICAgICAgfQ0KLSAgICB9DQotDQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkNCi0gICAgew0KLQlpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApDQotCXsNCi0JCXdpbmRvdy5jbG9zZSgpOw0KLQkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBvcGVuT3J5IChwYWdlLCB0YXJnZXQpDQotew0KLSAgICBpZighaW5kZXggfHwgaW5kZXguY2xvc2VkKQ0KLSAgICB7DQotICAgICAgaW5kZXggPSBvcGVuKHBhZ2UsdGFyZ2V0LCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzk1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGluZGV4LmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlblNlYXJjaCgpDQotew0KLSAgICBpZighc2VhcmNoIHx8IHNlYXJjaC5jbG9zZWQpDQotICAgIHsNCi0gICAgICBzZWFyY2ggPSBvcGVuKCIuL2FwcGxldC9zZWFyY2guaHRtIiwic2VhcmNoX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz1ubyx3aWR0aD02MzAsaGVpZ2h0PTQ1MCxyZXNpemFibGU9eWVzIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2VhcmNoLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlbkluZGV4KCkNCi17DQotICAgb3Blbk9yeSgiLi9pbmRleC9pbmRleC5odG0iLCJpbmRleF93aW4iKTsNCi19DQotDQotZnVuY3Rpb24gb3Blbkdsb3NzYXJ5KCkNCi17DQotIGlmKCFnbG9zc2FyeSB8fCBnbG9zc2FyeS5jbG9zZWQpDQotICAgIHsNCi0gICAgICBnbG9zc2FyeSA9IG9wZW4oIi4vcHJvY2Vzcy9nbG9zc2FyeS9pbmRleC5odG0iLCJnbG9zc2FyeV93aW4iLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzg1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGdsb3NzYXJ5LmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gcHJpbnRQYWdlKCkNCi17DQotIHBhcmVudC5vcnlfZG9jLmZvY3VzKCk7DQotIHBhcmVudC5vcnlfZG9jLnByaW50KCk7DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHNlbmRGZWVkYmFjayh1cmwpDQotew0KLQlpZiAoIHVybCA9PSBudWxsIHx8IHVybCA9PSAnJyApDQotCXsNCi0JCXJldHVybjsNCi0JfQ0KLQkNCi0JaWYgKCB1cmwuaW5kZXhPZigibWFpbHRvOiIpID49IDAgKQ0KLQl7DQotCQlzZW5kbWFpbCh1cmwpOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJDQotIAkgICAgaWYoIWZlZWRiYWNrIHx8IGZlZWRiYWNrLmNsb3NlZCkNCi0JICAgIHsNCi0JICAgICAgZmVlZGJhY2sgPSBvcGVuKHVybCwiZmVlZGJhY2tfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTYwMCxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0JICAgIH0NCi0JICAgIGVsc2UNCi0JICAgIHsNCi0JICAgICAgZmVlZGJhY2suZm9jdXMoKTsNCi0JICAgIH0NCi0gICAgCX0NCi0gICAgCQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kbWFpbCh1cmwpDQotew0KLQlpZiAoIHVybC5pbmRleE9mKCI/c3ViamVjdCIpID09IC0xICkNCi0Jew0KLQkJdmFyIGxpbms9cGFyZW50Lm9yeV9kb2MubG9jYXRpb247DQotCQl1cmwgPSB1cmwgKyAnP3N1YmplY3Q9RmVlZGJhY2s6IC0gJytsaW5rOw0KLQl9DQotCWxvY2F0aW9uLnJlcGxhY2UodXJsKTsNCi19DQotDQotLy9jYWxjdWxhdGVzIHJlbGF0aXZlIHBhdGgNCi0vL3BhdGggbXVzdCBiZSBhbGwgcmVsYXRpdmUgZnJvbSB3ZWJzaXRlIGJhc2Ugb3IgY29udGFpbiBmdWxsIHVybHMNCi1mdW5jdGlvbiBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgoc291cmNlUGF0aCwgdGFyZ2V0UGF0aCkNCi17DQotCWlmICh0YXJnZXRQYXRoLmluZGV4T2YoImh0dHA6LyIpICE9IC0xKQ0KLQl7DQotCQlyZXR1cm4gdGFyZ2V0UGF0aDsNCi0JfQ0KLQ0KLQkvL3JlcGxhY2UgYWxsICdcJyB3aXRoICcvJw0KLQlzb3VyY2VQYXRoID0gc291cmNlUGF0aC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQl0YXJnZXRQYXRoID0gdGFyZ2V0UGF0aC5yZXBsYWNlKC9cXC9nLCIvIik7DQotDQotCS8vYWxlcnQoIlJlcGxhY2UoU291cmNlKT0+IiArIHNvdXJjZVBhdGgpOw0KLQkvL2FsZXJ0KCJSZXBsYWNlKHRhcmdldCk9PiIgKyB0YXJnZXRQYXRoKTsNCi0NCi0NCi0Jc291cmNlQXJyYXkgPSBzb3VyY2VQYXRoLnNwbGl0KCIvIik7DQotCXRhcmdldEFycmF5ID0gdGFyZ2V0UGF0aC5zcGxpdCgiLyIpOw0KLQ0KLQl2YXIgdGhlUmVsUGF0aCA9ICIiOw0KLQ0KLQkvL2xvb3AgdW50aWwgd2UgZmluZCBhIGRpZmZlcmVuY2UNCi0JdmFyIGlkeCA9IDA7DQotCWZvcihpZHggPSAwOyBpZHggPCBzb3VyY2VBcnJheS5sZW5ndGg7IGlkeCsrKQ0KLQl7DQotCQlpZiAoaWR4ID4gdGFyZ2V0UGF0aC5sZW5ndGgpDQotCQl7DQotCQkJYnJlYWs7DQotCQl9DQotDQotCQlpZiAoc291cmNlQXJyYXlbaWR4XSAhPSB0YXJnZXRBcnJheVtpZHhdKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQl9DQotDQotCS8vYXBwZW5kIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgLi8NCi0JdmFyIG1heElkeCA9IHNvdXJjZUFycmF5Lmxlbmd0aCAtIDE7DQotCWZvciAodmFyIGkgPSBpZHg7IGkgPCBtYXhJZHg7IGkrKykNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyAiLi8iOw0KLQ0KLQkJLy9hbGVydCgiUmVsUGF0aD0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vYXBwZW5kIGFueSByZW1haW5pbmcgdGFyZ2V0IHBhdGgNCi0Jd2hpbGUoaWR4IDwgdGFyZ2V0QXJyYXkubGVuZ3RoKQ0KLQl7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aCArIHRhcmdldEFycmF5W2lkeCsrXSArICIvIjsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoZmluYWwpPT4iICsgdGhlUmVsUGF0aCk7DQotCX0NCi0NCi0JLy9yZW1vdmUgdGhlIGxhc3QgcGF0aCBzZXBhcmF0b3INCi0JaWYgKHRoZVJlbFBhdGgubGVuZ3RoID4gMCkNCi0Jew0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoLnN1YnN0cmluZygwLCAodGhlUmVsUGF0aC5sZW5ndGggLSAxKSk7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKFRyaW0xKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vYWxlcnQoIlJldHVybiBSZWxhdGl2ZSBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0NCi0JcmV0dXJuIHRoZVJlbFBhdGg7DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldFRyZWVQYXRoKCkNCi17DQotCXJldHVybiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKTsNCi19DQotDQotLy9UaGlzIG1ldGhvZCB3aWxsIHJlbW92ZSB0aGUgd2Vic2l0ZSBiYXNlIGZyb20gdGhlIHVybA0KLWZ1bmN0aW9uIGNhbGN1bGF0Q3VycmVudFBhZ2UoY3VyclVSTCkgew0KLQ0KLQl2YXIgdGhlQ3VycmVudExvY2F0aW9uID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0JdGhlQ3VycmVudExvY2F0aW9uID0gdGhlQ3VycmVudExvY2F0aW9uLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotCWN1cnJVUkwgPSBjdXJyVVJMLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotDQotCXZhciBzb3VyY2VBcnJheSA9IHRoZUN1cnJlbnRMb2NhdGlvbi5zcGxpdCgiLyIpOw0KLQl2YXIgY3VyckFycmF5ID0gY3VyclVSTC5zcGxpdCgiLyIpOw0KLQ0KLQl2YXIgbnVtVG9SZW1vdmUgPSBzb3VyY2VBcnJheS5sZW5ndGggLSAyOw0KLQl2YXIgaWR4ID0gMDsNCi0JdmFyIHRoZVJldHVyblBhdGggPSAiIjsNCi0JZm9yIChpZHggPSBudW1Ub1JlbW92ZTsgaWR4IDwgY3VyckFycmF5Lmxlbmd0aDsgaWR4KyspIHsNCi0JCWlmICh0aGVSZXR1cm5QYXRoICE9ICIiKSB7DQotCQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyAiLyI7DQotCQl9DQotCQl0aGVSZXR1cm5QYXRoID0gdGhlUmV0dXJuUGF0aCArIGN1cnJBcnJheVtpZHhdOw0KLQl9DQotDQotCS8vYWxlcnQoIkFycmF5VGVzdD0+IiArIGN1cnJVUkwgKyAiLCIgKyB0aGVSZXR1cm5QYXRoKTsNCi0JcmV0dXJuIHRoZVJldHVyblBhdGg7DQotfQ0KLQ0KLS8vYnVpbGRzIHRyZWUgcGF0aA0KLWZ1bmN0aW9uIGJ1aWxkVHJlZVBhdGhMb2NhdGlvbigpDQotew0KLQl2YXIgdGhlRGVsaW1pdGVyID0gIiMjKiI7DQotCXZhciB0aGlzUGFnZSA9ICJhcHBsZXQvcnVwX3RvcG5hdi5odG0iOw0KLQl2YXIgdGhlTG9jID0gIiI7DQotDQotDQotDQotCWlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLQl7DQotCQl2YXIgdGhlQ3VycmVudExvY2F0aW9uID0gcGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCi0JCXRoaXNQYWdlID0gY2FsY3VsYXRDdXJyZW50UGFnZSh0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJLy9hbGVydCgiUGF0aE5hbWU6IiArIHRoaXNQYWdlKTsNCi0NCi0JCS8vYWxlcnQoIlRyeWluZyB0byBmaW5kIHRoZSBwYXRoIGZvciA9PiIgKyB0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJdmFyIHRoZVBhdGggPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuZ2V0VHJlZVBhdGhBcnJheSh0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJLy9hbGVydCgiVGhlIFRyZWUgUGF0aDogIiArIHRoZVBhdGgpOw0KLQ0KLQkJdGhlUGF0aFN0cmluZyA9IHRoZVBhdGggKyAiIjsNCi0gICAgCQlhcnJheUZyb21TdHJpbmcgPSB0aGVQYXRoU3RyaW5nLnNwbGl0KHRoZURlbGltaXRlcik7DQotDQotCQkvL2J1aWxkIHRoZSBwYXRoIGZyb20gdGhlIGFycmF5DQotCQkvL3BhcmFtIDEgPSBwYXRoIHRvIGljb24sIHBhcmFtIDIgLSBsYWJlbCwgcGFyYW0gMyAtIHBhdGggdG8gZmlsZQ0KLQkJdmFyIGNvdW50ZXIgPSAwOw0KLQkJdmFyIHRoZUxhYmVsOw0KLQkJdmFyIHRoZVJlbFBhdGg7DQotCQlpZiAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCA+IDIpDQotCQl7DQotCQkgICB0aGVMb2MgPSAiIjsNCi0JCSAgIGZvcih2YXIgaSA9IDA7IGkgPCAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCAtIDEpIDsgaSsrKQ0KLQkJICAgew0KLQkJCS8vaXQncyB0aGUgaWNvbiBwYXRoDQotCQkJaWYgKGNvdW50ZXIgPCAyKQ0KLQkJCXsNCi0JCQkJaWYgKGNvdW50ZXIgPiAwKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKyAiICZndDsgIjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMSkgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0NCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCJcXCIpID09IC0xICYmIGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCIvIikgPT0gLTEpDQotCQkJCXsNCi0JCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0gIT0gIm51bGwiKQ0KLQkJCQkJew0KLQkJCQkJCXRoZVJlbFBhdGggPSAiYXBwbGV0L2ltYWdlcy8iICsgYXJyYXlGcm9tU3RyaW5nW2ldOw0KLQkJCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIHRoZVJlbFBhdGgpOw0KLQkJCQkJfQ0KLQkJCQkJLy9hbGVydCgiTW9kaWZ5aW5nIFBhdGggPT4gIiArIHRoZVJlbFBhdGgpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJfQ0KLQ0KLQkJCQlpZiAodGhlUmVsUGF0aCAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkJICI8aW1nIGJvcmRlcj0wIHNyYz1cIiIgKw0KLQkJCQkJCSB0aGVSZWxQYXRoICArDQotCQkJCQkJICJcIj4iOw0KLQkJCQl9DQotDQotCQkJCS8vYWxlcnQoInRoZSBjdXJyIHBhdGg9PiIgKyB0aGVMb2MpOw0KLQkJCQljb3VudGVyID0gMjsNCi0JCQl9DQotCQkJLy8gaXQncyB0aGUgbGFiZWwNCi0JCQllbHNlIGlmIChjb3VudGVyID09IDIpDQotCQkJew0KLQkJCQl0aGVMYWJlbCA9IGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJY291bnRlciA9IDM7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKGNvdW50ZXIgPT0gMykNCi0JCQl7DQotCQkJCS8vYWxlcnQoIkNhbGN1bGF0aW5nIHBhdGggZnJvbSgzKSAiICsgdGhpc1BhZ2UgKyAiID0+ICIgKyBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJew0KLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJCWlmICh0aGVSZWxQYXRoICE9ICIiKSB7DQotCQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIiB0YXJnZXQ9XCJvcnlfZG9jXCIgaHJlZj1cIiIgKw0KLQkJCQkJCQkgdGhlUmVsUGF0aCArDQotCQkJCQkgCQkiXCI+IiArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQkJIGVsc2Ugew0KLQkJCQkJIAl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJCXRoZUxhYmVsICsNCi0JCQkJCSAJCSI8XC9hPlxuIjsNCi0JCQkJCSB9DQotCQkJCX0NCi0JCQkJZWxzZQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkiPGEgY2xhc3M9XCJob3R0ZXh0XCI+IiAgKw0KLQkJCQkJIAl0aGVMYWJlbCArDQotCQkJCQkgCSI8XC9hPlxuIjsNCi0JCQkJfQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDE7DQotCQkJCXRoZVJlbFBhdGggPSAibnVsbCI7DQotCQkJCXRoZUxhYmVsID0gIm51bGwiOw0KLQkJCX0NCi0JCSAgIH0NCi0NCi0JCS8vYWxlcnQoIkZpbmlzaGVkIEJ1aWxkaW5nID0+ICIgKyB0aGVMb2MpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCS8vdGhlTG9jID0gIkN1cnJlbnQgTG9jYXRpb24mbmJzcDsmIzA0NTsmbmJzcDsiICsgdGhlTG9jOw0KLQ0KLQkvL2FsZXJ0KCJ0aGUgRmluYWwgU3RyaW5nPT4iICsgdGhlTG9jKTsNCi0NCi0JLy9kb2N1bWVudC53cml0ZSh0aGVMb2MpOw0KLQlyZXR1cm4gdGhlTG9jOw0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X3B0X0JSLmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9wdF9CUi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2NGE0OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X3B0X0JSLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNzg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQNCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotDQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMSA9ICJPIFRyZWVCcm93c2UgbsOjbyBmb2kgY2FycmVnYWRvIGFpbmRhIVxuQWd1YXJkZSEiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTIgPSAiTsOjbyBow6EgcMOhZ2luYSAnezB9JyBwYXJhIGVzdGEgcMOhZ2luYS5cblRlbnRlIHVtIGRvcyBvdXRyb3MgYm90w7VlcyBkZSBuYXZlZ2HDp8Ojby4iOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTMgPSAiTsOjbyBow6EgcMOhZ2luYSB7MH0hIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0VfcHJldiA9ICJhbnRlcmlvciAiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9uZXh0ID0gInByw7N4aW1vICI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3VwID0gInBhcmEgY2ltYSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNCA9ICJPIGFycXVpdm8gYXR1YWwgbsOjbyBlc3TDoSBuYSDDoXJ2b3JlIGRlIG5hdmVnYcOnw6NvLiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNSA9ICJPIHNpdGUgcHVibGljYWRvIGrDoSDDqSBleGliaWRvIHV0aWxpemFuZG8gcXVhZHJvcyI7DQotDQotZnVuY3Rpb24gZm9ybWF0U3RyaW5nKG1lc3NhZ2UsIHJlcGxhY2UwKQ0KLXsNCi0gICAJcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgvXHswXH0vLCByZXBsYWNlMCk7DQotfSANCi0NCi0vLyB0aGlzIHNjcmlwdCBpcyBmb3IgdGhlIHRvcG5hdi5odG1sDQotLy8gdGhpcyBpcyBOT1QgZm9yIGdlbmVyYWwgdXNlDQotTVNGUGhvdmVyID0NCi0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8DQotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsNCi0NCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykNCi0gIHsNCi0gICAgIHZhciBhPW5ldyBJbWFnZSgpOw0KLSAgICAgYS5zcmM9aW1nOw0KLSAgICAgcmV0dXJuIGE7DQotICB9DQotICANCi12YXIgdG91ciA9IDA7DQotDQotZnVuY3Rpb24gb3BlbkZpcnN0VG91ciAoKQ0KLS8vIG9wZW4gdGhlIGd1aWRlZCB0b3VyIC9oYWFrYW4gOTkwMzI0DQotew0KLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpDQotICAgIHsNCi0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5Ub3VyICgpDQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQNCi17DQotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHRvdXIgPSBvcGVuKCIuL3RvdXIvdG91ci5odG0iLCJ0b3VyX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MzUwLGhlaWdodD03MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotLy9BZGRpdGlvbiBieSBDaGluaCBWbyAwMy8yOC8wMA0KLSBmdW5jdGlvbiBkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKQ0KLSB7DQotIAl2YXIgcGFnZVBhdHRlcm4gPSAvb3Z1X3Byb2MvOw0KLSAJdmFyIG1haW5QYWdlID0gd2luZG93LnBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQ0KLSAJaWYgKCBwYWdlUGF0dGVybi50ZXN0KCBtYWluUGFnZSApICkgew0KLSAgICAJaWYgKGdldENvb2tpZSgiUlVQIikgIT0gImNoZWNrZWQiKSB7IG9wZW5GaXJzdFRvdXIoKTsgfQ0KLQl9DQotCWVsc2Ugew0KLQkJc2V0VGltZW91dCggImRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpIiwgMTAwMCApOw0KLQl9DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldENvb2tpZSAobmFtZSkNCi17DQotICB2YXIgZGNvb2tpZSA9IGRvY3VtZW50LmNvb2tpZTsNCi0gIHZhciBjbmFtZSA9IG5hbWUgKyAiPSI7DQotICB2YXIgY2xlbiA9IGRjb29raWUubGVuZ3RoOw0KLSAgdmFyIGNiZWdpbiA9IDA7DQotICB3aGlsZSAoY2JlZ2luIDwgY2xlbikNCi0gIHsNCi0gICAgdmFyIHZiZWdpbiA9IGNiZWdpbiArIGNuYW1lLmxlbmd0aDsNCi0gICAgaWYgKGRjb29raWUuc3Vic3RyaW5nKGNiZWdpbiwgdmJlZ2luKSA9PSBjbmFtZSkNCi0gICAgew0KLSAgICAgIHZhciB2ZW5kID0gZGNvb2tpZS5pbmRleE9mICgiOyIsIHZiZWdpbik7DQotICAgICAgaWYgKHZlbmQgPT0gLTEpDQotICAgICAgew0KLSAgICAgICAgdmVuZCA9IGNsZW47DQotICAgICAgfQ0KLSAgICAgIHJldHVybiB1bmVzY2FwZShkY29va2llLnN1YnN0cmluZyh2YmVnaW4sIHZlbmQpKTsNCi0gICAgfQ0KLSAgICBjYmVnaW4gPSBkY29va2llLmluZGV4T2YoIiAiLCBjYmVnaW4pICsgMTsNCi0gICAgaWYgKGNiZWdpbiA9PSAwKQ0KLSAgICB7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiBudWxsOw0KLSB9DQotDQotDQotICB2YXIgaW5kZXg9bnVsbDsNCi0gIHZhciB0b3VyPW51bGw7DQotICB2YXIgc2VhcmNoPW51bGw7DQotICB2YXIgZ2xvc3Nhcnk9bnVsbDsNCi0gIHZhciBmZWVkYmFjaz1udWxsOw0KLSAgdmFyIHRyZWVMb2FkZWQ9ZmFsc2U7DQotICBmdW5jdGlvbiBjaGVja1RyZWVMb2FkZWQoKQ0KLSAgew0KLSAgICBpZih0cmVlTG9hZGVkKQ0KLSAgICB7DQotICAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsDQotICAgICAgICAmJiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeSgpKQ0KLSAgICAgew0KLSAgICAgICB0cmVlTG9hZGVkID0gdHJ1ZTsNCi0gICAgIH0NCi0gICAgICovDQotICAgICBpZihwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQgIT0gbnVsbCkNCi0gICAgIHsNCi0gICAgICAJdmFyIG1ldGhvZCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeTsNCi0JIGlmIChtZXRob2QgIT0gInVuZGVmaW5lZCIpIHsNCi0JCWlmIChwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeSgpKQ0KLQkJew0KLSAgICAgICAJCQl0cmVlTG9hZGVkID0gdHJ1ZTsNCi0JCX0NCi0NCi0JICB9DQotDQotICAgICB9DQotDQotICAgICByZXR1cm4gdHJlZUxvYWRlZDsNCi0gICB9DQotDQotDQotICAgIGZ1bmN0aW9uIHNob3dBbGVydE5vdExvYWRlZCgpDQotICAgIHsNCi0gICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTEpOw0KLSAgICB9DQotDQotZnVuY3Rpb24gc2hvd1N0YXR1c05vdExvYWRlZCgpDQotICB7DQotICAgIC8vcmV0dXJuICJUaGUgVHJlZUJyb3dzZSBpcyBub3QgeWV0IGxvYWRlZCFcblBsZWFzZSB3YWl0ISI7DQotICAgIHJldHVybiB0b3BuYXZfanNfTUVTU0FHRTE7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93QWxlcnROb1BhZ2UodGV4dCkNCi0gIHsNCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYocGFyZW50TGFiZWwhPSIiICYmIHBhcmVudExhYmVsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMuIik7DQotICAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMiKTsNCi0gICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7DQotICAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93U3RhdHVzTm9QYWdlKHRleHQpDQotICB7DQotDQotICAgICB2YXIgcGFyZW50TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBtc2c7DQotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpDQotICAgICB7DQotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOw0KLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOw0KLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7DQotICAgICB9DQotDQotICAgICByZXR1cm4gbXNnOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1BhcmVudExhYmVsKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgcGFyZW50dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHBhcmVudHVybCE9IiIgJiYgcGFyZW50dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInVwIik7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd0hvbWVMYWJlbCgpDQotICB7DQotICAgIHNlbGYuc3RhdHVzID0gIkhvbWUiOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1ByZXZpb3VzTGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIHByZXZ1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwcmV2dXJsIT0iIiAmJiBwcmV2dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJwcmV2aW91cyIpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dOZXh0TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgbmV4dHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIG5leHR1cmwhPSIiICYmIG5leHR1cmwhPW51bGwpDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgICB9DQotICAgICAgZWxzZQ0KLSAgICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb1BhZ2UoIm5leHQiKTsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZFByZXZpb3VzKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJQcmV2aW91cyIpOw0KLQl9DQotCSAgICAgIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9wcmV2KTsNCi0gICAgIH0NCi0gICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZE5leHQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJOZXh0Iik7DQotCX0NCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLQ0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX25leHQpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUGFyZW50KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfdXApOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0JdmFyIHN0YXR1cyA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgIAlpZiggc3RhdHVzID09IGZhbHNlICkNCi0Jew0KLQkJYWxlcnQoIHRvcG5hdl9qc19NRVNTQUdFNCApOw0KLQl9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHVwQXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS51cEFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGRvd25BcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmRvd25BcnJvdygpOw0KLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgfQ0KLQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICAgIGZ1bmN0aW9uIGxlZnRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUubGVmdEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gcmlnaHRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUucmlnaHRBcnJvdygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotDQotZnVuY3Rpb24gbG9hZFRvcCgpDQotew0KLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIpDQotICB7DQotICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTUpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7DQotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7DQotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsNCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7DQotDQotICAgIHZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOw0KLQ0KLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkNCi0gICAgew0KLSAgICAgICBpZihkb2N1bWVudC5saW5rc1tpXS5ocmVmLmluZGV4T2YoImluZGV4Lmh0bSIpIT0tMSkNCi0gICAgICAgew0KLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IGRvY3VtZW50LmxpbmtzW2ldLmhyZWY7DQotICAgICAgICAgYnJlYWs7DQotICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7DQotCX0NCi0gICAgfQ0KLSAgIH0NCi19DQotDQotDQotZnVuY3Rpb24gb3Blbk9yeSAocGFnZSwgdGFyZ2V0KQ0KLXsNCi0gICAgaWYoIWluZGV4IHx8IGluZGV4LmNsb3NlZCkNCi0gICAgew0KLSAgICAgIGluZGV4ID0gb3BlbihwYWdlLHRhcmdldCwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM5NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBpbmRleC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5TZWFyY2goKQ0KLXsNCi0gICAgaWYoIXNlYXJjaCB8fCBzZWFyY2guY2xvc2VkKQ0KLSAgICB7DQotICAgICAgc2VhcmNoID0gb3BlbigiLi9hcHBsZXQvc2VhcmNoLmh0bSIsInNlYXJjaF9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9bm8sd2lkdGg9NjMwLGhlaWdodD00NTAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNlYXJjaC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5JbmRleCgpDQotew0KLSAgIG9wZW5PcnkoIi4vaW5kZXgvaW5kZXguaHRtIiwiaW5kZXhfd2luIik7DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5HbG9zc2FyeSgpDQotew0KLSBpZighZ2xvc3NhcnkgfHwgZ2xvc3NhcnkuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgZ2xvc3NhcnkgPSBvcGVuKCIuL3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXguaHRtIiwiZ2xvc3Nhcnlfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM4NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBnbG9zc2FyeS5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIHByaW50UGFnZSgpDQotew0KLSBwYXJlbnQub3J5X2RvYy5mb2N1cygpOw0KLSBwYXJlbnQub3J5X2RvYy5wcmludCgpOw0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kRmVlZGJhY2sodXJsKQ0KLXsNCi0JaWYgKCB1cmwgPT0gbnVsbCB8fCB1cmwgPT0gJycgKQ0KLQl7DQotCQlyZXR1cm47DQotCX0NCi0JDQotCWlmICggdXJsLmluZGV4T2YoIm1haWx0bzoiKSA+PSAwICkNCi0Jew0KLQkJc2VuZG1haWwodXJsKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCQ0KLSAJICAgIGlmKCFmZWVkYmFjayB8fCBmZWVkYmFjay5jbG9zZWQpDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrID0gb3Blbih1cmwsImZlZWRiYWNrX3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD02MDAsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotCSAgICB9DQotCSAgICBlbHNlDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrLmZvY3VzKCk7DQotCSAgICB9DQotICAgIAl9DQotICAgIAkNCi19DQotDQotDQotZnVuY3Rpb24gc2VuZG1haWwodXJsKQ0KLXsNCi0JaWYgKCB1cmwuaW5kZXhPZigiP3N1YmplY3QiKSA9PSAtMSApDQotCXsNCi0JCXZhciBsaW5rPXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQkJdXJsID0gdXJsICsgJz9zdWJqZWN0PUZlZWRiYWNrOiAtICcrbGluazsNCi0JfQ0KLQlsb2NhdGlvbi5yZXBsYWNlKHVybCk7DQotfQ0KLQ0KLS8vY2FsY3VsYXRlcyByZWxhdGl2ZSBwYXRoDQotLy9wYXRoIG11c3QgYmUgYWxsIHJlbGF0aXZlIGZyb20gd2Vic2l0ZSBiYXNlIG9yIGNvbnRhaW4gZnVsbCB1cmxzDQotZnVuY3Rpb24gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHNvdXJjZVBhdGgsIHRhcmdldFBhdGgpDQotew0KLQlpZiAodGFyZ2V0UGF0aC5pbmRleE9mKCJodHRwOi8iKSAhPSAtMSkNCi0Jew0KLQkJcmV0dXJuIHRhcmdldFBhdGg7DQotCX0NCi0NCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0Jc291cmNlUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0JdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXFwvZywiLyIpOw0KLQ0KLQkvL2FsZXJ0KCJSZXBsYWNlKFNvdXJjZSk9PiIgKyBzb3VyY2VQYXRoKTsNCi0JLy9hbGVydCgiUmVwbGFjZSh0YXJnZXQpPT4iICsgdGFyZ2V0UGF0aCk7DQotDQotDQotCXNvdXJjZUFycmF5ID0gc291cmNlUGF0aC5zcGxpdCgiLyIpOw0KLQl0YXJnZXRBcnJheSA9IHRhcmdldFBhdGguc3BsaXQoIi8iKTsNCi0NCi0JdmFyIHRoZVJlbFBhdGggPSAiIjsNCi0NCi0JLy9sb29wIHVudGlsIHdlIGZpbmQgYSBkaWZmZXJlbmNlDQotCXZhciBpZHggPSAwOw0KLQlmb3IoaWR4ID0gMDsgaWR4IDwgc291cmNlQXJyYXkubGVuZ3RoOyBpZHgrKykNCi0Jew0KLQkJaWYgKGlkeCA+IHRhcmdldFBhdGgubGVuZ3RoKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQ0KLQkJaWYgKHNvdXJjZUFycmF5W2lkeF0gIT0gdGFyZ2V0QXJyYXlbaWR4XSkNCi0JCXsNCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQ0KLQkvL2FwcGVuZCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIC4vDQotCXZhciBtYXhJZHggPSBzb3VyY2VBcnJheS5sZW5ndGggLSAxOw0KLQlmb3IgKHZhciBpID0gaWR4OyBpIDwgbWF4SWR4OyBpKyspDQotCXsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgIi4vIjsNCi0NCi0JCS8vYWxlcnQoIlJlbFBhdGg9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FwcGVuZCBhbnkgcmVtYWluaW5nIHRhcmdldCBwYXRoDQotCXdoaWxlKGlkeCA8IHRhcmdldEFycmF5Lmxlbmd0aCkNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyB0YXJnZXRBcnJheVtpZHgrK10gKyAiLyI7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKGZpbmFsKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vcmVtb3ZlIHRoZSBsYXN0IHBhdGggc2VwYXJhdG9yDQotCWlmICh0aGVSZWxQYXRoLmxlbmd0aCA+IDApDQotCXsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aC5zdWJzdHJpbmcoMCwgKHRoZVJlbFBhdGgubGVuZ3RoIC0gMSkpOw0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJSZXR1cm4gUmVsYXRpdmUgUGF0aCA9PiAiICsgdGhlUmVsUGF0aCk7DQotDQotCXJldHVybiB0aGVSZWxQYXRoOw0KLX0NCi0NCi1mdW5jdGlvbiBnZXRUcmVlUGF0aCgpDQotew0KLQlyZXR1cm4gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCk7DQotfQ0KLQ0KLS8vVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgdGhlIHdlYnNpdGUgYmFzZSBmcm9tIHRoZSB1cmwNCi1mdW5jdGlvbiBjYWxjdWxhdEN1cnJlbnRQYWdlKGN1cnJVUkwpIHsNCi0NCi0JdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCS8vcmVwbGFjZSBhbGwgJ1wnIHdpdGggJy8nDQotCXRoZUN1cnJlbnRMb2NhdGlvbiA9IHRoZUN1cnJlbnRMb2NhdGlvbi5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQljdXJyVVJMID0gY3VyclVSTC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQ0KLQl2YXIgc291cmNlQXJyYXkgPSB0aGVDdXJyZW50TG9jYXRpb24uc3BsaXQoIi8iKTsNCi0JdmFyIGN1cnJBcnJheSA9IGN1cnJVUkwuc3BsaXQoIi8iKTsNCi0NCi0JdmFyIG51bVRvUmVtb3ZlID0gc291cmNlQXJyYXkubGVuZ3RoIC0gMjsNCi0JdmFyIGlkeCA9IDA7DQotCXZhciB0aGVSZXR1cm5QYXRoID0gIiI7DQotCWZvciAoaWR4ID0gbnVtVG9SZW1vdmU7IGlkeCA8IGN1cnJBcnJheS5sZW5ndGg7IGlkeCsrKSB7DQotCQlpZiAodGhlUmV0dXJuUGF0aCAhPSAiIikgew0KLQkJCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgIi8iOw0KLQkJfQ0KLQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyBjdXJyQXJyYXlbaWR4XTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJBcnJheVRlc3Q9PiIgKyBjdXJyVVJMICsgIiwiICsgdGhlUmV0dXJuUGF0aCk7DQotCXJldHVybiB0aGVSZXR1cm5QYXRoOw0KLX0NCi0NCi0vL2J1aWxkcyB0cmVlIHBhdGgNCi1mdW5jdGlvbiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKQ0KLXsNCi0JdmFyIHRoZURlbGltaXRlciA9ICIjIyoiOw0KLQl2YXIgdGhpc1BhZ2UgPSAiYXBwbGV0L3J1cF90b3BuYXYuaHRtIjsNCi0JdmFyIHRoZUxvYyA9ICIiOw0KLQ0KLQ0KLQ0KLQlpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0Jew0KLQkJdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCQl0aGlzUGFnZSA9IGNhbGN1bGF0Q3VycmVudFBhZ2UodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlBhdGhOYW1lOiIgKyB0aGlzUGFnZSk7DQotDQotCQkvL2FsZXJ0KCJUcnlpbmcgdG8gZmluZCB0aGUgcGF0aCBmb3IgPT4iICsgdGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCXZhciB0aGVQYXRoID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmdldFRyZWVQYXRoQXJyYXkodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlRoZSBUcmVlIFBhdGg6ICIgKyB0aGVQYXRoKTsNCi0NCi0JCXRoZVBhdGhTdHJpbmcgPSB0aGVQYXRoICsgIiI7DQotICAgIAkJYXJyYXlGcm9tU3RyaW5nID0gdGhlUGF0aFN0cmluZy5zcGxpdCh0aGVEZWxpbWl0ZXIpOw0KLQ0KLQkJLy9idWlsZCB0aGUgcGF0aCBmcm9tIHRoZSBhcnJheQ0KLQkJLy9wYXJhbSAxID0gcGF0aCB0byBpY29uLCBwYXJhbSAyIC0gbGFiZWwsIHBhcmFtIDMgLSBwYXRoIHRvIGZpbGUNCi0JCXZhciBjb3VudGVyID0gMDsNCi0JCXZhciB0aGVMYWJlbDsNCi0JCXZhciB0aGVSZWxQYXRoOw0KLQkJaWYgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggPiAyKQ0KLQkJew0KLQkJICAgdGhlTG9jID0gIiI7DQotCQkgICBmb3IodmFyIGkgPSAwOyBpIDwgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggLSAxKSA7IGkrKykNCi0JCSAgIHsNCi0JCQkvL2l0J3MgdGhlIGljb24gcGF0aA0KLQkJCWlmIChjb3VudGVyIDwgMikNCi0JCQl7DQotCQkJCWlmIChjb3VudGVyID4gMCkNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsgIiAmZ3Q7ICI7DQotCQkJCX0NCi0NCi0JCQkJLy9hbGVydCgiQ2FsY3VsYXRpbmcgcGF0aCBmcm9tKDEpICIgKyB0aGlzUGFnZSArICIgPT4gIiArIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotDQotCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiXFwiKSA9PSAtMSAmJiBhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiLyIpID09IC0xKQ0KLQkJCQl7DQotCQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJCXsNCi0JCQkJCQl0aGVSZWxQYXRoID0gImFwcGxldC9pbWFnZXMvIiArIGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCB0aGVSZWxQYXRoKTsNCi0JCQkJCX0NCi0JCQkJCS8vYWxlcnQoIk1vZGlmeWluZyBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCX0NCi0NCi0JCQkJaWYgKHRoZVJlbFBhdGggIT0gIm51bGwiKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJCSAiPGltZyBib3JkZXI9MCBzcmM9XCIiICsNCi0JCQkJCQkgdGhlUmVsUGF0aCAgKw0KLQkJCQkJCSAiXCI+IjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDI7DQotCQkJfQ0KLQkJCS8vIGl0J3MgdGhlIGxhYmVsDQotCQkJZWxzZSBpZiAoY291bnRlciA9PSAyKQ0KLQkJCXsNCi0JCQkJdGhlTGFiZWwgPSBhcnJheUZyb21TdHJpbmdbaV07DQotCQkJCWNvdW50ZXIgPSAzOw0KLQkJCX0NCi0JCQllbHNlIGlmIChjb3VudGVyID09IDMpDQotCQkJew0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMykgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCQlpZiAodGhlUmVsUGF0aCAhPSAiIikgew0KLQkJCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCIgdGFyZ2V0PVwib3J5X2RvY1wiIGhyZWY9XCIiICsNCi0JCQkJCQkJIHRoZVJlbFBhdGggKw0KLQkJCQkJIAkJIlwiPiIgKw0KLQkJCQkJIAkJdGhlTGFiZWwgKw0KLQkJCQkJIAkJIjxcL2E+XG4iOw0KLQkJCQkJIH0NCi0JCQkJCSBlbHNlIHsNCi0JCQkJCSAJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIj4iICArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQl9DQotCQkJCWVsc2UNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJdGhlTGFiZWwgKw0KLQkJCQkJIAkiPFwvYT5cbiI7DQotCQkJCX0NCi0JCQkJLy9hbGVydCgidGhlIGN1cnIgcGF0aD0+IiArIHRoZUxvYyk7DQotCQkJCWNvdW50ZXIgPSAxOw0KLQkJCQl0aGVSZWxQYXRoID0gIm51bGwiOw0KLQkJCQl0aGVMYWJlbCA9ICJudWxsIjsNCi0JCQl9DQotCQkgICB9DQotDQotCQkvL2FsZXJ0KCJGaW5pc2hlZCBCdWlsZGluZyA9PiAiICsgdGhlTG9jKTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQkvL3RoZUxvYyA9ICJDdXJyZW50IExvY2F0aW9uJm5ic3A7JiMwNDU7Jm5ic3A7IiArIHRoZUxvYzsNCi0NCi0JLy9hbGVydCgidGhlIEZpbmFsIFN0cmluZz0+IiArIHRoZUxvYyk7DQotDQotCS8vZG9jdW1lbnQud3JpdGUodGhlTG9jKTsNCi0JcmV0dXJuIHRoZUxvYzsNCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl96aF9DTi5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfemhfQ04uanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZjY5NzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl96aF9DTi5qcworKysgL2Rldi9udWxsCkBAIC0xLDc4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkDQotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLQ0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTEgPSAi6L+Y5pyq6KOF5YWlIFRyZWVCcm93c2XvvIFcbuivt+etieW+he+8gSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMiA9ICLmraTpobXpnaLmsqHmnInigJx7MH3igJ3pobXpnaLjgIJcbuivt+WwneivleWPpuS4gOS4quWvvOiIquaMiemSruOAgiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMyA9ICLml6AgezB9IOmhtemdou+8gSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3ByZXYgPSAi5LiK5LiA5LiqIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0VfbmV4dCA9ICLkuIvkuIDkuKoiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV91cCA9ICLlkJHkuIoiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTQgPSAi5b2T5YmN5paH5Lu25LiN5Zyo5qCR5b2i5rWP6KeI5Zmo5Lit44CCIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0U1ID0gIuWPkeW4g+eahOermeeCueW3suS9v+eUqOahhuaetuadpeaYvuekuiI7DQotDQotZnVuY3Rpb24gZm9ybWF0U3RyaW5nKG1lc3NhZ2UsIHJlcGxhY2UwKQ0KLXsNCi0gICAJcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgvXHswXH0vLCByZXBsYWNlMCk7DQotfSANCi0NCi0vLyB0aGlzIHNjcmlwdCBpcyBmb3IgdGhlIHRvcG5hdi5odG1sDQotLy8gdGhpcyBpcyBOT1QgZm9yIGdlbmVyYWwgdXNlDQotTVNGUGhvdmVyID0NCi0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8DQotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsNCi0NCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykNCi0gIHsNCi0gICAgIHZhciBhPW5ldyBJbWFnZSgpOw0KLSAgICAgYS5zcmM9aW1nOw0KLSAgICAgcmV0dXJuIGE7DQotICB9DQotICANCi12YXIgdG91ciA9IDA7DQotDQotZnVuY3Rpb24gb3BlbkZpcnN0VG91ciAoKQ0KLS8vIG9wZW4gdGhlIGd1aWRlZCB0b3VyIC9oYWFrYW4gOTkwMzI0DQotew0KLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpDQotICAgIHsNCi0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5Ub3VyICgpDQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQNCi17DQotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHRvdXIgPSBvcGVuKCIuL3RvdXIvdG91ci5odG0iLCJ0b3VyX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MzUwLGhlaWdodD03MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotLy9BZGRpdGlvbiBieSBDaGluaCBWbyAwMy8yOC8wMA0KLSBmdW5jdGlvbiBkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKQ0KLSB7DQotIAl2YXIgcGFnZVBhdHRlcm4gPSAvb3Z1X3Byb2MvOw0KLSAJdmFyIG1haW5QYWdlID0gd2luZG93LnBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQ0KLSAJaWYgKCBwYWdlUGF0dGVybi50ZXN0KCBtYWluUGFnZSApICkgew0KLSAgICAJaWYgKGdldENvb2tpZSgiUlVQIikgIT0gImNoZWNrZWQiKSB7IG9wZW5GaXJzdFRvdXIoKTsgfQ0KLQl9DQotCWVsc2Ugew0KLQkJc2V0VGltZW91dCggImRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpIiwgMTAwMCApOw0KLQl9DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldENvb2tpZSAobmFtZSkNCi17DQotICB2YXIgZGNvb2tpZSA9IGRvY3VtZW50LmNvb2tpZTsNCi0gIHZhciBjbmFtZSA9IG5hbWUgKyAiPSI7DQotICB2YXIgY2xlbiA9IGRjb29raWUubGVuZ3RoOw0KLSAgdmFyIGNiZWdpbiA9IDA7DQotICB3aGlsZSAoY2JlZ2luIDwgY2xlbikNCi0gIHsNCi0gICAgdmFyIHZiZWdpbiA9IGNiZWdpbiArIGNuYW1lLmxlbmd0aDsNCi0gICAgaWYgKGRjb29raWUuc3Vic3RyaW5nKGNiZWdpbiwgdmJlZ2luKSA9PSBjbmFtZSkNCi0gICAgew0KLSAgICAgIHZhciB2ZW5kID0gZGNvb2tpZS5pbmRleE9mICgiOyIsIHZiZWdpbik7DQotICAgICAgaWYgKHZlbmQgPT0gLTEpDQotICAgICAgew0KLSAgICAgICAgdmVuZCA9IGNsZW47DQotICAgICAgfQ0KLSAgICAgIHJldHVybiB1bmVzY2FwZShkY29va2llLnN1YnN0cmluZyh2YmVnaW4sIHZlbmQpKTsNCi0gICAgfQ0KLSAgICBjYmVnaW4gPSBkY29va2llLmluZGV4T2YoIiAiLCBjYmVnaW4pICsgMTsNCi0gICAgaWYgKGNiZWdpbiA9PSAwKQ0KLSAgICB7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiBudWxsOw0KLSB9DQotDQotDQotICB2YXIgaW5kZXg9bnVsbDsNCi0gIHZhciB0b3VyPW51bGw7DQotICB2YXIgc2VhcmNoPW51bGw7DQotICB2YXIgZ2xvc3Nhcnk9bnVsbDsNCi0gIHZhciBmZWVkYmFjaz1udWxsOw0KLSAgdmFyIHRyZWVMb2FkZWQ9ZmFsc2U7DQotICBmdW5jdGlvbiBjaGVja1RyZWVMb2FkZWQoKQ0KLSAgew0KLSAgICBpZih0cmVlTG9hZGVkKQ0KLSAgICB7DQotICAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsDQotICAgICAgICAmJiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeSgpKQ0KLSAgICAgew0KLSAgICAgICB0cmVlTG9hZGVkID0gdHJ1ZTsNCi0gICAgIH0NCi0gICAgICovDQotICAgICBpZihwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQgIT0gbnVsbCkNCi0gICAgIHsNCi0gICAgICAJdmFyIG1ldGhvZCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeTsNCi0JIGlmIChtZXRob2QgIT0gInVuZGVmaW5lZCIpIHsNCi0JCWlmIChwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeSgpKQ0KLQkJew0KLSAgICAgICAJCQl0cmVlTG9hZGVkID0gdHJ1ZTsNCi0JCX0NCi0NCi0JICB9DQotDQotICAgICB9DQotDQotICAgICByZXR1cm4gdHJlZUxvYWRlZDsNCi0gICB9DQotDQotDQotICAgIGZ1bmN0aW9uIHNob3dBbGVydE5vdExvYWRlZCgpDQotICAgIHsNCi0gICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTEpOw0KLSAgICB9DQotDQotZnVuY3Rpb24gc2hvd1N0YXR1c05vdExvYWRlZCgpDQotICB7DQotICAgIC8vcmV0dXJuICJUaGUgVHJlZUJyb3dzZSBpcyBub3QgeWV0IGxvYWRlZCFcblBsZWFzZSB3YWl0ISI7DQotICAgIHJldHVybiB0b3BuYXZfanNfTUVTU0FHRTE7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93QWxlcnROb1BhZ2UodGV4dCkNCi0gIHsNCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYocGFyZW50TGFiZWwhPSIiICYmIHBhcmVudExhYmVsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMuIik7DQotICAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMiKTsNCi0gICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7DQotICAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93U3RhdHVzTm9QYWdlKHRleHQpDQotICB7DQotDQotICAgICB2YXIgcGFyZW50TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBtc2c7DQotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpDQotICAgICB7DQotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOw0KLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOw0KLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7DQotICAgICB9DQotDQotICAgICByZXR1cm4gbXNnOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1BhcmVudExhYmVsKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgcGFyZW50dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHBhcmVudHVybCE9IiIgJiYgcGFyZW50dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInVwIik7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd0hvbWVMYWJlbCgpDQotICB7DQotICAgIHNlbGYuc3RhdHVzID0gIkhvbWUiOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1ByZXZpb3VzTGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIHByZXZ1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwcmV2dXJsIT0iIiAmJiBwcmV2dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJwcmV2aW91cyIpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dOZXh0TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgbmV4dHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIG5leHR1cmwhPSIiICYmIG5leHR1cmwhPW51bGwpDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgICB9DQotICAgICAgZWxzZQ0KLSAgICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb1BhZ2UoIm5leHQiKTsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZFByZXZpb3VzKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJQcmV2aW91cyIpOw0KLQl9DQotCSAgICAgIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9wcmV2KTsNCi0gICAgIH0NCi0gICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZE5leHQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJOZXh0Iik7DQotCX0NCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLQ0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX25leHQpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUGFyZW50KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfdXApOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0JdmFyIHN0YXR1cyA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgIAlpZiggc3RhdHVzID09IGZhbHNlICkNCi0Jew0KLQkJYWxlcnQoIHRvcG5hdl9qc19NRVNTQUdFNCApOw0KLQl9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHVwQXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS51cEFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGRvd25BcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmRvd25BcnJvdygpOw0KLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgfQ0KLQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICAgIGZ1bmN0aW9uIGxlZnRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUubGVmdEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gcmlnaHRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUucmlnaHRBcnJvdygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotDQotZnVuY3Rpb24gbG9hZFRvcCgpDQotew0KLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIpDQotICB7DQotICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTUpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7DQotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7DQotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsNCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7DQotDQotICAgIHZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOw0KLQ0KLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkNCi0gICAgew0KLSAgICAgICBpZihkb2N1bWVudC5saW5rc1tpXS5ocmVmLmluZGV4T2YoImluZGV4Lmh0bSIpIT0tMSkNCi0gICAgICAgew0KLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IGRvY3VtZW50LmxpbmtzW2ldLmhyZWY7DQotICAgICAgICAgYnJlYWs7DQotICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7DQotCX0NCi0gICAgfQ0KLSAgIH0NCi19DQotDQotDQotZnVuY3Rpb24gb3Blbk9yeSAocGFnZSwgdGFyZ2V0KQ0KLXsNCi0gICAgaWYoIWluZGV4IHx8IGluZGV4LmNsb3NlZCkNCi0gICAgew0KLSAgICAgIGluZGV4ID0gb3BlbihwYWdlLHRhcmdldCwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM5NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBpbmRleC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5TZWFyY2goKQ0KLXsNCi0gICAgaWYoIXNlYXJjaCB8fCBzZWFyY2guY2xvc2VkKQ0KLSAgICB7DQotICAgICAgc2VhcmNoID0gb3BlbigiLi9hcHBsZXQvc2VhcmNoLmh0bSIsInNlYXJjaF9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9bm8sd2lkdGg9NjMwLGhlaWdodD00NTAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNlYXJjaC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5JbmRleCgpDQotew0KLSAgIG9wZW5PcnkoIi4vaW5kZXgvaW5kZXguaHRtIiwiaW5kZXhfd2luIik7DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5HbG9zc2FyeSgpDQotew0KLSBpZighZ2xvc3NhcnkgfHwgZ2xvc3NhcnkuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgZ2xvc3NhcnkgPSBvcGVuKCIuL3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXguaHRtIiwiZ2xvc3Nhcnlfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM4NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBnbG9zc2FyeS5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIHByaW50UGFnZSgpDQotew0KLSBwYXJlbnQub3J5X2RvYy5mb2N1cygpOw0KLSBwYXJlbnQub3J5X2RvYy5wcmludCgpOw0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kRmVlZGJhY2sodXJsKQ0KLXsNCi0JaWYgKCB1cmwgPT0gbnVsbCB8fCB1cmwgPT0gJycgKQ0KLQl7DQotCQlyZXR1cm47DQotCX0NCi0JDQotCWlmICggdXJsLmluZGV4T2YoIm1haWx0bzoiKSA+PSAwICkNCi0Jew0KLQkJc2VuZG1haWwodXJsKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCQ0KLSAJICAgIGlmKCFmZWVkYmFjayB8fCBmZWVkYmFjay5jbG9zZWQpDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrID0gb3Blbih1cmwsImZlZWRiYWNrX3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD02MDAsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotCSAgICB9DQotCSAgICBlbHNlDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrLmZvY3VzKCk7DQotCSAgICB9DQotICAgIAl9DQotICAgIAkNCi19DQotDQotDQotZnVuY3Rpb24gc2VuZG1haWwodXJsKQ0KLXsNCi0JaWYgKCB1cmwuaW5kZXhPZigiP3N1YmplY3QiKSA9PSAtMSApDQotCXsNCi0JCXZhciBsaW5rPXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQkJdXJsID0gdXJsICsgJz9zdWJqZWN0PUZlZWRiYWNrOiAtICcrbGluazsNCi0JfQ0KLQlsb2NhdGlvbi5yZXBsYWNlKHVybCk7DQotfQ0KLQ0KLS8vY2FsY3VsYXRlcyByZWxhdGl2ZSBwYXRoDQotLy9wYXRoIG11c3QgYmUgYWxsIHJlbGF0aXZlIGZyb20gd2Vic2l0ZSBiYXNlIG9yIGNvbnRhaW4gZnVsbCB1cmxzDQotZnVuY3Rpb24gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHNvdXJjZVBhdGgsIHRhcmdldFBhdGgpDQotew0KLQlpZiAodGFyZ2V0UGF0aC5pbmRleE9mKCJodHRwOi8iKSAhPSAtMSkNCi0Jew0KLQkJcmV0dXJuIHRhcmdldFBhdGg7DQotCX0NCi0NCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0Jc291cmNlUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0JdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXFwvZywiLyIpOw0KLQ0KLQkvL2FsZXJ0KCJSZXBsYWNlKFNvdXJjZSk9PiIgKyBzb3VyY2VQYXRoKTsNCi0JLy9hbGVydCgiUmVwbGFjZSh0YXJnZXQpPT4iICsgdGFyZ2V0UGF0aCk7DQotDQotDQotCXNvdXJjZUFycmF5ID0gc291cmNlUGF0aC5zcGxpdCgiLyIpOw0KLQl0YXJnZXRBcnJheSA9IHRhcmdldFBhdGguc3BsaXQoIi8iKTsNCi0NCi0JdmFyIHRoZVJlbFBhdGggPSAiIjsNCi0NCi0JLy9sb29wIHVudGlsIHdlIGZpbmQgYSBkaWZmZXJlbmNlDQotCXZhciBpZHggPSAwOw0KLQlmb3IoaWR4ID0gMDsgaWR4IDwgc291cmNlQXJyYXkubGVuZ3RoOyBpZHgrKykNCi0Jew0KLQkJaWYgKGlkeCA+IHRhcmdldFBhdGgubGVuZ3RoKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQ0KLQkJaWYgKHNvdXJjZUFycmF5W2lkeF0gIT0gdGFyZ2V0QXJyYXlbaWR4XSkNCi0JCXsNCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQ0KLQkvL2FwcGVuZCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIC4vDQotCXZhciBtYXhJZHggPSBzb3VyY2VBcnJheS5sZW5ndGggLSAxOw0KLQlmb3IgKHZhciBpID0gaWR4OyBpIDwgbWF4SWR4OyBpKyspDQotCXsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgIi4vIjsNCi0NCi0JCS8vYWxlcnQoIlJlbFBhdGg9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FwcGVuZCBhbnkgcmVtYWluaW5nIHRhcmdldCBwYXRoDQotCXdoaWxlKGlkeCA8IHRhcmdldEFycmF5Lmxlbmd0aCkNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyB0YXJnZXRBcnJheVtpZHgrK10gKyAiLyI7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKGZpbmFsKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vcmVtb3ZlIHRoZSBsYXN0IHBhdGggc2VwYXJhdG9yDQotCWlmICh0aGVSZWxQYXRoLmxlbmd0aCA+IDApDQotCXsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aC5zdWJzdHJpbmcoMCwgKHRoZVJlbFBhdGgubGVuZ3RoIC0gMSkpOw0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJSZXR1cm4gUmVsYXRpdmUgUGF0aCA9PiAiICsgdGhlUmVsUGF0aCk7DQotDQotCXJldHVybiB0aGVSZWxQYXRoOw0KLX0NCi0NCi1mdW5jdGlvbiBnZXRUcmVlUGF0aCgpDQotew0KLQlyZXR1cm4gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCk7DQotfQ0KLQ0KLS8vVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgdGhlIHdlYnNpdGUgYmFzZSBmcm9tIHRoZSB1cmwNCi1mdW5jdGlvbiBjYWxjdWxhdEN1cnJlbnRQYWdlKGN1cnJVUkwpIHsNCi0NCi0JdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCS8vcmVwbGFjZSBhbGwgJ1wnIHdpdGggJy8nDQotCXRoZUN1cnJlbnRMb2NhdGlvbiA9IHRoZUN1cnJlbnRMb2NhdGlvbi5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQljdXJyVVJMID0gY3VyclVSTC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQ0KLQl2YXIgc291cmNlQXJyYXkgPSB0aGVDdXJyZW50TG9jYXRpb24uc3BsaXQoIi8iKTsNCi0JdmFyIGN1cnJBcnJheSA9IGN1cnJVUkwuc3BsaXQoIi8iKTsNCi0NCi0JdmFyIG51bVRvUmVtb3ZlID0gc291cmNlQXJyYXkubGVuZ3RoIC0gMjsNCi0JdmFyIGlkeCA9IDA7DQotCXZhciB0aGVSZXR1cm5QYXRoID0gIiI7DQotCWZvciAoaWR4ID0gbnVtVG9SZW1vdmU7IGlkeCA8IGN1cnJBcnJheS5sZW5ndGg7IGlkeCsrKSB7DQotCQlpZiAodGhlUmV0dXJuUGF0aCAhPSAiIikgew0KLQkJCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgIi8iOw0KLQkJfQ0KLQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyBjdXJyQXJyYXlbaWR4XTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJBcnJheVRlc3Q9PiIgKyBjdXJyVVJMICsgIiwiICsgdGhlUmV0dXJuUGF0aCk7DQotCXJldHVybiB0aGVSZXR1cm5QYXRoOw0KLX0NCi0NCi0vL2J1aWxkcyB0cmVlIHBhdGgNCi1mdW5jdGlvbiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKQ0KLXsNCi0JdmFyIHRoZURlbGltaXRlciA9ICIjIyoiOw0KLQl2YXIgdGhpc1BhZ2UgPSAiYXBwbGV0L3J1cF90b3BuYXYuaHRtIjsNCi0JdmFyIHRoZUxvYyA9ICIiOw0KLQ0KLQ0KLQ0KLQlpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0Jew0KLQkJdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCQl0aGlzUGFnZSA9IGNhbGN1bGF0Q3VycmVudFBhZ2UodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlBhdGhOYW1lOiIgKyB0aGlzUGFnZSk7DQotDQotCQkvL2FsZXJ0KCJUcnlpbmcgdG8gZmluZCB0aGUgcGF0aCBmb3IgPT4iICsgdGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCXZhciB0aGVQYXRoID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmdldFRyZWVQYXRoQXJyYXkodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlRoZSBUcmVlIFBhdGg6ICIgKyB0aGVQYXRoKTsNCi0NCi0JCXRoZVBhdGhTdHJpbmcgPSB0aGVQYXRoICsgIiI7DQotICAgIAkJYXJyYXlGcm9tU3RyaW5nID0gdGhlUGF0aFN0cmluZy5zcGxpdCh0aGVEZWxpbWl0ZXIpOw0KLQ0KLQkJLy9idWlsZCB0aGUgcGF0aCBmcm9tIHRoZSBhcnJheQ0KLQkJLy9wYXJhbSAxID0gcGF0aCB0byBpY29uLCBwYXJhbSAyIC0gbGFiZWwsIHBhcmFtIDMgLSBwYXRoIHRvIGZpbGUNCi0JCXZhciBjb3VudGVyID0gMDsNCi0JCXZhciB0aGVMYWJlbDsNCi0JCXZhciB0aGVSZWxQYXRoOw0KLQkJaWYgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggPiAyKQ0KLQkJew0KLQkJICAgdGhlTG9jID0gIiI7DQotCQkgICBmb3IodmFyIGkgPSAwOyBpIDwgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggLSAxKSA7IGkrKykNCi0JCSAgIHsNCi0JCQkvL2l0J3MgdGhlIGljb24gcGF0aA0KLQkJCWlmIChjb3VudGVyIDwgMikNCi0JCQl7DQotCQkJCWlmIChjb3VudGVyID4gMCkNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsgIiAmZ3Q7ICI7DQotCQkJCX0NCi0NCi0JCQkJLy9hbGVydCgiQ2FsY3VsYXRpbmcgcGF0aCBmcm9tKDEpICIgKyB0aGlzUGFnZSArICIgPT4gIiArIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotDQotCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiXFwiKSA9PSAtMSAmJiBhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiLyIpID09IC0xKQ0KLQkJCQl7DQotCQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJCXsNCi0JCQkJCQl0aGVSZWxQYXRoID0gImFwcGxldC9pbWFnZXMvIiArIGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCB0aGVSZWxQYXRoKTsNCi0JCQkJCX0NCi0JCQkJCS8vYWxlcnQoIk1vZGlmeWluZyBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCX0NCi0NCi0JCQkJaWYgKHRoZVJlbFBhdGggIT0gIm51bGwiKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJCSAiPGltZyBib3JkZXI9MCBzcmM9XCIiICsNCi0JCQkJCQkgdGhlUmVsUGF0aCAgKw0KLQkJCQkJCSAiXCI+IjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDI7DQotCQkJfQ0KLQkJCS8vIGl0J3MgdGhlIGxhYmVsDQotCQkJZWxzZSBpZiAoY291bnRlciA9PSAyKQ0KLQkJCXsNCi0JCQkJdGhlTGFiZWwgPSBhcnJheUZyb21TdHJpbmdbaV07DQotCQkJCWNvdW50ZXIgPSAzOw0KLQkJCX0NCi0JCQllbHNlIGlmIChjb3VudGVyID09IDMpDQotCQkJew0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMykgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCQlpZiAodGhlUmVsUGF0aCAhPSAiIikgew0KLQkJCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCIgdGFyZ2V0PVwib3J5X2RvY1wiIGhyZWY9XCIiICsNCi0JCQkJCQkJIHRoZVJlbFBhdGggKw0KLQkJCQkJIAkJIlwiPiIgKw0KLQkJCQkJIAkJdGhlTGFiZWwgKw0KLQkJCQkJIAkJIjxcL2E+XG4iOw0KLQkJCQkJIH0NCi0JCQkJCSBlbHNlIHsNCi0JCQkJCSAJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIj4iICArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQl9DQotCQkJCWVsc2UNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJdGhlTGFiZWwgKw0KLQkJCQkJIAkiPFwvYT5cbiI7DQotCQkJCX0NCi0JCQkJLy9hbGVydCgidGhlIGN1cnIgcGF0aD0+IiArIHRoZUxvYyk7DQotCQkJCWNvdW50ZXIgPSAxOw0KLQkJCQl0aGVSZWxQYXRoID0gIm51bGwiOw0KLQkJCQl0aGVMYWJlbCA9ICJudWxsIjsNCi0JCQl9DQotCQkgICB9DQotDQotCQkvL2FsZXJ0KCJGaW5pc2hlZCBCdWlsZGluZyA9PiAiICsgdGhlTG9jKTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQkvL3RoZUxvYyA9ICJDdXJyZW50IExvY2F0aW9uJm5ic3A7JiMwNDU7Jm5ic3A7IiArIHRoZUxvYzsNCi0NCi0JLy9hbGVydCgidGhlIEZpbmFsIFN0cmluZz0+IiArIHRoZUxvYyk7DQotDQotCS8vZG9jdW1lbnQud3JpdGUodGhlTG9jKTsNCi0JcmV0dXJuIHRoZUxvYzsNCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl96aF9UVy5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfemhfVFcuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NjJkOTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl96aF9UVy5qcworKysgL2Rldi9udWxsCkBAIC0xLDc4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkDQotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLQ0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTEgPSAi5bCa5pyq6LyJ5YWlIFRyZWVCcm93c2XvvIFcbuiri+eojeWAme+8gSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMiA9ICLmraTpoIHpnaLmspLmnIkgJ3swfScg6aCB44CCXG7oq4vlmJfoqablhbbku5blsI7opr3mjInpiJXjgIIiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTMgPSAi5rKS5pyJezB96aCB6Z2i77yBIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0VfcHJldiA9ICLkuIrkuIDpoIEiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9uZXh0ID0gIuS4i+S4gOmggSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3VwID0gIuWQkeS4iiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNCA9ICLnj77ooYzmqpTmoYjkuI3lnKjmqLnni4DngI/opr3lmajkuK3jgIIiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTUgPSAi5bey5L2/55So6aCB5qGG5L6G6aGv56S655m85L2I55qE56uZ5Y+wIjsNCi0NCi1mdW5jdGlvbiBmb3JtYXRTdHJpbmcobWVzc2FnZSwgcmVwbGFjZTApDQotew0KLSAgIAlyZXR1cm4gbWVzc2FnZS5yZXBsYWNlKC9cezBcfS8sIHJlcGxhY2UwKTsNCi19IA0KLQ0KLS8vIHRoaXMgc2NyaXB0IGlzIGZvciB0aGUgdG9wbmF2Lmh0bWwNCi0vLyB0aGlzIGlzIE5PVCBmb3IgZ2VuZXJhbCB1c2UNCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0gIA0KLXZhciB0b3VyID0gMDsNCi0NCi1mdW5jdGlvbiBvcGVuRmlyc3RUb3VyICgpDQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQNCi17DQotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHRvdXIgPSBvcGVuKCIuL3RvdXIvdG91ci5odG0iLCJ0b3VyX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MzUwLGhlaWdodD03MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlblRvdXIgKCkNCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNA0KLXsNCi1pZighdG91ciB8fCB0b3VyPT1udWxsIHx8IHRvdXIuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi0vL0FkZGl0aW9uIGJ5IENoaW5oIFZvIDAzLzI4LzAwDQotIGZ1bmN0aW9uIGRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpDQotIHsNCi0gCXZhciBwYWdlUGF0dGVybiA9IC9vdnVfcHJvYy87DQotIAl2YXIgbWFpblBhZ2UgPSB3aW5kb3cucGFyZW50Lm9yeV9kb2MubG9jYXRpb247DQotDQotIAlpZiAoIHBhZ2VQYXR0ZXJuLnRlc3QoIG1haW5QYWdlICkgKSB7DQotICAgIAlpZiAoZ2V0Q29va2llKCJSVVAiKSAhPSAiY2hlY2tlZCIpIHsgb3BlbkZpcnN0VG91cigpOyB9DQotCX0NCi0JZWxzZSB7DQotCQlzZXRUaW1lb3V0KCAiZGlzcGxheUdldHRpbmdTdGFydGVkKCkiLCAxMDAwICk7DQotCX0NCi19DQotDQotZnVuY3Rpb24gZ2V0Q29va2llIChuYW1lKQ0KLXsNCi0gIHZhciBkY29va2llID0gZG9jdW1lbnQuY29va2llOw0KLSAgdmFyIGNuYW1lID0gbmFtZSArICI9IjsNCi0gIHZhciBjbGVuID0gZGNvb2tpZS5sZW5ndGg7DQotICB2YXIgY2JlZ2luID0gMDsNCi0gIHdoaWxlIChjYmVnaW4gPCBjbGVuKQ0KLSAgew0KLSAgICB2YXIgdmJlZ2luID0gY2JlZ2luICsgY25hbWUubGVuZ3RoOw0KLSAgICBpZiAoZGNvb2tpZS5zdWJzdHJpbmcoY2JlZ2luLCB2YmVnaW4pID09IGNuYW1lKQ0KLSAgICB7DQotICAgICAgdmFyIHZlbmQgPSBkY29va2llLmluZGV4T2YgKCI7IiwgdmJlZ2luKTsNCi0gICAgICBpZiAodmVuZCA9PSAtMSkNCi0gICAgICB7DQotICAgICAgICB2ZW5kID0gY2xlbjsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHVuZXNjYXBlKGRjb29raWUuc3Vic3RyaW5nKHZiZWdpbiwgdmVuZCkpOw0KLSAgICB9DQotICAgIGNiZWdpbiA9IGRjb29raWUuaW5kZXhPZigiICIsIGNiZWdpbikgKyAxOw0KLSAgICBpZiAoY2JlZ2luID09IDApDQotICAgIHsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIG51bGw7DQotIH0NCi0NCi0NCi0gIHZhciBpbmRleD1udWxsOw0KLSAgdmFyIHRvdXI9bnVsbDsNCi0gIHZhciBzZWFyY2g9bnVsbDsNCi0gIHZhciBnbG9zc2FyeT1udWxsOw0KLSAgdmFyIGZlZWRiYWNrPW51bGw7DQotICB2YXIgdHJlZUxvYWRlZD1mYWxzZTsNCi0gIGZ1bmN0aW9uIGNoZWNrVHJlZUxvYWRlZCgpDQotICB7DQotICAgIGlmKHRyZWVMb2FkZWQpDQotICAgIHsNCi0gICAgICByZXR1cm4gdHJlZUxvYWRlZDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgaWYocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0ICE9IG51bGwNCi0gICAgICAgICYmIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpDQotICAgICB7DQotICAgICAgIHRyZWVMb2FkZWQgPSB0cnVlOw0KLSAgICAgfQ0KLSAgICAgKi8NCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsKQ0KLSAgICAgew0KLSAgICAgIAl2YXIgbWV0aG9kID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5Ow0KLQkgaWYgKG1ldGhvZCAhPSAidW5kZWZpbmVkIikgew0KLQkJaWYgKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpDQotCQl7DQotICAgICAgIAkJCXRyZWVMb2FkZWQgPSB0cnVlOw0KLQkJfQ0KLQ0KLQkgIH0NCi0NCi0gICAgIH0NCi0NCi0gICAgIHJldHVybiB0cmVlTG9hZGVkOw0KLSAgIH0NCi0NCi0NCi0gICAgZnVuY3Rpb24gc2hvd0FsZXJ0Tm90TG9hZGVkKCkNCi0gICAgew0KLSAgICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFMSk7DQotICAgIH0NCi0NCi1mdW5jdGlvbiBzaG93U3RhdHVzTm90TG9hZGVkKCkNCi0gIHsNCi0gICAgLy9yZXR1cm4gIlRoZSBUcmVlQnJvd3NlIGlzIG5vdCB5ZXQgbG9hZGVkIVxuUGxlYXNlIHdhaXQhIjsNCi0gICAgcmV0dXJuIHRvcG5hdl9qc19NRVNTQUdFMTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dBbGVydE5vUGFnZSh0ZXh0KQ0KLSAgew0KLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpDQotICAgICB7DQotICAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucy4iKTsNCi0gICAgICAgICAgYWxlcnQoZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMiwgdGV4dCkpOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucyIpOw0KLSAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsNCi0gICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dTdGF0dXNOb1BhZ2UodGV4dCkNCi0gIHsNCi0NCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG1zZzsNCi0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7DQotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7DQotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsNCi0gICAgIH0NCi0NCi0gICAgIHJldHVybiBtc2c7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93UGFyZW50TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBwYXJlbnR1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotDQotICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgcGFyZW50dXJsIT0iIiAmJiBwYXJlbnR1cmwhPW51bGwpDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vUGFnZSgidXAiKTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93SG9tZUxhYmVsKCkNCi0gIHsNCi0gICAgc2VsZi5zdGF0dXMgPSAiSG9tZSI7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93UHJldmlvdXNMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgcHJldnVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHByZXZ1cmwhPSIiICYmIHByZXZ1cmwhPW51bGwpDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInByZXZpb3VzIik7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd05leHRMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBuZXh0dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgbmV4dHVybCE9IiIgJiYgbmV4dHVybCE9bnVsbCkNCi0gICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vUGFnZSgibmV4dCIpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUHJldmlvdXMoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLQ0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpDQotCXsNCi0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQ0KLQl7DQotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpDQotCXsNCi0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIlByZXZpb3VzIik7DQotCX0NCi0JICAgICAgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX3ByZXYpOw0KLSAgICAgfQ0KLSAgICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkTmV4dCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICB2YXIgbmV3TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLQ0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpDQotCXsNCi0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQ0KLQl7DQotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpDQotCXsNCi0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIk5leHQiKTsNCi0JfQ0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotDQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfbmV4dCk7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGxvYWRQYXJlbnQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV91cCk7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotZnVuY3Rpb24gd2hlcmVBbUkoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLQl2YXIgc3RhdHVzID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgCWlmKCBzdGF0dXMgPT0gZmFsc2UgKQ0KLQl7DQotCQlhbGVydCggdG9wbmF2X2pzX01FU1NBR0U0ICk7DQotCX0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gdXBBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnVwQXJyb3coKTsNCi0gICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gZG93bkFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZG93bkFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotDQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gbGVmdEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5sZWZ0QXJyb3coKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgICBmdW5jdGlvbiByaWdodEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5yaWdodEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIikNCi0gIHsNCi0gICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFNSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsNCi0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsNCi0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKw0KLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsNCi0NCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7DQotDQotICAgIGZvcihpPWRvY3VtZW50LmxpbmtzLmxlbmd0aC0xO2k+PTA7aS0tKQ0KLSAgICB7DQotICAgICAgIGlmKGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuaW5kZXhPZigiaW5kZXguaHRtIikhPS0xKQ0KLSAgICAgICB7DQotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZjsNCi0gICAgICAgICBicmVhazsNCi0gICAgICAgfQ0KLSAgICB9DQotDQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkNCi0gICAgew0KLQlpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApDQotCXsNCi0JCXdpbmRvdy5jbG9zZSgpOw0KLQkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBvcGVuT3J5IChwYWdlLCB0YXJnZXQpDQotew0KLSAgICBpZighaW5kZXggfHwgaW5kZXguY2xvc2VkKQ0KLSAgICB7DQotICAgICAgaW5kZXggPSBvcGVuKHBhZ2UsdGFyZ2V0LCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzk1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGluZGV4LmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlblNlYXJjaCgpDQotew0KLSAgICBpZighc2VhcmNoIHx8IHNlYXJjaC5jbG9zZWQpDQotICAgIHsNCi0gICAgICBzZWFyY2ggPSBvcGVuKCIuL2FwcGxldC9zZWFyY2guaHRtIiwic2VhcmNoX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz1ubyx3aWR0aD02MzAsaGVpZ2h0PTQ1MCxyZXNpemFibGU9eWVzIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2VhcmNoLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlbkluZGV4KCkNCi17DQotICAgb3Blbk9yeSgiLi9pbmRleC9pbmRleC5odG0iLCJpbmRleF93aW4iKTsNCi19DQotDQotZnVuY3Rpb24gb3Blbkdsb3NzYXJ5KCkNCi17DQotIGlmKCFnbG9zc2FyeSB8fCBnbG9zc2FyeS5jbG9zZWQpDQotICAgIHsNCi0gICAgICBnbG9zc2FyeSA9IG9wZW4oIi4vcHJvY2Vzcy9nbG9zc2FyeS9pbmRleC5odG0iLCJnbG9zc2FyeV93aW4iLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzg1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGdsb3NzYXJ5LmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gcHJpbnRQYWdlKCkNCi17DQotIHBhcmVudC5vcnlfZG9jLmZvY3VzKCk7DQotIHBhcmVudC5vcnlfZG9jLnByaW50KCk7DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHNlbmRGZWVkYmFjayh1cmwpDQotew0KLQlpZiAoIHVybCA9PSBudWxsIHx8IHVybCA9PSAnJyApDQotCXsNCi0JCXJldHVybjsNCi0JfQ0KLQkNCi0JaWYgKCB1cmwuaW5kZXhPZigibWFpbHRvOiIpID49IDAgKQ0KLQl7DQotCQlzZW5kbWFpbCh1cmwpOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJDQotIAkgICAgaWYoIWZlZWRiYWNrIHx8IGZlZWRiYWNrLmNsb3NlZCkNCi0JICAgIHsNCi0JICAgICAgZmVlZGJhY2sgPSBvcGVuKHVybCwiZmVlZGJhY2tfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTYwMCxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0JICAgIH0NCi0JICAgIGVsc2UNCi0JICAgIHsNCi0JICAgICAgZmVlZGJhY2suZm9jdXMoKTsNCi0JICAgIH0NCi0gICAgCX0NCi0gICAgCQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kbWFpbCh1cmwpDQotew0KLQlpZiAoIHVybC5pbmRleE9mKCI/c3ViamVjdCIpID09IC0xICkNCi0Jew0KLQkJdmFyIGxpbms9cGFyZW50Lm9yeV9kb2MubG9jYXRpb247DQotCQl1cmwgPSB1cmwgKyAnP3N1YmplY3Q9RmVlZGJhY2s6IC0gJytsaW5rOw0KLQl9DQotCWxvY2F0aW9uLnJlcGxhY2UodXJsKTsNCi19DQotDQotLy9jYWxjdWxhdGVzIHJlbGF0aXZlIHBhdGgNCi0vL3BhdGggbXVzdCBiZSBhbGwgcmVsYXRpdmUgZnJvbSB3ZWJzaXRlIGJhc2Ugb3IgY29udGFpbiBmdWxsIHVybHMNCi1mdW5jdGlvbiBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgoc291cmNlUGF0aCwgdGFyZ2V0UGF0aCkNCi17DQotCWlmICh0YXJnZXRQYXRoLmluZGV4T2YoImh0dHA6LyIpICE9IC0xKQ0KLQl7DQotCQlyZXR1cm4gdGFyZ2V0UGF0aDsNCi0JfQ0KLQ0KLQkvL3JlcGxhY2UgYWxsICdcJyB3aXRoICcvJw0KLQlzb3VyY2VQYXRoID0gc291cmNlUGF0aC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQl0YXJnZXRQYXRoID0gdGFyZ2V0UGF0aC5yZXBsYWNlKC9cXC9nLCIvIik7DQotDQotCS8vYWxlcnQoIlJlcGxhY2UoU291cmNlKT0+IiArIHNvdXJjZVBhdGgpOw0KLQkvL2FsZXJ0KCJSZXBsYWNlKHRhcmdldCk9PiIgKyB0YXJnZXRQYXRoKTsNCi0NCi0NCi0Jc291cmNlQXJyYXkgPSBzb3VyY2VQYXRoLnNwbGl0KCIvIik7DQotCXRhcmdldEFycmF5ID0gdGFyZ2V0UGF0aC5zcGxpdCgiLyIpOw0KLQ0KLQl2YXIgdGhlUmVsUGF0aCA9ICIiOw0KLQ0KLQkvL2xvb3AgdW50aWwgd2UgZmluZCBhIGRpZmZlcmVuY2UNCi0JdmFyIGlkeCA9IDA7DQotCWZvcihpZHggPSAwOyBpZHggPCBzb3VyY2VBcnJheS5sZW5ndGg7IGlkeCsrKQ0KLQl7DQotCQlpZiAoaWR4ID4gdGFyZ2V0UGF0aC5sZW5ndGgpDQotCQl7DQotCQkJYnJlYWs7DQotCQl9DQotDQotCQlpZiAoc291cmNlQXJyYXlbaWR4XSAhPSB0YXJnZXRBcnJheVtpZHhdKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQl9DQotDQotCS8vYXBwZW5kIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgLi8NCi0JdmFyIG1heElkeCA9IHNvdXJjZUFycmF5Lmxlbmd0aCAtIDE7DQotCWZvciAodmFyIGkgPSBpZHg7IGkgPCBtYXhJZHg7IGkrKykNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyAiLi8iOw0KLQ0KLQkJLy9hbGVydCgiUmVsUGF0aD0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vYXBwZW5kIGFueSByZW1haW5pbmcgdGFyZ2V0IHBhdGgNCi0Jd2hpbGUoaWR4IDwgdGFyZ2V0QXJyYXkubGVuZ3RoKQ0KLQl7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aCArIHRhcmdldEFycmF5W2lkeCsrXSArICIvIjsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoZmluYWwpPT4iICsgdGhlUmVsUGF0aCk7DQotCX0NCi0NCi0JLy9yZW1vdmUgdGhlIGxhc3QgcGF0aCBzZXBhcmF0b3INCi0JaWYgKHRoZVJlbFBhdGgubGVuZ3RoID4gMCkNCi0Jew0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoLnN1YnN0cmluZygwLCAodGhlUmVsUGF0aC5sZW5ndGggLSAxKSk7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKFRyaW0xKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vYWxlcnQoIlJldHVybiBSZWxhdGl2ZSBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0NCi0JcmV0dXJuIHRoZVJlbFBhdGg7DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldFRyZWVQYXRoKCkNCi17DQotCXJldHVybiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKTsNCi19DQotDQotLy9UaGlzIG1ldGhvZCB3aWxsIHJlbW92ZSB0aGUgd2Vic2l0ZSBiYXNlIGZyb20gdGhlIHVybA0KLWZ1bmN0aW9uIGNhbGN1bGF0Q3VycmVudFBhZ2UoY3VyclVSTCkgew0KLQ0KLQl2YXIgdGhlQ3VycmVudExvY2F0aW9uID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0JdGhlQ3VycmVudExvY2F0aW9uID0gdGhlQ3VycmVudExvY2F0aW9uLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotCWN1cnJVUkwgPSBjdXJyVVJMLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotDQotCXZhciBzb3VyY2VBcnJheSA9IHRoZUN1cnJlbnRMb2NhdGlvbi5zcGxpdCgiLyIpOw0KLQl2YXIgY3VyckFycmF5ID0gY3VyclVSTC5zcGxpdCgiLyIpOw0KLQ0KLQl2YXIgbnVtVG9SZW1vdmUgPSBzb3VyY2VBcnJheS5sZW5ndGggLSAyOw0KLQl2YXIgaWR4ID0gMDsNCi0JdmFyIHRoZVJldHVyblBhdGggPSAiIjsNCi0JZm9yIChpZHggPSBudW1Ub1JlbW92ZTsgaWR4IDwgY3VyckFycmF5Lmxlbmd0aDsgaWR4KyspIHsNCi0JCWlmICh0aGVSZXR1cm5QYXRoICE9ICIiKSB7DQotCQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyAiLyI7DQotCQl9DQotCQl0aGVSZXR1cm5QYXRoID0gdGhlUmV0dXJuUGF0aCArIGN1cnJBcnJheVtpZHhdOw0KLQl9DQotDQotCS8vYWxlcnQoIkFycmF5VGVzdD0+IiArIGN1cnJVUkwgKyAiLCIgKyB0aGVSZXR1cm5QYXRoKTsNCi0JcmV0dXJuIHRoZVJldHVyblBhdGg7DQotfQ0KLQ0KLS8vYnVpbGRzIHRyZWUgcGF0aA0KLWZ1bmN0aW9uIGJ1aWxkVHJlZVBhdGhMb2NhdGlvbigpDQotew0KLQl2YXIgdGhlRGVsaW1pdGVyID0gIiMjKiI7DQotCXZhciB0aGlzUGFnZSA9ICJhcHBsZXQvcnVwX3RvcG5hdi5odG0iOw0KLQl2YXIgdGhlTG9jID0gIiI7DQotDQotDQotDQotCWlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLQl7DQotCQl2YXIgdGhlQ3VycmVudExvY2F0aW9uID0gcGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCi0JCXRoaXNQYWdlID0gY2FsY3VsYXRDdXJyZW50UGFnZSh0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJLy9hbGVydCgiUGF0aE5hbWU6IiArIHRoaXNQYWdlKTsNCi0NCi0JCS8vYWxlcnQoIlRyeWluZyB0byBmaW5kIHRoZSBwYXRoIGZvciA9PiIgKyB0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJdmFyIHRoZVBhdGggPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuZ2V0VHJlZVBhdGhBcnJheSh0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJLy9hbGVydCgiVGhlIFRyZWUgUGF0aDogIiArIHRoZVBhdGgpOw0KLQ0KLQkJdGhlUGF0aFN0cmluZyA9IHRoZVBhdGggKyAiIjsNCi0gICAgCQlhcnJheUZyb21TdHJpbmcgPSB0aGVQYXRoU3RyaW5nLnNwbGl0KHRoZURlbGltaXRlcik7DQotDQotCQkvL2J1aWxkIHRoZSBwYXRoIGZyb20gdGhlIGFycmF5DQotCQkvL3BhcmFtIDEgPSBwYXRoIHRvIGljb24sIHBhcmFtIDIgLSBsYWJlbCwgcGFyYW0gMyAtIHBhdGggdG8gZmlsZQ0KLQkJdmFyIGNvdW50ZXIgPSAwOw0KLQkJdmFyIHRoZUxhYmVsOw0KLQkJdmFyIHRoZVJlbFBhdGg7DQotCQlpZiAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCA+IDIpDQotCQl7DQotCQkgICB0aGVMb2MgPSAiIjsNCi0JCSAgIGZvcih2YXIgaSA9IDA7IGkgPCAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCAtIDEpIDsgaSsrKQ0KLQkJICAgew0KLQkJCS8vaXQncyB0aGUgaWNvbiBwYXRoDQotCQkJaWYgKGNvdW50ZXIgPCAyKQ0KLQkJCXsNCi0JCQkJaWYgKGNvdW50ZXIgPiAwKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKyAiICZndDsgIjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMSkgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0NCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCJcXCIpID09IC0xICYmIGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCIvIikgPT0gLTEpDQotCQkJCXsNCi0JCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0gIT0gIm51bGwiKQ0KLQkJCQkJew0KLQkJCQkJCXRoZVJlbFBhdGggPSAiYXBwbGV0L2ltYWdlcy8iICsgYXJyYXlGcm9tU3RyaW5nW2ldOw0KLQkJCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIHRoZVJlbFBhdGgpOw0KLQkJCQkJfQ0KLQkJCQkJLy9hbGVydCgiTW9kaWZ5aW5nIFBhdGggPT4gIiArIHRoZVJlbFBhdGgpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJfQ0KLQ0KLQkJCQlpZiAodGhlUmVsUGF0aCAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkJICI8aW1nIGJvcmRlcj0wIHNyYz1cIiIgKw0KLQkJCQkJCSB0aGVSZWxQYXRoICArDQotCQkJCQkJICJcIj4iOw0KLQkJCQl9DQotDQotCQkJCS8vYWxlcnQoInRoZSBjdXJyIHBhdGg9PiIgKyB0aGVMb2MpOw0KLQkJCQljb3VudGVyID0gMjsNCi0JCQl9DQotCQkJLy8gaXQncyB0aGUgbGFiZWwNCi0JCQllbHNlIGlmIChjb3VudGVyID09IDIpDQotCQkJew0KLQkJCQl0aGVMYWJlbCA9IGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJY291bnRlciA9IDM7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKGNvdW50ZXIgPT0gMykNCi0JCQl7DQotCQkJCS8vYWxlcnQoIkNhbGN1bGF0aW5nIHBhdGggZnJvbSgzKSAiICsgdGhpc1BhZ2UgKyAiID0+ICIgKyBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJew0KLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJCWlmICh0aGVSZWxQYXRoICE9ICIiKSB7DQotCQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIiB0YXJnZXQ9XCJvcnlfZG9jXCIgaHJlZj1cIiIgKw0KLQkJCQkJCQkgdGhlUmVsUGF0aCArDQotCQkJCQkgCQkiXCI+IiArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQkJIGVsc2Ugew0KLQkJCQkJIAl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJCXRoZUxhYmVsICsNCi0JCQkJCSAJCSI8XC9hPlxuIjsNCi0JCQkJCSB9DQotCQkJCX0NCi0JCQkJZWxzZQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkiPGEgY2xhc3M9XCJob3R0ZXh0XCI+IiAgKw0KLQkJCQkJIAl0aGVMYWJlbCArDQotCQkJCQkgCSI8XC9hPlxuIjsNCi0JCQkJfQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDE7DQotCQkJCXRoZVJlbFBhdGggPSAibnVsbCI7DQotCQkJCXRoZUxhYmVsID0gIm51bGwiOw0KLQkJCX0NCi0JCSAgIH0NCi0NCi0JCS8vYWxlcnQoIkZpbmlzaGVkIEJ1aWxkaW5nID0+ICIgKyB0aGVMb2MpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCS8vdGhlTG9jID0gIkN1cnJlbnQgTG9jYXRpb24mbmJzcDsmIzA0NTsmbmJzcDsiICsgdGhlTG9jOw0KLQ0KLQkvL2FsZXJ0KCJ0aGUgRmluYWwgU3RyaW5nPT4iICsgdGhlTG9jKTsNCi0NCi0JLy9kb2N1bWVudC53cml0ZSh0aGVMb2MpOw0KLQlyZXR1cm4gdGhlTG9jOw0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2RlLmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc3BzY3JlZW5fZGUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Njc0Mzk4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc3BzY3JlZW5fZGUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLQotPCEtLSBSUFcgTUVUQSBEQVRBIFNUQVJUIC0tCi0gCi0gCi0tLSBSUFcgTUVUQSBEQVRBIEVORCAtLT4KLQotPGh0bWw+Ci0KLTxoZWFkPgotPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJyb3AuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIvPgotPHRpdGxlPkVpbmdhbmdzYW56ZWlnZTwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi0KLQotPHAgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC9wPgotPGgyIGFsaWduPSJjZW50ZXIiPkJpdHRlIHdhcnRlbi4uLkRlciBCYXVtc3RydWt0dXJicm93c2VyIHdpcmQgZ2VsYWRlbi4uLjxici8+PC9oMj4KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTwhLS0gCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iaW1hZ2VzL3NwbGFzaC5naWYiIGFsdD0iV2lsbGtvbW1lbiBiZWltIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiLz48L3A+Ci0tLT4KLTxici8+Ci08YnIvPgotCi0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zcHNjcmVlbl9lcy5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2VzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwYjkzNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2VzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi0KLTwhLS0gUlBXIE1FVEEgREFUQSBTVEFSVCAtLQotIAotIAotLS0gUlBXIE1FVEEgREFUQSBFTkQgLS0+Ci0KLTxodG1sPgotCi08aGVhZD4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0icm9wLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4KLTx0aXRsZT5QYW50YWxsYSBkZSBwcmVzZW50YWNp8248L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotCi0KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTxoMiBhbGlnbj0iY2VudGVyIj5Fc3BlcmUgbWllbnRyYXMgc2UgY2FyZ2EgZWwgbmF2ZWdhZG9yIGRlbCDhcmJvbC4uLjxici8+PC9oMj4KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTwhLS0gCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iaW1hZ2VzL3NwbGFzaC5naWYiIGFsdD0iQmllbnZlbmlkbyBhIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiLz48L3A+Ci0tLT4KLTxici8+Ci08YnIvPgotCi0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zcHNjcmVlbl9mci5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2ZyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg5Zjc0My4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2ZyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi0KLTwhLS0gUlBXIE1FVEEgREFUQSBTVEFSVCAtLQotIAotIAotLS0gUlBXIE1FVEEgREFUQSBFTkQgLS0+Ci0KLTxodG1sPgotCi08aGVhZD4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0icm9wLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4KLTx0aXRsZT5FY3JhbiBkJ2FjY3VlaWw8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotCi0KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTxoMiBhbGlnbj0iY2VudGVyIj5WZXVpbGxleiBwYXRpZW50ZXIgcGVuZGFudCBsZSBjaGFyZ2VtZW50IGR1IG5hdmlnYXRldXIgZCdhcmJvcmVzY2VuY2UuLi48YnIvPjwvaDI+Ci08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08IS0tIAotPHAgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9ImltYWdlcy9zcGxhc2guZ2lmIiBhbHQ9IkJpZW52ZW51ZSBkYW5zIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiLz48L3A+Ci0tLT4KLTxici8+Ci08YnIvPgotCi0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zcHNjcmVlbl9pdC5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2l0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyZTZjNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2l0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi0KLTwhLS0gUlBXIE1FVEEgREFUQSBTVEFSVCAtLQotIAotIAotLS0gUlBXIE1FVEEgREFUQSBFTkQgLS0+Ci0KLTxodG1sPgotCi08aGVhZD4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0icm9wLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4KLTx0aXRsZT5TY2hlcm1hdGEgaW5pemlhbGU8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotCi0KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTxoMiBhbGlnbj0iY2VudGVyIj5BdHRlbmRlcmUsIGNhcmljYW1lbnRvIGRlbCBicm93c2VyIGRlbGxhIHN0cnV0dHVyYSBpbiBjb3Jzby4uLjxici8+PC9oMj4KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTwhLS0gCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iaW1hZ2VzL3NwbGFzaC5naWYiIGFsdD0iQmVudmVudXRpIGluIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiLz48L3A+Ci0tLT4KLTxici8+Ci08YnIvPgotCi0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zcHNjcmVlbl9qYS5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2phLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdmN2VkMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2phLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi0KLTwhLS0gUlBXIE1FVEEgREFUQSBTVEFSVCAtLQotIAotIAotLS0gUlBXIE1FVEEgREFUQSBFTkQgLS0+Ci0KLTxodG1sPgotCi08aGVhZD4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0icm9wLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ii8+Ci08dGl0bGU+44K544OX44Op44OD44K344Ol55S76Z2iPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLQotCi08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08aDIgYWxpZ249ImNlbnRlciI+44OE44Oq44O844O744OW44Op44Km44K244O844Gu44Ot44O844OJ44GM5a6M5LqG44GZ44KL44G+44Gn44GK5b6F44Gh44GP44Gg44GV44GELi4uPGJyLz48L2gyPgotPHAgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC9wPgotPCEtLSAKLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSJpbWFnZXMvc3BsYXNoLmdpZiIgYWx0PSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIOOBuOOCiOOBhuOBk+OBnSIvPjwvcD4KLS0tPgotPGJyLz4KLTxici8+Ci0KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2tvLmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc3BzY3JlZW5fa28uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2FjY2E5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc3BzY3JlZW5fa28uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLQotPCEtLSBSUFcgTUVUQSBEQVRBIFNUQVJUIC0tCi0gCi0gCi0tLSBSUFcgTUVUQSBEQVRBIEVORCAtLT4KLQotPGh0bWw+Ci0KLTxoZWFkPgotPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJyb3AuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz4KLTx0aXRsZT7si5zsnpEg7ZmU66m0PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLQotCi08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08aDIgYWxpZ249ImNlbnRlciI+7Yq466asIOu4jOudvOyasOyggOqwgCDroZzrk5zrkKAg65WM6rmM7KeAIOq4sOuLpOumrOyLreyLnOyYpC4uLjxici8+PC9oMj4KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTwhLS0gCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iaW1hZ2VzL3NwbGFzaC5naWYiIGFsdD0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayDsgqzsmqnsnYQg7ZmY7JiB7ZWp64uI64ukLiIvPjwvcD4KLS0tPgotPGJyLz4KLTxici8+Ci0KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX3B0X0JSLmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc3BzY3JlZW5fcHRfQlIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTI5MDYzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc3BzY3JlZW5fcHRfQlIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLQotPCEtLSBSUFcgTUVUQSBEQVRBIFNUQVJUIC0tCi0gCi0gCi0tLSBSUFcgTUVUQSBEQVRBIEVORCAtLT4KLQotPGh0bWw+Ci0KLTxoZWFkPgotPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJyb3AuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIvPgotPHRpdGxlPlRlbGEgZGUgQWJlcnR1cmEgPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLQotCi08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08aDIgYWxpZ249ImNlbnRlciI+QWd1YXJkZSBlbnF1YW50byBvIG5hdmVnYWRvciBlbSDDoXJ2b3JlIGVzdMOhIHNlbmRvIGNhcnJlZ2Fkby4uLjxici8+PC9oMj4KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTwhLS0gCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iaW1hZ2VzL3NwbGFzaC5naWYiIGFsdD0iQmVtLXZpbmRvIGFvIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiLz48L3A+Ci0tLT4KLTxici8+Ci08YnIvPgotCi0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zcHNjcmVlbl96aF9DTi5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX3poX0NOLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBiNDNiNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX3poX0NOLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi0KLTwhLS0gUlBXIE1FVEEgREFUQSBTVEFSVCAtLQotIAotIAotLS0gUlBXIE1FVEEgREFUQSBFTkQgLS0+Ci0KLTxodG1sPgotCi08aGVhZD4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0icm9wLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ii8+Ci08dGl0bGU+6Zeq5bGPPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLQotCi08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08aDIgYWxpZ249ImNlbnRlciI+5q2j5Zyo6KOF5YWl5qCR5b2i5rWP6KeI5Zmo77yM6K+356iN5YCZLi4uPGJyLz48L2gyPgotPHAgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC9wPgotPCEtLSAKLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSJpbWFnZXMvc3BsYXNoLmdpZiIgYWx0PSLmrKLov47kvb/nlKggRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayIvPjwvcD4KLS0tPgotPGJyLz4KLTxici8+Ci0KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX3poX1RXLmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc3BzY3JlZW5femhfVFcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjdmYTc3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc3BzY3JlZW5femhfVFcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLQotPCEtLSBSUFcgTUVUQSBEQVRBIFNUQVJUIC0tCi0gCi0gCi0tLSBSUFcgTUVUQSBEQVRBIEVORCAtLT4KLQotPGh0bWw+Ci0KLTxoZWFkPgotPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJyb3AuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz4KLTx0aXRsZT7pgLLlhaXnlavpnaI8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotCi0KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTxoMiBhbGlnbj0iY2VudGVyIj7mraPlnKjovInlhaXmqLnni4DngI/opr3lmajvvIzoq4vnqI3lgJkuLi48YnIvPjwvaDI+Ci08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08IS0tIAotPHAgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9ImltYWdlcy9zcGxhc2guZ2lmIiBhbHQ9Iuatoei/juS9v+eUqCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIi8+PC9wPgotLS0+Ci08YnIvPgotPGJyLz4KLQotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTEyNTlkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgUHVibGlzaGluZyAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiM2VjYzAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFZlclx1MDBmNmZmZW50bGljaHVuZw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZTMyNmQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVB1YmxpY2FjaVx1MDBmM24gZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3ODczNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9UHVibGljYXRpb24gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5faXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkNDllMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9UHViYmxpY2F6aW9uZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDQwNDEwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgUHVibGlzaGluZw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOTQ0Y2MuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdWFjZjVcdWFjMWMNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2QzN2EwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1QdWJsaWNhXHUwMGU3XHUwMGUzbyBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzJhMWEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHU1M2QxXHU1ZTAzDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0MDQxMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFB1Ymxpc2hpbmcNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmODAzNDguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQUDAwMDBFIC0gSVVQUDAwOTlFDQotIw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZT1Lb25maWd1cmF0aW9uIHdpcmQgdmVyXHUwMGY2ZmZlbnRsaWNodC4uLg0KLWluaXRpYWxpemluZ0RpclRhc2tfbmFtZT1aaWVsdmVyemVpY2huaXMgd2lyZCBpbml0aWFsaXNpZXJ0Li4uDQotY29weWluZ0ZpbGVzVGFza19uYW1lPURhdGVpZW4gd2VyZGVuIGtvcGllcnQuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtzVGFza19uYW1lPUxlc2V6ZWljaGVuIHdlcmRlbiBnZW5lcmllcnQuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtUYXNrX25hbWU9TGVzZXplaWNoZW4gJyd7MH0nJyB3aXJkIGdlbmVyaWVydC4uLg0KLWdlbmVyYXRpbmdCb29rbWFya0luZGV4VGFza19uYW1lPUxlc2V6ZWljaGVuaW5kZXggd2lyZCBnZW5lcmllcnQuLi4NCi1wdWJsaXNoaW5nTGlua2VkRWxlbWVudFRhc2tfbmFtZT1NZXRob2RlbmVsZW1lbnRlIHdlcmRlbiB2ZXJcdTAwZjZmZmVudGxpY2h0LiBWZXJcdTAwZjZmZmVudGxpY2h0OiB7MH0sIFZlcmJsZWliZW5kOiB7MX0NCi1wdWJsaXNoaW5nRWxlbWVudFRhc2tfbmFtZT1NZXRob2RlbmVsZW1lbnQgd2lyZCB2ZXJcdTAwZjZmZmVudGxpY2h0OiB7MH06ezF9DQotZ2VuZXJhdGluZ0dsb3NzYXJ5VGFza19uYW1lPUdsb3NzYXIgd2lyZCBnZW5lcmllcnQuLi4NCi1nZW5lcmF0aW5nU2VhcmNoSW5kZXhUYXNrX25hbWU9U3VjaGluZGV4IHdpcmQgZ2VuZXJpZXJ0Li4uDQotYnVpbGRpbmdQcm9jZXNzQ2xvc3VyZVRhc2tfbmFtZT1BYmdlc2NobG9zc2VuZXIgUHJvemVzcyB3aXJkIGVyc3RlbGx0Li4uDQotYnVpbGRpbmdFbGVtZW50Q2xvc3VyZVRhc2tfbmFtZT1BYmdlc2NobG9zc2VuZXMgRWxlbWVudCBmXHUwMGZjciAnJ3swfScnIHdpcmQgZXJzdGVsbHQuLi4NCi1sb2FkTGlicmFyeVRhc2tfbmFtZT1CaWJsaW90aGVrc2luaGFsdCB3aXJkIGdlbGFkZW4uLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzIGxvZ2dlZCBpbiB0aGUgUHVibGlzaGluZyBSZXBvcnQNCi1wdWJsaXNoRWxlbWVudEVycm9yX21zZz1JVVBQMDAwMEU6IEZlaGxlciBiZWltIFZlclx1MDBmNmZmZW50bGljaGVuIGRlcyBFbGVtZW50cyB7MH0NCi1zZXJ2ZXJFcnJvcl9tc2c9SVVQUDAwMDFFOiBFcyB3dXJkZW4ga2VpbmUgRGF0ZW4gdm9tIFNlcnZlciB6dXJcdTAwZmNja2dlZ2ViZW4uDQotaW52YWxpZEh0dHBSZXNwb25zZUVycm9yX21zZz1JVVBQMDAwMkU6IFVuZ1x1MDBmY2x0aWdlIEFudHdvcnQgdm9uIGh0dHA6Ly97MH06ezF9OnsyfQ0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZz1JVVBQMDAwM1c6IERhcyBFbGVtZW50IHd1cmRlIG5pY2h0IHZlclx1MDBmNmZmZW50bGljaHQsIHdlaWwgZXMga2VpbiBnXHUwMGZjbHRpZ2VzIEVsZW1lbnQgaW4gZGVyIEtvbmZpZ3VyYXRpb24gaXN0Lg0KLWludmFsaWRNZXRob2RFbGVtZW50V2FybmluZ19tc2c9SVVQUDAwMDRXOiBEYXMgRWxlbWVudCB3dXJkZSBuaWNodCB2ZXJcdTAwZjZmZmVudGxpY2h0LCB3ZWlsIGVzIGtlaW4gTWV0aG9kZW5lbGVtZW50IGlzdDogezB9DQotY29weUZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNVc6IERpZSBEYXRlaSBrYW5uIG5pY2h0IHZvbiAnJ3swfScnIG5hY2ggJyd7MX0nJyBrb3BpZXJ0IHdlcmRlbi4NCi1taXNzaW5nSWNvbkZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNlc6IERpZSBLbm90ZW5zeW1ib2xkYXRlaSAnJ3swfScnIGlzdCBuaWNodCB2b3JoYW5kZW4uDQotbWlzc2luZ0ljb25OYW1lV2FybmluZ19tc2c9SVVQUDAwMDdXOiBEZXIgTmFtZSBkZXMgS25vdGVuc3ltYm9scyBrYW5uIG5pY2h0IGFiZ2VydWZlbiB3ZXJkZW4uDQotZXh0ZXJuYWxVcmxfbXNnPVJlZmVyZW56IGF1ZiBleHRlcm5lbiBVUkw6IHswfQ0KLWRpc2NhcmVkQ2F0ZWdvcnlXYXJuaW5nX21zZz1EYXMgbGVlcmUgSW5oYWx0c2thdGVnb3JpZWVsZW1lbnQgd2lyZCBuaWNodCB2ZXJcdTAwZjZmZmVudGxpY2h0Lg0KLQ0KLSMgRXJyb3IgRGV0YWlscw0KLWNyZWF0ZVNlYXJjaEluZGV4RXJyb3JfbXNnPUlVUFAwMDA4RTogRGllIFN1Y2hpbmRleGRhdGVpIHd1cmRlIG5pY2h0IGVyc3RlbGx0Lg0KLQ0KLSMgUHJvY2VzcyBUcmVlIE5vZGVzDQotcmVmZXJlbmNlV29ya2Zsb3dzTm9kZV90ZXh0PVJlZmVyZW56d29ya2Zsb3dzDQotdGFza05vZGVfdGV4dD1BdWZnYWJlbg0KLXByaW1hcmlseVBlcmZvcm1zTm9kZV90ZXh0PUZcdTAwZmNocnQgKGhhdXB0c1x1MDBlNGNobGljaCkgYXVzOg0KLWFkZGl0aW9uYWxseVBlcmZvcm1zTm9kZV90ZXh0PVp1c1x1MDBlNHR6bGljaGUgQXVmZ2FiZW46DQotcGVyZm9ybWluZ1JvbGVzTm9kZV90ZXh0PUF1c2ZcdTAwZmNocmVuZGUgUm9sbGVuDQotaW5wdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9RWluZ2FiZWFyYmVpdHNlcmdlYm5pc3NlDQotb3V0cHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PUF1c2dhYmVhcmJlaXRzZXJnZWJuaXNzZQ0KLXJlc3BvbnNpYmxlRm9yTm9kZV90ZXh0PVZlcmFudHdvcnRsaWNoIGZcdTAwZmNyDQotbW9kaWZpZXNOb2RlX3RleHQ9XHUwMGM0bmRlcnVuZw0KLXJlc3BvbnNpYmxlUm9sZU5vZGVfdGV4dD1WZXJhbnR3b3J0bGljaGUgUm9sbGUNCi1jb250YWluaW5nV29ya1Byb2R1Y3ROb2RlX3RleHQ9XHUwMGRjYmVyZ2VvcmRuZXRlcyBBcmJlaXRzZXJnZWJuaXMNCi1jb250YWluZWRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9RW50aGFsdGVuZSBBcmJlaXRzZXJnZWJuaXNzZQ0KLWd1aWRhbmNlTm9kZV90ZXh0PUFubGVpdHVuZw0KLWlucHV0VG9Ob2RlX3RleHQ9RWluZ2FiZSBmXHUwMGZjcg0KLW91dHB1dEZyb21Ob2RlX3RleHQ9QXVzZ2FiZSB2b24NCi0NCi0jIEhUTUwgVGl0bGUgZm9yIEluZGV4IFBhZ2UNCi1pbmRleExhYmVsX3RleHQ9SW5kZXgNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MzQwNzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQUDAwMDBFIC0gSVVQUDAwOTlFDQotIw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZT1QdWJsaWNhbmRvIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbi4uLg0KLWluaXRpYWxpemluZ0RpclRhc2tfbmFtZT1JbmljaWFsaXphbmRvIGVsIGRpcmVjdG9yaW8gZGUgZGVzdGluby4uLg0KLWNvcHlpbmdGaWxlc1Rhc2tfbmFtZT1Db3BpYW5kbyBhcmNoaXZvcy4uLg0KLWdlbmVyYXRpbmdCb29rbWFya3NUYXNrX25hbWU9R2VuZXJhbmRvIG1hcmNhZG9yZXMuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtUYXNrX25hbWU9R2VuZXJhbmRvIGVsIG1hcmNhZG9yICcnezB9JycuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtJbmRleFRhc2tfbmFtZT1HZW5lcmFuZG8gZWwgXHUwMGVkbmRpY2UgZGUgbWFyY2Fkb3Jlcy4uLg0KLXB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lPVB1YmxpY2FuZG8gZWxlbWVudG9zIGRlIG1cdTAwZTl0b2RvOiB7MH0gcHVibGljYWRvcywgezF9IHJlc3RhbnRlcw0KLXB1Ymxpc2hpbmdFbGVtZW50VGFza19uYW1lPVB1YmxpY2FuZG8gZWwgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG86IHswfTp7MX0NCi1nZW5lcmF0aW5nR2xvc3NhcnlUYXNrX25hbWU9R2VuZXJhbmRvIGdsb3NhcmlvLi4uDQotZ2VuZXJhdGluZ1NlYXJjaEluZGV4VGFza19uYW1lPUdlbmVyYW5kbyBcdTAwZWRuZGljZSBkZSBiXHUwMGZhc3F1ZWRhLi4uDQotYnVpbGRpbmdQcm9jZXNzQ2xvc3VyZVRhc2tfbmFtZT1Db25zdHJ1eWVuZG8gY2llcnJlIGRlbCBwcm9jZXNvLi4uDQotYnVpbGRpbmdFbGVtZW50Q2xvc3VyZVRhc2tfbmFtZT1Db25zdHJ1eWVuZG8gZWwgY2llcnJlIGRlIGVsZW1lbnRvIHBhcmEgJyd7MH0nJy4uLg0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPUNhcmdhbmRvIGVsIGNvbnRlbmlkbyBkZSBsYSBiaWJsaW90ZWNhLi4uDQotDQotIyBFcnJvciBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotcHVibGlzaEVsZW1lbnRFcnJvcl9tc2c9SVVQUDAwMDBFOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgcHVibGljYXIgZWwgZWxlbWVudG8gezB9DQotc2VydmVyRXJyb3JfbXNnPUlVUFAwMDAxRTogRWwgc2Vydmlkb3Igbm8gaGEgZGV2dWVsdG8gbmluZ1x1MDBmYW4gZGF0by4NCi1pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnPUlVUFAwMDAyRTogUmVzcHVlc3RhIG5vIHZcdTAwZTFsaWRhIGRlIGh0dHA6Ly97MH06ezF9OnsyfQ0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZz1JVVBQMDAwM1c6IEVsIGVsZW1lbnRvIG5vIHNlIGhhIHB1YmxpY2FkbyBwb3JxdWUgbm8gZXMgdW4gZWxlbWVudG8gdlx1MDBlMWxpZG8gZGUgbGEgY29uZmlndXJhY2lcdTAwZjNuLg0KLWludmFsaWRNZXRob2RFbGVtZW50V2FybmluZ19tc2c9SVVQUDAwMDRXOiBFbCBlbGVtZW50byBubyBzZSBoYSBwdWJsaWNhZG8gcG9ycXVlIG5vIGVzIHVuIGVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvOiB7MH0NCi1jb3B5RmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA1VzogTm8gc2UgaGEgcG9kaWRvIGNvcGlhciBlbCBhcmNoaXZvIGRlICcnezB9JycgZW4gJyd7MX0nJy4NCi1taXNzaW5nSWNvbkZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNlc6IEVsIGFyY2hpdm8gZGUgaWNvbm9zIGRlIG5vZG8gJyd7MH0nJyBubyBleGlzdGUuDQotbWlzc2luZ0ljb25OYW1lV2FybmluZ19tc2c9SVVQUDAwMDdXOiBObyBzZSBoYSBwb2RpZG8gcmVjdXBlcmFyIGVsIG5vbWJyZSBkZWwgaWNvbm8gZGUgbm9kby4NCi1leHRlcm5hbFVybF9tc2c9VVJMIGV4dGVybmEgZGUgcmVmZXJlbmNpYTogezB9DQotZGlzY2FyZWRDYXRlZ29yeVdhcm5pbmdfbXNnPUVsZW1lbnRvIGRlIGNhdGVnb3JcdTAwZWRhIGRlIGNvbnRlbmlkbyB2YWNcdTAwZWRvIG5vIHB1YmxpY2Fkby4NCi0NCi0jIEVycm9yIERldGFpbHMNCi1jcmVhdGVTZWFyY2hJbmRleEVycm9yX21zZz1JVVBQMDAwOEU6IE5vIHNlIGhhIGNyZWFkbyBlbCBhcmNoaXZvIGRlIFx1MDBlZG5kaWNlcyBkZSBiXHUwMGZhc3F1ZWRhLg0KLQ0KLSMgUHJvY2VzcyBUcmVlIE5vZGVzDQotcmVmZXJlbmNlV29ya2Zsb3dzTm9kZV90ZXh0PUZsdWpvcyBkZSB0cmFiYWpvIGRlIHJlZmVyZW5jaWENCi10YXNrTm9kZV90ZXh0PVRhcmVhcw0KLXByaW1hcmlseVBlcmZvcm1zTm9kZV90ZXh0PVByaW5jaXBhbG1lbnRlIHJlYWxpemENCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc05vZGVfdGV4dD1BZGljaW9uYWxtZW50ZSByZWFsaXphDQotcGVyZm9ybWluZ1JvbGVzTm9kZV90ZXh0PVJvbGVzIGRlIHJlYWxpemFjaVx1MDBmM24NCi1pbnB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dD1Qcm9kdWN0b3MgZGUgdHJhYmFqbyBkZSBlbnRyYWRhDQotb3V0cHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PVByb2R1Y3RvcyBkZSB0cmFiYWpvIGRlIHNhbGlkYQ0KLXJlc3BvbnNpYmxlRm9yTm9kZV90ZXh0PVJlc3BvbnNhYmxlIGRlDQotbW9kaWZpZXNOb2RlX3RleHQ9TW9kaWZpY2ENCi1yZXNwb25zaWJsZVJvbGVOb2RlX3RleHQ9Um9sIHJlc3BvbnNhYmxlDQotY29udGFpbmluZ1dvcmtQcm9kdWN0Tm9kZV90ZXh0PVByb2R1Y3RvIGRlIHRyYWJham8gY29udGVuZWRvcg0KLWNvbnRhaW5lZFdvcmtQcm9kdWN0c05vZGVfdGV4dD1Qcm9kdWN0b3MgZGUgdHJhYmFqbyBjb250ZW5pZG9zDQotZ3VpZGFuY2VOb2RlX3RleHQ9R3VcdTAwZWRhDQotaW5wdXRUb05vZGVfdGV4dD1FbnRyYWRhIGENCi1vdXRwdXRGcm9tTm9kZV90ZXh0PVNhbGlkYSBkZQ0KLQ0KLSMgSFRNTCBUaXRsZSBmb3IgSW5kZXggUGFnZQ0KLWluZGV4TGFiZWxfdGV4dD1cdTAwY2RuZGljZQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxYTBlOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBQMDAwMEUgLSBJVVBQMDA5OUUNCi0jDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLXB1Ymxpc2hpbmdDb25maWd1cmF0aW9uVGFza19uYW1lPVB1YmxpY2F0aW9uIGRlIGxhIGNvbmZpZ3VyYXRpb24uLi4NCi1pbml0aWFsaXppbmdEaXJUYXNrX25hbWU9SW5pdGlhbGlzYXRpb24gZHUgclx1MDBlOXBlcnRvaXJlIGRlIGRlc3RpbmF0aW9uLi4uDQotY29weWluZ0ZpbGVzVGFza19uYW1lPUNvcGllIGRlcyBmaWNoaWVycyBlbiBjb3Vycy4uLg0KLWdlbmVyYXRpbmdCb29rbWFya3NUYXNrX25hbWU9R1x1MDBlOW5cdTAwZTlyYXRpb24gZGVzIHNpZ25ldHMuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtUYXNrX25hbWU9R1x1MDBlOW5cdTAwZTlyYXRpb24gZHUgc2lnbmV0ICcnezB9JycuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtJbmRleFRhc2tfbmFtZT1HXHUwMGU5blx1MDBlOXJhdGlvbiBkZSBsJ2luZGV4IGR1IHNpZ25ldC4uLg0KLXB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lPVB1YmxpY2F0aW9uIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgZGUgbVx1MDBlOXRob2RlIDogezB9IHB1YmxpXHUwMGU5KHMpLCB7MX0gcmVzdGFudChzKQ0KLXB1Ymxpc2hpbmdFbGVtZW50VGFza19uYW1lPVB1YmxpY2F0aW9uIGRlIGwnJ1x1MDBlOWxcdTAwZTltZW50IGRlIG1cdTAwZTl0aG9kZSA6IHswfSA6IHsxfQ0KLWdlbmVyYXRpbmdHbG9zc2FyeVRhc2tfbmFtZT1HXHUwMGU5blx1MDBlOXJhdGlvbiBkdSBnbG9zc2FpcmUuLi4NCi1nZW5lcmF0aW5nU2VhcmNoSW5kZXhUYXNrX25hbWU9R1x1MDBlOW5cdTAwZTlyYXRpb24gZGUgbCdpbmRleCBkZSBsJ2FpZGUuLi4NCi1idWlsZGluZ1Byb2Nlc3NDbG9zdXJlVGFza19uYW1lPUdcdTAwZTluXHUwMGU5cmF0aW9uIGRlIGxhIGZlcm1ldHVyZSBkdSBwcm9jZXNzdXMuLi4NCi1idWlsZGluZ0VsZW1lbnRDbG9zdXJlVGFza19uYW1lPUdcdTAwZTluXHUwMGU5cmF0aW9uIGRlIGxhIGZlcm1ldHVyZSBkZSBsJydcdTAwZTlsXHUwMGU5bWVudCBwb3VyICcnezB9JycuLi4NCi1sb2FkTGlicmFyeVRhc2tfbmFtZT1DaGFyZ2VtZW50IGR1IGNvbnRlbnUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUuLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzIGxvZ2dlZCBpbiB0aGUgUHVibGlzaGluZyBSZXBvcnQNCi1wdWJsaXNoRWxlbWVudEVycm9yX21zZz1JVVBQMDAwMEUgOiBFcnJldXIgZGUgcHVibGljYXRpb24gZGUgbCcnXHUwMGU5bFx1MDBlOW1lbnQgOiB7MH0NCi1zZXJ2ZXJFcnJvcl9tc2c9SVVQUDAwMDFFIDogQXVjdW5lIGRvbm5cdTAwZTllIHJlbnZveVx1MDBlOWUgcGFyIGxlIHNlcnZldXIuDQotaW52YWxpZEh0dHBSZXNwb25zZUVycm9yX21zZz1JVVBQMDAwMkUgOiBSXHUwMGU5cG9uc2Ugbm9uIHZhbGlkZSBkZSBodHRwOi8vezB9OnsxfTp7Mn0NCi0NCi0jIFdhcm5pbmcgTWVzc2FnZXMgbG9nZ2VkIGluIHRoZSBQdWJsaXNoaW5nIFJlcG9ydA0KLWludmFsaWRFbGVtZW50V2FybmluZ19tc2c9SVVQUDAwMDNXIDogTCdcdTAwZTlsXHUwMGU5bWVudCBuJ2EgcGFzIFx1MDBlOXRcdTAwZTkgcHVibGlcdTAwZTkgY2FyIGlsIG4nZXN0IHBhcyB1biBcdTAwZTlsXHUwMGU5bWVudCB2YWxpZGUgZGUgbGEgY29uZmlndXJhdGlvbi4NCi1pbnZhbGlkTWV0aG9kRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDA0VyA6IEwnJ1x1MDBlOWxcdTAwZTltZW50IG4nJ2EgcGFzIFx1MDBlOXRcdTAwZTkgcHVibGlcdTAwZTkgY2FyIGlsIG4nJ2VzdCBwYXMgdW4gXHUwMGU5bFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlIDogezB9DQotY29weUZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNVcgOiBJbXBvc3NpYmxlIGRlIGNvcGllciBsZSBmaWNoaWVyIGRlICcnezB9JycgdmVycyAnJ3sxfScnLg0KLW1pc3NpbmdJY29uRmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA2VyA6IExlIGZpY2hpZXIgZCcnaWNcdTAwZjRuZSBkZSBub2V1ZCAnJ3swfScnIG4nJ2V4aXN0ZSBwYXMuDQotbWlzc2luZ0ljb25OYW1lV2FybmluZ19tc2c9SVVQUDAwMDdXIDogSW1wb3NzaWJsZSBkZSByXHUwMGU5Y3VwXHUwMGU5cmVyIGxlIG5vbSBkZSBsJ2ljXHUwMGY0bmUgZGUgbm9ldWQuDQotZXh0ZXJuYWxVcmxfbXNnPXJcdTAwZTlmXHUwMGU5cmVuY2VtZW50IGRlIGwnJ1VSTCBleHRlcm5lIDogezB9DQotZGlzY2FyZWRDYXRlZ29yeVdhcm5pbmdfbXNnPVZpZGV6IGwnXHUwMGU5bFx1MDBlOW1lbnQgZGUgY2F0XHUwMGU5Z29yaWUgZGUgY29udGVudSBub24gcHVibGlcdTAwZTkuDQotDQotIyBFcnJvciBEZXRhaWxzDQotY3JlYXRlU2VhcmNoSW5kZXhFcnJvcl9tc2c9SVVQUDAwMDhFIDogTCdpbmRleCBkZSBsJ2FpZGUgbidhIHBhcyBcdTAwZTl0XHUwMGU5IGNyXHUwMGU5XHUwMGU5Lg0KLQ0KLSMgUHJvY2VzcyBUcmVlIE5vZGVzDQotcmVmZXJlbmNlV29ya2Zsb3dzTm9kZV90ZXh0PUVuY2hhXHUwMGVlbmVtZW50cyBkJ2FjdGl2aXRcdTAwZTlzIGRlIHJcdTAwZTlmXHUwMGU5cmVuY2UNCi10YXNrTm9kZV90ZXh0PVRcdTAwZTJjaGVzDQotcHJpbWFyaWx5UGVyZm9ybXNOb2RlX3RleHQ9RWZmZWN0dWUgcHJpbmNpcGFsZW1lbnQNCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc05vZGVfdGV4dD1FZmZlY3R1ZSBcdTAwZTlnYWxlbWVudA0KLXBlcmZvcm1pbmdSb2xlc05vZGVfdGV4dD1FeFx1MDBlOWN1dGlvbiBkZXMgclx1MDBmNGxlcw0KLWlucHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PVByb2R1aXRzIGQnZW50clx1MDBlOWUNCi1vdXRwdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9UHJvZHVpdHMgZGUgc29ydGllDQotcmVzcG9uc2libGVGb3JOb2RlX3RleHQ9UmVzcG9uc2FibGUgZGUNCi1tb2RpZmllc05vZGVfdGV4dD1Nb2RpZmllDQotcmVzcG9uc2libGVSb2xlTm9kZV90ZXh0PVJcdTAwZjRsZSByZXNwb25zYWJsZQ0KLWNvbnRhaW5pbmdXb3JrUHJvZHVjdE5vZGVfdGV4dD1Qcm9kdWl0IGNvbnRlbmFudA0KLWNvbnRhaW5lZFdvcmtQcm9kdWN0c05vZGVfdGV4dD1Qcm9kdWl0cyBjb250ZW51cw0KLWd1aWRhbmNlTm9kZV90ZXh0PUNvbnNlaWwNCi1pbnB1dFRvTm9kZV90ZXh0PUVudHJcdTAwZTllIHZlcnMNCi1vdXRwdXRGcm9tTm9kZV90ZXh0PVNvcnRpZSBkZQ0KLQ0KLSMgSFRNTCBUaXRsZSBmb3IgSW5kZXggUGFnZQ0KLWluZGV4TGFiZWxfdGV4dD1JbmRleA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY0ZDIxNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBQMDAwMEUgLSBJVVBQMDA5OUUNCi0jDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLXB1Ymxpc2hpbmdDb25maWd1cmF0aW9uVGFza19uYW1lPVB1YmJsaWNhemlvbmUgZGVsbGEgY29uZmlndXJhemlvbmUgaW4gY29yc28uLi4NCi1pbml0aWFsaXppbmdEaXJUYXNrX25hbWU9SW5pemlhbGl6emF6aW9uZSBkZWxsYSBkaXJlY3RvcnkgZGkgZGVzdGluYXppb25lIGluIGNvcnNvLi4uDQotY29weWluZ0ZpbGVzVGFza19uYW1lPUNvcGlhIGRlaSBmaWxlIGluIGNvcnNvLi4uDQotZ2VuZXJhdGluZ0Jvb2ttYXJrc1Rhc2tfbmFtZT1HZW5lcmF6aW9uZSBkZWkgc2VnbmFsaWJyaSBpbiBjb3Jzby4uLg0KLWdlbmVyYXRpbmdCb29rbWFya1Rhc2tfbmFtZT1HZW5lcmF6aW9uZSBkZWwgc2VnbmFsaWJybyAnJ3swfScnIGluIGNvcnNvLi4uDQotZ2VuZXJhdGluZ0Jvb2ttYXJrSW5kZXhUYXNrX25hbWU9R2VuZXJhemlvbmUgZGVsbCdpbmRpY2UgZGVsIHNlZ25hbGlicm8gaW4gY29yc28uLi4NCi1wdWJsaXNoaW5nTGlua2VkRWxlbWVudFRhc2tfbmFtZT1QdWJibGljYXppb25lIGRlZ2xpIGVsZW1lbnRpIGRpIG1ldG9kbzogezB9IHB1YmJsaWNhdGksIHsxfSByZXN0YW50aQ0KLXB1Ymxpc2hpbmdFbGVtZW50VGFza19uYW1lPVB1YmJsaWNhemlvbmUgZGVsbCcnZWxlbWVudG8gZGkgbWV0b2RvOiB7MH06ezF9DQotZ2VuZXJhdGluZ0dsb3NzYXJ5VGFza19uYW1lPUdlbmVyYXppb25lIGRlbCBnbG9zc2FyaW8gaW4gY29yc28uLi4NCi1nZW5lcmF0aW5nU2VhcmNoSW5kZXhUYXNrX25hbWU9R2VuZXJhemlvbmUgZGVsbCdpbmRpY2UgZGkgcmljZXJjYSBpbiBjb3Jzby4uLg0KLWJ1aWxkaW5nUHJvY2Vzc0Nsb3N1cmVUYXNrX25hbWU9Q3JlYXppb25lIGRlbGxhIGNoaXVzdXJhIGRlbCBwcm9jZXNzbyBpbiBjb3Jzby4uLg0KLWJ1aWxkaW5nRWxlbWVudENsb3N1cmVUYXNrX25hbWU9Q3JlYXppb25lIGRlbGwnJ2VsZW1lbnRvIGRpIGNoaXVzdXJhIHBlciAnJ3swfScnIGluIGNvcnNvLi4uDQotbG9hZExpYnJhcnlUYXNrX25hbWU9Q2FyaWNhbWVudG8gZGVsIGNvbnRlbnV0byBkZWxsYSBsaWJyZXJpYSBpbiBjb3Jzby4uLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMgbG9nZ2VkIGluIHRoZSBQdWJsaXNoaW5nIFJlcG9ydA0KLXB1Ymxpc2hFbGVtZW50RXJyb3JfbXNnPUlVUFAwMDAwRTogRXJyb3JlIGR1cmFudGUgbGEgcHViYmxpY2F6aW9uZSBkZWxsJydlbGVtZW50bzogezB9DQotc2VydmVyRXJyb3JfbXNnPUlVUFAwMDAxRTogTmVzc3VuIGRhdG8gcmVzdGl0dWl0byBkYWwgc2VydmVyLg0KLWludmFsaWRIdHRwUmVzcG9uc2VFcnJvcl9tc2c9SVVQUDAwMDJFOiBSaXNwb3N0YSBub24gdmFsaWRhIGRhIGh0dHA6Ly97MH06ezF9OnsyfQ0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZz1JVVBQMDAwM1c6IEwnZWxlbWVudG8gbm9uIFx1MDBlOCBzdGF0byBwdWJibGljYXRvIGluIHF1YW50byBub24gXHUwMGU4IHVuIGVsZW1lbnRvIHZhbGlkbyBkZWxsYSBjb25maWd1cmF6aW9uZS4NCi1pbnZhbGlkTWV0aG9kRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDA0VzogTCcnZWxlbWVudG8gbm9uIFx1MDBlOCBzdGF0byBwdWJibGljYXRvIGluIHF1YW50byBub24gXHUwMGU4IHVuIGVsZW1lbnRvIGRpIG1ldG9kbzogezB9DQotY29weUZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNVc6IEltcG9zc2liaWxlIGNvcGlhcmUgaWwgZmlsZSBkYSAnJ3swfScnIGluICcnezF9JycuDQotbWlzc2luZ0ljb25GaWxlV2FybmluZ19tc2c9SVVQUDAwMDZXOiBJbCBmaWxlIGljb25hIGRlbCBub2RvICcnezB9Jycgbm9uIGVzaXN0ZS4NCi1taXNzaW5nSWNvbk5hbWVXYXJuaW5nX21zZz1JVVBQMDAwN1c6IEltcG9zc2liaWxlIHJlY3VwZXJhcmUgaWwgbm9tZSBkZWxsJ2ljb25hIGRlbCBub2RvLg0KLWV4dGVybmFsVXJsX21zZz11cmwgZXN0ZXJubyBkaSByaWZlcmltZW50bzogezB9DQotZGlzY2FyZWRDYXRlZ29yeVdhcm5pbmdfbXNnPUVsZW1lbnRvIGNhdGVnb3JpYSBjb250ZW51dG8gdnVvdG8gbm9uIHB1YmJsaWNhdG8uDQotDQotIyBFcnJvciBEZXRhaWxzDQotY3JlYXRlU2VhcmNoSW5kZXhFcnJvcl9tc2c9SVVQUDAwMDhFOiBJbCBmaWxlIGRlbGwnaW5kaWNlIGRpIHJpY2VyY2Egbm9uIFx1MDBlOCBzdGF0byBjcmVhdG8uDQotDQotIyBQcm9jZXNzIFRyZWUgTm9kZXMNCi1yZWZlcmVuY2VXb3JrZmxvd3NOb2RlX3RleHQ9Rmx1c3NpIGRpIGxhdm9ybyBkaSByaWZlcmltZW50bw0KLXRhc2tOb2RlX3RleHQ9T3BlcmF6aW9uaQ0KLXByaW1hcmlseVBlcmZvcm1zTm9kZV90ZXh0PUVzZWd1ZSBwcmluY2lwYWxtZW50ZQ0KLWFkZGl0aW9uYWxseVBlcmZvcm1zTm9kZV90ZXh0PUVzZWd1ZSBhbmNoZQ0KLXBlcmZvcm1pbmdSb2xlc05vZGVfdGV4dD1SdW9saSBlc2VjdXRpdmkNCi1pbnB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dD1Qcm9kb3R0aSBkaSBsYXZvcm8gaW5wdXQNCi1vdXRwdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9UHJvZG90dGkgZGkgbGF2b3JvIG91dHB1dA0KLXJlc3BvbnNpYmxlRm9yTm9kZV90ZXh0PVJlc3BvbnNhYmlsZSBkaQ0KLW1vZGlmaWVzTm9kZV90ZXh0PU1vZGlmaWNhDQotcmVzcG9uc2libGVSb2xlTm9kZV90ZXh0PVJ1b2xvIHJlc3BvbnNhYmlsZQ0KLWNvbnRhaW5pbmdXb3JrUHJvZHVjdE5vZGVfdGV4dD1Qcm9kb3R0byBkaSBsYXZvcm8gZGEgaW5jbHVkZXJlDQotY29udGFpbmVkV29ya1Byb2R1Y3RzTm9kZV90ZXh0PVByb2RvdHRpIGRpIGxhdm9ybyBjb250ZW51dGkNCi1ndWlkYW5jZU5vZGVfdGV4dD1HdWlkYQ0KLWlucHV0VG9Ob2RlX3RleHQ9SW5wdXQgaW4NCi1vdXRwdXRGcm9tTm9kZV90ZXh0PU91dHB1dCBkaQ0KLQ0KLSMgSFRNTCBUaXRsZSBmb3IgSW5kZXggUGFnZQ0KLWluZGV4TGFiZWxfdGV4dD1JbmRpY2UNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NDI1ODkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQUDAwMDBFIC0gSVVQUDAwOTlFDQotIw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZT1cdTY5Y2JcdTYyMTBcdTMwOTJcdTUxNmNcdTk1OGJcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1pbml0aWFsaXppbmdEaXJUYXNrX25hbWU9XHU1YjliXHU1MTQ4XHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDkyXHU1MjFkXHU2NzFmXHU1MzE2XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotY29weWluZ0ZpbGVzVGFza19uYW1lPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1MzBiM1x1MzBkNFx1MzBmY1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWdlbmVyYXRpbmdCb29rbWFya3NUYXNrX25hbWU9XHUzMGQ2XHUzMGMzXHUzMGFmXHUzMGRlXHUzMGZjXHUzMGFmXHUzMDkyXHU3NTFmXHU2MjEwXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotZ2VuZXJhdGluZ0Jvb2ttYXJrVGFza19uYW1lPVx1MzBkNlx1MzBjM1x1MzBhZlx1MzBkZVx1MzBmY1x1MzBhZiAnJ3swfScnIFx1MzA5Mlx1NzUxZlx1NjIxMFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWdlbmVyYXRpbmdCb29rbWFya0luZGV4VGFza19uYW1lPVx1MzBkNlx1MzBjM1x1MzBhZlx1MzBkZVx1MzBmY1x1MzBhZlx1N2QyMlx1NWYxNVx1MzA5Mlx1NzUxZlx1NjIxMFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLXB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1MzA5Mlx1NTE2Y1x1OTU4Ylx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMlx1NTE2Y1x1OTU4Ylx1NmUwOFx1MzA3ZjogezB9XHUzMDAxXHU2YjhiXHUzMDhhOiB7MX0NCi1wdWJsaXNoaW5nRWxlbWVudFRhc2tfbmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTg5ODFcdTdkMjBcdTMwOTJcdTUxNmNcdTk1OGJcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTk6IHswfTp7MX0NCi1nZW5lcmF0aW5nR2xvc3NhcnlUYXNrX25hbWU9XHU3NTI4XHU4YTllXHU5NmM2XHUzMDkyXHU3NTFmXHU2MjEwXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotZ2VuZXJhdGluZ1NlYXJjaEluZGV4VGFza19uYW1lPVx1NjkxY1x1N2QyMlx1N2QyMlx1NWYxNVx1MzA5Mlx1NzUxZlx1NjIxMFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWJ1aWxkaW5nUHJvY2Vzc0Nsb3N1cmVUYXNrX25hbWU9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZlXHU2ODNjXHU3ZDBkXHU2YTVmXHU2OWNiXHUzMDkyXHUzMGQzXHUzMGViXHUzMGM5XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotYnVpbGRpbmdFbGVtZW50Q2xvc3VyZVRhc2tfbmFtZT0nJ3swfScnIFx1MzA2ZVx1ODk4MVx1N2QyMFx1MzA2ZVx1NjgzY1x1N2QwZFx1NmE1Zlx1NjljYlx1MzA5Mlx1MzBkM1x1MzBlYlx1MzBjOVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMgbG9nZ2VkIGluIHRoZSBQdWJsaXNoaW5nIFJlcG9ydA0KLXB1Ymxpc2hFbGVtZW50RXJyb3JfbXNnPUlVUFAwMDAwRTogXHU4OTgxXHU3ZDIwXHUzMDkyXHU1MTZjXHU5NThiXHU0ZTJkXHUzMDZiXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0NCi1zZXJ2ZXJFcnJvcl9tc2c9SVVQUDAwMDFFOiBcdTMwYjVcdTMwZmNcdTMwZDBcdTMwZmNcdTMwNGJcdTMwODlcdTMwYzdcdTMwZmNcdTMwYmZcdTMwNGNcdTYyM2JcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnPUlVUFAwMDAyRTogaHR0cDovL3swfTp7MX06ezJ9IFx1MzA0Ylx1MzA4OVx1MzA2ZVx1NWZkY1x1N2I1NFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OVx1MzAwMg0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZz1JVVBQMDAwM1c6IFx1ODk4MVx1N2QyMFx1MzA0Y1x1NjljYlx1NjIxMFx1NTE4NVx1MzA2N1x1NjcwOVx1NTJiOVx1MzA2YVx1ODk4MVx1N2QyMFx1MzA2N1x1MzA2Zlx1MzA2YVx1MzA0NFx1MzA1Zlx1MzA4MVx1MzAwMVx1NTE2Y1x1OTU4Ylx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLWludmFsaWRNZXRob2RFbGVtZW50V2FybmluZ19tc2c9SVVQUDAwMDRXOiBcdTg5ODFcdTdkMjBcdTMwNmZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTg5ODFcdTdkMjBcdTMwNjdcdTMwNmZcdTMwNmFcdTMwNDRcdTMwNWZcdTMwODFcdTMwMDFcdTUxNmNcdTk1OGJcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWY6IHswfQ0KLWNvcHlGaWxlV2FybmluZ19tc2c9SVVQUDAwMDVXOiBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTInJ3swfScnIFx1MzA0Ylx1MzA4OSAnJ3sxfScnIFx1MzA2Ylx1MzBiM1x1MzBkNFx1MzBmY1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLW1pc3NpbmdJY29uRmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA2VzogXHUzMGNlXHUzMGZjXHUzMGM5XHUzMGZiXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViICcnezB9JycgXHUzMDRjXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotbWlzc2luZ0ljb25OYW1lV2FybmluZ19tc2c9SVVQUDAwMDdXOiBcdTMwY2VcdTMwZmNcdTMwYzlcdTMwZmJcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwNmVcdTU0MGRcdTUyNGRcdTMwOTJcdTUzZDZcdTVmOTdcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1leHRlcm5hbFVybF9tc2c9XHU2YjIxXHUzMDZlXHU1OTE2XHU5MGU4IFVSTCBcdTMwOTJcdTUzYzJcdTcxNjdcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTk6IHswfQ0KLWRpc2NhcmVkQ2F0ZWdvcnlXYXJuaW5nX21zZz1cdTdhN2FcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwZmJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTg5ODFcdTdkMjBcdTMwNGNcdTUxNmNcdTk1OGJcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDINCi0NCi0jIEVycm9yIERldGFpbHMNCi1jcmVhdGVTZWFyY2hJbmRleEVycm9yX21zZz1JVVBQMDAwOEU6IFx1NjkxY1x1N2QyMlx1N2QyMlx1NWYxNVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NGY1Y1x1NjIxMFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLQ0KLSMgUHJvY2VzcyBUcmVlIE5vZGVzDQotcmVmZXJlbmNlV29ya2Zsb3dzTm9kZV90ZXh0PVx1NTNjMlx1NzE2N1x1MzBlZlx1MzBmY1x1MzBhZlx1MzBkNVx1MzBlZFx1MzBmYw0KLXRhc2tOb2RlX3RleHQ9XHUzMGJmXHUzMGI5XHUzMGFmDQotcHJpbWFyaWx5UGVyZm9ybXNOb2RlX3RleHQ9XHU0ZTNiXHUzMDZhXHUzMGJmXHUzMGI5XHUzMGFmDQotYWRkaXRpb25hbGx5UGVyZm9ybXNOb2RlX3RleHQ9XHU4ZmZkXHU1MmEwXHU1YjlmXHU4ODRjDQotcGVyZm9ybWluZ1JvbGVzTm9kZV90ZXh0PVx1NWI5Zlx1ODg0Y1x1MzBlZFx1MzBmY1x1MzBlYg0KLWlucHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PVx1NTE2NVx1NTI5Ylx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLW91dHB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dD1cdTUxZmFcdTUyOWJcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzgNCi1yZXNwb25zaWJsZUZvck5vZGVfdGV4dD1cdTYyYzVcdTVmNTMNCi1tb2RpZmllc05vZGVfdGV4dD1cdTU5MDlcdTY2ZjQNCi1yZXNwb25zaWJsZVJvbGVOb2RlX3RleHQ9XHU2MmM1XHU1ZjUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViDQotY29udGFpbmluZ1dvcmtQcm9kdWN0Tm9kZV90ZXh0PVx1NTNjZVx1NWJiOVx1NTA3NFx1MzA2ZVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLWNvbnRhaW5lZFdvcmtQcm9kdWN0c05vZGVfdGV4dD1cdTUzY2VcdTViYjlcdTViZmVcdThjNjFcdTMwNmVcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzgNCi1ndWlkYW5jZU5vZGVfdGV4dD1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjkNCi1pbnB1dFRvTm9kZV90ZXh0PVx1NTE2NVx1NTI5Ylx1NTE0OA0KLW91dHB1dEZyb21Ob2RlX3RleHQ9XHU1MWZhXHU1MjliXHU1MTQzDQotDQotIyBIVE1MIFRpdGxlIGZvciBJbmRleCBQYWdlDQotaW5kZXhMYWJlbF90ZXh0PVx1N2QyMlx1NWYxNQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkYjNhMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBQMDAwMEUgLSBJVVBQMDA5OUUNCi0jDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLXB1Ymxpc2hpbmdDb25maWd1cmF0aW9uVGFza19uYW1lPVx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWFjZjVcdWFjMWNcdWQ1NThcdWIyOTQgXHVjOTExLi4uDQotaW5pdGlhbGl6aW5nRGlyVGFza19uYW1lPVx1YjMwMFx1YzBjMSBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWNcdWI5N2MgXHVjZDA4XHVhZTMwXHVkNjU0XHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLWNvcHlpbmdGaWxlc1Rhc2tfbmFtZT1cdWQzMGNcdWM3N2NcdWM3NDQgXHViY2Y1XHVjMGFjXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLWdlbmVyYXRpbmdCb29rbWFya3NUYXNrX25hbWU9XHVjYzQ1XHVhYzA4XHVkNTNjXHViOTdjIFx1YzBkZFx1YzEzMVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtUYXNrX25hbWU9Jyd7MH0nJyBcdWNjNDVcdWFjMDhcdWQ1M2NcdWI5N2MgXHVjMGRkXHVjMTMxXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLWdlbmVyYXRpbmdCb29rbWFya0luZGV4VGFza19uYW1lPVx1Y2M0NVx1YWMwOFx1ZDUzYyBcdWMwYzlcdWM3NzhcdWM3NDQgXHVjMGRkXHVjMTMxXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLXB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWM2OTRcdWMxOGNcdWI5N2MgXHVhY2Y1XHVhYzFjXHVkNTU4XHViMjk0IFx1YzkxMTogezB9IFx1YWNmNVx1YWMxYyBcdWM2NDRcdWI4Y2MsIHsxfSBcdWIwYThcdWM3NGMNCi1wdWJsaXNoaW5nRWxlbWVudFRhc2tfbmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjXHViOTdjIFx1YWNmNVx1YWMxY1x1ZDU1OFx1YjI5NCBcdWM5MTE6IHswfTp7MX0NCi1nZW5lcmF0aW5nR2xvc3NhcnlUYXNrX25hbWU9XHVjNmE5XHVjNWI0XHVjOWQxXHVjNzQ0IFx1YzBkZFx1YzEzMVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1nZW5lcmF0aW5nU2VhcmNoSW5kZXhUYXNrX25hbWU9XHVhYzgwXHVjMGM5IFx1YzBjOVx1Yzc3OFx1Yzc0NCBcdWMwZGRcdWMxMzFcdWQ1NThcdWIyOTQgXHVjOTExLi4uDQotYnVpbGRpbmdQcm9jZXNzQ2xvc3VyZVRhc2tfbmFtZT1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHViMmViXHVhZTMwXHViOTdjIFx1YmU0Y1x1YjRkY1x1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1idWlsZGluZ0VsZW1lbnRDbG9zdXJlVGFza19uYW1lPScnezB9JydcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzY5NFx1YzE4YyBcdWIyZWJcdWFlMzBcdWI5N2MgXHViZTRjXHViNGRjXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgXHViODVjXHViNGRjXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMgbG9nZ2VkIGluIHRoZSBQdWJsaXNoaW5nIFJlcG9ydA0KLXB1Ymxpc2hFbGVtZW50RXJyb3JfbXNnPUlVUFAwMDAwRTogXHVjNjk0XHVjMThjXHViOTdjIFx1YWNmNVx1YWMxY1x1ZDU1OFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4IFx1YmMxY1x1YzBkZDogezB9DQotc2VydmVyRXJyb3JfbXNnPUlVUFAwMDAxRTogXHVjMTFjXHViYzg0XHVjNWQwXHVjMTFjIFx1YjlhY1x1ZDEzNFx1YjQxYyBcdWIzNzBcdWM3NzRcdWQxMzBcdWFjMDAgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWludmFsaWRIdHRwUmVzcG9uc2VFcnJvcl9tc2c9SVVQUDAwMDJFOiBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjNzQwIFx1Yzc1MVx1YjJmNShodHRwOi8vezB9OnsxfTp7Mn0pDQotDQotIyBXYXJuaW5nIE1lc3NhZ2VzIGxvZ2dlZCBpbiB0aGUgUHVibGlzaGluZyBSZXBvcnQNCi1pbnZhbGlkRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDAzVzogXHVjNjk0XHVjMThjXHVhYzAwIFx1YWQ2Y1x1YzEzMVx1Yzc1OCBcdWM2MmNcdWJjMTRcdWI5NzggXHVjNjk0XHVjMThjXHVhYzAwIFx1YzU0NFx1YjJjOFx1YWUzMCBcdWI1NGNcdWJiMzhcdWM1ZDAgXHVhY2Y1XHVhYzFjXHViNDE4XHVjOWMwIFx1YzU0YVx1YzU1OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1pbnZhbGlkTWV0aG9kRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDA0VzogXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWM1NDRcdWIyYzhcdWFlMzAgXHViNTRjXHViYjM4XHVjNWQwIHswfSBcdWM2OTRcdWMxOGNcdWFjMDAgXHVhY2Y1XHVhYzFjXHViNDE4XHVjOWMwIFx1YzU0YVx1YzU1OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1jb3B5RmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA1VzogJyd7MH0nJ1x1YzVkMFx1YzExYyAnJ3sxfScnKFx1YzczYylcdWI4NWMgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YmNmNVx1YzBhY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLW1pc3NpbmdJY29uRmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA2VzogXHViMTc4XHViNGRjIFx1YzU0NFx1Yzc3NFx1Y2Y1OCBcdWQzMGNcdWM3N2MgJyd7MH0nJ1x1Yzc3NChcdWFjMDApIFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1taXNzaW5nSWNvbk5hbWVXYXJuaW5nX21zZz1JVVBQMDAwN1c6IFx1YjE3OFx1YjRkYyBcdWM1NDRcdWM3NzRcdWNmNThcdWM3NTggXHVjNzc0XHViOTg0XHVjNzQ0IFx1YWM4MFx1YzBjOVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWV4dGVybmFsVXJsX21zZz1cdWNjMzhcdWM4NzBcdWQ1NThcdWIyOTQgXHVjNjc4XHViZDgwIFVSTDogezB9DQotZGlzY2FyZWRDYXRlZ29yeVdhcm5pbmdfbXNnPVx1YmU0NFx1YzViNCBcdWM3ODhcdWIyOTQgXHVjZWU4XHVkMTUwXHVjZTIwIFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYyBcdWM2OTRcdWMxOGNcdWIyOTQgXHVhY2Y1XHVhYzFjXHViNDE4XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIEVycm9yIERldGFpbHMNCi1jcmVhdGVTZWFyY2hJbmRleEVycm9yX21zZz1JVVBQMDAwOEU6IFx1YWM4MFx1YzBjOSBcdWMwYzlcdWM3NzggXHVkMzBjXHVjNzdjXHVjNzc0IFx1Yzc5MVx1YzEzMVx1YjQxOFx1YzljMCBcdWM1NGFcdWM1NThcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBQcm9jZXNzIFRyZWUgTm9kZXMNCi1yZWZlcmVuY2VXb3JrZmxvd3NOb2RlX3RleHQ9XHVjYzM4XHVjODcwIFx1YzZjY1x1ZDA2Y1x1ZDUwY1x1Yjg1Y1x1YzZiMA0KLXRhc2tOb2RlX3RleHQ9XHVkMGMwXHVjMmE0XHVkMDZjDQotcHJpbWFyaWx5UGVyZm9ybXNOb2RlX3RleHQ9XHVhZTMwXHViY2Y4IFx1YzIxOFx1ZDU4OQ0KLWFkZGl0aW9uYWxseVBlcmZvcm1zTm9kZV90ZXh0PVx1Y2Q5NFx1YWMwMCBcdWMyMThcdWQ1ODkNCi1wZXJmb3JtaW5nUm9sZXNOb2RlX3RleHQ9XHVjMjE4XHVkNTg5IFx1YzVlZFx1ZDU2MA0KLWlucHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PVx1Yzc4NVx1YjgyNSBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjDQotb3V0cHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PVx1Y2Q5Y1x1YjgyNSBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjDQotcmVzcG9uc2libGVGb3JOb2RlX3RleHQ9XHVjYzQ1XHVjNzg0IFx1YzBhY1x1ZDU2ZDoNCi1tb2RpZmllc05vZGVfdGV4dD1cdWMyMThcdWM4MTUNCi1yZXNwb25zaWJsZVJvbGVOb2RlX3RleHQ9XHVjYzQ1XHVjNzg0XHVjNzQ0IFx1YjllMVx1Yzc0MCBcdWM1ZWRcdWQ1NjANCi1jb250YWluaW5nV29ya1Byb2R1Y3ROb2RlX3RleHQ9XHVkM2VjXHVkNTY4XHVkNTU4XHViMjk0IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi1jb250YWluZWRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9XHVkM2VjXHVkNTY4XHViNDE4XHViMjk0IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi1ndWlkYW5jZU5vZGVfdGV4dD1cdWM1NDhcdWIwYjQNCi1pbnB1dFRvTm9kZV90ZXh0PVx1Yzc4NVx1YjgyNSBcdWIzMDBcdWMwYzENCi1vdXRwdXRGcm9tTm9kZV90ZXh0PVx1YzBiMFx1Y2Q5YyBcdWM5YzBcdWM4MTANCi0NCi0jIEhUTUwgVGl0bGUgZm9yIEluZGV4IFBhZ2UNCi1pbmRleExhYmVsX3RleHQ9XHVjMGM5XHVjNzc4DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWVmMDYzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUFAwMDAwRSAtIElVUFAwMDk5RQ0KLSMNCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotcHVibGlzaGluZ0NvbmZpZ3VyYXRpb25UYXNrX25hbWU9UHVibGljYW5kbyBhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28uLi4NCi1pbml0aWFsaXppbmdEaXJUYXNrX25hbWU9SW5pY2lhbGl6YW5kbyBvIGRpcmV0XHUwMGYzcmlvIGRlIGRlc3Rpbm8uLi4NCi1jb3B5aW5nRmlsZXNUYXNrX25hbWU9Q29waWFuZG8gYXJxdWl2b3MuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtzVGFza19uYW1lPUdlcmFuZG8gbWFyY2Fkb3Jlcy4uLg0KLWdlbmVyYXRpbmdCb29rbWFya1Rhc2tfbmFtZT1HZXJhbmRvIG8gbWFyY2Fkb3IgJyd7MH0nJy4uLg0KLWdlbmVyYXRpbmdCb29rbWFya0luZGV4VGFza19uYW1lPUdlcmFuZG8gXHUwMGVkbmRpY2UgZGUgbWFyY2Fkb3Jlcy4uLg0KLXB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lPVB1YmxpY2FuZG8gZWxlbWVudG9zIGRlIG1cdTAwZTl0b2RvOiB7MH0gcHVibGljYWRvcywgezF9IHJlc3RhbnRlcw0KLXB1Ymxpc2hpbmdFbGVtZW50VGFza19uYW1lPVB1YmxpY2FuZG8gbyBlbGVtZW50byBkZSBtXHUwMGU5dG9kbzogezB9OnsxfQ0KLWdlbmVyYXRpbmdHbG9zc2FyeVRhc2tfbmFtZT1HZXJhbmRvIGdsb3NzXHUwMGUxcmlvLi4uDQotZ2VuZXJhdGluZ1NlYXJjaEluZGV4VGFza19uYW1lPUdlcmFuZG8gXHUwMGVkbmRpY2UgZGUgcHJvY3VyYS4uLg0KLWJ1aWxkaW5nUHJvY2Vzc0Nsb3N1cmVUYXNrX25hbWU9Q29uc3RydWluZG8gZmVjaGFtZW50byBkbyBwcm9jZXNzby4uLg0KLWJ1aWxkaW5nRWxlbWVudENsb3N1cmVUYXNrX25hbWU9Q29uc3RydWluZG8gZmVjaGFtZW50byBkZSBlbGVtZW50byBwYXJhICcnezB9JycuLi4NCi1sb2FkTGlicmFyeVRhc2tfbmFtZT1DYXJyZWdhbmRvIGNvbnRlXHUwMGZhZG8gZGEgYmlibGlvdGVjYS4uLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMgbG9nZ2VkIGluIHRoZSBQdWJsaXNoaW5nIFJlcG9ydA0KLXB1Ymxpc2hFbGVtZW50RXJyb3JfbXNnPUlVUFAwMDAwRTogRXJybyBhbyBwdWJsaWNhciBvIGVsZW1lbnRvOiB7MH0NCi1zZXJ2ZXJFcnJvcl9tc2c9SVVQUDAwMDFFOiBOZW5odW0gZGFkbyByZXRvcm5hZG8gZG8gc2Vydmlkb3IuDQotaW52YWxpZEh0dHBSZXNwb25zZUVycm9yX21zZz1JVVBQMDAwMkU6IFJlc3Bvc3RhIGludlx1MDBlMWxpZGEgZGUgaHR0cDovL3swfTp7MX06ezJ9DQotDQotIyBXYXJuaW5nIE1lc3NhZ2VzIGxvZ2dlZCBpbiB0aGUgUHVibGlzaGluZyBSZXBvcnQNCi1pbnZhbGlkRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDAzVzogTyBlbGVtZW50byBuXHUwMGUzbyBmb2kgcHVibGljYWRvIHBvcnF1ZSBuXHUwMGUzbyBcdTAwZTkgdW0gZWxlbWVudG8gdlx1MDBlMWxpZG8gbmEgY29uZmlndXJhXHUwMGU3XHUwMGUzby4NCi1pbnZhbGlkTWV0aG9kRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDA0VzogTyBlbGVtZW50byBuXHUwMGUzbyBmb2kgcHVibGljYWRvIHBvcnF1ZSBuXHUwMGUzbyBcdTAwZTkgdW0gZWxlbWVudG8gZGUgbVx1MDBlOXRvZG86IHswfQ0KLWNvcHlGaWxlV2FybmluZ19tc2c9SVVQUDAwMDVXOiBOXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBjb3BpYXIgbyBhcnF1aXZvIGRlICcnezB9JycgcGFyYSAnJ3sxfScnLg0KLW1pc3NpbmdJY29uRmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA2VzogTyBhcnF1aXZvIGRlIFx1MDBlZGNvbmUgZG8gblx1MDBmMyAnJ3swfScnIG5cdTAwZTNvIGV4aXN0ZS4NCi1taXNzaW5nSWNvbk5hbWVXYXJuaW5nX21zZz1JVVBQMDAwN1c6IE5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIHJlY3VwZXJhciBvIG5vbWUgZG8gXHUwMGVkY29uZSBkbyBuXHUwMGYzLg0KLWV4dGVybmFsVXJsX21zZz1yZWZlcmVuY2lhbmRvIFVSTCBleHRlcm5hOiB7MH0NCi1kaXNjYXJlZENhdGVnb3J5V2FybmluZ19tc2c9TyBlbGVtZW50byBkYSBjYXRlZ29yaWEgZGUgY29udGVcdTAwZmFkbyB2YXppbyBuXHUwMGUzbyBmb2kgcHVibGljYWRvLg0KLQ0KLSMgRXJyb3IgRGV0YWlscw0KLWNyZWF0ZVNlYXJjaEluZGV4RXJyb3JfbXNnPUlVUFAwMDA4RTogTyBhcnF1aXZvIGRlIFx1MDBlZG5kaWNlIGRlIHByb2N1cmEgblx1MDBlM28gZm9pIGNyaWFkby4NCi0NCi0jIFByb2Nlc3MgVHJlZSBOb2Rlcw0KLXJlZmVyZW5jZVdvcmtmbG93c05vZGVfdGV4dD1GbHV4b3MgZGUgVHJhYmFsaG8gZGUgUmVmZXJcdTAwZWFuY2lhDQotdGFza05vZGVfdGV4dD1UYXJlZmFzDQotcHJpbWFyaWx5UGVyZm9ybXNOb2RlX3RleHQ9UHJpbWFyaWFtZW50ZSBEZXNlbXBlbmhhDQotYWRkaXRpb25hbGx5UGVyZm9ybXNOb2RlX3RleHQ9QWRpY2lvbmFsbWVudGUgRGVzZW1wZW5oYQ0KLXBlcmZvcm1pbmdSb2xlc05vZGVfdGV4dD1EZXNlbXBlbmhhbmRvIEZ1blx1MDBlN1x1MDBmNWVzDQotaW5wdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9UHJvZHV0b3MgZGUgVHJhYmFsaG8gZGUgRW50cmFkYQ0KLW91dHB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dD1Qcm9kdXRvcyBkZSBUcmFiYWxobyBkZSBTYVx1MDBlZGRhDQotcmVzcG9uc2libGVGb3JOb2RlX3RleHQ9UmVzcG9uc1x1MDBlMXZlbCBwb3INCi1tb2RpZmllc05vZGVfdGV4dD1Nb2RpZmljYQ0KLXJlc3BvbnNpYmxlUm9sZU5vZGVfdGV4dD1GdW5cdTAwZTdcdTAwZTNvIFJlc3BvbnNcdTAwZTF2ZWwNCi1jb250YWluaW5nV29ya1Byb2R1Y3ROb2RlX3RleHQ9Q29udGVuZG8gUHJvZHV0byBkZSBUcmFiYWxobw0KLWNvbnRhaW5lZFdvcmtQcm9kdWN0c05vZGVfdGV4dD1Db250aW5oYSBQcm9kdXRvcyBkZSBUcmFiYWxobw0KLWd1aWRhbmNlTm9kZV90ZXh0PU9yaWVudGFcdTAwZTdcdTAwZTNvDQotaW5wdXRUb05vZGVfdGV4dD1FbnRyYWRhIHBhcmENCi1vdXRwdXRGcm9tTm9kZV90ZXh0PVNhXHUwMGVkZGEgZGUNCi0NCi0jIEhUTUwgVGl0bGUgZm9yIEluZGV4IFBhZ2UNCi1pbmRleExhYmVsX3RleHQ9XHUwMGNkbmRpY2UNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MGE4MWIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQUDAwMDBFIC0gSVVQUDAwOTlFDQotIw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTUzZDFcdTVlMDNcdTkxNGRcdTdmNmUuLi4NCi1pbml0aWFsaXppbmdEaXJUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU1MjFkXHU1OWNiXHU1MzE2XHU3NmVlXHU2ODA3XHU3NmVlXHU1ZjU1Li4uDQotY29weWluZ0ZpbGVzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTkwZFx1NTIzNlx1NjU4N1x1NGVmNi4uLg0KLWdlbmVyYXRpbmdCb29rbWFya3NUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU3NTFmXHU2MjEwXHU0ZTY2XHU3YjdlLi4uDQotZ2VuZXJhdGluZ0Jvb2ttYXJrVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzUxZlx1NjIxMFx1NGU2Nlx1N2I3ZVx1MjAxY3swfVx1MjAxZC4uLg0KLWdlbmVyYXRpbmdCb29rbWFya0luZGV4VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzUxZlx1NjIxMFx1NGU2Nlx1N2I3ZVx1N2QyMlx1NWYxNS4uLg0KLXB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lPVx1NTNkMVx1NWUwM1x1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1ZmYxYVx1NWRmMlx1NTNkMVx1NWUwMyB7MH0gXHU0ZTJhXHVmZjBjXHU1MjY5XHU0ZjU5IHsxfSBcdTRlMmENCi1wdWJsaXNoaW5nRWxlbWVudFRhc2tfbmFtZT1cdTUzZDFcdTVlMDNcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdWZmMWF7MH1cdWZmMWF7MX0NCi1nZW5lcmF0aW5nR2xvc3NhcnlUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU3NTFmXHU2MjEwXHU4YmNkXHU2YzQ3XHU4ODY4Li4uDQotZ2VuZXJhdGluZ1NlYXJjaEluZGV4VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzUxZlx1NjIxMFx1NjQxY1x1N2QyMlx1N2QyMlx1NWYxNS4uLg0KLWJ1aWxkaW5nUHJvY2Vzc0Nsb3N1cmVUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU2Nzg0XHU1ZWZhXHU2ZDQxXHU3YTBiXHU5NWVkXHU1NDA4Li4uDQotYnVpbGRpbmdFbGVtZW50Q2xvc3VyZVRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTRlM2FcdTIwMWN7MH1cdTIwMWRcdTY3ODRcdTVlZmFcdTUxNDNcdTdkMjBcdTk1ZWRcdTU0MDguLi4NCi1sb2FkTGlicmFyeVRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTg4YzVcdTUxNjVcdTVlOTNcdTUxODVcdTViYjkuLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzIGxvZ2dlZCBpbiB0aGUgUHVibGlzaGluZyBSZXBvcnQNCi1wdWJsaXNoRWxlbWVudEVycm9yX21zZz1JVVBQMDAwMEU6IFx1NTNkMVx1NWUwM1x1NTE0M1x1N2QyMFx1NjVmNlx1NTFmYVx1OTUxOVx1ZmYxYXswfQ0KLXNlcnZlckVycm9yX21zZz1JVVBQMDAwMUU6IFx1NjcwZFx1NTJhMVx1NTY2OFx1NjcyYVx1OGZkNFx1NTZkZVx1NGVmYlx1NGY1NVx1NjU3MFx1NjM2ZVx1MzAwMg0KLWludmFsaWRIdHRwUmVzcG9uc2VFcnJvcl9tc2c9SVVQUDAwMDJFOiBcdTY3NjVcdTgxZWEgaHR0cDovL3swfTp7MX06ezJ9IFx1NzY4NFx1NTRjZFx1NWU5NFx1NjVlMFx1NjU0OA0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZz1JVVBQMDAwM1c6IFx1NTE0M1x1N2QyMFx1NjcyYVx1NTNkMVx1NWUwM1x1ZmYwY1x1NTZlMFx1NGUzYVx1NWI4M1x1NGUwZFx1NjYyZlx1OTE0ZFx1N2Y2ZVx1NGUyZFx1NzY4NFx1NjcwOVx1NjU0OFx1NTE0M1x1N2QyMFx1MzAwMg0KLWludmFsaWRNZXRob2RFbGVtZW50V2FybmluZ19tc2c9SVVQUDAwMDRXOiBcdTUxNDNcdTdkMjBcdTY3MmFcdTUzZDFcdTVlMDNcdWZmMGNcdTU2ZTBcdTRlM2FcdTViODNcdTRlMGRcdTY2MmZcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdWZmMWF7MH0NCi1jb3B5RmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA1VzogXHU2NWUwXHU2Y2Q1XHU1YzA2XHU2NTg3XHU0ZWY2XHU0ZWNlXHUyMDFjezB9XHUyMDFkXHU1OTBkXHU1MjM2XHU1MjMwXHUyMDFjezF9XHUyMDFkXHUzMDAyDQotbWlzc2luZ0ljb25GaWxlV2FybmluZ19tc2c9SVVQUDAwMDZXOiBcdTgyODJcdTcwYjlcdTU2ZmVcdTY4MDdcdTY1ODdcdTRlZjZcdTIwMWN7MH1cdTIwMWRcdTRlMGRcdTViNThcdTU3MjhcdTMwMDINCi1taXNzaW5nSWNvbk5hbWVXYXJuaW5nX21zZz1JVVBQMDAwN1c6IFx1NjVlMFx1NmNkNVx1NjhjMFx1N2QyMlx1ODI4Mlx1NzBiOVx1NTZmZVx1NjgwN1x1NzY4NFx1NTQwZFx1NzlmMFx1MzAwMg0KLWV4dGVybmFsVXJsX21zZz1cdTZiNjNcdTU3MjhcdTVmMTVcdTc1MjhcdTU5MTZcdTkwZTggdXJsXHVmZjFhezB9DQotZGlzY2FyZWRDYXRlZ29yeVdhcm5pbmdfbXNnPVx1NjcyYVx1NTNkMVx1NWUwM1x1N2E3YVx1NzY4NFx1NTE4NVx1NWJiOVx1N2M3Ylx1NTIyYlx1NTE0M1x1N2QyMFx1MzAwMg0KLQ0KLSMgRXJyb3IgRGV0YWlscw0KLWNyZWF0ZVNlYXJjaEluZGV4RXJyb3JfbXNnPUlVUFAwMDA4RTogXHU2NDFjXHU3ZDIyXHU3ZDIyXHU1ZjE1XHU2NTg3XHU0ZWY2XHU2NzJhXHU1MjFiXHU1ZWZhXHUzMDAyDQotDQotIyBQcm9jZXNzIFRyZWUgTm9kZXMNCi1yZWZlcmVuY2VXb3JrZmxvd3NOb2RlX3RleHQ9XHU1ZjE1XHU3NTI4XHU1ZGU1XHU0ZjVjXHU2ZDQxDQotdGFza05vZGVfdGV4dD1cdTRlZmJcdTUyYTENCi1wcmltYXJpbHlQZXJmb3Jtc05vZGVfdGV4dD1cdTRlM2JcdTg5ODFcdTYyNjdcdTg4NGMNCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc05vZGVfdGV4dD1cdThmZDhcdTYyNjdcdTg4NGMNCi1wZXJmb3JtaW5nUm9sZXNOb2RlX3RleHQ9XHU2MjY3XHU4ODRjXHU4OWQyXHU4MjcyDQotaW5wdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9XHU4ZjkzXHU1MTY1XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotb3V0cHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PVx1OGY5M1x1NTFmYVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLXJlc3BvbnNpYmxlRm9yTm9kZV90ZXh0PVx1OGQxZlx1OGQyMw0KLW1vZGlmaWVzTm9kZV90ZXh0PVx1NGZlZVx1NjUzOQ0KLXJlc3BvbnNpYmxlUm9sZU5vZGVfdGV4dD1cdThkMWZcdThkMjNcdTc2ODRcdTg5ZDJcdTgyNzINCi1jb250YWluaW5nV29ya1Byb2R1Y3ROb2RlX3RleHQ9XHU1MzA1XHU1NDJiXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotY29udGFpbmVkV29ya1Byb2R1Y3RzTm9kZV90ZXh0PVx1ODhhYlx1NTMwNVx1NTQyYlx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLWd1aWRhbmNlTm9kZV90ZXh0PVx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLWlucHV0VG9Ob2RlX3RleHQ9XHU4ZjkzXHU1MTY1XHU4MWYzDQotb3V0cHV0RnJvbU5vZGVfdGV4dD1cdThmOTNcdTUxZmFcdTgxZWENCi0NCi0jIEhUTUwgVGl0bGUgZm9yIEluZGV4IFBhZ2UNCi1pbmRleExhYmVsX3RleHQ9XHU3ZDIyXHU1ZjE1DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTI1NDNjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUFAwMDAwRSAtIElVUFAwMDk5RQ0KLSMNCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotcHVibGlzaGluZ0NvbmZpZ3VyYXRpb25UYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU3NjdjXHU0ZjQ4XHU5MTRkXHU3ZjZlLi4uDQotaW5pdGlhbGl6aW5nRGlyVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1OGQ3N1x1NTljYlx1OGEyZFx1NWI5YVx1NzZlZVx1NmExOVx1NzZlZVx1OTMwNC4uLg0KLWNvcHlpbmdGaWxlc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTg5MDdcdTg4ZmRcdTZhOTRcdTY4NDguLi4NCi1nZW5lcmF0aW5nQm9va21hcmtzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzUyMlx1NzUxZlx1NjZmOFx1N2M2NC4uLg0KLWdlbmVyYXRpbmdCb29rbWFya1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTc1MjJcdTc1MWZcdTY2ZjhcdTdjNjQgJyd7MH0nJy4uLg0KLWdlbmVyYXRpbmdCb29rbWFya0luZGV4VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzUyMlx1NzUxZlx1NjZmOFx1N2M2NFx1N2QyMlx1NWYxNS4uLg0KLXB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzY3Y1x1NGY0OFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1ZmYxYVx1NWRmMlx1NzY3Y1x1NGY0OCB7MH0gXHU1MDBiXHVmZjBjXHU1MjY5XHU5OTE4IHsxfSBcdTUwMGINCi1wdWJsaXNoaW5nRWxlbWVudFRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTc2N2NcdTRmNDhcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdWZmMWF7MH06ezF9DQotZ2VuZXJhdGluZ0dsb3NzYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzUyMlx1NzUxZlx1NTQwZFx1OGE1ZVx1ODllM1x1OTFjYi4uLg0KLWdlbmVyYXRpbmdTZWFyY2hJbmRleFRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTc1MjJcdTc1MWZcdTY0MWNcdTVjMGJcdTdkMjJcdTVmMTUuLi4NCi1idWlsZGluZ1Byb2Nlc3NDbG9zdXJlVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NWVmYVx1N2Y2ZVx1N2EwYlx1NWU4Zlx1OTA4YVx1NzU0Yy4uLg0KLWJ1aWxkaW5nRWxlbWVudENsb3N1cmVUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU1ZWZhXHU3ZjZlICcnezB9JycgXHU3Njg0XHU1MTQzXHU3ZDIwXHU5MDhhXHU3NTRjLi4uDQotbG9hZExpYnJhcnlUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU4ZjA5XHU1MTY1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1MTY3XHU1YmI5Li4uDQotDQotIyBFcnJvciBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotcHVibGlzaEVsZW1lbnRFcnJvcl9tc2c9SVVQUDAwMDBFOiBcdTc2N2NcdTRmNDhcdTUxNDNcdTdkMjBcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdWZmMWF7MH0NCi1zZXJ2ZXJFcnJvcl9tc2c9SVVQUDAwMDFFOiBcdTRmM2FcdTY3MGRcdTU2NjhcdTY3MmFcdTUwYjNcdTU2ZGVcdThjYzdcdTY1OTlcdTMwMDINCi1pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnPUlVUFAwMDAyRTogaHR0cDovL3swfTp7MX06ezJ9IFx1NTBiM1x1NTZkZVx1NzEyMVx1NjU0OFx1NTZkZVx1NjFjOQ0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZz1JVVBQMDAwM1c6IFx1NjcyYVx1NzY3Y1x1NGY0OFx1NTE0M1x1N2QyMFx1ZmYwY1x1NTZlMFx1NzBiYVx1NTcyOFx1OTE0ZFx1N2Y2ZVx1NGUyZFx1NGUwZFx1NjYyZlx1NjcwOVx1NjU0OFx1NTE0M1x1N2QyMFx1MzAwMg0KLWludmFsaWRNZXRob2RFbGVtZW50V2FybmluZ19tc2c9SVVQUDAwMDRXOiBcdTY3MmFcdTc2N2NcdTRmNDhcdTUxNDNcdTdkMjBcdWZmMGNcdTU2ZTBcdTcwYmFcdTRlMGRcdTY2MmZcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdWZmMWF7MH0NCi1jb3B5RmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA1VzogXHU3MTIxXHU2Y2Q1XHU1YzA3XHU2YTk0XHU2ODQ4XHU1ZjllICcnezB9JycgXHU4OTA3XHU4OGZkXHU1MjMwICcnezF9JydcdTMwMDINCi1taXNzaW5nSWNvbkZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNlc6IFx1N2JjMFx1OWVkZVx1NTcxNlx1NzkzYVx1NmE5NCAnJ3swfScnIFx1NGUwZFx1NWI1OFx1NTcyOFx1MzAwMg0KLW1pc3NpbmdJY29uTmFtZVdhcm5pbmdfbXNnPUlVUFAwMDA3VzogXHU3MTIxXHU2Y2Q1XHU2NGY3XHU1M2Q2XHU3YmMwXHU5ZWRlXHU1NzE2XHU3OTNhXHU3Njg0XHU1NDBkXHU3YTMxXHUzMDAyDQotZXh0ZXJuYWxVcmxfbXNnPVx1NTNjM1x1NzE2N1x1NTkxNlx1OTBlOCBVUkxcdWZmMWF7MH0NCi1kaXNjYXJlZENhdGVnb3J5V2FybmluZ19tc2c9XHU2NzJhXHU3NjdjXHU0ZjQ4XHU3YTdhXHU3Njg0XHU1MTY3XHU1YmI5XHU3YTJlXHU5ODVlXHU1MTQzXHU3ZDIwXHUzMDAyDQotDQotIyBFcnJvciBEZXRhaWxzDQotY3JlYXRlU2VhcmNoSW5kZXhFcnJvcl9tc2c9SVVQUDAwMDhFOiBcdTY3MmFcdTVlZmFcdTdhY2JcdTY0MWNcdTVjMGJcdTdkMjJcdTVmMTVcdTZhOTRcdTMwMDINCi0NCi0jIFByb2Nlc3MgVHJlZSBOb2Rlcw0KLXJlZmVyZW5jZVdvcmtmbG93c05vZGVfdGV4dD1cdTUzYzNcdTcxNjdcdTVkZTVcdTRmNWNcdTZkNDFcdTdhMGINCi10YXNrTm9kZV90ZXh0PVx1NGY1Y1x1Njk2ZA0KLXByaW1hcmlseVBlcmZvcm1zTm9kZV90ZXh0PVx1NGUzYlx1ODk4MVx1NTdmN1x1ODg0Yw0KLWFkZGl0aW9uYWxseVBlcmZvcm1zTm9kZV90ZXh0PVx1OTg0ZFx1NTkxNlx1NTdmN1x1ODg0Yw0KLXBlcmZvcm1pbmdSb2xlc05vZGVfdGV4dD1cdTU3ZjdcdTg4NGNcdTg5ZDJcdTgyNzINCi1pbnB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dD1cdThmMzhcdTUxNjVcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCi1vdXRwdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9XHU4ZjM4XHU1MWZhXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljDQotcmVzcG9uc2libGVGb3JOb2RlX3RleHQ9XHU4Y2EwXHU4Y2FjDQotbW9kaWZpZXNOb2RlX3RleHQ9XHU0ZmVlXHU2NTM5XHU5ODA1XHU3NmVlDQotcmVzcG9uc2libGVSb2xlTm9kZV90ZXh0PVx1NTNlZlx1NTZkZVx1NjFjOVx1NzY4NFx1ODlkMlx1ODI3Mg0KLWNvbnRhaW5pbmdXb3JrUHJvZHVjdE5vZGVfdGV4dD1cdTUzMDVcdTU0MmJcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCi1jb250YWluZWRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9XHU1MTY3XHU1NDJiXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljDQotZ3VpZGFuY2VOb2RlX3RleHQ9XHU2MzA3XHU1ZjE1DQotaW5wdXRUb05vZGVfdGV4dD1cdThmMzhcdTUxNjVcdTgxZjMNCi1vdXRwdXRGcm9tTm9kZV90ZXh0PVx1OGYzOFx1NTFmYVx1ODFlYQ0KLQ0KLSMgSFRNTCBUaXRsZSBmb3IgSW5kZXggUGFnZQ0KLWluZGV4TGFiZWxfdGV4dD1cdTdkMjJcdTVmMTUNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTgwMmYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEveHNsL3Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLXNlbGVjdGVkQ29uZmlndXJhdGlvblRleHQ9RGllIGF1c2dld1x1MDBlNGhsdGUgS29uZmlndXJhdGlvbiB3aXJkIGFuIGRlciBmb2xnZW5kZW4gUG9zaXRpb24gdmVyXHUwMGY2ZmZlbnRsaWNodC4NCi1kZXRhaWxJbmZvVGV4dD1EZXRhaWxpbmZvcm1hdGlvbmVuIHdlcmRlbiBpbiBkZW4gZm9sZ2VuZGVuIERhdGVpZW4gaW0gT3JkbmVyIGxvZ3MgYXVmZ2V6ZWljaG5ldC4NCi1zaG93RXJyb3JUZXh0PUFsbGUgd1x1MDBlNGhyZW5kIGRlciBWZXJcdTAwZjZmZmVudGxpY2h1bmcgYXVmZ2V0cmV0ZW5lbiBGZWhsZXIgYW56ZWlnZW4NCi1sb2dzV2FybmluZ1RleHQ9RXMgd2VyZGVuIGFsbGUgV2FybnVuZ2VuIHByb3Rva29sbGllcnQsIHouIEIuIFdhcm51bmcgYmV6XHUwMGZjZ2xpY2ggZmVobGVuZGVyIFJlZmVyZW56ZW4sIGRlZmVrdGVyIExpbmtzIHVuZCBuaWNodCB2ZXJcdTAwZjZmZmVudGxpY2h0ZXIgS2F0ZWdvcmllbiBvaG5lIGthdGVnb3Jpc2llcnRlIEVsZW1lbnRlLg0KLXBhZ2VzTm90SW5zdGFsbGVkVGV4dD1JbSBPcmRuZXIgcGFnZXNfbm90X2luc3RhbGxlZCBmaW5kZW4gU2llIGFsbGUgaW4gZGllc2VyIEtvbmZpZ3VyYXRpb24gZmVobGVuZGVuIFJlZmVyZW56ZW4uDQotaW52YWxpZEV4dGVybmFsVGV4dD1FcyB3dXJkZW4gdW5nXHUwMGZjbHRpZ2UgZXh0ZXJuZSBMaW5rcyBpbiBkZXIgS29uZmlndXJhdGlvbiBnZWZ1bmRlbg0KLW93bmVyRWxlbWVudFRleHQ9RWlnbmVyZWxlbWVudA0KLW5vbkV4aXN0aW5nVGV4dD1EYXMgRWlnbmVyZWxlbWVudCB2ZXJ3ZWlzdCBhdWYgbmljaHQgdm9yaGFuZGVuZSBFbGVtZW50ZS4gTVx1MDBmNmdsaWNoZXJ3ZWlzZSB3dXJkZW4gZGllIEVsZW1lbnRlIG5hY2ggZGVtIEVyc3RlbGxlbiBkZXIgRWxlbWVudC1MaW5rcyBhdXMgZGVyIEJpYmxpb3RoZWsgZ2VsXHUwMGY2c2NodC4gU3VjaGVuIFNpZSBkaWUgRWlnbmVyZWxlbWVudGUgdW5kIGtvcnJpZ2llcmVuIFNpZSBkaWUgdW5nXHUwMGZjbHRpZ2VuIFJlZmVyZW56ZW4uDQotbWlzc2luZ1JlZmVyZW5jZXNUaXRsZVRleHQ9RmVobGVuZGUgUmVmZXJlbnplbg0KLW1pc3NpbmdSZWZlcmVuY2VzVGV4dD1EaWUgRWlnbmVyZWxlbWVudGUgdmVyd2Vpc2VuIGF1ZiBmZWhsZW5kZSBFbGVtZW50ZSBpbiBkZXIgYXVzZ2V3XHUwMGU0aGx0ZW4gS29uZmlndXJhdGlvbi4gXHUwMGRjYmVycHJcdTAwZmNmZW4gU2llIGRpZSBhYmdlc2NobG9zc2VuZSBLb25maWd1cmF0aW9uIHVuZCBiZWhlYmVuIFNpZSBkYXMgUHJvYmxlbSBtaXQgZGVuIGZlaGxlbmRlbiBSZWZlcmVuemVuLg0KLQ0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGl0bGVUZXh0PUZlaGxlbmRlIFJlc3NvdXJjZW5kYXRlaWVuDQotbWlzc2luZ1Jlc291cmNlRmlsZXNUZXh0PURpZSBFaWduZXJlbGVtZW50ZSB2ZXJ3ZWlzZW4gZmVobGVuZGUgUmVzc291cmNlbmRhdGVpZW4uIERpZXNlIFJlc3NvdXJjZW5kYXRlaWVuIHdlcmRlbiBpbSBJbmhhbHQgZGVyIEVsZW1lbnRlIG9kZXIgaW4gZGVuIHp1Z2VvcmRuZXRlbiBBbmhcdTAwZTRuZ2VuIHJlZmVyZW56aWVydC4NCi1taXNzaW5nUmVzb3VyY2VUZXh0PUZlaGxlbmRlIFJlc3NvdXJjZQ0KLW93bmVyUmVzb3VyY2VUZXh0PUVpZ25lcnJlc3NvdXJjZQ0KLW1pc3NpbmdFbGVtZW50VGV4dD1GZWhsZW5kZXMgRWxlbWVudA0KLWludmFsaWRFbGVtZW50VGV4dD1VbmdcdTAwZmNsdGlnZXMgRWxlbWVudA0KLWludmFsaWRFbGVtZW50TGlua3NUZXh0PVVuZ1x1MDBmY2x0aWdlIEVsZW1lbnQtTGlua3MNCi1wbGVhc2VDaGVja1RleHQ9XHUwMGRjYmVycHJcdTAwZmNmZW4gU2llIGRpZSBhYmdlc2NobG9zc2VuZSBLb25maWd1cmF0aW9uIHVuZCBiZWhlYmVuIFNpZSBkYXMgUHJvYmxlbSBtaXQgZGVuIGZlaGxlbmRlbiBSZWZlcmVuemVuLg0KLXBsZWFzZUZpbmRUZXh0PVN1Y2hlbiBTaWUgZGllIEVpZ25lcmVsZW1lbnRlIHVuZCBrb3JyaWdpZXJlbiBTaWUgZGllIHVuZ1x1MDBmY2x0aWdlbiBSZWZlcmVuemVuLg0KLWdsb3NzYXJ5VGV4dD1HbG9zc2FyDQotaW5kZXhUZXh0PUluZGV4DQotZmVlZGJhY2tUZXh0PUZlZWRiYWNrDQotYWJvdXRUZXh0PUluZm9ybWF0aW9uZW4NCi1zZWFyY2hUZXh0PVN1Y2hlbg0KLXByaW50VGV4dD1EcnVja2VuDQotc3VtbWFyeVRleHQ9WnVzYW1tZW5mYXNzdW5nDQotcHVibGlzaGluZ1JlcG9ydFRleHQ9QmVyaWNodCB6dXIgVmVyXHUwMGY2ZmZlbnRsaWNodW5nOg0KLXdoZXJlQW1JVGV4dD1Ba3R1ZWxsZSBQb3NpdGlvbg0KLXRyZWVTZXRzVGV4dD1CYXVtc3RydWt0dXJncnVwcGVuDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEveHNsL3Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEveHNsL3Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzdhYzI2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4NCi0NCi1zZWxlY3RlZENvbmZpZ3VyYXRpb25UZXh0PUxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBzZWxlY2Npb25hZGEgc2UgcHVibGljYSBlbiBsYSBzaWd1aWVudGUgdWJpY2FjaVx1MDBmM24NCi1kZXRhaWxJbmZvVGV4dD1MYSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBzZSByZWdpc3RyYSBlbiBsb3Mgc2lndWllbnRlcyBhcmNoaXZvcyBkZSBsYSBjYXJwZXRhIGRlIHJlZ2lzdHJvcw0KLXNob3dFcnJvclRleHQ9bXVlc3RyYSBjdWFscXVpZXIgZXJyb3IgcXVlIHNlIHByb2R1emNhIGR1cmFudGUgbGEgcHVibGljYWNpXHUwMGYzbi4NCi1sb2dzV2FybmluZ1RleHQ9cmVnaXN0cmEgdG9kb3MgbG9zIG1lbnNhamVzIGRlIGF2aXNvIGNvbW8sIHBvciBlamVtcGxvLCByZWZlcmVuY2lhcyBxdWUgZmFsdGFuLCBlbmxhY2VzIHJvdG9zIHkgY2F0ZWdvclx1MDBlZGFzIG5vIHB1YmxpY2FkYXMgc2luIGVsZW1lbnRvcyBjYXRlZ29yaXphZG9zLg0KLXBhZ2VzTm90SW5zdGFsbGVkVGV4dD1FbiBsYSBjYXJwZXRhIHBcdTAwZTFnaW5hc19ub19pbnN0YWxhZGFzLCBlbmNvbnRyYXJcdTAwZTEgdG9kYXMgbGFzIHJlZmVyZW5jaWFzIGF1c2VudGVzIGRlIGVzdGEgY29uZmlndXJhY2lcdTAwZjNuLg0KLWludmFsaWRFeHRlcm5hbFRleHQ9U2UgaGFuIGlkZW50aWZpY2FkbyBlbmxhY2VzIGV4dGVybm9zIG5vIHZcdTAwZTFsaWRvcyBlbiBsYSBjb25maWd1cmFjaVx1MDBmM24NCi1vd25lckVsZW1lbnRUZXh0PUVsZW1lbnRvIGRlIHByb3BpZXRhcmlvDQotbm9uRXhpc3RpbmdUZXh0PUxvcyBlbGVtZW50b3MgZGUgcHJvcGlldGFyaW8gaGFjZW4gcmVmZXJlbmNpYSBhIGVsZW1lbnRvcyBxdWUgbm8gZXhpc3Rlbi4gRXMgcG9zaWJsZSBxdWUgbG9zIGVsZW1lbnRvcyBzZSBoYXlhbiBlbGltaW5hZG8gZGUgbGEgYmlibGlvdGVjYSBkZXNwdVx1MDBlOXMgZGUgY3JlYXIgbG9zIGVubGFjZXMgZGVsIGVsZW1lbnRvLiBCdXNxdWUgb3Ryb3MgZWxlbWVudG9zIGRlIHByb3BpZXRhcmlvIHkgYXJyZWdsZSBlc3RhcyByZWZlcmVuY2lhcyBubyB2XHUwMGUxbGlkYXMuDQotbWlzc2luZ1JlZmVyZW5jZXNUaXRsZVRleHQ9UmVmZXJlbmNpYXMgYXVzZW50ZXMNCi1taXNzaW5nUmVmZXJlbmNlc1RleHQ9TG9zIGVsZW1lbnRvcyBkZSBwcm9waWV0YXJpbyBoYWNlbiByZWZlcmVuY2lhIGEgZWxlbWVudG9zIGF1c2VudGVzIGVuIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBzZWxlY2Npb25hZGEuIENvbXBydWViZSBlbCBjaWVycmUgZGUgbGEgY29uZmlndXJhY2lcdTAwZjNuIHkgYXJyZWdsZSBsYXMgcmVmZXJlbmNpYXMgYXVzZW50ZXMuICAgICAgICAgICAgICAgICAgIA0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGl0bGVUZXh0PUFyY2hpdm9zIGRlIHJlY3Vyc29zIGF1c2VudGVzDQotbWlzc2luZ1Jlc291cmNlRmlsZXNUZXh0PUxvcyBlbGVtZW50b3MgZGUgcHJvcGlldGFyaW8gaGFjZW4gcmVmZXJlbmNpYSBhIGFyY2hpdm9zIGRlIHJlY3Vyc29zIGF1c2VudGVzLiBFbCBjb250ZW5pZG8gZGUgbG9zIGVsZW1lbnRvcyBvIGxvcyBhcmNoaXZvcyBkZSBkYXRvcyBhZGp1bnRvcyBhc29jaWFkb3MgaGFjZW4gcmVmZXJlbmNpYSBhIGVzb3MgYXJjaGl2b3MgZGUgcmVjdXJzb3MuDQotbWlzc2luZ1Jlc291cmNlVGV4dD1SZWN1cnNvIGF1c2VudGUNCi1vd25lclJlc291cmNlVGV4dD1SZWN1cnNvIGRlIHByb3BpZXRhcmlvDQotbWlzc2luZ0VsZW1lbnRUZXh0PUVsZW1lbnRvIGF1c2VudGUNCi1pbnZhbGlkRWxlbWVudFRleHQ9RWxlbWVudG8gbm8gdlx1MDBlMWxpZG8NCi1pbnZhbGlkRWxlbWVudExpbmtzVGV4dD1FbmxhY2UgZGVsIGVsZW1lbnRvIG5vIHZcdTAwZTFsaWRvDQotcGxlYXNlQ2hlY2tUZXh0PUNvbXBydWViZSBlbCBjaWVycmUgZGUgbGEgY29uZmlndXJhY2lcdTAwZjNuIHkgYXJyZWdsZSBsYXMgcmVmZXJlbmNpYXMgYXVzZW50ZXMuDQotcGxlYXNlRmluZFRleHQ9QnVzcXVlIG90cm9zIGVsZW1lbnRvcyBkZSBwcm9waWV0YXJpbyB5IGFycmVnbGUgZXN0YXMgcmVmZXJlbmNpYXMgbm8gdlx1MDBlMWxpZGFzLg0KLWdsb3NzYXJ5VGV4dD1HbG9zYXJpbw0KLWluZGV4VGV4dD1cdTAwY2RuZGljZQ0KLWZlZWRiYWNrVGV4dD1JbmZvcm1hY2lcdTAwZjNuIGRlIHJldG9ybm8NCi1hYm91dFRleHQ9QWNlcmNhIGRlDQotc2VhcmNoVGV4dD1CdXNjYXINCi1wcmludFRleHQ9SW1wcmltaXINCi1zdW1tYXJ5VGV4dD1SZXN1bWVuDQotcHVibGlzaGluZ1JlcG9ydFRleHQ9UHVibGljYXIgaW5mb3JtZToNCi13aGVyZUFtSVRleHQ9RFx1MDBmM25kZSBlc3RveQ0KLXRyZWVTZXRzVGV4dD1Db25qdW50b3MgZGUgXHUwMGUxcmJvbGVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEveHNsL3Jlc291cmNlc19mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEveHNsL3Jlc291cmNlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTQyYjVmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4NCi0NCi1zZWxlY3RlZENvbmZpZ3VyYXRpb25UZXh0PUxhIGNvbmZpZ3VyYXRpb24gc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZSBlc3QgcHVibGlcdTAwZTllIGRhbnMgbCdlbXBsYWNlbWVudCBzdWl2YW50DQotZGV0YWlsSW5mb1RleHQ9TGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBzb250IGNvbnNpZ25cdTAwZTllcyBkYW5zIGxlcyBmaWNoaWVycyBzdWl2YW50cyBkdSBkb3NzaWVyIEpvdXJuYXV4DQotc2hvd0Vycm9yVGV4dD1hZmZpY2hlIHRvdXRlIGVycmV1ciBxdWkgcydlc3QgcHJvZHVpdGUgbG9ycyBkZSBsYSBwdWJsaWNhdGlvbi4NCi1sb2dzV2FybmluZ1RleHQ9ZW5yZWdpc3RyZSB0b3VzIGxlcyBtZXNzYWdlcyBkJ2F2ZXJ0aXNzZW1lbnQgdGVscyBxdWUgbGVzIHJcdTAwZTlmXHUwMGU5cmVuY2VzIG1hbnF1YW50ZXMsIGxlcyBsaWVucyByb21wdXMgZXQgbGVzIGNhdFx1MDBlOWdvcmllcyBub24gcHVibGlcdTAwZTllcyBzYW5zIGF1Y3VuIFx1MDBlOWxcdTAwZTltZW50IGNhdFx1MDBlOWdvcmlzXHUwMGU5Lg0KLXBhZ2VzTm90SW5zdGFsbGVkVGV4dD1EYW5zIGxlIGRvc3NpZXIgcGFnZXNfbm90X2luc3RhbGxlZCwgdm91cyB0cm91dmVyZXogdG91dGVzIGxlcyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBtYW5xdWFudGVzIGRhbnMgY2V0dGUgY29uZmlndXJhdGlvbi4NCi1pbnZhbGlkRXh0ZXJuYWxUZXh0PUxpZW5zIGV4dGVybmVzIG5vbiB2YWxpZGVzIGlkZW50aWZpXHUwMGU5cyBkYW5zIGxhIGNvbmZpZ3VyYXRpb24NCi1vd25lckVsZW1lbnRUZXh0PUVsXHUwMGU5bWVudCBwcm9wcmlcdTAwZTl0YWlyZQ0KLW5vbkV4aXN0aW5nVGV4dD1MZXMgXHUwMGU5bFx1MDBlOW1lbnRzIHByb3ByaVx1MDBlOXRhaXJlcyByZW52b2llbnQgXHUwMGUwIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgZmljdGlmcy4gQ2VzIFx1MDBlOWxcdTAwZTltZW50cyBvbnQgcHUgXHUwMGVhdHJlIHN1cHByaW1cdTAwZTlzIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGFwclx1MDBlOHMgbGEgY3JcdTAwZTlhdGlvbiBkZXMgbGllbnMgZCdcdTAwZTlsXHUwMGU5bWVudC4gUmVjaGVyY2hleiBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIHByb3ByaVx1MDBlOXRhaXJlcyBldCBjb3JyaWdleiBjZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgbm9uIHZhbGlkZXMuDQotbWlzc2luZ1JlZmVyZW5jZXNUaXRsZVRleHQ9Ulx1MDBlOWZcdTAwZTlyZW5jZXMgbWFucXVhbnRlcw0KLW1pc3NpbmdSZWZlcmVuY2VzVGV4dD1MZXMgXHUwMGU5bFx1MDBlOW1lbnRzIHByb3ByaVx1MDBlOXRhaXJlcyByZW52b2llbnQgXHUwMGUwIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgbWFucXVhbnRzIGRhbnMgbGEgY29uZmlndXJhdGlvbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTllLiBWXHUwMGU5cmlmaWV6IGxhIGZlcm1ldHVyZSBkZSBsYSBjb25maWd1cmF0aW9uIGV0IGNvcnJpZ2V6IGxlcyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBtYW5xdWFudGVzLiAgICAgICAgICAgICAgICAgICANCi1taXNzaW5nUmVzb3VyY2VGaWxlc1RpdGxlVGV4dD1GaWNoaWVycyBkZSByZXNzb3VyY2VzIG1hbnF1YW50cw0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGV4dD1MZXMgXHUwMGU5bFx1MDBlOW1lbnRzIHByb3ByaVx1MDBlOXRhaXJlcyByZW52b2llbnQgXHUwMGUwIGRlcyBmaWNoaWVycyBkZSByZXNzb3VyY2VzIG1hbnF1YW50cy4gQ2VzIGZpY2hpZXJzIGRlIHJlc3NvdXJjZXMgc29udCByXHUwMGU5Zlx1MDBlOXJlbmNcdTAwZTlzIGRhbnMgbGUgY29udGVudSBkZXMgXHUwMGU5bFx1MDBlOW1lbnRzIG91IGRhbnMgbGVzIHBpXHUwMGU4Y2VzIGpvaW50ZXMgYXNzb2NpXHUwMGU5ZXMuDQotbWlzc2luZ1Jlc291cmNlVGV4dD1SZXNzb3VyY2UgbWFucXVhbnRlDQotb3duZXJSZXNvdXJjZVRleHQ9UmVzc291cmNlIHByb3ByaVx1MDBlOXRhaXJlDQotbWlzc2luZ0VsZW1lbnRUZXh0PUVsXHUwMGU5bWVudCBtYW5xdWFudA0KLWludmFsaWRFbGVtZW50VGV4dD1FbFx1MDBlOW1lbnQgbm9uIHZhbGlkZQ0KLWludmFsaWRFbGVtZW50TGlua3NUZXh0PUxpZW5zIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgbm9uIHZhbGlkZXMNCi1wbGVhc2VDaGVja1RleHQ9Vlx1MDBlOXJpZmlleiBsYSBmZXJtZXR1cmUgZGUgbGEgY29uZmlndXJhdGlvbiBldCBjb3JyaWdleiBsZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgbWFucXVhbnRlcy4NCi1wbGVhc2VGaW5kVGV4dD1SZWNoZXJjaGV6IGxlcyBcdTAwZTlsXHUwMGU5bWVudHMgcHJvcHJpXHUwMGU5dGFpcmVzIGV0IGNvcnJpZ2V6IGNlcyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBub24gdmFsaWRlcy4NCi1nbG9zc2FyeVRleHQ9R2xvc3NhaXJlDQotaW5kZXhUZXh0PUluZGV4DQotZmVlZGJhY2tUZXh0PVJldG91ciBkJ2luZm9ybWF0aW9ucw0KLWFib3V0VGV4dD1BIHByb3BvcyBkZQ0KLXNlYXJjaFRleHQ9UmVjaGVyY2hlcg0KLXByaW50VGV4dD1JbXByaW1lcg0KLXN1bW1hcnlUZXh0PVJcdTAwZTlzdW1cdTAwZTkNCi1wdWJsaXNoaW5nUmVwb3J0VGV4dD1SYXBwb3J0IGRlIHB1YmxpY2F0aW9uIDoNCi13aGVyZUFtSVRleHQ9SW5mb3JtYXRpb25zIGxpXHUwMGU5ZXMgXHUwMGUwIG1hIHNpdHVhdGlvbg0KLXRyZWVTZXRzVGV4dD1FbnNlbWJsZSBkJ2FyYnJlcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjMDMxOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIFRoZSBVSSB0ZXh0IGluIHRoZSBYU0wgc3R5bGVzaGVldHMuDQotDQotc2VsZWN0ZWRDb25maWd1cmF0aW9uVGV4dD1MYSBjb25maWd1cmF6aW9uZSBzZWxlemlvbmF0YSB2aWVuZSBwdWJibGljYXRhIG5lbGxhIHNlZ3VlbnRlIHViaWNhemlvbmUNCi1kZXRhaWxJbmZvVGV4dD1JbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgdmVuZ29ubyByZWdpc3RyYXRlIG5laSBzZWd1ZW50aSBmaWxlIG5lbGxhIGNhcnRlbGxhIGRlaSBsb2cNCi1zaG93RXJyb3JUZXh0PU1vc3RyYXJlIHR1dHRpIGdsaSBlcnJvcmkgY2hlIHNpIHNvbm8gdmVyaWZpY2F0aSBkdXJhbnRlIGxhIHB1YmJsaWNhemlvbmUuDQotbG9nc1dhcm5pbmdUZXh0PVJlZ2lzdHJhIHR1dHRpIGkgbWVzc2FnZ2kgZGkgYXZ2aXNvIGNvbWUgcmlmZXJpbWVudGkgbWFuY2FudGksIGNvbGxlZ2FtZW50aSBkYW5uZWdnaWF0aSBlIGNhdGVnb3JpZSBub24gcHViYmxpY2F0ZSBzZW56YSBlbGVtZW50aSBjYXRlZ29yaXp6YXRpLg0KLXBhZ2VzTm90SW5zdGFsbGVkVGV4dD1OZWxsYSBjYXJ0ZWxsYSBwYWdlc19ub3RfaW5zdGFsbGVkLCBzaSB0cm92ZXJhbm5vIHR1dHRpIGkgcmlmZXJpbWVudGkgbWFuY2FudGkgZGkgcXVlc3RhIGNvbmZpZ3VyYXppb25lLg0KLWludmFsaWRFeHRlcm5hbFRleHQ9SWRlbnRpZmljYXRpIGNvbGxlZ2FtZW50aSBlc3Rlcm5pIG5vbiB2YWxpZGkgbmVsbGEgY29uZmlndXJhemlvbmUNCi1vd25lckVsZW1lbnRUZXh0PUVsZW1lbnRvIHByb3ByaWV0YXJpbw0KLW5vbkV4aXN0aW5nVGV4dD1HbGkgZWxlbWVudGkgcHJvcHJpZXRhcmlvIGZhbm5vIHJpZmVyaW1lbnRvIGEgZWxlbWVudGkgbm9uIGVzaXN0ZW50aS4gXHUwMGM4IHBvc3NpYmlsZSBjaGUgZ2xpIGVsZW1lbnRpIHNpYW5vIHN0YXRpIGVsaW1pbmF0aSBkYWxsYSBsaWJyZXJpYSBkb3BvIGxhIGNyZWF6aW9uZSBkZWkgY29sbGVnYW1lbnRpIGRlZ2xpIGVsZW1lbnRpLiBUcm92YXJlIGdsaSBlbGVtZW50aSBwcm9wcmlldGFyaW8gZSBjb3JyZWdnZXJlIHF1ZXN0aSByaWZlcmltZW50aSBub24gdmFsaWRpLg0KLW1pc3NpbmdSZWZlcmVuY2VzVGl0bGVUZXh0PVJpZmVyaW1lbnRpIG1hbmNhbnRpDQotbWlzc2luZ1JlZmVyZW5jZXNUZXh0PUdsaSBlbGVtZW50aSBwcm9wcmlldGFyaW8gZmFubm8gcmlmZXJpbWVudG8gYWQgZWxlbWVudGkgbWFuY2FudGkgbmVsbGEgY29uZmlndXJhemlvbmUgc2VsZXppb25hdGEuIENvbnRyb2xsYXJlIGxhIGNoaXVzdXJhIGRlbGxhIGNvbmZpZ3VyYXppb25lIGUgY29ycmVnZ2VyZSBnbGkgZWxlbWVudGkgbWFuY2FudGkuDQotDQotbWlzc2luZ1Jlc291cmNlRmlsZXNUaXRsZVRleHQ9RmlsZSBkaSByaXNvcnNlIG1hbmNhbnRpDQotbWlzc2luZ1Jlc291cmNlRmlsZXNUZXh0PUdsaSBlbGVtZW50aSBwcm9wcmlldGFyaW8gZmFubm8gcmlmZXJpbWVudG8gYSBmaWxlIGRpIHJpc29yc2UgbWFuY2FudGkuIEEgcXVlc3RpIGZpbGUgZGVsbGUgcmlzb3JzZSBzb25vIGFzc29jaWF0aSByaWZlcmltZW50aSBwcmVzZW50aSBuZWwgY29udGVudXRvIGRlZ2xpIGVsZW1lbnRpIG9wcHVyZSBuZWdsaSBhbGxlZ2F0aSBhc3NvY2lhdGkuDQotbWlzc2luZ1Jlc291cmNlVGV4dD1SaXNvcnNhIG1hbmNhbnRlDQotb3duZXJSZXNvdXJjZVRleHQ9Umlzb3JzYSBwcm9wcmlldGFyaW8NCi1taXNzaW5nRWxlbWVudFRleHQ9RWxlbWVudG8gbWFuY2FudGUNCi1pbnZhbGlkRWxlbWVudFRleHQ9RWxlbWVudG8gbm9uIHZhbGlkbw0KLWludmFsaWRFbGVtZW50TGlua3NUZXh0PUNvbGxlZ2FtZW50aSBlbGVtZW50aSBub24gdmFsaWRpDQotcGxlYXNlQ2hlY2tUZXh0PUNvbnRyb2xsYXJlIGxhIGNoaXVzdXJhIGRlbGxhIGNvbmZpZ3VyYXppb25lIGUgY29ycmVnZ2VyZSBnbGkgZWxlbWVudGkgbWFuY2FudGkuDQotcGxlYXNlRmluZFRleHQ9VHJvdmFyZSBnbGkgZWxlbWVudGkgcHJvcHJpZXRhcmlvIGUgY29ycmVnZ2VyZSBxdWVzdGkgcmlmZXJpbWVudGkgbm9uIHZhbGlkaS4NCi1nbG9zc2FyeVRleHQ9R2xvc3NhcmlvDQotaW5kZXhUZXh0PUluZGljZQ0KLWZlZWRiYWNrVGV4dD1GZWVkYmFjaw0KLWFib3V0VGV4dD1JbmZvcm1hemlvbmkgc3UNCi1zZWFyY2hUZXh0PVJpY2VyY2ENCi1wcmludFRleHQ9U3RhbXBhDQotc3VtbWFyeVRleHQ9UmllcGlsb2dvDQotcHVibGlzaGluZ1JlcG9ydFRleHQ9UmVwb3J0IGRpIHB1YmJsaWNhemlvbmU6DQotd2hlcmVBbUlUZXh0PVBvc2l6aW9uZQ0KLXRyZWVTZXRzVGV4dD1JbnNpZW1lIGRpIHN0cnV0dHVyZQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfamEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViODIxNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIFRoZSBVSSB0ZXh0IGluIHRoZSBYU0wgc3R5bGVzaGVldHMuDQotDQotc2VsZWN0ZWRDb25maWd1cmF0aW9uVGV4dD1cdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTY5Y2JcdTYyMTBcdTMwNmZcdTMwMDFcdTZiMjFcdTMwNmVcdTRmNGRcdTdmNmVcdTMwNmJcdTUxNmNcdTk1OGJcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTkNCi1kZXRhaWxJbmZvVGV4dD1cdThhNzNcdTdkMzBcdTYwYzVcdTU4MzFcdTMwNmZcdTMwMDFcdTMwZWRcdTMwYjBcdTMwZmJcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzBcdTMwZmNcdTUxODVcdTMwNmVcdTZiMjFcdTMwNmVcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmJcdThhMThcdTkzMzJcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTkNCi1zaG93RXJyb3JUZXh0PVx1NTE2Y1x1OTU4Ylx1NGUyZFx1MzA2Ylx1NzY3YVx1NzUxZlx1MzA1N1x1MzA1Zlx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA5Mlx1ODg2OFx1NzkzYVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWxvZ3NXYXJuaW5nVGV4dD1cdTMwNTlcdTMwNzlcdTMwNjZcdTMwNmVcdThiNjZcdTU0NGFcdTMwZTFcdTMwYzNcdTMwYmJcdTMwZmNcdTMwYjggKFx1NmIyMFx1ODQzZFx1MzA1N1x1MzA1Zlx1NTNjMlx1NzE2N1x1MzAwMVx1MzBlYVx1MzBmM1x1MzBhZlx1NTIwN1x1MzA4Y1x1MzAwMVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1NTMxNlx1MzA1NVx1MzA4Y1x1MzA1Zlx1ODk4MVx1N2QyMFx1MzA0Y1x1MzA2YVx1MzA0NFx1NjcyYVx1NTE2Y1x1OTU4Ylx1MzA2ZVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1MzA2YVx1MzA2OSkgXHUzMDkyXHUzMDAxXHUzMGVkXHUzMGIwXHUzMDZiXHU4YTE4XHU5MzMyXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcGFnZXNOb3RJbnN0YWxsZWRUZXh0PXBhZ2VzX25vdF9pbnN0YWxsZWQgXHUzMGQ1XHUzMGE5XHUzMGViXHUzMGMwXHUzMGZjXHUzMDZiXHUzMDAxXHUzMDUzXHUzMDZlXHU2OWNiXHU2MjEwXHUzMDZlXHU2YjIwXHU4NDNkXHUzMDU3XHUzMDVmXHU1M2MyXHU3MTY3XHUzMDRjXHUzMDU5XHUzMDc5XHUzMDY2XHU1MTY1XHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotaW52YWxpZEV4dGVybmFsVGV4dD1cdTY5Y2JcdTYyMTBcdTUxODVcdTMwNjdcdTcxMjFcdTUyYjlcdTMwNmFcdTU5MTZcdTkwZThcdTMwZWFcdTMwZjNcdTMwYWZcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1vd25lckVsZW1lbnRUZXh0PVx1NjI0MFx1NjcwOVx1ODAwNVx1ODk4MVx1N2QyMA0KLW5vbkV4aXN0aW5nVGV4dD1cdTYyNDBcdTY3MDlcdTgwMDVcdTg5ODFcdTdkMjBcdTMwNGNcdTMwMDFcdTViNThcdTU3MjhcdTMwNTdcdTMwNmFcdTMwNDRcdTg5ODFcdTdkMjBcdTMwOTJcdTUzYzJcdTcxNjdcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIgXHU4OTgxXHU3ZDIwXHUzMGVhXHUzMGYzXHUzMGFmXHUzMDRjXHU0ZjVjXHU2MjEwXHUzMDU1XHUzMDhjXHUzMDVmXHU1ZjhjXHUzMDY3XHUzMDAxXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDRiXHUzMDg5XHU4OTgxXHU3ZDIwXHUzMDRjXHU1MjRhXHU5NjY0XHUzMDU1XHUzMDhjXHUzMDVmXHU1M2VmXHU4MGZkXHU2MDI3XHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyIFx1NjI0MFx1NjcwOVx1ODAwNVx1ODk4MVx1N2QyMFx1MzA5Mlx1NjkxY1x1N2QyMlx1MzA1N1x1MzA2Nlx1MzA1M1x1MzA4Y1x1MzA4OVx1MzA2ZVx1NzEyMVx1NTJiOVx1MzA2YVx1NTNjMlx1NzE2N1x1MzA5Mlx1NGZlZVx1NmI2M1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLW1pc3NpbmdSZWZlcmVuY2VzVGl0bGVUZXh0PVx1NmIyMFx1ODQzZFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1NTNjMlx1NzE2Nw0KLW1pc3NpbmdSZWZlcmVuY2VzVGV4dD1cdTYyNDBcdTY3MDlcdTgwMDVcdTg5ODFcdTdkMjBcdTMwNGNcdTMwMDFcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTY5Y2JcdTYyMTBcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwNmFcdTMwNDRcdTg5ODFcdTdkMjBcdTMwOTJcdTUzYzJcdTcxNjdcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIgXHU2OWNiXHU2MjEwXHUzMDZlXHU2ODNjXHU3ZDBkXHU2YTVmXHU2OWNiXHUzMDkyXHU4YWJmXHUzMDc5XHUzMDY2XHUzMDAxXHU2YjIwXHU4NDNkXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHU1M2MyXHU3MTY3XHUzMDkyXHU0ZmVlXHU2YjYzXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotDQotbWlzc2luZ1Jlc291cmNlRmlsZXNUaXRsZVRleHQ9XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHU2YjIwXHU4NDNkDQotbWlzc2luZ1Jlc291cmNlRmlsZXNUZXh0PVx1NjI0MFx1NjcwOVx1ODAwNVx1ODk4MVx1N2QyMFx1MzA0Y1x1MzAwMVx1NmIyMFx1ODQzZFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzBmYlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NTNjMlx1NzE2N1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwNTNcdTMwOGNcdTMwODlcdTMwNmVcdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwZmJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmZcdTMwMDFcdTg5ODFcdTdkMjBcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwODRcdTk1YTJcdTkwMjNcdTMwNTlcdTMwOGJcdTZkZmJcdTRlZDhcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNjdcdTUzYzJcdTcxNjdcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi1taXNzaW5nUmVzb3VyY2VUZXh0PVx1NmIyMFx1ODQzZFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOQ0KLW93bmVyUmVzb3VyY2VUZXh0PVx1NjI0MFx1NjcwOVx1ODAwNVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOQ0KLW1pc3NpbmdFbGVtZW50VGV4dD1cdTZiMjBcdTg0M2RcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTg5ODFcdTdkMjANCi1pbnZhbGlkRWxlbWVudFRleHQ9XHU3MTIxXHU1MmI5XHUzMDZhXHU4OTgxXHU3ZDIwDQotaW52YWxpZEVsZW1lbnRMaW5rc1RleHQ9XHU3MTIxXHU1MmI5XHUzMDZhXHU4OTgxXHU3ZDIwXHUzMGVhXHUzMGYzXHUzMGFmDQotcGxlYXNlQ2hlY2tUZXh0PVx1NjljYlx1NjIxMFx1MzA2ZVx1NjgzY1x1N2QwZFx1NmE1Zlx1NjljYlx1MzA5Mlx1OGFiZlx1MzA3OVx1MzA2Nlx1MzAwMVx1NmIyMFx1ODQzZFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1NTNjMlx1NzE2N1x1MzA5Mlx1NGZlZVx1NmI2M1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXBsZWFzZUZpbmRUZXh0PVx1NjI0MFx1NjcwOVx1ODAwNVx1ODk4MVx1N2QyMFx1MzA5Mlx1NjkxY1x1N2QyMlx1MzA1N1x1MzA2Nlx1MzA1M1x1MzA4Y1x1MzA4OVx1MzA2ZVx1NzEyMVx1NTJiOVx1MzA2YVx1NTNjMlx1NzE2N1x1MzA5Mlx1NGZlZVx1NmI2M1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWdsb3NzYXJ5VGV4dD1cdTc1MjhcdThhOWVcdTk2YzYNCi1pbmRleFRleHQ9XHU3ZDIyXHU1ZjE1DQotZmVlZGJhY2tUZXh0PVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjOVx1MzBkMFx1MzBjM1x1MzBhZg0KLWFib3V0VGV4dD1cdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTYwYzVcdTU4MzENCi1zZWFyY2hUZXh0PVx1NjkxY1x1N2QyMg0KLXByaW50VGV4dD1cdTUzNzBcdTUyMzcNCi1zdW1tYXJ5VGV4dD1cdTg5ODFcdTdkMDQNCi1wdWJsaXNoaW5nUmVwb3J0VGV4dD1cdTUxNmNcdTk1OGJcdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzg6DQotd2hlcmVBbUlUZXh0PVx1NzNmZVx1NTcyOFx1NGY0ZFx1N2Y2ZQ0KLXRyZWVTZXRzVGV4dD1cdTMwYzRcdTMwZWFcdTMwZmNcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzgNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZWJmMzMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEveHNsL3Jlc291cmNlc19rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLXNlbGVjdGVkQ29uZmlndXJhdGlvblRleHQ9XHVjMTIwXHVkMGRkXHVkNTVjIFx1YWQ2Y1x1YzEzMVx1Yzc3NCBcdWIyZTRcdWM3NGMgXHVjNzA0XHVjZTU4XHVjNWQwIFx1YWNmNVx1YWMxY1x1YjQyOVx1YjJjOFx1YjJlNC4NCi1kZXRhaWxJbmZvVGV4dD1cdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHVhYzAwIFx1Yjg1Y1x1YWRmOCBcdWQzZjRcdWIzNTRcdWM3NTggXHViMmU0XHVjNzRjIFx1ZDMwY1x1Yzc3Y1x1YzVkMCBcdWI4NWNcdWFlNDVcdWI0MjlcdWIyYzhcdWIyZTQuDQotc2hvd0Vycm9yVGV4dD1cdWFjZjVcdWFjMWMgXHVjOTExXHVjNWQwIFx1YmMxY1x1YzBkZFx1ZDU1YyBcdWJhYThcdWI0ZTAgXHVjNjI0XHViOTU4XHViOTdjIFx1ZDQ1Y1x1YzJkY1x1ZDU2OVx1YjJjOFx1YjJlNC4NCi1sb2dzV2FybmluZ1RleHQ9XHViMjA0XHViNzdkXHViNDFjIFx1Y2MzOFx1Yzg3MCwgXHViMDRhXHVjNWI0XHVjOWM0IFx1YjljMVx1ZDA2YyBcdWJjMGYgXHViZDg0XHViOTU4XHViNDFjIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWM1YzZcdWIyOTQgXHVhY2Y1XHVhYzFjXHViNDE4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWNcdWM2NDAgXHVhYzE5XHVjNzQwIFx1YmFhOFx1YjRlMCBcdWFjYmRcdWFjZTAgXHViYTU0XHVjMmRjXHVjOWMwXHViOTdjIFx1Yjg1Y1x1YWU0NVx1ZDU2OVx1YjJjOFx1YjJlNC4NCi1wYWdlc05vdEluc3RhbGxlZFRleHQ9cGFnZXNfbm90X2luc3RhbGxlZCBcdWQzZjRcdWIzNTRcdWM1ZDAgXHVjNzc0IFx1YWQ2Y1x1YzEzMVx1Yzc1OCBcdWIyMDRcdWI3N2RcdWI0MWMgXHViYWE4XHViNGUwIFx1Y2MzOFx1Yzg3MFx1YWMwMCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotaW52YWxpZEV4dGVybmFsVGV4dD1cdWFkNmNcdWMxMzFcdWM1ZDBcdWMxMWMgXHVjMmRkXHViY2M0XHViNDFjIFx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWM3NDAgXHVjNjc4XHViZDgwIFx1YjljMVx1ZDA2Yw0KLW93bmVyRWxlbWVudFRleHQ9XHVjMThjXHVjNzIwXHVjNzkwIFx1YzY5NFx1YzE4Yw0KLW5vbkV4aXN0aW5nVGV4dD1cdWMxOGNcdWM3MjBcdWM3OTAgXHVjNjk0XHVjMThjXHVhYzAwIFx1YzVjNlx1YjI5NCBcdWM2OTRcdWMxOGNcdWI5N2MgXHVjYzM4XHVjODcwXHVkNTY5XHViMmM4XHViMmU0LiBcdWM2OTRcdWMxOGMgXHViOWMxXHVkMDZjXHVhYzAwIFx1Yzc5MVx1YzEzMVx1YjQxYyBcdWQ2YzQgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVjNWQwXHVjMTFjIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWMwYWRcdWM4MWNcdWI0MWMgXHVhYzgzIFx1YWMxOVx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjMThjXHVjNzIwXHVjNzkwIFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWNjM2VcdWM1NDRcdWMxMWMgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWNjMzhcdWM4NzBcdWI5N2MgXHVjMjE4XHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLW1pc3NpbmdSZWZlcmVuY2VzVGl0bGVUZXh0PVx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWNjMzhcdWM4NzANCi1taXNzaW5nUmVmZXJlbmNlc1RleHQ9XHVjMThjXHVjNzIwXHVjNzkwIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWMxMjBcdWQwZGRcdWI0MWMgXHVhZDZjXHVjMTMxXHVjNzU4IFx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWM2OTRcdWMxOGNcdWI5N2MgXHVjYzM4XHVjODcwXHVkNTY5XHViMmM4XHViMmU0LiBcdWNjMzhcdWM4NzBcdWM4ODVcdWFjYjBcdWM3NDQgXHVkNjU1XHVjNzc4XHVkNTU4XHVhY2UwIFx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWNjMzhcdWM4NzBcdWI5N2MgXHVjMjE4XHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiANCi1taXNzaW5nUmVzb3VyY2VGaWxlc1RpdGxlVGV4dD1cdWIyMDRcdWI3N2RcdWI0MWMgXHVjNzkwXHVjNmQwIFx1ZDMwY1x1Yzc3Yw0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGV4dD1cdWMxOGNcdWM3MjBcdWM3OTAgXHVjNjk0XHVjMThjXHVhYzAwIFx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWM3OTBcdWM2ZDAgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1Y2MzOFx1Yzg3MFx1ZDU2OVx1YjJjOFx1YjJlNC4gXHVjNjk0XHVjMThjXHVjNzU4IFx1Y2VlOFx1ZDE1MFx1Y2UyMFx1YjA5OCBcdWM1ZjBcdWFkMDBcdWI0MWMgXHVjY2E4XHViZDgwXHVjNWQwXHVjMTFjIFx1ZDU3NFx1YjJmOSBcdWM3OTBcdWM2ZDAgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1Y2MzOFx1Yzg3MFx1ZDU2OVx1YjJjOFx1YjJlNC4NCi1taXNzaW5nUmVzb3VyY2VUZXh0PVx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWM3OTBcdWM2ZDANCi1vd25lclJlc291cmNlVGV4dD1cdWMxOGNcdWM3MjBcdWM3OTAgXHVjNzkwXHVjNmQwDQotbWlzc2luZ0VsZW1lbnRUZXh0PVx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWM2OTRcdWMxOGMNCi1pbnZhbGlkRWxlbWVudFRleHQ9XHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWM2OTRcdWMxOGMNCi1pbnZhbGlkRWxlbWVudExpbmtzVGV4dD1cdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YzY5NFx1YzE4YyBcdWI5YzFcdWQwNmMNCi1wbGVhc2VDaGVja1RleHQ9XHVjYzM4XHVjODcwXHVjODg1XHVhY2IwXHVjNzQ0IFx1ZDY1NVx1Yzc3OFx1ZDU1OFx1YWNlMCBcdWIyMDRcdWI3N2RcdWI0MWMgXHVjYzM4XHVjODcwXHViOTdjIFx1YzIxOFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1wbGVhc2VGaW5kVGV4dD1cdWMxOGNcdWM3MjBcdWM3OTAgXHVjNjk0XHVjMThjXHViOTdjIFx1Y2MzZVx1YzU0NFx1YzExYyBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjNzQwIFx1Y2MzOFx1Yzg3MFx1Yjk3YyBcdWMyMThcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZ2xvc3NhcnlUZXh0PVx1YzZhOVx1YzViNFx1YzlkMQ0KLWluZGV4VGV4dD1cdWMwYzlcdWM3NzgNCi1mZWVkYmFja1RleHQ9XHVkNTNjXHViNGRjXHViYzMxDQotYWJvdXRUZXh0PVx1YzgxY1x1ZDQ4OCBcdWM4MTVcdWJjZjQNCi1zZWFyY2hUZXh0PVx1YWM4MFx1YzBjOQ0KLXByaW50VGV4dD1cdWM3NzhcdWMxYzQNCi1zdW1tYXJ5VGV4dD1cdWM2OTRcdWM1N2QNCi1wdWJsaXNoaW5nUmVwb3J0VGV4dD1cdWFjZjVcdWFjMWMgXHViY2Y0XHVhY2UwXHVjMTFjOg0KLXdoZXJlQW1JVGV4dD1cdWM3MDRcdWNlNTgNCi10cmVlU2V0c1RleHQ9XHVkMmI4XHViOWFjIFx1YzEzOFx1ZDJiOA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3N2M4OC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIFRoZSBVSSB0ZXh0IGluIHRoZSBYU0wgc3R5bGVzaGVldHMuDQotDQotc2VsZWN0ZWRDb25maWd1cmF0aW9uVGV4dD1BIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gc2VsZWNpb25hZGEgZXN0XHUwMGUxIHB1YmxpY2FkYSBubyBzZWd1aW50ZSBsb2NhbA0KLWRldGFpbEluZm9UZXh0PUluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSBkZXRhbGhlcyBzXHUwMGUzbyByZWdpc3RyYWRhcyBub3Mgc2VndWludGVzIGFycXVpdm9zIG5hIHBhc3RhIGxvZ3MNCi1zaG93RXJyb3JUZXh0PW1vc3RyYXIgcXVhbHF1ZXIgZXJybyBvY29ycmlkbyBkdXJhbnRlIGEgcHVibGljYVx1MDBlN1x1MDBlM28uDQotbG9nc1dhcm5pbmdUZXh0PXJlZ2lzdHJhIHRvZGFzIGFzIG1lbnNhZ2VucyBkZSBhdmlzbyB0YWlzIGNvbW8gcmVmZXJcdTAwZWFuY2lhcyBhdXNlbnRlcywgbGlua3MgaW50ZXJyb21waWRvcyBlIGNhdGVnb3JpYXMgblx1MDBlM28tcHVibGljYWRhcyBzZW0gZWxlbWVudG9zIGNhdGVnb3JpemFkb3MuDQotcGFnZXNOb3RJbnN0YWxsZWRUZXh0PU5hIHBhc3RhIHBhZ2VzX25vdF9pbnN0YWxsZWQsIHZvY1x1MDBlYSBlbmNvbnRyYXJcdTAwZTEgdG9kYXMgYXMgcmVmZXJcdTAwZWFuY2lhcyBhdXNlbnRlcyBuZXN0YSBjb25maWd1cmFcdTAwZTdcdTAwZTNvLg0KLWludmFsaWRFeHRlcm5hbFRleHQ9TGlua3MgZXh0ZXJub3MgaW52XHUwMGUxbGlkb3MgaWRlbnRpZmljYWRvcyBuYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvDQotb3duZXJFbGVtZW50VGV4dD1FbGVtZW50byBkZSBQcm9wcmlldFx1MDBlMXJpbw0KLW5vbkV4aXN0aW5nVGV4dD1PcyBlbGVtZW50b3MgZGUgcHJvcHJpZXRcdTAwZTFyaW8gcmVmZXJlbS1zZSBhIGVsZW1lbnRvcyBuXHUwMGUzbyBleGlzdGVudGVzLiBUYWx2ZXogb3MgZWxlbWVudG9zIHRlbmhhbSBzaWRvIGV4Y2x1XHUwMGVkZG9zIGRhIGJpYmxpb3RlY2EgZGVwb2lzIHF1ZSBvcyBsaW5rcyBkb3MgZWxlbWVudG9zIGZvcmFtIGNyaWFkb3MuIExvY2FsaXplIG9zIGVsZW1lbnRvcyBkZSBwcm9wcmlldFx1MDBlMXJpbyBlIGNvcnJpamEgZXNzYXMgcmVmZXJcdTAwZWFuY2lhcyBpbnZcdTAwZTFsaWRhcy4NCi1taXNzaW5nUmVmZXJlbmNlc1RpdGxlVGV4dD1SZWZlclx1MDBlYW5jaWFzIEF1c2VudGVzDQotbWlzc2luZ1JlZmVyZW5jZXNUZXh0PU9zIGVsZW1lbnRvcyBkZSBwcm9wcmlldFx1MDBlMXJpbyByZWZlcmVtLXNlIGEgZWxlbWVudG9zIGF1c2VudGVzIG5hIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gc2VsZWNpb25hZGEuIFZlcmlmaXF1ZSBvIGZlY2hhbWVudG8gZGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBlIGNvcnJpamEgYXMgcmVmZXJcdTAwZWFuY2lhcyBhdXNlbnRlcy4NCi0NCi1taXNzaW5nUmVzb3VyY2VGaWxlc1RpdGxlVGV4dD1BcnF1aXZvcyBkZSBSZWN1cnNvcyBBdXNlbnRlcw0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGV4dD1PcyBlbGVtZW50b3MgZGUgcHJvcHJpZXRcdTAwZTFyaW8gcmVmZXJlbS1zZSBhIGFycXVpdm9zIGRlIHJlY3Vyc29zIGF1c2VudGVzLiBFc3NlcyBhcnF1aXZvcyBkZSByZWN1cnNvcyBzXHUwMGUzbyByZWZlcmVuY2lhZG9zIG5vIGNvbnRlXHUwMGZhZG8gZG9zIGVsZW1lbnRvcyBvdSBub3MgYW5leG9zIGFzc29jaWFkb3MuDQotbWlzc2luZ1Jlc291cmNlVGV4dD1SZWN1cnNvIEF1c2VudGUNCi1vd25lclJlc291cmNlVGV4dD1SZWN1cnNvIGRlIFByb3ByaWV0XHUwMGUxcmlvDQotbWlzc2luZ0VsZW1lbnRUZXh0PUVsZW1lbnRvIEF1c2VudGUNCi1pbnZhbGlkRWxlbWVudFRleHQ9RWxlbWVudG8gSW52XHUwMGUxbGlkbw0KLWludmFsaWRFbGVtZW50TGlua3NUZXh0PUxpbmtzIGRlIEVsZW1lbnRvIEludlx1MDBlMWxpZG9zDQotcGxlYXNlQ2hlY2tUZXh0PVZlcmlmaXF1ZSBvIGZlY2hhbWVudG8gZGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBlIGNvcnJpamEgYXMgcmVmZXJcdTAwZWFuY2lhcyBhdXNlbnRlcy4NCi1wbGVhc2VGaW5kVGV4dD1Mb2NhbGl6ZSBvcyBlbGVtZW50b3MgZGUgcHJvcHJpZXRcdTAwZTFyaW8gZSBjb3JyaWphIGVzc2FzIHJlZmVyXHUwMGVhbmNpYXMgaW52XHUwMGUxbGlkYXMuDQotZ2xvc3NhcnlUZXh0PUdsb3NzXHUwMGUxcmlvDQotaW5kZXhUZXh0PVx1MDBjZG5kaWNlDQotZmVlZGJhY2tUZXh0PUZlZWRiYWNrDQotYWJvdXRUZXh0PVNvYnJlDQotc2VhcmNoVGV4dD1Qcm9jdXJhcg0KLXByaW50VGV4dD1JbXByaW1pcg0KLXN1bW1hcnlUZXh0PVJlc3Vtbw0KLXB1Ymxpc2hpbmdSZXBvcnRUZXh0PVJlbGF0XHUwMGYzcmlvIGRlIFB1YmxpY2FcdTAwZTdcdTAwZTNvOg0KLXdoZXJlQW1JVGV4dD1PbmRlIGV1IGVzdG91DQotdHJlZVNldHNUZXh0PUNvbmp1bnRvcyBkZSBcdTAwYzFydm9yZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYTMyNjkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEveHNsL3Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLXNlbGVjdGVkQ29uZmlndXJhdGlvblRleHQ9XHU5MDA5XHU1YjlhXHU3Njg0XHU5MTRkXHU3ZjZlXHU1ZGYyXHU1M2QxXHU1ZTAzXHU1MjMwXHU0ZWU1XHU0ZTBiXHU0ZjRkXHU3ZjZlDQotZGV0YWlsSW5mb1RleHQ9XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU4YmIwXHU1ZjU1XHU1NzI4XHU2NWU1XHU1ZmQ3XHU2NTg3XHU0ZWY2XHU1OTM5XHU1MTg1XHU3Njg0XHU0ZWU1XHU0ZTBiXHU2NTg3XHU0ZWY2XHU0ZTJkDQotc2hvd0Vycm9yVGV4dD1cdTY2M2VcdTc5M2FcdTUzZDFcdTVlMDNcdTY3MWZcdTk1ZjRcdTUzZDFcdTc1MWZcdTc2ODRcdTYyNDBcdTY3MDlcdTk1MTlcdThiZWZcdTMwMDINCi1sb2dzV2FybmluZ1RleHQ9XHU4YmIwXHU1ZjU1XHU2MjQwXHU2NzA5XHU4YjY2XHU1NDRhXHU2ZDg4XHU2MDZmXHVmZjBjXHU0ZjhiXHU1OTgyXHU3ZjNhXHU1YzExXHU1ZjE1XHU3NTI4XHUzMDAxXHU5NGZlXHU2M2E1XHU0ZTJkXHU2NWFkXHU0ZWU1XHU1M2NhXHU0ZTBkXHU1ZTI2XHU1ZGYyXHU1MjA2XHU3YzdiXHU1MTQzXHU3ZDIwXHU3Njg0XHU2NzJhXHU1M2QxXHU1ZTAzXHU3YzdiXHU1MjJiXHUzMDAyDQotcGFnZXNOb3RJbnN0YWxsZWRUZXh0PVx1NTcyOCBwYWdlc19ub3RfaW5zdGFsbGVkIFx1NjU4N1x1NGVmNlx1NTkzOVx1NGUyZFx1ZmYwY1x1NTNlZlx1NjI3ZVx1NTIzMFx1NmI2NFx1OTE0ZFx1N2Y2ZVx1NGUyZFx1NzY4NFx1NjI0MFx1NjcwOVx1N2YzYVx1NWMxMVx1NWYxNVx1NzUyOFx1MzAwMg0KLWludmFsaWRFeHRlcm5hbFRleHQ9XHU5MTRkXHU3ZjZlXHU0ZTJkXHU2MjdlXHU1MWZhXHU3Njg0XHU2NWUwXHU2NTQ4XHU1OTE2XHU5MGU4XHU5NGZlXHU2M2E1DQotb3duZXJFbGVtZW50VGV4dD1cdTYyZTVcdTY3MDlcdTgwMDVcdTUxNDNcdTdkMjANCi1ub25FeGlzdGluZ1RleHQ9XHU2MmU1XHU2NzA5XHU4MDA1XHU1MTQzXHU3ZDIwXHU1ZjE1XHU3NTI4XHU5NzVlXHU3M2IwXHU2NzA5XHU3Njg0XHU1MTQzXHU3ZDIwXHUzMDAyXHU4ZmQ5XHU0ZTliXHU1MTQzXHU3ZDIwXHU1M2VmXHU4MGZkXHU1NzI4XHU1MjFiXHU1ZWZhXHU1MTQzXHU3ZDIwXHU5NGZlXHU2M2E1XHU1NDBlXHU1ZGYyXHU4OGFiXHU0ZWNlXHU1ZTkzXHU0ZTJkXHU1MjIwXHU5NjY0XHUzMDAyXHU4YmY3XHU2MjdlXHU1MjMwXHU2MmU1XHU2NzA5XHU4MDA1XHU1MTQzXHU3ZDIwXHVmZjBjXHU3MTM2XHU1NDBlXHU0ZmVlXHU1OTBkXHU4ZmQ5XHU0ZTliXHU2NWUwXHU2NTQ4XHU1ZjE1XHU3NTI4XHUzMDAyDQotbWlzc2luZ1JlZmVyZW5jZXNUaXRsZVRleHQ9XHU3ZjNhXHU1YzExXHU1ZjE1XHU3NTI4DQotbWlzc2luZ1JlZmVyZW5jZXNUZXh0PVx1NjJlNVx1NjcwOVx1ODAwNVx1NTE0M1x1N2QyMFx1NWYxNVx1NzUyOFx1OTAwOVx1NWI5YVx1OTE0ZFx1N2Y2ZVx1NGUyZFx1NzY4NFx1N2YzYVx1NWMxMVx1NTE0M1x1N2QyMFx1MzAwMlx1OGJmN1x1NjhjMFx1NjdlNVx1OTE0ZFx1N2Y2ZVx1OTVlZFx1NTQwOFx1ZmYwY1x1NGZlZVx1NmI2M1x1N2YzYVx1NWMxMVx1NzY4NFx1NWYxNVx1NzUyOFx1MzAwMg0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGl0bGVUZXh0PVx1N2YzYVx1NWMxMVx1OGQ0NFx1NmU5MFx1NjU4N1x1NGVmNg0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGV4dD1cdTYyZTVcdTY3MDlcdTgwMDVcdTUxNDNcdTdkMjBcdTVmMTVcdTc1MjhcdTdmM2FcdTVjMTFcdTc2ODRcdThkNDRcdTZlOTBcdTY1ODdcdTRlZjZcdTMwMDJcdTUxNDNcdTdkMjBcdTUxODVcdTViYjlcdTYyMTZcdTUxNzNcdTgwNTRcdTk2NDRcdTRlZjZcdTRlMmRcdTVmMTVcdTc1MjhcdTRlODZcdThmZDlcdTRlOWJcdThkNDRcdTZlOTBcdTY1ODdcdTRlZjZcdTMwMDINCi1taXNzaW5nUmVzb3VyY2VUZXh0PVx1N2YzYVx1NWMxMVx1OGQ0NFx1NmU5MA0KLW93bmVyUmVzb3VyY2VUZXh0PVx1NjJlNVx1NjcwOVx1ODAwNVx1OGQ0NFx1NmU5MA0KLW1pc3NpbmdFbGVtZW50VGV4dD1cdTdmM2FcdTVjMTFcdTUxNDNcdTdkMjANCi1pbnZhbGlkRWxlbWVudFRleHQ9XHU2NWUwXHU2NTQ4XHU1MTQzXHU3ZDIwDQotaW52YWxpZEVsZW1lbnRMaW5rc1RleHQ9XHU2NWUwXHU2NTQ4XHU1MTQzXHU3ZDIwXHU5NGZlXHU2M2E1DQotcGxlYXNlQ2hlY2tUZXh0PVx1OGJmN1x1NjhjMFx1NjdlNVx1OTE0ZFx1N2Y2ZVx1OTVlZFx1NTQwOFx1ZmYwY1x1NGZlZVx1NmI2M1x1N2YzYVx1NWMxMVx1NzY4NFx1NWYxNVx1NzUyOFx1MzAwMg0KLXBsZWFzZUZpbmRUZXh0PVx1OGJmN1x1NjI3ZVx1NTIzMFx1NjJlNVx1NjcwOVx1ODAwNVx1NTE0M1x1N2QyMFx1ZmYwY1x1NzEzNlx1NTQwZVx1NGZlZVx1NTkwZFx1OGZkOVx1NGU5Ylx1NjVlMFx1NjU0OFx1NWYxNVx1NzUyOFx1MzAwMg0KLWdsb3NzYXJ5VGV4dD1cdThiY2RcdTZjNDdcdTg4NjgNCi1pbmRleFRleHQ9XHU3ZDIyXHU1ZjE1DQotZmVlZGJhY2tUZXh0PVx1NTNjZFx1OTk4OA0KLWFib3V0VGV4dD1cdTUxNzNcdTRlOGUNCi1zZWFyY2hUZXh0PVx1NjQxY1x1N2QyMg0KLXByaW50VGV4dD1cdTYyNTNcdTUzNzANCi1zdW1tYXJ5VGV4dD1cdTY0NThcdTg5ODENCi1wdWJsaXNoaW5nUmVwb3J0VGV4dD1cdTUzZDFcdTVlMDNcdTYyYTVcdTU0NGFcdWZmMWENCi13aGVyZUFtSVRleHQ9XHU2MjExXHU3Njg0XHU0ZjRkXHU3ZjZlDQotdHJlZVNldHNUZXh0PVx1NjgxMVx1OTZjNlx1NTQwOA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfemhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYyZjA4MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIFRoZSBVSSB0ZXh0IGluIHRoZSBYU0wgc3R5bGVzaGVldHMuDQotDQotc2VsZWN0ZWRDb25maWd1cmF0aW9uVGV4dD1cdTkwNzhcdTUzZDZcdTc2ODRcdTkxNGRcdTdmNmVcdTVkZjJcdTc2N2NcdTRmNDhcdTgxZjNcdTRlMGJcdTUyMTdcdTRmNGRcdTdmNmUNCi1kZXRhaWxJbmZvVGV4dD1cdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTVkZjJcdThhMThcdThmMDlcdTgxZjNcdTY1ZTVcdThhOGNcdThjYzdcdTY1OTlcdTU5M2VcdTc2ODRcdTRlMGJcdTUyMTdcdTZhOTRcdTY4NDhcdTRlMmQNCi1zaG93RXJyb3JUZXh0PVx1OTg2Zlx1NzkzYVx1NzY3Y1x1NGY0OFx1NjcxZlx1OTU5M1x1NzY3Y1x1NzUxZlx1NzY4NFx1NGVmYlx1NGY1NVx1OTMyZlx1OGFhNFx1MzAwMg0KLWxvZ3NXYXJuaW5nVGV4dD1cdThhMThcdThmMDlcdTYyNDBcdTY3MDlcdThiNjZcdTU0NGFcdThhMGFcdTYwNmZcdWZmMGNcdTRmOGJcdTU5ODJcdTkwN2FcdTZmMGZcdTUzYzNcdTcxNjdcdTMwMDFcdTRlMmRcdTY1YjdcdTc2ODRcdTkzYzhcdTdkNTBcdTUzY2FcdTcxMjFcdTUyMDZcdTk4NWVcdTUxNDNcdTdkMjBcdTc2ODRcdTY3MmFcdTc2N2NcdTRmNDhcdTdhMmVcdTk4NWVcdTMwMDINCi1wYWdlc05vdEluc3RhbGxlZFRleHQ9XHU1NzI4IHBhZ2VzX25vdF9pbnN0YWxsZWQgXHU4Y2M3XHU2NTk5XHU1OTNlXHU0ZTJkXHVmZjBjXHU2MGE4XHU1M2VmXHU0ZWU1XHU2MjdlXHU1MjMwXHU2YjY0XHU5MTRkXHU3ZjZlXHU0ZTJkXHU5MDdhXHU2ZjBmXHU3Njg0XHU2MjQwXHU2NzA5XHU1M2MzXHU3MTY3XHUzMDAyDQotaW52YWxpZEV4dGVybmFsVGV4dD1cdTkxNGRcdTdmNmVcdTRlMmRcdThiNThcdTUyMjVcdTcxMjFcdTY1NDhcdTc2ODRcdTU5MTZcdTkwZThcdTkzYzhcdTdkNTANCi1vd25lckVsZW1lbnRUZXh0PVx1NjRjMVx1NjcwOVx1ODAwNVx1NTE0M1x1N2QyMA0KLW5vbkV4aXN0aW5nVGV4dD1cdTY0YzFcdTY3MDlcdTgwMDVcdTUxNDNcdTdkMjBcdTUzYzNcdTcxNjdcdTUyMzBcdTRlMGRcdTViNThcdTU3MjhcdTc2ODRcdTUxNDNcdTdkMjBcdTMwMDJcdTUzZWZcdTgwZmRcdTU3MjhcdTUxNDNcdTdkMjBcdTkzYzhcdTdkNTBcdTVlZmFcdTdhY2JcdTRlNGJcdTVmOGNcdWZmMGNcdTVkZjJcdTVmOWVcdTdhMGJcdTVmMGZcdTVlYWJcdTRlMmRcdTUyMmFcdTk2NjRcdTUxNDNcdTdkMjBcdTMwMDJcdThhY2JcdTVjMGJcdTYyN2VcdTY0YzFcdTY3MDlcdTgwMDVcdTUxNDNcdTdkMjBcdWZmMGNcdTRlMjZcdTRmZWVcdTZiNjNcdTkwMTlcdTRlOWJcdTcxMjFcdTY1NDhcdTc2ODRcdTUzYzNcdTcxNjdcdTMwMDINCi1taXNzaW5nUmVmZXJlbmNlc1RpdGxlVGV4dD1cdTkwN2FcdTZmMGZcdTUzYzNcdTcxNjcNCi1taXNzaW5nUmVmZXJlbmNlc1RleHQ9XHU2NGMxXHU2NzA5XHU4MDA1XHU1MTQzXHU3ZDIwXHU1M2MzXHU3MTY3XHU1MjMwXHU5MDc4XHU1YjlhXHU5MTRkXHU3ZjZlXHU0ZTJkXHU5MDdhXHU2ZjBmXHU3Njg0XHU1MTQzXHU3ZDIwXHUzMDAyXHU4YWNiXHU2YWEyXHU2N2U1XHU5MTRkXHU3ZjZlXHU5MDhhXHU3NTRjXHVmZjBjXHU0ZTI2XHU0ZmVlXHU2YjYzXHU5MDdhXHU2ZjBmXHU1M2MzXHU3MTY3XHUzMDAyDQotbWlzc2luZ1Jlc291cmNlRmlsZXNUaXRsZVRleHQ9XHU5MDdhXHU2ZjBmXHU4Y2M3XHU2ZTkwXHU2YTk0DQotbWlzc2luZ1Jlc291cmNlRmlsZXNUZXh0PVx1NjRjMVx1NjcwOVx1ODAwNVx1NTE0M1x1N2QyMFx1NTNjM1x1NzE2N1x1NTIzMFx1OTA3YVx1NmYwZlx1NzY4NFx1OGNjN1x1NmU5MFx1NmE5NFx1MzAwMlx1NTE0M1x1N2QyMFx1NzY4NFx1NTE2N1x1NWJiOVx1NjIxNlx1NzZmOFx1OTVkY1x1NzY4NFx1OTY0NFx1NGVmNlx1NGUyZFx1NTNjM1x1NzE2N1x1NTIzMFx1OTAxOVx1NGU5Ylx1OGNjN1x1NmU5MFx1NmE5NFx1MzAwMg0KLW1pc3NpbmdSZXNvdXJjZVRleHQ9XHU5MDdhXHU2ZjBmXHU4Y2M3XHU2ZTkwDQotb3duZXJSZXNvdXJjZVRleHQ9XHU2NGMxXHU2NzA5XHU4MDA1XHU4Y2M3XHU2ZTkwDQotbWlzc2luZ0VsZW1lbnRUZXh0PVx1OTA3YVx1NmYwZlx1NTE0M1x1N2QyMA0KLWludmFsaWRFbGVtZW50VGV4dD1cdTcxMjFcdTY1NDhcdTUxNDNcdTdkMjANCi1pbnZhbGlkRWxlbWVudExpbmtzVGV4dD1cdTcxMjFcdTY1NDhcdTUxNDNcdTdkMjBcdTkzYzhcdTdkNTANCi1wbGVhc2VDaGVja1RleHQ9XHU4YWNiXHU2YWEyXHU2N2U1XHU5MTRkXHU3ZjZlXHU5MDhhXHU3NTRjXHVmZjBjXHU0ZTI2XHU0ZmVlXHU2YjYzXHU5MDdhXHU2ZjBmXHU1M2MzXHU3MTY3XHUzMDAyDQotcGxlYXNlRmluZFRleHQ9XHU4YWNiXHU1YzBiXHU2MjdlXHU2NGMxXHU2NzA5XHU4MDA1XHU1MTQzXHU3ZDIwXHVmZjBjXHU0ZTI2XHU0ZmVlXHU2YjYzXHU5MDE5XHU0ZTliXHU3MTIxXHU2NTQ4XHU3Njg0XHU1M2MzXHU3MTY3XHUzMDAyDQotZ2xvc3NhcnlUZXh0PVx1NTQwZFx1OGE1ZVx1ODllM1x1OTFjYg0KLWluZGV4VGV4dD1cdTdkMjJcdTVmMTUNCi1mZWVkYmFja1RleHQ9XHU2MTBmXHU4OThiDQotYWJvdXRUZXh0PVx1OTVkY1x1NjViYw0KLXNlYXJjaFRleHQ9XHU2NDFjXHU1YzBiDQotcHJpbnRUZXh0PVx1NTIxN1x1NTM3MA0KLXN1bW1hcnlUZXh0PVx1NjQ1OFx1ODk4MQ0KLXB1Ymxpc2hpbmdSZXBvcnRUZXh0PVx1NzY3Y1x1NGY0OFx1NTgzMVx1NTQ0YVx1ZmYxYQ0KLXdoZXJlQW1JVGV4dD1cdTYyMTFcdTc2ODRcdTRmNGRcdTdmNmUNCi10cmVlU2V0c1RleHQ9XHU2YTM5XHU3MmMwXHU3ZDUwXHU2OWNiXHU5NmM2DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmOTMyMWUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZGQ4ZDIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwyLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmc7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBmcmFnbWVudAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3Mjc0MGQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLm5sMi5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMi5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gbmwyLmphcixcDQotICAgICAgICAgICAgICAgeHNsLyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGRvY3Jvb3QvLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9kb2Nyb290L2Fib3V0X3J1Lmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL2RvY3Jvb3QvYWJvdXRfcnUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWZmNWRlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL2RvY3Jvb3QvYWJvdXRfcnUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLQ0KLTxodG1sPg0KLTwhLS0gDQotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gICAgQ29udHJpYnV0b3JzOg0KLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLS0+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiLz4NCi0JPHRpdGxlPtCeINC/0YDQvtC00YPQutGC0LU8L3RpdGxlPg0KLTxzY3JpcHQgc3JjPSJzY3JpcHRzL2NvbW1vbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+DQotCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQotCQlib2R5IHsNCi0JCQltYXJnaW46IDhweDsNCi0JCX0NCi0JPC9zdHlsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotCTxpbWcgc3JjPSIuL2ltYWdlcy9pY29uX2Fib3V0LmdpZiIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbHQ9ItC+INC/0YDQvtC00YPQutGC0LUiIGJvcmRlcj0iMCIvPjxiciAvPjxiciAvPg0KLTxzcGFuIGNsYXNzPSJwb3AiPk9wZW5VUC9CYXNpYzxiciAvPg0KLdCS0LXRgNGB0LjRjyAxLjA8YnIgLz4NCi08YnIgLz4NCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi48YnIgLz4NCi3QktGB0LUg0L/RgNCw0LLQsCDQt9Cw0YnQuNGJ0LXQvdGLLjwvc3Bhbj48YnIgLz48YnIgLz4NCi0JPHRhYmxlIHN1bW1hcnk9IiIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPg0KLQkgIDx0cj4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjQiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSIyIiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxhIGNsYXNzPSJidXR0b24iIGhyZWY9ImphdmFzY3JpcHQ6c2VsZi5jbG9zZSgpOyI+PHNwYW4gY2xhc3M9ImJ1dHRvbnR4dCI+Jm5ic3A70JfQsNC60YDRi9GC0YwmbmJzcDs8L3NwYW4+PC9hPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93IiAgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCTwvdGFibGU+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfcnUuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfcnUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZGFmZWIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX3J1LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIGphdmFzY3JpcHQgZm9yIHRoZSBib29rbWFya3MgZnJhbWUgKCB0aGUgb3J5X3RvY19mcmFtZSBmcmFtZSkNCi0vLyB0aGlzIGZyYW1lIGNvbnRhaW5zIGEgY2hpbGQgaWZyYW1lIChvcnlfdG9jKQ0KLQ0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQNCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEgPSAi0K3RgtCwINGB0YLRgNCw0L3QuNGG0LAg0L3QtSDQvdCw0LnQtNC10L3QsCDQsiDQtNC10YDQtdCy0LUg0L3QsNCy0LjQs9Cw0YbQuNC4LiI7DQotDQotZnVuY3Rpb24gZGlzcGxheVRyZWUodGFiKQ0KLXsNCi0JdXJsID0gdGFiLmdldEF0dHJpYnV0ZSgndXJsJyk7DQotDQotCWlmICggc2VsZWN0ZWRUYWIgIT0gbnVsbCApDQotCXsNCi0JCXNlbGVjdGVkVGFiLmNsYXNzTmFtZSA9ICJ0YWIiDQotCX0NCi0JdGFiLmNsYXNzTmFtZSA9ICJzZWxlY3RlZFRhYiINCi0Jc2VsZWN0ZWRUYWIgPSB0YWI7DQotDQotCWxvYWRJZnJhbWUoIm9yeV90b2MiLCB1cmwpOw0KLX0NCi0NCi1mdW5jdGlvbiBsb2FkSWZyYW1lKGlmcmFtZU5hbWUsIHVybCkNCi17DQotCWlmICggd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXSApDQotCXsNCi0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0udG9jX2xvYWRlZCA9IGZhbHNlOw0KLQkJd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXS5sb2NhdGlvbiA9IHVybDsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCWVsc2UgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi1mdW5jdGlvbiBzaG93UGFnZSgpDQotew0KLQ0KLQlwYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0ubG9jYXRpb24uaHJlZiA9IHVuZXNjYXBlKHRvcGljVG9EaXNwbGF5KTsNCi19DQotDQotDQotLyoqDQotICogZmluZCBhIHRvcGljIGluIHRoZSB0cmVlOiB0aGUgdG9waWMgaXMgc2V0IGluIHRvcGljVG9EaXNwbGF5DQotICogcmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3MNCi0gKi8NCi1mdW5jdGlvbiBmaW5kVG9jVG9waWMoKQ0KLXsNCi0JdmFyIHRvY193aW5kb3cgPSB3aW5kb3cuZnJhbWVzWyJvcnlfdG9jIl07DQotDQotCS8vYWxlcnQodG9jX3dpbmRvdy50b2NfbG9hZGVkKTsNCi0JLy8gY2hlY2sgZm9yIGZhbHNlIGlzIG5vdCBzYWZlIHNpbmNlIHRoZSB2YWx1ZSBtaWdodCBiZSB1bmRlZmluZWQgaWYgdGhlIGZyYW1lIGlzIG5vdCBsb2FkZWQgeWV0DQotCS8vaWYgKHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSBmYWxzZSApDQotCWlmICggdG9jX3dpbmRvdy50b2NfbG9hZGVkICE9IHRydWUgKQ0KLQl7DQotCQkvL2lmICggdG9jX3dpbmRvdy50b2NfbG9hZGVkID09IHVuZGVmaW5lZCApDQotCQkvL3sNCi0JCS8vCWFsZXJ0KCJnb3QgaXQhIik7DQotCQkvL30NCi0JCXdpbmRvdy5zZXRUaW1lb3V0KCJmaW5kVG9jVG9waWMoKSIsIDIwMCk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQlpZiAoIHRvcGljVG9EaXNwbGF5ID09IG51bGwgKQ0KLQkJew0KLQkJCXRvcGljVG9EaXNwbGF5ID0gdG9jX3dpbmRvdy5nZXRGaXJzdFRvcGljVXJsKCk7DQotCQl9DQotCQ0KLQkJdmFyIHRvcGljID0gdG9waWNUb0Rpc3BsYXk7DQotDQotCQkvLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB2aWV3LCBpZiBub3QsIGxvb2sgZm9yIHRoZSBuZXh0IHZpZXcNCi0JCWlmICggdG9jX3dpbmRvdy5zZWxlY3RUb3BpYyh0b3BpYykgPT0gZmFsc2UgKQ0KLQkJew0KLQkJCWlmICggbG9hZGluZ1RhYkluZGV4IDwgdmlld1RhYnMubGVuZ3RoIC0xICkNCi0JCQl7DQotCQkJCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleCsrXSk7DQotCQkJCWZpbmRUb2NUb3BpYygpOw0KLQkJCX0NCi0JCQllbHNlDQotCQkJew0KLQkJCQkvLyBlbmQgZmluZGluZyBhbmQgZ290IG5vdGhpbmcNCi0JCQkJLy8gZGlzcGxheSB0aGUgZGVmYXVsdA0KLQkJCQlhbGVydChib29rbWFya3ZpZXdzX2pzX01FU1NBR0UxKTsNCi0JCQkJbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JCQkJc2hvd1BhZ2UoKTsNCi0JCQl9DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JCQkvLyBmaW5kIHN1Y2Nlc3NmdWwsIGRpc3BsYXkgdGhlIHRvcGljIHBhZ2UNCi0JCQlzaG93UGFnZSgpOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLQ0KLQ0KLS8vIGZpbmQgdGhlIHRvcGljIGluIHRoZSBjdXJyZW50IHRhYg0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkNCi17DQotCXZhciB1cmwgPSBwYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0uZG9jdW1lbnQuVVJMOw0KLQkNCi0JaWYgKCB1cmwgIT0gbnVsbCApDQotCXsNCi0JCXRvcGljVG9EaXNwbGF5ID0gdXJsOw0KLQkJZmluZFRvY1RvcGljKCk7DQotCX0NCi19DQotDQotDQotZnVuY3Rpb24gdG9nVmlld3MoKQ0KLXsNCi0JLy8gaWYgY3VycmVudGx5IHZpc2libGUsIGhpZGUgYWxsIGV4Y2VwdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkDQotCWlzVmlld3NWaXNpYmxlID0gKCFpc1ZpZXdzVmlzaWJsZSk7DQotCQ0KLQlmb3IgKCB2YXIgaSA9IDA7ICBpIDwgdmlld1RhYnMubGVuZ3RoOyBpKyspDQotCXsNCi0JCXZhciBzaG93ID0gaXNWaWV3c1Zpc2libGUgfHwgKHZpZXdUYWJzW2ldID09IHNlbGVjdGVkVGFiKTsNCi0JCWlmICggc2hvdyApDQotCQl7CQkNCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7DQotCQkJdmlld1RhYnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCS8vdmlld1RhYnNbaV0uc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOw0KLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl9DQotCX0NCi0JCQ0KLQkJDQotDQotfQ0KLQ0KLQ0KLS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQgcGFnZSBhbmQgbmF2aWdhdGUgdG8gdGhlIG5vZGUNCi0vLyBpZiBubyBkZWZhdWx0IHBhZ2UgaXMgc2V0LCBkaXNwbGF5IHRoZSBmaXJzdCBub2RlIG9mIHRoZSBmaXJzdCB2aWV3DQotZnVuY3Rpb24gaW5pdCgpDQotew0KLQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQl2YXIgdGFicyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIik7DQotCXZhciB0YWJjb3VudCA9IDA7DQotCWZvciAodmFyIGk9MDsgaTx0YWJzLmxlbmd0aDsgaSsrKQ0KLQl7DQotCQlpZiAoIHRhYnNbaV0uZ2V0QXR0cmlidXRlKCd1cmwnKSAhPSBudWxsICkNCi0JCXsJCQkNCi0JCQl2YXIgaXNEZWZhdWx0VmlldyA9IHRhYnNbaV0uZ2V0QXR0cmlidXRlKCdpc0RlZmF1bHRWaWV3Jyk7DQotCQkJaWYgKCBpc0RlZmF1bHRWaWV3ID09ICJ0cnVlIiApDQotCQkJew0KLQkJCQlsb2FkaW5nVGFiSW5kZXggPSB0YWJjb3VudDsNCi0JCQl9DQotCQkJDQotCQkJdmlld1RhYnNbdGFiY291bnQrK10gPSB0YWJzW2ldOw0KLQkJfQ0KLQl9DQotDQotCXRvcGljVG9EaXNwbGF5ID0gcGFyZW50LmdldENvb2tpZSgicnVwX29yeV9kb2MiKTsNCi0JZGlzcGxheVRyZWUodmlld1RhYnNbbG9hZGluZ1RhYkluZGV4XSk7DQotCWZpbmRUb2NUb3BpYygpOw0KLX0NCi0NCi0NCi12YXIgc2VsZWN0ZWRUYWIgPSBudWxsOw0KLXZhciB2aWV3VGFicyA9IG5ldyBBcnJheSgpOzsNCi12YXIgbG9hZGluZ1RhYkluZGV4ID0gMDsNCi12YXIgdG9waWNUb0Rpc3BsYXkgPSBudWxsOw0KLXZhciBpc1ZpZXdzVmlzaWJsZSA9IHRydWU7DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4X3J1Lmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9ydS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YzExNTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4X3J1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDL0RURCBIVE1MIDQuMDEvL0VOIg0KLSAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+DQotPEhUTUw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KLTxtZXRhIG5hbWU9Im1ldGFfdGFnZ2VkIiBjb250ZW50PSJ0cnVlIj4NCi08dGl0bGU+0JPQu9C+0YHRgdCw0YDQuNC5IC0gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yazwvdGl0bGU+DQotPC9oZWFkPg0KLTxmcmFtZXNldCByb3dzPSIyNSwqIj4NCi08ZnJhbWUgbmFtZT0iZ2xvc3NhcnlfbmF2IiBzcmM9Im5hdmlnLmh0bSIgc2Nyb2xsaW5nPSJubyIgbWFyZ2luaGVpZ2h0PSIyIiBtYXJnaW53aWR0aD0iMiIgdGl0bGU9ItCe0LHQu9Cw0YHRgtGMINC90LDQstC40LPQsNGG0LjQuCI+DQotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X2RvYyIgc3JjPSIuLi9nbG9zc2FyeS5odG0iIG1hcmdpbmhlaWdodD0iMCIgbWFyZ2lud2lkdGg9IjIiIHNjcm9sbGluZz0iYXV0byIgdGl0bGU9ItCe0LHQu9Cw0YHRgtGMINC80LDRgtC10YDQuNCw0LvQvtCyIj4NCi08L2ZyYW1lc2V0Pg0KLTwvSFRNTD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X3J1LmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9ydS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY5MWExYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X3J1LmpzCisrKyAvZGV2L251bGwKQEAgLTEsNzg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQNCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotDQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMSA9ICLQlNC10YDQtdCy0L4g0LXRidC1INC90LUg0LfQsNCz0YDRg9C20LXQvdC+Llxu0J/QvtC20LDQu9GD0LnRgdGC0LAsINC/0L7QtNC+0LbQtNC40YLQtS4iOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTIgPSAi0JTQu9GPINC00LDQvdC90L7QuSDRgdGC0YDQsNC90LjRhtGLINC90LXRgiDRgdGC0YDQsNC90LjRhtGLICd7MH0nLlxu0J3QsNC20LzQuNGC0LUg0LTRgNGD0LPRg9GOINC60L3QvtC/0LrRgyDQvdCw0LLQuNCz0LDRhtC40LguICI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMyA9ICLQndC1INC90LDQudC00LXQvdCwINGB0YLRgNCw0L3QuNGG0LAgezB9LiAiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9wcmV2ID0gItC90LDQt9Cw0LQiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9uZXh0ID0gItC00LDQu9C10LUiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV91cCA9ICLQstCy0LXRgNGFIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0U0ID0gItCi0LXQutGD0YnQtdCz0L4g0YTQsNC50LvQsCDQvdC10YIg0LIg0LTQtdGA0LXQstC1LiAiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTUgPSAi0J7Qv9GD0LHQu9C40LrQvtCy0LDQvdC90YvQuSDRgdCw0LnRgiDRg9C20LUg0L/QvtC60LDQt9Cw0L0g0LIg0YTRgNC10LnQvNCw0YUiOw0KLQ0KLWZ1bmN0aW9uIGZvcm1hdFN0cmluZyhtZXNzYWdlLCByZXBsYWNlMCkNCi17DQotICAgCXJldHVybiBtZXNzYWdlLnJlcGxhY2UoL1x7MFx9LywgcmVwbGFjZTApOw0KLX0gDQotDQotLy8gdGhpcyBzY3JpcHQgaXMgZm9yIHRoZSB0b3BuYXYuaHRtbA0KLS8vIHRoaXMgaXMgTk9UIGZvciBnZW5lcmFsIHVzZQ0KLU1TRlBob3ZlciA9DQotKCgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gMyApKSB8fA0KLSAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApKSk7DQotDQotICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpDQotICB7DQotICAgICB2YXIgYT1uZXcgSW1hZ2UoKTsNCi0gICAgIGEuc3JjPWltZzsNCi0gICAgIHJldHVybiBhOw0KLSAgfQ0KLSAgDQotdmFyIHRvdXIgPSAwOw0KLQ0KLWZ1bmN0aW9uIG9wZW5GaXJzdFRvdXIgKCkNCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNA0KLXsNCi1pZighdG91ciB8fCB0b3VyPT1udWxsIHx8IHRvdXIuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuVG91ciAoKQ0KLS8vIG9wZW4gdGhlIGd1aWRlZCB0b3VyIC9oYWFrYW4gOTkwMzI0DQotew0KLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpDQotICAgIHsNCi0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLS8vQWRkaXRpb24gYnkgQ2hpbmggVm8gMDMvMjgvMDANCi0gZnVuY3Rpb24gZGlzcGxheUdldHRpbmdTdGFydGVkKCkNCi0gew0KLSAJdmFyIHBhZ2VQYXR0ZXJuID0gL292dV9wcm9jLzsNCi0gCXZhciBtYWluUGFnZSA9IHdpbmRvdy5wYXJlbnQub3J5X2RvYy5sb2NhdGlvbjsNCi0NCi0gCWlmICggcGFnZVBhdHRlcm4udGVzdCggbWFpblBhZ2UgKSApIHsNCi0gICAgCWlmIChnZXRDb29raWUoIlJVUCIpICE9ICJjaGVja2VkIikgeyBvcGVuRmlyc3RUb3VyKCk7IH0NCi0JfQ0KLQllbHNlIHsNCi0JCXNldFRpbWVvdXQoICJkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKSIsIDEwMDAgKTsNCi0JfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRDb29raWUgKG5hbWUpDQotew0KLSAgdmFyIGRjb29raWUgPSBkb2N1bWVudC5jb29raWU7DQotICB2YXIgY25hbWUgPSBuYW1lICsgIj0iOw0KLSAgdmFyIGNsZW4gPSBkY29va2llLmxlbmd0aDsNCi0gIHZhciBjYmVnaW4gPSAwOw0KLSAgd2hpbGUgKGNiZWdpbiA8IGNsZW4pDQotICB7DQotICAgIHZhciB2YmVnaW4gPSBjYmVnaW4gKyBjbmFtZS5sZW5ndGg7DQotICAgIGlmIChkY29va2llLnN1YnN0cmluZyhjYmVnaW4sIHZiZWdpbikgPT0gY25hbWUpDQotICAgIHsNCi0gICAgICB2YXIgdmVuZCA9IGRjb29raWUuaW5kZXhPZiAoIjsiLCB2YmVnaW4pOw0KLSAgICAgIGlmICh2ZW5kID09IC0xKQ0KLSAgICAgIHsNCi0gICAgICAgIHZlbmQgPSBjbGVuOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gdW5lc2NhcGUoZGNvb2tpZS5zdWJzdHJpbmcodmJlZ2luLCB2ZW5kKSk7DQotICAgIH0NCi0gICAgY2JlZ2luID0gZGNvb2tpZS5pbmRleE9mKCIgIiwgY2JlZ2luKSArIDE7DQotICAgIGlmIChjYmVnaW4gPT0gMCkNCi0gICAgew0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9DQotICByZXR1cm4gbnVsbDsNCi0gfQ0KLQ0KLQ0KLSAgdmFyIGluZGV4PW51bGw7DQotICB2YXIgdG91cj1udWxsOw0KLSAgdmFyIHNlYXJjaD1udWxsOw0KLSAgdmFyIGdsb3NzYXJ5PW51bGw7DQotICB2YXIgZmVlZGJhY2s9bnVsbDsNCi0gIHZhciB0cmVlTG9hZGVkPWZhbHNlOw0KLSAgZnVuY3Rpb24gY2hlY2tUcmVlTG9hZGVkKCkNCi0gIHsNCi0gICAgaWYodHJlZUxvYWRlZCkNCi0gICAgew0KLSAgICAgIHJldHVybiB0cmVlTG9hZGVkOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICBpZihwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQgIT0gbnVsbA0KLSAgICAgICAgJiYgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHkoKSkNCi0gICAgIHsNCi0gICAgICAgdHJlZUxvYWRlZCA9IHRydWU7DQotICAgICB9DQotICAgICAqLw0KLSAgICAgaWYocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0ICE9IG51bGwpDQotICAgICB7DQotICAgICAgCXZhciBtZXRob2QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHk7DQotCSBpZiAobWV0aG9kICE9ICJ1bmRlZmluZWQiKSB7DQotCQlpZiAocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHkoKSkNCi0JCXsNCi0gICAgICAgCQkJdHJlZUxvYWRlZCA9IHRydWU7DQotCQl9DQotDQotCSAgfQ0KLQ0KLSAgICAgfQ0KLQ0KLSAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7DQotICAgfQ0KLQ0KLQ0KLSAgICBmdW5jdGlvbiBzaG93QWxlcnROb3RMb2FkZWQoKQ0KLSAgICB7DQotICAgICAgYWxlcnQodG9wbmF2X2pzX01FU1NBR0UxKTsNCi0gICAgfQ0KLQ0KLWZ1bmN0aW9uIHNob3dTdGF0dXNOb3RMb2FkZWQoKQ0KLSAgew0KLSAgICAvL3JldHVybiAiVGhlIFRyZWVCcm93c2UgaXMgbm90IHlldCBsb2FkZWQhXG5QbGVhc2Ugd2FpdCEiOw0KLSAgICByZXR1cm4gdG9wbmF2X2pzX01FU1NBR0UxOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd0FsZXJ0Tm9QYWdlKHRleHQpDQotICB7DQotICAgICB2YXIgcGFyZW50TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgICAgLy9hbGVydCgiVGhlcmUgaXMgbm8gJyIgKyB0ZXh0ICsgIicgcGFnZSBmb3IgdGhpcyBwYWdlLlxuVHJ5IG9uZSBvZiB0aGUgb3RoZXIgbmF2aWdhdGlvbiBidXR0b25zLiIpOw0KLSAgICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICAgLy9hbGVydCgiVGhlcmUgaXMgbm8gJyIgKyB0ZXh0ICsgIicgcGFnZSBmb3IgdGhpcyBwYWdlLlxuVHJ5IG9uZSBvZiB0aGUgb3RoZXIgbmF2aWdhdGlvbiBidXR0b25zIik7DQotICAgICAgICAgYWxlcnQoZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMiwgdGV4dCkpOw0KLSAgICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1N0YXR1c05vUGFnZSh0ZXh0KQ0KLSAgew0KLQ0KLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbXNnOw0KLSAgICAgaWYocGFyZW50TGFiZWwhPSIiICYmIHBhcmVudExhYmVsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICAgLy9tc2cgPSAiVGhlcmUgaXMgbm8gIiArIHRleHQgKyAiIHBhZ2UhIjsNCi0gICAgICAgIG1zZyA9IGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTMsIHRleHQpOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgLy9tc2cgPSAiVGhlcmUgaXMgbm8gIiArIHRleHQgKyAiIHBhZ2UhIjsNCi0gICAgICAgIG1zZyA9IGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTMsIHRleHQpOw0KLSAgICAgfQ0KLQ0KLSAgICAgcmV0dXJuIG1zZzsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dQYXJlbnRMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIHBhcmVudHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwYXJlbnR1cmwhPSIiICYmIHBhcmVudHVybCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJ1cCIpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dIb21lTGFiZWwoKQ0KLSAgew0KLSAgICBzZWxmLnN0YXR1cyA9ICLQkiDQvdCw0YfQsNC70L4iOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1ByZXZpb3VzTGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIHByZXZ1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwcmV2dXJsIT0iIiAmJiBwcmV2dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJwcmV2aW91cyIpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dOZXh0TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgbmV4dHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIG5leHR1cmwhPSIiICYmIG5leHR1cmwhPW51bGwpDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgICB9DQotICAgICAgZWxzZQ0KLSAgICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb1BhZ2UoIm5leHQiKTsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZFByZXZpb3VzKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJQcmV2aW91cyIpOw0KLQl9DQotCSAgICAgIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9wcmV2KTsNCi0gICAgIH0NCi0gICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZE5leHQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJOZXh0Iik7DQotCX0NCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLQ0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX25leHQpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUGFyZW50KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfdXApOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0JdmFyIHN0YXR1cyA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgIAlpZiggc3RhdHVzID09IGZhbHNlICkNCi0Jew0KLQkJYWxlcnQoIHRvcG5hdl9qc19NRVNTQUdFNCApOw0KLQl9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHVwQXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS51cEFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGRvd25BcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmRvd25BcnJvdygpOw0KLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgfQ0KLQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICAgIGZ1bmN0aW9uIGxlZnRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUubGVmdEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gcmlnaHRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUucmlnaHRBcnJvdygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotDQotZnVuY3Rpb24gbG9hZFRvcCgpDQotew0KLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIpDQotICB7DQotICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTUpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7DQotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7DQotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsNCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7DQotDQotICAgIHZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOw0KLQ0KLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkNCi0gICAgew0KLSAgICAgICBpZihkb2N1bWVudC5saW5rc1tpXS5ocmVmLmluZGV4T2YoImluZGV4Lmh0bSIpIT0tMSkNCi0gICAgICAgew0KLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IGRvY3VtZW50LmxpbmtzW2ldLmhyZWY7DQotICAgICAgICAgYnJlYWs7DQotICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7DQotCX0NCi0gICAgfQ0KLSAgIH0NCi19DQotDQotDQotZnVuY3Rpb24gb3Blbk9yeSAocGFnZSwgdGFyZ2V0KQ0KLXsNCi0gICAgaWYoIWluZGV4IHx8IGluZGV4LmNsb3NlZCkNCi0gICAgew0KLSAgICAgIGluZGV4ID0gb3BlbihwYWdlLHRhcmdldCwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM5NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBpbmRleC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5TZWFyY2goKQ0KLXsNCi0gICAgaWYoIXNlYXJjaCB8fCBzZWFyY2guY2xvc2VkKQ0KLSAgICB7DQotICAgICAgc2VhcmNoID0gb3BlbigiLi9hcHBsZXQvc2VhcmNoLmh0bSIsInNlYXJjaF9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9bm8sd2lkdGg9NjMwLGhlaWdodD00NTAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNlYXJjaC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5JbmRleCgpDQotew0KLSAgIG9wZW5PcnkoIi4vaW5kZXgvaW5kZXguaHRtIiwiaW5kZXhfd2luIik7DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5HbG9zc2FyeSgpDQotew0KLSBpZighZ2xvc3NhcnkgfHwgZ2xvc3NhcnkuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgZ2xvc3NhcnkgPSBvcGVuKCIuL3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXguaHRtIiwiZ2xvc3Nhcnlfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM4NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBnbG9zc2FyeS5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIHByaW50UGFnZSgpDQotew0KLSBwYXJlbnQub3J5X2RvYy5mb2N1cygpOw0KLSBwYXJlbnQub3J5X2RvYy5wcmludCgpOw0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kRmVlZGJhY2sodXJsKQ0KLXsNCi0JaWYgKCB1cmwgPT0gbnVsbCB8fCB1cmwgPT0gJycgKQ0KLQl7DQotCQlyZXR1cm47DQotCX0NCi0JDQotCWlmICggdXJsLmluZGV4T2YoIm1haWx0bzoiKSA+PSAwICkNCi0Jew0KLQkJc2VuZG1haWwodXJsKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCQ0KLSAJICAgIGlmKCFmZWVkYmFjayB8fCBmZWVkYmFjay5jbG9zZWQpDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrID0gb3Blbih1cmwsImZlZWRiYWNrX3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD02MDAsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotCSAgICB9DQotCSAgICBlbHNlDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrLmZvY3VzKCk7DQotCSAgICB9DQotICAgIAl9DQotICAgIAkNCi19DQotDQotDQotZnVuY3Rpb24gc2VuZG1haWwodXJsKQ0KLXsNCi0JaWYgKCB1cmwuaW5kZXhPZigiP3N1YmplY3QiKSA9PSAtMSApDQotCXsNCi0JCXZhciBsaW5rPXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQkJdXJsID0gdXJsICsgJz9zdWJqZWN0PUZlZWRiYWNrOiAtICcrbGluazsNCi0JfQ0KLQlsb2NhdGlvbi5yZXBsYWNlKHVybCk7DQotfQ0KLQ0KLS8vY2FsY3VsYXRlcyByZWxhdGl2ZSBwYXRoDQotLy9wYXRoIG11c3QgYmUgYWxsIHJlbGF0aXZlIGZyb20gd2Vic2l0ZSBiYXNlIG9yIGNvbnRhaW4gZnVsbCB1cmxzDQotZnVuY3Rpb24gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHNvdXJjZVBhdGgsIHRhcmdldFBhdGgpDQotew0KLQlpZiAodGFyZ2V0UGF0aC5pbmRleE9mKCJodHRwOi8iKSAhPSAtMSkNCi0Jew0KLQkJcmV0dXJuIHRhcmdldFBhdGg7DQotCX0NCi0NCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0Jc291cmNlUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0JdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXFwvZywiLyIpOw0KLQ0KLQkvL2FsZXJ0KCJSZXBsYWNlKFNvdXJjZSk9PiIgKyBzb3VyY2VQYXRoKTsNCi0JLy9hbGVydCgiUmVwbGFjZSh0YXJnZXQpPT4iICsgdGFyZ2V0UGF0aCk7DQotDQotDQotCXNvdXJjZUFycmF5ID0gc291cmNlUGF0aC5zcGxpdCgiLyIpOw0KLQl0YXJnZXRBcnJheSA9IHRhcmdldFBhdGguc3BsaXQoIi8iKTsNCi0NCi0JdmFyIHRoZVJlbFBhdGggPSAiIjsNCi0NCi0JLy9sb29wIHVudGlsIHdlIGZpbmQgYSBkaWZmZXJlbmNlDQotCXZhciBpZHggPSAwOw0KLQlmb3IoaWR4ID0gMDsgaWR4IDwgc291cmNlQXJyYXkubGVuZ3RoOyBpZHgrKykNCi0Jew0KLQkJaWYgKGlkeCA+IHRhcmdldFBhdGgubGVuZ3RoKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQ0KLQkJaWYgKHNvdXJjZUFycmF5W2lkeF0gIT0gdGFyZ2V0QXJyYXlbaWR4XSkNCi0JCXsNCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQ0KLQkvL2FwcGVuZCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIC4vDQotCXZhciBtYXhJZHggPSBzb3VyY2VBcnJheS5sZW5ndGggLSAxOw0KLQlmb3IgKHZhciBpID0gaWR4OyBpIDwgbWF4SWR4OyBpKyspDQotCXsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgIi4vIjsNCi0NCi0JCS8vYWxlcnQoIlJlbFBhdGg9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FwcGVuZCBhbnkgcmVtYWluaW5nIHRhcmdldCBwYXRoDQotCXdoaWxlKGlkeCA8IHRhcmdldEFycmF5Lmxlbmd0aCkNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyB0YXJnZXRBcnJheVtpZHgrK10gKyAiLyI7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKGZpbmFsKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vcmVtb3ZlIHRoZSBsYXN0IHBhdGggc2VwYXJhdG9yDQotCWlmICh0aGVSZWxQYXRoLmxlbmd0aCA+IDApDQotCXsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aC5zdWJzdHJpbmcoMCwgKHRoZVJlbFBhdGgubGVuZ3RoIC0gMSkpOw0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJSZXR1cm4gUmVsYXRpdmUgUGF0aCA9PiAiICsgdGhlUmVsUGF0aCk7DQotDQotCXJldHVybiB0aGVSZWxQYXRoOw0KLX0NCi0NCi1mdW5jdGlvbiBnZXRUcmVlUGF0aCgpDQotew0KLQlyZXR1cm4gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCk7DQotfQ0KLQ0KLS8vVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgdGhlIHdlYnNpdGUgYmFzZSBmcm9tIHRoZSB1cmwNCi1mdW5jdGlvbiBjYWxjdWxhdEN1cnJlbnRQYWdlKGN1cnJVUkwpIHsNCi0NCi0JdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCS8vcmVwbGFjZSBhbGwgJ1wnIHdpdGggJy8nDQotCXRoZUN1cnJlbnRMb2NhdGlvbiA9IHRoZUN1cnJlbnRMb2NhdGlvbi5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQljdXJyVVJMID0gY3VyclVSTC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQ0KLQl2YXIgc291cmNlQXJyYXkgPSB0aGVDdXJyZW50TG9jYXRpb24uc3BsaXQoIi8iKTsNCi0JdmFyIGN1cnJBcnJheSA9IGN1cnJVUkwuc3BsaXQoIi8iKTsNCi0NCi0JdmFyIG51bVRvUmVtb3ZlID0gc291cmNlQXJyYXkubGVuZ3RoIC0gMjsNCi0JdmFyIGlkeCA9IDA7DQotCXZhciB0aGVSZXR1cm5QYXRoID0gIiI7DQotCWZvciAoaWR4ID0gbnVtVG9SZW1vdmU7IGlkeCA8IGN1cnJBcnJheS5sZW5ndGg7IGlkeCsrKSB7DQotCQlpZiAodGhlUmV0dXJuUGF0aCAhPSAiIikgew0KLQkJCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgIi8iOw0KLQkJfQ0KLQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyBjdXJyQXJyYXlbaWR4XTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJBcnJheVRlc3Q9PiIgKyBjdXJyVVJMICsgIiwiICsgdGhlUmV0dXJuUGF0aCk7DQotCXJldHVybiB0aGVSZXR1cm5QYXRoOw0KLX0NCi0NCi0vL2J1aWxkcyB0cmVlIHBhdGgNCi1mdW5jdGlvbiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKQ0KLXsNCi0JdmFyIHRoZURlbGltaXRlciA9ICIjIyoiOw0KLQl2YXIgdGhpc1BhZ2UgPSAiYXBwbGV0L3J1cF90b3BuYXYuaHRtIjsNCi0JdmFyIHRoZUxvYyA9ICIiOw0KLQ0KLQ0KLQ0KLQlpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0Jew0KLQkJdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCQl0aGlzUGFnZSA9IGNhbGN1bGF0Q3VycmVudFBhZ2UodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlBhdGhOYW1lOiIgKyB0aGlzUGFnZSk7DQotDQotCQkvL2FsZXJ0KCJUcnlpbmcgdG8gZmluZCB0aGUgcGF0aCBmb3IgPT4iICsgdGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCXZhciB0aGVQYXRoID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmdldFRyZWVQYXRoQXJyYXkodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlRoZSBUcmVlIFBhdGg6ICIgKyB0aGVQYXRoKTsNCi0NCi0JCXRoZVBhdGhTdHJpbmcgPSB0aGVQYXRoICsgIiI7DQotICAgIAkJYXJyYXlGcm9tU3RyaW5nID0gdGhlUGF0aFN0cmluZy5zcGxpdCh0aGVEZWxpbWl0ZXIpOw0KLQ0KLQkJLy9idWlsZCB0aGUgcGF0aCBmcm9tIHRoZSBhcnJheQ0KLQkJLy9wYXJhbSAxID0gcGF0aCB0byBpY29uLCBwYXJhbSAyIC0gbGFiZWwsIHBhcmFtIDMgLSBwYXRoIHRvIGZpbGUNCi0JCXZhciBjb3VudGVyID0gMDsNCi0JCXZhciB0aGVMYWJlbDsNCi0JCXZhciB0aGVSZWxQYXRoOw0KLQkJaWYgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggPiAyKQ0KLQkJew0KLQkJICAgdGhlTG9jID0gIiI7DQotCQkgICBmb3IodmFyIGkgPSAwOyBpIDwgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggLSAxKSA7IGkrKykNCi0JCSAgIHsNCi0JCQkvL2l0J3MgdGhlIGljb24gcGF0aA0KLQkJCWlmIChjb3VudGVyIDwgMikNCi0JCQl7DQotCQkJCWlmIChjb3VudGVyID4gMCkNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsgIiAmZ3Q7ICI7DQotCQkJCX0NCi0NCi0JCQkJLy9hbGVydCgiQ2FsY3VsYXRpbmcgcGF0aCBmcm9tKDEpICIgKyB0aGlzUGFnZSArICIgPT4gIiArIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotDQotCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiXFwiKSA9PSAtMSAmJiBhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiLyIpID09IC0xKQ0KLQkJCQl7DQotCQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJCXsNCi0JCQkJCQl0aGVSZWxQYXRoID0gImFwcGxldC9pbWFnZXMvIiArIGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCB0aGVSZWxQYXRoKTsNCi0JCQkJCX0NCi0JCQkJCS8vYWxlcnQoIk1vZGlmeWluZyBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCX0NCi0NCi0JCQkJaWYgKHRoZVJlbFBhdGggIT0gIm51bGwiKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJCSAiPGltZyBib3JkZXI9MCBzcmM9XCIiICsNCi0JCQkJCQkgdGhlUmVsUGF0aCAgKw0KLQkJCQkJCSAiXCI+IjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDI7DQotCQkJfQ0KLQkJCS8vIGl0J3MgdGhlIGxhYmVsDQotCQkJZWxzZSBpZiAoY291bnRlciA9PSAyKQ0KLQkJCXsNCi0JCQkJdGhlTGFiZWwgPSBhcnJheUZyb21TdHJpbmdbaV07DQotCQkJCWNvdW50ZXIgPSAzOw0KLQkJCX0NCi0JCQllbHNlIGlmIChjb3VudGVyID09IDMpDQotCQkJew0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMykgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCQlpZiAodGhlUmVsUGF0aCAhPSAiIikgew0KLQkJCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCIgdGFyZ2V0PVwib3J5X2RvY1wiIGhyZWY9XCIiICsNCi0JCQkJCQkJIHRoZVJlbFBhdGggKw0KLQkJCQkJIAkJIlwiPiIgKw0KLQkJCQkJIAkJdGhlTGFiZWwgKw0KLQkJCQkJIAkJIjxcL2E+XG4iOw0KLQkJCQkJIH0NCi0JCQkJCSBlbHNlIHsNCi0JCQkJCSAJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIj4iICArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQl9DQotCQkJCWVsc2UNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJdGhlTGFiZWwgKw0KLQkJCQkJIAkiPFwvYT5cbiI7DQotCQkJCX0NCi0JCQkJLy9hbGVydCgidGhlIGN1cnIgcGF0aD0+IiArIHRoZUxvYyk7DQotCQkJCWNvdW50ZXIgPSAxOw0KLQkJCQl0aGVSZWxQYXRoID0gIm51bGwiOw0KLQkJCQl0aGVMYWJlbCA9ICJudWxsIjsNCi0JCQl9DQotCQkgICB9DQotDQotCQkvL2FsZXJ0KCJGaW5pc2hlZCBCdWlsZGluZyA9PiAiICsgdGhlTG9jKTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQkvL3RoZUxvYyA9ICJDdXJyZW50IExvY2F0aW9uJm5ic3A7JiMwNDU7Jm5ic3A7IiArIHRoZUxvYzsNCi0NCi0JLy9hbGVydCgidGhlIEZpbmFsIFN0cmluZz0+IiArIHRoZUxvYyk7DQotDQotCS8vZG9jdW1lbnQud3JpdGUodGhlTG9jKTsNCi0JcmV0dXJuIHRoZUxvYzsNCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvZG9jcm9vdC9zcHNjcmVlbl9ydS5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9kb2Nyb290L3Nwc2NyZWVuX3J1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhOTFkNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9kb2Nyb290L3Nwc2NyZWVuX3J1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi0KLTwhLS0gUlBXIE1FVEEgREFUQSBTVEFSVCAtLQotIAotIAotLS0gUlBXIE1FVEEgREFUQSBFTkQgLS0+Ci0KLTxodG1sPgotCi08aGVhZD4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0icm9wLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ii8+Ci08dGl0bGU+0JfQsNGB0YLQsNCy0LrQsDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi0KLQotPHAgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC9wPgotPGgyIGFsaWduPSJjZW50ZXIiPtCY0LTQtdGCINC30LDQs9GA0YPQt9C60LAg0LHRgNCw0YPQt9C10YDQsC4uLjxici8+PC9oMj4KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTwhLS0gCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iaW1hZ2VzL3NwbGFzaC5naWYiIGFsdD0i0JLQsNGBINC/0YDQuNCy0LXRgtGB0YLQstGD0LXRgiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIi8+PC9wPgotLS0+Ci08YnIvPgotPGJyLz4KLQotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTFjNzBlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgUHVibGlzaGluZyAoTkwyKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZmVmMjEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVx1MDQxZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyM2NjZWYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQUDAwMDBFIC0gSVVQUDAwOTlFDQotIw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZT1cdTA0MWZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Li4uDQotaW5pdGlhbGl6aW5nRGlyVGFza19uYW1lPVx1MDQxOFx1MDQzZFx1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQzN1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0NDZcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzXHUwNDMwLi4uDQotY29weWluZ0ZpbGVzVGFza19uYW1lPVx1MDQxYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzIuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtzVGFza19uYW1lPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzdcdTA0MzBcdTA0M2FcdTA0M2JcdTA0MzBcdTA0MzRcdTA0M2VcdTA0M2EuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtUYXNrX25hbWU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzN1x1MDQzMFx1MDQzYVx1MDQzYlx1MDQzMFx1MDQzNFx1MDQzYVx1MDQzOCAnJ3swfScnLi4uDQotZ2VuZXJhdGluZ0Jvb2ttYXJrSW5kZXhUYXNrX25hbWU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQzNFx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0M2FcdTA0M2JcdTA0MzBcdTA0MzRcdTA0M2VcdTA0M2EuLi4NCi1wdWJsaXNoaW5nTGlua2VkRWxlbWVudFRhc2tfbmFtZT1cdTA0MWZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMjogezB9IFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzZSwgezF9IFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0Yw0KLXB1Ymxpc2hpbmdFbGVtZW50VGFza19uYW1lPVx1MDQxZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwOiB7MH06ezF9DQotZ2VuZXJhdGluZ0dsb3NzYXJ5VGFza19uYW1lPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzNcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NDFcdTA0MzBcdTA0NDBcdTA0MzhcdTA0NGYuLi4NCi1nZW5lcmF0aW5nU2VhcmNoSW5kZXhUYXNrX25hbWU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQzNFx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQzMCBcdTA0M2ZcdTA0M2VcdTA0MzhcdTA0NDFcdTA0M2FcdTA0MzAuLi4NCi1idWlsZGluZ1Byb2Nlc3NDbG9zdXJlVGFza19uYW1lPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzVcdTA0MzlcdTA0M2RcdTA0MzVcdTA0NDBcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwLi4uDQotYnVpbGRpbmdFbGVtZW50Q2xvc3VyZVRhc2tfbmFtZT1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNkXHUwNDM1XHUwNDQwXHUwNDMwIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMCBcdTA0MzRcdTA0M2JcdTA0NGYgJyd7MH0nJy4uLg0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPVx1MDQxN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzYVx1MDQzMCBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4Li4uDQotDQotIyBFcnJvciBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotcHVibGlzaEVsZW1lbnRFcnJvcl9tc2c9SVVQUDAwMDBFOiBcdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzA6IHswfQ0KLXNlcnZlckVycm9yX21zZz1JVVBQMDAwMUU6IFx1MDQyMSBcdTA0NDFcdTA0MzVcdTA0NDBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzAgXHUwNDNkXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0M1x1MDQ0N1x1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUuDQotaW52YWxpZEh0dHBSZXNwb25zZUVycm9yX21zZz1JVVBQMDAwMkU6IFx1MDQxZFx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQ0Ylx1MDQzOSBcdTA0M2VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDIgXHUwNDNlXHUwNDQyIGh0dHA6Ly97MH06ezF9OnsyfQ0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZz1JVVBQMDAwM1c6IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2RcdTA0MzUgXHUwNDMxXHUwNDRiXHUwNDNiIFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZCwgXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDQzIFx1MDQzZVx1MDQzZCBcdTA0M2RcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2MgXHUwNDMyIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1pbnZhbGlkTWV0aG9kRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDA0VzogXHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzZFx1MDQzNSBcdTA0MzFcdTA0NGJcdTA0M2IgXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZCwgXHUwNDNmXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDNjXHUwNDQzIFx1MDQ0N1x1MDQ0Mlx1MDQzZSBcdTA0M2VcdTA0M2QgXHUwNDNkXHUwNDM1IFx1MDQ0Zlx1MDQzMlx1MDQzYlx1MDQ0Zlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwOiB7MH0NCi1jb3B5RmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA1VzogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0NDFcdTA0M2FcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFx1MDQzOFx1MDQzNyAnJ3swfScnIFx1MDQzMiAnJ3sxfScnLg0KLW1pc3NpbmdJY29uRmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA2VzogXHUwNDI0XHUwNDMwXHUwNDM5XHUwNDNiIFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzMCBcdTA0NDNcdTA0MzdcdTA0M2JcdTA0MzAgJyd7MH0nJyBcdTA0M2RcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyLg0KLW1pc3NpbmdJY29uTmFtZVdhcm5pbmdfbXNnPUlVUFAwMDA3VzogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2VcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzMCBcdTA0NDNcdTA0MzdcdTA0M2JcdTA0MzAuDQotZXh0ZXJuYWxVcmxfbXNnPVx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzMCBcdTA0M2RcdTA0MzAgXHUwNDMyXHUwNDNkXHUwNDM1XHUwNDQ4XHUwNDNkXHUwNDM4XHUwNDM5IFVSTDogezB9DQotZGlzY2FyZWRDYXRlZ29yeVdhcm5pbmdfbXNnPVx1MDQxZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQ0ZiBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NGYgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQzZFx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzAuDQotDQotIyBFcnJvciBEZXRhaWxzDQotY3JlYXRlU2VhcmNoSW5kZXhFcnJvcl9tc2c9SVVQUDAwMDhFOiBcdTA0MjRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDQxIFx1MDQzOFx1MDQzZFx1MDQzNFx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQzZVx1MDQzYyBcdTA0M2ZcdTA0M2VcdTA0MzhcdTA0NDFcdTA0M2FcdTA0MzAgXHUwNDNkXHUwNDM1IFx1MDQzMVx1MDQ0Ylx1MDQzYiBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2QuDQotDQotIyBQcm9jZXNzIFRyZWUgTm9kZXMNCi1yZWZlcmVuY2VXb3JrZmxvd3NOb2RlX3RleHQ9XHUwNDIxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQzYVx1MDQzOCBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzkNCi10YXNrTm9kZV90ZXh0PVx1MDQxN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOA0KLXByaW1hcmlseVBlcmZvcm1zTm9kZV90ZXh0PVx1MDQxMiBcdTA0M2VcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2RcdTA0M2VcdTA0M2MgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyDQotYWRkaXRpb25hbGx5UGVyZm9ybXNOb2RlX3RleHQ9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlIFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0Mg0KLXBlcmZvcm1pbmdSb2xlc05vZGVfdGV4dD1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzggXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDM1XHUwNDM5DQotaW5wdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9XHUwNDEyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGINCi1vdXRwdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGINCi1yZXNwb25zaWJsZUZvck5vZGVfdGV4dD1cdTA0MWVcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDM3XHUwNDMwDQotbW9kaWZpZXNOb2RlX3RleHQ9XHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyDQotcmVzcG9uc2libGVSb2xlTm9kZV90ZXh0PVx1MDQxZVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGMNCi1jb250YWluaW5nV29ya1Byb2R1Y3ROb2RlX3RleHQ9XHUwNDIxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDM5IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDINCi1jb250YWluZWRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9XHUwNDIxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDM1XHUwNDQxXHUwNDRmIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGINCi1ndWlkYW5jZU5vZGVfdGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYNCi1pbnB1dFRvTm9kZV90ZXh0PVx1MDQxMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzRcdTA0M2JcdTA0NGYNCi1vdXRwdXRGcm9tTm9kZV90ZXh0PVx1MDQxMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0MzcNCi0NCi0jIEhUTUwgVGl0bGUgZm9yIEluZGV4IFBhZ2UNCi1pbmRleExhYmVsX3RleHQ9XHUwNDE4XHUwNDNkXHUwNDM0XHUwNDM1XHUwNDNhXHUwNDQxDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIveHNsL3Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIveHNsL3Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTc4ODk2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL3hzbC9yZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4NCi0NCi1zZWxlY3RlZENvbmZpZ3VyYXRpb25UZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDMwIFx1MDQzMiBcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzVcdTA0M2MgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzXHUwNDM1DQotZGV0YWlsSW5mb1RleHQ9XHUwNDFmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQzYVx1MDQzZVx1MDQzYiBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkIFx1MDQzMiBcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0NDUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDMwXHUwNDQ1IFx1MDQzMiBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0MzUgbG9ncw0KLXNob3dFcnJvclRleHQ9XHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzOCwgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNkXHUwNDM4XHUwNDNhXHUwNDQ4XHUwNDM4XHUwNDM1IFx1MDQzMiBcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzUgXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLWxvZ3NXYXJuaW5nVGV4dD1cdTA0NDBcdTA0MzVcdTA0MzNcdTA0MzhcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNlx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2VcdTA0MzEgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDQ1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzMFx1MDQ0NSwgXHUwNDNkXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDMwXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDQ1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzMFx1MDQ0NSBcdTA0MzggXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Zlx1MDQ0NSwgXHUwNDNkXHUwNDM1IFx1MDQ0MVx1MDQzZVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzMFx1MDQ0OVx1MDQzOFx1MDQ0NSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIuDQotcGFnZXNOb3RJbnN0YWxsZWRUZXh0PVx1MDQxMiBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0MzUgcGFnZXNfbm90X2luc3RhbGxlZCBcdTA0M2RcdTA0MzBcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGZcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQzZFx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzMFx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDMyIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotaW52YWxpZEV4dGVybmFsVGV4dD1cdTA0MTIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0M2RcdTA0MzVcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDMyXHUwNDNkXHUwNDM1XHUwNDQ4XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOA0KLW93bmVyRWxlbWVudFRleHQ9XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzMlx1MDQzYlx1MDQzMFx1MDQzNFx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0Nlx1MDQzMA0KLW5vbkV4aXN0aW5nVGV4dD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDMyXHUwNDNiXHUwNDMwXHUwNDM0XHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQ2XHUwNDM1XHUwNDMyIFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzMFx1MDQ0ZVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2RcdTA0MzAgXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0Yi4gXHUwNDEyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlLCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDMxXHUwNDRiXHUwNDNiXHUwNDM4IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0MzhcdTA0MzcgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4LCBcdTA0M2FcdTA0M2VcdTA0MzNcdTA0MzRcdTA0MzAgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzOCBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0NGIgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzZFx1MDQzMCBcdTA0M2RcdTA0MzhcdTA0NDUuIFx1MDQxZFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDMyXHUwNDNiXHUwNDMwXHUwNDM0XHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQ2XHUwNDM1XHUwNDMyIFx1MDQzOCBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0NGNcdTA0NDJcdTA0MzUgXHUwNDNkXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDMwXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOC4NCi1taXNzaW5nUmVmZXJlbmNlc1RpdGxlVGV4dD1cdTA0MWRcdTA0MzVcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4DQotbWlzc2luZ1JlZmVyZW5jZXNUZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0MzJcdTA0M2JcdTA0MzBcdTA0MzRcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDZcdTA0MzVcdTA0MzIgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDMwXHUwNDRlXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzZFx1MDQzMCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIsIFx1MDQzZVx1MDQ0Mlx1MDQ0MVx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0MzIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRjXHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzZVx1MDQ0Mlx1MDQ0MyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDM4IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQ0Y1x1MDQ0Mlx1MDQzNSBcdTA0M2RcdTA0MzVcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4LiANCi1taXNzaW5nUmVzb3VyY2VGaWxlc1RpdGxlVGV4dD1cdTA0MWVcdTA0NDJcdTA0NDFcdTA0NDNcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzZVx1MDQzMg0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGV4dD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDMyXHUwNDNiXHUwNDMwXHUwNDM0XHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQ2XHUwNDM1XHUwNDMyIFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzMFx1MDQ0ZVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2RcdTA0MzAgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0YiBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M2VcdTA0MzIuIFx1MDQyZFx1MDQ0Mlx1MDQzOCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNlXHUwNDMyIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0MzIgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDMwXHUwNDQ1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzZVx1MDQzMiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzMlx1MDQzYlx1MDQzZVx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0MzIgXHUwNDNkXHUwNDM4XHUwNDQ1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzMFx1MDQ0NS4NCi1taXNzaW5nUmVzb3VyY2VUZXh0PVx1MDQxZVx1MDQ0Mlx1MDQ0MVx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzOSBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDENCi1vd25lclJlc291cmNlVGV4dD1cdTA0MjBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDEgXHUwNDMyXHUwNDNiXHUwNDMwXHUwNDM0XHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQ2XHUwNDMwDQotbWlzc2luZ0VsZW1lbnRUZXh0PVx1MDQxZVx1MDQ0Mlx1MDQ0MVx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzOSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDINCi1pbnZhbGlkRWxlbWVudFRleHQ9XHUwNDFkXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDM5IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mg0KLWludmFsaWRFbGVtZW50TGlua3NUZXh0PVx1MDQyMVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCBcdTA0M2RcdTA0MzAgXHUwNDNkXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0Yg0KLXBsZWFzZUNoZWNrVGV4dD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NGNcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDNlXHUwNDQyXHUwNDQzIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzggXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDRjXHUwNDQyXHUwNDM1IFx1MDQzZFx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzMFx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzguDQotcGxlYXNlRmluZFRleHQ9XHUwNDFkXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0MzJcdTA0M2JcdTA0MzBcdTA0MzRcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDZcdTA0MzVcdTA0MzIgXHUwNDM4IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQ0Y1x1MDQ0Mlx1MDQzNSBcdTA0M2RcdTA0MzVcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4Lg0KLWdsb3NzYXJ5VGV4dD1cdTA0MTNcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NDFcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzkNCi1pbmRleFRleHQ9XHUwNDE4XHUwNDNkXHUwNDM0XHUwNDM1XHUwNDNhXHUwNDQxDQotZmVlZGJhY2tUZXh0PVx1MDQxZVx1MDQ0Mlx1MDQzN1x1MDQ0Ylx1MDQzMlx1MDQ0Yg0KLWFib3V0VGV4dD1cdTA0MWUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDM1DQotc2VhcmNoVGV4dD1cdTA0MWZcdTA0M2VcdTA0MzhcdTA0NDFcdTA0M2ENCi1wcmludFRleHQ9XHUwNDFmXHUwNDM1XHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDRjDQotc3VtbWFyeVRleHQ9XHUwNDIxXHUwNDMyXHUwNDNlXHUwNDM0XHUwNDNhXHUwNDMwDQotcHVibGlzaGluZ1JlcG9ydFRleHQ9XHUwNDFlXHUwNDQyXHUwNDQ3XHUwNDM1XHUwNDQyIFx1MDQzZSBcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0Mzg6DQotd2hlcmVBbUlUZXh0PVx1MDQyMlx1MDQzNVx1MDQzYVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzNSBcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0M2UNCi10cmVlU2V0c1RleHQ9XHUwNDFkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDRiIFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzMlx1MDQ0Y1x1MDQzNVx1MDQzMg0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YWVhYWUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDBhMmJhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwyYS5qYXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Y2VhMzAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS5ubDJhLmphciA9IHNyYy8NCi1vdXRwdXQubmwyYS5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gbmwyYS5qYXIsXA0KLSAgICAgICAgICAgICAgIHhzbC8sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBkb2Nyb290LyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2RvY3Jvb3QvYWJvdXRfZGEuaHRtIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2RvY3Jvb3QvYWJvdXRfZGEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODAyNGNjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS9kb2Nyb290L2Fib3V0X2RhLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi0NCi08aHRtbD4NCi08IS0tIA0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICAgIENvbnRyaWJ1dG9yczoNCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS0tPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ii8+DQotCTx0aXRsZT5PbTwvdGl0bGU+DQotPHNjcmlwdCBzcmM9InNjcmlwdHMvY29tbW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4NCi0JPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCi0JCWJvZHkgew0KLQkJCW1hcmdpbjogOHB4Ow0KLQkJfQ0KLQk8L3N0eWxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi0JPGltZyBzcmM9Ii4vaW1hZ2VzL2ljb25fYWJvdXQuZ2lmIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsdD0iT20taWtvbiIgYm9yZGVyPSIwIi8+PGJyIC8+PGJyIC8+DQotPHNwYW4gY2xhc3M9InBvcCI+T3BlblVQL0Jhc2ljPGJyIC8+DQotVmVyc2lvbiAxLjA8YnIgLz4NCi08YnIgLz4NCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi48YnIgLz4NCi1BbGwgUmlnaHRzIFJlc2VydmVkLjwvc3Bhbj48YnIgLz48YnIgLz4NCi0JPHRhYmxlIHN1bW1hcnk9IiIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPg0KLQkgIDx0cj4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjQiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSIyIiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxhIGNsYXNzPSJidXR0b24iIGhyZWY9ImphdmFzY3JpcHQ6c2VsZi5jbG9zZSgpOyI+PHNwYW4gY2xhc3M9ImJ1dHRvbnR4dCI+Jm5ic3A7THVrJm5ic3A7PC9zcGFuPjwvYT48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyIgIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQk8L3RhYmxlPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c19kYS5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfZGEuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NjU2Y2UuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c19kYS5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBqYXZhc2NyaXB0IGZvciB0aGUgYm9va21hcmtzIGZyYW1lICggdGhlIG9yeV90b2NfZnJhbWUgZnJhbWUpDQotLy8gdGhpcyBmcmFtZSBjb250YWlucyBhIGNoaWxkIGlmcmFtZSAob3J5X3RvYykNCi0NCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkDQotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLXZhciBib29rbWFya3ZpZXdzX2pzX01FU1NBR0UxID0gIlNpZGVuIGZpbmRlcyBpa2tlIGkgb3ZlcnNpZ3RlbiBtZWQgbmF2aWdhdGlvbnN0csOmc3RydWt0dXJlbi4iOw0KLQ0KLWZ1bmN0aW9uIGRpc3BsYXlUcmVlKHRhYikNCi17DQotCXVybCA9IHRhYi5nZXRBdHRyaWJ1dGUoJ3VybCcpOw0KLQ0KLQlpZiAoIHNlbGVjdGVkVGFiICE9IG51bGwgKQ0KLQl7DQotCQlzZWxlY3RlZFRhYi5jbGFzc05hbWUgPSAidGFiIg0KLQl9DQotCXRhYi5jbGFzc05hbWUgPSAic2VsZWN0ZWRUYWIiDQotCXNlbGVjdGVkVGFiID0gdGFiOw0KLQ0KLQlsb2FkSWZyYW1lKCJvcnlfdG9jIiwgdXJsKTsNCi19DQotDQotZnVuY3Rpb24gbG9hZElmcmFtZShpZnJhbWVOYW1lLCB1cmwpDQotew0KLQlpZiAoIHdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0gKQ0KLQl7DQotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLnRvY19sb2FkZWQgPSBmYWxzZTsNCi0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0ubG9jYXRpb24gPSB1cmw7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQllbHNlIHJldHVybiBmYWxzZTsNCi19DQotDQotZnVuY3Rpb24gc2hvd1BhZ2UoKQ0KLXsNCi0NCi0JcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmxvY2F0aW9uLmhyZWYgPSB1bmVzY2FwZSh0b3BpY1RvRGlzcGxheSk7DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIGZpbmQgYSB0b3BpYyBpbiB0aGUgdHJlZTogdGhlIHRvcGljIGlzIHNldCBpbiB0b3BpY1RvRGlzcGxheQ0KLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzDQotICovDQotZnVuY3Rpb24gZmluZFRvY1RvcGljKCkNCi17DQotCXZhciB0b2Nfd2luZG93ID0gd2luZG93LmZyYW1lc1sib3J5X3RvYyJdOw0KLQ0KLQkvL2FsZXJ0KHRvY193aW5kb3cudG9jX2xvYWRlZCk7DQotCS8vIGNoZWNrIGZvciBmYWxzZSBpcyBub3Qgc2FmZSBzaW5jZSB0aGUgdmFsdWUgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHRoZSBmcmFtZSBpcyBub3QgbG9hZGVkIHlldA0KLQkvL2lmICh0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gZmFsc2UgKQ0KLQlpZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCAhPSB0cnVlICkNCi0Jew0KLQkJLy9pZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSB1bmRlZmluZWQgKQ0KLQkJLy97DQotCQkvLwlhbGVydCgiZ290IGl0ISIpOw0KLQkJLy99DQotCQl3aW5kb3cuc2V0VGltZW91dCgiZmluZFRvY1RvcGljKCkiLCAyMDApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJaWYgKCB0b3BpY1RvRGlzcGxheSA9PSBudWxsICkNCi0JCXsNCi0JCQl0b3BpY1RvRGlzcGxheSA9IHRvY193aW5kb3cuZ2V0Rmlyc3RUb3BpY1VybCgpOw0KLQkJfQ0KLQkNCi0JCXZhciB0b3BpYyA9IHRvcGljVG9EaXNwbGF5Ow0KLQ0KLQkJLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdmlldywgaWYgbm90LCBsb29rIGZvciB0aGUgbmV4dCB2aWV3DQotCQlpZiAoIHRvY193aW5kb3cuc2VsZWN0VG9waWModG9waWMpID09IGZhbHNlICkNCi0JCXsNCi0JCQlpZiAoIGxvYWRpbmdUYWJJbmRleCA8IHZpZXdUYWJzLmxlbmd0aCAtMSApDQotCQkJew0KLQkJCQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXgrK10pOw0KLQkJCQlmaW5kVG9jVG9waWMoKTsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJLy8gZW5kIGZpbmRpbmcgYW5kIGdvdCBub3RoaW5nDQotCQkJCS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQNCi0JCQkJYWxlcnQoYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSk7DQotCQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJCXNob3dQYWdlKCk7DQotCQkJfQ0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJLy8gZmluZCBzdWNjZXNzZnVsLCBkaXNwbGF5IHRoZSB0b3BpYyBwYWdlDQotCQkJc2hvd1BhZ2UoKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0NCi0NCi0vLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB0YWINCi1mdW5jdGlvbiB3aGVyZUFtSSgpDQotew0KLQl2YXIgdXJsID0gcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmRvY3VtZW50LlVSTDsNCi0JDQotCWlmICggdXJsICE9IG51bGwgKQ0KLQl7DQotCQl0b3BpY1RvRGlzcGxheSA9IHVybDsNCi0JCWZpbmRUb2NUb3BpYygpOw0KLQl9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHRvZ1ZpZXdzKCkNCi17DQotCS8vIGlmIGN1cnJlbnRseSB2aXNpYmxlLCBoaWRlIGFsbCBleGNlcHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZA0KLQlpc1ZpZXdzVmlzaWJsZSA9ICghaXNWaWV3c1Zpc2libGUpOw0KLQkNCi0JZm9yICggdmFyIGkgPSAwOyAgaSA8IHZpZXdUYWJzLmxlbmd0aDsgaSsrKQ0KLQl7DQotCQl2YXIgc2hvdyA9IGlzVmlld3NWaXNpYmxlIHx8ICh2aWV3VGFic1tpXSA9PSBzZWxlY3RlZFRhYik7DQotCQlpZiAoIHNob3cgKQ0KLQkJewkJDQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOw0KLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsNCi0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJfQ0KLQl9DQotCQkNCi0JCQ0KLQ0KLX0NCi0NCi0NCi0vLyBkaXNwbGF5IHRoZSBkZWZhdWx0IHBhZ2UgYW5kIG5hdmlnYXRlIHRvIHRoZSBub2RlDQotLy8gaWYgbm8gZGVmYXVsdCBwYWdlIGlzIHNldCwgZGlzcGxheSB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgZmlyc3Qgdmlldw0KLWZ1bmN0aW9uIGluaXQoKQ0KLXsNCi0JbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JdmFyIHRhYnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpOw0KLQl2YXIgdGFiY291bnQgPSAwOw0KLQlmb3IgKHZhciBpPTA7IGk8dGFicy5sZW5ndGg7IGkrKykNCi0Jew0KLQkJaWYgKCB0YWJzW2ldLmdldEF0dHJpYnV0ZSgndXJsJykgIT0gbnVsbCApDQotCQl7CQkJDQotCQkJdmFyIGlzRGVmYXVsdFZpZXcgPSB0YWJzW2ldLmdldEF0dHJpYnV0ZSgnaXNEZWZhdWx0VmlldycpOw0KLQkJCWlmICggaXNEZWZhdWx0VmlldyA9PSAidHJ1ZSIgKQ0KLQkJCXsNCi0JCQkJbG9hZGluZ1RhYkluZGV4ID0gdGFiY291bnQ7DQotCQkJfQ0KLQkJCQ0KLQkJCXZpZXdUYWJzW3RhYmNvdW50KytdID0gdGFic1tpXTsNCi0JCX0NCi0JfQ0KLQ0KLQl0b3BpY1RvRGlzcGxheSA9IHBhcmVudC5nZXRDb29raWUoInJ1cF9vcnlfZG9jIik7DQotCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleF0pOw0KLQlmaW5kVG9jVG9waWMoKTsNCi19DQotDQotDQotdmFyIHNlbGVjdGVkVGFiID0gbnVsbDsNCi12YXIgdmlld1RhYnMgPSBuZXcgQXJyYXkoKTs7DQotdmFyIGxvYWRpbmdUYWJJbmRleCA9IDA7DQotdmFyIHRvcGljVG9EaXNwbGF5ID0gbnVsbDsNCi12YXIgaXNWaWV3c1Zpc2libGUgPSB0cnVlOw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfZGEuaHRtIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9kYS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NGUzMzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9kYS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy9EVEQgSFRNTCA0LjAxLy9FTiINCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KLTxIVE1MPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4NCi08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSI+DQotPHRpdGxlPk9yZGxpc3RlIC0gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yazwvdGl0bGU+DQotPC9oZWFkPg0KLTxmcmFtZXNldCByb3dzPSIyNSwqIj4NCi08ZnJhbWUgbmFtZT0iZ2xvc3NhcnlfbmF2IiBzcmM9Im5hdmlnLmh0bSIgc2Nyb2xsaW5nPSJubyIgbWFyZ2luaGVpZ2h0PSIyIiBtYXJnaW53aWR0aD0iMiIgdGl0bGU9Ik5hdmlnYXRpb25zb21yw6VkZSI+DQotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X2RvYyIgc3JjPSIuLi9nbG9zc2FyeS5odG0iIG1hcmdpbmhlaWdodD0iMCIgbWFyZ2lud2lkdGg9IjIiIHNjcm9sbGluZz0iYXV0byIgdGl0bGU9IkluZGhvbGRzb21yw6VkZSI+DQotPC9mcmFtZXNldD4NCi08L0hUTUw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfZGEuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9kYS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4YTYxMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9kYS5qcworKysgL2Rldi9udWxsCkBAIC0xLDc4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkDQotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLQ0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTEgPSAiRnVua3Rpb25lbiBUcmVlQnJvd3NlIGVyIGlra2UgaW5kbMOmc3QgZW5kbnUuXG5WZW50LiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMiA9ICJEZXIgZXIgaW5nZW4gJ3swfSctc2lkZSBmb3IgZGVubmUgc2lkZS5cblByw7h2IGVuIGFmIGRlIGFuZHJlIG5hdmlnYXRpb25za25hcHBlci4iOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTMgPSAiRGVyIGVyIGluZ2VuIHswfS1zaWRlLiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3ByZXYgPSAiZm9ycmlnZSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX25leHQgPSAibsOmc3RlIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0VfdXAgPSAib3AiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTQgPSAiRGVuIGFrdHVlbGxlIGZpbCBmaW5kZXMgaWtrZSBpIHRyw6ZzdHJ1a3R1cmJyb3dzZXJlbi4iOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTUgPSAiRGV0IHB1YmxpY2VyZWRlIHdlYnN0ZWQgZXIgYWxsZXJlZGUgdmlzdCBtZWQgcmFtbWVyIjsNCi0NCi1mdW5jdGlvbiBmb3JtYXRTdHJpbmcobWVzc2FnZSwgcmVwbGFjZTApDQotew0KLSAgIAlyZXR1cm4gbWVzc2FnZS5yZXBsYWNlKC9cezBcfS8sIHJlcGxhY2UwKTsNCi19IA0KLQ0KLS8vIHRoaXMgc2NyaXB0IGlzIGZvciB0aGUgdG9wbmF2Lmh0bWwNCi0vLyB0aGlzIGlzIE5PVCBmb3IgZ2VuZXJhbCB1c2UNCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0gIA0KLXZhciB0b3VyID0gMDsNCi0NCi1mdW5jdGlvbiBvcGVuRmlyc3RUb3VyICgpDQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQNCi17DQotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHRvdXIgPSBvcGVuKCIuL3RvdXIvdG91ci5odG0iLCJ0b3VyX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MzUwLGhlaWdodD03MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlblRvdXIgKCkNCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNA0KLXsNCi1pZighdG91ciB8fCB0b3VyPT1udWxsIHx8IHRvdXIuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi0vL0FkZGl0aW9uIGJ5IENoaW5oIFZvIDAzLzI4LzAwDQotIGZ1bmN0aW9uIGRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpDQotIHsNCi0gCXZhciBwYWdlUGF0dGVybiA9IC9vdnVfcHJvYy87DQotIAl2YXIgbWFpblBhZ2UgPSB3aW5kb3cucGFyZW50Lm9yeV9kb2MubG9jYXRpb247DQotDQotIAlpZiAoIHBhZ2VQYXR0ZXJuLnRlc3QoIG1haW5QYWdlICkgKSB7DQotICAgIAlpZiAoZ2V0Q29va2llKCJSVVAiKSAhPSAiY2hlY2tlZCIpIHsgb3BlbkZpcnN0VG91cigpOyB9DQotCX0NCi0JZWxzZSB7DQotCQlzZXRUaW1lb3V0KCAiZGlzcGxheUdldHRpbmdTdGFydGVkKCkiLCAxMDAwICk7DQotCX0NCi19DQotDQotZnVuY3Rpb24gZ2V0Q29va2llIChuYW1lKQ0KLXsNCi0gIHZhciBkY29va2llID0gZG9jdW1lbnQuY29va2llOw0KLSAgdmFyIGNuYW1lID0gbmFtZSArICI9IjsNCi0gIHZhciBjbGVuID0gZGNvb2tpZS5sZW5ndGg7DQotICB2YXIgY2JlZ2luID0gMDsNCi0gIHdoaWxlIChjYmVnaW4gPCBjbGVuKQ0KLSAgew0KLSAgICB2YXIgdmJlZ2luID0gY2JlZ2luICsgY25hbWUubGVuZ3RoOw0KLSAgICBpZiAoZGNvb2tpZS5zdWJzdHJpbmcoY2JlZ2luLCB2YmVnaW4pID09IGNuYW1lKQ0KLSAgICB7DQotICAgICAgdmFyIHZlbmQgPSBkY29va2llLmluZGV4T2YgKCI7IiwgdmJlZ2luKTsNCi0gICAgICBpZiAodmVuZCA9PSAtMSkNCi0gICAgICB7DQotICAgICAgICB2ZW5kID0gY2xlbjsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHVuZXNjYXBlKGRjb29raWUuc3Vic3RyaW5nKHZiZWdpbiwgdmVuZCkpOw0KLSAgICB9DQotICAgIGNiZWdpbiA9IGRjb29raWUuaW5kZXhPZigiICIsIGNiZWdpbikgKyAxOw0KLSAgICBpZiAoY2JlZ2luID09IDApDQotICAgIHsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIG51bGw7DQotIH0NCi0NCi0NCi0gIHZhciBpbmRleD1udWxsOw0KLSAgdmFyIHRvdXI9bnVsbDsNCi0gIHZhciBzZWFyY2g9bnVsbDsNCi0gIHZhciBnbG9zc2FyeT1udWxsOw0KLSAgdmFyIGZlZWRiYWNrPW51bGw7DQotICB2YXIgdHJlZUxvYWRlZD1mYWxzZTsNCi0gIGZ1bmN0aW9uIGNoZWNrVHJlZUxvYWRlZCgpDQotICB7DQotICAgIGlmKHRyZWVMb2FkZWQpDQotICAgIHsNCi0gICAgICByZXR1cm4gdHJlZUxvYWRlZDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgaWYocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0ICE9IG51bGwNCi0gICAgICAgICYmIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpDQotICAgICB7DQotICAgICAgIHRyZWVMb2FkZWQgPSB0cnVlOw0KLSAgICAgfQ0KLSAgICAgKi8NCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsKQ0KLSAgICAgew0KLSAgICAgIAl2YXIgbWV0aG9kID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5Ow0KLQkgaWYgKG1ldGhvZCAhPSAidW5kZWZpbmVkIikgew0KLQkJaWYgKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpDQotCQl7DQotICAgICAgIAkJCXRyZWVMb2FkZWQgPSB0cnVlOw0KLQkJfQ0KLQ0KLQkgIH0NCi0NCi0gICAgIH0NCi0NCi0gICAgIHJldHVybiB0cmVlTG9hZGVkOw0KLSAgIH0NCi0NCi0NCi0gICAgZnVuY3Rpb24gc2hvd0FsZXJ0Tm90TG9hZGVkKCkNCi0gICAgew0KLSAgICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFMSk7DQotICAgIH0NCi0NCi1mdW5jdGlvbiBzaG93U3RhdHVzTm90TG9hZGVkKCkNCi0gIHsNCi0gICAgLy9yZXR1cm4gIlRoZSBUcmVlQnJvd3NlIGlzIG5vdCB5ZXQgbG9hZGVkIVxuUGxlYXNlIHdhaXQhIjsNCi0gICAgcmV0dXJuIHRvcG5hdl9qc19NRVNTQUdFMTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dBbGVydE5vUGFnZSh0ZXh0KQ0KLSAgew0KLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpDQotICAgICB7DQotICAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucy4iKTsNCi0gICAgICAgICAgYWxlcnQoZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMiwgdGV4dCkpOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucyIpOw0KLSAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsNCi0gICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dTdGF0dXNOb1BhZ2UodGV4dCkNCi0gIHsNCi0NCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG1zZzsNCi0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7DQotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7DQotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsNCi0gICAgIH0NCi0NCi0gICAgIHJldHVybiBtc2c7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93UGFyZW50TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBwYXJlbnR1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotDQotICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgcGFyZW50dXJsIT0iIiAmJiBwYXJlbnR1cmwhPW51bGwpDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vUGFnZSgidXAiKTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93SG9tZUxhYmVsKCkNCi0gIHsNCi0gICAgc2VsZi5zdGF0dXMgPSAiSG9tZSI7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93UHJldmlvdXNMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgcHJldnVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHByZXZ1cmwhPSIiICYmIHByZXZ1cmwhPW51bGwpDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInByZXZpb3VzIik7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd05leHRMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBuZXh0dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgbmV4dHVybCE9IiIgJiYgbmV4dHVybCE9bnVsbCkNCi0gICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vUGFnZSgibmV4dCIpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUHJldmlvdXMoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLQ0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpDQotCXsNCi0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQ0KLQl7DQotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpDQotCXsNCi0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIlByZXZpb3VzIik7DQotCX0NCi0JICAgICAgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX3ByZXYpOw0KLSAgICAgfQ0KLSAgICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkTmV4dCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICB2YXIgbmV3TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLQ0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpDQotCXsNCi0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQ0KLQl7DQotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpDQotCXsNCi0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIk5leHQiKTsNCi0JfQ0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotDQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfbmV4dCk7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGxvYWRQYXJlbnQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV91cCk7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotZnVuY3Rpb24gd2hlcmVBbUkoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLQl2YXIgc3RhdHVzID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgCWlmKCBzdGF0dXMgPT0gZmFsc2UgKQ0KLQl7DQotCQlhbGVydCggdG9wbmF2X2pzX01FU1NBR0U0ICk7DQotCX0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gdXBBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnVwQXJyb3coKTsNCi0gICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gZG93bkFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZG93bkFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotDQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gbGVmdEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5sZWZ0QXJyb3coKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgICBmdW5jdGlvbiByaWdodEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5yaWdodEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIikNCi0gIHsNCi0gICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFNSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsNCi0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsNCi0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKw0KLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsNCi0NCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7DQotDQotICAgIGZvcihpPWRvY3VtZW50LmxpbmtzLmxlbmd0aC0xO2k+PTA7aS0tKQ0KLSAgICB7DQotICAgICAgIGlmKGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuaW5kZXhPZigiaW5kZXguaHRtIikhPS0xKQ0KLSAgICAgICB7DQotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZjsNCi0gICAgICAgICBicmVhazsNCi0gICAgICAgfQ0KLSAgICB9DQotDQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkNCi0gICAgew0KLQlpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApDQotCXsNCi0JCXdpbmRvdy5jbG9zZSgpOw0KLQkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBvcGVuT3J5IChwYWdlLCB0YXJnZXQpDQotew0KLSAgICBpZighaW5kZXggfHwgaW5kZXguY2xvc2VkKQ0KLSAgICB7DQotICAgICAgaW5kZXggPSBvcGVuKHBhZ2UsdGFyZ2V0LCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzk1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGluZGV4LmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlblNlYXJjaCgpDQotew0KLSAgICBpZighc2VhcmNoIHx8IHNlYXJjaC5jbG9zZWQpDQotICAgIHsNCi0gICAgICBzZWFyY2ggPSBvcGVuKCIuL2FwcGxldC9zZWFyY2guaHRtIiwic2VhcmNoX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz1ubyx3aWR0aD02MzAsaGVpZ2h0PTQ1MCxyZXNpemFibGU9eWVzIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2VhcmNoLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlbkluZGV4KCkNCi17DQotICAgb3Blbk9yeSgiLi9pbmRleC9pbmRleC5odG0iLCJpbmRleF93aW4iKTsNCi19DQotDQotZnVuY3Rpb24gb3Blbkdsb3NzYXJ5KCkNCi17DQotIGlmKCFnbG9zc2FyeSB8fCBnbG9zc2FyeS5jbG9zZWQpDQotICAgIHsNCi0gICAgICBnbG9zc2FyeSA9IG9wZW4oIi4vcHJvY2Vzcy9nbG9zc2FyeS9pbmRleC5odG0iLCJnbG9zc2FyeV93aW4iLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzg1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGdsb3NzYXJ5LmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gcHJpbnRQYWdlKCkNCi17DQotIHBhcmVudC5vcnlfZG9jLmZvY3VzKCk7DQotIHBhcmVudC5vcnlfZG9jLnByaW50KCk7DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHNlbmRGZWVkYmFjayh1cmwpDQotew0KLQlpZiAoIHVybCA9PSBudWxsIHx8IHVybCA9PSAnJyApDQotCXsNCi0JCXJldHVybjsNCi0JfQ0KLQkNCi0JaWYgKCB1cmwuaW5kZXhPZigibWFpbHRvOiIpID49IDAgKQ0KLQl7DQotCQlzZW5kbWFpbCh1cmwpOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJDQotIAkgICAgaWYoIWZlZWRiYWNrIHx8IGZlZWRiYWNrLmNsb3NlZCkNCi0JICAgIHsNCi0JICAgICAgZmVlZGJhY2sgPSBvcGVuKHVybCwiZmVlZGJhY2tfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTYwMCxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0JICAgIH0NCi0JICAgIGVsc2UNCi0JICAgIHsNCi0JICAgICAgZmVlZGJhY2suZm9jdXMoKTsNCi0JICAgIH0NCi0gICAgCX0NCi0gICAgCQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kbWFpbCh1cmwpDQotew0KLQlpZiAoIHVybC5pbmRleE9mKCI/c3ViamVjdCIpID09IC0xICkNCi0Jew0KLQkJdmFyIGxpbms9cGFyZW50Lm9yeV9kb2MubG9jYXRpb247DQotCQl1cmwgPSB1cmwgKyAnP3N1YmplY3Q9RmVlZGJhY2s6IC0gJytsaW5rOw0KLQl9DQotCWxvY2F0aW9uLnJlcGxhY2UodXJsKTsNCi19DQotDQotLy9jYWxjdWxhdGVzIHJlbGF0aXZlIHBhdGgNCi0vL3BhdGggbXVzdCBiZSBhbGwgcmVsYXRpdmUgZnJvbSB3ZWJzaXRlIGJhc2Ugb3IgY29udGFpbiBmdWxsIHVybHMNCi1mdW5jdGlvbiBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgoc291cmNlUGF0aCwgdGFyZ2V0UGF0aCkNCi17DQotCWlmICh0YXJnZXRQYXRoLmluZGV4T2YoImh0dHA6LyIpICE9IC0xKQ0KLQl7DQotCQlyZXR1cm4gdGFyZ2V0UGF0aDsNCi0JfQ0KLQ0KLQkvL3JlcGxhY2UgYWxsICdcJyB3aXRoICcvJw0KLQlzb3VyY2VQYXRoID0gc291cmNlUGF0aC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQl0YXJnZXRQYXRoID0gdGFyZ2V0UGF0aC5yZXBsYWNlKC9cXC9nLCIvIik7DQotDQotCS8vYWxlcnQoIlJlcGxhY2UoU291cmNlKT0+IiArIHNvdXJjZVBhdGgpOw0KLQkvL2FsZXJ0KCJSZXBsYWNlKHRhcmdldCk9PiIgKyB0YXJnZXRQYXRoKTsNCi0NCi0NCi0Jc291cmNlQXJyYXkgPSBzb3VyY2VQYXRoLnNwbGl0KCIvIik7DQotCXRhcmdldEFycmF5ID0gdGFyZ2V0UGF0aC5zcGxpdCgiLyIpOw0KLQ0KLQl2YXIgdGhlUmVsUGF0aCA9ICIiOw0KLQ0KLQkvL2xvb3AgdW50aWwgd2UgZmluZCBhIGRpZmZlcmVuY2UNCi0JdmFyIGlkeCA9IDA7DQotCWZvcihpZHggPSAwOyBpZHggPCBzb3VyY2VBcnJheS5sZW5ndGg7IGlkeCsrKQ0KLQl7DQotCQlpZiAoaWR4ID4gdGFyZ2V0UGF0aC5sZW5ndGgpDQotCQl7DQotCQkJYnJlYWs7DQotCQl9DQotDQotCQlpZiAoc291cmNlQXJyYXlbaWR4XSAhPSB0YXJnZXRBcnJheVtpZHhdKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQl9DQotDQotCS8vYXBwZW5kIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgLi8NCi0JdmFyIG1heElkeCA9IHNvdXJjZUFycmF5Lmxlbmd0aCAtIDE7DQotCWZvciAodmFyIGkgPSBpZHg7IGkgPCBtYXhJZHg7IGkrKykNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyAiLi8iOw0KLQ0KLQkJLy9hbGVydCgiUmVsUGF0aD0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vYXBwZW5kIGFueSByZW1haW5pbmcgdGFyZ2V0IHBhdGgNCi0Jd2hpbGUoaWR4IDwgdGFyZ2V0QXJyYXkubGVuZ3RoKQ0KLQl7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aCArIHRhcmdldEFycmF5W2lkeCsrXSArICIvIjsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoZmluYWwpPT4iICsgdGhlUmVsUGF0aCk7DQotCX0NCi0NCi0JLy9yZW1vdmUgdGhlIGxhc3QgcGF0aCBzZXBhcmF0b3INCi0JaWYgKHRoZVJlbFBhdGgubGVuZ3RoID4gMCkNCi0Jew0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoLnN1YnN0cmluZygwLCAodGhlUmVsUGF0aC5sZW5ndGggLSAxKSk7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKFRyaW0xKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vYWxlcnQoIlJldHVybiBSZWxhdGl2ZSBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0NCi0JcmV0dXJuIHRoZVJlbFBhdGg7DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldFRyZWVQYXRoKCkNCi17DQotCXJldHVybiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKTsNCi19DQotDQotLy9UaGlzIG1ldGhvZCB3aWxsIHJlbW92ZSB0aGUgd2Vic2l0ZSBiYXNlIGZyb20gdGhlIHVybA0KLWZ1bmN0aW9uIGNhbGN1bGF0Q3VycmVudFBhZ2UoY3VyclVSTCkgew0KLQ0KLQl2YXIgdGhlQ3VycmVudExvY2F0aW9uID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0JdGhlQ3VycmVudExvY2F0aW9uID0gdGhlQ3VycmVudExvY2F0aW9uLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotCWN1cnJVUkwgPSBjdXJyVVJMLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotDQotCXZhciBzb3VyY2VBcnJheSA9IHRoZUN1cnJlbnRMb2NhdGlvbi5zcGxpdCgiLyIpOw0KLQl2YXIgY3VyckFycmF5ID0gY3VyclVSTC5zcGxpdCgiLyIpOw0KLQ0KLQl2YXIgbnVtVG9SZW1vdmUgPSBzb3VyY2VBcnJheS5sZW5ndGggLSAyOw0KLQl2YXIgaWR4ID0gMDsNCi0JdmFyIHRoZVJldHVyblBhdGggPSAiIjsNCi0JZm9yIChpZHggPSBudW1Ub1JlbW92ZTsgaWR4IDwgY3VyckFycmF5Lmxlbmd0aDsgaWR4KyspIHsNCi0JCWlmICh0aGVSZXR1cm5QYXRoICE9ICIiKSB7DQotCQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyAiLyI7DQotCQl9DQotCQl0aGVSZXR1cm5QYXRoID0gdGhlUmV0dXJuUGF0aCArIGN1cnJBcnJheVtpZHhdOw0KLQl9DQotDQotCS8vYWxlcnQoIkFycmF5VGVzdD0+IiArIGN1cnJVUkwgKyAiLCIgKyB0aGVSZXR1cm5QYXRoKTsNCi0JcmV0dXJuIHRoZVJldHVyblBhdGg7DQotfQ0KLQ0KLS8vYnVpbGRzIHRyZWUgcGF0aA0KLWZ1bmN0aW9uIGJ1aWxkVHJlZVBhdGhMb2NhdGlvbigpDQotew0KLQl2YXIgdGhlRGVsaW1pdGVyID0gIiMjKiI7DQotCXZhciB0aGlzUGFnZSA9ICJhcHBsZXQvcnVwX3RvcG5hdi5odG0iOw0KLQl2YXIgdGhlTG9jID0gIiI7DQotDQotDQotDQotCWlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLQl7DQotCQl2YXIgdGhlQ3VycmVudExvY2F0aW9uID0gcGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCi0JCXRoaXNQYWdlID0gY2FsY3VsYXRDdXJyZW50UGFnZSh0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJLy9hbGVydCgiUGF0aE5hbWU6IiArIHRoaXNQYWdlKTsNCi0NCi0JCS8vYWxlcnQoIlRyeWluZyB0byBmaW5kIHRoZSBwYXRoIGZvciA9PiIgKyB0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJdmFyIHRoZVBhdGggPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuZ2V0VHJlZVBhdGhBcnJheSh0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJLy9hbGVydCgiVGhlIFRyZWUgUGF0aDogIiArIHRoZVBhdGgpOw0KLQ0KLQkJdGhlUGF0aFN0cmluZyA9IHRoZVBhdGggKyAiIjsNCi0gICAgCQlhcnJheUZyb21TdHJpbmcgPSB0aGVQYXRoU3RyaW5nLnNwbGl0KHRoZURlbGltaXRlcik7DQotDQotCQkvL2J1aWxkIHRoZSBwYXRoIGZyb20gdGhlIGFycmF5DQotCQkvL3BhcmFtIDEgPSBwYXRoIHRvIGljb24sIHBhcmFtIDIgLSBsYWJlbCwgcGFyYW0gMyAtIHBhdGggdG8gZmlsZQ0KLQkJdmFyIGNvdW50ZXIgPSAwOw0KLQkJdmFyIHRoZUxhYmVsOw0KLQkJdmFyIHRoZVJlbFBhdGg7DQotCQlpZiAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCA+IDIpDQotCQl7DQotCQkgICB0aGVMb2MgPSAiIjsNCi0JCSAgIGZvcih2YXIgaSA9IDA7IGkgPCAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCAtIDEpIDsgaSsrKQ0KLQkJICAgew0KLQkJCS8vaXQncyB0aGUgaWNvbiBwYXRoDQotCQkJaWYgKGNvdW50ZXIgPCAyKQ0KLQkJCXsNCi0JCQkJaWYgKGNvdW50ZXIgPiAwKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKyAiICZndDsgIjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMSkgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0NCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCJcXCIpID09IC0xICYmIGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCIvIikgPT0gLTEpDQotCQkJCXsNCi0JCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0gIT0gIm51bGwiKQ0KLQkJCQkJew0KLQkJCQkJCXRoZVJlbFBhdGggPSAiYXBwbGV0L2ltYWdlcy8iICsgYXJyYXlGcm9tU3RyaW5nW2ldOw0KLQkJCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIHRoZVJlbFBhdGgpOw0KLQkJCQkJfQ0KLQkJCQkJLy9hbGVydCgiTW9kaWZ5aW5nIFBhdGggPT4gIiArIHRoZVJlbFBhdGgpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJfQ0KLQ0KLQkJCQlpZiAodGhlUmVsUGF0aCAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkJICI8aW1nIGJvcmRlcj0wIHNyYz1cIiIgKw0KLQkJCQkJCSB0aGVSZWxQYXRoICArDQotCQkJCQkJICJcIj4iOw0KLQkJCQl9DQotDQotCQkJCS8vYWxlcnQoInRoZSBjdXJyIHBhdGg9PiIgKyB0aGVMb2MpOw0KLQkJCQljb3VudGVyID0gMjsNCi0JCQl9DQotCQkJLy8gaXQncyB0aGUgbGFiZWwNCi0JCQllbHNlIGlmIChjb3VudGVyID09IDIpDQotCQkJew0KLQkJCQl0aGVMYWJlbCA9IGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJY291bnRlciA9IDM7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKGNvdW50ZXIgPT0gMykNCi0JCQl7DQotCQkJCS8vYWxlcnQoIkNhbGN1bGF0aW5nIHBhdGggZnJvbSgzKSAiICsgdGhpc1BhZ2UgKyAiID0+ICIgKyBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJew0KLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJCWlmICh0aGVSZWxQYXRoICE9ICIiKSB7DQotCQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIiB0YXJnZXQ9XCJvcnlfZG9jXCIgaHJlZj1cIiIgKw0KLQkJCQkJCQkgdGhlUmVsUGF0aCArDQotCQkJCQkgCQkiXCI+IiArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQkJIGVsc2Ugew0KLQkJCQkJIAl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJCXRoZUxhYmVsICsNCi0JCQkJCSAJCSI8XC9hPlxuIjsNCi0JCQkJCSB9DQotCQkJCX0NCi0JCQkJZWxzZQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkiPGEgY2xhc3M9XCJob3R0ZXh0XCI+IiAgKw0KLQkJCQkJIAl0aGVMYWJlbCArDQotCQkJCQkgCSI8XC9hPlxuIjsNCi0JCQkJfQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDE7DQotCQkJCXRoZVJlbFBhdGggPSAibnVsbCI7DQotCQkJCXRoZUxhYmVsID0gIm51bGwiOw0KLQkJCX0NCi0JCSAgIH0NCi0NCi0JCS8vYWxlcnQoIkZpbmlzaGVkIEJ1aWxkaW5nID0+ICIgKyB0aGVMb2MpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCS8vdGhlTG9jID0gIkN1cnJlbnQgTG9jYXRpb24mbmJzcDsmIzA0NTsmbmJzcDsiICsgdGhlTG9jOw0KLQ0KLQkvL2FsZXJ0KCJ0aGUgRmluYWwgU3RyaW5nPT4iICsgdGhlTG9jKTsNCi0NCi0JLy9kb2N1bWVudC53cml0ZSh0aGVMb2MpOw0KLQlyZXR1cm4gdGhlTG9jOw0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvZG9jcm9vdC9zcHNjcmVlbl9kYS5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvZG9jcm9vdC9zcHNjcmVlbl9kYS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhY2I4OTMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2RvY3Jvb3Qvc3BzY3JlZW5fZGEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLQotPCEtLSBSUFcgTUVUQSBEQVRBIFNUQVJUIC0tCi0gCi0gCi0tLSBSUFcgTUVUQSBEQVRBIEVORCAtLT4KLQotPGh0bWw+Ci0KLTxoZWFkPgotPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJyb3AuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiLz4KLTx0aXRsZT7DhWJuaW5nc3Nrw6ZybWJpbGxlZGU8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotCi0KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTxoMiBhbGlnbj0iY2VudGVyIj5WZW50LCBtZW5zIHRyw6ZzdHJ1a3R1cmJyb3dzZXJlbiBpbmRsw6ZzZXMuLi48YnIvPjwvaDI+Ci08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08IS0tIAotPHAgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9ImltYWdlcy9zcGxhc2guZ2lmIiBhbHQ9IlZlbGtvbW1lbiB0aWwgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayIvPjwvcD4KLS0tPgotPGJyLz4KLTxici8+Ci0KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmNiNjRmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIENvbXBvc2VyIFB1Ymxpc2hpbmcgKE5MMmEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzNiYWQ0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gcHVibGljZXJpbmcNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4NTRmYy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQUDAwMDBFIC0gSVVQUDAwOTlFDQotIw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZT1QdWJsaWNlcmVyIGtvbmZpZ3VyYXRpb25lbi4uLg0KLWluaXRpYWxpemluZ0RpclRhc2tfbmFtZT1Jbml0aWFsaXNlcmVyIGRlc3RpbmF0aW9uc2JpYmxpb3Rlay4uLg0KLWNvcHlpbmdGaWxlc1Rhc2tfbmFtZT1Lb3BpZXJlciBmaWxlci4uLg0KLWdlbmVyYXRpbmdCb29rbWFya3NUYXNrX25hbWU9R2VuZXJlcmVyIGJvZ21cdTAwZTZya2VyLi4uDQotZ2VuZXJhdGluZ0Jvb2ttYXJrVGFza19uYW1lPUdlbmVyZXJlciBib2dtXHUwMGU2cmtldCAnJ3swfScnLi4uDQotZ2VuZXJhdGluZ0Jvb2ttYXJrSW5kZXhUYXNrX25hbWU9R2VuZXJlcmVyIGJvZ21cdTAwZTZya2VpbmRla3MuLi4NCi1wdWJsaXNoaW5nTGlua2VkRWxlbWVudFRhc2tfbmFtZT1QdWJsaWNlcmVyIG1ldG9kZWVsZW1lbnRlcjogezB9IHB1YmxpY2VyZXQsIHsxfSBtYW5nbGVyDQotcHVibGlzaGluZ0VsZW1lbnRUYXNrX25hbWU9UHVibGljZXJlciBtZXRvZGVlbGVtZW50OiB7MH06ezF9DQotZ2VuZXJhdGluZ0dsb3NzYXJ5VGFza19uYW1lPUdlbmVyZXJlciBvcmRsaXN0ZS4uLg0KLWdlbmVyYXRpbmdTZWFyY2hJbmRleFRhc2tfbmFtZT1HZW5lcmVyZXIgc1x1MDBmOGdlaW5kZWtzLi4uDQotYnVpbGRpbmdQcm9jZXNzQ2xvc3VyZVRhc2tfbmFtZT1CeWdnZXIgcHJvY2VzYWZzbHV0bmluZy4uLg0KLWJ1aWxkaW5nRWxlbWVudENsb3N1cmVUYXNrX25hbWU9QnlnZ2VyIGVsZW1lbnRhZnNsdXRuaW5nIGZvciAnJ3swfScnLi4uDQotbG9hZExpYnJhcnlUYXNrX25hbWU9SW5kbFx1MDBlNnNlciBiaWJsaW90ZWtzaW5kaG9sZC4uLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMgbG9nZ2VkIGluIHRoZSBQdWJsaXNoaW5nIFJlcG9ydA0KLXB1Ymxpc2hFbGVtZW50RXJyb3JfbXNnPUlVUFAwMDAwRTogRmVqbCB1bmRlciBwdWJsaWNlcmluZyBhZiBlbGVtZW50OiB7MH0NCi1zZXJ2ZXJFcnJvcl9tc2c9SVVQUDAwMDFFOiBJbmdlbiBkYXRhIHJldHVybmVyZXQgZnJhIHNlcnZlci4NCi1pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnPUlVUFAwMDAyRTogVWd5bGRpZ3Qgc3ZhciBmcmEgaHR0cDovL3swfTp7MX06ezJ9DQotDQotIyBXYXJuaW5nIE1lc3NhZ2VzIGxvZ2dlZCBpbiB0aGUgUHVibGlzaGluZyBSZXBvcnQNCi1pbnZhbGlkRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDAzVzogRWxlbWVudCBlciBpa2tlIHB1YmxpY2VyZXQsIGZvcmRpIGRldCBpa2tlIGVyIGV0IGd5bGRpZ3QgZWxlbWVudCBpIGtvbmZpZ3VyYXRpb25lbi4NCi1pbnZhbGlkTWV0aG9kRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDA0VzogRWxlbWVudCBlciBpa2tlIHB1YmxpY2VyZXQsIGZvcmRpIGRldCBpa2tlIGVyIGV0IG1ldG9kZWVsZW1lbnQ6IHswfQ0KLWNvcHlGaWxlV2FybmluZ19tc2c9SVVQUDAwMDVXOiBLYW4gaWtrZSBrb3BpZXJlIGZpbCBmcmEgJyd7MH0nJyB0aWwgJyd7MX0nJy4NCi1taXNzaW5nSWNvbkZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNlc6IE5vZGVpa29uZmlsZW4gJyd7MH0nJyBmaW5kZXMgaWtrZS4NCi1taXNzaW5nSWNvbk5hbWVXYXJuaW5nX21zZz1JVVBQMDAwN1c6IEthbiBpa2tlIGhlbnRlIG5hdm5ldCBwXHUwMGU1IG5vZGVpa29uZW4uDQotZXh0ZXJuYWxVcmxfbXNnPXJlZmVyZXJlciB0aWwgZWtzdGVybiBVUkw6IHswfQ0KLWRpc2NhcmVkQ2F0ZWdvcnlXYXJuaW5nX21zZz1Ub210IGluZGhvbGRza2F0ZWdvcmllbGVtZW50IGVyIGlra2UgcHVibGljZXJldC4NCi0NCi0jIEVycm9yIERldGFpbHMNCi1jcmVhdGVTZWFyY2hJbmRleEVycm9yX21zZz1JVVBQMDAwOEU6IFNcdTAwZjhnZWluZGVrc2ZpbGVuIGVyIGlra2Ugb3ByZXR0ZXQuDQotDQotIyBQcm9jZXNzIFRyZWUgTm9kZXMNCi1yZWZlcmVuY2VXb3JrZmxvd3NOb2RlX3RleHQ9UmVmZXJlbmNlYXJiZWpkc2dhbmdlDQotdGFza05vZGVfdGV4dD1PcGdhdmVyDQotcHJpbWFyaWx5UGVyZm9ybXNOb2RlX3RleHQ9VWRmXHUwMGY4cmVyIHByaW1cdTAwZTZydA0KLWFkZGl0aW9uYWxseVBlcmZvcm1zTm9kZV90ZXh0PVVkZlx1MDBmOHJlciB5ZGVybGlnZXJlDQotcGVyZm9ybWluZ1JvbGVzTm9kZV90ZXh0PVVkZlx1MDBmOHJlbmRlIHJvbGxlcg0KLWlucHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PUlucHV0YXJiZWpkc3Byb2R1a3Rlcg0KLW91dHB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dD1PdXRwdXRhcmJlamRzcHJvZHVrdGVyDQotcmVzcG9uc2libGVGb3JOb2RlX3RleHQ9QW5zdmFybGlnIGZvcg0KLW1vZGlmaWVzTm9kZV90ZXh0PVx1MDBjNm5kcmVyDQotcmVzcG9uc2libGVSb2xlTm9kZV90ZXh0PUFuc3ZhcmxpZyByb2xsZQ0KLWNvbnRhaW5pbmdXb3JrUHJvZHVjdE5vZGVfdGV4dD1JbmRlaG9sZGVyIGFyYmVqZHNwcm9kdWt0DQotY29udGFpbmVkV29ya1Byb2R1Y3RzTm9kZV90ZXh0PUluZGVob2xkdGUgYXJiZWpkc3Byb2R1a3Rlcg0KLWd1aWRhbmNlTm9kZV90ZXh0PVZlamxlZG5pbmcNCi1pbnB1dFRvTm9kZV90ZXh0PUlucHV0IHRpbA0KLW91dHB1dEZyb21Ob2RlX3RleHQ9T3V0cHV0IGZyYQ0KLQ0KLSMgSFRNTCBUaXRsZSBmb3IgSW5kZXggUGFnZQ0KLWluZGV4TGFiZWxfdGV4dD1JbmRla3MNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEveHNsL3Jlc291cmNlc19kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL3hzbC9yZXNvdXJjZXNfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkwZTk0OC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEveHNsL3Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLXNlbGVjdGVkQ29uZmlndXJhdGlvblRleHQ9RGVuIHZhbGd0ZSBrb25maWd1cmF0aW9uIHB1YmxpY2VyZXMgdGlsIGZcdTAwZjhsZ2VuZGUgcGxhY2VyaW5nDQotZGV0YWlsSW5mb1RleHQ9RGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgcmVnaXN0cmVyZXMgaSBmXHUwMGY4bGdlbmRlIGZpbGVyIGkgZm9sZGVyZW4gbG9ncw0KLXNob3dFcnJvclRleHQ9dmlzIGFsbGUgZmVqbCwgZGVyIGVyIG9wc3RcdTAwZTVldCB1bmRlciBwdWJsaWNlcmluZy4NCi1sb2dzV2FybmluZ1RleHQ9cmVnaXN0cmVyZXIgYWxsZSBhZHZhcnNsZXIsIGYuZWtzLiBtYW5nbGVuZGUgcmVmZXJlbmNlciwgYnJ1ZHRlIGxpbmsgb2cgdXB1YmxpY2VyZWRlIGthdGVnb3JpZXIgdWRlbiBrYXRlZ29yaXNlcmVkZSBlbGVtZW50ZXIuDQotcGFnZXNOb3RJbnN0YWxsZWRUZXh0PUFsbGUgZGUgbWFuZ2xlZGUgcmVmZXJlbmNlciBpIGRlbm5lIGtvbmZpZ3VyYXRpb24gZmluZGVzIGkgZm9sZGVyZW4gcGFnZXNfbm90X2luc3RhbGxlZC4NCi1pbnZhbGlkRXh0ZXJuYWxUZXh0PVVneWxkaWdlIGVrc3Rlcm5lIGxpbmsgaSBrb25maWd1cmF0aW9uZW4NCi1vd25lckVsZW1lbnRUZXh0PUVqZXJlbGVtZW50DQotbm9uRXhpc3RpbmdUZXh0PUVqZXJlbGVtZW50ZXJuZSByZWZlcmVyZXIgdGlsIGlra2UtZWtzaXN0ZXJlbmRlIGVsZW1lbnRlci4gRWxlbWVudGVybmUgZXIgbXVsaWd2aXMgc2xldHRldCBmcmEgYmlibGlvdGVrZXQsIGVmdGVyIGF0IGVsZW1lbnRsaW5rZW5lIGJsZXYgb3ByZXR0ZXQuIEZpbmQgZWplcmVsZW1lbnRlcm5lLCBvZyByZXQgZGUgdWd5bGRpZ2UgcmVmZXJlbmNlci4NCi1taXNzaW5nUmVmZXJlbmNlc1RpdGxlVGV4dD1SZWZlcmVuY2VyIG1hbmdsZXINCi1taXNzaW5nUmVmZXJlbmNlc1RleHQ9RWplcmVsZW1lbnRlcm5lIHJlZmVyZXJlciB0aWwgbWFuZ2xlbmRlIGVsZW1lbnRlciBpIGRlbiB2YWxndGUga29uZmlndXJhdGlvbi4gS29udHJvbGxcdTAwZTlyIGtvbmZpZ3VyYXRpb25zYWZzbHV0bmluZ2VuLCBvZyByZXQgZGUgbWFuZ2xlbmRlIHJlZmVyZW5jZXIuICAgICAgICAgICAgICAgICAgDQotbWlzc2luZ1Jlc291cmNlRmlsZXNUaXRsZVRleHQ9UmVzc291cmNlZmlsZXIgbWFuZ2xlcg0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGV4dD1FamVyZWxlbWVudGVybmUgcmVmZXJlcmVyIHRpbCBtYW5nbGVuZGUgcmVzc291cmNlZmlsZXIuIERlciBlciByZWZlcmVyZXQgdGlsIGRpc3NlIHJlc3NvdXJjZWZpbGVyIGkgZWxlbWVudGV0cyBpbmRob2xkIGVsbGVyIGkgZGUgdGlsa255dHRlZGUgdmVkaFx1MDBlNmZ0bmluZ2VyLg0KLW1pc3NpbmdSZXNvdXJjZVRleHQ9UmVzc291cmNlIG1hbmdsZXINCi1vd25lclJlc291cmNlVGV4dD1FamVycmVzc291cmNlDQotbWlzc2luZ0VsZW1lbnRUZXh0PUVsZW1lbnQgbWFuZ2xlcg0KLWludmFsaWRFbGVtZW50VGV4dD1VZ3lsZGlndCBlbGVtZW50DQotaW52YWxpZEVsZW1lbnRMaW5rc1RleHQ9VWd5bGRpZ2UgZWxlbWVudGxpbmsNCi1wbGVhc2VDaGVja1RleHQ9S29udHJvbGxcdTAwZTlyIGtvbmZpZ3VyYXRpb25zYWZzbHV0bmluZ2VuLCBvZyByZXQgZGUgbWFuZ2xlbmRlIHJlZmVyZW5jZXIuDQotcGxlYXNlRmluZFRleHQ9RmluZCBlamVyZWxlbWVudGVybmUsIG9nIHJldCBkZSB1Z3lsZGlnZSByZWZlcmVuY2VyLg0KLWdsb3NzYXJ5VGV4dD1PcmRsaXN0ZQ0KLWluZGV4VGV4dD1JbmRla3MNCi1mZWVkYmFja1RleHQ9VGlsYmFnZW1lbGRpbmcNCi1hYm91dFRleHQ9T20NCi1zZWFyY2hUZXh0PVNcdTAwZjhnDQotcHJpbnRUZXh0PVVkc2tyaXYNCi1zdW1tYXJ5VGV4dD1PdmVyc2lndA0KLXB1Ymxpc2hpbmdSZXBvcnRUZXh0PVB1YmxpY2VyaW5nc3JhcHBvcnQ6DQotd2hlcmVBbUlUZXh0PUh2b3IgZXIgamVnDQotdHJlZVNldHNUZXh0PVRyXHUwMGU2c3RydWt0dXJzXHUwMGU2dA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDY2MjBkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NTg2NzMyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgUHVibGlzaGluZyBVSSAoTkwxKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlN2IwMTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2MTFmZDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIEJlbnV0emVyc2Nobml0dHN0ZWxsZSBmXHUwMGZjciBWZXJcdTAwZjZmZmVudGxpY2h1bmcNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIERlZmF1bHQgZmVlZGJhY2sgVVJMDQotZmVlZGJhY2tVUkw9aHR0cDovL3d3dy5wdWJsaXNoZWRfd2Vic2l0ZS5jb20vZmVlZGJhY2sNCi0NCi0jIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wdWJsaXNoQ29uZmlnQWN0aW9uPSZWZXJcdTAwZjZmZmVudGxpY2hlbi4uLg0KLXB1Ymxpc2hDb25maWdBY3Rpb25Ub29sdGlwPUVpbmUgV2Vic2l0ZSBmXHUwMGZjciBlaW5lIEtvbmZpZ3VyYXRpb24gdmVyXHUwMGY2ZmZlbnRsaWNoZW4NCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLXB1Ymxpc2hpbmdPcHRpb25zPVZlclx1MDBmNmZmZW50bGljaHVuZ3NvcHRpb25lbg0KLQ0KLSMgUHVibGlzaGluZyBBY3Rpb25zDQotY29uZmlnQWN0aW9uU2V0PUtvbmZpZ3VyYXRpb24NCi1jb25maWdNZW51PSZLb25maWd1cmF0aW9uDQotDQotIyBQcmludCBDb25maWd1cmF0aW9uIEFjdGlvbg0KLXByaW50Q29uZmlnQWN0aW9uPURydWNrZW4NCi0NCi0jIHRoZSB0aXRsZSBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlDQotI2Rvbid0IGRlZmluZSBoZXJlLCBsZXQgdXNlciBzcGVjaWZ5IGl0Lg0KLSN0aXRsZT1PcGVuVVAvQmFzaWMNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IFB1Ymxpc2ggUGF0aA0KLXB1Ymxpc2hQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vUHVibGlzaA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU2NjljNmMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVVJIGRlIHB1YmxpY2FjaVx1MDBmM24gZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBEZWZhdWx0IGZlZWRiYWNrIFVSTA0KLWZlZWRiYWNrVVJMPWh0dHA6Ly93d3cucHVibGlzaGVkX3dlYnNpdGUuY29tL2ZlZWRiYWNrDQotDQotIyBQdWJsaXNoIENvbmZpZ3VyYXRpb24gQWN0aW9uDQotcHVibGlzaENvbmZpZ0FjdGlvbj0mUHVibGljYXIuLi4NCi1wdWJsaXNoQ29uZmlnQWN0aW9uVG9vbHRpcD1QdWJsaWNhciB1biBzaXRpbyB3ZWIgcGFyYSB1bmEgY29uZmlndXJhY2lcdTAwZjNuDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1wdWJsaXNoaW5nT3B0aW9ucz1PcGNpb25lcyBkZSBwdWJsaWNhY2lcdTAwZjNuDQotDQotIyBQdWJsaXNoaW5nIEFjdGlvbnMNCi1jb25maWdBY3Rpb25TZXQ9Q29uZmlndXJhY2lcdTAwZjNuDQotY29uZmlnTWVudT0mQ29uZmlndXJhY2lcdTAwZjNuDQotDQotIyBQcmludCBDb25maWd1cmF0aW9uIEFjdGlvbg0KLXByaW50Q29uZmlnQWN0aW9uPUltcHJpbWlyDQotDQotIyB0aGUgdGl0bGUgZm9yIHRoZSBwdWJsaXNoZWQgc2l0ZQ0KLSNkb24ndCBkZWZpbmUgaGVyZSwgbGV0IHVzZXIgc3BlY2lmeSBpdC4NCi0jdGl0bGU9T3BlblVQL0Jhc2ljDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgRGVmYXVsdCBQdWJsaXNoIFBhdGgNCi1wdWJsaXNoUGF0aD08dXNlci5ob21lPi88YXBwLm5hbWU+L1B1Ymxpc2gNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMWQ0MGI1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1JbnRlcmZhY2UgdXRpbGlzYXRldXIgZGUgcHVibGljYXRpb24gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBEZWZhdWx0IGZlZWRiYWNrIFVSTA0KLWZlZWRiYWNrVVJMPWh0dHA6Ly93d3cucHVibGlzaGVkX3dlYnNpdGUuY29tL2ZlZWRiYWNrDQotDQotIyBQdWJsaXNoIENvbmZpZ3VyYXRpb24gQWN0aW9uDQotcHVibGlzaENvbmZpZ0FjdGlvbj0mUHVibGllci4uLg0KLXB1Ymxpc2hDb25maWdBY3Rpb25Ub29sdGlwPVB1YmxpZXIgdW4gc2l0ZSBXZWIgcG91ciB1bmUgY29uZmlndXJhdGlvbg0KLQ0KLSMgUHJlZmVyZW5jZSBQYWdlDQotcHVibGlzaGluZ09wdGlvbnM9T3B0aW9ucyBkZSBwdWJsaWNhdGlvbg0KLQ0KLSMgUHVibGlzaGluZyBBY3Rpb25zDQotY29uZmlnQWN0aW9uU2V0PUNvbmZpZ3VyYXRpb24NCi1jb25maWdNZW51PSZDb25maWd1cmF0aW9uDQotDQotIyBQcmludCBDb25maWd1cmF0aW9uIEFjdGlvbg0KLXByaW50Q29uZmlnQWN0aW9uPUltcHJpbWVyDQotDQotIyB0aGUgdGl0bGUgZm9yIHRoZSBwdWJsaXNoZWQgc2l0ZQ0KLSNkb24ndCBkZWZpbmUgaGVyZSwgbGV0IHVzZXIgc3BlY2lmeSBpdC4NCi0jdGl0bGU9T3BlblVQL0Jhc2ljDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgRGVmYXVsdCBQdWJsaXNoIFBhdGgNCi1wdWJsaXNoUGF0aD08dXNlci5ob21lPi88YXBwLm5hbWU+L1B1Ymxpc2gNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZjZiMWRlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1VSSBwdWJibGljYXppb25lIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgRGVmYXVsdCBmZWVkYmFjayBVUkwNCi1mZWVkYmFja1VSTD1odHRwOi8vd3d3LnB1Ymxpc2hlZF93ZWJzaXRlLmNvbS9mZWVkYmFjaw0KLQ0KLSMgUHVibGlzaCBDb25maWd1cmF0aW9uIEFjdGlvbg0KLXB1Ymxpc2hDb25maWdBY3Rpb249JlB1YmJsaWNhLi4uDQotcHVibGlzaENvbmZpZ0FjdGlvblRvb2x0aXA9UHViYmxpY2EgdW4gc2l0byBXZWIgcGVyIHVuYSBjb25maWd1cmF6aW9uZQ0KLQ0KLSMgUHJlZmVyZW5jZSBQYWdlDQotcHVibGlzaGluZ09wdGlvbnM9T3B6aW9uaSBkaSBwdWJibGljYXppb25lDQotDQotIyBQdWJsaXNoaW5nIEFjdGlvbnMNCi1jb25maWdBY3Rpb25TZXQ9Q29uZmlndXJhemlvbmUNCi1jb25maWdNZW51PSZDb25maWd1cmF6aW9uZQ0KLQ0KLSMgUHJpbnQgQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wcmludENvbmZpZ0FjdGlvbj1TdGFtcGENCi0NCi0jIHRoZSB0aXRsZSBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlDQotI2Rvbid0IGRlZmluZSBoZXJlLCBsZXQgdXNlciBzcGVjaWZ5IGl0Lg0KLSN0aXRsZT1PcGVuVVAvQmFzaWMNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IFB1Ymxpc2ggUGF0aA0KLXB1Ymxpc2hQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vUHVibGlzaA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM2NWY2MTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBQdWJsaXNoaW5nIFVJDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBEZWZhdWx0IGZlZWRiYWNrIFVSTA0KLWZlZWRiYWNrVVJMPWh0dHA6Ly93d3cucHVibGlzaGVkX3dlYnNpdGUuY29tL2ZlZWRiYWNrDQotDQotIyBQdWJsaXNoIENvbmZpZ3VyYXRpb24gQWN0aW9uDQotcHVibGlzaENvbmZpZ0FjdGlvbj1cdTUxNmNcdTk1OGIoJlApLi4uDQotcHVibGlzaENvbmZpZ0FjdGlvblRvb2x0aXA9XHU2OWNiXHU2MjEwXHUzMDU5XHUzMDhiIFdlYiBcdTMwYjVcdTMwYTRcdTMwYzhcdTMwOTJcdTUxNmNcdTk1OGJcdTMwNTdcdTMwN2VcdTMwNTkNCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLXB1Ymxpc2hpbmdPcHRpb25zPVx1NTE2Y1x1OTU4Ylx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmMw0KLQ0KLSMgUHVibGlzaGluZyBBY3Rpb25zDQotY29uZmlnQWN0aW9uU2V0PVx1NjljYlx1NjIxMA0KLWNvbmZpZ01lbnU9XHU2OWNiXHU2MjEwKCZDKQ0KLQ0KLSMgUHJpbnQgQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wcmludENvbmZpZ0FjdGlvbj1cdTUzNzBcdTUyMzcNCi0NCi0jIHRoZSB0aXRsZSBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlDQotI2Rvbid0IGRlZmluZSBoZXJlLCBsZXQgdXNlciBzcGVjaWZ5IGl0Lg0KLSN0aXRsZT1PcGVuVVAvQmFzaWMNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IFB1Ymxpc2ggUGF0aA0KLXB1Ymxpc2hQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vUHVibGlzaA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4NTQ0OGUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdWFjZjVcdWFjMWMgVUkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIERlZmF1bHQgZmVlZGJhY2sgVVJMDQotZmVlZGJhY2tVUkw9aHR0cDovL3d3dy5wdWJsaXNoZWRfd2Vic2l0ZS5jb20vZmVlZGJhY2sNCi0NCi0jIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wdWJsaXNoQ29uZmlnQWN0aW9uPVx1YWNmNVx1YWMxYygmUCkuLi4NCi1wdWJsaXNoQ29uZmlnQWN0aW9uVG9vbHRpcD1cdWFkNmNcdWMxMzFcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzZmOSBcdWMwYWNcdWM3NzRcdWQyYjggXHVhY2Y1XHVhYzFjDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1wdWJsaXNoaW5nT3B0aW9ucz1cdWFjZjVcdWFjMWMgXHVjNjM1XHVjMTU4DQotDQotIyBQdWJsaXNoaW5nIEFjdGlvbnMNCi1jb25maWdBY3Rpb25TZXQ9XHVhZDZjXHVjMTMxDQotY29uZmlnTWVudT1cdWFkNmNcdWMxMzEoJkMpDQotDQotIyBQcmludCBDb25maWd1cmF0aW9uIEFjdGlvbg0KLXByaW50Q29uZmlnQWN0aW9uPVx1Yzc3OFx1YzFjNA0KLQ0KLSMgdGhlIHRpdGxlIGZvciB0aGUgcHVibGlzaGVkIHNpdGUNCi0jZG9uJ3QgZGVmaW5lIGhlcmUsIGxldCB1c2VyIHNwZWNpZnkgaXQuDQotI3RpdGxlPU9wZW5VUC9CYXNpYw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIERlZmF1bHQgUHVibGlzaCBQYXRoDQotcHVibGlzaFBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9QdWJsaXNoDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDBhMzdjNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9VUkgZGUgUHVibGljYVx1MDBlN1x1MDBlM28gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBEZWZhdWx0IGZlZWRiYWNrIFVSTA0KLWZlZWRiYWNrVVJMPWh0dHA6Ly93d3cucHVibGlzaGVkX3dlYnNpdGUuY29tL2ZlZWRiYWNrDQotDQotIyBQdWJsaXNoIENvbmZpZ3VyYXRpb24gQWN0aW9uDQotcHVibGlzaENvbmZpZ0FjdGlvbj0mUHVibGljYXIuLi4NCi1wdWJsaXNoQ29uZmlnQWN0aW9uVG9vbHRpcD1QdWJsaWNhciB1bSBXZWIgc2l0ZSBwYXJhIHVtYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1wdWJsaXNoaW5nT3B0aW9ucz1PcFx1MDBlN1x1MDBmNWVzIGRlIFB1YmxpY2FcdTAwZTdcdTAwZTNvDQotDQotIyBQdWJsaXNoaW5nIEFjdGlvbnMNCi1jb25maWdBY3Rpb25TZXQ9Q29uZmlndXJhXHUwMGU3XHUwMGUzbw0KLWNvbmZpZ01lbnU9JkNvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi0NCi0jIFByaW50IENvbmZpZ3VyYXRpb24gQWN0aW9uDQotcHJpbnRDb25maWdBY3Rpb249SW1wcmltaXINCi0NCi0jIHRoZSB0aXRsZSBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlDQotI2Rvbid0IGRlZmluZSBoZXJlLCBsZXQgdXNlciBzcGVjaWZ5IGl0Lg0KLSN0aXRsZT1PcGVuVVAvQmFzaWMNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IFB1Ymxpc2ggUGF0aA0KLXB1Ymxpc2hQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vUHVibGlzaA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmNjlkZWEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTUzZDFcdTVlMDNcdTc1MjhcdTYyMzdcdTc1NGNcdTk3NjINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIERlZmF1bHQgZmVlZGJhY2sgVVJMDQotZmVlZGJhY2tVUkw9aHR0cDovL3d3dy5wdWJsaXNoZWRfd2Vic2l0ZS5jb20vZmVlZGJhY2sNCi0NCi0jIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wdWJsaXNoQ29uZmlnQWN0aW9uPVx1NTNkMVx1NWUwMygmUCkuLi4NCi1wdWJsaXNoQ29uZmlnQWN0aW9uVG9vbHRpcD1cdTUzZDFcdTVlMDNcdTkxNGRcdTdmNmVcdTc2ODQgV2ViIFx1N2FkOVx1NzBiOQ0KLQ0KLSMgUHJlZmVyZW5jZSBQYWdlDQotcHVibGlzaGluZ09wdGlvbnM9XHU1M2QxXHU1ZTAzXHU5MDA5XHU5ODc5DQotDQotIyBQdWJsaXNoaW5nIEFjdGlvbnMNCi1jb25maWdBY3Rpb25TZXQ9XHU5MTRkXHU3ZjZlDQotY29uZmlnTWVudT1cdTkxNGRcdTdmNmUoJkMpDQotDQotIyBQcmludCBDb25maWd1cmF0aW9uIEFjdGlvbg0KLXByaW50Q29uZmlnQWN0aW9uPVx1NjI1M1x1NTM3MA0KLQ0KLSMgdGhlIHRpdGxlIGZvciB0aGUgcHVibGlzaGVkIHNpdGUNCi0jZG9uJ3QgZGVmaW5lIGhlcmUsIGxldCB1c2VyIHNwZWNpZnkgaXQuDQotI3RpdGxlPU9wZW5VUC9CYXNpYw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIERlZmF1bHQgUHVibGlzaCBQYXRoDQotcHVibGlzaFBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9QdWJsaXNoDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGM2MzU4MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFB1Ymxpc2hpbmcgVUkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIERlZmF1bHQgZmVlZGJhY2sgVVJMDQotZmVlZGJhY2tVUkw9aHR0cDovL3d3dy5wdWJsaXNoZWRfd2Vic2l0ZS5jb20vZmVlZGJhY2sNCi0NCi0jIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wdWJsaXNoQ29uZmlnQWN0aW9uPVx1NzY3Y1x1NGY0OCgmUCkuLi4NCi1wdWJsaXNoQ29uZmlnQWN0aW9uVG9vbHRpcD1cdTc2N2NcdTRmNDhcdTkxNGRcdTdmNmVcdTdkYjJcdTdhZDkNCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLXB1Ymxpc2hpbmdPcHRpb25zPVx1NzY3Y1x1NGY0OFx1OTA3OFx1OTgwNQ0KLQ0KLSMgUHVibGlzaGluZyBBY3Rpb25zDQotY29uZmlnQWN0aW9uU2V0PVx1OTE0ZFx1N2Y2ZQ0KLWNvbmZpZ01lbnU9XHU5MTRkXHU3ZjZlKCZDKQ0KLQ0KLSMgUHJpbnQgQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wcmludENvbmZpZ0FjdGlvbj1cdTUyMTdcdTUzNzANCi0NCi0jIHRoZSB0aXRsZSBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlDQotI2Rvbid0IGRlZmluZSBoZXJlLCBsZXQgdXNlciBzcGVjaWZ5IGl0Lg0KLSN0aXRsZT1PcGVuVVAvQmFzaWMNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IFB1Ymxpc2ggUGF0aA0KLXB1Ymxpc2hQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vUHVibGlzaA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDE4MWJhMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24gV2l6YXJkDQotcHVibGlzaENvbmZpZ1dpemFyZF90aXRsZT1NZXRob2RlbmtvbmZpZ3VyYXRpb24gdmVyXHUwMGY2ZmZlbnRsaWNoZW4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9TWV0aG9kZW5rb25maWd1cmF0aW9uIGF1c3dcdTAwZTRobGVuDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ9V1x1MDBlNGhsZW4gU2llIGRpZSB6dSB2ZXJcdTAwZjZmZmVudGxpY2hlbmRlIE1ldGhvZGVua29uZmlndXJhdGlvbiBhdXMuDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RPcHRpb25zUGFnZV90aXRsZT1WZXJcdTAwZjZmZmVudGxpY2h1bmdzb3B0aW9uZW4gYW5nZWJlbg0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0T3B0aW9uc1BhZ2VfdGV4dD1HZWJlbiBTaWUgZGFzIFppZWx2ZXJ6ZWljaG5pcyB1bmQgZGllIFZlclx1MDBmNmZmZW50bGljaHVuZ3NvcHRpb25lbiBhbi4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX21ldGhvZENvbmZpZ190ZXh0PU1ldGhvZGVua29uZmlndXJhdGlvbjoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Rlc3RpbmF0aW9uR3JvdXBfdGV4dD1aaWVsdmVyemVpY2huaXMNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2RpcmVjdG9yeV90ZXh0PVBmYWQ6DQotcHVibGlzaENvbmZpZ1dpemFyZF91c2VEZWZhdWx0UGF0aF90ZXh0PVN0YW5kYXJkcGZhZCB2ZXJ3ZW5kZW4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3dlYlNpdGVfdGV4dD1WZXJcdTAwZjZmZmVudGxpY2h0ZSBXZWJzaXRlDQotcHVibGlzaENvbmZpZ1dpemFyZF90aXRsZV90ZXh0PVRpdGVsOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfYmFubmVySW1hZ2VfdGV4dD1CYW5uZXItR3JhZmlrOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfYWJvdXRIVE1MX3RleHQ9SW5mb3JtYXRpb25lbiB6dW0gSW5oYWx0Og0KLXB1Ymxpc2hDb25maWdXaXphcmRfZmVlZGJhY2tVUkxfdGV4dD1GZWVkYmFjay1VUkw6DQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlSW5kZXhfdGV4dD1JbmRleHNlaXRlIHZlclx1MDBmNmZmZW50bGljaGVuDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlR2xvc3NhcnlfdGV4dD1HbG9zc2Fyc2VpdGUgdmVyXHUwMGY2ZmZlbnRsaWNoZW4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVTZWFyY2hfdGV4dD1TdWNoZnVua3Rpb25lbiBlaW5zY2hsaWVcdTAwZGZlbiAoc2V0enQgVW50ZXJzdFx1MDBmY3R6dW5nIGZcdTAwZmNyIEphdmEtQXBwbGV0cyBpbSBCcm93c2VyIHZvcmF1cykNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3VzZUFwcGxldF90ZXh0PUFucGFzc3VuZyB2b24gU2ljaHRlbiB1bnRlcnN0XHUwMGZjdHplbiAoc2V0enQgVW50ZXJzdFx1MDBmY3R6dW5nIGZcdTAwZmNyIEphdmEtQXBwbGV0cyBpbSBCcm93c2VyIHZvcmF1cykNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3ZhbGlkYXRpb25Hcm91cF90ZXh0PVZhbGlkaWVydW5nDQotcHVibGlzaENvbmZpZ1dpemFyZF9jaGVja0h5cGVybGlua3NfdGV4dD1FeHRlcm5lIEh5cGVybGlua3MgcHJcdTAwZmNmZW4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2RpYWdyYW1Hcm91cF90ZXh0PURpYWdyYW1tZQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlfZGRfdGV4dD1Ba3Rpdml0XHUwMGU0dHNkZXRhaWxkaWFncmFtbWUgdmVyXHUwMGY2ZmZlbnRsaWNoZW4sIGRpZSBpbSBQcm96ZXNzZWRpdG9yIG5pY2h0IGVyc3RlbGx0IHd1cmRlbi4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09QWt0aXZpdFx1MDBlNHRzZGlhZ3JhbW1lIGZcdTAwZmNyIG5pY2h0IGdlXHUwMGU0bmRlcnRlIEFrdGl2aXRcdTAwZTR0c2Vyd2VpdGVydW5nZW4gdmVyXHUwMGY2ZmZlbnRsaWNoZW4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NvbnZlcnRCcm9rZW5MaW5rc190ZXh0PURlZmVrdGUgTGlua3MgaW4gS2xhcnRleHQga29udmVydGllcmVuDQotcHVibGlzaENvbmZpZ1dpemFyZF9sYXlvdXRfdGV4dD1MYXlvdXQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2V4dHJhRGVzY3JpcHRvckluZm9fdGV4dD1EZXNrcmlwdG9yZW4gbWl0IGRlbSB2b2xsc3RcdTAwZTRuZGlnZW4gSW5oYWx0IGRlcyB6dWdlaFx1MDBmNnJpZ2VuIE1ldGhvZGVuaW5oYWx0c2VsZW1lbnRzIHZlclx1MDBmNmZmZW50bGljaGVuDQotcHVibGlzaENvbmZpZ1dpemFyZF9saWdodFdlaWdodFRyZWVfdGV4dD1VbnRlcmdlb3JkbmV0ZSBCYXVtc3RydWt0dXIgZlx1MDBmY3IgQXVmZ2FiZW4tLCBSb2xsZW4tLCBBcmJlaXRzZXJnZWJuaXMtIHVuZCBEaXN6aXBsaW5lbGVtZW50ZSBvaG5lIE9yZG5lciBnZW5lcmllcmVuDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlRW1wdHlDYXRlZ29yaWVzX3RleHQ9S2F0ZWdvcmllbiBvaG5lIGthdGVnb3Jpc2llcnRlIEVsZW1lbnRlIHZlclx1MDBmNmZmZW50bGljaGVuDQotDQotIyBwdWJsaXNoIHByb2Nlc3Mgd2l6YXJkIHBhZ2UNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGl0bGU9VmVyXHUwMGY2ZmZlbnRsaWNodW5nc3R5cCBhdXN3XHUwMGU0aGxlbg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV90ZXh0PVNpZSBrXHUwMGY2bm5lbiBkaWUgYXVzZ2V3XHUwMGU0aGx0ZSBLb25maWd1cmF0aW9uIG9kZXIgZGllIGFuZ2VnZWJlbmVuIFByb3plc3NlIGluIGRlciBLb25maWd1cmF0aW9uIHZlclx1MDBmNmZmZW50bGljaGVuLg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9jYXBhYmlsaXR5X3BhdHRlcm49UHJvemVzc211c3Rlcg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9kZWxpdmVyeV9wcm9jZXNzPUJlcmVpdHN0ZWxsdW5nc3Byb3plc3NlDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3NlbGVjdFR5cGU9VmVyXHUwMGY2ZmZlbnRsaWNodW5nc3R5cCBhdXN3XHUwMGU0aGxlbg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF90eXBlX3Byb2Nlc3Nlcz1Gb2xnZW5kZSBhdXNnZXdcdTAwZTRobHRlIFByb3plc3NlIHZlclx1MDBmNmZmZW50bGljaGVuOg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF90eXBlX2NvbmZpZz1BdXNnZXdcdTAwZTRobHRlIEtvbmZpZ3VyYXRpb24gdmVyXHUwMGY2ZmZlbnRsaWNoZW4NCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfcHVibGlzaF9iYXNlX3Byb2Nlc3Nlcz1SZWZlcmVuemllcnRlIEJhc2lzcHJvemVzc2UgdmVyXHUwMGY2ZmZlbnRsaWNoZW4NCi0NCi0jIFB1Ymxpc2hpbmcgUHJlZmVyZW5jZSBQYWdlDQotcHJlZmVyZW5jZVBhZ2VfZGVmYXVsdFBhdGhfdGV4dD1TdGFuZGFyZHBmYWQ6DQotDQotIyBDb25maXJtYXRpb24gRGlhbG9ncw0KLXB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU9TWV0aG9kZW5rb25maWd1cmF0aW9uIHZlclx1MDBmNmZmZW50bGljaGVuDQotY29uZmlybVBhdGhEaWFsb2dfdGV4dD1EZXIgWmllbHBmYWQgd3VyZGUgaW4gJyd7MH0nJyBhdWZnZWxcdTAwZjZzdC4gRm9ydGZhaHJlbj8NCi1vdmVyd3JpdGVEaWFsb2dfdGV4dD1EZXIgWmllbHBmYWQgJyd7MH0nJyBpc3QgYmVyZWl0cyB2b3JoYW5kZW4uIEVzIHdlcmRlbiBhbGxlIERhdGVpZW4gaW0gT3JkbmVyIGdlbFx1MDBmNnNjaHQuIEZvcnRmYWhyZW4/DQotY2FuY2VsUHVibGlzaENvbmZpZ19tc2c9RGllIFZlclx1MDBmNmZmZW50bGljaHVuZ3NvcGVyYXRpb24gd3VyZGUgYWJnZWJyb2NoZW4uDQotDQotIyBFcnJvciBEaWFsb2dzDQotcHJldmlld0NvbmZpZ0Vycm9yX3RpdGxlPVZlclx1MDBmNmZmZW50bGljaHRlIE1ldGhvZGVua29uZmlndXJhdGlvbiB2b3JhbnplaWdlbg0KLXZpZXdSZXBvcnRFcnJvcl90aXRsZT1WZXJcdTAwZjZmZmVudGxpY2h1bmdzYmVyaWNodCBhbnplaWdlbg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1taXNzaW5nVmlld0Vycm9yX21zZz1JVVBQMDEwMFc6IERpZSBhdXNnZXdcdTAwZTRobHRlIEtvbmZpZ3VyYXRpb24gZW50aFx1MDBlNGx0IGtlaW5lIGdcdTAwZmNsdGlnZSBTaWNodC4gQmVhcmJlaXRlbiBTaWUgZGllIEtvbmZpZ3VyYXRpb24gdW5kIGZcdTAwZmNnZW4gU2llIGVpbmUgU2ljaHQgaGluenUgb2RlciB3XHUwMGU0aGxlbiBTaWUgZWluZSBhbmRlcmUgS29uZmlndXJhdGlvbiBhdXMuDQotY2Fubm90UHVibGlzaEVycm9yX21zZz1JVVBQMDEwMUU6IERpZSBhdXNnZXdcdTAwZTRobHRlIEtvbmZpZ3VyYXRpb24ga2FubiBuaWNodCB2ZXJcdTAwZjZmZmVudGxpY2h0IHdlcmRlbi4NCi1pbnZhbGlkUGF0aEVycm9yX21zZz1JVVBQMDEwMkU6IERlciBaaWVscGZhZCBpc3QgbGVlciBvZGVyIHVuZ1x1MDBmY2x0aWcuDQotaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZz1JVVBQMDEwM0U6IERlciBaaWVscGZhZCBkYXJmIGRpZSBmb2xnZW5kZW4gWmVpY2hlbiBuaWNodCBlbnRoYWx0ZW46IFxcICMgKiA/ICIgPCA+IHwgISAlIC8NCi1wdWJsaXNoQ29uZmlnRXJyb3JfbXNnPUlVUFAwMTA0RTogRGllIGF1c2dld1x1MDBlNGhsdGUgS29uZmlndXJhdGlvbiB3dXJkZSBuaWNodCBvcmRudW5nc2dlbVx1MDBlNFx1MDBkZiB2ZXJcdTAwZjZmZmVudGxpY2h0Lg0KLXByZXZpZXdDb25maWdFcnJvcl9tc2c9SVVQUDAxMDVFOiBFcyBrYW5uIGtlaW4gSFRNTC1Ccm93c2VyIGZcdTAwZmNyIGRpZSBWb3JhbnplaWdlIGRlciB2ZXJcdTAwZjZmZmVudGxpY2h0ZW4gS29uZmlndXJhdGlvbiBnZVx1MDBmNmZmbmV0IHdlcmRlbi4NCi12aWV3UmVwb3J0RXJyb3JfbXNnPUlVUFAwMTA2RTogRXMga2FubiBrZWluIEhUTUwtQnJvd3NlciB6dW0gQW56ZWlnZW4gZGVzIFZlclx1MDBmNmZmZW50bGljaHVuZ3NiZXJpY2h0cyBnZVx1MDBmNmZmbmV0IHdlcmRlbi4NCi0NCi0jIEVycm9yIFJlYXNvbnMgJiBSZWNvbW1lbmRlZCBBY3Rpb25zDQotcHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbj1JVVBQMDEwN0U6IEVzIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBLbGlja2VuIFNpZSBhdWYgZGllIFNjaGFsdGZsXHUwMGU0Y2hlIERldGFpbHMsIHVtIHdlaXRlcmUgSW5mb3JtYXRpb25lbiB6dSBlcmhhbHRlbi4NCi1kZWxldGVGaWxlc0Vycm9yX3JlYXNvbj1EZXIgWmllbHBmYWQgJyd7MH0nJyBlbnRoXHUwMGU0bHQgRGF0ZWllbiwgZGllIG5pY2h0IGdlbFx1MDBmNnNjaHQgd2VyZGVuIGtcdTAwZjZubmVuLlxuXG5TY2hsaWVcdTAwZGZlbiBTaWUgZGVuIERpYWxvZyB1bmQgZ2ViZW4gU2llIGVpbmVuIGFuZGVyZW4gUGZhZCBhbi4NCi1jcmVhdGVEaXJFcnJvcl9yZWFzb249RGVyIFppZWxwZmFkICcnezB9Jycga2FubiBuaWNodCBlcnN0ZWxsdCB3ZXJkZW4uXG5cblNjaGxpZVx1MDBkZmVuIFNpZSBkZW4gRGlhbG9nIHVuZCBnZWJlbiBTaWUgZWluZW4gYW5kZXJlbiBQZmFkIGFuLg0KLW9wZW5Ccm93c2VyRXJyb3JfcmVhc29uPURlciBIVE1MLVN0YW5kYXJkLUJyb3dzZXIgYXVmIGRpZXNlbSBTeXN0ZW0gd3VyZGUgbmljaHQgZ2VmdW5kZW4uXG5cblNjaGxpZVx1MDBkZmVuIFNpZSBkZW4gRGlhbG9nIHVuZCBcdTAwZjZmZm5lbiBTaWUgZGllIERhdGVpICcnezB9JycgbWFudWVsbCBpbiBlaW5lbSBIVE1MLUJyb3dzZXIuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOGFhODU1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlPVB1YmxpY2FyIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TZWxlY2Npb25hciBjb25maWd1cmFjaVx1MDBmM24gZGUgbVx1MDBlOXRvZG8NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGV4dD1TZWxlY2Npb25lIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbyBxdWUgZGVzZWEgcHVibGljYXIuDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RPcHRpb25zUGFnZV90aXRsZT1Fc3BlY2lmaWNhciBvcGNpb25lcyBkZSBwdWJsaWNhY2lcdTAwZjNuDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RPcHRpb25zUGFnZV90ZXh0PUVzcGVjaWZpcXVlIGVsIGRpcmVjdG9yaW8gZGUgZGVzdGlubyB5IGxhcyBvcGNpb25lcyBkZSBwdWJsaWNhY2lcdTAwZjNuLg0KLXB1Ymxpc2hDb25maWdXaXphcmRfbWV0aG9kQ29uZmlnX3RleHQ9Q29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGVzdGluYXRpb25Hcm91cF90ZXh0PURpcmVjdG9yaW8gZGUgZGVzdGlubw0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlyZWN0b3J5X3RleHQ9Vlx1MDBlZGEgZGUgYWNjZXNvOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfdXNlRGVmYXVsdFBhdGhfdGV4dD1Vc2FyIGxhIHByZWRldGVybWluYWRhDQotcHVibGlzaENvbmZpZ1dpemFyZF93ZWJTaXRlX3RleHQ9U2l0aW8gd2ViIHB1YmxpY2Fkbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGVfdGV4dD1UXHUwMGVkdHVsbzoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Jhbm5lckltYWdlX3RleHQ9SW1hZ2VuIGRlbCBtZW5zYWplIGRlIGNhYmVjZXJhOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfYWJvdXRIVE1MX3RleHQ9QWNlcmNhIGRlbCBjb250ZW5pZG86DQotcHVibGlzaENvbmZpZ1dpemFyZF9mZWVkYmFja1VSTF90ZXh0PVVSTCBkZSBpbmZvcm1hY2lcdTAwZjNuIGRlIHJldG9ybm86DQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlSW5kZXhfdGV4dD1QdWJsaWNhciBwXHUwMGUxZ2luYSBkZWwgXHUwMGVkbmRpY2UNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVHbG9zc2FyeV90ZXh0PVB1YmxpY2FyIHBcdTAwZTFnaW5hIGRlIGdsb3NhcmlvDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlU2VhcmNoX3RleHQ9SW5jbHVpciBjYXBhY2lkYWQgZGUgYlx1MDBmYXNxdWVkYSAocmVxdWllcmUgcXVlIGVsIG5hdmVnYWRvciBzb3BvcnRlIGVsIGFwcGxldCBKYXZhKQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfdXNlQXBwbGV0X3RleHQ9U29wb3J0YXIgcGVyc29uYWxpemFjaVx1MDBmM24gZGUgbGEgdmlzdGEgKHJlcXVpZXJlIHF1ZSBlbCBuYXZlZ2Fkb3Igc29wb3J0ZSBlbCBhcHBsZXQgSmF2YSkNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3ZhbGlkYXRpb25Hcm91cF90ZXh0PVZhbGlkYWNpXHUwMGYzbg0KLXB1Ymxpc2hDb25maWdXaXphcmRfY2hlY2tIeXBlcmxpbmtzX3RleHQ9Q29tcHJvYmFyIGhpcGVyZW5sYWNlcyBleHRlcm5vcw0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlhZ3JhbUdyb3VwX3RleHQ9RGlhZ3JhbWFzDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVB1YmxpY2FyIGRpYWdyYW1hcyBkZSBkZXRhbGxlcyBkZSBsYSBhY3RpdmlkYWQgcXVlIG5vIHNlIGhheWFuIGNyZWFkbyBlbiBlbCBlZGl0b3IgZGUgcHJvY2Vzb3MNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09UHVibGljYXIgZGlhZ3JhbWFzIGRlIGFjdGl2aWRhZCBwYXJhIGV4dGVuc2lvbmVzIGRlIGFjdGl2aWRhZCBxdWUgbm8gc2UgaGFuIG1vZGlmaWNhZG8NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NvbnZlcnRCcm9rZW5MaW5rc190ZXh0PUNvbnZlcnRpciBlbmxhY2VzIHJvdG9zIGEgdGV4dG8gc2luIGZvcm1hdG8NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2xheW91dF90ZXh0PURpc2VcdTAwZjFvDQotcHVibGlzaENvbmZpZ1dpemFyZF9leHRyYURlc2NyaXB0b3JJbmZvX3RleHQ9UHVibGljYXIgZGVzY3JpcHRvcmVzIGNvbiBlbCBjb250ZW5pZG8gY29tcGxldG8gZGVsIGVsZW1lbnRvIGRlIGNvbnRlbmlkbyBkZSBtXHUwMGU5dG9kbyByZWxhY2lvbmFkbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGlnaHRXZWlnaHRUcmVlX3RleHQ9R2VuZXJhciBlc3RydWN0dXJhIGRlIHN1Ylx1MDBlMXJib2wgcGFyYSBlbGVtZW50b3MgZGUgdGFyZWEsIHJvbCwgcHJvZHVjdG8gZGUgdHJhYmFqbyB5IGRpc2NpcGxpbmEgc2luIHV0aWxpemFyIGNhcnBldGFzLg0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUVtcHR5Q2F0ZWdvcmllc190ZXh0PVB1YmxpY2FyIGNhdGVnb3JcdTAwZWRhcyBzaW4gZWxlbWVudG9zIGNhdGVnb3JpemFkb3MNCi0NCi0jIHB1Ymxpc2ggcHJvY2VzcyB3aXphcmQgcGFnZQ0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV90aXRsZT1TZWxlY2Npb25hciB0aXBvIGRlIHB1YmxpY2FjaVx1MDBmM24NCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGV4dD1QdWVkZSBwdWJsaWNhciBsYSBjb25maWd1cmFjaVx1MDBmM24gc2VsZWNjaW9uYWRhIG8gbG9zIHByb2Nlc29zIGVzcGVjaWZpY2Fkb3MgZW4gbGEgY29uZmlndXJhY2lcdTAwZjNuDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX2NhcGFiaWxpdHlfcGF0dGVybj1QYXRyb25lcyBkZSBwb3NpYmlsaWRhZA0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9kZWxpdmVyeV9wcm9jZXNzPVByb2Nlc29zIGRlIGVudHJlZ2ENCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfc2VsZWN0VHlwZT1TZWxlY2Npb25hciB0aXBvIGRlIHB1YmxpY2FjaVx1MDBmM24NCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfdHlwZV9wcm9jZXNzZXM9UHVibGljYXIgbG9zIHByb2Nlc29zIHNlbGVjY2lvbmFkb3MgbVx1MDBlMXMgYWJham86DQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3R5cGVfY29uZmlnPVB1YmxpY2FyIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBzZWxlY2Npb25hZGENCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfcHVibGlzaF9iYXNlX3Byb2Nlc3Nlcz1QdWJsaWNhciBwcm9jZXNvcyBkZSBiYXNlIHJlZmVyZW5jaWFkYQ0KLQ0KLSMgUHVibGlzaGluZyBQcmVmZXJlbmNlIFBhZ2UNCi1wcmVmZXJlbmNlUGFnZV9kZWZhdWx0UGF0aF90ZXh0PVZcdTAwZWRhIGRlIGFjY2VzbyBwb3Igb21pc2lcdTAwZjNuOg0KLQ0KLSMgQ29uZmlybWF0aW9uIERpYWxvZ3MNCi1wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlPVB1YmxpY2FyIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbw0KLWNvbmZpcm1QYXRoRGlhbG9nX3RleHQ9TGEgdlx1MDBlZGEgZGUgYWNjZXNvIGRlIGRlc3Rpbm8gc2UgcmVzdWVsdG8gZW4gJyd7MH0nJy4gXHUwMGJmRGVzZWEgY29udGludWFyPw0KLW92ZXJ3cml0ZURpYWxvZ190ZXh0PUxhIGRlIGFjY2VzbyBkZSBkZXN0aW5vICcnezB9JycgeWEgZXhpc3RlLiBTZSBzdXByaW1pclx1MDBlMW4gdG9kb3MgbG9zIGFyY2hpdm9zIGRlIGxhIGNhcnBldGEuIFx1MDBiZkRlc2VhIGNvbnRpbnVhcj8NCi1jYW5jZWxQdWJsaXNoQ29uZmlnX21zZz1MYSBvcGVyYWNpXHUwMGYzbiBkZSBwdWJsaWNhY2lcdTAwZjNuIHNlIGhhIGNhbmNlbGFkby4NCi0NCi0jIEVycm9yIERpYWxvZ3MNCi1wcmV2aWV3Q29uZmlnRXJyb3JfdGl0bGU9UHJldmlzdWFsaXphciBsYSBjb25maWd1cmFjaVx1MDBmM24gZGUgbVx1MDBlOXRvZG8gcHVibGljYWRhDQotdmlld1JlcG9ydEVycm9yX3RpdGxlPVZlciBlbCBpbmZvcm1lIGRlIHB1YmxpY2FjaVx1MDBmM24NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbWlzc2luZ1ZpZXdFcnJvcl9tc2c9SVVQUDAxMDBXOiBMYSBjb25maWd1cmFjaVx1MDBmM24gc2VsZWNjaW9uYWRhIG5vIGNvbnRpZW5lIHVuYSB2aXN0YSB2XHUwMGUxbGlkYS4gRWRpdGUgbGEgY29uZmlndXJhY2lcdTAwZjNuIHkgYVx1MDBmMWFkYSB1bmEgdmlzdGEgbyBzZWxlY2Npb25lIG90cmEgY29uZmlndXJhY2lcdTAwZjNuLg0KLWNhbm5vdFB1Ymxpc2hFcnJvcl9tc2c9SVVQUDAxMDFFOiBMYSBjb25maWd1cmFjaVx1MDBmM24gc2VsZWNjaW9uYWRhIG5vIHNlIHB1ZWRlIHB1YmxpY2FyLg0KLWludmFsaWRQYXRoRXJyb3JfbXNnPUlVUFAwMTAyRTogTGEgdlx1MDBlZGEgZGUgYWNjZXNvIGRlIGRlc3Rpbm8gZXN0XHUwMGUxIGVuIGJsYW5jbyBvIG5vIGVzIHZcdTAwZTFsaWRhLg0KLWludmFsaWRQYXRoQ2hhcnNFcnJvcl9tc2c9SVVQUDAxMDNFOiBMYSB2XHUwMGVkYSBkZSBhY2Nlc28gZGUgZGVzdGlubyBubyBwdWVkZSBjb250ZW5lciBlc3RvcyBjYXJhY3RlcmVzOiAjICogPyAiIDwgPiB8ICEgJSAvDQotcHVibGlzaENvbmZpZ0Vycm9yX21zZz1JVVBQMDEwNEU6IExhIGNvbmZpZ3VyYWNpXHUwMGYzbiBzZWxlY2Npb25hZGEgbm8gc2UgaGEgcHVibGljYWRvIHNhdGlzZmFjdG9yaWFtZW50ZS4NCi1wcmV2aWV3Q29uZmlnRXJyb3JfbXNnPUlVUFAwMTA1RTogTm8gc2UgaGEgcG9kaWRvIGFicmlyIHVuIG5hdmVnYWRvciBIVE1MIHBhcmEgdmlzdWFsaXphciBsYSB2aXN0YSBwcmVsaW1pbmFyIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBwdWJsaWNhZGEuDQotdmlld1JlcG9ydEVycm9yX21zZz1JVVBQMDEwNkU6IE5vIHNlIGhhIHBvZGlkbyBhYnJpciB1biBuYXZlZ2Fkb3IgSFRNTCBwYXJhIHZlciBlbCBpbmZvcm1lIGRlIHB1YmxpY2FjaVx1MDBmM24uDQotDQotIyBFcnJvciBSZWFzb25zICYgUmVjb21tZW5kZWQgQWN0aW9ucw0KLXB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb249SVVQUDAxMDdFOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IuIFB1bHNlIGVsIGJvdFx1MDBmM24gRGV0YWxsZXMgcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGluZm9ybWFjaVx1MDBmM24uDQotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249TGEgdlx1MDBlZGEgZGUgYWNjZXNvIGRlIGRlc3Rpbm8gJyd7MH0nJyBjb250aWVuZSBhcmNoaXZvcyBxdWUgbm8gc2UgcHVlZGVuIHN1cHJpbWlyLlxuXG5DaWVycmUgZXN0ZSBkaVx1MDBlMWxvZ28geSBlc3BlY2lmaXF1ZSBvdHJhIHZcdTAwZWRhIGRlIGFjY2Vzby4NCi1jcmVhdGVEaXJFcnJvcl9yZWFzb249Tm8gc2UgcHVlZGUgY3JlYXIgbGEgdlx1MDBlZGEgZGUgYWNjZXNvIGRlIGRlc3Rpbm8gJyd7MH0nJy5cblxuQ2llcnJlIGVzdGUgZGlcdTAwZTFsb2dvIHkgZXNwZWNpZmlxdWUgb3RyYSB2XHUwMGVkYSBkZSBhY2Nlc28uDQotb3BlbkJyb3dzZXJFcnJvcl9yZWFzb249Tm8gc2UgcHVlZGUgZGV0ZWN0YXIgbyBsb2NhbGl6YXIgZWwgbmF2ZWdhZG9yIEhUTUwgcG9yIG9taXNpXHUwMGYzbiBkZSBlc3RlIHNpc3RlbWEuXG5cbkNpZXJyZSBlc3RlIGRpXHUwMGUxbG9nbyB5IGFicmEgZWwgYXJjaGl2byAnJ3swfScnIG1hbnVhbG1lbnRlIGNvbiB1biBuYXZlZ2Fkb3IgSFRNTC4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlMjNiNzAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uIFdpemFyZA0KLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGU9UHVibGllciBsYSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TXHUwMGU5bGVjdGlvbm5lciBsYSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVNcdTAwZTlsZWN0aW9ubmV6IGxhIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlIHF1ZSB2b3VzIHNvdWhhaXRleiBwdWJsaWVyLg0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0T3B0aW9uc1BhZ2VfdGl0bGU9U3BcdTAwZTljaWZpZXIgbGVzIG9wdGlvbnMgZGUgcHVibGljYXRpb24NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RleHQ9U3BcdTAwZTljaWZpZXogbGUgclx1MDBlOXBlcnRvaXJlIGRlIGRlc3RpbmF0aW9uIGV0IGxlcyBvcHRpb25zIGRlIHB1YmxpY2F0aW9uLg0KLXB1Ymxpc2hDb25maWdXaXphcmRfbWV0aG9kQ29uZmlnX3RleHQ9Q29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUgOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGVzdGluYXRpb25Hcm91cF90ZXh0PVJcdTAwZTlwZXJ0b2lyZSBkZSBkZXN0aW5hdGlvbg0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlyZWN0b3J5X3RleHQ9Q2hlbWluIDoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3VzZURlZmF1bHRQYXRoX3RleHQ9VXRpbGlzZXogbGUgY2hlbWluIHBhciBkXHUwMGU5ZmF1dA0KLXB1Ymxpc2hDb25maWdXaXphcmRfd2ViU2l0ZV90ZXh0PVNpdGUgV2ViIHB1YmxpXHUwMGU5DQotcHVibGlzaENvbmZpZ1dpemFyZF90aXRsZV90ZXh0PVRpdHJlIDoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Jhbm5lckltYWdlX3RleHQ9SW1hZ2UgZGUgbGEgYmFubmlcdTAwZThyZSA6DQotcHVibGlzaENvbmZpZ1dpemFyZF9hYm91dEhUTUxfdGV4dD1Db250ZW51IGRlIGxhIHJ1YnJpcXVlIEEgcHJvcG9zIGRlIDoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2ZlZWRiYWNrVVJMX3RleHQ9VVJMIGRlc3Rpblx1MDBlOWUgYXV4IHJldG91cnMgZCdpbmZvcm1hdGlvbnMgOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUluZGV4X3RleHQ9UHVibGlleiBsYSBwYWdlIGQnaW5kZXgNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVHbG9zc2FyeV90ZXh0PVB1YmxpZXogbGEgcGFnZSBkZSBnbG9zc2FpcmUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVTZWFyY2hfdGV4dD1JbmNsdWV6IGxhIGZvbmN0aW9uIGRlIHJlY2hlcmNoZSAoblx1MDBlOWNlc3NpdGUgbGEgcHJpc2UgZW4gY2hhcmdlIGRlIGwnYXBwbGV0IEphdmEgZGFucyBsZSBuYXZpZ2F0ZXVyKQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfdXNlQXBwbGV0X3RleHQ9UHJpc2UgZW4gY2hhcmdlIGRlIGxhIHBlcnNvbm5hbGlzYXRpb24gZGVzIHZ1ZXMgKG5cdTAwZTljZXNzaXRlIGxhIHByaXNlIGVuIGNoYXJnZSBkZSBsJ2FwcGxldCBKYXZhIGRhbnMgbGUgbmF2aWdhdGV1cikNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3ZhbGlkYXRpb25Hcm91cF90ZXh0PVZhbGlkYXRpb24NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NoZWNrSHlwZXJsaW5rc190ZXh0PVZcdTAwZTlyaWZpZXogbGVzIGxpZW5zIGh5cGVydGV4dGVzIGV4dGVybmVzDQotcHVibGlzaENvbmZpZ1dpemFyZF9kaWFncmFtR3JvdXBfdGV4dD1EaWFncmFtbWVzDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVB1YmxpZXogbGVzIGRpYWdyYW1tZXMgZFx1MDBlOXRhaWxsXHUwMGU5cyBkJ2FjdGl2aXRcdTAwZTkgcXVpIG4nb250IHBhcyBcdTAwZTl0XHUwMGU5IGNyXHUwMGU5XHUwMGU5cyBkYW5zIGwnXHUwMGU5ZGl0ZXVyIGRlIHByb2Nlc3N1cw0KLXB1Ymxpc2hDb25maWdXaXphcmRfcHVibGlzaF9leHRlbmRfYWN0aXZpdHlfZGlhZ3JhbT1QdWJsaWV6IGxlcyBkaWFncmFtbWVzIGQnYWN0aXZpdFx1MDBlOSBwb3VyIGRlcyBleHRlbnNpb25zIGQnYWN0aXZpdFx1MDBlOXMgbm9uIG1vZGlmaVx1MDBlOWVzDQotcHVibGlzaENvbmZpZ1dpemFyZF9jb252ZXJ0QnJva2VuTGlua3NfdGV4dD1Db252ZXJ0aXIgbGVzIGxpZW5zIHJvbXB1cyBlbiB0ZXh0ZSBjbGFpcg0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGF5b3V0X3RleHQ9RGlzcG9zaXRpb24NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2V4dHJhRGVzY3JpcHRvckluZm9fdGV4dD1QdWJsaWV6IGxlcyBkZXNjcmlwdGV1cnMgYXZlYyBsZSBjb250ZW51IGVudGllciBkZSBsJ1x1MDBlOWxcdTAwZTltZW50IGR1IGNvbnRlbnUgZGUgbVx1MDBlOXRob2RlIGFzc29jaVx1MDBlOQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGlnaHRXZWlnaHRUcmVlX3RleHQ9R1x1MDBlOW5cdTAwZTlyZXogdW5lIHN0cnVjdHVyZSBkZSBzb3VzLWFyYnJlcyBwb3VyIGxhIHRcdTAwZTJjaGUsIGxlIHJcdTAwZjRsZSwgbGUgcHJvZHVpdCBldCBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIGRpc2NpcGxpbmUgc2FucyB1dGlsaXNlciBkZSBkb3NzaWVycw0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUVtcHR5Q2F0ZWdvcmllc190ZXh0PVB1YmxpZXogZGVzIGNhdFx1MDBlOWdvcmllcyBzYW5zIGF1Y3VuIFx1MDBlOWxcdTAwZTltZW50IGNhdFx1MDBlOWdvcmlzXHUwMGU5DQotDQotIyBwdWJsaXNoIHByb2Nlc3Mgd2l6YXJkIHBhZ2UNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGl0bGU9U1x1MDBlOWxlY3Rpb25uZXIgbGUgdHlwZSBkZSBwdWJsaWNhdGlvbg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV90ZXh0PVZvdXMgcG91dmV6IHB1YmxpZXIgbGEgY29uZmlndXJhdGlvbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTllIG91IGxlcyBwcm9jZXNzdXMgc3BcdTAwZTljaWZpXHUwMGU5cyBkYW5zIGxhIGNvbmZpZ3VyYXRpb24NCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfY2FwYWJpbGl0eV9wYXR0ZXJuPVBhdHRlcm5zIGRlIGNhcGFjaXRcdTAwZTkNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfZGVsaXZlcnlfcHJvY2Vzcz1Qcm9jZXNzdXMgZGUgbGl2cmFpc29uDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3NlbGVjdFR5cGU9U1x1MDBlOWxlY3Rpb25uZXIgbGUgdHlwZSBkZSBwdWJsaWNhdGlvbg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF90eXBlX3Byb2Nlc3Nlcz1QdWJsaWVyIGxlcyBwcm9jZXNzdXMgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cyBjaS1kZXNzb3VzIDoNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfdHlwZV9jb25maWc9UHVibGllciBsYSBjb25maWd1cmF0aW9uIHNcdTAwZTlsZWN0aW9ublx1MDBlOWUNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfcHVibGlzaF9iYXNlX3Byb2Nlc3Nlcz1QdWJsaWVyIGxlcyBwcm9jZXNzdXMgZGUgYmFzZSByXHUwMGU5Zlx1MDBlOXJlbmNcdTAwZTlzDQotDQotIyBQdWJsaXNoaW5nIFByZWZlcmVuY2UgUGFnZQ0KLXByZWZlcmVuY2VQYWdlX2RlZmF1bHRQYXRoX3RleHQ9Q2hlbWluIHBhciBkXHUwMGU5ZmF1dCA6DQotDQotIyBDb25maXJtYXRpb24gRGlhbG9ncw0KLXB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU9UHVibGllciBsYSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLWNvbmZpcm1QYXRoRGlhbG9nX3RleHQ9TGUgY2hlbWluIGRlIGRlc3RpbmF0aW9uIGEgXHUwMGU5dFx1MDBlOSByXHUwMGU5c29sdSBlbiAnJ3swfScnLiBWb3VsZXotdm91cyBjb250aW51ZXIgPw0KLW92ZXJ3cml0ZURpYWxvZ190ZXh0PUxlIGNoZW1pbiBkZSBkZXN0aW5hdGlvbiAnJ3swfScnIGV4aXN0ZSBkXHUwMGU5alx1MDBlMC4gVG91cyBsZXMgZmljaGllcnMgZHUgZG9zc2llciBzZXJvbnQgc3VwcHJpbVx1MDBlOXMuIFZvdWxlei12b3VzIGNvbnRpbnVlciA/DQotY2FuY2VsUHVibGlzaENvbmZpZ19tc2c9TCdvcFx1MDBlOXJhdGlvbiBkZSBwdWJsaWNhdGlvbiBhIFx1MDBlOXRcdTAwZTkgYW5udWxcdTAwZTllLg0KLQ0KLSMgRXJyb3IgRGlhbG9ncw0KLXByZXZpZXdDb25maWdFcnJvcl90aXRsZT1Qclx1MDBlOXZpc3VhbGlzZXIgbGEgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUgcHVibGlcdTAwZTllDQotdmlld1JlcG9ydEVycm9yX3RpdGxlPUFmZmljaGVyIGxlIHJhcHBvcnQgZGUgcHVibGljYXRpb24NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbWlzc2luZ1ZpZXdFcnJvcl9tc2c9SVVQUDAxMDBXIDogTGEgY29uZmlndXJhdGlvbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTllIG5lIGNvbnRpZW50IHBhcyBkZSB2dWUgdmFsaWRlLiBNb2RpZmlleiBjZXR0ZSBjb25maWd1cmF0aW9uIGV0IGFqb3V0ZXogdW5lIHZ1ZSBvdSBzXHUwMGU5bGVjdGlvbm5leiB1bmUgYXV0cmUgY29uZmlndXJhdGlvbi4NCi1jYW5ub3RQdWJsaXNoRXJyb3JfbXNnPUlVUFAwMTAxRSA6IEltcG9zc2libGUgZGUgcHVibGllciBsYSBjb25maWd1cmF0aW9uIHNcdTAwZTlsZWN0aW9ublx1MDBlOWUuDQotaW52YWxpZFBhdGhFcnJvcl9tc2c9SVVQUDAxMDJFIDogTGUgY2hlbWluIGRlIGRlc3RpbmF0aW9uIGVzdCB2aWVyZ2Ugb3Ugbm9uIHZhbGlkZS4NCi1pbnZhbGlkUGF0aENoYXJzRXJyb3JfbXNnPUlVUFAwMTAzRSA6IExlIGNoZW1pbiBkZSBkZXN0aW5hdGlvbiBuZSBwZXV0IHBhcyBjb250ZW5pciBsZXMgY2FyYWN0XHUwMGU4cmVzIHN1aXZhbnRzIDogXFwgIyAqID8gIiA8ID4gfCAhICUgLw0KLXB1Ymxpc2hDb25maWdFcnJvcl9tc2c9SVVQUDAxMDRFIDogRWNoZWMgZGUgcHVibGljYXRpb24gZGUgbGEgY29uZmlndXJhdGlvbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTllLg0KLXByZXZpZXdDb25maWdFcnJvcl9tc2c9SVVQUDAxMDVFIDogSW1wb3NzaWJsZSBkJ291dnJpciB1biBuYXZpZ2F0ZXVyIEhUTUwgcG91ciBwclx1MDBlOXZpc3VhbGlzZXIgbGEgY29uZmlndXJhdGlvbiBwdWJsaVx1MDBlOWUuDQotdmlld1JlcG9ydEVycm9yX21zZz1JVVBQMDEwNkUgOiBJbXBvc3NpYmxlIGQnb3V2cmlyIHVuIG5hdmlnYXRldXIgSFRNTCBwb3VyIGFmZmljaGVyIGxlIHJhcHBvcnQgZGUgcHVibGljYXRpb24uDQotDQotIyBFcnJvciBSZWFzb25zICYgUmVjb21tZW5kZWQgQWN0aW9ucw0KLXB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb249SVVQUDAxMDdFIDogVW5lIGVycmV1ciBzJ2VzdCBwcm9kdWl0ZS4gU1x1MDBlOWxlY3Rpb25uZXogbGUgYm91dG9uIERcdTAwZTl0YWlscyBwb3VyIHBsdXMgZCdpbmZvcm1hdGlvbnMuDQotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249TGUgY2hlbWluIGRlIGRlc3RpbmF0aW9uICcnezB9JycgY29udGllbnQgZGVzIGZpY2hpZXJzIHF1aSBuZSBwZXV2ZW50IHBhcyBcdTAwZWF0cmUgc3VwcHJpbVx1MDBlOXMuXG5cbkZlcm1leiBjZXR0ZSBib1x1MDBlZXRlIGRlIGRpYWxvZ3VlIGV0IHNwXHUwMGU5Y2lmaWV6IHVuIGF1dHJlIGNoZW1pbi4NCi1jcmVhdGVEaXJFcnJvcl9yZWFzb249SW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIGxlIGNoZW1pbiBkZSBkZXN0aW5hdGlvbiAnJ3swfScnLlxuXG5GZXJtZXogY2V0dGUgYm9cdTAwZWV0ZSBkZSBkaWFsb2d1ZSBldCBzcFx1MDBlOWNpZmlleiB1biBhdXRyZSBjaGVtaW4uDQotb3BlbkJyb3dzZXJFcnJvcl9yZWFzb249SW1wb3NzaWJsZSBkZSBkXHUwMGU5dGVjdGVyIG91IGRlIGxvY2FsaXNlciBsZSBuYXZpZ2F0ZXVyIEhUTUwgcGFyIGRcdTAwZTlmYXV0IHBvdXIgY2Ugc3lzdFx1MDBlOG1lLlxuXG5GZXJtZXogY2V0dGUgYm9cdTAwZWV0ZSBkZSBkaWFsb2d1ZSBldCBvdXZyZXogbGUgZmljaGllciAnJ3swfScnIG1hbnVlbGxlbWVudCBcdTAwZTAgbCcnYWlkZSBkJyd1biBuYXZpZ2F0ZXVyIEhUTUwuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNmJiZWE3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlPVB1YmJsaWNhIGNvbmZpZ3VyYXppb25lIG1ldG9kbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TZWxlemlvbmEgY29uZmlndXJhemlvbmUgbWV0b2RvDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ9U2VsZXppb25hcmUgbGEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvIGNoZSBzaSBkZXNpZGVyYSBwdWJibGljYXJlLg0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0T3B0aW9uc1BhZ2VfdGl0bGU9U3BlY2lmaWNhIG9wemlvbmkgZGkgcHViYmxpY2F6aW9uZQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0T3B0aW9uc1BhZ2VfdGV4dD1TcGVjaWZpY2FyZSBsYSBkaXJlY3RvcnkgZGkgZGVzdGluYXppb25lIGUgbGUgb3B6aW9uaSBkaSBwdWJibGljYXppb25lLg0KLXB1Ymxpc2hDb25maWdXaXphcmRfbWV0aG9kQ29uZmlnX3RleHQ9Q29uZmlndXJhemlvbmUgbWV0b2RvOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGVzdGluYXRpb25Hcm91cF90ZXh0PURpcmVjdG9yeSBkaSBkZXN0aW5hemlvbmUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2RpcmVjdG9yeV90ZXh0PVBlcmNvcnNvOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfdXNlRGVmYXVsdFBhdGhfdGV4dD1VdGlsaXp6YSBwZXJjb3JzbyBwcmVkZWZpbml0bw0KLXB1Ymxpc2hDb25maWdXaXphcmRfd2ViU2l0ZV90ZXh0PVNpdG8gV2ViIHB1YmJsaWNhdG8NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlX3RleHQ9VGl0b2xvOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfYmFubmVySW1hZ2VfdGV4dD1JbW1hZ2luZSBiYW5uZXI6DQotcHVibGlzaENvbmZpZ1dpemFyZF9hYm91dEhUTUxfdGV4dD1JbmZvcm1hemlvbmkgc3VsIGNvbnRlbnV0bzoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2ZlZWRiYWNrVVJMX3RleHQ9VVJMIGZlZWRiYWNrOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUluZGV4X3RleHQ9UHViYmxpY2EgcGFnaW5hIGluZGljZQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUdsb3NzYXJ5X3RleHQ9UHViYmxpY2EgcGFnaW5hIGdsb3NzYXJpbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZVNlYXJjaF90ZXh0PUluY2x1ZGkgZnVuemlvbmFsaXRcdTAwZTAgZGkgcmljZXJjYSAobmVjZXNzYXJpbyBzdXBwb3J0byBhcHBsZXQgSmF2YSBuZWwgYnJvd3NlcikNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3VzZUFwcGxldF90ZXh0PVN1cHBvcnRhIHBlcnNvbmFsaXp6YXppb25lIHZpc3RlIGZ1bnppb25hbGl0XHUwMGUwIGRpIHJpY2VyY2EgKG5lY2Vzc2FyaW8gc3VwcG9ydG8gYXBwbGV0IEphdmEgbmVsIGJyb3dzZXIpDQotcHVibGlzaENvbmZpZ1dpemFyZF92YWxpZGF0aW9uR3JvdXBfdGV4dD1Db252YWxpZGENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NoZWNrSHlwZXJsaW5rc190ZXh0PUNvbnRyb2xsYSBjb2xsZWdhbWVudGkgaXBlcnRlc3R1YWxpIGVzdGVybmkNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2RpYWdyYW1Hcm91cF90ZXh0PURpYWdyYW1taQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlfZGRfdGV4dD1QdWJibGljYSBkaWFncmFtbWkgZGV0dGFnbGkgYXR0aXZpdFx1MDBlMCBjaGUgbm9uIHNvbm8gc3RhdGkgY3JlYXRpIG5lbGwnZWRpdG9yIGRpIHByb2Nlc3NpDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVB1YmJsaWNhcmUgaSBkaWFncmFtbWkgZGkgYXR0aXZpdFx1MDBlMCBwZXIgbGUgZXN0ZW5zaW9uaSBhdHRpdml0XHUwMGUwIG5vbiBtb2RpZmljYXRlDQotcHVibGlzaENvbmZpZ1dpemFyZF9jb252ZXJ0QnJva2VuTGlua3NfdGV4dD1Db252ZXJ0aXJlIGkgY29sbGVnYW1lbnRpIGRhbm5lZ2dpYXRpIGluIHRlc3RvIG5vbiBjb2RpZmljYXRvDQotcHVibGlzaENvbmZpZ1dpemFyZF9sYXlvdXRfdGV4dD1MYXlvdXQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2V4dHJhRGVzY3JpcHRvckluZm9fdGV4dD1QdWJibGljYXJlIGkgZGVzY3JpdHRvcmkgY29uIGlsIGNvbnRlbnV0byBjb21wbGV0byBkZWxsJ2VsZW1lbnRvIGNvbnRlbnV0byBkZWwgbWV0b2RvIGNvcnJlbGF0bw0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGlnaHRXZWlnaHRUcmVlX3RleHQ9R2VuZXJhcmUgdW5hIHN0cnV0dHVyYSBhZCBhbGJlcm8gc2Vjb25kYXJpYSBwZXIgZ2xpIGVsZW1lbnRpIGF0dGl2aXRcdTAwZTAsIHJ1b2xvLCBwcm9kb3R0aSBkaSBsYXZvcm8gZSBkaXNjaXBsaW5hIHNlbnphIHV0aWxpenphcmUgY2FydGVsbGUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVFbXB0eUNhdGVnb3JpZXNfdGV4dD1QdWJibGljYXJlIGxlIGNhdGVnb3JpZSBzZW56YSBlbGVtZW50aSBjYXRlZ29yaXp6YXRpDQotDQotIyBwdWJsaXNoIHByb2Nlc3Mgd2l6YXJkIHBhZ2UNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGl0bGU9U2VsZXppb25hIHRpcG8gZGkgcHViYmxpY2F6aW9uZQ0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV90ZXh0PVx1MDBjOCBwb3NzaWJpbGUgcHViYmxpY2FyZSBsYSBjb25maWd1cmF6aW9uZSBzZWxlemlvbmF0YSBvIGkgcHJvY2Vzc2kgc3BlY2lmaWNhdGkgbmVsbGEgY29uZmlndXJhemlvbmUNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfY2FwYWJpbGl0eV9wYXR0ZXJuPU1vZGVsbGkgZGkgY2FwYWNpdFx1MDBlMA0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9kZWxpdmVyeV9wcm9jZXNzPVByb2Nlc3NpIGRpIHByb2R1emlvbmUNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfc2VsZWN0VHlwZT1TZWxlemlvbmEgdGlwbyBkaSBwdWJibGljYXppb25lDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3R5cGVfcHJvY2Vzc2VzPVB1YmJsaWNhIGkgcHJvY2Vzc2kgc2VsZXppb25hdGkgZGkgc2VndWl0bzoNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfdHlwZV9jb25maWc9UHViYmxpY2EgbGEgY29uZmlndXJhemlvbmUgc2VsZXppb25hdGENCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfcHVibGlzaF9iYXNlX3Byb2Nlc3Nlcz1QdWJibGljYSBpIHByb2Nlc3NpIGRpIGJhc2UgYSBjdWkgc2kgZmEgcmlmZXJpbWVudG8NCi0NCi0jIFB1Ymxpc2hpbmcgUHJlZmVyZW5jZSBQYWdlDQotcHJlZmVyZW5jZVBhZ2VfZGVmYXVsdFBhdGhfdGV4dD1QZXJjb3JzbyBwcmVkZWZpbml0bzoNCi0NCi0jIENvbmZpcm1hdGlvbiBEaWFsb2dzDQotcHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZT1QdWJibGljYSBjb25maWd1cmF6aW9uZSBtZXRvZG8NCi1jb25maXJtUGF0aERpYWxvZ190ZXh0PUlsIHBlcmNvcnNvIGRpIGRlc3RpbmF6aW9uZSBcdTAwZTggc3RhdG8gcmlzb2x0byBpbiAnJ3swfScnLiBQcm9jZWRlcmU/DQotb3ZlcndyaXRlRGlhbG9nX3RleHQ9SWwgcGVyY29yc28gZGkgZGVzdGluYXppb25lICcnezB9JycgZXNpc3RlIGdpXHUwMGUwLiBUdXR0aSBpIGZpbGUgbmVsbGEgY2FydGVsbGEgdmVycmFubm8gZWxpbWluYXRpLiBQcm9jZWRlcmU/DQotY2FuY2VsUHVibGlzaENvbmZpZ19tc2c9TCdvcGVyYXppb25lIGRpIHB1YmJsaWNhemlvbmUgXHUwMGU4IHN0YXRhIGFubnVsbGF0YS4NCi0NCi0jIEVycm9yIERpYWxvZ3MNCi1wcmV2aWV3Q29uZmlnRXJyb3JfdGl0bGU9QW50ZXByaW1hIGNvbmZpZ3VyYXppb25lIG1ldG9kbyBwdWJibGljYXRhDQotdmlld1JlcG9ydEVycm9yX3RpdGxlPVZpc3VhbGl6emEgcmVwb3J0IGRpIHB1YmJsaWNhemlvbmUNCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbWlzc2luZ1ZpZXdFcnJvcl9tc2c9SVVQUDAxMDBXOiBMYSBjb25maWd1cmF6aW9uZSBzZWxlemlvbmF0YSBub24gY29udGllbmUgdW4gdmlzdGEgdmFsaWRhLiBNb2RpZmljYXJlIGxhIGNvbmZpZ3VyYXppb25lIGUgYWdnaXVuZ2VyZSB1bmEgdmlzdGEgb3BwdXJlIHNlbGV6aW9uYXJlIHVuJ2FsdHJhIGNvbmZpZ3VyYXppb25lLg0KLWNhbm5vdFB1Ymxpc2hFcnJvcl9tc2c9SVVQUDAxMDFFOiBJbXBvc3NpYmlsZSBwdWJibGljYXJlIGxhIGNvbmZpZ3VyYXppb25lIHNlbGV6aW9uYXRhLg0KLWludmFsaWRQYXRoRXJyb3JfbXNnPUlVUFAwMTAyRTogSWwgcGVyY29yc28gZGkgZGVzdGluYXppb25lIFx1MDBlOCB2dW90byBvcHB1cmUgbm9uIFx1MDBlOCB2YWxpZG8uDQotaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZz1JVVBQMDEwM0U6IElsIHBlcmNvcnNvIGRpIGRlc3RpbmF6aW9uZSBub24gcHVcdTAwZjIgY29udGVuZXJlIGkgc2VndWVudGkgY2FyYXR0ZXJpOiBcXCAjICogPyAiIDwgPiB8ICEgJSAvDQotcHVibGlzaENvbmZpZ0Vycm9yX21zZz1JVVBQMDEwNEU6IExhIGNvbmZpZ3VyYXppb25lIHNlbGV6aW9uYXRhIG5vbiBcdTAwZTggc3RhdGEgcHViYmxpY2F0YSBjb3JyZXR0YW1lbnRlLg0KLXByZXZpZXdDb25maWdFcnJvcl9tc2c9SVVQUDAxMDVFOiBJbXBvc3NpYmlsZSBhcHJpcmUgdW4gYnJvd3NlciBIVE1MIHBlciB2aXN1YWxpenphcmUgbCdhbnRlcHJpbWEgZGVsbGEgY29uZmlndXJhemlvbmUgcHViYmxpY2F0YS4NCi12aWV3UmVwb3J0RXJyb3JfbXNnPUlVUFAwMTA2RTogSW1wb3NzaWJpbGUgYXByaXJlIHVuIGJyb3dzZXIgSFRNTCBwZXIgdmlzdWFsaXp6YXJlIGlsIHJlcG9ydCBkaSBwdWJibGljYXppb25lLg0KLQ0KLSMgRXJyb3IgUmVhc29ucyAmIFJlY29tbWVuZGVkIEFjdGlvbnMNCi1wdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uPUlVUFAwMTA3RTogU2kgXHUwMGU4IHZlcmlmaWNhdG8gdW4gZXJyb3JlLiBTZWxlemlvbmFyZSBpbCBwdWxzYW50ZSBEZXR0YWdsaSBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4NCi1kZWxldGVGaWxlc0Vycm9yX3JlYXNvbj1JbCBwZXJjb3JzbyBkaSBkZXN0aW5hemlvbmUgJyd7MH0nJyBjb250aWVuZSBmaWxlIGNoZSBub24gcG9zc29ubyBlc3NlcmUgZWxpbWluYXRpLlxuXG5DaGl1ZGVyZSBxdWVzdGEgZmluZXN0cmEgZGkgZGlhbG9nbyBlIHNwZWNpZmljYXJlIHVuIGFsdHJvIHBlcmNvcnNvLg0KLWNyZWF0ZURpckVycm9yX3JlYXNvbj1JbXBvc3NpYmlsZSBjcmVhcmUgaWwgcGVyY29yc28gZGkgZGVzdGluYXppb25lICcnezB9JycuXG5cbkNoaXVkZXJlIHF1ZXN0YSBmaW5lc3RyYSBkaSBkaWFsb2dvIGUgc3BlY2lmaWNhcmUgdW4gYWx0cm8gcGVyY29yc28uDQotb3BlbkJyb3dzZXJFcnJvcl9yZWFzb249SW1wb3NzaWJpbGUgaW5kaXZpZHVhcmUgbyB0cm92YXJlIGlsIGJyb3dzZXIgSFRNTCBwcmVkZWZpbml0byBzdSBxdWVzdG8gc2lzdGVtYS5cblxuQ2hpdWRlcmUgcXVlc3RhIGZpbmVzdHJhIGRpIGRpYWxvZ28gZSBhcHJpcmUgaWwgZmlsZSAnJ3swfScnIG1hbnVhbG1lbnRlIGNvbiB1biBicm93c2VyIEhUTUwuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTExYmMwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA2ZVx1NTE2Y1x1OTU4Yg0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTBcdTMwNmVcdTkwNzhcdTYyOWUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGV4dD1cdTUxNmNcdTk1OGJcdTMwNTlcdTMwOGJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTBcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RpdGxlPVx1NTE2Y1x1OTU4Ylx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZVx1NjMwN1x1NWI5YQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0T3B0aW9uc1BhZ2VfdGV4dD1cdTViOWJcdTUxNDhcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNjhcdTUxNmNcdTk1OGJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX21ldGhvZENvbmZpZ190ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMDoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Rlc3RpbmF0aW9uR3JvdXBfdGV4dD1cdTViOWJcdTUxNDhcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmMNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2RpcmVjdG9yeV90ZXh0PVx1MzBkMVx1MzBiOToNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3VzZURlZmF1bHRQYXRoX3RleHQ9XHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGZiXHUzMGQxXHUzMGI5XHUzMDkyXHU0ZjdmXHU3NTI4DQotcHVibGlzaENvbmZpZ1dpemFyZF93ZWJTaXRlX3RleHQ9XHU1MTZjXHU5NThiXHUzMDU5XHUzMDhiIFdlYiBcdTMwYjVcdTMwYTRcdTMwYzgNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlX3RleHQ9XHU4ODY4XHU5ODRjOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfYmFubmVySW1hZ2VfdGV4dD1cdTMwZDBcdTMwY2FcdTMwZmNcdTMwZmJcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjg6DQotcHVibGlzaENvbmZpZ1dpemFyZF9hYm91dEhUTUxfdGV4dD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNmJcdTMwNjRcdTMwNDRcdTMwNjY6DQotcHVibGlzaENvbmZpZ1dpemFyZF9mZWVkYmFja1VSTF90ZXh0PVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjOVx1MzBkMFx1MzBjM1x1MzBhZiBVUkw6DQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlSW5kZXhfdGV4dD1cdTdkMjJcdTVmMTVcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmVcdTUxNmNcdTk1OGINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVHbG9zc2FyeV90ZXh0PVx1NzUyOFx1OGE5ZVx1OTZjNlx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2ZVx1NTE2Y1x1OTU4Yg0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZVNlYXJjaF90ZXh0PVx1NjkxY1x1N2QyMlx1NmE1Zlx1ODBmZFx1MzA5Mlx1N2Q0NFx1MzA3Zlx1OGZiY1x1MzA4MCAoXHUzMGQ2XHUzMGU5XHUzMGE2XHUzMGI2XHUzMGZjXHUzMDRjIEphdmEgXHUzMGEyXHUzMGQ3XHUzMGVjXHUzMGMzXHUzMGM4XHUzMDZiXHU1YmZlXHU1ZmRjXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5KQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfdXNlQXBwbGV0X3RleHQ9XHUzMGQzXHUzMGU1XHUzMGZjXHUzMDZlXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDkyXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4IChcdTMwZDZcdTMwZTlcdTMwYTZcdTMwYjZcdTMwZmNcdTMwNGMgSmF2YSBcdTMwYTJcdTMwZDdcdTMwZWNcdTMwYzNcdTMwYzhcdTMwNmJcdTViZmVcdTVmZGNcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTkpDQotcHVibGlzaENvbmZpZ1dpemFyZF92YWxpZGF0aW9uR3JvdXBfdGV4dD1cdTY5MWNcdThhM2MNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NoZWNrSHlwZXJsaW5rc190ZXh0PVx1NTkxNlx1OTBlOFx1MzBjZlx1MzBhNFx1MzBkMVx1MzBmY1x1MzBlYVx1MzBmM1x1MzBhZlx1MzA2ZVx1NjkxY1x1NjdmYg0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlhZ3JhbUdyb3VwX3RleHQ9XHUzMGMwXHUzMGE0XHUzMGEyXHUzMGIwXHUzMGU5XHUzMGUwDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzBmYlx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA2N1x1NGY1Y1x1NjIxMFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA2YVx1MzA0NFx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1OGE3M1x1N2QzMFx1NTZmM1x1MzA2ZVx1NTE2Y1x1OTU4Yg0KLXB1Ymxpc2hDb25maWdXaXphcmRfcHVibGlzaF9leHRlbmRfYWN0aXZpdHlfZGlhZ3JhbT1cdTU5MDlcdTY2ZjRcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwNmFcdTMwNDRcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTYyZTFcdTVmMzVcdTMwNmVcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTU2ZjNcdTMwNmVcdTUxNmNcdTk1OGINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NvbnZlcnRCcm9rZW5MaW5rc190ZXh0PVx1MzBlYVx1MzBmM1x1MzBhZlx1NTIwN1x1MzA4Y1x1MzA5Mlx1MzBkN1x1MzBlY1x1MzBmY1x1MzBmM1x1MzBmYlx1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2Ylx1NTkwOVx1NjNkYg0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGF5b3V0X3RleHQ9XHUzMGVjXHUzMGE0XHUzMGEyXHUzMGE2XHUzMGM4DQotcHVibGlzaENvbmZpZ1dpemFyZF9leHRyYURlc2NyaXB0b3JJbmZvX3RleHQ9XHU5NWEyXHU5MDIzXHUzMDU5XHUzMDhiXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHU4OTgxXHU3ZDIwXHUzMDZlXHU1YjhjXHU1MTY4XHUzMDZhXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDkyXHU1NDJiXHUzMDgwXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDZlXHU1MTZjXHU5NThiDQotcHVibGlzaENvbmZpZ1dpemFyZF9saWdodFdlaWdodFRyZWVfdGV4dD1cdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzBcdTMwZmNcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNWJcdTMwNWFcdTMwNmJcdTMwYmZcdTMwYjlcdTMwYWZcdTMwMDFcdTMwZWRcdTMwZmNcdTMwZWJcdTMwMDFcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTMwMDFcdTMwNGFcdTMwODhcdTMwNzNcdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2VcdTg5ODFcdTdkMjBcdTMwNmVcdTMwYjVcdTMwZDZcdTMwYzRcdTMwZWFcdTMwZmNcdTY5Y2JcdTkwMjBcdTMwOTJcdTc1MWZcdTYyMTANCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVFbXB0eUNhdGVnb3JpZXNfdGV4dD1cdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTUzMTZcdTMwNTVcdTMwOGNcdTMwNWZcdTg5ODFcdTdkMjBcdTMwNGNcdTMwNmFcdTMwNDRcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTMwNmVcdTUxNmNcdTk1OGINCi0NCi0jIHB1Ymxpc2ggcHJvY2VzcyB3aXphcmQgcGFnZQ0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV90aXRsZT1cdTUxNmNcdTk1OGJcdTMwYmZcdTMwYTRcdTMwZDdcdTMwNmVcdTkwNzhcdTYyOWUNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGV4dD1cdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTY5Y2JcdTYyMTBcdTMwN2VcdTMwNWZcdTMwNmZcdTY5Y2JcdTYyMTBcdTMwNjdcdTYzMDdcdTViOWFcdTMwNTdcdTMwNWZcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmVcdTMwNDRcdTMwNWFcdTMwOGNcdTMwNGJcdTMwOTJcdTUxNmNcdTk1OGJcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNTkNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfY2FwYWJpbGl0eV9wYXR0ZXJuPVx1MzBiMVx1MzBmY1x1MzBkMVx1MzBkM1x1MzBlYVx1MzBjNlx1MzBhM1x1MzBmY1x1MzBmYlx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmMw0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9kZWxpdmVyeV9wcm9jZXNzPVx1MzBjN1x1MzBlYVx1MzBkMFx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOQ0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9zZWxlY3RUeXBlPVx1NTE2Y1x1OTU4Ylx1MzBiZlx1MzBhNFx1MzBkN1x1MzA2ZVx1OTA3OFx1NjI5ZQ0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF90eXBlX3Byb2Nlc3Nlcz1cdTRlZTVcdTRlMGJcdTMwNjdcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmVcdTUxNmNcdTk1OGI6DQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3R5cGVfY29uZmlnPVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1NjljYlx1NjIxMFx1MzA2ZVx1NTE2Y1x1OTU4Yg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9wdWJsaXNoX2Jhc2VfcHJvY2Vzc2VzPVx1NTNjMlx1NzE2N1x1MzA1NVx1MzA4Y1x1MzA4Ylx1NTdmYVx1NjcyY1x1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2ZVx1NTE2Y1x1OTU4Yg0KLQ0KLSMgUHVibGlzaGluZyBQcmVmZXJlbmNlIFBhZ2UNCi1wcmVmZXJlbmNlUGFnZV9kZWZhdWx0UGF0aF90ZXh0PVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzBmYlx1MzBkMVx1MzBiOToNCi0NCi0jIENvbmZpcm1hdGlvbiBEaWFsb2dzDQotcHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTBcdTMwNmVcdTUxNmNcdTk1OGINCi1jb25maXJtUGF0aERpYWxvZ190ZXh0PVx1NWI5Ylx1NTE0OFx1MzBkMVx1MzBiOVx1MzA2ZiAnJ3swfScnIFx1MzA2Ylx1ODllM1x1NmM3YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiBcdTdkOWFcdTg4NGNcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotb3ZlcndyaXRlRGlhbG9nX3RleHQ9XHU1YjliXHU1MTQ4XHUzMGQxXHUzMGI5ICcnezB9JycgXHUzMDZmXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzA1M1x1MzA2ZVx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1NTE4NVx1MzA2ZVx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NTI0YVx1OTY2NFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTdkOWFcdTg4NGNcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotY2FuY2VsUHVibGlzaENvbmZpZ19tc2c9XHU1MTZjXHU5NThiXHU2NGNkXHU0ZjVjXHUzMDZmXHU1M2Q2XHUzMDhhXHU2ZDg4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyDQotDQotIyBFcnJvciBEaWFsb2dzDQotcHJldmlld0NvbmZpZ0Vycm9yX3RpdGxlPVx1NTE2Y1x1OTU4Ylx1NmUwOFx1MzA3Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA2ZVx1MzBkN1x1MzBlY1x1MzBkM1x1MzBlNVx1MzBmYw0KLXZpZXdSZXBvcnRFcnJvcl90aXRsZT1cdTUxNmNcdTk1OGJcdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNmVcdTg4NjhcdTc5M2ENCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbWlzc2luZ1ZpZXdFcnJvcl9tc2c9SVVQUDAxMDBXOiBcdTY3MDlcdTUyYjlcdTMwNmFcdTMwZDNcdTMwZTVcdTMwZmNcdTMwOTJcdTU0MmJcdTMwN2VcdTMwNmFcdTMwNDRcdTY5Y2JcdTYyMTBcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHU2OWNiXHU2MjEwXHUzMDkyXHU3ZGU4XHU5NmM2XHUzMDU3XHUzMDY2XHUzMGQzXHUzMGU1XHUzMGZjXHUzMDkyXHU4ZmZkXHU1MmEwXHUzMDU5XHUzMDhiXHUzMDRiXHUzMDAxXHU1MjI1XHUzMDZlXHU2OWNiXHU2MjEwXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotY2Fubm90UHVibGlzaEVycm9yX21zZz1JVVBQMDEwMUU6IFx1NTE2Y1x1OTU4Ylx1MzA2N1x1MzA0ZFx1MzA2YVx1MzA0NFx1NjljYlx1NjIxMFx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMg0KLWludmFsaWRQYXRoRXJyb3JfbXNnPUlVUFAwMTAyRTogXHU1YjliXHU1MTQ4XHUzMGQxXHUzMGI5XHUzMDRjXHU3YTdhXHUzMDdlXHUzMDVmXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyDQotaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZz1JVVBQMDEwM0U6IFx1NmIyMVx1MzA2ZVx1NjU4N1x1NWI1N1x1MzA2Zlx1NWI5Ylx1NTE0OFx1MzBkMVx1MzBiOVx1MzA2Ylx1NGY3Zlx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzogXFwgIyAqID8gIiA8ID4gfCAhICUgLw0KLXB1Ymxpc2hDb25maWdFcnJvcl9tc2c9SVVQUDAxMDRFOiBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTY5Y2JcdTYyMTBcdTMwNGNcdTZiNjNcdTVlMzhcdTMwNmJcdTUxNmNcdTk1OGJcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDINCi1wcmV2aWV3Q29uZmlnRXJyb3JfbXNnPUlVUFAwMTA1RTogXHU1MTZjXHU5NThiXHUzMDU3XHUzMDVmXHU2OWNiXHU2MjEwXHUzMDkyXHUzMGQ3XHUzMGVjXHUzMGQzXHUzMGU1XHUzMGZjXHUzMDU5XHUzMDhiIEhUTUwgXHUzMGQ2XHUzMGU5XHUzMGE2XHUzMGI2XHUzMGZjXHUzMDkyXHU5NThiXHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotdmlld1JlcG9ydEVycm9yX21zZz1JVVBQMDEwNkU6IFx1NTE2Y1x1OTU4Ylx1MzBlY1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA5Mlx1ODg2OFx1NzkzYVx1MzA1OVx1MzA4YiBIVE1MIFx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiNlx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLQ0KLSMgRXJyb3IgUmVhc29ucyAmIFJlY29tbWVuZGVkIEFjdGlvbnMNCi1wdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uPUlVUFAwMTA3RTogXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIFx1OGE3M1x1MzA1N1x1MzA0Zlx1MzA2Zlx1MzAwMVx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzBkY1x1MzBiZlx1MzBmM1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVx1NWI5Ylx1NTE0OFx1MzBkMVx1MzBiOSAnJ3swfScnIFx1MzA2Ylx1MzAwMVx1NTI0YVx1OTY2NFx1MzA2N1x1MzA0ZFx1MzA2YVx1MzA0NFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMlxuXG5cdTMwNTNcdTMwNmVcdTMwYzBcdTMwYTRcdTMwYTJcdTMwZWRcdTMwYjBcdTMwOTJcdTk1ODlcdTMwNThcdTMwNjZcdTMwMDFcdTUyMjVcdTMwNmVcdTMwZDFcdTMwYjlcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1jcmVhdGVEaXJFcnJvcl9yZWFzb249XHU1YjliXHU1MTQ4XHUzMGQxXHUzMGI5ICcnezB9JycgXHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cblx1MzA1M1x1MzA2ZVx1MzBjMFx1MzBhNFx1MzBhMlx1MzBlZFx1MzBiMFx1MzA5Mlx1OTU4OVx1MzA1OFx1MzA2Nlx1MzAwMVx1NTIyNVx1MzA2ZVx1MzBkMVx1MzBiOVx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLW9wZW5Ccm93c2VyRXJyb3JfcmVhc29uPVx1MzA1M1x1MzA2ZVx1MzBiN1x1MzBiOVx1MzBjNlx1MzBlMFx1MzA2ZVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOCBIVE1MIFx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiNlx1MzBmY1x1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXG5cdTMwNTNcdTMwNmVcdTMwYzBcdTMwYTRcdTMwYTJcdTMwZWRcdTMwYjBcdTMwOTJcdTk1ODlcdTMwNThcdTMwNjZcdTMwMDFIVE1MIFx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiNlx1MzBmY1x1MzA2N1x1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiAnJ3swfScnIFx1MzA5Mlx1NjI0Ylx1NTJkNVx1MzA2N1x1OTU4Ylx1MzA0NFx1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTg0M2VjMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24gV2l6YXJkDQotcHVibGlzaENvbmZpZ1dpemFyZF90aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxIFx1YWNmNVx1YWMxYw0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxIFx1YzEyMFx1ZDBkZA0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVx1YWNmNVx1YWMxY1x1ZDU2MCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RpdGxlPVx1YWNmNVx1YWMxYyBcdWM2MzVcdWMxNTggXHVjOWMwXHVjODE1DQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RPcHRpb25zUGFnZV90ZXh0PVx1YjMwMFx1YzBjMSBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWNcdWM2NDAgXHVhY2Y1XHVhYzFjIFx1YzYzNVx1YzE1OFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcHVibGlzaENvbmZpZ1dpemFyZF9tZXRob2RDb25maWdfdGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGVzdGluYXRpb25Hcm91cF90ZXh0PVx1YjMwMFx1YzBjMSBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWMNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2RpcmVjdG9yeV90ZXh0PVx1YWNiZFx1Yjg1YzoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3VzZURlZmF1bHRQYXRoX3RleHQ9XHVhZTMwXHViY2Y4IFx1YWNiZFx1Yjg1YyBcdWMwYWNcdWM2YTkNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3dlYlNpdGVfdGV4dD1cdWFjZjVcdWFjMWNcdWI0MWMgXHVjNmY5IFx1YzBhY1x1Yzc3NFx1ZDJiOA0KLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGVfdGV4dD1cdWM4MWNcdWJhYTk6DQotcHVibGlzaENvbmZpZ1dpemFyZF9iYW5uZXJJbWFnZV90ZXh0PVx1YmMzMFx1YjEwOCBcdWM3NzRcdWJiZjhcdWM5YzA6DQotcHVibGlzaENvbmZpZ1dpemFyZF9hYm91dEhUTUxfdGV4dD1cdWNlZThcdWQxNTBcdWNlMjAgXHVjODE1XHViY2Y0Og0KLXB1Ymxpc2hDb25maWdXaXphcmRfZmVlZGJhY2tVUkxfdGV4dD1cdWQ1M2NcdWI0ZGNcdWJjMzEgVVJMOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUluZGV4X3RleHQ9XHVjMGM5XHVjNzc4IFx1ZDM5OFx1Yzc3NFx1YzljMCBcdWFjZjVcdWFjMWMNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVHbG9zc2FyeV90ZXh0PVx1YzZhOVx1YzViNFx1YzlkMSBcdWQzOThcdWM3NzRcdWM5YzAgXHVhY2Y1XHVhYzFjDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlU2VhcmNoX3RleHQ9XHVhYzgwXHVjMGM5IFx1YWUzMFx1YjJhNSBcdWQzZWNcdWQ1NjgoXHViZTBjXHViNzdjXHVjNmIwXHVjODAwXHVjNzU4IEphdmEgXHVjNTYwXHVkNTBjXHViOWJmIFx1YzljMFx1YzZkMFx1Yzc3NCBcdWQ1NDRcdWM2OTRcdWQ1NjgpDQotcHVibGlzaENvbmZpZ1dpemFyZF91c2VBcHBsZXRfdGV4dD1cdWJjZjRcdWFlMzAgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWM5YzBcdWM2ZDAoXHViZTBjXHViNzdjXHVjNmIwXHVjODAwXHVjNzU4IEphdmEgXHVjNTYwXHVkNTBjXHViOWJmIFx1YzljMFx1YzZkMFx1Yzc3NCBcdWQ1NDRcdWM2OTRcdWQ1NjgpDQotcHVibGlzaENvbmZpZ1dpemFyZF92YWxpZGF0aW9uR3JvdXBfdGV4dD1cdWM3MjBcdWQ2YThcdWMxMzEgXHVhYzgwXHVjOTlkDQotcHVibGlzaENvbmZpZ1dpemFyZF9jaGVja0h5cGVybGlua3NfdGV4dD1cdWM2NzhcdWJkODAgXHVkNTU4XHVjNzc0XHVkMzdjXHViOWMxXHVkMDZjIFx1YWM4MFx1YzBhYw0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlhZ3JhbUdyb3VwX3RleHQ9XHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4DQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWQzYjhcdWM5ZDFcdWFlMzBcdWM1ZDBcdWMxMWMgXHVjNzkxXHVjMTMxXHViNDE4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWQ2NWNcdWIzZDkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWFjZjVcdWFjMWMNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09XHVjMjE4XHVjODE1XHViNDE4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWQ2NWNcdWIzZDkgXHVkNjU1XHVjN2E1XHVjNzkwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWQ2NWNcdWIzZDkgXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1YWNmNVx1YWMxYw0KLXB1Ymxpc2hDb25maWdXaXphcmRfY29udmVydEJyb2tlbkxpbmtzX3RleHQ9XHViMDRhXHVjNWI0XHVjOWM0IFx1YjljMVx1ZDA2Y1x1Yjk3YyBcdWM3N2NcdWJjMTggXHVkMTRkXHVjMmE0XHVkMmI4XHViODVjIFx1YmNjMFx1ZDY1OA0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGF5b3V0X3RleHQ9XHViODA4XHVjNzc0XHVjNTQ0XHVjNmMzDQotcHVibGlzaENvbmZpZ1dpemFyZF9leHRyYURlc2NyaXB0b3JJbmZvX3RleHQ9XHVhZDAwXHViODI4XHViNDFjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjXHVjNzU4IFx1YzgwNFx1Y2NiNCBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgXHVhYzE2XHVhY2UwIFx1Yzc4OFx1YjI5NCBcdWMxMjRcdWJhODVcdWM3OTAgXHVhY2Y1XHVhYzFjDQotcHVibGlzaENvbmZpZ1dpemFyZF9saWdodFdlaWdodFRyZWVfdGV4dD1cdWQzZjRcdWIzNTRcdWI5N2MgXHVjMGFjXHVjNmE5XHVkNTU4XHVjOWMwIFx1YzU0YVx1YWNlMCBcdWQwYzBcdWMyYTRcdWQwNmMsIFx1YzVlZFx1ZDU2MCwgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWJjMGYgXHVjNmQwXHVjZTU5IFx1YzY5NFx1YzE4Y1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVkNTU4XHVjNzA0IFx1ZDJiOFx1YjlhYyBcdWFkNmNcdWM4NzAgXHVjMGRkXHVjMTMxDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlRW1wdHlDYXRlZ29yaWVzX3RleHQ9XHViZDg0XHViOTU4XHViNDFjIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWM1YzZcdWIyOTQgXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjIFx1YWNmNVx1YWMxYw0KLQ0KLSMgcHVibGlzaCBwcm9jZXNzIHdpemFyZCBwYWdlDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX3RpdGxlPVx1YWNmNVx1YWMxYyBcdWM3MjBcdWQ2MTUgXHVjMTIwXHVkMGRkDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX3RleHQ9XHVjMTIwXHVkMGRkXHVkNTVjIFx1YWQ2Y1x1YzEzMVx1Yzc3NFx1YjA5OCBcdWFkNmNcdWMxMzFcdWM1ZDBcdWMxMWMgXHVjOWMwXHVjODE1XHVkNTVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yjk3YyBcdWFjZjVcdWFjMWNcdWQ1NjAgXHVjMjE4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfY2FwYWJpbGl0eV9wYXR0ZXJuPVx1YWUzMFx1YjJhNSBcdWQzMjhcdWQxMzQNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfZGVsaXZlcnlfcHJvY2Vzcz1cdWM4MDRcdWIyZWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3NlbGVjdFR5cGU9XHVhY2Y1XHVhYzFjIFx1YzcyMFx1ZDYxNSBcdWMxMjBcdWQwZGQNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfdHlwZV9wcm9jZXNzZXM9XHVjNTQ0XHViNzk4IFx1YzEyMFx1ZDBkZFx1YjQxYyBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVhY2Y1XHVhYzFjOg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF90eXBlX2NvbmZpZz1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVhZDZjXHVjMTMxIFx1YWNmNVx1YWMxYw0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9wdWJsaXNoX2Jhc2VfcHJvY2Vzc2VzPVx1Y2MzOFx1Yzg3MFx1YjQxYyBcdWFlMzBcdWJjZjggXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1YWNmNVx1YWMxYw0KLQ0KLSMgUHVibGlzaGluZyBQcmVmZXJlbmNlIFBhZ2UNCi1wcmVmZXJlbmNlUGFnZV9kZWZhdWx0UGF0aF90ZXh0PVx1YWUzMFx1YmNmOCBcdWFjYmRcdWI4NWM6DQotDQotIyBDb25maXJtYXRpb24gRGlhbG9ncw0KLXB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU9XHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMSBcdWFjZjVcdWFjMWMNCi1jb25maXJtUGF0aERpYWxvZ190ZXh0PVx1YjMwMFx1YzBjMSBcdWFjYmRcdWI4NWNcdWFjMDAgJyd7MH0nJyhcdWM3M2MpXHViODVjIFx1ZDU3NFx1YzExZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLW92ZXJ3cml0ZURpYWxvZ190ZXh0PScnezB9JycgXHViMzAwXHVjMGMxIFx1YWNiZFx1Yjg1Y1x1YWMwMCBcdWM3NzRcdWJiZjggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWQzZjRcdWIzNTRcdWM3NTggXHViYWE4XHViNGUwIFx1ZDMwY1x1Yzc3Y1x1Yzc3NCBcdWMwYWRcdWM4MWNcdWI0MjlcdWIyYzhcdWIyZTQuIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCi1jYW5jZWxQdWJsaXNoQ29uZmlnX21zZz1cdWFjZjVcdWFjMWMgXHVjODcwXHVjNzkxXHVjNzc0IFx1Y2RlOFx1YzE4Y1x1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIEVycm9yIERpYWxvZ3MNCi1wcmV2aWV3Q29uZmlnRXJyb3JfdGl0bGU9XHVhY2Y1XHVhYzFjXHViNDFjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzEgXHViYmY4XHViOWFjXHViY2Y0XHVhZTMwDQotdmlld1JlcG9ydEVycm9yX3RpdGxlPVx1YWNmNVx1YWMxYyBcdWJjZjRcdWFjZTBcdWMxMWMgXHViY2Y0XHVhZTMwDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLW1pc3NpbmdWaWV3RXJyb3JfbXNnPUlVUFAwMTAwVzogXHVjMTIwXHVkMGRkXHVkNTVjIFx1YWQ2Y1x1YzEzMVx1YzVkMCBcdWM2MmNcdWJjMTRcdWI5NzggXHViY2Y0XHVhZTMwXHVhYzAwIFx1ZDNlY1x1ZDU2OFx1YjQxOFx1YzViNCBcdWM3ODhcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LiBcdWFkNmNcdWMxMzFcdWM3NDQgXHVkM2I4XHVjOWQxXHVkNTU4XHVhY2UwIFx1YmNmNFx1YWUzMFx1Yjk3YyBcdWNkOTRcdWFjMDBcdWQ1NThcdWFjNzBcdWIwOTgsIFx1YjJlNFx1Yjk3OCBcdWFkNmNcdWMxMzFcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWNhbm5vdFB1Ymxpc2hFcnJvcl9tc2c9SVVQUDAxMDFFOiBcdWMxMjBcdWQwZGRcdWQ1NWMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YWNmNVx1YWMxY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWludmFsaWRQYXRoRXJyb3JfbXNnPUlVUFAwMTAyRTogXHViMzAwXHVjMGMxIFx1YWNiZFx1Yjg1Y1x1YWMwMCBcdWFjZjVcdWJjMzFcdWM3NzRcdWFjNzBcdWIwOTggXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi1pbnZhbGlkUGF0aENoYXJzRXJyb3JfbXNnPUlVUFAwMTAzRTogXHViMzAwXHVjMGMxIFx1YWNiZFx1Yjg1Y1x1YzVkMCBcXCAjICogPyAiIDwgPiB8ICUgLw0KLXB1Ymxpc2hDb25maWdFcnJvcl9tc2c9SVVQUDAxMDRFOiBcdWMxMjBcdWQwZGRcdWQ1NWMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YWNmNVx1YWMxY1x1ZDU1OFx1YzljMCBcdWJhYmJcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotcHJldmlld0NvbmZpZ0Vycm9yX21zZz1JVVBQMDEwNUU6IFx1YWNmNVx1YWMxY1x1YjQxYyBcdWFkNmNcdWMxMzFcdWM3NDQgXHViYmY4XHViOWFjXHViY2Y0XHVhZTMwIFx1YzcwNFx1ZDU3NCBIVE1MIFx1YmUwY1x1Yjc3Y1x1YzZiMFx1YzgwMFx1Yjk3YyBcdWM1ZjQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi12aWV3UmVwb3J0RXJyb3JfbXNnPUlVUFAwMTA2RTogXHVhY2Y1XHVhYzFjIFx1YmNmNFx1YWNlMFx1YzExY1x1Yjk3YyBcdWJjZjRcdWFlMzAgXHVjNzA0XHVkNTc0IEhUTUwgXHViZTBjXHViNzdjXHVjNmIwXHVjODAwXHViOTdjIFx1YzVmNCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgRXJyb3IgUmVhc29ucyAmIFJlY29tbWVuZGVkIEFjdGlvbnMNCi1wdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uPUlVUFAwMTA3RTogXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWJjZjRcdWI4MjRcdWJhNzQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YjJlOFx1Y2Q5NFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249Jyd7MH0nJyBcdWIzMDBcdWMwYzEgXHVhY2JkXHViODVjXHVjNWQwIFx1YzBhZFx1YzgxY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHViMjk0IFx1ZDMwY1x1Yzc3Y1x1Yzc3NCBcdWQzZWNcdWQ1NjhcdWI0MThcdWM1YjQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcblxuXHVjNzc0IFx1YjMwMFx1ZDY1NCBcdWMwYzFcdWM3OTBcdWI5N2MgXHViMmViXHVhY2UwIFx1YjJlNFx1Yjk3OCBcdWFjYmRcdWI4NWNcdWI5N2MgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWNyZWF0ZURpckVycm9yX3JlYXNvbj0nJ3swfScnIFx1YjMwMFx1YzBjMSBcdWFjYmRcdWI4NWNcdWI5N2MgXHVjNzkxXHVjMTMxXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cblx1Yzc3NCBcdWIzMDBcdWQ2NTQgXHVjMGMxXHVjNzkwXHViOTdjIFx1YjJlYlx1YWNlMCBcdWIyZTRcdWI5NzggXHVhY2JkXHViODVjXHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1vcGVuQnJvd3NlckVycm9yX3JlYXNvbj1cdWM3NzQgXHVjMmRjXHVjMmE0XHVkMTVjXHVjNzU4IFx1YWUzMFx1YmNmOCBIVE1MIFx1YmUwY1x1Yjc3Y1x1YzZiMFx1YzgwMFx1Yjk3YyBcdWNjM2VcdWM3NDQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC5cblxuXHVjNzc0IFx1YjMwMFx1ZDY1NCBcdWMwYzFcdWM3OTBcdWI5N2MgXHViMmViXHVhY2UwIEhUTUwgXHViZTBjXHViNzdjXHVjNmIwXHVjODAwXHViOTdjIFx1YzBhY1x1YzZhOVx1ZDU1OFx1YzVlYyAnJ3swfScnIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWMyMThcdWIzZDlcdWM3M2NcdWI4NWMgXHVjNWVjXHVjMmVkXHVjMmRjXHVjNjI0Lg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjdhODhmMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24gV2l6YXJkDQotcHVibGlzaENvbmZpZ1dpemFyZF90aXRsZT1Db25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIE1cdTAwZTl0b2RvIGRlIFB1YmxpY2FcdTAwZTdcdTAwZTNvDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlPVNlbGVjaW9uYXIgQ29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBNXHUwMGU5dG9kbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVNlbGVjaW9uZSBhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgbVx1MDBlOXRvZG8gcXVlIGRlc2VqYSBwdWJsaWNhci4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RpdGxlPUVzcGVjaWZpY2FyIE9wXHUwMGU3XHUwMGY1ZXMgZGUgUHVibGljYVx1MDBlN1x1MDBlM28NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RleHQ9RXNwZWNpZmlxdWUgbyBkaXJldFx1MDBmM3JpbyBkZSBkZXN0aW5vIGUgYXMgb3BcdTAwZTdcdTAwZjVlcyBkZSBwdWJsaWNhXHUwMGU3XHUwMGUzby4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX21ldGhvZENvbmZpZ190ZXh0PUNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZG8gbVx1MDBlOXRvZG86DQotcHVibGlzaENvbmZpZ1dpemFyZF9kZXN0aW5hdGlvbkdyb3VwX3RleHQ9RGlyZXRcdTAwZjNyaW8gZGUgZGVzdGlubw0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlyZWN0b3J5X3RleHQ9Q2FtaW5obzoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3VzZURlZmF1bHRQYXRoX3RleHQ9VXRpbGl6YXIgY2FtaW5obyBwYWRyXHUwMGUzbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfd2ViU2l0ZV90ZXh0PVdlYiBzaXRlIHB1YmxpY2Fkbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGVfdGV4dD1DYXJnbzoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Jhbm5lckltYWdlX3RleHQ9SW1hZ2VtIGRlIGJhbm5lcjoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Fib3V0SFRNTF90ZXh0PVNvYnJlIG8gY29udGVcdTAwZmFkbzoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2ZlZWRiYWNrVVJMX3RleHQ9VVJMIGRlIGZlZWRiYWNrOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUluZGV4X3RleHQ9UHVibGljYXIgcFx1MDBlMWdpbmEgZGUgXHUwMGVkbmRpY2UNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVHbG9zc2FyeV90ZXh0PVB1YmxpY2FyIHBcdTAwZTFnaW5hIGRlIGdsb3NzXHUwMGUxcmlvDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlU2VhcmNoX3RleHQ9SW5jbHVpciByZWN1cnNvIGRlIHByb2N1cmEgKGV4aWdlIHN1cG9ydGUgYSBhcHBsZXQgSmF2YSBubyBuYXZlZ2Fkb3IpDQotcHVibGlzaENvbmZpZ1dpemFyZF91c2VBcHBsZXRfdGV4dD1TdXBvcnRhciBjdXN0b21pemFcdTAwZTdcdTAwZTNvIGRlIHZpc3VhbGl6YVx1MDBlN1x1MDBlM28gKGV4aWdlIHN1cG9ydGUgYSBhcHBsZXQgSmF2YSBubyBuYXZlZ2Fkb3IpDQotcHVibGlzaENvbmZpZ1dpemFyZF92YWxpZGF0aW9uR3JvdXBfdGV4dD1WYWxpZGFcdTAwZTdcdTAwZTNvDQotcHVibGlzaENvbmZpZ1dpemFyZF9jaGVja0h5cGVybGlua3NfdGV4dD1WZXJpZmljYXIgaHlwZXJsaW5rcyBleHRlcm5vcw0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlhZ3JhbUdyb3VwX3RleHQ9RGlhZ3JhbWFzDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVB1YmxpY2FyIGRpYWdyYW1hcyBkZSBkZXRhbGhlcyBkZSBhdGl2aWRhZGUgcXVlIG5cdTAwZTNvIHRlbmhhbSBzaWRvIGNyaWFkb3Mgbm8gZWRpdG9yIGRlIHByb2Nlc3NvDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVB1YmxpY2FyIGRpYWdyYW1hcyBkZSBhdGl2aWRhZGVzIHBhcmEgZXh0ZW5zXHUwMGY1ZXMgZGUgYXRpdmlkYWRlIG5cdTAwZTNvIG1vZGlmaWNhZGFzDQotcHVibGlzaENvbmZpZ1dpemFyZF9jb252ZXJ0QnJva2VuTGlua3NfdGV4dD1Db252ZXJ0ZXIgbGlua3MgZGVzZmVpdG9zIGVtIHRleHRvIHNpbXBsZXMNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2xheW91dF90ZXh0PUxheW91dA0KLXB1Ymxpc2hDb25maWdXaXphcmRfZXh0cmFEZXNjcmlwdG9ySW5mb190ZXh0PVB1YmxpY2FyIGRlc2NyaXRvcmVzIGNvbSBvIGNvbnRlXHUwMGZhZG8gY29tcGxldG8gZG8gZWxlbWVudG8gZGUgY29udGVcdTAwZmFkbyBkbyBtXHUwMGU5dG9kbyByZWxhY2lvbmFkbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGlnaHRXZWlnaHRUcmVlX3RleHQ9R2VyYXIgZXN0cnV0dXJhIGRlIHN1Ylx1MDBlMXJ2b3JlIHBhcmEgdGFyZWZhLCBmdW5cdTAwZTdcdTAwZTNvLCBwcm9kdXRvIGRlIHRyYWJhbGhvIGUgZGlzY2lwbGluYXIgZWxlbWVudG9zIHNlbSB1dGlsaXphciBwYXN0YXMNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVFbXB0eUNhdGVnb3JpZXNfdGV4dD1QdWJsaWNhciBjYXRlZ29yaWFzIHNlbSBlbGVtZW50b3MgY2F0ZWdvcml6YWRvcw0KLQ0KLSMgcHVibGlzaCBwcm9jZXNzIHdpemFyZCBwYWdlDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX3RpdGxlPVNlbGVjaW9uYXIgdGlwbyBkZSBwdWJsaWNhXHUwMGU3XHUwMGUzbw0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV90ZXh0PVZvY1x1MDBlYSBwb2RlIHB1YmxpY2FyIGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBzZWxlY2lvbmFkYSBvdSBvcyBwcm9jZXNzb3MgZXNwZWNpZmljYWRvcyBuYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX2NhcGFiaWxpdHlfcGF0dGVybj1QYWRyXHUwMGY1ZXMgZGUgUmVjdXJzbw0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9kZWxpdmVyeV9wcm9jZXNzPVByb2Nlc3NvcyBkZSBFbnRyZWdhDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3NlbGVjdFR5cGU9U2VsZWNpb25hciB0aXBvIGRlIHB1YmxpY2FcdTAwZTdcdTAwZTNvDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3R5cGVfcHJvY2Vzc2VzPVB1YmxpY2FyIG9zIHByb2Nlc3NvcyBzZWxlY2lvbmFkb3MgYSBzZWd1aXI6DQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3R5cGVfY29uZmlnPVB1YmxpY2FyIGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBzZWxlY2lvbmFkYQ0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9wdWJsaXNoX2Jhc2VfcHJvY2Vzc2VzPVB1YmxpY2FyIFByb2Nlc3NvcyBkZSBCYXNlIFJlZmVyaWRvcw0KLQ0KLSMgUHVibGlzaGluZyBQcmVmZXJlbmNlIFBhZ2UNCi1wcmVmZXJlbmNlUGFnZV9kZWZhdWx0UGF0aF90ZXh0PUNhbWluaG8gcGFkclx1MDBlM286DQotDQotIyBDb25maXJtYXRpb24gRGlhbG9ncw0KLXB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU9Q29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBNXHUwMGU5dG9kbyBkZSBQdWJsaWNhXHUwMGU3XHUwMGUzbw0KLWNvbmZpcm1QYXRoRGlhbG9nX3RleHQ9TyBjYW1pbmhvIGRlIGRlc3Rpbm8gZm9pIHJlc29sdmlkbyBwYXJhICcnezB9JycuIERlc2VqYSBjb250aW51YXI/DQotb3ZlcndyaXRlRGlhbG9nX3RleHQ9TyBjYW1pbmhvIGRlIGRlc3Rpbm8gJyd7MH0nJyBqXHUwMGUxIGV4aXN0ZS4gVG9kb3Mgb3MgYXJxdWl2b3MgbmEgcGFzdGEgc2VyXHUwMGUzbyBleGNsdVx1MDBlZGRvcy4gRGVzZWphIGNvbnRpbnVhcj8NCi1jYW5jZWxQdWJsaXNoQ29uZmlnX21zZz1BIG9wZXJhXHUwMGU3XHUwMGUzbyBkZSBwdWJsaWNhXHUwMGU3XHUwMGUzbyBmb2kgY2FuY2VsYWRhLg0KLSMgRXJyb3IgRGlhbG9ncw0KLXByZXZpZXdDb25maWdFcnJvcl90aXRsZT1WaXN1YWxpemFcdTAwZTdcdTAwZTNvIGRlIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgTVx1MDBlOXRvZG8gUHVibGljYWRvDQotdmlld1JlcG9ydEVycm9yX3RpdGxlPVZpc3VhbGl6YXIgUmVsYXRcdTAwZjNyaW8gZGUgUHVibGljYVx1MDBlN1x1MDBlM28NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbWlzc2luZ1ZpZXdFcnJvcl9tc2c9SVVQUDAxMDBXOiBBIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gc2VsZWNpb25hZGEgblx1MDBlM28gY29udFx1MDBlOW0gdW1hIHZpc3VhbGl6YVx1MDBlN1x1MDBlM28gdlx1MDBlMWxpZGEuIEVkaXRlIGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBlIGluY2x1YSB1bWEgdmlzdWFsaXphXHUwMGU3XHUwMGUzbywgb3Ugc2VsZWNpb25lIG91dHJhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28uDQotY2Fubm90UHVibGlzaEVycm9yX21zZz1JVVBQMDEwMUU6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIHB1YmxpY2FyIGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBzZWxlY2lvbmFkYS4NCi1pbnZhbGlkUGF0aEVycm9yX21zZz1JVVBQMDEwMkU6IE8gY2FtaW5obyBkZSBkZXN0aW5vIGVzdFx1MDBlMSBlbSBicmFuY28gb3UgXHUwMGU5IGludlx1MDBlMWxpZG8uDQotaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZz1JVVBQMDEwM0U6IE8gY2FtaW5obyBkZSBkZXN0aW5vIG5cdTAwZTNvIHBvZGUgY29udGVyIGVzdGVzIGNhcmFjdGVyZXM6IFxcICMgKiA/ICIgPCA+IHwgISAlIC8NCi1wdWJsaXNoQ29uZmlnRXJyb3JfbXNnPUlVUFAwMTA0RTogQSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHNlbGVjaW9uYWRhIG5cdTAwZTNvIGZvaSBwdWJsaWNhZGEgY29tIFx1MDBlYXhpdG8uDQotcHJldmlld0NvbmZpZ0Vycm9yX21zZz1JVVBQMDEwNUU6IEltcG9zc1x1MDBlZHZlbCBhYnJpciB1bSBuYXZlZ2Fkb3IgZGUgSFRNTCBwYXJhIHZpc3VhbGl6YXIgYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHB1YmxpY2FkYS4NCi12aWV3UmVwb3J0RXJyb3JfbXNnPUlVUFAwMTA2RTogSW1wb3NzXHUwMGVkdmVsIGFicmlyIHVtIG5hdmVnYWRvciBkZSBIVE1MIHBhcmEgdmlzdWFsaXphciBvIHJlbGF0XHUwMGYzcmlvIGRlIHB1YmxpY2FcdTAwZTdcdTAwZTNvLg0KLQ0KLSMgRXJyb3IgUmVhc29ucyAmIFJlY29tbWVuZGVkIEFjdGlvbnMNCi1wdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uPUlVUFAwMTA3RTogT2NvcnJldSB1bSBlcnJvLiBTZWxlY2lvbmUgbyBib3RcdTAwZTNvIERldGFsaGVzIHBhcmEgb2J0ZXIgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGFkaWNpb25haXMuDQotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249TyBjYW1pbmhvIGRlIGRlc3Rpbm8gJyd7MH0nJyBjb250XHUwMGU5bSBhcnF1aXZvcyBxdWUgblx1MDBlM28gcG9kZW0gc2VyIGV4Y2x1XHUwMGVkZG9zLlxuXG5GZWNoZSBlc3RlIGRpXHUwMGUxbG9nbyBlIGVzcGVjaWZpcXVlIG91dHJvIGNhbWluaG8uDQotY3JlYXRlRGlyRXJyb3JfcmVhc29uPU5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGNyaWFyIG8gY2FtaW5obyBkZSBkZXN0aW5vICcnezB9JycuXG5cbkZlY2hlIGVzdGUgZGlcdTAwZTFsb2dvIGUgZXNwZWNpZmlxdWUgb3V0cm8gY2FtaW5oby4NCi1vcGVuQnJvd3NlckVycm9yX3JlYXNvbj1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBkZXRlY3RhciBvdSBsb2NhbGl6YXIgbyBuYXZlZ2Fkb3IgZGUgSFRNTCBwYWRyXHUwMGUzbyBuZXN0ZSBzaXN0ZW1hLlxuXG5GZWNoZSBlc3RlIGRpXHUwMGUxbG9nbyBlIGFicmEgbyBhcnF1aXZvICcnezB9JycgbWFudWFsbWVudGUgY29tIHVtIG5hdmVnYWRvciBkZSBIVE1MLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI2YjYzYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24gV2l6YXJkDQotcHVibGlzaENvbmZpZ1dpemFyZF90aXRsZT1cdTUzZDFcdTVlMDNcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHU5MDA5XHU2MmU5XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ9XHU5MDA5XHU2MmU5XHU1ZTBjXHU2NzFiXHU1M2QxXHU1ZTAzXHU3Njg0XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHUzMDAyDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RPcHRpb25zUGFnZV90aXRsZT1cdTYzMDdcdTViOWFcdTUzZDFcdTVlMDNcdTkwMDlcdTk4NzkNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RleHQ9XHU2MzA3XHU1YjlhXHU3NmVlXHU2ODA3XHU3NmVlXHU1ZjU1XHU1NDhjXHU1M2QxXHU1ZTAzXHU5MDA5XHU5ODc5XHUzMDAyDQotcHVibGlzaENvbmZpZ1dpemFyZF9tZXRob2RDb25maWdfdGV4dD1cdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdWZmMWENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Rlc3RpbmF0aW9uR3JvdXBfdGV4dD1cdTc2ZWVcdTY4MDdcdTc2ZWVcdTVmNTUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2RpcmVjdG9yeV90ZXh0PVx1OGRlZlx1NWY4NFx1ZmYxYQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfdXNlRGVmYXVsdFBhdGhfdGV4dD1cdTRmN2ZcdTc1MjhcdTdmM2FcdTc3MDFcdThkZWZcdTVmODQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3dlYlNpdGVfdGV4dD1cdTVkZjJcdTUzZDFcdTVlMDNcdTc2ODQgV2ViIFx1N2FkOVx1NzBiOQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGVfdGV4dD1cdTY4MDdcdTk4OThcdWZmMWENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Jhbm5lckltYWdlX3RleHQ9XHU2NzYxXHU1ZTQ1XHU1NmZlXHU1MGNmXHVmZjFhDQotcHVibGlzaENvbmZpZ1dpemFyZF9hYm91dEhUTUxfdGV4dD1cdTUxNzNcdTRlOGVcdTUxODVcdTViYjlcdWZmMWENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2ZlZWRiYWNrVVJMX3RleHQ9XHU1M2NkXHU5OTg4IFVSTFx1ZmYxYQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUluZGV4X3RleHQ9XHU1M2QxXHU1ZTAzXHU3ZDIyXHU1ZjE1XHU5ODc1XHU5NzYyDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlR2xvc3NhcnlfdGV4dD1cdTUzZDFcdTVlMDNcdThiY2RcdTZjNDdcdTg4NjhcdTk4NzVcdTk3NjINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVTZWFyY2hfdGV4dD1cdTUzMDVcdTU0MmJcdTY0MWNcdTdkMjJcdTUyOWZcdTgwZmRcdWZmMDhcdTZkNGZcdTg5YzhcdTU2NjhcdTRlMmRcdTk3MDBcdTg5ODFcdTY3MDkgSmF2YSBhcHBsZXQgXHU2NTJmXHU2MzAxXHVmZjA5DQotcHVibGlzaENvbmZpZ1dpemFyZF91c2VBcHBsZXRfdGV4dD1cdTY1MmZcdTYzMDFcdTg5YzZcdTU2ZmVcdTViOWFcdTUyMzZcdWZmMDhcdTZkNGZcdTg5YzhcdTU2NjhcdTRlMmRcdTk3MDBcdTg5ODFcdTY3MDkgSmF2YSBhcHBsZXQgXHU2NTJmXHU2MzAxXHVmZjA5DQotcHVibGlzaENvbmZpZ1dpemFyZF92YWxpZGF0aW9uR3JvdXBfdGV4dD1cdTlhOGNcdThiYzENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NoZWNrSHlwZXJsaW5rc190ZXh0PVx1NjhjMFx1NjdlNVx1NTkxNlx1OTBlOFx1OGQ4NVx1OTRmZVx1NjNhNQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlhZ3JhbUdyb3VwX3RleHQ9XHU1NmZlDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVx1NTNkMVx1NWUwM1x1NWMxYVx1NjcyYVx1NTcyOFx1NmQ0MVx1N2EwYlx1N2YxNlx1OGY5MVx1NTY2OFx1NGUyZFx1NTIxYlx1NWVmYVx1NzY4NFx1NmQzYlx1NTJhOFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1NTZmZQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfcHVibGlzaF9leHRlbmRfYWN0aXZpdHlfZGlhZ3JhbT1cdTUzZDFcdTVlMDNcdTY3MmFcdTRmZWVcdTY1MzlcdTc2ODRcdTZkM2JcdTUyYThcdTYyNjlcdTVjNTVcdTc2ODRcdTZkM2JcdTUyYThcdTU2ZmVcdTMwMDINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NvbnZlcnRCcm9rZW5MaW5rc190ZXh0PVx1NWMwNlx1NjVhZFx1NWYwMFx1NzY4NFx1OTRmZVx1NjNhNVx1OGY2Y1x1NjM2Mlx1NGUzYVx1N2VhZlx1NjU4N1x1NjcyYw0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGF5b3V0X3RleHQ9XHU1ZTAzXHU1YzQwDQotcHVibGlzaENvbmZpZ1dpemFyZF9leHRyYURlc2NyaXB0b3JJbmZvX3RleHQ9XHU1M2QxXHU1ZTAzXHU1ZTI2XHU3NmY4XHU1MTczXHU2NWI5XHU2Y2Q1XHU1MTg1XHU1YmI5XHU1MTQzXHU3ZDIwXHU3Njg0XHU1YjhjXHU2NTc0XHU1MTg1XHU1YmI5XHU3Njg0XHU2M2NmXHU4ZmYwXHU3YjI2DQotcHVibGlzaENvbmZpZ1dpemFyZF9saWdodFdlaWdodFRyZWVfdGV4dD1cdTc1MWZcdTYyMTBcdTRlZmJcdTUyYTFcdTMwMDFcdTg5ZDJcdTgyNzJcdTMwMDFcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTU0OGNcdTg5YzRcdTdhMGJcdTUxNDNcdTdkMjBcdTc2ODRcdTViNTBcdTY4MTFcdTdlZDNcdTY3ODRcdWZmMGNcdTRlMGRcdTRmN2ZcdTc1MjhcdTY1ODdcdTRlZjZcdTU5MzkNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVFbXB0eUNhdGVnb3JpZXNfdGV4dD1cdTUzZDFcdTVlMDNcdTZjYTFcdTY3MDlcdTVkZjJcdTUyMDZcdTdjN2JcdTUxNDNcdTdkMjBcdTc2ODRcdTdjN2JcdTUyMmINCi0NCi0jIHB1Ymxpc2ggcHJvY2VzcyB3aXphcmQgcGFnZQ0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV90aXRsZT1cdTkwMDlcdTYyZTlcdTUzZDFcdTVlMDNcdTdjN2JcdTU3OGINCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGV4dD1cdTYwYThcdTUzZWZcdTRlZTVcdTUzZDFcdTVlMDNcdTkwMDlcdTViOWFcdTc2ODRcdTkxNGRcdTdmNmVcdWZmMGNcdTRlNWZcdTUzZWZcdTRlZTVcdTUzZDFcdTVlMDNcdTkxNGRcdTdmNmVcdTRlMmRcdTYzMDdcdTViOWFcdTc2ODRcdTZkNDFcdTdhMGINCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfY2FwYWJpbGl0eV9wYXR0ZXJuPVx1ODBmZFx1NTI5Ylx1NmEyMVx1NWYwZg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9kZWxpdmVyeV9wcm9jZXNzPVx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9zZWxlY3RUeXBlPVx1OTAwOVx1NjJlOVx1NTNkMVx1NWUwM1x1N2M3Ylx1NTc4Yg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF90eXBlX3Byb2Nlc3Nlcz1cdTUzZDFcdTVlMDNcdTRlZTVcdTRlMGJcdTc2ODRcdTkwMDlcdTViOWFcdTZkNDFcdTdhMGJcdWZmMWENCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfdHlwZV9jb25maWc9XHU1M2QxXHU1ZTAzXHU5MDA5XHU1YjlhXHU3Njg0XHU5MTRkXHU3ZjZlDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3B1Ymxpc2hfYmFzZV9wcm9jZXNzZXM9XHU1M2QxXHU1ZTAzXHU1ZjE1XHU3NTI4XHU3Njg0XHU1N2ZhXHU2NzJjXHU2ZDQxXHU3YTBiDQotDQotIyBQdWJsaXNoaW5nIFByZWZlcmVuY2UgUGFnZQ0KLXByZWZlcmVuY2VQYWdlX2RlZmF1bHRQYXRoX3RleHQ9XHU3ZjNhXHU3NzAxXHU4ZGVmXHU1Zjg0XHVmZjFhDQotDQotIyBDb25maXJtYXRpb24gRGlhbG9ncw0KLXB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU9XHU1M2QxXHU1ZTAzXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotY29uZmlybVBhdGhEaWFsb2dfdGV4dD1cdTc2ZWVcdTY4MDdcdThkZWZcdTVmODRcdTVkZjJcdTg5ZTNcdTY3OTBcdTRlM2FcdTIwMWN7MH1cdTIwMWRcdTMwMDJcdTY2MmZcdTU0MjZcdTg5ODFcdTdlZTdcdTdlZWRcdWZmMWYNCi1vdmVyd3JpdGVEaWFsb2dfdGV4dD1cdTc2ZWVcdTY4MDdcdThkZWZcdTVmODRcdTIwMWN7MH1cdTIwMWRcdTVkZjJcdTViNThcdTU3MjhcdTMwMDJcdTVjMDZcdTUyMjBcdTk2NjRcdThiZTVcdTY1ODdcdTRlZjZcdTU5MzlcdTRlMmRcdTc2ODRcdTYyNDBcdTY3MDlcdTY1ODdcdTRlZjZcdTMwMDJcdTY2MmZcdTU0MjZcdTg5ODFcdTdlZTdcdTdlZWRcdWZmMWYNCi1jYW5jZWxQdWJsaXNoQ29uZmlnX21zZz1cdTUzZDFcdTVlMDNcdTY0Y2RcdTRmNWNcdTVkZjJcdTUzZDZcdTZkODhcdTMwMDINCi0NCi0jIEVycm9yIERpYWxvZ3MNCi1wcmV2aWV3Q29uZmlnRXJyb3JfdGl0bGU9XHU5ODg0XHU4OWM4XHU1M2QxXHU1ZTAzXHU3Njg0XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotdmlld1JlcG9ydEVycm9yX3RpdGxlPVx1NjdlNVx1NzcwYlx1NTNkMVx1NWUwM1x1NjJhNVx1NTQ0YQ0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1taXNzaW5nVmlld0Vycm9yX21zZz1JVVBQMDEwMFc6IFx1OTAwOVx1NWI5YVx1NzY4NFx1OTE0ZFx1N2Y2ZVx1NGUwZFx1NTMwNVx1NTQyYlx1NjcwOVx1NjU0OFx1ODljNlx1NTZmZVx1MzAwMlx1OGJmN1x1N2YxNlx1OGY5MVx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1NmRmYlx1NTJhMFx1ODljNlx1NTZmZVx1ZmYwY1x1NjIxNlx1OTAwOVx1NjJlOVx1NTNlNlx1NGUwMFx1NGUyYVx1OTE0ZFx1N2Y2ZVx1MzAwMg0KLWNhbm5vdFB1Ymxpc2hFcnJvcl9tc2c9SVVQUDAxMDFFOiBcdTY1ZTBcdTZjZDVcdTUzZDFcdTVlMDNcdTkwMDlcdTViOWFcdTc2ODRcdTkxNGRcdTdmNmVcdTMwMDINCi1pbnZhbGlkUGF0aEVycm9yX21zZz1JVVBQMDEwMkU6IFx1NzZlZVx1NjgwN1x1OGRlZlx1NWY4NFx1NGUzYVx1N2E3YVx1NjIxNlx1NjVlMFx1NjU0OFx1MzAwMg0KLWludmFsaWRQYXRoQ2hhcnNFcnJvcl9tc2c9SVVQUDAxMDNFOiBcdTc2ZWVcdTY4MDdcdThkZWZcdTVmODRcdTRlMGRcdTgwZmRcdTUzMDVcdTU0MmJcdTRlZTVcdTRlMGJcdTViNTdcdTdiMjZcdWZmMWFcXCAjICogPyAiIDwgPiB8ICEgJSAvDQotcHVibGlzaENvbmZpZ0Vycm9yX21zZz1JVVBQMDEwNEU6IFx1OTAwOVx1NWI5YVx1NzY4NFx1OTE0ZFx1N2Y2ZVx1NjcyYVx1NjIxMFx1NTI5Zlx1NTNkMVx1NWUwM1x1MzAwMg0KLXByZXZpZXdDb25maWdFcnJvcl9tc2c9SVVQUDAxMDVFOiBcdTY1ZTBcdTZjZDVcdTYyNTNcdTVmMDAgSFRNTCBcdTZkNGZcdTg5YzhcdTU2NjhcdTk4ODRcdTg5YzhcdTUzZDFcdTVlMDNcdTc2ODRcdTkxNGRcdTdmNmVcdTMwMDINCi12aWV3UmVwb3J0RXJyb3JfbXNnPUlVUFAwMTA2RTogXHU2NWUwXHU2Y2Q1XHU2MjUzXHU1ZjAwIEhUTUwgXHU2ZDRmXHU4OWM4XHU1NjY4XHU2N2U1XHU3NzBiXHU1M2QxXHU1ZTAzXHU2MmE1XHU1NDRhXHUzMDAyDQotDQotIyBFcnJvciBSZWFzb25zICYgUmVjb21tZW5kZWQgQWN0aW9ucw0KLXB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb249SVVQUDAxMDdFOiBcdTUzZDFcdTc1MWZcdTk1MTlcdThiZWZcdTMwMDJcdThiZjdcdTkwMDlcdTYyZTlcdTIwMWNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTIwMWRcdTYzMDlcdTk0YWVcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdTRmZTFcdTYwNmZcdTMwMDINCi1kZWxldGVGaWxlc0Vycm9yX3JlYXNvbj1cdTc2ZWVcdTY4MDdcdThkZWZcdTVmODRcdTIwMWN7MH1cdTIwMWRcdTUzMDVcdTU0MmJcdTY1ZTBcdTZjZDVcdTUyMjBcdTk2NjRcdTc2ODRcdTY1ODdcdTRlZjZcdTMwMDJcblxuXHU4YmY3XHU1MTczXHU5NWVkXHU2YjY0XHU1YmY5XHU4YmRkXHU2ODQ2XHVmZjBjXHU3MTM2XHU1NDBlXHU2MzA3XHU1YjlhXHU1M2U2XHU0ZTAwXHU0ZTJhXHU4ZGVmXHU1Zjg0XHUzMDAyDQotY3JlYXRlRGlyRXJyb3JfcmVhc29uPVx1NjVlMFx1NmNkNVx1NTIxYlx1NWVmYVx1NzZlZVx1NjgwN1x1OGRlZlx1NWY4NFx1MjAxY3swfVx1MjAxZFx1MzAwMlxuXG5cdThiZjdcdTUxNzNcdTk1ZWRcdTZiNjRcdTViZjlcdThiZGRcdTY4NDZcdWZmMGNcdTcxMzZcdTU0MGVcdTYzMDdcdTViOWFcdTUzZTZcdTRlMDBcdTRlMmFcdThkZWZcdTVmODRcdTMwMDINCi1vcGVuQnJvd3NlckVycm9yX3JlYXNvbj1cdTY1ZTBcdTZjZDVcdTY4YzBcdTZkNGJcdTYyMTZcdTY3ZTVcdTYyN2VcdTZiNjRcdTdjZmJcdTdlZGZcdTRlMGFcdTc2ODRcdTdmM2FcdTc3MDEgSFRNTCBcdTZkNGZcdTg5YzhcdTU2NjhcdTMwMDJcblxuXHU4YmY3XHU1MTczXHU5NWVkXHU2YjY0XHU1YmY5XHU4YmRkXHU2ODQ2XHVmZjBjXHU3MTM2XHU1NDBlXHU0ZjdmXHU3NTI4IEhUTUwgXHU2ZDRmXHU4OWM4XHU1NjY4XHU2MjRiXHU1ZGU1XHU2MjUzXHU1ZjAwXHU2NTg3XHU0ZWY2XHUyMDFjezB9XHUyMDFkXHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ODNhZjA4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlPVx1NzY3Y1x1NGY0OFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1cdTkwNzhcdTUzZDZcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGV4dD1cdTkwNzhcdTUzZDZcdTYwYThcdTg5ODFcdTc2N2NcdTRmNDhcdTc2ODRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RpdGxlPVx1NjMwN1x1NWI5YVx1NzY3Y1x1NGY0OFx1OTA3OFx1OTgwNQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0T3B0aW9uc1BhZ2VfdGV4dD1cdTYzMDdcdTViOWFcdTc2ZWVcdTZhMTlcdTc2ZWVcdTkzMDRcdTU0OGNcdTc2N2NcdTRmNDhcdTkwNzhcdTk4MDVcdTMwMDINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX21ldGhvZENvbmZpZ190ZXh0PVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ZmYxYQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGVzdGluYXRpb25Hcm91cF90ZXh0PVx1NzZlZVx1NmExOVx1NzZlZVx1OTMwNA0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlyZWN0b3J5X3RleHQ9XHU4ZGVmXHU1ZjkxXHVmZjFhDQotcHVibGlzaENvbmZpZ1dpemFyZF91c2VEZWZhdWx0UGF0aF90ZXh0PVx1NGY3Zlx1NzUyOFx1OTgxMFx1OGEyZFx1OGRlZlx1NWY5MQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfd2ViU2l0ZV90ZXh0PVx1NWRmMlx1NzY3Y1x1NGY0OFx1NzY4NFx1N2RiMlx1N2FkOQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGVfdGV4dD1cdTZhMTlcdTk4NGNcdWZmMWENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Jhbm5lckltYWdlX3RleHQ9XHU2YTE5XHU5ODRjXHU1ZjcxXHU1MGNmXHVmZjFhDQotcHVibGlzaENvbmZpZ1dpemFyZF9hYm91dEhUTUxfdGV4dD1cdTk1ZGNcdTY1YmNcdTUxNjdcdTViYjlcdWZmMWENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2ZlZWRiYWNrVVJMX3RleHQ9XHU2MTBmXHU4OThiIFVSTFx1ZmYxYQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUluZGV4X3RleHQ9XHU3NjdjXHU0ZjQ4XHU3ZDIyXHU1ZjE1XHU5ODAxDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlR2xvc3NhcnlfdGV4dD1cdTc2N2NcdTRmNDhcdTU0MGRcdThhNWVcdTg5ZTNcdTkxY2JcdTk4MDENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVTZWFyY2hfdGV4dD1cdTUzMDVcdTYyZWNcdTY0MWNcdTVjMGJcdTUyOWZcdTgwZmRcdWZmMDhcdTcwMGZcdTg5YmRcdTU2NjhcdTk3MDBcdTg5ODEgSmF2YSBBcHBsZXQgXHU2NTJmXHU2M2Y0XHVmZjA5DQotcHVibGlzaENvbmZpZ1dpemFyZF91c2VBcHBsZXRfdGV4dD1cdTY1MmZcdTYzZjRcdTgxZWFcdThhMDJcdTZhYTJcdTg5OTZcdTc1NmJcdTk3NjJcdWZmMDhcdTcwMGZcdTg5YmRcdTU2NjhcdTk3MDBcdTg5ODEgSmF2YSBBcHBsZXQgXHU2NTJmXHU2M2Y0XHVmZjA5DQotcHVibGlzaENvbmZpZ1dpemFyZF92YWxpZGF0aW9uR3JvdXBfdGV4dD1cdTlhNTdcdThiNDkNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NoZWNrSHlwZXJsaW5rc190ZXh0PVx1NmFhMlx1NjdlNVx1NTkxNlx1OTBlOFx1OGQ4NVx1OTNjOFx1N2Q1MA0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlhZ3JhbUdyb3VwX3RleHQ9XHU1NzE2XHU4OWUzDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVx1NzY3Y1x1NGY0OFx1NWMxYVx1NjcyYVx1NjViY1x1N2EwYlx1NWU4Zlx1N2RlOFx1OGYyZlx1NTY2OFx1NGUyZFx1NWVmYVx1N2FjYlx1NzY4NFx1NmQzYlx1NTJkNVx1NjYwZVx1N2QzMFx1NTcxNg0KLXB1Ymxpc2hDb25maWdXaXphcmRfcHVibGlzaF9leHRlbmRfYWN0aXZpdHlfZGlhZ3JhbT1cdTc2N2NcdTRmNDhcdTU0MmJcdTY3MDlcdTY3MmFcdTRmZWVcdTY1MzlcdTc2ODRcdTZkM2JcdTUyZDVcdTVlZjZcdTRmMzhcdTc2ODRcdTZkM2JcdTUyZDVcdTU3MTYNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NvbnZlcnRCcm9rZW5MaW5rc190ZXh0PVx1NWMwN1x1NGUyZFx1NjViN1x1NzY4NFx1OTNjOFx1N2Q1MFx1OGY0OVx1NjNkYlx1NjIxMFx1N2QxNFx1NjU4N1x1NWI1Nw0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGF5b3V0X3RleHQ9XHU3MjQ4XHU5NzYyXHU5MTRkXHU3ZjZlDQotcHVibGlzaENvbmZpZ1dpemFyZF9leHRyYURlc2NyaXB0b3JJbmZvX3RleHQ9XHU3NjdjXHU0ZjQ4XHU2M2NmXHU4ZmYwXHU1YjUwXHU1M2NhXHU3NmY4XHU5NWRjXHU2NWI5XHU2Y2Q1XHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwXHU3Njg0XHU1YjhjXHU2NTc0XHU1MTY3XHU1YmI5DQotcHVibGlzaENvbmZpZ1dpemFyZF9saWdodFdlaWdodFRyZWVfdGV4dD1cdTc1MjJcdTc1MWZcdTRmNWNcdTY5NmRcdTMwMDFcdTg5ZDJcdTgyNzJcdTMwMDFcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTUzY2FcdTdkMDBcdTVmOGJcdTUxNDNcdTdkMjBcdTc2ODRcdTViNTBcdTZhMzlcdTcyYzBcdTdkNTBcdTY5Y2JcdWZmMGNcdTRlMGRcdTRmN2ZcdTc1MjhcdThjYzdcdTY1OTlcdTU5M2UNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVFbXB0eUNhdGVnb3JpZXNfdGV4dD1cdTc2N2NcdTRmNDhcdTcxMjFcdTUyMDZcdTk4NWVcdTUxNDNcdTdkMjBcdTc2ODRcdTdhMmVcdTk4NWUNCi0NCi0jIHB1Ymxpc2ggcHJvY2VzcyB3aXphcmQgcGFnZQ0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV90aXRsZT1cdTkwNzhcdTUzZDZcdTc2N2NcdTRmNDhcdTk4NWVcdTU3OGINCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGV4dD1cdTYwYThcdTUzZWZcdTRlZTVcdTc2N2NcdTRmNDhcdTkwNzhcdTUzZDZcdTc2ODRcdTkxNGRcdTdmNmVcdTYyMTZcdTkxNGRcdTdmNmVcdTRlMmRcdTYzMDdcdTViOWFcdTc2ODRcdTZkNDFcdTdhMGINCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfY2FwYWJpbGl0eV9wYXR0ZXJuPVx1NTI5Zlx1ODBmZFx1NTc4Ylx1NmEyMw0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9kZWxpdmVyeV9wcm9jZXNzPVx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9zZWxlY3RUeXBlPVx1OTA3OFx1NTNkNlx1NzY3Y1x1NGY0OFx1OTg1ZVx1NTc4Yg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF90eXBlX3Byb2Nlc3Nlcz1cdTc2N2NcdTRmNDhcdTRlMGJcdTUyMTdcdTkwNzhcdTUzZDZcdTc2ODRcdTZkNDFcdTdhMGJcdWZmMWENCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfdHlwZV9jb25maWc9XHU3NjdjXHU0ZjQ4XHU5MDc4XHU1M2Q2XHU3Njg0XHU5MTRkXHU3ZjZlDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3B1Ymxpc2hfYmFzZV9wcm9jZXNzZXM9XHU3NjdjXHU0ZjQ4XHU1M2MzXHU3MTY3XHU3Njg0XHU1N2ZhXHU2NzJjXHU2ZDQxXHU3YTBiDQotDQotIyBQdWJsaXNoaW5nIFByZWZlcmVuY2UgUGFnZQ0KLXByZWZlcmVuY2VQYWdlX2RlZmF1bHRQYXRoX3RleHQ9XHU5ODEwXHU4YTJkXHU4ZGVmXHU1ZjkxXHVmZjFhDQotDQotIyBDb25maXJtYXRpb24gRGlhbG9ncw0KLXB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU9XHU3NjdjXHU0ZjQ4XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotY29uZmlybVBhdGhEaWFsb2dfdGV4dD1cdTc2ZWVcdTZhMTlcdThkZWZcdTVmOTFcdTVkZjJcdTg5ZTNcdTY3OTBcdTcwYmEgJyd7MH0nJ1x1MzAwMlx1ODk4MVx1N2U3Y1x1N2U4Y1x1NTVjZVx1ZmYxZg0KLW92ZXJ3cml0ZURpYWxvZ190ZXh0PVx1NzZlZVx1NmExOVx1OGRlZlx1NWY5MSAnJ3swfScnIFx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlx1NWMwN1x1NTIyYVx1OTY2NFx1OGNjN1x1NjU5OVx1NTkzZVx1NGUyZFx1NzY4NFx1NjI0MFx1NjcwOVx1NmE5NFx1Njg0OFx1MzAwMlx1ODk4MVx1N2U3Y1x1N2U4Y1x1NTVjZVx1ZmYxZg0KLWNhbmNlbFB1Ymxpc2hDb25maWdfbXNnPVx1NWRmMlx1NTNkNlx1NmQ4OFx1NzY3Y1x1NGY0OFx1NGY1Y1x1Njk2ZFx1MzAwMg0KLQ0KLSMgRXJyb3IgRGlhbG9ncw0KLXByZXZpZXdDb25maWdFcnJvcl90aXRsZT1cdTk4MTBcdTg5YmRcdTg5ODFcdTc2N2NcdTRmNDhcdTc2ODRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi12aWV3UmVwb3J0RXJyb3JfdGl0bGU9XHU2YWEyXHU4OTk2XHU3NjdjXHU0ZjQ4XHU1ODMxXHU1NDRhDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLW1pc3NpbmdWaWV3RXJyb3JfbXNnPUlVUFAwMTAwVzogXHU5MDc4XHU1M2Q2XHU3Njg0XHU5MTRkXHU3ZjZlXHU0ZTBkXHU1NDJiXHU2NzA5XHU2NTQ4XHU3Njg0XHU4OTk2XHU1NzE2XHUzMDAyXHU3ZGU4XHU4ZjJmXHU5MTRkXHU3ZjZlXHU0ZTI2XHU2NWIwXHU1ODllXHU4OTk2XHU1NzE2XHVmZjBjXHU2MjE2XHU5MDc4XHU1M2Q2XHU1M2U2XHU0ZTAwXHU1MDBiXHU5MTRkXHU3ZjZlXHUzMDAyDQotY2Fubm90UHVibGlzaEVycm9yX21zZz1JVVBQMDEwMUU6IFx1NzEyMVx1NmNkNVx1NzY3Y1x1NGY0OFx1NWRmMlx1OTA3OFx1NTNkNlx1NzY4NFx1OTE0ZFx1N2Y2ZVx1MzAwMg0KLWludmFsaWRQYXRoRXJyb3JfbXNnPUlVUFAwMTAyRTogXHU3NmVlXHU2YTE5XHU4ZGVmXHU1ZjkxXHU3YTdhXHU3NjdkXHU2MjE2XHU3MTIxXHU2NTQ4XHUzMDAyDQotaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZz1JVVBQMDEwM0U6IFx1NzZlZVx1NmExOVx1OGRlZlx1NWY5MVx1NGUwZFx1ODBmZFx1NTMwNVx1NTQyYlx1OTAxOVx1NGU5Ylx1NWI1N1x1NTE0M1x1ZmYxYVxcICMgKiA/ICIgPCA+IHwgISAlIC8NCi1wdWJsaXNoQ29uZmlnRXJyb3JfbXNnPUlVUFAwMTA0RTogXHU2NzJhXHU5ODA2XHU1MjI5XHU3NjdjXHU0ZjQ4XHU5MDc4XHU1M2Q2XHU3Njg0XHU5MTRkXHU3ZjZlXHUzMDAyDQotcHJldmlld0NvbmZpZ0Vycm9yX21zZz1JVVBQMDEwNUU6IFx1NzEyMVx1NmNkNVx1OTU4Ylx1NTU1ZiBIVE1MIFx1NzAwZlx1ODliZFx1NTY2OFx1NGY4Nlx1OTgxMFx1ODliZFx1ODk4MVx1NzY3Y1x1NGY0OFx1NzY4NFx1OTE0ZFx1N2Y2ZVx1MzAwMg0KLXZpZXdSZXBvcnRFcnJvcl9tc2c9SVVQUDAxMDZFOiBcdTcxMjFcdTZjZDVcdTk1OGJcdTU1NWYgSFRNTCBcdTcwMGZcdTg5YmRcdTU2NjhcdTRmODZcdTZhYTJcdTg5OTZcdTc2N2NcdTRmNDhcdTU4MzFcdTU0NGFcdTMwMDINCi0NCi0jIEVycm9yIFJlYXNvbnMgJiBSZWNvbW1lbmRlZCBBY3Rpb25zDQotcHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbj1JVVBQMDEwN0U6IFx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNFx1MzAwMlx1NTk4Mlx1OTcwMFx1NzZmOFx1OTVkY1x1OGNjN1x1OGEwYVx1ZmYwY1x1OGFjYlx1OTA3OFx1NTNkNlx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwZFx1NjMwOVx1OTIxNVx1MzAwMg0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVx1NzZlZVx1NmExOVx1OGRlZlx1NWY5MSAnJ3swfScnIFx1NTMwNVx1NTQyYlx1NzEyMVx1NmNkNVx1NTIyYVx1OTY2NFx1NzY4NFx1NmE5NFx1Njg0OFx1MzAwMlxuXG5cdThhY2JcdTk1ZGNcdTk1ODlcdTZiNjRcdTVjMGRcdThhNzFcdTY4NDZcdWZmMGNcdTRlMjZcdTYzMDdcdTViOWFcdTUzZTZcdTRlMDBcdTUwMGJcdThkZWZcdTVmOTFcdTMwMDINCi1jcmVhdGVEaXJFcnJvcl9yZWFzb249XHU3MTIxXHU2Y2Q1XHU1ZWZhXHU3YWNiXHU3NmVlXHU2YTE5XHU4ZGVmXHU1ZjkxICcnezB9JydcdTMwMDJcblxuXHU4YWNiXHU5NWRjXHU5NTg5XHU2YjY0XHU1YzBkXHU4YTcxXHU2ODQ2XHVmZjBjXHU0ZTI2XHU2MzA3XHU1YjlhXHU1M2U2XHU0ZTAwXHU1MDBiXHU4ZGVmXHU1ZjkxXHUzMDAyDQotb3BlbkJyb3dzZXJFcnJvcl9yZWFzb249XHU1MDc1XHU2ZTJjXHU0ZTBkXHU1MjMwXHU2MjE2XHU2MjdlXHU0ZTBkXHU1MjMwXHU2YjY0XHU3Y2ZiXHU3ZDcxXHU5ODEwXHU4YTJkXHU3Njg0IEhUTUwgXHU3MDBmXHU4OWJkXHU1NjY4XHUzMDAyXG5cblx1OGFjYlx1OTVkY1x1OTU4OVx1NmI2NFx1NWMwZFx1OGE3MVx1Njg0Nlx1ZmYwY1x1NGUyNlx1NjI0Ylx1NTJkNVx1NGVlNSBIVE1MIFx1NzAwZlx1ODliZFx1NTY2OFx1NGY4Nlx1OTU4Ylx1NTU1Zlx1NmE5NFx1Njg0OCAnJ3swfScnXHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlMGE4Y2MuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiMzc3NTQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBQdWJsaXNoaW5nIFVJIChOTDIpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMi9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjU0ZmNhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFiNTEyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9XHUwNDFmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIEVQRiAtIFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0NDRcdTA0MzVcdTA0MzlcdTA0NDENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIERlZmF1bHQgZmVlZGJhY2sgVVJMDQotZmVlZGJhY2tVUkw9aHR0cDovL3d3dy5wdWJsaXNoZWRfd2Vic2l0ZS5jb20vZmVlZGJhY2sNCi0NCi0jIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wdWJsaXNoQ29uZmlnQWN0aW9uPSZcdTA0MWVcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMuLi4NCi1wdWJsaXNoQ29uZmlnQWN0aW9uVG9vbHRpcD1cdTA0MWVcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDMwXHUwNDM5XHUwNDQyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLXB1Ymxpc2hpbmdPcHRpb25zPVx1MDQxZVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi0NCi0jIFB1Ymxpc2hpbmcgQWN0aW9ucw0KLWNvbmZpZ0FjdGlvblNldD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi1jb25maWdNZW51PSZcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi0NCi0jIFByaW50IENvbmZpZ3VyYXRpb24gQWN0aW9uDQotcHJpbnRDb25maWdBY3Rpb249XHUwNDFmXHUwNDM1XHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDRjDQotDQotIyB0aGUgdGl0bGUgZm9yIHRoZSBwdWJsaXNoZWQgc2l0ZQ0KLSNkb24ndCBkZWZpbmUgaGVyZSwgbGV0IHVzZXIgc3BlY2lmeSBpdC4NCi0jdGl0bGU9T3BlblVQL0Jhc2ljDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgRGVmYXVsdCBQdWJsaXNoIFBhdGgNCi1wdWJsaXNoUGF0aD08dXNlci5ob21lPi88YXBwLm5hbWU+L1B1Ymxpc2gNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4NjYwYjEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uIFdpemFyZA0KLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGU9XHUwNDFlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGV4dD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDQzXHUwNDRlIFx1MDQzZFx1MDQ0M1x1MDQzNlx1MDQzZFx1MDQzZSBcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMuDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RPcHRpb25zUGFnZV90aXRsZT1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0T3B0aW9uc1BhZ2VfdGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQ2XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyBcdTA0MzggXHUwNDNmXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDQwXHUwNDRiIFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX21ldGhvZENvbmZpZ190ZXh0PVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzA6DQotcHVibGlzaENvbmZpZ1dpemFyZF9kZXN0aW5hdGlvbkdyb3VwX3RleHQ9XHUwNDI2XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMw0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlyZWN0b3J5X3RleHQ9XHUwNDFmXHUwNDQzXHUwNDQyXHUwNDRjOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfdXNlRGVmYXVsdFBhdGhfdGV4dD1cdTA0MThcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQzZlx1MDQzZSBcdTA0NDNcdTA0M2NcdTA0M2VcdTA0M2JcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3dlYlNpdGVfdGV4dD1cdTA0MjFcdTA0MzBcdTA0MzlcdTA0NDIgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGVfdGV4dD1cdTA0MTdcdTA0MzBcdTA0MzNcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzJcdTA0M2VcdTA0M2E6DQotcHVibGlzaENvbmZpZ1dpemFyZF9iYW5uZXJJbWFnZV90ZXh0PVx1MDQxOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzFcdTA0MzBcdTA0M2RcdTA0M2RcdTA0MzVcdTA0NDBcdTA0MzA6DQotcHVibGlzaENvbmZpZ1dpemFyZF9hYm91dEhUTUxfdGV4dD1cdTA0MWUgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDMwXHUwNDQ1Og0KLXB1Ymxpc2hDb25maWdXaXphcmRfZmVlZGJhY2tVUkxfdGV4dD1VUkwgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZVx1MDQ0Mlx1MDQzN1x1MDQ0Ylx1MDQzMlx1MDQzZVx1MDQzMjoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVJbmRleF90ZXh0PVx1MDQxZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDZcdTA0NDMgXHUwNDM4XHUwNDNkXHUwNDM0XHUwNDM1XHUwNDNhXHUwNDQxXHUwNDMwDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlR2xvc3NhcnlfdGV4dD1cdTA0MWVcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQ2XHUwNDQzIFx1MDQzM1x1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0MVx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQ0Zg0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZVNlYXJjaF90ZXh0PVx1MDQxMlx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDRcdTA0NDNcdTA0M2RcdTA0M2FcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDNlXHUwNDM4XHUwNDQxXHUwNDNhXHUwNDMwIChcdTA0NDJcdTA0NDBcdTA0MzVcdTA0MzFcdTA0NDNcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDNhXHUwNDMwIFx1MDQzMFx1MDQzZlx1MDQzYlx1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzMiBKYXZhIFx1MDQzMiBcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0NDBcdTA0MzUpDQotcHVibGlzaENvbmZpZ1dpemFyZF91c2VBcHBsZXRfdGV4dD1cdTA0MTJcdTA0M2FcdTA0M2JcdTA0NGVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQ0XHUwNDQzXHUwNDNkXHUwNDNhXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQzYVx1MDQzOCAoXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDMxXHUwNDQzXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzYVx1MDQzMCBcdTA0MzBcdTA0M2ZcdTA0M2JcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzIgSmF2YSBcdTA0MzIgXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDQwXHUwNDM1KQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfdmFsaWRhdGlvbkdyb3VwX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNhXHUwNDMwDQotcHVibGlzaENvbmZpZ1dpemFyZF9jaGVja0h5cGVybGlua3NfdGV4dD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDNkXHUwNDM1XHUwNDQ4XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOA0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlhZ3JhbUdyb3VwX3RleHQ9XHUwNDE0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDRiDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVx1MDQxZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDRiIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOSwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZFx1MDQzNSBcdTA0MzFcdTA0NGJcdTA0M2JcdTA0MzggXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDRiIFx1MDQzMiBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVx1MDQxZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NGIgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2RcdTA0MzVcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLXB1Ymxpc2hDb25maWdXaXphcmRfY29udmVydEJyb2tlbkxpbmtzX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzMFx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDMyIFx1MDQzZVx1MDQzMVx1MDQ0Ylx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2xheW91dF90ZXh0PVx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mg0KLXB1Ymxpc2hDb25maWdXaXphcmRfZXh0cmFEZXNjcmlwdG9ySW5mb190ZXh0PVx1MDQxZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDQxIFx1MDQzN1x1MDQzMFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzYyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2xpZ2h0V2VpZ2h0VHJlZV90ZXh0PVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzJcdTA0M2UgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOCwgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4LCBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwIFx1MDQzOCBcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0NGIgXHUwNDMxXHUwNDM1XHUwNDM3IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2VcdTA0M2ENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVFbXB0eUNhdGVnb3JpZXNfdGV4dD1cdTA0MWZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDRiXHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQzOA0KLQ0KLSMgcHVibGlzaCBwcm9jZXNzIHdpemFyZCBwYWdlDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDJcdTA0MzhcdTA0M2YgXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX3RleHQ9XHUwNDFjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDRiIFx1MDQzMiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfY2FwYWJpbGl0eV9wYXR0ZXJuPVx1MDQyOFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQ0YiBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfZGVsaXZlcnlfcHJvY2Vzcz1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0NGIgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDM4DQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3NlbGVjdFR5cGU9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0Mlx1MDQzOFx1MDQzZiBcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfdHlwZV9wcm9jZXNzZXM9XHUwNDFlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0NGI6DQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3R5cGVfY29uZmlnPVx1MDQxZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3B1Ymxpc2hfYmFzZV9wcm9jZXNzZXM9XHUwNDFlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0NGJcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDRiDQotDQotIyBQdWJsaXNoaW5nIFByZWZlcmVuY2UgUGFnZQ0KLXByZWZlcmVuY2VQYWdlX2RlZmF1bHRQYXRoX3RleHQ9XHUwNDFmXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzZSBcdTA0NDNcdTA0M2NcdTA0M2VcdTA0M2JcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGU6DQotDQotIyBDb25maXJtYXRpb24gRGlhbG9ncw0KLXB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU9XHUwNDFlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1jb25maXJtUGF0aERpYWxvZ190ZXh0PVx1MDQyNlx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgLSAnJ3swfScnLiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGM/DQotb3ZlcndyaXRlRGlhbG9nX3RleHQ9XHUwNDI2XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyAnJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIuIFx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDMyIFx1MDQzZlx1MDQzMFx1MDQzZlx1MDQzYVx1MDQzNSBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDRiLiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGM/DQotY2FuY2VsUHVibGlzaENvbmZpZ19tc2c9XHUwNDFlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2VcdTA0NDJcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzAuDQotDQotIyBFcnJvciBEaWFsb2dzDQotcHJldmlld0NvbmZpZ0Vycm9yX3RpdGxlPVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MCBcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLXZpZXdSZXBvcnRFcnJvcl90aXRsZT1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzVcdTA0NDJcdTA0NGMgXHUwNDNlXHUwNDQyXHUwNDQ3XHUwNDM1XHUwNDQyIFx1MDQzZSBcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbWlzc2luZ1ZpZXdFcnJvcl9tc2c9SVVQUDAxMDBXOiBcdTA0MTIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2RcdTA0MzVcdTA0NDIgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4gXHUwNDE0XHUwNDNlXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDRjXHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDQzXHUwNDRlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZS4NCi1jYW5ub3RQdWJsaXNoRXJyb3JfbXNnPUlVUFAwMTAxRTogXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NGYgXHUwNDNlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjLg0KLWludmFsaWRQYXRoRXJyb3JfbXNnPUlVUFAwMTAyRTogXHUwNDI2XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyBcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDIgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzZFx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzYy4NCi1pbnZhbGlkUGF0aENoYXJzRXJyb3JfbXNnPUlVUFAwMTAzRTogXHUwNDEyIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOCBcdTA0NDZcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzXHUwNDMwIFx1MDQzZFx1MDQzNSBcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0M2RcdTA0M2UgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQ0NSBcdTA0NDFcdTA0MzhcdTA0M2NcdTA0MzJcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzI6IFxcICMgKiA/ICIgPCA+IHwgISAlIC8NCi1wdWJsaXNoQ29uZmlnRXJyb3JfbXNnPUlVUFAwMTA0RTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZS4NCi1wcmV2aWV3Q29uZmlnRXJyb3JfbXNnPUlVUFAwMTA1RTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDQwIEhUTUwgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLXZpZXdSZXBvcnRFcnJvcl9tc2c9SVVQUDAxMDZFOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0NDAgSFRNTCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDMwIFx1MDQzZVx1MDQ0Mlx1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQzMCBcdTA0M2UgXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLQ0KLSMgRXJyb3IgUmVhc29ucyAmIFJlY29tbWVuZGVkIEFjdGlvbnMNCi1wdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uPUlVUFAwMTA3RTogXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDQ4XHUwNDNiXHUwNDMwIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMC4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVx1MDQxMiBcdTA0NDZcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzJcdTA0M2VcdTA0M2MgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzXHUwNDM1ICcnezB9JycgXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRjIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0YiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMuXG5cblx1MDQxN1x1MDQzMFx1MDQzYVx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0NGRcdTA0NDJcdTA0M2UgXHUwNDNlXHUwNDNhXHUwNDNkXHUwNDNlIFx1MDQzOCBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMy4NCi1jcmVhdGVEaXJFcnJvcl9yZWFzb249XHUwNDFkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDZcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzICcnezB9JycuXG5cblx1MDQxN1x1MDQzMFx1MDQzYVx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0NGRcdTA0NDJcdTA0M2UgXHUwNDNlXHUwNDNhXHUwNDNkXHUwNDNlIFx1MDQzOCBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMy4NCi1vcGVuQnJvd3NlckVycm9yX3JlYXNvbj1cdTA0MWRcdTA0MzUgXHUwNDNkXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNkIFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzY1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0NDAgSFRNTCBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlLlxuXG5cdTA0MTdcdTA0MzBcdTA0M2FcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDRkXHUwNDQyXHUwNDNlIFx1MDQzZVx1MDQzYVx1MDQzZFx1MDQzZSBcdTA0MzggXHUwNDMyXHUwNDQwXHUwNDQzXHUwNDQ3XHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgJyd7MH0nJyBcdTA0MzIgXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDQwXHUwNDM1IEhUTUwuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjVmZWQ4My4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzY2I0MWIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgUHVibGlzaGluZyBVSSAoTkwyYSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNmIwNzAyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gYnJ1Z2VyZ3JcdTAwZTZuc2VmbGFkZSB0aWwgcHVibGljZXJpbmcNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIERlZmF1bHQgZmVlZGJhY2sgVVJMDQotZmVlZGJhY2tVUkw9aHR0cDovL3d3dy5wdWJsaXNoZWRfd2Vic2l0ZS5jb20vZmVlZGJhY2sNCi0NCi0jIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wdWJsaXNoQ29uZmlnQWN0aW9uPSZQdWJsaWNcdTAwZTlyLi4uDQotcHVibGlzaENvbmZpZ0FjdGlvblRvb2x0aXA9UHVibGljXHUwMGU5ciBldCB3ZWJzdGVkIGZvciBlbiBrb25maWd1cmF0aW9uDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1wdWJsaXNoaW5nT3B0aW9ucz1QdWJsaWNlcmluZ3NpbmRzdGlsbGluZ2VyDQotDQotIyBQdWJsaXNoaW5nIEFjdGlvbnMNCi1jb25maWdBY3Rpb25TZXQ9S29uZmlndXJhdGlvbg0KLWNvbmZpZ01lbnU9JktvbmZpZ3VyYXRpb24NCi0NCi0jIFByaW50IENvbmZpZ3VyYXRpb24gQWN0aW9uDQotcHJpbnRDb25maWdBY3Rpb249VWRza3Jpdg0KLQ0KLSMgdGhlIHRpdGxlIGZvciB0aGUgcHVibGlzaGVkIHNpdGUNCi0jZG9uJ3QgZGVmaW5lIGhlcmUsIGxldCB1c2VyIHNwZWNpZnkgaXQuDQotI3RpdGxlPU9wZW5VUC9CYXNpYw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIERlZmF1bHQgUHVibGlzaCBQYXRoDQotcHVibGlzaFBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9QdWJsaXNoDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlMTlkOGMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlPVB1YmxpY1x1MDBlOXIgbWV0b2Rla29uZmlndXJhdGlvbg0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1WXHUwMGU2bGcgbWV0b2Rla29uZmlndXJhdGlvbg0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVZcdTAwZTZsZyBkZW4gbWV0b2Rla29uZmlndXJhdGlvbiwgZHUgdmlsIHB1YmxpY2VyZS4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RpdGxlPUFuZ2l2IHB1YmxpY2VyaW5nc2luZHN0aWxsaW5nZXINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RleHQ9QW5naXYgZGVzdGluYXRpb25zYmlibGlvdGVrIG9nIHB1YmxpY2VyaW5nc2luZHN0aWxsaW5nZXIuDQotcHVibGlzaENvbmZpZ1dpemFyZF9tZXRob2RDb25maWdfdGV4dD1NZXRvZGVrb25maWd1cmF0aW9uOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGVzdGluYXRpb25Hcm91cF90ZXh0PURlc3RpbmF0aW9uc2JpYmxpb3Rlaw0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlyZWN0b3J5X3RleHQ9U3RpOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfdXNlRGVmYXVsdFBhdGhfdGV4dD1CcnVnIHN0YW5kYXJkc3RpDQotcHVibGlzaENvbmZpZ1dpemFyZF93ZWJTaXRlX3RleHQ9UHVibGljZXJldCB3ZWJzdGVkDQotcHVibGlzaENvbmZpZ1dpemFyZF90aXRsZV90ZXh0PVRpdGVsOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfYmFubmVySW1hZ2VfdGV4dD1CYW5uZXJiaWxsZWRlOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfYWJvdXRIVE1MX3RleHQ9T20gaW5kaG9sZDoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2ZlZWRiYWNrVVJMX3RleHQ9VGlsYmFnZW1lbGRpbmdzLVVSTDoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVJbmRleF90ZXh0PVB1YmxpY1x1MDBlOXIgaW5kZWtzc2lkZQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUdsb3NzYXJ5X3RleHQ9UHVibGljXHUwMGU5ciBvcmRsaXN0ZXNpZGUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVTZWFyY2hfdGV4dD1JbmtsdWRcdTAwZTlyIHNcdTAwZjhnZWZ1bmt0aW9uIChrclx1MDBlNnZlciBzdFx1MDBmOHR0ZSB0aWwgSmF2YS1taW5pcHJvZ3JhbSBpIGJyb3dzZXIpDQotcHVibGlzaENvbmZpZ1dpemFyZF91c2VBcHBsZXRfdGV4dD1VbmRlcnN0XHUwMGY4dCBvdmVyc2lndHN0aWxwYXNuaW5nIChrclx1MDBlNnZlciBzdFx1MDBmOHR0ZSB0aWwgSmF2YS1taW5pcHJvZ3JhbSBpIGJyb3dzZXIpDQotcHVibGlzaENvbmZpZ1dpemFyZF92YWxpZGF0aW9uR3JvdXBfdGV4dD1WYWxpZGVyaW5nDQotcHVibGlzaENvbmZpZ1dpemFyZF9jaGVja0h5cGVybGlua3NfdGV4dD1Lb250cm9sbFx1MDBlOXIgZWtzdGVybmUgaHlwZXJsaW5rDQotcHVibGlzaENvbmZpZ1dpemFyZF9kaWFncmFtR3JvdXBfdGV4dD1EaWFncmFtbWVyDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVB1YmxpY1x1MDBlOXIgYWt0aXZpdGV0c29wbHlzbmluZ3NkaWFncmFtbWVyLCBzb20gaWtrZSBlciBvcHJldHRldCBpIHByb2Nlc2VkaXRvcmVuDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVB1YmxpY1x1MDBlOXIgYWt0aXZpdGV0c2RpYWdyYW1tZXIgZm9yIHVcdTAwZTZuZHJlZGUgYWt0aXZpdGV0c3VkdmlkZWxzZXINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NvbnZlcnRCcm9rZW5MaW5rc190ZXh0PUtvbnZlcnRcdTAwZTlyIGJydWR0ZSBsaW5rIHRpbCBhbG1pbmRlbGlnIHRla3N0DQotcHVibGlzaENvbmZpZ1dpemFyZF9sYXlvdXRfdGV4dD1MYXlvdXQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2V4dHJhRGVzY3JpcHRvckluZm9fdGV4dD1QdWJsaWNcdTAwZTlyIGRlc2tyaXB0b3JlciBtZWQgaGVsZSBpbmRob2xkZXQgYWYgZGV0IHJlbGF0ZXJlZGUgbWV0b2RlaW5kaG9sZHNlbGVtZW50DQotcHVibGlzaENvbmZpZ1dpemFyZF9saWdodFdlaWdodFRyZWVfdGV4dD1HZW5lclx1MDBlOXIgdW5kZXJ0clx1MDBlNnN0cnVrdHVyIGZvciBvcGdhdmUtLCByb2xsZS0sIGFyYmVqZHNwcm9kdWt0LSBvZyBkaXNjaXBsaW5lbGVtZW50ZXIgdWRlbiBmb2xkZXJlDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlRW1wdHlDYXRlZ29yaWVzX3RleHQ9UHVibGljXHUwMGU5ciBrYXRlZ29yaWVyIHVkZW4ga2F0ZWdvcmlzZXJlZGUgZWxlbWVudGVyDQotDQotIyBwdWJsaXNoIHByb2Nlc3Mgd2l6YXJkIHBhZ2UNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGl0bGU9Vlx1MDBlNmxnIHB1YmxpY2VyaW5nc3R5cGUNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGV4dD1EdSBrYW4gZW50ZW4gcHVibGljZXJlIGRlbiB2YWxndGUga29uZmlndXJhdGlvbiBlbGxlciBkZSBhbmdpdm5lIHByb2Nlc3NlciBpIGtvbmZpZ3VyYXRpb25lbg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9jYXBhYmlsaXR5X3BhdHRlcm49RnVua3Rpb25zbVx1MDBmOG5zdHJlDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX2RlbGl2ZXJ5X3Byb2Nlc3M9TGV2ZXJpbmdzcHJvY2Vzc2VyDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3NlbGVjdFR5cGU9Vlx1MDBlNmxnIHB1YmxpY2VyaW5nc3R5cGUNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfdHlwZV9wcm9jZXNzZXM9UHVibGljXHUwMGU5ciBkZSBuZWRlbmZvciB2YWxndGUgcHJvY2Vzc2VyOg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF90eXBlX2NvbmZpZz1QdWJsaWNcdTAwZTlyIGRlbiB2YWxndGUga29uZmlndXJhdGlvbg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9wdWJsaXNoX2Jhc2VfcHJvY2Vzc2VzPVB1YmxpY1x1MDBlOXIgcmVmZXJlcmVkZSBiYXNpc3Byb2Nlc3Nlcg0KLQ0KLSMgUHVibGlzaGluZyBQcmVmZXJlbmNlIFBhZ2UNCi1wcmVmZXJlbmNlUGFnZV9kZWZhdWx0UGF0aF90ZXh0PVN0YW5kYXJkc3RpOg0KLQ0KLSMgQ29uZmlybWF0aW9uIERpYWxvZ3MNCi1wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlPVB1YmxpY1x1MDBlOXIgbWV0b2Rla29uZmlndXJhdGlvbg0KLWNvbmZpcm1QYXRoRGlhbG9nX3RleHQ9RGVzdGluYXRpb25zc3RpZW4gZXIgb3BsXHUwMGY4c3QgdGlsICcnezB9JycuIFZpbCBkdSBmb3J0c1x1MDBlNnR0ZT8NCi1vdmVyd3JpdGVEaWFsb2dfdGV4dD1EZXN0aW5hdGlvbnNzdGllbiAnJ3swfScnIGZpbmRlcyBhbGxlcmVkZS4gQWxsZSBmaWxlciBpIGZvbGRlcmVuIGJsaXZlciBzbGV0dGV0LiBWaWwgZHUgZm9ydHNcdTAwZTZ0dGU/DQotY2FuY2VsUHVibGlzaENvbmZpZ19tc2c9UHVibGljZXJpbmdlbiBlciBhbm51bGxlcmV0Lg0KLQ0KLSMgRXJyb3IgRGlhbG9ncw0KLXByZXZpZXdDb25maWdFcnJvcl90aXRsZT1WaXMgcmVzdWx0YXQgYWYgcHVibGljZXJldCBtZXRvZGVrb25maWd1cmF0aW9uDQotdmlld1JlcG9ydEVycm9yX3RpdGxlPVZpcyBwdWJsaWNlcmluZ3NyYXBwb3J0DQotDQotIyBFcnJvciBNZXNzYWdlcw0KLW1pc3NpbmdWaWV3RXJyb3JfbXNnPUlVUFAwMTAwVzogRGVuIHZhbGd0ZSBrb25maWd1cmF0aW9uIGluZGVob2xkZXIgaWtrZSBlbiBneWxkaWcgb3ZlcnNpZ3QuIFJlZGlnXHUwMGU5ciBrb25maWd1cmF0aW9uZW4sIG9nIHRpbGZcdTAwZjhqIGVuIG92ZXJzaWd0LCBlbGxlciB2XHUwMGU2bGcgZW4gYW5kZW4ga29uZmlndXJhdGlvbi4NCi1jYW5ub3RQdWJsaXNoRXJyb3JfbXNnPUlVUFAwMTAxRTogRGVuIHZhbGd0ZSBrb25maWd1cmF0aW9uIGthbiBpa2tlIHB1YmxpY2VyZXMuDQotaW52YWxpZFBhdGhFcnJvcl9tc2c9SVVQUDAxMDJFOiBEZXN0aW5hdGlvbnNzdGllbiBlciB0b20gZWxsZXIgdWd5bGRpZy4NCi1pbnZhbGlkUGF0aENoYXJzRXJyb3JfbXNnPUlVUFAwMTAzRTogRGVzdGluYXRpb25zc3RpZW4gbVx1MDBlNSBpa2tlIGluZGVob2xkZSBmXHUwMGY4bGdlbmRlIHRlZ246IFxcICMgKiA/ICIgPCA+IHwgISAlIC8NCi1wdWJsaXNoQ29uZmlnRXJyb3JfbXNnPUlVUFAwMTA0RTogRGVuIHZhbGd0ZSBrb25maWd1cmF0aW9uIGVyIGlra2UgcHVibGljZXJldC4NCi1wcmV2aWV3Q29uZmlnRXJyb3JfbXNnPUlVUFAwMTA1RTogS2FuIGlra2UgXHUwMGU1Ym5lIGVuIEhUTUwtYnJvd3NlciBmb3IgYXQgdmlzZSByZXN1bHRhdGV0IGFmIGRlbiBwdWJsaWNlcmVkZSBrb25maWd1cmF0aW9uLg0KLXZpZXdSZXBvcnRFcnJvcl9tc2c9SVVQUDAxMDZFOiBLYW4gaWtrZSBcdTAwZTVibmUgZW4gSFRNTC1icm93c2VyIGZvciBhdCB2aXNlIHB1YmxpY2VyaW5nc3JhcHBvcnRlbi4NCi0NCi0jIEVycm9yIFJlYXNvbnMgJiBSZWNvbW1lbmRlZCBBY3Rpb25zDQotcHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbj1JVVBQMDEwN0U6IERlciBlciBvcHN0XHUwMGU1ZXQgZW4gZmVqbC4gS2xpayBwXHUwMGU1IE9wbHlzbmluZ2VyIGZvciBhdCBmXHUwMGU1IGZsZXJlIG9wbHlzbmluZ2VyLg0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPURlc3RpbmF0aW9uc3N0aWVuICcnezB9JycgaW5kZWhvbGRlciBmaWxlciwgc29tIGlra2Uga2FuIHNsZXR0ZXMuXG5cbkx1ayBkZW5uZSBkaWFsb2csIG9nIGFuZ2l2IGVuIGFuZGVuIHN0aS4NCi1jcmVhdGVEaXJFcnJvcl9yZWFzb249RGVzdGluYXRpb25zc3RpZW4gJyd7MH0nJyBrYW4gaWtrZSBvcHJldHRlcy5cblxuTHVrIGRlbm5lIGRpYWxvZywgb2cgYW5naXYgZW4gYW5kZW4gc3RpLg0KLW9wZW5Ccm93c2VyRXJyb3JfcmVhc29uPUthbiBpa2tlIGZpbmRlIHN0YW5kYXJkLUhUTUwtYnJvd3NlcmVuIHBcdTAwZTUgZGV0dGUgc3lzdGVtLlxuXG5MdWsgZGVubmUgZGlhbG9nLCBvZyBcdTAwZTVibiBmaWxlbiAnJ3swfScnIG1hbnVlbHQgbWVkIGVuIEhUTUwtYnJvd3Nlci4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4ZjFlYTUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnJjcC5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlNTMxNjkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotc291cmNlLm5sMS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMS5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gZnJhZ21lbnQueG1sLFwNCi0gICAgICAgICAgICAgICBubDEuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9pdC5wcm9wZXJ0aWVzDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9mcmFnbWVudC54bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL2ZyYWdtZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTUxMGJjNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL2ZyYWdtZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08ZnJhZ21lbnQKLSAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLm5sMSIKLSAgIG5hbWU9IkVQRiBDb21wb3NlciBXb3JrYmVuY2ggKE5MMSkiCi0gICB2ZXJzaW9uPSIxLjIuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IklCTSIKLSAgIHBsdWdpbi1pZD0ib3JnLmVjbGlwc2UuZXBmLnJjcCIKLSAgIHBsdWdpbi12ZXJzaW9uPSIxLjIuMCI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0ibmwxLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotPC9mcmFnbWVudD4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZjNiYTY3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBDb21wb3NlciBSQ1ANCi1wcm9kdWN0TmFtZT1FUEYgQ29tcG9zZXINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1ldGhvZGUNCi0NCi0jIFZpZXdzDQotd2VsY29tZVZpZXdOYW1lPVdpbGxrb21tZW4NCi0NCi0jIEFjdGlvbnMNCi1nbG9iYWxBY3Rpb25TZXQ9R2xvYmFsZSBBa3Rpb25zZ3J1cHBlDQotbmV3QWN0aW9uPSZOZXUNCi1uZXdBY3Rpb25Ub29sdGlwPU5ldQ0KLW9wZW5BY3Rpb249XHUwMGQ2JmZmbmVuLi4uDQotb3BlbkFjdGlvblRvb2x0aXA9XHUwMGQ2ZmZuZW4NCi1zZWFyY2hBY3Rpb249JlN1Y2hlbi4uLg0KLXNlYXJjaEFjdGlvblRvb2x0aXA9U3VjaGVuDQotd2VsY29tZUFjdGlvbj0mV2lsbGtvbW1lbg0KLXdlbGNvbWVBY3Rpb25Ub29sVGlwPVdpbGxrb21tZW4NCi0NCi0jIFRvb2x0aXBzDQotc2hvcnRjdXQub3ZlcnZpZXcudG9vbHRpcD1adXIgU2VpdGUgIlx1MDBkY2JlcnNpY2h0IiB6dXJcdTAwZmNja2tlaHJlbg0KLXNob3J0Y3V0LnR1dG9yaWFscy50b29sdGlwPVp1ciBTZWl0ZSAiTGVybnByb2dyYW1tIiB6dXJcdTAwZmNja2tlaHJlbg0KLXNob3J0Y3V0LmZpcnN0c3RlcHMudG9vbHRpcD1adXIgU2VpdGUgIkVyc3RlIFNjaHJpdHRlIiB6dXJcdTAwZmNja2tlaHJlbg0KLXNob3J0Y3V0LndlYnJlc291cmNlcy50b29sdGlwPVp1ciBTZWl0ZSAiV2VicmVzc291cmNlbiIgenVyXHUwMGZjY2trZWhyZW4NCi0NCi0jQWN0aW9uIFNldA0KLWFjdGlvblNldC5kZXNjcmlwdGlvbiA9IEFrdGlvbmVuIGluIGRlciBGdW5rdGlvbnNsZWlzdGUgZGVzIEhpbGZlc3lzdGVtcw0KLWFjdGlvblNldC5sYWJlbCA9IEhpbGZlc3lzdGVtDQotc2VhcmNoQWN0aW9uLmxhYmVsID0gSGlsZmUgZHVyY2hzdWNoZW4NCi1zZWFyY2hBY3Rpb24udG9vbHRpcCA9IEhpbGZlIGR1cmNoc3VjaGVuDQotZHluYW1pY0hlbHBBY3Rpb24ubGFiZWwgPSBEeW5hbWlzY2hlIEhpbGZlDQotZHluYW1pY0hlbHBBY3Rpb24udG9vbHRpcCA9IER5bmFtaXNjaGUgSGlsZmUNCi0jQWN0aXZpdGllcy9DYXBhYmlsaXRpZXMNCi1hY3Rpdml0eS5nZW5lcmFsPVByb2pla3RlIHVuZCBSZXNzb3VyY2VuIGltcG9ydGllcmVuIHVuZCBleHBvcnRpZXJlbg0KLWFjdGl2aXR5LmdlbmVyYWwuZGVzYz1TdGFuZGFyZC1FY2xpcHNlLUZ1bmt0aW9uZW4gZlx1MDBmY3IgZGVuIEltcG9ydCB1bmQgRXhwb3J0IHZvbiBQcm9qZWt0ZW4gdW5kIFJlc3NvdXJjZW4gdmVyd2VuZGVuLg0KLWFjdGl2aXR5LnRlYW0uY3ZzPUNWUy1VbnRlcnN0XHUwMGZjdHp1bmcNCi1hY3Rpdml0eS50ZWFtLmN2cy5kZXNjPUNvbmN1cnJlbnQgVmVyc2lvbnMgU3lzdGVtIChDVlMpIGZcdTAwZmNyIGRpZSBWZXJ3YWx0dW5nIHZvbiBSZXNzb3VyY2VuIHZlcndlbmRlbi4NCi1hY3Rpdml0eS50ZWFtPUJhc2lzdGVhbXVudGVyc3RcdTAwZmN0enVuZw0KLWFjdGl2aXR5LnRlYW0uZGVzYz1Qcm9qZWt0ZSB1bnRlciBWZXJ3ZW5kdW5nIHZvbiBLb25maWd1cmF0aW9uc21hbmFnZW1lbnRzeXN0ZW1lbiBnZW1laW5zYW0gbnV0emVuLg0KLQ0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsPUFsbGdlbWVpbg0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsLmRlc2M9U3RhbmRhcmQtRWNsaXBzZS1GdW5rdGlvbmVuIHZlcndlbmRlbi4NCi1hY3Rpdml0eS5jYXQudGVhbT1UZWFtDQotYWN0aXZpdHkuY2F0LnRlYW0uZGVzYz1Lb25maWd1cmF0aW9uc21hbmFnZW1lbnRzeXN0ZW1lIGZcdTAwZmNyIGRpZSBWZXJ3YWx0dW5nIHZvbiBSZXNzb3VyY2VuIHZlcndlbmRlbi4NCi0NCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzID0gRnVua3Rpb25lbg0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlOYW1lID0gJkZ1bmt0aW9uZW4NCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhdGVnb3J5TmFtZSA9ICZGdW5rdGlvbmVuDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvbiA9ICZTeXN0ZW1hbmZyYWdlIGJlaW0gQWt0aXZpZXJlbiB2b24gRnVua3Rpb25lbg0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b25Ub29sdGlwID0gRXMgZXJzY2hlaW50IGVpbmUgU3lzdGVtYW5mcmFnZSwgd2VubiBlaW4gRmVhdHVyZSwgZGFzIGRpZSBBa3RpdmllcnVuZyB2b24gRnVua3Rpb24gdm9yYXVzc2V0enQsIHp1bSBlcnN0ZW4gTWFsIHZlcndlbmRldCB3aXJkLg0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2FwdGlvbk1lc3NhZ2UgPSBNaXQgRnVua3Rpb25lbiBrXHUwMGY2bm5lbiBTaWUgdmVyc2NoaWVkZW5lIFByb2R1a3Rrb21wb25lbnRlbiBha3RpdmllcmVuIHVuZCBpbmFrdGl2aWVyZW4uIERpZXNlIEZ1bmt0aW9uZW4gc2luZCBuYWNoIGVpbmVyIEdydXBwZSB2b3JkZWZpbmllcnRlciBLYXRlZ29yaWVuIGdydXBwaWVydC4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAzNDVmOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1SQ1AgZGUgY29tcG9zaXRvciBkZSBFUEYNCi1wcm9kdWN0TmFtZT1Db21wb3NpdG9yIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgQ2F0ZWdvcnkNCi1tZXRob2RDYXRlZ29yeU5hbWU9TVx1MDBlOXRvZG8NCi0NCi0jIFZpZXdzDQotd2VsY29tZVZpZXdOYW1lPUJpZW52ZW5pZGENCi0NCi0jIEFjdGlvbnMNCi1nbG9iYWxBY3Rpb25TZXQ9Q29uanVudG8gZGUgYWNjaW9uZXMgZ2xvYmFsZXMNCi1uZXdBY3Rpb249Jk51ZXZvDQotbmV3QWN0aW9uVG9vbHRpcD1OdWV2bw0KLW9wZW5BY3Rpb249JkFicmlyLi4uDQotb3BlbkFjdGlvblRvb2x0aXA9QWJyaXINCi1zZWFyY2hBY3Rpb249JkJ1c2Nhci4uLg0KLXNlYXJjaEFjdGlvblRvb2x0aXA9QnVzY2FyDQotd2VsY29tZUFjdGlvbj0mQmllbnZlbmlkYQ0KLXdlbGNvbWVBY3Rpb25Ub29sVGlwPUJpZW52ZW5pZGENCi0NCi0jIFRvb2x0aXBzDQotc2hvcnRjdXQub3ZlcnZpZXcudG9vbHRpcD1Wb2x2ZXIgYSBsYSBwXHUwMGUxZ2luYSBWaXNpXHUwMGYzbiBnZW5lcmFsDQotc2hvcnRjdXQudHV0b3JpYWxzLnRvb2x0aXA9Vm9sdmVyIGEgbGEgcFx1MDBlMWdpbmEgR3VcdTAwZWRhIGRlIGFwcmVuZGl6YWplDQotc2hvcnRjdXQuZmlyc3RzdGVwcy50b29sdGlwPVZvbHZlciBhIGxhIHBcdTAwZTFnaW5hIFByaW1lcm9zIHBhc29zDQotc2hvcnRjdXQud2VicmVzb3VyY2VzLnRvb2x0aXA9Vm9sdmVyIGEgbGEgcFx1MDBlMWdpbmEgUmVjdXJzb3Mgd2ViICAgICAgIA0KLQ0KLSNBY3Rpb24gU2V0DQotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gQWNjaW9uZXMgZGUgbGEgYmFycmEgZGUgaGVycmFtaWVudGFzIGRlbCBzaXN0ZW1hIGRlIGF5dWRhDQotYWN0aW9uU2V0LmxhYmVsID0gU2lzdGVtYSBkZSBheXVkYQ0KLXNlYXJjaEFjdGlvbi5sYWJlbCA9IEJ1c2NhciBlbiBsYSBheXVkYQ0KLXNlYXJjaEFjdGlvbi50b29sdGlwID0gQnVzY2FyIGVuIGxhIGF5dWRhDQotZHluYW1pY0hlbHBBY3Rpb24ubGFiZWwgPSBBeXVkYSBkaW5cdTAwZTFtaWNhIA0KLWR5bmFtaWNIZWxwQWN0aW9uLnRvb2x0aXAgPSBBeXVkYSBkaW5cdTAwZTFtaWNhDQotDQotI0FjdGl2aXRpZXMvQ2FwYWJpbGl0aWVzDQotYWN0aXZpdHkuZ2VuZXJhbD1JbXBvcnRhciB5IGV4cG9ydGFyIHByb3llY3RvcyB5IHJlY3Vyc29zDQotYWN0aXZpdHkuZ2VuZXJhbC5kZXNjPVV0aWxpemFyIGxhcyBmdW5jaW9uZXMgZXN0XHUwMGUxbmRhciBkZSBJbXBvcnRhci9FeHBvcnRhciBwcm95ZWN0b3MvcmVjdXJzb3MgZGUgRWNsaXBzZS4NCi1hY3Rpdml0eS50ZWFtLmN2cz1Tb3BvcnRlIGRlIENWUw0KLWFjdGl2aXR5LnRlYW0uY3ZzLmRlc2M9VXRpbGl6YXIgZWwgU2lzdGVtYSBkZSB2ZXJzaW9uZXMgY29uY3VycmVudGVzIChDVlMpIHBhcmEgZ2VzdGlvbmFyIHJlY3Vyc29zLg0KLWFjdGl2aXR5LnRlYW09U29wb3J0ZSBkZWwgZXF1aXBvIGJcdTAwZTFzaWNvDQotYWN0aXZpdHkudGVhbS5kZXNjPUNvbXBhcnRpciBwcm95ZWN0b3MgbWVkaWFudGUgc2lzdGVtYXMgZGUgZ2VzdGlcdTAwZjNuIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbi4NCi0NCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbD1HZW5lcmFsDQotYWN0aXZpdHkuY2F0LmdlbmVyYWwuZGVzYz1VdGlsaXphciBsYXMgZnVuY2lvbmVzIGVzdFx1MDBlMW5kYXIgZGUgRWNsaXBzZS4NCi1hY3Rpdml0eS5jYXQudGVhbT1FcXVpcG8NCi1hY3Rpdml0eS5jYXQudGVhbS5kZXNjPVV0aWxpemFyIHNpc3RlbWFzIGRlIGdlc3RpXHUwMGYzbiBkZSBsYSBjb25maWd1cmFjaVx1MDBmM24gcGFyYSBnZXN0aW9uYXIgcmVjdXJzb3MuDQotDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcyA9IEZ1bmNpb25lcw0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlOYW1lID0gJkZ1bmNpb25lcw0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2F0ZWdvcnlOYW1lID0gJkZ1bmNpb25lcw0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b24gPSBNb3N0cmFyICZzb2xpY2l0dWQgYWwgaGFiaWxpdGFyIGZ1bmNpb25lcw0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b25Ub29sdGlwID0gTW9zdHJhciBzb2xpY2l0dWQgY3VhbmRvIHVuYSBjYXJhY3Rlclx1MDBlZHN0aWNhIHF1ZSBuZWNlc2l0ZSBsYSBoYWJpbGl0YWNpXHUwMGYzbiBkZSBmdW5jaW9uZXMgc2UgdXRpbGljZSBwb3IgcHJpbWVyYSB2ZXoNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhcHRpb25NZXNzYWdlID0gTGFzIGZ1bmNpb25lcyBsZSBwZXJtaXRlbiBoYWJpbGl0YXIgbyBpbmhhYmlsaXRhciBkaXZlcnNvcyBjb21wb25lbnRlcyBkZWwgcHJvZHVjdG8uICBFc3RhcyBmdW5jaW9uZXMgc2UgYWdydXBhbiBkZSBhY3VlcmRvIGEgdW4gY29uanVudG8gZGUgY2F0ZWdvclx1MDBlZGFzIHByZWRlZmluaWRhcy4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjhiNWZjOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1QbGF0ZWZvcm1lIGNsaWVudCBlbnJpY2hpIGR1IGNvbXBvc2V1ciBFUEYNCi1wcm9kdWN0TmFtZT1Db21wb3NldXIgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBDYXRlZ29yeQ0KLW1ldGhvZENhdGVnb3J5TmFtZT1NXHUwMGU5dGhvZGUNCi0NCi0jIFZpZXdzDQotd2VsY29tZVZpZXdOYW1lPUJpZW52ZW51ZQ0KLQ0KLSMgQWN0aW9ucw0KLWdsb2JhbEFjdGlvblNldD1KZXUgZCdhY3Rpb25zIGdsb2JhbA0KLW5ld0FjdGlvbj0mTm91dmVhdQ0KLW5ld0FjdGlvblRvb2x0aXA9Tm91dmVhdQ0KLW9wZW5BY3Rpb249Jk91dnJpci4uLg0KLW9wZW5BY3Rpb25Ub29sdGlwPU91dnJpcg0KLXNlYXJjaEFjdGlvbj0mUmVjaGVyY2hlci4uLg0KLXNlYXJjaEFjdGlvblRvb2x0aXA9UmVjaGVyY2hlcg0KLXdlbGNvbWVBY3Rpb249JkJpZW52ZW51ZQ0KLXdlbGNvbWVBY3Rpb25Ub29sVGlwPUJpZW52ZW51ZQ0KLQ0KLSMgVG9vbHRpcHMNCi1zaG9ydGN1dC5vdmVydmlldy50b29sdGlwPVJldG91cm5lciBcdTAwZTAgbGEgcGFnZSBHXHUwMGU5blx1MDBlOXJhbGl0XHUwMGU5cw0KLXNob3J0Y3V0LnR1dG9yaWFscy50b29sdGlwPVJldG91cm5lciBcdTAwZTAgbGEgcGFnZSBUdXRvcmllbA0KLXNob3J0Y3V0LmZpcnN0c3RlcHMudG9vbHRpcD1SZXRvdXJuZXIgXHUwMGUwIGxhIHBhZ2UgUHJlbWllcnMgcGFzDQotc2hvcnRjdXQud2VicmVzb3VyY2VzLnRvb2x0aXA9UmV0b3VybmVyIFx1MDBlMCBsYSBwYWdlIFJlc3NvdXJjZXMgV2ViICAgICAgIA0KLQ0KLSNBY3Rpb24gU2V0DQotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gQWN0aW9ucyBkZSBsYSBiYXJyZSBkJ291dGlscyBzeXN0XHUwMGU4bWUgZGUgbCdhaWRlDQotYWN0aW9uU2V0LmxhYmVsID0gU3lzdFx1MDBlOG1lIGQnYWlkZQ0KLXNlYXJjaEFjdGlvbi5sYWJlbCA9IEFpZGUgZGUgbGEgcmVjaGVyY2hlDQotc2VhcmNoQWN0aW9uLnRvb2x0aXAgPSBBaWRlIGRlIGxhIHJlY2hlcmNoZQ0KLWR5bmFtaWNIZWxwQWN0aW9uLmxhYmVsID0gQWlkZSBkeW5hbWlxdWUgDQotZHluYW1pY0hlbHBBY3Rpb24udG9vbHRpcCA9IEFpZGUgZHluYW1pcXVlDQotDQotI0FjdGl2aXRpZXMvQ2FwYWJpbGl0aWVzDQotYWN0aXZpdHkuZ2VuZXJhbD1JbXBvcnRlciBldCBleHBvcnRlciBkZXMgcHJvamV0cyBldCBkZXMgcmVzc291cmNlcw0KLWFjdGl2aXR5LmdlbmVyYWwuZGVzYz1VdGlsaXNleiBsZXMgZm9uY3Rpb25zIHN0YW5kYXJkIEltcG9ydGVyL0V4cG9ydGVyIGxlIHByb2pldC9sZXMgcmVzc291cmNlcyBkJ0VjbGlwc2UuDQotYWN0aXZpdHkudGVhbS5jdnM9UHJpc2UgZW4gY2hhcmdlIENWUw0KLWFjdGl2aXR5LnRlYW0uY3ZzLmRlc2M9VXRpbGlzZXogbGUgc3lzdFx1MDBlOG1lIENWUyAoQ29uY3VycmVudCBWZXJzaW9ucyBTeXN0ZW0pIHBvdXIgZ1x1MDBlOXJlciBsZXMgcmVzc291cmNlcy4NCi1hY3Rpdml0eS50ZWFtPVByaXNlIGVuIGNoYXJnZSBkZSBsJ1x1MDBlOXF1aXBlIHByaW5jaXBhbGUNCi1hY3Rpdml0eS50ZWFtLmRlc2M9UGFydGFnZXogZGVzIHByb2pldHMgXHUwMGUwIGwnYWlkZSBkZXMgc3lzdFx1MDBlOG1lcyBkZSBnZXN0aW9uIGRlIGNvbmZpZ3VyYXRpb24uDQotDQotYWN0aXZpdHkuY2F0LmdlbmVyYWw9RGlzcG9zaXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMNCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbC5kZXNjPVV0aWxpc2V6IGxlcyBmb25jdGlvbnMgc3RhbmRhcmQgZCdFY2xpcHNlLg0KLWFjdGl2aXR5LmNhdC50ZWFtPUVxdWlwZQ0KLWFjdGl2aXR5LmNhdC50ZWFtLmRlc2M9VXRpbGlzZXogbGVzIHN5c3RcdTAwZThtZXMgZGUgZ2VzdGlvbiBkZSBjb25maWd1cmF0aW9uIHBvdXIgZ1x1MDBlOXJlciBsZXMgcmVzc291cmNlcy4NCi0NCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzID0gRm9uY3Rpb25zDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eU5hbWUgPSAmRm9uY3Rpb25zDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5jYXRlZ29yeU5hbWUgPSAmRm9uY3Rpb25zDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvbiA9ICZJbnZpdGUgbG9ycyBkZSBsJ2FjdGl2YXRpb24gZGVzIGZvbmN0aW9ucw0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b25Ub29sdGlwID0gTG9yc3F1J3VuZSBmb25jdGlvbiBlc3QgdXRpbGlzXHUwMGU5ZSBwb3VyIGxhIHByZW1pXHUwMGU4cmUgZm9pcywgdW5lIGludml0ZSBzJ2FmZmljaGUgZXQgZXhpZ2UgbCdhY3RpdmF0aW9uIGRlcyBmb25jdGlvbnMNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhcHRpb25NZXNzYWdlID0gTGVzIGZvbmN0aW9ucyB2b3VzIHBlcm1ldHRlbnQgZCdhY3RpdmVyIG91IGRlIGRcdTAwZTlzYWN0aXZlciBwbHVzaWV1cnMgY29tcG9zYW50cyBkZSBwcm9kdWl0LiAgQ2VzIGZvbmN0aW9ucyBzb250IHJlZ3JvdXBcdTAwZTllcyBzZWxvbiB1biBlbnNlbWJsZSBkZSBjYXRcdTAwZTlnb3JpZXMgcHJcdTAwZTlkXHUwMGU5ZmluaWVzLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ODE2YzJiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBDb21wb3NlciBSQ1ANCi1wcm9kdWN0TmFtZT1FUEYgQ29tcG9zZXINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1ldG9kbw0KLQ0KLSMgVmlld3MNCi13ZWxjb21lVmlld05hbWU9QmVudmVudXRpDQotDQotIyBBY3Rpb25zDQotZ2xvYmFsQWN0aW9uU2V0PUluc2llbWUgZGkgYXppb25pIGdsb2JhbGUNCi1uZXdBY3Rpb249Jk51b3ZvDQotbmV3QWN0aW9uVG9vbHRpcD1OdW92bw0KLW9wZW5BY3Rpb249JkFwcmkuLi4NCi1vcGVuQWN0aW9uVG9vbHRpcD1BcHJpDQotc2VhcmNoQWN0aW9uPSZSaWNlcmNhLi4uDQotc2VhcmNoQWN0aW9uVG9vbHRpcD1SaWNlcmNhDQotd2VsY29tZUFjdGlvbj0mQmVudmVudXRpDQotd2VsY29tZUFjdGlvblRvb2xUaXA9QmVudmVudXRpDQotDQotIyBUb29sdGlwcw0KLXNob3J0Y3V0Lm92ZXJ2aWV3LnRvb2x0aXA9Uml0b3JuYSBhbGxhIHBhZ2luYSBQYW5vcmFtaWNhDQotc2hvcnRjdXQudHV0b3JpYWxzLnRvb2x0aXA9Uml0b3JuYSBhbGxhIHBhZ2luYSBFc2VyY2l0YXppb25lDQotc2hvcnRjdXQuZmlyc3RzdGVwcy50b29sdGlwPVJpdG9ybmEgYWxsYSBwYWdpbmEgUHJpbWkgcGFzc2kNCi1zaG9ydGN1dC53ZWJyZXNvdXJjZXMudG9vbHRpcD1SaXRvcm5hIGFsbGEgcGFnaW5hIFJpc29yc2UgV2ViICAgICAgIA0KLQ0KLSNBY3Rpb24gU2V0DQotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gQXppb25pIGJhcnJhIGRlZ2xpIHN0cnVtZW50aSBzaXN0ZW1hIGRlbGxhIGd1aWRhDQotYWN0aW9uU2V0LmxhYmVsID0gU2lzdGVtYSBkZWxsYSBndWlkYQ0KLXNlYXJjaEFjdGlvbi5sYWJlbCA9IEd1aWRhIGRpIHJpY2VyY2ENCi1zZWFyY2hBY3Rpb24udG9vbHRpcCA9IEd1aWRhIGRpIHJpY2VyY2ENCi1keW5hbWljSGVscEFjdGlvbi5sYWJlbCA9IEd1aWRhIGRpbmFtaWNhIA0KLWR5bmFtaWNIZWxwQWN0aW9uLnRvb2x0aXAgPSBHdWlkYSBkaW5hbWljYSANCi0jQWN0aXZpdGllcy9DYXBhYmlsaXRpZXMNCi1hY3Rpdml0eS5nZW5lcmFsPUltcG9ydGF6aW9uZS9lc3BvcnRhemlvbmUgZGkgcmlzb3JzZSBlIHByb2dldHRpDQotYWN0aXZpdHkuZ2VuZXJhbC5kZXNjPVV0aWxpenphcmUgbGUgY2FwYWNpdFx1MDBlMCBzdGFuZGFyZCBkaSBpbXBvcnRhemlvbmUvZXNwb3J0YXppb25lIHJpc29yc2UvcHJvZ2V0dGkgZGkgRWNsaXBzZS4NCi1hY3Rpdml0eS50ZWFtLmN2cz1TdXBwb3J0byBDVlMNCi1hY3Rpdml0eS50ZWFtLmN2cy5kZXNjPVV0aWxpenphcmUgQ1ZTIChDb25jdXJyZW50IFZlcnNpb25zIFN5c3RlbSkgcGVyIGdlc3RpcmUgbGUgcmlzb3JzZS4NCi1hY3Rpdml0eS50ZWFtPVN1cHBvcnRvIHRlYW0gcHJpbmNpcGFsZQ0KLWFjdGl2aXR5LnRlYW0uZGVzYz1Db25kaXZpZGVyZSBpIHByb2dldHRpIG1lZGlhbnRlIGkgc2lzdGVtaSBkaSBnZXN0aW9uZSBkZWxsYSBjb25maWd1cmF6aW9uZS4NCi0NCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbD1HZW5lcmFsZQ0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsLmRlc2M9VXRpbGl6emFyZSBsZSBjYXBhY2l0XHUwMGUwIHN0YW5kYXJkIGRpIEVjbGlwc2UuDQotYWN0aXZpdHkuY2F0LnRlYW09VGVhbQ0KLWFjdGl2aXR5LmNhdC50ZWFtLmRlc2M9VXRpbGl6emFyZSBpIHNpc3RlbWkgZGkgZ2VzdGlvbmUgZGVsbGEgY29uZmlndXJhemlvbmUgcGVyIGdlc3RpcmUgbGUgcmlzb3JzZS4NCi0NCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzID0gQ2FwYWNpdFx1MDBlMA0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlOYW1lID0gJkNhcGFjaXRcdTAwZTANCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhdGVnb3J5TmFtZSA9ICZDYXBhY2l0XHUwMGUwDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvbiA9ICZSaWNoaWVkaSBhbGwnYWJpbGl0YXppb25lIGRlbGxlIGNhcGFjaXRcdTAwZTANCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uVG9vbHRpcCA9IFJpY2hpZWRpIHF1YW5kbyB1bmEgZnVuemlvbmUsIHV0aWxpenphdGEgcGVyIGxhIHByaW1hIHZvbHRhLCByaWNoaWVkZSBsJ2FiaWxpdGF6aW9uZSBkZWxsZSBjYXBhY2l0XHUwMGUwDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5jYXB0aW9uTWVzc2FnZSA9IExlIGNhcGFjaXRcdTAwZTAgcGVybWV0dG9ubyBkaSBhYmlsaXRhcmUgbyBkaXNhYmlsaXRhcmUgaSB2YXJpIGNvbXBvbmVudGkgZGVsIHByb2RvdHRvLiBRdWVzdGUgY2FwYWNpdFx1MDBlMCB2ZW5nb25vIHJhZ2dydXBwYXRlIGluIGJhc2UgYSB1bmEgc2VyaWUgZGkgY2F0ZWdvcmllIHByZWRlZmluaXRlLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NjNjYjNkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBDb21wb3NlciBSQ1ANCi1wcm9kdWN0TmFtZT1FUEYgQ29tcG9zZXINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOQ0KLQ0KLSMgVmlld3MNCi13ZWxjb21lVmlld05hbWU9XHUzMDg4XHUzMDQ2XHUzMDUzXHUzMDVkDQotDQotIyBBY3Rpb25zDQotZ2xvYmFsQWN0aW9uU2V0PVx1MzBiMFx1MzBlZFx1MzBmY1x1MzBkMFx1MzBlYlx1MzBmYlx1MzBhMlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOA0KLW5ld0FjdGlvbj1cdTY1YjBcdTg5OGYoJk4pDQotbmV3QWN0aW9uVG9vbHRpcD1cdTY1YjBcdTg5OGYNCi1vcGVuQWN0aW9uPVx1OTU4Ylx1MzA0ZigmTykuLi4NCi1vcGVuQWN0aW9uVG9vbHRpcD1cdTk1OGJcdTMwNGYNCi1zZWFyY2hBY3Rpb249XHU2OTFjXHU3ZDIyKCZTKS4uLg0KLXNlYXJjaEFjdGlvblRvb2x0aXA9XHU2OTFjXHU3ZDIyDQotd2VsY29tZUFjdGlvbj1cdTMwODhcdTMwNDZcdTMwNTNcdTMwNWQoJlcpDQotd2VsY29tZUFjdGlvblRvb2xUaXA9XHUzMDg4XHUzMDQ2XHUzMDUzXHUzMDVkDQotDQotIyBUb29sdGlwcw0KLXNob3J0Y3V0Lm92ZXJ2aWV3LnRvb2x0aXA9XHUzMDBjXHU2OTgyXHU4YWFjXHUzMDBkXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZiXHU2MjNiXHUzMDhiDQotc2hvcnRjdXQudHV0b3JpYWxzLnRvb2x0aXA9XHUzMDBjXHUzMGMxXHUzMGU1XHUzMGZjXHUzMGM4XHUzMGVhXHUzMGEyXHUzMGViXHUzMDBkXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZiXHU2MjNiXHUzMDhiDQotc2hvcnRjdXQuZmlyc3RzdGVwcy50b29sdGlwPVx1MzAwY1x1NjcwMFx1NTIxZFx1MzA2ZVx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkN1x1MzAwZFx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2Ylx1NjIzYlx1MzA4Yg0KLXNob3J0Y3V0LndlYnJlc291cmNlcy50b29sdGlwPVx1MzAwY1dlYiBcdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwMGRcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdTYyM2JcdTMwOGIgICAgICAgDQotDQotI0FjdGlvbiBTZXQNCi1hY3Rpb25TZXQuZGVzY3JpcHRpb24gPSBcdTMwZDhcdTMwZWJcdTMwZDdcdTMwZmJcdTMwYjdcdTMwYjlcdTMwYzZcdTMwZTBcdTMwNmVcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZDBcdTMwZmNcdTMwZmJcdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjMNCi1hY3Rpb25TZXQubGFiZWwgPSBcdTMwZDhcdTMwZWJcdTMwZDdcdTMwZmJcdTMwYjdcdTMwYjlcdTMwYzZcdTMwZTANCi1zZWFyY2hBY3Rpb24ubGFiZWwgPSBcdTY5MWNcdTdkMjJcdTMwNmVcdTMwZDhcdTMwZWJcdTMwZDcNCi1zZWFyY2hBY3Rpb24udG9vbHRpcCA9IFx1NjkxY1x1N2QyMlx1MzA2ZVx1MzBkOFx1MzBlYlx1MzBkNw0KLWR5bmFtaWNIZWxwQWN0aW9uLmxhYmVsID0gXHU1MmQ1XHU3Njg0XHUzMGQ4XHUzMGViXHUzMGQ3DQotZHluYW1pY0hlbHBBY3Rpb24udG9vbHRpcCA9IFx1NTJkNVx1NzY4NFx1MzBkOFx1MzBlYlx1MzBkNw0KLQ0KLSNBY3Rpdml0aWVzL0NhcGFiaWxpdGllcw0KLWFjdGl2aXR5LmdlbmVyYWw9XHUzMGQ3XHUzMGVkXHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDY4XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDZlXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDRhXHUzMDg4XHUzMDczXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4DQotYWN0aXZpdHkuZ2VuZXJhbC5kZXNjPVx1NmExOVx1NmU5Nlx1MzA2ZSBFY2xpcHNlIFx1MzBkN1x1MzBlZFx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOC9cdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwNmVcdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzgvXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHU2YTVmXHU4MGZkXHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotYWN0aXZpdHkudGVhbS5jdnM9Q1ZTIFx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOA0KLWFjdGl2aXR5LnRlYW0uY3ZzLmRlc2M9Q29uY3VycmVudCBWZXJzaW9ucyBTeXN0ZW0gKENWUykgXHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDY2XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotYWN0aXZpdHkudGVhbT1cdTMwYjNcdTMwYTJcdTMwZmJcdTMwYzFcdTMwZmNcdTMwZTBcdTMwZmJcdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzgNCi1hY3Rpdml0eS50ZWFtLmRlc2M9XHU2OWNiXHU2MjEwXHU3YmExXHU3NDA2XHUzMGI3XHUzMGI5XHUzMGM2XHUzMGUwXHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDY2XHUzMGQ3XHUzMGVkXHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDkyXHU1MTcxXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotYWN0aXZpdHkuY2F0LmdlbmVyYWw9XHU0ZTAwXHU4MjJjDQotYWN0aXZpdHkuY2F0LmdlbmVyYWwuZGVzYz1cdTZhMTlcdTZlOTZcdTMwNmUgRWNsaXBzZSBcdTZhNWZcdTgwZmRcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1hY3Rpdml0eS5jYXQudGVhbT1cdTMwYzFcdTMwZmNcdTMwZTANCi1hY3Rpdml0eS5jYXQudGVhbS5kZXNjPVx1NjljYlx1NjIxMFx1N2JhMVx1NzQwNlx1MzBiN1x1MzBiOVx1MzBjNlx1MzBlMFx1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzA2Nlx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMgPSBcdTZhNWZcdTgwZmQNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5TmFtZSA9IFx1NmE1Zlx1ODBmZCgmQykNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhdGVnb3J5TmFtZSA9IFx1NmE1Zlx1ODBmZCgmQykNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uID0gXHU2YTVmXHU4MGZkXHUzMDkyXHU0ZjdmXHU3NTI4XHU1M2VmXHU4MGZkXHUzMDZiXHUzMDU5XHUzMDhiXHU5NjliXHUzMDZiXHUzMGQ3XHUzMGVkXHUzMGYzXHUzMGQ3XHUzMGM4XHUzMDkyXHU1MWZhXHUzMDU5KCZQKQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b25Ub29sdGlwID0gXHU2YTVmXHU4MGZkXHUzMDkyXHU0ZjdmXHU3NTI4XHU1M2VmXHU4MGZkXHUzMDZiXHUzMDU5XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhiXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGZjXHUzMDRjXHU2NzAwXHU1MjFkXHUzMDZiXHU0ZjdmXHU3NTI4XHUzMDU1XHUzMDhjXHUzMDhiXHUzMDY4XHUzMDRkXHUzMDZiXHUzMGQ3XHUzMGVkXHUzMGYzXHUzMGQ3XHUzMGM4XHUzMDkyXHU1MWZhXHUzMDU5DQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5jYXB0aW9uTWVzc2FnZSA9IFx1NmE1Zlx1ODBmZFx1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1OVx1MzA4Ylx1MzA2OFx1MzAwMVx1MzA1NVx1MzA3ZVx1MzA1Nlx1MzA3ZVx1MzA2YVx1ODhmZFx1NTRjMVx1MzBiM1x1MzBmM1x1MzBkZFx1MzBmY1x1MzBjZFx1MzBmM1x1MzBjOFx1MzA5Mlx1NGY3Zlx1NzUyOFx1NTNlZlx1ODBmZFx1MzA3ZVx1MzA1Zlx1MzA2Zlx1NGY3Zlx1NzUyOFx1NGUwZFx1NTNlZlx1MzA2Ylx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMiAgXHUzMDUzXHUzMDhjXHUzMDg5XHUzMDZlXHU2YTVmXHU4MGZkXHUzMDZmXHUzMDAxXHU0ZThiXHU1MjRkXHU1YjlhXHU3ZmE5XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGJiXHUzMGMzXHUzMGM4XHUzMDZiXHU1ZmRjXHUzMDU4XHUzMDY2XHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHU1MzE2XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxOWVlNjcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIENvbXBvc2VyIFJDUA0KLXByb2R1Y3ROYW1lPUVQRiBDb21wb3Nlcg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgQ2F0ZWdvcnkNCi1tZXRob2RDYXRlZ29yeU5hbWU9XHViYTU0XHVjMThjXHViNGRjDQotDQotIyBWaWV3cw0KLXdlbGNvbWVWaWV3TmFtZT1cdWQ2NThcdWM2MDENCi0NCi0jIEFjdGlvbnMNCi1nbG9iYWxBY3Rpb25TZXQ9XHVhZTAwXHViODVjXHViYzhjIFx1Yzg3MFx1Y2U1OCBcdWMxMzhcdWQyYjgNCi1uZXdBY3Rpb249XHVjMGM4XHViODVjIFx1Yzc5MVx1YzEzMSgmTikNCi1uZXdBY3Rpb25Ub29sdGlwPVx1YzBjOFx1Yjg1YyBcdWM3OTFcdWMxMzENCi1vcGVuQWN0aW9uPVx1YzVmNFx1YWUzMCgmTykuLi4NCi1vcGVuQWN0aW9uVG9vbHRpcD1cdWM1ZjRcdWFlMzANCi1zZWFyY2hBY3Rpb249XHVhYzgwXHVjMGM5KCZTKS4uLg0KLXNlYXJjaEFjdGlvblRvb2x0aXA9XHVhYzgwXHVjMGM5DQotd2VsY29tZUFjdGlvbj1cdWQ2NThcdWM2MDEoJlcpDQotd2VsY29tZUFjdGlvblRvb2xUaXA9XHVkNjU4XHVjNjAxDQotDQotIyBUb29sdGlwcw0KLXNob3J0Y3V0Lm92ZXJ2aWV3LnRvb2x0aXA9XHVhYzFjXHVjNjk0IFx1ZDM5OFx1Yzc3NFx1YzljMFx1Yjg1YyBcdWIzY2NcdWM1NDRcdWFjMDBcdWFlMzANCi1zaG9ydGN1dC50dXRvcmlhbHMudG9vbHRpcD1cdWQ1NTlcdWMyYjVcdWMxMWMgXHVkMzk4XHVjNzc0XHVjOWMwXHViODVjIFx1YjNjY1x1YzU0NFx1YWMwMFx1YWUzMA0KLXNob3J0Y3V0LmZpcnN0c3RlcHMudG9vbHRpcD1cdWNjYWIgXHViYzg4XHVjOWY4IFx1YjJlOFx1YWNjNCBcdWQzOThcdWM3NzRcdWM5YzBcdWI4NWMgXHViM2NjXHVjNTQ0XHVhYzAwXHVhZTMwDQotc2hvcnRjdXQud2VicmVzb3VyY2VzLnRvb2x0aXA9XHVjNmY5IFx1Yzc5MFx1YzZkMCBcdWQzOThcdWM3NzRcdWM5YzBcdWI4NWMgXHViM2NjXHVjNTQ0XHVhYzAwXHVhZTMwICAgICAgIA0KLQ0KLSNBY3Rpb24gU2V0DQotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gXHViM2M0XHVjNmMwXHViOWQwIFx1YzJkY1x1YzJhNFx1ZDE1YyBcdWIzYzRcdWFkNmMgXHViYWE4XHVjNzRjIFx1Yzg3MFx1Y2U1OA0KLWFjdGlvblNldC5sYWJlbCA9IFx1YjNjNFx1YzZjMFx1YjlkMCBcdWMyZGNcdWMyYTRcdWQxNWMNCi1zZWFyY2hBY3Rpb24ubGFiZWwgPSBcdWIzYzRcdWM2YzBcdWI5ZDAgXHVhYzgwXHVjMGM5DQotc2VhcmNoQWN0aW9uLnRvb2x0aXAgPSBcdWIzYzRcdWM2YzBcdWI5ZDAgXHVhYzgwXHVjMGM5DQotZHluYW1pY0hlbHBBY3Rpb24ubGFiZWwgPSBcdWIzZDlcdWM4MDEgXHViM2M0XHVjNmMwXHViOWQwIA0KLWR5bmFtaWNIZWxwQWN0aW9uLnRvb2x0aXAgPSBcdWIzZDlcdWM4MDEgXHViM2M0XHVjNmMwXHViOWQwDQotDQotI0FjdGl2aXRpZXMvQ2FwYWJpbGl0aWVzDQotYWN0aXZpdHkuZ2VuZXJhbD1cdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjhcdWM2NDAgXHVjNzkwXHVjNmQwIFx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMCBcdWJjMGYgXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwDQotYWN0aXZpdHkuZ2VuZXJhbC5kZXNjPVx1ZDQ1Y1x1YzkwMCBFY2xpcHNlIFx1ZDUwNFx1Yjg1Y1x1YzgxZFx1ZDJiOC9cdWM3OTBcdWM2ZDAgXHVhYzAwXHVjODM4XHVjNjI0XHVhZTMwL1x1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMCBcdWFlMzBcdWIyYTVcdWM3NDQgXHVjMGFjXHVjNmE5XHVkNTY5XHViMmM4XHViMmU0Lg0KLWFjdGl2aXR5LnRlYW0uY3ZzPUNWUyBcdWM5YzBcdWM2ZDANCi1hY3Rpdml0eS50ZWFtLmN2cy5kZXNjPVx1Yzc5MFx1YzZkMFx1Yzc0NCBcdWFkMDBcdWI5YWNcdWQ1NThcdWFlMzAgXHVjNzA0XHVkNTc0IFx1YjNkOVx1YzJkYyBcdWJjODRcdWM4MDQgXHVjMmRjXHVjMmE0XHVkMTVjKENWUylcdWM3NDQgXHVjMGFjXHVjNmE5XHVkNTY5XHViMmM4XHViMmU0Lg0KLWFjdGl2aXR5LnRlYW09XHVjZjU0XHVjNWI0IFx1ZDMwMCBcdWM5YzBcdWM2ZDANCi1hY3Rpdml0eS50ZWFtLmRlc2M9XHVhZDZjXHVjMTMxIFx1YWQwMFx1YjlhYyBcdWMyZGNcdWMyYTRcdWQxNWNcdWM3NDQgXHVjMGFjXHVjNmE5XHVkNTU4XHVjNWVjIFx1ZDUwNFx1Yjg1Y1x1YzgxZFx1ZDJiOFx1Yjk3YyBcdWFjZjVcdWM3MjBcdWQ1NjlcdWIyYzhcdWIyZTQuDQotDQotYWN0aXZpdHkuY2F0LmdlbmVyYWw9XHVjNzdjXHViYzE4DQotYWN0aXZpdHkuY2F0LmdlbmVyYWwuZGVzYz1cdWQ0NWNcdWM5MDAgRWNsaXBzZSBcdWFlMzBcdWIyYTVcdWM3NDQgXHVjMGFjXHVjNmE5XHVkNTY5XHViMmM4XHViMmU0Lg0KLWFjdGl2aXR5LmNhdC50ZWFtPVx1ZDMwMA0KLWFjdGl2aXR5LmNhdC50ZWFtLmRlc2M9XHVjNzkwXHVjNmQwXHVjNzQ0IFx1YWQwMFx1YjlhY1x1ZDU1OFx1YWUzMCBcdWM3MDRcdWQ1NzQgXHVhZDZjXHVjMTMxIFx1YWQwMFx1YjlhYyBcdWMyZGNcdWMyYTRcdWQxNWNcdWM3NDQgXHVjMGFjXHVjNmE5XHVkNTY5XHViMmM4XHViMmU0Lg0KLQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMgPSBcdWFlMzBcdWIyYTUNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5TmFtZSA9IFx1YWUzMFx1YjJhNSgmQykNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhdGVnb3J5TmFtZSA9IFx1YWUzMFx1YjJhNSgmQykNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uID0gXHVhZTMwXHViMmE1XHVjNzc0IFx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NjAgXHViNTRjIFx1ZDUwNFx1Yjg2Y1x1ZDUwNFx1ZDJiOCgmUCkNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uVG9vbHRpcCA9IFx1YWUzMFx1YjJhNVx1Yzc1OCBcdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNjU0XHVhYzAwIFx1ZDU0NFx1YzY5NFx1ZDU1YyBcdWNkNWNcdWNkMDggXHVjMGFjXHVjNmE5IFx1YzJkYyBcdWQ1MDRcdWI4NmNcdWQ1MDRcdWQyYjgNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhcHRpb25NZXNzYWdlID0gXHVhZTMwXHViMmE1XHVjNzQ0IFx1YzBhY1x1YzZhOVx1ZDU1OFx1YzVlYyBcdWM1ZWNcdWI3ZWMgXHVjODFjXHVkNDg4IFx1Y2VmNFx1ZDNlY1x1YjEwY1x1ZDJiOFx1Yjk3YyBcdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTU4XHVhYzhjIFx1ZDU1OFx1YWM3MFx1YjA5OCBcdWMwYWNcdWM2YTkgXHViZDg4XHVhYzAwXHViMmE1XHVkNTU4XHVhYzhjIFx1ZDU2MCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3NzRcdWI3ZWNcdWQ1NWMgXHVhZTMwXHViMmE1XHVjNzQwIFx1YzBhY1x1YzgwNCBcdWM4MTVcdWM3NThcdWI0MWMgXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjIFx1YzEzOFx1ZDJiOFx1YzVkMCBcdWI1MzBcdWI3N2MgXHVhZGY4XHViOGY5XHVkNjU0XHViNDI5XHViMmM4XHViMmU0Lg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNWMzNzAzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVJDUCBkbyBFUEYgQ29tcG9zZXINCi1wcm9kdWN0TmFtZT1FUEYgQ29tcG9zZXINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1cdTAwZTl0b2RvDQotDQotIyBWaWV3cw0KLXdlbGNvbWVWaWV3TmFtZT1CZW0tdmluZG8NCi0NCi0jIEFjdGlvbnMNCi1nbG9iYWxBY3Rpb25TZXQ9Q29uanVudG8gZGUgQVx1MDBlN1x1MDBmNWVzIEdsb2JhaXMNCi1uZXdBY3Rpb249Jk5vdm8NCi1uZXdBY3Rpb25Ub29sdGlwPU5vdm8NCi1vcGVuQWN0aW9uPUEmYnJpci4uLg0KLW9wZW5BY3Rpb25Ub29sdGlwPUFicmlyDQotc2VhcmNoQWN0aW9uPSZQcm9jdXJhci4uLg0KLXNlYXJjaEFjdGlvblRvb2x0aXA9UHJvY3VyYXINCi13ZWxjb21lQWN0aW9uPSZCZW0tdmluZG8NCi13ZWxjb21lQWN0aW9uVG9vbFRpcD1CZW0tdmluZG8NCi0NCi0jIFRvb2x0aXBzDQotc2hvcnRjdXQub3ZlcnZpZXcudG9vbHRpcD1SZXRvcm5hciBwYXJhIGEgcFx1MDBlMWdpbmEgZGUgVmlzXHUwMGUzbyBHZXJhbA0KLXNob3J0Y3V0LnR1dG9yaWFscy50b29sdGlwPVJldG9ybmFyIHBhcmEgYSBwXHUwMGUxZ2luYSBkbyBUdXRvcmlhbA0KLXNob3J0Y3V0LmZpcnN0c3RlcHMudG9vbHRpcD1SZXRvcm5hciBwYXJhIGEgcFx1MDBlMWdpbmEgZGUgUHJpbWVpcmFzIEV0YXBhcw0KLXNob3J0Y3V0LndlYnJlc291cmNlcy50b29sdGlwPVJldG9ybmFyIHBhcmEgYSBwXHUwMGUxZ2luYSBkZSBSZWN1cnNvcyBkYSBXZWIgDQotDQotI0FjdGlvbiBTZXQNCi1hY3Rpb25TZXQuZGVzY3JpcHRpb24gPSBBXHUwMGU3XHUwMGY1ZXMgZGEgQmFycmEgZGUgRmVycmFtZW50YXMgZG8gU2lzdGVtYSBkZSBBanVkYQ0KLWFjdGlvblNldC5sYWJlbCA9IFNpc3RlbWEgZGUgQWp1ZGENCi1zZWFyY2hBY3Rpb24ubGFiZWwgPSBBanVkYSBkYSBQcm9jdXJhDQotc2VhcmNoQWN0aW9uLnRvb2x0aXAgPSBBanVkYSBkYSBQcm9jdXJhDQotZHluYW1pY0hlbHBBY3Rpb24ubGFiZWwgPSBBanVkYSBEaW5cdTAwZTJtaWNhDQotZHluYW1pY0hlbHBBY3Rpb24udG9vbHRpcCA9IEFqdWRhIERpblx1MDBlMm1pY2ENCi0jQWN0aXZpdGllcy9DYXBhYmlsaXRpZXMNCi1hY3Rpdml0eS5nZW5lcmFsPUltcG9ydGFyIGUgRXhwb3J0YXIgUHJvamV0b3MgZSBSZWN1cnNvcw0KLWFjdGl2aXR5LmdlbmVyYWwuZGVzYz1VdGlsaXplIG9zIHJlY3Vyc29zIHBhZHJcdTAwZTNvIGRlIEltcG9ydGFcdTAwZTdcdTAwZTNvL0V4cG9ydGFcdTAwZTdcdTAwZTNvIGRlIFByb2pldG9zL1JlY3Vyc29zIGRvIEVjbGlwc2UuDQotYWN0aXZpdHkudGVhbS5jdnM9U3Vwb3J0ZSBDVlMNCi1hY3Rpdml0eS50ZWFtLmN2cy5kZXNjPVV0aWxpemUgbyBDVlMgKENvbmN1cnJlbnQgVmVyc2lvbnMgU3lzdGVtKSBwYXJhIGdlcmFyIHJlY3Vyc29zLg0KLWFjdGl2aXR5LnRlYW09RXF1aXBlIGRlIFN1cG9ydGUgUHJpbmNpcGFsDQotYWN0aXZpdHkudGVhbS5kZXNjPUNvbXBhcnRpbGhlIHByb2pldG9zIHV0aWxpemFuZG8gc2lzdGVtYXMgZGUgZ2VyZW5jaWFtZW50byBkZSBjb25maWd1cmFcdTAwZTdcdTAwZTNvLg0KLQ0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsPUdlcmFsDQotYWN0aXZpdHkuY2F0LmdlbmVyYWwuZGVzYz1VdGlsaXplIG9zIHJlY3Vyc29zIHBhZHJcdTAwZTNvIGRvIEVjbGlwc2UuDQotYWN0aXZpdHkuY2F0LnRlYW09RXF1aXBlDQotYWN0aXZpdHkuY2F0LnRlYW0uZGVzYz1VdGlsaXplIHNpc3RlbWFzIGRlIGdlcmVuY2lhbWVudG8gZGUgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBwYXJhIGdlcmVuY2lhciByZWN1cnNvcy4NCi0NCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzID0gUmVjdXJzb3MNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5TmFtZSA9ICZSZWN1cnNvcw0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2F0ZWdvcnlOYW1lID0gJlJlY3Vyc29zDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvbiA9ICZBdmlzYXIgYW8gYXRpdmFyIHJlY3Vyc29zDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvblRvb2x0aXAgPSBBdmlzYXIgcXVhbmRvIHVtIHJlY3Vyc28gdXRpbGl6YWRvIHBlbGEgcHJpbWVpcmEgdmV6IGV4aWdpciBhdGl2YVx1MDBlN1x1MDBlM28gZGUgcmVjdXJzb3MNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhcHRpb25NZXNzYWdlID0gUmVjdXJzb3MgcGVybWl0ZW0gYXRpdmFyIG91IGRlc2F0aXZhciB2XHUwMGUxcmlvcyBjb21wb25lbnRlcyBkZSBwcm9kdXRvLiAgRXNzZXMgcmVjdXJzb3Mgc1x1MDBlM28gYWdydXBhZG9zIGRlIGFjb3JkbyBjb20gdW0gY29uanVudG8gZGUgY2F0ZWdvcmlhcyBwcmVkZWZpbmlkYXMuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkMWU3OWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIENvbXBvc2VyIFJDUA0KLXByb2R1Y3ROYW1lPUVQRiBDb21wb3Nlcg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgQ2F0ZWdvcnkNCi1tZXRob2RDYXRlZ29yeU5hbWU9XHU2NWI5XHU2Y2Q1DQotDQotIyBWaWV3cw0KLXdlbGNvbWVWaWV3TmFtZT1cdTZiMjJcdThmY2UNCi0NCi0jIEFjdGlvbnMNCi1nbG9iYWxBY3Rpb25TZXQ9XHU1MTY4XHU1YzQwXHU2NGNkXHU0ZjVjXHU5NmM2DQotbmV3QWN0aW9uPVx1NjViMFx1NWVmYSgmTikNCi1uZXdBY3Rpb25Ub29sdGlwPVx1NjViMFx1NWVmYQ0KLW9wZW5BY3Rpb249XHU2MjUzXHU1ZjAwKCZPKS4uLg0KLW9wZW5BY3Rpb25Ub29sdGlwPVx1NjI1M1x1NWYwMA0KLXNlYXJjaEFjdGlvbj1cdTY0MWNcdTdkMjIoJlMpLi4uDQotc2VhcmNoQWN0aW9uVG9vbHRpcD1cdTY0MWNcdTdkMjINCi13ZWxjb21lQWN0aW9uPVx1NmIyMlx1OGZjZSgmVykNCi13ZWxjb21lQWN0aW9uVG9vbFRpcD1cdTZiMjJcdThmY2UNCi0NCi0jIFRvb2x0aXBzDQotc2hvcnRjdXQub3ZlcnZpZXcudG9vbHRpcD1cdThmZDRcdTU2ZGVcdTIwMWNcdTY5ODJcdThmZjBcdTIwMWRcdTk4NzVcdTk3NjINCi1zaG9ydGN1dC50dXRvcmlhbHMudG9vbHRpcD1cdThmZDRcdTU2ZGVcdTIwMWNcdTY1NTlcdTdhMGJcdTIwMWRcdTk4NzVcdTk3NjINCi1zaG9ydGN1dC5maXJzdHN0ZXBzLnRvb2x0aXA9XHU4ZmQ0XHU1NmRlXHUyMDFjXHU3YjJjXHU0ZTAwXHU2YjY1XHUyMDFkXHU5ODc1XHU5NzYyDQotc2hvcnRjdXQud2VicmVzb3VyY2VzLnRvb2x0aXA9XHU4ZmQ0XHU1NmRlXHUyMDFjV2ViIFx1OGQ0NFx1NmU5MFx1MjAxZFx1OTg3NVx1OTc2Mg0KLQ0KLSNBY3Rpb24gU2V0DQotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gXHU1ZTJlXHU1MmE5XHU3Y2ZiXHU3ZWRmXHU1ZGU1XHU1MTc3XHU2ODBmXHU2NGNkXHU0ZjVjDQotYWN0aW9uU2V0LmxhYmVsID0gXHU1ZTJlXHU1MmE5XHU3Y2ZiXHU3ZWRmDQotc2VhcmNoQWN0aW9uLmxhYmVsID0gXHU2NDFjXHU3ZDIyXHU1ZTJlXHU1MmE5DQotc2VhcmNoQWN0aW9uLnRvb2x0aXAgPSBcdTY0MWNcdTdkMjJcdTVlMmVcdTUyYTkNCi1keW5hbWljSGVscEFjdGlvbi5sYWJlbCA9IFx1NTJhOFx1NjAwMVx1NWUyZVx1NTJhOQ0KLWR5bmFtaWNIZWxwQWN0aW9uLnRvb2x0aXAgPSBcdTUyYThcdTYwMDFcdTVlMmVcdTUyYTkNCi0jQWN0aXZpdGllcy9DYXBhYmlsaXRpZXMNCi1hY3Rpdml0eS5nZW5lcmFsPVx1NWJmY1x1NTE2NVx1NTQ4Y1x1NWJmY1x1NTFmYVx1OTg3OVx1NzZlZVx1NTQ4Y1x1OGQ0NFx1NmU5MA0KLWFjdGl2aXR5LmdlbmVyYWwuZGVzYz1cdTRmN2ZcdTc1MjhcdTY4MDdcdTUxYzZcdTc2ODQgRWNsaXBzZSBcdTViZmNcdTUxNjVcdWZmMGZcdTViZmNcdTUxZmFcdTk4NzlcdTc2ZWVcdWZmMGZcdThkNDRcdTZlOTBcdTc2ODRcdTUyOWZcdTgwZmRcdTMwMDINCi1hY3Rpdml0eS50ZWFtLmN2cz1DVlMgXHU2NTJmXHU2MzAxDQotYWN0aXZpdHkudGVhbS5jdnMuZGVzYz1cdTRmN2ZcdTc1MjhcdTVlNzZcdTUzZDFcdTcyNDhcdTY3MmNcdTYzYTdcdTUyMzZcdTdjZmJcdTdlZGZcdWZmMDhDVlNcdWZmMDlcdTY3NjVcdTdiYTFcdTc0MDZcdThkNDRcdTZlOTBcdTMwMDINCi1hY3Rpdml0eS50ZWFtPVx1NjgzOFx1NWZjM1x1NTZlMlx1OTYxZlx1NjUyZlx1NjMwMQ0KLWFjdGl2aXR5LnRlYW0uZGVzYz1cdTRmN2ZcdTc1MjhcdTkxNGRcdTdmNmVcdTdiYTFcdTc0MDZcdTdjZmJcdTdlZGZcdTY3NjVcdTUxNzFcdTRlYWJcdTk4NzlcdTc2ZWVcdTMwMDINCi0NCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbD1cdTVlMzhcdTg5YzQNCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbC5kZXNjPVx1NGY3Zlx1NzUyOFx1NjgwN1x1NTFjNlx1NzY4NCBFY2xpcHNlIFx1NTI5Zlx1ODBmZFx1MzAwMg0KLWFjdGl2aXR5LmNhdC50ZWFtPVx1NTZlMlx1OTYxZg0KLWFjdGl2aXR5LmNhdC50ZWFtLmRlc2M9XHU0ZjdmXHU3NTI4XHU5MTRkXHU3ZjZlXHU3YmExXHU3NDA2XHU3Y2ZiXHU3ZWRmXHU2NzY1XHU3YmExXHU3NDA2XHU4ZDQ0XHU2ZTkwXHUzMDAyDQotDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcyA9IFx1NTI5Zlx1ODBmZA0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlOYW1lID0gXHU1MjlmXHU4MGZkKCZDKQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2F0ZWdvcnlOYW1lID0gXHU1MjlmXHU4MGZkKCZDKQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b24gPSBcdTU0MmZcdTc1MjhcdTUyOWZcdTgwZmRcdTY1ZjZcdTUzZDFcdTUxZmFcdTYzZDBcdTc5M2EoJlApDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvblRvb2x0aXAgPSBcdTk5OTZcdTZiMjFcdTRmN2ZcdTc1MjhcdTg5ODFcdTZjNDJcdTU0MmZcdTc1MjhcdTUyOWZcdTgwZmRcdTc2ODRcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjZcdTY1ZjZcdTUzZDFcdTUxZmFcdTYzZDBcdTc5M2ENCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhcHRpb25NZXNzYWdlID0gXHU1M2VmXHU3NTI4XHU0ZThlXHU1NDJmXHU3NTI4XHU2MjE2XHU3OTgxXHU3NTI4XHU1NDA0XHU3OWNkXHU0ZWE3XHU1NGMxXHU3ZWM0XHU0ZWY2XHU3Njg0XHU1MjlmXHU4MGZkXHUzMDAyXHU4ZmQ5XHU0ZTliXHU1MjlmXHU4MGZkXHU2MzA5XHU3MTY3XHU0ZTAwXHU3ZWM0XHU5ODg0XHU1MTQ4XHU1YjlhXHU0ZTQ5XHU3Njg0XHU3YzdiXHU1MjJiXHU2NzY1XHU4ZmRiXHU4ODRjXHU1MjA2XHU3ZWM0XHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiOWJiYTAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIENvbXBvc2VyIFJDUA0KLXByb2R1Y3ROYW1lPUVQRiBDb21wb3Nlcg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgQ2F0ZWdvcnkNCi1tZXRob2RDYXRlZ29yeU5hbWU9XHU2NWI5XHU2Y2Q1DQotDQotIyBWaWV3cw0KLXdlbGNvbWVWaWV3TmFtZT1cdTZiNjFcdThmY2VcdTRmN2ZcdTc1MjgNCi0NCi0jIEFjdGlvbnMNCi1nbG9iYWxBY3Rpb25TZXQ9XHU2NTc0XHU5YWQ0XHU1MmQ1XHU0ZjVjXHU5NmM2DQotbmV3QWN0aW9uPVx1NjViMFx1NWVmYSgmTikNCi1uZXdBY3Rpb25Ub29sdGlwPVx1NjViMFx1NWVmYQ0KLW9wZW5BY3Rpb249XHU5NThiXHU1NTVmKCZPKS4uLg0KLW9wZW5BY3Rpb25Ub29sdGlwPVx1OTU4Ylx1NTU1Zg0KLXNlYXJjaEFjdGlvbj1cdTY0MWNcdTVjMGIoJlMpLi4uDQotc2VhcmNoQWN0aW9uVG9vbHRpcD1cdTY0MWNcdTVjMGINCi13ZWxjb21lQWN0aW9uPVx1NmI2MVx1OGZjZVx1NGY3Zlx1NzUyOCgmVykNCi13ZWxjb21lQWN0aW9uVG9vbFRpcD1cdTZiNjFcdThmY2VcdTRmN2ZcdTc1MjgNCi0NCi0jIFRvb2x0aXBzDQotc2hvcnRjdXQub3ZlcnZpZXcudG9vbHRpcD1cdTU2ZGVcdTUyMzBcdTMwMGNcdTY5ODJcdTg5YzBcdTMwMGRcdTk4MDFcdTk3NjINCi1zaG9ydGN1dC50dXRvcmlhbHMudG9vbHRpcD1cdTU2ZGVcdTUyMzBcdTMwMGNcdTYzMDdcdTVjMGVcdTY1NTlcdTViNzhcdTMwMGRcdTk4MDFcdTk3NjINCi1zaG9ydGN1dC5maXJzdHN0ZXBzLnRvb2x0aXA9XHU1NmRlXHU1MjMwXHUzMDBjXHU3YjJjXHU0ZTAwXHU2YjY1XHU5YTVmXHUzMDBkXHU5ODAxXHU5NzYyDQotc2hvcnRjdXQud2VicmVzb3VyY2VzLnRvb2x0aXA9XHU1NmRlXHU1MjMwXHUzMDBjV2ViIFx1OGNjN1x1NmU5MFx1MzAwZFx1OTgwMVx1OTc2Mg0KLQ0KLSNBY3Rpb24gU2V0DQotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gXHU4YWFhXHU2NjBlXHU3Y2ZiXHU3ZDcxXHU1ZGU1XHU1MTc3XHU1MjE3XHU1MmQ1XHU0ZjVjDQotYWN0aW9uU2V0LmxhYmVsID0gXHU4YWFhXHU2NjBlXHU3Y2ZiXHU3ZDcxDQotc2VhcmNoQWN0aW9uLmxhYmVsID0gXHU2NDFjXHU1YzBiXHU4YWFhXHU2NjBlDQotc2VhcmNoQWN0aW9uLnRvb2x0aXAgPSBcdTY0MWNcdTVjMGJcdThhYWFcdTY2MGUNCi1keW5hbWljSGVscEFjdGlvbi5sYWJlbCA9IFx1NTJkNVx1NjE0Ylx1OGFhYVx1NjYwZQ0KLWR5bmFtaWNIZWxwQWN0aW9uLnRvb2x0aXAgPSBcdTUyZDVcdTYxNGJcdThhYWFcdTY2MGUNCi0NCi0jQWN0aXZpdGllcy9DYXBhYmlsaXRpZXMNCi1hY3Rpdml0eS5nZW5lcmFsPVx1NTMyZlx1NTE2NVx1NTQ4Y1x1NTMyZlx1NTFmYVx1NWMwOFx1Njg0OFx1NTNjYVx1OGNjN1x1NmU5MA0KLWFjdGl2aXR5LmdlbmVyYWwuZGVzYz1cdTRmN2ZcdTc1MjhcdTZhMTlcdTZlOTZcdTc2ODQgRWNsaXBzZSBcdTUzMmZcdTUxNjUvXHU1MzJmXHU1MWZhXHU1YzA4XHU2ODQ4L1x1OGNjN1x1NmU5MFx1NTI5Zlx1ODBmZFx1MzAwMg0KLWFjdGl2aXR5LnRlYW0uY3ZzPUNWUyBcdTY1MmZcdTYzZjQNCi1hY3Rpdml0eS50ZWFtLmN2cy5kZXNjPVx1NGY3Zlx1NzUyOFx1MzAwY1x1NGUyNlx1ODg0Y1x1NzI0OFx1NjcyY1x1N2NmYlx1N2Q3MSAoQ1ZTKVx1MzAwZFx1NGY4Nlx1N2JhMVx1NzQwNlx1OGNjN1x1NmU5MFx1MzAwMg0KLWFjdGl2aXR5LnRlYW09XHU2ODM4XHU1ZmMzXHU1NzE4XHU5NjhhXHU2NTJmXHU2M2Y0DQotYWN0aXZpdHkudGVhbS5kZXNjPVx1NGY3Zlx1NzUyOFx1OTE0ZFx1N2Y2ZVx1N2JhMVx1NzQwNlx1N2NmYlx1N2Q3MVx1NGY4Nlx1NTE3MVx1NzUyOFx1NWMwOFx1Njg0OFx1MzAwMg0KLQ0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsPVx1NGUwMFx1ODIyYw0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsLmRlc2M9XHU0ZjdmXHU3NTI4XHU2YTE5XHU2ZTk2XHU3Njg0IEVjbGlwc2UgXHU1MjlmXHU4MGZkXHUzMDAyDQotYWN0aXZpdHkuY2F0LnRlYW09XHU1NzE4XHU5NjhhDQotYWN0aXZpdHkuY2F0LnRlYW0uZGVzYz1cdTRmN2ZcdTc1MjhcdTkxNGRcdTdmNmVcdTdiYTFcdTc0MDZcdTdjZmJcdTdkNzFcdTRmODZcdTdiYTFcdTc0MDZcdThjYzdcdTZlOTBcdTMwMDINCi0NCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzID0gXHU1MjlmXHU4MGZkDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eU5hbWUgPSBcdTUyOWZcdTgwZmQoJkMpDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5jYXRlZ29yeU5hbWUgPSBcdTUyOWZcdTgwZmQoJkMpDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvbiA9IFx1NTU1Zlx1NzUyOFx1NTI5Zlx1ODBmZFx1NjY0Mlx1NjNkMFx1NzkzYSgmUCkNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uVG9vbHRpcCA9IFx1N2IyY1x1NGUwMFx1NmIyMVx1NGY3Zlx1NzUyOFx1OTcwMFx1ODk4MVx1NTU1Zlx1NzUyOFx1OTAxOVx1NGU5Ylx1NTI5Zlx1ODBmZFx1NzY4NFx1NzI3OVx1NjAyN1x1NjY0Mlx1NjNkMFx1NzkzYQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2FwdGlvbk1lc3NhZ2UgPSBcdTkwMTlcdTRlOWJcdTUyOWZcdTgwZmRcdTUzZWZcdThiOTNcdTYwYThcdTU1NWZcdTc1MjhcdTYyMTZcdTUwNWNcdTc1MjhcdTU0MDRcdTdhMmVcdTc1MjJcdTU0YzFcdTUxNDNcdTRlZjZcdTMwMDJcdTkwMTlcdTRlOWJcdTUyOWZcdTgwZmRcdTRlZTVcdTRlMDBcdTdkNDRcdTk4MTBcdTUxNDhcdTViOWFcdTdmYTlcdTc2ODRcdTdhMmVcdTk4NWVcdTRmODZcdTUyMDZcdTdkNDRcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NmNDRhNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGaWxlIE1lbnUNCi1maWxlTWVudUl0ZW1fdGV4dD0mRGF0ZWkNCi1maWxlTmV3TWVudUl0ZW1fdGV4dD0mTmV1DQotZmlsZU9wZW5NZW51SXRlbV90ZXh0PVx1MDBkNiZmZm5lbg0KLQ0KLSMgRWRpdCBNZW51DQotZWRpdE1lbnVJdGVtX3RleHQ9JkJlYXJiZWl0ZW4NCi0NCi0jIE5hdmlnYXRlIE1lbnUNCi1uYXZpZ2F0ZU1lbnVJdGVtX3RleHQ9Jk5hdmlnaWVyZW4NCi0NCi0jIFNlYXJjaCBNZW51DQotc2VhcmNoTWVudUl0ZW1fdGV4dD0mU3VjaGVuDQotDQotIyBDb25maWd1cmF0aW9uIE1lbnUNCi1jb25maWd1cmF0aW9uTWVudUl0ZW1fdGV4dD0mS29uZmlndXJhdGlvbg0KLQ0KLSMgV2luZG93IE1lbnUNCi13aW5kb3dNZW51SXRlbV90ZXh0PSZGZW5zdGVyDQotd2luZG93T3BlblBlcnNwZWN0aXZlTWVudUl0ZW1fdGV4dD1QZXJzcGVrdGl2ZSBcdTAwZjYmZmZuZW4NCi13aW5kb3dTaG93Vmlld01lbnVJdGVtX3RleHQ9U2ljaHQgZWluYmxlbmRlbg0KLQ0KLSMgSGVscCBNZW51DQotaGVscE1lbnVJdGVtX3RleHQ9JkhpbGZlDQotDQotIyBOZXcgRHJvcCBEb3duIE1lbnUNCi1uZXdEcm9wRG93bl90b29sdGlwX3RleHQ9TmV1DQotb3RoZXJNZW51SXRlbV90ZXh0PUFuZGVyZS4uLg0KLQ0KLSMgT3BlbiBQZXJzcGVjdGl2ZSBBY3Rpb25zDQotb3BlbkF1dGhvcmluZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ9QXV0aG9yaW5nDQotb3BlbkJyb3dzaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1Ccm93c2luZw0KLQ0KLSMgTWlzYyBBY3Rpb25zDQotZWRpdEFjdGlvbl90ZXh0PUJlYXJiZWl0ZW4NCi11cGdyYWRlTGlicmFyeUFjdGlvbl90ZXh0PU1ldGhvZGVuYmlibGlvdGhlayB2b24gSTEgYXVmIEkyIGFrdHVhbGlzaWVyZW4uLi4NCi0NCi1zdGFydHVwX2Rpcl9sb2dfaW5mb190ZXh0PUlORk86IEF1c2dhbmdzdmVyemVpY2huaXMgZGVyIEFud2VuZHVuZyA9DQotbWVudV9oZWxwX3NvZnR3YXJlX3VwZGF0ZXNfbWFuYWdlX3NvZnR3YXJlX2NvbmZpZ190ZXh0PVNvZnR3YXJla29uZmlndXJhdGlvbiAmdmVyd2FsdGVuLi4uDQotDQotd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlPXswfSBrYW5uIG5pY2h0IGdlc3RhcnRldCB3ZXJkZW4uDQotd29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2U9ezB9IGthbm4gbmljaHQgZ2VzdGFydGV0IHdlcmRlbiwgd2VubiBlaW5lIGFuZGVyZSBJbnN0YW56IGFrdGl2IGlzdC4gV2VjaHNlbG4gU2llIGluIGRpZSBha3RpdmUgSW5zdGFueiBvZGVyIHNjaGxpZVx1MDBkZmVuIFNpZSBkaWUgYWt0aXZlIEluc3RhbnogdW5kIHN0YXJ0ZW4gU2llIGRpZSBBbndlbmR1bmcgZXJuZXV0Lg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0RpYWdub3Npcz1EaWFnbm9zZS0gdW5kIFJlcGFyYXR1cnRvb2xzDQotbWFpbkFjdGlvbkJhckFkdmlzb3JfSGVhbHRoQ2hlY2s9U3RhdHVzcHJcdTAwZmNmdW5nIGZcdTAwZmNyIEJpYmxpb3RoZWsgZHVyY2hmXHUwMGZjaHJlbi4uLg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX1JlbW92ZVJlZmVyZW5jZT1SZWZlcmVuemVuIGF1ZiB1bmdcdTAwZmNsdGlnZSBPYmpla3RlIGVudGZlcm5lbi4uLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWE0ZGU5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZpbGUgTWVudQ0KLWZpbGVNZW51SXRlbV90ZXh0PSZBcmNoaXZvDQotZmlsZU5ld01lbnVJdGVtX3RleHQ9Jk51ZXZvDQotZmlsZU9wZW5NZW51SXRlbV90ZXh0PUFiJnJpcg0KLQ0KLSMgRWRpdCBNZW51DQotZWRpdE1lbnVJdGVtX3RleHQ9JkVkaXRhcg0KLQ0KLSMgTmF2aWdhdGUgTWVudQ0KLW5hdmlnYXRlTWVudUl0ZW1fdGV4dD0mTmF2ZWdhcg0KLQ0KLSMgU2VhcmNoIE1lbnUNCi1zZWFyY2hNZW51SXRlbV90ZXh0PSZCdXNjYXINCi0NCi0jIENvbmZpZ3VyYXRpb24gTWVudQ0KLWNvbmZpZ3VyYXRpb25NZW51SXRlbV90ZXh0PSZDb25maWd1cmFjaVx1MDBmM24NCi0NCi0jIFdpbmRvdyBNZW51DQotd2luZG93TWVudUl0ZW1fdGV4dD0mVmVudGFuYQ0KLXdpbmRvd09wZW5QZXJzcGVjdGl2ZU1lbnVJdGVtX3RleHQ9JkFicmlyIHBlcnNwZWN0aXZhDQotd2luZG93U2hvd1ZpZXdNZW51SXRlbV90ZXh0PU1vc3RyYXIgdmlzdGENCi0NCi0jIEhlbHAgTWVudQ0KLWhlbHBNZW51SXRlbV90ZXh0PSZBeXVkYQ0KLQ0KLSMgTmV3IERyb3AgRG93biBNZW51DQotbmV3RHJvcERvd25fdG9vbHRpcF90ZXh0PU51ZXZvDQotb3RoZXJNZW51SXRlbV90ZXh0PU90cm8uLi4NCi0NCi0jIE9wZW4gUGVyc3BlY3RpdmUgQWN0aW9ucw0KLW9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PUF1dG9yXHUwMGVkYQ0KLW9wZW5Ccm93c2luZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ9RXhhbWVuDQotDQotIyBNaXNjIEFjdGlvbnMNCi1lZGl0QWN0aW9uX3RleHQ9RWRpdGFyDQotdXBncmFkZUxpYnJhcnlBY3Rpb25fdGV4dD1BY3R1YWxpemFyIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGRlIEkxIGEgSTIuLi4NCi0NCi1zdGFydHVwX2Rpcl9sb2dfaW5mb190ZXh0PUlORk9STUFDSVx1MDBkM046IERpcmVjdG9yaW8gZGUgaW5pY2lvIGRlIGFwbGljYWNpXHUwMGYzbiA9DQotbWVudV9oZWxwX3NvZnR3YXJlX3VwZGF0ZXNfbWFuYWdlX3NvZnR3YXJlX2NvbmZpZ190ZXh0PSZHZXN0aW9uYXIgY29uZmlndXJhY2lcdTAwZjNuIGRlIHNvZnR3YXJlLi4uDQotDQotd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlPU5vIHNlIHB1ZWRlIGluaWNpYXIgezB9DQotd29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2U9ezB9IG5vIHNlIHB1ZWRlIGluaWNpYXIgbWllbnRyYXMgc2UgZWplY3V0YSBvdHJhIGluc3RhbmNpYS4gIFZheWEgYSBsYSBpbnN0YW5jaWEgZW4gZWplY3VjaVx1MDBmM24gbyBjaVx1MDBlOXJyZWxhIHkgcmVpbmljaWUgbGEgYXBsaWNhY2lcdTAwZjNuLg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0RpYWdub3Npcz1IZXJyYW1pZW50YXMgZGUgcmVwYXJhY2lcdTAwZjNuIHkgZGlhZ25cdTAwZjNzdGljbw0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0hlYWx0aENoZWNrPVJlYWxpemFyIGNvbXByb2JhY2lcdTAwZjNuIGRlIGVzdGFkbyBkZSBsYSBiaWJsaW90ZWNhLi4uDQotbWFpbkFjdGlvbkJhckFkdmlzb3JfUmVtb3ZlUmVmZXJlbmNlPUVsaW1pbmFyIHJlZmVyZW5jaWFzIGEgb2JqZXRvcyBubyB2XHUwMGUxbGlkb3MuLi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2UyYWRlNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGaWxlIE1lbnUNCi1maWxlTWVudUl0ZW1fdGV4dD0mRmljaGllcg0KLWZpbGVOZXdNZW51SXRlbV90ZXh0PSZOb3V2ZWF1DQotZmlsZU9wZW5NZW51SXRlbV90ZXh0PU8mdXZyaXINCi0NCi0jIEVkaXQgTWVudQ0KLWVkaXRNZW51SXRlbV90ZXh0PSZNb2RpZmllcg0KLQ0KLSMgTmF2aWdhdGUgTWVudQ0KLW5hdmlnYXRlTWVudUl0ZW1fdGV4dD0mTmF2aWd1ZXINCi0NCi0jIFNlYXJjaCBNZW51DQotc2VhcmNoTWVudUl0ZW1fdGV4dD0mUmVjaGVyY2hlDQotDQotIyBDb25maWd1cmF0aW9uIE1lbnUNCi1jb25maWd1cmF0aW9uTWVudUl0ZW1fdGV4dD0mQ29uZmlndXJhdGlvbg0KLQ0KLSMgV2luZG93IE1lbnUNCi13aW5kb3dNZW51SXRlbV90ZXh0PSZGZW5cdTAwZWF0cmUNCi13aW5kb3dPcGVuUGVyc3BlY3RpdmVNZW51SXRlbV90ZXh0PSZPdXZyaXIgbGEgcGVyc3BlY3RpdmUNCi13aW5kb3dTaG93Vmlld01lbnVJdGVtX3RleHQ9QWZmaWNoZXIgbGEgdnVlDQotDQotIyBIZWxwIE1lbnUNCi1oZWxwTWVudUl0ZW1fdGV4dD0mQWlkZQ0KLQ0KLSMgTmV3IERyb3AgRG93biBNZW51DQotbmV3RHJvcERvd25fdG9vbHRpcF90ZXh0PU5vdXZlYXUNCi1vdGhlck1lbnVJdGVtX3RleHQ9QXV0cmUuLi4NCi0NCi0jIE9wZW4gUGVyc3BlY3RpdmUgQWN0aW9ucw0KLW9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PUNyXHUwMGU5YXRpb24NCi1vcGVuQnJvd3NpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PUV4cGxvcmF0aW9uDQotDQotIyBNaXNjIEFjdGlvbnMNCi1lZGl0QWN0aW9uX3RleHQ9TW9kaWZpZXINCi11cGdyYWRlTGlicmFyeUFjdGlvbl90ZXh0PU1ldHRyZSBcdTAwZTAgbml2ZWF1IGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZGUgSTEgdmVycyBJMi4uLg0KLQ0KLXN0YXJ0dXBfZGlyX2xvZ19pbmZvX3RleHQ9SU5GTyA6IHJcdTAwZTlwZXJ0b2lyZSBEXHUwMGU5bWFycmFnZSBkZSBsJ2FwcGxpY2F0aW9uID0NCi1tZW51X2hlbHBfc29mdHdhcmVfdXBkYXRlc19tYW5hZ2Vfc29mdHdhcmVfY29uZmlnX3RleHQ9JkdcdTAwZTlyZXIgbGEgY29uZmlndXJhdGlvbiBsb2dpY2llbGxlLi4uDQotDQotd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlPUltcG9zc2libGUgZGUgZFx1MDBlOW1hcnJlciB7MH0NCi13b3Jrc3BhY2VDYW5ub3RMb2NrTWVzc2FnZT17MH0gbmUgcGV1dCBwYXMgXHUwMGVhdHJlIGRcdTAwZTltYXJyXHUwMGU5IHNpIHVuZSBhdXRyZSBpbnN0YW5jZSBlc3QgZW4gY291cnMgZCcnZXhcdTAwZTljdXRpb24uICBCYXNjdWxleiB2ZXJzIGwnJ2luc3RhbmNlIGVuIGNvdXJzIGQnJ2V4XHUwMGU5Y3V0aW9uIG91IGZlcm1lei1sYSBldCByZWxhbmNleiBsJydhcHBsaWNhdGlvbi4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9EaWFnbm9zaXM9T3V0aWxzIGRlIGRpYWdub3N0aWMgZXQgZGUgclx1MDBlOXBhcmF0aW9uDQotbWFpbkFjdGlvbkJhckFkdmlzb3JfSGVhbHRoQ2hlY2s9RWZmZWN0dWVyIHVuIGNvbnRyXHUwMGY0bGUgZGUgc2FudFx1MDBlOSBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZS4uLg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX1JlbW92ZVJlZmVyZW5jZT1TdXBwcmltZXIgbGVzIHJcdTAwZTlmXHUwMGU5cmVuY2VzIGF1eCBvYmpldHMgbm9uIHZhbGlkZXMuLi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWE3OTJhYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGaWxlIE1lbnUNCi1maWxlTWVudUl0ZW1fdGV4dD0mRmlsZQ0KLWZpbGVOZXdNZW51SXRlbV90ZXh0PSZOdW92bw0KLWZpbGVPcGVuTWVudUl0ZW1fdGV4dD1BJnByaQ0KLQ0KLSMgRWRpdCBNZW51DQotZWRpdE1lbnVJdGVtX3RleHQ9Jk1vZGlmaWNhDQotDQotIyBOYXZpZ2F0ZSBNZW51DQotbmF2aWdhdGVNZW51SXRlbV90ZXh0PSZFc3Bsb3JhDQotDQotIyBTZWFyY2ggTWVudQ0KLXNlYXJjaE1lbnVJdGVtX3RleHQ9JlJpY2VyY2ENCi0NCi0jIENvbmZpZ3VyYXRpb24gTWVudQ0KLWNvbmZpZ3VyYXRpb25NZW51SXRlbV90ZXh0PSZDb25maWd1cmF6aW9uZQ0KLQ0KLSMgV2luZG93IE1lbnUNCi13aW5kb3dNZW51SXRlbV90ZXh0PSZGaW5lc3RyYQ0KLXdpbmRvd09wZW5QZXJzcGVjdGl2ZU1lbnVJdGVtX3RleHQ9JkFwcmkgcHJvc3BldHRpdmENCi13aW5kb3dTaG93Vmlld01lbnVJdGVtX3RleHQ9TW9zdHJhIHZpc3RhDQotDQotIyBIZWxwIE1lbnUNCi1oZWxwTWVudUl0ZW1fdGV4dD0mR3VpZGENCi0NCi0jIE5ldyBEcm9wIERvd24gTWVudQ0KLW5ld0Ryb3BEb3duX3Rvb2x0aXBfdGV4dD1OdW92bw0KLW90aGVyTWVudUl0ZW1fdGV4dD1BbHRyby4uLg0KLQ0KLSMgT3BlbiBQZXJzcGVjdGl2ZSBBY3Rpb25zDQotb3BlbkF1dGhvcmluZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ9QXV0aG9yaW5nDQotb3BlbkJyb3dzaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1Fc3Bsb3JhemlvbmUNCi0NCi0jIE1pc2MgQWN0aW9ucw0KLWVkaXRBY3Rpb25fdGV4dD1Nb2RpZmljYQ0KLXVwZ3JhZGVMaWJyYXJ5QWN0aW9uX3RleHQ9QWdnaW9ybmEgbGlicmVyaWEgZGVpIG1ldG9kaSBkYSBJMSBhIEkyLi4uDQotDQotc3RhcnR1cF9kaXJfbG9nX2luZm9fdGV4dD1JTkZPOiBEaXJlY3RvcnkgZGkgYXZ2aW8gYXBwbGljYXppb25lID0NCi1tZW51X2hlbHBfc29mdHdhcmVfdXBkYXRlc19tYW5hZ2Vfc29mdHdhcmVfY29uZmlnX3RleHQ9Jkdlc3Rpc2NpIGNvbmZpZ3VyYXppb25lIHNvZnR3YXJlLi4uDQotDQotd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlPUltcG9zc2liaWxlIGF2dmlhcmUgezB9DQotd29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2U9SW1wb3NzaWJpbGUgYXZ2aWFyZSB7MH0gbWVudHJlIHVuJydhbHRyYSBpc3RhbnphIFx1MDBlOCBpbiBlc2VjdXppb25lLiBQYXNzYXJlIGFsbCcnaXN0YW56YSBpbiBlc2VjdXppb25lIG9wcHVyZSBjaGl1ZGVybGEgZSBhdnZpYXJlIGRpIG51b3ZvIGwnJ2FwcGxpY2F6aW9uZS4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9EaWFnbm9zaXM9VG9vbCBkaSBkaWFnbm9zdGljYSBlIGRpIHJpcHJpc3Rpbm8NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9IZWFsdGhDaGVjaz1Fc2VndWkgY29udHJvbGxvIGludGVncml0XHUwMGUwIHN1IGxpYnJlcmlhLi4uDQotbWFpbkFjdGlvbkJhckFkdmlzb3JfUmVtb3ZlUmVmZXJlbmNlPVJpbXVvdmkgcmlmZXJpbWVudGkgYSBvZ2dldHRpIG5vbiB2YWxpZGkuLi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGE2ZDg5Zi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGaWxlIE1lbnUNCi1maWxlTWVudUl0ZW1fdGV4dD1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIoJkYpDQotZmlsZU5ld01lbnVJdGVtX3RleHQ9XHU2NWIwXHU4OThmKCZOKQ0KLWZpbGVPcGVuTWVudUl0ZW1fdGV4dD1cdTk1OGJcdTMwNGYoJlApDQotDQotIyBFZGl0IE1lbnUNCi1lZGl0TWVudUl0ZW1fdGV4dD1cdTdkZThcdTk2YzYoJkUpDQotDQotIyBOYXZpZ2F0ZSBNZW51DQotbmF2aWdhdGVNZW51SXRlbV90ZXh0PVx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBjOCgmTikNCi0NCi0jIFNlYXJjaCBNZW51DQotc2VhcmNoTWVudUl0ZW1fdGV4dD1cdTY5MWNcdTdkMjIoJlMpDQotDQotIyBDb25maWd1cmF0aW9uIE1lbnUNCi1jb25maWd1cmF0aW9uTWVudUl0ZW1fdGV4dD1cdTY5Y2JcdTYyMTAoJkMpDQotDQotIyBXaW5kb3cgTWVudQ0KLXdpbmRvd01lbnVJdGVtX3RleHQ9XHUzMGE2XHUzMGEzXHUzMGYzXHUzMGM5XHUzMGE2KCZXKQ0KLXdpbmRvd09wZW5QZXJzcGVjdGl2ZU1lbnVJdGVtX3RleHQ9XHUzMGQxXHUzMGZjXHUzMGI5XHUzMGRhXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQ2XHUzMDkyXHU5NThiXHUzMDRmKCZPKQ0KLXdpbmRvd1Nob3dWaWV3TWVudUl0ZW1fdGV4dD1cdTMwZDNcdTMwZTVcdTMwZmNcdTMwOTJcdTg4NjhcdTc5M2ENCi0NCi0jIEhlbHAgTWVudQ0KLWhlbHBNZW51SXRlbV90ZXh0PVx1MzBkOFx1MzBlYlx1MzBkNygmSCkNCi0NCi0jIE5ldyBEcm9wIERvd24gTWVudQ0KLW5ld0Ryb3BEb3duX3Rvb2x0aXBfdGV4dD1cdTY1YjBcdTg5OGYNCi1vdGhlck1lbnVJdGVtX3RleHQ9XHUzMDVkXHUzMDZlXHU0ZWQ2Li4uDQotDQotIyBPcGVuIFBlcnNwZWN0aXZlIEFjdGlvbnMNCi1vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1cdTMwYWFcdTMwZmNcdTMwYjVcdTMwZWFcdTMwZjNcdTMwYjANCi1vcGVuQnJvd3NpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PVx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiYQ0KLQ0KLSMgTWlzYyBBY3Rpb25zDQotZWRpdEFjdGlvbl90ZXh0PVx1N2RlOFx1OTZjNg0KLXVwZ3JhZGVMaWJyYXJ5QWN0aW9uX3RleHQ9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyIEkxIFx1MzA0Ylx1MzA4OSBJMiBcdTMwNmJcdTMwYTJcdTMwYzNcdTMwZDdcdTMwYjBcdTMwZWNcdTMwZmNcdTMwYzkuLi4NCi0NCi1zdGFydHVwX2Rpcl9sb2dfaW5mb190ZXh0PUlORk86IFx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1OTU4Ylx1NTljYlx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBmYyA9DQotbWVudV9oZWxwX3NvZnR3YXJlX3VwZGF0ZXNfbWFuYWdlX3NvZnR3YXJlX2NvbmZpZ190ZXh0PVx1MzBiZFx1MzBkNVx1MzBjOFx1MzBhNlx1MzBhN1x1MzBhMlx1NjljYlx1NjIxMFx1MzA2ZVx1N2JhMVx1NzQwNigmTSkuLi4NCi0NCi13b3Jrc3BhY2VDYW5ub3RMb2NrVGl0bGU9ezB9IFx1MzA5Mlx1OTU4Ylx1NTljYlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLXdvcmtzcGFjZUNhbm5vdExvY2tNZXNzYWdlPXswfSBcdTMwNmZcdTMwMDFcdTUyMjVcdTMwNmVcdTMwYTRcdTMwZjNcdTMwYjlcdTMwYmZcdTMwZjNcdTMwYjlcdTMwNmVcdTViOWZcdTg4NGNcdTRlMmRcdTMwNmJcdTMwNmZcdTk1OGJcdTU5Y2JcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgIFx1NWI5Zlx1ODg0Y1x1NGUyZFx1MzA2ZVx1MzBhNFx1MzBmM1x1MzBiOVx1MzBiZlx1MzBmM1x1MzBiOVx1MzA2Ylx1NTIwN1x1MzA4YVx1NjZmZlx1MzA0OFx1MzA4Ylx1MzA0Ylx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBhNFx1MzBmM1x1MzBiOVx1MzBiZlx1MzBmM1x1MzBiOVx1MzA5Mlx1OTU4OVx1MzA1OFx1MzA2Nlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1NTE4ZFx1NTljYlx1NTJkNVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0RpYWdub3Npcz1cdThhM2FcdTY1YWRcdTMwNGFcdTMwODhcdTMwNzNcdTRmZWVcdTVmYTlcdTMwYzRcdTMwZmNcdTMwZWINCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9IZWFsdGhDaGVjaz1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwZDhcdTMwZWJcdTMwYjlcdTMwZmJcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwOTJcdTViOWZcdTg4NGNcdTMwNTlcdTMwOGIuLi4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9SZW1vdmVSZWZlcmVuY2U9XHU3MTIxXHU1MmI5XHUzMDZhXHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDc4XHUzMDZlXHU1M2MyXHU3MTY3XHUzMDkyXHU5NjY0XHU1M2JiXHUzMDU5XHUzMDhiLi4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwZjFhMDkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRmlsZSBNZW51DQotZmlsZU1lbnVJdGVtX3RleHQ9XHVkMzBjXHVjNzdjKCZGKQ0KLWZpbGVOZXdNZW51SXRlbV90ZXh0PVx1YzBjOFx1Yjg1YyBcdWM3OTFcdWMxMzEoJk4pDQotZmlsZU9wZW5NZW51SXRlbV90ZXh0PVx1YzVmNFx1YWUzMCgmUCkNCi0NCi0jIEVkaXQgTWVudQ0KLWVkaXRNZW51SXRlbV90ZXh0PVx1ZDNiOFx1YzlkMSgmRSkNCi0NCi0jIE5hdmlnYXRlIE1lbnUNCi1uYXZpZ2F0ZU1lbnVJdGVtX3RleHQ9XHVkMGQwXHVjMGM5KCZOKQ0KLQ0KLSMgU2VhcmNoIE1lbnUNCi1zZWFyY2hNZW51SXRlbV90ZXh0PVx1YWM4MFx1YzBjOSgmUykNCi0NCi0jIENvbmZpZ3VyYXRpb24gTWVudQ0KLWNvbmZpZ3VyYXRpb25NZW51SXRlbV90ZXh0PVx1YWQ2Y1x1YzEzMSgmQykNCi0NCi0jIFdpbmRvdyBNZW51DQotd2luZG93TWVudUl0ZW1fdGV4dD1cdWNjM2QoJlcpDQotd2luZG93T3BlblBlcnNwZWN0aXZlTWVudUl0ZW1fdGV4dD1QZXJzcGVjdGl2ZSBcdWM1ZjRcdWFlMzAoJk8pDQotd2luZG93U2hvd1ZpZXdNZW51SXRlbV90ZXh0PVx1YmNmNFx1YWUzMCBcdWQ0NWNcdWMyZGMNCi0NCi0jIEhlbHAgTWVudQ0KLWhlbHBNZW51SXRlbV90ZXh0PVx1YjNjNFx1YzZjMFx1YjlkMCgmSCkNCi0NCi0jIE5ldyBEcm9wIERvd24gTWVudQ0KLW5ld0Ryb3BEb3duX3Rvb2x0aXBfdGV4dD1cdWMwYzhcdWI4NWMgXHVjNzkxXHVjMTMxDQotb3RoZXJNZW51SXRlbV90ZXh0PVx1YWUzMFx1ZDBjMC4uLg0KLQ0KLSMgT3BlbiBQZXJzcGVjdGl2ZSBBY3Rpb25zDQotb3BlbkF1dGhvcmluZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ9XHVjNzkxXHVjMTMxDQotb3BlbkJyb3dzaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1cdWNjM2VcdWM1NDRcdWJjZjRcdWFlMzANCi0NCi0jIE1pc2MgQWN0aW9ucw0KLWVkaXRBY3Rpb25fdGV4dD1cdWQzYjhcdWM5ZDENCi11cGdyYWRlTGlicmFyeUFjdGlvbl90ZXh0PUkxXHVjNWQwXHVjMTFjIEkyXHViODVjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjNWM1XHVhZGY4XHViODA4XHVjNzc0XHViNGRjLi4uDQotDQotc3RhcnR1cF9kaXJfbG9nX2luZm9fdGV4dD1cdWM4MTVcdWJjZjQ6IFx1Yzc1MVx1YzZhOVx1ZDUwNFx1Yjg1Y1x1YWRmOFx1YjdhOCBcdWMyZGNcdWM3OTEgXHViNTE0XHViODA5XHVkMWEwXHViOWFjID0NCi1tZW51X2hlbHBfc29mdHdhcmVfdXBkYXRlc19tYW5hZ2Vfc29mdHdhcmVfY29uZmlnX3RleHQ9XHVjMThjXHVkNTA0XHVkMmI4XHVjNmU4XHVjNWI0IFx1YWQ2Y1x1YzEzMSBcdWFkMDBcdWI5YWMoJk0pLi4uDQotDQotd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlPXswfVx1Yzc0NChcdWI5N2MpIFx1YzJkY1x1Yzc5MVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjNzRjDQotd29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2U9XHViMmU0XHViOTc4IFx1Yzc3OFx1YzJhNFx1ZDEzNFx1YzJhNFx1YWMwMCBcdWMyZTRcdWQ1ODkgXHVjOTExXHVjNzc0XHViYTc0IHswfVx1Yzc0MChcdWIyOTQpIFx1YzJkY1x1Yzc5MVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWMyZTRcdWQ1ODkgXHVjNzc4XHVjMmE0XHVkMTM0XHVjMmE0XHViODVjIFx1YzgwNFx1ZDY1OFx1ZDU1OFx1YWM3MFx1YjA5OCBcdWM3NzhcdWMyYTRcdWQxMzRcdWMyYTRcdWI5N2MgXHViMmViXHVhY2UwIFx1Yzc1MVx1YzZhOVx1ZDUwNFx1Yjg1Y1x1YWRmOFx1YjdhOFx1Yzc0NCBcdWIyZTRcdWMyZGMgXHVjMmRjXHVjNzkxXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0RpYWdub3Npcz1cdWM5YzRcdWIyZTggXHViYzBmIFx1YmNmNVx1YWQ2YyBcdWIzYzRcdWFkNmMNCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9IZWFsdGhDaGVjaz1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM3NTggXHVjMGMxXHVkMGRjIFx1YWM4MFx1YzBhYyBcdWMyMThcdWQ1ODkuLi4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9SZW1vdmVSZWZlcmVuY2U9XHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWM2MjRcdWJlMGNcdWM4MWRcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Y2MzOFx1Yzg3MCBcdWM4MWNcdWFjNzAuLi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI1NjEwZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGaWxlIE1lbnUNCi1maWxlTWVudUl0ZW1fdGV4dD0mQXJxdWl2bw0KLWZpbGVOZXdNZW51SXRlbV90ZXh0PSZOb3ZvDQotZmlsZU9wZW5NZW51SXRlbV90ZXh0PUEmYnJpcg0KLQ0KLSMgRWRpdCBNZW51DQotZWRpdE1lbnVJdGVtX3RleHQ9JkVkaXRhcg0KLQ0KLSMgTmF2aWdhdGUgTWVudQ0KLW5hdmlnYXRlTWVudUl0ZW1fdGV4dD0mTmF2ZWdhcg0KLQ0KLSMgU2VhcmNoIE1lbnUNCi1zZWFyY2hNZW51SXRlbV90ZXh0PSZQcm9jdXJhcg0KLQ0KLSMgQ29uZmlndXJhdGlvbiBNZW51DQotY29uZmlndXJhdGlvbk1lbnVJdGVtX3RleHQ9JkNvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi0NCi0jIFdpbmRvdyBNZW51DQotd2luZG93TWVudUl0ZW1fdGV4dD0mSmFuZWxhDQotd2luZG93T3BlblBlcnNwZWN0aXZlTWVudUl0ZW1fdGV4dD0mQWJyaXIgUGVyc3BlY3RpdmENCi13aW5kb3dTaG93Vmlld01lbnVJdGVtX3RleHQ9TW9zdHJhciBWaXN1YWxpemFcdTAwZTdcdTAwZTNvDQotDQotIyBIZWxwIE1lbnUNCi1oZWxwTWVudUl0ZW1fdGV4dD0mQWp1ZGENCi0NCi0jIE5ldyBEcm9wIERvd24gTWVudQ0KLW5ld0Ryb3BEb3duX3Rvb2x0aXBfdGV4dD1Ob3ZvDQotb3RoZXJNZW51SXRlbV90ZXh0PU91dHJvLi4uDQotDQotIyBPcGVuIFBlcnNwZWN0aXZlIEFjdGlvbnMNCi1vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1BdXRvcmlhDQotb3BlbkJyb3dzaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1OYXZlZ2FcdTAwZTdcdTAwZTNvDQotDQotIyBNaXNjIEFjdGlvbnMNCi1lZGl0QWN0aW9uX3RleHQ9RWRpdGFyDQotdXBncmFkZUxpYnJhcnlBY3Rpb25fdGV4dD1GYXplciBVcGdyYWRlIGRlIEJpYmxpb3RlY2EgZGUgTVx1MDBlOXRvZG9zIGRlIEkxIHBhcmEgSTIuLi4NCi0NCi1zdGFydHVwX2Rpcl9sb2dfaW5mb190ZXh0PUlORk86IERpcmV0XHUwMGYzcmlvIGluaWNpYWwgZG8gYXBsaWNhdGl2byA9DQotbWVudV9oZWxwX3NvZnR3YXJlX3VwZGF0ZXNfbWFuYWdlX3NvZnR3YXJlX2NvbmZpZ190ZXh0PSZHZXJlbmNpYXIgQ29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBTb2Z0d2FyZS4uLg0KLQ0KLXdvcmtzcGFjZUNhbm5vdExvY2tUaXRsZT1OXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCBpbmljaWFyIHswfQ0KLXdvcmtzcGFjZUNhbm5vdExvY2tNZXNzYWdlPXswfSBuXHUwMGUzbyBwb2Rlclx1MDBlMSBzZXIgaW5pY2lhZG8gZW5xdWFudG8gb3V0cmEgaW5zdFx1MDBlMm5jaWEgZXN0aXZlciBlbSBleGVjdVx1MDBlN1x1MDBlM28uICBNdWRlIHBhcmEgYSBpbnN0XHUwMGUybmNpYSBlbSBleGVjdVx1MDBlN1x1MDBlM28gb3UgZmVjaGUtYSBlIHJlaW5pY2llIG8gYXBsaWNhdGl2by4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9EaWFnbm9zaXM9RmVycmFtZW50YXMgZGUgRGlhZ25cdTAwZjNzdGljbyBlIFJlcGFybw0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0hlYWx0aENoZWNrPUV4ZWN1dGFyIFZlcmlmaWNhXHUwMGU3XHUwMGUzbyBkZSBGdW5jaW9uYW1lbnRvIG5hIEJpYmxpb3RlY2EuLi4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9SZW1vdmVSZWZlcmVuY2U9UmVtb3ZlciBSZWZlclx1MDBlYW5jaWFzIGEgT2JqZXRvcyBJbnZcdTAwZTFsaWRvcy4uLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOWYzZDc0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZpbGUgTWVudQ0KLWZpbGVNZW51SXRlbV90ZXh0PVx1NjU4N1x1NGVmNigmRikNCi1maWxlTmV3TWVudUl0ZW1fdGV4dD1cdTY1YjBcdTVlZmEoJk4pDQotZmlsZU9wZW5NZW51SXRlbV90ZXh0PVx1NjI1M1x1NWYwMCgmUCkNCi0NCi0jIEVkaXQgTWVudQ0KLWVkaXRNZW51SXRlbV90ZXh0PVx1N2YxNlx1OGY5MSgmRSkNCi0NCi0jIE5hdmlnYXRlIE1lbnUNCi1uYXZpZ2F0ZU1lbnVJdGVtX3RleHQ9XHU2ZDRmXHU4OWM4KCZOKQ0KLQ0KLSMgU2VhcmNoIE1lbnUNCi1zZWFyY2hNZW51SXRlbV90ZXh0PVx1NjQxY1x1N2QyMigmUykNCi0NCi0jIENvbmZpZ3VyYXRpb24gTWVudQ0KLWNvbmZpZ3VyYXRpb25NZW51SXRlbV90ZXh0PVx1OTE0ZFx1N2Y2ZSgmQykNCi0NCi0jIFdpbmRvdyBNZW51DQotd2luZG93TWVudUl0ZW1fdGV4dD1cdTdhOTdcdTUzZTMoJlcpDQotd2luZG93T3BlblBlcnNwZWN0aXZlTWVudUl0ZW1fdGV4dD1cdTYyNTNcdTVmMDBcdTkwMGZcdTg5YzZcdTU2ZmUoJk8pDQotd2luZG93U2hvd1ZpZXdNZW51SXRlbV90ZXh0PVx1NjYzZVx1NzkzYVx1ODljNlx1NTZmZQ0KLQ0KLSMgSGVscCBNZW51DQotaGVscE1lbnVJdGVtX3RleHQ9XHU1ZTJlXHU1MmE5KCZIKQ0KLQ0KLSMgTmV3IERyb3AgRG93biBNZW51DQotbmV3RHJvcERvd25fdG9vbHRpcF90ZXh0PVx1NjViMFx1NWVmYQ0KLW90aGVyTWVudUl0ZW1fdGV4dD1cdTUxNzZcdTRlZDYuLi4NCi0NCi0jIE9wZW4gUGVyc3BlY3RpdmUgQWN0aW9ucw0KLW9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PVx1N2YxNlx1NTE5OQ0KLW9wZW5Ccm93c2luZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ9XHU2ZDRmXHU4OWM4DQotDQotIyBNaXNjIEFjdGlvbnMNCi1lZGl0QWN0aW9uX3RleHQ9XHU3ZjE2XHU4ZjkxDQotdXBncmFkZUxpYnJhcnlBY3Rpb25fdGV4dD1cdTVjMDZcdTY1YjlcdTZjZDVcdTVlOTNcdTRlY2UgSTEgXHU1MzQ3XHU3ZWE3XHU1MjMwIEkyLi4uDQotDQotc3RhcnR1cF9kaXJfbG9nX2luZm9fdGV4dD1cdTRmZTFcdTYwNmZcdWZmMWFcdTVlOTRcdTc1MjhcdTdhMGJcdTVlOGZcdTU0MmZcdTUyYThcdTc2ZWVcdTVmNTUgPQ0KLW1lbnVfaGVscF9zb2Z0d2FyZV91cGRhdGVzX21hbmFnZV9zb2Z0d2FyZV9jb25maWdfdGV4dD1cdTdiYTFcdTc0MDZcdThmNmZcdTRlZjZcdTkxNGRcdTdmNmUoJk0pLi4uDQotDQotd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlPVx1NjVlMFx1NmNkNVx1NTQyZlx1NTJhOCB7MH0NCi13b3Jrc3BhY2VDYW5ub3RMb2NrTWVzc2FnZT1cdTY3MDlcdTUzZTZcdTRlMDBcdTViOWVcdTRmOGJcdTU3MjhcdThmZDBcdTg4NGNcdTY1ZjZcdTY1ZTBcdTZjZDVcdTU0MmZcdTUyYTggezB9XHUzMDAyXHU4YmY3XHU1MjA3XHU2MzYyXHU1MjMwXHU2YjYzXHU4ZmQwXHU4ODRjXHU3Njg0XHU1YjllXHU0ZjhiXHVmZjBjXHU2MjE2XHU1YzA2XHU1YjgzXHU1MTczXHU5NWVkXHU3MTM2XHU1NDBlXHU5MWNkXHU2NWIwXHU1NDJmXHU1MmE4XHU4YmU1XHU1ZTk0XHU3NTI4XHU3YTBiXHU1ZThmXHUzMDAyDQotbWFpbkFjdGlvbkJhckFkdmlzb3JfRGlhZ25vc2lzPVx1OGJjYVx1NjVhZFx1NTQ4Y1x1NGZlZVx1NTkwZFx1NWRlNVx1NTE3Nw0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0hlYWx0aENoZWNrPVx1NWJmOVx1NWU5M1x1NjI2N1x1ODg0Y1x1NTA2NVx1NTE2OFx1NjhjMFx1NjdlNS4uLg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX1JlbW92ZVJlZmVyZW5jZT1cdTk2NjRcdTUzYmJcdTViZjlcdTY1ZTBcdTY1NDhcdTViZjlcdThjNjFcdTc2ODRcdTVmMTVcdTc1MjguLi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWZlMmJmOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGaWxlIE1lbnUNCi1maWxlTWVudUl0ZW1fdGV4dD1cdTZhOTRcdTY4NDgoJkYpDQotZmlsZU5ld01lbnVJdGVtX3RleHQ9XHU2NWIwXHU1ZWZhKCZOKQ0KLWZpbGVPcGVuTWVudUl0ZW1fdGV4dD1cdTk1OGJcdTU1NWYoJlApDQotDQotIyBFZGl0IE1lbnUNCi1lZGl0TWVudUl0ZW1fdGV4dD1cdTdkZThcdThmMmYoJkUpDQotDQotIyBOYXZpZ2F0ZSBNZW51DQotbmF2aWdhdGVNZW51SXRlbV90ZXh0PVx1NWMwZVx1ODliZCgmTikNCi0NCi0jIFNlYXJjaCBNZW51DQotc2VhcmNoTWVudUl0ZW1fdGV4dD1cdTY0MWNcdTVjMGIoJlMpDQotDQotIyBDb25maWd1cmF0aW9uIE1lbnUNCi1jb25maWd1cmF0aW9uTWVudUl0ZW1fdGV4dD1cdTkxNGRcdTdmNmUoJkMpDQotDQotIyBXaW5kb3cgTWVudQ0KLXdpbmRvd01lbnVJdGVtX3RleHQ9XHU4OTk2XHU3YTk3KCZXKQ0KLXdpbmRvd09wZW5QZXJzcGVjdGl2ZU1lbnVJdGVtX3RleHQ9XHU5NThiXHU1NTVmXHU4OTk2XHU2NjZmKCZPKQ0KLXdpbmRvd1Nob3dWaWV3TWVudUl0ZW1fdGV4dD1cdTk4NmZcdTc5M2FcdTg5OTZcdTU3MTYNCi0NCi0jIEhlbHAgTWVudQ0KLWhlbHBNZW51SXRlbV90ZXh0PVx1OGFhYVx1NjYwZSgmSCkNCi0NCi0jIE5ldyBEcm9wIERvd24gTWVudQ0KLW5ld0Ryb3BEb3duX3Rvb2x0aXBfdGV4dD1cdTY1YjBcdTVlZmENCi1vdGhlck1lbnVJdGVtX3RleHQ9XHU1MTc2XHU0ZWQ2Li4uDQotDQotIyBPcGVuIFBlcnNwZWN0aXZlIEFjdGlvbnMNCi1vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1cdTdkZThcdTViZWINCi1vcGVuQnJvd3NpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PVx1NzAwZlx1ODliZA0KLQ0KLSMgTWlzYyBBY3Rpb25zDQotZWRpdEFjdGlvbl90ZXh0PVx1N2RlOFx1OGYyZg0KLXVwZ3JhZGVMaWJyYXJ5QWN0aW9uX3RleHQ9XHU1YzA3XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1ZjllIEkxIFx1NTM0N1x1N2QxYVx1ODFmMyBJMi4uLg0KLQ0KLXN0YXJ0dXBfZGlyX2xvZ19pbmZvX3RleHQ9XHU4Y2M3XHU4YTBhXHVmZjFhXHU2MWM5XHU3NTI4XHU3YTBiXHU1ZjBmXHU4ZDc3XHU1OWNiXHU3NmVlXHU5MzA0ID0NCi1tZW51X2hlbHBfc29mdHdhcmVfdXBkYXRlc19tYW5hZ2Vfc29mdHdhcmVfY29uZmlnX3RleHQ9XHU3YmExXHU3NDA2XHU4ZWRmXHU5YWQ0XHU5MTRkXHU3ZjZlKCZNKS4uLg0KLQ0KLXdvcmtzcGFjZUNhbm5vdExvY2tUaXRsZT1cdTcxMjFcdTZjZDVcdTU1NWZcdTUyZDUgezB9DQotd29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2U9XHU1M2U2XHU0ZTAwXHU1MDBiXHU1YmU2XHU0ZjhiXHU1N2Y3XHU4ODRjXHU2NjQyXHVmZjBjXHU3MTIxXHU2Y2Q1XHU1NTVmXHU1MmQ1IHswfVx1MzAwMlx1OGFjYlx1NTIwN1x1NjNkYlx1ODFmM1x1NTdmN1x1ODg0Y1x1NGUyZFx1NzY4NFx1NWJlNlx1NGY4Ylx1ZmYwY1x1NjIxNlx1OTVkY1x1OTU4OVx1NWJlNlx1NGY4Ylx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1NmIyMVx1OTFjZFx1NjViMFx1NTU1Zlx1NTJkNVx1NjFjOVx1NzUyOFx1N2EwYlx1NWYwZlx1MzAwMg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0RpYWdub3Npcz1cdThhM2FcdTY1YjdcdTU0OGNcdTRmZWVcdTVmYTlcdTVkZTVcdTUxNzcNCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9IZWFsdGhDaGVjaz1cdTZiNjNcdTU3MjhcdTZhYTJcdTY3ZTVcdTdhMGJcdTVmMGZcdTVlYWJcdTc2ODRcdTUwNjVcdTUxNjhcdTcyYzBcdTYxNGIuLi4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9SZW1vdmVSZWZlcmVuY2U9XHU3OWZiXHU5NjY0XHU3MTIxXHU2NTQ4XHU3MjY5XHU0ZWY2XHU3Njg0XHU1M2MzXHU3MTY3Li4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMjBjNjdlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yY3AubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMi9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Yjk3M2YxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLm5sMi5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMi5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gZnJhZ21lbnQueG1sLFwNCi0gICAgICAgICAgICAgICBubDIuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcnUucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDIvZnJhZ21lbnQueG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMi9mcmFnbWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3NTFkNmQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMi9mcmFnbWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPGZyYWdtZW50Ci0gICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJjcC5ubDIiCi0gICBuYW1lPSJFUEYgQ29tcG9zZXIgV29ya2JlbmNoIChOTDIpIgotICAgdmVyc2lvbj0iMS4yLjAiCi0gICBwcm92aWRlci1uYW1lPSJJQk0iCi0gICBwbHVnaW4taWQ9Im9yZy5lY2xpcHNlLmVwZi5yY3AiCi0gICBwbHVnaW4tdmVyc2lvbj0iMS4yLjAiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9Im5sMi5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLTwvZnJhZ21lbnQ+CmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjBmYjM5MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1cdTA0MjFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGMgRVBGIC0gUkNQDQotcHJvZHVjdE5hbWU9XHUwNDIxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgQ2F0ZWdvcnkNCi1tZXRob2RDYXRlZ29yeU5hbWU9XHUwNDFjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0DQotDQotIyBWaWV3cw0KLXdlbGNvbWVWaWV3TmFtZT1cdTA0MWZcdTA0NDBcdTA0MzhcdTA0MzJcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0MzUNCi0NCi0jIEFjdGlvbnMNCi1nbG9iYWxBY3Rpb25TZXQ9XHUwNDEzXHUwNDNiXHUwNDNlXHUwNDMxXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MCBcdTA0MzRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0MzkNCi1uZXdBY3Rpb249Jlx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0Yw0KLW5ld0FjdGlvblRvb2x0aXA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjDQotb3BlbkFjdGlvbj0mXHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjLi4uDQotb3BlbkFjdGlvblRvb2x0aXA9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjDQotc2VhcmNoQWN0aW9uPSZcdTA0MWRcdTA0MzBcdTA0MzlcdTA0NDJcdTA0MzguLi4NCi1zZWFyY2hBY3Rpb25Ub29sdGlwPVx1MDQxZlx1MDQzZVx1MDQzOFx1MDQ0MVx1MDQzYQ0KLXdlbGNvbWVBY3Rpb249Jlx1MDQxZlx1MDQ0MFx1MDQzOFx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzOFx1MDQzNQ0KLXdlbGNvbWVBY3Rpb25Ub29sVGlwPVx1MDQxZlx1MDQ0MFx1MDQzOFx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzOFx1MDQzNQ0KLQ0KLSMgVG9vbHRpcHMNCi1zaG9ydGN1dC5vdmVydmlldy50b29sdGlwPVx1MDQxMlx1MDQzNVx1MDQ0MFx1MDQzZFx1MDQ0M1x1MDQ0Mlx1MDQ0Y1x1MDQ0MVx1MDQ0ZiBcdTA0M2RcdTA0MzAgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQ2XHUwNDQzIFx1MDQxZVx1MDQzMVx1MDQzN1x1MDQzZVx1MDQ0MA0KLXNob3J0Y3V0LnR1dG9yaWFscy50b29sdGlwPVx1MDQxMlx1MDQzNVx1MDQ0MFx1MDQzZFx1MDQ0M1x1MDQ0Mlx1MDQ0Y1x1MDQ0MVx1MDQ0ZiBcdTA0M2RcdTA0MzAgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQ2XHUwNDQzIFx1MDQyM1x1MDQ0N1x1MDQzNVx1MDQzMVx1MDQzZFx1MDQzOFx1MDQzYQ0KLXNob3J0Y3V0LmZpcnN0c3RlcHMudG9vbHRpcD1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0NDNcdTA0NDJcdTA0NGNcdTA0NDFcdTA0NGYgXHUwNDNkXHUwNDMwIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Nlx1MDQ0MyBcdTA0MWRcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M2JcdTA0M2UgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDRiDQotc2hvcnRjdXQud2VicmVzb3VyY2VzLnRvb2x0aXA9XHUwNDEyXHUwNDM1XHUwNDQwXHUwNDNkXHUwNDQzXHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzZFx1MDQzMCBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDZcdTA0NDMgXHUwNDIwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDRiIFdlYg0KLQ0KLSNBY3Rpb24gU2V0DQotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gXHUwNDE0XHUwNDM1XHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQzOCBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzY1x1MDQ0Yg0KLWFjdGlvblNldC5sYWJlbCA9IFx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzVcdTA0M2NcdTA0MzANCi1zZWFyY2hBY3Rpb24ubGFiZWwgPSBcdTA0MWZcdTA0M2VcdTA0MzhcdTA0NDFcdTA0M2EgXHUwNDNmXHUwNDNlIFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzNQ0KLXNlYXJjaEFjdGlvbi50b29sdGlwID0gXHUwNDFmXHUwNDNlXHUwNDM4XHUwNDQxXHUwNDNhIFx1MDQzZlx1MDQzZSBcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzUNCi1keW5hbWljSGVscEFjdGlvbi5sYWJlbCA9IFx1MDQxNFx1MDQzOFx1MDQzZFx1MDQzMFx1MDQzY1x1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzAgDQotZHluYW1pY0hlbHBBY3Rpb24udG9vbHRpcCA9IFx1MDQxNFx1MDQzOFx1MDQzZFx1MDQzMFx1MDQzY1x1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzANCi0NCi0jQWN0aXZpdGllcy9DYXBhYmlsaXRpZXMNCi1hY3Rpdml0eS5nZW5lcmFsPVx1MDQxOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0MzggXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzMiBcdTA0MzggXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNlXHUwNDMyDQotYWN0aXZpdHkuZ2VuZXJhbC5kZXNjPVx1MDQxOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDRcdTA0NDNcdTA0M2RcdTA0M2FcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwIFx1MDQzOCBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzAgXHUwNDM4XHUwNDM3IEVjbGlwc2UNCi1hY3Rpdml0eS50ZWFtLmN2cz1cdTA0MWZcdTA0M2VcdTA0MzRcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0M2FcdTA0MzAgQ1ZTDQotYWN0aXZpdHkudGVhbS5jdnMuZGVzYz1cdTA0MThcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgQ1ZTIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDMwXHUwNDNjXHUwNDM4Lg0KLWFjdGl2aXR5LnRlYW09XHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDRmIFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzYVx1MDQzMCBcdTA0NDFcdTA0M2VcdTA0MzJcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDRiDQotYWN0aXZpdHkudGVhbS5kZXNjPVx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzMCBcdTA0M2RcdTA0MzBcdTA0MzQgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDNjXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzMFx1MDQzY1x1MDQzOCBcdTA0NDEgXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDQ5XHUwNDRjXHUwNDRlIFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzYyBcdTA0NDNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmXHUwNDNjXHUwNDM4Lg0KLQ0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsPVx1MDQxZVx1MDQzMVx1MDQ0OVx1MDQzOFx1MDQzNQ0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsLmRlc2M9XHUwNDE4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDRcdTA0NDNcdTA0M2RcdTA0M2FcdTA0NDZcdTA0MzhcdTA0MzggRWNsaXBzZQ0KLWFjdGl2aXR5LmNhdC50ZWFtPVx1MDQxM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQzMA0KLWFjdGl2aXR5LmNhdC50ZWFtLmRlc2M9XHUwNDIzXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzMFx1MDQzY1x1MDQzOCBcdTA0NDEgXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDQ5XHUwNDRjXHUwNDRlIFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzYyBcdTA0NDNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmXHUwNDNjXHUwNDM4Lg0KLQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMgPSBcdTA0MTNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGIgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eU5hbWUgPSAmXHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiIFx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzOQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2F0ZWdvcnlOYW1lID0gJlx1MDQxM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0YiBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uID0gXHUwNDE3XHUwNDMwXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzZSZcdTA0MzRcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM0IFx1MDQzMlx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNVx1MDQzYyBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2YgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvblRvb2x0aXAgPSBcdTA0MTdcdTA0MzBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0NDhcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzJcdTA0M2VcdTA0M2MgXHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM4IFx1MDQzYSBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NDMsIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDMxXHUwNDQzXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzMlx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGIgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5jYXB0aW9uTWVzc2FnZSA9IFx1MDQxM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0YiBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDMyXHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDMwXHUwNDRlXHUwNDQyIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0M2FcdTA0M2JcdTA0NGVcdTA0NDdcdTA0MzBcdTA0NGVcdTA0NDIgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNiXHUwNDM4XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAuIFx1MDQxM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0YiBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNkXHUwNDRiIFx1MDQzZFx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0MzUgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQzOC4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWNlMWQzMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGaWxlIE1lbnUNCi1maWxlTWVudUl0ZW1fdGV4dD0mXHUwNDI0XHUwNDMwXHUwNDM5XHUwNDNiDQotZmlsZU5ld01lbnVJdGVtX3RleHQ9Jlx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0Yw0KLWZpbGVPcGVuTWVudUl0ZW1fdGV4dD0mXHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjDQotDQotIyBFZGl0IE1lbnUNCi1lZGl0TWVudUl0ZW1fdGV4dD0mXHUwNDFmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDMwDQotDQotIyBOYXZpZ2F0ZSBNZW51DQotbmF2aWdhdGVNZW51SXRlbV90ZXh0PSZcdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzlcdTA0NDJcdTA0MzgNCi0NCi0jIFNlYXJjaCBNZW51DQotc2VhcmNoTWVudUl0ZW1fdGV4dD1cdTA0MWZcdTA0M2UmXHUwNDM4XHUwNDQxXHUwNDNhDQotDQotIyBDb25maWd1cmF0aW9uIE1lbnUNCi1jb25maWd1cmF0aW9uTWVudUl0ZW1fdGV4dD0mXHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmDQotDQotIyBXaW5kb3cgTWVudQ0KLXdpbmRvd01lbnVJdGVtX3RleHQ9Jlx1MDQxZVx1MDQzYVx1MDQzZFx1MDQzZQ0KLXdpbmRvd09wZW5QZXJzcGVjdGl2ZU1lbnVJdGVtX3RleHQ9Jlx1MDQxZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzVcdTA0M2FcdTA0NDZcdTA0MzhcdTA0NGUNCi13aW5kb3dTaG93Vmlld01lbnVJdGVtX3RleHQ9XHUwNDFmXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQ0Yw0KLQ0KLSMgSGVscCBNZW51DQotaGVscE1lbnVJdGVtX3RleHQ9Jlx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzMA0KLQ0KLSMgTmV3IERyb3AgRG93biBNZW51DQotbmV3RHJvcERvd25fdG9vbHRpcF90ZXh0PVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0Yw0KLW90aGVyTWVudUl0ZW1fdGV4dD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzUuLi4NCi0NCi0jIE9wZW4gUGVyc3BlY3RpdmUgQWN0aW9ucw0KLW9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNQ0KLW9wZW5Ccm93c2luZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwDQotDQotIyBNaXNjIEFjdGlvbnMNCi1lZGl0QWN0aW9uX3RleHQ9XHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjDQotdXBncmFkZUxpYnJhcnlBY3Rpb25fdGV4dD1cdTA0MWVcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0NDEgSTEgXHUwNDM0XHUwNDNlIEkyLi4uDQotDQotc3RhcnR1cF9kaXJfbG9nX2luZm9fdGV4dD1JTkZPOiBcdTA0MWRcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzYlx1MDQzZVx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiA9DQotbWVudV9oZWxwX3NvZnR3YXJlX3VwZGF0ZXNfbWFuYWdlX3NvZnR3YXJlX2NvbmZpZ190ZXh0PSZcdTA0MjNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM1XHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0Yi4uLg0KLQ0KLXdvcmtzcGFjZUNhbm5vdExvY2tUaXRsZT1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzN1x1MDQzMFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQ0YyB7MH0NCi13b3Jrc3BhY2VDYW5ub3RMb2NrTWVzc2FnZT1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzN1x1MDQzMFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQ0YyB7MH0sIFx1MDQzZlx1MDQzZVx1MDQzYVx1MDQzMCBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDM5IFx1MDQ0ZFx1MDQzYVx1MDQzN1x1MDQzNVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQ0Zlx1MDQ0MC4gIFx1MDQxZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQ0MVx1MDQ0YyBcdTA0M2RcdTA0MzAgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDMwXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM5IFx1MDQ0ZFx1MDQzYVx1MDQzN1x1MDQzNVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQ0Zlx1MDQ0MCBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDM3XHUwNDMwXHUwNDNhXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzNVx1MDQzM1x1MDQzZSBcdTA0MzggXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzYlx1MDQzZVx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNS4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9EaWFnbm9zaXM9XHUwNDIxXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzOCBcdTA0MzggXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotbWFpbkFjdGlvbkJhckFkdmlzb3JfSGVhbHRoQ2hlY2s9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzguLi4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9SZW1vdmVSZWZlcmVuY2U9XHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCBcdTA0M2RcdTA0MzAgXHUwNDNkXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQ0Yi4uLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNWViMDM4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucmNwLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGYxMTljOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zb3VyY2UubmwyYS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMmEuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IGZyYWdtZW50LnhtbCxcDQotICAgICAgICAgICAgICAgbmwyYS5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMmEvZnJhZ21lbnQueG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMmEvZnJhZ21lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhM2E4MzQ5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDJhL2ZyYWdtZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08ZnJhZ21lbnQKLSAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLm5sMmEiCi0gICBuYW1lPSJFUEYgQ29tcG9zZXIgV29ya2JlbmNoIChOTDJhKSIKLSAgIHZlcnNpb249IjEuMi4wIgotICAgcHJvdmlkZXItbmFtZT0iSUJNIgotICAgcGx1Z2luLWlkPSJvcmcuZWNsaXBzZS5lcGYucmNwIgotICAgcGx1Z2luLXZlcnNpb249IjEuMi4wIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJubDJhLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotPC9mcmFnbWVudD4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4NzhiZmQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBDb21wb3NlciBSQ1ANCi1wcm9kdWN0TmFtZT1FUEYgQ29tcG9zZXINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1ldG9kZQ0KLQ0KLSMgVmlld3MNCi13ZWxjb21lVmlld05hbWU9VmVsa29tbWVuDQotDQotIyBBY3Rpb25zDQotZ2xvYmFsQWN0aW9uU2V0PUdsb2JhbHQgZnVua3Rpb25zc1x1MDBlNnQNCi1uZXdBY3Rpb249Jk55DQotbmV3QWN0aW9uVG9vbHRpcD1OeQ0KLW9wZW5BY3Rpb249Jlx1MDBjNWJuLi4uDQotb3BlbkFjdGlvblRvb2x0aXA9XHUwMGM1Ym4NCi1zZWFyY2hBY3Rpb249JlNcdTAwZjhnLi4uDQotc2VhcmNoQWN0aW9uVG9vbHRpcD1TXHUwMGY4Zw0KLXdlbGNvbWVBY3Rpb249JlZlbGtvbW1lbg0KLXdlbGNvbWVBY3Rpb25Ub29sVGlwPVZlbGtvbW1lbg0KLQ0KLSMgVG9vbHRpcHMNCi1zaG9ydGN1dC5vdmVydmlldy50b29sdGlwPVZlbmQgdGlsYmFnZSB0aWwgc2lkZW4gT3ZlcnNpZ3QNCi1zaG9ydGN1dC50dXRvcmlhbHMudG9vbHRpcD1WZW5kIHRpbGJhZ2UgdGlsIHNpZGVuIFx1MDBkOHZlcHJvZ3JhbQ0KLXNob3J0Y3V0LmZpcnN0c3RlcHMudG9vbHRpcD1WZW5kIHRpbGJhZ2UgdGlsIHNpZGVuIERlIGZcdTAwZjhyc3RlIHRyaW4NCi1zaG9ydGN1dC53ZWJyZXNvdXJjZXMudG9vbHRpcD1WZW5kIHRpbGJhZ2UgdGlsIHNpZGVuIFdlYnJlc3NvdXJjZXIgICAgICAgDQotDQotI0FjdGlvbiBTZXQNCi1hY3Rpb25TZXQuZGVzY3JpcHRpb24gPSBIalx1MDBlNmxwIC0gdlx1MDBlNnJrdFx1MDBmOGpzbGluamVmdW5rdGlvbmVyDQotYWN0aW9uU2V0LmxhYmVsID0gSGpcdTAwZTZscA0KLXNlYXJjaEFjdGlvbi5sYWJlbCA9IFNcdTAwZjhnbmluZyAtIGhqXHUwMGU2bHANCi1zZWFyY2hBY3Rpb24udG9vbHRpcCA9IFNcdTAwZjhnbmluZyAtIGhqXHUwMGU2bHANCi1keW5hbWljSGVscEFjdGlvbi5sYWJlbCA9IER5bmFtaXNrIGhqXHUwMGU2bHAgDQotZHluYW1pY0hlbHBBY3Rpb24udG9vbHRpcCA9IER5bmFtaXNrIGhqXHUwMGU2bHANCi0NCi0jQWN0aXZpdGllcy9DYXBhYmlsaXRpZXMNCi1hY3Rpdml0eS5nZW5lcmFsPUltcG9ydFx1MDBlOXIgb2cgZWtzcG9ydFx1MDBlOXIgcHJvamVrdGVyIG9nIHJlc3NvdXJjZXINCi1hY3Rpdml0eS5nZW5lcmFsLmRlc2M9QnJ1ZyBzdGFuZGFyZGZ1bmt0aW9uZXJuZSBpIEVjbGlwc2UgdGlsIGltcG9ydFx1MDBlOXIvZWtzcG9ydFx1MDBlOXIgcHJvamVrdC9yZXNzb3VyY2VyLg0KLWFjdGl2aXR5LnRlYW0uY3ZzPUNWUy11bmRlcnN0XHUwMGY4dHRlbHNlDQotYWN0aXZpdHkudGVhbS5jdnMuZGVzYz1CcnVnIENWUyAoQ29uY3VycmVudCBWZXJzaW9ucyBTeXN0ZW0pIHRpbCBhdCBhZG1pbmlzdHJlcmUgcmVzc291cmNlci4NCi1hY3Rpdml0eS50ZWFtPVVuZGVyc3RcdTAwZjh0dGVsc2UgYWYga2VybmV0ZWFtDQotYWN0aXZpdHkudGVhbS5kZXNjPURlbCBwcm9qZWt0ZXIgdmhhLiBrb25maWd1cmF0aW9uc3N0eXJpbmdzc3lzdGVtZXINCi0NCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbD1HZW5lcmVsdA0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsLmRlc2M9QnJ1ZyBzdGFuZGFyZGZ1bmt0aW9uZXJuZSBpIEVjbGlwc2UuDQotYWN0aXZpdHkuY2F0LnRlYW09VGVhbQ0KLWFjdGl2aXR5LmNhdC50ZWFtLmRlc2M9QnJ1ZyBrb25maWd1cmF0aW9uc3N0eXJpbmdzc3lzdGVtZXIgdGlsIGF0IGFkbWluaXN0cmVyZSByZXNzb3VyY2VyLg0KLQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMgPSBNdWxpZ2hlZGVyDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eU5hbWUgPSAmTXVsaWdoZWRlcg0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2F0ZWdvcnlOYW1lID0gJk11bGlnaGVkZXINCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uID0gViZpcyBtZWRkZWxlbHNlIHZlZCBha3RpdmVyaW5nIGFmIG11bGlnaGVkZXINCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uVG9vbHRpcCA9IFZpcyBtZWRkZWxlbHNlLCBuXHUwMGU1ciBlbiBmdW5rdGlvbiwgZGVyIGtyXHUwMGU2dmVyIGFrdGl2ZXJpbmcgYWYgbXVsaWdoZWRlciwgYW52ZW5kZXMgZlx1MDBmOHJzdGUgZ2FuZy4NCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhcHRpb25NZXNzYWdlID0gTWVkIE11bGlnaGVkZXIga2FuIGR1IGFrdGl2ZXJlIGVsbGVyIGRlYWt0aXZlcmUgZm9yc2tlbGxpZ2UgcHJvZHVrdGtvbXBvbmVudGVyLiBEaXNzZSBtdWxpZ2hlZGVyIGVyIGdydXBwZXJldCBpIGhlbmhvbGQgdGlsIGV0IHNcdTAwZTZ0IGZvcnVkZGVmaW5lcmVkZSBrYXRlZ29yaWVyLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1M2Q3MGQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZpbGUgTWVudQ0KLWZpbGVNZW51SXRlbV90ZXh0PSZGaWwNCi1maWxlTmV3TWVudUl0ZW1fdGV4dD0mTnkNCi1maWxlT3Blbk1lbnVJdGVtX3RleHQ9Jlx1MDBjNWJuDQotDQotIyBFZGl0IE1lbnUNCi1lZGl0TWVudUl0ZW1fdGV4dD0mUmVkaWdcdTAwZTlyDQotDQotIyBOYXZpZ2F0ZSBNZW51DQotbmF2aWdhdGVNZW51SXRlbV90ZXh0PSZOYXZpZ1x1MDBlOXINCi0NCi0jIFNlYXJjaCBNZW51DQotc2VhcmNoTWVudUl0ZW1fdGV4dD0mU1x1MDBmOGcNCi0NCi0jIENvbmZpZ3VyYXRpb24gTWVudQ0KLWNvbmZpZ3VyYXRpb25NZW51SXRlbV90ZXh0PSZLb25maWd1cmF0aW9uDQotDQotIyBXaW5kb3cgTWVudQ0KLXdpbmRvd01lbnVJdGVtX3RleHQ9VmluZCZ1ZQ0KLXdpbmRvd09wZW5QZXJzcGVjdGl2ZU1lbnVJdGVtX3RleHQ9Jlx1MDBjNWJuIHBlcnNwZWt0aXYNCi13aW5kb3dTaG93Vmlld01lbnVJdGVtX3RleHQ9VmlzIG92ZXJzaWd0DQotDQotIyBIZWxwIE1lbnUNCi1oZWxwTWVudUl0ZW1fdGV4dD0mSGpcdTAwZTZscA0KLQ0KLSMgTmV3IERyb3AgRG93biBNZW51DQotbmV3RHJvcERvd25fdG9vbHRpcF90ZXh0PU55DQotb3RoZXJNZW51SXRlbV90ZXh0PUFuZGV0Li4uDQotDQotIyBPcGVuIFBlcnNwZWN0aXZlIEFjdGlvbnMNCi1vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1SZWRpZ2VyaW5nDQotb3BlbkJyb3dzaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1HZW5uZW1zZQ0KLQ0KLSMgTWlzYyBBY3Rpb25zDQotZWRpdEFjdGlvbl90ZXh0PVJlZGlnXHUwMGU5cg0KLXVwZ3JhZGVMaWJyYXJ5QWN0aW9uX3RleHQ9T3BncmFkXHUwMGU5ciBtZXRvZGViaWJsaW90ZWsgZnJhIEkxIHRpbCBJMi4uLg0KLQ0KLXN0YXJ0dXBfZGlyX2xvZ19pbmZvX3RleHQ9SU5GTzogUHJvZ3JhbXN0YXJ0YmlibGlvdGVrID0NCi1tZW51X2hlbHBfc29mdHdhcmVfdXBkYXRlc19tYW5hZ2Vfc29mdHdhcmVfY29uZmlnX3RleHQ9JkFkbWluaXN0clx1MDBlOXIgc29mdHdhcmVrb25maWd1cmF0aW9uLi4uDQotDQotd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlPUthbiBpa2tlIHN0YXJ0ZSB7MH0NCi13b3Jrc3BhY2VDYW5ub3RMb2NrTWVzc2FnZT17MH0ga2FuIGlra2Ugc3RhcnRlLCBodmlzIGVuIGFuZGVuIGZvcmVrb21zdCBlciBpIGdhbmcuIFNraWZ0IHRpbCBkZW4gaWdhbmd2XHUwMGU2cmVuZGUgZm9yZWtvbXN0LCBlbGxlciBsdWsgZGVuLCBvZyBnZW5zdGFydCBwcm9ncmFtbWV0Lg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0RpYWdub3Npcz1EaWFnbm9zZS0gb2cgcmVwYXJhdGlvbnN2XHUwMGU2cmt0XHUwMGY4amVyDQotbWFpbkFjdGlvbkJhckFkdmlzb3JfSGVhbHRoQ2hlY2s9VWRmXHUwMGY4ciBoZWxicmVkc3VuZGVyc1x1MDBmOGdlbHNlIGFmIGJpYmxpb3Rlay4uLg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX1JlbW92ZVJlZmVyZW5jZT1GamVybiByZWZlcmVuY2VyIHRpbCB1Z3lsZGlnZSBvYmpla3Rlci4uLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4MTFkOTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiODBhYjgwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwxLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkYTJjOTEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1zb3VyY2UubmwxLmphciA9IHNyYy8NCi1vdXRwdXQubmwxLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDEuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9pdC5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZTJkNmE2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIFJpY2ggVGV4dCAoTkxTKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAwOGRkYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFJpY2ggVGV4dA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFRoZSBIVE1MIGZpbGUgdXNlZCB0byByZW5kZXIgdGhlIFJpY2ggVGV4dCBFZGl0b3IuDQotUmljaFRleHQuZWRpdG9ySFRNTD1ydGUuaHRtDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYzU3ODcyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9VGV4dG8gZW5yaXF1ZWNpZG8gZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgVGhlIEhUTUwgZmlsZSB1c2VkIHRvIHJlbmRlciB0aGUgUmljaCBUZXh0IEVkaXRvci4NCi1SaWNoVGV4dC5lZGl0b3JIVE1MPXJ0ZS5odG0NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5MDBlNGIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1UZXh0ZSBlbnJpY2hpIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFRoZSBIVE1MIGZpbGUgdXNlZCB0byByZW5kZXIgdGhlIFJpY2ggVGV4dCBFZGl0b3IuDQotUmljaFRleHQuZWRpdG9ySFRNTD1ydGUuaHRtDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1M2QwMGQ2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9UmljaCBUZXh0IEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFRoZSBIVE1MIGZpbGUgdXNlZCB0byByZW5kZXIgdGhlIFJpY2ggVGV4dCBFZGl0b3IuDQotUmljaFRleHQuZWRpdG9ySFRNTD1ydGUuaHRtDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTM4MTU0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFJpY2ggVGV4dA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFRoZSBIVE1MIGZpbGUgdXNlZCB0byByZW5kZXIgdGhlIFJpY2ggVGV4dCBFZGl0b3IuDQotUmljaFRleHQuZWRpdG9ySFRNTD1ydGUuaHRtDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjEzZjBmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1YzExY1x1YzJkZFx1Yzc4OFx1YjI5NCBcdWQxNGRcdWMyYTRcdWQyYjgNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBUaGUgSFRNTCBmaWxlIHVzZWQgdG8gcmVuZGVyIHRoZSBSaWNoIFRleHQgRWRpdG9yLg0KLVJpY2hUZXh0LmVkaXRvckhUTUw9cnRlLmh0bQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzA4ODJlMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVJpY2ggVGV4dCBkbyBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBUaGUgSFRNTCBmaWxlIHVzZWQgdG8gcmVuZGVyIHRoZSBSaWNoIFRleHQgRWRpdG9yLg0KLVJpY2hUZXh0LmVkaXRvckhUTUw9cnRlLmh0bQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWFhODc4YS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTViY2NcdTY1ODdcdTY3MmNcdTY4M2NcdTVmMGYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBUaGUgSFRNTCBmaWxlIHVzZWQgdG8gcmVuZGVyIHRoZSBSaWNoIFRleHQgRWRpdG9yLg0KLVJpY2hUZXh0LmVkaXRvckhUTUw9cnRlLmh0bQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGEzODE1NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBSaWNoIFRleHQNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBUaGUgSFRNTCBmaWxlIHVzZWQgdG8gcmVuZGVyIHRoZSBSaWNoIFRleHQgRWRpdG9yLg0KLVJpY2hUZXh0LmVkaXRvckhUTUw9cnRlLmh0bQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1ZjVhZmUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb250IFN0eWxlIE5hbWVzDQotZm9udFN0eWxlX25vcm1hbD1Ob3JtYWwNCi1mb250U3R5bGVfc2VjdGlvbkhlYWRpbmc9QWJzY2huaXR0c1x1MDBmY2JlcnNjaHJpZnQgZGVyIEViZW5lIDENCi1mb250U3R5bGVfc3Vic2VjdGlvbkhlYWRpbmc9QWJzY2huaXR0c1x1MDBmY2JlcnNjaHJpZnQgZGVyIEViZW5lIDINCi1mb250U3R5bGVfc3ViU3Vic2VjdGlvbkhlYWRpbmc9QWJzY2huaXR0c1x1MDBmY2JlcnNjaHJpZnQgZGVyIEViZW5lIDMNCi1mb250U3R5bGVfcXVvdGU9Wml0YXQNCi1mb250U3R5bGVfY29kZVNhbXBsZT1Db2RlYmVpc3BpZWwNCi0NCi0jIEhUTUwgQmxvY2sgVGFncw0KLWJsb2NrVGFnX3BhcmFncmFwaD1BYnNhdHoNCi1ibG9ja1RhZ19oZWFkaW5nMT1cdTAwZGNiZXJzY2hyaWZ0IDENCi1ibG9ja1RhZ19oZWFkaW5nMj1cdTAwZGNiZXJzY2hyaWZ0IDINCi1ibG9ja1RhZ19oZWFkaW5nMz1cdTAwZGNiZXJzY2hyaWZ0IDMNCi1ibG9ja1RhZ19oZWFkaW5nND1cdTAwZGNiZXJzY2hyaWZ0IDQNCi1ibG9ja1RhZ19oZWFkaW5nNT1cdTAwZGNiZXJzY2hyaWZ0IDUNCi1ibG9ja1RhZ19oZWFkaW5nNj1cdTAwZGNiZXJzY2hyaWZ0IDYNCi1ibG9ja1RhZ19hZGRyZXNzPUFkcmVzc2UNCi1ibG9ja1RhZ19wcmVmb3JtYXR0ZWRUZXh0PVZvcmZvcm1hdGllcnRlciBUZXh0DQotDQotIyBIVE1MIEZvbnQgTmFtZXMNCi1mb250TmFtZV9kZWZhdWx0PVN0YW5kYXJkDQotZm9udE5hbWVfYXJpYWw9QXJpYWwNCi1mb250TmFtZV9jb3VyaWVyTmV3PUNvdXJpZXIgTmV3DQotZm9udE5hbWVfdGltZXNOZXdSb21hbj1UaW1lcyBOZXcgUm9tYW4NCi1mb250TmFtZV92ZXJkYW5hPVZlcmRhbmENCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgVG9vbCBCdXR0b25zDQotYWRkSG9yaXpvbnRhbEJhckFjdGlvbl90b29sVGlwVGV4dD1Ib3Jpem9udGFsZW4gQmFsa2VuIGhpbnp1Zlx1MDBmY2dlbg0KLWFkZEltYWdlQWN0aW9uX3Rvb2xUaXBUZXh0PUdyYWZpayBoaW56dWZcdTAwZmNnZW4NCi1hZGRMaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVplaWxlIGhpbnp1Zlx1MDBmY2dlbg0KLWFkZExpbmtBY3Rpb25fdG9vbFRpcFRleHQ9TGluayBoaW56dWZcdTAwZmNnZW4NCi1hZGRPcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1HZW9yZG5ldGUgTGlzdGUgaGluenVmXHUwMGZjZ2VuDQotYWRkVGFibGVBY3Rpb25fdG9vbFRpcFRleHQ9VGFiZWxsZSBoaW56dWZcdTAwZmNnZW4NCi1hZGRVbm9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PVVuZ2VvcmRuZXRlIExpc3RlIGhpbnp1Zlx1MDBmY2dlbg0KLWJvbGRBY3Rpb25fdG9vbFRpcFRleHQ9RmV0dA0KLWNsZWFyQ29udGVudEFjdGlvbl90b29sVGlwVGV4dD1JbmhhbHQgbFx1MDBmNnNjaGVuDQotY29weUFjdGlvbl90b29sVGlwVGV4dD1Lb3BpZXJlbg0KLWN1dEFjdGlvbl90b29sVGlwVGV4dD1BdXNzY2huZWlkZW4NCi1maW5kUmVwbGFjZUFjdGlvbl90b29sVGlwVGV4dD1TdWNoZW4vRXJzZXR6ZW4NCi1pbmRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9RWluclx1MDBmY2NrZW4NCi1pdGFsaWNBY3Rpb25fdG9vbFRpcFRleHQ9S3Vyc2l2DQotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1aZW50cmllcnQNCi1qdXN0aWZ5RnVsbEFjdGlvbl90b29sVGlwVGV4dD1CbG9jaw0KLWp1c3RpZnlMZWZ0QWN0aW9uX3Rvb2xUaXBUZXh0PUxpbmtzYlx1MDBmY25kaWcNCi1qdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQ9UmVjaHRzYlx1MDBmY25kaWcNCi1vdXRkZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUF1c3JcdTAwZmNja2VuDQotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9RWluZlx1MDBmY2dlbg0KLXN1YnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1UaWVmc3RlbGxlbg0KLXN1cGVyc2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PUhvY2hzdGVsbGVuDQotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVVudGVyc3RyZWljaGVuDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIENvbWJvYm94ZXMNCi1mb250U3R5bGVBY3Rpb25fdG9vbFRpcFRleHQ9U2NocmlmdHN0aWwgZmVzdGxlZ2VuDQotYmxvY2tUYWdBY3Rpb25fdG9vbFRpcFRleHQ9QWxzIEJsb2NrIG1hcmtpZXJlbg0KLWZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0PVNjaHJpZnRuYW1lbiBmZXN0bGVnZW4NCi1mb250U2l6ZUFjdGlvbl90b29sVGlwVGV4dD1TY2hyaWZ0Z3JcdTAwZjZcdTAwZGZlIGZlc3RsZWdlbg0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb250ZXh0IE1lbnUgSXRlbXMNCi1jdXRBY3Rpb25fdGV4dD1BdXNzY2huZWlkZW4NCi1jb3B5QWN0aW9uX3RleHQ9S29waWVyZW4NCi1wYXN0ZUFjdGlvbl90ZXh0PUVpbmZcdTAwZmNnZW4NCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgVGFicw0KLXJpY2hUZXh0VGFiX3RleHQ9UmljaCBUZXh0DQotcmljaFRleHRUYWJfdG9vbFRpcFRleHQ9SW5oYWx0IGluIFJpY2ggVGV4dCBiZWFyYmVpdGVuDQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PUluaGFsdCBpbiBIVE1MIGJlYXJiZWl0ZW4NCi0NCi0jIEFkZCBEaWFsb2dzDQotYWRkSW1hZ2VEaWFsb2dfdGl0bGU9R3JhZmlrIGhpbnp1Zlx1MDBmY2dlbg0KLWFkZExpbmtEaWFsb2dfdGl0bGU9TGluayBoaW56dWZcdTAwZmNnZW4NCi1hZGRUYWJsZURpYWxvZ190aXRsZT1UYWJlbGxlIGhpbnp1Zlx1MDBmY2dlbg0KLWZpbmRSZXBsYWNlRGlhbG9nX3RpdGxlPVN1Y2hlbi9FcnNldHplbg0KLXVybExhYmVsX3RleHQ9VVJMOg0KLXN1bW1hcnlMYWJlbF90ZXh0PVp1c2FtbWVuZmFzc3VuZzoNCi1jYXB0aW9uTGFiZWxfdGV4dD1UaXRlbDoNCi1yb3dzTGFiZWxfdGV4dD1aZWlsZW46DQotY29sdW1uc0xhYmVsX3RleHQ9U3BhbHRlbjoNCi13aWR0aExhYmVsX3RleHQ9QnJlaXRlOg0KLXRhYmxlU3R5bGVMYWJlbF90ZXh0PVN0aWw6DQotdGFibGVIZWFkZXJOb25lX3RleHQ9VGFiZWxsZSBvaG5lIFx1MDBkY2JlcnNjaHJpZnRlbg0KLXRhYmxlSGVhZGVyQ29sc190ZXh0PVRhYmVsbGUgbWl0IFNwYWx0ZW5cdTAwZmNiZXJzY2hyaWZ0ZW4NCi10YWJsZUhlYWRlclJvd3NfdGV4dD1UYWJlbGxlIG1pdCBaZWlsZW5cdTAwZmNiZXJzY2hyaWZ0ZW4NCi10YWJsZUhlYWRlckJvdGhfdGV4dD1UYWJlbGxlIG1pdCBTcGFsdGVuLSB1bmQgWmVpbGVuXHUwMGZjYmVyc2NocmlmdGVuDQotYnJvd3NlQnV0dG9uX3RleHQ9RHVyY2hzdWNoZW4uLi4NCi0NCi0jIENsZWFyIEVkaXRvciBDb250ZW50IERpYWxvZw0KLWNsZWFyQ29udGVudERpYWxvZ190aXRsZT1MXHUwMGY2c2NoZW4gZGVzIEluaGFsdHMgaW0gRWRpdG9yIGJlc3RcdTAwZTR0aWdlbg0KLWNsZWFyQ29udGVudERpYWxvZ190ZXh0PU1cdTAwZjZjaHRlbiBTaWUgZGVuIEluaGFsdCBpbiBkaWVzZW0gUmljaCBUZXh0IEVkaXRvciB3aXJrbGljaCBsXHUwMGY2c2NoZW4/DQotDQotIyBGaW5kL1JlcGxhY2UgRGlhbG9nDQotZmluZExhYmVsX3RleHQ9U3VjaGVuOg0KLXJlcGxhY2VMYWJlbF90ZXh0PUVyc2V0emVuIGR1cmNoOg0KLW9wdGlvbnNHcm91cF90ZXh0PU9wdGlvbmVuDQotY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQ9R3JvXHUwMGRmLS9LbGVpbnNjaHJlaWJ1bmcgYmVhY2h0ZW4NCi13aG9sZVdvcmRDaGVja2JveF90ZXh0PUdhbnplcyBXb3J0DQotZGlyZWN0aW9uR3JvdXBfdGV4dD1SaWNodHVuZw0KLWZvcndhcmRSYWRpb0J1dHRvbl90ZXh0PVZvcg0KLWJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dD1adXJcdTAwZmNjaw0KLWZpbmRCdXR0b25fdGV4dD1TdWNoZW4NCi1yZXBsYWNlQnV0dG9uX3RleHQ9RXJzZXR6ZW4NCi1yZXBsYWNlRmluZEJ1dHRvbl90ZXh0PUVyc2V0emVuL1N1Y2hlbg0KLXJlcGxhY2VhbGxCdXR0b25fdGV4dD1BbGxlIGVyc2V0emVuDQotIyB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yDQotRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWw9WmVpY2hlbmZvbGdlIG5pY2h0IGdlZnVuZGVuDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0PU1heGltYWxlIEFuemFobCBaZWljaGVuIHBybyBaZWlsZToNCi1pbmRlbnRIVE1MQ2hlY2tib3hfdGV4dD1IVE1MLVRhZ3MgZWluclx1MDBmY2NrZW4NCi1pbmRlbnRTaXplTGFiZWxfdGV4dD1FaW5yXHUwMGZjY2t1bmdzZ3JcdTAwZjZcdTAwZGZlOg0KLXVybERpc3BsYXlOYW1lTGFiZWxfdGV4dD1VUkwtQW56ZWlnZW5hbWU6DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWRiYjc3MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZvbnQgU3R5bGUgTmFtZXMNCi1mb250U3R5bGVfbm9ybWFsPU5vcm1hbA0KLWZvbnRTdHlsZV9zZWN0aW9uSGVhZGluZz1DYWJlY2VyYSBkZSBsYSBzZWNjaVx1MDBmM24NCi1mb250U3R5bGVfc3Vic2VjdGlvbkhlYWRpbmc9Q2FiZWNlcmEgZGUgbGEgc3Vic2VjY2lcdTAwZjNuDQotZm9udFN0eWxlX3N1YlN1YnNlY3Rpb25IZWFkaW5nPUNhYmVjZXJhIGRlIGxhIHN1Yi1zdWJzZWNjaVx1MDBmM24NCi1mb250U3R5bGVfcXVvdGU9Q29taWxsYQ0KLWZvbnRTdHlsZV9jb2RlU2FtcGxlPUVqZW1wbG8gZGUgY1x1MDBmM2RpZ28NCi0NCi0jIEhUTUwgQmxvY2sgVGFncw0KLWJsb2NrVGFnX3BhcmFncmFwaD1QXHUwMGUxcnJhZm8NCi1ibG9ja1RhZ19oZWFkaW5nMT1DYWJlY2VyYSAxDQotYmxvY2tUYWdfaGVhZGluZzI9Q2FiZWNlcmEgMg0KLWJsb2NrVGFnX2hlYWRpbmczPUNhYmVjZXJhIDMNCi1ibG9ja1RhZ19oZWFkaW5nND1DYWJlY2VyYSA0DQotYmxvY2tUYWdfaGVhZGluZzU9Q2FiZWNlcmEgNQ0KLWJsb2NrVGFnX2hlYWRpbmc2PUNhYmVjZXJhIDYNCi1ibG9ja1RhZ19hZGRyZXNzPURpcmVjY2lcdTAwZjNuDQotYmxvY2tUYWdfcHJlZm9ybWF0dGVkVGV4dD1UZXh0byBwcmVmb3JtYXRlYWRvDQotDQotIyBIVE1MIEZvbnQgTmFtZXMNCi1mb250TmFtZV9kZWZhdWx0PVBvciBvbWlzaVx1MDBmM24NCi1mb250TmFtZV9hcmlhbD1BcmlhbA0KLWZvbnROYW1lX2NvdXJpZXJOZXc9Q291cmllciBOZXcNCi1mb250TmFtZV90aW1lc05ld1JvbWFuPVRpbWVzIE5ldyBSb21hbg0KLWZvbnROYW1lX3ZlcmRhbmE9VmVyZGFuYQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBUb29sIEJ1dHRvbnMNCi1hZGRIb3Jpem9udGFsQmFyQWN0aW9uX3Rvb2xUaXBUZXh0PUFcdTAwZjFhZGlyIGJhcnJhIGhvcml6b250YWwNCi1hZGRJbWFnZUFjdGlvbl90b29sVGlwVGV4dD1BXHUwMGYxYWRpciBpbWFnZW4NCi1hZGRMaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PUFcdTAwZjFhZGlyIGxcdTAwZWRuZWENCi1hZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0PUFcdTAwZjFhZGlyIGVubGFjZQ0KLWFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PUFcdTAwZjFhZGlyIGxpc3RhIG9yZGVuYWRhDQotYWRkVGFibGVBY3Rpb25fdG9vbFRpcFRleHQ9QVx1MDBmMWFkaXIgdGFibGENCi1hZGRVbm9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PUFcdTAwZjFhZGlyIGxpc3RhIGRlc29yZGVuYWRhDQotYm9sZEFjdGlvbl90b29sVGlwVGV4dD1OZWdyaXRhDQotY2xlYXJDb250ZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUJvcnJhciBjb250ZW5pZG8NCi1jb3B5QWN0aW9uX3Rvb2xUaXBUZXh0PUNvcGlhcg0KLWN1dEFjdGlvbl90b29sVGlwVGV4dD1Db3J0YXINCi1maW5kUmVwbGFjZUFjdGlvbl90b29sVGlwVGV4dD1CdXNjYXIvUmVlbXBsYXphcg0KLWluZGVudEFjdGlvbl90b29sVGlwVGV4dD1TYW5ncmFyDQotaXRhbGljQWN0aW9uX3Rvb2xUaXBUZXh0PUN1cnNpdmENCi1qdXN0aWZ5Q2VudGVyQWN0aW9uX3Rvb2xUaXBUZXh0PUNlbnRyYXINCi1qdXN0aWZ5RnVsbEFjdGlvbl90b29sVGlwVGV4dD1KdXN0aWZpY2FyDQotanVzdGlmeUxlZnRBY3Rpb25fdG9vbFRpcFRleHQ9QWxpbmVhciBhIGxhIGl6cXVpZXJkYQ0KLWp1c3RpZnlSaWdodEFjdGlvbl90b29sVGlwVGV4dD1BbGluZWFyIGEgbGEgZGVyZWNoYQ0KLW91dGRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9RWxpbWluYXIgc2FuZ3JcdTAwZWRhDQotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9UGVnYXINCi1zdWJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9U3ViXHUwMGVkbmRpY2UNCi1zdXBlcnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1TdXBlclx1MDBlZG5kaWNlDQotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVN1YnJheWFkbw0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb21ib2JveGVzDQotZm9udFN0eWxlQWN0aW9uX3Rvb2xUaXBUZXh0PUVzdGFibGVjZXIgZXN0aWxvIGRlIGZvbnQNCi1ibG9ja1RhZ0FjdGlvbl90b29sVGlwVGV4dD1Fc3RhYmxlY2VyIGV0aXF1ZXRhIGRlIGJsb3F1ZQ0KLWZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0PUVzdGFibGVjZXIgbm9tYnJlIGRlIGZvbnQNCi1mb250U2l6ZUFjdGlvbl90b29sVGlwVGV4dD1Fc3RhYmxlY2VyIHRhbWFcdTAwZjFvIGRlIGZvbnQNCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgQ29udGV4dCBNZW51IEl0ZW1zDQotY3V0QWN0aW9uX3RleHQ9Q29ydGFyDQotY29weUFjdGlvbl90ZXh0PUNvcGlhcg0KLXBhc3RlQWN0aW9uX3RleHQ9UGVnYXINCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgVGFicw0KLXJpY2hUZXh0VGFiX3RleHQ9VGV4dG8gZW5yaXF1ZWNpZG8NCi1yaWNoVGV4dFRhYl90b29sVGlwVGV4dD1FZGl0YXIgZWwgY29udGVuaWRvIGVuIHRleHRvIGVucmlxdWVjaWRvDQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PUVkaXRhciBlbCBjb250ZW5pZG8gZW4gSFRNTA0KLQ0KLSMgQWRkIERpYWxvZ3MNCi1hZGRJbWFnZURpYWxvZ190aXRsZT1BXHUwMGYxYWRpciBpbWFnZW4NCi1hZGRMaW5rRGlhbG9nX3RpdGxlPUFcdTAwZjFhZGlyIGVubGFjZQ0KLWFkZFRhYmxlRGlhbG9nX3RpdGxlPUFcdTAwZjFhZGlyIHRhYmxhDQotZmluZFJlcGxhY2VEaWFsb2dfdGl0bGU9QnVzY2FyL1JlZW1wbGF6YXINCi11cmxMYWJlbF90ZXh0PVVSTDoNCi1zdW1tYXJ5TGFiZWxfdGV4dD1SZXN1bWVuOg0KLWNhcHRpb25MYWJlbF90ZXh0PVRcdTAwZWR0dWxvOg0KLXJvd3NMYWJlbF90ZXh0PUZpbGFzOg0KLWNvbHVtbnNMYWJlbF90ZXh0PUNvbHVtbmFzOg0KLXdpZHRoTGFiZWxfdGV4dD1BbmNobzoNCi10YWJsZVN0eWxlTGFiZWxfdGV4dD1Fc3RpbG86DQotdGFibGVIZWFkZXJOb25lX3RleHQ9VGFibGEgc2luIGNhYmVjZXJhcw0KLXRhYmxlSGVhZGVyQ29sc190ZXh0PVRhYmxhIGNvbiBjYWJlY2VyYXMgZGUgY29sdW1uYQ0KLXRhYmxlSGVhZGVyUm93c190ZXh0PVRhYmxhIGNvbiBjYWJlY2VyYSBkZSBmaWxhDQotdGFibGVIZWFkZXJCb3RoX3RleHQ9VGFibGEgY29uIGNhYmVjZXJhcyBkZSBjb2x1bW5hIHkgZGUgZmlsYQ0KLWJyb3dzZUJ1dHRvbl90ZXh0PUV4YW1pbmFyLi4uDQotDQotIyBDbGVhciBFZGl0b3IgQ29udGVudCBEaWFsb2cNCi1jbGVhckNvbnRlbnREaWFsb2dfdGl0bGU9Q29uZmlybWFjaVx1MDBmM24gZGUgQm9ycmFyIGNvbnRlbmlkbyBkZWwgZWRpdG9yDQotY2xlYXJDb250ZW50RGlhbG9nX3RleHQ9XHUwMGJmRXN0XHUwMGUxIHNlZ3VybyBkZSBxdWUgZGVzZWEgYm9ycmFyIGVsIGNvbnRlbmlkbyBkZSBlc3RlIGVkaXRvciBkZSB0ZXh0byBlbnJpcXVlY2lkbz8NCi0NCi0jIEZpbmQvUmVwbGFjZSBEaWFsb2cNCi1maW5kTGFiZWxfdGV4dD1CdXNjYXI6DQotcmVwbGFjZUxhYmVsX3RleHQ9UmVlbXBsYXphciBjb246DQotb3B0aW9uc0dyb3VwX3RleHQ9T3BjaW9uZXMNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1TZW5zaWJsZSBhIG1heVx1MDBmYXNjdWxhcyB5IG1pblx1MDBmYXNjdWxhcw0KLXdob2xlV29yZENoZWNrYm94X3RleHQ9UGFsYWJyYSBjb21wbGV0YQ0KLWRpcmVjdGlvbkdyb3VwX3RleHQ9RGlyZWNjaVx1MDBmM24NCi1mb3J3YXJkUmFkaW9CdXR0b25fdGV4dD1IYWNpYSBkZWxhbnRlDQotYmFja3dhcmRSYWRpb0J1dHRvbl90ZXh0PUhhY2lhIGF0clx1MDBlMXMNCi1maW5kQnV0dG9uX3RleHQ9QnVzY2FyDQotcmVwbGFjZUJ1dHRvbl90ZXh0PVJlZW1wbGF6YXINCi1yZXBsYWNlRmluZEJ1dHRvbl90ZXh0PVJlZW1wbGF6YXIvQnVzY2FyDQotcmVwbGFjZWFsbEJ1dHRvbl90ZXh0PVJlZW1wbGF6YXIgdG9kb3MNCi0jIHRha2VuIGZyb20gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3INCi1GaW5kUmVwbGFjZV9TdGF0dXNfbm9NYXRjaF9sYWJlbD1TZXJpZSBubyBlbmNvbnRyYWRhDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0PU1cdTAwZTF4aW1vIGRlIGNhcmFjdGVyZXMgcG9yIGxcdTAwZWRuZWE6DQotaW5kZW50SFRNTENoZWNrYm94X3RleHQ9U2FuZ3JhciBldGlxdWV0YXMgSFRNTA0KLWluZGVudFNpemVMYWJlbF90ZXh0PVRhbWFcdTAwZjFvIGRlIHNhbmdyXHUwMGVkYToNCi11cmxEaXNwbGF5TmFtZUxhYmVsX3RleHQ9Tm9tYnJlIGRlIHZpc3VhbGl6YWNpXHUwMGYzbiBkZSBVUkw6DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWZiOTY1MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZvbnQgU3R5bGUgTmFtZXMNCi1mb250U3R5bGVfbm9ybWFsPU5vcm1hbA0KLWZvbnRTdHlsZV9zZWN0aW9uSGVhZGluZz1Fbi10XHUwMGVhdGUgZGUgc2VjdGlvbg0KLWZvbnRTdHlsZV9zdWJzZWN0aW9uSGVhZGluZz1Fbi10XHUwMGVhdGUgZGUgc291cy1zZWN0aW9uDQotZm9udFN0eWxlX3N1YlN1YnNlY3Rpb25IZWFkaW5nPUVuLXRcdTAwZWF0ZSBkZSBzb3VzLXNvdXMtc2VjdGlvbg0KLWZvbnRTdHlsZV9xdW90ZT1EXHUwMGU5Y2xhcmF0aW9uDQotZm9udFN0eWxlX2NvZGVTYW1wbGU9RWNoYW50aWxsb24gZGUgY29kZQ0KLQ0KLSMgSFRNTCBCbG9jayBUYWdzDQotYmxvY2tUYWdfcGFyYWdyYXBoPVBhcmFncmFwaGUNCi1ibG9ja1RhZ19oZWFkaW5nMT1Fbi10XHUwMGVhdGUgMQ0KLWJsb2NrVGFnX2hlYWRpbmcyPUVuLXRcdTAwZWF0ZSAyDQotYmxvY2tUYWdfaGVhZGluZzM9RW4tdFx1MDBlYXRlIDMNCi1ibG9ja1RhZ19oZWFkaW5nND1Fbi10XHUwMGVhdGUgNA0KLWJsb2NrVGFnX2hlYWRpbmc1PUVuLXRcdTAwZWF0ZSA1DQotYmxvY2tUYWdfaGVhZGluZzY9RW4tdFx1MDBlYXRlIDYNCi1ibG9ja1RhZ19hZGRyZXNzPUFkcmVzc2UNCi1ibG9ja1RhZ19wcmVmb3JtYXR0ZWRUZXh0PVRleHRlIHByXHUwMGU5Zm9ybWF0XHUwMGU5DQotDQotIyBIVE1MIEZvbnQgTmFtZXMNCi1mb250TmFtZV9kZWZhdWx0PVBhciBkXHUwMGU5ZmF1dA0KLWZvbnROYW1lX2FyaWFsPUFyaWFsDQotZm9udE5hbWVfY291cmllck5ldz1Db3VyaWVyIE5ldw0KLWZvbnROYW1lX3RpbWVzTmV3Um9tYW49VGltZXMgTmV3IFJvbWFuDQotZm9udE5hbWVfdmVyZGFuYT1WZXJkYW5hDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIFRvb2wgQnV0dG9ucw0KLWFkZEhvcml6b250YWxCYXJBY3Rpb25fdG9vbFRpcFRleHQ9QWpvdXRlciB1bmUgYmFycmUgaG9yaXpvbnRhbGUNCi1hZGRJbWFnZUFjdGlvbl90b29sVGlwVGV4dD1Bam91dGVyIHVuZSBpbWFnZQ0KLWFkZExpbmVBY3Rpb25fdG9vbFRpcFRleHQ9QWpvdXRlciB1bmUgbGlnbmUNCi1hZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0PUFqb3V0ZXIgdW4gbGllbg0KLWFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PUFqb3V0ZXIgdW5lIGxpc3RlIG51bVx1MDBlOXJvdFx1MDBlOWUNCi1hZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dD1Bam91dGVyIHVuZSB0YWJsZQ0KLWFkZFVub3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ9QWpvdXRlciB1bmUgbGlzdGUgbm9uIG51bVx1MDBlOXJvdFx1MDBlOWUNCi1ib2xkQWN0aW9uX3Rvb2xUaXBUZXh0PUdyYXMNCi1jbGVhckNvbnRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9RWZmYWNlciBsZSBjb250ZW51DQotY29weUFjdGlvbl90b29sVGlwVGV4dD1Db3BpZXINCi1jdXRBY3Rpb25fdG9vbFRpcFRleHQ9Q291cGVyDQotZmluZFJlcGxhY2VBY3Rpb25fdG9vbFRpcFRleHQ9UmVjaGVyY2hlci9SZW1wbGFjZXINCi1pbmRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9UmV0cmFpdCBkZSBsaWduZQ0KLWl0YWxpY0FjdGlvbl90b29sVGlwVGV4dD1JdGFsaXF1ZQ0KLWp1c3RpZnlDZW50ZXJBY3Rpb25fdG9vbFRpcFRleHQ9Q2VudHJlcg0KLWp1c3RpZnlGdWxsQWN0aW9uX3Rvb2xUaXBUZXh0PUp1c3RpZmllcg0KLWp1c3RpZnlMZWZ0QWN0aW9uX3Rvb2xUaXBUZXh0PUFsaWduZXIgXHUwMGUwIGdhdWNoZQ0KLWp1c3RpZnlSaWdodEFjdGlvbl90b29sVGlwVGV4dD1BbGlnbmVyIFx1MDBlMCBkcm9pdGUNCi1vdXRkZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUluc1x1MDBlOXJlciB1biByZXRyYWl0DQotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9Q29sbGVyDQotc3Vic2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PUluZGljZQ0KLXN1cGVyc2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PUV4cG9zYW50DQotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVNvdWxpZ25lbWVudA0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb21ib2JveGVzDQotZm9udFN0eWxlQWN0aW9uX3Rvb2xUaXBUZXh0PURcdTAwZTlmaW5pciBsZSBzdHlsZSBkZSBwb2xpY2UNCi1ibG9ja1RhZ0FjdGlvbl90b29sVGlwVGV4dD1EXHUwMGU5ZmluaXIgbGEgYmFsaXNlIGRlIGJsb2MNCi1mb250TmFtZUFjdGlvbl90b29sVGlwVGV4dD1EXHUwMGU5ZmluaXIgbGUgbm9tIGRlIGxhIHBvbGljZQ0KLWZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0PURcdTAwZTlmaW5pciBsYSB0YWlsbGUgZGUgbGEgcG9saWNlDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIENvbnRleHQgTWVudSBJdGVtcw0KLWN1dEFjdGlvbl90ZXh0PUNvdXBlcg0KLWNvcHlBY3Rpb25fdGV4dD1Db3BpZXINCi1wYXN0ZUFjdGlvbl90ZXh0PUNvbGxlcg0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBUYWJzDQotcmljaFRleHRUYWJfdGV4dD1UZXh0ZSBlbnJpY2hpDQotcmljaFRleHRUYWJfdG9vbFRpcFRleHQ9TW9kaWZpZXIgbGUgY29udGVudSBlbiB0ZXh0ZSBlbnJpY2hpDQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PU1vZGlmaWVyIGxlIGNvbnRlbnUgZW4gSFRNTA0KLQ0KLSMgQWRkIERpYWxvZ3MNCi1hZGRJbWFnZURpYWxvZ190aXRsZT1Bam91dGVyIHVuZSBpbWFnZQ0KLWFkZExpbmtEaWFsb2dfdGl0bGU9QWpvdXRlciB1biBsaWVuDQotYWRkVGFibGVEaWFsb2dfdGl0bGU9QWpvdXRlciB1bmUgdGFibGUNCi1maW5kUmVwbGFjZURpYWxvZ190aXRsZT1SZWNoZXJjaGVyL1JlbXBsYWNlcg0KLXVybExhYmVsX3RleHQ9VVJMIDoNCi1zdW1tYXJ5TGFiZWxfdGV4dD1SXHUwMGU5Y2FwaXR1bGF0aWYgOg0KLWNhcHRpb25MYWJlbF90ZXh0PUxcdTAwZTlnZW5kZSA6DQotcm93c0xhYmVsX3RleHQ9TGlnbmVzIDoNCi1jb2x1bW5zTGFiZWxfdGV4dD1Db2xvbm5lcyA6DQotd2lkdGhMYWJlbF90ZXh0PUxhcmdldXIgOg0KLXRhYmxlU3R5bGVMYWJlbF90ZXh0PVN0eWxlIDoNCi10YWJsZUhlYWRlck5vbmVfdGV4dD1UYWJsZSBkXHUwMGU5cG91cnZ1ZSBkJ2VuLXRcdTAwZWF0ZQ0KLXRhYmxlSGVhZGVyQ29sc190ZXh0PVRhYmxlIGRvdFx1MDBlOWUgZCdlbi10XHUwMGVhdGVzIGRlIGNvbG9ubmUNCi10YWJsZUhlYWRlclJvd3NfdGV4dD1UYWJsZSBkb3RcdTAwZTllIGQnZW4tdFx1MDBlYXRlcyBkZSBsaWduZQ0KLXRhYmxlSGVhZGVyQm90aF90ZXh0PVRhYmxlIGRvdFx1MDBlOWUgZCdlbi10XHUwMGVhdGVzIGRlIGNvbG9ubmUgZXQgZGUgbGlnbmUNCi1icm93c2VCdXR0b25fdGV4dD1QYXJjb3VyaXIuLi4NCi0NCi0jIENsZWFyIEVkaXRvciBDb250ZW50IERpYWxvZw0KLWNsZWFyQ29udGVudERpYWxvZ190aXRsZT1Db25maXJtYXRpb24gZGUgbCdlZmZhY2VtZW50IGR1IGNvbnRlbnUgZGUgbCdcdTAwZTlkaXRldXINCi1jbGVhckNvbnRlbnREaWFsb2dfdGV4dD1Wb3VsZXotdm91cyB2cmFpbWVudCBlZmZhY2VyIGxlIGNvbnRlbnUgZGUgY2V0IFx1MDBlOWRpdGV1ciBkZSB0ZXh0ZSBlbnJpY2hpID8NCi0NCi0jIEZpbmQvUmVwbGFjZSBEaWFsb2cNCi1maW5kTGFiZWxfdGV4dD1SZWNoZXJjaGVyIDoNCi1yZXBsYWNlTGFiZWxfdGV4dD1SZW1wbGFjZXIgcGFyIDoNCi1vcHRpb25zR3JvdXBfdGV4dD1PcHRpb25zDQotY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQ9UmVzcGVjdGVyIGxhIGNhc3NlDQotd2hvbGVXb3JkQ2hlY2tib3hfdGV4dD1Nb3QgZW50aWVyDQotZGlyZWN0aW9uR3JvdXBfdGV4dD1TZW5zDQotZm9yd2FyZFJhZGlvQnV0dG9uX3RleHQ9U3VpdmFudA0KLWJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dD1Qclx1MDBlOWNcdTAwZTlkZW50DQotZmluZEJ1dHRvbl90ZXh0PVJlY2hlcmNoZXINCi1yZXBsYWNlQnV0dG9uX3RleHQ9UmVtcGxhY2VyDQotcmVwbGFjZUZpbmRCdXR0b25fdGV4dD1SZW1wbGFjZXIvUmVjaGVyY2hlcg0KLXJlcGxhY2VhbGxCdXR0b25fdGV4dD1SZW1wbGFjZXIgdG91dA0KLSMgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcg0KLUZpbmRSZXBsYWNlX1N0YXR1c19ub01hdGNoX2xhYmVsPUNoYVx1MDBlZW5lIGludHJvdXZhYmxlDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0PU5vbWJyZSBtYXhpbWFsIGRlIGNhcmFjdFx1MDBlOHJlcyBwYXIgbGlnbmUgOg0KLWluZGVudEhUTUxDaGVja2JveF90ZXh0PU1ldHRyZSBsZXMgYmFsaXNlcyBIVE1MIGVuIHJldHJhaXQNCi1pbmRlbnRTaXplTGFiZWxfdGV4dD1UYWlsbGUgZHUgcmV0cmFpdCA6DQotdXJsRGlzcGxheU5hbWVMYWJlbF90ZXh0PU5vbSBhZmZpY2hcdTAwZTkgZGUgbCdVUkwgOg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2ZTUxMTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb250IFN0eWxlIE5hbWVzDQotZm9udFN0eWxlX25vcm1hbD1Ob3JtYWxlDQotZm9udFN0eWxlX3NlY3Rpb25IZWFkaW5nPUludGVzdGF6aW9uZSBkaSBzZXppb25lDQotZm9udFN0eWxlX3N1YnNlY3Rpb25IZWFkaW5nPUludGVzdGF6aW9uZSBkaSBzb3R0b3NlemlvbmUNCi1mb250U3R5bGVfc3ViU3Vic2VjdGlvbkhlYWRpbmc9SW50ZXN0YXppb25lIGRpIHNvdHRvc2V6aW9uZSBzZWNvbmRhcmlhDQotZm9udFN0eWxlX3F1b3RlPUNpdGF6aW9uZQ0KLWZvbnRTdHlsZV9jb2RlU2FtcGxlPUVzZW1waW8gZGkgY29kaWNlDQotDQotIyBIVE1MIEJsb2NrIFRhZ3MNCi1ibG9ja1RhZ19wYXJhZ3JhcGg9UGFyYWdyYWZvDQotYmxvY2tUYWdfaGVhZGluZzE9SW50ZXN0YXppb25lIDENCi1ibG9ja1RhZ19oZWFkaW5nMj1JbnRlc3RhemlvbmUgMg0KLWJsb2NrVGFnX2hlYWRpbmczPUludGVzdGF6aW9uZSAzDQotYmxvY2tUYWdfaGVhZGluZzQ9SW50ZXN0YXppb25lIDQNCi1ibG9ja1RhZ19oZWFkaW5nNT1JbnRlc3RhemlvbmUgNQ0KLWJsb2NrVGFnX2hlYWRpbmc2PUludGVzdGF6aW9uZSA2DQotYmxvY2tUYWdfYWRkcmVzcz1JbmRpcml6em8NCi1ibG9ja1RhZ19wcmVmb3JtYXR0ZWRUZXh0PVRlc3RvIHByZWZvcm1hdHRhdG8NCi0NCi0jIEhUTUwgRm9udCBOYW1lcw0KLWZvbnROYW1lX2RlZmF1bHQ9UHJlZGVmaW5pdG8NCi1mb250TmFtZV9hcmlhbD1BcmlhbA0KLWZvbnROYW1lX2NvdXJpZXJOZXc9Q291cmllciBOZXcNCi1mb250TmFtZV90aW1lc05ld1JvbWFuPVRpbWVzIE5ldyBSb21hbg0KLWZvbnROYW1lX3ZlcmRhbmE9VmVyZGFuYQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBUb29sIEJ1dHRvbnMNCi1hZGRIb3Jpem9udGFsQmFyQWN0aW9uX3Rvb2xUaXBUZXh0PUFnZ2l1bmdpIGJhcnJhIG9yaXp6b250YWxlDQotYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQ9QWdnaXVuZ2kgaW1tYWdpbmUNCi1hZGRMaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PUFnZ2l1bmdpIHJpZ2ENCi1hZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0PUFnZ2l1bmdpIGNvbGxlZ2FtZW50bw0KLWFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PUFnZ2l1bmdpIGVsZW5jbyBvcmRpbmF0bw0KLWFkZFRhYmxlQWN0aW9uX3Rvb2xUaXBUZXh0PUFnZ2l1bmdpIHRhYmVsbGENCi1hZGRVbm9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PUFnZ2l1bmdpIGVsZW5jbyBub24gb3JkaW5hdG8NCi1ib2xkQWN0aW9uX3Rvb2xUaXBUZXh0PUdyYXNzZXR0bw0KLWNsZWFyQ29udGVudEFjdGlvbl90b29sVGlwVGV4dD1DYW5jZWxsYSBpbCBjb250ZW51dG8NCi1jb3B5QWN0aW9uX3Rvb2xUaXBUZXh0PUNvcGlhDQotY3V0QWN0aW9uX3Rvb2xUaXBUZXh0PVRhZ2xpYQ0KLWZpbmRSZXBsYWNlQWN0aW9uX3Rvb2xUaXBUZXh0PVRyb3ZhL1Nvc3RpdHVpc2NpDQotaW5kZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUltcG9zdGEgcmllbnRybw0KLWl0YWxpY0FjdGlvbl90b29sVGlwVGV4dD1Db3JzaXZvDQotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1DZW50cmENCi1qdXN0aWZ5RnVsbEFjdGlvbl90b29sVGlwVGV4dD1HaXVzdGlmaWNhdG8NCi1qdXN0aWZ5TGVmdEFjdGlvbl90b29sVGlwVGV4dD1BbGxpbmVhIGEgc2luaXN0cmENCi1qdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQ9QWxsaW5lYSBhIGRlc3RyYQ0KLW91dGRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9QW5udWxsYSByaWVudHJvDQotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9SW5jb2xsYQ0KLXN1YnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1QZWRpY2UNCi1zdXBlcnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1BcGljZQ0KLXVuZGVybGluZUFjdGlvbl90b29sVGlwVGV4dD1Tb3R0b2xpbmVhdG8NCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgQ29tYm9ib3hlcw0KLWZvbnRTdHlsZUFjdGlvbl90b29sVGlwVGV4dD1JbXBvc3RhIHN0aWxlIGNhcmF0dGVyZQ0KLWJsb2NrVGFnQWN0aW9uX3Rvb2xUaXBUZXh0PUltcG9zdGEgdGFnIGRpIGJsb2Njbw0KLWZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0PUltcG9zdGEgdGlwbyBjYXJhdHRlcmUNCi1mb250U2l6ZUFjdGlvbl90b29sVGlwVGV4dD1JbXBvc3RhemlvbmkgZGltZW5zaW9uaSBjYXJhdHRlcmUNCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgQ29udGV4dCBNZW51IEl0ZW1zDQotY3V0QWN0aW9uX3RleHQ9VGFnbGlhDQotY29weUFjdGlvbl90ZXh0PUNvcGlhDQotcGFzdGVBY3Rpb25fdGV4dD1JbmNvbGxhDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIFRhYnMNCi1yaWNoVGV4dFRhYl90ZXh0PVJpY2ggVGV4dA0KLXJpY2hUZXh0VGFiX3Rvb2xUaXBUZXh0PU1vZGlmaWNhIGNvbnRlbnV0byBpbiByaWNoIHRleHQNCi1odG1sVGFiX3RleHQ9SFRNTA0KLWh0bWxUYWJfdG9vbFRpcFRleHQ9TW9kaWZpY2EgY29udGVudXRvIGluIEhUTUwNCi0NCi0jIEFkZCBEaWFsb2dzDQotYWRkSW1hZ2VEaWFsb2dfdGl0bGU9QWdnaXVuZ2kgaW1tYWdpbmUNCi1hZGRMaW5rRGlhbG9nX3RpdGxlPUFnZ2l1bmdpIGNvbGxlZ2FtZW50bw0KLWFkZFRhYmxlRGlhbG9nX3RpdGxlPUFnZ2l1bmdpIHRhYmVsbGENCi1maW5kUmVwbGFjZURpYWxvZ190aXRsZT1Ucm92YS9Tb3N0aXR1aXNjaQ0KLXVybExhYmVsX3RleHQ9VVJMOg0KLXN1bW1hcnlMYWJlbF90ZXh0PVJpZXBpbG9nbzoNCi1jYXB0aW9uTGFiZWxfdGV4dD1EaWRhc2NhbGlhOg0KLXJvd3NMYWJlbF90ZXh0PVJpZ2hlOg0KLWNvbHVtbnNMYWJlbF90ZXh0PUNvbG9ubmU6DQotd2lkdGhMYWJlbF90ZXh0PUxhcmdoZXp6YToNCi10YWJsZVN0eWxlTGFiZWxfdGV4dD1TdGlsZToNCi10YWJsZUhlYWRlck5vbmVfdGV4dD1UYWJlbGxhIHNlbnphIGludGVzdGF6aW9uaQ0KLXRhYmxlSGVhZGVyQ29sc190ZXh0PVRhYmVsbGEgY29uIGludGVzdGF6aW9uaSBkaSBjb2xvbm5hDQotdGFibGVIZWFkZXJSb3dzX3RleHQ9VGFiZWxsYSBjb24gaW50ZXN0YXppb25pIGRpIHJpZ2ENCi10YWJsZUhlYWRlckJvdGhfdGV4dD1UYWJlbGxhIGNvbiBpbnRlc3RhemlvbmkgZGkgY29sb25uYSBlIGRpIHJpZ2ENCi1icm93c2VCdXR0b25fdGV4dD1TZm9nbGlhLi4uDQotDQotIyBDbGVhciBFZGl0b3IgQ29udGVudCBEaWFsb2cNCi1jbGVhckNvbnRlbnREaWFsb2dfdGl0bGU9Q29uZmVybWEgY2FuY2VsbGF6aW9uZSBjb250ZW51dG8gZWRpdG9yDQotY2xlYXJDb250ZW50RGlhbG9nX3RleHQ9Q2FuY2VsbGFyZSBpbCBjb250ZW51dG8gZGkgcXVlc3RvIGVkaXRvciByaWNoIHRleHQ/DQotDQotIyBGaW5kL1JlcGxhY2UgRGlhbG9nDQotZmluZExhYmVsX3RleHQ9VHJvdmE6DQotcmVwbGFjZUxhYmVsX3RleHQ9U29zdGl0dWlzY2kgY29uOg0KLW9wdGlvbnNHcm91cF90ZXh0PU9wemlvbmkNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1NYWl1c2NvbGUvTWludXNjb2xlDQotd2hvbGVXb3JkQ2hlY2tib3hfdGV4dD1QYXJvbGEgaW50ZXJhDQotZGlyZWN0aW9uR3JvdXBfdGV4dD1EaXJlemlvbmUNCi1mb3J3YXJkUmFkaW9CdXR0b25fdGV4dD1JbiBhdmFudGkNCi1iYWNrd2FyZFJhZGlvQnV0dG9uX3RleHQ9SW5kaWV0cm8NCi1maW5kQnV0dG9uX3RleHQ9VHJvdmENCi1yZXBsYWNlQnV0dG9uX3RleHQ9U29zdGl0dWlzY2kNCi1yZXBsYWNlRmluZEJ1dHRvbl90ZXh0PVNvc3RpdHVpc2NpL1Ryb3ZhDQotcmVwbGFjZWFsbEJ1dHRvbl90ZXh0PVNvc3RpdHVpc2NpIHR1dHRvDQotIyB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yDQotRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWw9U3RyaW5nYSBub24gdHJvdmF0YQ0KLQ0KLSMgUHJlZmVyZW5jZSBQYWdlDQotbWF4Q2hhcnNQZXJMaW5lTGFiZWxfdGV4dD1OdW1lcm8gbWFzc2ltbyBkaSBjYXJhdHRlcmkgcGVyIHJpZ2E6DQotaW5kZW50SFRNTENoZWNrYm94X3RleHQ9VGFnIEhUTUwgaW5kZW50DQotaW5kZW50U2l6ZUxhYmVsX3RleHQ9RGltZW5zaW9uaSByaWVudHJvOg0KLXVybERpc3BsYXlOYW1lTGFiZWxfdGV4dD1Ob21lIHZpc3VhbGl6emF6aW9uZSBVUkw6DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTAwNDI5OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZvbnQgU3R5bGUgTmFtZXMNCi1mb250U3R5bGVfbm9ybWFsPVx1OTAxYVx1NWUzOA0KLWZvbnRTdHlsZV9zZWN0aW9uSGVhZGluZz1cdTMwYmJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTg5OGJcdTUxZmFcdTMwNTcNCi1mb250U3R5bGVfc3Vic2VjdGlvbkhlYWRpbmc9XHUzMGI1XHUzMGQ2XHUzMGJiXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHU4OThiXHU1MWZhXHUzMDU3DQotZm9udFN0eWxlX3N1YlN1YnNlY3Rpb25IZWFkaW5nPVx1MzBiNVx1MzBkNlx1MzBmYlx1MzBiNVx1MzBkNlx1MzBiYlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1ODk4Ylx1NTFmYVx1MzA1Nw0KLWZvbnRTdHlsZV9xdW90ZT1cdTVmMTVcdTc1MjgNCi1mb250U3R5bGVfY29kZVNhbXBsZT1cdTMwYjNcdTMwZmNcdTMwYzlcdTMwZmJcdTMwYjVcdTMwZjNcdTMwZDdcdTMwZWINCi0NCi0jIEhUTUwgQmxvY2sgVGFncw0KLWJsb2NrVGFnX3BhcmFncmFwaD1cdTZiYjVcdTg0M2QNCi1ibG9ja1RhZ19oZWFkaW5nMT1cdTg5OGJcdTUxZmFcdTMwNTcgMQ0KLWJsb2NrVGFnX2hlYWRpbmcyPVx1ODk4Ylx1NTFmYVx1MzA1NyAyDQotYmxvY2tUYWdfaGVhZGluZzM9XHU4OThiXHU1MWZhXHUzMDU3IDMNCi1ibG9ja1RhZ19oZWFkaW5nND1cdTg5OGJcdTUxZmFcdTMwNTcgNA0KLWJsb2NrVGFnX2hlYWRpbmc1PVx1ODk4Ylx1NTFmYVx1MzA1NyA1DQotYmxvY2tUYWdfaGVhZGluZzY9XHU4OThiXHU1MWZhXHUzMDU3IDYNCi1ibG9ja1RhZ19hZGRyZXNzPVx1MzBhMlx1MzBjOVx1MzBlY1x1MzBiOQ0KLWJsb2NrVGFnX3ByZWZvcm1hdHRlZFRleHQ9XHU0ZThiXHU1MjRkXHU2NmY4XHU1ZjBmXHU4YTJkXHU1YjlhXHU2ZTA4XHUzMDdmXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4DQotDQotIyBIVE1MIEZvbnQgTmFtZXMNCi1mb250TmFtZV9kZWZhdWx0PVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOA0KLWZvbnROYW1lX2FyaWFsPUFyaWFsDQotZm9udE5hbWVfY291cmllck5ldz1Db3VyaWVyIE5ldw0KLWZvbnROYW1lX3RpbWVzTmV3Um9tYW49VGltZXMgTmV3IFJvbWFuDQotZm9udE5hbWVfdmVyZGFuYT1WZXJkYW5hDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIFRvb2wgQnV0dG9ucw0KLWFkZEhvcml6b250YWxCYXJBY3Rpb25fdG9vbFRpcFRleHQ9XHU2YzM0XHU1ZTczXHUzMGQwXHUzMGZjXHUzMDZlXHU4ZmZkXHU1MmEwDQotYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQ9XHU3NTNiXHU1MGNmXHUzMDZlXHU4ZmZkXHU1MmEwDQotYWRkTGluZUFjdGlvbl90b29sVGlwVGV4dD1cdTg4NGNcdTMwNmVcdThmZmRcdTUyYTANCi1hZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MzBlYVx1MzBmM1x1MzBhZlx1MzA2ZVx1OGZmZFx1NTJhMA0KLWFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NzU2YVx1NTNmN1x1NGVkOFx1MzA0ZFx1MzBlYVx1MzBiOVx1MzBjOFx1MzA2ZVx1OGZmZFx1NTJhMA0KLWFkZFRhYmxlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1ODg2OFx1MzA2ZVx1OGZmZFx1NTJhMA0KLWFkZFVub3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ9XHU3NTZhXHU1M2Y3XHUzMDZhXHUzMDU3XHUzMGVhXHUzMGI5XHUzMGM4XHUzMDZlXHU4ZmZkXHU1MmEwDQotYm9sZEFjdGlvbl90b29sVGlwVGV4dD1cdTU5MmFcdTViNTcNCi1jbGVhckNvbnRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXHUzMGFmXHUzMGVhXHUzMGEyDQotY29weUFjdGlvbl90b29sVGlwVGV4dD1cdTMwYjNcdTMwZDRcdTMwZmMNCi1jdXRBY3Rpb25fdG9vbFRpcFRleHQ9XHU1MjA3XHUzMDhhXHU1M2Q2XHUzMDhhDQotZmluZFJlcGxhY2VBY3Rpb25fdG9vbFRpcFRleHQ9XHU2OTFjXHU3ZDIyL1x1N2Y2ZVx1NjNkYg0KLWluZGVudEFjdGlvbl90b29sVGlwVGV4dD1cdTMwYTRcdTMwZjNcdTMwYzdcdTMwZjNcdTMwYzgNCi1pdGFsaWNBY3Rpb25fdG9vbFRpcFRleHQ9XHUzMGE0XHUzMGJmXHUzMGVhXHUzMGMzXHUzMGFmDQotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1cdTRlMmRcdTU5MmVcdTYzYzNcdTMwNDgNCi1qdXN0aWZ5RnVsbEFjdGlvbl90b29sVGlwVGV4dD1cdTRlMjFcdTdhZWZcdTYzYzNcdTMwNDgNCi1qdXN0aWZ5TGVmdEFjdGlvbl90b29sVGlwVGV4dD1cdTVkZTZcdTYzYzNcdTMwNDgNCi1qdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQ9XHU1M2YzXHU2M2MzXHUzMDQ4DQotb3V0ZGVudEFjdGlvbl90b29sVGlwVGV4dD1cdTMwYTJcdTMwYTZcdTMwYzhcdTMwYzdcdTMwZjNcdTMwYzgNCi1wYXN0ZUFjdGlvbl90b29sVGlwVGV4dD1cdThjYmNcdTMwOGFcdTRlZDhcdTMwNTENCi1zdWJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9XHU0ZTBiXHU0ZWQ4XHUzMDRkXHU2NTg3XHU1YjU3DQotc3VwZXJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9XHU0ZTBhXHU0ZWQ4XHUzMDRkXHU2NTg3XHU1YjU3DQotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NGUwYlx1N2RkYQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb21ib2JveGVzDQotZm9udFN0eWxlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MzBkNVx1MzBhOVx1MzBmM1x1MzBjOFx1MzBmYlx1MzBiOVx1MzBiZlx1MzBhNFx1MzBlYlx1MzA2ZVx1OGEyZFx1NWI5YQ0KLWJsb2NrVGFnQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MzBkNlx1MzBlZFx1MzBjM1x1MzBhZlx1MzBmYlx1MzBiZlx1MzBiMFx1MzA2ZVx1OGEyZFx1NWI5YQ0KLWZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MzBkNVx1MzBhOVx1MzBmM1x1MzBjOFx1NTQwZFx1MzA2ZVx1OGEyZFx1NWI5YQ0KLWZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MzBkNVx1MzBhOVx1MzBmM1x1MzBjOFx1MzBmYlx1MzBiNVx1MzBhNFx1MzBiYVx1MzA2ZVx1OGEyZFx1NWI5YQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb250ZXh0IE1lbnUgSXRlbXMNCi1jdXRBY3Rpb25fdGV4dD1cdTUyMDdcdTMwOGFcdTUzZDZcdTMwOGENCi1jb3B5QWN0aW9uX3RleHQ9XHUzMGIzXHUzMGQ0XHUzMGZjDQotcGFzdGVBY3Rpb25fdGV4dD1cdThjYmNcdTMwOGFcdTRlZDhcdTMwNTENCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgVGFicw0KLXJpY2hUZXh0VGFiX3RleHQ9XHUzMGVhXHUzMGMzXHUzMGMxXHUzMGZiXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4DQotcmljaFRleHRUYWJfdG9vbFRpcFRleHQ9XHUzMGVhXHUzMGMzXHUzMGMxXHUzMGZiXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXHU3ZGU4XHU5NmM2DQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PUhUTUwgXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXHU3ZGU4XHU5NmM2DQotDQotIyBBZGQgRGlhbG9ncw0KLWFkZEltYWdlRGlhbG9nX3RpdGxlPVx1NzUzYlx1NTBjZlx1MzA2ZVx1OGZmZFx1NTJhMA0KLWFkZExpbmtEaWFsb2dfdGl0bGU9XHUzMGVhXHUzMGYzXHUzMGFmXHUzMDZlXHU4ZmZkXHU1MmEwDQotYWRkVGFibGVEaWFsb2dfdGl0bGU9XHU4ODY4XHUzMDZlXHU4ZmZkXHU1MmEwDQotZmluZFJlcGxhY2VEaWFsb2dfdGl0bGU9XHU2OTFjXHU3ZDIyL1x1N2Y2ZVx1NjNkYg0KLXVybExhYmVsX3RleHQ9VVJMOg0KLXN1bW1hcnlMYWJlbF90ZXh0PVx1ODk4MVx1N2QwNDoNCi1jYXB0aW9uTGFiZWxfdGV4dD1cdTg4NjhcdTk4NGM6DQotcm93c0xhYmVsX3RleHQ9XHU4ODRjOg0KLWNvbHVtbnNMYWJlbF90ZXh0PVx1NTIxNzoNCi13aWR0aExhYmVsX3RleHQ9XHU1ZTQ1Og0KLXRhYmxlU3R5bGVMYWJlbF90ZXh0PVx1MzBiOVx1MzBiZlx1MzBhNFx1MzBlYjoNCi10YWJsZUhlYWRlck5vbmVfdGV4dD1cdTg5OGJcdTUxZmFcdTMwNTdcdTMwNmVcdTMwNmFcdTMwNDRcdTg4NjgNCi10YWJsZUhlYWRlckNvbHNfdGV4dD1cdTUyMTdcdTg5OGJcdTUxZmFcdTMwNTdcdTMwNmVcdTMwNDJcdTMwOGJcdTg4NjgNCi10YWJsZUhlYWRlclJvd3NfdGV4dD1cdTg4NGNcdTg5OGJcdTUxZmFcdTMwNTdcdTMwNmVcdTMwNDJcdTMwOGJcdTg4NjgNCi10YWJsZUhlYWRlckJvdGhfdGV4dD1cdTUyMTdcdTg5OGJcdTUxZmFcdTMwNTdcdTMwNjhcdTg4NGNcdTg5OGJcdTUxZmFcdTMwNTdcdTMwNmVcdTMwNDJcdTMwOGJcdTg4NjgNCi1icm93c2VCdXR0b25fdGV4dD1cdTUzYzJcdTcxNjcuLi4NCi0NCi0jIENsZWFyIEVkaXRvciBDb250ZW50IERpYWxvZw0KLWNsZWFyQ29udGVudERpYWxvZ190aXRsZT1cdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNmVcdTMwYWZcdTMwZWFcdTMwYTJcdTMwNmVcdTc4YmFcdThhOGQNCi1jbGVhckNvbnRlbnREaWFsb2dfdGV4dD1cdTMwNTNcdTMwNmVcdTMwZWFcdTMwYzNcdTMwYzFcdTMwZmJcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYTJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotDQotIyBGaW5kL1JlcGxhY2UgRGlhbG9nDQotZmluZExhYmVsX3RleHQ9XHU2OTFjXHU3ZDIyOg0KLXJlcGxhY2VMYWJlbF90ZXh0PVx1N2Y2ZVx1NjNkYjoNCi1vcHRpb25zR3JvdXBfdGV4dD1cdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjMNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1cdTU5MjcvXHU1YzBmXHU2NTg3XHU1YjU3XHUzMDkyXHU1MzNhXHU1MjI1XHUzMDU5XHUzMDhiDQotd2hvbGVXb3JkQ2hlY2tib3hfdGV4dD1cdTUzNThcdThhOWVcdTUzNThcdTRmNGQNCi1kaXJlY3Rpb25Hcm91cF90ZXh0PVx1NTQxMVx1MzA0ZA0KLWZvcndhcmRSYWRpb0J1dHRvbl90ZXh0PVx1NTI0ZFx1NjViOQ0KLWJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dD1cdTVmOGNcdTY1YjkNCi1maW5kQnV0dG9uX3RleHQ9XHU2OTFjXHU3ZDIyDQotcmVwbGFjZUJ1dHRvbl90ZXh0PVx1N2Y2ZVx1NjNkYg0KLXJlcGxhY2VGaW5kQnV0dG9uX3RleHQ9XHU3ZjZlXHU2M2RiL1x1NjkxY1x1N2QyMg0KLXJlcGxhY2VhbGxCdXR0b25fdGV4dD1cdTMwNTlcdTMwNzlcdTMwNjZcdTMwOTJcdTdmNmVcdTYzZGINCi0jIHRha2VuIGZyb20gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3INCi1GaW5kUmVwbGFjZV9TdGF0dXNfbm9NYXRjaF9sYWJlbD1cdTY1ODdcdTViNTdcdTUyMTdcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMNCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1heENoYXJzUGVyTGluZUxhYmVsX3RleHQ9MSBcdTg4NGNcdTMwNmVcdTY3MDBcdTU5MjdcdTY1ODdcdTViNTdcdTY1NzA6DQotaW5kZW50SFRNTENoZWNrYm94X3RleHQ9XHUzMGE0XHUzMGYzXHUzMGM3XHUzMGYzXHUzMGM4IEhUTUwgXHUzMGJmXHUzMGIwDQotaW5kZW50U2l6ZUxhYmVsX3RleHQ9XHUzMGE0XHUzMGYzXHUzMGM3XHUzMGYzXHUzMGM4XHUzMGZiXHUzMGI1XHUzMGE0XHUzMGJhOg0KLXVybERpc3BsYXlOYW1lTGFiZWxfdGV4dD1VUkwgXHU4ODY4XHU3OTNhXHU1NDBkOg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlc19rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0YmFlOGEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb250IFN0eWxlIE5hbWVzDQotZm9udFN0eWxlX25vcm1hbD1cdWJjZjRcdWQxYjUNCi1mb250U3R5bGVfc2VjdGlvbkhlYWRpbmc9XHVjMTM5XHVjMTU4IFx1ZDQ1Y1x1YzgxYw0KLWZvbnRTdHlsZV9zdWJzZWN0aW9uSGVhZGluZz1cdWMxMWNcdWJlMGNcdWMxMzlcdWMxNTggXHVkNDVjXHVjODFjDQotZm9udFN0eWxlX3N1YlN1YnNlY3Rpb25IZWFkaW5nPVx1YzExY1x1YmUwY1x1YzEzOVx1YzE1OFx1Yzc1OCBcdWQ1NThcdWM3MDQgXHVkNDVjXHVjODFjDQotZm9udFN0eWxlX3F1b3RlPVx1YjUzMFx1YzYzNFx1ZDQ1Yw0KLWZvbnRTdHlsZV9jb2RlU2FtcGxlPVx1Y2Y1NFx1YjRkYyBcdWMwZDhcdWQ1MGMNCi0NCi0jIEhUTUwgQmxvY2sgVGFncw0KLWJsb2NrVGFnX3BhcmFncmFwaD1cdWIyZThcdWI3N2QNCi1ibG9ja1RhZ19oZWFkaW5nMT1cdWQ0NWNcdWM4MWMgMQ0KLWJsb2NrVGFnX2hlYWRpbmcyPVx1ZDQ1Y1x1YzgxYyAyDQotYmxvY2tUYWdfaGVhZGluZzM9XHVkNDVjXHVjODFjIDMNCi1ibG9ja1RhZ19oZWFkaW5nND1cdWQ0NWNcdWM4MWMgNA0KLWJsb2NrVGFnX2hlYWRpbmc1PVx1ZDQ1Y1x1YzgxYyA1DQotYmxvY2tUYWdfaGVhZGluZzY9XHVkNDVjXHVjODFjIDYNCi1ibG9ja1RhZ19hZGRyZXNzPVx1YzhmY1x1YzE4Yw0KLWJsb2NrVGFnX3ByZWZvcm1hdHRlZFRleHQ9XHVjMGFjXHVjODA0IFx1ZDYxNVx1YzJkZFx1ZDY1NFx1YjQxYyBcdWQxNGRcdWMyYTRcdWQyYjgNCi0NCi0jIEhUTUwgRm9udCBOYW1lcw0KLWZvbnROYW1lX2RlZmF1bHQ9XHVhZTMwXHViY2Y4XHVhYzEyDQotZm9udE5hbWVfYXJpYWw9QXJpYWwNCi1mb250TmFtZV9jb3VyaWVyTmV3PUNvdXJpZXIgTmV3DQotZm9udE5hbWVfdGltZXNOZXdSb21hbj1UaW1lcyBOZXcgUm9tYW4NCi1mb250TmFtZV92ZXJkYW5hPVZlcmRhbmENCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgVG9vbCBCdXR0b25zDQotYWRkSG9yaXpvbnRhbEJhckFjdGlvbl90b29sVGlwVGV4dD1cdWFjMDBcdWI4NWMgXHVjMmE0XHVkMDZjXHViODY0IFx1YjljOVx1YjMwMCBcdWNkOTRcdWFjMDANCi1hZGRJbWFnZUFjdGlvbl90b29sVGlwVGV4dD1cdWM3NzRcdWJiZjhcdWM5YzAgXHVjZDk0XHVhYzAwDQotYWRkTGluZUFjdGlvbl90b29sVGlwVGV4dD1cdWQ1ODkgXHVjZDk0XHVhYzAwDQotYWRkTGlua0FjdGlvbl90b29sVGlwVGV4dD1cdWI5YzFcdWQwNmMgXHVjZDk0XHVhYzAwDQotYWRkT3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ9XHVjODE1XHViODJjXHViNDFjIFx1YmFhOVx1Yjg1ZCBcdWNkOTRcdWFjMDANCi1hZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dD1cdWQ0NWMgXHVjZDk0XHVhYzAwDQotYWRkVW5vcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1cdWM4MTVcdWI4MmNcdWI0MThcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YmFhOVx1Yjg1ZCBcdWNkOTRcdWFjMDANCi1ib2xkQWN0aW9uX3Rvb2xUaXBUZXh0PVx1YWQ3NVx1YWM4Yw0KLWNsZWFyQ29udGVudEFjdGlvbl90b29sVGlwVGV4dD1cdWNlZThcdWQxNTBcdWNlMjAgXHVjOWMwXHVjNmIwXHVhZTMwDQotY29weUFjdGlvbl90b29sVGlwVGV4dD1cdWJjZjVcdWMwYWMNCi1jdXRBY3Rpb25fdG9vbFRpcFRleHQ9XHVjNzk4XHViNzdjXHViMGI0XHVhZTMwDQotZmluZFJlcGxhY2VBY3Rpb25fdG9vbFRpcFRleHQ9XHVjYzNlXHVhZTMwL1x1YmMxNFx1YWZiOFx1YWUzMA0KLWluZGVudEFjdGlvbl90b29sVGlwVGV4dD1cdWI0ZTRcdWM1ZWNcdWM0ZjBcdWFlMzANCi1pdGFsaWNBY3Rpb25fdG9vbFRpcFRleHQ9XHVhZTMwXHVjNmI4XHVjNzg0XHVjY2I0DQotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1cdWFjMDBcdWM2YjRcdWIzNzAgXHViOWRlXHVjZDk0XHVhZTMwDQotanVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQ9XHVjNTkxXHVjYWJkIFx1YjlkZVx1Y2Q5NFx1YWUzMA0KLWp1c3RpZnlMZWZ0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1YzY3Y1x1Y2FiZCBcdWI5ZGVcdWNkOTRcdWFlMzANCi1qdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQ9XHVjNjI0XHViOTc4XHVjYWJkIFx1YjlkZVx1Y2Q5NFx1YWUzMA0KLW91dGRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9XHViMGI0XHVjNWI0XHVjNGYwXHVhZTMwDQotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9XHViZDk5XHVjNWVjXHViMTIzXHVhZTMwDQotc3Vic2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1YzU0NFx1Yjc5OCBcdWNjYThcdWM3OTANCi1zdXBlcnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1cdWM3MTcgXHVjY2E4XHVjNzkwDQotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVx1YmMxMVx1YzkwNA0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb21ib2JveGVzDQotZm9udFN0eWxlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1YWUwMFx1YWYzNCBcdWMyYTRcdWQwYzBcdWM3N2MgXHVjMTI0XHVjODE1DQotYmxvY2tUYWdBY3Rpb25fdG9vbFRpcFRleHQ9XHViZTE0XHViODVkIFx1ZDBkY1x1YWRmOCBcdWMxMjRcdWM4MTUNCi1mb250TmFtZUFjdGlvbl90b29sVGlwVGV4dD1cdWFlMDBcdWFmMzQgXHVjNzc0XHViOTg0IFx1YzEyNFx1YzgxNQ0KLWZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0PVx1YWUwMFx1YWYzNCBcdWQwNmNcdWFlMzAgXHVjMTI0XHVjODE1DQotDQotIyBSaWNoIFRleHQgRWRpdG9yIENvbnRleHQgTWVudSBJdGVtcw0KLWN1dEFjdGlvbl90ZXh0PVx1Yzc5OFx1Yjc3Y1x1YjBiNFx1YWUzMA0KLWNvcHlBY3Rpb25fdGV4dD1cdWJjZjVcdWMwYWMNCi1wYXN0ZUFjdGlvbl90ZXh0PVx1YmQ5OVx1YzVlY1x1YjEyM1x1YWUzMA0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBUYWJzDQotcmljaFRleHRUYWJfdGV4dD1cdWMxMWNcdWMyZGRcdWM3ODhcdWIyOTQgXHVkMTRkXHVjMmE0XHVkMmI4DQotcmljaFRleHRUYWJfdG9vbFRpcFRleHQ9XHVjMTFjXHVjMmRkXHVjNzg4XHViMjk0IFx1ZDE0ZFx1YzJhNFx1ZDJiOFx1Yjg1YyBcdWNlZThcdWQxNTBcdWNlMjAgXHVkM2I4XHVjOWQxDQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PUhUTUxcdWI4NWMgXHVjZWU4XHVkMTUwXHVjZTIwIFx1ZDNiOFx1YzlkMQ0KLQ0KLSMgQWRkIERpYWxvZ3MNCi1hZGRJbWFnZURpYWxvZ190aXRsZT1cdWM3NzRcdWJiZjhcdWM5YzAgXHVjZDk0XHVhYzAwDQotYWRkTGlua0RpYWxvZ190aXRsZT1cdWI5YzFcdWQwNmMgXHVjZDk0XHVhYzAwDQotYWRkVGFibGVEaWFsb2dfdGl0bGU9XHVkNDVjIFx1Y2Q5NFx1YWMwMA0KLWZpbmRSZXBsYWNlRGlhbG9nX3RpdGxlPVx1Y2MzZVx1YWUzMC9cdWJjMTRcdWFmYjhcdWFlMzANCi11cmxMYWJlbF90ZXh0PVVSTDoNCi1zdW1tYXJ5TGFiZWxfdGV4dD1cdWM2OTRcdWM1N2Q6DQotY2FwdGlvbkxhYmVsX3RleHQ9XHVjZWExXHVjMTU4Og0KLXJvd3NMYWJlbF90ZXh0PVx1ZDU4OToNCi1jb2x1bW5zTGFiZWxfdGV4dD1cdWM1ZjQ6DQotd2lkdGhMYWJlbF90ZXh0PVx1YjEwOFx1YmU0NDoNCi10YWJsZVN0eWxlTGFiZWxfdGV4dD1cdWMyYTRcdWQwYzBcdWM3N2M6DQotdGFibGVIZWFkZXJOb25lX3RleHQ9XHVkNWU0XHViMzU0XHVhYzAwIFx1YzVjNlx1YjI5NCBcdWQ0NWMNCi10YWJsZUhlYWRlckNvbHNfdGV4dD1cdWM1ZjQgXHVkNWU0XHViMzU0XHVhYzAwIFx1Yzc4OFx1YjI5NCBcdWQ0NWMNCi10YWJsZUhlYWRlclJvd3NfdGV4dD1cdWQ1ODkgXHVkNWU0XHViMzU0XHVhYzAwIFx1Yzc4OFx1YjI5NCBcdWQ0NWMNCi10YWJsZUhlYWRlckJvdGhfdGV4dD1cdWM1ZjQgXHViYzBmIFx1ZDU4OSBcdWQ1ZTRcdWIzNTRcdWFjMDAgXHVjNzg4XHViMjk0IFx1ZDQ1Yw0KLWJyb3dzZUJ1dHRvbl90ZXh0PVx1Y2MzZVx1YzU0NFx1YmNmNFx1YWUzMC4uLg0KLQ0KLSMgQ2xlYXIgRWRpdG9yIENvbnRlbnQgRGlhbG9nDQotY2xlYXJDb250ZW50RGlhbG9nX3RpdGxlPVx1ZDNiOFx1YzlkMVx1YWUzMCBcdWNlZThcdWQxNTBcdWNlMjAgXHVjOWMwXHVjNmIwXHVhZTMwIFx1ZDY1NVx1Yzc3OA0KLWNsZWFyQ29udGVudERpYWxvZ190ZXh0PVx1Yzc3NCBcdWMxMWNcdWMyZGRcdWM3ODhcdWIyOTQgXHViYjM4XHVjMTFjIFx1ZDNiOFx1YzlkMVx1YWUzMFx1Yzc1OCBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgXHVjOWMwXHVjNmIwXHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLQ0KLSMgRmluZC9SZXBsYWNlIERpYWxvZw0KLWZpbmRMYWJlbF90ZXh0PVx1Y2MzZVx1YWUzMDoNCi1yZXBsYWNlTGFiZWxfdGV4dD1cdWJjMTRcdWFmYzAgXHViMzAwXHVjMGMxOg0KLW9wdGlvbnNHcm91cF90ZXh0PVx1YzYzNVx1YzE1OA0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PVx1YjMwMFx1YzE4Y1x1YmIzOFx1Yzc5MCBcdWFkNmNcdWJkODQNCi13aG9sZVdvcmRDaGVja2JveF90ZXh0PVx1YzgwNFx1Y2NiNCBcdWIyZThcdWM1YjQNCi1kaXJlY3Rpb25Hcm91cF90ZXh0PVx1YmMyOVx1ZDVhNQ0KLWZvcndhcmRSYWRpb0J1dHRvbl90ZXh0PVx1YjJlNFx1Yzc0Yw0KLWJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dD1cdWM3NzRcdWM4MDQNCi1maW5kQnV0dG9uX3RleHQ9XHVjYzNlXHVhZTMwDQotcmVwbGFjZUJ1dHRvbl90ZXh0PVx1YmMxNFx1YWZiOFx1YWUzMA0KLXJlcGxhY2VGaW5kQnV0dG9uX3RleHQ9XHViYzE0XHVhZmI4XHVhZTMwL1x1Y2MzZVx1YWUzMA0KLXJlcGxhY2VhbGxCdXR0b25fdGV4dD1cdWJhYThcdWI0NTAgXHViYzE0XHVhZmI4XHVhZTMwDQotIyB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yDQotRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWw9XHViYjM4XHVjNzkwXHVjNWY0XHVjNzQ0IFx1Y2MzZVx1Yzc0NCBcdWMyMTggXHVjNWM2XHVjNzRjDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0PVx1ZDU4OVx1YjJmOSBcdWNkNWNcdWIzMDAgXHViYjM4XHVjNzkwOg0KLWluZGVudEhUTUxDaGVja2JveF90ZXh0PVx1YjRlNFx1YzVlY1x1YzRmMFx1YWUzMCBIVE1MIFx1ZDBkY1x1YWRmOA0KLWluZGVudFNpemVMYWJlbF90ZXh0PVx1YjRlNFx1YzVlY1x1YzRmMFx1YWUzMCBcdWQwNmNcdWFlMzA6DQotdXJsRGlzcGxheU5hbWVMYWJlbF90ZXh0PVVSTCBcdWQ0NWNcdWMyZGMgXHVjNzc0XHViOTg0Og0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1MDI2MDguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb250IFN0eWxlIE5hbWVzDQotZm9udFN0eWxlX25vcm1hbD1Ob3JtYWwgDQotZm9udFN0eWxlX3NlY3Rpb25IZWFkaW5nPVRcdTAwZWR0dWxvIGRhIFNlXHUwMGU3XHUwMGUzbw0KLWZvbnRTdHlsZV9zdWJzZWN0aW9uSGVhZGluZz1UXHUwMGVkdHVsbyBkYSBTdWJzZVx1MDBlN1x1MDBlM28NCi1mb250U3R5bGVfc3ViU3Vic2VjdGlvbkhlYWRpbmc9VFx1MDBlZHR1bG8gZGEgU3ViLXN1YnNlXHUwMGU3XHUwMGUzbw0KLWZvbnRTdHlsZV9xdW90ZT1RdW90ZQ0KLWZvbnRTdHlsZV9jb2RlU2FtcGxlPUFtb3N0cmEgZG8gQ1x1MDBmM2RpZ28NCi0NCi0jIEhUTUwgQmxvY2sgVGFncw0KLWJsb2NrVGFnX3BhcmFncmFwaD1QYXJcdTAwZTFncmFmbw0KLWJsb2NrVGFnX2hlYWRpbmcxPVRcdTAwZWR0dWxvIDENCi1ibG9ja1RhZ19oZWFkaW5nMj1UXHUwMGVkdHVsbyAyDQotYmxvY2tUYWdfaGVhZGluZzM9VFx1MDBlZHR1bG8gMw0KLWJsb2NrVGFnX2hlYWRpbmc0PVRcdTAwZWR0dWxvIDQNCi1ibG9ja1RhZ19oZWFkaW5nNT1UXHUwMGVkdHVsbyA1DQotYmxvY2tUYWdfaGVhZGluZzY9VFx1MDBlZHR1bG8gNg0KLWJsb2NrVGFnX2FkZHJlc3M9RW5kZXJlXHUwMGU3bw0KLWJsb2NrVGFnX3ByZWZvcm1hdHRlZFRleHQ9VGV4dG8gUHJcdTAwZTktZm9ybWF0YWRvDQotDQotIyBIVE1MIEZvbnQgTmFtZXMNCi1mb250TmFtZV9kZWZhdWx0PURlZmF1bHQNCi1mb250TmFtZV9hcmlhbD1BcmlhbA0KLWZvbnROYW1lX2NvdXJpZXJOZXc9Q291cmllciBOZXcNCi1mb250TmFtZV90aW1lc05ld1JvbWFuPVRpbWVzIE5ldyBSb21hbg0KLWZvbnROYW1lX3ZlcmRhbmE9VmVyZGFuYQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBUb29sIEJ1dHRvbnMNCi1hZGRIb3Jpem9udGFsQmFyQWN0aW9uX3Rvb2xUaXBUZXh0PUluY2x1aXIgQmFycmEgSG9yaXpvbnRhbA0KLWFkZEltYWdlQWN0aW9uX3Rvb2xUaXBUZXh0PUluY2x1aXIgSW1hZ2VtDQotYWRkTGluZUFjdGlvbl90b29sVGlwVGV4dD1JbmNsdWlyIExpbmhhDQotYWRkTGlua0FjdGlvbl90b29sVGlwVGV4dD1JbmNsdWlyIExpbmsNCi1hZGRPcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1JbmNsdWlyIExpc3RhIFNvbGljaXRhZGENCi1hZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dD1JbmNsdWlyIFRhYmVsYQ0KLWFkZFVub3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ9SW5jbHVpciBMaXN0YSBOXHUwMGUzbyBTb2xpY2l0YWRhDQotYm9sZEFjdGlvbl90b29sVGlwVGV4dD1OZWdyaXRvDQotY2xlYXJDb250ZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUxpbXBhciBDb250ZVx1MDBmYWRvDQotY29weUFjdGlvbl90b29sVGlwVGV4dD1Db3BpYXINCi1jdXRBY3Rpb25fdG9vbFRpcFRleHQ9UmVjb3J0YXINCi1maW5kUmVwbGFjZUFjdGlvbl90b29sVGlwVGV4dD1Mb2NhbGl6YXIvU3Vic3RpdHVpcg0KLWluZGVudEFjdGlvbl90b29sVGlwVGV4dD1SZWN1YXINCi1pdGFsaWNBY3Rpb25fdG9vbFRpcFRleHQ9SXRcdTAwZTFsaWNvDQotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1KdXN0aWZpY2FyIGFvIENlbnRybw0KLWp1c3RpZnlGdWxsQWN0aW9uX3Rvb2xUaXBUZXh0PUp1c3RpZmljYXIgVHVkbw0KLWp1c3RpZnlMZWZ0QWN0aW9uX3Rvb2xUaXBUZXh0PUp1c3RpZmljYXIgXHUwMGUwIEVzcXVlcmRhDQotanVzdGlmeVJpZ2h0QWN0aW9uX3Rvb2xUaXBUZXh0PUp1c3RpZmljYXIgXHUwMGUwIERpcmVpdGENCi1vdXRkZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUF2YW5cdTAwZTdvDQotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9Q29sYXINCi1zdWJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9U3Vic2NyaXRvDQotc3VwZXJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9U29icmVzY3JpdG8NCi11bmRlcmxpbmVBY3Rpb25fdG9vbFRpcFRleHQ9U3VibGluaGFyDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIENvbWJvYm94ZXMNCi1mb250U3R5bGVBY3Rpb25fdG9vbFRpcFRleHQ9Q29uZmlndXJhciBFc3RpbG8gZGUgRm9udGUNCi1ibG9ja1RhZ0FjdGlvbl90b29sVGlwVGV4dD1Db25maWd1cmFyIFRhZyBkZSBCbG9jbw0KLWZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0PUNvbmZpZ3VyYXIgTm9tZSBkYSBGb250ZQ0KLWZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0PUNvbmZpZ3VyYXIgVGFtYW5obyBkYSBGb250ZQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb250ZXh0IE1lbnUgSXRlbXMNCi1jdXRBY3Rpb25fdGV4dD1SZWNvcnRhcg0KLWNvcHlBY3Rpb25fdGV4dD1Db3BpYXINCi1wYXN0ZUFjdGlvbl90ZXh0PUNvbGFyDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIFRhYnMNCi1yaWNoVGV4dFRhYl90ZXh0PVJpY2ggVGV4dA0KLXJpY2hUZXh0VGFiX3Rvb2xUaXBUZXh0PUVkaXRhciBjb250ZVx1MDBmYWRvIGVtIHJpY2ggdGV4dA0KLWh0bWxUYWJfdGV4dD1IVE1MDQotaHRtbFRhYl90b29sVGlwVGV4dD1FZGl0YXIgY29udGVcdTAwZmFkbyBlbSBIVE1MDQotDQotIyBBZGQgRGlhbG9ncw0KLWFkZEltYWdlRGlhbG9nX3RpdGxlPUluY2x1aXIgSW1hZ2VtDQotYWRkTGlua0RpYWxvZ190aXRsZT1JbmNsdWlyIExpbmsNCi1hZGRUYWJsZURpYWxvZ190aXRsZT1JbmNsdWlyIFRhYmVsYQ0KLWZpbmRSZXBsYWNlRGlhbG9nX3RpdGxlPUxvY2FsaXphci9TdWJzdGl0dWlyDQotdXJsTGFiZWxfdGV4dD1VUkw6DQotc3VtbWFyeUxhYmVsX3RleHQ9UmVzdW1vOg0KLWNhcHRpb25MYWJlbF90ZXh0PUxlZ2VuZGE6DQotcm93c0xhYmVsX3RleHQ9TGluaGFzOg0KLWNvbHVtbnNMYWJlbF90ZXh0PUNvbHVuYXM6DQotd2lkdGhMYWJlbF90ZXh0PUxhcmd1cmE6DQotdGFibGVTdHlsZUxhYmVsX3RleHQ9RXN0aWxvOg0KLXRhYmxlSGVhZGVyTm9uZV90ZXh0PVRhYmVsYSBzZW0gY2FiZVx1MDBlN2FsaG8NCi10YWJsZUhlYWRlckNvbHNfdGV4dD1UYWJlbGEgY29tIGNhYmVcdTAwZTdhbGhvcyBkZSBjb2x1bmENCi10YWJsZUhlYWRlclJvd3NfdGV4dD1UYWJlbGEgY29tIGNhYmVcdTAwZTdhbGhvcyBkZSBsaW5oYQ0KLXRhYmxlSGVhZGVyQm90aF90ZXh0PVRhYmVsYSBjb20gY2FiZVx1MDBlN2FsaG9zIGRlIGNvbHVuYSBlIGxpbmhhDQotYnJvd3NlQnV0dG9uX3RleHQ9UHJvY3VyYXIuLi4NCi0NCi0jIENsZWFyIEVkaXRvciBDb250ZW50IERpYWxvZw0KLWNsZWFyQ29udGVudERpYWxvZ190aXRsZT1Db25maXJtYVx1MDBlN1x1MDBlM28gZGUgTGltcGFyIENvbnRlXHUwMGZhZG8gZG8gRWRpdG9yDQotY2xlYXJDb250ZW50RGlhbG9nX3RleHQ9RGVzZWphIHJlYWxtZW50ZSBsaW1wYXIgbyBjb250ZVx1MDBmYWRvIGRlc3RlIGVkaXRvciBkZSByaWNoIHRleHQ/DQotDQotIyBGaW5kL1JlcGxhY2UgRGlhbG9nDQotZmluZExhYmVsX3RleHQ9TG9jYWxpemFyOg0KLXJlcGxhY2VMYWJlbF90ZXh0PVN1YnN0aXR1aXIgcG9yOg0KLW9wdGlvbnNHcm91cF90ZXh0PU9wY2lvbmFpcw0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PVNlbnNcdTAwZWR2ZWwgYSBtYWlcdTAwZmFzY3VsYXMgZSBtaW5cdTAwZmFzY3VsYXMNCi13aG9sZVdvcmRDaGVja2JveF90ZXh0PVBhbGF2cmEgaW50ZWlyYQ0KLWRpcmVjdGlvbkdyb3VwX3RleHQ9RGlyZVx1MDBlN1x1MDBlM28NCi1mb3J3YXJkUmFkaW9CdXR0b25fdGV4dD1SZWRpcmVjaW9uYXINCi1iYWNrd2FyZFJhZGlvQnV0dG9uX3RleHQ9UmV0cm9jZWRlcg0KLWZpbmRCdXR0b25fdGV4dD1Mb2NhbGl6YXINCi1yZXBsYWNlQnV0dG9uX3RleHQ9U3Vic3RpdHVpcg0KLXJlcGxhY2VGaW5kQnV0dG9uX3RleHQ9U3Vic3RpdHVpci9Mb2NhbGl6YXINCi1yZXBsYWNlYWxsQnV0dG9uX3RleHQ9U3Vic3RpdHVpciBUdWRvDQotIyB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yDQotRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWw9Q2FkZWlhIE5cdTAwZTNvIExvY2FsaXphZGENCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1heENoYXJzUGVyTGluZUxhYmVsX3RleHQ9TVx1MDBlMXhpbW8gZGUgY2FyYWN0ZXJlcyBwb3IgbGluaGE6DQotaW5kZW50SFRNTENoZWNrYm94X3RleHQ9VGFncyBkZSBSZWN1byBIVE1MDQotaW5kZW50U2l6ZUxhYmVsX3RleHQ9VGFtYW5obyBkbyBSZWN1bzoNCi11cmxEaXNwbGF5TmFtZUxhYmVsX3RleHQ9Tm9tZSBkZSBFeGliaVx1MDBlN1x1MDBlM28gZGEgVVJMOg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkMjY0NzguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb250IFN0eWxlIE5hbWVzDQotZm9udFN0eWxlX25vcm1hbD1cdTVlMzhcdTg5YzQNCi1mb250U3R5bGVfc2VjdGlvbkhlYWRpbmc9XHU4MjgyXHU2ODA3XHU5ODk4DQotZm9udFN0eWxlX3N1YnNlY3Rpb25IZWFkaW5nPVx1NWI1MFx1ODI4Mlx1NjgwN1x1OTg5OA0KLWZvbnRTdHlsZV9zdWJTdWJzZWN0aW9uSGVhZGluZz1cdTViNTBcdTgyODJcdTc2ODRcdTViNTBcdTY4MDdcdTk4OTgNCi1mb250U3R5bGVfcXVvdGU9XHU1ZjE1XHU3NTI4DQotZm9udFN0eWxlX2NvZGVTYW1wbGU9XHU0ZWUzXHU3ODAxXHU2ODM3XHU2NzJjDQotDQotIyBIVE1MIEJsb2NrIFRhZ3MNCi1ibG9ja1RhZ19wYXJhZ3JhcGg9XHU2YmI1DQotYmxvY2tUYWdfaGVhZGluZzE9XHU2ODA3XHU5ODk4IDENCi1ibG9ja1RhZ19oZWFkaW5nMj1cdTY4MDdcdTk4OTggMg0KLWJsb2NrVGFnX2hlYWRpbmczPVx1NjgwN1x1OTg5OCAzDQotYmxvY2tUYWdfaGVhZGluZzQ9XHU2ODA3XHU5ODk4IDQNCi1ibG9ja1RhZ19oZWFkaW5nNT1cdTY4MDdcdTk4OTggNQ0KLWJsb2NrVGFnX2hlYWRpbmc2PVx1NjgwN1x1OTg5OCA2DQotYmxvY2tUYWdfYWRkcmVzcz1cdTU3MzBcdTU3NDANCi1ibG9ja1RhZ19wcmVmb3JtYXR0ZWRUZXh0PVx1OTg4NFx1NTE0OFx1N2YxNlx1NjM5Mlx1NGU4Nlx1NjgzY1x1NWYwZlx1NzY4NFx1NjU4N1x1NjcyYw0KLQ0KLSMgSFRNTCBGb250IE5hbWVzDQotZm9udE5hbWVfZGVmYXVsdD1cdTdmM2FcdTc3MDFcdTUwM2MNCi1mb250TmFtZV9hcmlhbD1BcmlhbA0KLWZvbnROYW1lX2NvdXJpZXJOZXc9Q291cmllciBOZXcNCi1mb250TmFtZV90aW1lc05ld1JvbWFuPVRpbWVzIE5ldyBSb21hbg0KLWZvbnROYW1lX3ZlcmRhbmE9VmVyZGFuYQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBUb29sIEJ1dHRvbnMNCi1hZGRIb3Jpem9udGFsQmFyQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NmRmYlx1NTJhMFx1NmMzNFx1NWU3M1x1Njc2MQ0KLWFkZEltYWdlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NmRmYlx1NTJhMFx1NTZmZVx1NTBjZg0KLWFkZExpbmVBY3Rpb25fdG9vbFRpcFRleHQ9XHU2ZGZiXHU1MmEwXHU4ODRjDQotYWRkTGlua0FjdGlvbl90b29sVGlwVGV4dD1cdTZkZmJcdTUyYTBcdTk0ZmVcdTYzYTUNCi1hZGRPcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1cdTZkZmJcdTUyYTBcdTY3MDlcdTVlOGZcdTUyMTdcdTg4NjgNCi1hZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dD1cdTZkZmJcdTUyYTBcdTg4NjgNCi1hZGRVbm9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NmRmYlx1NTJhMFx1NjVlMFx1NWU4Zlx1NTIxN1x1ODg2OA0KLWJvbGRBY3Rpb25fdG9vbFRpcFRleHQ9XHU3Yzk3XHU0ZjUzDQotY2xlYXJDb250ZW50QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NmUwNVx1OTY2NFx1NTE4NVx1NWJiOQ0KLWNvcHlBY3Rpb25fdG9vbFRpcFRleHQ9XHU1OTBkXHU1MjM2DQotY3V0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NTI2YVx1NTIwNw0KLWZpbmRSZXBsYWNlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NjdlNVx1NjI3ZVx1ZmYwZlx1NjZmZlx1NjM2Mg0KLWluZGVudEFjdGlvbl90b29sVGlwVGV4dD1cdTdmMjlcdThmZGINCi1pdGFsaWNBY3Rpb25fdG9vbFRpcFRleHQ9XHU2NTljXHU0ZjUzDQotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1cdTVjNDVcdTRlMmQNCi1qdXN0aWZ5RnVsbEFjdGlvbl90b29sVGlwVGV4dD1cdTVkZTZcdTUzZjNcdTViZjlcdTlmNTANCi1qdXN0aWZ5TGVmdEFjdGlvbl90b29sVGlwVGV4dD1cdTVkZTZcdTViZjlcdTlmNTANCi1qdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQ9XHU1M2YzXHU1YmY5XHU5ZjUwDQotb3V0ZGVudEFjdGlvbl90b29sVGlwVGV4dD1cdTdhODFcdTUxZmENCi1wYXN0ZUFjdGlvbl90b29sVGlwVGV4dD1cdTdjOThcdThkMzQNCi1zdWJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9XHU0ZTBiXHU2ODA3DQotc3VwZXJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9XHU0ZTBhXHU2ODA3DQotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NGUwYlx1NTIxMlx1N2ViZg0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb21ib2JveGVzDQotZm9udFN0eWxlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1OGJiZVx1N2Y2ZVx1NWI1N1x1NGY1M1x1NjgzN1x1NWYwZg0KLWJsb2NrVGFnQWN0aW9uX3Rvb2xUaXBUZXh0PVx1OGJiZVx1N2Y2ZVx1NTc1N1x1NjgwN1x1OGJiMA0KLWZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0PVx1OGJiZVx1N2Y2ZVx1NWI1N1x1NGY1M1x1NTQwZFx1NzlmMA0KLWZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0PVx1OGJiZVx1N2Y2ZVx1NWI1N1x1NGY1M1x1NTkyN1x1NWMwZg0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb250ZXh0IE1lbnUgSXRlbXMNCi1jdXRBY3Rpb25fdGV4dD1cdTUyNmFcdTUyMDcNCi1jb3B5QWN0aW9uX3RleHQ9XHU1OTBkXHU1MjM2DQotcGFzdGVBY3Rpb25fdGV4dD1cdTdjOThcdThkMzQNCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgVGFicw0KLXJpY2hUZXh0VGFiX3RleHQ9XHU1YmNjXHU2NTg3XHU2NzJjXHU2ODNjXHU1ZjBmDQotcmljaFRleHRUYWJfdG9vbFRpcFRleHQ9XHU0ZWU1XHU1YmNjXHU2NTg3XHU2NzJjXHU2ODNjXHU1ZjBmXHU3ZjE2XHU4ZjkxXHU1MTg1XHU1YmI5DQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PVx1NGVlNSBIVE1MIFx1NjgzY1x1NWYwZlx1N2YxNlx1OGY5MVx1NTE4NVx1NWJiOQ0KLQ0KLSMgQWRkIERpYWxvZ3MNCi1hZGRJbWFnZURpYWxvZ190aXRsZT1cdTZkZmJcdTUyYTBcdTU2ZmVcdTUwY2YNCi1hZGRMaW5rRGlhbG9nX3RpdGxlPVx1NmRmYlx1NTJhMFx1OTRmZVx1NjNhNQ0KLWFkZFRhYmxlRGlhbG9nX3RpdGxlPVx1NmRmYlx1NTJhMFx1ODg2OA0KLWZpbmRSZXBsYWNlRGlhbG9nX3RpdGxlPVx1NjdlNVx1NjI3ZVx1ZmYwZlx1NjZmZlx1NjM2Mg0KLXVybExhYmVsX3RleHQ9VVJMXHVmZjFhDQotc3VtbWFyeUxhYmVsX3RleHQ9XHU2NDU4XHU4OTgxXHVmZjFhDQotY2FwdGlvbkxhYmVsX3RleHQ9XHU2NTg3XHU1YjU3XHU4YmY0XHU2NjBlXHVmZjFhDQotcm93c0xhYmVsX3RleHQ9XHU4ODRjXHVmZjFhDQotY29sdW1uc0xhYmVsX3RleHQ9XHU1MjE3XHVmZjFhDQotd2lkdGhMYWJlbF90ZXh0PVx1NWJiZFx1NWVhNlx1ZmYxYQ0KLXRhYmxlU3R5bGVMYWJlbF90ZXh0PVx1NjgzN1x1NWYwZlx1ZmYxYQ0KLXRhYmxlSGVhZGVyTm9uZV90ZXh0PVx1NmNhMVx1NjcwOVx1NjgwN1x1OTg5OFx1NzY4NFx1ODg2OA0KLXRhYmxlSGVhZGVyQ29sc190ZXh0PVx1NWUyNlx1NjcwOVx1NTIxN1x1NjgwN1x1OTg5OFx1NzY4NFx1ODg2OA0KLXRhYmxlSGVhZGVyUm93c190ZXh0PVx1NWUyNlx1NjcwOVx1ODg0Y1x1NjgwN1x1OTg5OFx1NzY4NFx1ODg2OA0KLXRhYmxlSGVhZGVyQm90aF90ZXh0PVx1NWUyNlx1NjcwOVx1NTIxN1x1NjgwN1x1OTg5OFx1NTQ4Y1x1ODg0Y1x1NjgwN1x1OTg5OFx1NzY4NFx1ODg2OA0KLWJyb3dzZUJ1dHRvbl90ZXh0PVx1NmQ0Zlx1ODljOC4uLg0KLQ0KLSMgQ2xlYXIgRWRpdG9yIENvbnRlbnQgRGlhbG9nDQotY2xlYXJDb250ZW50RGlhbG9nX3RpdGxlPVx1NmUwNVx1OTY2NFx1N2YxNlx1OGY5MVx1NTY2OFx1NTE4NVx1NWJiOVx1Nzg2ZVx1OGJhNA0KLWNsZWFyQ29udGVudERpYWxvZ190ZXh0PVx1Nzg2ZVx1NWI5ZVx1ODk4MVx1NmUwNVx1OTY2NFx1NmI2NFx1NWJjY1x1NjU4N1x1NjcyY1x1NjgzY1x1NWYwZlx1N2YxNlx1OGY5MVx1NTY2OFx1NzY4NFx1NTE4NVx1NWJiOVx1NTQxN1x1ZmYxZg0KLQ0KLSMgRmluZC9SZXBsYWNlIERpYWxvZw0KLWZpbmRMYWJlbF90ZXh0PVx1NjdlNVx1NjI3ZVx1ZmYxYQ0KLXJlcGxhY2VMYWJlbF90ZXh0PVx1NjZmZlx1NjM2Mlx1NGUzYVx1ZmYxYQ0KLW9wdGlvbnNHcm91cF90ZXh0PVx1OTAwOVx1OTg3OQ0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PVx1NTMzYVx1NTIwNlx1NTkyN1x1NWMwZlx1NTE5OQ0KLXdob2xlV29yZENoZWNrYm94X3RleHQ9XHU2NTc0XHU4YmNkDQotZGlyZWN0aW9uR3JvdXBfdGV4dD1cdTY1YjlcdTU0MTENCi1mb3J3YXJkUmFkaW9CdXR0b25fdGV4dD1cdTUyNGRcdThmZGINCi1iYWNrd2FyZFJhZGlvQnV0dG9uX3RleHQ9XHU1NDBlXHU5MDAwDQotZmluZEJ1dHRvbl90ZXh0PVx1NjdlNVx1NjI3ZQ0KLXJlcGxhY2VCdXR0b25fdGV4dD1cdTY2ZmZcdTYzNjINCi1yZXBsYWNlRmluZEJ1dHRvbl90ZXh0PVx1NjZmZlx1NjM2Mlx1ZmYwZlx1NjdlNVx1NjI3ZQ0KLXJlcGxhY2VhbGxCdXR0b25fdGV4dD1cdTUxNjhcdTkwZThcdTY2ZmZcdTYzNjINCi0jIHRha2VuIGZyb20gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3INCi1GaW5kUmVwbGFjZV9TdGF0dXNfbm9NYXRjaF9sYWJlbD1cdTYyN2VcdTRlMGRcdTUyMzBcdTViNTdcdTdiMjZcdTRlMzINCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1heENoYXJzUGVyTGluZUxhYmVsX3RleHQ9XHU2YmNmXHU4ODRjXHU3Njg0XHU2NzAwXHU1OTI3XHU1YjU3XHU3YjI2XHU2NTcwXHVmZjFhDQotaW5kZW50SFRNTENoZWNrYm94X3RleHQ9SFRNTCBcdTdmMjlcdThmZGJcdTY4MDdcdThiYjANCi1pbmRlbnRTaXplTGFiZWxfdGV4dD1cdTdmMjlcdThmZGJcdTU5MjdcdTVjMGZcdWZmMWENCi11cmxEaXNwbGF5TmFtZUxhYmVsX3RleHQ9VVJMIFx1NjYzZVx1NzkzYVx1NTQwZFx1NzlmMFx1ZmYxYQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3OGIwMDIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb250IFN0eWxlIE5hbWVzDQotZm9udFN0eWxlX25vcm1hbD1cdTZiNjNcdTVlMzgNCi1mb250U3R5bGVfc2VjdGlvbkhlYWRpbmc9XHU1MzQwXHU2YmI1XHU2YTE5XHU5ODRjDQotZm9udFN0eWxlX3N1YnNlY3Rpb25IZWFkaW5nPVx1NWI1MFx1NTM0MFx1NmJiNVx1NmExOVx1OTg0Yw0KLWZvbnRTdHlsZV9zdWJTdWJzZWN0aW9uSGVhZGluZz1cdTZiMjFcdTViNTBcdTUzNDBcdTZiYjVcdTZhMTlcdTk4NGMNCi1mb250U3R5bGVfcXVvdGU9XHU1ZjE1XHU4NjVmDQotZm9udFN0eWxlX2NvZGVTYW1wbGU9XHU3YTBiXHU1ZjBmXHU3OGJjXHU3YmM0XHU0ZjhiDQotDQotIyBIVE1MIEJsb2NrIFRhZ3MNCi1ibG9ja1RhZ19wYXJhZ3JhcGg9XHU2YmI1XHU4NDNkDQotYmxvY2tUYWdfaGVhZGluZzE9XHU2YTE5XHU5ODRjIDENCi1ibG9ja1RhZ19oZWFkaW5nMj1cdTZhMTlcdTk4NGMgMg0KLWJsb2NrVGFnX2hlYWRpbmczPVx1NmExOVx1OTg0YyAzDQotYmxvY2tUYWdfaGVhZGluZzQ9XHU2YTE5XHU5ODRjIDQNCi1ibG9ja1RhZ19oZWFkaW5nNT1cdTZhMTlcdTk4NGMgNQ0KLWJsb2NrVGFnX2hlYWRpbmc2PVx1NmExOVx1OTg0YyA2DQotYmxvY2tUYWdfYWRkcmVzcz1cdTRmNGRcdTU3NDANCi1ibG9ja1RhZ19wcmVmb3JtYXR0ZWRUZXh0PVx1OTgxMFx1NTE0OFx1NjgzY1x1NWYwZlx1NTMxNlx1NzY4NFx1NjU4N1x1NWI1Nw0KLQ0KLSMgSFRNTCBGb250IE5hbWVzDQotZm9udE5hbWVfZGVmYXVsdD1cdTk4MTBcdThhMmRcdTUwM2MNCi1mb250TmFtZV9hcmlhbD1BcmlhbA0KLWZvbnROYW1lX2NvdXJpZXJOZXc9Q291cmllciBOZXcNCi1mb250TmFtZV90aW1lc05ld1JvbWFuPVRpbWVzIE5ldyBSb21hbg0KLWZvbnROYW1lX3ZlcmRhbmE9VmVyZGFuYQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBUb29sIEJ1dHRvbnMNCi1hZGRIb3Jpem9udGFsQmFyQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NjViMFx1NTg5ZVx1NmMzNFx1NWU3M1x1OGVmOA0KLWFkZEltYWdlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NjViMFx1NTg5ZVx1NWY3MVx1NTBjZg0KLWFkZExpbmVBY3Rpb25fdG9vbFRpcFRleHQ9XHU2NWIwXHU1ODllXHU2MzA3XHU0ZWU0XHU4ODRjDQotYWRkTGlua0FjdGlvbl90b29sVGlwVGV4dD1cdTY1YjBcdTU4OWVcdTkzYzhcdTdkNTANCi1hZGRPcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1cdTY1YjBcdTU4OWVcdTY3MDlcdTVlOGZcdTZlMDVcdTU1YWUNCi1hZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dD1cdTY1YjBcdTU4OWVcdTg4NjhcdTY4M2MNCi1hZGRVbm9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NjViMFx1NTg5ZVx1NzEyMVx1NWU4Zlx1NmUwNVx1NTVhZQ0KLWJvbGRBY3Rpb25fdG9vbFRpcFRleHQ9XHU3Yzk3XHU5YWQ0XHU1YjU3DQotY2xlYXJDb250ZW50QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NmUwNVx1OTY2NFx1NTE2N1x1NWJiOQ0KLWNvcHlBY3Rpb25fdG9vbFRpcFRleHQ9XHU4OTA3XHU4OGZkDQotY3V0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NTI2YVx1NGUwYg0KLWZpbmRSZXBsYWNlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NWMwYlx1NjI3ZS9cdTUzZDZcdTRlZTMNCi1pbmRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9XHU3ZTJlXHU2MzkyDQotaXRhbGljQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NjU5Y1x1OWFkNFx1NWI1Nw0KLWp1c3RpZnlDZW50ZXJBY3Rpb25fdG9vbFRpcFRleHQ9XHU5NzYwXHU0ZTJkXHU1YzBkXHU5ZjRhDQotanVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQ9XHU1ZGU2XHU1M2YzXHU1YzBkXHU5ZjRhDQotanVzdGlmeUxlZnRBY3Rpb25fdG9vbFRpcFRleHQ9XHU5NzYwXHU1ZGU2XHU1YzBkXHU5ZjRhDQotanVzdGlmeVJpZ2h0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1OTc2MFx1NTNmM1x1NWMwZFx1OWY0YQ0KLW91dGRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9XHU1MWY4XHU2MzkyDQotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9XHU4Y2JjXHU0ZTBhDQotc3Vic2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NGUwYlx1NmExOQ0KLXN1cGVyc2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NGUwYVx1NmExOQ0KLXVuZGVybGluZUFjdGlvbl90b29sVGlwVGV4dD1cdTVlOTVcdTdkZGENCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgQ29tYm9ib3hlcw0KLWZvbnRTdHlsZUFjdGlvbl90b29sVGlwVGV4dD1cdThhMmRcdTViOWFcdTViNTdcdTU3OGJcdTZhMjNcdTVmMGYNCi1ibG9ja1RhZ0FjdGlvbl90b29sVGlwVGV4dD1cdThhMmRcdTViOWFcdTUzNDBcdTU4NGFcdTZhMTlcdTc5M2ENCi1mb250TmFtZUFjdGlvbl90b29sVGlwVGV4dD1cdThhMmRcdTViOWFcdTViNTdcdTU3OGJcdTU0MGRcdTdhMzENCi1mb250U2l6ZUFjdGlvbl90b29sVGlwVGV4dD1cdThhMmRcdTViOWFcdTViNTdcdTU3OGJcdTU5MjdcdTVjMGYNCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgQ29udGV4dCBNZW51IEl0ZW1zDQotY3V0QWN0aW9uX3RleHQ9XHU1MjZhXHU0ZTBiDQotY29weUFjdGlvbl90ZXh0PVx1ODkwN1x1ODhmZA0KLXBhc3RlQWN0aW9uX3RleHQ9XHU4Y2JjXHU0ZTBhDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIFRhYnMNCi1yaWNoVGV4dFRhYl90ZXh0PVJpY2ggXHU2NTg3XHU1YjU3DQotcmljaFRleHRUYWJfdG9vbFRpcFRleHQ9XHU3ZGU4XHU4ZjJmXHU0ZjdmXHU3NTI4IFJpY2ggXHU2NTg3XHU1YjU3XHU3Njg0XHU1MTY3XHU1YmI5DQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PVx1N2RlOFx1OGYyZiBIVE1MIFx1NGUyZFx1NzY4NFx1NTE2N1x1NWJiOQ0KLQ0KLSMgQWRkIERpYWxvZ3MNCi1hZGRJbWFnZURpYWxvZ190aXRsZT1cdTY1YjBcdTU4OWVcdTVmNzFcdTUwY2YNCi1hZGRMaW5rRGlhbG9nX3RpdGxlPVx1NjViMFx1NTg5ZVx1OTNjOFx1N2Q1MA0KLWFkZFRhYmxlRGlhbG9nX3RpdGxlPVx1NjViMFx1NTg5ZVx1ODg2OFx1NjgzYw0KLWZpbmRSZXBsYWNlRGlhbG9nX3RpdGxlPVx1NWMwYlx1NjI3ZS9cdTUzZDZcdTRlZTMNCi11cmxMYWJlbF90ZXh0PVVSTFx1ZmYxYQ0KLXN1bW1hcnlMYWJlbF90ZXh0PVx1NjQ1OFx1ODk4MVx1ZmYxYQ0KLWNhcHRpb25MYWJlbF90ZXh0PVx1NmExOVx1OTg0Y1x1ZmYxYQ0KLXJvd3NMYWJlbF90ZXh0PVx1NTIxN1x1ZmYxYQ0KLWNvbHVtbnNMYWJlbF90ZXh0PVx1NmIwNFx1ZmYxYQ0KLXdpZHRoTGFiZWxfdGV4dD1cdTViZWNcdTVlYTZcdWZmMWENCi10YWJsZVN0eWxlTGFiZWxfdGV4dD1cdTZhMjNcdTVmMGZcdWZmMWENCi10YWJsZUhlYWRlck5vbmVfdGV4dD1cdTRlMGRcdTU0MmJcdTZhMTlcdTk4MmRcdTc2ODRcdTg4NjhcdTY4M2MNCi10YWJsZUhlYWRlckNvbHNfdGV4dD1cdTUzMDVcdTU0MmJcdTZhMTlcdTk4MmRcdTc2ODRcdTg4NjhcdTY4M2MNCi10YWJsZUhlYWRlclJvd3NfdGV4dD1cdTRlMGRcdTU0MmJcdTUyMTdcdTZhMTlcdTk4MmRcdTc2ODRcdTg4NjhcdTY4M2MNCi10YWJsZUhlYWRlckJvdGhfdGV4dD1cdTUzMDVcdTU0MmJcdTZiMDRcdTU0OGNcdTUyMTdcdTZhMTlcdTk4MmRcdTc2ODRcdTg4NjhcdTY4M2MNCi1icm93c2VCdXR0b25fdGV4dD1cdTcwMGZcdTg5YmQuLi4NCi0NCi0jIENsZWFyIEVkaXRvciBDb250ZW50IERpYWxvZw0KLWNsZWFyQ29udGVudERpYWxvZ190aXRsZT1cdTc4YmFcdThhOGRcdTZlMDVcdTk2NjRcdTdkZThcdThmMmZcdTU2NjhcdTUxNjdcdTViYjkNCi1jbGVhckNvbnRlbnREaWFsb2dfdGV4dD1cdTYwYThcdTc3MWZcdTc2ODRcdTg5ODFcdTZlMDVcdTk2NjRcdTZiNjQgUmljaCBUZXh0IFx1N2RlOFx1OGYyZlx1NTY2OFx1NzY4NFx1NTE2N1x1NWJiOVx1NTVjZVx1ZmYxZg0KLQ0KLSMgRmluZC9SZXBsYWNlIERpYWxvZw0KLWZpbmRMYWJlbF90ZXh0PVx1NWMwYlx1NjI3ZVx1ZmYxYQ0KLXJlcGxhY2VMYWJlbF90ZXh0PVx1NTNkNlx1NGVlM1x1NzBiYVx1ZmYxYQ0KLW9wdGlvbnNHcm91cF90ZXh0PVx1OTA3OFx1OTgwNQ0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PVx1NTM0MFx1NTIwNlx1NTkyN1x1NWMwZlx1NWJlYg0KLXdob2xlV29yZENoZWNrYm94X3RleHQ9XHU1YjhjXHU2NTc0XHU1NWFlXHU1YjU3DQotZGlyZWN0aW9uR3JvdXBfdGV4dD1cdTY1YjlcdTU0MTENCi1mb3J3YXJkUmFkaW9CdXR0b25fdGV4dD1cdTRlMGJcdTRlMDBcdTZiNjUNCi1iYWNrd2FyZFJhZGlvQnV0dG9uX3RleHQ9XHU1ZjgwXHU1NmRlDQotZmluZEJ1dHRvbl90ZXh0PVx1NWMwYlx1NjI3ZQ0KLXJlcGxhY2VCdXR0b25fdGV4dD1cdTUzZDZcdTRlZTMNCi1yZXBsYWNlRmluZEJ1dHRvbl90ZXh0PVx1NTNkNlx1NGVlMy9cdTVjMGJcdTYyN2UNCi1yZXBsYWNlYWxsQnV0dG9uX3RleHQ9XHU1MTY4XHU5MGU4XHU1M2Q2XHU0ZWUzDQotIyB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yDQotRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWw9XHU2MjdlXHU0ZTBkXHU1MjMwXHU1YjU3XHU0ZTMyDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0PVx1NmJjZlx1ODg0Y1x1NWI1N1x1NTE0M1x1NjU3OFx1NzZlZVx1NGUwYVx1OTY1MFx1ZmYxYQ0KLWluZGVudEhUTUxDaGVja2JveF90ZXh0PVx1N2UyZVx1NjM5MiBIVE1MIFx1NmExOVx1NzkzYQ0KLWluZGVudFNpemVMYWJlbF90ZXh0PVx1N2UyZVx1NjM5Mlx1NTkyN1x1NWMwZlx1ZmYxYQ0KLXVybERpc3BsYXlOYW1lTGFiZWxfdGV4dD1VUkwgXHU5ODZmXHU3OTNhXHU1NDBkXHU3YTMxXHVmZjFhDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMi8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjljMDVmMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJlNDNjMjUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDIuamFyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBmcmFnbWVudAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAzNjlhMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLm5sMi5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMi5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gbmwyLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlMmQ2YTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgUmljaCBUZXh0IChOTFMpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYzQ0YjZmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gXHUwNDNlXHUwNDQyXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQ0Mg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFRoZSBIVE1MIGZpbGUgdXNlZCB0byByZW5kZXIgdGhlIFJpY2ggVGV4dCBFZGl0b3IuDQotUmljaFRleHQuZWRpdG9ySFRNTD1ydGUuaHRtDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjM5YTM0Ni4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZvbnQgU3R5bGUgTmFtZXMNCi1mb250U3R5bGVfbm9ybWFsPVx1MDQxZVx1MDQzMVx1MDQ0Ylx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzOQ0KLWZvbnRTdHlsZV9zZWN0aW9uSGVhZGluZz1cdTA0MTdcdTA0MzBcdTA0MzNcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzJcdTA0M2VcdTA0M2EgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDMwDQotZm9udFN0eWxlX3N1YnNlY3Rpb25IZWFkaW5nPVx1MDQxN1x1MDQzMFx1MDQzM1x1MDQzZVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzYSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzANCi1mb250U3R5bGVfc3ViU3Vic2VjdGlvbkhlYWRpbmc9XHUwNDE3XHUwNDMwXHUwNDMzXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDNhIFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzNFx1MDQzNVx1MDQzYlx1MDQzMCBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzANCi1mb250U3R5bGVfcXVvdGU9XHUwNDI2XHUwNDM4XHUwNDQyXHUwNDMwXHUwNDQyXHUwNDMwDQotZm9udFN0eWxlX2NvZGVTYW1wbGU9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQwIFx1MDQzYVx1MDQzZVx1MDQzNFx1MDQzMA0KLQ0KLSMgSFRNTCBCbG9jayBUYWdzDQotYmxvY2tUYWdfcGFyYWdyYXBoPVx1MDQxMFx1MDQzMVx1MDQzN1x1MDQzMFx1MDQ0Ng0KLWJsb2NrVGFnX2hlYWRpbmcxPVx1MDQxN1x1MDQzMFx1MDQzM1x1MDQzZVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzYSAxDQotYmxvY2tUYWdfaGVhZGluZzI9XHUwNDE3XHUwNDMwXHUwNDMzXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDNhIDINCi1ibG9ja1RhZ19oZWFkaW5nMz1cdTA0MTdcdTA0MzBcdTA0MzNcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzJcdTA0M2VcdTA0M2EgMw0KLWJsb2NrVGFnX2hlYWRpbmc0PVx1MDQxN1x1MDQzMFx1MDQzM1x1MDQzZVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzYSA0DQotYmxvY2tUYWdfaGVhZGluZzU9XHUwNDE3XHUwNDMwXHUwNDMzXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDNhIDUNCi1ibG9ja1RhZ19oZWFkaW5nNj1cdTA0MTdcdTA0MzBcdTA0MzNcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzJcdTA0M2VcdTA0M2EgNg0KLWJsb2NrVGFnX2FkZHJlc3M9XHUwNDEwXHUwNDM0XHUwNDQwXHUwNDM1XHUwNDQxDQotYmxvY2tUYWdfcHJlZm9ybWF0dGVkVGV4dD1cdTA0MjRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyDQotDQotIyBIVE1MIEZvbnQgTmFtZXMNCi1mb250TmFtZV9kZWZhdWx0PVx1MDQxZlx1MDQzZSBcdTA0NDNcdTA0M2NcdTA0M2VcdTA0M2JcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUNCi1mb250TmFtZV9hcmlhbD1BcmlhbA0KLWZvbnROYW1lX2NvdXJpZXJOZXc9Q291cmllciBOZXcNCi1mb250TmFtZV90aW1lc05ld1JvbWFuPVRpbWVzIE5ldyBSb21hbg0KLWZvbnROYW1lX3ZlcmRhbmE9VmVyZGFuYQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBUb29sIEJ1dHRvbnMNCi1hZGRIb3Jpem9udGFsQmFyQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDM4XHUwNDRlDQotYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDEyXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLWFkZExpbmVBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDE0XHUwNDNlXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzYlx1MDQzOFx1MDQzZFx1MDQzOFx1MDQ0ZQ0KLWFkZExpbmtBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDE0XHUwNDNlXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQ0Mw0KLWFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NGZcdTA0MzRcdTA0M2VcdTA0NDdcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQxXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDNlXHUwNDNhDQotYWRkVGFibGVBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDE0XHUwNDNlXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQ0Mw0KLWFkZFVub3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDE0XHUwNDNlXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNVx1MDQ0M1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Zlx1MDQzNFx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDFcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0M2VcdTA0M2ENCi1ib2xkQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQxZlx1MDQzZVx1MDQzYlx1MDQ0M1x1MDQzNlx1MDQzOFx1MDQ0MFx1MDQzZFx1MDQ0Ylx1MDQzOQ0KLWNsZWFyQ29udGVudEFjdGlvbl90b29sVGlwVGV4dD1cdTA0MWVcdTA0NDdcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotY29weUFjdGlvbl90b29sVGlwVGV4dD1cdTA0MjFcdTA0M2FcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMNCi1jdXRBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDEyXHUwNDRiXHUwNDQwXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDQyXHUwNDRjDQotZmluZFJlcGxhY2VBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDFkXHUwNDMwXHUwNDM5XHUwNDQyXHUwNDM4L1x1MDQxN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLWluZGVudEFjdGlvbl90b29sVGlwVGV4dD1cdTA0MWVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2YNCi1pdGFsaWNBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDFhXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDMyDQotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1cdTA0MWZcdTA0M2UgXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDQyXHUwNDQwXHUwNDQzDQotanVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDFmXHUwNDNlIFx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQzZFx1MDQzNQ0KLWp1c3RpZnlMZWZ0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQxZlx1MDQzZSBcdTA0M2JcdTA0MzVcdTA0MzJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDRlDQotanVzdGlmeVJpZ2h0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQxZlx1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDRlDQotb3V0ZGVudEFjdGlvbl90b29sVGlwVGV4dD1cdTA0MjNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGNcdTA0NDhcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmDQotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDEyXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjDQotc3Vic2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQxZFx1MDQzOFx1MDQzNlx1MDQzZFx1MDQzOFx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0MzRcdTA0MzVcdTA0M2FcdTA0NDENCi1zdXBlcnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDVcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDM0XHUwNDM1XHUwNDNhXHUwNDQxDQotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQxZlx1MDQzZVx1MDQzNFx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzYVx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb21ib2JveGVzDQotZm9udFN0eWxlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQyMVx1MDQ0Mlx1MDQzOFx1MDQzYlx1MDQ0YyBcdTA0NDhcdTA0NDBcdTA0MzhcdTA0NDRcdTA0NDJcdTA0MzANCi1ibG9ja1RhZ0FjdGlvbl90b29sVGlwVGV4dD1cdTA0MjJcdTA0MzVcdTA0MzMgXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNhXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDM4DQotZm9udE5hbWVBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQ0OFx1MDQ0MFx1MDQzOFx1MDQ0NFx1MDQ0Mlx1MDQzMA0KLWZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQ0MCBcdTA0NDhcdTA0NDBcdTA0MzhcdTA0NDRcdTA0NDJcdTA0MzANCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgQ29udGV4dCBNZW51IEl0ZW1zDQotY3V0QWN0aW9uX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDQwXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDQyXHUwNDRjDQotY29weUFjdGlvbl90ZXh0PVx1MDQyMVx1MDQzYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0Yw0KLXBhc3RlQWN0aW9uX3RleHQ9XHUwNDEyXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIFRhYnMNCi1yaWNoVGV4dFRhYl90ZXh0PVx1MDQyNFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDINCi1yaWNoVGV4dFRhYl90b29sVGlwVGV4dD1cdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiIFx1MDQzMiBcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzUgUlRGDQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PVx1MDQyMFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0NGIgXHUwNDMyIFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNSBIVE1MDQotDQotIyBBZGQgRGlhbG9ncw0KLWFkZEltYWdlRGlhbG9nX3RpdGxlPVx1MDQxMlx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1hZGRMaW5rRGlhbG9nX3RpdGxlPVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0NDMNCi1hZGRUYWJsZURpYWxvZ190aXRsZT1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQyXHUwNDMwXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDQ2XHUwNDQzDQotZmluZFJlcGxhY2VEaWFsb2dfdGl0bGU9XHUwNDFkXHUwNDMwXHUwNDM5XHUwNDQyXHUwNDM4L1x1MDQxN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLXVybExhYmVsX3RleHQ9VVJMOg0KLXN1bW1hcnlMYWJlbF90ZXh0PVx1MDQxZVx1MDQzMVx1MDQzN1x1MDQzZVx1MDQ0MDoNCi1jYXB0aW9uTGFiZWxfdGV4dD1cdTA0MWRcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzU6DQotcm93c0xhYmVsX3RleHQ9XHUwNDIxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDNhXHUwNDM4Og0KLWNvbHVtbnNMYWJlbF90ZXh0PVx1MDQyMVx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQzMVx1MDQ0Nlx1MDQ0YjoNCi13aWR0aExhYmVsX3RleHQ9XHUwNDI4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNkXHUwNDMwOg0KLXRhYmxlU3R5bGVMYWJlbF90ZXh0PVx1MDQyMVx1MDQ0Mlx1MDQzOFx1MDQzYlx1MDQ0YzoNCi10YWJsZUhlYWRlck5vbmVfdGV4dD1cdTA0MjJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0MzAgXHUwNDMxXHUwNDM1XHUwNDM3IFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQzZVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzYVx1MDQzZVx1MDQzMg0KLXRhYmxlSGVhZGVyQ29sc190ZXh0PVx1MDQyMlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzMCBcdTA0NDEgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDMwXHUwNDNjXHUwNDM4IFx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQzMVx1MDQ0Nlx1MDQzZVx1MDQzMg0KLXRhYmxlSGVhZGVyUm93c190ZXh0PVx1MDQyMlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzMCBcdTA0NDEgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDMwXHUwNDNjXHUwNDM4IFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYQ0KLXRhYmxlSGVhZGVyQm90aF90ZXh0PVx1MDQyMlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzMCBcdTA0NDEgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDMwXHUwNDNjXHUwNDM4IFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYSBcdTA0MzggXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDNiXHUwNDMxXHUwNDQ2XHUwNDNlXHUwNDMyDQotYnJvd3NlQnV0dG9uX3RleHQ9XHUwNDFlXHUwNDMxXHUwNDM3XHUwNDNlXHUwNDQwLi4uDQotDQotIyBDbGVhciBFZGl0b3IgQ29udGVudCBEaWFsb2cNCi1jbGVhckNvbnRlbnREaWFsb2dfdGl0bGU9XHUwNDFmXHUwNDNlXHUwNDM0XHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDJcdTA0MzAgXHUwNDMyIFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzNQ0KLWNsZWFyQ29udGVudERpYWxvZ190ZXh0PVx1MDQxMlx1MDQ0YiBcdTA0MzRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDQ1XHUwNDNlXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0MzVcdTA0NDFcdTA0NGMgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyIFx1MDQzOFx1MDQzNyBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzA/DQotDQotIyBGaW5kL1JlcGxhY2UgRGlhbG9nDQotZmluZExhYmVsX3RleHQ9XHUwNDFkXHUwNDMwXHUwNDM5XHUwNDQyXHUwNDM4Og0KLXJlcGxhY2VMYWJlbF90ZXh0PVx1MDQxN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2RcdTA0MzA6DQotb3B0aW9uc0dyb3VwX3RleHQ9XHUwNDFmXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDQwXHUwNDRiDQotY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQ9XHUwNDIxIFx1MDQ0M1x1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0NDBcdTA0MzVcdTA0MzNcdTA0MzhcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzANCi13aG9sZVdvcmRDaGVja2JveF90ZXh0PVx1MDQyNlx1MDQzNVx1MDQzYlx1MDQzZVx1MDQzNSBcdTA0NDFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0M2UNCi1kaXJlY3Rpb25Hcm91cF90ZXh0PVx1MDQxZFx1MDQzMFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLWZvcndhcmRSYWRpb0J1dHRvbl90ZXh0PVx1MDQxMlx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNA0KLWJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dD1cdTA0MWRcdTA0MzBcdTA0MzdcdTA0MzBcdTA0MzQNCi1maW5kQnV0dG9uX3RleHQ9XHUwNDFkXHUwNDMwXHUwNDM5XHUwNDQyXHUwNDM4DQotcmVwbGFjZUJ1dHRvbl90ZXh0PVx1MDQxN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLXJlcGxhY2VGaW5kQnV0dG9uX3RleHQ9XHUwNDFmXHUwNDNlXHUwNDM4XHUwNDQxXHUwNDNhIFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzANCi1yZXBsYWNlYWxsQnV0dG9uX3RleHQ9XHUwNDE3XHUwNDMwXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MVx1MDQzNQ0KLSMgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcg0KLUZpbmRSZXBsYWNlX1N0YXR1c19ub01hdGNoX2xhYmVsPVx1MDQyMVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYVx1MDQzMCBcdTA0M2RcdTA0MzUgXHUwNDNkXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDMwDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0PVx1MDQyN1x1MDQzOFx1MDQ0MVx1MDQzYlx1MDQzZSBcdTA0NDFcdTA0MzhcdTA0M2NcdTA0MzJcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDMyIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYVx1MDQzNToNCi1pbmRlbnRIVE1MQ2hlY2tib3hfdGV4dD1cdTA0MWVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2YgXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDMyIEhUTUwNCi1pbmRlbnRTaXplTGFiZWxfdGV4dD1cdTA0MjBcdTA0MzBcdTA0MzdcdTA0M2NcdTA0MzVcdTA0NDAgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDMwOg0KLXVybERpc3BsYXlOYW1lTGFiZWxfdGV4dD1cdTA0MWVcdTA0NDJcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzBcdTA0MzVcdTA0M2NcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFVSTDoNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1OTEyMzAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzUzOGI2Mi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwyYS5qYXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3ZTU0YzEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UubmwyYS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMmEuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMmEuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZTJkNmE2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMmEvZnJhZ21lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZnJhZ21lbnROYW1lPUVQRiBSaWNoIFRleHQgKE5MUykNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGEzODE1NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgUmljaCBUZXh0DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgVGhlIEhUTUwgZmlsZSB1c2VkIHRvIHJlbmRlciB0aGUgUmljaCBUZXh0IEVkaXRvci4NCi1SaWNoVGV4dC5lZGl0b3JIVE1MPXJ0ZS5odG0NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwZTg1MDIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRm9udCBTdHlsZSBOYW1lcw0KLWZvbnRTdHlsZV9ub3JtYWw9Tm9ybWFsDQotZm9udFN0eWxlX3NlY3Rpb25IZWFkaW5nPUFmc25pdHNvdmVyc2tyaWZ0DQotZm9udFN0eWxlX3N1YnNlY3Rpb25IZWFkaW5nPVVuZGVyYWZzbml0c292ZXJza3JpZnQNCi1mb250U3R5bGVfc3ViU3Vic2VjdGlvbkhlYWRpbmc9VW5kZXJ1bmRlcmFmc25pdHNvdmVyc2tyaWZ0DQotZm9udFN0eWxlX3F1b3RlPUFuZlx1MDBmOHJzZWxzdGVnbg0KLWZvbnRTdHlsZV9jb2RlU2FtcGxlPUtvZGVla3NlbXBlbA0KLQ0KLSMgSFRNTCBCbG9jayBUYWdzDQotYmxvY2tUYWdfcGFyYWdyYXBoPUFmc25pdA0KLWJsb2NrVGFnX2hlYWRpbmcxPU92ZXJza3JpZnQgMQ0KLWJsb2NrVGFnX2hlYWRpbmcyPU92ZXJza3JpZnQgMg0KLWJsb2NrVGFnX2hlYWRpbmczPU92ZXJza3JpZnQgMw0KLWJsb2NrVGFnX2hlYWRpbmc0PU92ZXJza3JpZnQgNA0KLWJsb2NrVGFnX2hlYWRpbmc1PU92ZXJza3JpZnQgNQ0KLWJsb2NrVGFnX2hlYWRpbmc2PU92ZXJza3JpZnQgNg0KLWJsb2NrVGFnX2FkZHJlc3M9QWRyZXNzZQ0KLWJsb2NrVGFnX3ByZWZvcm1hdHRlZFRleHQ9UHJcdTAwZTZmb3JtYXRlcmV0IHRla3N0DQotDQotIyBIVE1MIEZvbnQgTmFtZXMNCi1mb250TmFtZV9kZWZhdWx0PVN0YW5kYXJkDQotZm9udE5hbWVfYXJpYWw9QXJpYWwNCi1mb250TmFtZV9jb3VyaWVyTmV3PUNvdXJpZXIgTmV3DQotZm9udE5hbWVfdGltZXNOZXdSb21hbj1UaW1lcyBOZXcgUm9tYW4NCi1mb250TmFtZV92ZXJkYW5hPVZlcmRhbmENCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgVG9vbCBCdXR0b25zDQotYWRkSG9yaXpvbnRhbEJhckFjdGlvbl90b29sVGlwVGV4dD1UaWxmXHUwMGY4aiB2YW5kcmV0IGxpbmplDQotYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQ9VGlsZlx1MDBmOGogYmlsbGVkZQ0KLWFkZExpbmVBY3Rpb25fdG9vbFRpcFRleHQ9VGlsZlx1MDBmOGogbGluamUNCi1hZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0PVRpbGZcdTAwZjhqIGxpbmsNCi1hZGRPcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1UaWxmXHUwMGY4aiBzb3J0ZXJldCBsaXN0ZQ0KLWFkZFRhYmxlQWN0aW9uX3Rvb2xUaXBUZXh0PVRpbGZcdTAwZjhqIHRhYmVsDQotYWRkVW5vcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1UaWxmXHUwMGY4aiBpa2tlLXNvcnRlcmV0IGxpc3RlDQotYm9sZEFjdGlvbl90b29sVGlwVGV4dD1GZWQNCi1jbGVhckNvbnRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9UnlkIGluZGhvbGQNCi1jb3B5QWN0aW9uX3Rvb2xUaXBUZXh0PUtvcGlcdTAwZTlyDQotY3V0QWN0aW9uX3Rvb2xUaXBUZXh0PUtsaXANCi1maW5kUmVwbGFjZUFjdGlvbl90b29sVGlwVGV4dD1TXHUwMGY4Zy9lcnN0YXQNCi1pbmRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9SW5kcnlrDQotaXRhbGljQWN0aW9uX3Rvb2xUaXBUZXh0PUt1cnNpdg0KLWp1c3RpZnlDZW50ZXJBY3Rpb25fdG9vbFRpcFRleHQ9Q2VudHJlcmV0DQotanVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQ9RnVsZHQganVzdGVyZXQNCi1qdXN0aWZ5TGVmdEFjdGlvbl90b29sVGlwVGV4dD1WZW5zdHJlanVzdGVyZXQNCi1qdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQ9SFx1MDBmOGpyZWp1c3RlcmV0DQotb3V0ZGVudEFjdGlvbl90b29sVGlwVGV4dD1SeWsgdWQNCi1wYXN0ZUFjdGlvbl90b29sVGlwVGV4dD1LbGlzdHJlDQotc3Vic2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PVNcdTAwZTZua2V0DQotc3VwZXJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9SFx1MDBlNnZldA0KLXVuZGVybGluZUFjdGlvbl90b29sVGlwVGV4dD1VbmRlcnN0cmVnZXQNCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgQ29tYm9ib3hlcw0KLWZvbnRTdHlsZUFjdGlvbl90b29sVGlwVGV4dD1BbmdpdiBmb250dHlwb2dyYWZpDQotYmxvY2tUYWdBY3Rpb25fdG9vbFRpcFRleHQ9QW5naXYgYmxva2tvZGUNCi1mb250TmFtZUFjdGlvbl90b29sVGlwVGV4dD1BbmdpdiBmb250bmF2bg0KLWZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0PUFuZ2l2IGZvbnRzdFx1MDBmOHJyZWxzZQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb250ZXh0IE1lbnUgSXRlbXMNCi1jdXRBY3Rpb25fdGV4dD1LbGlwDQotY29weUFjdGlvbl90ZXh0PUtvcGlcdTAwZTlyDQotcGFzdGVBY3Rpb25fdGV4dD1LbGlzdHJlDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIFRhYnMNCi1yaWNoVGV4dFRhYl90ZXh0PVJpY2ggVGV4dA0KLXJpY2hUZXh0VGFiX3Rvb2xUaXBUZXh0PVJlZGlnXHUwMGU5ciBpbmRob2xkIGkgUmljaCBUZXh0DQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PVJlZGlnXHUwMGU5ciBpbmRob2xkIGkgSFRNTA0KLQ0KLSMgQWRkIERpYWxvZ3MNCi1hZGRJbWFnZURpYWxvZ190aXRsZT1UaWxmXHUwMGY4aiBiaWxsZWRlDQotYWRkTGlua0RpYWxvZ190aXRsZT1UaWxmXHUwMGY4aiBsaW5rDQotYWRkVGFibGVEaWFsb2dfdGl0bGU9VGlsZlx1MDBmOGogdGFiZWwNCi1maW5kUmVwbGFjZURpYWxvZ190aXRsZT1TXHUwMGY4Zy9lcnN0YXQNCi11cmxMYWJlbF90ZXh0PVVSTDoNCi1zdW1tYXJ5TGFiZWxfdGV4dD1PdmVyc2lndDoNCi1jYXB0aW9uTGFiZWxfdGV4dD1PdmVyc2tyaWZ0Og0KLXJvd3NMYWJlbF90ZXh0PVJcdTAwZTZra2VyOg0KLWNvbHVtbnNMYWJlbF90ZXh0PUtvbG9ubmVyOg0KLXdpZHRoTGFiZWxfdGV4dD1CcmVkZGU6DQotdGFibGVTdHlsZUxhYmVsX3RleHQ9VHlwZToNCi10YWJsZUhlYWRlck5vbmVfdGV4dD1UYWJlbCB1ZGVuIHRvcHRla3N0ZXINCi10YWJsZUhlYWRlckNvbHNfdGV4dD1UYWJlbCBtZWQgdG9wdGVrc3Rlcg0KLXRhYmxlSGVhZGVyUm93c190ZXh0PVRhYmVsIG1lZCByXHUwMGU2a2tldG9wdGVrc3Rlcg0KLXRhYmxlSGVhZGVyQm90aF90ZXh0PVRhYmVsIG1lZCBrb2xvbm5lLSBvZyByXHUwMGU2a2tldG9wdGVrc3Rlcg0KLWJyb3dzZUJ1dHRvbl90ZXh0PUdlbm5lbXNlLi4uDQotDQotIyBDbGVhciBFZGl0b3IgQ29udGVudCBEaWFsb2cNCi1jbGVhckNvbnRlbnREaWFsb2dfdGl0bGU9QmVrclx1MDBlNmZ0IHJ5ZG5pbmcgYWYgZWRpdG9yaW5kaG9sZA0KLWNsZWFyQ29udGVudERpYWxvZ190ZXh0PVZpbCBkdSByeWRkZSBpbmRob2xkZXQgYWYgZGVubmUgUmljaCBUZXh0LWVkaXRvcj8NCi0NCi0jIEZpbmQvUmVwbGFjZSBEaWFsb2cNCi1maW5kTGFiZWxfdGV4dD1GaW5kOg0KLXJlcGxhY2VMYWJlbF90ZXh0PUVyc3RhdCBtZWQ6DQotb3B0aW9uc0dyb3VwX3RleHQ9SW5kc3RpbGxpbmdlcg0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PUZvcnNrZWwgcFx1MDBlNSBzdG9yZS9zbVx1MDBlNSBib2dzdGF2ZXINCi13aG9sZVdvcmRDaGVja2JveF90ZXh0PUhlbGUgb3JkDQotZGlyZWN0aW9uR3JvdXBfdGV4dD1SZXRuaW5nDQotZm9yd2FyZFJhZGlvQnV0dG9uX3RleHQ9RnJlbQ0KLWJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dD1UaWxiYWdlDQotZmluZEJ1dHRvbl90ZXh0PVNcdTAwZjhnDQotcmVwbGFjZUJ1dHRvbl90ZXh0PUVyc3RhdA0KLXJlcGxhY2VGaW5kQnV0dG9uX3RleHQ9U1x1MDBmOGcvZXJzdGF0DQotcmVwbGFjZWFsbEJ1dHRvbl90ZXh0PUVyc3RhdCBhbGxlDQotIyB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yDQotRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWw9U3RyZW5nZW4gZmluZGVzIGlra2UNCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1heENoYXJzUGVyTGluZUxhYmVsX3RleHQ9TWFrcy4gYW50YWwgdGVnbiBwci4gbGluamU6DQotaW5kZW50SFRNTENoZWNrYm94X3RleHQ9SW5kcnlrIEhUTUwta29kZXINCi1pbmRlbnRTaXplTGFiZWxfdGV4dD1JbmRyeWtuaW5nc3N0XHUwMGY4cnJlbHNlOg0KLXVybERpc3BsYXlOYW1lTGFiZWxfdGV4dD1VUkwtZnJlbXZpc25pbmdzbmF2bjoNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViOTdjZDQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2UyMjlkOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgU2VhcmNoIChOTDEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTdiMDEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MGRlMzlhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFN1Y2hlDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1NzcwMjcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9Qlx1MDBmYXNxdWVkYSBkZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTFmMDJkMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1SZWNoZXJjaGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjMGFkMjguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9UmljZXJjYSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5famEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmExODA5MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgU2VhcmNoDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY5MDI0YmIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1YWM4MFx1YzBjOQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNjk1YzIxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVByb2N1cmEgZG8gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiMWY4OTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1NjQxY1x1N2QyMg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYTE4MDkwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBTZWFyY2gNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGFhNThiNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEluZGV4aW5nIHByb2dyZXNzIG1vbml0b3INCi1pbmRleENvbmZpZ0ZpbGVzVGFza19uYW1lPUtvbmZpZ3VyYXRpb25zZGF0ZWllbiB3ZXJkZW4gaW5kZXhpZXJ0Li4uDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiMmQ0NjcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBJbmRleGluZyBwcm9ncmVzcyBtb25pdG9yDQotaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZT1JbmRleGFuZG8gYXJjaGl2b3MgZGUgY29uZmlndXJhY2lcdTAwZjNuLi4uDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzNGY1MWUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBJbmRleGluZyBwcm9ncmVzcyBtb25pdG9yDQotaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZT1JbmRleGF0aW9uIGRlcyBmaWNoaWVycyBkZSBjb25maWd1cmF0aW9uLi4uDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkYTlhNTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBJbmRleGluZyBwcm9ncmVzcyBtb25pdG9yDQotaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZT1JbmRpY2l6emF6aW9uZSBkZWkgZmlsZSBkaSBjb25maWd1cmF6aW9uZSBpbiBjb3Jzby4uLg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NmZjZGJkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgSW5kZXhpbmcgcHJvZ3Jlc3MgbW9uaXRvcg0KLWluZGV4Q29uZmlnRmlsZXNUYXNrX25hbWU9XHU2OWNiXHU2MjEwXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHU3ZDIyXHU1ZjE1XHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhZjc3YzAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBJbmRleGluZyBwcm9ncmVzcyBtb25pdG9yDQotaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZT1cdWFkNmNcdWMxMzEgXHVkMzBjXHVjNzdjIFx1YzBjOVx1Yzc3OFx1ZDY1NCBcdWM5MTEuLi4NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWY4YjRjMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEluZGV4aW5nIHByb2dyZXNzIG1vbml0b3INCi1pbmRleENvbmZpZ0ZpbGVzVGFza19uYW1lPUluZGV4YW5kbyBhcnF1aXZvcyBkZSBjb25maWd1cmFcdTAwZTdcdTAwZTNvLi4uDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhZTAzMTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBJbmRleGluZyBwcm9ncmVzcyBtb25pdG9yDQotaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTViZjlcdTkxNGRcdTdmNmVcdTY1ODdcdTRlZjZcdTVlZmFcdTdhY2JcdTdkMjJcdTVmMTUuLi4NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNkNjBiYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEluZGV4aW5nIHByb2dyZXNzIG1vbml0b3INCi1pbmRleENvbmZpZ0ZpbGVzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1ODhmZFx1NGY1Y1x1OTE0ZFx1N2Y2ZVx1NmE5NFx1NzY4NFx1N2QyMlx1NWYxNS4uLg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiM2EwZjc3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgU2VhcmNoIFN0b3AgV29yZHMNCi1TZWFyY2guc3RvcFdvcmRzPWFiZXIsIGFscywgYXVmLCBiZWksIGRhbm4sIGRhcywgZGVyLCBkaWUsIGRpZXNlLCBkaWVzZXIsIGRpZXNlcywgZG9ydCwgZWluLCBlaW5lLCBlaW5lciwgZWluZXMsIGVyLCBlcywgZmFsbHMsIGZcdTAwZmNyLCBpLCBpaHJlLCBpc3QsIGluLCBrZWluLCBtaXQsIG5hY2gsIG5pY2h0LCBvZGVyLCBzaWUsIHNpbmQsIHQsIFx1MDBmY2Jlciwgdm9uLCB2b20sIHdhciwgd2FyZW4sIHdhcywgd2Vubiwgd2VyZGVuLCB3aWUsIHdpcmQsIHdvLCB6dQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMDU2MTJlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgU2VhcmNoIFN0b3AgV29yZHMNCi1TZWFyY2guc3RvcFdvcmRzPWEsIGFib3V0LCBhbiwgYW5kLCBhcmUsIGFzLCBhdCwgYmUsIGJ1dCwgYnksIGZvciwgZnJvbSwgaG93LCBpLCBpZiwgaW4sIGludG8sIGlzLCBpdCwgbm8sIG5vdCwgb2YsIG9uLCBvciwgcywgc3VjaCwgdCwgdGhhdCwgdGhlLCB0aGVpciwgdGhlbiwgdGhlcmUsIHRoZXNlLCB0aGV5LCB0aGlzLCB0bywgd2FzLCB3aGF0LCB3aGVuLCB3aGVyZSwgd2hvLCB3aWxsLCB3aXRoDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3NDM3MGMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBTZWFyY2ggU3RvcCBXb3Jkcw0KLVNlYXJjaC5zdG9wV29yZHM9dW4sIHVuZSwgXHUwMGUwIHByb3BvcyBkZSwgZXQsIHNvbnQsIGNvbW1lLCBlbiB0YW50IHF1ZSwgXHUwMGVhdHJlLCBtYWlzLCBwYXIsIHBvdXIsIGRlLCBkZXB1aXMsIGNvbW1lbnQsIGplLCBzaSwgZGFucywgXHUwMGUwIGwnaW50XHUwMGU5cmlldXIgZGUsIGVzdCwgXHUwMGU3YSwgY2UsIGMnLCBsJywgbm9uLCBwYXMsIGRlLCBzdXIsIG91LCB0ZWwsIHRlbCBxdWUsIGNlbGEsIGxlLCBsZXVyLCBsZXVycywgcHVpcywgZW5zdWl0ZSwgbFx1MDBlMCwgY2VzLCBpbHMsIGNlY2ksIHZlcnMsIGVuIGRpcmVjdGlvbiBkZSwgXHUwMGU5dGFpdCwgcXVlbCwgcXVlbGxlLCBxdW9pLCBxdWFuZCwgb1x1MDBmOSwgcXVpLCBzZXJhLCBhdmVjDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiYTY3OGYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBTZWFyY2ggU3RvcCBXb3Jkcw0KLVNlYXJjaC5zdG9wV29yZHM9dW4sIHVubywgdW5hLCBhIHByb3Bvc2l0byBkaSwgdW4sIHVubywgdW5hLCBlLCBzb25vLCBjb21lLCBpbiwgZXNzZXJlLCBtYSwgcGVyLCBkYSwgcGVyLCBkYSwgY29tZSwgaW8sIHNlLCBpbiwgaW4sIFx1MDBlOCwgZXNzbywgbm8sIG5vbiwgZGksIHN1LCBvcHB1cmUsIHMsIGNvbWUsIHRhbGUsIHRhbGksIHF1YWxpLCBxdWFsZSwgdCwgY2hlLCBxdWVsbG8sIHF1ZWxsYSwgaWwgcXVhbGUsIGxhIHF1YWxlLCBsZSBxdWFsaSwgaSBxdWFsaSwgaWwsIGxvLCBsYSwgaSwgZ2xpLCBsZSwgbG9ybywgcXVpbmRpLCBsXHUwMGVjLCBxdWVzdGUsIHF1ZXN0aSwgZXNzaSwgZXNzZSwgcXVlc3RvLCBxdWVzdGEsIGEsIHBlciwgZXJhLCBjb3NhLCBxdWFsZSwgcXVhbGksIHF1YW5kbywgZG92ZSwgY2hpLCBzYXJcdTAwZTAsIGNvbg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkc19qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMDU2MTJlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgU2VhcmNoIFN0b3AgV29yZHMNCi1TZWFyY2guc3RvcFdvcmRzPWEsIGFib3V0LCBhbiwgYW5kLCBhcmUsIGFzLCBhdCwgYmUsIGJ1dCwgYnksIGZvciwgZnJvbSwgaG93LCBpLCBpZiwgaW4sIGludG8sIGlzLCBpdCwgbm8sIG5vdCwgb2YsIG9uLCBvciwgcywgc3VjaCwgdCwgdGhhdCwgdGhlLCB0aGVpciwgdGhlbiwgdGhlcmUsIHRoZXNlLCB0aGV5LCB0aGlzLCB0bywgd2FzLCB3aGF0LCB3aGVuLCB3aGVyZSwgd2hvLCB3aWxsLCB3aXRoDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIwNTYxMmUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBTZWFyY2ggU3RvcCBXb3Jkcw0KLVNlYXJjaC5zdG9wV29yZHM9YSwgYWJvdXQsIGFuLCBhbmQsIGFyZSwgYXMsIGF0LCBiZSwgYnV0LCBieSwgZm9yLCBmcm9tLCBob3csIGksIGlmLCBpbiwgaW50bywgaXMsIGl0LCBubywgbm90LCBvZiwgb24sIG9yLCBzLCBzdWNoLCB0LCB0aGF0LCB0aGUsIHRoZWlyLCB0aGVuLCB0aGVyZSwgdGhlc2UsIHRoZXksIHRoaXMsIHRvLCB3YXMsIHdoYXQsIHdoZW4sIHdoZXJlLCB3aG8sIHdpbGwsIHdpdGgNCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2U4YWQyNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFNlYXJjaCBTdG9wIFdvcmRzDQotU2VhcmNoLnN0b3BXb3Jkcz11bSwgc29icmUsIHVtLCBlLCBzXHUwMGUzbywgY29tbywgZW0sIHNlciwgbWFzLCBwb3IsIHBhcmEsIGRlLCBjb21vLCBldSwgc2UsIGVtLCBwYXJhLCBcdTAwZTksIGVsZSwgblx1MDBlM28sIG5cdTAwZTNvLCBkZSwgZW0sIG91LCBzLCB0YWwsIHQsIGVzc2UsIG8sIHNldXMsIGVudFx1MDBlM28sIGxcdTAwZTEsIGVzdGVzLCBlbGVzLCBlc3RlLCBwYXJhLCBlcmEsIG8gcXVlLCBxdWFuZG8sb25kZSwgcXVlbSwgaXJcdTAwZTEsIGNvbQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkc196aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMDU2MTJlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgU2VhcmNoIFN0b3AgV29yZHMNCi1TZWFyY2guc3RvcFdvcmRzPWEsIGFib3V0LCBhbiwgYW5kLCBhcmUsIGFzLCBhdCwgYmUsIGJ1dCwgYnksIGZvciwgZnJvbSwgaG93LCBpLCBpZiwgaW4sIGludG8sIGlzLCBpdCwgbm8sIG5vdCwgb2YsIG9uLCBvciwgcywgc3VjaCwgdCwgdGhhdCwgdGhlLCB0aGVpciwgdGhlbiwgdGhlcmUsIHRoZXNlLCB0aGV5LCB0aGlzLCB0bywgd2FzLCB3aGF0LCB3aGVuLCB3aGVyZSwgd2hvLCB3aWxsLCB3aXRoDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfemhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIwNTYxMmUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfemhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBTZWFyY2ggU3RvcCBXb3Jkcw0KLVNlYXJjaC5zdG9wV29yZHM9YSwgYWJvdXQsIGFuLCBhbmQsIGFyZSwgYXMsIGF0LCBiZSwgYnV0LCBieSwgZm9yLCBmcm9tLCBob3csIGksIGlmLCBpbiwgaW50bywgaXMsIGl0LCBubywgbm90LCBvZiwgb24sIG9yLCBzLCBzdWNoLCB0LCB0aGF0LCB0aGUsIHRoZWlyLCB0aGVuLCB0aGVyZSwgdGhlc2UsIHRoZXksIHRoaXMsIHRvLCB3YXMsIHdoYXQsIHdoZW4sIHdoZXJlLCB3aG8sIHdpbGwsIHdpdGgNCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3MWMzNjguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTE2NjkyMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgU2VhcmNoIChOTDIpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTRmY2E3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcnUucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MmYwZjkwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVx1MDQxZlx1MDQzZVx1MDQzOFx1MDQ0MVx1MDQzYSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDNiOTE0Yy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEluZGV4aW5nIHByb2dyZXNzIG1vbml0b3INCi1pbmRleENvbmZpZ0ZpbGVzVGFza19uYW1lPVx1MDQxOFx1MDQzZFx1MDQzNFx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Li4uDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxYzMzMGEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBTZWFyY2ggU3RvcCBXb3Jkcw0KLVNlYXJjaC5zdG9wV29yZHM9YSwgYWJvdXQsIGFuLCBhbmQsIGFyZSwgYXMsIGF0LCBiZSwgYnV0LCBieSwgZm9yLCBmcm9tLCBob3csIGksIGlmLCBpbiwgaW50bywgaXMsIGl0LCBubywgbm90LCBvZiwgb24sIG9yLCBzLCBzdWNoLCB0LCB0aGF0LCB0aGUsIHRoZWlyLCB0aGVuLCB0aGVyZSwgdGhlc2UsIHRoZXksIHRoaXMsIHRvLCB3YXMsIHdoYXQsIHdoZW4sIHdoZXJlLCB3aG8sIHdpbGwsIHdpdGgsIFx1MDQzMCwgXHUwNDMxXHUwNDM1XHUwNDM3LCBcdTA0MzFcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzUsIFx1MDQzMVx1MDQ0YiwgXHUwNDMxXHUwNDRiXHUwNDNiLCBcdTA0MzFcdTA0NGJcdTA0M2JcdTA0MzAsIFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzOCwgXHUwNDMxXHUwNDRiXHUwNDNiXHUwNDNlLCBcdTA0MzFcdTA0NGJcdTA0NDJcdTA0NGMsIFx1MDQzMiwgXHUwNDMyXHUwNDMwXHUwNDNjLCBcdTA0MzJcdTA0MzBcdTA0NDEsIFx1MDQzMlx1MDQzNVx1MDQ0MVx1MDQ0YywgXHUwNDMyXHUwNDNlLCBcdTA0MzJcdTA0M2VcdTA0NDIsIFx1MDQzMlx1MDQ0MVx1MDQzNSwgXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDMzXHUwNDNlLCBcdTA0MzJcdTA0NDFcdTA0MzVcdTA0NDUsIFx1MDQzMlx1MDQ0YiwgXHUwNDMzXHUwNDM0XHUwNDM1LCBcdTA0MzRcdTA0MzAsIFx1MDQzNFx1MDQzMFx1MDQzNlx1MDQzNSwgXHUwNDM0XHUwNDNiXHUwNDRmLCBcdTA0MzRcdTA0M2UsIFx1MDQzNVx1MDQzM1x1MDQzZSwgXHUwNDM1XHUwNDM1LCBcdTA0MzVcdTA0NDFcdTA0M2JcdTA0MzgsIFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0YywgXHUwNDM1XHUwNDQ5XHUwNDM1LCBcdTA0MzZcdTA0MzUsIFx1MDQzN1x1MDQzMCwgXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDQxXHUwNDRjLCBcdTA0MzgsIFx1MDQzOFx1MDQzNywgXHUwNDM4XHUwNDNiXHUwNDM4LCBcdTA0MzhcdTA0M2MsIFx1MDQzOFx1MDQ0NSwgXHUwNDNhLCBcdTA0M2FcdTA0MzBcdTA0M2EsIFx1MDQzYVx1MDQzZSwgXHUwNDNhXHUwNDNlXHUwNDMzXHUwNDM0XHUwNDMwLCBcdTA0M2FcdTA0NDJcdTA0M2UsIFx1MDQzYlx1MDQzOCwgXHUwNDNiXHUwNDM4XHUwNDMxXHUwNDNlLCBcdTA0M2NcdTA0M2RcdTA0MzUsIFx1MDQzY1x1MDQzZVx1MDQzNlx1MDQzNVx1MDQ0MiwgXHUwNDNjXHUwNDRiLCBcdTA0M2RcdTA0MzAsIFx1MDQzZFx1MDQzMFx1MDQzNFx1MDQzZSwgXHUwNDNkXHUwNDMwXHUwNDQ4LCBcdTA0M2RcdTA0MzUsIFx1MDQzZFx1MDQzNVx1MDQzM1x1MDQzZSwgXHUwNDNkXHUwNDM1XHUwNDM1LCBcdTA0M2RcdTA0MzVcdTA0NDIsIFx1MDQzZFx1MDQzOCwgXHUwNDNkXHUwNDM4XHUwNDQ1LCBcdTA0M2RcdTA0M2UsIFx1MDQzZFx1MDQ0MywgXHUwNDNlLCBcdTA0M2VcdTA0MzEsIFx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzMFx1MDQzYVx1MDQzZSwgXHUwNDNlXHUwNDNkLCBcdTA0M2VcdTA0M2RcdTA0MzAsIFx1MDQzZVx1MDQzZFx1MDQzOCwgXHUwNDNlXHUwNDNkXHUwNDNlLCBcdTA0M2VcdTA0NDIsIFx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQ0YywgXHUwNDNmXHUwNDNlLCBcdTA0M2ZcdTA0M2VcdTA0MzQsIFx1MDQzZlx1MDQ0MFx1MDQzOCwgXHUwNDQxLCBcdTA0NDFcdTA0M2UsIFx1MDQ0Mlx1MDQzMFx1MDQzYSwgXHUwNDQyXHUwNDMwXHUwNDNhXHUwNDM2XHUwNDM1LCBcdTA0NDJcdTA0MzBcdTA0M2FcdTA0M2VcdTA0MzksIFx1MDQ0Mlx1MDQzMFx1MDQzYywgXHUwNDQyXHUwNDM1LCBcdTA0NDJcdTA0MzVcdTA0M2MsIFx1MDQ0Mlx1MDQzZSwgXHUwNDQyXHUwNDNlXHUwNDMzXHUwNDNlLCBcdTA0NDJcdTA0M2VcdTA0MzZcdTA0MzUsIFx1MDQ0Mlx1MDQzZVx1MDQzOSwgXHUwNDQyXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlLCBcdTA0NDJcdTA0M2VcdTA0M2MsIFx1MDQ0Mlx1MDQ0YiwgXHUwNDQzLCBcdTA0NDNcdTA0MzZcdTA0MzUsIFx1MDQ0NVx1MDQzZVx1MDQ0Mlx1MDQ0ZiwgXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlLCBcdTA0NDdcdTA0MzVcdTA0MzksIFx1MDQ0N1x1MDQzNVx1MDQzYywgXHUwNDQ3XHUwNDQyXHUwNDNlLCBcdTA0NDdcdTA0NDJcdTA0M2VcdTA0MzFcdTA0NGIsIFx1MDQ0N1x1MDQ0Y1x1MDQzNSwgXHUwNDQ3XHUwNDRjXHUwNDRmLCBcdTA0NGRcdTA0NDJcdTA0MzAsIFx1MDQ0ZFx1MDQ0Mlx1MDQzOCwgXHUwNDRkXHUwNDQyXHUwNDNlLCBcdTA0NGYNCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDI5NDg3Yy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDJhPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzU2MWI5OC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIFNlYXJjaCAoTkwyYSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDJhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0ZTY4MjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGEucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1ZDdiZWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIHNcdTAwZjhnbmluZw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkZWZhYjQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgSW5kZXhpbmcgcHJvZ3Jlc3MgbW9uaXRvcg0KLWluZGV4Q29uZmlnRmlsZXNUYXNrX25hbWU9SW5kZWtzZXJlciBrb25maWd1cmF0aW9uc2ZpbGVyLi4uDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODI1ZTFhMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBTZWFyY2ggU3RvcCBXb3Jkcw0KLVNlYXJjaC5zdG9wV29yZHM9ZW4sIG9tLCBldCwgb2csIGVyLCBzb20sIHZlZCwgdlx1MDBlNnJlLCBtZW4sIGFmLCBmb3IsIGZyYSwgaHZvcmRhbiwgamVnLCBodmlzLCBpLCBpbmQsIGRlbiwgZGV0LCBpbmdlbiwgaWtrZSwgYWYsIHBcdTAwZTUsIGVsbGVyLCBzLCBzXHUwMGU1ZGFuLCB0LCBkZXQsIGRlbm5lLCBkZXJlcywgZGVyZWZ0ZXIsIGRlciwgZGlzc2UsIGRlLCBkZXR0ZSwgdGlsLCB2YXIsIGh2YWQsIGh2b3JuXHUwMGU1ciwgaHZvciwgaHZlbSwgdmlsLCBtZWQNCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmZjA1NWMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzkyYzk2Mi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgU2VhcmNoIFVJIChOTDEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjk0OGM5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOGJhZWI4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIEJlbnV0emVyc2Nobml0dHN0ZWxsZSBmXHUwMGZjciBTdWNoZQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBEaWFsb2cNCi1tZXRob2RTZWFyY2hEaWFsb2dMYWJlbD1NZXRob2RlbnN1Y2hlDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiN2Q1ZjEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9VUkgZGUgYlx1MDBmYXNxdWVkYSBkZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIE1ldGhvZCBTZWFyY2ggRGlhbG9nDQotbWV0aG9kU2VhcmNoRGlhbG9nTGFiZWw9Qlx1MDBmYXNxdWVkYSBkZSBtXHUwMGU5dG9kbw0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZjNlZGFhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUludGVyZmFjZSB1dGlsaXNhdGV1ciBkZSByZWNoZXJjaGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBNZXRob2QgU2VhcmNoIERpYWxvZw0KLW1ldGhvZFNlYXJjaERpYWxvZ0xhYmVsPVJlY2hlcmNoZSBkZSBtXHUwMGU5dGhvZGUNCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5faXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmUyZGUwMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1VSSBkaSByaWNlcmNhIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBEaWFsb2cNCi1tZXRob2RTZWFyY2hEaWFsb2dMYWJlbD1SaWNlcmNhIG1ldG9kbw0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OGQ4ZWE2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBTZWFyY2ggVUkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIE1ldGhvZCBTZWFyY2ggRGlhbG9nDQotbWV0aG9kU2VhcmNoRGlhbG9nTGFiZWw9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OTFjXHU3ZDIyDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzZGNiMzQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1YWM4MFx1YzBjOSBVSQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBEaWFsb2cNCi1tZXRob2RTZWFyY2hEaWFsb2dMYWJlbD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhYzgwXHVjMGM5DQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5YTJkMzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9VUkgZGUgUHJvY3VyYSBkbyBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIE1ldGhvZCBTZWFyY2ggRGlhbG9nDQotbWV0aG9kU2VhcmNoRGlhbG9nTGFiZWw9UHJvY3VyYSBkZSBNXHUwMGU5dG9kbw0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNmRhNGMzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTY0MWNcdTdkMjJcdTc1MjhcdTYyMzdcdTc1NGNcdTk3NjINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIE1ldGhvZCBTZWFyY2ggRGlhbG9nDQotbWV0aG9kU2VhcmNoRGlhbG9nTGFiZWw9XHU2NWI5XHU2Y2Q1XHU2NDFjXHU3ZDIyDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3MDEzZTUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFNlYXJjaCBVSQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBEaWFsb2cNCi1tZXRob2RTZWFyY2hEaWFsb2dMYWJlbD1cdTY1YjlcdTZjZDVcdTY0MWNcdTVjMGINCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWM4MmMwNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBNZXRob2QgU2VhcmNoIFBhZ2UNCi1zZWFyY2hTdHJpbmdMYWJlbF90ZXh0PVRleHQgKCogPSBiZWxpZWJpZ2UgWmVpY2hlbmZvbGdlLCA/ID0gYmVsaWViaWdlcyBaZWljaGVuKToNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1Hcm9cdTAwZGYtL0tsZWluc2NocmVpYnVuZyBiZWFjaHRlbg0KLWVsZW1lbnROYW1lTGFiZWxfdGV4dD1OYW1lIGRlcyBNZXRob2RlbmVsZW1lbnRzIG9kZXIgTXVzdGVyIGZcdTAwZmNyIFByXHUwMGU0c2VudGF0aW9uc25hbWVuOg0KLXNjb3BlR3JvdXBfdGV4dD1TY29wZQ0KLXJvbGVDaGVja2JveF90ZXh0PVJvbGxlDQotdGFza0NoZWNrYm94X3RleHQ9QXVmZ2FiZQ0KLXdvcmtQcm9kdWN0Q2hlY2tib3hfdGV4dD1BcmJlaXRzZXJnZWJuaXMNCi0NCi0jIE1ldGhvZCBTZWFyY2ggUXVlcnkNCi1zZWFyY2hRdWVyeV90ZXh0PU1ldGhvZGVuc3VjaGUNCi0NCi0jIE1ldGhvZCBTZWFyY2ggUHJvZ3Jlc3MgRGlhbG9nDQotc2NhbkxpYnJhcnlUYXNrX25hbWU9TWV0aG9kZW5iaWJsaW90aGVrIHdpcmQgZHVyY2hzdWNodC4uLg0KLXNjYW5FbGVtZW50VGFza19uYW1lPU1ldGhvZGVuZWxlbWVudCAnJ3swfScnIHdpcmQgZ2VzdWNodC4uLg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBFcnJvciBEaWFsb2cNCi1zZWFyY2hFcnJvcl90aXRsZT1NZXRob2RlbnN1Y2hlDQotc2VhcmNoRXJyb3JfbXNnPUlVUFMwMTAwRTogRGllIFN1Y2hvcGVyYXRpb24ga2FubiBuaWNodCBmb3J0Z2VzZXR6dCB3ZXJkZW4uDQotc2VhcmNoRXJyb3JfcmVhc29uPUVzIGlzdCBkZXJ6ZWl0IGtlaW5lIE1ldGhvZGVuYmlibGlvdGhlayBnZVx1MDBmNmZmbmV0LlxuXG5cdTAwZDZmZm5lbiBTaWUgZWluZSBNZXRob2RlbmJpYmxpb3RoZWsgdW5kIHdpZWRlcmhvbGVuIFNpZSBkZW4gVm9yZ2FuZy4NCi0NCi0jIE1ldGhvZCBTZWFyY2ggUmVzdWx0DQotc2VhcmNoUmVzdWx0X21ldGhvZENvbnRlbnQ9TWV0aG9kZW5pbmhhbHQNCi1zZWFyY2hSZXN1bHRfY29udGVudFBhY2thZ2VzPUluaGFsdHNwYWtldGUNCi1zZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzPVN0YW5kYXJka2F0ZWdvcmllbg0KLXNlYXJjaFJlc3VsdF9kaXNjaXBsaW5lcz1EaXN6aXBsaW5lbg0KLXNlYXJjaFJlc3VsdF9kb21haW5zPURvbVx1MDBlNG5lbg0KLXNlYXJjaFJlc3VsdF93b3JrUHJvZHVjdFR5cGVzPUFyYmVpdHNlcmdlYm5pc3R5cGVuDQotc2VhcmNoUmVzdWx0X3JvbGVTZXRzPVJvbGxlbmdydXBwZW4NCi1zZWFyY2hSZXN1bHRfdG9vbHM9VG9vbHMNCi1zZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllcz1BbmdlcGFzc3RlIEthdGVnb3JpZW4NCi1zZWFyY2hSZXN1bHRfcHJvY2Vzc2VzPVByb3plc3NlDQotc2VhcmNoUmVzdWx0X2NhcGFiaWxpdHlQYXR0ZXJucz1Qcm96ZXNzbXVzdGVyDQotc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzPUJlcmVpdHN0ZWxsdW5nc3Byb3plc3NlDQotc2VhcmNoUmVzdWx0X21hdGNoPScnezB9JycgLSAxIFx1MDBkY2JlcmVpbnN0aW1tdW5nDQotc2VhcmNoUmVzdWx0X21hdGNoZXM9Jyd7MH0nJyAtIHsxfSBcdTAwZGNiZXJlaW5zdGltbXVuZ2VuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmYTg4NmYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBQYWdlDQotc2VhcmNoU3RyaW5nTGFiZWxfdGV4dD1UZXh0byAoKiA9IGN1YWxxdWllciBjYWRlbmEgZGUgY2FyYWN0ZXJlcywgPyA9IGN1YWxxdWllciBjYXJcdTAwZTFjdGVyKToNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1TZW5zaWJsZSBhIG1heVx1MDBmYXNjdWxhcyB5IG1pblx1MDBmYXNjdWxhcw0KLWVsZW1lbnROYW1lTGFiZWxfdGV4dD1Ob21icmUgZGVsIGVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvIG8gcGF0clx1MDBmM24gZGVsIG5vbWJyZSBkZSBwcmVzZW50YWNpXHUwMGYzbjoNCi1zY29wZUdyb3VwX3RleHQ9XHUwMGMxbWJpdG8NCi1yb2xlQ2hlY2tib3hfdGV4dD1Sb2wNCi10YXNrQ2hlY2tib3hfdGV4dD1UYXJlYQ0KLXdvcmtQcm9kdWN0Q2hlY2tib3hfdGV4dD1Qcm9kdWN0byBkZSB0cmFiYWpvDQotDQotIyBNZXRob2QgU2VhcmNoIFF1ZXJ5DQotc2VhcmNoUXVlcnlfdGV4dD1CXHUwMGZhc3F1ZWRhIGRlIG1cdTAwZTl0b2RvDQotDQotIyBNZXRob2QgU2VhcmNoIFByb2dyZXNzIERpYWxvZw0KLXNjYW5MaWJyYXJ5VGFza19uYW1lPUV4cGxvcmFuZG8gbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuLi4NCi1zY2FuRWxlbWVudFRhc2tfbmFtZT1FeHBsb3JhbmRvIGVsIGVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvICcnezB9JycuLi4NCi0NCi0jIE1ldGhvZCBTZWFyY2ggRXJyb3IgRGlhbG9nDQotc2VhcmNoRXJyb3JfdGl0bGU9Qlx1MDBmYXNxdWVkYSBkZSBtXHUwMGU5dG9kbw0KLXNlYXJjaEVycm9yX21zZz1JVVBTMDEwMEU6IExhIG9wZXJhY2lcdTAwZjNuIGRlIGJcdTAwZmFzcXVlZGEgbm8gcHVlZGUgY29udGludWFyLg0KLXNlYXJjaEVycm9yX3JlYXNvbj1BY3R1YWxtZW50ZSBubyBoYXkgbmluZ3VuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhYmllcnRhLlxuXG5BYnJhIHVuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotDQotIyBNZXRob2QgU2VhcmNoIFJlc3VsdA0KLXNlYXJjaFJlc3VsdF9tZXRob2RDb250ZW50PUNvbnRlbmlkbyBkZWwgbVx1MDBlOXRvZG8NCi1zZWFyY2hSZXN1bHRfY29udGVudFBhY2thZ2VzPVBhcXVldGVzIGRlIGNvbnRlbmlkbw0KLXNlYXJjaFJlc3VsdF9zdGFuZGFyZENhdGVnb3JpZXM9Q2F0ZWdvclx1MDBlZGFzIGVzdFx1MDBlMW5kYXINCi1zZWFyY2hSZXN1bHRfZGlzY2lwbGluZXM9RGlzY2lwbGluYXMNCi1zZWFyY2hSZXN1bHRfZG9tYWlucz1Eb21pbmlvcw0KLXNlYXJjaFJlc3VsdF93b3JrUHJvZHVjdFR5cGVzPVRpcG9zIGRlIHByb2R1Y3RvIGRlIHRyYWJham8NCi1zZWFyY2hSZXN1bHRfcm9sZVNldHM9Q29uanVudG9zIGRlIHJvbGVzDQotc2VhcmNoUmVzdWx0X3Rvb2xzPUhlcnJhbWllbnRhcw0KLXNlYXJjaFJlc3VsdF9jdXN0b21DYXRlZ29yaWVzPUNhdGVnb3JcdTAwZWRhcyBwZXJzb25hbGl6YWRhcw0KLXNlYXJjaFJlc3VsdF9wcm9jZXNzZXM9UHJvY2Vzb3MNCi1zZWFyY2hSZXN1bHRfY2FwYWJpbGl0eVBhdHRlcm5zPVBhdHJvbmVzIGRlIHBvc2liaWxpZGFkDQotc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzPVByb2Nlc29zIGRlIGVudHJlZ2ENCi1zZWFyY2hSZXN1bHRfbWF0Y2g9Jyd7MH0nJyAtIDEgY29pbmNpZGVuY2lhDQotc2VhcmNoUmVzdWx0X21hdGNoZXM9Jyd7MH0nJyAtIHsxfSBjb2luY2lkZW5jaWFzDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2Y2UwOTkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBQYWdlDQotc2VhcmNoU3RyaW5nTGFiZWxfdGV4dD1UZXh0ZSAoKiA9IG4naW1wb3J0ZSBxdWVsbGUgY2hhXHUwMGVlbmUsID8gPSBuJ2ltcG9ydGUgcXVlbCBjYXJhY3RcdTAwZThyZSkgOg0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PVJlc3BlY3RlciBsYSBjYXNzZQ0KLWVsZW1lbnROYW1lTGFiZWxfdGV4dD1Ob20gZCdcdTAwZTlsXHUwMGU5bWVudCBkZSBtXHUwMGU5dGhvZGUgb3UgcGF0dGVybiBkZSBub20gZGUgcHJcdTAwZTlzZW50YXRpb24gOg0KLXNjb3BlR3JvdXBfdGV4dD1Qb3J0XHUwMGU5ZQ0KLXJvbGVDaGVja2JveF90ZXh0PVJcdTAwZjRsZQ0KLXRhc2tDaGVja2JveF90ZXh0PVRcdTAwZTJjaGUNCi13b3JrUHJvZHVjdENoZWNrYm94X3RleHQ9UHJvZHVpdA0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBRdWVyeQ0KLXNlYXJjaFF1ZXJ5X3RleHQ9UmVjaGVyY2hlIGRlIG1cdTAwZTl0aG9kZQ0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBQcm9ncmVzcyBEaWFsb2cNCi1zY2FuTGlicmFyeVRhc2tfbmFtZT1TY2FubmFnZSBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzLi4uDQotc2NhbkVsZW1lbnRUYXNrX25hbWU9U2Nhbm5hZ2UgZGUgbCcnXHUwMGU5bFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlICcnezB9JycuLi4NCi0NCi0jIE1ldGhvZCBTZWFyY2ggRXJyb3IgRGlhbG9nDQotc2VhcmNoRXJyb3JfdGl0bGU9UmVjaGVyY2hlIGRlIG1cdTAwZTl0aG9kZQ0KLXNlYXJjaEVycm9yX21zZz1JVVBTMDEwMEUgOiBMJ29wXHUwMGU5cmF0aW9uIGRlIHJlY2hlcmNoZSBuZSBwZXV0IHBhcyBjb250aW51ZXIuDQotc2VhcmNoRXJyb3JfcmVhc29uPUF1Y3VuZSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIG4nZXN0IGFjdHVlbGxlbWVudCBvdXZlcnRlLlxuXG5PdXZyZXogdW5lIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZXQgclx1MDBlOS1lc3NheWV6Lg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBSZXN1bHQNCi1zZWFyY2hSZXN1bHRfbWV0aG9kQ29udGVudD1Db250ZW51IGRlIGxhIG1cdTAwZTl0aG9kZQ0KLXNlYXJjaFJlc3VsdF9jb250ZW50UGFja2FnZXM9UGFja2FnZXMgZGUgY29udGVudQ0KLXNlYXJjaFJlc3VsdF9zdGFuZGFyZENhdGVnb3JpZXM9Q2F0XHUwMGU5Z29yaWVzIHN0YW5kYXJkDQotc2VhcmNoUmVzdWx0X2Rpc2NpcGxpbmVzPURpc2NpcGxpbmVzDQotc2VhcmNoUmVzdWx0X2RvbWFpbnM9RG9tYWluZXMNCi1zZWFyY2hSZXN1bHRfd29ya1Byb2R1Y3RUeXBlcz1UeXBlcyBkZSBwcm9kdWl0cw0KLXNlYXJjaFJlc3VsdF9yb2xlU2V0cz1FbnNlbWJsZXMgZGUgclx1MDBmNGxlcw0KLXNlYXJjaFJlc3VsdF90b29scz1PdXRpbHMNCi1zZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllcz1DYXRcdTAwZTlnb3JpZXMgcGVyc29ubmFsaXNcdTAwZTllcw0KLXNlYXJjaFJlc3VsdF9wcm9jZXNzZXM9UHJvY2Vzc3VzDQotc2VhcmNoUmVzdWx0X2NhcGFiaWxpdHlQYXR0ZXJucz1QYXR0ZXJucyBkZSBjYXBhY2l0XHUwMGU5DQotc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzPVByb2Nlc3N1cyBkZSBsaXZyYWlzb24NCi1zZWFyY2hSZXN1bHRfbWF0Y2g9Jyd7MH0nJyAtIDEgY29ycmVzcG9uZGFuY2UNCi1zZWFyY2hSZXN1bHRfbWF0Y2hlcz0nJ3swfScnIC0gezF9IGNvcnJlc3BvbmRhbmNlcw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMDA5ODI2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBTZWFyY2ggUGFnZQ0KLXNlYXJjaFN0cmluZ0xhYmVsX3RleHQ9VGVzdG8gKCogPSB0dXR0ZSBsZSBzdHJpbmdoZSwgPyA9IHR1dHRpIGkgY2FyYXR0ZXJpKToNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1NYWl1c2NvbGUvTWludXNjb2xlDQotZWxlbWVudE5hbWVMYWJlbF90ZXh0PU5vbWUgZGVsbCdlbGVtZW50byBkZWwgbWV0b2RvIG9wcHVyZSBtb2RlbGxvIGRlbCBub21lIGRpIHByZXNlbnRhemlvbmUNCi1zY29wZUdyb3VwX3RleHQ9QW1iaXRvDQotcm9sZUNoZWNrYm94X3RleHQ9UnVvbG8NCi10YXNrQ2hlY2tib3hfdGV4dD1PcGVyYXppb25lDQotd29ya1Byb2R1Y3RDaGVja2JveF90ZXh0PVByb2RvdHRvIGRpIGxhdm9ybw0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBRdWVyeQ0KLXNlYXJjaFF1ZXJ5X3RleHQ9UmljZXJjYSBtZXRvZG8NCi0NCi0jIE1ldGhvZCBTZWFyY2ggUHJvZ3Jlc3MgRGlhbG9nDQotc2NhbkxpYnJhcnlUYXNrX25hbWU9U2NhbnNpb25lIGRlbGxhIGxpYnJlcmlhIGRlaSBtZXRvZGkgaW4gY29yc28uLi4NCi1zY2FuRWxlbWVudFRhc2tfbmFtZT1TY2Fuc2lvbmUgZGVsbCcnZWxlbWVudG8gZGVsIG1ldG9kbyAnJ3swfScnIGluIGNvcnNvLi4uDQotDQotIyBNZXRob2QgU2VhcmNoIEVycm9yIERpYWxvZw0KLXNlYXJjaEVycm9yX3RpdGxlPVJpY2VyY2EgbWV0b2RvDQotc2VhcmNoRXJyb3JfbXNnPUlVUFMwMTAwRTogSW1wb3NzaWJpbGUgY29udGludWFyZSBsJ29wZXJhemlvbmUgZGkgcmljZXJjYS4NCi1zZWFyY2hFcnJvcl9yZWFzb249TmVzc3VuYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGF0dHVhbG1lbnRlIGFwZXJ0YS5cblxuQXByaXJlIHVuYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGUgcHJvdmFyZSBkaSBudW92by4NCi0NCi0jIE1ldGhvZCBTZWFyY2ggUmVzdWx0DQotc2VhcmNoUmVzdWx0X21ldGhvZENvbnRlbnQ9Q29udGVudXRvIGRpIG1ldG9kbw0KLXNlYXJjaFJlc3VsdF9jb250ZW50UGFja2FnZXM9UGFjY2hldHRpIGRlbCBjb250ZW51dG8NCi1zZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzPUNhdGVnb3JpZSBzdGFuZGFyZA0KLXNlYXJjaFJlc3VsdF9kaXNjaXBsaW5lcz1EaXNjaXBsaW5lDQotc2VhcmNoUmVzdWx0X2RvbWFpbnM9RG9taW5pDQotc2VhcmNoUmVzdWx0X3dvcmtQcm9kdWN0VHlwZXM9VGlwaSBkaSBwcm9kb3R0byBkaSBsYXZvcm8NCi1zZWFyY2hSZXN1bHRfcm9sZVNldHM9SW5zaWVtaSBkaSBydW9saQ0KLXNlYXJjaFJlc3VsdF90b29scz1Ub29sDQotc2VhcmNoUmVzdWx0X2N1c3RvbUNhdGVnb3JpZXM9Q2F0ZWdvcmllIHBlcnNvbmFsaXp6YXRlDQotc2VhcmNoUmVzdWx0X3Byb2Nlc3Nlcz1Qcm9jZXNzaQ0KLXNlYXJjaFJlc3VsdF9jYXBhYmlsaXR5UGF0dGVybnM9TW9kZWxsaSBkaSBjYXBhY2l0XHUwMGUwDQotc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzPVByb2Nlc3NpIGRpIHByb2R1emlvbmUNCi1zZWFyY2hSZXN1bHRfbWF0Y2g9Jyd7MH0nJyAtIDEgY29ycmlzcG9uZGVuemENCi1zZWFyY2hSZXN1bHRfbWF0Y2hlcz0nJ3swfScnIC0gezF9IGNvcnJpc3BvbmRlbnplDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfamEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2NTgxMmYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBQYWdlDQotc2VhcmNoU3RyaW5nTGFiZWxfdGV4dD1cdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzggKCogPSBcdTRlZmJcdTYxMGZcdTMwNmVcdTMwYjlcdTMwYzhcdTMwZWFcdTMwZjNcdTMwYjBcdTMwMDE/ID0gXHU0ZWZiXHU2MTBmXHUzMDZlXHU2NTg3XHU1YjU3KToNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1cdTU5MjcvXHU1YzBmXHU2NTg3XHU1YjU3XHUzMDkyXHU1MzNhXHU1MjI1XHUzMDU5XHUzMDhiDQotZWxlbWVudE5hbWVMYWJlbF90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1NTQwZFx1MzA3ZVx1MzA1Zlx1MzA2Zlx1ODg2OFx1NzkzYVx1NTQwZFx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmMzoNCi1zY29wZUdyb3VwX3RleHQ9XHU3YmM0XHU1NmYyDQotcm9sZUNoZWNrYm94X3RleHQ9XHUzMGVkXHUzMGZjXHUzMGViDQotdGFza0NoZWNrYm94X3RleHQ9XHUzMGJmXHUzMGI5XHUzMGFmDQotd29ya1Byb2R1Y3RDaGVja2JveF90ZXh0PVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBRdWVyeQ0KLXNlYXJjaFF1ZXJ5X3RleHQ9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OTFjXHU3ZDIyDQotDQotIyBNZXRob2QgU2VhcmNoIFByb2dyZXNzIERpYWxvZw0KLXNjYW5MaWJyYXJ5VGFza19uYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1MzBiOVx1MzBhZFx1MzBlM1x1MzBmM1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLXNjYW5FbGVtZW50VGFza19uYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMCAnJ3swfScnIFx1MzA5Mlx1MzBiOVx1MzBhZFx1MzBlM1x1MzBmM1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBFcnJvciBEaWFsb2cNCi1zZWFyY2hFcnJvcl90aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5MWNcdTdkMjINCi1zZWFyY2hFcnJvcl9tc2c9SVVQUzAxMDBFOiBcdTY5MWNcdTdkMjJcdTY0Y2RcdTRmNWNcdTMwOTJcdTdkOWFcdTg4NGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1zZWFyY2hFcnJvcl9yZWFzb249XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDRjXHU3M2ZlXHU1NzI4XHU5NThiXHUzMDRiXHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cblx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0ZFx1MzAwMVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBSZXN1bHQNCi1zZWFyY2hSZXN1bHRfbWV0aG9kQ29udGVudD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQNCi1zZWFyY2hSZXN1bHRfY29udGVudFBhY2thZ2VzPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzBmYlx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOA0KLXNlYXJjaFJlc3VsdF9zdGFuZGFyZENhdGVnb3JpZXM9XHU2YTE5XHU2ZTk2XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjDQotc2VhcmNoUmVzdWx0X2Rpc2NpcGxpbmVzPVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZQ0KLXNlYXJjaFJlc3VsdF9kb21haW5zPVx1MzBjOVx1MzBlMVx1MzBhNFx1MzBmMw0KLXNlYXJjaFJlc3VsdF93b3JrUHJvZHVjdFR5cGVzPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzBmYlx1MzBiZlx1MzBhNFx1MzBkNw0KLXNlYXJjaFJlc3VsdF9yb2xlU2V0cz1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzgNCi1zZWFyY2hSZXN1bHRfdG9vbHM9XHUzMGM0XHUzMGZjXHUzMGViDQotc2VhcmNoUmVzdWx0X2N1c3RvbUNhdGVnb3JpZXM9XHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjDQotc2VhcmNoUmVzdWx0X3Byb2Nlc3Nlcz1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1zZWFyY2hSZXN1bHRfY2FwYWJpbGl0eVBhdHRlcm5zPVx1MzBiMVx1MzBmY1x1MzBkMVx1MzBkM1x1MzBlYVx1MzBjNlx1MzBhM1x1MzBmY1x1MzBmYlx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmMw0KLXNlYXJjaFJlc3VsdF9kZWxpdmVyeVByb2Nlc3Nlcz1cdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1zZWFyY2hSZXN1bHRfbWF0Y2g9Jyd7MH0nJyAtIDEgXHU1MDBiXHUzMDZlXHU0ZTAwXHU4MWY0DQotc2VhcmNoUmVzdWx0X21hdGNoZXM9Jyd7MH0nJyAtIHsxfSBcdTUwMGJcdTMwNmVcdTRlMDBcdTgxZjQNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmYzNTMwOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBNZXRob2QgU2VhcmNoIFBhZ2UNCi1zZWFyY2hTdHJpbmdMYWJlbF90ZXh0PVx1ZDE0ZFx1YzJhNFx1ZDJiOCgqID0gXHVjNzg0XHVjNzU4XHVjNzU4IFx1YmIzOFx1Yzc5MFx1YzVmNCwgPyA9IFx1Yzc4NFx1Yzc1OFx1Yzc1OCBcdWJiMzhcdWM3OTApOiA9IFx1Yzc4NFx1Yzc1OFx1Yzc1OCBcdWJiMzhcdWM3OTApOg0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PVx1YjMwMFx1YzE4Y1x1YmIzOFx1Yzc5MCBcdWFkNmNcdWJkODQNCi1lbGVtZW50TmFtZUxhYmVsX3RleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4YyBcdWM3NzRcdWI5ODQgXHViNjEwXHViMjk0IFx1ZDQ1Y1x1YzJkYyBcdWM3NzRcdWI5ODQgXHVkMzI4XHVkMTM0Og0KLXNjb3BlR3JvdXBfdGV4dD1cdWJjOTRcdWM3MDQNCi1yb2xlQ2hlY2tib3hfdGV4dD1cdWM1ZWRcdWQ1NjANCi10YXNrQ2hlY2tib3hfdGV4dD1cdWQwYzBcdWMyYTRcdWQwNmMNCi13b3JrUHJvZHVjdENoZWNrYm94X3RleHQ9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBRdWVyeQ0KLXNlYXJjaFF1ZXJ5X3RleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1YWM4MFx1YzBjOQ0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBQcm9ncmVzcyBEaWFsb2cNCi1zY2FuTGlicmFyeVRhc2tfbmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YzJhNFx1Y2U5NCBcdWM5MTEuLi4NCi1zY2FuRWxlbWVudFRhc2tfbmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjICcnezB9JycgXHVjMmE0XHVjZTk0IFx1YzkxMS4uLg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBFcnJvciBEaWFsb2cNCi1zZWFyY2hFcnJvcl90aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhYzgwXHVjMGM5DQotc2VhcmNoRXJyb3JfbXNnPUlVUFMwMTAwRTogXHVhYzgwXHVjMGM5IFx1Yzg3MFx1Yzc5MVx1Yzc0NCBcdWM5YzRcdWQ1ODlcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1zZWFyY2hFcnJvcl9yZWFzb249XHVkNjA0XHVjN2FjIFx1YzVmNFx1YjgyNCBcdWM3ODhcdWIyOTQgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YWMwMCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cblx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjNWY0XHVhY2UwIFx1YjJlNFx1YzJkYyBcdWMyZGNcdWIzYzRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotIyBNZXRob2QgU2VhcmNoIFJlc3VsdA0KLXNlYXJjaFJlc3VsdF9tZXRob2RDb250ZW50PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWNlZThcdWQxNTBcdWNlMjANCi1zZWFyY2hSZXN1bHRfY29udGVudFBhY2thZ2VzPVx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWQzMjhcdWQwYTRcdWM5YzANCi1zZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzPVx1ZDQ1Y1x1YzkwMCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMNCi1zZWFyY2hSZXN1bHRfZGlzY2lwbGluZXM9XHVjNmQwXHVjZTU5DQotc2VhcmNoUmVzdWx0X2RvbWFpbnM9XHViM2M0XHViYTU0XHVjNzc4DQotc2VhcmNoUmVzdWx0X3dvcmtQcm9kdWN0VHlwZXM9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWM3MjBcdWQ2MTUNCi1zZWFyY2hSZXN1bHRfcm9sZVNldHM9XHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOA0KLXNlYXJjaFJlc3VsdF90b29scz1cdWIzYzRcdWFkNmMNCi1zZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllcz1cdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYw0KLXNlYXJjaFJlc3VsdF9wcm9jZXNzZXM9XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotc2VhcmNoUmVzdWx0X2NhcGFiaWxpdHlQYXR0ZXJucz1cdWFlMzBcdWIyYTUgXHVkMzI4XHVkMTM0DQotc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzPVx1YzgwNFx1YjJlYyBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1zZWFyY2hSZXN1bHRfbWF0Y2g9Jyd7MH0nJyAtIDEgXHVjNzdjXHVjZTU4DQotc2VhcmNoUmVzdWx0X21hdGNoZXM9Jyd7MH0nJyAtIHsxfSBcdWM3N2NcdWNlNTgNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGFjY2FhMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBNZXRob2QgU2VhcmNoIFBhZ2UNCi1zZWFyY2hTdHJpbmdMYWJlbF90ZXh0PVRleHRvICgqID0gcXVhbHF1ZXIgY2FkZWlhLCA/ID0gcXVhbHF1ZXIgY2FyYWN0ZXJlKToNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1TZW5zXHUwMGVkdmVsIGEgbWFpXHUwMGZhc2N1bGFzIGUgbWluXHUwMGZhc2N1bGFzDQotZWxlbWVudE5hbWVMYWJlbF90ZXh0PU5vbWUgZG8gZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gb3UgcGFkclx1MDBlM28gZG8gbm9tZSBkZSBhcHJlc2VudGFcdTAwZTdcdTAwZTNvOg0KLXNjb3BlR3JvdXBfdGV4dD1Fc2NvcG8NCi1yb2xlQ2hlY2tib3hfdGV4dD1GdW5cdTAwZTdcdTAwZTNvDQotdGFza0NoZWNrYm94X3RleHQ9VGFyZWZhDQotd29ya1Byb2R1Y3RDaGVja2JveF90ZXh0PVByb2R1dG8gZGUgVHJhYmFsaG8NCi0jIE1ldGhvZCBTZWFyY2ggUXVlcnkNCi1zZWFyY2hRdWVyeV90ZXh0PVByb2N1cmEgZGUgTVx1MDBlOXRvZG8NCi0NCi0jIE1ldGhvZCBTZWFyY2ggUHJvZ3Jlc3MgRGlhbG9nDQotc2NhbkxpYnJhcnlUYXNrX25hbWU9VmFycmVuZG8gYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuLi4NCi1zY2FuRWxlbWVudFRhc2tfbmFtZT1WYXJyZW5kbyBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyAnJ3swfScnLi4uDQotDQotIyBNZXRob2QgU2VhcmNoIEVycm9yIERpYWxvZw0KLXNlYXJjaEVycm9yX3RpdGxlPVByb2N1cmEgZGUgTVx1MDBlOXRvZG8NCi1zZWFyY2hFcnJvcl9tc2c9SVVQUzAxMDBFOiBBIG9wZXJhXHUwMGU3XHUwMGUzbyBkZSBwcm9jdXJhIG5cdTAwZTNvIHBvZGUgY29udGludWFyLg0KLXNlYXJjaEVycm9yX3JlYXNvbj1OZW5odW1hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGVzdFx1MDBlMSBhYmVydGEgbm8gbW9tZW50by5cblxuQWJyYSB1bWEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZSB0ZW50ZSBub3ZhbWVudGUuDQotDQotIyBNZXRob2QgU2VhcmNoIFJlc3VsdA0KLXNlYXJjaFJlc3VsdF9tZXRob2RDb250ZW50PUNvbnRlXHUwMGZhZG8gZG8gTVx1MDBlOXRvZG8NCi1zZWFyY2hSZXN1bHRfY29udGVudFBhY2thZ2VzPVBhY290ZXMgZGUgQ29udGVcdTAwZmFkbw0KLXNlYXJjaFJlc3VsdF9zdGFuZGFyZENhdGVnb3JpZXM9Q2F0ZWdvcmlhcyBQYWRyXHUwMGUzbw0KLXNlYXJjaFJlc3VsdF9kaXNjaXBsaW5lcz1EaXNjaXBsaW5hcw0KLXNlYXJjaFJlc3VsdF9kb21haW5zPURvbVx1MDBlZG5pb3MNCi1zZWFyY2hSZXN1bHRfd29ya1Byb2R1Y3RUeXBlcz1UaXBvcyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotc2VhcmNoUmVzdWx0X3JvbGVTZXRzPUNvbmp1bnRvcyBkZSBGdW5cdTAwZTdcdTAwZjVlcw0KLXNlYXJjaFJlc3VsdF90b29scz1GZXJyYW1lbnRhcw0KLXNlYXJjaFJlc3VsdF9jdXN0b21DYXRlZ29yaWVzPUNhdGVnb3JpYXMgUGVyc29uYWxpemFkYXMNCi1zZWFyY2hSZXN1bHRfcHJvY2Vzc2VzPVByb2Nlc3Nvcw0KLXNlYXJjaFJlc3VsdF9jYXBhYmlsaXR5UGF0dGVybnM9UGFkclx1MDBmNWVzIGRlIFJlY3Vyc28NCi1zZWFyY2hSZXN1bHRfZGVsaXZlcnlQcm9jZXNzZXM9UHJvY2Vzc29zIGRlIEVudHJlZ2ENCi1zZWFyY2hSZXN1bHRfbWF0Y2g9Jyd7MH0nJyAtIDEgY29ycmVzcG9uZFx1MDBlYW5jaWENCi1zZWFyY2hSZXN1bHRfbWF0Y2hlcz0nJ3swfScnIC0gezF9IGNvcnJlc3BvbmRcdTAwZWFuY2lhcw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzM1ZTA4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBTZWFyY2ggUGFnZQ0KLXNlYXJjaFN0cmluZ0xhYmVsX3RleHQ9XHU2NTg3XHU2NzJjXHVmZjA4KiA9IFx1NGVmYlx1NjEwZlx1NWI1N1x1N2IyNlx1NGUzMlx1ZmYwYz8gPSBcdTRlZmJcdTYxMGZcdTViNTdcdTdiMjZcdWZmMDlcdWZmMWENCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1cdTUzM2FcdTUyMDZcdTU5MjdcdTVjMGZcdTUxOTkNCi1lbGVtZW50TmFtZUxhYmVsX3RleHQ9XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3OWYwXHU2MjE2XHU2NjNlXHU3OTNhXHU1NDBkXHU3OWYwXHU2YTIxXHU1ZjBmXHVmZjFhDQotc2NvcGVHcm91cF90ZXh0PVx1ODMwM1x1NTZmNA0KLXJvbGVDaGVja2JveF90ZXh0PVx1ODlkMlx1ODI3Mg0KLXRhc2tDaGVja2JveF90ZXh0PVx1NGVmYlx1NTJhMQ0KLXdvcmtQcm9kdWN0Q2hlY2tib3hfdGV4dD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzENCi0NCi0jIE1ldGhvZCBTZWFyY2ggUXVlcnkNCi1zZWFyY2hRdWVyeV90ZXh0PVx1NjViOVx1NmNkNVx1NjQxY1x1N2QyMg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBQcm9ncmVzcyBEaWFsb2cNCi1zY2FuTGlicmFyeVRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTYyNmJcdTYzY2ZcdTY1YjlcdTZjZDVcdTVlOTMuLi4NCi1zY2FuRWxlbWVudFRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTYyNmJcdTYzY2ZcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTIwMWN7MH1cdTIwMWQuLi4NCi0NCi0jIE1ldGhvZCBTZWFyY2ggRXJyb3IgRGlhbG9nDQotc2VhcmNoRXJyb3JfdGl0bGU9XHU2NWI5XHU2Y2Q1XHU2NDFjXHU3ZDIyDQotc2VhcmNoRXJyb3JfbXNnPUlVUFMwMTAwRTogXHU2NDFjXHU3ZDIyXHU2NGNkXHU0ZjVjXHU2NWUwXHU2Y2Q1XHU3ZWU3XHU3ZWVkXHUzMDAyDQotc2VhcmNoRXJyb3JfcmVhc29uPVx1NWY1M1x1NTI0ZFx1NmNhMVx1NjcwOVx1NjI1M1x1NWYwMFx1NGVmYlx1NGY1NVx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMlxuXG5cdTYyNTNcdTVmMDBcdTY3ZDBcdTRlMmFcdTY1YjlcdTZjZDVcdTVlOTNcdTVlNzZcdTkxY2RcdThiZDVcdTMwMDINCi0NCi0jIE1ldGhvZCBTZWFyY2ggUmVzdWx0DQotc2VhcmNoUmVzdWx0X21ldGhvZENvbnRlbnQ9XHU2NWI5XHU2Y2Q1XHU1MTg1XHU1YmI5DQotc2VhcmNoUmVzdWx0X2NvbnRlbnRQYWNrYWdlcz1cdTUxODVcdTViYjlcdTUzMDUNCi1zZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzPVx1NjgwN1x1NTFjNlx1N2M3Ylx1NTIyYg0KLXNlYXJjaFJlc3VsdF9kaXNjaXBsaW5lcz1cdTg5YzRcdTdhMGINCi1zZWFyY2hSZXN1bHRfZG9tYWlucz1cdTU3ZGYNCi1zZWFyY2hSZXN1bHRfd29ya1Byb2R1Y3RUeXBlcz1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTdjN2JcdTU3OGINCi1zZWFyY2hSZXN1bHRfcm9sZVNldHM9XHU4OWQyXHU4MjcyXHU5NmM2DQotc2VhcmNoUmVzdWx0X3Rvb2xzPVx1NWRlNVx1NTE3Nw0KLXNlYXJjaFJlc3VsdF9jdXN0b21DYXRlZ29yaWVzPVx1NWI5YVx1NTIzNlx1N2M3Ylx1NTIyYg0KLXNlYXJjaFJlc3VsdF9wcm9jZXNzZXM9XHU2ZDQxXHU3YTBiDQotc2VhcmNoUmVzdWx0X2NhcGFiaWxpdHlQYXR0ZXJucz1cdTgwZmRcdTUyOWJcdTZhMjFcdTVmMGYNCi1zZWFyY2hSZXN1bHRfZGVsaXZlcnlQcm9jZXNzZXM9XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiDQotc2VhcmNoUmVzdWx0X21hdGNoPVx1MjAxY3swfVx1MjAxZFx1ZmYwZCAxIFx1NGUyYVx1NTMzOVx1OTE0ZA0KLXNlYXJjaFJlc3VsdF9tYXRjaGVzPVx1MjAxY3swfVx1MjAxZFx1ZmYwZCB7MX0gXHU0ZTJhXHU1MzM5XHU5MTRkDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhN2U1N2YuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBQYWdlDQotc2VhcmNoU3RyaW5nTGFiZWxfdGV4dD1cdTY1ODdcdTViNTdcdWZmMDgqID0gXHU0ZWZiXHU0ZjU1XHU1YjU3XHU0ZTMyXHVmZjBjPyA9IFx1NGVmYlx1NGY1NVx1NWI1N1x1NTE0M1x1ZmYwOVx1ZmYxYQ0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PVx1NTM0MFx1NTIwNlx1NTkyN1x1NWMwZlx1NWJlYg0KLWVsZW1lbnROYW1lTGFiZWxfdGV4dD1cdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTU0MGRcdTdhMzFcdTYyMTZcdTU0NDhcdTczZmVcdTU0MGRcdTdhMzFcdTU3OGJcdTZhMjNcdWZmMWENCi1zY29wZUdyb3VwX3RleHQ9XHU3YmM0XHU1NzBkDQotcm9sZUNoZWNrYm94X3RleHQ9XHU4OWQyXHU4MjcyDQotdGFza0NoZWNrYm94X3RleHQ9XHU0ZjVjXHU2OTZkDQotd29ya1Byb2R1Y3RDaGVja2JveF90ZXh0PVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBRdWVyeQ0KLXNlYXJjaFF1ZXJ5X3RleHQ9XHU2NWI5XHU2Y2Q1XHU2NDFjXHU1YzBiDQotDQotIyBNZXRob2QgU2VhcmNoIFByb2dyZXNzIERpYWxvZw0KLXNjYW5MaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NjM4M1x1NjNjZlx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYi4uLg0KLXNjYW5FbGVtZW50VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NjM4M1x1NjNjZlx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMCAnJ3swfScnLi4uDQotDQotIyBNZXRob2QgU2VhcmNoIEVycm9yIERpYWxvZw0KLXNlYXJjaEVycm9yX3RpdGxlPVx1NjViOVx1NmNkNVx1NjQxY1x1NWMwYg0KLXNlYXJjaEVycm9yX21zZz1JVVBTMDEwMEU6IFx1NzEyMVx1NmNkNVx1N2U3Y1x1N2U4Y1x1NjQxY1x1NWMwYlx1NGY1Y1x1Njk2ZFx1MzAwMg0KLXNlYXJjaEVycm9yX3JlYXNvbj1cdTc2ZWVcdTUyNGRcdTY3MmFcdTk1OGJcdTU1NWZcdTRlZmJcdTRmNTVcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMDJcblxuXHU4YWNiXHU5NThiXHU1NTVmXHU0ZTAwXHU1MDBiXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHVmZjBjXHU3MTM2XHU1ZjhjXHU1MThkXHU4YTY2XHU0ZTAwXHU2YjIxXHUzMDAyDQotDQotIyBNZXRob2QgU2VhcmNoIFJlc3VsdA0KLXNlYXJjaFJlc3VsdF9tZXRob2RDb250ZW50PVx1NjViOVx1NmNkNVx1NTE2N1x1NWJiOQ0KLXNlYXJjaFJlc3VsdF9jb250ZW50UGFja2FnZXM9XHU1MTY3XHU1YmI5XHU1OTU3XHU0ZWY2DQotc2VhcmNoUmVzdWx0X3N0YW5kYXJkQ2F0ZWdvcmllcz1cdTZhMTlcdTZlOTZcdTdhMmVcdTk4NWUNCi1zZWFyY2hSZXN1bHRfZGlzY2lwbGluZXM9XHU4OThmXHU3YmM0DQotc2VhcmNoUmVzdWx0X2RvbWFpbnM9XHU5ODE4XHU1N2RmDQotc2VhcmNoUmVzdWx0X3dvcmtQcm9kdWN0VHlwZXM9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU5ODVlXHU1NzhiDQotc2VhcmNoUmVzdWx0X3JvbGVTZXRzPVx1ODlkMlx1ODI3Mlx1OTZjNg0KLXNlYXJjaFJlc3VsdF90b29scz1cdTVkZTVcdTUxNzcNCi1zZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllcz1cdTgxZWFcdThhMDJcdTdhMmVcdTk4NWUNCi1zZWFyY2hSZXN1bHRfcHJvY2Vzc2VzPVx1N2EwYlx1NWU4Zg0KLXNlYXJjaFJlc3VsdF9jYXBhYmlsaXR5UGF0dGVybnM9XHU1MjlmXHU4MGZkXHU1NzhiXHU2YTIzDQotc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzPVx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYg0KLXNlYXJjaFJlc3VsdF9tYXRjaD0nJ3swfScnIC0gMSBcdTUwMGJcdTc2ZjhcdTdiMjYNCi1zZWFyY2hSZXN1bHRfbWF0Y2hlcz0nJ3swfScnIC0gezF9IFx1NTAwYlx1NzZmOFx1N2IyNg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGI0ZTNjZi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNTcyOGJhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBTZWFyY2ggVUkgKE5MMikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NGZjYTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhY2UyMDkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9XHUwNDFmXHUwNDNlXHUwNDM4XHUwNDQxXHUwNDNhIEVQRiAtIFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0NDRcdTA0MzVcdTA0MzlcdTA0NDENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIE1ldGhvZCBTZWFyY2ggRGlhbG9nDQotbWV0aG9kU2VhcmNoRGlhbG9nTGFiZWw9XHUwNDFmXHUwNDNlXHUwNDM4XHUwNDQxXHUwNDNhIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNDlkODc2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBTZWFyY2ggUGFnZQ0KLXNlYXJjaFN0cmluZ0xhYmVsX3RleHQ9XHUwNDIyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyICgqID0gXHUwNDNiXHUwNDRlXHUwNDMxXHUwNDMwXHUwNDRmIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYVx1MDQzMCwgPyA9IFx1MDQzYlx1MDQ0ZVx1MDQzMVx1MDQzZVx1MDQzOSBcdTA0NDFcdTA0MzhcdTA0M2NcdTA0MzJcdTA0M2VcdTA0M2IpOg0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PVx1MDQyMSBcdTA0NDNcdTA0NDdcdTA0MzVcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwDQotZWxlbWVudE5hbWVMYWJlbF90ZXh0PVx1MDQyOFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZCBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2QgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2QgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMDoNCi1zY29wZUdyb3VwX3RleHQ9XHUwNDFlXHUwNDMxXHUwNDNiXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDRjDQotcm9sZUNoZWNrYm94X3RleHQ9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDRjDQotdGFza0NoZWNrYm94X3RleHQ9XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDMwDQotd29ya1Byb2R1Y3RDaGVja2JveF90ZXh0PVx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDINCi0NCi0jIE1ldGhvZCBTZWFyY2ggUXVlcnkNCi1zZWFyY2hRdWVyeV90ZXh0PVx1MDQxZlx1MDQzZVx1MDQzOFx1MDQ0MVx1MDQzYSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi0NCi0jIE1ldGhvZCBTZWFyY2ggUHJvZ3Jlc3MgRGlhbG9nDQotc2NhbkxpYnJhcnlUYXNrX25hbWU9XHUwNDFmXHUwNDNlXHUwNDM4XHUwNDQxXHUwNDNhIFx1MDQzMiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLi4uDQotc2NhbkVsZW1lbnRUYXNrX25hbWU9XHUwNDFmXHUwNDNlXHUwNDM4XHUwNDQxXHUwNDNhIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgJyd7MH0nJy4uLg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBFcnJvciBEaWFsb2cNCi1zZWFyY2hFcnJvcl90aXRsZT1cdTA0MWZcdTA0M2VcdTA0MzhcdTA0NDFcdTA0M2EgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotc2VhcmNoRXJyb3JfbXNnPUlVUFMwMTAwRTogXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzOFx1MDQ0MVx1MDQzYVx1MDQzMCBcdTA0M2RcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2UuDQotc2VhcmNoRXJyb3JfcmVhc29uPVx1MDQxZFx1MDQzNSBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0MzAgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi5cblxuXHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUuDQotDQotIyBNZXRob2QgU2VhcmNoIFJlc3VsdA0KLXNlYXJjaFJlc3VsdF9tZXRob2RDb250ZW50PVx1MDQxY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0YiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1zZWFyY2hSZXN1bHRfY29udGVudFBhY2thZ2VzPVx1MDQxZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzINCi1zZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzPVx1MDQyMVx1MDQ0Mlx1MDQzMFx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzgNCi1zZWFyY2hSZXN1bHRfZGlzY2lwbGluZXM9XHUwNDE0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDRiDQotc2VhcmNoUmVzdWx0X2RvbWFpbnM9XHUwNDE0XHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRiDQotc2VhcmNoUmVzdWx0X3dvcmtQcm9kdWN0VHlwZXM9XHUwNDIyXHUwNDM4XHUwNDNmXHUwNDRiIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzANCi1zZWFyY2hSZXN1bHRfcm9sZVNldHM9XHUwNDFkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDRiIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOQ0KLXNlYXJjaFJlc3VsdF90b29scz1cdTA0MThcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGINCi1zZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllcz1cdTA0MWZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4DQotc2VhcmNoUmVzdWx0X3Byb2Nlc3Nlcz1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0NGINCi1zZWFyY2hSZXN1bHRfY2FwYWJpbGl0eVBhdHRlcm5zPVx1MDQyOFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQ0YiBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkNCi1zZWFyY2hSZXN1bHRfZGVsaXZlcnlQcm9jZXNzZXM9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDRiIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzOA0KLXNlYXJjaFJlc3VsdF9tYXRjaD0nJ3swfScnIC0gMSBcdTA0NDFcdTA0M2VcdTA0MzJcdTA0M2ZcdTA0MzBcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1zZWFyY2hSZXN1bHRfbWF0Y2hlcz0nJ3swfScnIC0gezF9IFx1MDQ0MVx1MDQzZVx1MDQzMlx1MDQzZlx1MDQzMFx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OGQzNWQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Y2Y2YWYxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgU2VhcmNoIFVJIChOTDJhKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNjgyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjRiODg5OC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gYnJ1Z2VyZ3JcdTAwZTZuc2VmbGFkZSB0aWwgc1x1MDBmOGduaW5nDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBNZXRob2QgU2VhcmNoIERpYWxvZw0KLW1ldGhvZFNlYXJjaERpYWxvZ0xhYmVsPU1ldG9kZXNcdTAwZjhnbmluZw0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3MTY3MmEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBTZWFyY2ggUGFnZQ0KLXNlYXJjaFN0cmluZ0xhYmVsX3RleHQ9VGVrc3QgKCogPSB2aWxrXHUwMGU1cmxpZyBzdHJlbmcgPyA9IHZpbGtcdTAwZTVybGlndCB0ZWduKToNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1Gb3Jza2VsIHBcdTAwZTUgc3RvcmUvc21cdTAwZTUgYm9nc3RhdmVyDQotZWxlbWVudE5hbWVMYWJlbF90ZXh0PU1cdTAwZjhuc3RlciBmb3IgbWV0b2RlZWxlbWVudG5hdm4gZWxsZXIgcHJcdTAwZTZzZW50YXRpb25zbmF2bjoNCi1zY29wZUdyb3VwX3RleHQ9T21mYW5nDQotcm9sZUNoZWNrYm94X3RleHQ9Um9sbGUNCi10YXNrQ2hlY2tib3hfdGV4dD1PcGdhdmUNCi13b3JrUHJvZHVjdENoZWNrYm94X3RleHQ9QXJiZWpkc3Byb2R1a3QNCi0NCi0jIE1ldGhvZCBTZWFyY2ggUXVlcnkNCi1zZWFyY2hRdWVyeV90ZXh0PU1ldG9kZXNcdTAwZjhnbmluZw0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBQcm9ncmVzcyBEaWFsb2cNCi1zY2FuTGlicmFyeVRhc2tfbmFtZT1TY2FubmVyIG1ldG9kZWJpYmxpb3Rlay4uLg0KLXNjYW5FbGVtZW50VGFza19uYW1lPVNjYW5uZXIgbWV0b2RlZWxlbWVudGV0ICcnezB9JycuLi4NCi0NCi0jIE1ldGhvZCBTZWFyY2ggRXJyb3IgRGlhbG9nDQotc2VhcmNoRXJyb3JfdGl0bGU9TWV0b2Rlc1x1MDBmOGduaW5nDQotc2VhcmNoRXJyb3JfbXNnPUlVUFMwMTAwRTogU1x1MDBmOGdlZnVua3Rpb24ga2FuIGlra2UgZm9ydHNcdTAwZTZ0dGUuDQotc2VhcmNoRXJyb3JfcmVhc29uPURlciBlciBpa2tlIG5vZ2V0IFx1MDBlNWJlbnQgbWV0b2RlYmlibGlvdGVrIGkgXHUwMGY4amVibGlra2V0LlxuXG5cdTAwYzVibiBldCBtZXRvZGViaWJsaW90ZWssIG9nIHByXHUwMGY4diBpZ2VuLg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBSZXN1bHQNCi1zZWFyY2hSZXN1bHRfbWV0aG9kQ29udGVudD1NZXRvZGVpbmRob2xkDQotc2VhcmNoUmVzdWx0X2NvbnRlbnRQYWNrYWdlcz1JbmRob2xkc3Bha2tlcg0KLXNlYXJjaFJlc3VsdF9zdGFuZGFyZENhdGVnb3JpZXM9U3RhbmRhcmRrYXRlZ29yaWVyDQotc2VhcmNoUmVzdWx0X2Rpc2NpcGxpbmVzPURpc2NpcGxpbmVyDQotc2VhcmNoUmVzdWx0X2RvbWFpbnM9RG9tXHUwMGU2bmVyDQotc2VhcmNoUmVzdWx0X3dvcmtQcm9kdWN0VHlwZXM9QXJiZWpkc3Byb2R1a3R0eXBlcg0KLXNlYXJjaFJlc3VsdF9yb2xlU2V0cz1Sb2xsZXNcdTAwZTZ0DQotc2VhcmNoUmVzdWx0X3Rvb2xzPVZcdTAwZTZya3RcdTAwZjhqZXINCi1zZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllcz1UaWxwYXNzZWRlIGthdGVnb3JpZXINCi1zZWFyY2hSZXN1bHRfcHJvY2Vzc2VzPVByb2Nlc3Nlcg0KLXNlYXJjaFJlc3VsdF9jYXBhYmlsaXR5UGF0dGVybnM9RnVua3Rpb25zbVx1MDBmOG5zdHJlDQotc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzPUxldmVyaW5nc3Byb2Nlc3Nlcg0KLXNlYXJjaFJlc3VsdF9tYXRjaD0nJ3swfScnIC0gMSBmb3Jla29tc3QNCi1zZWFyY2hSZXN1bHRfbWF0Y2hlcz0nJ3swfScnIC0gezF9IGZvcmVrb21zdGVyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MGVjMDliLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjMDNlNmYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIFVNQSBFY29yZSAoTkwxKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmU3YjAxMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9lcy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcHRfQlIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2l0LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDBiZDVjOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBVTUEtRWNvcmUtRXJ3ZWl0ZXJ1bmcNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjA4ZmViZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1BbXBsaWFjaVx1MDBmM24gRWNvcmUgZGUgVU1BIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzQ2MTViLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUV4dGVuc2lvbiBFY29yZSBVTUEgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmODNmYTAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFVNQSBFY29yZSBFeHRlbnNpb24NCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5famEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmY4M2ZhMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgVU1BIEVjb3JlIEV4dGVuc2lvbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NWUwZTVjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBVTUEgRWNvcmUgXHVkNjU1XHVjN2E1DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlNTI3OTMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RXh0ZW5zXHUwMGUzbyBVTUEgRWNvcmUgZG8gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxYWY1ZWYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFVNQSBFY29yZSBcdTYyNjlcdTVjNTUNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmY4M2ZhMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgVU1BIEVjb3JlIEV4dGVuc2lvbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjAxM2UxZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZGU4YjE4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBVTUEgRWNvcmUgKE5MMikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NGZjYTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1YzVmZTQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IEVjb3JlIFVNQQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNWY1MGExLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNmRmYzcxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgVU1BIEVjb3JlIChOTDJhKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNjgyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI2ZDQ3NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFVNQSBFY29yZSAtIHVkdmlkZWxzZQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1ZjVmN2MuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMjNmMWYxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwxLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkYTJjOTEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1zb3VyY2UubmwxLmphciA9IHNyYy8NCi1vdXRwdXQubmwxLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDEuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9pdC5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDEvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NzQ5MThlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIENvbXBvc2VyIFVNQSBFZGl0IChOTDEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZWJmZDU4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLXBsdWdpbk5hbWUgPSBFTUYgLSBVbnRlcnN0XHUwMGZjdHp1bmcgZlx1MDBmY3IgVU1BLUJlYXJiZWl0dW5nDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IENyZWF0ZSBOZXcgezB9IFVuZGVyIHsxfSBGZWF0dXJlDQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IGNoaWxkIG9mIHR5cGUgezB9IGZvciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlIHNlbGVjdGVkIHsyfS4NCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBzaWJsaW5nIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezJ9LCB1bmRlciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlaXIgcGFyZW50Lg0KLQ0KLV9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSB7MH0gdm9uIHsxfQ0KLQ0KLV9VSV9DbGFzc2lmaWVyX3R5cGUgPSBLbGFzc2lmaWthdGlvbnNtZXJrbWFsDQotX1VJX1R5cGVfdHlwZSA9IFR5cA0KLV9VSV9FbGVtZW50X3R5cGUgPSBFbGVtZW50DQotX1VJX05hbWVkRWxlbWVudF90eXBlID0gQmVuYW5udGVzIEVsZW1lbnQNCi1fVUlfUGFja2FnZWFibGVFbGVtZW50X3R5cGUgPSBQYWtldGZcdTAwZTRoaWdlcyBFbGVtZW50DQotX1VJX1BhY2thZ2VfdHlwZSA9IFBha2V0DQotX1VJX05hbWVzcGFjZV90eXBlID0gTmFtZXNwYWNlDQotX1VJX01ldGhvZEVsZW1lbnRfdHlwZSA9IE1ldGhvZGVuZWxlbWVudA0KLV9VSV9Db25zdHJhaW50X3R5cGUgPSBWb3JnYWJlDQotX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUgPSBJbmhhbHRzZWxlbWVudA0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IEJlc2NocmVpYmJhcmVzIEVsZW1lbnQNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUgPSBJbmhhbHRzYmVzY2hyZWlidW5nDQotX1VJX1NlY3Rpb25fdHlwZSA9IEFic2Nobml0dA0KLV9VSV9Sb2xlX3R5cGUgPSBSb2xsZQ0KLV9VSV9Xb3JrUHJvZHVjdF90eXBlID0gQXJiZWl0c2VyZ2VibmlzDQotX1VJX1Rhc2tfdHlwZSA9IEF1ZmdhYmUNCi1fVUlfV29ya0RlZmluaXRpb25fdHlwZSA9IEFyYmVpdHNkZWZpbml0aW9uDQotX1VJX1N0ZXBfdHlwZSA9IFNjaHJpdHQNCi1fVUlfR3VpZGFuY2VfdHlwZSA9IEFubGVpdHVuZw0KLV9VSV9BcnRpZmFjdF90eXBlID0gQXJ0ZWZha3QNCi1fVUlfRGVsaXZlcmFibGVfdHlwZSA9IExpZWZlcmdlZ2Vuc3RhbmQNCi1fVUlfT3V0Y29tZV90eXBlID0gUmVzdWx0YXQNCi1fVUlfTWV0aG9kUGFja2FnZV90eXBlID0gTWV0aG9kZW5wYWtldA0KLV9VSV9Db250ZW50UGFja2FnZV90eXBlID0gSW5oYWx0c3Bha2V0DQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSA9IEFydGVmYWt0YmVzY2hyZWlidW5nDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSA9IEFyYmVpdHNlcmdlYm5pc2Jlc2NocmVpYnVuZw0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3R5cGUgPSBCZXNjaHJlaWJ1bmcgZGVzIExpZWZlcmdlZ2Vuc3RhbmRzDQotX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlID0gUm9sbGVuYmVzY2hyZWlidW5nDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlID0gQXVmZ2FiZW5iZXNjaHJlaWJ1bmcNCi1fVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl90eXBlID0gQW5sZWl0dW5nc2Jlc2NocmVpYnVuZw0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUgPSBWZXJmYWhyZW5zYmVzY2hyZWlidW5nDQotX1VJX1BvaW50X3R5cGUgPSBQdW5rdA0KLV9VSV9HcmFwaEVsZW1lbnRfdHlwZSA9IEdyYXBoZWxlbWVudA0KLV9VSV9EaWFncmFtRWxlbWVudF90eXBlID0gRGlhZ3JhbW1lbGVtZW50DQotX1VJX0RpYWdyYW1MaW5rX3R5cGUgPSBEaWFncmFtbXZlcmtuXHUwMGZjcGZ1bmcNCi1fVUlfR3JhcGhDb25uZWN0b3JfdHlwZSA9IEdyYXBodmVyYmluZHVuZw0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2UNCi1fVUlfRGltZW5zaW9uX3R5cGUgPSBEaW1lbnNpb24NCi1fVUlfUmVmZXJlbmNlX3R5cGUgPSBSZWZlcmVueg0KLV9VSV9Qcm9wZXJ0eV90eXBlID0gRWlnZW5zY2hhZnQNCi1fVUlfR3JhcGhFZGdlX3R5cGUgPSBHcmFwaGthbnRlDQotX1VJX0RpYWdyYW1fdHlwZSA9IERpYWdyYW1tDQotX1VJX0dyYXBoTm9kZV90eXBlID0gR3JhcGhrbm90ZW4NCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSA9IEVpbmZhY2hlcyBTZW1hbnRpa21vZGVsbGVsZW1lbnQNCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gU2VtYW50aWMgTW9kZWwgQnJpZGdlIC0gVU1BDQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2UgLSBCYXNpcw0KLV9VSV9MZWFmRWxlbWVudF90eXBlID0gQmxhdHRlbGVtZW50DQotX1VJX1RleHRFbGVtZW50X3R5cGUgPSBUZXh0ZWxlbWVudA0KLV9VSV9JbWFnZV90eXBlID0gQmlsZA0KLV9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUgPSBHcmFmaWtiYXNpc2VsZW1lbnQNCi1fVUlfUG9seWxpbmVfdHlwZSA9IE1laHJmYWNobGluaWUNCi1fVUlfRWxsaXBzZV90eXBlID0gRWxsaXBzZQ0KLV9VSV9BY3Rpdml0eV90eXBlID0gQWt0aXZpdFx1MDBlNHQNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IFByb2pla3RzdHJ1a3R1cmVsZW1lbnQNCi1fVUlfQnJlYWtkb3duRWxlbWVudF90eXBlID0gU3RydWt0dXJlbGVtZW50DQotX1VJX01pbGVzdG9uZV90eXBlID0gTWVpbGVuc3RlaW4NCi1fVUlfSXRlcmF0aW9uX3R5cGUgPSBJdGVyYXRpb24NCi1fVUlfUGhhc2VfdHlwZSA9IFBoYXNlDQotX1VJX1RlYW1Qcm9maWxlX3R5cGUgPSBUZWFtcHJvZmlsDQotX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUgPSBSb2xsZW5kZXNrcmlwdG9yDQotX1VJX1dvcmtPcmRlcl90eXBlID0gQXJiZWl0c2ZvbGdlDQotX1VJX1Byb2Nlc3NFbGVtZW50X3R5cGUgPSBQcm96ZXNzZWxlbWVudA0KLV9VSV9QbGFubmluZ0RhdGFfdHlwZSA9IFBsYW51bmdzZGF0ZW4NCi1fVUlfRGVzY3JpcHRvcl90eXBlID0gRGVza3JpcHRvcg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSA9IEFyYmVpdHNlcmdlYm5pc2Rlc2tyaXB0b3INCi1fVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSA9IEF1ZmdhYmVuZGVza3JpcHRvcg0KLV9VSV9Db21wb3NpdGVSb2xlX3R5cGUgPSBLb21iaW5pZXJ0ZSBSb2xsZQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSA9IEJlc2NocmVpYnVuZyBkZXMgU3RydWt0dXJlbGVtZW50cw0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUgPSBBa3Rpdml0XHUwMGU0dHNiZXNjaHJlaWJ1bmcNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSA9IEJlc2NocmVpYnVuZyBkZXMgQmVyZWl0c3RlbGx1bmdzcHJvemVzc2VzDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gUHJvemVzc2Jlc2NocmVpYnVuZw0KLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fdHlwZSA9IERlc2tyaXB0b3JiZXNjaHJlaWJ1bmcNCi1fVUlfQ29uY2VwdF90eXBlID0gS29uemVwdA0KLV9VSV9DaGVja2xpc3RfdHlwZSA9IFByXHUwMGZjZmxpc3RlDQotX1VJX0V4YW1wbGVfdHlwZSA9IEJlaXNwaWVsDQotX1VJX0d1aWRlbGluZV90eXBlID0gUmljaHRsaW5pZQ0KLV9VSV9SZXBvcnRfdHlwZSA9IEJlcmljaHQNCi1fVUlfVGVtcGxhdGVfdHlwZSA9IFZvcmxhZ2UNCi1fVUlfU3VwcG9ydGluZ01hdGVyaWFsX3R5cGUgPSBVbnRlcnN0XHUwMGZjdHplbmRlcyBNYXRlcmlhbA0KLV9VSV9Ub29sTWVudG9yX3R5cGUgPSBUb29sbWVudG9yDQotX1VJX1doaXRlcGFwZXJfdHlwZSA9IFdoaXRlIFBhcGVyDQotX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUgPSBCZWdyaWZmc2RlZmluaXRpb24NCi1fVUlfUHJhY3RpY2VfdHlwZSA9IFZlcmZhaHJlbg0KLV9VSV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdHlwZSA9IEhpbndlaXNlIHp1bSBTY2hcdTAwZTR0emVuDQotX1VJX1JldXNhYmxlQXNzZXRfdHlwZSA9IFdpZWRlcnZlcndlbmRiYXJlcyBBc3NldA0KLV9VSV9TdGF0ZV90eXBlID0gWnVzdGFuZA0KLV9VSV9WZXJ0ZXhfdHlwZSA9IFZlcnRleA0KLV9VSV9SZWdpb25fdHlwZSA9IFJlZ2lvbg0KLV9VSV9TdGF0ZU1hY2hpbmVfdHlwZSA9IFp1c3RhbmRzbWFzY2hpbmUNCi1fVUlfVHJhbnNpdGlvbl90eXBlID0gXHUwMGRjYmVyZ2FuZw0KLV9VSV9Qc2V1ZG9TdGF0ZV90eXBlID0gUHNldWRvenVzdGFuZA0KLV9VSV9EaXNjaXBsaW5lX3R5cGUgPSBEaXN6aXBsaW4NCi1fVUlfQ29udGVudENhdGVnb3J5X3R5cGUgPSBJbmhhbHRza2F0ZWdvcmllDQotX1VJX1JvbGVTZXRfdHlwZSA9IFJvbGxlbmdydXBwZQ0KLV9VSV9Eb21haW5fdHlwZSA9IERvbVx1MDBlNG5lDQotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gQXJ0IGRlcyBBcmJlaXRzZXJnZWJuaXNzZXMNCi1fVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUgPSBadXNhbW1lbmZhc3N1bmcgdm9uIERpc3ppcGxpbmVuDQotX1VJX1Rvb2xfdHlwZSA9IFRvb2wNCi1fVUlfUm9sZVNldEdyb3VwaW5nX3R5cGUgPSBadXNhbW1lbmZhc3N1bmcgdm9uIFJvbGxlbmdydXBwZW4NCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSA9IEFuZ2VwYXNzdGUgS2F0ZWdvcmllDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlID0gQmVyZWl0c3RlbGx1bmdzcHJvemVzcw0KLV9VSV9Qcm9jZXNzX3R5cGUgPSBQcm96ZXNzDQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3R5cGUgPSBQcm96ZXNzbXVzdGVyDQotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUgPSBWb3JsYWdlIGZcdTAwZmNyIFByb3plc3NwbGFudW5nDQotX1VJX1JvYWRtYXBfdHlwZSA9IFJvYWRtYXANCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlID0gUHJvemVzc2tvbXBvbmVudGUNCi1fVUlfUHJvY2Vzc1BhY2thZ2VfdHlwZSA9IFByb3plc3NwYWtldA0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX3R5cGUgPSBQcm96ZXNza29tcG9uZW50ZW5zY2huaXR0c3RlbGxlDQotX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX3R5cGUgPSBQcm96ZXNza29tcG9uZW50ZW5kZXNrcmlwdG9yDQotX1VJX01ldGhvZFBsdWdpbl90eXBlID0gTWV0aG9kZW4tUGx1Zy1pbg0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSA9IFZhcmlhYmlsaXRcdTAwZTR0c2VsZW1lbnQNCi1fVUlfTWV0aG9kVW5pdF90eXBlID0gTWV0aG9kZW5laW5oZWl0DQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSA9IE1ldGhvZGVua29uZmlndXJhdGlvbg0KLV9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUgPSBQcm96ZXNzZmFtaWxpZQ0KLV9VSV9NZXRob2RMaWJyYXJ5X3R5cGUgPSBNZXRob2RlbmJpYmxpb3RoZWsNCi1fVUlfVW5rbm93bl90eXBlID0gT2JqZWt0DQotDQotX1VJX1Vua25vd25fZGF0YXR5cGU9IFdlcnQNCi0NCi1fVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSA9IE5hbWUNCi1fVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUgPSBBbmxlaXR1bmcNCi1fVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBLdXJ6YmVzY2hyZWlidW5nDQotX1VJX01ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19mZWF0dXJlID0gRWlnZW5lIFJlZ2Vsbg0KLV9VSV9NZXRob2RFbGVtZW50X3N1cHByZXNzZWRfZmVhdHVyZSA9IFVudGVyZHJcdTAwZmNja3QNCi1fVUlfTWV0aG9kRWxlbWVudF9vcmRlcmluZ0d1aWRlX2ZlYXR1cmUgPSBBbmxlaXR1bmcgZlx1MDBmY3IgRmVzdGxlZ3VuZyBkZXIgUmVpaGVuZm9sZ2UNCi1fVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUgPSBIYXVwdHRlaWwNCi1fVUlfQ29udGVudEVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gVW50ZXJzdFx1MDBmY3R6ZW5kZXMgTWF0ZXJpYWwNCi1fVUlfQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfZmVhdHVyZSA9IEtvbnplcHRlIHVuZCBXaGl0ZSBQYXBlcg0KLV9VSV9Db250ZW50RWxlbWVudF9jaGVja2xpc3RzX2ZlYXR1cmUgPSBQclx1MDBmY2ZsaXN0ZW4NCi1fVUlfQ29udGVudEVsZW1lbnRfZ3VpZGVsaW5lc19mZWF0dXJlID0gUmljaHRsaW5pZW4NCi1fVUlfQ29udGVudEVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSA9IEJlaXNwaWVsZQ0KLV9VSV9Db250ZW50RWxlbWVudF9hc3NldHNfZmVhdHVyZSA9IEFzc2V0cw0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uTmFtZV9mZWF0dXJlID0gUHJcdTAwZTRzZW50YXRpb25zbmFtZQ0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQclx1MDBlNHNlbnRhdGlvbg0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBTaGFwZWljb24NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBOb2RlaWNvbg0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBIYXVwdGJlc2NocmVpYnVuZw0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfZmVhdHVyZSA9IEFic2Nobml0dGUNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX2tleUNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBXaWNodGlnZSBIaW53ZWlzZQ0KLV9VSV9TZWN0aW9uX3NlY3Rpb25OYW1lX2ZlYXR1cmUgPSBBYnNjaG5pdHRuYW1lDQotX1VJX1NlY3Rpb25fc2VjdGlvbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBBYnNjaG5pdHRiZXNjaHJlaWJ1bmcNCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gVW50ZXJhYnNjaG5pdHRlDQotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IFZvcmdcdTAwZTRuZ2VyDQotX1VJX1JvbGVfbW9kaWZpZXNfZmVhdHVyZSA9IFx1MDBjNG5kZXJ1bmcNCi1fVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlID0gVmVyYW50d29ydGxpY2ggZlx1MDBmY3INCi1fVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlID0gQmVyaWNodGUNCi1fVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUgPSBWb3JsYWdlbg0KLV9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlID0gVG9vbG1lbnRvcmVuDQotX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gSGlud2Vpc2UgenVtIFNjaFx1MDBlNHR6ZW4NCi1fVUlfVGFza19wZXJmb3JtZWRCeV9mZWF0dXJlID0gQXVzZ2VmXHUwMGZjaHJ0IHZvbg0KLV9VSV9UYXNrX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBWZXJiaW5kbGljaGUgRWluZ2FiZQ0KLV9VSV9UYXNrX291dHB1dF9mZWF0dXJlID0gQXVzZ2FiZQ0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBadXNcdTAwZTR0emxpY2ggYXVzZ2VmXHUwMGZjaHJ0IHZvbg0KLV9VSV9UYXNrX29wdGlvbmFsSW5wdXRfZmVhdHVyZSA9IE9wdGlvbmFsZSBFaW5nYWJlDQotX1VJX1Rhc2tfc3RlcHNfZmVhdHVyZSA9IFNjaHJpdHRlDQotX1VJX1Rhc2tfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFRvb2xtZW50b3Jlbg0KLV9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gSGlud2Vpc2UgenVtIFNjaFx1MDBlNHR6ZW4NCi1fVUlfV29ya0RlZmluaXRpb25fcHJlY29uZGl0aW9uX2ZlYXR1cmUgPSBWb3JiZWRpbmd1bmcNCi1fVUlfV29ya0RlZmluaXRpb25fcG9zdGNvbmRpdGlvbl9mZWF0dXJlID0gTmFjaGJlZGluZ3VuZw0KLV9VSV9BcnRpZmFjdF9jb250YWluZXJBcnRpZmFjdF9mZWF0dXJlID0gQ29udGFpbmVyYXJ0ZWZha3QNCi1fVUlfQXJ0aWZhY3RfY29udGFpbmVkQXJ0aWZhY3RzX2ZlYXR1cmUgPSBFbnRoYWx0ZW5lIEFydGVmYWt0ZQ0KLV9VSV9EZWxpdmVyYWJsZV9kZWxpdmVyZWRXb3JrUHJvZHVjdHNfZmVhdHVyZSA9IEdlbGllZmVydGUgQXJiZWl0c2VyZ2Vibmlzc2UNCi1fVUlfTWV0aG9kUGFja2FnZV9nbG9iYWxfZmVhdHVyZSA9IEdsb2JhbA0KLV9VSV9NZXRob2RQYWNrYWdlX3JldXNlZFBhY2thZ2VzX2ZlYXR1cmUgPSBXaWVkZXJ2ZXJ3ZW5kZXRlIFBha2V0ZQ0KLV9VSV9NZXRob2RQYWNrYWdlX3BhcmVudFBhY2thZ2VfZmVhdHVyZSA9IFx1MDBkY2Jlcmdlb3JkbmV0ZSBQYWtldGUNCi1fVUlfTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX2ZlYXR1cmUgPSBVbnRlcmdlb3JkbmV0ZSBQYWtldGUNCi1fVUlfQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX2ZlYXR1cmUgPSBJbmhhbHRzZWxlbWVudGUNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9icmllZk91dGxpbmVfZmVhdHVyZSA9IEt1cnplIEdsaWVkZXJ1bmcNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9yZXByZXNlbnRhdGlvbk9wdGlvbnNfZmVhdHVyZSA9IERhcnN0ZWxsdW5nc29wdGlvbmVuDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gRXh0ZXJuZSBJRA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFp3ZWNrDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25faW1wYWN0T2ZOb3RIYXZpbmdfZmVhdHVyZSA9IEF1c3dpcmt1bmdlbiBiZWkgTmljaHR2ZXJ3ZW5kdW5nDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcmVhc29uc0Zvck5vdE5lZWRpbmdfZmVhdHVyZSA9IEdyXHUwMGZjbmRlIGZcdTAwZmNyIE5pY2h0dmVyd2VuZHVuZw0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX2V4dGVybmFsRGVzY3JpcHRpb25fZmVhdHVyZSA9IEV4dGVybmUgQmVzY2hyZWlidW5nDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSA9IEFubGVpdHVuZyB6dW0gUGFja2VuDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9za2lsbHNfZmVhdHVyZSA9IEtub3ctaG93DQotX1VJX1JvbGVEZXNjcmlwdGlvbl9hc3NpZ25tZW50QXBwcm9hY2hlc19mZWF0dXJlID0gWnVvcmRudW5nc3N0cmF0ZWdpZW4NCi1fVUlfUm9sZURlc2NyaXB0aW9uX3N5bm9ueW1zX2ZlYXR1cmUgPSBTeW5vbnltZQ0KLV9VSV9UYXNrRGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gWndlY2sNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gQWx0ZXJuYXRpdmVuDQotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fYXR0YWNobWVudHNfZmVhdHVyZSA9IEFubGFnZW4NCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hZGRpdGlvbmFsSW5mb19mZWF0dXJlID0gWnVzXHUwMGU0dHpsaWNoZSBJbmZvcm1hdGlvbmVuDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlID0gUHJvYmxlbQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2JhY2tncm91bmRfZmVhdHVyZSA9IEhpbnRlcmdydW5kDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSA9IFppZWxlDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYXBwbGljYXRpb25fZmVhdHVyZSA9IEFud2VuZHVuZw0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2xldmVsc09mQWRvcHRpb25fZmVhdHVyZSA9IEVpbmZcdTAwZmNocnVuZ3NzdHVmZW4NCi1fVUlfUG9pbnRfeF9mZWF0dXJlID0gWA0KLV9VSV9Qb2ludF95X2ZlYXR1cmUgPSBZDQotX1VJX0dyYXBoRWxlbWVudF9wb3NpdGlvbl9mZWF0dXJlID0gUG9zaXRpb24NCi1fVUlfR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9mZWF0dXJlID0gRW50aGFsdGVuDQotX1VJX0dyYXBoRWxlbWVudF9saW5rX2ZlYXR1cmUgPSBMaW5rDQotX1VJX0dyYXBoRWxlbWVudF9hbmNob3JhZ2VfZmVhdHVyZSA9IFZlcmFua2VydW5nDQotX1VJX0dyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX2ZlYXR1cmUgPSBTZW1hbnRpa21vZGVsbA0KLV9VSV9EaWFncmFtRWxlbWVudF9pc1Zpc2libGVfZmVhdHVyZSA9IFNpY2h0YmFyDQotX1VJX0RpYWdyYW1FbGVtZW50X2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGFpbmVyDQotX1VJX0RpYWdyYW1FbGVtZW50X3JlZmVyZW5jZV9mZWF0dXJlID0gUmVmZXJlbnoNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfZmVhdHVyZSA9IEVpZ2Vuc2NoYWZ0DQotX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSA9IFpvb20NCi1fVUlfRGlhZ3JhbUxpbmtfdmlld3BvcnRfZmVhdHVyZSA9IERhcnN0ZWxsdW5nc2ZlbGQNCi1fVUlfRGlhZ3JhbUxpbmtfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBHcmFwaGVsZW1lbnQNCi1fVUlfRGlhZ3JhbUxpbmtfZGlhZ3JhbV9mZWF0dXJlID0gRGlhZ3JhbW0NCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBHcmFwaGVsZW1lbnQNCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFZGdlX2ZlYXR1cmUgPSBHcmFwaGthbnRlDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQclx1MDBlNHNlbnRhdGlvbg0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gR3JhcGhlbGVtZW50DQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZGlhZ3JhbV9mZWF0dXJlID0gRGlhZ3JhbW0NCi1fVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUgPSBCcmVpdGUNCi1fVUlfRGltZW5zaW9uX2hlaWdodF9mZWF0dXJlID0gSFx1MDBmNmhlDQotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gRWluemVsZGFyc3RlbGx1bmcNCi1fVUlfUmVmZXJlbmNlX3JlZmVyZW5jZWRfZmVhdHVyZSA9IFJlZmVyZW56aWVydA0KLV9VSV9Qcm9wZXJ0eV9rZXlfZmVhdHVyZSA9IFNjaGxcdTAwZmNzc2VsDQotX1VJX1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUgPSBXZXJ0DQotX1VJX0dyYXBoRWRnZV9hbmNob3JfZmVhdHVyZSA9IEFua2VyDQotX1VJX0dyYXBoRWRnZV93YXlwb2ludHNfZmVhdHVyZSA9IFdlZ3B1bmt0ZQ0KLV9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSA9IFpvb20NCi1fVUlfRGlhZ3JhbV92aWV3cG9pbnRfZmVhdHVyZSA9IFN0YW5kcHVua3QNCi1fVUlfRGlhZ3JhbV9kaWFncmFtTGlua19mZWF0dXJlID0gRGlhZ3JhbW12ZXJrblx1MDBmY3BmdW5nDQotX1VJX0RpYWdyYW1fbmFtZXNwYWNlX2ZlYXR1cmUgPSBOYW1lc3BhY2UNCi1fVUlfR3JhcGhOb2RlX3NpemVfZmVhdHVyZSA9IEdyXHUwMGY2XHUwMGRmZQ0KLV9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlSW5mb19mZWF0dXJlID0gVHlwaW5mb3JtYXRpb24NCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUgPSBFbGVtZW50DQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnQNCi1fVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlID0gVGV4dA0KLV9VSV9JbWFnZV91cmlfZmVhdHVyZSA9IFVSSQ0KLV9VSV9JbWFnZV9taW1lVHlwZV9mZWF0dXJlID0gTUlNRS1UeXANCi1fVUlfUG9seWxpbmVfY2xvc2VkX2ZlYXR1cmUgPSBHZXNjaGxvc3Nlbg0KLV9VSV9Qb2x5bGluZV93YXlwb2ludHNfZmVhdHVyZSA9IFdlZ3B1bmt0ZQ0KLV9VSV9FbGxpcHNlX3JhZGl1c1hfZmVhdHVyZSA9IFJhZGl1cyBYDQotX1VJX0VsbGlwc2VfcmFkaXVzWV9mZWF0dXJlID0gUmFkaXVzIFkNCi1fVUlfRWxsaXBzZV9yb3RhdGlvbl9mZWF0dXJlID0gRHJlaHVuZw0KLV9VSV9FbGxpcHNlX3N0YXJ0QW5nbGVfZmVhdHVyZSA9IEFuZmFuZ3N3aW5rZWwNCi1fVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlID0gRW5kd2lua2VsDQotX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUgPSBNaXR0ZWxwdW5rdA0KLV9VSV9BY3Rpdml0eV9icmVha2Rvd25FbGVtZW50c19mZWF0dXJlID0gU3RydWt0dXJlbGVtZW50ZQ0KLV9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlID0gUm9hZG1hcHMNCi1fVUlfQWN0aXZpdHlfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gVW50ZXJzdFx1MDBmY3R6ZW5kZXMgTWF0ZXJpYWwNCi1fVUlfQWN0aXZpdHlfY2hlY2tsaXN0c19mZWF0dXJlID0gUHJcdTAwZmNmbGlzdGVuDQotX1VJX0FjdGl2aXR5X2NvbmNlcHRzX2ZlYXR1cmUgPSBLb256ZXB0ZQ0KLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gQmVpc3BpZWxlDQotX1VJX0FjdGl2aXR5X2d1aWRlbGluZXNfZmVhdHVyZSA9IFJpY2h0bGluaWVuDQotX1VJX0FjdGl2aXR5X3JldXNhYmxlQXNzZXRzX2ZlYXR1cmUgPSBXaWVkZXJ2ZXJ3ZW5kYmFyZSBBc3NldHMNCi1fVUlfQWN0aXZpdHlfaXNFbmFjdGFibGVfZmVhdHVyZSA9IElzdCB1bXNldHpiYXINCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNSZXBlYXRhYmxlX2ZlYXR1cmUgPSBXaWVkZXJob2x0IGFud2VuZGJhcg0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSA9IEZvcnRsYXVmZW5kDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzRXZlbnREcml2ZW5fZmVhdHVyZSA9IEVyZWlnbmlzZ2VzdGV1ZXJ0DQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2xpbmtUb1ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBMaW5rIHp1bSBWb3JnXHUwMGU0bmdlcg0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZWZpeF9mZWF0dXJlID0gUHJcdTAwZTRmaXgNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc1BsYW5uZWRfZmVhdHVyZSA9IEdlcGxhbnQNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9oYXNNdWx0aXBsZU9jY3VycmVuY2VzX2ZlYXR1cmUgPSBNZWhyZXJlIFZvcmtvbW1lbg0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzT3B0aW9uYWxfZmVhdHVyZSA9IE9wdGlvbmFsDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSA9IERhcmdlc3RlbGx0IG5hY2gNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRCZWZvcmVfZmVhdHVyZSA9IERhcmdlc3RlbGx0IHZvcg0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9mZWF0dXJlID0gUGxhbnVuZ3NkYXRlbg0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3N1cGVyQWN0aXZpdGllc19mZWF0dXJlID0gXHUwMGRjYmVyZ2VvcmRuZXRlIEFrdGl2aXRcdTAwZTR0ZW4NCi1fVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUgPSBUZWFtcm9sbGVuDQotX1VJX1RlYW1Qcm9maWxlX3N1cGVyVGVhbV9mZWF0dXJlID0gU3VwZXJ0ZWFtDQotX1VJX1RlYW1Qcm9maWxlX3N1YlRlYW1fZmVhdHVyZSA9IFVuZ2VvcmRuZXRlcyBUZWFtDQotX1VJX1JvbGVEZXNjcmlwdG9yX1JvbGVfZmVhdHVyZSA9IFJvbGxlDQotX1VJX1JvbGVEZXNjcmlwdG9yX21vZGlmaWVzX2ZlYXR1cmUgPSBcdTAwYzRuZGVydW5nDQotX1VJX1JvbGVEZXNjcmlwdG9yX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUgPSBWZXJhbnR3b3J0bGljaCBmXHUwMGZjcg0KLV9VSV9Xb3JrT3JkZXJfbGlua1R5cGVfZmVhdHVyZSA9IExpbmstVHlwDQotX1VJX1dvcmtPcmRlcl9wcmVkX2ZlYXR1cmUgPSBWb3JnXHUwMGU0bmdlcg0KLV9VSV9QbGFubmluZ0RhdGFfc3RhcnREYXRlX2ZlYXR1cmUgPSBTdGFydGRhdHVtDQotX1VJX1BsYW5uaW5nRGF0YV9maW5pc2hEYXRlX2ZlYXR1cmUgPSBFbmRkYXR1bQ0KLV9VSV9QbGFubmluZ0RhdGFfcmFua19mZWF0dXJlID0gRWluc3R1ZnVuZw0KLV9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlID0gU3luY2hyb25pc2llcnQgbWl0IFF1ZWxsZQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUgPSBBbmZhbmdzenVzdGFuZCBkZXIgQWt0aXZpdFx1MDBlNHQNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RXhpdFN0YXRlX2ZlYXR1cmUgPSBFbmR6dXN0YW5kIGRlciBBa3Rpdml0XHUwMGU0dA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3RfZmVhdHVyZSA9IEFyYmVpdHNlcmdlYm5pcw0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0ZWRCeV9mZWF0dXJlID0gQmVlaW5mbHVzc3Qgdm9uDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RzX2ZlYXR1cmUgPSBBdXN3aXJrdW5nZW4NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2RlbGl2ZXJhYmxlUGFydHNfZmVhdHVyZSA9IFRlaWxlIGRlcyBMaWVmZXJnZWdlbnN0YW5kcw0KLV9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUgPSBBdWZnYWJlDQotX1VJX1Rhc2tEZXNjcmlwdG9yX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBTZWt1bmRcdTAwZTRyZXIgQXVzZlx1MDBmY2hyZW5kZXINCi1fVUlfVGFza0Rlc2NyaXB0b3JfYXNzaXN0ZWRCeV9mZWF0dXJlID0gVW50ZXJzdFx1MDBmY3R6dCB2b24NCi1fVUlfVGFza0Rlc2NyaXB0b3JfZXh0ZXJuYWxJbnB1dF9mZWF0dXJlID0gRXh0ZXJuZSBFaW5nYWJlDQotX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBWZXJiaW5kbGljaGUgRWluZ2FiZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBPcHRpb25hbGUgRWluZ2FiZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vdXRwdXRfZmVhdHVyZSA9IEF1c2dhYmUNCi1fVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSA9IFByaW1cdTAwZTRyZXIgQXVzZlx1MDBmY2hyZW5kZXINCi1fVUlfVGFza0Rlc2NyaXB0b3Jfc2VsZWN0ZWRTdGVwc19mZWF0dXJlID0gQXVzZ2V3XHUwMGU0aGx0ZSBTY2hyaXR0ZQ0KLV9VSV9Db21wb3NpdGVSb2xlX2FnZ3JlZ2F0ZWRSb2xlc19mZWF0dXJlID0gRWluemVscm9sbGVuDQotX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl91c2FnZUd1aWRhbmNlX2ZlYXR1cmUgPSBBbmxlaXR1bmcgenVyIFZlcndlbmR1bmcNCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBad2Vjaw0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gQWx0ZXJuYXRpdmVuDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25faG93dG9TdGFmZl9mZWF0dXJlID0gTWl0YXJiZWl0ZXIgZlx1MDBmY3IgVm9yZ2VoZW5zd2Vpc2UNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSA9IFNrYWxpZXJ1bmcNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlID0gUHJvamVrdG1lcmttYWxlDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlID0gUmlzaWtvc3R1ZmUNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fZXN0aW1hdGluZ1RlY2huaXF1ZV9mZWF0dXJlID0gU2NoXHUwMGU0dHp2ZXJmYWhyZW4NCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdE1lbWJlckV4cGVydGlzZV9mZWF0dXJlID0gS25vdy1ob3cgZGVyIFByb2pla3RtaXRhcmJlaXRlcg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gVHlwIGRlcyBWZXJ0cmFncw0KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gRXh0ZXJuZSBJRA0KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fc2NvcGVfZmVhdHVyZSA9IFNjb3BlDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl91c2FnZU5vdGVzX2ZlYXR1cmUgPSBWZXJ3ZW5kdW5nc2hpbndlaXNlDQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl9yZWZpbmVkRGVzY3JpcHRpb25fZmVhdHVyZSA9IFx1MDBkY2JlcmFyYmVpdGV0ZSBCZXNjaHJlaWJ1bmcNCi1fVUlfUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX2ZlYXR1cmUgPSBUZWlsdmVyZmFocmVuDQotX1VJX1ByYWN0aWNlX2NvbnRlbnRSZWZlcmVuY2VzX2ZlYXR1cmUgPSBJbmhhbHRzcmVmZXJlbnplbg0KLV9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSA9IEFrdGl2aXRcdTAwZTR0c3JlZmVyZW56ZW4NCi1fVUlfU3RhdGVfV29ya1Byb2R1Y3RfZmVhdHVyZSA9IEFyYmVpdHNlcmdlYm5pcw0KLV9VSV9TdGF0ZV9SZWdpb25fZmVhdHVyZSA9IFJlZ2lvbg0KLV9VSV9TdGF0ZV9zdWJtYWNoaW5lX2ZlYXR1cmUgPSBVbnRlcm1hc2NoaW5lDQotX1VJX1ZlcnRleF9jb250YWluZXJfZmVhdHVyZSA9IENvbnRhaW5lcg0KLV9VSV9WZXJ0ZXhfb3V0Z29pbmdfZmVhdHVyZSA9IEFiZ2VoZW5kDQotX1VJX1ZlcnRleF9pbmNvbWluZ19mZWF0dXJlID0gRWluZ2VoZW5kDQotX1VJX1JlZ2lvbl9WZXJ0ZXhfZmVhdHVyZSA9IFZlcnRleA0KLV9VSV9SZWdpb25fVHJhbnNpdGlvbl9mZWF0dXJlID0gXHUwMGRjYmVyZ2FuZw0KLV9VSV9SZWdpb25fU3RhdGVfZmVhdHVyZSA9IFp1c3RhbmQNCi1fVUlfUmVnaW9uX1N0YXRlTWFjaGluZV9mZWF0dXJlID0gWnVzdGFuZHNtYXNjaGluZQ0KLV9VSV9TdGF0ZU1hY2hpbmVfUmVnaW9uX2ZlYXR1cmUgPSBSZWdpb24NCi1fVUlfVHJhbnNpdGlvbl9Xb3JrRGVmaW5pdGlvbl9mZWF0dXJlID0gQXJiZWl0c2RlZmluaXRpb24NCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IENvbnRhaW5lcg0KLV9VSV9UcmFuc2l0aW9uX3NvdXJjZV9mZWF0dXJlID0gUXVlbGxlDQotX1VJX1RyYW5zaXRpb25fdGFyZ2V0X2ZlYXR1cmUgPSBaaWVsDQotX1VJX0Rpc2NpcGxpbmVfdGFza3NfZmVhdHVyZSA9IEF1ZmdhYmVuDQotX1VJX0Rpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9mZWF0dXJlID0gVW50ZXJkaXN6aXBsaW4NCi1fVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSA9IFJlZmVyZW56d29ya2Zsb3dzDQotX1VJX1JvbGVTZXRfcm9sZXNfZmVhdHVyZSA9IFJvbGxlbg0KLV9VSV9Eb21haW5fd29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBBcmJlaXRzZXJnZWJuaXNzZQ0KLV9VSV9Eb21haW5fc3ViZG9tYWluc19mZWF0dXJlID0gVW50ZXJkb21cdTAwZTRuZW4NCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3dvcmtQcm9kdWN0c19mZWF0dXJlID0gQXJiZWl0c2VyZ2Vibmlzc2UNCi1fVUlfRGlzY2lwbGluZUdyb3VwaW5nX2Rpc2NpcGxpbmVzX2ZlYXR1cmUgPSBEaXN6aXBsaW5lbg0KLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBUb29sbWVudG9yZW4NCi1fVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUgPSBSb2xsZW5ncnVwcGVuDQotX1VJX0N1c3RvbUNhdGVnb3J5X2NhdGVnb3JpemVkRWxlbWVudHNfZmVhdHVyZSA9IEthdGVnb3Jpc2llcnRlIEVsZW1lbnRlDQotX1VJX0N1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfZmVhdHVyZSA9IFVudGVya2F0ZWdvcmllbg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUgPSBMZXJubWF0ZXJpYWwNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBLb21tdW5pa2F0aW9uc21hdGVyaWFsDQotX1VJX1Byb2Nlc3NfaW5jbHVkZXNQYXR0ZXJuc19mZWF0dXJlID0gRW50aFx1MDBlNGx0IE11c3Rlcg0KLV9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUgPSBTdGFuZGFyZGtvbnRleHQNCi1fVUlfUHJvY2Vzc192YWxpZENvbnRleHRfZmVhdHVyZSA9IEdcdTAwZmNsdGlnZXIgS29udGV4dA0KLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9iYXNlZE9uUHJvY2Vzc2VzX2ZlYXR1cmUgPSBBdWYgQmFzaXMgdm9uIFByb3plc3Nlbg0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50X2ludGVyZmFjZXNfZmVhdHVyZSA9IFNjaG5pdHRzdGVsbGVuDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gUHJvemVzcw0KLV9VSV9Qcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfZmVhdHVyZSA9IFByb3plc3NlbGVtZW50ZQ0KLV9VSV9Qcm9jZXNzUGFja2FnZV9kaWFncmFtc19mZWF0dXJlID0gRGlhZ3JhbW1lDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnNfZmVhdHVyZSA9IFNjaG5pdHRzdGVsbGVuc3BlemlmaWthdGlvbmVuDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fZmVhdHVyZSA9IFNjaG5pdHRzdGVsbGVuLUUvQQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUgPSBQcm96ZXNza29tcG9uZW50ZQ0KLV9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSA9IFZvbSBCZW51dHplciBcdTAwZTRuZGVyYmFyDQotX1VJX01ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19mZWF0dXJlID0gTWV0aG9kZW5wYWtldGUNCi1fVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUgPSBCYXNpcw0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUgPSBWYXJpYWJpbGl0XHUwMGU0dHN0eXANCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSA9IFZhcmlhYmlsaXRcdTAwZTR0IGF1ZiBFbGVtZW50YmFzaXMNCi1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBBdXRvcmVuDQotX1VJX01ldGhvZFVuaXRfY2hhbmdlRGF0ZV9mZWF0dXJlID0gXHUwMGM0bmRlcnVuZ3NkYXR1bQ0KLV9VSV9NZXRob2RVbml0X2NoYW5nZURlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTAwYzRuZGVydW5nc2Jlc2NocmVpYnVuZw0KLV9VSV9NZXRob2RVbml0X3ZlcnNpb25fZmVhdHVyZSA9IFZlcnNpb24NCi1fVUlfTWV0aG9kVW5pdF9jb3B5cmlnaHRTdGF0ZW1lbnRfZmVhdHVyZSA9IENvcHlyaWdodHZlcm1lcmsNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSA9IEF1c3dhaGwgZGVzIE1ldGhvZGVuLVBsdWctaW4NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUgPSBBdXN3YWhsIGRlciBNZXRob2RlbnBha2V0ZQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlID0gUHJvemVzc3NpY2h0ZW4NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9kZWZhdWx0Vmlld19mZWF0dXJlID0gU3RhbmRhcmRzaWNodA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gQmFzaXNrb25maWd1cmF0aW9uZW4NCi1fVUlfUHJvY2Vzc0ZhbWlseV9kZWxpdmVyeVByb2Nlc3Nlc19mZWF0dXJlID0gQmVyZWl0c3RlbGx1bmdzcHJvemVzc2UNCi1fVUlfTWV0aG9kTGlicmFyeV9tZXRob2RQbHVnaW5zX2ZlYXR1cmUgPSBNZXRob2Rlbi1QbHVnLWlucw0KLV9VSV9NZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19mZWF0dXJlID0gVm9yZGVmaW5pZXJ0ZSBLb25maWd1cmF0aW9uZW4NCi1fVUlfVW5rbm93bl9mZWF0dXJlID0gTmljaHQgYW5nZWdlYmVuDQotDQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9TdGFydF9saXRlcmFsID0gZmluaXNoVG9TdGFydA0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvRmluaXNoX2xpdGVyYWwgPSBmaW5pc2hUb0ZpbmlzaA0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9TdGFydF9saXRlcmFsID0gc3RhcnRUb1N0YXJ0DQotX1VJX1dvcmtPcmRlclR5cGVfc3RhcnRUb0ZpbmlzaF9saXRlcmFsID0gc3RhcnRUb0ZpbmlzaA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfaW5pdGlhbF9saXRlcmFsID0gSW5pdGlhbA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gVmVya25cdTAwZmNwZnVuZw0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZm9ya19saXRlcmFsID0gVmVyendlaWd1bmcNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBadXNhbW1lbmZcdTAwZmNocnVuZw0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfY2hvaWNlX2xpdGVyYWwgPSBBdXN3YWhsDQotX1VJX1BzZXVkb1N0YXRlS2luZF9lbnRyeVBvaW50X2xpdGVyYWwgPSBFaW5zdGllZ3NwdW5rdA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZXhpdFBvaW50X2xpdGVyYWwgPSBBdXNzdGllZ3NwdW5rdA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfdGVybWluYXRlX2xpdGVyYWwgPSBCZWVuZGVuDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9uYV9saXRlcmFsID0gTi9BDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9jb250cmlidXRlc19saXRlcmFsID0gQmVpdHJhZw0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gRXJ3ZWl0ZXJ1bmcNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX3JlcGxhY2VzX2xpdGVyYWwgPSBFcnNldHp1bmcNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsQ29udHJpYnV0aW9uX2xpdGVyYWwgPSBMb2thbGVyIEJlaXRyYWcNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IExva2FsZSBFcnNldHp1bmcNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdG9yX3R5cGUgPSBBcnRlZmFrdGRlc2tyaXB0b3INCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBMaWVmZXJnZWdlbnN0YW5kc2Rlc2tyaXB0b3INCi1fVUlfT3V0Y29tZURlc2NyaXB0b3JfdHlwZSA9IFJlc3VsdGF0ZGVza3JpcHRvcg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGNmOWVmNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1wbHVnaW5OYW1lID0gU29wb3J0ZSBkZSBlZGljaVx1MDBmM24gZGUgVU1BIGRlIEVNRg0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQotX1VJX0NyZWF0ZUNoaWxkX3RleHQgPSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDIgPSB7MX0gezB9DQotX1VJX0NyZWF0ZUNoaWxkX3RleHQzID0gezF9DQotX1VJX0NyZWF0ZUNoaWxkX3Rvb2x0aXAgPSBDcmVhciB7MH0gbnVldm8gZW4gbGEgY2FyYWN0ZXJcdTAwZWRzdGljYSB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfZGVzY3JpcHRpb24gPSBDcmVhciB1biBoaWpvIG51ZXZvIGRlIHRpcG8gezB9IHBhcmEgbGEgY2FyYWN0ZXJcdTAwZWRzdGljYSB7MX0gZGVsIHsyfSBzZWxlY2Npb25hZG8uDQotX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBDcmVhciB1biBpZ3VhbCBudWV2byBkZSB0aXBvIHswfSBwYXJhIGVsIHsyfSBzZWxlY2Npb25hZG8sIGVuIGxhIGNhcmFjdGVyXHUwMGVkc3RpY2EgezF9IGRlbCBwYWRyZS4NCi0NCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gRWwgezB9IGRlbCB7MX0NCi0NCi1fVUlfQ2xhc3NpZmllcl90eXBlID0gQ2xhc2lmaWNhZG9yDQotX1VJX1R5cGVfdHlwZSA9IFRpcG8NCi1fVUlfRWxlbWVudF90eXBlID0gRWxlbWVudG8NCi1fVUlfTmFtZWRFbGVtZW50X3R5cGUgPSBFbGVtZW50byBjb24gbm9tYnJlDQotX1VJX1BhY2thZ2VhYmxlRWxlbWVudF90eXBlID0gRWxlbWVudG8gZW1wYXF1ZXRhYmxlDQotX1VJX1BhY2thZ2VfdHlwZSA9IFBhcXVldGUNCi1fVUlfTmFtZXNwYWNlX3R5cGUgPSBFc3BhY2lvIGRlIG5vbWJyZXMNCi1fVUlfTWV0aG9kRWxlbWVudF90eXBlID0gRWxlbWVudG8gZGUgbVx1MDBlOXRvZG8NCi1fVUlfQ29uc3RyYWludF90eXBlID0gUmVzdHJpY2NpXHUwMGYzbg0KLV9VSV9Db250ZW50RWxlbWVudF90eXBlID0gRWxlbWVudG8gZGUgY29udGVuaWRvDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlID0gRWxlbWVudG8gZGVzY3JpcHRpYmxlDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcGNpXHUwMGYzbiBkZWwgY29udGVuaWRvDQotX1VJX1NlY3Rpb25fdHlwZSA9IFNlY2NpXHUwMGYzbg0KLV9VSV9Sb2xlX3R5cGUgPSBSb2wNCi1fVUlfV29ya1Byb2R1Y3RfdHlwZSA9IFByb2R1Y3RvIGRlIHRyYWJham8NCi1fVUlfVGFza190eXBlID0gVGFyZWENCi1fVUlfV29ya0RlZmluaXRpb25fdHlwZSA9IERlZmluaWNpXHUwMGYzbiBkZSB0cmFiYWpvDQotX1VJX1N0ZXBfdHlwZSA9IFBhc28NCi1fVUlfR3VpZGFuY2VfdHlwZSA9IEd1XHUwMGVkYQ0KLV9VSV9BcnRpZmFjdF90eXBlID0gQXJ0ZWZhY3RvDQotX1VJX0RlbGl2ZXJhYmxlX3R5cGUgPSBQcm9kdWN0byBmaW5hbA0KLV9VSV9PdXRjb21lX3R5cGUgPSBSZXN1bHRhZG8NCi1fVUlfTWV0aG9kUGFja2FnZV90eXBlID0gUGFxdWV0ZSBkZWwgbVx1MDBlOXRvZG8NCi1fVUlfQ29udGVudFBhY2thZ2VfdHlwZSA9IFBhcXVldGUgZGUgY29udGVuaWRvDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXBjaVx1MDBmM24gZGVsIGFydGVmYWN0bw0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwY2lcdTAwZjNuIGRlbCBwcm9kdWN0byBkZSB0cmFiYWpvDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXBjaVx1MDBmM24gZGVsIHByb2R1Y3RvIGZpbmFsDQotX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcGNpXHUwMGYzbiBkZWwgcm9sDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcGNpXHUwMGYzbiBkZSBsYSB0YXJlYQ0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwY2lcdTAwZjNuIGRlIGxhIGd1XHUwMGVkYQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwY2lcdTAwZjNuIGRlIGxhIHByXHUwMGUxY3RpY2ENCi1fVUlfUG9pbnRfdHlwZSA9IFB1bnRvDQotX1VJX0dyYXBoRWxlbWVudF90eXBlID0gRWxlbWVudG8gZ3JcdTAwZTFmaWNvDQotX1VJX0RpYWdyYW1FbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZSBkaWFncmFtYQ0KLV9VSV9EaWFncmFtTGlua190eXBlID0gRW5sYWNlIGRlIGRpYWdyYW1hDQotX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUgPSBDb25lY3RvciBnclx1MDBlMWZpY28NCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gUHVlbnRlIGRlIG1vZGVsbyBzZW1cdTAwZTFudGljbw0KLV9VSV9EaW1lbnNpb25fdHlwZSA9IERpbWVuc2lcdTAwZjNuDQotX1VJX1JlZmVyZW5jZV90eXBlID0gUmVmZXJlbmNpYQ0KLV9VSV9Qcm9wZXJ0eV90eXBlID0gUHJvcGllZGFkDQotX1VJX0dyYXBoRWRnZV90eXBlID0gQm9yZGUgZ3JcdTAwZTFmaWNvDQotX1VJX0RpYWdyYW1fdHlwZSA9IERpYWdyYW1hDQotX1VJX0dyYXBoTm9kZV90eXBlID0gTm9kbyBnclx1MDBlMWZpY28NCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIGRlIG1vZGVsbyBzZW1cdTAwZTFudGljbyBzaW1wbGUNCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gUHVlbnRlIGRlIG1vZGVsbyBzZW1cdTAwZTFudGljbyBkZSBVTUENCi1fVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IFB1ZW50ZSBkZSBtb2RlbG8gc2VtXHUwMGUxbnRpY28gY2VudHJhbA0KLV9VSV9MZWFmRWxlbWVudF90eXBlID0gRWxlbWVudG8gc2luIHNlY3VuZGFyaW9zDQotX1VJX1RleHRFbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZSB0ZXh0bw0KLV9VSV9JbWFnZV90eXBlID0gSW1hZ2VuDQotX1VJX0dyYXBoaWNQcmltaXRpdmVfdHlwZSA9IFByaW1pdGl2byBnclx1MDBlMWZpY28NCi1fVUlfUG9seWxpbmVfdHlwZSA9IFBvbGlsXHUwMGVkbmVhDQotX1VJX0VsbGlwc2VfdHlwZSA9IEVsaXBzZQ0KLV9VSV9BY3Rpdml0eV90eXBlID0gQWN0aXZpZGFkDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZSBkZXNnbG9zZSBkZSB0cmFiYWpvDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIGRlIGRlc2dsb3NlDQotX1VJX01pbGVzdG9uZV90eXBlID0gT2JqZXRpdm8NCi1fVUlfSXRlcmF0aW9uX3R5cGUgPSBJdGVyYWNpXHUwMGYzbg0KLV9VSV9QaGFzZV90eXBlID0gRmFzZQ0KLV9VSV9UZWFtUHJvZmlsZV90eXBlID0gUGVyZmlsIGRlbCBlcXVpcG8NCi1fVUlfUm9sZURlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXB0b3IgZGUgcm9sZXMNCi1fVUlfV29ya09yZGVyX3R5cGUgPSBQZWRpZG8gZGUgdHJhYmFqbw0KLV9VSV9Qcm9jZXNzRWxlbWVudF90eXBlID0gRWxlbWVudG8gZGUgcHJvY2Vzbw0KLV9VSV9QbGFubmluZ0RhdGFfdHlwZSA9IERhdG9zIGRlIGxhIHBsYW5pZmljYWNpXHUwMGYzbg0KLV9VSV9EZXNjcmlwdG9yX3R5cGUgPSBEZXNjcmlwdG9yDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlID0gRGVzY3JpcHRvciBkZSBwcm9kdWN0b3MgZGUgdHJhYmFqbw0KLV9VSV9UYXNrRGVzY3JpcHRvcl90eXBlID0gRGVzY3JpcHRvciBkZSB0YXJlYXMNCi1fVUlfQ29tcG9zaXRlUm9sZV90eXBlID0gUm9sIGNvbXB1ZXN0bw0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXBjaVx1MDBmM24gZGVsIGVsZW1lbnRvIGRlIGRlc2dsb3NlDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXBjaVx1MDBmM24gZGUgbGEgYWN0aXZpZGFkDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwY2lcdTAwZjNuIGRlbCBwcm9jZXNvIGRlIGVudHJlZ2ENCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwY2lcdTAwZjNuIGRlbCBwcm9jZXNvDQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcGNpXHUwMGYzbiBkZWwgZGVzY3JpcHRvcg0KLV9VSV9Db25jZXB0X3R5cGUgPSBDb25jZXB0bw0KLV9VSV9DaGVja2xpc3RfdHlwZSA9IExpc3RhIGRlIGNvbXByb2JhY2lcdTAwZjNuDQotX1VJX0V4YW1wbGVfdHlwZSA9IEVqZW1wbG8NCi1fVUlfR3VpZGVsaW5lX3R5cGUgPSBEaXJlY3RyaXoNCi1fVUlfUmVwb3J0X3R5cGUgPSBJbmZvcm1lDQotX1VJX1RlbXBsYXRlX3R5cGUgPSBQbGFudGlsbGENCi1fVUlfU3VwcG9ydGluZ01hdGVyaWFsX3R5cGUgPSBNYXRlcmlhbCBkZSBzb3BvcnRlDQotX1VJX1Rvb2xNZW50b3JfdHlwZSA9IEd1XHUwMGVkYSBkZSBsYSBoZXJyYW1pZW50YQ0KLV9VSV9XaGl0ZXBhcGVyX3R5cGUgPSBEb2N1bWVudGFjaVx1MDBmM24NCi1fVUlfVGVybURlZmluaXRpb25fdHlwZSA9IERlZmluaWNpXHUwMGYzbiBkZSB0XHUwMGU5cm1pbm9zDQotX1VJX1ByYWN0aWNlX3R5cGUgPSBQclx1MDBlMWN0aWNhDQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gQ29uc2lkZXJhY2lvbmVzIHNvYnJlIGVsIGNcdTAwZTFsY3Vsbw0KLV9VSV9SZXVzYWJsZUFzc2V0X3R5cGUgPSBBY3Rpdm8gcmV1dGlsaXphYmxlDQotX1VJX1N0YXRlX3R5cGUgPSBFc3RhZG8NCi1fVUlfVmVydGV4X3R5cGUgPSBWXHUwMGU5cnRpY2UNCi1fVUlfUmVnaW9uX3R5cGUgPSBSZWdpXHUwMGYzbg0KLV9VSV9TdGF0ZU1hY2hpbmVfdHlwZSA9IE1cdTAwZTFxdWluYSBkZSBlc3RhZG8NCi1fVUlfVHJhbnNpdGlvbl90eXBlID0gVHJhbnNpY2lcdTAwZjNuDQotX1VJX1BzZXVkb1N0YXRlX3R5cGUgPSBQc2V1ZG9lc3RhZG8NCi1fVUlfRGlzY2lwbGluZV90eXBlID0gRGlzY2lwbGluYQ0KLV9VSV9Db250ZW50Q2F0ZWdvcnlfdHlwZSA9IENhdGVnb3JcdTAwZWRhIGRlbCBjb250ZW5pZG8NCi1fVUlfUm9sZVNldF90eXBlID0gQ29uanVudG8gZGUgcm9sZXMNCi1fVUlfRG9tYWluX3R5cGUgPSBEb21pbmlvDQotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gQ2xhc2UgZGUgcHJvZHVjdG8gZGUgdHJhYmFqbw0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSA9IEFncnVwYWNpXHUwMGYzbiBkZSBkaXNjaXBsaW5hcw0KLV9VSV9Ub29sX3R5cGUgPSBIZXJyYW1pZW50YQ0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSA9IEFncnVwYWNpXHUwMGYzbiBkZSBjb25qdW50b3MgZGUgcm9sZXMNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSA9IENhdGVnb3JcdTAwZWRhIHBlcnNvbmFsaXphZGENCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUgPSBQcm9jZXNvIGRlIGVudHJlZ2ENCi1fVUlfUHJvY2Vzc190eXBlID0gUHJvY2Vzbw0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlID0gUGF0clx1MDBmM24gZGUgcG9zaWJpbGlkYWQNCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfdHlwZSA9IFBsYW50aWxsYSBkZSBwbGFuaWZpY2FjaVx1MDBmM24gZGUgcHJvY2Vzb3MNCi1fVUlfUm9hZG1hcF90eXBlID0gTWFwYQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50X3R5cGUgPSBDb21wb25lbnRlIGRlbCBwcm9jZXNvDQotX1VJX1Byb2Nlc3NQYWNrYWdlX3R5cGUgPSBQYXF1ZXRlIGRlIHByb2Nlc28NCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV90eXBlID0gSW50ZXJmYXogZGVsIGNvbXBvbmVudGUgZGUgcHJvY2Vzbw0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlID0gRGVzY3JpcHRvciBkZWwgY29tcG9uZW50ZSBkZSBwcm9jZXNvDQotX1VJX01ldGhvZFBsdWdpbl90eXBlID0gUGx1Zy1pbiBkZSBtXHUwMGU5dG9kbw0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIGRlIHZhcmlhYmlsaWRhZA0KLV9VSV9NZXRob2RVbml0X3R5cGUgPSBVbmlkYWQgZGVsIG1cdTAwZTl0b2RvDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSA9IENvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbw0KLV9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUgPSBGYW1pbGlhIGRlbCBwcm9jZXNvDQotX1VJX01ldGhvZExpYnJhcnlfdHlwZSA9IEJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zDQotX1VJX1Vua25vd25fdHlwZSA9IE9iamV0bw0KLQ0KLV9VSV9Vbmtub3duX2RhdGF0eXBlPSBWYWxvcg0KLQ0KLV9VSV9OYW1lZEVsZW1lbnRfbmFtZV9mZWF0dXJlID0gTm9tYnJlDQotX1VJX01ldGhvZEVsZW1lbnRfZ3VpZF9mZWF0dXJlID0gR1VJRA0KLV9VSV9NZXRob2RFbGVtZW50X2JyaWVmRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaXBjaVx1MDBmM24gYnJldmUNCi1fVUlfTWV0aG9kRWxlbWVudF9vd25lZFJ1bGVzX2ZlYXR1cmUgPSBSZWdsYXMgY29uIHByb3BpZXRhcmlvDQotX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlID0gU3VwcmltaWRvDQotX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlID0gR3VcdTAwZWRhIGRlIHBlZGlkbw0KLV9VSV9Db25zdHJhaW50X2JvZHlfZmVhdHVyZSA9IEN1ZXJwbw0KLV9VSV9Db250ZW50RWxlbWVudF9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUgPSBNYXRlcmlhbGVzIGRlIHNvcG9ydGUNCi1fVUlfQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfZmVhdHVyZSA9IENvbmNlcHRvcyB5IGRvY3VtZW50YWNpXHUwMGYzbg0KLV9VSV9Db250ZW50RWxlbWVudF9jaGVja2xpc3RzX2ZlYXR1cmUgPSBMaXN0YXMgZGUgY29tcHJvYmFjaVx1MDBmM24NCi1fVUlfQ29udGVudEVsZW1lbnRfZ3VpZGVsaW5lc19mZWF0dXJlID0gRGlyZWN0cmljZXMNCi1fVUlfQ29udGVudEVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSA9IEVqZW1wbG9zDQotX1VJX0NvbnRlbnRFbGVtZW50X2Fzc2V0c19mZWF0dXJlID0gQWN0aXZvcw0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uTmFtZV9mZWF0dXJlID0gTm9tYnJlIGRlIHByZXNlbnRhY2lcdTAwZjNuDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fZmVhdHVyZSA9IFByZXNlbnRhY2lcdTAwZjNuDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9zaGFwZWljb25fZmVhdHVyZSA9IFNoYXBlaWNvbg0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfbm9kZWljb25fZmVhdHVyZSA9IE5vZGVpY29uDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9tYWluRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaXBjaVx1MDBmM24gcHJpbmNpcGFsDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19mZWF0dXJlID0gU2VjY2lvbmVzDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9rZXlDb25zaWRlcmF0aW9uc19mZWF0dXJlID0gRmFjdG9yZXMgY2xhdmUNCi1fVUlfU2VjdGlvbl9zZWN0aW9uTmFtZV9mZWF0dXJlID0gTm9tYnJlIGRlIHNlY2NpXHUwMGYzbg0KLV9VSV9TZWN0aW9uX3NlY3Rpb25EZXNjcmlwdGlvbl9mZWF0dXJlID0gRGVzY3JpcGNpXHUwMGYzbiBkZSBsYSBzZWNjaVx1MDBmM24NCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gU3Vic2VjY2lvbmVzDQotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IFByZWRlY2Vzb3INCi1fVUlfUm9sZV9tb2RpZmllc19mZWF0dXJlID0gTW9kaWZpY2ENCi1fVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlID0gUmVzcG9uc2FibGUgZGUNCi1fVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlID0gSW5mb3JtZXMNCi1fVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUgPSBQbGFudGlsbGFzDQotX1VJX1dvcmtQcm9kdWN0X3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBHdVx1MDBlZGFzIGRlIGxhIGhlcnJhbWllbnRhDQotX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gQ29uc2lkZXJhY2lvbmVzIHNvYnJlIGVsIGNcdTAwZTFsY3Vsbw0KLV9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBSZWFsaXphZG8gcG9yDQotX1VJX1Rhc2tfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IEVudHJhZGEgb2JsaWdhdG9yaWENCi1fVUlfVGFza19vdXRwdXRfZmVhdHVyZSA9IFNhbGlkYQ0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBSZWFsaXphZG8gYWRpY2lvbmFsbWVudGUgcG9yDQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gRW50cmFkYSBvcGNpb25hbA0KLV9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUgPSBQYXNvcw0KLV9VSV9UYXNrX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBHdVx1MDBlZGFzIGRlIGxhIGhlcnJhbWllbnRhDQotX1VJX1Rhc2tfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBDb25zaWRlcmFjaW9uZXMgc29icmUgZWwgY1x1MDBlMWxjdWxvDQotX1VJX1dvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9mZWF0dXJlID0gQ29uZGljaVx1MDBmM24gcHJldmlhDQotX1VJX1dvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fZmVhdHVyZSA9IENvbmRpY2lcdTAwZjNuIHBvc3Rlcmlvcg0KLV9VSV9BcnRpZmFjdF9jb250YWluZXJBcnRpZmFjdF9mZWF0dXJlID0gQXJ0ZWZhY3RvIGRlbCBjb250ZW5lZG9yDQotX1VJX0FydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19mZWF0dXJlID0gQXJ0ZWZhY3RvcyBjb250ZW5pZG9zDQotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gUHJvZHVjdG9zIGRlIHRyYWJham8gZW50cmVnYWRvcw0KLV9VSV9NZXRob2RQYWNrYWdlX2dsb2JhbF9mZWF0dXJlID0gR2xvYmFsDQotX1VJX01ldGhvZFBhY2thZ2VfcmV1c2VkUGFja2FnZXNfZmVhdHVyZSA9IFBhcXVldGVzIHJldXRpbGl6YWRvcw0KLV9VSV9NZXRob2RQYWNrYWdlX3BhcmVudFBhY2thZ2VfZmVhdHVyZSA9IFBhcXVldGUgcGFkcmUNCi1fVUlfTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX2ZlYXR1cmUgPSBQYXF1ZXRlcyBoaWpvDQotX1VJX0NvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19mZWF0dXJlID0gRWxlbWVudG9zIGRlIGNvbnRlbmlkbw0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX2JyaWVmT3V0bGluZV9mZWF0dXJlID0gRXNxdWVtYXRpemFjaVx1MDBmM24gYnJldmUNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9yZXByZXNlbnRhdGlvbk9wdGlvbnNfZmVhdHVyZSA9IE9wY2lvbmVzIGRlIHJlcHJlc2VudGFjaVx1MDBmM24NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBJRCBleHRlcm5vDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gT2JqZXRpdm8NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9pbXBhY3RPZk5vdEhhdmluZ19mZWF0dXJlID0gSW1wYWN0byBkZSBubyB0ZW5lcg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3JlYXNvbnNGb3JOb3ROZWVkaW5nX2ZlYXR1cmUgPSBNb3Rpdm9zIHBhcmEgbm8gbmVjZXNpdGFyDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fZXh0ZXJuYWxEZXNjcmlwdGlvbl9mZWF0dXJlID0gRGVzY3JpcGNpXHUwMGYzbiBleHRlcm5hDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSA9IEd1XHUwMGVkYSBkZSBlbXBhcXVldGFkbw0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fc2tpbGxzX2ZlYXR1cmUgPSBIYWJpbGlkYWRlcw0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fYXNzaWdubWVudEFwcHJvYWNoZXNfZmVhdHVyZSA9IFByb3B1ZXN0YXMgZGUgYXNpZ25hY2lcdTAwZjNuDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlID0gU2luXHUwMGYzbmltb3MNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IE9iamV0aXZvDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSA9IEFsdGVybmF0aXZhcw0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX2F0dGFjaG1lbnRzX2ZlYXR1cmUgPSBBcmNoaXZvcyBkZSBkYXRvcyBhZGp1bnRvcw0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUgPSBJbmZvcm1hY2lcdTAwZjNuIGFkaWNpb25hbA0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3Byb2JsZW1fZmVhdHVyZSA9IFByb2JsZW1hDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlID0gRm9uZG8NCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9nb2Fsc19mZWF0dXJlID0gT2JqZXRpdm9zDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYXBwbGljYXRpb25fZmVhdHVyZSA9IEFwbGljYWNpXHUwMGYzbg0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2xldmVsc09mQWRvcHRpb25fZmVhdHVyZSA9IE5pdmVsZXMgZGUgYWRvcGNpXHUwMGYzbg0KLV9VSV9Qb2ludF94X2ZlYXR1cmUgPSBYDQotX1VJX1BvaW50X3lfZmVhdHVyZSA9IFkNCi1fVUlfR3JhcGhFbGVtZW50X3Bvc2l0aW9uX2ZlYXR1cmUgPSBQb3NpY2lcdTAwZjNuDQotX1VJX0dyYXBoRWxlbWVudF9jb250YWluZWRfZmVhdHVyZSA9IENvbnRlbmlkbw0KLV9VSV9HcmFwaEVsZW1lbnRfbGlua19mZWF0dXJlID0gRW5sYWNlDQotX1VJX0dyYXBoRWxlbWVudF9hbmNob3JhZ2VfZmVhdHVyZSA9IEFuY2xhamUNCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IE1vZGVsbyBzZW1cdTAwZTFudGljbw0KLV9VSV9EaWFncmFtRWxlbWVudF9pc1Zpc2libGVfZmVhdHVyZSA9IEVzIHZpc2libGUNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfY29udGFpbmVyX2ZlYXR1cmUgPSBDb250ZW5lZG9yDQotX1VJX0RpYWdyYW1FbGVtZW50X3JlZmVyZW5jZV9mZWF0dXJlID0gUmVmZXJlbmNpYQ0KLV9VSV9EaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9mZWF0dXJlID0gUHJvcGllZGFkDQotX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSA9IFpvb20NCi1fVUlfRGlhZ3JhbUxpbmtfdmlld3BvcnRfZmVhdHVyZSA9IFZpc29yDQotX1VJX0RpYWdyYW1MaW5rX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gRWxlbWVudG8gZ3JcdTAwZTFmaWNvDQotX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSA9IERpYWdyYW1hDQotX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gRWxlbWVudG8gZ3JcdTAwZTFmaWNvDQotX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWRnZV9mZWF0dXJlID0gQm9yZGUgZ3JcdTAwZTFmaWNvDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQcmVzZW50YWNpXHUwMGYzbg0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gRWxlbWVudG8gZ3JcdTAwZTFmaWNvDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZGlhZ3JhbV9mZWF0dXJlID0gRGlhZ3JhbWENCi1fVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUgPSBBbmNobw0KLV9VSV9EaW1lbnNpb25faGVpZ2h0X2ZlYXR1cmUgPSBBbHR1cmENCi1fVUlfUmVmZXJlbmNlX2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBFcyB1bmEgcmVwcmVzZW50YWNpXHUwMGYzbiBpbmRpdmlkdWFsDQotX1VJX1JlZmVyZW5jZV9yZWZlcmVuY2VkX2ZlYXR1cmUgPSBDb24gcmVmZXJlbmNpYXMNCi1fVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUgPSBDbGF2ZQ0KLV9VSV9Qcm9wZXJ0eV92YWx1ZV9mZWF0dXJlID0gVmFsb3INCi1fVUlfR3JhcGhFZGdlX2FuY2hvcl9mZWF0dXJlID0gQW5jbGENCi1fVUlfR3JhcGhFZGdlX3dheXBvaW50c19mZWF0dXJlID0gUHVudG9zIGRlIHJlZmVyZW5jaWENCi1fVUlfRGlhZ3JhbV96b29tX2ZlYXR1cmUgPSBab29tDQotX1VJX0RpYWdyYW1fdmlld3BvaW50X2ZlYXR1cmUgPSBQdW50byBkZSB2aXN0YQ0KLV9VSV9EaWFncmFtX2RpYWdyYW1MaW5rX2ZlYXR1cmUgPSBFbmxhY2UgZGUgZGlhZ3JhbWENCi1fVUlfRGlhZ3JhbV9uYW1lc3BhY2VfZmVhdHVyZSA9IEVzcGFjaW8gZGUgbm9tYnJlcw0KLV9VSV9HcmFwaE5vZGVfc2l6ZV9mZWF0dXJlID0gVGFtYVx1MDBmMW8NCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZUluZm9fZmVhdHVyZSA9IEluZm9ybWFjaVx1MDBmM24gZGUgdGlwbw0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnRvDQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnRvDQotX1VJX1RleHRFbGVtZW50X3RleHRfZmVhdHVyZSA9IFRleHRvDQotX1VJX0ltYWdlX3VyaV9mZWF0dXJlID0gVVJJDQotX1VJX0ltYWdlX21pbWVUeXBlX2ZlYXR1cmUgPSBUaXBvIE1pbWUNCi1fVUlfUG9seWxpbmVfY2xvc2VkX2ZlYXR1cmUgPSBDZXJyYWRvDQotX1VJX1BvbHlsaW5lX3dheXBvaW50c19mZWF0dXJlID0gUHVudG9zIGRlIHJlZmVyZW5jaWENCi1fVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUgPSBSYWRpbyBYDQotX1VJX0VsbGlwc2VfcmFkaXVzWV9mZWF0dXJlID0gUmFkaW8gWQ0KLV9VSV9FbGxpcHNlX3JvdGF0aW9uX2ZlYXR1cmUgPSBSb3RhY2lcdTAwZjNuDQotX1VJX0VsbGlwc2Vfc3RhcnRBbmdsZV9mZWF0dXJlID0gXHUwMGMxbmd1bG8gZGUgaW5pY2lvDQotX1VJX0VsbGlwc2VfZW5kQW5nbGVfZmVhdHVyZSA9IFx1MDBjMW5ndWxvIGRlIGZpbmFsaXphY2lcdTAwZjNuDQotX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUgPSBDZW50cm8NCi1fVUlfQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfZmVhdHVyZSA9IEVsZW1lbnRvcyBkZSBkZXNnbG9zZQ0KLV9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlID0gTWFwYXMNCi1fVUlfQWN0aXZpdHlfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gTWF0ZXJpYWxlcyBkZSBzb3BvcnRlDQotX1VJX0FjdGl2aXR5X2NoZWNrbGlzdHNfZmVhdHVyZSA9IExpc3RhcyBkZSBjb21wcm9iYWNpXHUwMGYzbg0KLV9VSV9BY3Rpdml0eV9jb25jZXB0c19mZWF0dXJlID0gQ29uY2VwdG9zDQotX1VJX0FjdGl2aXR5X2V4YW1wbGVzX2ZlYXR1cmUgPSBFamVtcGxvcw0KLV9VSV9BY3Rpdml0eV9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBEaXJlY3RyaWNlcw0KLV9VSV9BY3Rpdml0eV9yZXVzYWJsZUFzc2V0c19mZWF0dXJlID0gQWN0aXZvcyByZXV0aWxpemFibGVzDQotX1VJX0FjdGl2aXR5X2lzRW5hY3RhYmxlX2ZlYXR1cmUgPSBFcyByZWFsaXphYmxlDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzUmVwZWF0YWJsZV9mZWF0dXJlID0gU2UgcHVlZGUgcmVwZXRpcg0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSA9IEVzIGNvbnRpbnVvDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzRXZlbnREcml2ZW5fZmVhdHVyZSA9IEVzdFx1MDBlMSBjb25kaWNpb25hZG8gcG9yIHN1Y2Vzb3MNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfbGlua1RvUHJlZGVjZXNzb3JfZmVhdHVyZSA9IEVubGF6YXIgYSB1biBwcmVkZWNlc29yDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlZml4X2ZlYXR1cmUgPSBQcmVmaWpvDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNQbGFubmVkX2ZlYXR1cmUgPSBFc3RcdTAwZTEgcGxhbmVhZG8NCi1fVUlfQnJlYWtkb3duRWxlbWVudF9oYXNNdWx0aXBsZU9jY3VycmVuY2VzX2ZlYXR1cmUgPSBUaWVuZSB2YXJpYXMgYXBhcmljaW9uZXMNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc09wdGlvbmFsX2ZlYXR1cmUgPSBFcyBvcGNpb25hbA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEFmdGVyX2ZlYXR1cmUgPSBQcmVzZW50YWRvIGRlc3B1XHUwMGU5cw0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEJlZm9yZV9mZWF0dXJlID0gUHJlc2VudGFkbyBhbnRlcw0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9mZWF0dXJlID0gRGF0b3MgZGUgbGEgcGxhbmlmaWNhY2lcdTAwZjNuDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwZXJBY3Rpdml0aWVzX2ZlYXR1cmUgPSBTdXBlcmFjdGl2aWRhZGVzDQotX1VJX1RlYW1Qcm9maWxlX3RlYW1Sb2xlc19mZWF0dXJlID0gUm9sZXMgZGUgZXF1aXBvDQotX1VJX1RlYW1Qcm9maWxlX3N1cGVyVGVhbV9mZWF0dXJlID0gU3VwZXJlcXVpcG8NCi1fVUlfVGVhbVByb2ZpbGVfc3ViVGVhbV9mZWF0dXJlID0gU3ViZXF1aXBvDQotX1VJX1JvbGVEZXNjcmlwdG9yX1JvbGVfZmVhdHVyZSA9IFJvbA0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlID0gTW9kaWZpY2ENCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFJlc3BvbnNhYmxlIGRlDQotX1VJX1dvcmtPcmRlcl9saW5rVHlwZV9mZWF0dXJlID0gVGlwbyBkZSBlbmxhY2UNCi1fVUlfV29ya09yZGVyX3ByZWRfZmVhdHVyZSA9IFByZWRlY2Vzb3INCi1fVUlfUGxhbm5pbmdEYXRhX3N0YXJ0RGF0ZV9mZWF0dXJlID0gRmVjaGEgZGUgaW5pY2lvDQotX1VJX1BsYW5uaW5nRGF0YV9maW5pc2hEYXRlX2ZlYXR1cmUgPSBGZWNoYSBkZSBmaW5hbGl6YWNpXHUwMGYzbg0KLV9VSV9QbGFubmluZ0RhdGFfcmFua19mZWF0dXJlID0gUmFuZ28NCi1fVUlfRGVzY3JpcHRvcl9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2VfZmVhdHVyZSA9IEVzdFx1MDBlMSBzaW5jcm9uaXphZG8gY29uIGVsIG9yaWdlbg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUgPSBFc3RhZG8gZGUgZW50cmFkYSBkZSBhY3RpdmlkYWQNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RXhpdFN0YXRlX2ZlYXR1cmUgPSBFc3RhZG8gZGUgc2FsaWRhIGRlIGFjdGl2aWRhZA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3RfZmVhdHVyZSA9IFByb2R1Y3RvIGRlIHRyYWJham8NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdGVkQnlfZmVhdHVyZSA9IEFmZWN0YWRvIHBvcg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0c19mZWF0dXJlID0gSW1wYWN0b3MNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2RlbGl2ZXJhYmxlUGFydHNfZmVhdHVyZSA9IENvbXBvbmVudGVzIGRlIHByb2R1Y3RvIGZpbmFsDQotX1VJX1Rhc2tEZXNjcmlwdG9yX1Rhc2tfZmVhdHVyZSA9IFRhcmVhDQotX1VJX1Rhc2tEZXNjcmlwdG9yX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBSZWFsaXphZG9yIHNlY3VuZGFyaW8NCi1fVUlfVGFza0Rlc2NyaXB0b3JfYXNzaXN0ZWRCeV9mZWF0dXJlID0gQXNpc3RpZG8gcG9yDQotX1VJX1Rhc2tEZXNjcmlwdG9yX2V4dGVybmFsSW5wdXRfZmVhdHVyZSA9IEVudHJhZGEgZXh0ZXJuYQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9tYW5kYXRvcnlJbnB1dF9mZWF0dXJlID0gRW50cmFkYSBvYmxpZ2F0b3JpYQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBFbnRyYWRhIG9wY2lvbmFsDQotX1VJX1Rhc2tEZXNjcmlwdG9yX291dHB1dF9mZWF0dXJlID0gU2FsaWRhDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3BlcmZvcm1lZFByaW1hcmlseUJ5X2ZlYXR1cmUgPSBSZWFsaXphZG9yIHByaW5jaXBhbA0KLV9VSV9UYXNrRGVzY3JpcHRvcl9zZWxlY3RlZFN0ZXBzX2ZlYXR1cmUgPSBQYXNvcyBzZWxlY2Npb25hZG9zDQotX1VJX0NvbXBvc2l0ZVJvbGVfYWdncmVnYXRlZFJvbGVzX2ZlYXR1cmUgPSBSb2xlcyBhZ3JlZ2Fkb3MNCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3VzYWdlR3VpZGFuY2VfZmVhdHVyZSA9IEd1XHUwMGVkYSBkZSB1dGlsaXphY2lcdTAwZjNuDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gT2JqZXRpdm8NCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSA9IEFsdGVybmF0aXZhcw0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2hvd3RvU3RhZmZfZmVhdHVyZSA9IFBlcnNvbmFsIHRcdTAwZTljbmljbw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9zY2FsZV9mZWF0dXJlID0gRXNjYWxhDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RDaGFyYWN0ZXJpc3RpY3NfZmVhdHVyZSA9IENhcmFjdGVyXHUwMGVkc3RpY2FzIGRlbCBwcm95ZWN0bw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9yaXNrTGV2ZWxfZmVhdHVyZSA9IE5pdmVsIGRlIHJpZXNnbw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9lc3RpbWF0aW5nVGVjaG5pcXVlX2ZlYXR1cmUgPSBUXHUwMGU5Y25pY2EgZGUgY1x1MDBlMWxjdWxvDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IEVzcGVjaWFsaWRhZCBkZSBtaWVtYnJvIGRlbCBwcm95ZWN0bw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gVGlwbyBkZSBjb250cmF0bw0KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gSUQgZXh0ZXJubw0KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fc2NvcGVfZmVhdHVyZSA9IFx1MDBjMW1iaXRvDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl91c2FnZU5vdGVzX2ZlYXR1cmUgPSBOb3RhcyBkZSB1dGlsaXphY2lcdTAwZjNuDQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl9yZWZpbmVkRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaXBjaVx1MDBmM24gcmVmaW5hZGENCi1fVUlfUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX2ZlYXR1cmUgPSBTdWJwclx1MDBlMWN0aWNhcw0KLV9VSV9QcmFjdGljZV9jb250ZW50UmVmZXJlbmNlc19mZWF0dXJlID0gUmVmZXJlbmNpYXMgZGUgY29udGVuaWRvDQotX1VJX1ByYWN0aWNlX2FjdGl2aXR5UmVmZXJlbmNlc19mZWF0dXJlID0gUmVmZXJlbmNpYXMgZGUgYWN0aXZpZGFkDQotX1VJX1N0YXRlX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBQcm9kdWN0byBkZSB0cmFiYWpvDQotX1VJX1N0YXRlX1JlZ2lvbl9mZWF0dXJlID0gUmVnaVx1MDBmM24NCi1fVUlfU3RhdGVfc3VibWFjaGluZV9mZWF0dXJlID0gU3VibVx1MDBlMXF1aW5hDQotX1VJX1ZlcnRleF9jb250YWluZXJfZmVhdHVyZSA9IENvbnRlbmVkb3INCi1fVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUgPSBTYWxpZW50ZQ0KLV9VSV9WZXJ0ZXhfaW5jb21pbmdfZmVhdHVyZSA9IEVudHJhbnRlDQotX1VJX1JlZ2lvbl9WZXJ0ZXhfZmVhdHVyZSA9IFZcdTAwZTlydGljZQ0KLV9VSV9SZWdpb25fVHJhbnNpdGlvbl9mZWF0dXJlID0gVHJhbnNpY2lcdTAwZjNuDQotX1VJX1JlZ2lvbl9TdGF0ZV9mZWF0dXJlID0gRXN0YWRvDQotX1VJX1JlZ2lvbl9TdGF0ZU1hY2hpbmVfZmVhdHVyZSA9IE1cdTAwZTFxdWluYSBkZSBlc3RhZG8NCi1fVUlfU3RhdGVNYWNoaW5lX1JlZ2lvbl9mZWF0dXJlID0gUmVnaVx1MDBmM24NCi1fVUlfVHJhbnNpdGlvbl9Xb3JrRGVmaW5pdGlvbl9mZWF0dXJlID0gRGVmaW5pY2lcdTAwZjNuIGRlIHRyYWJham8NCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IENvbnRlbmVkb3INCi1fVUlfVHJhbnNpdGlvbl9zb3VyY2VfZmVhdHVyZSA9IE9yaWdlbg0KLV9VSV9UcmFuc2l0aW9uX3RhcmdldF9mZWF0dXJlID0gRGVzdGlubw0KLV9VSV9EaXNjaXBsaW5lX3Rhc2tzX2ZlYXR1cmUgPSBUYXJlYXMNCi1fVUlfRGlzY2lwbGluZV9zdWJkaXNjaXBsaW5lX2ZlYXR1cmUgPSBTdWJkaXNjaXBsaW5hDQotX1VJX0Rpc2NpcGxpbmVfcmVmZXJlbmNlV29ya2Zsb3dzX2ZlYXR1cmUgPSBGbHVqb3MgZGUgdHJhYmFqbyBkZSByZWZlcmVuY2lhDQotX1VJX1JvbGVTZXRfcm9sZXNfZmVhdHVyZSA9IFJvbGVzDQotX1VJX0RvbWFpbl93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFByb2R1Y3RvcyBkZSB0cmFiYWpvDQotX1VJX0RvbWFpbl9zdWJkb21haW5zX2ZlYXR1cmUgPSBTdWJkb21pbmlvcw0KLV9VSV9Xb3JrUHJvZHVjdFR5cGVfd29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBQcm9kdWN0b3MgZGUgdHJhYmFqbw0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IERpc2NpcGxpbmFzDQotX1VJX1Rvb2xfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IEd1XHUwMGVkYXMgZGUgbGEgaGVycmFtaWVudGENCi1fVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUgPSBDb25qdW50b3MgZGUgcm9sZXMNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlID0gRWxlbWVudG9zIGNhdGVnb3JpemFkb3MNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19mZWF0dXJlID0gU3ViY2F0ZWdvclx1MDBlZGFzDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19lZHVjYXRpb25NYXRlcmlhbHNfZmVhdHVyZSA9IE1hdGVyaWFsZXMgZGUgZm9ybWFjaVx1MDBmM24NCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBNYXRlcmlhbGVzIGRlIGNvbXVuaWNhY2lcdTAwZjNuDQotX1VJX1Byb2Nlc3NfaW5jbHVkZXNQYXR0ZXJuc19mZWF0dXJlID0gSW5jbHV5ZSBwYXRyb25lcw0KLV9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUgPSBDb250ZXh0byBwb3Igb21pc2lcdTAwZjNuDQotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBDb250ZXh0byB2XHUwMGUxbGlkbw0KLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9iYXNlZE9uUHJvY2Vzc2VzX2ZlYXR1cmUgPSBCYXNhZG8gZW4gcHJvY2Vzb3MNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF9pbnRlcmZhY2VzX2ZlYXR1cmUgPSBJbnRlcmZhY2VzDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gUHJvY2Vzbw0KLV9VSV9Qcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfZmVhdHVyZSA9IEVsZW1lbnRvcyBkZSBwcm9jZXNvDQotX1VJX1Byb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX2ZlYXR1cmUgPSBEaWFncmFtYXMNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19mZWF0dXJlID0gRXNwZWNpZmljYWNpb25lcyBkZSBsYSBpbnRlcmZheg0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZUlPX2ZlYXR1cmUgPSBJbnRlcmZheiBkZSBFL1MNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlID0gQ29tcG9uZW50ZSBkZWwgcHJvY2Vzbw0KLV9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSA9IFVzdWFyaW8gdmFyaWFibGUNCi1fVUlfTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX2ZlYXR1cmUgPSBQYXF1ZXRlcyBkZWwgbVx1MDBlOXRvZG8NCi1fVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUgPSBCYXNlcw0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUgPSBUaXBvIGRlIHZhcmlhYmlsaWRhZA0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlID0gVmFyaWFiaWxpZGFkIGJhc2FkYSBlbiBlbGVtZW50b3MNCi1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBBdXRvcmVzDQotX1VJX01ldGhvZFVuaXRfY2hhbmdlRGF0ZV9mZWF0dXJlID0gRmVjaGEgZGUgY2FtYmlvDQotX1VJX01ldGhvZFVuaXRfY2hhbmdlRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaXBjaVx1MDBmM24gZGUgY2FtYmlvDQotX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlID0gVmVyc2lcdTAwZjNuDQotX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUgPSBEZWNsYXJhY2lcdTAwZjNuIGRlIENvcHlyaWdodA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBsdWdpblNlbGVjdGlvbl9mZWF0dXJlID0gU2VsZWNjaVx1MDBmM24gZGVsIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUgPSBTZWxlY2NpXHUwMGYzbiBkZWwgcGFxdWV0ZSBkZWwgbVx1MDBlOXRvZG8NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9wcm9jZXNzVmlld3NfZmVhdHVyZSA9IFZpc3RhcyBkZSBwcm9jZXNvDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fZGVmYXVsdFZpZXdfZmVhdHVyZSA9IFZpc3RhIHBvciBvbWlzaVx1MDBmM24NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9iYXNlQ29uZmlndXJhdGlvbnNfZmVhdHVyZSA9IENvbmZpZ3VyYWNpb25lcyBiXHUwMGUxc2ljYXMNCi1fVUlfUHJvY2Vzc0ZhbWlseV9kZWxpdmVyeVByb2Nlc3Nlc19mZWF0dXJlID0gUHJvY2Vzb3MgZGUgZW50cmVnYQ0KLV9VSV9NZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfZmVhdHVyZSA9IFBsdWctaW5zIGRlIG1cdTAwZTl0b2RvDQotX1VJX01ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX2ZlYXR1cmUgPSBDb25maWd1cmFjaW9uZXMgcHJlZGVmaW5pZGFzDQotX1VJX1Vua25vd25fZmVhdHVyZSA9IFNpbiBlc3BlY2lmaWNhcg0KLQ0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvU3RhcnRfbGl0ZXJhbCA9IEZpbmFsIGEgaW5pY2lvDQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9GaW5pc2hfbGl0ZXJhbCA9IEZpbmFsIGEgZmluYWwNCi1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvU3RhcnRfbGl0ZXJhbCA9IEluaWNpbyBhIGluaWNpbw0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9GaW5pc2hfbGl0ZXJhbCA9IGluaWNpbyBhIGZpbmFsDQotX1VJX1BzZXVkb1N0YXRlS2luZF9pbml0aWFsX2xpdGVyYWwgPSBpbmljaWFsDQotX1VJX1BzZXVkb1N0YXRlS2luZF9qb2luX2xpdGVyYWwgPSB1bmlcdTAwZjNuDQotX1VJX1BzZXVkb1N0YXRlS2luZF9mb3JrX2xpdGVyYWwgPSBiaWZ1cmNhY2lcdTAwZjNuDQotX1VJX1BzZXVkb1N0YXRlS2luZF9qdW5jdGlvbl9saXRlcmFsID0gY3J1Y2UNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2Nob2ljZV9saXRlcmFsID0gb3BjaVx1MDBmM24NCi1fVUlfUHNldWRvU3RhdGVLaW5kX2VudHJ5UG9pbnRfbGl0ZXJhbCA9IGVudHJ5UG9pbnQNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gZXhpdFBvaW50DQotX1VJX1BzZXVkb1N0YXRlS2luZF90ZXJtaW5hdGVfbGl0ZXJhbCA9IHRlcm1pbmFyDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9uYV9saXRlcmFsID0gbmENCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2NvbnRyaWJ1dGVzX2xpdGVyYWwgPSBjb250cmlidXllDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9leHRlbmRzX2xpdGVyYWwgPSBhbXBsXHUwMGVkYQ0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfcmVwbGFjZXNfbGl0ZXJhbCA9IHJlZW1wbGF6YQ0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbG9jYWxDb250cmlidXRpb25fbGl0ZXJhbCA9IGxvY2FsQ29udHJpYnV0aW9uDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbFJlcGxhY2VtZW50X2xpdGVyYWwgPSBsb2NhbFJlcGxhY2VtZW50DQotX1VJX0FydGlmYWN0RGVzY3JpcHRvcl90eXBlID0gRGVzY3JpcHRvciBkZSBhcnRlZmFjdG8NCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBEZXNjcmlwdG9yIGRlIHByb2R1Y3RvIGZpbmFsDQotX1VJX091dGNvbWVEZXNjcmlwdG9yX3R5cGUgPSBEZXNjcmlwdG9yIGRlIHJlc3VsdGFkbw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQ1ZjBhMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1wbHVnaW5OYW1lID0gUHJpc2UgZW4gY2hhcmdlIGRlIGxhIG1vZGlmaWNhdGlvbiBFTUYgVU1BDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IENyXHUwMGU5ZXIgdW4gbm91dmVhdSB7MH0gZGFucyBsYSBmb25jdGlvbiB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfZGVzY3JpcHRpb24gPSBDclx1MDBlOWVyIHVuIG5vdXZlbCBlbmZhbnQgZHUgdHlwZSB7MH0gcG91ciBsYSBmb25jdGlvbiB7MX0gZHUgezJ9IHNcdTAwZTlsZWN0aW9ublx1MDBlOS4NCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyXHUwMGU5ZXIgdW4gbm91dmVhdSBmclx1MDBlOHJlL3NvZXVyIGR1IHR5cGUgezB9IHBvdXIgbGUgezJ9IHNcdTAwZTlsZWN0aW9ublx1MDBlOSwgZGFucyBsYSBmb25jdGlvbiB7MX0gZGUgc29uIHBhcmVudC4NCi0NCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gTGUgezB9IGRlIGxhIHsxfQ0KLQ0KLV9VSV9DbGFzc2lmaWVyX3R5cGUgPSBEaXNjcmltaW5hbnQNCi1fVUlfVHlwZV90eXBlID0gVHlwZQ0KLV9VSV9FbGVtZW50X3R5cGUgPSBFbFx1MDBlOW1lbnQNCi1fVUlfTmFtZWRFbGVtZW50X3R5cGUgPSBFbFx1MDBlOW1lbnQgbm9tbVx1MDBlOQ0KLV9VSV9QYWNrYWdlYWJsZUVsZW1lbnRfdHlwZSA9IEVsXHUwMGU5bWVudCBlbXBhcXVldGFibGUNCi1fVUlfUGFja2FnZV90eXBlID0gUGFja2FnZQ0KLV9VSV9OYW1lc3BhY2VfdHlwZSA9IEVzcGFjZSBkZSBub20NCi1fVUlfTWV0aG9kRWxlbWVudF90eXBlID0gRWxcdTAwZTltZW50IGRlIG1cdTAwZTl0aG9kZQ0KLV9VSV9Db25zdHJhaW50X3R5cGUgPSBDb250cmFpbnRlDQotX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUgPSBFbFx1MDBlOW1lbnQgZGUgY29udGVudQ0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IEVsXHUwMGU5bWVudCBkZXNjcmlwdGlibGUNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwdGlvbiBkZSBjb250ZW51DQotX1VJX1NlY3Rpb25fdHlwZSA9IFNlY3Rpb24NCi1fVUlfUm9sZV90eXBlID0gUlx1MDBmNGxlDQotX1VJX1dvcmtQcm9kdWN0X3R5cGUgPSBQcm9kdWl0DQotX1VJX1Rhc2tfdHlwZSA9IFRcdTAwZTJjaGUNCi1fVUlfV29ya0RlZmluaXRpb25fdHlwZSA9IERcdTAwZTlmaW5pdGlvbiBkZSB0cmF2YWlsDQotX1VJX1N0ZXBfdHlwZSA9IEV0YXBlDQotX1VJX0d1aWRhbmNlX3R5cGUgPSBDb25zZWlsDQotX1VJX0FydGlmYWN0X3R5cGUgPSBBcnRlZmFjdA0KLV9VSV9EZWxpdmVyYWJsZV90eXBlID0gTGl2cmFibGUNCi1fVUlfT3V0Y29tZV90eXBlID0gU29ydGllDQotX1VJX01ldGhvZFBhY2thZ2VfdHlwZSA9IFBhY2thZ2UgZGUgbVx1MDBlOXRob2RlDQotX1VJX0NvbnRlbnRQYWNrYWdlX3R5cGUgPSBQYWNrYWdlIGRlIGNvbnRlbnUNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcHRpb24gZCdhcnRlZmFjdA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwdGlvbiBkZSBwcm9kdWl0DQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXB0aW9uIGRlIGxpdnJhYmxlDQotX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcHRpb24gZGUgclx1MDBmNGxlDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcHRpb24gZGUgdFx1MDBlMmNoZQ0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwdGlvbiBkZSBjb25zZWlsDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXB0aW9uIGRlIHByYXRpcXVlDQotX1VJX1BvaW50X3R5cGUgPSBQb2ludA0KLV9VSV9HcmFwaEVsZW1lbnRfdHlwZSA9IEVsXHUwMGU5bWVudCBncmFwaGlxdWUNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSA9IEVsXHUwMGU5bWVudCBkZSBkaWFncmFtbWUNCi1fVUlfRGlhZ3JhbUxpbmtfdHlwZSA9IExpZW4gZGUgZGlhZ3JhbW1lDQotX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUgPSBDb25uZWN0ZXVyIGdyYXBoaXF1ZQ0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBQb250IGRlIG1vZFx1MDBlOGxlIHNcdTAwZTltYW50aXF1ZQ0KLV9VSV9EaW1lbnNpb25fdHlwZSA9IERpbWVuc2lvbg0KLV9VSV9SZWZlcmVuY2VfdHlwZSA9IFJcdTAwZTlmXHUwMGU5cmVuY2UNCi1fVUlfUHJvcGVydHlfdHlwZSA9IFByb3ByaVx1MDBlOXRcdTAwZTkNCi1fVUlfR3JhcGhFZGdlX3R5cGUgPSBCb3JkIGdyYXBoaXF1ZQ0KLV9VSV9EaWFncmFtX3R5cGUgPSBEaWFncmFtbWUNCi1fVUlfR3JhcGhOb2RlX3R5cGUgPSBOb2V1ZCBncmFwaGlxdWUNCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSA9IEVsXHUwMGU5bWVudCBkZSBtb2RcdTAwZThsZSBzXHUwMGU5bWFudGlxdWUgc2ltcGxlDQotX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IFBvbnQgZGUgbW9kXHUwMGU4bGUgc1x1MDBlOW1hbnRpcXVlIFVNQQ0KLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gUG9udCBkZSBtb2RcdTAwZThsZSBzXHUwMGU5bWFudGlxdWUgcHJpbmNpcGFsDQotX1VJX0xlYWZFbGVtZW50X3R5cGUgPSBFbFx1MDBlOW1lbnQgZmV1aWxsZQ0KLV9VSV9UZXh0RWxlbWVudF90eXBlID0gRWxcdTAwZTltZW50IHRleHRlDQotX1VJX0ltYWdlX3R5cGUgPSBJbWFnZQ0KLV9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUgPSBQcmltaXRpdmUgZ3JhcGhpcXVlDQotX1VJX1BvbHlsaW5lX3R5cGUgPSBMaWduZSBwb2x5Z29uYWxlDQotX1VJX0VsbGlwc2VfdHlwZSA9IEVsbGlwc2UNCi1fVUlfQWN0aXZpdHlfdHlwZSA9IEFjdGl2aXRcdTAwZTkNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IEVsXHUwMGU5bWVudCBkZSByXHUwMGU5cGFydGl0aW9uIGR1IHRyYXZhaWwNCi1fVUlfQnJlYWtkb3duRWxlbWVudF90eXBlID0gRWxcdTAwZTltZW50IGRlIHJcdTAwZTlwYXJ0aXRpb24NCi1fVUlfTWlsZXN0b25lX3R5cGUgPSBKYWxvbg0KLV9VSV9JdGVyYXRpb25fdHlwZSA9IEl0XHUwMGU5cmF0aW9uDQotX1VJX1BoYXNlX3R5cGUgPSBQaGFzZQ0KLV9VSV9UZWFtUHJvZmlsZV90eXBlID0gUHJvZmlsIGRlIGwnXHUwMGU5cXVpcGUNCi1fVUlfUm9sZURlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXB0ZXVyIGRlIHJcdTAwZjRsZQ0KLV9VSV9Xb3JrT3JkZXJfdHlwZSA9IE9yZHJlIGRlIHRyYXZhaWwNCi1fVUlfUHJvY2Vzc0VsZW1lbnRfdHlwZSA9IEVsXHUwMGU5bWVudCBkZSBwcm9jZXNzdXMNCi1fVUlfUGxhbm5pbmdEYXRhX3R5cGUgPSBEb25uXHUwMGU5ZXMgZGUgcGxhbmlmaWNhdGlvbg0KLV9VSV9EZXNjcmlwdG9yX3R5cGUgPSBEZXNjcmlwdGV1cg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXB0ZXVyIGRlIHByb2R1aXQNCi1fVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXB0ZXVyIGRlIHRcdTAwZTJjaGUNCi1fVUlfQ29tcG9zaXRlUm9sZV90eXBlID0gUlx1MDBmNGxlIGNvbXBvc2l0ZQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXB0aW9uIGQnXHUwMGU5bFx1MDBlOW1lbnQgZGUgclx1MDBlOXBhcnRpdGlvbg0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwdGlvbiBkJ2FjdGl2aXRcdTAwZTkNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXB0aW9uIGRlIHByb2Nlc3N1cyBkZSBsaXZyYWlzb24NCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwdGlvbiBkZSBwcm9jZXNzdXMNCi1fVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwdGlvbiBkZSBkZXNjcmlwdGV1cg0KLV9VSV9Db25jZXB0X3R5cGUgPSBDb25jZXB0DQotX1VJX0NoZWNrbGlzdF90eXBlID0gTGlzdGUgZGUgY29udHJcdTAwZjRsZQ0KLV9VSV9FeGFtcGxlX3R5cGUgPSBFeGVtcGxlDQotX1VJX0d1aWRlbGluZV90eXBlID0gSW5zdHJ1Y3Rpb25zDQotX1VJX1JlcG9ydF90eXBlID0gUmFwcG9ydA0KLV9VSV9UZW1wbGF0ZV90eXBlID0gQ2FuZXZhcw0KLV9VSV9TdXBwb3J0aW5nTWF0ZXJpYWxfdHlwZSA9IERvY3VtZW50IGQnYWNjb21wYWduZW1lbnQNCi1fVUlfVG9vbE1lbnRvcl90eXBlID0gR3VpZGUgZCd1dGlsaXNhdGlvbiBkZSBsJ291dGlsDQotX1VJX1doaXRlcGFwZXJfdHlwZSA9IExpdnJlIGJsYW5jDQotX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUgPSBEXHUwMGU5ZmluaXRpb24gZGUgdGVybWUNCi1fVUlfUHJhY3RpY2VfdHlwZSA9IFByYXRpcXVlDQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gQ29uc2lkXHUwMGU5cmF0aW9ucyByZWxhdGl2ZXMgXHUwMGUwIGwnZXN0aW1hdGlvbg0KLV9VSV9SZXVzYWJsZUFzc2V0X3R5cGUgPSBSZXNzb3VyY2Ugclx1MDBlOXV0aWxpc2FibGUNCi1fVUlfU3RhdGVfdHlwZSA9IEV0YXQNCi1fVUlfVmVydGV4X3R5cGUgPSBWZXJ0ZXgNCi1fVUlfUmVnaW9uX3R5cGUgPSBSXHUwMGU5Z2lvbg0KLV9VSV9TdGF0ZU1hY2hpbmVfdHlwZSA9IE1hY2hpbmUgZCdcdTAwZTl0YXQNCi1fVUlfVHJhbnNpdGlvbl90eXBlID0gVHJhbnNpdGlvbg0KLV9VSV9Qc2V1ZG9TdGF0ZV90eXBlID0gRXRhdCBkdSBwc2V1ZG9ueW1lDQotX1VJX0Rpc2NpcGxpbmVfdHlwZSA9IERpc2NpcGxpbmUNCi1fVUlfQ29udGVudENhdGVnb3J5X3R5cGUgPSBDYXRcdTAwZTlnb3JpZSBkZSBjb250ZW51DQotX1VJX1JvbGVTZXRfdHlwZSA9IEVuc2VtYmxlIGRlIHJcdTAwZjRsZXMNCi1fVUlfRG9tYWluX3R5cGUgPSBEb21haW5lDQotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gVHlwZSBkZSBwcm9kdWl0DQotX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlID0gUmVncm91cGVtZW50IGRlIGRpc2NpcGxpbmUNCi1fVUlfVG9vbF90eXBlID0gT3V0aWwNCi1fVUlfUm9sZVNldEdyb3VwaW5nX3R5cGUgPSBSZWdyb3VwZW1lbnQgZCdlbnNlbWJsZXMgZGUgclx1MDBmNGxlcw0KLV9VSV9DdXN0b21DYXRlZ29yeV90eXBlID0gQ2F0XHUwMGU5Z29yaWUgcGVyc29ubmFsaXNcdTAwZTllDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlID0gUHJvY2Vzc3VzIGRlIGxpdnJhaXNvbg0KLV9VSV9Qcm9jZXNzX3R5cGUgPSBQcm9jZXNzdXMNCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdHlwZSA9IFBhdHRlcm4gZGUgY2FwYWNpdFx1MDBlOQ0KLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV90eXBlID0gQ2FuZXZhcyBkZSBwbGFuaWZpY2F0aW9uIGRlIHByb2Nlc3N1cw0KLV9VSV9Sb2FkbWFwX3R5cGUgPSBGZXVpbGxlIGRlIHJvdXRlDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSA9IENvbXBvc2FudCBkZSBwcm9jZXNzdXMNCi1fVUlfUHJvY2Vzc1BhY2thZ2VfdHlwZSA9IFBhY2thZ2UgZGUgcHJvY2Vzc3VzDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfdHlwZSA9IEludGVyZmFjZSBkZSBjb21wb3NhbnQgZGUgcHJvY2Vzc3VzDQotX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX3R5cGUgPSBEZXNjcmlwdGV1ciBkZSBjb21wb3NhbnQgZGUgcHJvY2Vzc3VzDQotX1VJX01ldGhvZFBsdWdpbl90eXBlID0gUGx1Zy1pbiBkZSBtXHUwMGU5dGhvZGUNCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUgPSBFbFx1MDBlOW1lbnQgZGUgdmFyaWFiaWxpdFx1MDBlOQ0KLV9VSV9NZXRob2RVbml0X3R5cGUgPSBVbml0XHUwMGU5IGRlIG1cdTAwZTl0aG9kZQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUgPSBDb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLV9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUgPSBGYW1pbGxlIGRlIHByb2Nlc3N1cw0KLV9VSV9NZXRob2RMaWJyYXJ5X3R5cGUgPSBCaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzDQotX1VJX1Vua25vd25fdHlwZSA9IE9iamV0DQotDQotX1VJX1Vua25vd25fZGF0YXR5cGU9IFZhbGV1cg0KLQ0KLV9VSV9OYW1lZEVsZW1lbnRfbmFtZV9mZWF0dXJlID0gTm9tDQotX1VJX01ldGhvZEVsZW1lbnRfZ3VpZF9mZWF0dXJlID0gSWRlbnRpZmljYXRldXIgZ2xvYmFsIHVuaXF1ZQ0KLV9VSV9NZXRob2RFbGVtZW50X2JyaWVmRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaXB0aWYgY291cnQNCi1fVUlfTWV0aG9kRWxlbWVudF9vd25lZFJ1bGVzX2ZlYXR1cmUgPSBSXHUwMGU4Z2xlcyBkXHUwMGU5dGVudWVzDQotX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlID0gU3VwcHJpbVx1MDBlOQ0KLV9VSV9NZXRob2RFbGVtZW50X29yZGVyaW5nR3VpZGVfZmVhdHVyZSA9IEd1aWRlIGRlIHBhc3NhdGlvbiBkZSBsYSBjb21tYW5kZQ0KLV9VSV9Db25zdHJhaW50X2JvZHlfZmVhdHVyZSA9IENvcnBzDQotX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IERvY3VtZW50cyBkJ2FjY29tcGFnbmVtZW50DQotX1VJX0NvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX2ZlYXR1cmUgPSBDb25jZXB0cyBldCBsaXZyZXMgYmxhbmNzDQotX1VJX0NvbnRlbnRFbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSA9IExpc3RlcyBkZSBjb250clx1MDBmNGxlDQotX1VJX0NvbnRlbnRFbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSA9IEluc3RydWN0aW9ucw0KLV9VSV9Db250ZW50RWxlbWVudF9leGFtcGxlc19mZWF0dXJlID0gRXhlbXBsZXMNCi1fVUlfQ29udGVudEVsZW1lbnRfYXNzZXRzX2ZlYXR1cmUgPSBSZXNzb3VyY2VzDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUgPSBOb20gZGUgcHJcdTAwZTlzZW50YXRpb24NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gUHJcdTAwZTlzZW50YXRpb24NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3NoYXBlaWNvbl9mZWF0dXJlID0gSWNcdTAwZjRuZSBGb3JtZQ0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfbm9kZWljb25fZmVhdHVyZSA9IEljXHUwMGY0bmUgZGUgbm9ldWQNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX21haW5EZXNjcmlwdGlvbl9mZWF0dXJlID0gRGVzY3JpcHRpb24gcHJpbmNpcGFsZQ0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfZmVhdHVyZSA9IFNlY3Rpb25zDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9rZXlDb25zaWRlcmF0aW9uc19mZWF0dXJlID0gQ29uc2lkXHUwMGU5cmF0aW9ucyBjbFx1MDBlOXMNCi1fVUlfU2VjdGlvbl9zZWN0aW9uTmFtZV9mZWF0dXJlID0gTm9tIGRlIHNlY3Rpb24NCi1fVUlfU2VjdGlvbl9zZWN0aW9uRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaXB0aW9uIGRlIHNlY3Rpb24NCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gU291cy1zZWN0aW9ucw0KLV9VSV9TZWN0aW9uX3ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBQclx1MDBlOWRcdTAwZTljZXNzZXVyDQotX1VJX1JvbGVfbW9kaWZpZXNfZmVhdHVyZSA9IE1vZGlmaWUNCi1fVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlID0gUmVzcG9uc2FibGUgZGUNCi1fVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlID0gUmFwcG9ydHMNCi1fVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUgPSBDYW5ldmFzDQotX1VJX1dvcmtQcm9kdWN0X3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBHdWlkZXMgZCd1dGlsaXNhdGlvbiBkZSBsJ291dGlsDQotX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gQ29uc2lkXHUwMGU5cmF0aW9ucyByZWxhdGl2ZXMgXHUwMGUwIGwnZXN0aW1hdGlvbg0KLV9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBSXHUwMGU5YWxpc1x1MDBlOSBwYXINCi1fVUlfVGFza19tYW5kYXRvcnlJbnB1dF9mZWF0dXJlID0gRW50clx1MDBlOWUgb2JsaWdhdG9pcmUNCi1fVUlfVGFza19vdXRwdXRfZmVhdHVyZSA9IFNvcnRpZQ0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBSXHUwMGU5YWxpc1x1MDBlOSBcdTAwZTlnYWxlbWVudCBwYXINCi1fVUlfVGFza19vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBFbnRyXHUwMGU5ZSBmYWN1bHRhdGl2ZQ0KLV9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUgPSBFdGFwZXMNCi1fVUlfVGFza190b29sTWVudG9yc19mZWF0dXJlID0gR3VpZGVzIGQndXRpbGlzYXRpb24gZGUgbCdvdXRpbA0KLV9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gQ29uc2lkXHUwMGU5cmF0aW9ucyByZWxhdGl2ZXMgXHUwMGUwIGwnZXN0aW1hdGlvbg0KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wcmVjb25kaXRpb25fZmVhdHVyZSA9IENvbmRpdGlvbiBwclx1MDBlOWFsYWJsZQ0KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX2ZlYXR1cmUgPSBQb3N0LWNvbmRpdGlvbg0KLV9VSV9BcnRpZmFjdF9jb250YWluZXJBcnRpZmFjdF9mZWF0dXJlID0gQXJ0ZWZhY3QgZGUgY29udGVuZXVyDQotX1VJX0FydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19mZWF0dXJlID0gQXJ0ZWZhY3RzIGNvbnRlbnVzDQotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gUHJvZHVpdHMgbGl2clx1MDBlOXMNCi1fVUlfTWV0aG9kUGFja2FnZV9nbG9iYWxfZmVhdHVyZSA9IEdsb2JhbA0KLV9VSV9NZXRob2RQYWNrYWdlX3JldXNlZFBhY2thZ2VzX2ZlYXR1cmUgPSBQYWNrYWdlcyByXHUwMGU5dXRpbGlzXHUwMGU5cw0KLV9VSV9NZXRob2RQYWNrYWdlX3BhcmVudFBhY2thZ2VfZmVhdHVyZSA9IFBhY2thZ2UgcGFyZW50DQotX1VJX01ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19mZWF0dXJlID0gUGFja2FnZXMgZW5mYW50DQotX1VJX0NvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19mZWF0dXJlID0gRWxcdTAwZTltZW50cyBkZSBjb250ZW51DQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fYnJpZWZPdXRsaW5lX2ZlYXR1cmUgPSBCcmVmIGFwZXJcdTAwZTd1DQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUgPSBPcHRpb25zIGRlIHJlcHJcdTAwZTlzZW50YXRpb24NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBJZGVudGlmaWNhdGV1ciBleHRlcm5lDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gT2JqZXQNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9pbXBhY3RPZk5vdEhhdmluZ19mZWF0dXJlID0gSW5jaWRlbmNlIGR1IG1hbnF1ZQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3JlYXNvbnNGb3JOb3ROZWVkaW5nX2ZlYXR1cmUgPSBDYXVzZXMganVzdGlmaWFudCBsZSBtYW5xdWUgZGUgblx1MDBlOWNlc3NpdFx1MDBlOQ0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX2V4dGVybmFsRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaXB0aW9uIGV4dGVybmUNCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9wYWNrYWdpbmdHdWlkYW5jZV9mZWF0dXJlID0gQ29uc2VpbCBkZSBtaXNlIGVuIGZvcm1lDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9za2lsbHNfZmVhdHVyZSA9IENvbXBcdTAwZTl0ZW5jZXMNCi1fVUlfUm9sZURlc2NyaXB0aW9uX2Fzc2lnbm1lbnRBcHByb2FjaGVzX2ZlYXR1cmUgPSBBcHByb2NoZXMgZCdhZmZlY3RhdGlvbg0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fc3lub255bXNfZmVhdHVyZSA9IFN5bm9ueW1lcw0KLV9VSV9UYXNrRGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gT2JqZXQNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gQWx0ZXJuYXRpdmVzDQotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fYXR0YWNobWVudHNfZmVhdHVyZSA9IFBpXHUwMGU4Y2VzIGpvaW50ZXMNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hZGRpdGlvbmFsSW5mb19mZWF0dXJlID0gSW5mb3JtYXRpb25zIGNvbXBsXHUwMGU5bWVudGFpcmVzDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlID0gUHJvYmxcdTAwZThtZQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2JhY2tncm91bmRfZmVhdHVyZSA9IEFycmlcdTAwZThyZS1wbGFuDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSA9IE9iamVjdGlmcw0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FwcGxpY2F0aW9uX2ZlYXR1cmUgPSBBcHBsaWNhdGlvbg0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2xldmVsc09mQWRvcHRpb25fZmVhdHVyZSA9IE5pdmVhdXggZCdhZG9wdGlvbg0KLV9VSV9Qb2ludF94X2ZlYXR1cmUgPSBYDQotX1VJX1BvaW50X3lfZmVhdHVyZSA9IFkNCi1fVUlfR3JhcGhFbGVtZW50X3Bvc2l0aW9uX2ZlYXR1cmUgPSBQb3NpdGlvbg0KLV9VSV9HcmFwaEVsZW1lbnRfY29udGFpbmVkX2ZlYXR1cmUgPSBDb250ZW51DQotX1VJX0dyYXBoRWxlbWVudF9saW5rX2ZlYXR1cmUgPSBMaWVuDQotX1VJX0dyYXBoRWxlbWVudF9hbmNob3JhZ2VfZmVhdHVyZSA9IEFuY3JhZ2UNCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IE1vZFx1MDBlOGxlIHNcdTAwZTltYW50aXF1ZQ0KLV9VSV9EaWFncmFtRWxlbWVudF9pc1Zpc2libGVfZmVhdHVyZSA9IEVzdCB2aXNpYmxlDQotX1VJX0RpYWdyYW1FbGVtZW50X2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGVuZXVyDQotX1VJX0RpYWdyYW1FbGVtZW50X3JlZmVyZW5jZV9mZWF0dXJlID0gUlx1MDBlOWZcdTAwZTlyZW5jZQ0KLV9VSV9EaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9mZWF0dXJlID0gUHJvcHJpXHUwMGU5dFx1MDBlOQ0KLV9VSV9EaWFncmFtTGlua196b29tX2ZlYXR1cmUgPSBab29tDQotX1VJX0RpYWdyYW1MaW5rX3ZpZXdwb3J0X2ZlYXR1cmUgPSBMdWNhcm5lDQotX1VJX0RpYWdyYW1MaW5rX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gRWxcdTAwZTltZW50IGdyYXBoaXF1ZQ0KLV9VSV9EaWFncmFtTGlua19kaWFncmFtX2ZlYXR1cmUgPSBEaWFncmFtbWUNCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBFbFx1MDBlOW1lbnQgZ3JhcGhpcXVlDQotX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWRnZV9mZWF0dXJlID0gQm9yZCBncmFwaGlxdWUNCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9wcmVzZW50YXRpb25fZmVhdHVyZSA9IFByXHUwMGU5c2VudGF0aW9uDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBFbFx1MDBlOW1lbnQgZ3JhcGhpcXVlDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZGlhZ3JhbV9mZWF0dXJlID0gRGlhZ3JhbW1lDQotX1VJX0RpbWVuc2lvbl93aWR0aF9mZWF0dXJlID0gTGFyZ2V1cg0KLV9VSV9EaW1lbnNpb25faGVpZ2h0X2ZlYXR1cmUgPSBIYXV0ZXVyDQotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gRXN0IHVuZSByZXByXHUwMGU5c2VudGF0aW9uIGluZGl2aWR1ZWxsZQ0KLV9VSV9SZWZlcmVuY2VfcmVmZXJlbmNlZF9mZWF0dXJlID0gVXRpbGlzXHUwMGU5DQotX1VJX1Byb3BlcnR5X2tleV9mZWF0dXJlID0gQ2xcdTAwZTkNCi1fVUlfUHJvcGVydHlfdmFsdWVfZmVhdHVyZSA9IFZhbGV1cg0KLV9VSV9HcmFwaEVkZ2VfYW5jaG9yX2ZlYXR1cmUgPSBBbmNyYWdlDQotX1VJX0dyYXBoRWRnZV93YXlwb2ludHNfZmVhdHVyZSA9IFBvaW50cyBkZSBwYXNzYWdlDQotX1VJX0RpYWdyYW1fem9vbV9mZWF0dXJlID0gWm9vbQ0KLV9VSV9EaWFncmFtX3ZpZXdwb2ludF9mZWF0dXJlID0gVmlld3BvaW50DQotX1VJX0RpYWdyYW1fZGlhZ3JhbUxpbmtfZmVhdHVyZSA9IExpZW4gZGUgZGlhZ3JhbW1lDQotX1VJX0RpYWdyYW1fbmFtZXNwYWNlX2ZlYXR1cmUgPSBFc3BhY2UgZGUgbm9tDQotX1VJX0dyYXBoTm9kZV9zaXplX2ZlYXR1cmUgPSBUYWlsbGUNCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZUluZm9fZmVhdHVyZSA9IEluZm9ybWF0aW9ucyBzdXIgbGUgdHlwZQ0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsXHUwMGU5bWVudA0KLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUgPSBFbFx1MDBlOW1lbnQNCi1fVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlID0gVGV4dGUNCi1fVUlfSW1hZ2VfdXJpX2ZlYXR1cmUgPSBVUkkNCi1fVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSA9IEZvcm1hdCBNSU1FDQotX1VJX1BvbHlsaW5lX2Nsb3NlZF9mZWF0dXJlID0gRmVybVx1MDBlOQ0KLV9VSV9Qb2x5bGluZV93YXlwb2ludHNfZmVhdHVyZSA9IFBvaW50cyBkZSBwYXNzYWdlDQotX1VJX0VsbGlwc2VfcmFkaXVzWF9mZWF0dXJlID0gUmF5b24gWA0KLV9VSV9FbGxpcHNlX3JhZGl1c1lfZmVhdHVyZSA9IFJheW9uIFkNCi1fVUlfRWxsaXBzZV9yb3RhdGlvbl9mZWF0dXJlID0gUm90YXRpb24NCi1fVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUgPSBBbmdsZSBkZSBkXHUwMGU5YnV0DQotX1VJX0VsbGlwc2VfZW5kQW5nbGVfZmVhdHVyZSA9IEFuZ2xlIGRlIGZpbg0KLV9VSV9FbGxpcHNlX2NlbnRlcl9mZWF0dXJlID0gQ2VudHJlDQotX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUgPSBFbFx1MDBlOW1lbnRzIGRlIHJcdTAwZTlwYXJ0aXRpb24NCi1fVUlfQWN0aXZpdHlfcm9hZG1hcHNfZmVhdHVyZSA9IENhbGVuZHJpZXJzDQotX1VJX0FjdGl2aXR5X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IERvY3VtZW50cyBkJ2FjY29tcGFnbmVtZW50DQotX1VJX0FjdGl2aXR5X2NoZWNrbGlzdHNfZmVhdHVyZSA9IExpc3RlcyBkZSBjb250clx1MDBmNGxlDQotX1VJX0FjdGl2aXR5X2NvbmNlcHRzX2ZlYXR1cmUgPSBDb25jZXB0cw0KLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gRXhlbXBsZXMNCi1fVUlfQWN0aXZpdHlfZ3VpZGVsaW5lc19mZWF0dXJlID0gSW5zdHJ1Y3Rpb25zDQotX1VJX0FjdGl2aXR5X3JldXNhYmxlQXNzZXRzX2ZlYXR1cmUgPSBSZXNzb3VyY2VzIHJcdTAwZTl1dGlsaXNhYmxlcw0KLV9VSV9BY3Rpdml0eV9pc0VuYWN0YWJsZV9mZWF0dXJlID0gRXN0IGFjdGl2YWJsZQ0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc1JlcGVhdGFibGVfZmVhdHVyZSA9IEVzdCByXHUwMGU5aXRcdTAwZTlyYWJsZQ0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSA9IEVzdCBlbiBjb3Vycw0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc0V2ZW50RHJpdmVuX2ZlYXR1cmUgPSBFc3QgY29tbWFuZFx1MDBlOSBwYXIgbGVzIFx1MDBlOXZcdTAwZTluZW1lbnRzDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2xpbmtUb1ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBMaWVyIGF1IHByXHUwMGU5ZFx1MDBlOWNlc3NldXINCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVmaXhfZmVhdHVyZSA9IFByXHUwMGU5Zml4ZQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlID0gRXN0IHBsYW5pZmlcdTAwZTkNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9oYXNNdWx0aXBsZU9jY3VycmVuY2VzX2ZlYXR1cmUgPSBDb21wdGUgcGx1c2lldXJzIG9jY3VycmVuY2VzDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlID0gRXN0IGZhY3VsdGF0aWYNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRBZnRlcl9mZWF0dXJlID0gUHJcdTAwZTlzZW50XHUwMGU5IGFwclx1MDBlOHMNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRCZWZvcmVfZmVhdHVyZSA9IFByXHUwMGU5c2VudFx1MDBlOSBhdmFudA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9mZWF0dXJlID0gRG9ublx1MDBlOWVzIGRlIHBsYW5pZmljYXRpb24NCi1fVUlfQnJlYWtkb3duRWxlbWVudF9zdXBlckFjdGl2aXRpZXNfZmVhdHVyZSA9IFN1cGVyYWN0aXZpdFx1MDBlOXMNCi1fVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUgPSBSXHUwMGY0bGVzIGRlcyBcdTAwZTlxdWlwZXMNCi1fVUlfVGVhbVByb2ZpbGVfc3VwZXJUZWFtX2ZlYXR1cmUgPSBTdXBlcmdyb3VwZQ0KLV9VSV9UZWFtUHJvZmlsZV9zdWJUZWFtX2ZlYXR1cmUgPSBTb3VzLWdyb3VwZQ0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9Sb2xlX2ZlYXR1cmUgPSBSXHUwMGY0bGUNCi1fVUlfUm9sZURlc2NyaXB0b3JfbW9kaWZpZXNfZmVhdHVyZSA9IE1vZGlmaWUNCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFJlc3BvbnNhYmxlIGRlDQotX1VJX1dvcmtPcmRlcl9saW5rVHlwZV9mZWF0dXJlID0gVHlwZSBkZSBsaWVuDQotX1VJX1dvcmtPcmRlcl9wcmVkX2ZlYXR1cmUgPSBQclx1MDBlOWQuDQotX1VJX1BsYW5uaW5nRGF0YV9zdGFydERhdGVfZmVhdHVyZSA9IERhdGUgZGUgZFx1MDBlOWJ1dA0KLV9VSV9QbGFubmluZ0RhdGFfZmluaXNoRGF0ZV9mZWF0dXJlID0gRGF0ZSBkZSBmaW4NCi1fVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSA9IENsYXNzZW1lbnQNCi1fVUlfRGVzY3JpcHRvcl9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2VfZmVhdHVyZSA9IEVzdCBzeW5jaHJvbmlzXHUwMGU5IGF2ZWMgbGEgc291cmNlDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUVudHJ5U3RhdGVfZmVhdHVyZSA9IEV0YXQgZCdlbnRyXHUwMGU5ZSBkJ2FjdGl2aXRcdTAwZTkNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RXhpdFN0YXRlX2ZlYXR1cmUgPSBFdGF0IGRlIHNvcnRpZSBkJ2FjdGl2aXRcdTAwZTkNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBQcm9kdWl0DQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RlZEJ5X2ZlYXR1cmUgPSBBZmZlY3RcdTAwZTkgcGFyDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RzX2ZlYXR1cmUgPSBBZmZlY3RlDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9kZWxpdmVyYWJsZVBhcnRzX2ZlYXR1cmUgPSBDb21wb3NhbnRzIGxpdnJhYmxlcw0KLV9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUgPSBUXHUwMGUyY2hlDQotX1VJX1Rhc2tEZXNjcmlwdG9yX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBFeFx1MDBlOWN1dGFudCBzZWNvbmRhaXJlDQotX1VJX1Rhc2tEZXNjcmlwdG9yX2Fzc2lzdGVkQnlfZmVhdHVyZSA9IEFpZFx1MDBlOSBkZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUgPSBFbnRyXHUwMGU5ZSBleHRlcm5lDQotX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBFbnRyXHUwMGU5ZSBvYmxpZ2F0b2lyZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBFbnRyXHUwMGU5ZSBmYWN1bHRhdGl2ZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vdXRwdXRfZmVhdHVyZSA9IFNvcnRpZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9wZXJmb3JtZWRQcmltYXJpbHlCeV9mZWF0dXJlID0gRXhcdTAwZTljdXRhbnQgcHJpbmNpcGFsDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3NlbGVjdGVkU3RlcHNfZmVhdHVyZSA9IEV0YXBlcyBzXHUwMGU5bGVjdGlvbm5cdTAwZTllcw0KLV9VSV9Db21wb3NpdGVSb2xlX2FnZ3JlZ2F0ZWRSb2xlc19mZWF0dXJlID0gUlx1MDBmNGxlcyBhZ3JcdTAwZTlnXHUwMGU5cw0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlID0gQ29uc2VpbHMgZCd1dGlsaXNhdGlvbg0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IE9iamV0DQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBBbHRlcm5hdGl2ZXMNCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUgPSBEb3RhdGlvbiBlbiBwZXJzb25uZWwNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSA9IEVjaGVsbGUNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlID0gQ2FyYWN0XHUwMGU5cmlzdGlxdWVzIGRlIHByb2pldA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9yaXNrTGV2ZWxfZmVhdHVyZSA9IE5pdmVhdSBkZSByaXNxdWUNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fZXN0aW1hdGluZ1RlY2huaXF1ZV9mZWF0dXJlID0gVGVjaG5pcXVlIGQnZXN0aW1hdGlvbg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlX2ZlYXR1cmUgPSBFeHBlcnRpc2UgZHUgbWVtYnJlIGRlIHByb2pldA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gVHlwZSBkZSBjb250cmF0DQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBJZGVudGlmaWNhdGV1ciBleHRlcm5lDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9zY29wZV9mZWF0dXJlID0gUG9ydFx1MDBlOWUNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3VzYWdlTm90ZXNfZmVhdHVyZSA9IE5vdGVzIGQndXRpbGlzYXRpb24NCi1fVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3JlZmluZWREZXNjcmlwdGlvbl9mZWF0dXJlID0gRGVzY3JpcHRpb24gZFx1MDBlOXRhaWxsXHUwMGU5ZQ0KLV9VSV9QcmFjdGljZV9zdWJQcmFjdGljZXNfZmVhdHVyZSA9IFNvdXMtcHJhdGlxdWVzDQotX1VJX1ByYWN0aWNlX2NvbnRlbnRSZWZlcmVuY2VzX2ZlYXR1cmUgPSBSXHUwMGU5Zlx1MDBlOXJlbmNlcyBkZSBjb250ZW51DQotX1VJX1ByYWN0aWNlX2FjdGl2aXR5UmVmZXJlbmNlc19mZWF0dXJlID0gUlx1MDBlOWZcdTAwZTlyZW5jZXMgZCdhY3Rpdml0XHUwMGU5DQotX1VJX1N0YXRlX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBQcm9kdWl0DQotX1VJX1N0YXRlX1JlZ2lvbl9mZWF0dXJlID0gUlx1MDBlOWdpb24NCi1fVUlfU3RhdGVfc3VibWFjaGluZV9mZWF0dXJlID0gU291cy1tYWNoaW5lDQotX1VJX1ZlcnRleF9jb250YWluZXJfZmVhdHVyZSA9IENvbnRlbmV1cg0KLV9VSV9WZXJ0ZXhfb3V0Z29pbmdfZmVhdHVyZSA9IEVtaXNzaW9uDQotX1VJX1ZlcnRleF9pbmNvbWluZ19mZWF0dXJlID0gUlx1MDBlOWNlcHRpb24NCi1fVUlfUmVnaW9uX1ZlcnRleF9mZWF0dXJlID0gVmVydGV4DQotX1VJX1JlZ2lvbl9UcmFuc2l0aW9uX2ZlYXR1cmUgPSBUcmFuc2l0aW9uDQotX1VJX1JlZ2lvbl9TdGF0ZV9mZWF0dXJlID0gRXRhdA0KLV9VSV9SZWdpb25fU3RhdGVNYWNoaW5lX2ZlYXR1cmUgPSBNYWNoaW5lIGQnXHUwMGU5dGF0DQotX1VJX1N0YXRlTWFjaGluZV9SZWdpb25fZmVhdHVyZSA9IFJcdTAwZTlnaW9uDQotX1VJX1RyYW5zaXRpb25fV29ya0RlZmluaXRpb25fZmVhdHVyZSA9IERcdTAwZTlmaW5pdGlvbiBkZSB0cmF2YWlsDQotX1VJX1RyYW5zaXRpb25fY29udGFpbmVyX2ZlYXR1cmUgPSBDb250ZW5ldXINCi1fVUlfVHJhbnNpdGlvbl9zb3VyY2VfZmVhdHVyZSA9IFNvdXJjZQ0KLV9VSV9UcmFuc2l0aW9uX3RhcmdldF9mZWF0dXJlID0gQ2libGUNCi1fVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlID0gVFx1MDBlMmNoZXMNCi1fVUlfRGlzY2lwbGluZV9zdWJkaXNjaXBsaW5lX2ZlYXR1cmUgPSBTb3VzLWRpc2NpcGxpbmUNCi1fVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSA9IEVuY2hhXHUwMGVlbmVtZW50cyBkJ2FjdGl2aXRcdTAwZTlzIGRlIHJcdTAwZTlmXHUwMGU5cmVuY2UNCi1fVUlfUm9sZVNldF9yb2xlc19mZWF0dXJlID0gUlx1MDBmNGxlcw0KLV9VSV9Eb21haW5fd29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBQcm9kdWl0cw0KLV9VSV9Eb21haW5fc3ViZG9tYWluc19mZWF0dXJlID0gU291cy1kb21haW5lcw0KLV9VSV9Xb3JrUHJvZHVjdFR5cGVfd29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBQcm9kdWl0cw0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IERpc2NpcGxpbmVzDQotX1VJX1Rvb2xfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IEd1aWRlcyBkJ3V0aWxpc2F0aW9uIGRlIGwnb3V0aWwNCi1fVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUgPSBFbnNlbWJsZXMgZGUgclx1MDBmNGxlcw0KLV9VSV9DdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX2ZlYXR1cmUgPSBFbFx1MDBlOW1lbnRzIGNhdFx1MDBlOWdvcmlzXHUwMGU5cw0KLV9VSV9DdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX2ZlYXR1cmUgPSBTb3VzLWNhdFx1MDBlOWdvcmllcw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUgPSBEb2N1bWVudHMgZGUgZm9ybWF0aW9uDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19jb21tdW5pY2F0aW9uc01hdGVyaWFsc19mZWF0dXJlID0gU3VwcG9ydHMgZGUgY29tbXVuaWNhdGlvbg0KLV9VSV9Qcm9jZXNzX2luY2x1ZGVzUGF0dGVybnNfZmVhdHVyZSA9IENvbXByZW5kIGxlcyBwYXR0ZXJucw0KLV9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUgPSBDb250ZXh0ZSBwYXIgZFx1MDBlOWZhdXQNCi1fVUlfUHJvY2Vzc192YWxpZENvbnRleHRfZmVhdHVyZSA9IENvbnRleHRlIHZhbGlkZQ0KLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9iYXNlZE9uUHJvY2Vzc2VzX2ZlYXR1cmUgPSBCYXNcdTAwZTkgc3VyIGxlcyBwcm9jZXNzdXMNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF9pbnRlcmZhY2VzX2ZlYXR1cmUgPSBJbnRlcmZhY2VzDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gUHJvY2Vzc3VzDQotX1VJX1Byb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19mZWF0dXJlID0gRWxcdTAwZTltZW50cyBkZSBwcm9jZXNzdXMNCi1fVUlfUHJvY2Vzc1BhY2thZ2VfZGlhZ3JhbXNfZmVhdHVyZSA9IERpYWdyYW1tZXMNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19mZWF0dXJlID0gU3BcdTAwZTljaWZpY2F0aW9ucyBkJ2ludGVyZmFjZQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZUlPX2ZlYXR1cmUgPSBFbnRyXHUwMGU5ZS1zb3J0aWUgZCdpbnRlcmZhY2UNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlID0gQ29tcG9zYW50IGRlIHByb2Nlc3N1cw0KLV9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSA9IE1vZGlmaWFibGUgcGFyIGwndXRpbGlzYXRldXINCi1fVUlfTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX2ZlYXR1cmUgPSBQYWNrYWdlcyBkZSBtXHUwMGU5dGhvZGUNCi1fVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUgPSBCYXNlcw0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUgPSBUeXBlIGRlIHZhcmlhYmlsaXRcdTAwZTkNCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSA9IFZhcmlhYmlsaXRcdTAwZTkgYmFzXHUwMGU5ZSBzdXIgbCdcdTAwZTlsXHUwMGU5bWVudA0KLV9VSV9NZXRob2RVbml0X2F1dGhvcnNfZmVhdHVyZSA9IEF1dGV1cnMNCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUgPSBEYXRlIGRlIG1vZGlmaWNhdGlvbg0KLV9VSV9NZXRob2RVbml0X2NoYW5nZURlc2NyaXB0aW9uX2ZlYXR1cmUgPSBEZXNjcmlwdGlvbiBkZSBsYSBtb2RpZmljYXRpb24NCi1fVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUgPSBWZXJzaW9uDQotX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUgPSBEXHUwMGU5Y2xhcmF0aW9uIGRlIGRyb2l0cyBkJ2F1dGV1cg0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBsdWdpblNlbGVjdGlvbl9mZWF0dXJlID0gU1x1MDBlOWxlY3Rpb24gZHUgcGx1Zy1pbiBkZSBtXHUwMGU5dGhvZGUNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUgPSBTXHUwMGU5bGVjdGlvbiBkdSBwYWNrYWdlIGRlIG1cdTAwZTl0aG9kZQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlID0gVnVlcyBkZSBwcm9jZXNzdXMNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9kZWZhdWx0Vmlld19mZWF0dXJlID0gVnVlIHBhciBkXHUwMGU5ZmF1dA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gQ29uZmlndXJhdGlvbnMgZGUgYmFzZQ0KLV9VSV9Qcm9jZXNzRmFtaWx5X2RlbGl2ZXJ5UHJvY2Vzc2VzX2ZlYXR1cmUgPSBQcm9jZXNzdXMgZGUgbGl2cmFpc29uDQotX1VJX01ldGhvZExpYnJhcnlfbWV0aG9kUGx1Z2luc19mZWF0dXJlID0gUGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlDQotX1VJX01ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX2ZlYXR1cmUgPSBDb25maWd1cmF0aW9ucyBwclx1MDBlOWRcdTAwZTl2ZWxvcHBcdTAwZTllcw0KLV9VSV9Vbmtub3duX2ZlYXR1cmUgPSBOb24gc3BcdTAwZTljaWZpXHUwMGU5DQotDQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9TdGFydF9saXRlcmFsID0gRmluIGF1IGRcdTAwZTlidXQNCi1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb0ZpbmlzaF9saXRlcmFsID0gRmluIFx1MDBlMCBmaW4NCi1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvU3RhcnRfbGl0ZXJhbCA9IERcdTAwZTlidXQgYXUgZFx1MDBlOWJ1dA0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9GaW5pc2hfbGl0ZXJhbCA9IERcdTAwZTlidXQgXHUwMGUwIGZpbg0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfaW5pdGlhbF9saXRlcmFsID0gaW5pdGlhbA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gam9pbnR1cmUNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2ZvcmtfbGl0ZXJhbCA9IGZvdXJjaGUNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBqb25jdGlvbg0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfY2hvaWNlX2xpdGVyYWwgPSBvcHRpb24NCi1fVUlfUHNldWRvU3RhdGVLaW5kX2VudHJ5UG9pbnRfbGl0ZXJhbCA9IFBvaW50IGQnZW50clx1MDBlOWUNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gUG9pbnQgZGUgc29ydGllDQotX1VJX1BzZXVkb1N0YXRlS2luZF90ZXJtaW5hdGVfbGl0ZXJhbCA9IFRlcm1pbmVyDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9uYV9saXRlcmFsID0gbm9uIGRpc3BvbmlibGUNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2NvbnRyaWJ1dGVzX2xpdGVyYWwgPSBjb250cmlidWUNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2V4dGVuZHNfbGl0ZXJhbCA9IFx1MDBlOXRlbmQNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX3JlcGxhY2VzX2xpdGVyYWwgPSByZW1wbGFjZQ0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbG9jYWxDb250cmlidXRpb25fbGl0ZXJhbCA9IENvbnRyaWJ1dGlvbiBsb2NhbGUNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IFJlbXBsYWNlbWVudCBsb2NhbA0KLV9VSV9BcnRpZmFjdERlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXB0ZXVyIGQnYXJ0ZWZhY3QNCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBEZXNjcmlwdGV1ciBkZSBsaXZyYWJsZQ0KLV9VSV9PdXRjb21lRGVzY3JpcHRvcl90eXBlID0gRGVzY3JpcHRldXIgZGUgc29ydGllDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OWRiY2U4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLXBsdWdpbk5hbWUgPSBTdXBwb3J0byBtb2RpZmljYSBFTUYgVU1BDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IENyZWF0ZSBOZXcgezB9IFVuZGVyIHsxfSBGZWF0dXJlDQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IGNoaWxkIG9mIHR5cGUgezB9IGZvciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlIHNlbGVjdGVkIHsyfS4NCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBzaWJsaW5nIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezJ9LCB1bmRlciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlaXIgcGFyZW50Lg0KLQ0KLV9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSBMYSB7MH0gZGkgezF9DQotDQotX1VJX0NsYXNzaWZpZXJfdHlwZSA9IENsYXNzaWZpY2F0b3JlDQotX1VJX1R5cGVfdHlwZSA9IFRpcG8NCi1fVUlfRWxlbWVudF90eXBlID0gRWxlbWVudG8NCi1fVUlfTmFtZWRFbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZW5vbWluYXRvDQotX1VJX1BhY2thZ2VhYmxlRWxlbWVudF90eXBlID0gRWxlbWVudG8gY2hlIHB1XHUwMGYyIGVzc2VyZSBpbnNlcml0byBuZWwgcGFjY2hldHRvDQotX1VJX1BhY2thZ2VfdHlwZSA9IFBhY2NoZXR0bw0KLV9VSV9OYW1lc3BhY2VfdHlwZSA9IFNwYXppbyBkZWkgbm9taQ0KLV9VSV9NZXRob2RFbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZWwgbWV0b2RvDQotX1VJX0NvbnN0cmFpbnRfdHlwZSA9IFZpbmNvbG8NCi1fVUlfQ29udGVudEVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIGRlbCBjb250ZW51dG8NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZXNjcml2aWJpbGUNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcml6aW9uZSBjb250ZW51dG8NCi1fVUlfU2VjdGlvbl90eXBlID0gU2V6aW9uZQ0KLV9VSV9Sb2xlX3R5cGUgPSBSdW9sbw0KLV9VSV9Xb3JrUHJvZHVjdF90eXBlID0gUHJvZG90dG8gZGkgbGF2b3JvDQotX1VJX1Rhc2tfdHlwZSA9IE9wZXJhemlvbmUNCi1fVUlfV29ya0RlZmluaXRpb25fdHlwZSA9IERlZmluaXppb25lIGxhdm9ybw0KLV9VSV9TdGVwX3R5cGUgPSBQYXNzbw0KLV9VSV9HdWlkYW5jZV90eXBlID0gR3VpZGENCi1fVUlfQXJ0aWZhY3RfdHlwZSA9IEFydGVmYXR0bw0KLV9VSV9EZWxpdmVyYWJsZV90eXBlID0gQ29tcG9uZW50ZSBkaXN0cmlidWliaWxlDQotX1VJX091dGNvbWVfdHlwZSA9IFJpc3VsdGF0bw0KLV9VSV9NZXRob2RQYWNrYWdlX3R5cGUgPSBQYWNjaGV0dG8gZGkgbWV0b2RvDQotX1VJX0NvbnRlbnRQYWNrYWdlX3R5cGUgPSBQYWNjaGV0dG8gZGVsIGNvbnRlbnV0bw0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcml6aW9uZSBhcnRlZmF0dG8NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpemlvbmUgcHJvZG90dG8gZGkgbGF2b3JvDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXppb25lIGNvbXBvbmVudGUgZGlzdHJpYnVpYmlsZQ0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXppb25lIHJ1b2xvDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpemlvbmUgYXR0aXZpdFx1MDBlMA0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcml6aW9uZSBndWlkYQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcml6aW9uZSBwcm9jZWR1cmENCi1fVUlfUG9pbnRfdHlwZSA9IFB1bnRvDQotX1VJX0dyYXBoRWxlbWVudF90eXBlID0gRWxlbWVudG8gZ3JhZmljbw0KLV9VSV9EaWFncmFtRWxlbWVudF90eXBlID0gRWxlbWVudG8gZGlhZ3JhbW1hDQotX1VJX0RpYWdyYW1MaW5rX3R5cGUgPSBDb2xsZWdhbWVudG8gZGlhZ3JhbW1hDQotX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUgPSBDb25uZXR0b3JlIGdyYWZpY28NCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gQnJpZGdlIG1vZGVsbG8gc2VtYW50aWNvDQotX1VJX0RpbWVuc2lvbl90eXBlID0gRGltZW5zaW9uZQ0KLV9VSV9SZWZlcmVuY2VfdHlwZSA9IFJpZmVyaW1lbnRvDQotX1VJX1Byb3BlcnR5X3R5cGUgPSBQcm9wcmlldFx1MDBlMA0KLV9VSV9HcmFwaEVkZ2VfdHlwZSA9IE1hcmdpbmUgZ3JhZmljbw0KLV9VSV9EaWFncmFtX3R5cGUgPSBEaWFncmFtbWENCi1fVUlfR3JhcGhOb2RlX3R5cGUgPSBOb2RvIGdyYWZpY28NCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIG1vZGVsbG8gc2VtYW50aWNhIHNlbXBsaWNlDQotX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IEJyaWRnZSBtb2RlbGxvIHNlbWFudGljbyBVTUENCi1fVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IEJyaWRnZSBtb2RlbGxvIHNlbWFudGljbyBkaSBiYXNlDQotX1VJX0xlYWZFbGVtZW50X3R5cGUgPSBFbGVtZW50byBmb2dsaWENCi1fVUlfVGV4dEVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIHRlc3RvDQotX1VJX0ltYWdlX3R5cGUgPSBJbW1hZ2luZQ0KLV9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUgPSBQcmltaXRpdmEgZ3JhZmljYQ0KLV9VSV9Qb2x5bGluZV90eXBlID0gUG9saWxpbmVhDQotX1VJX0VsbGlwc2VfdHlwZSA9IEVsbGlzc2UNCi1fVUlfQWN0aXZpdHlfdHlwZSA9IEF0dGl2aXRcdTAwZTANCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIGRlbGxhIHN1ZGRpdmlzaW9uZSBkZWwgbGF2b3JvDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIGRlbGxhIHN1ZGRpdmlzaW9uZQ0KLV9VSV9NaWxlc3RvbmVfdHlwZSA9IE1pbGVzdG9uZQ0KLV9VSV9JdGVyYXRpb25fdHlwZSA9IEl0ZXJhemlvbmUNCi1fVUlfUGhhc2VfdHlwZSA9IEZhc2UNCi1fVUlfVGVhbVByb2ZpbGVfdHlwZSA9IFByb2ZpbG8gdGVhbQ0KLV9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlID0gRGVzY3JpdHRvcmUgZGkgcnVvbGkNCi1fVUlfV29ya09yZGVyX3R5cGUgPSBPcmRpbmUgbGF2b3JvDQotX1VJX1Byb2Nlc3NFbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZWwgcHJvY2Vzc28NCi1fVUlfUGxhbm5pbmdEYXRhX3R5cGUgPSBQaWFuaWZpY2F6aW9uZSBkYXRpDQotX1VJX0Rlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXR0b3JlDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlID0gRGVzY3JpdHRvcmUgZGkgcHJvZG90dGkgZGkgbGF2b3JvDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUgPSBEZXNjcml0dG9yZSBkaSBvcGVyYXppb25pDQotX1VJX0NvbXBvc2l0ZVJvbGVfdHlwZSA9IFJ1b2xvIGNvbXBvc2l0bw0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXppb25lIGVsZW1lbnRvIGRlbGxhIHN1ZGRpdmlzaW9uZQ0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcml6aW9uZSBhdHRpdml0XHUwMGUwDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcml6aW9uZSBwcm9jZXNzbyBkaSBwcm9kdXppb25lDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpemlvbmUgcHJvY2Vzc28NCi1fVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcml6aW9uZSBkZXNjcml0dG9yZQ0KLV9VSV9Db25jZXB0X3R5cGUgPSBDb25jZXR0bw0KLV9VSV9DaGVja2xpc3RfdHlwZSA9IEVsZW5jbyBkaSBjb250cm9sbG8NCi1fVUlfRXhhbXBsZV90eXBlID0gRXNlbXBpbw0KLV9VSV9HdWlkZWxpbmVfdHlwZSA9IExpbmVhIGd1aWRhDQotX1VJX1JlcG9ydF90eXBlID0gUmVwb3J0DQotX1VJX1RlbXBsYXRlX3R5cGUgPSBNb2RlbGxvDQotX1VJX1N1cHBvcnRpbmdNYXRlcmlhbF90eXBlID0gTWF0ZXJpYWxlIGRpIHN1cHBvcnRvDQotX1VJX1Rvb2xNZW50b3JfdHlwZSA9IEd1aWRhIGFsIHRvb2wNCi1fVUlfV2hpdGVwYXBlcl90eXBlID0gV2hpdGVwYXBlcg0KLV9VSV9UZXJtRGVmaW5pdGlvbl90eXBlID0gRGVmaW5pemlvbmUgdGVybWluZQ0KLV9VSV9QcmFjdGljZV90eXBlID0gUHJvY2VkdXJhDQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gQ29uc2lkZXJhemlvbmkgc3VsbGEgdmFsdXRhemlvbmUNCi1fVUlfUmV1c2FibGVBc3NldF90eXBlID0gUmlzb3JzYSByaXV0aWxpenphYmlsZQ0KLV9VSV9TdGF0ZV90eXBlID0gU3RhdG8NCi1fVUlfVmVydGV4X3R5cGUgPSBWZXJ0aWNlDQotX1VJX1JlZ2lvbl90eXBlID0gUmVnaW9uZQ0KLV9VSV9TdGF0ZU1hY2hpbmVfdHlwZSA9IENvbXB1dGVyIGRpIHN0YXRvDQotX1VJX1RyYW5zaXRpb25fdHlwZSA9IFRyYW5zaXppb25lDQotX1VJX1BzZXVkb1N0YXRlX3R5cGUgPSBQc2V1ZG8gU3RhdG8NCi1fVUlfRGlzY2lwbGluZV90eXBlID0gRGlzY2lwbGluYQ0KLV9VSV9Db250ZW50Q2F0ZWdvcnlfdHlwZSA9IENhdGVnb3JpYSBjb250ZW51dG8NCi1fVUlfUm9sZVNldF90eXBlID0gSW5zaWVtZSBkaSBydW9saQ0KLV9VSV9Eb21haW5fdHlwZSA9IERvbWluaW8NCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3R5cGUgPSBUaXBvIGRpIHByb2RvdHRvIGRpIGxhdm9ybw0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSA9IFJhZ2dydXBwYW1lbnRvIGRpc2NpcGxpbmUNCi1fVUlfVG9vbF90eXBlID0gVG9vbA0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSA9IFJhZ2dydXBwYW1lbnRvIGluc2llbWkgZGkgcnVvbGkNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSA9IENhdGVnb3JpYSBwZXJzb25hbGl6emF0YQ0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfdHlwZSA9IFByb2Nlc3NvIGRpIHByb2R1emlvbmUNCi1fVUlfUHJvY2Vzc190eXBlID0gUHJvY2Vzc28NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdHlwZSA9IE1vZGVsbG8gZGkgY2FwYWNpdFx1MDBlMA0KLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV90eXBlID0gTW9kZWxsbyBwaWFuaWZpY2F6aW9uZSBwcm9jZXNzaQ0KLV9VSV9Sb2FkbWFwX3R5cGUgPSBSb2FkbWFwDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSA9IENvbXBvbmVudGUgcHJvY2Vzc28NCi1fVUlfUHJvY2Vzc1BhY2thZ2VfdHlwZSA9IFBhY2NoZXR0byBwcm9jZXNzbw0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX3R5cGUgPSBJbnRlcmZhY2NpYSBjb21wb25lbnRlIHByb2Nlc3NvDQotX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX3R5cGUgPSBEZXNjcml0dG9yZSBkaSBjb21wb25lbnRpIGRlbCBwcm9jZXNzbw0KLV9VSV9NZXRob2RQbHVnaW5fdHlwZSA9IFBsdWctaW4gZGkgbWV0b2RvDQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlID0gRWxlbWVudG8gdmFyaWFiaWxpdFx1MDBlMA0KLV9VSV9NZXRob2RVbml0X3R5cGUgPSBVbml0XHUwMGUwIG1ldG9kbw0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUgPSBDb25maWd1cmF6aW9uZSBkaSBtZXRvZG8NCi1fVUlfUHJvY2Vzc0ZhbWlseV90eXBlID0gRmFtaWdsaWEgcHJvY2Vzc28NCi1fVUlfTWV0aG9kTGlicmFyeV90eXBlID0gTGlicmVyaWEgZGVpIG1ldG9kaQ0KLV9VSV9Vbmtub3duX3R5cGUgPSBPZ2dldHRvDQotDQotX1VJX1Vua25vd25fZGF0YXR5cGU9IFZhbG9yZQ0KLQ0KLV9VSV9OYW1lZEVsZW1lbnRfbmFtZV9mZWF0dXJlID0gTm9tZQ0KLV9VSV9NZXRob2RFbGVtZW50X2d1aWRfZmVhdHVyZSA9IEd1aWQNCi1fVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBCcmV2ZSBkZXNjcml6aW9uZQ0KLV9VSV9NZXRob2RFbGVtZW50X293bmVkUnVsZXNfZmVhdHVyZSA9IFJlZ29sZSBkaSBwcm9wcmlldFx1MDBlMA0KLV9VSV9NZXRob2RFbGVtZW50X3N1cHByZXNzZWRfZmVhdHVyZSA9IEVsaW1pbmF0bw0KLV9VSV9NZXRob2RFbGVtZW50X29yZGVyaW5nR3VpZGVfZmVhdHVyZSA9IEd1aWRhIGFsbCdvcmRpbmF6aW9uZQ0KLV9VSV9Db25zdHJhaW50X2JvZHlfZmVhdHVyZSA9IENvcnBvDQotX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IE1hdGVyaWFsZSBkaSBzdXBwb3J0bw0KLV9VSV9Db250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19mZWF0dXJlID0gQ29uY2V0dGkgZSB3aGl0ZXBhcGVyDQotX1VJX0NvbnRlbnRFbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSA9IEVsZW5jaGkgZGkgY29udHJvbGxvDQotX1VJX0NvbnRlbnRFbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSA9IExpbmVlIGd1aWRhDQotX1VJX0NvbnRlbnRFbGVtZW50X2V4YW1wbGVzX2ZlYXR1cmUgPSBFc2VtcGkNCi1fVUlfQ29udGVudEVsZW1lbnRfYXNzZXRzX2ZlYXR1cmUgPSBSaXNvcnNlDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUgPSBOb21lIHByZXNlbnRhemlvbmUNCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gUHJlc2VudGF6aW9uZQ0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBTaGFwZWljb24NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBOb2RlaWNvbg0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBEZXNjcml6aW9uZSBwcmluY2lwYWxlDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19mZWF0dXJlID0gU2V6aW9uaQ0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fa2V5Q29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IENvbnNpZGVyYXppb25pIGNoaWF2ZQ0KLV9VSV9TZWN0aW9uX3NlY3Rpb25OYW1lX2ZlYXR1cmUgPSBOb21lIHNlemlvbmUNCi1fVUlfU2VjdGlvbl9zZWN0aW9uRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaXppb25lIHNlemlvbmUNCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gU290dG9zZXppb25lDQotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IFByZWRlY2Vzc29yZQ0KLV9VSV9Sb2xlX21vZGlmaWVzX2ZlYXR1cmUgPSBNb2RpZmljYQ0KLV9VSV9Sb2xlX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUgPSBSZXNwb25zYWJpbGUgZGkNCi1fVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlID0gUmVwb3J0DQotX1VJX1dvcmtQcm9kdWN0X3RlbXBsYXRlc19mZWF0dXJlID0gTW9kZWxsaQ0KLV9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlID0gR3VpZGEgYWwgdG9vbA0KLV9VSV9Xb3JrUHJvZHVjdF9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IENvbnNpZGVyYXppb25pIHN1bGxhIHZhbHV0YXppb25lDQotX1VJX1Rhc2tfcGVyZm9ybWVkQnlfZmVhdHVyZSA9IEVzZWd1aXRhIGRhDQotX1VJX1Rhc2tfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IElucHV0IG9iYmxpZ2F0b3Jpbw0KLV9VSV9UYXNrX291dHB1dF9mZWF0dXJlID0gT3V0cHV0DQotX1VJX1Rhc2tfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSA9IEVzZWd1aXRhIGFuY2hlIGRhDQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gSW5wdXQgZmFjb2x0YXRpdm8NCi1fVUlfVGFza19zdGVwc19mZWF0dXJlID0gUGFzc2kNCi1fVUlfVGFza190b29sTWVudG9yc19mZWF0dXJlID0gR3VpZGEgYWwgdG9vbA0KLV9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gQ29uc2lkZXJhemlvbmkgc3VsbGEgdmFsdXRhemlvbmUNCi1fVUlfV29ya0RlZmluaXRpb25fcHJlY29uZGl0aW9uX2ZlYXR1cmUgPSBQcmUtY29uZGl6aW9uZQ0KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX2ZlYXR1cmUgPSBQb3N0LWNvbmRpemlvbmUNCi1fVUlfQXJ0aWZhY3RfY29udGFpbmVyQXJ0aWZhY3RfZmVhdHVyZSA9IENvbnRlbml0b3JlIEFydGVmYXR0bw0KLV9VSV9BcnRpZmFjdF9jb250YWluZWRBcnRpZmFjdHNfZmVhdHVyZSA9IEFydGVmYXR0aSBjb250ZW51dGkNCi1fVUlfRGVsaXZlcmFibGVfZGVsaXZlcmVkV29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBQcm9kb3R0aSBkaSBsYXZvcm8gZGlzdHJpYnVpdGkNCi1fVUlfTWV0aG9kUGFja2FnZV9nbG9iYWxfZmVhdHVyZSA9IEdsb2JhbGUNCi1fVUlfTWV0aG9kUGFja2FnZV9yZXVzZWRQYWNrYWdlc19mZWF0dXJlID0gUGFjY2hldHRpIHJpdXRpbGl6emF0aQ0KLV9VSV9NZXRob2RQYWNrYWdlX3BhcmVudFBhY2thZ2VfZmVhdHVyZSA9IFBhY2NoZXR0byBwYXJlbnQNCi1fVUlfTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX2ZlYXR1cmUgPSBQYWNjaGV0dGkgY2hpbGQNCi1fVUlfQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX2ZlYXR1cmUgPSBFbGVtZW50aSBkZWwgY29udGVudXRvDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fYnJpZWZPdXRsaW5lX2ZlYXR1cmUgPSBCcmV2ZSBwcm9maWxvDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUgPSBPcHppb25pIGRpIHJhcHByZXNlbnRhemlvbmUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBJRCBlc3Rlcm5vDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gU2NvcG8NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9pbXBhY3RPZk5vdEhhdmluZ19mZWF0dXJlID0gSW1wYXR0byBkZWxsYSBub24gZGlzcG9uaWJpbGl0XHUwMGUwDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcmVhc29uc0Zvck5vdE5lZWRpbmdfZmVhdHVyZSA9IE1vdGl2byBkZWxsYSBub24gbmVjZXNzaXRcdTAwZTANCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9leHRlcm5hbERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBEZXNjcml6aW9uZSBlc3Rlcm5hDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSA9IEd1aWRhIGFsbGEgY3JlYXppb25lIHBhY2NoZXR0aQ0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fc2tpbGxzX2ZlYXR1cmUgPSBTa2lsbA0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fYXNzaWdubWVudEFwcHJvYWNoZXNfZmVhdHVyZSA9IEFwcHJvY2NpIGFzc2VnbmF6aW9uZQ0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fc3lub255bXNfZmVhdHVyZSA9IFNpbm9uaW1pDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBTY29wbw0KLV9VSV9UYXNrRGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBBbHRlcm5hdGl2bw0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX2F0dGFjaG1lbnRzX2ZlYXR1cmUgPSBBbGxlZ2F0aQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUgPSBVbHRlcmlvcmkgaW5mb3JtYXppb25pDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlID0gUHJvYmxlbWENCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9iYWNrZ3JvdW5kX2ZlYXR1cmUgPSBCYWNrZ3JvdW5kDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSA9IE9iaWV0dGl2aQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FwcGxpY2F0aW9uX2ZlYXR1cmUgPSBBcHBsaWNhemlvbmUNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9sZXZlbHNPZkFkb3B0aW9uX2ZlYXR1cmUgPSBMaXZlbGxpIGRpIGFkb3ppb25lDQotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgNCi1fVUlfUG9pbnRfeV9mZWF0dXJlID0gWQ0KLV9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSA9IFBvc2l6aW9uZQ0KLV9VSV9HcmFwaEVsZW1lbnRfY29udGFpbmVkX2ZlYXR1cmUgPSBDb250ZW51dG8NCi1fVUlfR3JhcGhFbGVtZW50X2xpbmtfZmVhdHVyZSA9IENvbGxlZ2FtZW50bw0KLV9VSV9HcmFwaEVsZW1lbnRfYW5jaG9yYWdlX2ZlYXR1cmUgPSBBbmNob3JhZ2UNCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IE1vZGVsbG8gc2VtYW50aWNhDQotX1VJX0RpYWdyYW1FbGVtZW50X2lzVmlzaWJsZV9mZWF0dXJlID0gXHUwMGM4IHZpc2liaWxlDQotX1VJX0RpYWdyYW1FbGVtZW50X2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGVuaXRvcmUNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUgPSBSaWZlcmltZW50bw0KLV9VSV9EaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9mZWF0dXJlID0gUHJvcHJpZXRcdTAwZTANCi1fVUlfRGlhZ3JhbUxpbmtfem9vbV9mZWF0dXJlID0gWm9vbQ0KLV9VSV9EaWFncmFtTGlua192aWV3cG9ydF9mZWF0dXJlID0gUmlxdWFkcm8gZGkgdmlzdWFsaXp6YXppb25lDQotX1VJX0RpYWdyYW1MaW5rX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gRWxlbWVudG8gZ3JhZmljbw0KLV9VSV9EaWFncmFtTGlua19kaWFncmFtX2ZlYXR1cmUgPSBEaWFncmFtbWENCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBFbGVtZW50byBncmFmaWNvDQotX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWRnZV9mZWF0dXJlID0gTWFyZ2luZSBncmFmaWNvDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQcmVzZW50YXppb25lDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBFbGVtZW50byBncmFmaWNvDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZGlhZ3JhbV9mZWF0dXJlID0gRGlhZ3JhbW1hDQotX1VJX0RpbWVuc2lvbl93aWR0aF9mZWF0dXJlID0gTGFyZ2hlenphDQotX1VJX0RpbWVuc2lvbl9oZWlnaHRfZmVhdHVyZSA9IEFsdGV6emENCi1fVUlfUmVmZXJlbmNlX2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBcdTAwYzggdW5hIHNpbmdvbGEgcmFwcHJlc2VudGF6aW9uZQ0KLV9VSV9SZWZlcmVuY2VfcmVmZXJlbmNlZF9mZWF0dXJlID0gQ29uIHJpZmVyaW1lbnRvDQotX1VJX1Byb3BlcnR5X2tleV9mZWF0dXJlID0gQ2hpYXZlDQotX1VJX1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUgPSBWYWxvcmUNCi1fVUlfR3JhcGhFZGdlX2FuY2hvcl9mZWF0dXJlID0gQW5jb3JhDQotX1VJX0dyYXBoRWRnZV93YXlwb2ludHNfZmVhdHVyZSA9IFdheXBvaW50cw0KLV9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSA9IFpvb20NCi1fVUlfRGlhZ3JhbV92aWV3cG9pbnRfZmVhdHVyZSA9IFJpcXVhZHJvIGRpIHZpc3VhbGl6emF6aW9uZQ0KLV9VSV9EaWFncmFtX2RpYWdyYW1MaW5rX2ZlYXR1cmUgPSBDb2xsZWdhbWVudG8gZGlhZ3JhbW1hDQotX1VJX0RpYWdyYW1fbmFtZXNwYWNlX2ZlYXR1cmUgPSBTcGF6aW8gZGVpIG5vbWkNCi1fVUlfR3JhcGhOb2RlX3NpemVfZmVhdHVyZSA9IERpbWVuc2lvbmkNCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZUluZm9fZmVhdHVyZSA9IEluZm8gdGlwbw0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnRvDQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnRvDQotX1VJX1RleHRFbGVtZW50X3RleHRfZmVhdHVyZSA9IFRlc3RvDQotX1VJX0ltYWdlX3VyaV9mZWF0dXJlID0gVXJpDQotX1VJX0ltYWdlX21pbWVUeXBlX2ZlYXR1cmUgPSBUaXBvIE1pbWUNCi1fVUlfUG9seWxpbmVfY2xvc2VkX2ZlYXR1cmUgPSBDaGl1c28NCi1fVUlfUG9seWxpbmVfd2F5cG9pbnRzX2ZlYXR1cmUgPSBXYXlwb2ludHMNCi1fVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUgPSBSYWdnaW8gWA0KLV9VSV9FbGxpcHNlX3JhZGl1c1lfZmVhdHVyZSA9IFJhZ2dpbyBZDQotX1VJX0VsbGlwc2Vfcm90YXRpb25fZmVhdHVyZSA9IFJvdGF6aW9uZQ0KLV9VSV9FbGxpcHNlX3N0YXJ0QW5nbGVfZmVhdHVyZSA9IEFuZ29sbyBkaSBwYXJ0ZW56YQ0KLV9VSV9FbGxpcHNlX2VuZEFuZ2xlX2ZlYXR1cmUgPSBBbmdvbG8gZGkgYXJyaXZvDQotX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUgPSBDZW50cm8NCi1fVUlfQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfZmVhdHVyZSA9IEVsZW1lbnRpIGRlbGxhIHN1ZGRpdmlzaW9uZQ0KLV9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlID0gUm9hZG1hcA0KLV9VSV9BY3Rpdml0eV9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUgPSBNYXRlcmlhbGUgZGkgc3VwcG9ydG8NCi1fVUlfQWN0aXZpdHlfY2hlY2tsaXN0c19mZWF0dXJlID0gRWxlbmNoaSBkaSBjb250cm9sbG8NCi1fVUlfQWN0aXZpdHlfY29uY2VwdHNfZmVhdHVyZSA9IENvbmNldHRpDQotX1VJX0FjdGl2aXR5X2V4YW1wbGVzX2ZlYXR1cmUgPSBFc2VtcGkNCi1fVUlfQWN0aXZpdHlfZ3VpZGVsaW5lc19mZWF0dXJlID0gTGluZWUgZ3VpZGENCi1fVUlfQWN0aXZpdHlfcmV1c2FibGVBc3NldHNfZmVhdHVyZSA9IFJpc29yc2Ugcml1dGlsaXp6YWJpbGkNCi1fVUlfQWN0aXZpdHlfaXNFbmFjdGFibGVfZmVhdHVyZSA9IFx1MDBjOCBhdHR1YWJpbGUNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNSZXBlYXRhYmxlX2ZlYXR1cmUgPSBcdTAwYzggcmlwZXRpYmlsZQ0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSA9IFx1MDBjOCBpbiBjb3Jzbw0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc0V2ZW50RHJpdmVuX2ZlYXR1cmUgPSBTaSBiYXNhIHN1Z2xpIGV2ZW50aQ0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9saW5rVG9QcmVkZWNlc3Nvcl9mZWF0dXJlID0gQ29sbGVnYW1lbnRvIGFsIHByZWRlY2Vzc29yZQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZWZpeF9mZWF0dXJlID0gUHJlZmlzc28NCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc1BsYW5uZWRfZmVhdHVyZSA9IFx1MDBjOCBwaWFuaWZpY2F0bw0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2hhc011bHRpcGxlT2NjdXJyZW5jZXNfZmVhdHVyZSA9IFByZXNlbnRhIHBpXHUwMGY5IHJpY29ycmVuemUNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc09wdGlvbmFsX2ZlYXR1cmUgPSBcdTAwYzggZmFjb2x0YXRpdm8NCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRBZnRlcl9mZWF0dXJlID0gUHJlc2VudGF0byBkb3BvDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQmVmb3JlX2ZlYXR1cmUgPSBQcmVzZW50YXRvIHByaW1hDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX2ZlYXR1cmUgPSBQaWFuaWZpY2F6aW9uZSBkYXRpDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwZXJBY3Rpdml0aWVzX2ZlYXR1cmUgPSBBdHRpdml0XHUwMGUwIHByaW5jaXBhbGkNCi1fVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUgPSBSdW9saSB0ZWFtDQotX1VJX1RlYW1Qcm9maWxlX3N1cGVyVGVhbV9mZWF0dXJlID0gVGVhbSBwcmluY2lwYWxlDQotX1VJX1RlYW1Qcm9maWxlX3N1YlRlYW1fZmVhdHVyZSA9IFRlYW0gc2Vjb25kYXJpbw0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9Sb2xlX2ZlYXR1cmUgPSBSdW9sbw0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlID0gTW9kaWZpY2ENCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFJlc3BvbnNhYmlsZSBkaQ0KLV9VSV9Xb3JrT3JkZXJfbGlua1R5cGVfZmVhdHVyZSA9IFRpcG8gZGkgY29sbGVnYW1lbnRvDQotX1VJX1dvcmtPcmRlcl9wcmVkX2ZlYXR1cmUgPSBQcmVkDQotX1VJX1BsYW5uaW5nRGF0YV9zdGFydERhdGVfZmVhdHVyZSA9IERhdGEgZGkgaW5pemlvDQotX1VJX1BsYW5uaW5nRGF0YV9maW5pc2hEYXRlX2ZlYXR1cmUgPSBEYXRhIGRpIGZpbmUNCi1fVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSA9IENsYXNzaWZpY2F6aW9uZQ0KLV9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlID0gXHUwMGM4IHNpbmNyb25penphdG8gY29uIGwnb3JpZ2luZQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUgPSBTdGF0byBpbmdyZXNzbyBhdHRpdml0XHUwMGUwDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUV4aXRTdGF0ZV9mZWF0dXJlID0gU3RhdG8gdXNjaXRhIGF0dGl2aXRcdTAwZTANCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBQcm9kb3R0byBkaSBsYXZvcm8NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdGVkQnlfZmVhdHVyZSA9IEluZmx1ZW56YXRvIGRhDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RzX2ZlYXR1cmUgPSBJbmZsdWlzY2Ugc3UNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2RlbGl2ZXJhYmxlUGFydHNfZmVhdHVyZSA9IFBhcnRpIGRpc3RyaWJ1aWJpbGkNCi1fVUlfVGFza0Rlc2NyaXB0b3JfVGFza19mZWF0dXJlID0gT3BlcmF6aW9uZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlID0gRXNlY3V0b3JlIHNlY29uZGFyaW8NCi1fVUlfVGFza0Rlc2NyaXB0b3JfYXNzaXN0ZWRCeV9mZWF0dXJlID0gQXNzaXN0aXRvIGRhDQotX1VJX1Rhc2tEZXNjcmlwdG9yX2V4dGVybmFsSW5wdXRfZmVhdHVyZSA9IElucHV0IGVzdGVybm8NCi1fVUlfVGFza0Rlc2NyaXB0b3JfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IElucHV0IG9iYmxpZ2F0b3Jpbw0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBJbnB1dCBmYWNvbHRhdGl2bw0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vdXRwdXRfZmVhdHVyZSA9IE91dHB1dA0KLV9VSV9UYXNrRGVzY3JpcHRvcl9wZXJmb3JtZWRQcmltYXJpbHlCeV9mZWF0dXJlID0gRXNlY3V0b3JlIHByaW1hcmlvDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3NlbGVjdGVkU3RlcHNfZmVhdHVyZSA9IFBhc3NpIHNlbGV6aW9uYXRpDQotX1VJX0NvbXBvc2l0ZVJvbGVfYWdncmVnYXRlZFJvbGVzX2ZlYXR1cmUgPSBSdW9saSBhZ2dyZWdhdGkNCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3VzYWdlR3VpZGFuY2VfZmVhdHVyZSA9IEd1aWRhIGFsbCd1c28NCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBTY29wbw0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gQWx0ZXJuYXRpdm8NCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUgPSBIb3d0byBTdGFmZg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9zY2FsZV9mZWF0dXJlID0gU2NhbGENCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlID0gQ2FyYXR0ZXJpc3RpY2hlIGRlbCBwcm9nZXR0bw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9yaXNrTGV2ZWxfZmVhdHVyZSA9IExpdmVsbG8gZGkgcmlzY2hpbw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9lc3RpbWF0aW5nVGVjaG5pcXVlX2ZlYXR1cmUgPSBWYWx1dGF6aW9uZSBkZWxsYSB0ZWNuaWNhDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IEVzcGVyaWVuemEgbWVtYnJvIGRlbCBwcm9nZXR0bw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gVGlwbyBkaSBjb250cmF0dG8NCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSA9IElEIGVzdGVybm8NCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3Njb3BlX2ZlYXR1cmUgPSBBbWJpdG8NCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3VzYWdlTm90ZXNfZmVhdHVyZSA9IE5vdGUgc3VsbCd1dGlsaXp6bw0KLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fcmVmaW5lZERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBEZXNjcml6aW9uZSBwZXJmZXppb25hdGENCi1fVUlfUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX2ZlYXR1cmUgPSBQcmF0aWNoZSBzZWNvbmRhcmllDQotX1VJX1ByYWN0aWNlX2NvbnRlbnRSZWZlcmVuY2VzX2ZlYXR1cmUgPSBSaWZlcmltZW50aSBjb250ZW51dG8NCi1fVUlfUHJhY3RpY2VfYWN0aXZpdHlSZWZlcmVuY2VzX2ZlYXR1cmUgPSBSaWZlcmltZW50aSBhdHRpdml0XHUwMGUwDQotX1VJX1N0YXRlX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBQcm9kb3R0byBkaSBsYXZvcm8NCi1fVUlfU3RhdGVfUmVnaW9uX2ZlYXR1cmUgPSBSZWdpb25lDQotX1VJX1N0YXRlX3N1Ym1hY2hpbmVfZmVhdHVyZSA9IENvbXB1dGVyIHNlY29uZGFyaW8NCi1fVUlfVmVydGV4X2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGVuaXRvcmUNCi1fVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUgPSBJbiB1c2NpdGENCi1fVUlfVmVydGV4X2luY29taW5nX2ZlYXR1cmUgPSBJbiBlbnRyYXRhDQotX1VJX1JlZ2lvbl9WZXJ0ZXhfZmVhdHVyZSA9IFZlcnRpY2UNCi1fVUlfUmVnaW9uX1RyYW5zaXRpb25fZmVhdHVyZSA9IFRyYW5zaXppb25lDQotX1VJX1JlZ2lvbl9TdGF0ZV9mZWF0dXJlID0gU3RhdG8NCi1fVUlfUmVnaW9uX1N0YXRlTWFjaGluZV9mZWF0dXJlID0gQ29tcHV0ZXIgZGkgc3RhdG8NCi1fVUlfU3RhdGVNYWNoaW5lX1JlZ2lvbl9mZWF0dXJlID0gUmVnaW9uZQ0KLV9VSV9UcmFuc2l0aW9uX1dvcmtEZWZpbml0aW9uX2ZlYXR1cmUgPSBEZWZpbml6aW9uZSBsYXZvcm8NCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IENvbnRlbml0b3JlDQotX1VJX1RyYW5zaXRpb25fc291cmNlX2ZlYXR1cmUgPSBPcmlnaW5lDQotX1VJX1RyYW5zaXRpb25fdGFyZ2V0X2ZlYXR1cmUgPSBEZXN0aW5hemlvbmUNCi1fVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlID0gT3BlcmF6aW9uaQ0KLV9VSV9EaXNjaXBsaW5lX3N1YmRpc2NpcGxpbmVfZmVhdHVyZSA9IERpc2NpcGxpbmEgc2Vjb25kYXJpYQ0KLV9VSV9EaXNjaXBsaW5lX3JlZmVyZW5jZVdvcmtmbG93c19mZWF0dXJlID0gRmx1c3NpIGRpIGxhdm9ybyBkaSByaWZlcmltZW50bw0KLV9VSV9Sb2xlU2V0X3JvbGVzX2ZlYXR1cmUgPSBSdW9saQ0KLV9VSV9Eb21haW5fd29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBQcm9kb3R0aSBkaSBsYXZvcm8NCi1fVUlfRG9tYWluX3N1YmRvbWFpbnNfZmVhdHVyZSA9IFNvdHRvZG9taW5pDQotX1VJX1dvcmtQcm9kdWN0VHlwZV93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFByb2RvdHRpIGRpIGxhdm9ybw0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IERpc2NpcGxpbmUNCi1fVUlfVG9vbF90b29sTWVudG9yc19mZWF0dXJlID0gR3VpZGEgYWwgdG9vbA0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfZmVhdHVyZSA9IEluc2llbWkgZGkgcnVvbGkNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlID0gRWxlbWVudGkgY2F0ZWdvcml6emF0aQ0KLV9VSV9DdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX2ZlYXR1cmUgPSBTb3R0b2NhdGVnb3JpZQ0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUgPSBNYXRlcmlhbGUgZGlkYXR0aWNvDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19jb21tdW5pY2F0aW9uc01hdGVyaWFsc19mZWF0dXJlID0gTWF0ZXJpYWxpIHBlciBsYSBjb211bmljYXppb25lDQotX1VJX1Byb2Nlc3NfaW5jbHVkZXNQYXR0ZXJuc19mZWF0dXJlID0gSW5jbHVkZSBtb2RlbGxpDQotX1VJX1Byb2Nlc3NfZGVmYXVsdENvbnRleHRfZmVhdHVyZSA9IENvbnRlc3RvIHByZWRlZmluaXRvDQotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBDb250ZXN0byB2YWxpZG8NCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlID0gQmFzYXRvIHN1IHByb2Nlc3NpDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfaW50ZXJmYWNlc19mZWF0dXJlID0gSW50ZXJmYWNjZQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfZmVhdHVyZSA9IFByb2Nlc3NvDQotX1VJX1Byb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19mZWF0dXJlID0gRWxlbWVudGkgZGVsIHByb2Nlc3NvDQotX1VJX1Byb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX2ZlYXR1cmUgPSBEaWFncmFtbWkNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19mZWF0dXJlID0gU3BlY2lmaWNoZSBpbnRlcmZhY2NpYQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZUlPX2ZlYXR1cmUgPSBJTyBpbnRlcmZhY2NpYQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUgPSBDb21wb25lbnRlIHByb2Nlc3NvDQotX1VJX01ldGhvZFBsdWdpbl91c2VyQ2hhbmdlYWJsZV9mZWF0dXJlID0gTW9kaWZpY2FiaWxlIGRhbGwndXRlbnRlDQotX1VJX01ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19mZWF0dXJlID0gUGFjY2hldHRpIG1ldG9kbw0KLV9VSV9NZXRob2RQbHVnaW5fYmFzZXNfZmVhdHVyZSA9IEJhc2kNCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlID0gVGlwbyBkaSB2YXJpYWJpbGl0XHUwMGUwDQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBWYXJpYWJpbGl0XHUwMGUwIGJhc2F0YSBzdSBlbGVtZW50bw0KLV9VSV9NZXRob2RVbml0X2F1dGhvcnNfZmVhdHVyZSA9IEF1dG9yaQ0KLV9VSV9NZXRob2RVbml0X2NoYW5nZURhdGVfZmVhdHVyZSA9IERhdGEgbW9kaWZpY2ENCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlID0gRGVzY3JpemlvbmUgbW9kaWZpY2ENCi1fVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUgPSBWZXJzaW9uZQ0KLV9VSV9NZXRob2RVbml0X2NvcHlyaWdodFN0YXRlbWVudF9mZWF0dXJlID0gSW5mb3JtYXRpdmEgc3VsIGNvcHlyaWdodA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBsdWdpblNlbGVjdGlvbl9mZWF0dXJlID0gU2VsZXppb25lIHBsdWctaW4gbWV0b2RvDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fbWV0aG9kUGFja2FnZVNlbGVjdGlvbl9mZWF0dXJlID0gU2VsZXppb25lIHBhY2NoZXR0byBtZXRvZG8NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9wcm9jZXNzVmlld3NfZmVhdHVyZSA9IFZpc3VhbGl6emF6aW9uaSBwcm9jZXNzbw0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2RlZmF1bHRWaWV3X2ZlYXR1cmUgPSBWaXN1YWxpenphemlvbmUgcHJlZGVmaW5pdGENCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9iYXNlQ29uZmlndXJhdGlvbnNfZmVhdHVyZSA9IENvbmZpZ3VyYXppb25pDQotX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSA9IFByb2Nlc3NpIGRpIHByb2R1emlvbmUNCi1fVUlfTWV0aG9kTGlicmFyeV9tZXRob2RQbHVnaW5zX2ZlYXR1cmUgPSBQbHVnLWluIGRlbCBtZXRvZG8NCi1fVUlfTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfZmVhdHVyZSA9IENvbmZpZ3VyYXppb25pIHByZWRlZmluaXRlDQotX1VJX1Vua25vd25fZmVhdHVyZSA9IE5vbiBzcGVjaWZpY2F0bw0KLQ0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvU3RhcnRfbGl0ZXJhbCA9IGZpbmlzaFRvU3RhcnQNCi1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb0ZpbmlzaF9saXRlcmFsID0gZmluaXNoVG9GaW5pc2gNCi1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvU3RhcnRfbGl0ZXJhbCA9IHN0YXJ0VG9TdGFydA0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9GaW5pc2hfbGl0ZXJhbCA9IHN0YXJ0VG9GaW5pc2gNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2luaXRpYWxfbGl0ZXJhbCA9IGluaXppYWxlDQotX1VJX1BzZXVkb1N0YXRlS2luZF9qb2luX2xpdGVyYWwgPSB1bmlvbmUNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2ZvcmtfbGl0ZXJhbCA9IGZvcmsNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBzb21tYQ0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfY2hvaWNlX2xpdGVyYWwgPSBzY2VsdGENCi1fVUlfUHNldWRvU3RhdGVLaW5kX2VudHJ5UG9pbnRfbGl0ZXJhbCA9IGVudHJ5UG9pbnQNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gZXhpdFBvaW50DQotX1VJX1BzZXVkb1N0YXRlS2luZF90ZXJtaW5hdGVfbGl0ZXJhbCA9IHRlcm1pbmENCi1fVUlfVmFyaWFiaWxpdHlUeXBlX25hX2xpdGVyYWwgPSBuYQ0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfY29udHJpYnV0ZXNfbGl0ZXJhbCA9IGNvbnRyaWJ1aXNjZQ0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gZXN0ZW5kZQ0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfcmVwbGFjZXNfbGl0ZXJhbCA9IHNvc3RpdHVpc2NlDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbENvbnRyaWJ1dGlvbl9saXRlcmFsID0gbG9jYWxDb250cmlidXRpb24NCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IGxvY2FsUmVwbGFjZW1lbnQNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdG9yX3R5cGUgPSBEZXNjcml0dG9yZSBhcnRlZmF0dG8NCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBEZXNjcml0dG9yZSBjb21wb25lbnRlIGRpc3RyaWJ1aWJpbGUNCi1fVUlfT3V0Y29tZURlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXR0b3JlIHJpc3VsdGF0bw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5famEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2I3ZjFhYy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1wbHVnaW5OYW1lID0gRU1GIFVNQSBFZGl0IFN1cHBvcnQNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0ID0gezB9DQotX1VJX0NyZWF0ZUNoaWxkX3RleHQyID0gezF9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MyA9IHsxfQ0KLV9VSV9DcmVhdGVDaGlsZF90b29sdGlwID0gezF9IFx1NmE1Zlx1ODBmZFx1MzA2ZVx1NGUwYlx1MzA2Ylx1NjViMFx1MzA1N1x1MzA0NCB7MH0gXHUzMDkyXHU3NTFmXHU2MjEwXHUzMDU5XHUzMDhiDQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gXHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmIHsyfSBcdTMwNmUgezF9IFx1NmE1Zlx1ODBmZFx1MzA2Ylx1NWJmZVx1MzA1N1x1MzA2Nlx1MzBiZlx1MzBhNFx1MzBkN1x1MzA0YyB7MH0gXHUzMDZlXHU2NWIwXHUzMDU3XHUzMDQ0XHU1YjUwXHUzMDkyXHU3NTFmXHU2MjEwXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWYgezJ9IFx1MzA2Ylx1NWJmZVx1MzA1N1x1MzAwMVx1ODlhYVx1MzA2ZSB7MX0gXHU2YTVmXHU4MGZkXHUzMDZlXHU0ZTBiXHUzMDZiXHUzMDAxXHUzMGJmXHUzMGE0XHUzMGQ3XHUzMDRjIHswfSBcdTMwNmVcdTY1YjBcdTMwNTdcdTMwNDRcdTUxNDRcdTVmMWZcdTMwOTJcdTc1MWZcdTYyMTBcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gezF9IFx1MzA2ZSB7MH0NCi0NCi1fVUlfQ2xhc3NpZmllcl90eXBlID0gXHU1MjA2XHU5ODVlXHU1YjUwDQotX1VJX1R5cGVfdHlwZSA9IFx1MzBiZlx1MzBhNFx1MzBkNw0KLV9VSV9FbGVtZW50X3R5cGUgPSBcdTg5ODFcdTdkMjANCi1fVUlfTmFtZWRFbGVtZW50X3R5cGUgPSBcdTU0MGRcdTUyNGRcdTRlZDhcdTMwNGRcdTg5ODFcdTdkMjANCi1fVUlfUGFja2FnZWFibGVFbGVtZW50X3R5cGUgPSBcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjhcdTUzZWZcdTgwZmRcdTg5ODFcdTdkMjANCi1fVUlfUGFja2FnZV90eXBlID0gXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4DQotX1VJX05hbWVzcGFjZV90eXBlID0gXHU1NDBkXHU1MjRkXHU3YTdhXHU5NTkzDQotX1VJX01ldGhvZEVsZW1lbnRfdHlwZSA9IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMA0KLV9VSV9Db25zdHJhaW50X3R5cGUgPSBcdTUyMzZcdTdkMDQNCi1fVUlfQ29udGVudEVsZW1lbnRfdHlwZSA9IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1ODk4MVx1N2QyMA0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IFx1OGExOFx1OGZmMFx1NTNlZlx1ODBmZFx1MzA2YVx1ODk4MVx1N2QyMA0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSA9IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA2ZVx1OGFhY1x1NjYwZQ0KLV9VSV9TZWN0aW9uX3R5cGUgPSBcdTMwYmJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjMNCi1fVUlfUm9sZV90eXBlID0gXHUzMGVkXHUzMGZjXHUzMGViDQotX1VJX1dvcmtQcm9kdWN0X3R5cGUgPSBcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzgNCi1fVUlfVGFza190eXBlID0gXHUzMGJmXHUzMGI5XHUzMGFmDQotX1VJX1dvcmtEZWZpbml0aW9uX3R5cGUgPSBcdTRmNWNcdTY5NmRcdTViOWFcdTdmYTkNCi1fVUlfU3RlcF90eXBlID0gXHUzMGI5XHUzMGM2XHUzMGMzXHUzMGQ3DQotX1VJX0d1aWRhbmNlX3R5cGUgPSBcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjkNCi1fVUlfQXJ0aWZhY3RfdHlwZSA9IFx1NjIxMFx1Njc5Y1x1NzI2OQ0KLV9VSV9EZWxpdmVyYWJsZV90eXBlID0gXHU3ZDBkXHU1MTY1XHU3MjY5DQotX1VJX091dGNvbWVfdHlwZSA9IFx1N2Q1MFx1Njc5Yw0KLV9VSV9NZXRob2RQYWNrYWdlX3R5cGUgPSBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjgNCi1fVUlfQ29udGVudFBhY2thZ2VfdHlwZSA9IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzBmYlx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOA0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUgPSBcdTYyMTBcdTY3OWNcdTcyNjlcdTMwNmVcdThhYWNcdTY2MGUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlID0gXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDZlXHU4YWFjXHU2NjBlDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSA9IFx1N2QwZFx1NTE2NVx1NzI2OVx1MzA2ZVx1OGFhY1x1NjYwZQ0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSA9IFx1MzBlZFx1MzBmY1x1MzBlYlx1MzA2ZVx1OGFhY1x1NjYwZQ0KLV9VSV9UYXNrRGVzY3JpcHRpb25fdHlwZSA9IFx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2ZVx1OGFhY1x1NjYwZQ0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUgPSBcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwNmVcdThhYWNcdTY2MGUNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlID0gXHUzMGQ3XHUzMGU5XHUzMGFmXHUzMGM2XHUzMGEzXHUzMGI5XHUzMDZlXHU4YWFjXHU2NjBlDQotX1VJX1BvaW50X3R5cGUgPSBcdTMwZGRcdTMwYTRcdTMwZjNcdTMwYzgNCi1fVUlfR3JhcGhFbGVtZW50X3R5cGUgPSBcdTMwYjBcdTMwZTlcdTMwZDVcdTg5ODFcdTdkMjANCi1fVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSA9IFx1MzBjMFx1MzBhNFx1MzBhMlx1MzBiMFx1MzBlOVx1MzBlMFx1ODk4MVx1N2QyMA0KLV9VSV9EaWFncmFtTGlua190eXBlID0gXHUzMGMwXHUzMGE0XHUzMGEyXHUzMGIwXHUzMGU5XHUzMGUwXHUzMGZiXHUzMGVhXHUzMGYzXHUzMGFmDQotX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUgPSBcdTMwYjBcdTMwZTlcdTMwZDVcdTMwZmJcdTMwYjNcdTMwY2RcdTMwYWZcdTMwYmZcdTMwZmMNCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gXHUzMGJiXHUzMGRlXHUzMGYzXHUzMGM2XHUzMGEzXHUzMGMzXHUzMGFmXHUzMGZiXHUzMGUyXHUzMGM3XHUzMGViXHUzMGZiXHUzMGQ2XHUzMGVhXHUzMGMzXHUzMGI4DQotX1VJX0RpbWVuc2lvbl90eXBlID0gXHUzMGM3XHUzMGEzXHUzMGUxXHUzMGYzXHUzMGI3XHUzMGU3XHUzMGYzDQotX1VJX1JlZmVyZW5jZV90eXBlID0gXHU1M2MyXHU3MTY3DQotX1VJX1Byb3BlcnR5X3R5cGUgPSBcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmMNCi1fVUlfR3JhcGhFZGdlX3R5cGUgPSBcdTMwYjBcdTMwZTlcdTMwZDVcdTMwZmJcdTMwYThcdTMwYzNcdTMwYjgNCi1fVUlfRGlhZ3JhbV90eXBlID0gXHUzMGMwXHUzMGE0XHUzMGEyXHUzMGIwXHUzMGU5XHUzMGUwDQotX1VJX0dyYXBoTm9kZV90eXBlID0gXHUzMGIwXHUzMGU5XHUzMGQ1XHUzMGZiXHUzMGNlXHUzMGZjXHUzMGM5DQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUgPSBcdTUzNThcdTdkMTRcdTMwYmJcdTMwZGVcdTMwZjNcdTMwYzZcdTMwYTNcdTMwYzNcdTMwYWZcdTMwZmJcdTMwZTJcdTMwYzdcdTMwZWJcdTg5ODFcdTdkMjANCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gVU1BIFx1MzBiYlx1MzBkZVx1MzBmM1x1MzBjNlx1MzBhM1x1MzBjM1x1MzBhZlx1MzBmYlx1MzBlMlx1MzBjN1x1MzBlYlx1MzBmYlx1MzBkNlx1MzBlYVx1MzBjM1x1MzBiOA0KLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gXHUzMGIzXHUzMGEyXHUzMGZiXHUzMGJiXHUzMGRlXHUzMGYzXHUzMGM2XHUzMGEzXHUzMGMzXHUzMGFmXHUzMGZiXHUzMGUyXHUzMGM3XHUzMGViXHUzMGZiXHUzMGQ2XHUzMGVhXHUzMGMzXHUzMGI4DQotX1VJX0xlYWZFbGVtZW50X3R5cGUgPSBcdTMwZWFcdTMwZmNcdTMwZDVcdTg5ODFcdTdkMjANCi1fVUlfVGV4dEVsZW1lbnRfdHlwZSA9IFx1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1ODk4MVx1N2QyMA0KLV9VSV9JbWFnZV90eXBlID0gXHU3NTNiXHU1MGNmDQotX1VJX0dyYXBoaWNQcmltaXRpdmVfdHlwZSA9IFx1MzBiMFx1MzBlOVx1MzBkNVx1MzBhM1x1MzBjM1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlYVx1MzBkZlx1MzBjNlx1MzBhM1x1MzBkNg0KLV9VSV9Qb2x5bGluZV90eXBlID0gXHU2Mjk4XHUzMDhjXHU3ZGRhDQotX1VJX0VsbGlwc2VfdHlwZSA9IFx1Njk1NVx1NTE4Ng0KLV9VSV9BY3Rpdml0eV90eXBlID0gXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUgPSBcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDZcdTMwZWNcdTMwZmNcdTMwYWZcdTMwYzBcdTMwYTZcdTMwZjNcdTMwZmJcdTMwYThcdTMwZWNcdTMwZTFcdTMwZjNcdTMwYzgNCi1fVUlfQnJlYWtkb3duRWxlbWVudF90eXBlID0gXHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4DQotX1VJX01pbGVzdG9uZV90eXBlID0gXHUzMGRlXHUzMGE0XHUzMGViXHUzMGI5XHUzMGM4XHUzMGZjXHUzMGYzDQotX1VJX0l0ZXJhdGlvbl90eXBlID0gXHU1M2NkXHU1ZmE5DQotX1VJX1BoYXNlX3R5cGUgPSBcdTMwZDVcdTMwYTdcdTMwZmNcdTMwYmENCi1fVUlfVGVhbVByb2ZpbGVfdHlwZSA9IFx1MzBjMVx1MzBmY1x1MzBlMFx1MzBmYlx1MzBkN1x1MzBlZFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYg0KLV9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlID0gXHUzMGVkXHUzMGZjXHUzMGViXHU4YTE4XHU4ZmYwXHU1YjUwDQotX1VJX1dvcmtPcmRlcl90eXBlID0gXHU0ZjVjXHU2OTZkXHU2MzA3XHU3OTNhXHU2NmY4DQotX1VJX1Byb2Nlc3NFbGVtZW50X3R5cGUgPSBcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTg5ODFcdTdkMjANCi1fVUlfUGxhbm5pbmdEYXRhX3R5cGUgPSBcdThhMDhcdTc1M2JcdTMwYzdcdTMwZmNcdTMwYmYNCi1fVUlfRGVzY3JpcHRvcl90eXBlID0gXHU4YTE4XHU4ZmYwXHU1YjUwDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlID0gXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUgPSBcdTMwYmZcdTMwYjlcdTMwYWZcdThhMThcdThmZjBcdTViNTANCi1fVUlfQ29tcG9zaXRlUm9sZV90eXBlID0gXHUzMGIzXHUzMGYzXHUzMGRkXHUzMGI4XHUzMGMzXHUzMGM4XHUzMGZiXHUzMGVkXHUzMGZjXHUzMGViDQotX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl90eXBlID0gXHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4XHUzMDZlXHU4YWFjXHU2NjBlDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSA9IFx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1OGFhY1x1NjYwZQ0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gXHUzMGM3XHUzMGVhXHUzMGQwXHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZlXHU4YWFjXHU2NjBlDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZlXHU4YWFjXHU2NjBlDQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDZlXHU4YWFjXHU2NjBlDQotX1VJX0NvbmNlcHRfdHlwZSA9IFx1Njk4Mlx1NWZmNQ0KLV9VSV9DaGVja2xpc3RfdHlwZSA9IFx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1MzBlYVx1MzBiOVx1MzBjOA0KLV9VSV9FeGFtcGxlX3R5cGUgPSBcdTRmOGINCi1fVUlfR3VpZGVsaW5lX3R5cGUgPSBcdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjMNCi1fVUlfUmVwb3J0X3R5cGUgPSBcdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzgNCi1fVUlfVGVtcGxhdGVfdHlwZSA9IFx1MzBjNlx1MzBmM1x1MzBkN1x1MzBlY1x1MzBmY1x1MzBjOA0KLV9VSV9TdXBwb3J0aW5nTWF0ZXJpYWxfdHlwZSA9IFx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1OGNjN1x1NjU5OQ0KLV9VSV9Ub29sTWVudG9yX3R5cGUgPSBcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmMNCi1fVUlfV2hpdGVwYXBlcl90eXBlID0gXHUzMGRiXHUzMGVmXHUzMGE0XHUzMGM4XHUzMGZiXHUzMGRhXHUzMGZjXHUzMGQxXHUzMGZjDQotX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUgPSBcdTc1MjhcdThhOWVcdTViOWFcdTdmYTkNCi1fVUlfUHJhY3RpY2VfdHlwZSA9IFx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOQ0KLV9VSV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdHlwZSA9IFx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YVx1ODAwM1x1NjE2ZVx1NGU4Ylx1OTgwNQ0KLV9VSV9SZXVzYWJsZUFzc2V0X3R5cGUgPSBcdTUxOGRcdTUyMjlcdTc1MjhcdTUzZWZcdTgwZmRcdTMwNmFcdTMwYTJcdTMwYmJcdTMwYzNcdTMwYzgNCi1fVUlfU3RhdGVfdHlwZSA9IFx1NzJiNlx1NjE0Yg0KLV9VSV9WZXJ0ZXhfdHlwZSA9IFx1OTgwMlx1NzBiOQ0KLV9VSV9SZWdpb25fdHlwZSA9IFx1OTgxOFx1NTdkZg0KLV9VSV9TdGF0ZU1hY2hpbmVfdHlwZSA9IFx1NzJiNlx1NjE0Ylx1MzBkZVx1MzBiN1x1MzBmMw0KLV9VSV9UcmFuc2l0aW9uX3R5cGUgPSBcdTkwNzdcdTc5ZmINCi1fVUlfUHNldWRvU3RhdGVfdHlwZSA9IFx1NzU5MVx1NGYzY1x1NzJiNlx1NjE0Yg0KLV9VSV9EaXNjaXBsaW5lX3R5cGUgPSBcdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2UNCi1fVUlfQ29udGVudENhdGVnb3J5X3R5cGUgPSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwZmJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmMNCi1fVUlfUm9sZVNldF90eXBlID0gXHUzMGVkXHUzMGZjXHUzMGViXHUzMGZiXHUzMGJiXHUzMGMzXHUzMGM4DQotX1VJX0RvbWFpbl90eXBlID0gXHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzDQotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU5ODVlDQotX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlID0gXHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3DQotX1VJX1Rvb2xfdHlwZSA9IFx1MzBjNFx1MzBmY1x1MzBlYg0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSA9IFx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOFx1MzBmYlx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkNw0KLV9VSV9DdXN0b21DYXRlZ29yeV90eXBlID0gXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlID0gXHUzMGM3XHUzMGVhXHUzMGQwXHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5DQotX1VJX1Byb2Nlc3NfdHlwZSA9IFx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlID0gXHUzMGIxXHUzMGZjXHUzMGQxXHUzMGQzXHUzMGVhXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzDQotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUgPSBcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdThhMDhcdTc1M2JcdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzgNCi1fVUlfUm9hZG1hcF90eXBlID0gXHUzMGVkXHUzMGZjXHUzMGM5XHUzMGRlXHUzMGMzXHUzMGQ3DQotX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSA9IFx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzBmYlx1MzBiM1x1MzBmM1x1MzBkZFx1MzBmY1x1MzBjZFx1MzBmM1x1MzBjOA0KLV9VSV9Qcm9jZXNzUGFja2FnZV90eXBlID0gXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4DQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfdHlwZSA9IFx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzBmYlx1MzBiM1x1MzBmM1x1MzBkZFx1MzBmY1x1MzBjZFx1MzBmM1x1MzBjOFx1MzBmYlx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBkNVx1MzBhN1x1MzBmY1x1MzBiOQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlID0gXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGIzXHUzMGYzXHUzMGRkXHUzMGZjXHUzMGNkXHUzMGYzXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwDQotX1VJX01ldGhvZFBsdWdpbl90eXBlID0gXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzDQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlID0gXHU1OTFhXHU2OWQ4XHU2MDI3XHU4OTgxXHU3ZDIwDQotX1VJX01ldGhvZFVuaXRfdHlwZSA9IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NTM1OFx1NGY0ZA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUgPSBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTANCi1fVUlfUHJvY2Vzc0ZhbWlseV90eXBlID0gXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGRmXHUzMGVhXHUzMGZjDQotX1VJX01ldGhvZExpYnJhcnlfdHlwZSA9IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmYw0KLV9VSV9Vbmtub3duX3R5cGUgPSBcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzgNCi0NCi1fVUlfVW5rbm93bl9kYXRhdHlwZT0gXHU1MDI0DQotDQotX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUgPSBcdTU0MGRcdTUyNGQNCi1fVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUgPSBHdWlkDQotX1VJX01ldGhvZEVsZW1lbnRfYnJpZWZEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHU4OTgxXHU2NWU4DQotX1VJX01ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19mZWF0dXJlID0gXHU2MjQwXHU2NzA5XHUzMDU1XHUzMDhjXHUzMDVmXHUzMGViXHUzMGZjXHUzMGViDQotX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlID0gXHU2MjkxXHU1MjM2DQotX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlID0gXHU2MzA3XHU3OTNhXHU2NmY4XHUzMGFjXHUzMGE0XHUzMGM5DQotX1VJX0NvbnN0cmFpbnRfYm9keV9mZWF0dXJlID0gXHU2NzJjXHU0ZjUzDQotX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IFx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1OGNjN1x1NjU5OQ0KLV9VSV9Db250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19mZWF0dXJlID0gXHU2OTgyXHU1ZmY1XHUzMDY4XHU2NTg3XHU2NmY4DQotX1VJX0NvbnRlbnRFbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSA9IFx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1MzBlYVx1MzBiOVx1MzBjOA0KLV9VSV9Db250ZW50RWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBcdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjMNCi1fVUlfQ29udGVudEVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSA9IFx1NGY4Yg0KLV9VSV9Db250ZW50RWxlbWVudF9hc3NldHNfZmVhdHVyZSA9IFx1MzBhMlx1MzBiYlx1MzBjM1x1MzBjOA0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uTmFtZV9mZWF0dXJlID0gXHU4ODY4XHU3OTNhXHU1NDBkDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fZmVhdHVyZSA9IFx1ODg2OFx1NzkzYQ0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBcdTVmNjJcdTcyYjZcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjMNCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBcdTMwY2VcdTMwZmNcdTMwYzlcdTMwZmJcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjMNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX21haW5EZXNjcmlwdGlvbl9mZWF0dXJlID0gXHU4YWFjXHU2NjBlDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19mZWF0dXJlID0gXHUzMGJiXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9rZXlDb25zaWRlcmF0aW9uc19mZWF0dXJlID0gXHU0ZTNiXHUzMDZhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1DQotX1VJX1NlY3Rpb25fc2VjdGlvbk5hbWVfZmVhdHVyZSA9IFx1MzBiYlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1NTQwZA0KLV9VSV9TZWN0aW9uX3NlY3Rpb25EZXNjcmlwdGlvbl9mZWF0dXJlID0gXHUzMGJiXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU4YWFjXHU2NjBlDQotX1VJX1NlY3Rpb25fc3ViU2VjdGlvbnNfZmVhdHVyZSA9IFx1MzBiNVx1MzBkNlx1MzBiYlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmMw0KLV9VSV9TZWN0aW9uX3ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBcdTUxNDhcdTg4NGNcdTMwYmZcdTMwYjlcdTMwYWYNCi1fVUlfUm9sZV9tb2RpZmllc19mZWF0dXJlID0gXHU1OTA5XHU2NmY0DQotX1VJX1JvbGVfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFx1NjJjNVx1NWY1Mw0KLV9VSV9Xb3JrUHJvZHVjdF9yZXBvcnRzX2ZlYXR1cmUgPSBcdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzgNCi1fVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUgPSBcdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzgNCi1fVUlfV29ya1Byb2R1Y3RfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFx1MzBjNFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBlMVx1MzBmM1x1MzBiZlx1MzBmYw0KLV9VSV9Xb3JrUHJvZHVjdF9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IFx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YVx1ODAwM1x1NjE2ZVx1NGU4Ylx1OTgwNQ0KLV9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBcdTViOWZcdTg4NGNcdTgwMDUNCi1fVUlfVGFza19tYW5kYXRvcnlJbnB1dF9mZWF0dXJlID0gXHU1ZmM1XHU5ODA4XHU1MTY1XHU1MjliDQotX1VJX1Rhc2tfb3V0cHV0X2ZlYXR1cmUgPSBcdTUxZmFcdTUyOWINCi1fVUlfVGFza19hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlID0gXHU4ZmZkXHU1MmEwXHU1YjlmXHU4ODRjXHU4MDA1DQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gXHUzMGFhXHUzMGQ3XHUzMGI3XHUzMGU3XHUzMGYzXHU1MTY1XHU1MjliDQotX1VJX1Rhc2tfc3RlcHNfZmVhdHVyZSA9IFx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkNw0KLV9VSV9UYXNrX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmMNCi1fVUlfVGFza19lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IFx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YVx1ODAwM1x1NjE2ZVx1NGU4Ylx1OTgwNQ0KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wcmVjb25kaXRpb25fZmVhdHVyZSA9IFx1NGU4Ylx1NTI0ZFx1Njc2MVx1NGVmNg0KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX2ZlYXR1cmUgPSBcdTRlOGJcdTVmOGNcdTY3NjFcdTRlZjYNCi1fVUlfQXJ0aWZhY3RfY29udGFpbmVyQXJ0aWZhY3RfZmVhdHVyZSA9IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzBmY1x1NjIxMFx1Njc5Y1x1NzI2OQ0KLV9VSV9BcnRpZmFjdF9jb250YWluZWRBcnRpZmFjdHNfZmVhdHVyZSA9IFx1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA4Ylx1NjIxMFx1Njc5Y1x1NzI2OQ0KLV9VSV9EZWxpdmVyYWJsZV9kZWxpdmVyZWRXb3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1N2QwZFx1NTE2NVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLV9VSV9NZXRob2RQYWNrYWdlX2dsb2JhbF9mZWF0dXJlID0gXHUzMGIwXHUzMGVkXHUzMGZjXHUzMGQwXHUzMGViDQotX1VJX01ldGhvZFBhY2thZ2VfcmV1c2VkUGFja2FnZXNfZmVhdHVyZSA9IFx1NTE4ZFx1NTIyOVx1NzUyOFx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOA0KLV9VSV9NZXRob2RQYWNrYWdlX3BhcmVudFBhY2thZ2VfZmVhdHVyZSA9IFx1ODlhYVx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOA0KLV9VSV9NZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfZmVhdHVyZSA9IFx1NWI1MFx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOA0KLV9VSV9Db250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfZmVhdHVyZSA9IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1ODk4MVx1N2QyMA0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX2JyaWVmT3V0bGluZV9mZWF0dXJlID0gXHU2OTgyXHU4OTgxDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUgPSBcdTg4NjhcdTc5M2FcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjMNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBcdTU5MTZcdTkwZTggSUQNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBcdTc2ZWVcdTc2ODQNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9pbXBhY3RPZk5vdEhhdmluZ19mZWF0dXJlID0gXHUzMDZhXHUzMDQ0XHU1ODM0XHU1NDA4XHUzMDZlXHU1ZjcxXHU5N2ZmDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcmVhc29uc0Zvck5vdE5lZWRpbmdfZmVhdHVyZSA9IFx1NWZjNVx1ODk4MVx1MzA2ZVx1MzA2YVx1MzA0NFx1NzQwNlx1NzUzMQ0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX2V4dGVybmFsRGVzY3JpcHRpb25fZmVhdHVyZSA9IFx1NTkxNlx1OTBlOFx1OGExOFx1OGZmMA0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3BhY2thZ2luZ0d1aWRhbmNlX2ZlYXR1cmUgPSBcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjhcdTUzMTZcdTMwNmVcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjkNCi1fVUlfUm9sZURlc2NyaXB0aW9uX3NraWxsc19mZWF0dXJlID0gXHUzMGI5XHUzMGFkXHUzMGViDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9hc3NpZ25tZW50QXBwcm9hY2hlc19mZWF0dXJlID0gXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2XHU2NWI5XHU2Y2Q1DQotX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlID0gXHU1NDBjXHU3ZmE5XHU4YTllDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBcdTc2ZWVcdTc2ODQNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gXHU0ZWUzXHU2ODQ4DQotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fYXR0YWNobWVudHNfZmVhdHVyZSA9IFx1NmRmYlx1NGVkOA0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUgPSBcdThmZmRcdTUyYTBcdTYwYzVcdTU4MzENCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9wcm9ibGVtX2ZlYXR1cmUgPSBcdTU1NGZcdTk4NGMNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9iYWNrZ3JvdW5kX2ZlYXR1cmUgPSBcdTgwY2NcdTY2NmYNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9nb2Fsc19mZWF0dXJlID0gXHU3NmVlXHU2YTE5DQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYXBwbGljYXRpb25fZmVhdHVyZSA9IFx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmMw0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2xldmVsc09mQWRvcHRpb25fZmVhdHVyZSA9IFx1NjNhMVx1NzUyOFx1MzA2ZVx1MzBlY1x1MzBkOVx1MzBlYg0KLV9VSV9Qb2ludF94X2ZlYXR1cmUgPSBYDQotX1VJX1BvaW50X3lfZmVhdHVyZSA9IFkNCi1fVUlfR3JhcGhFbGVtZW50X3Bvc2l0aW9uX2ZlYXR1cmUgPSBcdTRmNGRcdTdmNmUNCi1fVUlfR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9mZWF0dXJlID0gXHU1NDJiXHUzMDdlXHUzMDhjXHUzMDhiDQotX1VJX0dyYXBoRWxlbWVudF9saW5rX2ZlYXR1cmUgPSBcdTMwZWFcdTMwZjNcdTMwYWYNCi1fVUlfR3JhcGhFbGVtZW50X2FuY2hvcmFnZV9mZWF0dXJlID0gQW5jaG9yYWdlDQotX1VJX0dyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX2ZlYXR1cmUgPSBcdTMwYmJcdTMwZGVcdTMwZjNcdTMwYzZcdTMwYTNcdTMwYzNcdTMwYWZcdTMwZmJcdTMwZTJcdTMwYzdcdTMwZWINCi1fVUlfRGlhZ3JhbUVsZW1lbnRfaXNWaXNpYmxlX2ZlYXR1cmUgPSBcdTUzZWZcdTg5OTYNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfY29udGFpbmVyX2ZlYXR1cmUgPSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwZmMNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUgPSBcdTUzYzJcdTcxNjcNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfZmVhdHVyZSA9IFx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzBmYw0KLV9VSV9EaWFncmFtTGlua196b29tX2ZlYXR1cmUgPSBcdTMwYmFcdTMwZmNcdTMwZTANCi1fVUlfRGlhZ3JhbUxpbmtfdmlld3BvcnRfZmVhdHVyZSA9IFx1ODg2OFx1NzkzYVx1N2E5Mw0KLV9VSV9EaWFncmFtTGlua19ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IFx1MzBiMFx1MzBlOVx1MzBkNVx1ODk4MVx1N2QyMA0KLV9VSV9EaWFncmFtTGlua19kaWFncmFtX2ZlYXR1cmUgPSBcdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTANCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBcdTMwYjBcdTMwZTlcdTMwZDVcdTg5ODFcdTdkMjANCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFZGdlX2ZlYXR1cmUgPSBcdTMwYjBcdTMwZTlcdTMwZDVcdTMwZmJcdTMwYThcdTMwYzNcdTMwYjgNCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9wcmVzZW50YXRpb25fZmVhdHVyZSA9IFx1ODg2OFx1NzkzYQ0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gXHUzMGIwXHUzMGU5XHUzMGQ1XHU4OTgxXHU3ZDIwDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZGlhZ3JhbV9mZWF0dXJlID0gXHUzMGMwXHUzMGE0XHUzMGEyXHUzMGIwXHUzMGU5XHUzMGUwDQotX1VJX0RpbWVuc2lvbl93aWR0aF9mZWF0dXJlID0gXHU1ZTQ1DQotX1VJX0RpbWVuc2lvbl9oZWlnaHRfZmVhdHVyZSA9IFx1OWFkOFx1MzA1NQ0KLV9VSV9SZWZlcmVuY2VfaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb25fZmVhdHVyZSA9IFx1NTAwYlx1MzAwNVx1MzA2ZVx1ODg2OFx1NzkzYQ0KLV9VSV9SZWZlcmVuY2VfcmVmZXJlbmNlZF9mZWF0dXJlID0gXHU1M2MyXHU3MTY3DQotX1VJX1Byb3BlcnR5X2tleV9mZWF0dXJlID0gXHUzMGFkXHUzMGZjDQotX1VJX1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUgPSBcdTUwMjQNCi1fVUlfR3JhcGhFZGdlX2FuY2hvcl9mZWF0dXJlID0gXHUzMGEyXHUzMGYzXHUzMGFiXHUzMGZjDQotX1VJX0dyYXBoRWRnZV93YXlwb2ludHNfZmVhdHVyZSA9IFx1NGUyZFx1OTU5M1x1NzBiOQ0KLV9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSA9IFx1MzBiYVx1MzBmY1x1MzBlMA0KLV9VSV9EaWFncmFtX3ZpZXdwb2ludF9mZWF0dXJlID0gXHU4OTk2XHU3MGI5DQotX1VJX0RpYWdyYW1fZGlhZ3JhbUxpbmtfZmVhdHVyZSA9IFx1MzBjMFx1MzBhNFx1MzBhMlx1MzBiMFx1MzBlOVx1MzBlMFx1MzBmYlx1MzBlYVx1MzBmM1x1MzBhZg0KLV9VSV9EaWFncmFtX25hbWVzcGFjZV9mZWF0dXJlID0gXHU1NDBkXHU1MjRkXHU3YTdhXHU5NTkzDQotX1VJX0dyYXBoTm9kZV9zaXplX2ZlYXR1cmUgPSBcdTMwYjVcdTMwYTRcdTMwYmENCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZUluZm9fZmVhdHVyZSA9IFx1MzBiZlx1MzBhNFx1MzBkN1x1NjBjNVx1NTgzMQ0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IFx1ODk4MVx1N2QyMA0KLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUgPSBcdTg5ODFcdTdkMjANCi1fVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlID0gXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4DQotX1VJX0ltYWdlX3VyaV9mZWF0dXJlID0gVVJJDQotX1VJX0ltYWdlX21pbWVUeXBlX2ZlYXR1cmUgPSBNSU1FIFx1MzBiZlx1MzBhNFx1MzBkNw0KLV9VSV9Qb2x5bGluZV9jbG9zZWRfZmVhdHVyZSA9IFx1MzBhZlx1MzBlZFx1MzBmY1x1MzBiYQ0KLV9VSV9Qb2x5bGluZV93YXlwb2ludHNfZmVhdHVyZSA9IFx1NGUyZFx1OTU5M1x1NzBiOQ0KLV9VSV9FbGxpcHNlX3JhZGl1c1hfZmVhdHVyZSA9IFx1NTM0YVx1NWY4NCBYDQotX1VJX0VsbGlwc2VfcmFkaXVzWV9mZWF0dXJlID0gXHU1MzRhXHU1Zjg0IFkNCi1fVUlfRWxsaXBzZV9yb3RhdGlvbl9mZWF0dXJlID0gXHU1NmRlXHU4ZWUyDQotX1VJX0VsbGlwc2Vfc3RhcnRBbmdsZV9mZWF0dXJlID0gXHU5NThiXHU1OWNiXHU4OWQyXHU1ZWE2DQotX1VJX0VsbGlwc2VfZW5kQW5nbGVfZmVhdHVyZSA9IFx1N2Q0Mlx1NGU4Nlx1ODlkMlx1NWVhNg0KLV9VSV9FbGxpcHNlX2NlbnRlcl9mZWF0dXJlID0gXHU0ZTJkXHU1ZmMzDQotX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUgPSBcdTMwZDZcdTMwZWNcdTMwZmNcdTMwYWZcdTMwYzBcdTMwYTZcdTMwZjNcdTMwZmJcdTMwYThcdTMwZWNcdTMwZTFcdTMwZjNcdTMwYzgNCi1fVUlfQWN0aXZpdHlfcm9hZG1hcHNfZmVhdHVyZSA9IFx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkNw0KLV9VSV9BY3Rpdml0eV9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUgPSBcdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzhcdThjYzdcdTY1OTkNCi1fVUlfQWN0aXZpdHlfY2hlY2tsaXN0c19mZWF0dXJlID0gXHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMGVhXHUzMGI5XHUzMGM4DQotX1VJX0FjdGl2aXR5X2NvbmNlcHRzX2ZlYXR1cmUgPSBcdTY5ODJcdTVmZjUNCi1fVUlfQWN0aXZpdHlfZXhhbXBsZXNfZmVhdHVyZSA9IFx1NGY4Yg0KLV9VSV9BY3Rpdml0eV9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBcdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjMNCi1fVUlfQWN0aXZpdHlfcmV1c2FibGVBc3NldHNfZmVhdHVyZSA9IFx1NTE4ZFx1NTIyOVx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2YVx1MzBhMlx1MzBiYlx1MzBjM1x1MzBjOA0KLV9VSV9BY3Rpdml0eV9pc0VuYWN0YWJsZV9mZWF0dXJlID0gXHU1YjlmXHU4ODRjXHU1M2VmXHU4MGZkDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzUmVwZWF0YWJsZV9mZWF0dXJlID0gXHU1M2NkXHU1ZmE5XHU1M2VmXHU4MGZkDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzT25nb2luZ19mZWF0dXJlID0gXHU5MDMyXHU4ODRjXHU0ZTJkDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzRXZlbnREcml2ZW5fZmVhdHVyZSA9IFx1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1OTljNlx1NTJkNQ0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9saW5rVG9QcmVkZWNlc3Nvcl9mZWF0dXJlID0gXHU1MTQ4XHU4ODRjXHUzMGJmXHUzMGI5XHUzMGFmXHUzMDc4XHUzMDZlXHUzMGVhXHUzMGYzXHUzMGFmDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlZml4X2ZlYXR1cmUgPSBcdTMwZDdcdTMwZWNcdTMwZDVcdTMwYTNcdTMwYzNcdTMwYWZcdTMwYjkNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc1BsYW5uZWRfZmVhdHVyZSA9IFx1OGEwOFx1NzUzYlx1NmUwOFx1MzA3Zg0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2hhc011bHRpcGxlT2NjdXJyZW5jZXNfZmVhdHVyZSA9IFx1ODkwN1x1NjU3MFx1MzA2ZVx1NTFmYVx1NzNmZQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzT3B0aW9uYWxfZmVhdHVyZSA9IFx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmMw0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEFmdGVyX2ZlYXR1cmUgPSBcdTUyNGRcdTMwNmJcdTg4NjhcdTc5M2ENCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRCZWZvcmVfZmVhdHVyZSA9IFx1NWY4Y1x1MzA2Ylx1ODg2OFx1NzkzYQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9mZWF0dXJlID0gXHU4YTA4XHU3NTNiXHUzMGM3XHUzMGZjXHUzMGJmDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwZXJBY3Rpdml0aWVzX2ZlYXR1cmUgPSBcdTMwYjlcdTMwZmNcdTMwZDFcdTMwZmNcdTMwZmJcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmMNCi1fVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUgPSBcdTMwYzFcdTMwZmNcdTMwZTBcdTMwZmJcdTMwZWRcdTMwZmNcdTMwZWINCi1fVUlfVGVhbVByb2ZpbGVfc3VwZXJUZWFtX2ZlYXR1cmUgPSBcdTMwYjlcdTMwZmNcdTMwZDFcdTMwZmNcdTMwZmJcdTMwYzFcdTMwZmNcdTMwZTANCi1fVUlfVGVhbVByb2ZpbGVfc3ViVGVhbV9mZWF0dXJlID0gXHUzMGI1XHUzMGQ2XHUzMGMxXHUzMGZjXHUzMGUwDQotX1VJX1JvbGVEZXNjcmlwdG9yX1JvbGVfZmVhdHVyZSA9IFx1MzBlZFx1MzBmY1x1MzBlYg0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlID0gXHU1OTA5XHU2NmY0DQotX1VJX1JvbGVEZXNjcmlwdG9yX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUgPSBcdTYyYzVcdTVmNTMNCi1fVUlfV29ya09yZGVyX2xpbmtUeXBlX2ZlYXR1cmUgPSBcdTMwZWFcdTMwZjNcdTMwYWZcdTMwZmJcdTMwYmZcdTMwYTRcdTMwZDcNCi1fVUlfV29ya09yZGVyX3ByZWRfZmVhdHVyZSA9IFByZWQNCi1fVUlfUGxhbm5pbmdEYXRhX3N0YXJ0RGF0ZV9mZWF0dXJlID0gXHU5NThiXHU1OWNiXHU2NWU1DQotX1VJX1BsYW5uaW5nRGF0YV9maW5pc2hEYXRlX2ZlYXR1cmUgPSBcdTdkNDJcdTRlODZcdTY1ZTUNCi1fVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSA9IFx1MzBlOVx1MzBmM1x1MzBhZg0KLV9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlID0gXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDY4XHU1NDBjXHU2NzFmDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUVudHJ5U3RhdGVfZmVhdHVyZSA9IFx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1OTU4Ylx1NTljYlx1NzJiNlx1NjE0Yg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFeGl0U3RhdGVfZmVhdHVyZSA9IFx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1N2Q0Mlx1NGU4Nlx1NzJiNlx1NjE0Yg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3RfZmVhdHVyZSA9IFx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0ZWRCeV9mZWF0dXJlID0gXHU1ZjcxXHU5N2ZmXHU1MTQzDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RzX2ZlYXR1cmUgPSBcdTVmNzFcdTk3ZmZcdTUxNDgNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2RlbGl2ZXJhYmxlUGFydHNfZmVhdHVyZSA9IFx1N2QwZFx1NTE2NVx1NzI2OQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUgPSBcdTMwYmZcdTMwYjlcdTMwYWYNCi1fVUlfVGFza0Rlc2NyaXB0b3JfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSA9IDIgXHU2YjIxXHU1YjlmXHU4ODRjXHU4MDA1DQotX1VJX1Rhc2tEZXNjcmlwdG9yX2Fzc2lzdGVkQnlfZmVhdHVyZSA9IFx1NjUyZlx1NjNmNFx1ODAwNQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUgPSBcdTU5MTZcdTkwZThcdTUxNjVcdTUyOWINCi1fVUlfVGFza0Rlc2NyaXB0b3JfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IFx1NWZjNVx1OTgwOFx1NTE2NVx1NTI5Yg0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTUxNjVcdTUyOWINCi1fVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUgPSBcdTUxZmFcdTUyOWINCi1fVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSA9IFx1NTdmYVx1NjcyY1x1NWI5Zlx1ODg0Y1x1ODAwNQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9zZWxlY3RlZFN0ZXBzX2ZlYXR1cmUgPSBcdTkwNzhcdTYyOWVcdTZlMDhcdTMwN2ZcdTMwYjlcdTMwYzZcdTMwYzNcdTMwZDcNCi1fVUlfQ29tcG9zaXRlUm9sZV9hZ2dyZWdhdGVkUm9sZXNfZmVhdHVyZSA9IFx1OTZjNlx1N2QwNFx1MzBlZFx1MzBmY1x1MzBlYg0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlID0gXHU0ZjdmXHU3NTI4XHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5DQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gXHU3NmVlXHU3Njg0DQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBcdTRlZTNcdTY4NDgNCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUgPSBcdTMwY2ZcdTMwYTZcdTMwYzRcdTMwZmNcdTMwZmJcdTMwYjlcdTMwYmZcdTMwYzNcdTMwZDUNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSA9IFx1MzBiOVx1MzBiMVx1MzBmY1x1MzBlYg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzX2ZlYXR1cmUgPSBcdTMwZDdcdTMwZWRcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTMwNmVcdTcyNzlcdTYwMjcNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcmlza0xldmVsX2ZlYXR1cmUgPSBcdTMwZWFcdTMwYjlcdTMwYWZcdTMwZmJcdTMwZWNcdTMwZDlcdTMwZWINCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fZXN0aW1hdGluZ1RlY2huaXF1ZV9mZWF0dXJlID0gXHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHU2MjRiXHU2Y2Q1DQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IFx1MzBkN1x1MzBlZFx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOFx1MzBmYlx1MzBlMVx1MzBmM1x1MzBkMFx1MzBmY1x1MzA2ZVx1NWMwMlx1OTU4MFx1NzdlNVx1OGI1OA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gXHU1OTUxXHU3ZDA0XHUzMDZlXHUzMGJmXHUzMGE0XHUzMGQ3DQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBcdTU5MTZcdTkwZTggSUQNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3Njb3BlX2ZlYXR1cmUgPSBcdTMwYjlcdTMwYjNcdTMwZmNcdTMwZDcNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3VzYWdlTm90ZXNfZmVhdHVyZSA9IFx1NGY3Zlx1NzUyOFx1NGUwYVx1MzA2ZVx1NmNlOFx1NjEwZg0KLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fcmVmaW5lZERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdThhNzNcdTdkMzBcdThhYWNcdTY2MGUNCi1fVUlfUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX2ZlYXR1cmUgPSBcdTMwYjVcdTMwZDZcdTMwZDdcdTMwZTlcdTMwYWZcdTMwYzZcdTMwYTNcdTMwYjkNCi1fVUlfUHJhY3RpY2VfY29udGVudFJlZmVyZW5jZXNfZmVhdHVyZSA9IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1NTNjMlx1NzE2Nw0KLV9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSA9IFx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1NTNjMlx1NzE2Nw0KLV9VSV9TdGF0ZV9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotX1VJX1N0YXRlX1JlZ2lvbl9mZWF0dXJlID0gXHU5ODE4XHU1N2RmDQotX1VJX1N0YXRlX3N1Ym1hY2hpbmVfZmVhdHVyZSA9IFx1MzBiNVx1MzBkNlx1MzBkZVx1MzBiN1x1MzBmMw0KLV9VSV9WZXJ0ZXhfY29udGFpbmVyX2ZlYXR1cmUgPSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwZmMNCi1fVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUgPSBcdTc2N2FcdTRmZTENCi1fVUlfVmVydGV4X2luY29taW5nX2ZlYXR1cmUgPSBcdTc3NDBcdTRmZTENCi1fVUlfUmVnaW9uX1ZlcnRleF9mZWF0dXJlID0gXHU5ODAyXHU3MGI5DQotX1VJX1JlZ2lvbl9UcmFuc2l0aW9uX2ZlYXR1cmUgPSBcdTkwNzdcdTc5ZmINCi1fVUlfUmVnaW9uX1N0YXRlX2ZlYXR1cmUgPSBcdTcyYjZcdTYxNGINCi1fVUlfUmVnaW9uX1N0YXRlTWFjaGluZV9mZWF0dXJlID0gXHU3MmI2XHU2MTRiXHUzMGRlXHUzMGI3XHUzMGYzDQotX1VJX1N0YXRlTWFjaGluZV9SZWdpb25fZmVhdHVyZSA9IFx1OTgxOFx1NTdkZg0KLV9VSV9UcmFuc2l0aW9uX1dvcmtEZWZpbml0aW9uX2ZlYXR1cmUgPSBcdTRmNWNcdTY5NmRcdTViOWFcdTdmYTkNCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzBmYw0KLV9VSV9UcmFuc2l0aW9uX3NvdXJjZV9mZWF0dXJlID0gXHUzMGJkXHUzMGZjXHUzMGI5DQotX1VJX1RyYW5zaXRpb25fdGFyZ2V0X2ZlYXR1cmUgPSBcdTMwYmZcdTMwZmNcdTMwYjJcdTMwYzNcdTMwYzgNCi1fVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlID0gXHUzMGJmXHUzMGI5XHUzMGFmDQotX1VJX0Rpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9mZWF0dXJlID0gXHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlXHUzMDZlXHU0ZTBiXHU0ZjRkXHU1MzNhXHU1MjA2DQotX1VJX0Rpc2NpcGxpbmVfcmVmZXJlbmNlV29ya2Zsb3dzX2ZlYXR1cmUgPSBcdTUzYzJcdTcxNjdcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZDVcdTMwZWRcdTMwZmMNCi1fVUlfUm9sZVNldF9yb2xlc19mZWF0dXJlID0gXHUzMGVkXHUzMGZjXHUzMGViDQotX1VJX0RvbWFpbl93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLV9VSV9Eb21haW5fc3ViZG9tYWluc19mZWF0dXJlID0gXHUzMGI1XHUzMGQ2XHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzDQotX1VJX1dvcmtQcm9kdWN0VHlwZV93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IFx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZQ0KLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmMNCi1fVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUgPSBcdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzgNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlID0gXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHU1MzE2XHU4OTgxXHU3ZDIwDQotX1VJX0N1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfZmVhdHVyZSA9IFx1MzBiNVx1MzBkNlx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmYw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUgPSBcdTY1NTlcdTgwYjJcdThjYzdcdTY1OTkNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBcdTMwYjNcdTMwZGZcdTMwZTVcdTMwY2JcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdThjYzdcdTY1OTkNCi1fVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUgPSBcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjNcdTMwOTJcdTU0MmJcdTMwODANCi1fVUlfUHJvY2Vzc19kZWZhdWx0Q29udGV4dF9mZWF0dXJlID0gXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4DQotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBcdTY3MDlcdTUyYjlcdTMwNmFcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzgNCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlID0gXHU1N2ZhXHU2NzJjXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5DQotX1VJX1Byb2Nlc3NDb21wb25lbnRfaW50ZXJmYWNlc19mZWF0dXJlID0gXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5DQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5DQotX1VJX1Byb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19mZWF0dXJlID0gXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU4OTgxXHU3ZDIwDQotX1VJX1Byb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX2ZlYXR1cmUgPSBcdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTANCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19mZWF0dXJlID0gXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5XHU0ZWQ1XHU2OWQ4DQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fZmVhdHVyZSA9IFx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBkNVx1MzBhN1x1MzBmY1x1MzBiOSBJTw0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUgPSBcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwZGRcdTMwZmNcdTMwY2RcdTMwZjNcdTMwYzgNCi1fVUlfTWV0aG9kUGx1Z2luX3VzZXJDaGFuZ2VhYmxlX2ZlYXR1cmUgPSBcdTMwZTZcdTMwZmNcdTMwYjZcdTMwZmNcdTU5MDlcdTY2ZjRcdTUzZWZcdTgwZmQNCi1fVUlfTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX2ZlYXR1cmUgPSBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjgNCi1fVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUgPSBcdTMwZDlcdTMwZmNcdTMwYjkNCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlID0gXHU1M2VmXHU1OTA5XHU2MDI3XHUzMDZlXHUzMGJmXHUzMGE0XHUzMGQ3DQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBcdTg5ODFcdTdkMjBcdTMwNmJcdTU3ZmFcdTMwNjVcdTMwNGZcdTU5MWFcdTY5ZDhcdTYwMjcNCi1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBcdTRmNWNcdTYyMTBcdTgwMDUNCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUgPSBcdTU5MDlcdTY2ZjRcdTY1ZTUNCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHU1OTA5XHU2NmY0XHUzMDZlXHU4YWFjXHU2NjBlDQotX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlID0gXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzDQotX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUgPSBcdTg0NTdcdTRmNWNcdTZhMjlcdTY1ODcNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSA9IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1OTA3OFx1NjI5ZQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBhY2thZ2VTZWxlY3Rpb25fZmVhdHVyZSA9IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOFx1OTA3OFx1NjI5ZQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlID0gXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGQzXHUzMGU1XHUzMGZjDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fZGVmYXVsdFZpZXdfZmVhdHVyZSA9IFx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzBmYlx1MzBkM1x1MzBlNVx1MzBmYw0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gXHU1N2ZhXHU2NzJjXHU2OWNiXHU2MjEwDQotX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSA9IFx1MzBjN1x1MzBlYVx1MzBkMFx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOQ0KLV9VSV9NZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfZmVhdHVyZSA9IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmMw0KLV9VSV9NZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19mZWF0dXJlID0gXHU0ZThiXHU1MjRkXHU1YjlhXHU3ZmE5XHU2OWNiXHU2MjEwDQotX1VJX1Vua25vd25fZmVhdHVyZSA9IFx1NjcyYVx1NjMwN1x1NWI5YQ0KLQ0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvU3RhcnRfbGl0ZXJhbCA9IGZpbmlzaFRvU3RhcnQNCi1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb0ZpbmlzaF9saXRlcmFsID0gZmluaXNoVG9GaW5pc2gNCi1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvU3RhcnRfbGl0ZXJhbCA9IHN0YXJ0VG9TdGFydA0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9GaW5pc2hfbGl0ZXJhbCA9IHN0YXJ0VG9GaW5pc2gNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2luaXRpYWxfbGl0ZXJhbCA9IFx1OTU4Ylx1NTljYlx1NzJiNlx1NjE0Yg0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gXHU3ZDUwXHU1NDA4DQotX1VJX1BzZXVkb1N0YXRlS2luZF9mb3JrX2xpdGVyYWwgPSBcdTMwZDVcdTMwYTlcdTMwZmNcdTMwYWYNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBcdTYzYTVcdTU0MDgNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2Nob2ljZV9saXRlcmFsID0gXHU5MDc4XHU2MjllDQotX1VJX1BzZXVkb1N0YXRlS2luZF9lbnRyeVBvaW50X2xpdGVyYWwgPSBcdTUxNjVcdTMwOGFcdTUzZTNcdTcwYjkNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gXHU1MWZhXHU1M2UzXHU3MGI5DQotX1VJX1BzZXVkb1N0YXRlS2luZF90ZXJtaW5hdGVfbGl0ZXJhbCA9IFx1NTA1Y1x1NmI2Mg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbmFfbGl0ZXJhbCA9IG5hDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9jb250cmlidXRlc19saXRlcmFsID0gXHU1YmM0XHU0ZTBlXHUzMDU5XHUzMDhiDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9leHRlbmRzX2xpdGVyYWwgPSBcdTYyZTFcdTVmMzVcdTMwNTlcdTMwOGINCi1fVUlfVmFyaWFiaWxpdHlUeXBlX3JlcGxhY2VzX2xpdGVyYWwgPSBcdTdmNmVcdTYzZGJcdTMwNTlcdTMwOGINCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsQ29udHJpYnV0aW9uX2xpdGVyYWwgPSBcdTMwZWRcdTMwZmNcdTMwYWJcdTMwZWJcdTViYzRcdTRlMGUNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IFx1MzBlZFx1MzBmY1x1MzBhYlx1MzBlYlx1N2Y2ZVx1NjNkYg0KLV9VSV9BcnRpZmFjdERlc2NyaXB0b3JfdHlwZSA9IFx1NjIxMFx1Njc5Y1x1NzI2OVx1MzA2ZVx1OGExOFx1OGZmMFx1NWI1MA0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0b3JfdHlwZSA9IFx1N2QwZFx1NTE2NVx1NzI2OVx1MzA2ZVx1OGExOFx1OGZmMFx1NWI1MA0KLV9VSV9PdXRjb21lRGVzY3JpcHRvcl90eXBlID0gXHU3ZDUwXHU2NzljXHUzMDZlXHU4YTE4XHU4ZmYwXHU1YjUwDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDIwMDBmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLXBsdWdpbk5hbWUgPSBFTUYgVU1BIFx1ZDNiOFx1YzlkMSBcdWM5YzBcdWM2ZDANCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0ID0gezB9DQotX1VJX0NyZWF0ZUNoaWxkX3RleHQyID0gezF9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MyA9IHsxfQ0KLV9VSV9DcmVhdGVDaGlsZF90b29sdGlwID0gXHVjMGM4IHswfVx1Yzc0NChcdWI5N2MpIHsxfSBcdWFlMzBcdWIyYTUgXHVjNTQ0XHViNzk4XHVjNWQwIFx1Yzc5MVx1YzEzMQ0KLV9VSV9DcmVhdGVDaGlsZF9kZXNjcmlwdGlvbiA9IFx1YzEyMFx1ZDBkZFx1YjQxYyB7Mn1cdWM3NTggezF9IFx1YWUzMFx1YjJhNVx1YzVkMCBcdWIzMDBcdWQ1NWMgezB9IFx1YzcyMFx1ZDYxNVx1Yzc1OCBcdWMwYzggXHVkNTU4XHVjNzA0XHViOTdjIFx1Yzc5MVx1YzEzMVx1ZDU2OVx1YjJjOFx1YjJlNC4NCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IFx1YzEyMFx1ZDBkZFx1YjQxYyB7Mn1cdWM1ZDAgXHViMzAwXHVkNTVjIHswfSBcdWM3MjBcdWQ2MTVcdWM3NTggXHVjMGM4IFx1YjNkOVx1YzcwNFx1Yjk3YyBcdWMwYzFcdWM3MDRcdWM3NTggezF9IFx1YWUzMFx1YjJhNSBcdWM1NDRcdWI3OThcdWM1ZDAgXHVjNzkxXHVjMTMxXHVkNTY5XHViMmM4XHViMmU0Lg0KLQ0KLV9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSB7MX1cdWM3NTggezB9DQotDQotX1VJX0NsYXNzaWZpZXJfdHlwZSA9IFx1ZDA3NFx1Yjc5OFx1YzJhNFx1Yjk1OA0KLV9VSV9UeXBlX3R5cGUgPSBcdWM3MjBcdWQ2MTUNCi1fVUlfRWxlbWVudF90eXBlID0gXHVjNjk0XHVjMThjDQotX1VJX05hbWVkRWxlbWVudF90eXBlID0gXHVjNzc0XHViOTg0IFx1YzljMFx1YzgxNVx1YjQxYyBcdWM2OTRcdWMxOGMNCi1fVUlfUGFja2FnZWFibGVFbGVtZW50X3R5cGUgPSBcdWQzMjhcdWQwYTRcdWM5YzAgXHVhYzAwXHViMmE1XHVkNTVjIFx1YzY5NFx1YzE4Yw0KLV9VSV9QYWNrYWdlX3R5cGUgPSBcdWQzMjhcdWQwYTRcdWM5YzANCi1fVUlfTmFtZXNwYWNlX3R5cGUgPSBcdWM3NzRcdWI5ODQgXHVhY2Y1XHVhYzA0DQotX1VJX01ldGhvZEVsZW1lbnRfdHlwZSA9IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWM2OTRcdWMxOGMNCi1fVUlfQ29uc3RyYWludF90eXBlID0gXHVjODFjXHVkNTVjXHVjODcwXHVhYzc0DQotX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUgPSBcdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlID0gXHVjMTI0XHViYTg1IFx1YzY5NFx1YzE4Yw0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSA9IFx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWMxMjRcdWJhODUNCi1fVUlfU2VjdGlvbl90eXBlID0gXHVjMTM5XHVjMTU4DQotX1VJX1JvbGVfdHlwZSA9IFx1YzVlZFx1ZDU2MA0KLV9VSV9Xb3JrUHJvZHVjdF90eXBlID0gXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLV9VSV9UYXNrX3R5cGUgPSBcdWQwYzBcdWMyYTRcdWQwNmMNCi1fVUlfV29ya0RlZmluaXRpb25fdHlwZSA9IFx1Yzc5MVx1YzVjNSBcdWM4MTVcdWM3NTgNCi1fVUlfU3RlcF90eXBlID0gXHViMmU4XHVhY2M0DQotX1VJX0d1aWRhbmNlX3R5cGUgPSBcdWM1NDhcdWIwYjQNCi1fVUlfQXJ0aWZhY3RfdHlwZSA9IFx1YzU0NFx1ZDJmMFx1ZDMyOVx1ZDJiOA0KLV9VSV9EZWxpdmVyYWJsZV90eXBlID0gXHVjNzc4XHViM2M0XHViYjNjDQotX1VJX091dGNvbWVfdHlwZSA9IFx1YWNiMFx1YWNmY1x1YmIzYw0KLV9VSV9NZXRob2RQYWNrYWdlX3R5cGUgPSBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkMzI4XHVkMGE0XHVjOWMwDQotX1VJX0NvbnRlbnRQYWNrYWdlX3R5cGUgPSBcdWNlZThcdWQxNTBcdWNlMjAgXHVkMzI4XHVkMGE0XHVjOWMwDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSA9IFx1YzU0NFx1ZDJmMFx1ZDMyOVx1ZDJiOCBcdWMxMjRcdWJhODUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlID0gXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWMxMjRcdWJhODUNCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl90eXBlID0gXHVjNzc4XHViM2M0XHViYjNjIFx1YzEyNFx1YmE4NQ0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSA9IFx1YzVlZFx1ZDU2MCBcdWMxMjRcdWJhODUNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3R5cGUgPSBcdWQwYzBcdWMyYTRcdWQwNmMgXHVjMTI0XHViYTg1DQotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fdHlwZSA9IFx1YzU0OFx1YjBiNCBcdWMxMjRcdWJhODUNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlID0gXHVjMGFjXHViODQwIFx1YzEyNFx1YmE4NQ0KLV9VSV9Qb2ludF90eXBlID0gXHVjOWMwXHVjODEwDQotX1VJX0dyYXBoRWxlbWVudF90eXBlID0gXHVhZGY4XHViNzk4XHVkNTA0IFx1YzY5NFx1YzE4Yw0KLV9VSV9EaWFncmFtRWxlbWVudF90eXBlID0gXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1YzY5NFx1YzE4Yw0KLV9VSV9EaWFncmFtTGlua190eXBlID0gXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1YjljMVx1ZDA2Yw0KLV9VSV9HcmFwaENvbm5lY3Rvcl90eXBlID0gXHVhZGY4XHViNzk4XHVkNTA0IFx1Y2VlNFx1YjEyNVx1ZDEzMA0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBcdWMyZGNcdWI5ZThcdWQyZjEgXHViYWE4XHViMzc4IFx1YmUwY1x1YjliZlx1YzljMA0KLV9VSV9EaW1lbnNpb25fdHlwZSA9IFx1Y2MyOFx1YzZkMA0KLV9VSV9SZWZlcmVuY2VfdHlwZSA9IFx1Y2MzOFx1Yzg3MA0KLV9VSV9Qcm9wZXJ0eV90eXBlID0gXHVkMmI5XHVjMTMxDQotX1VJX0dyYXBoRWRnZV90eXBlID0gXHVhZGY4XHViNzk4XHVkNTA0IFx1YzVkMFx1YzljMA0KLV9VSV9EaWFncmFtX3R5cGUgPSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTgNCi1fVUlfR3JhcGhOb2RlX3R5cGUgPSBcdWFkZjhcdWI3OThcdWQ1MDQgXHViMTc4XHViNGRjDQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUgPSBcdWIyZThcdWMyMWMgXHVjMmRjXHViOWU4XHVkMmYxIFx1YmFhOFx1YjM3OCBcdWM2OTRcdWMxOGMNCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gVU1BIFx1YzJkY1x1YjllOFx1ZDJmMSBcdWJhYThcdWIzNzggXHViZTBjXHViOWJmXHVjOWMwDQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBcdWNmNTRcdWM1YjQgXHVjMmRjXHViOWU4XHVkMmYxIFx1YmFhOFx1YjM3OCBcdWJlMGNcdWI5YmZcdWM5YzANCi1fVUlfTGVhZkVsZW1lbnRfdHlwZSA9IFx1YjlhY1x1ZDUwNCBcdWM2OTRcdWMxOGMNCi1fVUlfVGV4dEVsZW1lbnRfdHlwZSA9IFx1ZDE0ZFx1YzJhNFx1ZDJiOCBcdWM2OTRcdWMxOGMNCi1fVUlfSW1hZ2VfdHlwZSA9IFx1Yzc3NFx1YmJmOFx1YzljMA0KLV9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUgPSBcdWFkZjhcdWI3OThcdWQ1M2QgXHVhZTMwXHViY2Y4XHVjNjk0XHVjMThjDQotX1VJX1BvbHlsaW5lX3R5cGUgPSBcdWQzZjRcdWI5YWNcdWI3N2NcdWM3NzgNCi1fVUlfRWxsaXBzZV90eXBlID0gXHVkMGMwXHVjNmQwDQotX1VJX0FjdGl2aXR5X3R5cGUgPSBcdWQ2NWNcdWIzZDkNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IFx1Yzc5MVx1YzVjNVx1YmQ4NFx1Yjk1OCBcdWM2OTRcdWMxOGMoV29yayBCcmVha2Rvd24gRWxlbWVudCkNCi1fVUlfQnJlYWtkb3duRWxlbWVudF90eXBlID0gXHVjNzkxXHVjNWM1XHViZDg0XHViOTU4IFx1YzY5NFx1YzE4YyhCcmVha2Rvd24gRWxlbWVudCkNCi1fVUlfTWlsZXN0b25lX3R5cGUgPSBcdWM3NzRcdWM4MTVcdWQ0NWMNCi1fVUlfSXRlcmF0aW9uX3R5cGUgPSBcdWJjMThcdWJjZjUNCi1fVUlfUGhhc2VfdHlwZSA9IFx1YjJlOFx1YWNjNA0KLV9VSV9UZWFtUHJvZmlsZV90eXBlID0gXHVkMzAwIFx1ZDUwNFx1Yjg1Y1x1ZDMwY1x1Yzc3Yw0KLV9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlID0gXHVjNWVkXHVkNTYwIFx1YzEyNFx1YmE4NVx1Yzc5MA0KLV9VSV9Xb3JrT3JkZXJfdHlwZSA9IFx1Yzc5MVx1YzVjNSBcdWM5YzBcdWMyZGMNCi1fVUlfUHJvY2Vzc0VsZW1lbnRfdHlwZSA9IFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWM2OTRcdWMxOGMNCi1fVUlfUGxhbm5pbmdEYXRhX3R5cGUgPSBcdWFjYzRcdWQ2OGQgXHViMzcwXHVjNzc0XHVkMTMwDQotX1VJX0Rlc2NyaXB0b3JfdHlwZSA9IFx1YzEyNFx1YmE4NVx1Yzc5MA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSA9IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjMTI0XHViYTg1XHVjNzkwDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUgPSBcdWQwYzBcdWMyYTRcdWQwNmMgXHVjMTI0XHViYTg1XHVjNzkwDQotX1VJX0NvbXBvc2l0ZVJvbGVfdHlwZSA9IFx1Y2VmNFx1ZDNlY1x1YzljMFx1ZDJiOCBcdWM1ZWRcdWQ1NjANCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3R5cGUgPSBcdWM3OTFcdWM1YzVcdWJkODRcdWI5NTggXHVjNjk0XHVjMThjIFx1YzEyNFx1YmE4NShCcmVha2Rvd24gRWxlbWVudCkNCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlID0gXHVkNjVjXHViM2Q5IFx1YzEyNFx1YmE4NQ0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gXHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWMxMjRcdWJhODUNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVjMTI0XHViYTg1DQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gXHVjMTI0XHViYTg1XHVjNzkwIFx1YzEyNFx1YmE4NQ0KLV9VSV9Db25jZXB0X3R5cGUgPSBcdWFjMWNcdWIxNTANCi1fVUlfQ2hlY2tsaXN0X3R5cGUgPSBcdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjgNCi1fVUlfRXhhbXBsZV90eXBlID0gXHVjNjA4XHVjODFjDQotX1VJX0d1aWRlbGluZV90eXBlID0gXHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4DQotX1VJX1JlcG9ydF90eXBlID0gXHViY2Y0XHVhY2UwXHVjMTFjDQotX1VJX1RlbXBsYXRlX3R5cGUgPSBcdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjgNCi1fVUlfU3VwcG9ydGluZ01hdGVyaWFsX3R5cGUgPSBcdWM5YzBcdWM2ZDAgXHVjNzkwXHViOGNjDQotX1VJX1Rvb2xNZW50b3JfdHlwZSA9IFx1YjNjNFx1YWQ2YyBcdWMwYWNcdWM2YTkgXHViM2M0XHVjNmMwXHViOWQwDQotX1VJX1doaXRlcGFwZXJfdHlwZSA9IFx1YmMzMVx1YzExYw0KLV9VSV9UZXJtRGVmaW5pdGlvbl90eXBlID0gXHVjNmE5XHVjNWI0IFx1YzgxNVx1Yzc1OA0KLV9VSV9QcmFjdGljZV90eXBlID0gXHVjMGFjXHViODQwDQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gXHVjNjA4XHVjMGMxIFx1YWNlMFx1YjgyNFx1YzBhY1x1ZDU2ZA0KLV9VSV9SZXVzYWJsZUFzc2V0X3R5cGUgPSBcdWM3YWNcdWMwYWNcdWM2YTlcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjNzkwXHVjMGIwDQotX1VJX1N0YXRlX3R5cGUgPSBcdWMwYzFcdWQwZGMNCi1fVUlfVmVydGV4X3R5cGUgPSBcdWM4MTVcdWM4MTANCi1fVUlfUmVnaW9uX3R5cGUgPSBcdWM2MDFcdWM1ZWQNCi1fVUlfU3RhdGVNYWNoaW5lX3R5cGUgPSBcdWMwYzFcdWQwZGMgXHViYTM4XHVjMmUwDQotX1VJX1RyYW5zaXRpb25fdHlwZSA9IFx1YzBjMVx1ZDBkYyBcdWM4MDRcdWM3NzQNCi1fVUlfUHNldWRvU3RhdGVfdHlwZSA9IFx1Yzc1OFx1YzBhYyBcdWMwYzFcdWQwZGMNCi1fVUlfRGlzY2lwbGluZV90eXBlID0gXHVjNmQwXHVjZTU5DQotX1VJX0NvbnRlbnRDYXRlZ29yeV90eXBlID0gXHVjZWU4XHVkMTUwXHVjZTIwIFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYw0KLV9VSV9Sb2xlU2V0X3R5cGUgPSBcdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4DQotX1VJX0RvbWFpbl90eXBlID0gXHViM2M0XHViYTU0XHVjNzc4DQotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWM3MjBcdWQ2MTUNCi1fVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUgPSBcdWM2ZDBcdWNlNTkgXHVhZGY4XHViOGY5XHVkNjU0DQotX1VJX1Rvb2xfdHlwZSA9IFx1YjNjNFx1YWQ2Yw0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSA9IFx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjggXHVhZGY4XHViOGY5XHVkNjU0DQotX1VJX0N1c3RvbUNhdGVnb3J5X3R5cGUgPSBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfdHlwZSA9IFx1YzgwNFx1YjJlYyBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1fVUlfUHJvY2Vzc190eXBlID0gXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3R5cGUgPSBcdWFlMzBcdWIyYTUgXHVkMzI4XHVkMTM0DQotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUgPSBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVhY2M0XHVkNjhkIFx1ZDE1Y1x1ZDUwY1x1YjlhY1x1ZDJiOA0KLV9VSV9Sb2FkbWFwX3R5cGUgPSBcdWI4NWNcdWI0ZGNcdWI5ZjUNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlID0gXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1Y2VmNFx1ZDNlY1x1YjEwY1x1ZDJiOA0KLV9VSV9Qcm9jZXNzUGFja2FnZV90eXBlID0gXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1ZDMyOFx1ZDBhNFx1YzljMA0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX3R5cGUgPSBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVjZWY0XHVkM2VjXHViMTBjXHVkMmI4IFx1Yzc3OFx1ZDEzMFx1ZDM5OFx1Yzc3NFx1YzJhNA0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlID0gXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1Y2VmNFx1ZDNlY1x1YjEwY1x1ZDJiOCBcdWMxMjRcdWJhODVcdWM3OTANCi1fVUlfTWV0aG9kUGx1Z2luX3R5cGUgPSBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlID0gXHViY2MwXHViM2Q5IFx1YzY5NFx1YzE4Yw0KLV9VSV9NZXRob2RVbml0X3R5cGUgPSBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViMmU4XHVjNzA0DQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSA9IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzENCi1fVUlfUHJvY2Vzc0ZhbWlseV90eXBlID0gXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1YWNjNFx1YzVmNA0KLV9VSV9NZXRob2RMaWJyYXJ5X3R5cGUgPSBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjDQotX1VJX1Vua25vd25fdHlwZSA9IFx1YzYyNFx1YmUwY1x1YzgxZFx1ZDJiOA0KLQ0KLV9VSV9Vbmtub3duX2RhdGF0eXBlPSBcdWFjMTINCi0NCi1fVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSA9IFx1Yzc3NFx1Yjk4NA0KLV9VSV9NZXRob2RFbGVtZW50X2d1aWRfZmVhdHVyZSA9IEd1aWQNCi1fVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdWFjMDRcdWI3YjVcdWQ1NWMgXHVjMTI0XHViYTg1DQotX1VJX01ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19mZWF0dXJlID0gXHVjMThjXHVjNzIwIFx1YWRkY1x1Y2U1OQ0KLV9VSV9NZXRob2RFbGVtZW50X3N1cHByZXNzZWRfZmVhdHVyZSA9IFx1YzViNVx1YzgxY1x1YjQyOA0KLV9VSV9NZXRob2RFbGVtZW50X29yZGVyaW5nR3VpZGVfZmVhdHVyZSA9IFx1YzhmY1x1YmIzOCBcdWM1NDhcdWIwYjRcdWMxMWMNCi1fVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUgPSBcdWJjZjhcdWJiMzgNCi1fVUlfQ29udGVudEVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gXHVjOWMwXHVjNmQwIFx1Yzc5MFx1YjhjYw0KLV9VSV9Db250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19mZWF0dXJlID0gXHVhYzFjXHViMTUwIFx1YmMwZiBcdWJjMzFcdWMxMWMNCi1fVUlfQ29udGVudEVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlID0gXHVjY2I0XHVkMDZjXHViOWFjXHVjMmE0XHVkMmI4DQotX1VJX0NvbnRlbnRFbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSA9IFx1YWMwMFx1Yzc3NFx1YjRkY1x1Yjc3Y1x1Yzc3OA0KLV9VSV9Db250ZW50RWxlbWVudF9leGFtcGxlc19mZWF0dXJlID0gXHVjNjA4XHVjODFjDQotX1VJX0NvbnRlbnRFbGVtZW50X2Fzc2V0c19mZWF0dXJlID0gXHVjNzkwXHVjMGIwDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUgPSBcdWQ0NWNcdWMyZGMgXHVjNzc0XHViOTg0DQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fZmVhdHVyZSA9IFx1ZDQ1Y1x1YzJkYw0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBTaGFwZWljb24NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBOb2RlaWNvbg0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdWFlMzBcdWJjZjggXHVjMTI0XHViYTg1DQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19mZWF0dXJlID0gXHVjMTM5XHVjMTU4DQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9rZXlDb25zaWRlcmF0aW9uc19mZWF0dXJlID0gXHVkNTc1XHVjMmVjIFx1YWNlMFx1YjgyNFx1YzBhY1x1ZDU2ZA0KLV9VSV9TZWN0aW9uX3NlY3Rpb25OYW1lX2ZlYXR1cmUgPSBcdWMxMzlcdWMxNTggXHVjNzc0XHViOTg0DQotX1VJX1NlY3Rpb25fc2VjdGlvbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdWMxMzlcdWMxNTggXHVjMTI0XHViYTg1DQotX1VJX1NlY3Rpb25fc3ViU2VjdGlvbnNfZmVhdHVyZSA9IFx1YzExY1x1YmUwY1x1YzEzOVx1YzE1OA0KLV9VSV9TZWN0aW9uX3ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBcdWMxMjBcdWQ1ODkNCi1fVUlfUm9sZV9tb2RpZmllc19mZWF0dXJlID0gXHVjMjE4XHVjODE1DQotX1VJX1JvbGVfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFx1Y2M0NVx1Yzc4NCBcdWMwYWNcdWQ1NmQNCi1fVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlID0gXHViY2Y0XHVhY2UwXHVjMTFjDQotX1VJX1dvcmtQcm9kdWN0X3RlbXBsYXRlc19mZWF0dXJlID0gXHVkMTVjXHVkNTBjXHViOWFjXHVkMmI4DQotX1VJX1dvcmtQcm9kdWN0X3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBcdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5IFx1YjNjNFx1YzZjMFx1YjlkMA0KLV9VSV9Xb3JrUHJvZHVjdF9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IFx1YzYwOFx1YzBjMSBcdWFjZTBcdWI4MjRcdWMwYWNcdWQ1NmQNCi1fVUlfVGFza19wZXJmb3JtZWRCeV9mZWF0dXJlID0gXHVjMjE4XHVkNTg5XHVjNzkwDQotX1VJX1Rhc2tfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IFx1ZDU0NFx1YzIxOCBcdWM3ODVcdWI4MjUNCi1fVUlfVGFza19vdXRwdXRfZmVhdHVyZSA9IFx1Y2Q5Y1x1YjgyNQ0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBcdWNkOTRcdWFjMDAgXHVjMjE4XHVkNTg5XHVjNzkwDQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gXHVjMTIwXHVkMGRkXHVjODAxIFx1Yzc4NVx1YjgyNQ0KLV9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUgPSBcdWIyZThcdWFjYzQNCi1fVUlfVGFza190b29sTWVudG9yc19mZWF0dXJlID0gXHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDANCi1fVUlfVGFza19lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IFx1YzYwOFx1YzBjMSBcdWFjZTBcdWI4MjRcdWMwYWNcdWQ1NmQNCi1fVUlfV29ya0RlZmluaXRpb25fcHJlY29uZGl0aW9uX2ZlYXR1cmUgPSBcdWM4MDRcdWM4MWMgXHVjODcwXHVhYzc0DQotX1VJX1dvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fZmVhdHVyZSA9IFx1YzBhY1x1ZDZjNCBcdWM4NzBcdWFjNzQNCi1fVUlfQXJ0aWZhY3RfY29udGFpbmVyQXJ0aWZhY3RfZmVhdHVyZSA9IFx1Y2VlOFx1ZDE0Y1x1Yzc3NFx1YjEwOCBcdWM1NDRcdWQyZjBcdWQzMjlcdWQyYjgNCi1fVUlfQXJ0aWZhY3RfY29udGFpbmVkQXJ0aWZhY3RzX2ZlYXR1cmUgPSBcdWQzZWNcdWQ1NjhcdWI0MWMgXHVjNTQ0XHVkMmYwXHVkMzI5XHVkMmI4DQotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gXHVjNzc4XHViM2M0XHViNDFjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi1fVUlfTWV0aG9kUGFja2FnZV9nbG9iYWxfZmVhdHVyZSA9IFx1YWUwMFx1Yjg1Y1x1YmM4Yw0KLV9VSV9NZXRob2RQYWNrYWdlX3JldXNlZFBhY2thZ2VzX2ZlYXR1cmUgPSBcdWM3YWNcdWMwYWNcdWM2YTlcdWI0MWMgXHVkMzI4XHVkMGE0XHVjOWMwDQotX1VJX01ldGhvZFBhY2thZ2VfcGFyZW50UGFja2FnZV9mZWF0dXJlID0gXHVjMGMxXHVjNzA0IFx1ZDMyOFx1ZDBhNFx1YzljMA0KLV9VSV9NZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfZmVhdHVyZSA9IFx1ZDU1OFx1YzcwNCBcdWQzMjhcdWQwYTRcdWM5YzANCi1fVUlfQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX2ZlYXR1cmUgPSBcdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fYnJpZWZPdXRsaW5lX2ZlYXR1cmUgPSBcdWFjMDRcdWI3YjVcdWQ1NWMgXHVjNTQ0XHVjNmMzXHViNzdjXHVjNzc4DQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUgPSBcdWQ0NWNcdWMyZGMgXHVjNjM1XHVjMTU4DQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gXHVjNjc4XHViZDgwIElEDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gXHViYWE5XHVjODAxDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25faW1wYWN0T2ZOb3RIYXZpbmdfZmVhdHVyZSA9IFx1YmQ4MFx1YzdhY1x1YzVkMCBcdWI1MzBcdWI5NzggXHVjNjAxXHVkNWE1DQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcmVhc29uc0Zvck5vdE5lZWRpbmdfZmVhdHVyZSA9IFx1ZDU0NFx1YzY5NCBcdWM1YzZcdWIyOTQgXHVjNzc0XHVjNzIwDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fZXh0ZXJuYWxEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHVjNjc4XHViZDgwIFx1YzEyNFx1YmE4NQ0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3BhY2thZ2luZ0d1aWRhbmNlX2ZlYXR1cmUgPSBcdWQzMjhcdWQwYTRcdWM5ZDUgXHVjNTQ4XHViMGI0DQotX1VJX1JvbGVEZXNjcmlwdGlvbl9za2lsbHNfZmVhdHVyZSA9IFx1YzJhNFx1ZDBhYw0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fYXNzaWdubWVudEFwcHJvYWNoZXNfZmVhdHVyZSA9IFx1YzljMFx1YzgxNSBcdWM4MTFcdWFkZmMgXHViYzI5XHVjMmRkDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlID0gXHViM2Q5XHVjNzU4XHVjNWI0DQotX1VJX1Rhc2tEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBcdWJhYTlcdWM4MDENCi1fVUlfVGFza0Rlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gXHViMzAwXHVjY2I0DQotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fYXR0YWNobWVudHNfZmVhdHVyZSA9IFx1Y2NhOFx1YmQ4MA0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUgPSBcdWNkOTRcdWFjMDAgXHVjODE1XHViY2Y0DQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlID0gXHViYjM4XHVjODFjXHVjODEwDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlID0gXHViYzMwXHVhY2JkDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSA9IFx1YmFhOVx1YzgwMQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FwcGxpY2F0aW9uX2ZlYXR1cmUgPSBcdWM3NTFcdWM2YTlcdWQ1MDRcdWI4NWNcdWFkZjhcdWI3YTgNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9sZXZlbHNPZkFkb3B0aW9uX2ZlYXR1cmUgPSBcdWNjNDRcdWQwZGQgXHViODA4XHViY2E4DQotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgNCi1fVUlfUG9pbnRfeV9mZWF0dXJlID0gWQ0KLV9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSA9IFx1YzcwNFx1Y2U1OA0KLV9VSV9HcmFwaEVsZW1lbnRfY29udGFpbmVkX2ZlYXR1cmUgPSBcdWQzZWNcdWQ1NjhcdWI0MjgNCi1fVUlfR3JhcGhFbGVtZW50X2xpbmtfZmVhdHVyZSA9IFx1YjljMVx1ZDA2Yw0KLV9VSV9HcmFwaEVsZW1lbnRfYW5jaG9yYWdlX2ZlYXR1cmUgPSBcdWM1NzVcdWNlZTRcdWI5YWNcdWM5YzANCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IFx1YzJkY1x1YjllOFx1ZDJmMSBcdWJhYThcdWIzNzgNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfaXNWaXNpYmxlX2ZlYXR1cmUgPSBcdWFjMDBcdWMyZGNcdWM4MDFcdWM3ODQNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfY29udGFpbmVyX2ZlYXR1cmUgPSBcdWNlZThcdWQxNGNcdWM3NzRcdWIxMDgNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUgPSBcdWNjMzhcdWM4NzANCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfZmVhdHVyZSA9IFx1ZDJiOVx1YzEzMQ0KLV9VSV9EaWFncmFtTGlua196b29tX2ZlYXR1cmUgPSBcdWQ2NTVcdWIzMDAvXHVjZDk1XHVjMThjDQotX1VJX0RpYWdyYW1MaW5rX3ZpZXdwb3J0X2ZlYXR1cmUgPSBcdWJkZjBcdWQzZWNcdWQyYjgNCi1fVUlfRGlhZ3JhbUxpbmtfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBcdWFkZjhcdWI3OThcdWQ1MDQgXHVjNjk0XHVjMThjDQotX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSA9IFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOA0KLV9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IFx1YWRmOFx1Yjc5OFx1ZDUwNCBcdWM2OTRcdWMxOGMNCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFZGdlX2ZlYXR1cmUgPSBcdWFkZjhcdWI3OThcdWQ1MDQgXHVjNWQwXHVjOWMwDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBcdWQ0NWNcdWMyZGMNCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IFx1YWRmOFx1Yjc5OFx1ZDUwNCBcdWM2OTRcdWMxOGMNCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9kaWFncmFtX2ZlYXR1cmUgPSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTgNCi1fVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUgPSBcdWIxMDhcdWJlNDQNCi1fVUlfRGltZW5zaW9uX2hlaWdodF9mZWF0dXJlID0gXHViMTkyXHVjNzc0DQotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHVhYzFjXHViY2M0IFx1ZDQ1Y1x1YzJkY1x1Yzc4NA0KLV9VSV9SZWZlcmVuY2VfcmVmZXJlbmNlZF9mZWF0dXJlID0gXHVjYzM4XHVjODcwXHViNDI4DQotX1VJX1Byb3BlcnR5X2tleV9mZWF0dXJlID0gXHVkMGE0DQotX1VJX1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUgPSBcdWFjMTINCi1fVUlfR3JhcGhFZGdlX2FuY2hvcl9mZWF0dXJlID0gXHVjNTc1XHVjZWU0DQotX1VJX0dyYXBoRWRnZV93YXlwb2ludHNfZmVhdHVyZSA9IFx1YzljMFx1YzgxMA0KLV9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSA9IFx1ZDY1NVx1YjMwMC9cdWNkOTVcdWMxOGMNCi1fVUlfRGlhZ3JhbV92aWV3cG9pbnRfZmVhdHVyZSA9IFx1YzJkY1x1YzgxMA0KLV9VSV9EaWFncmFtX2RpYWdyYW1MaW5rX2ZlYXR1cmUgPSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHViOWMxXHVkMDZjDQotX1VJX0RpYWdyYW1fbmFtZXNwYWNlX2ZlYXR1cmUgPSBcdWM3NzRcdWI5ODQgXHVhY2Y1XHVhYzA0DQotX1VJX0dyYXBoTm9kZV9zaXplX2ZlYXR1cmUgPSBcdWQwNmNcdWFlMzANCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZUluZm9fZmVhdHVyZSA9IFx1YzcyMFx1ZDYxNSBcdWM4MTVcdWJjZjQNCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUgPSBcdWM2OTRcdWMxOGMNCi1fVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlID0gXHVjNjk0XHVjMThjDQotX1VJX1RleHRFbGVtZW50X3RleHRfZmVhdHVyZSA9IFx1ZDE0ZFx1YzJhNFx1ZDJiOA0KLV9VSV9JbWFnZV91cmlfZmVhdHVyZSA9IFVSSQ0KLV9VSV9JbWFnZV9taW1lVHlwZV9mZWF0dXJlID0gTWltZSBcdWM3MjBcdWQ2MTUNCi1fVUlfUG9seWxpbmVfY2xvc2VkX2ZlYXR1cmUgPSBcdWIyZWJcdWQ3OTgNCi1fVUlfUG9seWxpbmVfd2F5cG9pbnRzX2ZlYXR1cmUgPSBcdWM5YzBcdWM4MTANCi1fVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUgPSBcdWJjMThcdWFjYmQgWA0KLV9VSV9FbGxpcHNlX3JhZGl1c1lfZmVhdHVyZSA9IFx1YmMxOFx1YWNiZCBZDQotX1VJX0VsbGlwc2Vfcm90YXRpb25fZmVhdHVyZSA9IFx1ZDY4Y1x1YzgwNA0KLV9VSV9FbGxpcHNlX3N0YXJ0QW5nbGVfZmVhdHVyZSA9IFx1YzJkY1x1Yzc5MSBcdWFjMDFcdWIzYzQNCi1fVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlID0gXHViMDVkIFx1YWMwMVx1YjNjNA0KLV9VSV9FbGxpcHNlX2NlbnRlcl9mZWF0dXJlID0gXHVhYzAwXHVjNmI0XHViMzcwDQotX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUgPSBcdWM3OTFcdWM1YzVcdWJkODRcdWI5NTggXHVjNjk0XHVjMThjDQotX1VJX0FjdGl2aXR5X3JvYWRtYXBzX2ZlYXR1cmUgPSBcdWI4NWNcdWI0ZGNcdWI5ZjUNCi1fVUlfQWN0aXZpdHlfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gXHVjOWMwXHVjNmQwIFx1Yzc5MFx1YjhjYw0KLV9VSV9BY3Rpdml0eV9jaGVja2xpc3RzX2ZlYXR1cmUgPSBcdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjgNCi1fVUlfQWN0aXZpdHlfY29uY2VwdHNfZmVhdHVyZSA9IFx1YWMxY1x1YjE1MA0KLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gXHVjNjA4XHVjODFjDQotX1VJX0FjdGl2aXR5X2d1aWRlbGluZXNfZmVhdHVyZSA9IFx1YWMwMFx1Yzc3NFx1YjRkY1x1Yjc3Y1x1Yzc3OA0KLV9VSV9BY3Rpdml0eV9yZXVzYWJsZUFzc2V0c19mZWF0dXJlID0gXHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMA0KLV9VSV9BY3Rpdml0eV9pc0VuYWN0YWJsZV9mZWF0dXJlID0gXHViYzFjXHVjMGRkIFx1YWMwMFx1YjJhNVx1ZDU2OA0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc1JlcGVhdGFibGVfZmVhdHVyZSA9IFx1YmMxOFx1YmNmNSBcdWFjMDBcdWIyYTVcdWQ1NjgNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNPbmdvaW5nX2ZlYXR1cmUgPSBcdWM5YzRcdWQ1ODkgXHVjOTExXHVjNzg0DQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzRXZlbnREcml2ZW5fZmVhdHVyZSA9IFx1Yzc3NFx1YmNhNFx1ZDJiOFx1Yjg1YyBcdWFkNmNcdWIzZDlcdWI0MjgNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfbGlua1RvUHJlZGVjZXNzb3JfZmVhdHVyZSA9IFx1YzEyMFx1ZDU4OVx1YzVkMCBcdWI5YzFcdWQwNmMNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVmaXhfZmVhdHVyZSA9IFx1YzgxMVx1YjQ1MFx1YmQ4MA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlID0gXHVhY2M0XHVkNjhkXHViNDI4DQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlID0gXHViY2Y1XHVjMjE4IFx1YmMxY1x1YzBkZFx1Yzc3NCBcdWM3ODhcdWM3NGMNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc09wdGlvbmFsX2ZlYXR1cmUgPSBcdWMxMjBcdWQwZGRcdWM4MDFcdWM3ODQNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRBZnRlcl9mZWF0dXJlID0gXHVjMGFjXHVkNmM0XHVjNWQwIFx1ZDQ1Y1x1YzJkY1x1YjQyOA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEJlZm9yZV9mZWF0dXJlID0gXHVjMGFjXHVjODA0XHVjNWQwIFx1ZDQ1Y1x1YzJkY1x1YjQyOA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9mZWF0dXJlID0gXHVhY2M0XHVkNjhkIFx1YjM3MFx1Yzc3NFx1ZDEzMA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3N1cGVyQWN0aXZpdGllc19mZWF0dXJlID0gXHVjMjE4XHVkMzdjIFx1ZDY1Y1x1YjNkOQ0KLV9VSV9UZWFtUHJvZmlsZV90ZWFtUm9sZXNfZmVhdHVyZSA9IFx1ZDMwMCBcdWM1ZWRcdWQ1NjANCi1fVUlfVGVhbVByb2ZpbGVfc3VwZXJUZWFtX2ZlYXR1cmUgPSBcdWMwYzFcdWM3MDQgXHVkMzAwDQotX1VJX1RlYW1Qcm9maWxlX3N1YlRlYW1fZmVhdHVyZSA9IFx1ZDU1OFx1YzcwNCBcdWQzMDANCi1fVUlfUm9sZURlc2NyaXB0b3JfUm9sZV9mZWF0dXJlID0gXHVjNWVkXHVkNTYwDQotX1VJX1JvbGVEZXNjcmlwdG9yX21vZGlmaWVzX2ZlYXR1cmUgPSBcdWMyMThcdWM4MTUNCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFx1Y2M0NVx1Yzc4NCBcdWMwYWNcdWQ1NmQNCi1fVUlfV29ya09yZGVyX2xpbmtUeXBlX2ZlYXR1cmUgPSBcdWI5YzFcdWQwNmMgXHVjNzIwXHVkNjE1DQotX1VJX1dvcmtPcmRlcl9wcmVkX2ZlYXR1cmUgPSBQcmVkDQotX1VJX1BsYW5uaW5nRGF0YV9zdGFydERhdGVfZmVhdHVyZSA9IFx1YzJkY1x1Yzc5MSBcdWIwYTBcdWM5ZGMNCi1fVUlfUGxhbm5pbmdEYXRhX2ZpbmlzaERhdGVfZmVhdHVyZSA9IFx1YzY0NFx1YjhjYyBcdWIwYTBcdWM5ZGMNCi1fVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSA9IFx1YjRmMVx1YWUwOQ0KLV9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlID0gXHVjMThjXHVjMmE0XHVjNjQwIFx1YjNkOVx1YWUzMFx1ZDY1NFx1YjQyOA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUgPSBcdWQ2NWNcdWIzZDkgXHVjMmRjXHVjNzkxIFx1YzBjMVx1ZDBkYw0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFeGl0U3RhdGVfZmVhdHVyZSA9IFx1ZDY1Y1x1YjNkOSBcdWM4ODVcdWI4Y2MgXHVjMGMxXHVkMGRjDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0ZWRCeV9mZWF0dXJlID0gXHVjNjAxXHVkNWE1XHVjNzQ0IFx1YzkwMCBcdWIzMDBcdWMwYzENCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdHNfZmVhdHVyZSA9IFx1YzYwMVx1ZDVhNQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfZGVsaXZlcmFibGVQYXJ0c19mZWF0dXJlID0gXHVjNzc4XHViM2M0XHViYjNjIFx1ZDMwY1x1ZDJiOA0KLV9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUgPSBcdWQwYzBcdWMyYTRcdWQwNmMNCi1fVUlfVGFza0Rlc2NyaXB0b3JfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSA9IDJcdWNjMjggXHVjMjE4XHVkNTg5XHVjNzkwDQotX1VJX1Rhc2tEZXNjcmlwdG9yX2Fzc2lzdGVkQnlfZmVhdHVyZSA9IFx1YzljMFx1YzZkMFx1Yzc5MA0KLV9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUgPSBcdWM2NzhcdWJkODAgXHVjNzg1XHViODI1DQotX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBcdWQ1NDRcdWMyMTggXHVjNzg1XHViODI1DQotX1VJX1Rhc2tEZXNjcmlwdG9yX29wdGlvbmFsSW5wdXRfZmVhdHVyZSA9IFx1YzEyMFx1ZDBkZFx1YzgwMSBcdWM3ODVcdWI4MjUNCi1fVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUgPSBcdWNkOWNcdWI4MjUNCi1fVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSA9IFx1YWUzMFx1YmNmOCBcdWMyMThcdWQ1ODlcdWM3OTANCi1fVUlfVGFza0Rlc2NyaXB0b3Jfc2VsZWN0ZWRTdGVwc19mZWF0dXJlID0gXHVjMTIwXHVkMGRkXHViNDFjIFx1YjJlOFx1YWNjNA0KLV9VSV9Db21wb3NpdGVSb2xlX2FnZ3JlZ2F0ZWRSb2xlc19mZWF0dXJlID0gXHVjOWQxXHVhY2M0XHViNDFjIFx1YzVlZFx1ZDU2MA0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlID0gXHVjMGFjXHVjNmE5XHViYzk1IFx1YzU0OFx1YjBiNA0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFx1YmFhOVx1YzgwMQ0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gXHViMzAwXHVjY2I0DQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25faG93dG9TdGFmZl9mZWF0dXJlID0gXHVjNzc4XHViODI1IFx1YWQ2Y1x1YzEzMSBcdWJjMjlcdWJjOTUNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSA9IFx1YzJhNFx1Y2YwMFx1Yzc3Yw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzX2ZlYXR1cmUgPSBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjggXHVkMmI5XHVjMTMxDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlID0gXHVjNzA0XHVkNWQ4XHVjMTMxIFx1YjgwOFx1YmNhOA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9lc3RpbWF0aW5nVGVjaG5pcXVlX2ZlYXR1cmUgPSBcdWM2MDhcdWMwYzEgXHVhZTMwXHViYzk1DQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IFx1ZDUwNFx1Yjg1Y1x1YzgxZFx1ZDJiOCBcdWFkNmNcdWMxMzFcdWM2ZDAgXHVjODA0XHViYjM4IFx1YzljMFx1YzJkZA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gXHVhY2M0XHVjNTdkIFx1YzcyMFx1ZDYxNQ0KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gXHVjNjc4XHViZDgwIElEDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9zY29wZV9mZWF0dXJlID0gXHViYzk0XHVjNzA0DQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl91c2FnZU5vdGVzX2ZlYXR1cmUgPSBcdWMwYWNcdWM2YTlcdWJjOTUgXHViMTc4XHVkMmI4DQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl9yZWZpbmVkRGVzY3JpcHRpb25fZmVhdHVyZSA9IFx1YzEzOFx1YmQ4MCBcdWMxMjRcdWJhODUNCi1fVUlfUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX2ZlYXR1cmUgPSBcdWQ1NThcdWM3MDQgXHVjMGFjXHViODQwDQotX1VJX1ByYWN0aWNlX2NvbnRlbnRSZWZlcmVuY2VzX2ZlYXR1cmUgPSBcdWNlZThcdWQxNTBcdWNlMjAgXHVjYzM4XHVjODcwDQotX1VJX1ByYWN0aWNlX2FjdGl2aXR5UmVmZXJlbmNlc19mZWF0dXJlID0gXHVkNjVjXHViM2Q5IFx1Y2MzOFx1Yzg3MA0KLV9VSV9TdGF0ZV9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLV9VSV9TdGF0ZV9SZWdpb25fZmVhdHVyZSA9IFx1YzYwMVx1YzVlZA0KLV9VSV9TdGF0ZV9zdWJtYWNoaW5lX2ZlYXR1cmUgPSBcdWMxMWNcdWJlMGNcdWJhMzhcdWMyZTANCi1fVUlfVmVydGV4X2NvbnRhaW5lcl9mZWF0dXJlID0gXHVjZWU4XHVkMTRjXHVjNzc0XHViMTA4DQotX1VJX1ZlcnRleF9vdXRnb2luZ19mZWF0dXJlID0gXHVjZDljXHViODI1DQotX1VJX1ZlcnRleF9pbmNvbWluZ19mZWF0dXJlID0gXHVjNzg1XHViODI1DQotX1VJX1JlZ2lvbl9WZXJ0ZXhfZmVhdHVyZSA9IFx1YzgxNVx1YzgxMA0KLV9VSV9SZWdpb25fVHJhbnNpdGlvbl9mZWF0dXJlID0gXHVjMGMxXHVkMGRjIFx1YzgwNFx1Yzc3NA0KLV9VSV9SZWdpb25fU3RhdGVfZmVhdHVyZSA9IFx1YzBjMVx1ZDBkYw0KLV9VSV9SZWdpb25fU3RhdGVNYWNoaW5lX2ZlYXR1cmUgPSBcdWMwYzFcdWQwZGMgXHViYTM4XHVjMmUwDQotX1VJX1N0YXRlTWFjaGluZV9SZWdpb25fZmVhdHVyZSA9IFx1YzYwMVx1YzVlZA0KLV9VSV9UcmFuc2l0aW9uX1dvcmtEZWZpbml0aW9uX2ZlYXR1cmUgPSBcdWM3OTFcdWM1YzUgXHVjODE1XHVjNzU4DQotX1VJX1RyYW5zaXRpb25fY29udGFpbmVyX2ZlYXR1cmUgPSBcdWNlZThcdWQxNGNcdWM3NzRcdWIxMDgNCi1fVUlfVHJhbnNpdGlvbl9zb3VyY2VfZmVhdHVyZSA9IFx1YzE4Y1x1YzJhNA0KLV9VSV9UcmFuc2l0aW9uX3RhcmdldF9mZWF0dXJlID0gXHViMzAwXHVjMGMxDQotX1VJX0Rpc2NpcGxpbmVfdGFza3NfZmVhdHVyZSA9IFx1ZDBjMFx1YzJhNFx1ZDA2Yw0KLV9VSV9EaXNjaXBsaW5lX3N1YmRpc2NpcGxpbmVfZmVhdHVyZSA9IFx1ZDU1OFx1YzcwNCBcdWM2ZDBcdWNlNTkNCi1fVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSA9IFx1Y2MzOFx1Yzg3MCBcdWM2Y2NcdWQwNmNcdWQ1MGNcdWI4NWNcdWM2YjANCi1fVUlfUm9sZVNldF9yb2xlc19mZWF0dXJlID0gXHVjNWVkXHVkNTYwDQotX1VJX0RvbWFpbl93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi1fVUlfRG9tYWluX3N1YmRvbWFpbnNfZmVhdHVyZSA9IFx1YzExY1x1YmUwYyBcdWIzYzRcdWJhNTRcdWM3NzgNCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3dvcmtQcm9kdWN0c19mZWF0dXJlID0gXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IFx1YzZkMFx1Y2U1OQ0KLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBcdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5IFx1YjNjNFx1YzZjMFx1YjlkMA0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfZmVhdHVyZSA9IFx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjgNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlID0gXHViZDg0XHViOTU4XHViNDFjIFx1YzY5NFx1YzE4Yw0KLV9VSV9DdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX2ZlYXR1cmUgPSBcdWMxMWNcdWJlMGMgXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19lZHVjYXRpb25NYXRlcmlhbHNfZmVhdHVyZSA9IFx1YWQ1MFx1YzcyMSBcdWM3OTBcdWI4Y2MNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBcdWNlZTRcdWJiYTRcdWIyYzhcdWNmMDBcdWM3NzRcdWMxNTggXHVjNzkwXHViOGNjDQotX1VJX1Byb2Nlc3NfaW5jbHVkZXNQYXR0ZXJuc19mZWF0dXJlID0gXHVkM2VjXHVkNTY4IFx1ZDMyOFx1ZDEzNA0KLV9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUgPSBcdWFlMzBcdWJjZjggXHVjZWU4XHVkMTRkXHVjMmE0XHVkMmI4DQotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBcdWM2MmNcdWJjMTRcdWI5NzggXHVjZWU4XHVkMTRkXHVjMmE0XHVkMmI4DQotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX2Jhc2VkT25Qcm9jZXNzZXNfZmVhdHVyZSA9IFx1YWUzMFx1YmNmOCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF9pbnRlcmZhY2VzX2ZlYXR1cmUgPSBcdWM3NzhcdWQxMzBcdWQzOThcdWM3NzRcdWMyYTQNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX2ZlYXR1cmUgPSBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1fVUlfUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX2ZlYXR1cmUgPSBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVjNjk0XHVjMThjDQotX1VJX1Byb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX2ZlYXR1cmUgPSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTgNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19mZWF0dXJlID0gXHVjNzc4XHVkMTMwXHVkMzk4XHVjNzc0XHVjMmE0IFx1YzJhNFx1ZDM5OQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZUlPX2ZlYXR1cmUgPSBcdWM3NzhcdWQxMzBcdWQzOThcdWM3NzRcdWMyYTQgSU8NCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlID0gXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1Y2VmNFx1ZDNlY1x1YjEwY1x1ZDJiOA0KLV9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSA9IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWJjYzBcdWFjYmQgXHVhYzAwXHViMmE1DQotX1VJX01ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19mZWF0dXJlID0gXHViYTU0XHVjMThjXHViNGRjIFx1ZDMyOFx1ZDBhNFx1YzljMA0KLV9VSV9NZXRob2RQbHVnaW5fYmFzZXNfZmVhdHVyZSA9IFx1YWUzMFx1YmNmOA0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUgPSBcdWJjYzBcdWIzZDkgXHVjNzIwXHVkNjE1DQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBcdWJjYzBcdWIzZDkgXHVhZTMwXHViY2Y4IFx1YzY5NFx1YzE4Yw0KLV9VSV9NZXRob2RVbml0X2F1dGhvcnNfZmVhdHVyZSA9IFx1Yzc5MVx1YzEzMVx1Yzc5MA0KLV9VSV9NZXRob2RVbml0X2NoYW5nZURhdGVfZmVhdHVyZSA9IFx1YjBhMFx1YzlkYyBcdWJjYzBcdWFjYmQNCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHVjMTI0XHViYTg1IFx1YmNjMFx1YWNiZA0KLV9VSV9NZXRob2RVbml0X3ZlcnNpb25fZmVhdHVyZSA9IFx1YmM4NFx1YzgwNA0KLV9VSV9NZXRob2RVbml0X2NvcHlyaWdodFN0YXRlbWVudF9mZWF0dXJlID0gXHVjODAwXHVjNzkxXHVhZDhjIFx1YWQ2Y1x1YmIzOA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBsdWdpblNlbGVjdGlvbl9mZWF0dXJlID0gXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWMxMjBcdWQwZGQNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUgPSBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkMzI4XHVkMGE0XHVjOWMwIFx1YzEyMFx1ZDBkZA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlID0gXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1YmNmNFx1YWUzMA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2RlZmF1bHRWaWV3X2ZlYXR1cmUgPSBcdWFlMzBcdWJjZjggXHViY2Y0XHVhZTMwDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fYmFzZUNvbmZpZ3VyYXRpb25zX2ZlYXR1cmUgPSBcdWFlMzBcdWJjZjggXHVhZDZjXHVjMTMxDQotX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSA9IFx1YzgwNFx1YjJlYyBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1fVUlfTWV0aG9kTGlicmFyeV9tZXRob2RQbHVnaW5zX2ZlYXR1cmUgPSBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotX1VJX01ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX2ZlYXR1cmUgPSBcdWMwYWNcdWM4MDQgXHVjODE1XHVjNzU4XHViNDFjIFx1YWQ2Y1x1YzEzMQ0KLV9VSV9Vbmtub3duX2ZlYXR1cmUgPSBcdWM5YzBcdWM4MTVcdWI0MThcdWM5YzAgXHVjNTRhXHVjNzRjDQotDQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9TdGFydF9saXRlcmFsID0gZmluaXNoVG9TdGFydA0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvRmluaXNoX2xpdGVyYWwgPSBmaW5pc2hUb0ZpbmlzaA0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9TdGFydF9saXRlcmFsID0gc3RhcnRUb1N0YXJ0DQotX1VJX1dvcmtPcmRlclR5cGVfc3RhcnRUb0ZpbmlzaF9saXRlcmFsID0gc3RhcnRUb0ZpbmlzaA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfaW5pdGlhbF9saXRlcmFsID0gXHVjZDA4XHVhZTMwDQotX1VJX1BzZXVkb1N0YXRlS2luZF9qb2luX2xpdGVyYWwgPSBcdWFjYjBcdWQ1NjkNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2ZvcmtfbGl0ZXJhbCA9IFx1YmQ4NFx1YWUzMA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfanVuY3Rpb25fbGl0ZXJhbCA9IFx1YzVmMFx1YWNiMA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfY2hvaWNlX2xpdGVyYWwgPSBcdWMxMjBcdWQwZGRcdWMwYWNcdWQ1NmQNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2VudHJ5UG9pbnRfbGl0ZXJhbCA9IFx1YzJkY1x1Yzc5MVx1YzgxMA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZXhpdFBvaW50X2xpdGVyYWwgPSBcdWM4ODVcdWI4Y2NcdWM4MTANCi1fVUlfUHNldWRvU3RhdGVLaW5kX3Rlcm1pbmF0ZV9saXRlcmFsID0gXHVjODg1XHViOGNjDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9uYV9saXRlcmFsID0gXHVjODAxXHVjNmE5IFx1YzU0OFx1YjQyOA0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfY29udHJpYnV0ZXNfbGl0ZXJhbCA9IFx1Y2VlOFx1ZDJiOFx1YjlhY1x1YmRmMFx1YzE1OA0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gXHVkNjU1XHVjN2E1DQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9yZXBsYWNlc19saXRlcmFsID0gXHViYzE0XHVhZmI4XHVhZTMwDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbENvbnRyaWJ1dGlvbl9saXRlcmFsID0gXHViODVjXHVjZWVjIFx1YmQ4NFx1YmMzMA0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbG9jYWxSZXBsYWNlbWVudF9saXRlcmFsID0gXHViODVjXHVjZWVjIFx1YmMxNFx1YWZiOFx1YWUzMA0KLV9VSV9BcnRpZmFjdERlc2NyaXB0b3JfdHlwZSA9IFx1YzU0NFx1ZDJmMFx1ZDMyOVx1ZDJiOCBcdWMxMjRcdWJhODVcdWM3OTANCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBcdWM4MDRcdWIyZWNcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjMTI0XHViYTg1XHVjNzkwDQotX1VJX091dGNvbWVEZXNjcmlwdG9yX3R5cGUgPSBcdWFjYjBcdWFjZmMgXHVjMTI0XHViYTg1XHVjNzkwDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMzE0YjVmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLXBsdWdpbk5hbWUgPSBTdXBvcnRlIGRlIEVkaVx1MDBlN1x1MDBlM28gRU1GIFVNQQ0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQotX1VJX0NyZWF0ZUNoaWxkX3RleHQgPSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDIgPSB7MX0gezB9DQotX1VJX0NyZWF0ZUNoaWxkX3RleHQzID0gezF9DQotX1VJX0NyZWF0ZUNoaWxkX3Rvb2x0aXAgPSBDcmlhciBOb3ZvIHswfSBTb2IgbyBSZWN1cnNvIHsxfQ0KLV9VSV9DcmVhdGVDaGlsZF9kZXNjcmlwdGlvbiA9IENyaWFyIHVtIG5vdm8gZmlsaG8gZGUgdGlwbyB7MH0gcGFyYSBvIHJlY3Vyc28gezF9IGRvIHsyfSBzZWxlY2lvbmFkby4NCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyaWFyIHVtIG5vdm8gaXJtXHUwMGUzbyBkbyB0aXBvIHswfSBwYXJhIG8gezJ9IHNlbGVjaW9uYWRvLCBubyByZWN1cnNvIHsxfSBkZSBzZXUgcGFpLg0KLQ0KLV9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSB7MH0gZGUgezF9DQotDQotX1VJX0NsYXNzaWZpZXJfdHlwZSA9IENsYXNzaWZpY2Fkb3INCi1fVUlfVHlwZV90eXBlID0gVGlwbw0KLV9VSV9FbGVtZW50X3R5cGUgPSBFbGVtZW50bw0KLV9VSV9OYW1lZEVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIE5vbWVhZG8NCi1fVUlfUGFja2FnZWFibGVFbGVtZW50X3R5cGUgPSBFbGVtZW50byBlbSBQYWNvdGUNCi1fVUlfUGFja2FnZV90eXBlID0gUGFjb3RlDQotX1VJX05hbWVzcGFjZV90eXBlID0gRXNwYVx1MDBlN28gZGUgTm9tZXMNCi1fVUlfTWV0aG9kRWxlbWVudF90eXBlID0gRWxlbWVudG8gZGUgTVx1MDBlOXRvZG8NCi1fVUlfQ29uc3RyYWludF90eXBlID0gUmVzdHJpXHUwMGU3XHUwMGUzbw0KLV9VSV9Db250ZW50RWxlbWVudF90eXBlID0gRWxlbWVudG8gZG8gQ29udGVcdTAwZmFkbw0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIERlc2NyaXRcdTAwZWR2ZWwNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlcdTAwZTdcdTAwZTNvIGRlIENvbnRlXHUwMGZhZG8NCi1fVUlfU2VjdGlvbl90eXBlID0gU2VcdTAwZTdcdTAwZTNvDQotX1VJX1JvbGVfdHlwZSA9IEZ1blx1MDBlN1x1MDBlM28NCi1fVUlfV29ya1Byb2R1Y3RfdHlwZSA9IFByb2R1dG8gZGUgVHJhYmFsaG8NCi1fVUlfVGFza190eXBlID0gVGFyZWZhDQotX1VJX1dvcmtEZWZpbml0aW9uX3R5cGUgPSBEZWZpbmlcdTAwZTdcdTAwZTNvIGRlIFRyYWJhbGhvDQotX1VJX1N0ZXBfdHlwZSA9IEV0YXBhDQotX1VJX0d1aWRhbmNlX3R5cGUgPSBPcmllbnRhXHUwMGU3XHUwMGUzbw0KLV9VSV9BcnRpZmFjdF90eXBlID0gQXJ0ZWZhdG8NCi1fVUlfRGVsaXZlcmFibGVfdHlwZSA9IERpc3RyaWJ1XHUwMGVkdmVsDQotX1VJX091dGNvbWVfdHlwZSA9IFJlc3VsdGFkbw0KLV9VSV9NZXRob2RQYWNrYWdlX3R5cGUgPSBQYWNvdGUgZGUgTVx1MDBlOXRvZG8NCi1fVUlfQ29udGVudFBhY2thZ2VfdHlwZSA9IFBhY290ZSBkZSBDb250ZVx1MDBmYWRvDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaVx1MDBlN1x1MDBlM28gZGUgQXJ0ZWZhdG8NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpXHUwMGU3XHUwMGUzbyBkbyBwcm9kdXRvIGRvIHRyYWJhbGhvDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaVx1MDBlN1x1MDBlM28gZGUgZGVsaXZlcmFibGUNCi1fVUlfUm9sZURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlcdTAwZTdcdTAwZTNvIGRlIEZ1blx1MDBlN1x1MDBlM28NCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlcdTAwZTdcdTAwZTNvIGRhIHRhcmVmYQ0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlcdTAwZTdcdTAwZTNvIGRlIE9yaWVudGFcdTAwZTdcdTAwZTNvDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaVx1MDBlN1x1MDBlM28gZGUgUHJcdTAwZTF0aWNhDQotX1VJX1BvaW50X3R5cGUgPSBQb250bw0KLV9VSV9HcmFwaEVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIEdyXHUwMGUxZmljbw0KLV9VSV9EaWFncmFtRWxlbWVudF90eXBlID0gRWxlbWVudG8gZG8gRGlhZ3JhbWENCi1fVUlfRGlhZ3JhbUxpbmtfdHlwZSA9IExpbmsgZG8gRGlhZ3JhbWENCi1fVUlfR3JhcGhDb25uZWN0b3JfdHlwZSA9IENvbmVjdG9yIEdyXHUwMGUxZmljbw0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBQb250ZSBkZSBNb2RlbG8gU2VtXHUwMGUybnRpY28NCi1fVUlfRGltZW5zaW9uX3R5cGUgPSBEaW1lbnNcdTAwZTNvDQotX1VJX1JlZmVyZW5jZV90eXBlID0gUmVmZXJcdTAwZWFuY2lhDQotX1VJX1Byb3BlcnR5X3R5cGUgPSBQcm9wcmllZGFkZQ0KLV9VSV9HcmFwaEVkZ2VfdHlwZSA9IExpbmhhIGRvIEdyXHUwMGUxZmljbw0KLV9VSV9EaWFncmFtX3R5cGUgPSBEaWFncmFtYQ0KLV9VSV9HcmFwaE5vZGVfdHlwZSA9IE5cdTAwZjMgZG8gR3JcdTAwZTFmaWNvDQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZSBNb2RlbG8gU2VtXHUwMGUybnRpY28gU2ltcGxlcw0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBQb250ZSBkZSBNb2RlbG8gU2VtXHUwMGUybnRpY28gZGUgVU1BDQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBQb250ZSBkZSBNb2RlbG8gU2VtXHUwMGUybnRpY28gUHJpbmNpcGFsDQotX1VJX0xlYWZFbGVtZW50X3R5cGUgPSBFbGVtZW50byBGb2xoYQ0KLV9VSV9UZXh0RWxlbWVudF90eXBlID0gRWxlbWVudG8gVGV4dG8NCi1fVUlfSW1hZ2VfdHlwZSA9IEltYWdlbQ0KLV9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUgPSBHclx1MDBlMWZpY28gU2ltcGxlcw0KLV9VSV9Qb2x5bGluZV90eXBlID0gUG9saWxpbmhhDQotX1VJX0VsbGlwc2VfdHlwZSA9IEVsaXBzZQ0KLV9VSV9BY3Rpdml0eV90eXBlID0gQXRpdmlkYWRlDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZSBEaXZpc1x1MDBlM28gZGUgVHJhYmFsaG8NCi1fVUlfQnJlYWtkb3duRWxlbWVudF90eXBlID0gRWxlbWVudG8gZGUgRGl2aXNcdTAwZTNvDQotX1VJX01pbGVzdG9uZV90eXBlID0gTWFyY28NCi1fVUlfSXRlcmF0aW9uX3R5cGUgPSBJdGVyYVx1MDBlN1x1MDBlM28NCi1fVUlfUGhhc2VfdHlwZSA9IEZhc2UNCi1fVUlfVGVhbVByb2ZpbGVfdHlwZSA9IFBlcmZpbCBkYSBFcXVpcGUNCi1fVUlfUm9sZURlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXRvciBkYSBGdW5cdTAwZTdcdTAwZTNvDQotX1VJX1dvcmtPcmRlcl90eXBlID0gT3JkZW0gZGUgVHJhYmFsaG8NCi1fVUlfUHJvY2Vzc0VsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIGRvIFByb2Nlc3NvDQotX1VJX1BsYW5uaW5nRGF0YV90eXBlID0gUGxhbmVqYW5kbyBEYWRvcw0KLV9VSV9EZXNjcmlwdG9yX3R5cGUgPSBEZXNjcml0b3INCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUgPSBEZXNjcml0b3IgZG8gUHJvZHV0byBkZSBUcmFiYWxobw0KLV9VSV9UYXNrRGVzY3JpcHRvcl90eXBlID0gRGVzY3JpdG9yIGRlIFRhcmVmYXMNCi1fVUlfQ29tcG9zaXRlUm9sZV90eXBlID0gRnVuXHUwMGU3XHUwMGUzbyBkZSBDb21wb3NpXHUwMGU3XHUwMGUzbw0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaVx1MDBlN1x1MDBlM28gZG8gRWxlbWVudG8gZGUgRGl2aXNcdTAwZTNvDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaVx1MDBlN1x1MDBlM28gZGUgQXRpdmlkYWRlDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlcdTAwZTdcdTAwZTNvIGRvIFByb2Nlc3NvIGRlIEVudHJlZ2ENCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlcdTAwZTdcdTAwZTNvIGRvIFByb2Nlc3NvDQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpXHUwMGU3XHUwMGUzbyBkbyBEZXNjcml0b3INCi1fVUlfQ29uY2VwdF90eXBlID0gQ29uY2VpdG8NCi1fVUlfQ2hlY2tsaXN0X3R5cGUgPSBMaXN0YSBkZSBWZXJpZmljYVx1MDBlN1x1MDBlM28NCi1fVUlfRXhhbXBsZV90eXBlID0gRXhlbXBsbw0KLV9VSV9HdWlkZWxpbmVfdHlwZSA9IERpcmV0cml6DQotX1VJX1JlcG9ydF90eXBlID0gUmVsYXRcdTAwZjNyaW8NCi1fVUlfVGVtcGxhdGVfdHlwZSA9IFRlbXBsYXRlDQotX1VJX1N1cHBvcnRpbmdNYXRlcmlhbF90eXBlID0gTWF0ZXJpYWwgU3Vwb3J0YWRvDQotX1VJX1Rvb2xNZW50b3JfdHlwZSA9IE1lbnRvciBkZSBGZXJyYW1lbnRhcw0KLV9VSV9XaGl0ZXBhcGVyX3R5cGUgPSBXaGl0ZXBhcGVyDQotX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUgPSBEZWZpbmlcdTAwZTdcdTAwZTNvIGRlIFRlcm1vDQotX1VJX1ByYWN0aWNlX3R5cGUgPSBQclx1MDBlMXRpY2ENCi1fVUlfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3R5cGUgPSBDb25zaWRlcmFcdTAwZTdcdTAwZjVlcyBFc3RpbWF0aXZhcw0KLV9VSV9SZXVzYWJsZUFzc2V0X3R5cGUgPSBSZWN1cnNvIFJldXRpbGl6XHUwMGUxdmVsDQotX1VJX1N0YXRlX3R5cGUgPSBFc3RhZG8NCi1fVUlfVmVydGV4X3R5cGUgPSBWXHUwMGU5cnRpY2UNCi1fVUlfUmVnaW9uX3R5cGUgPSBSZWdpXHUwMGUzbw0KLV9VSV9TdGF0ZU1hY2hpbmVfdHlwZSA9IE1cdTAwZTFxdWluYSBkZSBFc3RhZG8NCi1fVUlfVHJhbnNpdGlvbl90eXBlID0gVHJhbnNpXHUwMGU3XHUwMGUzbw0KLV9VSV9Qc2V1ZG9TdGF0ZV90eXBlID0gUHNldWRvIEVzdGFkbw0KLV9VSV9EaXNjaXBsaW5lX3R5cGUgPSBEaXNjaXBsaW5hDQotX1VJX0NvbnRlbnRDYXRlZ29yeV90eXBlID0gQ2F0ZWdvcmlhIGRlIENvbnRlXHUwMGZhZG8NCi1fVUlfUm9sZVNldF90eXBlID0gRGVmaW5pXHUwMGU3XHUwMGUzbyBkZSBGdW5cdTAwZTdcdTAwZTNvDQotX1VJX0RvbWFpbl90eXBlID0gRG9tXHUwMGVkbmlvDQotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gVGlwbyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlID0gQWdydXBhbWVudG8gZGUgRGlzY2lwbGluYQ0KLV9VSV9Ub29sX3R5cGUgPSBGZXJyYW1lbnRhDQotX1VJX1JvbGVTZXRHcm91cGluZ190eXBlID0gQWdydXBhbWVudG8gZGUgQ29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBGdW5cdTAwZTdcdTAwZjVlcw0KLV9VSV9DdXN0b21DYXRlZ29yeV90eXBlID0gQ2F0ZWdvcmlhIFBlcnNvbmFsaXphZGENCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUgPSBQcm9jZXNzbyBkZSBFbnRyZWdhDQotX1VJX1Byb2Nlc3NfdHlwZSA9IFByb2Nlc3NvDQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3R5cGUgPSBQYWRyXHUwMGUzbyBkZSBSZWN1cnNvDQotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUgPSBHYWJhcml0byBkZSBQbGFuZWphbWVudG8gZGUgUHJvY2Vzc28NCi1fVUlfUm9hZG1hcF90eXBlID0gUm90ZWlybw0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50X3R5cGUgPSBQcm9jZXNzYXIgQ29tcG9uZW50ZQ0KLV9VSV9Qcm9jZXNzUGFja2FnZV90eXBlID0gUGFjb3RlIGRlIFByb2Nlc3NvDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfdHlwZSA9IEludGVyZmFjZSBkbyBDb21wb25lbnRlIGRlIFByb2Nlc3NvDQotX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX3R5cGUgPSBEZXNjcml0b3IgZG8gQ29tcG9uZW50ZSBkZSBQcm9jZXNzbw0KLV9VSV9NZXRob2RQbHVnaW5fdHlwZSA9IFBsdWctaW4gZGUgTVx1MDBlOXRvZG8NCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZSBWYXJpYVx1MDBlN1x1MDBlM28NCi1fVUlfTWV0aG9kVW5pdF90eXBlID0gVW5pZGFkZSBkZSBNXHUwMGU5dG9kbw0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUgPSBDb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIE1cdTAwZTl0b2RvDQotX1VJX1Byb2Nlc3NGYW1pbHlfdHlwZSA9IEZhbVx1MDBlZGxpYSBkZSBQcm9jZXNzbw0KLV9VSV9NZXRob2RMaWJyYXJ5X3R5cGUgPSBCaWJsaW90ZWNhIGRlIE1cdTAwZTl0b2Rvcw0KLV9VSV9Vbmtub3duX3R5cGUgPSBPYmpldG8NCi0NCi1fVUlfVW5rbm93bl9kYXRhdHlwZT0gVmFsb3INCi0NCi1fVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSA9IE5vbWUNCi1fVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUgPSBHdWlkDQotX1VJX01ldGhvZEVsZW1lbnRfYnJpZWZEZXNjcmlwdGlvbl9mZWF0dXJlID0gQnJldmUgRGVzY3JpXHUwMGU3XHUwMGUzbw0KLV9VSV9NZXRob2RFbGVtZW50X293bmVkUnVsZXNfZmVhdHVyZSA9IFJlZ3JhcyBPYnRpZGFzDQotX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlID0gU3VwcmltaWRvDQotX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlID0gR3VpYSBkZSBQZWRpZG8NCi1fVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUgPSBDb3Jwbw0KLV9VSV9Db250ZW50RWxlbWVudF9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUgPSBNYXRlcmlhaXMgZGUgU3Vwb3J0ZQ0KLV9VSV9Db250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19mZWF0dXJlID0gQ29uY2VpdG9zIGUgRG9jdW1lbnRvcw0KLV9VSV9Db250ZW50RWxlbWVudF9jaGVja2xpc3RzX2ZlYXR1cmUgPSBMaXN0YXMgZGUgVmVyaWZpY2FcdTAwZTdcdTAwZTNvDQotX1VJX0NvbnRlbnRFbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSA9IERpcmV0cml6ZXMNCi1fVUlfQ29udGVudEVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSA9IEV4ZW1wbG9zDQotX1VJX0NvbnRlbnRFbGVtZW50X2Fzc2V0c19mZWF0dXJlID0gQXRpdm9zDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUgPSBOb21lIGRlIEFwcmVzZW50YVx1MDBlN1x1MDBlM28NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gQXByZXNlbnRhXHUwMGU3XHUwMGUzbw0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBTaGFwZWljb24NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBOb2RlaWNvbg0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBEZXNjcmlcdTAwZTdcdTAwZTNvIFByaW5jaXBhbA0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfZmVhdHVyZSA9IFNlXHUwMGU3XHUwMGY1ZXMNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX2tleUNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBDb25zaWRlcmFcdTAwZTdcdTAwZjVlcyBkZSBUZWNsYXMNCi1fVUlfU2VjdGlvbl9zZWN0aW9uTmFtZV9mZWF0dXJlID0gTm9tZSBkYSBTZVx1MDBlN1x1MDBlM28NCi1fVUlfU2VjdGlvbl9zZWN0aW9uRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaVx1MDBlN1x1MDBlM28gZGEgU2VcdTAwZTdcdTAwZTNvDQotX1VJX1NlY3Rpb25fc3ViU2VjdGlvbnNfZmVhdHVyZSA9IFN1Yi1zZVx1MDBlN1x1MDBmNWVzDQotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IFByZWRlY2Vzc29yDQotX1VJX1JvbGVfbW9kaWZpZXNfZmVhdHVyZSA9IE1vZGlmaWNhDQotX1VJX1JvbGVfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFJlc3BvbnNcdTAwZTF2ZWwgcG9yDQotX1VJX1dvcmtQcm9kdWN0X3JlcG9ydHNfZmVhdHVyZSA9IFJlbGF0XHUwMGYzcmlvcw0KLV9VSV9Xb3JrUHJvZHVjdF90ZW1wbGF0ZXNfZmVhdHVyZSA9IEdhYmFyaXRvcw0KLV9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlID0gTWVudG9yZXMgZGUgRmVycmFtZW50YXMNCi1fVUlfV29ya1Byb2R1Y3RfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBDb25zaWRlcmFcdTAwZTdcdTAwZjVlcyBFc3RpbWF0aXZhcw0KLV9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBSZWFsaXphZG8gcG9yDQotX1VJX1Rhc2tfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IEVudHJhZGEgT2JyaWdhdFx1MDBmM3JpYQ0KLV9VSV9UYXNrX291dHB1dF9mZWF0dXJlID0gU2FcdTAwZWRkYQ0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBEZXNlbXBlbmhhZG8gQWRpY2lvbmFsbWVudGUgcG9yDQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gRW50cmFkYSBPcGNpb25hbA0KLV9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUgPSBFdGFwYXMNCi1fVUlfVGFza190b29sTWVudG9yc19mZWF0dXJlID0gTWVudG9yZXMgZGUgRmVycmFtZW50YXMNCi1fVUlfVGFza19lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IENvbnNpZGVyYVx1MDBlN1x1MDBmNWVzIEVzdGltYXRpdmFzDQotX1VJX1dvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9mZWF0dXJlID0gUHJcdTAwZTktY29uZGlcdTAwZTdcdTAwZTNvDQotX1VJX1dvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fZmVhdHVyZSA9IFBcdTAwZjNzLWNvbmRpXHUwMGU3XHUwMGUzbw0KLV9VSV9BcnRpZmFjdF9jb250YWluZXJBcnRpZmFjdF9mZWF0dXJlID0gQXJ0ZWZhdG8gZG8gQ29udFx1MDBlYWluZXINCi1fVUlfQXJ0aWZhY3RfY29udGFpbmVkQXJ0aWZhY3RzX2ZlYXR1cmUgPSBBcnRlZmF0byBDb250aWRvDQotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gUHJvZHV0b3MgZGUgVHJhYmFsaG8gRW50cmVndWVzDQotX1VJX01ldGhvZFBhY2thZ2VfZ2xvYmFsX2ZlYXR1cmUgPSBHbG9iYWwNCi1fVUlfTWV0aG9kUGFja2FnZV9yZXVzZWRQYWNrYWdlc19mZWF0dXJlID0gUGFjb3RlcyBSZXV0aWxpemFkb3MNCi1fVUlfTWV0aG9kUGFja2FnZV9wYXJlbnRQYWNrYWdlX2ZlYXR1cmUgPSBQYWNvdGUgUGFpDQotX1VJX01ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19mZWF0dXJlID0gUGFjb3RlcyBGaWxob3MNCi1fVUlfQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX2ZlYXR1cmUgPSBFbGVtZW50b3MgZGUgQ29udGVcdTAwZmFkbw0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX2JyaWVmT3V0bGluZV9mZWF0dXJlID0gQnJldmUgUmVzdW1vDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUgPSBPcFx1MDBlN1x1MDBmNWVzIGRlIFJlcHJlc2VudGFcdTAwZTdcdTAwZTNvDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gSUQgZXh0ZXJubw0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IE9iamV0aXZvDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25faW1wYWN0T2ZOb3RIYXZpbmdfZmVhdHVyZSA9IEltcGFjdG8gQ2F1c2FkbyBwZWxhIE5cdTAwZTNvIE9idGVuXHUwMGU3XHUwMGUzbw0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3JlYXNvbnNGb3JOb3ROZWVkaW5nX2ZlYXR1cmUgPSBNb3Rpdm9zIGRhIE5cdTAwZTNvIE9icmlnYXRvcmllZGFkZQ0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX2V4dGVybmFsRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaVx1MDBlN1x1MDBlM28gRXh0ZXJuYQ0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3BhY2thZ2luZ0d1aWRhbmNlX2ZlYXR1cmUgPSBPcmllbnRhXHUwMGU3XHUwMGUzbyBkZSBQYWNvdGUNCi1fVUlfUm9sZURlc2NyaXB0aW9uX3NraWxsc19mZWF0dXJlID0gSGFiaWxpZGFkZXMNCi1fVUlfUm9sZURlc2NyaXB0aW9uX2Fzc2lnbm1lbnRBcHByb2FjaGVzX2ZlYXR1cmUgPSBBYm9yZGFnZW5zIGRhIERlc2lnbmFcdTAwZTdcdTAwZTNvDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlID0gU2luXHUwMGY0bmltb3MNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IE9iamV0aXZvDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSA9IEFsdGVybmF0aXZhcw0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX2F0dGFjaG1lbnRzX2ZlYXR1cmUgPSBBbmV4b3MNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hZGRpdGlvbmFsSW5mb19mZWF0dXJlID0gSW5mb3JtYVx1MDBlN1x1MDBmNWVzIEFkaWNpb25haXMNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9wcm9ibGVtX2ZlYXR1cmUgPSBQcm9ibGVtYQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2JhY2tncm91bmRfZmVhdHVyZSA9IEluZm9ybWFcdTAwZTdcdTAwZjVlcyBEZXRhbGhhZGFzDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSA9IE1ldGFzDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYXBwbGljYXRpb25fZmVhdHVyZSA9IEFwbGljYXRpdm8NCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9sZXZlbHNPZkFkb3B0aW9uX2ZlYXR1cmUgPSBOXHUwMGVkdmVpcyBkZSBBZG9cdTAwZTdcdTAwZTNvDQotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgNCi1fVUlfUG9pbnRfeV9mZWF0dXJlID0gWQ0KLV9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSA9IFBvc2lcdTAwZTdcdTAwZTNvDQotX1VJX0dyYXBoRWxlbWVudF9jb250YWluZWRfZmVhdHVyZSA9IENvbnRpZG8NCi1fVUlfR3JhcGhFbGVtZW50X2xpbmtfZmVhdHVyZSA9IExpbmsNCi1fVUlfR3JhcGhFbGVtZW50X2FuY2hvcmFnZV9mZWF0dXJlID0gQW5jb3JhZ2VtDQotX1VJX0dyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX2ZlYXR1cmUgPSBNb2RlbG8gU2VtXHUwMGUybnRpY28NCi1fVUlfRGlhZ3JhbUVsZW1lbnRfaXNWaXNpYmxlX2ZlYXR1cmUgPSBcdTAwYzkgVmlzXHUwMGVkdmVsDQotX1VJX0RpYWdyYW1FbGVtZW50X2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGFpbmVyDQotX1VJX0RpYWdyYW1FbGVtZW50X3JlZmVyZW5jZV9mZWF0dXJlID0gUmVmZXJcdTAwZWFuY2lhDQotX1VJX0RpYWdyYW1FbGVtZW50X3Byb3BlcnR5X2ZlYXR1cmUgPSBQcm9wcmllZGFkZQ0KLV9VSV9EaWFncmFtTGlua196b29tX2ZlYXR1cmUgPSBab29tDQotX1VJX0RpYWdyYW1MaW5rX3ZpZXdwb3J0X2ZlYXR1cmUgPSBQb3J0YSBkZSBWaXN1YWxpemFcdTAwZTdcdTAwZTNvDQotX1VJX0RpYWdyYW1MaW5rX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gRWxlbWVudG8gR3JcdTAwZTFmaWNvDQotX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSA9IERpYWdyYW1hDQotX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gRWxlbWVudG8gR3JcdTAwZTFmaWNvDQotX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWRnZV9mZWF0dXJlID0gTGluaGEgZG8gR3JcdTAwZTFmaWNvDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBBcHJlc2VudGFcdTAwZTdcdTAwZTNvDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBFbGVtZW50byBHclx1MDBlMWZpY28NCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9kaWFncmFtX2ZlYXR1cmUgPSBEaWFncmFtYQ0KLV9VSV9EaW1lbnNpb25fd2lkdGhfZmVhdHVyZSA9IExhcmd1cmENCi1fVUlfRGltZW5zaW9uX2hlaWdodF9mZWF0dXJlID0gQWx0dXJhDQotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHUwMGM5IFJlcHJlc2VudGFcdTAwZTdcdTAwZTNvIEluZGl2aWR1YWwNCi1fVUlfUmVmZXJlbmNlX3JlZmVyZW5jZWRfZmVhdHVyZSA9IFJlZmVyXHUwMGVhbmNpYQ0KLV9VSV9Qcm9wZXJ0eV9rZXlfZmVhdHVyZSA9IENoYXZlDQotX1VJX1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUgPSBWYWxvcg0KLV9VSV9HcmFwaEVkZ2VfYW5jaG9yX2ZlYXR1cmUgPSBcdTAwYzJuY29yYQ0KLV9VSV9HcmFwaEVkZ2Vfd2F5cG9pbnRzX2ZlYXR1cmUgPSBQb250b3MgZGUgVmVyaWZpY2FcdTAwZTdcdTAwZTNvDQotX1VJX0RpYWdyYW1fem9vbV9mZWF0dXJlID0gWm9vbQ0KLV9VSV9EaWFncmFtX3ZpZXdwb2ludF9mZWF0dXJlID0gUG9udG8gZGUgRXhpYmlcdTAwZTdcdTAwZTNvDQotX1VJX0RpYWdyYW1fZGlhZ3JhbUxpbmtfZmVhdHVyZSA9IExpbmsgZG8gRGlhZ3JhbWENCi1fVUlfRGlhZ3JhbV9uYW1lc3BhY2VfZmVhdHVyZSA9IEVzcGFcdTAwZTdvIGRlIE5vbWVzDQotX1VJX0dyYXBoTm9kZV9zaXplX2ZlYXR1cmUgPSBUYW1hbmhvDQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGVJbmZvX2ZlYXR1cmUgPSBJbmZvcm1hXHUwMGU3XHUwMGUzbyBkZSBUaXBvDQotX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlID0gRWxlbWVudG8NCi1fVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlID0gRWxlbWVudG8NCi1fVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlID0gVGV4dG8NCi1fVUlfSW1hZ2VfdXJpX2ZlYXR1cmUgPSBVcmkNCi1fVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSA9IFRpcG8gZGUgTWltZQ0KLV9VSV9Qb2x5bGluZV9jbG9zZWRfZmVhdHVyZSA9IEZlY2hhcg0KLV9VSV9Qb2x5bGluZV93YXlwb2ludHNfZmVhdHVyZSA9IFBvbnRvcyBkZSBWZXJpZmljYVx1MDBlN1x1MDBlM28NCi1fVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUgPSBSYWlvIFgNCi1fVUlfRWxsaXBzZV9yYWRpdXNZX2ZlYXR1cmUgPSBSYWlvIFkNCi1fVUlfRWxsaXBzZV9yb3RhdGlvbl9mZWF0dXJlID0gUm90YVx1MDBlN1x1MDBlM28NCi1fVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUgPSBcdTAwYzJuZ3VsbyBJbmljaWFsDQotX1VJX0VsbGlwc2VfZW5kQW5nbGVfZmVhdHVyZSA9IFx1MDBjMm5ndWxvIEZpbmFsDQotX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUgPSBDZW50cm8NCi1fVUlfQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfZmVhdHVyZSA9IEVsZW1lbnRvcyBkZSBEaXZpc1x1MDBlM28NCi1fVUlfQWN0aXZpdHlfcm9hZG1hcHNfZmVhdHVyZSA9IE1hcGFzIGRlIFJvdGFzDQotX1VJX0FjdGl2aXR5X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IE1hdGVyaWFpcyBkZSBTdXBvcnRlDQotX1VJX0FjdGl2aXR5X2NoZWNrbGlzdHNfZmVhdHVyZSA9IExpc3RhcyBkZSBWZXJpZmljYVx1MDBlN1x1MDBlM28NCi1fVUlfQWN0aXZpdHlfY29uY2VwdHNfZmVhdHVyZSA9IENvbmNlaXRvcw0KLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gRXhlbXBsb3MNCi1fVUlfQWN0aXZpdHlfZ3VpZGVsaW5lc19mZWF0dXJlID0gRGlyZXRyaXplcw0KLV9VSV9BY3Rpdml0eV9yZXVzYWJsZUFzc2V0c19mZWF0dXJlID0gUmVjdXJzb3MgUmV1dGlsaXpcdTAwZTF2ZWlzDQotX1VJX0FjdGl2aXR5X2lzRW5hY3RhYmxlX2ZlYXR1cmUgPSBcdTAwYzkgT3JkZW5cdTAwZTF2ZWwNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNSZXBlYXRhYmxlX2ZlYXR1cmUgPSBcdTAwYzkgUG9zc1x1MDBlZHZlbCBSZXBldGlyDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzT25nb2luZ19mZWF0dXJlID0gXHUwMGM5IENvbnRcdTAwZWRudW8NCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNFdmVudERyaXZlbl9mZWF0dXJlID0gXHUwMGM5IEV2ZW50byBPcmllbnRhZG8NCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfbGlua1RvUHJlZGVjZXNzb3JfZmVhdHVyZSA9IExpbmsgcGFyYSBQcmVkZWNlc3Nvcg0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZWZpeF9mZWF0dXJlID0gUHJlZml4bw0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlID0gXHUwMGM5IFBsYW5lamFkbw0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2hhc011bHRpcGxlT2NjdXJyZW5jZXNfZmVhdHVyZSA9IEV4aXN0ZSBWXHUwMGUxcmlhcyBPY29yclx1MDBlYW5jaWFzDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlID0gXHUwMGM5IE9wY2lvbmFsDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSA9IFBvc3Rlcmlvcm1lbnRlIEFwcmVzZW50YWRvDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQmVmb3JlX2ZlYXR1cmUgPSBBbnRlcmlvcm1lbnRlIEFwcmVzZW50YWRvDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX2ZlYXR1cmUgPSBQbGFuZWphbmRvIERhZG9zDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwZXJBY3Rpdml0aWVzX2ZlYXR1cmUgPSBTdXBlcmF0aXZpZGFkZXMNCi1fVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUgPSBGdW5cdTAwZTdcdTAwZjVlcyBkYSBFcXVpcGUNCi1fVUlfVGVhbVByb2ZpbGVfc3VwZXJUZWFtX2ZlYXR1cmUgPSBTdXBlcmVxdWlwZQ0KLV9VSV9UZWFtUHJvZmlsZV9zdWJUZWFtX2ZlYXR1cmUgPSBTdWJlcXVpcGUNCi1fVUlfUm9sZURlc2NyaXB0b3JfUm9sZV9mZWF0dXJlID0gRnVuXHUwMGU3XHUwMGUzbw0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlID0gTW9kaWZpY2ENCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFJlc3BvbnNcdTAwZTF2ZWwgcG9yDQotX1VJX1dvcmtPcmRlcl9saW5rVHlwZV9mZWF0dXJlID0gVGlwbyBkZSBMaW5rDQotX1VJX1dvcmtPcmRlcl9wcmVkX2ZlYXR1cmUgPSBQcmVkDQotX1VJX1BsYW5uaW5nRGF0YV9zdGFydERhdGVfZmVhdHVyZSA9IERhdGEgZGUgSW5cdTAwZWRjaW8NCi1fVUlfUGxhbm5pbmdEYXRhX2ZpbmlzaERhdGVfZmVhdHVyZSA9IERhdGEgZGUgQ29uY2x1c1x1MDBlM28NCi1fVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSA9IFBvc2lcdTAwZTdcdTAwZTNvDQotX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUgPSBcdTAwYzkgU2luY3Jvbml6YWRvIGNvbSBhIE9yaWdlbQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUgPSBFc3RhZG8gZGUgRW50cmFkYSBkYSBBdGl2aWRhZGUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RXhpdFN0YXRlX2ZlYXR1cmUgPSBFc3RhZG8gZGUgU2FcdTAwZWRkYSBkYSBBdGl2aWRhZGUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RlZEJ5X2ZlYXR1cmUgPSBJbXBhY3RhZG8gUG9yDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RzX2ZlYXR1cmUgPSBJbXBhY3Rvcw0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfZGVsaXZlcmFibGVQYXJ0c19mZWF0dXJlID0gUGFydGVzIERpc3RyaWJ1XHUwMGVkdmVpcw0KLV9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUgPSBUYXJlZmENCi1fVUlfVGFza0Rlc2NyaXB0b3JfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSA9IEV4ZWN1dG9yIFNlY3VuZFx1MDBlMXJpbw0KLV9VSV9UYXNrRGVzY3JpcHRvcl9hc3Npc3RlZEJ5X2ZlYXR1cmUgPSBBc3Npc3RcdTAwZWFuY2lhIGRlDQotX1VJX1Rhc2tEZXNjcmlwdG9yX2V4dGVybmFsSW5wdXRfZmVhdHVyZSA9IEVudHJhZGEgRXh0ZXJuYQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9tYW5kYXRvcnlJbnB1dF9mZWF0dXJlID0gRW50cmFkYSBPYnJpZ2F0XHUwMGYzcmlhDQotX1VJX1Rhc2tEZXNjcmlwdG9yX29wdGlvbmFsSW5wdXRfZmVhdHVyZSA9IEVudHJhZGEgT3BjaW9uYWwNCi1fVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUgPSBTYVx1MDBlZGRhDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3BlcmZvcm1lZFByaW1hcmlseUJ5X2ZlYXR1cmUgPSBFeGVjdXRvciBQcmltXHUwMGUxcmlvDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3NlbGVjdGVkU3RlcHNfZmVhdHVyZSA9IEV0YXBhcyBTZWxlY2lvbmFkYXMNCi1fVUlfQ29tcG9zaXRlUm9sZV9hZ2dyZWdhdGVkUm9sZXNfZmVhdHVyZSA9IEZ1blx1MDBlN1x1MDBmNWVzIEFncmVnYWRhcw0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlID0gT3JpZW50YVx1MDBlN1x1MDBlM28gZGUgVXNvDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gT2JqZXRpdm8NCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSA9IEFsdGVybmF0aXZhcw0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2hvd3RvU3RhZmZfZmVhdHVyZSA9IEVxdWlwZSBkZSBUYXJlZmFzDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3NjYWxlX2ZlYXR1cmUgPSBFc2NhbGENCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlID0gQ2FyYWN0ZXJcdTAwZWRzdGljYXMgZG8gUHJvamV0bw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9yaXNrTGV2ZWxfZmVhdHVyZSA9IE5cdTAwZWR2ZWwgZGUgUmlzY28NCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fZXN0aW1hdGluZ1RlY2huaXF1ZV9mZWF0dXJlID0gVFx1MDBlOWNuaWNhIGRlIEVzdGltYXRpdmENCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdE1lbWJlckV4cGVydGlzZV9mZWF0dXJlID0gQ29uaGVjaW1lbnRvIGRvIE1lbWJybyBkbyBQcm9qZXRvDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGVPZkNvbnRyYWN0X2ZlYXR1cmUgPSBUaXBvIGRlIENvbnRyYXRvDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBJRCBleHRlcm5vDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9zY29wZV9mZWF0dXJlID0gRXNjb3BvDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl91c2FnZU5vdGVzX2ZlYXR1cmUgPSBOb3RhcyBkZSBVc28NCi1fVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3JlZmluZWREZXNjcmlwdGlvbl9mZWF0dXJlID0gRGVzY3JpXHUwMGU3XHUwMGUzbyBSZWZpbmFkYQ0KLV9VSV9QcmFjdGljZV9zdWJQcmFjdGljZXNfZmVhdHVyZSA9IFN1YnByXHUwMGUxdGljYXMNCi1fVUlfUHJhY3RpY2VfY29udGVudFJlZmVyZW5jZXNfZmVhdHVyZSA9IFJlZmVyXHUwMGVhbmNpYXMgZGUgQ29udGVcdTAwZmFkbw0KLV9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSA9IFJlZmVyXHUwMGVhbmNpYXMgZGUgQXRpdmlkYWRlDQotX1VJX1N0YXRlX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotX1VJX1N0YXRlX1JlZ2lvbl9mZWF0dXJlID0gUmVnaVx1MDBlM28NCi1fVUlfU3RhdGVfc3VibWFjaGluZV9mZWF0dXJlID0gU3VibVx1MDBlMXF1aW5hDQotX1VJX1ZlcnRleF9jb250YWluZXJfZmVhdHVyZSA9IENvbnRhaW5lcg0KLV9VSV9WZXJ0ZXhfb3V0Z29pbmdfZmVhdHVyZSA9IFNhXHUwMGVkZGENCi1fVUlfVmVydGV4X2luY29taW5nX2ZlYXR1cmUgPSBFbnRyYWRhDQotX1VJX1JlZ2lvbl9WZXJ0ZXhfZmVhdHVyZSA9IFZcdTAwZTlydGljZQ0KLV9VSV9SZWdpb25fVHJhbnNpdGlvbl9mZWF0dXJlID0gVHJhbnNpXHUwMGU3XHUwMGUzbw0KLV9VSV9SZWdpb25fU3RhdGVfZmVhdHVyZSA9IEVzdGFkbw0KLV9VSV9SZWdpb25fU3RhdGVNYWNoaW5lX2ZlYXR1cmUgPSBNXHUwMGUxcXVpbmEgZGUgRXN0YWRvDQotX1VJX1N0YXRlTWFjaGluZV9SZWdpb25fZmVhdHVyZSA9IFJlZ2lcdTAwZTNvDQotX1VJX1RyYW5zaXRpb25fV29ya0RlZmluaXRpb25fZmVhdHVyZSA9IERlZmluaVx1MDBlN1x1MDBlM28gZGUgVHJhYmFsaG8NCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IENvbnRhaW5lcg0KLV9VSV9UcmFuc2l0aW9uX3NvdXJjZV9mZWF0dXJlID0gT3JpZ2VtDQotX1VJX1RyYW5zaXRpb25fdGFyZ2V0X2ZlYXR1cmUgPSBEZXN0aW5vDQotX1VJX0Rpc2NpcGxpbmVfdGFza3NfZmVhdHVyZSA9IFRhcmVmYXMNCi1fVUlfRGlzY2lwbGluZV9zdWJkaXNjaXBsaW5lX2ZlYXR1cmUgPSBTdWJkaXNjaXBsaW5hDQotX1VJX0Rpc2NpcGxpbmVfcmVmZXJlbmNlV29ya2Zsb3dzX2ZlYXR1cmUgPSBGbHV4b3MgZGUgVHJhYmFsaG8gZGUgUmVmZXJcdTAwZWFuY2lhDQotX1VJX1JvbGVTZXRfcm9sZXNfZmVhdHVyZSA9IEZ1blx1MDBlN1x1MDBmNWVzDQotX1VJX0RvbWFpbl93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFByb2R1dG9zICAgICAgICAgICBkZSBUcmFiYWxobw0KLV9VSV9Eb21haW5fc3ViZG9tYWluc19mZWF0dXJlID0gU3ViZG9tXHUwMGVkbmlvcw0KLV9VSV9Xb3JrUHJvZHVjdFR5cGVfd29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBQcm9kdXRvcyAgICAgICAgICAgZGUgVHJhYmFsaG8NCi1fVUlfRGlzY2lwbGluZUdyb3VwaW5nX2Rpc2NpcGxpbmVzX2ZlYXR1cmUgPSBEaXNjaXBsaW5hcw0KLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBNZW50b3JlcyBkZSBGZXJyYW1lbnRhcw0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfZmVhdHVyZSA9IENvbmp1bnRvcyBkZSBGdW5cdTAwZTdcdTAwZjVlcw0KLV9VSV9DdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX2ZlYXR1cmUgPSBFbGVtZW50b3MgQ2F0ZWdvcml6YWRvcw0KLV9VSV9DdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX2ZlYXR1cmUgPSBTdWJjYXRlZ29yaWFzDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19lZHVjYXRpb25NYXRlcmlhbHNfZmVhdHVyZSA9IE1hdGVyaWFpcyBkZSBFZHVjYVx1MDBlN1x1MDBlM28NCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBNYXRlcmlhaXMgZGUgQ29tdW5pY2FcdTAwZTdcdTAwZjVlcw0KLV9VSV9Qcm9jZXNzX2luY2x1ZGVzUGF0dGVybnNfZmVhdHVyZSA9IFBhZHJcdTAwZjVlcyBJbmNsdVx1MDBlZGRvcw0KLV9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUgPSBDb250ZXh0byBQYWRyXHUwMGUzbw0KLV9VSV9Qcm9jZXNzX3ZhbGlkQ29udGV4dF9mZWF0dXJlID0gQ29udGV4dG8gVlx1MDBlMWxpZG8NCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlID0gQmFzZWFkbyBlbSBQcm9jZXNzb3MNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF9pbnRlcmZhY2VzX2ZlYXR1cmUgPSBJbnRlcmZhY2VzDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gUHJvY2Vzc28NCi1fVUlfUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX2ZlYXR1cmUgPSBFbGVtZW50b3MgZGUgUHJvY2Vzc28NCi1fVUlfUHJvY2Vzc1BhY2thZ2VfZGlhZ3JhbXNfZmVhdHVyZSA9IERpYWdyYW1hcw0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZVNwZWNpZmljYXRpb25zX2ZlYXR1cmUgPSBFc3BlY2lmaWNhXHUwMGU3XHUwMGY1ZXMgZGUgSW50ZXJmYWNlDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fZmVhdHVyZSA9IEUvUyBkYSBJbnRlcmZhY2UNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlID0gUHJvY2Vzc2FyIENvbXBvbmVudGUNCi1fVUlfTWV0aG9kUGx1Z2luX3VzZXJDaGFuZ2VhYmxlX2ZlYXR1cmUgPSBVc3VcdTAwZTFyaW8gTW9kaWZpY1x1MDBlMXZlbA0KLV9VSV9NZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfZmVhdHVyZSA9IFBhY290ZXMgZGUgTVx1MDBlOXRvZG8NCi1fVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUgPSBCYXNlcw0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUgPSBUaXBvIFZhcmlcdTAwZTF2ZWwNCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSA9IFZhcmlhXHUwMGU3XHUwMGUzbyBCYXNlYWRhIGVtIEVsZW1lbnRvDQotX1VJX01ldGhvZFVuaXRfYXV0aG9yc19mZWF0dXJlID0gQXV0b3Jlcw0KLV9VSV9NZXRob2RVbml0X2NoYW5nZURhdGVfZmVhdHVyZSA9IEFsdGVyYXIgRGF0YQ0KLV9VSV9NZXRob2RVbml0X2NoYW5nZURlc2NyaXB0aW9uX2ZlYXR1cmUgPSBBbHRlcmFyIERlc2NyaVx1MDBlN1x1MDBlM28NCi1fVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUgPSBWZXJzXHUwMGUzbw0KLV9VSV9NZXRob2RVbml0X2NvcHlyaWdodFN0YXRlbWVudF9mZWF0dXJlID0gRGVjbGFyYVx1MDBlN1x1MDBlM28gZGUgRGlyZWl0b3MgQXV0b3JhaXMNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSA9IFNlbGVcdTAwZTdcdTAwZTNvIGRlIFBsdWctaW4gZG8gTVx1MDBlOXRvZG8NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUgPSBTZWxlXHUwMGU3XHUwMGUzbyBkZSBQYWNvdGUgZG8gTVx1MDBlOXRvZG8NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9wcm9jZXNzVmlld3NfZmVhdHVyZSA9IFZpc3VhbGl6YVx1MDBlN1x1MDBlM28gZG8gUHJvY2Vzc28NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9kZWZhdWx0Vmlld19mZWF0dXJlID0gVmlzdWFsaXphXHUwMGU3XHUwMGUzbyBQYWRyXHUwMGUzbw0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gQ29uZmlndXJhXHUwMGU3XHUwMGY1ZXMgQmFzZQ0KLV9VSV9Qcm9jZXNzRmFtaWx5X2RlbGl2ZXJ5UHJvY2Vzc2VzX2ZlYXR1cmUgPSBQcm9jZXNzb3MgZGUgRW50cmVnYQ0KLV9VSV9NZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfZmVhdHVyZSA9IFBsdWctaW5zIGRlIE1cdTAwZTl0b2RvDQotX1VJX01ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX2ZlYXR1cmUgPSBDb25maWd1cmFcdTAwZTdcdTAwZjVlcyBQclx1MDBlOS1kZWZpbmlkYXMNCi1fVUlfVW5rbm93bl9mZWF0dXJlID0gTlx1MDBlM28gRXNwZWNpZmljYWRvDQotDQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9TdGFydF9saXRlcmFsID0gRmltLWFvLUluXHUwMGVkY2lvDQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9GaW5pc2hfbGl0ZXJhbCA9IEZpbS1hLUZpbQ0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9TdGFydF9saXRlcmFsID0gSW5cdTAwZWRjaW8tYS1Jblx1MDBlZGNpbw0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9GaW5pc2hfbGl0ZXJhbCA9IEluXHUwMGVkY2lvLWFvLUZpbQ0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfaW5pdGlhbF9saXRlcmFsID0gaW5pY2lhbA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gdW5pcg0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZm9ya19saXRlcmFsID0gYmlmdXJjYXINCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBqdW5cdTAwZTdcdTAwZTNvDQotX1VJX1BzZXVkb1N0YXRlS2luZF9jaG9pY2VfbGl0ZXJhbCA9IG9wXHUwMGU3XHUwMGUzbw0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZW50cnlQb2ludF9saXRlcmFsID0gZW50cnlQb2ludA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZXhpdFBvaW50X2xpdGVyYWwgPSBleGl0UG9pbnQNCi1fVUlfUHNldWRvU3RhdGVLaW5kX3Rlcm1pbmF0ZV9saXRlcmFsID0gdGVybWluYXINCi1fVUlfVmFyaWFiaWxpdHlUeXBlX25hX2xpdGVyYWwgPSBuL2QNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2NvbnRyaWJ1dGVzX2xpdGVyYWwgPSBjb250cmlidWlyDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9leHRlbmRzX2xpdGVyYWwgPSBleHRlbmRlcg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfcmVwbGFjZXNfbGl0ZXJhbCA9IHN1YnN0aXR1aXINCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsQ29udHJpYnV0aW9uX2xpdGVyYWwgPSBsb2NhbENvbnRyaWJ1dGlvbg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbG9jYWxSZXBsYWNlbWVudF9saXRlcmFsID0gbG9jYWxSZXBsYWNlbWVudA0KLV9VSV9BcnRpZmFjdERlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXRvciBkZSBBcnRlZmF0bw0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXRvciBEaXN0cmlidVx1MDBlZHZlbA0KLV9VSV9PdXRjb21lRGVzY3JpcHRvcl90eXBlID0gRGVzY3JpdG9yIGRlIFJlc3VsdGFkbw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzE3NTQ2YS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1wbHVnaW5OYW1lID0gRU1GIFVNQSBcdTdmMTZcdThmOTFcdTY1MmZcdTYzMDENCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0ID0gezB9DQotX1VJX0NyZWF0ZUNoaWxkX3RleHQyID0gezF9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MyA9IHsxfQ0KLV9VSV9DcmVhdGVDaGlsZF90b29sdGlwID0gXHU1NzI4IHsxfSBcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjZcdTRlMGJcdTUyMWJcdTVlZmFcdTY1YjBcdTc2ODQgezB9DQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gXHU0ZTNhXHU5MDA5XHU2MmU5XHU3Njg0IHsyfSBcdTc2ODQgezF9IFx1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNlx1NTIxYlx1NWVmYSB7MH0gXHU3YzdiXHU1NzhiXHU3Njg0XHU2NWIwXHU1YjUwXHU0ZWUzXHUzMDAyDQotX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBcdTU3MjhcdTkwMDlcdTViOWFcdTc2ODQgezJ9IFx1NzIzNlx1NGVlM1x1NzY4NCB7MX0gXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2XHU0ZTBiXHVmZjBjXHU0ZTNhIHsyfSBcdTUyMWJcdTVlZmEgezB9IFx1N2M3Ylx1NTc4Ylx1NzY4NFx1NjViMFx1NTQwY1x1NGVlM1x1MzAwMg0KLQ0KLV9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSB7MX0gXHU3Njg0IHswfQ0KLQ0KLV9VSV9DbGFzc2lmaWVyX3R5cGUgPSBcdTUyMDZcdTdjN2JcdTU2NjgNCi1fVUlfVHlwZV90eXBlID0gXHU3YzdiXHU1NzhiDQotX1VJX0VsZW1lbnRfdHlwZSA9IFx1NTE0M1x1N2QyMA0KLV9VSV9OYW1lZEVsZW1lbnRfdHlwZSA9IFx1NWRmMlx1NTQ3ZFx1NTQwZFx1NzY4NFx1NTE0M1x1N2QyMA0KLV9VSV9QYWNrYWdlYWJsZUVsZW1lbnRfdHlwZSA9IFx1NTNlZlx1NjI1M1x1NTMwNVx1NTE0M1x1N2QyMA0KLV9VSV9QYWNrYWdlX3R5cGUgPSBcdTUzMDUNCi1fVUlfTmFtZXNwYWNlX3R5cGUgPSBcdTU0MGRcdTc5ZjBcdTdhN2FcdTk1ZjQNCi1fVUlfTWV0aG9kRWxlbWVudF90eXBlID0gXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwDQotX1VJX0NvbnN0cmFpbnRfdHlwZSA9IFx1N2VhNlx1Njc1Zg0KLV9VSV9Db250ZW50RWxlbWVudF90eXBlID0gXHU1MTg1XHU1YmI5XHU1MTQzXHU3ZDIwDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlID0gXHU1M2VmXHU2M2NmXHU4ZmYwXHU3Njg0XHU1MTQzXHU3ZDIwDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl90eXBlID0gXHU1MTg1XHU1YmI5XHU2M2NmXHU4ZmYwDQotX1VJX1NlY3Rpb25fdHlwZSA9IFx1ODI4Mg0KLV9VSV9Sb2xlX3R5cGUgPSBcdTg5ZDJcdTgyNzINCi1fVUlfV29ya1Byb2R1Y3RfdHlwZSA9IFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLV9VSV9UYXNrX3R5cGUgPSBcdTRlZmJcdTUyYTENCi1fVUlfV29ya0RlZmluaXRpb25fdHlwZSA9IFx1NWRlNVx1NGY1Y1x1NWI5YVx1NGU0OQ0KLV9VSV9TdGVwX3R5cGUgPSBcdTZiNjVcdTlhYTQNCi1fVUlfR3VpZGFuY2VfdHlwZSA9IFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLV9VSV9BcnRpZmFjdF90eXBlID0gXHU1ZGU1XHU0ZWY2DQotX1VJX0RlbGl2ZXJhYmxlX3R5cGUgPSBcdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjYNCi1fVUlfT3V0Y29tZV90eXBlID0gXHU3ZWQzXHU2NzljDQotX1VJX01ldGhvZFBhY2thZ2VfdHlwZSA9IFx1NjViOVx1NmNkNVx1NTMwNQ0KLV9VSV9Db250ZW50UGFja2FnZV90eXBlID0gXHU1MTg1XHU1YmI5XHU1MzA1DQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSA9IFx1NWRlNVx1NGVmNlx1NjNjZlx1OGZmMA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUgPSBcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTYzY2ZcdThmZjANCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl90eXBlID0gXHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHU3Njg0XHU2M2NmXHU4ZmYwDQotX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlID0gXHU4OWQyXHU4MjcyXHU2M2NmXHU4ZmYwDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlID0gXHU0ZWZiXHU1MmExXHU2M2NmXHU4ZmYwDQotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fdHlwZSA9IFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1NjNjZlx1OGZmMA0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUgPSBcdTViOWVcdThkZjVcdTYzY2ZcdThmZjANCi1fVUlfUG9pbnRfdHlwZSA9IFx1NzBiOQ0KLV9VSV9HcmFwaEVsZW1lbnRfdHlwZSA9IFx1NTZmZVx1NWY2Mlx1NTE0M1x1N2QyMA0KLV9VSV9EaWFncmFtRWxlbWVudF90eXBlID0gXHU1NmZlXHU1MTQzXHU3ZDIwDQotX1VJX0RpYWdyYW1MaW5rX3R5cGUgPSBcdTU2ZmVcdTk0ZmVcdTYzYTUNCi1fVUlfR3JhcGhDb25uZWN0b3JfdHlwZSA9IFx1NTZmZVx1NWY2Mlx1OGZkZVx1NjNhNVx1NTY2OA0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBcdThiZWRcdTRlNDlcdTZhMjFcdTU3OGJcdTY4NjUNCi1fVUlfRGltZW5zaW9uX3R5cGUgPSBcdTVjM2FcdTViZjgNCi1fVUlfUmVmZXJlbmNlX3R5cGUgPSBcdTVmMTVcdTc1MjgNCi1fVUlfUHJvcGVydHlfdHlwZSA9IFx1NWM1ZVx1NjAyNw0KLV9VSV9HcmFwaEVkZ2VfdHlwZSA9IFx1NTZmZVx1NWY2Mlx1OGZiOVx1N2YxOA0KLV9VSV9EaWFncmFtX3R5cGUgPSBcdTU2ZmUNCi1fVUlfR3JhcGhOb2RlX3R5cGUgPSBcdTU2ZmVcdTVmNjJcdTgyODJcdTcwYjkNCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSA9IFx1N2I4MFx1NTM1NVx1OGJlZFx1NGU0OVx1NmEyMVx1NTc4Ylx1NTE0M1x1N2QyMA0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBVTUEgXHU4YmVkXHU0ZTQ5XHU2YTIxXHU1NzhiXHU2ODY1DQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBcdTY4MzhcdTVmYzNcdThiZWRcdTRlNDlcdTZhMjFcdTU3OGJcdTY4NjUNCi1fVUlfTGVhZkVsZW1lbnRfdHlwZSA9IFx1NTNmNlx1NTE0M1x1N2QyMA0KLV9VSV9UZXh0RWxlbWVudF90eXBlID0gXHU2NTg3XHU2NzJjXHU1MTQzXHU3ZDIwDQotX1VJX0ltYWdlX3R5cGUgPSBcdTU2ZmVcdTUwY2YNCi1fVUlfR3JhcGhpY1ByaW1pdGl2ZV90eXBlID0gXHU1NmZlXHU1MTQzDQotX1VJX1BvbHlsaW5lX3R5cGUgPSBcdTYyOThcdTdlYmYNCi1fVUlfRWxsaXBzZV90eXBlID0gXHU2OTJkXHU1NzA2DQotX1VJX0FjdGl2aXR5X3R5cGUgPSBcdTZkM2JcdTUyYTgNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IFx1NWRlNVx1NGY1Y1x1NTIwNlx1ODllM1x1NTE0M1x1N2QyMA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUgPSBcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjANCi1fVUlfTWlsZXN0b25lX3R5cGUgPSBcdTkxY2NcdTdhMGJcdTc4OTENCi1fVUlfSXRlcmF0aW9uX3R5cGUgPSBcdThmZWRcdTRlZTMNCi1fVUlfUGhhc2VfdHlwZSA9IFx1OTYzNlx1NmJiNQ0KLV9VSV9UZWFtUHJvZmlsZV90eXBlID0gXHU1NmUyXHU5NjFmXHU2OTgyXHU4OTgxXHU2NTg3XHU0ZWY2DQotX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUgPSBcdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTdiMjYNCi1fVUlfV29ya09yZGVyX3R5cGUgPSBcdTVkZTVcdTRmNWNcdTUzNTUNCi1fVUlfUHJvY2Vzc0VsZW1lbnRfdHlwZSA9IFx1NmQ0MVx1N2EwYlx1NTE0M1x1N2QyMA0KLV9VSV9QbGFubmluZ0RhdGFfdHlwZSA9IFx1ODljNFx1NTIxMlx1NjU3MFx1NjM2ZQ0KLV9VSV9EZXNjcmlwdG9yX3R5cGUgPSBcdTYzY2ZcdThmZjBcdTdiMjYNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUgPSBcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTYzY2ZcdThmZjBcdTdiMjYNCi1fVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSA9IFx1NGVmYlx1NTJhMVx1NjNjZlx1OGZmMFx1N2IyNg0KLV9VSV9Db21wb3NpdGVSb2xlX3R5cGUgPSBcdTdlYzRcdTU0MDhcdTg5ZDJcdTgyNzINCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3R5cGUgPSBcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTYzY2ZcdThmZjANCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlID0gXHU2ZDNiXHU1MmE4XHU2M2NmXHU4ZmYwDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBcdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGJcdTYzY2ZcdThmZjANCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBcdTZkNDFcdTdhMGJcdTYzY2ZcdThmZjANCi1fVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3R5cGUgPSBcdTYzY2ZcdThmZjBcdTdiMjZcdTYzY2ZcdThmZjANCi1fVUlfQ29uY2VwdF90eXBlID0gXHU2OTgyXHU1ZmY1DQotX1VJX0NoZWNrbGlzdF90eXBlID0gXHU2ODM4XHU1YmY5XHU4ODY4DQotX1VJX0V4YW1wbGVfdHlwZSA9IFx1NzkzYVx1NGY4Yg0KLV9VSV9HdWlkZWxpbmVfdHlwZSA9IFx1NjMwN1x1NTM1Nw0KLV9VSV9SZXBvcnRfdHlwZSA9IFx1NjJhNVx1NTQ0YQ0KLV9VSV9UZW1wbGF0ZV90eXBlID0gXHU2YTIxXHU2NzdmDQotX1VJX1N1cHBvcnRpbmdNYXRlcmlhbF90eXBlID0gXHU2NTJmXHU2MzAxXHU2NzUwXHU2NTk5DQotX1VJX1Rvb2xNZW50b3JfdHlwZSA9IFx1NWRlNVx1NTE3N1x1NTQxMVx1NWJmYw0KLV9VSV9XaGl0ZXBhcGVyX3R5cGUgPSBcdTc2N2RcdTc2YWVcdTRlNjYNCi1fVUlfVGVybURlZmluaXRpb25fdHlwZSA9IFx1NjcyZlx1OGJlZFx1NWI5YVx1NGU0OQ0KLV9VSV9QcmFjdGljZV90eXBlID0gXHU1YjllXHU4ZGY1DQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gXHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5DQotX1VJX1JldXNhYmxlQXNzZXRfdHlwZSA9IFx1NTNlZlx1OTFjZFx1NzUyOFx1OGQ0NFx1NGVhNw0KLV9VSV9TdGF0ZV90eXBlID0gXHU3MmI2XHU2MDAxDQotX1VJX1ZlcnRleF90eXBlID0gXHU5ODc2XHU3MGI5DQotX1VJX1JlZ2lvbl90eXBlID0gXHU1MzNhXHU1N2RmDQotX1VJX1N0YXRlTWFjaGluZV90eXBlID0gXHU3MmI2XHU2MDAxXHU2NzNhDQotX1VJX1RyYW5zaXRpb25fdHlwZSA9IFx1NzlmYlx1NGVhNA0KLV9VSV9Qc2V1ZG9TdGF0ZV90eXBlID0gXHU0ZjJhXHU3MmI2XHU2MDAxDQotX1VJX0Rpc2NpcGxpbmVfdHlwZSA9IFx1ODljNFx1N2EwYg0KLV9VSV9Db250ZW50Q2F0ZWdvcnlfdHlwZSA9IFx1NTE4NVx1NWJiOVx1N2M3Ylx1NTIyYg0KLV9VSV9Sb2xlU2V0X3R5cGUgPSBcdTg5ZDJcdTgyNzJcdTk2YzYNCi1fVUlfRG9tYWluX3R5cGUgPSBcdTU3ZGYNCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3R5cGUgPSBcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTdjN2JcdTU3OGINCi1fVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUgPSBcdTg5YzRcdTdhMGJcdTUyMDZcdTdlYzQNCi1fVUlfVG9vbF90eXBlID0gXHU1ZGU1XHU1MTc3DQotX1VJX1JvbGVTZXRHcm91cGluZ190eXBlID0gXHU4OWQyXHU4MjcyXHU5NmM2XHU1MjA2XHU3ZWM0DQotX1VJX0N1c3RvbUNhdGVnb3J5X3R5cGUgPSBcdTViOWFcdTUyMzZcdTdjN2JcdTUyMmINCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUgPSBcdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGINCi1fVUlfUHJvY2Vzc190eXBlID0gXHU2ZDQxXHU3YTBiDQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3R5cGUgPSBcdTgwZmRcdTUyOWJcdTZhMjFcdTVmMGYNCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfdHlwZSA9IFx1NmQ0MVx1N2EwYlx1ODljNFx1NTIxMlx1NmEyMVx1Njc3Zg0KLV9VSV9Sb2FkbWFwX3R5cGUgPSBcdThkZWZcdTdlYmZcdTU2ZmUNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlID0gXHU2ZDQxXHU3YTBiXHU3ZWM0XHU0ZWY2DQotX1VJX1Byb2Nlc3NQYWNrYWdlX3R5cGUgPSBcdTZkNDFcdTdhMGJcdTUzMDUNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV90eXBlID0gXHU2ZDQxXHU3YTBiXHU3ZWM0XHU0ZWY2XHU2M2E1XHU1M2UzDQotX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX3R5cGUgPSBcdTZkNDFcdTdhMGJcdTdlYzRcdTRlZjZcdTYzY2ZcdThmZjBcdTdiMjYNCi1fVUlfTWV0aG9kUGx1Z2luX3R5cGUgPSBcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUgPSBcdTUzZWZcdTUzZDhcdTYwMjdcdTUxNDNcdTdkMjANCi1fVUlfTWV0aG9kVW5pdF90eXBlID0gXHU2NWI5XHU2Y2Q1XHU1MzU1XHU1MTQzDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSA9IFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLV9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUgPSBcdTZkNDFcdTdhMGJcdTdjZmJcdTUyMTcNCi1fVUlfTWV0aG9kTGlicmFyeV90eXBlID0gXHU2NWI5XHU2Y2Q1XHU1ZTkzDQotX1VJX1Vua25vd25fdHlwZSA9IFx1NWJmOVx1OGM2MQ0KLQ0KLV9VSV9Vbmtub3duX2RhdGF0eXBlPSBcdTUwM2MNCi0NCi1fVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSA9IFx1NTQwZFx1NzlmMA0KLV9VSV9NZXRob2RFbGVtZW50X2d1aWRfZmVhdHVyZSA9IEd1aWQNCi1fVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTdiODBcdTg5ODFcdTYzY2ZcdThmZjANCi1fVUlfTWV0aG9kRWxlbWVudF9vd25lZFJ1bGVzX2ZlYXR1cmUgPSBcdTYyZTVcdTY3MDlcdTc2ODRcdTg5YzRcdTUyMTkNCi1fVUlfTWV0aG9kRWxlbWVudF9zdXBwcmVzc2VkX2ZlYXR1cmUgPSBcdTVkZjJcdTYyOTFcdTUyMzYNCi1fVUlfTWV0aG9kRWxlbWVudF9vcmRlcmluZ0d1aWRlX2ZlYXR1cmUgPSBcdThiYTJcdThkMmRcdTYzMDdcdTUzNTcNCi1fVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUgPSBcdTRlM2JcdTRmNTMNCi1fVUlfQ29udGVudEVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gXHU2NTJmXHU2MzAxXHU2NzUwXHU2NTk5DQotX1VJX0NvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX2ZlYXR1cmUgPSBcdTY5ODJcdTVmZjVcdTU0OGNcdThkNDRcdTY1OTkNCi1fVUlfQ29udGVudEVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlID0gXHU2ODM4XHU1YmY5XHU4ODY4DQotX1VJX0NvbnRlbnRFbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSA9IFx1NjMwN1x1NTM1Nw0KLV9VSV9Db250ZW50RWxlbWVudF9leGFtcGxlc19mZWF0dXJlID0gXHU3OTNhXHU0ZjhiDQotX1VJX0NvbnRlbnRFbGVtZW50X2Fzc2V0c19mZWF0dXJlID0gXHU4ZDQ0XHU0ZWE3DQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUgPSBcdTY2M2VcdTc5M2FcdTU0MGRcdTc5ZjANCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHU2NjNlXHU3OTNhDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9zaGFwZWljb25fZmVhdHVyZSA9IFx1NWY2Mlx1NzJiNlx1NTZmZVx1NjgwNw0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfbm9kZWljb25fZmVhdHVyZSA9IFx1ODI4Mlx1NzBiOVx1NTZmZVx1NjgwNw0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTRlM2JcdTg5ODFcdTYzY2ZcdThmZjANCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX2ZlYXR1cmUgPSBcdTgyODINCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX2tleUNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBcdTUxNzNcdTk1MmVcdTZjZThcdTYxMGZcdTRlOGJcdTk4NzkNCi1fVUlfU2VjdGlvbl9zZWN0aW9uTmFtZV9mZWF0dXJlID0gXHU4MjgyXHU3Njg0XHU1NDBkXHU3OWYwDQotX1VJX1NlY3Rpb25fc2VjdGlvbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTgyODJcdTc2ODRcdTYzY2ZcdThmZjANCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gXHU1YjUwXHU4MjgyDQotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IFx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYQ0KLV9VSV9Sb2xlX21vZGlmaWVzX2ZlYXR1cmUgPSBcdTRmZWVcdTY1MzkNCi1fVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlID0gXHU4ZDFmXHU4ZDIzDQotX1VJX1dvcmtQcm9kdWN0X3JlcG9ydHNfZmVhdHVyZSA9IFx1NjJhNVx1NTQ0YQ0KLV9VSV9Xb3JrUHJvZHVjdF90ZW1wbGF0ZXNfZmVhdHVyZSA9IFx1NmEyMVx1Njc3Zg0KLV9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlID0gXHU1ZGU1XHU1MTc3XHU1NDExXHU1YmZjDQotX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gXHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5DQotX1VJX1Rhc2tfcGVyZm9ybWVkQnlfZmVhdHVyZSA9IFx1NjI2N1x1ODg0Y1x1ODAwNQ0KLV9VSV9UYXNrX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBcdTVmYzVcdTk3MDBcdThmOTNcdTUxNjUNCi1fVUlfVGFza19vdXRwdXRfZmVhdHVyZSA9IFx1OGY5M1x1NTFmYQ0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBcdTUxNzZcdTRlZDZcdTYyNjdcdTg4NGNcdTgwMDUNCi1fVUlfVGFza19vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBcdTUzZWZcdTkwMDlcdThmOTNcdTUxNjUNCi1fVUlfVGFza19zdGVwc19mZWF0dXJlID0gXHU2YjY1XHU5YWE0DQotX1VJX1Rhc2tfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFx1NWRlNVx1NTE3N1x1NTQxMVx1NWJmYw0KLV9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gXHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5DQotX1VJX1dvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9mZWF0dXJlID0gXHU1MjRkXHU3ZjZlXHU2NzYxXHU0ZWY2DQotX1VJX1dvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fZmVhdHVyZSA9IFx1NTQwZVx1N2Y2ZVx1Njc2MVx1NGVmNg0KLV9VSV9BcnRpZmFjdF9jb250YWluZXJBcnRpZmFjdF9mZWF0dXJlID0gXHU1YmI5XHU1NjY4XHU1ZGU1XHU0ZWY2DQotX1VJX0FydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19mZWF0dXJlID0gXHU1MzA1XHU1NDJiXHU3Njg0XHU1ZGU1XHU0ZWY2DQotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gXHU0ZWE0XHU0ZWQ4XHU3Njg0XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotX1VJX01ldGhvZFBhY2thZ2VfZ2xvYmFsX2ZlYXR1cmUgPSBcdTUxNjhcdTVjNDANCi1fVUlfTWV0aG9kUGFja2FnZV9yZXVzZWRQYWNrYWdlc19mZWF0dXJlID0gXHU1OTBkXHU3NTI4XHU3Njg0XHU1MzA1DQotX1VJX01ldGhvZFBhY2thZ2VfcGFyZW50UGFja2FnZV9mZWF0dXJlID0gXHU3MjM2XHU0ZWUzXHU1MzA1DQotX1VJX01ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19mZWF0dXJlID0gXHU1YjUwXHU0ZWUzXHU1MzA1DQotX1VJX0NvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19mZWF0dXJlID0gXHU1MTg1XHU1YmI5XHU1MTQzXHU3ZDIwDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fYnJpZWZPdXRsaW5lX2ZlYXR1cmUgPSBcdTdiODBcdThmZjANCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9yZXByZXNlbnRhdGlvbk9wdGlvbnNfZmVhdHVyZSA9IFx1OGJmNFx1NjYwZVx1OTAwOVx1OTg3OQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSA9IFx1NTkxNlx1OTBlOFx1NjgwN1x1OGJjNg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFx1NzUyOFx1OTAxNA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2ltcGFjdE9mTm90SGF2aW5nX2ZlYXR1cmUgPSBcdTRlMGRcdTUxNzdcdTY3MDlcdTc2ODRcdTVmNzFcdTU0Y2QNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9yZWFzb25zRm9yTm90TmVlZGluZ19mZWF0dXJlID0gXHU0ZTBkXHU5NzAwXHU4OTgxXHU3Njg0XHU1MzlmXHU1NmUwDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fZXh0ZXJuYWxEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHU1OTE2XHU5MGU4XHU2M2NmXHU4ZmYwDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSA9IFx1NjI1M1x1NTMwNVx1NzY4NFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fc2tpbGxzX2ZlYXR1cmUgPSBcdTYyODBcdTgwZmQNCi1fVUlfUm9sZURlc2NyaXB0aW9uX2Fzc2lnbm1lbnRBcHByb2FjaGVzX2ZlYXR1cmUgPSBcdTUyMDZcdTkxNGRcdTY1YjlcdTZjZDUNCi1fVUlfUm9sZURlc2NyaXB0aW9uX3N5bm9ueW1zX2ZlYXR1cmUgPSBcdTU0MGNcdTRlNDlcdThiY2QNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFx1NzUyOFx1OTAxNA0KLV9VSV9UYXNrRGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBcdTY2ZmZcdTRlZTNcdTY1YjlcdTY4NDgNCi1fVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl9hdHRhY2htZW50c19mZWF0dXJlID0gXHU5NjQ0XHU0ZWY2DQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYWRkaXRpb25hbEluZm9fZmVhdHVyZSA9IFx1NTE3Nlx1NGVkNlx1NGZlMVx1NjA2Zg0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3Byb2JsZW1fZmVhdHVyZSA9IFx1OTVlZVx1OTg5OA0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2JhY2tncm91bmRfZmVhdHVyZSA9IFx1ODBjY1x1NjY2Zg0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2dvYWxzX2ZlYXR1cmUgPSBcdTc2ZWVcdTY4MDcNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hcHBsaWNhdGlvbl9mZWF0dXJlID0gXHU1ZTk0XHU3NTI4XHU3YTBiXHU1ZThmDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fbGV2ZWxzT2ZBZG9wdGlvbl9mZWF0dXJlID0gXHU5MWM3XHU3NTI4XHU3Njg0XHU3ZWE3XHU1MjJiDQotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgNCi1fVUlfUG9pbnRfeV9mZWF0dXJlID0gWQ0KLV9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSA9IFx1NGY0ZFx1N2Y2ZQ0KLV9VSV9HcmFwaEVsZW1lbnRfY29udGFpbmVkX2ZlYXR1cmUgPSBcdTVkZjJcdTUzMDVcdTU0MmINCi1fVUlfR3JhcGhFbGVtZW50X2xpbmtfZmVhdHVyZSA9IFx1OTRmZVx1NjNhNQ0KLV9VSV9HcmFwaEVsZW1lbnRfYW5jaG9yYWdlX2ZlYXR1cmUgPSBcdTViOWFcdTRmNGQNCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IFx1OGJlZFx1NGU0OVx1NmEyMVx1NTc4Yg0KLV9VSV9EaWFncmFtRWxlbWVudF9pc1Zpc2libGVfZmVhdHVyZSA9IFx1NjYyZlx1NTQyNlx1NTNlZlx1ODljMQ0KLV9VSV9EaWFncmFtRWxlbWVudF9jb250YWluZXJfZmVhdHVyZSA9IFx1NWJiOVx1NTY2OA0KLV9VSV9EaWFncmFtRWxlbWVudF9yZWZlcmVuY2VfZmVhdHVyZSA9IFx1NWYxNVx1NzUyOA0KLV9VSV9EaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9mZWF0dXJlID0gXHU1YzVlXHU2MDI3DQotX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSA9IFx1N2YyOVx1NjUzZQ0KLV9VSV9EaWFncmFtTGlua192aWV3cG9ydF9mZWF0dXJlID0gXHU4OWM2XHU1MzNhDQotX1VJX0RpYWdyYW1MaW5rX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gXHU1NmZlXHU1ZjYyXHU1MTQzXHU3ZDIwDQotX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSA9IFx1NTZmZQ0KLV9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IFx1NTZmZVx1NWY2Mlx1NTE0M1x1N2QyMA0KLV9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVkZ2VfZmVhdHVyZSA9IFx1NTZmZVx1NWY2Mlx1OGZiOVx1N2YxOA0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHU2NjNlXHU3OTNhDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBcdTU2ZmVcdTVmNjJcdTUxNDNcdTdkMjANCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9kaWFncmFtX2ZlYXR1cmUgPSBcdTU2ZmUNCi1fVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUgPSBcdTViYmRcdTVlYTYNCi1fVUlfRGltZW5zaW9uX2hlaWdodF9mZWF0dXJlID0gXHU5YWQ4XHU1ZWE2DQotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHU2NjJmXHU1MzU1XHU3MmVjXHU3Njg0XHU4YmY0XHU2NjBlDQotX1VJX1JlZmVyZW5jZV9yZWZlcmVuY2VkX2ZlYXR1cmUgPSBcdTVmMTVcdTc1MjhcdTc2ODQNCi1fVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUgPSBcdTUxNzNcdTk1MmUNCi1fVUlfUHJvcGVydHlfdmFsdWVfZmVhdHVyZSA9IFx1NTAzYw0KLV9VSV9HcmFwaEVkZ2VfYW5jaG9yX2ZlYXR1cmUgPSBcdTk1MWFcdTcwYjkNCi1fVUlfR3JhcGhFZGdlX3dheXBvaW50c19mZWF0dXJlID0gXHU4ZGVmXHU3MGI5DQotX1VJX0RpYWdyYW1fem9vbV9mZWF0dXJlID0gXHU3ZjI5XHU2NTNlDQotX1VJX0RpYWdyYW1fdmlld3BvaW50X2ZlYXR1cmUgPSBcdTg5YzZcdTcwYjkNCi1fVUlfRGlhZ3JhbV9kaWFncmFtTGlua19mZWF0dXJlID0gXHU1NmZlXHU5NGZlXHU2M2E1DQotX1VJX0RpYWdyYW1fbmFtZXNwYWNlX2ZlYXR1cmUgPSBcdTU0MGRcdTc5ZjBcdTdhN2FcdTk1ZjQNCi1fVUlfR3JhcGhOb2RlX3NpemVfZmVhdHVyZSA9IFx1NTkyN1x1NWMwZg0KLV9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlSW5mb19mZWF0dXJlID0gXHU3YzdiXHU1NzhiXHU0ZmUxXHU2MDZmDQotX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlID0gXHU1MTQzXHU3ZDIwDQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IFx1NTE0M1x1N2QyMA0KLV9VSV9UZXh0RWxlbWVudF90ZXh0X2ZlYXR1cmUgPSBcdTY1ODdcdTY3MmMNCi1fVUlfSW1hZ2VfdXJpX2ZlYXR1cmUgPSBVcmkNCi1fVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSA9IE1pbWUgXHU3YzdiXHU1NzhiDQotX1VJX1BvbHlsaW5lX2Nsb3NlZF9mZWF0dXJlID0gXHU1ZGYyXHU1MTczXHU5NWVkDQotX1VJX1BvbHlsaW5lX3dheXBvaW50c19mZWF0dXJlID0gXHU4ZGVmXHU3MGI5DQotX1VJX0VsbGlwc2VfcmFkaXVzWF9mZWF0dXJlID0gXHU1MzRhXHU1Zjg0IFgNCi1fVUlfRWxsaXBzZV9yYWRpdXNZX2ZlYXR1cmUgPSBcdTUzNGFcdTVmODQgWQ0KLV9VSV9FbGxpcHNlX3JvdGF0aW9uX2ZlYXR1cmUgPSBcdTY1Y2JcdThmNmMNCi1fVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUgPSBcdThkNzdcdTU5Y2JcdTg5ZDJcdTVlYTYNCi1fVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlID0gXHU3ZWM4XHU2YjYyXHU4OWQyXHU1ZWE2DQotX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUgPSBcdTRlMmRcdTVmYzMNCi1fVUlfQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfZmVhdHVyZSA9IFx1NTIwNlx1ODllM1x1NTE0M1x1N2QyMA0KLV9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlID0gXHU4ZGVmXHU3ZWJmXHU1NmZlDQotX1VJX0FjdGl2aXR5X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IFx1NjUyZlx1NjMwMVx1Njc1MFx1NjU5OQ0KLV9VSV9BY3Rpdml0eV9jaGVja2xpc3RzX2ZlYXR1cmUgPSBcdTY4MzhcdTViZjlcdTg4NjgNCi1fVUlfQWN0aXZpdHlfY29uY2VwdHNfZmVhdHVyZSA9IFx1Njk4Mlx1NWZmNQ0KLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gXHU3OTNhXHU0ZjhiDQotX1VJX0FjdGl2aXR5X2d1aWRlbGluZXNfZmVhdHVyZSA9IFx1NjMwN1x1NTM1Nw0KLV9VSV9BY3Rpdml0eV9yZXVzYWJsZUFzc2V0c19mZWF0dXJlID0gXHU1M2VmXHU5MWNkXHU3NTI4XHU4ZDQ0XHU0ZWE3DQotX1VJX0FjdGl2aXR5X2lzRW5hY3RhYmxlX2ZlYXR1cmUgPSBcdTUzZWZcdTg5YzRcdTViOWENCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNSZXBlYXRhYmxlX2ZlYXR1cmUgPSBcdTY2MmZcdTUzZWZcdTRlZTVcdTkxY2RcdTU5MGRcdTc2ODQNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNPbmdvaW5nX2ZlYXR1cmUgPSBcdTZiNjNcdTU3MjhcdThmZGJcdTg4NGMNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNFdmVudERyaXZlbl9mZWF0dXJlID0gXHU2NjJmXHU0ZThiXHU0ZWY2XHU5YTcxXHU1MmE4XHU3Njg0DQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2xpbmtUb1ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBcdTk0ZmVcdTYzYTVcdTUyMzBcdTUxNDhcdTg4NGNcdTRmNWNcdTRlMWENCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVmaXhfZmVhdHVyZSA9IFx1NTI0ZFx1N2YwMA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlID0gXHU2NjJmXHU1ZGYyXHU4OWM0XHU1MjEyXHU3Njg0DQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlID0gXHU1ZGYyXHU1MWZhXHU3M2IwXHU1OTFhXHU2YjIxDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlID0gXHU2NjJmXHU1M2VmXHU5MDA5XHU3Njg0DQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSA9IFx1NTcyOFx1NmI2NFx1NGU0Ylx1NTQwZVx1NjYzZVx1NzkzYQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEJlZm9yZV9mZWF0dXJlID0gXHU1NzI4XHU2YjY0XHU0ZTRiXHU1MjRkXHU2NjNlXHU3OTNhDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX2ZlYXR1cmUgPSBcdTg5YzRcdTUyMTJcdTY1NzBcdTYzNmUNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9zdXBlckFjdGl2aXRpZXNfZmVhdHVyZSA9IFx1NGUwYVx1N2VhN1x1NmQzYlx1NTJhOA0KLV9VSV9UZWFtUHJvZmlsZV90ZWFtUm9sZXNfZmVhdHVyZSA9IFx1NTZlMlx1OTYxZlx1ODlkMlx1ODI3Mg0KLV9VSV9UZWFtUHJvZmlsZV9zdXBlclRlYW1fZmVhdHVyZSA9IFx1NGUwYVx1N2VhN1x1NTZlMlx1OTYxZg0KLV9VSV9UZWFtUHJvZmlsZV9zdWJUZWFtX2ZlYXR1cmUgPSBcdTRlMGJcdTdlYTdcdTU2ZTJcdTk2MWYNCi1fVUlfUm9sZURlc2NyaXB0b3JfUm9sZV9mZWF0dXJlID0gXHU4OWQyXHU4MjcyDQotX1VJX1JvbGVEZXNjcmlwdG9yX21vZGlmaWVzX2ZlYXR1cmUgPSBcdTRmZWVcdTY1MzkNCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFx1OGQxZlx1OGQyMw0KLV9VSV9Xb3JrT3JkZXJfbGlua1R5cGVfZmVhdHVyZSA9IFx1OTRmZVx1NjNhNVx1N2M3Ylx1NTc4Yg0KLV9VSV9Xb3JrT3JkZXJfcHJlZF9mZWF0dXJlID0gUHJlZA0KLV9VSV9QbGFubmluZ0RhdGFfc3RhcnREYXRlX2ZlYXR1cmUgPSBcdTVmMDBcdTU5Y2JcdTY1ZTVcdTY3MWYNCi1fVUlfUGxhbm5pbmdEYXRhX2ZpbmlzaERhdGVfZmVhdHVyZSA9IFx1N2VkM1x1Njc1Zlx1NjVlNVx1NjcxZg0KLV9VSV9QbGFubmluZ0RhdGFfcmFua19mZWF0dXJlID0gXHU3YjQ5XHU3ZWE3DQotX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUgPSBcdTY2MmZcdTRlMGVcdThkNDRcdTZlOTBcdTU0MGNcdTZiNjVcdTc2ODQNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RW50cnlTdGF0ZV9mZWF0dXJlID0gXHU2ZDNiXHU1MmE4XHU4ZmRiXHU1MTY1XHU3MmI2XHU2MDAxDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUV4aXRTdGF0ZV9mZWF0dXJlID0gXHU2ZDNiXHU1MmE4XHU5MDAwXHU1MWZhXHU3MmI2XHU2MDAxDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RlZEJ5X2ZlYXR1cmUgPSBcdTVmNzFcdTU0Y2RcdTgwMDUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdHNfZmVhdHVyZSA9IFx1NWY3MVx1NTRjZA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfZGVsaXZlcmFibGVQYXJ0c19mZWF0dXJlID0gXHU1M2VmXHU0ZWE0XHU0ZWQ4XHU5MGU4XHU0ZWY2DQotX1VJX1Rhc2tEZXNjcmlwdG9yX1Rhc2tfZmVhdHVyZSA9IFx1NGVmYlx1NTJhMQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlID0gXHU4Zjg1XHU1MmE5XHU2MjY3XHU4ODRjXHU4MDA1DQotX1VJX1Rhc2tEZXNjcmlwdG9yX2Fzc2lzdGVkQnlfZmVhdHVyZSA9IFx1NTM0Zlx1NTJhOVx1ODAwNQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUgPSBcdTU5MTZcdTkwZThcdThmOTNcdTUxNjUNCi1fVUlfVGFza0Rlc2NyaXB0b3JfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IFx1NWZjNVx1OTcwMFx1OGY5M1x1NTE2NQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBcdTUzZWZcdTkwMDlcdThmOTNcdTUxNjUNCi1fVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUgPSBcdThmOTNcdTUxZmENCi1fVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSA9IFx1NGUzYlx1NjI2N1x1ODg0Y1x1ODAwNQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9zZWxlY3RlZFN0ZXBzX2ZlYXR1cmUgPSBcdTkwMDlcdTViOWFcdTc2ODRcdTZiNjVcdTlhYTQNCi1fVUlfQ29tcG9zaXRlUm9sZV9hZ2dyZWdhdGVkUm9sZXNfZmVhdHVyZSA9IFx1ODA1YVx1OTZjNlx1NzY4NFx1ODlkMlx1ODI3Mg0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlID0gXHU0ZjdmXHU3NTI4XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gXHU3NTI4XHU5MDE0DQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBcdTY2ZmZcdTRlZTNcdTY1YjlcdTY4NDgNCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUgPSBcdTU5ODJcdTRmNTVcdThmZGJcdTg4NGNcdTRlYmFcdTU0NThcdTkxNGRcdTU5MDcNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSA9IFx1N2YyOVx1NjUzZVx1NmJkNFx1NGY4Yg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzX2ZlYXR1cmUgPSBcdTk4NzlcdTc2ZWVcdTcyNzlcdTVmODENCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcmlza0xldmVsX2ZlYXR1cmUgPSBcdTk4Y2VcdTk2NjlcdTdlYTdcdTUyMmINCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fZXN0aW1hdGluZ1RlY2huaXF1ZV9mZWF0dXJlID0gXHU0ZjMwXHU3Yjk3XHU2MjgwXHU2NzJmDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IFx1OTg3OVx1NzZlZVx1NjIxMFx1NTQ1OFx1NGUxM1x1OTU3Zg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gXHU1NDA4XHU1NDBjXHU3Njg0XHU3YzdiXHU1NzhiDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBcdTU5MTZcdTkwZThcdTY4MDdcdThiYzYNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3Njb3BlX2ZlYXR1cmUgPSBcdTgzMDNcdTU2ZjQNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3VzYWdlTm90ZXNfZmVhdHVyZSA9IFx1NGY3Zlx1NzUyOFx1OGJmNFx1NjYwZQ0KLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fcmVmaW5lZERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTRmMThcdTUzMTZcdTc2ODRcdTYzY2ZcdThmZjANCi1fVUlfUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX2ZlYXR1cmUgPSBcdTRlMGJcdTdlYTdcdTViOWVcdThkZjUNCi1fVUlfUHJhY3RpY2VfY29udGVudFJlZmVyZW5jZXNfZmVhdHVyZSA9IFx1NTE4NVx1NWJiOVx1NWYxNVx1NzUyOA0KLV9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSA9IFx1NmQzYlx1NTJhOFx1NWYxNVx1NzUyOA0KLV9VSV9TdGF0ZV9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotX1VJX1N0YXRlX1JlZ2lvbl9mZWF0dXJlID0gXHU1MzNhXHU1N2RmDQotX1VJX1N0YXRlX3N1Ym1hY2hpbmVfZmVhdHVyZSA9IFx1NWI1MFx1NjczYQ0KLV9VSV9WZXJ0ZXhfY29udGFpbmVyX2ZlYXR1cmUgPSBcdTViYjlcdTU2NjgNCi1fVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUgPSBcdTUxZmFcdTdhZDkNCi1fVUlfVmVydGV4X2luY29taW5nX2ZlYXR1cmUgPSBcdTUxNjVcdTdhZDkNCi1fVUlfUmVnaW9uX1ZlcnRleF9mZWF0dXJlID0gXHU5ODc2XHU3MGI5DQotX1VJX1JlZ2lvbl9UcmFuc2l0aW9uX2ZlYXR1cmUgPSBcdTc5ZmJcdTRlYTQNCi1fVUlfUmVnaW9uX1N0YXRlX2ZlYXR1cmUgPSBcdTcyYjZcdTYwMDENCi1fVUlfUmVnaW9uX1N0YXRlTWFjaGluZV9mZWF0dXJlID0gXHU3MmI2XHU2MDAxXHU2NzNhDQotX1VJX1N0YXRlTWFjaGluZV9SZWdpb25fZmVhdHVyZSA9IFx1NTMzYVx1NTdkZg0KLV9VSV9UcmFuc2l0aW9uX1dvcmtEZWZpbml0aW9uX2ZlYXR1cmUgPSBcdTVkZTVcdTRmNWNcdTViOWFcdTRlNDkNCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IFx1NWJiOVx1NTY2OA0KLV9VSV9UcmFuc2l0aW9uX3NvdXJjZV9mZWF0dXJlID0gXHU2ZTkwDQotX1VJX1RyYW5zaXRpb25fdGFyZ2V0X2ZlYXR1cmUgPSBcdTc2ZWVcdTY4MDcNCi1fVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlID0gXHU0ZWZiXHU1MmExDQotX1VJX0Rpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9mZWF0dXJlID0gXHU1YjUwXHU4OWM0XHU3YTBiDQotX1VJX0Rpc2NpcGxpbmVfcmVmZXJlbmNlV29ya2Zsb3dzX2ZlYXR1cmUgPSBcdTVmMTVcdTc1MjhcdTVkZTVcdTRmNWNcdTZkNDENCi1fVUlfUm9sZVNldF9yb2xlc19mZWF0dXJlID0gXHU4OWQyXHU4MjcyDQotX1VJX0RvbWFpbl93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLV9VSV9Eb21haW5fc3ViZG9tYWluc19mZWF0dXJlID0gXHU1YjUwXHU1N2RmDQotX1VJX1dvcmtQcm9kdWN0VHlwZV93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IFx1ODljNFx1N2EwYg0KLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBcdTVkZTVcdTUxNzdcdTU0MTFcdTViZmMNCi1fVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUgPSBcdTg5ZDJcdTgyNzJcdTk2YzYNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlID0gXHU1MjA2XHU3YzdiXHU1MTQzXHU3ZDIwDQotX1VJX0N1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfZmVhdHVyZSA9IFx1NWI1MFx1N2M3Yg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUgPSBcdTY1NTlcdTViNjZcdTY3NTBcdTY1OTkNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBcdTkwMWFcdTRmZTFcdTY3NTBcdTY1OTkNCi1fVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUgPSBcdTUzMDVcdTU0MmJcdTZhMjFcdTVmMGYNCi1fVUlfUHJvY2Vzc19kZWZhdWx0Q29udGV4dF9mZWF0dXJlID0gXHU3ZjNhXHU3NzAxXHU3M2FmXHU1ODgzDQotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBcdTY3MDlcdTY1NDhcdTczYWZcdTU4ODMNCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlID0gXHU1N2ZhXHU0ZThlXHU2ZDQxXHU3YTBiDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfaW50ZXJmYWNlc19mZWF0dXJlID0gXHU2M2E1XHU1M2UzDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gXHU2ZDQxXHU3YTBiDQotX1VJX1Byb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19mZWF0dXJlID0gXHU2ZDQxXHU3YTBiXHU1MTQzXHU3ZDIwDQotX1VJX1Byb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX2ZlYXR1cmUgPSBcdTU2ZmUNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19mZWF0dXJlID0gXHU2M2E1XHU1M2UzXHU4OWM0XHU4MzAzDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fZmVhdHVyZSA9IFx1NjNhNVx1NTNlMyBJTw0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUgPSBcdTZkNDFcdTdhMGJcdTdlYzRcdTRlZjYNCi1fVUlfTWV0aG9kUGx1Z2luX3VzZXJDaGFuZ2VhYmxlX2ZlYXR1cmUgPSBcdTUzZWZcdTY2ZjRcdTY1MzlcdTc2ODRcdTc1MjhcdTYyMzcNCi1fVUlfTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX2ZlYXR1cmUgPSBcdTY1YjlcdTZjZDVcdTUzMDUNCi1fVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUgPSBcdTU3ZmFcdTY3MmNcdTc1MjhcdTRmOGINCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlID0gXHU1M2VmXHU1M2Q4XHU2MDI3XHU3YzdiXHU1NzhiDQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBcdTU3ZmFcdTRlOGVcdTUxNDNcdTdkMjBcdTc2ODRcdTUzZWZcdTUzZDhcdTYwMjcNCi1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBcdTRmNWNcdTgwMDUNCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUgPSBcdTY2ZjRcdTY1MzlcdTY1ZTVcdTY3MWYNCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHU2NmY0XHU2NTM5XHU2M2NmXHU4ZmYwDQotX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlID0gXHU3MjQ4XHU2NzJjDQotX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUgPSBcdTcyNDhcdTY3NDNcdTU4ZjBcdTY2MGUNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSA9IFx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNlx1OTAwOVx1NjJlOQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBhY2thZ2VTZWxlY3Rpb25fZmVhdHVyZSA9IFx1NjViOVx1NmNkNVx1NTMwNVx1OTAwOVx1NjJlOQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlID0gXHU2ZDQxXHU3YTBiXHU4OWM2XHU1NmZlDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fZGVmYXVsdFZpZXdfZmVhdHVyZSA9IFx1N2YzYVx1NzcwMVx1ODljNlx1NTZmZQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gXHU1N2ZhXHU2NzJjXHU5MTRkXHU3ZjZlDQotX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSA9IFx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYg0KLV9VSV9NZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfZmVhdHVyZSA9IFx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLV9VSV9NZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19mZWF0dXJlID0gXHU5ODg0XHU1YjlhXHU0ZTQ5XHU5MTRkXHU3ZjZlDQotX1VJX1Vua25vd25fZmVhdHVyZSA9IFx1NjcyYVx1NjMwN1x1NWI5YQ0KLQ0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvU3RhcnRfbGl0ZXJhbCA9IGZpbmlzaFRvU3RhcnQNCi1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb0ZpbmlzaF9saXRlcmFsID0gZmluaXNoVG9GaW5pc2gNCi1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvU3RhcnRfbGl0ZXJhbCA9IHN0YXJ0VG9TdGFydA0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9GaW5pc2hfbGl0ZXJhbCA9IHN0YXJ0VG9GaW5pc2gNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2luaXRpYWxfbGl0ZXJhbCA9IFx1NTIxZFx1NTljYg0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gXHU4ZmRlXHU2M2E1DQotX1VJX1BzZXVkb1N0YXRlS2luZF9mb3JrX2xpdGVyYWwgPSBcdTUyMDZcdTUzYzkNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBcdTdlZDNcdTcwYjkNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2Nob2ljZV9saXRlcmFsID0gXHU5MDA5XHU5ODc5DQotX1VJX1BzZXVkb1N0YXRlS2luZF9lbnRyeVBvaW50X2xpdGVyYWwgPSBcdTUxNjVcdTUzZTNcdTcwYjkNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gXHU1MWZhXHU1M2UzXHU3MGI5DQotX1VJX1BzZXVkb1N0YXRlS2luZF90ZXJtaW5hdGVfbGl0ZXJhbCA9IFx1N2VjOFx1NmI2Mg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbmFfbGl0ZXJhbCA9IFx1NGUwZFx1OTAwMlx1NzUyOA0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfY29udHJpYnV0ZXNfbGl0ZXJhbCA9IFx1NjNkMFx1NGY5Yg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gXHU2MjY5XHU1YzU1DQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9yZXBsYWNlc19saXRlcmFsID0gXHU2NmZmXHU2MzYyDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbENvbnRyaWJ1dGlvbl9saXRlcmFsID0gXHU2NzJjXHU1NzMwXHU2M2QwXHU0ZjliDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbFJlcGxhY2VtZW50X2xpdGVyYWwgPSBcdTY3MmNcdTU3MzBcdTY2ZmZcdTYzNjINCi1fVUlfQXJ0aWZhY3REZXNjcmlwdG9yX3R5cGUgPSBcdTVkZTVcdTRlZjZcdTYzY2ZcdThmZjBcdTdiMjYNCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBcdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjZcdTYzY2ZcdThmZjBcdTdiMjYNCi1fVUlfT3V0Y29tZURlc2NyaXB0b3JfdHlwZSA9IFx1N2VkM1x1Njc5Y1x1NjNjZlx1OGZmMFx1N2IyNg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWJmNThjMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1wbHVnaW5OYW1lID0gRU1GIFVNQSBFZGl0IFN1cHBvcnQNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0ID0gezB9DQotX1VJX0NyZWF0ZUNoaWxkX3RleHQyID0gezF9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MyA9IHsxfQ0KLV9VSV9DcmVhdGVDaGlsZF90b29sdGlwID0gXHU1NzI4IHsxfSBcdTcyNzlcdTYwMjdcdTRlMGJcdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODQgezB9DQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gXHU3MGJhXHU2MjQwXHU5MDc4IHsyfSBcdTc2ODQgezF9IFx1NzI3OVx1NjAyN1x1NWVmYVx1N2FjYiB7MH0gXHU5ODVlXHU1NzhiXHU3Njg0XHU1YjUwXHU5ODA1XHUzMDAyDQotX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBcdTU3MjhcdTUxNzZcdTZiY2RcdTk4MDVcdTc2ODQgezF9IFx1NzI3OVx1NjAyN1x1NGUwYlx1ZmYwY1x1NzBiYVx1NjI0MFx1OTA3OFx1NzY4NCB7Mn0gXHU1ZWZhXHU3YWNiIHswfSBcdTk4NWVcdTU3OGJcdTc2ODRcdTY1YjBcdTU0MGNcdTVjNjRcdTdkMWFcdTk4MDVcdTMwMDINCi0NCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gezF9IFx1NzY4NCB7MH0NCi0NCi1fVUlfQ2xhc3NpZmllcl90eXBlID0gXHU1MjA2XHU5ODVlXHU1NjY4DQotX1VJX1R5cGVfdHlwZSA9IFx1OTg1ZVx1NTc4Yg0KLV9VSV9FbGVtZW50X3R5cGUgPSBcdTUxNDNcdTdkMjANCi1fVUlfTmFtZWRFbGVtZW50X3R5cGUgPSBcdTUxNzdcdTU0MGRcdTUxNDNcdTdkMjANCi1fVUlfUGFja2FnZWFibGVFbGVtZW50X3R5cGUgPSBcdTUzZWZcdTUzMDVcdTg4ZGRcdTc2ODRcdTUxNDNcdTdkMjANCi1fVUlfUGFja2FnZV90eXBlID0gXHU1OTU3XHU0ZWY2DQotX1VJX05hbWVzcGFjZV90eXBlID0gXHU1NDBkXHU3YTMxXHU3YTdhXHU5NTkzDQotX1VJX01ldGhvZEVsZW1lbnRfdHlwZSA9IFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMA0KLV9VSV9Db25zdHJhaW50X3R5cGUgPSBcdTk2NTBcdTUyMzZcdTk4MDUNCi1fVUlfQ29udGVudEVsZW1lbnRfdHlwZSA9IFx1NTE2N1x1NWJiOVx1NTE0M1x1N2QyMA0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IFx1NTNlZlx1OGFhYVx1NjYwZVx1NzY4NFx1NTE0M1x1N2QyMA0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSA9IFx1NTE2N1x1NWJiOVx1OGFhYVx1NjYwZQ0KLV9VSV9TZWN0aW9uX3R5cGUgPSBcdTdiYzANCi1fVUlfUm9sZV90eXBlID0gXHU4OWQyXHU4MjcyDQotX1VJX1dvcmtQcm9kdWN0X3R5cGUgPSBcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCi1fVUlfVGFza190eXBlID0gXHU0ZjVjXHU2OTZkDQotX1VJX1dvcmtEZWZpbml0aW9uX3R5cGUgPSBcdTVkZTVcdTRmNWNcdTViOWFcdTdmYTkNCi1fVUlfU3RlcF90eXBlID0gXHU2YjY1XHU5YTVmDQotX1VJX0d1aWRhbmNlX3R5cGUgPSBcdTYzMDdcdTVmMTUNCi1fVUlfQXJ0aWZhY3RfdHlwZSA9IFx1NjljYlx1NGVmNg0KLV9VSV9EZWxpdmVyYWJsZV90eXBlID0gXHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlDQotX1VJX091dGNvbWVfdHlwZSA9IFx1OGYzOFx1NTFmYVx1N2Q1MFx1Njc5Yw0KLV9VSV9NZXRob2RQYWNrYWdlX3R5cGUgPSBcdTY1YjlcdTZjZDVcdTU5NTdcdTRlZjYNCi1fVUlfQ29udGVudFBhY2thZ2VfdHlwZSA9IFx1NTE2N1x1NWJiOVx1NTk1N1x1NGVmNg0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUgPSBcdTY5Y2JcdTRlZjZcdThhYWFcdTY2MGUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlID0gXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU4YWFhXHU2NjBlDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSA9IFx1NGVhNFx1NGVkOFx1OTgwNVx1NzZlZVx1OGFhYVx1NjYwZQ0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSA9IFx1ODlkMlx1ODI3Mlx1OGFhYVx1NjYwZQ0KLV9VSV9UYXNrRGVzY3JpcHRpb25fdHlwZSA9IFx1NGY1Y1x1Njk2ZFx1OGFhYVx1NjYwZQ0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUgPSBcdTYzMDdcdTVmMTVcdThhYWFcdTY2MGUNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlID0gXHU3ZGY0XHU3ZmQyXHU4YWFhXHU2NjBlDQotX1VJX1BvaW50X3R5cGUgPSBcdTllZGUNCi1fVUlfR3JhcGhFbGVtZW50X3R5cGUgPSBcdTU3MTZcdTVmNjJcdTUxNDNcdTdkMjANCi1fVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSA9IFx1NTcxNlx1ODllM1x1NTE0M1x1N2QyMA0KLV9VSV9EaWFncmFtTGlua190eXBlID0gXHU1NzE2XHU4OWUzXHU5M2M4XHU3ZDUwDQotX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUgPSBcdTU3MTZcdTVmNjJcdTkwMjNcdTYzYTVcdTU2NjgNCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gXHU4YTllXHU2MTBmXHU2YTIxXHU1NzhiXHU2YTRiXHU2M2E1XHU1NjY4DQotX1VJX0RpbWVuc2lvbl90eXBlID0gXHU3ZGFkXHU1ZWE2DQotX1VJX1JlZmVyZW5jZV90eXBlID0gXHU1M2MzXHU3MTY3DQotX1VJX1Byb3BlcnR5X3R5cGUgPSBcdTUxNjdcdTViYjkNCi1fVUlfR3JhcGhFZGdlX3R5cGUgPSBcdTU3MTZcdTVmNjJcdTkwOGFcdTdkZTMNCi1fVUlfRGlhZ3JhbV90eXBlID0gXHU1NzE2XHU4OWUzDQotX1VJX0dyYXBoTm9kZV90eXBlID0gXHU1NzE2XHU1ZjYyXHU3YmMwXHU5ZWRlDQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUgPSBcdTdjMjFcdTVmMGZcdThhOWVcdTYxMGZcdTZhMjFcdTU3OGJcdTUxNDNcdTdkMjANCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gVU1BIFx1OGE5ZVx1NjEwZlx1NmEyMVx1NTc4Ylx1NmE0Ylx1NjNhNVx1NTY2OA0KLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gXHU2ODM4XHU1ZmMzXHU4YTllXHU2MTBmXHU2YTIxXHU1NzhiXHU2YTRiXHU2M2E1XHU1NjY4DQotX1VJX0xlYWZFbGVtZW50X3R5cGUgPSBcdTg0NDlcdTdiYzBcdTllZGVcdTUxNDNcdTdkMjANCi1fVUlfVGV4dEVsZW1lbnRfdHlwZSA9IFx1NjU4N1x1NWI1N1x1NTE0M1x1N2QyMA0KLV9VSV9JbWFnZV90eXBlID0gXHU1ZjcxXHU1MGNmDQotX1VJX0dyYXBoaWNQcmltaXRpdmVfdHlwZSA9IFx1NTcxNlx1NWY2Mlx1NTE0M1x1N2QyMA0KLV9VSV9Qb2x5bGluZV90eXBlID0gXHU2Mjk4XHU3ZGRhDQotX1VJX0VsbGlwc2VfdHlwZSA9IFx1NmE2Mlx1NTcxMw0KLV9VSV9BY3Rpdml0eV90eXBlID0gXHU2ZDNiXHU1MmQ1DQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUgPSBcdTVkZTVcdTRmNWNcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjANCi1fVUlfQnJlYWtkb3duRWxlbWVudF90eXBlID0gXHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwDQotX1VJX01pbGVzdG9uZV90eXBlID0gXHU3YmExXHU1MjM2XHU5ZWRlDQotX1VJX0l0ZXJhdGlvbl90eXBlID0gXHU1M2NkXHU4OTg2DQotX1VJX1BoYXNlX3R5cGUgPSBcdTk2OGVcdTZiYjUNCi1fVUlfVGVhbVByb2ZpbGVfdHlwZSA9IFx1NTcxOFx1OTY4YVx1OGEyZFx1NWI5YVx1NmE5NA0KLV9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlID0gXHU4OWQyXHU4MjcyXHU2M2NmXHU4ZmYwXHU1YjUwDQotX1VJX1dvcmtPcmRlcl90eXBlID0gXHU1ZGU1XHU0ZjVjXHU2YjIxXHU1ZThmDQotX1VJX1Byb2Nlc3NFbGVtZW50X3R5cGUgPSBcdTdhMGJcdTVlOGZcdTUxNDNcdTdkMjANCi1fVUlfUGxhbm5pbmdEYXRhX3R5cGUgPSBcdTg5OGZcdTUyODNcdThjYzdcdTY1OTkNCi1fVUlfRGVzY3JpcHRvcl90eXBlID0gXHU2M2NmXHU4ZmYwXHU1YjUwDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlID0gXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU2M2NmXHU4ZmYwXHU1YjUwDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUgPSBcdTRmNWNcdTY5NmRcdTYzY2ZcdThmZjBcdTViNTANCi1fVUlfQ29tcG9zaXRlUm9sZV90eXBlID0gXHU4OTA3XHU1NDA4XHU4OWQyXHU4MjcyDQotX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl90eXBlID0gXHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwXHU4YWFhXHU2NjBlDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSA9IFx1NmQzYlx1NTJkNVx1OGFhYVx1NjYwZQ0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gXHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiXHU4YWFhXHU2NjBlDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gXHU3YTBiXHU1ZThmXHU4YWFhXHU2NjBlDQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gXHU2M2NmXHU4ZmYwXHU1YjUwXHU4YWFhXHU2NjBlDQotX1VJX0NvbmNlcHRfdHlwZSA9IFx1Njk4Mlx1NWZmNQ0KLV9VSV9DaGVja2xpc3RfdHlwZSA9IFx1NjgzOFx1NWMwZFx1NmUwNVx1NTVhZQ0KLV9VSV9FeGFtcGxlX3R5cGUgPSBcdTdiYzRcdTRmOGINCi1fVUlfR3VpZGVsaW5lX3R5cGUgPSBcdTZlOTZcdTUyNDcNCi1fVUlfUmVwb3J0X3R5cGUgPSBcdTU4MzFcdTU0NGENCi1fVUlfVGVtcGxhdGVfdHlwZSA9IFx1N2JjNFx1NjcyYw0KLV9VSV9TdXBwb3J0aW5nTWF0ZXJpYWxfdHlwZSA9IFx1NjUyZlx1NjNmNFx1OGNjN1x1NjU5OQ0KLV9VSV9Ub29sTWVudG9yX3R5cGUgPSBcdTVkZTVcdTUxNzdcdThmMTRcdTUyYTkNCi1fVUlfV2hpdGVwYXBlcl90eXBlID0gXHU3NjdkXHU3NmFlXHU2NmY4DQotX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUgPSBcdThhNWVcdTVmNTlcdTViOWFcdTdmYTkNCi1fVUlfUHJhY3RpY2VfdHlwZSA9IFx1N2RmNFx1N2ZkMg0KLV9VSV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdHlwZSA9IFx1OTgxMFx1NGYzMFx1ODAwM1x1OTFjZg0KLV9VSV9SZXVzYWJsZUFzc2V0X3R5cGUgPSBcdTUzZWZcdTkxY2RcdTg5MDdcdTRmN2ZcdTc1MjhcdTc2ODRcdThjYzdcdTc1MjINCi1fVUlfU3RhdGVfdHlwZSA9IFx1NzJjMFx1NjE0Yg0KLV9VSV9WZXJ0ZXhfdHlwZSA9IFx1OTgwMlx1OWVkZQ0KLV9VSV9SZWdpb25fdHlwZSA9IFx1NTM0MFx1NTdkZg0KLV9VSV9TdGF0ZU1hY2hpbmVfdHlwZSA9IFx1NzJjMFx1NjE0Ylx1NmE1Zg0KLV9VSV9UcmFuc2l0aW9uX3R5cGUgPSBcdThmNDlcdTYzZGINCi1fVUlfUHNldWRvU3RhdGVfdHlwZSA9IFx1NTA0N1x1NzJjMFx1NjE0Yg0KLV9VSV9EaXNjaXBsaW5lX3R5cGUgPSBcdTg5OGZcdTdiYzQNCi1fVUlfQ29udGVudENhdGVnb3J5X3R5cGUgPSBcdTUxNjdcdTViYjlcdTdhMmVcdTk4NWUNCi1fVUlfUm9sZVNldF90eXBlID0gXHU4OWQyXHU4MjcyXHU5NmM2DQotX1VJX0RvbWFpbl90eXBlID0gXHU5ODE4XHU1N2RmDQotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU5ODVlXHU1NzhiDQotX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlID0gXHU4OThmXHU3YmM0XHU1MjA2XHU3ZDQ0DQotX1VJX1Rvb2xfdHlwZSA9IFx1NWRlNVx1NTE3Nw0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSA9IFx1ODlkMlx1ODI3Mlx1OTZjNlx1NTIwNlx1N2Q0NA0KLV9VSV9DdXN0b21DYXRlZ29yeV90eXBlID0gXHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlID0gXHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiDQotX1VJX1Byb2Nlc3NfdHlwZSA9IFx1N2EwYlx1NWU4Zg0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlID0gXHU1MjlmXHU4MGZkXHU1NzhiXHU2YTIzDQotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUgPSBcdTdhMGJcdTVlOGZcdTg5OGZcdTUyODNcdTdiYzRcdTY3MmMNCi1fVUlfUm9hZG1hcF90eXBlID0gXHU1YzBlXHU4OWJkXHU1NzE2DQotX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSA9IFx1N2EwYlx1NWU4Zlx1NTE0M1x1NGVmNg0KLV9VSV9Qcm9jZXNzUGFja2FnZV90eXBlID0gXHU3YTBiXHU1ZThmXHU1OTU3XHU0ZWY2DQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfdHlwZSA9IFx1N2EwYlx1NWU4Zlx1NTE0M1x1NGVmNlx1NGVjYlx1OTc2Mg0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlID0gXHU3YTBiXHU1ZThmXHU1MTQzXHU0ZWY2XHU2M2NmXHU4ZmYwXHU1YjUwDQotX1VJX01ldGhvZFBsdWdpbl90eXBlID0gXHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlID0gXHU4YjhhXHU1MzE2XHU2MDI3XHU1MTQzXHU3ZDIwDQotX1VJX01ldGhvZFVuaXRfdHlwZSA9IFx1NjViOVx1NmNkNVx1NTVhZVx1NGY0ZA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUgPSBcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi1fVUlfUHJvY2Vzc0ZhbWlseV90eXBlID0gXHU3YTBiXHU1ZThmXHU3Y2ZiXHU1MjE3DQotX1VJX01ldGhvZExpYnJhcnlfdHlwZSA9IFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYg0KLV9VSV9Vbmtub3duX3R5cGUgPSBcdTcyNjlcdTRlZjYNCi0NCi1fVUlfVW5rbm93bl9kYXRhdHlwZT0gXHU1MDNjDQotDQotX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUgPSBcdTU0MGRcdTdhMzENCi1fVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUgPSBHdWlkDQotX1VJX01ldGhvZEVsZW1lbnRfYnJpZWZEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHU3YzIxXHU4OTgxXHU4YWFhXHU2NjBlDQotX1VJX01ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19mZWF0dXJlID0gXHU4OThmXHU1MjQ3XHU2NGMxXHU2NzA5XHU4MDA1DQotX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlID0gXHU1M2Q3XHU2MjkxXHU1MjM2DQotX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlID0gXHU2MzkyXHU1ZThmXHU2MzA3XHU1ZjE1DQotX1VJX0NvbnN0cmFpbnRfYm9keV9mZWF0dXJlID0gXHU0ZTNiXHU5YWQ0DQotX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IFx1NjUyZlx1NjNmNFx1OGNjN1x1NjU5OQ0KLV9VSV9Db250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19mZWF0dXJlID0gXHU2OTgyXHU1ZmY1XHU1NDhjXHU3NjdkXHU3NmFlXHU2NmY4DQotX1VJX0NvbnRlbnRFbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSA9IFx1NjgzOFx1NWMwZFx1NmUwNVx1NTVhZQ0KLV9VSV9Db250ZW50RWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBcdTZlOTZcdTUyNDcNCi1fVUlfQ29udGVudEVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSA9IFx1N2JjNFx1NGY4Yg0KLV9VSV9Db250ZW50RWxlbWVudF9hc3NldHNfZmVhdHVyZSA9IFx1OGNjN1x1NzUyMg0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uTmFtZV9mZWF0dXJlID0gXHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fZmVhdHVyZSA9IFx1NTQ0OFx1NzNmZVx1NjViOVx1NWYwZg0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBTaGFwZWljb24NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBOb2RlaWNvbg0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTRlM2JcdTg5ODFcdThhYWFcdTY2MGUNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX2ZlYXR1cmUgPSBcdTdiYzANCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX2tleUNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBcdTRlM2JcdTg5ODFcdTgwMDNcdTkxY2YNCi1fVUlfU2VjdGlvbl9zZWN0aW9uTmFtZV9mZWF0dXJlID0gXHU1MzQwXHU2YmI1XHU1NDBkXHU3YTMxDQotX1VJX1NlY3Rpb25fc2VjdGlvbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTUzNDBcdTZiYjVcdThhYWFcdTY2MGUNCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gXHU1YjUwXHU1MzQwXHU2YmI1DQotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IFx1NTI0ZFx1NGUwMFx1NzI0OA0KLV9VSV9Sb2xlX21vZGlmaWVzX2ZlYXR1cmUgPSBcdTRmZWVcdTY1MzlcdTk4MDVcdTc2ZWUNCi1fVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlID0gXHU4Y2EwXHU4Y2FjDQotX1VJX1dvcmtQcm9kdWN0X3JlcG9ydHNfZmVhdHVyZSA9IFx1NTgzMVx1NTQ0YQ0KLV9VSV9Xb3JrUHJvZHVjdF90ZW1wbGF0ZXNfZmVhdHVyZSA9IFx1N2JjNFx1NjcyYw0KLV9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlID0gXHU1ZGU1XHU1MTc3XHU4ZjE0XHU1MmE5DQotX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gXHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmDQotX1VJX1Rhc2tfcGVyZm9ybWVkQnlfZmVhdHVyZSA9IFx1NTdmN1x1ODg0Y1x1ODAwNQ0KLV9VSV9UYXNrX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBcdTVmMzdcdTUyMzZcdThmMzhcdTUxNjUNCi1fVUlfVGFza19vdXRwdXRfZmVhdHVyZSA9IFx1OGYzOFx1NTFmYQ0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBcdTUxNzZcdTRlZDZcdTU3ZjdcdTg4NGNcdTgwMDUNCi1fVUlfVGFza19vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBcdTkwNzhcdTc1MjhcdThmMzhcdTUxNjUNCi1fVUlfVGFza19zdGVwc19mZWF0dXJlID0gXHU2YjY1XHU5YTVmDQotX1VJX1Rhc2tfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFx1NWRlNVx1NTE3N1x1OGYxNFx1NTJhOQ0KLV9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gXHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmDQotX1VJX1dvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9mZWF0dXJlID0gXHU1MjRkXHU3ZjZlXHU2ODlkXHU0ZWY2DQotX1VJX1dvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fZmVhdHVyZSA9IFx1NWY4Y1x1N2Y2ZVx1Njg5ZFx1NGVmNg0KLV9VSV9BcnRpZmFjdF9jb250YWluZXJBcnRpZmFjdF9mZWF0dXJlID0gXHU1MTMyXHU1YjU4XHU1NjY4XHU2OWNiXHU0ZWY2DQotX1VJX0FydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19mZWF0dXJlID0gXHU1MTY3XHU1NDJiXHU3Njg0XHU2OWNiXHU0ZWY2DQotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gXHU5MDVlXHU5MDAxXHU3Njg0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljDQotX1VJX01ldGhvZFBhY2thZ2VfZ2xvYmFsX2ZlYXR1cmUgPSBcdTVlZTNcdTU3ZGYNCi1fVUlfTWV0aG9kUGFja2FnZV9yZXVzZWRQYWNrYWdlc19mZWF0dXJlID0gXHU5MWNkXHU4OTA3XHU0ZjdmXHU3NTI4XHU3Njg0XHU1OTU3XHU0ZWY2DQotX1VJX01ldGhvZFBhY2thZ2VfcGFyZW50UGFja2FnZV9mZWF0dXJlID0gXHU2YmNkXHU5ODA1XHU1OTU3XHU0ZWY2DQotX1VJX01ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19mZWF0dXJlID0gXHU1YjUwXHU5ODA1XHU1OTU3XHU0ZWY2DQotX1VJX0NvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19mZWF0dXJlID0gXHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fYnJpZWZPdXRsaW5lX2ZlYXR1cmUgPSBcdTY5ODJcdTc1NjVcdThmMmFcdTVlZDMNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9yZXByZXNlbnRhdGlvbk9wdGlvbnNfZmVhdHVyZSA9IFx1ODg2OFx1NzkzYVx1NmNkNVx1OTA3OFx1OTgwNQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSA9IFx1NTkxNlx1OTBlOCBJRA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFx1NzZlZVx1NzY4NA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2ltcGFjdE9mTm90SGF2aW5nX2ZlYXR1cmUgPSBcdTdmM2FcdTRlNGZcdTY2NDJcdTc2ODRcdTVmNzFcdTk3ZmYNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9yZWFzb25zRm9yTm90TmVlZGluZ19mZWF0dXJlID0gXHU0ZTBkXHU5NzAwXHU4OTgxXHU3Njg0XHU3NDA2XHU3NTMxDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fZXh0ZXJuYWxEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHU1OTE2XHU5MGU4XHU4YWFhXHU2NjBlDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSA9IFx1NTMwNVx1ODhkZFx1NjMwN1x1NWYxNQ0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fc2tpbGxzX2ZlYXR1cmUgPSBcdTYyODBcdTVkZTcNCi1fVUlfUm9sZURlc2NyaXB0aW9uX2Fzc2lnbm1lbnRBcHByb2FjaGVzX2ZlYXR1cmUgPSBcdTYzMDdcdTZkM2VcdTY1YjlcdTZjZDUNCi1fVUlfUm9sZURlc2NyaXB0aW9uX3N5bm9ueW1zX2ZlYXR1cmUgPSBcdTU0MGNcdTdmYTlcdTViNTcNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFx1NzZlZVx1NzY4NA0KLV9VSV9UYXNrRGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBcdTY2ZmZcdTRlZTNcdTY1YjlcdTY4NDgNCi1fVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl9hdHRhY2htZW50c19mZWF0dXJlID0gXHU5NjQ0XHU0ZWY2DQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYWRkaXRpb25hbEluZm9fZmVhdHVyZSA9IFx1NTE3Nlx1NGVkNlx1OGNjN1x1OGEwYQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3Byb2JsZW1fZmVhdHVyZSA9IFx1NTU0Zlx1OTg0Yw0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2JhY2tncm91bmRfZmVhdHVyZSA9IFx1ODBjY1x1NjY2Zg0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2dvYWxzX2ZlYXR1cmUgPSBcdTc2ZWVcdTZhMTkNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hcHBsaWNhdGlvbl9mZWF0dXJlID0gXHU2MWM5XHU3NTI4XHU3YTBiXHU1ZjBmDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fbGV2ZWxzT2ZBZG9wdGlvbl9mZWF0dXJlID0gXHU2M2ExXHU3NTI4XHU1YzY0XHU2YjIxDQotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgNCi1fVUlfUG9pbnRfeV9mZWF0dXJlID0gWQ0KLV9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSA9IFx1NGY0ZFx1N2Y2ZQ0KLV9VSV9HcmFwaEVsZW1lbnRfY29udGFpbmVkX2ZlYXR1cmUgPSBcdTVkZjJcdTUxNjdcdTU0MmINCi1fVUlfR3JhcGhFbGVtZW50X2xpbmtfZmVhdHVyZSA9IFx1OTNjOFx1N2Q1MA0KLV9VSV9HcmFwaEVsZW1lbnRfYW5jaG9yYWdlX2ZlYXR1cmUgPSBBbmNob3JhZ2UNCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IFx1OGE5ZVx1NjEwZlx1NmEyMVx1NTc4Yg0KLV9VSV9EaWFncmFtRWxlbWVudF9pc1Zpc2libGVfZmVhdHVyZSA9IFx1NTNlZlx1ODk4Ylx1NzY4NA0KLV9VSV9EaWFncmFtRWxlbWVudF9jb250YWluZXJfZmVhdHVyZSA9IFx1NTEzMlx1NWI1OFx1NTY2OA0KLV9VSV9EaWFncmFtRWxlbWVudF9yZWZlcmVuY2VfZmVhdHVyZSA9IFx1NTNjM1x1NzE2Nw0KLV9VSV9EaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9mZWF0dXJlID0gXHU1MTY3XHU1YmI5DQotX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSA9IFx1N2UyZVx1NjUzZQ0KLV9VSV9EaWFncmFtTGlua192aWV3cG9ydF9mZWF0dXJlID0gXHU2YWEyXHU4OTk2XHU1N2UwDQotX1VJX0RpYWdyYW1MaW5rX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gXHU1NzE2XHU1ZjYyXHU1MTQzXHU3ZDIwDQotX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSA9IFx1NTcxNlx1ODllMw0KLV9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IFx1NTcxNlx1NWY2Mlx1NTE0M1x1N2QyMA0KLV9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVkZ2VfZmVhdHVyZSA9IFx1NTcxNlx1NWY2Mlx1OTA4YVx1N2RlMw0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHU1NDQ4XHU3M2ZlXHU2NWI5XHU1ZjBmDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBcdTU3MTZcdTVmNjJcdTUxNDNcdTdkMjANCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9kaWFncmFtX2ZlYXR1cmUgPSBcdTU3MTZcdTg5ZTMNCi1fVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUgPSBcdTViZWNcdTVlYTYNCi1fVUlfRGltZW5zaW9uX2hlaWdodF9mZWF0dXJlID0gXHU5YWQ4XHU1ZWE2DQotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHU2NjJmXHU1MDBiXHU1MjI1XHU3Njg0XHU4ODY4XHU3OTNhXHU2Y2Q1DQotX1VJX1JlZmVyZW5jZV9yZWZlcmVuY2VkX2ZlYXR1cmUgPSBcdTVkZjJcdTUzYzNcdTcxNjcNCi1fVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUgPSBcdTdkMjJcdTVmMTVcdTkzNzUNCi1fVUlfUHJvcGVydHlfdmFsdWVfZmVhdHVyZSA9IFx1NTAzYw0KLV9VSV9HcmFwaEVkZ2VfYW5jaG9yX2ZlYXR1cmUgPSBcdTkzMjhcdTllZGUNCi1fVUlfR3JhcGhFZGdlX3dheXBvaW50c19mZWF0dXJlID0gXHU4ZGVmXHU1ZjkxXHU5ZWRlDQotX1VJX0RpYWdyYW1fem9vbV9mZWF0dXJlID0gXHU3ZTJlXHU2NTNlDQotX1VJX0RpYWdyYW1fdmlld3BvaW50X2ZlYXR1cmUgPSBcdTg5YzBcdTllZGUNCi1fVUlfRGlhZ3JhbV9kaWFncmFtTGlua19mZWF0dXJlID0gXHU1NzE2XHU4OWUzXHU5M2M4XHU3ZDUwDQotX1VJX0RpYWdyYW1fbmFtZXNwYWNlX2ZlYXR1cmUgPSBcdTU0MGRcdTdhMzFcdTdhN2FcdTk1OTMNCi1fVUlfR3JhcGhOb2RlX3NpemVfZmVhdHVyZSA9IFx1NTkyN1x1NWMwZg0KLV9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlSW5mb19mZWF0dXJlID0gXHU5ODVlXHU1NzhiXHU4Y2M3XHU4YTBhDQotX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlID0gXHU1MTQzXHU3ZDIwDQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IFx1NTE0M1x1N2QyMA0KLV9VSV9UZXh0RWxlbWVudF90ZXh0X2ZlYXR1cmUgPSBcdTY1ODdcdTViNTcNCi1fVUlfSW1hZ2VfdXJpX2ZlYXR1cmUgPSBVUkkNCi1fVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSA9IE1JTUUgXHU5ODVlXHU1NzhiDQotX1VJX1BvbHlsaW5lX2Nsb3NlZF9mZWF0dXJlID0gXHU5NWRjXHU5NTg5DQotX1VJX1BvbHlsaW5lX3dheXBvaW50c19mZWF0dXJlID0gXHU4ZGVmXHU1ZjkxXHU5ZWRlDQotX1VJX0VsbGlwc2VfcmFkaXVzWF9mZWF0dXJlID0gXHU1MzRhXHU1ZjkxIFgNCi1fVUlfRWxsaXBzZV9yYWRpdXNZX2ZlYXR1cmUgPSBcdTUzNGFcdTVmOTEgWQ0KLV9VSV9FbGxpcHNlX3JvdGF0aW9uX2ZlYXR1cmUgPSBcdTY1Y2JcdThmNDkNCi1fVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUgPSBcdThkNzdcdTU5Y2JcdTg5ZDJcdTVlYTYNCi1fVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlID0gXHU3ZDUwXHU2NzVmXHU4OWQyXHU1ZWE2DQotX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUgPSBcdTRlMmRcdTU5MmUNCi1fVUlfQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfZmVhdHVyZSA9IFx1NTIwNlx1ODllM1x1NTE0M1x1N2QyMA0KLV9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlID0gXHU1YzBlXHU4OWJkXHU1NzE2DQotX1VJX0FjdGl2aXR5X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IFx1NjUyZlx1NjNmNFx1OGNjN1x1NjU5OQ0KLV9VSV9BY3Rpdml0eV9jaGVja2xpc3RzX2ZlYXR1cmUgPSBcdTY4MzhcdTVjMGRcdTZlMDVcdTU1YWUNCi1fVUlfQWN0aXZpdHlfY29uY2VwdHNfZmVhdHVyZSA9IFx1Njk4Mlx1NWZmNQ0KLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gXHU3YmM0XHU0ZjhiDQotX1VJX0FjdGl2aXR5X2d1aWRlbGluZXNfZmVhdHVyZSA9IFx1NmU5Nlx1NTI0Nw0KLV9VSV9BY3Rpdml0eV9yZXVzYWJsZUFzc2V0c19mZWF0dXJlID0gXHU1M2VmXHU5MWNkXHU4OTA3XHU0ZjdmXHU3NTI4XHU3Njg0XHU4Y2M3XHU3NTIyDQotX1VJX0FjdGl2aXR5X2lzRW5hY3RhYmxlX2ZlYXR1cmUgPSBcdTUzZWZcdTU1NWZcdTc1MjgNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNSZXBlYXRhYmxlX2ZlYXR1cmUgPSBcdTY2MmZcdTUzZWZcdTkxY2RcdTg5MDdcdTc2ODQNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNPbmdvaW5nX2ZlYXR1cmUgPSBcdTY2MmZcdTYzMDFcdTdlOGNcdTkwMzJcdTg4NGNcdTRlMmQNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNFdmVudERyaXZlbl9mZWF0dXJlID0gXHU2NjJmXHU0ZThiXHU0ZWY2XHU1YzBlXHU1NDExXHU3Njg0DQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2xpbmtUb1ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBcdTkzYzhcdTdkNTBcdTgxZjNcdTUyNGRcdTRlMDBcdTcyNDgNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVmaXhfZmVhdHVyZSA9IFx1NWI1N1x1OTk5Ng0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlID0gXHU1ZGYyXHU4OThmXHU1MjgzDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlID0gXHU1MTc3XHU1MDk5XHU1OTFhXHU2YjIxXHU1MWZhXHU3M2ZlXHU3Njg0XHU5ODA1XHU3NmVlDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlID0gXHU2NjJmXHU5MDc4XHU3NTI4XHU3Njg0DQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSA9IFx1NTcyOFx1NGU0Ylx1NWY4Y1x1NTQ0OFx1NzNmZQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEJlZm9yZV9mZWF0dXJlID0gXHU1NzI4XHU0ZTRiXHU1MjRkXHU1NDQ4XHU3M2ZlDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX2ZlYXR1cmUgPSBcdTg5OGZcdTUyODNcdThjYzdcdTY1OTkNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9zdXBlckFjdGl2aXRpZXNfZmVhdHVyZSA9IFx1OGQ4NVx1NmQzYlx1NTJkNQ0KLV9VSV9UZWFtUHJvZmlsZV90ZWFtUm9sZXNfZmVhdHVyZSA9IFx1NTcxOFx1OTY4YVx1ODlkMlx1ODI3Mg0KLV9VSV9UZWFtUHJvZmlsZV9zdXBlclRlYW1fZmVhdHVyZSA9IFx1OGQ4NVx1NTcxOFx1OTY4YQ0KLV9VSV9UZWFtUHJvZmlsZV9zdWJUZWFtX2ZlYXR1cmUgPSBcdTViNTBcdTU3MThcdTk2OGENCi1fVUlfUm9sZURlc2NyaXB0b3JfUm9sZV9mZWF0dXJlID0gXHU4OWQyXHU4MjcyDQotX1VJX1JvbGVEZXNjcmlwdG9yX21vZGlmaWVzX2ZlYXR1cmUgPSBcdTRmZWVcdTY1MzlcdTk4MDVcdTc2ZWUNCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFx1OGNhMFx1OGNhYw0KLV9VSV9Xb3JrT3JkZXJfbGlua1R5cGVfZmVhdHVyZSA9IFx1OTNjOFx1N2Q1MFx1OTg1ZVx1NTc4Yg0KLV9VSV9Xb3JrT3JkZXJfcHJlZF9mZWF0dXJlID0gUHJlZA0KLV9VSV9QbGFubmluZ0RhdGFfc3RhcnREYXRlX2ZlYXR1cmUgPSBcdTk1OGJcdTU5Y2JcdTY1ZTVcdTY3MWYNCi1fVUlfUGxhbm5pbmdEYXRhX2ZpbmlzaERhdGVfZmVhdHVyZSA9IFx1NWI4Y1x1NjIxMFx1NjVlNVx1NjcxZg0KLV9VSV9QbGFubmluZ0RhdGFfcmFua19mZWF0dXJlID0gXHU3YjQ5XHU3ZDFhDQotX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUgPSBcdTgyMDdcdTRmODZcdTZlOTBcdTU0MGNcdTZiNjUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RW50cnlTdGF0ZV9mZWF0dXJlID0gXHU2ZDNiXHU1MmQ1XHU5MDMyXHU1MTY1XHU3MmMwXHU2MTRiDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUV4aXRTdGF0ZV9mZWF0dXJlID0gXHU2ZDNiXHU1MmQ1XHU3ZDUwXHU2NzVmXHU3MmMwXHU2MTRiDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RlZEJ5X2ZlYXR1cmUgPSBcdTVmNzFcdTk3ZmZcdTgwMDUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdHNfZmVhdHVyZSA9IFx1NWY3MVx1OTdmZg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfZGVsaXZlcmFibGVQYXJ0c19mZWF0dXJlID0gXHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3ZDQ0XHU0ZWY2DQotX1VJX1Rhc2tEZXNjcmlwdG9yX1Rhc2tfZmVhdHVyZSA9IFx1NGY1Y1x1Njk2ZA0KLV9VSV9UYXNrRGVzY3JpcHRvcl9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlID0gXHU2YjIxXHU4OTgxXHU1N2Y3XHU4ODRjXHU4MDA1DQotX1VJX1Rhc2tEZXNjcmlwdG9yX2Fzc2lzdGVkQnlfZmVhdHVyZSA9IFx1OGYxNFx1NTJhOVx1ODAwNQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUgPSBcdTU5MTZcdTkwZThcdThmMzhcdTUxNjUNCi1fVUlfVGFza0Rlc2NyaXB0b3JfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IFx1NWYzN1x1NTIzNlx1OGYzOFx1NTE2NQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBcdTkwNzhcdTc1MjhcdThmMzhcdTUxNjUNCi1fVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUgPSBcdThmMzhcdTUxZmENCi1fVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSA9IFx1NGUzYlx1ODk4MVx1NTdmN1x1ODg0Y1x1ODAwNQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9zZWxlY3RlZFN0ZXBzX2ZlYXR1cmUgPSBcdTVkZjJcdTkwNzhcdTUzZDZcdTc2ODRcdTZiNjVcdTlhNWYNCi1fVUlfQ29tcG9zaXRlUm9sZV9hZ2dyZWdhdGVkUm9sZXNfZmVhdHVyZSA9IFx1ODA1YVx1OTZjNlx1NzY4NFx1ODlkMlx1ODI3Mg0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlID0gXHU3NTI4XHU2Y2Q1XHU2MzA3XHU1ZjE1DQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gXHU3NmVlXHU3Njg0DQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBcdTY2ZmZcdTRlZTNcdTY1YjlcdTY4NDgNCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUgPSBcdTY3MGRcdTUyZDlcdTRlYmFcdTU0ZTENCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSA9IFx1OGFiZlx1NjU3NFx1NmJkNFx1NGY4Yg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzX2ZlYXR1cmUgPSBcdTVjMDhcdTY4NDhcdTYwMjdcdThjZWENCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcmlza0xldmVsX2ZlYXR1cmUgPSBcdTk4YThcdTk2YWFcdTVjNjRcdTZiMjENCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fZXN0aW1hdGluZ1RlY2huaXF1ZV9mZWF0dXJlID0gXHU5ODEwXHU0ZjMwXHU2MjgwXHU4ODUzDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IFx1NWMwOFx1Njg0OFx1NjIxMFx1NTRlMVx1NWMwOFx1Njk2ZFx1NzdlNVx1OGI1OA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gXHU1NDA4XHU3ZDA0XHU5ODVlXHU1NzhiDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBcdTU5MTZcdTkwZTggSUQNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3Njb3BlX2ZlYXR1cmUgPSBcdTdiYzRcdTU3MGQNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3VzYWdlTm90ZXNfZmVhdHVyZSA9IFx1NGY3Zlx1NzUyOFx1NmNlOFx1NjEwZlx1NGU4Ylx1OTgwNQ0KLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fcmVmaW5lZERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTVkZjJcdTRmZWVcdTZiNjNcdTc2ODRcdThhYWFcdTY2MGUNCi1fVUlfUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX2ZlYXR1cmUgPSBcdTViNTBcdTdkZjRcdTdmZDINCi1fVUlfUHJhY3RpY2VfY29udGVudFJlZmVyZW5jZXNfZmVhdHVyZSA9IFx1NTE2N1x1NWJiOVx1NTNjM1x1NzE2Nw0KLV9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSA9IFx1NmQzYlx1NTJkNVx1NTNjM1x1NzE2Nw0KLV9VSV9TdGF0ZV9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljDQotX1VJX1N0YXRlX1JlZ2lvbl9mZWF0dXJlID0gXHU1MzQwXHU1N2RmDQotX1VJX1N0YXRlX3N1Ym1hY2hpbmVfZmVhdHVyZSA9IFx1NWI1MFx1NmE1Zg0KLV9VSV9WZXJ0ZXhfY29udGFpbmVyX2ZlYXR1cmUgPSBcdTUxMzJcdTViNThcdTU2NjgNCi1fVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUgPSBcdTkwMjNcdTUxZmENCi1fVUlfVmVydGV4X2luY29taW5nX2ZlYXR1cmUgPSBcdTkwMjNcdTUxNjUNCi1fVUlfUmVnaW9uX1ZlcnRleF9mZWF0dXJlID0gXHU5ODAyXHU5ZWRlDQotX1VJX1JlZ2lvbl9UcmFuc2l0aW9uX2ZlYXR1cmUgPSBcdThmNDlcdTYzZGINCi1fVUlfUmVnaW9uX1N0YXRlX2ZlYXR1cmUgPSBcdTcyYzBcdTYxNGINCi1fVUlfUmVnaW9uX1N0YXRlTWFjaGluZV9mZWF0dXJlID0gXHU3MmMwXHU2MTRiXHU2YTVmDQotX1VJX1N0YXRlTWFjaGluZV9SZWdpb25fZmVhdHVyZSA9IFx1NTM0MFx1NTdkZg0KLV9VSV9UcmFuc2l0aW9uX1dvcmtEZWZpbml0aW9uX2ZlYXR1cmUgPSBcdTVkZTVcdTRmNWNcdTViOWFcdTdmYTkNCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IFx1NTEzMlx1NWI1OFx1NTY2OA0KLV9VSV9UcmFuc2l0aW9uX3NvdXJjZV9mZWF0dXJlID0gXHU0Zjg2XHU2ZTkwDQotX1VJX1RyYW5zaXRpb25fdGFyZ2V0X2ZlYXR1cmUgPSBcdTc2ZWVcdTZhMTkNCi1fVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlID0gXHU0ZjVjXHU2OTZkDQotX1VJX0Rpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9mZWF0dXJlID0gXHU1YjUwXHU4OThmXHU3YmM0DQotX1VJX0Rpc2NpcGxpbmVfcmVmZXJlbmNlV29ya2Zsb3dzX2ZlYXR1cmUgPSBcdTUzYzNcdTcxNjdcdTVkZTVcdTRmNWNcdTZkNDFcdTdhMGINCi1fVUlfUm9sZVNldF9yb2xlc19mZWF0dXJlID0gXHU4OWQyXHU4MjcyDQotX1VJX0RvbWFpbl93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLV9VSV9Eb21haW5fc3ViZG9tYWluc19mZWF0dXJlID0gXHU1YjUwXHU5ODE4XHU1N2RmDQotX1VJX1dvcmtQcm9kdWN0VHlwZV93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IFx1ODk4Zlx1N2JjNA0KLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBcdTVkZTVcdTUxNzdcdThmMTRcdTUyYTkNCi1fVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUgPSBcdTg5ZDJcdTgyNzJcdTk2YzYNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlID0gXHU1ZGYyXHU1MjA2XHU5ODVlXHU3Njg0XHU1MTQzXHU3ZDIwDQotX1VJX0N1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfZmVhdHVyZSA9IFx1NWI1MFx1N2EyZVx1OTg1ZQ0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUgPSBcdTY1NTlcdTgwYjJcdThjYzdcdTY1OTkNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBcdTZlOWRcdTkwMWFcdThjYzdcdTY1OTkNCi1fVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUgPSBcdTUzMDVcdTU0MmJcdTU3OGJcdTZhMjMNCi1fVUlfUHJvY2Vzc19kZWZhdWx0Q29udGV4dF9mZWF0dXJlID0gXHU5ODEwXHU4YTJkXHU3NGIwXHU1ODgzXHU1YjlhXHU3ZmE5DQotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBcdTY3MDlcdTY1NDhcdTc2ODRcdTc0YjBcdTU4ODNcdTViOWFcdTdmYTkNCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlID0gXHU1N2ZhXHU2NWJjXHU3YTBiXHU1ZThmDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfaW50ZXJmYWNlc19mZWF0dXJlID0gXHU0ZWNiXHU5NzYyDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gXHU3YTBiXHU1ZThmDQotX1VJX1Byb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19mZWF0dXJlID0gXHU3YTBiXHU1ZThmXHU1MTQzXHU3ZDIwDQotX1VJX1Byb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX2ZlYXR1cmUgPSBcdTU3MTZcdTg5ZTMNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19mZWF0dXJlID0gXHU0ZWNiXHU5NzYyXHU4OThmXHU2ODNjDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fZmVhdHVyZSA9IFx1NGVjYlx1OTc2MiBJTw0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUgPSBcdTdhMGJcdTVlOGZcdTUxNDNcdTRlZjYNCi1fVUlfTWV0aG9kUGx1Z2luX3VzZXJDaGFuZ2VhYmxlX2ZlYXR1cmUgPSBcdTRmN2ZcdTc1MjhcdTgwMDVcdTUzZWZcdTRlZTVcdThiOGFcdTY2ZjQNCi1fVUlfTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX2ZlYXR1cmUgPSBcdTY1YjlcdTZjZDVcdTU5NTdcdTRlZjYNCi1fVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUgPSBcdTU3ZmFcdTc5MGUNCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlID0gXHU4YjhhXHU1MzE2XHU2MDI3XHU5ODVlXHU1NzhiDQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBcdTU3ZmFcdTY1YmNcdTUxNDNcdTdkMjBcdTc2ODRcdThiOGFcdTUzMTZcdTYwMjcNCi1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBcdTRmNWNcdTgwMDUNCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUgPSBcdThiOGFcdTY2ZjRcdTY1ZTVcdTY3MWYNCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHU4YjhhXHU2NmY0XHU4YWFhXHU2NjBlDQotX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlID0gXHU3MjQ4XHU2NzJjDQotX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUgPSBcdTcyNDhcdTZiMGFcdTgwNzJcdTY2MGUNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSA9IFx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1OTA3OFx1NjRjNw0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBhY2thZ2VTZWxlY3Rpb25fZmVhdHVyZSA9IFx1NjViOVx1NmNkNVx1NTk1N1x1NGVmNlx1OTA3OFx1OTgwNQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlID0gXHU3YTBiXHU1ZThmXHU4OTk2XHU1NzE2DQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fZGVmYXVsdFZpZXdfZmVhdHVyZSA9IFx1OTgxMFx1OGEyZFx1ODk5Nlx1NTcxNg0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gXHU1N2ZhXHU3OTBlXHU5MTRkXHU3ZjZlDQotX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSA9IFx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYg0KLV9VSV9NZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfZmVhdHVyZSA9IFx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLV9VSV9NZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19mZWF0dXJlID0gXHU5ODEwXHU1MTQ4XHU1YjlhXHU3ZmE5XHU3Njg0XHU5MTRkXHU3ZjZlDQotX1VJX1Vua25vd25fZmVhdHVyZSA9IFx1NjcyYVx1NjMwN1x1NWI5YQ0KLQ0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvU3RhcnRfbGl0ZXJhbCA9IGZpbmlzaFRvU3RhcnQNCi1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb0ZpbmlzaF9saXRlcmFsID0gZmluaXNoVG9GaW5pc2gNCi1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvU3RhcnRfbGl0ZXJhbCA9IHN0YXJ0VG9TdGFydA0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9GaW5pc2hfbGl0ZXJhbCA9IHN0YXJ0VG9GaW5pc2gNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2luaXRpYWxfbGl0ZXJhbCA9IFx1OGQ3N1x1NTljYg0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gXHU3ZDUwXHU1NDA4DQotX1VJX1BzZXVkb1N0YXRlS2luZF9mb3JrX2xpdGVyYWwgPSBcdTUyMDZcdTUxZmENCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBcdTkwMjNcdTdkNTANCi1fVUlfUHNldWRvU3RhdGVLaW5kX2Nob2ljZV9saXRlcmFsID0gXHU5MDc4XHU2NGM3DQotX1VJX1BzZXVkb1N0YXRlS2luZF9lbnRyeVBvaW50X2xpdGVyYWwgPSBcdTkwMzJcdTUxNjVcdTllZGUNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gXHU4ZGYzXHU1MWZhXHU5ZWRlDQotX1VJX1BzZXVkb1N0YXRlS2luZF90ZXJtaW5hdGVfbGl0ZXJhbCA9IFx1N2Q0Mlx1NmI2Mg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbmFfbGl0ZXJhbCA9IFx1NzEyMQ0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfY29udHJpYnV0ZXNfbGl0ZXJhbCA9IFx1NjNkMFx1NTFmYQ0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gXHU1ZWY2XHU0ZjM4DQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9yZXBsYWNlc19saXRlcmFsID0gXHU1M2Q2XHU0ZWUzDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbENvbnRyaWJ1dGlvbl9saXRlcmFsID0gbG9jYWxDb250cmlidXRpb24NCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IGxvY2FsUmVwbGFjZW1lbnQNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdG9yX3R5cGUgPSBcdTY5Y2JcdTRlZjZcdTYzY2ZcdThmZjBcdTViNTANCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBcdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWVcdTYzY2ZcdThmZjBcdTViNTANCi1fVUlfT3V0Y29tZURlc2NyaXB0b3JfdHlwZSA9IFx1OGYzOFx1NTFmYVx1N2Q1MFx1Njc5Y1x1NjNjZlx1OGZmMFx1NWI1MA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiNTk0ZDguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNGJiMzMyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwyLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMi9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwMzY5YTAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS5ubDIuamFyID0gc3JjLw0KLW91dHB1dC5ubDIuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMi5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDIvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MGQ0ZTRhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIENvbXBvc2VyIFVNQSBFZGl0IChOTDIpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDdmNmJhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLXBsdWdpbk5hbWUgPSBFTUYgVU1BIC0gXHUwNDIwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IC0gXHUwNDFmXHUwNDNlXHUwNDM0XHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDNhXHUwNDMwDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IFx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyB7MH0gXHUwNDMyIFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzNSB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfZGVzY3JpcHRpb24gPSBcdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDQwXHUwNDNkXHUwNDM4XHUwNDM5IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0MiBcdTA0NDJcdTA0MzhcdTA0M2ZcdTA0MzAgezB9IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAgezF9IFx1MDQzMiBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0M2MgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDM1IHsyfS4NCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IFx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0MzVcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzkgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQ0Mlx1MDQzOFx1MDQzZlx1MDQzMCB7MH0gXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSB7Mn0gXHUwNDMyIFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzNSB7MX0gXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMC4NCi0NCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gXHUwNDFlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyIHswfSBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDJcdTA0MzAgezF9DQotDQotX1VJX0NsYXNzaWZpZXJfdHlwZSA9IFx1MDQxYVx1MDQzYlx1MDQzMFx1MDQ0MVx1MDQ0MVx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzZVx1MDQ0MA0KLV9VSV9UeXBlX3R5cGUgPSBcdTA0MjJcdTA0MzhcdTA0M2YNCi1fVUlfRWxlbWVudF90eXBlID0gXHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotX1VJX05hbWVkRWxlbWVudF90eXBlID0gXHUwNDE4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mg0KLV9VSV9QYWNrYWdlYWJsZUVsZW1lbnRfdHlwZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0MzANCi1fVUlfUGFja2FnZV90eXBlID0gXHUwNDFmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyDQotX1VJX05hbWVzcGFjZV90eXBlID0gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNlIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZA0KLV9VSV9NZXRob2RFbGVtZW50X3R5cGUgPSBcdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotX1VJX0NvbnN0cmFpbnRfdHlwZSA9IFx1MDQxZVx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLV9VSV9Db250ZW50RWxlbWVudF90eXBlID0gXHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMg0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IFx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQ0Ylx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQzOSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDINCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUgPSBcdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyDQotX1VJX1NlY3Rpb25fdHlwZSA9IFx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzNFx1MDQzNVx1MDQzYg0KLV9VSV9Sb2xlX3R5cGUgPSBcdTA0MjBcdTA0M2VcdTA0M2JcdTA0NGMNCi1fVUlfV29ya1Byb2R1Y3RfdHlwZSA9IFx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDINCi1fVUlfVGFza190eXBlID0gXHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDMwDQotX1VJX1dvcmtEZWZpbml0aW9uX3R5cGUgPSBcdTA0MWVcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDRiDQotX1VJX1N0ZXBfdHlwZSA9IFx1MDQyOFx1MDQzMFx1MDQzMw0KLV9VSV9HdWlkYW5jZV90eXBlID0gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX0FydGlmYWN0X3R5cGUgPSBcdTA0MTBcdTA0NDBcdTA0NDJcdTA0MzVcdTA0NDRcdTA0MzBcdTA0M2FcdTA0NDINCi1fVUlfRGVsaXZlcmFibGVfdHlwZSA9IFx1MDQxYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDINCi1fVUlfT3V0Y29tZV90eXBlID0gXHUwNDE4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0DQotX1VJX01ldGhvZFBhY2thZ2VfdHlwZSA9IFx1MDQxZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0MiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1fVUlfQ29udGVudFBhY2thZ2VfdHlwZSA9IFx1MDQxZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0MiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzINCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl90eXBlID0gXHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzNVx1MDQ0NFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzMA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUgPSBcdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3R5cGUgPSBcdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSA9IFx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzgNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3R5cGUgPSBcdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fdHlwZSA9IFx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlID0gXHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1fVUlfUG9pbnRfdHlwZSA9IFx1MDQyMlx1MDQzZVx1MDQ0N1x1MDQzYVx1MDQzMA0KLV9VSV9HcmFwaEVsZW1lbnRfdHlwZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzANCi1fVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NGINCi1fVUlfRGlhZ3JhbUxpbmtfdHlwZSA9IFx1MDQyMVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzMCBcdTA0M2RcdTA0MzAgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDQzDQotX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUgPSBcdTA0MjFcdTA0M2VcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IFx1MDQxY1x1MDQzZVx1MDQ0MVx1MDQ0MiBcdTA0NDFcdTA0MzVcdTA0M2NcdTA0MzBcdTA0M2RcdTA0NDJcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzkgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM4DQotX1VJX0RpbWVuc2lvbl90eXBlID0gXHUwNDIwXHUwNDMwXHUwNDM3XHUwNDNjXHUwNDM1XHUwNDQwXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDRjDQotX1VJX1JlZmVyZW5jZV90eXBlID0gXHUwNDIxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDMwDQotX1VJX1Byb3BlcnR5X3R5cGUgPSBcdTA0MjFcdTA0MzJcdTA0M2VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0M2UNCi1fVUlfR3JhcGhFZGdlX3R5cGUgPSBcdTA0MWFcdTA0NDBcdTA0MzBcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDM4XHUwNDNhXHUwNDMwDQotX1VJX0RpYWdyYW1fdHlwZSA9IFx1MDQxNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMA0KLV9VSV9HcmFwaE5vZGVfdHlwZSA9IFx1MDQyM1x1MDQzN1x1MDQzNVx1MDQzYiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzANCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDQxXHUwNDM1XHUwNDNjXHUwNDMwXHUwNDNkXHUwNDQyXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDM5IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzOA0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBcdTA0MWNcdTA0M2VcdTA0NDFcdTA0NDIgXHUwNDQxXHUwNDM1XHUwNDNjXHUwNDMwXHUwNDNkXHUwNDQyXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDM5IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzOCBVTUENCi1fVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IFx1MDQxY1x1MDQzZVx1MDQ0MVx1MDQ0MiBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzkgXHUwNDQxXHUwNDM1XHUwNDNjXHUwNDMwXHUwNDNkXHUwNDQyXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDM5IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzOA0KLV9VSV9MZWFmRWxlbWVudF90eXBlID0gXHUwNDFhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mg0KLV9VSV9UZXh0RWxlbWVudF90eXBlID0gXHUwNDIyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mg0KLV9VSV9JbWFnZV90eXBlID0gXHUwNDE4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1DQotX1VJX0dyYXBoaWNQcmltaXRpdmVfdHlwZSA9IFx1MDQxM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzhcdTA0MzINCi1fVUlfUG9seWxpbmVfdHlwZSA9IFx1MDQxYlx1MDQzZVx1MDQzY1x1MDQzMFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0M2JcdTA0MzhcdTA0M2RcdTA0MzhcdTA0NGYNCi1fVUlfRWxsaXBzZV90eXBlID0gXHUwNDJkXHUwNDNiXHUwNDNiXHUwNDM4XHUwNDNmXHUwNDQxDQotX1VJX0FjdGl2aXR5X3R5cGUgPSBcdTA0MWVcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0NGIgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDRiDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0NGINCi1fVUlfTWlsZXN0b25lX3R5cGUgPSBcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDJcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDQyXHUwNDNlXHUwNDQ3XHUwNDNhXHUwNDMwDQotX1VJX0l0ZXJhdGlvbl90eXBlID0gXHUwNDE4XHUwNDQyXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmDQotX1VJX1BoYXNlX3R5cGUgPSBcdTA0MmRcdTA0NDJcdTA0MzBcdTA0M2YNCi1fVUlfVGVhbVByb2ZpbGVfdHlwZSA9IFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGINCi1fVUlfUm9sZURlc2NyaXB0b3JfdHlwZSA9IFx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzgNCi1fVUlfV29ya09yZGVyX3R5cGUgPSBcdTA0MWZcdTA0M2VcdTA0NDBcdTA0NGZcdTA0MzRcdTA0M2VcdTA0M2EgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX1Byb2Nlc3NFbGVtZW50X3R5cGUgPSBcdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwDQotX1VJX1BsYW5uaW5nRGF0YV90eXBlID0gXHUwNDE0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQzYlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLV9VSV9EZXNjcmlwdG9yX3R5cGUgPSBcdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDANCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUgPSBcdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLV9VSV9UYXNrRGVzY3JpcHRvcl90eXBlID0gXHUwNDE0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOA0KLV9VSV9Db21wb3NpdGVSb2xlX3R5cGUgPSBcdTA0MjFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDRjDQotX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl90eXBlID0gXHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMCBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0NGINCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlID0gXHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gXHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzgNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBcdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwDQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gXHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzMA0KLV9VSV9Db25jZXB0X3R5cGUgPSBcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDZcdTA0MzVcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0NGYNCi1fVUlfQ2hlY2tsaXN0X3R5cGUgPSBcdTA0MjFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDQyXHUwNDMwXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDQ2XHUwNDMwDQotX1VJX0V4YW1wbGVfdHlwZSA9IFx1MDQxZlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0MA0KLV9VSV9HdWlkZWxpbmVfdHlwZSA9IFx1MDQyMFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLV9VSV9SZXBvcnRfdHlwZSA9IFx1MDQxZVx1MDQ0Mlx1MDQ0N1x1MDQzNVx1MDQ0Mg0KLV9VSV9UZW1wbGF0ZV90eXBlID0gXHUwNDI4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkDQotX1VJX1N1cHBvcnRpbmdNYXRlcmlhbF90eXBlID0gXHUwNDIxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0Yg0KLV9VSV9Ub29sTWVudG9yX3R5cGUgPSBcdTA0MjBcdTA0NDNcdTA0M2FcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0M2UgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0Mw0KLV9VSV9XaGl0ZXBhcGVyX3R5cGUgPSBcdTA0MThcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0M2VcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDMxXHUwNDRlXHUwNDNiXHUwNDNiXHUwNDM1XHUwNDQyXHUwNDM1XHUwNDNkXHUwNDRjDQotX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUgPSBcdTA0MWVcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDNjXHUwNDM4XHUwNDNkXHUwNDMwDQotX1VJX1ByYWN0aWNlX3R5cGUgPSBcdTA0MWZcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzAgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gXHUwNDIwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQzZSBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0MzUNCi1fVUlfUmV1c2FibGVBc3NldF90eXBlID0gXHUwNDFjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MQ0KLV9VSV9TdGF0ZV90eXBlID0gXHUwNDIxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDRmXHUwNDNkXHUwNDM4XHUwNDM1DQotX1VJX1ZlcnRleF90eXBlID0gXHUwNDEyXHUwNDM1XHUwNDQwXHUwNDQ4XHUwNDM4XHUwNDNkXHUwNDMwDQotX1VJX1JlZ2lvbl90eXBlID0gXHUwNDFlXHUwNDMxXHUwNDNiXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDRjDQotX1VJX1N0YXRlTWFjaGluZV90eXBlID0gXHUwNDFhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQzMFx1MDQ0Mg0KLV9VSV9UcmFuc2l0aW9uX3R5cGUgPSBcdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0NDVcdTA0M2VcdTA0MzQNCi1fVUlfUHNldWRvU3RhdGVfdHlwZSA9IFx1MDQxZlx1MDQ0MVx1MDQzNVx1MDQzMlx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQ0Zlx1MDQzZFx1MDQzOFx1MDQzNQ0KLV9VSV9EaXNjaXBsaW5lX3R5cGUgPSBcdTA0MTRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0MzANCi1fVUlfQ29udGVudENhdGVnb3J5X3R5cGUgPSBcdTA0MWFcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NGYgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyDQotX1VJX1JvbGVTZXRfdHlwZSA9IFx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1fVUlfRG9tYWluX3R5cGUgPSBcdTA0MTRcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2QNCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3R5cGUgPSBcdTA0MjJcdTA0MzhcdTA0M2YgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSA9IFx1MDQxM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQzMCBcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2QNCi1fVUlfVG9vbF90eXBlID0gXHUwNDE4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotX1VJX1JvbGVTZXRHcm91cGluZ190eXBlID0gXHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiIFx1MDQzZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzMiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSA9IFx1MDQxZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NGYNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUgPSBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDEgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDM4DQotX1VJX1Byb2Nlc3NfdHlwZSA9IFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlID0gXHUwNDI4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkIFx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzOQ0KLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV90eXBlID0gXHUwNDI4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkIFx1MDQzZlx1MDQzYlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzANCi1fVUlfUm9hZG1hcF90eXBlID0gXHUwNDFmXHUwNDQzXHUwNDQyXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSA9IFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzANCi1fVUlfUHJvY2Vzc1BhY2thZ2VfdHlwZSA9IFx1MDQxZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0MzINCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV90eXBlID0gXHUwNDE4XHUwNDNkXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDQ0XHUwNDM1XHUwNDM5XHUwNDQxIFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzANCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfdHlwZSA9IFx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwDQotX1VJX01ldGhvZFBsdWdpbl90eXBlID0gXHUwNDFjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0MzJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzgNCi1fVUlfTWV0aG9kVW5pdF90eXBlID0gXHUwNDExXHUwNDNiXHUwNDNlXHUwNDNhIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUgPSBcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotX1VJX1Byb2Nlc3NGYW1pbHlfdHlwZSA9IFx1MDQyMVx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0MzINCi1fVUlfTWV0aG9kTGlicmFyeV90eXBlID0gXHUwNDExXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLV9VSV9Vbmtub3duX3R5cGUgPSBcdTA0MWVcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDINCi0NCi1fVUlfVW5rbm93bl9kYXRhdHlwZT0gXHUwNDE3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1DQotDQotX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUgPSBcdTA0MThcdTA0M2NcdTA0NGYNCi1fVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUgPSBHVUlEDQotX1VJX01ldGhvZEVsZW1lbnRfYnJpZWZEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotX1VJX01ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19mZWF0dXJlID0gXHUwNDIxXHUwNDNlXHUwNDMxXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzYlx1MDQzMA0KLV9VSV9NZXRob2RFbGVtZW50X3N1cHByZXNzZWRfZmVhdHVyZSA9IFx1MDQyMVx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0Ylx1MDQzOQ0KLV9VSV9NZXRob2RFbGVtZW50X29yZGVyaW5nR3VpZGVfZmVhdHVyZSA9IFx1MDQxZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzYlx1MDQzMCBcdTA0NDNcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NGZcdTA0MzRcdTA0M2VcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1fVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUgPSBcdTA0MjJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDIgXHUwNDQxXHUwNDNlXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IFx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0NGINCi1fVUlfQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfZmVhdHVyZSA9IFx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0Nlx1MDQzNVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzggXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotX1VJX0NvbnRlbnRFbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSA9IFx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0NGINCi1fVUlfQ29udGVudEVsZW1lbnRfZ3VpZGVsaW5lc19mZWF0dXJlID0gXHUwNDIwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotX1VJX0NvbnRlbnRFbGVtZW50X2V4YW1wbGVzX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0NDBcdTA0NGINCi1fVUlfQ29udGVudEVsZW1lbnRfYXNzZXRzX2ZlYXR1cmUgPSBcdTA0MjBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0NGINCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSA9IFx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHUwNDFmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1DQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9zaGFwZWljb25fZmVhdHVyZSA9IFx1MDQxN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzZVx1MDQzYSBcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0NGINCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBcdTA0MTdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0M2VcdTA0M2EgXHUwNDQzXHUwNDM3XHUwNDNiXHUwNDMwDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9tYWluRGVzY3JpcHRpb25fZmVhdHVyZSA9IFx1MDQxZVx1MDQ0MVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzZFx1MDQzZVx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX2ZlYXR1cmUgPSBcdTA0MjBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M2JcdTA0NGINCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX2tleUNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBcdTA0MWFcdTA0M2JcdTA0NGVcdTA0NDdcdTA0MzVcdTA0MzJcdTA0NGJcdTA0MzUgXHUwNDQzXHUwNDQxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDRmDQotX1VJX1NlY3Rpb25fc2VjdGlvbk5hbWVfZmVhdHVyZSA9IFx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzANCi1fVUlfU2VjdGlvbl9zZWN0aW9uRGVzY3JpcHRpb25fZmVhdHVyZSA9IFx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzANCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gXHUwNDFmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDMwXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDRiDQotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IFx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzOFx1MDQzYQ0KLV9VSV9Sb2xlX21vZGlmaWVzX2ZlYXR1cmUgPSBcdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDINCi1fVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlID0gXHUwNDFlXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzN1x1MDQzMA0KLV9VSV9Xb3JrUHJvZHVjdF9yZXBvcnRzX2ZlYXR1cmUgPSBcdTA0MWVcdTA0NDJcdTA0NDdcdTA0MzVcdTA0NDJcdTA0NGINCi1fVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUgPSBcdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0NGINCi1fVUlfV29ya1Byb2R1Y3RfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFx1MDQyMFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDNjDQotX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gXHUwNDIwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQzZSBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0MzUNCi1fVUlfVGFza19wZXJmb3JtZWRCeV9mZWF0dXJlID0gXHUwNDE4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjDQotX1VJX1Rhc2tfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IFx1MDQxZVx1MDQzMVx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzQNCi1fVUlfVGFza19vdXRwdXRfZmVhdHVyZSA9IFx1MDQxMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNA0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBcdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjDQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gXHUwNDFkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNA0KLV9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUgPSBcdTA0MjhcdTA0MzBcdTA0MzNcdTA0MzgNCi1fVUlfVGFza190b29sTWVudG9yc19mZWF0dXJlID0gXHUwNDIwXHUwNDQzXHUwNDNhXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzZlx1MDQzZSBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2MNCi1fVUlfVGFza19lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IFx1MDQyMFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDNhXHUwNDM1DQotX1VJX1dvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9mZWF0dXJlID0gXHUwNDEyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQ0M1x1MDQ0MVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzOFx1MDQzNQ0KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX2ZlYXR1cmUgPSBcdTA0MTJcdTA0NGJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDQzXHUwNDQxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDM1DQotX1VJX0FydGlmYWN0X2NvbnRhaW5lckFydGlmYWN0X2ZlYXR1cmUgPSBcdTA0MTBcdTA0NDBcdTA0NDJcdTA0MzVcdTA0NDRcdTA0MzBcdTA0M2FcdTA0NDItXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNkXHUwNDM1XHUwNDQwDQotX1VJX0FydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19mZWF0dXJlID0gXHUwNDIxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDM1XHUwNDQxXHUwNDRmIFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzNVx1MDQ0NFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLV9VSV9EZWxpdmVyYWJsZV9kZWxpdmVyZWRXb3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1MDQxNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiDQotX1VJX01ldGhvZFBhY2thZ2VfZ2xvYmFsX2ZlYXR1cmUgPSBcdTA0MTNcdTA0M2JcdTA0M2VcdTA0MzFcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzkNCi1fVUlfTWV0aG9kUGFja2FnZV9yZXVzZWRQYWNrYWdlc19mZWF0dXJlID0gXHUwNDFjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mlx1MDQ0Yg0KLV9VSV9NZXRob2RQYWNrYWdlX3BhcmVudFBhY2thZ2VfZmVhdHVyZSA9IFx1MDQyMFx1MDQzZVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDINCi1fVUlfTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX2ZlYXR1cmUgPSBcdTA0MTRcdTA0M2VcdTA0NDdcdTA0MzVcdTA0NDBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDRiDQotX1VJX0NvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19mZWF0dXJlID0gXHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMg0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX2JyaWVmT3V0bGluZV9mZWF0dXJlID0gXHUwNDFhXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDNhXHUwNDMwXHUwNDRmIFx1MDQ0MVx1MDQ0NVx1MDQzNVx1MDQzY1x1MDQzMA0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3JlcHJlc2VudGF0aW9uT3B0aW9uc19mZWF0dXJlID0gXHUwNDFlXHUwNDNmXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSA9IFx1MDQxMlx1MDQzZFx1MDQzNVx1MDQ0OFx1MDQzZFx1MDQzOFx1MDQzOSBcdTA0MThcdTA0MTQNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBcdTA0MWRcdTA0MzBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9pbXBhY3RPZk5vdEhhdmluZ19mZWF0dXJlID0gXHUwNDFmXHUwNDNlXHUwNDQxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDRmIFx1MDQzZVx1MDQ0Mlx1MDQ0MVx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzOFx1MDQ0Zg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3JlYXNvbnNGb3JOb3ROZWVkaW5nX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDBcdTA0MzhcdTA0NDdcdTA0MzhcdTA0M2RcdTA0NGIgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMA0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX2V4dGVybmFsRGVzY3JpcHRpb25fZmVhdHVyZSA9IFx1MDQxMlx1MDQzZFx1MDQzNVx1MDQ0OFx1MDQzZFx1MDQzNVx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9wYWNrYWdpbmdHdWlkYW5jZV9mZWF0dXJlID0gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQzZSBcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUgXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDMyDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9za2lsbHNfZmVhdHVyZSA9IFx1MDQxYVx1MDQzMlx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fYXNzaWdubWVudEFwcHJvYWNoZXNfZmVhdHVyZSA9IFx1MDQxZlx1MDQzZVx1MDQzNFx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQ0YiBcdTA0M2EgXHUwNDNkXHUwNDMwXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRlDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlID0gXHUwNDIxXHUwNDM4XHUwNDNkXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDNjXHUwNDRiDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBcdTA0MWRcdTA0MzBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gXHUwNDEwXHUwNDNiXHUwNDRjXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDNkXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDMyXHUwNDRiDQotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fYXR0YWNobWVudHNfZmVhdHVyZSA9IFx1MDQxMlx1MDQzYlx1MDQzZVx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUgPSBcdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlID0gXHUwNDFkXHUwNDM1XHUwNDNmXHUwNDNlXHUwNDNiXHUwNDMwXHUwNDM0XHUwNDNhXHUwNDMwDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlID0gXHUwNDFmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDRiXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDRmDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSA9IFx1MDQyNlx1MDQzNVx1MDQzYlx1MDQzOA0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FwcGxpY2F0aW9uX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDBcdTA0MzhcdTA0M2JcdTA0M2VcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9sZXZlbHNPZkFkb3B0aW9uX2ZlYXR1cmUgPSBcdTA0MjNcdTA0NDBcdTA0M2VcdTA0MzJcdTA0M2RcdTA0MzggXHUwNDMyXHUwNDNkXHUwNDM1XHUwNDM0XHUwNDQwXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgNCi1fVUlfUG9pbnRfeV9mZWF0dXJlID0gWQ0KLV9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSA9IFx1MDQxZlx1MDQzZVx1MDQzN1x1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLV9VSV9HcmFwaEVsZW1lbnRfY29udGFpbmVkX2ZlYXR1cmUgPSBcdTA0MjFcdTA0M2VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NDFcdTA0NGYNCi1fVUlfR3JhcGhFbGVtZW50X2xpbmtfZmVhdHVyZSA9IFx1MDQyMVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQ0Yw0KLV9VSV9HcmFwaEVsZW1lbnRfYW5jaG9yYWdlX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDBcdTA0MzhcdTA0M2FcdTA0NDBcdTA0MzVcdTA0M2ZcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IFx1MDQyMVx1MDQzNVx1MDQzY1x1MDQzMFx1MDQzZFx1MDQ0Mlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0MzVcdTA0M2JcdTA0NGMNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfaXNWaXNpYmxlX2ZlYXR1cmUgPSBcdTA0MWVcdTA0NDJcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfY29udGFpbmVyX2ZlYXR1cmUgPSBcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzVcdTA0MzlcdTA0M2RcdTA0MzVcdTA0NDANCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUgPSBcdTA0MjFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzANCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfZmVhdHVyZSA9IFx1MDQyMVx1MDQzMlx1MDQzZVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzZQ0KLV9VSV9EaWFncmFtTGlua196b29tX2ZlYXR1cmUgPSBcdTA0MWNcdTA0MzBcdTA0NDFcdTA0NDhcdTA0NDJcdTA0MzBcdTA0MzENCi1fVUlfRGlhZ3JhbUxpbmtfdmlld3BvcnRfZmVhdHVyZSA9IFx1MDQxZVx1MDQzMVx1MDQzYlx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NGJcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzANCi1fVUlfRGlhZ3JhbUxpbmtfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBcdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDM4XHUwNDNhXHUwNDMwDQotX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSA9IFx1MDQxNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMA0KLV9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzANCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFZGdlX2ZlYXR1cmUgPSBcdTA0MWFcdTA0NDBcdTA0MzBcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDM4XHUwNDNhXHUwNDMwDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzANCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9kaWFncmFtX2ZlYXR1cmUgPSBcdTA0MTRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0MzANCi1fVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUgPSBcdTA0MjhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M2RcdTA0MzANCi1fVUlfRGltZW5zaW9uX2hlaWdodF9mZWF0dXJlID0gXHUwNDEyXHUwNDRiXHUwNDQxXHUwNDNlXHUwNDQyXHUwNDMwDQotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHUwNDE4XHUwNDNkXHUwNDM0XHUwNDM4XHUwNDMyXHUwNDM4XHUwNDM0XHUwNDQzXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLV9VSV9SZWZlcmVuY2VfcmVmZXJlbmNlZF9mZWF0dXJlID0gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQzMiBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzBcdTA0NDUNCi1fVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUgPSBcdTA0MWFcdTA0M2JcdTA0NGVcdTA0NDcNCi1fVUlfUHJvcGVydHlfdmFsdWVfZmVhdHVyZSA9IFx1MDQxN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLV9VSV9HcmFwaEVkZ2VfYW5jaG9yX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDBcdTA0MzhcdTA0MzJcdTA0NGZcdTA0MzdcdTA0M2FcdTA0MzANCi1fVUlfR3JhcGhFZGdlX3dheXBvaW50c19mZWF0dXJlID0gXHUwNDIyXHUwNDNlXHUwNDQ3XHUwNDNhXHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQ0Mlx1MDQzOA0KLV9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSA9IFx1MDQxY1x1MDQzMFx1MDQ0MVx1MDQ0OFx1MDQ0Mlx1MDQzMFx1MDQzMQ0KLV9VSV9EaWFncmFtX3ZpZXdwb2ludF9mZWF0dXJlID0gXHUwNDIyXHUwNDNlXHUwNDQ3XHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMA0KLV9VSV9EaWFncmFtX2RpYWdyYW1MaW5rX2ZlYXR1cmUgPSBcdTA0MjFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzAgXHUwNDNkXHUwNDMwIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0Mw0KLV9VSV9EaWFncmFtX25hbWVzcGFjZV9mZWF0dXJlID0gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNlIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZA0KLV9VSV9HcmFwaE5vZGVfc2l6ZV9mZWF0dXJlID0gXHUwNDIwXHUwNDMwXHUwNDM3XHUwNDNjXHUwNDM1XHUwNDQwDQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGVJbmZvX2ZlYXR1cmUgPSBcdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlIFx1MDQ0Mlx1MDQzOFx1MDQzZlx1MDQzNQ0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mg0KLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUgPSBcdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDINCi1fVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlID0gXHUwNDIyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyDQotX1VJX0ltYWdlX3VyaV9mZWF0dXJlID0gVVJJDQotX1VJX0ltYWdlX21pbWVUeXBlX2ZlYXR1cmUgPSBcdTA0MjJcdTA0MzhcdTA0M2YgTUlNRQ0KLV9VSV9Qb2x5bGluZV9jbG9zZWRfZmVhdHVyZSA9IFx1MDQxN1x1MDQzMFx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mg0KLV9VSV9Qb2x5bGluZV93YXlwb2ludHNfZmVhdHVyZSA9IFx1MDQyMlx1MDQzZVx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0M2ZcdTA0NDNcdTA0NDJcdTA0MzgNCi1fVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUgPSBcdTA0MjBcdTA0MzBcdTA0MzRcdTA0MzhcdTA0NDNcdTA0NDEgWA0KLV9VSV9FbGxpcHNlX3JhZGl1c1lfZmVhdHVyZSA9IFx1MDQyMFx1MDQzMFx1MDQzNFx1MDQzOFx1MDQ0M1x1MDQ0MSBZDQotX1VJX0VsbGlwc2Vfcm90YXRpb25fZmVhdHVyZSA9IFx1MDQxZlx1MDQzZVx1MDQzMlx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQ0Mg0KLV9VSV9FbGxpcHNlX3N0YXJ0QW5nbGVfZmVhdHVyZSA9IFx1MDQxZFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0M2INCi1fVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlID0gXHUwNDFhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzYg0KLV9VSV9FbGxpcHNlX2NlbnRlcl9mZWF0dXJlID0gXHUwNDI2XHUwNDM1XHUwNDNkXHUwNDQyXHUwNDQwDQotX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUgPSBcdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDRiDQotX1VJX0FjdGl2aXR5X3JvYWRtYXBzX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0MzgNCi1fVUlfQWN0aXZpdHlfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gXHUwNDIxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0Yg0KLV9VSV9BY3Rpdml0eV9jaGVja2xpc3RzX2ZlYXR1cmUgPSBcdTA0MjFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQyXHUwNDMwXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDQ2XHUwNDRiDQotX1VJX0FjdGl2aXR5X2NvbmNlcHRzX2ZlYXR1cmUgPSBcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDZcdTA0MzVcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0MzgNCi1fVUlfQWN0aXZpdHlfZXhhbXBsZXNfZmVhdHVyZSA9IFx1MDQxZlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0MFx1MDQ0Yg0KLV9VSV9BY3Rpdml0eV9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBcdTA0MjBcdTA0MzVcdTA0M2FcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1fVUlfQWN0aXZpdHlfcmV1c2FibGVBc3NldHNfZmVhdHVyZSA9IFx1MDQxY1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0NGINCi1fVUlfQWN0aXZpdHlfaXNFbmFjdGFibGVfZmVhdHVyZSA9IFx1MDQxMlx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzMFx1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQzOQ0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc1JlcGVhdGFibGVfZmVhdHVyZSA9IFx1MDQxZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Zlx1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQzOQ0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSA9IFx1MDQxMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzOVx1MDQ0MVx1MDQ0Zg0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc0V2ZW50RHJpdmVuX2ZlYXR1cmUgPSBcdTA0MjNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0NGZcdTA0MzVcdTA0M2NcdTA0NGJcdTA0MzkgXHUwNDQxXHUwNDNlXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDM4XHUwNDRmXHUwNDNjXHUwNDM4DQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2xpbmtUb1ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBcdTA0MjFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzAgXHUwNDNkXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzOFx1MDQzYVx1MDQzMA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZWZpeF9mZWF0dXJlID0gXHUwNDFmXHUwNDQwXHUwNDM1XHUwNDQ0XHUwNDM4XHUwNDNhXHUwNDQxDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNQbGFubmVkX2ZlYXR1cmUgPSBcdTA0MTdcdTA0MzBcdTA0M2ZcdTA0M2JcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9oYXNNdWx0aXBsZU9jY3VycmVuY2VzX2ZlYXR1cmUgPSBcdTA0MWRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM2XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5DQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlID0gXHUwNDFkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM5DQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSA9IFx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0M2VcdTA0NDFcdTA0M2JcdTA0MzUNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRCZWZvcmVfZmVhdHVyZSA9IFx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0MzRcdTA0M2UNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wbGFubmluZ0RhdGFfZmVhdHVyZSA9IFx1MDQxNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2ZcdTA0M2JcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9zdXBlckFjdGl2aXRpZXNfZmVhdHVyZSA9IFx1MDQxMVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1fVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUgPSBcdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzggXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmDQotX1VJX1RlYW1Qcm9maWxlX3N1cGVyVGVhbV9mZWF0dXJlID0gXHUwNDEzXHUwNDNiXHUwNDMwXHUwNDMyXHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQzMA0KLV9VSV9UZWFtUHJvZmlsZV9zdWJUZWFtX2ZlYXR1cmUgPSBcdTA0MWZcdTA0M2VcdTA0MzRcdTA0NDdcdTA0MzhcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDMwDQotX1VJX1JvbGVEZXNjcmlwdG9yX1JvbGVfZmVhdHVyZSA9IFx1MDQyMFx1MDQzZVx1MDQzYlx1MDQ0Yw0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlID0gXHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyDQotX1VJX1JvbGVEZXNjcmlwdG9yX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUgPSBcdTA0MWVcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDM3XHUwNDMwDQotX1VJX1dvcmtPcmRlcl9saW5rVHlwZV9mZWF0dXJlID0gXHUwNDIyXHUwNDM4XHUwNDNmIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzOA0KLV9VSV9Xb3JrT3JkZXJfcHJlZF9mZWF0dXJlID0gXHUwNDFmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQ4XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDM4XHUwNDNhDQotX1VJX1BsYW5uaW5nRGF0YV9zdGFydERhdGVfZmVhdHVyZSA9IFx1MDQxZFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0MzRcdTA0MzBcdTA0NDJcdTA0MzANCi1fVUlfUGxhbm5pbmdEYXRhX2ZpbmlzaERhdGVfZmVhdHVyZSA9IFx1MDQxYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0MzRcdTA0MzBcdTA0NDJcdTA0MzANCi1fVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSA9IFx1MDQyMFx1MDQzMFx1MDQzZFx1MDQzMw0KLV9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlID0gXHUwNDIxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkIFx1MDQ0MSBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0MzhcdTA0M2FcdTA0M2VcdTA0M2MNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RW50cnlTdGF0ZV9mZWF0dXJlID0gXHUwNDIxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDRmXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZFx1MDQzMCBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUV4aXRTdGF0ZV9mZWF0dXJlID0gXHUwNDIxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDRmXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZFx1MDQzMCBcdTA0MzJcdTA0NGJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gXHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0ZWRCeV9mZWF0dXJlID0gXHUwNDFkXHUwNDMwXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzZlx1MDQzZVx1MDQzNCBcdTA0MzJcdTA0M2JcdTA0MzhcdTA0NGZcdTA0M2RcdTA0MzhcdTA0MzVcdTA0M2MNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdHNfZmVhdHVyZSA9IFx1MDQxMlx1MDQzYlx1MDQzOFx1MDQ0Zlx1MDQzNVx1MDQ0MiBcdTA0M2RcdTA0MzANCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2RlbGl2ZXJhYmxlUGFydHNfZmVhdHVyZSA9IFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotX1VJX1Rhc2tEZXNjcmlwdG9yX1Rhc2tfZmVhdHVyZSA9IFx1MDQxN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzMA0KLV9VSV9UYXNrRGVzY3JpcHRvcl9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlID0gXHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Yw0KLV9VSV9UYXNrRGVzY3JpcHRvcl9hc3Npc3RlZEJ5X2ZlYXR1cmUgPSBcdTA0MWZcdTA0M2VcdTA0M2JcdTA0NDNcdTA0NDdcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDQ5XHUwNDRjIFx1MDQzZVx1MDQ0Mg0KLV9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUgPSBcdTA0MTJcdTA0M2RcdTA0MzVcdTA0NDhcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0DQotX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBcdTA0MWVcdTA0MzFcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0DQotX1VJX1Rhc2tEZXNjcmlwdG9yX29wdGlvbmFsSW5wdXRfZmVhdHVyZSA9IFx1MDQxZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzQNCi1fVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUgPSBcdTA0MTJcdTA0NGJcdTA0NDVcdTA0M2VcdTA0MzQNCi1fVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSA9IFx1MDQxZVx1MDQ0MVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGMNCi1fVUlfVGFza0Rlc2NyaXB0b3Jfc2VsZWN0ZWRTdGVwc19mZWF0dXJlID0gXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0OFx1MDQzMFx1MDQzM1x1MDQzOA0KLV9VSV9Db21wb3NpdGVSb2xlX2FnZ3JlZ2F0ZWRSb2xlc19mZWF0dXJlID0gXHUwNDFlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzOA0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlID0gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQzZSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUNCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBcdTA0MWRcdTA0MzBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSA9IFx1MDQxMFx1MDQzYlx1MDQ0Y1x1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzZFx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQzMlx1MDQ0Yg0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2hvd3RvU3RhZmZfZmVhdHVyZSA9IFx1MDQxZlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzZVx1MDQzZFx1MDQzMFx1MDQzYiBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0M2FcdTA0MzgNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSA9IFx1MDQxY1x1MDQzMFx1MDQ0MVx1MDQ0OFx1MDQ0Mlx1MDQzMFx1MDQzMQ0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzX2ZlYXR1cmUgPSBcdTA0MjVcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDMwDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlID0gXHUwNDIxXHUwNDQyXHUwNDM1XHUwNDNmXHUwNDM1XHUwNDNkXHUwNDRjIFx1MDQ0MFx1MDQzOFx1MDQ0MVx1MDQzYVx1MDQzMA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9lc3RpbWF0aW5nVGVjaG5pcXVlX2ZlYXR1cmUgPSBcdTA0MWNcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2FcdTA0MzAgXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDNhXHUwNDM4DQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IFx1MDQxYVx1MDQzMlx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0NDNcdTA0NDdcdTA0MzBcdTA0NDFcdTA0NDJcdTA0M2RcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDMwDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGVPZkNvbnRyYWN0X2ZlYXR1cmUgPSBcdTA0MjJcdTA0MzhcdTA0M2YgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNhXHUwNDQyXHUwNDMwDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBcdTA0MTJcdTA0M2RcdTA0MzVcdTA0NDhcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDE4XHUwNDE0DQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9zY29wZV9mZWF0dXJlID0gXHUwNDFlXHUwNDMxXHUwNDNiXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDRjDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl91c2FnZU5vdGVzX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZQ0KLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fcmVmaW5lZERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTA0MjNcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotX1VJX1ByYWN0aWNlX3N1YlByYWN0aWNlc19mZWF0dXJlID0gXHUwNDEyXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1fVUlfUHJhY3RpY2VfY29udGVudFJlZmVyZW5jZXNfZmVhdHVyZSA9IFx1MDQyMVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCBcdTA0M2RcdTA0MzAgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotX1VJX1ByYWN0aWNlX2FjdGl2aXR5UmVmZXJlbmNlc19mZWF0dXJlID0gXHUwNDIxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzZFx1MDQzMCBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1fVUlfU3RhdGVfV29ya1Byb2R1Y3RfZmVhdHVyZSA9IFx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDINCi1fVUlfU3RhdGVfUmVnaW9uX2ZlYXR1cmUgPSBcdTA0MWVcdTA0MzFcdTA0M2JcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NGMNCi1fVUlfU3RhdGVfc3VibWFjaGluZV9mZWF0dXJlID0gXHUwNDEyXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQzMFx1MDQ0Mg0KLV9VSV9WZXJ0ZXhfY29udGFpbmVyX2ZlYXR1cmUgPSBcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzVcdTA0MzlcdTA0M2RcdTA0MzVcdTA0NDANCi1fVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUgPSBcdTA0MThcdTA0NDFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGZcdTA0NDlcdTA0MzhcdTA0MzkNCi1fVUlfVmVydGV4X2luY29taW5nX2ZlYXR1cmUgPSBcdTA0MTJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGZcdTA0NDlcdTA0MzhcdTA0MzkNCi1fVUlfUmVnaW9uX1ZlcnRleF9mZWF0dXJlID0gXHUwNDEyXHUwNDM1XHUwNDQwXHUwNDQ4XHUwNDM4XHUwNDNkXHUwNDMwDQotX1VJX1JlZ2lvbl9UcmFuc2l0aW9uX2ZlYXR1cmUgPSBcdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0NDVcdTA0M2VcdTA0MzQNCi1fVUlfUmVnaW9uX1N0YXRlX2ZlYXR1cmUgPSBcdTA0MjFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NGZcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfUmVnaW9uX1N0YXRlTWFjaGluZV9mZWF0dXJlID0gXHUwNDFhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQzMFx1MDQ0Mg0KLV9VSV9TdGF0ZU1hY2hpbmVfUmVnaW9uX2ZlYXR1cmUgPSBcdTA0MWVcdTA0MzFcdTA0M2JcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NGMNCi1fVUlfVHJhbnNpdGlvbl9Xb3JrRGVmaW5pdGlvbl9mZWF0dXJlID0gXHUwNDFlXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQ0Yg0KLV9VSV9UcmFuc2l0aW9uX2NvbnRhaW5lcl9mZWF0dXJlID0gXHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNkXHUwNDM1XHUwNDQwDQotX1VJX1RyYW5zaXRpb25fc291cmNlX2ZlYXR1cmUgPSBcdTA0MThcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0MzhcdTA0M2ENCi1fVUlfVHJhbnNpdGlvbl90YXJnZXRfZmVhdHVyZSA9IFx1MDQyNlx1MDQzNVx1MDQzYlx1MDQ0Yw0KLV9VSV9EaXNjaXBsaW5lX3Rhc2tzX2ZlYXR1cmUgPSBcdTA0MTdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi1fVUlfRGlzY2lwbGluZV9zdWJkaXNjaXBsaW5lX2ZlYXR1cmUgPSBcdTA0MWZcdTA0M2VcdTA0MzRcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0MzANCi1fVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSA9IFx1MDQyMVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0NDJcdTA0M2VcdTA0M2FcdTA0MzggXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5DQotX1VJX1JvbGVTZXRfcm9sZXNfZmVhdHVyZSA9IFx1MDQyMFx1MDQzZVx1MDQzYlx1MDQzOA0KLV9VSV9Eb21haW5fd29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBcdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiDQotX1VJX0RvbWFpbl9zdWJkb21haW5zX2ZlYXR1cmUgPSBcdTA0MWZcdTA0M2VcdTA0MzRcdTA0MzRcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGINCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3dvcmtQcm9kdWN0c19mZWF0dXJlID0gXHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IFx1MDQxNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQ0Yg0KLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBcdTA0MjBcdTA0NDNcdTA0M2FcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQzYw0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfZmVhdHVyZSA9IFx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlID0gXHUwNDFhXHUwNDNiXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDM4XHUwNDQ0XHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0Yg0KLV9VSV9DdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX2ZlYXR1cmUgPSBcdTA0MWZcdTA0M2VcdTA0MzRcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzgNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2VkdWNhdGlvbk1hdGVyaWFsc19mZWF0dXJlID0gXHUwNDIzXHUwNDQ3XHUwNDM1XHUwNDMxXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzZVx1MDQzMVx1MDQzOFx1MDQ0Zg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNfZmVhdHVyZSA9IFx1MDQxMFx1MDQzZFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0NGINCi1fVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUgPSBcdTA0MTJcdTA0M2FcdTA0M2JcdTA0NGVcdTA0NDdcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQ4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkXHUwNDRiDQotX1VJX1Byb2Nlc3NfZGVmYXVsdENvbnRleHRfZmVhdHVyZSA9IFx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQ0MiBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlDQotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBcdTA0MTRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyDQotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX2Jhc2VkT25Qcm9jZXNzZXNfZmVhdHVyZSA9IFx1MDQxZFx1MDQzMCBcdTA0M2VcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfaW50ZXJmYWNlc19mZWF0dXJlID0gXHUwNDE4XHUwNDNkXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDQ0XHUwNDM1XHUwNDM5XHUwNDQxXHUwNDRiDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxDQotX1VJX1Byb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19mZWF0dXJlID0gXHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMA0KLV9VSV9Qcm9jZXNzUGFja2FnZV9kaWFncmFtc19mZWF0dXJlID0gXHUwNDE0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDRiDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnNfZmVhdHVyZSA9IFx1MDQyMVx1MDQzZlx1MDQzNVx1MDQ0Nlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzhcdTA0M2RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0NDRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0MzANCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VJT19mZWF0dXJlID0gXHUwNDE4XHUwNDNkXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDQ0XHUwNDM1XHUwNDM5XHUwNDQxXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzMlx1MDQzMlx1MDQzZVx1MDQzNC1cdTA0MzJcdTA0NGJcdTA0MzJcdTA0M2VcdTA0MzQNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlID0gXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMA0KLV9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSA9IFx1MDQxY1x1MDQzZVx1MDQzNlx1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGZcdTA0NDJcdTA0NGNcdTA0NDFcdTA0NGYgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNjDQotX1VJX01ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19mZWF0dXJlID0gXHUwNDFmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDRiIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLV9VSV9NZXRob2RQbHVnaW5fYmFzZXNfZmVhdHVyZSA9IFx1MDQxMVx1MDQzMFx1MDQzN1x1MDQ0Yg0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUgPSBcdTA0MjJcdTA0MzhcdTA0M2YgXHUwNDMyXHUwNDMwXHUwNDQwXHUwNDM4XHUwNDMwXHUwNDQyXHUwNDM4XHUwNDMyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM4DQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBcdTA0MTJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NGMgXHUwNDNkXHUwNDMwIFx1MDQzZVx1MDQ0MVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzANCi1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBcdTA0MTBcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGINCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUgPSBcdTA0MTRcdTA0MzBcdTA0NDJcdTA0MzAgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX01ldGhvZFVuaXRfY2hhbmdlRGVzY3JpcHRpb25fZmVhdHVyZSA9IFx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1fVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUgPSBcdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0NGYNCi1fVUlfTWV0aG9kVW5pdF9jb3B5cmlnaHRTdGF0ZW1lbnRfZmVhdHVyZSA9IFx1MDQxOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2VcdTA0MzEgXHUwNDMwXHUwNDMyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzMFx1MDQ0NQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBsdWdpblNlbGVjdGlvbl9mZWF0dXJlID0gXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0ZiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUgPSBcdTA0MTJcdTA0NGJcdTA0MzFcdTA0M2VcdTA0NDAgXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlID0gXHUwNDFmXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNiXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2RlZmF1bHRWaWV3X2ZlYXR1cmUgPSBcdTA0MWZcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0NGMgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gXHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLV9VSV9Qcm9jZXNzRmFtaWx5X2RlbGl2ZXJ5UHJvY2Vzc2VzX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0NGIgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDM4DQotX1VJX01ldGhvZExpYnJhcnlfbWV0aG9kUGx1Z2luc19mZWF0dXJlID0gXHUwNDFjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLV9VSV9NZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19mZWF0dXJlID0gXHUwNDFmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLV9VSV9Vbmtub3duX2ZlYXR1cmUgPSBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNlDQotDQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9TdGFydF9saXRlcmFsID0gZmluaXNoVG9TdGFydA0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvRmluaXNoX2xpdGVyYWwgPSBmaW5pc2hUb0ZpbmlzaA0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9TdGFydF9saXRlcmFsID0gc3RhcnRUb1N0YXJ0DQotX1VJX1dvcmtPcmRlclR5cGVfc3RhcnRUb0ZpbmlzaF9saXRlcmFsID0gc3RhcnRUb0ZpbmlzaA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfaW5pdGlhbF9saXRlcmFsID0gaW5pdGlhbA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gam9pbg0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZm9ya19saXRlcmFsID0gZm9yaw0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfanVuY3Rpb25fbGl0ZXJhbCA9IGp1bmN0aW9uDQotX1VJX1BzZXVkb1N0YXRlS2luZF9jaG9pY2VfbGl0ZXJhbCA9IGNob2ljZQ0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZW50cnlQb2ludF9saXRlcmFsID0gZW50cnlQb2ludA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZXhpdFBvaW50X2xpdGVyYWwgPSBleGl0UG9pbnQNCi1fVUlfUHNldWRvU3RhdGVLaW5kX3Rlcm1pbmF0ZV9saXRlcmFsID0gdGVybWluYXRlDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9uYV9saXRlcmFsID0gbmENCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2NvbnRyaWJ1dGVzX2xpdGVyYWwgPSBjb250cmlidXRlcw0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gZXh0ZW5kcw0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfcmVwbGFjZXNfbGl0ZXJhbCA9IHJlcGxhY2VzDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbENvbnRyaWJ1dGlvbl9saXRlcmFsID0gbG9jYWxDb250cmlidXRpb24NCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IGxvY2FsUmVwbGFjZW1lbnQNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdG9yX3R5cGUgPSBcdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDM1XHUwNDQ0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDMwDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRvcl90eXBlID0gXHUwNDE0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzANCi1fVUlfT3V0Y29tZURlc2NyaXB0b3JfdHlwZSA9IFx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0MzhcdTA0NDFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkN2NmOWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWFmNTgyNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwyYS5qYXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3ZTU0YzEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UubmwyYS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMmEuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMmEuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMzk1Njg2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMmEvZnJhZ21lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZnJhZ21lbnROYW1lPUVQRiBDb21wb3NlciBVTUEgRWRpdCAoTkwyYSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTIzNTU2Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIFRvIGNvZGUgZGV2ZWxvcGVyOg0KLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotcGx1Z2luTmFtZSA9IEVNRiBVTUEgLSByZWRpZ2VyaW5nc3N0XHUwMGY4dHRlDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IE9wcmV0IG55IHswfSB1bmRlciBmdW5rdGlvbmVuIHsxfQ0KLV9VSV9DcmVhdGVDaGlsZF9kZXNjcmlwdGlvbiA9IE9wcmV0IGVuIG55IHVuZGVyb3JkbmV0IHR5cGUgezB9IGZvciBmdW5rdGlvbmVuIHsxfSBmb3IgZGVuIHZhbGd0ZSB7Mn0uDQotX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBPcHJldCBlbiBueSBzaWRlb3JkbmV0IGFmIHR5cGVuIHswfSBmb3IgZGVuIHZhbGd0ZSB7Mn0sIHVuZGVyIGZ1bmt0aW9uZW4gezF9IGZvciBkZXJlcyBvdmVyb3JkbmVkZS4NCi0NCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gezB9IGFmIHsxfQ0KLQ0KLV9VSV9DbGFzc2lmaWVyX3R5cGUgPSBLbGFzc2lmaWthdGlvbg0KLV9VSV9UeXBlX3R5cGUgPSBUeXBlDQotX1VJX0VsZW1lbnRfdHlwZSA9IEVsZW1lbnQNCi1fVUlfTmFtZWRFbGVtZW50X3R5cGUgPSBOYXZuZ2l2ZXQgZWxlbWVudA0KLV9VSV9QYWNrYWdlYWJsZUVsZW1lbnRfdHlwZSA9IEVsZW1lbnQsIGRlciBrYW4gcGFra2VzDQotX1VJX1BhY2thZ2VfdHlwZSA9IFBha2tlDQotX1VJX05hbWVzcGFjZV90eXBlID0gTmF2bmVvbXJcdTAwZTVkZQ0KLV9VSV9NZXRob2RFbGVtZW50X3R5cGUgPSBNZXRvZGVlbGVtZW50DQotX1VJX0NvbnN0cmFpbnRfdHlwZSA9IEJldGluZ2Vsc2UNCi1fVUlfQ29udGVudEVsZW1lbnRfdHlwZSA9IEluZGhvbGRzZWxlbWVudA0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IEVsZW1lbnQsIGRlciBrYW4gYmVza3JpdmVzDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl90eXBlID0gSW5kaG9sZHNiZXNrcml2ZWxzZQ0KLV9VSV9TZWN0aW9uX3R5cGUgPSBBZnNuaXQNCi1fVUlfUm9sZV90eXBlID0gUm9sbGUNCi1fVUlfV29ya1Byb2R1Y3RfdHlwZSA9IEFyYmVqZHNwcm9kdWt0DQotX1VJX1Rhc2tfdHlwZSA9IE9wZ2F2ZQ0KLV9VSV9Xb3JrRGVmaW5pdGlvbl90eXBlID0gQXJiZWpkc2RlZmluaXRpb24NCi1fVUlfU3RlcF90eXBlID0gVHJpbg0KLV9VSV9HdWlkYW5jZV90eXBlID0gVmVqbGVkbmluZw0KLV9VSV9BcnRpZmFjdF90eXBlID0gQXJ0ZWZha3QNCi1fVUlfRGVsaXZlcmFibGVfdHlwZSA9IExldmVyYW5jZQ0KLV9VSV9PdXRjb21lX3R5cGUgPSBSZXN1bHRhdA0KLV9VSV9NZXRob2RQYWNrYWdlX3R5cGUgPSBNZXRvZGVwYWtrZQ0KLV9VSV9Db250ZW50UGFja2FnZV90eXBlID0gSW5kaG9sZHNwYWtrZQ0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUgPSBCZXNrcml2ZWxzZSBhZiBhcnRlZmFrdA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUgPSBCZXNrcml2ZWxzZSBhZiBhcmJlamRzcHJvZHVrdA0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3R5cGUgPSBCZXNrcml2ZWxzZSBhZiBsZXZlcmFuY2UNCi1fVUlfUm9sZURlc2NyaXB0aW9uX3R5cGUgPSBCZXNrcml2ZWxzZSBhZiByb2xsZQ0KLV9VSV9UYXNrRGVzY3JpcHRpb25fdHlwZSA9IEJlc2tyaXZlbHNlIGFmIG9wZ2F2ZQ0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUgPSBCZXNrcml2ZWxzZSBhZiB2ZWpsZWRuaW5nDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSA9IEJlc2tyaXZlbHNlIGFmIFx1MDBmOHZlbHNlDQotX1VJX1BvaW50X3R5cGUgPSBQdW5rdA0KLV9VSV9HcmFwaEVsZW1lbnRfdHlwZSA9IEdyYWZlbGVtZW50DQotX1VJX0RpYWdyYW1FbGVtZW50X3R5cGUgPSBEaWFncmFtZWxlbWVudA0KLV9VSV9EaWFncmFtTGlua190eXBlID0gRGlhZ3JhbWxpbmsNCi1fVUlfR3JhcGhDb25uZWN0b3JfdHlwZSA9IEdyYWZmb3JiaW5kZWxzZQ0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2UNCi1fVUlfRGltZW5zaW9uX3R5cGUgPSBEaW1lbnNpb24NCi1fVUlfUmVmZXJlbmNlX3R5cGUgPSBSZWZlcmVuY2UNCi1fVUlfUHJvcGVydHlfdHlwZSA9IEVnZW5za2FiDQotX1VJX0dyYXBoRWRnZV90eXBlID0gR3JhZmthbnQNCi1fVUlfRGlhZ3JhbV90eXBlID0gRGlhZ3JhbQ0KLV9VSV9HcmFwaE5vZGVfdHlwZSA9IEdyYWZub2RlDQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUgPSBTaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudA0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBVTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlDQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBDb3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZQ0KLV9VSV9MZWFmRWxlbWVudF90eXBlID0gQmxhZGVsZW1lbnQNCi1fVUlfVGV4dEVsZW1lbnRfdHlwZSA9IFRla3N0ZWxlbWVudA0KLV9VSV9JbWFnZV90eXBlID0gQmlsbGVkZQ0KLV9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUgPSBQcmltaXRpdiBncmFmaWsNCi1fVUlfUG9seWxpbmVfdHlwZSA9IFBvbHlsaW5qZQ0KLV9VSV9FbGxpcHNlX3R5cGUgPSBFbGxpcHNlDQotX1VJX0FjdGl2aXR5X3R5cGUgPSBBa3Rpdml0ZXQNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IEFyYmVqZHNuZWRicnlkbmluZ3NlbGVtZW50DQotX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IE5lZGJyeWRuaW5nc2VsZW1lbnQNCi1fVUlfTWlsZXN0b25lX3R5cGUgPSBNaWxlcFx1MDBlNmwNCi1fVUlfSXRlcmF0aW9uX3R5cGUgPSBHZW50YWdlbHNlDQotX1VJX1BoYXNlX3R5cGUgPSBGYXNlDQotX1VJX1RlYW1Qcm9maWxlX3R5cGUgPSBUZWFtcHJvZmlsDQotX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUgPSBSb2xsZWRlc2tyaXB0b3INCi1fVUlfV29ya09yZGVyX3R5cGUgPSBBcmJlamRzclx1MDBlNmtrZWZcdTAwZjhsZ2UNCi1fVUlfUHJvY2Vzc0VsZW1lbnRfdHlwZSA9IFByb2Nlc2VsZW1lbnQNCi1fVUlfUGxhbm5pbmdEYXRhX3R5cGUgPSBQbGFubFx1MDBlNmduaW5nc2RhdGENCi1fVUlfRGVzY3JpcHRvcl90eXBlID0gRGVza3JpcHRvcg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSA9IEFyYmVqZHNwcm9kdWt0ZGVza3JpcHRvcg0KLV9VSV9UYXNrRGVzY3JpcHRvcl90eXBlID0gT3BnYXZlZGVza3JpcHRvcg0KLV9VSV9Db21wb3NpdGVSb2xlX3R5cGUgPSBTYW1tZW5zYXQgcm9sbGUNCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3R5cGUgPSBCZXNrcml2ZWxzZSBhZiBuZWRicnlkbmluZ3NlbGVtZW50DQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSA9IEJlc2tyaXZlbHNlIGFmIGFrdGl2aXRldA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gQmVza3JpdmVsc2UgYWYgbGV2ZXJpbmdzcHJvY2VzDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gQmVza3JpdmVsc2UgYWYgcHJvY2VzDQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gQmVza3JpdmVsc2UgYWYgZGVza3JpcHRvcg0KLV9VSV9Db25jZXB0X3R5cGUgPSBCZWdyZWINCi1fVUlfQ2hlY2tsaXN0X3R5cGUgPSBUamVrbGlzdGUNCi1fVUlfRXhhbXBsZV90eXBlID0gRWtzZW1wZWwNCi1fVUlfR3VpZGVsaW5lX3R5cGUgPSBSZXRuaW5nc2xpbmplDQotX1VJX1JlcG9ydF90eXBlID0gUmFwcG9ydA0KLV9VSV9UZW1wbGF0ZV90eXBlID0gU2thYmVsb24NCi1fVUlfU3VwcG9ydGluZ01hdGVyaWFsX3R5cGUgPSBTdFx1MDBmOHR0ZW1hdGVyaWFsZQ0KLV9VSV9Ub29sTWVudG9yX3R5cGUgPSBWXHUwMGU2cmt0XHUwMGY4anNtZW50b3INCi1fVUlfV2hpdGVwYXBlcl90eXBlID0gSHZpZGJvZw0KLV9VSV9UZXJtRGVmaW5pdGlvbl90eXBlID0gVGVybWRlZmluaXRpb24NCi1fVUlfUHJhY3RpY2VfdHlwZSA9IFx1MDBkOHZlbHNlDQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gRXN0aW1lcmluZ3NvdmVydmVqZWxzZXINCi1fVUlfUmV1c2FibGVBc3NldF90eXBlID0gR2VuYW52ZW5kZWxpZ3QgYWt0aXYNCi1fVUlfU3RhdGVfdHlwZSA9IFN0YXQNCi1fVUlfVmVydGV4X3R5cGUgPSBWZXJ0ZXgNCi1fVUlfUmVnaW9uX3R5cGUgPSBSZWdpb24NCi1fVUlfU3RhdGVNYWNoaW5lX3R5cGUgPSBUaWxzdGFuZHNtYXNraW5lDQotX1VJX1RyYW5zaXRpb25fdHlwZSA9IFRyYW5zaXRpb24NCi1fVUlfUHNldWRvU3RhdGVfdHlwZSA9IFBzZXVkb3RpbHN0YW5kDQotX1VJX0Rpc2NpcGxpbmVfdHlwZSA9IERpc2NpcGxpbg0KLV9VSV9Db250ZW50Q2F0ZWdvcnlfdHlwZSA9IEluZGhvbGRza2F0ZWdvcmkNCi1fVUlfUm9sZVNldF90eXBlID0gUm9sbGVzXHUwMGU2dA0KLV9VSV9Eb21haW5fdHlwZSA9IERvbVx1MDBlNm5lDQotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gQXJiZWpkc3Byb2R1a3R0eXBlDQotX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlID0gRGlzY2lwbGluZ3J1cHBlcmluZw0KLV9VSV9Ub29sX3R5cGUgPSBWXHUwMGU2cmt0XHUwMGY4ag0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSA9IFJvbGxlc1x1MDBlNnRzZ3J1cHBlcmluZw0KLV9VSV9DdXN0b21DYXRlZ29yeV90eXBlID0gVGlscGFzc2V0IGthdGVnb3JpDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlID0gTGV2ZXJpbmdzcHJvY2VzDQotX1VJX1Byb2Nlc3NfdHlwZSA9IFByb2Nlcw0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlID0gRnVua3Rpb25zbVx1MDBmOG5zdGVyDQotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUgPSBQcm9jZXNwbGFubFx1MDBlNmduaW5nc3NrYWJlbG9uDQotX1VJX1JvYWRtYXBfdHlwZSA9IFZlanZpc2VyDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSA9IFByb2Nlc2tvbXBvbmVudA0KLV9VSV9Qcm9jZXNzUGFja2FnZV90eXBlID0gUHJvY2VzcGFra2UNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV90eXBlID0gUHJvY2Vza29tcG9uZW50Z3JcdTAwZTZuc2VmbGFkZQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlID0gUHJvY2Vza29tcG9uZW50ZGVza3JpcHRvcg0KLV9VSV9NZXRob2RQbHVnaW5fdHlwZSA9IE1ldG9kZS1wbHVnaW4NCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUgPSBWYXJpYWJpbGl0ZXRzZWxlbWVudA0KLV9VSV9NZXRob2RVbml0X3R5cGUgPSBNZXRvZGVlbmhlZA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUgPSBNZXRvZGVrb25maWd1cmF0aW9uDQotX1VJX1Byb2Nlc3NGYW1pbHlfdHlwZSA9IFByb2Nlc2ZhbWlsaWUNCi1fVUlfTWV0aG9kTGlicmFyeV90eXBlID0gTWV0b2RlYmlibGlvdGVrDQotX1VJX1Vua25vd25fdHlwZSA9IE9iamVrdA0KLQ0KLV9VSV9Vbmtub3duX2RhdGF0eXBlPSBWXHUwMGU2cmRpDQotDQotX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUgPSBOYXZuDQotX1VJX01ldGhvZEVsZW1lbnRfZ3VpZF9mZWF0dXJlID0gR1VJRA0KLV9VSV9NZXRob2RFbGVtZW50X2JyaWVmRGVzY3JpcHRpb25fZmVhdHVyZSA9IEtvcnQgYmVza3JpdmVsc2UNCi1fVUlfTWV0aG9kRWxlbWVudF9vd25lZFJ1bGVzX2ZlYXR1cmUgPSBFamVkZSByZWdsZXINCi1fVUlfTWV0aG9kRWxlbWVudF9zdXBwcmVzc2VkX2ZlYXR1cmUgPSBVbmRlcnRyeWt0DQotX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlID0gUlx1MDBlNmtrZWZcdTAwZjhsZ2VndWlkZQ0KLV9VSV9Db25zdHJhaW50X2JvZHlfZmVhdHVyZSA9IEluZGhvbGQNCi1fVUlfQ29udGVudEVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gU3RcdTAwZjh0dGVtYXRlcmlhbGUNCi1fVUlfQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfZmVhdHVyZSA9IEJlZ3JlYmVyIG9nIHBhcGlyZXINCi1fVUlfQ29udGVudEVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlID0gVGpla2xpc3Rlcg0KLV9VSV9Db250ZW50RWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBSZXRuaW5nc2xpbmplcg0KLV9VSV9Db250ZW50RWxlbWVudF9leGFtcGxlc19mZWF0dXJlID0gRWtzZW1wbGVyDQotX1VJX0NvbnRlbnRFbGVtZW50X2Fzc2V0c19mZWF0dXJlID0gQWt0aXZlcg0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uTmFtZV9mZWF0dXJlID0gUHJcdTAwZTZzZW50YXRpb25zbmF2bg0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQclx1MDBlNnNlbnRhdGlvbg0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBTaGFwZWljb24NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBOb2RlaWNvbg0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBPdmVyb3JkbmV0IGJlc2tyaXZlbHNlDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19mZWF0dXJlID0gQWZzbml0DQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9rZXlDb25zaWRlcmF0aW9uc19mZWF0dXJlID0gTlx1MDBmOGdsZW92ZXJ2ZWplbHNlcg0KLV9VSV9TZWN0aW9uX3NlY3Rpb25OYW1lX2ZlYXR1cmUgPSBBZnNuaXRzbmF2bg0KLV9VSV9TZWN0aW9uX3NlY3Rpb25EZXNjcmlwdGlvbl9mZWF0dXJlID0gQWZzbml0c2Jlc2tyaXZlbHNlDQotX1VJX1NlY3Rpb25fc3ViU2VjdGlvbnNfZmVhdHVyZSA9IFVuZGVyYWZzbml0DQotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IEZvcmdcdTAwZTZuZ2VyDQotX1VJX1JvbGVfbW9kaWZpZXNfZmVhdHVyZSA9IFx1MDBjNm5kcmVyDQotX1VJX1JvbGVfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IEFuc3ZhcmxpZyBmb3INCi1fVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlID0gUmFwcG9ydGVyDQotX1VJX1dvcmtQcm9kdWN0X3RlbXBsYXRlc19mZWF0dXJlID0gU2thYmVsb25lcg0KLV9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlID0gVlx1MDBlNnJrdFx1MDBmOGpzbWVudG9yZXINCi1fVUlfV29ya1Byb2R1Y3RfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBFc3RpbWVyaW5nc292ZXJ2ZWplbHNlcg0KLV9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBVZGZcdTAwZjhydCBhZg0KLV9VSV9UYXNrX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBQXHUwMGU1a3JcdTAwZTZ2ZXQgaW5wdXQNCi1fVUlfVGFza19vdXRwdXRfZmVhdHVyZSA9IE91dHB1dA0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBZZGVybGlnZXJlIHVkZlx1MDBmOHJ0IGFmDQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gVmFsZ2ZyaXQgaW5wdXQNCi1fVUlfVGFza19zdGVwc19mZWF0dXJlID0gVHJpbg0KLV9VSV9UYXNrX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBWXHUwMGU2cmt0XHUwMGY4anNtZW50b3Jlcg0KLV9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gRXN0aW1lcmluZ3NvdmVydmVqZWxzZXINCi1fVUlfV29ya0RlZmluaXRpb25fcHJlY29uZGl0aW9uX2ZlYXR1cmUgPSBGb3JoXHUwMGU1bmRzYmV0aW5nZWxzZQ0KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX2ZlYXR1cmUgPSBFZnRlcmZcdTAwZjhsZ2VuZGUgYmV0aW5nZWxzZQ0KLV9VSV9BcnRpZmFjdF9jb250YWluZXJBcnRpZmFjdF9mZWF0dXJlID0gT3BiZXZhcmluZ3NzdGVkc2FydGVmYWt0DQotX1VJX0FydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19mZWF0dXJlID0gSW5kZWhvbGR0ZSBhcnRlZmFrdGVyDQotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gTGV2ZXJlZGUgYXJiZWpkc3Byb2R1a3Rlcg0KLV9VSV9NZXRob2RQYWNrYWdlX2dsb2JhbF9mZWF0dXJlID0gR2xvYmFsDQotX1VJX01ldGhvZFBhY2thZ2VfcmV1c2VkUGFja2FnZXNfZmVhdHVyZSA9IEdlbmJydWd0ZSBwYWtrZXINCi1fVUlfTWV0aG9kUGFja2FnZV9wYXJlbnRQYWNrYWdlX2ZlYXR1cmUgPSBPdmVyb3JkbmV0IHBha2tlDQotX1VJX01ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19mZWF0dXJlID0gVW5kZXJvcmRuZWRlIHBha2tlcg0KLV9VSV9Db250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfZmVhdHVyZSA9IEluZGhvbGRzZWxlbWVudGVyDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fYnJpZWZPdXRsaW5lX2ZlYXR1cmUgPSBLb3J0IG92ZXJzaWd0DQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUgPSBJbmRzdGlsbGluZ2VyIGZvciByZXByXHUwMGU2c2VudGF0aW9uDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gRWtzdGVybiBpZA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IEZvcm1cdTAwZTVsDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25faW1wYWN0T2ZOb3RIYXZpbmdfZmVhdHVyZSA9IFZpcmtuaW5nIGFmIGlra2UgYXQgaGF2ZQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3JlYXNvbnNGb3JOb3ROZWVkaW5nX2ZlYXR1cmUgPSBcdTAwYzVyc2FnZXIgdGlsIGlra2UgYXQgYmVoXHUwMGY4dmUNCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9leHRlcm5hbERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBFa3N0ZXJuIGJlc2tyaXZlbHNlDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSA9IFBha2tldmVqbGVkbmluZw0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fc2tpbGxzX2ZlYXR1cmUgPSBLb21wZXRlbmNlcg0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fYXNzaWdubWVudEFwcHJvYWNoZXNfZmVhdHVyZSA9IFRpbGRlbGluZ3NtXHUwMGU1ZGVyDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlID0gU3lub255bWVyDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBGb3JtXHUwMGU1bA0KLV9VSV9UYXNrRGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBBbHRlcm5hdGl2ZXINCi1fVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl9hdHRhY2htZW50c19mZWF0dXJlID0gVmVkaFx1MDBlNmZ0bmluZ2VyDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYWRkaXRpb25hbEluZm9fZmVhdHVyZSA9IFlkZXJsaWdlcmUgb3BseXNuaW5nZXINCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9wcm9ibGVtX2ZlYXR1cmUgPSBQcm9ibGVtDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlID0gQmFnZ3J1bmQNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9nb2Fsc19mZWF0dXJlID0gTVx1MDBlNWwNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hcHBsaWNhdGlvbl9mZWF0dXJlID0gUHJvZ3JhbQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2xldmVsc09mQWRvcHRpb25fZmVhdHVyZSA9IEFkb3B0aW9uc25pdmVhdWVyDQotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgNCi1fVUlfUG9pbnRfeV9mZWF0dXJlID0gWQ0KLV9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSA9IFBvc2l0aW9uDQotX1VJX0dyYXBoRWxlbWVudF9jb250YWluZWRfZmVhdHVyZSA9IEluZGVob2xkdA0KLV9VSV9HcmFwaEVsZW1lbnRfbGlua19mZWF0dXJlID0gTGluaw0KLV9VSV9HcmFwaEVsZW1lbnRfYW5jaG9yYWdlX2ZlYXR1cmUgPSBGb3JhbmtyaW5nDQotX1VJX0dyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX2ZlYXR1cmUgPSBTZW1hbnRpc2sgbW9kZWwNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfaXNWaXNpYmxlX2ZlYXR1cmUgPSBFciBzeW5saWcNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfY29udGFpbmVyX2ZlYXR1cmUgPSBPcGJldmFyaW5nc3N0ZWQNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUgPSBSZWZlcmVuY2UNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfZmVhdHVyZSA9IEVnZW5za2FiDQotX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSA9IFpvb20NCi1fVUlfRGlhZ3JhbUxpbmtfdmlld3BvcnRfZmVhdHVyZSA9IFZpc25pbmdzcG9ydA0KLV9VSV9EaWFncmFtTGlua19ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IEdyYWZlbGVtZW50DQotX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSA9IERpYWdyYW0NCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBHcmFmZWxlbWVudA0KLV9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVkZ2VfZmVhdHVyZSA9IEdyYWZrYW50DQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQclx1MDBlNnNlbnRhdGlvbg0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gR3JhZmVsZW1lbnQNCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9kaWFncmFtX2ZlYXR1cmUgPSBEaWFncmFtDQotX1VJX0RpbWVuc2lvbl93aWR0aF9mZWF0dXJlID0gQnJlZGRlDQotX1VJX0RpbWVuc2lvbl9oZWlnaHRfZmVhdHVyZSA9IEhcdTAwZjhqZGUNCi1fVUlfUmVmZXJlbmNlX2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBFciBpbmRpdmlkdWVsIHJlcHJcdTAwZTZzZW50YXRpb24NCi1fVUlfUmVmZXJlbmNlX3JlZmVyZW5jZWRfZmVhdHVyZSA9IFJlZmVyZXJldA0KLV9VSV9Qcm9wZXJ0eV9rZXlfZmVhdHVyZSA9IE5cdTAwZjhnbGUNCi1fVUlfUHJvcGVydHlfdmFsdWVfZmVhdHVyZSA9IFZcdTAwZTZyZGkNCi1fVUlfR3JhcGhFZGdlX2FuY2hvcl9mZWF0dXJlID0gQW5rZXINCi1fVUlfR3JhcGhFZGdlX3dheXBvaW50c19mZWF0dXJlID0gVmVqcHVua3Rlcg0KLV9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSA9IFpvb20NCi1fVUlfRGlhZ3JhbV92aWV3cG9pbnRfZmVhdHVyZSA9IFN5bnN2aW5rZWwNCi1fVUlfRGlhZ3JhbV9kaWFncmFtTGlua19mZWF0dXJlID0gRGlhZ3JhbWxpbmsNCi1fVUlfRGlhZ3JhbV9uYW1lc3BhY2VfZmVhdHVyZSA9IE5hdm5lb21yXHUwMGU1ZGUNCi1fVUlfR3JhcGhOb2RlX3NpemVfZmVhdHVyZSA9IFN0XHUwMGY4cnJlbHNlDQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGVJbmZvX2ZlYXR1cmUgPSBUeXBlb3BseXNuaW5nZXINCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUgPSBFbGVtZW50DQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnQNCi1fVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlID0gVGVrc3QNCi1fVUlfSW1hZ2VfdXJpX2ZlYXR1cmUgPSBVcmkNCi1fVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSA9IE1JTUUtdHlwZQ0KLV9VSV9Qb2x5bGluZV9jbG9zZWRfZmVhdHVyZSA9IEx1a2tldA0KLV9VSV9Qb2x5bGluZV93YXlwb2ludHNfZmVhdHVyZSA9IFZlanB1bmt0ZXINCi1fVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUgPSBSYWRpdXMgWA0KLV9VSV9FbGxpcHNlX3JhZGl1c1lfZmVhdHVyZSA9IFJhZGl1cyBZDQotX1VJX0VsbGlwc2Vfcm90YXRpb25fZmVhdHVyZSA9IFJvdGF0aW9uDQotX1VJX0VsbGlwc2Vfc3RhcnRBbmdsZV9mZWF0dXJlID0gU3RhcnR2aW5rZWwNCi1fVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlID0gU2x1dHZpbmtlbA0KLV9VSV9FbGxpcHNlX2NlbnRlcl9mZWF0dXJlID0gQ2VudHJlcmV0DQotX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUgPSBOZWRicnlkbmluZ3NlbGVtZW50ZXINCi1fVUlfQWN0aXZpdHlfcm9hZG1hcHNfZmVhdHVyZSA9IFZlanZpc2VyZQ0KLV9VSV9BY3Rpdml0eV9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUgPSBTdFx1MDBmOHR0ZW1hdGVyaWFsZQ0KLV9VSV9BY3Rpdml0eV9jaGVja2xpc3RzX2ZlYXR1cmUgPSBUamVrbGlzdGVyDQotX1VJX0FjdGl2aXR5X2NvbmNlcHRzX2ZlYXR1cmUgPSBCZWdyZWJlcg0KLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gRWtzZW1wbGVyDQotX1VJX0FjdGl2aXR5X2d1aWRlbGluZXNfZmVhdHVyZSA9IFJldG5pbmdzbGluamVyDQotX1VJX0FjdGl2aXR5X3JldXNhYmxlQXNzZXRzX2ZlYXR1cmUgPSBHZW5hbnZlbmRlbGlnZSBha3RpdmVyDQotX1VJX0FjdGl2aXR5X2lzRW5hY3RhYmxlX2ZlYXR1cmUgPSBLYW4gcmVhZ2VyZXMgcFx1MDBlNQ0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc1JlcGVhdGFibGVfZmVhdHVyZSA9IEthbiBnZW50YWdlcw0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSA9IEVyIGlnYW5ndlx1MDBlNnJlbmRlDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzRXZlbnREcml2ZW5fZmVhdHVyZSA9IEVyIGFrdGl2aXRldHNzdHlyZXQNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfbGlua1RvUHJlZGVjZXNzb3JfZmVhdHVyZSA9IExpbmsgdGlsIGZvcmdcdTAwZTZuZ2VyDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlZml4X2ZlYXR1cmUgPSBQclx1MDBlNmZpa3MNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc1BsYW5uZWRfZmVhdHVyZSA9IEVyIHBsYW5sYWd0DQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlID0gSGFyIGZsZXJlIGZvcmVrb21zdGVyDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlID0gRXIgdmFsZ2ZyaQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEFmdGVyX2ZlYXR1cmUgPSBWaXN0IGVmdGVyDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQmVmb3JlX2ZlYXR1cmUgPSBWaXN0IGZcdTAwZjhyDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX2ZlYXR1cmUgPSBQbGFubFx1MDBlNmduaW5nc2RhdGENCi1fVUlfQnJlYWtkb3duRWxlbWVudF9zdXBlckFjdGl2aXRpZXNfZmVhdHVyZSA9IFN1cGVyYWt0aXZpdGV0ZXINCi1fVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUgPSBUZWFtcm9sbGVyDQotX1VJX1RlYW1Qcm9maWxlX3N1cGVyVGVhbV9mZWF0dXJlID0gU3VwZXJ0ZWFtDQotX1VJX1RlYW1Qcm9maWxlX3N1YlRlYW1fZmVhdHVyZSA9IFVuZGVydGVhbQ0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9Sb2xlX2ZlYXR1cmUgPSBSb2xsZQ0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlID0gXHUwMGM2bmRyZXINCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IEFuc3ZhcmxpZyBmb3INCi1fVUlfV29ya09yZGVyX2xpbmtUeXBlX2ZlYXR1cmUgPSBMaW5rdHlwZQ0KLV9VSV9Xb3JrT3JkZXJfcHJlZF9mZWF0dXJlID0gRm9yZw0KLV9VSV9QbGFubmluZ0RhdGFfc3RhcnREYXRlX2ZlYXR1cmUgPSBTdGFydGRhdG8NCi1fVUlfUGxhbm5pbmdEYXRhX2ZpbmlzaERhdGVfZmVhdHVyZSA9IFNsdXRkYXRvDQotX1VJX1BsYW5uaW5nRGF0YV9yYW5rX2ZlYXR1cmUgPSBSYW5nDQotX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUgPSBFciBzeW5rcm9uaXNlcmV0IG1lZCBraWxkZQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUgPSBBa3Rpdml0ZXRzaW5kZ2FuZ3N0aWxzdGFuZA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFeGl0U3RhdGVfZmVhdHVyZSA9IEFrdGl2aXRldHN1ZGdhbmdzdGlsc3RhbmQNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBBcmJlamRzcHJvZHVrdA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0ZWRCeV9mZWF0dXJlID0gUFx1MDBlNXZpcmtldCBhZg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0c19mZWF0dXJlID0gUFx1MDBlNXZpcmtlcg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfZGVsaXZlcmFibGVQYXJ0c19mZWF0dXJlID0gTGV2ZXJhbmNlZGVsZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUgPSBPcGdhdmUNCi1fVUlfVGFza0Rlc2NyaXB0b3JfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSA9IFNla3VuZFx1MDBlNnIgdWRmXHUwMGY4cmVuZGUNCi1fVUlfVGFza0Rlc2NyaXB0b3JfYXNzaXN0ZWRCeV9mZWF0dXJlID0gQXNzaXN0ZXJldCBhZg0KLV9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUgPSBFa3N0ZXJudCBpbnB1dA0KLV9VSV9UYXNrRGVzY3JpcHRvcl9tYW5kYXRvcnlJbnB1dF9mZWF0dXJlID0gUFx1MDBlNWtyXHUwMGU2dmV0IGlucHV0DQotX1VJX1Rhc2tEZXNjcmlwdG9yX29wdGlvbmFsSW5wdXRfZmVhdHVyZSA9IFZhbGdmcml0IGlucHV0DQotX1VJX1Rhc2tEZXNjcmlwdG9yX291dHB1dF9mZWF0dXJlID0gT3V0cHV0DQotX1VJX1Rhc2tEZXNjcmlwdG9yX3BlcmZvcm1lZFByaW1hcmlseUJ5X2ZlYXR1cmUgPSBQcmltXHUwMGU2ciB1ZGZcdTAwZjhyZW5kZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9zZWxlY3RlZFN0ZXBzX2ZlYXR1cmUgPSBWYWxndGUgdHJpbg0KLV9VSV9Db21wb3NpdGVSb2xlX2FnZ3JlZ2F0ZWRSb2xlc19mZWF0dXJlID0gU2FtbGVkZSByb2xsZXINCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3VzYWdlR3VpZGFuY2VfZmVhdHVyZSA9IEJydWdzdmVqbGVkbmluZw0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IEZvcm1cdTAwZTVsDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBBbHRlcm5hdGl2ZXINCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUgPSBIb3d0byBTdGFmZg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9zY2FsZV9mZWF0dXJlID0gU2thbGENCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlID0gUHJvamVrdGthcmFrdGVyaXN0aWthDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlID0gUmlzaWtvbml2ZWF1DQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX2VzdGltYXRpbmdUZWNobmlxdWVfZmVhdHVyZSA9IEVzdGltZXJpbmdzdGVrbmlrDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IFByb2pla3RkZWx0YWdlcmtvbXBldGVuY2UNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZU9mQ29udHJhY3RfZmVhdHVyZSA9IEtvbnRyYWt0dHlwZQ0KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gRWtzdGVybiBpZA0KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fc2NvcGVfZmVhdHVyZSA9IE9tZmFuZw0KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdXNhZ2VOb3Rlc19mZWF0dXJlID0gQnJ1Z3NiZW1cdTAwZTZya25pbmdlcg0KLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fcmVmaW5lZERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBEZXRhbGplcmV0IGJlc2tyaXZlbHNlDQotX1VJX1ByYWN0aWNlX3N1YlByYWN0aWNlc19mZWF0dXJlID0gVW5kZXJcdTAwZjh2ZWxzZXINCi1fVUlfUHJhY3RpY2VfY29udGVudFJlZmVyZW5jZXNfZmVhdHVyZSA9IEluZGhvbGRzcmVmZXJlbmNlcg0KLV9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSA9IEFrdGl2aXRldHNyZWZlcmVuY2VyDQotX1VJX1N0YXRlX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBBcmJlamRzcHJvZHVrdA0KLV9VSV9TdGF0ZV9SZWdpb25fZmVhdHVyZSA9IFJlZ2lvbg0KLV9VSV9TdGF0ZV9zdWJtYWNoaW5lX2ZlYXR1cmUgPSBTdWJtYXNraW5lDQotX1VJX1ZlcnRleF9jb250YWluZXJfZmVhdHVyZSA9IE9wYmV2YXJpbmdzc3RlZA0KLV9VSV9WZXJ0ZXhfb3V0Z29pbmdfZmVhdHVyZSA9IFVkZ1x1MDBlNWVuZGUNCi1fVUlfVmVydGV4X2luY29taW5nX2ZlYXR1cmUgPSBJbmRnXHUwMGU1ZW5kZQ0KLV9VSV9SZWdpb25fVmVydGV4X2ZlYXR1cmUgPSBWZXJ0ZXgNCi1fVUlfUmVnaW9uX1RyYW5zaXRpb25fZmVhdHVyZSA9IFRyYW5zaXRpb24NCi1fVUlfUmVnaW9uX1N0YXRlX2ZlYXR1cmUgPSBTdGF0DQotX1VJX1JlZ2lvbl9TdGF0ZU1hY2hpbmVfZmVhdHVyZSA9IFRpbHN0YW5kc21hc2tpbmUNCi1fVUlfU3RhdGVNYWNoaW5lX1JlZ2lvbl9mZWF0dXJlID0gUmVnaW9uDQotX1VJX1RyYW5zaXRpb25fV29ya0RlZmluaXRpb25fZmVhdHVyZSA9IEFyYmVqZHNkZWZpbml0aW9uDQotX1VJX1RyYW5zaXRpb25fY29udGFpbmVyX2ZlYXR1cmUgPSBPcGJldmFyaW5nc3N0ZWQNCi1fVUlfVHJhbnNpdGlvbl9zb3VyY2VfZmVhdHVyZSA9IEtpbGRlDQotX1VJX1RyYW5zaXRpb25fdGFyZ2V0X2ZlYXR1cmUgPSBNXHUwMGU1bA0KLV9VSV9EaXNjaXBsaW5lX3Rhc2tzX2ZlYXR1cmUgPSBPcGdhdmVyDQotX1VJX0Rpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9mZWF0dXJlID0gVW5kZXJkaXNjaXBsaW4NCi1fVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSA9IFJlZmVyZW5jZWFyYmVqZHNnYW5nZQ0KLV9VSV9Sb2xlU2V0X3JvbGVzX2ZlYXR1cmUgPSBSb2xsZXINCi1fVUlfRG9tYWluX3dvcmtQcm9kdWN0c19mZWF0dXJlID0gQXJiZWpkc3Byb2R1a3Rlcg0KLV9VSV9Eb21haW5fc3ViZG9tYWluc19mZWF0dXJlID0gVW5kZXJkb21cdTAwZTZuZXINCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3dvcmtQcm9kdWN0c19mZWF0dXJlID0gQXJiZWpkc3Byb2R1a3Rlcg0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IERpc2NpcGxpbmVyDQotX1VJX1Rvb2xfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFZcdTAwZTZya3RcdTAwZjhqc21lbnRvcmVyDQotX1VJX1JvbGVTZXRHcm91cGluZ19yb2xlU2V0c19mZWF0dXJlID0gUm9sbGVzXHUwMGU2dA0KLV9VSV9DdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX2ZlYXR1cmUgPSBLYXRlZ29yaXNlcmVkZSBlbGVtZW50ZXINCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19mZWF0dXJlID0gVW5kZXJrYXRlZ29yaWVyDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19lZHVjYXRpb25NYXRlcmlhbHNfZmVhdHVyZSA9IFVkZGFubmVsc2VzbWF0ZXJpYWxlDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19jb21tdW5pY2F0aW9uc01hdGVyaWFsc19mZWF0dXJlID0gS29tbXVuaWthdGlvbnNtYXRlcmlhbGUNCi1fVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUgPSBJbmtsdWRlcmVyIG1cdTAwZjhuc3RyZQ0KLV9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUgPSBTdGFuZGFyZGtvbnRla3N0DQotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBHeWxkaWcga29udGVrc3QNCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlID0gQmFzZXJldCBwXHUwMGU1IHByb2Nlc3Nlcg0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50X2ludGVyZmFjZXNfZmVhdHVyZSA9IEdyXHUwMGU2bnNlZmxhZGVyDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gUHJvY2VzDQotX1VJX1Byb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19mZWF0dXJlID0gUHJvY2VzZWxlbWVudGVyDQotX1VJX1Byb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX2ZlYXR1cmUgPSBEaWFncmFtbWVyDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnNfZmVhdHVyZSA9IEdyXHUwMGU2bnNlZmxhZGVzcGVjaWZpa2F0aW9uZXINCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VJT19mZWF0dXJlID0gR3JcdTAwZTZuc2VmbGFkZS1JL08NCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlID0gUHJvY2Vza29tcG9uZW50DQotX1VJX01ldGhvZFBsdWdpbl91c2VyQ2hhbmdlYWJsZV9mZWF0dXJlID0gS2FuIFx1MDBlNm5kcmVzIGFmIGJydWdlcg0KLV9VSV9NZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfZmVhdHVyZSA9IE1ldG9kZXBha2tlcg0KLV9VSV9NZXRob2RQbHVnaW5fYmFzZXNfZmVhdHVyZSA9IEJhc2lzDQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSA9IFZhcmlhYmlsaXRldHN0eXBlDQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBWYXJpYWJpbGl0ZXQgYmFzZXJldCBwXHUwMGU1IGVsZW1lbnQNCi1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBGb3JmYXR0ZXJlDQotX1VJX01ldGhvZFVuaXRfY2hhbmdlRGF0ZV9mZWF0dXJlID0gXHUwMGM2bmRyaW5nc2RhdG8NCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHUwMGM2bmRyaW5nc2Jlc2tyaXZlbHNlDQotX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlID0gVmVyc2lvbg0KLV9VSV9NZXRob2RVbml0X2NvcHlyaWdodFN0YXRlbWVudF9mZWF0dXJlID0gQ29weXJpZ2h0LWVya2xcdTAwZTZyaW5nDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fbWV0aG9kUGx1Z2luU2VsZWN0aW9uX2ZlYXR1cmUgPSBWYWxnIGFmIG1ldG9kZS1wbHVnaW4NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUgPSBWYWxnIGFmIG1ldG9kZXBha2tlDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fcHJvY2Vzc1ZpZXdzX2ZlYXR1cmUgPSBQcm9jZXNvdmVyc2lndGVyDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fZGVmYXVsdFZpZXdfZmVhdHVyZSA9IFN0YW5kYXJkb3ZlcnNpZ3QNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9iYXNlQ29uZmlndXJhdGlvbnNfZmVhdHVyZSA9IEJhc2lza29uZmlndXJhdGlvbmVyDQotX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSA9IExldmVyaW5nc3Byb2Nlc3Nlcg0KLV9VSV9NZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfZmVhdHVyZSA9IE1ldG9kZS1wbHVnaW5zDQotX1VJX01ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX2ZlYXR1cmUgPSBGb3J1ZGRlZmluZXJlZGUga29uZmlndXJhdGlvbmVyDQotX1VJX1Vua25vd25fZmVhdHVyZSA9IFVzcGVjaWZpY2VyZXQNCi0NCi1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb1N0YXJ0X2xpdGVyYWwgPSBmaW5pc2hUb1N0YXJ0DQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9GaW5pc2hfbGl0ZXJhbCA9IGZpbmlzaFRvRmluaXNoDQotX1VJX1dvcmtPcmRlclR5cGVfc3RhcnRUb1N0YXJ0X2xpdGVyYWwgPSBzdGFydFRvU3RhcnQNCi1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvRmluaXNoX2xpdGVyYWwgPSBzdGFydFRvRmluaXNoDQotX1VJX1BzZXVkb1N0YXRlS2luZF9pbml0aWFsX2xpdGVyYWwgPSBzdGFydA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gc2FtbWVua1x1MDBlNmRuaW5nDQotX1VJX1BzZXVkb1N0YXRlS2luZF9mb3JrX2xpdGVyYWwgPSBmb3JncmVuaW5nDQotX1VJX1BzZXVkb1N0YXRlS2luZF9qdW5jdGlvbl9saXRlcmFsID0gc2FtbWVuZlx1MDBmOGpuaW5nDQotX1VJX1BzZXVkb1N0YXRlS2luZF9jaG9pY2VfbGl0ZXJhbCA9IHZhbGcNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2VudHJ5UG9pbnRfbGl0ZXJhbCA9IGluZGdhbmdzcHVua3QNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gc2x1dHB1bmt0DQotX1VJX1BzZXVkb1N0YXRlS2luZF90ZXJtaW5hdGVfbGl0ZXJhbCA9IGFmYnJ5ZA0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbmFfbGl0ZXJhbCA9IGlra2UgcmVsZXZhbnQNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2NvbnRyaWJ1dGVzX2xpdGVyYWwgPSBiaWRyYWdlcg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gdWR2aWRlcg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfcmVwbGFjZXNfbGl0ZXJhbCA9IGVyc3RhdHRlcg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbG9jYWxDb250cmlidXRpb25fbGl0ZXJhbCA9IGxva2FsdCBiaWRyYWcNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IGxva2FsIGVyc3RhdG5pbmcNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdG9yX3R5cGUgPSBBcnRlZmFrdGRlc2tyaXB0b3INCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBMZXZlcmFuY2VkZXNrcmlwdG9yDQotX1VJX091dGNvbWVEZXNjcmlwdG9yX3R5cGUgPSBSZXN1bHRhdGRlc2tyaXB0b3INCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5MmRkYzQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnVtYS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWZiZjNmMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgVU1BIChOTDEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYudW1hLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnVtYTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTdiMDEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YWZiNTFlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFVNQQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWEzNDc1MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1VTUEgZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjRhMWI3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVVNQSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyNTM4MzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFVNQQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9wbHVnaW5famEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI1MzgzMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgVU1BDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjUzODMyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBVTUENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyNTM4MzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFVNQQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI1MzgzMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgVU1BDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjUzODMyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBVTUENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYmZmOWQ1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWNvcHlyaWdodD1JQk0gQ29ycG9yYXRpb24NCi1lcnJfY2Fubm90TW9kaWZ5MD0nJ3swfScnIGthbm4gbmljaHQgZ2VcdTAwZTRuZGVydCB3ZXJkZW4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYzY0OTczLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWNvcHlyaWdodD1JQk0gQ29ycG9yYXRpb24NCi1lcnJfY2Fubm90TW9kaWZ5MD1ObyBzZSBwdWVkZSBtb2RpZmljYXIgJyd7MH0nJw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmY1OGRiYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1jb3B5cmlnaHQ9SUJNIENvcnBvcmF0aW9uDQotZXJyX2Nhbm5vdE1vZGlmeTA9SW1wb3NzaWJsZSBkZSBtb2RpZmllciAnJ3swfScnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYjAzM2JlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWNvcHlyaWdodD1JQk0gQ29ycG9yYXRpb24NCi1lcnJfY2Fubm90TW9kaWZ5MD1JbXBvc3NpYmlsZSBtb2RpZmljYXJlICcnezB9JycNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlMzRhYTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotY29weXJpZ2h0PUlCTSBDb3Jwb3JhdGlvbg0KLWVycl9jYW5ub3RNb2RpZnkwPScnezB9JycgXHUzMDZmXHU1OTA5XHU2NmY0XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZTY0Y2Y4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWNvcHlyaWdodD1JQk0gQ29ycG9yYXRpb24NCi1lcnJfY2Fubm90TW9kaWZ5MD0nJ3swfScnXHVjNzQ0KFx1Yjk3YykgXHVjMjE4XHVjODE1XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWM3NGMNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmZjI2OGEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotY29weXJpZ2h0PUlCTSBDb3Jwb3JhdGlvbg0KLWVycl9jYW5ub3RNb2RpZnkwPUltcG9zc1x1MDBlZHZlbCBtb2RpZmljYXIgJyd7MH0nJw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTlhYTkzYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1jb3B5cmlnaHQ9SUJNIENvcnBvcmF0aW9uDQotZXJyX2Nhbm5vdE1vZGlmeTA9XHU2NWUwXHU2Y2Q1XHU0ZmVlXHU2NTM5XHUyMDFjezB9XHUyMDFkDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNjJiODkwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWNvcHlyaWdodD1JQk0gQ29ycG9yYXRpb24NCi1lcnJfY2Fubm90TW9kaWZ5MD1cdTcxMjFcdTZjZDVcdTRmZWVcdTY1MzkgJyd7MH0nJw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTIzMDljNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTI4OTgyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBVTUEgKE5MMikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi51bWEubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYudW1hO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NGZjYTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyNTM4MzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFVNQQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhMjZhNzguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotY29weXJpZ2h0PUlCTSBDb3Jwb3JhdGlvbg0KLWVycl9jYW5ub3RNb2RpZnkwPVx1MDQxZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgJyd7MH0nJw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYzQ1NTE4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YjFlYmYyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgVU1BIChOTDJhKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYudW1hO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNjgyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI1MzgzMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFVNQQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTM1MTg5NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotY29weXJpZ2h0PUlCTSBDb3Jwb3JhdGlvbg0KLWVycl9jYW5ub3RNb2RpZnkwPUthbiBpa2tlIFx1MDBlNm5kcmUgJyd7MH0nJw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYzlkZjk4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMTU0ZGU3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgWE1MIFVNQSAoTkwxKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlN2IwMTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiY2QxNGMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+DQotIyA8L2NvcHlyaWdodD4NCi0jDQotIyAkSWQ6IHBsdWdpbl9kZS5wcm9wZXJ0aWVzLHYgMS4xIDIwMDYvMTEvMDIgMDA6NTA6NDcganRoYW0gRXhwICQNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcGx1Z2luTmFtZSA9IEVQRiAtIFhNTCBVTUEgTW9kZWxsDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTcwMmIyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5fZXMucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjQ3IGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBNb2RlbG8gZGUgVU1BIGRlIFhNTCBkZSBFUEYNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiNjlkMWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+DQotIyA8L2NvcHlyaWdodD4NCi0jDQotIyAkSWQ6IHBsdWdpbl9mci5wcm9wZXJ0aWVzLHYgMS4xIDIwMDYvMTEvMDIgMDA6NTA6NDcganRoYW0gRXhwICQNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcGx1Z2luTmFtZSA9IE1vZFx1MDBlOGxlIEVQRiBYTUwgVU1BDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZWE1NTUzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5faXQucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjQ3IGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBNb2RlbGxvIFVNQSBYTUwgRVBGDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTFkYTJhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5famEucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjQ3IGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBFUEYgWE1MIFVNQSBNb2RlbA0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjMzOGRhYy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgPGNvcHlyaWdodD4NCi0jIDwvY29weXJpZ2h0Pg0KLSMNCi0jICRJZDogcGx1Z2luX2tvLnByb3BlcnRpZXMsdiAxLjEgMjAwNi8xMS8wMiAwMDo1MDo0NyBqdGhhbSBFeHAgJA0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIFRvIGNvZGUgZGV2ZWxvcGVyOg0KLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1wbHVnaW5OYW1lID0gRVBGIFhNTCBVTUEgXHViYWE4XHViMzc4DQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1Zjg4YzYwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5fcHRfQlIucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjQ3IGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBNb2RlbG8gWE1MIFVNQSBkbyBFUEYNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyZDU2YjkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+DQotIyA8L2NvcHlyaWdodD4NCi0jDQotIyAkSWQ6IHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLHYgMS4xIDIwMDYvMTEvMDIgMDA6NTA6NDcganRoYW0gRXhwICQNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcGx1Z2luTmFtZSA9IEVQRiBYTUwgVU1BIFx1NmEyMVx1NTc4Yg0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2VlZWQ1Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgPGNvcHlyaWdodD4NCi0jIDwvY29weXJpZ2h0Pg0KLSMNCi0jICRJZDogcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsdiAxLjEgMjAwNi8xMS8wMiAwMDo1MDo0NyBqdGhhbSBFeHAgJA0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIFRvIGNvZGUgZGV2ZWxvcGVyOg0KLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1wbHVnaW5OYW1lID0gRVBGIFhNTCBVTUEgTW9kZWwNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMi8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNzA2NGJlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZmJlM2I3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgWE1MIFVNQSAoTkwyKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NGZjYTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcnUucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdlNTM0OWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+DQotIyA8L2NvcHlyaWdodD4NCi0jDQotIyAkSWQ6IHBsdWdpbl9ydS5wcm9wZXJ0aWVzLHYgMS4xIDIwMDYvMTEvMDIgMDA6NTA6NDcganRoYW0gRXhwICQNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcGx1Z2luTmFtZSA9IEVQRiAtIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQ0YyBVTUEgWE1MDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNDA3YTRkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjhmYTk4ZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBYTUwgVU1BIChOTDJhKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0ZTY4MjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlZTZjMzEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5fZGEucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjQyIGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBFUEYgWE1MIFVNQS1tb2RlbA0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODQyMDViMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4Y2x1ZGluZz0iY29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL0JTRWRpdG9yVmlldy5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Db250ZW50UGFja2FnZVRhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9HdWlkYW5jZVRhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Qcm9kdWN0RWRpdG9yVmlldy5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Qcm9kdWN0Vmlld2VyLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1JvbGVEb2N1bWVudGF0aW9uVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1JvbGVUYXNrc1RhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Sb2xlV29ya1Byb2R1Y3RzVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1Rhc2tEaXNjaXBsaW5lVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1Rhc2tEb2N1bWVudGF0aW9uVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1Rhc2tHdWlkYW5jZXNUYWIuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvVGFza1N0ZXBUYWIuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvV29ya1Byb2R1Y3REb2N1bWVudGF0aW9uVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1dvcmtQcm9kdWN0R3VpZGFuY2VzVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1dvcmtQcm9kdWN0VGFza3NUYWIuamF2YSIga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTliMzI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgQXV0aG9yaW5nIFVJIHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjMzNTJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODZiYjJhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1dlZCBOb3YgMjkgMTg6MDk6NDkgUFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MjA5ZjAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmRyYXcyZCwKLSBvcmcuZWNsaXBzZS5nZWYsCi0gb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMsCi0gb3JnLmVjbGlwc2UudWkuZm9ybXMsCi0gb3JnLmVjbGlwc2UudWkuaW50cm8sCi0gb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2UudGVhbS5jdnMudWksCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLAotIG9yZy5lY2xpcHNlLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkucmVuZGVyLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5yZW5kZXIuYXd0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llcywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWksCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jaGVhdHNoZWV0cy5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRuZCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5ZjUwMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaGVscC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2hlbHAvYm9vay54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaGVscC9ib29rLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODdiMDgxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaGVscC9ib29rLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPHRvYyBsYWJlbD0iRVBGIENvbXBvc2VyIE1ldGhvZCBBdXRocm9pbmcgSGVscCBQYWdlIiAgdG9waWM9Imh0bWwvYm9vay5odG1sIj4KLQk8dG9waWMgbGFiZWw9Ik10aG9kIEF1dGhvcmluZyBPdmVydmlldyIgaHJlZj0iaHRtbC9vdmVydmlldy5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJBdXRob3JpbmcgVHV0b3JpYWwiIGhyZWY9Imh0bWwvdHV0b3JpYWwuaHRtbCIvPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL0l0ZXJhdGlvbjE2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9JdGVyYXRpb24xNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzMTFlNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL0l0ZXJhdGlvbjE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9QaGFzZTE2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9QaGFzZTE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQ2MGJkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUGhhc2UxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUm9sZURlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1JvbGVEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzY4YzdiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUm9sZURlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1N5bmNoQmFyMTYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1N5bmNoQmFyMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYzk5NDRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9TeW5jaEJhcjE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9TeW5jaEJhcjI0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9TeW5jaEJhcjI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmM5OTQ0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvU3luY2hCYXIyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGFza0Rlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1Rhc2tEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU0ZTI2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1RlbXBsYXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9UZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3NjMyNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9UZW1wbGF0ZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9UZW1wbGF0ZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzc2MzI1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FjdGl2aXR5MTYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FjdGl2aXR5MTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hY3Rpdml0eTE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hY3Rpdml0eTI0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hY3Rpdml0eTI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWRkQWxsRGVwZW5kZW50RWxlbS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWRkQWxsRGVwZW5kZW50RWxlbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljYWNiOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FkZEFsbERlcGVuZGVudEVsZW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FkZHJlZl9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWRkcmVmX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjg0MGNkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWRkcmVmX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jaGVja2VkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jaGVja2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDYzNDRkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY2hlY2tlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY2xvc3VyZV9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY2xvc3VyZV9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhiNTU0MWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nsb3N1cmVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlYWxsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb2xsYXBzZWFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEyZDgwYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb2xsYXBzZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmNGM4YmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ubmVjdGlvbjE2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb25uZWN0aW9uMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxODZhMTI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb25uZWN0aW9uMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nvbm5lY3Rpb24yNC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ubmVjdGlvbjI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZhNWZlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ubmVjdGlvbjI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb253YXJuX2NvLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb253YXJuX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWI1MGMwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ud2Fybl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZGVjbm9kZV9wYWwxNi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZGVjbm9kZV9wYWwxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxNWE1YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2RlY25vZGVfcGFsMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2RlY25vZGVfcGFsMjQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2RlY25vZGVfcGFsMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNDZlYWExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9kZWNub2RlX3BhbDI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9lbmRub2RlX3BhbDE2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9lbmRub2RlX3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDA2NTA2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZW5kbm9kZV9wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZW5kbm9kZV9wYWwyNC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZW5kbm9kZV9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiMTc3ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2VuZG5vZGVfcGFsMjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Vycm9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9lcnJvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1ZTdhOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Vycm9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9leHBhbmRhbGwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2V4cGFuZGFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAyMDViMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2V4cGFuZGFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2V4cGFuZGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmY0ZDljNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2ZyZWV0ZXh0X3BhbDE2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkYjgxM2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2ZyZWV0ZXh0X3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwyNC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnJlZXRleHRfcGFsMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OGI0ZTA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1ByZXNfbmFtZV90b2dnbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9QcmVzX25hbWVfdG9nZ2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTcwYWZhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1ByZXNfbmFtZV90b2dnbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9QcmludC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1ByaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDQ1ZGU3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1ByaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvUmVmcmVzaC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1JlZnJlc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzY2EwNGQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvUmVmcmVzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1N0b3AuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9TdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTIwODIzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1N0b3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9mbGF0TGF5b3V0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvZmxhdExheW91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlZjc0Y2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9mbGF0TGF5b3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjM0NDg2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfZG93bi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfZG93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkNDNlMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX2Rvd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX2Rvd25fZGlzYWJsZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX2Rvd25fZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMGRjZjUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV9kb3duX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV91cC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfdXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDc0NzA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV91cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfdXBfZGlzYWJsZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX3VwX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjYyZGYxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfdXBfZGlzYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zaG93X2xpbmtlZF9lbGVtZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2ODRmN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zaG93X2xpbmtlZF9lbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudF9kaXNhYmxlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnRfZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYTdmOGZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudF9kaXNhYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgxYTc2MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zeW5jZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0NoZWNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0NoZWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI4OTcyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9DaGVjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9Db2xsYXBzZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ29sbGFwc2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGIzM2MzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9Db2xsYXBzZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvRGlzYWJsZUNoZWNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVDaGVjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzNjczNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvRGlzYWJsZUNoZWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVVbmNoZWNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVVbmNoZWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWUyYTc4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9EaXNhYmxlVW5jaGVjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9FeHBhbmRlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9FeHBhbmRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzNTc0NTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvRXhwYW5kZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0ZmIzMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiODJjMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9VbmNoZWNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1VuY2hlY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNGZhOTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1VuY2hlY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTEyNDE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQXV0aG9yaW5nUGVyc3BlY3RpdmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0F1dGhvcmluZ1BlcnNwZWN0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQXV0aG9yaW5nUGVyc3BlY3RpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0Jyb3dzaW5nUGVyc3BlY3RpdmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0Jyb3dzaW5nUGVyc3BlY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTg5NjAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Ccm93c2luZ1BlcnNwZWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db25maWd1cmF0aW9uRXJyb3JMb2dWaWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db25maWd1cmF0aW9uRXJyb3JMb2dWaWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTFiNjM3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQ29uZmlndXJhdGlvbkVycm9yTG9nVmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQ29uZmlndXJhdGlvblZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25WaWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQ29uZmlndXJhdGlvblZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbnRlbnRWaWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db250ZW50Vmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbnRlbnRWaWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9MaWJyYXJ5Vmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvTGlicmFyeVZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9MaWJyYXJ5Vmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvTWV0aG9kUGx1Z2luLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9NZXRob2RQbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjgyYzM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9NZXRob2RQbHVnaW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL05ldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vTmV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI0OTgzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vTmV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3dpemJhbi9zeW5jaHJvbml6YXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyNGIzNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvaGlkZVVuY2hlY2tlZEVsZW0uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2hpZGVVbmNoZWNrZWRFbGVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODcwOTM0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvaGlkZVVuY2hlY2tlZEVsZW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2xpbmtfcGFsMTYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2xpbmtfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOGY0MDhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9saW5rX3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9saW5rX3BhbDI0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9saW5rX3BhbDI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTQxMzdlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbGlua19wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbWFycV9wYWwxNi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbWFycV9wYWwxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3Zjg3NWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21hcnFfcGFsMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21hcnFfcGFsMjQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21hcnFfcGFsMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTdkNzg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tYXJxX3BhbDI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tb3ZlX2Rvd24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21vdmVfZG93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzMjgzNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21vdmVfZG93bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbW92ZV91cC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbW92ZV91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzMGMyYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21vdmVfdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwxNi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2VsZWN0X3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ1Y2FmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2VsZWN0X3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zZWxlY3RfcGFsMjQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViMGZjZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvYWN0aXZpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvYWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2FydGlmYWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9hcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jYXBhYmlsaXR5cGF0dGVybi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY2FwYWJpbGl0eXBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkODBiMWFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jYXBhYmlsaXR5cGF0dGVybi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY2hlY2tsaXN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jaGVja2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzNhYTNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jaGVja2xpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2NvbmNlcHQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2NvbmNlcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMGU5NWNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jb25jZXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jb250ZW50cGFja2FnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29udGVudHBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlM2FkOTZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jb250ZW50cGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY3VzdG9tY2F0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jdXN0b21jYXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YmIyZDhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jdXN0b21jYXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RlbGl2ZXJhYmxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kZWxpdmVyYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RlbGl2ZXJhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kZWxpdmVyeXByb2Nlc3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RlbGl2ZXJ5cHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyYmE3ODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RlbGl2ZXJ5cHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3MTVhOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2Rpc2NpcGxpbmVncm91cC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZWdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2I0MzA2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZWdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kb21haW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQwZTI1N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RvbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZ3VpZGVsaW5lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9ndWlkZWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9ndWlkZWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2l0ZXJhdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvaXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjVjOGExNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvaXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RsaWJyYXJ5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RsaWJyYXJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGI0Zjk3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWV0aG9kbGlicmFyeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWV0aG9kcGx1Z2luLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RwbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OTFhMjNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RwbHVnaW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL21pbGVzdG9uZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTc2ZmY5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWlsZXN0b25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9vdXRjb21lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9vdXRjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTcwMzUxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvb3V0Y29tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcGhhc2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTVjYjNjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcGhhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjlhMDg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzY29tcG9uZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzY29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGY5YTA4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc2NvbXBvbmVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc2NvbnRyaWJ1dGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc2NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5NjZiNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3Njb250cmlidXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3NwYWNrYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzcGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3NTdmYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3NwYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzcGxhbm5pbmd0ZW1wbGF0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc3BsYW5uaW5ndGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZDA2ODA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzcGxhbm5pbmd0ZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY5ZWJkZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3JvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3JvbGVkZXNfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlZGVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1NTI0YWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3JvbGVkZXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlZGVzY3JpcHRvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZWRlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNWEyMmIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlZGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZXNldC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZXNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmYjY3YzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3JvbGVzZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2suZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NjMzZDU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90YXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90YXNrZGVzX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDllZmUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90YXNrZGVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQ1ZDY1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNjcmlwdG9yMS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc2NyaXB0b3IxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQ1ZDY1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc2NyaXB0b3IxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90ZWNobmlxdWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlY2huaXF1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAxNTEzNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlY2huaXF1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGVtcGxhdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTU3YTdlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rvb2wuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rvb2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YzU1YTJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90b29sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90b29sbWVudG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90b29sbWVudG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGM1NWEyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdG9vbG1lbnRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd2hpdGVwYXBlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd2hpdGVwYXBlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyZTQ4ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3doaXRlcGFwZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dvcmtkZXNfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrZGVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlZWE4Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dvcmtkZXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3Jrb3JkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dvcmtvcmRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwNWViYzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dvcmtvcmRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd29ya3Byb2R1Y3RkZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dwZ3VpZGVsaW5lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93cGd1aWRlbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllOTFlNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dwZ3VpZGVsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaG93Q29uZmlnRXJyb3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3Nob3dDb25maWdFcnJvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxYjYzN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3Nob3dDb25maWdFcnJvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDE2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zdG5vZGVfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMjIyZjRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zdG5vZGVfcGFsMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3N0bm9kZV9wYWwyNC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTU2YjFmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zeW5jYmFyX3BhbDE2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zeW5jYmFyX3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQ5ZDBmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3luY2Jhcl9wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3luY2Jhcl9wYWwyNC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3luY2Jhcl9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQwN2QwN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3N5bmNiYXJfcGFsMjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3dhcm5pbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3dhcm5pbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZWUyMGFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy93YXJuaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy93Zl9lZGl0b3JfaWNvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2ZfZWRpdG9yX2ljb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZGRjMWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy93Zl9lZGl0b3JfaWNvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyNGIzNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3dpemJhbi9zeW5jaHJvbml6YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMWMzZTc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIEF1dGhvcmluZyBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgQ2F0ZWdvcnkKLW1ldGhvZENhdGVnb3J5TmFtZT1NZXRob2QKLQotIyBQZXJzcGVjdGl2ZQotYXV0aG9yaW5nUGVyc3BlY3RpdmVOYW1lPUF1dGhvcmluZwotYnJvd3NpbmdQZXJzcGVjdGl2ZU5hbWU9QnJvd3NpbmcKLQotIyBWaWV3cwotbGlicmFyeVZpZXdOYW1lPUxpYnJhcnkKLWNvbmZpZ3VyYXRpb25WaWV3TmFtZT1Db25maWd1cmF0aW9uCi1jb250ZW50Vmlld05hbWU9Q29udGVudAotY29uZmlndXJhdGlvbkVycm9yTG9nVmlld05hbWU9Q29uZmlndXJhdGlvbiBFcnJvciBMb2cKLQotIyBFZGl0b3JzCi1tZXRob2RFbGVtZW50RWRpdG9yTmFtZT1NZXRob2QgRWxlbWVudCBFZGl0b3IKLWNvbmZpZ3VyYXRpb25FZGl0b3JOYW1lPUNvbmZpZ3VyYXRpb24gRWRpdG9yCi1wcm9jZXNzRWRpdG9yTmFtZT1Qcm9jZXNzIEVkaXRvcgotYWN0aXZpdHlEaWFncmFtRWRpdG9yTmFtZT1BY3Rpdml0eSBEaWFncmFtIEVkaXRvcgotYWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yTmFtZT1BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBFZGl0b3IKLXdvcmtQcm9kdWN0RGVwZWRlbmN5RGlhZ3JhbUVkaXRvck5hbWU9V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbSBFZGl0b3IKLQotIyBXaXphcmRzCi1uZXdNZXRob2RMaWJyYXJ5V2l6YXJkTmFtZT1NZXRob2QgTGlicmFyeQotbmV3TWV0aG9kTGlicmFyeVdpemFyZERlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeS4KLW5ld01ldGhvZFBsdWdpbldpemFyZE5hbWU9TWV0aG9kIFBsdWctaW4KLW5ld01ldGhvZFBsdWdpbldpemFyZERlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBtZXRob2QgcGx1Zy1pbi4KLW5ld0NvbmZpZ3VyYXRpb25XaXphcmROYW1lPU1ldGhvZCBDb25maWd1cmF0aW9uCi1uZXdDb25maWd1cmF0aW9uV2l6YXJkRGVzY3JpcHRpb249Q3JlYXRlIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCi0jIENoZWF0IFNoZWV0cwotbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lPU1ldGhvZCBBdXRob3JpbmcgQ2hlYXQgU2hlZXRzCi1DaGVhdHNoZWV0R2V0c3RhcnRlZENhdGVnb3J5VGV4dD1HZXR0aW5nIFN0YXJ0ZWQKLUNoZWF0c2hlZXRSZXVzYWJsZUNvbnRlbnRDYXRlZ29yeVRleHQ9Q3JlYXRlIFJldXNhYmxlIE1ldGhvZCBDb250ZW50Ci1DaGVhdHNoZWV0V3JpdGVDb250ZW50Q2F0ZWdvcnlUZXh0PVdyaXRlIE1ldGhvZCBDb250ZW50Ci1DaGVhdHNoZWV0UHJvY2Vzc2VzQ2F0ZWdvcnlUZXh0PVdvcmsgd2l0aCBQcm9jZXNzZXMKLUNoZWF0c2hlZXROYXZpZ2F0ZU1ldGhvZENvbnRlbnQ9TmF2aWdhdGUgTWV0aG9kIENvbnRlbnQKLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RDb25maWd1cmF0aW9uPUNyZWF0ZSB5b3VyIG93biBNZXRob2QgQ29uZmlndXJhdGlvbgotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZFBsdWdpbj1DcmVhdGUgeW91ciBvd24gTWV0aG9kIFBsdWctaW4KLUNoZWF0c2hlZXRBZGRNZXRob2RDb250ZW50PUFkZCBuZXcgTWV0aG9kIENvbnRlbnQgc3VjaCBhcyBSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlCi1DaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHM9VGFpbG9yIGV4aXN0aW5nIE1ldGhvZCBFbGVtZW50cyAoUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzIG9yIEd1aWRhbmNlKSBVc2luZyBDb250cmlidXRpb24KLUNoZWF0c2hlZXRSZXBsYWNlTWVodG9kRWxlbWVudHM9UmVwbGFjZSBleGlzdGluZyBNZXRob2QgRWxlbWVudHMgKFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cyBvciBHdWlkYW5jZSkKLUNoZWF0c2hlZXRBZGRNZXRob2RSZWZPckh5cGVybGluaz1BZGQgYSBNZXRob2QgUmVmZXJlbmNlIG9yIEh5cGVybGluayAoVVJMKQotQ2hlYXRzaGVldEFwcGx5Q2FwYWJpbGl0eVBhdHRlcm49QXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4KLUNoZWF0c2hlZXRDcmVhdGVQcm9jZXNzPUNyZWF0ZSBhIFByb2Nlc3MgKENhcGFiaWxpdHkgUGF0dGVybiBvciBEZWxpdmVyeSBQcm9jZXNzKQotCi0jIEFjdGlvbiBTZXQKLWF1dGhvcmluZ0FjdGlvblNldD1BdXRob3JpbmcKLWNoZWF0U2hlZXRzQWN0aW9uU2V0PUNoZWF0IFNoZWV0cwotCi0jIEdsb2JhbCBBY3Rpb25zCi1uZXdMaWJyYXJ5QWN0aW9uPU1ldGhvZCAmTGlicmFyeQotbmV3TGlicmFyeUFjdGlvblRvb2x0aXA9Q3JlYXRlIGEgbmV3IE1ldGhvZCBMaWJyYXJ5Ci1uZXdQbHVnaW5BY3Rpb249TWV0aG9kICZQbHVnLWluCi1uZXdQbHVnaW5BY3Rpb25Ub29sdGlwPUNyZWF0ZSBhIG5ldyBNZXRob2QgUGx1Zy1pbgotbmV3Q29uZmlnQWN0aW9uPU1ldGhvZCAmQ29uZmlndXJhdGlvbgotbmV3Q29uZmlnQWN0aW9uVG9vbHRpcD1DcmVhdGUgYSBuZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24KLW9wZW5MaWJyYXJ5QWN0aW9uPU1ldGhvZCAmTGlicmFyeQotb3BlbkxpYnJhcnlBY3Rpb25Ub29sdGlwPU9wZW4gYW4gZXhpc3RpbmcgTWV0aG9kIExpYnJhcnkKLW9wZW5Db25maWdBY3Rpb249TWV0aG9kICZDb25maWd1cmF0aW9uCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1PcGVuIGFuIGV4aXN0aW5nIE1ldGhvZCBDb25maWd1cmF0aW9uCi1vcGVuQ2hlYXRTaGVldHM9JkNoZWF0IFNoZWV0cy4uLgotCi0jIExpYnJhcnkgVmlldyBBY3Rpb25zCi1saW5rV2l0aEVkaXRvcj1MaW5rIHdpdGggRWRpdG9yCi1saW5rV2l0aEVkaXRvclRvb2x0aXA9TGluayB3aXRoIEVkaXRvcgotc2hvd1ByZXNlbnRhdGlvbk5hbWVzPVNob3cgUHJlc2VudGF0aW9uIE5hbWVzCi1zaG93UHJlc2VudGF0aW9uTmFtZXNUb29sdGlwPVNob3cgUHJlc2VudGF0aW9uIE5hbWVzCi0KLSMgQ29uZmlndXJhdGlvbiBWaWV3IEFjdGlvbnMKLXJlZnJlc2hDb25maWc9UmVmcmVzaAotcmVmcmVzaENvbmZpZ1Rvb2x0aXA9UmVmcmVzaCBDb25maWd1cmF0aW9uCi0KLSMgUHJlZmVyZW5jZSBQYWdlCi1tZXRob2RBdXRob3JpbmdQYWdlPU1ldGhvZCBBdXRob3JpbmcKLXByb2Nlc3NFZGl0b3I9UHJvY2VzcyBFZGl0b3IKLWxpYnJhcnlPcHRpb25zPUxpYnJhcnkgT3B0aW9ucwotZGlhZ3JhbT1EaWFncmFtCi1zdGFydHVwQW5kU2h1dGRvd249U3RhcnR1cCBhbmQgU2h1dGRvd24KLWRlYnVnPURlYnVnCi1tb2RlbGluZ09wdGlvbnM9TW9kZWxpbmcgT3B0aW9ucwotCi0jIENvbW1hbmQgSGFuZGxlcgotc2VsZWN0QWxsPVNlbGVjdCBBbGwKLQotIyBQcm9wZXJ0aWVzIFZpZXcKLV9VSV9Qcm9jZXNzRWRpdG9yX21lbnU9UHJvY2VzcwotX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbT0mTmV3IENoaWxkCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZldyBTaWJsaW5nCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT1TaG93IFByb3BlcnRpZXMgJlZpZXcKLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT1SZSZmcmVzaAotX1VJX1Byb3BlcnRpZXNfR2VuZXJhbD1HZW5lcmFsCi1fVUlfUHJvcGVydGllc19Eb2N1bWVudGF0aW9uPURvY3VtZW50YXRpb24KLV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlPUd1aWRhbmNlCi1fVUlfUHJvcGVydGllc19Xb3JrX1JvbGx1cD1Xb3JrIFJvbGx1cAotX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXA9VGVhbSBSb2xsdXAKLSMjIFRoZSBmb2xsb3dpbmcgdmFsdWUgb2Ygc3RyaW5nIHNob3VsZCBiZSAiV29yayBQcm9kdWN0IFJvbGx1cCIuIEJ1dAotIyMgZHVlIHRvIGxpbWl0YXRpb24vYnVnIGluIEVjbGlwc2UgV1RQLCBpdCdzIGJlZW4gdHJ1bmNhdGVkIHRvIAotIyMgIldvcmsgUHJvZCBSb2xsdXAiLiBTbyBkdXJpbmcgdHJhbnNsYXRpb24sIHBsZWFzZSB0YWtlIHRoaXMgaW50byBjb25zaWRlcmF0aW9uLgotX1VJX1Byb3BlcnRpZXNfV1BfUm9sbHVwPVdvcmsgUHJvZCBSb2xsdXAKLV9VSV9Qcm9wZXJ0aWVzX1JvbGVzPVJvbGVzCi1fVUlfUHJvcGVydGllc19Xb3JrUHJvZHVjdHM9V29yayBQcm9kdWN0cwotX1VJX1Byb3BlcnRpZXNfU3RlcHM9U3RlcHMKLV9VSV9Qcm9wZXJ0aWVzX1RlYW1zPVRlYW1zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYWVlYWIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iVGFza0VkaXRvclBhZ2VQcm92aWRlciIgbmFtZT0iVGFzayBFZGl0b3IgUGFnZSBQcm92aWRlciIgc2NoZW1hPSJzY2hlbWEvVGFza0VkaXRvclBhZ2VQcm92aWRlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJQcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyIiBuYW1lPSJQcm9jZXNzIEVkaXRvciBQYWdlIFByb3ZpZGVyIiBzY2hlbWE9InNjaGVtYS9Qcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IndpemFyZFJlZ2lzdHJ5UHJvdmlkZXIiIG5hbWU9IldpemFyZCBSZWdpc3RlcnkgUHJvdmlkZXIiIHNjaGVtYT0ic2NoZW1hL3dpemFyZFJlZ2lzdHJ5UHJvdmlkZXIuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMiPgotICAgICAgPHBlcnNwZWN0aXZlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGZpeGVkPSJmYWxzZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvdmlldzE2L0F1dGhvcmluZ1BlcnNwZWN0aXZlLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1BlcnNwZWN0aXZlIgotICAgICAgICAgICAgbmFtZT0iJWF1dGhvcmluZ1BlcnNwZWN0aXZlTmFtZSIvPgotICAgICAgPHBlcnNwZWN0aXZlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5Ccm93c2luZ1BlcnNwZWN0aXZlIgotICAgICAgICAgICAgZml4ZWQ9ImZhbHNlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC92aWV3MTYvQnJvd3NpbmdQZXJzcGVjdGl2ZS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5Ccm93c2luZ1BlcnNwZWN0aXZlIgotICAgICAgICAgICAgbmFtZT0iJWJyb3dzaW5nUGVyc3BlY3RpdmVOYW1lIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkudmlld3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvdmlldzE2L0xpYnJhcnlWaWV3LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3IgotICAgICAgICAgICAgbmFtZT0iJWxpYnJhcnlWaWV3TmFtZSIvPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkudmlld3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25WaWV3LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3IgotICAgICAgICAgICAgbmFtZT0iJWNvbmZpZ3VyYXRpb25WaWV3TmFtZSIvPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkudmlld3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db250ZW50VmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvdmlldzE2L0NvbnRlbnRWaWV3LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbnRlbnRWaWV3IgotICAgICAgICAgICAgbmFtZT0iJWNvbnRlbnRWaWV3TmFtZSIvPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkudmlld3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5NZXNzYWdlVmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXcuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTWVzc2FnZVZpZXciCi0gICAgICAgICAgICBuYW1lPSIlY29uZmlndXJhdGlvbkVycm9yTG9nVmlld05hbWUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZUV4dGVuc2lvbnMiPgotICAgICAgPHBlcnNwZWN0aXZlRXh0ZW5zaW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZSI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgY2xvc2VhYmxlPSJmYWxzZSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3IgotICAgICAgICAgICAgICAgbW92ZWFibGU9InRydWUiCi0gICAgICAgICAgICAgICByYXRpbz0iMC41ZiIKLSAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD0iYm90dG9tIgotICAgICAgICAgICAgICAgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXciLz4KLSAgICAgICAgIDx2aWV3U2hvcnRjdXQKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3Ii8+Ci0gICAgICAgICA8dmlld1Nob3J0Y3V0Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldyIvPgotICAgICAgICAgPHNob3dJblBhcnQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXciLz4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICAgICAKLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQnJvd3NpbmdQZXJzcGVjdGl2ZSI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgY2xvc2VhYmxlPSJmYWxzZSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbnRlbnRWaWV3IgotICAgICAgICAgICAgICAgbW92ZWFibGU9InRydWUiCi0gICAgICAgICAgICAgICByYXRpbz0iMC43MGYiCi0gICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9InJpZ2h0IgotICAgICAgICAgICAgICAgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnNzIi8+Ci0gICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RFbGVtZW50LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciIKLSAgICAgICAgICAgIG5hbWU9IiVtZXRob2RFbGVtZW50RWRpdG9yTmFtZSIvPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9yIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29uZmlndXJhdGlvbkVkaXRvciIKLSAgICAgICAgICAgIG5hbWU9IiVjb25maWd1cmF0aW9uRWRpdG9yTmFtZSIvPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yIgotICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3IkQlNBY3Rpb25CYXJDb250cmlidXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSIlcHJvY2Vzc0VkaXRvck5hbWUiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSIlYWN0aXZpdHlEaWFncmFtRWRpdG9yTmFtZSIvPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iJWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvck5hbWUiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5HcmFwaGljYWxXUERlcGVuZGVuY3lFZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSIld29ya1Byb2R1Y3REZXBlZGVuY3lEaWFncmFtRWRpdG9yTmFtZSIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkubmV3V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3TGlicmFyeVdpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0xpYnJhcnlXaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlbmV3TWV0aG9kTGlicmFyeVdpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJW5ld01ldGhvZExpYnJhcnlXaXphcmREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPiAgICAgICAKLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkubmV3V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3TWV0aG9kUGx1Z2luV2l6YXJkIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4uZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdNZXRob2RQbHVnaW5XaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlbmV3TWV0aG9kUGx1Z2luV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAlbmV3TWV0aG9kUGx1Z2luV2l6YXJkRGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkubmV3V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3Q29uZmlndXJhdGlvbldpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0NvbmZpZ3VyYXRpb25XaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlbmV3Q29uZmlndXJhdGlvbldpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJW5ld0NvbmZpZ3VyYXRpb25XaXphcmREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+ICAgICAKLQotPCEtLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZ0FjdGlvblNldCIKLSAgICAgICAgICAgIGxhYmVsPSIlYXV0aG9yaW5nQWN0aW9uU2V0IgotICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk5ld0NvbmZpZ3VyYXRpb25BY3Rpb24iCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJmaWxlX25ld19jb25maWd1cmF0aW9uX2NvbnRleHQiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5OZXdDb25maWd1cmF0aW9uQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVuZXdDb25maWdBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZmlsZS9uZXcuZXh0L2dyb3VwbTIiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlbmV3Q29uZmlnQWN0aW9uVG9vbHRpcCIvPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5OZXdQbHVnaW5BY3Rpb24iCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJmaWxlX25ld19wbHVnaW5fY29udGV4dCIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTmV3UGx1Z2luQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVuZXdQbHVnaW5BY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZmlsZS9uZXcuZXh0L2dyb3VwbTIiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlbmV3TFBsdWdpbkFjdGlvblRvb2x0aXAiLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTmV3TGlicmFyeUFjdGlvbiIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9ImZpbGVfbmV3X2xpYnJhcnlfY29udGV4dCIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk5ld0xpYnJhcnlBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJW5ld0xpYnJhcnlBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZmlsZS9uZXcuZXh0L2dyb3VwbTEiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlbmV3TGlicmFyeUFjdGlvblRvb2x0aXAiLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuT3BlbkNvbmZpZ3VyYXRpb25BY3Rpb24iCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJmaWxlX29wZW5fY29uZmlndXJhdGlvbl9jb250ZXh0IgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuT3BlbkNvbmZpZ3VyYXRpb25BY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJW9wZW5Db25maWdBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZmlsZS9vcGVuLmV4dC9ncm91cG0yIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJW9wZW5Db25maWdBY3Rpb25Ub29sdGlwIi8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk9wZW5MaWJyYXJ5QWN0aW9uIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0iZmlsZV9vcGVuX2xpYnJhcnlfY29udGV4dCIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk9wZW5MaWJyYXJ5QWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVvcGVuTGlicmFyeUFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJmaWxlL29wZW4uZXh0L2dyb3VwbTEiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlb3BlbkxpYnJhcnlBY3Rpb25Ub29sdGlwIi8+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsZU5ld0V4dFJNQyIKLSAgICAgICAgICAgICAgIGxhYmVsPSJGaWxlTmV3RXh0Uk1DIgotICAgICAgICAgICAgICAgcGF0aD0iZmlsZS9uZXcuZXh0Ij4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iZ3JvdXBtMSIvPgotICAgICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJncm91cG0yIi8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsZU9wZW5FeHRSTUMiCi0gICAgICAgICAgICAgICBsYWJlbD0iRmlsZU9wZW5FeHRSTUMiCi0gICAgICAgICAgICAgICBwYXRoPSJmaWxlL29wZW4uZXh0Ij4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iZ3JvdXBtMSIvPgotICAgICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJncm91cG0yIi8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotLS0+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnByb3BlcnR5Q29udHJpYnV0b3IiPgotICAgICAgPHByb3BlcnR5Q29udHJpYnV0b3IKLSAgICAgICAgICAgIHR5cGVNYXBwZXI9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5FbGVtZW50VHlwZU1hcHBlciIKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yIgotICAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkVsZW1lbnRMYWJlbFByb3ZpZGVyIj4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5IGNhdGVnb3J5PSJlbGVtZW50Ii8+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeSBjYXRlZ29yeT0ib3RoZXIiLz4KLSAgICAgIDwvcHJvcGVydHlDb250cmlidXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eVRhYnMiPgotICAgICAgPHByb3BlcnR5VGFicwotICAgICAgICAgICAgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3IiPgotICAgICAgICAgPCEtLSBTVEFSVCBHRU5FUkFMIC0tPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0dlbmVyYWwiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5CcmVha2Rvd25FbGVtZW50LkdlbmVyYWwiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19HZW5lcmFsIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuV29ya0JyZWFrZG93bkVsZW1lbnQuR2VuZXJhbCIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0dlbmVyYWwiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5HZW5lcmFsIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLkdlbmVyYWwiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19HZW5lcmFsIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuR2VuZXJhbCIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0dlbmVyYWwiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5Xb3JrUHJvZHVjdERlc2NyaXB0b3IuR2VuZXJhbCIvPgotCQkgPCEtLSBFTkQgR0VORVJBTC0tPgotICAgICAgICAgCi0gICAgICAgICA8IS0tIFNUQVJUIERPQ1VNRU5UQVRJT04gLS0+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkJyZWFrZG93bkVsZW1lbnQuRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5CcmVha2Rvd25FbGVtZW50LkdlbmVyYWwiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5HZW5lcmFsIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkRlc2NyaXB0b3IuRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5HZW5lcmFsIi8+Ci0JCSA8IS0tIEVORCBET0NVTUVOVEFUSU9OIC0tPgotCQkKLQkJIDwhLS0gQUNUSVZJVFkgLS0+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfR3VpZGFuY2UiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5Lkd1aWRhbmNlIi8+ICAKLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19Xb3JrX1JvbGx1cCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5Lkd1aWRhbmNlIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LldvcmtSb2xsdXAiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19UZWFtX1JvbGx1cCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LldvcmtSb2xsdXAiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuVGVhbVJvbGx1cCIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX1dQX1JvbGx1cCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LlRlYW1Sb2xsdXAiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuV29ya1Byb2R1Y3RzUm9sbHVwIi8+Ci0gICAgICAgIAotICAgICAgICAgPCEtLSBUQVNLIERFU0NSSVBUT1IgLS0+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfUm9sZXMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5EZXNjcmlwdG9yLkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuVGFza0Rlc2NyaXB0b3IuUm9sZSIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX1dvcmtQcm9kdWN0cyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLlJvbGUiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuVGFza0Rlc2NyaXB0b3IuV29ya1Byb2R1Y3QiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19TdGVwcyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yIFJlbGF0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLlN0ZXAiLz4KLSAgICAgICAgIAotICAgICAgICAgPCEtLSBST0xFIERFU0NSSVBUT1IgLS0+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuVGFzayIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5Sb2xlRGVzY3JpcHRvci5Xb3JrUHJvZHVjdCIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX1RlYW1zIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuV29ya1Byb2R1Y3QiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuVGVhbSIvPgotICAgICAgICAgCi0gICAgICAgICA8IS0tIFRFQU0gUFJPRklMRSAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19Sb2xlcyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLlRlYW1Qcm9maWxlLkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuVGVhbVByb2ZpbGUuUm9sZSIvPgotICAgICAgICAgCi0gICAgICAgICA8IS0tIENPTVBPU0lURSBST0xFIC0tPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX1JvbGVzIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuVGVhbSIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5Db21wb3NpdGVSb2xlLlJvbGUiLz4KLSAgICAgIDwvcHJvcGVydHlUYWJzPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnByb3BlcnR5U2VjdGlvbnMiPgotICAgICAgPHByb3BlcnR5U2VjdGlvbnMKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yIj4KLSAgICAgICAgIDwhLS0gU1RBUlQgR0VORVJBTCBTRUNUSU9OIC0tPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5HZW5lcmFsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eUdlbmVyYWxTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5BY3Rpdml0eS5HZW5lcmFsIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLkdlbmVyYWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlRhc2tEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLlRhc2tEZXNjcmlwdG9yLkdlbmVyYWwiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4gCi0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJvbGVEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLlJvbGVEZXNjcmlwdG9yLkdlbmVyYWwiCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLkdlbmVyYWwiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLldvcmtQcm9kdWN0RGVzY3JpcHRvci5HZW5lcmFsIgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5Xb3JrUHJvZHVjdERlc2NyaXB0b3IuR2VuZXJhbCI+ICAgICAgCi0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+ICAgICAgIAotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5Xb3JrQnJlYWtkb3duRWxlbWVudC5HZW5lcmFsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5Xb3JrQnJlYWtkb3duRWxlbWVudC5HZW5lcmFsIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5NaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQnJlYWtkb3duRWxlbWVudC5HZW5lcmFsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkJyZWFrZG93bkVsZW1lbnQuR2VuZXJhbCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPgotICAgICAgICAgPCEtLSBFTkQgR0VORVJBTCBTRUNUSU9OIC0tPgotICAgICAgICAKLSAgICAgICAgIDwhLS0gU1RBUlQgRE9DVU1FTlRBVElPTiBTRUNUSU9OIC0tPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eURvY3VtZW50U2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uQWN0aXZpdHkuRG9jdW1lbnRhdGlvbiI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5EZXNjcmlwdG9yLkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JEb2N1bWVudFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkRlc2NyaXB0b3IuRG9jdW1lbnRhdGlvbiI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+IAotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5CcmVha2Rvd25FbGVtZW50LkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk1pbGVzdG9uZURvY3VtZW50U2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uQnJlYWtkb3duRWxlbWVudC5Eb2N1bWVudCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLk1pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4gICAgICAgCi0gICAgICAgICA8IS0tIEVORCBET0NVTUVOVEFUSU9OIFNFQ1RJT04gLS0+Ci0gICAgICAKLSAgICAgICAgIDwhLS0gQUNUSVZJVFkgLS0+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5Lkd1aWRhbmNlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eUd1aWRhbmNlU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uQWN0aXZpdHkuR3VpZGFuY2UiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuV29ya1JvbGx1cCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlXb3JrUm9sbHVwU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uQWN0aXZpdHkuV29ya1JvbGx1cCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5UZWFtUm9sbHVwIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eVRlYW1Sb2xsdXBTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5BY3Rpdml0eS5UZWFtUm9sbHVwIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LldvcmtQcm9kdWN0c1JvbGx1cCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlXb3JrUHJvZHVjdHNSb2xsdXBTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5BY3Rpdml0eS5Xb3JrUHJvZHVjdHNSb2xsdXAiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDwhLS0gRU5EIEFDVElWSVRZIC0tPgotICAgICAgICAgCi0gICAgICAgICA8IS0tIFNlY3Rpb25zIGZvciBUYXNrRGVzY3JpcHRvciAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuVGFza0Rlc2NyaXB0b3IuUm9sZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuVGFza0Rlc2NyaXB0b3JSb2xlU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uVGFza0Rlc2NyaXB0b3IuUm9sZSI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPiAgCi0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLldvcmtQcm9kdWN0IgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5UYXNrRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uVGFza0Rlc2NyaXB0b3IuV29ya1Byb2R1Y3QiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4gCi0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLlN0ZXAiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlRhc2tEZXNjcmlwdG9yU3RlcFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLlRhc2tEZXNjcmlwdG9yLlN0ZXAiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4gCi0gICAgICAgICAKLSAgICAgICAgIDwhLS0gU2VjdGlvbnMgZm9yIFJvbGVEZXNjcmlwdG9yIC0tPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5Sb2xlRGVzY3JpcHRvci5Xb3JrUHJvZHVjdCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUm9sZURlc2NyaXB0b3JXb3JrUHJvZHVjdFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLlJvbGVEZXNjcmlwdG9yLldvcmtQcm9kdWN0Ij4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+ICAKLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuVGVhbSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUm9sZURlc2NyaXB0b3JUZWFtU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uUm9sZURlc2NyaXB0b3IuVGVhbSI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPiAKLSAgICAgIAotCi0gICAgICAgICA8IS0tIFNlY3Rpb24gZm9yIFRlYW1Qcm9maWxlIC0tPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5UZWFtUHJvZmlsZS5Sb2xlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5UZWFtUHJvZmlsZVJvbGVTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5UZWFtUHJvZmlsZS5Sb2xlIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+IAotICAgICAgICAgCi0gICAgICAgICA8IS0tIFNlY3Rpb24gZm9yIENvbXBvc2l0ZVJvbGUgLS0+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLkNvbXBvc2l0ZVJvbGUuUm9sZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQ29tcG9zaXRlUm9sZVJvbGVTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5Db21wb3NpdGVSb2xlLlJvbGUiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Db21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICA8L3Byb3BlcnR5U2VjdGlvbnM+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Sb290UHJlZlBhZ2UiCi0gICAgICAgICAgICBuYW1lPSIlbWV0aG9kQXV0aG9yaW5nUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLnJvb3RwcmVmcGFnZSIvPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLnJvb3RwcmVmcGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLlByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLlByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVwcm9jZXNzRWRpdG9yIi8+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMucm9vdHByZWZwYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMubGlicmFyeXByZWZwYWdlIgotICAgICAgICAgICAgbmFtZT0iJWxpYnJhcnlPcHRpb25zIi8+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMucm9vdHByZWZwYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuRGlhZ3JhbVByZWZQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuRGlhZ3JhbVByZWZQYWdlIgotICAgICAgICAgICAgbmFtZT0iJWRpYWdyYW0iLz4KLSAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLnJvb3RwcmVmcGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkRpYWdyYW1QcmVmUGFnZTEiCi0gICAgICAgICAgICBuYW1lPSJOZXcgRGlhZ3JhbSIvPiAgICAgICAKLSAgICAgIDxwYWdlIAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMucm9vdHByZWZwYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuU3RhcnR1cFByZWZQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuc3RhcnR1cFByZWZQYWdlIgotICAgICAgICAgICAgbmFtZT0iJXN0YXJ0dXBBbmRTaHV0ZG93biIvPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLnJvb3RwcmVmcGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkRlYnVnUHJlZlBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5EZWJ1Z1ByZWZQYWdlIgotICAgICAgICAgICAgbmFtZT0iJWRlYnVnIi8+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMucm9vdHByZWZwYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTW9kZWxpbmdPcHRpb25zUHJlZlBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Nb2RlbGluZ09wdGlvbnNQcmVmUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVtb2RlbGluZ09wdGlvbnMiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5UHJlZmVyZW5jZUluaXRpYWxpemVyIi8+Ci0gICAgICA8aW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkF1dGhvcmluZ1ByZWZlcmVuY2VJbml0aWFsaXplciIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdBY3Rpb25zIj4KLSAgICAgIDx2aWV3Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3Q29udHJpYnV0aW9uLnJlZnJlc2hDb25maWd1cmF0aW9uIgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXciPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5SZWZyZXNoQ29uZmlndXJhdGlvbiIKLSAgICAgICAgICAgICAgIGRpc2FibGVkSWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L1JlZnJlc2guZ2lmIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKyIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9SZWZyZXNoLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMucmVmcmVzaCIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlcmVmcmVzaENvbmZpZyIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlcmVmcmVzaENvbmZpZ1Rvb2x0aXAiLz4KLSAgICAgIDwvdmlld0NvbnRyaWJ1dGlvbj4KLSAgICAgIDx2aWV3Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3Q29udHJpYnV0aW9uLmxpbmtXaXRoRWRpdG9yIgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXciPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaW5rV2l0aEVkaXRvciIKLSAgICAgICAgICAgICAgIGRpc2FibGVkSWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvc3luY2VkLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMubGlua1dpdGhFZGl0b3IiCi0gICAgICAgICAgICAgICBsYWJlbD0iJWxpbmtXaXRoRWRpdG9yIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0eWxlPSJ0b2dnbGUiCi0gICAgICAgICAgICAgICB0b29sYmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWxpbmtXaXRoRWRpdG9yVG9vbHRpcCIvPgotICAgICAgPC92aWV3Q29udHJpYnV0aW9uPgotICAgICAgPHZpZXdDb250cmlidXRpb24KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdDb250cmlidXRpb24uc2hvd1ByZXNOYW1lcyIKLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuU2hvd1ByZXNlbnRhdGlvbk5hbWVzIgotICAgICAgICAgICAgICAgZGlzYWJsZWRJY29uPSJpY29ucy9mdWxsL2V0b29sMTYvUHJlc19uYW1lX3RvZ2dsZS5naWYiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvUHJlc19uYW1lX3RvZ2dsZS5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLnNob3dQcmVzTmFtZXMiCi0gICAgICAgICAgICAgICBsYWJlbD0iJXNob3dQcmVzZW50YXRpb25OYW1lcyIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdHlsZT0idG9nZ2xlIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVzaG93UHJlc2VudGF0aW9uTmFtZXNUb29sdGlwIi8+Ci0gICAgICA8L3ZpZXdDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYmluZGluZ3MiPgotICAgICAgPGtleQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5lZGl0LnNlbGVjdEFsbCIKLSAgICAgICAgICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMud2lpbmRvdyIKLSAgICAgICAgICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIgotICAgICAgICAgICAgc2VxdWVuY2U9IkN0cmwrQSIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotICAgICAgICAgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmhhbmRsZXJzLlNlbGVjdEFsbEhhbmRsZXIiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJXNlbGVjdEFsbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0LnNlbGVjdEFsbCIKLSAgICAgICAgICAgIG5hbWU9InNlbGVjdEFsbCIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IiVjaGVhdFNoZWV0c0FjdGlvblNldCIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuYWN0aW9uU2V0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgIGxhYmVsPSIlb3BlbkNoZWF0U2hlZXRzIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNoZWF0c2hlZXRzLmFjdGlvbnMuQ2hlYXRTaGVldEhlbHBNZW51QWN0aW9uIgotICAgICAgICAgICAgbWVudWJhclBhdGg9ImhlbHAvZ3JvdXAuYXNzaXN0IiBpZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuYWN0aW9ucy5DaGVhdFNoZWV0SGVscE1lbnVBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5tYXJrZXJSZXNvbHV0aW9uIj4KLSAgICAgIDxtYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZGVjb3JhdG9ycyI+Ci0gICAgICA8ZGVjb3JhdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IiCi0gICAgICAgICAgICBsYWJlbD0iTWV0aG9kIEVsZW1lbnQgTGlnaHR3ZWlnaHQgTGFiZWwgRGVjb3JhdG9yIgotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9InRydWUiCi0gICAgICAgICAgICBsb2NhdGlvbj0iVE9QX0xFRlQiCi0gICAgICAgICAgICBzdGF0ZT0idHJ1ZSIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uIGlkPSJtZXRob2RSaWNoVGV4dCIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiIG5hbWU9IiVSaWNoVGV4dE1hcmtlclR5cGVOYW1lIj4gCi0gICAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPiAKLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIi8+IAotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvd25lciIvPiAKLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXNlckludGVyYWN0aW9uSGFuZGxlciI+Ci0gICAgICA8dXNlckludGVyYWN0aW9uSGFuZGxlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlVzZXJJbnRlcmFjdGlvbkhhbmRsZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL1Byb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MmU2MTYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiIGlkPSJQcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyIiBuYW1lPSJQcm9jZXNzIEVkaXRvciBQYWdlIFByb3ZpZGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlZGl0b3JQYWdlIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImVkaXRvclBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5JRXh0ZW5zaW9uRm9ybVBhZ2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cHJlJmd0OwotICZsdDtleHRlbnNpb24KLSAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5Qcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyJnF1b3Q7Jmd0OwotICAmbHQ7ZWRpdG9yUGFnZQotICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5Qcm9jZXNzRXN0aW1hdGlvblBhZ2UmcXVvdDsKLSAgIG5hbWU9JnF1b3Q7RXN0aW1hdGlvbiZxdW90OwotICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRXN0aW1hdGlvblBhZ2UmcXVvdDsmZ3Q7Ci0gICZsdDsvZWRpdG9yUGFnZSZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL1Rhc2tFZGl0b3JQYWdlUHJvdmlkZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvVGFza0VkaXRvclBhZ2VQcm92aWRlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OTk0YTQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvVGFza0VkaXRvclBhZ2VQcm92aWRlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiIGlkPSJFZGl0b3JQYWdlUHJvdmlkZXIiIG5hbWU9IkVkaXRvciBQYWdlIFByb3ZpZGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGVuYWJsZXMgYSBwbHVnLWluIHRvIHJlZ2lzdGVyIG9uZSBvciBtb3JlIHBhZ2VzIGluIGF1dGhvcmluZyBlZGl0b3IuIFRob3VnaCB0aGlzIHBhZ2Ugd2lsbCBvbmx5IGJlIGFkZGVkIGZvciBtZXRob2QgZWxlbWVudCB0eXBlICZxdW90O3Rhc2smcXVvdDsuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVkaXRvclBhZ2UiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZWRpdG9yUGFnZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLklFeHRlbnNpb25Gb3JtUGFnZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uCi0gIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVGFza0VkaXRvclBhZ2VQcm92aWRlciZxdW90OyZndDsKLSAgJmx0O2VkaXRvclBhZ2UKLSAgIGlkPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVGFza0VzdGltYXRpb25QYWdlJnF1b3Q7Ci0gICBuYW1lPSZxdW90O0VzdGltYXRpb24mcXVvdDsKLSAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVGFza0VzdGltYXRpb25QYWdlJnF1b3Q7Jmd0OwotICAmbHQ7L2VkaXRvclBhZ2UmZ3Q7Ci0gJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS93aXphcmRSZWdpc3RyeVByb3ZpZGVyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL3dpemFyZFJlZ2lzdHJ5UHJvdmlkZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWJlNjhlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL3dpemFyZFJlZ2lzdHJ5UHJvdmlkZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIiBpZD0id2l6YXJkUmVnaXN0cnlQcm92aWRlciIgbmFtZT0iV2l6YXJkIFJlZ2lzdGVyeSBQcm92aWRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmRSZWdpc3RyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkUmVnaXN0cnkiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5JV2l6YXJkUmVnaXN0cnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlQm91bmRzQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VCb3VuZHNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0ZDA4ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VCb3VuZHNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZUJvdW5kc0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTm9kZSBub2RlOwotCi0JcHJpdmF0ZSBQb2ludCBuZXdMb2NhdGlvbiwgb2xkTG9jYXRpb247Ci0KLQlwcml2YXRlIGludCBuZXdXaWR0aCwgb2xkV2lkdGg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY2hhbmdlQm91bmRzQ29tbWFuZF9sYWJlbDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIENoYW5nZUJvdW5kc0NvbW1hbmQoTm9kZSBub2RlLCBQb2ludCBuZXdMb2NhdGlvbiwgaW50IG5ld1dpZHRoKSB7Ci0JCXN1cGVyKENoYW5nZUJvdW5kc0NvbW1hbmQuTEFCRUwpOwotCQlzZXROb2RlKG5vZGUpOwotCQlzZXROZXdMb2NhdGlvbihuZXdMb2NhdGlvbi5nZXRDb3B5KCkpOwotCQl0aGlzLm5ld1dpZHRoID0gbmV3V2lkdGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIG5vZGUgIT0gbnVsbAotCQkJCSYmIG5ld0xvY2F0aW9uICE9IG51bGwKLQkJCQkmJiAobmV3V2lkdGggIT0gb2xkV2lkdGggfHwgIShub2RlLmdldExvY2F0aW9uKCkKLQkJCQkJCS5lcXVhbHMobmV3TG9jYXRpb24pKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkTG9jYXRpb24gPSBub2RlLmdldExvY2F0aW9uKCk7Ci0JCW9sZFdpZHRoID0gbm9kZS5nZXRXaWR0aCgpOwotCQlyZWRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJbm9kZS5zZXRMb2NhdGlvbihuZXdMb2NhdGlvbik7Ci0JCW5vZGUuc2V0V2lkdGgobmV3V2lkdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBub2RlKSB7Ci0JCXRoaXMubm9kZSA9IG5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV3TG9jYXRpb24oUG9pbnQgbG9jKSB7Ci0JCW5ld0xvY2F0aW9uID0gbG9jOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCW5vZGUuc2V0V2lkdGgob2xkV2lkdGgpOwotCQlub2RlLnNldExvY2F0aW9uKG9sZExvY2F0aW9uKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZUhlaWdodENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlSGVpZ2h0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOGQ0OTU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlSGVpZ2h0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQ29tbWFuZCB0byBoYW5kbGUgTm9kZSdzIGhlaWdodCBjaGFuZ2VzLgotICogQ2hhbmdlQm91bmRzQ29tbWFuZCBoYW5kbGVzIE5vZGUncyB3aWR0aCBjaGFuZ2VzLiAKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZUhlaWdodENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTm9kZSBub2RlOwotCi0JcHJpdmF0ZSBQb2ludCBuZXdMb2NhdGlvbiwgb2xkTG9jYXRpb247Ci0KLQlwcml2YXRlIGludCBuZXdIZWlnaHQsIG9sZEhlaWdodDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJDaGFuZ2UgSGVpZ2h0IENvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQ2hhbmdlSGVpZ2h0Q29tbWFuZChOb2RlIG5vZGUsIFBvaW50IG5ld0xvY2F0aW9uLCBpbnQgbmV3SGVpZ2h0KSB7Ci0JCXN1cGVyKENoYW5nZUhlaWdodENvbW1hbmQuTEFCRUwpOwotCQlzZXROb2RlKG5vZGUpOwotCQlzZXROZXdMb2NhdGlvbihuZXdMb2NhdGlvbi5nZXRDb3B5KCkpOwotCQl0aGlzLm5ld0hlaWdodCA9IG5ld0hlaWdodDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gbm9kZSAhPSBudWxsCi0JCQkJJiYgbmV3TG9jYXRpb24gIT0gbnVsbAotCQkJCSYmIChuZXdIZWlnaHQgIT0gb2xkSGVpZ2h0IHx8ICEobm9kZS5nZXRMb2NhdGlvbigpCi0JCQkJCQkuZXF1YWxzKG5ld0xvY2F0aW9uKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZExvY2F0aW9uID0gbm9kZS5nZXRMb2NhdGlvbigpOwotCQlvbGRIZWlnaHQgPSBub2RlLmdldEhlaWdodCgpOwotCQlyZWRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJbm9kZS5zZXRMb2NhdGlvbihuZXdMb2NhdGlvbik7Ci0JCW5vZGUuc2V0SGVpZ2h0KG5ld0hlaWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZShOb2RlIG5vZGUpIHsKLQkJdGhpcy5ub2RlID0gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXdMb2NhdGlvbihQb2ludCBsb2MpIHsKLQkJbmV3TG9jYXRpb24gPSBsb2M7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJbm9kZS5zZXRIZWlnaHQob2xkSGVpZ2h0KTsKLQkJbm9kZS5zZXRMb2NhdGlvbihvbGRMb2NhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VOYW1lQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VOYW1lQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDVlNzY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlTmFtZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5OYW1lZE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VOYW1lQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBOYW1lZE5vZGUgZWxlbWVudDsKLQotCXByaXZhdGUgU3RyaW5nIG5ld05hbWUsIG9sZE5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVORE9fTUVTU0FHRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9jaGFuZ2VOYW1lQ29tbWFuZF91bmRvTWVzc2FnZTsKLQotCXB1YmxpYyBDaGFuZ2VOYW1lQ29tbWFuZChOYW1lZE5vZGUgZWxlbSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQllbGVtZW50ID0gZWxlbTsKLQkJb2xkTmFtZSA9IGVsZW0uZ2V0TmFtZSgpOwotCQl0aGlzLm5ld05hbWUgPSBuZXdOYW1lLnRyaW0oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWVsZW1lbnQuc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoIVN0clV0aWwuaXNCbGFuayhvbGROYW1lKSkgewotCQkJZWxlbWVudC5zZXROYW1lKG9sZE5hbWUpOwotCQl9IGVsc2UgewotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBQcm9tcHRFZGl0KG51bGwsIFVORE9fTUVTU0FHRSkpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByb21wdEVkaXQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCQotCQlwcml2YXRlIFN0cmluZyBtc2c7Ci0KLQkJUHJvbXB0RWRpdChOYW1lZE5vZGVFZGl0UGFydCBwYXJ0LCBTdHJpbmcgbXNnKSB7Ci0JCQl0aGlzLm1zZyA9IG1zZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud2FybmluZ0RpYWxvZ190aXRsZTsKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3ZWRlNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE5vZGUgZWxlbWVudDsKLQotCXByaXZhdGUgTm9kZUVkaXRQYXJ0IHBhcnQ7Ci0KLQlwcml2YXRlIFN0cmluZyBuZXdOYW1lLCBvbGROYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kX2xhYmVsOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQoTm9kZUVkaXRQYXJ0IGVsZW0sIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJcGFydCA9IGVsZW07Ci0JCWVsZW1lbnQgPSAoTm9kZSkgZWxlbS5nZXRNb2RlbCgpOwotCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gZWxlbWVudC5nZXRHcmFwaE5vZGUoKTsKLQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlLmdldFByb3BlcnR5KCk7Ci0JCW9sZE5hbWUgPSAoKFByb3BlcnR5KSBsaXN0LmdldCgwKSkuZ2V0VmFsdWUoKTsKLQkJdGhpcy5uZXdOYW1lID0gbmV3TmFtZS50cmltKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkoKFByb3BlcnR5KSBlbGVtZW50LmdldEdyYXBoTm9kZSgpLmdldFByb3BlcnR5KCkuZ2V0KDApKQotCQkJCS5zZXRWYWx1ZShuZXdOYW1lKTsKLQkJcGFydC5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJKChQcm9wZXJ0eSkgZWxlbWVudC5nZXRHcmFwaE5vZGUoKS5nZXRQcm9wZXJ0eSgpLmdldCgwKSkKLQkJCQkuc2V0VmFsdWUob2xkTmFtZSk7Ci0JCXBhcnQucmVmcmVzaCgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlQmVuZHBvaW50Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVCZW5kcG9pbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNkZDA4M2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVCZW5kcG9pbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZUJlbmRwb2ludENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTGluayBsaW5rOwotCi0JcHJpdmF0ZSBCZW5kcG9pbnQgcG9pbnQ7Ci0KLQlwcml2YXRlIGludCBpbmRleCA9IC0xOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2NyZWF0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBDcmVhdGVCZW5kcG9pbnRDb21tYW5kKExpbmsgbGluaywgUG9pbnQgbG9jYXRpb24sIGludCBpbmRleCkgewotCQlzdXBlcihMQUJFTCk7Ci0JCXRoaXMubGluayA9IGxpbms7Ci0JCXBvaW50ID0gbmV3IEFic29sdXRlQmVuZHBvaW50KGxvY2F0aW9uKTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBsaW5rICE9IG51bGwgJiYgcG9pbnQgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlsaW5rLmdldEJlbmRwb2ludHMoKS5hZGQoaW5kZXgsIHBvaW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlsaW5rLmdldEJlbmRwb2ludHMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlTGlua0NvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlTGlua0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTdjNzgyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NyZWF0ZUxpbmtDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTGlua0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTGluayBsaW5rOwotCi0JcHJpdmF0ZSBOb2RlIHNvdXJjZSwgdGFyZ2V0OwotCi0JcHJpdmF0ZSBQb2ludCB0YXJnZXRFbmRQb2ludDsKLQotCXByaXZhdGUgUG9pbnQgc291cmNlRW5kUG9pbnQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY3JlYXRlTGlua0NvbW1hbmRfbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBDcmVhdGVMaW5rQ29tbWFuZChMaW5rIG5ld09iaiwgTm9kZSBzcmMpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQlsaW5rID0gbmV3T2JqOwotCQlzb3VyY2UgPSBzcmM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzb3VyY2UgIT0gbnVsbCAmJiB0YXJnZXQgIT0gbnVsbCAmJiBsaW5rICE9IG51bGw7Ci0JCWlmICghcmVzdWx0KQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQlTdHJpbmcgbXNnID0gVmFsaWRhdGlvbi5jaGVja0Nvbm5lY3Qoc291cmNlLCB0YXJnZXQsIGxpbmspOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlpZiAoc291cmNlID09IHRhcmdldCkgewotCQkJbGluay5nZXRCZW5kcG9pbnRzKCkuYWRkKAotCQkJCQluZXcgQWJzb2x1dGVCZW5kcG9pbnQoc291cmNlLmdldExvY2F0aW9uKCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJCQktMTAsIDEwKSkpOwotCQkJbGluay5nZXRCZW5kcG9pbnRzKCkuYWRkKAotCQkJCQluZXcgQWJzb2x1dGVCZW5kcG9pbnQoc291cmNlLmdldExvY2F0aW9uKCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJCQktMTAsIC0xMCkpKTsKLQkJCWxpbmsuZ2V0QmVuZHBvaW50cygpLmFkZCgKLQkJCQkJbmV3IEFic29sdXRlQmVuZHBvaW50KHNvdXJjZS5nZXRMb2NhdGlvbigpLmdldFRyYW5zbGF0ZWQoCi0JCQkJCQkJMTAsIC0xMCkpKTsKLQkJfQotCi0JCWxpbmsuc2V0VGFyZ2V0RW5kUG9pbnQodGFyZ2V0RW5kUG9pbnQpOwotCQlsaW5rLnNldFNvdXJjZUVuZFBvaW50KHNvdXJjZUVuZFBvaW50KTsKLQkJbGluay5zZXRTb3VyY2Uoc291cmNlKTsKLQkJbGluay5zZXRUYXJnZXQodGFyZ2V0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm9kZSB0YXJnZXQpIHsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RW5kUG9pbnQoUG9pbnQgcCkgewotCQl0YXJnZXRFbmRQb2ludCA9IHA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U291cmNlRW5kUG9pbnQoUG9pbnQgcCkgewotCQlzb3VyY2VFbmRQb2ludCA9IHA7Ci0JfQotCi0JcHVibGljIFBvaW50IGdldFRhcmdldEVuZFBvaW50KCkgewotCQlyZXR1cm4gdGFyZ2V0RW5kUG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzb3VyY2VFbmRQb2ludC4KLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0U291cmNlRW5kUG9pbnQoKSB7Ci0JCXJldHVybiBzb3VyY2VFbmRQb2ludDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlsaW5rLnNldFNvdXJjZUVuZFBvaW50KG51bGwpOwotCQlsaW5rLnNldFRhcmdldEVuZFBvaW50KG51bGwpOwotCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCWlmIChzb3VyY2UgPT0gdGFyZ2V0KSB7Ci0JCQlsaW5rLmdldEJlbmRwb2ludHMoKS5jbGVhcigpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVOb2RlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVOb2RlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZjViNDQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlTm9kZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTm9kZUNvbW1hbmQgZXh0ZW5kcyBEaWFncmFtTW9kaWZ5Q29tbWFuZCB7Ci0KLQlwcml2YXRlIFBvaW50IGxvYzsKLQotCXByaXZhdGUgTm9kZSBub2RlOwotCi0JcHJpdmF0ZSBEaWFncmFtIGRpYWdyYW07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY3JlYXRlTm9kZUNvbW1hbmRfbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBDcmVhdGVOb2RlQ29tbWFuZChOb2RlIG5ld09iamVjdCwgRGlhZ3JhbSBwYXJlbnQsIFBvaW50IGxvY2F0aW9uKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJbm9kZSA9IG5ld09iamVjdDsKLQkJZGlhZ3JhbSA9IHBhcmVudDsKLQkJbG9jID0gbG9jYXRpb24uZ2V0Q29weSgpOwotCQlzZXREaWFncmFtKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJbm9kZS5zZXRMb2NhdGlvbihudWxsKTsKLQkJbm9kZS5zZXREaWFncmFtKG51bGwpOwotCQlkaWFncmFtLmdldE5vZGVzKCkucmVtb3ZlKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuRGlhZ3JhbU1vZGlmeUNvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCW5vZGUuc2V0TG9jYXRpb24obG9jKTsKLQkJbm9kZS5zZXREaWFncmFtKGRpYWdyYW0pOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJZGlhZ3JhbS5zZXREZWZhdWx0TmFtZSgoTmFtZWROb2RlKSBub2RlKTsKLQkJfQotCQlkaWFncmFtLmdldE5vZGVzKCkuYWRkKG5vZGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWlmIChkaWFncmFtIGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJaWYgKGRpYWdyYW0uaXNSZWFkT25seSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVCZW5kcG9pbnRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUJlbmRwb2ludENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDFmMTAyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUJlbmRwb2ludENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZUJlbmRwb2ludENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTGluayBsaW5rOwotCi0JcHJpdmF0ZSBCZW5kcG9pbnQgYmVuZHBvaW50OwotCi0JcHJpdmF0ZSBpbnQgaW5kZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfZGVsZXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIERlbGV0ZUJlbmRwb2ludENvbW1hbmQoTGluayBsaW5rLCBpbnQgaW5kZXgpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQl0aGlzLmxpbmsgPSBsaW5rOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCWJlbmRwb2ludCA9IChCZW5kcG9pbnQpIGxpbmsuZ2V0QmVuZHBvaW50cygpLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGluZGV4ID49IDAgJiYgYmVuZHBvaW50ICE9IG51bGwgJiYgbGluayAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWxpbmsuZ2V0QmVuZHBvaW50cygpLnJlbW92ZShpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJbGluay5nZXRCZW5kcG9pbnRzKCkuYWRkKGluZGV4LCBiZW5kcG9pbnQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGVsZXRlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxN2FjZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbW1hbmQgZGVsZWdhdGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfZGVsZXRlQ29tbWFuZF9sYWJlbDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BFUk1fREVMRVRFID0gImdlZi5lZGlhZ3JhbS4kcGVybSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBEZWxldGVDb21tYW5kKGJvb2xlYW4gaGFyZERlbGV0ZSkgewotCQlzdXBlcihMQUJFTCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGRlbGVnYXRlICE9IG51bGwgJiYgZGVsZWdhdGUuY2FuRXhlY3V0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWRlbGVnYXRlLmV4ZWN1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZCBzZXRQYXJ0VG9CZURlbGV0ZWQoT2JqZWN0IG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIE5vZGUpCi0JCQlkZWxlZ2F0ZSA9IG5ldyBEZWxldGVOb2RlQ29tbWFuZChtb2RlbCk7Ci0JCWVsc2UKLQkJCWRlbGVnYXRlID0gbnVsbDsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJZGVsZWdhdGUudW5kbygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIERlbGV0ZU5vZGVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0JCXByb3RlY3RlZCBNYXAgaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlOwotCi0JCXByb3RlY3RlZCBNYXAgb3V0Z29pbmdDb25uZWN0aW9uc1RvVGFyZ2V0OwotCi0JCXByb3RlY3RlZCBOb2RlQ29udGFpbmVyIGNvbnRhaW5lcjsKLQotCQlwcm90ZWN0ZWQgTm9kZSBub2RlOwotCi0JCXByb3RlY3RlZCBpbnQgaW5kZXg7Ci0KLQkJcHVibGljIERlbGV0ZU5vZGVDb21tYW5kKE9iamVjdCBub2RlKSB7Ci0JCQl0aGlzLm5vZGUgPSAoTm9kZSkgbm9kZTsKLQkJCWNvbnRhaW5lciA9IChOb2RlQ29udGFpbmVyKSB0aGlzLm5vZGUuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCWluZGV4ID0gY29udGFpbmVyLmdldE5vZGVzKCkuaW5kZXhPZihub2RlKTsKLQkJCS8vIFRoZXJlJ3MgYWx3YXlzIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoaXMgbm9kZSBoYXMgYWxyZWFkeSBiZWVuCi0JCQkvLyBkZWxldGVkIGJ5IHRoZSB0aW1lIHRoaXMgY29tbWFuZCBpcyBleGVjdXRlZCAoZWcuLCB3aGVuIHRoZQotCQkJLy8gcGFja2FnZSBjb250YWluaW5nIHRoaXMgY2xhc3MgaXMgYWxzbyBzZWxlY3RlZCkuIEhlbmNlLCB3ZSBjaGVjawotCQkJLy8gdG8gc2VlIGlmIHRoZSBub2RlIGV4aXN0cyBpbiB0aGUgZGlhZ3JhbS4gSWYgbm90LCBkbyBub3RoaW5nLgotCQkJaWYgKGluZGV4ID09IC0xKQotCQkJCXJldHVybjsKLQkJCWluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQucHV0KGxpbmssIGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2UucHV0KGxpbmssIGxpbmsuZ2V0U291cmNlKCkpOwotCQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQkJfQotCQkJLy8gQ29tbWVudGluZyBiZWxvdyB0d28gbGluZXMsIExpbmtzIGdldCByZW1vdmVkIGZyb20gdGhlIG1vZGVsCi0JCQkvLyB3aGVuIGxpbmsuc2V0VGFyZ2V0KG51bGwpIG9yIGxpbmsuc2V0U291cmNlKG51bGwpIGlzIGRvbmUuICBGb3IgCi0JCQkvLyBOb2RlIGlmIHdlIGNsZWFyIGluY29taW5nL291dGdvaW5nIGNvbm5lY3Rpb25zLCBVbmRvIGNvbW1hbmQgd2lsbCBub3Qgd29yay4KLQkJCQotCQkJLy9ub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJLy9ub2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJY29udGFpbmVyLmdldE5vZGVzKCkucmVtb3ZlKGluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJcmV0dXJuOwotCQkJY29udGFpbmVyLmdldE5vZGVzKCkuYWRkKGluZGV4LCBub2RlKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldC5rZXlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCWxpbmsuc2V0VGFyZ2V0KChOb2RlKSBvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQuZ2V0KGxpbmspKTsKLQkJCQlsaW5rLnNldFNvdXJjZShub2RlKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZS5rZXlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCWxpbmsuc2V0VGFyZ2V0KG5vZGUpOwotCQkJCWxpbmsuc2V0U291cmNlKChOb2RlKSBpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2UuZ2V0KGxpbmspKTsKLQkJCX0KLQkJCW91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldCA9IG51bGw7Ci0JCQlpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2UgPSBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjY2FuRXhlY3V0ZSgpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQkJaWYgKFZhbGlkYXRpb24uY2hlY2tEZWxldGUobm9kZSkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCQl9Ci0JfQotCS8qCi0JICogTm90IGluIHVzZS4gTmVlZCBtb2RpZmljYXRpb24gZm9yIGZ1dHVyZSBmZWF0dXJlIGltcGxlbWVudGF0aW9ucy4gCi0JICogQ29tcG91bmQgQ29tbWFuZCBkZWxldGlvbiBkbyB0aGUgcmVjdXJzaXZlIGRlbGV0aW9uIGFuZCB1bmRvLiAKLQkgKi8KLS8vCXByaXZhdGUgc3RhdGljIGNsYXNzIERlbGV0ZU5vZGVDb21wb3VuZENvbW1hbmQgZXh0ZW5kcyBDb21wb3VuZENvbW1hbmQgewotLy8JCXByb3RlY3RlZCBNYXAgaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlOwotLy8KLS8vCQlwcm90ZWN0ZWQgTWFwIG91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldDsKLS8vCi0vLwkJcHJvdGVjdGVkIE5vZGVDb250YWluZXIgY29udGFpbmVyOwotLy8KLS8vCQlwcm90ZWN0ZWQgTm9kZSBub2RlOwotLy8KLS8vCQlwcm90ZWN0ZWQgaW50IGluZGV4OwotLy8KLS8vCQlwdWJsaWMgRGVsZXRlTm9kZUNvbXBvdW5kQ29tbWFuZChPYmplY3Qgbm9kZSkgewotLy8JCQl0aGlzLm5vZGUgPSAoTm9kZSkgbm9kZTsKLS8vCQkJY29udGFpbmVyID0gKE5vZGVDb250YWluZXIpIHRoaXMubm9kZS5lQ29udGFpbmVyKCk7Ci0vLwkJCWluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZSA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJCW91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldCA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMubm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0vLwkJCQlvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQucHV0KGxpbmssIGxpbmsuZ2V0VGFyZ2V0KCkpOwotLy8JCQkJYWRkKG5ldyBEZWxldGVMaW5rQ29tbWFuZCggbGluaywgZmFsc2UpKTsKLS8vCQkJfQotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLm5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotLy8JCQkJaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlLnB1dChsaW5rLCBsaW5rLmdldFNvdXJjZSgpKTsKLS8vCQkJCWFkZChuZXcgRGVsZXRlTGlua0NvbW1hbmQoIGxpbmssIGZhbHNlKSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0vLwkJCWluZGV4ID0gY29udGFpbmVyLmdldE5vZGVzKCkuaW5kZXhPZihub2RlKTsKLS8vCQkJLy8gVGhlcmUncyBhbHdheXMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhpcyBub2RlIGhhcyBhbHJlYWR5IGJlZW4KLS8vCQkJLy8gZGVsZXRlZCBieSB0aGUgdGltZSB0aGlzIGNvbW1hbmQgaXMgZXhlY3V0ZWQgKGVnLiwgd2hlbiB0aGUKLS8vCQkJLy8gcGFja2FnZSBjb250YWluaW5nIHRoaXMgY2xhc3MgaXMgYWxzbyBzZWxlY3RlZCkuIEhlbmNlLCB3ZSBjaGVjawotLy8JCQkvLyB0byBzZWUgaWYgdGhlIG5vZGUgZXhpc3RzIGluIHRoZSBkaWFncmFtLiBJZiBub3QsIGRvIG5vdGhpbmcuCi0vLwkJCWlmIChpbmRleCA9PSAtMSkKLS8vCQkJCXJldHVybjsKLS8vCi0vLwkJCXN1cGVyLmV4ZWN1dGUoKTsKLS8vCQkJY29udGFpbmVyLmdldE5vZGVzKCkucmVtb3ZlKGluZGV4KTsKLS8vCQkJCi0vLwkJfQotLy8KLS8vCQlwdWJsaWMgdm9pZCB1bmRvKCkgewotLy8JCQlpZiAoaW5kZXggPT0gLTEpCi0vLwkJCQlyZXR1cm47Ci0vLwkJCWNvbnRhaW5lci5nZXROb2RlcygpLmFkZChpbmRleCwgbm9kZSk7Ci0vLwkJCXN1cGVyLnVuZG8oKTsKLS8vCQl9Ci0vLwotLy8JCS8qKgotLy8JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjY2FuRXhlY3V0ZSgpCi0vLwkJICovCi0vLwkJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLS8vCQkJaWYgKFZhbGlkYXRpb24uY2hlY2tEZWxldGUobm9kZSkgIT0gbnVsbCkKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLS8vCQl9Ci0vLwl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUxpbmtDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUxpbmtDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMwZTVmMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVMaW5rQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZUxpbmtDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIExpbmsgbGluazsKLQotCXByaXZhdGUgTm9kZSBzcmMsIHRhcmdldDsKLQotCXByaXZhdGUgaW50IHNyY0luZGV4LCB0YXJnZXRJbmRleDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIERlbGV0ZUxpbmtDb21tYW5kKExpbmsgbGluaywgYm9vbGVhbiBpc0hhcmREZWxldGUpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQl0aGlzLmxpbmsgPSBsaW5rOwotCQlzcmMgPSBsaW5rLmdldFNvdXJjZSgpOwotCQl0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWlmIChWYWxpZGF0aW9uLmNoZWNrRGVsZXRlKGxpbmspICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBsaW5rICE9IG51bGwgJiYgc3JjICE9IG51bGwgJiYgdGFyZ2V0ICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIHNob3VsZCB3b3JrIGV2ZW4gaWYgdGhlIGxpbmsgKHZpZXcpIHdhcyBkZWxldGVkLiBFZy4sIHVzZXIgc2VsZWN0cyBhCi0JICogY2xhc3MgYW5kIG9uZSBvZiBpdHMgcmVmZXJlbmNlcywgYW5kIGhpdHMgQ3RybCtEZWwuIFRoZSBjbGFzcyB3aWxsIGJlCi0JICogZGVsZXRlZCBmaXJzdCBhbmQgaXQgd2lsbCBkZWxldGUgYWxsIGl0cyByZWZlcmVuY2VzLiBXaGVuIHRoaXMgY29tbWFuZCBpcwotCSAqIGV4ZWN1dGVkLCBpdCBzaG91bGQgZG8gdGhlIGhhcmQtZGVsZXRlIHBhcnQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJc3JjSW5kZXggPSBzcmMuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmluZGV4T2YobGluayk7Ci0JCXRhcmdldEluZGV4ID0gdGFyZ2V0LmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pbmRleE9mKGxpbmspOwotCQlpZiAoc3JjSW5kZXggIT0gLTEgJiYgdGFyZ2V0SW5kZXggIT0gLTEpIHsKLQkJCXNyYy5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkucmVtb3ZlKHNyY0luZGV4KTsKLQkJCXRhcmdldC5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkucmVtb3ZlKHRhcmdldEluZGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChzcmNJbmRleCAhPSAtMSAmJiB0YXJnZXRJbmRleCAhPSAtMSkgewotCQkJc3JjLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5hZGQoc3JjSW5kZXgsIGxpbmspOwotCQkJdGFyZ2V0LmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5hZGQodGFyZ2V0SW5kZXgsIGxpbmspOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EaWFncmFtTW9kaWZ5Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EaWFncmFtTW9kaWZ5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Yzc5NTM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGlhZ3JhbU1vZGlmeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaWFncmFtTW9kaWZ5Q29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBFT2JqZWN0IG9iamVjdDsKLQotCXByaXZhdGUgYm9vbGVhbiBjYW5VbmRvID0gdHJ1ZTsKLQotCXB1YmxpYyBEaWFncmFtTW9kaWZ5Q29tbWFuZChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCU9iamVjdCBvYmogPSBkaWFncmFtLmdldE9iamVjdCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJb2JqZWN0ID0gKEVPYmplY3QpIG9iajsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmVFeGVjdXRlKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShvYmplY3QsIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0JCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLmNvbW1hbmRfY2Fubm90RWRpdCwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChwcmVwYXJlRXhlY3V0ZSgpKSB7Ci0JCQlkb0V4ZWN1dGUoKTsKLQkJCWNhblVuZG8gPSB0cnVlOwotCQl9IGVsc2UgewotCQkJY2FuVW5kbyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCNjYW5VbmRvKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gY2FuVW5kbzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb0V4ZWN1dGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9Nb3ZlQmVuZHBvaW50Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9Nb3ZlQmVuZHBvaW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMzI4YjVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvTW92ZUJlbmRwb2ludENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5CZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBCZW5kcG9pbnQgbWFuaXB1bGF0aW9uIGNvbW1hbmRzIGNhbm5vdCBiZSBjaGFpbmVkIG9yIGNvbXBvdW5kZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlQmVuZHBvaW50Q29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaW5rIGxpbms7Ci0KLQlwcml2YXRlIGludCBpbmRleDsKLQotCXByaXZhdGUgQmVuZHBvaW50IG9sZEJlbmRwb2ludCwgbmV3QmVuZHBvaW50OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX21vdmVCZW5kcG9pbnRDb21tYW5kX2xhYmVsOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTW92ZUJlbmRwb2ludENvbW1hbmQoTGluayBsaW5rLCBQb2ludCBsb2NhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJdGhpcy5saW5rID0gbGluazsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQluZXdCZW5kcG9pbnQgPSBuZXcgQWJzb2x1dGVCZW5kcG9pbnQobG9jYXRpb24pOwotCQlvbGRCZW5kcG9pbnQgPSAoQmVuZHBvaW50KSBsaW5rLmdldEJlbmRwb2ludHMoKS5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBsaW5rICE9IG51bGwgJiYgaW5kZXggPj0gMCAmJiBuZXdCZW5kcG9pbnQgIT0gbnVsbAotCQkJCSYmIG9sZEJlbmRwb2ludCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWxpbmsuZ2V0QmVuZHBvaW50cygpLnNldChpbmRleCwgbmV3QmVuZHBvaW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlsaW5rLmdldEJlbmRwb2ludHMoKS5zZXQoaW5kZXgsIG9sZEJlbmRwb2ludCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9SZWNvbm5lY3RMaW5rQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9SZWNvbm5lY3RMaW5rQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDJkZTViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvUmVjb25uZWN0TGlua0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgUmVjb25uZWN0TGlua0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1NvdXJjZTsKLQotCXByaXZhdGUgTGluayBsaW5rOwotCi0JcHJpdmF0ZSBOb2RlIG5ld05vZGUsIG9sZE5vZGU7Ci0KLQlwcml2YXRlIGludCB2aWV3SW5kZXg7Ci0KLQlwcml2YXRlIFBvaW50IGVuZFBvaW50OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX3JlY29ubmVjdExpbmtDb21tYW5kX2xhYmVsOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgUmVjb25uZWN0TGlua0NvbW1hbmQoTGluayBsaW5rLCBOb2RlIG5ld05vZGUsIGJvb2xlYW4gaXNTb3VyY2UpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQl0aGlzLmxpbmsgPSBsaW5rOwotCQl0aGlzLm5ld05vZGUgPSBuZXdOb2RlOwotCQl0aGlzLmlzU291cmNlID0gaXNTb3VyY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5kUG9pbnQoUG9pbnQgcCkgewotCQllbmRQb2ludCA9IHAuZ2V0Q29weSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gbGluayAhPSBudWxsICYmIG5ld05vZGUgIT0gbnVsbDsKLQkJaWYgKCFyZXN1bHQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaXNTb3VyY2UpIHsKLQkJCXJldHVybiBWYWxpZGF0aW9uLmNoZWNrUmVjb25uZWN0KG5ld05vZGUsIGxpbmsuZ2V0VGFyZ2V0KCksIGxpbmspID09IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gVmFsaWRhdGlvbi5jaGVja1JlY29ubmVjdChsaW5rLmdldFNvdXJjZSgpLCBuZXdOb2RlLCBsaW5rKSA9PSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQkvLyBMaW5rCi0JCWlmIChpc1NvdXJjZSkgewotCQkJb2xkTm9kZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQlpZiAob2xkTm9kZSAhPSBudWxsKSB7IC8vIHNhZmV0eSBjaGVjayB0byBoYW5kbGUgZGFuZ2xpbmcgbGluawotCQkJCXZpZXdJbmRleCA9IG9sZE5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmluZGV4T2YobGluayk7Ci0JCQl9Ci0JCQlsaW5rLnNldFNvdXJjZShuZXdOb2RlKTsKLQkJCWxpbmsuc2V0U291cmNlRW5kUG9pbnQoZW5kUG9pbnQpOwotCQl9IGVsc2UgewotCQkJb2xkTm9kZSA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQlpZiAob2xkTm9kZSAhPSBudWxsKSB7IC8vIHNhZmV0eSBjaGVjayB0byBoYW5kbGUgZGFuZ2xpbmcgbGluawotCQkJCXZpZXdJbmRleCA9IG9sZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLmluZGV4T2YobGluayk7Ci0JCQl9Ci0JCQlsaW5rLnNldFRhcmdldChuZXdOb2RlKTsKLQkJCWxpbmsuc2V0VGFyZ2V0RW5kUG9pbnQoZW5kUG9pbnQpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoaXNTb3VyY2UpIHsKLQkJCW5ld05vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLnJlbW92ZShsaW5rKTsKLQkJCW9sZE5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmFkZCh2aWV3SW5kZXgsIGxpbmspOwotCQl9IGVsc2UgewotCQkJbmV3Tm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkucmVtb3ZlKGxpbmspOwotCQkJb2xkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuYWRkKHZpZXdJbmRleCwgbGluayk7Ci0JCX0KLQkJb2xkTm9kZSA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL1JlZnJlc2hEaWFncmFtRnJvbUJhc2VBY3Rpdml0eUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvUmVmcmVzaERpYWdyYW1Gcm9tQmFzZUFjdGl2aXR5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyM2Y4NzA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvUmVmcmVzaERpYWdyYW1Gcm9tQmFzZUFjdGl2aXR5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaERpYWdyYW1Gcm9tQmFzZUFjdGl2aXR5Q29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gRGlhZ3JhbVVJUmVzb3VyY2VzLnJlZnJlc2hGcm9tQmFzZUNtZF9sYWJlbDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFJlZnJlc2hEaWFncmFtRnJvbUJhc2VBY3Rpdml0eUNvbW1hbmQoKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjZTJkN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tYW5kcyBmb3IgZWRpdGluZyB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzA1MDQzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZXh0ZW5kcyBEaWFncmFtRWRpdFBhcnQgewotCi0JaW50IHkgPSA2MDsKLQotCWJvb2xlYW4geGF4aXNiZWdpbiA9IGZhbHNlOwotCi0JYm9vbGVhbiBsb2FkaW5nID0gdHJ1ZTsKLQotCWZpbmFsIHN0YXRpYyBpbnQgc3BhY2luZyA9IDQwOwotCi0JZmluYWwgc3RhdGljIGludCB5c3BhY2luZyA9IDIwOwotCi0JYm9vbGVhbiBtaXNjZWxsYW5lb3VzID0gZmFsc2U7Ci0KLQlpbnQgeCA9IDEwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUUyA9ICJvdXRwdXRzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRTID0gImlucHV0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTGlzdCByZWNlbnRseUFkZGVkUGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKiogCi0JICogRWRpdFBhcnQgZm9yIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQoQWN0aXZpdHlEZXRhaWxEaWFncmFtIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSBtZXRob2Qgc3VwZXIucmVzZXRDaGlsZHJlbkxvY2F0aW9ucy4gSW4gdGhpcywgQWxsIHRoZSBUYXNrJ3MKLQkgKiBNYW5kYXRvcnlJbnB1dCB3b3JrcHJvZHVjdHMgcGxhY2VkIG9uIHRvcC4gYW5kIFJvbGVUYXNrIGNvbXBvc2l0ZSBpbiB0aGUKLQkgKiBtaWRkbGUuIGFuZCBUYXNrJ3Mgb3V0cHV0IHdvcmtwcm9kdWN0cyBzb3V0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldENoaWxkcmVuTG9jYXRpb25zKCkgewotCQlmaW5hbCBpbnQgeXNwYWNpbmcgPSA0MDsKLQkJTGlzdCByb2xlY29tcG9zaXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpbnB1dHdvcmtwcm9kdWN0Q29tcG9zaXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbWlzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdGFza0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRoaXMucmVjZW50bHlBZGRlZFBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlOb2RlIG4gPSAoTm9kZSkgKChFZGl0UGFydCkgY2hpbGQpLmdldE1vZGVsKCk7Ci0JCQlpZiAobi5nZXRMb2NhdGlvbigpID09IG51bGwgfHwgbi5nZXRMb2NhdGlvbigpLnggPT0gLTEpIHsKLQkJCQl0aGlzLnJlY2VudGx5QWRkZWRQYXJ0cy5hZGQoY2hpbGQpOwotCQkJfQotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgewotCQkJCXJvbGVjb21wb3NpdGVMaXN0LmFkZChjaGlsZCk7Ci0JCQkJTGlzdCBsaXN0ID0gKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSBjaGlsZCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJCU5vZGUgb2JqTm9kZSA9IChOb2RlKSAoKE5vZGVFZGl0UGFydCkgb2JqKS5nZXRNb2RlbCgpOwotCQkJCQlpZiAob2JqTm9kZSBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJCQl0YXNrTGlzdC5hZGQob2JqTm9kZSk7Ci0JCQkJCQlIYXNoTWFwIHRhc2tNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQkJTGlzdCBpbnB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlMaXN0IG91dHB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQl0YXNrTWFwLnB1dCgiaW5wdXRzIiwgaW5wdXRMaXN0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdGFza01hcC5wdXQoIm91dHB1dHMiLCBvdXRwdXRMaXN0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbWFwLnB1dChvYmpOb2RlLCB0YXNrTWFwKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQ7Ci0JCQkJaWYgKHBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIG5vZGUgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGUpIHBhcnQKLQkJCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKG5vZGUuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCQkJaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QuYWRkKGNoaWxkKTsKLQkJCQkJfSBlbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQlvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QuYWRkKGNoaWxkKTsKLQkJCQkJfQotCQkJCQljYWxjU2l6ZShjaGlsZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQltaXNjTGlzdC5hZGQoY2hpbGQpOwotCQkJfQotCQl9Ci0KLQkJLy8gU2V0IHNpemUgZm9yIHRoZSByb2xlY29tcG9zaXRlLgotCQlpZiAoIXJvbGVjb21wb3NpdGVMaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm9sZWNvbXBvc2l0ZUxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0b3IubmV4dCgpOwotCQkJCUxpc3QgbGlzdCA9ICgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgb2JqZWN0KS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRvcjEgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IxLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0b3IxLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCWlmICgoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJCQkJVGFza05vZGUgdGFza05vZGUgPSAoVGFza05vZGUpICgoRGVzY3JpcHRvck5vZGVFZGl0UGFydCkgb2JqKQotCQkJCQkJCQkJLmdldE1vZGVsKCk7Ci0JCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFzayA9IChUYXNrRGVzY3JpcHRvcikgdGFza05vZGUKLQkJCQkJCQkJCS5nZXRPYmplY3QoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIHdwaXRvciA9IGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkuaXRlcmF0b3IoKTsgd3BpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCB3cEVkaXRQYXJ0ID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHdwaXRvcgotCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdwQ29tcG9zaXRlTm9kZSA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgd3BFZGl0UGFydAotCQkJCQkJCQkJCS5nZXRNb2RlbCgpOwotCQkJCQkJCQlPYmplY3Qgd3BPYmplY3QgPSB3cENvbXBvc2l0ZU5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJCWlmICh3cE9iamVjdC5lcXVhbHModGFzaykpIHsKLQkJCQkJCQkJCWludCB3aWR0aCA9IHdwRWRpdFBhcnQuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkJLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJCQkJCWludCBoZWlnaHQgPSAoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQkJCQkoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJCS5zZXRQcmVmZXJyZWRTaXplKAotCQkJCQkJCQkJCQkJCW5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCkpOwotCQkJCQkJCQkJaWYgKCgoV29ya1Byb2R1Y3RDb21wb3NpdGUpIHdwRWRpdFBhcnQKLQkJCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCQkJCQlMaXN0IGlucHV0TGlzdCA9IChMaXN0KSAoKEhhc2hNYXApIG1hcAotCQkJCQkJCQkJCQkJLmdldCh0YXNrTm9kZSkpLmdldChJTlBVVFMpOwotCQkJCQkJCQkJCWlucHV0TGlzdC5hZGQod3BFZGl0UGFydCk7Ci0JCQkJCQkJCQl9IGVsc2UgaWYgKCgoV29ya1Byb2R1Y3RDb21wb3NpdGUpIHdwRWRpdFBhcnQKLQkJCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQkJCQkJTGlzdCBvdXRwdXRMaXN0ID0gKExpc3QpICgoSGFzaE1hcCkgbWFwCi0JCQkJCQkJCQkJCQkuZ2V0KHRhc2tOb2RlKSkuZ2V0KE9VVFBVVFMpOwotCQkJCQkJCQkJCW91dHB1dExpc3QuYWRkKHdwRWRpdFBhcnQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFyb2xlY29tcG9zaXRlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9sZWNvbXBvc2l0ZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlMaXN0IGNvbmZpcm1lZFNlcUlucHV0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlMaXN0IGNvbmZpcm1lZFNlcU91dHB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJTGlzdCBsaXN0ID0gKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSByb2xlY29tcG9zaXRlTGlzdAotCQkJCQkJLmdldChpKSkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJRGVzY3JpcHRvck5vZGVFZGl0UGFydCB0YXNrID0gKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIGxpc3QKLQkJCQkJCQkuZ2V0KGopOwotCQkJCQlpZiAodGFzay5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVGFza05vZGUpIHsKLQkJCQkJCVRhc2tOb2RlIHRhc2tub2RlID0gKFRhc2tOb2RlKSB0YXNrLmdldE1vZGVsKCk7Ci0JCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCS5zaXplKCk7IGsrKykgewotCQkJCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdwY29tcCA9ICgoV29ya1Byb2R1Y3RDb21wb3NpdGUpICgoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCS5nZXQoaykpLmdldE1vZGVsKCkpOwotCQkJCQkJCWlmICh3cGNvbXAuZ2V0T2JqZWN0KCkuZXF1YWxzKHRhc2tub2RlLmdldE9iamVjdCgpKSkgewotCQkJCQkJCQlpZiAod3Bjb21wLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCQkJCWNvbmZpcm1lZFNlcUlucHV0TGlzdAotCQkJCQkJCQkJCQkuYWRkKGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkJCQkJLmdldChrKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlmb3IgKGludCBrID0gMDsgayA8IG91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3cGNvbXAgPSAoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSAoKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIG91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkJLmdldChrKSkuZ2V0TW9kZWwoKSk7Ci0JCQkJCQkJaWYgKHdwY29tcC5nZXRPYmplY3QoKS5lcXVhbHModGFza25vZGUuZ2V0T2JqZWN0KCkpKSB7Ci0JCQkJCQkJCWlmICh3cGNvbXAuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCQkJCQkJCWNvbmZpcm1lZFNlcU91dHB1dExpc3QKLQkJCQkJCQkJCQkJLmFkZChvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCQkJCQkuZ2V0KGspKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWNvbmZpcm1lZFNlcUlucHV0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJc2V0T2JqZWN0c0xvY2F0aW9ucyhjb25maXJtZWRTZXFJbnB1dExpc3QpOwotCQkJCQl5ID0gY2FjaGVkUG9pbnQueSArIGNhY2hlZEhlaWdodCArIHlzcGFjaW5nOwotCQkJCX0KLQkJCQlMaXN0IHJvbGVDID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJvbGVDLmFkZChyb2xlY29tcG9zaXRlTGlzdC5nZXQoaSkpOwotCQkJCXNldE9iamVjdHNMb2NhdGlvbnMocm9sZUMpOwotCi0JCQkJeSA9IGNhY2hlZFBvaW50LnkgKyBjYWNoZWRIZWlnaHQgKyB5c3BhY2luZzsKLQkJCQlpZiAoIWNvbmZpcm1lZFNlcU91dHB1dExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCXNldE9iamVjdHNMb2NhdGlvbnMoY29uZmlybWVkU2VxT3V0cHV0TGlzdCk7Ci0JCQkJCXkgPSBjYWNoZWRQb2ludC55ICsgY2FjaGVkSGVpZ2h0ICsgeXNwYWNpbmc7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlpZiAoIW1pc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcmludCBTaXplIG9mIG1pc2M6ICIgKyBtaXNjTGlzdC5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoIWxvYWRpbmcpIHsKLQkJCQltaXNjZWxsYW5lb3VzID0gdHJ1ZTsKLQkJCX0KLQkJCXNldE9iamVjdHNMb2NhdGlvbnMobWlzY0xpc3QpOwotCQkJbWlzY2VsbGFuZW91cyA9IGZhbHNlOwotCQl9Ci0KLQkJbG9hZGluZyA9IGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjU2l6ZShPYmplY3QgY2hpbGQpIHsKLQkJTGlzdCBsaXN0ID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQpLmdldENoaWxkcmVuKCk7Ci0JCWludCBsYXJnZXN0V2lkdGggPSAwOwotCQlpbnQgbGFyZ2VzdEhlaWdodCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlOb2RlIG9iak5vZGUgPSAoTm9kZSkgKChOb2RlRWRpdFBhcnQpIG9iaikuZ2V0TW9kZWwoKTsKLQkJCWlmIChvYmpOb2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkgewotCQkJCWludCBub2RlV2lkdGggPSAoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikuZ2V0RmlndXJlKCkKLQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJaW50IG5vZGVIZWlnaHQgPSAoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikuZ2V0RmlndXJlKCkKLQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCWlmIChub2RlV2lkdGggPiBsYXJnZXN0V2lkdGgpCi0JCQkJCWxhcmdlc3RXaWR0aCA9IG5vZGVXaWR0aDsKLQkJCQlpZiAobm9kZUhlaWdodCA+IGxhcmdlc3RIZWlnaHQpCi0JCQkJCWxhcmdlc3RIZWlnaHQgPSBub2RlSGVpZ2h0OwotCQkJfQotCQl9Ci0JCSgoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgY2hpbGQpLmdldEZpZ3VyZSgpLnNldFByZWZlcnJlZFNpemUoCi0JCQkJbmV3IERpbWVuc2lvbihsYXJnZXN0V2lkdGggKiAyICsgMTAsIDIwICsgbGFyZ2VzdEhlaWdodAotCQkJCQkJKiAobGlzdC5zaXplKCkgLyAyICsgMSkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0T2JqZWN0c0xvY2F0aW9ucyhMaXN0IGxpc3QpIHsKLQotCQl4YXhpc2JlZ2luID0gdHJ1ZTsKLQkJeCA9IDEwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkOwotCQkJCWlmIChwYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCVBvaW50IHAgPSBub2RlLmdldExvY2F0aW9uKCk7Ci0JCQkJCWlmIChwID09IG51bGwgfHwgcC54ID09IC0xKSB7Ci0JCQkJCQlpbnQgdmlld2VyV2lkdGggPSBwYXJ0LmdldFJvb3QoKS5nZXRWaWV3ZXIoKQotCQkJCQkJCQkuZ2V0Q29udHJvbCgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCQkJaWYgKCF4YXhpc2JlZ2luKSB7Ci0JCQkJCQkJeCA9IGNhY2hlZFBvaW50LnggKyBjYWNoZWRXaWR0aCArIHNwYWNpbmc7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBjaGVjayBpZiBwIGlzIG51bGwsIGNyZWF0ZSBQb2ludC4KLQkJCQkJCWlmIChwID09IG51bGwpCi0JCQkJCQkJcCA9IG5ldyBQb2ludCgpOwotCi0JCQkJCQlpZiAoIWxvYWRpbmcgJiYgbWlzY2VsbGFuZW91cykgewotCQkJCQkJCXAueCA9IHg7Ci0JCQkJCQkJcC55ID0gMTA7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXAueCA9IHg7Ci0JCQkJCQkJcC55ID0geTsKLQkJCQkJCX0KLQkJCQkJCW5vZGUuc2V0TG9jYXRpb24ocCk7Ci0JCQkJCQlpZiAoIW1pc2NlbGxhbmVvdXMpCi0JCQkJCQkJY2FjaGVkUG9pbnQgPSBwOwotCQkJCQkJY2FjaGVkV2lkdGggPSBwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJCWlmIChwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQgPiBjYWNoZWRIZWlnaHQpCi0JCQkJCQkJY2FjaGVkSGVpZ2h0ID0gcGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJeGF4aXNiZWdpbiA9IGZhbHNlOwotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIlBvaW50IDogIiArIG5ldyBQb2ludCh4LCB5KS50b1N0cmluZygpICsgIkFuZCB3aWR0aD0iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkrIGNhY2hlZFdpZHRoCi0JCQkJCQkJCQkJCSsgIiwgSGVpZ2h0PSIgKyBjYWNoZWRIZWlnaHQgKyAiLCBXaWR0aCBvZiBWaWV3ZXI6ICIgKyB2aWV3ZXJXaWR0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyByZWNlbnRseSBhZGRkZWQgZWRpdHBhcnRzLiBVc3VhbGx5IGNhbGxlZCAKLQkgKiBieSBkaWFncmFtIHNlcnZpY2VzIHRvIGRvIGF1dG9sYXlvdXQgYWRqdXN0bWVudC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWNlbnRseUFkZGVkUGFydHMoKSB7Ci0JCXJldHVybiByZWNlbnRseUFkZGVkUGFydHM7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIHJlY2VudGx5IGFkZGVkIGVkaXRwYXJ0cyBmcm9tIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyUmVjZW50bHlBZGRlZFBhcnRzKCkgewotCQlyZWNlbnRseUFkZGVkUGFydHMuY2xlYXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWY0NmY1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSdzIEVkaXRQYXJ0LiBDcmVhdGVzIGFuIEVkaXRQYXJ0IGZvcgotICogQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0ncyBjaGlsZHJlbi4gIAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBFZGl0UGFydEZhY3RvcnkgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBFZGl0UGFydCBmb3IgYSBjaGlsZCB3aXRoIGluIHRoZSBjb250ZXh0LgotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KAotCQkJCQkoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSkgewotCQkJcmV0dXJuIG5ldyBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KChSb2xlVGFza0NvbXBvc2l0ZSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpIHsKLQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCgKLQkJCQkJKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBSb2xlTm9kZSB8fCBtb2RlbCBpbnN0YW5jZW9mIFRhc2tOb2RlCi0JCQkJfHwgbW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IERlc2NyaXB0b3JOb2RlRWRpdFBhcnQoKE5hbWVkTm9kZSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgTGluaykgewotCQkJcmV0dXJuIG5ldyBMaW5rRWRpdFBhcnQoKExpbmspIG1vZGVsKTsKLQkJfQotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCVR5cGVkTm9kZSBub2RlID0gKFR5cGVkTm9kZSkgbW9kZWw7Ci0JCQlzd2l0Y2ggKG5vZGUuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIFR5cGVkTm9kZS5TVEFSVDoKLQkJCQlyZXR1cm4gbmV3IFN0YXJ0Tm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuRU5EOgotCQkJCXJldHVybiBuZXcgRW5kTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuREVDSVNJT046Ci0JCQkJcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLlNZTkNIX0JBUjoKLQkJCQlyZXR1cm4gbmV3IFN5bmNoQmFyTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuRlJFRV9URVhUOgotCQkJCXJldHVybiBuZXcgRnJlZVRleHROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURpYWdyYW1FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MDc5ZjkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURpYWdyYW1FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLQotLyoqCi0gKiBFZGl0UGFydCBmb3IgQWN0aXZpdHlEaWFncmFtLgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0IGV4dGVuZHMgRGlhZ3JhbUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBlZGl0cGFydCBmb3IgQWN0aXZpdHkgRGlhZ3JhbS4gCi0JICogCi0JICogQHBhcmFtIG1vZGVsIHtAbGluayBBY3Rpdml0eURpYWdyYW19Ci0JICovCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0KEFjdGl2aXR5RGlhZ3JhbSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZWM5NzZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtRWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgZWRpdHBhcnQgZm9yIEFjdGl2aXR5RGlhZ3JhbSdzIGNoaWxkcmVuLiAKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3RvcnkjY3JlYXRlRWRpdFBhcnQob3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIEFjdGl2aXR5RGlhZ3JhbSkgewotCQkJcmV0dXJuIG5ldyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydCgoQWN0aXZpdHlEaWFncmFtKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCXJldHVybiBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQoKE5hbWVkTm9kZSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgTGluaykgewotCQkJcmV0dXJuIG5ldyBMaW5rRWRpdFBhcnQoKExpbmspIG1vZGVsKTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJVHlwZWROb2RlIG5vZGUgPSAoVHlwZWROb2RlKSBtb2RlbDsKLQkJCXN3aXRjaCAobm9kZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgVHlwZWROb2RlLlNUQVJUOgotCQkJCXJldHVybiBuZXcgU3RhcnROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5FTkQ6Ci0JCQkJcmV0dXJuIG5ldyBFbmROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5ERUNJU0lPTjoKLQkJCQlyZXR1cm4gbmV3IERlY2lzaW9uTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuU1lOQ0hfQkFSOgotCQkJCXJldHVybiBuZXcgU3luY2hCYXJOb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5GUkVFX1RFWFQ6Ci0JCQkJcmV0dXJuIG5ldyBGcmVlVGV4dE5vZGVFZGl0UGFydChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9CYXNlRWRpdFBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9CYXNlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzIxOTdkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQmFzZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5UZXh0RmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXMuTGFiZWxTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuU2VsZWN0YWJsZUxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci0KLS8qKgotICogUHJvdmlkZXMgaW5mcmFzdHJ1Y3R1cmUgZm9yIGRlbGV0aW9uLCBkaXJlY3QtZWRpdGluZywgcHJvcGVydHkgc291cmNlIGFuZAotICogbW9kZWwtbGlzdGVuaW5nLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCB7Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCXByb3RlY3RlZCBBZGFwdGVyIG1vZGVsTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG1zZyk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgCi0JICogQHBhcmFtIG9iaiB7QGxpbmsgRU9iamVjdH0KLQkgKi8KLQlwdWJsaWMgQmFzZUVkaXRQYXJ0KEVPYmplY3Qgb2JqKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE1vZGVsKG9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCSgoRU9iamVjdCkgZ2V0TW9kZWwoKSkuZUFkYXB0ZXJzKCkuYWRkKG1vZGVsTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKTsKLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwKLQkJCQluZXcgTGFiZWxTZWxlY3Rpb25FZGl0UG9saWN5KCkpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3RhYmxlTGFiZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQjZGVhY3RpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJKChFT2JqZWN0KSBnZXRNb2RlbCgpKS5lQWRhcHRlcnMoKS5yZW1vdmUobW9kZWxMaXN0ZW5lcik7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0KLQlJRmlndXJlIGdldERpcmVjdEVkaXRGaWd1cmUoKSB7Ci0JCXJldHVybiBnZXRGaWd1cmUoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0RGlyZWN0RWRpdFRleHQoKSB7Ci0JCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWcpLmdldFRleHQoKTsKLQkJfSBlbHNlIGlmIChmaWcgaW5zdGFuY2VvZiBUZXh0RmxvdykgewotCQkJcmV0dXJuICgoVGV4dEZsb3cpIGZpZykuZ2V0VGV4dCgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKTsKLQotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXREaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJbWFuYWdlciA9IGNyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldERpcmVjdEVkaXRNYW5hZ2VyKCk7Ci0KLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5zaG93KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxEaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0Q2VsbEVkaXRvci5jbGFzcywKLQkJCQluZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcihnZXREaXJlY3RFZGl0RmlndXJlKCkpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQm90dG9tQW5jaG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQm90dG9tQW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliN2Y1NmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0JvdHRvbUFuY2hvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgYm90dG9tIGFuY2hvciBmb3IgYSBmaWd1cmUncyBib3R0b20gbG9jYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLWNsYXNzIEJvdHRvbUFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwcml2YXRlIGludCBvZmZzZXQ7Ci0KLQlCb3R0b21BbmNob3IoSUZpZ3VyZSBzb3VyY2UsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlSZWN0YW5nbGUgciA9IGdldE93bmVyKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlnZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCWludCBvZmYgPSBvZmZzZXQ7Ci0JCWlmIChvZmYgPT0gLTEpCi0JCQlvZmYgPSByLndpZHRoIC8gMjsKLQkJaWYgKHIuY29udGFpbnMocmVmZXJlbmNlKSB8fCByLmJvdHRvbSgpID4gcmVmZXJlbmNlLnkpCi0JCQlyZXR1cm4gci5nZXRUb3BMZWZ0KCkudHJhbnNsYXRlKG9mZiwgMCk7Ci0JCWVsc2UKLQkJCXJldHVybiByLmdldEJvdHRvbUxlZnQoKS50cmFuc2xhdGUob2ZmLCAtMSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0Nsb3Nlc3RBbmNob3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9DbG9zZXN0QW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM2MDRhNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0Nsb3Nlc3RBbmNob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Q29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5BbmNob3JVdGlsOwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgdG8gZmluZCB0aGUgY2xvc2VzdCBsb2NhdGlvbiBpbiBmaWd1cmUKLSAqIGZvciBhbmNob3IuIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2xvc2VzdEFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwdWJsaWMgQ2xvc2VzdEFuY2hvcihJRmlndXJlIGZpZ3VyZSkgewotCQlzdXBlcihmaWd1cmUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3IjZ2V0TG9jYXRpb24oUG9pbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlyZXR1cm4gZ2V0TG9jYXRpb24oZ2V0T3duZXIoKSwgcmVmZXJlbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgbG9jYXRpb24gaW4gdGhlIGNsb3Nlc3QgbG9jYXRpb24gaW4gZmlndXJlLCBiYXNlZCBvbiAKLQkgKiBmaWd1cmUgYm91bmRzIGFuZCB0aGUgcmVmZXJlbmNlIHBvaW50LiAgIAotCSAqIAotCSAqIEBwYXJhbSBmaWd1cmUge0BsaW5rIElGaWd1cmV9ICBGaWd1cmUgdG8gd2hpY2ggY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hpbmcuCi0JICogQHBhcmFtIHJlZmVyZW5jZSB7QGxpbmsgUG9pbnR9Ci0JICovCi0JcHVibGljIHN0YXRpYyBQb2ludCBnZXRMb2NhdGlvbihJRmlndXJlIGZpZ3VyZSwgUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCVJlY3RhbmdsZSByID0gZmlndXJlLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJZmlndXJlLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCVJlY3RhbmdsZSBhYnNvbHV0ZUJvdW5kcyA9IHIuZ2V0Q29weSgpOwotCQlQb2ludCBwID0gbnVsbDsKLQkJc3dpdGNoIChyLmdldFBvc2l0aW9uKHJlZmVyZW5jZSkpIHsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSDoKLQkJCXAgPSByLmdldFRvcExlZnQoKS50cmFuc2xhdGUocmVmZXJlbmNlLnggLSByLngsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuTk9SVEhfRUFTVDoKLQkJCXAgPSByLmdldFRvcFJpZ2h0KCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5FQVNUOgotCQkJcCA9IHIuZ2V0VG9wUmlnaHQoKS50cmFuc2xhdGUoMCwgcmVmZXJlbmNlLnkgLSByLnkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuU09VVEhfRUFTVDoKLQkJCXAgPSByLmdldEJvdHRvbVJpZ2h0KCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSDoKLQkJCXAgPSByLmdldEJvdHRvbUxlZnQoKS50cmFuc2xhdGUocmVmZXJlbmNlLnggLSByLngsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuU09VVEhfV0VTVDoKLQkJCXAgPSByLmdldEJvdHRvbUxlZnQoKTsKLQkJCWJyZWFrOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLldFU1Q6Ci0JCQlwID0gci5nZXRUb3BMZWZ0KCkudHJhbnNsYXRlKDAsIHJlZmVyZW5jZS55IC0gci55KTsKLQkJCWJyZWFrOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIX1dFU1Q6Ci0JCQlwID0gci5nZXRUb3BMZWZ0KCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWludCB0b3BEaXN0YW5jZSA9IHJlZmVyZW5jZS55IC0gci55OwotCQkJaW50IHJpZ2h0RGlzdGFuY2UgPSByLnJpZ2h0KCkgLSByZWZlcmVuY2UueDsKLQkJCWludCBib3R0b21EaXN0YW5jZSA9IHIuYm90dG9tKCkgLSByZWZlcmVuY2UueTsKLQkJCWludCBsZWZ0RGlzdGFuY2UgPSByZWZlcmVuY2UueCAtIHIueDsKLQkJCWludFtdIGRpc3RhbmNlcyA9IHsgdG9wRGlzdGFuY2UsIHJpZ2h0RGlzdGFuY2UsIGJvdHRvbURpc3RhbmNlLAotCQkJCQlsZWZ0RGlzdGFuY2UgfTsKLQkJCWludCBpZCA9IEFuY2hvclV0aWwubWluKGRpc3RhbmNlcyk7Ci0JCQlzd2l0Y2ggKGlkKSB7Ci0JCQljYXNlIDA6Ci0JCQkJcCA9IHIuZ2V0VG9wTGVmdCgpLnRyYW5zbGF0ZShsZWZ0RGlzdGFuY2UsIDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCXAgPSByLmdldFRvcFJpZ2h0KCkudHJhbnNsYXRlKDAsIHRvcERpc3RhbmNlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlwID0gci5nZXRCb3R0b21MZWZ0KCkudHJhbnNsYXRlKGxlZnREaXN0YW5jZSwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkJcCA9IHIuZ2V0VG9wTGVmdCgpLnRyYW5zbGF0ZSh0b3BEaXN0YW5jZSwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJcC5wZXJmb3JtVHJhbnNsYXRlKC1hYnNvbHV0ZUJvdW5kcy54LCAtYWJzb2x1dGVCb3VuZHMueSk7Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGVjaXNpb25Ob2RlRWRpdFBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZWNpc2lvbk5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OWUyYWJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZWNpc2lvbk5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkRpYW1vbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5BbmNob3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuQ29ubmVjdGlvbkFuY2hvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Mb2NhdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEVkaXRQYXJ0IGZvciAgRGVjaXNpb25Ob2RlLCB1c2VkIGluIGFjdGl2aXR5IGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVFZGl0UGFydCBleHRlbmRzIE5vZGVFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUNvbm5lY3Rpb25BbmNob3JMb2NhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJHX0NPTE9SID0gbmV3IENvbG9yKG51bGwsIDI1NCwgMjA0LCAxNTMpOwotCi0JcHJpdmF0ZSBQb2ludCByZWNlbnRTb3VyY2VFbmRQb2ludDsKLQotCXByaXZhdGUgUG9pbnQgcmVjZW50VGFyZ2V0RW5kUG9pbnQ7Ci0KLQlwdWJsaWMgRGVjaXNpb25Ob2RlRWRpdFBhcnQoVHlwZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRmlndXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCURpYW1vbmQgZmlndXJlID0gbmV3IERpYW1vbmQoKTsKLQkJZmlndXJlLnNldEJhY2tncm91bmRDb2xvcihCR19DT0xPUik7Ci0JCWZpZ3VyZS5zZXRTaXplKDQ4LCAyNCk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlRWRpdFBhcnQjZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0KQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlib29sZWFuIGlzUmVsYXRpdmUgPSBmYWxzZTsKLQkJUG9pbnQgc291cmNlRW5kUG9pbnQ7Ci0JCWlmIChyZWNlbnRTb3VyY2VFbmRQb2ludCA9PSBudWxsKSB7Ci0JCQkvLyBnZXQgc291cmNlIGVuZCBwb2ludCBmcm9tIHRoZSBtb2RlbAotCQkJTGluayBsaW5rID0gKExpbmspIGNvbm5lY3Rpb24uZ2V0TW9kZWwoKTsKLQkJCXNvdXJjZUVuZFBvaW50ID0gbGluay5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQkJaXNSZWxhdGl2ZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlzb3VyY2VFbmRQb2ludCA9IHJlY2VudFNvdXJjZUVuZFBvaW50OwotCQl9Ci0JCWlmIChzb3VyY2VFbmRQb2ludCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHNvdXJjZUVuZFBvaW50LCBpc1JlbGF0aXZlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihjb25uZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0I2dldFNvdXJjZUNvbm5lY3Rpb25BbmNob3Iob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0JICovCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUG9pbnQgcCA9IG51bGw7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHsKLQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcSA9IChDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCkgcmVxdWVzdDsKLQkJCXAgPSByZXEuZ2V0TG9jYXRpb24oKTsKLQkJfSBlbHNlIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KSB7Ci0JCQlwID0gKChMb2NhdGlvblJlcXVlc3QpIHJlcXVlc3QpLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJcmVjZW50U291cmNlRW5kUG9pbnQgPSBnZXRMb2NhdGlvbihwKTsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgcmVjZW50U291cmNlRW5kUG9pbnQsIHRydWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKHJlcXVlc3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlRWRpdFBhcnQjZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0KQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlib29sZWFuIGlzUmVsYXRpdmUgPSBmYWxzZTsKLQkJUG9pbnQgdGFyZ2V0RW5kUG9pbnQ7Ci0JCWlmIChyZWNlbnRUYXJnZXRFbmRQb2ludCA9PSBudWxsKSB7Ci0JCQkvLyBnZXQgdGFyZ2V0IGVuZCBwb2ludCBmcm9tIG1vZGVsCi0JCQlMaW5rIGxpbmsgPSAoTGluaykgY29ubmVjdGlvbi5nZXRNb2RlbCgpOwotCQkJdGFyZ2V0RW5kUG9pbnQgPSBsaW5rLmdldFRhcmdldEVuZFBvaW50KCk7Ci0JCQlpc1JlbGF0aXZlID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXRhcmdldEVuZFBvaW50ID0gcmVjZW50VGFyZ2V0RW5kUG9pbnQ7Ci0JCX0KLQkJaWYgKHRhcmdldEVuZFBvaW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgdGFyZ2V0RW5kUG9pbnQsIGlzUmVsYXRpdmUpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoY29ubmVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVFZGl0UGFydCNnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVBvaW50IHAgPSBudWxsOwotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSB7Ci0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXEgPSAoQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHJlcXVlc3Q7Ci0JCQlwID0gcmVxLmdldExvY2F0aW9uKCk7Ci0JCX0gZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkgewotCQkJcCA9ICgoTG9jYXRpb25SZXF1ZXN0KSByZXF1ZXN0KS5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXJlY2VudFRhcmdldEVuZFBvaW50ID0gZ2V0TG9jYXRpb24ocCk7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHJlY2VudFRhcmdldEVuZFBvaW50LCB0cnVlKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5Db25uZWN0aW9uQW5jaG9yTG9jYXRvciNnZXRMb2NhdGlvbihQb2ludCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCURpYW1vbmQgZiA9ICgoRGlhbW9uZCkgZ2V0RmlndXJlKCkpOwotCi0JCS8vIHRyYW5zbGF0ZSBwb2ludHMgdG8gYWJzb2x1dGUKLQkJUG9pbnRbXSBwb2ludHMgPSBuZXcgUG9pbnRbZi5nZXRQb2ludHMoKS5zaXplKCldOwotCQlmb3IgKGludCBpID0gZi5nZXRQb2ludHMoKS5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJUG9pbnQgcCA9IGYuZ2V0UG9pbnRzKCkuZ2V0UG9pbnQoaSk7Ci0JCQlmLnRyYW5zbGF0ZVRvQWJzb2x1dGUocCk7Ci0JCQlwb2ludHNbaV0gPSBwOwotCQl9Ci0KLQkJUG9pbnQgcCA9IEFuY2hvclV0aWwuZ2V0Q2xvc2VzdFBvaW50KHBvaW50cywgcmVmZXJlbmNlKTsKLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJUmVjdGFuZ2xlIHIgPSBmLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJCWYudHJhbnNsYXRlVG9BYnNvbHV0ZShyKTsKLQkJCXAucGVyZm9ybVRyYW5zbGF0ZSgtci54LCAtci55KTsKLQkJfQotCQlyZXR1cm4gcDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGVzY3JpcHRvck5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYTdhNjRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIEVkaXRQYXJ0IGZvciBXb3JrQnJlYWtkb3duIEVsZW1lbnRzIGluIGFuIEFjdGl2aXR5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvck5vZGVFZGl0UGFydCBleHRlbmRzIE5hbWVkTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBEZXNjcmlwdG9yTm9kZUVkaXRQYXJ0KE5hbWVkTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5hbWVkTm9kZUVkaXRQYXJ0I2dldEltYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQlpZigoKE5vZGUpbW9kZWwpLmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkKLQkJCQlyZXR1cm4gSW1hZ2VzLlJPTEVfREVTQ1JJUFRPUl8xNjsKLQkJCXJldHVybiBJbWFnZXMuUk9MRTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQlpZigoKE5vZGUpbW9kZWwpLmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkKLQkJCQlyZXR1cm4gSW1hZ2VzLlRBU0tfREVTQ1JJUFRPUl8xNjsKLQkJCXJldHVybiBJbWFnZXMuVEFTS19ERVNDUklQVE9SOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkgewotCQkJaWYoKChOb2RlKW1vZGVsKS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pCi0JCQkJcmV0dXJuIEltYWdlcy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl8xNjsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSAoKExpbmtlZE9iamVjdCkgbW9kZWwpCi0JCQkJCS5nZXRPYmplY3QoKTsKLQkJCVdvcmtQcm9kdWN0IHdwID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCXJldHVybiBJbWFnZXMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfMTY7Ci0JCQl9IGVsc2UgaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQlyZXR1cm4gSW1hZ2VzLkRFTElWRVJBQkxFOwotCQkJfSBlbHNlIGlmICh3cCBpbnN0YW5jZW9mIE91dGNvbWUpIHsKLQkJCQlyZXR1cm4gSW1hZ2VzLk9VVENPTUU7Ci0JCQl9Ci0JCQlyZXR1cm4gSW1hZ2VzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SXzE2OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5OYW1lZE5vZGVFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkgKgotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJTGFiZWwgbCA9IChMYWJlbCkgZ2V0RmlndXJlKCk7Ci0JCXJldHVybiBuZXcgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHRDZWxsRWRpdG9yLmNsYXNzLAotCQkJCW5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvcihsKSwgbCkgewotCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQlPYmplY3Qgb2JqID0gZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJCWUsIHR4dCwgbm9kZS5nZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqOwotCQkJCQlPYmplY3QgZSA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrV29ya0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKGUsCi0JCQkJCQkJdHh0LCBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tSb2xlRGVzY3JpcHRvclByZXNlbnRhdGlvbk5hbWUoZSwgdHh0LCBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUodHh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU291cmNlQ29ubmVjdGlvbnMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hTb3VyY2VDb25uZWN0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09NUE9ORU5UX1JPTEUsIG51bGwpOwotCX0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0RGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtQWN0aW9uU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1BY3Rpb25TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3YzI5YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1BY3Rpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZUJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuUmVjb25uZWN0TGlua0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogU2VydmljZSBjbGFzcyB0byBhbGxvdyBjcmVhdGUgYW5kIHJlZ2lzdGVyIGNvbW1vbiBhY3Rpb24gdG8gdGhlIGFjdGlvbgotICogcmVnaXN0ZXIuIE1vc3Qgb2YgdGhlIGNvZGUgYXJlIG1vdmVkIGZyb20gdGhlIEVkaXRvciBjbGFzcy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1BY3Rpb25TZXJ2aWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX0hPUlpfQVZFUkFHRSA9ICJhbGlnbl9ob3Jpem9udGFsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEID0gImFsaWduX2hvcml6b250YWxfdG9fZmlyc3Rfc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fVkVSVF9BVkVSQUdFID0gImFsaWduX3ZlcnRpY2FsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEID0gImFsaWduX3ZlcnRpY2FsX3RvX2ZpcnN0X3NlbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbjsKLQotCXByaXZhdGUgR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLQotCXByaXZhdGUgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAKLQkgKiBAcGFyYW0gZ3JhcGhpY2FsVmlld2VyIHtAbGluayBHcmFwaGljYWxWaWV3ZXJ9Ci0JICogQHBhcmFtIGVkaXREb21haW4gCXtAbGluayBEZWZhdWx0RWRpdERvbWFpbn0KLQkgKiBAcGFyYW0gYWN0aW9uUmVnaXN0cnkgCXtAbGluayBBY3Rpb25SZWdpc3RyeX0KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUFjdGlvblNlcnZpY2UoR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlciwKLQkJCURlZmF1bHRFZGl0RG9tYWluIGVkaXREb21haW4sIEFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5KSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCQl0aGlzLmVkaXREb21haW4gPSBlZGl0RG9tYWluOwotCQl0aGlzLmFjdGlvblJlZ2lzdHJ5ID0gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgR3JhcGhpY2FsVmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyYXBoaWNhbFZpZXdlcihHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgR3JhcGhpY2FsVmlld2VyCi0JICovCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHJldHVybiB0aGUgY29tbWFuZCBzdGFjawotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXQgZG9tYWluLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXQgZG9tYWluCi0JICovCi0JcHJvdGVjdGVkIERlZmF1bHRFZGl0RG9tYWluIGdldEVkaXREb21haW4oKSB7Ci0JCXJldHVybiBlZGl0RG9tYWluOwotCX0KLQotCXByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRBY3Rpb25SZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGFjdGlvblJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIEhvcml6b250YWxBbGlnbkF2ZXJhZ2VBY3Rpb24gYWN0aW9uLiAKLQkgKiBIb3Jpem9udGFsQWlnbkF2ZXJhZ2UgQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgdG8gaG9yaXpvbnRhbCBhdmVyYWdlLiAgCi0JICovCi0JcHVibGljIElBY3Rpb24gcmVnaXN0ZXJIb3Jpem9udGFsQWxpZ25BdmVyYWdlQWN0aW9uKCkgewotCQkvLyBhbGlnbiBob3Jpem9udGFsbHkgdG8gYXZlcmFnZSB5LXZhbHVlIG9mIGFsbCBub2RlcwotCQlJQWN0aW9uIGhBbGlnbkF2ZXJhZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlob3JpekFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fSE9SWl9BVkVSQUdFOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGhBbGlnbkF2ZXJhZ2VBY3Rpb24pOwotCi0JCXJldHVybiBoQWxpZ25BdmVyYWdlQWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciBIb3Jpem9udGFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFjdGlvbi4gCi0JICogSG9yaXpvbnRhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiBhbGlnbnMgc2VsZWN0ZWQgZWRpdHBhcnRzIHdpdGggCi0JICogcmVzcGVjdCB0byBmaXJzdCBzZWxlY3RlZCBlZGl0cGFydC4gCi0JICovCi0KLQlwdWJsaWMgSUFjdGlvbiByZWdpc3Rlckhvcml6b250YWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKSB7Ci0JCS8vIGFsaWduIGhvcml6b250YWxseSB0byB5LXZhbHVlIG9mIGZpcnN0IHNlbGVjdGVkIG5vZGUKLQkJSUFjdGlvbiBoQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaG9yekFsaWduVG9GaXJzdFNlbGVjdGVkKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIEFMSUdOX0hPUlpfRklSU1RfU0VMRUNURUQ7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbik7Ci0KLQkJcmV0dXJuIGhBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb247Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIHZlcnRpYWxBbGlnbkF2ZXJhZ2VBY3Rpb24gYWN0aW9uLiAKLQkgKiB2ZXJ0aWFsQWxpZ25BdmVyYWdlQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgdmVydGljYWxseSB3LnIudCBhdmVyYWdlLgotCSAqIAotCSAqLwotCQotCXB1YmxpYyBJQWN0aW9uIHJlZ2lzdGVyVmVydGljYWxBbGlnbkF2ZXJhZ2VBY3Rpb24oKSB7Ci0JCS8vIGFsaWduIHZlcnRpY2FsbHkgdG8gYXZlcmFnZSB4LXZhbHVlIG9mIGFsbCBzZWxlY3RlZCBub2RlcwotCQlJQWN0aW9uIHZBbGlnbkF2ZXJhZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl2ZXJ0aWNhbEFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fVkVSVF9BVkVSQUdFOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHZBbGlnbkF2ZXJhZ2VBY3Rpb24pOwotCi0JCXJldHVybiB2QWxpZ25BdmVyYWdlQWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIHZlcnRpYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gYWN0aW9uLiAKLQkgKiB2ZXJ0aWFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgdmVydGljYWxseSB3LnIudCBmaXJzdCBzZWxlY3RlZC4KLQkgKiAKLQkgKi8KLQotCXB1YmxpYyBJQWN0aW9uIHJlZ2lzdGVyVmVydGljYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKSB7Ci0JCS8vIGFsaWduIHZlcnRpY2FsbHkgdG8geC12YWx1ZSBvZiBmaXJzdCBzZWxlY3RlZCBub2RlCi0JCUlBY3Rpb24gdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXZlcnRpY2FsQWxpZ25Ub0ZpcnN0U2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRDsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih2QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKTsKLQotCQlyZXR1cm4gdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbjsKLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gYWN0aW9uIG1ldGhvZHMKLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCi0JLyoqIAotCSAqIEFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtZXRob2QgZm9yIGhvcml6b250YWxBbGlnbkZpcnN0ZVNFbGVjdGVkQWN0aW9uLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGhvcnpBbGlnblRvRmlyc3RTZWxlY3RlZCgpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGZpcnN0UGFydCA9IG51bGw7Ci0JCS8vIGxvb3AgdGhyb3VnaCBhbGwgc2VsZWN0ZWQgaXRlbXMsIHJlbWVtYmVyIHRoZSB5LXZhbHVlIG9mIHRoZQotCQkvLyBmaXJzdCBub2RlLAotCQkvLyBzZXQgdGhlIGZvbGxvd2luZyBub2RlcyB0byB0aGUgc2FtZSB5LXZhbHVlCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydAotCQkJCQl8fCBlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gcmVtZW1iZXIgdGhlIGZpcnN0IHBhcnQgd2UgbW92ZQotCQkJCWlmIChmaXJzdFBhcnQgPT0gbnVsbCkgewotCQkJCQlmaXJzdFBhcnQgPSBlcDsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBjYWxjdWxhdGUgdGhlIG9mZnNldCBmb3IgY2VudGVybGluZSBhbGlnbm1lbnQKLQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMuaGVpZ2h0IC0gZmlyc3RQYXJ0Ci0JCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmhlaWdodCkgLyAyLjApOwotCQkJCQkvLyBpcyB0aGlzIG5vZGUgaW4gYSBjb250YWluZXI/Ci0JCQkJCWlmICghKGVwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQkJLy8gbmVlZCB0byBtb3ZlIHRoZSBjb250YWluZXIsIGFkanVzdCB0aGUgb2Zmc2V0Ci0JCQkJCQllcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlcC5nZXRQYXJlbnQoKTsKLQkJCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJCW9mZnNldCArPSBib3VuZHMueSAtIHBhcmVudEJvdW5kcy55OwotCQkJCQkJYm91bmRzID0gcGFyZW50Qm91bmRzOwotCQkJCQl9Ci0JCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgbm9kZQotCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksIG5ldyBQb2ludChib3VuZHMueCwgZmlyc3RQYXJ0Ci0JCQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueQotCQkJCQkJCQkJLSBvZmZzZXQpLCBib3VuZHMud2lkdGgpOwotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKiogCi0JICogQWN0aW9uIGltcGxlbWVudGF0aW9uIG1ldGhvZCBmb3IgaG9yaXpvbnRhbEFsaWduQXZlcmFnZUFjdGlvbi4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBob3JpekFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKSB7Ci0JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBmaXJzdFBhcnQgPSBudWxsOwotCQlpbnQgdG90YWwgPSAwOwotCQlpbnQgeXN1bSA9IDA7Ci0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydAotCQkJCQl8fCBlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gcmVtZW1iZXIgdGhlIGZpcnN0IHBhcnQgd2UgbW92ZQotCQkJCWlmIChmaXJzdFBhcnQgPT0gbnVsbCkgewotCQkJCQlmaXJzdFBhcnQgPSBlcDsKLQkJCQl9Ci0JCQkJeXN1bSArPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55OwotCQkJCXRvdGFsKys7Ci0JCQl9Ci0JCX0KLQkJLy8gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIHktdmFsdWUgZm9yIGFsbCBub2RlcwotCQlpbnQgeWF2ZSA9IChpbnQpICgoZG91YmxlKSB5c3VtIC8gKGRvdWJsZSkgdG90YWwpOwotCQkvLyBsb29wIHRocm91Z2ggYWxsIHRoZSBub2RlcyBhZ2FpbiBhbmQgc2V0IHRoZW0KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyBjYWxjdWxhdGUgdGhlIGhlaWdodCBkaWZmZXJlbmNlLCBzbyB0aGF0IGVsZW1lbnRzIGFyZSBhbGlnbmVkCi0JCQkJLy8gdGhyb3VnaCB0aGUgY2VudGVybGluZQotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMuaGVpZ2h0IC0gZmlyc3RQYXJ0Ci0JCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0KSAvIDIuMCk7Ci0JCQkJLy8gaXMgdGhpcyBub2RlIGluc2lkZSBhIGNvbnRhaW5lcj8KLQkJCQlpZiAoIShlcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJLy8gd2UgbmVlZCB0byBtb3ZlIHRoZSBjb250YWluZXIsIGFkanVzdCB0aGUgb2Zmc2V0Ci0JCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCW9mZnNldCArPSBib3VuZHMueSAtIHBhcmVudEJvdW5kcy55OwotCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJfQotCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgbm9kZQotCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgKLQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLAotCQkJCQkJbmV3IFBvaW50KGJvdW5kcy54LCB5YXZlIC0gb2Zmc2V0KSwgYm91bmRzLndpZHRoKTsKLQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJfQotCQl9Ci0KLQl9Ci0JLyoqIAotCSAqIEFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtZXRob2QgZm9yIHZlcnRpY2FsQWxpZ25Ub0F2ZXJhZ2VBY3Rpb24uCi0JICogCi0JICovCi0KLQlwdWJsaWMgdm9pZCB2ZXJ0aWNhbEFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKSB7Ci0JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBmaXJzdFBhcnQgPSBudWxsOwotCQlpbnQgdG90YWwgPSAwOwotCQlpbnQgeHN1bSA9IDA7Ci0JCS8vIGxvb3AgdGhyb3VnaCB0aGUgc2VsZWN0ZWQgcGFydHMKLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCS8vIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gbm9kZXMgYW5kIGNvbnRhaW5lcnMKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQlpZiAoZmlyc3RQYXJ0ID09IG51bGwpIHsKLQkJCQkJZmlyc3RQYXJ0ID0gZXA7Ci0JCQkJfQotCQkJCS8vIHN1bSB0aGUgeCBjb29yZGluYXRlcyBvZiBlYWNoIGVsZW1lbnQKLQkJCQl4c3VtICs9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLng7Ci0JCQkJLy8gcmVtZW1iZXIgaG93IG1hbnkgc2VsZWN0ZWQgZWxlbWVudHMgYXBwbGllZCB0byB0aGlzIG9wZXJhdGlvbgotCQkJCXRvdGFsKys7Ci0JCQl9Ci0JCX0KLQkJLy8gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIHgtdmFsdWUgZm9yIGFsbCBub2RlcwotCQlpbnQgeGF2ZSA9IChpbnQpICgoZG91YmxlKSB4c3VtIC8gKGRvdWJsZSkgdG90YWwpOwotCQkvLyBsb29wIHRocm91Z2ggYWxsIHRoZSBub2RlcyBhZ2FpbiBhbmQgc2V0IHRoZW0KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyBjYWxjdWxhdGUgdGhlIG9mZnNldCBmb3IgY2VudGVybGluZSBhbGlnbm1lbnQKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJaW50IG9mZnNldCA9IChpbnQpICgoZG91YmxlKSAoYm91bmRzLndpZHRoIC0gZmlyc3RQYXJ0Ci0JCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGgpIC8gMi4wKTsKLQkJCQkvLyBhcmUgd2UgaW5zaWRlIGEgY29udGFpbmVyPwotCQkJCWlmICghKGVwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQkvLyBhZGp1c3QgdGhlIG9mZnNldCBzaW5jZSB3ZSBoYXZlIHRvIG1vdmUgdGhlIGNvbnRhaW5lcgotCQkJCQllcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlcC5nZXRQYXJlbnQoKTsKLQkJCQkJUmVjdGFuZ2xlIHBhcmVudEJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQlvZmZzZXQgKz0gYm91bmRzLnggLSBwYXJlbnRCb3VuZHMueDsKLQkJCQkJYm91bmRzID0gcGFyZW50Qm91bmRzOwotCQkJCX0KLQkJCQkvLyBzZW5kIHRoZSBjb21tYW5kIHRvIG1vdmUgdGhlIGVsZW1lbnQKLQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwKLQkJCQkJCW5ldyBQb2ludCh4YXZlIC0gb2Zmc2V0LCBib3VuZHMueSksIGJvdW5kcy53aWR0aCk7Ci0JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCX0KLQkJfQotCi0JfQotCS8qKiAKLQkgKiBBY3Rpb24gaW1wbGVtZW50YXRpb24gbWV0aG9kIGZvciB2ZXJ0aWNhbEFsaWduVG9GaXJzdFNlbGVjdGVkQWN0aW9uLgotCSAqIAotCSAqLwotCi0JcHVibGljIHZvaWQgdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZCgpIHsKLQkJLy8gZ2V0IHRoZSBzZWxlY3RlZCBpdGVtcwotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgYWxpZ25Ub1BhcnQgPSBudWxsOwotCQkvLyBmaW5kIHRoZSBmaXJzdCBkaWFncmFtIHBhcnQgd2UgY2FuIGFsaWduIHRvCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydAotCQkJCQl8fCBlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJaWYgKGFsaWduVG9QYXJ0ID09IG51bGwpIHsKLQkJCQkJLy8gcmVtZW1iZXIgaXQgYW5kIHN0b3AKLQkJCQkJYWxpZ25Ub1BhcnQgPSBlcDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGxvb3AgdGhyb3VnaCB0aGUgZWxlbWVudHMgYW5kIHNldCB0aGVpciBuZXcgcG9zaXRpb24KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyB3ZSBjYW4gc2tpcCB0aGUgZmlyc3Qgb25lIHNpbmNlIHRoaXMgaXMgYW4gYWxpZ24tdG8KLQkJCQlpZiAoZXAgIT0gYWxpZ25Ub1BhcnQKLQkJCQkJCSYmICEoYWxpZ25Ub1BhcnQgaW5zdGFuY2VvZiBTeW5jaEJhck5vZGVFZGl0UGFydCkpIHsKLQkJCQkJLy8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgZm9yIGNlbnRlcmxpbmUgYWxpZ25tZW50Ci0JCQkJCWlmICghKGVwIGluc3RhbmNlb2YgU3luY2hCYXJOb2RlRWRpdFBhcnQpKSB7Ci0JCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMud2lkdGggLSBhbGlnblRvUGFydAotCQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGgpIC8gMi4wKTsKLQkJCQkJCS8vIGlzIHRoaXMgaW5zaWRlIGEgY29udGFpbmVyPwotCQkJCQkJaWYgKCEoZXAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCQkJLy8gYWRqdXN0IHRoZSBvZmZzZXQgc2luY2Ugd2UgYXJlIG1vdmluZyB0aGUKLQkJCQkJCQkvLyBjb250YWluZXIKLQkJCQkJCQllcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlcC5nZXRQYXJlbnQoKTsKLQkJCQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCQkJb2Zmc2V0ICs9IGJvdW5kcy54IC0gcGFyZW50Qm91bmRzLng7Ci0JCQkJCQkJYm91bmRzID0gcGFyZW50Qm91bmRzOwotCQkJCQkJfQotCQkJCQkJLy8gc2VuZCB0aGUgY29tbWFuZCB0byBtb3ZlIHRoZSBlbGVtZW50Ci0JCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLCBuZXcgUG9pbnQoYWxpZ25Ub1BhcnQKLQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueAotCQkJCQkJCQkJCS0gb2Zmc2V0LCBib3VuZHMueSksIGJvdW5kcy53aWR0aCk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJZXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24oCi0JCQkJCQkJCW5ldyBQb2ludChhbGlnblRvUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54Ci0JCQkJCQkJCQkJLSBvZmZzZXQsIGJvdW5kcy55KSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlQb2ludCB0cCA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldExvY2F0aW9uKCk7Ci0JCQkJCQlib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOwotCQkJCQkJYm9vbGVhbiBzb3VyY2UgPSBmYWxzZTsKLQkJCQkJCVBvaW50IGVuZFBvaW50ID0gbnVsbDsKLQkJCQkJCUxpbmtFZGl0UGFydCBscCA9IG51bGw7Ci0JCQkJCQkvLyBjaGVjayB0YXJnZXQgY29ubmVjdGlvbnMKLQkJCQkJCUxpc3QgbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBlcCkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJbHAgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQlpZiAobHAuZ2V0U291cmNlKCkuZXF1YWxzKGFsaWduVG9QYXJ0KSkgewotCQkJCQkJCQllbmRQb2ludCA9ICgoTGluaykgbHAuZ2V0TW9kZWwoKSkKLQkJCQkJCQkJCQkuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQkJCQkJCQkJdHAgPSB0cC5nZXRUcmFuc2xhdGVkKGVuZFBvaW50KTsKLQkJCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gY2hlY2sgc291cmNlIGNvbm5lY3Rpb25zIGlmIG5vdCBmb3VuZCBpbiB0YXJnZXQgY29ubmVjdGlvbnMKLQkJCQkJCWlmICghY29ubmVjdGVkKSB7Ci0JCQkJCQkJbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBlcCkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCWxwID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChscC5nZXRUYXJnZXQoKS5lcXVhbHMoYWxpZ25Ub1BhcnQpKSB7Ci0JCQkJCQkJCQllbmRQb2ludCA9ICgoTGluaykgbHAuZ2V0TW9kZWwoKSkKLQkJCQkJCQkJCQkJLmdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCQkJCQkJCQl0cCA9IHRwLmdldFRyYW5zbGF0ZWQoZW5kUG9pbnQpOwotCQkJCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQkJCXNvdXJjZSA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChjb25uZWN0ZWQgJiYgKGFsaWduVG9QYXJ0IGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0KSkgewotCQkJCQkJCQkJUG9pbnQgY2VudGVyUG9pbnQgPSBhbGlnblRvUGFydC5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQkJCQlpbnQgZGVsdGEgPSBjZW50ZXJQb2ludC54IC0gdHAueDsKLQkJCQkJCQllbmRQb2ludC54ICs9IGRlbHRhOwotCQkJCQkJCQkJUmVjb25uZWN0TGlua0NvbW1hbmQgYyA9IG5ldyBSZWNvbm5lY3RMaW5rQ29tbWFuZCgKLQkJCQkJCQkJCShMaW5rKSBscC5nZXRNb2RlbCgpLCAoTm9kZSkgZXAuZ2V0TW9kZWwoKSwKLQkJCQkJCQkJCXNvdXJjZSk7Ci0JCQkJCQkJYy5zZXRFbmRQb2ludChlbmRQb2ludCk7Ci0JCQkJCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gSWYgZmlyc3Qgc2VsZWN0ZWQgZWRpdCBwYXJ0IGlzIHN5bmNiYXJub2RlZWRpdHBhcnQsIG5lZWQgdG8KLQkJCQkvLyBoYW5kbGUgZGlmZmVyZW50bHkKLQkJCQlpZiAoZXAgIT0gYWxpZ25Ub1BhcnQKLQkJCQkJCSYmIChhbGlnblRvUGFydCBpbnN0YW5jZW9mIFN5bmNoQmFyTm9kZUVkaXRQYXJ0KSkgewotCi0JCQkJCVBvaW50IHNwID0gYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKLQkJCQkJLy8gY2hlY2sgaWYgdGhlIHBhcnQgaXMgY29ubmVjdGVkIHZpYSBzb3VyY2UgY29ubmVjdGlvbnMKLQkJCQkJTGlzdCBsaXN0ID0gKChOb2RlRWRpdFBhcnQpIGFsaWduVG9QYXJ0KQotCQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJTGlua0VkaXRQYXJ0IGxwID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAobHAuZ2V0VGFyZ2V0KCkuZXF1YWxzKGVwKSkgewotCQkJCQkJCVBvaW50IHNvdXJjZUVuZFBvaW50ID0gKChMaW5rKSBscC5nZXRNb2RlbCgpKQotCQkJCQkJCQkJLmdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCQkJCQkJc3AgPSBzcC5nZXRUcmFuc2xhdGVkKHNvdXJjZUVuZFBvaW50KTsKLQkJCQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIGlmIG5vdCBmb3VuZCBhYm92ZSwgY2hlY2sgaWYgaXQgaXMgY29ubmVjdGVkIHZpYSB0YXJnZXQgY29ubmVjdGlvbnMKLQkJCQkJaWYgKCFjb25uZWN0ZWQpIHsKLQkJCQkJCWxpc3QgPSAoKE5vZGVFZGl0UGFydCkgYWxpZ25Ub1BhcnQpCi0JCQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQlMaW5rRWRpdFBhcnQgbHAgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQlpZiAobHAuZ2V0U291cmNlKCkuZXF1YWxzKGVwKSkgewotCQkJCQkJCQlQb2ludCB0YXJnZXRFbmRQb2ludCA9ICgoTGluaykgbHAuZ2V0TW9kZWwoKSkKLQkJCQkJCQkJCQkuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQkJCQkJCQkJc3AgPSBzcC5nZXRUcmFuc2xhdGVkKHRhcmdldEVuZFBvaW50KTsKLQkJCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChlcCBpbnN0YW5jZW9mIFN5bmNoQmFyTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQlQb2ludCB0cCA9ICgoTm9kZSkgZXAuZ2V0TW9kZWwoKSkuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkuZ2V0Q29weSgpOwotCQkJCQkJUG9pbnQgYWxpZ25Ub0NlbnRlciA9IGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJUG9pbnQgY2VudGVyUG9pbnQgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQkJCQkJCWludCBkZWx0YSA9IGFsaWduVG9DZW50ZXIueCAtIGNlbnRlclBvaW50Lng7Ci0JCQkJCQl0cC54ID0gdHAueCArIGRlbHRhOwotCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKAotCQkJCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwgdHAsIGVwLmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJLmdldEJvdW5kcygpLndpZHRoKTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbihuZXcgUG9pbnQodHAueCwgdHAueSkpOwotCQkJCQl9IGVsc2UgaWYgKGVwIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQlQb2ludCB0cCA9ICgoTm9kZSkgZXAuZ2V0TW9kZWwoKSkuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkuZ2V0Q29weSgpOwotCQkJCQkJUG9pbnQgY2VudGVyUG9pbnQgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlpbnQgZGVsdGEgPSBzcC54IC0gY2VudGVyUG9pbnQueDsKLQkJCQkJCXRwLnggPSB0cC54ICsgZGVsdGE7Ci0JCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLCB0cCwgZXAuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkud2lkdGgpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWVwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKG5ldyBQb2ludCh0cC54LCB0cC55KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtRWRpdFBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNzQxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLkRpYWdyYW1MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuUm9vdENvbXBvbmVudEVkaXRQb2xpY3k7Ci0KLS8qKgotICogUHJvdmlkZXMgRWRpdFBhcnQgZm9yIERpYWdyYW0uIEhhbmRsZXMgdGhlIGJhc2ljIGxheW91dCBtZWNoYW5pc20KLSAqIGlmIHRoZSBjaGlsZHJlbiBsb2NhdGlvbiBpcyBub3Qgc2V0IGluIHRoZSBkaWFncmFtLiAgCi0gKiAgIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FZGl0UGFydCBleHRlbmRzIE5vZGVDb250YWluZXJFZGl0UGFydCB7Ci0KLQlQb2ludCBjYWNoZWRQb2ludCA9IG5ldyBQb2ludCgtMSwgLTEpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWc7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbWFya0RpcnR5ID0gZmFsc2U7Ci0KLQlzdGF0aWMgaW50IGNhY2hlZFdpZHRoID0gMTA7Ci0KLQlzdGF0aWMgaW50IGNhY2hlZEhlaWdodCA9IDEwOwotCi0JcHVibGljIERpYWdyYW1FZGl0UGFydChEaWFncmFtIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJZGVidWcgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUZpZ3VyZSBmID0gbmV3IEZyZWVmb3JtTGF5ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoKSB7Ci0JCQkJaWYgKGhhc01pc3BsYWNlZENoaWxkcmVuKCkpIHsKLQkJCQkJcmVzZXRDaGlsZHJlbkxvY2F0aW9ucygpOwotCQkJCX0KLQkJCQlzdXBlci5sYXlvdXQoKTsKLQkJCX0KLQotCQl9OwotCi0JCWYuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMjApKTsKLQkJZi5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGcmVlZm9ybUxheW91dCgpKTsKLQkJcmV0dXJuIGY7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRDaGlsZHJlbkxvY2F0aW9ucygpIHsKLQkJaW50IHkgPSAxMDsKLQkJZmluYWwgaW50IHNwYWNpbmcgPSA0MDsKLQkJaW50IG9jY3VwaWVkID0gMDsKLQkJaW50IHhlbGVtZW50cyA9IDA7Ci0JCWludCB4ID0gMTA7Ci0JCWJvb2xlYW4gbG9ja2VkID0gVG5nVXRpbC5pc0xvY2tlZCgoRU9iamVjdCkoKERpYWdyYW0pZ2V0TW9kZWwoKSkuZ2V0T2JqZWN0KCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkOwotCQkJCWludCB3aWR0aCA9IHBhcnQuZ2V0Um9vdCgpLmdldFZpZXdlcigpLmdldENvbnRyb2woKS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJCQlpZiAocGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgcGFydC5nZXRNb2RlbCgpOwotCQkJCQlQb2ludCBwID0gbm9kZS5nZXRMb2NhdGlvbigpLmdldENvcHkoKTsKLQkJCQkJaWYgKHAgPT0gbnVsbCB8fCBwLnggPT0gLTEpIHsKLQkJCQkJCWlmICh4ICsgcGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGggPiB3aWR0aCkgewotCQkJCQkJCXkgPSBjYWNoZWRQb2ludC55ICsgY2FjaGVkSGVpZ2h0ICsgc3BhY2luZzsKLQkJCQkJCQl4ZWxlbWVudHMgPSAwOwotCQkJCQkJCXggPSAxMDsKLQkJCQkJCQljYWNoZWRQb2ludC54ID0gLTE7Ci0JCQkJCQkJb2NjdXBpZWQgPSAwOwotCQkJCQkJfQotCQkJCQkJaWYgKGNhY2hlZFBvaW50LnggIT0gLTEpIHsKLQkJCQkJCQl4ID0gY2FjaGVkUG9pbnQueCArIGNhY2hlZFdpZHRoICsgc3BhY2luZzsKLQkJCQkJCX0KLQkJCQkJCSsreGVsZW1lbnRzOwotCQkJCQkJaWYgKHAgPT0gbnVsbCkgewotCQkJCQkJCXAgPSBuZXcgUG9pbnQoLTEsIC0xKTsKLQkJCQkJCX0KLQkJCQkJCXAueCA9IHg7Ci0JCQkJCQlwLnkgPSB5OwotCQkJCQkJLy9ub2RlLnNldExvY2F0aW9uKHApOwotCQkJCQkJLy9PbiBvcGVuaW5nIGEgQUQgZGlhZ3JhbSwgZWRpdG9yIHNob3VsZCBiZSBtYXJrZWQgZGlydHkuCi0JCQkJCQkvL0lmIGRpYWdyYW0gaXMgbm90IHNhdmVkLCBjYW5ub3QgYmUgYnJvd3NlZC4gRm9yY2luZyB0byBzYXZlIHRoZSBkaWFncmFtIG9uY2UuCi0JCQkJCQlpZiAoIWxvY2tlZCAmJiAoKERpYWdyYW0pIGdldE1vZGVsKCkpLmlzTmV3KCkKLQkJCQkJCQkJJiYgISgoRGlhZ3JhbSkgZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpCi0JCQkJCQkJCSYmIG1hcmtEaXJ0eSkgewotCQkJCQkJCUNoYW5nZUJvdW5kc0NvbW1hbmQgY2JjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQobm9kZSwgcCwgcGFydC5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoKTsKLQkJCQkJCQlnZXRWaWV3ZXIoKS5nZXRFZGl0RG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCkKLQkJCQkJCQkJCS5leGVjdXRlKGNiYyk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIElmIFBsdWdpbiBpcyBMb2NrZWQ6IERvIGF1dG8tbGF5b3V0IGFuZCBkb25vdAotCQkJCQkJCS8vIHNhdmUgdG8gbW9kZWwuCi0JCQkJCQkJbm9kZS5zZXRMb2NhdGlvbihwKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJY2FjaGVkUG9pbnQgPSBwOwotCQkJCQkJY2FjaGVkV2lkdGggPSBwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJCWNhY2hlZEhlaWdodCA9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJQb2ludCA6ICIgKyBuZXcgUG9pbnQoeCwgeSkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiQ2FjaGVkIDogd2lkdGg6ICIgKyBjYWNoZWRXaWR0aCArICIgSGVpZ2h0IDogIiArIGNhY2hlZEhlaWdodCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQkJb2NjdXBpZWQgKz0geDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGhhc01pc3BsYWNlZENoaWxkcmVuKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJCU9iamVjdCBtb2RlbCA9ICgoRWRpdFBhcnQpIGNoaWxkKS5nZXRNb2RlbCgpOwotCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIG1vZGVsOwotCQkJCQlQb2ludCBwID0gbm9kZS5nZXRMb2NhdGlvbigpOwotCQkJCQlpZiAocCA9PSBudWxsIHx8IHAueCA9PSAtMSl7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTVBPTkVOVF9ST0xFLAotCQkJCW5ldyBSb290Q29tcG9uZW50RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT05UQUlORVJfUk9MRSwKLQkJCQluZXcgRGlhZ3JhbUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVDb250YWluZXJFZGl0UGFydCNhZGRQYXJ0VG9FZGl0KENvbGxlY3Rpb24sCi0JICogICAgICBPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFydFRvRWRpdChDb2xsZWN0aW9uIHBhcnRzVG9FZGl0LCBPYmplY3Qgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpIHsKLQkJCU5vZGVDb250YWluZXJFZGl0UGFydCBlZGl0UGFydCA9IChOb2RlQ29udGFpbmVyRWRpdFBhcnQpIGZpbmRDaGlsZEJ5TW9kZWwobm9kZSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKE5vZGVDb250YWluZXIpIG5vZGUpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWVkaXRQYXJ0LmFkZFBhcnRUb0VkaXQocGFydHNUb0VkaXQsIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFBhcnRUb0VkaXQocGFydHNUb0VkaXQsIG5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTW92ZXMgY29tcGxldGUgZGlhZ3JhbSBjaGlsZHJlbiB0byBnaXZlbiBkZWx0YS4gCi0JICogQHBhcmFtIGludCAgKFgtYXhpcyBkZWx0YSkKLQkgKiBAcGFyYW0gaW50ICAoWS1heGlzIGRlbHRhKQotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmVGaWd1cmUoaW50IG1vdmVYLCBpbnQgbW92ZVkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkOwotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBwYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZShuZXcgUG9pbnQoYm91bmRzLnggKyBtb3ZlWCwKLQkJCQkJCWJvdW5kcy55ICsgbW92ZVkpLCBib3VuZHMuZ2V0U2l6ZSgpKTsKLQotCQkJCS8vIGFsc28gbmVlZCB0byBtb3ZlIHRoZSBiZW5kIHBvaW50cwotCQkJCUxpc3QgbGlzdCA9IHBhcnQuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQlMaW5rRWRpdFBhcnQgbGlua3BhcnQgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJTGluayBsaW5rID0gKExpbmspIGxpbmtwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCWlmIChsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJCQlQb2ludExpc3QgcGxpc3QgPSAoKFBvbHlsaW5lQ29ubmVjdGlvbikgbGlua3BhcnQKLQkJCQkJCQkJLmdldEZpZ3VyZSgpKS5nZXRQb2ludHMoKTsKLQkJCQkJCUxpc3QgcG9pbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBwbGlzdC5zaXplKCkgLSAxOyBpKyspIHsKLQkJCQkJCQlQb2ludCBwID0gcGxpc3QuZ2V0UG9pbnQoaSk7Ci0JCQkJCQkJcCA9IHAudHJhbnNsYXRlKG5ldyBQb2ludChtb3ZlWCwgbW92ZVkpKTsKLQotCQkJCQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCBicCA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQoCi0JCQkJCQkJCQlwKTsKLQkJCQkJCQlwb2ludHMuYWRkKGJwKTsKLQkJCQkJCX0KLQotCQkJCQkJbGlua3BhcnQuZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpLnNldFJvdXRpbmdDb25zdHJhaW50KAotCQkJCQkJCQlwb2ludHMpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJdGhpcy5zZXRMYXlvdXRDb25zdHJhaW50KHBhcnQsIHBhcnQuZ2V0RmlndXJlKCksIHIpOwotCi0JCQl9IGVsc2UgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUGFydCBub3QgbW92ZWQ6ICIgKyBjaGlsZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JfQotCS8qKgotCSAqIE9uIG9wZW5pbmcgYSBkaWFncmFtLCBlZGl0b3Igc2hvdWxkIGJlIG1hcmtlZCBkaXJ0eS4KLQkgKiBJbnZva2VyIG9mIERpYWdyYW1FZGl0UGFydCBzaG91bGQgZXhwbGljaXRseSBzZXQgdGhlIGZsYWcgdG8gbWFyayBlZGl0b3IgZGlydHkKLQkgKiBvciBub3QuIFdpdGhvdSBoYW5kbGluZyB0aGlzIHdpbGwgY2F1c2UgYnJvd3NpbmcgcGVyc3BlY3RpdmUgaW4gY29uc2lzdGVudC4gICAgCi0JICogRm9yIGRlZmVjdDogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjAyOQotCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtEaXJ0eShib29sZWFuIG1hcmtEaXJ0eSl7Ci0JCXRoaXMubWFya0RpcnR5ICA9IG1hcmtEaXJ0eTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1VcGRhdGVTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbVVwZGF0ZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTA3OGE0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbVVwZGF0ZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8qKgotICogU2VydmljZSBjbGFzcyB0byBhbGxvdyB1cGRhdGluZyBkaWFncmFtIHRvIGEgZGVmYXVsdCBsYXlvdXQuIE1vc3Qgb2YgdGhlIGNvZGUKLSAqIGFyZSBtb3ZlZCBmcm9tIHRoZSBFZGl0b3IgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVXBkYXRlU2VydmljZSB7Ci0KLQlwcml2YXRlIERlZmF1bHRFZGl0RG9tYWluIGVkaXREb21haW47Ci0KLQlwcml2YXRlIEdyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXI7Ci0KLQlwcml2YXRlIEFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5OwotCi0JcHVibGljIERpYWdyYW1VcGRhdGVTZXJ2aWNlKAotCQkJR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlciwgRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbiwKLQkJCUFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5KSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCQl0aGlzLmVkaXREb21haW4gPSBlZGl0RG9tYWluOwotCQl0aGlzLmFjdGlvblJlZ2lzdHJ5ID0gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHJldHVybiB0aGUgY29tbWFuZCBzdGFjawotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXQgZG9tYWluLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXQgZG9tYWluCi0JICovCi0JcHJvdGVjdGVkIERlZmF1bHRFZGl0RG9tYWluIGdldEVkaXREb21haW4oKSB7Ci0JCXJldHVybiBlZGl0RG9tYWluOwotCX0KLQotCS8qKgotCSAqIExhemlseSBjcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBhY3Rpb24gcmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiB0aGUgYWN0aW9uIHJlZ2lzdHJ5Ci0JICovCi0JcHJvdGVjdGVkIEFjdGlvblJlZ2lzdHJ5IGdldEFjdGlvblJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHVzZWQgb25seSBpbiBBY3Rpdml0eURldGFpbERpYWdyYW0gb3IgYW55IGRpYWdyYW0gbmVlZCBhdXRvLWxheW91dC4KLQkgKiBNZXRob2Qgd2lsbCB2ZXJpZnkgcmVjZW50bHkgYWRkZWQgZWRpdHBhcnRzIGluIHRoZSBBY3Rpdml0eWRldGFpbGRpYWdyYW0gZWRpdHBhcnQKLQkgKiBpbmRpcmVjdGx5IGZyb20gV29ya0JyZWFrZG93blN0cnVjdHVyZSAobWVhbnMgYW55IGRlc2NyaXB0b3JzIGNyZWF0ZWQgaW4gd2JzLCBjb3JyZXNwb25kaW5nCi0JICogRWRpdFBhcnQgd2lsbCBnZXQgY3JlYXRlZCBpbiBBY3Rpdml0eURldGFpbERpYWdyYW0gVmlld2VyKSBhbmQgZG9lcyBhdXRvLWxheW91dAotCSAqIGFsbCB0aGUgbmV3IGFkZGVkIGVkaXRwYXJ0cyBhbmQgZXhpc3Rpbmcgb25lcy4gCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcERpYWdyYW0oKSB7Ci0JCWlmIChnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRDb250ZW50cygpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIHsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRlcCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJLmdldENvbnRlbnRzKCk7Ci0JCQlMaXN0IGNoaWxkcmVuID0gZGVwLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpOwotCQkJaWYgKCFjaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQotCQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0JCQkJCQlpbnQgcmMgPSAwOwotCQkJCQkJaWYgKGFyZzAgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJCQkJaWYgKCEoYXJnMSBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpKQotCQkJCQkJCQlyYyA9IC0xOwotCQkJCQkJfSBlbHNlIGlmIChhcmcxIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkKLQkJCQkJCQlyYyA9IDE7Ci0JCQkJCQlyZXR1cm4gcmM7Ci0JCQkJCX0KLQotCQkJCX07Ci0KLQkJCQlPYmplY3RbXSBhcnJheSA9IGNoaWxkcmVuLnRvQXJyYXkoKTsKLQkJCQlBcnJheXMuc29ydChhcnJheSwgY29tcGFyYXRvcik7Ci0JCQkJZm9yIChpbnQgYSA9IDA7IGEgPCBhcnJheS5sZW5ndGg7IGErKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGFycmF5W2FdOwotCQkJCQlhZGp1c3RTaXplKGVwKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgYiA9IDA7IGIgPCBhcnJheS5sZW5ndGg7IGIrKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGFycmF5W2JdOwotCQkJCQljbGVhblVwKGVwKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgYyA9IDA7IGMgPCBhcnJheS5sZW5ndGg7IGMrKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGFycmF5W2NdOwotCQkJCQlyZWR1Y2VMaW5rTGVuZ3RoKGVwKTsKLQkJCQl9Ci0vLwkJCQlmb3IgKGludCBjID0gMDsgYyA8IGFycmF5Lmxlbmd0aDsgYysrKSB7Ci0vLwkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBhcnJheVtjXTsKLS8vCQkJCQlpZihlcCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpewotLy8JCQkJCQlyZXNldFNpemVzKGVwLCBlcCk7Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCXBhY2tEaWFncmFtKCk7Ci0JCQkJZGVwLmNsZWFyUmVjZW50bHlBZGRlZFBhcnRzKCk7Ci0JCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQlwcml2YXRlIHZvaWQgcmVzZXRTaXplcyhBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwLCBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHBhcmVudCkgewotCQlpZiAoIShlcCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpKSB7Ci0JCQlMaXN0IHNvdXJjZUxpbmtzID0gZXAuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCWlmIChzb3VyY2VMaW5rcy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChpbnQgYiA9IDA7IGIgPCBzb3VyY2VMaW5rcy5zaXplKCk7IGIrKykgewotCQkJCQlMaW5rRWRpdFBhcnQgbGluayA9IChMaW5rRWRpdFBhcnQpIHNvdXJjZUxpbmtzLmdldChiKTsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCB0YXJnZXQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgbGluawotCQkJCQkJCS5nZXRUYXJnZXQoKTsKLQkJCQkJaW50IHcgPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJCWludCBldyA9IGVwLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJaWYgKHcgPiBldykgewotCQkJCQkJUG9pbnQgbG9jYXRpb24gPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJLmdldExvY2F0aW9uKCk7Ci0JCQkJCQlsb2NhdGlvbi54Kz0ody1ldykvMjsKLQkJCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKCgoTm9kZSkgZXAKLQkJCQkJCQkJLmdldE1vZGVsKCkpLCBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSwgdyk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJaW50IGggPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJZXAuZ2V0RmlndXJlKCkKLQkJCQkJCQkJLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQl9Ci0JCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLnNldFNlbGVjdGlvbigKLQkJCQkJCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IGVwLAotCQkJCQkJCQkJCQl0YXJnZXQgfSkpOwotCQkJCQlJQWN0aW9uIHZhbGlnbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQpOwotCQkJCQl2YWxpZ24ucnVuKCk7Ci0JCQkJfQotCQkJfQotCQkJTGlzdCB0YXJnZXRMaW5rcyA9IGVwLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQlpZiAodGFyZ2V0TGlua3Muc2l6ZSgpID4gMCkgewotCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgdGFyZ2V0TGlua3Muc2l6ZSgpOyBiKyspIHsKLQkJCQkJTGlua0VkaXRQYXJ0IGxpbmsgPSAoTGlua0VkaXRQYXJ0KSB0YXJnZXRMaW5rcy5nZXQoYik7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgc291cmNlID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGxpbmsKLQkJCQkJCQkuZ2V0U291cmNlKCk7Ci0JCQkJCWludCB3ID0gc291cmNlLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCQlpbnQgZXcgPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCWlmICh3ID4gZXcpIHsKLQkJCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKCgoTm9kZSkgZXAKLQkJCQkJCQkJLmdldE1vZGVsKCkpLCBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSwgdyk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJaW50IGggPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJZXAuZ2V0RmlndXJlKCkKLQkJCQkJCQkJLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQl9Ci0JCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLnNldFNlbGVjdGlvbigKLQkJCQkJCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IGVwLAotCQkJCQkJCQkJCQlzb3VyY2UgfSkpOwotCQkJCQlJQWN0aW9uIHZhbGlnbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQpOwotCQkJCQl2YWxpZ24ucnVuKCk7Ci0JCQkJfQotCQkJfQotCQkJcGFyZW50LmdldEZpZ3VyZSgpLmdldExheW91dE1hbmFnZXIoKS5sYXlvdXQocGFyZW50LmdldEZpZ3VyZSgpKTsKLQkJCWlmIChlcCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUxpc3QgY2hpbGRyZW4gPSBlcC5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGQgPSAwOyBkIDwgY2hpbGRyZW4uc2l6ZSgpOyBkKyspIHsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuCi0JCQkJCQkJLmdldChkKTsKLQkJCQkJcmVzZXRTaXplcyhwLCBlcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCSovCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIGEgdmVydGljYWwgYWxpZ25tZW50IG9mIGFsbCBub2RlcyB3aXRoIGxpbmtzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFuVXAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCkgewotCQlpZiAoIShlcCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpKSB7Ci0JCQlMaXN0IHNvdXJjZUxpbmtzID0gZXAuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCWlmIChzb3VyY2VMaW5rcy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChpbnQgYiA9IDA7IGIgPCBzb3VyY2VMaW5rcy5zaXplKCk7IGIrKykgewotCQkJCQlMaW5rRWRpdFBhcnQgbGluayA9IChMaW5rRWRpdFBhcnQpIHNvdXJjZUxpbmtzLmdldChiKTsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCB0YXJnZXQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgbGluawotCQkJCQkJCS5nZXRUYXJnZXQoKTsKLQkJCQkJaW50IHcgPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJCWludCBldyA9IGVwLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJaWYgKHcgPCBldykgewotCQkJCQkJQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKChOb2RlKSBlcAotCQkJCQkJCQkuZ2V0TW9kZWwoKSksIHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSwgdyk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJaW50IGggPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCXRhcmdldC5nZXRGaWd1cmUoKQotCQkJCQkJCQkuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJCXRhcmdldC5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQl9Ci0JCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLnNldFNlbGVjdGlvbigKLQkJCQkJCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IGVwLAotCQkJCQkJCQkJCQl0YXJnZXQgfSkpOwotCQkJCQlJQWN0aW9uIHZhbGlnbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQpOwotCQkJCQl2YWxpZ24ucnVuKCk7Ci0JCQkJfQotCQkJfQotCQkJTGlzdCB0YXJnZXRMaW5rcyA9IGVwLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQlpZiAodGFyZ2V0TGlua3Muc2l6ZSgpID4gMCkgewotCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgdGFyZ2V0TGlua3Muc2l6ZSgpOyBiKyspIHsKLQkJCQkJTGlua0VkaXRQYXJ0IGxpbmsgPSAoTGlua0VkaXRQYXJ0KSB0YXJnZXRMaW5rcy5nZXQoYik7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgc291cmNlID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGxpbmsKLQkJCQkJCQkuZ2V0U291cmNlKCk7Ci0JCQkJCWludCB3ID0gc291cmNlLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCQlpbnQgZXcgPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCWlmICh3IDwgZXcpIHsKLQkJCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKCgoTm9kZSkgZXAKLQkJCQkJCQkJLmdldE1vZGVsKCkpLCBzb3VyY2UuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkJLmdldExvY2F0aW9uKCksIHcpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWludCBoID0gc291cmNlLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQlzb3VyY2UuZ2V0RmlndXJlKCkKLQkJCQkJCQkJLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCQlzb3VyY2UuZ2V0RmlndXJlKCkuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJfQotCQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCS5zZXRTZWxlY3Rpb24oCi0JCQkJCQkJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10geyBlcCwKLQkJCQkJCQkJCQkJc291cmNlIH0pKTsKLQkJCQkJSUFjdGlvbiB2YWxpZ24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJCQlEaWFncmFtQWN0aW9uU2VydmljZS5BTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEKTsKLQkJCQkJdmFsaWduLnJ1bigpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChlcCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUxpc3QgY2hpbGRyZW4gPSBlcC5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGQgPSAwOyBkIDwgY2hpbGRyZW4uc2l6ZSgpOyBkKyspIHsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuCi0JCQkJCQkJLmdldChkKTsKLQkJCQkJY2xlYW5VcChwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgRm9yIGF1dG8tbGF5b3V0LCBuZWVkIHRvIGFkanVzdCBjb25uZWN0aW9uKG9yIGxpbmspIGxlbmd0aCwgYmFzZWQgb24KLQkgKiAgY29ubmVjdGluZyBlZGl0cGFydHMoZmlndXJlcykuCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHJlZHVjZUxpbmtMZW5ndGgoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwYXJ0KSB7Ci0JCWJvb2xlYW4gbW92ZWQgPSBmYWxzZTsKLQkJLy8gb25seSBtb3ZlIG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZSBlbGVtZW50cwotCQlpZiAocGFydCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgbGlua2VkUGFydCA9IG51bGw7Ci0JCQlpbnQgcG9zaXRpb24gPSBQb3NpdGlvbkNvbnN0YW50cy5DRU5URVI7Ci0JCQkvLyBpcyB0aGlzIGVsZW1lbnQgbGlua2VkIHRvIGFub3RoZXIgaXRlbT8KLQkJCWlmIChwYXJ0LmdldFRhcmdldENvbm5lY3Rpb25zKCkuc2l6ZSgpID4gMCkgewotCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChMaW5rRWRpdFBhcnQpIHBhcnQKLQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpLmdldCgwKSkuZ2V0U291cmNlKCk7Ci0JCQkJcG9zaXRpb24gPSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSDsKLQkJCX0gZWxzZSBpZiAocGFydC5nZXRTb3VyY2VDb25uZWN0aW9ucygpLnNpemUoKSA+IDApIHsKLQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpICgoTGlua0VkaXRQYXJ0KSBwYXJ0Ci0JCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5nZXQoMCkpLmdldFRhcmdldCgpOwotCQkJCXBvc2l0aW9uID0gUG9zaXRpb25Db25zdGFudHMuU09VVEg7Ci0JCQl9Ci0JCQlpZiAobGlua2VkUGFydCAhPSBudWxsKSB7Ci0JCQkJaWYgKCEobGlua2VkUGFydC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rZWRQYXJ0Ci0JCQkJCQkJLmdldFBhcmVudCgpOwotCQkJCX0KLQkJCQkvLyBnZXQgdGhlIHBhcnQncyBwb3NpdGlvbgotCQkJCVJlY3RhbmdsZSBwYXJ0Qm91bmRzID0gcGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkvLyBnZXQgdGhlIGxpbmtlZCBwYXJ0J3MgcG9zaXRpb24KLQkJCQlSZWN0YW5nbGUgbGlua2VkUGFydEJvdW5kcyA9IGxpbmtlZFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJLy8gZGV0ZXJtaW5lIGluIHdoaWNoIGRpcmVjdGlvbiBpcyB0aGUgbGlua2VkIHBhcnQKLQkJCQkvLyBpbnQgcG9zaXRpb24gPSBwYXJ0Qm91bmRzLmdldFBvc2l0aW9uKGxpbmtlZFBhcnRCb3VuZHMKLQkJCQkvLyAuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJLy8gYXNzdW1lIGl0IGlzIGJlbG93IHVzLCBzbyB0aGlzIHBhcnQgbW92ZXMgdXAKLQkJCQlpbnQgZGlyZWN0aW9uID0gLTE7Ci0JCQkJaWYgKChwb3NpdGlvbiAmIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKSA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSAotCQkJCQkJfHwgKHBvc2l0aW9uICYgUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKSA9PSBQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpIHsKLQkJCQkJLy8gYWJvdmUgdXMsIG1vdmUgZG93bgotCQkJCQlkaXJlY3Rpb24gPSAxOwotCQkJCX0KLQkJCQkvLyBzZXQgbmV3IGJvdW5kcyBmb3IgdGhlIHBhcnQgc28gdGhhdCBpdCBzaXRlcyBqdXN0IG91dHNpZGUgb2YKLQkJCQkvLyB0aGUgbGlua2VkIHBhcnQKLQkJCQlSZWN0YW5nbGUgdGVzdEJvdW5kcyA9IHBhcnRCb3VuZHMuZ2V0Q29weSgpOwotCQkJCWlmIChkaXJlY3Rpb24gPT0gMSkgewotCQkJCQl0ZXN0Qm91bmRzLnkgPSBsaW5rZWRQYXJ0Qm91bmRzLnkgKyBsaW5rZWRQYXJ0Qm91bmRzLmhlaWdodAotCQkJCQkJCSsgVkVSVF9QSVhfUEFERElORzsKLQkJCQl9IGVsc2UgewotCQkJCQl0ZXN0Qm91bmRzLnkgPSBsaW5rZWRQYXJ0Qm91bmRzLnkgLSBWRVJUX1BJWF9QQURESU5HCi0JCQkJCQkJLSBwYXJ0Qm91bmRzLmhlaWdodDsKLQkJCQl9Ci0JCQkJLy8gc2V0IHRoZSBuZXcgbG9jYXRpb24gZm9yIHRoZSBwYXJ0IGluIHRoZSBtb2RlbAotCQkJCVBvaW50IG5wID0gbmV3IFBvaW50KHRlc3RCb3VuZHMueCwgdGVzdEJvdW5kcy55KTsKLQkJCQlwYXJ0LmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKG5wKTsKLQkJCQlDb21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgoTm9kZSkgcGFydC5nZXRNb2RlbCgpLCBucCwKLQkJCQkJCXBhcnRCb3VuZHMud2lkdGgpOwotCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vdmVkOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBhZGp1c3QgdGhlIHNpemUgb2YgZWRpdHBhcnQuICAKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRqdXN0U2l6ZShBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwKSB7Ci0JCWlmIChlcCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCWFkanVzdFNpemUoKE5vZGVDb250YWluZXJFZGl0UGFydCkgZXAsIDEpOwotCQl9Ci0JCS8vIEJlbG93IENvZGUgZ2VuZXJpYyBOb2RlQ29udGFpbmVyRWRpdFBhcnQgbW9kaWZpY2F0aW9uLgotCQllbHNlIGlmIChlcCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJLy8gVGhpcyBpcyB0byBhbGxvdyB1c2VyIGN1c3RvbWl6YWJsZSAKLS8vCQkJU3RyaW5nIGNvdW50ID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0vLwkJCQkJCQkuZ2V0U3RyaW5nKFRlbXBsYXRlQ29uc3RhbnRzLkFERF9ST0xFX1RBU0tTX0NPVU5UKTsKLS8vCQkJaWYoY291bnQgIT0gbnVsbCB8fCBjb3VudCAhPSAiIil7Ci0vLwkJCQlpbnQgaSA9IEludGVnZXIucGFyc2VJbnQoY291bnQpOwotLy8JCQkJaWYoaSA+IDApewotLy8JCQkJCWFkanVzdFNpemUoKE5vZGVDb250YWluZXJFZGl0UGFydCkgZXAsIGkpOwotLy8JCQkJfQotLy8JCQl9ZWxzZXsKLS8vCQkJCWFkanVzdFNpemUoKE5vZGVDb250YWluZXJFZGl0UGFydCkgZXAsIDUwKTsKLS8vCQkJfQotCQkJYWRqdXN0U2l6ZSgoTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSBlcCwgNTApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgSE9SSVpfUElYX1BBRERJTkcgPSAzMDsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFZFUlRfUElYX1BBRERJTkcgPSAyMDsKLQotCS8qKgotCSAqIEFkanVzdHMgdGhlIHNpemUgb2YgQ29udGFpbmVyRWRpdFBhcnQgdG8gYWNjb21vZGF0ZSBudW1iZXIgb2YgZWRpdHBhcnRzIGluIGEgcm93LAotCSAqIHB1c2ggdGhlIHJlbWFpbmluZyB0aGUgZWRpdHBhcnRzIGluIHR3byBzZWNvbmQgcm93LiAKLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3Ige0BsaW5rIFRvb2xiYXJMYXlvdXR9Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkanVzdFNpemUoTm9kZUNvbnRhaW5lckVkaXRQYXJ0IGVwLCBpbnQgaG9yaXpDb3VudCkgewotCQlpbnQgcmVxdWlyZWRXaWR0aCA9IDA7Ci0JCWludCByb3dNYXhIZWlnaHQgPSAwOwotCQlpbnQgcm93cyA9IDA7Ci0JCWludCB3aWR0aFN1bSA9IDA7Ci0JCWludCBoZWlnaHRTdW0gPSAwOwotCQlpbnQgY29sdW1uID0gMDsKLQkJLy9pbnQgb3JpZ2luYWxXaWR0aCA9IGVwLmdldEZpZ3VyZSgpLmdldFNpemUoKS53aWR0aDsKLQkJTGlzdCBjaGlsZHJlbiA9IGVwLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IHAgPSAwOyBwIDwgY2hpbGRyZW4uc2l6ZSgpOykgewotCQkJaWYgKGNvbHVtbiA9PSAwKSB7Ci0JCQkJcm93cysrOwotCQkJfQotCQkJaWYgKGNvbHVtbiA8IGhvcml6Q291bnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuCi0JCQkJCQkuZ2V0KHApOwotCQkJCURpbWVuc2lvbiBkID0gY2hpbGQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCQkJCXdpZHRoU3VtICs9IGQud2lkdGg7Ci0JCQkJaWYgKGQuaGVpZ2h0ID4gcm93TWF4SGVpZ2h0KSB7Ci0JCQkJCXJvd01heEhlaWdodCA9IGQuaGVpZ2h0OwotCQkJCX0KLQkJCQlwKys7Ci0JCQkJY29sdW1uKys7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3aWR0aFN1bSA+IHJlcXVpcmVkV2lkdGgpIHsKLQkJCQkJcmVxdWlyZWRXaWR0aCA9IHdpZHRoU3VtOwotCQkJCX0KLQkJCQloZWlnaHRTdW0gKz0gcm93TWF4SGVpZ2h0OwotCQkJCXJvd01heEhlaWdodCA9IDA7Ci0JCQkJd2lkdGhTdW0gPSAwOwotCQkJCWNvbHVtbiA9IDA7Ci0JCQl9Ci0JCX0KLQkJaWYgKHdpZHRoU3VtID4gcmVxdWlyZWRXaWR0aCkgewotCQkJcmVxdWlyZWRXaWR0aCA9IHdpZHRoU3VtOwotCQl9Ci0JCWhlaWdodFN1bSArPSByb3dNYXhIZWlnaHQ7Ci0JCXJlcXVpcmVkV2lkdGggKz0gSE9SSVpfUElYX1BBRERJTkcKLQkJCQkqIE1hdGgubWluKGhvcml6Q291bnQsIGNoaWxkcmVuLnNpemUoKSk7Ci0JCWludCByZXF1aXJlZEhlaWdodCA9IGhlaWdodFN1bSArIChWRVJUX1BJWF9QQURESU5HICogcm93cyk7Ci0JCUNvbW1hbmQgY21kID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKChOb2RlKSBlcC5nZXRNb2RlbCgpKSwgZXAKLQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKSwgcmVxdWlyZWRXaWR0aCk7Ci0JCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY21kKTsKLQkJZXAuZ2V0RmlndXJlKCkuc2V0UHJlZmVycmVkU2l6ZSgKLQkJCQluZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0KSk7Ci0JCSgoTm9kZSkgZXAuZ2V0TW9kZWwoKSkuc2V0SGVpZ2h0KHJlcXVpcmVkSGVpZ2h0KTsKLQkJZXAuZ2V0RmlndXJlKCkuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0KSk7Ci0JCQllcC5nZXRGaWd1cmUoKS5nZXRMYXlvdXRNYW5hZ2VyKCkubGF5b3V0KGVwLmdldEZpZ3VyZSgpKTsKLQkJLy8gYWZ0ZXIgbGF5b3V0LCBjaGVjayB0aGUgYm90dG9tLW1vc3QgY2hpbGQgZmlndXJlIGFnYWluc3QgdGhlIGJvdHRvbQotCQkvLyBvZiB0aGUgY29udGFpbmVyLCBhZGp1c3QgdGhlIGJvdHRvbSBvZiB0aGUgY29udGFpbmVyIGlzIG5lY2Vzc2FyeQotCQlpZiAoZXAgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0ICYmIGNoaWxkcmVuLnNpemUoKSA+IDApIHsKLQkJCUdyYXBoaWNhbEVkaXRQYXJ0IGxhc3QgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuLmdldChjaGlsZHJlbgotCQkJCQkuc2l6ZSgpIC0gMSk7Ci0JCQlQb2ludCBjaGlsZEJvdHRvbSA9IGxhc3QuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Qm90dG9tKCk7Ci0JCQlQb2ludCBwYXJlbnRCb3R0b20gPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRCb3R0b20oKTsKLQkJCWludCBkZWx0YSA9IHBhcmVudEJvdHRvbS55IC0gY2hpbGRCb3R0b20ueSAtIChWRVJUX1BJWF9QQURESU5HIC8gMik7Ci0JCQllcC5nZXRGaWd1cmUoKS5zZXRQcmVmZXJyZWRTaXplKAotCQkJCQluZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0IC0gZGVsdGEpKTsKLQkJCSgoTm9kZSkgZXAuZ2V0TW9kZWwoKSkuc2V0SGVpZ2h0KHJlcXVpcmVkSGVpZ2h0IC0gZGVsdGEpOwotCQkJZXAuZ2V0RmlndXJlKCkuc2V0U2l6ZSgKLQkJCQkJbmV3IERpbWVuc2lvbihyZXF1aXJlZFdpZHRoLCByZXF1aXJlZEhlaWdodCAtIGRlbHRhKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQsCi0JCQlMaXN0IGNvbm5lY3RlZCkgewotCQkvLyBvbmx5IGFkZCBwYXJ0cyBkaXJlY3RseSBvbiB0aGUgZGlhZ3JhbSBzdXJmYWNlCi0JCWlmICghY29ubmVjdGVkLmNvbnRhaW5zKHBhcnQpKSB7Ci0JCQlpZiAoIShwYXJ0LmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCWlmICghY29ubmVjdGVkLmNvbnRhaW5zKHBhcnQuZ2V0UGFyZW50KCkpKSB7Ci0JCQkJCWNvbm5lY3RlZC5hZGQocGFydC5nZXRQYXJlbnQoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQljb25uZWN0ZWQuYWRkKHBhcnQpOwotCQkJfQotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBsaW5rZWRQYXJ0ID0gbnVsbDsKLQkJCUxpc3QgY2hpbGRyZW4gPSBwYXJ0LmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IGNoaWxkcmVuLnNpemUoKTsgeCsrKSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuCi0JCQkJCQkuZ2V0KHgpOwotCQkJCWVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKHAsIGNvbm5lY3RlZCk7Ci0JCQl9Ci0JCQkvLyBpcyB0aGlzIGVsZW1lbnQgbGlua2VkIHRvIGFub3RoZXIgaXRlbT8KLQkJCWZvciAoaW50IHggPSAwOyB4IDwgcGFydC5nZXRUYXJnZXRDb25uZWN0aW9ucygpLnNpemUoKTsgeCsrKSB7Ci0JCQkJbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSAoKExpbmtFZGl0UGFydCkgcGFydAotCQkJCQkJLmdldFRhcmdldENvbm5lY3Rpb25zKCkuZ2V0KHgpKS5nZXRTb3VyY2UoKTsKLQkJCQllbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhsaW5rZWRQYXJ0LCBjb25uZWN0ZWQpOwotCQkJfQotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYXJ0LmdldFNvdXJjZUNvbm5lY3Rpb25zKCkuc2l6ZSgpOyB4KyspIHsKLQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpICgoTGlua0VkaXRQYXJ0KSBwYXJ0Ci0JCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5nZXQoeCkpLmdldFRhcmdldCgpOwotCQkJCWVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKGxpbmtlZFBhcnQsIGNvbm5lY3RlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBmaW5kcyBzaW5nbGUgZWxlbWVudHMgYW5kIGdyb3VwcyBvZiBlbGVtZW50cywgYW5kIHBvc2l0aW9ucwotCSAqIHRoZW0gc3RhcnRpbmcgZnJvbSB0aGUgdG9wIG9mIHRoZSBkaWFncmFtIGFuZCBjb250aW51b3VzbHkgZG93biB0aGUgcGFnZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFja0RpYWdyYW0oKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJLmdldENvbnRlbnRzKCk7Ci0JCS8vIHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIGRpYWdyYW0KLQkJLy8gRGltZW5zaW9uIGRpYWdyYW1TaXplID0gZGlhZ3JhbS5nZXRGaWd1cmUoKS5nZXRTaXplKCk7Ci0JCS8vIG5vIG5ldyBzaGFwZXMgY2FuIGJlIG1vdmVkIGFib3ZlIHRoaXMgeS1heGlzIHZhbHVlCi0JCWludCByZXNlcnZlZCA9IDA7Ci0JCS8vIHRoZXNlIGFyZSBlbGVtZW50cyB3aXRob3V0IGNvbm5lY3Rpb25zCi0JCUxpc3Qgc3RyYWdnbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gdGhlc2UgYXJlIGdyb3VwcyBvZiBlbGVtZW50cyBjb25uZWN0ZWQgd2l0aCBsaW5rcwotCQlMaXN0IGdyb3VwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gdGhlc2UgYXJlIHRvcCBsZXZlbCBwYXJ0cyBvbiB0aGUgZGlhZ3JhbSB0aGF0IGhhdmUgYmVlbiBhZGRlZAotCQlMaXN0IGRpYWdyYW1QYXJ0cyA9IGRpYWdyYW0uZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCk7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgZGlhZ3JhbVBhcnRzLnNpemUoKTsgeCsrKSB7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZGlhZ3JhbVBhcnRzCi0JCQkJCS5nZXQoeCk7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBnID0gMDsgZyA8IGdyb3Vwcy5zaXplKCkgJiYgZm91bmQgPT0gZmFsc2U7IGcrKykgewotCQkJCUxpc3QgZ3JvdXAgPSAoTGlzdCkgZ3JvdXBzLmdldChnKTsKLQkJCQlpZiAoZ3JvdXAuY29udGFpbnMocCkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJTGlzdCBjb25uZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZW51bWVyYXRlQ29ubmVjdGVkUGFydHMocCwgY29ubmVjdGVkKTsKLQkJCQlpZiAoY29ubmVjdGVkLnNpemUoKSA9PSAxKSB7Ci0JCQkJCXN0cmFnZ2xlcnMuYWRkKHApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWdyb3Vwcy5hZGQoY29ubmVjdGVkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gcHJvY2VzcyBlYWNoIGdyb3VwIGNsb3Nlc3QgdG8gdGhlIHRvcCAobWluIHkgdmFsdWUpCi0JCXdoaWxlIChncm91cHMuc2l6ZSgpID4gMCkgewotCQkJTGlzdCB0b3AgPSAoTGlzdCkgZ3JvdXBzLmdldCgwKTsKLQkJCWludCB0b3BZID0gZ2V0VmVydGljYWxNaW5QYXJ0KHRvcCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueTsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgZ3JvdXBzLnNpemUoKTsgeCsrKSB7Ci0JCQkJTGlzdCBnID0gKExpc3QpIGdyb3Vwcy5nZXQoeCk7Ci0JCQkJaW50IHkgPSBnZXRWZXJ0aWNhbE1pblBhcnQoZykuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueTsKLQkJCQlpZiAoeSA8IHRvcFkpIHsKLQkJCQkJdG9wID0gZzsKLQkJCQkJdG9wWSA9IHk7Ci0JCQkJfQotCQkJfQotCQkJaW50IGxpbWl0ID0gcmVzZXJ2ZWQgKyAxOwotCQkJaW50IHZlcnRpY2FsRGVsdGEgPSBsaW1pdCAtIHRvcFk7Ci0JCQlpbnQgbGVmdFggPSBnZXRIb3Jpem9udGFsTWluUGFydCh0b3ApLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLng7Ci0JCQlpbnQgaG9yaXpvbnRhbERlbHRhID0gSE9SSVpfUElYX1BBRERJTkcgLSBsZWZ0WDsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgdG9wLnNpemUoKTsgeCsrKSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHRvcAotCQkJCQkJLmdldCh4KTsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQlDaGFuZ2VCb3VuZHNDb21tYW5kIGNiYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKChOb2RlKSBwCi0JCQkJCQkuZ2V0TW9kZWwoKSwgbmV3IFBvaW50KGJvdW5kcy54ICsgaG9yaXpvbnRhbERlbHRhLAotCQkJCQkJYm91bmRzLnkgKyB2ZXJ0aWNhbERlbHRhKSwgYm91bmRzLndpZHRoKTsKLQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNiYyk7Ci0JCQkJcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbigKLQkJCQkJCW5ldyBQb2ludChib3VuZHMueCArIGhvcml6b250YWxEZWx0YSwgYm91bmRzLnkKLQkJCQkJCQkJKyB2ZXJ0aWNhbERlbHRhKSk7Ci0JCQl9Ci0JCQlpbnQgYm90dG9tWSA9IGdldFZlcnRpY2FsTWF4UGFydCh0b3ApLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCS5ib3R0b20oKTsKLQkJCXJlc2VydmVkID0gYm90dG9tWSArIChWRVJUX1BJWF9QQURESU5HICogMik7Ci0JCQlncm91cHMucmVtb3ZlKHRvcCk7Ci0JCX0KLQkJaW50IG5leHQgPSBIT1JJWl9QSVhfUEFERElORzsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBzdHJhZ2dsZXJzLnNpemUoKTsgeCsrKSB7Ci0JCQlpbnQgbGltaXQgPSByZXNlcnZlZCArIDE7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgc3RyYWdnbGVycwotCQkJCQkuZ2V0KHgpOwotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQlDaGFuZ2VCb3VuZHNDb21tYW5kIGNiYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKChOb2RlKSBwCi0JCQkJCS5nZXRNb2RlbCgpLCBuZXcgUG9pbnQobmV4dCwgbGltaXQpLCBib3VuZHMud2lkdGgpOwotCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjYmMpOwotCQkJcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbihuZXcgUG9pbnQobmV4dCwgbGltaXQpKTsKLQkJCW5leHQgKz0gYm91bmRzLndpZHRoICsgSE9SSVpfUElYX1BBRERJTkc7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZ2V0VmVydGljYWxNaW5QYXJ0KExpc3QgcGFydHMpIHsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCByYyA9IHBhcnRzLnNpemUoKSA+IDAgPyAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkuZ2V0KDApCi0JCQkJOiBudWxsOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhcnRzLnNpemUoKTsgeCsrKSB7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkJLmdldCh4KTsKLQkJCWlmIChwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnkgPCByYy5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55KSB7Ci0JCQkJcmMgPSBwOwotCQkJfQotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZ2V0SG9yaXpvbnRhbE1pblBhcnQoTGlzdCBwYXJ0cykgewotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJjID0gcGFydHMuc2l6ZSgpID4gMCA/IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCS5nZXQoMCkKLQkJCQk6IG51bGw7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgcGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCQkuZ2V0KHgpOwotCQkJaWYgKHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueCA8IHJjLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLngpIHsKLQkJCQlyYyA9IHA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRWZXJ0aWNhbE1heFBhcnQoTGlzdCBwYXJ0cykgewotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJjID0gcGFydHMuc2l6ZSgpID4gMCA/IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCS5nZXQoMCkKLQkJCQk6IG51bGw7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgcGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCQkuZ2V0KHgpOwotCQkJaWYgKHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuYm90dG9tKCkgPiByYy5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkuYm90dG9tKCkpIHsKLQkJCQlyYyA9IHA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0VuZE5vZGVFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0VuZE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDRiZDk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9FbmROb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5FbmROb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci0KLS8qKgotICogRWRpdFBhcnQgZm9yIEZpbmFsKG9yIEVuZCkgbm9kZSAKLSAqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW5kTm9kZUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBFbmROb2RlRWRpdFBhcnQoVHlwZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRmlndXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUVuZE5vZGVGaWd1cmUgZiA9IG5ldyBFbmROb2RlRmlndXJlKCk7Ci0JCWYuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLQkJZi5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMucmVkKTsKLQkJZi5zZXRTaXplKDI0LCAyNCk7Ci0JCXJldHVybiBmOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dENlbGxFZGl0b3JMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIwYTkyZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuRnJlZVRleHRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiAKLSAqIENvbnN0cmFpbnQgZm9yIHBsYWNpbmcgRnJlZVRleHQgQ2VsbCBFZGl0b3IuCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGcmVlVGV4dENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JSUZpZ3VyZSBmaWd1cmU7Ci0JLyoKLQkgKiBDcmVhdGVzIGEgbmV3IEZyZWVUZXh0Q2VsbEVkaXRvckxvY2F0b3IgCi0JICogCi0JICogQHBhcmFtIGxhYmVsIHRoZSBMYWJlbAotCSAqLwotCXB1YmxpYyBGcmVlVGV4dENlbGxFZGl0b3JMb2NhdG9yKElGaWd1cmUgZmlndXJlKSB7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3IjcmVsb2NhdGUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2UpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlGcmVlVGV4dEZpZ3VyZSBmaWcgPSAoRnJlZVRleHRGaWd1cmUpZmlndXJlOwotCQlUZXh0IHRleHQgPSAoVGV4dCkgY2UuZ2V0Q29udHJvbCgpOwotCQlTdHJpbmcgbiA9IChTdHJpbmcpIGNlLmdldFZhbHVlKCk7Ci0JCUdDIGdjID0gbmV3IEdDKHRleHQpOwotCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudChuKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlpZiAoc2l6ZS54ICE9IDApCi0JCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZShzaXplLngsIFNXVC5ERUZBVUxUKTsKLQkJdGV4dC5zZXRTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJUmVjdGFuZ2xlIHRleHRCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Q2xpZW50QXJlYSgpLngsIHRleHQKLQkJCQkuZ2V0Q2xpZW50QXJlYSgpLnksIHRleHQuZ2V0Q2xpZW50QXJlYSgpLndpZHRoLCB0ZXh0Ci0JCQkJLmdldENsaWVudEFyZWEoKS5oZWlnaHQpOwotCQlSZWN0YW5nbGUgZmlnQm91bmRzID0gZmlnLmdldENsaWVudEFyZWEoKTsKLQkJZmlnLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZmlnQm91bmRzKTsKLQkJaW50IGRlbHRhID0gKGZpZ0JvdW5kcy53aWR0aCAtIHRleHRCb3VuZHMud2lkdGgpIC8gMjsKLQkJaW50IHkgPSBmaWcuZ2V0VGV4dEZsb3dQYWdlKCkuZ2V0TG9jYXRpb24oKS55OwotCQl0ZXh0LnNldExvY2F0aW9uKGZpZ0JvdW5kcy54ICsgZGVsdGEsIHkpOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZpZ3VyZShJRmlndXJlIGZpZ3VyZSkgewotCQl0aGlzLmZpZ3VyZSA9IGZpZ3VyZTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmaWd1cmUuCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0RmlndXJlKCkgewotCQlyZXR1cm4gZmlndXJlOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0RGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlYjVkZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0RGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGRpcmVjdCBlZGl0IG9wZXJhdGlvbiBieSBjcmVhdGluZyBhbmQgbWFpbnRhaW5pbmcgdGhlIAotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcn0gYW5kIGV4ZWN1dGluZyB0aGUgcmVzdWx0aW5nIGNvbW1hbmQgaWYgCi0gKiB0aGUgY2VsbCBlZGl0b3IgdmFsdWUgaGFzIGNoYW5nZWQuIFNwZWNpZmljYWxseSBmb3IgRnJlZVRleHQuCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZyZWVUZXh0RGlyZWN0RWRpdE1hbmFnZXIgZXh0ZW5kcyBEaXJlY3RFZGl0TWFuYWdlciB7Ci0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgVmVyaWZ5TGlzdGVuZXIgdmVyaWZ5TGlzdGVuZXI7Ci0JcHJpdmF0ZSBGb250IHNjYWxlZEZvbnQ7Ci0JcHJvdGVjdGVkIElGaWd1cmUgZmlndXJlOwotCQotCXB1YmxpYyBGcmVlVGV4dERpcmVjdEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwgQ2xhc3MgZWRpdG9yVHlwZSwgQ2VsbEVkaXRvckxvY2F0b3IgbG9jYXRvciwgSUZpZ3VyZSBmaWd1cmUpIHsKLQkJc3VwZXIoc291cmNlLCBlZGl0b3JUeXBlLCBsb2NhdG9yKTsKLQkJdGhpcy5maWd1cmUgPSBmaWd1cmU7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQlicmluZ0Rvd24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oYm9vbGVhbiBjaGVjaykgewotCQkvLyBUaGlzIG1ldGhvZCBtaWdodCBiZSByZS1lbnRlcmVkIHdoZW4gc3VwZXIuYnJpbmdEb3duKCkgaXMgY2FsbGVkLgotCQlGb250IGRpc3Bvc2VGb250ID0gc2NhbGVkRm9udDsKLQkJc2NhbGVkRm9udCA9IG51bGw7Ci0JCXN1cGVyLmJyaW5nRG93bigpOwotCQlpZiAoZGlzcG9zZUZvbnQgIT0gbnVsbCkKLQkJCWRpc3Bvc2VGb250LmRpc3Bvc2UoKTsKLQkJaWYgKGNoZWNrKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJU3RyaW5nIG5hbWUgPSAiIjsKLQkJCS8vIFRPRE86IFJlbW92ZSB0aGlzIGNoZWNrIAotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQlPYmplY3Qgd2JlbGVtZW50ID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQlpZiAod2JlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KSkgewotCQkJCQluYW1lID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBUeXBlZE5vZGUgJiYgKChUeXBlZE5vZGUpbm9kZSkuZ2V0VHlwZSgpPT1UeXBlZE5vZGUuRlJFRV9URVhUKXsKLQkJCQlHcmFwaE5vZGUgZ25vZGUgPSAoKE5vZGUpIGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCk7Ci0JCQkJbmFtZSA9ICgoUHJvcGVydHkpIGdub2RlLmdldFByb3BlcnR5KCkuZ2V0KDApKS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKQotCQkJCQkJLmFzeW5jRXhlYygKLQkJCQkJCQkJbmV3IFByb21wdEVkaXQoCi0JCQkJCQkJCQkJKE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwKLQkJCQkJCQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuZXJyX25hbWVfZW1wdHkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjaW5pdENlbGxFZGl0b3IoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDZWxsRWRpdG9yKCkgewotCQlUZXh0Q2VsbEVkaXRvciBlZGl0b3IgPSAoVGV4dENlbGxFZGl0b3IpIGdldENlbGxFZGl0b3IoKTsKLQkJZWRpdG9yLnNldFN0eWxlKFNXVC5NVUxUSSk7Ci0JCVRleHQgdCA9IChUZXh0KSBlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQl2ZXJpZnlMaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJCQlTdHJpbmcgb2xkVGV4dCA9IHRleHQuZ2V0VGV4dCgpOwotCQkJCVN0cmluZyBsZWZ0VGV4dCA9IG9sZFRleHQuc3Vic3RyaW5nKDAsIGV2ZW50LnN0YXJ0KTsKLQkJCQlTdHJpbmcgcmlnaHRUZXh0ID0gb2xkVGV4dC5zdWJzdHJpbmcoZXZlbnQuZW5kLCBvbGRUZXh0Ci0JCQkJCQkubGVuZ3RoKCkpOwotCQkJCUdDIGdjID0gbmV3IEdDKHRleHQpOwotCQkJCVBvaW50IHNpemUgPSBnYy50ZXh0RXh0ZW50KGxlZnRUZXh0ICsgZXZlbnQudGV4dCArIHJpZ2h0VGV4dCk7Ci0JCQkJZ2MuZGlzcG9zZSgpOwotCQkJCWlmIChzaXplLnggIT0gMCkKLQkJCQkJc2l6ZSA9IHRleHQuY29tcHV0ZVNpemUoc2l6ZS54LCBTV1QuREVGQVVMVCk7Ci0JCQkJZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKS5zZXRTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJCX0KLQkJfTsKLQkJdC5hZGRWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0JCVN0cmluZyBpbml0aWFsTGFiZWxUZXh0ID0gKChOb2RlRWRpdFBhcnQpIHRoaXMuZ2V0RWRpdFBhcnQoKSkKLQkJCQkuZ2V0RGlyZWN0RWRpdFRleHQoKTsKLQkJZWRpdG9yLnNldFZhbHVlKGluaXRpYWxMYWJlbFRleHQpOwotCQlGb250IGYgPSBmaWd1cmUuZ2V0Rm9udCgpOwotCQlGb250TWV0cmljcyBmbSA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyhmKTsKLQkJaW50IGggPSBmbS5nZXRIZWlnaHQoKTsKLQkJaW50IHcgPSBmbS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCXQuc2V0U2l6ZShpbml0aWFsTGFiZWxUZXh0Lmxlbmd0aCgpKncrMTAwLCBoKzUwKTsKLQkKLQkJaWYoZiAhPSBudWxsKQotCQkJdC5zZXRGb250KGYpOwotCQllbHNlCi0JCQl0LnNldEZvbnQoVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UKTsKLQkJdC5zZWxlY3RBbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciN1bmhvb2tMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVuaG9va0xpc3RlbmVycygpIHsKLQkJc3VwZXIudW5ob29rTGlzdGVuZXJzKCk7Ci0JCWlmIChnZXRDZWxsRWRpdG9yKCkgIT0gbnVsbCkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCQlpZiAodmVyaWZ5TGlzdGVuZXIgIT0gbnVsbCkKLQkJCQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKHZlcmlmeUxpc3RlbmVyKTsKLQkJCXZlcmlmeUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB2YWxpZC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIHR4dAotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB2YWxpZCwgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjY29tbWl0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21taXQoKSB7Ci0JCVN0cmluZyBtc2cgPSB2YWxpZGF0ZSgoU3RyaW5nKSBnZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKSk7Ci0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJYnJpbmdEb3duKGZhbHNlKTsKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFByb21wdEVkaXQoKE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwgbXNnKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuY29tbWl0KCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByb21wdEVkaXQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLQkJcHJpdmF0ZSBOb2RlRWRpdFBhcnQgcGFydDsKLQotCQlwcml2YXRlIFN0cmluZyBtc2c7Ci0KLQkJUHJvbXB0RWRpdChOb2RlRWRpdFBhcnQgcGFydCwgU3RyaW5nIG1zZykgewotCQkJdGhpcy5wYXJ0ID0gcGFydDsKLQkJCXRoaXMubXNnID0gbXNnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBEaWFncmFtVUlSZXNvdXJjZXMuZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZV90ZXh0MDsgLy8kTk9OLU5MUy0xJAotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXBhcnQucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0RWRpdFBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyMWMwNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5TZWxlY3RhYmxlTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgZGlyZWN0IGVkaXRpbmcsIGZyZWUgdGV4dCBwcm9wZXJ0aWVzIGNoYW5nZXMgbGlrZSBmb250LCBjb2xvciBhbmQgdGV4dC4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGcmVlVGV4dEVkaXRQYXJ0IGV4dGVuZHMgTm9kZUVkaXRQYXJ0IHsKLQotCXByaXZhdGUgRm9udCBmb250OwotCi0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQotCXByaXZhdGUgRm9udERhdGEgZkRhdGE7Ci0KLQlwcml2YXRlIE5vZGVFZGl0UGFydCBwYXJ0OwotCi0JcHVibGljIEZyZWVUZXh0RWRpdFBhcnQoTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JCXBhcnQgPSB0aGlzOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJTGFiZWwgbCA9IG5ldyBTZWxlY3RhYmxlTGFiZWwoKTsKLQkJbC5zZXRMYWJlbEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLQkJbC5zZXRUZXh0UGxhY2VtZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsKLQkJcmV0dXJuIGw7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotCQlpZiAoISgoTm9kZSkgZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpKSB7Ci0JCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJCWNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdFBvbGljeSBjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gbmV3IERpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREaXJlY3RFZGl0Q29tbWFuZChEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG5ldyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZChwYXJ0LCAoU3RyaW5nKSByZXF1ZXN0Ci0JCQkJCQkuZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBzaG93Q3VycmVudEVkaXRWYWx1ZShEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCQkJaWYgKGZpZyBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQkJCSgoTGFiZWwpIGZpZykuc2V0VGV4dCgoU3RyaW5nKSByZXF1ZXN0LmdldENlbGxFZGl0b3IoKQotCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQkJZmlnLmdldFVwZGF0ZU1hbmFnZXIoKS5wZXJmb3JtVXBkYXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChOb2RlLmNsYXNzKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19UWVBFOgotCQkJcmVmcmVzaFZpc3VhbHMoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZWQobXNnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVF9FRElUCi0JCQkJJiYgISgoTm9kZSkgZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpKSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucGVyZm9ybVJlcXVlc3QocmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCWlmIChmaWcgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJTGFiZWwgbCA9IChMYWJlbCkgZmlnOwotCQkJTGlzdCBhbGlzdCA9ICgoTm9kZSkgZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCkuZ2V0UHJvcGVydHkoKTsKLQkJCVN0cmluZyBmb250TmFtZSA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVF9OQU1FOwotCQkJaW50IGZvbnRTdHlsZSA9IFNXVC5OT1JNQUw7Ci0JCQlpbnQgZm9udEhlaWdodCA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVF9TSVpFOwotCQkJaW50IGZvbnRSZWQgPSBTV1QuQ09MT1JfUkVEOwotCQkJaW50IGZvbnRCbHVlID0gU1dULkNPTE9SX0JMVUU7Ci0JCQlpbnQgZm9udEdyZWVuID0gU1dULkNPTE9SX0dSRUVOOwotCi0JCQlpZiAoYWxpc3Quc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaW9yID0gYWxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJUHJvcGVydHkgcHJvcCA9IChQcm9wZXJ0eSkgaW9yLm5leHQoKTsKLQkJCQkJaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9GUkVFX1RFWFQpKSB7Ci0JCQkJCQlsLnNldFRleHQocHJvcC5nZXRWYWx1ZSgpKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX05BTUUpKSB7Ci0JCQkJCQlmb250TmFtZSA9IHByb3AuZ2V0VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1NUWUxFKSkgewotCQkJCQkJZm9udFN0eWxlID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfSEVJR0hUKSkgewotCQkJCQkJZm9udEhlaWdodCA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1JFRCkpIHsKLQkJCQkJCWZvbnRSZWQgPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9CTFVFKSkgewotCQkJCQkJZm9udEJsdWUgPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9HUkVFTikpIHsKLQkJCQkJCWZvbnRHcmVlbiA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbC5zZXRUZXh0KCgoTm9kZSkgZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCWlmIChmb250ICE9IG51bGwgJiYgIWZvbnQuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJZm9udC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlpZiAoY29sb3IgIT0gbnVsbCAmJiAhY29sb3IuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJY29sb3IuZGlzcG9zZSgpOwotCQkJfQotCQkJZkRhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIGZvbnRIZWlnaHQsIGZvbnRTdHlsZSk7Ci0JCQlmb250ID0gbmV3IEZvbnQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCksIGZEYXRhKTsKLQkJCWNvbG9yID0gbmV3IENvbG9yKG51bGwsIGZvbnRSZWQsIGZvbnRHcmVlbiwgZm9udEJsdWUpOwotCQkJbC5zZXRGb250KGZvbnQpOwotCi0JCQlsLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCUxhYmVsIGwgPSAoTGFiZWwpIGdldEZpZ3VyZSgpOwotCQlyZXR1cm4gbmV3IFZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyKHRoaXMsIFRleHRDZWxsRWRpdG9yLmNsYXNzLAotCQkJCW5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvcihsKSwgbCkgewotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHR4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JSUZpZ3VyZSBnZXREaXJlY3RFZGl0RmlndXJlKCkgewotCQlyZXR1cm4gZ2V0RmlndXJlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJaWYgKGZvbnQgIT0gbnVsbCAmJiAhZm9udC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWZvbnQuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChjb2xvciAhPSBudWxsICYmICFjb2xvci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHROb2RlRWRpdFBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTI1N2QxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5GcmVlVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgZGlyZWN0IGVkaXRpbmcsIHRleHQgZm9udCwgY29sb3IgYW5kIHNpemUgY2hhbmdlcy4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkuCi0gKi8KLQotcHVibGljIGNsYXNzIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUVkaXRQYXJ0IHsKLQlwcml2YXRlIEZvbnQgZm9udDsKLQotCXByaXZhdGUgQ29sb3IgY29sb3I7Ci0KLQlwcml2YXRlIEZvbnREYXRhIGZEYXRhOwotCi0JcHJpdmF0ZSBOb2RlRWRpdFBhcnQgcGFydDsKLQotCXB1YmxpYyBGcmVlVGV4dE5vZGVFZGl0UGFydChOb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJcGFydCA9IHRoaXM7IAotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlGcmVlVGV4dEZpZ3VyZSBsID0gbmV3IEZyZWVUZXh0RmlndXJlKCk7Ci0JCXJldHVybiBsOwotCi0JfQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWlmICghKChOb2RlKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpIHsKLQkJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQkJY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG5ldyBEaXJlY3RFZGl0UG9saWN5KCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGlyZWN0RWRpdENvbW1hbmQoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBuZXcgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQocGFydCwgKFN0cmluZykgcmVxdWVzdAotCQkJCQkJLmdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgc2hvd0N1cnJlbnRFZGl0VmFsdWUoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQkJCWlmIChmaWcgaW5zdGFuY2VvZiBGcmVlVGV4dEZpZ3VyZSkgewotCQkJCQkoKEZyZWVUZXh0RmlndXJlKSBmaWcpLnNldFRleHQoKFN0cmluZykgcmVxdWVzdC5nZXRDZWxsRWRpdG9yKCkKLQkJCQkJCQkuZ2V0VmFsdWUoKSk7Ci0JCQkJCWZpZy5nZXRVcGRhdGVNYW5hZ2VyKCkucGVyZm9ybVVwZGF0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5vZGUuY2xhc3MpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEU6Ci0JCQlyZWZyZXNoVmlzdWFscygpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQKLQkJCQkmJiAhKChOb2RlKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5wZXJmb3JtUmVxdWVzdChyZXF1ZXN0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlJRmlndXJlIGZpZyA9IGdldERpcmVjdEVkaXRGaWd1cmUoKTsKLQkJaWYgKGZpZyBpbnN0YW5jZW9mIEZyZWVUZXh0RmlndXJlKSB7Ci0JCQlGcmVlVGV4dEZpZ3VyZSBsID0gKEZyZWVUZXh0RmlndXJlKSBmaWc7Ci0JCQlMaXN0IGFsaXN0ID0gKChOb2RlKSBnZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKS5nZXRQcm9wZXJ0eSgpOwotCQkJU3RyaW5nIGZvbnROYW1lID0gVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UX05BTUU7Ci0JCQlpbnQgZm9udFN0eWxlID0gU1dULk5PUk1BTDsKLQkJCWludCBmb250SGVpZ2h0ID0gVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UX1NJWkU7Ci0JCQlpbnQgZm9udFJlZCA9IFNXVC5DT0xPUl9SRUQ7Ci0JCQlpbnQgZm9udEJsdWUgPSBTV1QuQ09MT1JfQkxVRTsKLQkJCWludCBmb250R3JlZW4gPSBTV1QuQ09MT1JfR1JFRU47Ci0KLQkJCWlmIChhbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpb3IgPSBhbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCQlQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSBpb3IubmV4dCgpOwotCQkJCQlpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0ZSRUVfVEVYVCkpIHsKLQkJCQkJCWwuc2V0VGV4dChwcm9wLmdldFZhbHVlKCkpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfTkFNRSkpIHsKLQkJCQkJCWZvbnROYW1lID0gcHJvcC5nZXRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfU1RZTEUpKSB7Ci0JCQkJCQlmb250U3R5bGUgPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9IRUlHSFQpKSB7Ci0JCQkJCQlmb250SGVpZ2h0ID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfUkVEKSkgewotCQkJCQkJZm9udFJlZCA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0JMVUUpKSB7Ci0JCQkJCQlmb250Qmx1ZSA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0dSRUVOKSkgewotCQkJCQkJZm9udEdyZWVuID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlsLnNldFRleHQoKChOb2RlKSBnZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKS5nZXROYW1lKCkpOwotCQkJfQotCQkJaWYgKGZvbnQgIT0gbnVsbCAmJiAhZm9udC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlmb250LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWlmIChjb2xvciAhPSBudWxsICYmICFjb2xvci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQljb2xvci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlmRGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgZm9udEhlaWdodCwgZm9udFN0eWxlKTsKLQkJCWZvbnQgPSBuZXcgRm9udChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKSwgZkRhdGEpOwotCQkJY29sb3IgPSBuZXcgQ29sb3IobnVsbCwgZm9udFJlZCwgZm9udEdyZWVuLCBmb250Qmx1ZSk7Ci0JCQlsLnNldEZvbnQoZm9udCk7Ci0KLQkJCWwuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJRnJlZVRleHRGaWd1cmUgbCA9IChGcmVlVGV4dEZpZ3VyZSkgZ2V0RmlndXJlKCk7Ci0JCXJldHVybiBuZXcgRnJlZVRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0Q2VsbEVkaXRvci5jbGFzcywKLQkJCQluZXcgRnJlZVRleHRDZWxsRWRpdG9yTG9jYXRvcihsKSwgbCkgewotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHR4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JSUZpZ3VyZSBnZXREaXJlY3RFZGl0RmlndXJlKCkgewotCQlyZXR1cm4gZ2V0RmlndXJlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVFZGl0UGFydCNkZWFjdGl2YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkgewotCQkJZm9udC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbG9yICE9IG51bGwgJiYgIWNvbG9yLmlzRGlzcG9zZWQoKSkgewotCQkJY29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0JU3RyaW5nIGdldERpcmVjdEVkaXRUZXh0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCS8vcmV0dXJuIHN1cGVyLmdldERpcmVjdEVkaXRUZXh0KCk7Ci0JCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgRnJlZVRleHRGaWd1cmUpIHsKLQkJCXJldHVybiAoKEZyZWVUZXh0RmlndXJlKSBmaWcpLmdldFRleHQoKTsKLQkJfSAKLQkJcmV0dXJuICIiOyAKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxDZWxsRWRpdG9yTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTk4NDE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQ29uc3RyYWludCBmb3IgTGFiZWwgcGxhY2luZy4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JcHJpdmF0ZSBJRmlndXJlIGZpZzsKLQotCXByaXZhdGUgc3RhdGljIGludCBXSU5fWF9PRkZTRVQgPSAtNDsKLQotCXByaXZhdGUgc3RhdGljIGludCBXSU5fV19PRkZTRVQgPSA1OwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IEdUS19YX09GRlNFVCA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgR1RLX1dfT0ZGU0VUID0gMDsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQUNfWF9PRkZTRVQgPSAtMzsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQUNfV19PRkZTRVQgPSA5OwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BQ19ZX09GRlNFVCA9IC0zOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BQ19IX09GRlNFVCA9IDY7Ci0KLQlwdWJsaWMgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcihJRmlndXJlIGZpZ3VyZSkgewotCQlmaWcgPSBmaWd1cmU7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yI3JlbG9jYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcikKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQlUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0KLQkJUmVjdGFuZ2xlIHJlY3QgPSBudWxsOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgTGFiZWwpCi0JCQlyZWN0ID0gKChMYWJlbCkgZmlnKS5nZXRUZXh0Qm91bmRzKCkuaW50ZXJzZWN0KGZpZy5nZXRDbGllbnRBcmVhKCkpOwotCQllbHNlCi0JCQlyZWN0ID0gZmlnLmdldENsaWVudEFyZWEoUmVjdGFuZ2xlLlNJTkdMRVRPTik7Ci0JCWZpZy50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotCi0JCWludCB4T2Zmc2V0ID0gMDsKLQkJaW50IHdPZmZzZXQgPSAwOwotCQlpbnQgeU9mZnNldCA9IDA7Ci0JCWludCBoT2Zmc2V0ID0gMDsKLQotCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzSWdub3JlQ2FzZSgiZ3RrIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJeE9mZnNldCA9IEdUS19YX09GRlNFVDsKLQkJCXdPZmZzZXQgPSBHVEtfV19PRkZTRVQ7Ci0JCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzSWdub3JlQ2FzZSgiY2FyYm9uIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJeE9mZnNldCA9IE1BQ19YX09GRlNFVDsKLQkJCXdPZmZzZXQgPSBNQUNfV19PRkZTRVQ7Ci0JCQl5T2Zmc2V0ID0gTUFDX1lfT0ZGU0VUOwotCQkJaE9mZnNldCA9IE1BQ19IX09GRlNFVDsKLQkJfSBlbHNlIHsKLQkJCXhPZmZzZXQgPSBXSU5fWF9PRkZTRVQ7Ci0JCQl3T2Zmc2V0ID0gV0lOX1dfT0ZGU0VUOwotCQl9Ci0KLQkJdGV4dC5zZXRCb3VuZHMocmVjdC54ICsgeE9mZnNldCwgcmVjdC55ICsgeU9mZnNldCwKLQkJCQlyZWN0LndpZHRoICsgd09mZnNldCwgcmVjdC5oZWlnaHQgKyBoT2Zmc2V0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxEaXJlY3RFZGl0TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsRGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWIwZjkyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBkaXJlY3QgZWRpdCBvcGVyYXRpb24gYnkgY3JlYXRpbmcgYW5kIG1haW50YWluaW5nIHRoZSAKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3J9IGFuZCBleGVjdXRpbmcgdGhlIHJlc3VsdGluZyBjb21tYW5kIGlmIAotICogdGhlIGNlbGwgZWRpdG9yIHZhbHVlIGhhcyBjaGFuZ2VkLiBGb3Ige0BsaW5rIExhYmVsfS4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMYWJlbERpcmVjdEVkaXRNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIgewotCi0JRm9udCBzY2FsZWRGb250OwotCi0JcHVibGljIExhYmVsRGlyZWN0RWRpdE1hbmFnZXIoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBDbGFzcyBlZGl0b3JUeXBlLAotCQkJQ2VsbEVkaXRvckxvY2F0b3IgbG9jYXRvcikgewotCQlzdXBlcihzb3VyY2UsIGVkaXRvclR5cGUsIGxvY2F0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQkvLyBUaGlzIG1ldGhvZCBtaWdodCBiZSByZS1lbnRlcmVkIHdoZW4gc3VwZXIuYnJpbmdEb3duKCkgaXMgY2FsbGVkLgotCQlGb250IGRpc3Bvc2VGb250ID0gc2NhbGVkRm9udDsKLQkJc2NhbGVkRm9udCA9IG51bGw7Ci0JCXN1cGVyLmJyaW5nRG93bigpOwotCQlpZiAoZGlzcG9zZUZvbnQgIT0gbnVsbCkKLQkJCWRpc3Bvc2VGb250LmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIHsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0KLQkJZ2V0Q2VsbEVkaXRvcigpLnNldFZhbHVlKGdldEluaXRpYWxUZXh0KCkpOwotCQlJRmlndXJlIGZpZ3VyZSA9IGdldEVkaXRQYXJ0KCkuZ2V0RmlndXJlKCk7Ci0JCXNjYWxlZEZvbnQgPSBmaWd1cmUuZ2V0Rm9udCgpOwotCQlGb250RGF0YSBkYXRhID0gc2NhbGVkRm9udC5nZXRGb250RGF0YSgpWzBdOwotCQlEaW1lbnNpb24gZm9udFNpemUgPSBuZXcgRGltZW5zaW9uKDAsIGRhdGEuZ2V0SGVpZ2h0KCkpOwotCQlnZXREaXJlY3RFZGl0RmlndXJlKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShmb250U2l6ZSk7Ci0JCWRhdGEuc2V0SGVpZ2h0KGZvbnRTaXplLmhlaWdodCk7Ci0JCXNjYWxlZEZvbnQgPSBuZXcgRm9udChudWxsLCBkYXRhKTsKLQotCQl0ZXh0LnNldEZvbnQoc2NhbGVkRm9udCk7Ci0JCXRleHQuc2VsZWN0QWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY2VsbCBlZGl0b3Igb24gdGhlIGdpdmVuIGNvbXBvc2l0ZS4gVGhlIGNlbGwgZWRpdG9yIGlzCi0JICogY3JlYXRlZCBieSBpbnN0YW50aWF0aW5nIHRoZSBjZWxsIGVkaXRvciB0eXBlIHBhc3NlZCBpbnRvIHRoaXMKLQkgKiBEaXJlY3RFZGl0TWFuYWdlcidzIGNvbnN0dWN0b3IuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIGNvbXBvc2l0ZSB0byBjcmVhdGUgdGhlIGNlbGwgZWRpdG9yIG9uCi0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjZWxsIGVkaXRvcgotCSAqLwotCXByb3RlY3RlZCBDZWxsRWRpdG9yIGNyZWF0ZUNlbGxFZGl0b3JPbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXJldHVybiBuZXcgVGV4dENlbGxFZGl0b3IoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgdGV4dCBzaG93biBpbiB0aGUgY2VsbCBlZGl0b3IgZm9yCi0JICogICAgICAgICBkaXJlY3QtZWRpdGluZzsgY2Fubm90IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5pdGlhbFRleHQoKSB7Ci0JCXJldHVybiAoKEJhc2VFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkuZ2V0RGlyZWN0RWRpdFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRldGVybWluZSB0aGUgaW5pdGlhbCB0ZXh0IG9mIHRoZSBjZWxsIGVkaXRvciBhbmQgdG8gZGV0ZXJtaW5lCi0JICogdGhlIGZvbnQgc2l6ZSBvZiB0aGUgdGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaWd1cmUgYmVpbmcgZWRpdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpIHsKLQkJcmV0dXJuICgoQmFzZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKS5nZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2YxZWQ0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIENvbnN0cmFpbnQgZm9yIFRleHQgcGxhY2luZy4gCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQlwcml2YXRlIExhYmVsIGxhYmVsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvciBmb3IgdGhlIGdpdmVuIExhYmVsCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICB0aGUgTGFiZWwKLQkgKi8KLQlwdWJsaWMgTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IoTGFiZWwgbGFiZWwpIHsKLQkJc2V0TGFiZWwobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2VsbEVkaXRvckxvY2F0b3IjcmVsb2NhdGUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQlUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0JCVBvaW50IHByZWYgPSB0ZXh0LmNvbXB1dGVTaXplKC0xLCAtMSk7Ci0JCVJlY3RhbmdsZSByZWN0ID0gbGFiZWwuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLQkJbGFiZWwudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLQkJdGV4dC5zZXRCb3VuZHMocmVjdC54IC0gMSwgcmVjdC55IC0gMSwgcHJlZi54ICsgMSwgcHJlZi55ICsgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgTGFiZWwgZmlndXJlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIExhYmVsCi0JICovCi0JcHJvdGVjdGVkIExhYmVsIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBUaGUgbGFiZWwgdG8gc2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWwoTGFiZWwgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xpbmtFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xpbmtFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNmJjYmRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MaW5rRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5Z29uRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5EZWxldGVMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLkxpbmtCZW5kcG9pbnRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXMuTGlua0VuZHBvaW50RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbm5lY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCB0byB1cGRhdGUgdGhlIGFwcGVhcmFuY2UsIGFuZCBpbnN0YWxscyB0aGUgZWRpdHBvbGljaWVzCi0gKiBzcGVjaWZpYyB0aGUge0BsaW5rIExpbmt9IGFuZCBsaXN0ZW5zIHRvIGNoYW5nZXMgaW4gdGhlIGRpYWdyYW0gbW9kZWwuCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlua0VkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQgewotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgbW9kZWxMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQloYW5kbGVQcm9wZXJ0eUNoYW5nZWQobXNnKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgTGlua0VkaXRQYXJ0KExpbmsgY29ubikgewotCQlzdXBlcigpOwotCQlzZXRNb2RlbChjb25uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJZ2V0TGluaygpLmVBZGFwdGVycygpLmFkZChtb2RlbExpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09OTkVDVElPTl9FTkRQT0lOVFNfUk9MRSwKLQkJCQluZXcgTGlua0VuZHBvaW50RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT05ORUNUSU9OX1JPTEUsCi0JCQkJbmV3IENvbm5lY3Rpb25FZGl0UG9saWN5KCkgewotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKEdyb3VwUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlCb29sZWFuIGJvb2wgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRFeHRlbmRlZERhdGEoKS5nZXQoCi0JCQkJCQkJCURlbGV0ZUNvbW1hbmQuS0VZX1BFUk1fREVMRVRFKTsKLQkJCQkJCWJvb2xlYW4gcGVybURlbGV0ZSA9IGJvb2wgPT0gbnVsbCA/IGZhbHNlIDogYm9vbAotCQkJCQkJCQkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCQlyZXR1cm4gbmV3IERlbGV0ZUxpbmtDb21tYW5kKChMaW5rKSBnZXRIb3N0KCkKLQkJCQkJCQkJLmdldE1vZGVsKCksIHBlcm1EZWxldGUpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09OTkVDVElPTl9CRU5EUE9JTlRTX1JPTEUsCi0JCQkJbmV3IExpbmtCZW5kcG9pbnRFZGl0UG9saWN5KCkpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJUG9seWxpbmVDb25uZWN0aW9uIGNvbm4gPSBuZXcgUG9seWxpbmVDb25uZWN0aW9uKCk7Ci0JCWNvbm4uc2V0VGFyZ2V0RGVjb3JhdGlvbihuZXcgUG9seWdvbkRlY29yYXRpb24oKSk7Ci0JCXVwZGF0ZUFwcGVhcmFuY2UoKTsKLQkJcmV0dXJuIGNvbm47Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUFwcGVhcmFuY2UoKSB7Ci0JCWlmIChmaWd1cmUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTGluayBsaW5rID0gKExpbmspIGdldE1vZGVsKCk7Ci0JCWlmIChWYWxpZGF0aW9uLmlzUmVhZE9ubHkobGluaykpIHsKLQkJCWZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JzLklOSEVSSVRFRF9FTEVNRU5UX0xBQkVMKTsKLQkJfSBlbHNlIHsKLQkJCWZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJZ2V0TGluaygpLmVBZGFwdGVycygpLnJlbW92ZShtb2RlbExpc3RlbmVyKTsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBMaW5rIGdldExpbmsoKSB7Ci0JCXJldHVybiAoTGluaykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTGluay5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fQkVORFBPSU5UUzoKLQkJCXJlZnJlc2hWaXN1YWxzKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUX0VORF9QT0lOVDoKLQkJCXJlZnJlc2hUYXJnZXRBbmNob3IoKTsKLQkJCWJyZWFrOwotCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0VfRU5EX1BPSU5UOgotCQkJcmVmcmVzaFNvdXJjZUFuY2hvcigpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJdXBkYXRlQXBwZWFyYW5jZSgpOwotCQlnZXRDb25uZWN0aW9uRmlndXJlKCkuc2V0Um91dGluZ0NvbnN0cmFpbnQoZ2V0TGluaygpLmdldEJlbmRwb2ludHMoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05hbWVkTm9kZUVkaXRQYXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTmFtZWROb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjRkMjFjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTmFtZWROb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuU2VsZWN0YWJsZUxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQnJlYWtJdGVyYXRvcjsKLQotLyoqCi0gKiBEaWFncmFtIGNoaWxkcmVuIHNob3VsZCBleHRlbmQgdGhpcyBOYW1lZE5vZGVFZGl0UGFydCBpbiBvcmRlciB0byBzdXBwb3J0IG5hbWUgZm9yIGZpZ3VyZS4KLSAqIE5hbWVkTm9kZUVkaXRQYXJ0IHByb3ZpZGVzIGluc3RydWN0dXJlIHRvIGhhbmRsZSB0aGUgbmFtZSB3cmFwcGluZyBhbmQgY29sb3IuIFN1cHBvcnQgZGlyZWN0IAotICogZWRpdGluZyBmZWVkYmFjay4gICAKLSAqICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOYW1lZE5vZGVFZGl0UGFydCBleHRlbmRzIE5vZGVFZGl0UGFydCB7Ci0KLQlwdWJsaWMgTmFtZWROb2RlRWRpdFBhcnQoTmFtZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUxhYmVsIGwgPSBuZXcgU2VsZWN0YWJsZUxhYmVsKCk7Ci0JCWwuc2V0TGFiZWxBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuTEVGVCk7Ci0JCWlmIChnZXRJbWFnZSgpICE9IG51bGwpIHsKLQkJCWwuc2V0SWNvbihnZXRJbWFnZSgpKTsKLQkJfQotCQlsLnNldFRleHRQbGFjZW1lbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOwotCQlsLnNldEZvbnQoVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UKTsKLQkJc2V0TGFiZWxGb3JlZ3JvdW5kQ29sb3IobCk7Ci0JCXJldHVybiBsOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRMYWJlbEZvcmVncm91bmRDb2xvcihMYWJlbCBsKSB7Ci0JCU5hbWVkTm9kZSBub2RlID0gKE5hbWVkTm9kZSkgZ2V0TW9kZWwoKTsKLQkJLy8gT2JqZWN0IGUgPSBub2RlLmdldE9iamVjdCgpOwotCQkvLyBib29sZWFuIHN1cHByZXNzZWQgPSBpc1N1cHByZXNzZWQoZSk7Ci0JCWJvb2xlYW4gc3VwcHJlc3NlZCA9IG5vZGUuaXNTdXBwcmVzc2VkKCk7Ci0JCWlmIChub2RlLmlzUmVhZE9ubHkoKSkgewotCQkJaWYgKCFzdXBwcmVzc2VkKSB7Ci0JCQkJbC5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JzLklOSEVSSVRFRF9FTEVNRU5UX0xBQkVMKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICghc3VwcHJlc3NlZCkgewotCQkJCWwuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLQkJCX0KLQkJfQotCQlpZiAoc3VwcHJlc3NlZCkgewotCQkJbC5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JzLlNVUFJFU1NFRF9FTEVNRU5UX0xBQkVMKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLQkJaWYgKCEoKE5vZGUpIGdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKSkgewotCQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCQljcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRQb2xpY3kgY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIG5ldyBEaXJlY3RFZGl0UG9saWN5KCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGlyZWN0RWRpdENvbW1hbmQoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBuZXcgQ2hhbmdlTmFtZUNvbW1hbmQoKE5hbWVkTm9kZSkgZ2V0TW9kZWwoKSwKLQkJCQkJCShTdHJpbmcpIHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBzaG93Q3VycmVudEVkaXRWYWx1ZShEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSByZXF1ZXN0LmdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpOwotCQkJCWlmIChmaWcgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCQkoKExhYmVsKSBmaWcpLnNldFRleHQocyk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZpZyBpbnN0YW5jZW9mIFRleHRGaWd1cmUpIHsKLQkJCQkJKChUZXh0RmlndXJlKSBmaWcpLnNldFRleHQocyk7Ci0JCQkJfQotCQkJCWZpZy5nZXRVcGRhdGVNYW5hZ2VyKCkucGVyZm9ybVVwZGF0ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChOYW1lZE5vZGUuY2xhc3MpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUU6Ci0JCQlyZWZyZXNoVmlzdWFscygpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQKLQkJCQkmJiAhKChOb2RlKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5wZXJmb3JtUmVxdWVzdChyZXF1ZXN0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFdSQVBfV0lEVEggPSAxMjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFdPUktfUFJPRFVDVF9XUkFQX1dJRFRIID0gMzsKLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlJRmlndXJlIGZpZyA9IGdldERpcmVjdEVkaXRGaWd1cmUoKTsKLQkJaWYgKGZpZyBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlMYWJlbCBsID0gKExhYmVsKSBmaWc7Ci0JCQlzZXRMYWJlbEZvcmVncm91bmRDb2xvcihsKTsKLQkJCVN0cmluZyB0ZXh0OwotCQkJLy8gQmVsb3cgY2hlY2sgaXMgcmVxdWlyZWQgZm9yIEV4dGVuZGVkIEFjdGl2aXR5IHByZXNlbnRhdGlvbiBuYW1lCi0JCQkvLyBzaG91bGQgYmUgdXNlZCBmcm9tIGJhc2UuCi0JCQlpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgZ2V0TW9kZWwoKTsKLQkJCQlPYmplY3Qgd2JlbGVtZW50ID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQlpZiAod2JlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KSkgewotCQkJCQl0ZXh0ID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KTsKLQkJCQl9IGVsc2UgewotCQkJCQl0ZXh0ID0gKChOYW1lZE5vZGUpIGdldE1vZGVsKCkpLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXRleHQgPSAoKE5hbWVkTm9kZSkgZ2V0TW9kZWwoKSkuZ2V0TmFtZSgpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlpZiAoZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydAotCQkJCQkJfHwgZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgewotCQkJCQlpbnQgdyA9IFdSQVBfV0lEVEg7Ci0JCQkJCWlmICh0aGlzLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKQotCQkJCQkJdyA9IFdPUktfUFJPRFVDVF9XUkFQX1dJRFRIOwotCQkJCQkKLQkJCQkJaWYodGhpcy5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVGFza05vZGUgJiYgCi0JCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5pc0F1dG9MYXlvdXQoCi0JCQkJCQkJKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSlnZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRNb2RlbCgpKSl7Ci0JCQkJCQkvLyBVc2VkIDE2IGFzIG1pbiBsZW5ndGggZm9yIHRhc2tuYW1lLCBlbHNlIGFkZCBzcGFjZXMgdG8gaXQuCi0JCQkJCQkvLyBUT0RPOiBmaW5kIGJldHRlciBzb2x1dGlvbiBmb3IgdGhpcy4KLQkJCQkJCWlmKHRleHQubGVuZ3RoKCkgPCAxNil7Ci0JCQkJCQkJaW50IGdhcCA9IDE2IC0gdGV4dC5sZW5ndGgoKTsKLQkJCQkJCQlmb3IoaW50IGk9MDsgaTxnYXAvMjsgaSsrKXsKLQkJCQkJCQkJdGV4dCs9IiAiOwotCQkJCQkJCX0KLQkJCQkJCQlmb3IoaW50IGk9MDsgaTxnYXAvMjsgaSsrKXsKLQkJCQkJCQkJdGV4dCA9ICIgIit0ZXh0OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl0ZXh0ID0gd3JhcCh0ZXh0LCB3KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKLQkJCX0KLQkJCWwuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgd3JhcChTdHJpbmcgcywgaW50IHdyYXBXaWR0aCkgewotCQlTdHJpbmcgd3JhcHBlZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUJyZWFrSXRlcmF0b3IgYmkgPSBCcmVha0l0ZXJhdG9yLmdldExpbmVJbnN0YW5jZSgpOwotCQlTdHJpbmcgcmVtYWluaW5nID0gczsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChyZW1haW5pbmcubGVuZ3RoKCkgPD0gd3JhcFdpZHRoKSB7Ci0JCQkJd3JhcHBlZCArPSByZW1haW5pbmc7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWJpLnNldFRleHQocmVtYWluaW5nKTsKLQkJCQlpbnQgcG9zID0gYmkuZm9sbG93aW5nKHdyYXBXaWR0aCk7Ci0JCQkJaWYgKHBvcyA9PSBCcmVha0l0ZXJhdG9yLkRPTkUpIHsKLQkJCQkJd3JhcHBlZCArPSByZW1haW5pbmc7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChwb3MgPj0gcmVtYWluaW5nLmxlbmd0aCgpKSB7Ci0JCQkJCQl3cmFwcGVkICs9IHJlbWFpbmluZzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJd3JhcHBlZCArPSByZW1haW5pbmcuc3Vic3RyaW5nKDAsIHBvcykgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZW1haW5pbmcgPSByZW1haW5pbmcuc3Vic3RyaW5nKHBvcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdyYXBwZWQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVDb250YWluZXJFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVDb250YWluZXJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDIxODUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ob2RlQ29udGFpbmVyRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQmVuZHBvaW50Q29ubmVjdGlvblJvdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GYW5Sb3V0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llcy5Ob2RlQ29udGFpbmVyRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLk5vZGVDb250YWluZXJGbG93TGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbXBvbmVudEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci0KLS8qKgotICogTm9kZUNvbnRhaW5lckVkaXRQYXJ0IG1hbmFnZXMgdGhlIGNoaWxkIGVkaXRwYXJ0cyBpbiBhIHtAbGluayBHcmFwaGljYWxWaWV3ZXJ9LgotICogUHJvdmlkZXMgaW5zdHJ1Y3R1cmUgdG8gaGFuZGxlIHRoZSBub3RpZmljYXRpb25zIGZyb20gbW9kZWwuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlQ29udGFpbmVyRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgTGF5ZXJDb25zdGFudHMgewotCi0JcHJpdmF0ZSBCZW5kcG9pbnRDb25uZWN0aW9uUm91dGVyIGNSb3V0ZXI7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciBtb2RlbExpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBOb2RlQ29udGFpbmVyRWRpdFBhcnQoTm9kZUNvbnRhaW5lciBtb2RlbCkgewotCQlzdXBlcigpOwotCQlzZXRNb2RlbChtb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU5vZGVDb250YWluZXIgbW9kZWwgPSAoTm9kZUNvbnRhaW5lcikgKChFT2JqZWN0KSBnZXRNb2RlbCgpKTsKLQkJbW9kZWwuZUFkYXB0ZXJzKCkuYWRkKG1vZGVsTGlzdGVuZXIpOwotCQltb2RlbC5hZGRDb25zdW1lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09NUE9ORU5UX1JPTEUsIG5ldyBDb21wb25lbnRFZGl0UG9saWN5KCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRGVsZXRlQ29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQkJCUJvb2xlYW4gYm9vbCA9IChCb29sZWFuKSBkZWxldGVSZXF1ZXN0LmdldEV4dGVuZGVkRGF0YSgpLmdldCgKLQkJCQkJCURlbGV0ZUNvbW1hbmQuS0VZX1BFUk1fREVMRVRFKTsKLQkJCQlib29sZWFuIHBlcm1EZWxldGUgPSBib29sID09IG51bGwgPyBmYWxzZSA6IGJvb2wuYm9vbGVhblZhbHVlKCk7Ci0JCQkJRGVsZXRlQ29tbWFuZCBjbWQgPSBuZXcgRGVsZXRlQ29tbWFuZChwZXJtRGVsZXRlKTsKLQkJCQljbWQuc2V0UGFydFRvQmVEZWxldGVkKGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQkJCQlyZXR1cm4gY21kOwotCQkJfQotCQl9KTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbnVsbCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09OVEFJTkVSX1JPTEUsCi0JCQkJbmV3IE5vZGVDb250YWluZXJFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Lk5PREVfUk9MRSwgbnVsbCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsCi0JCQkJbmV3IE5vZGVDb250YWluZXJGbG93TGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlOb2RlQ29udGFpbmVyIG1vZGVsID0gKE5vZGVDb250YWluZXIpICgoRU9iamVjdCkgZ2V0TW9kZWwoKSk7Ci0JCW1vZGVsLmVBZGFwdGVycygpLnJlbW92ZShtb2RlbExpc3RlbmVyKTsKLQkJbW9kZWwucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0KLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydCBmaW5kQ2hpbGRCeU1vZGVsKE9iamVjdCBtb2RlbCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgY2hpbGQgPSAoRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkLmdldE1vZGVsKCkgPT0gbW9kZWwpIHsKLQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFydFRvRWRpdChDb2xsZWN0aW9uIHBhcnRzVG9FZGl0LCBPYmplY3Qgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSBmaW5kQ2hpbGRCeU1vZGVsKG5vZGUpOwotCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQmFzZUVkaXRQYXJ0KSB7Ci0JCQkJRGlyZWN0RWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIgPSAoKEJhc2VFZGl0UGFydCkgZWRpdFBhcnQpCi0JCQkJCQkuZ2V0RGlyZWN0RWRpdE1hbmFnZXIoKTsKLQkJCQlpZiAoZWRpdE1hbmFnZXIgaW5zdGFuY2VvZiBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJCSYmICgoVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyKSBlZGl0TWFuYWdlcikKLQkJCQkJCQkJLnZhbGlkYXRlKCgoTmFtZWROb2RlKSBub2RlKS5nZXROYW1lKCkpICE9IG51bGwpIHsKLQkJCQkJcGFydHNUb0VkaXQuYWRkKGVkaXRQYXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTm9kZUNvbnRhaW5lci5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fTE9DQVRJT046Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOgotCQkJcmVmcmVzaFZpc3VhbHMoKTsKLQkJCWJyZWFrOwotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCXJlZnJlc2hTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJcmVmcmVzaFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJcmVmcmVzaENoaWxkcmVuKCk7Ci0KLQkJCUxpc3QgcGFydHNUb0VkaXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWFkZFBhcnRUb0VkaXQocGFydHNUb0VkaXQsIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWFkZFBhcnRUb0VkaXQocGFydHNUb0VkaXQsIGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuaXNGb2N1c0NvbnRyb2woKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhcnRzVG9FZGl0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlCYXNlRWRpdFBhcnQgZWRpdFBhcnQgPSAoQmFzZUVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLQkJCQkJZWRpdFBhcnQucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBnZXRNb2RlbCgpOwotCQlEaW1lbnNpb24gc2l6ZSA9IG5ldyBEaW1lbnNpb24obm9kZS5nZXRXaWR0aCgpLCBub2RlLmdldEhlaWdodCgpKTsKLQkJaWYgKHNpemUgPT0gbnVsbCkgewotCQkJc2l6ZSA9IG5ldyBEaW1lbnNpb24oNjAsIDEwMCk7Ci0JCX0KLQkJUG9pbnQgbG9jID0gbm9kZS5nZXRMb2NhdGlvbigpOwotCQlpZiAobG9jID09IG51bGwpIHsKLQkJCWxvYyA9IG5ldyBQb2ludCgxMCwgMTApOwotCQl9Ci0JCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZShsb2MsIHNpemUpOwotCi0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIHIpOwotCi0JCWlmIChjUm91dGVyID09IG51bGwpIHsKLQkJCUNvbm5lY3Rpb25MYXllciBjTGF5ZXIgPSAoQ29ubmVjdGlvbkxheWVyKSBnZXRMYXllcihDT05ORUNUSU9OX0xBWUVSKTsKLQkJCUZhblJvdXRlciByb3V0ZXIgPSBuZXcgRmFuUm91dGVyKCk7Ci0JCQlyb3V0ZXIuc2V0U2VwYXJhdGlvbigzMCk7Ci0JCQljUm91dGVyID0gbmV3IEJlbmRwb2ludENvbm5lY3Rpb25Sb3V0ZXIoKTsKLQkJCXJvdXRlci5zZXROZXh0Um91dGVyKGNSb3V0ZXIpOwotCQkJY0xheWVyLnNldENvbm5lY3Rpb25Sb3V0ZXIocm91dGVyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAoKE5vZGVDb250YWluZXIpIGdldE1vZGVsKCkpLmdldE5vZGVzKCk7Ci0JfQotCQotCS8qKgotCSAqIE9ubHkgdXNlZnVsIGluIGNhc2Ugb2YgQURELiBQbGFjZWQgaGVyZSBpbiBvcmRlciB0byBpbnZva2UgaW4gc3ViIGNsYXNzZXMuCi0JICogVE9ETzogIE1vdmUgdGhpcyBtZXRob2QgdG8gdXRpbGl0eSBjbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwRGlhZ3JhbShFZGl0UGFydCBwYXJ0KSB7Ci0JCUVkaXRQYXJ0IGRlcCA9IChFZGl0UGFydCkgcGFydC5nZXRQYXJlbnQoKTsKLQkJaWYoZGVwIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgKXsKLQkJCQotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgYWRkID0gKChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydClkZXApOwotCQkJaWYoISgoRGlhZ3JhbSlhZGQuZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpKXsKLQkJCQlhZGQuZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCkuYWRkQWxsKGRlcC5nZXRDaGlsZHJlbigpKTsKLQkJCi0JCQkJLy8gY2xlYW4gdXAgdGhlIGRpYWdyYW0KLQkJCQlEZWZhdWx0RWRpdERvbWFpbiBlZGl0aW5nRG9tYWluID0gbmV3IERlZmF1bHRFZGl0RG9tYWluKG51bGwpOwotCQkJCUFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5ID0gbmV3IEFjdGlvblJlZ2lzdHJ5KCk7Ci0JCQotCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlIGFjdGlvblNlcnZpY2UgPSBuZXcgRGlhZ3JhbUFjdGlvblNlcnZpY2UoCi0JCQkJCQkoR3JhcGhpY2FsVmlld2VyKWdldFBhcmVudCgpLmdldFZpZXdlcigpLCBlZGl0aW5nRG9tYWluLCBhY3Rpb25SZWdpc3RyeSk7Ci0JCQkJYWN0aW9uU2VydmljZS5yZWdpc3RlclZlcnRpY2FsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCk7Ci0JCQotCQkJCURpYWdyYW1VcGRhdGVTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRGlhZ3JhbVVwZGF0ZVNlcnZpY2UoCi0JCQkJCQkoR3JhcGhpY2FsVmlld2VyKWdldFBhcmVudCgpLmdldFZpZXdlcigpLCBlZGl0aW5nRG9tYWluLCBhY3Rpb25SZWdpc3RyeSk7Ci0JCQkJc2VydmljZS5jbGVhblVwRGlhZ3JhbSgpOwotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NTk4N2Y1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ob2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNob3Bib3hBbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ3JlYXRlTGlua0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5SZWNvbm5lY3RMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkNvbm5lY3Rpb25BbmNob3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbXBvbmVudEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5HcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLlJlY29ubmVjdFJlcXVlc3Q7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgY29ubmVjdGlvbnMsIGFuZCBpbnN0YWxscyBFZGl0UG9saWN5IGZvciAoCi0gKiB7QGxpbmsgRWRpdFBvbGljeS5DT01QT05FTlRfUk9MRX0sIHtAbGluayBFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEV9LAotICoge0BsaW5rRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRX0pCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQgaW1wbGVtZW50cwotCQlvcmcuZWNsaXBzZS5nZWYuTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBOb2RlRWRpdFBhcnQoTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT01QT05FTlRfUk9MRSwgbmV3IENvbXBvbmVudEVkaXRQb2xpY3koKSB7Ci0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCQkJQm9vbGVhbiBib29sID0gKEJvb2xlYW4pIGRlbGV0ZVJlcXVlc3QuZ2V0RXh0ZW5kZWREYXRhKCkuZ2V0KAotCQkJCQkJRGVsZXRlQ29tbWFuZC5LRVlfUEVSTV9ERUxFVEUpOwotCQkJCWJvb2xlYW4gcGVybURlbGV0ZSA9IGJvb2wgPT0gbnVsbCA/IGZhbHNlIDogYm9vbC5ib29sZWFuVmFsdWUoKTsKLQkJCQlEZWxldGVDb21tYW5kIGNtZCA9IG5ldyBEZWxldGVDb21tYW5kKHBlcm1EZWxldGUpOwotCQkJCWNtZC5zZXRQYXJ0VG9CZURlbGV0ZWQoZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCQkJCXJldHVybiBjbWQ7Ci0JCQl9Ci0JCX0pOwotCi0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSB7Ci0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENvbm5lY3Rpb25Db21wbGV0ZUNvbW1hbmQoCi0JCQkJCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJQ3JlYXRlTGlua0NvbW1hbmQgY21kID0gKENyZWF0ZUxpbmtDb21tYW5kKSByZXF1ZXN0Ci0JCQkJCQkJCS5nZXRTdGFydENvbW1hbmQoKTsKLQkJCQkJCWNtZC5zZXRUYXJnZXQoKE5vZGUpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0RWRpdFBhcnQoKSBpbnN0YW5jZW9mIENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSB7Ci0JCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0RWRpdFBhcnQoKS5lcXVhbHMoCi0JCQkJCQkJCQlyZXF1ZXN0LmdldFNvdXJjZUVkaXRQYXJ0KCkpKSB7Ci0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQljbWQKLQkJCQkJCQkJCQkuc2V0VGFyZ2V0RW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJCQkJLmdldFRhcmdldEVkaXRQYXJ0KCkpCi0JCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24ocmVxdWVzdAotCQkJCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJcmV0dXJuIGNtZDsKLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENvbm5lY3Rpb25DcmVhdGVDb21tYW5kKAotCQkJCQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUNyZWF0ZUxpbmtDb21tYW5kIGNtZCA9IG5ldyBDcmVhdGVMaW5rQ29tbWFuZCgKLQkJCQkJCQkJTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5rKCksCi0JCQkJCQkJCShOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0JCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXRFZGl0UGFydCgpIGluc3RhbmNlb2YgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHsKLQkJCQkJCQljbWQKLQkJCQkJCQkJCS5zZXRTb3VyY2VFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkJCS5nZXRUYXJnZXRFZGl0UGFydCgpKQotCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24ocmVxdWVzdC5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNtZC5zZXRTb3VyY2VFbmRQb2ludChyZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfQotCQkJCQkJcmVxdWVzdC5zZXRTdGFydENvbW1hbmQoY21kKTsKLQotCQkJCQkJcmV0dXJuIGNtZDsKLQotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVjb25uZWN0U291cmNlQ29tbWFuZCgKLQkJCQkJCQlSZWNvbm5lY3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSByZXF1ZXN0LmdldENvbm5lY3Rpb25FZGl0UGFydCgpCi0JCQkJCQkJCS5nZXRNb2RlbCgpOwotCQkJCQkJUmVjb25uZWN0TGlua0NvbW1hbmQgY21kID0gbmV3IFJlY29ubmVjdExpbmtDb21tYW5kKAotCQkJCQkJCQlsaW5rLCAoTm9kZSkgZ2V0SG9zdCgpLmdldE1vZGVsKCksIHRydWUpOwotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWNtZC5zZXRFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpLmdldExvY2F0aW9uKHJlcXVlc3QKLQkJCQkJCQkJCS5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXJldHVybiBjbWQ7Ci0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZWNvbm5lY3RUYXJnZXRDb21tYW5kKAotCQkJCQkJCVJlY29ubmVjdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJTGluayBsaW5rID0gKExpbmspIHJlcXVlc3QuZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCkKLQkJCQkJCQkJLmdldE1vZGVsKCk7Ci0JCQkJCQlSZWNvbm5lY3RMaW5rQ29tbWFuZCBjbWQgPSBuZXcgUmVjb25uZWN0TGlua0NvbW1hbmQoCi0JCQkJCQkJCWxpbmssIChOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSwgZmFsc2UpOwotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWNtZC5zZXRFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpLmdldExvY2F0aW9uKHJlcXVlc3QKLQkJCQkJCQkJCS5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gY21kOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbnVsbCk7Ci0JCS8vIEJ5IGRlZmF1bHQsIGNhbid0IGFkZCBhbnl0aGluZyB0byBhIG5vZGUKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVsZXRlRGVwZW5kYW50Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIChOb2RlKSBnZXRNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsU291cmNlQ29ubmVjdGlvbnMoKSB7Ci0JCXJldHVybiBnZXROb2RlKCkuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsVGFyZ2V0Q29ubmVjdGlvbnMoKSB7Ci0JCXJldHVybiBnZXROb2RlKCkuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlyZXR1cm4gbmV3IENob3Bib3hBbmNob3IoZ2V0RmlndXJlKCkpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBuZXcgQ2hvcGJveEFuY2hvcihnZXRGaWd1cmUoKSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcigKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ2hvcGJveEFuY2hvcihnZXRGaWd1cmUoKSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTm9kZS5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fTE9DQVRJT046Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOgotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19IRUlHSFQ6CQkJCi0JCQlyZWZyZXNoVmlzdWFscygpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1JFQURfT05MWToKLQkJCXJlZnJlc2hWaXN1YWxzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRUYXJnZXRDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubiA9IChDb25uZWN0aW9uRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJCWNvbm4ucmVmcmVzaCgpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM6Ci0JCQlyZWZyZXNoU291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJcmVmcmVzaFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlSZWN0YW5nbGUgY29uc3RyYWludCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgLTEsIC0xKTsKLQkJaWYgKGdldE5vZGUoKS5nZXRMb2NhdGlvbigpICE9IG51bGwpCi0JCQljb25zdHJhaW50LnNldExvY2F0aW9uKGdldE5vZGUoKS5nZXRMb2NhdGlvbigpKTsKLQkJY29uc3RyYWludC53aWR0aCA9IGdldE5vZGUoKS5nZXRXaWR0aCgpOwotCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLAotCQkJCWdldEZpZ3VyZSgpLCBjb25zdHJhaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2FjdGl2YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJKChOb2RlKSBnZXRNb2RlbCgpKS5hZGRDb25zdW1lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2RlYWN0aXZhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCSgoTm9kZSkgZ2V0TW9kZWwoKSkucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUmFpc2VkTWFyZ2luQm9yZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUmFpc2VkTWFyZ2luQm9yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0MmQwYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1JhaXNlZE1hcmdpbkJvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2UgIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5Lkluc2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqICBBIGJvcmRlciB3aXRoIGEgcmFpc2VkIG1hcmdpbi4KLSAqICAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmFpc2VkTWFyZ2luQm9yZGVyIGV4dGVuZHMgTWFyZ2luQm9yZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEluc2V0cyBERUZBVUxUX0lOU0VUUyA9IG5ldyBJbnNldHMoMTAsIDEwLCAxMCwgMTApOwotCi0JcHVibGljIFJhaXNlZE1hcmdpbkJvcmRlcigpIHsKLQkJdGhpcyhERUZBVUxUX0lOU0VUUyk7Ci0JfQotCi0JcHVibGljIFJhaXNlZE1hcmdpbkJvcmRlcihJbnNldHMgaW5zZXRzKSB7Ci0JCXN1cGVyKGluc2V0cyk7Ci0JfQotCi0JcHVibGljIFJhaXNlZE1hcmdpbkJvcmRlcihpbnQgdCwgaW50IGwsIGludCBiLCBpbnQgcikgewotCQlzdXBlcih0LCBsLCBiLCByKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Cb3JkZXIjZ2V0SW5zZXRzKElGaWd1cmUpCi0JICovCi0JcHVibGljIEluc2V0cyBnZXRJbnNldHMoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJcmV0dXJuIGluc2V0czsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQm9yZGVyI2lzT3BhcXVlKCkKLQkgKi8JCi0JcHVibGljIGJvb2xlYW4gaXNPcGFxdWUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNwYWludChJRmlndXJlLCBHcmFwaGljcywgSW5zZXRzKQotCSAqLwotCXB1YmxpYyB2b2lkIHBhaW50KElGaWd1cmUgZmlndXJlLCBHcmFwaGljcyBnLCBJbnNldHMgaW5zZXRzKSB7Ci0JCWcuc2V0TGluZVN0eWxlKEdyYXBoaWNzLkxJTkVfU09MSUQpOwotCQlnLnNldExpbmVXaWR0aCgxKTsKLQkJZy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYnV0dG9uTGlnaHRlc3QpOwotCQlSZWN0YW5nbGUgciA9IGdldFBhaW50UmVjdGFuZ2xlKGZpZ3VyZSwgaW5zZXRzKTsKLQkJci5yZXNpemUoLTEsIC0xKTsKLQkJZy5kcmF3TGluZShyLngsIHIueSwgci5yaWdodCgpLCByLnkpOwotCQlnLmRyYXdMaW5lKHIueCwgci55LCByLngsIHIuYm90dG9tKCkpOwotCQlnLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5idXR0b25EYXJrZXIpOwotCQlnLmRyYXdMaW5lKHIueCwgci5ib3R0b20oKSwgci5yaWdodCgpLCByLmJvdHRvbSgpKTsKLQkJZy5kcmF3TGluZShyLnJpZ2h0KCksIHIueSwgci5yaWdodCgpLCByLmJvdHRvbSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9SZWxhdGl2ZVhZQW5jaG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUmVsYXRpdmVYWUFuY2hvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZGNiNzVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9SZWxhdGl2ZVhZQW5jaG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Q29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBQcm92aWRlcyByZWxhdGl2ZSBhbmNob3IgZm9yIGEgZmlndXJlJ3MgbG9jYXRpb24uIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVsYXRpdmVYWUFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwcml2YXRlIFBvaW50IHJlbGF0aXZlTG9jYXRpb247Ci0KLQlwdWJsaWMgUmVsYXRpdmVYWUFuY2hvcihJRmlndXJlIGZpZ3VyZSwgUG9pbnQgbG9jYXRpb24sIGJvb2xlYW4gaXNSZWxhdGl2ZSkgewotCQlzdXBlcihmaWd1cmUpOwotCQlyZWxhdGl2ZUxvY2F0aW9uID0gbG9jYXRpb24uZ2V0Q29weSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3IjZ2V0TG9jYXRpb24oUG9pbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlQb2ludCBwID0gcmVsYXRpdmVMb2NhdGlvbi5nZXRDb3B5KCk7Ci0JCVJlY3RhbmdsZSByID0gZ2V0T3duZXIoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCXAucGVyZm9ybVRyYW5zbGF0ZShyLngsIHIueSk7Ci0JCWdldE93bmVyKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShwKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yI2dldFJlZmVyZW5jZVBvaW50KCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0JCXJldHVybiBnZXRMb2NhdGlvbihudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0N2I5MWQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZsb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXMuUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCBpcyBjb250YWluZXIgd2l0aCB7QGxpbmsgRmxvd0xheW91dH0sIGFuZCBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZy9yZW1vdmluZyBjaGlsZCBlZGl0cGFydC4gCi0gKiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCBleHRlbmRzIE5vZGVDb250YWluZXJFZGl0UGFydCB7Ci0KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJHX0NPTE9SID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsCi0vLwkJCTI1NSwgMTU2KTsKLQkKLQlwcml2YXRlIHN0YXRpYyAgQ29sb3IgQkdfQ09MT1I7Ci0JcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQoUm9sZVRhc2tDb21wb3NpdGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJRmlndXJlIGZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLQkJRmxvd0xheW91dCBsYXlvdXQgPSBuZXcgRmxvd0xheW91dCgpOwotCQlsYXlvdXQuc2V0TWlub3JTcGFjaW5nKDIwKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJZmlndXJlLnNldEJvcmRlcihuZXcgUmFpc2VkTWFyZ2luQm9yZGVyKCkpOwotCQlmaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKGdldEJhY2tncm91bmRDb2xvcigpKTsKLQkJZmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0I2hhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5vZGVDb250YWluZXIuY2xhc3MpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzoKLQkJCXJlZnJlc2hDaGlsZHJlbigpOwotCi0JCQkvLyByZWZyZXNoIGRpYWdyYW0ncyBjaGlsZHJlbgotCQkJRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gZ2V0UGFyZW50KCk7Ci0vLwkJCWlmIChkaWFncmFtRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgewotLy8JCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIGRpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBkaWFncmFtRWRpdFBhcnQKLS8vCQkJCQkJLmdldE1vZGVsKCk7Ci0vLwotLy8JCQkJaWYgKCFHcmFwaGljYWxEYXRhSGVscGVyLmlzQXV0b0xheW91dChkaWFncmFtKSkgewotLy8JCQkJCSgoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGRpYWdyYW1FZGl0UGFydCkKLS8vCQkJCQkJCS5nZXRSZWNlbnRseUFkZGVkUGFydHMoKS5hZGRBbGwoCi0vLwkJCQkJCQkJCWRpYWdyYW1FZGl0UGFydC5nZXRDaGlsZHJlbigpKTsKLS8vCQkJCQlEZWZhdWx0RWRpdERvbWFpbiBlZCA9IChEZWZhdWx0RWRpdERvbWFpbikgZGlhZ3JhbUVkaXRQYXJ0Ci0vLwkJCQkJCQkuZ2V0Vmlld2VyKCkuZ2V0RWRpdERvbWFpbigpOwotLy8JCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGVkLmdldEVkaXRvclBhcnQoKTsKLS8vCQkJCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgZWRpdG9yIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yKSB7Ci0vLwkJCQkJCSgoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yKSBlZGl0b3IpLmNsZWFuVXBEaWFncmFtKCk7Ci0vLwkJCQkJfQotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlkaWFncmFtRWRpdFBhcnQucmVmcmVzaCgpOwotLy8JCQkJfQotLy8JCQl9Ci0JCQlkaWFncmFtRWRpdFBhcnQucmVmcmVzaCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQjY3JlYXRlRWRpdFBvbGljaWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBuZXcgUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT01QT05FTlRfUk9MRSwgbnVsbCk7Ci0JfQotCXByb3RlY3RlZCBDb2xvciBnZXRCYWNrZ3JvdW5kQ29sb3IoKXsKLQkJaWYoQkdfQ09MT1IgIT0gbnVsbCkgcmV0dXJuIEJHX0NPTE9SOwotCQkKLQkJaWYoQkdfQ09MT1IgPT0gbnVsbCl7Ci0JCQlTdHJpbmcgY29sb3JTdHJpbmcgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5BRERfUk9MRV9UQVNLU19CT1hfQkdfQ09MT1JfUkdCKTsKLQkJCWlmKGNvbG9yU3RyaW5nICE9IG51bGwgJiYgY29sb3JTdHJpbmcubGVuZ3RoKCkgPiAwKXsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb2xvclN0cmluZywgIiwiKTsKLQkJCQlpbnQgciA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlpbnQgZyA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlpbnQgYiA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlCR19DT0xPUiA9IG5ldyBDb2xvcihudWxsLCByLGcsYik7Ci0JCQkJcmV0dXJuIEJHX0NPTE9SOwotCQkJfQotCQl9Ci0JCWlmKEJHX0NPTE9SID09IG51bGwpewotCQkJQkdfQ09MT1IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NSwKLQkJCQkJCQkyNTUsIDE1Nik7Ci0JCX0KLQkJcmV0dXJuIEJHX0NPTE9SOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9TdGFydE5vZGVFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N0YXJ0Tm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFhYWJjYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N0YXJ0Tm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgY3JlYXRpbmcgZmlndXJlIGZvciB7QGxpbmsgVHlwZWROb2RlLlNUQVJUfQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RhcnROb2RlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlRWRpdFBhcnQgewotCi0JcHVibGljIFN0YXJ0Tm9kZUVkaXRQYXJ0KFR5cGVkTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdFBvbGljeSBjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZUZpZ3VyZSgpCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlFbGxpcHNlIGYgPSBuZXcgRWxsaXBzZSgpOwotCQlmLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0JCWYuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnJlZCk7Ci0JCWYuc2V0U2l6ZSgyMCwgMjApOwotCQlyZXR1cm4gZjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9TeW5jaEJhck5vZGVFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N5bmNoQmFyTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyZmMwMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N5bmNoQmFyTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuQ29ubmVjdGlvbkFuY2hvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Mb2NhdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIGNyZWF0aW5nIGZpZ3VyZSBhbmQgY3JlYXRpbmcgcmVsYXRpdmUgYW5jaG9ycwotICogZm9yIHtAbGluayBUeXBlZE5vZGUuU1lOQ19CQVJ9Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3luY2hCYXJOb2RlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlRWRpdFBhcnQgaW1wbGVtZW50cwotCQlDb25uZWN0aW9uQW5jaG9yTG9jYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xvciBCR19DT0xPUiA9IG5ldyBDb2xvcihudWxsLCA1MSwgMTAyLCAxMDIpOwotCi0JcHJpdmF0ZSBQb2ludCByZWNlbnRUYXJnZXRFbmRQb2ludDsKLQotCXByaXZhdGUgUG9pbnQgcmVjZW50U291cmNlRW5kUG9pbnQ7Ci0KLQlwdWJsaWMgU3luY2hCYXJOb2RlRWRpdFBhcnQoVHlwZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJUmVjdGFuZ2xlRmlndXJlIGYgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0JCWYuc2V0QmFja2dyb3VuZENvbG9yKEJHX0NPTE9SKTsKLQkJZi5zZXRTaXplKDEwMCwgNSk7Ci0JCXJldHVybiBmOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlib29sZWFuIGlzUmVsYXRpdmUgPSBmYWxzZTsKLQkJUG9pbnQgc291cmNlRW5kUG9pbnQgPSBudWxsOwotCQlpZiAocmVjZW50U291cmNlRW5kUG9pbnQgPT0gbnVsbCkgewotCQkJLy8gZ2V0IHNvdXJjZSBlbmQgcG9pbnQgZnJvbSB0aGUgbW9kZWwKLQkJCUxpbmsgbGluayA9IChMaW5rKSBjb25uZWN0aW9uLmdldE1vZGVsKCk7Ci0JCQlzb3VyY2VFbmRQb2ludCA9IGxpbmsuZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCWlzUmVsYXRpdmUgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJc291cmNlRW5kUG9pbnQgPSByZWNlbnRTb3VyY2VFbmRQb2ludDsKLQkJfQotCQlpZiAoc291cmNlRW5kUG9pbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBSZWxhdGl2ZVhZQW5jaG9yKGdldEZpZ3VyZSgpLCBzb3VyY2VFbmRQb2ludCwgaXNSZWxhdGl2ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoY29ubmVjdGlvbik7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUG9pbnQgcCA9IG51bGw7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHsKLQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcSA9IChDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCkgcmVxdWVzdDsKLQkJCXAgPSByZXEuZ2V0TG9jYXRpb24oKTsKLQkJfSBlbHNlIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KSB7Ci0JCQlwID0gKChMb2NhdGlvblJlcXVlc3QpIHJlcXVlc3QpLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJcmVjZW50U291cmNlRW5kUG9pbnQgPSBnZXRMb2NhdGlvbihwKTsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgcmVjZW50U291cmNlRW5kUG9pbnQsIHRydWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKHJlcXVlc3QpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlib29sZWFuIGlzUmVsYXRpdmUgPSBmYWxzZTsKLQkJUG9pbnQgdGFyZ2V0RW5kUG9pbnQgPSBudWxsOwotCQlpZiAocmVjZW50VGFyZ2V0RW5kUG9pbnQgPT0gbnVsbCkgewotCQkJTGluayBsaW5rID0gKExpbmspIGNvbm5lY3Rpb24uZ2V0TW9kZWwoKTsKLQkJCXRhcmdldEVuZFBvaW50ID0gbGluay5nZXRUYXJnZXRFbmRQb2ludCgpOwotCQkJaXNSZWxhdGl2ZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQl0YXJnZXRFbmRQb2ludCA9IHJlY2VudFRhcmdldEVuZFBvaW50OwotCQl9Ci0JCWlmICh0YXJnZXRFbmRQb2ludCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHRhcmdldEVuZFBvaW50LCBpc1JlbGF0aXZlKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKGNvbm5lY3Rpb24pOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVBvaW50IHAgPSBudWxsOwotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSB7Ci0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXEgPSAoQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHJlcXVlc3Q7Ci0JCQlwID0gcmVxLmdldExvY2F0aW9uKCk7Ci0JCX0gZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkgewotCQkJcCA9ICgoTG9jYXRpb25SZXF1ZXN0KSByZXF1ZXN0KS5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXJlY2VudFRhcmdldEVuZFBvaW50ID0gZ2V0TG9jYXRpb24ocCk7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHJlY2VudFRhcmdldEVuZFBvaW50LCB0cnVlKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5Db25uZWN0aW9uQW5jaG9yTG9jYXRvciNnZXRMb2NhdGlvbihQb2ludCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCXJldHVybiBDbG9zZXN0QW5jaG9yLmdldExvY2F0aW9uKGdldEZpZ3VyZSgpLCByZWZlcmVuY2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NjVlN2RiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9UZXh0RmlndXJlQ2VsbEVkaXRvckxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIENvbnN0cmFpbnQgZm9yIFRleHRGbG93IHBsYWNpbmcuCi0gKiBAYXV0aG9yIEphbWVzIFRoYXJpbwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGV4dEZpZ3VyZUNlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JcHJpdmF0ZSBUZXh0RmlndXJlIGZpZ3VyZTsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvciBmb3IgdGhlIGdpdmVuIHRleHQgZmlndXJlCi0JICogQHBhcmFtIHRmCi0JICovCi0JcHVibGljIFRleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvcihUZXh0RmlndXJlIHRmKSB7Ci0JCXNldEZpZ3VyZSh0Zik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDZWxsRWRpdG9yTG9jYXRvciNyZWxvY2F0ZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKSB7Ci0JCVRleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvci5kb0xvY2F0ZShjZWxsZWRpdG9yLCBmaWd1cmUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkb0xvY2F0ZShDZWxsRWRpdG9yIGNlLCBUZXh0RmlndXJlIGZpZykgewotCQlUZXh0IHRleHQgPSAoVGV4dCkgY2UuZ2V0Q29udHJvbCgpOwotCQlTdHJpbmcgbiA9IChTdHJpbmcpIGNlLmdldFZhbHVlKCk7Ci0JCUdDIGdjID0gbmV3IEdDKHRleHQpOwotCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudChuKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlpZiAoc2l6ZS54ICE9IDApCi0JCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZShzaXplLngsIFNXVC5ERUZBVUxUKTsKLQkJdGV4dC5zZXRTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJUmVjdGFuZ2xlIHRleHRCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Q2xpZW50QXJlYSgpLngsIHRleHQKLQkJCQkuZ2V0Q2xpZW50QXJlYSgpLnksIHRleHQuZ2V0Q2xpZW50QXJlYSgpLndpZHRoLCB0ZXh0Ci0JCQkJLmdldENsaWVudEFyZWEoKS5oZWlnaHQpOwotCQlSZWN0YW5nbGUgZmlnQm91bmRzID0gZmlnLmdldENsaWVudEFyZWEoKTsKLQkJZmlnLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZmlnQm91bmRzKTsKLQkJaW50IGRlbHRhID0gKGZpZ0JvdW5kcy53aWR0aCAtIHRleHRCb3VuZHMud2lkdGgpIC8gMjsKLQkJaW50IHkgPSBmaWcuZ2V0VGV4dEZsb3dQYWdlKCkuZ2V0TG9jYXRpb24oKS55OwotCQl0ZXh0LnNldExvY2F0aW9uKGZpZ0JvdW5kcy54ICsgZGVsdGEsIHkpOwotCX0KLQotCXB1YmxpYyBUZXh0RmlndXJlIGdldEZpZ3VyZSgpIHsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWd1cmUoVGV4dEZpZ3VyZSBmaWd1cmUpIHsKLQkJdGhpcy5maWd1cmUgPSBmaWd1cmU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVGV4dEZpZ3VyZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVGV4dEZpZ3VyZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5Mzk2ODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RleHRGaWd1cmVEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBNYW5hZ2VzIGRpcmVjdCBlZGl0aW5nIGFuZCBjcmVhdGluZyBjZWxsZWRpdG9yIGZvciB7QGxpbmsgVGV4dEZpZ3VyZX0KLSAqIAotICogQGF1dGhvciBKYW1lcyBUaGFyaW8KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRleHRGaWd1cmVEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyIHsKLQotCUZvbnQgc2NhbGVkRm9udDsKLQotCXByb3RlY3RlZCBWZXJpZnlMaXN0ZW5lciB2ZXJpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBUZXh0RmlndXJlIGZpZ3VyZSA9IG51bGw7Ci0KLQlwdWJsaWMgVGV4dEZpZ3VyZURpcmVjdEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwKLQkJCUNsYXNzIGVkaXRvclR5cGUsIENlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IsIFRleHRGaWd1cmUgZmlndXJlKSB7Ci0JCXN1cGVyKHNvdXJjZSwgZWRpdG9yVHlwZSwgbG9jYXRvcik7Ci0JCXRoaXMuZmlndXJlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQlicmluZ0Rvd24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oYm9vbGVhbiBjaGVjaykgewotCQkvLyBUaGlzIG1ldGhvZCBtaWdodCBiZSByZS1lbnRlcmVkIHdoZW4gc3VwZXIuYnJpbmdEb3duKCkgaXMgY2FsbGVkLgotCQlGb250IGRpc3Bvc2VGb250ID0gc2NhbGVkRm9udDsKLQkJc2NhbGVkRm9udCA9IG51bGw7Ci0JCXN1cGVyLmJyaW5nRG93bigpOwotCQlpZiAoZGlzcG9zZUZvbnQgIT0gbnVsbCkKLQkJCWRpc3Bvc2VGb250LmRpc3Bvc2UoKTsKLQkJaWYgKGNoZWNrKSB7Ci0JCQlOYW1lZE5vZGUgbm9kZSA9IChOYW1lZE5vZGUpIGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCU9iamVjdCB3YmVsZW1lbnQgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCWlmICh3YmVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpKSB7Ci0JCQkJCW5hbWUgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpOwotCQkJCX0KLQotCQkJfQotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKQotCQkJCQkJLmFzeW5jRXhlYygKLQkJCQkJCQkJbmV3IFByb21wdEVkaXQoCi0JCQkJCQkJCQkJKE5hbWVkTm9kZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpLAotCQkJCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5lcnJfbmFtZV9lbXB0eSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNpbml0Q2VsbEVkaXRvcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENlbGxFZGl0b3IoKSB7Ci0JCVRleHRDZWxsRWRpdG9yIGVkaXRvciA9IChUZXh0Q2VsbEVkaXRvcikgZ2V0Q2VsbEVkaXRvcigpOwotCQllZGl0b3Iuc2V0U3R5bGUoU1dULk1VTFRJKTsKLQkJVGV4dCB0ID0gKFRleHQpIGVkaXRvci5nZXRDb250cm9sKCk7Ci0JCXZlcmlmeUxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJCVN0cmluZyBvbGRUZXh0ID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQkJU3RyaW5nIGxlZnRUZXh0ID0gb2xkVGV4dC5zdWJzdHJpbmcoMCwgZXZlbnQuc3RhcnQpOwotCQkJCVN0cmluZyByaWdodFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZyhldmVudC5lbmQsIG9sZFRleHQKLQkJCQkJCS5sZW5ndGgoKSk7Ci0JCQkJR0MgZ2MgPSBuZXcgR0ModGV4dCk7Ci0JCQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQobGVmdFRleHQgKyBldmVudC50ZXh0ICsgcmlnaHRUZXh0KTsKLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQkJaWYgKHNpemUueCAhPSAwKQotCQkJCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZShzaXplLngsIFNXVC5ERUZBVUxUKTsKLQkJCQlnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpLnNldFNpemUoc2l6ZS54LCBzaXplLnkpOwotCQkJfQotCQl9OwotCQl0LmFkZFZlcmlmeUxpc3RlbmVyKHZlcmlmeUxpc3RlbmVyKTsKLQkJU3RyaW5nIGluaXRpYWxMYWJlbFRleHQgPSAoKE5hbWVkTm9kZUVkaXRQYXJ0KSB0aGlzLmdldEVkaXRQYXJ0KCkpCi0JCQkJLmdldERpcmVjdEVkaXRUZXh0KCk7Ci0JCWVkaXRvci5zZXRWYWx1ZShpbml0aWFsTGFiZWxUZXh0KTsKLQkJdC5zZXRGb250KFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVCk7Ci0JCXQuc2VsZWN0QWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjdW5ob29rTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bmhvb2tMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnVuaG9va0xpc3RlbmVycygpOwotCQlpZiAoZ2V0Q2VsbEVkaXRvcigpICE9IG51bGwpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJaWYgKHZlcmlmeUxpc3RlbmVyICE9IG51bGwpCi0JCQkJdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0JCQl2ZXJpZnlMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSB0eHQKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQsIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2NvbW1pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tbWl0KCkgewotCQlTdHJpbmcgbXNnID0gdmFsaWRhdGUoKFN0cmluZykgZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCWJyaW5nRG93bihmYWxzZSk7Ci0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBQcm9tcHRFZGl0KChOYW1lZE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwgbXNnKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuY29tbWl0KCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByb21wdEVkaXQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLQkJcHJpdmF0ZSBOYW1lZE5vZGVFZGl0UGFydCBwYXJ0OwotCi0JCXByaXZhdGUgU3RyaW5nIG1zZzsKLQotCQlQcm9tcHRFZGl0KE5hbWVkTm9kZUVkaXRQYXJ0IHBhcnQsIFN0cmluZyBtc2cpIHsKLQkJCXRoaXMucGFydCA9IHBhcnQ7Ci0JCQl0aGlzLm1zZyA9IG1zZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU3RyaW5nIHRpdGxlID0gRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA7IC8vJE5PTi1OTFMtMSQKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOyAvLyROT04tTkxTLTEkCi0JCQlwYXJ0LnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RvcEFuY2hvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RvcEFuY2hvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZjgyODJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ub3BBbmNob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIENvbm5lY3Rpb24gYW5jaG9yIGZvciB0b3Agb2YgdGhlIGZpZ3VyZS4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLWNsYXNzIFRvcEFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwcml2YXRlIGludCBvZmZzZXQ7Ci0KLQlUb3BBbmNob3IoSUZpZ3VyZSBzb3VyY2UsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlSZWN0YW5nbGUgciA9IGdldE93bmVyKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlnZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCWludCBvZmYgPSBvZmZzZXQ7Ci0JCWlmIChvZmYgPT0gLTEpCi0JCQlvZmYgPSByLndpZHRoIC8gMjsKLQkJaWYgKHIuY29udGFpbnMocmVmZXJlbmNlKSB8fCByLnkgPCByZWZlcmVuY2UueSkKLQkJCXJldHVybiByLmdldEJvdHRvbUxlZnQoKS50cmFuc2xhdGUob2ZmLCAtMSk7Ci0JCWVsc2UKLQkJCXJldHVybiByLmdldFRvcExlZnQoKS50cmFuc2xhdGUob2ZmLCAwKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2NWEzNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1ZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotCi0vKioKLSAqIE1hbmFnZXMgZGlyZWN0IGVkaXRpbmcgYW5kIGNyZWF0aW5nIGNlbGwgZWRpdG9yIGZvciB0aGUge0BsaW5rIExhYmVsfQotICogYW5kIHZhbGlkYXRlcyB0aGUgaW5wdXQuIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyIHsKLQotCUZvbnQgc2NhbGVkRm9udDsKLQotCXByb3RlY3RlZCBWZXJpZnlMaXN0ZW5lciB2ZXJpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBMYWJlbCBhY3Rpdml0eUxhYmVsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBY3Rpdml0eURpcmVjdEVkaXRNYW5hZ2VyIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBFZGl0UGFydAotCSAqIEBwYXJhbSBlZGl0b3JUeXBlCi0JICogICAgICAgICAgICB0eXBlIG9mIGVkaXRvcgotCSAqIEBwYXJhbSBsb2NhdG9yCi0JICogICAgICAgICAgICB0aGUgQ2VsbEVkaXRvckxvY2F0b3IKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwKLQkJCUNsYXNzIGVkaXRvclR5cGUsIENlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IsIExhYmVsIGxhYmVsKSB7Ci0JCXN1cGVyKHNvdXJjZSwgZWRpdG9yVHlwZSwgbG9jYXRvcik7Ci0JCWFjdGl2aXR5TGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bigpIHsKLQkJYnJpbmdEb3duKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKGJvb2xlYW4gY2hlY2spIHsKLQkJLy8gVGhpcyBtZXRob2QgbWlnaHQgYmUgcmUtZW50ZXJlZCB3aGVuIHN1cGVyLmJyaW5nRG93bigpIGlzIGNhbGxlZC4KLQkJRm9udCBkaXNwb3NlRm9udCA9IHNjYWxlZEZvbnQ7Ci0JCXNjYWxlZEZvbnQgPSBudWxsOwotCQlzdXBlci5icmluZ0Rvd24oKTsKLQkJaWYgKGRpc3Bvc2VGb250ICE9IG51bGwpCi0JCQlkaXNwb3NlRm9udC5kaXNwb3NlKCk7Ci0JCWlmIChjaGVjaykgewotCQkJTmFtZWROb2RlIG5vZGUgPSAoTmFtZWROb2RlKSBnZXRFZGl0UGFydCgpLmdldE1vZGVsKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0TmFtZSgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQlPYmplY3Qgd2JlbGVtZW50ID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQlpZiAod2JlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KSkgewotCQkJCQluYW1lID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCURpc3BsYXkKLQkJCQkJCS5nZXRDdXJyZW50KCkKLQkJCQkJCS5hc3luY0V4ZWMoCi0JCQkJCQkJCW5ldyBQcm9tcHRFZGl0KAotCQkJCQkJCQkJCShOYW1lZE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwKLQkJCQkJCQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuZXJyX25hbWVfZW1wdHkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjaW5pdENlbGxFZGl0b3IoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDZWxsRWRpdG9yKCkgewotCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJdmVyaWZ5TGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCQkJU3RyaW5nIG9sZFRleHQgPSB0ZXh0LmdldFRleHQoKTsKLQkJCQlTdHJpbmcgbGVmdFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZygwLCBldmVudC5zdGFydCk7Ci0JCQkJU3RyaW5nIHJpZ2h0VGV4dCA9IG9sZFRleHQuc3Vic3RyaW5nKGV2ZW50LmVuZCwgb2xkVGV4dAotCQkJCQkJLmxlbmd0aCgpKTsKLQkJCQlHQyBnYyA9IG5ldyBHQyh0ZXh0KTsKLQkJCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudChsZWZ0VGV4dCArIGV2ZW50LnRleHQgKyByaWdodFRleHQpOwotCQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQlpZiAoc2l6ZS54ICE9IDApCi0JCQkJCXNpemUgPSB0ZXh0LmNvbXB1dGVTaXplKHNpemUueCwgU1dULkRFRkFVTFQpOwotCQkJCWdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCkuc2V0U2l6ZShzaXplLngsIHNpemUueSk7Ci0JCQl9Ci0JCX07Ci0JCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCi0JCVN0cmluZyBpbml0aWFsTGFiZWxUZXh0ID0gYWN0aXZpdHlMYWJlbC5nZXRUZXh0KCk7Ci0JCWdldENlbGxFZGl0b3IoKS5zZXRWYWx1ZShpbml0aWFsTGFiZWxUZXh0KTsKLQkJSUZpZ3VyZSBmaWd1cmUgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKS5nZXRGaWd1cmUoKTsKLQkJc2NhbGVkRm9udCA9IGZpZ3VyZS5nZXRGb250KCk7Ci0JCUZvbnREYXRhIGRhdGEgPSBzY2FsZWRGb250LmdldEZvbnREYXRhKClbMF07Ci0JCURpbWVuc2lvbiBmb250U2l6ZSA9IG5ldyBEaW1lbnNpb24oMCwgZGF0YS5nZXRIZWlnaHQoKSk7Ci0JCWFjdGl2aXR5TGFiZWwudHJhbnNsYXRlVG9BYnNvbHV0ZShmb250U2l6ZSk7Ci0JCWRhdGEuc2V0SGVpZ2h0KGZvbnRTaXplLmhlaWdodCk7Ci0JCXNjYWxlZEZvbnQgPSBuZXcgRm9udChudWxsLCBkYXRhKTsKLQotCQl0ZXh0LnNldEZvbnQoc2NhbGVkRm9udCk7Ci0JCXRleHQuc2VsZWN0QWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjdW5ob29rTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bmhvb2tMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnVuaG9va0xpc3RlbmVycygpOwotCQlpZiAoZ2V0Q2VsbEVkaXRvcigpICE9IG51bGwpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0JCQl2ZXJpZnlMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSB0eHQKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQsIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2NvbW1pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tbWl0KCkgewotCQlTdHJpbmcgbXNnID0gdmFsaWRhdGUoKFN0cmluZykgZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCWJyaW5nRG93bihmYWxzZSk7Ci0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBQcm9tcHRFZGl0KChOYW1lZE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwgbXNnKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuY29tbWl0KCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByb21wdEVkaXQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLQkJcHJpdmF0ZSBOYW1lZE5vZGVFZGl0UGFydCBwYXJ0OwotCi0JCXByaXZhdGUgU3RyaW5nIG1zZzsKLQotCQlQcm9tcHRFZGl0KE5hbWVkTm9kZUVkaXRQYXJ0IHBhcnQsIFN0cmluZyBtc2cpIHsKLQkJCXRoaXMucGFydCA9IHBhcnQ7Ci0JCQl0aGlzLm1zZyA9IG1zZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU3RyaW5nIHRpdGxlID0gRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA7IC8vJE5PTi1OTFMtMSQKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOyAvLyROT04tTkxTLTEkCi0JCQlwYXJ0LnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA4NjBjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLQotLyoqCi0gKiBNYW5hZ2VzIGRpcmVjdCBlZGl0aW5nIGFuZCBjcmVhdGluZyBjZWxsIGVkaXRvciBmb3IgdGhlIHtAbGluayBMYWJlbH0KLSAqIGFuZCB2YWxpZGF0ZXMgdGhlIGlucHV0LiAKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXIgZXh0ZW5kcyBEaXJlY3RFZGl0TWFuYWdlciB7Ci0KLQlGb250IHNjYWxlZEZvbnQ7Ci0KLQlwcm90ZWN0ZWQgVmVyaWZ5TGlzdGVuZXIgdmVyaWZ5TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgYWN0aXZpdHlMYWJlbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQWN0aXZpdHlEaXJlY3RFZGl0TWFuYWdlciB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgRWRpdFBhcnQKLQkgKiBAcGFyYW0gZWRpdG9yVHlwZQotCSAqICAgICAgICAgICAgdHlwZSBvZiBlZGl0b3IKLQkgKiBAcGFyYW0gbG9jYXRvcgotCSAqICAgICAgICAgICAgdGhlIENlbGxFZGl0b3JMb2NhdG9yCi0JICovCi0JcHVibGljIFZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwKLQkJCUNsYXNzIGVkaXRvclR5cGUsIENlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IsIExhYmVsIGxhYmVsKSB7Ci0JCXN1cGVyKHNvdXJjZSwgZWRpdG9yVHlwZSwgbG9jYXRvcik7Ci0JCWFjdGl2aXR5TGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bigpIHsKLQkJYnJpbmdEb3duKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKGJvb2xlYW4gY2hlY2spIHsKLQkJLy8gVGhpcyBtZXRob2QgbWlnaHQgYmUgcmUtZW50ZXJlZCB3aGVuIHN1cGVyLmJyaW5nRG93bigpIGlzIGNhbGxlZC4KLQkJRm9udCBkaXNwb3NlRm9udCA9IHNjYWxlZEZvbnQ7Ci0JCXNjYWxlZEZvbnQgPSBudWxsOwotCQlzdXBlci5icmluZ0Rvd24oKTsKLQkJaWYgKGRpc3Bvc2VGb250ICE9IG51bGwpCi0JCQlkaXNwb3NlRm9udC5kaXNwb3NlKCk7Ci0JCWlmIChjaGVjaykgewotCQkJR3JhcGhOb2RlIG5vZGUgPSAoKE5vZGUpIGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCk7Ci0JCQlTdHJpbmcgbmFtZSA9ICgoUHJvcGVydHkpIG5vZGUuZ2V0UHJvcGVydHkoKS5nZXQoMCkpLmdldFZhbHVlKCk7Ci0JCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlEaXNwbGF5Ci0JCQkJCQkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuYXN5bmNFeGVjKAotCQkJCQkJCQluZXcgUHJvbXB0RWRpdCgKLQkJCQkJCQkJCQkoTm9kZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpLAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2luaXRDZWxsRWRpdG9yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIHsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCXZlcmlmeUxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJCVN0cmluZyBvbGRUZXh0ID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQkJU3RyaW5nIGxlZnRUZXh0ID0gb2xkVGV4dC5zdWJzdHJpbmcoMCwgZXZlbnQuc3RhcnQpOwotCQkJCVN0cmluZyByaWdodFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZyhldmVudC5lbmQsIG9sZFRleHQKLQkJCQkJCS5sZW5ndGgoKSk7Ci0JCQkJR0MgZ2MgPSBuZXcgR0ModGV4dCk7Ci0JCQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQobGVmdFRleHQgKyBldmVudC50ZXh0ICsgcmlnaHRUZXh0KTsKLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQkJaWYgKHNpemUueCAhPSAwKQotCQkJCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZShzaXplLngsIFNXVC5ERUZBVUxUKTsKLQkJCQlnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpLnNldFNpemUoc2l6ZS54LCBzaXplLnkpOwotCQkJfQotCQl9OwotCQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKHZlcmlmeUxpc3RlbmVyKTsKLQotCQlTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9IGFjdGl2aXR5TGFiZWwuZ2V0VGV4dCgpOwotCQlnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUoaW5pdGlhbExhYmVsVGV4dCk7Ci0JCXRleHQuc2VsZWN0QWxsKCk7Ci0JCUlGaWd1cmUgZmlndXJlID0gKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkuZ2V0RmlndXJlKCk7Ci0JCXNjYWxlZEZvbnQgPSBmaWd1cmUuZ2V0Rm9udCgpOwotCQlGb250RGF0YSBkYXRhID0gc2NhbGVkRm9udC5nZXRGb250RGF0YSgpWzBdOwotCQlEaW1lbnNpb24gZm9udFNpemUgPSBuZXcgRGltZW5zaW9uKDAsIGRhdGEuZ2V0SGVpZ2h0KCkpOwotCQlhY3Rpdml0eUxhYmVsLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZm9udFNpemUpOwotCQlkYXRhLnNldEhlaWdodChmb250U2l6ZS5oZWlnaHQpOwotCQlzY2FsZWRGb250ID0gbmV3IEZvbnQobnVsbCwgZGF0YSk7Ci0KLQkJdGV4dC5zZXRGb250KHNjYWxlZEZvbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI3VuaG9va0xpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW5ob29rTGlzdGVuZXJzKCkgewotCQlzdXBlci51bmhvb2tMaXN0ZW5lcnMoKTsKLQkJaWYgKGdldENlbGxFZGl0b3IoKSAhPSBudWxsKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCQkJdmVyaWZ5TGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHZhbGlkLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gdHh0Ci0JICogQHJldHVybiBudWxsIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHZhbGlkLCBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNjb21taXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbW1pdCgpIHsKLQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRlKChTdHJpbmcpIGdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpKTsKLQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlicmluZ0Rvd24oZmFsc2UpOwotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKAotCQkJCQluZXcgUHJvbXB0RWRpdCgoTmFtZWROb2RlRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCksIG1zZykpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmNvbW1pdCgpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBQcm9tcHRFZGl0IGltcGxlbWVudHMgUnVubmFibGUgewotCi0JCXByaXZhdGUgTm9kZUVkaXRQYXJ0IHBhcnQ7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbXNnOwotCi0JCVByb21wdEVkaXQoTm9kZUVkaXRQYXJ0IHBhcnQsIFN0cmluZyBtc2cpIHsKLQkJCXRoaXMucGFydCA9IHBhcnQ7Ci0JCQl0aGlzLm1zZyA9IG1zZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU3RyaW5nIHRpdGxlID0gRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwcm9ibGVtID0gRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fbm9kZV9wcm9wZXJ0eV92YWx1ZV9wcm9ibGVtX21zZzsgLy8kTk9OLU5MUy0xJAotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIHByb2JsZW0sIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXBhcnQucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjNDc3ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtLiBTdXBwb3J0IGNyZWF0aW9uIAotICogb2YgY2hpbGQgZWRpdHBhcnQgaW4gV29ya1BSb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtLiAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXUERpYWdyYW1FZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBFZGl0UGFydEZhY3RvcnkgewotCi0JcHVibGljIFdQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3RvcnkjY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCXJldHVybiBuZXcgRGlhZ3JhbUVkaXRQYXJ0KChEaWFncmFtKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQoKE5hbWVkTm9kZSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgTGluaykgewotCQkJcmV0dXJuIG5ldyBMaW5rRWRpdFBhcnQoKExpbmspIG1vZGVsKTsKLQkJfQotCQkvLyB0eXBlZCBub2RlIGNyZWF0aW9uCi0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJVHlwZWROb2RlIG5vZGUgPSAoVHlwZWROb2RlKSBtb2RlbDsKLQkJCXN3aXRjaCAobm9kZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgVHlwZWROb2RlLlNUQVJUOgotCQkJCXJldHVybiBuZXcgU3RhcnROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5FTkQ6Ci0JCQkJcmV0dXJuIG5ldyBFbmROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5ERUNJU0lPTjoKLQkJCQlyZXR1cm4gbmV3IERlY2lzaW9uTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuU1lOQ0hfQkFSOgotCQkJCXJldHVybiBuZXcgU3luY2hCYXJOb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5GUkVFX1RFWFQ6Ci0JCQkJcmV0dXJuIG5ldyBGcmVlVGV4dE5vZGVFZGl0UGFydChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9XUE5vZGVFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dQTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3OTFlYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dQTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5TZWxlY3RhYmxlTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5XUENvbXBhcnRtZW50RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkIAotICogQHNlZSBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydAotICovCi1wdWJsaWMgY2xhc3MgV1BOb2RlRWRpdFBhcnQgZXh0ZW5kcyBOYW1lZE5vZGVFZGl0UGFydCB7Ci0KLQlpbnQgdHlwZSA9IDE7Ci0KLQlwdWJsaWMgV1BOb2RlRWRpdFBhcnQoTmFtZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCWlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQl0eXBlID0gKChXb3JrUHJvZHVjdE5vZGUpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJfQotCQlMYWJlbCBsID0gbmV3IFNlbGVjdGFibGVMYWJlbCgpOwotCQlsLnNldExhYmVsQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLkxFRlQpOwotCQlsLnNldFRleHRQbGFjZW1lbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOwotCQlsLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KG51bGwsICJBcmlhbCIsIDksIFNXVC5OT1JNQUwpOyAvLyROT04tTkxTLTEkCi0JCWwuc2V0Rm9udChmb250KTsKLQkJaWYgKHR5cGUgPT0gMSkKLQkJCWwuc2V0SWNvbihJbWFnZXMuQVJUSUZBQ1QpOwotCQllbHNlIGlmICh0eXBlID09IDIpCi0JCQlsLnNldEljb24oSW1hZ2VzLkRFTElWRVJBQkxFKTsKLQkJZWxzZSBpZiAodHlwZSA9PSAzKQotCQkJbC5zZXRJY29uKEltYWdlcy5PVVRDT01FKTsKLQkJZWxzZQotCQkJbC5zZXRJY29uKEltYWdlcy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUik7Ci0JCWwuc2V0SWNvblRleHRHYXAoNSk7Ci0KLQkJV1BDb21wYXJ0bWVudEZpZ3VyZSB3cGZpZ3VyZSA9IG5ldyBXUENvbXBhcnRtZW50RmlndXJlKGwsIHR5cGUpOwotCQlyZXR1cm4gd3BmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGNyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkgewotCQlMYWJlbCBsID0gKExhYmVsKSAoKChXUENvbXBhcnRtZW50RmlndXJlKSBnZXRGaWd1cmUoKSkuZ2V0TGFiZWwoKSk7Ci0JCXJldHVybiBuZXcgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHRDZWxsRWRpdG9yLmNsYXNzLAotCQkJCW5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvcihsKSwgbCkgewotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpOwotCQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja1dvcmtQcm9kdWN0RGVzY3JpcHRvclByZXNlbnRhdGlvbk5hbWUoCi0JCQkJCQkJZSwgdHh0LCBzdXBwcmVzc2lvbik7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHR4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JSUZpZ3VyZSBnZXREaXJlY3RFZGl0RmlndXJlKCkgewotCQlyZXR1cm4gKCgoV1BDb21wYXJ0bWVudEZpZ3VyZSkgZ2V0RmlndXJlKCkpLmdldExhYmVsKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVkaXRQYXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjE5YmU3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuQWN0aXZpdHlGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5UZXh0RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIENvbW1vbiBlZGl0cGFydCBmb3IgZGlmZmVyZW50IHtAbGluayBEZXNjcmlwdG9yfQotICogUHJvdmlkZXMgc3VwcG9ydCBmb3Igd29yZC13cmFwIG9mIGVkaXRwYXJ0J3Mgb2JqZWN0IG5hbWUuIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQgZXh0ZW5kcyBOYW1lZE5vZGVFZGl0UGFydCB7Ci0KLQlwdWJsaWMgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQoTmFtZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTmFtZWROb2RlRWRpdFBhcnQjZ2V0SW1hZ2UoKQotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJSW1hZ2UgaW1nID0gbnVsbDsKLQkJTm9kZSBub2RlID0gKE5vZGUpIGdldE1vZGVsKCk7Ci0JCU9iamVjdCBvYmogPSBub2RlLmdldE9iamVjdCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCWltZyA9IEltYWdlcy5QSEFTRTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCWltZyA9IEltYWdlcy5JVEVSQVRJT047Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWltZyA9IEltYWdlcy5BQ1RJVklUWTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJaW1nID0gSW1hZ2VzLlRBU0tfREVTQ1JJUFRPUjsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCWltZyA9IEltYWdlcy5NSUxFU1RPTkU7Ci0JCX0KLQkJcmV0dXJuIGltZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUFjdGl2aXR5RmlndXJlIGZpZ3VyZSA9IG5ldyBBY3Rpdml0eUZpZ3VyZSgpOwotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlKCk7Ci0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlmaWd1cmUuYWRkKGltYWdlKTsKLQkJfQotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCVN0cmluZyBnZXREaXJlY3RFZGl0VGV4dCgpIHsKLQkJVGV4dEZpZ3VyZSBub3RlID0gKFRleHRGaWd1cmUpIGdldEZpZ3VyZSgpOwotCQlyZXR1cm4gbm90ZS5nZXRUZXh0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgQWN0aXZpdHlGaWd1cmUpIHsKLQkJCUFjdGl2aXR5RmlndXJlIGwgPSAoQWN0aXZpdHlGaWd1cmUpIGZpZzsKLQkJCWZpZy5zZXRGb3JlZ3JvdW5kQ29sb3IoZ2V0Rm9yZWdyb3VuZENvbG9yKCkpOwotCQkJU3RyaW5nIHRleHQ7Ci0JCQkvLyBCZWxvdyBjaGVjayBpcyByZXF1aXJlZCBmb3IgRXh0ZW5kZWQgQWN0aXZpdHkgcHJlc2VudGF0aW9uIG5hbWUKLQkJCS8vIHNob3VsZCBiZSB1c2VkIGZyb20gYmFzZS4KLQkJCWlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG5vZGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSBnZXRNb2RlbCgpOwotCQkJCU9iamVjdCB3YmVsZW1lbnQgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCWlmICh3YmVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpKSB7Ci0JCQkJCXRleHQgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGV4dCA9ICgoTmFtZWROb2RlKSBnZXRNb2RlbCgpKS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGV4dCA9ICgoTmFtZWROb2RlKSBnZXRNb2RlbCgpKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWlmIChnZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Ci0JCQkJCQl8fCBnZXRQYXJlbnQoKS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQkJCWludCB3ID0gV1JBUF9XSURUSDsKLQkJCQkJaWYgKHRoaXMuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpCi0JCQkJCQl3ID0gV09SS19QUk9EVUNUX1dSQVBfV0lEVEg7Ci0JCQkJCXRleHQgPSB3cmFwKHRleHQsIHcpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKLQkJCX0KLQkJCWwuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29sb3IgZ2V0Rm9yZWdyb3VuZENvbG9yKCkgewotCQlOYW1lZE5vZGUgbm9kZSA9IChOYW1lZE5vZGUpIGdldE1vZGVsKCk7Ci0JCWlmIChub2RlLmlzU3VwcHJlc3NlZCgpKSB7Ci0JCQlyZXR1cm4gQ29sb3JzLlNVUFJFU1NFRF9FTEVNRU5UX0xBQkVMOwotCQl9Ci0JCWlmIChub2RlLmlzUmVhZE9ubHkoKSkgewotCQkJcmV0dXJuIENvbG9ycy5JTkhFUklURURfRUxFTUVOVF9MQUJFTDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDb2xvckNvbnN0YW50cy5ibGFjazsKLQkJfQotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCXJldHVybiBuZXcgVGV4dEZpZ3VyZURpcmVjdEVkaXRNYW5hZ2VyKChHcmFwaGljYWxFZGl0UGFydCkgdGhpcywKLQkJCQlUZXh0Q2VsbEVkaXRvci5jbGFzcywgbmV3IFRleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvcigKLQkJCQkJCShUZXh0RmlndXJlKSBnZXRGaWd1cmUoKSksIChUZXh0RmlndXJlKSBnZXRGaWd1cmUoKSkgewotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgb2JqOwotCQkJCQlPYmplY3QgZSA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrV0JTQWN0aXZpdHlQcmVzZW50YXRpb25OYW1lKGUsIHR4dCwgbm9kZS5nZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXR1cm4gVG5nVXRpbAotCQkJCQkJCQkuY2hlY2tXb3JrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoZSwKLQkJCQkJCQkJCQl0eHQsIG5vZGUuZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHR4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOThhYzY5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ2hvcGJveEFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GbG93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5SZWNvbm5lY3RMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkNvbm5lY3Rpb25BbmNob3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5SZWNvbm5lY3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCBpcyBjb250YWluZXIgd2l0aCB7QGxpbmsgRmxvd0xheW91dH0sIGFuZCBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZy9yZW1vdmluZyBjaGlsZCBlZGl0cGFydC4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlQ29udGFpbmVyRWRpdFBhcnQKLQkJaW1wbGVtZW50cyBOb2RlRWRpdFBhcnQgewotCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xvciBCR19DT0xPUiA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjU1LAotCS8vCQkyNTUsIDIwNSk7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29sb3IgQkdfQ09MT1I7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydChXb3JrUHJvZHVjdENvbXBvc2l0ZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlGaWd1cmUgZmlndXJlID0gbmV3IEZpZ3VyZSgpOwotCQlGbG93TGF5b3V0IGxheW91dCA9IG5ldyBGbG93TGF5b3V0KCk7Ci0JCWxheW91dC5zZXRNaW5vclNwYWNpbmcoMjApOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQlmaWd1cmUuc2V0Qm9yZGVyKG5ldyBSYWlzZWRNYXJnaW5Cb3JkZXIoKSk7Ci0JCWZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotCQlmaWd1cmUuc2V0T3BhcXVlKHRydWUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQjaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTm9kZUNvbnRhaW5lci5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJcmVmcmVzaENoaWxkcmVuKCk7Ci0JCQkKLQkJCWFkanVzdFNpemUoKTsKLQkJCQotCQkJLy8gcmVmcmVzaCBkaWFncmFtJ3MgY2hpbGRyZW4KLQkJCUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IGdldFBhcmVudCgpOwotCQkJZGlhZ3JhbUVkaXRQYXJ0LnJlZnJlc2goKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGp1c3RTaXplKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCUxpc3QgbGlzdCA9IGdldENoaWxkcmVuKCk7Ci0JCWludCB0SGVpZ2h0ID0gMjA7Ci0JCWludCB0V2lkdGggPSAyMDsKLQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KWl0ZXJhdG9yLm5leHQoKTsKLQkJCXRIZWlnaHQrPWVkaXRwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQlpZih0V2lkdGggPCBlZGl0cGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGgpewotCQkJCXRXaWR0aCA9IGVkaXRwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCX0KLQkJfQotCQkoKE5vZGUpIHRoaXMuZ2V0TW9kZWwoKSkuc2V0SGVpZ2h0KHRIZWlnaHQpOwotCQkoKE5vZGUpIHRoaXMuZ2V0TW9kZWwoKSkuc2V0V2lkdGgodFdpZHRoKzIwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkgewotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25uZWN0aW9uQ29tcGxldGVDb21tYW5kKAotCQkJCQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUNyZWF0ZUxpbmtDb21tYW5kIGNtZCA9IChDcmVhdGVMaW5rQ29tbWFuZCkgcmVxdWVzdAotCQkJCQkJCQkuZ2V0U3RhcnRDb21tYW5kKCk7Ci0JCQkJCQljbWQuc2V0VGFyZ2V0KChOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0KLQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldEVkaXRQYXJ0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldEVkaXRQYXJ0KCkuZXF1YWxzKAotCQkJCQkJCQkJcmVxdWVzdC5nZXRTb3VyY2VFZGl0UGFydCgpKSkgewotCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJY21kCi0JCQkJCQkJCQkJLnNldFRhcmdldEVuZFBvaW50KCgoQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHJlcXVlc3QKLQkJCQkJCQkJCQkJCS5nZXRUYXJnZXRFZGl0UGFydCgpKQotCQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKHJlcXVlc3QKLQkJCQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXJldHVybiBjbWQ7Ci0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25uZWN0aW9uQ3JlYXRlQ29tbWFuZCgKLQkJCQkJCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlDcmVhdGVMaW5rQ29tbWFuZCBjbWQgPSBuZXcgQ3JlYXRlTGlua0NvbW1hbmQoCi0JCQkJCQkJCU1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpLAotCQkJCQkJCQkoTm9kZSkgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0RWRpdFBhcnQoKSBpbnN0YW5jZW9mIENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSB7Ci0JCQkJCQkJY21kCi0JCQkJCQkJCQkuc2V0U291cmNlRW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJCQkuZ2V0VGFyZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKHJlcXVlc3QuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljbWQuc2V0U291cmNlRW5kUG9pbnQocmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0KLQkJCQkJCXJlcXVlc3Quc2V0U3RhcnRDb21tYW5kKGNtZCk7Ci0KLQkJCQkJCXJldHVybiBjbWQ7Ci0KLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldFJlY29ubmVjdFNvdXJjZUNvbW1hbmQoCi0JCQkJCQkJUmVjb25uZWN0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgcmVxdWVzdC5nZXRDb25uZWN0aW9uRWRpdFBhcnQoKQotCQkJCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCQkJCVJlY29ubmVjdExpbmtDb21tYW5kIGNtZCA9IG5ldyBSZWNvbm5lY3RMaW5rQ29tbWFuZCgKLQkJCQkJCQkJbGluaywgKE5vZGUpIGdldEhvc3QoKS5nZXRNb2RlbCgpLCB0cnVlKTsKLQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldCgpIGluc3RhbmNlb2YgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHsKLQkJCQkJCQljbWQuc2V0RW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJLmdldFRhcmdldCgpKS5nZXRMb2NhdGlvbihyZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm4gY21kOwotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVjb25uZWN0VGFyZ2V0Q29tbWFuZCgKLQkJCQkJCQlSZWNvbm5lY3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSByZXF1ZXN0LmdldENvbm5lY3Rpb25FZGl0UGFydCgpCi0JCQkJCQkJCS5nZXRNb2RlbCgpOwotCQkJCQkJUmVjb25uZWN0TGlua0NvbW1hbmQgY21kID0gbmV3IFJlY29ubmVjdExpbmtDb21tYW5kKAotCQkJCQkJCQlsaW5rLCAoTm9kZSkgZ2V0SG9zdCgpLmdldE1vZGVsKCksIGZhbHNlKTsKLQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldCgpIGluc3RhbmNlb2YgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHsKLQkJCQkJCQljbWQuc2V0RW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJLmdldFRhcmdldCgpKS5nZXRMb2NhdGlvbihyZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGNtZDsKLQkJCQkJfQotCQkJCX0pOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBudWxsKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT01QT05FTlRfUk9MRSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcigKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ2hvcGJveEFuY2hvcihnZXRGaWd1cmUoKSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKAotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbmV3IENob3Bib3hBbmNob3IoZ2V0RmlndXJlKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsU291cmNlQ29ubmVjdGlvbnMoKSB7Ci0JCXJldHVybiBnZXROb2RlKCkuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsVGFyZ2V0Q29ubmVjdGlvbnMoKSB7Ci0JCXJldHVybiBnZXROb2RlKCkuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiAoTm9kZSkgZ2V0TW9kZWwoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbG9yIGdldEJhY2tncm91bmRDb2xvcigpewotCQlpZihCR19DT0xPUiAhPSBudWxsKSByZXR1cm4gQkdfQ09MT1I7Ci0JCQotCQlpZihCR19DT0xPUiA9PSBudWxsKXsKLQkJCVN0cmluZyBjb2xvclN0cmluZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJCVRlbXBsYXRlQ29uc3RhbnRzLkFERF9XUF9CT1hfQkdfQ09MT1JfUkdCKTsKLQkJCWlmKGNvbG9yU3RyaW5nICE9IG51bGwgJiYgY29sb3JTdHJpbmcubGVuZ3RoKCkgPiAwKXsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb2xvclN0cmluZywgIiwiKTsKLQkJCQlpbnQgciA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlpbnQgZyA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlpbnQgYiA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlCR19DT0xPUiA9IG5ldyBDb2xvcihudWxsLCByLGcsYik7Ci0JCQkJcmV0dXJuIEJHX0NPTE9SOwotCQkJfQotCQl9Ci0JCWlmKEJHX0NPTE9SID09IG51bGwpewotCQkJQkdfQ09MT1IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NSwKLQkJCQkJCQkyNTUsIDIwNSk7Ci0JCX0KLQkJcmV0dXJuIEJHX0NPTE9SOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlNzgxNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHtAbGluayBXb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydCBleHRlbmRzIE5hbWVkTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydChOYW1lZE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5OYW1lZE5vZGVFZGl0UGFydCNnZXRJbWFnZSgpCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkgewotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCVdvcmtQcm9kdWN0Tm9kZSBub2RlID0gKFdvcmtQcm9kdWN0Tm9kZSkgbW9kZWw7Ci0JCQlzd2l0Y2ggKG5vZGUuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIFdvcmtQcm9kdWN0Tm9kZS5BUlRJRkFDVDoKLQkJCQlyZXR1cm4gSW1hZ2VzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SXzE2OwotCQkJY2FzZSBXb3JrUHJvZHVjdE5vZGUuREVMSVZFUkFCTEU6Ci0JCQkJcmV0dXJuIEltYWdlcy5ERUxJVkVSQUJMRTsKLQkJCWNhc2UgV29ya1Byb2R1Y3ROb2RlLk9VVENPTUU6Ci0JCQkJcmV0dXJuIEltYWdlcy5PVVRDT01FOwotCQkJfQotCQkJcmV0dXJuIEltYWdlcy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl8xNjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTmFtZWROb2RlRWRpdFBhcnQjY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGNyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkgewotCQlMYWJlbCBsID0gKExhYmVsKSBnZXRGaWd1cmUoKTsKLQkJcmV0dXJuIG5ldyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dENlbGxFZGl0b3IuY2xhc3MsCi0JCQkJbmV3IExhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yKGwpLCBsKSB7Ci0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQlPYmplY3Qgb2JqID0gZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iajsKLQkJCQkJT2JqZWN0IGUgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IG5vZGUuZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrV29ya1Byb2R1Y3REZXNjcmlwdG9yUHJlc2VudGF0aW9uTmFtZSgKLQkJCQkJCQllLCB0eHQsIHN1cHByZXNzaW9uKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHR4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzExZmYzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZGlzcGxheSBhbmQgZWRpdGluZyBzdXBwb3J0IGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0RpYWdyYW1MYXlvdXRFZGl0UG9saWN5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUxheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzM0OWRjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUxheW91dEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DaGFuZ2VIZWlnaHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNyZWF0ZU5vZGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLk1vdmVCZW5kcG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbnN0cmFpbmVkTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLS8qKgotICogQW4gRWRpdFBvbGljeSBmb3IgdXNlIHdpdGggPGNvZGU+RmlndXJlczwvY29kZT4gaW4ge0BsaW5rIFhZTGF5b3V0fSBvZiBkaWFncmFtLiBUaGUgY29uc3RyYWludCBmb3IKLSAqIFhZTGF5b3V0IGlzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGV9LiBJbXBsZW1lbnRzIHRoZSBjaGFuZ2Vjb25zdHJhaW50LCBkZWxldGUsCi0gKiByZXNpemUgY29tbWFuZHMgb2Yge0BsaW5rIENvbnN0cmFpbmVkTGF5b3V0RWRpdFBvbGljeX0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1MYXlvdXRFZGl0UG9saWN5IGV4dGVuZHMgWFlMYXlvdXRFZGl0UG9saWN5IHsKLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdFBhcnQgY2hpbGQsIE9iamVjdCBjb25zdHJhaW50KSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNoYW5nZUNvbnN0cmFpbnRDb21tYW5kKEVkaXRQYXJ0IGNoaWxkLAotCQkJT2JqZWN0IGNvbnN0cmFpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ2hhbmdlQ29uc3RyYWludENvbW1hbmQoCi0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QsIEVkaXRQYXJ0IGNoaWxkLCBPYmplY3QgY29uc3RyYWludCkgewotCQkKLQkJLy8gc3BlY2lhbCBmb3IgQURECi0JCUVkaXRQYXJ0IHBhcmVudCA9IGNoaWxkLmdldFBhcmVudCgpOwotCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCl7Ci0JCQlTdHJpbmcgYXV0b2xheW91dCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0QXV0b0xheW91dEZsYWcoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkoTm9kZSlwYXJlbnQuZ2V0TW9kZWwoKSk7Ci0JCQlpZihhdXRvbGF5b3V0ICE9IG51bGwpewotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuY3JlYXRlUHJvcGVydHkoKChOb2RlKXBhcmVudC5nZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKSwKLQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9fTEFZT1VULCAKLQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9fTEFZT1VUX1ZBTFVFX0ZBTFNFKTsKLQkJCX0KLQkJfQotCQkKLQkJTm9kZSBub2RlID0gKE5vZGUpIGNoaWxkLmdldE1vZGVsKCk7Ci0JCWludCBkaXJlY3Rpb25zID0gcmVxdWVzdC5nZXRSZXNpemVEaXJlY3Rpb24oKTsKLQkJCi0JCWlmICgoZGlyZWN0aW9ucyAmIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIX1NPVVRIKSAKLQkJCQk9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCl7Ci0JCQlQb2ludCBuZXdMb2NhdGlvbiA9IG5vZGUuZ2V0TG9jYXRpb24oKS5nZXRUcmFuc2xhdGVkKAotCQkJCQlyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLQkJCWludCBuZXdIZWlnaHQgPSByZXF1ZXN0LmdldFNpemVEZWx0YSgpLmhlaWdodDsKLQkJCWlmIChuZXdIZWlnaHQgIT0gMCkgewotCQkJCW5ld0hlaWdodCArPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCQkJCWlmIChuZXdIZWlnaHQgPCAxMCkKLQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQl9IGVsc2UKLQkJCQluZXdIZWlnaHQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCQkJcmV0dXJuIG5ldyBDaGFuZ2VIZWlnaHRDb21tYW5kKG5vZGUsIG5ld0xvY2F0aW9uLCBuZXdIZWlnaHQpOwotCQl9Ci0JCWVsc2V7Ci0JCQkvLyBPdGhlciBkaXJlY3Rpb25zIGFyZSBFQVNUIFdFU1QuIAotCQkJUG9pbnQgbmV3TG9jYXRpb24gPSBub2RlLmdldExvY2F0aW9uKCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJcmVxdWVzdC5nZXRNb3ZlRGVsdGEoKSk7Ci0JCQlpbnQgbmV3V2lkdGggPSByZXF1ZXN0LmdldFNpemVEZWx0YSgpLndpZHRoOwotCQkJaWYgKG5ld1dpZHRoICE9IDApIHsKLQkJCQluZXdXaWR0aCArPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJaWYgKG5ld1dpZHRoIDwgMTApCi0JCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJfSBlbHNlCi0JCQkJbmV3V2lkdGggPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQlyZXR1cm4gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQobm9kZSwgbmV3TG9jYXRpb24sIG5ld1dpZHRoKTsKLQkJfSAKLQl9Ci0KLQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJUmVzaXphYmxlRWRpdFBvbGljeSBjaGlsZFBvbGljeSA9IG5ldyBSZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCWlmKGNoaWxkIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCB8fAotCQkJCWNoaWxkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCl7Ci0JCQljaGlsZFBvbGljeS5zZXRSZXNpemVEaXJlY3Rpb25zKFBvc2l0aW9uQ29uc3RhbnRzLk5TRVcpOwotCQl9ZWxzZXsKLQkJCWNoaWxkUG9saWN5LnNldFJlc2l6ZURpcmVjdGlvbnMoUG9zaXRpb25Db25zdGFudHMuRUFTVF9XRVNUKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRQb2xpY3k7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlQb2ludCBsb2MgPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0JCQlnZXRIb3N0RmlndXJlKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShsb2MpOwotCQkJcmV0dXJuIG5ldyBDcmVhdGVOb2RlQ29tbWFuZCgoTm9kZSkgcmVxdWVzdC5nZXROZXdPYmplY3QoKSwKLQkJCQkJKERpYWdyYW0pIGdldEhvc3QoKS5nZXRNb2RlbCgpLCBsb2MpOwotCQl9Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldERlbGV0ZURlcGVuZGFudENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlc2l6ZUNoaWxkcmVuQ29tbWFuZChDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJQ29tcG91bmRDb21tYW5kIHJlc2l6ZSA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkJQ29tbWFuZCBjOwotCQlHcmFwaGljYWxFZGl0UGFydCBjaGlsZDsKLQkJTGlzdCBjaGlsZHJlbiA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJY2hpbGQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuLmdldChpKTsKLQkJCWMgPSBjcmVhdGVDaGFuZ2VDb25zdHJhaW50Q29tbWFuZCgKLQkJCQkJcmVxdWVzdCwKLQkJCQkJY2hpbGQsCi0JCQkJCXRyYW5zbGF0ZVRvTW9kZWxDb25zdHJhaW50KGdldENvbnN0cmFpbnRGb3IocmVxdWVzdCwgY2hpbGQpKSk7Ci0JCQlyZXNpemUuYWRkKGMpOwotCQkJaWYgKCFjaGlsZC5nZXRTb3VyY2VDb25uZWN0aW9ucygpLmlzRW1wdHkoKSkgewotCQkJCUxpc3QgbGlzdCA9IGNoaWxkLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTGlua0VkaXRQYXJ0KSB7Ci0JCQkJCQlFZGl0UGFydCByb290ZWRpdCA9IGNoaWxkLmdldFBhcmVudCgpOwotCQkJCQkJTGlzdCBzZWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlpZiAocm9vdGVkaXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpIHsKLQkJCQkJCQlzZWwgPSAoKERpYWdyYW1FZGl0UGFydCkgcm9vdGVkaXQpLmdldFZpZXdlcigpCi0JCQkJCQkJCQkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQkJCX0KLQkJCQkJCUVkaXRQYXJ0IHBhcnQgPSAoKExpbmtFZGl0UGFydCkgb2JqKS5nZXRUYXJnZXQoKTsKLQkJCQkJCWlmIChzZWwuY29udGFpbnMocGFydCkpIHsKLQkJCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgKChMaW5rRWRpdFBhcnQpIG9iaikuZ2V0TW9kZWwoKTsKLQkJCQkJCQkoKERpYWdyYW1FZGl0UGFydCkgcm9vdGVkaXQpLmdldFZpZXdlcigpCi0JCQkJCQkJCQkuYXBwZW5kU2VsZWN0aW9uKChMaW5rRWRpdFBhcnQpIG9iaik7Ci0JCQkJCQkJTGlzdCBibGlzdCA9IGxpbmsuZ2V0QmVuZHBvaW50cygpOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYmxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJCQkJQWJzb2x1dGVCZW5kcG9pbnQgYWJwb2ludCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgYmxpc3QKLQkJCQkJCQkJCQkuZ2V0KGopOwotCQkJCQkJCQlQb2ludCBkZWx0YVBvaW50ID0gcmVxdWVzdC5nZXRNb3ZlRGVsdGEoKTsKLQkJCQkJCQkJKChMaW5rRWRpdFBhcnQpIG9iaikuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkudHJhbnNsYXRlVG9BYnNvbHV0ZShkZWx0YVBvaW50KTsKLQkJCQkJCQkJUG9pbnQgcCA9IGFicG9pbnQuZ2V0VHJhbnNsYXRlZChyZXF1ZXN0Ci0JCQkJCQkJCQkJLmdldE1vdmVEZWx0YSgpKTsKLQkJCQkJCQkJQ29tbWFuZCBiZW5kY29tbWFuZCA9IG5ldyBNb3ZlQmVuZHBvaW50Q29tbWFuZCgKLQkJCQkJCQkJCQlsaW5rLCBwLCBqKTsKLQkJCQkJCQkJcmVzaXplLmFkZChiZW5kY29tbWFuZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXNpemU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xhYmVsU2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xhYmVsU2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjY5M2M1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MYWJlbFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlNlbGVjdGFibGVMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotCi0vKioKLSAqIEhhbmRsZXMgc2VsZWN0aW9uIG9mIGFjdGl2aXRlcy4gUHJpbWFyeSBzZWxlY3Rpb24gaXMgZGVub3RlZCBieSBoaWdobGlnaHQgYW5kCi0gKiBhIGZvY3VzIHJlY3RhbmdsZS4gTm9ybWFsIHNlbGVjdGlvbiBpcyBkZW5vdGVkIGJ5IGhpZ2hsaWdodCBvbmx5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGFiZWxTZWxlY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgTm9uUmVzaXphYmxlRWRpdFBvbGljeSB7Ci0KLQlwcml2YXRlIFNlbGVjdGFibGVMYWJlbCBnZXRMYWJlbCgpIHsKLQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpOwotCQlyZXR1cm4gKChTZWxlY3RhYmxlTGFiZWwpIHBhcnQuZ2V0RmlndXJlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5I2hpZGVGb2N1cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZUZvY3VzKCkgewotCQlnZXRMYWJlbCgpLnNldEZvY3VzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kjaGlkZVNlbGVjdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsKLQkJZ2V0TGFiZWwoKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JCWdldExhYmVsKCkuc2V0Rm9jdXMoZmFsc2UpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3kjc2hvd0ZvY3VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKSB7Ci0JCWdldExhYmVsKCkuc2V0Rm9jdXModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5I3Nob3dTZWxlY3Rpb24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dQcmltYXJ5U2VsZWN0aW9uKCkgewotCQlnZXRMYWJlbCgpLnNldFNlbGVjdGVkKHRydWUpOwotCQlnZXRMYWJlbCgpLnNldEZvY3VzKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSNzaG93U2VsZWN0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgewotCQlnZXRMYWJlbCgpLnNldFNlbGVjdGVkKHRydWUpOwotCQlnZXRMYWJlbCgpLnNldEZvY3VzKGZhbHNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MaW5rQmVuZHBvaW50RWRpdFBvbGljeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xpbmtCZW5kcG9pbnRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViZGJmODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xpbmtCZW5kcG9pbnRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNyZWF0ZUJlbmRwb2ludENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuRGVsZXRlQmVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5Nb3ZlQmVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQmVuZHBvaW50RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQmVuZHBvaW50UmVxdWVzdDsKLQotLyoqCi0gKiBBIEVkaXRQb2xpY3kgdG8gaGFuZGxlIHRoZSBjcmVhdGUsIG1vdmUgYW5kIGRlbGV0ZSBiZW5kcG9pbnRzIGFjdGl2aXRpZXMgb2YgTGluay4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpbmtCZW5kcG9pbnRFZGl0UG9saWN5IGV4dGVuZHMgQmVuZHBvaW50RWRpdFBvbGljeSB7Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVCZW5kcG9pbnRDb21tYW5kKEJlbmRwb2ludFJlcXVlc3QgcmVxdWVzdCkgewotCQlQb2ludCBsb2MgPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0JCWdldENvbm5lY3Rpb24oKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvYyk7Ci0JCXJldHVybiBuZXcgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZCgKLQkJCQkoTGluaykgcmVxdWVzdC5nZXRTb3VyY2UoKS5nZXRNb2RlbCgpLCBsb2MsIHJlcXVlc3QuZ2V0SW5kZXgoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVsZXRlQmVuZHBvaW50Q29tbWFuZChCZW5kcG9pbnRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG5ldyBEZWxldGVCZW5kcG9pbnRDb21tYW5kKChMaW5rKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSwgcmVxdWVzdAotCQkJCS5nZXRJbmRleCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQmVuZHBvaW50Q29tbWFuZChCZW5kcG9pbnRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQlnZXRDb25uZWN0aW9uKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShsb2MpOwotCQlyZXR1cm4gbmV3IE1vdmVCZW5kcG9pbnRDb21tYW5kKChMaW5rKSByZXF1ZXN0LmdldFNvdXJjZSgpLmdldE1vZGVsKCksCi0JCQkJbG9jLCByZXF1ZXN0LmdldEluZGV4KCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MaW5rRW5kcG9pbnRFZGl0UG9saWN5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTGlua0VuZHBvaW50RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTA1YWQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MaW5rRW5kcG9pbnRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbm5lY3Rpb25FbmRwb2ludEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci0KLS8qKgotICogQSBFZGl0UG9saWN5IHRvIGhhbmRsZSB0aGUgc2VsZWN0aW9uIGhhbmRsZXMgZm9yIGNvbm5lY3Rpb24uIAotICogIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpbmtFbmRwb2ludEVkaXRQb2xpY3kgZXh0ZW5kcyBDb25uZWN0aW9uRW5kcG9pbnRFZGl0UG9saWN5IHsKLQotCXByaXZhdGUgc3RhdGljIEZvbnQgQk9MRF9GT05UOwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJc3VwZXIuYWRkU2VsZWN0aW9uSGFuZGxlcygpOwotCQlnZXRDb25uZWN0aW9uRmlndXJlKCkuc2V0TGluZVdpZHRoKDIpOwotCX0KLQotCXByb3RlY3RlZCBQb2x5bGluZUNvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpIHsKLQkJcmV0dXJuIChQb2x5bGluZUNvbm5lY3Rpb24pIGdldEhvc3RGaWd1cmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkgewotCQlzdXBlci5oaWRlU2VsZWN0aW9uKCk7Ci0JCWdldEhvc3RGaWd1cmUoKS5zZXRGb250KG51bGwpOwotCQlnZXRIb3N0RmlndXJlKCkuaW52YWxpZGF0ZVRyZWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQlzdXBlci5yZW1vdmVTZWxlY3Rpb25IYW5kbGVzKCk7Ci0JCWdldENvbm5lY3Rpb25GaWd1cmUoKS5zZXRMaW5lV2lkdGgoMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJc3VwZXIuc2hvd1NlbGVjdGlvbigpOwotCQlpZiAoQk9MRF9GT05UID09IG51bGwpIHsKLQkJCUZvbnREYXRhW10gZGF0YSA9IGdldENvbm5lY3Rpb25GaWd1cmUoKS5nZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKLQkJCQlpZiAoKGRhdGFbaV0uZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSA9PSAwKQotCQkJCQlkYXRhW2ldLnNldFN0eWxlKGRhdGFbaV0uZ2V0U3R5bGUoKSB8IFNXVC5CT0xEKTsKLQkJCUJPTERfRk9OVCA9IG5ldyBGb250KG51bGwsIGRhdGEpOwotCQl9Ci0JCWdldEhvc3RGaWd1cmUoKS5zZXRGb250KEJPTERfRk9OVCk7Ci0JCWdldEhvc3RGaWd1cmUoKS5pbnZhbGlkYXRlVHJlZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Ob2RlQ29udGFpbmVyRWRpdFBvbGljeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL05vZGVDb250YWluZXJFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlZjA1ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL05vZGVDb250YWluZXJFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Db250YWluZXJFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi0vKioKLSAqIEEgRWRpdFBvbGljeSBmb3Ige0BsaW5rIE5vZGVDb250YWluZXJFZGl0UGFydH0gZm9yIGRpc2FibGluZyBkaXJlY3QgY2hpbGQgY3JlYXRpb24uCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTm9kZUNvbnRhaW5lckVkaXRQb2xpY3kgZXh0ZW5kcyBDb250YWluZXJFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Db250YWluZXJFZGl0UG9saWN5I2dldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Ob2RlQ29udGFpbmVyRmxvd0xheW91dEVkaXRQb2xpY3kuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Ob2RlQ29udGFpbmVyRmxvd0xheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmRmNDgxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTm9kZUNvbnRhaW5lckZsb3dMYXlvdXRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRmxvd0xheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLS8qKgotICogQSBFZGl0UG9saWN5IGZvciB7QGxpbmsgTm9kZUNvbnRhaW5lckVkaXRQYXJ0fSB0byBkaXNhYmxlIHRoZSBhbGwgZWRpdGluZyBmZWF0dXJlcy4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlQ29udGFpbmVyRmxvd0xheW91dEVkaXRQb2xpY3kgZXh0ZW5kcyBGbG93TGF5b3V0RWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuT3JkZXJlZExheW91dEVkaXRQb2xpY3kjY3JlYXRlQWRkQ29tbWFuZChFZGl0UGFydCwKLQkgKiAgICAgIEVkaXRQYXJ0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdFBhcnQgY2hpbGQsIEVkaXRQYXJ0IGFmdGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5PcmRlcmVkTGF5b3V0RWRpdFBvbGljeSNjcmVhdGVNb3ZlQ2hpbGRDb21tYW5kKEVkaXRQYXJ0LAotCSAqICAgICAgRWRpdFBhcnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTW92ZUNoaWxkQ29tbWFuZChFZGl0UGFydCBjaGlsZCwgRWRpdFBhcnQgYWZ0ZXIpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kjZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5I2dldERlbGV0ZURlcGVuZGFudENvbW1hbmQoUmVxdWVzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZWxldGVEZXBlbmRhbnRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0Zsb3dMYXlvdXRFZGl0UG9saWN5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZGZlODdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0Zsb3dMYXlvdXRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmxvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5GbG93TGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotLyoqCi0gKiBFZGl0UG9saWN5IHRvIGRpc2FibGUgdGhlIGVkaXRpbmcgZmVhdHVyZSBpbiBhIHtAbGluayBGbG93TGF5b3V0fQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIEZsb3dMYXlvdXRFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0Zsb3dMYXlvdXRFZGl0UG9saWN5KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk9yZGVyZWRMYXlvdXRFZGl0UG9saWN5I2NyZWF0ZUFkZENvbW1hbmQob3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0LCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0UGFydCBjaGlsZCwgRWRpdFBhcnQgYWZ0ZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk9yZGVyZWRMYXlvdXRFZGl0UG9saWN5I2NyZWF0ZU1vdmVDaGlsZENvbW1hbmQob3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0LCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTW92ZUNoaWxkQ29tbWFuZChFZGl0UGFydCBjaGlsZCwgRWRpdFBhcnQgYWZ0ZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kjZ2V0Q3JlYXRlQ29tbWFuZChvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzZDg1NDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGdyYXBoaWNhbCBlZGl0IHBvbGljaWVzIGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0FjdGl2aXR5RmlndXJlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQWN0aXZpdHlGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTJhNGY3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQWN0aXZpdHlGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLS8qKgotICogQGF1dGhvciBKYW1lcyBUaGFyaW8KLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpZ3VyZSBleHRlbmRzIFRleHRGaWd1cmUgewotCi0JcHVibGljIEFjdGl2aXR5RmlndXJlKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9DZW50cmVkTGFiZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9DZW50cmVkTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTcwOWY4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQ2VudHJlZExhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2VudHJlZExhYmVsIGV4dGVuZHMgTGFiZWwgewotCi0JcHVibGljIENlbnRyZWRMYWJlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ2VudHJlZExhYmVsKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCXB1YmxpYyBDZW50cmVkTGFiZWwoSW1hZ2UgaSkgewotCQlzdXBlcihpKTsKLQl9Ci0KLQlwdWJsaWMgQ2VudHJlZExhYmVsKFN0cmluZyBzLCBJbWFnZSBpKSB7Ci0JCXN1cGVyKHMsIGkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZSNwYWludEZpZ3VyZShHcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQlpZiAoaXNPcGFxdWUoKSkKLQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcygpOwotCQlncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMueWVsbG93KTsKLQkJZ3JhcGhpY3MudHJhbnNsYXRlKGJvdW5kcy54LCBib3VuZHMueSk7Ci0JCWlmICghaXNFbmFibGVkKCkpIHsKLQkJCWdyYXBoaWNzLnRyYW5zbGF0ZSgxLCAxKTsKLQkJCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy55ZWxsb3cpOwotCQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJ1dHRvbkxpZ2h0ZXN0KTsKLQkJCWdyYXBoaWNzLmRyYXdUZXh0KGdldFN1YlN0cmluZ1RleHQoKSwgZ2V0VGV4dExvY2F0aW9uKCkpOwotCQkJZ3JhcGhpY3MudHJhbnNsYXRlKC0xLCAtMSk7Ci0JCQlncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYnV0dG9uRGFya2VyKTsKLQkJfQotCQlncmFwaGljcy5kcmF3VGV4dChnZXRTdWJTdHJpbmdUZXh0KCksIGdldFRleHRMb2NhdGlvbigpKTsKLQkJZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnllbGxvdyk7Ci0JCWdyYXBoaWNzLnRyYW5zbGF0ZSgtYm91bmRzLngsIC1ib3VuZHMueSk7Ci0JCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Db2xvcnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Db2xvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzM3ZTAyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQ29sb3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBUaGUgY29sb3IgY29uc3RhbnRzIHJlZmVyZW5jZWQgYnkgdGhlIGRpYWdyYW0gZWRpdG9ycy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbG9ycyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIElOSEVSSVRFRF9FTEVNRU5UX0xBQkVMID0gQ29sb3JDb25zdGFudHMuZGFya0dyZWVuOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBTVVBSRVNTRURfRUxFTUVOVF9MQUJFTCA9IENvbG9yQ29uc3RhbnRzLmdyYXk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Db21wb3NpdGVGaWd1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Db21wb3NpdGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODEyZmNjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQ29tcG9zaXRlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmxvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuUmFpc2VkTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJHX0NPTE9SID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsCi0JCQkyNTUsIDIwNSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfV0lEVEggPSA1MDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTUEFDSU5HID0gMTA7Ci0KLQlwcml2YXRlIGludCBtYXhXaWR0aCA9IERFRkFVTFRfTUFYX1dJRFRIOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUZpZ3VyZSgpIHsKLQkJVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dCgpOwotCQlsYXlvdXQuc2V0TWlub3JBbGlnbm1lbnQoRmxvd0xheW91dC5BTElHTl9DRU5URVIpOwotCQlsYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7Ci0JCWxheW91dC5zZXRTcGFjaW5nKFNQQUNJTkcpOwotCQlsYXlvdXQuc2V0T2JzZXJ2ZVZpc2liaWxpdHkodHJ1ZSk7Ci0JCXNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJc2V0Qm9yZGVyKG5ldyBSYWlzZWRNYXJnaW5Cb3JkZXIoKSk7Ci0JCXNldEJhY2tncm91bmRDb2xvcihCR19DT0xPUik7Ci0JCXNldE9wYXF1ZSh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXhXaWR0aChpbnQgdykgewotCQltYXhXaWR0aCA9IHc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlI2dldFByZWZlcnJlZFNpemUoaW50LCBpbnQpCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KSB7Ci0JCWlmICh3SGludCA+IG1heFdpZHRoKSB7Ci0JCQl3SGludCA9IG1heFdpZHRoOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQcmVmZXJyZWRTaXplKHdIaW50LCBoSGludCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvRGlhbW9uZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0RpYW1vbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDZmZTRmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvRGlhbW9uZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIEEgZmlndXJlIGZvciBkaWFtb25kIHNoYXBlLiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhbW9uZCBleHRlbmRzIFNoYXBlIHsKLQotCXByaXZhdGUgUG9pbnRMaXN0IGRpYW1vbmQgPSBuZXcgUG9pbnRMaXN0KDQpOwotCi0JLyoqCi0JICogQHNlZSBTaGFwZSNmaWxsU2hhcGUoR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbFNoYXBlKEdyYXBoaWNzIGcpIHsKLQkJZy5maWxsUG9seWdvbihkaWFtb25kKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFNoYXBlI291dGxpbmVTaGFwZShHcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvdXRsaW5lU2hhcGUoR3JhcGhpY3MgZykgewotCQlnLmRyYXdQb2x5Z29uKGRpYW1vbmQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZSN2YWxpZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCVJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlyLmNyb3AoZ2V0SW5zZXRzKCkpOwotCQlyLnJlc2l6ZSgtMSwgLTEpOwotCQlkaWFtb25kLnJlbW92ZUFsbFBvaW50cygpOwotCQlkaWFtb25kLmFkZFBvaW50KHIuZ2V0VG9wKCkpOwotCQlkaWFtb25kLmFkZFBvaW50KHIuZ2V0UmlnaHQoKSk7Ci0JCWRpYW1vbmQuYWRkUG9pbnQoci5nZXRCb3R0b20oKSk7Ci0JCWRpYW1vbmQuYWRkUG9pbnQoci5nZXRMZWZ0KCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lI3ByaW1UcmFuc2xhdGUoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVRyYW5zbGF0ZShpbnQgeCwgaW50IHkpIHsKLQkJc3VwZXIucHJpbVRyYW5zbGF0ZSh4LCB5KTsKLQkJZGlhbW9uZC50cmFuc2xhdGUoeCwgeSk7Ci0JfQotCi0JcHVibGljIFBvaW50TGlzdCBnZXRQb2ludHMoKSB7Ci0JCXJldHVybiBkaWFtb25kOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0VuZE5vZGVGaWd1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9FbmROb2RlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjMDFhMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0VuZE5vZGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci0KLS8qKgotICogRmlndXJlIGZvciB7QGxpbmsgVHlwZWROb2RlfSBlbmQuCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW5kTm9kZUZpZ3VyZSBleHRlbmRzIEVsbGlwc2UgewotCi0JLyoqCi0JICogRmlsbHMgdGhlIGVsbGlwc2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGUjZmlsbFNoYXBlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsU2hhcGUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCXIuc2hyaW5rKHIud2lkdGggLyA4LCByLmhlaWdodCAvIDgpOwotCQlncmFwaGljcy5maWxsT3ZhbChyKTsKLQl9Ci0KLQkvKioKLQkgKiBPdXRsaW5lcyB0aGUgZWxsaXBzZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZSNvdXRsaW5lU2hhcGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG91dGxpbmVTaGFwZShHcmFwaGljcyBncmFwaGljcykgewotCQlzdXBlci5vdXRsaW5lU2hhcGUoZ3JhcGhpY3MpOwotCi0JCVJlY3RhbmdsZSByID0gUmVjdGFuZ2xlLlNJTkdMRVRPTjsKLQkJci5zZXRCb3VuZHMoZ2V0Qm91bmRzKCkpOwotCQlyLnNocmluayhnZXRCb3VuZHMoKS53aWR0aCAvIDgsIGdldEJvdW5kcygpLmhlaWdodCAvIDgpOwotCQlyLndpZHRoLS07Ci0JCXIuaGVpZ2h0LS07Ci0JCXIuc2hyaW5rKChsaW5lV2lkdGggLSAxKSAvIDIsIChsaW5lV2lkdGggLSAxKSAvIDIpOwotCQlncmFwaGljcy5kcmF3T3ZhbChyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9GcmVlVGV4dEZpZ3VyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ZyZWVUZXh0RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2ZDhlNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ZyZWVUZXh0RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlbGF0aXZlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuRmxvd1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuUGFyYWdyYXBoVGV4dExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5UZXh0RmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLS8qKgotICogRmlndXJlIHRvIHN1cHBvcnQgZnJlZSB0ZXh0IGluIHRoZSBkaWFncmFtLCB3aXRob3V0IGFuIGltYWdlIGF0dGFjaGVkIHRvIGl0LgotICogRnJlZVRleHRGaWd1cmUgd3JhcHBlciBvdmVyIHtAbGluayBGbG93UGFnZX0gYW5kIHtAbGluayBUZXh0Rmxvd30uIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIga2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGcmVlVGV4dEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQlwcml2YXRlIEZsb3dQYWdlIHRleHRGbG93UGFnZTsKLQotCXByaXZhdGUgVGV4dEZsb3cgdGV4dEZsb3c7Ci0KLQlwdWJsaWMgRnJlZVRleHRGaWd1cmUoKSB7Ci0JCXRleHRGbG93UGFnZSA9IG5ldyBGbG93UGFnZSgpOwotCQl0ZXh0Rmxvd1BhZ2Uuc2V0SG9yaXpvbnRhbEFsaWdtZW50KFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUik7Ci0JCXNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlhZGQodGV4dEZsb3dQYWdlLCBuZXcgUmVsYXRpdmVMb2NhdG9yKHRleHRGbG93UGFnZSwKLQkJCQlQb3NpdGlvbkNvbnN0YW50cy5BTFdBWVNfTEVGVCkpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0Rmxvdy5nZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgbmV3VGV4dCkgewotCQl0ZXh0Rmxvd1BhZ2UucmVtb3ZlQWxsKCk7Ci0JCXRleHRGbG93ID0gbmV3IFRleHRGbG93KCk7Ci0JCXRleHRGbG93LnNldEZvbnQoVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UKTsKLQkJdGV4dEZsb3cuc2V0TGF5b3V0TWFuYWdlcihuZXcgUGFyYWdyYXBoVGV4dExheW91dCh0ZXh0RmxvdywKLQkJCQlQYXJhZ3JhcGhUZXh0TGF5b3V0LldPUkRfV1JBUF9UUlVOQ0FURSkpOwotCQl0ZXh0Rmxvdy5zZXRUZXh0KG5ld1RleHQpOwotCQl0ZXh0Rmxvd1BhZ2UuYWRkKHRleHRGbG93KTsKLQl9Ci0KLQlwdWJsaWMgRmxvd1BhZ2UgZ2V0VGV4dEZsb3dQYWdlKCkgewotCQlyZXR1cm4gdGV4dEZsb3dQYWdlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnNldEZvbnQoZik7Ci0JCXRleHRGbG93LnNldEZvbnQoZik7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBmZykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnNldEZvcmVncm91bmRDb2xvcihmZyk7Ci0JCXRleHRGbG93LnNldEZvcmVncm91bmRDb2xvcihmZyk7Ci0JfQotCi0JcHVibGljIFRleHRGbG93IGdldFRleHRGbG93KCkgewotCQlyZXR1cm4gdGV4dEZsb3c7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ltYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjRlMDFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBJbWFnZSBsb2NhdGlvbiBjb25zdGFudHMgcmVmZXJlbmNlZCBpbiBkaWFncmFtLgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEltYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIEFDVElWSVRZID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0SW1hZ2UoInNoYXBlL2FjdGl2aXR5LmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElURVJBVElPTiA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJzaGFwZS9pdGVyYXRpb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgUEhBU0UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoCi0JCQkic2hhcGUvcGhhc2UuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgTUlMRVNUT05FID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0SW1hZ2UoInNoYXBlL21pbGVzdG9uZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBST0xFID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKAotCQkJInNoYXBlL3JvbGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgVEFTSyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgKLQkJCSJzaGFwZS90YXNrLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFRBU0tfREVTQ1JJUFRPUiA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJzaGFwZS90YXNrZGVzY3JpcHRvci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUiA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzaGFwZS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQVJUSUZBQ1QgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZSgic2hhcGUvYXJ0aWZhY3QuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgREVMSVZFUkFCTEUgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZSgic2hhcGUvZGVsaXZlcmFibGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgT1VUQ09NRSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJzaGFwZS9vdXRjb21lLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFdPUktfUFJPRFVDVCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJXb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgVEFTS19ERVNDUklQVE9SXzE2ID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNoYXBlL3Rhc2tkZXNfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFJPTEVfREVTQ1JJUFRPUl8xNiA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzaGFwZS9yb2xlZGVzX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl8xNiA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzaGFwZS93b3JrZGVzX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvTm90ZUZpZ3VyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL05vdGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTdhYjFlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvTm90ZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIEphbWVzIFRoYXJpbwotICogQHNpbmNlICAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RlRmlndXJlCi0gICAgICAgIGV4dGVuZHMgVGV4dEZpZ3VyZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPUk5FUl9TSVpFID0gNDsKLQotICAgIHB1YmxpYyBOb3RlRmlndXJlKCkgewotICAgICAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMudG9vbHRpcEJhY2tncm91bmQpOwotICAgICAgICBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCi0gICAgICAgIHNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKENPUk5FUl9TSVpFKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLSAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBnZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0KLSAgICAgICAgZ3JhcGhpY3MudHJhbnNsYXRlKGdldExvY2F0aW9uKCkpOwotCi0gICAgICAgIC8vIGZpbGwgdGhlIG5vdGUKLSAgICAgICAgUG9pbnRMaXN0IG91dGxpbmUgPSBuZXcgUG9pbnRMaXN0KCk7Ci0KLSAgICAgICAgb3V0bGluZS5hZGRQb2ludCgwLCAwKTsKLSAgICAgICAgb3V0bGluZS5hZGRQb2ludChyZWN0LndpZHRoIC0gQ09STkVSX1NJWkUsIDApOwotICAgICAgICBvdXRsaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSAxLCBDT1JORVJfU0laRSk7Ci0gICAgICAgIG91dGxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIDEsIHJlY3QuaGVpZ2h0IC0gMSk7Ci0gICAgICAgIG91dGxpbmUuYWRkUG9pbnQoMCwgcmVjdC5oZWlnaHQgLSAxKTsKLQotICAgICAgICBncmFwaGljcy5maWxsUG9seWdvbihvdXRsaW5lKTsKLQotICAgICAgICAvLyBkcmF3IHRoZSBpbm5lciBvdXRsaW5lCi0gICAgICAgIFBvaW50TGlzdCBpbm5lckxpbmUgPSBuZXcgUG9pbnRMaXN0KCk7Ci0KLSAgICAgICAgaW5uZXJMaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSBDT1JORVJfU0laRSAtIDEsIDApOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIENPUk5FUl9TSVpFIC0gMSwgQ09STkVSX1NJWkUpOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIDEsIENPUk5FUl9TSVpFKTsKLSAgICAgICAgaW5uZXJMaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSBDT1JORVJfU0laRSAtIDEsIDApOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQoMCwgMCk7Ci0gICAgICAgIGlubmVyTGluZS5hZGRQb2ludCgwLCByZWN0LmhlaWdodCAtIDEpOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIDEsIHJlY3QuaGVpZ2h0IC0gMSk7Ci0gICAgICAgIGlubmVyTGluZS5hZGRQb2ludChyZWN0LndpZHRoIC0gMSwgQ09STkVSX1NJWkUpOwotCi0gICAgICAgIGdyYXBoaWNzLmRyYXdQb2x5Z29uKGlubmVyTGluZSk7Ci0KLSAgICAgICAgZ3JhcGhpY3MudHJhbnNsYXRlKGdldExvY2F0aW9uKCkuZ2V0TmVnYXRlZCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOWM4YTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZsb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LlJhaXNlZE1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBGaWd1cmUgZm9yIHtAbGluayBSb2xlVGFza0NvbXBvc2l0ZX0uCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sb3IgQkdfQ09MT1IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NSwKLQkJCTI1NSwgMTU2KTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfV0lEVEggPSA1MDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOT1JfU1BBQ0lORyA9IDIwOwotCi0JcHJpdmF0ZSBGaWd1cmUgdGFza3NGaWd1cmU7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUoKSB7Ci0JCUZsb3dMYXlvdXQgbGF5b3V0ID0gbmV3IEZsb3dMYXlvdXQodHJ1ZSk7Ci0JCWxheW91dC5zZXRNaW5vckFsaWdubWVudChGbG93TGF5b3V0LkFMSUdOX0NFTlRFUik7Ci0JCWxheW91dC5zZXRNYWpvckFsaWdubWVudChGbG93TGF5b3V0LkFMSUdOX0xFRlRUT1ApOwotCQlsYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7Ci0JCWxheW91dC5zZXRNaW5vclNwYWNpbmcoTUlOT1JfU1BBQ0lORyk7Ci0JCWxheW91dC5zZXRPYnNlcnZlVmlzaWJpbGl0eSh0cnVlKTsKLQotCQlzZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCXNldEJvcmRlcihuZXcgUmFpc2VkTWFyZ2luQm9yZGVyKCkpOwotCQlzZXRCYWNrZ3JvdW5kQ29sb3IoQkdfQ09MT1IpOwotCQlzZXRPcGFxdWUodHJ1ZSk7Ci0KLQkJdGFza3NGaWd1cmUgPSBuZXcgRmlndXJlKCkgewotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmUjZ2V0UHJlZmVycmVkU2l6ZShpbnQsIGludCkKLQkJCSAqLwotCQkJcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KSB7Ci0JCQkJSUZpZ3VyZSBmaXJzdENoaWxkID0gKElGaWd1cmUpIGdldENoaWxkcmVuKCkuZ2V0KDApOwotCQkJCWlmIChmaXJzdENoaWxkICE9IHRoaXMpIHsKLQkJCQkJaW50IG9mZnNldCA9IGZpcnN0Q2hpbGQuZ2V0U2l6ZSgpLndpZHRoOyAvLyBmaXJzdENoaWxkLmdldFNpemUoKS53aWR0aAotCQkJCQkvLyArCi0JCQkJCS8vIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlLnRoaXMuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKQotCQkJCQkvLyArCi0JCQkJCS8vIE1JTk9SX1NQQUNJTkc7Ci0JCQkJCWlmICh3SGludCA8IG9mZnNldCkgewotCi0JCQkJCX0KLQkJCQkJd0hpbnQgPSB3SGludCAtIG9mZnNldDsKLQkJCQkJaWYgKHdIaW50ID4gTUFYX1dJRFRIKSB7Ci0JCQkJCQl3SGludCA9IE1BWF9XSURUSDsKLQkJCQkJfQotCQkJCX0KLQkJCQlEaW1lbnNpb24gZGltID0gc3VwZXIuZ2V0UHJlZmVycmVkU2l6ZSh3SGludCwgaEhpbnQpOwotCQkJCXJldHVybiBkaW07Ci0JCQl9Ci0JCX07Ci0JCUZsb3dMYXlvdXQgZmxvd0xheW91dCA9IG5ldyBGbG93TGF5b3V0KCk7Ci0JCWZsb3dMYXlvdXQuc2V0TWlub3JTcGFjaW5nKDEwKTsKLQkJZmxvd0xheW91dC5zZXRNaW5vckFsaWdubWVudChGbG93TGF5b3V0LkFMSUdOX0NFTlRFUik7Ci0JCXRhc2tzRmlndXJlLnNldExheW91dE1hbmFnZXIoZmxvd0xheW91dCk7Ci0JCXRhc2tzRmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJc3VwZXIuYWRkKHRhc2tzRmlndXJlLCBudWxsLCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlI2FkZChJRmlndXJlLCBPYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoSUZpZ3VyZSBmaWd1cmUsIE9iamVjdCBjb25zdHJhaW50LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGdldENoaWxkcmVuKCkuc2l6ZSgpID09IDEpIHsKLQkJCXN1cGVyLmFkZChmaWd1cmUsIGNvbnN0cmFpbnQsIDApOwotCQl9IGVsc2UgewotCQkJdGFza3NGaWd1cmUuYWRkKGZpZ3VyZSwgY29uc3RyYWludCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0Zsb3dMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0Zsb3dMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmJkNzg2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvUm9sZVRhc2tGbG93TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZsb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0Zsb3dMYXlvdXQgZXh0ZW5kcyBGbG93TGF5b3V0IHsKLQotCWJvb2xlYW4gYWRqdXN0ID0gZmFsc2U7Ci0JV29ya2luZ0RhdGEgZGF0YTsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tGbG93TGF5b3V0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNIb3Jpem9udGFsCi0JICovCi0JcHVibGljIFJvbGVUYXNrRmxvd0xheW91dChib29sZWFuIGlzSG9yaXpvbnRhbCkgewotCQlzdXBlcihpc0hvcml6b250YWwpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0JcHVibGljIHZvaWQgbGF5b3V0KElGaWd1cmUgcGFyZW50KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJaWYoYWRqdXN0KXsKLQkJCWFkanVzdExheW91dChwYXJlbnQpOwotCQl9ZWxzZQotCQkJc3VwZXIubGF5b3V0KHBhcmVudCk7Ci0JfQotCWNsYXNzIFdvcmtpbmdEYXRhIHsKLQkJaW50IHJvd0hlaWdodCwgcm93V2lkdGgsIHJvd0NvdW50LCByb3dYLCByb3dZLCBtYXhXaWR0aDsKLQkJUmVjdGFuZ2xlIGJvdW5kc1tdLCBhcmVhOwotCQlJRmlndXJlIHJvd1tdOwotCX0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgc3RhdGUgb2Ygcm93IGRhdGEsIHdoaWNoIGlzIGludGVybmFsIHRvIHRoZSBsYXlvdXQgcHJvY2Vzcy4gCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRSb3coKSB7Ci0JCWRhdGEucm93WCA9IDA7Ci0JCWRhdGEucm93SGVpZ2h0ID0gMDsKLQkJZGF0YS5yb3dXaWR0aCA9IDA7Ci0JCWRhdGEucm93Q291bnQgPSAwOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlIGRhdGEgZm9yIGxheWluZyBvdXQgY2hpbGRyZW4sIGJhc2VkIG9uIHRoZSBGaWd1cmUgZ2l2ZW4gYXMgaW5wdXQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgZmlndXJlCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdFZhcmlhYmxlcyhJRmlndXJlIHBhcmVudCkgewotCQlkYXRhLnJvdyA9IG5ldyBJRmlndXJlW3BhcmVudC5nZXRDaGlsZHJlbigpLnNpemUoKV07Ci0JCWRhdGEuYm91bmRzID0gbmV3IFJlY3RhbmdsZVtkYXRhLnJvdy5sZW5ndGhdOwotCQlkYXRhLm1heFdpZHRoID0gZGF0YS5hcmVhLndpZHRoOwotCX0KLQlwcml2YXRlIHZvaWQgYWRqdXN0TGF5b3V0KElGaWd1cmUgcGFyZW50KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJZGF0YSA9IG5ldyBXb3JraW5nRGF0YSgpOwotCQlSZWN0YW5nbGUgcmVsYXRpdmVBcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsKLQkJZGF0YS5hcmVhID0gdHJhbnNwb3Nlci50KHJlbGF0aXZlQXJlYSk7Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQlpbnQgZHg7Ci0KLQkJLy9DYWxjdWxhdGUgdGhlIGhpbnRzIHRvIGJlIHBhc3NlZCB0byBjaGlsZHJlbgotCQlpbnQgd0hpbnQgPSAtMTsKLQkJaW50IGhIaW50ID0gLTE7Ci0JCWlmIChpc0hvcml6b250YWwoKSkKLQkJCXdIaW50ID0gcGFyZW50LmdldENsaWVudEFyZWEoKS53aWR0aDsKLQkJZWxzZQotCQkJaEhpbnQgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodDsKLQotCQlpbml0VmFyaWFibGVzKHBhcmVudCk7Ci0JCWluaXRSb3coKTsKLQkJaW50IGkgPSAwOyAKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSUZpZ3VyZSBmID0gKElGaWd1cmUpaXRlcmF0b3IubmV4dCgpOwotCQkJRGltZW5zaW9uIHByZWYgPSB0cmFuc3Bvc2VyLnQoZ2V0Q2hpbGRTaXplKGYsIHdIaW50LCBoSGludCkpOwotCQkJUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIHByZWYud2lkdGgsIHByZWYuaGVpZ2h0KTsKLQotCQkJaWYgKGRhdGEucm93Q291bnQgPiAwKSB7Ci0JCQkJaWYgKGRhdGEucm93V2lkdGggKyBwcmVmLndpZHRoID4gZGF0YS5tYXhXaWR0aCkKLQkJCQkJbGF5b3V0Um93KHBhcmVudCk7Ci0JCQl9Ci0JCQlyLnggPSBkYXRhLnJvd1g7Ci0JCQlyLnkgPSBkYXRhLnJvd1k7Ci0JCQlkeCA9IHIud2lkdGggKyBnZXRNaW5vclNwYWNpbmcoKTsKLQkJCWRhdGEucm93WCArPSBkeDsKLQkJCWRhdGEucm93V2lkdGggKz0gZHg7Ci0JCQlkYXRhLnJvd0hlaWdodCA9IE1hdGgubWF4KGRhdGEucm93SGVpZ2h0LCByLmhlaWdodCk7Ci0JCQlkYXRhLnJvdyBbZGF0YS5yb3dDb3VudF0gPSBmOwotCQkJZGF0YS5ib3VuZHNbZGF0YS5yb3dDb3VudF0gPSByOwotCQkJZGF0YS5yb3dDb3VudCsrOwotCQkJaSsrOwotCQl9Ci0JCWlmIChkYXRhLnJvd0NvdW50ICE9IDApCi0JCQlsYXlvdXRSb3cocGFyZW50KTsKLQkJZGF0YSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWRqdXN0KGJvb2xlYW4gYWRqdXN0KSB7Ci0JCXRoaXMuYWRqdXN0ID0gYWRqdXN0OwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9TZWxlY3RhYmxlTGFiZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9TZWxlY3RhYmxlTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTk5MjViOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvU2VsZWN0YWJsZUxhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5Lkluc2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIEEgY3VzdG9taXplZCBMYWJlbCBmb3Igc2VsZWN0aW9uLiBQcmltYXJ5IHNlbGVjdGlvbiBpcyBkZW5vdGVkIGJ5IGhpZ2hsaWdodAotICogYW5kIGZvY3VzIHJlY3RhbmdsZS4gTm9ybWFsIHNlbGVjdGlvbiBpcyBkZW5vdGVkIGJ5IGhpZ2hsaWdodCBvbmx5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0YWJsZUxhYmVsIGV4dGVuZHMgTGFiZWwgewotCi0JcHJpdmF0ZSBib29sZWFuIHNlbGVjdGVkOwotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0ZvY3VzOwotCi0JcHJpdmF0ZSBSZWN0YW5nbGUgZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkgewotCQlSZWN0YW5nbGUgYm91bmRzID0gZ2V0VGV4dEJvdW5kcygpOwotCQlib3VuZHMuZXhwYW5kKG5ldyBJbnNldHMoMiwgMiwgMCwgMCkpOwotCQl0cmFuc2xhdGVUb1BhcmVudChib3VuZHMpOwotCQlib3VuZHMuaW50ZXJzZWN0KGdldEJvdW5kcygpKTsKLQkJcmV0dXJuIGJvdW5kczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbCNwYWludEZpZ3VyZShHcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCWdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotCQkJZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVCYWNrZ3JvdW5kU2VsZWN0ZWQpOwotCQkJZ3JhcGhpY3MuZmlsbFJlY3RhbmdsZShnZXRTZWxlY3Rpb25SZWN0YW5nbGUoKSk7Ci0JCQlncmFwaGljcy5wb3BTdGF0ZSgpOwotCQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLQkJfQotCQlpZiAoaGFzRm9jdXMpIHsKLQkJCWdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotCQkJZ3JhcGhpY3Muc2V0WE9STW9kZSh0cnVlKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkucmVzaXplKC0xLCAtMSkpOwotCQkJZ3JhcGhpY3MucG9wU3RhdGUoKTsKLQkJfQotCQlzdXBlci5wYWludEZpZ3VyZShncmFwaGljcyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIHRoaXMgU2ltcGxlQWN0aXZpdHlMYWJlbAotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogICAgICAgICAgICB0cnVlIHdpbGwgY2F1c2UgdGhlIGxhYmVsIHRvIGFwcGVhciBzZWxlY3RlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gYikgewotCQlzZWxlY3RlZCA9IGI7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmb2N1cyBzdGF0ZSBvZiB0aGlzIFNpbXBsZUFjdGl2aXR5TGFiZWwKLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqICAgICAgICAgICAgdHJ1ZSB3aWxsIGNhdXNlIGEgZm9jdXMgcmVjdGFuZ2xlIHRvIGJlIGRyYXduIGFyb3VuZCB0aGUgdGV4dAotCSAqICAgICAgICAgICAgb2YgdGhlIExhYmVsCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoYm9vbGVhbiBiKSB7Ci0JCWhhc0ZvY3VzID0gYjsKLQkJcmVwYWludCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1RleHRGaWd1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9UZXh0RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5ZTFhOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1RleHRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JbWFnZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWxhdGl2ZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuRmxvd1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuUGFyYWdyYXBoVGV4dExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5UZXh0RmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUZXh0RmlndXJlIGlzIGN1c3RvbWl6YWJsZSBmaWd1cmUgdG8gYWxsb3cgd29yZC13cmFwaW5nIGFuZCB3aXRoIGltYWdlLiAKLSAqIHtAbGluayBMYWJlbH0gZG8gbm90IHN1cHBvcnQgd29yZC13cmFwLiAgVGV4dEZpZ3VyZSBpcyB3cmFwcGVyIG92ZXIge0BsaW5rIFRleHRGbG93fQotICogYW5kIHtAbGluayBGbG93UGFnZX0gdG8gc3VwcG9ydCB3b3JkLXdyYXAgYW5kIGltYWdlLiAKLSAqIEBhdXRob3IgSmFtZXMgVGhhcmlvCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGV4dEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQlwcml2YXRlIEZsb3dQYWdlIHRleHRGbG93UGFnZTsKLQotCXByaXZhdGUgVGV4dEZsb3cgdGV4dEZsb3c7Ci0KLQlwcml2YXRlIEltYWdlRmlndXJlIGltYWdlRmlndXJlOwotCi0JcHVibGljIFRleHRGaWd1cmUoKSB7Ci0JCXRleHRGbG93UGFnZSA9IG5ldyBGbG93UGFnZSgpOwotCQl0ZXh0Rmxvd1BhZ2Uuc2V0SG9yaXpvbnRhbEFsaWdtZW50KFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUik7Ci0JCXNldExheW91dE1hbmFnZXIobmV3IFRvb2xiYXJMYXlvdXQoKSk7Ci0JCWltYWdlRmlndXJlID0gbmV3IEltYWdlRmlndXJlKCk7Ci0JCWFkZChpbWFnZUZpZ3VyZSwgbmV3IFJlbGF0aXZlTG9jYXRvcihpbWFnZUZpZ3VyZSwKLQkJCQlQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpKTsKLQkJYWRkKHRleHRGbG93UGFnZSwgbmV3IFJlbGF0aXZlTG9jYXRvcih0ZXh0Rmxvd1BhZ2UsCi0JCQkJUG9zaXRpb25Db25zdGFudHMuQUxXQVlTX0xFRlQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoSW1hZ2UgaW1hZ2UpIHsKLQkJaW1hZ2VGaWd1cmUuc2V0SW1hZ2UoaW1hZ2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHRGbG93LmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7Ci0JCXRleHRGbG93UGFnZS5yZW1vdmVBbGwoKTsKLQkJdGV4dEZsb3cgPSBuZXcgVGV4dEZsb3coKTsKLQkJdGV4dEZsb3cuc2V0Rm9udChUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlQpOwotCQl0ZXh0Rmxvdy5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBQYXJhZ3JhcGhUZXh0TGF5b3V0KHRleHRGbG93LAotCQkJCVBhcmFncmFwaFRleHRMYXlvdXQuV09SRF9XUkFQX0hBUkQpKTsKLQkJdGV4dEZsb3cuc2V0VGV4dChuZXdUZXh0KTsKLQkJdGV4dEZsb3dQYWdlLmFkZCh0ZXh0Rmxvdyk7Ci0JfQotCi0JcHVibGljIEZsb3dQYWdlIGdldFRleHRGbG93UGFnZSgpIHsKLQkJcmV0dXJuIHRleHRGbG93UGFnZTsKLQl9Ci0KLQlwdWJsaWMgVGV4dEZsb3cgZ2V0VGV4dEZsb3coKSB7Ci0JCXJldHVybiB0ZXh0RmxvdzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV1BDb21wYXJ0bWVudEZpZ3VyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dQQ29tcGFydG1lbnRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTdiMzkxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV1BDb21wYXJ0bWVudEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuUmFpc2VkTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1BDb21wYXJ0bWVudEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIHdwQ29sb3IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NSwKLQkJCTI1NSwgMTU2KTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgYXJ0aWZhY3RDb2xvciA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwKLQkJCTI1NSwgMjU1LCAxNTYpOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBkZWxpdmVyYWJsZUNvbG9yID0gbmV3IENvbG9yKAotCQkJRGlzcGxheS5nZXRDdXJyZW50KCksIDIwNiwgMjU1LCAyMTYpOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBvdXRjb21lQ29sb3IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksCi0JCQkyMDYsIDI1NSwgMTAwKTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIG5ld1dQTmFtZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLldQQ29tcGFydG1lbnRGaWd1cmVfMDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIExhYmVsIGxhYmVsOwotCi0JV1BGaWd1cmUgZmlndXJlID0gbnVsbDsKLQotCS8qKgotCSAqIFdvcmtQcm9kdWN0IENvbXBhcnRtZW50IC0gV2l0aCBiYWNrZ3JvdW5kIGZpbGxlZCBkZXBlbmRpbmcgb24gVHlwZSBvZiB0aGUKLQkgKiBXb3JrUHJvZHVjdC4KLQkgKi8KLQlwdWJsaWMgV1BDb21wYXJ0bWVudEZpZ3VyZShMYWJlbCBuYW1lLCBpbnQgdHlwZSkgewotCQlsYWJlbCA9IG5hbWU7Ci0JCVRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoKTsKLQkJc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQlzZXRPcGFxdWUodHJ1ZSk7Ci0JCXNldEJvcmRlcihuZXcgUmFpc2VkTWFyZ2luQm9yZGVyKCkpOwotCQlpZiAodHlwZSA9PSAxKQotCQkJc2V0QmFja2dyb3VuZENvbG9yKGFydGlmYWN0Q29sb3IpOwotCQllbHNlIGlmICh0eXBlID09IDIpCi0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoZGVsaXZlcmFibGVDb2xvcik7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gMykKLQkJCXNldEJhY2tncm91bmRDb2xvcihvdXRjb21lQ29sb3IpOwotCQllbHNlCi0JCQlzZXRCYWNrZ3JvdW5kQ29sb3Iod3BDb2xvcik7Ci0JCWxhYmVsLnNldFRleHQobmV3V1BOYW1lKTsKLQkJYWRkKGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgTGFiZWwgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJbGFiZWwuc2V0VGV4dChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChMYWJlbCBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV1BGaWd1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XUEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MmExMGMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XUEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdEJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5JbnNldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXUEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQlwdWJsaWMgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoKTsKLQotCXB1YmxpYyBXUEZpZ3VyZShMYWJlbCBsKSB7Ci0JCXN1cGVyKCk7Ci0JCWFkZChsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBnKSB7Ci0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCQlSZWN0YW5nbGUgYmFyID0gY2xpZW50QXJlYS5nZXRDb3B5KCk7Ci0JCWJhci5jcm9wKG5ldyBJbnNldHMoMCwgNSwgNSwgNSkpOwotCQlnLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ncmF5KTsKLQkJZy5maWxsUmVjdGFuZ2xlKGJhci5nZXRUcmFuc2xhdGVkKDYsIDYpKTsKLQkJZy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMueWVsbG93KTsKLQkJZy5maWxsUmVjdGFuZ2xlKGJhcik7Ci0JCWcuc2V0TGluZVN0eWxlKDIpOwotCQlnLnNldExpbmVXaWR0aCgxKTsKLQkJc3VwZXIucGFpbnRGaWd1cmUoZyk7Ci0JfQotCi0JcHVibGljIExhYmVsIGdldEZpZ3VyZSgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsTmFtZShTdHJpbmcgbmFtZSkgewotCQlsYWJlbC5zZXRUZXh0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKExhYmVsIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQljbGFzcyBCb3ggZXh0ZW5kcyBGaWd1cmUgewotCQlwdWJsaWMgQm94KEluc2V0cyBpbnNldHMpIHsKLQkJCXNldEJvcmRlcihuZXcgQm94Qm9yZGVyKGluc2V0cykpOwotCQkJVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoKTsKLQkJCXRvb2xiYXJMYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7Ci0JCQlzZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQpOwotCQkJc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnJlZCk7Ci0KLQkJfQotCi0JCXByaXZhdGUgY2xhc3MgQm94Qm9yZGVyIGV4dGVuZHMgQWJzdHJhY3RCb3JkZXIgewotCi0JCQlwdWJsaWMgSW5zZXRzIGluc2V0cyA9IG5ldyBJbnNldHMoMSwgMCwgMCwgMCk7Ci0KLQkJCXB1YmxpYyBCb3hCb3JkZXIoSW5zZXRzIGluc2V0cykgewotCQkJCXRoaXMuaW5zZXRzID0gaW5zZXRzOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNnZXRJbnNldHMoSUZpZ3VyZSkKLQkJCSAqLwotCQkJcHVibGljIEluc2V0cyBnZXRJbnNldHMoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJCQlyZXR1cm4gaW5zZXRzOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNwYWludChJRmlndXJlLCBHcmFwaGljcywgSW5zZXRzKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwYWludChJRmlndXJlIGZpZ3VyZSwgR3JhcGhpY3MgZ3JhcGhpY3MsIEluc2V0cyBpbnNldHMpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGdldFBhaW50UmVjdGFuZ2xlKGZpZ3VyZSwgaW5zZXRzKTsKLQkJCQlncmFwaGljcy5kcmF3TGluZShyZWN0LmdldFRvcExlZnQoKSwgcmVjdC5nZXRUb3BSaWdodCgpKTsKLQkJCX0KLQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV3JhcExhYmVsbkltYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV3JhcExhYmVsbkltYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmODBkZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dyYXBMYWJlbG5JbWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkltYWdlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuRmxvd1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuUGFyYWdyYXBoVGV4dExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5UZXh0RmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3JhcExhYmVsbkltYWdlIGV4dGVuZHMgRmlndXJlIHsKLQotCS8vIFRoZSBpbm5lciBUZXh0RmxvdwotCXByaXZhdGUgVGV4dEZsb3cgdGV4dEZsb3c7Ci0KLQlwcml2YXRlIEltYWdlIGltYWdlOwotCi0JcHVibGljIFdyYXBMYWJlbG5JbWFnZShJbWFnZSBpbWFnZSkgewotCQlzZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigzKSk7Ci0JCUltYWdlRmlndXJlIGZpZyA9IG5ldyBJbWFnZUZpZ3VyZSgpOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JCWZpZy5zZXRJbWFnZShpbWFnZSk7Ci0JCWFkZChmaWcpOwotCQlGbG93UGFnZSBmbG93UGFnZSA9IG5ldyBGbG93UGFnZSgpOwotCi0JCXRleHRGbG93ID0gbmV3IFRleHRGbG93KCk7Ci0KLQkJdGV4dEZsb3cuc2V0TGF5b3V0TWFuYWdlcihuZXcgUGFyYWdyYXBoVGV4dExheW91dCh0ZXh0RmxvdywKLQkJCQlQYXJhZ3JhcGhUZXh0TGF5b3V0LldPUkRfV1JBUF9TT0ZUKSk7Ci0JCQotCQlmbG93UGFnZS5hZGQodGV4dEZsb3cpOwotCQlmbG93UGFnZS5zZXRTaXplKDQwLDQwKTsKLQotCQlzZXRMYXlvdXRNYW5hZ2VyKG5ldyBUb29sYmFyTGF5b3V0KCkpOwotCQlhZGQoZmxvd1BhZ2UpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBpbnNpZGUgdGhlIFRleHRGbG93LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgZmxvdyBpbnNpZGUgdGhlIHRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dEZsb3cuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRleHQgb2YgdGhlIFRleHRGbG93IHRvIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqICAgICAgICAgICAgdGhlIG5ldyB0ZXh0IHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJdGV4dEZsb3cuc2V0VGV4dChuZXdUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgVGhlIGltYWdlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCXB1YmxpYyBUZXh0RmxvdyBnZXRUZXh0RmxvdygpewotCQlyZXR1cm4gdGV4dEZsb3c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV3JhcHBhYmxlTGFiZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XcmFwcGFibGVMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTg3M2M4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XcmFwcGFibGVMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5Lkluc2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5CcmVha0l0ZXJhdG9yOwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHRleHQgd3JhcCBpbiBhIGxhYmVsLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgV3JhcHBhYmxlTGFiZWwgZXh0ZW5kcyBGaWd1cmUgaW1wbGVtZW50cyBQb3NpdGlvbkNvbnN0YW50cyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRUxMSVBTSVMgPSAiLi4uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbWFnZSBpY29uOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBzdWJTdHJpbmdUZXh0OwotCi0JcHJpdmF0ZSBEaW1lbnNpb24gdGV4dFNpemU7Ci0KLQlwcml2YXRlIERpbWVuc2lvbiBzdWJTdHJpbmdUZXh0U2l6ZTsKLQotCXByaXZhdGUgRGltZW5zaW9uIGljb25TaXplID0gbmV3IERpbWVuc2lvbigwLCAwKTsKLQotCXByaXZhdGUgUG9pbnQgaWNvbkxvY2F0aW9uOwotCi0JcHJpdmF0ZSBQb2ludCB0ZXh0TG9jYXRpb247Ci0KLQlwcml2YXRlIGludCB0ZXh0QWxpZ25tZW50ID0gQ0VOVEVSOwotCi0JcHJpdmF0ZSBpbnQgaWNvbkFsaWdubWVudCA9IENFTlRFUjsKLQotCXByaXZhdGUgaW50IGxhYmVsQWxpZ25tZW50ID0gQ0VOVEVSOwotCi0JcHJpdmF0ZSBpbnQgdGV4dFBsYWNlbWVudCA9IFNPVVRIOwotCi0JcHJpdmF0ZSBpbnQgaWNvblRleHRHYXAgPSAzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfU0VMRUNURUQgPSBNQVhfRkxBRyA8PCAxLAotCQkJRkxBR19IQVNGT0NVUyA9IE1BWF9GTEFHIDw8IDIsIEZMQUdfV1JBUCA9IE1BWF9GTEFHIDw8IDUsCi0JCQlGTEFHX1dSQVBfQUxJR04gPSBNQVhfRkxBRyA8PCA2OwotCi0JLy8gVGhlIHByaW1hcnkgZGltZW5zaW9ucyB1c2VkIHRvIGNhbGN1bGF0ZSB0ZXh0IHNpemUuCi0JcHJpdmF0ZSBEaW1lbnNpb24gdGV4dERpbWVuc2lvbiA9IG5ldyBEaW1lbnNpb24oLTEsIC0xKTsKLQotCXByaXZhdGUgRGltZW5zaW9uIHByZWZTaXplRGltZW5zaW9uID0gbmV3IERpbWVuc2lvbigtMSwgLTEpOwotCi0JcHJpdmF0ZSBpbnQgd3JhcFdpZHRoOwotCi0JcHVibGljIFdyYXBwYWJsZUxhYmVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIExhYmVsIHdpdGggcGFzc2VkIFN0cmluZyBhcyBpdHMgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgdGhlIGxhYmVsIHRleHQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFdyYXBwYWJsZUxhYmVsKFN0cmluZyBzKSB7Ci0JCXNldFRleHQocyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgV3JhcHBlZExhYmVsIHdpdGggcGFzc2VkIEltYWdlIGFzIGl0cyBpY29uLgotCSAqIAotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICB0aGUgV3JhcHBlZExhYmVsIGltYWdlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBXcmFwcGFibGVMYWJlbChJbWFnZSBpKSB7Ci0JCXNldEljb24oaSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgV3JhcHBlZExhYmVsIHdpdGggcGFzc2VkIFN0cmluZyBhcyB0ZXh0IGFuZCBwYXNzZWQgSW1hZ2UgYXMKLQkgKiBpdHMgaWNvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgdGhlIFdyYXBwZWRMYWJlbCB0ZXh0Ci0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIHRoZSBXcmFwcGVkTGFiZWwgaW1hZ2UKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFdyYXBwYWJsZUxhYmVsKFN0cmluZyBzLCBJbWFnZSBpKSB7Ci0JCXNldFRleHQocyk7Ci0JCXNldEljb24oaSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFsaWduT25IZWlnaHQoUG9pbnQgbG9jLCBEaW1lbnNpb24gc2l6ZSwgaW50IGFsaWdubWVudCkgewotCQlJbnNldHMgaW5zZXRzID0gZ2V0SW5zZXRzKCk7Ci0JCXN3aXRjaCAoYWxpZ25tZW50KSB7Ci0JCWNhc2UgVE9QOgotCQkJbG9jLnkgPSBpbnNldHMudG9wOwotCQkJYnJlYWs7Ci0JCWNhc2UgQk9UVE9NOgotCQkJbG9jLnkgPSBib3VuZHMuaGVpZ2h0IC0gc2l6ZS5oZWlnaHQgLSBpbnNldHMuYm90dG9tOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlsb2MueSA9IChib3VuZHMuaGVpZ2h0IC0gc2l6ZS5oZWlnaHQpIC8gMjsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhbGlnbk9uV2lkdGgoUG9pbnQgbG9jLCBEaW1lbnNpb24gc2l6ZSwgaW50IGFsaWdubWVudCkgewotCQlJbnNldHMgaW5zZXRzID0gZ2V0SW5zZXRzKCk7Ci0JCXN3aXRjaCAoYWxpZ25tZW50KSB7Ci0JCWNhc2UgTEVGVDoKLQkJCWxvYy54ID0gaW5zZXRzLmxlZnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBSSUdIVDoKLQkJCWxvYy54ID0gYm91bmRzLndpZHRoIC0gc2l6ZS53aWR0aCAtIGluc2V0cy5yaWdodDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJbG9jLnggPSAoYm91bmRzLndpZHRoIC0gc2l6ZS53aWR0aCkgLyAyOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZUFsaWdubWVudCgpIHsKLQkJc3dpdGNoICh0ZXh0UGxhY2VtZW50KSB7Ci0JCWNhc2UgRUFTVDoKLQkJY2FzZSBXRVNUOgotCQkJYWxpZ25PbkhlaWdodCh0ZXh0TG9jYXRpb24sIGdldFRleHRTaXplKCksIHRleHRBbGlnbm1lbnQpOwotCQkJYWxpZ25PbkhlaWdodChpY29uTG9jYXRpb24sIGljb25TaXplLCBpY29uQWxpZ25tZW50KTsKLQkJCWJyZWFrOwotCQljYXNlIE5PUlRIOgotCQljYXNlIFNPVVRIOgotCQkJYWxpZ25PbldpZHRoKHRleHRMb2NhdGlvbiwgZ2V0U3ViU3RyaW5nVGV4dFNpemUoKSwgdGV4dEFsaWdubWVudCk7Ci0JCQlhbGlnbk9uV2lkdGgoaWNvbkxvY2F0aW9uLCBpY29uU2l6ZSwgaWNvbkFsaWdubWVudCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZXMgdGhlIHNpemUgb2YgdGhlIFdyYXBwZWRMYWJlbCB1c2luZyB0aGUgcGFzc2VkIERpbWVuc2lvbiBhcyB0aGUKLQkgKiBzaXplIG9mIHRoZSBXcmFwcGVkTGFiZWwncyB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0eHRTaXplCi0JICogICAgICAgICAgICB0aGUgcHJlY2FsY3VsYXRlZCBzaXplIG9mIHRoZSBXcmFwcGVkTGFiZWwncyB0ZXh0Ci0JICogQHJldHVybiB0aGUgV3JhcHBlZExhYmVsJ3Mgc2l6ZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZUxhYmVsU2l6ZShEaW1lbnNpb24gdHh0U2l6ZSkgewotCQlpbnQgZ2FwID0gaWNvblRleHRHYXA7Ci0JCWlmIChnZXRJY29uKCkgPT0gbnVsbCB8fCBnZXRUZXh0KCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJZ2FwID0gMDsKLQkJRGltZW5zaW9uIGQgPSBuZXcgRGltZW5zaW9uKDAsIDApOwotCQlpZiAodGV4dFBsYWNlbWVudCA9PSBXRVNUIHx8IHRleHRQbGFjZW1lbnQgPT0gRUFTVCkgewotCQkJZC53aWR0aCA9IGljb25TaXplLndpZHRoICsgZ2FwICsgdHh0U2l6ZS53aWR0aDsKLQkJCWQuaGVpZ2h0ID0gTWF0aC5tYXgoaWNvblNpemUuaGVpZ2h0LCB0eHRTaXplLmhlaWdodCk7Ci0JCX0gZWxzZSB7Ci0JCQlkLndpZHRoID0gTWF0aC5tYXgoaWNvblNpemUud2lkdGgsIHR4dFNpemUud2lkdGgpOwotCQkJZC5oZWlnaHQgPSBpY29uU2l6ZS5oZWlnaHQgKyBnYXAgKyB0eHRTaXplLmhlaWdodDsKLQkJfQotCQlyZXR1cm4gZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlTG9jYXRpb25zKCkgewotCQl0ZXh0TG9jYXRpb24gPSBuZXcgUG9pbnQoKTsKLQkJaWNvbkxvY2F0aW9uID0gbmV3IFBvaW50KCk7Ci0KLQkJY2FsY3VsYXRlUGxhY2VtZW50KCk7Ci0JCWNhbGN1bGF0ZUFsaWdubWVudCgpOwotCQlEaW1lbnNpb24gb2Zmc2V0ID0gZ2V0U2l6ZSgpLmdldERpZmZlcmVuY2UoZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLQkJb2Zmc2V0LndpZHRoICs9IGdldFRleHRTaXplKCkud2lkdGggLSBnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpLndpZHRoOwotCQlzd2l0Y2ggKGxhYmVsQWxpZ25tZW50KSB7Ci0JCWNhc2UgQ0VOVEVSOgotCQkJb2Zmc2V0LnNjYWxlKDAuNWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTEVGVDoKLQkJCW9mZnNldC5zY2FsZSgwLjBmKTsKLQkJCWJyZWFrOwotCQljYXNlIFJJR0hUOgotCQkJb2Zmc2V0LnNjYWxlKDEuMGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE9QOgotCQkJb2Zmc2V0LmhlaWdodCA9IDA7Ci0JCQlvZmZzZXQuc2NhbGUoMC41Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBCT1RUT006Ci0JCQlvZmZzZXQuaGVpZ2h0ID0gb2Zmc2V0LmhlaWdodCAqIDI7Ci0JCQlvZmZzZXQuc2NhbGUoMC41Zik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCW9mZnNldC5zY2FsZSgwLjVmKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3dpdGNoICh0ZXh0UGxhY2VtZW50KSB7Ci0JCWNhc2UgRUFTVDoKLQkJY2FzZSBXRVNUOgotCQkJb2Zmc2V0LmhlaWdodCA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBOT1JUSDoKLQkJY2FzZSBTT1VUSDoKLQkJCW9mZnNldC53aWR0aCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCi0JCXRleHRMb2NhdGlvbi50cmFuc2xhdGUob2Zmc2V0KTsKLQkJaWNvbkxvY2F0aW9uLnRyYW5zbGF0ZShvZmZzZXQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVQbGFjZW1lbnQoKSB7Ci0JCWludCBnYXAgPSBpY29uVGV4dEdhcDsKLQkJaWYgKGljb24gPT0gbnVsbCB8fCB0ZXh0LmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCWdhcCA9IDA7Ci0JCUluc2V0cyBpbnNldHMgPSBnZXRJbnNldHMoKTsKLQotCQlzd2l0Y2ggKHRleHRQbGFjZW1lbnQpIHsKLQkJY2FzZSBFQVNUOgotCQkJaWNvbkxvY2F0aW9uLnggPSBpbnNldHMubGVmdDsKLQkJCXRleHRMb2NhdGlvbi54ID0gaWNvblNpemUud2lkdGggKyBnYXAgKyBpbnNldHMubGVmdDsKLQkJCWJyZWFrOwotCQljYXNlIFdFU1Q6Ci0JCQl0ZXh0TG9jYXRpb24ueCA9IGluc2V0cy5sZWZ0OwotCQkJaWNvbkxvY2F0aW9uLnggPSBnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpLndpZHRoICsgZ2FwICsgaW5zZXRzLmxlZnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBOT1JUSDoKLQkJCXRleHRMb2NhdGlvbi55ID0gaW5zZXRzLnRvcDsKLQkJCWljb25Mb2NhdGlvbi55ID0gZ2V0VGV4dFNpemUoKS5oZWlnaHQgKyBnYXAgKyBpbnNldHMudG9wOwotCQkJYnJlYWs7Ci0JCWNhc2UgU09VVEg6Ci0JCQl0ZXh0TG9jYXRpb24ueSA9IGljb25TaXplLmhlaWdodCArIGdhcCArIGluc2V0cy50b3A7Ci0JCQlpY29uTG9jYXRpb24ueSA9IGluc2V0cy50b3A7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIHRoZSBzaXplIG9mIHRoZSBMYWJlbCdzIHRleHQgc2l6ZS4gVGhlIHRleHQgc2l6ZSBjYWxjdWxhdGVkCi0JICogdGFrZXMgaW50byBjb25zaWRlcmF0aW9uIGlmIHRoZSBMYWJlbCdzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZC4gSWYKLQkgKiB0ZXh0IHNpemUgd2l0aG91dCBjb25zaWRlcmluZyBjdXJyZW50IHRydW5jYXRpb24gaXMgZGVzaXJlZCwgdXNlCi0JICoge0BsaW5rICNjYWxjdWxhdGVUZXh0U2l6ZSgpfS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBsYWJlbCdzIHRleHQsIHRha2luZyBpbnRvIGFjY291bnQgdHJ1bmNhdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVN1YlN0cmluZ1RleHRTaXplKCkgewotCQlyZXR1cm4gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFN1YlN0cmluZ1RleHQoKSwgZ2V0Rm9udCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBMYWJlbCdzIHRleHQuIE5vdGUgdGhhdCB0aGlzCi0JICogRGltZW5zaW9uIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIExhYmVsJ3MgZnVsbCB0ZXh0LCByZWdhcmRsZXNzIG9mCi0JICogd2hldGhlciBvciBub3QgaXRzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZC4gSWYgdGV4dCBzaXplIGNvbnNpZGVyaW5nCi0JICogY3VycmVudCB0cnVuY2F0aW9uIGlzIGRlc2lyZWQsIHVzZSB7QGxpbmsgI2NhbGN1bGF0ZVN1YlN0cmluZ1RleHRTaXplKCl9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxhYmVsJ3MgdGV4dCwgaWdub3JpbmcgdHJ1bmNhdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVRleHRTaXplKCkgewotCQkvLyByZXR1cm4gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFRleHQoKSwgZ2V0Rm9udCgpKTsKLQkJcmV0dXJuIEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyhnZXRXcmFwcGVkVGV4dChnZXRTaXplKCkud2lkdGgsCi0JCQkJZ2V0U2l6ZSgpLmhlaWdodCksIGdldEZvbnQoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJMb2NhdGlvbnMoKSB7Ci0JCWljb25Mb2NhdGlvbiA9IHRleHRMb2NhdGlvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgTGFiZWwncyBpY29uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxhYmVsIGljb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIEltYWdlIGdldEljb24oKSB7Ci0JCXJldHVybiBpY29uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgYWxpZ25tZW50IG9mIHRoZSBMYWJlbCdzIGljb24uIFRoZSBkZWZhdWx0IGlzCi0JICoge0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0NFTlRFUn0uCi0JICogCi0JICogQHJldHVybiB0aGUgaWNvbiBhbGlnbm1lbnQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGludCBnZXRJY29uQWxpZ25tZW50KCkgewotCQlyZXR1cm4gaWNvbkFsaWdubWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBib3VuZHMgb2YgdGhlIExhYmVsJ3MgaWNvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpY29uJ3MgYm91bmRzCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBSZWN0YW5nbGUgZ2V0SWNvbkJvdW5kcygpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcygpOwotCQlyZXR1cm4gbmV3IFJlY3RhbmdsZShib3VuZHMuZ2V0TG9jYXRpb24oKS50cmFuc2xhdGUoZ2V0SWNvbkxvY2F0aW9uKCkpLAotCQkJCWljb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgTGFiZWwncyBpY29uIHJlbGF0aXZlIHRvIHRoZSBMYWJlbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpY29uJ3MgbG9jYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldEljb25Mb2NhdGlvbigpIHsKLQkJaWYgKGljb25Mb2NhdGlvbiA9PSBudWxsKQotCQkJY2FsY3VsYXRlTG9jYXRpb25zKCk7Ci0JCXJldHVybiBpY29uTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2FwIGluIHBpeGVscyBiZXR3ZWVuIHRoZSBMYWJlbCdzIGljb24gYW5kIGl0cyB0ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGdhcAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEljb25UZXh0R2FwKCkgewotCQlyZXR1cm4gaWNvblRleHRHYXA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRmlndXJlI2dldE1pbmltdW1TaXplKGludCwgaW50KQotCSAqLwotCXB1YmxpYyBEaW1lbnNpb24gZ2V0TWluaW11bVNpemUoaW50IHcsIGludCBoKSB7Ci0JCWlmIChtaW5TaXplICE9IG51bGwpCi0JCQlyZXR1cm4gbWluU2l6ZTsKLQkJbWluU2l6ZSA9IG5ldyBEaW1lbnNpb24oKTsKLQkJaWYgKGdldExheW91dE1hbmFnZXIoKSAhPSBudWxsKQotCQkJbWluU2l6ZS5zZXRTaXplKGdldExheW91dE1hbmFnZXIoKS5nZXRNaW5pbXVtU2l6ZSh0aGlzLCB3LCBoKSk7Ci0KLQkJRGltZW5zaW9uIGxhYmVsU2l6ZSA9IGNhbGN1bGF0ZUxhYmVsU2l6ZShGaWd1cmVVdGlsaXRpZXMKLQkJCQkuZ2V0VGV4dEV4dGVudHMoRUxMSVBTSVMsIGdldEZvbnQoKSkuaW50ZXJzZWN0KAotCQkJCQkJRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFRleHQoKSwgZ2V0Rm9udCgpKSkpOwotCQlJbnNldHMgaW5zZXRzID0gZ2V0SW5zZXRzKCk7Ci0JCWxhYmVsU2l6ZS5leHBhbmQoaW5zZXRzLmdldFdpZHRoKCksIGluc2V0cy5nZXRIZWlnaHQoKSk7Ci0JCW1pblNpemUudW5pb24obGFiZWxTaXplKTsKLQkJcmV0dXJuIG1pblNpemU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRmlndXJlI2dldFByZWZlcnJlZFNpemUoaW50LCBpbnQpCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KSB7Ci0JCWlmIChwcmVmU2l6ZSA9PSBudWxsIHx8IHdIaW50ICE9IHByZWZTaXplRGltZW5zaW9uLndpZHRoCi0JCQkJfHwgaEhpbnQgIT0gcHJlZlNpemVEaW1lbnNpb24uaGVpZ2h0KSB7Ci0JCQlwcmVmU2l6ZSA9IGNhbGN1bGF0ZUxhYmVsU2l6ZShnZXRUZXh0U2l6ZSh3SGludCwgaEhpbnQpKTsKLQkJCUluc2V0cyBpbnNldHMgPSBnZXRJbnNldHMoKTsKLQkJCXByZWZTaXplLmV4cGFuZChpbnNldHMuZ2V0V2lkdGgoKSwgaW5zZXRzLmdldEhlaWdodCgpKTsKLQkJCWlmIChnZXRMYXlvdXRNYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCQlwcmVmU2l6ZS51bmlvbihnZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0UHJlZmVycmVkU2l6ZSh0aGlzLCB3SGludCwKLQkJCQkJCWhIaW50KSk7Ci0JCX0KLQkJaWYgKHdIaW50ID49IDAgJiYgd0hpbnQgPCBwcmVmU2l6ZS53aWR0aCkgewotCQkJRGltZW5zaW9uIG1pblNpemUgPSBnZXRNaW5pbXVtU2l6ZSh3SGludCwgaEhpbnQpOwotCQkJRGltZW5zaW9uIHJlc3VsdCA9IHByZWZTaXplLmdldENvcHkoKTsKLQkJCXJlc3VsdC53aWR0aCA9IE1hdGgubWluKHJlc3VsdC53aWR0aCwgd0hpbnQpOwotCQkJcmVzdWx0LndpZHRoID0gTWF0aC5tYXgobWluU2l6ZS53aWR0aCwgcmVzdWx0LndpZHRoKTsKLQkJCXByZWZTaXplRGltZW5zaW9uLndpZHRoID0gcmVzdWx0LndpZHRoOwotCQkJcHJlZlNpemVEaW1lbnNpb24uaGVpZ2h0ID0gcmVzdWx0LndpZHRoOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gcHJlZlNpemU7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyB0aGUgYW1vdW50IG9mIHRoZSBMYWJlbCdzIGN1cnJlbnQgdGV4dCB3aWxsIGZpdCBpbiB0aGUgTGFiZWwsCi0JICogaW5jbHVkaW5nIGFuIGVsaXBzaXMgIi4uLiIgaWYgdHJ1bmNhdGlvbiBpcyByZXF1aXJlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdWJzdHJpbmcKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdWJTdHJpbmdUZXh0KCkgewotCQlpZiAoc3ViU3RyaW5nVGV4dCAhPSBudWxsKQotCQkJcmV0dXJuIHN1YlN0cmluZ1RleHQ7Ci0KLQkJc3ViU3RyaW5nVGV4dCA9IHRleHQ7Ci0JCURpbWVuc2lvbiBzaHJpbmsgPSBnZXRQcmVmZXJyZWRTaXplKGdldFNpemUoKS53aWR0aCwgZ2V0U2l6ZSgpLmhlaWdodCkKLQkJCQkuZ2V0RGlmZmVyZW5jZShnZXRTaXplKCkpOwotCQlEaW1lbnNpb24gZWZmZWN0aXZlU2l6ZSA9IGdldFRleHRTaXplKCkuZ2V0RXhwYW5kZWQoLXNocmluay53aWR0aCwKLQkJCQktc2hyaW5rLmhlaWdodCk7Ci0JCUZvbnQgY3VycmVudEZvbnQgPSBnZXRGb250KCk7Ci0JCWludCBmb250SGVpZ2h0ID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKGN1cnJlbnRGb250KQotCQkJCS5nZXRIZWlnaHQoKTsKLQkJaW50IG1heExpbmVzID0gKGludCkgKGVmZmVjdGl2ZVNpemUuaGVpZ2h0IC8gKGRvdWJsZSkgZm9udEhlaWdodCk7Ci0KLQkJU3RyaW5nQnVmZmVyIGFjY3VtbGF0ZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdCdWZmZXIgcmVtYWluaW5nVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0VGV4dCgpKTsKLQkJaW50IGkgPSAwLCBqID0gMDsKLQotCQl3aGlsZSAocmVtYWluaW5nVGV4dC5sZW5ndGgoKSA+IDAgJiYgaisrIDwgbWF4TGluZXMpIHsKLQkJCWkgPSBnZXRMaW5lV3JhcFBvc2l0aW9uKHJlbWFpbmluZ1RleHQudG9TdHJpbmcoKSwgY3VycmVudEZvbnQsCi0JCQkJCWVmZmVjdGl2ZVNpemUud2lkdGgpOwotCi0JCQlpZiAoYWNjdW1sYXRlZFRleHQubGVuZ3RoKCkgPiAwKQotCQkJCWFjY3VtbGF0ZWRUZXh0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoaSA9PSAwIHx8IChyZW1haW5pbmdUZXh0Lmxlbmd0aCgpID4gaSAmJiBqID09IG1heExpbmVzKSkgewotCQkJCWludCBkb3RzV2lkdGggPSBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHMoRUxMSVBTSVMsCi0JCQkJCQljdXJyZW50Rm9udCkud2lkdGg7Ci0JCQkJaSA9IGdldExhcmdlc3RTdWJzdHJpbmdDb25maW5lZFRvKHJlbWFpbmluZ1RleHQudG9TdHJpbmcoKSwKLQkJCQkJCWN1cnJlbnRGb250LCBNYXRoLm1heChlZmZlY3RpdmVTaXplLndpZHRoIC0gZG90c1dpZHRoLAotCQkJCQkJCQkwKSk7Ci0JCQkJYWNjdW1sYXRlZFRleHQuYXBwZW5kKHJlbWFpbmluZ1RleHQuc3Vic3RyaW5nKDAsIGkpKTsKLQkJCQlhY2N1bWxhdGVkVGV4dC5hcHBlbmQoRUxMSVBTSVMpOwotCQkJfSBlbHNlCi0JCQkJYWNjdW1sYXRlZFRleHQuYXBwZW5kKHJlbWFpbmluZ1RleHQuc3Vic3RyaW5nKDAsIGkpKTsKLQkJCXJlbWFpbmluZ1RleHQuZGVsZXRlKDAsIGkpOwotCQl9Ci0JCXJldHVybiBzdWJTdHJpbmdUZXh0ID0gYWNjdW1sYXRlZFRleHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBMYWJlbCdzIGN1cnJlbnQgdGV4dC4gSWYgdGhlIHRleHQgaXMgY3VycmVudGx5Ci0JICogdHJ1bmNhdGVkLCB0aGUgdHJ1bmNhdGVkIHRleHQgd2l0aCBpdHMgZWxsaXBzaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlCi0JICogc2l6ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgbGFiZWwncyB0ZXh0LCB0YWtpbmcgaW50byBhY2NvdW50IHRydW5jYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIERpbWVuc2lvbiBnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpIHsKLQkJaWYgKHN1YlN0cmluZ1RleHRTaXplID09IG51bGwpCi0JCQlzdWJTdHJpbmdUZXh0U2l6ZSA9IGNhbGN1bGF0ZVN1YlN0cmluZ1RleHRTaXplKCk7Ci0JCXJldHVybiBzdWJTdHJpbmdUZXh0U2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBsYWJlbC4gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhlCi0JICogbGFiZWwsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBjdXJyZW50bHkgYmVpbmcgdHJ1bmNhdGVkLiBDYWxsCi0JICoge0BsaW5rICNnZXRTdWJTdHJpbmdUZXh0KCl9IHRvIHJldHVybiB0aGUgbGFiZWwncyBjdXJyZW50IHRleHQgY29udGVudHMKLQkgKiB3aXRoIHRydW5jYXRpb24gY29uc2lkZXJlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgbGFiZWwKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFsaWdubWVudCBvZiB0aGUgTGFiZWwncyB0ZXh0LiBUaGUgZGVmYXVsdCB0ZXh0Ci0JICogYWxpZ25tZW50IGlzIHtAbGluayBQb3NpdGlvbkNvbnN0YW50cyNDRU5URVJ9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgYWxpZ25tZW50Ci0JICovCi0JcHVibGljIGludCBnZXRUZXh0QWxpZ25tZW50KCkgewotCQlyZXR1cm4gdGV4dEFsaWdubWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBib3VuZHMgb2YgdGhlIGxhYmVsJ3MgdGV4dC4gTm90ZSB0aGF0IHRoZSBib3VuZHMgYXJlCi0JICogY2FsY3VsYXRlZCB1c2luZyB0aGUgbGFiZWwncyBjb21wbGV0ZSB0ZXh0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUKLQkgKiBsYWJlbCdzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBib3VuZHMgb2YgdGhpcyBsYWJlbCdzIGNvbXBsZXRlIHRleHQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFJlY3RhbmdsZSBnZXRUZXh0Qm91bmRzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzID0gZ2V0Qm91bmRzKCk7Ci0JCXJldHVybiBuZXcgUmVjdGFuZ2xlKGJvdW5kcy5nZXRMb2NhdGlvbigpLnRyYW5zbGF0ZShnZXRUZXh0TG9jYXRpb24oKSksCi0JCQkJdGV4dFNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBsYWJlbCdzIHRleHQgcmVsYXRpdmUgdG8gdGhlIGxhYmVsLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgbG9jYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldFRleHRMb2NhdGlvbigpIHsKLQkJaWYgKHRleHRMb2NhdGlvbiAhPSBudWxsKQotCQkJcmV0dXJuIHRleHRMb2NhdGlvbjsKLQkJY2FsY3VsYXRlTG9jYXRpb25zKCk7Ci0JCXJldHVybiB0ZXh0TG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBwbGFjZW1lbnQgb2YgdGhlIGxhYmVsJ3MgdGV4dCByZWxhdGl2ZSB0byBpdHMgaWNvbi4KLQkgKiBUaGUgZGVmYXVsdCB0ZXh0IHBsYWNlbWVudCBpcyB7QGxpbmsgUG9zaXRpb25Db25zdGFudHMjRUFTVH0uCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBwbGFjZW1lbnQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0UGxhY2VtZW50KCkgewotCQlyZXR1cm4gdGV4dFBsYWNlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBsYWJlbCdzIGNvbXBsZXRlIHRleHQuIE5vdGUgdGhhdCB0aGUgdGV4dCB1c2VkIHRvCi0JICogbWFrZSB0aGlzIGNhbGN1bGF0aW9uIGlzIHRoZSBsYWJlbCdzIGZ1bGwgdGV4dCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZQotCSAqIGxhYmVsJ3MgdGV4dCBpcyBjdXJyZW50bHkgYmVpbmcgdHJ1bmNhdGVkIGFuZCBpcyBkaXNwbGF5aW5nIGFuIGVsbGlwc2lzLgotCSAqIElmIHRoZSBzaXplIGNvbnNpZGVyaW5nIGN1cnJlbnQgdHJ1bmNhdGlvbiBpcyBkZXNpcmVkLCBjYWxsCi0JICoge0BsaW5rICNnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpfS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgbGFiZWwncyBjb21wbGV0ZSB0ZXh0Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBEaW1lbnNpb24gZ2V0VGV4dFNpemUoKSB7Ci0JCWlmICh0ZXh0U2l6ZSA9PSBudWxsKQotCQkJdGV4dFNpemUgPSBjYWxjdWxhdGVUZXh0U2l6ZSgpOwotCQlyZXR1cm4gdGV4dFNpemU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbGFiZWwncyBjb21wbGV0ZSB0ZXh0LiBOb3RlIHRoYXQgdGhlIHRleHQgdXNlZCB0bwotCSAqIG1ha2UgdGhpcyBjYWxjdWxhdGlvbiBpcyB0aGUgbGFiZWwncyBmdWxsIHRleHQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUKLQkgKiBsYWJlbCdzIHRleHQgaXMgY3VycmVudGx5IGJlaW5nIHRydW5jYXRlZCBhbmQgaXMgZGlzcGxheWluZyBhbiBlbGxpcHNpcy4KLQkgKiBJZiB0aGUgc2l6ZSBjb25zaWRlcmluZyBjdXJyZW50IHRydW5jYXRpb24gaXMgZGVzaXJlZCwgY2FsbAotCSAqIHtAbGluayAjZ2V0U3ViU3RyaW5nVGV4dFNpemUoKX0uCi0JICogCi0JICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIGxhYmVsJ3MgY29tcGxldGUgdGV4dAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGdldFRleHRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAodGV4dFNpemUgPT0gbnVsbCkgewotCQkJdGV4dFNpemUgPSBjYWxjdWxhdGVUZXh0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLQkJCXRleHREaW1lbnNpb24ud2lkdGggPSB3aWR0aDsKLQkJCXRleHREaW1lbnNpb24uaGVpZ2h0ID0gaGVpZ2h0OwotCQl9Ci0JCXJldHVybiB0ZXh0U2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElGaWd1cmUjaW52YWxpZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpIHsKLQkJcHJlZlNpemUgPSBudWxsOwotCQltaW5TaXplID0gbnVsbDsKLQkJY2xlYXJMb2NhdGlvbnMoKTsKLQkJdGV4dFNpemUgPSBudWxsOwotCQlzdWJTdHJpbmdUZXh0U2l6ZSA9IG51bGw7Ci0JCXN1YlN0cmluZ1RleHQgPSBudWxsOwotCQlzdXBlci5pbnZhbGlkYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGFiZWwncyB0ZXh0IGlzIGN1cnJlbnRseSB0cnVuY2F0ZWQKLQkgKiBhbmQgaXMgZGlzcGxheWluZyBhbiBlbGxpcHNpcywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYWJlbCdzIHRleHQgaXMgdHJ1bmNhdGVkCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGV4dFRydW5jYXRlZCgpIHsKLQkJcmV0dXJuICFnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpLmVxdWFscyhnZXRUZXh0U2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEZpZ3VyZSNwYWludEZpZ3VyZShHcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQlpZiAoaXNTZWxlY3RlZCgpKSB7Ci0JCQlncmFwaGljcy5wdXNoU3RhdGUoKTsKLQkJCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWdyYXBoaWNzLmZpbGxSZWN0YW5nbGUoZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkpOwotCQkJZ3JhcGhpY3MucG9wU3RhdGUoKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCX0KLQkJaWYgKGhhc0ZvY3VzKCkpIHsKLQkJCWdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotCQkJZ3JhcGhpY3Muc2V0WE9STW9kZSh0cnVlKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkucmVzaXplKC0xLCAtMSkpOwotCQkJZ3JhcGhpY3MucG9wU3RhdGUoKTsKLQkJfQotCQlpZiAoaXNPcGFxdWUoKSkKLQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcygpOwotCQlncmFwaGljcy50cmFuc2xhdGUoYm91bmRzLngsIGJvdW5kcy55KTsKLQkJaWYgKGljb24gIT0gbnVsbCkKLQkJCWdyYXBoaWNzLmRyYXdJbWFnZShpY29uLCBnZXRJY29uTG9jYXRpb24oKSk7Ci0KLQkJaWYgKCFpc0VuYWJsZWQoKSkgewotCQkJZ3JhcGhpY3MudHJhbnNsYXRlKDEsIDEpOwotCQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJ1dHRvbkxpZ2h0ZXN0KTsKLQkJCWdyYXBoaWNzZHJhd1RleHQoZ3JhcGhpY3MpOwotCQkJZ3JhcGhpY3MuZHJhd1RleHQoZ2V0U3ViU3RyaW5nVGV4dCgpLCBnZXRUZXh0TG9jYXRpb24oKSk7Ci0JCQlncmFwaGljcy50cmFuc2xhdGUoLTEsIC0xKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5idXR0b25EYXJrZXIpOwotCQl9Ci0JCWdyYXBoaWNzZHJhd1RleHQoZ3JhcGhpY3MpOwotCQlncmFwaGljcy50cmFuc2xhdGUoLWJvdW5kcy54LCAtYm91bmRzLnkpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsJ3MgaWNvbiB0byB0aGUgcGFzc2VkIGltYWdlLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgdGhlIG5ldyBsYWJlbCBpbWFnZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJY29uKEltYWdlIGltYWdlKSB7Ci0JCWlmIChpY29uID09IGltYWdlKQotCQkJcmV0dXJuOwotCQlpY29uID0gaW1hZ2U7Ci0JCS8vIENhbGwgcmVwYWludCwgaW4gY2FzZSB0aGUgaW1hZ2UgZGltZW5zaW9ucyBhcmUgdGhlIHNhbWUuCi0JCXJlcGFpbnQoKTsKLQkJaWYgKGljb24gPT0gbnVsbCkKLQkJCXNldEljb25EaW1lbnNpb24obmV3IERpbWVuc2lvbigpKTsKLQkJZWxzZQotCQkJc2V0SWNvbkRpbWVuc2lvbihuZXcgRGltZW5zaW9uKGltYWdlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSBpY29uIHdpdGhpbiB0aGUgaWNvbiBkaW1lbnNpb24uIFRoZQotCSAqIGRpbWVuc2lvbiBzaG91bGQgYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgSW1hZ2UgaXRzZWxmLCBzbyBjYWxsaW5nIHRoaXMKLQkgKiBtZXRob2Qgc2hvdWxkIGhhdmUgbm8gYWZmZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhbGlnbgotCSAqICAgICAgICAgICAgdGhlIGljb24gYWxpZ25tZW50Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb25BbGlnbm1lbnQoaW50IGFsaWduKSB7Ci0JCWlmIChpY29uQWxpZ25tZW50ID09IGFsaWduKQotCQkJcmV0dXJuOwotCQlpY29uQWxpZ25tZW50ID0gYWxpZ247Ci0JCWNsZWFyTG9jYXRpb25zKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbCdzIGljb24gc2l6ZSB0byB0aGUgcGFzc2VkIERpbWVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZAotCSAqICAgICAgICAgICAgdGhlIG5ldyBpY29uIHNpemUKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWNvbkRpbWVuc2lvbihEaW1lbnNpb24gZCkgewotCQlpZiAoZC5lcXVhbHMoaWNvblNpemUpKQotCQkJcmV0dXJuOwotCQlpY29uU2l6ZSA9IGQ7Ci0JCXJldmFsaWRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBnYXAgaW4gcGl4ZWxzIGJldHdlZW4gdGhlIGxhYmVsJ3MgaWNvbiBhbmQgdGV4dCB0byB0aGUgcGFzc2VkCi0JICogdmFsdWUuIFRoZSBkZWZhdWx0IGlzIDQuCi0JICogCi0JICogQHBhcmFtIGdhcAotCSAqICAgICAgICAgICAgdGhlIGdhcAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJY29uVGV4dEdhcChpbnQgZ2FwKSB7Ci0JCWlmIChpY29uVGV4dEdhcCA9PSBnYXApCi0JCQlyZXR1cm47Ci0JCWljb25UZXh0R2FwID0gZ2FwOwotCQlyZXBhaW50KCk7Ci0JCXJldmFsaWRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlIGVudGlyZSBsYWJlbCAoaWNvbiBhbmQgdGV4dCkuIElmIHRoaXMgZmlndXJlJ3MKLQkgKiBib3VuZHMgYXJlIGxhcmdlciB0aGFuIHRoZSBzaXplIG5lZWRlZCB0byBkaXNwbGF5IHRoZSBsYWJlbCwgdGhlIGxhYmVsCi0JICogd2lsbCBiZSBhbGlnbmVkIGFjY29yZGluZ2x5LiBWYWxpZCB2YWx1ZXMgYXJlOgotCSAqIDxVTD4KLQkgKiA8TEk+PEVNPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNDRU5URVJ9PC9FTT4KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI1RPUH0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0JPVFRPTX0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0xFRlR9Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNSSUdIVH0KLQkgKiA8L1VMPgotCSAqIAotCSAqIEBwYXJhbSBhbGlnbgotCSAqICAgICAgICAgICAgbGFiZWwgYWxpZ25tZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxBbGlnbm1lbnQoaW50IGFsaWduKSB7Ci0JCWlmIChsYWJlbEFsaWdubWVudCA9PSBhbGlnbikKLQkJCXJldHVybjsKLQkJbGFiZWxBbGlnbm1lbnQgPSBhbGlnbjsKLQkJY2xlYXJMb2NhdGlvbnMoKTsKLQkJcmVwYWludCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsJ3MgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgdGhlIG5ldyBsYWJlbCB0ZXh0Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHMpIHsKLQkJLy8gInRleHQiIHdpbGwgbmV2ZXIgYmUgbnVsbC4KLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGV4dC5lcXVhbHMocykpCi0JCQlyZXR1cm47Ci0JCXRleHQgPSBzOwotCQlyZXZhbGlkYXRlKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlIFRleHQgcmVsYXRpdmUgdG8gdGhlIGljb24uIFRoZSB0ZXh0IGFsaWdubWVudAotCSAqIG11c3QgYmUgb3J0aG9nb25hbCB0byB0aGUgdGV4dCBwbGFjZW1lbnQuIEZvciBleGFtcGxlLCBpZiB0aGUgcGxhY2VtZW50Ci0JICogaXMgRUFTVCwgdGhlbiB0aGUgdGV4dCBjYW4gYmUgYWxpZ25lZCB1c2luZyBUT1AsIENFTlRFUiwgb3IgQk9UVE9NLiBWYWxpZAotCSAqIHZhbHVlcyBhcmU6Ci0JICogPFVMPgotCSAqIDxMST48RU0+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0NFTlRFUn08L0VNPgotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjVE9QfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjQk9UVE9NfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjTEVGVH0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI1JJR0hUfQotCSAqIDwvVUw+Ci0JICogCi0JICogQHNlZSAjc2V0TGFiZWxBbGlnbm1lbnQoaW50KQotCSAqIEBwYXJhbSBhbGlnbgotCSAqICAgICAgICAgICAgdGhlIHRleHQgYWxpZ25tZW50Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRBbGlnbm1lbnQoaW50IGFsaWduKSB7Ci0JCWlmICh0ZXh0QWxpZ25tZW50ID09IGFsaWduKQotCQkJcmV0dXJuOwotCQl0ZXh0QWxpZ25tZW50ID0gYWxpZ247Ci0JCWNsZWFyTG9jYXRpb25zKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwbGFjZW1lbnQgb2YgdGV4dCByZWxhdGl2ZSB0byB0aGUgbGFiZWwncyBpY29uLiBWYWxpZCB2YWx1ZXMKLQkgKiBhcmU6Ci0JICogPFVMPgotCSAqIDxMST48RU0+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0VBU1R9PC9FTT4KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI05PUlRIfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjU09VVEh9Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNXRVNUfQotCSAqIDwvVUw+Ci0JICogCi0JICogQHBhcmFtIHdoZXJlCi0JICogICAgICAgICAgICB0aGUgdGV4dCBwbGFjZW1lbnQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFBsYWNlbWVudChpbnQgd2hlcmUpIHsKLQkJaWYgKHRleHRQbGFjZW1lbnQgPT0gd2hlcmUpCi0JCQlyZXR1cm47Ci0JCXRleHRQbGFjZW1lbnQgPSB3aGVyZTsKLQkJcmV2YWxpZGF0ZSgpOwotCQlyZXBhaW50KCk7Ci0JfQotCi0JcHJpdmF0ZSBSZWN0YW5nbGUgZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkgewotCQlSZWN0YW5nbGUgYm91bmRzID0gZ2V0VGV4dEJvdW5kcygpOwotCQlib3VuZHMuZXhwYW5kKG5ldyBJbnNldHMoMiwgMiwgMCwgMCkpOwotCQl0cmFuc2xhdGVUb1BhcmVudChib3VuZHMpOwotCQlib3VuZHMuaW50ZXJzZWN0KGdldEJvdW5kcygpKTsKLQkJcmV0dXJuIGJvdW5kczsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBMYWJlbCdzIHRleHQuIE5vdGUgdGhhdCB0aGlzCi0JICogRGltZW5zaW9uIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIExhYmVsJ3MgZnVsbCB0ZXh0LCByZWdhcmRsZXNzIG9mCi0JICogd2hldGhlciBvciBub3QgaXRzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZC4gSWYgdGV4dCBzaXplIGNvbnNpZGVyaW5nCi0JICogY3VycmVudCB0cnVuY2F0aW9uIGlzIGRlc2lyZWQsIHVzZSB7QGxpbmsgI2NhbGN1bGF0ZVN1YlN0cmluZ1RleHRTaXplKCl9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxhYmVsJ3MgdGV4dCwgaWdub3JpbmcgdHJ1bmNhdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVRleHRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlyZXR1cm4gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFdyYXBwZWRUZXh0KHdpZHRoLCBoZWlnaHQpLAotCQkJCWdldEZvbnQoKSk7Ci0JfQotCi0JLy8gQ29kZSBmb3IgdGhlIFRleHQgV3JhcC4KLQkvLyBTdGFydHMgaGVyZS4KLQotCXByaXZhdGUgU3RyaW5nIGdldFdyYXBwZWRUZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAoIWlzVGV4dFdyYXBwZWQoKSB8fCB3aWR0aCA9PSAtMSkKLQkJCXJldHVybiBnZXRUZXh0KCk7Ci0KLQkJaWYgKGlzSWNvbkV4aXN0KCkpIHsKLQkJCXN3aXRjaCAodGV4dFBsYWNlbWVudCkgewotCQkJY2FzZSBFQVNUOgotCQkJY2FzZSBXRVNUOgotCQkJCXdpZHRoIC09IGljb25TaXplLndpZHRoICsgZ2V0SWNvblRleHRHYXAoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTk9SVEg6Ci0JCQljYXNlIFNPVVRIOgotCQkJCWlmIChoZWlnaHQgIT0gLTEpCi0JCQkJCWhlaWdodCAtPSBpY29uU2l6ZS5oZWlnaHQgKyBnZXRJY29uVGV4dEdhcCgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJRm9udCBmID0gZ2V0Rm9udCgpOwotCQlpbnQgbWF4TGluZXMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJaWYgKGhlaWdodCAhPSAtMSkgewotCQkJaW50IGZvbnRIZWlnaHQgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3MoZikuZ2V0SGVpZ2h0KCk7Ci0JCQltYXhMaW5lcyA9IChpbnQpIChoZWlnaHQgLyAoZG91YmxlKSBmb250SGVpZ2h0KTsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBhY2N1bWxhdGVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nQnVmZmVyIHJlbWFpbmluZ1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKGdldFRleHQoKSk7Ci0JCWludCBpID0gMCwgaiA9IDA7Ci0KLQkJd2hpbGUgKHJlbWFpbmluZ1RleHQubGVuZ3RoKCkgPiAwICYmIGorKyA8IG1heExpbmVzKSB7Ci0JCQlpZiAoKGkgPSBnZXRMaW5lV3JhcFBvc2l0aW9uKHJlbWFpbmluZ1RleHQudG9TdHJpbmcoKSwgZiwgaGVpZ2h0KSkgPT0gMCkKLQkJCQlicmVhazsKLQotCQkJaWYgKGFjY3VtbGF0ZWRUZXh0Lmxlbmd0aCgpID4gMCkKLQkJCQlhY2N1bWxhdGVkVGV4dC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFjY3VtbGF0ZWRUZXh0LmFwcGVuZChyZW1haW5pbmdUZXh0LnN1YnN0cmluZygwLCBpKSk7Ci0JCQlyZW1haW5pbmdUZXh0LmRlbGV0ZSgwLCBpKTsKLQkJfQotCQlyZXR1cm4gYWNjdW1sYXRlZFRleHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJY29uRXhpc3QoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgaW50IGdldExpbmVXcmFwUG9zaXRpb24oU3RyaW5nIHN0cmluZywgRm9udCBmLCBpbnQgd2lkdGgpIHsKLQkJQnJlYWtJdGVyYXRvciBpdGVyID0gQnJlYWtJdGVyYXRvci5nZXRMaW5lSW5zdGFuY2UoKTsKLQkJaXRlci5zZXRUZXh0KHN0cmluZyk7Ci0JCWludCBzdGFydCA9IGl0ZXIuZmlyc3QoKTsKLQkJaW50IGVuZCA9IGl0ZXIubmV4dCgpOwotCi0JCS8vIGlmIHRoZSBmaXJzdCBsaW5lIHNlZ21lbnQgZG9lcyBub3QgZml0IGluIHRoZSB3aWR0aCwKLQkJLy8gZGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiB3aXRoaW4gaXQgd2hlcmUgd2UgbmVlZCB0byBjdXQKLQkJaWYgKEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyhzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLCBmKS53aWR0aCA+IHdpZHRoKSB7Ci0JCQlpdGVyID0gQnJlYWtJdGVyYXRvci5nZXRDaGFyYWN0ZXJJbnN0YW5jZSgpOwotCQkJaXRlci5zZXRUZXh0KHN0cmluZyk7Ci0JCQlzdGFydCA9IGl0ZXIuZmlyc3QoKTsKLQkJfQotCi0JCS8vIGtlZXAgaXRlcmF0aW5nIGFzIGxvbmcgYXMgd2lkdGggcGVybWl0cwotCQlkbwotCQkJZW5kID0gaXRlci5uZXh0KCk7Ci0JCXdoaWxlIChlbmQgIT0gQnJlYWtJdGVyYXRvci5ET05FCi0JCQkJJiYgRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIGVuZCksCi0JCQkJCQlmKS53aWR0aCA8PSB3aWR0aCk7Ci0JCXJldHVybiAoZW5kID09IEJyZWFrSXRlcmF0b3IuRE9ORSkgPyBpdGVyLmxhc3QoKSA6IGl0ZXIucHJldmlvdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXJnZXN0IHN1YnN0cmluZyBvZiA8aT5zPC9pPiBpbiBGb250IDxpPmY8L2k+IHRoYXQgY2FuIGJlCi0JICogY29uZmluZWQgdG8gdGhlIG51bWJlciBvZiBwaXhlbHMgaW4gPGk+YXZhaWxhYmxlV2lkdGg8aT4uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBzdHJpbmcKLQkgKiBAcGFyYW0gZgotCSAqICAgICAgICAgICAgdGhlIGZvbnQKLQkgKiBAcGFyYW0gYXZhaWxhYmxlV2lkdGgKLQkgKiAgICAgICAgICAgIHRoZSBhdmFpbGFibGUgd2lkdGgKLQkgKiBAcmV0dXJuIHRoZSBsYXJnZXN0IHN1YnN0cmluZyB0aGF0IGZpdHMgaW4gdGhlIGdpdmVuIHdpZHRoCi0JICogQHNpbmNlIDIuMCBDb3BpZWQgZnJvbSA8Y2xhc3M+RmlndXJlVXRpbGl0aWVzPGNsYXNzPiBDbGFzcywgdG8gYXZvaWQKLQkgKiAgICAgICAgY2FsbCBvZiBzdGF0aWMuCi0JICovCi0Jc3RhdGljIGludCBnZXRMYXJnZXN0U3Vic3RyaW5nQ29uZmluZWRUbyhTdHJpbmcgcywgRm9udCBmLAotCQkJaW50IGF2YWlsYWJsZVdpZHRoKSB7Ci0JCUZvbnRNZXRyaWNzIG1ldHJpY3MgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3MoZik7Ci0JCWludCBtaW4sIG1heDsKLQkJZmxvYXQgYXZnID0gbWV0cmljcy5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCW1pbiA9IDA7Ci0JCW1heCA9IHMubGVuZ3RoKCkgKyAxOwotCi0JCS8vIFRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGd1ZXNzCi0JCWludCBndWVzcyA9IDAsIGd1ZXNzU2l6ZSA9IDA7Ci0JCXdoaWxlICgobWF4IC0gbWluKSA+IDEpIHsKLQkJCS8vIFBpY2sgYSBuZXcgZ3Vlc3Mgc2l6ZQotCQkJLy8gTmV3IGd1ZXNzIGlzIHRoZSBsYXN0IGd1ZXNzIHBsdXMgdGhlIG1pc3Npbmcgd2lkdGggaW4gcGl4ZWxzCi0JCQkvLyBkaXZpZGVkIGJ5IHRoZSBhdmVyYWdlIGNoYXJhY3RlciBzaXplIGluIHBpeGVscwotCQkJZ3Vlc3MgPSBndWVzcyArIChpbnQpICgoYXZhaWxhYmxlV2lkdGggLSBndWVzc1NpemUpIC8gYXZnKTsKLQotCQkJaWYgKGd1ZXNzID49IG1heCkKLQkJCQlndWVzcyA9IG1heCAtIDE7Ci0JCQlpZiAoZ3Vlc3MgPD0gbWluKQotCQkJCWd1ZXNzID0gbWluICsgMTsKLQotCQkJLy8gTWVhc3VyZSB0aGUgY3VycmVudCBndWVzcwotCQkJZ3Vlc3NTaXplID0gRmlndXJlVXRpbGl0aWVzCi0JCQkJCS5nZXRUZXh0RXh0ZW50cyhzLnN1YnN0cmluZygwLCBndWVzcyksIGYpLndpZHRoOwotCi0JCQlpZiAoZ3Vlc3NTaXplIDwgYXZhaWxhYmxlV2lkdGgpCi0JCQkJLy8gV2UgZGlkIG5vdCB1c2UgdGhlIGF2YWlsYWJsZSB3aWR0aAotCQkJCW1pbiA9IGd1ZXNzOwotCQkJZWxzZQotCQkJCS8vIFdlIGV4Y2VlZGVkIHRoZSBhdmFpbGFibGUgd2lkdGgKLQkJCQltYXggPSBndWVzczsKLQkJfQotCQlyZXR1cm4gbWluOwotCX0KLQotCS8qKgotCSAqIFNldHMgdG8gd3JhcCB0ZXh0IGluIExhYmVsLgotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogICAgICAgICAgICB0cnVlL2ZhbHNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFdyYXAoYm9vbGVhbiBiKSB7Ci0JCWlmIChpc1RleHRXcmFwcGVkKCkgPT0gYikKLQkJCXJldHVybjsKLQkJc2V0RmxhZyhGTEFHX1dSQVAsIGIpOwotCQlyZXZhbGlkYXRlKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRleHQgd3JhcC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RleHRXcmFwcGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGV4dCB3cmFwIHdpZHRoLgotCSAqIAotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICBUaGUgbGFiZWwgdGV4dCB3cmFwIHdpZHRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFdyYXBXaWR0aChpbnQgaSkgewotCQlpZiAodGhpcy53cmFwV2lkdGggPT0gaSkKLQkJCXJldHVybjsKLQkJdGhpcy53cmFwV2lkdGggPSBpOwotCQlyZXZhbGlkYXRlKCk7Ci0JCXJlcGFpbnQoKTsKLQotCX0KLQotCS8qKgotCSAqIFRleHQgV3JhcCBBbGlnbm1lbnQsIHVzZSBvbmx5IGFmdGVyIHVzaW5nIDxtZXRob2Q+c2V0VGV4dFdyYXAoYm9vbGVhbik8L21ldGhvZD4KLQkgKiAKLQkgKiBAcGFyYW0gaQotCSAqICAgICAgICAgICAgVGhlIGxhYmVsIHRleHQgd3JhcHBpbmcgd2lkdGgKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0V3JhcEFsaWdubWVudChpbnQgaSkgewotCQlpZiAoZ2V0VGV4dFdyYXBBbGlnbm1lbnQoKSA9PSBpKQotCQkJcmV0dXJuOwotCi0JCXNldEFsaWdubWVudEZsYWdzKGksIEZMQUdfV1JBUF9BTElHTik7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRBbGlnbm1lbnRGbGFncwotCSAqIAotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGFsaWduCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgZmxhZ09mZnNldAotCSAqIAotCSAqIC0tLSBUT0RPIC0gY29waWVkIG5lZWRzIHRvIG1vZGlmeQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBbGlnbm1lbnRGbGFncyhpbnQgYWxpZ24sIGludCBmbGFnT2Zmc2V0KSB7Ci0JCWZsYWdzICY9IH4oMHg3ICogZmxhZ09mZnNldCk7Ci0JCXN3aXRjaCAoYWxpZ24pIHsKLQkJY2FzZSBDRU5URVI6Ci0JCQlmbGFncyB8PSAweDEgKiBmbGFnT2Zmc2V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgVE9QOgotCQkJZmxhZ3MgfD0gMHgyICogZmxhZ09mZnNldDsKLQkJCWJyZWFrOwotCQljYXNlIExFRlQ6Ci0JCQlmbGFncyB8PSAweDMgKiBmbGFnT2Zmc2V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgUklHSFQ6Ci0JCQlmbGFncyB8PSAweDQgKiBmbGFnT2Zmc2V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgQk9UVE9NOgotCQkJZmxhZ3MgfD0gMHg1ICogZmxhZ09mZnNldDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHdyYXBWYWx1ZQotCSAqIEByZXR1cm4gUG9zaXRpb25Db25zdGFudCByZXByZXNlbnRpbmcgdGhlIGFsaWdubWVudAotCSAqLwotCXByaXZhdGUgaW50IGdldEFsaWdubWVudChpbnQgZmxhZ09mZnNldCkgewotCQlpbnQgd3JhcFZhbHVlID0gZmxhZ3MgJiAoMHg3ICogZmxhZ09mZnNldCk7Ci0JCWlmICh3cmFwVmFsdWUgPT0gMHgxICogZmxhZ09mZnNldCkKLQkJCXJldHVybiBDRU5URVI7Ci0JCWVsc2UgaWYgKHdyYXBWYWx1ZSA9PSAweDIgKiBmbGFnT2Zmc2V0KQotCQkJcmV0dXJuIFRPUDsKLQkJZWxzZSBpZiAod3JhcFZhbHVlID09IDB4MyAqIGZsYWdPZmZzZXQpCi0JCQlyZXR1cm4gTEVGVDsKLQkJZWxzZSBpZiAod3JhcFZhbHVlID09IDB4NCAqIGZsYWdPZmZzZXQpCi0JCQlyZXR1cm4gUklHSFQ7Ci0JCWVsc2UgaWYgKHdyYXBWYWx1ZSA9PSAweDUgKiBmbGFnT2Zmc2V0KQotCQkJcmV0dXJuIEJPVFRPTTsKLQotCQlyZXR1cm4gQ0VOVEVSOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxhYmVsIHRleHQgd3JhcHBpbmcgd2lkdGgKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRXcmFwQWxpZ25tZW50KCkgewotCQlyZXR1cm4gZ2V0QWxpZ25tZW50KEZMQUdfV1JBUF9BTElHTik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgZm9jdXMgc3RhdGUgb2YgdGhpcyBsYWJlbAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewotCQlyZXR1cm4gKGZsYWdzICYgRkxBR19IQVNGT0NVUykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgdGhpcyBsYWJlbAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBGTEFHX1NFTEVDVEVEKSAhPSAwOwotCX0KLQotCXByaXZhdGUgdm9pZCBncmFwaGljc2RyYXdUZXh0KEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCVN0cmluZyBzdWJTdHJpbmcgPSBnZXRTdWJTdHJpbmdUZXh0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN1YlN0cmluZywgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQlGb250IGYgPSBnZXRGb250KCk7Ci0JCWludCBmb250SGVpZ2h0ID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKGYpLmdldEhlaWdodCgpOwotCQlpbnQgdGV4dFdpZHRoID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHN1YlN0cmluZywgZikud2lkdGg7Ci0JCWludCB5ID0gZ2V0VGV4dExvY2F0aW9uKCkueTsKLQotCQkvLyBJZiB0aGUgZm9udCdzIGxlYWRpbmcgYXJlYSBpcyAwIHRoZW4gd2UgbmVlZCB0byBhZGQgYW4gb2Zmc2V0IHRvCi0JCS8vIGF2b2lkIHRydW5jYXRpbmcgYXQgdGhlIHRvcCAoZS5nLiBLb3JlYW4gZm9udHMpCi0JCWlmICgwID09IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyhmKS5nZXRMZWFkaW5nKCkpIHsKLQkJCWludCBvZmZzZXQgPSAyOyAvLyAyIGlzIHRoZSBsZWFkaW5nIGFyZWEgZm9yIGRlZmF1bHQgRW5nbGlzaAotCQkJeSArPSBvZmZzZXQ7Ci0JCX0KLQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJUZXh0IGFkZGVkIHRvIGRyYXciICsgdG9rZW4pOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgdG9rZW5XaWR0aCA9IEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyh0b2tlbiwgZikud2lkdGg7Ci0JCQlpbnQgeCA9IGdldFRleHRMb2NhdGlvbigpLng7Ci0JCQlzd2l0Y2ggKGdldFRleHRXcmFwQWxpZ25tZW50KCkpIHsKLQkJCWNhc2UgQ0VOVEVSOgotCQkJCXggKz0gKHRleHRXaWR0aCAtIHRva2VuV2lkdGgpIC8gMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgUklHSFQ6Ci0JCQkJeCArPSB0ZXh0V2lkdGggLSB0b2tlbldpZHRoOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZ3JhcGhpY3MuZHJhd1RleHQodG9rZW4sIHgsIHkpOwotCQkJeSArPSBmb250SGVpZ2h0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9jdXMgc3RhdGUgb2YgdGhpcyBsYWJlbAotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogICAgICAgICAgICB0cnVlIHdpbGwgY2F1c2UgYSBmb2N1cyByZWN0YW5nbGUgdG8gYmUgZHJhd24gYXJvdW5kIHRoZSB0ZXh0Ci0JICogICAgICAgICAgICBvZiB0aGUgTGFiZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cyhib29sZWFuIGIpIHsKLQkJaWYgKGhhc0ZvY3VzKCkgPT0gYikKLQkJCXJldHVybjsKLQkJc2V0RmxhZyhGTEFHX0hBU0ZPQ1VTLCBiKTsKLQkJcmVwYWludCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiB0aGlzIGxhYmVsCi0JICogCi0JICogQHBhcmFtIGIKLQkgKiAgICAgICAgICAgIHRydWUgd2lsbCBjYXVzZSB0aGUgbGFiZWwgdG8gYXBwZWFyIHNlbGVjdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBiKSB7Ci0JCWlmIChpc1NlbGVjdGVkKCkgPT0gYikKLQkJCXJldHVybjsKLQkJc2V0RmxhZyhGTEFHX1NFTEVDVEVELCBiKTsKLQkJcmVwYWludCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5MDhkZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGdyYXBoaWNhbCBmaWd1cmVzIGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0FuY2hvclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9BbmNob3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiMTFkYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0FuY2hvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgYW5jaG9ycy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFuY2hvclV0aWwgewotCi0JcHVibGljIHN0YXRpYyBQb2ludCBnZXRDbG9zZXN0UG9pbnQoUG9pbnRbXSBwb2ludHMsIFBvaW50IHBvaW50KSB7Ci0JCWludCBzaXplID0gcG9pbnRzLmxlbmd0aDsKLQkJZG91YmxlW10gZGlzdGFuY2VzID0gbmV3IGRvdWJsZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWRpc3RhbmNlc1tpXSA9IHBvaW50c1tpXS5nZXREaXN0YW5jZShwb2ludCk7Ci0JCX0KLQkJcmV0dXJuIHBvaW50c1ttaW4oZGlzdGFuY2VzKV07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgbWluKGRvdWJsZVtdIG51bWJlcnMpIHsKLQkJaWYgKG51bWJlcnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWRvdWJsZSBtaW4gPSBudW1iZXJzWzBdOwotCQlpbnQgaWQgPSAwOwotCQlmb3IgKGludCBpID0gMTsgaSA8IG51bWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWRvdWJsZSBuID0gbnVtYmVyc1tpXTsKLQkJCWlmIChuIDwgbWluKSB7Ci0JCQkJbWluID0gbjsKLQkJCQlpZCA9IGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBudW1iZXJzCi0JICogQHJldHVybgotCSAqIAkJaW5kZXggb2YgdGhlIHNtYWxsZXN0IG51bWJlciBpbiB0aGUgZ2l2ZW4gYXJyYXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBtaW4oaW50W10gbnVtYmVycykgewotCQlpZiAobnVtYmVycy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiAtMTsKLQkJaW50IG1pbiA9IG51bWJlcnNbMF07Ci0JCWludCBpZCA9IDA7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJaW50IG4gPSBudW1iZXJzW2ldOwotCQkJaWYgKG4gPCBtaW4pIHsKLQkJCQltaW4gPSBuOwotCQkJCWlkID0gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9Db25uZWN0aW9uQW5jaG9yTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjM0ZmY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9Db25uZWN0aW9uQW5jaG9yTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLQotLyoqCi0gKiBDb25zdHJhaW50IGZvciBwbGFjaW5nIGFuY2hvciBsb2NhdGlvbi4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IgewotCi0JLyoqCi0JICogR2V0cyByZWxhdGl2ZSBsb2NhdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gcmVmZXJlbmNlIHBvaW50Ci0JICogCi0JICogQHBhcmFtIHJlZmVyZW5jZQotCSAqIEByZXR1cm4gYWJzb2x1dGUgbG9jYXRpb24KLQkgKi8KLQlQb2ludCBnZXRMb2NhdGlvbihQb2ludCByZWZlcmVuY2UpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvRGlhZ3JhbUVkaXRvclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9EaWFncmFtRWRpdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNGUyNTgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9EaWFncmFtRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5WYXJ5QWN0aXZpdHlDb21tYW5kOwotCi0vKioKLSAqIFByb3ZpZGVzIGluc3RydWN0dXJlIHRvIGxpc3RlbnMgdG8gYWN0aW9ucyBsaWtlIExvY2FsQ29udHJpYnV0aW9uLCBMb2NhbCBSZXBsYWNlIAotICogaW4gV29ya0JyZWFrZG93biBTdHJ1Y3R1cmUuIExvYWRzIGF0IHRpbWUgb2YgcGx1Z2luIGxvYWQuICAKLSAqIEBzZWUgVmFyeUFjdGl2aXR5Q29tbWFuZAotICogIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERpYWdyYW1FZGl0b3JVdGlsIHsKLQotCQotCXByaXZhdGUgc3RhdGljIERpYWdyYW1FZGl0b3JVdGlsIGluc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgTGlzdCBjb21tYW5kTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBEaWFncmFtRWRpdG9yVXRpbCgpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERpYWdyYW1FZGl0b3JVdGlsIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChEaWFncmFtRWRpdG9yVXRpbC5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IERpYWdyYW1FZGl0b3JVdGlsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JcHVibGljIExpc3QgZ2V0VmFyeUNvbW1hbmRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWNvbW1hbmRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQljb21tYW5kTGlzdGVuZXJzLmFkZChuZXcgSUNvbW1hbmRMaXN0ZW5lcigpIHsKLQkJCQotCQkJcHVibGljIHZvaWQgbm90aWZ5RXhlY3V0ZWQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJLy8gZ2V0IGNvbnRyaWJ1dG9yL3JlcGxhY2VyIG9mIHRoZSBhY3Rpdml0eQotCQkJCS8vCi0JCQkJT2JqZWN0IHdyYXBwZXIgPSAoKFZhcnlBY3Rpdml0eUNvbW1hbmQpY29tbWFuZCkuZ2V0V3JhcHBlcigpOwotCQkJCVVJSGVscGVyLmNsb3NlRGlhZ3JhbUVkaXRvcnMod3JhcHBlciwgbmV3IEFycmF5TGlzdCgpKTsKLQkJCQlVSUhlbHBlci5yZWZyZXNoT3BlbkRpYWdyYW1FZGl0b3JzT2ZQYXJlbnQod3JhcHBlciwgbmV3IEFycmF5TGlzdCgpKTsKLQkJCX0KLQotCQkJcHVibGljIENsYXNzIGdldENvbW1hbmRUeXBlKCkgewotCQkJCXJldHVybiBWYXJ5QWN0aXZpdHlDb21tYW5kLmNsYXNzOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcmVVbmRvKENvbW1hbmQgY29tbWFuZCkgewotCQkJCS8vIGdldCBvbGQgY29udHJpYnV0b3IvcmVwbGFjZXIgb2YgdGhlIGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFZhcnlBY3Rpdml0eUNvbW1hbmQpY29tbWFuZCkuZ2V0UmVzdWx0KCk7Ci0JCQkJCi0JCQkJTGlzdCBsaXN0eCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlVSUhlbHBlci5jbG9zZURpYWdyYW1FZGl0b3JzKG9iamVjdCwgbGlzdHgpOwotCQkJCQlVSUhlbHBlci5yZWZyZXNoT3BlbkRpYWdyYW1FZGl0b3JzT2ZQYXJlbnQob2JqZWN0LCBsaXN0eCk7Ci0JCQkJCWxpc3R4LmNsZWFyKCk7Ci0JCQl9Ci0JCQkJCi0JCX0KLQotCQkJcHVibGljIHZvaWQgcHJlRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbW1hbmRMaXN0ZW5lcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9EaWFncmFtVUlSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9EaWFncmFtVUlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjNkZjkzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvRGlhZ3JhbVVJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFJlc291cmNlIENsYXNzIGZvciB0aGUgQXV0aG9yaW5nIERpYWdyYW0gKEdFRikgcGFja2FnZXMuCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERpYWdyYW1VSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGlhZ3JhbVVJUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV2aW91c19uYW1lX251bGwxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9uYW1lX2VtcHR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fQWRkTm9kZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmcmVzaEZyb21CYXNlQ21kX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWdyYW1fc2F2ZUVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZURpYWdyYW1fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVEaWFncmFtX3Byb21wdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbGlnbl9iZW5kX3BvaW50X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0X2NvbmZpZ2VkaXRvcjA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbW1hbmRfY2Fubm90RWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEaWFncmFtVUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleSBhbmQgZm9ybWF0dGVkCi0JICogd2l0aCBhIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gb2JqZWN0LgotCSAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBrZXksIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIG5ldyBPYmplY3RbXSB7IGRhdGEgfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWNhY2YxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1wcmV2aW91c19uYW1lX251bGwxPVVuZG8gbmFtZSBjaGFuZ2UgaXMgbm90IGFsbG93ZWQgaWYgcHJldmlvdXMgbmFtZSBpcyBudWxsLgotZXJyX25hbWVfZW1wdHk9VGhlIG5hbWUgY2Fubm90IGJlIGVtcHR5LiBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG5hbWUuCi1tb3ZlQWN0aW9uX2xhYmVsPU1vdmUKLQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0PVNlbGVjdAotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwPVNlbGVjdCBub2RlIG9yIGxpbmsKLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPUFkZCBOb2RlCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnPUlYUkQwMDAyVzogQWRkaW5nIGEgbm9kZSB0byBkaWFncmFtIGZhaWxlZAotQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dD1MaW5rCi1BYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3Q9U2VsZWN0IExpbmsKLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA9Q3JlYXRlIG5ldyBsaW5rCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQ9U3RhcnQgTm9kZQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwPUNyZWF0ZSBuZXcgc3RhcnQgbm9kZQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ9RnJlZSBUZXh0Ci1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcD1DcmVhdGUgbmV3IGZyZWUgdGV4dAotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dD1TeW5jaHJvbml6YXRpb24gQmFyCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwPUNyZWF0ZSBuZXcgc3luY2hyb25pemF0aW9uIGJhcgotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0PURlY2lzaW9uIE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcD1DcmVhdGUgbmV3IGRlY2lzaW9uIG5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3RleHQ9RW5kIE5vZGUKLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg9QWN0aXZpdHkgRGV0YWlsOgotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcD1DcmVhdGUgbmV3IGVuZCBub2RlCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1BY3Rpdml0eQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA9Q3JlYXRlIG5ldyBhY3Rpdml0eQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhdGlvbgotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwPUNyZWF0ZSBuZXcgaXRlcmF0aW9uCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dD1QaGFzZQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXA9Q3JlYXRlIG5ldyBwaGFzZQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9VGFzayBEZXNjcmlwdG9yCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdGV4dD1Sb2xlIERlc2NyaXB0b3IKLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW06Ci1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1DcmVhdGUgbmV3IHJvbGUgZGVzY3JpcHRvcgotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXA9Q3JlYXRlIG5ldyB0YXNrIGRlc2NyaXB0b3IKLUFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1EZWxpdmVyeSBQcm9jZXNzCi1BY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1DYXBhYmlsaXR5IFBhdHRlcm4KLUFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg9UGhhc2UKLUFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1JdGVyYXRpb24KLUFjdHZpdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0PUFjdGl2aXR5Ci1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9V29yayBQcm9kdWN0IERlc2NyaXB0b3IKLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcD1DcmVhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1BbGlnbgotQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9UmVmcmVzaCBmcm9tIEJhc2UgQWN0aXZpdHkKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dD1Gb3JtYXQgVGV4dCBCb3guLi4KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9SG9yaXpvbnRhbGx5IHRvIEF2ZXJhZ2UKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9SG9yaXpvbnRhbGx5IHRvIEZpcnN0IFNlbGVjdGVkCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVZlcnRpY2FsbHkgdG8gQXZlcmFnZQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWNhbGx5IHRvIEZpcnN0IFNlbGVjdGVkCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVNhdmUKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9U2F2aW5nIHswfQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPU1vdmUgTm9kZQotQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlPVJlZnJlc2ggRnJvbSBCYXNlCi1BYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZT1DcmVhdGUgQmVuZHBvaW50Ci0KLUFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9T3BlbiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbQotcmVmcmVzaEFjdGlvbl9sYWJlbD1SZWZyZXNoCi1yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw9UmVmcmVzaCBGcm9tIEJhc2UKLWRpYWdyYW1fc2F2ZUVycm9yPUlVUEQwMDAxVzogU2F2aW5nIGRpYWdyYW0gZmFpbGVkCi0KLURlbGV0ZURpYWdyYW1fdGV4dD1EZWxldGUgRGlhZ3JhbQotRGVsZXRlRGlhZ3JhbV9wcm9tcHQ9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNsb3NlIGFuZCBkZWxldGUgdGhpcyBkaWFncmFtP1xuVGhpcyBjaGFuZ2UgaXMgcGVybWFuZW50IGFuZCBjYW5ub3QgYmUgdW5kb25lLgotYWxpZ25fYmVuZF9wb2ludF90ZXh0PUFsaWduIEJlbmQgUG9pbnQKLUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwPUNvbmZpZ3VyYXRpb24gRWRpdG9yCi1kaWFncmFtX25vZGVfcHJvcGVydHlfdmFsdWVfcHJvYmxlbV9tc2c9RXJyb3IgaW4gdGhlIG5vZGUncyBwcm9wZXJ0eSB2YWx1ZS4KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA9RXJyb3IKLQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PVJlc2V0IERpYWdyYW0gTGF5b3V0Ci1lcnJvckRpYWxvZ190aXRsZT1FcnJvcgotY29tbWFuZF9jYW5ub3RFZGl0PUlVUEQwMDAzRTogQ2Fubm90IGVkaXQgZGlhZ3JhbQotCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGl0bGU9UGFyZW50IEVkaXRvciBDbG9zZWQKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0PXswfSBoYXMgY2xvc2VkLiBXb3VsZCB5b3UgYWxzbyBsaWtlIHRvIGNsb3NlIHsxfT8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9UZW1wbGF0ZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1RlbXBsYXRlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5NmRiOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1RlbXBsYXRlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotCi0vKioKLSAqIENvbnN0YW50cyB1c2VkIGluIGF1dGhvcmluZyBkaWFncmFtCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVtcGxhdGVDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFkgPSAiYWN0aXZpdHkgdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVEVSQVRJT04gPSAiaXRlcmF0aW9uIHRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0UgPSAicGhhc2UgdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DSF9CQVIgPSAic3luY2hvbml6YXRpb24gYmFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDSVNJT05fTk9ERSA9ICJkZWNpc2lvbiBub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfTk9ERSA9ICJzdGFydCBub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX05PREUgPSAiZW5kIG5vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1QgPSAid29yayBwcm9kdWN0IHRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9ERVNDUklQVE9SID0gInJvbGUgZGVzY3JpcHRvciB0ZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfREVTQ1JJUFRPUiA9ICJ0YXNrIGRlc2NyaXB0b3IgdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUiA9ICJ3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0ZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSRUVfVEVYVCA9ICJmcmVlIHRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUT0RPOiBtb3ZlIHRoZXNlIGNvbnN0YW50cyB0byBvdGhlciBmaWxlLiBUaGlzIGNsYXNzIGRlZmluZSBvbmx5IHRlbXBsYXRlCi0JLy8gY29uc3RhbnRzCi0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GT05UX05BTUUgPSAicHJvcGVydHlfZm9udF9uYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRk9OVF9TVFlMRSA9ICJwcm9wZXJ0eV9mb250X3N0eWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRk9OVF9IRUlHSFQgPSAicHJvcGVydHlfZm9udF9oZWlnaHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GT05UX1JFRCA9ICJwcm9wZXJ0eV9mb250X3JlZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0ZPTlRfQkxVRSA9ICJwcm9wZXJ0eV9mb250X2JsdWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GT05UX0dSRUVOID0gInByb3BlcnR5X2ZvbnRfZ3JlZW4iOyAvLyROT04tTkxTLTEkCi0KLQkvLyBGb3IgZGVmYXVsdCBmb250cy4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZPTlRfTkFNRSA9IGdldEZvbnROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0ZPTlRfU0laRSA9IDg7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgREVGQVVMVF9GT05UID0gbmV3IEZvbnQobnVsbCwgREVGQVVMVF9GT05UX05BTUUsCi0JCQlERUZBVUxUX0ZPTlRfU0laRSwgamF2YS5hd3QuRm9udC5QTEFJTik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgREVGQVVMVF9GT05UX0lUQUxJQyA9IG5ldyBGb250KG51bGwsCi0JCQlERUZBVUxUX0ZPTlRfTkFNRSwgREVGQVVMVF9GT05UX1NJWkUsIGphdmEuYXd0LkZvbnQuSVRBTElDKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTl8ySyA9ICJXaW5kb3dzIDIwMDAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRGb250TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSAiQXJpYWwiOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ29ycnVwdGVkIEphcGFuZXNlIGNoYXJhY3RlcnMgaW4gQWN0aXZpdHkgRGlhZ3JhbXMKLQkJU3RyaW5nIGN1cnJlbnRMb2NhbGUgPSBQbGF0Zm9ybS5nZXROTCgpOwotCQlpZiAoY3VycmVudExvY2FsZSAhPSBudWxsCi0JCQkJJiYgY3VycmVudExvY2FsZS5zdGFydHNXaXRoKExvY2FsZS5KQVBBTkVTRS5nZXRMYW5ndWFnZSgpKSkgewotCQkJaWYgKFdJTl8ySy5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9ST0xFX1RBU0tTX0JPWF9CR19DT0xPUl9SR0IgPSAiQUREX1JPTEVfVEFTS1NfQk9YX0JHX0NPTE9SX1JHQiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1dQX0JPWF9CR19DT0xPUl9SR0IgPSAiQUREX1dQX0JPWF9CR19DT0xPUl9SR0IiOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1ZhbGlkYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmMjk4ZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1ZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogVmFsaWRhdGluZyByb3V0aW5lcyBmb3IgZGlhZ3JhbSBlZGl0aW5nCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGVyck1zZ19DYW5Ob3RDb25uZWN0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlcnJNc2dfU2FtZVByZWRBbmRTdWNjID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGlhZ3JhbVZhbGlkYXRpb25fZXJyX3NhbWVwcmVkYW5kc3VjX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlcnJNc2dfQ2FuTm90RGVsZXRlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHVzZXIgY2FuIGNvbm5lY3QgdGhlIGdpdmVuIG5vZGVzLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHJldHVybiBudWxsIGlmIGNvbm5lY3Rpb24gaXMgYWxsb3dlZCwgZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tDb25uZWN0KE5vZGUgc291cmNlLCBOb2RlIHRhcmdldCkgewotCQlpZiAoc291cmNlLmdldERpYWdyYW0oKSAhPSB0YXJnZXQuZ2V0RGlhZ3JhbSgpKQotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0OwotCi0JCWlmIChzb3VyY2UuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChzb3VyY2UuZ2V0RGlhZ3JhbSgpCi0JCQkJCS5nZXRPYmplY3QoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCU9iamVjdCBwcm9jID0gbnVsbDsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcHJvYyA9ICgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5nZXRUb3BJdGVtKCk7Ci0JCQl9Ci0JCQkvLyBnZXQgYWxsIGJyZWFrZG93biBlbGVtZW50cyBpbiB0aGlzIHByb2Nlc3MKLQkJCS8vCi0JCQlMaXN0IGFsbEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQlwcm9jKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCWFsbEVsZW1lbnRzLmFkZChUbmdVdGlsLnVud3JhcChvYmopKTsKLQkJCX0KLQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQkvLyBJZiB0YXJnZXQgaXMgUmVhZE9ubHkgKG1lYW5zIGV4dGVuZHMpIGFuZCBhbGxvdyB0aGUgbGluayBpZgotCQkJCS8vIGl0cyBwYXJlbnQgYWN0aXZpdHkgaXMgYSBDb250cmlidXRvcgotCQkJCQotCQkJCWlmICh0YXJnZXQuZ2V0RGlhZ3JhbSgpLmlzUmVhZE9ubHkoKSkKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCWlmIChzb3VyY2UuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlpZiAodGFyZ2V0LmdldE9iamVjdCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0NpcmN1bGFyKAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHRhcmdldC5nZXRPYmplY3QoKSwKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBzb3VyY2UuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCWFsbEVsZW1lbnRzKSkgewotCQkJCQkJCXJldHVybiBlcnJNc2dfU2FtZVByZWRBbmRTdWNjOwotCQkJCQkJfQotCQkJCQkJaWYodGFyZ2V0LmlzUmVhZE9ubHkoKSkKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCQkvLyBzaG91bGQgbm90IGFsbG93IGluY29taW5nIGNvbm5lY3Rpb24gdG8gc3RhcnQgbm9kZQotCQkJCQkJLy8gYW5kIEZyZWVUZXh0LgotCQkJCQkJaWYgKCgoVHlwZWROb2RlKSB0YXJnZXQpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1RBUlQKLQkJCQkJCQkJfHwgKChUeXBlZE5vZGUpIHRhcmdldCkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpIHsKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQl9Ci0KLQkJCQkJCUNvbGxlY3Rpb24gdGFyZ2V0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCS5nZXRUYXJnZXROb2RlcygoVHlwZWROb2RlKSB0YXJnZXQsCi0JCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHNvdXJjZQotCQkJCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTm9kZSBub2RlID0gKChOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQkJCQkJaWYgKG5vZGUuaXNSZWFkT25seSgpKQotCQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQ2lyY3VsYXIoCi0JCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCQlwcmVkLCBhbGxFbGVtZW50cykpIHsKLQkJCQkJCQkJcmV0dXJuIGVyck1zZ19TYW1lUHJlZEFuZFN1Y2M7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQkJaWYgKHRhcmdldCA9PSBzb3VyY2UpIHsKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJfQotCQkJCQkvLyBzaG91bGQgbm90IGFsbG93IG91dGdvaW5nIGNvbm5lY3Rpb24gZnJvbSBFbmQgTm9kZSBhbmQKLQkJCQkJLy8gRnJlZSBUZXh0Ci0JCQkJCWlmICgoKFR5cGVkTm9kZSkgc291cmNlKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkVORAotCQkJCQkJCXx8ICgoVHlwZWROb2RlKSBzb3VyY2UpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSB7Ci0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCX0KLQotCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiBJZiBzb3VyY2UgYW5kIHRhcmdldCBhcmUgVHlwZWROb2RlcywgYXZvaWQgY2lyY3VsYXIKLQkJCQkJCSAqIGxvb3AgY29ubmVjdGlvbi4KLQkJCQkJCSAqLwotCQkJCQkJaWYgKGNoZWNrU3luY0JhckNpcmN1bGFyTG9vb3AoKFR5cGVkTm9kZSkgc291cmNlLAotCQkJCQkJCQkoVHlwZWROb2RlKSB0YXJnZXQpICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHNob3VsZCBub3QgYWxsb3cgaW5jb21pbmcgY29ubmVjdGlvbiB0byBzdGFydCBub2RlCi0JCQkJCQkvLyBhbmQgRnJlZVRleHQuCi0JCQkJCQlpZiAoKChUeXBlZE5vZGUpIHRhcmdldCkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TVEFSVAotCQkJCQkJCQl8fCAoKFR5cGVkTm9kZSkgdGFyZ2V0KS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkZSRUVfVEVYVCkgewotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJCX0KLQotCQkJCQkJQ29sbGVjdGlvbiBzcmNOb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJLmdldFNvdXJjZU5vZGVzKChUeXBlZE5vZGUpIHNvdXJjZSwKLQkJCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJCQkJaWYgKCFzcmNOb2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlDb2xsZWN0aW9uIHRhcmdldE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCQkJLmdldFRhcmdldE5vZGVzKChUeXBlZE5vZGUpIHRhcmdldCwKLQkJCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlOb2RlIG5vZGUgPSAoKE5vZGUpIGl0ZXIubmV4dCgpKTsKLQkJCQkJCQkJaWYgKG5vZGUuaXNSZWFkT25seSgpKQotCQkJCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlCi0JCQkJCQkJCQkJLmdldE9iamVjdCgpOwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjTm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgKChOb2RlKSBpdGVyYXRvcgotCQkJCQkJCQkJCQkubmV4dCgpKS5nZXRPYmplY3QoKTsKLQkJCQkJCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0NpcmN1bGFyKHN1Y2MsIHByZWQsCi0JCQkJCQkJCQkJCWFsbEVsZW1lbnRzKSkgewotCQkJCQkJCQkJCXJldHVybiBlcnJNc2dfU2FtZVByZWRBbmRTdWNjOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCQkJCi0JCQkJCQlpZih0YXJnZXQuaXNSZWFkT25seSgpKSByZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQkKLQkJCQkJCUNvbGxlY3Rpb24gc3JjTm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCS5nZXRTb3VyY2VOb2RlcygoVHlwZWROb2RlKSBzb3VyY2UsCi0JCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHN1Y2MgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpICgoTm9kZSkgdGFyZ2V0KQotCQkJCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjTm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSAoKE5vZGUpIGl0ZXJhdG9yCi0JCQkJCQkJCQkubmV4dCgpKS5nZXRPYmplY3QoKTsKLQkJCQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tDaXJjdWxhcihzdWNjLCBwcmVkLAotCQkJCQkJCQkJYWxsRWxlbWVudHMpKSB7Ci0JCQkJCQkJCXJldHVybiBlcnJNc2dfU2FtZVByZWRBbmRTdWNjOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKHNvdXJjZS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCWlmIChzb3VyY2UuaXNSZWFkT25seSgpIHx8IHRhcmdldC5pc1JlYWRPbmx5KCkpIHsKLQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQl9Ci0KLQkJCWlmICgoc291cmNlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgfHwgdGFyZ2V0Ci0JCQkJCS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQkJCQl8fCAoc291cmNlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IgJiYgdGFyZ2V0Ci0JCQkJCQkJLmdldE9iamVjdCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpCi0JCQkJCXx8IChzb3VyY2UuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgJiYgdGFyZ2V0Ci0JCQkJCQkJLmdldE9iamVjdCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSkgewotCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBjb25uZWN0aW9uCi0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2UuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgPT0gdGFyZ2V0KSB7Ci0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfSBlbHNlIGlmIChzb3VyY2UuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkgewotCQkJaWYgKHNvdXJjZS5pc1JlYWRPbmx5KCkgfHwgdGFyZ2V0LmlzUmVhZE9ubHkoKSkgewotCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrRGVsZXRlKExpbmsgbGluaykgewotCQkKLS8vCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsCi0vLwkJCQkmJiBsaW5rLmdldFRhcmdldCgpLmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGlhZ3JhbSkgewotLy8JCQlpZiAobGluay5nZXRUYXJnZXQoKS5pc1JlYWRPbmx5KCkpewotLy8JCQkJaWYobGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSl7Ci0vLwkJCQkJaWYoKChUeXBlZE5vZGUpbGluay5nZXRTb3VyY2UoKSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTil7Ci0vLwkJCQkJCXJldHVybiBudWxsOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotLy8JCQl9Ci0vLwkJCWlmIChsaW5rLmdldFRhcmdldCgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0vLwkJCQkKLS8vCQkJCVR5cGVkTm9kZSB0eXBlZG5vZGUgPSAoVHlwZWROb2RlKWxpbmsuZ2V0VGFyZ2V0KCk7Ci0vLwkJCQlpZih0eXBlZG5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTil7Ci0vLwkJCQkJcmV0dXJuIG51bGw7Ci0vLwkJCQl9Ci0vLwkJCQlpZihsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgVHlwZWROb2RlKXsKLS8vCQkJCQl0eXBlZG5vZGUgPSAoVHlwZWROb2RlKWxpbmsuZ2V0U291cmNlKCk7Ci0vLwkJCQkJaWYodHlwZWRub2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pewotLy8JCQkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCQkKLS8vCQkJCWlmIChsaW5rLmdldFNvdXJjZSgpLmlzUmVhZE9ubHkoKSkKLS8vCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLS8vCQkJCQotLy8JCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudAotLy8JCQkJCQl8fCAobGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSAmJiAhR3JhcGhpY2FsRGF0YUhlbHBlcgotLy8JCQkJCQkJCS5nZXRTb3VyY2VOb2RlcygoVHlwZWROb2RlKSBsaW5rLmdldFNvdXJjZSgpLAotLy8JCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKQotLy8JCQkJCQkJCS5pc0VtcHR5KCkpKSB7Ci0vLwkJCQkJCi0vLwkJCQkJQ29sbGVjdGlvbiB0YXJnZXROb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0VGFyZ2V0Tm9kZXMoKFR5cGVkTm9kZSkgbGluay5nZXRUYXJnZXQoKSwKLS8vCQkJCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotLy8JCQkJCQlpZiAobm9kZS5pc1JlYWRPbmx5KCkpIHsKLS8vCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8KLS8vCQkJfQotLy8JCQlpZiAobGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotLy8JCQkJVHlwZWROb2RlIHR5cGVkbm9kZSA9IChUeXBlZE5vZGUpbGluay5nZXRTb3VyY2UoKTsKLS8vCQkJCWlmKHR5cGVkbm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkRFQ0lTSU9OKXsKLS8vCQkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJCX0KLS8vCQkJCWlmIChsaW5rLmdldFRhcmdldCgpLmlzUmVhZE9ubHkoKSkKLS8vCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLS8vCQkJfQotLy8JCX0gZWxzZSBpZiAoKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCAmJiBsaW5rLmdldFRhcmdldCgpLmlzUmVhZE9ubHkoKSkKLS8vCQkJCXx8IChsaW5rLmdldFNvdXJjZSgpICE9IG51bGwgJiYgbGluay5nZXRTb3VyY2UoKS5pc1JlYWRPbmx5KCkpKSB7Ci0vLwkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotLy8JCX0KLQkJLy9yZXR1cm4gbnVsbDsKLQkJCi0JCQotCQlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCi0JCS8vIFNwZWNpYWwgaGFuZGxlIGZvciBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBsaW5rcyBjYW5ub3QgYmUgZGVsZXRlZC4KLQkJaWYgKHRhcmdldCAhPSBudWxsCi0JCQkJJiYgdGFyZ2V0LmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCX0KLQkJCi0JCQotCQlpZiAodGFyZ2V0ICE9IG51bGwKLQkJCQkmJiB0YXJnZXQuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0JCQkKLQkJCS8vIFRhcmdldCA9IGJyZWFrZG93bmVsZW1lbnQKLQkJCWlmKHRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSl7Ci0JCQkJLy8gU291cmNlID0gQnJlYWtkb3duIGVsZW1lbnQKLQkJCQlpZihzb3VyY2UgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpewotCQkJCQlpZihsaW5rLmdldFRhcmdldCgpLmlzUmVhZE9ubHkoKSkKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJLy8gU291cmNlID0gVHlwZWROb2RlCi0JCQkJaWYoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKXsKLQkJCQkJLy8gU291cmNlID0gRGVjaXNpb24gTm9kZQotCQkJCQlUeXBlZE5vZGUgc291cmNlTm9kZSA9IChUeXBlZE5vZGUpc291cmNlOwotCQkJCQlpZighdGFyZ2V0LmlzUmVhZE9ubHkoKSl7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQllbHNlIGlmKHNvdXJjZU5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTil7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQllbHNlIGlmKHNvdXJjZU5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpewotCQkJCQkJcmV0dXJuIGNoZWNrU3luY0JhckluY29taW5nTGlua3Moc291cmNlTm9kZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihzb3VyY2VOb2RlLmlzUmVhZE9ubHkoKSl7Ci0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0vLyBUYXJnZXQgaXMgVHlwZWROb2RlCi0JCQllbHNlIGlmKHRhcmdldCBpbnN0YW5jZW9mIFR5cGVkTm9kZSl7Ci0JCQkJCi0JCQkJVHlwZWROb2RlIHR5cGVkTm9kZSA9IChUeXBlZE5vZGUpdGFyZ2V0OwotCQkJCS8vIGlmIFRhcmdldCBpcyBUeXBlZE5vZGUgYW5kIGl0cyBhIERlY2lzaW9uUG9pbnQgLSBzaG91bGQgYmUgYmxhY2suCi0JCQkJaWYodHlwZWROb2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJLy8gSWYgVGFyZ2V0IGlzIFR5cGVkTm9kZSBhbmQgYW5kIFNvdXJjZSBpcyBXb3JrQnJlYWtkb3duRWxlbWVudCBhbmQgcmVhZG9ubHkKLQkJCQkvLyBMaW5rIHNob3VsZCBiZSBncmVlbi4gCi0JCQkJaWYoc291cmNlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKXsKLQkJCQkJLy8gQ2hlY2sgVGFyZ2V0IC0gaXMgaGF2aW5nIGFueSBpbmRpcmVjdChvdXRnb2luZyBjb25ubmVjdGlvbikgY29udGFpbnMgZGVjaXNpb24gcG9pbnRzLgotCQkJCQlpZihjaGVja1N5bmNCYXJPdXRnb2luZ0xpbmtzKChUeXBlZE5vZGUpdGFyZ2V0KSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCWlmKHNvdXJjZS5pc1JlYWRPbmx5KCkpCi0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQl9Ci0JCQkJaWYoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKXsKLQkJCQkJVHlwZWROb2RlIHNvdXJjZVR5cGVkTm9kZSA9IChUeXBlZE5vZGUpc291cmNlOwotCQkJCQkvLyBTb3VyY2UgaXMgVHlwZWQgTm9kZSBhbmQgaXRzIGEgZGVjaXNpb24gcG9pbnQgcmV0dXJuIG51bGwuIAotCQkJCQlpZihzb3VyY2VUeXBlZE5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTil7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQkvLyBpZiBzb3VyY2UgaXMgU3luY0JhciBhbmQgY2hlY2sgYWxsIGl0cyBpbmNvbWluZyBjb25uZWN0aW9ucy4gCi0JCQkJCWlmKHNvdXJjZVR5cGVkTm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUil7Ci0JCQkJCQlyZXR1cm4gY2hlY2tTeW5jQmFySW5jb21pbmdMaW5rcyhzb3VyY2VUeXBlZE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrRGVsZXRlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5pc1JlYWRPbmx5KCkpCi0JCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gbm9kZS5nZXREaWFncmFtKCk7Ci0JCWlmIChkaWFncmFtIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCUNvbGxlY3Rpb24gdGFyZ2V0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFRhcmdldE5vZGVzKAotCQkJCQkJKFR5cGVkTm9kZSkgbm9kZSwgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTm9kZSB0YXJnZXQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmICh0YXJnZXQuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChkaWFncmFtIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tSZWNvbm5lY3QoTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0LCBMaW5rIGxpbmspIHsKLQkJaWYgKHNvdXJjZS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJCWlmIChsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQlpZiAobGluay5nZXRUYXJnZXQoKS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChsaW5rLmdldFRhcmdldCgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIHRhcmdldE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCQkuZ2V0VGFyZ2V0Tm9kZXMoKFR5cGVkTm9kZSkgbGluay5nZXRUYXJnZXQoKSwKLQkJCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAobm9kZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGVja0Nvbm5lY3Qoc291cmNlLCB0YXJnZXQsIGxpbmspOwotCX0KLQotCS8qCi0JICogTWV0aG9kIHdpbGwgbm90IGFsbG93IG11bHRpcGxlIGxpbmsgYmV0d2VlbiB0d28gbm9kZXMuIE5lZWRzIHRvIGNhbGwKLQkgKiBDcmVha0xpbmtDb21tYW5kIGFuZCBSZWNvbm5lY3RMaW5rQ29tbWFuZC4gQW55IGFjdGlvbiBvbiBhIExpbmsgc2hvdWxkCi0JICogY2FsbCB0aGlzIGNoZWNrQ29ubmVjdChOb2RlIHNvdXJjZSwgTm9kZSB0YXJnZXQsIExpbmsgbGluaykgYmVmb3JlIGFsbG93Ci0JICogdG8gY29ubmVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0Nvbm5lY3QoTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0LCBMaW5rIGxpbmspIHsKLQotCQlpZiAoc291cmNlID09IHRhcmdldCAmJiAhKHNvdXJjZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQl9Ci0KLQkJTGlzdCBsaW5rcyA9IHNvdXJjZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0JCWlmIChsaW5rcyAhPSBudWxsKSB7Ci0JCQkvLyBUaGlzIGlzIG5lZWQgZm9yIHJlY29ubmVjdCB0byBzYW1lIHRhcmdldCBub2RlLgotCQkJaWYgKGxpbmtzLmNvbnRhaW5zKGxpbmspKSB7Ci0JCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkuZXF1YWxzKHRhcmdldCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkvLyBUaGlzIGlzIG5lZWQgZm9yIG5ldyBjb25uZWN0IGFuZCByZWNvbm5lY3QgdG8gZGlmZmVyZW50IHRhcmdldCBub2RlLgotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaW5rcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGlua3ggPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgbGlua3h0YXJnZXQgPSBsaW5reC5nZXRUYXJnZXQoKTsKLQkJCWlmIChsaW5reHRhcmdldCAhPSBudWxsICYmIGxpbmt4dGFyZ2V0LmVxdWFscyh0YXJnZXQpKSB7Ci0JCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hlY2tDb25uZWN0KHNvdXJjZSwgdGFyZ2V0KTsKLQl9Ci0KLQkvKgotCSAqIFRvIGF2b2lkIGNpcmN1bGFyIGxvb3BpbmcgYmV0d2VlbiBzeW5jaHJvbml6YXRpb24gYmFycy4gSWYgU3ljbkJhcjEgLT4KLQkgKiBTeW5jQmFyMiAoY29ubmVjdGVkKSB0aGVuIFN5bmNCYXIyIC0+IFN5bmNCYXIxIGNhbm5vdCBjb25uZWN0LiBpZgotCSAqIHN5bmNiYXIxIC0+IHN5bmNiYXIyLT5zeW5jYmFyMyB0aGVuIHN5bmNiYXIzIC0+IHN5bmNiYXIxIGRpc2FsbG93ZWQuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTeW5jQmFyQ2lyY3VsYXJMb29vcChUeXBlZE5vZGUgc05vZGUsCi0JCQlUeXBlZE5vZGUgdE5vZGUpIHsKLQkJTGlzdCBsaXN0ID0gdE5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCQlpZiAoIWxpc3QuaXNFbXB0eSgpICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJTm9kZSB0eXBlZG5vZGUgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWlmIChzTm9kZS5lcXVhbHModHlwZWRub2RlKSkKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCWlmICh0eXBlZG5vZGUgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQkJcmV0dXJuIGNoZWNrU3luY0JhckNpcmN1bGFyTG9vb3Aoc05vZGUsCi0JCQkJCQkJKFR5cGVkTm9kZSkgdHlwZWRub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogTWV0aG9kIHRvIENoZWNrIGlmIFN5bmNCYXIgaW5Db21taW5nIGNvbm5lY3Rpb25zIGhhdmUgCi0JICogYW55IHNvdXJjZSBpcyBhIHJlYWRvbmx5LiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTeW5jQmFySW5jb21pbmdMaW5rcyhUeXBlZE5vZGUgdHlwZWROb2RlKXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJTm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJCWlmKHNvdXJjZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSl7Ci0JCQkJCWlmKHNvdXJjZS5pc1JlYWRPbmx5KCkpCi0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQl9ZWxzZSBpZihzb3VyY2UgaW5zdGFuY2VvZiBUeXBlZE5vZGUpewotCQkJCQlpZigoKFR5cGVkTm9kZSlzb3VyY2UpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKQotCQkJCQkJaWYoY2hlY2tTeW5jQmFySW5jb21pbmdMaW5rcygoVHlwZWROb2RlKXNvdXJjZSkhPSBudWxsKQotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoKLQkgKk1ldGhvZCB0byBjaGVjayBpZiBzeW5jaHJvbml6YXRpb24gYmFyIG91dGdvaW5nIGNvbm5lY3Rpb24KLQkgKmhhcyBhbnkgdGFyZ2V0IGlzIHJlYWRvbmx5LiAgCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTeW5jQmFyT3V0Z29pbmdMaW5rcyhUeXBlZE5vZGUgdHlwZWROb2RlKXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJTm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWlmKHRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSl7Ci0JCQkJCWlmKHRhcmdldC5pc1JlYWRPbmx5KCkpCi0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQl9ZWxzZSBpZih0YXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpewotCQkJCQlpZigoKFR5cGVkTm9kZSl0YXJnZXQpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKQotCQkJCQkJaWYoY2hlY2tTeW5jQmFyT3V0Z29pbmdMaW5rcygoVHlwZWROb2RlKXRhcmdldCkhPSBudWxsKQotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGxpbmsgaXMgcmVhZG9ubHkuIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRPbmx5KExpbmsgbGluaykgewotCQlOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCU5vZGUgc291cmNlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJCXJldHVybiBjaGVja0RlbGV0ZShsaW5rKSAhPSBudWxsOwotCQl9IGVsc2UgaWYgKHRhcmdldCAhPSBudWxsCi0JCQkJJiYgdGFyZ2V0LmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJaWYgKChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UgaW5zdGFuY2VvZiBUYXNrTm9kZSAmJiBzb3VyY2UKLQkJCQkJLmlzUmVhZE9ubHkoKSkKLQkJCQkJfHwgKHRhcmdldCBpbnN0YW5jZW9mIFRhc2tOb2RlICYmIHRhcmdldC5pc1JlYWRPbmx5KCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmE5OGE2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW1zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0YjAzZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TV1RHcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuU2VsZWN0YWJsZUxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5MYXllck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5TY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYSBncmFwaGljYWwgdmlld2VyIG9mIHRoZSBlbGVtZW50IGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgewotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlwcm90ZWN0ZWQgR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLQotCXByb3RlY3RlZCBPYmplY3Qgd3JhcHBlcjsKLQotCXB1YmxpYyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJY3JlYXRlR3JhcGhpY2FsVmlld2VyKCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBPYmplY3Qgd3JhcHBlcikgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKLQkJY3JlYXRlR3JhcGhpY2FsVmlld2VyKCk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEdyYXBoaWNhbFZpZXdlciBvbiB0aGUgc3BlY2lmaWVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gbmV3IFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcigpOwotCQl0aGlzLmdyYXBoaWNhbFZpZXdlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCWNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdyYXBoaWNhbCB2aWV3ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgZ3JhcGhpY2FsIHZpZXdlcgotCSAqLwotCXByb3RlY3RlZCBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldEJhY2tncm91bmQoCi0JCQkJQ29sb3JDb25zdGFudHMubGlzdEJhY2tncm91bmQpOwotCQlTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcikgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydCByb290ID0gbmV3IFNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQoKTsKLQkJdmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLQkJdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0RmlndXJlKCkgewotCQlHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJLy8gZmluZCB0aGUgZmlndXJlIHRvIGJlIHNhdmVkCi0JCUxheWVyTWFuYWdlciBsbSA9IChMYXllck1hbmFnZXIpIHZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCUxheWVyTWFuYWdlci5JRCk7Ci0JCUlGaWd1cmUgZmlndXJlID0gbG0uZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3VwcHJlc3Npb25Ub0RpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCU9iamVjdCBlID0gZGlhZ3JhbS5nZXRPYmplY3QoKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGUpOwotCQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJCWRpYWdyYW0uc2V0U3VwcHJlc3Npb24oU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYykpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBkaWFncmFtIGZvciBnaXZlbiBvYmplY3QgKG9ubHkgZm9yIHtAbGluayBBY3Rpdml0eX0gYW5kIHBhY2tzIHRoZSBib3VuZHMuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIgCXtAbGluayBPYmplY3R9IAkKLQkgKiBAcGFyYW0gbmVlZFJlc2V0IGJvb2xlYW4KLQkgKiBAcGFyYW0gZmlsdGVyIAl7QGxpbmsgSUZpbHRlcn0KLQkgKiBAcGFyYW0gc3VwCQl7QGxpbmsgU3VwcHJlc3Npb259Ci0JICovCi0JcHVibGljIEVkaXRQYXJ0IGxvYWREaWFncmFtKE9iamVjdCB3cmFwcGVyLCBib29sZWFuIG5lZWRSZXNldCwKLQkJCUlGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgdmlld2VyIHdpdGggdGhlIGVkaXQgcGFydAotCQlFZGl0UGFydCBlZGl0UGFydCA9IGNyZWF0ZUVkaXRQYXJ0KHdyYXBwZXIsIGZpbHRlciwgc3VwKTsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCi0JCS8vIGFzayBmb3IgaW1tZWRpYXRlIHVwZGF0ZSBvZiB0aGUgY29udHJvbCBzbyB0aGF0IHRoZSBkaWFncmFtIGZpZ3VyZQotCQkvLyB3aWxsIGJlIGNvbXB1dGVkCi0JCXBhcmVudC5wYWNrKHRydWUpOwotCi0JCS8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIGZvciBicm93c2luZywgaW4gb3JkZXIgdG8gcmVuZGVyIGFjdGl2aXR5IGNvbnRyaWJ1dGluZydzCi0JCS8vIGNoaWxkcmVuLiAgSW4gcHJvY2Vzc0F1dGhvcmluZyB3ZSBkb24ndCBkbyByZWFsaXphdGlvbiwgaW4gb3JkZXIgdG8gZGlzcGxheWVkIAotCQkvLyByZWFsaXplZCBlbGVtZW50cywgd2UgaGF2ZSB0byBjbGVhbnVwIEFERCBkaWFncmFtIGFuZCByZWNyZWF0ZS4gbmVlZHRvUmVzZXQgb3IgY2xlYW51cGRpYWdyYW0uCi0JCS8vIE9ubHkgZm9yIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtLgotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZihvIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ICYmIGdldERpYWdyYW1UeXBlKCkgIT0gbnVsbCAmJiAKLQkJCQlnZXREaWFncmFtVHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTCkpewotCQkJaWYoVG5nVXRpbC5oYXNDb250cmlidXRvcigoVmFyaWFiaWxpdHlFbGVtZW50KW8pKXsKLQkJCQluZWVkUmVzZXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobmVlZFJlc2V0KSB7Ci0JCQljbGVhblVwRGlhZ3JhbSgpOwotCQl9Ci0KLQkJSUZpZ3VyZSBmaWd1cmUgPSBnZXRGaWd1cmUoKTsKLQkJaWYgKGZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gZmlndXJlLmdldEJvdW5kcygpOwotCi0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQmVmb3JlIHVwZGF0ZTogRGlhZ3JhbSBCb3VuZHMgPSAiICsgYm91bmRzKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGJvdW5kcy54IDwgMCB8fCBib3VuZHMueSA8IDApIHsKLQkJCQkoKERpYWdyYW1FZGl0UGFydCkgZWRpdFBhcnQpLm1vdmVGaWd1cmUoLWJvdW5kcy54LCAtYm91bmRzLnkpOwotCi0JCQkJcGFyZW50LnBhY2sodHJ1ZSk7Ci0KLQkJCQlib3VuZHMgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFmdGVyIHVwZGF0ZTogRGlhZ3JhbSBCb3VuZHMgPSAiICsgYm91bmRzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0UGFydDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGlhZ3JhbUluZm8oR3JhcGhpY2FsRWRpdFBhcnQgcGFydCwgRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8pIHsKLQkJTGlzdCBjaGlsZHJlbiA9IHBhcnQuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlsb2FkRGlhZ3JhbUluZm8oKEdyYXBoaWNhbEVkaXRQYXJ0KSBvLCBkaWFncmFtSW5mbyk7Ci0JCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCXBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIG87Ci0JCQkJT2JqZWN0IG1vZGVsID0gcGFydC5nZXRNb2RlbCgpOwotCQkJCU9iamVjdCBlID0gbW9kZWw7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBMaW5rZWRPYmplY3QpIHsKLQkJCQkJZSA9ICgoTGlua2VkT2JqZWN0KSBlKS5nZXRPYmplY3QoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZSBpbnN0YW5jZW9mIERpYWdyYW1FbGVtZW50KSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlib29sZWFuIHN1cHByZXNzZWQ7Ci0JCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJCQkJc3VwcHJlc3NlZCA9ICgoTmFtZWROb2RlKSBtb2RlbCkuaXNTdXBwcmVzc2VkKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdXBwcmVzc2VkID0gKChNZXRob2RFbGVtZW50KSBlKS5nZXRTdXBwcmVzc2VkKCkKLQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQl9Ci0KLQkJCQkJCUlGaWd1cmUgZiA9IHBhcnQuZ2V0RmlndXJlKCk7Ci0JCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZi5nZXRCb3VuZHMoKTsKLQotCQkJCQkJU3RyaW5nIGFsdFRhZyA9IG51bGw7Ci0JCQkJCQlpZiAoZiBpbnN0YW5jZW9mIFNlbGVjdGFibGVMYWJlbCkgewotCQkJCQkJCWFsdFRhZyA9ICgoU2VsZWN0YWJsZUxhYmVsKSBmKS5nZXRUZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlkaWFncmFtSW5mby5hZGRBcmVhKChNZXRob2RFbGVtZW50KSBlLCBib3VuZHMueCwKLQkJCQkJCQlib3VuZHMueSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCBhbHRUYWcsIHN1cHByZXNzZWQpOwotCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVkaXRQYXJ0IG5vdCBoYW5kbGVkOiAiICsgbyk7Ci0JCQkJLy8gLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyB7QGxpbmsgRGlhZ3JhbUluZm99Ci0JICogCi0JICovCi0JcHVibGljIERpYWdyYW1JbmZvIGdldERpYWdyYW1JbmZvKCkgewotCQlEaWFncmFtSW5mbyBkaWFncmFtSW5mbyA9IG51bGw7Ci0KLQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgdGhpcy5ncmFwaGljYWxWaWV3ZXIKLQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBwYXJ0LmdldE1vZGVsKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlua2VkT2JqZWN0KSB7Ci0JCQllbGVtZW50ID0gKChMaW5rZWRPYmplY3QpIGVsZW1lbnQpLmdldE9iamVjdCgpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJZGlhZ3JhbUluZm8gPSBuZXcgRGlhZ3JhbUluZm8oZ2V0RGlhZ3JhbVR5cGUoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJbG9hZERpYWdyYW1JbmZvKHBhcnQsIGRpYWdyYW1JbmZvKTsKLQkJfQotCi0JCXJldHVybiBkaWFncmFtSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRpYWdyYW0gaW1hZ2UgZnJvbSBmaWd1cmUgY3JlYXRlZCBpbiBsb2FkRGlhZ3JhbSBtZXRob2QuCi0JICogCi0JICovCi0JcHVibGljIEltYWdlIGNyZWF0ZURpYWdyYW1JbWFnZSgpIHsKLQkJSUZpZ3VyZSBmaWd1cmUgPSBnZXRGaWd1cmUoKTsKLQotCQlTV1RHcmFwaGljcyBncmFwaGljcyA9IG51bGw7Ci0JCUdDIGdjID0gbnVsbDsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gZmlndXJlLmdldEJvdW5kcygpOwotCQkJaW50IGhlaWdodCA9IGJvdW5kcy5oZWlnaHQ7Ci0JCQlpbnQgd2lkdGggPSBib3VuZHMud2lkdGg7Ci0KLQkJCS8vIGNyZWF0ZSBhIG5ldyBpbWFnZSBhbmQgcmVwYWludCB0aGUgZ3JhcGgKLQkJCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgd2lkdGgsIGhlaWdodCk7Ci0JCQlnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCQlncmFwaGljcyA9IG5ldyBTV1RHcmFwaGljcyhnYyk7Ci0JCQlmaWd1cmUucGFpbnQoZ3JhcGhpY3MpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZWxlYXNlIHJlc291cmNlcwotCQkJaWYgKGdyYXBoaWNzICE9IG51bGwpCi0JCQkJZ3JhcGhpY3MuZGlzcG9zZSgpOwotCQkJaWYgKGdjICE9IG51bGwpCi0JCQkJZ2MuZGlzcG9zZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ3JhcGhpY2FsVmlld2VyICE9IG51bGwpIHsKLQkJCQlDb250cm9sIGN0cmwgPSBncmFwaGljYWxWaWV3ZXIuZ2V0Q29udHJvbCgpOwotCQkJCWlmIChjdHJsICE9IG51bGwpIHsKLQkJCQkJY3RybC5kaXNwb3NlKCk7Ci0JCQkJfQotCi0JCQkJZ3JhcGhpY2FsVmlld2VyID0gbnVsbDsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlLCBJRmlsdGVyIGZpbHRlciwKLQkJCVN1cHByZXNzaW9uIHN1cCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERpYWdyYW1UeXBlKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwRGlhZ3JhbSgpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3MDgxNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbUFjdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5EaWFncmFtVXBkYXRlU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRGVmYXVsdEVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBncmFwaGljYWwgdmlld2VyIGZvciB0aGUgQWN0aXZpdHlEZXRhaWwgZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB7Ci0KLQlwdWJsaWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkoKTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2NyZWF0ZUVkaXRQYXJ0KGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uKQotCSAqLwotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW0oKTsvLwotCQlkaWFncmFtLnNldEZpbHRlcihmaWx0ZXIpOwotCQlpZiAoc3VwICE9IG51bGwpIHsKLQkJCWRpYWdyYW0uc2V0U3VwcHJlc3Npb24oc3VwKTsKLQkJfQotCi0JCWRpYWdyYW0uc2V0T2JqZWN0KGUpOwotCQlFZGl0UGFydCBwYXJ0ID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KAotCQkJCShBY3Rpdml0eURldGFpbERpYWdyYW0pIGRpYWdyYW0pOwotCQlwYXJ0LnNldE1vZGVsKGRpYWdyYW0pOwotCQlyZXR1cm4gcGFydDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1UeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjY2xlYW5VcERpYWdyYW0oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFuVXBEaWFncmFtKCkgewotCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBkZXAgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJLmdldENvbnRlbnRzKCk7Ci0JCWRlcC5nZXRSZWNlbnRseUFkZGVkUGFydHMoKS5hZGRBbGwoZGVwLmdldENoaWxkcmVuKCkpOwotCi0JCS8vIGNsZWFuIHVwIHRoZSBkaWFncmFtCi0JCURlZmF1bHRFZGl0RG9tYWluIGVkaXRpbmdEb21haW4gPSBuZXcgRGVmYXVsdEVkaXREb21haW4obnVsbCk7Ci0JCUFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5ID0gbmV3IEFjdGlvblJlZ2lzdHJ5KCk7Ci0KLQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UgYWN0aW9uU2VydmljZSA9IG5ldyBEaWFncmFtQWN0aW9uU2VydmljZSgKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKSwgZWRpdGluZ0RvbWFpbiwgYWN0aW9uUmVnaXN0cnkpOwotCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVyVmVydGljYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKTsKLQotCQlEaWFncmFtVXBkYXRlU2VydmljZSBzZXJ2aWNlID0gbmV3IERpYWdyYW1VcGRhdGVTZXJ2aWNlKAotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLCBlZGl0aW5nRG9tYWluLCBhY3Rpb25SZWdpc3RyeSk7Ci0JCXNlcnZpY2UuY2xlYW5VcERpYWdyYW0oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDQyZGU4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BY3Rpdml0eURpYWdyYW1TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wZXJzaXN0ZW5jZS5JRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlZhcmlhYmlsaXR5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLklBY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBQcm92aWRlcyBzZXJ2aWNlIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGRpYWdyYW0gaW1hZ2VzIGZvciBhY3Rpdml0eSBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtU2VydmljZSBpbXBsZW1lbnRzIElBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudCA9IG51bGw7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBob2xkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBGaWxlIHB1YkRpcjsKLQotCXByaXZhdGUgc3RhdGljIE1hcCB0eXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8gPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hVbmNyZWF0ZWRBREQgPSB0cnVlOwotCQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IHRydWU7Ci0KLQlzdGF0aWMgewotCQl0eXBlTWFwLnB1dChSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1csIG5ldyBJbnRlZ2VyKAotCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKSk7Ci0JCXR5cGVNYXAucHV0KFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwsIG5ldyBJbnRlZ2VyKAotCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSkpOwotCQl0eXBlTWFwLnB1dChSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWSwgbmV3IEludGVnZXIoCi0JCQkJSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRJbnRUeXBlKFN0cmluZyBkaWFncmFtVHlwZSkgewotCQlJbnRlZ2VyIHR5cGUgPSAoSW50ZWdlcikgdHlwZU1hcC5nZXQoZGlhZ3JhbVR5cGUpOwotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHlwZS5pbnRWYWx1ZSgpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCVNoZWxsIHNoZWxsID0gbnVsbDsKLQotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKCkgewotCQl0aGlzKG51bGwsIG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpKTsKLQl9Ci0KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtU2VydmljZShGaWxlIHB1YkRpcikgewotCQl0aGlzKG51bGwsIHB1YkRpcik7Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoQ29tcG9zaXRlIHBhcmVudCwgRmlsZSBwdWJEaXIpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMucHViRGlyID0gcHViRGlyOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIGdldERpYWdyYW1WaWV3ZXIoaW50IGRpYWdyYW1UeXBlKSB7Ci0JCS8vIGlmIHRoZSBzaGVsbCB3aW5kb3cgaXMgZGlzdHJveWVkLCByZWNyZWF0ZSBpdAotCQlpZiAoKHRoaXMuc2hlbGwgIT0gbnVsbCkgJiYgdGhpcy5zaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMucGFyZW50ID0gbnVsbDsKLQkJCXRoaXMuc2hlbGwgPSBudWxsOwotCQl9Ci0KLQkJZ2V0Vmlld2VySG9sZGVyKHBhcmVudCk7Ci0KLQkJc3dpdGNoIChkaWFncmFtVHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJcmV0dXJuIG5ldyBBY3Rpdml0eURpYWdyYW1WaWV3ZXIoaG9sZGVyKTsKLQotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCXJldHVybiBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyKGhvbGRlcik7Ci0KLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCXJldHVybiBuZXcgV1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlcihob2xkZXIpOwotCQkJCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRWaWV3ZXJIb2xkZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCWlmIChzaGVsbCA9PSBudWxsIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJCXNoZWxsID0gY3JlYXRlU2hlbGwoKTsKLQkJCX0KLQkJCXNoZWxsLm9wZW4oKTsKLQkJCXBhcmVudCA9IHNoZWxsOwotCQl9Ci0KLQkJaWYgKGhvbGRlciAhPSBudWxsKSB7Ci0JCQlob2xkZXIuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaG9sZGVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJaG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDEsIDEpKTsgLy8gc2l6ZSBjYW4ndCBiZSAwLDAKLQkJLy8gb3RoZXJ3aXNlIHRoZSBkaWFncmFtCi0JCS8vIHdpbGwgbm90IGJlIHBhaW50ZWQKLQkJaG9sZGVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJaG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgU2hlbGwgY3JlYXRlU2hlbGwoKSB7Ci0JCVNoZWxsIHNoZWxsID0gbnVsbDsKLQkJRGlzcGxheSBkID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCXNoZWxsID0gbmV3IFNoZWxsKGQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2hlbGwuc2V0Qm91bmRzKDAsIDAsIDAsIDApOwotCQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICgoc2hlbGwgIT0gbnVsbCkgJiYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlzaGVsbC5jbG9zZSgpOwotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc2F2ZSB0aGUgZWxlbWVudCBkaWFncmFtIGltYWdlIGFuZCByZXR1cm5zIHRoZSBpbWFnZSBmaWxlIHVybC4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEBwYXJhbSBpbWdQYXRoCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgSUZpbHRlcgotCSAqIEBwYXJhbSBzdXAKLQkgKiAgICAgICAgICAgIFN1cHByZXNzaW9uCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGltYWdlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgZGlyCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5JQWN0aXZpdHlEaWFncmFtU2VydmljZSNzYXZlRGlhZ3JhbShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUluZm8gc2F2ZURpYWdyYW0oZmluYWwgT2JqZWN0IHdyYXBwZXIsIGZpbmFsIFN0cmluZyBpbWdQYXRoLCAKLQkJCWZpbmFsIFN0cmluZyBkaWFncmFtVHlwZSwgZmluYWwgSUZpbHRlciBmaWx0ZXIsCi0JCQlmaW5hbCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgZGlhZ3JhbUluZm8KLQkJZGlhZ3JhbUluZm8gPSBudWxsOwotCi0JCS8vIGdyYWIgdGhlIFVJIHRocmVhZCB0byBhdm9pZCB0aHJlYWQgYWNjZXNzIGVycm9yCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlfX2ludGVybmFsX3NhdmVEaWFncmFtKHdyYXBwZXIsIGltZ1BhdGgsIGRpYWdyYW1UeXBlLCBmaWx0ZXIsIHN1cCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBkaWFncmFtSW5mbzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzVXNlckRlZmluZWREaWFncmFtKEFjdGl2aXR5IGUsIFN0cmluZyBpbWdQYXRoLCBTdHJpbmcgZGlhZ3JhbVR5cGUpIHRocm93cyBFeGNlcHRpb24KLQl7CQkKLQkJLy8gaWYgdGhlcmUgaXMgYSB1c2VyIGRlZmluZWQgZGlhZ3JhbSwgdXNlIGl0Ci0JCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8gaW5mbyA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvKChBY3Rpdml0eSllKTsKLQkJc3dpdGNoIChnZXRJbnRUeXBlKGRpYWdyYW1UeXBlKSkKLQkJewotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCQlpZiAoIGluZm8uY2FuUHVibGlzaEFESW1hZ2UoKSApCi0JCQkJewotCQkJCQlyZXR1cm4gKGluZm8uZ2V0QWN0aXZpdHlEaWFncmFtKCkgIT0gbnVsbCkgJiYgaW5mby5jYW5QdWJsaXNoQURJbWFnZSgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJCWlmICggaW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKSApCi0JCQkJewotCQkJCQlyZXR1cm4gKGluZm8uZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgIT0gbnVsbCkgJiYgaW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkJCQkJCi0JCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJCWlmICggaW5mby5jYW5QdWJsaXNoV1BESW1hZ2UoKSApCi0JCQkJewotCQkJCQlyZXR1cm4gKGluZm8uZ2V0V1BERGlhZ3JhbSgpICE9IG51bGwgKSAmJiBpbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgX19pbnRlcm5hbF9zYXZlRGlhZ3JhbShPYmplY3Qgd3JhcHBlciwgZmluYWwgU3RyaW5nIGltZ1BhdGgsIFN0cmluZyBkaWFncmFtVHlwZSwKLQkJCUlGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJCi0JCWlmICggc3VwLmlzU3VwcHJlc3NlZCh3cmFwcGVyKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJT2JqZWN0IG8gPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy9NZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClvOwotCQlBY3Rpdml0eSBlID0gKEFjdGl2aXR5KW87Ci0JCS8vIERpYWdyYW1JbmZvIGRpYWdyYW1JbmZvID0gbnVsbDsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpbnQgdHlwZSA9IGdldEludFR5cGUoZGlhZ3JhbVR5cGUpOwotCQlpZiAodHlwZSA8IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSBudWxsOwotCi0JCS8vIGtlZXAgdGhlIGRpcnR5IGZsYWcgYW5kIHJlc2V0IGJhY2sgdG8gYXZvaWQgbWFrZSB0aGUgbGlicmFyeSBkaXJ0eQotCQlib29sZWFuIGRpcnR5RmxhZyA9IGUuZVJlc291cmNlKCkuaXNNb2RpZmllZCgpOwotCi0JCXRyeSB7Ci0JCQlpZiAoIGhhc1VzZXJEZWZpbmVkRGlhZ3JhbSgoQWN0aXZpdHkpZSwgaW1nUGF0aCwgZGlhZ3JhbVR5cGUpICkKLQkJCXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQotCQkJLy8gZmlyc3QgY2hlY2sgaWYgd2UgbmVlZCB0byBnZW5lcmF0ZSB0aGUgZGlhZ3JhbSBvciBub3QKLQkJCS8vIGlmIHRoZSBkaWFncmFtIGlzIHN1cHJlc3NlZCwgZG9uJ3QgZ2VuZXJhdGUgZGlhZ3JhbQotCQkJLy8gZG9uJ3QgY3JlYXRlIHRoZSBkaWFncmFtIGlmIGl0J3Mgbm90IHRoZXJlLAotCQkJLy8gaWQgdGhlIGRpYWdyYW0gZG9lcyBub3QgZXhpc3QsIGl0J3Mgc3VwcmVzc2VkCi0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZCA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldFVNQURpYWdyYW0oKEFjdGl2aXR5KSBlLCB0eXBlLCBmYWxzZSk7Ci0KLQkJCS8vIEFsbG93IHRoZSBvcHRpb24gdG8gcHVibGlzaCAndW5jcmVhdGVkJyBkaWFncmFtcwotCQkJLy8gYnkgZGVmYXVsdCwgdW5jcmVhdGVkIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyB3aWxsIGJlIHB1Ymxpc2hlZCwKLQkJCS8vIHVuY3JlYXRlZCBkaWFncmFtcyBvZiBvdGhlciB0eXBlcyB3aWxsIG5vdCBiZSBwdWJsaXNoZWQKLQkJCWJvb2xlYW4gZXhpc3QgPSAoZCAhPSBudWxsKTsKLQkJCWlmIChleGlzdCkgewotCQkJCWlmIChkLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKQotCQkJCQlyZXR1cm47Ci0JCQkJCi0JCQkJLy8gSWYgYW4gZXh0ZW5zaW9uIGhhcyBpdHMgb3duIGRpYWdyYW0uIEJhc2UgaXMgcmVwbGFjZWQgb3IgY29udHJpYnV0ZWQuIAotCQkJCS8vIGV4dGVuc2lvbiBkaWFncmFtIHNob3dzIHJlYWxpemVkIGVsZW1lbnQgaW4gdW5kZWZpbmVkIGxvY2F0aW9uLiAKLQkJCQkvLyBJbiBwdWJsaXNoaW5nIGRvbid0IGRpc3BsYXkgZXh0ZW5zaW9uIGRpYWdyYW0gZXZlbiBpZiBpdCBoYXMgaXRzIG93bgotCQkJCS8vIGRpYWdyYW0gaWYgcmVhbGl6ZWQgZWxlbWVudHMgYXJlIGNvbWluZyBpbiB0aHJvdWdoIHZhcmlhYmlsaXR5LgotCQkJCWlmKHR5cGUgPT0gR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ESUFHUkFNICYmCi0JCQkJCQljaGVja1ZhcmlhYmlsaXR5KGUsIGZpbHRlcix0eXBlKSAhPSBudWxsKXsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkJCi0JCQl9ZWxzZXsKLQkJCQkKLQkJCQlpZigodHlwZSA9PSBHcmFwaGljYWxEYXRhSGVscGVyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pKQotCQkJCQlyZXR1cm47Ci0KLQkJCQkvLyBGb3IgQWN0aXZpdHkgRGlhZ3JhbSB1biBvcGVuZWQgZXh0ZW5zaW9uIHB1Ymxpc2guCi0JCQkJaWYodHlwZSA9PSBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU0pewotCQkJCQkvLyBJZiBvcHRpb24gaXMgbm90IGNoZWNrZWQsIGRvbid0IGdlbmVyYXRlIGEgZGlhZ3JhbQotCQkJCQlpZighcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24pIHJldHVybjsKLQkJCQkJCi0JCQkJCS8vSWYgZXh0ZW5zaW9uIGlzIG1vZGlmaWVkIGRvbid0IGdlbmVyYXRlIGl0LgotCQkJCQlpZighZS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGNhbGN1bGF0ZWRCYXNlID0gY2hlY2tWYXJpYWJpbGl0eShlLCBmaWx0ZXIsIHR5cGUpOwotCQkJCQlpZihjYWxjdWxhdGVkQmFzZSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0JCi0JCQkJCQotCQkJCQl3cmFwcGVyID0gY2FsY3VsYXRlZEJhc2U7Ci0JCQkJCWUgPSAoQWN0aXZpdHkpY2FsY3VsYXRlZEJhc2U7Ci0JCQkJCWV4aXN0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKHB1Ymxpc2hVbmNyZWF0ZWRBREQgPT0gZmFsc2UgJiYgdHlwZSA9PSBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKXsKLQkJCQkJYm9vbGVhbiBjb250cmlidXRvcmV4aXN0ID0gZmFsc2U7Ci0JCQkJCS8vIFRoaXMgaXMgbmVlZCwgaWYgY29udHJpYnV0b3IgaGFzIGEgQUREIGRpYWdyYSwgYmFzZSBkb24ndCAKLQkJCQkJLy8gYmFzZSBzaG91bGQgZ2VuZXJhdGUgQUREIGluIGJyb3dzaW5nLgotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCQkJCWNvbmZpZyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCi0JCQkJCS8vIEdldCBpbW1lZGlhdGUgY29udHJpYnV0b3JzIGZpcnN0LCBhbmQgY2hlY2sgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycwotCQkJCQkvLyBoYXZlIGFueXRoaW5nIGV4dHJhIGJyZWFrZG93biBlbGVtZW50cy4KLQkJCQkJTGlzdCBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb250cmlidXRvcnMoZSwgY29uZmlnKTsKLQkJCQkJaWYoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQkJCQkJaWYoaXRlcmF0b3IgIT0gbnVsbCl7Ci0JCQkJCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKXsKLQkJCQkJCQkJT2JqZWN0IGFjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYoYWN0ICE9IG51bGwpewotCQkJCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGR4ID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJLmdldFVNQURpYWdyYW0oKEFjdGl2aXR5KSBhY3QsIHR5cGUsIGZhbHNlKTsKLQkJCQkJCQkJCWlmKGR4ICE9IG51bGwpeyAgIAotCQkJCQkJCQkJCWNvbnRyaWJ1dG9yZXhpc3QgPSB0cnVlOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmKCFjb250cmlidXRvcmV4aXN0KQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCXZpZXdlciA9IGdldERpYWdyYW1WaWV3ZXIodHlwZSk7Ci0JCQkJdmlld2VyLmxvYWREaWFncmFtKHdyYXBwZXIsICFleGlzdCwgZmlsdGVyLCBzdXApOwotCQkJCWRpYWdyYW1JbmZvID0gdmlld2VyLmdldERpYWdyYW1JbmZvKCk7Ci0JCQkJaWYgKGRpYWdyYW1JbmZvICE9IG51bGwgJiYgIWRpYWdyYW1JbmZvLmlzRW1wdHkoKSkgewotCQkJCQlpbWFnZSA9IHZpZXdlci5jcmVhdGVEaWFncmFtSW1hZ2UoKTsKLQkJCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJCS8vIHNhdmUgdGhlIGltYWdlCi0JCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShwdWJEaXIsIGltZ1BhdGgpOwotCi0JCQkJCQkvLyBtYWtlIHN1cmUgdGhlIGZpbGUgaXMgY3JlYXRlZCBvdGhlcndpc2UgZXhjZXB0aW9uCi0JCQkJCQlGaWxlIHBhcmVudCA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQkJaWYgKCFwYXJlbnQuZXhpc3RzKCkpIHsKLQkJCQkJCQlwYXJlbnQubWtkaXJzKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICghZi5leGlzdHMoKSkgewotCQkJCQkJCWYuY3JlYXRlTmV3RmlsZSgpOwotCQkJCQkJfQotCQkJCQkJT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0JCQkJCQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJCQkJCWxvYWRlci5kYXRhID0gbmV3IEltYWdlRGF0YVtdIHsgaW1hZ2UuZ2V0SW1hZ2VEYXRhKCkgfTsKLQkJCQkJCWxvYWRlci5zYXZlKG9zLCBTV1QuSU1BR0VfSlBFRyk7Ci0KLQkJCQkJCWRpYWdyYW1JbmZvLnNldEltYWdlRmlsZVBhdGgoaW1nUGF0aCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBjcmVhdGUgZGlhZ3JhbSBpbWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUxKSB7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0KLQkJCS8vIGRlbGV0ZSB0aGUgbmV3bHkgY3JlYXRlZCBkaWFncmFtIGZyb20gdGhlIGxpYnJhcnkKLQkJCWlmICghZXhpc3QpIHsKLQkJCQlkID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKAotCQkJCQkJKEFjdGl2aXR5KSBlLCB0eXBlLCBmYWxzZSk7Ci0JCQkJaWYgKGQgIT0gbnVsbCkgewotCQkJCQlFY29yZVV0aWwucmVtb3ZlKGQpOwotCQkJCX0KLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQotCQkJCS8vIHJlc3RvcmUgdGhlIGRpcnR5IGZsYWcKLQkJCQllLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKGRpcnR5RmxhZyk7Ci0KLQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJdmlld2VyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZTEpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0KLQlwcml2YXRlIFZhcmlhYmlsaXR5RWxlbWVudCBjaGVja1ZhcmlhYmlsaXR5KFZhcmlhYmlsaXR5RWxlbWVudCBlLCBJRmlsdGVyIGZpbHRlciwKLQkJCWludCB0eXBlKSB7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSB7Ci0JCQljb25maWcgPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQl9Ci0JCWlmIChjb25maWcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIEdldCBpbW1lZGlhdGUgY29udHJpYnV0b3JzIGZpcnN0LCBhbmQgY2hlY2sgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycwotCQkvLyBoYXZlIGFueXRoaW5nIGV4dHJhIGJyZWFrZG93biBlbGVtZW50cy4KLQkJTGlzdCBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb250cmlidXRvcnMoZSwgY29uZmlnKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKCEoKEFjdGl2aXR5KSBuZXh0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvLyBHZXQgYWxsIENvbnRyaWJ1dG9ycyBmcm9tIHBhcmVudCBjaGFpbiBhbmQgY29udHJpYnV0b3IgY2hhaW4gZm9yIHRoZQotCQkvLyBlbGVtZW50IGUuCi0JCVZhcmlhYmlsaXR5SW5mbyBlSW5mbyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLmdldFZhcmlhYmlsaXR5SW5mbygoVmFyaWFiaWxpdHlFbGVtZW50KSBlKTsKLQkJTGlzdCBjb250cmlidXRvcnMgPSBlSW5mby5nZXRDb250cmlidXRvcnMoKTsKLQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKHZlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlBY3Rpdml0eSByZXBsYWNlciA9IChBY3Rpdml0eSkgQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcih2ZSwKLQkJCQljb25maWcpOwotCQlpZiAocmVwbGFjZXIgIT0gbnVsbCkgewotCQkJdmUgPSByZXBsYWNlcjsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSByZXBsYWNlckRpYWdyYW0gPSBHcmFwaGljYWxEYXRhTWFuYWdlcgotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKHJlcGxhY2VyLCB0eXBlLCBmYWxzZSk7Ci0JCQlpZiAocmVwbGFjZXJEaWFncmFtICE9IG51bGwpIHsKLQkJCQkvL2FueVJlcGxhY2VyLmFkZChyZXBsYWNlcik7Ci0JCQkJcmV0dXJuIHJlcGxhY2VyOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBiYXNlRGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyCi0JCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRVTUFEaWFncmFtKChBY3Rpdml0eSkgdmUsIHR5cGUsIGZhbHNlKTsKLQkJCWlmIChiYXNlRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCi0JCQkJLy8gQ2hlY2sgZmlyc3QgaWYgYmFzZURpYWdyYW0gaXMgc3VwcHJlc3NlZC4KLQkJCQlpZiAoYmFzZURpYWdyYW0uZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpID09IHRydWUpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCQotCQkJCS8vIEZpbmQgdGhlIGNvbnRyaWJ1dG9ycyBvZiBCYXNlCi0JCQkJVmFyaWFiaWxpdHlJbmZvIHZlSW5mbyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlJbmZvKChWYXJpYWJpbGl0eUVsZW1lbnQpIHZlKTsKLQkJCQlMaXN0IHZlQ29udHJpYnV0b3JzID0gdmVJbmZvLmdldENvbnRyaWJ1dG9ycygpOwotCQkJCWlmIChjb250cmlidXRvcnMuc2l6ZSgpICE9IHZlQ29udHJpYnV0b3JzLnNpemUoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udHJpYnV0b3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKCF2ZUNvbnRyaWJ1dG9ycy5jb250YWlucyhuZXh0KSkgewotCQkJCQkJCWlmICghKChBY3Rpdml0eSkgbmV4dCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkJCQkJLmlzRW1wdHkoKSkgewotCQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIHZlOwotCQkJCQotCQkJfWVsc2V7Ci0JCQkJLy8gSWYgbm8gYmFzZSBkaWFncmFtLCBjaGVjayBiYXNlIG9mIGJhc2UgaGFkIGFueSBkaWFncmFtLgotCQkJCXJldHVybiBjaGVja1ZhcmlhYmlsaXR5KHZlLCBmaWx0ZXIsIHR5cGUpOwotCQkJfQotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgd2luZG93J3MgcHJlZmVyZW5jZSBhdHRyaWJ1dGUgZm9yIEFjdGl2aXR5IERldGFpbCBEaWFncmFtLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hlZFVuQ3JlYXRlZEFERChib29sZWFuIGZsYWcpIHsKLQkJdGhpcy5wdWJsaXNoVW5jcmVhdGVkQUREID0gZmxhZzsKLQl9Ci0JLyoqCi0JICogU2V0IHRoZSB3aW5kb3cncyBwcmVmZXJlbmNlIGF0dHJpYnV0ZSBmb3IgQWNpdGl2eXQgRGlhZ3JhbQotCSAqIAotCSAqLwotCQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKGJvb2xlYW4gZmxhZyl7Ci0JCXRoaXMucHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24gPSBmbGFnOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BY3Rpdml0eURpYWdyYW1WaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZmExNWU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5BY3Rpdml0eURpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGdyYXBoaWNhbCB2aWV3ZXIgZm9yIHRoZSBBY3Rpdml0eSBkaWFncmFtLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtVmlld2VyIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHsKLQotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3QgZSwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQlBY3Rpdml0eURpYWdyYW0gZGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQWN0aXZpdHlEaWFncmFtKCk7Ci0JCWRpYWdyYW0uc2V0RmlsdGVyKGZpbHRlcik7Ci0JCWlmIChzdXAgIT0gbnVsbCkgewotCQkJZGlhZ3JhbS5zZXRTdXBwcmVzc2lvbihzdXApOwotCQl9Ci0KLQkJZGlhZ3JhbS5zZXRPYmplY3QoZSk7Ci0JCUVkaXRQYXJ0IHBhcnQgPSBuZXcgQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQoZGlhZ3JhbSk7Ci0JCXBhcnQuc2V0TW9kZWwoZGlhZ3JhbSk7Ci0JCXJldHVybiBwYXJ0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9OZXdBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL05ld0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YTdlOWYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL05ld0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5EZWxlZ2F0aW5nTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXllcmVkUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuU2VsZWN0YWJsZUxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlVNTEVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbWFnZS5JbWFnZUZpbGVGb3JtYXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVuZGVyLnV0aWwuQ29weVRvSW1hZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuRWRpdFBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOZXdBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgZXh0ZW5kcwotCQlBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgewotCi0JcHJvdGVjdGVkIEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSBudWxsOwotCXByb3RlY3RlZCBEaWFncmFtIGRpYWdyYW07Ci0KLQlwdWJsaWMgTmV3QWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIE9iamVjdCB3cmFwcGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgd3JhcHBlcik7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZGlhZ3JhbSBmb3IgZ2l2ZW4gb2JqZWN0IChvbmx5IGZvciB7QGxpbmsgQWN0aXZpdHl9IGFuZCBwYWNrcyB0aGUgYm91bmRzLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyIAl7QGxpbmsgT2JqZWN0fSAJCi0JICogQHBhcmFtIG5lZWRSZXNldCBib29sZWFuCi0JICogQHBhcmFtIGZpbHRlciAJe0BsaW5rIElGaWx0ZXJ9Ci0JICogQHBhcmFtIHN1cAkJe0BsaW5rIFN1cHByZXNzaW9ufQotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBsb2FkRGlhZ3JhbShPYmplY3Qgd3JhcHBlciwgYm9vbGVhbiBuZWVkUmVzZXQsCi0JCQlJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCS8vIGluaXRpYWxpemUgdGhlIHZpZXdlciB3aXRoIHRoZSBlZGl0IHBhcnQKLQkJRWRpdFBhcnQgZWRpdFBhcnQgPSBjcmVhdGVFZGl0UGFydCh3cmFwcGVyLCBmaWx0ZXIsIHN1cCk7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQotCQkvLyBhc2sgZm9yIGltbWVkaWF0ZSB1cGRhdGUgb2YgdGhlIGNvbnRyb2wgc28gdGhhdCB0aGUgZGlhZ3JhbSBmaWd1cmUKLQkJLy8gd2lsbCBiZSBjb21wdXRlZAotCQlwYXJlbnQucGFjayh0cnVlKTsKLQotCQkvLyBUaGlzIGNoZWNrIGlzIG5lZWRlZCBmb3IgYnJvd3NpbmcsIGluIG9yZGVyIHRvIHJlbmRlciBhY3Rpdml0eSBjb250cmlidXRpbmcncwotCQkvLyBjaGlsZHJlbi4gIEluIHByb2Nlc3NBdXRob3Jpbmcgd2UgZG9uJ3QgZG8gcmVhbGl6YXRpb24sIGluIG9yZGVyIHRvIGRpc3BsYXllZCAKLQkJLy8gcmVhbGl6ZWQgZWxlbWVudHMsIHdlIGhhdmUgdG8gY2xlYW51cCBBREQgZGlhZ3JhbSBhbmQgcmVjcmVhdGUuIG5lZWR0b1Jlc2V0IG9yIGNsZWFudXBkaWFncmFtLgotCQkvLyBPbmx5IGZvciBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbS4KLQkJT2JqZWN0IG8gPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYobyBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCAmJiBnZXREaWFncmFtVHlwZSgpICE9IG51bGwgJiYgCi0JCQkJZ2V0RGlhZ3JhbVR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwpKXsKLQkJCWlmKFRuZ1V0aWwuaGFzQ29udHJpYnV0b3IoKFZhcmlhYmlsaXR5RWxlbWVudClvKSl7Ci0JCQkJbmVlZFJlc2V0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG5lZWRSZXNldCkgewotCQkJY2xlYW5VcERpYWdyYW0oKTsKLQkJfQotCi0JCXJldHVybiBlZGl0UGFydDsKLQl9Ci0KLQkKLQkvKioKLQkgKiByZXR1cm5zIHtAbGluayBEaWFncmFtSW5mb30KLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUluZm8gZ2V0RGlhZ3JhbUluZm8oKSB7Ci0JCURpYWdyYW1JbmZvIGRpYWdyYW1JbmZvID0gbnVsbDsKLQotCQlPYmplY3QgZWxlbWVudCA9IHBhcnQuZ2V0TW9kZWwoKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMaW5rZWRPYmplY3QpIHsKLQkJCWVsZW1lbnQgPSAoKExpbmtlZE9iamVjdCkgZWxlbWVudCkuZ2V0T2JqZWN0KCk7Ci0JCX0KLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFZpZXcpewotCQkJIGVsZW1lbnQgPSAoKFZpZXcpZWxlbWVudCkuZ2V0RWxlbWVudCgpOwotCQkJaWYoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KXsKLQkJCQllbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpZWxlbWVudCk7Ci0JCQl9Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTm9kZSl7Ci0JCQkJZWxlbWVudCA9ICgoTm9kZSllbGVtZW50KS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCWRpYWdyYW1JbmZvID0gbmV3IERpYWdyYW1JbmZvKGdldERpYWdyYW1UeXBlKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCWxvYWREaWFncmFtSW5mbyhwYXJ0LCBkaWFncmFtSW5mbyk7Ci0JCX0KLQotCQlyZXR1cm4gZGlhZ3JhbUluZm87Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZURpYWdyYW1JbWFnZShJbWFnZUZpbGVGb3JtYXQgaW1hZ2VGaWxlRm9ybWF0KXsKLQkJQ29weVRvSW1hZ2VVdGlsIGltID0gbmV3IENvcHlUb0ltYWdlVXRpbCgpOwotCQkvL2ltLmNvcHlUb0ltYWdlKHBhcnQsIGRlc3RpbmF0aW9uLCBmb3JtYXQsIG1vbml0b3IpCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIEVkaXRQYXJ0U2VydmljZS5nZXRJbnN0YW5jZSgpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRyb2woKS5zZXRCYWNrZ3JvdW5kKAotCQkJCUNvbG9yQ29uc3RhbnRzLmxpc3RCYWNrZ3JvdW5kKTsKLQkJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcikgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJRGlhZ3JhbVJvb3RFZGl0UGFydCByb290ID0gKERpYWdyYW1Sb290RWRpdFBhcnQpIEVkaXRQYXJ0U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVJvb3RFZGl0UGFydChnZXREaWFncmFtKCkpOwotCQlMYXllcmVkUGFuZSBwcmludGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgZXh0TGFiZWxzTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlleHRMYWJlbHNMYXllci5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBEZWxlZ2F0aW5nTGF5b3V0KCkpOwotCQlwcmludGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihleHRMYWJlbHNMYXllciwKLQkJCQlVTUxFZGl0UGFydEZhY3RvcnkuRVhURVJOQUxfTk9ERV9MQUJFTFNfTEFZRVIsCi0JCQkJTGF5ZXJDb25zdGFudHMuUFJJTUFSWV9MQVlFUik7Ci0JCUxheWVyZWRQYW5lIHNjYWxhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgc2NhbGVkRmVlZGJhY2tMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCXNjYWxlZEZlZWRiYWNrTGF5ZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNjYWxhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoc2NhbGVkRmVlZGJhY2tMYXllciwKLQkJCQlMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIsCi0JCQkJRGlhZ3JhbVJvb3RFZGl0UGFydC5ERUNPUkFUSU9OX1VOUFJJTlRBQkxFX0xBWUVSKTsKLQkJdmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLQkJdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSk7Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW0gZ2V0RGlhZ3JhbSgpewotCQl0cnl7Ci0JCQlpZihkaWFncmFtID09IG51bGwpewotCQkJCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG87Ci0JCQkJCURpYWdyYW1NYW5hZ2VyIGRtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShUbmdVdGlsCi0JCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoYWN0KSk7Ci0JCQkJCUxpc3QgbGlzdCA9IGRtZ3IuZ2V0RGlhZ3JhbXMoYWN0LCBBY3Rpdml0eURpYWdyYW1TZXJ2aWNlCi0JCQkJCQkJLmdldEludFR5cGUoZ2V0RGlhZ3JhbVR5cGUoKSkpOwotCQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQlkaWFncmFtID0gKERpYWdyYW0pIGxpc3QuZ2V0KDApOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJEaWFncmFtIGlzIGVtcHR5IGZvciAiICsgYWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBkaWFncmFtOwotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIgPSBuZXcgRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpOwotCQl0aGlzLmdyYXBoaWNhbFZpZXdlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCWNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGlhZ3JhbUluZm8oR3JhcGhpY2FsRWRpdFBhcnQgcGFydCwgRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8pIHsKLQkJTGlzdCBjaGlsZHJlbiA9IHBhcnQuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJCi0JCQlpZiAobyBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgbzsKLQkJCQlPYmplY3QgbW9kZWwgPSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJT2JqZWN0IGUgPSBtb2RlbDsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIExpbmtlZE9iamVjdCkgewotCQkJCQllID0gKChMaW5rZWRPYmplY3QpIGUpLmdldE9iamVjdCgpOwotCQkJCX0KLQkJCQlpZihlIGluc3RhbmNlb2YgVmlldyl7Ci0JCQkJCWUgPSAoKFZpZXcpZSkuZ2V0RWxlbWVudCgpOwotCQkJCQlpZihlIGluc3RhbmNlb2YgTm9kZSl7Ci0JCQkJCQlpZihlIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcil7Ci0JCQkJCQkJbG9hZERpYWdyYW1JbmZvKChHcmFwaGljYWxFZGl0UGFydClvLCBkaWFncmFtSW5mbyk7Ci0JCQkJCQl9Ci0JCQkJCQllID0gKChOb2RlKWUpLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCQlpZihlICE9IG51bGwgJiYgZSBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQpewotCQkJCQkJZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KWUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGUgaW5zdGFuY2VvZiBEaWFncmFtRWxlbWVudCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJYm9vbGVhbiBzdXBwcmVzc2VkOwotCQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCQkJCXN1cHByZXNzZWQgPSAoKE5hbWVkTm9kZSkgbW9kZWwpLmlzU3VwcHJlc3NlZCgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3VwcHJlc3NlZCA9ICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkJCS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJfQotCi0JCQkJCQlJRmlndXJlIGYgPSBwYXJ0LmdldEZpZ3VyZSgpOwotCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGYuZ2V0Qm91bmRzKCk7Ci0KLQkJCQkJCVN0cmluZyBhbHRUYWcgPSBudWxsOwotCQkJCQkJaWYgKGYgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCQkJCQlhbHRUYWcgPSAoKFdyYXBMYWJlbCkgZikuZ2V0VGV4dCgpOwotCQkJCQkJfQotCQkJCQkJZGlhZ3JhbUluZm8uYWRkQXJlYSgoTWV0aG9kRWxlbWVudCkgZSwgYm91bmRzLngsCi0JCQkJCQkJYm91bmRzLnksIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCwgYWx0VGFnLCBzdXBwcmVzc2VkKTsKLQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9OZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL05ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOWMzODRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL05ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1FZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5FZGl0UGFydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIgZXh0ZW5kcwotCQlOZXdBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICovCi0JcHVibGljIE5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBPYmplY3Qgd3JhcHBlcikgewotCQlzdXBlcihwYXJlbnQsIHdyYXBwZXIpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2NyZWF0ZUVkaXRQYXJ0KGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3QgZSwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJRGlhZ3JhbSBtb2RlbCA9KERpYWdyYW0pZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQltb2RlbC5zZXRTdXBwcmVzc2lvbihzdXApOwotCQkJRGlhZ3JhbUVkaXREb21haW4gZG9tYWluID0gbmV3IERpYWdyYW1FZGl0RG9tYWluKG51bGwpOwotCQkJKChJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcilncmFwaGljYWxWaWV3ZXIpLnNldEVkaXREb21haW4oZG9tYWluKTsKLQkJCXBhcnQgPSBFZGl0UGFydFNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jcmVhdGVHcmFwaGljRWRpdFBhcnQoZGlhZ3JhbSk7Ci0JCQlyZXR1cm4gcGFydDsKLQkJfQotCQlpZihwYXJ0ID09IG51bGwpewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJFZGl0cGFydCBmb3IgIisgZSArIiBpcyBub3QgY3JlYXRlZCIpOwotCQl9Ci0JCXJldHVybiBwYXJ0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjZ2V0RGlhZ3JhbVR5cGUoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvTmV3QWN0aXZpdHlEaWFncmFtU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvTmV3QWN0aXZpdHlEaWFncmFtU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOGU2NGEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL05ld0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wZXJzaXN0ZW5jZS5JRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlZhcmlhYmlsaXR5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLklBY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuaW1hZ2UuSW1hZ2VGaWxlRm9ybWF0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVuZGVyLmNsaXBib2FyZC5EaWFncmFtR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVuZGVyLnV0aWwuQ29weVRvSW1hZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBQcm92aWRlcyBzZXJ2aWNlIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGRpYWdyYW0gaW1hZ2VzIGZvciBhY3Rpdml0eSBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGltcGxlbWVudHMgSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50ID0gbnVsbDsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGhvbGRlciA9IG51bGw7Ci0KLQlwcml2YXRlIEZpbGUgcHViRGlyOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgSW50ZWdlcj4gdHlwZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLQotCXByaXZhdGUgRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8gPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hVbmNyZWF0ZWRBREQgPSB0cnVlOwotCQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IHRydWU7Ci0KLQlzdGF0aWMgewotCQl0eXBlTWFwLnB1dChSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1csIG5ldyBJbnRlZ2VyKAotCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKSk7Ci0JCXR5cGVNYXAucHV0KFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwsIG5ldyBJbnRlZ2VyKAotCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSkpOwotCQl0eXBlTWFwLnB1dChSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWSwgbmV3IEludGVnZXIoCi0JCQkJSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRJbnRUeXBlKFN0cmluZyBkaWFncmFtVHlwZSkgewotCQlJbnRlZ2VyIHR5cGUgPSAoSW50ZWdlcikgdHlwZU1hcC5nZXQoZGlhZ3JhbVR5cGUpOwotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHlwZS5pbnRWYWx1ZSgpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmdUeXBlKGludCB0eXBlKSB7Ci0JCXN3aXRjaCh0eXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCVNoZWxsIHNoZWxsID0gbnVsbDsKLQotCXB1YmxpYyBOZXdBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKCkgewotCQl0aGlzKG51bGwsIG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpKTsKLQl9Ci0KLQlwdWJsaWMgTmV3QWN0aXZpdHlEaWFncmFtU2VydmljZShGaWxlIHB1YkRpcikgewotCQl0aGlzKG51bGwsIHB1YkRpcik7Ci0JfQotCi0JcHVibGljIE5ld0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoQ29tcG9zaXRlIHBhcmVudCwgRmlsZSBwdWJEaXIpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMucHViRGlyID0gcHViRGlyOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIGdldERpYWdyYW1WaWV3ZXIoaW50IGRpYWdyYW1UeXBlLCBPYmplY3Qgd3JhcHBlcikgewotCQkvLyBpZiB0aGUgc2hlbGwgd2luZG93IGlzIGRpc3Ryb3llZCwgcmVjcmVhdGUgaXQKLQkJaWYgKCh0aGlzLnNoZWxsICE9IG51bGwpICYmIHRoaXMuc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnBhcmVudCA9IG51bGw7Ci0JCQl0aGlzLnNoZWxsID0gbnVsbDsKLQkJfQotCi0JCWdldFZpZXdlckhvbGRlcihwYXJlbnQpOwotCi0JCXN3aXRjaCAoZGlhZ3JhbVR5cGUpIHsKLQkJY2FzZSBJRGlhZ3JhbVNlcnZpY2UuQUNUSVZJVFlfRElBR1JBTToKLQkJCXJldHVybiBuZXcgTmV3QWN0aXZpdHlEaWFncmFtVmlld2VyKGhvbGRlciwgd3JhcHBlcik7Ci0KLQkJY2FzZSBJRGlhZ3JhbVNlcnZpY2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlyZXR1cm4gbmV3IE5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlcihob2xkZXIsd3JhcHBlcik7Ci0KLQkJY2FzZSBJRGlhZ3JhbVNlcnZpY2UuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCXJldHVybiBuZXcgTmV3V1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlcihob2xkZXIsd3JhcHBlcik7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFZpZXdlckhvbGRlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJaWYgKHNoZWxsID09IG51bGwgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJc2hlbGwgPSBjcmVhdGVTaGVsbCgpOwotCQkJfQotCQkJc2hlbGwub3BlbigpOwotCQkJcGFyZW50ID0gc2hlbGw7Ci0JCX0KLQotCQlpZiAoaG9sZGVyICE9IG51bGwpIHsKLQkJCWhvbGRlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQlob2xkZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlob2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoMSwgMSkpOyAvLyBzaXplIGNhbid0IGJlIDAsMAotCQkvLyBvdGhlcndpc2UgdGhlIGRpYWdyYW0KLQkJLy8gd2lsbCBub3QgYmUgcGFpbnRlZAotCQlob2xkZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlob2xkZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBTaGVsbCBjcmVhdGVTaGVsbCgpIHsKLQkJU2hlbGwgc2hlbGwgPSBudWxsOwotCQlEaXNwbGF5IGQgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoZCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCQlzaGVsbC5zZXRCb3VuZHMoMCwgMCwgMCwgMCk7Ci0JCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKChzaGVsbCAhPSBudWxsKSAmJiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkpIHsKLQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzYXZlIHRoZSBlbGVtZW50IGRpYWdyYW0gaW1hZ2UgYW5kIHJldHVybnMgdGhlIGltYWdlIGZpbGUgdXJsLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHBhcmFtIGltZ1BhdGgKLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogICAgICAgICAgICBJRmlsdGVyCi0JICogQHBhcmFtIHN1cAotCSAqICAgICAgICAgICAgU3VwcHJlc3Npb24KLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgaW1hZ2UgcGF0aCByZWxhdGl2ZSB0byB0aGUgcHVibGlzaGluZyBkaXIKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLklBY3Rpdml0eURpYWdyYW1TZXJ2aWNlI3NhdmVEaWFncmFtKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBEaWFncmFtSW5mbyBzYXZlRGlhZ3JhbShmaW5hbCBPYmplY3Qgd3JhcHBlciwgZmluYWwgU3RyaW5nIGltZ1BhdGgsIAotCQkJZmluYWwgU3RyaW5nIGRpYWdyYW1UeXBlLCBmaW5hbCBJRmlsdGVyIGZpbHRlciwKLQkJCWZpbmFsIFN1cHByZXNzaW9uIHN1cCkgewotCQkvLyBpbml0aWFsaXplIHRoZSBkaWFncmFtSW5mbwotCQlkaWFncmFtSW5mbyA9IG51bGw7Ci0KLQkJLy8gZ3JhYiB0aGUgVUkgdGhyZWFkIHRvIGF2b2lkIHRocmVhZCBhY2Nlc3MgZXJyb3IKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCV9faW50ZXJuYWxfc2F2ZURpYWdyYW0od3JhcHBlciwgaW1nUGF0aCwgZGlhZ3JhbVR5cGUsIGZpbHRlciwgc3VwKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGRpYWdyYW1JbmZvOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNVc2VyRGVmaW5lZERpYWdyYW0oQWN0aXZpdHkgZSwgU3RyaW5nIGltZ1BhdGgsIFN0cmluZyBkaWFncmFtVHlwZSkgdGhyb3dzIEV4Y2VwdGlvbgotCXsJCQotCQkvLyBpZiB0aGVyZSBpcyBhIHVzZXIgZGVmaW5lZCBkaWFncmFtLCB1c2UgaXQKLQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbyBpbmZvID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8oKEFjdGl2aXR5KWUpOwotCQlzd2l0Y2ggKGdldEludFR5cGUoZGlhZ3JhbVR5cGUpKQotCQl7Ci0JCQljYXNlIElEaWFncmFtU2VydmljZS5BQ1RJVklUWV9ESUFHUkFNOgotCQkJCWlmICggaW5mby5jYW5QdWJsaXNoQURJbWFnZSgpICkKLQkJCQl7Ci0JCQkJCXJldHVybiAoaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSAhPSBudWxsKSAmJiBpbmZvLmNhblB1Ymxpc2hBREltYWdlKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQotCQkJY2FzZSBJRGlhZ3JhbVNlcnZpY2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQkJaWYgKCBpbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpICkKLQkJCQl7Ci0JCQkJCXJldHVybiAoaW5mby5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSAhPSBudWxsKSAmJiBpbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCQkJCQkKLQkJCWNhc2UgSURpYWdyYW1TZXJ2aWNlLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQkJaWYgKCBpbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpICkKLQkJCQl7Ci0JCQkJCXJldHVybiAoaW5mby5nZXRXUEREaWFncmFtKCkgIT0gbnVsbCApICYmIGluZm8uY2FuUHVibGlzaFdQREltYWdlKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBfX2ludGVybmFsX3NhdmVEaWFncmFtKE9iamVjdCB3cmFwcGVyLCBmaW5hbCBTdHJpbmcgaW1nUGF0aCwgU3RyaW5nIGRpYWdyYW1UeXBlLAotCQkJSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQkKLQkJaWYgKCBzdXAuaXNTdXBwcmVzc2VkKHdyYXBwZXIpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZiAoIShvIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvL01ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KW87Ci0JCUFjdGl2aXR5IGUgPSAoQWN0aXZpdHkpbzsKLQkJLy8gRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8gPSBudWxsOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCWludCB0eXBlID0gZ2V0SW50VHlwZShkaWFncmFtVHlwZSk7Ci0JCWlmICh0eXBlIDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IG51bGw7Ci0KLQkJLy8ga2VlcCB0aGUgZGlydHkgZmxhZyBhbmQgcmVzZXQgYmFjayB0byBhdm9pZCBtYWtlIHRoZSBsaWJyYXJ5IGRpcnR5Ci0JCWJvb2xlYW4gZGlydHlGbGFnID0gZS5lUmVzb3VyY2UoKS5pc01vZGlmaWVkKCk7Ci0JCQotCQl0cnkgewotCQkJaWYgKCBoYXNVc2VyRGVmaW5lZERpYWdyYW0oKEFjdGl2aXR5KWUsIGltZ1BhdGgsIGRpYWdyYW1UeXBlKSApCi0JCQl7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0KLQkJCS8vIENoZWNrIGRpYWdyYW0gZXhpc3RzLCBkb24ndCBnZW5lcmF0ZSBmb3Igc3VwcHJlc3NlZC4KLQkJCURpYWdyYW0gZCA9IGdldERpYWdyYW0oZSwgdHlwZSk7Ci0JCQkKLQkJCS8vQ2hlY2sgcHVibGlzaGluZyBvcHRpb25zLgotCQkJYm9vbGVhbiBleGlzdCA9IChkICE9IG51bGwpOwotCQkJaWYgKGV4aXN0KSB7Ci0JCQkJLy9UT0RPOiBDaGVjayBmb3Igc3VwcHJlc3Npb24uCi0vLwkJCQlpZiAoZC5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkKLS8vCQkJCQlyZXR1cm47Ci0JCQkJCi0JCQkJLy8gSWYgYW4gZXh0ZW5zaW9uIGhhcyBpdHMgb3duIGRpYWdyYW0uIEJhc2UgaXMgcmVwbGFjZWQgb3IgY29udHJpYnV0ZWQuIAotCQkJCS8vIGV4dGVuc2lvbiBkaWFncmFtIHNob3dzIHJlYWxpemVkIGVsZW1lbnQgaW4gdW5kZWZpbmVkIGxvY2F0aW9uLiAKLQkJCQkvLyBJbiBwdWJsaXNoaW5nIGRvbid0IGRpc3BsYXkgZXh0ZW5zaW9uIGRpYWdyYW0gZXZlbiBpZiBpdCBoYXMgaXRzIG93bgotCQkJCS8vIGRpYWdyYW0gaWYgcmVhbGl6ZWQgZWxlbWVudHMgYXJlIGNvbWluZyBpbiB0aHJvdWdoIHZhcmlhYmlsaXR5LgotCQkJCWlmKHR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0gJiYKLQkJCQkJCWNoZWNrVmFyaWFiaWxpdHkoZSwgZmlsdGVyLHR5cGUpICE9IG51bGwpewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQkKLQkJCX1lbHNlewotCQkJCQotCQkJCWlmKCh0eXBlID09IElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKSkKLQkJCQkJcmV0dXJuOwotCi0JCQkJLy8gRm9yIEFjdGl2aXR5IERpYWdyYW0gdW4gb3BlbmVkIGV4dGVuc2lvbiBwdWJsaXNoLgotCQkJCWlmKHR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pewotCQkJCQkvLyBJZiBvcHRpb24gaXMgbm90IGNoZWNrZWQsIGRvbid0IGdlbmVyYXRlIGEgZGlhZ3JhbQotCQkJCQlpZighcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24pIHJldHVybjsKLQkJCQkJCi0JCQkJCS8vSWYgZXh0ZW5zaW9uIGlzIG1vZGlmaWVkIGRvbid0IGdlbmVyYXRlIGl0LgotCQkJCQlpZighZS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGNhbGN1bGF0ZWRCYXNlID0gY2hlY2tWYXJpYWJpbGl0eShlLCBmaWx0ZXIsIHR5cGUpOwotCQkJCQlpZihjYWxjdWxhdGVkQmFzZSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0JCi0JCQkJCQotCQkJCQl3cmFwcGVyID0gY2FsY3VsYXRlZEJhc2U7Ci0JCQkJCWUgPSAoQWN0aXZpdHkpY2FsY3VsYXRlZEJhc2U7Ci0JCQkJCWV4aXN0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKHB1Ymxpc2hVbmNyZWF0ZWRBREQgPT0gZmFsc2UgJiYgdHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pewotCQkJCQlib29sZWFuIGNvbnRyaWJ1dG9yZXhpc3QgPSBmYWxzZTsKLQkJCQkJLy8gVGhpcyBpcyBuZWVkLCBpZiBjb250cmlidXRvciBoYXMgYSBBREQgZGlhZ3JhLCBiYXNlIGRvbid0IAotCQkJCQkvLyBiYXNlIHNob3VsZCBnZW5lcmF0ZSBBREQgaW4gYnJvd3NpbmcuCi0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJCQkJY29uZmlnID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJfQotCQkJCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQkJCQlyZXR1cm47Ci0KLQkJCQkJLy8gR2V0IGltbWVkaWF0ZSBjb250cmlidXRvcnMgZmlyc3QsIGFuZCBjaGVjayBpbW1lZGlhdGUgY29udHJpYnV0b3JzCi0JCQkJCS8vIGhhdmUgYW55dGhpbmcgZXh0cmEgYnJlYWtkb3duIGVsZW1lbnRzLgotCQkJCQlMaXN0IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvbnRyaWJ1dG9ycyhlLCBjb25maWcpOwotCQkJCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCQlpZihpdGVyYXRvciAhPSBudWxsKXsKLQkJCQkJCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpewotCQkJCQkJCQlPYmplY3QgYWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZihhY3QgIT0gbnVsbCl7Ci0JCQkJCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZHggPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkuZ2V0VU1BRGlhZ3JhbSgoQWN0aXZpdHkpIGFjdCwgdHlwZSwgZmFsc2UpOwotCQkJCQkJCQkJaWYoZHggIT0gbnVsbCl7ICAgCi0JCQkJCQkJCQkJY29udHJpYnV0b3JleGlzdCA9IHRydWU7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYoIWNvbnRyaWJ1dG9yZXhpc3QpCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJdmlld2VyID0gZ2V0RGlhZ3JhbVZpZXdlcih0eXBlLCB3cmFwcGVyKTsKLQkJCQl2aWV3ZXIubG9hZERpYWdyYW0od3JhcHBlciwgIWV4aXN0LCBmaWx0ZXIsIHN1cCk7Ci0JCQkJZGlhZ3JhbUluZm8gPSB2aWV3ZXIuZ2V0RGlhZ3JhbUluZm8oKTsKLQkJCQlpZiAoZGlhZ3JhbUluZm8gIT0gbnVsbCAmJiAhZGlhZ3JhbUluZm8uaXNFbXB0eSgpKSB7Ci0JCQkJCWltYWdlID0gdmlld2VyLmNyZWF0ZURpYWdyYW1JbWFnZSgpOwotCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQkJLy8gc2F2ZSB0aGUgaW1hZ2UKLQkJCQkJCUZpbGUgZiA9IG5ldyBGaWxlKHB1YkRpciwgaW1nUGF0aCk7Ci0KLQkJCQkJCS8vIG1ha2Ugc3VyZSB0aGUgZmlsZSBpcyBjcmVhdGVkIG90aGVyd2lzZSBleGNlcHRpb24KLQkJCQkJCUZpbGUgcGFyZW50ID0gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQlpZiAoIXBhcmVudC5leGlzdHMoKSkgewotCQkJCQkJCXBhcmVudC5ta2RpcnMoKTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JCQkJCQkJZi5jcmVhdGVOZXdGaWxlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKLQkJCQkJCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQkJCQkJbG9hZGVyLmRhdGEgPSBuZXcgSW1hZ2VEYXRhW10geyBpbWFnZS5nZXRJbWFnZURhdGEoKSB9OwotCQkJCQkJbG9hZGVyLnNhdmUob3MsIFNXVC5JTUFHRV9KUEVHKTsKLQotCQkJCQkJZGlhZ3JhbUluZm8uc2V0SW1hZ2VGaWxlUGF0aChpbWdQYXRoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGNyZWF0ZSBkaWFncmFtIGltYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZTEpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQkJLy8gZGVsZXRlIHRoZSBuZXdseSBjcmVhdGVkIGRpYWdyYW0gZnJvbSB0aGUgbGlicmFyeQotCQkJaWYgKCFleGlzdCkgewotCQkJCWQgPSBnZXREaWFncmFtKGUsIHR5cGUpOwotCQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQkJRWNvcmVVdGlsLnJlbW92ZShkKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0KLQkJCQkvLyByZXN0b3JlIHRoZSBkaXJ0eSBmbGFnCi0JCQkJZS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZChkaXJ0eUZsYWcpOwotCi0JCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCXZpZXdlci5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUxKSB7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eUVsZW1lbnQgY2hlY2tWYXJpYWJpbGl0eShWYXJpYWJpbGl0eUVsZW1lbnQgZSwgSUZpbHRlciBmaWx0ZXIsCi0JCQlpbnQgdHlwZSkgewotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJY29uZmlnID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJfQotCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBHZXQgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycyBmaXJzdCwgYW5kIGNoZWNrIGltbWVkaWF0ZSBjb250cmlidXRvcnMKLQkJLy8gaGF2ZSBhbnl0aGluZyBleHRyYSBicmVha2Rvd24gZWxlbWVudHMuCi0JCUxpc3QgbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29udHJpYnV0b3JzKGUsIGNvbmZpZyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWlmICghKChBY3Rpdml0eSkgbmV4dCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gR2V0IGFsbCBDb250cmlidXRvcnMgZnJvbSBwYXJlbnQgY2hhaW4gYW5kIGNvbnRyaWJ1dG9yIGNoYWluIGZvciB0aGUKLQkJLy8gZWxlbWVudCBlLgotCQlWYXJpYWJpbGl0eUluZm8gZUluZm8gPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5nZXRWYXJpYWJpbGl0eUluZm8oKFZhcmlhYmlsaXR5RWxlbWVudCkgZSk7Ci0JCUxpc3QgY29udHJpYnV0b3JzID0gZUluZm8uZ2V0Q29udHJpYnV0b3JzKCk7Ci0KLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWlmICh2ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJQWN0aXZpdHkgcmVwbGFjZXIgPSAoQWN0aXZpdHkpIENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIodmUsCi0JCQkJY29uZmlnKTsKLQkJaWYgKHJlcGxhY2VyICE9IG51bGwpIHsKLQkJCXZlID0gcmVwbGFjZXI7Ci0JCQlEaWFncmFtIHJlcGxhY2VyRGlhZ3JhbSA9IGdldERpYWdyYW0ocmVwbGFjZXIsIHR5cGUpOwotCQkJaWYgKHJlcGxhY2VyRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlcGxhY2VyOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCURpYWdyYW0gYmFzZURpYWdyYW0gPSBnZXREaWFncmFtKChBY3Rpdml0eSkgdmUsIHR5cGUpOwotCQkJaWYgKGJhc2VEaWFncmFtICE9IG51bGwpIHsKLQkJCQkKLQkJCQkvLyBDaGVjayBmaXJzdCBpZiBiYXNlRGlhZ3JhbSBpcyBzdXBwcmVzc2VkLgotCQkJCS8vVE9ETzogU3VwcHJlc3Npb24gd29yay4KLS8vCQkJCWlmIChiYXNlRGlhZ3JhbS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkKLS8vCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkKLQkJCQkvLyBGaW5kIHRoZSBjb250cmlidXRvcnMgb2YgQmFzZQotCQkJCVZhcmlhYmlsaXR5SW5mbyB2ZUluZm8gPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCQkJLmdldFZhcmlhYmlsaXR5SW5mbygoVmFyaWFiaWxpdHlFbGVtZW50KSB2ZSk7Ci0JCQkJTGlzdCB2ZUNvbnRyaWJ1dG9ycyA9IHZlSW5mby5nZXRDb250cmlidXRvcnMoKTsKLQkJCQlpZiAoY29udHJpYnV0b3JzLnNpemUoKSAhPSB2ZUNvbnRyaWJ1dG9ycy5zaXplKCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRyaWJ1dG9ycy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmICghdmVDb250cmlidXRvcnMuY29udGFpbnMobmV4dCkpIHsKLQkJCQkJCQlpZiAoISgoQWN0aXZpdHkpIG5leHQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJCQkJCS5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiB2ZTsKLQkJCQkKLQkJCX1lbHNlewotCQkJCS8vIElmIG5vIGJhc2UgZGlhZ3JhbSwgY2hlY2sgYmFzZSBvZiBiYXNlIGhhZCBhbnkgZGlhZ3JhbS4KLQkJCQlyZXR1cm4gY2hlY2tWYXJpYWJpbGl0eSh2ZSwgZmlsdGVyLCB0eXBlKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHdpbmRvdydzIHByZWZlcmVuY2UgYXR0cmlidXRlIGZvciBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoZWRVbkNyZWF0ZWRBREQoYm9vbGVhbiBmbGFnKSB7Ci0JCXRoaXMucHVibGlzaFVuY3JlYXRlZEFERCA9IGZsYWc7Ci0JfQotCS8qKgotCSAqIFNldCB0aGUgd2luZG93J3MgcHJlZmVyZW5jZSBhdHRyaWJ1dGUgZm9yIEFjaXRpdnl0IERpYWdyYW0KLQkgKiAKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihib29sZWFuIGZsYWcpewotCQl0aGlzLnB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uID0gZmxhZzsKLQl9Ci0KLQlwdWJsaWMgRGlhZ3JhbUdlbmVyYXRvciBjcmVhdGVEaWFncmFtSW1hZ2UoRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FUCwgSW1hZ2VGaWxlRm9ybWF0IGZpbGVGb3JtYXQpCi0JdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlDb3B5VG9JbWFnZVV0aWwgdXRpbCA9IG5ldyBDb3B5VG9JbWFnZVV0aWwoKTsKLQkJRGlhZ3JhbUdlbmVyYXRvciBkR2VuID0gdXRpbC5jb3B5VG9JbWFnZShkaWFncmFtRVAsIG5ldyBQYXRoKHB1YkRpci5nZXRQYXRoKCkpLCBmaWxlRm9ybWF0LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJZEdlbi5jcmVhdGVBV1RJbWFnZUZvckRpYWdyYW0oKTsKLQkJcmV0dXJuIGRHZW47Ci0JfQotCQotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgZSwgaW50IHR5cGUpewotCQlEaWFncmFtTWFuYWdlciBkTWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGUpKTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gbnVsbDsKLQkJdHJ5ewotCQkJTGlzdCBsaXN0ID0gZE1nci5nZXREaWFncmFtcyhlLCB0eXBlKTsKLQkJCWlmKCFsaXN0LmlzRW1wdHkoKSl7Ci0JCQkJZGlhZ3JhbSA9IChEaWFncmFtKWxpc3QuZ2V0KDApOwotCQkJfQotCQl9Y2F0Y2goRXhjZXB0aW9uIGV4KXsKLQkJCS8vVE9ETyA6IExvZ2dlci4KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgaW4gZ2V0RGlhZ3JhbSgpIiArIGV4LmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJZmluYWxseXsKLQkJCWlmKGRNZ3IgIT0gbnVsbCl7Ci0JCQkJZE1nci5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL05ld0FjdGl2aXR5RGlhZ3JhbVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvTmV3QWN0aXZpdHlEaWFncmFtVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjMTJhOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvTmV3QWN0aXZpdHlEaWFncmFtVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkRlbGVnYXRpbmdMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxheWVyZWRQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQWN0aXZpdHlEaWFncmFtQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuVU1MRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5FZGl0UGFydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTmV3QWN0aXZpdHlEaWFncmFtVmlld2VyIGV4dGVuZHMgTmV3QWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHsKLQotCi0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIE5ld0FjdGl2aXR5RGlhZ3JhbVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBPYmplY3QgYWN0KSB7Ci0JCXN1cGVyKHBhcmVudCxhY3QpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjY3JlYXRlRWRpdFBhcnQoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb24pCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQl0cnl7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpZTsKLQkJCUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyKGFjdCk7Ci0JCQlhZGFwdGVyLnNldFZpZXcoZGlhZ3JhbSk7Ci0JCQlhZGFwdGVyLnNldFN1cHByZXNzaW9uKHN1cCk7Ci0JCQlhZGFwdGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJYWRhcHRlci5zZXRUYXJnZXQoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJYWRhcHRlci5zZXRFZGl0aW5nRG9tYWluKChJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKVRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGRpYWdyYW0uZ2V0RWxlbWVudCgpKSk7Ci0JCQlhZGFwdGVyLnBvcHVsYXRlRGlhZ3JhbSgpOwotCQkJRGlhZ3JhbUVkaXREb21haW4gZG9tYWluID0gbmV3IERpYWdyYW1FZGl0RG9tYWluKG51bGwpOwotCQkJKChJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcilncmFwaGljYWxWaWV3ZXIpLnNldEVkaXREb21haW4oZG9tYWluKTsKLQkJCXBhcnQgPSBFZGl0UGFydFNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jcmVhdGVHcmFwaGljRWRpdFBhcnQoZGlhZ3JhbSk7Ci0JCQlkaWFncmFtLmdldEVsZW1lbnQoKS5lQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCQlyZXR1cm4gcGFydDsKLQkJCQotCQkJfWNhdGNoKEV4Y2VwdGlvbiBleCl7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNnZXREaWFncmFtVHlwZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFncmFtVHlwZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGlhZ3JhbUluZm8oR3JhcGhpY2FsRWRpdFBhcnQgcGFydCwgRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8pIHsKLQkJTGlzdCBjaGlsZHJlbiA9IHBhcnQuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCXBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIG87Ci0JCQkJT2JqZWN0IG1vZGVsID0gcGFydC5nZXRNb2RlbCgpOwotCQkJCU9iamVjdCBlID0gbW9kZWw7Ci0JCQkJCi0JCQkJaWYoZSBpbnN0YW5jZW9mIFZpZXcpewotCQkJCQlFTW9kZWxFbGVtZW50IGV4ID0gKEVNb2RlbEVsZW1lbnQpKChWaWV3KWUpLmdldEVsZW1lbnQoKTsKLQkJCQkJaWYoZXggIT0gbnVsbCl7Ci0JCQkJCQllID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlib29sZWFuIHN1cHByZXNzZWQ7Ci0JCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCXN1cHByZXNzZWQgPSAoKE1ldGhvZEVsZW1lbnQpQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpKChOb2RlKW1vZGVsKS5nZXRFbGVtZW50KCkpKS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdXBwcmVzc2VkID0gKChNZXRob2RFbGVtZW50KSBlKS5nZXRTdXBwcmVzc2VkKCkKLQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQl9Ci0KLQkJCQkJCUlGaWd1cmUgZiA9IHBhcnQuZ2V0RmlndXJlKCk7Ci0JCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZi5nZXRCb3VuZHMoKTsKLQotCQkJCQkJU3RyaW5nIGFsdFRhZyA9IG51bGw7Ci0JCQkJCQlpZiAoZiBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJCQkJCWFsdFRhZyA9ICgoV3JhcExhYmVsKSBmKS5nZXRUZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlkaWFncmFtSW5mby5hZGRBcmVhKChNZXRob2RFbGVtZW50KSBlLCBib3VuZHMueCwKLQkJCQkJCQlib3VuZHMueSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCBhbHRUYWcsIHN1cHByZXNzZWQpOwotCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVkaXRQYXJ0IG5vdCBoYW5kbGVkOiAiICsgbyk7Ci0JCQkJLy8gLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIgPSBuZXcgRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpOwotCQl0aGlzLmdyYXBoaWNhbFZpZXdlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCWNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRyb2woKS5zZXRCYWNrZ3JvdW5kKAotCQkJCUNvbG9yQ29uc3RhbnRzLmxpc3RCYWNrZ3JvdW5kKTsKLQkJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcikgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJRGlhZ3JhbVJvb3RFZGl0UGFydCByb290ID0gKERpYWdyYW1Sb290RWRpdFBhcnQpIEVkaXRQYXJ0U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVJvb3RFZGl0UGFydChnZXREaWFncmFtKCkpOwotCQlMYXllcmVkUGFuZSBwcmludGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgZXh0TGFiZWxzTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlleHRMYWJlbHNMYXllci5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBEZWxlZ2F0aW5nTGF5b3V0KCkpOwotCQlwcmludGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihleHRMYWJlbHNMYXllciwKLQkJCQlVTUxFZGl0UGFydEZhY3RvcnkuRVhURVJOQUxfTk9ERV9MQUJFTFNfTEFZRVIsCi0JCQkJTGF5ZXJDb25zdGFudHMuUFJJTUFSWV9MQVlFUik7Ci0JCUxheWVyZWRQYW5lIHNjYWxhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgc2NhbGVkRmVlZGJhY2tMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCXNjYWxlZEZlZWRiYWNrTGF5ZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNjYWxhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoc2NhbGVkRmVlZGJhY2tMYXllciwKLQkJCQlMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIsCi0JCQkJRGlhZ3JhbVJvb3RFZGl0UGFydC5ERUNPUkFUSU9OX1VOUFJJTlRBQkxFX0xBWUVSKTsKLQkJdmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLQkJdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9OZXdXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9OZXdXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjMmM3YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvTmV3V1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRGVsZWdhdGluZ0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5ZXJlZFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtRWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LkVkaXRQYXJ0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIE5ld1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIgZXh0ZW5kcwotCQlOZXdBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICovCi0JcHVibGljIE5ld1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IHdyYXBwZXIpIHsKLQkJc3VwZXIocGFyZW50LCB3cmFwcGVyKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNjcmVhdGVFZGl0UGFydChqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUsIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJaWYoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCURpYWdyYW0gbW9kZWwgPShEaWFncmFtKWRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJbW9kZWwuc2V0U3VwcHJlc3Npb24oc3VwKTsKLS8vCQkJbW9kZWwuc2V0T2JqZWN0KGUpOwotCQkJRGlhZ3JhbUVkaXREb21haW4gZG9tYWluID0gbmV3IERpYWdyYW1FZGl0RG9tYWluKG51bGwpOwotCQkJKChJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcilncmFwaGljYWxWaWV3ZXIpLnNldEVkaXREb21haW4oZG9tYWluKTsKLQkJCXBhcnQgPSBFZGl0UGFydFNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jcmVhdGVHcmFwaGljRWRpdFBhcnQoZGlhZ3JhbSk7Ci0JCQlyZXR1cm4gcGFydDsKLQkJfQotCQlpZihwYXJ0ID09IG51bGwpewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJFZGl0cGFydCBmb3IgIisgZSArIiBpcyBub3QgY3JlYXRlZCIpOwotCQl9Ci0JCXJldHVybiBwYXJ0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjZ2V0RGlhZ3JhbVR5cGUoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlEaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChEaWFncmFtR3JhcGhpY2FsVmlld2VyKSBnZXRHcmFwaGljYWxWaWV3ZXIoKTsKLQkJRGlhZ3JhbVJvb3RFZGl0UGFydCByb290ID0gKERpYWdyYW1Sb290RWRpdFBhcnQpIEVkaXRQYXJ0U2VydmljZQotCQkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVSb290RWRpdFBhcnQoZ2V0RGlhZ3JhbSgpKTsKLQkJTGF5ZXJlZFBhbmUgcHJpbnRhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU5UQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIGV4dExhYmVsc0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJZXh0TGFiZWxzTGF5ZXIuc2V0TGF5b3V0TWFuYWdlcihuZXcgRGVsZWdhdGluZ0xheW91dCgpKTsKLQkJcHJpbnRhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoZXh0TGFiZWxzTGF5ZXIsCi0JCQkJRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5FWFRFUk5BTF9OT0RFX0xBQkVMU19MQVlFUiwKLQkJCQlMYXllckNvbnN0YW50cy5QUklNQVJZX0xBWUVSKTsKLQkJTGF5ZXJlZFBhbmUgc2NhbGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuU0NBTEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBzY2FsZWRGZWVkYmFja0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJc2NhbGVkRmVlZGJhY2tMYXllci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2NhbGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihzY2FsZWRGZWVkYmFja0xheWVyLAotCQkJCUxheWVyQ29uc3RhbnRzLlNDQUxFRF9GRUVEQkFDS19MQVlFUiwKLQkJCQlEaWFncmFtUm9vdEVkaXRQYXJ0LkRFQ09SQVRJT05fVU5QUklOVEFCTEVfTEFZRVIpOwotCQl2aWV3ZXIuc2V0Um9vdEVkaXRQYXJ0KHJvb3QpOwotCQl2aWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9XUERlcGVuZGVuY3lEaWFncmFtVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9XUERlcGVuZGVuY3lEaWFncmFtVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdkN2E5OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvV1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5XUERpYWdyYW1FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgZ3JhcGhpY2FsIHZpZXdlciBmb3IgdGhlIFdQIERlcGVuZGVuY3kgZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIgZXh0ZW5kcyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgewotCi0JcHVibGljIFdQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCi0JfQotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gZGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpOwotCQlkaWFncmFtLnNldEZpbHRlcihmaWx0ZXIpOwotCQlpZiAoc3VwICE9IG51bGwpIHsKLQkJCWRpYWdyYW0uc2V0U3VwcHJlc3Npb24oc3VwKTsKLQkJfQotCi0JCWRpYWdyYW0uc2V0T2JqZWN0KGUpOwotCQlFZGl0UGFydCBwYXJ0ID0gbmV3IERpYWdyYW1FZGl0UGFydChkaWFncmFtKTsKLQkJcGFydC5zZXRNb2RlbChkaWFncmFtKTsKLQkJcmV0dXJuIHBhcnQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFncmFtVHlwZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YTJlMzI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGdyYXBoaWNhbCB2aWV3ZXJzIGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1BlcnNwZWN0aXZlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nUGVyc3BlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWY4MWY3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nUGVyc3BlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuSVdpemFyZFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdNZXRob2RQbHVnaW5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLldpemFyZEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGUgTWV0aG9kIEF1dGhvcmluZyBwZXJzcGVjdGl2ZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXV0aG9yaW5nUGVyc3BlY3RpdmUgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBBdXRob3JpbmcgcGVyc3BlY3RpdmUgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU1BFQ1RJVkVfSUQgPSBBdXRob3JpbmdQZXJzcGVjdGl2ZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIElQYWdlTGF5b3V0IHBhZ2VMYXlvdXQ7Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5I2NyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJcGFnZUxheW91dCA9IGxheW91dDsKLQkJbGF5b3V0LnNldEVkaXRvckFyZWFWaXNpYmxlKHRydWUpOwotCQlTdHJpbmcgZWRpdG9yQXJlYSA9IGxheW91dC5nZXRFZGl0b3JBcmVhKCk7Ci0JCWxheW91dAotCQkJCS5hZGRWaWV3KExpYnJhcnlWaWV3LlZJRVdfSUQsIElQYWdlTGF5b3V0LkxFRlQsIDAuMzBmLAotCQkJCQkJZWRpdG9yQXJlYSk7Ci0JCWxheW91dC5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9QUk9QX1NIRUVULCBJUGFnZUxheW91dC5CT1RUT00sCi0JCQkJMC42NWYsIGVkaXRvckFyZWEpOwotCQkKLQkJU3RyaW5nIG5ld0xpYnJhcnlXaXphcmRJZCA9IE5ld0xpYnJhcnlXaXphcmQuV0laQVJEX0lEOwotCQlTdHJpbmcgbmV3TWV0aG9kUGx1Z2luV2l6YXJkSWQgPSBOZXdNZXRob2RQbHVnaW5XaXphcmQuV0laQVJEX0lEOwotCQlTdHJpbmcgbmV3Q29uZmlndXJhdGlvbldpemFyZElkID0gTmV3Q29uZmlndXJhdGlvbldpemFyZC5XSVpBUkRfSUQ7Ci0JCUlXaXphcmRSZWdpc3RyeSB3aXphcmRSZWdpc3RyeSA9IFdpemFyZEhlbHBlci5nZXRXaXphcmRSZWdpc3RyeSgpOwkJCi0JCWlmKHdpemFyZFJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCWlmKHdpemFyZFJlZ2lzdHJ5LmdldE5ld01ldGhvZENvbmZpZ3VyYXRpb25XaXphcmRJZCgpICE9IG51bGwpIHsKLQkJCQluZXdDb25maWd1cmF0aW9uV2l6YXJkSWQgPSB3aXphcmRSZWdpc3RyeS5nZXROZXdNZXRob2RDb25maWd1cmF0aW9uV2l6YXJkSWQoKTsKLQkJCX0KLQkJCWlmKHdpemFyZFJlZ2lzdHJ5LmdldE5ld01ldGhvZFBsdWdpbldpemFyZElkKCkgIT0gbnVsbCkgewotCQkJCW5ld01ldGhvZFBsdWdpbldpemFyZElkID0gd2l6YXJkUmVnaXN0cnkuZ2V0TmV3TWV0aG9kUGx1Z2luV2l6YXJkSWQoKTsKLQkJCX0KLQkJfQotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQobmV3TGlicmFyeVdpemFyZElkKTsKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KG5ld01ldGhvZFBsdWdpbldpemFyZElkKTsKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KG5ld0NvbmZpZ3VyYXRpb25XaXphcmRJZCk7CQkKLQkJCi0JCVBlcnNwZWN0aXZlTGlzdFV0aWwuYWRkUGVyc3BlY3RpdmVTaG9ydExpc3QobGF5b3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGlzIHBlcnNwZWN0aXZlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZXZpb3VzbHkgYWN0aXZlIHBlcnNwZWN0aXZlCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIG9wZW4oKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJSVBlcnNwZWN0aXZlUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCk7Ci0JCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIG9sZFBlcnNwZWN0aXZlID0gYWN0aXZlUGFnZS5nZXRQZXJzcGVjdGl2ZSgpOwotCQkJaWYgKCFvbGRQZXJzcGVjdGl2ZS5nZXRJZCgpLmVxdWFscyhQRVJTUEVDVElWRV9JRCkpIHsKLQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIHBlcnNwZWN0aXZlID0gcmVnaXN0cnkKLQkJCQkJCS5maW5kUGVyc3BlY3RpdmVXaXRoSWQoUEVSU1BFQ1RJVkVfSUQpOwotCQkJCWFjdGl2ZVBhZ2Uuc2V0UGVyc3BlY3RpdmUocGVyc3BlY3RpdmUpOwotCQkJfQotCQkJcmV0dXJuIG9sZFBlcnNwZWN0aXZlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWdlIGxheW91dCBmb3IgdGhpcyBwZXJzcGVjdGl2ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYWdlIGxheW91dCBjcmVhdGVkIGZvciB0aGlzIHBlcnNwZWN0aXZlCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGFnZUxheW91dCBnZXRQYWdlTGF5b3V0KCkgewotCQlyZXR1cm4gcGFnZUxheW91dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSUhlbHBDb250ZXh0cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJSGVscENvbnRleHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmNDNkNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJSGVscENvbnRleHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotLyoqCi0gKiBBdXRob3JpbmcgVUkgaGVscCBjb250ZXh0cwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1VJSGVscENvbnRleHRzIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBST09UX0NPTlRFWFQgPSBBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpICsgIi4iOyAgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGSUxFX05FV19MSUJSQVJZX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZpbGVfbmV3X2xpYnJhcnlfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJRklMRV9ORVdfUExVR0lOX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZpbGVfbmV3X3BsdWdpbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCUZJTEVfTkVXX0NPTkZJR1VSQVRJT05fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZmlsZV9uZXdfY29uZmlndXJhdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZJTEVfT1BFTl9MSUJSQVJZX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZpbGVfb3Blbl9saWJyYXJ5X2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZJTEVfT1BFTl9DT05GSUdVUkFUSU9OX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZpbGVfb3Blbl9jb25maWd1cmF0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZJTEVfSU1QT1JUX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAiZmlsZV9pbXBvcnRfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRklMRV9FWFBPUlRfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICJmaWxlX2V4cG9ydF9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBMSUJSQVJZX05BVklHQVRPUl9WSUVXX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImxpYnJhcnlfbmF2aWdhdG9yX3ZpZXdfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBDT05GSUdVUkFUSU9OX1ZJRVdfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiY29uZmlndXJhdGlvbl92aWV3X2NvbnRleHQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgUExVR0lOX0VESVRPUl9ERVNDUklQVElPTl9BTExfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAicGx1Z2luX2VkaXRvcl9kZXNjcmlwdGlvbl9hbGxfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBDT05GSUdVUkFUSU9OX0VESVRPUl9BTExfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiY29uZmlndXJhdGlvbl9lZGl0b3JfYWxsX2NvbnRleHQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgQ09OVEVOVF9QQUNLQUdFX0VESVRPUl9BTExfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiY29udGVudF9wYWNrYWdlX2VkaXRvcl9hbGxfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfUk9MRV9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9yb2xlX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfVEFTS19DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl90YXNrX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfV09SS19QUk9EVUNUX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX3dvcmtfcHJvZHVjdF9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0dVSURBTkNFX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX2d1aWRhbmNlX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfRElTQ0lQTElORV9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9kaXNjaXBsaW5lX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfRElTQ0lQTElORV9HUk9VUElOR19DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9kaXNjaXBsaW5lX2dyb3VwaW5nX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfRE9NQUlOX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX2RvbWFpbl9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1dPUktfUFJPRFVDVF9UWVBFX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX3dvcmtfcHJvZHVjdF90eXBlX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfUk9MRV9TRVRfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3Jfcm9sZV9zZXRfY29udGV4dF9oZWxwX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9ST0xTRV9TRVRfR1JPVVBJTkdfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3Jfcm9sc2Vfc2V0X2dyb3VwaW5nX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfVE9PTF9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl90b29sX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9DVVNUT01fQ0FURUdPUllfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfY3VzdG9tX2NhdGVnb3J5X2NvbnRleHRfaGVscF9JRCIgOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9ERVNDUklQVElPTl9HRU5FUkFMX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2dlbmVyYWxfY29udGV4dCIgOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9ERVNDUklQVElPTl9ERVRBSUxfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZGV0YWlsX2NvbnRleHQiICA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fTk9UQVRJT05fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fbm90YXRpb25fY29udGV4dCIgIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9ERVNDUklQVElPTl9UQUlMT1JJTkdfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fdGFpbG9yaW5nX2NvbnRleHQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fVkVSU0lPTl9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl92ZXJzaW9uX2NvbnRleHQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fRUxFTUVOVF9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9lbGVtZW50X2NvbnRleHQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fSUNPTl9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9pY29uX2NvbnRleHQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0NQX0RFU0NSSVBUSU9OX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX2NwX2Rlc2NyaXB0aW9uX2NvbnRleHRfaGVscF9JRCIgOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfRFBfREVTQ1JJUFRJT05fQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfZHBfZGVzY3JpcHRpb25fY29udGV4dF9oZWxwX0lEIiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX1BST0NFU1NfV0JTX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX3Byb2Nlc3Nfd2JzX2NvbnRleHQiICA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfUFJPQ0VTU19PQlNfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfcHJvY2Vzc19vYnNfY29udGV4dCIgOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9QUk9DRVNTX1BCU19DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9wcm9jZXNzX3Bic19jb250ZXh0IiAgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX1BST0NFU1NfQUxMQlNfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICJmb3JtX2VkaXRvcl9wcm9jZXNzX2FsbGJzX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIENPTkZJR1VSQVRJT05fUFVCTElTSF9XSVpBUkRfQUxMX1BBR0VTX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImNvbmZpZ3VyYXRpb25fcHVibGlzaF93aXphcmRfYWxsX3BhZ2VzX2NvbnRleHQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgUklDSF9URVhUX0VESVRPUl9DT05URVhUX0lEID0gUk9PVF9DT05URVhUICsgICJyaWNoX3RleHRfZWRpdG9yX2NvbnRleHRfSUQiICA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfQUNUSVZJVFlfRElBR1JBTV9DT05URVhUID0gUk9PVF9DT05URVhUICsgImZvcm1fZWRpdG9yX2FjdGl2aXR5X2RpYWdyYW1fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArImZvcm1fZWRpdG9yX2FjdGl2aXR5X2RldGFpbF9kaWFncmFtX2NvbnRleHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfV1BfREVQRU5ERU5DWV9ESUFHUkFNX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAiZm9ybV9lZGl0b3Jfd3BfZGVwZW5kZW5jeV9kaWFncmFtX2NvbnRleHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQgPSBST09UX0NPTlRFWFQgKyAibGlicmFyeV92aWV3X25vZGVfY29udGV4dF9ub3RfaW1wbGVtZW50ZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgIExBWU9VVF9GTEFUX0FDVElPTiA9IFJPT1RfQ09OVEVYVCArICJsYXlvdXRfZmxhdF9hY3Rpb24iOyAJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyAgTEFZT1VUX0hJRVJBUkNISUNBTF9BQ1RJT04gPSBST09UX0NPTlRFWFQgKyAibGF5b3V0X2hpZXJhcmNoaWNhbF9hY3Rpb24iOyAJIC8vJE5PTi1OTFMtMSQJCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSUltYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkYmJiOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogU2hhcmVkIGltYWdlcyB1c2VkIGluIHRoZSBBdXRob3JpbmcgVUkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXV0aG9yaW5nVUlJbWFnZXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfQ09MTEFQU0VEID0gImZ1bGwvb2JqMTYvQ29sbGFwc2VkLmdpZiI7IC8vJE5PTi1OTFMtMSQgCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfRVhQQU5ERUQgPSAiZnVsbC9vYmoxNi9FeHBhbmRlZC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTkFNRV9SRUZSRVNIID0gImZ1bGwvZXRvb2wxNi9SZWZyZXNoLmdpZiI7IC8vJE5PTi1OTFMtMSQgCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfU1RPUCA9ICJmdWxsL2V0b29sMTYvU3RvcC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTkFNRV9QUklOVCA9ICJmdWxsL2V0b29sMTYvUHJpbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX09WUl9FUlJPUiA9ICJmdWxsL292cjE2L2Vycm9yX292ci5naWYiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfTEFZT1VUX0ZMQVQgPSAiZnVsbC9ldG9vbDE2L2ZsYXRMYXlvdXQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfTEFZT1VUX0hJRVJBUkNISUNBTCA9ICJmdWxsL2V0b29sMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0NPTExBUFNFRCA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfTkFNRV9DT0xMQVBTRUQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfRVhQQU5ERUQgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfRVhQQU5ERUQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfUkVGUkVTSCA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfTkFNRV9SRUZSRVNIKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX1NUT1AgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfU1RPUCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19QUklOVCA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfTkFNRV9QUklOVCk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfT1ZSX0VSUk9SID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19OQU1FX09WUl9FUlJPUik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19MQVlPVVRfRkxBVCA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfTkFNRV9MQVlPVVRfRkxBVCk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfTEFZT1VUX0hJRVJBUkNISUNBTCA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfTkFNRV9MQVlPVVRfSElFUkFSQ0hJQ0FMKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0JBQ0sgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9CQUNLKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NPTExBUFNFRCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFNoYXJlZEltYWdlKElNR19OQU1FX0NPTExBUFNFRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19FWFBBTkRFRCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFNoYXJlZEltYWdlKElNR19OQU1FX0VYUEFOREVEKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0ZPUldBUkQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9GT1JXQVJEKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1JFRlJFU0ggPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9SRUZSRVNIKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1NUT1AgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9TVE9QKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BSSU5UID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX05BTUVfUFJJTlQpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX09WUl9FUlJPUiA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFNoYXJlZEltYWdlKElNR19OQU1FX09WUl9FUlJPUik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19MQVlPVVRfRkxBVCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFNoYXJlZEltYWdlKElNR19OQU1FX0xBWU9VVF9GTEFUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0xBWU9VVF9ISUVSQVJDSElDQUwgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9MQVlPVVRfSElFUkFSQ0hJQ0FMKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNjOWZkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsLkltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwuUHJvYmxlbU1hcmtlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIEF1dGhvcmluZyBVSSBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBBdXRob3JpbmdVSVBsdWdpbiBwbHVnaW47Ci0KLQlwcml2YXRlIFByb2JsZW1NYXJrZXJNYW5hZ2VyIGZQcm9ibGVtTWFya2VyTWFuYWdlcjsKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IGZJbWFnZURlc2NyaXB0b3JSZWdpc3RyeTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEF1dGhvcmluZ1VJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCQotCQkvLyBJbml0aWFsaXplIHRoZSBBdXRob3JpbmcgVUkgc2VydmljZS4KLQkJQXV0aG9yaW5nVUlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXV0aG9yaW5nVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBQcm9ibGVtTWFya2VyTWFuYWdlciBnZXRQcm9ibGVtTWFya2VyTWFuYWdlcigpIHsKLQkJaWYgKGZQcm9ibGVtTWFya2VyTWFuYWdlciA9PSBudWxsKQotCQkJZlByb2JsZW1NYXJrZXJNYW5hZ2VyPSBuZXcgUHJvYmxlbU1hcmtlck1hbmFnZXIoKTsKLQkJcmV0dXJuIGZQcm9ibGVtTWFya2VyTWFuYWdlcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5pbnRlcm5hbEdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgaW50ZXJuYWxHZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSA9PSBudWxsKQotCQkJZkltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5PSBuZXcgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKTsKLQkJcmV0dXJuIGZJbWFnZURlc2NyaXB0b3JSZWdpc3RyeTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdCkgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IodCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJUmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGE0NDU4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQXV0aG9pbmcgVUkgcmVzb3VyY2VzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEF1dGhvcmluZ1VJUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQXV0aG9yaW5nVUlSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZS4KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uT3JkZXJEaWFsb2dfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uT3JkZXJEaWFsb2dfTmF2aWdhdGlvblZpZXdzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXNzaWduUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhdGVnb3JpZXNQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVQYXJ0c1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNjcmlwdGlvblBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjYXJkdW5yZXNvbHZlZHJlZjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRhbmNlUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXZpZXdQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0RGVsZXRlQ3VzdG9tQ2F0ZWdvcnlCZWZvcmVSZW1vdmVMYXN0UmVmVG9JdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZmVyZW5jZXNQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmZXJlbmNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZlcmVuY2VXb3JrZmxvd1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0c1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGVwc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sTWVudG9yc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdHNQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tJdGVtc1NlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrSXRlbXNTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXBlbmRlbmNpZXNTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXBlbmRlbmNpZXNTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXRhaWxTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmFsSW5mb1NlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaWNvblNlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub3RhdGlvblNlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vdGF0aW9uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YWZmaW5nU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhZmZpbmdTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGVwc1NlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0ZXBzU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFpbG9yaW5nU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFpbG9yaW5nU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFyaWFiaWxpdHlTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25JbmZvU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRpdGlvbmFsSW5mb190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwbGljYXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbkxhYmVsX2VkaXQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25MYWJlbF9maW5kRWxlbWVudEluTGliTmF2OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWx0ZXJuYXRpdmVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXV0aG9yc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja2dyb3VuZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZUVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VHdWlkYW5jZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJpZWZEZXNjcmlwdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2t1cGJlZm9yZXNhdmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyaWVmT3V0bGluZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hhbmdlRGF0ZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hhbmdlRGVzY3JpcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrSXRlbXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRyaWJ1dGVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhbENvbnRyaWJ1dGVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250cmlidXRlc190b190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuZHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZXJuYWxEZXNjcmlwdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZXJuYWxJZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ29hbHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcGFjdE9mTm90SGF2aW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBrZXlDb25zaWRlcmF0aW9uc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGV2ZWxzT2ZBZG9wdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFpbkRlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub3RBcHBsaWNhYmxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWNrYWdpbmdHdWlkYW5jZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlc2VudGF0aW9uTmFtZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0Zm9ybGliYXJ5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmFibGVIZWFsdGhDaGVja190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvYmxlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVycG9zZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhc29uRm9yTm90TmVlZGluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvY2FsUmVwbGFjZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuZHNSZXBsYWNlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwcmVzZW50YXRpb25PcHRpb25zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdHRhY2hlZEZpbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNraWxsc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RlcHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0ZXBzX25hbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0b3BfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5vbnltc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVlcENvcHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2tfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld19wbHVnaW47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlSWRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhcmlhYmlsaXR5VHlwZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdHRhY2hCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hhbmdlVHlwZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYXJCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGV0YWNoQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFncmFtX3NhdmVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvd25CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpcmVjdG9yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3JkZXJCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVuYW1lQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUFzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2VsZWN0QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZURlZmF1bHRCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdIaXN0b3J5QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlVGFza3NQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUm9sZXNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1JvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUm9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9tb2RpZnlfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2VfY29uZmlybV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1dvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0d1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0d1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlclJlc29sdXRpb25HZW5lcmF0b3Jfc2hvd093bmVySW5MaWJyYXJ5VmlldzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RfVGFza3NfQXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXRlZ29yeUd1aWRhbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhdGVnb3J5R3VpZGFuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX1VzZURlZmF1bHREaXJlY3RvcnlCdXR0b25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sVG9vbE1lbnRvcnNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbFRvb2xNZW50b3JzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbFRvb2xNZW50b3JzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdQbHVnaW5XaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3UGx1Z2luRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3UGx1Z2luRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdERpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW92ZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdhcm5pbmdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRDb25maWdFcnJvckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNldERlZmF1bHRDb25maWdFcnJvckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlicmFyeURpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlTGlicmFyeURpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9PcGVuTGlicmFyeUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUNvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludGVybmFsRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFByZXNlbnRhdGlvbk5hbWVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkQ29uZmlnRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0RGVmYXVsdENvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlTGlicmFyeVRvRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnRlcm5hbEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGVMaWJyYXJ5RXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZVVwZ3JhZGVkTGlicmFyeUVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5pbmdMaWJyYXJ5VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2aW5nTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkaW5nTGlicmFyeUVsZW1lbnRzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ0ZpbGVzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGluZ0ludmFsaWRSZWZlcmVuY2VzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkRWRpdG9yVG9QZXJzcGVjdGl2ZVdhcm5pbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENoYW5nZUhpc3RvcnlEaWFsb2dfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtRGVsZXRlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlbGV0ZURpYWxvZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtRGVsZXRlRGlhbG9nX21zZ1dpdGhSZWZlcmVuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRpYWxvZ19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfbm9vcGVubGlicmFyeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9sb2FkaW5nbGlicmFyeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1zZ19yZWxvYWRMaWJyYXJ5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVsb2FkRGlhbG9nX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWxvYWREaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZV92aWV3czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbHVtbnNlbGVjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VfYWRkVmlld0J1dHRvblRleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZV9yZW1vdmVWaWV3QnV0dG9uVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX21ha2VEZWZhdWx0QnV0dG9uVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25NZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFzc29jaWF0aW9uRm9ybVBhZ2VfQnJpZWZEZXNjcmlwdGlvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWVfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY2Fubm90UmVuYW1lUGx1Z2luRm9sZGVyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRGVzY3JpcHRpb25fc2VsZWN0Q29uZmlndXJhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0RlbGV0ZUFjdGlvbl9zZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2s7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF0dGFjaEd1aWRhbmNlRmlsZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUVsZW1lbnREaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVOZXdFbGVtZW50RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGxnVGl0bGVfcmVsb2FkTGlicmFyeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUVsZW1lbnRFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVDb25maWdFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfY2hhbmdlQm91bmRzQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9jaGFuZ2VOYW1lQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9jaGFuZ2VOYW1lQ29tbWFuZF91bmRvTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9jaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9jcmVhdGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2NyZWF0ZU5vZGVDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfZGVsZXRlQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9tb3ZlQmVuZHBvaW50Q29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9yZWNvbm5lY3RMaW5rQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl92YWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX3ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl93b3JrUHJvZHVjdE5vZGVFZGl0UGFydF92YWxpZGF0ZU1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25zX0VsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbl9tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvclRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvclRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yTWVzc2FnZTE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW5hbWVFcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEVsZW1lbnREaWFsb2dfc2VsZWN0ZWxlbWVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZXNjcmlwdGlvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX1NlbGVjdEFsbEJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZV9lZGl0X3RleHQwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVmYXVsdExpYnJhcnlOYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX0Rlc2NyaXB0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudHNWaWV3X21pZ3JhdGlvbl9kaXJfZGxnX2Rlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVmYXVsdEJyaWVmRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybXNfR3VpZGFuY2VXaXRoQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2VfYWxyZWFkeUF0dGFjaGVkX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlFcnJvcl9yZWFzb24xOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeUVycm9yX3JlYXNvbjI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5RXJyb3JfcmVhc29uMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlFcnJvcl9hZHZpY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0V4dGVybmFsSUQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1B1cnBvc2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1Njb3BlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Vc2FnZU5vdGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19BbHRlcm5hdGl2ZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0hvd1RvU3RhZmY7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0tleUNvbnNpZGVyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1NjYWxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19SaXNrTGV2ZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0VzdGltYXRpbmdUZWNobmlxdWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1Byb2plY3RNZW1iZXJFeHBlcnRpc2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1R5cGVPZkNvbnRyYWN0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9yd2FyZEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9yd2FyZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RvcEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmcmVzaEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmcmVzaF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3bmFtZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJpbnRCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01ldGhvZEVkaXRvcl9tZW51OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BhcmVudFBhZ2VfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTGlzdFBhZ2VfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVHJlZVBhZ2VfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVGFibGVQYWdlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RhYmxlVHJlZVBhZ2VfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfT2JqZWN0Q29sdW1uX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NlbGZDb2x1bW5fbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTm9PYmplY3RTZWxlY3RlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NdWx0aU9iamVjdFNlbGVjdGVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XaXphcmRfY2F0ZWdvcnk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTWV0aG9kTW9kZWxXaXphcmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTWV0aG9kTW9kZWxXaXphcmRfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTWV0aG9kRWRpdG9yX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVFeHRlbnNpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV2l6YXJkX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1dBUk5fRmlsZW5hbWVFeHRlbnNpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTW9kZWxPYmplY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWE1MRW5jb2Rpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWE1MRW5jb2RpbmdDaG9pY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GaWxlQ29uZmxpY3RfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTl9GaWxlQ29uZmxpY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRMaW5rRGlhbG9nX2xpbmtUeXBlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpbmtDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaGVpZ2h0TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpZHRoTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld18yMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld18yMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld18yMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld18zNTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld18zNjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFsdFRhZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbWFnZVNpemVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfUHJlc2VudGF0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfSW5kZXg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1ByZWRlY2Vzc29yczsKLQotCS8vIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX1NlbGVjdGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENoZWNrbGlzdE9yZGVyX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX01vZGVsSW5mbzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfUHJlZml4OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZURpYWxvZ19tb3ZlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGVja2xpc3RPcmRlcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfUmVwZXRhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9PbmdvaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9FdmVudERyaXZlbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfRGVsaXZlcmFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX09wdGlvbmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX1R5cGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckRpYWxvZ19FeHBhbmRBbGw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX21vdmluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uV2FybmluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9OYW1lTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX05hbWVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5V2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeVdpemFyZE1haW5QYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeVdpemFyZE1haW5QYWdlX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeVdpemFyZE1haW5QYWdlX2Rlc2NyaXB0aW9uXzI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5UGF0aExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5VHlwZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZVRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25XaXphcmRfd2luZG93VGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfcmVwbGFjZWluZ3dpdGhmb3JtYXRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uV2FybmluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VMYWJlbFByb3ZpZGVyX3Vuc2VsZWN0ZWRwYWNrYWdlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGVwc09yZGVyRGlhbG9nX3N0ZXBzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RlcHNPcmRlckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfUGxhbm5lZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNwZWNpZnlkaXJlY3RvcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfTXVsdGlwbGVPY2N1cnJlbmNlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfRW50cnlTdGF0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfRXhpdFN0YXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29sdW1uc3RvQWRkX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1R5cGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1RlYW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJEaWFsb2dfQ29sbGFwc2VBbGw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuQ2hlYXRzaGVldFZpZXdfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsVXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsRG93bjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVVcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVEb3duOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfUmV2ZWFsX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29weTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RMaWJyYXJ5RWRpdG9yX3RpdGxlOwotCi0JLy8gcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZVZpZXdfc2VsZWN0ZWRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXNzYWdlVmlld19lcnJtc2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19lcnJfc2F2aW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyX2NvcHlpbmdfZmlsZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9jb3B5aW5nX2ZpbGVfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfY29weWluZ19maWxlX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0Q29uZmlndXJhdGlvbl90b29sdGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZVRoaXNBY3Rpb25fc2F2ZW9iamVjdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19yZXBsYWNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9FeHRlbmQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaG9vc2VEZWZhdWx0RGlyZWN0b3J5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0Fzc2lnblVzZXJEaWFncmFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRkSW1hZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfd3BkSW1hZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfbm90YUZpbGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3NlbGVjdGVkSW1hZ2VOb3RGb3VuZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBREltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFEREltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29udHJpYnV0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1JlcGxhY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9EaWFncmFtczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfYWN0aW9uX2RlZXBDb3B5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX0JyaWVmRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9oaWRlVG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NBbGw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX1RyZWVUaXRsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTG9hZGluZ01lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX3ZhbGlkZGVzdGluYXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVEaWFsb2dfY2Fubm90TW9kaWZ5RGVzdGluYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQmFzZUFjdGl2aXR5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0Zvcm1FZGl0b3JfZXhwYW5BbGxBY3Rpb25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NGb3JtRWRpdG9yX2NvbGxhcHNlQWxsQWN0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9TZWxlY3RDb2x1bW5zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9Db2x1bW5TZWxlY3Rpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3dpdGNoQ29uZmlndXJhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zdXBwcmVzc2lvbkdyb3VwVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9JbnNlcnROZXdQaGFzZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZpZXdIZWxwZXJfcmVsb2FkTGliT25Sb2xsYmFja0Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZGNvbmZpcm1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0FkZE1pc3NpbmdUb29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRGVzY3JpcHRpb25HZW5lcmFsSW5mbzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0FwcGx5UGF0dGVybjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVEaWFsb2dfc2VsZWN0ZGVzdGluYXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVEaWFsb2dfbm9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl90cm91Ymxlb2JqZWN0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZUxhYmVsUHJvdmlkZXJfZXJyY2hpbGRwa2dzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlQXN3aXRoZG90c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfV29ya1Byb2R1Y3RVc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfY29uZmlybUF1dG9TeW5jaDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfZGVmYXVsdFN5bmNocm9uaXphdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0xpYnJhcnlEaWFsb2dfbmV3bGlicmFyeV9hczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1BsdWdpbkRpYWxvZ19uZXdwbHVnaW5fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEVsZW1lbnREaWFsb2dfdGl0bGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5Db25maWdEaWFsb2duZXdjb25maWdfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZV9CU0VkaXRvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVEaWFsb2dfaW52YWxpZF9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlbW9kZWxsaWJyYXJ5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVfbGlicmFyeV9wcm9ibGVtX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfQ29udGVudEVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfQnJvd3NlQnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuQ29uZmlnRGlhbG9nb3BlbmNvbmZpZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudHNWaWV3X3JlcGxhY2VBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9TaG93RXJyb3JUb29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENoZWNrbGlzdE9yZGVyX2NoZWNrbGlzdGl0ZW1zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdQbHVnaW5EaWFsb2dfcmVmZXJlbmNlcGx1Z2luX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfY3JlYXRlRnJlZVRleHRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtVmFsaWRhdGlvbl9lcnJfc2FtZXByZWRhbmRzdWNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yQ2hvb3Nlcl9SZXNvdXJjZXNFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0Zvcm1QcmVmaXg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRGVzY3JpcHRpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0YWNobWVudERpYWxvZ0ZpbGVVUkxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0ZXBzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RMaWJyYXJ5RWRpdG9yX2Vycl9zYXZlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZVZpZXdfZXJyZWxlbWVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZVZpZXdfcmVmZWxlbWVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtRWRpdG9yX2NyZWF0ZVN0YXJ0Tm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGlyZWN0b3J5TGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb290UHJlZlBhZ2VfZW5hYmxlcHJvY2Vzc2NvbnRyaWJ1dGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250cmlidXRpb25TZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudHNWaWV3X29wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdQQ29tcGFydG1lbnRGaWd1cmVfMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb21wdGZvcl9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRfZm9yX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWdQcm9jZXNzVmlld0RpYWxvZ19OYW1lUGF0dGVybjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfUGF0dGVybjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWdQcm9jZXNzVmlld0RpYWxvZ19DYXRlZ29yeVR5cGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWdQcm9jZXNzVmlld0RpYWxvZ19CcmllZkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfU2VsZWN0Q2F0ZWdvcmllczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWF0c2hlZXRfbG9hZF9mYWlsdXJlX2xvZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdDb25maWd1cmF0aW9uV2lyYXpkX2NyZWF0ZUVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3UGx1Z2luV2l6YXJkX2NyZWF0ZUVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfbW92ZUVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVuYW1lRGlhbG9nX3JlbmFtZUVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfY3JlYXRlRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVQbHVnaW5OYW1lRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkQURJbWFnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkV1BESW1hZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBREltYWdlSW5QdWJsaXNoaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURESW1hZ2VJblB1Ymxpc2hpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VXUERJbWFnZUluUHVibGlzaGluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfRGlhZ3JhbUltYWdlX0lucHV0RGlhbG9nX2luaXRpYWxWYWx1ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1Nob3dMaW5rZWRFbGVtZW50aW5MaWJyYXJ5VmlldzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQ29udGV4dE1lbnVfRGlhZ3JhbUltYWdlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV9jb25maWdMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcm9wZXJ0aWVzX2xhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX25hbWVfbGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJlc2VudGF0aW9uTmFtZV9sYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9icmllZkRlc2NfbGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3B0aW9uYWxJbm91dHNfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbWFuZGF0b3J5SW5wdXRzX2xhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX291dHB1dHNfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9hZGRuUGVyZm9ybWVyc19sYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9yZXNwb25zaWJsZVJvbGVzX2xhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2NvbnRuQXJ0aWZhY3RzX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2RpbHZlZFBhcnRzX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEVkaXRvcnNUb0Rpc2NhcmRDb25mbGljdENoYW5nZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfdGl0bGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfZXhwbGFpblRleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuUlRFOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xvc2VSVEU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya3Byb2R1Y3R0eXBlc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbWNhdGVnb3J5X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2xpc3RfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRlbGluZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9hZG1hcF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV1c2FibGVhc3NldF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ21hdGVyaWFsX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvcnRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xtZW50b3JfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdoaXRlcGFwZXJfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpb25jb25zaWRlcmF0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQkvLyBOZXcgU3RyaW5nIFNlY3Rpb24gRGVzY3JpcHRpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3Rfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF90YWlsb3JpbmdTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV9ub3RhdGlvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZV9ub3RhdGlvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX3RhaWxvcmluZ1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya3Byb2R1Y3R0eXBlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya3Byb2R1Y3R0eXBlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2VwdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGVsaW5lX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRlbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRlbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpb25jb25zaWRlcmF0aW9uX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpb25jb25zaWRlcmF0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvcnRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvcnRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3VhYmxlYXNzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzdWFibGVhc3NldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvYWRtYXBfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvYWRtYXBfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cHBvcnRpbmdtYXRlcmlhbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cHBvcnRpbmdtYXRlcmlhbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cHBvcnRpbmdtYXRlcmlhbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1kZWZpbml0aW9uX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybWRlZmluaXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtZGVmaW5pdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xtZW50b3JfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbG1lbnRvcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xtZW50b3JfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sbWVudG9yX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdoaXRlcGFwZXJfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lZ3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZWdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZWdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZWdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbWNhdGVnb3J5X2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbWNhdGVnb3J5X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21jYXRlZ29yeV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbWNhdGVnb3J5X0ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2xpc3RfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdoaXRlcGFwZXJfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpb25jb25zaWRlcmF0aW9uX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtZGVmaW5pdGlvbl9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldXNhYmxlYXNzZXRfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRlbGluZV9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ21hdGVyaWFsX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2lyY3VsYXJfZGVwZW5kZW5jeV9lcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwbHlfcGF0dGVybl9lcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hfY2F0ZWdvcmllc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdF9saXN0X2xlbmd0aF9sYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbmRfc2VtYW50aWNzX2J1dHRvbl90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuZF9zZW1hbnRpY3NfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX2ljb25TZWN0aW9uX2ZpbGVOYW1lQ29uZmxpY3RfdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9pY29uU2VjdGlvbl9maWxlTmFtZUNvbmZsaWN0X21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX2ljb25TZWN0aW9uX2ZpbGVOYW1lX3NlbGVjdEFjdGlvbl9sYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX2ljb25TZWN0aW9uX2ZpbGVOYW1lX2Rlc3RpbmF0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfaWNvblNlY3Rpb25fZmlsZU5hbWVDb25mbGljdF9ub3RlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfaWNvblNlY3Rpb25fZmlsZU5hbWVfcmVwbGFjZV9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9pY29uU2VjdGlvbl9maWxlTmFtZV91bmlxdWVfbXNnOyAKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1ByZWZlcmVuY2VzOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzX1Rhc2s7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsX1Rhc2s7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF5b3V0QWN0aW9uR3JvdXBfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXlvdXRBY3Rpb25Hcm91cF9mbGF0TGF5b3V0QWN0aW9uX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF5b3V0QWN0aW9uR3JvdXBfaGllcmFyY2hpY2FsTGF5b3V0QWN0aW9uX2xhYmVsOwotCQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiMTcxYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLk1ldGhvZEVkaXRvclBhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5Qcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkRlZmF1bHRFbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb21tYW5kTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci0KLS8qKgotICogVGhlIEF1dGhvcmluZyBVSSBzZXJ2aWNlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1VJU2VydmljZSB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEF1dGhvcmluZ1VJU2VydmljZSBpbnN0YW5jZSA9IG5ldyBBdXRob3JpbmdVSVNlcnZpY2UoKTsKLQotCS8vIFRoZSBzdGF0dXMgZmxhZy4KLQlwcml2YXRlIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEF1dGhvcmluZ1VJU2VydmljZSgpIHsKLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihuZXcgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQkJCQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCQkJc3RhcnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCX0JCQkKLQkJfSk7CQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBBdXRob3JpbmdVSVNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgdGhlIEF1dGhvcmluZyBVSSBzZXJ2aWNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJaWYgKCFzdGFydGVkKSB7Ci0JCQkvLyBJbml0aWFsaXplIFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IKLQkJCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UuZ2V0Q2xhc3MoKTsKLQotCQkJLy8gSW5pdGlhbGl6ZSB0aGUgbW92ZS9wYXN0ZSBjb21tYW5kLgotCQkJTWV0aG9kRWxlbWVudEFkZENvbW1hbmQKLQkJCQkJLnNldFJlc291cmNlTWFuYWdlcihuZXcgQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbigpKTsKLQotCQkJLy8gSW5pdGlhbGl6ZSB0aGUgRWRpdG9yQ2hvb3Nlci4KLQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKTsKLQotCQkJLy8gTG9hZCBFZGl0b3JQYWdlIFByb3ZpZGVycwotCQkJTWV0aG9kRWRpdG9yUGFnZVByb3ZpZGVyLmdldEluc3RhbmNlKCkubG9hZFByb3ZpZGVycygpOwotCQkJUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlci5nZXRJbnN0YW5jZSgpLmxvYWRQcm92aWRlcnMoKTsKLQotCQkJLy8gU2V0IHByb3ZpZGVycyBmb3IgbGlicmFyeSBlZGl0LgotCQkJUHJvdmlkZXJzLnNldENvbmZpZ3VyYXRvckZhY3RvcnkobmV3IElDb25maWd1cmF0b3JGYWN0b3J5KCkgewotCQkJCXB1YmxpYyBJQ29uZmlndXJhdG9yIGNyZWF0ZUNvbmZpZ3VyYXRvcigKLQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQkJCXJldHVybiBuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihjb25maWcsIG51bGwsIHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlQcm92aWRlcnMKLQkJCQkJLnNldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKG5ldyBDb25maWd1cmF0aW9uQXBwbGljYXRvcigpKTsKLQotCQkJUHJvdmlkZXJzLnNldFByZWZlcmVuY2VTdG9yZShMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCi0JCQlQcm92aWRlcnMuc2V0QXV0aG9yaW5nUGx1Z2luKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKSk7Ci0KLQkJCUxpc3QgY21kTGlzdGVuZXJzID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q29tbWFuZExpc3RlbmVycygpOwotCQkJY21kTGlzdGVuZXJzLmFkZEFsbChEaWFncmFtRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRWYXJ5Q29tbWFuZExpc3RlbmVycygpKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNtZExpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyID0gKElDb21tYW5kTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJCVByb3ZpZGVycy5yZWdpc3RlckNvbW1hbmRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQl9Ci0KLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zdGFydCgpOwotCQkJCi0JCQlzdGFydGVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHRoZSBBdXRob3JpbmcgVUkgc2VydmljZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKLQkJaWYgKHN0YXJ0ZWQpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zdG9wKCk7CQkJCi0JCQlzdGFydGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmYxNzdiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGU7Ci0KLS8qKgotICogRGVmaW5lcyBhbmQgY2FjaGVzIHRoZSBjb21tb25seSByZWZlcmVuY2VkIHRleHQgaW4gdGhlIEF1dGhvcmluZyBVSS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdVSVRleHQgewotCi0JLyoqCi0JICogRWRpdG9yIGZvcm0gcGFnZSB0aXRsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTSUdOX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hc3NpZ25QYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JJRVNfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNhdGVnb3JpZXNQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElWRVJBQkxFX1BBUlRTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZVBhcnRzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25QYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NJUExJTkVTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lc1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0VfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmd1aWRhbmNlUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVWSUVXX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcmV2aWV3UGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWZlcmVuY2VzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VfV09SS0ZMT1dfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZmVyZW5jZVdvcmtmbG93UGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfU0VUU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldHNQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNURVBTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGVwc1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS1NfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX01FTlRPUlNfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xNZW50b3JzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1RTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdHNQYWdlX3RpdGxlOyAKLQotCS8qKgotCSAqIEVkaXRvciBzZWN0aW9uIG5hbWVzIGFuZCBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19JVEVNU19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja0l0ZW1zU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX0lURU1TX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoZWNrSXRlbXNTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQRU5ERU5DSUVTX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlcGVuZGVuY2llc1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBFTkRFTkNJRVNfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVwZW5kZW5jaWVzU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXRhaWxTZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVUQUlMX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRldGFpbFNlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX0lORk9fU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VuZXJhbEluZm9TZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9JTkZPX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuaWNvblNlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmljb25TZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05fU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90YXRpb25TZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05fU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90YXRpb25TZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFRF9QTFVHSU5TX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfUExVR0lOU19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFGRklOR19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGFmZmluZ1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFGRklOR19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGFmZmluZ1NlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVQU19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGVwc1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVQU19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGVwc1NlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUlMT1JJTkdfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFpbG9yaW5nU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBSUxPUklOR19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy50YWlsb3JpbmdTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSSUFCSUxJVFlfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmFyaWFiaWxpdHlTZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSSUFCSUxJVFlfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9JTkZPX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnZlcnNpb25JbmZvU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fSU5GT19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy52ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsgCi0KLQkvKioKLQkgKiBVSSBhbmQgZWxlbWVudCBhdHRyaWJ1dGUgbGFiZWxzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERElUSU9OQUxfSU5GT19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWRkaXRpb25hbEluZm9fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXBwbGljYXRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRFUk5BVElWRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFsdGVybmF0aXZlc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXNzaWdubWVudEFwcHJvYWNoZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hdXRob3JzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0dST1VORF9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmFja2dyb3VuZF90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfRUxFTUVOVF9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmFzZUVsZW1lbnRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX0dVSURBTkNFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iYXNlR3VpZGFuY2VfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9ERVNDUklQVElPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYnJpZWZEZXNjcmlwdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSSUVGX09VVExJTkVfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJyaWVmT3V0bGluZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRV9EQVRFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGFuZ2VEYXRlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFX0RFU0NSSVBUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGFuZ2VEZXNjcmlwdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX0lURU1TX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja0l0ZW1zX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJJQlVURVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbnRyaWJ1dGVzX3RleHQ7IAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0NPTlRSSUJVVEVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5sb2NhbENvbnRyaWJ1dGVzX3RleHQ7ICAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUFlSSUdIVF9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29weXJpZ2h0X3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTkRTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfREVTQ1JJUFRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4dGVybmFsRGVzY3JpcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9JRF9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXh0ZXJuYWxJZF90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdPQUxTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nb2Fsc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUEFDVF9PRl9OT1RfSEFWSU5HX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5pbXBhY3RPZk5vdEhhdmluZ190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05TSURFUkFUSU9OU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMua2V5Q29uc2lkZXJhdGlvbnNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTF9PRl9BRE9QVElPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubGV2ZWxzT2ZBZG9wdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fREVTQ1JJUFRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm1haW5EZXNjcmlwdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5hbWVfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRUxFTUVOVF9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3RWxlbWVudF90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9BUFBMSUNBQkxFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5ub3RBcHBsaWNhYmxlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHSU5HX0dVSURBTkNFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wYWNrYWdpbmdHdWlkYW5jZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVNFTlRBVElPTl9OQU1FX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcmVzZW50YXRpb25OYW1lX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvYmxlbV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVUlBPU0VfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnB1cnBvc2VfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFTT05fRk9SX05PVF9ORUVESU5HX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWFzb25Gb3JOb3ROZWVkaW5nX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTEFDRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcGxhY2VzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQUkVTRU5UQVRJT05fT1BUSU9OU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwcmVzZW50YXRpb25PcHRpb25zX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJTExTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5za2lsbHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVQU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RlcHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVQX05BTUVfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN0ZXBzX25hbWVfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5PTllNU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3lub255bXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRBQ0hFRF9GSUxFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hdHRhY2hlZEZpbGVfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy50eXBlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5JUVVFX0lEX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy51bmlxdWVJZF90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUklBQklMSVRZX1RZUEVfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnZhcmlhYmlsaXR5VHlwZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnZlcnNpb25fdGV4dDsgCi0KLQkvKioKLQkgKiBCdXR0b24gbGFiZWxzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZEJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVEFDSF9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmF0dGFjaEJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJST1dTRV9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJyb3dzZUJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRV9UWVBFX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hhbmdlVHlwZUJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xlYXJCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxldGVCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNFTEVDVF9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2VsZWN0QnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVUQUNIX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGV0YWNoQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9XTl9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvd25CdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRFUl9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm9yZGVyQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRCdXR0b25fdGV4dDsgCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVtb3ZlQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2VsZWN0QnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy51cEJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfSElTVE9SWV9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnZpZXdIaXN0b3J5QnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxXQVlTX0JVVFRPTl9URVhUID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuQUxXQVlTOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVWRVJfQlVUVE9OX1RFWFQgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5ORVZFUjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST01QVF9CVVRUT05fVEVYVCA9IE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ0FURUdPUklFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHVibGlzaF9jYXRlZ29yaWVzX3RleHQ7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQnJvd3NpbmdQZXJzcGVjdGl2ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0Jyb3dzaW5nUGVyc3BlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGQ3Mzk2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQnJvd3NpbmdQZXJzcGVjdGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhlIE1ldGhvZCBCcm93c2luZyBwZXJzcGVjdGl2ZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCcm93c2luZ1BlcnNwZWN0aXZlIGltcGxlbWVudHMgSVBlcnNwZWN0aXZlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgcGVyc3BlY3RpdmUgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU1BFQ1RJVkVfSUQgPSBCcm93c2luZ1BlcnNwZWN0aXZlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5I2NyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJbGF5b3V0LnNldEVkaXRvckFyZWFWaXNpYmxlKGZhbHNlKTsKLQkJU3RyaW5nIGVkaXRvckFyZWEgPSBsYXlvdXQuZ2V0RWRpdG9yQXJlYSgpOwotCQlsYXlvdXQuYWRkVmlldyhDb25maWd1cmF0aW9uVmlldy5WSUVXX0lELCBJUGFnZUxheW91dC5MRUZULCAwLjMwZiwKLQkJCQllZGl0b3JBcmVhKTsKLQkJUGVyc3BlY3RpdmVMaXN0VXRpbC5hZGRQZXJzcGVjdGl2ZVNob3J0TGlzdChsYXlvdXQpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoaXMgcGVyc3BlY3RpdmUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW4oKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkuZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQkJCWlmICh3aW5kb3dzICE9IG51bGwgJiYgd2luZG93cy5sZW5ndGggPiAwKSB7Ci0JCQkJCXdpbmRvdyA9IHdpbmRvd3NbMF07Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnNob3dQZXJzcGVjdGl2ZShQRVJTUEVDVElWRV9JRCwKLQkJCQkJCXdpbmRvdyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCSJGYWlsZWQgdG8gb3BlbiBicm93c2luZyBwZXJzcGVjdGl2ZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9QZXJzcGVjdGl2ZUxpc3RVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUGVyc3BlY3RpdmVMaXN0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYWNjZDgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9QZXJzcGVjdGl2ZUxpc3RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciB0aGUgQXV0aG9yaW5nIGFuZCBCcm93c2luZyBwZXJzcGVjdGl2ZXMuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVMaXN0VXRpbCB7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIEJyb3dzaW5nIGFuZCBBdXRob3JpbmcgcGVyc3BlY3RpdmUgc2hvcnRjdXRzIHRvIHRoZSBnaXZlbiBwYWdlCi0JICogbGF5b3V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQZXJzcGVjdGl2ZVNob3J0TGlzdChJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJbGF5b3V0LmFkZFBlcnNwZWN0aXZlU2hvcnRjdXQoQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCWxheW91dC5hZGRQZXJzcGVjdGl2ZVNob3J0Y3V0KEF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlIGlzIHRoZSBBdXRob3JpbmcKLQkgKiBwZXJzcGVjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdXRob3JpbmdQZXJzcGVjdGl2ZSgpIHsKLQkJU3RyaW5nIGFjdGl2ZVBlcnNwZWN0aXZlSWQgPSBQZXJzcGVjdGl2ZVV0aWwuZ2V0QWN0aXZlUGVyc3BlY3RpdmVJZCgpOwotCQlpZiAoYWN0aXZlUGVyc3BlY3RpdmVJZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gYWN0aXZlUGVyc3BlY3RpdmVJZAotCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlIGlzIHRoZSBCcm93c2luZwotCSAqIHBlcnNwZWN0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Jyb3dzaW5nUGVyc3BlY3RpdmUoKSB7Ci0JCVN0cmluZyBhY3RpdmVQZXJzcGVjdGl2ZUlkID0gUGVyc3BlY3RpdmVVdGlsLmdldEFjdGl2ZVBlcnNwZWN0aXZlSWQoKTsKLQkJaWYgKGFjdGl2ZVBlcnNwZWN0aXZlSWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGFjdGl2ZVBlcnNwZWN0aXZlSWQKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTg5NjFjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjA1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBGb3JtIFBhZ2UgVGl0bGVzCi1hc3NpZ25QYWdlX3RpdGxlPUFzc2lnbgotY2F0ZWdvcmllc1BhZ2VfdGl0bGU9Q2F0ZWdvcmllcwotZGVsaXZlcmFibGVQYXJ0c1BhZ2VfdGl0bGU9RGVsaXZlcmFibGUgUGFydHMKLWRlc2NyaXB0aW9uUGFnZV90aXRsZT1EZXNjcmlwdGlvbgotZGlzY2lwbGluZXNQYWdlX3RpdGxlPURpc2NpcGxpbmVzCi1kaXNjYXJkdW5yZXNvbHZlZHJlZj1EaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcwotZ3VpZGFuY2VQYWdlX3RpdGxlPUd1aWRhbmNlCi1wcmV2aWV3UGFnZV90aXRsZT1QcmV2aWV3Ci1yZWZlcmVuY2VzUGFnZV90aXRsZT1SZWZlcmVuY2VzCi1yZWZlcmVuY2VfdGV4dD1SZWZlcmVuY2VzOgotcmVmZXJlbmNlV29ya2Zsb3dQYWdlX3RpdGxlPVJlZmVyZW5jZSBXb3JrZmxvdwotcm9sZXNQYWdlX3RpdGxlPVJvbGVzCi1yb2xlU2V0c1BhZ2VfdGl0bGU9Um9sZSBTZXRzCi1zdGVwc1BhZ2VfdGl0bGU9U3RlcHMKLXRhc2tzUGFnZV90aXRsZT1UYXNrcwotdG9vbE1lbnRvcnNQYWdlX3RpdGxlPVRvb2wgTWVudG9ycwotd29ya1Byb2R1Y3RzUGFnZV90aXRsZT1Xb3JrIFByb2R1Y3RzCi0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uCi1jaGVja0l0ZW1zU2VjdGlvbl9uYW1lPUNoZWNrIEl0ZW1zCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPVNwZWNpZnkgdGhlIGNoZWNrIGl0ZW1zIHRoYXQgY29uc3RpdHV0ZSB0aGlzIGNoZWNrbGlzdC4KLWRlcGVuZGVuY2llc1NlY3Rpb25fbmFtZT1EZXBlbmRlbmNpZXMKLWRlcGVuZGVuY2llc1NlY3Rpb25fZGVzYz1UaGlzIHNlY3Rpb24gZGlzcGxheXMgZGVwZW5kZW5jaWVzIG9mIHRoaXMgY29udGVudCBwYWNrYWdlIHRvIG90aGVyIGNvbnRlbnQgcGFja2FnZXMuCi1kZXRhaWxTZWN0aW9uX25hbWU9RGV0YWlsIEluZm9ybWF0aW9uCi1kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHswfS4KLWdlbmVyYWxJbmZvU2VjdGlvbl9uYW1lPUdlbmVyYWwgSW5mb3JtYXRpb24KLWdlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHswfS4KLWljb25TZWN0aW9uX25hbWU9SWNvbgotaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHswfS4KLW5vdGF0aW9uU2VjdGlvbl9uYW1lPURlbGl2ZXJ5IEluZm9ybWF0aW9uCi1ub3RhdGlvblNlY3Rpb25fZGVzYz1Qcm92aWRlIGRlbGl2ZXJ5IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX25hbWU9UmVmZXJlbmNlZCBQbHVnLWluczoKLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9kZXNjPVRoaXMgc2VjdGlvbiBkaXNwbGF5cyBwbHVnLWlucyByZWZlcmVuY2VkIGJ5IHRoaXMgbWV0aG9kIHBsdWctaW4uCi1zdGFmZmluZ1NlY3Rpb25fbmFtZT1TdGFmZmluZyBJbmZvcm1hdGlvbgotc3RhZmZpbmdTZWN0aW9uX2Rlc2M9UHJvdmlkZSBzdGFmZmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGUuCi1zdGVwc1NlY3Rpb25fbmFtZT1TdGVwcwotc3RlcHNTZWN0aW9uX2Rlc2M9U3BlY2lmeSB0aGUgc3RlcHMgdG8gcGVyZm9ybSB0aGlzIHRhc2suCi10YWlsb3JpbmdTZWN0aW9uX25hbWU9VGFpbG9yaW5nCi10YWlsb3JpbmdTZWN0aW9uX2Rlc2M9UHJvdmlkZSB0YWlsb3JpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB7MH0uCi12YXJpYWJpbGl0eVNlY3Rpb25fbmFtZT1Db250ZW50IFZhcmlhYmlsaXR5Ci12YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHswfSByZWxhdGVzIHRvIGFub3RoZXIgezB9LgotdmVyc2lvbkluZm9TZWN0aW9uX25hbWU9VmVyc2lvbiBJbmZvcm1hdGlvbgotdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotCi0jIFVJICYgRWxlbWVudCBBdHRyaWJ1dGUgTGFiZWxzCi1hZGRpdGlvbmFsSW5mb190ZXh0PUFkZGl0aW9uYWwgaW5mb3JtYXRpb246Ci1hcHBsaWNhdGlvbl90ZXh0PUFwcGxpY2F0aW9uOgotYWN0aW9uTGFiZWxfZWRpdD0mRWRpdAotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj0mU2hvdyBpbiBMaWJyYXJ5IFZpZXcKLWFsdGVybmF0aXZlc190ZXh0PUFsdGVybmF0aXZlczoKLWFzc2lnbm1lbnRBcHByb2FjaGVzX3RleHQ9QXNzaWdubWVudCBhcHByb2FjaGVzOgotYXV0aG9yc190ZXh0PUF1dGhvcnM6Ci1iYWNrZ3JvdW5kX3RleHQ9QmFja2dyb3VuZDoKLWJhc2VFbGVtZW50X3RleHQ9QmFzZToKLWJhc2VHdWlkYW5jZV90ZXh0PUJhc2UgZ3VpZGFuY2U6Ci1icmllZkRlc2NyaXB0aW9uX3RleHQ9QnJpZWYgZGVzY3JpcHRpb246Ci1kZXNjcmlwdGlvbl90ZXh0PURlc2NyaXB0aW9uOgotYmFja3VwYmVmb3Jlc2F2ZV90ZXh0PUJhY2sgdXAgYmVmb3JlIHNhdmUKLWJyaWVmT3V0bGluZV90ZXh0PUJyaWVmIG91dGxpbmU6Ci1jaGFuZ2VEYXRlX3RleHQ9Q2hhbmdlIGRhdGU6Ci1jaGFuZ2VEZXNjcmlwdGlvbl90ZXh0PUNoYW5nZSBkZXNjcmlwdGlvbjoKLWNoZWNrSXRlbXNfdGV4dD1DaGVjayBJdGVtcwotY29udHJpYnV0ZXNfdGV4dD1Db250cmlidXRlcwotbG9jYWxDb250cmlidXRlc190ZXh0PUxvY2FsQ29udHJpYnV0ZXMKLWNvbnRyaWJ1dGVzX3RvX3RleHQ9Q29udHJpYnV0ZXMgdG8KLWNvcHlyaWdodF90ZXh0PUNvcHlyaWdodDoKLWVkaXRvcl90ZXh0PUVkaXRvcgotZXh0ZW5kc190ZXh0PUV4dGVuZHMKLWV4dGVuZF90ZXh0PUV4dGVuZAotZXh0ZXJuYWxEZXNjcmlwdGlvbl90ZXh0PUV4dGVybmFsIGRlc2NyaXB0aW9uOgotZXh0ZXJuYWxJZF90ZXh0PUV4dGVybmFsIElEOgotZ29hbHNfdGV4dD1Hb2FsczoKLWltcGFjdE9mTm90SGF2aW5nX3RleHQ9SW1wYWN0IG9mIG5vdCBoYXZpbmc6Ci1rZXlDb25zaWRlcmF0aW9uc190ZXh0PUtleSBjb25zaWRlcmF0aW9uczoKLWxldmVsc09mQWRvcHRpb25fdGV4dD1MZXZlbCBvZiBhZG9wdGlvbjoKLW1haW5EZXNjcmlwdGlvbl90ZXh0PU1haW4gZGVzY3JpcHRpb246Ci1uZXdFbGVtZW50X3RleHQ9TmV3IHswfQotbmFtZV90ZXh0PU5hbWU6Ci1ub3RBcHBsaWNhYmxlX3RleHQ9Tm90IGFwcGxpY2FibGUKLXBhY2thZ2luZ0d1aWRhbmNlX3RleHQ9UGFja2FnaW5nIGd1aWRhbmNlOgotcHJlc2VudGF0aW9uTmFtZV90ZXh0PVByZXNlbnRhdGlvbiBuYW1lOgotcHJvbXB0Zm9ybGliYXJ5X3RleHQ9UHJvbXB0IGZvciBtZXRob2QgbGlicmFyeSBvbiBzdGFydHVwCi1lbmFibGVIZWFsdGhDaGVja190ZXh0PUVuYWJsZSBpbnRlcm5hbCBkZWJ1ZyB0b29scwotcHJvYmxlbV90ZXh0PVByb2JsZW06Ci1wdXJwb3NlX3RleHQ9UHVycG9zZToKLXJlYXNvbkZvck5vdE5lZWRpbmdfdGV4dD1SZWFzb24gZm9yIG5vdCBuZWVkaW5nOgotcmVwbGFjZXNfdGV4dD1SZXBsYWNlcwotbG9jYWxSZXBsYWNlc190ZXh0PUxvY2FsUmVwbGFjZXMKLWV4dGVuZHNSZXBsYWNlc190ZXh0PUV4dGVuZHNSZXBsYWNlcwotcmVwcmVzZW50YXRpb25PcHRpb25zX3RleHQ9UmVwcmVzZW50YXRpb24gb3B0aW9uczoKLWF0dGFjaGVkRmlsZV90ZXh0PUF0dGFjaGVkIGZpbGUocyk6Ci1za2lsbHNfdGV4dD1Ta2lsbHM6Ci1zdGVwc190ZXh0PVN0ZXBzOgotc3RlcHNfbmFtZV90ZXh0PU5hbWU6Ci1zdG9wX3RleHQ9U3RvcAotcHJpbnRfdGV4dD1QcmludAotc3lub255bXNfdGV4dD1TeW5vbnltczoKLXR5cGVfdGV4dD1UeXBlOgotY29weV90ZXh0PUNvcHkKLWRlZXBDb3B5X3RleHQ9RGVlcCBDb3B5Ci1iYWNrX3RleHQ9QmFjawotbmV3X3BsdWdpbj1OZSZ3IE1ldGhvZCBQbHVnLWluCi1tb3ZlPSZNb3ZlLi4uCi11bmlxdWVJZF90ZXh0PVVuaXF1ZSBJRDoKLXZhcmlhYmlsaXR5VHlwZV90ZXh0PVZhcmlhYmlsaXR5IHR5cGU6Ci12ZXJzaW9uX3RleHQ9VmVyc2lvbjoKLQotIyBCdXR0b24gTGFiZWxzCi1hZGRCdXR0b25fdGV4dD1BZGQuLi4KLWF0dGFjaEJ1dHRvbl90ZXh0PUF0dGFjaC4uLgotYnJvd3NlQnV0dG9uX3RleHQ9QnJvd3NlLi4uCi1jaGFuZ2VUeXBlQnV0dG9uX3RleHQ9Q2hhbmdlIFR5cGUuLi4KLWNsZWFyQnV0dG9uX3RleHQ9Q2xlYXIKLWRlbGV0ZUJ1dHRvbl90ZXh0PURlbGV0ZQotZGV0YWNoQnV0dG9uX3RleHQ9RGV0YWNoCi1kaWFncmFtX3NhdmVFcnJvcj1FcnJvciBzYXZpbmcgZGlhZ3JhbQotZG93bkJ1dHRvbl90ZXh0PURvd24KLWRpcmVjdG9yeV90ZXh0PURpcmVjdG9yeToKLW9yZGVyQnV0dG9uX3RleHQ9T3JkZXIKLWVkaXRCdXR0b25fdGV4dD1FZGl0Li4uCi1yZW1vdmVCdXR0b25fdGV4dD1SZW1vdmUKLXJlbmFtZUFjdGlvbl90ZXh0PVJlbiZhbWUuLi4KLXJlbW92ZV90ZXh0PVJlbW92ZQotcmVuYW1lX3RleHQ9UmVuYW1lCi1TYXZlQXNfdGV4dD1TYXZlIEFzCi1zZWxlY3RCdXR0b25fdGV4dD1TZWxlY3QuLi4KLWRlc2VsZWN0QnV0dG9uX3RleHQ9RGVzZWxlY3QKLXVwQnV0dG9uX3RleHQ9VXAKLW1ha2VEZWZhdWx0QnV0dG9uX3RleHQ9TWFrZSBEZWZhdWx0Ci12aWV3SGlzdG9yeUJ1dHRvbl90ZXh0PVZpZXcgSGlzdG9yeS4uLgotCi0jIFJvbGUgRWRpdG9yIFRhc2tzIFBhZ2UKLXJvbGVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9VGFza3MKLXJvbGVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVRoaXMgcm9sZSBpcyB0aGUgcGVyZm9ybWVyIG9mIHRoZSBmb2xsb3dpbmcgdGFza3MuCi1yb2xlVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB0YXNrcwotcm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsPVByaW1hcnkgcGVyZm9ybWVyOgotcm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsMj1BZGRpdGlvbmFsIHBlcmZvcm1lcjoKLXJvbGVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gdGFza3MgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFJvbGUgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9V29yayBQcm9kdWN0czoKLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHdvcmsgcHJvZHVjdHMgdGhhdCB0aGlzIHJvbGUgaXMgcmVzcG9uc2libGUgZm9yLgotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHdvcmsgcHJvZHVjdHM6Ci1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVJlc3BvbnNpYmxlIGZvcjoKLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPVdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgb3V0cHV0IG9mIHRhc2tzIHRoYXQgdGhpcyByb2xlIHBlcmZvcm1zOgotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gd29yayBwcm9kdWN0cyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgUm9sZSBFZGl0b3IgR3VpZGFuY2UgUGFnZQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1HdWlkYW5jZQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBsaW5rcyB0byBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtIG9mIGd1aWRhbmNlLgotcm9sZUd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgR3VpZGFuY2U6Ci1yb2xlR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9R3VpZGFuY2U6Ci1yb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGd1aWRhbmNlIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBSb2xlIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UKLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRlZ29yaWVzOgotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyByb2xlIGJlbG9uZ3MuCi1yb2xlQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9Um9sZSBTZXRzOgotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1DdXN0b20gQ2F0ZWdvcmllczoKLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPVJvbGUgc2V0czoKLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1DdXN0b20gY2F0ZWdvcmllczoKLQotIyBUYXNrIEVkaXRvciBSb2xlcyBQYWdlCi10YXNrUm9sZXNQYWdlX3NlY3Rpb25OYW1lPVJvbGVzCi10YXNrUm9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Bc3NpZ24gdGhlIHJvbGVzIHRvIHBlcmZvcm0gdGhpcyB0YXNrLgotdGFza1JvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgcm9sZXM6Ci10YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9UHJpbWFyeSBwZXJmb3JtZXI6Ci10YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUFkZGl0aW9uYWwgcGVyZm9ybWVyczoKLXRhc2tSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gcm9sZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotdGFza1JvbGVzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX21vZGlmeV9tZXNzYWdlPUlVUEEwMDA0NVc6IERvIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgcHJpbWFyeSBwZXJmb3JtZXIgdG8gJyd7MH0nJz8KLXRhc2tSb2xlc1BhZ2VfY29uZmlybV90aXRsZT1Db25maXJtIHByaW1hcnkgcm9sZSBjaGFuZ2UKLQotIyBUYXNrIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UKLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVdvcmsgUHJvZHVjdHMKLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMgZm9yIHRoaXMgdGFzay4KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBXb3JrIFByb2R1Y3RzCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPU1hbmRhdG9yeSBpbnB1dHM6Ci10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1PcHRpb25hbCBpbnB1dHM6Ci10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMz1PdXRwdXRzOgotdGFza1dvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gd29yayBwcm9kdWN0cyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgVGFzayBFZGl0b3IgR3VpZGFuY2UgUGFnZQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1HdWlkYW5jZQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBsaW5rcyB0byBhZGR0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YgZ3VpZGFuY2UuCi10YXNrR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBHdWlkYW5jZToKLXRhc2tHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1HdWlkYW5jZToKLXRhc2tHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gZ3VpZGFuY2VzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBUYXNrIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UKLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRlZ29yaWVzCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRhc2sgYmVsb25ncy4KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1EaXNjaXBsaW5lcwotdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1DdXN0b20gQ2F0ZWdvcmllcwotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9RGlzY2lwbGluZXM6Ci10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9Q3VzdG9tIGNhdGVnb3JpZXM6Ci0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBUYXNrcyBQYWdlCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uTmFtZT1UYXNrcwotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPVRoaXMgd29yayBwcm9kdWN0IGlzIGFuIGlucHV0IG9yIG91dHB1dCBmb3IgdGhlIGZvbGxvd2luZyB0YXNrcy4KLVdvcmtQcm9kdWN0X1Rhc2tzX0F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB0YXNrcwotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbD1NYW5kYXRvcnkgaW5wdXQ6Ci1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMj1PcHRpb25hbCBpbnB1dDoKLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwzPU91dHB1dDoKLVdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRhc2tzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIFJvbGVzIFBhZ2UKLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVJvbGVzCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249VGhlIGZvbGxvd2luZyByb2xlcyBhcmUgcmVzcG9uc2libGUgZm9yIG9yIG1vZGlmeSB0aGlzIHdvcmsgcHJvZHVjdC4KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSByb2xlcwotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZXNwb25zaWJsZSByb2xlOgotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9TW9kaWZ5aW5nIHJvbGVzOgotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gcm9sZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIyBXb3JrIFByb2R1Y3QgRWRpdG9yIERlbGl2ZXJhYmxlIFBhcnRzIFBhZ2UKLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU9RGVsaXZlcmFibGUgUGFydHMKLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIHdvcmsgcHJvZHVjdHMgdGhhdCBjb25zdGl0dXRlIHRoaXMgZGVsaXZlcmFibGUuCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB3b3JrIHByb2R1Y3RzIGFzIGRlbGl2ZXJhYmxlIHBhcnRzOgotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWxlY3RlZExhYmVsPVdvcmsgcHJvZHVjdHMgYXMgZGVsaXZlcmFibGUgcGFydHM6Ci13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHdvcmsgcHJvZHVjdHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgR3VpZGFuY2UgUGFnZQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9R3VpZGFuY2UKLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGxpbmtzIHRvIGFkZHRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiBndWlkYW5jZS4KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBHdWlkYW5jZToKLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9R3VpZGFuY2U6Ci13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBndWlkYW5jZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUNhdGVnb3JpZXMKLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHdvcmsgcHJvZHVjdCBiZWxvbmdzLgotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1Eb21haW5zCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1Xb3JrIFByb2R1Y3QgS2luZHM6Ci13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMz1DdXN0b20gQ2F0ZWdvcmllczoKLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Eb21haW46Ci13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVdvcmsgcHJvZHVjdCBraW5kczoKLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDM9Q3VzdG9tIGNhdGVnb3JpZXM6Ci0KLSMgUHJhY3RpY2UgRWRpdG9yIFJlZmVyZW5jZXMgUGFnZQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uTmFtZT1Db250ZW50IEVsZW1lbnRzCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBjb250ZW50IGVsZW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhpcyBwcmFjdGljZS4KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIGNvbnRlbnQgZWxlbWVudHM6Ci1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw9Q29udGVudCBlbGVtZW50czoKLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gQ29udGVudCBlbGVtZW50cyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgQ2F0ZWdvcnkgRWRpdG9yIEd1aWRhbmNlIFBhZ2UKLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZT1HdWlkYW5jZQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlIHRoYXQgYmVsb25nIHRvIHRoaXMgezB9LgotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBndWlkYW5jZToKLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPUd1aWRhbmNlOgotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGd1aWRhbmNlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgRGlzY2lwbGluZSBHcm91cGluZyBFZGl0b3IgRGlzY2lwbGluZXMgUGFnZQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25OYW1lPURpc2NpcGxpbmVzCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZGlzY2lwbGluZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBkaXNjaXBsaW5lIGdyb3VwaW5nLgotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBEaXNjaXBsaW5lczoKLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWxlY3RlZExhYmVsPURpc2NpcGxpbmVzOgotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IERpc2NpcGxpbmVzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfVXNlRGVmYXVsdERpcmVjdG9yeUJ1dHRvbkxhYmVsPVVzZSBkZWZhdWx0IGRpcmVjdG9yeQotCi0jIERpc2NpcGxpbmUgRWRpdG9yIFRhc2tzIFBhZ2UKLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9VGFza3MKLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgdGFza3MgdGhhdCBiZWxvbmcgdG8gdGhpcyBkaXNjaXBsaW5lLgotZGlzY2lwbGluZVRhc2tzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgdGFza3M6Ci1kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9VGFza3M6Ci1kaXNjaXBsaW5lVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRhc2tzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBEaXNjaXBsaW5lIEVkaXRvciBSZWZlcmVuY2UgV29ya2Zsb3cgUGFnZQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uTmFtZT1SZWZlcmVuY2UgV29ya2Zsb3dzCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIHJlZmVyZW5jZSB3b3JrZmxvd3MgdGhhdCBiZWxvbmcgdG8gdGhpcyBkaXNjaXBsaW5lLgotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgUmVmZXJlbmNlIFdvcmtmbG93czoKLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZWZlcmVuY2Ugd29ya2Zsb3dzOgotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBSZWZlcmVuY2Ugd29ya2Zsb3dzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBEb21haW4gRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Xb3JrIFByb2R1Y3RzCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIHdvcmsgcHJvZHVjdHMgdGhhdCBiZWxvbmcgdG8gdGhpcyBkb21haW4uCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB3b3JrIHByb2R1Y3RzOgotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVdvcmsgcHJvZHVjdHM6Ci1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHdvcmsgcHJvZHVjdHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFdvcmsgUHJvZHVjdCBLaW5kIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UKLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9V29yayBQcm9kdWN0cwotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSB3b3JrIHByb2R1Y3RzIHRoYXQgYmVsb25nIHRvIHRoaXMgd29yayBwcm9kdWN0IGtpbmQuCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB3b3JrIHByb2R1Y3RzOgotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVdvcmsgcHJvZHVjdHM6Ci13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHdvcmsgcHJvZHVjdHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFJvbGUgU2V0IEdyb3VwaW5nIEVkaXRvciBSb2xlIFNldHMgUGFnZQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPVJvbGUgU2V0cwotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIHJvbGUgc2V0cyB0aGF0IGJlbG9uZyB0byB0aGlzIHJvbGUgc2V0IGdyb3VwaW5nLgotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBSb2xlIFNldHM6Ci1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Sb2xlIHNldHM6Ci1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gUm9sZSBTZXRzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBSb2xlIFNldCBFZGl0b3IgUm9sZXMgUGFnZQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1Sb2xlcwotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSByb2xlcyB0aGF0IGJlbG9uZyB0byB0aGlzIHJvbGUgc2V0Lgotcm9sZVNldFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgcm9sZXM6Ci1yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9Um9sZXM6Ci1yb2xlU2V0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHJvbGVzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBUb29sIEVkaXRvciBUb29sIE1lbnRvcnMgUGFnZQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uTmFtZT1Ub29sIE1lbnRvcnMKLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgdG9vbCBtZW50b3JzIHRoYXQgYmVsb25nIHRvIHRoaXMgdG9vbC4KLXRvb2xUb29sTWVudG9yc1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHRvb2wgbWVudG9yczoKLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Ub29sIG1lbnRvcnM6Ci10b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFRvb2wgTWVudG9ycyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgQ3VzdG9tIENhdGVnb3J5IEVkaXRvciBBc3NpZ24gUGFnZQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lPUNvbnRlbnQgRWxlbWVudHMKLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSBjb250ZW50IGVsZW1lbnRzIHRoYXQgY29uc3RpdHV0ZSB0aGlzIGN1c3RvbSBjYXRlZ29yeS4KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgQ29udGVudCBFbGVtZW50czoKLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWxlY3RlZExhYmVsPUNvbnRlbnQgZWxlbWVudHM6Ci1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gQ29udGVudCBFbGVtZW50cyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgTmV3IE1ldGhvZCBQbHVnLWluIFdpemFyZAotbmV3UGx1Z2luV2l6YXJkX3RpdGxlPU5ldyBNZXRob2QgUGx1Zy1pbgotbmV3UGx1Z2luV2l6YXJkUGFnZV90aXRsZT1DcmVhdGUgYSBuZXcgbWV0aG9kIHBsdWctaW4KLW5ld1BsdWdpbldpemFyZFBhZ2VfdGV4dD1TcGVjaWZ5IGEgbmFtZSBhbmQgcHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXcgbWV0aG9kIHBsdWctaW4uCi1uZXdQbHVnaW5FcnJvcl9tc2c9SVVQQTAwMjFFOiBGYWlsZWQgdG8gY3JlYXRlIHRoZSBtZXRob2QgcGx1Zy1pbi4KLW5ld1BsdWdpbkVycm9yX3JlYXNvbj1JbnRlcm5hbCBlcnJvci5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotIyBHZW5lcmljIGRpYWxvZyB0aXRsZXMKLWNyZWF0ZURpYWxvZ190aXRsZT1DcmVhdGUgRWxlbWVudAotZGVsZXRlRGlhbG9nX3RpdGxlPURlbGV0ZSBFbGVtZW50Ci1lZGl0RGlhbG9nX3RpdGxlPUVkaXQgRWxlbWVudAotZXJyb3JEaWFsb2dfdGl0bGU9RXJyb3IKLW1vdmVEaWFsb2dfdGl0bGU9TW92ZSBFbGVtZW50Ci1yZW5hbWVEaWFsb2dfdGl0bGU9UmVuYW1lIEVsZW1lbnQKLXdhcm5pbmdEaWFsb2dfdGl0bGU9V2FybmluZwotCi0jIEFkZCBDb25maWd1cmF0aW9uIHRvIFByb2Nlc3MgRXJyb3IgRGlhbG9nCi1hZGRDb25maWdFcnJvckRpYWxvZ190aXRsZT1BZGQgQ29uZmlndXJhdGlvbiB0byBQcm9jZXNzCi0KLSMgU2V0IERlZmF1bHQgQ29uZmlndXJhdGlvbiBFcnJvciBEaWFsb2cKLXNldERlZmF1bHRDb25maWdFcnJvckRpYWxvZ190aXRsZT1TZXQgRGVmYXVsdCBDb25maWd1cmF0aW9uIGZvciBQcm9jZXNzCi0KLSMgRWRpdCBQcm9jZXNzIEVycm9yIERpYWxvZwotZWRpdFByb2Nlc3NFbGVtZW50RXJyb3JEaWFsb2dfdGl0bGU9RWRpdCBQcm9jZXNzIEVsZW1lbnQKLQotIyBPcGVuIExpYnJhcnkgRGlhbG9nCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1PcGVuIE1ldGhvZCBMaWJyYXJ5Ci1vcGVuTGlicmFyeURpYWxvZ190ZXh0PVRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IHdhcyBub3Qgc2F2ZWQgcHJvcGVybHkuIERvIHlvdSB3YW50IHRvIGlnbm9yZSB0aGUgZXJyb3IgYW5kIHByb2NlZWQgdG8gb3BlbiBhbm90aGVyIGxpYnJhcnk/Ci0KLSMgU2F2ZSBMaWJyYXJ5IERpYWxvZwotc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGU9U2F2ZSBNZXRob2QgTGlicmFyeQotc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dD1UaGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBoYXMgYmVlbiBtb2RpZmllZC4gRG8geW91IHdhbnQgdG8gc2F2ZSB0aGUgY2hhbmdlcz8KLQotIyBVcGdyYWRlIExpYnJhcnkgRGlhbG9nCi11cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZT1VcGdyYWRlIE1ldGhvZCBMaWJyYXJ5Ci0KLSMgRGVsZXRlIEVsZW1lbnQgUmVmZXJlbmNlIERpYWxvZwotZGVsZXRlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD1UaGUgZWxlbWVudCAnJ3swfScnIGhhcyBhbHJlYWR5IGJlZW4gZGVsZXRlZC4gRG8geW91IHdhbnQgdG8gcmVtb3ZlIGl0IGZyb20gJyd7MX0nJz8KLQotIyBFcnJvciBNZXNzYWdlcwotbm9PcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwMEU6IE5vIG9wZW4gbWV0aG9kIGxpYnJhcnkuXG5cbkEgbWV0aG9kIGxpYnJhcnkgbXVzdCBiZSBvcGVuZWQgYmVmb3JlIGEgbmV3IG1ldGhvZCBlbGVtZW50IGNhbiBiZSBhZGRlZC5cblxuQ3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5IG9yIG9wZW4gYW4gZXhpc3Rpbmcgb25lIGFuZCB0cnkgYWdhaW4uCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEEwMDAxRTogVGhlIHswfSBuYW1lIGlzIG1pc3NpbmcuXG5cbkFsbCBtZXRob2QgYW5kIHByb2Nlc3MgZWxlbWVudHMgbXVzdCBoYXZlIGEgbmFtZS5cblxuQ2xpY2sgT0sgYW5kIGVudGVyIGEgdmFsaWQgbmFtZSBmb3IgdGhlIGVsZW1lbnQuCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBBMDAwMkU6IFRoZSBuYW1lICcnezB9JycgYWxyZWFkeSBleGlzdHMuXG5cbkEgbWV0aG9kIGVsZW1lbnQgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUuXG5cbkNsaWNrIE9LIGFuZCBlbnRlciBhIGRpZmZlcmVudCBuYW1lIGZvciB0aGUgZWxlbWVudC4KLWNyZWF0ZUNvbmZpZ0Vycm9yX21zZz1JVVBBMDAwM0U6IFRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBjYW5ub3QgYmUgY3JlYXRlZC4KLWRlbGV0ZUNvbmZpZ0Vycm9yX21zZz1JVVBBMDAwNFc6IFRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBjYW5ub3QgYmUgZGVsZXRlZC4KLWludGVybmFsRXJyb3JfbXNnPUlVUEEwMDA1RTogQW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLlxuXG5DbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotaW52YWxpZFByZXNlbnRhdGlvbk5hbWVFcnJvcl9tc2c9SVVQQTAwMDZFOiBUaGUgc3BlY2lmaWVkIHByZXNlbnRhdGlvbiBuYW1lIGlzIGludmFsaWQuXG5cbkNsaWNrIE9LIGFuZCBlbnRlciBhIGRpZmZlcmVudCBuYW1lLgotaW52YWxpZENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwN0U6IFRoZSBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbiAnJ3swfScnIGlzIG5vdCBhIHN1YnNldCBvZiB0aGUgcHJvY2VzcycncyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uXG5cbkluIG9yZGVyIHRvIG1haW50YWluIHRoZSBpbnRlZ3JpdHkgb2YgYSBwcm9jZXNzLCBpdHMgZGVmYXVsdCBjb25maWd1cmF0aW9uIG11c3QgYmUgYSBzdXBlcnNldCBvZiBhbGwgb3RoZXIgY29uZmlndXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzLlxuXG5TZWxlY3QgYW5vdGhlciBjb25maWd1cmF0aW9uIG9yIG1vZGlmeSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIGluY2x1ZGUgdGhlIGNvbnRlbnQgb2YgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gYW5kIHRyeSBhZ2Fpbi4KLXNldERlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDhFOiBUaGUgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gJyd7MH0nJyBpcyBub3QgYSBzdXBlcnNldCBvZiB0aGUgb3RoZXIgY29uZmlndXJhdGlvbnMgcmVmZXJlbmNlZCBieSB0aGUgcHJvY2Vzcy5cblxuSW4gb3JkZXIgdG8gbWFpbnRhaW4gdGhlIGludGVncml0eSBvZiBhIHByb2Nlc3MsIGl0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBhIHN1cGVyc2V0IG9mIGFsbCBvdGhlciBjb25maWd1cmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3MuXG5cblNlbGVjdCBhbm90aGVyIGNvbmZpZ3VyYXRpb24gb3IgbW9kaWZ5IHRoZSBjb250ZW50IG9mIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGFuZCB0cnkgYWdhaW4uCi1vcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwOUU6IFRoZSBtZXRob2QgbGlicmFyeSBjYW5ub3QgYmUgbG9hZGVkLlxuXG5DbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotc2F2ZUxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTBFOiBUaGUgbWV0aG9kIGxpYnJhcnkgY2Fubm90IGJlIHNhdmVkLgotc2F2ZUxpYnJhcnlUb0Vycm9yX21zZz1JVVBBMDAxMEU6IFRoZSBtZXRob2QgbGlicmFyeSBjYW5ub3QgYmUgc2F2ZWQgdG8gJyd7MH0nJy4KLWVsZW1lbnRBbHJlYWR5RGVsZXRlZEVycm9yX21zZz1JVVBBMDAxMUU6IFRoZSBlbGVtZW50ICcnezB9JycgaGFzIGFscmVhZHkgYmVlbiBkZWxldGVkLgotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTJFOiBUaGUgbWV0aG9kIGxpYnJhcnkgY2Fubm90IGJlIHVwZ3JhZGVkLgotCi0jIEVycm9yIFJlYXNvbnMKLWVycm9yX3JlYXNvbj1JVVBBMDAxNkU6IEFuIGVycm9yIGhhcyBvY2N1cnJlZC5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWludGVybmFsRXJyb3JfcmVhc29uPUlVUEEwMDE3RTogQW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLlxuXG5DbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotdXBncmFkZUxpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMThFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0aGUgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1zYXZlVXBncmFkZWRMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE5RTogQW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIHNhdmluZyB0aGUgdXBncmFkZWQgbWV0aG9kIGxpYnJhcnkuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMKLW9wZW5pbmdMaWJyYXJ5VGFza19uYW1lPU9wZW5pbmcgbWV0aG9kIGxpYnJhcnkuLi4KLXNhdmluZ0xpYnJhcnlUYXNrX25hbWU9U2F2aW5nIG1ldGhvZCBsaWJyYXJ5IC4uLgotdXBncmFkaW5nTGlicmFyeVRhc2tfbmFtZT1VcGdyYWRpbmcgbWV0aG9kIGxpYnJhcnkuLi4KLWxvYWRpbmdMaWJyYXJ5RWxlbWVudHNUYXNrX25hbWU9TG9hZGluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4uLgotc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZT1TYXZpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMgaW4gbmV3IGZpbGUgZm9ybWF0Li4uCi1zYXZpbmdUYXNrX25hbWU9U2F2aW5nICcnezB9JycuLi4KLXNhdmluZ0ZpbGVzVGFza19uYW1lPVNhdmluZyBmaWxlcy4uLgotZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU9Rml4aW5nIGNvbnRlbnQgZGVzY3JpcHRpb24gR1VJRHMuLi4KLWRlbGV0aW5nSW52YWxpZFJlZmVyZW5jZXNUYXNrX25hbWU9RGVsZXRpbmcgaW52YWxpZCByZWZlcmVuY2VzLi4uCi0KLQotIyBBZGQgRWRpdG9yIFRvIEJyb3dzaW5nIFBlcnNwZWN0aXZlIFdhcm5pbmcgRGlhbG9nCi1hZGRFZGl0b3JUb1BlcnNwZWN0aXZlV2FybmluZ19tc2c9SVVQQTAwNDZXOiBUaGlzIHBlcnNwZWN0aXZlIGhhcyBiZWVuIHNwZWNpYWxseSBkZXNpZ25lZCB0byBtYXhpbWl6ZSB5b3VyIHVzZXIgZXhwZXJpZW5jZSBvZiBicm93c2luZyB0aGUgSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuIE5vIGVkaXRvciBjYW4gYmUgYWRkZWQgb3IgZGlzcGxheWVkIGhlcmUuCi0KLSMgQ2hhbmdlIEhpc3RvcnkgRGlhbG9nCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX3RpdGxlPUNoYW5nZSBEZXNjcmlwdGlvbiBIaXN0b3J5Ci1DaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsPUNoYW5nZSBoaXN0b3J5OgotCi0jIE1ldGhvZCBFbGVtZW50IERlbGV0ZSBBY3Rpb24KLWNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU9Q29uZmlybSBEZWxldGlvbgotY29uZmlybURlbGV0ZURpYWxvZ19tc2c9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnPwotY29uZmlybURlbGV0ZURpYWxvZ19tc2dXaXRoUmVmZXJlbmNlPUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJyd7MH0nJz9cblxuVGhlIGZvbGxvd2luZyBlbGVtZW50KHMpIGNvbnRhaW4gcmVmZXJlbmNlcyB0byB0aGUgaXRlbShzKSB0byBiZSBkZWxldGVkOiB7MX0KLQotIyBOZXcgTGlicmFyeSBEaWFsb2cKLWVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjJFOiBUaGUgIG1ldGhvZCBsaWJyYXJ5ICcnezB9JycgY2Fubm90IGJlIGNyZWF0ZWQuCi1lcnJvckRpYWxvZ19lcnJvcj1DYW5ub3QgY3JlYXRlIGEgbWV0aG9kIGxpYnJhcnkgd2l0aGluIGFub3RoZXIgbWV0aG9kIGxpYnJhcnkuCi1lcnJfbm9vcGVubGlicmFyeT1JVVBBMDA0MEU6IE5vIG9wZW4gbWV0aG9kIGxpYnJhcnkuXG5cbkEgbWV0aG9kIGxpYnJhcnkgbXVzdCBiZSBvcGVuZWQgYmVmb3JlIGEgbmV3IG1ldGhvZCBwbHVnLWluIGNhbiBiZSBhZGRlZC5cblxuQ3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5IG9yIG9wZW4gYW4gZXhpc3Rpbmcgb25lIGFuZCB0cnkgYWdhaW4uCi1lcnJfbG9hZGluZ2xpYnJhcnk9RXJyb3IgbG9hZGluZyBsaWJyYXJ5Ci1tc2dfcmVsb2FkTGlicmFyeT1FcnJvciB1bmRvaW5nIHRoZSBmYWlsZWQgZGVsZXRpb24uIFRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IG5lZWRzIHRvIGJlIHJlbG9hZGVkLgotCi0jIFJlbG9hZCBMaWJyYXJ5IERpYWxvZwotcmVsb2FkRGlhbG9nX21lc3NhZ2U9VGhlIGxpYnJhcnkgbmVlZHMgdG8gYmUgcmVsb2FkZWQgdG8gcmVzdG9yZSBpdHMgb3JpZ2luYWwgc3RhdGUuCi1yZWxvYWREaWFsb2dfdGl0bGU9UmVsb2FkIExpYnJhcnkKLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlPU1vdmUgRXJyb3IKLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U9RXJyb3IgZHVyaW5nIG1vdmUKLQotIyBQcm9jZXNzIEZvcm0gRWRpdG9yCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU9U2F2ZQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxPVRoaXMgY2hhbmdlIHdpbGwgYWZmZWN0IGFsbCBkaWFncmFtcyBpbiB5b3VyIHByb2Nlc3MuIFRoZSBlZGl0b3Igd2lsbCBiZSBzYXZlZCBhZnRlciB5b3VyIGNoYW5nZS4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTI9VGhlIGVkaXRvciB3aWxsIGJlIHNhdmVkIGFmdGVyIHlvdXIgY2hhbmdlLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLQotIyBDb25maWd1cmF0aW9uIFZpZXcgUGFnZQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPUNvbmZpcm0gUmVtb3ZpbmcKLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlPUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdmlldyAnJ3swfScnPwotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX3RpdGxlPVdhcm5pbmcKLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb249Q29uZmlndXJhdGlvbjoKLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3cz1Db25maWd1cmF0aW9uIFZpZXdzCi1jb25maWdWaWV3UGFnZV92aWV3cz1WaWV3cwotY29sdW1uc2VsZWN0aW9uX3RleHQ9Q29sdW1uIHNlbGVjdGlvbjoKLWNvbmZpZ1ZpZXdQYWdlX2FkZFZpZXdCdXR0b25UZXh0PUFkZCBWaWV3Li4uCi1jb25maWdWaWV3UGFnZV9yZW1vdmVWaWV3QnV0dG9uVGV4dD1SZW1vdmUgVmlldwotY29uZmlnVmlld1BhZ2VfbWFrZURlZmF1bHRCdXR0b25UZXh0PU1ha2UgRGVmYXVsdAotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNXOiBWaWV3IHdpdGggbmFtZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzLgotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uVGl0bGU9UHVibGlzaGVkIE5hdmlnYXRpb24gVmlld3MKLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvbk1lc3NhZ2U9U3BlY2lmeSB0aGUgdmlld3MgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIHdoZW4gdGhpcyBjb25maWd1cmF0aW9uIGlzIHB1Ymxpc2hlZC4gVG8gY3JlYXRlIGEgdmlldywgY2xpY2sgQWRkIFZpZXcgdG8gc2VsZWN0IGFueSBzdGFuZGFyZCBvciBjdXN0b20gY2F0ZWdvcnkgd2l0aGluIHRoZSBjb25maWd1cmF0aW9uLiAgVGhlIHNlbGVjdGVkIGNhdGVnb3J5IHdpbGwgcmVwcmVzZW50IHRoZSB2aWV3IGFuZCB0aGUgY2F0ZWdvcnkncyBzdWItY2F0ZWdvcmllcyBhbmQgY29udGVudCBlbGVtZW50cyB3aWxsIHJlcHJlc2VudCB0aGUgdmlldydzIHRyZWUgZWxlbWVudHMuCi0KLSMgRGVzY3JpcHRpb24gVGFiCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZT1Db252ZXJ0IEd1aWRhbmNlCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMT1JVVBBMDA0MFc6ICBQbGVhc2Ugc2F2ZSB0aGUgZWRpdG9yIGZpcnN0LgotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTI9VGhlcmUgYXJlIG5vIGNvbXBhdGlibGUgZ3VpZGFuY2UgZm9yIHRoaXMgdHlwZS4KLQotY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZT1Db252ZXJ0IEFjdGl2aXR5Ci0jIEFzc29jaWF0aW9uIEZvcm0gUGFnZQotQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWw9QnJpZWYgZGVzY3JpcHRpb24gb2Ygc2VsZWN0ZWQgZWxlbWVudDoKLQotIyBNZXRob2QgRWxlbWVudCBEZXNjcmlwdGlvbgotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX3RpdGxlPUVudGVyIEVsZW1lbnQgTmFtZQotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX21lc3NhZ2U9VGhlIG5hbWUgZmllbGQgY2Fubm90IGJlIGVtcHR5LgotCi0jIE1ldGhvZCBQbHVnLWluIERlc2NyaXB0aW9uCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZT1EZXNlbGVjdGluZyB0aGUgcmVmZXJlbmNlZCBwbHVnLWluKHMpIGFzc29jaWF0ZWQgd2l0aCBwbHVnLWluICcnezB9Jycgd2lsbCBwcm9kdWNlIGludmFsaWQgcmVsYXRpb25zaGlwcyB0aGF0IHdpbGwgYmUgZGVsZXRlZC5cblxuVGhpcyBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS4gRG8geW91IHdhbnQgdG8gcHJvY2VlZCB3aXRoIHRoaXMgY2hhbmdlPwotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU9WW91IGFyZSBhYm91dCB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBtZXRob2QgcGx1Zy1pbiBmcm9tICcnezB9JycgdG8gbmV3IG5hbWUgJyd7MX0nJy4gVGhpcyBhY3Rpb24gd2lsbCBzYXZlIHRoaXMgZWRpdG9yIGFuZCByZW5hbWVzIHRoZSBwbHVnLWluIGZvbGRlciB0byB0aGUgbmV3IG5hbWUuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWVfdGl0bGU9UmVuYW1lIE1ldGhvZCBQbHVnLWluCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY2Fubm90UmVuYW1lUGx1Z2luRm9sZGVyPUNvdWxkIG5vdCByZW5hbWUgcGx1Z2luIGZvbGRlciB0byBuZXcgbmFtZQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5MYWJlbD1Mb2NrIHBsdWctaW4KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luX21lc3NhZ2U9TG9jayBwbHVnLWluIGNoYW5nZSB3aWxsIHNhdmUgYW5kIGNsb3NlIG9wZW4gZWRpdG9ycyBvZiBlbGVtZW50cyBiZWxvbmcgdG8gcGx1Zy1pbiAnJ3swfScnLiBEbyB5b3Ugd2FudCBwcm9jZWVkIHdpdGggdGhpcyBjaGFuZ2U/Ci0KLSMgUHJvY2VzcyBEZXNjcmlwdGlvbgotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fdGl0bGU9UmVuYW1lCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV9tZXNzYWdlPVlvdSBhcmUgYWJvdXQgdG8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgcHJvY2Vzcy4gVGhpcyB3aWxsIHNhdmUgdGhpcyBlZGl0b3IgYW5kIHJlbmFtZSB0aGUgcHJvY2VzcyBmb2xkZXIgdG8gdGhlIG5ldyBuYW1lLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uRGVzY3JpcHRpb249RGVzY3JpcHRpb246Ci1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25UaXRsZT1Db25maWd1cmF0aW9uCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlPVNwZWNpZnkgYWxsIHRoZSBjb25maWd1cmF0aW9ucyB2YWxpZCBmb3IgdGhpcyBwcm9jZXNzLiBTZWxlY3Qgb25lIGNvbmZpZ3VyYXRpb24gYXMgdGhlIGRlZmF1bHQgYW5kIGl0IG5lZWRzIHRvIGJlIGEgc3VwZXItc2V0IG9mIGFsbCB0aGUgb3RoZXIgY29uZmlndXJhdGlvbnMuCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbnM9Q29uZmlndXJhdGlvbnM6Ci1wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdD0oZGVmYXVsdCkKLVByb2Nlc3NEZXNjcmlwdGlvbl9zZWxlY3RDb25maWd1cmF0aW9uPVNlbGVjdCB0aGUgY29uZmlndXJhdGlvbnMgdG8gYWRkCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0MD1UaGlzIHdpbGwgc2F2ZSB0aGUgY3VycmVudCBlZGl0b3IgYW5kIHRoZSBjaGFuZ2Ugd2lsbCBiZSBwZXJtYW5lbnQuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJyd7MH0nJz8KLVByb2Nlc3NEZWxldGVBY3Rpb25fc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZT1UaGUgZm9sbG93aW5nIGRlc2NyaXB0b3JzIGFyZSBub3QgdXNlZCBhbnl3aGVyZSBhZnRlciBkZWxldGlvbiBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMuXG5TZWxlY3QgZGVzY3JpcHRvcnMgeW91IHdhbnQgdG8gZGVsZXRlLgotCi0jIFZpZXcgSGVscGVyCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfdGl0bGU9TGlicmFyeSBIZWFsdGggQ2hlY2sKLXZpZXdIZWxwZXJfcGVyZm9ybUhlYWx0aENoZWNrPVBlcmZvcm1pbmcgaGVhbHRoIGNoZWNrIG9uIGxpYnJhcnkuLi4KLXZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ19tZXNzYWdlPVRoZSBoZWFsdGggY2hlY2sgb24gb3BlbiBsaWJyYXJ5IGlzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuIFNlZSB0aGUgcmVwb3J0IGluIHRoZSBsb2cgZmlsZS4KLQotIyBBdHRhY2ggR3VpZGFuY2UgRmlsZSBEaWFsb2cKLWF0dGFjaEd1aWRhbmNlRmlsZURpYWxvZ190aXRsZT1BdHRhY2ggRmlsZQotCi0jIENyZWF0ZSBFbGVtZW50IEVycm9yIERpYWxvZwotY3JlYXRlRWxlbWVudERpYWxvZ190aXRsZT1DcmVhdGUgTmV3IHswfQotY3JlYXRlTmV3RWxlbWVudEVycm9yX21zZz1FcnJvciBjcmVhdGluZyBuZXcgezB9LgotCi1kbGdUaXRsZV9yZWxvYWRMaWJyYXJ5PVJlbG9hZCBMaWJyYXJ5Ci1jcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uPVRoZSB7MH0gbmFtZSBjYW5ub3QgYmUgZW1wdHkuXG5cblNwZWNpZnkgYSB2YWxpZCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1kZWxldGVDb25maWdFcnJvcl9yZWFzb249VGhlIGNvbmZpZ3VyYXRpb24gaXMgcmVmZXJlbmNlZCBieSBwcm9jZXNzICcnezB9JycKLQotIyBDaGFuZ2VCb3VuZHNDb21tYW5kCi1nZWZfY2hhbmdlQm91bmRzQ29tbWFuZF9sYWJlbD1DaGFuZ2UgQm91bmRzCi0jIENoYW5nZU5hbWVDb21tYW5kCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw9Q2hhbmdlIE5hbWUKLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF91bmRvTWVzc2FnZT1DYW5ub3QgdW5kbyB0aGUgbmFtZSBjaGFuZ2UuXG5cblVuZG8gbmFtZSBjaGFuZ2UgaXMgbm90IGFsbG93ZWQgaWYgcHJldmlvdXMgbmFtZSBpcyBudWxsLgotIyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZAotZ2VmX2NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kX2xhYmVsPUNoYW5nZSBQcm9wZXJ0eSBWYWx1ZQotIyBDcmVhdGVCZW5kcG9pbnRDb21tYW5kCi1nZWZfY3JlYXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1DcmVhdGUgQmVuZHBvaW50Ci0jIENyZWF0ZUxpbmtDb21tYW5kCi1nZWZfY3JlYXRlTGlua0NvbW1hbmRfbGFiZWw9TGluayBDcmVhdGlvbgotIyBDcmVhdGVOb2RlQ29tbWFuZAotZ2VmX2NyZWF0ZU5vZGVDb21tYW5kX2xhYmVsPUNyZWF0ZSBOZXcgTm9kZQotIyBEZWxldGVCZW5kcG9pbnRDb21tYW5kCi1nZWZfZGVsZXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1EZWxldGUgQmVuZHBvaW50Ci0jIERlbGV0ZUNvbW1hbmQKLWdlZl9kZWxldGVDb21tYW5kX2xhYmVsPURlbGV0ZQotIyBEZWxldGVMaW5rQ29tbWFuZAotZ2VmX2RlbGV0ZUxpbmtDb21tYW5kX2xhYmVsPURlbGV0ZSBDb25uZWN0aW9uCi0jIE1vdmVCZW5kcG9pbnRDb21tYW5kCi1nZWZfbW92ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9TW92ZSBCZW5kcG9pbnQKLSMgUmVjb25uZWN0TGlua0NvbW1hbmQKLWdlZl9yZWNvbm5lY3RMaW5rQ29tbWFuZF9sYWJlbD1SZWNvbm5lY3QgTGluawotCi0jIFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcgotZ2VmX3ZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9VGhlIG5hbWUgY2Fubm90IGJlIGVtcHR5LiBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG5hbWUuCi0jIFZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyCi1nZWZfdmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0PVRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBuYW1lLgotIyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydAotZ2VmX3dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0X3ZhbGlkYXRlTWVzc2FnZT1UaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbmFtZS4KLQotIyBFbGVtZW50c1ZpZXdEZWxldGVBY3Rpb24KLWFjdGlvbnNfRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uX21lc3NhZ2U9VGhlIGNvbmZpZ3VyYXRpb24gJyd7MH0nJyBjYW5ub3QgYmUgZGVsZXRlZCBzaW5jZSBpdCBpcyBzdGlsbCBpbiB1c2UgYnkgcHJvY2VzcyAnJ3sxfScnLgotCi0jIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcgotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JUaXRsZT1EZWxldGUgRXJyb3IKLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yTWVzc2FnZT1VbmhhbmRsZWQgZXhjZXB0aW9uCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclJlYXNvbj1TZWUgZGV0YWlscwotCi0jIE1ldGhvZEVsZW1lbnRFZGl0b3IKLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZT1TYXZlIEVycm9yCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTE9SVVQQTAwMjBFOiBFcnJvciBzYXZpbmcgZmlsZQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UyPUNvbW1pdCBFcnJvcgotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjE9U2VlIGxvZyBmaWxlIGZvciBtb3JlIGRldGFpbHMKLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24yPVNlZSBkZXRhaWxzCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JUaXRsZT1SZW5hbWUgRXJyb3IKLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yTXNnPU9uZSBvciBtYW55IGZpbGVzIG9mIHRoaXMgZWRpdG9yIGhhdmUgYmVlbiByZW1vdmVkLiBUaGUgZWRpdG9yIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgaGFzIHRvIGNsb3NlLgotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZT1JbnZhbGlkIEVkaXRvcgotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yTWVzc2FnZTE9RXJyb3IgcmVuYW1pbmcgZmlsZShzKSAnJ3swfScnCi0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQotcmVuYW1lRXJyb3JfdGl0bGU9UmVuYW1lIEVsZW1lbnQKLXJlbmFtZUVycm9yX21zZz1JVVBBMDAxM0U6IFRoZSByZW5hbWUgb3BlcmF0aW9uIGNhbm5vdCBiZSBjb21wbGV0ZWQuCi1TZWxlY3RFbGVtZW50RGlhbG9nX3NlbGVjdGVsZW1lbnRfdGV4dD1TZWxlY3QgRWxlbWVudAotCi0jIEVkaXRvckNob29zZXIKLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ190aXRsZT1PcGVuIE1ldGhvZCBFZGl0b3IKLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlwdGlvbjoKLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbD1TZWxlY3QgQWxsCi1PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDA9RWRpdCBFbGVtZW50Ci1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfbWVzc2FnZT1JVVBBMDAyM0U6IENhbm5vdCBvcGVuIHRoZSBlZGl0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWxlY3RlZCBNZXRob2QgZWxlbWVudC4KLURlc2NyaXB0aW9uRm9ybVBhZ2VfSWNvbkZpbGVDaG9vc2VyRGlhbG9nX3RpdGxlPVNlbGVjdCBJbWFnZSBGaWxlCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5TmFtZT1OZXcgTGlicmFyeQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX0Rlc2NyaXB0aW9uTGFiZWw9RGVzY3JpcHRpb246Ci1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1TZWxlY3Qgb25lIG9yIG1vcmUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGFuZCBjbGljayBGaW5pc2ggdG8gb3BlbiB0aGVtLgotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX0Rlc2VsZWN0QWxsQnV0dG9uTGFiZWw9RGVzZWxlY3QgQWxsCi1FbGVtZW50c1ZpZXdfbWlncmF0aW9uX2Rpcl9kbGdfZGVzY3JpcHRpb25fdGV4dD1TcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgb2YgbmV3bHkgbWlncmF0ZWQgezB9IHRvIHJlcGxhY2UgdGhlIHNlbGVjdGVkIHswfQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3JlYXNvbj1BIHN5c3RlbSBlcnJvciBoYXMgb2NjdXJyZWQuIENsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbkNsb3NlIHNvbWUgb2YgdGhlIG9wZW5lZCBlZGl0b3JzIGFuZCB0cnkgYWdhaW4uCi0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190aXRsZT1JbWFnZSBpcyBpbnZhbGlkCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RlbXBsYXRlPUlVUEEwMDMxRTogVGhlIHNlbGVjdGVkIGltYWdlICcnezB9JycgaXMgbGFyZ2VyIHRoYW4gdGhlIGFsbG93ZWQgc2l6ZSAoezF9IGJ5IHsyfSkuIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBpbWFnZS4KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190aXRsZT1JbWFnZSBpcyBpbnZhbGlkCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzJFOiBUaGUgc2VsZWN0ZWQgZmlsZSAnJ3swfScnIGRvZXMgbm90IGV4aXN0LiBQbGVhc2Ugc2VsZWN0IGFub3RoZXIgaW1hZ2UuCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9U2VsZWN0Li4uCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5RGVzY3JpcHRpb249TWV0aG9kIGxpYnJhcnkgZGVzY3JpcHRpb24KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1NZXRob2QgY29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbgotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VEZXNjcmlwdGlvbj1BbGwgZWRpdG9ycyBtdXN0IGJlIGNsb3NlZC4gU2VsZWN0IHRoZSBvbmVzIHRoYXQgbmVlZCB0byBiZSBzYXZlZCBmaXJzdCwgaWYgYXBwbGljYWJsZS4KLQotIyBUZW1wbGF0ZURlc2NyaXB0aW9uUGFnZQotZm9ybXNfR3VpZGFuY2VXaXRoQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2VfYWxyZWFkeUF0dGFjaGVkX21zZz1UaGUgc2VsZWN0ZWQgZmlsZSBpcyBhbHJlYWR5IGFuIGF0dGFjaG1lbnQgdG8gdGhpcyBHdWlkYW5jZS4KLQotIyBOZXcgTGlicmFyeSBFcnJvciBEaWFsb2cKLW5ld0xpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFOiBVbmFibGUgdG8gY3JlYXRlIHRoZSBtZXRob2QgbGlicmFyeS4KLW5ld0xpYnJhcnlJbnRlcm5sRXJyb3JfcmVhc29uPUFuIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZC4KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24xPVRoZSBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkgcGF0aCAnJ3swfScnIGlzIGludmFsaWQuCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMj1BIG1ldGhvZCBsaWJyYXJ5IGFscmVhZHkgZXhpc3RzIGluICcnezB9JycuCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMz1UaGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IGZvbGRlciAnJ3swfScnIGNhbm5vdCBiZSBjcmVhdGVkLgotbmV3TGlicmFyeUVycm9yX2FkdmljZT1TZWxlY3QgT0sgdG8gc3BlY2lmeSBhbm90aGVyIG1ldGhvZCBsaWJyYXJ5IG5hbWUgb3IgbG9jYXRpb24uCi0KLSNQcm9jZXNzIGxpdGVyYWxzCi1Qcm9jZXNzX0V4dGVybmFsSUQ9RXh0ZXJuYWwgSUQ6Ci1Qcm9jZXNzX1B1cnBvc2U9UHVycG9zZToKLVByb2Nlc3NfU2NvcGU9U2NvcGU6Ci1Qcm9jZXNzX1VzYWdlTm90ZXM9VXNhZ2UgTm90ZXM6Ci1Qcm9jZXNzX0FsdGVybmF0aXZlcz1BbHRlcm5hdGl2ZXM6Ci1Qcm9jZXNzX0hvd1RvU3RhZmY9SG93IHRvIFN0YWZmOgotUHJvY2Vzc19LZXlDb25zaWRlcmF0aW9uPUtleSBDb25zaWRlcmF0aW9uczoKLVByb2Nlc3NfU2NhbGU9U2NhbGU6Ci1Qcm9jZXNzX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3M9UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M6Ci1Qcm9jZXNzX1Jpc2tMZXZlbD1SaXNrIExldmVsOgotUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlPUVzdGltYXRpbmcgVGVjaG5pcXVlczoKLVByb2Nlc3NfUHJvamVjdE1lbWJlckV4cGVydGlzZT1Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U6Ci1Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0PVR5cGUgT2YgQ29udHJhY3Q6Ci0KLSMgRWRpdG9yIFByZXZpZXcgTmF2aWdhdGlvbiBCdXR0b25zCi1iYWNrQnV0dG9uX3RleHQ9QmFjawotZm9yd2FyZEJ1dHRvbl90ZXh0PUZvcndhcmQKLWZvcndhcmRfdGV4dD1Gb3J3YXJkCi1zdG9wQnV0dG9uX3RleHQ9U3RvcAotcmVmcmVzaEJ1dHRvbl90ZXh0PVJlZnJlc2gKLXJlZnJlc2hfdGV4dD1SZWZyZXNoCi1uZXduYW1lX3RleHQ9TmV3IG5hbWU6Ci1wcmludEJ1dHRvbl90ZXh0PVByaW50Ci0KLSMgQ29udGV4dCBtZW51cwotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPSZSZWZyZXNoCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT0mU2hvdyBQcm9wZXJ0aWVzCi0KLV9VSV9NZXRob2RFZGl0b3JfbWVudT0mTWV0aG9kIEVkaXRvcgotX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbT0mTmV3Ci1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZldyBTaWJsaW5nCi0KLV9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsPVNlbGVjdGlvbgotX1VJX1BhcmVudFBhZ2VfbGFiZWw9UGFyZW50Ci1fVUlfTGlzdFBhZ2VfbGFiZWw9TGlzdAotX1VJX1RyZWVQYWdlX2xhYmVsPVRyZWUKLV9VSV9UYWJsZVBhZ2VfbGFiZWw9VGFibGUKLV9VSV9UYWJsZVRyZWVQYWdlX2xhYmVsPVRhYmxlVHJlZQotX1VJX09iamVjdENvbHVtbl9sYWJlbD1PYmplY3QKLV9VSV9TZWxmQ29sdW1uX2xhYmVsPVNlbGYKLQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9U2VsZWN0ZWQgTm90aGluZwotX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkPVNlbGVjdGVkIE9iamVjdDogezB9Ci1fVUlfTXVsdGlPYmplY3RTZWxlY3RlZD1TZWxlY3RlZCB7MH0gT2JqZWN0cwotCi1fVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsPU9wZW4gRWRpdG9yCi0KLV9VSV9XaXphcmRfY2F0ZWdvcnk9RXhhbXBsZSBFTUYgTW9kZWwgQ3JlYXRpb24gV2l6YXJkcwotCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfbGFiZWw9TWV0aG9kIE1vZGVsCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfZGVzY3JpcHRpb249Q3JlYXRlIGEgbmV3IE1ldGhvZCBtb2RlbAotCi1fVUlfTWV0aG9kRWRpdG9yX2xhYmVsPU1ldGhvZCBNb2RlbCBFZGl0b3IKLQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2U9TXkKLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbj1tZXRob2QKLQotX1VJX1dpemFyZF9sYWJlbD1OZXcKLQotX1dBUk5fRmlsZW5hbWVFeHRlbnNpb249VGhlIGZpbGVuYW1lIG11c3QgZW5kIGluICcnLnswfScnCi0KLV9VSV9Nb2RlbE9iamVjdD1Nb2RlbCBPYmplY3QKLV9VSV9YTUxFbmNvZGluZz1YTUwgRW5jb2RpbmcKLV9VSV9YTUxFbmNvZGluZ0Nob2ljZXM9VVRGLTggQVNDSUkgVVRGLTE2IFVURi0xNkJFIFVURi0xNkxFIElTTy04ODU5LTEKLV9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb249U2VsZWN0IGEgbW9kZWwgb2JqZWN0IHRvIGNyZWF0ZQotCi1fVUlfRmlsZUNvbmZsaWN0X2xhYmVsPUZpbGUgQ29uZmxpY3QKLV9XQVJOX0ZpbGVDb25mbGljdD1UaGVyZSBhcmUgdW5zYXZlZCBjaGFuZ2VzIHRoYXQgY29uZmxpY3Qgd2l0aCBjaGFuZ2VzIG1hZGUgb3V0c2lkZSB0aGUgZWRpdG9yLiBEbyB5b3Ugd2lzaCB0byBkaXNjYXJkIHRoaXMgZWRpdG9yJ3MgY2hhbmdlcz8KLQotIyBBZGQgTGluayBEaWFsb2cKLWFkZExpbmtEaWFsb2dfbGlua1R5cGU9VHlwZToKLW9wZW5MaW5rQ2hlY2tib3hfdGV4dD1PcGVuIGxpbmsgaW4gYSBzZXBhcmF0ZSBicm93c2VyIHdpbmRvdwotCi0jIEFkZCBJbWFnZSBEaWFsb2cKLWhlaWdodExhYmVsX3RleHQ9SGVpZ2h0Ogotd2lkdGhMYWJlbF90ZXh0PVdpZHRoOgotRWxlbWVudHNWaWV3XzIwPWNhcGFiaWxpdHkgcGF0dGVybgotRWxlbWVudHNWaWV3XzIxPWRlbGl2ZXJ5IHByb2Nlc3MKLUVsZW1lbnRzVmlld18yMj1wcm9jZXNzCi1FbGVtZW50c1ZpZXdfMzU9ezB9IGlzIHJlYWQtb25seS4gTWFrZSBpdCB3cml0YWJsZSBiZWZvcmUgY29udGludWluZy4KLUVsZW1lbnRzVmlld18zNj1FcnJvciBsb2FkaW5nIGxpYnJhcnkKLWFsdFRhZ0xhYmVsX3RleHQ9QUxUIHRhZzoKLWltYWdlU2l6ZUxhYmVsX3RleHQ9SGVpZ2h0IGFuZCB3aWR0aCBvZiBpbWFnZSBtdXN0IGJlIGF0IGxlYXN0IDEwIGFuZCBubyBtb3JlIHRoYW4gNjAwLiBJbnZhbGlkIGhlaWdodCBhbmQgd2lkdGggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBzdWl0YWJsZSBzaXplLgotCi0jIFByb2Nlc3MgRWRpdG9yCi1Qcm9jZXNzRWRpdG9yPVByb2Nlc3NFZGl0b3IKLVByb2Nlc3NFZGl0b3JfTmFtZT1OYW1lCi1Qcm9jZXNzRWRpdG9yX1ByZXNlbnRhdGlvbk5hbWU9UHJlc2VudGF0aW9uIE5hbWUKLVByb2Nlc3NFZGl0b3JfSW5kZXg9SW5kZXgKLVByb2Nlc3NFZGl0b3JfUHJlZGVjZXNzb3JzPVByZWRlY2Vzc29ycwotI0NvbmZpZ3VyYXRpb25QYWdlX1NlbGVjdGVkPVNlbGVjdGVkOiAKLUNoZWNrbGlzdE9yZGVyX2Rlc2NyaXB0aW9uPVNlbGVjdCBhIGNoZWNrIGl0ZW0gYW5kIGNsaWNrIFVwIG9yIERvd24gdG8gY2hhbmdlIGl0cyBvcmRlci4KLUVsZW1lbnRzVmlld19yZW5hbWluZ190ZXh0PVJlbmFtaW5nLi4uCi1Qcm9jZXNzRWRpdG9yX01vZGVsSW5mbz1Nb2RlbCBJbmZvCi1Qcm9jZXNzRWRpdG9yX1ByZWZpeD1QcmVmaXgKLU1vdmVEaWFsb2dfbW92ZV90ZXh0PU1vdmUKLUNoZWNrbGlzdE9yZGVyX3RpdGxlPU9yZGVyIENoZWNrIEl0ZW1zCi1Qcm9jZXNzRWRpdG9yX1JlcGV0YWJsZT1SZXBlYXRhYmxlCi1Qcm9jZXNzRWRpdG9yX09uZ29pbmc9T25nb2luZwotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uPVN5bmNocm9uaXplLi4uCi1Qcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuPUV2ZW50LURyaXZlbgotUHJvY2Vzc0VkaXRvcl9EZWxpdmVyYWJsZT1EZWxpdmVyYWJsZQotUHJvY2Vzc0VkaXRvcl9PcHRpb25hbD1PcHRpb25hbAotRmlsdGVyRGlhbG9nX1R5cGVfdGV4dD1NZXRob2QgRWxlbWVudCBUeXBlOgotRmlsdGVyRGlhbG9nX0V4cGFuZEFsbD1FeHBhbmQgQWxsCi1Nb3ZlRGlhbG9nX21vdmluZ190ZXh0PU1vdmluZy4uLgotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uV2FybmluZz1JVVBBMDAyNVc6IFNoYXBlIGljb24gZm9yIHswfSBpcyBub3QgZm91bmQgaW4gcGF0aDogezF9Ci1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25FcnJvcj1JVVBBMDAyNUU6IEVycm9yOiBTaGFwZSBpY29uIHNlY3Rpb246IHswfQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9OYW1lTGFiZWw9TmFtZToKLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU9Q3JlYXRlIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfTmFtZUxhYmVsPU5hbWU6Ci1BdXRob3JpbmdVSVBsdWdpbl9uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlPU5ldyBNZXRob2QgQ29uZmlndXJhdGlvbgotCi0jIE5ldyBNZXRob2QgTGlicmFyeSBXaXphcmQKLW5ld0xpYnJhcnlXaXphcmRfdGl0bGU9TmV3IE1ldGhvZCBMaWJyYXJ5Ci1uZXdMaWJyYXJ5V2l6YXJkTWFpblBhZ2VfdGl0bGU9Q3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotbmV3TGlicmFyeVdpemFyZE1haW5QYWdlX2Rlc2NyaXB0aW9uPVNwZWNpZnkgYSBwYXRoIGFuZCBkZXNjcmlwdGlvbiBmb3IgdGhlIG5ldyBtZXRob2QgbGlicmFyeS4KLW5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV9kZXNjcmlwdGlvbl8xPVNwZWNpZnkgYSBuYW1lLCBkZXNjcmlwdGlvbiBhbmQgc3RvcmFnZSB0eXBlIGZvciB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5LgotbGlicmFyeVBhdGhMYWJlbF90ZXh0PVBhdGg6Ci1saWJyYXJ5VHlwZUxhYmVsX3RleHQ9VHlwZToKLQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVUaXRsZT1TYXZlIGNoYW5nZXMKLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb249T25lIG9yIG1vcmUgbWV0aG9kIGVsZW1lbnRzIGhhdmUgYmVlbiBtb2RpZmllZC4gU2VsZWN0IHRoZSBvbmVzIHRoYXQgbmVlZCB0byBiZSBzYXZlZC4KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPU9wZW4gTWV0aG9kIENvbmZpZ3VyYXRpb25zCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbldpemFyZF93aW5kb3dUaXRsZT1PcGVuIE1ldGhvZCBDb25maWd1cmF0aW9ucwotRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ9UmVwbGFjaW5nIHswfS4uLgotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25XYXJuaW5nPUlVUEEwMDI2VzogTm9kZSBpY29uIGZvciB7MH0gaXMgbm90IGZvdW5kIGluIHBhdGg6IHsxfQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfdW5zZWxlY3RlZHBhY2thZ2VzPScnezB9JycgY29udGFpbnMgZWxlbWVudHMgdGhhdCByZWZlcmVuY2UgZWxlbWVudHMgaW4gdW5zZWxlY3RlZCBwYWNrYWdlcwotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25FcnJvcj1JVVBBMDAyNkU6IEVycm9yOiBOb2RlIGljb24gc2VjdGlvbjogezB9Ci1TdGVwc09yZGVyRGlhbG9nX3N0ZXBzPVN0ZXBzOiAKLVN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU9T3JkZXIgVGFzayBTdGVwcwotUHJvY2Vzc0VkaXRvcl9QbGFubmVkPVBsYW5uZWQKLXNwZWNpZnlkaXJlY3RvcnlfdGV4dD1QbGVhc2Ugc3BlY2lmeSBhIGRpcmVjdG9yeSB0byBzYXZlIHRoZSBtZXRob2QgbGlicmFyeSB0bwotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPU11bHRpcGxlIE9jY3VycmVuY2VzCi1Qcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU9RW50cnkgU3RhdGUKLVByb2Nlc3NFZGl0b3JfRXhpdFN0YXRlPUV4aXQgU3RhdGUKLXNlbGVjdENvbHVtbnN0b0FkZF90ZXh0PVNlbGVjdCB0aGUgY29sdW1ucyB0byBhZGQKLVByb2Nlc3NFZGl0b3JfVHlwZT1UeXBlCi1Qcm9jZXNzRWRpdG9yX1RlYW09VGVhbQotRmlsdGVyRGlhbG9nX3RpdGxlPVNlbGVjdCBEaWFsb2c6IAotCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGQ9QWRkIGZyb20gJk1ldGhvZCBDb250ZW50Li4uCi1GaWx0ZXJEaWFsb2dfQ29sbGFwc2VBbGw9Q29sbGFwc2UgQWxsCi1PcGVuQ2hlYXRzaGVldFZpZXdfdGl0bGU9T3BlbiBDaGVhdFNoZWV0IFZpZXcKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxVcD1Sb2xsICZVcAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd249Um9sbCBEb3cmbgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZVVwPU0mb3ZlIFVwCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlRG93bj1Nb3ZlIERvJnduCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWw9UmV2ZSZhbAotUHJvY2Vzc0VkaXRvcl9SZXZlYWxfVGl0bGU9UmV2ZWFsCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db3B5PSZDb3B5Li4uCi1GaWx0ZXJEaWFsb2dfUGF0dGVybl90ZXh0PU5hbWUgcGF0dGVybnMgKG1hdGNoaW5nIG5hbWVzIHdpbGwgYmUgc2hvd24pOiAKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1ByZWZlcmVuY2VzPVByZWZlcmVuY2VzLi4uCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3RpdGxlPU1ldGhvZCBMaWJyYXJ5OiAKLSNNZXNzYWdlVmlld19zZWxlY3RlZF90ZXh0PVNlbGVjdGVkOiAKLU1lc3NhZ2VWaWV3X2Vycm1zZ190ZXh0PURlc2NyaXB0aW9uCi1FbGVtZW50c1ZpZXdfZXJyX3NhdmluZz1JVVBBMDAyN0U6IEVycm9yIHNhdmluZyAnJ3swfScnezF9Ci0KLWVycl9jb3B5aW5nX2ZpbGVfdGl0bGU9RXJyb3IgY29weWluZyBmaWxlCi1lcnJfY29weWluZ19maWxlX2Vycm9yPUlVUEEwMDI4RTogVGhlIGljb24gY291bGQgbm90IGJlIGFzc2lnbmVkLiAKLWVycl9jb3B5aW5nX2ZpbGVfcmVhc29uPUFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNvcHlpbmcgdGhlIHNlbGVjdGVkIGZpbGUuIENsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlPUVycm9yIHByb2Nlc3NpbmcgZmlsZQotZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcD1FZGl0IGNvbmZpZ3VyYXRpb24KLWVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdD1JVVBBMDAxNUU6IENhbm5vdCBlZGl0IGVsZW1lbnQKLVNhdmVUaGlzQWN0aW9uX3NhdmVvYmplY3Q9U2F2ZSBUaGlzIE9iamVjdC4uLgotRWxlbWVudHNWaWV3X3JlcGxhY2VfdGV4dD1SZXBsYWNlCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9FeHRlbmQ9JkV4dGVuZC4uLgotTW92ZURpYWxvZ19kZXN0aW5hdGlvbl90ZXh0PUNob29zZSBkZXN0aW5hdGlvbiBmb3Igc2VsZWN0ZWQgZWxlbWVudChzKToKLWNob29zZURlZmF1bHREaXJlY3RvcnlfdGV4dD1DaG9vc2UgYSBkZWZhdWx0IGRpcmVjdG9yeSBmb3IgbGlicmFyaWVzOgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3M9JlN1cHByZXNzCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczI9JlB1Ymxpc2hpbmcgT3B0aW9ucy4uLgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXNzaWduVXNlckRpYWdyYW09JlVzZXIgRGVmaW5lZCBEaWFncmFtcy4uLgotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3RpdGxlPUFzc2lnbiB1c2VyIGRlZmluZWQgZGlhZ3JhbXMKLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZEltYWdlPUFjdGl2aXR5IERpYWdyYW06Ci1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRkSW1hZ2U9QWN0aXZpdHkgRGV0YWlsIERpYWdyYW06Ci1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfd3BkSW1hZ2U9V29yayBQcm9kdWN0IERlcGVuZWRlbmN5IERpYWdyYW06Ci1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfbm90YUZpbGU9SVVQQTAwMDRFOiBUaGUgc3BlY2lmaWVkIHBhdGggaXMgbm90IGEgZmlsZS4KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b249U2VsZWN0Li4uCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfZW50ZXJlZEltYWdlTm90Rm91bmQ9SVVQQTAwMjRFOiBUaGUgc3BlY2lmaWVkIGltYWdlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBsaWJyYXJ5LiBNYWtlIHN1cmUgeW91IGVudGVyIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5J3Mgcm9vdCBkaXJlY3RvcnkuCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfc2VsZWN0ZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDMwRTogVGhlIGltYWdlIHlvdSBzZWxlY3RlZCBpcyBub3QgaW4gdGhlIGxpYnJhcnkuCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZT1Vc2UgQWN0aXZpdHkgZGlhZ3JhbSBpbWFnZSBmb3IgYnJvd3NpbmcgYW5kIHB1Ymxpc2hpbmcKLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBRERJbWFnZT1Vc2UgQWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0gaW1hZ2UgZm9yIGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlV1BESW1hZ2U9VXNlIFdvcmsgcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0gaW1hZ2UgZm9yIGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db250cmlidXRlPUxvY2FsIENvbnRyJmlidXRpb24KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JlcGxhY2U9TG9jYWwgUmVwbCZhY2VtZW50Ci1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9EaWFncmFtcz1EaWEmZ3JhbXMKLVByb2Nlc3NFZGl0b3JfYWN0aW9uX2RlZXBDb3B5PSZEZWVwIENvcHkuLi4KLUZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uPUJyaWVmIERlc2NyaXB0aW9uOgotQ29uZmlndXJhdGlvblBhZ2VfaGlkZVRvb2xUaXA9U2hvdy9IaWRlIFVuY2hlY2tlZCBFbGVtZW50cwotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb249RGVzY3JpcHRpb246Ci1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbD1QdWJsaXNoICZOb25lCi1GaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbj1QYXR0ZXJucyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hLCB3aGVyZSAqPWFueSBzdHJpbmcsID89YW55IGNoYXJhY3RlcgotQ29uZmlndXJhdGlvblBhZ2VfVHJlZVRpdGxlTGFiZWw9Q29udGVudDoKLUNvbmZpZ3VyYXRpb25QYWdlX0xvYWRpbmdNZXNzYWdlPUxvYWRpbmcgY29uZmlndXJhdGlvbiwgcGxlYXNlIHdhaXQgLi4uCi1Nb3ZlRGlhbG9nX3ZhbGlkZGVzdGluYXRpb25fdGV4dD1UaGUgc3BlY2lmaWVkIG1vdmUgZGVzdGluYXRpb24gaXMgaW52YWxpZC4KLU1vdmVEaWFsb2dfY2Fubm90TW9kaWZ5RGVzdGluYXRpb249SVVQQTAwMzRFOiBUaGUgc2VsZWN0ZWQgZGVzdGluYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkLgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsQWxsPVB1Ymxpc2ggJkFsbAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkJhc2VBY3Rpdml0eT1PcGVuICZCYXNlIEFjdGl2aXR5Ci1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPUUmeHBhbmQgQWxsCi1Qcm9jZXNzRm9ybUVkaXRvcl9jb2xsYXBzZUFsbEFjdGlvbkxhYmVsPUNvJmxsYXBzZSBBbGwKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURpYWdyYW09T3BlbiAmQWN0aXZpdHkgRGlhZ3JhbQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbD1UaGUgdW5zdXBwcmVzc2VkIGRlc2NyaXB0b3JzIGxpc3RlZCBpbiBEZXRhaWxzIG11c3QgYmUgZGVsZXRlZCB0byBhdm9pZCBkdXBsaWNhdGlvbiBhZnRlciByZXZlYWxpbmcgdGhlIHNlbGVjdGVkIGVsZW1lbnRzLiBDbGljayBPSyBpZiB5b3Ugd2FudCB0byBkZWxldGUgdGhlbSBhbmQgY29udGludWUuCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfU2VsZWN0Q29sdW1ucz1TZWxlY3QgdGhlIGNvbHVtbnMgdG8gYWRkCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtPU9wZW4gQWN0aXZpdHkgJkRldGFpbCBEaWFncmFtCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfQ29sdW1uU2VsZWN0aW9uPUNvbHVtbiBzZWxlY3Rpb246Ci1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3dpdGNoQ29uZmlndXJhdGlvbj1Td2l0Y2ggdG8gdGhlIFByb2Nlc3MnIGRlZmF1bHQgY29uZmlndXJhdGlvbiB3aGVuIGFjdGl2YXRpbmcgYSBQcm9jZXNzIGVkaXRvcgotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N1cHByZXNzaW9uR3JvdXBUaXRsZT1TdXBwcmVzc2lvbgotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX2luaGVyaXRTdXBwcmVzc2lvblN0YXRlPUluaGVyaXQgc3VwcHJlc3Npb24gc3RhdGVzCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbT1PcGVuICZXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1DbGVhcgotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9U2VsZWN0Li4uCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9JbnNlcnROZXdQaGFzZT1JbnNlcnQgTmV3IFBoYXNlCi1WaWV3SGVscGVyX3JlbG9hZExpYk9uUm9sbGJhY2tFcnJvcj1Db3VsZCBub3QgcmVjb3ZlciBmcm9tIGEgcGVyc2lzdGVuY2UgZXJyb3IuIFRoZSBsaWJyYXJ5IG5lZWRzIHRvIGJlIHJlbG9hZGVkIHRvIHJlc3RvcmUgaXRzIG9yaWdpbmFsIHN0YXRlLgotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZF90ZXh0PVRoZSBlbGVtZW50ICcnezB9JycgaXMgYWxyZWFkeSBkZWxldGVkLgotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZGNvbmZpcm1fdGV4dD1UaGUgZWxlbWVudCAnJ3swfScnIGlzIGFscmVhZHkgZGVsZXRlZC4gRG8geW91IHdhbnQgdG8gcmVtb3ZlIGl0IGZyb20gJyd7MX0nJz8KLUNvbmZpZ3VyYXRpb25QYWdlX0FkZE1pc3NpbmdUb29sVGlwPUFkZCBNaXNzaW5nIFJlZmVyZW5jZXMKLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uPURlc2NyaXB0aW9uCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25HZW5lcmFsSW5mbz1HZW5lcmFsIEluZm9ybWF0aW9uIAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPUFwcGx5IFBhJnR0ZXJuCi1Nb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ9UGxlYXNlIHNlbGVjdCBhIGRlc3RpbmF0aW9uLgotTW92ZURpYWxvZ19ub21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9Tm8gbW92ZSBkZXN0aW5hdGlvbiBzcGVjaWZpZWQuCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3Ryb3VibGVvYmplY3Q9LiBUcm91YmxlIG9iamVjdDogCi1NZXNzYWdlTGFiZWxQcm92aWRlcl9lcnJjaGlsZHBrZ3M9QSBjaGlsZCBjb250ZW50IHBhY2thZ2Ugb3IgcHJvY2VzcyBjb250YWlucyBlbGVtZW50cyB3aXRoIG1pc3NpbmcgcmVmZXJlbmNlcwotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZT1EaWFncmFtIFB1Ymxpc2hpbmcgT3B0aW9ucwotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlPVBsZWFzZSBzZWxlY3QgdGhlIGRpYWdyYW0ocykgdG8gcHVibGlzaCBvciBkZXNlbGVjdCB0byBub3QgcHVibGlzaAotUHJvY2Vzc0VkaXRvcl9UaXRsZT1Qcm9jZXNzIEVkaXRvcjogCi1TYXZlQXN3aXRoZG90c190ZXh0PVNhdmUgQXMuLi4KLVByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZT1Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUKLVByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb249VGVhbSBBbGxvY2F0aW9uCi1Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U9V29yayBQcm9kdWN0IFVzYWdlCi1Qcm9jZXNzRWRpdG9yX0NvbnNvbGlkYXRlZFZpZXc9Q29uc29saWRhdGVkIFZpZXcKLVByb2Nlc3NFZGl0b3JfY29uZmlybUF1dG9TeW5jaD1UaGlzIG9wZXJhdGlvbiByZWZyZXNoZXMgdGhlIHNlbGVjdGVkIGRlc2NyaXB0b3JzIG9yIGFsbCBkZXNjcmlwdG9ycyBiZWxvdyB0aGUgc2VsZWN0ZWQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBtYXJrZWQgYXMgIlN5bmNocm9uaXplZCB3aXRoIHNvdXJjZSIgaW4gdGhlIEdlbmVyYWwgdGFiIG9mIHRoZWlyIFByb3BlcnRpZXMgdmlldy4gIEl0IHJlZnJlc2hlcyB0aGVzZSBkZXNjcmlwdG9ycyB3aXRoIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIG9mIHRoZSBsaW5rZWQgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgdW5kZXIgdGhlIHByb2Nlc3MnIGRlZmF1bHQgY29uZmlndXJhdGlvbi4gIE5vdGUgdGhhdCBpdCB3aWxsIG5vdCB1cGRhdGUgYW55IGR5bmFtaWNhbGx5IGxpbmtlZCAoZ3JlZW4gaXRhbGljKSBkZXNjcmlwdG9ycy4gIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/Ci1Qcm9jZXNzRWRpdG9yX2RlZmF1bHRTeW5jaHJvbml6YXRpb249RGVmYXVsdCBTeW5jaHJvbml6YXRpb24gZnJvbSBtZXRob2QgY29udGVudAotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24xPUNvbmZpZ3VyYXRpb24KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMj1QbHVnLWluIGFuZCBQYWNrYWdlIFNlbGVjdGlvbgotTmV3TGlicmFyeURpYWxvZ19uZXdsaWJyYXJ5X2FzPUNyZWF0ZSBOZXcgTGlicmFyeSBBcwotTmV3UGx1Z2luRGlhbG9nX25ld3BsdWdpbl90ZXh0PU5ldyBNZXRob2QgUGx1Zy1pbgotU2VsZWN0RWxlbWVudERpYWxvZ190aXRsZV90ZXh0PVNlbGVjdCB0aGUgZWxlbWVudCBvciBvbmUgb2YgaXRzIGNvbnRyaWJ1dG9yczoKLU9wZW5Db25maWdEaWFsb2duZXdjb25maWdfdGV4dD1OZXcgQ29uZmlndXJhdGlvbjoKLXByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZV9CU0VkaXRvcj1Qcm9jZXNzIEVkaXRvcgotCi0jIEFic3RyYWN0RGlhZ3JhbUVkaXRvcgotQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0PUFsaWduCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1SZWZyZXNoIGZyb20gQmFzZSBBY3Rpdml0eQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0PUZvcm1hdCBUZXh0IEJveC4uLgotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1Ib3Jpem9udGFsbHkgdG8gQXZlcmFnZQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1Ib3Jpem9udGFsbHkgdG8gRmlyc3QgU2VsZWN0ZWQKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9VmVydGljYWxseSB0byBBdmVyYWdlCi1NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX3RpdGxlPUdlbmVyYWwgSW5mb3JtYXRpb24KLU1vdmVEaWFsb2dfaW52YWxpZF9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnPUlVUEEwMDQxRTogVGhlIHNlbGVjdGVkIGVsZW1lbnQocykgY2Fubm90IGJlIG1vdmVkIHRvIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24uCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVtb2RlbGxpYnJhcnk9U2F2aW5nIG1vZGVsIGxpYnJhcnkgLi4uCi1NZXRob2RMaWJyYXJ5RWRpdG9yX2Vycm9yX2RpYWxvZ190aXRsZT1FcnJvcgotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c9SVVQQTAwMzNFOiBQcm9ibGVtIGVuY291bnRlcmVkIGluIHNhdmluZyBsaWJyYXJ5LgotTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbl9kZWxldGVjb25maXJtX3RleHQ9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnPwotQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfQ29udGVudEVsZW1lbnRfdGV4dD1Db250ZW50IEVsZW1lbnRzOiAKLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfQnJvd3NlQnV0dG9uTGFiZWw9QnJvd3NlLi4uCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uPVNwZWNpZnkgYSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBmb3IgdGhlIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbi4KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU9U2F2ZSBjaGFuZ2VzIGFuZCBjbG9zZSBhbGwgZWRpdG9ycwotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWNhbGx5IHRvIEZpcnN0IFNlbGVjdGVkCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVNhdmUKLUF0dGFjaG1lbnREaWFsb2dhdHRhY2hGaWxlX3RleHQ9QXR0YWNoIEZpbGUKLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ9Q29uZmlndXJhdGlvbiBDb250ZW50Ci1PcGVuQ29uZmlnRGlhbG9nb3BlbmNvbmZpZ190ZXh0PU9wZW4gQ29uZmlndXJhdGlvbgotRWxlbWVudHNWaWV3X3JlcGxhY2VBY3Rpb25fdGV4dD1SZXBsYWNlLi4uCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPVNhdmluZyB7MH0KLUNvbmZpZ3VyYXRpb25QYWdlX1Nob3dFcnJvclRvb2xUaXA9U2hvdyBjb25maWd1cmF0aW9uIHdhcm5pbmcgbG9nIHZpZXdlcgotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeD1Db25maWd1cmF0aW9uOiAKLUNoZWNrbGlzdE9yZGVyX2NoZWNrbGlzdGl0ZW1zX3RleHQ9Q2hlY2sgSXRlbXM6IAotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPU1vdmUgTm9kZQotQ29uZmlndXJhdGlvblBhZ2VfTWFrZUNsb3N1cmVUb29sVGlwPU1ha2UgQ2xvc3VyZSBieSBmaXhpbmcgZXJyb3JzCi1Db25maWd1cmF0aW9uT3JkZXJEaWFsb2dfZGVzY3JpcHRpb249T3JkZXIgTmF2aWdhdGlvbiBWaWV3cwotTmV3UGx1Z2luRGlhbG9nX3JlZmVyZW5jZXBsdWdpbl90ZXh0PVJlZmVyZW5jZSBQbHVnLWluczoKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9jcmVhdGVGcmVlVGV4dF90ZXh0PUNyZWF0ZSBhIEZyZWUgVGV4dAotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfTGFiZWw9Tm9kZSBJY29uIFByZXZpZXc6Ci1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2Nvbm5lY3RfdGV4dD1JVVBBMDAzMlc6IENhbm5vdCBjb25uZWN0Ci1EaWFncmFtVmFsaWRhdGlvbl9lcnJfc2FtZXByZWRhbmRzdWNfdGV4dD1JVVBBMDAzM1c6IENhbm5vdCBoYXZlIHRoZSBzYW1lIGJyZWFrZG93biBlbGVtZW50IGFzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IKLQotIyBFZGl0b3JDaG9vc2VyCi1FZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZT1PcGVuIEVkaXRvcgotRWRpdG9yQ2hvb3Nlcl9SZXNvdXJjZXNFcnJvcj1UaGlzIGVsZW1lbnQgaGFzIGVycm9ycy4gSXQgaXMgcmVjb21tZW5kZWQgdG8gZml4IHRoZXNlIGVycm9ycyBiZWZvcmUgY29udGludWluZyAoc2VlIGRldGFpbHMpLlxuXG5DbGljayBPSyB0byBjb250aW51ZSB3aXRob3V0IG9wZW5pbmcgdGhlIGVkaXRvci4gQ2xvc2UgdGhpcyBkaWFsb2cgdG8gb3BlbiB0aGUgZWRpdG9yLgotQ29uZmlndXJhdGlvblBhZ2VfRm9ybVByZWZpeD1Db25maWd1cmF0aW9uOiAKLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbk5hbWU9TmFtZToKLUF0dGFjaG1lbnREaWFsb2dGaWxlVVJMX3RleHQ9RmlsZSBVUkw6Ci1TdGVwc09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uPVNlbGVjdCBhIHN0ZXAgYW5kIGNsaWNrIFVwIG9yIERvd24gdG8gY2hhbmdlIGl0cyBvcmRlci4KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyX3NhdmU9RXJyb3IgZHVyaW5nIHNhdmluZwotTWVzc2FnZVZpZXdfZXJyZWxlbWVudF90ZXh0PVJlZmVyZW5jaW5nIEVsZW1lbnQKLU1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dD1SZWZlcmVuY2VkIEVsZW1lbnQKLQotI0FjdGl2aXR5IERpYWdyYW0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9jcmVhdGVTdGFydE5vZGVfdGV4dD1DcmVhdGUgYSBTdGFydCBOb2RlCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb249U2VsZWN0IHRoZSBtZXRob2QgcGx1Zy1pbnMsIGNvbnRlbnQgcGFja2FnZXMgYW5kIHByb2Nlc3NlcyB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uLgotQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb25fdGV4dD1DdXN0b20gQ2F0ZWdvcnkncyBjb250ZW50IGVsZW1lbnRzIG9yZGVyIGRpYWxvZwotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EaXJlY3RvcnlMYWJlbD1EaXJlY3Rvcnk6Ci1Sb290UHJlZlBhZ2VfZW5hYmxlcHJvY2Vzc2NvbnRyaWJ1dGlvbl90ZXh0PUVuYWJsZSBQcm9jZXNzIENvbnRyaWJ1dGlvbgotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtZXRob2QgY29uZmlndXJhdGlvbi4KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uTGFiZWw9RGVzY3JpcHRpb246Ci1Db25maWd1cmF0aW9uT3JkZXJEaWFsb2dfTmF2aWdhdGlvblZpZXdzPU5hdmlnYXRpb24gVmlld3M6IAotQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1DaG9vc2luZyBDb250cmlidXRvcnMgZm9yICcnezB9JycKLUVsZW1lbnRzVmlld19vcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb25fdGV4dD0mT3BlbiB2aWEgdmFyaWFiaWxpdHkgZWxlbWVudHMKLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1jaG9vc2luZyB2YXJpYWJpbGl0eSBlbGVtZW50cyBmb3IgJyd7MH0nJwotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsPVZhcmlhYmlsaXR5IGVsZW1lbnRzIGZvciAnJ3swfScnCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfTGFiZWw9U2hhcGUgSWNvbiBQcmV2aWV3OgotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dD1DYW5ub3QgZGVsZXRlCi1BY3Rpdml0eURpYWdyYW1FZGl0b3Jfb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PU9wZW4gQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gCi1NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX2Rlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG1ldGhvZCBsaWJyYXJ5LgotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1DbGVhcgotV1BDb21wYXJ0bWVudEZpZ3VyZV8wPU5ldyBXb3JrUHJvZHVjdCBEZXNjcmlwdG9yCi1wcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0PVB1Ymxpc2ggb3IgYnJvd3NlIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyB0aGF0IGhhdmUgbm90IGJlZW4gY3JlYXRlZCBpbiBwcm9jZXNzIGVkaXRvcgotcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVB1Ymxpc2ggb3IgYnJvd3NlIGFjdGl2aXR5IGRpYWdyYW1zIGZvciB1bm1vZGlmaWVkIGFjdGl2aXR5IGV4dGVuc2lvbnMKLQotI0NvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19OYW1lUGF0dGVybj1OYW1lIHBhdHRlcm5zIChtYXRjaGluZyBuYW1lcyB3aWxsIGJlIHNob3duKToKLXNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uX2xhYmVsPSZTaG93IGluIFJlc291cmNlIE5hdmlnYXRvcgotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfUGF0dGVybj1QYXR0ZXJucyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hLCB3aGVyZSAqPWFueSBzdHJpbmcsID89YW55IGNoYXJhY3RlcgotZXJyX3Byb2Nlc3NpbmdfZmlsZV9kZXNjcmlwdGlvbj1JVVBBMDAyOUU6IEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHNlbGVjdGVkIGZpbGUuIENsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19DYXRlZ29yeVR5cGU9Q2F0ZWdvcnkgVHlwZSA6Ci1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19CcmllZkRlc2NyaXB0aW9uPUJyaWVmIERlc2NyaXB0aW9uOgotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfU2VsZWN0Q2F0ZWdvcmllcz1TZWxlY3QgQ2F0ZWdvcmllcwotCi0jbG9nIG1lc3NhZ2VzCi1jaGVhdHNoZWV0X2xvYWRfZmFpbHVyZV9sb2dfbXNnPUZhaWxlZCB0byBvcGVuIHRoZSByZXF1ZXN0ZWQgY2hlYXRzaGVldDogCi0KLW5ld0NvbmZpZ3VyYXRpb25XaXJhemRfY3JlYXRlRXJyb3I9SVVQQTAwMzVFOiBUaGUgY29uZmlndXJhdGlvbiBjYW5ub3QgYmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkKLW5ld1BsdWdpbldpemFyZF9jcmVhdGVFcnJvcj1JVVBBMDAzNkU6IFRoZSBwbHVnLWluIGNhbm5vdCBiZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseQotZXJyb3JEaWFsb2dfbW92ZUVycm9yPUlVUEEwMDM3RTogVGhlIGVsZW1lbnQgY2Fubm90IGJlIG1vdmVkIHN1Y2Nlc3NmdWxseQotcmVuYW1lRGlhbG9nX3JlbmFtZUVycm9yPUlVUEEwMDM4RTogVGhlIGVsZW1lbnQgY2Fubm90IGJlIHJlbmFtZWQgc3VjY2Vzc2Z1bGx5Ci1lcnJvckRpYWxvZ19jcmVhdGVFcnJvcj1JVVBBMDAzOUU6IFRoZSBlbGVtZW50IGNhbm5vdCBiZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseQotZHVwbGljYXRlUGx1Z2luTmFtZUVycm9yX21zZz1JVVBBMDEwMUU6IFRoZSBuYW1lICcnezB9JycgYWxyZWFkeSBleGlzdHMuIEVudGVyIGEgZGlmZmVyZW50IG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLQotI05ldyBTdHJpbmdzIGZvciBQcm9jZXNzRWRpdG9yIENvbnRleHQgbWVudSBkaWFncmFtIGltYWdlcwotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkQURJbWFnZT1Bc3NpZ24gQUQgSW1hZ2UuLi4KLVByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yVGl0bGU9UmVmcmVzaCBFcnJvcgotUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JNc2c9RXJyb3IgcmVmcmVzaGluZyBlZGl0b3IKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlPUFzc2lnbiBBREQgSW1hZ2UuLi4KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZFdQREltYWdlPUFzc2lnbiBXUEQgSW1hZ2UuLi4KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFESW1hZ2VJblB1Ymxpc2hpbmc9VXNlIEFEIEltYWdlIGluIFB1Ymxpc2hpbmcKLVByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVTdXBwcmVzcz1UaGUgc3VwcHJlc3NlZCBkZXNjcmlwdG9ycyBsaXN0ZWQgaW4gRGV0YWlscyBtdXN0IGJlIGRlbGV0ZWQgdG8gYXZvaWQgZHVwbGljYXRpb24gYWZ0ZXIgc3VwcHJlc3NpbmcgdGhlIHNlbGVjdGVkIGVsZW1lbnRzLiBDbGljayBPSyBpZiB5b3Ugd2FudCB0byBkZWxldGUgdGhlbSBhbmQgY29udGludWUuCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBRERJbWFnZUluUHVibGlzaGluZz1Vc2UgQUREIEltYWdlIGluIFB1Ymxpc2hpbmcKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZVdQREltYWdlSW5QdWJsaXNoaW5nPVVzZSBXUEQgSW1hZ2UgaW4gUHVibGlzaGluZwotUHJvY2Vzc0VkaXRvcl9EaWFncmFtSW1hZ2VfSW5wdXREaWFsb2dfaW5pdGlhbFZhbHVlPUltYWdlIFBhdGgKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1Nob3dMaW5rZWRFbGVtZW50aW5MaWJyYXJ5Vmlldz1TJmhvdyBMaW5rZWQgRWxlbWVudCBpbiBMaWJyYXJ5IFZpZXcKLVByb2Nlc3NFZGl0b3JfdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbl9sYWJlbD1VcGRhdGUgU3VwcHJlc3Npb24gZnJvbSAmQmFzZQotUHJvY2Vzc0VkaXRvcl9Db250ZXh0TWVudV9EaWFncmFtSW1hZ2VzPURpYWdyYW0gSW1hZ2VzCi0KLSNTdHJpbmdzIGZvciBzeW5jaHJvbml6YXRpb24gd2l6YXJkIG9uIHByb2Nlc3MgZWRpdG9yJ3MgQlMKLXN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfdGl0bGU9U3luY2hyb25pemF0aW9uIERlc2NyaXB0aW9uCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RleHQ9UmVhZCB0aGUgaW5mb3JtYXRpb24gYmVsb3cgXAotdGhhdCBleHBsYWlucyB3aGF0IGN1c3RvbSBzeW5jaHJvbml6YXRpb24gd2lsbCBhY2NvbXBsaXNoLgotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9U2VsZWN0IENvbmZpZ3VyYXRpb24KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ9U2VsZWN0IHRoZSBjb25maWd1cmF0aW9uIFwKLXRoYXQgeW91IHdhbnQgdG8gdXNlIGZvciB0aGUgc3luY2hyb25pemF0aW9uLiAgWW91ciBzZWxlY3Rpb24gZGV0ZXJtaW5lcyB3aGljaCBjb250cmlidXRpb25zIGFuZCByZXBsYWNlbWVudHMgd2lsbCBiZSB1c2VkIGZvciB0aGUgc3luY2hyb25pemF0aW9uLgotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWw9Q29uZmlndXJhdGlvbjoKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90aXRsZT1TZWxlY3QgUHJvcGVydGllcyB0byBTeW5jaHJvbml6ZQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Byb3BlcnRpZXNfbGFibGU9UHJvcGVydGllcwotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX25hbWVfbGFibGU9TmFtZQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByZXNlbnRhdGlvbk5hbWVfbGFibGU9UHJlc2VudGF0aW9uIE5hbWUKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9icmllZkRlc2NfbGFibGU9QnJpZWYgRGVzY3JpcHRpb24KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vcHRpb25hbElub3V0c19sYWJlbD1PcHRpb25hbCBJbnB1dHMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9tYW5kYXRvcnlJbnB1dHNfbGFibGU9TWFuZGF0b3J5IElucHV0cwotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX291dHB1dHNfbGFiZWw9T3V0cHV0cwotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWw9UHJpbWFyeSBQZXJmb3JtZXIKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9hZGRuUGVyZm9ybWVyc19sYWJsZT1BZGRpdGlvbmFsIFBlcmZvcm1lcnMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9yZXNwb25zaWJsZVJvbGVzX2xhYmxlPVJlc3BvbnNpYmxlIFJvbGVzCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfY29udG5BcnRpZmFjdHNfbGFiZWw9Q29udGFpbmVkIEFydGlmYWN0cwotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2RpbHZlZFBhcnRzX2xhYmVsPURlbGl2ZXJhYmxlIFBhcnRzCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfc2VsU3RlcHNfbGFiZWw9U3RlcHMgU2VsZWN0aW9uCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGV4dD1DaG9vc2UgdGhlIHByb3BlcnRpZXMgb2YgXAotdGhlIG1ldGhvZCBjb250ZW50IHRoYXQgeW91IHdhbnQgdG8gYmUgY29uc2lkZXJlZCBmb3Igc3luY2hyb25pemF0aW9uLgotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RpdGxlPVN5bmNocm9uaXphdGlvbiBQcmV2aWV3Ci1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGV4dD1SZXZpZXcgdGhlIHByb3Bvc2VkIHN5bmNocm9uaXphdGlvbiBkZXRhaWxzIGJlbG93Lgotc2VsZWN0RWRpdG9yc1RvRGlzY2FyZENvbmZsaWN0Q2hhbmdlcz1UaGVyZSBhcmUgdW5zYXZlZCBjaGFuZ2VzIHRoYXQgY29uZmxpY3Qgd2l0aCBjaGFuZ2VzIG1hZGUgb3V0c2lkZSB0aGUgZWRpdG9ycy5cblNlbGVjdCB0aGUgZWRpdG9ycyB5b3Ugd2lzaCB0byBkaXNjYXJkIHRoZWlyIGNoYW5nZXMuCi1zeW5jaHJvbml6YXRpb25XaXphcmRfdGl0bGVfdGV4dD1TeW5jaHJvbml6YXRpb24gV2l6YXJkCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX2V4cGxhaW5UZXh0PVRoaXMgd2l6YXJkIHN1cHBvcnRzIHlvdSBpbiByZWZyZXNoaW5nIFwKLXRoZSBzZWxlY3RlZCBkZXNjcmlwdG9ycyBvciBhbGwgZGVzY3JpcHRvcnMgYmVsb3cgdGhlIHNlbGVjdGVkIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gbWFya2VkIGFzIFwKLSJTeW5jaHJvbml6ZSB3aXRoIFNvdXJjZSIgaW4gdGhlIEdlbmVyYWwgdGFiIG9mIHRoZWlyIFByb3BlcnRpZXMgdmlldy4gIE9ubHkgdGhlIHByb3BlcnRpZXMgdGhhdCB5b3UgXAotc2VsZWN0IGluIHRoaXMgd2l6YXJkIGFyZSByZWZyZXNoZWQgaW4gdGhlIGRlc2NyaXB0b3JzLiAgWW91IGNhbiBhbHNvIHNlbGVjdCBhbnkgdmFsaWQgY29uZmlndXJhdGlvbiBcCi1mb3IgeW91ciBwcm9jZXNzIHRvIGJlIHVzZWQgd2hlbiBjb21wdXRpbmcgdGhlIHJlZnJlc2guICBOb3RlIHRoYXQgdGhlIHdpemFyZCB3aWxsIG5vdCB1cGRhdGUgYW55IFwKLWR5bmFtaWNhbGx5IGxpbmtlZCAoZ3JlZW4gaXRhbGljKSBkZXNjcmlwdG9ycy4KLQotb3BlblJURT1PcGVuIHJpY2ggdGV4dCBlZGl0b3IKLWNsb3NlUlRFPUNsb3NlIHJpY2ggdGV4dCBlZGl0b3IKLQotI05ldyBTdHJpbmdzCi1yb2xlc2V0c19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2UgdGhhdCBiZWxvbmcgdG8gdGhpcyByb2xlIHNldC4KLWRpc2NpcGxpbmVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZSB0aGF0IGJlbG9uZyB0byB0aGlzIGRpc2NpcGxpbmUuCi13b3JrcHJvZHVjdHR5cGVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZSB0aGF0IGJlbG9uZyB0byB0aGlzIHdvcmsgcHJvZHVjdCBraW5kLgotZG9tYWluc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2UgdGhhdCBiZWxvbmcgdG8gdGhpcyBkb21haW4uCi10b29sc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2UgdGhhdCBiZWxvbmcgdG8gdGhpcyB0b29sLgotY3VzdG9tY2F0ZWdvcnlfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlIHRoYXQgYmVsb25nIHRvIHRoaXMgY3VzdG9tIGNhdGVnb3J5LgotCi1jb25jZXB0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZSB0aGF0IGJlbG9uZyB0byB0aGlzIGNvbmNlcHQuCi1jaGVja2xpc3RfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlIHRoYXQgYmVsb25nIHRvIHRoaXMgY2hlY2tsaXN0LgotZXhhbXBsZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2UgdGhhdCBiZWxvbmcgdG8gdGhpcyBleGFtcGxlLgotZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZSB0aGF0IGJlbG9uZyB0byB0aGlzIGd1aWRlbGluZS4KLXJvYWRtYXBfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlIHRoYXQgYmVsb25nIHRvIHRoaXMgcm9hZG1hcC4KLXJldXNhYmxlYXNzZXRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlIHRoYXQgYmVsb25nIHRvIHRoaXMgcmV1c2FibGUgYXNzZXQuCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlIHRoYXQgYmVsb25nIHRvIHRoaXMgc3VwcG9ydGluZyBtYXRlcmlhbC4KLXJlcG9ydF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2UgdGhhdCBiZWxvbmcgdG8gdGhpcyByZXBvcnQuCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2UgdGhhdCBiZWxvbmcgdG8gdGhpcyBwcmFjdGljZS4KLXRlbXBsYXRlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZSB0aGF0IGJlbG9uZyB0byB0aGlzIHRlbXBsYXRlLgotdGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlIHRoYXQgYmVsb25nIHRvIHRoaXMgdGVybSBkZWZpbml0aW9uLgotdG9vbG1lbnRvcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2UgdGhhdCBiZWxvbmcgdG8gdGhpcyB0b29sIG1lbnRvci4KLXdoaXRlcGFwZXJfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlIHRoYXQgYmVsb25nIHRvIHRoaXMgd2hpdGVwYXBlci4KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZSB0aGF0IGJlbG9uZyB0byB0aGlzIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbi4KLQotCi0jTmV3IFN0cmluZyBTZWN0aW9uIERlc2NyaXB0aW9uCi1yb2xlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZS4KLXJvbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZS4KLXJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyByb2xlIHJlbGF0ZXMgdG8gYW5vdGhlciByb2xlLgotcm9sZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlLgotCi10YXNrX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFzay4KLXRhc2tfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFzay4KLXRhc2tfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyB0YXNrIHJlbGF0ZXMgdG8gYW5vdGhlciB0YXNrLgotdGFza192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YXNrLgotCi1hcnRpZmFjdF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFydGlmYWN0LgotYXJ0aWZhY3RfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXJ0aWZhY3QuCi1hcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgYXJ0aWZhY3QuCi1hcnRpZmFjdF9ub3RhdGlvblNlY3Rpb25fZGVzYz1Qcm92aWRlIGRlbGl2ZXJ5IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXJ0aWZhY3QuCi1hcnRpZmFjdF90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9UHJvdmlkZSB0YWlsb3JpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhcnRpZmFjdC4KLWFydGlmYWN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgYXJ0aWZhY3QgcmVsYXRlcyB0byBhbm90aGVyIGFydGlmYWN0LgotYXJ0aWZhY3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXJ0aWZhY3QuCi0KLW91dGNvbWVfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvdXRjb21lLgotb3V0Y29tZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvdXRjb21lLgotb3V0Y29tZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgb3V0Y29tZS4KLW91dGNvbWVfbm90YXRpb25TZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZWxpdmVyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG91dGNvbWUuCi1vdXRjb21lX3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1Qcm92aWRlIHRhaWxvcmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG91dGNvbWUuCi1vdXRjb21lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgb3V0Y29tZSByZWxhdGVzIHRvIGFub3RoZXIgb3V0Y29tZS4KLW91dGNvbWVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3V0Y29tZS4KLQotZGVsaXZlcmFibGVfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZWxpdmVyYWJsZS4KLWRlbGl2ZXJhYmxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlbGl2ZXJhYmxlLgotZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGRlbGl2ZXJhYmxlLgotZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZWxpdmVyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlbGl2ZXJhYmxlLgotZGVsaXZlcmFibGVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVByb3ZpZGUgdGFpbG9yaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGVsaXZlcmFibGUuCi1kZWxpdmVyYWJsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGRlbGl2ZXJhYmxlIHJlbGF0ZXMgdG8gYW5vdGhlciBkZWxpdmVyYWJsZS4KLWRlbGl2ZXJhYmxlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlbGl2ZXJhYmxlLgotCi1kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGlzY2lwbGluZS4KLWRpc2NpcGxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGlzY2lwbGluZS4KLWRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBkaXNjaXBsaW5lIHJlbGF0ZXMgdG8gYW5vdGhlciBkaXNjaXBsaW5lLgotZGlzY2lwbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkaXNjaXBsaW5lLgotCi1kb21haW5fZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkb21haW4uCi1kb21haW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZG9tYWluLgotZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgZG9tYWluIHJlbGF0ZXMgdG8gYW5vdGhlciBkb21haW4uCi1kb21haW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZG9tYWluLgotCi13b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB3b3JrIHByb2R1Y3Qga2luZC4KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB3b3JrIHByb2R1Y3Qga2luZC4KLXdvcmtwcm9kdWN0dHlwZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHdvcmsgcHJvZHVjdCBraW5kIHJlbGF0ZXMgdG8gYW5vdGhlciB3b3JrIHByb2R1Y3Qga2luZC4KLXdvcmtwcm9kdWN0dHlwZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB3b3JrIHByb2R1Y3Qga2luZC4KLQotcm9sZXNldF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGUgc2V0Lgotcm9sZXNldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlIHNldC4KLXJvbGVzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyByb2xlIHNldCByZWxhdGVzIHRvIGFub3RoZXIgcm9sZSBzZXQuCi1yb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGUgc2V0LgotCi10b29sX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdG9vbC4KLXRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdG9vbC4KLXRvb2xfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyB0b29sIHJlbGF0ZXMgdG8gYW5vdGhlciB0b29sLgotdG9vbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0b29sLgotCi1jb25jZXB0X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29uY2VwdC4KLWNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29uY2VwdC4KLWNvbmNlcHRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBjb25jZXB0IHJlbGF0ZXMgdG8gYW5vdGhlciBjb25jZXB0LgotY29uY2VwdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb25jZXB0LgotCi1jaGVja2xpc3RfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjaGVja2xpc3QuCi1jaGVja2xpc3RfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY2hlY2tsaXN0LgotY2hlY2tsaXN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgY2hlY2tsaXN0IHJlbGF0ZXMgdG8gYW5vdGhlciBjaGVja2xpc3QuCi1jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY2hlY2tsaXN0LgotCi1leGFtcGxlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXhhbXBsZS4KLWV4YW1wbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXhhbXBsZS4KLWV4YW1wbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBleGFtcGxlIHJlbGF0ZXMgdG8gYW5vdGhlciBleGFtcGxlLgotZXhhbXBsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBleGFtcGxlLgotCi1ndWlkZWxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBndWlkZWxpbmUuCi1ndWlkZWxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ3VpZGVsaW5lLgotZ3VpZGVsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgZ3VpZGVsaW5lIHJlbGF0ZXMgdG8gYW5vdGhlciBndWlkZWxpbmUuCi1ndWlkZWxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ3VpZGVsaW5lLgotCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbi4KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbi4KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9uIHJlbGF0ZXMgdG8gYW5vdGhlciBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb24uCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb24uCi0KLXByYWN0aWNlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcHJhY3RpY2UuCi1wcmFjdGljZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBwcmFjdGljZS4KLXByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcHJhY3RpY2UgcmVsYXRlcyB0byBhbm90aGVyIHByYWN0aWNlLgotcHJhY3RpY2VfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcHJhY3RpY2UuCi0KLXJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJlcG9ydC4KLXJlcG9ydF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByZXBvcnQuCi1yZXBvcnRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyByZXBvcnQgcmVsYXRlcyB0byBhbm90aGVyIHJlcG9ydC4KLXJlcG9ydF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByZXBvcnQuCi0KLXJlc3VhYmxlYXNzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByZXN1YWJsZSBhc3NldC4KLXJlc3VhYmxlYXNzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmVzdWFibGUgYXNzZXQuCi1yZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcmVzdWFibGUgYXNzZXQgcmVsYXRlcyB0byBhbm90aGVyIHJlc3VhYmxlIGFzc2V0LgotcmVzdWFibGVhc3NldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByZXN1YWJsZSBhc3NldC4KLQotcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvYWRtYXAuCi1yb2FkbWFwX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvYWRtYXAuCi1yb2FkbWFwX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcm9hZG1hcCByZWxhdGVzIHRvIGFub3RoZXIgcm9hZG1hcC4KLXJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9hZG1hcC4KLQotc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc3VwcG9ydGluZyBtYXRlcmlhbC4KLXN1cHBvcnRpbmdtYXRlcmlhbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzdXBwb3J0aW5nIG1hdGVyaWFsLgotc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgc3VwcG9ydGluZyBtYXRlcmlhbCByZWxhdGVzIHRvIGFub3RoZXIgc3VwcG9ydGluZyBtYXRlcmlhbC4KLXN1cHBvcnRpbmdtYXRlcmlhbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzdXBwb3J0aW5nIG1hdGVyaWFsLgotCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRlbXBsYXRlLgotdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGVtcGxhdGUuCi10ZW1wbGF0ZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHRlbXBsYXRlIHJlbGF0ZXMgdG8gYW5vdGhlciB0ZW1wbGF0ZS4KLXRlbXBsYXRlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRlbXBsYXRlLgotCi10ZXJtZGVmaW5pdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRlcm0gZGVmaW5pdGlvbi4KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRlcm0gZGVmaW5pdGlvbi4KLXRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgdGVybSBkZWZpbml0aW9uIHJlbGF0ZXMgdG8gYW5vdGhlciB0ZXJtIGRlZmluaXRpb24uCi10ZXJtZGVmaW5pdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0ZXJtIGRlZmluaXRpb24uCi0KLXRvb2xtZW50b3JfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0b29sIG1lbnRvci4KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdG9vbCBtZW50b3IuCi10b29sbWVudG9yX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgdG9vbCBtZW50b3IgcmVsYXRlcyB0byBhbm90aGVyIHRvb2wgbWVudG9yLgotdG9vbG1lbnRvcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0b29sIG1lbnRvci4KLQotd2hpdGVwYXBlcl9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHdoaXRlcGFwZXIuCi13aGl0ZXBhcGVyX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHdoaXRlcGFwZXIuCi13aGl0ZXBhcGVyX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgd2hpdGVwYXBlciByZWxhdGVzIHRvIGFub3RoZXIgd2hpdGVwYXBlci4KLXdoaXRlcGFwZXJfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgd2hpdGVwYXBlci4KLQotZGlzY2lwbGluZWdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGlzY2lwbGluZSBncm91cGluZy4KLWRpc2NpcGxpbmVncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkaXNjaXBsaW5lIGdyb3VwaW5nLgotZGlzY2lwbGluZWdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgZGlzY2lwbGluZSBncm91cGluZyByZWxhdGVzIHRvIGFub3RoZXIgZGlzY2lwbGluZSBncm91cGluZy4KLWRpc2NpcGxpbmVncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkaXNjaXBsaW5lIGdyb3VwaW5nLgotCi1yb2xlc2V0Z3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlc2V0IGdyb3VwaW5nLgotcm9sZXNldGdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGVzZXQgZ3JvdXBpbmcuCi1yb2xlc2V0Z3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyByb2xlc2V0IGdyb3VwaW5nIHJlbGF0ZXMgdG8gYW5vdGhlciByb2xlc2V0IGdyb3VwaW5nLgotcm9sZXNldGdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGVzZXQgZ3JvdXBpbmcuCi0KLWN1c3RvbWNhdGVnb3J5X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY3VzdG9tIGNhdGVnb3J5LgotY3VzdG9tY2F0ZWdvcnlfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY3VzdG9tIGNhdGVnb3J5LgotY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBjdXN0b20gY2F0ZWdvcnkgcmVsYXRlcyB0byBhbm90aGVyIGN1c3RvbSBjYXRlZ29yeS4KLWN1c3RvbWNhdGVnb3J5X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGN1c3RvbSBjYXRlZ29yeS4KLWN1c3RvbWNhdGVnb3J5X0ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyBjdXN0b20gY2F0ZWdvcnkuCi0KLWNvbmNlcHRfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGNvbmNlcHQuCi1jaGVja2xpc3RfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGNoZWNrbGlzdC4KLXRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHRvb2wgbWVudG9yLgotd2hpdGVwYXBlcl9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgd2hpdGVwYXBlci4KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb24uCi10ZXJtZGVmaW5pdGlvbl9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgdGVybSBkZWZpbml0aW9uLgotdGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHRlbXBsYXRlLgotcmV1c2FibGVhc3NldF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgcmV1c2FibGUgYXNzZXQuCi1yZXBvcnRfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHJlcG9ydC4KLXByYWN0aWNlX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyBwcmFjdGljZS4KLWV4YW1wbGVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGV4YW1wbGUuCi1ndWlkZWxpbmVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGd1aWRlbGluZS4KLXJvYWRtYXBfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHJvYWRtYXAuCi1zdXBwb3J0aW5nbWF0ZXJpYWxfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHN1cHBvcnRpbmcgbWF0ZXJpYWwuCi0KLXB1Ymxpc2hfY2F0ZWdvcmllc190ZXh0PVB1Ymxpc2ggdGhpcyBjYXRlZ29yeSB3aXRoIHRoZSBjYXRlZ29yaXplZCBtZXRob2QgZWxlbWVudHMuCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY190aXRsZT1GaWxlIENoYW5nZWQKLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2U9VGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0uIERvIHlvdSB3YW50IHRvIGxvYWQgdGhlIGNoYW5nZXM/Ci0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlPUFjdGl2aXR5IFZhcmlhYmlsaXR5Ci0KLXZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlPVZhcmlhYmlsaXR5Ci0KLWNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfdGl0bGU9Q2lyY3VsYXIgZGVwZW5kZW5jeQotCi1hcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlPUFwcGx5IFBhdHRlcm4KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPUFjdGl2aXR5ICcnezB9JycgY2Fubm90IGFwcGx5IHBhdHRlcm4gd2l0aCAnJ3sxfScnIHNpbmNlIGl0IHdpbGwgcmVzdWx0IGluIGNpcmN1bGFyIGRlcGVuZGVuY3kuCi0KLSNzZXQgZGVmYXVsdCBoaXN0b3J5IHNpemUKLWRlZmF1bHRfbGlzdF9sZW5ndGhfbGFiZWw9RGVmYXVsdCBIaXN0b3J5IHNpemU6Ci0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzX1Rhc2s9U3VwcHJlc3MgVGFza3MKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbF9UYXNrPVJldmVhbCBUYXNrcwotCi0jRXh0ZW5kIFNlbWFudGljcyBwcmVmZXJlbmNlIGNoZWNrCi1leHRlbmRfc2VtYW50aWNzX2J1dHRvbl90ZXh0PVVzZSBuZXcgJkV4dGVuZHMgc2VtYW50aWNzCi1leHRlbmRfc2VtYW50aWNzX3RleHQ9RXh0ZW5kaW5nIGVsZW1lbnRzIG92ZXJyaWRlIHRvLW1hbnkgcmVsYXRpb25zaGlwcyBpbnN0ZWFkIG9mIGFkZGluZyB0byB0aGUgaW5oZXJpdGVkIGVsZW1lbnRzLgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRVBGIDEuMiBubCBzdHJpbmdzLgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLURlc2NyaXB0aW9uRm9ybVBhZ2VfaWNvblNlY3Rpb25fZmlsZU5hbWVDb25mbGljdF90aXRsZT1GaWxlIE5hbWUgQ29uZmxpY3QKLURlc2NyaXB0aW9uRm9ybVBhZ2VfaWNvblNlY3Rpb25fZmlsZU5hbWVDb25mbGljdF9tc2c9SVVQQTAwNDdXOiBUaGUgaW1hZ2UgZmlsZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzIGluIHRoZSBtZXRob2QgbGlicmFyeSByZXNvdXJjZSBmb2xkZXIgJyd7MX0nJy4KLURlc2NyaXB0aW9uRm9ybVBhZ2VfaWNvblNlY3Rpb25fZmlsZU5hbWVDb25mbGljdF9ub3RlPU5vdGU6IEFub3RoZXIgbWV0aG9kIGVsZW1lbnQgbWlnaHQgcmVmZXJlbmNlIHRoaXMgZWxlbWVudC4KLURlc2NyaXB0aW9uRm9ybVBhZ2VfaWNvblNlY3Rpb25fZmlsZU5hbWVfcmVwbGFjZV9tc2c9IFJlcGxhY2UgZXhpc3RpbmcgaW1hZ2Ugd2l0aCBuZXcgaW1hZ2UKLURlc2NyaXB0aW9uRm9ybVBhZ2VfaWNvblNlY3Rpb25fZmlsZU5hbWVfdW5pcXVlX21zZz0gU3BlY2lmeSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBpbWFnZQotRGVzY3JpcHRpb25Gb3JtUGFnZV9pY29uU2VjdGlvbl9maWxlTmFtZV9zZWxlY3RBY3Rpb25fbGFiZWw9U2VsZWN0IGFjdGlvbjoKLQotI0xheW91dCBBY3Rpb24gZ3JvdXAKLUxheW91dEFjdGlvbkdyb3VwX2xhYmVsPSAmUGx1Z2luIFByZXNlbnRhdGlvbgotTGF5b3V0QWN0aW9uR3JvdXBfZmxhdExheW91dEFjdGlvbl9sYWJlbD0gJkZsYXQKLUxheW91dEFjdGlvbkdyb3VwX2hpZXJhcmNoaWNhbExheW91dEFjdGlvbl9sYWJlbD0gJkhpZXJhcmNoaWNhbAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlcj18Ci1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc9U2hvdyBvd25lciBvZiB0aGlzIHVucmVzb2x2ZWQgcmVmZXJlbmNlIGluIExpYnJhcnkgdmlldwotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZW1vdmVVbnJlc29sdmVkUmVmZXJlbmNlPVJlbW92ZSB0aGlzIHVucmVzb2x2ZWQgcmVmZXJlbmNlCi1wcm9tcHREZWxldGVDdXN0b21DYXRlZ29yeUJlZm9yZVJlbW92ZUxhc3RSZWZUb0l0PVlvdSBhcmUgYWJvdXQgdG8gcmVtb3ZlIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB7MH0gaW4gdGhlIHBsdWctaW4uIFRoZSBlbGVtZW50KHMpIHdpbGwgYmUgZGVsZXRlZC4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNCZWxvdyBwcm9wZXJ0eSAiZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzIiBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQKLSNEb24ndCBkZWxldGUgYSBzcGFjZSBhZnRlciAiOiAiCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzPTogClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1VJQWN0aW9uRGlzcGF0Y2hlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1VJQWN0aW9uRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YTU4MzgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9VSUFjdGlvbkRpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Db250cmlidXRpb25TZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEhhbmRsZXMgVUkgYWN0aW9ucyBpbiB0aGUgd29ya2JlbmNoLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVUlBY3Rpb25EaXNwYXRjaGVyIGltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFVJQWN0aW9uRGlzcGF0Y2hlciBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIExpc3QgZG91YmxlQ2xpY2tMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEN1cnJlbnRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IG5ldyBDdXJyZW50U2VsZWN0aW9uKCk7Ci0KLQlwcml2YXRlIElEb3VibGVDbGlja0xpc3RlbmVyIGRvdWJsZUNsaWNrTGlzdGVuZXIgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVUlBY3Rpb25EaXNwYXRjaGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChVSUFjdGlvbkRpc3BhdGNoZXIuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBVSUFjdGlvbkRpc3BhdGNoZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFByaXZhdGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIFVJQWN0aW9uRGlzcGF0Y2hlcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgYW4gYWN0aW9uIGRpc3BhdGNoZXIgb2YgbXkgb3duCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICovCi0JcHVibGljIFVJQWN0aW9uRGlzcGF0Y2hlcihPYmplY3Qgb3duZXIpIHsKLQkJLy8gQ3JlYXRlIHRoZSBkb3VibGUgY2xpY2sgbGlzdGVuZXIgdXNlZCBmb3IgbGF1bmNoaW5nIHRoZSBNZXRob2QKLQkJLy8gZWRpdG9ycy4KLQkJZG91YmxlQ2xpY2tMaXN0ZW5lciA9IG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZSkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCQlJV29ya2JlbmNoUGFydFNpdGUgc2l0ZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCkKLQkJCQkJCQkuZ2V0QWN0aXZlUGFydCgpLmdldFNpdGUoKTsKLQotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQkJT2JqZWN0W10gc2VsT2JqcyA9IHNlbC50b0FycmF5KCk7Ci0JCQkJCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IG51bGw7Ci0KLQkJCQkJaWYgKChzZWxPYmpzICE9IG51bGwpICYmIChzZWxPYmpzLmxlbmd0aCA+IDApKSB7Ci0JCQkJCQkvLyBPcGVuIHRoZSBBdXRob3JpbmcgcGVyc2VwZWN0aXZlLgotCQkJCQkJVUlBY3Rpb25EaXNwYXRjaGVyLm9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZSgpOwotCi0JCQkJCQkvLyBMb2NhdGUgdGhlIHNlbGVjdGVkIE1ldGhvZCBlbGVtZW50LgotCQkJCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKHNlbE9ianNbMF0pOwotCi0JCQkJCQlpZiAoc2l0ZS5lcXVhbHMoQ29uZmlndXJhdGlvblZpZXcuZ2V0VmlldygpLmdldFNpdGUoKSkpIHsKLQkJCQkJCQkvLyBEb3VibGUtY2xpY2sgb3JnaW5hdGVkIGZyb20gdGhlIENvbmZpZ3VyYXRpb24KLQkJCQkJCQkvLyB2aWV3LgotCQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmo7Ci0JCQkJCQkJCUNvbnRyaWJ1dGlvblNlbGVjdGlvbiBjb250cmliU2VsZWN0aW9uID0gbmV3IENvbnRyaWJ1dGlvblNlbGVjdGlvbigpOwotCQkJCQkJCQlzZWxlY3RlZE9iamVjdCA9IGNvbnRyaWJTZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0U2VsZWN0ZWRDb250cmlidXRvcihlbGVtZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXNlbGVjdGVkT2JqZWN0ID0gb2JqOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoc2VsZWN0ZWRPYmplY3QgIT0gbnVsbCkgewotCQkJCQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKAotCQkJCQkJCQkJc2VsZWN0ZWRPYmplY3QpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCS8vIEFkZCBhIHBlcnNwZWN0aXZlIGxpc3RlbmVyIHRvIGVuYWJsZS9kaXNhYmxlIGRvdWJsZS1jbGljayBsaXN0ZW5pbmcuCi0JCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV29ya2JlbmNoV2luZG93ID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAoYWN0aXZlV29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLQkJCWFjdGl2ZVdvcmtiZW5jaFdpbmRvdwotCQkJCQkuYWRkUGVyc3BlY3RpdmVMaXN0ZW5lcihuZXcgSVBlcnNwZWN0aXZlTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUFjdGl2YXRlZChJV29ya2JlbmNoUGFnZSBwYWdlLAotCQkJCQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2MpIHsKLQkJCQkJCQlpZiAoZGVzYy5nZXRJZCgpLmVxdWFscygKLQkJCQkJCQkJCUF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKSkgewotCQkJCQkJCQlhZGREb3VibGVDbGlja0xpc3RlbmVyKGRvdWJsZUNsaWNrTGlzdGVuZXIpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIoZG91YmxlQ2xpY2tMaXN0ZW5lcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUNoYW5nZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQkJCQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBkZXNjLCBTdHJpbmcgaWQpIHsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCX0KLQotCQlpZiAoUGVyc3BlY3RpdmVVdGlsCi0JCQkJLmlzQWN0aXZlUGVyc3BlY3RpdmUoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpKSB7Ci0JCQlhZGREb3VibGVDbGlja0xpc3RlbmVyKGRvdWJsZUNsaWNrTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVkaXRDb25maWd1cmF0aW9uKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBsaWJyYXJ5IHBlcnNwZWN0aXZlCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkxpYnJhcnlQZXJzcGVjdGl2ZSgpIHsKLQkJUGVyc3BlY3RpdmVVdGlsLm9wZW5QZXJzcGVjdGl2ZShCcm93c2luZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQkJSVdvcmtiZW5jaFBhZ2Ugd2tiUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJVmlld1BhcnQgdmlld1BhcnQgPSB3a2JQYWdlLmZpbmRWaWV3KExpYnJhcnlWaWV3LlZJRVdfSUQpOwotCQlpZiAodmlld1BhcnQgIT0gbnVsbCkKLQkJCXdrYlBhZ2UuaGlkZVZpZXcodmlld1BhcnQpOwotCQl2aWV3UGFydCA9IHdrYlBhZ2UuZmluZFZpZXcoQ29uZmlndXJhdGlvblZpZXcuVklFV19JRCk7Ci0JCXdrYlBhZ2UuYWN0aXZhdGUodmlld1BhcnQpOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYXV0aG9yaW5nIHBlcnNwZWN0aXZlCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkF1dGhvcmluZ1BlcnNwZWN0aXZlKCkgewotCQlQZXJzcGVjdGl2ZVV0aWwub3BlblBlcnNwZWN0aXZlKEF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQkJSVdvcmtiZW5jaFBhZ2Ugd2tiUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJVmlld1BhcnQgdmlld1BhcnQgPSB3a2JQYWdlLmZpbmRWaWV3KExpYnJhcnlWaWV3LlZJRVdfSUQpOwotCQl3a2JQYWdlLmFjdGl2YXRlKHZpZXdQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2FkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKCFzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNyZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBjdXJyZW50IHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb24uc2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBJU2VsZWN0aW9uUHJvdmlkZXIgZ2V0U2VsZWN0aW9uU291cmNlKCkgewotCQlyZXR1cm4gY3VycmVudFNlbGVjdGlvbi5zb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBjdXJyZW50IHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRTZWxlY3Rpb24odGhpcywgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGN1cnJlbnQgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb25Qcm92aWRlciBzb3VyY2UsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJY3VycmVudFNlbGVjdGlvbi5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCQljdXJyZW50U2VsZWN0aW9uLnNvdXJjZSA9IHNvdXJjZTsKLQotCQkJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzb3VyY2UsCi0JCQkJCXNlbGVjdGlvbik7Ci0KLQkJCS8vIEF2b2lkIGNvbmN1cnJlbnQgZXJyb3IuCi0JCQlMaXN0IHByb2Nlc3NlZEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpID4gMCkgewotCQkJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycwotCQkJCQkJLnJlbW92ZSgwKTsKLQkJCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQkJcHJvY2Vzc2VkSXRlbXMuYWRkKGxpc3RlbmVyKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkQWxsKHByb2Nlc3NlZEl0ZW1zKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBkb3VibGUgY2xpY2sgbGlzdGVuZXIKLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb3VibGVDbGlja0xpc3RlbmVyKElEb3VibGVDbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICghZG91YmxlQ2xpY2tMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQlkb3VibGVDbGlja0xpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGRvdWJsZSBjbGljayBsaXN0ZW5lcgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIoSURvdWJsZUNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZG91YmxlQ2xpY2tMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgZG91YmxlIGNsaWNrIGV2ZW50Ci0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRG91YmxlQ2xpY2tFdmVudChEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJLy8gQXZvaWQgY29uY3VycmVudCBlcnJvci4KLQkJCUxpc3QgcHJvY2Vzc2VkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl3aGlsZSAoZG91YmxlQ2xpY2tMaXN0ZW5lcnMuc2l6ZSgpID4gMCkgewotCQkJCUlEb3VibGVDbGlja0xpc3RlbmVyIGxpc3RlbmVyID0gKElEb3VibGVDbGlja0xpc3RlbmVyKSBkb3VibGVDbGlja0xpc3RlbmVycwotCQkJCQkJLnJlbW92ZSgwKTsKLQkJCQl0cnkgewotCQkJCQlsaXN0ZW5lci5kb3VibGVDbGljayhldmVudCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCQlwcm9jZXNzZWRJdGVtcy5hZGQobGlzdGVuZXIpOwotCQkJfQotCQkJZG91YmxlQ2xpY2tMaXN0ZW5lcnMuYWRkQWxsKHByb2Nlc3NlZEl0ZW1zKTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBDdXJyZW50U2VsZWN0aW9uIHsKLQotCQlwdWJsaWMgSVNlbGVjdGlvblByb3ZpZGVyIHNvdXJjZSA9IG51bGw7Ci0KLQkJcHVibGljIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm9BY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm9BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWYwMTViZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9BY3Rpdml0eURldGFpbERpYWdyYW1JbmZvQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5BRERJbmZvRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEFjdGlvbiB0byBzaG93IHRoZSBBRERJbmZvRGlhbG9nLCB0byBzaG93IHRoZSBBY3Rpdml0eURldGFpbERpYWdyYW1zCi0gKiBpbiB0aGUgcHJvY2Vzcy4gTm90IGluIHVzZS4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtSW5mb0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHNlbGVjdGVkOwotCQotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW1JbmZvQWN0aW9uKCkgewotCQlzdXBlcigiQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gSW5mbyIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQotCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBBRERGaWx0ZXIobnVsbCwgbnVsbCwgbnVsbCk7Ci0JCQotCQlBRERJbmZvRGlhbG9nIGZkID0gbmV3IEFEREluZm9EaWFsb2coUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGdldE9iamVjdCgpLCAiQWN0aXZpdHkiLAotCQkJCW51bGwpOwotCi0JCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlmZC5zZXRUaXRsZSgiQWN0aXZpdHkiKTsKLQkJZmQub3BlbigpOwotCQlMaXN0IGxpc3QgPSBmZC5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0JCQotCQl0cnkgewotCQkJSUVkaXRvclBhcnQgcGFyZW50ID0gZ2V0UGFnZXgoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuRWRpdG9ySW5wdXQoCi0JCQkJCWxpc3QuZ2V0KDApLCBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbigoUHJvY2VzcylnZXRPYmplY3QoKSkpOwotCQkJSUVkaXRvclBhcnQgcGFydCA9IGdldFBhZ2V4KCkub3BlbkVkaXRvcihpbnB1dCwKLQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmNsYXNzCi0JCQkJCS5nZXROYW1lKCkpOwotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQlBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yID0gKEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgcGFydDsKLQkJCQllZGl0b3Iuc2V0UGFyZW50RWRpdG9yKHBhcmVudCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQlleGNlcHRpb24pOwotCQl9Ci0JCS8vIG9wZW4gZWRpdG9yCi0KLQkJc3VwZXIucnVuKCk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCl7Ci0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci0JCi0JcHVibGljIElXb3JrYmVuY2hQYWdlIGdldFBhZ2V4KCl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBzdXBlci5pc0VuYWJsZWQoKTsKLQl9Ci0JcHVibGljIGNsYXNzIEFEREZpbHRlciBleHRlbmRzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIHsKLQkJcHVibGljIEFEREZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgVmlld2VyIHZpZXdlciwgU3RyaW5nIGZpbHRlclN0cikgewotCQkJc3VwZXIobWV0aG9kQ29uZmlnLCB2aWV3ZXIsIGZpbHRlclN0cik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJaWYob2JqIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHJldHVybiB0cnVlOwotCQkJaWYob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBkID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRVTUFEaWFncmFtKChBY3Rpdml0eSkgb2JqLCBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNLCBmYWxzZSk7Ci0JCQkJaWYoZCAhPSBudWxsICkgcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Db25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDcwZWFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5QZXJzcGVjdGl2ZUxpc3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Db250cmlidXRpb25TZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLQotCi0vKioKLSAqIEVkaXRzIGFuIGVsZW1lbnQgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLQkvKioKLQkgKiBUaGUgSUQgZm9yIHRoaXMgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JRCA9IENvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbi5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWQ7Ci0KLQlwcml2YXRlIENvbnRyaWJ1dGlvblNlbGVjdGlvbiBjb250cmlidXRvclNlbGVjdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXdFZGl0QWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCQljb250cmlidXRvclNlbGVjdG9yID0gbmV3IENvbnRyaWJ1dGlvblNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBzZWxlY3RlZC5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0cy5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlPYmplY3Qgb2JqID0gY29udHJpYnV0b3JTZWxlY3RvcgotCQkJCQkJLmdldFNlbGVjdGVkQ29udHJpYnV0b3IoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCk7Ci0JCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCQllbGVtZW50TGlzdC5hZGQob2JqKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZWxlbWVudExpc3QuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnRMaXN0LnNpemUoKSA8IDEpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKFBlcnNwZWN0aXZlTGlzdFV0aWwuaXNCcm93c2luZ1BlcnNwZWN0aXZlKCkpIHsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IGVsZW1lbnRMaXN0Lml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBvYmplY3RzLm5leHQoKTsKLQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGlzIGFjdGlvbiBpbiByZXNwb25zZSB0byB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGNoYW5nZXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZWxlY3RlZCA9IHNlbGVjdGlvbjsKLQotCQlib29sZWFuIGVuYWJsZVRoZU1lbnUgPSB0cnVlOwotCi0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gb2JqZWN0cy5uZXh0KCk7Ci0JCQlPYmplY3QgcmVhbE9iaiA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJaWYgKCEocmVhbE9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpKSB7Ci0JCQkJZW5hYmxlVGhlTWVudSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmICgocmVhbE9iaiBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykKLQkJCQkJfHwgKHJlYWxPYmogaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikpIHsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoKHJlYWxPYmogaW5zdGFuY2VvZiBQaGFzZSkKLQkJCQkJfHwgKHJlYWxPYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQkJfHwgKHJlYWxPYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkpIHsKLQkJCQllbmFibGVUaGVNZW51ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZW5hYmxlVGhlTWVudTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0NyZWF0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9DcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MDZkODNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0NyZWF0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuSUVkaXRvcktlZXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkNvbW1hbmRTdGF0dXNDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IE1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZCBleHRlbmRzIENvbW1hbmRXcmFwcGVyIGltcGxlbWVudHMKLQkJQ29tbWFuZEFjdGlvbkRlbGVnYXRlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENyZWF0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKENvbW1hbmQgY29tbWFuZCkgewotCQlzdXBlcihjb21tYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlDb21tYW5kIGNtZCA9IFRuZ1V0aWwudW53cmFwKHRoaXMpOwotCi0JCXN1cGVyLmV4ZWN1dGUoKTsKLQotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9ICgoQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQpIGNvbW1hbmQpCi0JCQkJCS5nZXRTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgewotCQkJCWlmIChDb21tYW5kU3RhdHVzQ2hlY2tlci5oYXNSb2xsYmFja0Vycm9yKHN0YXR1cykpIHsKLQkJCQkJVmlld0hlbHBlci5yZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKG51bGwpOwotCQkJCX0gZWxzZSBpZiAoIUNvbW1hbmRTdGF0dXNDaGVja2VyLmhhc1NhdmVFcnJvcihzdGF0dXMpKSB7Ci0JCQkJCWRpc3BsYXlFcnJvcihzdGF0dXMpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljbWQgPSB0aGlzOwotCi0JCQl3aGlsZSAoY21kIGluc3RhbmNlb2YgQ29tbWFuZFdyYXBwZXIKLQkJCQkJJiYgIShjbWQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCkpIHsKLQkJCQljbWQgPSAoKENvbW1hbmRXcmFwcGVyKSBjbWQpLmdldENvbW1hbmQoKTsKLQkJCX0KLQotCQkJaWYgKGNtZCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKSB7Ci0JCQkJTWV0aG9kRWxlbWVudEFkZENvbW1hbmQgYWRkQ21kID0gKChNZXRob2RFbGVtZW50QWRkQ29tbWFuZCkgY21kKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IGFkZENtZC5nZXRTdGF0dXMoKTsKLQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJaWYgKENvbW1hbmRTdGF0dXNDaGVja2VyLmhhc1JvbGxiYWNrRXJyb3Ioc3RhdHVzKSkgewotCQkJCQkJVmlld0hlbHBlci5yZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKG51bGwpOwotCQkJCQl9IGVsc2UgaWYgKCFDb21tYW5kU3RhdHVzQ2hlY2tlci5oYXNTYXZlRXJyb3Ioc3RhdHVzKSkgewotCQkJCQkJZGlzcGxheUVycm9yKHN0YXR1cyk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gZ2V0Q29tbWFuZCgpLmdldFJlc3VsdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXN1bHQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QgJiYgKChFT2JqZWN0KSBvYmopLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJLy8gT3BlbiB0aGUgZWRpdG9yIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBlbGVtZW50LgotCQkJCUlFZGl0b3JLZWVwZXIuUkVGRVJFTkNFLmdldEVkaXRvcktlZXBlcigpLm9wZW5FZGl0b3Iob2JqKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2NhblVuZG8oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZEFjdGlvbkRlbGVnYXRlI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKCkgewotCQlDb21tYW5kQWN0aW9uRGVsZWdhdGUgY21kID0gKENvbW1hbmRBY3Rpb25EZWxlZ2F0ZSkgZ2V0Q29tbWFuZCgpOwotCQlyZXR1cm4gY21kLmdldEltYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRBY3Rpb25EZWxlZ2F0ZSNnZXRUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCUNvbW1hbmRBY3Rpb25EZWxlZ2F0ZSBjbWQgPSAoQ29tbWFuZEFjdGlvbkRlbGVnYXRlKSBnZXRDb21tYW5kKCk7Ci0JCXJldHVybiBjbWQuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kQWN0aW9uRGVsZWdhdGUjZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCUNvbW1hbmRBY3Rpb25EZWxlZ2F0ZSBjbWQgPSAoQ29tbWFuZEFjdGlvbkRlbGVnYXRlKSBnZXRDb21tYW5kKCk7Ci0JCXJldHVybiBjbWQuZ2V0VG9vbFRpcFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5IGFuIGVycm9yIGRpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5RXJyb3IoSVN0YXR1cyBzdGF0dXMpIHsKLQkJaW50IHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0JCWlmIChzZXZlcml0eSA9PSBJU3RhdHVzLkVSUk9SIHx8IHNldmVyaXR5ID09IElTdGF0dXMuV0FSTklORykgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXkoCi0JCQkJCWdldExhYmVsKCksCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX2NyZWF0ZUVycm9yCi0JCQkJCSwgc3RhdHVzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvRGlhZ3JhbVByaW50QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9EaWFncmFtUHJpbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODY0OGQ0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9EaWFncmFtUHJpbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnByaW50LlByaW50R3JhcGhpY2FsVmlld2VyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlByaW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludGVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiAKLSAqIFByaW50IGRpYWdyYW0KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVByaW50QWN0aW9uIGV4dGVuZHMgUHJpbnRBY3Rpb24gewotCi0JR3JhcGhpY2FsVmlld2VyIHZpZXdlcjsKLQkvKioKLQkgKiBAcGFyYW0gcGFydAotCSAqLwotCXB1YmxpYyBEaWFncmFtUHJpbnRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgR3JhcGhpY2FsVmlld2VyIHZpZXdlcikgewotCQlzdXBlcihwYXJ0KTsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCQotCS8qIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuUHJpbnRBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vR3JhcGhpY2FsVmlld2VyIHZpZXdlcjsKLQkJUHJpbnREaWFsb2cgZGlhbG9nID0gbmV3IFByaW50RGlhbG9nKHZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgU1dULk5VTEwpOwotCQlQcmludGVyRGF0YSBkYXRhID0gZGlhbG9nLm9wZW4oKTsKLQkJCi0JCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCVByaW50R3JhcGhpY2FsVmlld2VyT3BlcmF0aW9uIG9wID0gCi0JCQkJCQluZXcgUHJpbnRHcmFwaGljYWxWaWV3ZXJPcGVyYXRpb24obmV3IFByaW50ZXIoZGF0YSksIHZpZXdlcik7Ci0JCQlvcC5ydW4oZ2V0V29ya2JlbmNoUGFydCgpLmdldFRpdGxlKCkpOwotCQl9Ci0JCXN1cGVyLnJ1bigpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgZ3JhcGhpY2FsIHZpZXdlcgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXIoR3JhcGhpY2FsVmlld2VyIHZpZXdlcikgewotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGdyYXBoaWNhbCB2aWV3ZXIKLQkgKiBAcmV0dXJuIHZpZXdlcgotCSAqLwotCXB1YmxpYyBHcmFwaGljYWxWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOGRhNTQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSBMaWJyYXJ5IHZpZXcgYWN0aW9uIGJhciBjb250cmlidXRvci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMKLQkJSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCXB1YmxpYyBJVmlld1BhcnQgZ2V0QWN0aXZlVmlldygpOwotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlVmlldyhJVmlld1BhcnQgcGFydCk7Ci0KLQlwdWJsaWMgdm9pZCBzaGFyZUdsb2JhbEFjdGlvbnMoSVBhZ2UgcGFnZSwgSUFjdGlvbkJhcnMgYWN0aW9uQmFycyk7Ci0KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKTsKLQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKTsKLQotCXB1YmxpYyB2b2lkIGRpc2FibGVHbG9iYWxFZGl0TWVudSgpOwotCi0JcHVibGljIHZvaWQgZW5hYmxlR2xvYmFsRWRpdE1lbnUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvSVdvcmtiZW5jaFBhcnRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lXb3JrYmVuY2hQYXJ0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExY2IwMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvSVdvcmtiZW5jaFBhcnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3Igd29ya2JlbmNoIHBhcnQKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXb3JrYmVuY2hQYXJ0QWN0aW9uIHsKLQl2b2lkIHNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MYXlvdXRBY3Rpb25Hcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGF5b3V0QWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTM2N2JhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MYXlvdXRBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QbHVnaW5VSVBhY2thZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnBhY2thZ2V2aWV3LkxheW91dEFjdGlvbkdyb3VwCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTGF5b3V0QWN0aW9uR3JvdXAgZXh0ZW5kcyBNdWx0aUFjdGlvbkdyb3VwIHsKLQotCXB1YmxpYyBMYXlvdXRBY3Rpb25Hcm91cChMaWJyYXJ5VmlldyBsaWJWaWV3KSB7Ci0JCXN1cGVyKGNyZWF0ZUFjdGlvbnMobGliVmlldyksIGdldFNlbGVjdGVkU3RhdGUobGliVmlldykpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIEFjdGlvbkdyb3VwI2ZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzKQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJc3VwZXIuZmlsbEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7Ci0JCWNvbnRyaWJ1dGVUb1ZpZXdNZW51KGFjdGlvbkJhcnMuZ2V0TWVudU1hbmFnZXIoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjb250cmlidXRlVG9WaWV3TWVudShJTWVudU1hbmFnZXIgdmlld01lbnUpIHsKLQkJdmlld01lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLQkJLy8gQ3JlYXRlIGxheW91dCBzdWIgbWVudQotCQkKLQkJSU1lbnVNYW5hZ2VyIGxheW91dFN1Yk1lbnU9IG5ldyBNZW51TWFuYWdlcihBdXRob3JpbmdVSVJlc291cmNlcy5MYXlvdXRBY3Rpb25Hcm91cF9sYWJlbCk7IAotCQlmaW5hbCBTdHJpbmcgbGF5b3V0R3JvdXBOYW1lPSAibGF5b3V0IjsgLy8kTk9OLU5MUy0xJAotCQlTZXBhcmF0b3IgbWFya2VyPSBuZXcgU2VwYXJhdG9yKGxheW91dEdyb3VwTmFtZSk7Ci0KLQkJdmlld01lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJdmlld01lbnUuYWRkKG1hcmtlcik7Ci0JCXZpZXdNZW51LmFwcGVuZFRvR3JvdXAobGF5b3V0R3JvdXBOYW1lLCBsYXlvdXRTdWJNZW51KTsKLQkJdmlld01lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMrIi1lbmQiKSk7Ly8kTk9OLU5MUy0xJAkJCi0JCWFkZEFjdGlvbnMobGF5b3V0U3ViTWVudSk7Ci0JfQotCi0Jc3RhdGljIGludCBnZXRTZWxlY3RlZFN0YXRlKExpYnJhcnlWaWV3IGxpYlZpZXcpIHsKLQkJaWYgKFBsdWdpblVJUGFja2FnZUNvbnRleHQuSU5TVEFOQ0UuaXNGbGF0TGF5b3V0KCkpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZQotCQkJcmV0dXJuIDE7Ci0JfQotCQotCXN0YXRpYyBJQWN0aW9uW10gY3JlYXRlQWN0aW9ucyhMaWJyYXJ5VmlldyBsaWJWaWV3KSB7Ci0JCUlBY3Rpb24gZmxhdExheW91dEFjdGlvbj0gbmV3IExheW91dEFjdGlvbihsaWJWaWV3LCB0cnVlKTsKLQkJZmxhdExheW91dEFjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkxheW91dEFjdGlvbkdyb3VwX2ZsYXRMYXlvdXRBY3Rpb25fbGFiZWwpOyAKLQkJZmxhdExheW91dEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0RFU0NfTEFZT1VUX0ZMQVQpOwotCQlJQWN0aW9uIGhpZXJhcmNoaWNhbExheW91dD0gbmV3IExheW91dEFjdGlvbihsaWJWaWV3LCBmYWxzZSk7Ci0JCWhpZXJhcmNoaWNhbExheW91dC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkxheW91dEFjdGlvbkdyb3VwX2hpZXJhcmNoaWNhbExheW91dEFjdGlvbl9sYWJlbCk7Ci0JCWhpZXJhcmNoaWNhbExheW91dC5zZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0RFU0NfTEFZT1VUX0hJRVJBUkNISUNBTCk7Ci0JCQotCQlyZXR1cm4gbmV3IElBY3Rpb25bXXtmbGF0TGF5b3V0QWN0aW9uLCBoaWVyYXJjaGljYWxMYXlvdXR9OwotCX0KLX0KLQotY2xhc3MgTGF5b3V0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbiB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZklzRmxhdExheW91dDsKLQlwcml2YXRlIExpYnJhcnlWaWV3IGZsaWJWaWV3OwotCi0JcHVibGljIExheW91dEFjdGlvbihMaWJyYXJ5VmlldyBsaWJWaWV3LCBib29sZWFuIGZsYXQpIHsKLQkJc3VwZXIoIiIsIEFTX1JBRElPX0JVVFRPTik7IC8vJE5PTi1OTFMtMSQKLQotCQlmSXNGbGF0TGF5b3V0PSBmbGF0OwotCQlmbGliVmlldz0gbGliVmlldzsKLQkJaWYgKGZJc0ZsYXRMYXlvdXQpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIEF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxBWU9VVF9GTEFUX0FDVElPTik7Ci0JCWVsc2UKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTEFZT1VUX0hJRVJBUkNISUNBTF9BQ1RJT04pOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKFBsdWdpblVJUGFja2FnZUNvbnRleHQuSU5TVEFOQ0UuaXNGbGF0TGF5b3V0KCkgIT0gZklzRmxhdExheW91dCkgewotCQkJUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS50b2dnbGVMYXlvdXQoKTsKLQkJCS8vIHNhdmUgc3RhdGUKLQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5zZXRMYXlvdXQoUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5nZXRMYXlvdXRBc1N0cmluZygpKTsKLQkJfQotCQlmbGliVmlldy5nZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKLQkJZmxpYlZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQlmbGliVmlldy5nZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGQ0M2Y4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlJlZG9BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlVuZG9BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLkxpYnJhcnlFVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLQotLyoqCi0gKiBUaGUgTGlicmFyeSB2aWV3IGFjdGlvbiBiYXIgY29udHJpYnV0b3IuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcwotCQlFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgaW1wbGVtZW50cwotCQlJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQotCS8vIEtlZXAgdHJhY2sgb2YgdGhlIGFjdGl2ZSBlZGl0b3IuCi0JcHJvdGVjdGVkIElWaWV3UGFydCBhY3RpdmVWaWV3UGFydDsKLQotCS8vIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLgotCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbkJhcnMgdmlld0FjdGlvbkJhcnM7Ci0KLQkvLyBMaWJyYXJ5IHZpZXcgZWRpdCBhY3Rpb24KLQlwcm90ZWN0ZWQgTGlicmFyeVZpZXdFZGl0QWN0aW9uIGxpYnJhcnlWaWV3RWRpdEFjdGlvbjsKLQotCS8vIENvbmZpZ3VyYXRpb24gdmlldyBlZGl0IGFjdGlvbgotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24gY29uZmlnVmlld0VkaXRBY3Rpb247Ci0KLQlwcml2YXRlIEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQkKLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgUHJvcGVydGllcyB2aWV3LgotCSAqLwotCXByb3RlY3RlZCBJQWN0aW9uIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbSkgeyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIHZpZXdlciBvZiB0aGUgY3VycmVudCBlZGl0b3IgaWYgdGhlIGVkaXRvciBpbXBsZW1lbnRzCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcn0uCi0JICovCi0JcHJvdGVjdGVkIElBY3Rpb24gcmVmcmVzaFZpZXdlckFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0pIHsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlyZXR1cm4gYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKLQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJcmVmcmVzaFZpZXdlcih2aWV3ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvCi0JICogZWFjaCBkZXNjcmlwdG9yIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZUNoaWxkQWN0aW9uczsKLQotCS8qKgotCSAqIFRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yCi0JICogQ3JlYXRlQ2hpbGQgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXI7Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcKLQkgKiB0byBlYWNoIGRlc2NyaXB0b3IgZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0KLQkgKiBwcm92aWRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVTaWJsaW5nQWN0aW9uczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZQotCSAqIGFkZGVkIGZvciBDcmVhdGVTaWJsaW5nIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCXRoaXMuZWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0JCQotCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBMaWJyYXJ5VmFsaWRhdGVBY3Rpb24oKTsKLQkJKChMaWJyYXJ5VmFsaWRhdGVBY3Rpb24pdmFsaWRhdGVBY3Rpb24pLnB1dENvbnRleHREYXRhKExpYnJhcnlFVmFsaWRhdG9yLkNUWF9BREFQVEVSX0ZBQ1RPUllfUFJPVklERVIsCi0JCQkJUHJvY2Vzc0VkaXRvci5hZGFwdGVyRmFjdG9yeVByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigibWV0aG9kLXNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCi0JCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJtZXRob2QtYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQWRkcyB0byB0aGUgbWVudSBiYXIgYSBtZW51IGFuZCBzb21lIHNlcGFyYXRvcnMgZm9yIGVkaXRvcgotCSAqIGFkZGl0aW9ucywgYXMgd2VsbCBhcyB0aGUgc3ViLW1lbnVzIGZvciBvYmplY3QgY3JlYXRpb24gaXRlbXMuCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51TWFuYWdlcik7Ci0KLQkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9NZXRob2RFZGl0b3JfbWVudSwgImNvbS5pYm0ubWV0aG9kTWVudUlEIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigic2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFByZXBhcmUgZm9yIENyZWF0ZUNoaWxkIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KLQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtKTsgLy8kTk9OLU5MUy0xJAotCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlU2libGluZyBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCi0JCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0pOyAvLyROT04tTkxTLTEkCi0JCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEZvcmNlIGFuIHVwZGF0ZSBiZWNhdXNlIEVjbGlwc2UgaGlkZXMgZW1wdHkgbWVudXMgbm93LgotCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQkJbWVudU1hbmFnZXIudXBkYXRlQWxsKHRydWUpOwotCQkJfQotCQl9KTsKLQotCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsKLQl9Ci0KLQlwdWJsaWMgSVZpZXdQYXJ0IGdldEFjdGl2ZVZpZXcoKSB7Ci0JCXJldHVybiBhY3RpdmVWaWV3UGFydDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVWaWV3KElWaWV3UGFydCBwYXJ0KSB7Ci0JCS8vIFRPRE8gLSBtYXkgbmVlZCB0byBjaGVjayBvdGhlciBtZXRob2QKLQkJaWYgKHBhcnQgIT0gbnVsbCkKLQkJCXN1cGVyLnNldEFjdGl2ZVZpZXcocGFydCk7Ci0JCWlmIChwYXJ0ID09IGFjdGl2ZVZpZXdQYXJ0KQotCQkJcmV0dXJuOwotCQlpZiAoYWN0aXZlVmlld1BhcnQgIT0gbnVsbCkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQl9Ci0JCWlmIChwYXJ0ID09IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsKLQkJfQotCQlpZiAoIShwYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikpCi0JCQlyZXR1cm47Ci0JCWFjdGl2ZVZpZXdQYXJ0ID0gcGFydDsKLQkJZWRpdGluZ0RvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgcGFydCkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCi0JCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KLQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyID0gcGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCQkJLy8gRmFrZSBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgbWVudXMuCi0JCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkgewotCQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwKLQkJCQkJCXNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKSk7Ci0JCQl9Ci0JCX0KLQotCQlhY3RpdmF0ZSgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJYWN0aXZlVmlld1BhcnQucmVtb3ZlUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLQotCQlkZWxldGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJY3V0QWN0aW9uLnNldEVkaXRpbmdEb21haW4obnVsbCk7Ci0JCWNvcHlBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJcGFzdGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJdW5kb0FjdGlvbi5zZXRFZGl0aW5nRG9tYWluKG51bGwpOwotCQlyZWRvQWN0aW9uLnNldEVkaXRpbmdEb21haW4obnVsbCk7Ci0KLQkJaWYgKGxvYWRSZXNvdXJjZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlsb2FkUmVzb3VyY2VBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJfQotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZGVsZXRlQWN0aW9uKTsKLQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpYnJhcnlWaWV3RWRpdEFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjdXRBY3Rpb24pOwotCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29weUFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihwYXN0ZUFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzYWJsZUdsb2JhbEVkaXRNZW51KCkgewotCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWlmIChsaWJyYXJ5Vmlld0VkaXRBY3Rpb24gIT0gbnVsbCkKLQkJCWxpYnJhcnlWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaWYgKGNvbmZpZ1ZpZXdFZGl0QWN0aW9uICE9IG51bGwpCi0JCQljb25maWdWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3V0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljb3B5QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdW5kb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVkb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmFibGVHbG9iYWxFZGl0TWVudSgpIHsKLQkJZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWlmIChsaWJyYXJ5Vmlld0VkaXRBY3Rpb24gIT0gbnVsbCkKLQkJCWxpYnJhcnlWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlpZiAoY29uZmlnVmlld0VkaXRBY3Rpb24gIT0gbnVsbCkKLQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWN1dEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQljb3B5QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXBhc3RlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXVuZG9BY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmVkb0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciNhY3RpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCWFjdGl2ZVZpZXdQYXJ0LmFkZFByb3BlcnR5TGlzdGVuZXIodGhpcyk7Ci0JCQotCQlkZWxldGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJY3V0QWN0aW9uLnNldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JCWNvcHlBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJcGFzdGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJdW5kb0FjdGlvbi5zZXRFZGl0aW5nRG9tYWluKGVkaXRpbmdEb21haW4pOwotCQlyZWRvQWN0aW9uLnNldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0KLQkJaWYgKGxvYWRSZXNvdXJjZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlsb2FkUmVzb3VyY2VBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJfQotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZGVsZXRlQWN0aW9uKTsKLQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpYnJhcnlWaWV3RWRpdEFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjdXRBY3Rpb24pOwotCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29weUFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihwYXN0ZUFjdGlvbik7Ci0JCWlmICh2YWxpZGF0ZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodmFsaWRhdGVBY3Rpb24pOwotCQl9Ci0KLQkJaWYgKGNvbnRyb2xBY3Rpb24gIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGNvbnRyb2xBY3Rpb24pOwotCQl9ICAgICAgCQkKLQotCQl1cGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IjdXBkYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCWlmIChhY3RpdmVWaWV3UGFydCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gPyAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbgotCQkJCTogU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCQlkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQlsaWJyYXJ5Vmlld0VkaXRBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQljdXRBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQljb3B5QWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJcGFzdGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQl1bmRvQWN0aW9uLnVwZGF0ZSgpOwotCQlyZWRvQWN0aW9uLnVwZGF0ZSgpOwotCi0JCWlmIChsb2FkUmVzb3VyY2VBY3Rpb24gIT0gbnVsbCkgewotCQkJbG9hZFJlc291cmNlQWN0aW9uLnVwZGF0ZSgpOwotCQl9Ci0KLQkJaWYgKHZhbGlkYXRlQWN0aW9uICE9IG51bGwpIHsKLQkJCXZhbGlkYXRlQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LCBoYW5kbGluZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH0gYnkgcXVlcnlpbmcgZm9yCi0JICogdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZAotCSAqIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7Ci0JCX0KLQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsKLQkJfQotCi0JCS8vIFF1ZXJ5IHRoZSBuZXcgc2VsZWN0aW9uIGZvciBhcHByb3ByaWF0ZSBuZXcgY2hpbGQvc2libGluZyBkZXNjcmlwdG9ycwotCQlDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMgPSBudWxsOwotCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCSYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0KQotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCi0JCQluZXdDaGlsZERlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMob2JqZWN0LCBudWxsKTsKLQkJfQotCi0JCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuCi0JCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQkJc2VsZWN0aW9uKTsKLQotCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKLQkJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufQotCSAqIGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sIGFuZCByZXR1cm5zIHRoZQotCSAqIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IE1ldGhvZENyZWF0ZUNoaWxkQWN0aW9uKGVkaXRpbmdEb21haW4sCi0JCQkJCQlzZWxlY3Rpb24sIGkubmV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2gKLQkgKiBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZgotCSAqIHRoZXNlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IE1ldGhvZENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlVmlld1BhcnQsCi0JCQkJCQlzZWxlY3Rpb24sIGkubmV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMgYmFzZWQgb24gdGhlCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZQotCSAqIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sIGJ5IGluc2VydGluZyB0aGVtIGJlZm9yZSB0aGUgc3BlY2lmaWVkCi0JICogY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+LiBJZiA8Y29kZT5JRDwvY29kZT4gaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5IGFkZGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLAotCQkJQ29sbGVjdGlvbiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsKLQkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gYWN0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlJQWN0aW9uIGFjdGlvbiA9IChJQWN0aW9uKSBpLm5leHQoKTsKLQkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgewotCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQltYW5hZ2VyLmFkZChhY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMgYmFzZWQgb24gdGhlCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZQotCSAqIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwKLQkJCUNvbGxlY3Rpb24gYWN0aW9ucykgewotCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7Ci0JCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCS8vIExvb2sgaW50byBTdWJDb250cmlidXRpb25JdGVtcwotCQkJCUlDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbkl0ZW0gPSBpdGVtc1tpXTsKLQkJCQl3aGlsZSAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJY29udHJpYnV0aW9uSXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSkgY29udHJpYnV0aW9uSXRlbSkKLQkJCQkJCQkuZ2V0SW5uZXJJdGVtKCk7Ci0JCQkJfQotCi0JCQkJLy8gRGVsZXRlIHRoZSBBY3Rpb25Db250cmlidXRpb25JdGVtcyB3aXRoIG1hdGNoaW5nIGFjdGlvbi4KLQkJCQlpZiAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGNvbnRyaWJ1dGlvbkl0ZW0pCi0JCQkJCQkJLmdldEFjdGlvbigpOwotCQkJCQlpZiAoYWN0aW9ucy5jb250YWlucyhhY3Rpb24pKSB7Ci0JCQkJCQltYW5hZ2VyLnJlbW92ZShjb250cmlidXRpb25JdGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBwb3AtdXAgbWVudSBiZWZvcmUgaXQgYXBwZWFycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7Ci0JCU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbnVsbDsKLQotCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtKTsgLy8kTk9OLU5MUy0xJAotCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7Ci0JCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogSW5zZXJ0cyBnbG9iYWwgYWN0aW9ucyBiZWZvcmUgdGhlICJhZGRpdGlvbnMtZW5kIiBzZXBhcmF0b3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucy1lbmQiLCBuZXcgU2VwYXJhdG9yKCJ1aS1hY3Rpb25zIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlyZWZyZXNoVmlld2VyQWN0aW9uLnNldEVuYWJsZWQocmVmcmVzaFZpZXdlckFjdGlvbi5pc0VuYWJsZWQoKSk7Ci0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgcmVmcmVzaFZpZXdlckFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucy1lbmQiLCBuZXcgU2VwYXJhdG9yKCkpOyAvLyROT04tTkxTLTEkCi0JCQotCSAgICBTdHJpbmcga2V5ID0gKHN0eWxlICYgQURESVRJT05TX0xBU1RfU1RZTEUpID09IDAgPyAiYWRkaXRpb25zLWVuZCIgOiAiYWRkaXRpb25zIjsKLQkgICAgaWYgKHZhbGlkYXRlQWN0aW9uICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoa2V5LCBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSh2YWxpZGF0ZUFjdGlvbikpOwotCSAgICB9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChJQWN0aW9uQmFycywKLQkgKiAgICAgIElXb3JrYmVuY2hQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQlzdXBlci5pbml0KGFjdGlvbkJhcnMsIHBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNpbml0KElBY3Rpb25CYXJzKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQl2aWV3QWN0aW9uQmFycyA9IGFjdGlvbkJhcnM7Ci0KLQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNoYXJlZEltYWdlcygpOwotCi0JCWxpYnJhcnlWaWV3RWRpdEFjdGlvbiA9IG5ldyBMaWJyYXJ5Vmlld0VkaXRBY3Rpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uTGFiZWxfZWRpdCk7IC8vJE5PTi1OTFMtMSQKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKExpYnJhcnlWaWV3RWRpdEFjdGlvbi5BQ1RJT05fSUQsCi0JCQkJbGlicmFyeVZpZXdFZGl0QWN0aW9uKTsKLQotCQljdXRBY3Rpb24gPSBjcmVhdGVDdXRBY3Rpb24oKTsKLQkJY3V0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ1VUKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLCBjdXRBY3Rpb24pOwotCi0JCWNvcHlBY3Rpb24gPSBjcmVhdGVDb3B5QWN0aW9uKCk7Ci0JCWNvcHlBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DT1BZKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLQkJCQljb3B5QWN0aW9uKTsKLQotCQlwYXN0ZUFjdGlvbiA9IGNyZWF0ZVBhc3RlQWN0aW9uKCk7Ci0JCXBhc3RlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUEFTVEUpKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwKLQkJCQlwYXN0ZUFjdGlvbik7Ci0KLQkJZGVsZXRlQWN0aW9uID0gY3JlYXRlRGVsZXRlQWN0aW9uKCk7Ci0JCWRlbGV0ZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0RFTEVURSkpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwKLQkJCQlkZWxldGVBY3Rpb24pOwotCQkKLQkJdW5kb0FjdGlvbiA9IG5ldyBVbmRvQWN0aW9uKCk7Ci0JCXVuZG9BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9VTkRPKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSwKLQkJCQl1bmRvQWN0aW9uKTsKLQotCQlyZWRvQWN0aW9uID0gbmV3IFJlZG9BY3Rpb24oKTsKLQkJcmVkb0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1JFRE8pKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpLAotCQkJCXJlZG9BY3Rpb24pOwotCi0JCWxpYnJhcnlWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGN1dCBhY3Rpb24KLQkgKiBAcmV0dXJuIGFjdGlvbgotCSAqLwotCXByb3RlY3RlZCBDdXRBY3Rpb24gY3JlYXRlQ3V0QWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IEN1dEFjdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHBhc3RlIGFjdGlvbgotCSAqIEByZXR1cm4gYWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIFBhc3RlQWN0aW9uIGNyZWF0ZVBhc3RlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBhc3RlQWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgY29weSBhY3Rpb24KLQkgKiBAcmV0dXJuIGFjdGlvbgotCSAqLwotCXByb3RlY3RlZCBDb3B5QWN0aW9uIGNyZWF0ZUNvcHlBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQ29weUFjdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGRlbGV0ZSBhY3Rpb24KLQkgKiBAcmV0dXJuIGFjdGlvbgotCSAqLwotCXByb3RlY3RlZCBEZWxldGVBY3Rpb24gY3JlYXRlRGVsZXRlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IERlbGV0ZUFjdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjZ2V0QWN0aW9uQmFycygpCi0JICovCi0JcHVibGljIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKSB7Ci0JCXJldHVybiB2aWV3QWN0aW9uQmFyczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZhbGlkYXRlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5VmFsaWRhdGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmQ3M2U2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5VmFsaWRhdGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpY0NoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRGlhZ25vc3RpY2lhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLkVNRkVkaXRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkxpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lWYWxpZGF0aW9uTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uTGlicmFyeUVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHMuTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkxpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5MaWJyYXJ5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZhbGlkYXRlQWN0aW9uIGV4dGVuZHMgVmFsaWRhdGVBY3Rpb24gewotCXByaXZhdGUgSGFzaFNldCByZXNvdXJjZXM7Ci0JcHJpdmF0ZSBib29sZWFuIHN1Y2Nlc3M7Ci0JcHJpdmF0ZSBib29sZWFuIHNob3dTdWNjZXNzID0gdHJ1ZTsKLQlwcml2YXRlIE1hcCBjb250ZXh0RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgTGlicmFyeVZhbGlkYXRlQWN0aW9uKCkgewotCQlzdXBlcigpOwotCQllY2xpcHNlUmVzb3VyY2VzVXRpbCA9IG5ldyBMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlcigpOwotCX0KLQkKLQlwdWJsaWMgTGlicmFyeVZhbGlkYXRlQWN0aW9uKGJvb2xlYW4gc2hvd1N1Y2Nlc3MpIHsKLQkJdGhpcygpOwotCQl0aGlzLnNob3dTdWNjZXNzICA9IHNob3dTdWNjZXNzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwdXRDb250ZXh0RGF0YShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJY29udGV4dERhdGEucHV0KGtleSwgdmFsdWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbiN2YWxpZGF0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ25vc3RpYyB2YWxpZGF0ZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCSAgICBpZihyZXNvdXJjZXMgPT0gbnVsbCkgewotCSAgICAJcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkgICAgCXJlc291cmNlcy5jbGVhcigpOwotCSAgICB9Ci0JICAgIGJvb2xlYW4gZGVwZW5kZW5jeUluZm9NZ3JTZXQgPSBmYWxzZTsKLQkJQ29sbGVjdGlvbiBlT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0ZWRPYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCWVPYmplY3RzLmFkZChlbGVtZW50KTsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9ICgoRU9iamVjdCllbGVtZW50KS5lUmVzb3VyY2UoKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCQlpZiAoISBkZXBlbmRlbmN5SW5mb01nclNldCAmJiBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7CQotCQkJCQlwdXRDb250ZXh0RGF0YShMaWJyYXJ5RVZhbGlkYXRvci5DVFhfREVQRU5ERU5DWV9WQUxJREFUSU9OX01HUiwgbmV3IERlcGVuZGVuY3lWYWxpZGF0aW9uTWdyKGxpYikpOwotCQkJCQlkZXBlbmRlbmN5SW5mb01nclNldCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCSAgICBpbnQgY291bnQgPSBlT2JqZWN0cy5zaXplKCk7Ci0JICAgIGVPYmplY3RzID0gTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5Lm1ha2VUYXJnZXRzRGlzam9pbnQoZU9iamVjdHMpOwotCQlMaWJyYXJ5SXRlcmF0b3IgbGliSXRlciA9IG5ldyBMaWJyYXJ5SXRlcmF0b3IoZU9iamVjdHMsIHRydWUsIExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5ERUVQLCB0cnVlKTsKLQkJd2hpbGUobGliSXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gbGliSXRlci5uZXh0KCk7Ci0JCQljb3VudCsrOwotCQkJaWYobyBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9ICgoRU9iamVjdClvKS5lUmVzb3VyY2UoKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCQkKLQkJCQlpZihvIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JCQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgbzsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKFRuZ1V0aWwuZ2V0VHlwZVRleHQoZSkgKyAiOiAnIiArIGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JICAgIHByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIiIsIGNvdW50KTsKLQotLy8JICAgIGZpbmFsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gCi0vLwkgICAgICBkb21haW4gaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gPyAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkgOiBudWxsOwotCi0JICAgIERpYWdub3N0aWNpYW4gZGlhZ25vc3RpY2lhbiA9IAotCSAgICAgIG5ldyBEaWFnbm9zdGljaWFuKCkKLQkgICAgICB7Ci0JICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE9iamVjdExhYmVsKEVPYmplY3QgZU9iamVjdCkKLQkgICAgICAgIHsKLS8vCSAgICAgICAgICBpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCAmJiAhZU9iamVjdC5lSXNQcm94eSgpKQotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIElJdGVtTGFiZWxQcm92aWRlciBpdGVtTGFiZWxQcm92aWRlciA9IChJSXRlbUxhYmVsUHJvdmlkZXIpYWRhcHRlckZhY3RvcnkuYWRhcHQoZU9iamVjdCwgSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLS8vCSAgICAgICAgICAgIGlmIChpdGVtTGFiZWxQcm92aWRlciAhPSBudWxsKQotLy8JICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICByZXR1cm4gaXRlbUxhYmVsUHJvdmlkZXIuZ2V0VGV4dChlT2JqZWN0KTsKLS8vCSAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICB9Ci0vLwkgIAotLy8JICAgICAgICAgIHJldHVybiBzdXBlci5nZXRPYmplY3RMYWJlbChlT2JqZWN0KTsKLQkgICAgICAgIAkKLQkgICAgICAgIAlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVPYmplY3QpOwotCSAgICAgICAgfQotCi0JICAgICAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShFQ2xhc3MgZUNsYXNzLCBFT2JqZWN0IGVPYmplY3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpCi0JICAgICAgICB7Ci0JICAgICAgICAgIHByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7Ci0JICAgICAgICAgIGlmKGNvbnRleHQgPT0gbnVsbCkgewotCSAgICAgICAgCSAgY29udGV4dCA9IGNvbnRleHREYXRhOwkgICAgICAgIAkgIAotCSAgICAgICAgICB9Ci0JICAgICAgICAgIGVsc2UgewotCSAgICAgICAgCSAgY29udGV4dC5wdXRBbGwoY29udGV4dERhdGEpOwotCSAgICAgICAgICB9Ci0JICAgICAgICAgIHJldHVybiBzdXBlci52YWxpZGF0ZShlQ2xhc3MsIGVPYmplY3QsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkgICAgICAgIH0JICAgICAgICAKLQkgICAgICAgIAotCSAgICAgIH07Ci0JICAgICAgCi0JICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChlT2JqZWN0cyk7Ci0JICAgICAgaW50IG1heCA9IGxpc3Quc2l6ZSgpIC0gMTsKLQkgICAgICBTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkgICAgCSAgT2JqZWN0IGUgPSBsaXN0LmdldChpKTsKLQkgICAgCSAgaWYoZSBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCSAgICAJCSAgc3RyQnVmLmFwcGVuZCgoKE5hbWVkRWxlbWVudCllKS5nZXROYW1lKCkpLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCSAgICAJICB9Ci0JICAgICAgfQotCSAgICAgIE9iamVjdCBlID0gbWF4IDwgMCA/IG51bGwgOiBsaXN0LmdldChtYXgpOwotCSAgICAgIGlmKGUgaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLSAgICAJCSAgc3RyQnVmLmFwcGVuZCgoKE5hbWVkRWxlbWVudCllKS5nZXROYW1lKCkpOwotICAgIAkgIH0KLQkgICAgICBCYXNpY0RpYWdub3N0aWMgZGlhZ25vc3RpY3MgPSAKLQkgICAgICAgICAgbmV3IEJhc2ljRGlhZ25vc3RpYwotCSAgICAgICAgICAgIChFT2JqZWN0VmFsaWRhdG9yLkRJQUdOT1NUSUNfU09VUkNFLAotCSAgICAgICAgICAgICAwLAotCSAgICAgICAgICAgICBFY29yZVBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcKLQkgICAgICAgICAgICAgICAoIl9VSV9EaWFnbm9zdGljUm9vdF9kaWFnbm9zdGljIiwgLy8kTk9OLU5MUy0xJCAKLQkgICAgICAgICAgICAgICAgbmV3IE9iamVjdCBbXSB7IHN0ckJ1Zi50b1N0cmluZygpIH0pLCAvLyROT04tTkxTLTEkCi0JICAgICAgICAgICAgIGxpc3QudG9BcnJheSgpKTsKLQkgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkgICAgCSAgRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCSAgICAJICBwcm9ncmVzc01vbml0b3Iuc2V0VGFza05hbWUKLQkgICAgCSAgKEVNRkVkaXRVSVBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9WYWxpZGF0aW5nX21lc3NhZ2UiLCBuZXcgT2JqZWN0IFtdIHtkaWFnbm9zdGljaWFuLmdldE9iamVjdExhYmVsKGVPYmplY3QpfSkpOwotCSAgICAJICBkaWFnbm9zdGljaWFuLnZhbGlkYXRlKGVPYmplY3QsIGRpYWdub3N0aWNzKTsKLQkgICAgICB9Ci0JICAgICAgc3VjY2VzcyA9IGRpYWdub3N0aWNzLmdldFNldmVyaXR5KCkgPT0gRGlhZ25vc3RpYy5PSzsKLQkgICAgICByZXR1cm4gZGlhZ25vc3RpY3M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbiNoYW5kbGVEaWFnbm9zdGljKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURpYWdub3N0aWMoRGlhZ25vc3RpYyBkaWFnbm9zdGljKSB7Ci0JCWlmKGRpYWdub3N0aWMgIT0gbnVsbCkgewotCQkJaWYoc2hvd1N1Y2Nlc3MgfHwgIWlzU3VjY2Vzc2Z1bCgpKSB7Ci0JCQkJLy8gc2F2ZSB0aGUgcmVmZXJlbmNlIHRvIEVjbGlwc2VSZXNvdXJjZXNVdGlsIGFuZCBzZXQgZWNsaXBzZVJlc291cmNlc1V0aWwgdG8gbnVsbAotCQkJCS8vIHNvIHN1cGVyIG1ldGhvZCB3aWxsIG5vdCB0cnkgdG8gZGVhbCB3aXRoIHRoZSBtYXJrZXJzCi0JCQkJLy8KLQkJCQlFY2xpcHNlUmVzb3VyY2VzVXRpbCBzYXZlZFJlZiA9IGVjbGlwc2VSZXNvdXJjZXNVdGlsOwotCQkJCWVjbGlwc2VSZXNvdXJjZXNVdGlsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlzdXBlci5oYW5kbGVEaWFnbm9zdGljKGRpYWdub3N0aWMpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJZWNsaXBzZVJlc291cmNlc1V0aWwgPSBzYXZlZFJlZjsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGRlYWxpbmcgd2l0aCBtYXJrZXJzCi0JCQkvLwotCQkJaWYgKGVjbGlwc2VSZXNvdXJjZXNVdGlsICE9IG51bGwpCQkJCQotCQkJewotCQkJCS8vIGRlbGV0ZSBvbGQgbWFya2VycwotCQkJCS8vCQkJCQkKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWVjbGlwc2VSZXNvdXJjZXNVdGlsLmRlbGV0ZU1hcmtlcnMoKFJlc291cmNlKSBpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJCQotCQkJCVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCQkJCWlmICghZGlhZ25vc3RpYy5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKSkKLQkJCQl7Ci0JCQkJCU1hcCBkaWFnbm9zdGljVG9SZXNvdXJjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaSA9IGRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQkJCQl7Ci0JCQkJCQlEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA9IChEaWFnbm9zdGljKWkubmV4dCgpOwotCQkJCQkJTGlzdCBkYXRhID0gY2hpbGREaWFnbm9zdGljLmdldERhdGEoKTsKLQkJCQkJCWlmICghZGF0YS5pc0VtcHR5KCkpIHsKLQkJCQkJCQlPYmplY3QgbyA9IGRhdGEuZ2V0KDApOwotCQkJCQkJCWlmKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKChFT2JqZWN0KW8pLmVSZXNvdXJjZSgpOwotCQkJCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlkaWFnbm9zdGljVG9SZXNvdXJjZU1hcC5wdXQoY2hpbGREaWFnbm9zdGljLCByZXNvdXJjZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCQkJCQkKLQkJCQkJLy8gY3JlYXRlIG1hcmtlcnMKLQkJCQkJLy8KLQkJCQkJZm9yIChJdGVyYXRvciBpID0gZGlhZ25vc3RpY1RvUmVzb3VyY2VNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQkJCQl7Ci0JCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGkubmV4dCgpOwotCQkJCQkJRGlhZ25vc3RpYyBjaGlsZERpYWdub3N0aWMgPSAoRGlhZ25vc3RpYyllbnRyeS5nZXRLZXkoKTsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQkJZWNsaXBzZVJlc291cmNlc1V0aWwuY3JlYXRlTWFya2VycyhyZXNvdXJjZSwgY2hpbGREaWFnbm9zdGljKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gc2VsZWN0IHRoZSBmaXJzdCBvYmplY3Qgd2l0aCBwcm9ibGVtIGluIHRoZSB2aWV3ZXIgaWYgcG9zc2libGUKLQkJCQkJLy8KLQkJCQkJTGlzdCBkYXRhID0gKChEaWFnbm9zdGljKWRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKS5nZXQoMCkpLmdldERhdGEoKTsKLQkJCQkJaWYgKCFkYXRhLmlzRW1wdHkoKSkKLQkJCQkJewotCQkJCQkJT2JqZWN0IHBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7CQkJCQkJCi0JCQkJCQlPYmplY3QgZSA9IGRhdGEuZ2V0KDApOwotCQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KQotCQkJCQkJewotCQkJCQkJCSgoSVNldFNlbGVjdGlvblRhcmdldClwYXJ0KS5zZWxlY3RSZXZlYWwobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZSkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAocGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikKLQkJCQkJCXsKLQkJCQkJCQl2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilwYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCQkJCQlpZiAodmlld2VyICE9IG51bGwpCi0JCQkJCQkJewotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRhdGEuZ2V0KDApKSwgdHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9CQkJCQkKLQkJCQl9Ci0JCQkJaWYodmlld2VyID09IG51bGwpIHsKLQkJCQkJT2JqZWN0IHBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKQotCQkJCQl7Ci0JCQkJCQl2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilwYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZih2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCQkKLQkJCQl0cnkgewotCQkJCQlyZWZyZXNoVmlld3MoKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaWV3cygpIHsKLQkJQ29uZmlndXJhdGlvblZpZXcuZ2V0VmlldygpLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoKSB7Ci0JCXJldHVybiBzdWNjZXNzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3Q29weUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdDb3B5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1YjIxYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdDb3B5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi0KLS8qKgotICogQ29waWVzIGFuIGVsZW1lbnQgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWaWV3Q29weUFjdGlvbiBleHRlbmRzIENvcHlBY3Rpb24gewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChjb21tYW5kID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UgewotCQkJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJCSgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pLnJlc2V0Q29weU1hcHMoKTsKLQkJCX0KLQkJCXN1cGVyLnJ1bigpOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0cy5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikKLQkJCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlbGVtZW50KSkgewotCQkJCWNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJfQotCi0JCX0KLQotCQljb21tYW5kID0gY3JlYXRlQ29tbWFuZChjb2xsZWN0aW9uKTsKLQotCQlyZXR1cm4gY29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0N1dEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdDdXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzJjY2RlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0N1dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkN1dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi0vKioKLSAqIEN1dHMgYW4gZWxlbWVudCBpbiB0aGUgTGlicmFyeSB2aWV3IHRvIHRoZSBjbGlwYm9hcmQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld0N1dEFjdGlvbiBleHRlbmRzIEN1dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZQotCQkJc3VwZXIucnVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdEZWxldGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3RGVsZXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlOWM0YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdEZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuSUVkaXRvcktlZXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLQotLyoqCi0gKiBEZWxldGVzIGFuIGVsZW1lbnQgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXdEZWxldGVBY3Rpb24gZXh0ZW5kcyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uIHsKLQkKLQkvKiogCi0JICogRGVsZXRzIGFuIGVsZW1lbnQgaW4gbGlicmFyeSB2aWV3Ci0JICogCi0JICovCi0JcHVibGljIExpYnJhcnlWaWV3RGVsZXRlQWN0aW9uKCkgewotCQl0aGlzKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGVzIGFuIGVsZW1lbnQgaW4gbGlicmFyeSB2aWV3IGFmdGVyIGNvbmZpcm1pbmcgd2l0aCB1c2VyCi0JICogQHBhcmFtIGNvbmZpcm0KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVZpZXdEZWxldGVBY3Rpb24oYm9vbGVhbiBjb25maXJtKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29uZmlybSA9IGNvbmZpcm07IAotCX0KLQotCS8qKgotCSAqIEBzZWUgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNkaWREZWxldGUoQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaWREZWxldGUoQ29sbGVjdGlvbiBkZWxldGVkRWxlbWVudHMpIHsKLQkJLy8gQ2xvc2UgYWxsIG9wZW4gZWRpdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhlIGRlbGV0ZWQgZWxlbWVudHMuCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlbGV0ZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQlJRWRpdG9yS2VlcGVyLlJFRkVSRU5DRS5nZXRFZGl0b3JLZWVwZXIoKQotCQkJCQkJLmNsb3NlRWRpdG9yc09uRGVsZXRpb24oKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEN1c3RvbUNhdGVnb3J5IGdldFJvb3RDdXN0b21DYXRlZ29yeShPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvcig7IG9iamVjdCBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyOyBvYmplY3QgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCkuZ2V0T3duZXIoKSk7Ci0JCW9iamVjdCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCXJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSAmJiBUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqZWN0KSA/Ci0JCQkoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlBcnJheUxpc3QgZmlsdGVyZWRTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQkJCQkJfHwgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIFRuZ1V0aWwKLQkJCQkJCQkuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlbGVtZW50KSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlDdXN0b21DYXRlZ29yeSByb290Q3VzdG9tQ2F0ZWdvcnkgPSBnZXRSb290Q3VzdG9tQ2F0ZWdvcnkoZSk7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY2MgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGVsZW1lbnQ7Ci0JCQkJaWYgKHJvb3RDdXN0b21DYXRlZ29yeSAhPSBudWxsICYmIAotCQkJCQkJVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocm9vdEN1c3RvbUNhdGVnb3J5KSA9PSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYykpIHsKLQkJCQkJLy8gc2VsZWN0ZWQgY3VzdG9tZSBjYXRlZ29yeSBpcyBpbiB0aGUgY3VycmVudCBwbHVnaW4uCi0JCQkJCS8vIGFkZCB0aGUgZWxlbWVudCB0byB0aGUgc2VsZWN0aW9uIGluc3RlYWQgb2YgaXRzCi0JCQkJCS8vIHdyYXBwZXIgc28gdGhlIGVsZW1lbnQKLQkJCQkJLy8gd2lsbCBiZSBkZWxldGVkIHBlcm1hbmVudGx5IGZyb20gdGhlIGxpYnJhcnkKLQkJCQkJLy8KLQkJCQkJZmlsdGVyZWRTZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwkJCQkJCi0JCQkJfQotCQkJfSBlbHNlIHsJCQkJCi0JCQkJaWYoZSBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUlXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIGU7Ci0vLwkJCQkJaWYod3JhcHBlci5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIgJiYKLS8vCQkJCQkJCSEoVG5nVXRpbC51bndyYXAod3JhcHBlci5nZXRPd25lcigpKSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSkgewotLy8JCQkJCQkvLyBkaXNhbGxvdyBkZWxldGluZyBlbGVtZW50IHdoZW4gaXRzIHJlZmVyZW5jZSBpbgotLy8JCQkJCQkvLyBDdXN0b21DYXRlZ29yeSB0cmVlCi0vLwkJCQkJCS8vIHRoYXQgaXMgbm90IGRpcmVjdGx5IHVuZGVyIGEgQ3VzdG9tQ2F0ZWdvcnkgaXMKLS8vCQkJCQkJLy8gc2VsZWN0ZWQKLS8vCQkJCQkJLy8KLS8vCQkJCQkJY29udGludWU7Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKFRuZ1V0aWwuaXNVbmRlckN1c3RvbUNhdGVnb3J5VHJlZSh3cmFwcGVyKSkgewotCQkJCQkJLy8gZGlzYWxsb3cgZGVsZXRpbmcgZWxlbWVudCB1bmRlciBhIGN1c3RvbSBjYXRlZ29yeSB0aGF0IGlzIG5vdCBhIGN1c3RvbSBjYXRlZ29yeQotCQkJCQkJLy8KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHdyYXBwZXIuZ2V0RmVhdHVyZSgpID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMgCi0JCQkJCQkJfHwgd3JhcHBlci5nZXRGZWF0dXJlKCkgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTKSAKLQkJCQkJewotCQkJCQkJT2JqZWN0IG93bmVyID0gd3JhcHBlci5nZXRPd25lcigpOwotCQkJCQkJaWYob3duZXIgaW5zdGFuY2VvZiBFT2JqZWN0ICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0ICYmIAotCQkJCQkJCQlVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb3duZXIpID09IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBlbGVtZW50KSkgewotCQkJCQkJCS8vIGNhdGVnb3J5IGdyb3VwaW5nIGFuZCBjYXRlZ29yeSBhcmUgaW4gdGhlIHNhbWUgcGx1Z2luCi0JCQkJCQkJLy8gYWRkIHRoZSBlbGVtZW50IHRvIHRoZSBzZWxlY3Rpb24gaW5zdGVhZCBvZiBpdHMgd3JhcHBlciBzbyB0aGUgZWxlbWVudCAKLQkJCQkJCQkvLyB3aWxsIGJlIGRlbGV0ZWQgcGVybWFuZW50bHkgZnJvbSB0aGUgbGlicmFyeQotCQkJCQkJCS8vCi0JCQkJCQkJZmlsdGVyZWRTZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChmaWx0ZXJlZFNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIHN1cGVyCi0JCQkJLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaWx0ZXJlZFNlbGVjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI3BlcmZvcm1EZWxldGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWxldGUoKSB7Ci0JCUhhc2hTZXQgY29uZmlnc1RvRGVsZXRlID0gbmV3IEhhc2hTZXQoKTsKLQkJSGFzaFNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCk7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJY29uZmlnc1RvRGVsZXRlLmFkZChvYmplY3QpOwotCQkJCX0KLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCAmJiAhcGVyc2lzdGVyLmhhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKG9iamVjdCkpIHsKLQkJCQkJRU9iamVjdCBjb250YWluZXIgPSAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwgJiYgY29udGFpbmVyLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjb250YWluZXIuZVJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gQXZvaWQgZGVsZXRpbmcgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiBhIHByb2Nlc3MuCi0JCWlmICghY29uZmlnc1RvRGVsZXRlLmlzRW1wdHkoKSkgewotCQkJSGFzaFNldCBjb25maWdHVUlEc1RvRGVsZXRlID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbmZpZ3NUb0RlbGV0ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQljb25maWdHVUlEc1RvRGVsZXRlLmFkZChjb25maWcuZ2V0R3VpZCgpKTsKLQkJCX0KLQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5lUmVzb3VyY2UoKQotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCXJlc291cmNlU2V0Ci0JCQkJCS5sb2FkT3Bwb3NpdGVGZWF0dXJlcygKLQkJCQkJCQlDb2xsZWN0aW9ucwotCQkJCQkJCQkJLnNpbmdsZXRvbkxpc3QoQXNzb2NpYXRpb25IZWxwZXIuTWV0aG9kQ29uZmlndXJhdGlvbl9EZXBlbmRlbnRQcm9jZXNzZXMpLAotCQkJCQkJCWNvbmZpZ0dVSURzVG9EZWxldGUpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb25maWdzVG9EZWxldGUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRlci5uZXh0KCk7Ci0KLQkJCQlMaXN0IHJlZmVyZW5jZXMgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldERlcGVuZGVudFByb2Nlc3Nlcyhjb25maWcpOwotCQkJCWlmIChyZWZlcmVuY2VzICE9IG51bGwgJiYgcmVmZXJlbmNlcy5zaXplKCkgPiAwKSB7Ci0JCQkJCVN0cmluZyBwcm9jZXNzTmFtZSA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSByZWZlcmVuY2VzCi0JCQkJCQkJLmdldCgwKSkuZ2V0TmFtZSgpOwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZWxldGVEaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0ZUNvbmZpZ0Vycm9yX21zZywgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJCQkJCXByb2Nlc3NOYW1lKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJfQotCi0JCX0KLQotCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShtb2RpZmllZFJlc291cmNlcywKLQkJCQlNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5KAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZWxldGVEaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RhdHVzKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChjb25maXJtRGVsZXRlKCkpIHsKLQkJCS8vIENvbGxlY3QgdGhlIGluZm9ybWF0aW9uIG9mIFJlZnJlc2hhYmxlIE9iamVjdHMKLQkJCS8vICggUmVmZXJlbmNlIE9iamVjdHMgc2hvdWxkIGJlIHJlZnJlc2hlZCBpbiBuYXZpZ2F0aW9uIHRyZWUpIC0KLQkJCUFycmF5TGlzdCByZWZyZXNoTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZGVsZXRpbmdPYmplY3QgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJaWYgKGRlbGV0aW5nT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkvLyBjaGVjayBmb3IgdmFyaWFiaWxpdHkKLQkJCQkJaWYgKGRlbGV0aW5nT2JqZWN0IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gVG5nVXRpbAotCQkJCQkJCQkuZ2V0R2VuZXJhbGl6ZXJzKChWYXJpYWJpbGl0eUVsZW1lbnQpIGRlbGV0aW5nT2JqZWN0KTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgYVJlZmVyZW5jZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlyZWZyZXNoTGlzdC5hZGQoYVJlZmVyZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGV4ZWN1dGUgYWN0dWFsIGRlbGV0ZSBjb21tYW5kLgotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0KLQkJCS8vIFJlZnJlc2ggdGhlIHJlZnJlc2hsaXN0IG9iamVjdHMgaW4gbmF2aWdhdGlvbiB0cmVlLgotCQkJaWYgKHJlZnJlc2hMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlUcmVlVmlld2VyIHZpZXdlciA9ICgoVHJlZVZpZXdlcikgKExpYnJhcnlWaWV3LmdldFZpZXcoKQotCQkJCQkJLmdldFZpZXdlcigpKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmcmVzaExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgcHJvcGVyeSBjaGFuZ2Ugd2l0aCBvbGQgYW5kIG5ldyB2YWx1ZQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAJCQlwcm9wZXJ0eSBuYW1lIGZvciB3aGljaCB2YWx1ZSBpcyBnb2luZyB0byBjaGFuZ2UKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKiAJCQlPbGQgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogCQkJTmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwKLQkJCU9iamVjdCBuZXdWYWx1ZSkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIGN1c3RvbWNhdGVnb3J5IENvcHkvRGVsZXRlIGFjdGlvbiBJZiBwYXJlbnQgb2YKLQkgKiBjdXN0b21jYXRlZ29yeSBzZWxlY3RlZCwgaWdub3JlIHRoZSBjdXN0b21jYXRlZ29yeSwgb3RoZXJ3aXNlIGNvbXBvdW5kCi0JICogY29tbWFuZCBjcmVhdGVzIGEgY29tbWFuZCBmb3IgcGFyZW50IGFuZCBhIGNvbW1hbmQgZm9yIGNoaWxkLAotCSAqIENvbXBvdW5kQ29tbWFuZCB3aWxsIGV4ZWN1dGUgYm90aCBjb21tYW5kcywgY29tbWFuZCBmb3IgcGFyZW50IHdpbGwKLQkgKiByZW1vdmUgcGFyZW50IGl0c2VsZiBhbmQgcmVtb3ZlcyBjaGlsZCB0b28sIG5leHQgaXQgdHJ5IHRvIGV4ZWN1dGUKLQkgKiBjb21tYW5kIGZvciBjaGlsZCwgY29tbWFuZCB3aWxsIGZhaWwgYmVjYXVzZSBjaGlsZCBnb3QgcmVtb3ZlIGluIGNvbW1hbmQKLQkgKiBmb3IgcGFyZW50LiAKLQkgKiBUT0RPOiBoYW5kbGUgcHJvcGVybHkgaW4gUmVtb3ZlQ29tbWFuZCBmb3IgdGhpcyBjYXNlIGluc3RlYWQgaGVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWx0ZXJDdXN0b21DYXRlZ29yeVNlbGVjdGlvbihPYmplY3QgZSwgTGlzdCBmaWx0ZXJlZFNlbGVjdGlvbikgewotCQlpZiAoZSBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlKTsKLQkJfSBlbHNlIHsKLQkJCU9iamVjdCBvd25lciA9ICgoRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIGUpLmdldE93bmVyKCk7Ci0JCQl3aGlsZSAob3duZXIgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWlmIChvd25lciBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJaWYgKCFmaWx0ZXJlZFNlbGVjdGlvbi5jb250YWlucyhvd25lcikpIHsKLQkJCQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoZmlsdGVyZWRTZWxlY3Rpb24uY29udGFpbnMob3duZXIpKQotCQkJCQkJYnJlYWs7Ci0JCQkJCW93bmVyID0gKChEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgb3duZXIpLmdldE93bmVyKCk7Ci0JCQkJCWlmICghKG93bmVyIGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikpIHsKLQkJCQkJCWlmICghZmlsdGVyZWRTZWxlY3Rpb24uY29udGFpbnMob3duZXIpKSB7Ci0JCQkJCQkJZmlsdGVyZWRTZWxlY3Rpb24uYWRkKGUpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdFZGl0QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0VkaXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmI2MGRkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0VkaXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotCi0KLS8qKgotICogRWRpdHMgYW4gZWxlbWVudCBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXdFZGl0QWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBJRCBmb3IgdGhpcyBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0lEID0gTGlicmFyeVZpZXdFZGl0QWN0aW9uLmNsYXNzLmdldE5hbWUoKTsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb24gc2VsZWN0ZWQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Vmlld0VkaXRBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBzZWxlY3RlZC5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gb2JqZWN0cy5uZXh0KCk7Ci0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhpcyBhY3Rpb24gaW4gcmVzcG9uc2UgdG8gdGhlIGdpdmVuIHNlbGVjdGlvbiBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXNlbGVjdGVkID0gbmV3IEhhc2hTZXQoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IG9iamVjdHMubmV4dCgpOwotCQkJT2JqZWN0IHJlYWxPYmogPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCWlmIChyZWFsT2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkmJiAhVG5nVXRpbC5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIHJlYWxPYmopCi0JCQkJCSYmICEocmVhbE9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlICYmICEocmVhbE9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKSkgewotCQkJCXNlbGVjdGVkLmFkZChyZWFsT2JqKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAhc2VsZWN0ZWQuaXNFbXB0eSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTU0YWUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLQotLyoqCi0gKiAKLSAqIEZpbmRzIGFuIGVsZW1lbnQgaW4gbGlicmFyeSB2aWV3Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLQkvKioKLQkgKiBUaGUgSUQgZm9yIHRoaXMgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JRCA9IExpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0JCi0JcHJpdmF0ZSBMaWJyYXJ5VmlldyB0YXJnZXRWaWV3OwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWQ7Ci0KLQkKLQlwdWJsaWMgTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmICh0YXJnZXRWaWV3ID09IG51bGwpCi0JCQl0YXJnZXRWaWV3ID0gTGlicmFyeVZpZXcuZ2V0VmlldygpOwotCQkvLyBzZWxlY3QgY3VycmVudFNlbGVjdGlvbiBpbiBMaWIgVmlldwotCQlpZiAodGFyZ2V0VmlldyAhPSBudWxsICYmIHNlbGVjdGVkICE9IG51bGwgJiYgIXNlbGVjdGVkLmlzRW1wdHkoKSkgewotCQkJCi0JCQkvLyBCdWd6aWxsYSBCdWcgMTc3ODA1Ci0JCQl0cnkgewotCQkJCXRhcmdldFZpZXcuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5zaG93VmlldyhMaWJyYXJ5Vmlldy5WSUVXX0lEKTsJCQkJCi0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihwZSk7Ci0JCQl9Ci0JCQkKLQkJCXRhcmdldFZpZXcuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0ZWQuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkID0gc2VsZWN0aW9uOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJT2JqZWN0IHJlYWxPYmogPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCWlmIChyZWFsT2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0NDg3YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdQYXN0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLklMaWJyYXJ5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi0KLS8qKgotICogUGFzdGVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgY2xpcGJvYXJkIHRvIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uIGV4dGVuZHMgUGFzdGVBY3Rpb24gaW1wbGVtZW50cwotCQlJTGlicmFyeUFjdGlvbiB7Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIuc2V0UHJvZ3Jlc3NNb25pdG9yKGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXBlcmZvcm1QYXN0ZSgpOwotCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtIHBhc3RlIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1QYXN0ZSgpIHsKLQkJaWYoY29tbWFuZCBpbnN0YW5jZW9mIFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIHsKLQkJCVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgY21kID0gKChQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKWNvbW1hbmQpOwotCQkJT2JqZWN0IG93bmVyID0gY21kLmdldE93bmVyKCk7Ci0JCQlpZihvd25lciBpbnN0YW5jZW9mIEFkYXB0ZXIpIHsKLQkJCQlvd25lciA9ICgoQWRhcHRlcilvd25lcikuZ2V0VGFyZ2V0KCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIGNoZWNrIHRhcmdldCBmb3IgbW9kaWZpYWJsZQotCQkJLy8KLQkJCWlmKG93bmVyIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KChFT2JqZWN0KSBvd25lciwgTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKTsKLQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlnZXRUZXh0KCksIG51bGwsIHN0YXR1cyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQkJCi0JCWlmIChjb21tYW5kID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UKLQkJCXN1cGVyLnJ1bigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPCAxKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlIHsKLQkJCU9iamVjdFtdIG9ianMgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG9ianNbaV0gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogTm90aWZ5IHByb3BlcnkgY2hhbmdlIHdpdGggb2xkIGFuZCBuZXcgdmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogCQkJcHJvcGVydHkgbmFtZSBmb3Igd2hpY2ggdmFsdWUgaXMgZ29pbmcgdG8gY2hhbmdlCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICogCQkJT2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqIAkJCU5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsCi0JCQlPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuSUxpYnJhcnlBY3Rpb24jc2V0UHJvZ3Jlc3NNb25pdG9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIHRoZSBwcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCWlmKHByb2dyZXNzTW9uaXRvciA9PSBudWxsKSB7Ci0JCQlwcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCXJldHVybiBwcm9ncmVzc01vbml0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlua1dpdGhFZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpbmtXaXRoRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzYjljMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlua1dpdGhFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogTGlua3MgZWRpdG9yIHdpdGggYW4gZWxlbWVudCBpbiBsaWJyYXJ5IHZpZXcKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIExpbmtXaXRoRWRpdG9yIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIExpYnJhcnlWaWV3IHRhcmdldFZpZXc7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVuYWJsZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgSVBhcnRMaXN0ZW5lciBlZGl0b3JQYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJLy8gU2VsZWN0IHRoZSBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnRseQotCQkJCS8vIHNlbGVjdGVkIGVkaXRvci4KLQkJCQlPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFsxXTsKLQkJCQlvYmplY3RzWzBdID0gRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0U2VsZWN0ZWRFZGl0b3JJbnB1dCgpOwotCQkJCWlmIChvYmplY3RzWzBdICE9IG51bGwpIHsKLQkJCQkJLy8gZGlzYWJsZSB0aGUgc2VsZWN0aW9uQ2hhbmdlZCBtZXRob2QgZnJvbSBmaXJpbmcgZnJvbSB0aGlzIHNlbGVjdGlvbiBjaGFuZ2UKLQkJCQkJZW5hYmxlZCA9IGZhbHNlOwotCQkJCQl0YXJnZXRWaWV3LnNldFNlbGVjdGlvblRvVmlld2VyKG9iamVjdHNbMF0pOwotCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQl0YXJnZXRWaWV3ID0gKExpYnJhcnlWaWV3KSB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGVuYWJsZWQpIHsKLQkJCS8vIHJlbW92ZSBsaXN0ZW5lcnMgZnJvbSBlZGl0b3JwYXJ0Ci0JCQl0YXJnZXRWaWV3LmdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKAotCQkJCQllZGl0b3JQYXJ0TGlzdGVuZXIpOwotCi0JCQllbmFibGVkID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBzZWxlY3QgZWxlbWVudCBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgZWRpdG9yCi0JCQlPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFsxXTsKLQkJCW9iamVjdHNbMF0gPSBFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuZ2V0U2VsZWN0ZWRFZGl0b3JJbnB1dCgpOwotCQkJaWYgKG9iamVjdHNbMF0gIT0gbnVsbCkgewotCQkJCXRhcmdldFZpZXcuc2V0U2VsZWN0aW9uVG9WaWV3ZXIob2JqZWN0c1swXSk7Ci0JCQl9Ci0KLQkJCS8vIGFkZCBsaXN0ZW5lcnMgdG8gZWRpdG9ycGFydAotCQkJdGFyZ2V0Vmlldy5nZXRTaXRlKCkuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihlZGl0b3JQYXJ0TGlzdGVuZXIpOwotCi0JCQllbmFibGVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxpbmtXaXRoRWRpdG9yIHNlbGVjdGlvbiBpcyAiICsgc2VsZWN0aW9uKTsKLQkJaWYgKGVuYWJsZWQpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLnNlbGVjdEVkaXRvcihzZWwuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQWRkSW1hZ2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZEFkZEltYWdlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlOTBiMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQWRkSW1hZ2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5NZXRob2RBZGRJbWFnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5SaWNoVGV4dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgQWRkIEltYWdlIGRpYWxvZy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEFkZEltYWdlQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQWRkSW1hZ2VBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0FERF9JTUFHRSk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZEltYWdlQWN0aW9uX3Rvb2xUaXBUZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlzZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBBIFJpY2ggVGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsICYmIHJpY2hUZXh0IGluc3RhbmNlb2YgSU1ldGhvZFJpY2hUZXh0KSB7Ci0JCQlNZXRob2RBZGRJbWFnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWV0aG9kQWRkSW1hZ2VEaWFsb2coRGlzcGxheQotCQkJCQkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCSgoSU1ldGhvZFJpY2hUZXh0KSByaWNoVGV4dCkuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlTdHJpbmcgaW1hZ2VMaW5rID0gZGlhbG9nLmdldFVybCgpOwotCQkJCWlmIChpbWFnZUxpbmsubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWlmIChkaWFsb2cuZ2V0RmlsZVRvQ29weSgpICE9IG51bGwpIHsKLQkJCQkJCS8vIENvcHkgdGhlIGltYWdlIHRvIHRoZSByZXNvdXJjZSBmb2xkZXIgaWYgbmVjZXNzYXJ5LgotCQkJCQkJdHJ5IHsKLQkJCQkJCQlSZXNvdXJjZUhlbHBlci5nZXRVUkxGb3JBdHRhY2htZW50KGRpYWxvZwotCQkJCQkJCQkJLmdldEZpbGVUb0NvcHkoKSwKLQkJCQkJCQkJCSgoSU1ldGhvZFJpY2hUZXh0KSByaWNoVGV4dCkKLQkJCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKSwgdHJ1ZSk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IpIHsKLQkJCQkJCSgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5hZGRJbWFnZShpbWFnZUxpbmssICIiICsgZGlhbG9nLmdldEhlaWdodCgpLCAiIiArIGRpYWxvZy5nZXRXaWR0aCgpLCBkaWFsb2cuZ2V0QWx0VGFnKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJpY2hUZXh0Ci0JCQkJCQkuZXhlY3V0ZUNvbW1hbmQoCi0JCQkJCQkJCVJpY2hUZXh0Q29tbWFuZC5BRERfSU1BR0UsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJCQkJaW1hZ2VMaW5rLAotCQkJCQkJCQkJCSIiICsgZGlhbG9nLmdldEhlaWdodCgpLCAiIiArIGRpYWxvZy5nZXRXaWR0aCgpLCBkaWFsb2cuZ2V0QWx0VGFnKCkgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQWRkTGlua0FjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQWRkTGlua0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYTdlYWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZEFkZExpbmtBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuTWV0aG9kQWRkTGlua0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQWRkTGlua0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQWRkcyBhIGxpbmsgdG8gYSBSaWNoIFRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQWRkTGlua0FjdGlvbiBleHRlbmRzIEFkZExpbmtBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQWRkTGlua0FjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBBIFJpY2ggVGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBJTWV0aG9kUmljaFRleHQpIHsKLQkJCQlNZXRob2RBZGRMaW5rRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXRob2RBZGRMaW5rRGlhbG9nKERpc3BsYXkKLQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCShJTWV0aG9kUmljaFRleHQpIHJpY2hUZXh0KTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCQlTdHJpbmcgbGlua1VSTCA9IGRpYWxvZy5nZXRMaW5rKCkuZ2V0VVJMKCk7Ci0JCQkJCWlmIChsaW5rVVJMLmxlbmd0aCgpID4gMCkgewotCQkJCQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IpIHsKLQkJCQkJCQkoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuYWRkSFRNTChsaW5rVVJMKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9IVE1MLAotCQkJCQkJCQkJbGlua1VSTCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZGlhbG9nLmdldEZpbGVUb0NvcHkoKSAhPSBudWxsKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJUmVzb3VyY2VIZWxwZXIuZ2V0VVJMRm9yQXR0YWNobWVudChkaWFsb2cKLQkJCQkJCQkJCQkuZ2V0RmlsZVRvQ29weSgpLAotCQkJCQkJCQkJCSgoSU1ldGhvZFJpY2hUZXh0KSByaWNoVGV4dCkKLQkJCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCksIHRydWUpOwotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIFRPRE86IFRoaXMgd2lsbCByZXNldCB0aGUgUlRFJ3MgbW9kaWZpZWQgZmxhZyB0bwotCQkJCQkJLy8gZmFsc2UgYW5kCi0JCQkJCQkvLyB3aWxsIHByZXZlbnQgdGhlIG5ld2x5IGFkZGVkIGxpbmtzIGZyb20gYmVpbmcgc2F2ZWQuCi0JCQkJCQkvLyByaWNoVGV4dC5zZXRUZXh0KHJpY2hUZXh0LmdldFRleHQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXN1cGVyLmV4ZWN1dGUocmljaFRleHQpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RDcmVhdGVDaGlsZEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQ3JlYXRlQ2hpbGRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmU5NTE2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RDcmVhdGVDaGlsZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlN0YXRpY1NlbGVjdGlvbkNvbW1hbmRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci0KLQotLyoqCi0gKiBNZXRob2QgQ3JlYXRlIENoaWxkIGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1ldGhvZENyZWF0ZUNoaWxkQWN0aW9uIGV4dGVuZHMgU3RhdGljU2VsZWN0aW9uQ29tbWFuZEFjdGlvbiB7Ci0JLyoqCi0JICogVGhpcyBkZXNjcmliZXMgdGhlIGNoaWxkIHRvIGJlIGNyZWF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkZXNjcmlwdG9yOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIGFuIGFjdGlvbiB0aGF0IGNyZWF0ZXMgYSBjaGlsZCBzcGVjaWZpZWQKLQkgKiBieSA8Y29kZT5kZXNjcmlwdG9yPC9jb2RlPiBmb3IgdGhlIHNpbmdsZSBvYmplY3QgaW4gdGhlCi0JICogPGNvZGU+c2VsZWN0aW9uPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ3JlYXRlQ2hpbGRBY3Rpb24oRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24sIE9iamVjdCBkZXNjcmlwdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0JCXRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0JCWNvbmZpZ3VyZUFjdGlvbihzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyB0aGUgY29tbWFuZCBmb3Ige0BsaW5rCi0JICogU3RhdGljU2VsZWN0aW9uQ29tbWFuZEFjdGlvbiNjcmVhdGVBY3Rpb25Db21tYW5kfS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBY3Rpb25Db21tYW5kKEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlpZiAoY29sbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IG93bmVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKTsKLQkJCUNvbW1hbmQgY21kID0gbnVsbDsKLQotCQkJaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBDb21tYW5kUGFyYW1ldGVyCi0JCQkJCSYmICgoQ29tbWFuZFBhcmFtZXRlcikgZGVzY3JpcHRvcikuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlDb21tYW5kUGFyYW1ldGVyIG5ld0NoaWxkUGFyYW1ldGVyID0gKENvbW1hbmRQYXJhbWV0ZXIpIGRlc2NyaXB0b3I7Ci0JCQkJQ3JlYXRlQ2hpbGRDb21tYW5kLkhlbHBlciBoZWxwZXIgPSAoSGVscGVyKSAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbillZGl0aW5nRG9tYWluKS5nZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG93bmVyLCBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0vLwkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKEVPYmplY3QpIG93bmVyKS5lQWRhcHRlcnMoKS5pdGVyYXRvcigpOyBpdGVyCi0vLwkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLS8vCQkJCQlpZiAobyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKSB7Ci0vLwkJCQkJCWhlbHBlciA9IChQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikgbzsKLS8vCQkJCQkJYnJlYWs7Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCWNtZCA9IG5ldyBDcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZChlZGl0aW5nRG9tYWluLAotCQkJCQkJKEVPYmplY3QpIG93bmVyLCBuZXdDaGlsZFBhcmFtZXRlcgotCQkJCQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCksIG5ld0NoaWxkUGFyYW1ldGVyCi0JCQkJCQkJCS5nZXRWYWx1ZSgpLCBuZXdDaGlsZFBhcmFtZXRlci5nZXRJbmRleCgpLAotCQkJCQkJY29sbGVjdGlvbiwgaGVscGVyKSB7Ci0JCQkJfTsKLQkJCX0gZWxzZSB7Ci0JCQkJY21kID0gQ3JlYXRlQ2hpbGRDb21tYW5kLmNyZWF0ZShlZGl0aW5nRG9tYWluLCBvd25lciwKLQkJCQkJCWRlc2NyaXB0b3IsIGNvbGxlY3Rpb24pOwotCQkJfQotCi0JCQlyZXR1cm4gbmV3IENyZWF0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKGNtZCk7Ci0JCX0KLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzdXBlclJ1bigpIHsKLQkJc3VwZXIucnVuKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlN0YXRpY1NlbGVjdGlvbkNvbW1hbmRBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJc3VwZXJSdW4oKTsKLQkJCX0KLQkJCQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RDcmVhdGVTaWJsaW5nQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RDcmVhdGVTaWJsaW5nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhZjRmMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQ3JlYXRlU2libGluZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uU3RhdGljU2VsZWN0aW9uQ29tbWFuZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotCi0vKioKLSAqIE1ldGhvZCBDcmVhdGUgU2liaWxpbmcgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWV0aG9kQ3JlYXRlU2libGluZ0FjdGlvbiBleHRlbmRzCi0JCVN0YXRpY1NlbGVjdGlvbkNvbW1hbmRBY3Rpb24gewotCi0JLyoqCi0JICogVGhpcyBkZXNjcmliZXMgdGhlIHNpYmxpbmcgdG8gYmUgY3JlYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRlc2NyaXB0b3I7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgYW4gYWN0aW9uIHRoYXQgY3JlYXRlcyBhIHNpYmxpbmcgc3BlY2lmaWVkCi0JICogYnkgPGNvZGU+ZGVzY3JpcHRvcjwvY29kZT4uCi0JICovCi0JcHVibGljIE1ldGhvZENyZWF0ZVNpYmxpbmdBY3Rpb24oSVZpZXdQYXJ0IHZpZXdQYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbiwKLQkJCU9iamVjdCBkZXNjcmlwdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICh2aWV3UGFydCBpbnN0YW5jZW9mIElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIHsKLQkJCWVkaXRpbmdEb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIHZpZXdQYXJ0KQotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQl9Ci0JCXRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0JCWNvbmZpZ3VyZUFjdGlvbihzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyB0aGUgY29tbWFuZCBmb3Ige0BsaW5rCi0JICogU3RhdGljU2VsZWN0aW9uQ29tbWFuZEFjdGlvbiNjcmVhdGVBY3Rpb25Db21tYW5kfS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBY3Rpb25Db21tYW5kKEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlpZiAoY29sbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJQ29tbWFuZCBjbWQgPSBDcmVhdGVDaGlsZENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIG51bGwsCi0JCQkJCWRlc2NyaXB0b3IsIGNvbGxlY3Rpb24pOwotCQkJcmV0dXJuIG5ldyBDcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZChjbWQpOwotCQl9Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzdhMWI5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkN1dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkxvYWRSZXNvdXJjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlJlZG9BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlVuZG9BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotCi0vKioKLSAqIFRoZSBjb250cmlidXRvciBmb3IgYSBNZXRob2QgZWRpdG9yLgotICogIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzCi0JCUVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQotCS8vIEtlZXAgdHJhY2sgb2YgdGhlIGFjdGl2ZSBlZGl0b3IuCi0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvclBhcnQ7Ci0KLQkvLyBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBwcm92aWRlci4KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotCi0JLy8gSGFuZGxlIHRoZSBTaG93IFByb3BlcnRpZXMgdmlldyBhY3Rpb24uCi0JcHJvdGVjdGVkIElBY3Rpb24gc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCWdldFN0cmluZygiX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleGNlcHRpb24pOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIFRoaXMgYWN0aW9uIHJlZnJlc2hlcyB0aGUgdmlld2VyIG9mIHRoZSBjdXJyZW50IGVkaXRvciBpZiB0aGUgZWRpdG9yCi0JICogaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyfS4KLQkgKi8KLQlwcm90ZWN0ZWQgSUFjdGlvbiByZWZyZXNoVmlld2VyQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCWdldFN0cmluZygiX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtIikpIHsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlyZXR1cm4gYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWRvUmVmcmVzaCgpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8KLQkgKiBlYWNoIGRlc2NyaXB0b3IgZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gY3JlYXRlQ2hpbGRBY3Rpb25zOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlCi0JICogYWRkZWQgZm9yIENyZWF0ZUNoaWxkIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyOwotCi0JLyoqCi0JICogVGhpcyB3aWxsIGNvbnRhaW4gb25lCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBjb3JyZXNwb25kaW5nCi0JICogdG8gZWFjaCBkZXNjcmlwdG9yIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtCi0JICogcHJvdmlkZXIuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gY3JlYXRlU2libGluZ0FjdGlvbnM7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUKLQkgKiBhZGRlZCBmb3IgQ3JlYXRlU2libGluZyBhY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBjb250cmlidXRvci4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yKFN0cmluZyBuYW1lKSB7Ci0JCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsKLQkJdmFsaWRhdGVBY3Rpb24gPSBuZXcgTGlicmFyeVZhbGlkYXRlQWN0aW9uKCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBkZWxldGUgYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgRGVsZXRlQWN0aW9uIGNyZWF0ZURlbGV0ZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBEZWxldGVBY3Rpb24oKTsKLQl9Ci0KLQkgLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRTaGFyZWRJbWFnZXMoKTsKLQotCQlkZWxldGVBY3Rpb24gPSBjcmVhdGVEZWxldGVBY3Rpb24oKTsKLQkJZGVsZXRlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLAotCQkJCWRlbGV0ZUFjdGlvbik7Ci0KLQkJY3V0QWN0aW9uID0gY3JlYXRlQ3V0QWN0aW9uKCk7Ci0JCWN1dEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NVVCkpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSwgY3V0QWN0aW9uKTsKLQotCQljb3B5QWN0aW9uID0gY3JlYXRlQ29weUFjdGlvbigpOwotCQljb3B5QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ09QWSkpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksCi0JCQkJY29weUFjdGlvbik7Ci0KLQkJcGFzdGVBY3Rpb24gPSBjcmVhdGVQYXN0ZUFjdGlvbigpOwotCQlwYXN0ZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1BBU1RFKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksCi0JCQkJcGFzdGVBY3Rpb24pOwotCi0JCXVuZG9BY3Rpb24gPSBuZXcgVW5kb0FjdGlvbigpOwotCQl1bmRvQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfVU5ETykpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCksCi0JCQkJdW5kb0FjdGlvbik7Ci0KLQkJcmVkb0FjdGlvbiA9IG5ldyBSZWRvQWN0aW9uKCk7Ci0JCXJlZG9BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9SRURPKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSwKLQkJCQlyZWRvQWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvcHkgYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ29weUFjdGlvbiBjcmVhdGVDb3B5QWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IENvcHlBY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHBhc3RlIGFjdGlvbgotCSAqIEByZXR1cm4gQWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIFBhc3RlQWN0aW9uIGNyZWF0ZVBhc3RlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBhc3RlQWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjdXQgYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ3V0QWN0aW9uIGNyZWF0ZUN1dEFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDdXRBY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgU2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucyB0byB0aGUgdG9vbCBiYXIuCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IobmFtZSArICItc2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IobmFtZSArICItYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogU2V0cyBlbmFibGVkIGZsYWcKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBtZW51IGJhciBhIG1lbnUgYW5kIHNvbWUgc2VwYXJhdG9ycyBmb3IgZWRpdG9yCi0JICogYWRkaXRpb25zLCBhcyB3ZWxsIGFzIHRoZSBzdWItbWVudXMgZm9yIG9iamVjdCBjcmVhdGlvbiBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQlzdXBlci5jb250cmlidXRlVG9NZW51KG1lbnVNYW5hZ2VyKTsKLQkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCWdldFN0cmluZygiX1VJXyIgKyBuYW1lICsgIl9tZW51IiksICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLiIgKyBuYW1lICsgIk1lbnVJRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKLQkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCi0JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhY3Rpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucy1lbmQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVDaGlsZCBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCi0JCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVTaWJsaW5nIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KLQkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCWdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEZvcmNlIGFuIHVwZGF0ZSBiZWNhdXNlIEVjbGlwc2UgaGlkZXMgZW1wdHkgbWVudXMgbm93LgotCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQkJbWVudU1hbmFnZXIudXBkYXRlQWxsKHRydWUpOwotCQkJfQotCQl9KTsKLQotCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIHRoZSBhY3RpdmUgZWRpdG9yIGNoYW5nZXMsIHRoaXMgcmVtZW1iZXJzIHRoZSBjaGFuZ2UgYW5kIHJlZ2lzdGVycwotCSAqIHdpdGggaXQgYXMgYSBzZWxlY3Rpb24gcHJvdmlkZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQpIHsKLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOwotCQlhY3RpdmVFZGl0b3JQYXJ0ID0gcGFydDsKLQotCQkvLyBTd2l0Y2ggdG8gdGhlIG5ldyBzZWxlY3Rpb24gcHJvdmlkZXIuCi0JCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJaWYgKHBhcnQgPT0gbnVsbCkgewotCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOwotCQl9IGVsc2UgewotCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBwYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JCQkvLyBGYWtlIGEgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgdG8gdXBkYXRlIHRoZSBtZW51cy4KLQkJCWlmIChzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSAhPSBudWxsKSB7Ci0JCQkJc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNlbGVjdGlvblByb3ZpZGVyLAotCQkJCQkJc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LCBoYW5kbGluZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH0gYnkgcXVlcnlpbmcgZm9yCi0JICogdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZAotCSAqIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7Ci0JCX0KLQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsKLQkJfQotCi0JCS8vIFF1ZXJ5IHRoZSBuZXcgc2VsZWN0aW9uIGZvciBhcHByb3ByaWF0ZSBuZXcgY2hpbGQvc2libGluZwotCQkvLyBkZXNjcmlwdG9ycy4KLQkJQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzID0gbnVsbDsKLQkJQ29sbGVjdGlvbiBuZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBudWxsOwotCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCSYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIGFjdGl2ZUVkaXRvclBhcnQpCi0JCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0KLQkJCW5ld0NoaWxkRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIG51bGwpOwotCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobnVsbCwgb2JqZWN0KTsKLQkJfQotCi0JCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuCi0JCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQkJc2VsZWN0aW9uKTsKLQkJY3JlYXRlU2libGluZ0FjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKAotCQkJCW5ld1NpYmxpbmdEZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKLQotCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKLQkJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOwotCQl9Ci0JCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsCi0JCQkJCW51bGwpOwotCQkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0KLQkgKiBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBhbmQgcmV0dXJucyB0aGUKLQkgKiBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoQ29sbGVjdGlvbiBkZXNjcmlwdG9ycywKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUNvbGxlY3Rpb24gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGRlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVDaGlsZEFjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sCi0JCQkJCQlpLm5leHQoKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2VuZXJhdGVzIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGZvciBlYWNoCi0JICogb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwgYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YKLQkgKiB0aGVzZSBhY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoQ29sbGVjdGlvbiBkZXNjcmlwdG9ycywKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUNvbGxlY3Rpb24gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGRlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVTaWJsaW5nQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsCi0JCQkJCQlzZWxlY3Rpb24sIGkubmV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMgYmFzZWQgb24gdGhlCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZQotCSAqIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sIGJ5IGluc2VydGluZyB0aGVtIGJlZm9yZSB0aGUgc3BlY2lmaWVkCi0JICogY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+LiBJZiA8Y29kZT5JRDwvY29kZT4gaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5IGFkZGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLAotCQkJQ29sbGVjdGlvbiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsKLQkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gYWN0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlJQWN0aW9uIGFjdGlvbiA9IChJQWN0aW9uKSBpLm5leHQoKTsKLQkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgewotCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQltYW5hZ2VyLmFkZChhY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMgYmFzZWQgb24gdGhlCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZQotCSAqIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwKLQkJCUNvbGxlY3Rpb24gYWN0aW9ucykgewotCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7Ci0JCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCS8vIExvb2sgaW50byBTdWJDb250cmlidXRpb25JdGVtcwotCQkJCUlDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbkl0ZW0gPSBpdGVtc1tpXTsKLQkJCQl3aGlsZSAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJY29udHJpYnV0aW9uSXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSkgY29udHJpYnV0aW9uSXRlbSkKLQkJCQkJCQkuZ2V0SW5uZXJJdGVtKCk7Ci0JCQkJfQotCi0JCQkJLy8gRGVsZXRlIHRoZSBBY3Rpb25Db250cmlidXRpb25JdGVtcyB3aXRoIG1hdGNoaW5nIGFjdGlvbi4KLQkJCQlpZiAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGNvbnRyaWJ1dGlvbkl0ZW0pCi0JCQkJCQkJLmdldEFjdGlvbigpOwotCQkJCQlpZiAoYWN0aW9ucy5jb250YWlucyhhY3Rpb24pKSB7Ci0JCQkJCQltYW5hZ2VyLnJlbW92ZShjb250cmlidXRpb25JdGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBwb3AtdXAgbWVudSBiZWZvcmUgaXQgYXBwZWFycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCS8vIEFkZCBvdXIgc3RhbmRhcmQgbWFya2VyLgotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJlZGl0IikpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQWRkIHRoZSBlZGl0IG1lbnUgYWN0aW9ucy4KLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKHVuZG9BY3Rpb24pKTsKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKHJlZG9BY3Rpb24pKTsKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCS8vIG1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShjdXRBY3Rpb24pKTsKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGNvcHlBY3Rpb24pKTsKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKHBhc3RlQWN0aW9uKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oZGVsZXRlQWN0aW9uKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0JCS8vIEFkZCBvdXIgb3RoZXIgc3RhbmRhcmQgbWFya2VyLgotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOwotCi0JCWlmIChlbmFibGVkKSB7Ci0JCQlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG51bGw7Ci0JCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7Ci0JCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOwotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaW5zZXJ0cyBnbG9iYWwgYWN0aW9ucyBiZWZvcmUgdGhlICJhZGRpdGlvbnMtZW5kIiBzZXBhcmF0b3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucy1lbmQiLCBuZXcgU2VwYXJhdG9yKCJ1aS1hY3Rpb25zIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJcmVmcmVzaFZpZXdlckFjdGlvbi5zZXRFbmFibGVkKHJlZnJlc2hWaWV3ZXJBY3Rpb24uaXNFbmFibGVkKCkpOwotCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHJlZnJlc2hWaWV3ZXJBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQotCSAgICBTdHJpbmcga2V5ID0gKHN0eWxlICYgQURESVRJT05TX0xBU1RfU1RZTEUpID09IDAgPyAiYWRkaXRpb25zLWVuZCIgOiAiYWRkaXRpb25zIjsKLQkgICAgaWYgKHZhbGlkYXRlQWN0aW9uICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoa2V5LCBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSh2YWxpZGF0ZUFjdGlvbikpOwotCSAgICB9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZyhrZXkpOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2ggdGhlIHZpZXdlcgotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9SZWZyZXNoKCkgewotCQlpZiAoYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewotCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKSBhY3RpdmVFZGl0b3JQYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL011bHRpQWN0aW9uR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL011bHRpQWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODgwZGFkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NdWx0aUFjdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwOwotCi0vKioKLSAqIEEgTXVsdGlBY3Rpb25Hcm91cCB3aWxsIGRpc3BsYXkgYSBsaXN0IG9mIElBY3Rpb25zIGluIGEgbWVudSBieSB0cmFuc2Zvcm1pbmcgdGhlbQotICogaW50byBNZW51SXRlbXMuIFRoZSBsaXN0IG9mIGxhYmVscyBnaXZlbiB3aWxsIGJlIHdoYXQgaXMgZGlzcGxheWVkIGluIHRoZSBWaWV3TWVudSBmb3IgCi0gKiB0aGUgY29ycmVzcG9uZGluZyBhY3Rpb24gKHRoZSBhY3Rpb24gYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4gdGhlIGFjdGlvbiBhcnJheSkuCi0gKiBUaGUgYWN0aW9ucyBhcmUgY3VycmVudGx5IGltcGxlbWVudGVkIGFzIHN0YXRlIGJhc2VkCi0gKiBzbyB0aGF0IGFmdGVyIGFuIGFjdGlvbiBpcyBleGVjdXRlZCB0aGUgbGFiZWwgd2lsbCBoYXZlIGEgc2VsZWN0aW9uIGNoZWNrLgotICogCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmFjdGlvbnMuTXVsdGlBY3Rpb25Hcm91cC5jbGFzcwotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlBY3Rpb25Hcm91cCBleHRlbmRzIEFjdGlvbkdyb3VwIHsKLQkKLQlwdWJsaWMgSUFjdGlvbltdIE5PX0FDVElPTlMgPSBuZXcgSUFjdGlvblswXTsKLQkKLQlwcml2YXRlIElBY3Rpb25bXSBmQWN0aW9uczsgCi0JCi0JcHJpdmF0ZSBpbnQgZkN1cnJlbnRTZWxlY3Rpb247Ci0JcHJpdmF0ZSBNZW51SXRlbVtdIGZJdGVtczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIGdyb3VwIHdpdGggYSBnaXZlbiBzZXQgb2YgYWN0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9ucwkJCXRoZSBhY3Rpb25zIGZvciB0aGlzIG11bHRpIGdyb3VwCi0JICogQHBhcmFtIGN1cnJlbnRTZWxlY3Rpb24JZGVjaWRlcyB3aGljaCBhY3Rpb24gaXMgc2VsZWN0ZWQgaW4gdGhlIG1lbnUgb24gc3RhcnQgdXAuCi0JICogCQkJCQkJCURlbm90ZXMgdGhlIGxvY2F0aW9uIGluIHRoZSBhY3Rpb25zIGFycmF5IG9mIHRoZSBjdXJyZW50Ci0JICogCQkJCQkJCXNlbGVjdGVkIHN0YXRlLiBJdCBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgTXVsdGlBY3Rpb25Hcm91cChJQWN0aW9uW10gYWN0aW9ucywgaW50IGN1cnJlbnRTZWxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJc2V0QWN0aW9ucyhhY3Rpb25zLCBjdXJyZW50U2VsZWN0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhY3Rpb24gZ3JvdXAuIENsaWVudHMgdXNpbmcgdGhpcyBjb25zdHJ1Y3RvciBtdXN0IHNldCB0aGUgYWN0aW9ucwotCSAqIGltbWVkaWF0ZWx5IGFmdGVyIGNyZWF0aW5nIHRoZSBtdWx0aSBhY3Rpb24gZ3JvdXAgYnkgY2FsbGluZyB7QGxpbmsgI3NldEFjdGlvbnMoSUFjdGlvbltdLCBpbnQpfS4KLQkgKi8KLQlwcm90ZWN0ZWQgTXVsdGlBY3Rpb25Hcm91cCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZ2l2ZW4gYWN0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9ucwkJCXRoZSBhY3Rpb25zIGZvciB0aGlzIG11bHRpIGdyb3VwLCBhdCBsZWFzdCBvbmUKLQkgKiBAcGFyYW0gY3VycmVudFNlbGVjdGlvbglkZWNpZGVzIHdoaWNoIGFjdGlvbiBpcyBzZWxlY3RlZCBpbiB0aGUgbWVudSBvbiBzdGFydCB1cC4KLQkgKiAJCQkJCQkJRGVub3RlcyB0aGUgbG9jYXRpb24gaW4gdGhlIGFjdGlvbnMgYXJyYXkgb2YgdGhlIGN1cnJlbnQKLQkgKiAJCQkJCQkJc2VsZWN0ZWQgc3RhdGUuIEl0IGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEFjdGlvbnMoSUFjdGlvbltdIGFjdGlvbnMsIGludCBjdXJyZW50U2VsZWN0aW9uKSB7Ci0JCWZDdXJyZW50U2VsZWN0aW9uPSBjdXJyZW50U2VsZWN0aW9uOwotCQlmQWN0aW9ucyA9IGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgYWN0aW9ucyB0byB0aGUgZ2l2ZW4gbWVudSBtYW5hZ2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFjdGlvbnMoSU1lbnVNYW5hZ2VyIHZpZXdNZW51KSB7Ci0KLQkJdmlld01lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWZJdGVtcz0gbmV3IE1lbnVJdGVtW2ZBY3Rpb25zLmxlbmd0aF07Ci0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IGZBY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBpbnQgaj0gaTsKLQotCQkJdmlld01lbnUuYWRkKG5ldyBDb250cmlidXRpb25JdGVtKCkgewotCi0JCQkJcHVibGljIHZvaWQgZmlsbChNZW51IG1lbnUsIGludCBpbmRleCkgewotCQkJCQkKLQkJCQkJaW50IHN0eWxlPSBTV1QuQ0hFQ0s7Ci0JCQkJCWlmICgoZkFjdGlvbnNbal0uZ2V0U3R5bGUoKSAmIElBY3Rpb24uQVNfUkFESU9fQlVUVE9OKSAhPSAwKQotCQkJCQkJc3R5bGU9IFNXVC5SQURJTzsKLQkJCQkJCi0JCQkJCU1lbnVJdGVtIG1pPSBuZXcgTWVudUl0ZW0obWVudSwgc3R5bGUsIGluZGV4KTsKLQkJCQkJSW1hZ2VEZXNjcmlwdG9yIGQ9IGZBY3Rpb25zW2pdLmdldEltYWdlRGVzY3JpcHRvcigpOwotCQkJCQltaS5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLmdldChkKSk7Ci0JCQkJCWZJdGVtc1tqXT0gbWk7Ci0JCQkJCW1pLnNldFRleHQoZkFjdGlvbnNbal0uZ2V0VGV4dCgpKTsKLQkJCQkJbWkuc2V0U2VsZWN0aW9uKGZDdXJyZW50U2VsZWN0aW9uID09IGopOwotCQkJCQltaS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCWlmIChmQ3VycmVudFNlbGVjdGlvbiA9PSBqKSB7Ci0JCQkJCQkJCWZJdGVtc1tmQ3VycmVudFNlbGVjdGlvbl0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCWZBY3Rpb25zW2pdLnJ1bigpOwotCi0JCQkJCQkJLy8gVXBkYXRlIGNoZWNrZWQgc3RhdGUKLQkJCQkJCQlmSXRlbXNbZkN1cnJlbnRTZWxlY3Rpb25dLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCQkJZkN1cnJlbnRTZWxlY3Rpb249IGo7Ci0JCQkJCQkJZkl0ZW1zW2ZDdXJyZW50U2VsZWN0aW9uXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJCXB1YmxpYyBib29sZWFuIGlzRHluYW1pYygpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTmV3UGx1Z2luQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdQbHVnaW5BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjEyZGJhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdQbHVnaW5BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5QZXJzcGVjdGl2ZUxpc3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5JV2l6YXJkUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld01ldGhvZFBsdWdpbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuV2l6YXJkSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogRGlzcGxheXMgdGhlIE5ldyBNZXRob2QgUGx1Zy1pbiB3aXphcmQgYW5kIGNyZWF0ZXMgYSBuZXcgcGx1Zy1pbiB3aGVuIHRoZQotICogdXNlciBzZWxlY3RzIHRoZSBGaW5pc2ggYnV0dG9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdQbHVnaW5BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cwotCQlJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JLy8gVGhlIGNhY2hlZCB3aW5kb3cgb2JqZWN0LgotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdQbHVnaW5BY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3UGx1Z2luQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQoSVdvcmtiZW5jaFdpbmRvdykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXRoaXMud2luZG93ID0gd2luZG93OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlydW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCU1ldGhvZExpYnJhcnkgdGFyZ2V0TGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAodGFyZ2V0TGliID09IG51bGwpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZF90aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5ub09wZW5MaWJyYXJ5RXJyb3JfbXNnKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeSh0YXJnZXRMaWIsIHNoZWxsKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheSgKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdQbHVnaW5XaXphcmRfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdQbHVnaW5XaXphcmRfY3JlYXRlRXJyb3IsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlzdGF0dXMpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZmluYWwgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSB3aW5kb3cgIT0gbnVsbCA/IAotCQkJCSh3aW5kb3cuZ2V0V29ya2JlbmNoKCkgPT0gbnVsbCA/ICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpIDogd2luZG93LmdldFdvcmtiZW5jaCgpKQotCQkJCTogUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsgCi0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJZXhlY3V0ZSh3b3JrYmVuY2gsIG51bGwpOwkJCi0JCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiwgSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gd29ya2JlbmNoCi0JICogICAgICAgICAgICBUaGUgYWN0aXZlIHdvcmtiZW5jaC4KLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgYWN0aXZlIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZXhlY3V0ZShJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJTmV3TWV0aG9kUGx1Z2luV2l6YXJkIHdpemFyZCA9IG51bGw7Ci0JCQotCQlJV2l6YXJkUmVnaXN0cnkgd2l6YXJkUmVnaXN0cnkgPSBXaXphcmRIZWxwZXIuZ2V0V2l6YXJkUmVnaXN0cnkoKTsJCQotCQlpZih3aXphcmRSZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQlpZih3aXphcmRSZWdpc3RyeS5nZXROZXdNZXRob2RQbHVnaW5XaXphcmRJZCgpICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl3aXphcmQgPSAoTmV3TWV0aG9kUGx1Z2luV2l6YXJkKSBXaXphcmRIZWxwZXIuY3JlYXRlTmV3V2l6YXJkKHdpemFyZFJlZ2lzdHJ5LmdldE5ld01ldGhvZFBsdWdpbldpemFyZElkKCkpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKHdpemFyZCA9PSBudWxsKSB7Ci0JCQl3aXphcmQgPSBuZXcgTmV3TWV0aG9kUGx1Z2luV2l6YXJkKCk7Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHx8IHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQl3aXphcmQuaW5pdCh3b3JrYmVuY2gsIChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLQkJfQotCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQotCQlpZiAoIVBlcnNwZWN0aXZlTGlzdFV0aWwuaXNBdXRob3JpbmdQZXJzcGVjdGl2ZSgpKSB7Ci0JCQlQZXJzcGVjdGl2ZVV0aWwKLQkJCQkJLm9wZW5QZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuQ2hlYXRzaGVldFZpZXcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5DaGVhdHNoZWV0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YjMxODFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5DaGVhdHNoZWV0Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY2hlYXRzaGVldHMudmlld3MuQ2hlYXRTaGVldFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRyby5jb25maWcuSUludHJvQWN0aW9uOwotCi0vKioKLSAqIE9wZW4gY2hlYXQgc2hlZXQgdmlldwotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkNoZWF0c2hlZXRWaWV3IGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSUludHJvQWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqCi0JICovCi0JcHVibGljIE9wZW5DaGVhdHNoZWV0VmlldygpIHsKLQkJc3VwZXIoQXV0aG9yaW5nVUlSZXNvdXJjZXMuT3BlbkNoZWF0c2hlZXRWaWV3X3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnLklJbnRyb0FjdGlvbiNydW4ob3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvU2l0ZSwgamF2YS51dGlsLlByb3BlcnRpZXMpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElJbnRyb1NpdGUgc2l0ZSwgUHJvcGVydGllcyBwYXJhbXMpIHsKLQkJU3RyaW5nIGNoZWF0c2hlZXRfaWQgPSBwYXJhbXMuZ2V0UHJvcGVydHkoImlucHV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRvZ2dsZV9zdHIgPSBwYXJhbXMuZ2V0UHJvcGVydHkoInRvZ2dsZSIpOyAvLyROT04tTkxTLTEkCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIElORk86IGNoZWF0c2hlZXQgaWQgPSAiICsgY2hlYXRzaGVldF9pZCk7Ci0KLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0JCS8vIGRlLW1heGltYWl6ZSB0aGUgd2VsY29tZSwgaS5lLiB0aGUgaW50cm8gdmlldyB3aW5kb3cKLQkJaWYgKHRvZ2dsZV9zdHIgIT0gbnVsbCAmJiB0b2dnbGVfc3RyLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0b2dnbGVBY3RpdmVWaWV3KCk7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gQ2hlYXRTaGVldFZpZXcgb2JqID0gbmV3IENoZWF0U2hlZXRWaWV3KCk7Ci0JCQlhY3RpdmVXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLnNob3dWaWV3KAotCQkJCQkib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMudmlld3MuQ2hlYXRTaGVldFZpZXciKTsgLy8kTk9OLU5MUy0xJAotCQkJQ2hlYXRTaGVldFZpZXcgY3NWaWV3ID0gKENoZWF0U2hlZXRWaWV3KSBhY3RpdmVXaW5kb3cKLQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQljc1ZpZXcuc2V0SW5wdXQoY2hlYXRzaGVldF9pZCk7Ci0KLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhwKSB7Ci0JCQkvLyAkJCQgZXJyb3IgaGFuZGxpbmcgaGVyZS4KLQkJfQotCi0JfQotCi0JLyoqCi0JICogVG9nZ2xlIGFjdGl2ZSB2aWV3Ci0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgdG9nZ2xlQWN0aXZlVmlldygpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0JCS8vIGRlLW1heGltYWl6ZSB0aGUgd2VsY29tZSwgaS5lLiB0aGUgaW50cm8gdmlldyB3aW5kb3cgb3IgYW55IGFjdGl2ZQotCQkvLyB2aWV3Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBhY3RpdmVXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQlpZiAocGFnZSBpbnN0YW5jZW9mIFdvcmtiZW5jaFBhZ2UpIHsKLQkJCQkvL1dvcmtiZW5jaFBhZ2UgcmVhbFBhZ2UgPSAoV29ya2JlbmNoUGFnZSkgcGFnZTsKLQotCQkJCUlXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYgPSBwYWdlLmdldEFjdGl2ZVBhcnRSZWZlcmVuY2UoKTsKLQotCQkJCWlmIChwYXJ0UmVmICE9IG51bGwpIHsKLQkJCQkJKChXb3JrYmVuY2hQYWdlKSBwYWdlKS50b2dnbGVab29tKHBhcnRSZWYpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkNvbmZpZ3VyYXRpb25BY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5Db25maWd1cmF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiNzRmZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkNvbmZpZ3VyYXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5QZXJzcGVjdGl2ZUxpc3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5PcGVuQ29uZmlndXJhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBPcGVucyBDb25maWd1cmF0aW9uIGVkaXRvcgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuQ29uZmlndXJhdGlvbkFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0JLy8gcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFRkFVTFRfUEVSU1BFQ1RJVkVfSUQgPSBudWxsOwotCi0JLy8gcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0JcHJpdmF0ZSBMaXN0IGNvbmZpZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkvLyB0aGlzLndpbmRvdyA9IHdpbmRvdzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJY29uZmlnTGlzdC5jbGVhcigpOwotCQkJCWRvV29yaygpOwotCQkJCWlmIChjb25maWdMaXN0LnNpemUoKSA+IDApIHsKLQkJCQkJaWYgKCFQZXJzcGVjdGl2ZUxpc3RVdGlsLmlzQXV0aG9yaW5nUGVyc3BlY3RpdmUoKSkgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiJCQkREVCVUc6IE5lZWQgdG8gc3dpdGNoIHRvIGF1dGhvcmluZyBwZXJzcGVjdGl2ZSEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJVUlBY3Rpb25EaXNwYXRjaGVyLm9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZSgpOwotCQkJCQl9Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnTGlzdC5zaXplKCk7IGkrKykgewotCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlnTGlzdAotCQkJCQkJCQkuZ2V0KGkpOwotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCRERUJVRzogY29uZmlnIG5hbWUgPSAiICsKLQkJCQkJCS8vIGNvbmZpZy5nZXROYW1lKCkpOwotCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IoY29uZmlnKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9Xb3JrKCkgewotCQl0cnkgewotCQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQotCQkJCU9wZW5Db25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCA9IG5ldyBPcGVuQ29uZmlndXJhdGlvbldpemFyZCgKLQkJCQkJCWNvbmZpZ0xpc3QpOwotCQkJCXdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIHNlbGVjdGlvbik7IC8vIHByb2JhYmx5Ci0JCQkJLy8gbm8gbmVlZCBmb3IgdGhpcyBsaW5lCi0JCQkJLy8gSW5zdGFudGlhdGVzIHRoZSB3aXphcmQgY29udGFpbmVyIHdpdGggdGhlIHdpemFyZCBhbmQgb3BlbnMKLQkJCQkvLyBpdAotCQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsKLQotCQkJCS8vIGZvciAoaW50IGk9MDsgaTxjb25maWdMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPQotCQkJCS8vIChNZXRob2RDb25maWd1cmF0aW9uKWNvbmZpZ0xpc3QuZ2V0KGkpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihjb25maWcuZ2V0TmFtZSgpKTsKLQkJCQkvLyB9Ci0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNjJiNGVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5FbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29udHJpYnV0aW9uU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotCi0vKioKLSAqIE9wZW4gYSBtZXRob2QgZWxlbWVudCBlZGl0b3IgZGVsZWdhdGlvbiBhY3Rpb24KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuRWxlbWVudEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQlwcml2YXRlIENvbnRyaWJ1dGlvblNlbGVjdGlvbiBjb250cmlidXRvclNlbGVjdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqCi0JICovCi0JcHVibGljIE9wZW5FbGVtZW50QWN0aW9uRGVsZWdhdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JCWNvbnRyaWJ1dG9yU2VsZWN0b3IgPSBuZXcgQ29udHJpYnV0aW9uU2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQl0aGlzLnRhcmdldFBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIE9wZW4gZWxlbWVudCBhY3Rpb24hIik7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgNTogIiArIHNlbGVjdGlvbik7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0KLQkJQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHRhcmdldFBhcnQgPSAiICsgdGFyZ2V0UGFydCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRhcmdldFBhcnQgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uVmlldykgewotCQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0ZWQuaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3RzLm5leHQoKSk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGNvbnRyaWJ1dG9yU2VsZWN0b3IKLQkJCQkJCQkuZ2V0U2VsZWN0ZWRDb250cmlidXRvcigoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KTsKLQkJCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCQkJZWxlbWVudExpc3QuYWRkKG9iaik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWxlbWVudExpc3QuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0cy5uZXh0KCkpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQllbGVtZW50TGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnRMaXN0LnNpemUoKSA8IDEpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKFBlcnNwZWN0aXZlTGlzdFV0aWwuaXNCcm93c2luZ1BlcnNwZWN0aXZlKCkpIHsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IGVsZW1lbnRMaXN0Lml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBvYmplY3RzLm5leHQoKTsKLQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKGVsZW1lbnQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQzZmQ4ZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5QZXJzcGVjdGl2ZUxpc3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLQotCi0vKioKLSAqIE9wZW4gbWV0aG9kIGVsZW1lbnQgZWRpdG9yIGRlbGVnYXRpb24gYWN0aW9uIAotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcwotCQlCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JLy8gcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZSgpIHsKLQkJdGhpcygKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDApOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIE9wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGUoU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCS8vIHRoaXMud2luZG93ID0gd2luZG93OwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBPcGVuIGVsZW1lbnQgYWN0aW9uISIpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIDU6ICIgKyBzZWxlY3Rpb24pOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCWlmIChQZXJzcGVjdGl2ZUxpc3RVdGlsLmlzQnJvd3NpbmdQZXJzcGVjdGl2ZSgpKSB7Ci0JCQlVSUFjdGlvbkRpc3BhdGNoZXIub3BlbkF1dGhvcmluZ1BlcnNwZWN0aXZlKCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBzZWxlY3RlZC5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0cy5uZXh0KCkpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgNjogIiArIGVsZW1lbnQpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQotCQkvLyBpZiAoIVBlcnNwZWN0aXZlTGlzdFVpdGwuaXNBdXRob3JpbmdQZXJzcGVjdGl2ZSgpIHx8Ci0JCS8vIHNlbGVjdGVkLmlzRW1wdHkoKSkgewotCQlpZiAoc2VsZWN0ZWQuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlib29sZWFuIGVuYWJsZU1lbnUgPSB0cnVlOwotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBzZWxlY3RlZC5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0cy5uZXh0KCkpOwotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpKSB7Ci0JCQkJZW5hYmxlTWVudSA9IGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJYWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlTWVudSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuTGlicmFyeUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkxpYnJhcnlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTA1MDdmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuTGlicmFyeUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5WaWV3SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEltcGxlbWVudHMgdGhlIE9wZW4gTGlicmFyeSBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNydW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJCi0JCWludCBkaXJ0eUNvdW50ID0gMDsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGxpc3QgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxpc3RbaV0uaXNEaXJ0eSgpKSB7Ci0JCQkJZGlydHlDb3VudCsrOwotCQkJfQotCQl9Ci0JCi0JCWlmIChkaXJ0eUNvdW50ID09IDEpIHsKLQkJCWJvb2xlYW4gcmMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUFsbEVkaXRvcnModHJ1ZSk7Ci0JCQlpZiAoIXJjKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGVsc2UgaWYgKGRpcnR5Q291bnQgPiAxKXsKLQkJCXN3aXRjaChWaWV3SGVscGVyLnByb21wdFNhdmVJbnQoKSkgewotCQkJY2FzZSBTV1QuWUVTOgotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0QWN0aXZlUGFnZSgpLmNsb3NlQWxsRWRpdG9ycyh0cnVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULk5POgotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0QWN0aXZlUGFnZSgpLmNsb3NlQWxsRWRpdG9ycyhmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5DQU5DRUw6Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCX0KLQkJCi0JCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5vcGVuTGlicmFyeSgpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3Blbk5ld01ldGhvZFBsdWdpbldpemFyZEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3Blbk5ld01ldGhvZFBsdWdpbldpemFyZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OTYyZmRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5OZXdNZXRob2RQbHVnaW5XaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5QZXJzcGVjdGl2ZUxpc3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdNZXRob2RQbHVnaW5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRyby5JSW50cm9TaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludHJvLmNvbmZpZy5JSW50cm9BY3Rpb247Ci0KLS8qKgotICogTmV3IE1ldGhvZCBwbHVnaW4gVUkgd2l6YXJkCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTmV3TWV0aG9kUGx1Z2luV2l6YXJkQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMKLQkJSUludHJvQWN0aW9uIHsKLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnLklJbnRyb0FjdGlvbiNydW4ob3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvU2l0ZSwgamF2YS51dGlsLlByb3BlcnRpZXMpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElJbnRyb1NpdGUgc2l0ZSwgUHJvcGVydGllcyBwYXJhbXMpIHsKLQotCQlTdHJpbmcgdG9nZ2xlX3N0ciA9IHBhcmFtcy5nZXRQcm9wZXJ0eSgidG9nZ2xlIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gZGUtbWF4aW1haXplIHRoZSB3ZWxjb21lLCBpLmUuIHRoZSBpbnRybyB2aWV3IHdpbmRvdwotCQlpZiAodG9nZ2xlX3N0ciAhPSBudWxsICYmIHRvZ2dsZV9zdHIuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRvZ2dsZUFjdGl2ZVZpZXcoKTsKLQkJfQotCi0JCWlmICghUGVyc3BlY3RpdmVMaXN0VXRpbC5pc0F1dGhvcmluZ1BlcnNwZWN0aXZlKCkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTmVlZCB0byBzd2l0Y2ggdG8gYXV0aG9yaW5nIHBlcnNwZWN0aXZlISIpOwotCQkJVUlBY3Rpb25EaXNwYXRjaGVyLm9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZSgpOwotCQl9Ci0KLQkJTmV3TWV0aG9kUGx1Z2luV2l6YXJkIHdpemFyZCA9IG5ldyBOZXdNZXRob2RQbHVnaW5XaXphcmQoKTsKLQkJd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCS5nZXRXb3JrYmVuY2goKSwgKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBudWxsKTsKLQotCQkvLyBJbnN0YW50aWF0ZXMgdGhlIHdpemFyZCBjb250YWluZXIgd2l0aCB0aGUgd2l6YXJkIGFuZCBvcGVucyBpdAotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdG9nZ2xlQWN0aXZlVmlldygpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0JCS8vIGRlLW1heGltYWl6ZSB0aGUgd2VsY29tZSwgaS5lLiB0aGUgaW50cm8gdmlldyB3aW5kb3cgb3IgYW55IGFjdGl2ZQotCQkvLyB2aWV3Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBhY3RpdmVXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQlpZiAocGFnZSBpbnN0YW5jZW9mIFdvcmtiZW5jaFBhZ2UpIHsKLQkJCQkvLyBXb3JrYmVuY2hQYWdlIHJlYWxQYWdlID0gKFdvcmtiZW5jaFBhZ2UpIHBhZ2U7Ci0KLQkJCQlJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmID0gcGFnZS5nZXRBY3RpdmVQYXJ0UmVmZXJlbmNlKCk7Ci0KLQkJCQlpZiAocGFydFJlZiAhPSBudWxsKSB7Ci0JCQkJCSgoV29ya2JlbmNoUGFnZSkgcGFnZSkudG9nZ2xlWm9vbShwYXJ0UmVmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAyNGRhOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5TeW5jaHJvbml6ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuUHJvY2Vzc0RlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotCi0vKioKLSAqIERlZmF1bHQgU3luY2hyb25pemUgYWN0aW9uIGZvciBwcm9jZXNzIGVsZW1lbnRzLgotICogU3luY2hyb25pemF0aW9uIHRha2VzIHBsYWNlIGZyb20gbWV0aG9kIHRvIHByb2Nlc3MgZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uIGV4dGVuZHMgQ29tbWFuZEFjdGlvbkhhbmRsZXIgCi1pbXBsZW1lbnRzIElXb3JrYmVuY2hQYXJ0QWN0aW9uCi17Ci0JcHJvdGVjdGVkIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVdvcmtiZW5jaFBhcnQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUnVuOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uKCkgewotCQlzdXBlcihudWxsLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5BdXRvU3luY2hyb25pemVDb21tYW5kX2xhYmVsKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugd2l0aCBsYWJlbCB0ZXh0Ci0JICovCi0JcHVibGljIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24oU3RyaW5nIGxhYmVsVGV4dCkgewotCQlzdXBlcihudWxsLCBsYWJlbFRleHQpOyAKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSVdvcmtiZW5jaFBhcnRBY3Rpb24jc2V0QWN0aXZlV29ya2JlbmNoUGFydChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQpIHsKLQkJYWN0aXZlV29ya2JlbmNoUGFydCA9IHdvcmtiZW5jaFBhcnQ7Ci0JCWlmICh3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikgewotCQkJZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSB3b3JrYmVuY2hQYXJ0KQotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjY3JlYXRlQ29tbWFuZChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25pemVDb21tYW5kKGdldFRleHQoKSwgc2VsZWN0aW9uKSB7Ci0JCQkvKgotCQkJICogCi0JCQkgKiAKLQkJCSAqIEBzZWUgQXV0b1N5bmNocm9uaXplQ29tbWFuZCNkZWxldGUoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBDb21tYW5kIGRlbGV0ZShMaXN0IGVsZW1lbnRzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIFByb2Nlc3NEZWxldGVBY3Rpb24uZGVsZXRlKGVsZW1lbnRzKTsKLQkJCQl9Ci0JCQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQlhYm9ydGVkID0gdHJ1ZTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2Nlc3MgCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCWlmKGFjdGl2ZVdvcmtiZW5jaFBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gKChJRWRpdG9yUGFydClhY3RpdmVXb3JrYmVuY2hQYXJ0KS5nZXRFZGl0b3JJbnB1dCgpOwotCQkJaWYoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dClpbnB1dCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCWlmKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCXJldHVybiAoKFByb2Nlc3NDb21wb25lbnQpZSkuZ2V0UHJvY2VzcygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlBcnJheUxpc3Qgc2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgCi0JCQkJCSYmICEoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KS5pc1JlYWRPbmx5KCkpIHsKLQkJCQllbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQl9Ci0JCQkKLQkJCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCQkKLQkJCQkJLy8gZGVzY3JpcHRvciBtdXN0IGJlIGxpbmtlZCBhbmQgaXMgbm90IHN1cHByZXNzZWQKLQkJCQkJLy8KLQkJCQkJdmFsaWQgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudChkZXNjKSAhPSBudWxsICYmICFkZXNjLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKTsJCQkJCQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gZXhjbHVkZSBicmVha2Rvd24gZWxlbWVudCB3aXRob3V0IGEgc3VwZXIgYWN0aXZpdHkgbGlrZSBUZWFtUHJvZmlsZSdzIG93biBSb2xlRGVzY3JpcHRvcgotCQkJCQkvLwotCQkJCQlpZiAoKChCcmVha2Rvd25FbGVtZW50KWVsZW1lbnQpLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIAotCQkJCQl7Ci0JCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcyAmJiAoKFByb2Nlc3MpZWxlbWVudCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJCXZhbGlkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZhbGlkID0gZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmKHZhbGlkKSB7Ci0JCQkJc2VsZWN0ZWQuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmIChzZWxlY3RlZC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGVkKSk7Ci0JfQotCi0KLSAgIC8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQljYW5SdW4gPSAoKFN5bmNocm9uaXplQ29tbWFuZCkgY29tbWFuZCkuaW5pdGlsaXplKCk7Ci0JCQl9Ci0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLlByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoY2FuUnVuKSB7Ci0JCQlzdXBlci5ydW4oKTsKLQkJCS8vIGlmKCgoQXV0b1N5bmNocm9uaXplQ29tbWFuZCljb21tYW5kKS5pc1N1Y2Vzc2Z1bCgpKSB7Ci0JCQkvLyBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUluZm8oZ2V0VGV4dCgpLAotCQkJLy8gIlN5bmNocm9uaXphdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIpOwotCQkJLy8JCQkJCi0JCQkvLyB9Ci0JCX0gZWxzZSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJZ2V0VGV4dCgpLAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLlByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fbm9EZXNjcmlwdG9yVG9TeW5jaCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvUmVmcmVzaENvbmZpZ3VyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1JlZnJlc2hDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyYWVmMWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvUmVmcmVzaENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotCi0vKioKLSAqIFJlZnJlc2ggQ29uZmlndXJhdGlvbiBhY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZyZXNoQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uVmlldyB0YXJnZXRWaWV3OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJdGFyZ2V0VmlldyA9IChDb25maWd1cmF0aW9uVmlldykgdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXRhcmdldFZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1NhdmVUaGlzQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TYXZlVGhpc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZGNmYjkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1NhdmVUaGlzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci0KLS8qKgotICogQWN0aW9uIGZvciBzYXZpbmcgcmVzb3VyY2VzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlVGhpc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBzZWxlY3RlZE9iamVjdHM7Ci0KLQlwdWJsaWMgU2F2ZVRoaXNBY3Rpb24oKSB7Ci0JCXN1cGVyKEF1dGhvcmluZ1VJUmVzb3VyY2VzLlNhdmVUaGlzQWN0aW9uX3NhdmVvYmplY3QpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVXBkYXRlIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAJCQlTZWxlY3Rpb24KLQkgKiBAcmV0dXJuIAotCSAqIAkJCWJvb2xlYW4gdmFsdWUgdG8gaW5kaWNhdGUgd2hldGhlciB1cGRhdGUgd2FzIGRvbmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJc2VsZWN0ZWRPYmplY3RzLmFkZChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4udW53cmFwKG9iamVjdHMKLQkJCQkJLm5leHQoKSkpOwotCQl9Ci0KLQkJcmV0dXJuIHNlbGVjdGVkT2JqZWN0cy5zaXplKCkgPT0gMQotCQkJCSYmIHNlbGVjdGVkT2JqZWN0cy5nZXQoMCkgaW5zdGFuY2VvZiBFT2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChzZWxlY3RlZE9iamVjdHMgPT0gbnVsbCB8fCBzZWxlY3RlZE9iamVjdHMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlGaWxlRGlhbG9nIGZkID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQlTV1QuU0FWRSk7Ci0JCVN0cmluZyBwYXRoID0gZmQub3BlbigpOwotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKHBhdGgpOwotCQkvLyBDcmVhdGUgdGhlIHJlc291cmNlIHRvIHBlcnNpc3QgdGhlIG1vZGVsLgotCQlSZXNvdXJjZSByZXMgPSBuZXcgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpLmNyZWF0ZVJlc291cmNlKGZpbGVVUkkpOwotCQlPYmplY3Qgb2JqID0gc2VsZWN0ZWRPYmplY3RzLmdldCgwKTsKLQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKG9iaik7Ci0JCXRyeSB7Ci0JCQlyZXMuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TaG93UHJlc2VudGF0aW9uTmFtZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Nob3dQcmVzZW50YXRpb25OYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZGNmNTE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Nob3dQcmVzZW50YXRpb25OYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotCi0vKioKLSAqIFNob3cgUHJlc2VudGF0aW9uIG5hbWVzIGluIGxpYnJhcnkgdmlldwotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG93UHJlc2VudGF0aW9uTmFtZXMgaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgTGlicmFyeVZpZXcgdGFyZ2V0VmlldzsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCXRhcmdldFZpZXcgPSAoTGlicmFyeVZpZXcpIHZpZXc7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5zZXRTaG93UHJlc2VudGF0aW9uTmFtZXMoIVByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKSk7Ci0JCXRhcmdldFZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvU3luY2hyb25pemF0aW9uQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TeW5jaHJvbml6YXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzczOTUwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TeW5jaHJvbml6YXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLlN5bmNocm9uaXphdGlvbkNob2ljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLlN5bmNocm9uaXphdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlN5bmNocm9uaXplQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogU3luY2hyb25pemFpdG9uIGFjdGlvbiBmb3IgcHJvY2VzcyBlbGVtZW50cy4gU3luY2hyb25pemF0aW9uIHRha2VzIHBsYWNlIGZyb20gbWV0aG9kCi0gKiBlbGVtZW50IHRvIHByb2Nlc3MgZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBQaG9uZyBMZQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvbkFjdGlvbiBleHRlbmRzIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24gCi1pbXBsZW1lbnRzIElXb3JrYmVuY2hQYXJ0QWN0aW9uCi17Ci0KLQlwcml2YXRlIFByb2Nlc3Mgc2VsZWN0ZWRQcm9jZXNzOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25BY3Rpb24oKSB7Ci0JCXN1cGVyKExpYnJhcnlFZGl0UmVzb3VyY2VzLk1hbnVhbFN5bmNocm9uaXplQ29tbWFuZF9sYWJlbCk7IAotCX0KLQkKLQkvKgotCSAqIFNldCBQcm9jZXNzCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvY2VzcyhQcm9jZXNzIGFQcm9jZXNzKSB7Ci0JCXRoaXMuc2VsZWN0ZWRQcm9jZXNzID0gYVByb2Nlc3M7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzdXBlclJ1bigpIHsKLQkJc3VwZXIucnVuKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXphdGlvbkNob2ljZXMgY2hvaWNlcyA9IG5ldyBTeW5jaHJvbml6YXRpb25DaG9pY2VzKCk7Ci0JCQkJY2hvaWNlcy5zZXRTZWxlY3RlZFByb2Nlc3Moc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCQkKLQkJCQkvLyBJbnN0YW50aWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgd2l6YXJkLgotCQkJCVN5bmNocm9uaXphdGlvbldpemFyZCB3aXphcmQgPSBuZXcgU3luY2hyb25pemF0aW9uV2l6YXJkKGNob2ljZXMpOwotCi0JCQkJLy8gSW5zdGFudGlhdGUgdGhlIHdpemFyZCBjb250YWluZXIgd2l0aCB0aGUgd2l6YXJkIGFuZCBvcGVuIGl0LgotCQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIAotCQkJCQkJCQkJCQl3aXphcmQpOwotCQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCQlkaWFsb2cub3BlbigpOwkKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiAiICsgY2hvaWNlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQlpZiAoIWNob2ljZXMuaXNGaW5pc2hQcmVzc2VkKCkpCi0JCQkJCXJldHVybjsKLQkJCQkKLQkJCQkvLyBTZXQgc3luY2hGZWF0dXJlcyAnc3luY0ZlYXR1cmVTZXQnCi0JCQkJSGFzaFNldCBzeW5jRmVhdHVyZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJYWRkQ2hvaWNlc1RvU2V0KHN5bmNGZWF0dXJlU2V0LCBjaG9pY2VzKTsKLQkJCQkvLyBNZXRob2QgY29uZmlnIGNhbiBiZSBvYnRhaW5lZCBieSAnY2hvaWNlcy5nZXRTZWxlY3RlZENvbmZpZygpJwotCQkJCQotCQkJCVN5bmNocm9uaXplQ29tbWFuZCBjbWQgPSAoU3luY2hyb25pemVDb21tYW5kKWNvbW1hbmQ7Ci0JCQkJY21kLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY2hvaWNlcy5nZXRTZWxlY3RlZENvbmZpZygpKTsKLQkJCQljbWQuc2V0U3luY2hyb25pemF0aW9uRmVhdHVyZXMoc3luY0ZlYXR1cmVTZXQpOwotCQkJCQotCQkJCXN1cGVyUnVuKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ2hvaWNlc1RvU2V0KEhhc2hTZXQgc3luY1NldCwgU3luY2hyb25pemF0aW9uQ2hvaWNlcyBjaG9pY2VzKSB7Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNOYW1lKCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jUHJlc05hbWUoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNCcmllZkRlc2MoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jT3B0SW5wdXQoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jTWFuSW5wdXQoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY091dHB1dCgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY1ByaW1QZXJmb3JtZXIoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY0FkZG5QZXJmb3JtZXIoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY1Jlc3BSb2xlKCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNDb250QXJ0aWZhY3QoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jRGVsaXZQYXJ0KCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY1NlbFN0ZXAoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfU3RlcHMoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzZjNjMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBVcGRhdGUgc3VwcHJlc3Npb24gaW5mb3JtYXRpb24gZnJvbSBiYXNlIGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbiBleHRlbmRzCi0JCUNvbW1hbmRBY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgSVdvcmtiZW5jaFBhcnRBY3Rpb24gewotCi0JcHJpdmF0ZSBQcm9jZXNzRWRpdG9yIGVkaXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBVcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKG51bGwsIHRleHQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbigpIHsKLQkJdGhpcyhBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWwpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZihTdXBwcmVzc2lvbi5pc1ZhbGlkKGVsZW1lbnQpKSB7Ci0JCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxpc3QpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjY3JlYXRlQ29tbWFuZChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQoZ2V0VGV4dCgpLCBzZWxlY3Rpb24sIGVkaXRvci5nZXRBZGFwdGVyRmFjdG9yeSgpLCBlZGl0b3IuZ2V0U3VwcHJlc3Npb24oKSkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZCNleGVjdXRlKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCQlzdXBlci5leGVjdXRlKCk7Ci0JCQkJCi0JCQkJaWYoIWdldEFmZmVjdGVkT2JqZWN0cygpLmlzRW1wdHkoKSkgewotCQkJCQllZGl0b3IucmVmcmVzaEFsbFByb2Nlc3NFZGl0b3JzKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kI3VuZG8oKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkJCXN1cGVyLnVuZG8oKTsKLQkJCQkKLQkJCQlpZighZ2V0QWZmZWN0ZWRPYmplY3RzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCWVkaXRvci5yZWZyZXNoQWxsUHJvY2Vzc0VkaXRvcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSVdvcmtiZW5jaFBhcnRBY3Rpb24jc2V0QWN0aXZlV29ya2JlbmNoUGFydChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQpIHsKLQkJaWYod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIHsKLQkJCWRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcil3b3JrYmVuY2hQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCX0KLQkJaWYod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3IpIHsKLQkJCWVkaXRvciA9IChQcm9jZXNzRWRpdG9yKSB3b3JrYmVuY2hQYXJ0OwotCQl9CQkKLQkJZWxzZSBpZih3b3JrYmVuY2hQYXJ0ID09IG51bGwpIHsKLQkJCWVkaXRvciA9IG51bGw7Ci0JCX0KLQl9CQotCQotCXByaXZhdGUgdm9pZCBzdXBlclJ1bigpIHsKLQkJc3VwZXIucnVuKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc3VwZXJSdW4oKTsKLQkJCQkJfQotCQkJCi0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGY2ODE5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Vc2VySW50ZXJhY3Rpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3Q29uZmlndXJhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkVycm9yRGlhbG9nTm9SZWFzb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Vc2VySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3MuVW5jYW5jZWxhYmxlTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLlVzZXJJbnB1dHNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqIEltcGxlbWVudHMgaGFuZGxpbmcgb2YgdXNlciBpbnRlcmFjdGlvbiBkdXJpbmcgY29tbWFuZCBleGVjdXRpb24KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXNlckludGVyYWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHsKLQkKLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCXByaXZhdGUgSU1lc3NlbmdlciBtZXNzZW5nZXIgPSBuZXcgSU1lc3NlbmdlcigpIHsKLQotCi0JCS8qIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93V2FybmluZyhmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtc2cpIHsKLQkJCWlmKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCQkvLwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlXYXJuaW5nKHRpdGxlLCBtc2cpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbXNnKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2hvd0Vycm9yKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1zZywgZmluYWwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJCWlmKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQkJc2hvd0Vycm9yKHRpdGxlLCBtc2cpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCQkJLy8KLQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywgc3RhdHVzKTsKLQkJCQkJCX0KLQotCQkJCQl9KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHN0YXR1cyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93RXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkV4Y2VwdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNob3dFcnJvcihmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtc2csIGZpbmFsIFN0cmluZyByZWFzb24sIGZpbmFsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWlmKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCQkvLwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCByZWFzb24sIGV4Y2VwdGlvbik7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCByZWFzb24sIGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQkvKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93V2FybmluZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2hvd1dhcm5pbmcoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnLCBmaW5hbCBTdHJpbmcgcmVhc29uKSB7Ci0JCQlpZihEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbXNnLCByZWFzb24pOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbXNnLCByZWFzb24pOwotCQkJfQotCQl9Ci0KLQkJLyogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnKSB7Ci0JCQlpZihEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZyk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnKTsKLQkJCX0KLQkJfQotCi0JCS8qIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dJbmZvKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93SW5mbyhmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtc2cpIHsKLQkJCWlmKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCQkvLwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKHRpdGxlLCBtc2cpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5SW5mbyh0aXRsZSwgbXNnKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5FeGNlcHRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnLCBmaW5hbCBTdHJpbmcgcmVhc29uLCBmaW5hbCBTdHJpbmcgZGV0YWlscywgZmluYWwgRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJaWYoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCS8vCi0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHJlYXNvbiwgZGV0YWlscywgZXhjZXB0aW9uKTsKLQkJCQkJfQotCQkJCQkKLQkJCQl9KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHJlYXNvbiwgZGV0YWlscywgZXhjZXB0aW9uKTsKLQkJCX0KLQkJfQotCQkKLQl9OwotCQotCXB1YmxpYyBVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCkgewotCQkKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNoZWxsIHRoZSBzaGVsbCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaGVsbChTaGVsbCBzaGVsbCkgewotCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JfQotCi0JLyogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIjZ2V0VUlDb250ZXh0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFVJQ29udGV4dCgpIHsKLQkJaWYoc2hlbGwgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKTsKLQkJfQotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JLyogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIjc2VsZWN0KGphdmEudXRpbC5MaXN0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyLCBib29sZWFuLCBqYXZhLnV0aWwuTGlzdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgTGlzdCBzZWxlY3QoTGlzdCBvYmplY3RzVG9TZWxlY3QsCi0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBib29sZWFuIG11bHRpcGxlLAotCQkJTGlzdCBpbnRpdGlhbFNlbGVjdGlvbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWlmKG11bHRpcGxlKSB7Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKTsKLQkJCVVuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IFVuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2coc2hlbGwsIG9iamVjdHNUb1NlbGVjdCwKLQkJCQkJY29udGVudFByb3ZpZGVyLCBsYWJlbFByb3ZpZGVyLCBtc2cpOwotCQkJZGxnLnNldFRpdGxlKHRpdGxlKTsKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5vcGVuKCk7Ci0JCQlPYmplY3Qgb2Jqc1tdID0gZGxnLmdldFJlc3VsdCgpOwotCQkJaWYob2JqcyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZihvYmpzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJCX0KLQkJCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChvYmpzKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyhzaGVsbCwgbGFiZWxQcm92aWRlcik7Ci0JCQkKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5zZXRFbGVtZW50cyhvYmplY3RzVG9TZWxlY3QudG9BcnJheSgpKTsKLQkJCWRsZy5zZXRNdWx0aXBsZVNlbGVjdGlvbihmYWxzZSk7Ci0JCQlkbGcuc2V0TWVzc2FnZShtc2cpOyAKLQkJCWRsZy5zZXRUaXRsZSh0aXRsZSk7Ci0JCQlkbGcuc2V0RmlsdGVyKG51bGwpOwotCQkJaWYoZGxnLm9wZW4oKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlPYmplY3Qgb2JqID0gZGxnLmdldEZpcnN0UmVzdWx0KCk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChvYmopOwotCQl9Ci0JfQotCi0JLyogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIjc2VsZWN0T25lKGludFtdLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBpbnQgc2VsZWN0T25lKGludFtdIGFjdGlvbnMsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJZmluYWwgU3RyaW5nW10gYnV0dG9uTGFiZWxzID0gbmV3IFN0cmluZ1thY3Rpb25zLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJYnV0dG9uTGFiZWxzW2ldID0gZ2V0QWN0aW9uVGV4dChhY3Rpb25zW2ldKTsKLQkJfQotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzaGVsbCA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpCi0JCQkJCS5nZXRBY3RpdmVTaGVsbCgpOwotCQkJaW1hZ2UgPSBzaGVsbC5nZXRJbWFnZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCWlmKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQlNZXNzYWdlRGlhbG9nIG1zZ0RsZyA9IG5ldyBNZXNzYWdlRGlhbG9nKHNoZWxsLCB0aXRsZSwgaW1hZ2UsIG1zZywgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgYnV0dG9uTGFiZWxzLCAwKTsKLQkJCWludCBpZCA9IG1zZ0RsZy5vcGVuKCk7Ci0JCQlyZXR1cm4gYWN0aW9uc1tpZF07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFcnJvckRpYWxvZ05vUmVhc29uIGRsZyA9IG5ldyBFcnJvckRpYWxvZ05vUmVhc29uKHNoZWxsLCB0aXRsZSwgbXNnLCBzdGF0dXMsIElTdGF0dXMuT0sKLQkJCQkJfCBJU3RhdHVzLklORk8gfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkKLQkJCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQkJLy8gY3JlYXRlIE9LIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLQkJCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidXR0b25MYWJlbHMubGVuZ3RoOyBpKyspIHsKLQkJCSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IGJ1dHRvbkxhYmVsc1tpXTsKLQkJCSAgICAgICAgICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIGksIGxhYmVsLCBpID09IDApOwotCQkJICAgICAgICB9Ci0JCQkJCWlmIChzaG91bGRTaG93RGV0YWlsc0J1dHRvbigpKSB7Ci0JCQkJCQlkZXRhaWxzQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwgZmFsc2UpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQkKLQkJCQkvKiAobm9uLUphdmFkb2MpCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkVycm9yRGlhbG9nTm9SZWFzb24jYnV0dG9uUHJlc3NlZChpbnQpCi0JCQkJICovCi0JCQkJcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgaWQpIHsKLQkJCQkJaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCkgewotCQkJCQkJc3VwZXIuYnV0dG9uUHJlc3NlZChpZCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJICAgICAgICBzZXRSZXR1cm5Db2RlKGlkKTsKLQkJCQkgICAgICAgIGNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJaW50IGlkID0gZGxnLm9wZW4oKTsKLQkJCXJldHVybiBhY3Rpb25zW2lkXTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhY3Rpb24gdGV4dAotCSAqIEBwYXJhbSBhY3Rpb24KLQkgKiBAcmV0dXJuCi0JICogCQlBY3Rpb24gdGV4dCAtIGVpdGhlciBBQk9SVCwgQ0FOQ0VMLCBPSywgUkVUUlkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25UZXh0KGludCBhY3Rpb24pIHsKLQkJc3dpdGNoIChhY3Rpb24pIHsKLQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQUJPUlQ6Ci0JCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5BQk9SVF9MQUJFTDsKLQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMOgotCQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMOwotCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9PSzoKLQkJCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMOwotCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9SRVRSWToKLQkJCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLlJFVFJZX0xBQkVMOwotCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVM6Ci0JCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUw7Ci0JCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05POgotCQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUw7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlciNnZXRNZXNzZW5nZXIoKQotCSAqLwotCXB1YmxpYyBJTWVzc2VuZ2VyIGdldE1lc3NlbmdlcigpIHsKLQkJcmV0dXJuIG1lc3NlbmdlciA7Ci0JfQotCi0JLyogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIjcmVxdWVzdElucHV0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlcXVlc3RJbnB1dChTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIExpc3QgdXNlcklucHV0cykgewotCQlpZiAodXNlcklucHV0cyA9PSBudWxsIHx8IHVzZXJJbnB1dHMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQkvLyBoYWNrIHRvIGludm9rZSB3aXphcmQgZm9yIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbgotCQkvLwotCQlVc2VySW5wdXQgdXNlcklucHV0ID0gKFVzZXJJbnB1dCkgdXNlcklucHV0cy5nZXQoMCk7Ci0JCWlmKHVzZXJJbnB1dC5nZXRDb250ZXh0KCkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kKSB7Ci0JCQlNZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kIGNtZCA9IChNZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kKSB1c2VySW5wdXQuZ2V0Q29udGV4dCgpOwotCQkJaWYoY21kLmdldEZlYXR1cmUoKSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKSB7Ci0JCQkJTmV3Q29uZmlndXJhdGlvbldpemFyZCB3aXphcmQgPSBOZXdDb25maWd1cmF0aW9uV2l6YXJkLmNyZWF0ZSgpOwotCQkJCXdpemFyZC5zZXRNZXRob2RDb25maWd1cmF0aW9uKChNZXRob2RDb25maWd1cmF0aW9uKSBjbWQuZ2V0Q2hpbGQoKSk7Ci0JCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJaWYoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkJdXNlcklucHV0LnNldElucHV0KHdpemFyZC5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkuZ2V0TmFtZSgpKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlVc2VySW5wdXRzRGlhbG9nIGRpYWxvZyA9IG5ldyBVc2VySW5wdXRzRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCXVzZXJJbnB1dHMsIHRpdGxlLCBtc2cpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybiBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyI2dldFJ1bm5hYmxlQ29udGV4dCgpCi0JICovCi0JcHVibGljIElSdW5uYWJsZUNvbnRleHQgZ2V0UnVubmFibGVDb250ZXh0KCkgewotCQlTaGVsbCBzaGVsbDsKLQkJT2JqZWN0IHVpQ3R4ID0gZ2V0VUlDb250ZXh0KCk7Ci0JCWlmKHVpQ3R4IGluc3RhbmNlb2YgU2hlbGwpIHsKLQkJCXNoZWxsID0gKFNoZWxsKSB1aUN0eDsKLQkJfQotCQllbHNlIHsKLQkJCXNoZWxsID0gTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCQl9Ci0JCXJldHVybiBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHNoZWxsKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNDE3ZGQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGVkaXRpbmcgYWN0aW9ucyBmb3IgdGhlIEF1dGhvcmluZyBVSS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2VsbGVkaXRvcnMvQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jZWxsZWRpdG9ycy9BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNTdiYjI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jZWxsZWRpdG9ycy9BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRyZWVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgY2xhc3MgZm9yIGNoZWNrIGJveCBjZWxsIGVkaXRvcgotICogQGF1dGhvciBBbiBNaW5nCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IgewotCi0JLy8gdGhlIGNlbGwgbW9kaWZpZXIKLQlwcml2YXRlIElDZWxsTW9kaWZpZXIgbW9kaWZpZXIgPSBudWxsOwotCi0JLy8gdHJlZSBlZGl0b3IKLQlwcml2YXRlIFRyZWVFZGl0b3IgdHJlZUVkaXRvciA9IG51bGw7Ci0KLQkvLyB0aGUgdHJlZQotCXByaXZhdGUgVHJlZSB0cmVlID0gbnVsbDsKLQotCS8vIHRoZSBjb250cm9sIGVkaXRvcgotCXByaXZhdGUgQ29udHJvbCBjb250cm9sID0gbnVsbDsKLQotCS8vIHRoZSBjb2x1bW4gaW5kZXgKLQlwcml2YXRlIGludCBjb2x1bW5JbmRleDsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSB0cmVlCi0JICovCi0JcHVibGljIEFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yKENvbXBvc2l0ZSB0cmVlKSB7Ci0JCXRoaXMudHJlZSA9IChUcmVlKSB0cmVlOwotCQl0aGlzLnRyZWVFZGl0b3IgPSBuZXcgVHJlZUVkaXRvcih0aGlzLnRyZWUpOwotCX0KLQotCi0JLyoqCi0JICogU2V0IGNlbGwgbW9kaWZpZXIKLQkgKiBAcGFyYW0gbW9kaWZpZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDZWxsTW9kaWZpZXIoSUNlbGxNb2RpZmllciBtb2RpZmllcikgewotCQl0aGlzLm1vZGlmaWVyID0gbW9kaWZpZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjZWxsIG1vZGlmaWVyCi0JICogCi0JICogQHJldHVybgotCSAqIAkJQ2VsbE1vZGlmaWVyCi0JICovCi0JcHJvdGVjdGVkIElDZWxsTW9kaWZpZXIgZ2V0Q2VsbE1vZGlmaWVyKCkgewotCQlyZXR1cm4gdGhpcy5tb2RpZmllcjsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSW1hZ2UgZ2V0SW1hZ2UoVHJlZUl0ZW0gaXRlbSwgU3RyaW5nIGNvbHVtbnByb3BlcnR5KTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG1vZGlmeShUcmVlSXRlbSBpdGVtLCBTdHJpbmcgY29sdW1ucHJvcGVydHkpOwotCi0JLyoKLQkgKiA9PT09PT09aW4gZmFjdCBiZWxvdyBjb2RlcyBhcmUgZm9yIHRoZSBkeW5hbWljIGNlbGwgZWRpdG9yIChyZWFsIGNvbnRyb2wKLQkgKiAiYnV0dG9uIik9PT09PQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRvclRvKFRyZWVJdGVtIGl0ZW0sIFN0cmluZyBjb2x1bW5wcm9wZXJ0eSkgewotCQlpZiAodHJlZUVkaXRvci5nZXRJdGVtKCkgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGNvbnRyb2wgPT0gbnVsbCkKLQkJCWNvbnRyb2wgPSBjcmVhdGVDb250cm9sKHRyZWUpOwotCQlob29rQ29udHJvbChjb250cm9sLCBpdGVtLCBjb2x1bW5wcm9wZXJ0eSk7Ci0KLQkJdHJlZUVkaXRvci5taW5pbXVtV2lkdGggPSBjb250cm9sLmdldFNpemUoKS54OwotCQl0cmVlRWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQl0cmVlRWRpdG9yLnNldEVkaXRvcihjb250cm9sLCBpdGVtLCBjb2x1bW5JbmRleCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVFZGl0b3JGcm9tKFRyZWVJdGVtIGl0ZW0sIFN0cmluZyBjb2x1bW5wcm9wZXJ0eSkgewotCQljb250cm9sLnNldFZpc2libGUoZmFsc2UpOwotCQl0cmVlRWRpdG9yLnNldEVkaXRvcihudWxsLCBudWxsLCBjb2x1bW5JbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29udHJvbChUcmVlIHBhcmVudCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBob29rQ29udHJvbChDb250cm9sIGNvbnRyb2wsIFRyZWVJdGVtIGl0ZW0sCi0JCQlTdHJpbmcgY29sdW1ucHJvcGVydHkpOwotCi0JLyoqCi0JICogR2V0IGNvbHVtbiBpbmRleAotCSAqIEByZXR1cm4KLQkgKiAJCWluZGV4Ci0JICovCi0JcHVibGljIGludCBnZXRDb2x1bW5JbmRleCgpIHsKLQkJcmV0dXJuIGNvbHVtbkluZGV4OwotCX0KLQotCS8qKgotCSAqIFNldCBpbmRleCBmb3IgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbkluZGV4Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXgoaW50IGNvbHVtbkluZGV4KSB7Ci0JCXRoaXMuY29sdW1uSW5kZXggPSBjb2x1bW5JbmRleDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2VsbGVkaXRvcnMvUHJvY2Vzc0NoZWNrQm94Q2VsbEVkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NlbGxlZGl0b3JzL1Byb2Nlc3NDaGVja0JveENlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWQ1OTM2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2VsbGVkaXRvcnMvUHJvY2Vzc0NoZWNrQm94Q2VsbEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotCi0vKioKLSAqIENoZWNrIEJveCBjZWxsIGVkaXRvciBmb3IgcHJvY2VzcyBmb3JtIHBhZ2UsIFdCUywgVEEsIFdQVQotICogCi0gKiBAYXV0aG9yIEFuIE1pbmcKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ2hlY2tCb3hDZWxsRWRpdG9yIGV4dGVuZHMgQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IgewotCQotCS8vIGNoZWNrYm94IGltYWdlcwotCXByaXZhdGUgZmluYWwgSW1hZ2UgY2hlY2tJbWFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCSJmdWxsL29iajE2L0NoZWNrLmdpZiIpOwotCi0JcHJpdmF0ZSBmaW5hbCBJbWFnZSB1bmNoZWNrSW1hZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkiZnVsbC9vYmoxNi9VbmNoZWNrLmdpZiIpOwotCi0JcHJpdmF0ZSBmaW5hbCBJbWFnZSBkaXNhYmxlQ2hlY2tJbWFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJImZ1bGwvb2JqMTYvRGlzYWJsZUNoZWNrLmdpZiIpOwotCQotCXByaXZhdGUgZmluYWwgSW1hZ2UgZGlzYWJsZVVuY2hlY2tJbWFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJImZ1bGwvb2JqMTYvRGlzYWJsZVVuQ2hlY2suZ2lmIik7Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gdHJlZQotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ2hlY2tCb3hDZWxsRWRpdG9yKENvbXBvc2l0ZSB0cmVlKSB7Ci0JCXN1cGVyKHRyZWUpOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciNnZXRJbWFnZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbSwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoVHJlZUl0ZW0gaXRlbSwgU3RyaW5nIGNvbHVtbnByb3BlcnR5KSB7Ci0JCWZpbmFsIElDZWxsTW9kaWZpZXIgbW9kaWZpZXIgPSBnZXRDZWxsTW9kaWZpZXIoKTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVtLmdldERhdGEoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotLy8JCWlmIChjb2x1bW5wcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcKLS8vCQkJCXx8IGNvbHVtbnByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRQotLy8JCQkJfHwgY29sdW1ucHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pIHsKLS8vCQkJaWYgKCEoVG5nVXRpbC51bndyYXAoZWxlbWVudCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkpIHsKLS8vCQkJCXJldHVybiBudWxsOwotLy8JCQl9Ci0vLwkJfQotCQlPYmplY3QgdmFsdWUgPSBtb2RpZmllci5nZXRWYWx1ZShlbGVtZW50LCBjb2x1bW5wcm9wZXJ0eSk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsIHx8ICEodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSkKLQkJCXJldHVybiBudWxsOwotCQlib29sZWFuIGNhbk1vZGlmeSA9IG1vZGlmaWVyLmNhbk1vZGlmeShlbGVtZW50LCBjb2x1bW5wcm9wZXJ0eSk7Ci0KLQkJaWYgKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQlyZXR1cm4gY2FuTW9kaWZ5ID8gY2hlY2tJbWFnZSA6IGRpc2FibGVDaGVja0ltYWdlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGNhbk1vZGlmeSA/IHVuY2hlY2tJbWFnZSA6IGRpc2FibGVVbmNoZWNrSW1hZ2U7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNlbGxlZGl0b3JzLkFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yI21vZGlmeShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbSwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnkoVHJlZUl0ZW0gaXRlbSwgU3RyaW5nIGNvbHVtbnByb3BlcnR5KSB7Ci0JCWZpbmFsIElDZWxsTW9kaWZpZXIgbW9kaWZpZXIgPSBnZXRDZWxsTW9kaWZpZXIoKTsKLQkJaWYgKCFtb2RpZmllci5jYW5Nb2RpZnkoaXRlbS5nZXREYXRhKCksIGNvbHVtbnByb3BlcnR5KSkKLQkJCXJldHVybjsKLQkJbW9kaWZpZXIubW9kaWZ5KGl0ZW0sIGNvbHVtbnByb3BlcnR5LCBuZXcgQm9vbGVhbighKChCb29sZWFuKSBtb2RpZmllcgotCQkJCS5nZXRWYWx1ZShpdGVtLmdldERhdGEoKSwgY29sdW1ucHJvcGVydHkpKS5ib29sZWFuVmFsdWUoKSkpOwotCX0KLQotCS8qCi0JICogPT09PT09PWluIGZhY3QgYmVsb3cgY29kZXMgYXJlIGZvciB0aGUgZHluYW1pYyBjZWxsIGVkaXRvciAocmVhbCBjb250cm9sCi0JICogImJ1dHRvbiIpPT09PT0KLQkgKi8KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNlbGxlZGl0b3JzLkFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250cm9sKFRyZWUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnBhY2soKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNlbGxlZGl0b3JzLkFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yI2hvb2tDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wsIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhvb2tDb250cm9sKENvbnRyb2wgY29udHJvbCwgVHJlZUl0ZW0gaXRlbSwKLQkJCWZpbmFsIFN0cmluZyBjb2x1bW5wcm9wZXJ0eSkgewotCQlmaW5hbCBJQ2VsbE1vZGlmaWVyIG1vZGlmaWVyID0gZ2V0Q2VsbE1vZGlmaWVyKCk7Ci0JCWZpbmFsIE9iamVjdCBlbGVtZW50ID0gaXRlbTsKLQkJZmluYWwgQnV0dG9uIGNoZWNrYm94ID0gKEJ1dHRvbikgY29udHJvbDsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQljaGVja2JveC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbW9kaWZpZXIubW9kaWZ5KGVsZW1lbnQsIGNvbHVtbnByb3BlcnR5LCBuZXcgQm9vbGVhbihjaGVja2JveAotCQkJCQkJLmdldFNlbGVjdGlvbigpKSk7Ci0JCQl9Ci0JCX07Ci0JCWNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9DaGVhdHNoZWV0U3dpdGNoSm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9DaGVhdHNoZWV0U3dpdGNoSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg2MTk4ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvQ2hlYXRzaGVldFN3aXRjaEpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jaGVhdHNoZWV0cy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5PcGVuQ2hlYXRTaGVldEFjdGlvbjsKLQotLyoqCi0gKiBTd2l0Y2hzIGNoZWF0IHNoZWV0IGFuZCBvcGVucyBpdC4KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ2hlYXRzaGVldFN3aXRjaEpvYiBleHRlbmRzIEpvYiB7Ci0JcHJpdmF0ZSBTdHJpbmcgY2hlYXRzaGVldElkOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlIHdpdGggY2hlYXQgc2hlZXQgbmFtZSBhbmQgSWQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBjaGVhdHNoZWV0SWQKLQkgKi8KLQlwdWJsaWMgQ2hlYXRzaGVldFN3aXRjaEpvYihTdHJpbmcgbmFtZSwgU3RyaW5nIGNoZWF0c2hlZXRJZCkgewotCQlzdXBlcihuYW1lKTsKLQkJdGhpcy5jaGVhdHNoZWV0SWQgPSBjaGVhdHNoZWV0SWQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQluZXcgT3BlbkNoZWF0U2hlZXRBY3Rpb24oY2hlYXRzaGVldElkKS5ydW4oKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL0NyZWF0ZVBsdWdpbkFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvQ3JlYXRlUGx1Z2luQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2Nzg3OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvQ3JlYXRlUGx1Z2luQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNoZWF0c2hlZXRzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTmV3UGx1Z2luQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5JQ2hlYXRTaGVldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5JQ2hlYXRTaGVldE1hbmFnZXI7Ci0KLS8qKgotICogQ3JlYXRlIE1ldGhvZCBQbHVnLWluIGNoZWF0IHNoZWV0IGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVQbHVnaW5BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJQ2hlYXRTaGVldEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBAc2VlIElDaGVhdFNoZWV0QWN0aW9uI3J1bihTdHJpbmdbXSwgSUNoZWF0U2hlZXRNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihTdHJpbmdbXSBwYXJhbXMsIElDaGVhdFNoZWV0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCU5ld1BsdWdpbkFjdGlvbi5leGVjdXRlKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIG51bGwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvU3dpdGNoQ2hlYXRzaGVldFRvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9Td2l0Y2hDaGVhdHNoZWV0VG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjQxMzVlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9Td2l0Y2hDaGVhdHNoZWV0VG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2hlYXRzaGVldHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuSUNoZWF0U2hlZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuSUNoZWF0U2hlZXRNYW5hZ2VyOwotCi0vKioKLSAqIENyZWF0ZSBzd2l0Y2ggY2hlYXQgc2hlZXQgYWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN3aXRjaENoZWF0c2hlZXRUbyBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElDaGVhdFNoZWV0QWN0aW9uIHsKLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuSUNoZWF0U2hlZXRBY3Rpb24jcnVuKGphdmEubGFuZy5TdHJpbmdbXSwgb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuSUNoZWF0U2hlZXRNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihTdHJpbmdbXSBwYXJhbXMsIElDaGVhdFNoZWV0TWFuYWdlciBtYW5hZ2VyKSB7Ci0KLQkJaWYgKHBhcmFtcy5sZW5ndGggPD0gMCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgY3NfaWQgPSBwYXJhbXNbMF07Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6IGluIFN3aXRjaENoZWF0c2hlZXRUby5ydW4oLi4uKSBjc19JRCA9Ci0JCS8vICIgKyBjc19pZCk7IC8vJE5PTi1OTFMtMSQKLQotCQlDaGVhdHNoZWV0U3dpdGNoSm9iIHN3aXRjaEpvYiA9IG5ldyBDaGVhdHNoZWV0U3dpdGNoSm9iKAotCQkJCSJTd2l0Y2ggQ2hlYXRzaGVldCIsIGNzX2lkKTsgLy8kTk9OLU5MUy0xJAotCQlzd2l0Y2hKb2Iuc2NoZWR1bGUoNTApOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MmU5YWZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGFjdGlvbnMgZm9yIHRoZSBBdXRob3JpbmcgY2hlYXRzaGVldHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQURESW5mb0RpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQURESW5mb0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NDQwOGM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0FEREluZm9EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSVByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogRmlsdGVyIERpYWxvZyAtIGFsbG93IHRoZSB1c2VyIHRvIGZpbHRlciB0aGUgY29udGVudCBlbGVtZW50LCBjb250ZW50Ci0gKiBjYXRlZ29yaWVzLCBjdXN0b20gY2F0ZWdvcmllcywgQWxsIHR5cGVzIG9mIGNvbnRlbnRlbGVtZW50cyBiYXNlZCBvbiBsb2NhdGlvbiBvZiB0aGUgdXNlIG9mIHRoZSBmaWx0ZXIKLSAqIGRpYWxvZy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBBRERJbmZvRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSURvdWJsZUNsaWNrTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbiwgY2FuY2VsQnV0dG9uOwotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9icmllZl9kZXNjOwotCi0JLy9wcml2YXRlIFN0cmluZyBwYXR0ZXJuLCBmaWx0ZXJUeXBlU3RyOwotCi0JLy9wcm90ZWN0ZWQgQ29tYm8gZmlsdGVyVHlwZTsKLQotCXByaXZhdGUgU3RyaW5nIGRpYWxvZ1RpdGxlLCB0YWJTdHI7Ci0KLQlwcml2YXRlIE9iamVjdCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgQXJyYXlMaXN0IHNlbGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiB2aWV3ZXJTZWxlY3Rpb25TaW5nbGUgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyB2aWV3ZXJMYWJlbCA9IG51bGw7Ci0JCi0JLyoKLQkgKiBUcmVldmlld2VyIGZvciBDb250ZW50RWxlbWVudHMgdG8gZGlzcGxheS4KLQkgKi8KLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCS8vIHJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LCAiIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoKLQkgKiBEaWFsb2cgQXR0cmlidXRlcwotCSAqLwotCS8vIHByaXZhdGUgYm9vbGVhbiBhbnlDaGlsZHMgPSB0cnVlOwotCXByaXZhdGUgTGlzdCBhbHJlYWR5U2VsZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCVBhdHRlcm4gcmVnZXhQYXR0ZXJuOwotCi0JLy8gcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZ3VyYXRpb247Ci0JcHJvdGVjdGVkIEZpbHRlckhlbHBlciBoZWxwZXI7Ci0KLQlwcml2YXRlIEJ1dHRvbiBleHBhbmRCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb2xsYXBzZUJ1dHRvbjsKLQotCXByaXZhdGUgT2JqZWN0IGlucHV0OwotCi0JLy9wcml2YXRlIFN0cmluZ1tdIHR5cGVzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBGaWx0ZXJEaWFsb2cuIFRoaXMgY29uc3RydWN0b3Igd2lsbCB1c2UgZmlsdGVyIGJhc2VkIG9uCi0JICogdGFiU3RyLCBmaWx0ZXJzIG91dCB0aGUgbGlzdCBvZiBlbGVtZW50cyBiYXNlZCBvbiBhbHJlYWR5IGV4aXN0aW5nCi0JICogc2VsZWN0ZWQgZWxlbWVudCBpbiB0aGUgc2VsZWN0ZWQgdGFibGUuIEluaXRpYWxpemVzIHRoZSBDb250ZW50UHJvdmlkZXIKLQkgKiBmb3IgdGhlIHRyZWV2aWV3ZXIuCi0JICogCi0JICovCi0JcHVibGljIEFEREluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE9iamVjdCBjb250ZW50RWxlbWVudCwKLQkJCVN0cmluZyB0YWJTdHIsIExpc3QgYWxyZWFkeUV4aXN0cykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0JCXRoaXMuZmlsdGVyID0gbnVsbDsKLQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0ID0gYWxyZWFkeUV4aXN0czsKLQkJaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLAotCQkJCXRoaXMuYWxyZWFkeVNlbGVjdGVkTGlzdCk7Ci0JCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQl9Ci0KLQlwdWJsaWMgQURESW5mb0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUZpbHRlciBmaWx0ZXIsIFN0cmluZyB0YWJTdHIsCi0JCQlMaXN0IGFscmVhZHlFeGlzdHMsIE9iamVjdCBpbnB1dCkgewotCQl0aGlzKHBhcmVudFNoZWxsLCBmaWx0ZXIsIG51bGwsIHRhYlN0ciwgYWxyZWFkeUV4aXN0cyk7Ci0JCXRoaXMuaW5wdXQgPSBpbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHVzZSBwYXNzZWQgZmlsdGVyLgotCSAqIHRhYlN0ciBpcyB1c2VkIGZvciB0aGUgc2VhcmNodHlwZSBvbmx5LiBJbml0aWFsaXplcyB0aGUgQ29udGVudFByb3ZpZGVyCi0JICogZm9yIHRoZSB0cmVldmlld2VyLgotCSAqIAotCSAqLwotCXB1YmxpYyBBRERJbmZvRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJRmlsdGVyIGZpbHRlciwKLQkJCU9iamVjdCBjb250ZW50RWxlbWVudCwgU3RyaW5nIHRhYlN0cikgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQotCQloZWxwZXIgPSBuZXcgRmlsdGVySGVscGVyKGNvbnRlbnRFbGVtZW50LCB0YWJTdHIsIG51bGwsIG51bGwsIG51bGwpOwotCQlpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBGaWx0ZXJEaWFsb2cuIFRoaXMgY29uc3RydWN0b3Igd2lsbCB1c2UgcGFzc2VkIGZpbHRlci4KLQkgKiB0YWJTdHIgaXMgdXNlZCBmb3IgdGhlIHNlYXJjaHR5cGUgb25seS4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlcgotCSAqIGZvciB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgQURESW5mb0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUZpbHRlciBmaWx0ZXIsCi0JCQlPYmplY3QgY29udGVudEVsZW1lbnQsIFN0cmluZyB0YWJTdHIsIExpc3QgYWxyZWFkeUV4aXN0cykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0ID0gYWxyZWFkeUV4aXN0czsKLQkJaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLAotCQkJCWFscmVhZHlFeGlzdHMpOwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gT25seSBmb3IgbWV0aG9kY29uZmlndXJhdGlvbi4gVGhpcwotCSAqIGNvbnN0cnVjdG9yIHdpbGwgdXNlIHBhc3NlZCBmaWx0ZXIuIEluaXRpYWxpemVzIHRoZSBDb250ZW50UHJvdmlkZXIgZm9yCi0JICogdGhlIHRyZWV2aWV3ZXIuCi0JICogCi0JICovCi0JLy8gcHVibGljIEl0ZW1zRmlsdGVyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3QgY29udGVudEVsZW1lbnQsCi0JLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uLCBTdHJpbmcgdGFiU3RyKSB7Ci0JLy8gc3VwZXIocGFyZW50U2hlbGwpOwotCS8vIHRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkvLyB0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQkvLyB0aGlzLmZpbHRlciA9IG51bGw7Ci0JLy8gdGhpcy5tZXRob2RDb25maWd1cmF0aW9uID0gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQkvLyBoZWxwZXIgPSBuZXcgRmlsdGVySGVscGVyKGNvbnRlbnRFbGVtZW50LCB0YWJTdHIsIG51bGwsIG51bGwsIG51bGwpOwotCS8vIGluaXRQcm92aWRlckZvclRhYnMoKTsKLQkvLyB9Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyB2ZXJ5IGdlbmVyaWMsIGluIG9yZGVyIHRvIGluaXRpYWxpemUgZmlsdGVyLCBpbnB1dAotCSAqIGFuZCBjb250ZW50cHJvdmlkZXIgc2hvdWxkIGJlIGhhbmRsZWQgZXhwbGljaXRseSBieSBjYWxsaW5nIGJlbG93IG1ldGhvZC4KLQkgKiBzZXRGaWx0ZXIoSUZpbHRlcikgc2V0SW5wdXQoT2JqZWN0KQotCSAqIHNldENvbnRlbnRQcm92aWRlcihJU3RydWN0dXJlZFByb3ZpZGVyKQotCSAqIAotCSAqLwotCXB1YmxpYyBBRERJbmZvRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaWYgYSBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkKLQkJCXNhdmVWYWx1ZXMoKTsKLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JCWlmKGNvbXBvc2VkQWRhcHRlckZhY3RvcnkgIT0gbnVsbCl7Ci0JCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCQljbG9zZSgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVZhbHVlcygpewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRyZWVWaWV3ZXIKLQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCU9iamVjdFtdIG9iamVjdEFyciA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdEFyci5sZW5ndGg7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqZWN0QXJyW2ldKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJc2VsZWN0ZWRMaXN0LmFkZChvYmopOwotCQkJCX0gCi0JCQl9Ci0JCX0KLQl9Ci0JCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgdGhlIGNhbmNlbCBidXR0b24gb2YgdGhpcyBkaWFsb2cgaGFzIGJlZW4gcHJlc3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCQlpZihjb21wb3NlZEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpewotCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aXRsZSBmb3IgZGlhbG9nIGJveCBlZzogU2VsZWN0IERpYWxvZyBGb3IgUm9sZSwgZGlhbG9nVGl0bGUgbmVlZHMgdG8KLQkgKiAiUm9sZSIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgZGlhbG9nVGl0bGUpIHsKLQkJdGhpcy5kaWFsb2dUaXRsZSA9IGRpYWxvZ1RpdGxlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCWlmIChkaWFsb2dUaXRsZSA9PSBudWxsKQotCQkJZGlhbG9nVGl0bGUgPSB0YWJTdHI7Ci0JCXNoZWxsLnNldFRleHQoIkFjdGl2aXR5IERldGFpbCBEaWFncmFtIEluZm86ICIgKyBkaWFsb2dUaXRsZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAobm9uLUphdmFkb2MpIEFkZHMgYnV0dG9ucyB0byB0aGlzIGRpYWxvZydzIGJ1dHRvbiBiYXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbiBiYXIgY29tcG9zaXRlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZGlhbG9nIGFyZWEgYW5kIGNvbnRyb2xzIGFuZCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHRoZQotCSAqICAgICAgICAgICAgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBkaWFsb2cgYXJlYQotCSAqIEByZXR1cm4gdGhlIGRpYWxvZyBhcmVhIGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCS8vR3JpZERhdGEgZ0QgPSAoR3JpZERhdGEpIGNvbXBvc2l0ZS5nZXRMYXlvdXREYXRhKCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQotCQlMYWJlbCB0eXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXsKLQkJCXR5cGVMYWJlbC5zZXRUZXh0KCJTZWxlY3QgdGhlIGFjdGl2aXR5IHRvIG1vZGlmeSBBREQiKTsgLy8kTk9OLU5MUy0xJAotCQkJR3JpZERhdGEgZ0QxID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQl0eXBlTGFiZWwuc2V0TGF5b3V0RGF0YShnRDEpOwotCi0JCX0KLS8vCQlmaWx0ZXJUeXBlID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotLy8JCXsKLS8vCQkJR3JpZERhdGEgZ0QxID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0vLwkJCWdEMS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0vLwkJCWdEMS53aWR0aEhpbnQgPSAzOTA7Ci0vLwkJCWZpbHRlclR5cGUuc2V0TGF5b3V0RGF0YShnRDEpOwotLy8JCX0KLS8vCi0vLwkJaWYgKHR5cGVzID09IG51bGwpIHsKLS8vCQkJZmlsbEZpbHRlclR5cGVDb21ibygpOwotLy8JCX0gZWxzZSB7Ci0vLwkJCWZpbHRlclR5cGUuc2V0SXRlbXModHlwZXMpOwotLy8JCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLS8vCQkJCWZpbHRlclR5cGVTdHIgPSBmaWx0ZXJUeXBlLmdldEl0ZW0oMCk7Ci0vLwkJCQloZWxwZXIuc2V0RmlsdGVyVHlwZVN0cihmaWx0ZXJUeXBlLmdldEl0ZW0oMCkpOwotLy8JCQkJaWYgKHRhYlN0ciA9PSBudWxsKSB7Ci0vLwkJCQkJdGFiU3RyID0gZmlsdGVyVHlwZVN0cjsKLS8vCQkJCQloZWxwZXIuc2V0VGFiU3RyKHRhYlN0cik7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJZmlsdGVyVHlwZS5zZWxlY3QoMCk7Ci0KLS8vCQlMYWJlbCBjdHJsX3BhdHRlcm5MYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLS8vCQl7Ci0vLwkJCWN0cmxfcGF0dGVybkxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dCk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJZ0QuaG9yaXpvbnRhbFNwYW4gPSAzOwotLy8JCQljdHJsX3BhdHRlcm5MYWJlbC5zZXRMYXlvdXREYXRhKGdEKTsKLS8vCQl9Ci0KLS8vCQljdHJsX3BhdHRlcm4gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotLy8JCXsKLS8vCQkJR3JpZERhdGEgZ0QxID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0vLwkJCWdEMS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0vLwkJCWN0cmxfcGF0dGVybi5zZXRMYXlvdXREYXRhKGdEMSk7Ci0vLwkJCWN0cmxfcGF0dGVybi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKAotLy8JCQkJCW5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0vLwkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfUGF0dGVybl90ZXh0ICsgIAotLy8JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb24pKTsKLS8vCQl9Ci0vLwkJTGFiZWwgY3RybF9wYXR0ZXJuTGFiZWwxID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotLy8JCXsKLS8vCQkJY3RybF9wYXR0ZXJuTGFiZWwxLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCi0vLwkJCWN0cmxfcGF0dGVybkxhYmVsMS5zZXRMYXlvdXREYXRhKGdEKTsKLS8vCQl9Ci0JCQotCQlDb21wb3NpdGUgYnV0dG9uc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7CQkKLQkJCi0JCUdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQlnZDIuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlidXR0b25zQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QyKTsKLQkJR3JpZExheW91dCBidXR0b25zTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJYnV0dG9uc0xheW91dC5udW1Db2x1bW5zID0gMjsKLQkJYnV0dG9uc0xheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbnNMYXlvdXQpOwotCQkKLQkJZXhwYW5kQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcG9zaXRlLCBTV1QuQlVUVE9OMSk7Ci0KLQkJZXhwYW5kQnV0dG9uLnNldEltYWdlKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiZXhwYW5kYWxsLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlleHBhbmRCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0V4cGFuZEFsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWV4cGFuZEJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsKSk7CQkKLQotCQlnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0KLQkJZXhwYW5kQnV0dG9uLnNldExheW91dERhdGEoZ2QyKTsKLQotCQljb2xsYXBzZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQljb2xsYXBzZUJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImNvbGxhcHNlYWxsLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNvbGxhcHNlQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbCk7IC8vJE5PTi1OTFMtMSQKLQkJY29sbGFwc2VCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbCkpOwotCQkKLQkJZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQotCQljb2xsYXBzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkMik7Ci0JCQotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZSwgMyk7Ci0JCWNyZWF0ZVZpZXdlckxhYmVsKGNvbXBvc2l0ZSk7Ci0JCS8vIGNyZWF0ZSBhIHRyZWV2aWV3ZXIgYXJlYS4KLQkJY3JlYXRlVmlld2VyKGNvbXBvc2l0ZSk7Ci0KLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9icmllZl9kZXNjID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5SRUFEX09OTFkpOwotCQl7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJZ2QuaGVpZ2h0SGludCA9IDYwOwotCQkJY3RybF9icmllZl9kZXNjLnNldExheW91dERhdGEoZ2QpOwotCQl9Ci0JCS8vIFJlc3RvcmUgdGhlIGxhc3Qgc3RhdGUKLQkJY3JlYXRlTGluZShjb21wb3NpdGUsIDMpOwotCi0JCS8vIFJldHVybiByZXN1bHRzLgotCQlhZGRMaXN0ZW5lcigpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBjcmVhdGVEaWFsb2dBcmVhLmZpbHRlclR5cGVTdHIgPSAiICsKLQkJLy8gZmlsdGVyVHlwZVN0cik7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHZpZXdlciBpbiB0aGUgcGFyZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKHZpZXdlclNlbGVjdGlvblNpbmdsZSkgewotCQkJdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl9IGVsc2UgewotCQkJdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMCi0JCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCX0KLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl0cmVlVmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0KLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQl9IGVsc2UgewotCQkJLy8gUGhvbmc6IHRoaXMgaXMgdG9vIG1lc3N5LiBJZiB5b3UgcmVsaWVzIG9uIHRoZSBjb250ZW50RWxlbWVudCB0bwotCQkJLy8gZGV0ZXJtaW5lIHRoZSBpbnB1dCBmb3IgdGhlIHZpZXdlcgotCQkJLy8gdGhlbiB5b3Ugc2hvdWxkIGRlY2xhcmUgYSBpbnB1dCBmaWVsZCBpbnN0ZWFkIGFuZCBtb3ZlIHRoaXMgY29kZQotCQkJLy8gdG8gY29uc3RydWN0b3IKLQkJCS8vCi0JCQkvLyBzb3J0ZXIgbmVlZHMgb3Igbm90LiBUT0RPCi0JCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCQkJCWlmICgoKFByb2Nlc3MpIGNvbnRlbnRFbGVtZW50KS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkJaWYgKHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFKQotCQkJCQkJCQkJfHwgdGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9BRE1BUCkgCi0JCQkJCQkJCQl8fCB0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUykpIHsKLQkJCQkJCQkJdHJlZVZpZXdlcgotCQkJCQkJCQkJCS5zZXRJbnB1dChVbWFVdGlsCi0JCQkJCQkJCQkJCQkuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgY29udGVudEVsZW1lbnQpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl0cmVlVmlld2VyLnNldElucHV0KCgoUHJvY2VzcykgY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCQkJLmVDb250YWluZXIoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlCi0JCQkJCQkJdHJlZVZpZXdlci5zZXRJbnB1dChjb250ZW50RWxlbWVudCk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJdHJlZVZpZXdlci5zZXRJbnB1dChVbWFVdGlsCi0JCQkJCQkJCS5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoVW1hVXRpbAotCQkJCQkJCS5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdHJlZVZpZXdlcgotCQkJCQkJLnNldElucHV0KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCQl9Ci0JCX0KLQotCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJdHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKHRoaXMpOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCWlmICh0YWJTdHIuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgRmlsdGVyU29ydGVyRm9yQWxsKCkpOwotCQl9IGVsc2UgewotCQkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IEZpbHRlclNvcnRlcigpKTsKLQkJfQotCi0JCS8vIHRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbCgzKTsKLQkJLy8gdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXsKLQkJCXNwZWMud2lkdGhIaW50ID0gMzAwOwotCQkJc3BlYy5oZWlnaHRIaW50ID0gMzAwOwotCQkJc3BlYy5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG5jb2wpIHsKLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5jb2w7Ci0JCWxpbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZpZXdlckxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgIAkJaWYgKHZpZXdlckxhYmVsICE9IG51bGwpIHsKLSAgIAkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dCh2aWV3ZXJMYWJlbCk7Ci0gICAJCX0KLSAgIAl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKGJvb2xlYW4gc2luZ2xlKSB7Ci0JCXZpZXdlclNlbGVjdGlvblNpbmdsZSA9IHNpbmdsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXIjZG91YmxlQ2xpY2sob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJZWxlbWVudCA9IExpYnJhcnlVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJc2VsZWN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJc2VsZWN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJLy8gaWYoIShlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKQotCQkJc2VsZWN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCS8vIGlmKCEoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkJCXNlbGVjdGVkTGlzdC5hZGQoZWxlbWVudCk7Ci0JCX0KLQkJY2xvc2UoKTsKLQkJaWYoY29tcG9zZWRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdHJhdmVyc2VUcmVlKFRyZWVJdGVtW10gaXRlbXMsIExpc3QgbGlzdCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmVlSXRlbVtdIGl0ZW1zeCA9IGl0ZW1zW2ldLmdldEl0ZW1zKCk7Ci0JCQlpZiAoaXRlbXN4Lmxlbmd0aCA+IDEpIHsKLQkJCQlsaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJCXRyYXZlcnNlVHJlZShpdGVtc3gsIGxpc3QpOwotCQkJfSBlbHNlIHsKLQkJCQlsaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JCi0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIGV2ZW50IG9iamVjdCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQl1cGRhdGVTZWxlY3Rpb24oZXZlbnQpOwotCQl1cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBidXR0b24gZW5hYmxlbWVudCBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQkvLyBva0J1dHRvbi5zZXRFbmFibGVkKGdldFNlbGVjdGlvbigpLmxlbmd0aCA+IDApOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50T2JqZWN0KE9iamVjdCBjb250ZW50RWxlbWVudCkgewotCQlyZXR1cm4gTWV0aG9kRWxlbWVudFV0aWwuZ2V0TWV0aG9kTW9kZWwoY29udGVudEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgc2VsZWN0aW9uIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWxlY3Rpb24oU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIEFycmF5TGlzdCBkZXNjcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB8fAotCQkJCXNlbGVjdGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcil7Ci0JCQlPYmplY3QgdW53cmFwID0gIFRuZ1V0aWwudW53cmFwKHNlbGVjdGVkKTsKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24odW53cmFwKTsKLQkJfWVsc2UgewotCQkJc2V0QnJpZWZEZXNjcmlwdGlvbihzZWxlY3RlZCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogU2V0IHRoZSBicmllZiBkZXNjcmlwdGlvbiB0byBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEJyaWVmRGVzY3JpcHRpb24oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJfQotCQl9Ci0JfQotCi0JCi0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcigpIHsKLQotCQlleHBhbmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQotCQkJfQotCQl9KTsKLQkJY29sbGFwc2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJlZVZpZXdlci5jb2xsYXBzZUFsbCgpOwotCi0JCQl9Ci0JCX0pOwotCi0JfQotCi0JcHVibGljIEFycmF5TGlzdCBnZXRTZWxlY3RlZEl0ZW1zKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRMaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJGb3JUYWJzKCkgewotCi0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUZpbHRlcikgewotCQkJCWlmKGZpbHRlciBpbnN0YW5jZW9mIElDYXRlZ29yeUZpbHRlcil7Ci0JCQkJCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbnRlbnRjYXRlZ29yeS4KLQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzQ1MgotCQkJCQloZWxwZXIuc2V0Q29udGVudENhdGVnb3J5VGFiU3RyKHRhYlN0cik7Ci0JCQkJfQotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkuc2V0SGVscGVyKGhlbHBlcik7Ci0JCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQkJKChEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX1lbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBFeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IpIHsKLQkJCQkoKEV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcikgZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSVByb2Nlc3NGaWx0ZXIpIHsKLQkJCWlmICh0YWJTdHIKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SUykpIHsKLQkJCQlhZGFwdGVyRmFjdG9yeSA9VG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcik7Ci0JCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJfSBlbHNlIGlmICh0YWJTdHIKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlMpKSB7Ci0JCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKTsgCi0JCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpOyAKLQkJCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhpc3RpbmdFbGVtZW50cyhMaXN0IGxpc3QpIHsKLQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0ID0gbGlzdDsKLQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0JCQloZWxwZXIuc2V0QWxyZWFkeVNlbGVjdGVkTGlzdChsaXN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBGaWx0ZXJIZWxwZXIgZ2V0SGVscGVyKCkgewotCQlyZXR1cm4gdGhpcy5oZWxwZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEZpbHRlclR5cGVBcnJheSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBzZXRzIHRoZSBDb250ZW50UHJvdmlkZXIgdXNlZCBieSBUcmVlVmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRQcm92aWRlcihJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5jb250ZW50UHJvdmlkZXIgPSBjb250ZW50UHJvdmlkZXI7Ci0JCXRoaXMuY29tcG9zZWRBZGFwdGVyRmFjdG9yeSA9IGNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiBzZXQgdGhlIEZpbHRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZmlsdGVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIpIHRoaXMuZmlsdGVyKQotCQkJCQkJLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfSBlbHNlIGlmICh0aGlzLmZpbHRlciBpbnN0YW5jZW9mIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQkJKChEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgdGhpcy5maWx0ZXIpLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJMYWJlbChTdHJpbmcgdmlld2VyTGFiZWwpIHsKLQkJdGhpcy52aWV3ZXJMYWJlbCA9IHZpZXdlckxhYmVsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9BdHRhY2htZW50RGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9BdHRhY2htZW50RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0NGRmMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQXR0YWNobWVudERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogT3BlbnMgZGlhbG9nIHRvIGF0dGFjaCBhdHRhY2htZW50cwotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF0dGFjaG1lbnREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLyoqCi0JICogVGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIENhbmNlbCBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0KLQlwcml2YXRlIFRleHQgYXR0YWNobWVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIEF0dGFjaG1lbnREaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBkaWFsb2dBcmVhLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBkaWFsb2dBcmVhLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSAxMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0JCUxhYmVsIHVybExhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJdXJsTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5BdHRhY2htZW50RGlhbG9nRmlsZVVSTF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlhdHRhY2htZW50ID0gbmV3IFRleHQoZGlhbG9nQXJlYSwgU1dULkJPUkRFUik7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJYXR0YWNobWVudC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJYXR0YWNobWVudC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJCQlva0J1dHRvbgotCQkJCQkJCS5zZXRFbmFibGVkKGF0dGFjaG1lbnQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuQlJPV1NFX0JVVFRPTl9URVhUKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5PUEVOKTsKLQkJCQlTdHJpbmcgaW1hZ2VGaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoaW1hZ2VGaWxlICE9IG51bGwgJiYgaW1hZ2VGaWxlLmxlbmd0aCgpID4gMCkgewotCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZUZpbGUpOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIHVybCA9IGZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJCQkJYXR0YWNobWVudC5zZXRUZXh0KHVybCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCXN1cGVyCi0JCQkJLmdldFNoZWxsKCkKLQkJCQkuc2V0VGV4dCgKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkF0dGFjaG1lbnREaWFsb2dhdHRhY2hGaWxlX3RleHQpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYnV0dG9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBPSyBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCi0JCS8vIFNldCBoZWxwIGNvbnRleHQgZm9yIHRoZSBPSyBidXR0b24uCi0JCW9rQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCi0JCS8vIFNldCBoZWxwIGNvbnRleHQgZm9yIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljYW5jZWxCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpOwotCi0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQkvLyBTdHJpbmcgdXJsID0gYXR0YWNobWVudC5nZXRUZXh0KCk7Ci0JCS8vIGlmICh1cmwgIT0gbnVsbCAmJiB1cmwubGVuZ3RoKCkgPiAwKSB7Ci0JCS8vCQkJCi0JCS8vIH0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRmlsZSBOYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRhY2htZW50UGF0aCgpIHsKLQkJcmV0dXJuIGF0dGFjaG1lbnQuZ2V0VGV4dCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NoYW5nZUhpc3RvcnlEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NoYW5nZUhpc3RvcnlEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzZmOTU4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9DaGFuZ2VIaXN0b3J5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotICogRGlhbG9nIHRvIHNob3cgY2hhbmdlIGhpc3Rvcnkgb2YgYW4gZWxlbWVudAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlSGlzdG9yeURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQkvKioKLQkgKiBUaGUgT0sgYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0KLQkvKioKLQkgKiBUaGUgQ2FuY2VsIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGNhbmNlbEJ1dHRvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlSGlzdG9yeURpYWxvZyhTaGVsbCBwYXJlbnQsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCi0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBkaWFsb2dBcmVhLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCUdyaWREYXRhIGdkID0gKEdyaWREYXRhKSBkaWFsb2dBcmVhLmdldExheW91dERhdGEoKTsKLQkJZ2QudmVydGljYWxJbmRlbnQgPSAxMDsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ2hhbmdlSGlzdG9yeURpYWxvZ19sYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQotCQl0YWJsZSA9IG5ldyBUYWJsZShkaWFsb2dBcmVhLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQl9Ci0KLQkJaW5pdENoYW5nZUhpc3RvcnlUYWJsZSgpOwotCQlzdXBlci5nZXRTaGVsbCgpLnNldFRleHQoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0Q2hhbmdlSGlzdG9yeVRhYmxlKCkgewotCQlTdHJpbmcgY2hhbmdlRGVzYyA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSAoKENvbnRlbnRFbGVtZW50KSBlbGVtZW50KQotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQljaGFuZ2VEZXNjID0gY29udGVudERlc2NyaXB0aW9uLmdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWNoYW5nZURlc2MgPSAoKE1ldGhvZFBsdWdpbikgZWxlbWVudCkuZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQkJfQotCi0JCWlmIChjaGFuZ2VEZXNjICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKAotCQkJCQljaGFuZ2VEZXNjLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5DaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlcik7IC8vJE5PTi1OTFMtMSQKLQkJCUxpc3Qgc3RyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlzdHJMaXN0LmFkZCh0b2submV4dFRva2VuKCkpOwotCQkJfQotCi0JCQlmb3IgKGludCBpID0gc3RyTGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJCWl0ZW0uc2V0VGV4dCgoU3RyaW5nKSBzdHJMaXN0LmdldChpKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRpYWxvZyBidXR0b25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIE9LIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgT0sgYnV0dG9uLgotCQlva0J1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlMjk0YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIE9wZW4gYW4gZGlhbG9nIHRvIGFkZCB2aWV3cyBpbnRvIGNvbmZpZ3VyYXRpb24KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uQWRkVmlld3NEaWFsb2cgZXh0ZW5kcyBJdGVtc0ZpbHRlckRpYWxvZyB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCQlTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IG51bGw7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCQlwcmVzZW50YXRpb25OYW1lID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCX0KLQkJCQlpZiAocHJlc2VudGF0aW9uTmFtZSA9PSBudWxsIHx8ICIiLmVxdWFscyhwcmVzZW50YXRpb25OYW1lKSkgewotCQkJCQlwcmVzZW50YXRpb25OYW1lID0gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gcHJlc2VudGF0aW9uTmFtZTsKLQkJCX0KLQkJfTsKLQkJaGVscGVyLnNldFNob3dQcmVzZW50YXRpb25OYW1lKHRydWUpOwotCQlyZXR1cm4gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbmZpZ3VyYXRpb25PcmRlckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUwODE5ZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0vKioKLSAqIE9wZW4gYSBkaWFsb2cgdG8gb3JkZXIgY29uZmlndXJhdGlvbiB2aWV3cwotICogQGF1dGhvciBYaWFuZyBEb25nIEh1Ci0gKiBAc2luY2UgMS4yCi0gKiAgZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczODI3Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uT3JkZXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYmFzZUNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfdXAsIGN0cmxfZG93bjsKLQotCXByaXZhdGUgVGFibGUgY3RybF92aWV3czsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld3NUYWJsZVZpZXdlcjsKLQotLy8JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgdmlld3NWaWV3ZXJDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIHZpZXdzVmlld2VyTGFiZWxQcm92aWRlcjsKLQkKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCQotCXByaXZhdGUgQXJyYXlMaXN0IGNvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXB1YmxpYyBDb25maWd1cmF0aW9uT3JkZXJEaWFsb2coU2hlbGwgcGFyZW50LCAKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLmFjdGlvbk1hbmFnZXIgPSBhY3Rpb25NYW5hZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIERpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWJhc2VDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCWJhc2VDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQliYXNlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCS8vIEVtcHR5IGxpbmUKLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlTGFiZWwoCi0JCQkJYmFzZUNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uT3JkZXJEaWFsb2dfTmF2aWdhdGlvblZpZXdzLCAzKTsKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdmlld3MgPSBuZXcgVGFibGUoYmFzZUNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDAwOwotCQkJY3RybF92aWV3cy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWluaXRQcm92aWRlcnMoKTsKLQotCQl2aWV3c1RhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdmlld3MpOwotCQl2aWV3c1RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcih2aWV3c1ZpZXdlckNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdzVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcih2aWV3c1ZpZXdlckxhYmVsUHJvdmlkZXIpOwotCi0JCUNvbXBvc2l0ZSBvcmRlckJ1dHRvblBhbmUgPSBuZXcgQ29tcG9zaXRlKGJhc2VDb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJfQotCi0JCWN0cmxfdXAgPSBjcmVhdGVCdXR0b24ob3JkZXJCdXR0b25QYW5lLCBBdXRob3JpbmdVSVRleHQuVVBfQlVUVE9OX1RFWFQpOwotCQljdHJsX3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWN0cmxfZG93biA9IGNyZWF0ZUJ1dHRvbihvcmRlckJ1dHRvblBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQpOwotCQljdHJsX2Rvd24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkvLyBFbXB0eSBsaW5lCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMaW5lKGJhc2VDb21wb3NpdGUsIDQpOwotCi0JCXN1cGVyCi0JCQkJLmdldFNoZWxsKCkKLQkJCQkuc2V0VGV4dCgKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25PcmRlckRpYWxvZ19kZXNjcmlwdGlvbik7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCWxvYWREYXRhKCk7Ci0KLQkJcmV0dXJuIGJhc2VDb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBuY29sKSB7Ci0JCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwKLQkJCQl8IFNXVC5CT0xEKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuY29sOwotCQlsaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQkKLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgbkNvbCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbkNvbDsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRQcm92aWRlcnMoKSB7Ci0JCXZpZXdzVmlld2VyQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlld3NWaWV3ZXJMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICFjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCkuY29udGFpbnMoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQl2aWV3c1RhYmxlVmlld2VyCi0JCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3c1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdzVGFibGVWaWV3ZXIKLQkJCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0JCQotCQljdHJsX3VwLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld3NUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCi0JCQkJQXJyYXlMaXN0IG1vdmVVcEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVVcEl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpOwotCQkJCU1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCgKLQkJCQkJCWNvbmZpZywgbW92ZVVwSXRlbXMsIGZlYXR1cmUsMSk7Ci0JCQkJYWN0aW9uTWFuYWdlci5leGVjdXRlKGNtZCk7Ci0JCQkJY29tbWFuZHMuYWRkKGNtZCk7Ci0KLQkJCQl2aWV3c1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQotCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDApIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQkJCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlBcnJheUxpc3QgbW92ZURvd25JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlRG93bkl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpOwotCQkJCU1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCgKLQkJCQkJCWNvbmZpZywgbW92ZURvd25JdGVtcywgZmVhdHVyZSwwKTsKLQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoY21kKTsKLQkJCQljb21tYW5kcy5hZGQoY21kKTsKLQotCQkJCXZpZXdzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKHZpZXdzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCkgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJaWYgKHZpZXdzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgdmlld3NUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQl2aWV3c1RhYmxlVmlld2VyLnNldElucHV0KGNvbmZpZyk7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotLy8JCWFsbFN0ZXBzLmFwcGx5KCk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JCWlmICghY29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gY29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlPYmplY3QgY21kID0gY29tbWFuZHMuZ2V0KGkpOwotCQkJCWlmIChjbWQgaW5zdGFuY2VvZiBNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCkgewotCQkJCQkoKE1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kKSBjbWQpLnVuZG8oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkZWIzMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkNhdGVnb3J5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db250ZW50RWxlbWVudE9yZGVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0vKioKLSAqIE9wZW4gYW4gZGlhbG9nIHRvIG9yZGVyIGNvbnRlbnQgZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYmFzZUNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfdXAsIGN0cmxfZG93bjsKLQotCXByaXZhdGUgVGFibGUgY3RybF9zdGVwczsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgc3RlcHNUYWJsZVZpZXdlcjsKLQotCXByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgYWxsU3RlcHM7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXI7Ci0KLQkvLyBwcml2YXRlIFRhc2sgY29udGVudEVsZW1lbnQ7Ci0JcHJpdmF0ZSBDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudDsKLQotCS8vIHRoZSBFbGVtZW50IHRvIHVzZSBmb3Igc29ydGluZwotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBzb3J0RWxlbWVudDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlcjsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGNvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByb3RlY3RlZCBDb21ib1ZpZXdlciB2aWV3ZXJfc29ydDsKLQkKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyU29ydCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlMaXN0PFN0cmluZz4gc29ydFR5cGVzTGlzdCA9IENhdGVnb3J5U29ydEhlbHBlci5nZXRDYXRlZ29yeVNvcnRUeXBlcygpOwotCQkJcmV0dXJuIHNvcnRUeXBlc0xpc3QudG9BcnJheSgpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyU29ydCA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlTdHJpbmcgc3RyID0gKChTdHJpbmcpb2JqZWN0KTsKLQkJCQlyZXR1cm4gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldFNvcnRUeXBlRGlzcGxheU5hbWUoc3RyKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIDxjb2RlPkFkdmFuY2VkU2VhcmNoRGlhbG9nPC9jb2RlPiBnaXZlYiB0aGUgcGFyZW50IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudHNPcmRlckRpYWxvZyhTaGVsbCBwYXJlbnQsCi0JCQlDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCWlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3IoY29udGVudEVsZW1lbnQpKSB7Ci0JCQl0aGlzLnNvcnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQl9IGVsc2UgewotCQkJdGhpcy5zb3J0RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQl9Ci0JCXRoaXMuYWN0aW9uTWFuYWdlciA9IGFjdGlvbk1hbmFnZXI7Ci0JCWFsbFN0ZXBzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIERpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWJhc2VDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCWJhc2VDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQliYXNlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCS8vIEVtcHR5IGxpbmUKLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlTGFiZWwoCi0JCQkJYmFzZUNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19Db250ZW50RWxlbWVudF90ZXh0LCAzKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9zdGVwcyA9IG5ldyBUYWJsZShiYXNlQ29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDA7Ci0JCQljdHJsX3N0ZXBzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJaW5pdFByb3ZpZGVycygpOwotCi0JCXN0ZXBzVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zdGVwcyk7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyKTsKLQkJc3RlcHNUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHN0ZXBzVmlld2VyTGFiZWxQcm92aWRlcik7Ci0KLQkJQ29tcG9zaXRlIG9yZGVyQnV0dG9uUGFuZSA9IG5ldyBDb21wb3NpdGUoYmFzZUNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlvcmRlckJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlvcmRlckJ1dHRvblBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl9Ci0KLQkJY3RybF91cCA9IGNyZWF0ZUJ1dHRvbihvcmRlckJ1dHRvblBhbmUsIEF1dGhvcmluZ1VJVGV4dC5VUF9CVVRUT05fVEVYVCk7Ci0JCWN0cmxfdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF9kb3duID0gY3JlYXRlQnV0dG9uKG9yZGVyQnV0dG9uUGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuRE9XTl9CVVRUT05fVEVYVCk7Ci0JCWN0cmxfZG93bi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY3JlYXRlTGFiZWwob3JkZXJCdXR0b25QYW5lLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5Tb3J0VHlwZV9MYWJlbCwgMSk7Ci0JCUNvbWJvIGN0cmxfc29ydCA9IG5ldyBDb21ibyhvcmRlckJ1dHRvblBhbmUsIFNXVC5TSU5HTEUgfCBTV1QuRkxBVCB8IFNXVC5SRUFEX09OTFkpOwotCQl2aWV3ZXJfc29ydCA9IG5ldyBDb21ib1ZpZXdlcihjdHJsX3NvcnQpOwotCQl2aWV3ZXJfc29ydC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU29ydCk7Ci0JCXZpZXdlcl9zb3J0LnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlclNvcnQpOwotCQl2aWV3ZXJfc29ydC5zZXRJbnB1dChjb250ZW50RWxlbWVudCk7Ci0JCS8vIHNldCBpbml0aWFsIHNlbGVjdGlvbgotCQlTdHJpbmcgc29ydFR5cGUgPSBDYXRlZ29yeVNvcnRIZWxwZXIuZ2V0Q2F0ZWdvcnlTb3J0VmFsdWUoc29ydEVsZW1lbnQpOwotCQl2aWV3ZXJfc29ydC5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc29ydFR5cGUpLCB0cnVlKTsKLQotCQkvLyBFbXB0eSBsaW5lCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMaW5lKGJhc2VDb21wb3NpdGUsIDQpOwotCi0JCXN1cGVyCi0JCQkJLmdldFNoZWxsKCkKLQkJCQkuc2V0VGV4dCgKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uX3RleHQpOyAvLyROT04tTkxTLTEkCi0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCWxvYWREYXRhKCk7Ci0KLQkJLy8gY29udHJpYnV0b3JzIGNhbm5vdCBjaGFuZ2UgdGhlIHNvcnQgdHlwZSAtIHRoZSBiYXNlIGVsZW1lbnQncyBzb3J0IGlzIHVzZWQKLQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcihjb250ZW50RWxlbWVudCkpIHsKLQkJCXZpZXdlcl9zb3J0LmdldENvbWJvKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQl2aWV3ZXJfc29ydC5nZXRDb21ibygpLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJdmlld2VyX3NvcnQuZ2V0Q29tYm8oKS5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0KLQkJcmV0dXJuIGJhc2VDb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG5jb2wpIHsKLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5jb2w7Ci0JCWxpbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IG5Db2wpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5Db2w7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgT0sgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIENyZWF0ZSB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFByb3ZpZGVycygpIHsKLQkJc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAoYWxsU3RlcHMgPT0gbnVsbCkgewotCQkJCQlhbGxTdGVwcyA9IG5ldyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCgKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdC5DT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUyk7Ci0JCQkJfQotCQkJCUxpc3QgcmV0dXJuTGlzdCA9IENhdGVnb3J5U29ydEhlbHBlci5zb3J0Q2F0ZWdvcnlFbGVtZW50cyhzb3J0RWxlbWVudCwgYWxsU3RlcHMudG9BcnJheSgpKTsKLQkJCQlyZXR1cm4gcmV0dXJuTGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJc3RlcHNWaWV3ZXJMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICEoKEN1c3RvbUNhdGVnb3J5KSBjb250ZW50RWxlbWVudCkKLQkJCQkJCS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuY29udGFpbnMoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0KLQkJc3RlcHNUYWJsZVZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEgJiYKLQkJCQkJCQkJCUNhdGVnb3J5U29ydEhlbHBlci5pc01hbnVhbENhdGVnb3J5U29ydChzb3J0RWxlbWVudCkpIHsKLQkJCQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0gZWxzZQotCQkJCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkKLQkJCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSAmJgotCQkJCQkJCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KHNvcnRFbGVtZW50KSkgewotCQkJCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQl9IGVsc2UKLQkJCQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9KTsKLQotCQljdHJsX3VwLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCi0JCQkJQXJyYXlMaXN0IG1vdmVVcEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVVcEl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCQkJTW92ZUluQ2F0ZWdvcnlDb21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5DYXRlZ29yeUNvbW1hbmQoCi0JCQkJCQkoQ3VzdG9tQ2F0ZWdvcnkpIGNvbnRlbnRFbGVtZW50LCBtb3ZlVXBJdGVtcywgYWxsU3RlcHMsCi0JCQkJCQlmZWF0dXJlLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCwgMSk7Ci0JCQkJYWN0aW9uTWFuYWdlci5leGVjdXRlKGNtZCk7Ci0JCQkJY29tbWFuZHMuYWRkKGNtZCk7Ci0KLQkJCQlyZWZyZXNoVmlld2VycygpOwotCi0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmCi0JCQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoc29ydEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSAmJgotCQkJCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KHNvcnRFbGVtZW50KSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2Rvd24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJQXJyYXlMaXN0IG1vdmVEb3duSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW92ZURvd25JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCQkJCU1vdmVJbkNhdGVnb3J5Q29tbWFuZCBjbWQgPSBuZXcgTW92ZUluQ2F0ZWdvcnlDb21tYW5kKAotCQkJCQkJKEN1c3RvbUNhdGVnb3J5KSBjb250ZW50RWxlbWVudCwgbW92ZURvd25JdGVtcywgYWxsU3RlcHMsCi0JCQkJCQlmZWF0dXJlLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCwJMCk7Ci0JCQkJYWN0aW9uTWFuYWdlci5leGVjdXRlKGNtZCk7Ci0JCQkJY29tbWFuZHMuYWRkKGNtZCk7Ci0KLQkJCQlyZWZyZXNoVmlld2VycygpOwotCi0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmCi0JCQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoc29ydEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSAmJgotCQkJCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KHNvcnRFbGVtZW50KSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQkJCi0JCXZpZXdlcl9zb3J0LmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc29ydAotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCVN0cmluZyBzb3J0VHlwZSA9IChTdHJpbmcpc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldENhdGVnb3J5U29ydFByb3BlcnR5KGNvbnRlbnRFbGVtZW50KTsKLQkJCQkKLQkJCQlpZiAocHJvcCA9PSBudWxsKSB7Ci0JCQkJCXByb3AgPSBDYXRlZ29yeVNvcnRIZWxwZXIuY3JlYXRlTmV3U29ydFByb3BlcnR5KHNvcnRUeXBlKTsKLQkJCQkJYWN0aW9uTWFuYWdlcgotCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSwKLQkJCQkJCQlwcm9wLCAtMSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlhY3Rpb25NYW5hZ2VyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCXByb3AsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCksCi0JCQkJCQkJCXNvcnRUeXBlLCAtMSk7Ci0JCQkJfQotCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCByZWZyZXNoVmlld2VycygpIHsKLQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBpbml0aWFsIGRhdGEgZnJvbSBtb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3RlcHNUYWJsZVZpZXdlci5zZXRJbnB1dChjb250ZW50RWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCWFsbFN0ZXBzLmFwcGx5KCk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JCWlmICghY29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gY29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlPYmplY3QgY21kID0gY29tbWFuZHMuZ2V0KGkpOwotCQkJCWlmIChjbWQgaW5zdGFuY2VvZiBNb3ZlSW5DYXRlZ29yeUNvbW1hbmQpIHsKLQkJCQkJKChNb3ZlSW5DYXRlZ29yeUNvbW1hbmQpIGNtZCkudW5kbygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5jYW5jZWxQcmVzc2VkKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29udHJpYnV0aW9uU2VsZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db250cmlidXRpb25TZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2UyZGUzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db250cmlidXRpb25TZWxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhlIGRpYWxvZyBmb3Igc2VsZWN0aW5nIGVsZW1lbnQgdG8gZGV0ZXRtaW5lIHdoaWNoIGVsZW1lbnQgZWRpdG9yIHRvIG9wZW4gaW4KLSAqIGNhc2Ugb2YgdmFyaWFiaWxpdHkgcmVsYXRpb25zaGlwLiBUaGlzIHdpbGwgb25seSB0YWtlIGVmZmVjdCBpZiB1c2VyCi0gKiBkb3VibGUtY2xpY2tzIGZyb20gY29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJpYnV0aW9uU2VsZWN0aW9uIHsKLQotCXByaXZhdGUgSGFzaFNldCBmaWx0ZXJFbGVtZW50TGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwcml2YXRlIGNsYXNzIENvbnRyaWJ1dGlvbkZpbHRlciBleHRlbmRzIEFsbEZpbHRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlPYmplY3QgY29udGVudEVsZW1lbnQgPSBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iai5lcXVhbHMoaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpICE9IG51bGwpIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucygKLQkJCQkJCQkoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmopKSB7Ci0JCQkJCWlmICgoKEN1c3RvbUNhdGVnb3J5KSBvYmopLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkJCS5pc0VtcHR5KCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikgcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJaWYgKE1ldGhvZEVsZW1lbnRVdGlsLmdldEFsbE1vZGVscyhjb250ZW50RWxlbWVudCkKLQkJCQkJCQkJLmNvbnRhaW5zKG9iaikpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciBpb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBpb3IubmV4dCgpOwotCQkJCQlpZiAoKChDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKSkKLQkJCQkJCWlvci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlyZXR1cm4gYW55Q2F0ZWdvcml6ZWRFbGVtZW50QWNjZXB0ZWQoKEN1c3RvbUNhdGVnb3J5KSBvYmosCi0JCQkJCQlmaWx0ZXJFbGVtZW50TGlzdCk7Ci0JCQl9Ci0JCQlpZiAoKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KQotCQkJCQkmJiBmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucyhvYmopKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBQcm9jZXNzKXsgCi0JCQkJaWYoZmlsdGVyRWxlbWVudExpc3QuY29udGFpbnMob2JqKSl7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJcmV0dXJuIGNoZWNrUHJvY2Vzc1BrZyhvYmopOwotCQkJfQotCQkJaWYob2JqIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCXJldHVybiBjaGVja1Byb2Nlc3NFbGVtZW50cyhvYmopOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBjaGVja1Byb2Nlc3NQa2coT2JqZWN0IG9iail7Ci0JCQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKXsKLQkJCWlmKGZpbHRlckVsZW1lbnRMaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KXsKLQkJCQlpZihmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucygoKFByb2Nlc3NDb21wb25lbnQpb2JqKS5nZXRQcm9jZXNzKCkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlsaXN0ID0gKChQcm9jZXNzQ29tcG9uZW50KW9iaikuZ2V0UHJvY2VzcygpLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQl9ZWxzZXsKLQkJCQlsaXN0ID0gKChQcm9jZXNzUGFja2FnZSlvYmopLmdldENoaWxkUGFja2FnZXMoKTsKLQkJCX0KLQkJCQotCQl9Ci0JCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLQkJewotCQkJT2JqZWN0IGNoaWxkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KXsKLQkJCQlpZihjaGVja1Byb2Nlc3NQa2coY2hpbGQpKSByZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCl7Ci0JCQkJaWYoZmlsdGVyRWxlbWVudExpc3QuY29udGFpbnMoY2hpbGQpKSByZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIGFueSBwcm9jZXNzIGVsZW1lbnRzCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKiAJCQlCb29sZWFuIHZhbHVlIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoZWNrUHJvY2Vzc0VsZW1lbnRzKE9iamVjdCBvYmopewotCQlMaXN0IGxpc3QgPSAoKFByb2Nlc3Mpb2JqKS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0JCXsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCl7Ci0JCQkJaWYoZmlsdGVyRWxlbWVudExpc3QuY29udGFpbnMoKChCcmVha2Rvd25FbGVtZW50KWNoaWxkKSkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYW55IGNhdGVnb3JpemVkIGVsZW1lbnRzIHRvIGJlIGFjY2VwdGVkLgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gbGlzdAotCSAqIEByZXR1cm4KLQkgKiAJCUJvb2xlYW4gdmFsdWUgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgYW55IGNhdGVnb3JpZXplZCBlbGVtZW50cyB0byBiZSBhY2NlcHRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGFueUNhdGVnb3JpemVkRWxlbWVudEFjY2VwdGVkKEN1c3RvbUNhdGVnb3J5IG9iaiwKLQkJCUhhc2hTZXQgbGlzdCkgewotCQlpZiAobGlzdC5jb250YWlucyhvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0JCUxpc3QgZWxlbWVudHMgPSBvYmouZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWlmIChsaXN0LmNvbnRhaW5zKG9iamVjdCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWFueUNhdGVnb3JpemVkRWxlbWVudEFjY2VwdGVkKChDdXN0b21DYXRlZ29yeSkgb2JqZWN0LCBsaXN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvKioKLQkgKiBEaXNwbGF5IGNvbnRyaWJ1dGlvbiBzZWxlY3Rpb24gZGlhbG9nIHdoaWNoIGxpc3RzIGVsZW1lbnRzIGFuZCBpdCdzCi0JICogY29udHJpYnV0b3JzLgotCSAqLwotCXB1YmxpYyBDb250cmlidXRpb25TZWxlY3Rpb24oKSB7Ci0JfQotCi0JLyoqCi0JICogSXQgc2hvd3MgZGlhbG9nIGJveCBmb3IgYWxsIHRoZSBjb250cmlidXRvcnMuIFVzZXIgaXMgZXhwZWN0ZWQgdG8gc2VsZWN0Ci0JICogb25lLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogCQkJRWxlbWVudCBmb3Igd2hpY2ggY29udHJpYnV0b3IgYXJlIHNob3duCi0JICogQHJldHVybgotCSAqIAkJCVNlbGVjdGVkIGNvbnRyaWJ1dG9yCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTZWxlY3RlZENvbnRyaWJ1dG9yKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50KSB7Ci0JCWZpbHRlckVsZW1lbnRMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQkJLy8gR2V0IHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JCS8vIGdldCBsaXN0IG9mIGNvbnRyaWJ1dG9ycwotCQlMaXN0IGNvbnRyaWJ1dG9ycyA9IENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkuZ2V0Q29udHJpYnV0b3JzKGVsZW1lbnQsIGNvbmZpZyk7Ci0JCWlmICgoY29udHJpYnV0b3JzICE9IG51bGwpICYmICghY29udHJpYnV0b3JzLmlzRW1wdHkoKSkpIHsKLQkJCS8vIGNsZWFyIHRoZSBhcnJheQotCQkJTGlzdCBlbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJLy8gYWRkIGVsZW1lbnQgYW5kIGl0J3MgY29udHJpYnV0b3JzCi0JCQllbGVtZW50TGlzdC5hZGQoZWxlbWVudCk7Ci0JCQllbGVtZW50TGlzdC5hZGRBbGwoY29udHJpYnV0b3JzKTsKLQkJCWZpbHRlckVsZW1lbnRMaXN0LmFkZEFsbChlbGVtZW50TGlzdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBlbGVtZW50TGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IGl0b3IubmV4dCgpOwotCQkJCUxpc3QgZ3JvdXBpbmdzID0gbnVsbDsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQkJZ3JvdXBpbmdzID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSkgZSk7Ci0KLQkJCQl9Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQkJCWdyb3VwaW5ncyA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpIGUpOwotCQkJCX0KLQotCQkJCWlmICgoZ3JvdXBpbmdzICE9IG51bGwpICYmICghZ3JvdXBpbmdzLmlzRW1wdHkoKSkpCi0JCQkJCWZpbHRlckVsZW1lbnRMaXN0LmFkZEFsbChncm91cGluZ3MpOwotCi0JCQl9Ci0KLQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IENvbnRyaWJ1dGlvbkZpbHRlcigpOwotCQkJLy8gSXRlbXNGaWx0ZXJEaWFsb2cgZGxnID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCS8vIC5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJLy8gZmlsdGVyLCBudWxsLCBGaWx0ZXJDb25zdGFudHMuQ09ORklHX0NPTlRFTlRfRUxFTUVOVCk7Ci0JCQkvLyBkbGcuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1tdIHsgRmlsdGVyQ29uc3RhbnRzLkNPTkZJR19DT05URU5UX0VMRU1FTlQgfTsKLQkJCUNvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZyBkbGcgPSBuZXcgQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nKAotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJZGxnLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJZGxnLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5DT05GSUdfQ09OVEVOVF9FTEVNRU5UKTsKLQkJCWRsZy5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQlkbGcuc2V0VHlwZXMoc3RyKTsKLQkJCWRsZy5zZXRJbnB1dChVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGVsZW1lbnQpKTsKLQkJCWRsZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpKSwKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQotCQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZUZvcm1hdAotCQkJCQkuZm9ybWF0KAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQluZXcgU3RyaW5nW10geyBlbGVtZW50LmdldE5hbWUoKSB9KTsKLQotCQkJZGxnLnNldFRpdGxlKHRpdGxlKTsKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5vcGVuKCk7Ci0KLQkJCUxpc3QgcmVzdWx0ID0gZGxnLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJCWlmICgocmVzdWx0ID09IG51bGwpIHx8IChyZXN1bHQuaXNFbXB0eSgpKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gcmVzdWx0LmdldCgwKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0RpYWxvZ0hlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRGlhbG9nSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjYmUyMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRGlhbG9nSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NBY3Rpdml0eUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1JvbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlZhcmlhYmlsaXR5UHJvY2Vzc1Rhc2tGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBjb2xsZWN0IGlucHV0IGRhdGEgZnJvbSB1c2VycyB1c2luZyBkaWFsb2cgYm94ZXMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFsb2dIZWxwZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBzZWxlY3RFbGVtZW50c0ZvcihCcmVha2Rvd25FbGVtZW50IGUsIElGaWx0ZXIgZmlsdGVyLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyB0YWJOYW1lKSB7Ci0JCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgZmlsdGVyLCB0YWJOYW1lLCBudWxsLAotCQkJCWNvbmZpZyk7Ci0JCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUoZmFsc2UpOwotCQlmZC5zZXRUaXRsZSh0YWJOYW1lKTsKLQkJZmQub3BlbigpOwotCQlyZXR1cm4gZmQuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBzZWxlY3RUYXNrc0ZvcihBY3Rpdml0eSBhY3QsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCVN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLlRBU0tTOwotCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBWYXJpYWJpbGl0eVByb2Nlc3NUYXNrRmlsdGVyKGNvbmZpZywgbnVsbCwKLQkJCQlGaWx0ZXJDb25zdGFudHMuVEFTS1MsIGFjdCk7Ci0KLQkJcmV0dXJuIHNlbGVjdEVsZW1lbnRzRm9yKGFjdCwgZmlsdGVyLCBjb25maWcsIHRhYk5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBzZWxlY3RFbGVtZW50c0ZvcihPYmplY3Qgb2JqZWN0LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJcmV0dXJuIHNlbGVjdFRhc2tzRm9yKChBY3Rpdml0eSkgb2JqZWN0LCBjb25maWcpOwotCQkJfSBlbHNlIGlmIChhZGFwdGVyRmFjdG9yeSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJCVN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLlJPTEVTOwotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXIoY29uZmlnLCBudWxsLAotCQkJCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVTLCAoQWN0aXZpdHkpIG9iamVjdCk7Ci0JCQkJcmV0dXJuIHNlbGVjdEVsZW1lbnRzRm9yKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QsIGZpbHRlciwKLQkJCQkJCWNvbmZpZywgdGFiTmFtZSk7Ci0JCQl9IGVsc2UgaWYgKGFkYXB0ZXJGYWN0b3J5ID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyKAotCQkJCQkJY29uZmlnLCBudWxsLCBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTLAotCQkJCQkJKEFjdGl2aXR5KSBvYmplY3QpOwotCQkJCXJldHVybiBzZWxlY3RFbGVtZW50c0ZvcigoQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0LCBmaWx0ZXIsCi0JCQkJCQljb25maWcsIHRhYk5hbWUpOwotCQkJfQotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuUk9MRVM7Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc1JvbGVGaWx0ZXIoY29uZmlnLCBudWxsLAotCQkJCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJCQlyZXR1cm4gc2VsZWN0RWxlbWVudHNGb3IoKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdCwgZmlsdGVyLAotCQkJCQkJY29uZmlnLCB0YWJOYW1lKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBzZWxlY3RBY3Rpdml0aWVzRm9yKEFjdGl2aXR5IGFjdCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBpbnQgY29tbWFuZCkgewotCQkvLyByZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTOwotCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzQWN0aXZpdHlGaWx0ZXIoY29uZmlnLCBudWxsLAotCQkJCUZpbHRlckNvbnN0YW50cy5QUk9DRVNTRVMsIGFjdCwgY29tbWFuZCk7Ci0JCUxpc3Qgc2VsZWN0aW9uID0gc2VsZWN0RWxlbWVudHNGb3IoYWN0LCBmaWx0ZXIsIGNvbmZpZywgdGFiTmFtZSk7Ci0JCUFycmF5TGlzdCBhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWFjdGl2aXRpZXMuYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQkJYWN0aXZpdGllcy5hZGQocHJvYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Rpdml0aWVzOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0ZpbHRlclNvcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRmlsdGVyU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyMjEzZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRmlsdGVyU29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29udGVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotCi0KLQotLyoqCi0gKiBBIHtAbGluayBJdGVtc0ZpbHRlckRpYWxvZ30gZGlhbG9nIHZpZXdlciBzb3J0ZXIgdG8gb3JkZXIgdGhlIGRpc3BsYXkgZm9yIGNlcnRhaW4gZWxlbWVudCBhbmQgcGFja2FnZXMuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQotCXB1YmxpYyBGaWx0ZXJTb3J0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGludCBjYXRlZ29yeShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UKLQkJCXJldHVybiAxOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb2xsYXRvcgotCSAqLwotCXB1YmxpYyBGaWx0ZXJTb3J0ZXIoQ29sbGF0b3IgY29sbGF0b3IpIHsKLQkJc3VwZXIoY29sbGF0b3IpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yI2NvbXBhcmUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0KLQkJaWYgKCEoZTEgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgfHwgIShlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJaW50IGNhdDEgPSBjYXRlZ29yeShlMSk7Ci0JCQlpbnQgY2F0MiA9IGNhdGVnb3J5KGUyKTsKLQotCQkJaWYgKGNhdDEgIT0gY2F0MikKLQkJCQlyZXR1cm4gY2F0MSAtIGNhdDI7Ci0JCX0KLQotCQlpZiAoZTEgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gJiYgZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJU3RyaW5nIG5hbWUxOwotCQlTdHJpbmcgbmFtZTI7Ci0KLQkJaWYgKHZpZXdlciA9PSBudWxsIHx8ICEodmlld2VyIGluc3RhbmNlb2YgQ29udGVudFZpZXdlcikpIHsKLQkJCW5hbWUxID0gZTEudG9TdHJpbmcoKTsKLQkJCW5hbWUyID0gZTIudG9TdHJpbmcoKTsKLQkJfSBlbHNlIHsKLQkJCUlCYXNlTGFiZWxQcm92aWRlciBwcm92ID0gKChDb250ZW50Vmlld2VyKSB2aWV3ZXIpCi0JCQkJCS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQlpZiAocHJvdiBpbnN0YW5jZW9mIElMYWJlbFByb3ZpZGVyKSB7Ci0JCQkJSUxhYmVsUHJvdmlkZXIgbHByb3YgPSAoSUxhYmVsUHJvdmlkZXIpIHByb3Y7Ci0JCQkJbmFtZTEgPSBscHJvdi5nZXRUZXh0KGUxKTsKLQkJCQluYW1lMiA9IGxwcm92LmdldFRleHQoZTIpOwotCQkJfSBlbHNlIHsKLQkJCQluYW1lMSA9IGUxLnRvU3RyaW5nKCk7Ci0JCQkJbmFtZTIgPSBlMi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCWlmIChuYW1lMSA9PSBudWxsKQotCQkJbmFtZTEgPSAiIjsvLyROT04tTkxTLTEkCi0JCWlmIChuYW1lMiA9PSBudWxsKQotCQkJbmFtZTIgPSAiIjsvLyROT04tTkxTLTEkCi0JCXJldHVybiBjb2xsYXRvci5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3Ijc29ydChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNvcnQoZmluYWwgVmlld2VyIHZpZXdlciwgT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJQXJyYXlzLnNvcnQoZWxlbWVudHMsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJCXJldHVybiBGaWx0ZXJTb3J0ZXIudGhpcy5jb21wYXJlKHZpZXdlciwgYSwgYik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRmlsdGVyU29ydGVyRm9yQWxsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9GaWx0ZXJTb3J0ZXJGb3JBbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTRhMmE2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9GaWx0ZXJTb3J0ZXJGb3JBbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5BbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29udGVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotCi0KLS8qKgotICogQSBGaWx0ZXIgc29ydGVyIGZvciB7QGxpbmsgSXRlbXNGaWx0ZXJEaWFsb2d9IHVzaW5nIHtAbGluayBBbGxGaWx0ZXJ9Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlclNvcnRlckZvckFsbCBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0KLQlwdWJsaWMgRmlsdGVyU29ydGVyRm9yQWxsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb2xsYXRvcgotCSAqLwotCXB1YmxpYyBGaWx0ZXJTb3J0ZXJGb3JBbGwoQ29sbGF0b3IgY29sbGF0b3IpIHsKLQkJc3VwZXIoY29sbGF0b3IpOwotCX0KLQotCXB1YmxpYyBpbnQgY2F0ZWdvcnkoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCXJldHVybiAwOwotCQllbHNlCi0JCQlyZXR1cm4gMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQotCQlpZiAoIShlMSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB8fCAhKGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKSB7Ci0JCQlpbnQgY2F0MSA9IGNhdGVnb3J5KGUxKTsKLQkJCWludCBjYXQyID0gY2F0ZWdvcnkoZTIpOwotCi0JCQlpZiAoY2F0MSAhPSBjYXQyKQotCQkJCXJldHVybiBjYXQxIC0gY2F0MjsKLQkJfQotCi0JCWlmIChlMSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiAmJiBlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKCEoZTEgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgfHwgIShlMiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlTdHJpbmcgbmFtZTE7Ci0JCVN0cmluZyBuYW1lMjsKLQotCQlpZiAodmlld2VyID09IG51bGwgfHwgISh2aWV3ZXIgaW5zdGFuY2VvZiBDb250ZW50Vmlld2VyKSkgewotCQkJbmFtZTEgPSBlMS50b1N0cmluZygpOwotCQkJbmFtZTIgPSBlMi50b1N0cmluZygpOwotCQl9IGVsc2UgewotCQkJSUJhc2VMYWJlbFByb3ZpZGVyIHByb3YgPSAoKENvbnRlbnRWaWV3ZXIpIHZpZXdlcikKLQkJCQkJLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCWlmIChwcm92IGluc3RhbmNlb2YgSUxhYmVsUHJvdmlkZXIpIHsKLQkJCQlJTGFiZWxQcm92aWRlciBscHJvdiA9IChJTGFiZWxQcm92aWRlcikgcHJvdjsKLQkJCQluYW1lMSA9IGxwcm92LmdldFRleHQoZTEpOwotCQkJCW5hbWUyID0gbHByb3YuZ2V0VGV4dChlMik7Ci0JCQl9IGVsc2UgewotCQkJCW5hbWUxID0gZTEudG9TdHJpbmcoKTsKLQkJCQluYW1lMiA9IGUyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5hbWUxID09IG51bGwpCi0JCQluYW1lMSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJaWYgKG5hbWUyID09IG51bGwpCi0JCQluYW1lMiA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUobmFtZTEsIG5hbWUyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzb3J0KGZpbmFsIFZpZXdlciB2aWV3ZXIsIE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCUFycmF5cy5zb3J0KGVsZW1lbnRzLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCQlyZXR1cm4gRmlsdGVyU29ydGVyRm9yQWxsLnRoaXMuY29tcGFyZSh2aWV3ZXIsIGEsIGIpOwotCQkJfQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9JbnB1dFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0lucHV0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOGNjY2JlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0lucHV0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi0vKioKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBJbnB1dFR5cGUgewotCQotCXB1YmxpYyBzdGF0aWMgaW50IFRFWFQgPSAwOwotCXB1YmxpYyBzdGF0aWMgaW50IENPTUJPID0gMTsKLQlwdWJsaWMgc3RhdGljIGludCBMSVNUID0gMjsKLQlwdWJsaWMgc3RhdGljIGludCBUUkVFID0gMzsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0l0ZW1zRmlsdGVyRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9JdGVtc0ZpbHRlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNTNkYWQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0l0ZW1zRmlsdGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5BdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSVByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLmludGVybmFsLmNvcmUudGV4dC5QYXR0ZXJuQ29uc3RydWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLQotLyoqCi0gKiBGaWx0ZXIgRGlhbG9nIC0gYWxsb3cgdGhlIHVzZXIgdG8gZmlsdGVyIHRoZSBjb250ZW50IGVsZW1lbnQsIGNvbnRlbnQKLSAqIGNhdGVnb3JpZXMsIGN1c3RvbSBjYXRlZ29yaWVzLCBBbGwgdHlwZXMgb2YgY29udGVudGVsZW1lbnRzIGJhc2VkIG9uIGxvY2F0aW9uIG9mIHRoZSB1c2Ugb2YgdGhlIGZpbHRlcgotICogZGlhbG9nLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1zRmlsdGVyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSURvdWJsZUNsaWNrTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbiwgY2FuY2VsQnV0dG9uOwotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9wYXR0ZXJuLCBjdHJsX2JyaWVmX2Rlc2M7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXR0ZXJuLCBmaWx0ZXJUeXBlU3RyOwotCi0JcHJvdGVjdGVkIENvbWJvIGZpbHRlclR5cGU7Ci0KLQlwcml2YXRlIFN0cmluZyBkaWFsb2dUaXRsZSwgdGFiU3RyOwotCi0JcHJpdmF0ZSBPYmplY3QgY29udGVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBzZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmlld2VyU2VsZWN0aW9uU2luZ2xlID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgdmlld2VyTGFiZWwgPSBudWxsOwotCQotCS8qCi0JICogVHJlZXZpZXdlciBmb3IgQ29udGVudEVsZW1lbnRzIHRvIGRpc3BsYXkuCi0JICovCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkvLyByZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwgIiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBtZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgPSAoTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKVRuZ1V0aWwuZ2V0QWRhcHRlcigoTWV0aG9kUGx1Z2luKW9iamVjdCwgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAobWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5nZXRGdWxsTmFtZShvYmplY3QpOwotCQkJCX0KLQkJCX0gCi0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci0KLQkvKgotCSAqIERpYWxvZyBBdHRyaWJ1dGVzCi0JICovCi0JLy8gcHJpdmF0ZSBib29sZWFuIGFueUNoaWxkcyA9IHRydWU7Ci0JcHJpdmF0ZSBMaXN0IGFscmVhZHlTZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JUGF0dGVybiByZWdleFBhdHRlcm47Ci0KLQkvLyBwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQlwcm90ZWN0ZWQgRmlsdGVySGVscGVyIGhlbHBlcjsKLQotCXByaXZhdGUgU3RyaW5nIFNUT1JFX0VYUEFOREVEX0xFVkVMX0lEID0gIi5MRVZFTF9JRCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBQQVRURVJOX0lEID0gIi5QYXR0ZXJuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIFRZUEVfSUQgPSAiLlR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBESUFMT0dfTkFNRTsKLQotCXByaXZhdGUgQnV0dG9uIGV4cGFuZEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGNvbGxhcHNlQnV0dG9uOwotCi0JcHJpdmF0ZSBPYmplY3QgaW5wdXQ7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIHR5cGVzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBGaWx0ZXJEaWFsb2cuIFRoaXMgY29uc3RydWN0b3Igd2lsbCB1c2UgZmlsdGVyIGJhc2VkIG9uCi0JICogdGFiU3RyLCBmaWx0ZXJzIG91dCB0aGUgbGlzdCBvZiBlbGVtZW50cyBiYXNlZCBvbiBhbHJlYWR5IGV4aXN0aW5nCi0JICogc2VsZWN0ZWQgZWxlbWVudCBpbiB0aGUgc2VsZWN0ZWQgdGFibGUuIEluaXRpYWxpemVzIHRoZSBDb250ZW50UHJvdmlkZXIKLQkgKiBmb3IgdGhlIHRyZWV2aWV3ZXIuCi0JICogCi0JICovCi0JcHVibGljIEl0ZW1zRmlsdGVyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3QgY29udGVudEVsZW1lbnQsCi0JCQlTdHJpbmcgdGFiU3RyLCBMaXN0IGFscmVhZHlFeGlzdHMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCQl0aGlzLmZpbHRlciA9IG51bGw7Ci0JCXRoaXMuYWxyZWFkeVNlbGVjdGVkTGlzdCA9IGFscmVhZHlFeGlzdHM7Ci0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwKLQkJCQl0aGlzLmFscmVhZHlTZWxlY3RlZExpc3QpOwotCQlpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0JfQotCi0JcHVibGljIEl0ZW1zRmlsdGVyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJRmlsdGVyIGZpbHRlciwgU3RyaW5nIHRhYlN0ciwKLQkJCUxpc3QgYWxyZWFkeUV4aXN0cywgT2JqZWN0IGlucHV0KSB7Ci0JCXRoaXMocGFyZW50U2hlbGwsIGZpbHRlciwgbnVsbCwgdGFiU3RyLCBhbHJlYWR5RXhpc3RzKTsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyRGlhbG9nLiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgdXNlIHBhc3NlZCBmaWx0ZXIuCi0JICogdGFiU3RyIGlzIHVzZWQgZm9yIHRoZSBzZWFyY2h0eXBlIG9ubHkuIEluaXRpYWxpemVzIHRoZSBDb250ZW50UHJvdmlkZXIKLQkgKiBmb3IgdGhlIHRyZWV2aWV3ZXIuCi0JICogCi0JICovCi0JcHVibGljIEl0ZW1zRmlsdGVyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJRmlsdGVyIGZpbHRlciwKLQkJCU9iamVjdCBjb250ZW50RWxlbWVudCwgU3RyaW5nIHRhYlN0cikgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQotCQloZWxwZXIgPSBuZXcgRmlsdGVySGVscGVyKGNvbnRlbnRFbGVtZW50LCB0YWJTdHIsIG51bGwsIG51bGwsIG51bGwpOwotCQlpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBGaWx0ZXJEaWFsb2cuIFRoaXMgY29uc3RydWN0b3Igd2lsbCB1c2UgcGFzc2VkIGZpbHRlci4KLQkgKiB0YWJTdHIgaXMgdXNlZCBmb3IgdGhlIHNlYXJjaHR5cGUgb25seS4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlcgotCSAqIGZvciB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLAotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50LCBTdHJpbmcgdGFiU3RyLCBMaXN0IGFscmVhZHlFeGlzdHMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0JCXRoaXMuYWxyZWFkeVNlbGVjdGVkTGlzdCA9IGFscmVhZHlFeGlzdHM7Ci0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwKLQkJCQlhbHJlYWR5RXhpc3RzKTsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQlpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBGaWx0ZXJEaWFsb2cuIE9ubHkgZm9yIG1ldGhvZGNvbmZpZ3VyYXRpb24uIFRoaXMKLQkgKiBjb25zdHJ1Y3RvciB3aWxsIHVzZSBwYXNzZWQgZmlsdGVyLiBJbml0aWFsaXplcyB0aGUgQ29udGVudFByb3ZpZGVyIGZvcgotCSAqIHRoZSB0cmVldmlld2VyLgotCSAqIAotCSAqLwotCS8vIHB1YmxpYyBJdGVtc0ZpbHRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgT2JqZWN0IGNvbnRlbnRFbGVtZW50LAotCS8vIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlndXJhdGlvbiwgU3RyaW5nIHRhYlN0cikgewotCS8vIHN1cGVyKHBhcmVudFNoZWxsKTsKLQkvLyB0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JLy8gdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0JLy8gdGhpcy5maWx0ZXIgPSBudWxsOwotCS8vIHRoaXMubWV0aG9kQ29uZmlndXJhdGlvbiA9IG1ldGhvZENvbmZpZ3VyYXRpb247Ci0JLy8gaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLCBudWxsKTsKLQkvLyBpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0JLy8gfQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgdmVyeSBnZW5lcmljLCBpbiBvcmRlciB0byBpbml0aWFsaXplIGZpbHRlciwgaW5wdXQKLQkgKiBhbmQgY29udGVudHByb3ZpZGVyIHNob3VsZCBiZSBoYW5kbGVkIGV4cGxpY2l0bHkgYnkgY2FsbGluZyBiZWxvdyBtZXRob2QuCi0JICogc2V0RmlsdGVyKElGaWx0ZXIpIHNldElucHV0KE9iamVjdCkKLQkgKiBzZXRDb250ZW50UHJvdmlkZXIoSVN0cnVjdHVyZWRQcm92aWRlcikKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQloZWxwZXIgPSBuZXcgRmlsdGVySGVscGVyKG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpZiBhIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotCQkJc2F2ZVZhbHVlcygpOwotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQkJaWYoY29tcG9zZWRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IHRoZSBjYW5jZWwgYnV0dG9uIG9mIHRoaXMgZGlhbG9nIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLQkJc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotCQlpZihjb21wb3NlZEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpewotCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGl0bGUgZm9yIGRpYWxvZyBib3ggZWc6IFNlbGVjdCBEaWFsb2cgRm9yIFJvbGUsIGRpYWxvZ1RpdGxlIG5lZWRzIHRvCi0JICogIlJvbGUiCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIGRpYWxvZ1RpdGxlKSB7Ci0JCXRoaXMuZGlhbG9nVGl0bGUgPSBkaWFsb2dUaXRsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlpZiAoZGlhbG9nVGl0bGUgPT0gbnVsbCkKLQkJCWRpYWxvZ1RpdGxlID0gdGFiU3RyOwotCQlzaGVsbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ190aXRsZSArIGRpYWxvZ1RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykgQWRkcyBidXR0b25zIHRvIHRoaXMgZGlhbG9nJ3MgYnV0dG9uIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgYnV0dG9uIGJhciBjb21wb3NpdGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBkaWFsb2cgYXJlYSBhbmQgY29udHJvbHMgYW5kIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdGhlCi0JICogICAgICAgICAgICBwYXJlbnQgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIGRpYWxvZyBhcmVhCi0JICogQHJldHVybiB0aGUgZGlhbG9nIGFyZWEgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJR3JpZERhdGEgZ0QgPSAoR3JpZERhdGEpIGNvbXBvc2l0ZS5nZXRMYXlvdXREYXRhKCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQotCQlMYWJlbCB0eXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXsKLQkJCXR5cGVMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19UeXBlX3RleHQpOyAvLyROT04tTkxTLTEkCi0JCQlHcmlkRGF0YSBnRDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCXR5cGVMYWJlbC5zZXRMYXlvdXREYXRhKGdEMSk7Ci0KLQkJfQotCQlmaWx0ZXJUeXBlID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQl7Ci0JCQlHcmlkRGF0YSBnRDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdEMS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlnRDEud2lkdGhIaW50ID0gMzkwOwotCQkJZmlsdGVyVHlwZS5zZXRMYXlvdXREYXRhKGdEMSk7Ci0JCX0KLQotCQlpZiAodHlwZXMgPT0gbnVsbCkgewotCQkJZmlsbEZpbHRlclR5cGVDb21ibygpOwotCQl9IGVsc2UgewotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyh0eXBlcyk7Ci0JCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCQlmaWx0ZXJUeXBlU3RyID0gZmlsdGVyVHlwZS5nZXRJdGVtKDApOwotCQkJCWhlbHBlci5zZXRGaWx0ZXJUeXBlU3RyKGZpbHRlclR5cGUuZ2V0SXRlbSgwKSk7Ci0JCQkJaWYgKHRhYlN0ciA9PSBudWxsKSB7Ci0JCQkJCXRhYlN0ciA9IGZpbHRlclR5cGVTdHI7Ci0JCQkJCWhlbHBlci5zZXRUYWJTdHIodGFiU3RyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmlsdGVyVHlwZS5zZWxlY3QoMCk7Ci0KLQkJTGFiZWwgY3RybF9wYXR0ZXJuTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXsKLQkJCWN0cmxfcGF0dGVybkxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJCWdELmhvcml6b250YWxTcGFuID0gMzsKLQkJCWN0cmxfcGF0dGVybkxhYmVsLnNldExheW91dERhdGEoZ0QpOwotCQl9Ci0KLQkJY3RybF9wYXR0ZXJuID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ0QxID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnRDEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJY3RybF9wYXR0ZXJuLnNldExheW91dERhdGEoZ0QxKTsKLQkJCWN0cmxfcGF0dGVybi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCQluZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQgKyAgCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb24pKTsKLQkJfQotCQlMYWJlbCBjdHJsX3BhdHRlcm5MYWJlbDEgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXsKLQkJCWN0cmxfcGF0dGVybkxhYmVsMS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF9wYXR0ZXJuTGFiZWwxLnNldExheW91dERhdGEoZ0QpOwotCQl9Ci0JCQotCQlDb21wb3NpdGUgYnV0dG9uc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7CQkKLQkJCi0JCUdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQlnZDIuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlidXR0b25zQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QyKTsKLQkJR3JpZExheW91dCBidXR0b25zTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJYnV0dG9uc0xheW91dC5udW1Db2x1bW5zID0gMjsKLQkJYnV0dG9uc0xheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbnNMYXlvdXQpOwotCQkKLQkJZXhwYW5kQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcG9zaXRlLCBTV1QuQlVUVE9OMSk7Ci0KLQkJZXhwYW5kQnV0dG9uLnNldEltYWdlKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiZXhwYW5kYWxsLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlleHBhbmRCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0V4cGFuZEFsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWV4cGFuZEJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsKSk7CQkKLQotCQlnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0KLQkJZXhwYW5kQnV0dG9uLnNldExheW91dERhdGEoZ2QyKTsKLQotCQljb2xsYXBzZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQljb2xsYXBzZUJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImNvbGxhcHNlYWxsLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNvbGxhcHNlQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbCk7IC8vJE5PTi1OTFMtMSQKLQkJY29sbGFwc2VCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbCkpOwotCQkKLQkJZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQotCQljb2xsYXBzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkMik7Ci0JCQotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZSwgMyk7Ci0JCWNyZWF0ZVZpZXdlckxhYmVsKGNvbXBvc2l0ZSk7Ci0JCS8vIGNyZWF0ZSBhIHRyZWV2aWV3ZXIgYXJlYS4KLQkJY3JlYXRlVmlld2VyKGNvbXBvc2l0ZSk7Ci0KLQkJcmVzdG9yZUxhc3RTZXR0aW5ncygpOwotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmX2Rlc2MgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlJFQURfT05MWSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlnZC5oZWlnaHRIaW50ID0gNjA7Ci0JCQljdHJsX2JyaWVmX2Rlc2Muc2V0TGF5b3V0RGF0YShnZCk7Ci0JCX0KLQkJLy8gUmVzdG9yZSB0aGUgbGFzdCBzdGF0ZQotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZSwgMyk7Ci0KLQkJLy8gUmV0dXJuIHJlc3VsdHMuCi0JCWFkZExpc3RlbmVyKCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHZpZXdlciBpbiB0aGUgcGFyZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKHZpZXdlclNlbGVjdGlvblNpbmdsZSkgewotCQkJdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl9IGVsc2UgewotCQkJdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMCi0JCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCX0KLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl0cmVlVmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0KLQkJLy8gU2V0IHRoZSBpbnB1dCB0byB0cmVlVmlld2VyCi0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoZ2V0SW5wdXQoKSk7Ci0KLQkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCXRyZWVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQlpZiAodGFiU3RyLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUykpIHsgLy8kTk9OLU5MUy0xJAotCQkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IEZpbHRlclNvcnRlckZvckFsbCgpKTsKLQkJfSBlbHNlIHsKLQkJCXRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBGaWx0ZXJTb3J0ZXIoKSk7Ci0JCX0KLQotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXsKLQkJCXNwZWMud2lkdGhIaW50ID0gMzAwOwotCQkJc3BlYy5oZWlnaHRIaW50ID0gMzAwOwotCQkJc3BlYy5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpbnB1dCBpZiBleHRlcm5hbGx5IHNldCBieSBzZXRJbnB1dCBpbnZva2VyLgotCSAqIEVsc2UsIGNhbGN1bGF0ZXMgdGhlIGlucHV0IGJhc2VkIG9uIHRoZSBPYmplY3Qgc2V0IHRvIHRoZSBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0SW5wdXQoKXsKLQkJaWYoaW5wdXQgIT0gbnVsbCl7Ci0JCQlyZXR1cm4gaW5wdXQ7Ci0JCX1lbHNlewotCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJCQlQcm9jZXNzIHByb2Nlc3MgPSAoUHJvY2Vzcyljb250ZW50RWxlbWVudDsKLQkJCQkJCWlmIChwcm9jZXNzLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQlpZiAoISh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSkKLQkJCQkJCQkJCXx8IHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPQURNQVApIAotCQkJCQkJCQkJfHwgdGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMpKSkgewotCQkJCQkJCXJldHVybiBwcm9jZXNzLmVDb250YWluZXIoKTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCXJldHVybiBwcm9jZXNzOwotCQkJCQkJfQotCQkJCX0gCi0JCQkJcmV0dXJuIFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgY29udGVudEVsZW1lbnQpOwotCQkJfSAKLQkJCXJldHVybiBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG5jb2wpIHsKLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5jb2w7Ci0JCWxpbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZpZXdlckxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgIAkJaWYgKHZpZXdlckxhYmVsICE9IG51bGwpIHsKLSAgIAkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dCh2aWV3ZXJMYWJlbCk7Ci0gICAJCX0KLSAgIAl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKGJvb2xlYW4gc2luZ2xlKSB7Ci0JCXZpZXdlclNlbGVjdGlvblNpbmdsZSA9IHNpbmdsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXIjZG91YmxlQ2xpY2sob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJZWxlbWVudCA9IExpYnJhcnlVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcwotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCXNlbGVjdGVkTGlzdC5hZGQoZWxlbWVudCk7Ci0JCX0gCi0JCXNhdmVMYXN0U2V0dGluZ3MoKTsKLQkJY2xvc2UoKTsKLQkJaWYoY29tcG9zZWRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkaWFsb2cgc3RvcmUgdG8gY2FjaGUgdmFsdWVzIGludG8KLQkgKi8KLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCQlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncyA9IChEaWFsb2dTZXR0aW5ncykgQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSAoRGlhbG9nU2V0dGluZ3MpIGRpYWxvZ1NldHRpbmdzCi0JCQkJLmdldFNlY3Rpb24oRElBTE9HX05BTUUgKyBTVE9SRV9FWFBBTkRFRF9MRVZFTF9JRCk7Ci0JCWlmIChzZWN0aW9uID09IG51bGwpCi0JCQlzZWN0aW9uID0gKERpYWxvZ1NldHRpbmdzKSBkaWFsb2dTZXR0aW5ncy5hZGROZXdTZWN0aW9uKERJQUxPR19OQU1FCi0JCQkJCSsgU1RPUkVfRVhQQU5ERURfTEVWRUxfSUQpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhlIGRpYWxvZyBzZXR0aW5ncyB0byByZXN0b3JlIHdpZGdldCB2YWx1ZXMgdG8gdGhlIHZhbHVlcyB0aGF0IHRoZXkKLQkgKiBoZWxkIGxhc3QgdGltZSB0aGlzIGRpYWxvZyB3YXMgdXNlZCB0byBjb21wbGV0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVMYXN0U2V0dGluZ3MoKSB7Ci0JCURJQUxPR19OQU1FID0gdGFiU3RyOwotCQlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncyA9IChEaWFsb2dTZXR0aW5ncykgZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJU3RyaW5nIHRlbXAgPSBkaWFsb2dTZXR0aW5ncy5nZXQoRElBTE9HX05BTUUgKyBQQVRURVJOX0lEKTsgCi0JCWlmICh0ZW1wICE9IG51bGwgJiYgdGVtcC5sZW5ndGgoKSA+IDApIHsgCi0JCQlwYXR0ZXJuID0gZGlhbG9nU2V0dGluZ3MuZ2V0KERJQUxPR19OQU1FICsgUEFUVEVSTl9JRCk7IAotCQkJZmlsdGVyVHlwZVN0ciA9IGRpYWxvZ1NldHRpbmdzLmdldChESUFMT0dfTkFNRSArIFRZUEVfSUQpOyAKLQkJCWZpbHRlclR5cGUuc2V0VGV4dChmaWx0ZXJUeXBlU3RyKTsKLQkJCXJlZ2V4UGF0dGVybiA9IGdldFJlZ0V4KHBhdHRlcm4pOwotCQkJCi0JCQkvL1RyaW0gIioiIGZyb20gcGF0dGVybiBzdHJpbmcgYmVmb3JlIGRpc3BsYXkuIFRoaXMgYWN0aW9uIGlzIGp1c3QgZm9yIGRpc3BsYXkuCi0vLwkJCWlmKHBhdHRlcm4gIT0gbnVsbCl7Ci0vLwkJCQlpZihwYXR0ZXJuLmxhc3RJbmRleE9mKEZpbHRlckNvbnN0YW50cy5BTllfU1RSSU5HKSAKLS8vCQkJCQkJPT0gcGF0dGVybi5sZW5ndGgoKS0xKXsKLS8vCQkJCQlwYXR0ZXJuID0gcGF0dGVybi5zdWJzdHJpbmcoMCwgcGF0dGVybi5sZW5ndGgoKS0xKTsKLS8vCQkJCX0KLS8vCQkJfQotCQkJY3RybF9wYXR0ZXJuLnNldFRleHQocGF0dGVybik7Ci0JCQkKLQkJCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJCWhlbHBlci5zZXRQYXR0ZXJuKHBhdHRlcm4pOwotCQkJCWhlbHBlci5zZXRSZWdleFBhdHRlcm4ocmVnZXhQYXR0ZXJuKTsKLQkJCQloZWxwZXIuc2V0RmlsdGVyVHlwZVN0cihmaWx0ZXJUeXBlU3RyKTsKLQkJCX0KLQkJCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQotCQl9Ci0JCUxpc3QgZWxlbWVudHMgPSAoTGlzdCkgRmlsdGVyQ29uc3RhbnRzLmhhc2hNYXAuZ2V0KERJQUxPR19OQU1FCi0JCQkJKyBTVE9SRV9FWFBBTkRFRF9MRVZFTF9JRCk7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChlbGVtZW50cyAhPSBudWxsICYmICFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZEVsZW1lbnRzKGVsZW1lbnRzLnRvQXJyYXkoKSk7Ci0JCQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHRyYXZlcnNlVHJlZShUcmVlSXRlbVtdIGl0ZW1zLCBMaXN0IGxpc3QpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJVHJlZUl0ZW1bXSBpdGVtc3ggPSBpdGVtc1tpXS5nZXRJdGVtcygpOwotCQkJaWYgKGl0ZW1zeC5sZW5ndGggPiAxKSB7Ci0JCQkJbGlzdC5hZGQoaXRlbXNbaV0uZ2V0RGF0YSgpKTsKLQkJCQl0cmF2ZXJzZVRyZWUoaXRlbXN4LCBsaXN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGlzdC5hZGQoaXRlbXNbaV0uZ2V0RGF0YSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbmNlIE9LIHdhcyBwcmVzc2VkLCB3cml0ZSB3aWRnZXQgdmFsdWVzIHRvIHRoZSBkaWFsb2cgc3RvcmUgc28gdGhhdAotCSAqIHRoZXkgd2lsbCBwZXJzaXN0IGludG8gdGhlIG5leHQgaW52b2NhdGlvbiBvZiB0aGlzIGRpYWxvZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVWYWx1ZXMoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdHJlZVZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQlPYmplY3RbXSBvYmplY3RBcnIgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RBcnIubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gTGlicmFyeVV0aWwudW53cmFwKG9iamVjdEFycltpXSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50IAotCQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgUHJvY2VzcyAKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCXNlbGVjdGVkTGlzdC5hZGQob2JqKTsKLQkJCQl9IAotCQkJfQotCQl9Ci0JCXNhdmVMYXN0U2V0dGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgbGFzdCBzZXR0aW5ncyBvZiBkaWFsb2cuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUxhc3RTZXR0aW5ncygpIHsKLQotCQkvLyBlY2xpcHNlIGRvY3MgZm9ySURpYWxvZ1NldHRpbmdzIGZvciB1bmRlcnN0YW5kaW5nLgotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlESUFMT0dfTkFNRSA9IHRhYlN0cjsKLQkJT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOwotCQlMaXN0IGV4cGFuZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIFN0cmluZ1tdIGV4cGFuZGVkQ2F0ZWdvcnlJZHMgPSBuZXcgU3RyaW5nW2V4cGFuZGVkRWxlbWVudHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBhbmRlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gZXhwYW5kZWRFbGVtZW50c1tpXTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLQkJCQlleHBhbmRMaXN0LmFkZChleHBhbmRlZEVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCQlzZXR0aW5ncy5wdXQoRElBTE9HX05BTUUgKyBQQVRURVJOX0lELCBwYXR0ZXJuKTsKLQkJc2V0dGluZ3MucHV0KERJQUxPR19OQU1FICsgVFlQRV9JRCwgZmlsdGVyVHlwZVN0cik7Ci0JCUZpbHRlckNvbnN0YW50cy5oYXNoTWFwLnB1dChESUFMT0dfTkFNRSArIFNUT1JFX0VYUEFOREVEX0xFVkVMX0lELAotCQkJCWV4cGFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIGV2ZW50IG9iamVjdCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQl1cGRhdGVTZWxlY3Rpb24oZXZlbnQpOwotCQl1cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBidXR0b24gZW5hYmxlbWVudCBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQkvLyBva0J1dHRvbi5zZXRFbmFibGVkKGdldFNlbGVjdGlvbigpLmxlbmd0aCA+IDApOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50T2JqZWN0KE9iamVjdCBjb250ZW50RWxlbWVudCkgewotCQlyZXR1cm4gTWV0aG9kRWxlbWVudFV0aWwuZ2V0TWV0aG9kTW9kZWwoY29udGVudEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgc2VsZWN0aW9uIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWxlY3Rpb24oU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIEFycmF5TGlzdCBkZXNjcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB8fAotCQkJCXNlbGVjdGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcil7Ci0JCQlPYmplY3QgdW53cmFwID0gIFRuZ1V0aWwudW53cmFwKHNlbGVjdGVkKTsKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24odW53cmFwKTsKLQkJfWVsc2UgewotCQkJc2V0QnJpZWZEZXNjcmlwdGlvbihzZWxlY3RlZCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogU2V0IHRoZSBicmllZiBkZXNjcmlwdGlvbiB0byBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEJyaWVmRGVzY3JpcHRpb24oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZmlsbEZpbHRlclR5cGVDb21ibygpIHsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25GaWx0ZXIpIHsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMV07Ci0JCQlzdHJbMF0gPSAoU3RyaW5nKSB0YWJTdHI7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgaWYgKEZpbHRlckNvbnN0YW50cy5jYXRlZ29yeVN0cnMuY29udGFpbnModGFiU3RyKSkgewotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1syXTsKLQkJCXN0clswXSA9IChTdHJpbmcpIHRhYlN0cjsKLQkJCXN0clsxXSA9IEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfSBlbHNlIGlmIChGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVMuZXF1YWxzSWdub3JlQ2FzZSh0YWJTdHIpKSB7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzJdOwotCQkJc3RyWzBdID0gKFN0cmluZykgdGFiU3RyOwotCQkJc3RyWzFdID0gRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlM7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgaWYgKEZpbHRlckNvbnN0YW50cy5icmVha2Rvd25FbGVtZW50cy5jb250YWlucyh0YWJTdHIpKSB7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzFdOwotCQkJc3RyWzBdID0gKFN0cmluZykgdGFiU3RyOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfSBlbHNlIGlmIChGaWx0ZXJDb25zdGFudHMuY29udGVudEVsZW1lbnRTdHJzLmNvbnRhaW5zKHRhYlN0cikpIHsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbM107Ci0JCQlzdHJbMF0gPSB0YWJTdHI7Ci0JCQlzdHJbMV0gPSBGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUzsKLQkJCXN0clsyXSA9IEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfSBlbHNlIGlmIChGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTLmVxdWFscyh0YWJTdHIpKSB7Ci0JCQlTdHJpbmcgc3BhY2UgPSAiLSI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMTRdOwotCQkJaW50IGkgPSAwOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUzsKLQkJCXN0cltpKytdID0gc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUk9MRVM7Ci0JCQlzdHJbaSsrXSA9IHNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRBU0tTOwotCQkJc3RyW2krK10gPSBzcGFjZSArIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JCQlzdHJbaSsrXSA9IHNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5ET01BSU5TOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuVE9PTFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLlBST0NFU1NFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlM7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgaWYgKEZpbHRlckNvbnN0YW50cy5DT05GSUdfQ09OVEVOVF9FTEVNRU5ULmVxdWFscyh0YWJTdHIpKSB7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzFdOwotCQkJc3RyWzBdID0gKFN0cmluZykgdGFiU3RyOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMV07Ci0JCQlzdHJbMF0gPSAoU3RyaW5nKSB0YWJTdHI7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgbG9uZyB0aW1lciA9IDM7Ci0JcHVibGljIGxvbmcgbGFzdHRpbWVyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoKSB7Ci0JCWN0cmxfcGF0dGVybi5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkKLQkJCQkvLyBTZXQgdGltZXIKLQkJCQlsb25nIGN1cnJlbnR0aW1lciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCWlmKGxhc3R0aW1lcit0aW1lciA+IGN1cnJlbnR0aW1lcil7Ci0JCQkJCXJldHVybjsKLQkJCQl9ZWxzZXsKLQkJCQkJbGFzdHRpbWVyICA9IGN1cnJlbnR0aW1lcjsKLQkJCQl9Ci0JCQkJCi0JCQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuY2xlYXJBbGwodHJ1ZSk7Ci0JCQkJaWYgKGN0cmxfcGF0dGVybi5nZXRUZXh0KCkgIT0gbnVsbAotCQkJCQkJJiYgY3RybF9wYXR0ZXJuLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXBhdHRlcm4gPSBjdHJsX3BhdHRlcm4uZ2V0VGV4dCgpLnRyaW0oKTsKLS8vCQkJCQlpZihwYXR0ZXJuLmluZGV4T2YoRmlsdGVyQ29uc3RhbnRzLkFOWV9TVFJJTkcpPiAtMSAKLS8vCQkJCQkJCXx8IHBhdHRlcm4uaW5kZXhPZihGaWx0ZXJDb25zdGFudHMuQU5ZX0NIQVJBQ1RFUikgPiAtMSl7Ci0vLwkJCQkJCQotLy8JCQkJCX1lbHNlewotLy8JCQkJCQlwYXR0ZXJuID0gcGF0dGVybitGaWx0ZXJDb25zdGFudHMuQU5ZX1NUUklORzsKLS8vCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGF0dGVybiA9IEZpbHRlckNvbnN0YW50cy5BTllfU1RSSU5HOwotCQkJCQkvL3JldHVybjsKLQkJCQl9Ci0JCQkJcmVnZXhQYXR0ZXJuID0gZ2V0UmVnRXgocGF0dGVybik7Ci0JCQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0JCQkJCWhlbHBlci5zZXRQYXR0ZXJuKHBhdHRlcm4pOwotCQkJCQloZWxwZXIuc2V0UmVnZXhQYXR0ZXJuKHJlZ2V4UGF0dGVybik7Ci0JCQkJCWhlbHBlci5zZXRGaWx0ZXJUeXBlU3RyKGZpbHRlclR5cGVTdHIpOwotCQkJCQloZWxwZXIuc2V0VGFiU3RyKGZpbHRlclR5cGVTdHIpOwotCQkJCX0KLQkJCQlyZWZyZXNoVHJlZVZpZXdlcigpOwotCQkJfQotCQl9KTsKLQotCQlmaWx0ZXJUeXBlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyB1cGRhdGVGb250TGlzdCgpOwotCQkJCWlmIChmaWx0ZXJUeXBlLmdldFNlbGVjdGlvbkluZGV4KCkgPiAtMSkgewotCQkJCQlmaWx0ZXJUeXBlU3RyID0gZmlsdGVyVHlwZS5nZXRJdGVtKGZpbHRlclR5cGUKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJfQotCQkJCWZpbHRlclR5cGVTdHIudHJpbSgpOwotCQkJCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJCQloZWxwZXIuc2V0UGF0dGVybihwYXR0ZXJuKTsKLQkJCQkJaGVscGVyLnNldFJlZ2V4UGF0dGVybihyZWdleFBhdHRlcm4pOwotCQkJCQloZWxwZXIuc2V0RmlsdGVyVHlwZVN0cihmaWx0ZXJUeXBlU3RyKTsKLQkJCQkJaGVscGVyLnNldFRhYlN0cihmaWx0ZXJUeXBlU3RyKTsKLQkJCQl9Ci0JCQkJLy8gaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCQkJCXJlZnJlc2hUcmVlVmlld2VyKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZWxlY3Rpb25ldmVudCkgewotCQkJfQotCQl9KTsKLQkJZXhwYW5kQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewkJCQkKLQkJCQlleHBhbmRPckNvbGxhcHNlKHRydWUpOwotCQkJfQotCQl9KTsKLQkJY29sbGFwc2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZXhwYW5kT3JDb2xsYXBzZShmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JcHVibGljIEFycmF5TGlzdCBnZXRTZWxlY3RlZEl0ZW1zKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRMaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJGb3JUYWJzKCkgewotCi0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUZpbHRlcikgewotCQkJCWlmKGZpbHRlciBpbnN0YW5jZW9mIElDYXRlZ29yeUZpbHRlcil7Ci0JCQkJCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbnRlbnRjYXRlZ29yeS4KLQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzQ1MgotCQkJCQloZWxwZXIuc2V0Q29udGVudENhdGVnb3J5VGFiU3RyKHRhYlN0cik7Ci0JCQkJfQotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkuc2V0SGVscGVyKGhlbHBlcik7Ci0JCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQkJKChEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX1lbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBFeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IpIHsKLQkJCQkoKEV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcikgZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSVByb2Nlc3NGaWx0ZXIpIHsKLQkJCWlmICh0YWJTdHIKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SUykpIHsKLQkJCQlhZGFwdGVyRmFjdG9yeSA9VG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcik7Ci0JCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJfSBlbHNlIGlmICh0YWJTdHIKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlMpKSB7Ci0JCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKTsgCi0JCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpOyAKLQkJCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhpc3RpbmdFbGVtZW50cyhMaXN0IGxpc3QpIHsKLQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0ID0gbGlzdDsKLQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0JCQloZWxwZXIuc2V0QWxyZWFkeVNlbGVjdGVkTGlzdChsaXN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBGaWx0ZXJIZWxwZXIgZ2V0SGVscGVyKCkgewotCQlyZXR1cm4gdGhpcy5oZWxwZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEZpbHRlclR5cGVBcnJheSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBzZXRzIHRoZSBDb250ZW50UHJvdmlkZXIgdXNlZCBieSBUcmVlVmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRQcm92aWRlcihJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5jb250ZW50UHJvdmlkZXIgPSBjb250ZW50UHJvdmlkZXI7Ci0JCXRoaXMuY29tcG9zZWRBZGFwdGVyRmFjdG9yeSA9IGNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiBQYXNzaW5nIFN0cmluZ1tdIGFycmF5IGZpbGxzIHRoZSBGaWx0ZXJUeXBlIGxpc3QgaW4gZHJvcGRvd24gY29tYm8gYm94LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVzKFN0cmluZ1tdIHN0cikgewotCQl0aGlzLnR5cGVzID0gc3RyOwotCX0KLQotCS8qCi0JICogc2V0IHRoZSBGaWx0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLmZpbHRlciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUZpbHRlcikgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSB0aGlzLmZpbHRlcikKLQkJCQkJCS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5maWx0ZXIgaW5zdGFuY2VvZiBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgewotCQkJCSgoRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIpIHRoaXMuZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkgewotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyTGFiZWwoU3RyaW5nIHZpZXdlckxhYmVsKSB7Ci0JCXRoaXMudmlld2VyTGFiZWwgPSB2aWV3ZXJMYWJlbDsKLQl9Ci0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoVHJlZVZpZXdlcigpewotCQkvLyBUbyBpbXByb3ZlIHBlcmZvcm1hbmNlIG9mIGZpbHRlciwgZmlsdGVyIGZpcnN0IGFuZCByZXNldCB2aXNpYmxlIHRvCi0JCS8vIHRydWUuVGhpcyB3aWxsIGF2b2lkIHRoZSBmbGlja2VyaW5nIGluIFVJIGF0IHRpbWUgb2YgZmlsdGVyaW5nCi0JCS8vIGVsZW1lbnRzIGluIHRoZSB0cmVlIHN0cnVjdHVyZQotCQkKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuY2xlYXJBbGwodHJ1ZSk7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUoZmFsc2UpOwotCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHBhbmRPckNvbGxhcHNlKGJvb2xlYW4gZXhwYW5kKXsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWlmKGV4cGFuZCl7Ci0JCQl0cmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCQl9ZWxzZXsKLQkJCXRyZWVWaWV3ZXIuY29sbGFwc2VBbGwoKTsKLQkJfQotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQkKLQlwcml2YXRlIFBhdHRlcm4gZ2V0UmVnRXgoU3RyaW5nIHBhdHRlcm4pewotCQl0cnl7Ci0JCQlyZXR1cm4gUGF0dGVybkNvbnN0cnVjdG9yLmNyZWF0ZVBhdHRlcm4ocGF0dGVybiwgZmFsc2UsIGZhbHNlKTsKLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCXJldHVybiBQYXR0ZXJuQ29uc3RydWN0b3IuY3JlYXRlUGF0dGVybihGaWx0ZXJDb25zdGFudHMuQU5ZX1NUUklORywgZmFsc2UsIGZhbHNlKTsgCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTWV0aG9kQWRkSW1hZ2VEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEFkZEltYWdlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhZWFmOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTWV0aG9kQWRkSW1hZ2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZEltYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBpbWFnZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBIVE1MCi0gKiA8aW1nPiB0YWcgaW4gdGhlIFJpY2ggVGV4dCBFZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RBZGRJbWFnZURpYWxvZyBleHRlbmRzIEFkZEltYWdlRGlhbG9nIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfSEVJR0hUID0gNjAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9XSURUSCA9IDYwMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0hFSUdIVCA9IDIwMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dJRFRIID0gMjAwOwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0KLQlwcml2YXRlIEZpbGUgZmlsZVRvQ29weTsKLQotCXByaXZhdGUgU3RyaW5nIHVybDsKLQotCXByaXZhdGUgaW50IGhlaWdodCA9IERFRkFVTFRfSEVJR0hUOwotCi0JcHJpdmF0ZSBpbnQgd2lkdGggPSBERUZBVUxUX1dJRFRIOwotCi0JcHJpdmF0ZSBTdHJpbmcgYWx0VGFnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGV4dCBoZWlnaHRUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IHdpZHRoVGV4dDsKLQotCXByaXZhdGUgVGV4dCBhbHRUYWdUZXh0OwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl1cmwgPSB1cmxUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCQkJCWhlaWdodCA9IEludGVnZXIucGFyc2VJbnQoaGVpZ2h0VGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQkJd2lkdGggPSBJbnRlZ2VyLnBhcnNlSW50KHdpZHRoVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZCh1cmwubGVuZ3RoKCkgPiAwICYmIGhlaWdodCA+IDAKLQkJCQkJCQkmJiB3aWR0aCA+IDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgc2hlbGwuCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnQKLQkgKiAgICAgICAgICAgIEEgbWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIE1ldGhvZEFkZEltYWdlRGlhbG9nKFNoZWxsIHBhcmVudCwgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubWV0aG9kRWxlbWVudCA9IG1ldGhvZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncy5CYXNlRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlCi0JICogICAgICBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJKChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMgPSA0OwotCQkoKEdyaWREYXRhKSB1cmxUZXh0LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0JCXVybFRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodXJsVGV4dExpc3RlbmVyKTsKLQkJdXJsVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJYnJvd3NlQnV0dG9uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGJyb3dzZVNlbGVjdGlvbkFkYXB0ZXIpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpCi0JCQkJCQkrIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkrIFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKG1ldGhvZEVsZW1lbnQpKTsKLQkJCQlTdHJpbmcgYXR0YWNoRmlsZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGF0dGFjaEZpbGUgIT0gbnVsbCAmJiBhdHRhY2hGaWxlLmxlbmd0aCgpID4gMCkgewotCQkJCQl0cnkgewotCQkJCQkJZmlsZVRvQ29weSA9IG5ldyBGaWxlKGRpYWxvZy5nZXRGaWx0ZXJQYXRoKCksIGRpYWxvZwotCQkJCQkJCQkuZ2V0RmlsZU5hbWUoKSk7Ci0JCQkJCQl1cmwgPSAiLi8iICsgUmVzb3VyY2VIZWxwZXIuZ2V0VVJMRm9yQXR0YWNobWVudChmaWxlVG9Db3B5LCBtZXRob2RFbGVtZW50LCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXVybFRleHQuc2V0VGV4dCh1cmwpOwotCi0JCQkJCQkvLyBUcnkgdG8gZ2V0IHRoZSBpbWFnZSBpbmZvLgotCQkJCQkJc2V0SW1hZ2VJbmZvKGZpbGVUb0NvcHkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlMYWJlbCBoZWlnaHRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJaGVpZ2h0TGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5oZWlnaHRMYWJlbF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWhlaWdodFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQloZWlnaHRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQloZWlnaHRUZXh0LnNldFRleHQoIiIgKyBERUZBVUxUX0hFSUdIVCk7IC8vJE5PTi1OTFMtMSQKLQkJaGVpZ2h0VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJTGFiZWwgaW1hZ2VTaXplTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC53aWR0aEhpbnQgPSAzMDA7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlnZC52ZXJ0aWNhbFNwYW4gPSAyOwotCQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQkJaW1hZ2VTaXplTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCX0KLQkJaW1hZ2VTaXplTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5pbWFnZVNpemVMYWJlbF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JCUxhYmVsIHdpZHRoTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXdpZHRoTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy53aWR0aExhYmVsX3RleHQpOyAvLyROT04tTkxTLTEkCi0KLQkJd2lkdGhUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJd2lkdGhUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQl3aWR0aFRleHQuc2V0VGV4dCgiIiArIERFRkFVTFRfV0lEVEgpOyAvLyROT04tTkxTLTEkCi0JCXdpZHRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJTGFiZWwgYWx0TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWFsdExhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWx0VGFnTGFiZWxfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJYWx0VGFnVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlhbHRUYWdUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQl9Ci0JCWFsdFRhZ1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJCWFsdFRhZyA9IGFsdFRhZ1RleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIHRvIGJlIGNvcGllZCB0byBhIHJlc291cmNlIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRGaWxlVG9Db3B5KCkgewotCQlyZXR1cm4gZmlsZVRvQ29weTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0SW1hZ2VJbmZvKFN0cmluZyBpbWFnZU5hbWUpIHsKLQkJRmlsZSBpbWFnZUZpbGUgPSBuZXcgRmlsZShpbWFnZU5hbWUpOwotCQlpZiAoaW1hZ2VGaWxlLmV4aXN0cygpKSB7Ci0JCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShpbWFnZU5hbWUpOwotCQkJaGVpZ2h0VGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGltYWdlRGF0YS5oZWlnaHQpKTsKLQkJCXdpZHRoVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGltYWdlRGF0YS53aWR0aCkpOwotCQl9IGVsc2UgewotCQkJaGVpZ2h0VGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKERFRkFVTFRfSEVJR0hUKSk7Ci0JCQl3aWR0aFRleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihERUZBVUxUX1dJRFRIKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBVUkwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgaGVpZ2h0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgewotCQlyZXR1cm4gTWF0aC5taW4oTUFYX0hFSUdIVCwgTWF0aC5tYXgoMTAsIGhlaWdodCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIHdpZHRoLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiBNYXRoLm1pbihNQVhfV0lEVEgsIE1hdGgubWF4KDEwLCB3aWR0aCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIEFMVCB0YWcuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbHRUYWcoKSB7Ci0JCXJldHVybiBhbHRUYWc7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXVybCA9IE5ldFV0aWwuZW5jb2RlRmlsZVVSTCh1cmwpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEFkZExpbmtEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEFkZExpbmtEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmUzNThiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9NZXRob2RBZGRMaW5rRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQWRkTGlua0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncy5BZGRMaW5rRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIGxpbmsgdHlwZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBIVE1MIDxhPgotICogdGFnIGluIHRoZSBSaWNoIFRleHQgRWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQWRkTGlua0RpYWxvZyBleHRlbmRzIEFkZExpbmtEaWFsb2cgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktfVVJMID0gMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LX0ZJTEUgPSBMSU5LX1VSTCArIDE7Ci0KLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS19FTEVNRU5UX0xJTksgPSBMSU5LX1VSTCArIDI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS19FTEVNRU5UX0xJTktfV0lUSF9UWVBFID0gTElOS19VUkwgKyAzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktfRUxFTUVOVF9MSU5LX1dJVEhfVVNFUl9URVhUID0gTElOS19VUkwgKyA0OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRUxFTUVOVF9UWVBFX0xBQkVMUyA9IHsKLQkJCUxpYnJhcnlVSVJlc291cmNlcy5saW5rVG9VUkxfbmFtZSwKLQkJCUxpYnJhcnlVSVJlc291cmNlcy5saW5rVG9GaWxlX25hbWUsCi0JCQlMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudExpbmtfbmFtZSwKLQkJCUxpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50TGlua1dpdGhUeXBlX25hbWUsCi0JCQlMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudExpbmtXaXRoVXNlclRleHRfbmFtZSB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fTElOS19JTl9ORVdfV0lORE9XX0FUVFJJQlVURSA9ICJ0YXJnZXQ9XCJfYmxhbmtcIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0OwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0KLQlwcml2YXRlIENvbWJvIGxpbmtUeXBlQ29tYm87Ci0KLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBvcGVuTGlua0NoZWNrYm94OwotCi0JcHJpdmF0ZSBpbnQgbGlua1R5cGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gb3BlbkxpbmtJbk5ld1dpbmRvdyA9IHRydWU7Ci0KLQlwcml2YXRlIEZpbGUgZmlsZVRvQ29weTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBzaGVsbC4KLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIEEgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIE1ldGhvZEFkZExpbmtEaWFsb2coU2hlbGwgcGFyZW50LCBJTWV0aG9kUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocGFyZW50LCByaWNoVGV4dC5nZXRCYXNlUGF0aCgpKTsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCQl0aGlzLm1ldGhvZEVsZW1lbnQgPSByaWNoVGV4dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncy5CYXNlRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlCi0JICogICAgICBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0JCUxhYmVsIGxpbmtUeXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxpbmtUeXBlTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5hZGRMaW5rRGlhbG9nX2xpbmtUeXBlKTsKLQkJbGlua1R5cGVMYWJlbC5tb3ZlQWJvdmUodXJsTGFiZWwpOwotCi0JCWxpbmtUeXBlQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGNvbWJvR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJY29tYm9HcmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxpbmtUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShjb21ib0dyaWREYXRhKTsKLQkJbGlua1R5cGVDb21iby5zZXRJdGVtcyhFTEVNRU5UX1RZUEVfTEFCRUxTKTsKLQkJbGlua1R5cGVDb21iby5zZXRUZXh0KEVMRU1FTlRfVFlQRV9MQUJFTFNbMF0pOwotCQlsaW5rVHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbGlua1R5cGUgPSBsaW5rVHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQobGlua1R5cGUgIT0gTElOS19VUkwpOwotCQkJCXVybERpc3BsYXlOYW1lTGFiZWwuc2V0RW5hYmxlZChsaW5rVHlwZSA9PSBMSU5LX1VSTCk7Ci0JCQkJdXJsRGlzcGxheU5hbWVUZXh0LnNldEVuYWJsZWQobGlua1R5cGUgPT0gTElOS19VUkwpOwotCQkJCWlmIChsaW5rVHlwZSA9PSBMSU5LX1VSTCkgewotCQkJCQl1cmxEaXNwbGF5TmFtZVRleHQKLQkJCQkJCQkuc2V0VGV4dChyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmdldFRleHQoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdXJsRGlzcGxheU5hbWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCW9wZW5MaW5rQ2hlY2tib3guc2V0RW5hYmxlZChsaW5rVHlwZSA9PSBMSU5LX1VSTAotCQkJCQkJfHwgbGlua1R5cGUgPT0gTElOS19GSUxFKTsKLQkJCQl1cmxUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGxpbmtUeXBlICE9IExJTktfRklMRSkgewotCQkJCQlmaWxlVG9Db3B5ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQkJbGlua1R5cGVDb21iby5tb3ZlQWJvdmUodXJsTGFiZWwpOwotCi0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkJST1dTRV9CVVRUT05fVEVYVCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAobGlua1R5cGUgPT0gTElOS19GSUxFKSB7Ci0JCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChiYXNlUGF0aCk7Ci0JCQkJCVN0cmluZyBhdHRhY2hGaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKGF0dGFjaEZpbGUgIT0gbnVsbCAmJiBhdHRhY2hGaWxlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlmaWxlVG9Db3B5ID0gbmV3IEZpbGUoZGlhbG9nLmdldEZpbHRlclBhdGgoKSwKLQkJCQkJCQkJCWRpYWxvZy5nZXRGaWxlTmFtZSgpKTsKLQkJCQkJCQlTdHJpbmcgcGF0aCA9IFJlc291cmNlSGVscGVyLmdldFVSTEZvckF0dGFjaG1lbnQoCi0JCQkJCQkJCQlmaWxlVG9Db3B5LCBtZXRob2RFbGVtZW50LCBmYWxzZSk7Ci0JCQkJCQkJU3RyaW5nIHVybCA9ICI8YSBocmVmPVwiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCQkJCQkJdXJsICs9IE5ldFV0aWwKLQkJCQkJCQkJCQkuZW5jb2RlRmlsZVVSTChOZXRVdGlsLkZJTEVfVVJJX1BSRUZJWAotCQkJCQkJCQkJCQkJKyBwYXRoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl1cmwgKz0gTmV0VXRpbC5lbmNvZGVGaWxlVVJMKCIuLyIgKyBwYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQl1cmwgKz0gIlwiIiArIChvcGVuTGlua0luTmV3V2luZG93ID8gIiAiICsgT1BFTl9MSU5LX0lOX05FV19XSU5ET1dfQVRUUklCVVRFIDogIiIpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCQkJCSI+IiArIGZpbGVUb0NvcHkuZ2V0TmFtZSgpICsgIjwvYT4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl1cmxUZXh0LnNldFRleHQodXJsKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIE1ldGhvZEVsZW1lbnQgbGluawotCQkJCWVsc2UgewotCQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBBZGRMaW5rRmlsdGVyKCkgewotCQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pCi0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJaWYob2JqIGluc3RhbmNlb2YgTWlsZXN0b25lKSByZXR1cm4gZmFsc2U7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBtZXRob2RFbGVtZW50LAotCQkJCQkJCUZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMpOwotCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUyk7Ci0JCQkJCWZkLm9wZW4oKTsKLQkJCQkJQXJyYXlMaXN0IHNlbCA9IGZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJCQkJaWYgKHNlbC5zaXplKCkgPiAwKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBzZWwKLQkJCQkJCQkJLmdldCgwKTsKLQkJCQkJCVN0cmluZyB1cmwgPSBudWxsOwotCQkJCQkJU3RyaW5nIGhyZWYgPSBSZXNvdXJjZUhlbHBlci5nZXRVcmwoc2VsZWN0ZWRFbGVtZW50LAotCQkJCQkJCQltZXRob2RFbGVtZW50LCAiaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAobGlua1R5cGUgPT0gTElOS19FTEVNRU5UX0xJTktfV0lUSF9VU0VSX1RFWFQpIHsKLQkJCQkJCQlTdHJpbmcgbGlua05hbWUgPSAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkKLQkJCQkJCQkJCS5nZXRTZWxlY3RlZCgpLmdldFRleHQoKTsKLQkJCQkJCQlpZiAobGlua05hbWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQkJCQkJCWxpbmtOYW1lID0gc2VsZWN0ZWRFbGVtZW50LmdldE5hbWUoKTsKLQkJCQkJCQl1cmwgPSBSZXNvdXJjZUhlbHBlcgotCQkJCQkJCQkJLmdldEVsZW1lbnRMaW5rKHNlbGVjdGVkRWxlbWVudCwgbGlua05hbWUsCi0JCQkJCQkJCQkJCSJmaWxlOi8vIiArIGhyZWYpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWJvb2xlYW4gd2l0aFR5cGUgPSAobGlua1R5cGUgPT0gTElOS19FTEVNRU5UX0xJTktfV0lUSF9UWVBFKSA/IHRydWUKLQkJCQkJCQkJCTogZmFsc2U7Ci0JCQkJCQkJdXJsID0gUmVzb3VyY2VIZWxwZXIKLQkJCQkJCQkJCS5nZXRFbGVtZW50TGluayhzZWxlY3RlZEVsZW1lbnQsIHdpdGhUeXBlLAotCQkJCQkJCQkJCQkiZmlsZTovLyIgKyBocmVmKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJdXJsVGV4dC5zZXRUZXh0KHVybCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VCdXR0b24ubW92ZUFib3ZlKHVybERpc3BsYXlOYW1lTGFiZWwpOwotCi0JCW9wZW5MaW5rQ2hlY2tib3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJR3JpZERhdGEgY2hlY2tCb3hHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQljaGVja0JveEdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJb3BlbkxpbmtDaGVja2JveC5zZXRMYXlvdXREYXRhKGNoZWNrQm94R3JpZERhdGEpOwotCQlvcGVuTGlua0NoZWNrYm94LnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMub3BlbkxpbmtDaGVja2JveF90ZXh0KTsKLQkJb3BlbkxpbmtDaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCW9wZW5MaW5rQ2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3BlbkxpbmtJbk5ld1dpbmRvdyA9IG9wZW5MaW5rQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXVybERpc3BsYXlOYW1lVGV4dC5zZXRUZXh0KHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuZ2V0VGV4dCgpKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgdG8gYmUgY29waWVkIHRvIGEgcmVzb3VyY2UgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBGaWxlIGdldEZpbGVUb0NvcHkoKSB7Ci0JCXJldHVybiBmaWxlVG9Db3B5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxpbmsgc2hvdWxkIGJlIG9wZW5lZCBpbiBhIG5ldyBicm93c2VyCi0JICogd2luZG93LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE9wZW5MaW5rSW5OZXdXaW5kb3coKSB7Ci0JCXJldHVybiBvcGVuTGlua0luTmV3V2luZG93OwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlTdHJpbmcgdXJsID0gdXJsVGV4dC5nZXRUZXh0KCk7Ci0JCWlmICh1cmwgIT0gbnVsbCAmJiB1cmwubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAobGlua1R5cGUgPT0gTElOS19VUkwpIHsKLQkJCQlTdHJpbmcgdXJsRGlzcGxheU5hbWUgPSB1cmxEaXNwbGF5TmFtZVRleHQuZ2V0VGV4dCgpOwotCQkJCWlmICh1cmxEaXNwbGF5TmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl1cmxEaXNwbGF5TmFtZSA9IHVybDsKLQkJCQl9Ci0JCQkJU3RyaW5nIGZ1bGxVUkwgPSAiPGEgaHJlZj1cIiIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQl1cmwKLQkJCQkJCSsgIlwiIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCShvcGVuTGlua0luTmV3V2luZG93ID8gIiAiICsgT1BFTl9MSU5LX0lOX05FV19XSU5ET1dfQVRUUklCVVRFIDogIiIpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkiPiIgKyB1cmxEaXNwbGF5TmFtZSArICI8L2E+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbGluay5zZXRVUkwoZnVsbFVSTCk7Ci0JCQl9IGVsc2UgewotCQkJCWxpbmsuc2V0VVJMKHVybCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBTZXQgd2lkZ2V0IHRleHQgdG8gYmxhbmsgc28gc3VwZXIub2tQcmVzc2VkIGRvZXNuJ3Qgb3ZlcndyaXRlIHRoZQotCQkvLyBhYm92ZS4KLQkJdXJsVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01vdmVEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01vdmVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2ZlYTZkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Nb3ZlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZC5Nb3ZlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIERpYWxvZyBmb3IgbW92aW5nIE1ldGhvZEVsZW1lbnQgd2l0aGluIE1ldGhvZExpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBlbGVtZW50czsKLQotCS8vIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIGxvY2tlZFVJID0gZmFsc2U7Ci0KLQkvLyBUaGUgcHJvZ3Jlc3MgbW9uaXRvcgotCXByaXZhdGUgUHJvZ3Jlc3NNb25pdG9yUGFydCBwcm9ncmVzc01vbml0b3JQYXJ0OwotCi0JcHJpdmF0ZSBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQlwcml2YXRlIE9iamVjdCBkZXN0aW5hdGlvbjsKLQotCXByaXZhdGUgQ3Vyc29yIHdhaXRDdXJzb3I7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbW92aW5nOwotCi0JcHVibGljIE1vdmVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIENvbGxlY3Rpb24gZWxlbWVudHNUb01vdmUsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4pIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmVkaXRpbmdEb21haW4gPSBlZGl0aW5nRG9tYWluOwotCi0JCS8vIGZpbHRlciBvdXQgdGhlIHByZWRlZmluZWQgZWxlbWVudHMgdG8gcHJldmVudCB0aGVtIGZyb20gZ2V0dGluZyBtb3ZlZAotCQkvLwotCQllbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb01vdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkmJiBUbmdVdGlsLmlzUHJlZGVmaW5lZCgoTWV0aG9kRWxlbWVudCkgZSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfZGVzdGluYXRpb25fdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQotCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0JCXRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkvLyB0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIodGhpcyk7Ci0KLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQl7Ci0JCQlzcGVjLndpZHRoSGludCA9IDMwMDsKLQkJCXNwZWMuaGVpZ2h0SGludCA9IDMwMDsKLQkJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoc3BlYyk7Ci0JCX0KLQotCQl0cmVlVmlld2VyLnNldElucHV0KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0KLQkJLy8gSW5zZXJ0IGEgcHJvZ3Jlc3MgbW9uaXRvcgotCQlHcmlkTGF5b3V0IHBtbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJcG1sYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCXByb2dyZXNzTW9uaXRvclBhcnQgPSBjcmVhdGVQcm9ncmVzc01vbml0b3JQYXJ0KGNvbXBvc2l0ZSwgcG1sYXlvdXQpOwotCQlwcm9ncmVzc01vbml0b3JQYXJ0Ci0JCQkJLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwcm9ncmVzc01vbml0b3JQYXJ0LnNldFZpc2libGUoZmFsc2UpOwotCi0JCXdhaXRDdXJzb3IgPSBwYXJlbnQuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ3Vyc29yKAotCQkJCVNXVC5DVVJTT1JfV0FJVCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvZ3Jlc3NNb25pdG9yUGFydCBjcmVhdGVQcm9ncmVzc01vbml0b3JQYXJ0KAotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSwgR3JpZExheW91dCBwbWxheW91dCkgewotCQlyZXR1cm4gbmV3IFByb2dyZXNzTW9uaXRvclBhcnQoY29tcG9zaXRlLCBwbWxheW91dCwgU1dULkRFRkFVTFQpIHsKLQkJCVN0cmluZyBjdXJyZW50VGFzayA9IG51bGw7Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjc2V0QmxvY2tlZChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgc2V0QmxvY2tlZChJU3RhdHVzIHJlYXNvbikgewotCQkJCXN1cGVyLnNldEJsb2NrZWQocmVhc29uKTsKLQkJCQlpZiAoIWxvY2tlZFVJKS8vIERvIG5vdCBzaG93IGJsb2NrZWQgaWYgd2UgYXJlIGxvY2tpbmcgdGhlIFVJCi0JCQkJCWdldEJsb2NrZWRIYW5kbGVyKCkuc2hvd0Jsb2NrZWQoZ2V0U2hlbGwoKSwgdGhpcywgcmVhc29uLAotCQkJCQkJCWN1cnJlbnRUYXNrKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNjbGVhckJsb2NrZWQoKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBjbGVhckJsb2NrZWQoKSB7Ci0JCQkJc3VwZXIuY2xlYXJCbG9ja2VkKCk7Ci0JCQkJaWYgKCFsb2NrZWRVSSkvLyBEbyBub3QgdmxlYXIgaWYgd2UgbmV2ZXIgc2V0IGl0Ci0JCQkJCWdldEJsb2NrZWRIYW5kbGVyKCkuY2xlYXJCbG9ja2VkKCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjYmVnaW5UYXNrKGphdmEubGFuZy5TdHJpbmcsCi0JCQkgKiAgICAgIGludCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyBuYW1lLCBpbnQgdG90YWxXb3JrKSB7Ci0JCQkJc3VwZXIuYmVnaW5UYXNrKG5hbWUsIHRvdGFsV29yayk7Ci0JCQkJY3VycmVudFRhc2sgPSBuYW1lOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0I3NldFRhc2tOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQkJc3VwZXIuc2V0VGFza05hbWUobmFtZSk7Ci0JCQkJY3VycmVudFRhc2sgPSBuYW1lOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0I3N1YlRhc2soamF2YS5sYW5nLlN0cmluZykKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgewotCQkJCXN1cGVyLnN1YlRhc2sobmFtZSk7Ci0JCQkJLy8gSWYgd2UgaGF2ZW4ndCBnb3QgYW55dGhpbmcgeWV0IHVzZSB0aGlzIHZhbHVlIGZvciBtb3JlCi0JCQkJLy8gY29udGV4dAotCQkJCWlmIChjdXJyZW50VGFzayA9PSBudWxsKQotCQkJCQljdXJyZW50VGFzayA9IG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJbmV3U2hlbGwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX21vdmVfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWRlc3RpbmF0aW9uID0gVG5nVXRpbC51bndyYXAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI29rUHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlpZiAoZG9Nb3ZlKCkpIHsKLQkJCXN1cGVyLm9rUHJlc3NlZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWREZXN0aW5hdGlvbigpIHsKLQkJLy8gcHJldmVudGluZyBtb3ZpbmcgZWxlbWVudHMgdG8gY2F0ZWdvcnkKLQkJLy8KLQkJaWYgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBkbyBub3QgYWxsb3cgbW92aW5nIGludG8gU3RhbmRhcmQgQ2F0ZWdvcmllcwotCQlpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIGNvbnRhaW5lcnMgZm9yIGNvbXBhdGlibGUgdHlwZXMgd2lsbCBub3Qgd29yayBpZiB3ZSB3YW50IHRvIG1vdmUgYSBzdWItYXJ0aWZhY3QKLQkJLy8gdG8gYSBjb250ZW50IHBhY2thZ2UKLQkJLy8KLQkJCi0vLwkJLy8gZG8gbm90IGFsbG93IG1vdmUgaWYgZGVzdGluYXRpb24gaXMgbm90IHRoZSBzYW1lIHR5cGUgYXMgZXZlcnkKLS8vCQkvLyBlbGVtZW50cycgZUNvbnRhaW5lcgotLy8JCU9iamVjdCByZWFsRGVzdCA9IGRlc3RpbmF0aW9uOwotLy8JCWlmIChkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSB7Ci0vLwkJCXJlYWxEZXN0ID0gKChUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgZGVzdGluYXRpb24pCi0vLwkJCQkJLmdldFRhcmdldCgpOwotLy8JCX0KLS8vCQlpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcikgewotLy8JCQlyZWFsRGVzdCA9ICgoVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIpIGRlc3RpbmF0aW9uKS5nZXRUYXJnZXQoKTsKLS8vCQl9CQkKLS8vCQl0cnkgewotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0vLwkJCQlpZiAoZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLS8vCQkJCQlpZiAoIXJlYWxEZXN0LmdldENsYXNzKCkuaXNJbnN0YW5jZSgKLS8vCQkJCQkJCSgoRU9iamVjdCkgZSkuZUNvbnRhaW5lcigpKSkKLS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0KLQkJaWYgKERlcGVuZGVuY3lDaGVja2VyLm5ld0NoZWNrKSB7Ci0JCQlpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlpZiAoISBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRm9yTW92aW5nVmFyaWFiaWxpdHlFbGVtZW50Ci0JCQkJCQkoKFZhcmlhYmlsaXR5RWxlbWVudCkgZGVzdGluYXRpb24sIGVsZW1lbnRzKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCS8vIFN1YiBBcnRpZmFjdCBjaXJjdWxhciBjaGVjayBjb2RlCi0JCWVsc2UgaWYoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBBcnRpZmFjdCl7Ci0JCQlyZXR1cm4gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckZvckFydGlmYWN0cygoQXJ0aWZhY3QpZGVzdGluYXRpb24sIAotCQkJCQllbGVtZW50cyk7Ci0JCX0JCQotCQkKLQkJQ29tbWFuZCBhZGRDb21tYW5kID0gQWRkQ29tbWFuZC5jcmVhdGUoZWRpdGluZ0RvbWFpbiwgZGVzdGluYXRpb24sCi0JCQkJbnVsbCwgZWxlbWVudHMpOwotCQlib29sZWFuIHJlc3VsdDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGFkZENvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJYWRkQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKCFyZXN1bHQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQlkZXN0aW5hdGlvbiA9ICgoVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIpIGRlc3RpbmF0aW9uKQotCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQotCQkvLyBJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeSgoRU9iamVjdCkKLQkJLy8gZGVzdGluYXRpb24sIGdldFNoZWxsKCkpOwotCQkvLyBpZiAoc3RhdHVzLmlzT0soKSkgewotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyBlbHNlIHsKLQkJLy8gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXkoCi0JCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdldFN0cmluZygiQXV0aG9yaW5nVUlQbHVnaW4ubW92ZURpYWxvZy50aXRsZSIpLAotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vIHN0YXR1cyk7Ci0JCS8vIHJldHVybiBmYWxzZTsKLQkJLy8gfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZG9Nb3ZlKCkgewotCQlpZiAoZGVzdGluYXRpb24gPT0gbnVsbCkgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwcm9ibGVtID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19ub21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBwcm9ibGVtLCBtc2cpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCFpc1ZhbGlkRGVzdGluYXRpb24oKSkgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwcm9ibGVtID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX3ZhbGlkZGVzdGluYXRpb25fdGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIHByb2JsZW0sIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KAotCQkJCQkoRU9iamVjdCkgZGVzdGluYXRpb24sIGdldFNoZWxsKCkpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19jYW5ub3RNb2RpZnlEZXN0aW5hdGlvbjsgLy8kTk9OLU5MUy0xJAotCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHN0YXR1cyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQltb3ZpbmcgPSB0cnVlOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCXNoZWxsLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQotCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCXByb2dyZXNzTW9uaXRvclBhcnQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJcHJvZ3Jlc3NNb25pdG9yUGFydAotCQkJCS5iZWdpblRhc2soCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX21vdmluZ190ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCU1vdmVPcGVyYXRpb24gbW92ZU9wID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGNyZWF0ZSBjb21tYW5kCi0JCQkvLwotCQkJQ29tbWFuZCBjb21tYW5kID0gQWRkQ29tbWFuZC5jcmVhdGUoZWRpdGluZ0RvbWFpbiwgZGVzdGluYXRpb24sCi0JCQkJCW51bGwsIGVsZW1lbnRzKTsKLQotCQkJbW92ZU9wID0gbmV3IE1vdmVPcGVyYXRpb24oY29tbWFuZCwgcHJvZ3Jlc3NNb25pdG9yUGFydCwgc2hlbGwpOwotCQkJbW92ZU9wLnJ1bigpOwotCQl9IGZpbmFsbHkgewotCQkJbW92aW5nID0gZmFsc2U7Ci0JCQlwcm9ncmVzc01vbml0b3JQYXJ0LmRvbmUoKTsKLQotCQkJLy8gY2xlYXIgY3Vyc29yCi0JCQlpZiAoc2hlbGwgIT0gbnVsbCAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1vdmVPcCAhPSBudWxsKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG1vdmVPcC5nZXRTdGF0dXMoKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JNZXNzYWdlOyAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCXRpdGxlLCBtZXNzYWdlLCBzdGF0dXMpOwotCQkJCWlmIChtb3ZlT3AucmVsb2FkTmVlZGVkKCkpIHsKLQkJCQkJVmlld0hlbHBlci5yZWxvYWRDdXJyZW50TGlicmFyeShzaGVsbCwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjbG9zZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCWlmIChtb3ZpbmcpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvT3BlbkNvbmZpZ0RpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvT3BlbkNvbmZpZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YmEwNGZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL09wZW5Db25maWdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkNvbmZpZ0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19DT05GSUdfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk9wZW5Db25maWdEaWFsb2duZXdjb25maWdfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JLy8gQ29tYm8gY29tYm9fY29uZmlnczsKLQlTdHJpbmcgc2VlbGN0ZWROYW1lOwotCi0JQnV0dG9uW10gY3RybF9jb25maWdzID0gbnVsbDsKLQotCVRleHQgY3RybF9uZXdfY29uZmlnID0gbnVsbDsKLQotCXB1YmxpYyBPcGVuQ29uZmlnRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJZmluYWwgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJYXJlYS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCXsKLQkJCUdyb3VwIGcgPSBuZXcgR3JvdXAoYXJlYSwgU1dULk5PTkUpOwotCQkJewotCQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQkJZy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQkJZy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCX0KLQotCQkJU3RyaW5nW10gbmFtZXMgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbk5hbWVzKAotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQkJaWYgKG5hbWVzICE9IG51bGwpIHsKLQkJCQljdHJsX2NvbmZpZ3MgPSBuZXcgQnV0dG9uW25hbWVzLmxlbmd0aCArIDFdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3RybF9jb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gTkVXX0NPTkZJR19URVhUOwotCQkJCQlpZiAoaSA8IG5hbWVzLmxlbmd0aCkgewotCQkJCQkJbmFtZSA9IG5hbWVzW2ldOwotCQkJCQl9Ci0JCQkJCWN0cmxfY29uZmlnc1tpXSA9IG5ldyBCdXR0b24oZywgU1dULlJBRElPKTsKLQkJCQkJY3RybF9jb25maWdzW2ldLnNldFRleHQobmFtZSk7Ci0JCQkJCXsKLQkJCQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKAotCQkJCQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJCQkJY3RybF9jb25maWdzW2ldLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQljdHJsX25ld19jb25maWcgPSBuZXcgVGV4dChnLCBTV1QuQk9SREVSKTsKLQkJCXsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJCQljdHJsX25ld19jb25maWcuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQl9Ci0KLQkJCS8vIHNldCBpbWFnZSBhbmQgdGl0bGUKLQkJCXN1cGVyCi0JCQkJCS5nZXRTaGVsbCgpCi0JCQkJCS5zZXRUZXh0KAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLk9wZW5Db25maWdEaWFsb2dvcGVuY29uZmlnX3RleHQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gYXJlYTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJc2VlbGN0ZWROYW1lID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdHJsX2NvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjdHJsX2NvbmZpZ3NbaV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlzZWVsY3RlZE5hbWUgPSBjdHJsX2NvbmZpZ3NbaV0uZ2V0VGV4dCgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNlZWxjdGVkTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoc2VlbGN0ZWROYW1lLmVxdWFscyhORVdfQ09ORklHX1RFWFQpKSB7Ci0JCQlzZWVsY3RlZE5hbWUgPSBjdHJsX25ld19jb25maWcuZ2V0VGV4dCgpOwotCQl9Ci0KLQkJaWYgKHNlZWxjdGVkTmFtZSA9PSBudWxsIHx8IHNlZWxjdGVkTmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0aW9uKCkgewotCQlpZiAoc3VwZXIub3BlbigpID09IERpYWxvZy5PSykgewotCQkJcmV0dXJuIHNlZWxjdGVkTmFtZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9SZW5hbWVGaWxlQ29uZmxpY3REaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1JlbmFtZUZpbGVDb25mbGljdERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZmE5MWZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1JlbmFtZUZpbGVDb25mbGljdERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBPcGVucyBkaWFsb2cgdG8gYXR0YWNoIGN0cmxfZmlsZXBhdGhzCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCS8qKgotCSAqIFRoZSBPSyBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQotCS8qKgotCSAqIFRoZSBDYW5jZWwgYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY2FuY2VsQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIG92ZXJ3cml0ZSBidXR0b24KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG92ZXJXcml0ZUJ1dHRvbjsKLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0KLQlwcml2YXRlIFRleHQgY3RybF9maWxlTmFtZTsKLQotCXByaXZhdGUgaW50IE9WRVJfV1JJVEVfSUQgPSAyMjsKLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlU3RyOwotCXByaXZhdGUgU3RyaW5nIGZpbGVOYW1lOwotCXByaXZhdGUgQnV0dG9uIGJ1dHRvbl9yZXBsYWNlOwotCXByaXZhdGUgQnV0dG9uIGJ1dHRvbl91bmlxdWU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZGVzdGluYXRpb247Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgZGlhbG9nQXJlYS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGRpYWxvZ0FyZWEuZ2V0TGF5b3V0RGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDEwOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0NTA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJCi0JCS8vIENyZWF0ZSBtZXNzYWdlIGFyZWEuCi0JCQkJCQkKLQkJSW1hZ2UgaW1hZ2UgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKTsKLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIExhYmVsIGltYWdlTGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5VTEwpOwotICAgICAgICAgICAgaW1hZ2Uuc2V0QmFja2dyb3VuZChpbWFnZUxhYmVsLmdldEJhY2tncm91bmQoKSk7Ci0gICAgICAgICAgICBpbWFnZUxhYmVsLnNldEltYWdlKGltYWdlKTsKLSAgICAgICAgICAgIGltYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgICAgIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLSAgICAgICAgfQotCQkKLQkJTGFiZWwgbWVzc2FnZSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuV1JBUCk7Ci0JCWlmKG1lc3NhZ2VTdHIgIT0gbnVsbCl7Ci0JCQltZXNzYWdlLnNldFRleHQobWVzc2FnZVN0cik7Ci0JCX0KLQkJR3JpZERhdGEgZGF0YTEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YTEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQltZXNzYWdlLnNldExheW91dERhdGEoZGF0YTEpOwotCQkKLQkJTGFiZWwgZW1wdHkgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOyBlbXB0eS5zZXRUZXh0KCIiKTsKLQkJTGFiZWwgbm90ZSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCW5vdGUuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX2ljb25TZWN0aW9uX2ZpbGVOYW1lQ29uZmxpY3Rfbm90ZSk7Ci0JCUdyaWREYXRhIGRhdGEyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEyLmhvcml6b250YWxTcGFuID0gMjsKLQkJbm90ZS5zZXRMYXlvdXREYXRhKGRhdGEyKTsKLQkJCi0JCWVtcHR5ID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsgZW1wdHkuc2V0VGV4dCgiIik7Ci0JCUdyaWREYXRhIGRhdGEzID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEzLmhvcml6b250YWxTcGFuID0gMzsKLQkJZGF0YTMuaGVpZ2h0SGludCA9IDEwOwotCQllbXB0eS5zZXRMYXlvdXREYXRhKGRhdGEzKTsKLQkJCi0JCWVtcHR5ID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsgZW1wdHkuc2V0VGV4dCgiIik7Ci0JCUxhYmVsIHNlbGVjdEFjdGlvbiA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCXNlbGVjdEFjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfaWNvblNlY3Rpb25fZmlsZU5hbWVfc2VsZWN0QWN0aW9uX2xhYmVsKTsKLQkJR3JpZERhdGEgZGF0YTQgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YTQuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzZWxlY3RBY3Rpb24uc2V0TGF5b3V0RGF0YShkYXRhNCk7Ci0JCQotCQllbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7IGVtcHR5LnNldFRleHQoIiIpOwotCQlidXR0b25fcmVwbGFjZSA9IG5ldyBCdXR0b24oZGlhbG9nQXJlYSwgU1dULlJBRElPKTsKLQkJTGFiZWwgcmVwbGFjZV9sYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCXJlcGxhY2VfbGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX2ljb25TZWN0aW9uX2ZpbGVOYW1lX3JlcGxhY2VfbXNnKTsKLQkJYnV0dG9uX3JlcGxhY2Uuc2V0U2VsZWN0aW9uKHRydWUpOwotCi0JCWVtcHR5ID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTtlbXB0eS5zZXRUZXh0KCIiKTsKLQkJYnV0dG9uX3VuaXF1ZSA9IG5ldyBCdXR0b24oZGlhbG9nQXJlYSwgU1dULlJBRElPKTsKLQkJTGFiZWwgdW5pcXVlTGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQl1bmlxdWVMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfaWNvblNlY3Rpb25fZmlsZU5hbWVfdW5pcXVlX21zZyk7Ci0JCWJ1dHRvbl91bmlxdWUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCi0JCS8vQ3JlYXRlIGxhYmVsIGFyZWEuIC0tIFRPRE86IGZpbmQgZGlmZmVyZW50IHdheSBpbnN0ZWFkIG9mIGVtcHR5IGxhYmVscy4KLQkJZW1wdHkgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpO2VtcHR5LnNldFRleHQoIiIpOwotCQllbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7ZW1wdHkuc2V0VGV4dCgiIik7Ci0JCWN0cmxfZmlsZU5hbWUgPSBuZXcgVGV4dChkaWFsb2dBcmVhLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGExID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWdyaWREYXRhMS53aWR0aEhpbnQgPSAyMDA7Ci0JCWdyaWREYXRhMS52ZXJ0aWNhbEFsaWdubWVudD0gR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSOwotCQljdHJsX2ZpbGVOYW1lLnNldExheW91dERhdGEoZ3JpZERhdGExKTsKLQkJaWYoZmlsZU5hbWUgIT0gbnVsbCl7Ci0JCQljdHJsX2ZpbGVOYW1lLnNldFRleHQoZmlsZU5hbWUpOwotCQkJY3RybF9maWxlTmFtZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQljdHJsX2ZpbGVOYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChva0J1dHRvbiAhPSBudWxsKSB7Ci0JCQkJCW9rQnV0dG9uCi0JCQkJCQkJLnNldEVuYWJsZWQoY3RybF9maWxlTmFtZS5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCk7Ci0JCQkJfQotCQkJCWZpbGVOYW1lID0gY3RybF9maWxlTmFtZS5nZXRUZXh0KCk7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGVzdGluYXRpb24rRmlsZS5zZXBhcmF0b3IrZmlsZU5hbWUpOwotCQkJCWlmKGZpbGUuZXhpc3RzKCkpewotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9ZWxzZXsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYnV0dG9uX3JlcGxhY2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQljdHJsX2ZpbGVOYW1lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlidXR0b25fdW5pcXVlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJY3RybF9maWxlTmFtZS5zZXRFbmFibGVkKHRydWUpOwotCQkJCWZpbGVOYW1lID0gY3RybF9maWxlTmFtZS5nZXRUZXh0KCk7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGVzdGluYXRpb24rRmlsZS5zZXBhcmF0b3IrZmlsZU5hbWUpOwotCQkJCWlmKGZpbGUuZXhpc3RzKCkpewotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9ZWxzZXsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlzdXBlcgotCQkJCS5nZXRTaGVsbCgpCi0JCQkJLnNldFRleHQoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX2ljb25TZWN0aW9uX2ZpbGVOYW1lQ29uZmxpY3RfdGl0bGUpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYnV0dG9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBPSyBidXR0b24uCi0vLwkJY3JlYXRlQnV0dG9uKHBhcmVudCwgT1ZFUl9XUklURV9JRCwgCi0vLwkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX2ljb25TZWN0aW9uX2ZpbGVOYW1lX292ZXJXcml0ZSwgdHJ1ZSk7Ci0JCQotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIENyZWF0ZSB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgT0sgYnV0dG9uLgotCQlva0J1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY2FuY2VsQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKTsKLQotCQkvL1NldCBoZWxwIGNvbnRleHQgZm9yIHRoZSBvdmVyd3JpdGUgYnV0dG9uCi0vLwkJb3ZlcldyaXRlQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKE9WRVJfV1JJVEVfSUQpOwotCQkKLS8vCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRmlsZSBOYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aCgpIHsKLQkJcmV0dXJuIGZpbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGaWxlUGF0aChTdHJpbmcgZmlsZU5hbWUpewotCQl0aGlzLmZpbGVOYW1lPWZpbGVOYW1lOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQnV0dG9uQmFyKHBhcmVudCk7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmKGJ1dHRvbklkID09IE9WRVJfV1JJVEVfSUQpewotCQkJb3ZlcldyaXRlUHJlc3NlZCgpOwotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvdmVyV3JpdGVQcmVzc2VkKCkgewotCQlzZXRSZXR1cm5Db2RlKE9WRVJfV1JJVEVfSUQpOwotCQljbG9zZSgpOwotCX0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCQlmaWxlTmFtZSA9IG51bGw7Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VTdHIoKSB7Ci0JCXJldHVybiBtZXNzYWdlU3RyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VTdHIoU3RyaW5nIG1lc3NhZ2VTdHIpIHsKLQkJdGhpcy5tZXNzYWdlU3RyID0gbWVzc2FnZVN0cjsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RGVzdGlhdGlvbihTdHJpbmcgZGVzdGluYXRpb24pewotCQl0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvU2VjdGlvbnNPcmRlckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvU2VjdGlvbnNPcmRlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZjRkNjA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1NlY3Rpb25zT3JkZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLQotLyoqCi0gKiBEaWFsb2cgdG8gb3JkZXIgdGhlIHtAbGluayBTdGVwfXMuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25zT3JkZXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYmFzZUNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfdXAsIGN0cmxfZG93bjsKLQotCXByaXZhdGUgVGFibGUgY3RybF9zdGVwczsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgc3RlcHNUYWJsZVZpZXdlcjsKLQotCXByaXZhdGUgU2VjdGlvbkxpc3QgYWxsU2VjdGlvbnM7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXI7Ci0KLQkvLyBwcml2YXRlIFRhc2sgY29udGVudEVsZW1lbnQ7Ci0JcHJpdmF0ZSBDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlcjsKLQotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLQotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgY29tbWFuZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgPGNvZGU+QWR2YW5jZWRTZWFyY2hEaWFsb2c8L2NvZGU+IGdpdmViIHRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRyb2wuCi0JICovCi0JcHVibGljIFNlY3Rpb25zT3JkZXJEaWFsb2coU2hlbGwgcGFyZW50LCBDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCwKLQkJCUlBY3Rpb25NYW5hZ2VyIGFjdGlvbk1hbmFnZXIsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsCi0JCQlTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQl0aGlzLmFjdGlvbk1hbmFnZXIgPSBhY3Rpb25NYW5hZ2VyOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJYWxsU2VjdGlvbnMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYmFzZUNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJZmluYWwgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gNDsKLQkJYmFzZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCWJhc2VDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgbWVzc2FnZSwgNCk7Ci0KLQkJLy8gRW1wdHkgbGluZQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDQpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCBsYWJlbCwgMyk7Ci0KLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3N0ZXBzID0gbmV3IFRhYmxlKGJhc2VDb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwMDsKLQkJCWN0cmxfc3RlcHMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlpbml0UHJvdmlkZXJzKCk7Ci0KLQkJc3RlcHNUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3N0ZXBzKTsKLQkJc3RlcHNUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXIpOwotCQlzdGVwc1RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoc3RlcHNWaWV3ZXJMYWJlbFByb3ZpZGVyKTsKLQotCQlDb21wb3NpdGUgb3JkZXJCdXR0b25QYW5lID0gbmV3IENvbXBvc2l0ZShiYXNlQ29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCW9yZGVyQnV0dG9uUGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCW9yZGVyQnV0dG9uUGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCX0KLQotCQljdHJsX3VwID0gY3JlYXRlQnV0dG9uKG9yZGVyQnV0dG9uUGFuZSwgQXV0aG9yaW5nVUlUZXh0LlVQX0JVVFRPTl9URVhUKTsKLQkJY3RybF91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljdHJsX2Rvd24gPSBjcmVhdGVCdXR0b24ob3JkZXJCdXR0b25QYW5lLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ET1dOX0JVVFRPTl9URVhUKTsKLQkJY3RybF9kb3duLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkvLyBFbXB0eSBsaW5lCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMaW5lKGJhc2VDb21wb3NpdGUsIDQpOwotCi0JCXN1cGVyLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCWxvYWREYXRhKCk7Ci0KLQkJcmV0dXJuIGJhc2VDb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG5jb2wpIHsKLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5jb2w7Ci0JCWxpbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IG5Db2wpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5Db2w7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgT0sgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIENyZWF0ZSB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFByb3ZpZGVycygpIHsKLQkJc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAoYWxsU2VjdGlvbnMgPT0gbnVsbCkgewotCQkJCQlhbGxTZWN0aW9ucyA9IG5ldyBTZWN0aW9uTGlzdChjb250ZW50RWxlbWVudCwKLQkJCQkJCQlTZWN0aW9uTGlzdC5TVEVQU19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUyk7Ci0JCQkJfQotCQkJCXJldHVybiBhbGxTZWN0aW9ucy50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJc3RlcHNWaWV3ZXJMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICFjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpCi0JCQkJCQkuY29udGFpbnMoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KQotCQkJCQkJCQkJJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQl9IGVsc2UKLQkJCQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJfSBlbHNlCi0JCQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCi0JCWN0cmxfdXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCQlBcnJheUxpc3QgbW92ZVVwSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW92ZVVwSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQoCi0JCQkJCQljb250ZW50RWxlbWVudCwgbW92ZVVwSXRlbXMsIGFsbFNlY3Rpb25zLCAxKTsKLQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoY21kKTsKLQkJCQljb21tYW5kcy5hZGQoY21kKTsKLQotCQkJCXN0ZXBzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2Rvd24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJQXJyYXlMaXN0IG1vdmVEb3duSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW92ZURvd25JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCWNvbnRlbnRFbGVtZW50LCBtb3ZlRG93bkl0ZW1zLCBhbGxTZWN0aW9ucywgMCk7Ci0JCQkJYWN0aW9uTWFuYWdlci5leGVjdXRlKGNtZCk7Ci0JCQkJY29tbWFuZHMuYWRkKGNtZCk7Ci0KLQkJCQlzdGVwc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQotCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBpbml0aWFsIGRhdGEgZnJvbSBtb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3RlcHNUYWJsZVZpZXdlci5zZXRJbnB1dChjb250ZW50RWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCWFsbFNlY3Rpb25zLmFwcGx5KCk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JCWlmICghY29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gY29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlPYmplY3QgY21kID0gY29tbWFuZHMuZ2V0KGkpOwotCQkJCWlmIChjbWQgaW5zdGFuY2VvZiBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQpIHsKLQkJCQkJKChNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQpIGNtZCkudW5kbygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5jYW5jZWxQcmVzc2VkKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1VzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvVXNlckRlZmluZWREaWFncmFtRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmYmViYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvVXNlckRlZmluZWREaWFncmFtRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NHdWlkYW5jZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBEaWFsb2cgdG8gYXNzaWduIHVzZXIgZGVmaW5lZCBkaWFncmFtIHRvIHByb2Nlc3MgZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHJpdmF0ZSBCdXR0b24gYXNzaWduQURJbWFnZUJ1dHRvbiwgYXNzaWduQURESW1hZ2VCdXR0b24sCi0JCQlhc3NpZ25XUERJbWFnZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGNsZWFyQURJbWFnZUJ1dHRvbiwgY2xlYXJBRERJbWFnZUJ1dHRvbiwKLQkJCWNsZWFyV1BESW1hZ2VCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiB1c2VBREltYWdlQnV0dG9uLCB1c2VBRERJbWFnZUJ1dHRvbiwgdXNlV1BESW1hZ2VCdXR0b247Ci0KLQlwcml2YXRlIFRleHQgYWRJbWFnZVRleHQsIGFkZEltYWdlVGV4dCwgd3BkSW1hZ2VUZXh0OwotCi0JcHJpdmF0ZSBJRWRpdG9yUGFydCBlZGl0b3I7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYXJlYTsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBTdXBwb3J0aW5nTWF0ZXJpYWwgYWN0aXZpdHlEaWFncmFtLCBhY3Rpdml0eURldGFpbERpYWdyYW0sCi0JCQl3cGREaWFncmFtOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGJ1dHRvbldpZHRoSGludCA9IDYwOwotCQotCXByaXZhdGUgU2V0IGV4aXN0aW5nTGlzdDsKLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNXcmFwcGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIGlzV3JhcHBlZAotCSAqLwotCXB1YmxpYyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2coU2hlbGwgcGFyZW50LCBJRWRpdG9yUGFydCBlZGl0b3IsCi0JCQlBY3Rpdml0eSBhY3Rpdml0eSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gaXNXcmFwcGVkKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0KLQkJdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0JCXRoaXMuaXNXcmFwcGVkID0gaXNXcmFwcGVkOwotCQkKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQl0aGlzLmZpbHRlciA9IG5ldyBQcm9jZXNzR3VpZGFuY2VGaWx0ZXIoY29uZmlnLCBudWxsLCB0YWJOYW1lKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZUl0ZW1Qcm92aWRlcikgewotCQkJCQlTdHJpbmcgbmFtZSA9ICgoR3VpZGFuY2VJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopOwotCQkJCQlpZiAobmFtZQotCQkJCQkJCS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUykKLQkJCQkJCQkmJiAvLyROT04tTkxTLTEkCi0JCQkJCQkJISgoR3VpZGFuY2VJdGVtUHJvdmlkZXIpIG9iaikuZ2V0Q2hpbGRyZW4ob2JqKQotCQkJCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmICgob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCQkKLQkJZXhpc3RpbmdMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlhcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlmaW5hbCBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCg0LCBmYWxzZSk7Ci0JCWFyZWEuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCS8vIFVzZSBBRCBJbWFnZSBmb3IgcHVibGlzaGluZwotCQlMYWJlbCBibGFua0xhYmVsID0gbmV3IExhYmVsKGFyZWEsIFNXVC5OT05FKTsKLQkJYmxhbmtMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXVzZUFESW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGFyZWEsIFNXVC5DSEVDSyk7Ci0JCXVzZUFESW1hZ2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZSk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgYnV0dG9uR0QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJYnV0dG9uR0QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl1c2VBREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR0QpOwotCi0JCS8vIEFzc2lnbiBhY3Rpdml0eSBkaWFncmFtIGltYWdlCi0JCUxhYmVsIGFMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCWFMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZEltYWdlKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFkSW1hZ2VUZXh0ID0gbmV3IFRleHQoYXJlYSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQl8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludCA9IDMwMDsKLQkJYWRJbWFnZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJYXNzaWduQURJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULk5PTkUpOwotCQlhc3NpZ25BREltYWdlQnV0dG9uCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2Fzc2lnbkJ1dHRvbik7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgYnV0dG9uR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlidXR0b25HcmlkRGF0YS53aWR0aEhpbnQgPSBidXR0b25XaWR0aEhpbnQ7Ci0JCWFzc2lnbkFESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HcmlkRGF0YSk7Ci0KLQkJY2xlYXJBREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuTk9ORSk7Ci0JCWNsZWFyQURJbWFnZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsZWFyQnV0dG9uX3RleHQpOyAvLyROT04tTkxTLTEkCi0JCWNsZWFyQURJbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkdyaWREYXRhKTsKLQotCQkvLyBVc2UgQUREIEltYWdlIGZvciBwdWJsaXNoaW5nCi0JCWJsYW5rTGFiZWwgPSBuZXcgTGFiZWwoYXJlYSwgU1dULk5PTkUpOwotCQlibGFua0xhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJdXNlQURESW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGFyZWEsIFNXVC5DSEVDSyk7Ci0JCXVzZUFEREltYWdlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFEREltYWdlKTsgLy8kTk9OLU5MUy0xJAotCQlidXR0b25HRCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlidXR0b25HRC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXVzZUFEREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR0QpOwotCi0JCS8vIEFzc2lnbiBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbSBpbWFnZQotCQlhTGFiZWwgPSBuZXcgTGFiZWwoYXJlYSwgU1dULk5PTkUpOwotCQlhTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRkSW1hZ2UpOyAvLyROT04tTkxTLTEkCi0KLQkJYWRkSW1hZ2VUZXh0ID0gbmV3IFRleHQoYXJlYSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlhZGRJbWFnZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJYXNzaWduQURESW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGFyZWEsIFNXVC5OT05FKTsKLQkJYXNzaWduQURESW1hZ2VCdXR0b24KLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NpZ25BRERJbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkdyaWREYXRhKTsKLQotCQljbGVhckFEREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuTk9ORSk7Ci0JCWNsZWFyQURESW1hZ2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jbGVhckJ1dHRvbl90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQljbGVhckFEREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR3JpZERhdGEpOwotCi0JCS8vIFVzZSBXUEQgSW1hZ2UgZm9yIHB1Ymxpc2hpbmcKLQkJYmxhbmtMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCWJsYW5rTGFiZWwuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQl1c2VXUERJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULkNIRUNLKTsKLQkJdXNlV1BESW1hZ2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlV1BESW1hZ2UpOyAvLyROT04tTkxTLTEkCi0JCWJ1dHRvbkdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyApOwotCQlidXR0b25HRC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXVzZVdQREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR0QpOwotCi0JCS8vIEFzc2lnbiB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtIGltYWdlCi0JCWFMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCWFMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZSk7IC8vJE5PTi1OTFMtMSQKLQotCQl3cGRJbWFnZVRleHQgPSBuZXcgVGV4dChhcmVhLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXdwZEltYWdlVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlhc3NpZ25XUERJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULk5PTkUpOwotCQlhc3NpZ25XUERJbWFnZUJ1dHRvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b24pOyAvLyROT04tTkxTLTEkCi0JCWFzc2lnbldQREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR3JpZERhdGEpOwotCi0JCWNsZWFyV1BESW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGFyZWEsIFNXVC5OT05FKTsKLQkJY2xlYXJXUERJbWFnZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsZWFyQnV0dG9uX3RleHQpOyAvLyROT04tTkxTLTEkCi0JCWNsZWFyV1BESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HcmlkRGF0YSk7Ci0KLQkJLy8gbG9hZERhdGEKLQkJbG9hZERhdGEoKTsKLQkJCi0JCS8vIGRpc2FibGVDb250cm9scwotCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChhY3Rpdml0eSkgfHwgaXNXcmFwcGVkKXsKLQkJCWRpc2FibGVDb250cm9scygpOwotCQl9Ci0KLQkJLy8gYWRkIGxpc3RlbmVycwotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyBzZXQgaW1hZ2UgYW5kIHRpdGxlCi0JCXN1cGVyCi0JCQkJLmdldFNoZWxsKCkKLQkJCQkuc2V0VGV4dCgKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ190aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gYXJlYTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNhYmxlIGNvbnRyb2xzCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzYWJsZUNvbnRyb2xzKCkKLQl7Ci0JCXVzZUFESW1hZ2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXVzZUFEREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl1c2VXUERJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCWFzc2lnbkFESW1hZ2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWFzc2lnbkFEREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlhc3NpZ25XUERJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCWNsZWFyQURJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY2xlYXJBRERJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY2xlYXJXUERJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7CQkKLQkJLy8JIGxvYWQgZXhpc3Rpbmcgc3VwcG9ydGluZyBtYXRlcmlhbHMgbGlzdAotCQlleGlzdGluZ0xpc3QuYWRkQWxsKGFjdGl2aXR5LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKSk7Ci0KLQkJCi0JCURpYWdyYW1JbmZvIGluZm8gPSBuZXcgRGlhZ3JhbUluZm8oYWN0aXZpdHkpOwotCQlpZiAoaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSAhPSBudWxsKSB7Ci0JCQlhZEltYWdlVGV4dC5zZXRUZXh0KFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChpbmZvCi0JCQkJCS5nZXRBY3Rpdml0eURpYWdyYW0oKSkpOwotCQkJYWN0aXZpdHlEaWFncmFtID0gaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKTsKLQkJCQotCQkJZXhpc3RpbmdMaXN0LmFkZChhY3Rpdml0eURpYWdyYW0pOwotCQl9Ci0JCWlmIChpbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpICE9IG51bGwpIHsKLQkJCWFkZEltYWdlVGV4dC5zZXRUZXh0KFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChpbmZvCi0JCQkJCS5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSkpOwotCQkJYWN0aXZpdHlEZXRhaWxEaWFncmFtID0gaW5mby5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKTsKLQkJCQotCQkJZXhpc3RpbmdMaXN0LmFkZChhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQl9Ci0JCWlmIChpbmZvLmdldFdQRERpYWdyYW0oKSAhPSBudWxsKSB7Ci0JCQl3cGRJbWFnZVRleHQKLQkJCQkJLnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGluZm8uZ2V0V1BERGlhZ3JhbSgpKSk7Ci0JCQl3cGREaWFncmFtID0gaW5mby5nZXRXUEREaWFncmFtKCk7Ci0JCQkKLQkJCWV4aXN0aW5nTGlzdC5hZGQod3BkRGlhZ3JhbSk7Ci0JCX0KLQotCQl1c2VBREltYWdlQnV0dG9uLnNldFNlbGVjdGlvbihpbmZvLmNhblB1Ymxpc2hBREltYWdlKCkpOwotCQl1c2VBRERJbWFnZUJ1dHRvbi5zZXRTZWxlY3Rpb24oaW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKSk7Ci0JCXVzZVdQREltYWdlQnV0dG9uLnNldFNlbGVjdGlvbihpbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJYXNzaWduQURJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwgc20gPSBvcGVuRmlsdGVyRGlhbG9nKCk7Ci0JCQkJCWlmIChzbSAhPSBudWxsKSB7Ci0JCQkJCQlhY3Rpdml0eURpYWdyYW0gPSBzbTsKLQkJCQkJCWFkSW1hZ2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKHNtKSk7Ci0JCQkJCQlleGlzdGluZ0xpc3QuYWRkKGFjdGl2aXR5RGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlhc3NpZ25BRERJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwgc20gPSBvcGVuRmlsdGVyRGlhbG9nKCk7Ci0JCQkJCWlmIChzbSAhPSBudWxsKSB7Ci0JCQkJCQlhY3Rpdml0eURldGFpbERpYWdyYW0gPSBzbTsKLQkJCQkJCWFkZEltYWdlVGV4dC5zZXRUZXh0KFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChzbSkpOwotCQkJCQkJZXhpc3RpbmdMaXN0LmFkZChhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYXNzaWduV1BESW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3VwcG9ydGluZ01hdGVyaWFsIHNtID0gb3BlbkZpbHRlckRpYWxvZygpOwotCQkJCQlpZiAoc20gIT0gbnVsbCkgewotCQkJCQkJd3BkRGlhZ3JhbSA9IHNtOwotCQkJCQkJd3BkSW1hZ2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKHNtKSk7Ci0JCQkJCQlleGlzdGluZ0xpc3QuYWRkKHdwZERpYWdyYW0pOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY2xlYXJBREltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWV4aXN0aW5nTGlzdC5yZW1vdmUoYWN0aXZpdHlEaWFncmFtKTsKLQkJCQlhZEltYWdlVGV4dC5zZXRUZXh0KCIiKTsKLQkJCQlhY3Rpdml0eURpYWdyYW0gPSBudWxsOwotCQkJfQotCQl9KTsKLQotCQljbGVhckFEREltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWV4aXN0aW5nTGlzdC5yZW1vdmUoYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQkJCQlhZGRJbWFnZVRleHQuc2V0VGV4dCgiIik7Ci0JCQkJYWN0aXZpdHlEZXRhaWxEaWFncmFtID0gbnVsbDsKLQkJCX0KLQkJfSk7Ci0KLQkJY2xlYXJXUERJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlleGlzdGluZ0xpc3QucmVtb3ZlKHdwZERpYWdyYW0pOwotCQkJCXdwZEltYWdlVGV4dC5zZXRUZXh0KCIiKTsKLQkJCQl3cGREaWFncmFtID0gbnVsbDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhIGZpbHRlciBkaWFsb2cKLQkgKi8KLQlwcml2YXRlIFN1cHBvcnRpbmdNYXRlcmlhbCBvcGVuRmlsdGVyRGlhbG9nKCkgewotCQotCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIGZpbHRlciwgYWN0aXZpdHksCi0JCQkJRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTLCBBcnJheXMuYXNMaXN0KGV4aXN0aW5nTGlzdC50b0FycmF5KCkpKTsKLQkJCi0JCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJZmQuc2V0SW5wdXQoVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBhY3Rpdml0eSkpOwotCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZmQub3BlbigpOwotCi0JCUxpc3QgbGlzdCA9IGZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJaWYgKChsaXN0ICE9IG51bGwpICYmICghbGlzdC5pc0VtcHR5KCkpKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoMCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJcmV0dXJuIChTdXBwb3J0aW5nTWF0ZXJpYWwpIG9iajsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChhY3Rpdml0eSkgfHwgaXNXcmFwcGVkKXsKLQkJCS8vIHRoZW4gZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4uIGp1c3QgcmV0dXJuCi0JCQlzdXBlci5va1ByZXNzZWQoKTsKLQkJfQotCQlib29sZWFuIGVkaXRvckRpcnR5ID0gZmFsc2U7Ci0JCURpYWdyYW1JbmZvIGluZm8gPSBuZXcgRGlhZ3JhbUluZm8oYWN0aXZpdHkpOwotCi0JCS8vIHNldCBhY3Rpdml0eSBkaWFncmFtCi0JCWlmIChhY3Rpdml0eURpYWdyYW0gIT0gaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSkgewotCQkJZWRpdG9yRGlydHkgPSB0cnVlOwotCQl9Ci0JCWluZm8uc2V0QWN0aXZpdHlEaWFncmFtKGFjdGl2aXR5RGlhZ3JhbSk7Ci0KLQkJLy8gc2V0IGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0JCWlmICghZWRpdG9yRGlydHkpIHsKLQkJCWlmIChhY3Rpdml0eURldGFpbERpYWdyYW0gIT0gaW5mby5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSkKLQkJCQllZGl0b3JEaXJ0eSA9IHRydWU7Ci0JCX0KLQkJaW5mby5zZXRBY3Rpdml0eURldGFpbERpYWdyYW0oYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQotCQkvLyBzZXQgd29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbQotCQlpZiAoIWVkaXRvckRpcnR5KSB7Ci0JCQlpZiAod3BkRGlhZ3JhbSAhPSBpbmZvLmdldFdQRERpYWdyYW0oKSkKLQkJCQllZGl0b3JEaXJ0eSA9IHRydWU7Ci0JCX0KLQkJaW5mby5zZXRXUEREaWFncmFtKHdwZERpYWdyYW0pOwotCi0JCS8vIHNldCBjYW4gcHVibGlzaCBmbGFnIGZvciBhY3Rpdml0eSBkaWFncmFtCi0JCWJvb2xlYW4gb2xkQ2FuUHVibGlzaEZsYWcgPSBpbmZvLmNhblB1Ymxpc2hBREltYWdlKCk7Ci0JCWJvb2xlYW4gbmV3Q2FuUHVibGlzaEZsYWcgPSB1c2VBREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlpZiAoKCFlZGl0b3JEaXJ0eSkgJiYgKG9sZENhblB1Ymxpc2hGbGFnICE9IG5ld0NhblB1Ymxpc2hGbGFnKSkKLQkJCWVkaXRvckRpcnR5ID0gdHJ1ZTsKLQkJaW5mby5zZXRQdWJsaXNoQURJbWFnZSh1c2VBREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotCQkvLyBzZXQgY2FuIHB1Ymxpc2ggZmxhZyBmb3IgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0KLQkJb2xkQ2FuUHVibGlzaEZsYWcgPSBpbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpOwotCQluZXdDYW5QdWJsaXNoRmxhZyA9IHVzZUFEREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlpZiAoKCFlZGl0b3JEaXJ0eSkgJiYgKG9sZENhblB1Ymxpc2hGbGFnICE9IG5ld0NhblB1Ymxpc2hGbGFnKSkKLQkJCWVkaXRvckRpcnR5ID0gdHJ1ZTsKLQkJaW5mby5zZXRQdWJsaXNoQURESW1hZ2UodXNlQURESW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCi0JCS8vIHNldCBjYW4gcHVibGlzaCBmbGFnIGZvciB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtCi0JCW9sZENhblB1Ymxpc2hGbGFnID0gaW5mby5jYW5QdWJsaXNoV1BESW1hZ2UoKTsKLQkJbmV3Q2FuUHVibGlzaEZsYWcgPSB1c2VXUERJbWFnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCghZWRpdG9yRGlydHkpICYmIChvbGRDYW5QdWJsaXNoRmxhZyAhPSBuZXdDYW5QdWJsaXNoRmxhZykpCi0JCQllZGl0b3JEaXJ0eSA9IHRydWU7Ci0JCWluZm8uc2V0UHVibGlzaFdQREltYWdlKHVzZVdQREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVEaXRvciBkaXJ0eT0iICsgZWRpdG9yRGlydHkpOwotCQlpZiAoZWRpdG9yRGlydHkpIHsKLQotCQkJaWYgKCFwcm9tcHRTYXZlQWN0aXZlRWRpdG9yKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlzYXZlQWN0aXZlRWRpdG9yKCk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcm9tcHRTYXZlQWN0aXZlRWRpdG9yKCkgewotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gaWYgKGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHRpdGxlLCBtZXNzYWdlKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZUFjdGl2ZUVkaXRvcigpIHsKLQkJLy8gc2F2ZSB0aGUgZWRpdG9yCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCSgoUHJvY2Vzc0VkaXRvcikgZWRpdG9yKS5yZXNvdXJjZXNUb1NhdmUKLQkJCQkJCQkJLmFkZCgoKFByb2Nlc3NDb21wb25lbnQpICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBlZGl0b3IKLQkJCQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0TWV0aG9kRWxlbWVudCgpKQotCQkJCQkJCQkJCS5nZXRQcm9jZXNzKCkuZVJlc291cmNlKCkpOwotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzYXZpbmcuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZWRpdG9yLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2F2aW5nIGRvbmUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQl9KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1ZhcmlhYmlsaXR5U2VsZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9WYXJpYWJpbGl0eVNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NjIzZTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1ZhcmlhYmlsaXR5U2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogVGhlIGRpYWxvZyBmb3Igc2hvd2luZyBhbmQgcG9zc2libHkgc2VsZWN0aW5nIGFueSB2YXJpYWJpbGl0eSByZWxhdGVkIHRvIHRoZQotICogZ2l2ZW4gZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJpbGl0eVNlbGVjdGlvbiB7Ci0KLQlwcml2YXRlIEhhc2hTZXQgZmlsdGVyRWxlbWVudExpc3QgPSBuZXcgSGFzaFNldCgpOwotCi0JcHJpdmF0ZSBjbGFzcyBWYXJpYWJpbGl0eUZpbHRlciBleHRlbmRzIEFsbEZpbHRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlPYmplY3QgY29udGVudEVsZW1lbnQgPSBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iai5lcXVhbHMoaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpICE9IG51bGwpIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucygKLQkJCQkJCQkoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmopKSB7Ci0JCQkJCWlmICgoKEN1c3RvbUNhdGVnb3J5KSBvYmopLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkJCS5pc0VtcHR5KCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJaWYgKE1ldGhvZEVsZW1lbnRVdGlsLmdldEFsbE1vZGVscyhjb250ZW50RWxlbWVudCkKLQkJCQkJCQkJLmNvbnRhaW5zKG9iaikpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciBpb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBpb3IubmV4dCgpOwotCQkJCQlpZiAoKChDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKSkKLQkJCQkJCWlvci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAoKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KQotCQkJCQkmJiBmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucyhvYmopKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogRGlzcGxheSB2YXJpYWJpbGl0eSBzZWxlY3Rpb24gZGlhbG9nIHdoaWNoIGxpc3RzIGVsZW1lbnRzIGFuZCBpdCdzCi0JICogdmFyaWFiaWxpdGllcy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlTZWxlY3Rpb24oKSB7Ci0JfQotCi0JLyoqCi0JICogSXQgc2hvd3MgZGlhbG9nIGJveCBmb3IgYWxsIHRoZSBjb250cmlidXRvcnMuIFVzZXIgaXMgZXhwZWN0ZWQgdG8gc2VsZWN0Ci0JICogb25lLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJT2JqZWN0IHNlbGVjdGVkIGJ5IHVzZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkVmFyaWFiaWxpdHkoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQpIHsKLQkJU2V0IGVsZW1lbnRTZXQgPSBuZXcgSGFzaFNldCgpOwotCQllbGVtZW50U2V0LmFkZChlbGVtZW50KTsKLQkJZWxlbWVudFNldCA9IEFzc29jaWF0aW9uSGVscGVyLmdldFZhcmlhYmlsaXR5RWxlbWVudHMoZWxlbWVudFNldCwgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJZmlsdGVyRWxlbWVudExpc3QuYWRkQWxsKGVsZW1lbnRTZXQpOwotCQlpZiAoIWVsZW1lbnRTZXQuaXNFbXB0eSgpKSB7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGVsZW1lbnRTZXQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIGl0b3IubmV4dCgpOwotCQkJCUxpc3QgZ3JvdXBpbmdzID0gbnVsbDsKLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJCWdyb3VwaW5ncyA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldERpc2NpcGxpbmVHcm91cHMoKERpc2NpcGxpbmUpIGNvbnRlbnRFbGVtZW50KTsKLQotCQkJCX0KLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQkJCWdyb3VwaW5ncyA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJZ3JvdXBpbmdzID0gZ2V0QW5jZXN0b3JzKChDdXN0b21DYXRlZ29yeSljb250ZW50RWxlbWVudCk7Ci0JCQkJfQotCi0JCQkJaWYgKChncm91cGluZ3MgIT0gbnVsbCkgJiYgKCFncm91cGluZ3MuaXNFbXB0eSgpKSkKLQkJCQkJZmlsdGVyRWxlbWVudExpc3QuYWRkQWxsKGdyb3VwaW5ncyk7Ci0KLQkJCX0KLQotCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgVmFyaWFiaWxpdHlGaWx0ZXIoKTsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbXSB7IEZpbHRlckNvbnN0YW50cy5DT05GSUdfQ09OVEVOVF9FTEVNRU5UIH07Ci0JCQlJdGVtc0ZpbHRlckRpYWxvZyBkbGcgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0JCQlkbGcuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQlkbGcuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLkNPTkZJR19DT05URU5UX0VMRU1FTlQpOwotCQkJZGxnLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCWRsZy5zZXRUeXBlcyhzdHIpOwotCQkJZGxnLnNldElucHV0KFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgZWxlbWVudCkpOwotCQkJZGxnLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikpLAotCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldEl0ZW1zRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0KLQkJCVN0cmluZyBlbGVtZW50TmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQKLQkJCQkJJiYgUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5pc1Nob3dQcmVzZW50YXRpb25OYW1lcygpKSB7Ci0JCQkJaWYgKCgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KS5nZXRQcmVzZW50YXRpb25OYW1lKCkudHJpbSgpCi0JCQkJCQkubGVuZ3RoKCkgPiAwKQotCQkJCQllbGVtZW50TmFtZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KQotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQl9Ci0JCQlkbGcKLQkJCQkJLnNldFZpZXdlckxhYmVsKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsLCAobmV3IFN0cmluZ1tdIHsgZWxlbWVudE5hbWUgfSkpKTsKLQotCQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZUZvcm1hdAotCQkJCQkuZm9ybWF0KAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGVsZW1lbnROYW1lIH0pOwotCi0JCQlkbGcuc2V0VGl0bGUodGl0bGUpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLm9wZW4oKTsKLQotCQkJTGlzdCByZXN1bHQgPSBkbGcuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCQkJaWYgKChyZXN1bHQgPT0gbnVsbCkgfHwgKHJlc3VsdC5pc0VtcHR5KCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJZWxzZQotCQkJCXJldHVybiByZXN1bHQuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFuY2VzdG9ycyBmb3IgdGhlIGdpdmVuIEN1c3RvbSBDYXRlZ29yeS4KLQkgKiB0YWtlbiBmcm9tIGF1dGhvcmluZy51aS5DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2UKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0QW5jZXN0b3JzKEN1c3RvbUNhdGVnb3J5IG1ldGhvZE9iamVjdCkgewotCQlMaXN0IGFuY2VzdG9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBvYmpMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlvYmpMaXN0LmFkZChtZXRob2RPYmplY3QpOwotCQlnZXRBbmNlc3RvcnMoYW5jZXN0b3JMaXN0LCBvYmpMaXN0KTsKLQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0QW5jZXN0b3JzKExpc3QgYW5jZXN0b3JMaXN0LCBMaXN0IG1ldGhvZE9iamVjdExpc3QpIHsKLQkJaWYgKG1ldGhvZE9iamVjdExpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQotCQlMaXN0IGFsbFBhcmVudEN1c3RDYXRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGhvZE9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDdXN0b21DYXRlZ29yeSBlbGVtZW50ID0gKEN1c3RvbUNhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCUxpc3QgcGFyZW50TGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoZWxlbWVudCk7Ci0JCQlhbGxQYXJlbnRDdXN0Q2F0cy5hZGRBbGwocGFyZW50TGlzdCk7Ci0JCX0KLQotCQlhbmNlc3Rvckxpc3QuYWRkQWxsKG1ldGhvZE9iamVjdExpc3QpOwotCQlMaXN0IG5leHRDaGVja0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbFBhcmVudEN1c3RDYXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghYW5jZXN0b3JMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJbmV4dENoZWNrTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZ2V0QW5jZXN0b3JzKGFuY2VzdG9yTGlzdCwgbmV4dENoZWNrTGlzdCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzQzNzExOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBkaWFsb2dzIGZvciB0aGUgQXV0aG9yaW5nIFVJLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL0VkaXRpbmdEb21haW5UYWJsZVRyZWVWaWV3ZXJEcm9wQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzE0OTEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRyYWdBbmREcm9wRmVlZGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIERyb3AgYWRhcHRlciBmb3IgZHJhZyBhbmQgZHJvcAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyIGV4dGVuZHMKLQkJRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyIHsKLQotCXB1YmxpYyBFZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKGRvbWFpbiwgdmlld2VyKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlciNkcmFnRW50ZXIob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX05PTkUpIHsKLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJc3VwZXIuZHJhZ0VudGVyKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIjZHJhZ092ZXIob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTk9ORSkgewotCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCi0JCXN1cGVyLmRyYWdPdmVyKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIjZHJvcEFjY2VwdChvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX05PTkUpIHsKLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQotCQlzdXBlci5kcm9wQWNjZXB0KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIjaGVscGVyKG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhlbHBlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJVGFibGUgdGFibGUgPSBudWxsOwotCQlUYWJsZUl0ZW0gaXRlbSA9IG51bGw7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVRyZWVWaWV3ZXIpIHsKLQkJCXRhYmxlID0gKChUYWJsZVRyZWVWaWV3ZXIpIHZpZXdlcikuZ2V0VGFibGVUcmVlKCkuZ2V0VGFibGUoKTsKLQkJCWl0ZW0gPSB0YWJsZS5nZXRJdGVtKHRhYmxlLnRvQ29udHJvbChldmVudC54LCBldmVudC55KSk7Ci0JCQlldmVudC5pdGVtID0gaXRlbTsKLQkJfQotCi0JCXN1cGVySGVscGVyKGV2ZW50KTsKLQotCQlpZiAoaXRlbSAhPSBudWxsICYmIChldmVudC5mZWVkYmFjayAmIERORC5GRUVEQkFDS19TRUxFQ1QpICE9IDApIHsKLQkJCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyBpdGVtIH0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGRyb3AgdGFyZ2V0Ci0JICogCi0JICogQHBhcmFtIGl0ZW0KLQkgKiBAcmV0dXJuIGRyb3AgdGFyZ2V0IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0RHJvcFRhcmdldChXaWRnZXQgaXRlbSkgewotCQlyZXR1cm4gRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyLmV4dHJhY3REcm9wVGFyZ2V0KGl0ZW0pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGRyb3AgYWN0aW9uIHNob3VsZCBiZSBpbnZva2VkLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlciNkcm9wKG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCS8vIEEgY29tbWFuZCB3YXMgY3JlYXRlZCBpZiB0aGUgc291cmNlIHdhcyBhdmFpbGFibGUgZWFybHksIGFuZCB0aGUKLQkJLy8gaW5mb3JtYXRpb24gdXNlZCB0byBjcmVhdGUgaXQgd2FzIGNhY2hlZC4uLgotCQlpZiAoZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gIT0gbnVsbCkgewotCQkJLy8gUmVjcmVhdGUgdGhlIGNvbW1hbmQuCi0JCQljb21tYW5kID0gZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24uY3JlYXRlQ29tbWFuZCgpOwotCQl9IGVsc2UgewotCQkJLy8gT3RoZXJ3aXNlLCB0aGUgc291cmNlIHNob3VsZCBiZSBhdmFpbGFibGUgbm93IGFzIGV2ZW50LmRhdGEsIGFuZAotCQkJLy8gd2UgY2FuIGNyZWF0ZSB0aGUgY29tbWFuZC4KLQkJCXNvdXJjZSA9IGV4dHJhY3REcmFnU291cmNlKGV2ZW50LmRhdGEpOwotCQkJT2JqZWN0IHRhcmdldCA9IGdldERyb3BUYXJnZXQoZXZlbnQuaXRlbSk7Ci0JCQljb21tYW5kID0gRHJhZ0FuZERyb3BDb21tYW5kLmNyZWF0ZShkb21haW4sIHRhcmdldCwKLQkJCQkJZ2V0TG9jYXRpb24oZXZlbnQpLCBldmVudC5vcGVyYXRpb25zLCBvcmlnaW5hbE9wZXJhdGlvbiwKLQkJCQkJc291cmNlKTsKLQkJfQotCi0JCS8vIElmIHRoZSBjb21tYW5kIGNhbiBleGVjdXRlLi4uCi0JCWlmIChjb21tYW5kLmNhbkV4ZWN1dGUoKSkgewotCQkJLy8gRXhlY3V0ZSBpdC4KLQkJCWRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQl9IGVsc2UgewotCQkJLy8gT3RoZXJ3aXNlLCBsZXQncyBjYWxsIHRoZSB3aG9sZSB0aGluZyBvZmYuCi0JCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJY29tbWFuZC5kaXNwb3NlKCk7Ci0JCX0KLQotCQkvLyBDbGVhbiB1cCB0aGUgc3RhdGUuCi0JCWNvbW1hbmQgPSBudWxsOwotCQljb21tYW5kVGFyZ2V0ID0gbnVsbDsKLQkJc291cmNlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdGhlIHNhbWUgd2F5IGZvciBlYWNoIG9mIHRoZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRMaXN0ZW5lcn0gbWV0aG9kcywgZXhjZXB0IGZvciBsZWF2ZQotCSAqIGFuZCBkcm9wLiBJZiB0aGUgc291cmNlIGlzIGF2YWlsYWJsZSBlYXJseSwgaXQgY3JlYXRlcyBvciByZXZhbGlkYXRlcyB0aGUKLQkgKiB7QGxpbmsgRHJhZ0FuZERyb3BDb21tYW5kfSwgYW5kIHVwZGF0ZXMgdGhlIGV2ZW50J3MgZGV0YWlsIChvcGVyYXRpb24pCi0JICogYW5kIGZlZWRiYWNrIChkcmFnIHVuZGVyIGVmZmVjdCksIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3VwZXJIZWxwZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCS8vIElmIHdlIGNhbid0IGRvIGFueXRoaW5nIGVsc2UsIHdlJ2xsIHByb3ZpZGUgdGhlIGRlZmF1bHQgc2VsZWN0Ci0JCS8vIGZlZWRiYWNrIGFuZCBlbmFibGUgYXV0by1zY3JvbGwgYW5kIGF1dG8tZXhwYW5kIGVmZmVjdHMuCi0JCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NFTEVDVCB8IGdldEF1dG9GZWVkYmFjaygpOwotCi0JCS8vIElmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBpdCwgdHJ5IHRvIGdldCB0aGUgc291cmNlIGVhcmx5LiBXZSBjYW4ndAotCQkvLyBnaXZlIGZlZWRiYWNrIGlmIGl0J3Mgbm90IGF2YWlsYWJsZSB5ZXQgKHRoaXMgaXMgcGxhdGZvcm0tZGVwZW5kZW50KS4KLQkJaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0JCQlzb3VyY2UgPSBnZXREcmFnU291cmNlKGV2ZW50KTsKLQkJCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBHZXQgdGhlIHRhcmdldCBvYmplY3QgZnJvbSB0aGUgaXRlbSB3aWRnZXQgYW5kIHRoZSBtb3VzZSBsb2NhdGlvbiBpbgotCQkvLyBpdC4KLQkJT2JqZWN0IHRhcmdldCA9IGdldERyb3BUYXJnZXQoZXZlbnQuaXRlbSk7Ci0JCWZsb2F0IGxvY2F0aW9uID0gZ2V0TG9jYXRpb24oZXZlbnQpOwotCi0JCS8vIERldGVybWluZSBpZiB3ZSBjYW4gY3JlYXRlIGEgdmFsaWQgY29tbWFuZCBhdCB0aGUgY3VycmVudCBsb2NhdGlvbi4KLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0JCS8vIElmIHdlIGRvbid0IGhhdmUgYSBwcmV2aW91cyBjYWNoZWQgY29tbWFuZC4uLgotCQlpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0JCQkvLyBXZSdsbCBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGluZm9ybWF0aW9uIHdlIHVzZSB0byBjcmVhdGUgdGhlCi0JCQkvLyBjb21tYW5kLCBzbyB0aGF0IHdlIGNhbiByZWNyZWF0ZSBpdCBpbiBkcm9wLgotCQkJZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gPSBuZXcgRHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24oCi0JCQkJCWRvbWFpbiwgdGFyZ2V0LCBsb2NhdGlvbiwgZXZlbnQub3BlcmF0aW9ucywKLQkJCQkJb3JpZ2luYWxPcGVyYXRpb24sIHNvdXJjZSk7Ci0KLQkJCS8vIFJlbWVtYmVyIHRoZSB0YXJnZXQ7IGNyZWF0ZSB0aGUgY29tbWFuZCBhbmQgdGVzdCBpZiBpdCBpcwotCQkJLy8gZXhlY3V0YWJsZS4KLQkJCWNvbW1hbmRUYXJnZXQgPSB0YXJnZXQ7Ci0JCQljb21tYW5kID0gZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24uY3JlYXRlQ29tbWFuZCgpOwotCQkJdmFsaWQgPSBjb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIENoZWNrIGlmIHRoZSBjYWNoZWQgY29tbWFuZCBjYW4gcHJvdmlkZSBETkQKLQkJCS8vIGZlZWRiYWNrL3JldmFsaWRhdGlvbi4KLQkJCWlmICh0YXJnZXQgPT0gY29tbWFuZFRhcmdldAotCQkJCQkmJiBjb21tYW5kIGluc3RhbmNlb2YgRHJhZ0FuZERyb3BGZWVkYmFjaykgewotCQkJCS8vIElmIHNvLCByZXZhbGlkYXRlIHRoZSBjb21tYW5kLgotCQkJCXZhbGlkID0gKChEcmFnQW5kRHJvcEZlZWRiYWNrKSBjb21tYW5kKS52YWxpZGF0ZSh0YXJnZXQsCi0JCQkJCQlsb2NhdGlvbiwgZXZlbnQub3BlcmF0aW9ucywgb3JpZ2luYWxPcGVyYXRpb24sIHNvdXJjZSk7Ci0KLQkJCQkvLyBLZWVwIHRyYWNrIG9mIGFueSBjaGFuZ2VzIHRvIHRoZSBjb21tYW5kIGluZm9ybWF0aW9uLgotCQkJCWRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uID0gbmV3IERyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uKAotCQkJCQkJZG9tYWluLCB0YXJnZXQsIGxvY2F0aW9uLCBldmVudC5vcGVyYXRpb25zLAotCQkJCQkJb3JpZ2luYWxPcGVyYXRpb24sIHNvdXJjZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIElmIG5vdCwgZGlzcG9zZSB0aGUgY3VycmVudCBjb21tYW5kIGFuZCBjcmVhdGUgYSBuZXcgb25lLgotCQkJCWRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uID0gbmV3IERyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uKAotCQkJCQkJZG9tYWluLCB0YXJnZXQsIGxvY2F0aW9uLCBldmVudC5vcGVyYXRpb25zLAotCQkJCQkJb3JpZ2luYWxPcGVyYXRpb24sIHNvdXJjZSk7Ci0JCQkJY29tbWFuZFRhcmdldCA9IHRhcmdldDsKLQkJCQljb21tYW5kLmRpc3Bvc2UoKTsKLQkJCQljb21tYW5kID0gZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24uY3JlYXRlQ29tbWFuZCgpOwotCQkJCXZhbGlkID0gY29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBJZiB0aGlzIGNvbW1hbmQgY2FuIHByb3ZpZGUgZGV0YWlsZWQgZHJhZyBhbmQgZHJvcCBmZWVkYmFjay4uLgotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIERyYWdBbmREcm9wRmVlZGJhY2spIHsKLQkJCS8vIFVzZSBpdCBmb3IgdGhlIG9wZXJhdGlvbiBhbmQgZHJhZyB1bmRlciBlZmZlY3QuCi0JCQlEcmFnQW5kRHJvcEZlZWRiYWNrIGRyYWdBbmREcm9wRmVlZGJhY2sgPSAoRHJhZ0FuZERyb3BGZWVkYmFjaykgY29tbWFuZDsKLQkJCWV2ZW50LmRldGFpbCA9IGRyYWdBbmREcm9wRmVlZGJhY2suZ2V0T3BlcmF0aW9uKCk7Ci0JCQlldmVudC5mZWVkYmFjayA9IGRyYWdBbmREcm9wRmVlZGJhY2suZ2V0RmVlZGJhY2soKQotCQkJCQl8IGdldEF1dG9GZWVkYmFjaygpOwotCQl9IGVsc2UgaWYgKCF2YWxpZCkgewotCQkJLy8gVGhlcmUgaXMgbm8gZXhlY3V0YWJsZSBjb21tYW5kLCBzbyB3ZSdkIGJldHRlciBuaXggdGhlIHdob2xlCi0JCQkvLyBkZWFsLgotCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RuZC9MaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlNjE3NjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RuZC9MaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuVmlld2VyRHJhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5IVE1MVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhlIGRyYWcgYWRhcHRlciBmb3IgdGhlIExpYnJhcnkgVmlld2VyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWaWV3ZXJEcmFnQWRhcHRlciBleHRlbmRzIFZpZXdlckRyYWdBZGFwdGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWRpdG9yRHJhZ0FkYXB0ZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXIoVmlld2VyIHZpZXdlcikgewotCQlzdXBlcih2aWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIGRyYWdnaW5nIGlzIGluaXRpYXRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmRyYWdTdGFydChldmVudCk7Ci0JCWV2ZW50LmRvaXQgPSAhdmlld2VyLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gdHJhbnNmZXIgdGhlIGRhdGEuCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlPYmplY3RbXSBzZWxlY3RlZEVsZW1lbnRzID0gc2VsZWN0aW9uLnRvTGlzdCgpLnRvQXJyYXkoCi0JCQkJCW5ldyBPYmplY3Rbc2VsZWN0aW9uLnNpemUoKV0pOwotCQkJaWYgKHNlbGVjdGVkRWxlbWVudHMgIT0gbnVsbCAmJiBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoc2VsZWN0ZWRFbGVtZW50c1swXSk7Ci0JCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJU3RyaW5nIGxpbmtUZXh0ID0gZ2V0SHlwZXJsaW5rKChNZXRob2RFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpOwkJCQkJCi0JCQkJCWlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCQkJCWV2ZW50LmRhdGEgPSBuZXcgU3RyaW5nKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKGxpbmtUZXh0KSk7CQkJCQkJCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlldmVudC5kYXRhID0gbGlua1RleHQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gCi0JCWlmIChUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlPYmplY3RbXSBzZWxlY3RlZEVsZW1lbnRzID0gc2VsZWN0aW9uLnRvTGlzdCgpLnRvQXJyYXkoCi0JCQkJCW5ldyBPYmplY3Rbc2VsZWN0aW9uLnNpemUoKV0pOwotCQkJaWYgKHNlbGVjdGVkRWxlbWVudHMgIT0gbnVsbCAmJiBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoc2VsZWN0ZWRFbGVtZW50c1swXSk7Ci0JCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJU3RyaW5nIGxpbmtUZXh0ID0gZ2V0SHlwZXJsaW5rKChNZXRob2RFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpOwkJCQkJCi0JCQkJCWlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCQkJCWV2ZW50LmRhdGEgPSBuZXcgU3RyaW5nKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKGxpbmtUZXh0KSk7CQkJCQkJCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlldmVudC5kYXRhID0gbGlua1RleHQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZHJhZ1NldERhdGEoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGh5cGVybGluayBmb3IgdGhlIGdpdmVuIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SHlwZXJsaW5rKE1ldGhvZEVsZW1lbnQgZHJhZ0VsZW1lbnQpIHsKLQkJTWV0aG9kRWxlbWVudCBkcm9wRWxlbWVudCA9IG51bGw7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yID0gYWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJaWYgKGFjdGl2ZUVkaXRvciAhPSBudWxsKSB7Ci0JCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBhY3RpdmVFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCWRyb3BFbGVtZW50ID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KQotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYoZHJhZ0VsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KXsKLQkJCWRyYWdFbGVtZW50ID0gKChQcm9jZXNzQ29tcG9uZW50KWRyYWdFbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCX0KLQotCQlTdHJpbmcgaHJlZiA9IFJlc291cmNlSGVscGVyLmdldFVybChkcmFnRWxlbWVudCwgZHJvcEVsZW1lbnQsICIuaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50TGluayhkcmFnRWxlbWVudCwgdHJ1ZSwKLQkJCQkiZmlsZTovLyIgKyBocmVmKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RuZC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzg1N2Y1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRyYWcgYW5kIGRyb3Agc3VwcG9ydCBmb3IgdGhlIEF1dGhvcmluZyBVSS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9BYnN0cmFjdEJhc2VGb3JtRWRpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9BYnN0cmFjdEJhc2VGb3JtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0MjU5MWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWJzdHJhY3RCYXNlRm9ybUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIG1ldGhvZCBlZGl0b3JzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCYXNlRm9ybUVkaXRvciBleHRlbmRzIEZvcm1FZGl0b3IgewotCi0JLy8gR2xvYmFsIG1hcCB1c2VkIHRvIHJlY29yZCB3aGljaCBlZGl0b3IgbW9kaWZpZXMgdGhlIHNoYXJlZCByZXNvdXJjZQotCS8vIGZpcnN0LgotCS8vIFRoaXMgZW5hYmxlcyB0aGUgYXBwcm9wcmlhdGUgZWRpdG9ycyB0byBiZSBmbGFnZ2VkIGFzIGRpcnR5LgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTWFwIFNIQVJFRF9SRVNPVVJDRV9UT19FRElUT1JTX01BUCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBJZiB0cnVlLCBkZWJ1ZyB0cmFjaW5nIGlzIGVuYWJsZWQuCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8vIENvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZWwgZGF0YSBiZWluZyBlZGl0ZWQgYnkKLQkvLyB0aGlzIGVkaXRvci4KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiByZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdEJhc2VGb3JtRWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3IjYWRkUGFnZXMoKQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZFBhZ2VzKCk7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHNhdmluZyBsaWJyYXJ5OiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlQXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVBc0FsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJcmV0dXJuIG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5TW9kaWZpZWQoKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBlZGl0b3IuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGVkaXRvcidzIGRpcnR5IHN0YXRlIGJ5IGFkZGluZyBhICIqIiB0byB0aGUgZWRpdG9yIHRhYiBhbmQKLQkgKiBlbmFibGluZyB0aGUgU2F2ZSBidXR0b24uCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlRGlydHlTdGF0dXMoKSB7Ci0JCXN1cGVyLmVkaXRvckRpcnR5U3RhdGVDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9BYnN0cmFjdERpYWdyYW1FZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0RGlhZ3JhbUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YWE2NzliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0RGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVCZW5kcG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNyZWF0ZUxpbmtDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNyZWF0ZU5vZGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLk1vdmVCZW5kcG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5EaWFncmFtQWN0aW9uU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkZyZWVUZXh0Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuU3luY2hCYXJOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5GcmVlVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuRGlhZ3JhbVByaW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLlByb2Nlc3NEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLktleUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLktleVN0cm9rZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZG5kLlRlbXBsYXRlVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmRuZC5UZW1wbGF0ZVRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkNvcHlUZW1wbGF0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYWxldHRlLlBhbGV0dGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhbGV0dGUuUGFsZXR0ZVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYWxldHRlLkZseW91dFBhbGV0dGVDb21wb3NpdGUuRmx5b3V0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbEVkaXRvcldpdGhGbHlvdXRQYWxldHRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5HcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRm9udERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIGRpYWdyYW0gZWRpdG9ycwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBKaW0gVGhhcmlvCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REaWFncmFtRWRpdG9yIGV4dGVuZHMKLQkJR3JhcGhpY2FsRWRpdG9yV2l0aEZseW91dFBhbGV0dGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0hfRlJPTV9CQVNFX0FDVElWSVRZID0gInJlZnJlc2hfZnJvbV9iYXNlX2FjdGl2aXR5IjsgLy8kTk9OLU5MUy0xJAotCS8vIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX0hPUlpfQVZFUkFHRSA9Ci0JLy8gImFsaWduX2hvcml6b250YWxfdG9fYXZlcmFnZSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEID0KLQkvLyAiYWxpZ25faG9yaXpvbnRhbF90b19maXJzdF9zZWxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fVkVSVF9BVkVSQUdFID0KLQkvLyAiYWxpZ25fdmVydGljYWxfdG9fYXZlcmFnZSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEID0KLQkvLyAiYWxpZ25fdmVydGljYWxfdG9fZmlyc3Rfc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTlRfRElBTE9HID0gImZvbnRfZGlhbG9nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9MSU5LID0gImNyZWF0ZV9saW5rIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9MSU5LID0gInNlbGVjdF9saW5rIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9CRU5EX1BPSU5UID0gImNyZWF0ZV9iZW5kX3BvaW50IjsgLy8kTk9OLU5MUy0xJAkKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9GUkVFX1RFWFQgPSAiY3JlYXRlX2ZyZWVfdGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkUgPSAibW92ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0ggPSAicmVmcmVzaCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX0JFTkRfUE9JTlQgPSAiYWxpZ25fYmVuZF9wb2ludCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBTEVUVEVfRE9DS19MT0NBVElPTiA9ICJEb2NrIGxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFMRVRURV9TSVpFID0gIlBhbGV0dGUgU2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBTEVUVEVfU1RBVEUgPSAiUGFsZXR0ZSBzdGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUEFMRVRURV9TSVpFID0gMTMwOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0RJQUdSQU0gPSAiZGVsZXRlX2FjdHZpdHlfZGV0YWlsX2RpYWdyYW0iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEtleUhhbmRsZXIgc2hhcmVkS2V5SGFuZGxlcjsKLQotCXByaXZhdGUgUGFsZXR0ZVJvb3QgcGFsZXR0ZVJvb3Q7Ci0KLQlwcm90ZWN0ZWQgRWRpdFBhcnQgZWRpdFBhcnQ7Ci0KLQlwcml2YXRlIENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIgY21kU3RhY2tFdmVudExpc3RlbmVyOwotCi0JcHJvdGVjdGVkIENyZWF0aW9uRmFjdG9yeSBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByb3RlY3RlZCBEaWFncmFtQWN0aW9uU2VydmljZSBhY3Rpb25TZXJ2aWNlID0gbnVsbDsKLQkKLQotCS8qKgotCSAqIFRoZSBwYXJlbnQgaXMgdGhlIGVkaXRvciBmcm9tIHdoZXJlIHRoZSB1c2VyIG9wZW5lZCB0aGlzIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgcGFyZW50RWRpdG9yID0gbnVsbDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBsaXN0ZW4gZm9yIG91ciBwYXJlbnQgZWRpdG9yIGFuZCBvdXIgb3duIGNsb3NpbmcuIFdoZW4gaXQKLQkgKiBkb2VzLCB3ZSBhc2sgdGhlIHVzZXIgaWYgdGhleSB3YW50IHRvIGNsb3NlIHRoaXMgZGlhZ3JhbSBhcyB3ZWxsLgotCSAqLwotCXByb3RlY3RlZCBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9IG5ldyBJUGFydExpc3RlbmVyKCkgewotCQlJRWRpdG9yUGFydCBtZSA9IEFic3RyYWN0RGlhZ3JhbUVkaXRvci50aGlzOwotCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJLy8gY2hlY2sgaWYgdGhlIGVkaXRvciBjbG9zZWQgYXMgYSByZXN1bHQgb2YgdXNlciBhY3Rpb24gb3IgdGhlCi0JCQkvLyB3b3JrYmVuY2ggY2xvc2luZwotCQkJLy8gSVdvcmtiZW5jaCB3YiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCQlpZiAocGFydCA9PSBtZSkgewotCQkJCXNldFBhcmVudEVkaXRvcihudWxsKTsKLQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJCQlwYWdlLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCQkJCS8vIHJlbW92ZSB0aGlzIGRpYWdyYW0gaWYgaXQgaXMgbmV3Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pICgoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkuZ2V0Q29udGVudHMoKSkuZ2V0TW9kZWwoKTsKLQkJCQkvLyBtYWtlIHN1cmUgd2UgcmVtb3ZlIHRoZSBVTUEgZGlhZ3JhbSBmcm9tIHRoZSBtb2RlbCBpZiBpdCBpcwotCQkJCS8vIG5ldyAobmV2ZXIgc2F2ZWQpCi0JCQkJaWYgKGRpYWdyYW0uaXNOZXcoKSkgewotCQkJCQlpZiAoZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkgIT0gbnVsbCkgewotCQkJCQlFY29yZVV0aWwucmVtb3ZlKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJfQotCQkJCQlpZihpc1Jlc291cmNlQ2hhbmdlZEJ5T3RoZXIoKSkgewotCQkJCQlkb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBlbHNlIGlmICghd2IuaXNDbG9zaW5nKCkpIHsKLQkJCS8vIC8vIGFyZSB3ZSBiZWluZyBub3RpZmllZCBhYm91dCBvdXIgcGFyZW50IGVkaXRvciBvYmplY3Q/Ci0JCQkvLyBpZiAoZ2V0UGFyZW50RWRpdG9yKCkgIT0gbnVsbCkgewotCQkJLy8gaWYgKHBhcnQgPT0gZ2V0UGFyZW50RWRpdG9yKCkpIHsKLQkJCS8vIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQkJLy8gLy8geWVzLCBhc2sgdGhlIHVzZXIgaWYgdGhleSB3YW50IHRvIGNsb3NlIHRoaXMKLQkJCS8vIC8vIGVkaXRvcgotCQkJLy8gaWYgKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkvLyAuZ2V0RGVmYXVsdCgpCi0JCQkvLyAuZ2V0TXNnRGlhbG9nKCkKLQkJCS8vIC5kaXNwbGF5UHJvbXB0KAotCQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzCi0JCQkvLyAuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWJzdHJhY3REaWFncmFtRWRpdG9yLlBhcmVudEVkaXRvckNsb3NlLnRpdGxlIiksCi0JCQkvLyAvLyROT04tTkxTLTEkCi0JCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMKLQkJCS8vIC5mb3JtYXRTdHJpbmcoCi0JCQkvLyAiRGlhZ3JhbVVJLkFic3RyYWN0RGlhZ3JhbUVkaXRvci5QYXJlbnRFZGl0b3JDbG9zZS50ZXh0IiwKLQkJCS8vIGdldFBhcmVudEVkaXRvcigpLmdldFRpdGxlKCksIG1lLmdldFRpdGxlKCkpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyAvLyB5ZXMsIGNsb3NlIHRoaXMgZGlhZ3JhbSwgYXNrIHRvIHNhdmUgY2hhbmdlcwotCQkJLy8gcGFnZS5jbG9zZUVkaXRvcihtZSwgdHJ1ZSk7Ci0JCQkvLyB9Ci0JCQkvLyAvLyBlaXRoZXIgd2F5LCBvdXIgcGFyZW50IGlzIGNsb3NlZCBhbmQgd2UgY2FuIHN0b3AKLQkJCS8vIC8vIGxpc3RlbmluZwotCQkJLy8gcGFnZS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBGb250IGZvbnQ7Ci0KLQlwcml2YXRlIENvbG9yIGNvbG9yOwotCi0JcHJpdmF0ZSBDb21tYW5kIHJlZnJlc2hGcm9tQmFzZUNvbW1hbmQgPSBuZXcgQ29tbWFuZChEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlKSB7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBBcnJheUxpc3Qgb2xkQ29udGVudCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0KLQkJCS8vIGJhY2sgdXAgb2xkIGRpYWdyYW0gY29udGVudAotCQkJLy8KLQkJCW9sZENvbnRlbnQuY2xlYXIoKTsKLQkJCW9sZENvbnRlbnQuYWRkQWxsKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpKTsKLQotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZWZyZXNoRnJvbUJhc2UoZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJaWYgKGVkaXRQYXJ0LmlzQWN0aXZlKCkpIHsKLQkJCQllZGl0UGFydC5kZWFjdGl2YXRlKCk7Ci0JCQl9Ci0JCQlkaWFncmFtLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJY3JlYXRlRWRpdFBhcnQoKTsKLQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCWRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpLmNsZWFyKCk7Ci0JCQlkaWFncmFtLmdldFVNQURpYWdyYW0oKS5nZXRDb250YWluZWQoKS5hZGRBbGwob2xkQ29udGVudCk7Ci0JCQlpZiAoZWRpdFBhcnQuaXNBY3RpdmUoKSkgewotCQkJCWVkaXRQYXJ0LmRlYWN0aXZhdGUoKTsKLQkJCX0KLQkJCWRpYWdyYW0ucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQljcmVhdGVFZGl0UGFydCgpOwotCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBNYXAgdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXA7Ci0JLyoqCi0JICogUmVjb3JkcyB0aW1lIHdoZW4gdGhlIG1vZGVsIGZpcnN0IGhhcyBiZWVuIGNoYW5nZWQgYnkgdGhpcyBlZGl0b3IuIFRoaXMgd2lsbCBiZSB1c2VkIGxhdGVyCi0JICogdG8gZGV0ZXJtaW5lIGlmIHNhdmUgaXMgbmVlZGVkIHRvIHJldmVyc2UgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIGxvbmcgY2hhbmdlVGltZSA9IC0xOwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWc7Ci0KLQljbGFzcyBEaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciBleHRlbmRzIENvbnRleHRNZW51UHJvdmlkZXIgewotCi0JCXByaXZhdGUgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnk7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgV29ya2Zsb3dDb250ZXh0TWVudVByb3ZpZGVyIGFzc29pY2F0ZWQgd2l0aCB0aGUgZ2l2ZW4KLQkJICogdmlld2VyIGFuZCBhY3Rpb24gcmVnaXN0cnkuCi0JCSAqIAotCQkgKiBAcGFyYW0gdmlld2VyCi0JCSAqICAgICAgICAgICAgdGhlIHZpZXdlcgotCQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkJICogICAgICAgICAgICB0aGUgYWN0aW9uIHJlZ2lzdHJ5Ci0JCSAqLwotCQlwdWJsaWMgRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIoRWRpdFBhcnRWaWV3ZXIgdmlld2VyLAotCQkJCUFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlzdXBlcih2aWV3ZXIpOwotCQkJc2V0QWN0aW9uUmVnaXN0cnkocmVnaXN0cnkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgQ29udGV4dE1lbnVQcm92aWRlciNidWlsZENvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBidWlsZENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCQlHRUZBY3Rpb25Db25zdGFudHMuYWRkU3RhbmRhcmRBY3Rpb25Hcm91cHMobWVudSk7Ci0KLQkJCUlBY3Rpb24gYWN0aW9uOwotCQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCkpOwotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5HUk9VUF9VTkRPLCBhY3Rpb24pOwotCi0JCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSk7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX1VORE8sIGFjdGlvbik7Ci0KLQkJCWJvb2xlYW4gY2FuTW9kaWZ5ID0gIWlzUmVhZE9ubHkoKTsKLQotCQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKQotCQkJCQkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQlpZiAoIVRuZ1V0aWwuaXNMb2NrZWQoZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpKSkgewotCQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX0VESVQsIGFjdGlvbik7Ci0JCQkJfQotCQkJfQotCi0JCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKTsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuR1JPVVBfVklFVywgYWN0aW9uKTsKLQotCQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oRk9OVF9ESUFMT0cpOwotCQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJCX0KLQotCQkJSUFjdGlvbiBjcmVhdGVGcmVlVGV4dEFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQlDUkVBVEVfRlJFRV9URVhUKTsKLQkJCWlmIChjcmVhdGVGcmVlVGV4dEFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCWNyZWF0ZUZyZWVUZXh0QWN0aW9uKTsKLQkJCX0KLQotCQkJLy8gSUFjdGlvbiBtb3ZlQWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oTU9WRSk7Ci0JCQkvLyBpZihtb3ZlQWN0aW9uLmlzRW5hYmxlZCgpKXsKLQkJCS8vIG1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLG1vdmVBY3Rpb24pOwotCQkJLy8gfQotCQkJSUFjdGlvbiBsaW5rQWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0xJTkspOwotCQkJaWYgKGxpbmtBY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGxpbmtBY3Rpb24pOwotCQkJfQotCQkJSUFjdGlvbiBzZWxlY3RsaW5rQWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCVNFTEVDVF9MSU5LKTsKLQkJCWlmIChzZWxlY3RsaW5rQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQlzZWxlY3RsaW5rQWN0aW9uKTsKLQkJCX0KLQkJCUlBY3Rpb24gYmVuZHBvaW50QWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCUNSRUFURV9CRU5EX1BPSU5UKTsKLQkJCWlmIChiZW5kcG9pbnRBY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQliZW5kcG9pbnRBY3Rpb24pOwotCQkJfQotCQkJSUFjdGlvbiBhbGlnbmJlbmRwb2ludGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQlBTElHTl9CRU5EX1BPSU5UKTsKLQkJCWlmIChhbGlnbmJlbmRwb2ludGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCWFsaWduYmVuZHBvaW50YWN0aW9uKTsKLQkJCX0KLQkJCQotCQkJLy9QcmludCBBY3Rpb24gZm9yIGRpYWdyYW0gdGhyb3VnaCBDb250ZXh0IE1lbnUuCi0JCQkvLyBFbmFibGUgdGhpcyBjb2RlIHdoZW4gcHJpbnQgcmVxdWlyZWQgZm9yIGRpYWdyYW0uCi0vLwkJCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuUFJJTlQuZ2V0SWQoKSk7Ci0vLwkJCWlmKGFjdGlvbi5pc0VuYWJsZWQoKSl7Ci0vLwkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX1BSSU5ULCBhY3Rpb24pOwotLy8JCQl9Ci0JCQkKLQkJCWNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KG1lbnUpOwotCQl9Ci0KLQkJcHJpdmF0ZSBBY3Rpb25SZWdpc3RyeSBnZXRBY3Rpb25SZWdpc3RyeSgpIHsKLQkJCXJldHVybiBhY3Rpb25SZWdpc3RyeTsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBhY3Rpb24gcmVnaXN0cnkKLQkJICogCi0JCSAqIEBwYXJhbSByZWdpc3RyeQotCQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gcmVnaXN0cnkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEFjdGlvblJlZ2lzdHJ5KEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlhY3Rpb25SZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3REaWFncmFtRWRpdG9yKCkgewotCQlzdXBlcigpOwotCQlzZXRFZGl0RG9tYWluKG5ldyBEZWZhdWx0RWRpdERvbWFpbih0aGlzKSk7Ci0JCWdldEVkaXREb21haW4oKS5zZXRDb21tYW5kU3RhY2sobmV3IENvbW1hbmRTdGFjaygpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSBnZXRVbmRvQ29tbWFuZCgpOwotCQkJCWlmIChjbWQgIT0gbnVsbCAmJiAhY21kLmNhblVuZG8oKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5pc0RpcnR5KCk7Ci0JCQl9Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjayNleGVjdXRlKG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJCWlmKGNvbW1hbmQgPT0gbnVsbCB8fCAhY29tbWFuZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZihjaGFuZ2VUaW1lID09IC0xKSB7Ci0JCQkJCWNoYW5nZVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQkJc3VwZXIuZXhlY3V0ZShjb21tYW5kKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gYWRkIENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIKLQkJLy8KLQkJY21kU3RhY2tFdmVudExpc3RlbmVyID0gbmV3IENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHN0YWNrQ2hhbmdlZChDb21tYW5kU3RhY2tFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXREZXRhaWwoKSA9PSBDb21tYW5kU3RhY2suUE9TVF9FWEVDVVRFKSB7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQkJZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpLmFkZENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIoCi0JCQkJY21kU3RhY2tFdmVudExpc3RlbmVyKTsKLQkJLy8gYWRkIG91ciBwYXJ0IGxpc3RlbmVyIGlmIGVpdGhlciBwYXJlbnQgb3IgdGhpcyBjbG9zZXMKLQkJSVdvcmtiZW5jaCB3YiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luID0gd2IuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW4uZ2V0QWN0aXZlUGFnZSgpOwotCQlwYWdlLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbEVkaXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlnZXRDb21tYW5kU3RhY2soKQotCQkJCS5yZW1vdmVDb21tYW5kU3RhY2tFdmVudExpc3RlbmVyKGNtZFN0YWNrRXZlbnRMaXN0ZW5lcik7Ci0KLQkJaWYgKGlzRGlydHkoKSkgewotCQkJLy8gY2hhbmdlcyBkaXNjYXJkZWQsIHJldmVyc2UgdG8gc2F2ZWQKLQkJCS8vCi0JCQlyZXZlcnNlVG9TYXZlZCgpOwotCQl9Ci0KLQkJaWYgKGVkaXRQYXJ0ICE9IG51bGwpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCWRpYWdyYW0ucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkgewotCQkJZm9udC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbG9yICE9IG51bGwgJiYgIWNvbG9yLmlzRGlzcG9zZWQoKSkgewotCQkJY29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJfQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVzb3VyY2VDaGFuZ2VkQnlPdGhlcigpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkuZVJlc291cmNlKCk7Ci0JCWlmKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkpewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJcmV0dXJuIGZpbGUubGFzdE1vZGlmaWVkKCkgPiBjaGFuZ2VUaW1lOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmV2ZXJzZVRvU2F2ZWQoKSB7Ci0JCS8vIHNhdmUgdGhlIHVuZG9uZSBjaGFuZ2VzIG9ubHkgaWYgdGhlIHJlc291cmNlIGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB0aGlzIGVkaXRvcgotCQkvLwotCQlib29sZWFuIHNhdmVOZWVkZWQgPSBnZXRDb21tYW5kU3RhY2soKS5pc0RpcnR5KCkgJiYgaXNSZXNvdXJjZUNoYW5nZWRCeU90aGVyKCk7Ci0JCWNoYW5nZVRpbWUgPSAtMTsKLQkJd2hpbGUgKGdldENvbW1hbmRTdGFjaygpLmlzRGlydHkoKSkgewotCQkJZ2V0Q29tbWFuZFN0YWNrKCkudW5kbygpOwotCQl9Ci0JCWlmIChzYXZlTmVlZGVkKSB7Ci0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJdHJ5IHsKLQkJCQlwZXJzaXN0ZXIuc2F2ZShnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkuZVJlc291cmNlKCkpOwotCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJVmlld0hlbHBlci5yZWxvYWRDdXJyZW50TGlicmFyeShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVRvQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJYm9vbGVhbiBjYW5Nb2RpZnkgPSAhaXNSZWFkT25seSgpOwotCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCVJFRlJFU0hfRlJPTV9CQVNFX0FDVElWSVRZKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0JCS8vIHRoZSBhbGlnbiBtZW51IGlzIGEgY2FzY2FkaW5nIG1lbnUKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY2kgPSBjcmVhdGVBbGlnbk1lbnUoKTsKLQkJaWYgKGNpLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudQotCQkJCQkuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQkJCW5ldyBTZXBhcmF0b3IoKSk7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgY2kpOwotCQkJbWVudQotCQkJCQkuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQkJCW5ldyBTZXBhcmF0b3IoKSk7Ci0JCX0KLQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oREVMRVRFX0RJQUdSQU0pOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudQotCQkJCQkuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQkJCW5ldyBTZXBhcmF0b3IoKSk7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJCW1lbnUKLQkJCQkJLmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCQluZXcgU2VwYXJhdG9yKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElDb250cmlidXRpb25JdGVtIGNyZWF0ZUFsaWduTWVudSgpIHsKLQkJLy8gY3JlYXRlIGEgbmV3IG1lbnUgbWFuYWdlciBmb3IgdGhlIGNhc2NhZGluZyBtZW51Ci0JCU1lbnVNYW5hZ2VyIGFsaWduTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dCkgeyAvLyROT04tTkxTLTEkCi0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlpbnQgdG90YWwgPSAwOwotCQkJCS8vIGVuYWJsZSB0aGUgbWVudSBvbmx5IGlmIDIgb3IgbW9yZSBub2RlcyBvciBub2RlIGNvbnRhaW5lcnMKLQkJCQkvLyBhcmUgc2VsZWN0ZWQKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJLy8gbmVlZCBhdCBsZWFzdCB0d28gdGhpbmdzIHNlbGVjdGVkIHRvIGFsaWduCi0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPiAxKSB7Ci0JCQkJCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldChhKTsKLQkJCQkJCS8vIHdlIGNhbiBhbGlnbiBub2RlcyBhbmQgY29udGFpbmVycwotCQkJCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCQkJCXx8IGVkaXRQYXJ0IGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJCQkJLy8gYWRkIHVwIHRoZSBlbGVtZW50cyB3ZSBuZWVkLCB0aGVyZSBtYXkgYmUgbW9yZQotCQkJCQkJCS8vIGVsZW1lbnRzIHNlbGVjdGVkIChsaW5rcywgZXRjLikKLQkJCQkJCQl0b3RhbCsrOwotCQkJCQkJCWlmICh0b3RhbCA+IDEpIHsKLQkJCQkJCQkJLy8gd2Ugb25seSBuZWVkIHRvIGtub3cgdGhlcmUgaXMgbW9yZSB0aGFuIDEsIHNvCi0JCQkJCQkJCS8vIHdlIGNhbiBzdG9wIGhlcmUKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0b3RhbCA+IDE7Ci0JCQl9Ci0JCX07Ci0JCS8vIGFkZCB0aGUgYWN0aW9ucyB0byB0aGlzIG1lbnUKLQkJYWxpZ25NZW51TWFuYWdlci5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UuQUxJR05fSE9SWl9BVkVSQUdFKSk7Ci0JCWFsaWduTWVudU1hbmFnZXIuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX0hPUlpfRklSU1RfU0VMRUNURUQpKTsKLQkJYWxpZ25NZW51TWFuYWdlci5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UuQUxJR05fVkVSVF9BVkVSQUdFKSk7Ci0JCWFsaWduTWVudU1hbmFnZXIuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQpKTsKLQkJcmV0dXJuIGFsaWduTWVudU1hbmFnZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZyb21CYXNlKCkgewotCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHJlZnJlc2hGcm9tQmFzZUNvbW1hbmQpOwotCi0JCS8vIERpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkvLyBHcmFwaGljYWxEYXRhSGVscGVyLnJlZnJlc2hGcm9tQmFzZShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCS8vIE9iamVjdCBhY3QgPSBkaWFncmFtLmdldE9iamVjdCgpOwotCQkvLyBpZihlZGl0UGFydC5pc0FjdGl2ZSgpKSB7Ci0JCS8vIGVkaXRQYXJ0LmRlYWN0aXZhdGUoKTsKLQkJLy8gfQotCQkvLyBkaWFncmFtLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkvLyBlZGl0UGFydCA9IGNyZWF0ZUVkaXRQYXJ0KGFjdCk7Ci0JCS8vIGdldEdyYXBoaWNhbFZpZXdlcigpLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0KLQkJQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRBY3Rpb25SZWdpc3RyeSgpOwotCQlJQWN0aW9uIGFjdGlvbjsKLQotCQkvLyByZXBsYWNlIGRlZmF1bHQgZGVsZXRlIGFjdGlvbiB3aXRoIGEgY3VzdG9tIG9uZQotCQkvLwotCQlhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSk7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJcmVnaXN0cnkucmVtb3ZlQWN0aW9uKGFjdGlvbik7Ci0JCQlnZXRTZWxlY3Rpb25BY3Rpb25zKCkucmVtb3ZlKGFjdGlvbik7Ci0JCX0KLQkJYWN0aW9uID0gbmV3IERlbGV0ZUFjdGlvbigoSVdvcmtiZW5jaFBhcnQpIHRoaXMpIHsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5Xb3JrYmVuY2hQYXJ0QWN0aW9uI2lzRW5hYmxlZCgpCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlyZXR1cm4gc3VwZXIuaXNFbmFibGVkKCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuRGVsZXRlQWN0aW9uI2NhbGN1bGF0ZUVuYWJsZWQoKQotCQkJICovCi0JCQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVFbmFibGVkKCkgewotCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCkuaXRlcmF0b3IoKTsKLQkJCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkJLy8gT2JqZWN0IGVkaXRQYXJ0ID0gaXRlci5uZXh0KCk7Ci0JCQkvLyBpZihlZGl0UGFydCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkvLyBPYmplY3Qgb2JqID0gKChFZGl0UGFydCllZGl0UGFydCkuZ2V0TW9kZWwoKTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJLy8gT2JqZWN0IGVsZW1lbnQgPSAoKE5hbWVkTm9kZSlvYmopLmdldE9iamVjdCgpOwotCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCS8vIHJldHVybiBmYWxzZTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIHJldHVybiBzdXBlci5jYWxjdWxhdGVFbmFibGVkKCk7Ci0JCQkvLyB9Ci0JCQkvLyBUT0RPOiB1bmNvbW1lbnQgdGhpcyBjb2RlIGlmIHdlIGFyZSByZWFkeSB0byB0ZXN0IGRlbGV0aW5nCi0JCQkvLyBCcmVha2Rvd25FbGVtZW50IG5vZGUKLQkJCS8vCi0JCQkvLyAvKiAobm9uLUphdmFkb2MpCi0JCQkvLyAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuRGVsZXRlQWN0aW9uI3J1bigpCi0JCQkvLyAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVkaXRQYXJ0ID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gKChFZGl0UGFydCkgZWRpdFBhcnQpLmdldE1vZGVsKCk7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSAoKE5hbWVkTm9kZSkgb2JqKS5nZXRPYmplY3QoKTsKLQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCQlQcm9jZXNzRGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbiA9IG5ldyBQcm9jZXNzRGVsZXRlQWN0aW9uKCkgewotCQkJCQkJLyoKLQkJCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJCSAqIAotCQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNjcmVhdGVDb21tYW5kKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkJCQkJICovCi0JCQkJCQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQgY3JlYXRlQ29tbWFuZCgKLQkJCQkJCQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJCQlkb21haW4gPSBudWxsOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQkJCQkJZG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbigKLQkJCQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCQkJbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCkpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGRvbWFpbiA9PSBudWxsKSB7Ci0JCQkJCQkJCWRvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQoc2VsZWN0aW9uKTsKLQkJCQkJCX0KLQotCQkJCQl9OwotCQkJCQlkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCWVsZW1lbnRzKSk7Ci0JCQkJCWRlbGV0ZUFjdGlvbi5ydW4oKTsKLQkJCQkJaWYgKGRlbGV0ZUFjdGlvbi5pc0RlbGV0aW9uQ29uZmlybWVkKCkpIHsKLQkJCQkJCXN1cGVyLnJ1bigpOwotCi0JCQkJCQkvLyBzYXZlIHRoZSBlZGl0b3IKLQkJCQkJCS8vIAotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkJCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlkb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0KLQotCQkJCX0gZWxzZSB7Ci0JCQkJCXN1cGVyLnJ1bigpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0KLQkJYWN0aW9uID0gbmV3IENvcHlUZW1wbGF0ZUFjdGlvbih0aGlzKTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQkvLyByZWZyZXNoIGRpYWdyYW0gZnJvbSBiYXNlIGFjdGlvbgotCQkvLwotCQlhY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBSRUZSRVNIX0ZST01fQkFTRV9BQ1RJVklUWTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJlZnJlc2hGcm9tQmFzZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCk7Ci0JCQkJcmV0dXJuIGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQkvLyBhY3Rpb24gPSBuZXcgTWF0Y2hXaWR0aEFjdGlvbih0aGlzKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0KLQkJLy8gYWN0aW9uID0gbmV3IE1hdGNoSGVpZ2h0QWN0aW9uKHRoaXMpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQotCQkvLyBhY3Rpb24gPSBuZXcgTG9naWNQYXN0ZVRlbXBsYXRlQWN0aW9uKHRoaXMpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQotCQkvLyBhY3Rpb24gPSBuZXcgSW5jcmVtZW50RGVjcmVtZW50QWN0aW9uKHRoaXMsIHRydWUpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJLy8KLQkJLy8gYWN0aW9uID0gbmV3IEluY3JlbWVudERlY3JlbWVudEFjdGlvbih0aGlzLCBmYWxzZSk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgRGlyZWN0RWRpdEFjdGlvbigoSVdvcmtiZW5jaFBhcnQpdGhpcyk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgQWxpZ25tZW50QWN0aW9uKChJV29ya2JlbmNoUGFydCl0aGlzLAotCQkvLyBQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLlJJR0hUKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLlRPUCk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgQWxpZ25tZW50QWN0aW9uKChJV29ya2JlbmNoUGFydCl0aGlzLAotCQkvLyBQb3NpdGlvbkNvbnN0YW50cy5CT1RUT00pOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJLy8KLQkJLy8gYWN0aW9uID0gbmV3IEFsaWdubWVudEFjdGlvbigoSVdvcmtiZW5jaFBhcnQpdGhpcywKLQkJLy8gUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLk1JRERMRSk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCi0JCUlBY3Rpb24gYWN0aW9uMSA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBGT05UX0RJQUxPRzsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlFZGl0UGFydCBzZWxlY3RlZEVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCQkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5nZXQoMCk7Ci0JCQkJCQkKLQkJCQkJCUZvbnREaWFsb2cgZmQgPSBuZXcgRm9udERpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJCQkvLyBSZXN0b3Jpbmcgb2xkIHZhbHVlcy4KLQkJCQkJCWlmKHNlbGVjdGVkRWRpdFBhcnQgIT0gbnVsbCl7Ci0JCQkJCQkJcmVzdG9yZUZvbnREYXRhKHNlbGVjdGVkRWRpdFBhcnQsIGZkKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJZmQub3BlbigpOwotCQkJCQkJaWYgKHNlbGVjdGVkRWRpdFBhcnQgaW5zdGFuY2VvZiBGcmVlVGV4dE5vZGVFZGl0UGFydCkgewotCQkJCQkJCWlmIChmZC5nZXRGb250TGlzdCgpICE9IG51bGwpIHsKLQkJCQkJCQkJRm9udERhdGEgZkRhdGEgPSBmZC5nZXRGb250TGlzdCgpWzBdOwotCQkJCQkJCQlpZiAoZkRhdGEgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKGZvbnQgIT0gbnVsbCAmJiAhZm9udC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQkJCQlmb250LmRpc3Bvc2UoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCS8vIGlmKGNvbG9yICE9IG51bGwgJiYgIWZvbnQuaXNEaXNwb3NlZCgpKXsKLQkJCQkJCQkJCS8vIGNvbG9yLmRpc3Bvc2UoKTsKLQkJCQkJCQkJCS8vIH0KLQkJCQkJCQkJCWZvbnQgPSBuZXcgRm9udChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXREaXNwbGF5KCksIGZEYXRhKTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJaWYoZmQuZ2V0UkdCKCkgIT0gbnVsbCkKLQkJCQkJCQkJCWNvbG9yID0gbmV3IENvbG9yKG51bGwsIGZkLmdldFJHQigpKTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJKChGcmVlVGV4dEZpZ3VyZSkgKChGcmVlVGV4dE5vZGVFZGl0UGFydCkgc2VsZWN0ZWRFZGl0UGFydCkKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpKS5zZXRGb250KGZvbnQpOwotCQkJCQkJCQkJCi0JCQkJCQkJCQlpZihjb2xvciAhPSBudWxsKQotCQkJCQkJCQkJKChGcmVlVGV4dEZpZ3VyZSkgKChGcmVlVGV4dE5vZGVFZGl0UGFydCkgc2VsZWN0ZWRFZGl0UGFydCkKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpKQotCQkJCQkJCQkJCQkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQotCQkJCQkJCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9ICgoTm9kZSkgc2VsZWN0ZWRFZGl0UGFydAotCQkJCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCk7Ci0JCQkJCQkJCQlMaXN0IGxpc3QgPSBncmFwaE5vZGUKLQkJCQkJCQkJCQkJLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0KLQkJCQkJCQkJCVN0cmluZyB0ZXh0ID0gKChGcmVlVGV4dEZpZ3VyZSkgKChGcmVlVGV4dE5vZGVFZGl0UGFydCkgc2VsZWN0ZWRFZGl0UGFydCkKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpKS5nZXRUZXh0KCk7Ci0JCQkJCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlLZXkoCi0JCQkJCQkJCQkJCWxpc3QsCi0JCQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9GUkVFX1RFWFQpOwotCQkJCQkJCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJCQkJCQlwcm9wZXJ0eS5zZXRWYWx1ZSh0ZXh0KTsKLQkJCQkJCQkJCQlsaXN0LmFkZChwcm9wZXJ0eSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlzZXRQcm9wZXJ0eSgKLQkJCQkJCQkJCQkJbGlzdCwKLQkJCQkJCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9OQU1FLAotCQkJCQkJCQkJCQlmRGF0YS5nZXROYW1lKCkpOwotCQkJCQkJCQkJc2V0UHJvcGVydHkoCi0JCQkJCQkJCQkJCWxpc3QsCi0JCQkJCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfU1RZTEUsCi0JCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKGZEYXRhLmdldFN0eWxlKCkpCi0JCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkJc2V0UHJvcGVydHkoCi0JCQkJCQkJCQkJCWxpc3QsCi0JCQkJCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfSEVJR0hULAotCQkJCQkJCQkJCQluZXcgSW50ZWdlcihmRGF0YS5nZXRIZWlnaHQoKSkKLQkJCQkJCQkJCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQlpZihmZC5nZXRSR0IoKSAhPSBudWxsKXsKLQkJCQkJCQkJCXNldFByb3BlcnR5KAotCQkJCQkJCQkJCQlsaXN0LAotCQkJCQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1JFRCwKLQkJCQkJCQkJCQkJbmV3IEludGVnZXIoZmQuZ2V0UkdCKCkucmVkKQotCQkJCQkJCQkJCQkJCS50b1N0cmluZygpKTsKLQkJCQkJCQkJCXNldFByb3BlcnR5KAotCQkJCQkJCQkJCQlsaXN0LAotCQkJCQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0JMVUUsCi0JCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKGZkLmdldFJHQigpLmJsdWUpCi0JCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkJc2V0UHJvcGVydHkoCi0JCQkJCQkJCQkJCWxpc3QsCi0JCQkJCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfR1JFRU4sCi0JCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKGZkLmdldFJHQigpLmdyZWVuKQotCQkJCQkJCQkJCQkJCS50b1N0cmluZygpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXNlbGVjdGVkRWRpdFBhcnQucmVmcmVzaCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpICE9IDEpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQlpZiAoZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCQlyZXR1cm4gKCgoVHlwZWROb2RlKSBlZGl0UGFydC5nZXRNb2RlbCgpKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkZSRUVfVEVYVCk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFByb3BlcnR5IGdldFByb3BlcnR5QnlLZXkoTGlzdCBsaXN0LCBTdHJpbmcga2V5KSB7Ci0JCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGlyb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlyb3IuaGFzTmV4dCgpOykgewotCQkJCQkJUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpIGlyb3IubmV4dCgpOwotCQkJCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJCQlpZiAocHJvcGVydHkuZ2V0S2V5KCkuZXF1YWxzKGtleSkpIHsKLQkJCQkJCQkJcmV0dXJuIHByb3BlcnR5OwotCQkJCQkJCX0gCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KExpc3QgbGlzdCwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlLZXkobGlzdCwga2V5KTsKLQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQlwcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7Ci0KLQkJCQl9IGVsc2UgewotCQkJCQlwcm9wZXJ0eSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCk7Ci0JCQkJCXByb3BlcnR5LnNldEtleShrZXkpOwotCQkJCQlwcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQkJfQotCQkJCWxpc3QuYWRkKHByb3BlcnR5KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHJlc3RvcmVGb250RGF0YShFZGl0UGFydCBzZWxlY3RlZEVkaXRQYXJ0LCBGb250RGlhbG9nIGZkKXsKLQkJCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gKChOb2RlKSBzZWxlY3RlZEVkaXRQYXJ0Ci0JCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCk7Ci0JCQkJCUxpc3QgbGlzdCA9IGdyYXBoTm9kZQotCQkJCQkJLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQkJCWlmKGxpc3QgIT0gbnVsbCAmJiAhbGlzdC5pc0VtcHR5KCkpewotCQkJCQkJUHJvcGVydHkgcHJvcGVydHkgPSBudWxsOwotCQkJCQkJU3RyaW5nIGZvbnRuYW1lID0gbnVsbCwgZm9udFN0eWxlID0gbnVsbCwgZm9udEhlaWdodCA9IG51bGwsIHJlZCA9IG51bGwsIGJsdWUgPSBudWxsLCBncmVlbiA9IG51bGw7Ci0KLQkJCQkJCXByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX05BTUUpOwotCQkJCQkJaWYocHJvcGVydHkgIT0gbnVsbCApewotCQkJCQkJCWZvbnRuYW1lID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJCX1lbHNlewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHJvcGVydHkgPSBnZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsIFRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfU1RZTEUpOwotCQkJCQkJaWYocHJvcGVydHkgIT0gbnVsbCApewotCQkJCQkJCWZvbnRTdHlsZSA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlLZXkobGlzdCwgVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9IRUlHSFQpOwotCQkJCQkJaWYocHJvcGVydHkgIT0gbnVsbCl7Ci0JCQkJCQkJZm9udEhlaWdodCA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlLZXkobGlzdCwgVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9SRUQpOwotCQkJCQkJaWYocHJvcGVydHkgIT0gbnVsbCl7Ci0JCQkJCQkJcmVkID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCXByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0JMVUUpOwotCQkJCQkJaWYocHJvcGVydHkgIT0gbnVsbCl7Ci0JCQkJCQkJYmx1ZSA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlLZXkobGlzdCwgVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9HUkVFTik7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsKXsKLQkJCQkJCQlncmVlbiA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCUZvbnREYXRhIGZEYXRhID0gbmV3IEZvbnREYXRhKCk7Ci0JCQkJCQlmRGF0YS5zZXROYW1lKGZvbnRuYW1lKTsKLQkJCQkJCWZEYXRhLnNldEhlaWdodCgobmV3IEludGVnZXIoZm9udEhlaWdodCkpLmludFZhbHVlKCkpOwotCQkJCQkJZkRhdGEuc2V0U3R5bGUoKG5ldyBJbnRlZ2VyKGZvbnRTdHlsZSkpLmludFZhbHVlKCkpOwotCQkJCQkJCi0JCQkJCQkvLywgKG5ldyBJbnRlZ2VyKGZvbnRTdHlsZSkpLmludFZhbHVlKCksIChuZXcgSW50ZWdlcihmb250SGVpZ2h0KSkuaW50VmFsdWUoKSk7Ci0JCQkJCQlpZiggcmVkICE9IG51bGwgJiYgYmx1ZSAhPSBudWxsICYmIGdyZWVuICE9IG51bGwpewotCQkJCQkJCVJHQiByZ2IgPSBuZXcgUkdCKG5ldyBJbnRlZ2VyKHJlZCkuaW50VmFsdWUoKSwKLQkJCQkJCQkJCW5ldyBJbnRlZ2VyKGdyZWVuKS5pbnRWYWx1ZSgpLAotCQkJCQkJCQkJIG5ldyBJbnRlZ2VyKGJsdWUpLmludFZhbHVlKCkKLQkJCQkJCQkJCSApOwotCQkJCQkJCWZkLnNldFJHQihyZ2IpOwotLy8JCQkJCQkJaWYocmdiICE9IG51bGwpewotLy8JCQkJCQkJCXJnYi5yZWQgPSBuZXcgSW50ZWdlcihyZWQpLmludFZhbHVlKCk7Ci0vLwkJCQkJCQkJcmdiLmJsdWUgPSBuZXcgSW50ZWdlcihibHVlKS5pbnRWYWx1ZSgpOwotLy8JCQkJCQkJCXJnYi5ncmVlbiA9IG5ldyBJbnRlZ2VyKGdyZWVuKS5pbnRWYWx1ZSgpOwotLy8JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZmQuc2V0Rm9udExpc3QobmV3IEZvbnREYXRhW117ZkRhdGF9KTsKLQkJCQkJfQotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbjEpOwotCi0JCS8vIEppbmh1YSBYaQotCQkvLyBhZGRlZCB0aGlzIHRvIGNvbnNvbGlkYXRlIGNvbW1vbiBhY3Rpb25zIGludG8gYSBzZXJ2aWNlIGNsYXNzCi0JCWFjdGlvblNlcnZpY2UgPSBuZXcgRGlhZ3JhbUFjdGlvblNlcnZpY2UoZ2V0R3JhcGhpY2FsVmlld2VyKCksCi0JCQkJZ2V0RWRpdERvbWFpbigpLCByZWdpc3RyeSk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJIb3Jpem9udGFsQWxpZ25BdmVyYWdlQWN0aW9uKCk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJIb3Jpem9udGFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJWZXJ0aWNhbEFsaWduQXZlcmFnZUFjdGlvbigpOwotCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVyVmVydGljYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKTsKLQotCQkvLyAvLyBhbGlnbiBob3Jpem9udGFsbHkgdG8gYXZlcmFnZSB5LXZhbHVlIG9mIGFsbCBub2RlcwotCQkvLyBJQWN0aW9uIGhBbGlnbkF2ZXJhZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMKLQkJLy8gLmdldFN0cmluZygiRGlhZ3JhbVVJLkFic3RyYWN0RGlhZ3JhbUVkaXRvci5oQWxpZ25BdmVyYWdlQWN0aW9uLnRleHQiKSkKLQkJLy8geyAvLyROT04tTkxTLTEkCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gaG9yaXpBbGlnblRvQXZlcmFnZVNlbGVjdGVkKCk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJLy8gcmV0dXJuIEFMSUdOX0hPUlpfQVZFUkFHRTsKLQkJLy8gfQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGhBbGlnbkF2ZXJhZ2VBY3Rpb24pOwotCQkvLwotCQkvLyAvLyBhbGlnbiBob3Jpem9udGFsbHkgdG8geS12YWx1ZSBvZiBmaXJzdCBzZWxlY3RlZCBub2RlCi0JCS8vIElBY3Rpb24gaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCS8vIERpYWdyYW1VSVJlc291cmNlcwotCQkvLyAuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWJzdHJhY3REaWFncmFtRWRpdG9yLmhBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24udGV4dCIpKQotCQkvLyB7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcHVibGljIHZvaWQgcnVuKCkgewotCQkvLyBob3J6QWxpZ25Ub0ZpcnN0U2VsZWN0ZWQoKTsKLQkJLy8gfQotCQkvLwotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkvLyByZXR1cm4gQUxJR05fSE9SWl9GSVJTVF9TRUxFQ1RFRDsKLQkJLy8gfQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGhBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24pOwotCQkvLwotCQkvLyAvLyBhbGlnbiB2ZXJ0aWNhbGx5IHRvIGF2ZXJhZ2UgeC12YWx1ZSBvZiBhbGwgc2VsZWN0ZWQgbm9kZXMKLQkJLy8gSUFjdGlvbiB2QWxpZ25BdmVyYWdlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzCi0JCS8vIC5nZXRTdHJpbmcoIkRpYWdyYW1VSS5BYnN0cmFjdERpYWdyYW1FZGl0b3IudkFsaWduQXZlcmFnZUFjdGlvbi50ZXh0IikpCi0JCS8vIHsgLy8kTk9OLU5MUy0xJAotCQkvLyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vIHZlcnRpY2FsQWxpZ25Ub0F2ZXJhZ2VTZWxlY3RlZCgpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCS8vIHJldHVybiBBTElHTl9WRVJUX0FWRVJBR0U7Ci0JCS8vIH0KLQkJLy8gfTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih2QWxpZ25BdmVyYWdlQWN0aW9uKTsKLQkJLy8KLQkJLy8gLy8gYWxpZ24gdmVydGljYWxseSB0byB4LXZhbHVlIG9mIGZpcnN0IHNlbGVjdGVkIG5vZGUKLQkJLy8gSUFjdGlvbiB2QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzCi0JCS8vIC5nZXRTdHJpbmcoIkRpYWdyYW1VSS5BYnN0cmFjdERpYWdyYW1FZGl0b3IudkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbi50ZXh0IikpCi0JCS8vIHsgLy8kTk9OLU5MUy0xJAotCQkvLyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vIHZlcnRpY2FsQWxpZ25Ub0ZpcnN0U2VsZWN0ZWQoKTsKLQkJLy8gfQotCQkvLwotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkvLyByZXR1cm4gQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRDsKLQkJLy8gfQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dCwgZnJlZVR4dE5vZGVDcmVhdGlvbkZhY3RvcnksIC8vJE5PTi1OTFMtMSQKLQkJCQlDUkVBVEVfRlJFRV9URVhULAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcCwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnJlZXRleHRfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy5tb3ZlQWN0aW9uX2xhYmVsKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJcHVibGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBuZXdJbWFnZSkgewotCQkJCXN1cGVyLnNldEltYWdlRGVzY3JpcHRvcihuZXdJbWFnZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChFdmVudCBldmVudCkgewotCQkJCXN1cGVyLnJ1bldpdGhFdmVudChldmVudCk7Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN1cGVyLnJ1bigpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID4gMCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBNT1ZFOwotCQkJfQotCi0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlJQWN0aW9uIGxpbmtBY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPT0gMikgewotCQkJCQlFZGl0UGFydCBzb3VyY2VFZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMSk7Ci0JCQkJCUxpc3QgdGFyZ2V0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgRnJlZVRleHROb2RlRWRpdFBhcnQKLQkJCQkJCQl8fCB0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KQotCQkJCQkJcmV0dXJuOwotCQkJCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCXRhcmdldExpc3QgPSAoKE5vZGVFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpCi0JCQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCQkJaWYgKCF0YXJnZXRMaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHRhcmdldExpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTGlua0VkaXRQYXJ0IG9iaiA9IChMaW5rRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAodGFyZ2V0RWRpdFBhcnQuZXF1YWxzKG9iai5nZXRTb3VyY2UoKSkpCi0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCWlmICh0YXJnZXRFZGl0UGFydC5lcXVhbHMob2JqLmdldFRhcmdldCgpKSkKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl0YXJnZXRMaXN0ID0gKChOb2RlRWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQotCQkJCQkJCQkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCQkJCWlmICghdGFyZ2V0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0YXJnZXRMaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCUxpbmtFZGl0UGFydCBvYmogPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKHRhcmdldEVkaXRQYXJ0LmVxdWFscyhvYmouZ2V0U291cmNlKCkpKQotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQlpZiAodGFyZ2V0RWRpdFBhcnQuZXF1YWxzKG9iai5nZXRUYXJnZXQoKSkpCi0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCUxpbmsgbGluayA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpOwotCQkJCQlpZiAoc291cmNlRWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIE5vZGUpCi0JCQkJCQlsaW5rLnNldFNvdXJjZSgoTm9kZSkgc291cmNlRWRpdFBhcnQuZ2V0TW9kZWwoKSk7Ci0JCQkJCWlmICh0YXJnZXRFZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgTm9kZSkKLQkJCQkJCWxpbmsuc2V0VGFyZ2V0KChOb2RlKSB0YXJnZXRFZGl0UGFydC5nZXRNb2RlbCgpKTsKLQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDcmVhdGVMaW5rQ29tbWFuZCgKLQkJCQkJCQlsaW5rLCAoTm9kZSkgc291cmNlRWRpdFBhcnQuZ2V0TW9kZWwoKSk7Ci0JCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGVkaXRQYXJ0cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IHBhcnQgPSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBGcmVlVGV4dE5vZGVFZGl0UGFydCkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPT0gMikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBDUkVBVEVfTElOSzsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihsaW5rQWN0aW9uKTsKLQotCQlJQWN0aW9uIHNlbGVjdExpbmtBY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3QpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDEpIHsKLQkJCQkJRWRpdFBhcnQgcGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCUxpc3QgbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBwYXJ0KQotCQkJCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJCWlmIChsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJTGlua0VkaXRQYXJ0IGxpbmtwYXJ0ID0gKExpbmtFZGl0UGFydCkgbGlzdC5nZXQoMCk7Ci0JCQkJCQkJbGlua3BhcnQuc2V0U2VsZWN0ZWQoMSk7Ci0JCQkJCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2VsZWN0KGxpbmtwYXJ0KTsKLQkJCQkJCQkvLyBwYXJ0LnNldFNlbGVjdGVkKDApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDEpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gU0VMRUNUX0xJTks7Ci0JCQl9Ci0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihzZWxlY3RMaW5rQWN0aW9uKTsKLQotCQlJQWN0aW9uIGNyZWF0ZUJlbmRQb2ludEFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQlpZiAoZWRpdFBhcnRzLnNpemUoKSA9PSAxKSB7Ci0JCQkJCUVkaXRQYXJ0IHBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgTGlua0VkaXRQYXJ0KSB7Ci0JCQkJCQkvLyByZXR1cm4gdHJ1ZTsKLQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSAoKExpbmtFZGl0UGFydCkgcGFydCkuZ2V0TW9kZWwoKTsKLQkJCQkJCUxpc3QgYmVuZHBvaW50cyA9IGxpbmsuZ2V0QmVuZHBvaW50cygpOwotCQkJCQkJaWYgKGJlbmRwb2ludHMgPT0gbnVsbCB8fCBiZW5kcG9pbnRzLnNpemUoKSA8IDEpIHsKLQkJCQkJCQlQb2ludCBzcCA9IGxpbmsuZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCQkJCQlQb2ludCB0cCA9IGxpbmsuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQkJCQkJCQlpZiAoc3AgPT0gbnVsbCkgewotCQkJCQkJCQlpZiAobGluay5nZXRTb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJCQkJCQlzcCA9ICgoTm9kZSkgbGluay5lQ29udGFpbmVyKCkpCi0JCQkJCQkJCQkJCS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJc3AgPSBsaW5rLmdldFNvdXJjZSgpLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHRwID09IG51bGwpIHsKLQkJCQkJCQkJdHAgPSBsaW5rLmdldFRhcmdldCgpLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJfQotCQkJCQkJCVBvaW50IGJQb2ludCA9IG5ldyBQb2ludCgpOwotCQkJCQkJCWJQb2ludC54ID0gKHNwLnggKyB0cC54KSAvIDI7Ci0JCQkJCQkJYlBvaW50LnkgPSAoc3AueSArIHRwLnkpIC8gMjsKLQkJCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENyZWF0ZUJlbmRwb2ludENvbW1hbmQoCi0JCQkJCQkJCQlsaW5rLCBiUG9pbnQsIDApOwotCQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQlpZiAoZWRpdFBhcnRzLnNpemUoKSA9PSAxKSB7Ci0JCQkJCUVkaXRQYXJ0IHBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgTGlua0VkaXRQYXJ0KSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIENSRUFURV9CRU5EX1BPSU5UOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGNyZWF0ZUJlbmRQb2ludEFjdGlvbik7Ci0KLQkJSUFjdGlvbiByZWZyZXNoQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMucmVmcmVzaEFjdGlvbl9sYWJlbCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0LmlzQWN0aXZlKCkpIHsKLQkJCQkJZWRpdFBhcnQuZGVhY3RpdmF0ZSgpOwotCQkJCX0KLQkJCQlkaWFncmFtLnJlbW92ZUNvbnN1bWVyKEFic3RyYWN0RGlhZ3JhbUVkaXRvci50aGlzKTsKLQkJCQljcmVhdGVFZGl0UGFydCgpOwotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gUkVGUkVTSDsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihyZWZyZXNoQWN0aW9uKTsKLQkJSUFjdGlvbiBkZWxldGVEaWFncmFtQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuRGVsZXRlRGlhZ3JhbV90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkRlbGV0ZURpYWdyYW1fdGV4dCwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuRGVsZXRlRGlhZ3JhbV9wcm9tcHQpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pICgoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLmdldENvbnRlbnRzKCkpLmdldE1vZGVsKCk7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlkb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoCi0JCQkJCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCXJldHVybiBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLnNpemUoKSA9PSAwOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBERUxFVEVfRElBR1JBTTsKLQkJCX0KLQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGRlbGV0ZURpYWdyYW1BY3Rpb24pOwotCQlJQWN0aW9uIGFsaWduQmVuZFBvaW50QWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuYWxpZ25fYmVuZF9wb2ludF90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUVkaXRQYXJ0IHBhcnQgPSAoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5nZXQoMCk7Ci0JCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBMaW5rRWRpdFBhcnQpIHsKLQkJCQkJTGlua0VkaXRQYXJ0IGxpbmtwYXJ0ID0gKChMaW5rRWRpdFBhcnQpIHBhcnQpOwotCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgbGlua3BhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0QmVuZHBvaW50cygpLnNpemUoKSA+IDApIHsKLQotCQkJCQkJR3JhcGhpY2FsRWRpdFBhcnQgc3BhcnQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rcGFydAotCQkJCQkJCQkuZ2V0U291cmNlKCkpOwotCQkJCQkJR3JhcGhpY2FsRWRpdFBhcnQgdHBhcnQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rcGFydAotCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpOwotCi0JCQkJCQlQb2ludCBzcCA9IHNwYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJUG9pbnQgdHAgPSB0cGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQotCQkJCQkJaWYgKHNwYXJ0IGluc3RhbmNlb2YgRGVjaXNpb25Ob2RlRWRpdFBhcnQKLQkJCQkJCQkJfHwgc3BhcnQgaW5zdGFuY2VvZiBTeW5jaEJhck5vZGVFZGl0UGFydCkgewotCQkJCQkJCXNwID0gKChUeXBlZE5vZGUpIHNwYXJ0LmdldE1vZGVsKCkpLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gKChOb2RlRWRpdFBhcnQpIHNwYXJ0KQotCQkJCQkJCQkJLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlMaW5rRWRpdFBhcnQgbHAgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKGxwLmdldFRhcmdldCgpLmVxdWFscyh0cGFydCkpIHsKLQkJCQkJCQkJCVBvaW50IHNvdXJjZUVuZFBvaW50ID0gKChMaW5rKSBscAotCQkJCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCQkJCQkJCXNwID0gc3AuZ2V0VHJhbnNsYXRlZChzb3VyY2VFbmRQb2ludCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICh0cGFydCBpbnN0YW5jZW9mIERlY2lzaW9uTm9kZUVkaXRQYXJ0Ci0JCQkJCQkJCXx8IHRwYXJ0IGluc3RhbmNlb2YgU3luY2hCYXJOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCQl0cCA9ICgoVHlwZWROb2RlKSB0cGFydC5nZXRNb2RlbCgpKS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCUxpc3QgbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSB0cGFydCkKLQkJCQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTGlua0VkaXRQYXJ0IGxwID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChscC5nZXRTb3VyY2UoKS5lcXVhbHMoc3BhcnQpKSB7Ci0JCQkJCQkJCQlQb2ludCB0YXJnZXRFbmRQb2ludCA9ICgoTGluaykgbHAKLQkJCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldFRhcmdldEVuZFBvaW50KCk7Ci0JCQkJCQkJCQl0cCA9IHRwLmdldFRyYW5zbGF0ZWQodGFyZ2V0RW5kUG9pbnQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCk7IGkrKykgewotCQkJCQkJCUFic29sdXRlQmVuZHBvaW50IG9sZGJwID0gKEFic29sdXRlQmVuZHBvaW50KSBsaW5rCi0JCQkJCQkJCQkuZ2V0QmVuZHBvaW50cygpLmdldChpKTsKLQkJCQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBicCA9IG5ldyBBYnNvbHV0ZUJlbmRwb2ludCgKLQkJCQkJCQkJCW5ldyBQb2ludCgtMSwgLTEpKTsKLQkJCQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBwcmV2aW91c2JwID0gbnVsbDsKLQkJCQkJCQlpbnQgZGVsdGEgPSA0MDsKLQkJCQkJCQlpbnQgcG9zaXRpb24gPSAwOwotCi0JCQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJCQlwb3NpdGlvbiA9IHNwLmdldFBvc2l0aW9uKG9sZGJwKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlwcmV2aW91c2JwID0gKEFic29sdXRlQmVuZHBvaW50KSBsaW5rCi0JCQkJCQkJCQkJLmdldEJlbmRwb2ludHMoKS5nZXQoaSAtIDEpOwotCQkJCQkJCQlwb3NpdGlvbiA9IHByZXZpb3VzYnAuZ2V0UG9zaXRpb24ob2xkYnApOwotCQkJCQkJCX0KLQotCQkJCQkJCWlmIChwb3NpdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSAotCQkJCQkJCQkJfHwgcG9zaXRpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpIHsKLQkJCQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJCQkJaWYgKHNwLnggLSBkZWx0YSA8IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgc3AueCArIGRlbHRhID4gb2xkYnAueAotCQkJCQkJCQkJCQkmJiAhKHNwLnggPT0gb2xkYnAueCkpIHsKLQkJCQkJCQkJCQlicC54ID0gc3AueDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWlmIChwcmV2aW91c2JwLnggLSBkZWx0YSA8IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgcHJldmlvdXNicC54ICsgZGVsdGEgPiBvbGRicC54Ci0JCQkJCQkJCQkJCSYmICEocHJldmlvdXNicC54ID09IG9sZGJwLngpKSB7Ci0JCQkJCQkJCQkJYnAueCA9IHByZXZpb3VzYnAueDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAobGluay5nZXRCZW5kcG9pbnRzKCkuc2l6ZSgpIC0gMSA9PSBpKSB7Ci0JCQkJCQkJCQlpZiAodHAueSAtIGRlbHRhIDwgb2xkYnAueQotCQkJCQkJCQkJCQkmJiB0cC55ICsgZGVsdGEgPiBvbGRicC55Ci0JCQkJCQkJCQkJCSYmICEodHAueSA9PSBvbGRicC55KSkgewotCQkJCQkJCQkJCWJwLnkgPSB0cC55OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJYnAueSA9IG9sZGJwLnk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHBvc2l0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QKLQkJCQkJCQkJCXx8IHBvc2l0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLldFU1QpIHsKLQotCQkJCQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCQkJCQlpZiAoc3AueSAtIGRlbHRhIDwgb2xkYnAueQotCQkJCQkJCQkJCQkmJiBzcC55ICsgZGVsdGEgPiBvbGRicC55Ci0JCQkJCQkJCQkJCSYmICEoc3AueSA9PSBvbGRicC55KSkgewotCQkJCQkJCQkJCWJwLnkgPSBzcC55OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJaWYgKHByZXZpb3VzYnAueSAtIGRlbHRhIDwgb2xkYnAueQotCQkJCQkJCQkJCQkmJiBwcmV2aW91c2JwLnkgKyBkZWx0YSA+IG9sZGJwLnkKLQkJCQkJCQkJCQkJJiYgIShwcmV2aW91c2JwLnkgPT0gb2xkYnAueSkpIHsKLQkJCQkJCQkJCQlicC55ID0gcHJldmlvdXNicC55OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgLSAxID09IGkpIHsKLQkJCQkJCQkJCWlmICh0cC54IC0gZGVsdGEgPCBvbGRicC54Ci0JCQkJCQkJCQkJCSYmIHRwLnggKyBkZWx0YSA+IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgISh0cC54ID09IG9sZGJwLngpKSB7Ci0JCQkJCQkJCQkJYnAueCA9IHRwLng7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlicC54ID0gb2xkYnAueDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoYnAueCA9PSAtMSAmJiBicC55ICE9IC0xKSB7Ci0JCQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgTW92ZUJlbmRwb2ludENvbW1hbmQoCi0JCQkJCQkJCQkJbGluaywgbmV3IFBvaW50KG9sZGJwLngsIGJwLnkpLCBpKTsKLQkJCQkJCQkJLy8gKChSb290RWRpdFBhcnQpZ2V0Um9vdCgpKS5nZXRWaWV3ZXIoKS5nZXRFZGl0RG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGJwLnggIT0gLTEgJiYgYnAueSA9PSAtMSkgewotCQkJCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IE1vdmVCZW5kcG9pbnRDb21tYW5kKAotCQkJCQkJCQkJCWxpbmssIG5ldyBQb2ludChicC54LCBvbGRicC55KSwgaSk7Ci0JCQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChicC54ICE9IC0xICYmIGJwLnkgIT0gLTEpIHsKLQkJCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBNb3ZlQmVuZHBvaW50Q29tbWFuZCgKLQkJCQkJCQkJCQlsaW5rLCBuZXcgUG9pbnQoYnAueCwgYnAueSksIGkpOwotCQkJCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCUxpc3QgbGlzdCA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGxpc3Quc2l6ZSgpID09IDEpIHsKLQkJCQkJaWYgKGxpc3QuZ2V0KDApIGluc3RhbmNlb2YgTGlua0VkaXRQYXJ0KSB7Ci0JCQkJCQlMaW5rRWRpdFBhcnQgcGFydCA9IChMaW5rRWRpdFBhcnQpIGxpc3QuZ2V0KDApOwotCQkJCQkJTGluayBsaW5rID0gKExpbmspIHBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJCWlmIChsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgPiAwKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fQkVORF9QT0lOVDsKLQkJCX0KLQotCQl9OwotCQkKLQkJLy8gVmlld2VyIFByaW50IEFjdGlvbgotCQlhY3Rpb24gPSBuZXcgRGlhZ3JhbVByaW50QWN0aW9uKHRoaXMsIGdldEdyYXBoaWNhbFZpZXdlcigpKTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhbGlnbkJlbmRQb2ludEFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpb24gY3JlYXRlQW5BY3Rpb24oU3RyaW5nIGFjdGlvbk5hbWUsCi0JCQlDcmVhdGlvbkZhY3RvcnkgY3JlYXRpb25GYWN0b3J5LCBTdHJpbmcgYWN0aW9uSWQsCi0JCQlTdHJpbmcgdG9vbHRpcFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yIGltYWdlZGVzYykgewotCQlmaW5hbCBDcmVhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IGNyZWF0aW9uRmFjdG9yeTsKLQkJZmluYWwgU3RyaW5nIGlkID0gYWN0aW9uSWQ7Ci0JCWZpbmFsIFN0cmluZyB0b29sdGlwID0gdG9vbHRpcFN0cmluZzsKLQkJZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlZGVzY3JpcHRvciA9IGltYWdlZGVzYzsKLQkJcmV0dXJuIG5ldyBBY3Rpb24oYWN0aW9uTmFtZSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDcmVhdGVSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgQ3JlYXRlUmVxdWVzdCgpOwotCQkJCS8vIENyZWF0aW9uRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCXJlcXVlc3Quc2V0RmFjdG9yeShmYWN0b3J5KTsKLQkJCQlyZXF1ZXN0LnNldExvY2F0aW9uKG5ldyBQb2ludCgxMCwgMTApKTsKLQotCQkJCWlmIChyZXF1ZXN0LmdldE5ld09iamVjdCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlQb2ludCBsb2MgPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0JCQkJCURpYWdyYW0gcGFyZW50ID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ3JlYXRlTm9kZUNvbW1hbmQoCi0JCQkJCQkJKE5vZGUpIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCksIHBhcmVudCwgbG9jKTsKLQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIGlkOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQkJCXJldHVybiB0b29sdGlwOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCW9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvciBuZXdJbWFnZSkgewotCQkJCXN1cGVyLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZWRlc2NyaXB0b3IpOwotCQkJfQotCi0JCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJCQlyZXR1cm4gaW1hZ2VkZXNjcmlwdG9yOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBQYWxldHRlVmlld2VyUHJvdmlkZXIgY3JlYXRlUGFsZXR0ZVZpZXdlclByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFBhbGV0dGVWaWV3ZXJQcm92aWRlcihnZXRFZGl0RG9tYWluKCkpIHsKLQkJCXByaXZhdGUgSU1lbnVMaXN0ZW5lciBtZW51TGlzdGVuZXI7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVBhbGV0dGVWaWV3ZXIoUGFsZXR0ZVZpZXdlciB2aWV3ZXIpIHsKLQkJCQlzdXBlci5jb25maWd1cmVQYWxldHRlVmlld2VyKHZpZXdlcik7Ci0JCQkJLy8gVE9ETyB2aWV3ZXIuc2V0Q3VzdG9taXplcihuZXcgTG9naWNQYWxldHRlQ3VzdG9taXplcigpKTsKLQkJCQl2aWV3ZXIKLQkJCQkJCS5hZGREcmFnU291cmNlTGlzdGVuZXIobmV3IFRlbXBsYXRlVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXIoCi0JCQkJCQkJCXZpZXdlcikpOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBob29rUGFsZXR0ZVZpZXdlcihQYWxldHRlVmlld2VyIHZpZXdlcikgewotCQkJCXN1cGVyLmhvb2tQYWxldHRlVmlld2VyKHZpZXdlcik7Ci0JCQkJZmluYWwgQ29weVRlbXBsYXRlQWN0aW9uIGNvcHkgPSAoQ29weVRlbXBsYXRlQWN0aW9uKSBnZXRBY3Rpb25SZWdpc3RyeSgpCi0JCQkJCQkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpKTsKLQkJCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGNvcHkpOwotCQkJCWlmIChtZW51TGlzdGVuZXIgPT0gbnVsbCkKLQkJCQkJbWVudUxpc3RlbmVyID0gbmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCQkJCQltYW5hZ2VyLmFwcGVuZFRvR3JvdXAoCi0JCQkJCQkJCQlHRUZBY3Rpb25Db25zdGFudHMuR1JPVVBfQ09QWSwgY29weSk7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJdmlld2VyLmdldENvbnRleHRNZW51KCkuYWRkTWVudUxpc3RlbmVyKG1lbnVMaXN0ZW5lcik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuR3JhcGhpY2FsRWRpdG9yV2l0aEZseW91dFBhbGV0dGUjZ2V0UGFsZXR0ZVByZWZlcmVuY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgRmx5b3V0UHJlZmVyZW5jZXMgZ2V0UGFsZXR0ZVByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gbmV3IEZseW91dFByZWZlcmVuY2VzKCkgewotCQkJcHVibGljIGludCBnZXREb2NrTG9jYXRpb24oKSB7Ci0JCQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCQkJLmdldEludChQQUxFVFRFX0RPQ0tfTE9DQVRJT04pOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFBhbGV0dGVTdGF0ZSgpIHsKLQkJCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkuZ2V0SW50KFBBTEVUVEVfU1RBVEUpOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFBhbGV0dGVXaWR0aCgpIHsKLQkJCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkuZ2V0SW50KFBBTEVUVEVfU0laRSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldERvY2tMb2NhdGlvbihpbnQgbG9jYXRpb24pIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJCQlQQUxFVFRFX0RPQ0tfTE9DQVRJT04sIGxvY2F0aW9uKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0UGFsZXR0ZVN0YXRlKGludCBzdGF0ZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQkJCVBBTEVUVEVfU1RBVEUsIHN0YXRlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0UGFsZXR0ZVdpZHRoKGludCB3aWR0aCkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQkJCVBBTEVUVEVfU0laRSwgd2lkdGgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBLZXlIYW5kbGVyIGdldENvbW1vbktleUhhbmRsZXIoKSB7Ci0JCWlmIChzaGFyZWRLZXlIYW5kbGVyID09IG51bGwpIHsKLQkJCXNoYXJlZEtleUhhbmRsZXIgPSBuZXcgS2V5SGFuZGxlcigpIHsKLQotCQkJCXB1YmxpYyBib29sZWFuIGtleVByZXNzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKChldmVudC5zdGF0ZU1hc2sgPT0gU1dULkNUUkwpCi0JCQkJCQkJJiYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX1JJR0hUKSkgewotCQkJCQkJbW92ZSgxKTsKLQkJCQkJfQotCQkJCQlpZiAoKGV2ZW50LnN0YXRlTWFzayA9PSBTV1QuQ1RSTCkKLQkJCQkJCQkmJiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfRE9XTikpIHsKLQkJCQkJCW1vdmUoMik7Ci0KLQkJCQkJfQotCQkJCQlpZiAoKGV2ZW50LnN0YXRlTWFzayA9PSBTV1QuQ1RSTCkKLQkJCQkJCQkmJiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfVVApKSB7Ci0JCQkJCQltb3ZlKDMpOwotCQkJCQl9Ci0JCQkJCWlmICgoZXZlbnQuc3RhdGVNYXNrID09IFNXVC5DVFJMKQotCQkJCQkJCSYmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19MRUZUKSkgewotCQkJCQkJbW92ZSg0KTsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBzdXBlci5rZXlQcmVzc2VkKGV2ZW50KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBtb3ZlKGludCBkaXJlY3Rpb24pIHsKLQkJCQkJTGlzdCBsaXN0ID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgbGlzdC5nZXQoMCk7Ci0JCQkJCWlmIChwYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgcGFydC5nZXRNb2RlbCgpOwotCQkJCQkJUG9pbnQgcG9pbnQgPSBub2RlLmdldExvY2F0aW9uKCk7Ci0JCQkJCQlpbnQgbmV3eCA9IHBvaW50Lng7Ci0JCQkJCQlpbnQgbmV3eSA9IHBvaW50Lnk7Ci0JCQkJCQlpbnQgcHJlc3NsZW5ndGggPSAxOwotCQkJCQkJc3dpdGNoIChkaXJlY3Rpb24pIHsKLQkJCQkJCWNhc2UgMToKLQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldyBQb2ludChwb2ludC54KzEwLHBvaW50LnkpKTsKLQkJCQkJCQluZXd4ID0gcG9pbnQueCArIHByZXNzbGVuZ3RoOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAyOgotCQkJCQkJCS8vIG5vZGUuc2V0TG9jYXRpb24obmV3IFBvaW50KHBvaW50LngscG9pbnQueSsxMCkpOwotCQkJCQkJCW5ld3kgKz0gcHJlc3NsZW5ndGg7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDM6Ci0JCQkJCQkJLy8gbm9kZS5zZXRMb2NhdGlvbihuZXcgUG9pbnQocG9pbnQueCxwb2ludC55LTEwKSk7Ci0JCQkJCQkJbmV3eSAtPSBwcmVzc2xlbmd0aDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNDoKLQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldyBQb2ludChwb2ludC54LTEwLHBvaW50LnkpKTsKLQkJCQkJCQluZXd4IC09IHByZXNzbGVuZ3RoOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgKLQkJCQkJCQkJbm9kZSwgbmV3IFBvaW50KG5ld3gsIG5ld3kpLCBub2RlLmdldFdpZHRoKCkpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCS8vIFRPRE8tIGNoZWNrIGFkZGluZyBtb3JlIGJlbmRwb2ludCwgY2FwdHVyZSBiZW5kcG9pbnQKLQkJCQkJLy8gaW5kZXggb24gZmx5Ci0JCQkJCWlmIChwYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgcGFydC5nZXRNb2RlbCgpOwotCQkJCQkJTGlzdCBibGlzdCA9IGxpbmsuZ2V0QmVuZHBvaW50cygpOwotCQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJCWlmIChibGlzdCAhPSBudWxsICYmIGJsaXN0LnNpemUoKSA+IDApIHsKLQkJCQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBwb2ludCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgYmxpc3QKLQkJCQkJCQkJCS5nZXQoaW5kZXgpOwotCQkJCQkJCWludCBuZXd4ID0gcG9pbnQueDsKLQkJCQkJCQlpbnQgbmV3eSA9IHBvaW50Lnk7Ci0JCQkJCQkJaW50IHByZXNzbGVuZ3RoID0gNTsKLQkJCQkJCQlzd2l0Y2ggKGRpcmVjdGlvbikgewotCQkJCQkJCWNhc2UgMToKLQkJCQkJCQkJLy8gbm9kZS5zZXRMb2NhdGlvbihuZXcKLQkJCQkJCQkJLy8gUG9pbnQocG9pbnQueCsxMCxwb2ludC55KSk7Ci0JCQkJCQkJCW5ld3ggPSBwb2ludC54ICsgcHJlc3NsZW5ndGg7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMjoKLQkJCQkJCQkJLy8gbm9kZS5zZXRMb2NhdGlvbihuZXcKLQkJCQkJCQkJLy8gUG9pbnQocG9pbnQueCxwb2ludC55KzEwKSk7Ci0JCQkJCQkJCW5ld3kgKz0gcHJlc3NsZW5ndGg7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMzoKLQkJCQkJCQkJLy8gbm9kZS5zZXRMb2NhdGlvbihuZXcKLQkJCQkJCQkJLy8gUG9pbnQocG9pbnQueCxwb2ludC55LTEwKSk7Ci0JCQkJCQkJCW5ld3kgLT0gcHJlc3NsZW5ndGg7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgNDoKLQkJCQkJCQkJLy8gbm9kZS5zZXRMb2NhdGlvbihuZXcKLQkJCQkJCQkJLy8gUG9pbnQocG9pbnQueC0xMCxwb2ludC55KSk7Ci0JCQkJCQkJCW5ld3ggLT0gcHJlc3NsZW5ndGg7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IE1vdmVCZW5kcG9pbnRDb21tYW5kKAotCQkJCQkJCQkJbGluaywgbmV3IFBvaW50KG5ld3gsIG5ld3kpLCBpbmRleCk7Ci0JCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQlzaGFyZWRLZXlIYW5kbGVyCi0JCQkJCS5wdXQoS2V5U3Ryb2tlLmdldFByZXNzZWQoU1dULkRFTCwgMTI3LCAwKSwKLQkJCQkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJCQkJCUFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpKTsKLQkJCXNoYXJlZEtleUhhbmRsZXIucHV0KEtleVN0cm9rZS5nZXRQcmVzc2VkKFNXVC5GMiwgMCksCi0JCQkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJCUdFRkFjdGlvbkNvbnN0YW50cy5ESVJFQ1RfRURJVCkpOwotCi0JCX0KLQkJcmV0dXJuIHNoYXJlZEtleUhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZ3JhcGhpY2FsVmlld2VyIGZvciB0aGlzIEVkaXRvclBhcnQuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIGdyYXBoaWNhbCB2aWV3ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRHcmFwaGljYWxWaWV3ZXIoR3JhcGhpY2FsVmlld2VyIHZpZXdlcikgewotCQlzdXBlci5zZXRHcmFwaGljYWxWaWV3ZXIodmlld2VyKTsKLQkJaWYgKGFjdGlvblNlcnZpY2UgIT0gbnVsbCkgewotCQkJYWN0aW9uU2VydmljZS5zZXRHcmFwaGljYWxWaWV3ZXIodmlld2VyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJc3VwZXIuY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0JCVNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyKSBnZXRHcmFwaGljYWxWaWV3ZXIoKTsKLQotCQlTY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0IHJvb3QgPSBuZXcgU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydCgpOwotCi0JCS8vIExpc3Qgem9vbUxldmVscyA9IG5ldyBBcnJheUxpc3QoMyk7Ci0JCS8vIHpvb21MZXZlbHMuYWRkKFpvb21NYW5hZ2VyLkZJVF9BTEwpOwotCQkvLyB6b29tTGV2ZWxzLmFkZChab29tTWFuYWdlci5GSVRfV0lEVEgpOwotCQkvLyB6b29tTGV2ZWxzLmFkZChab29tTWFuYWdlci5GSVRfSEVJR0hUKTsKLQkJLy8gcm9vdC5nZXRab29tTWFuYWdlcigpLnNldFpvb21MZXZlbENvbnRyaWJ1dGlvbnMoem9vbUxldmVscyk7Ci0JCS8vCi0JCS8vIElBY3Rpb24gem9vbUluID0gbmV3IFpvb21JbkFjdGlvbihyb290LmdldFpvb21NYW5hZ2VyKCkpOwotCQkvLyBJQWN0aW9uIHpvb21PdXQgPSBuZXcgWm9vbU91dEFjdGlvbihyb290LmdldFpvb21NYW5hZ2VyKCkpOwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHpvb21Jbik7Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oem9vbU91dCk7Ci0JCS8vIGdldFNpdGUoKS5nZXRLZXlCaW5kaW5nU2VydmljZSgpLnJlZ2lzdGVyQWN0aW9uKHpvb21Jbik7Ci0JCS8vIGdldFNpdGUoKS5nZXRLZXlCaW5kaW5nU2VydmljZSgpLnJlZ2lzdGVyQWN0aW9uKHpvb21PdXQpOwotCi0JCXZpZXdlci5zZXRSb290RWRpdFBhcnQocm9vdCk7Ci0KLQkJLy8gdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShuZXcgTWV0aG9kRWxlbWVudEVkaXRQYXJ0RmFjdG9yeSgpKTsKLQkJdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSk7Ci0KLQkJQ29udGV4dE1lbnVQcm92aWRlciBwcm92aWRlciA9IG5ldyBEaWFncmFtQ29udGV4dE1lbnVQcm92aWRlcigKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKSwgZ2V0QWN0aW9uUmVnaXN0cnkoKSk7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLnNldENvbnRleHRNZW51KHByb3ZpZGVyKTsKLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoCi0JCQkJIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy53b3JrZmxvdy5jb250ZXh0bWVudSIsIC8vJE5PTi1OTFMtMSQKLQkJCQlwcm92aWRlciwgZ2V0R3JhcGhpY2FsVmlld2VyKCkpOwotCi0JCXZpZXdlci5zZXRLZXlIYW5kbGVyKG5ldyBHcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyKHZpZXdlcikKLQkJCQkuc2V0UGFyZW50KGdldENvbW1vbktleUhhbmRsZXIoKSkpOwotCi0JCS8vIGxvYWRQcm9wZXJ0aWVzKCk7Ci0KLQkJLy8gQWN0aW9ucwotCQkvLyBJQWN0aW9uIHNob3dSdWxlcnMgPSBuZXcKLQkJLy8gVG9nZ2xlUnVsZXJWaXNpYmlsaXR5QWN0aW9uKGdldEdyYXBoaWNhbFZpZXdlcigpKTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihzaG93UnVsZXJzKTsKLQkJLy8gICAgCQotCQkvLyBJQWN0aW9uIHNuYXBBY3Rpb24gPSBuZXcKLQkJLy8gVG9nZ2xlU25hcFRvR2VvbWV0cnlBY3Rpb24oZ2V0R3JhcGhpY2FsVmlld2VyKCkpOwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHNuYXBBY3Rpb24pOwotCQkvLwotCQkvLyBJQWN0aW9uIHNob3dHcmlkID0gbmV3IFRvZ2dsZUdyaWRBY3Rpb24oZ2V0R3JhcGhpY2FsVmlld2VyKCkpOwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHNob3dHcmlkKTsKLQotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlQWN0aXZhdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9OwotCi0JCWdldEdyYXBoaWNhbENvbnRyb2woKS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIGxpc3RlbmVyKTsKLQkJZ2V0R3JhcGhpY2FsQ29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBsaXN0ZW5lcik7Ci0KLQkJZ2V0R3JhcGhpY2FsQ29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvdWJsZUNsaWNrLCBuZXcgTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlRG91YmxlQ2xpY2soZXZlbnQpOwotCQkJfQotCi0JCX0pOwotCQlpZiAoZ2V0RGlhZ3JhbVR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCVJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwpKQotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQlnZXRHcmFwaGljYWxDb250cm9sKCksCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRk9STV9FRElUT1JfQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fQ09OVEVYVCk7Ci0JCWVsc2UgaWYgKGdldERpYWdyYW1UeXBlKCkuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQlSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1cpKQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQkJZ2V0R3JhcGhpY2FsQ29udHJvbCgpLCBBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GT1JNX0VESVRPUl9BQ1RJVklUWV9ESUFHUkFNX0NPTlRFWFQpOyAKLQkJZWxzZSBpZiAoZ2V0RGlhZ3JhbVR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCVJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZKSkKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoZ2V0R3JhcGhpY2FsQ29udHJvbCgpLCBBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GT1JNX0VESVRPUl9XUF9ERVBFTkRFTkNZX0RJQUdSQU1fQ09OVEVYVCk7Ci0KLQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0R3JhcGhpY2FsQ29udHJvbCgpLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldFBhbGV0dGVSb290KCkgIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0IG9iaiA9IGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKTsKLQkJCQkJCWlmIChUbmdVdGlsLmlzTG9ja2VkKChFT2JqZWN0KSBvYmopKSB7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gZ2V0UGFsZXR0ZVJvb3QoKS5nZXRDaGlsZHJlbigpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJUGFsZXR0ZUVudHJ5IGVudHJ5ID0gKFBhbGV0dGVFbnRyeSkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWVudHJ5LnNldFZpc2libGUoZmFsc2UpOwotCQkJCQkJCX0KLQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlMaXN0IGxpc3QgPSBnZXRQYWxldHRlUm9vdCgpLmdldENoaWxkcmVuKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlQYWxldHRlRW50cnkgZW50cnkgPSAoUGFsZXR0ZUVudHJ5KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJZW50cnkuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJY3VycmVudENvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCi0JCS8vIGxpc3RlbiB0byBjaGFuZ2UgZm9yIGN1cnJlbnQgc2VsZWN0aW9uIG9mIE1ldGhvZENvbmZpZ3VyYXRpb24gb3IgY2hhbmdlcyBpbiAKLQkJLy8gY3VycmVudCBjb25maWd1cmF0aW9uLgotCQkvLwotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLmFkZExpc3RlbmVyKGxpYnJhcnlMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5QUklOVC5nZXRJZCgpKTsKLQkJaWYoYWN0aW9uIGluc3RhbmNlb2YgRGlhZ3JhbVByaW50QWN0aW9uKXsKLQkJCSgoRGlhZ3JhbVByaW50QWN0aW9uKWFjdGlvbikuc2V0Vmlld2VyKHZpZXdlcik7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpOwotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRG91YmxlQ2xpY2soRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR3JhcGhpY2FsVmlld2VyKCkgewotCQlzdXBlci5pbml0aWFsaXplR3JhcGhpY2FsVmlld2VyKCk7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQotCQlUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lciBsaXN0ZW5lciA9IGNyZWF0ZURyb3BUYXJnZXRMaXN0ZW5lcigpOwotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuYWRkRHJvcFRhcmdldExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCi0JCS8vIEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIKLQkJLy8gZ2V0R3JhcGhpY2FsVmlld2VyKCkuYWRkRHJvcFRhcmdldExpc3RlbmVyKAotCQkvLyBuZXcgVGV4dFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyKGdldEdyYXBoaWNhbFZpZXdlcigpLAotCQkvLyBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpIHsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWlmIChmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJZnJlZVR4dE5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVR5cGVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlZE5vZGUoKTsKLQkJCQkJbm9kZS5zZXRUeXBlKFR5cGVkTm9kZS5GUkVFX1RFWFQpOwotCQkJCQlub2RlLnNldE9iamVjdChHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJLm5ld1R5cGVkR3JhcGhOb2RlKFR5cGVkTm9kZS5GUkVFX1RFWFQpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuRlJFRV9URVhUOwotCQkJCX0KLQotCQkJfTsKLQkJQ3JlYXRpb25GYWN0b3J5IGNyZWF0aW9uRmFjdG9yeSA9IGZyZWVUeHROb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NyZWF0ZURyb3BUYXJnZXRMaXN0ZW5lcigpCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyIGNyZWF0ZURyb3BUYXJnZXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUZW1wbGF0ZVRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyKGdldEdyYXBoaWNhbFZpZXdlcigpKSB7Ci0KLQkJCXByb3RlY3RlZCBDcmVhdGlvbkZhY3RvcnkgZ2V0RmFjdG9yeShPYmplY3QgdGVtcGxhdGUpIHsKLQkJCQlyZXR1cm4gKENyZWF0aW9uRmFjdG9yeSkgdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAKLQkJCQkJCS5nZXQodGVtcGxhdGUpOwotCQkJfQotCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGlvbkNoYW5nZWQoRXZlbnQgZXZlbnQpIHsKLQkJSUFjdGlvbiBjb3B5ID0gbnVsbDsKLQkJaWYgKGV2ZW50LnR5cGUgPT0gU1dULkRlYWN0aXZhdGUpCi0JCQljb3B5ID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpOwotCQlpZiAoZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCUFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpKSAhPSBjb3B5KSB7Ci0JCQlnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJCUFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLCBjb3B5KTsKLQkJCWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkudXBkYXRlQWN0aW9uQmFycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuR3JhcGhpY2FsRWRpdG9yV2l0aEZseW91dFBhbGV0dGUjZ2V0UGFsZXR0ZVJvb3QoKQotCSAqLwotCXByb3RlY3RlZCBQYWxldHRlUm9vdCBnZXRQYWxldHRlUm9vdCgpIHsKLQkJaWYgKHBhbGV0dGVSb290ID09IG51bGwpIHsKLQkJCWNyZWF0ZVBhbGV0dGVSb290KCk7Ci0JCX0KLQkJcmV0dXJuIHBhbGV0dGVSb290OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVQYWxldHRlUm9vdCgpIHsKLQkJcGFsZXR0ZVJvb3QgPSBuZXcgUGFsZXR0ZVJvb3QoKTsKLQkJcGFsZXR0ZVJvb3QuYWRkQWxsKGNyZWF0ZUNhdGVnb3JpZXMocGFsZXR0ZVJvb3QpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgY3JlYXRlQ2F0ZWdvcmllcyhQYWxldHRlUm9vdCByb290KSB7Ci0JCUxpc3QgY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlQYWxldHRlQ29udGFpbmVyIHBhbGV0dGVDb250YWluZXIgPSBjcmVhdGVDb250cm9sR3JvdXAocm9vdCk7Ci0JCWlmIChwYWxldHRlQ29udGFpbmVyICE9IG51bGwpIHsKLQkJCWNhdGVnb3JpZXMuYWRkKHBhbGV0dGVDb250YWluZXIpOwotCQl9Ci0KLQkJcmV0dXJuIGNhdGVnb3JpZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFBhbGV0dGVDb250YWluZXIgY3JlYXRlQ29udHJvbEdyb3VwKFBhbGV0dGVSb290IHJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJLy8gc2F2ZURpYWdyYW0oKTsKLQkJLy8gc2F2ZVNjcmVlbigpOwotCi0JCWZpbmFsIE1ldGhvZEVsZW1lbnQgZSA9IGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKTsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU2FmZVJ1bm5hYmxlLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yCi0JCQkJCQkJLmJlZ2luVGFzaygKLQkJCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJCW1vbml0b3IKLQkJCQkJCQkuc2V0VGFza05hbWUoRGlhZ3JhbVVJUmVzb3VyY2VzLmJpbmQoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2UKLQkJCQkJCQkJCSwgZS5lUmVzb3VyY2UoKS5nZXRVUkkoKS5pc0ZpbGUoKSA/IGUuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgOiBlLmdldE5hbWUoKSkpOyAKLQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcnNpc3Rlci5zYXZlKGUuZVJlc291cmNlKCkpOwotCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pICgoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJCS5nZXRDb250ZW50cygpKS5nZXRNb2RlbCgpOwotCQkJCQkJZGlhZ3JhbS5zZXROZXcoZmFsc2UpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKGV4KTsKLQkJCQkJCQlWaWV3SGVscGVyCi0JCQkJCQkJCQkucmVsb2FkQ3VycmVudExpYmFyeU9uUm9sbGJhY2tFcnJvcihnZXRTaXRlKCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5V2FybmluZygKLQkJCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXRUZXh0KCksCi0JCQkJCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fc2F2ZUVycm9yCi0JCQkJCQkJCQkJLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQkvLyBSZWZyZXNoIHRoZSBuZWNlc3Nhcnkgc3RhdGUuCi0JCQkJCS8vCi0JCQkJCS8vZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpLm1hcmtTYXZlTG9jYXRpb24oKTsKLQkJCQkJZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0JCQkJCWNoYW5nZVRpbWUgPSAtMTsKLQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlQXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpLmlzRGlydHkoKTsKLQl9Ci0KLQkvKiogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJaWYgKGVkaXRQYXJ0ICE9IG51bGwpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbCAmJiBkaWFncmFtLmlzUmVhZE9ubHkoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVkaXRQYXJ0KCkgewotCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpOwotCQlPYmplY3Qgb2JqZWN0OwotCQlpZiAoZWRpdG9ySW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCW9iamVjdCA9IGVkaXRvcklucHV0LmdldFdyYXBwZXIoKTsKLQkJfSBlbHNlIHsKLQkJCW9iamVjdCA9IGVkaXRvcklucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJfQotCQkKLQkJY2hhbmdlVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQllZGl0UGFydCA9IGNyZWF0ZURpYWdyYW1FZGl0UGFydCgpOwotCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJLy8gcGFzcyBhbG9uZyB0aGUgU3VwcHJlc3Npb24gaW5zdGFuY2UgZnJvbSBpbnB1dCB0byBkaWFncmFtIG1vZGVsCi0JCS8vCi0JCWRpYWdyYW0uc2V0U3VwcHJlc3Npb24oZWRpdG9ySW5wdXQuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCWRpYWdyYW0uc2V0T2JqZWN0KG9iamVjdCk7Ci0JCWRpYWdyYW0uYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQotCQlpZighZGlhZ3JhbS5pc05ldygpKSB7Ci0JCQljaGFuZ2VUaW1lID0gLTE7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLnNldElucHV0KGlucHV0KTsKLQotCQlNZXRob2RFbGVtZW50IGUgPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCk7Ci0JCWlmIChlICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVkaXRQYXJ0KCk7Ci0KLQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIGdldEVkaXRvcklucHV0KCk7Ci0JCQlzZXRQYXJ0TmFtZShnZXRQYXJ0TmFtZVByZWZpeCgpCi0JCQkJCSsgZS5nZXROYW1lKCkKLQkJCQkJKyAiLCAiICsgZWRpdG9ySW5wdXQuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gc2V0VGl0bGVJbWFnZShnZXRUeXBlSW1hZ2UoZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEVkaXRQYXJ0IGNyZWF0ZURpYWdyYW1FZGl0UGFydCgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQYXJ0TmFtZVByZWZpeCgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREaWFncmFtVHlwZSgpOwotCi0JLyoqCi0JICogR2V0IHBhcmVudCBlZGl0b3IKLQkgKiBAcmV0dXJuIGVkaXRvcgotCSAqLwotCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRQYXJlbnRFZGl0b3IoKSB7Ci0JCXJldHVybiBwYXJlbnRFZGl0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50RWRpdG9yKElFZGl0b3JQYXJ0IHBhcmVudEVkaXRvcikgewotCQl0aGlzLnBhcmVudEVkaXRvciA9IHBhcmVudEVkaXRvcjsKLQl9Ci0JCi0JLy9BZGRpbmcgbGlicmFyeWNobmFnZWQgbGlzdGVuZXIsIGlmIGNvbmZpZ3VyYXRpb24gZ290IGNoYW5nZWQgZGlhZ3JhbSBuZWVkcyB0byByZWZyZXNoCi0JcHJpdmF0ZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpYnJhcnlMaXN0ZW5lciA9IG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCXN3aXRjaCAob3B0aW9uKSB7Ci0JCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQ6IHsKLQkJCQlpZiAoY29sbGVjdGlvbiAhPSBudWxsICYmIGNvbGxlY3Rpb24uY29udGFpbnMoY3VycmVudENvbmZpZykpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0Uuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsJCQkJCQotCQkJCQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKTsKLQkJCQkJCWFjdGlvbi5ydW4oKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0Uuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQkJCQl9Ci0JCQkJfQkJCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvLyBoYW5kbGVkIGJ5IGxpYlN2Y0xpc3RlbmVyCi0JCQkvLwotLy8JCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NPTkZJR1VSQVRJT05fU0VMRUNURUQ6IHsKLS8vCQkJCWNvbmZpZ0NoYW5nZWQoKTsKLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCQotCXByaXZhdGUgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGliU3ZjTGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJY29uZmlnQ2hhbmdlZCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0JCQotCX07Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ0NoYW5nZWQoKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlpZihjdXJyZW50Q29uZmlnICE9IGNvbmZpZykgewotCQkJLy8gcmVmcmVzaCBvbmx5IGlmIHRoZSBhY3RpdmUgcGFydCBpcyB0aGlzIGRpYWdyYW0gZWRpdG9yIG9yIHByb2Nlc3MgZWRpdG9yIG9mIHRoZSBwcm9jZXNzCi0JCQkvLyB0aGF0IG93bnMgdGhpcyBkaWFncmFtCi0JCQkvLwotCQkJSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydCA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmdldEFjdGl2ZVBhcnQoKTsKLQkJCWJvb2xlYW4gcmVmcmVzaCA9ICBhY3RpdmVQYXJ0ID09IHRoaXM7Ci0JCQlpZighcmVmcmVzaCkgewotCQkJCWlmKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBpbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpICgoUHJvY2Vzc0VkaXRvcilhY3RpdmVQYXJ0KS5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCQlPYmplY3QgcHJvY0NvbXAgPSBpbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCUVPYmplY3QgZGlhZ3JhbSA9ICgoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpKS5nZXRVTUFEaWFncmFtKCk7Ci0JCQkJCXJlZnJlc2ggPSBVbWFVdGlsLmlzQ29udGFpbmVkQnkoZGlhZ3JhbSwgcHJvY0NvbXApOwotCQkJCX0KLQkJCX0KLQkJCWlmKHJlZnJlc2gpIHsKLQkJCQljdXJyZW50Q29uZmlnID0gY29uZmlnOwotCQkJCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUkVGUkVTSCk7Ci0JCQkJYWN0aW9uLnJ1bigpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKiBvdmVycmlkZSB0byBkb25vdCBhbGxvdyBhbnkgbm9kZSBzZWxlY3Rpb24gaW4gQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gCi0JICogaWYgYWN0aXZpdHkgaXMgZXh0ZW5kcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOwotCQlpZihlZGl0UGFydCAhPSBudWxsKXsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKWVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQlpZihkaWFncmFtLmlzUmVhZE9ubHkoKSB8fCBUbmdVdGlsLmlzTG9ja2VkKGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKSkpewotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLnNlbGVjdChlZGl0UGFydCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaERpYWdyYW0oKXsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUkVGUkVTSCkucnVuKCk7Ci0JfQotCQotLy8JLyoKLS8vCSAqIE1ldGhvZCBzZXRzIHRoZSBjb250ZXh0IG1lbnUgY29udHJpYnV0aW5nIGl0ZW1zIHN0YXRlLgotLy8JICogVGhpcyBpcyBlZmZpY2llbnQgd2F5IGluc3RlYWQgb2YgZG9pbmcgYXQgZWFjaCBhY3Rpb24uIAotLy8JICogVW5jb21tZW50IHRoaXMgY29kZSwgb25jZSBhbGwgdGhlIHBsYWNlIGlzRW5hYmxlZCBDb2RlIGlzIHJlbW92ZWQuCi0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIHNldFN0YXRlTWVudUNvbnRyaWJ1dGVJdGVtcygpewotLy8JCQotLy8JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLS8vCQlpZihlZGl0UGFydHMuc2l6ZSgpID09IDApewotLy8JCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihERUxFVEVfRElBR1JBTSkuc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQl9Ci0vLwkJaWYoZWRpdFBhcnRzLnNpemUoKSA9PSAxKXsKLS8vCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpZWRpdFBhcnRzLmdldCgwKTsKLS8vCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oU0VMRUNUX0xJTkspLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCWlmIChlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0vLwkJCQlpZigoKFR5cGVkTm9kZSkgZWRpdFBhcnQuZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpCi0vLwkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihGT05UX0RJQUxPRykuc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFNFTEVDVF9MSU5LKS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJfQotLy8JCQlpZihlZGl0UGFydCBpbnN0YW5jZW9mIExpbmtFZGl0UGFydCl7Ci0vLwkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfQkVORF9QT0lOVCkuc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCUxpbmsgbGluayA9IChMaW5rKWVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0vLwkJCQlpZihsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgPiAwKXsKLS8vCQkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBTElHTl9CRU5EX1BPSU5UKS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCQotLy8JCX0KLS8vCQlpZihlZGl0UGFydHMuc2l6ZSgpID09IDIpewotLy8JCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfTElOSykuc2V0RW5hYmxlZCh0cnVlKTsgCi0vLwkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGVkaXRQYXJ0cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLS8vCQkJCU9iamVjdCBwYXJ0ID0gaXRvci5uZXh0KCk7Ci0vLwkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEZyZWVUZXh0RWRpdFBhcnQpCi0vLwkJCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0xJTkspLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQl9Ci0vLwkJfQotLy8JfQotCQotLy8JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0vLwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotLy8JCXN1cGVyLnNldEZvY3VzKCk7Ci0vLwkJLy8gUmVmcmVzaCBpcyBleHBlbnNpdmUgb3BlcmF0aW9uLgotLy8JCS8vIFRPRE8gLSBmaW5kIHByb2Nlc3Mgc29sdXRpb24gZm9yIG5vdGlmaWNhdGlvbiBiZXR3ZWVuIAotLy8JCS8vIGJhc2UgZGlhZ3JhbSBhbmQgZXh0ZW5kIGRpYWdyYW0uICAgICAKLS8vCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCk7Ci0vLwkJaWYoKChEaWFncmFtKWVkaXRQYXJ0LmdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKSl7Ci0vLwkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFJFRlJFU0gpLnJ1bigpOwotLy8JCX0KLS8vCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpewotLy8JCQlpZigoKFZhcmlhYmlsaXR5RWxlbWVudCllbGVtZW50KS5nZXRWYXJpYWJpbGl0eVR5cGUoKSAhPSBudWxsKXsKLS8vCQkJCWlmKCEoKFZhcmlhYmlsaXR5RWxlbWVudCllbGVtZW50KS5nZXRWYXJpYWJpbGl0eVR5cGUoKS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUwpKXsKLS8vCQkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKS5ydW4oKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQkJCi0vLwkJfQotLy8JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxZjg3ZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbVVwZGF0ZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5GcmVlVGV4dE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuTWFycXVlZVRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYW5uaW5nU2VsZWN0aW9uVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLQotCi0vKioKLSAqIEFuIGVkaXRvciBmb3IgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUVkaXRvciB7Ci0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNFVF9ESUFHUkFNX0xBWU9VVCA9ICJyZXNldF9kaWFncmFtX2xheW91dCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IHJvbGVOb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3RvcnkgdGFza05vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSB3cGROb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWxDbGVhblVwID0gZmFsc2U7Ci0JcHJpdmF0ZSBCcmVha2Rvd25BZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQotCS8vIGEgaGFjawotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVFZGl0UGFydEZhY3RvcnkoKQotCSAqLwotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpOwotCQkvLyByZXR1cm4gbmV3IEVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJLy8KLQkJLy8gcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotCQkvLyBpZihtb2RlbCBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkvLyByZXR1cm4gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KChBY3Rpdml0eURldGFpbERpYWdyYW0pCi0JCS8vIG1vZGVsKTsKLQkJLy8gfQotCQkvLyBlbHNlIGlmKG1vZGVsIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGUpIHsKLQkJLy8gcmV0dXJuIG5ldyBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KChSb2xlVGFza0NvbXBvc2l0ZSkgbW9kZWwpOwotCQkvLyB9Ci0JCS8vIGVsc2UgaWYobW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSl7Ci0JCS8vIHJldHVybiBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCgoV29ya1Byb2R1Y3RDb21wb3NpdGUpCi0JCS8vIG1vZGVsKTsKLQkJLy8gfQotCQkvLyBlbHNlIGlmKG1vZGVsIGluc3RhbmNlb2YgUm9sZU5vZGUKLQkJLy8gfHwgbW9kZWwgaW5zdGFuY2VvZiBUYXNrTm9kZQotCQkvLyB8fCBtb2RlbCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUKLQkJLy8gKQotCQkvLyB7Ci0JCS8vIHJldHVybiBuZXcgRGVzY3JpcHRvck5vZGVFZGl0UGFydCgoTmFtZWROb2RlKSBtb2RlbCk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZihtb2RlbCBpbnN0YW5jZW9mIExpbmspIHsKLQkJLy8gcmV0dXJuIG5ldyBMaW5rRWRpdFBhcnQoKExpbmspIG1vZGVsKTsKLQkJLy8gfQotCQkvLyBpZihtb2RlbCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkvLyBUeXBlZE5vZGUgbm9kZSA9IChUeXBlZE5vZGUpIG1vZGVsOwotCQkvLyBzd2l0Y2gobm9kZS5nZXRUeXBlKCkpIHsKLQkJLy8gY2FzZSBUeXBlZE5vZGUuU1RBUlQ6IHJldHVybiBuZXcgU3RhcnROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCS8vIGNhc2UgVHlwZWROb2RlLkVORDogcmV0dXJuIG5ldyBFbmROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCS8vIGNhc2UgVHlwZWROb2RlLkRFQ0lTSU9OOiByZXR1cm4gbmV3IERlY2lzaW9uTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkvLyBjYXNlIFR5cGVkTm9kZS5TWU5DSF9CQVI6IHJldHVybiBuZXcgU3luY2hCYXJOb2RlRWRpdFBhcnQobm9kZSk7Ci0JCS8vIGNhc2UgVHlwZWROb2RlLkZSRUVfVEVYVDogcmV0dXJuIG5ldyBGcmVlVGV4dEVkaXRQYXJ0KG5vZGUpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIG51bGw7Ci0JCS8vIH0KLQkJLy8JCQkKLQkJLy8gfTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NyZWF0ZURpYWdyYW1FZGl0UGFydCgpCi0JICovCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZURpYWdyYW1FZGl0UGFydCgpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydChNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpKTsKLQl9Ci0KLS8vCS8qCi0vLwkgKiAobm9uLUphdmFkb2MpCi0vLwkgKiAKLS8vCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVFZGl0UGFydChqYXZhLmxhbmcuT2JqZWN0KQotLy8JICovCi0vLwlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUpIHsKLS8vCQlBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLS8vCQkJCS5jcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW0oKTsKLS8vCQlkaWFncmFtLnNldE9iamVjdChlKTsKLS8vCQlFZGl0UGFydCBwYXJ0ID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KGRpYWdyYW0pOwotLy8JCXBhcnQuc2V0TW9kZWwoZGlhZ3JhbSk7Ci0vLwkJZGlhZ3JhbS5hZGRDb25zdW1lcih0aGlzKTsKLS8vCQlyZXR1cm4gcGFydDsKLS8vCX0KLQkJCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2dldFBhcnROYW1lUHJlZml4KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnROYW1lUHJlZml4KCkgewotCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVDb250cm9sR3JvdXAoUGFsZXR0ZVJvb3Qgcm9vdCkgewotCQlpbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKTsKLQotCQlQYWxldHRlR3JvdXAgY29udHJvbEdyb3VwID0gbmV3IFBhbGV0dGVHcm91cCgiQ29udHJvbCBHcm91cCIpOyAvLyROT04tTkxTLTEkCi0KLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVRvb2xFbnRyeSB0b29sID0gbmV3IFBhbm5pbmdTZWxlY3Rpb25Ub29sRW50cnkoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dCwgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXAKLQkJKTsKLQkJdG9vbC5zZXRTbWFsbEljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkic2VsZWN0X3BhbDE2LmdpZiIpKTsKLQkJdG9vbC5zZXRMYXJnZUljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkic2VsZWN0X3BhbDI0LmdpZiIpKTsKLQkJZW50cmllcy5hZGQodG9vbCk7Ci0JCXJvb3Quc2V0RGVmYXVsdEVudHJ5KHRvb2wpOwotCi0JCXRvb2wgPSBuZXcgTWFycXVlZVRvb2xFbnRyeSgpOwotCQl0b29sLnNldFNtYWxsSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJtYXJxX3BhbDE2LmdpZiIpKTsKLQkJdG9vbC5zZXRMYXJnZUljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkibWFycV9wYWwyNC5naWYiKSk7Ci0JCWVudHJpZXMuYWRkKHRvb2wpOwotCi0JCUNvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5IGNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dCwgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcCwgLy8kTk9OLU5MUy0xJAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLkZSRUVfVEVYVCwgZnJlZVR4dE5vZGVDcmVhdGlvbkZhY3RvcnksCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmcmVldGV4dF9wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnJlZXRleHRfcGFsMjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb250cm9sR3JvdXAuYWRkQWxsKGVudHJpZXMpOwotCQlyZXR1cm4gY29udHJvbEdyb3VwOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCk7Ci0KLQkJaWYgKHJvbGVOb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpIHsKLQkJCXJvbGVOb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlSb2xlVGFza0NvbXBvc2l0ZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJbm9kZS5zZXRVTUFEaWFncmFtKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZURlc2NyaXB0b3IoKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUjsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0KLQkJQ3JlYXRpb25GYWN0b3J5IGNyZWF0aW9uRmFjdG9yeSA9IHJvbGVOb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmICh0YXNrTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQl0YXNrTm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJTmFtZWROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tOb2RlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRvcigpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuVEFTS19ERVNDUklQVE9SOwotCQkJCX0KLQotCQkJfTsKLQkJfQotCQljcmVhdGlvbkZhY3RvcnkgPSB0YXNrTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAod3BkTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQl3cGROb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlOYW1lZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJbm9kZS5zZXRVTUFEaWFncmFtKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5UQVNLX0RFU0NSSVBUT1I7Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IHdwZE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogRWRpdG9yIElucHV0Ci0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVkaXRvcklucHV0IGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IHsKLQotCQkvKioKLQkJICogQHBhcmFtIGUKLQkJICovCi0JCXB1YmxpYyBFZGl0b3JJbnB1dChPYmplY3QgZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJCXN1cGVyKGUsIHN1cHByZXNzaW9uKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogU2V0IGZvY3VzIG9uIHRoZSBlZGl0b3IKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5HcmFwaGljYWxFZGl0b3Ijc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlzdXBlci5zZXRGb2N1cygpOwotCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRDb250ZW50cygpLnJlZnJlc2goKTsKLQkJaWYgKCFpbml0aWFsQ2xlYW5VcCkgewotCQkJY2xlYW5VcERpYWdyYW0oKTsKLQkJCWluaXRpYWxDbGVhblVwID0gdHJ1ZTsKLQkJCS8vIExvY2tlZCBQbHVnaW4gY2FzZTogRGlzcGxheSBnZW5lcmF0ZWQgQUREIGRpYWdyYW0sIFBlcm1pc3Npb24gZGVuaWVkIHRvIHNhdmUsICAKLQkJCS8vIGFuZCBObyBkaXJ0eSBmbGFnIG9uIGVkaXRvci4gCi0JCQlpZihUbmdVdGlsLmlzTG9ja2VkKGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKSkpewotCQkJCS8vIEZsdXNoIGFsbCBjb21tYW5kcywgbWVhbnMgd2lsbCBub3Qgc2F2ZS4KLQkJCQlnZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOwotCQkJCS8vIEZpcmUgZGlydHkgZmxhZyBwcm9wZXJ0eSBjaGFuZ2UsIG5vIGRpcnR5IGZsYWcgb24gZWRpdG9yLgotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCX0KLQotCS8qKgotCSAqIENsZWFuIGRpYWdyYW0KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuVXBEaWFncmFtKCkgewotLy8JCU1ldGhvZEVsZW1lbnQgb2JqID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGdldEVkaXRvcklucHV0KCkpCi0vLwkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQlEaWFncmFtVXBkYXRlU2VydmljZSBzZXJ2aWNlID0gbmV3IERpYWdyYW1VcGRhdGVTZXJ2aWNlKAotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLCBnZXRFZGl0RG9tYWluKCksIGdldEFjdGlvblJlZ2lzdHJ5KCkpOwotCQlzZXJ2aWNlLmNsZWFuVXBEaWFncmFtKCk7Ci0JCS8vIGlmIChUbmdVdGlsLmlzR2VuZXJhbGl6ZXIob2JqLAotCQkvLyBnZXRFeHRlbmRBbmRDb250cmlidXRlVmFyaWFiaWxpdHlUeXBlcygpKQotCQkvLyAmJiAhaW5pdGlhbENsZWFuVXApIHsKLQkJLy8gaW5pdGlhbENsZWFuVXAgPSB0cnVlOwotCQkvLyBJQWN0aW9uIHJlc2V0ID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCS8vIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5SRVNFVF9ESUFHUkFNX0xBWU9VVCk7Ci0JCS8vIHJlc2V0LnJ1bigpOwotCQkvLyBkb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCS8vIH0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY29udHJpYnV0ZVRvQ29udGV4dE1lbnUob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVG9Db250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5jb250cmlidXRlVG9Db250ZXh0TWVudShtZW51KTsKLQotCQlib29sZWFuIGNhbk1vZGlmeSA9ICFpc1JlYWRPbmx5KCk7Ci0KLQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRVNFVF9ESUFHUkFNX0xBWU9VVCk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51Lmluc2VydEJlZm9yZShERUxFVEVfRElBR1JBTSwgYWN0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVBY3Rpb25zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0JCUFjdGlvbiByZXNldExheW91dEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcl9SZXNldERpYWdyYW1MYXlvdXRfdGV4dCkgeyAvLyROT04tTkxTLTEkCi0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKS5ydW4oKTsKLQkJCQlpZiAoZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0Q29udGVudHMoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRlcCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJCQkJTGlzdCBsb2NhbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYoZGVwLmdldENoaWxkcmVuKCkgIT0gbnVsbCAmJiAhZGVwLmdldENoaWxkcmVuKCkuaXNFbXB0eSgpKXsKLQkJCQkJCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGRlcC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCWlmKCEobmV4dCBpbnN0YW5jZW9mIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KSl7Ci0JCQkJCQkJCWxvY2FsLmFkZChuZXh0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZGVwLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpLmFkZEFsbChsb2NhbCk7Ci0JCQkJCWNsZWFuVXBEaWFncmFtKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJcmV0dXJuIGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCkuc2l6ZSgpID09IDA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIFJFU0VUX0RJQUdSQU1fTEFZT1VUOwotCQkJfQotCi0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24ocmVzZXRMYXlvdXRBY3Rpb24pOwotCX0KLQotLy8JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBleHRlbmRBbmRDb250cmlidXRlVmFyaWFiaWxpdHlUeXBlcyA9IG51bGw7Ci0KLS8vCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gZ2V0RXh0ZW5kQW5kQ29udHJpYnV0ZVZhcmlhYmlsaXR5VHlwZXMoKSB7Ci0vLwkJaWYgKGV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzID09IG51bGwpIHsKLS8vCQkJZXh0ZW5kQW5kQ29udHJpYnV0ZVZhcmlhYmlsaXR5VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCWV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzCi0vLwkJCQkJLmFkZChWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKTsKLS8vCQkJZXh0ZW5kQW5kQ29udHJpYnV0ZVZhcmlhYmlsaXR5VHlwZXMKLS8vCQkJCQkuYWRkKFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIGV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzOwotLy8JfQotCQotCS8qKgotCSAqIEJyZWFrIGRvd24gYWRhcHRlciBmYWN0b3J5IGNsYXNzCi0JICovCi0JcHVibGljIGNsYXNzIEJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5Ci0JewotCQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB3YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHRic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnkgd3Bic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgY2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JCXB1YmxpYyBCcmVha2Rvd25BZGFwdGVyRmFjdG9yeShNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykKLQkJewotCQkJLy8gY3JlYXRlIGFkYXB0IGZhY3RvcmllcwotCQkJd2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVdCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCXRic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQl3cGJzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVdQQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQljYnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuY3JlYXRlUHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCQkJLy8gc2V0IGNvbmZpZ3VyYXRpb24gZmlsdGVyCi0JCQlEaWFncmFtQWRhcHRlckZhY3RvcnlGaWx0ZXIgY29uZmlndXJhdG9yID0gbmV3IERpYWdyYW1BZGFwdGVyRmFjdG9yeUZpbHRlcigKLQkJCQkJbWV0aG9kQ29uZmlnLCB0aGlzKTsKLQotCQkJd2JzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCQl0YnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsKLQkJCXdwYnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsKLQkJCWNic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihjb25maWd1cmF0b3IpOwkJfQotCQkKLQkJcHVibGljIHZvaWQgY2xlYXIoKQotCQl7Ci0JCQlpZiAod2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXdic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0KLQkJCWlmICh0YnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJdGJzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJCXRic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKHdwYnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJd3Bic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQl3cGJzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCi0JCQlpZiAoY2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWNic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQljYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRGlhZ3JhbSBBZGFwdGVyIGZhY3RvcnkgZmlsdGVyCi0JICoKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRGlhZ3JhbUFkYXB0ZXJGYWN0b3J5RmlsdGVyIGV4dGVuZHMgUHJvY2Vzc0NvbmZpZ3VyYXRvcgotCQkJaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnlGaWx0ZXIgewotCi0JCXByaXZhdGUgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5IGZhY3Rvcnk7Ci0KLQkJLyoKLQkJICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JCSAqLwotCQlwdWJsaWMgRGlhZ3JhbUFkYXB0ZXJGYWN0b3J5RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLAotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCQlzdXBlcihtZXRob2RDb25maWcsIG51bGwpOwotCQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gV0JTIEFkYXB0ZXIgRmFjdG9yeQotCQkgKi8KLQkJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFdCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIGZhY3Rvcnkud2JzQWRhcHRlckZhY3Rvcnk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIFRlYW0gQWxsb2NhdGlvbiBBZGFwdGVyIEZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRUQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCXJldHVybiBmYWN0b3J5LnRic0FkYXB0ZXJGYWN0b3J5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBXUCBVc2FnZSBBZGFwdGVyIEZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRXUEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS53cGJzQWRhcHRlckZhY3Rvcnk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGNvbnNvbGlkYXRlZCB2aWV3IGFkYXB0ZXIgZmFjdG9yeQotCQkgKi8KLQkJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldENCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIGZhY3RvcnkuY2JzQWRhcHRlckZhY3Rvcnk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmopOwotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGZhY3RvcnkgIT0gbnVsbCl7Ci0JCQlmYWN0b3J5LmNsZWFyKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTYzMDEyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogQnJlYWtkb3duIEVsZW1lbnQgaW5wdXQgZm9yIGFuIGVkaXRvcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCA3LCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgZXh0ZW5kcyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgewotCi0JcHJpdmF0ZSBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbjsKLQotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dChPYmplY3Qgb2JqZWN0LCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlzdXBlcigoTWV0aG9kRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KSk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0OwotCQl9Ci0JCXRoaXMuc3VwcHJlc3Npb24gPSBzdXBwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN1cHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHN1cHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3JhcHBlci4KLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0V3JhcHBlcigpIHsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKG9iaikpIHsKLQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBvdGhlciA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIG9iajsKLQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50KCkgPT0gb3RoZXIuZ2V0TWV0aG9kRWxlbWVudCgpCi0JCQkJCSYmIHN1cHByZXNzaW9uLmdldFByb2Nlc3MoKSA9PSBvdGhlci5nZXRTdXBwcmVzc2lvbigpCi0JCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29sdW1uRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29sdW1uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMGIzMmMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0NvbHVtbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotLyoqCi0gKiBDb2x1bW4gZGVzY3JpcHRvcnMgdXNlZCBmb3IgcHJvY2VzcyBlZGl0b3JzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2x1bW5EZXNjcmlwdG9yIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTY3MTg0NzY5ODU5NzA5OTdMOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VMTF9FRElUT1JfVFlQRV9OT05FID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTExfRURJVE9SX1RZUEVfVEVYVCA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU4gPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOID0gMzsKLQotCXB1YmxpYyBTdHJpbmcgaWQ7Ci0KLQlwdWJsaWMgU3RyaW5nIGxhYmVsOwotCi0JcHVibGljIGludCB3aWR0aDsKLQotCXB1YmxpYyBib29sZWFuIHJlc2l6YWJsZTsKLQotCXB1YmxpYyBpbnQgY2VsbEVkaXRvclR5cGU7Ci0KLQlwdWJsaWMgaW50IHdlaWdodDsKLQotCXB1YmxpYyBpbnQgYWxpZ25tZW50OwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogCQkJSUQgb2YgdGhlIGNvbHVtbgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIAkJCUNvbHVtbiBOYW1lCi0JICogQHBhcmFtIHdlaWdodAotCSAqIAkJCUNvbHVtbiB3ZWlnaHQKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAJCQlDb2x1bW4gV2lkdGgKLQkgKiBAcGFyYW0gcmVzaXphYmxlCi0JICogCQkJRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIGNvbHVtbiBpcyByZXNpemFibGUgb3Igbm90Ci0JICogQHBhcmFtIGNlbGxFZGl0b3JUeXBlCi0JICogCQkJQ29sdW1uIGNlbGwgZWRpdG9yIHR5cGUKLQkgKi8KLQlwdWJsaWMgQ29sdW1uRGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBsYWJlbCwgaW50IHdlaWdodCwgaW50IHdpZHRoLAotCQkJYm9vbGVhbiByZXNpemFibGUsIGludCBjZWxsRWRpdG9yVHlwZSkgewotCQl0aGlzKGlkLCBsYWJlbCwgd2VpZ2h0LCB3aWR0aCwgcmVzaXphYmxlLCBjZWxsRWRpdG9yVHlwZSwgU1dULkxFRlQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAJCQlJRCBvZiB0aGUgY29sdW1uCi0JICogQHBhcmFtIGxhYmVsCi0JICogCQkJQ29sdW1uIE5hbWUKLQkgKiBAcGFyYW0gd2VpZ2h0Ci0JICogCQkJQ29sdW1uIHdlaWdodAotCSAqIEBwYXJhbSB3aWR0aAotCSAqIAkJCUNvbHVtbiBXaWR0aAotCSAqIEBwYXJhbSByZXNpYWJsZQotCSAqIAkJCUZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBjb2x1bW4gaXMgcmVzaXphYmxlIG9yIG5vdAotCSAqIEBwYXJhbSBjZWxsRWRpdG9yVHlwZQotCSAqIAkJCUNvbHVtbiBjZWxsIGVkaXRvciB0eXBlCi0JICogQHBhcmFtIGFsaWdubWVudAotCSAqIAkJCUNvbHVtbiBhbGlnbm1lbnQKLQkgKi8KLQlwdWJsaWMgQ29sdW1uRGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBsYWJlbCwgaW50IHdlaWdodCwgaW50IHdpZHRoLAotCQkJYm9vbGVhbiByZXNpYWJsZSwgaW50IGNlbGxFZGl0b3JUeXBlLCBpbnQgYWxpZ25tZW50KSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLnJlc2l6YWJsZSA9IHJlc2lhYmxlOwotCQl0aGlzLndlaWdodCA9IHdlaWdodDsKLQkJdGhpcy53aWR0aCA9IHdpZHRoOwotCQl0aGlzLmNlbGxFZGl0b3JUeXBlID0gY2VsbEVkaXRvclR5cGU7Ci0JCXRoaXMuYWxpZ25tZW50ID0gYWxpZ25tZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29uZmlndXJhdGlvbkVkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29uZmlndXJhdGlvbkVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NWRmMTY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0NvbmZpZ3VyYXRpb25FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNvbmZpZ1ZpZXdQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ29uZmlndXJhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi0KLS8qKgotICogVGhlIE1ldGhvZCBDb25maWd1cmF0aW9uIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkVkaXRvciBleHRlbmRzIE1ldGhvZEVsZW1lbnRFZGl0b3IgewotCi0JLyoqCi0JICogVGhlIGVkaXRvciBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSUQgPSBDb25maWd1cmF0aW9uRWRpdG9yLmNsYXNzLmdldE5hbWUoKTsKLQotCUNvbmZpZ3VyYXRpb25QYWdlIGNvbmZpZ1BhZ2UgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBlZGl0b3IuCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuICgoQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSBzdXBlci5nZXRFZGl0b3JJbnB1dCgpKQotCQkJCS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNhZGRQYWdlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQlhZGRQYWdlKG5ldyBDb25maWd1cmF0aW9uRGVzY3JpcHRpb24odGhpcykpOwotCQkJY29uZmlnUGFnZSA9IG5ldyBDb25maWd1cmF0aW9uUGFnZSh0aGlzKTsKLQkJCWFkZFBhZ2UoY29uZmlnUGFnZSk7Ci0JCQlhZGRQYWdlKG5ldyBDb25maWdWaWV3UGFnZSh0aGlzKSk7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY2xvc3VyZSBmb3IgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBjbG9zdXJlCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25DbG9zdXJlIGdldENsb3N1cmUoKSB7Ci0JCXJldHVybiBjb25maWdQYWdlLmdldENsb3N1cmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2NyZWF0ZUlucHV0KG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IGNyZWF0ZUlucHV0KE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZihlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIExpc3Qgc2V0Rm9jdXNMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCi0JLyoqCi0JICogQWRkIGdpdmVuIGxpc3RlbmVyIHRvIGxpc3Qgb2YgZm9jdXMgbGlzdGVuZXJzCi0JICogQHBhcmFtIGxpcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRvU2V0Rm9jdXNMaXNlbmVycyhMaXN0ZW5lciBsaXMpIHsKLQkJc2V0Rm9jdXNMaXN0ZW5lcnMuYWRkKGxpcyk7Ci0JfQotCQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I3NldEZvY3VzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsgICAgCQotICAgIAlFdmVudCBlID0gbmV3IEV2ZW50KCk7Ci0gICAgCWUuZGF0YSA9IGdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOyAgIAkKLSAgICAJZm9yIChpbnQgaT0wOyBpPHNldEZvY3VzTGlzdGVuZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgCQlMaXN0ZW5lciBsaXMgPSAoTGlzdGVuZXIpIHNldEZvY3VzTGlzdGVuZXJzLmdldChpKTsKLSAgICAJCWxpcy5oYW5kbGVFdmVudChlKTsKLSAgICAJfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29uZmlndXJhdGlvbkVkaXRvcklucHV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db25maWd1cmF0aW9uRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGM5YTAzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db25maWd1cmF0aW9uRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotCi0vKioKLSAqIEFuIGVkaXRvciBpbnB1dCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQgZXh0ZW5kcyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBjb25maWcKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCS8vIG1ldGhvZENvbmZpZ3VyYXRpb24gPSBjb25maWc7Ci0JCXN1cGVyKGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIHJldHVybiBtZXRob2RDb25maWd1cmF0aW9uOwotCQlyZXR1cm4gKE1ldGhvZENvbmZpZ3VyYXRpb24pIHN1cGVyLmdldE1ldGhvZEVsZW1lbnQoKTsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvRWRpdG9yQ2hvb3Nlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvRWRpdG9yQ2hvb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMGVjMDcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0VkaXRvckNob29zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5WaWV3SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBMYXVuY2hlcyBhIE1ldGhvZCBlZGl0b3IgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgYSBnaXZlbiBtZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yQ2hvb3NlciBpbXBsZW1lbnRzIElFZGl0b3JLZWVwZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgRWRpdG9yQ2hvb3NlciBzaW5nbGV0b24gPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWRpdG9yQ2hvb3NlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKEVkaXRvckNob29zZXIuY2xhc3MpIHsKLQkJCQlpZiAoc2luZ2xldG9uID09IG51bGwpIHsKLQkJCQkJc2luZ2xldG9uID0gbmV3IEVkaXRvckNob29zZXIoKTsKLQkJCQkJSUVkaXRvcktlZXBlci5SRUZFUkVOQ0Uuc2V0RWRpdG9yS2VlcGVyKHNpbmdsZXRvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIHJlc3BlY3RpdmUgZWRpdG9yIGRlcGVuZGluZyBvbiB0aGUgZ2l2ZW4gTWV0aG9kIGVsZW1lbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIEEgTWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgb3BlbkVkaXRvcihPYmplY3Qgb2JqKSB7Ci0JCXRyeSB7Ci0JCQlvYmogPSBWaWV3SGVscGVyLmhhbmRsZURhbmdsaW5nKG9iaik7Ci0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqKTsKLQotCQkJQXJyYXlMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJUmVzb3VyY2UgcmVzID0gKChFT2JqZWN0KSBvYmopLmVSZXNvdXJjZSgpOwotCQkJCWlmIChyZXMgIT0gbnVsbCAmJiAhcmVzLmdldEVycm9ycygpLmlzRW1wdHkoKSkgewotCQkJCQllcnJvcnMuYWRkQWxsKHJlcy5nZXRFcnJvcnMoKSk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQkJUmVzb3VyY2UgcHJlc1JlcyA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmopCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpOwotCQkJCQlpZiAocHJlc1JlcyAhPSBudWxsICYmICFwcmVzUmVzLmdldEVycm9ycygpLmlzRW1wdHkoKSkgewotCQkJCQkJZXJyb3JzLmFkZEFsbChwcmVzUmVzLmdldEVycm9ycygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWVycm9ycy5pc0VtcHR5KCkpIHsKLQkJCQkJZmluYWwgTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkJMCwKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlEaWFnbm9zdGljIGUgPSAoRGlhZ25vc3RpYykgaXRlci5uZXh0KCk7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLAotCQkJCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAwLCBlCi0JCQkJCQkJCQkJLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWRpdG9yQ2hvb3Nlcl9SZXNvdXJjZXNFcnJvciwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCW11bHRpU3RhdHVzKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICgob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHx8IChvYmogaW5zdGFuY2VvZiBSb2xlKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgVGFzaykgfHwgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHx8IChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgRG9tYWluKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgUm9sZVNldCkgfHwgKG9iaiBpbnN0YW5jZW9mIFRvb2wpCi0JCQkJCXx8IChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpCi0JCQkJCXx8IChvYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSkgewotCQkJCW9wZW5FZGl0b3IoKE1ldGhvZEVsZW1lbnQpIG9iaiwgTWV0aG9kRWxlbWVudEVkaXRvci5FRElUT1JfSUQpOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RDYXQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG9iajsKLQkJCQlpZihUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KGN1c3RDYXQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJb3BlbkVkaXRvcigoTWV0aG9kRWxlbWVudCkgb2JqLCBNZXRob2RFbGVtZW50RWRpdG9yLkVESVRPUl9JRCk7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlvcGVuRWRpdG9yKChNZXRob2RFbGVtZW50KSBvYmosIFByb2Nlc3NFZGl0b3IuRURJVE9SX0lEKTsKLQotCQkJCS8vIG9wZW4gcHJvcGVydGllcyB2aWV3IGJ5IGRlZmF1bHQgd2hlbiB3ZSBvcGVuIFByb2Nlc3MgRWRpdG9yCi0JCQkJdHJ5IHsKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRBY3RpdmVQYWdlKCkuc2hvd1ZpZXcoCi0JCQkJCQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIsIG51bGwsIElXb3JrYmVuY2hQYWdlLlZJRVdfVklTSUJMRSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCWV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJT2JqZWN0IGNvbnRhaW5lciA9ICgoUHJvY2Vzcykgb2JqKS5lQ29udGFpbmVyKCk7Ci0JCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJb3BlbkVkaXRvcigoTWV0aG9kRWxlbWVudCkgY29udGFpbmVyLAotCQkJCQkJCVByb2Nlc3NFZGl0b3IuRURJVE9SX0lEKTsKLQkJCQl9Ci0JCQl9ZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCW9wZW5FZGl0b3IoKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iaiwKLQkJCQkJCUNvbmZpZ3VyYXRpb25FZGl0b3IuRURJVE9SX0lEKTsKLQkJCX1lbHNlIGlmKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpewotCQkJCVByb2Nlc3MgcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudClvYmopOwotCQkJCU9iamVjdCBjb250YWluZXIgPSBwcm9jZXNzLmVDb250YWluZXIoKTsKLQkJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlvcGVuRWRpdG9yKChNZXRob2RFbGVtZW50KSBjb250YWluZXIsCi0JCQkJCQkJUHJvY2Vzc0VkaXRvci5FRElUT1JfSUQpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyByZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uOyAvLyROT04tTkxTLTEkCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgcmVhc29uLCB0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBDb25maWd1cmF0aW9uIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIGVkaXRvcklkCi0JICovCi0JcHJpdmF0ZSB2b2lkIG9wZW5FZGl0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBlZGl0b3JJZCkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQoCi0JCQkJY29uZmlnKTsKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKAotCQkJCQkJZWRpdG9ySW5wdXQsIGVkaXRvcklkKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgTWV0aG9kIGVkaXRvciBmb3IgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBBIE1ldGhvZCBlbGVtZW50LgotCSAqIEBwYXJhbSBlZGl0b3JJZAotCSAqICAgICAgICAgICAgVGhlIGVkaXRvciBJRC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBlZGl0b3JJZCkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoCi0JCQkJZWxlbWVudCk7Ci0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcigKLQkJCQkJCWVkaXRvcklucHV0LCBlZGl0b3JJZCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyAoYnJpbmdzIHRvIGZyb250LCBidXQgZG9lcyBub3QgZ2l2ZSBmb2N1cykgdGhlIE1ldGhvZCBlZGl0b3IgZm9yCi0JICogdGhlIGdpdmVuIG9iamVjdC4gSWYgdGhlcmUgaXMgbm8gb3BlbiBlZGl0b3IgZm9yIHRoZSBvYmplY3QsIGRvZXMKLQkgKiBub3RoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3RFZGl0b3IoT2JqZWN0IG9iaikgewotCQl0cnkgewotCQkJb2JqID0gVmlld0hlbHBlci5oYW5kbGVEYW5nbGluZyhvYmopOwotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCW9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmopOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJCWVkaXRvcklucHV0ID0gbmV3IENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCgKLQkJCQkJKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iaik7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQllZGl0b3JJbnB1dCA9IG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCWlmIChlZGl0b3JJbnB1dCAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gcGFnZS5maW5kRWRpdG9yKGVkaXRvcklucHV0KTsKLQkJCWlmIChlZGl0b3JQYXJ0ICE9IG51bGwpCi0JCQkJcGFnZS5icmluZ1RvVG9wKGVkaXRvclBhcnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogUmV0dXJucyBzZWxlY3RlZCBlZGl0b3IgaW5wdXQKLQkgKiBAcmV0dXJuIFRoZSBvYmplY3Qgd2hpY2ggdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlZGl0b3IgaXMgZWRpdGluZyAob3IKLQkgKiAgICAgICAgIG51bGwpLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0ZWRFZGl0b3JJbnB1dCgpIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCWlmIChlZGl0b3JQYXJ0ICE9IG51bGwpIHsKLQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkKLQkJCQlyZXR1cm4gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KQotCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkKLQkJCQlyZXR1cm4gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KQotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIE1ldGhvZCBlZGl0b3IgZm9yIHRoZSBnaXZlbiBNZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBBIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlRWRpdG9yKE9iamVjdCBvYmopIHsKLQkJdHJ5IHsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGZpbmRFZGl0b3Iob2JqKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCQkJLmNsb3NlRWRpdG9yKGVkaXRvciwgZmFsc2UpOwotCQkJfQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElFZGl0b3JQYXJ0IGZpbmRFZGl0b3IoT2JqZWN0IG9iaikgewotCQl0cnkgewotCQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCgKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5maW5kRWRpdG9yKAotCQkJCQkJCWVkaXRvcklucHV0KTsKLQkJCXJldHVybiBlZGl0b3I7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGxpc3Qgb2YgZGlydHkgZWRpdG9ycyBmb3IgdGhlIGdpdmVuIGVsZW1lbnRzCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHJldHVybglMaXN0IG9mIGRpcnR5IGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzV2l0aERpcnR5RWRpdG9yKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJLy8gQXJyYXlMaXN0IGNsb3NlRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsICYmIGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCQllbGVtZW50ID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgewotCQkJCQllbGVtZW50ID0gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGUgPT0gZWxlbWVudCB8fCBVbWFVdGlsLmlzQ29udGFpbmVkQnkoZWxlbWVudCwgZSkpIHsKLQkJCQkJCQlyZXN1bHQuYWRkKGVsZW1lbnQpOwotCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENsb3NlcyB0aGUgYWxsIG9wZW4gTWV0aG9kIGVkaXRvcnMgb2ZvciB0aGUgZ2l2ZW4gKGRlbGV0ZWQpIGVsZW1lbnQgYW5kCi0JICogYWxsIG9mIGl0cyBjaGlsZHJlbiBhbmQgZ3JhbmQgY2hpbGRyZW4uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBkZWxldGVkIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZUVkaXRvcnNPbkRlbGV0aW9uKE9iamVjdCBlKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlBcnJheUxpc3QgY2xvc2VFZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCQllbGVtZW50ID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgewotCQkJCQllbGVtZW50ID0gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50ICE9IG51bGwKLQkJCQkJCSYmIChlbGVtZW50LmVDb250YWluZXIoKSA9PSBudWxsIHx8IFVtYVV0aWwKLQkJCQkJCQkJLmlzQ29udGFpbmVkQnkoZWxlbWVudCwgZSkpKSB7Ci0JCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IHNpemUgPSBjbG9zZUVkaXRvclJlZnMuc2l6ZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBJRWRpdG9yUmVmZXJlbmNlW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmZXJlbmNlc1tpXSA9IChJRWRpdG9yUmVmZXJlbmNlKSBjbG9zZUVkaXRvclJlZnMuZ2V0KGkpOwotCQl9Ci0JCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3JzKHJlZmVyZW5jZXMsIGZhbHNlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9HcmFwaGljYWxXUERlcGVuZGVuY3lFZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0dyYXBoaWNhbFdQRGVwZW5kZW5jeUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZDY2ZGU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0dyYXBoaWNhbFdQRGVwZW5kZW5jeUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LldQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Db21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Db25uZWN0aW9uQ3JlYXRpb25Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuTWFycXVlZVRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYW5uaW5nU2VsZWN0aW9uVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkdFRkFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLQotCi0vKioKLSAqIEFuIGVkaXRvciBmb3IgZ3JhcGhpY2FsIHdvcmsgcHJvZHVjdCBkZXBlbmVkZW5jeSBkaWFncmFtCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wIAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtRWRpdG9yIHsKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IHdwTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotLy8JcHJpdmF0ZSBJUHJvcGVydHlTaGVldEVudHJ5IHJvb3RFbnRyeTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfV1BfTk9ERSA9ICJjcmVhdGVfd29ya3Byb2R1Y3RfZGVzY3JpcHRvcl9ub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCk7Ci0KLQkJaWYgKHdwTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQl3cE5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlXb3JrUHJvZHVjdE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3ROb2RlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0JCQkJCW5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJbm9kZS5zZXRPYmplY3Qod3BkKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCi0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5XT1JLX1BST0RVQ1Q7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlDcmVhdGlvbkZhY3RvcnkgY3JlYXRpb25GYWN0b3J5ID0gd3BOb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVRvQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvQ29udGV4dE1lbnUobWVudSk7Ci0KLQkJYm9vbGVhbiBjYW5Nb2RpZnkgPSAhaXNSZWFkT25seSgpOwotCi0JCS8vIElBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUFJPUEVSVElFU19QQUdFKTsKLQkJLy8gaWYoYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCS8vIG1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQkvLyB9Ci0JCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX1dQX05PREUpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0JCS8vIEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0QWN0aW9uUmVnaXN0cnkoKTsKLQkJLy8gSUFjdGlvbiBhY3Rpb247Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBY3Rpb24oIlNob3cgJlByb3BlcnRpZXMgVmlldyIpIHsKLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJLy8gcmV0dXJuIFBST1BFUlRJRVNfUEFHRTsKLQkJLy8gfQotCQkvLyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vIHRyeSB7Ci0JCS8vCi0JCS8vIGdldFNpdGUoKS5nZXRQYWdlKCkuc2hvd1ZpZXcoCi0JCS8vICJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7Ci0JCS8vIC8vIHNldElkKCJTaG93X1Byb3BlcnRpZXMiKTsKLQkJLy8gfQotCQkvLyBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCS8vIC8vQXV0aG9yaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleGNlcHRpb24pOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkvLyBMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCS8vIHJldHVybiAoZWRpdFBhcnRzLnNpemUoKSA9PSAxICYmIGVkaXRQYXJ0cy5nZXQoMCkgaW5zdGFuY2VvZgotCQkvLyBFZGl0UGFydCk7Ci0JCS8vIH0KLQkJLy8gfTsKLQkJLy8JCQotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCUlBY3Rpb24gYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dCwgd3BOb2RlQ3JlYXRpb25GYWN0b3J5LCAvLyROT04tTkxTLTEkCi0JCQkJQ1JFQVRFX1dQX05PREUsCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcCwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCX0KLQotCXByb3RlY3RlZCBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZUNvbnRyb2xHcm91cChQYWxldHRlUm9vdCByb290KSB7Ci0JCWluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpOwotCQlQYWxldHRlR3JvdXAgY29udHJvbEdyb3VwID0gbmV3IFBhbGV0dGVHcm91cCgiQ29udHJvbCBHcm91cCIpOyAvLyROT04tTkxTLTEkCi0KLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVRvb2xFbnRyeSB0b29sID0gbmV3IFBhbm5pbmdTZWxlY3Rpb25Ub29sRW50cnkoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dCwgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXAKLQkJKTsKLQkJdG9vbC5zZXRTbWFsbEljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkic2VsZWN0X3BhbDE2LmdpZiIpKTsKLQkJdG9vbC5zZXRMYXJnZUljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkic2VsZWN0X3BhbDI0LmdpZiIpKTsKLQkJZW50cmllcy5hZGQodG9vbCk7Ci0JCXJvb3Quc2V0RGVmYXVsdEVudHJ5KHRvb2wpOwotCi0JCXRvb2wgPSBuZXcgTWFycXVlZVRvb2xFbnRyeSgpOwotCQl0b29sLnNldFNtYWxsSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJtYXJxX3BhbDE2LmdpZiIpKTsKLQkJdG9vbC5zZXRMYXJnZUljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkibWFycV9wYWwyNC5naWYiKSk7Ci0JCWVudHJpZXMuYWRkKHRvb2wpOwotCi0JCXRvb2wgPSBuZXcgQ29ubmVjdGlvbkNyZWF0aW9uVG9vbEVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0LCBEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0xpbmtfdG9vbHRpcCwgCi0JCQkJbnVsbCwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJsaW5rX3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJsaW5rX3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZCh0b29sKTsKLQkJQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkgY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0LCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwLCAvLyROT04tTkxTLTEkCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuRlJFRV9URVhULCBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmcmVldGV4dF9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCVBhbGV0dGVTZXBhcmF0b3Igc2VwID0gbmV3IFBhbGV0dGVTZXBhcmF0b3IoCi0JCQkJR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yLmNsYXNzLmdldE5hbWUoKSArICJzZXAxIik7IC8vJE5PTi1OTFMtMSQKLQkJc2VwCi0JCQkJLnNldFVzZXJNb2RpZmljYXRpb25QZXJtaXNzaW9uKFBhbGV0dGVFbnRyeS5QRVJNSVNTSU9OX05PX01PRElGSUNBVElPTik7Ci0JCWVudHJpZXMuYWRkKHNlcCk7IC8vJE5PTi1OTFMtMSQKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0LCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcCwgLy8kTk9OLU5MUy0xJAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLldPUktfUFJPRFVDVCwgd3BOb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0JCWNvbnRyb2xHcm91cC5hZGRBbGwoZW50cmllcyk7Ci0JCXJldHVybiBjb250cm9sR3JvdXA7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVEaWFncmFtRWRpdFBhcnQoKQotCSAqLwotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVEaWFncmFtRWRpdFBhcnQoKSB7Ci0JCSBEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQgPSBuZXcgRGlhZ3JhbUVkaXRQYXJ0KE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpKTsKLQkJIGVkaXRQYXJ0Lm1hcmtEaXJ0eSh0cnVlKTsKLQkJIHJldHVybiBlZGl0UGFydDsKLQl9Ci0JCi0vLwlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUpIHsKLS8vCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0vLwkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpOwotLy8JCWRpYWdyYW0uc2V0T2JqZWN0KGUpOwotLy8JCUVkaXRQYXJ0IHBhcnQgPSBuZXcgRGlhZ3JhbUVkaXRQYXJ0KGRpYWdyYW0pOwotLy8JCXBhcnQuc2V0TW9kZWwoZGlhZ3JhbSk7Ci0vLwkJZGlhZ3JhbS5hZGRDb25zdW1lcih0aGlzKTsKLS8vCQlyZXR1cm4gcGFydDsKLS8vCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydE5hbWVQcmVmaXgoKSB7Ci0JCXJldHVybiBEaWFncmFtVUlSZXNvdXJjZXMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBbiBlZGl0b3IgaW5wdXQgCi0JICoKLQkgKgotCSAqLwotCS8qKgotCSAqIEBhdXRob3Igc2hpbHBhdAotCSAqCi0JICovCi0JcHVibGljIGNsYXNzIEVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0IHsKLQotCQkvKioKLQkJICogQHBhcmFtIGUKLQkJICovCi0JCXB1YmxpYyBFZGl0b3JJbnB1dChNZXRob2RFbGVtZW50IGUpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNleGlzdHMoKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldEltYWdlRGVzY3JpcHRvcigpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldE5hbWUoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0UGVyc2lzdGFibGUoKQotCQkgKi8KLQkJcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRUb29sVGlwVGV4dCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyB0eXBlKSB7Ci0JCQkvLyBpZiAodHlwZS5lcXVhbHMoSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzKSkgewotCQkJLy8gcmV0dXJuIGdldFByb3BlcnR5U2hlZXRQYWdlKCk7Ci0JCQkvLyB9ZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotLy8JCXByaXZhdGUgT2JqZWN0IGdldFByb3BlcnR5U2hlZXRQYWdlKCkgewotLy8KLS8vCQkJaWYgKHJvb3RFbnRyeSA9PSBudWxsKSB7Ci0vLwkJCQkvLyBjcmVhdGUgYSBuZXcgcm9vdAotLy8JCQkJUHJvcGVydHlTaGVldEVudHJ5IHJvb3QgPSBuZXcgUHJvcGVydHlTaGVldEVudHJ5KCk7Ci0vLwkJCQlyb290RW50cnkgPSByb290OwotLy8JCQl9Ci0vLwkJCWlmIChyb290RW50cnkgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0RW50cnkpIHsKLS8vCQkJCS8vID0gd3BFZGl0UGFydC5nZXRWaWV3ZXIoKTsKLS8vCQkJCS8vIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG5ldwotLy8JCQkJLy8gQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoV1ApOwotLy8JCQkJLy8gKChQcm9wZXJ0eVNoZWV0RW50cnkpIHJvb3RFbnRyeSkuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcigpOwotLy8JCQl9Ci0vLwkJCXJldHVybiByb290RW50cnk7Ci0vLwkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9HcmFwaGljYWxXb3JrZmxvd0VkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzgxYjNkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9HcmFwaGljYWxXb3JrZmxvd0VkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLkNvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLkNvbm5lY3Rpb25DcmVhdGlvblRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5NYXJxdWVlVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbm5pbmdTZWxlY3Rpb25Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEFuIGVkaXRvciBmb3IgZ3JhcGhpY2FsIHdvcmtmbG93Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaGljYWxXb3JrZmxvd0VkaXRvciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUVkaXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9XT1JLRkxPV19ERVRBSUxfRElBR1JBTSA9ICJvcGVuX3dvcmtmbG93X2RldGFpbF9kaWFncmFtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TVEFSVF9OT0RFID0gImNyZWF0ZV9zdGFydF9ub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9FTkRfTk9ERSA9ICJjcmVhdGVfZW5kX25vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1NZTkNfQkFSID0gImNyZWF0ZV9zeW5jX2JhciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfREVDSVNJT05fQkFSID0gImNyZWF0ZV9kZWNpc2lvbl9iYXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0FDVElWSVRZID0gImNyZWF0ZV9hY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfUEhBU0UgPSAiY3JlYXRlX3BoYXNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9JVEVSQVRJT04gPSAiY3JlYXRlX2l0ZXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfVEFTS19ERVNDUklQVE9SID0gImNyZWF0ZV90YXNrX2Rlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBhY3Rpdml0eU5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBwaGFzZU5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBpdGVyYXRpb25Ob2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3Rvcnkgc3luY2hCYXJDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBzdGFydE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBlbmROb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3RvcnkgdGFza0Rlc2NyaXB0b3JOb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIEdyYXBoaWNhbFdvcmtmbG93RWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCk7Ci0KLQkJaWYgKGFjdGl2aXR5Tm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJYWN0aXZpdHlOb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQkvLyBBY3Rpdml0eU5vZGUgbm9kZSA9Ci0JCQkJCS8vIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlOb2RlKCk7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCW5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLkFDVElWSVRZOwotCQkJCX0KLQotCQkJfTsKLQkJQ3JlYXRpb25GYWN0b3J5IGNyZWF0aW9uRmFjdG9yeSA9IGFjdGl2aXR5Tm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAocGhhc2VOb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQlwaGFzZU5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCS8vIEFjdGl2aXR5Tm9kZSBub2RlID0KLQkJCQkJLy8gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eU5vZGUoKTsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJbm9kZS5zZXRVTUFEaWFncmFtKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJbm9kZS5zZXREaWFncmFtKGRpYWdyYW0pOwotCQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuUEhBU0U7Ci0JCQkJfQotCi0JCQl9OwotCQljcmVhdGlvbkZhY3RvcnkgPSBwaGFzZU5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKGl0ZXJhdGlvbk5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJCWl0ZXJhdGlvbk5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCS8vIEFjdGl2aXR5Tm9kZSBub2RlID0KLQkJCQkJLy8gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eU5vZGUoKTsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJbm9kZS5zZXRVTUFEaWFncmFtKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJbm9kZS5zZXREaWFncmFtKGRpYWdyYW0pOwotCQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJdGVyYXRpb24oKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLklURVJBVElPTjsKLQkJCQl9Ci0KLQkJCX07Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IGl0ZXJhdGlvbk5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKHN5bmNoQmFyQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQlzeW5jaEJhckNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJVHlwZWROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVkTm9kZSgpOwotCQkJCQlub2RlLnNldFR5cGUoVHlwZWROb2RlLlNZTkNIX0JBUik7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkubmV3VHlwZWRHcmFwaE5vZGUoVHlwZWROb2RlLlNZTkNIX0JBUikpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5TWU5DSF9CQVI7Ci0JCQkJfQotCi0JCQl9OwotCQljcmVhdGlvbkZhY3RvcnkgPSBzeW5jaEJhckNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAoZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQlkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVR5cGVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlZE5vZGUoKTsKLQkJCQkJbm9kZS5zZXRUeXBlKFR5cGVkTm9kZS5ERUNJU0lPTik7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkubmV3VHlwZWRHcmFwaE5vZGUoVHlwZWROb2RlLkRFQ0lTSU9OKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLkRFQ0lTSU9OX05PREU7Ci0JCQkJfQotCi0JCQl9OwotCQljcmVhdGlvbkZhY3RvcnkgPSBkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKHN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJc3RhcnROb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlUeXBlZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZWROb2RlKCk7Ci0JCQkJCW5vZGUuc2V0VHlwZShUeXBlZE5vZGUuU1RBUlQpOwotCQkJCQlub2RlLnNldE9iamVjdChHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJLm5ld1R5cGVkR3JhcGhOb2RlKFR5cGVkTm9kZS5TVEFSVCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5TVEFSVF9OT0RFOwotCQkJCX0KLQotCQkJfTsKLQkJY3JlYXRpb25GYWN0b3J5ID0gc3RhcnROb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmIChlbmROb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQllbmROb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlUeXBlZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZWROb2RlKCk7Ci0JCQkJCW5vZGUuc2V0VHlwZShUeXBlZE5vZGUuRU5EKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCS5uZXdUeXBlZEdyYXBoTm9kZShUeXBlZE5vZGUuRU5EKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLkVORF9OT0RFOwotCQkJCX0KLQotCQkJfTsKLQkJY3JlYXRpb25GYWN0b3J5ID0gZW5kTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAodGFza0Rlc2NyaXB0b3JOb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQl0YXNrRGVzY3JpcHRvck5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCW5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0b3IoKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLlRBU0tfREVTQ1JJUFRPUjsKLQkJCQl9Ci0KLQkJCX07Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IHRhc2tEZXNjcmlwdG9yTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVG9Db250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5jb250cmlidXRlVG9Db250ZXh0TWVudShtZW51KTsKLQotCQlib29sZWFuIGNhbk1vZGlmeSA9ICFpc1JlYWRPbmx5KCk7Ci0KLQkJbWVudS5pbnNlcnRBZnRlcihHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBuZXcgU2VwYXJhdG9yKAotCQkJCUdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQotCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCU9QRU5fV09SS0ZMT1dfREVUQUlMX0RJQUdSQU0pOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCQltZW51Lmluc2VydEFmdGVyKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIG5ldyBTZXBhcmF0b3IoCi0JCQkJR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9TVEFSVF9OT0RFKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0KLQkJLy8gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0ZSRUVfVEVYVCk7Ci0JCS8vIGlmKGFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkvLyBtZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJLy8gfQotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9TWU5DX0JBUik7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9ERUNJU0lPTl9CQVIpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfRU5EX05PREUpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQkJbWVudS5pbnNlcnRBZnRlcihHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBuZXcgU2VwYXJhdG9yKAotCQkJCUdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfQUNUSVZJVFkpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0lURVJBVElPTik7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9QSEFTRSk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9UQVNLX0RFU0NSSVBUT1IpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0KLQkJLy8gT3BlbiB3b3JrZmxvdyBkZXRhaWwgYWN0aW9uCi0JCS8vCi0JCUlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBPUEVOX1dPUktGTE9XX0RFVEFJTF9ESUFHUkFNOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUVkaXRQYXJ0IHNlbGVjdGVkRWRpdFBhcnQgPSAoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJCS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLmdldCgwKTsKLQkJCQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IGdldFNpdGUoKS5nZXRQYWdlKCkKLQkJCQkJCQkJLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5FZGl0b3JJbnB1dCgKLQkJCQkJCQkJKE1ldGhvZEVsZW1lbnQpICgoTm9kZSkgc2VsZWN0ZWRFZGl0UGFydAotCQkJCQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRPYmplY3QoKSwKLQkJCQkJCQkJKChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpKQotCQkJCQkJCQkJCS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQkJCUlFZGl0b3JQYXJ0IHBhcnQgPSBnZXRTaXRlKCkKLQkJCQkJCQkJLmdldFBhZ2UoKQotCQkJCQkJCQkub3BlbkVkaXRvcigKLQkJCQkJCQkJCQlpbnB1dCwKLQkJCQkJCQkJCQlQcm9jZXNzRWRpdG9yLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX0VESVRPUl9JRCk7Ci0JCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBwYXJ0OwotCQkJCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgIT0gMSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQkJCXJldHVybiAoZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSAmJiAoKExpbmtlZE9iamVjdCkgZWRpdFBhcnQKLQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KTsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCS8vIElBY3Rpb24gc3RhcnROb2RlQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuCi0JCS8vIGdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5TdGFydE5vZGUudGV4dCIpKXsgLy8kTk9OLU5MUy0xJAotCQkvLwkJCQotCQkvLyBwdWJsaWMgdm9pZCBydW4oKXsKLQkJLy8gQ3JlYXRlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IENyZWF0ZVJlcXVlc3QoKTsKLQkJLy8gLy9DcmVhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkodGVtcGxhdGUpOwotCQkvLyBpZiAoc3RhcnROb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCS8vIHJldHVybjsKLQkJLy8gcmVxdWVzdC5zZXRGYWN0b3J5KHN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeSk7Ci0JCS8vIHJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDEwLDEwKSk7Ci0JCS8vCQkJCQotCQkvLyBpZiAocmVxdWVzdC5nZXROZXdPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJLy8gUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQkvLyAvLygoR3JhcGhpY2FsRWRpdFBhcnQpZ2V0SG9zdCgpKS5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvYyk7Ci0JCS8vIERpYWdyYW0gcGFyZW50ID0gKERpYWdyYW0pZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJLy8gb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldwotCQkvLyBDcmVhdGVOb2RlQ29tbWFuZCgoTm9kZSlyZXF1ZXN0LmdldE5ld09iamVjdCgpLAotCQkvLyBwYXJlbnQsIGxvYyk7Ci0JCS8vIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCl7Ci0JCS8vIHJldHVybiBDUkVBVEVfU1RBUlRfTk9ERTsKLQkJLy8gfQotCQkvLyBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKXsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJLy8gcmV0dXJuCi0JCS8vIERpYWdyYW1VSVJlc291cmNlcy5nZXRTdHJpbmcoIkRpYWdyYW1VSS5BY3Rpdml0eURpYWdyYW0uU3RhcnROb2RlLnRvb2x0aXAiKTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHN0YXJ0Tm9kZUFjdGlvbik7Ci0JCS8vCQkKLQkJLy8JCQotCQkvLyBJQWN0aW9uIGVuZE5vZGVBY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy4KLQkJLy8gZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLkVuZE5vZGUudGV4dCIpKXsgLy8kTk9OLU5MUy0xJAotCQkvLwkJCQotCQkvLyBwdWJsaWMgdm9pZCBydW4oKXsKLQkJLy8gQ3JlYXRlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IENyZWF0ZVJlcXVlc3QoKTsKLQkJLy8gaWYgKGVuZE5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJLy8gcmV0dXJuOwotCQkvLyByZXF1ZXN0LnNldEZhY3RvcnkoZW5kTm9kZUNyZWF0aW9uRmFjdG9yeSk7Ci0JCS8vIHJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDEwLDEwKSk7Ci0JCS8vCQkJCQotCQkvLyBpZiAocmVxdWVzdC5nZXROZXdPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJLy8gUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQkvLyBEaWFncmFtIHBhcmVudCA9IChEaWFncmFtKWVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCS8vIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcKLQkJLy8gQ3JlYXRlTm9kZUNvbW1hbmQoKE5vZGUpcmVxdWVzdC5nZXROZXdPYmplY3QoKSwKLQkJLy8gcGFyZW50LCBsb2MpOwotCQkvLyBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpewotCQkvLyByZXR1cm4gQ1JFQVRFX0VORF9OT0RFOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpewotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQkvLyByZXR1cm4KLQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzLmdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5FbmROb2RlLnRvb2x0aXAiKTsKLQkJLy8gfQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGVuZE5vZGVBY3Rpb24pOwotCQkvLwkJCi0JCS8vIElBY3Rpb24gc3luY0JhckFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLgotCQkvLyBnZXRTdHJpbmcoIkRpYWdyYW1VSS5BY3Rpdml0eURpYWdyYW0uU3luY0Jhci50ZXh0IikpeyAvLyROT04tTkxTLTEkCi0JCS8vCQkJCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpewotCQkvLyBDcmVhdGVSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgQ3JlYXRlUmVxdWVzdCgpOwotCQkvLyAvL0NyZWF0aW9uRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSh0ZW1wbGF0ZSk7Ci0JCS8vIGlmIChzeW5jaEJhckNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkvLyByZXR1cm47Ci0JCS8vIHJlcXVlc3Quc2V0RmFjdG9yeShzeW5jaEJhckNyZWF0aW9uRmFjdG9yeSk7Ci0JCS8vIHJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDEwLDEwKSk7Ci0JCS8vCQkJCQotCQkvLyBpZiAocmVxdWVzdC5nZXROZXdPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJLy8gUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQkvLyAvLygoR3JhcGhpY2FsRWRpdFBhcnQpZ2V0SG9zdCgpKS5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvYyk7Ci0JCS8vIERpYWdyYW0gcGFyZW50ID0gKERpYWdyYW0pZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJLy8gb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldwotCQkvLyBDcmVhdGVOb2RlQ29tbWFuZCgoTm9kZSlyZXF1ZXN0LmdldE5ld09iamVjdCgpLAotCQkvLyBwYXJlbnQsIGxvYyk7Ci0JCS8vIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCl7Ci0JCS8vIHJldHVybiBDUkVBVEVfU1lOQ19CQVI7Ci0JCS8vIH0KLQkJLy8gcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCl7Ci0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCS8vIHJldHVybgotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLlN5bmNCYXIudG9vbHRpcCIpOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oc3luY0JhckFjdGlvbik7Ci0JCS8vCQkKLQkJLy8JCQotCQkvLyBJQWN0aW9uIGRlY2lzaW9uQmFyQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuCi0JCS8vIGdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5EZWNpc2lvbkJhci50ZXh0IikpewotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vCQkJCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpewotCQkvLyBDcmVhdGVSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgQ3JlYXRlUmVxdWVzdCgpOwotCQkvLyAvL0NyZWF0aW9uRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSh0ZW1wbGF0ZSk7Ci0JCS8vIGlmIChkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJLy8gcmV0dXJuOwotCQkvLyByZXF1ZXN0LnNldEZhY3RvcnkoZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5KTsKLQkJLy8gcmVxdWVzdC5zZXRMb2NhdGlvbihuZXcgUG9pbnQoMTAsMTApKTsKLQkJLy8JCQkJCi0JCS8vIGlmIChyZXF1ZXN0LmdldE5ld09iamVjdCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkvLyBQb2ludCBsb2MgPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0JCS8vIC8vKChHcmFwaGljYWxFZGl0UGFydClnZXRIb3N0KCkpLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvUmVsYXRpdmUobG9jKTsKLQkJLy8gRGlhZ3JhbSBwYXJlbnQgPSAoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpOwotCQkvLyBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3Ci0JCS8vIENyZWF0ZU5vZGVDb21tYW5kKChOb2RlKXJlcXVlc3QuZ2V0TmV3T2JqZWN0KCksCi0JCS8vIHBhcmVudCwgbG9jKTsKLQkJLy8gZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKXsKLQkJLy8gcmV0dXJuIENSRUFURV9ERUNJU0lPTl9CQVI7Ci0JCS8vIH0KLQkJLy8gcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCl7Ci0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCS8vIHJldHVybgotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLkRlY2lzaW9uQmFyLnRvb2x0aXAiKTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGRlY2lzaW9uQmFyQWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0LCBzdGFydE5vZGVDcmVhdGlvbkZhY3RvcnksIC8vJE5PTi1OTFMtMSQKLQkJCQlDUkVBVEVfU1RBUlRfTk9ERSwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJzdG5vZGVfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQsIGZyZWVUeHROb2RlQ3JlYXRpb25GYWN0b3J5LCAvLyROT04tTkxTLTEkCi0JCQkJQ1JFQVRFX0ZSRUVfVEVYVCwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXAsIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3RleHQsIHN5bmNoQmFyQ3JlYXRpb25GYWN0b3J5LCAvLyROT04tTkxTLTEkCi0JCQkJQ1JFQVRFX1NZTkNfQkFSLCBEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcAotCQkJCSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJzeW5jYmFyX3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dCwgZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5LCAvLyROT04tTkxTLTEkCi0JCQkJQ1JFQVRFX0RFQ0lTSU9OX0JBUiwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwCi0JCQkJLCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImRlY25vZGVfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dCwgZW5kTm9kZUNyZWF0aW9uRmFjdG9yeSwgLy8kTk9OLU5MUy0xJAotCQkJCUNSRUFURV9FTkRfTk9ERSwgRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXAKLQkJCQksIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZW5kbm9kZV9wYWwxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dCwgYWN0aXZpdHlOb2RlQ3JlYXRpb25GYWN0b3J5LCAvLyROT04tTkxTLTEkCi0JCQkJQ1JFQVRFX0FDVElWSVRZLAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcAotCQkJCSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJhY3Rpdml0eTE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dCwgaXRlcmF0aW9uTm9kZUNyZWF0aW9uRmFjdG9yeSwgLy8kTk9OLU5MUy0xJAotCQkJCUNSRUFURV9JVEVSQVRJT04sCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcAotCQkJCSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJJdGVyYXRpb24xNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dCwgcGhhc2VOb2RlQ3JlYXRpb25GYWN0b3J5LCAvLyROT04tTkxTLTEkCi0JCQkJQ1JFQVRFX1BIQVNFLCBEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXAKLQkJCQksIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiUGhhc2UxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dCwgdGFza0Rlc2NyaXB0b3JOb2RlQ3JlYXRpb25GYWN0b3J5LCAvLyROT04tTkxTLTEkCi0JCQkJQ1JFQVRFX1RBU0tfREVTQ1JJUFRPUiwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXAKLQkJCQksIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiVGFza0Rlc2NyaXB0b3IuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEb3VibGVDbGljayhFdmVudCBldmVudCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0KLQkJLy8gZG8gbm90aGluZyBpZiAwIG9yIG1vcmUgdGhhbiAxIGVkaXQgcGFydHMgYXJlIHNlbGVjdGVkCi0JCS8vCi0JCWlmIChlZGl0UGFydHMuc2l6ZSgpICE9IDEpCi0JCQlyZXR1cm47Ci0KLQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKGVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUKLQkJCQkmJiAobm9kZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIGVkaXRQYXJ0LmdldE1vZGVsKCkpLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCS8vIG9wZW4gYWN0aXZpdHkgZGlhZ3JhbSBvZiB0aGUgc2VsZWN0ZWQgYWN0aXZpdHkgaW4gYSBuZXcgZWRpdG9yCi0JCQkvLwotCQkJdHJ5IHsKLQkJCQl0cnkgewotCQkJCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpOwotCQkJCQlPYmplY3Qgb2JqZWN0ID0gbm9kZS5pc1JlYWRPbmx5KCkgPyBub2RlLmdldFdyYXBwZXIoKSA6IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBFZGl0b3JJbnB1dChvYmplY3QsIGVkaXRvcklucHV0LmdldFN1cHByZXNzaW9uKCkpOwotCQkJCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQlJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5vcGVuRWRpdG9yKGlucHV0LAotCQkJCQkJCVByb2Nlc3NFZGl0b3IuV09SS0ZMT1dfRURJVE9SX0lEKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBwYXJ0OwotCQkJCQkJZWRpdG9yLnNldFBhcmVudEVkaXRvcihwYXJlbnQpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFBhbGV0dGVDb250YWluZXIgY3JlYXRlQ29udHJvbEdyb3VwKFBhbGV0dGVSb290IHJvb3QpIHsKLQkJaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCk7Ci0KLQkJUGFsZXR0ZUdyb3VwIGNvbnRyb2xHcm91cCA9IG5ldyBQYWxldHRlR3JvdXAoIkNvbnRyb2wgR3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCi0JCUxpc3QgZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlUb29sRW50cnkgdG9vbCA9IG5ldyBQYW5uaW5nU2VsZWN0aW9uVG9vbEVudHJ5KERpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3RleHQsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwCi0JCSk7Ci0JCXRvb2wuc2V0U21hbGxJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJInNlbGVjdF9wYWwxNi5naWYiKSk7Ci0JCXRvb2wuc2V0TGFyZ2VJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJInNlbGVjdF9wYWwyNC5naWYiKSk7Ci0JCWVudHJpZXMuYWRkKHRvb2wpOwotCQlyb290LnNldERlZmF1bHRFbnRyeSh0b29sKTsKLQotCQl0b29sID0gbmV3IE1hcnF1ZWVUb29sRW50cnkoKTsKLQkJdG9vbC5zZXRTbWFsbEljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkibWFycV9wYWwxNi5naWYiKSk7Ci0JCXRvb2wuc2V0TGFyZ2VJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJIm1hcnFfcGFsMjQuZ2lmIikpOwotCQllbnRyaWVzLmFkZCh0b29sKTsKLQotCQl0b29sID0gbmV3IENvbm5lY3Rpb25DcmVhdGlvblRvb2xFbnRyeShEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dCwgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwLCAvLyROT04tTkxTLTEkCi0JCQkJbnVsbCwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJsaW5rX3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJsaW5rX3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZCh0b29sKTsKLQotCQlDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSBjb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0LCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcCwgLy8kTk9OLU5MUy0xJAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlNUQVJUX05PREUsIHN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJInN0bm9kZV9wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkic3Rub2RlX3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0KLQkJY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0LCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwLCAvLyROT04tTkxTLTEkCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuRlJFRV9URVhULCBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmcmVldGV4dF9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0LCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3Rvb2x0aXAsIC8vJE5PTi1OTFMtMSQKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5TWU5DSF9CQVIsIHN5bmNoQmFyQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkic3luY2Jhcl9wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkic3luY2Jhcl9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwLCAvLyROT04tTkxTLTEkCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuREVDSVNJT05fTk9ERSwgZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZGVjbm9kZV9wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZGVjbm9kZV9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0LCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXAsIC8vJE5PTi1OTFMtMSQKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5FTkRfTk9ERSwgZW5kTm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImVuZG5vZGVfcGFsMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImVuZG5vZGVfcGFsMjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQlQYWxldHRlU2VwYXJhdG9yIHNlcCA9IG5ldyBQYWxldHRlU2VwYXJhdG9yKAotCQkJCUdyYXBoaWNhbFdvcmtmbG93RWRpdG9yLmNsYXNzLmdldE5hbWUoKSArICJzZXAxIik7IC8vJE5PTi1OTFMtMSQKLQkJc2VwCi0JCQkJLnNldFVzZXJNb2RpZmljYXRpb25QZXJtaXNzaW9uKFBhbGV0dGVFbnRyeS5QRVJNSVNTSU9OX05PX01PRElGSUNBVElPTik7Ci0JCWVudHJpZXMuYWRkKHNlcCk7IC8vJE5PTi1OTFMtMSQKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXAsIC8vJE5PTi1OTFMtMSQKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5BQ1RJVklUWSwgYWN0aXZpdHlOb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiYWN0aXZpdHkxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiYWN0aXZpdHkyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwLCAvLyROT04tTkxTLTEkCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuSVRFUkFUSU9OLCBpdGVyYXRpb25Ob2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiSXRlcmF0aW9uMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImFjdGl2aXR5MjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeShEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXAsIC8vJE5PTi1OTFMtMSQKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QSEFTRSwgcGhhc2VOb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiUGhhc2UxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiYWN0aXZpdHkyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dCwgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcCwgLy8kTk9OLU5MUy0xJAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlRBU0tfREVTQ1JJUFRPUiwKLQkJCQl0YXNrRGVzY3JpcHRvck5vZGVDcmVhdGlvbkZhY3RvcnksIEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiVGFza0Rlc2NyaXB0b3IuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImFjdGl2aXR5MjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb250cm9sR3JvdXAuYWRkQWxsKGVudHJpZXMpOwotCQlyZXR1cm4gY29udHJvbEdyb3VwOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydE5hbWVQcmVmaXgoKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpKQotCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiBnZXRUeXBlTmFtZSgoQWN0aXZpdHkpIGUpICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NyZWF0ZURpYWdyYW1FZGl0UGFydCgpCi0JICovCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZURpYWdyYW1FZGl0UGFydCgpIHsKLQkJQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQgYWRFZGl0UGFydCA9IG5ldyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydChNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5RGlhZ3JhbSgpKTsKLQkJYWRFZGl0UGFydC5tYXJrRGlydHkodHJ1ZSk7Ci0JCXJldHVybiBhZEVkaXRQYXJ0OwotCX0KLQotLy8JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlKSB7Ci0vLwkJQWN0aXZpdHlEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0vLwkJCQkuY3JlYXRlQWN0aXZpdHlEaWFncmFtKCk7Ci0vLwkJZGlhZ3JhbS5zZXRPYmplY3QoZSk7Ci0vLwkJRWRpdFBhcnQgcGFydCA9IG5ldyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydChkaWFncmFtKTsKLS8vCQlwYXJ0LnNldE1vZGVsKGRpYWdyYW0pOwotLy8JCWRpYWdyYW0uYWRkQ29uc3VtZXIodGhpcyk7Ci0vLwkJcmV0dXJuIHBhcnQ7Ci0vLwl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoQWN0aXZpdHkgYWN0KSB7Ci0JCWlmIChhY3QgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCXJldHVybiBEaWFncmFtVUlSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0OyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoYWN0IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCXJldHVybiBEaWFncmFtVUlSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChhY3QgaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJcmV0dXJuIERpYWdyYW1VSVJlc291cmNlcy5BY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4OyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoYWN0IGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBEaWFncmFtVUlSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLS8vCXByaXZhdGUgc3RhdGljIEltYWdlIGdldFR5cGVJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0vLwkJSUl0ZW1MYWJlbFByb3ZpZGVyIGFkYXB0ZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQob2JqZWN0LAotLy8JCQkJCQlJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotLy8JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLS8vCQkJLy8gcmV0dXJuIG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwKLS8vCQkJLy8gKChVUkwpYWRhcHRlci5nZXRJbWFnZShvYmplY3QpKS5nZXRDb250ZW50KCkpOwotLy8JCX0KLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLQotCS8qKgotCSAqIEFuIGVkaXRvciBpbnB1dCBmb3IgZ3JhaGljYWwgd29ya2Zsb3cgZWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFZGl0b3JJbnB1dCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBlCi0JCSAqLwotCQlwdWJsaWMgRWRpdG9ySW5wdXQoT2JqZWN0IGUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCQlzdXBlcihlLCBzdXBwcmVzc2lvbik7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVFZGl0UGFydEZhY3RvcnkoKQotCSAqLwotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9JRWRpdG9yS2VlcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9JRWRpdG9yS2VlcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ2OTc2ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvSUVkaXRvcktlZXBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSB3aGljaCBtYW5hZ2VzIG9wZW5pbmcvY2xvc2luZyBvZiBhbiBlZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRWRpdG9yS2VlcGVyIHsKLQotCS8qKgotCSAqIFJlZmVyZW5jZSBjbGFzcyBmb3IgZWRpdG9yIGtlZXBlcgotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBSZWZlcmVuY2UgewotCQlwcml2YXRlIElFZGl0b3JLZWVwZXIgZWRpdG9yS2VlcGVyOwotCi0JCXByaXZhdGUgUmVmZXJlbmNlKCkgewotCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRFZGl0b3JLZWVwZXIoSUVkaXRvcktlZXBlciBlZGl0b3JLZWVwZXIpIHsKLQkJCXRoaXMuZWRpdG9yS2VlcGVyID0gZWRpdG9yS2VlcGVyOwotCQl9Ci0KLQkJcHVibGljIElFZGl0b3JLZWVwZXIgZ2V0RWRpdG9yS2VlcGVyKCkgewotCQkJcmV0dXJuIGVkaXRvcktlZXBlcjsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVmZXJlbmNlIFJFRkVSRU5DRSA9IG5ldyBSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIE9wZW4gYW4gZWRpdG9yIGZvciB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKi8KLQl2b2lkIG9wZW5FZGl0b3IoT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBDbG9zZXMgYW4gb3BlbiBlZGl0b3IgaWYgZWxlbWVudCBpcyBkZWxldGVkCi0JICogQHBhcmFtIG9iamVjdAotCSAqLwotCXZvaWQgY2xvc2VFZGl0b3JzT25EZWxldGlvbihPYmplY3Qgb2JqZWN0KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kRWxlbWVudEVkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kRWxlbWVudEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzAxMTFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWYWxpZGF0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNoZWNrbGlzdEl0ZW1zUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ29udGVudFBhY2thZ2VEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5DdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRpc2NpcGxpbmVEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGlzY2lwbGluZVRhc2tzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRvbWFpbkRlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRvbWFpbldvcmtQcm9kdWN0c1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSUV4dGVuc2lvbkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSVJlZnJlc2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5NZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5QcmFjdGljZURlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByYWN0aWNlUmVmZXJlbmNlc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Sb2xlQ2F0ZWdvcmllc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Sb2xlRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUm9sZVNldERlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlJvbGVTZXRHcm91cGluZ1JvbGVTZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUm9sZVNldFJvbGVzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlJvbGVXb3JrUHJvZHVjdHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVGFza0NhdGVnb3JpZXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVGFza0Rlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlRhc2tSb2xlc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5UYXNrU3RlcHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVGFza1dvcmtQcm9kdWN0c1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Ub29sRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVG9vbFRvb2xNZW50b3JzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLldvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Xb3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Xb3JrUHJvZHVjdFR5cGVEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Xb3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwuTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWRpdG9yUGFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkVsZW1lbnRIVE1MVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5WaWV3SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGUgTWV0aG9kIEVsZW1lbnQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEVkaXRvciBleHRlbmRzIEFic3RyYWN0QmFzZUZvcm1FZGl0b3IgaW1wbGVtZW50cwotCQlJU2VsZWN0aW9uUHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhlIGVkaXRvciBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSUQgPSBNZXRob2RFbGVtZW50RWRpdG9yLmNsYXNzLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBpbnQgcHJldmlld19wYWdlX2luZGV4ID0gLTE7Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudEhUTUxWaWV3ZXIgcHJldmlld2VyID0gbnVsbDsKLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGVsZW1lbnRPYmogPSBudWxsOwotCi0JLy8gVGhlIHJpY2ggdGV4dCBjb250cm9sIG9yIGVkaXRvciB3aG9zZSBjb250ZW50IHdhcyBsYXN0IG1vZGlmaWVkIGJlZm9yZQotCS8vIHRoZSBTYXZlIG9yIFNhdmUgQWxsIGJ1dHRvbiBrZXkgaXMgc2VsZWN0ZWQuCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBtb2RpZmllZFJpY2hUZXh0ID0gbnVsbDsKLQotCXByb3RlY3RlZCBBZGFwdGVyIG5hbWVDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE1ldGhvZEVsZW1lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQkJbmFtZUNoYW5nZWQoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPigpOwotCi0JcHJvdGVjdGVkIElTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0KLQlwcm90ZWN0ZWQgQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlydHk7Ci0KLQlwcml2YXRlIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXI7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlc1RvQWRqdXN0TG9jYXRpb24gPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxPYmplY3Q+IHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQotCXByaXZhdGUgbG9uZyBjaGFuZ2VUaW1lID0gLTE7Ci0KLQlwdWJsaWMgT2JqZWN0IHdpZGdldFRvQ2hlY2s7Ci0KLQlwcml2YXRlIE9iamVjdCBjdXJyZW50RmVhdHVyZUVkaXRvcjsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGN1cnJlbnRFZGl0ZWRGZWF0dXJlOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyID0gbnVsbDsKLQkKLQkvKioKLQkgKiBMaXN0ZW5zIGZvciB3b3Jrc3BhY2UgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLnJlc291cmNlQ2hhbmdlZCgpOiBldmVudCA9ICIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGVsZW1lbnRPYmouZUlzUHJveHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJdHJ5IHsKLQkJCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCQkJCXByb3RlY3RlZCBNYXAgVVJJVG9Vc2VkUmVzb3VyY2VNYXAgPSBnZXRVUklUb1VzZWRSZXNvdXJjZU1hcCgpOwotCi0JCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQotCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCQkJCWlmIChkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMKLQkJCQkJCQkJJiYgZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkJCQlpZiAoKGRlbHRhLmdldEtpbmQoKSAmIChJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIHwgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkpICE9IDApIHsKLQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIFVSSVRvVXNlZFJlc291cmNlTWFwCi0JCQkJCQkJCQkJLmdldChVUkkuY3JlYXRlRmlsZVVSSShkZWx0YQotCQkJCQkJCQkJCQkJLmdldFJlc291cmNlKCkuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpKTsKLQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpICYgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgIT0gMCkgewotCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgewotCQkJCQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsKLQkJCQkJCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOwotCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLQotCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsKLQkJCQlpZiAoIXZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpLmlzRW1wdHkoKSAmJiAhaXNEaXJ0eSgpKSB7Ci0JCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5kaXNwb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX07Ci0KLQljbGFzcyBBY3RpdmF0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJUGFydExpc3RlbmVyLCBJV2luZG93TGlzdGVuZXIgewotCi0JCS8qKiBDYWNoZSBvZiB0aGUgYWN0aXZlIHdvcmtiZW5jaCBwYXJ0LiAqLwotCQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGZBY3RpdmVQYXJ0OwotCi0JCS8qKiBJbmRpY2F0ZXMgd2hldGhlciBhY3RpdmF0aW9uIGhhbmRsaW5nIGlzIGN1cnJlbnRseSBiZSBkb25lLiAqLwotCQlwcml2YXRlIGJvb2xlYW4gZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIFRoZSBwYXJ0IHNlcnZpY2UuCi0JCSAqIAotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwcml2YXRlIElQYXJ0U2VydmljZSBmUGFydFNlcnZpY2U7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgdGhpcyBhY3RpdmF0aW9uIGxpc3RlbmVyLgotCQkgKiAKLQkJICogQHBhcmFtIHBhcnRTZXJ2aWNlCi0JCSAqICAgICAgICAgICAgdGhlIHBhcnQgc2VydmljZSBvbiB3aGljaCB0byBhZGQgdGhlIHBhcnQgbGlzdGVuZXIKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIEFjdGl2YXRpb25MaXN0ZW5lcihJUGFydFNlcnZpY2UgcGFydFNlcnZpY2UpIHsKLQkJCWZQYXJ0U2VydmljZSA9IHBhcnRTZXJ2aWNlOwotCQkJZlBhcnRTZXJ2aWNlLmFkZFBhcnRMaXN0ZW5lcih0aGlzKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuYWRkV2luZG93TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQkvKioKLQkJICogRGlzcG9zZXMgdGhpcyBhY3RpdmF0aW9uIGxpc3RlbmVyLgotCQkgKiAKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWZQYXJ0U2VydmljZS5yZW1vdmVQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnJlbW92ZVdpbmRvd0xpc3RlbmVyKHRoaXMpOwotCQkJZlBhcnRTZXJ2aWNlID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0QWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlmQWN0aXZlUGFydCA9IHBhcnQ7Ci0JCQloYW5kbGVBY3RpdmF0aW9uKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydEJyb3VnaHRUb1RvcChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRDbG9zZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0RGVhY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJZkFjdGl2ZVBhcnQgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRPcGVuZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0ID09IE1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcykgewotCQkJCWlmICghaXNJbnB1dFZhbGlkKCkpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlJbmZvKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvck1zZyk7IAotCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yLnRoaXMuY2xvc2UoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCUNvbGxlY3Rpb24gdXNlZFJlc291cmNlcyA9IGdldFVzZWRSZXNvdXJjZXMoKTsKLQkJCQlpZiAoUmVzb3VyY2VVdGlsLmhhc091dE9mU3luY2godXNlZFJlc291cmNlcykpIHsKLQkJCQkJaGFuZGxlRmlsZUNoYW5nZWQodXNlZFJlc291cmNlcyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdXBkYXRlVGltZVN0YW1wcyh1c2VkUmVzb3VyY2VzKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBIYW5kbGVzIHRoZSBhY3RpdmF0aW9uIHRyaWdnZXJpbmcgYSBlbGVtZW50IHN0YXRlIGNoZWNrIGluIHRoZQotCQkgKiBlZGl0b3IuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgaGFuZGxlQWN0aXZhdGlvbigpIHsKLQkJCWlmIChmSXNIYW5kbGluZ0FjdGl2YXRpb24gfHwgTWV0aG9kRWxlbWVudEVkaXRvci50aGlzLmRpc3Bvc2VkKQotCQkJCXJldHVybjsKLQotCQkJaWYgKGZBY3RpdmVQYXJ0ID09IE1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcykgewotCQkJCWZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJaGFuZGxlQWN0aXZhdGUoZkFjdGl2ZVBhcnQpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0FjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dBY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJCWlmICh3aW5kb3cgPT0gZ2V0RWRpdG9yU2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpKSB7Ci0JCQkJLyoKLQkJCQkgKiBXb3JrYXJvdW5kIGZvciBwcm9ibGVtIGRlc2NyaWJlZCBpbgotCQkJCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3MzEgV2lsbCBiZQotCQkJCSAqIHJlbW92ZWQgd2hlbiBTV1QgaGFzIHNvbHZlZCB0aGUgcHJvYmxlbS4KLQkJCQkgKi8KLQkJCQl3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaGFuZGxlQWN0aXZhdGlvbigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dEZWFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dEZWFjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93Q2xvc2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93T3BlbmVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBY3RpdmF0aW9uTGlzdGVuZXIgYWN0aXZhdGlvbkxpc3RlbmVyOwotCi0JcHJpdmF0ZSBIYXNoTWFwPFJlc291cmNlLCBMb25nPiBtb2RpZmljYXRpb25UaW1lU3RhbXBNYXA7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tGaWxlQ2hhbmdlZFJlcXVpcmVkID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgSGFzaFNldDxSZXNvdXJjZT4gbGFzdFVzZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlzcG9zZWQ7Ci0KLQlwcml2YXRlIEhhc2hNYXA8UmVzb3VyY2UsIExvbmc+IGxvYWRUaW1lU3RhbXBNYXA7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCS8vIG1vdmVkIHRoZSBkZXRhaWxzIG91dCBzbyB0aGF0IHVzZXIgY2FuIG92ZXJyaWRlIHRoZSB0aWNrIHVwZGF0b3IKLQkJLy8gSmluaHVhIFhpIDMvMTUvMjAwNwotCQljcmVhdGVFZGl0b3JFcnJvclRpY2tVcGRhdGVyKCk7Ci0JCWNyZWF0ZUFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yRXJyb3JUaWNrVXBkYXRlcigpIHsKLQkJCi0JCXRoaXMuZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyID0gbmV3IE1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25NYW5hZ2VyKCkgewotCQlhY3Rpb25NZ3IgPSBuZXcgQWN0aW9uTWFuYWdlcigpIHsKLQotCQkJcHJvdGVjdGVkIEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayBjcmVhdGVDb21tYW5kU3RhY2soKSB7Ci0JCQkJcmV0dXJuIG5ldyBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2sodGhpcykgewotCQkJCQlwdWJsaWMgYm9vbGVhbiBkb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJCQkvLyBDaGVjayBtb2RpZnkgZmlyc3QuCi0JCQkJCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQkJCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSAoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY29tbWFuZCkKLQkJCQkJCQkJCS5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCQkJCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsCi0JCQkJCQkJCQkmJiAhKG1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkpIHsKLQkJCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCQkuY2hlY2tNb2RpZnkobW9kaWZpZWRSZXNvdXJjZXMsCi0JCQkJCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCQkJTWV0aG9kRWxlbWVudEVkaXRvci50aGlzCi0JCQkJCQkJCQkJCS5oYW5kbGVFcnJvcihzdGF0dXMpOwotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlFT2JqZWN0IG93bmVyID0gVG5nVXRpbC5nZXRPd25lcihjb21tYW5kKTsKLQkJCQkJCQlpZiAob3duZXIgIT0gbnVsbCkgewotCQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KG93bmVyLAotCQkJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheSgKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0LCAKLQkJCQkJCQkJCQkJCQlzdGF0dXMpOwotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAoY2hhbmdlVGltZSA9PSAtMSkgewotCQkJCQkJCWNoYW5nZVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJCX0KLQkJCQkJCWJvb2xlYW4gcmV0ID0gc3VwZXIuZG9FeGVjdXRlKGNvbW1hbmQpOwotCQkJCQkJaWYgKCFyZXQgJiYgY2hhbmdlVGltZSAhPSAtMSkgewotCQkJCQkJCWNoYW5nZVRpbWUgPSAtMTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiByZXQ7Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGRvQWN0aW9uKGludCBhY3Rpb25UeXBlLCBFT2JqZWN0IG9iamVjdCwKLQkJCQkJb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbAotCQkJCQkJLmNoZWNrRWRpdChvYmplY3QsIGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCQlyZXR1cm4gc3VwZXIuZG9BY3Rpb24oYWN0aW9uVHlwZSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQkJCQlpbmRleCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQsIAotCQkJCQkJCXN0YXR1cyk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCQkvLyBkb24ndCBzYXZlIHJlc291cmNlIHRoYXQgaXMgY2hhbmdlZCBvdXRzaWRlIG9mIHRoaXMgZWRpdG9yCi0JCQkJLy8KLQkJCQlpZiAoY2hhbmdlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkKLQkJCQlib29sZWFuIGNhblNhdmU7Ci0JCQkJaWYocmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJCQljYW5TYXZlID0gZmlsZS5sYXN0TW9kaWZpZWQoKSA+IGNoYW5nZVRpbWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljYW5TYXZlID0gdHJ1ZTsKLQkJCQl9CQkJCQotCQkJCXRyeSB7Ci0JCQkJCWlmKGNhblNhdmUpIHsKLQkJCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBnZXRQZXJzaXN0ZXIoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlWaWV3SGVscGVyCi0JCQkJCQkJCS5yZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKGdldEVkaXRvclNpdGUoKQotCQkJCQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQljaGFuZ2VUaW1lID0gLTE7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCWFjdGlvbk1nci5nZXRDb21tYW5kU3RhY2soKS5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcigKLQkJCQluZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoRXZlbnRPYmplY3QgZXZlbnQpIHsKLQkJCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKGFjdGlvbk1nci5nZXRDb21tYW5kU3RhY2soKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbmFtZUNoYW5nZWQoKSB7Ci0JCVNhZmVVcGRhdGVDb250cm9sbGVyLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzZXRQYXJ0TmFtZSgpOwotCQkJCWlmIChwYWdlcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhZ2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IHBhZ2UgPSBpdGVyLm5leHQoKTsKLQotCQkJCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBJUmVmcmVzaGFibGUpIHsKLQkJCQkJCQkoKElSZWZyZXNoYWJsZSkgcGFnZSkucmVmcmVzaE5hbWUoZWxlbWVudE9iagotCQkJCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQlyZXR1cm4gYWN0aW9uTWdyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3IjaW5pdChJRWRpdG9yU2l0ZSwKLQkgKiAgICAgIElFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKLQkJYWN0aXZhdGlvbkxpc3RlbmVyID0gbmV3IEFjdGl2YXRpb25MaXN0ZW5lcihzaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldFBhcnRTZXJ2aWNlKCkpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQlJbWFnZSB0aXRsZUltYWdlID0gbGFiZWxQcm92aWRlci5nZXRJbWFnZShlbGVtZW50T2JqKTsKLQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCXNldFRpdGxlSW1hZ2UodGl0bGVJbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0KLQkJLy8gR2V0IG1ldGhvZCBlbGVtZW50IG9iamVjdCBmcm9tIEVkaXRvciBpbnB1dC4KLQkJLy8KLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCQllbGVtZW50T2JqID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQotCQlzZXRQYXJ0TmFtZSgpOwotCQllbGVtZW50T2JqLmVBZGFwdGVycygpLmFkZChuYW1lQ2hhbmdlZExpc3RlbmVyKTsKLQkJCi0JCWlmIChmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgIT0gbnVsbCkKLQkJCWZNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlci51cGRhdGVFZGl0b3JJbWFnZShlbGVtZW50T2JqKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVUaW1lU3RhbXBzKENvbGxlY3Rpb24gdXNlZFJlc291cmNlcykgewotCQl1cGRhdGVNb2RpZmljYXRpb25UaW1lU3RhbXBNYXAodXNlZFJlc291cmNlcyk7Ci0JCXVwZGF0ZUxvYWRUaW1lU3RhbXBNYXAodXNlZFJlc291cmNlcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU1vZGlmaWNhdGlvblRpbWVTdGFtcE1hcChDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMpIHsKLQkJaWYgKG1vZGlmaWNhdGlvblRpbWVTdGFtcE1hcCA9PSBudWxsKSB7Ci0JCQltb2RpZmljYXRpb25UaW1lU3RhbXBNYXAgPSBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgTG9uZz4oKTsKLQkJfSBlbHNlIHsKLQkJCW1vZGlmaWNhdGlvblRpbWVTdGFtcE1hcC5jbGVhcigpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHVzZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihyZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJCW1vZGlmaWNhdGlvblRpbWVTdGFtcE1hcC5wdXQocmVzb3VyY2UsIG5ldyBMb25nKG5ldyBGaWxlKHJlc291cmNlCi0JCQkJCQkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmxhc3RNb2RpZmllZCgpKSk7Ci0JCQl9Ci0JCX0KLQkJY2hlY2tGaWxlQ2hhbmdlZFJlcXVpcmVkID0gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlTG9hZFRpbWVTdGFtcE1hcChDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMpIHsKLQkJaWYgKGxvYWRUaW1lU3RhbXBNYXAgPT0gbnVsbCkgewotCQkJbG9hZFRpbWVTdGFtcE1hcCA9IG5ldyBIYXNoTWFwPFJlc291cmNlLCBMb25nPigpOwotCQl9IGVsc2UgewotCQkJbG9hZFRpbWVTdGFtcE1hcC5jbGVhcigpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHVzZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2UpIHsKLQkJCQlsb2FkVGltZVN0YW1wTWFwLnB1dChyZXNvdXJjZSwgbmV3IExvbmcoKChJTGlicmFyeVJlc291cmNlKXJlc291cmNlKQotCQkJCQkJLmdldExvYWRTdGFtcCgpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlcmUgaXMgYW55IHJlc291cmNlIGluIHRoZSBnaXZlbiA8Y29kZT51c2VkUmVzb3VyY2VzPC9jb2RlPgotCSAqIHRoYXQgaGFzIGJlZW4gcmVsb2FkZWQgc2luY2UgbGFzdCB1cGRhdGUgb2YgbG9hZCB0aW1lIHN0YW1wcyBieSB0aGlzCi0JICogZWRpdG9yCi0JICogCi0JICogQHBhcmFtIHVzZWRSZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tSZWxvYWRlZChDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBnZXRSZXNvdXJjZVNldCh1c2VkUmVzb3VyY2VzKTsKLQkJYm9vbGVhbiB4bWkgPSByZXNvdXJjZVNldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQgCi0JCQkmJiAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpcmVzb3VyY2VTZXQpLmdldFBlcnNpc3RlbmNlVHlwZSgpLmVxdWFscyhTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHVzZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2UpIHsKLQkJCQlMb25nIG9sZFRpbWUgPSAoTG9uZykgbG9hZFRpbWVTdGFtcE1hcC5nZXQocmVzb3VyY2UpOwotCQkJCWxvbmcgY3VycmVudFRpbWUgPSAoKElMaWJyYXJ5UmVzb3VyY2UpcmVzb3VyY2UpLmdldExvYWRTdGFtcCgpOwotCQkJCWlmIChvbGRUaW1lICE9IG51bGwgJiYgb2xkVGltZS5sb25nVmFsdWUoKSAhPSBjdXJyZW50VGltZSkgewotCQkJCQlpZih4bWkpIHsKLQkJCQkJCUlSZXNvdXJjZSB3c1JlcyA9IEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24ocmVzb3VyY2UKLQkJCQkJCQkJLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQkJCWlmICh3c1JlcyAhPSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrRmlsZUNoYW5nZWQoQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzKSB7Ci0JCS8vIGNoZWNrIHJlc291cmNlIHNldCB0eXBlIGFuZCBjb250aW51ZSB0byBjaGVjayBmb3IgY2hhbmdlZCBmaWxlIGlmIHRoZQotCQkvLyB0eXBlIGlzIFhNSQotCQkvLwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGdldFJlc291cmNlU2V0KHVzZWRSZXNvdXJjZXMpOwotCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0Ci0JCQkJJiYgKChJTGlicmFyeVJlc291cmNlU2V0KSByZXNvdXJjZVNldCkuZ2V0UGVyc2lzdGVuY2VUeXBlKCkuZXF1YWxzKFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdXNlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJU3RyaW5nIGZpbGVQYXRoID0gRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHJlc291cmNlLmdldFVSSSgpLCByZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKSk7Ci0JCQkJTG9uZyBvbGRUaW1lID0gKExvbmcpIG1vZGlmaWNhdGlvblRpbWVTdGFtcE1hcC5nZXQocmVzb3VyY2UpOwotCQkJCWJvb2xlYW4gY2hlY2tGb3JTeW5jaCA9IGZhbHNlOwotCQkJCWlmIChvbGRUaW1lID09IG51bGwpIHsKLQkJCQkJLy8gZWRpdG9yIGlzIGJlaW5nIG9wZW4gb3IgbmV3IHNhdmVkIGZpbGUKLQkJCQkJLy8KLQkJCQkJY2hlY2tGb3JTeW5jaCA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJLmNoZWNrU3luY2hyb25pemVkKHJlc291cmNlKSAhPSAxOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKLQkJCQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQlsb25nIGN1cnJlbnRUaW1lID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJLnNhbWUoY3VycmVudFRpbWUsIG9sZFRpbWUubG9uZ1ZhbHVlKCkpKSB7Ci0JCQkJCQkvLyBzb21lIHRlYW0gcHJvdmlkZXJzIGNoYW5nZWQgdGhlIHRpbWVzdGFtcCBvZiBsYXN0Ci0JCQkJCQkvLyBmaWxlCi0JCQkJCQkvLyBtb2RpZmljYXRpb24gYnkgcmVtb3Zpbmcgc2Vjb25kIGZyYWN0aW9uCi0JCQkJCQkvLyBldmVuIHRoZSBmaWxlIHdhcyBub3QgY2hhbmdlZAotCQkJCQkJLy8KLQkJCQkJCW1vZGlmaWNhdGlvblRpbWVTdGFtcE1hcC5wdXQocmVzb3VyY2UsIG5ldyBMb25nKAotCQkJCQkJCQljdXJyZW50VGltZSkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY2hlY2tGb3JTeW5jaCA9IG9sZFRpbWUubG9uZ1ZhbHVlKCkgIT0gY3VycmVudFRpbWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoY2hlY2tGb3JTeW5jaCkgewotCQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSBGaWxlTWFuYWdlcgotCQkJCQkJCS5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKGZpbGVQYXRoKTsKLQkJCQkJaWYgKHdzUmVzICE9IG51bGwKLQkJCQkJCQkmJiAhd3NSZXMuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvbXB0UmVsb2FkRmlsZXMoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX3RpdGxlOwotCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfbWVzc2FnZTsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5UHJvbXB0KAotCQkJCXRpdGxlLCBtc2cpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYW5kbGVGaWxlQ2hhbmdlZChmaW5hbCBDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMpIHsKLQkJYm9vbGVhbiByZXQgPSBwcm9tcHRSZWxvYWRGaWxlcygpOwotCQlpZiAocmV0KSB7Ci0JCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxMCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbW9uaXRvci5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZnJlc2hfdGV4dCk7IAotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJdHJ5IHsKLQotCQkJCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1c2VkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKCFuZXcgRmlsZShyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkKLQkJCQkJCQkJCS5leGlzdHMoKSkgewotCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJQ29sbGVjdGlvbiBjaGFuZ2VkUmVzb3VyY2VzID0gUmVzb3VyY2VVdGlsCi0JCQkJCQkJCS5nZXRPdXRPZlN5bmNoUmVzb3VyY2VzKHVzZWRSZXNvdXJjZXMpOwotCQkJCQkJbW9uaXRvci53b3JrZWQoMik7Ci0KLQkJCQkJCS8vIHVubG9hZCB0aGUgcmVtb3ZlZCByZXNvdXJjZXMKLQkJCQkJCS8vCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBpdGVyCi0JCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXJlc291cmNlLnVubG9hZFdpdGhvdXRSZW1vdmUoKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCW1vbml0b3Iud29ya2VkKDIpOwotCi0JCQkJCQkvLyBSZWxvYWQgdGhlIGNoYW5nZWQgcmVzb3VyY2VzLgotCQkJCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiByZWxvYWRlZFJlc291cmNlcyA9IG1hbmFnZXIKLQkJCQkJCQkJCS5yZWxvYWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcyk7Ci0JCQkJCQkJaWYgKCFyZWxvYWRlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmdldFJlbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcygpCi0JCQkJCQkJCQkJLmFkZEFsbChyZWxvYWRlZFJlc291cmNlcyk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCQkJCQkJfHwgIXJlbG9hZGVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJCQkvLyBzYXZlIGNoYW5nZWQgcmVzb3VyY2VzIGJlZm9yZSByZWZyZXNoIHNvCi0JCQkJCQkJCS8vIGFjdGlvbgotCQkJCQkJCQkvLyBtYW5hZ2VyIHdpbGwgbm90IHRyeSB0byBzYXZlIHRoZXNlIGNoYW5nZWQKLQkJCQkJCQkJLy8gcmVzb3VyY2VzCi0JCQkJCQkJCS8vCi0JCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5jaGFuZ2VkUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmFkZEFsbChyZWxvYWRlZFJlc291cmNlcyk7Ci0JCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5sYXN0VXNlZFJlc291cmNlcwotCQkJCQkJCQkJCS5yZW1vdmVBbGwocmVtb3ZlZFJlc291cmNlcyk7Ci0JCQkJCQkJCXJlZnJlc2godHJ1ZSk7Ci0JCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5jaGFuZ2VkUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmNsZWFyKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJbW9uaXRvci53b3JrZWQoNCk7Ci0KLQkJCQkJCS8vIHJlZnJlc2ggb3V0LW9mLXN5bmNoIHJlc291cmNlcwotCQkJCQkJLy8KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoYW5nZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaCgKLQkJCQkJCQkJCShSZXNvdXJjZSkgaXRlci5uZXh0KCkpOwotCQkJCQkJfQotCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfTsKLQotCQkJdHJ5IHsKLQkJCQlnZXRTaXRlKCkKLQkJCQkJCS5nZXRXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkKLQkJCQkJCS5ydW5JblVJKAotCQkJCQkJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKSwKLQkJCQkJCQkJcnVubmFibGUsIG51bGwpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZTsgCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCXRpdGxlLCBlLnRvU3RyaW5nKCksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJY2hlY2tGaWxlQ2hhbmdlZFJlcXVpcmVkID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0TmFtZSgpIHsKLQkJU3RyaW5nIHBhcnROYW1lID0gZWxlbWVudE9iai5nZXROYW1lKCk7Ci0JCWlmIChwYXJ0TmFtZSA9PSBudWxsKSB7Ci0JCQlwYXJ0TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc2V0UGFydE5hbWUocGFydE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNyZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjZ2V0U2VsZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBjdXJyZW50U2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjc2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQotCQlmb3IgKEl0ZXJhdG9yIGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycykKLQkJCQkuaXRlcmF0b3IoKTsgbGlzdGVuZXJzLmhhc05leHQoKTspIHsKLQkJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgbGlzdGVuZXJzCi0JCQkJCS5uZXh0KCk7Ci0JCQlsaXN0ZW5lcgotCQkJCQkuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNhZGRQYWdlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlhZGRQYWdlKG5ldyBNZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZSh0aGlzKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlhZGRQYWdlKG5ldyBNZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlhZGRQYWdlKG5ldyBDb250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZSh0aGlzKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJYWRkUGFnZShuZXcgUm9sZURlc2NyaXB0aW9uUGFnZSh0aGlzKSk7Ci0JCQkJYWRkUGFnZShuZXcgUm9sZVdvcmtQcm9kdWN0c1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBSb2xlQ2F0ZWdvcmllc1BhZ2UodGhpcykpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgVGFzaykgewotCQkJCWFkZFBhZ2UobmV3IFRhc2tEZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IFRhc2tTdGVwc1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IFRhc2tSb2xlc1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IFRhc2tXb3JrUHJvZHVjdHNQYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZSh0aGlzKSk7Ci0JCQkJYWRkUGFnZShuZXcgVGFza0NhdGVnb3JpZXNQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJYWRkUGFnZShuZXcgV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJYWRkUGFnZShuZXcgV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZSh0aGlzKSk7Ci0JCQkJfQotCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBXb3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNBbGxvd2VkQXR0YWNobWVudHMoZWxlbWVudE9iaikpIHsKLQkJCQkJYWRkUGFnZShuZXcgR3VpZGFuY2VXaXRoQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWFkZFBhZ2UobmV3IFByYWN0aWNlRGVzY3JpcHRpb25QYWdlKHRoaXMpKTsKLQkJCQkJYWRkUGFnZShuZXcgUHJhY3RpY2VSZWZlcmVuY2VzUGFnZSh0aGlzKSk7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFkZFBhZ2UobmV3IEd1aWRhbmNlRGVzY3JpcHRpb25QYWdlKHRoaXMpKTsKLQkJCQkJYWRkUGFnZShuZXcgQ2hlY2tsaXN0SXRlbXNQYWdlKHRoaXMpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlhZGRQYWdlKG5ldyBHdWlkYW5jZURlc2NyaXB0aW9uUGFnZSh0aGlzKSk7Ci0JCQkJfQotCQkJCWlmICghKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBQcmFjdGljZSkpCi0JCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQlhZGRQYWdlKG5ldyBEaXNjaXBsaW5lRGVzY3JpcHRpb25QYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBEaXNjaXBsaW5lVGFza3NQYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBEaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZSh0aGlzKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCQlhZGRQYWdlKG5ldyBEaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IERpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZSh0aGlzKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCQlhZGRQYWdlKG5ldyBEb21haW5EZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IERvbWFpbldvcmtQcm9kdWN0c1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkgewotCQkJCWFkZFBhZ2UobmV3IFdvcmtQcm9kdWN0VHlwZURlc2NyaXB0aW9uUGFnZSh0aGlzKSk7Ci0JCQkJYWRkUGFnZShuZXcgV29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZSh0aGlzKSk7Ci0JCQkJYWRkUGFnZShuZXcgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UodGhpcykpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJCWFkZFBhZ2UobmV3IFJvbGVTZXREZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IFJvbGVTZXRSb2xlc1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykgewotCQkJCWFkZFBhZ2UobmV3IFJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZSh0aGlzKSk7Ci0JCQkJYWRkUGFnZShuZXcgUm9sZVNldEdyb3VwaW5nUm9sZVNldHModGhpcykpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgVG9vbCkgewotCQkJCWFkZFBhZ2UobmV3IFRvb2xEZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IFRvb2xUb29sTWVudG9yc1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJYWRkUGFnZShuZXcgQ3VzdG9tQ2F0ZWdvcnlEZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IEN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZSh0aGlzKSk7Ci0JCQl9Ci0KLQkJCXNldFBhcnROYW1lKGVsZW1lbnRPYmouZ2V0TmFtZSgpKTsKLQotCQkJaWYgKCEoZWxlbWVudE9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlIHx8IGVsZW1lbnRPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKQotCQkJCWNyZWF0ZVByZXZpZXdQYWdlKCk7Ci0KLQkJCWlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgVGFzaykgewotCQkJCS8vIGNoZWNrIGZvciBleHRlbnN0aW9uIHBvaW50IGFuZCBhZGQgdGhlIHBhZ2UgaWYgdGhlcmUKLQkJCQlMaXN0IHBhZ2VQcm92aWRlcnMgPSBNZXRob2RFZGl0b3JQYWdlUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldFBhZ2VQcm92aWRlcnMoKTsKLQotCQkJCWlmIChwYWdlUHJvdmlkZXJzICE9IG51bGwgJiYgcGFnZVByb3ZpZGVycy5zaXplKCkgPiAwKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VQcm92aWRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlPYmplY3QgcGFnZSA9IHBhZ2VQcm92aWRlcnMuZ2V0KGkpOwotCQkJCQkJCWlmIChwYWdlIGluc3RhbmNlb2YgSUV4dGVuc2lvbkZvcm1QYWdlKSB7Ci0JCQkJCQkJCUlFeHRlbnNpb25Gb3JtUGFnZSBmb3JtUGFnZSA9IChJRXh0ZW5zaW9uRm9ybVBhZ2UpIHBhZ2U7Ci0JCQkJCQkJCWZvcm1QYWdlLnNldEVkaXRvcih0aGlzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWRpc3Bvc2UoKTsKLQkJCXRocm93IChTV1RFcnJvcikgdDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0QmFzZUZvcm1FZGl0b3IjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdHJ5IHsKLQkJCS8vIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKAotCQkJLy8gcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJCWlmIChhY3RpdmF0aW9uTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCWFjdGl2YXRpb25MaXN0ZW5lci5kaXNwb3NlKCk7Ci0JCQl9Ci0KLQkJCW1vZGlmaWVkUmljaFRleHQgPSBudWxsOwotCi0JCQlkaXNwb3NlRWRpdG9yRXJyb3JUaWNrVXBkYXRlcigpOwotCQkJCi0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCW1hbmFnZXIuc3RvcExpc3RlbmluZ1RvKGFjdGlvbk1nci5nZXRDb21tYW5kU3RhY2soKSk7Ci0JCQl9Ci0KLQkJCWlmIChpc0RpcnR5KCkpIHsKLQkJCQlhY3Rpb25NZ3IudW5kb0FsbCgpOwotCQkJfQotCQkJYWN0aW9uTWdyLmRpc3Bvc2UoKTsKLQkJCWVsZW1lbnRPYmouZUFkYXB0ZXJzKCkucmVtb3ZlKG5hbWVDaGFuZ2VkTGlzdGVuZXIpOwotCQl9IGZpbmFsbHkgewotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQkJZGlzcG9zZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVkaXRvckVycm9yVGlja1VwZGF0ZXIoKQotCXsKLQkJaWYgKCBmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgIT0gbnVsbCApIHsKLQkJCWZNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlci5kaXNwb3NlKCk7Ci0JCQlmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3RCYXNlRm9ybUVkaXRvciNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlpZiAoZGlydHkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZGlydHkgPSBhY3Rpb25NZ3IuaXNTYXZlTmVlZGVkKCk7Ci0JCXJldHVybiBkaXJ0eTsKLQl9Ci0KLQlwdWJsaWMgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldFBlcnNpc3RlcigpIHsKLQkJaWYgKHBlcnNpc3RlciA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBhY3Rpb25NZ3IuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbW9kaWZpZWQgcmljaCB0ZXh0IGZpZWxkCi0JICogQHBhcmFtIG1vZGlmaWVkUmljaFRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RpZmllZFJpY2hUZXh0KElNZXRob2RSaWNoVGV4dCBtb2RpZmllZFJpY2hUZXh0KSB7Ci0JCXRoaXMubW9kaWZpZWRSaWNoVGV4dCA9IG1vZGlmaWVkUmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBtb2RpZmllZCByaWNoIHRleHQgCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1vZGlmaWVkUmljaFRleHQoSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsICYmICFyaWNoVGV4dC5pc0Rpc3Bvc2VkKCkKLQkJCQkmJiByaWNoVGV4dC5nZXRNb2RpZmllZCgpKSB7Ci0JCQlFT2JqZWN0IG1vZGFsT2JqZWN0ID0gcmljaFRleHQuZ2V0TW9kYWxPYmplY3QoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBtb2RhbE9iamVjdEZlYXR1cmUgPSByaWNoVGV4dAotCQkJCQkuZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCk7Ci0JCQlpZiAobW9kYWxPYmplY3QgIT0gbnVsbCAmJiBtb2RhbE9iamVjdEZlYXR1cmUgIT0gbnVsbCkgewotCQkJCU9iamVjdCBvbGRDb250ZW50ID0gbW9kYWxPYmplY3QuZUdldChtb2RhbE9iamVjdEZlYXR1cmUpOwotCQkJCWlmICghbXVzdFJlc3RvcmVWYWx1ZShyaWNoVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQkJT2JqZWN0IG5ld0NvbnRlbnQgPSByaWNoVGV4dC5nZXRUZXh0KCk7Ci0JCQkJCXJpY2hUZXh0LnNldEluaXRpYWxUZXh0KChTdHJpbmcpbmV3Q29udGVudCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIG1vZGFsT2JqZWN0LAotCQkJCQkJCQltb2RhbE9iamVjdEZlYXR1cmUsIG5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgbGFzdCBtb2RpZmllZCByaWNoIHRleHQgCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1vZGlmaWVkUmljaFRleHQoKSB7Ci0JCXNhdmVNb2RpZmllZFJpY2hUZXh0KG1vZGlmaWVkUmljaFRleHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlicmFyeVZhbGlkYXRlQWN0aW9uIGNyZWF0ZVZhbGlkYXRlUmVzb3VyY2VBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgTGlicmFyeVZhbGlkYXRlQWN0aW9uKGZhbHNlKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5VmFsaWRhdGVBY3Rpb24jcmVmcmVzaFZpZXdzKCkKLQkJCSAqLwotCQkJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXdzKCkgewotCQkJCUxpYnJhcnlWaWV3LmdldFZpZXcoKS5yZWZyZXNoVmlld3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZXNvdXJjZXMoQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlcykgewotCQlBcnJheUxpc3Q8RU9iamVjdD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEVPYmplY3Q+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQkJZWxlbWVudHMuYWRkQWxsKHJlc291cmNlLmdldENvbnRlbnRzKCkpOwotCQkJfQotCQl9Ci0JCUxpYnJhcnlWYWxpZGF0ZUFjdGlvbiB2YWxpZGF0ZUFjdGlvbiA9IGNyZWF0ZVZhbGlkYXRlUmVzb3VyY2VBY3Rpb24oKTsKLQkJdmFsaWRhdGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVsZW1lbnRzKSk7Ci0JCXZhbGlkYXRlQWN0aW9uLnJ1bigpOwotCQlyZXR1cm4gdmFsaWRhdGVBY3Rpb24uaXNTdWNjZXNzZnVsKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3RCYXNlRm9ybUVkaXRvciNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuZG9TYXZlOiBzYXZpbmcgY2hhbmdlcyB0byBtZXRob2QgbGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlzYXZlTW9kaWZpZWRSaWNoVGV4dChtb2RpZmllZFJpY2hUZXh0KTsKLQotCQlnZXRQZXJzaXN0ZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIGNoZWNrIGZvciBtb2RpZmlhYmxlCi0JCQkvLwotCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXMgPSBnZXRNb2RpZmllZFJlc291cmNlcygpOwotCi0JCQkvLyB1cGRhdGUgdmVyc2lvbiBpbmZvIGluIGxpYnJhcnkgcmVzb3VyY2UgaWYgbmVlZGVkIGJ5IGFkZGluZwotCQkJLy8gbGlicmFyeSByZXNvdXJjZSB0byBjb2xsZWN0aW9uCi0JCQkvLyBvZiBtb2RpZmllZCByZXNvdXJjZXMKLQkJCS8vCi0JCQlIYXNoU2V0PFJlc291cmNlPiByZXNvdXJjZXNUb1VwZGF0ZVZlcnNpb25JbmZvID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCQlpZiAoIW1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IFBlcnNpc3RlbmNlVXRpbAotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCQkJaWYgKG1lICE9IG51bGwpIHsKLQkJCQkJCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KG1lKTsKLQkJCQkJCWlmIChsaWIgIT0gbnVsbCkgewotCQkJCQkJCVJlc291cmNlIGxpYlJlc291cmNlID0gbGliLmVSZXNvdXJjZSgpOwotCQkJCQkJCWlmIChsaWJSZXNvdXJjZSAhPSBudWxsCi0JCQkJCQkJCQkmJiAhbW9kaWZpZWRSZXNvdXJjZXMuY29udGFpbnMobGliUmVzb3VyY2UpCi0JCQkJCQkJCQkmJiAhcmVzb3VyY2VzVG9VcGRhdGVWZXJzaW9uSW5mbwotCQkJCQkJCQkJCQkuY29udGFpbnMobGliUmVzb3VyY2UpCi0JCQkJCQkJCQkmJiBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkJCQkJLmNoZWNrVG9vbFZlcnNpb24obGliUmVzb3VyY2UpICE9IDApIHsKLQkJCQkJCQkJcmVzb3VyY2VzVG9VcGRhdGVWZXJzaW9uSW5mby5hZGQobGliUmVzb3VyY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwocmVzb3VyY2VzVG9VcGRhdGVWZXJzaW9uSW5mbyk7Ci0JCQl9Ci0KLQkJCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KAotCQkJCQltb2RpZmllZFJlc291cmNlcywgZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJaGFuZGxlRXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGZvciBvdXQtb2Ytc3luY2gKLQkJCS8vCi0JCQlpZiAoY2hlY2tGaWxlQ2hhbmdlZChtb2RpZmllZFJlc291cmNlcykpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51cGRhdGVfb3V0b2ZzeW5jaF90aXRsZTsKLQkJCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXBkYXRlX291dG9mc3luY2hfbXNnOwotCQkJCWlmICghQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheVByb21wdCh0aXRsZSwgbXNnKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBmbGFnIHRoZSByZXNvdXJjZXMgdG8gdXBkYXRlIHZlcnNpb24gaW5mbyBhcyBtb2RpZmllZCBzbyB0aGV5Ci0JCQkvLyB3aWxsIGJlIHNhdmVkCi0JCQkvLwotCQkJaWYgKCFyZXNvdXJjZXNUb1VwZGF0ZVZlcnNpb25JbmZvLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlc1RvVXBkYXRlVmVyc2lvbkluZm8uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQlyZXNvdXJjZS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKGlzVmFsaWRhdGVSZXNvdXJjZXNCZWZvcmVTYXZlUmVxdWlyZWQoKSkgewotCQkJCS8vIHZhbGlkYXRlCi0JCQkJLy8KLQkJCQlpZighdmFsaWRhdGVSZXNvdXJjZXMobW9kaWZpZWRSZXNvdXJjZXMpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBubyB2YWxpZGF0aW9uIGJlZm9yZSBzYXZlCi0JCQkJLy8gcmVtb3ZlIGFsbCB2YWxpZGF0aW9uIGVycm9ycyBtYXJrZXJzIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IG1ldGhvZCBlbGVtZW50Ci0JCQkJLy8KLQkJCQlMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5JTlNUQU5DRS5kZWxldGVNYXJrZXJzKGVsZW1lbnRPYmopOwotCQkJfQotCi0JCQkvLyBTYXZlLgotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclRpdGxlOyAKLQkJCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMTsgCi0JCQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjEKLQkJCQkJCQk6IGUuZ2V0TWVzc2FnZSgpOyAKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQl0aXRsZSwgbXNnLCByZWFzb24sIGUpOwotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJZGlydHkgPSBmYWxzZTsKLQkJCQlhY3Rpb25NZ3Iuc2F2ZUlzRG9uZSgpOwotCQkJCWNoYW5nZVRpbWUgPSAtMTsKLQotCQkJCXVwZGF0ZVRpbWVTdGFtcHMoZ2V0VXNlZFJlc291cmNlcygpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCWlmIChTdHJVdGlsLmlzQmxhbmsocmVhc29uKSkgewotCQkJCQlyZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMjsgCi0JCQkJfQotCQkJCVN0cmluZ1dyaXRlciBkZXRhaWxzID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihkZXRhaWxzKSk7Ci0JCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclRpdGxlOyAKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMjsgCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCXRpdGxlLCBtZXNzYWdlLCByZWFzb24sIGRldGFpbHMudG9TdHJpbmcoKSwgZSk7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQotCQkJLy8gUmVuYW1lLgotCQkJaWYgKCFyZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uLmlzRW1wdHkoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5hZGp1c3RMb2NhdGlvbihyZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JUaXRsZTsgCi0JCQkJCVN0cmluZyB0ZW1wbGF0ZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvck1lc3NhZ2UxOyAKLQkJCQkJU3RyaW5nQnVmZmVyIGZpbGVMaXN0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJT2JqZWN0IG9iaiA9IEZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhyZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQkJCQlpZihvYmogPT0gbnVsbCkgewotCQkJCQkJCW9iaiA9IHJlc291cmNlOwotCQkJCQkJfQotCQkJCQkJZmlsZUxpc3QuYXBwZW5kKG9iaikuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRlbXBsYXRlLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IGZpbGVMaXN0IH0pOwotCQkJCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xCi0JCQkJCQkJOiBlLmdldE1lc3NhZ2UoKTsgCi0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJdGl0bGUsIG1zZywgcmVhc29uLCBlKTsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0KLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKHJlYXNvbikpIHsKLQkJCQkJCXJlYXNvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24yOyAKLQkJCQkJfQotCQkJCQlTdHJpbmdXcml0ZXIgZGV0YWlscyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKGRldGFpbHMpKTsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU7IAotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMjsgCi0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJdGl0bGUsIG1lc3NhZ2UsIHJlYXNvbiwgZGV0YWlscy50b1N0cmluZygpLCBlKTsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0KLQkJCQlyZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uLmNsZWFyKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0cnkgewotCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQlWaWV3SGVscGVyLnJlbG9hZEN1cnJlbnRMaWJhcnlPblJvbGxiYWNrRXJyb3IoZ2V0U2l0ZSgpCi0JCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZGF0ZVJlc291cmNlc0JlZm9yZVNhdmVSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5pc01vZGlmaWVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZ2V0UGVyc2lzdGVyKCkuc2F2ZShyZXNvdXJjZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZTsgCi0JCQkJU3RyaW5nIHRlbXBsYXRlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UxOyAKLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQodGVtcGxhdGUsCi0JCQkJCQluZXcgT2JqZWN0W10geyByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSB9KTsKLQkJCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xCi0JCQkJCQk6IGUuZ2V0TWVzc2FnZSgpOyAKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJdGl0bGUsIG1zZywgcmVhc29uLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVByZXZpZXdQYWdlKCkgewotCQlDb21wb3NpdGUgcGFyZW50ID0gZ2V0Q29udGFpbmVyKCk7Ci0JCUNvbXBvc2l0ZSBwcmV2aWV3Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcHJldmlld0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJUHJldmlld1BhZ2UgcGFnZSA9IG5ldyBQcmV2aWV3UGFnZShwcmV2aWV3Q29tcG9zaXRlKTsKLQkJcHJldmlld2VyID0gcGFnZS5nZXRQcmV2aWV3Vmlld2VyKCk7Ci0KLQkJcHJldmlld19wYWdlX2luZGV4ID0gYWRkUGFnZShwcmV2aWV3Q29tcG9zaXRlKTsKLQkJc2V0UGFnZVRleHQocHJldmlld19wYWdlX2luZGV4LCBBdXRob3JpbmdVSVJlc291cmNlcy5wcmV2aWV3UGFnZV90aXRsZSk7IAotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGxpc3RlbiB0byB0aGUgdGFiIGNoYW5nZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBuZXdQYWdlSW5kZXgpIHsKLQkJc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOwotCi0JCWlmIChwcmV2aWV3X3BhZ2VfaW5kZXggPT0gbmV3UGFnZUluZGV4ICYmIHByZXZpZXdlciAhPSBudWxsKSB7Ci0JCQkvLyBVc2UgdGhlIGRlZmF1bHQgbGF5b3V0IG1hbmFnZXIuCi0JCQlwcmV2aWV3ZXIuc2V0TGF5b3V0TWFuYWdlcihudWxsKTsKLQkJCXByZXZpZXdlci5zaG93RWxlbWVudENvbnRlbnQoZWxlbWVudE9iaik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlydHkoKSB7Ci0JCWRpcnR5ID0gdHJ1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCX0KLQotCS8qKgotCSAqIFJlc3RvcmUgdmFsdWUgb2YgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4KLQkgKiAJCWJvb2xlYW4gdmFsdWUgdG8gaW5kaWNhdGUgd2hldGhlciBjb250cm9sIHdhcyByZXN0b3JlZCBvciBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtdXN0UmVzdG9yZVZhbHVlKE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHdpZGdldFRvQ2hlY2sgPT0gY29udHJvbCkgewotCQkJLy8gdGhlIGNvbnRyb2wgaXMgY3VycmVudGx5IGJlaW5nIGNoZWNrZWQgZm9yIGVkaXRhYmxlLCBidXQgdGhlcmUgaXMKLQkJCS8vIHN0aWxsIGZvY3VzIGxvc3QKLQkJCS8vIGV2ZW50IGlzIGJlaW5nIHNlbnQgb3V0IGV2ZW4gdGhlIGNoZWNrIGlzIG5vdCBjb21wbGV0ZWQgeWV0LgotCQkJLy8gcmV0dXJuIHRydWUgc28gdGhlIGZvY3VzTG9zdCgpIHdpbGwgbm90IG1ha2UgYW55IGNoYW5nZSB0byB0aGUKLQkJCS8vIGNvbnRyb2wuCi0JCQkvLwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlPYmplY3QgZWRpdENvbnRyb2wgPSBjb250cm9sOwotCQlpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBNZXRob2RSaWNoVGV4dEVkaXRvcikgewotCQkJZWRpdENvbnRyb2wgPSAoKE1ldGhvZFJpY2hUZXh0RWRpdG9yKSBjb250cm9sKS5nZXRSaWNoVGV4dENvbnRyb2woKTsKLQkJfQotCQlib29sZWFuIHJlc3RvcmUgPSB3aWRnZXRzVG9SZXN0b3JlVmFsdWUuY29udGFpbnMoZWRpdENvbnRyb2wpOwotCQlpZiAoIXJlc3RvcmUpIHsKLQkJCXN5bmNocm9uaXplZCAod2lkZ2V0c1RvUmVzdG9yZVZhbHVlKSB7Ci0JCQkJcmVzdG9yZSA9IHdpZGdldHNUb1Jlc3RvcmVWYWx1ZS5jb250YWlucyhlZGl0Q29udHJvbCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlc3RvcmUpIHsKLQkJCWlmIChlZGl0Q29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlUZXh0IHRleHQgPSAoKFRleHQpIGVkaXRDb250cm9sKTsKLQkJCQl0ZXh0LnNldFRleHQoKFN0cmluZykgdmFsdWUpOwotCQkJfSBlbHNlIGlmIChlZGl0Q29udHJvbCBpbnN0YW5jZW9mIElNZXRob2RSaWNoVGV4dCkgewotCQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIGVkaXRDb250cm9sOwotCQkJCXJpY2hUZXh0LnNldFRleHQoKFN0cmluZykgdmFsdWUpOwotCQkJfQotCQkJd2lkZ2V0c1RvUmVzdG9yZVZhbHVlLnJlbW92ZShlZGl0Q29udHJvbCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3RvcmU7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IExpc3RlbmVyIAotCSAqCi0JICovCi0JcHVibGljIGNsYXNzIE1vZGlmeUxpc3RlbmVyIGltcGxlbWVudHMKLQkJCW9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIgewotCi0JCXByaXZhdGUgRU9iamVjdCBlbGVtZW50OwotCi0JCXByaXZhdGUgYm9vbGVhbiBjaGVja0NvbnRhaW5lclJlc291cmNlOwotCi0JCXByaXZhdGUgYm9vbGVhbiBkaXNhYmxlZCA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCQkgKi8KLQkJcHVibGljIE1vZGlmeUxpc3RlbmVyKEVPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBjaGVja0NvbnRhaW5lcikgewotCQkJc3VwZXIoKTsKLQkJCWNoZWNrQ29udGFpbmVyUmVzb3VyY2UgPSBjaGVja0NvbnRhaW5lcjsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVzdG9yZVRleHQoT2JqZWN0IGNvbnRyb2wsIFN0cmluZyB0eHQpIHsKLQkJCWJvb2xlYW4gb2xkID0gZGlzYWJsZWQ7Ci0JCQl0cnkgewotCQkJCWRpc2FibGVkID0gdHJ1ZTsKLQkJCQlPYmplY3QgZWRpdENvbnRyb2wgPSBjb250cm9sOwotCQkJCWlmIChlZGl0Q29udHJvbCBpbnN0YW5jZW9mIE1ldGhvZFJpY2hUZXh0RWRpdG9yKSB7Ci0JCQkJCWVkaXRDb250cm9sID0gKChNZXRob2RSaWNoVGV4dEVkaXRvcikgY29udHJvbCkKLQkJCQkJCQkuZ2V0UmljaFRleHRDb250cm9sKCk7Ci0JCQkJfQotCQkJCWlmIChlZGl0Q29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQkJVGV4dCB0ZXh0ID0gKChUZXh0KSBlZGl0Q29udHJvbCk7Ci0JCQkJCXRleHQuc2V0VGV4dCh0eHQpOwotCQkJCX0gZWxzZSBpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBJTWV0aG9kUmljaFRleHQpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gKElNZXRob2RSaWNoVGV4dCkgZWRpdENvbnRyb2w7Ci0JCQkJCXJpY2hUZXh0LnNldFRleHQodHh0KTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWRpc2FibGVkID0gb2xkOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGNoZWNrRWRpdChFT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBjb250cm9sLAotCQkJCWJvb2xlYW4gY2hlY2tDb250YWluZXJSZXNvdXJjZSkgewotCQkJLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCB3aWRnZXQgc28gbXVzdFJlc3RvcmVWYWx1ZSgpIGNhbgotCQkJLy8gdXNlIGl0IHRvIGNoZWNrCi0JCQkvLyB3aGV0aGVyIGEgZm9jdXMgbG9zdCBldmVudCBpcyB0cmlnZ2VyZWQgZHVyaW5nIGEgY2hlY2tFZGl0LgotCQkJLy8gbXVzdFJlc3RvcmVWYWx1ZSgpIHRoZW4KLQkJCS8vIHJldHVybnMgdHJ1ZSBzbyBmb2N1c0xvc3QoKSB3aWxsIG5vdCB0cnkgdG8gbWFrZSBjaGFuZ2UgdG8gdGhlCi0JCQkvLyB2YWx1ZSBib3VuZCB0byB0aGUgd2lkZ2V0Ci0JCQkvLwotCQkJd2lkZ2V0VG9DaGVjayA9IGNvbnRyb2w7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuY2hlY2tFZGl0OiBlbnRlciwgY29udHJvbD0iICsgY29udHJvbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJCWlmICh3aWRnZXRzVG9SZXN0b3JlVmFsdWUuY29udGFpbnMoY29udHJvbCkpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLmNoZWNrRWRpdDogd2lkZ2V0IGZvdW5kIGluIHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSwgZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXN5bmNocm9uaXplZCAod2lkZ2V0c1RvUmVzdG9yZVZhbHVlKSB7Ci0JCQkJCWlmICh3aWRnZXRzVG9SZXN0b3JlVmFsdWUuY29udGFpbnMoY29udHJvbCkpIHsKLQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLmNoZWNrRWRpdDogd2lkZ2V0IGZvdW5kIGluIHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSwgZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQotCQkJCQlzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChlbGVtZW50LCBnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0KLQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIElSaWNoVGV4dCkgewotCQkJCQkJCSgoSVJpY2hUZXh0KSBjb250cm9sKS5yZXN0b3JlVGV4dCgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAoY29udHJvbCA9PSBjdXJyZW50RmVhdHVyZUVkaXRvcikgewotCQkJCQkJCQlyZXN0b3JlVGV4dChjb250cm9sLCAoU3RyaW5nKSBlbGVtZW50Ci0JCQkJCQkJCQkJLmVHZXQoY3VycmVudEVkaXRlZEZlYXR1cmUpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBBZGQgdGhlIGNvbnRyb2wgdG8gdGhlIGxpc3Qgb2Ygd2lkZ2V0cyB3aG9zZQotCQkJCQkJCQkvLyB2YWx1ZSBuZWVkcwotCQkJCQkJCQkvLyB0byBiZSByZXN0b3JlZCB0byB0aGUgb3JpZ2luYWwgb25lLi4KLQkJCQkJCQkJd2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmFkZChjb250cm9sKTsKLQkJCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLmNoZWNrRWRpdDogYWRkZWQgd2lkZ2V0IHRvIHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoY2hlY2tDb250YWluZXJSZXNvdXJjZSkgewotCQkJCQkJaWYgKGVsZW1lbnQuZUNvbnRhaW5lcigpICE9IG51bGwKLQkJCQkJCQkJJiYgZWxlbWVudC5lQ29udGFpbmVyKCkuZVJlc291cmNlKCkgIT0gZWxlbWVudAotCQkJCQkJCQkJCS5lUmVzb3VyY2UoKSkgewotCQkJCQkJCXN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KGVsZW1lbnQuZUNvbnRhaW5lcigpLAotCQkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCQkvLyAvLyBBZGQgdGhlIGNvbnRyb2wgdG8gdGhlIGxpc3Qgb2Ygd2lkZ2V0cwotCQkJCQkJCQkvLyB3aG9zZSB2YWx1ZQotCQkJCQkJCQkvLyAvLyBuZWVkcyB0byBiZSByZXN0b3JlZCB0byB0aGUgb3JpZ2luYWwgb25lLgotCQkJCQkJCQkvLyBpZiAoZGVidWcpIHsKLQkJCQkJCQkJLy8gU3lzdGVtLm91dAotCQkJCQkJCQkvLyAucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5jaGVja0VkaXQ6Ci0JCQkJCQkJCS8vIGFkZGVkIHdpZGdldCB0byB3aWRnZXRzVG9SZXN0b3JlVmFsdWUiKTsKLQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkvLyB9Ci0JCQkJCQkJCWlmIChjb250cm9sIGluc3RhbmNlb2YgSVJpY2hUZXh0KSB7Ci0JCQkJCQkJCQkoKElSaWNoVGV4dCkgY29udHJvbCkucmVzdG9yZVRleHQoKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWlmIChjb250cm9sID09IGN1cnJlbnRGZWF0dXJlRWRpdG9yKSB7Ci0JCQkJCQkJCQkJcmVzdG9yZVRleHQoY29udHJvbCwgKFN0cmluZykgZWxlbWVudAotCQkJCQkJCQkJCQkJLmVHZXQoY3VycmVudEVkaXRlZEZlYXR1cmUpKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJd2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmFkZChjb250cm9sKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfdGl0bGUsIAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdCwgCi0JCQkJCQkJc3RhdHVzKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXJldHVybiB0cnVlOwotCQkJfSBmaW5hbGx5IHsKLQkJCQkvLyBjbGVhciB0aGUgcmVmZXJlbmNlIHdoZW4gdGhlIGNoZWNrIGlzIGRvbmUKLQkJCQkvLwotCQkJCXdpZGdldFRvQ2hlY2sgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lciNtb2RpZnlUZXh0KE1vZGlmeUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lci5tb2RpZnlUZXh0OiBlbnRlciwgZGlzYWJsZWQ9IiArIGRpc2FibGVkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKCFkaXNhYmxlZCAmJiBlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoZS53aWRnZXQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJT2JqZWN0IHdpZGdldCA9IGUud2lkZ2V0OwotCQkJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBCcm93c2VyKSB7Ci0JCQkJCXdpZGdldCA9ICgoQnJvd3Nlcikgd2lkZ2V0KQotCQkJCQkJCS5nZXREYXRhKElNZXRob2RSaWNoVGV4dC5QUk9QRVJUWV9OQU1FKTsKLQkJCQkJaWYgKHdpZGdldCA9PSBudWxsKSB7Ci0JCQkJCQl3aWRnZXQgPSBlLndpZGdldDsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyLm1vZGlmeVRleHQ6IHdpZGdldD0iICsgd2lkZ2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCWlmICh3aWRnZXRzVG9SZXN0b3JlVmFsdWUuY29udGFpbnMod2lkZ2V0KSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIubW9kaWZ5VGV4dDogd2lkZ2V0IGZvdW5kIGluIHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSwgZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmICghY2hlY2tFZGl0KGVsZW1lbnQsIHdpZGdldCwgY2hlY2tDb250YWluZXJSZXNvdXJjZSkpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyLm1vZGlmeVRleHQ6IGNoZWNrRWRpdCBmYWlsZWQsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgSU1ldGhvZFJpY2hUZXh0KSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIHdpZGdldDsKLQkJCQkJc2V0TW9kaWZpZWRSaWNoVGV4dChyaWNoVGV4dCk7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lci5tb2RpZnlUZXh0OiBhZGRpbmcgdG8gbW9kaWZpZWRSaWNoVGV4dHMgbGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyLm1vZGlmeVRleHQ6IG1hcmtpbmcgZWRpdG9yIGFzIGRpcnR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJc2V0RGlydHkoKTsKLQkJCX0KLQotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIubW9kaWZ5VGV4dDogZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogU2V0cyB0aGUgdW5kZXJseWluZyBtb2RlbCBlbGVtZW50LgotCQkgKiAKLQkJICogQHBhcmFtIGVsZW1lbnQKLQkJICogICAgICAgICAgICBBIG1ldGhvZCBlbGVtZW50LgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RWxlbWVudChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogU2V0cyB0aGUgZGlzYWJsZSBmbGFnLgotCQkgKiAKLQkJICogQHBhcmFtIGRpc2FibGVkCi0JCSAqICAgICAgICAgICAgSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGlnbm9yZSB0aGUgbW9kaWZ5IGV2ZW50cy4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldERpc2FibGUoYm9vbGVhbiBkaXNhYmxlZCkgewotCQkJdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBuZXcgaW5zdGFuY2Ugb2YgTW9kaWZ5TGlzdGVuZXIgdGhhdCBzdXBwb3J0cyB0ZWFtIGFuZCBDTQotCSAqIGludGVncmF0aW9uIEFueSBjb250cm9sIGluIHRoZSBlZGl0b3IsIGlmIGl0IG5lZWRzIGEgTW9kaWZ5TGlzdGVuZXIsIG11c3QKLQkgKiB1c2Ugb25lIGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTW9kaWZ5TGlzdGVuZXIgY3JlYXRlTW9kaWZ5TGlzdGVuZXIoRU9iamVjdCBlT2JqKSB7Ci0JCXJldHVybiBjcmVhdGVNb2RpZnlMaXN0ZW5lcihlT2JqLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBuZXcgaW5zdGFuY2Ugb2YgTW9kaWZ5TGlzdGVuZXIgdGhhdCBzdXBwb3J0cyB0ZWFtIGFuZCBDTQotCSAqIGludGVncmF0aW9uIEFueSBjb250cm9sIGluIHRoZSBlZGl0b3IsIGlmIGl0IG5lZWRzIGEgTW9kaWZ5TGlzdGVuZXIsIG11c3QKLQkgKiB1c2Ugb25lIGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqIEBwYXJhbSBjaGVja0NvbnRhaW5lcgotCSAqICAgICAgICAgICAgaWYgdHJ1ZSB3aWxsIGNoZWNrIHRoZSBjb250YWluZXIgb2YgdGhlIGdpdmVuIG9iamVjdCBmb3IKLQkgKiAgICAgICAgICAgIGVkaXRhYmxlIGFzIHdlbGwgd2hlbiBjaGVja2luZyB0aGUgZ2l2ZW4gb2JqZWN0IGZvciBlZGl0YWJsZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCU1vZGlmeSBMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBNb2RpZnlMaXN0ZW5lciBjcmVhdGVNb2RpZnlMaXN0ZW5lcihFT2JqZWN0IGVPYmosCi0JCQlib29sZWFuIGNoZWNrQ29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoZU9iaiwgY2hlY2tDb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNwZWNpZmllZCBjb250cm9sIHRvIGJlIHRoZSBjdXJyZW50IGVkaXRvciBvZiB0aGUgc3BlY2lmaWVkCi0JICogZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoT2JqZWN0IGNvbnRyb2wsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQljdXJyZW50RmVhdHVyZUVkaXRvciA9IGNvbnRyb2w7Ci0JCWN1cnJlbnRFZGl0ZWRGZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb25pdG9yQ2hhbmdlKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeQotCQkJCS5nZXRFeHRlbnNpb25Qb2ludCgib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucmVmcmVzaFByb3ZpZGVycyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChwb2ludCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiZXh0ZW5zaW9uOiBVSUQ9IiArIGV4dGVuc2lvbi5nZXRVbmlxdWVJZGVudGlmaWVyKCkgKyAiLCAiICsgZXh0ZW5zaW9uKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgcmVzb3VyY2UgdG8gYWRqdXN0IGxvY2F0aW9uCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VUb0FkanVzdExvY2F0aW9uKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJlc291cmNlc1RvQWRqdXN0TG9jYXRpb24uYWRkKHJlc291cmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRVc2VkRmVhdHVyZXMoKSB7Ci0JCXJldHVybiBlbGVtZW50T2JqLmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHJlc291cmNlcyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgdXNlZCBieSB0aGlzIGVkaXRvcnMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlsaXN0IG9mIHVzZWQgcmVzb3VyY2VzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0VXNlZFJlc291cmNlcygpIHsKLQkJSGFzaFNldDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudE9iai5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQl9Ci0JCUxpc3QgYWxsRmVhdHVyZXMgPSBnZXRVc2VkRmVhdHVyZXMoKTsKLQkJZm9yIChpbnQgaSA9IGFsbEZlYXR1cmVzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGFsbEZlYXR1cmVzCi0JCQkJCS5nZXQoaSk7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIGVsZW1lbnRPYmouZUdldChmZWF0dXJlKTsKLQkJCQlmb3IgKGludCBqID0gdmFsdWVzLnNpemUoKSAtIDE7IGogPiAtMTsgai0tKSB7Ci0JCQkJCUVPYmplY3QgdmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLmdldChqKTsKLQkJCQkJaWYgKHZhbHVlLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCXJlc291cmNlcy5hZGQodmFsdWUuZVJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50T2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRU9iamVjdAotCQkJCQkJJiYgKHJlc291cmNlID0gKChFT2JqZWN0KSB2YWx1ZSkuZVJlc291cmNlKCkpICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxhc3RVc2VkUmVzb3VyY2VzID0gcmVzb3VyY2VzOwotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCXByaXZhdGUgTWFwIGdldFVSSVRvVXNlZFJlc291cmNlTWFwKCkgewotCQlIYXNoTWFwPFVSSSwgUmVzb3VyY2U+IG1hcCA9IG5ldyBIYXNoTWFwPFVSSSwgUmVzb3VyY2U+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFVzZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCW1hcC5wdXQocmVzb3VyY2UuZ2V0VVJJKCksIHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVycm9yKElTdGF0dXMgc3RhdHVzKSB7Ci0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5KAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQsIAotCQkJCXN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgYWN0aXZhdGlvbiBvZiB0aGlzIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkvLyBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uCi0JCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBtZXRob2QgbGlicmFyeSBvcGVuIGlzIG5vdCBjbG9zZWQuCi0JCVhNSUxpYnJhcnlVdGlsLm9wZW5NZXRob2RMaWJyYXJ5UHJvamVjdChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkKLQkJCQkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJaWYgKGNoZWNrRmlsZUNoYW5nZWRSZXF1aXJlZCkgewotCQkJQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzID0gZ2V0VXNlZFJlc291cmNlcygpOwotCQkJaWYgKGNoZWNrRmlsZUNoYW5nZWQodXNlZFJlc291cmNlcykpIHsKLQkJCQloYW5kbGVGaWxlQ2hhbmdlZCh1c2VkUmVzb3VyY2VzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsKLQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX0ZpbGVDb25mbGljdF9sYWJlbDsKLQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLl9XQVJOX0ZpbGVDb25mbGljdDsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5UHJvbXB0KAotCQkJCXRpdGxlLCBtc2cpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgY2hhbmdlZCByZXNvdXJjZXMgd2hlbiB0aGlzIHZpZXcgaXMgYWN0aXZhdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKSB7Ci0JCWlmICgoZWxlbWVudE9iai5lSXNQcm94eSgpIHx8ICFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkKLQkJCQkmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7Ci0JCQkvLyBlZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0KLQkJCS8vIGZvciAoSXRlcmF0b3IgaSA9IGNoYW5nZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaS5uZXh0KCk7Ci0JCQkvLyBpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJLy8gaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCS8vIHRyeSB7Ci0JCQkvLyAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkucmVsb2FkKG51bGwpOwotCQkJLy8gfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyByZXNvdXJjZS51bmxvYWQoKTsKLQkJCS8vIHRyeSB7Ci0JCQkvLyByZXNvdXJjZS5sb2FkKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQkvLyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBvciBub3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lucHV0VmFsaWQoKSB7Ci0JCWlmIChlbGVtZW50T2JqICE9IG51bGwgJiYgZWxlbWVudE9iai5lSXNQcm94eSgpKSB7Ci0JCQlFT2JqZWN0IGUgPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZShlbGVtZW50T2JqKTsKLQkJCXJldHVybiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgIWUuZUlzUHJveHkoKSAmJiBVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RMaWJyYXJ5KGUpID09IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBhZ2VzKCkgewotCQl3aGlsZSAoZ2V0UGFnZUNvdW50KCkgPiAwKSB7Ci0JCQlyZW1vdmVQYWdlKDApOwotCQl9Ci0JCWFkZFBhZ2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBjcmVhdGVJbnB1dChNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoZSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlZnJlc2goZmluYWwgYm9vbGVhbiBmb3JjZSkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUNvbGxlY3Rpb24gdXNlZFJlc291cmNlcyA9IGxhc3RVc2VkUmVzb3VyY2VzOwotCQkJCQkJaWYgKCFmb3JjZSAmJiAhZWxlbWVudE9iai5lSXNQcm94eSgpCi0JCQkJCQkJCSYmICFjaGVja1JlbG9hZGVkKHVzZWRSZXNvdXJjZXMpKSB7Ci0JCQkJCQkJLy8gbm8gcmVzb3VyY2UgcmVsb2FkZWQsIG5vIG5lZWQgdG8gcmVmcmVzaAotCQkJCQkJCS8vCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJaW50IGFjdGl2ZVBhZ2VJbmRleCA9IGdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCW1vZGlmaWVkUmljaFRleHQgPSBudWxsOwotCQkJCQkJaWYgKGlzRGlydHkoKSkgewotCQkJCQkJCWFjdGlvbk1nci51bmRvQWxsKCk7Ci0JCQkJCQkJZGlydHkgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWlmIChlbGVtZW50T2JqLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQllbGVtZW50T2JqLmVBZGFwdGVycygpLnJlbW92ZShuYW1lQ2hhbmdlZExpc3RlbmVyKTsKLQkJCQkJCQlFT2JqZWN0IGUgPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZSgKLQkJCQkJCQkJCWVsZW1lbnRPYmopOwotCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCQkJJiYgIWUuZUlzUHJveHkoKQotCQkJCQkJCQkJJiYgVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KGUpID09IExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSB7Ci0JCQkJCQkJCXNldElucHV0KGNyZWF0ZUlucHV0KChNZXRob2RFbGVtZW50KSBlKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gaW5wdXQgZWxlbWVudCBpcyBpbnZhbGlkLCBjbG9zZSB0aGUgZWRpdG9yCi0JCQkJCQkJCS8vCi0JCQkJCQkJCWNsb3NlKGZhbHNlKTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXVwZGF0ZVRpbWVTdGFtcHModXNlZFJlc291cmNlcyk7Ci0JCQkJCQl1cGRhdGVQYWdlcygpOwotCQkJCQkJaWYgKGFjdGl2ZVBhZ2VJbmRleCAhPSAtMSkgewotCQkJCQkJCXNldEFjdGl2ZVBhZ2UoYWN0aXZlUGFnZUluZGV4KTsKLQkJCQkJCX0KLQkJCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIGVkaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCS8vIHNhdmUgY2hhbmdlZCByZXNvdXJjZXMgYmVmb3JlIHJlZnJlc2ggc28gYWN0aW9uIG1hbmFnZXIgd2lsbCBub3QgdHJ5Ci0JCS8vIHRvIHNhdmUgdGhlc2UgY2hhbmdlZCByZXNvdXJjZXMKLQkJLy8KLQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0JCXJlZnJlc2goZmFsc2UpOwotCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBQdWJsaWMgbWV0aG9kIHRvIHJlZnJlc2ggZWRpdG9yIHRpdGxlIGltYWdlIG9uIGNlcnRhaW4gYWN0aW9uLgotCSAqIGUuZy4gSWYgbWV0aG9kUGx1Z2luIGlzIGxvY2tlZCwgZWRpdG9yIHRpdGxlIGltYWdlIHNob3VsZCBiZSBncmV5LWVkIG91dC4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hUaXRsZUltYWdlKCkgewotCQlpZiAoZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyICE9IG51bGwpCi0JCQlmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIudXBkYXRlRWRpdG9ySW1hZ2UoZWxlbWVudE9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlZFRpdGxlSW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJc2V0VGl0bGVJbWFnZShpbWFnZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kRWxlbWVudEVkaXRvcklucHV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzUxOWU1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLklNZXRob2RFbGVtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLQotCi0vKioKLSAqIEFuIGVkaXRvciBpbnB1dCBmb3IgbWV0aG9kIGVsZW1lbnQgZWRpdG9yCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0LCBJTWV0aG9kRWxlbWVudFByb3ZpZGVyIHsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50OwotCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQotCXB1YmxpYyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCW1ldGhvZEVsZW1lbnQgPSBlOwotCX0KLQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2V4aXN0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50LmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRQZXJzaXN0YWJsZSgpCi0JICovCi0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGdldENsYXNzKCkuaXNJbnN0YW5jZShvYmopKSB7Ci0JCQlyZXR1cm4gbWV0aG9kRWxlbWVudCA9PSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgb2JqKQotCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZExpYnJhcnlFZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZExpYnJhcnlFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDk5NTAwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RMaWJyYXJ5RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZUlPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLS8qKgotICogVGhlIG1ldGhvZCBsaWJyYXJ5IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUVkaXRvciBleHRlbmRzIE1ldGhvZEVsZW1lbnRFZGl0b3IgewotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3Ijc2V0UGFydE5hbWUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnROYW1lKCkgewotCQlTdHJpbmcgcGFydE5hbWUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RWRpdG9yX3RpdGxlOyAvLyROT04tTkxTLTEkCi0JCWlmIChlbGVtZW50T2JqLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQlwYXJ0TmFtZSArPSBlbGVtZW50T2JqLmdldE5hbWUoKTsKLQkJCTsKLQkJfQotCQlzZXRQYXJ0TmFtZShwYXJ0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNhZGRQYWdlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQlhZGRQYWdlKG5ldyBNZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZSh0aGlzKSk7Ci0JCQljcmVhdGVQcmV2aWV3UGFnZSgpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBDbG9zZSBhbGwgdGhlIGVkaXRvcnMuCi0JCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKTsKLQotCQkvLyBDbGVhciB0aGUgTGlicmFyeSBWaWV3LgotCQlMaWJyYXJ5Vmlldy5nZXRWaWV3KCkuc2V0SW5wdXRGb3JWaWV3ZXIobnVsbCk7Ci0KLQkJdHJ5IHsKLQkJCS8vIENsb3NlIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yCi0JCQkJCS5iZWdpblRhc2soCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlbW9kZWxsaWJyYXJ5LCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0KLQkJCXRyeSB7Ci0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlTdHJpbmcgZXJyTXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBlcnJEZXRhaWxzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZXguZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQkJZXJyRGV0YWlscyA9IGV4LmdldE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoZXggaW5zdGFuY2VvZiBNdWx0aUZpbGVJT0V4Y2VwdGlvbikgewotCQkJCQlPYmplY3QgdHJvdWJsZU9iaiA9ICgoTXVsdGlGaWxlSU9FeGNlcHRpb24pIGV4KQotCQkJCQkJCS5nZXRUcm91YmxlT2JqZWN0KCk7Ci0JCQkJCWlmICh0cm91YmxlT2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJZXJyRGV0YWlscyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdCArIE11bHRpRmlsZVNhdmVVdGlsLmdldFBhdGgoKE1ldGhvZEVsZW1lbnQpIHRyb3VibGVPYmopOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RWRpdG9yX2Vycm9yX2RpYWxvZ190aXRsZTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBwcm9ibGVtID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c7IC8vJE5PTi1OTFMtMSQKLQkJCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgcHJvYmxlbSwgZXJyTXNnLCBlcnJEZXRhaWxzKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlyZXR1cm4gbWFuYWdlciAhPSBudWxsID8gbWFuYWdlci5pc01ldGhvZExpYnJhcnlNb2RpZmllZCgpIDogZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RSaWNoVGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTVhYzAwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RSaWNoVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5SaWNoVGV4dENvbnRlbnRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLk1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbC5IVE1MRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRGVjb3JhdGVkRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRmllbGREZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQSBNZXRob2QgRWRpdG9yIFJpY2ggVGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUmljaFRleHQgZXh0ZW5kcyBSaWNoVGV4dCBpbXBsZW1lbnRzIElNZXRob2RSaWNoVGV4dCB7Ci0KLQkvLyBUaGUgbWV0aG9kIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0JCi0JLy8gdGhlIE1ldGhvZEVsZW1lbnQncyBDb250ZW50RGVzY3JpcHRpb24KLQlwcml2YXRlIENvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb247Ci0KLQkvLyBUaGUgbW9kYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCXByaXZhdGUgRU9iamVjdCBtb2RhbE9iamVjdDsKLQotCS8vIFRoZSBtb2RhbCBvYmplY3QgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBtb2RhbE9iamVjdEZlYXR1cmU7Ci0KLQkvLyBUaGUgcmVzb3VyY2UgYmVpbmcgZWRpdGVkICAgICAgIAotCXByb3RlY3RlZCBSZXNvdXJjZSByZXNvdXJjZTsKLQkKLQkvLyB0aGUgZGVjb3JhdGVkRmllbGQgbGFiZWwKLQlwcm90ZWN0ZWQgRGVjb3JhdGVkRmllbGQgbGFiZWw7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEZpZWxkRGVjb3JhdGlvbiBlcnJvckZpZWxkRGVjb3JhdGlvbiA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRGaWVsZERlY29yYXRpb24oRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuREVDX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JLy8gRmllbGQgbmFtZSBiZWluZyBlZGl0ZWQKLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBGaWVsZCBuYW1lIGJlaW5nIGVkaXRlZCB3aXRoIHRoZSB0cmFpbGluZyA6IHJlbW92ZWQgICAgIAotCXByb3RlY3RlZCBTdHJpbmcgZmllbGROYW1lVHJpbTsKLQkKLQkvLyBtYXJrZXIgaGVscGVyCi0JcHJvdGVjdGVkIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyIG1hcmtlckhlbHBlcjsKLQotLy8JLy8gbWFya2VyIGF0dHJpYnV0ZQotLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1FVEhPRF9GSUVMRE5BTUUgPSAiTWV0aG9kRmllbGROYW1lIjsKLQotLy8JLy8gbWFya2VyIElECi0vLwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5tZXRob2RSaWNoVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWwgc3R5bGUgZm9yIHRoZSBlZGl0b3IuCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICBUaGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBocmVmcy4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUmljaFRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmcgYmFzZVBhdGgpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSwgYmFzZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHByZXNlbnRhdGlvbiBuYW1lcyBvZiBhbGwgZWxlbWVudCBsaW5rcy4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgUmljaCB0ZXh0IGVuY29kZWQgaW4gSFRNTCBmb3JtYXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyB0aWR5VGV4dChTdHJpbmcgdGV4dCkgewotCQkvKgotCQkgKiAgdGhpcyB3aWxsIGRvIHRoZSBmb2xsb3dpbmcgdG8gdGhlIEhUTUw6Ci0JCSAqICAxLiAgdXBkYXRlIEVsZW1lbnQgTGlua3MKLQkJICogIDIuICBjaGFuZ2UgPEEgLi4+IHRvIDxhIC4uPgotCQkgKiAgMy4gIGNoYW5nZSA8L0E+IHRvIDwvYT4KLQkJICogIDQuICBhZGQgZG91YmxlLXF1b3RlcyAoIikgYXJvdW5kIGFsbCBhdHRyaWJ1dGUgdmFsdWVzIGlmIHRoZXkgYXJlIG1pc3NpbmcKLQkJICovCi0JCQotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIudmFsaWRhdGVSaWNoVGV4dENvbnRlbnQobWV0aG9kRWxlbWVudCwgdGV4dCwKLQkJCQluZXcgUmljaFRleHRDb250ZW50VmFsaWRhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kRWxlbWVudChNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJdGhpcy5tZXRob2RFbGVtZW50ID0gbWV0aG9kRWxlbWVudDsKLQkJaWYgKHRoaXMubWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXRoaXMubWV0aG9kRWxlbWVudCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgdGhpcy5tZXRob2RFbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCX0KLQkJaWYgKHRoaXMubWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgeyAKLQkJCXRoaXMuY29udGVudERlc2NyaXB0aW9uID0gKChEZXNjcmliYWJsZUVsZW1lbnQpdGhpcy5tZXRob2RFbGVtZW50KS5nZXRQcmVzZW50YXRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RhbE9iamVjdCgpIHsKLQkJcmV0dXJuIG1vZGFsT2JqZWN0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RhbE9iamVjdChFT2JqZWN0IG1vZGFsT2JqZWN0KSB7Ci0JCXRoaXMubW9kYWxPYmplY3QgPSBtb2RhbE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCkgewotCQlyZXR1cm4gbW9kYWxPYmplY3RGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgbW9kYWxPYmplY3RGZWF0dXJlKSB7Ci0JCXRoaXMubW9kYWxPYmplY3RGZWF0dXJlID0gbW9kYWxPYmplY3RGZWF0dXJlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgewotCQlyZXR1cm4gZmllbGROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlY29yYXRlZEZpZWxkTGFiZWwoRGVjb3JhdGVkRmllbGQgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJbGFiZWwuYWRkRmllbGREZWNvcmF0aW9uKGVycm9yRmllbGREZWNvcmF0aW9uLAotCQkJCQlTV1QuTEVGVCB8IFNXVC5CT1RUT00sIGZhbHNlKTsKLQkJCWxhYmVsLmhpZGVEZWNvcmF0aW9uKGVycm9yRmllbGREZWNvcmF0aW9uKTsKLQkJCXVwZGF0ZUZpZWxkTmFtZUZyb21MYWJlbChsYWJlbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlRmllbGROYW1lRnJvbUxhYmVsKERlY29yYXRlZEZpZWxkIGxhYmVsKSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSAoKExhYmVsKWxhYmVsLmdldENvbnRyb2woKSkuZ2V0VGV4dCgpOwotCQlpZiAoIXRoaXMuZmllbGROYW1lLmVxdWFscyhmaWVsZE5hbWUpKSB7Ci0JCQl0aGlzLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKLQkJCWludCBjb2xvbkluZGV4ID0gZmllbGROYW1lLmluZGV4T2YoJzonKTsKLQkJCWlmIChjb2xvbkluZGV4ID09IC0xKQotCQkJCWNvbG9uSW5kZXggPSBmaWVsZE5hbWUubGVuZ3RoKCk7Ci0JCQl0aGlzLmZpZWxkTmFtZVRyaW0gPSBmaWVsZE5hbWUuc3Vic3RyaW5nKDAsIGNvbG9uSW5kZXgpLnRyaW0oKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBEZWNvcmF0ZWRGaWVsZCBsYWJlbCkgewotCQlzZXRNZXRob2RFbGVtZW50KGVsZW1lbnQpOwotCQlzZXREZWNvcmF0ZWRGaWVsZExhYmVsKGxhYmVsKTsKLQkJbWFya2VySGVscGVyID0gTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXIuSU5TVEFOQ0U7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZm9ybWF0SFRNTChTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgZm9ybWF0dGVkVGV4dDsKLQkJdHJ5IHsKLQkJCS8vIGNsZWFyIG1hcmtlcnMKLQkJCWNsZWFyTWFya2VycygpOwotCQkJLy8gQ2FsbCBKVGlkeSB0byBmb3JtYXQgdGhlIHNvdXJjZSB0byBYSFRNTC4KLQkJCWZvcm1hdHRlZFRleHQgPSBodG1sRm9ybWF0dGVyLmZvcm1hdEhUTUwodGV4dCk7Ci0JCQlpZiAoaHRtbEZvcm1hdHRlci5nZXRMYXN0RXJyb3JTdHIoKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGVycm9yU3RyaW5nID0gaHRtbEZvcm1hdHRlci5nZXRMYXN0RXJyb3JTdHIoKTsKLQkJCQkvLyBjcmVhdGUgbWFya2VycwotCQkJCXRyeSB7Ci0JCQkJCWNyZWF0ZU1hcmtlcihlcnJvclN0cmluZyk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZXgpIHsKLQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKGNleCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZvcm1hdHRlZFRleHQ7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQl9IGZpbmFsbHkgewotCQkJcmVmcmVzaERlY29yYXRvcnMoKTsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJNYXJrZXJzKCkgewotCQltYXJrZXJIZWxwZXIuZGVsZXRlTWFya2Vycyhjb250ZW50RGVzY3JpcHRpb24sIGZpZWxkTmFtZVRyaW0pOwotICAgICAgICBlcnJvckZpZWxkRGVjb3JhdGlvbi5zZXREZXNjcmlwdGlvbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJaGlkZUVycm9yRGVjb3JhdGlvbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRGVjb3JhdG9ycygpIHsKLQkJLy8gcmVmcmVzaAotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS51cGRhdGUoTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IuREVDT1JBVE9SX0lEKTsKLQl9Ci0JCi0JCi0JLyoKLQkgKiBUT0RPOgotCSAqIGhhZCB0byB1bmRvIGNoYW5nZSBpbiBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIHRvIHNldCBwcmVzZW50YXRpb24gb24gYW55IG5ldyBvYmoKLQkgKiBzbyBlZGl0b3Igd2lsbCBuZWVkIHRvIGFzc2lnbiBwcmVzZW50YXRpb24gd2hlbiBmaWVsZCBpcyBlZGl0ZWQgc28gdGhhdCB0aGUgbWFya2VyCi0JICogY2FuIGJlIGFkZGVkIHRvIHRoZSBwcmVzZW50YXRpb24ncyByZXNvdXJjZQotCSAqLwotCQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1hcmtlcihTdHJpbmcgZnVsbEVyck1zZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoY29udGVudERlc2NyaXB0aW9uLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJTWF0Y2hlciBtID0gSFRNTEZvcm1hdHRlci5qVGlkeUVycm9yUGFyc2VyLm1hdGNoZXIoZnVsbEVyck1zZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCWlmIChtLmZpbmQoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJU3RyaW5nIGxvY2F0aW9uID0gbS5ncm91cCgxKTsKLQkJCQlTdHJpbmcgZXJyb3JNc2cgPSBtLmdyb3VwKDQpOwotCQkJCUJhc2ljRGlhZ25vc3RpYyBkaWFnbm9zdGljcyA9IAotCQkJICAgICAgICAgIG5ldyBCYXNpY0RpYWdub3N0aWMKLQkJCSAgICAgICAgICAgIChIVE1MRm9ybWF0dGVyLkRJQUdOT1NUSUNfU09VUkNFLAotCQkJICAgICAgICAgICAgIDAsIGZpZWxkTmFtZSwKLQkJCSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBjb250ZW50RGVzY3JpcHRpb24sIGZpZWxkTmFtZVRyaW0gfSk7Ci0JCi0JCQkJZGlhZ25vc3RpY3MuYWRkKCAKLQkJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYyhEaWFnbm9zdGljLkVSUk9SLAotCQkJCQkJbG9jYXRpb24sIDAsIGVycm9yTXNnLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgY29udGVudERlc2NyaXB0aW9uLCBmaWVsZE5hbWVUcmltIH0pKTsKLQkKLQkJICAgICAgICBtYXJrZXJIZWxwZXIuY3JlYXRlTWFya2VycyhkaWFnbm9zdGljcyk7Ci0JCSAgICAgICAgZXJyb3JGaWVsZERlY29yYXRpb24uc2V0RGVzY3JpcHRpb24oZXJyb3JNc2cpOwotCQkgICAgICAgIHNob3dFcnJvckRlY29yYXRpb24oKTsKLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJY2xlYXJNYXJrZXJzKCk7Ci0JCXJlZnJlc2hEZWNvcmF0b3JzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNob3dFcnJvckRlY29yYXRpb24oKSB7Ci0gICAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7Ci0gICAgICAgIAlsYWJlbC5zaG93RGVjb3JhdGlvbihlcnJvckZpZWxkRGVjb3JhdGlvbik7Ci0gICAgICAgIH0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBoaWRlRXJyb3JEZWNvcmF0aW9uKCkgewotICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCkgewotICAgICAgICAJbGFiZWwuaGlkZURlY29yYXRpb24oZXJyb3JGaWVsZERlY29yYXRpb24pOwotICAgICAgICB9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJLy8gY2hlY2sgaWYgbGFiZWwgdGV4dCB3YXMgY2hhbmdlZCAodGhpcyBoYXBwZW5zIHdoZW4gUlRFIGlzIGV4cGFuZGVkKQotCQkvLyB0aGlzIGlzIGNhbGxlZCB3aGVuIFJURSBpcyB0b2dnbGVkIGluIGVkaXRvciAtIHJlYWQgbmV3IGZpZWxkTmFtZQotCQlpZiAodXBkYXRlRmllbGROYW1lRnJvbUxhYmVsKGxhYmVsKSkKLQkJCWhpZGVFcnJvckRlY29yYXRpb24oKTsKLQkJc3VwZXIuc2V0VGV4dCh0ZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RSaWNoVGV4dEVkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWM4MjE1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RSaWNoVGV4dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZEFkZEltYWdlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RBZGRMaW5rQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dFRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQWRkT3JkZXJlZExpc3RBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQWRkVGFibGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQWRkVW5vcmRlcmVkTGlzdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5Cb2xkQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkNsZWFyQ29udGVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkN1dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5GaW5kUmVwbGFjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5Gb250TmFtZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5Gb250U2l6ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5Gb250U3R5bGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuSW5kZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkl0YWxpY0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5PdXRkZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlBhc3RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlN1YnNjcmlwdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5TdXBlcnNjcmlwdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5UaWR5QWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuVW5kZXJsaW5lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5EZWNvcmF0ZWRGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci0KLS8qKgotICogQSBSaWNoIFRleHQgZWRpdG9yIHdpdGggYWRkZWQgZXh0ZW5zaW9ucyB0byBzdXBwb3J0IE1ldGhvZCBicm93c2luZyBhbmQKLSAqIGF1dGhvcmluZy4gSW5jbHVkZXMgYSB0b29sIGJhciBhbmQgYW4gaW50ZWdyYXRlZCBIVE1MIHNvdXJjZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RSaWNoVGV4dEVkaXRvciBleHRlbmRzIFJpY2hUZXh0RWRpdG9yIGltcGxlbWVudHMKLQkJSU1ldGhvZFJpY2hUZXh0RWRpdG9yIHsKLQotCS8vIFRoZSBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLQotCS8vIFRoZSBtb2RhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBFT2JqZWN0IG1vZGFsT2JqZWN0OwotCi0JLy8gVGhlIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIG1vZGFsT2JqZWN0RmVhdHVyZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWwgc3R5bGUgZm9yIHRoZSBlZGl0b3IuCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICBUaGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBocmVmcy4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUmljaFRleHRFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmcgYmFzZVBhdGgsCi0JCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQsIERlY29yYXRlZEZpZWxkIGxhYmVsLCBJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUsIGVkaXRvclNpdGUsIGJhc2VQYXRoKTsKLQkJdGhpcy5tZXRob2RFbGVtZW50ID0gbWV0aG9kRWxlbWVudDsKLQkJaW5pdChtZXRob2RFbGVtZW50LCBsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdW5kZXJseWluZyByaWNoIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBzdHlsZSBmb3IgdGhpcyBjb250cm9sLgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzLgotCSAqLwotCXByb3RlY3RlZCBJUmljaFRleHQgY3JlYXRlUmljaFRleHRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwKLQkJCVN0cmluZyBiYXNlUGF0aCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZFJpY2hUZXh0KHBhcmVudCwgc3R5bGUsIGJhc2VQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgUmljaCBUZXh0IGVkaXRvciB0b29sIGJhciB3aXRoIGFjdGlvbiBpdGVtcy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbEJhcgotCSAqICAgICAgICAgICAgVGhlIFJpY2ggdGV4dCBlZGl0b3IgdG9vbCBiYXIuCi0JICovCi0JcHVibGljIHZvaWQgZmlsbFRvb2xCYXIoSVJpY2hUZXh0VG9vbEJhciB0b29sQmFyKSB7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBGb250U3R5bGVBY3Rpb24ocmljaFRleHQpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEZvbnROYW1lQWN0aW9uKHJpY2hUZXh0KSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBGb250U2l6ZUFjdGlvbihyaWNoVGV4dCkpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwkJCi0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBDdXRBY3Rpb24ocmljaFRleHQpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IENvcHlBY3Rpb24ocmljaFRleHQpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IFBhc3RlQWN0aW9uKHJpY2hUZXh0KSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBDbGVhckNvbnRlbnRBY3Rpb24ocmljaFRleHQpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEJvbGRBY3Rpb24ocmljaFRleHQpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEl0YWxpY0FjdGlvbihyaWNoVGV4dCkpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgVW5kZXJsaW5lQWN0aW9uKHJpY2hUZXh0KSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBTdWJzY3JpcHRBY3Rpb24ocmljaFRleHQpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IFN1cGVyc2NyaXB0QWN0aW9uKHJpY2hUZXh0KSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBUaWR5QWN0aW9uR3JvdXAodGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQWRkT3JkZXJlZExpc3RBY3Rpb24ocmljaFRleHQpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEFkZFVub3JkZXJlZExpc3RBY3Rpb24ocmljaFRleHQpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IE91dGRlbnRBY3Rpb24ocmljaFRleHQpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEluZGVudEFjdGlvbihyaWNoVGV4dCkpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRmluZFJlcGxhY2VBY3Rpb24ocmljaFRleHQpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJCQlyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLmV4ZWN1dGUocmljaFRleHQpOwotCQkJfQotCQl9KTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IE1ldGhvZEFkZExpbmtBY3Rpb24ocmljaFRleHQpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IE1ldGhvZEFkZEltYWdlQWN0aW9uKHJpY2hUZXh0KSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBBZGRUYWJsZUFjdGlvbihyaWNoVGV4dCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RhbE9iamVjdCgpIHsKLQkJcmV0dXJuIG1vZGFsT2JqZWN0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RhbE9iamVjdChFT2JqZWN0IG1vZGFsT2JqZWN0KSB7Ci0JCXRoaXMubW9kYWxPYmplY3QgPSBtb2RhbE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCkgewotCQlyZXR1cm4gbW9kYWxPYmplY3RGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgbW9kYWxPYmplY3RGZWF0dXJlKSB7Ci0JCXRoaXMubW9kYWxPYmplY3RGZWF0dXJlID0gbW9kYWxPYmplY3RGZWF0dXJlOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBEZWNvcmF0ZWRGaWVsZCBsYWJlbCkgewotCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBJTWV0aG9kUmljaFRleHQpCi0JCQkoKElNZXRob2RSaWNoVGV4dClyaWNoVGV4dCkuaW5pdChtZXRob2RFbGVtZW50LCBsYWJlbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJldmlld1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1ByZXZpZXdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxZjIzNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJldmlld1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5FbGVtZW50SFRNTFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFRoZSBQcmV2aWV3IHBhZ2UgaW4gdGhlIE1ldGhvZCBFZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByZXZpZXdQYWdlIHsKLQotCXByaXZhdGUgRWxlbWVudEhUTUxWaWV3ZXIgcHJldmlld2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgUHJldmlld1BhZ2UoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBVc2UgdGhlIFZpZXdGb3JtIGNvbnRyb2wgdG8gZ2l2ZSBpdCB0aGUgRWNsaXBzZSBXb3JrYmVuY2ggd2luZG93Ci0JCS8vIGxvb2sgJiBmZWVsLgotCQlWaWV3Rm9ybSB2aWV3Rm9ybSA9IG5ldyBWaWV3Rm9ybShjb21wb3NpdGUsIFNXVC5ERUZBVUxUKTsKLQkJdmlld0Zvcm0ubWFyZ2luSGVpZ2h0ID0gMDsKLQkJdmlld0Zvcm0ubWFyZ2luV2lkdGggPSAwOwotCQl2aWV3Rm9ybS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXZpZXdGb3JtLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIFNldCB0b29sYmFyCi0JCUNvbnRyb2wgdG9vbGJhciA9IGNyZWF0ZVRvb2xiYXIodmlld0Zvcm0pOwotCQl2aWV3Rm9ybS5zZXRUb3BSaWdodCh0b29sYmFyKTsKLQotCQkvLyBTZXQgY29udGVudAotCQlDb250cm9sIGNvbnRlbnQgPSBjcmVhdGVDb250ZW50KHZpZXdGb3JtKTsKLQkJdmlld0Zvcm0uc2V0Q29udGVudChjb250ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgcHJldmlldyBjb250ZW50Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2wgY3JlYXRlQ29udGVudChWaWV3Rm9ybSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJY29udGVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29udGVudC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlwcmV2aWV3ZXIgPSBuZXcgRWxlbWVudEhUTUxWaWV3ZXIoY29udGVudCk7Ci0JCXJldHVybiAoQ29udHJvbCkgY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gRWxlbWVudFZpZXdlcgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCQlWaWV3ZXIKLQkgKi8KLQlwdWJsaWMgRWxlbWVudEhUTUxWaWV3ZXIgZ2V0UHJldmlld1ZpZXdlcigpIHsKLQkJcmV0dXJuIHByZXZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgVG9vbGJhciBJdCBoYXMgR28gYmFjaywgR28gZm9yd2FyZCwgU3RvcCBhbmQgcmVmcmVzaCBidXR0b25zCi0JICogCi0JICogQHBhcmFtIFZpZXdGb3JtCi0JICogICAgICAgICAgICBwYXJlbnQKLQkgKiBAcmV0dXJuIFRvb2xiYXIKLQkgKi8KLQlwcml2YXRlIFRvb2xCYXIgY3JlYXRlVG9vbGJhcihWaWV3Rm9ybSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBicm93c2VyIG5hdmlnYXRpb24gdG9vbGJhci4KLQkJVG9vbEJhciB0b29sYmFyID0gbmV3IFRvb2xCYXIocGFyZW50LCBTV1QuRkxBVCk7Ci0KLQkJLy8gQWRkIHRoZSBCYWNrIGJ1dHRvbi4KLQkJVG9vbEl0ZW0gYmFja0J1dHRvbiA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuTk9ORSk7Ci0JCWJhY2tCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0JBQ0spOwotCQliYWNrQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJhY2tCdXR0b25fdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJYmFja0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gcHJldmlld2VyLmdldEJyb3dzZXIoKTsKLQkJCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWJyb3dzZXIuYmFjaygpOwotCQkJCX0KLQkJCX07Ci0JCX0pOwotCi0JCS8vIEFkZCB0aGUgRm93YXJkIGJ1dHRvbi4KLQkJVG9vbEl0ZW0gZm9yd2FyZEJ1dHRvbiA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuTk9ORSk7Ci0JCWZvcndhcmRCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0ZPUldBUkQpOwotCQlmb3J3YXJkQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcndhcmRCdXR0b25fdGV4dCk7IC8vJE5PTi1OTFMtMSQJCi0JCWZvcndhcmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IHByZXZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlicm93c2VyLmZvcndhcmQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9KTsKLQotCQkvLyBBZGQgdGhlIFN0b3AgYnV0dG9uLgotCQlUb29sSXRlbSBzdG9wQnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5OT05FKTsKLQkJc3RvcEJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfU1RPUCk7Ci0JCXN0b3BCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RvcEJ1dHRvbl90ZXh0KTsgLy8kTk9OLU5MUy0xJAkKLQkJc3RvcEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gcHJldmlld2VyLmdldEJyb3dzZXIoKTsKLQkJCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWJyb3dzZXIuc3RvcCgpOwotCQkJCX0KLQkJCX07Ci0JCX0pOwotCi0JCS8vIEFkZCB0aGUgUmVmcmVzaCBidXR0b24uCi0JCVRvb2xJdGVtIHJlZnJlc2hCdXR0b24gPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULk5PTkUpOwotCQlyZWZyZXNoQnV0dG9uLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19SRUZSRVNIKTsKLQkJcmVmcmVzaEJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5yZWZyZXNoQnV0dG9uX3RleHQpOyAvLyROT04tTkxTLTEkCQotCQlyZWZyZXNoQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvLyBCcm93c2VyIGJyb3dzZXIgPSBwcmV2aWV3ZXIuZ2V0QnJvd3NlcigpOwotCQkJCS8vIGlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkvLyBicm93c2VyLnJlZnJlc2goKTsKLQkJCQkvLyB9Ci0KLQkJCQlwcmV2aWV3ZXIucmVmcmVzaCgpOwotCQkJfTsKLQkJfSk7Ci0KLQkJLy8gQWRkIHRoZSBQcmludCBidXR0b24uCi0JCVRvb2xJdGVtIHByaW50QnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5OT05FKTsKLQkJcHJpbnRCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX1BSSU5UKTsKLQkJcHJpbnRCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJpbnRCdXR0b25fdGV4dCk7IC8vJE5PTi1OTFMtMSQJCi0JCXByaW50QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlwcmV2aWV3ZXIucHJpbnQoKTsKLQkJCX07Ci0JCX0pOwotCi0JCXJldHVybiB0b29sYmFyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNTAzY2FlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuU2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JV29ya2JlbmNoUGFydEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZhbGlkYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlN5bmNocm9uaXphdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuRGlhbG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQuRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5JRXh0ZW5zaW9uRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkVQRlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlByb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRVBGRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Db21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWN0aXZpdHlEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Db250cmlidXRlVG9BY3Rpdml0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTG9jYWxseVJlcGxhY2VBbmREZWVwQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUmVwbGFjZUFjdGl2aXR5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbi5TdXBwcmVzc2lvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuUHJvY2Vzc0RlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5MaWJyYXJ5RVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuSUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBFZGl0b3IgZm9yIHByb2Nlc3MgYXV0aG9yaW5nLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWRpdG9yIGV4dGVuZHMgTWV0aG9kRWxlbWVudEVkaXRvciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluUHJvdmlkZXIsIElNZW51TGlzdGVuZXIsIElTZWxlY3Rpb25Qcm92aWRlciwKLQkJSVZpZXdlclByb3ZpZGVyLCBJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciB7Ci0KLQkvKioKLQkgKiBUaGUgZWRpdG9yIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9JRCA9IFByb2Nlc3NFZGl0b3IuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0ZMT1dfRURJVE9SX0lEID0gR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9FRElUT1JfSUQgPSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUERFUEVOREVOQ1lfRURJVE9SX0lEID0gR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JLyoqIENvbHVtbiBkZXNjcmlwdG9yIGNvbnN0YW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19OQU1FID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsIFByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSksCi0JCQkzLCAyMDAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JRCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwgUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCksCi0JCQkwLCA0MCwgdHJ1ZSwgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX05PTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX1BSRUZJWCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCksIDAsIDgwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX01PREVMX0lORk8gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTywKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTyksIDAsIDEyMCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9OT05FKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfVFlQRSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLCBQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUpLAotCQkJMCwgODAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9OT05FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19QUkVERUNFU1NPUlMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMpLCAyLCAxMDAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCk7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0lTX1JFUEVBVEFCTEUgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSksIDEsIDYwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU4pOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JU19PTkdPSU5HID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcpLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JU19FVkVOVF9EUklWRU4gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfVEVBTSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUywgUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUyksCi0JCQkxLCAxMDAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19FTlRSWV9TVEFURSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUpLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfRVhJVF9TVEFURSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFKSwgMSwgNjAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCk7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSksIDMsIDIwMCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfREVMSVZFUkFCTEUgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFKSwgMSwgMTAwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQpOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JU19PUFRJT05BTCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PUFRJT05BTCwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwpLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSVNfUExBTk5FRCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVELAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVEKSwgMSwgNjAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTKSwgMSwgNjAsCi0JCQl0cnVlLCBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTik7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0JTX0ZPUk1fSUQgPSAid2JzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFfRk9STV9JRCA9ICJ0YnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUEJTX0ZPUk1fSUQgPSAid3BicyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNPTElEQVRFRF9GT1JNX0lEID0gImNvbnNvbGlkYXRlZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGNoYW5nZSB0aGUgZGVmYXVsdCBvcmRlciBiYXNlZCBvbiAxNTI4NjcgLSBQdWJsaXNoIG9wdGlvbiBhbmQgcHJlZnJlbmNlcwotCS8qIFdCUzogUHJlc2VudGF0aW9uIE5hbWUsIEluZGV4LCBQcmVkZWNlc3NvcnMsIE1vZGVsIEluZm8sIFR5cGUsIFBsYW5uZWQsCi0JCQlSZXBlYXRhYmxlLCBNdWx0aXBsZSBPY2N1cnJlbmNlcywgT25nb2luZywgRXZlbnQtZHJpdmVuLCBPcHRpb25hbAotCQlUQTogUHJlc2VudGF0aW9uIE5hbWUsIE1vZGVsIEluZm8sIFRlYW0sIFR5cGUsIFBsYW5uZWQsIE11bHRpcGxlCi0JCQlPY2N1cnJlbmNlcywgT3B0aW9uYWwKLQkJV29yayBQcm9kdWN0IFVzYWdlOiBQcmVzZW50YXRpb24gTmFtZSwgTW9kZWwgSW5mbywgRW50cnkgU3RhdGUsIEV4aXQgU3RhdGUsIAotCQkJRGVsaXZlcmFibGUsIFR5cGUsIFBsYW5uZWQsIE11bHRpcGxlIE9jY3VycmVuY2VzLCBPcHRpb25hbAotCSovCi0JLy8gSmluaHVhIFhpLCAwOC8yMS8yMDA2Ci0JCi0JLy8gdGhlIGRlZmF1bHQgbGlzdCBtdXN0IGJlIGF2YWlsYWJsZSBpbiB0aGUgbGlicmFyeSBwbHVnaW4gYXMgd2VsbC4KLQkvLyBkdXBsaWNhdGUgZGVmaW5pdGlvbiBmb3Igbm93LCB3aWxsIG5lZWQgdG8gbWVyZ2UgdG9nZXRoZXIgbGF0ZXIKLQkvLyBzZWUgUHJlZmVyZW5jZUNvbnN0YW50cy5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBERUZBVUxUX1RCU19DT0xVTU5TID0gQXJyYXlzCi0JCQkuYXNMaXN0KG5ldyBDb2x1bW5EZXNjcmlwdG9yW10gewotCQkJCQlDT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJLy8gQ09MX0RFU0NfSUQsCi0JCQkJCS8vQ09MX0RFU0NfUFJFRklYLCAKLQkJCQkJQ09MX0RFU0NfTU9ERUxfSU5GTywgQ09MX0RFU0NfVEVBTSwgQ09MX0RFU0NfVFlQRSwKLQkJCQkJQ09MX0RFU0NfSVNfUExBTk5FRCwKLQkJCQkJQ09MX0RFU0NfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLCBDT0xfREVTQ19JU19PUFRJT05BTCB9KTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBERUZBVUxUX1dQQlNfQ09MVU1OUyA9IEFycmF5cwotCQkJLmFzTGlzdChuZXcgQ29sdW1uRGVzY3JpcHRvcltdIHsKLQkJCQkJQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUsCi0JCQkJCS8vIENPTF9ERVNDX0lELAotCQkJCQkvL0NPTF9ERVNDX1BSRUZJWCwgCi0JCQkJCUNPTF9ERVNDX01PREVMX0lORk8sIENPTF9ERVNDX0VOVFJZX1NUQVRFLAotCQkJCQlDT0xfREVTQ19FWElUX1NUQVRFLCAKLQkJCQkJQ09MX0RFU0NfREVMSVZFUkFCTEUsIENPTF9ERVNDX1RZUEUsIAotCQkJCQlDT0xfREVTQ19JU19QTEFOTkVELCBDT0xfREVTQ19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsIENPTF9ERVNDX0lTX09QVElPTkFMIH0pOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IERFRkFVTFRfV0JTX0NPTFVNTlMgPSBBcnJheXMKLQkJCS5hc0xpc3QobmV3IENvbHVtbkRlc2NyaXB0b3JbXSB7IENPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJCQlDT0xfREVTQ19JRCwgCi0JCQkJCS8vQ09MX0RFU0NfUFJFRklYLCAKLQkJCQkJQ09MX0RFU0NfUFJFREVDRVNTT1JTLCBDT0xfREVTQ19NT0RFTF9JTkZPLAotCQkJCQlDT0xfREVTQ19UWVBFLCBDT0xfREVTQ19JU19QTEFOTkVELCAKLQkJCQkJQ09MX0RFU0NfSVNfUkVQRUFUQUJMRSwgQ09MX0RFU0NfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLCBDT0xfREVTQ19JU19PTkdPSU5HLAotCQkJCQlDT0xfREVTQ19JU19FVkVOVF9EUklWRU4sIENPTF9ERVNDX0lTX09QVElPTkFMCi0JCQkJCSB9KTsKLQotCSAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgQUxMX1dCU19DT0xVTU5TID0gbmV3IEFycmF5TGlzdCgKLQkJCURFRkFVTFRfV0JTX0NPTFVNTlMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IEFMTF9UQlNfQ09MVU1OUyA9IG5ldyBBcnJheUxpc3QoCi0JCQlERUZBVUxUX1RCU19DT0xVTU5TKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBBTExfV1BCU19DT0xVTU5TID0gbmV3IEFycmF5TGlzdCgKLQkJCURFRkFVTFRfV1BCU19DT0xVTU5TKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwIGlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlzdGF0aWMgewotCQlBTExfV0JTX0NPTFVNTlMuYWRkKENPTF9ERVNDX1BSRUZJWCk7Ci0JCUFMTF9UQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfUFJFRklYKTsKLQkJQUxMX1dQQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfUFJFRklYKTsKLQkJCi0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX05BTUUuaWQsCi0JCQkJQ09MX0RFU0NfTkFNRSk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0lELmlkLCBDT0xfREVTQ19JRCk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX1BSRUZJWC5pZCwKLQkJCQlDT0xfREVTQ19QUkVGSVgpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19NT0RFTF9JTkZPLmlkLAotCQkJCUNPTF9ERVNDX01PREVMX0lORk8pOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19UWVBFLmlkLAotCQkJCUNPTF9ERVNDX1RZUEUpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19QUkVERUNFU1NPUlMuaWQsCi0JCQkJQ09MX0RFU0NfUFJFREVDRVNTT1JTKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfSVNfUkVQRUFUQUJMRS5pZCwKLQkJCQlDT0xfREVTQ19JU19SRVBFQVRBQkxFKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfSVNfT05HT0lORy5pZCwKLQkJCQlDT0xfREVTQ19JU19PTkdPSU5HKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfSVNfRVZFTlRfRFJJVkVOLmlkLAotCQkJCUNPTF9ERVNDX0lTX0VWRU5UX0RSSVZFTik7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX1RFQU0uaWQsCi0JCQkJQ09MX0RFU0NfVEVBTSk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0VOVFJZX1NUQVRFLmlkLAotCQkJCUNPTF9ERVNDX0VOVFJZX1NUQVRFKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfRVhJVF9TVEFURS5pZCwKLQkJCQlDT0xfREVTQ19FWElUX1NUQVRFKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoCi0JCQkJQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUuaWQsIENPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfREVMSVZFUkFCTEUuaWQsCi0JCQkJQ09MX0RFU0NfREVMSVZFUkFCTEUpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19JU19PUFRJT05BTC5pZCwKLQkJCQlDT0xfREVTQ19JU19PUFRJT05BTCk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0lTX1BMQU5ORUQuaWQsCi0JCQkJQ09MX0RFU0NfSVNfUExBTk5FRCk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KAotCQkJCUNPTF9ERVNDX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUy5pZCwKLQkJCQlDT0xfREVTQ19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMpOwotCi0JCUFMTF9XQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfTkFNRSk7Ci0JCUFMTF9UQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfTkFNRSk7Ci0JCUFMTF9XUEJTX0NPTFVNTlMuYWRkKENPTF9ERVNDX05BTUUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWRkQWRhcHRlckZhY3RvcnlMaXN0ZW5lcnMgPSBmYWxzZTsKLQotCS8qKgotCSAqIEFjdGlvbiBiYXIgY29udHJpYnR1dG9yIGZvciBwcm9jZXNzIGVkaXRvcgotCSAqIAotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBCU0FjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMKLQkJCU1ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciB7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbiByZWdpc3RlcmVkQWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwcml2YXRlIGJvb2xlYW4gbG9ja2VkOwotCi0JCXByaXZhdGUgSUFjdGlvbiByb2xsdXBBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxVcCkgeyAKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWJvb2xlYW4gd2FzUm9sbGVkVXAgPSBic0l0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCk7Ci0JCQkJYnNJdGVtUHJvdmlkZXIuc2V0Um9sbGVkVXAoIWJzSXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKSk7Ci0JCQkJKChJQ2hhbmdlTm90aWZpZXIpIGJzSXRlbVByb3ZpZGVyKQotCQkJCQkJLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJCQkJCQkoSW50ZXJuYWxFT2JqZWN0KSBzZWxlY3RlZEFjdGl2aXR5LAotCQkJCQkJCQkJCU5vdGlmaWNhdGlvbi5BREQsIG51bGwsIG51bGwsIG51bGwsCi0JCQkJCQkJCQkJZmFsc2UpLCBzZWxlY3RlZEFjdGl2aXR5LCB0cnVlLCBmYWxzZSkpOwotCQkJCQotCQkJCWlmIChic0l0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCS8vIFJlZnJlc2hpbmcgZm9yIGdyZWVuIGFjdGl2aXRpZXMgZHVyaW5nIHJvbGx1cAotCQkJCQlEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciBwcm92aWRlciA9IChEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgYnNJdGVtUHJvdmlkZXI7Ci0JCQkJCXByb3ZpZGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQluZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uU0VULCBwcm92aWRlciwKLQkJCQkJCQkJcHJvdmlkZXIpLCBwcm92aWRlciwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQl9Ci0JCQkJaWYgKHdhc1JvbGxlZFVwKSB7Ci0JCQkJCVByb2Nlc3NWaWV3ZXIgdmlld2VyID0gKFByb2Nlc3NWaWV3ZXIpICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5jdXJyZW50Vmlld2VyOwotCQkJCQl2aWV3ZXIuZXhwYW5kVG9MZXZlbChzZWxlY3RlZEFjdGl2aXR5LAotCQkJCQkJCUFic3RyYWN0VHJlZVZpZXdlci5BTExfTEVWRUxTKTsKLQotCQkJCQkvLyBldmVudGhvdWdoIHdlIHN3aXRjaGVkIG9mZiBjcmVhdGluZyBuZXcgYWN0aXZpdGllcyBpbgotCQkJCQkvLyBXQlMsCi0JCQkJCS8vIHVzZXIgY2FuIHN0aWxsIGNyZWF0ZSB0aHJ1IEFELiBIZW5jZSB3ZSBuZWVkIHRvIHVwZGF0ZQotCQkJCQkvLyBJRHMKLQkJCQkJLy8gYWZ0ZXJ3YXJkcwotCQkJCQlkb1JlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gbW92ZVVwQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXAsCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL2V0b29sMTYvbW92ZV91cC5naWYiKSkgeyAvLyROT04tTkxTLTEkICAgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7CQotCQkJCWJzSXRlbVByb3ZpZGVyLm1vdmVVcChzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQsCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkpOwotCQkJCXJlZnJlc2hNb3ZlQnV0dG9uQWN0aW9ucygpOwotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiBtb3ZlRG93bkFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZURvd24sCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL2V0b29sMTYvbW92ZV9kb3duLmdpZiIpKSB7IC8vJE5PTi1OTFMtMSQgICAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlic0l0ZW1Qcm92aWRlci5tb3ZlRG93bihzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQsCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkpOwotCQkJCXJlZnJlc2hNb3ZlQnV0dG9uQWN0aW9ucygpOwotCQkJfQotCQl9OwotCQkKLQkJcHJpdmF0ZSBJQWN0aW9uIHByZWZlcmVuY2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1ByZWZlcmVuY2VzKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gb3BlbiBwcm9jZXNzIHByZWZlcmVuY2UgcGFnZQotCQkJCW9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsCi0JCQkJCQkuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKAotCQkJCQkJCQlnZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlIiwgICAvLyROT04tTkxTLTEkCi0JCQkJCQkJCW51bGwsIG51bGwpLm9wZW4oKTsKLQkJCX0KLQkJfTsKLQkJCi0KLQkJcHJpdmF0ZSBJQWN0aW9uIG9wZW5CYXNlQWN0aXZpdHkgPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5CYXNlQWN0aXZpdHkpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBzZWxlY3RlZEFjdGl2aXR5Ci0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwKLQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBiYXNlKTsKLQkJCQl0cnkgewotCQkJCQlpbnQgaWQgPSAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGJhc2UpOwotCi0JCQkJCS8vIFByb2Nlc3NFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBQcm9jZXNzRWRpdG9ySW5wdXQoCi0JCQkJCS8vIChNZXRob2RFbGVtZW50KSBwcm9jLmVDb250YWluZXIoKSk7Ci0JCQkJCS8vIGlucHV0LnNldEluaXRpYWxTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQkJLy8gaW5wdXQuc2V0QWN0aXZlUGFnZShpZCk7Ci0JCQkJCS8vCQkJCQkKLQkJCQkJLy8gUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikKLQkJCQkJLy8gZ2V0UGFnZSgpLmZpbmRFZGl0b3IoaW5wdXQpOwotCQkJCQkvLyBpZihlZGl0b3IgIT0gbnVsbCkgewotCQkJCQkvLyAvLyBzZWxlY3QgdGhlIGJhc2UgYWN0aXZpdHkgYWZ0ZXIgdGhlIGVkaXRvciBpcyBvcGVuZWQKLQkJCQkJLy8gLy8KLQkJCQkJLy8gVmlld2VyIHZpZXdlciA9IGVkaXRvci5ic1BhZ2VzW2lkXS5nZXRWaWV3ZXIoKTsKLQkJCQkJLy8gZ2V0UGFnZSgpLmFjdGl2YXRlKGVkaXRvcik7Ci0JCQkJCS8vIGVkaXRvci5zZXRBY3RpdmVQYWdlKGlkKTsKLQkJCQkJLy8gdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQkJCQkvLyB9Ci0JCQkJCS8vIGVsc2UgewotCQkJCQkvLyBlZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgZ2V0UGFnZSgpLm9wZW5FZGl0b3IoaW5wdXQsCi0JCQkJCS8vIEVESVRPUl9JRCk7Ci0JCQkJCS8vIH0KLQotCQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBwcm9jLmVDb250YWluZXIoKSk7Ci0JCQkJCVByb2Nlc3NFZGl0b3IgZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIGdldFBhZ2UoKQotCQkJCQkJCS5vcGVuRWRpdG9yKGlucHV0LCBFRElUT1JfSUQpOwotCQkJCQllZGl0b3Iuc2V0QWN0aXZlUGFnZShpZCk7Ci0JCQkJCWVkaXRvci5ic1BhZ2VzW2lkIC0gMV0uZ2V0Vmlld2VyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwKLQkJCQkJCQl0cnVlKTsKLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIG9wZW5Xb3JrZmxvd0VkaXRvckFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGlhZ3JhbSkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQl0cnkgewotCQkJCQkJSUVkaXRvclBhcnQgcGFyZW50ID0gZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEdyYXBoaWNhbFdvcmtmbG93RWRpdG9yLkVkaXRvcklucHV0KAotCQkJCQkJCQlzZWxlY3RlZE9iamVjdCwgZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJCQlJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0UGFnZSgpLm9wZW5FZGl0b3IoaW5wdXQsCi0JCQkJCQkJCVdPUktGTE9XX0VESVRPUl9JRCk7Ci0JCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBwYXJ0OwotCQkJCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkJCWV4Y2VwdGlvbik7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJcHJpdmF0ZSBJQWN0aW9uIG5ld0FjdGl2aXR5RGlhZ3JhbUVkaXRvciA9IG5ldyBBY3Rpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuCi0JCQkJUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGlhZ3JhbQotCQkJCSkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlvcGVuRGlhZ3JhbShJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSk7Ci0JCQl9CQkJCi0JCX07Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIG5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvciA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlvcGVuRGlhZ3JhbShJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pOwotCQkJfQotCQl9OwotCQkKLQkJcHJpdmF0ZSBJQWN0aW9uIG5ld1dQRGlhZ3JhbUVkaXRvciA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJb3BlbkRpYWdyYW0oSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pOwotCQkJfQotCQl9OwotCi0JCS8vIE9wZW4gd29ya2Zsb3cgZGV0YWlsIGFjdGlvbgotCQkvLwotCQlwcml2YXRlIElBY3Rpb24gb3BlbldvcmtmbG93RGV0YWlsRWRpdG9yQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7IAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBnZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLkVkaXRvcklucHV0KAotCQkJCQkJCQlzZWxlY3RlZE9iamVjdCwgZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJCQlJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0UGFnZSgpLm9wZW5FZGl0b3IoaW5wdXQsCi0JCQkJCQkJCUFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX0VESVRPUl9JRCk7Ci0JCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBwYXJ0OwotCQkJCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gb3BlbldQRGVwZW5kZW5jeUVkaXRvckFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IGdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQoCi0JCQkJCQkJCXNlbGVjdGVkT2JqZWN0LCBnZXRTdXBwcmVzc2lvbigpKSB7Ci0JCQkJCQl9OwotCQkJCQkJSUVkaXRvclBhcnQgcGFydCA9IGdldFBhZ2UoKS5vcGVuRWRpdG9yKGlucHV0LAotCQkJCQkJCQlXUERFUEVOREVOQ1lfRURJVE9SX0lEKTsKLQkJCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCQkJQWJzdHJhY3REaWFncmFtRWRpdG9yIGVkaXRvciA9IChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHBhcnQ7Ci0JCQkJCQkJZWRpdG9yLnNldFBhcmVudEVkaXRvcihwYXJlbnQpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gcmVwbGFjZUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZSkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQljbWQgPSBuZXcgUmVwbGFjZUFjdGl2aXR5Q29tbWFuZCgKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGJzSXRlbVByb3ZpZGVyKTsKLQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGNtZCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiBsb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHkgPSBuZXcgQWN0aW9uKAotCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weV90ZXh0KSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQljbWQgPSBuZXcgTG9jYWxseVJlcGxhY2VBbmREZWVwQ29weUNvbW1hbmQoCi0JCQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGJzSXRlbVByb3ZpZGVyKTsKLQkJCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJaWYgKGNtZCAhPSBudWxsKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfTsKLQotCQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5JblVJKHJ1bm5hYmxlLCBnZXRUZXh0KCkpOwotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiBjb250cmlidXRlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db250cmlidXRlKSB7IAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWNtZCA9IG5ldyBDb250cmlidXRlVG9BY3Rpdml0eUNvbW1hbmQoCi0JCQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBic0l0ZW1Qcm92aWRlcik7Ci0JCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCS8vIFByb2Nlc3NVdGlsLmNvbnRyaWJ1dGVUb0FjdGl2aXR5KChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilic0l0ZW1Qcm92aWRlciwKLQkJCQkJLy8gKChQcm9jZXNzRm9ybUVkaXRvcilhY3RpdmVFZGl0b3IpLmVkaXRpbmdEb21haW4uZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChjbWQgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIGNsYXNzIEVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCBleHRlbmRzIFN1cHByZXNzaW9uQ29tbWFuZCB7Ci0JCQlFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQoU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIExpc3Qgc2VsZWN0aW9uLAotCQkJCQlib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJCQlzdXBlcihzdXBwcmVzc2lvbiwgc2VsZWN0aW9uLCBzdXBwcmVzc2VkKTsKLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIHJlZnJlc2goKSB7Ci0JCQkJaWYgKCFnZXRSZXN1bHQoKS5pc0VtcHR5KCkpIHsKLQkJCQkJUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJCWlmIChpc1JlYWRPbmx5RWxlbWVudEFmZmVjdGVkKCkpIHsKLQkJCQkJCWlmIChoYXNJbmhlcml0ZWQoc2VsZWN0aW9uKSkgewotCQkJCQkJCWVkaXRvci5yZWZyZXNoQWxsUHJvY2Vzc0VkaXRvcnMoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZWRpdG9yLmRvUmVmcmVzaEFsbChmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWRpdG9yLmZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQkJCQkJCi0JCQkJCS8vIERvIERpYWdyYW0gRWRpdG9ycyByZWZyZXNoCi0JCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCVVJSGVscGVyLmNsb3NlRGlhZ3JhbUVkaXRvcnMoZWxlbWVudCwgbGlzdCk7Ci0JCQkJCQlVSUhlbHBlci5yZWZyZXNoT3BlbkRpYWdyYW1FZGl0b3JzT2ZQYXJlbnQoZWxlbWVudCwgbGlzdCk7Ci0JCQkJCQlsaXN0LmNsZWFyKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb24uU3VwcHJlc3Npb25Db21tYW5kI2RpZEV4ZWN1dGUoKQotCQkJICovCi0JCQlwcm90ZWN0ZWQgdm9pZCBkaWRFeGVjdXRlKCkgewotCQkJCXJlZnJlc2goKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbi5TdXBwcmVzc2lvbkNvbW1hbmQjZGlkVW5kbygpCi0JCQkgKi8KLQkJCXByb3RlY3RlZCB2b2lkIGRpZFVuZG8oKSB7Ci0JCQkJcmVmcmVzaCgpOwotCQkJfQotCi0JCX0KLQotCQlwcml2YXRlIElBY3Rpb24gc3VwcHJlc3NUYXNrQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc19UYXNrKSB7IAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gY2hlY2sgaWYgc3VwcHJlc3NpbmcgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIHdpbGwgY2F1c2UKLQkJCQkvLyBkdXBsaWNhdGUgZGVzY3JpcHRvcnMuCi0JCQkJLy8gSWYgc28sIHByb21wdCB1c2VyIHRvIGRlbGV0ZSB0aGUgZHVwbGljYXRlcyBiZWZvcmUKLQkJCQkvLyBjb250aW51aW5nLgotCQkJCS8vCi0JCQkJCi0JCQkJZmluYWwgTGlzdCB0YXNrRGVzY3JpcHRvcnMgPSBQcm9jZXNzVXRpbC5nZXRUYXNrRGVzY3JpcHRvcnMoc2VsZWN0aW9uKTsKLQkJCQlDb2xsZWN0aW9uIGR1cGxpY2F0ZXMgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmdldER1cGxpY2F0ZURlc2NyaXB0b3JzQWZ0ZXJTdXBwcmVzcyh0YXNrRGVzY3JpcHRvcnMpOwotCQkJCWlmICghZHVwbGljYXRlcy5pc0VtcHR5KCkpIHsKLQkJCQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKS5nZXRJZCgpLCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHVwbGljYXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJCVN0cmluZyBkZXNjVHh0ID0gVG5nVXRpbC5nZXRUeXBlVGV4dChkZXNjKQotCQkJCQkJCQkrICI6ICIgKyBkZXNjLmdldFByZXNlbnRhdGlvbk5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKS5nZXRJZCgpLCAwLCBkZXNjVHh0LCBudWxsKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJZ2V0VGV4dCgpLAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzLCAKLQkJCQkJCQkJCXN0YXR1cykgPT0gRGlhbG9nLkNBTkNFTCkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJLy8gZGVsZXRlIGR1cGxpY2F0ZSBkZXNjcmlwdG9ycwotCQkJCQlDb21tYW5kIGNtZCA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbWQgPSBQcm9jZXNzRGVsZXRlQWN0aW9uLmRlbGV0ZShkdXBsaWNhdGVzKTsKLQkJCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJaWYoY21kICE9IG51bGwpCi0JCQkJCQkJdHJ5IHsgY21kLmRpc3Bvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJCQkJfQotCQkJCX0KLQotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvclNpdGUoKQotCQkJCQkJLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kIGNtZCA9IG5ldyBFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQoCi0JCQkJCQkJCWdldFN1cHByZXNzaW9uKCksIHRhc2tEZXNjcmlwdG9ycywgdHJ1ZSk7Ci0JCQkJCQljbWQuc2V0TGFiZWwoZ2V0VGV4dCgpKTsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWJvb2xlYW4gc2hvdyA9IHRydWU7Ci0JCQkJLy8gdXBkYXRlIGNvbnRleHQgYmFyIG1lbnUgYWZ0ZXIgcGVyZm9ybWluZyBzdXBwcmVzcwotCQkJCWlmIChnZXRBZGFwdGVyRmFjdG9yeSgpID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5zaXplKCk7IGkrKykgewotCQkJCQkJaWYgKCEoc2VsZWN0aW9uLmdldChpKSBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IHNlbGVjdGlvbgotCQkJCQkJCQkuZ2V0KGkpIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSkKLQkJCQkJCQlzaG93ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJc2hvdyA9IGZhbHNlOwotCQkJCQotCQkJCXJldmVhbFRhc2tBY3Rpb24uc2V0RW5hYmxlZChzaG93KTsKLQkJCQlzdXBwcmVzc1Rhc2tBY3Rpb24uc2V0RW5hYmxlZChzaG93KTsKLQotCQkJCS8vIGVuYWJsZSBzeW5jaHJvbml6ZSBhY3Rpb25zIGNvcnJlY3RseQotCQkJCWF1dG9TeW5jaHJvbml6ZS5zZXRFbmFibGVkKGF1dG9TeW5jaHJvbml6ZQotCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkJLnRvQXJyYXkoKSkpKTsKLQkJCQltYW51YWxTeW5jaHJvbml6ZUFjdGlvbi5zZXRFbmFibGVkKG1hbnVhbFN5bmNocm9uaXplQWN0aW9uCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiBzdXBwcmVzc0FjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3MpIHsgCi0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBjaGVjayBpZiBzdXBwcmVzc2luZyB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgd2lsbCBjYXVzZQotCQkJCS8vIGR1cGxpY2F0ZSBkZXNjcmlwdG9ycy4KLQkJCQkvLyBJZiBzbywgcHJvbXB0IHVzZXIgdG8gZGVsZXRlIHRoZSBkdXBsaWNhdGVzIGJlZm9yZQotCQkJCS8vIGNvbnRpbnVpbmcuCi0JCQkJLy8KLQkJCQlDb2xsZWN0aW9uIGR1cGxpY2F0ZXMgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmdldER1cGxpY2F0ZURlc2NyaXB0b3JzQWZ0ZXJTdXBwcmVzcyhzZWxlY3Rpb24pOwotCQkJCWlmICghZHVwbGljYXRlcy5pc0VtcHR5KCkpIHsKLQkJCQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKS5nZXRJZCgpLCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHVwbGljYXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJCVN0cmluZyBkZXNjVHh0ID0gVG5nVXRpbC5nZXRUeXBlVGV4dChkZXNjKQotCQkJCQkJCQkrICI6ICIgKyBkZXNjLmdldFByZXNlbnRhdGlvbk5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKS5nZXRJZCgpLCAwLCBkZXNjVHh0LCBudWxsKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJZ2V0VGV4dCgpLAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzLCAKLQkJCQkJCQkJCXN0YXR1cykgPT0gRGlhbG9nLkNBTkNFTCkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJLy8gZGVsZXRlIGR1cGxpY2F0ZSBkZXNjcmlwdG9ycwotCQkJCQlDb21tYW5kIGNtZCA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbWQgPSBQcm9jZXNzRGVsZXRlQWN0aW9uLmRlbGV0ZShkdXBsaWNhdGVzKTsKLQkJCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJaWYoY21kICE9IG51bGwpCi0JCQkJCQkJdHJ5IHsgY21kLmRpc3Bvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGZpbmFsIFByb2Nlc3NFZGl0b3IgZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpCi0JCQkJLy8gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0KLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkKLQkJCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCS8vIGlmIChnZXRTdXBwcmVzc2lvbigpLnN1cHByZXNzKHNlbGVjdGlvbikpIHsKLQkJCQkJCS8vIGlmIChoYXNJbmhlcml0ZWQoc2VsZWN0aW9uKSkgewotCQkJCQkJLy8gZWRpdG9yLnJlZnJlc2hBbGxQcm9jZXNzRWRpdG9ycygpOwotCQkJCQkJLy8gfSBlbHNlIHsKLQkJCQkJCS8vIGVkaXRvci5kb1JlZnJlc2hBbGwoZmFsc2UpOwotCQkJCQkJLy8gfQotCQkJCQkJLy8gfQotCQkJCQkJLy8gZWRpdG9yLmZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQotCQkJCQkJRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kIGNtZCA9IG5ldyBFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQoCi0JCQkJCQkJCWdldFN1cHByZXNzaW9uKCksIHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQkJCQljbWQuc2V0TGFiZWwoZ2V0VGV4dCgpKTsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCi0JCQkJLy8gdXBkYXRlIGNvbnRleHQgYmFyIG1lbnUgYWZ0ZXIgcGVyZm9ybWluZyBzdXBwcmVzcwotCQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuUmV2ZWFsKHNlbGVjdGlvbikpOwotCQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5TdXBwcmVzcygKLQkJCQkJCXNlbGVjdGlvbikpOwotCi0JCQkJLy8gZW5hYmxlIHN5bmNocm9uaXplIGFjdGlvbnMgY29ycmVjdGx5Ci0JCQkJYXV0b1N5bmNocm9uaXplLnNldEVuYWJsZWQoYXV0b1N5bmNocm9uaXplCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJCW1hbnVhbFN5bmNocm9uaXplQWN0aW9uLnNldEVuYWJsZWQobWFudWFsU3luY2hyb25pemVBY3Rpb24KLQkJCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uCi0JCQkJCQkJCS50b0FycmF5KCkpKSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlwcml2YXRlIFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24gdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbiA9IG5ldyBVcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uKCk7Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIHJldmVhbEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsKSB7IAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGNhblJldmVhbChzZWxlY3Rpb24sIGdldEFkYXB0ZXJGYWN0b3J5KCksIGdldFN1cHByZXNzaW9uKCkpKSB7Ci0JCQkJCS8vIGZpbmFsIFByb2Nlc3NFZGl0b3IgZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpCi0JCQkJCS8vIGdldEFjdGl2ZUVkaXRvcigpOwotCi0JCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvclNpdGUoKQotCQkJCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJLy8gaWYgKGdldFN1cHByZXNzaW9uKCkucmV2ZWFsKHNlbGVjdGlvbikpIHsKLQkJCQkJCQkvLyBpZiAoaGFzSW5oZXJpdGVkKHNlbGVjdGlvbikpIHsKLQkJCQkJCQkvLyBlZGl0b3IucmVmcmVzaEFsbFByb2Nlc3NFZGl0b3JzKCk7Ci0JCQkJCQkJLy8gfSBlbHNlIHsKLQkJCQkJCQkvLyBlZGl0b3IuZG9SZWZyZXNoQWxsKGZhbHNlKTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQkJLy8gfQotCQkJCQkJCS8vIGVkaXRvci5maXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0KLQkJCQkJCQlFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQgY21kID0gbmV3IEVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCgKLQkJCQkJCQkJCWdldFN1cHByZXNzaW9uKCksIHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCWNtZC5zZXRMYWJlbChnZXRUZXh0KCkpOwotCQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfSk7Ci0JCQkJCS8vIHVwZGF0ZSBjb250ZXh0IGJhciBtZW51IGFmdGVyIHBlcmZvcm1pbmcgcmV2ZWFsCi0JCQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuUmV2ZWFsKAotCQkJCQkJCXNlbGVjdGlvbikpOwotCQkJCQlzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuU3VwcHJlc3MoCi0JCQkJCQkJc2VsZWN0aW9uKSk7Ci0JCQkJCS8vIGVuYWJsZSBzeW5jaHJvbml6ZSBhY3Rpb25zIGNvcnJlY3RseQotCQkJCQlhdXRvU3luY2hyb25pemUuc2V0RW5hYmxlZChhdXRvU3luY2hyb25pemUKLQkJCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkJLnRvQXJyYXkoKSkpKTsKLQkJCQkJbWFudWFsU3luY2hyb25pemVBY3Rpb24uc2V0RW5hYmxlZChtYW51YWxTeW5jaHJvbml6ZUFjdGlvbgotCQkJCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uCi0JCQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCXByaXZhdGUgSUFjdGlvbiByZXZlYWxUYXNrQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxfVGFzaykgeyAKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZpbmFsIExpc3QgdGFza0Rlc2NyaXB0b3JzID0gUHJvY2Vzc1V0aWwuZ2V0VGFza0Rlc2NyaXB0b3JzKHNlbGVjdGlvbik7Ci0JCQkJaWYgKGNhblJldmVhbCh0YXNrRGVzY3JpcHRvcnMsIGdldEFkYXB0ZXJGYWN0b3J5KCksIGdldFN1cHByZXNzaW9uKCkpKSB7Ci0JCQkJCQotCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkKLQkJCQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCUVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCBjbWQgPSBuZXcgRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kKAotCQkJCQkJCQkJZ2V0U3VwcHJlc3Npb24oKSwgdGFza0Rlc2NyaXB0b3JzLCBmYWxzZSk7Ci0JCQkJCQkJY21kLnNldExhYmVsKGdldFRleHQoKSk7Ci0JCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCQkJCX0KLQotCQkJCQl9KTsKLQkJCQkJCi0JCQkJCS8vIGVuYWJsZSBzeW5jaHJvbml6ZSBhY3Rpb25zIGNvcnJlY3RseQotCQkJCQlhdXRvU3luY2hyb25pemUuc2V0RW5hYmxlZChhdXRvU3luY2hyb25pemUKLQkJCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkJLnRvQXJyYXkoKSkpKTsKLQkJCQkJbWFudWFsU3luY2hyb25pemVBY3Rpb24uc2V0RW5hYmxlZChtYW51YWxTeW5jaHJvbml6ZUFjdGlvbgotCQkJCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uCi0JCQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDsKLQotCQlwcml2YXRlIEFjdGl2aXR5IHNlbGVjdGVkQWN0aXZpdHkgPSBudWxsOwotCi0JCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudCBzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgPSBudWxsOwotCi0JCXByaXZhdGUgTGlzdCBzZWxlY3Rpb247Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIHN1cHByZXNzRGlhZ3JhbUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3MyKSB7IAotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCWlmICghc3VwZXIuaXNFbmFibGVkKCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gIShic0l0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGJzSXRlbVByb3ZpZGVyKQotCQkJCQkJLmlzUmVhZE9ubHkoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIXByb21wdFNhdmVBY3RpdmVFZGl0b3IoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCk7Ci0KLQkJCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJCVRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJCQkJcmV0dXJuIEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJLmdldERpYWdyYW1UeXBlVGV4dCgoRGlhZ3JhbSkgb2JqZWN0KTsKLQkJCQkJfQotCQkJCX07Ci0KLQkJCQlDb2xsZWN0aW9uIGRpYWdyYW1zID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJLmdldERpYWdyYW1zKHNlbGVjdGVkQWN0aXZpdHkpOwotCQkJCUFycmF5TGlzdCB1bnN1cHByZXNzZWREaWFncmFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoIWRpYWdyYW0uZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQl1bnN1cHByZXNzZWREaWFncmFtcy5hZGQoZGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCQkJYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLAotCQkJCQkJZGlhZ3JhbXMsCi0JCQkJCQljb250ZW50UHJvdmlkZXIsCi0JCQkJCQlsYWJlbFByb3ZpZGVyLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlKTsgCi0JCQkJZGxnLnNldEluaXRpYWxFbGVtZW50U2VsZWN0aW9ucyh1bnN1cHByZXNzZWREaWFncmFtcyk7Ci0JCQkJZGxnCi0JCQkJCQkuc2V0VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZSk7IAotCQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlkbGcub3BlbigpOwotCi0JCQkJT2JqZWN0W10gZGlhZ3JhbXNUb1JldmVhbCA9IGRsZy5nZXRSZXN1bHQoKTsKLQotCQkJCWlmIChkaWFncmFtc1RvUmV2ZWFsID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWJvb2xlYW4gY2hhbmdlZCA9IHRydWU7Ci0KLQkJCQkvLyBjaGVjayBpZiB0aGVyZSBpcyByZWFsbHkgYW55IGNoYW5nZQotCQkJCS8vCi0JCQkJaWYgKGRpYWdyYW1zVG9SZXZlYWwubGVuZ3RoID09IHVuc3VwcHJlc3NlZERpYWdyYW1zLnNpemUoKSkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpYWdyYW1zVG9SZXZlYWwubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmICghdW5zdXBwcmVzc2VkRGlhZ3JhbXMuY29udGFpbnMoZGlhZ3JhbXNUb1JldmVhbFtpXSkpIHsKLQkJCQkJCQljaGFuZ2VkID0gZmFsc2U7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoY2hhbmdlZCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyLm5leHQoKTsKLQkJCQkJCWRpYWdyYW0uc2V0U3VwcHJlc3NlZChCb29sZWFuLlRSVUUpOwotCQkJCQl9Ci0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFncmFtc1RvUmV2ZWFsLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZGlhZ3JhbXNUb1JldmVhbFtpXTsKLQkJCQkJCWRpYWdyYW0uc2V0U3VwcHJlc3NlZChCb29sZWFuLkZBTFNFKTsKLQkJCQkJfQotCi0JCQkJCS8vIHNhdmUgdGhlIGVkaXRvcgotCQkJCQkvLwotCQkJCQlzYXZlQWN0aXZlRWRpdG9yKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQkKLQkJCi0JCQotCQlwcml2YXRlIElBY3Rpb24gbmV3U3VwcHJlc3NEaWFncmFtQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczIpIHsgCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJaWYgKCFzdXBlci5pc0VuYWJsZWQoKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiAhKGJzSXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgYnNJdGVtUHJvdmlkZXIpCi0JCQkJCQkuaXNSZWFkT25seSgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghcHJvbXB0U2F2ZUFjdGl2ZUVkaXRvcigpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKTsKLQotCQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQkJVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSkgewotCQkJCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCQkvL1RPRE86IENoYW5nZSB0byBleGFjdCBzdHJpbmcuCi0JCQkJCQlyZXR1cm4gRGlhZ3JhbUhlbHBlci5nZXREaWFncmFtVHlwZVN0cmluZygob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSlvYmplY3QpOwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCUNvbGxlY3Rpb24gZGlhZ3JhbXMgPSBEaWFncmFtSGVscGVyLmdldERpYWdyYW1zKHNlbGVjdGVkQWN0aXZpdHkpOwotCQkJCUFycmF5TGlzdCB1bnN1cHByZXNzZWREaWFncmFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSBkaWFncmFtID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0pIGl0ZXIubmV4dCgpOwotCQkJCQkKLQkJCQkJLy9UT0RPOiBkbyBnZXQgVW5zdXBwcmVzc2VkIGxpc3QuCi0JCQkJCQotLy8JCQkJCWlmICghZGlhZ3JhbS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLS8vCQkJCQkJdW5zdXBwcmVzc2VkRGlhZ3JhbXMuYWRkKGRpYWdyYW0pOwotLy8JCQkJCX0KLQkJCQl9Ci0KLQkJCQlMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCQkJYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLAotCQkJCQkJZGlhZ3JhbXMsCi0JCQkJCQljb250ZW50UHJvdmlkZXIsCi0JCQkJCQlsYWJlbFByb3ZpZGVyLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlKTsgCi0JCQkJZGxnLnNldEluaXRpYWxFbGVtZW50U2VsZWN0aW9ucyh1bnN1cHByZXNzZWREaWFncmFtcyk7Ci0JCQkJZGxnCi0JCQkJCQkuc2V0VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZSk7IAotCQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlkbGcub3BlbigpOwotCi0JCQkJT2JqZWN0W10gZGlhZ3JhbXNUb1JldmVhbCA9IGRsZy5nZXRSZXN1bHQoKTsKLQotCQkJCWlmIChkaWFncmFtc1RvUmV2ZWFsID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWJvb2xlYW4gY2hhbmdlZCA9IHRydWU7Ci0KLQkJCQkvLyBjaGVjayBpZiB0aGVyZSBpcyByZWFsbHkgYW55IGNoYW5nZQotCQkJCS8vCi0JCQkJaWYgKGRpYWdyYW1zVG9SZXZlYWwubGVuZ3RoID09IHVuc3VwcHJlc3NlZERpYWdyYW1zLnNpemUoKSkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpYWdyYW1zVG9SZXZlYWwubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmICghdW5zdXBwcmVzc2VkRGlhZ3JhbXMuY29udGFpbnMoZGlhZ3JhbXNUb1JldmVhbFtpXSkpIHsKLQkJCQkJCQljaGFuZ2VkID0gZmFsc2U7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoY2hhbmdlZCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0gZGlhZ3JhbSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtKSBpdGVyLm5leHQoKTsKLQkJCQkJCS8vVE9ETzogc2V0IFN1cHByZXNzaW9uLgotCQkJCQkJLy9kaWFncmFtLnNldFN1cHByZXNzZWQoQm9vbGVhbi5UUlVFKTsKLQkJCQkJfQotCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlhZ3JhbXNUb1JldmVhbC5sZW5ndGg7IGkrKykgewotCQkJCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSBkaWFncmFtID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0pIGRpYWdyYW1zVG9SZXZlYWxbaV07Ci0JCQkJCQkvL1RPRE86IHNldCBTdXBwcmVzc2lvbi4KLQkJCQkJCS8vZGlhZ3JhbS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4uRkFMU0UpOwotCQkJCQl9Ci0KLQkJCQkJLy8gc2F2ZSB0aGUgZWRpdG9yCi0JCQkJCS8vCi0JCQkJCXNhdmVBY3RpdmVFZGl0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQkKLQkJcHJpdmF0ZSBJQWN0aW9uIG5ld0Fzc2lnblVzZXJEaWFncmFtID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbSkgeyAKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvL1RPRE86IG5lY2Vzc2FyeSBjaGFuZ2VzIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZydzIERpYWdyYW1JbmZvLgotCQkJCVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZyBkaWFsb2cgPSBuZXcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nKAotCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgYWN0aXZlRWRpdG9yLAotCQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSwgZ2V0UHJvY2VzcygpLmdldERlZmF1bHRDb250ZXh0KCksIFRuZ1V0aWwuaXNXcmFwcGVkKHNlbGVjdGVkT2JqZWN0KSk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsKLQkJCX0KLQkJfTsKLQkJCi0JCXByaXZhdGUgSUFjdGlvbiBuZXdTdXBwcmVzc0FsbERpYWdyYW1zID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbCkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQluZXdTZXRBbGxEaWFncmFtU3VwcHJlc3NlZCh0cnVlKTsKLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gbmV3UmV2ZWFsQWxsRGlhZ3JhbXMgPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbEFsbCkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQluZXdTZXRBbGxEaWFncmFtU3VwcHJlc3NlZChmYWxzZSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQkKLQotCQlwcml2YXRlIElBY3Rpb24gc3VwcHJlc3NBbGxEaWFncmFtcyA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NBbGwpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2V0QWxsRGlhZ3JhbVN1cHByZXNzZWQodHJ1ZSk7Ci0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIHJldmVhbEFsbERpYWdyYW1zID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGwpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2V0QWxsRGlhZ3JhbVN1cHByZXNzZWQoZmFsc2UpOwotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiBhZGRBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZCkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQkJCQkJY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKAotCQkJCQkJCQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJTGlzdCBzZWxlY3Rpb24gPSBEaWFsb2dIZWxwZXIuc2VsZWN0RWxlbWVudHNGb3IoCi0JCQkJCQkJCQlzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQsIGNvbmZpZywgYWRhcHRlckZhY3RvcnkpOwotCi0JCQkJCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQotCQkJCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCQkJCQlzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQsCi0JCQkJCQkJCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCQkJCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQkJSVJlc291cmNlQXdhcmVDb21tYW5kIGNtZCA9ICgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKQotCQkJCQkJCQkJCS5jcmVhdGVEcm9wQ29tbWFuZChzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQsCi0JCQkJCQkJCQkJCQlzZWxlY3Rpb24pOwotCQkJCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9KTsKLQotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiBjb3B5QWN0aXZpdHlBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvcHkpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQkJY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHNlbGVjdGVkQWN0aXZpdHkpCi0JCQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQkJfQotCQkJCUxpc3Qgc2VsZWN0aW9uID0gRGlhbG9nSGVscGVyLnNlbGVjdEFjdGl2aXRpZXNGb3IoCi0JCQkJCQlzZWxlY3RlZEFjdGl2aXR5LCBjb25maWcsIElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWSk7Ci0KLQkJCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdG9yPXNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBvID0gaXRvci5uZXh0KCk7Ci0JCQkJCQotCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgbzsKLQkJCQkKLS8vCQkJCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQpOwotLy8JCQkJCQkJaWYgKERlcGVuZGVuY3lDaGVja2VyLmhhc0N5Y2xpY0RlcGVuZGVuY3koYWN0LCBwcm9jKSkgewotLy8JCQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7IHNlbGVjdGVkQWN0aXZpdHkuZ2V0TmFtZSgpLAotLy8JCQkJCQkJCQkJYWN0LmdldE5hbWUoKSB9OwotLy8JCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLS8vCQkJCQkJCQkJCS5iaW5kKAotLy8JCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX21zZywKLS8vCQkJCQkJCQkJCQkJYXJncyk7Ci0vLwkKLS8vCQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlOwotLy8JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCQkJaXRvci5yZW1vdmUoKTsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJCWVsc2UgaWYgKFByb2Nlc3NVdGlsLmhhc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcihhY3QpKSB7Ci0vLwkJCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgc2VsZWN0ZWRBY3Rpdml0eS5nZXROYW1lKCksCi0vLwkJCQkJCQkJCQlhY3QuZ2V0TmFtZSgpIH07Ci0vLwkJCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotLy8JCQkJCQkJCQkJLmJpbmQoCi0vLwkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZywKLS8vCQkJCQkJCQkJCQkJYXJncyk7Ci0vLwkKLS8vCQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLS8vCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkJCQkJCQlpdG9yLnJlbW92ZSgpOwotLy8JCQkJCQkJCXJldHVybjsKLS8vCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgc2VsZWN0ZWRBY3Rpdml0eSk7Ci0JCQkJCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCQlpdG9yLnJlbW92ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0JCi0JCQkJCQlpZihzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJQWN0aXZpdHlEcm9wQ29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlEcm9wQ29tbWFuZCgKLQkJCQkJCXNlbGVjdGVkQWN0aXZpdHksIHNlbGVjdGlvbiwgbnVsbCwgZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBjbWQuY2hlY2tDb3B5KCk7Ci0JCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWNtZC5zZXRUeXBlKElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWSk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gZXh0ZW5kQWN0aXZpdHlBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0V4dGVuZCkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCQljb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Moc2VsZWN0ZWRBY3Rpdml0eSkKLQkJCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQl9Ci0JCQkJTGlzdCBzZWxlY3Rpb24gPSBEaWFsb2dIZWxwZXIuc2VsZWN0QWN0aXZpdGllc0ZvcigKLQkJCQkJCXNlbGVjdGVkQWN0aXZpdHksIGNvbmZpZywgSUFjdGlvblR5cGVQcm92aWRlci5FWFRFTkQpOwotCi0JCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0gCi0JCQkJZWxzZSB7CQkJCQkKLQkJCQkJZm9yIChJdGVyYXRvciBpdG9yPXNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBvID0gaXRvci5uZXh0KCk7Ci0JCQkJCQotCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgbzsKLQkJCQkKLS8vCQkJCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQpOwotLy8JCQkJCQkJaWYgKERlcGVuZGVuY3lDaGVja2VyLmhhc0N5Y2xpY0RlcGVuZGVuY3koYWN0LCBwcm9jKSkgewotLy8JCQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7IHNlbGVjdGVkQWN0aXZpdHkuZ2V0TmFtZSgpLAotLy8JCQkJCQkJCQkJYWN0LmdldE5hbWUoKSB9OwotLy8JCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLS8vCQkJCQkJCQkJCS5iaW5kKAotLy8JCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX21zZywKLS8vCQkJCQkJCQkJCQkJYXJncyk7Ci0vLwkKLS8vCQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlOwotLy8JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCQkJaXRvci5yZW1vdmUoKTsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJCWVsc2UgaWYgKFByb2Nlc3NVdGlsLmhhc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcihhY3QpKSB7Ci0vLwkJCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgc2VsZWN0ZWRBY3Rpdml0eS5nZXROYW1lKCksCi0vLwkJCQkJCQkJCQlhY3QuZ2V0TmFtZSgpIH07Ci0vLwkJCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotLy8JCQkJCQkJCQkJLmJpbmQoCi0vLwkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZywKLS8vCQkJCQkJCQkJCQkJYXJncyk7Ci0vLwkKLS8vCQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLS8vCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkJCQkJCQlpdG9yLnJlbW92ZSgpOwotLy8JCQkJCQkJCXJldHVybjsKLS8vCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyLm5ld0NoZWNrQWN0ID8gCi0JCQkJCQkJCQlEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeUFmdGVyRmlsdGVyU2VsZWN0aW9uCi0JCQkJCQkJCQkJCShhY3QsIHNlbGVjdGVkQWN0aXZpdHksIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpCi0JCQkJCQkJCQk6IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgc2VsZWN0ZWRBY3Rpdml0eSk7Ci0JCQkJCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIHN0YXR1cyk7Ci0JCQkJCQkJCWl0b3IucmVtb3ZlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlBY3Rpdml0eURyb3BDb21tYW5kIGNtZCA9IG5ldyBBY3Rpdml0eURyb3BDb21tYW5kKAotCQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSwgc2VsZWN0aW9uLCBudWxsLCBnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNtZC5jaGVja0V4dGVuZCgpOwotCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQljbWQuc2V0VHlwZShJQWN0aW9uVHlwZVByb3ZpZGVyLkVYVEVORCk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gZGVlcENvcHlBY3Rpdml0eUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9hY3Rpb25fZGVlcENvcHkpIHsgCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQkJCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCQkJCWNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhzZWxlY3RlZEFjdGl2aXR5KQotCQkJCQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlMaXN0IHNlbGVjdGlvbiA9IERpYWxvZ0hlbHBlci5zZWxlY3RBY3Rpdml0aWVzRm9yKAotCQkJCQkJCQlzZWxlY3RlZEFjdGl2aXR5LCBjb25maWcsCi0JCQkJCQkJCUlBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZKTsKLQotCQkJCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9IAotCQkJCQkJZWxzZSB7CQkJCQkKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3I9c2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3QgbyA9IGl0b3IubmV4dCgpOwotCQkJCQkJCQotCQkJCQkJCQlpZiAobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG87Ci0JCQkJCQkJCQkKLS8vCQkJCQkJCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCk7Ci0vLwkJCQkJCQkJCWlmIChQcm9jZXNzVXRpbC5oYXNDeWNsaWNEZXBlbmRlbmN5KGFjdCwgcHJvYykpIHsKLS8vCQkJCQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7IHNlbGVjdGVkQWN0aXZpdHkuZ2V0TmFtZSgpLAotLy8JCQkJCQkJCQkJCQlhY3QuZ2V0TmFtZSgpIH07Ci0vLwkJCQkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0vLwkJCQkJCQkJCQkJCS5iaW5kKAotLy8JCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnLAotLy8JCQkJCQkJCQkJCQkJCWFyZ3MpOwotLy8JCQkKLS8vCQkJCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU7Ci0vLwkJCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCQkJCQlpdG9yLnJlbW92ZSgpOwotLy8JCQkJCQkJCQl9Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYWN0LCBzZWxlY3RlZEFjdGl2aXR5KTsKLQkJCQkJCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkJCQlpdG9yLnJlbW92ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJQWN0aXZpdHlEcm9wQ29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlEcm9wQ29tbWFuZCgKLQkJCQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSwgc2VsZWN0aW9uLCBudWxsLAotCQkJCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQkJCWNtZC5zZXRUeXBlKElBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZKTsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0KLQkJCQkJfQotCQkJCX0pOwkJCQkKLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIE9iamVjdCBzZWxlY3RlZE9iamVjdDsKLQotCQlwcml2YXRlIElBY3Rpb24gZXhwYW5kQWxsQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsKSB7IAotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlWaWV3ZXIgdmlld2VyID0gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpLmN1cnJlbnRWaWV3ZXI7Ci0JCQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIFRyZWVWaWV3ZXIpIHsKLQkJCQkJKChUcmVlVmlld2VyKSB2aWV3ZXIpLmV4cGFuZFRvTGV2ZWwoc2VsZWN0ZWRPYmplY3QsCi0JCQkJCQkJQWJzdHJhY3RUcmVlVmlld2VyLkFMTF9MRVZFTFMpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gY29sbGFwc2VBbGxBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NGb3JtRWRpdG9yX2NvbGxhcHNlQWxsQWN0aW9uTGFiZWwpIHsgCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVZpZXdlciB2aWV3ZXIgPSAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikuY3VycmVudFZpZXdlcjsKLQkJCQlpZiAodmlld2VyIGluc3RhbmNlb2YgVHJlZVZpZXdlcikgewotCQkJCQkoKFRyZWVWaWV3ZXIpIHZpZXdlcikuY29sbGFwc2VUb0xldmVsKHNlbGVjdGVkT2JqZWN0LAotCQkJCQkJCUFic3RyYWN0VHJlZVZpZXdlci5BTExfTEVWRUxTKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25BY3Rpb24gbWFudWFsU3luY2hyb25pemVBY3Rpb24gPSBuZXcgU3luY2hyb25pemF0aW9uQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN1cGVyLnJ1bigpOwotCi0JCQkJLy8gcmVmcmVzaCBwcm9wZXJ0aWVzIHZpZXcgYWZ0ZXIgc3luY2gKLQkJCQlFUEZQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlID0gKEVQRlByb3BlcnR5U2hlZXRQYWdlKSAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikKLQkJCQkJCS5nZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOwotCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQkJcGFnZS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbiBhdXRvU3luY2hyb25pemUgPSBuZXcgUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbigpIHsKLQkJCXByaXZhdGUgdm9pZCBzdXBlclJ1bigpIHsKLQkJCQlzdXBlci5ydW4oKTsKLQkJCX0KLQkJCQotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCWlmICghQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9kZWZhdWx0U3luY2hyb25pemF0aW9uLAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfY29uZmlybUF1dG9TeW5jaCkpIHsgCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJLy8gKChTeW5jaHJvbml6ZUNvbW1hbmQpY29tbWFuZCkuc2V0VUlDb250ZXh0KGdldEFjdGl2ZUVkaXRvcigpLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQkJCXN1cGVyUnVuKCk7Ci0JCQkJCQkKLQkJCQkJCS8vIHJlZnJlc2ggcHJvcGVydGllcyB2aWV3IGFmdGVyIHN5bmNoCi0JCQkJCQlFUEZQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlID0gKEVQRlByb3BlcnR5U2hlZXRQYWdlKSgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5nZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOwotCQkJCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCQkJCXBhZ2UucmVmcmVzaCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJCi0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIHNob3dJbkxpYnJhcnlWaWV3ID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXcsCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudC5naWYiKSkgeyAvLyROT04tTkxTLTEkICAgLy8pIAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZmluYWwgT2JqZWN0IGxpbmtlZEVsZW1lbnQgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCUxpYnJhcnlWaWV3LmdldFZpZXcoKS5zZXRTZWxlY3Rpb25Ub1ZpZXdlcigKLQkJCQkJCQkJCWxpbmtlZEVsZW1lbnQpOwotCQkJCQkJfQotCi0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiBhc3NpZ25Vc2VyRGlhZ3JhbSA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXNzaWduVXNlckRpYWdyYW0pIHsgCi0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVXNlckRlZmluZWREaWFncmFtRGlhbG9nIGRpYWxvZyA9IG5ldyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2coCi0JCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBhY3RpdmVFZGl0b3IsCi0JCQkJCQlzZWxlY3RlZEFjdGl2aXR5LCBnZXRQcm9jZXNzKCkuZ2V0RGVmYXVsdENvbnRleHQoKSwgVG5nVXRpbC5pc1dyYXBwZWQoc2VsZWN0ZWRPYmplY3QpKTsKLQotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQl9Ci0JCX07Ci0JCQotLy8JCXByaXZhdGUgSUFjdGlvbiBhY3Rpdml0eURldGFpbERpYWdyYW1JbmZvID0gIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1JbmZvQWN0aW9uKCl7Ci0vLwkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotLy8JCQkJcmV0dXJuIHNlbGVjdGVkQWN0aXZpdHk7Ci0vLwkJCX0KLS8vCQkJcHVibGljIElXb3JrYmVuY2hQYWdlIGdldFBhZ2V4KCkgewotLy8JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotLy8JCQkJcmV0dXJuIGdldFBhZ2UoKTsKLS8vCQkJfQotLy8JCX07Ci0KLQkJcHJpdmF0ZSBib29sZWFuIG9sZExvY2tlZDsKLQotCQlwdWJsaWMgQlNBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJCXN1cGVyKEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3IpOwotCQkJCi0JCQkvLyBkb24ndCBzaG93IHZhbGlkYXRlIGFjdGlvbgotCQkJLy8KLQkJCXZhbGlkYXRlQWN0aW9uID0gbnVsbDsKLQotCQkJLy8gc2V0IGRpc2FibGVkIGltYWdlIGRlc2NyaXB0b3JzCi0JCQltb3ZlVXBBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkJImZ1bGwvZXRvb2wxNi9tb3ZlX3VwX2Rpc2FibGVkLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbW92ZURvd25BY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkJImZ1bGwvZXRvb2wxNi9tb3ZlX2Rvd25fZGlzYWJsZWQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCQlzaG93SW5MaWJyYXJ5Vmlldy5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCQkiZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnRfZGlzYWJsZWQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXByaXZhdGUgc3RhdGljIFByZWZlcmVuY2VzSGludCBnZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KGludCBkaWFncmFtVHlwZSkgewotCQkJc3dpdGNoKGRpYWdyYW1UeXBlKSB7Ci0JCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJCXJldHVybiBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UOwotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCQlyZXR1cm4gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgb3BlbkRpYWdyYW0oaW50IGRpYWdyYW1UeXBlKSB7Ci0JCQl0cnkgewotCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0KAotCQkJCQkJc2VsZWN0ZWRPYmplY3QsIGdldFN1cHByZXNzaW9uKCksIGRpYWdyYW1UeXBlKTsKLQkJCQlEaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbUVkaXRvcihnZXRQYWdlKCksIGlucHV0LCBnZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KGRpYWdyYW1UeXBlKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CQkJCQkKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQWN0aW9uKElBY3Rpb24gYWN0aW9uKSB7Ci0JCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgIXJlZ2lzdGVyZWRBY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsKLQkJCQlyZWdpc3RlcmVkQWN0aW9ucy5hZGQoYWN0aW9uKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCByZWdpc3RlckFjdGlvbnMoKSB7Ci0JCQlyZWdpc3RlckFjdGlvbihhdXRvU3luY2hyb25pemUpOwotCQkJcmVnaXN0ZXJBY3Rpb24obWFudWFsU3luY2hyb25pemVBY3Rpb24pOwotCQkJcmVnaXN0ZXJBY3Rpb24odXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbik7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI3VwZGF0ZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQlzdXBlci51cGRhdGUoKTsKLQotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlRWRpdG9yIGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlRWRpdG9yCi0JCQkJCTogYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiA/IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uCi0JCQkJCTogU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVnaXN0ZXJlZEFjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFjdGlvbiA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBDb21tYW5kQWN0aW9uSGFuZGxlcikgewotCQkJCQkoKENvbW1hbmRBY3Rpb25IYW5kbGVyKSBhY3Rpb24pCi0JCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI2FjdGl2YXRlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQkJbWFudWFsU3luY2hyb25pemVBY3Rpb24uc2V0UHJvY2VzcyhnZXRQcm9jZXNzKCkpOwotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlRWRpdG9yIGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlRWRpdG9yCi0JCQkJCTogYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVnaXN0ZXJlZEFjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFjdGlvbiA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJV29ya2JlbmNoUGFydEFjdGlvbikgewotCQkJCQkoKElXb3JrYmVuY2hQYXJ0QWN0aW9uKSBhY3Rpb24pCi0JCQkJCQkJLnNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoYWN0aXZlRWRpdG9yKTsKLQkJCQl9Ci0JCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIHsKLQkJCQkJc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBhY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJCXN1cGVyLmFjdGl2YXRlKCk7Ci0KLQkJCS8vIGNhbGwgc2V0IEFjdGl2ZSBwYWdlIGV4cGxpY2l0bHkgaW4gb3JkZXIgdG8gZ2V0IGNvcnJlY3QgYWN0aW9uCi0JCQkvLyBiYXJzCi0JCQlzZXRBY3RpdmVQYWdlKGFjdGl2ZUVkaXRvcik7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI2RlYWN0aXZhdGUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlRWRpdG9yIGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlRWRpdG9yCi0JCQkJCTogYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWdpc3RlcmVkQWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWN0aW9uID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElXb3JrYmVuY2hQYXJ0QWN0aW9uKSB7Ci0JCQkJCSgoSVdvcmtiZW5jaFBhcnRBY3Rpb24pIGFjdGlvbikKLQkJCQkJCQkuc2V0QWN0aXZlV29ya2JlbmNoUGFydChudWxsKTsKLQkJCQl9Ci0JCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIHsKLQkJCQkJc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJCQkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBhY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFycykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQkJc3VwZXIuaW5pdChhY3Rpb25CYXJzKTsKLQkJCXJlZ2lzdGVyQWN0aW9ucygpOwotCQkJY29udHJpYnV0ZVRvVG9vbEJhcihhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCQl9Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudEVkaXRvcikgYWN0aXZlRWRpdG9yKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCX0KLQotCQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNldEFsbERpYWdyYW1TdXBwcmVzc2VkKGZpbmFsIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX3RpdGxlOyAKLQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxOyAKLQotCQkJaWYgKCFBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24odGl0bGUsIG1lc3NhZ2UpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnNldEFsbERpYWdyYW1TdXBwcmVzc2VkKGdldFByb2Nlc3MoKSwKLQkJCQkJCQlzdXBwcmVzc2VkKTsKLQkJCQkJZG9TYXZlQWN0aXZlRWRpdG9yKCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIG5ld1NldEFsbERpYWdyYW1TdXBwcmVzc2VkKGZpbmFsIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX3RpdGxlOyAKLQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxOyAKLQotCQkJaWYgKCFBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24odGl0bGUsIG1lc3NhZ2UpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlEaWFncmFtSGVscGVyLnNldEFsbERpYWdyYW1TdXBwcmVzc2VkKGdldFByb2Nlc3MoKSwKLQkJCQkJCQlzdXBwcmVzc2VkKTsKLQkJCQkJZG9TYXZlQWN0aXZlRWRpdG9yKCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQkKLQotCQlwcml2YXRlIGJvb2xlYW4gcHJvbXB0U2F2ZUFjdGl2ZUVkaXRvcigpIHsKLQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZTsgCi0JCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMjsgCi0JCQlpZiAoYWN0aXZlRWRpdG9yLmlzRGlydHkoKSkgewotCQkJCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHRpdGxlLCBtZXNzYWdlKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNhdmVBY3RpdmVFZGl0b3IoKSB7Ci0JCQkvLyBzYXZlIHRoZSBlZGl0b3IKLQkJCS8vCi0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlkb1NhdmVBY3RpdmVFZGl0b3IoKTsKLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRvU2F2ZUFjdGl2ZUVkaXRvcigpIHsKLQkJCSgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5yZXNvdXJjZXNUb1NhdmUuYWRkKGdldFByb2Nlc3MoKQotCQkJCQkuZVJlc291cmNlKCkpOwotCQkJYWN0aXZlRWRpdG9yLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCi0JCXByb3RlY3RlZCBEZWxldGVBY3Rpb24gY3JlYXRlRGVsZXRlQWN0aW9uKCkgewotCQkJcmV0dXJuIG5ldyBQcm9jZXNzRGVsZXRlQWN0aW9uKCkgewotCQkJCXByb3RlY3RlZCB2b2lkIHNhdmVDdXJyZW50RWRpdG9yKCkgewotCQkJCQlpZiAoYWN0aXZlRWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKQotCQkJCQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJYWN0aXZlRWRpdG9yLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsJCi0JCQkJCUlGb3JtUGFnZSBhY3RpdmVQYWdlID0gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpCi0JCQkJCQkJLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQkJCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBhY3RpdmVQYWdlLmdldElkKCk7Ci0JCQkJCQlpZiAoaWQgPT0gUHJvY2Vzc0VkaXRvci5XQlNfRk9STV9JRAotCQkJCQkJCQl8fCBpZCA9PSBQcm9jZXNzRWRpdG9yLlRBX0ZPUk1fSUQKLQkJCQkJCQkJfHwgaWQgPT0gUHJvY2Vzc0VkaXRvci5XUEJTX0ZPUk1fSUQKLQkJCQkJCQkJfHwgaWQgPT0gUHJvY2Vzc0VkaXRvci5DT05TT0xJREFURURfRk9STV9JRCkgewotCQkJCQkJCS8vIGZvciBhbGwgb3RoZXIgcGFnZXMsIGRpc2FibGUgREVMRVRFIAotCQkJCQkJCXN1cGVyLnJ1bigpOwotCQkJCQkJfQotCQkJCQl9IAotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ3V0QWN0aW9uIGNyZWF0ZUN1dEFjdGlvbigpIHsKLQkJCXJldHVybiBuZXcgQ3V0QWN0aW9uKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihQcm9jZXNzRGVsZXRlQWN0aW9uCi0JCQkJCQkJLmZpbHRlclNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJvdGVjdGVkIFBhc3RlQWN0aW9uIGNyZWF0ZVBhc3RlQWN0aW9uKCkgewotCQkJcmV0dXJuIG5ldyBQYXN0ZUFjdGlvbigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oUHJvY2Vzc0RlbGV0ZUFjdGlvbgotCQkJCQkJCS5maWx0ZXJTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQkJfQotCQkJCQotCQkJCS8qKgotCQkJCSAqIE92ZXJyaWRlZCB0byB1c2UgUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5QYXN0ZUFjdGlvbiNjcmVhdGVDb21tYW5kKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kCi0JCQkJICovCi0JCQkJcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCSAgICBpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKQotCQkJCSAgICB7Ci0JCQkJICAgIAlyZXR1cm4gbmV3IFJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKGRvbWFpbiwgc2VsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpLCBudWxsLCBDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYKTsKLQkJCQkgICAgfQotCQkJCSAgICBlbHNlCi0JCQkJICAgIHsKLQkJCQkgICAgICByZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCQkgICAgfQotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ29weUFjdGlvbiBjcmVhdGVDb3B5QWN0aW9uKCkgewotCQkJcmV0dXJuIG5ldyBDb3B5QWN0aW9uKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZG9tYWluIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkJCQkoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZG9tYWluKQotCQkJCQkJCQkucmVzZXRDb3B5TWFwcygpOwotCQkJCQl9Ci0JCQkJCXN1cGVyLnJ1bigpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJLy8gLy8gZGlzYWxsb3cgY29weWluZyBtdWx0aXBsZSBlbGVtZW50cyBmb3Igbm93IHVudGlsIHdlCi0JCQkJCS8vIGZpbmQgYSByaWdodCB3YXkKLQkJCQkJLy8gLy8gdG8ga2VlcCB0aGUgY29weSB0byBvcmlnaW5hbCBtYXAKLQkJCQkJLy8gLy8KLQkJCQkJLy8gaWYoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQkJLy8gcmV0dXJuIGZhbHNlOwotCQkJCQkvLyB9Ci0KLQkJCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI2FkZEdsb2JhbEFjdGlvbnMob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQlzdXBlci5hZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKAotCQkJCQkiYWRkaXRpb25zIiwgbmV3IFNlcGFyYXRvcigiZml4ZWQtYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCS8vIG1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwKLQkJCS8vIGluc2VydE5ld1BoYXNlQWN0aW9uKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0JCQlzdXBlci5jb250cmlidXRlVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQotCQkJbW92ZVVwQWN0aW9uCi0JCQkJCS5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXApOyAKLQkJCW1vdmVEb3duQWN0aW9uCi0JCQkJCS5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlRG93bik7IAotCQkJc2hvd0luTGlicmFyeVZpZXcKLQkJCQkJLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1Nob3dMaW5rZWRFbGVtZW50aW5MaWJyYXJ5Vmlldyk7IAotCQkJdG9vbEJhck1hbmFnZXIuYWRkKG1vdmVVcEFjdGlvbik7Ci0JCQl0b29sQmFyTWFuYWdlci5hZGQobW92ZURvd25BY3Rpb24pOwotCQkJdG9vbEJhck1hbmFnZXIuYWRkKHNob3dJbkxpYnJhcnlWaWV3KTsKLQkJfQkJCQkKLQotCQkvKiogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9ICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKQotCQkJCQkuZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCQlpZiAoYWN0aXZlUGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZQotCQkJCQkmJiAoKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkgYWN0aXZlUGFnZSkKLQkJCQkJCQkuYmFzaWNJc1JlYWRPbmx5KCkpIHsKLQkJCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigKLQkJCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CQkJCQkJCQkKLQkJCQltZW51TWFuYWdlci5hZGQoc2hvd0luTGlicmFyeVZpZXcpOwotCQkJCWlmIChic0l0ZW1Qcm92aWRlciAhPSBudWxsCi0JCQkJLy8gJiYgKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpCi0JCQkJLy8gYnNJdGVtUHJvdmlkZXIpLmhhc0NoaWxkcmVuKHNlbGVjdGVkT2JqZWN0KQotCQkJCSkgewotCQkJCQltZW51TWFuYWdlci5hZGQoZXhwYW5kQWxsQWN0aW9uKTsgCi0JCQkJCW1lbnVNYW5hZ2VyLmFkZChjb2xsYXBzZUFsbEFjdGlvbik7IAotCQkJCX0KLQkJCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCQlyZWZyZXNoVmlld2VyQWN0aW9uLnNldEVuYWJsZWQocmVmcmVzaFZpZXdlckFjdGlvbi5pc0VuYWJsZWQoKSk7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKHJlZnJlc2hWaWV3ZXJBY3Rpb24pOwotCQkJCW1lbnVNYW5hZ2VyLmFkZChzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlRWRpdG9yOwotCi0JCQlpZiAoc2VsZWN0ZWRBY3Rpdml0eSA9PSBudWxsCi0JCQkJCSYmIChzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSA9PSBudWxsIHx8IHNlbGVjdGlvblByb3ZpZGVyCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkpIHsKLQkJCQkvLyBmYWtlIGEgc2VsZWN0aW9uIGNoYW5nZSBldmVudCB3aXRoIHRoZSBwcm9jZXNzIHNlbGVjdGVkIGlmIG5vCi0JCQkJLy8gZWxlbWVudCBpcyBzZWxlY3RlZCB5ZXQuCi0JCQkJLy8KLQkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsCi0JCQkJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZXRQcm9jZXNzKCkpKSk7Ci0JCQl9Ci0JCQkvLyBkaXNhYmxlIGFsbCBuZXcgYWN0aW9uIGlmIGl0J3Mgcm9sbGVkIHVwCi0JCQlib29sZWFuIGlzUm9sbGVkVVAgPSBic0l0ZW1Qcm92aWRlciAhPSBudWxsCi0JCQkJCSYmIGJzSXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCXN1cGVyLnNldEVuYWJsZWQoIWlzUm9sbGVkVVApOwotCQkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKLQotCQkJLy8gYWRkIG1hcmtlcnMKLQkJCS8vCi0JCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiZml4ZWQtYWRkaXRpb25zIiwgbmV3IFNlcGFyYXRvcigicHJlZmVyZW5jZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQkJbWVudU1hbmFnZXIuYXBwZW5kVG9Hcm91cCgicHJlZmVyZW5jZSIsIHByZWZlcmVuY2VBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJmaXhlZC1hZGRpdGlvbnMiLCBuZXcgU2VwYXJhdG9yKCJvcGVuIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJaWYgKGJzSXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJJiYgVG5nVXRpbC51bndyYXAoYnNJdGVtUHJvdmlkZXIpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGNvbnRyaWJ1dGVBY3Rpb24pOyAKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIHJlcGxhY2VBY3Rpb24pOyAKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoCi0JCQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5KTsgCi0JCQl9Ci0KLQkJCWlmICghaXNSb2xsZWRVUCkgewotCQkJCWlmIChjcmVhdGVDaGlsZEFjdGlvbnMgIT0gbnVsbCAmJiAhY3JlYXRlQ2hpbGRBY3Rpb25zLmlzRW1wdHkoKSkgewotCQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFkZEFjdGlvbik7IAotCQkJCX0KLQkJCX0KLQotCQkJc3VwcHJlc3NUYXNrQWN0aW9uLnNldEVuYWJsZWQoIWlzUm9sbGVkVVAgJiYgc3VwcHJlc3NUYXNrQWN0aW9uLmlzRW5hYmxlZCgpKTsKLQkJCXJldmVhbFRhc2tBY3Rpb24uc2V0RW5hYmxlZCghaXNSb2xsZWRVUCAmJiByZXZlYWxUYXNrQWN0aW9uLmlzRW5hYmxlZCgpKTsKLQkJCWlmIChyZXZlYWxBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIHJldmVhbEFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChyZXZlYWxUYXNrQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJmaXhlZC1hZGRpdGlvbnMiLCByZXZlYWxUYXNrQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHN1cHByZXNzQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJmaXhlZC1hZGRpdGlvbnMiLCBzdXBwcmVzc0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChzdXBwcmVzc1Rhc2tBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIHN1cHByZXNzVGFza0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0JCQotCQkJaWYgKHVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoCi0JCQkJCQkiZml4ZWQtYWRkaXRpb25zIiwgdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKChzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgIT0gbnVsbCkgJiYgKGJzSXRlbVByb3ZpZGVyICE9IG51bGwpKSB7Ci0JCQkJaWYgKG1vdmVVcEFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIG1vdmVVcEFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKG1vdmVEb3duQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgbW92ZURvd25BY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQltZW51TWFuYWdlci5hcHBlbmRUb0dyb3VwKCJvcGVuIiwgc2hvd0luTGlicmFyeVZpZXcpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmICgoc2VsZWN0ZWRBY3Rpdml0eSAhPSBudWxsKSAmJiAoYnNJdGVtUHJvdmlkZXIgIT0gbnVsbCkpIHsKLQkJCQlpZiAoYnNJdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpKSB7Ci0JCQkJCXJvbGx1cEFjdGlvbgotCQkJCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxEb3duKTsgCi0JCQkJfSBlbHNlIHsKLQkJCQkJcm9sbHVwQWN0aW9uCi0JCQkJCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwKTsgCi0JCQkJfQotCQkJCW1lbnVNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm9wZW4iLCByb2xsdXBBY3Rpb24pOyAvLyROT04tTkxTLTEkCQkJCQotCQkJfQotCi0JCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCS8vICJSZXVzZSIgbWVudQotCQkJCS8vCi0JCQkJTWVudU1hbmFnZXIgcmV1c2VTdWJNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuKTsgCi0JCQkJcmV1c2VTdWJNZW51LmFkZChjb3B5QWN0aXZpdHlBY3Rpb24pOwotCQkJCXJldXNlU3ViTWVudS5hZGQoZXh0ZW5kQWN0aXZpdHlBY3Rpb24pOwotCQkJCXJldXNlU3ViTWVudS5hZGQoZGVlcENvcHlBY3Rpdml0eUFjdGlvbik7Ci0KLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIHJldXNlU3ViTWVudSk7IAotCQkJfQotCi0JCQlpZiAoYXV0b1N5bmNocm9uaXplLmlzRW5hYmxlZCgpKSB7Ci0JCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhdXRvU3luY2hyb25pemUpOyAKLQkJCX0KLQkJCWlmIChtYW51YWxTeW5jaHJvbml6ZUFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZShJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgbWFudWFsU3luY2hyb25pemVBY3Rpb24pOyAKLQkJCX0KLQotCQkJaWYgKCEoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgTWlsZXN0b25lKSkgewotCQkJCU1lbnVNYW5hZ2VyIGRpYWdyYW1TdWJNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRGlhZ3JhbXMpOyAKLQkJCQlpZiAoc2VsZWN0ZWRBY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQkJCWlmIChzZWxlY3RlZEFjdGl2aXR5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQltZW51TWFuYWdlci5hcHBlbmRUb0dyb3VwKCJvcGVuIiwgb3BlbkJhc2VBY3Rpdml0eSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJCWRpYWdyYW1TdWJNZW51LmFkZChvcGVuV29ya2Zsb3dFZGl0b3JBY3Rpb24pOwotCQkJCQlkaWFncmFtU3ViTWVudS5hZGQob3BlbldvcmtmbG93RGV0YWlsRWRpdG9yQWN0aW9uKTsKLQkJCQkJZGlhZ3JhbVN1Yk1lbnUuYWRkKG9wZW5XUERlcGVuZGVuY3lFZGl0b3JBY3Rpb24pOwotCQkJCQlkaWFncmFtU3ViTWVudS5hZGQoc3VwcHJlc3NEaWFncmFtQWN0aW9uKTsKLQkJCQkJZGlhZ3JhbVN1Yk1lbnUuYWRkKGFzc2lnblVzZXJEaWFncmFtKTsKLQkJCQl9Ci0JCQkJaWYgKHNlbGVjdGVkQWN0aXZpdHkgPT0gZ2V0UHJvY2VzcygpKSB7Ci0JCQkJCWRpYWdyYW1TdWJNZW51LmFkZChzdXBwcmVzc0FsbERpYWdyYW1zKTsKLQkJCQkJZGlhZ3JhbVN1Yk1lbnUuYWRkKHJldmVhbEFsbERpYWdyYW1zKTsKLQkJCQl9Ci0JCQkJLy8gRW5hYmxlIHRoaXMgY29kZSBpZiBBY3Rpdml0eURldGFpbERpYWdyYW1JbmZvRGlhbG9nIGlzIG5lZWQuCi0vLwkJCQlpZihzZWxlY3RlZEFjdGl2aXR5ICE9IG51bGwpewotLy8JCQkJCWRpYWdyYW1TdWJNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotLy8JCQkJCWRpYWdyYW1TdWJNZW51LmFkZChhY3Rpdml0eURldGFpbERpYWdyYW1JbmZvKTsKLS8vCQkJCX0KLQkJCQltZW51TWFuYWdlci5hcHBlbmRUb0dyb3VwKCJvcGVuIiwgZGlhZ3JhbVN1Yk1lbnUpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCQkJTWVudU1hbmFnZXIgbmV3RGlhZ3JhbVN1Yk1lbnUgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJCQkiTmV3IERpYWdyYW1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZihzZWxlY3RlZEFjdGl2aXR5ICE9IG51bGwpewotCQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQobmV3QWN0aXZpdHlEaWFncmFtRWRpdG9yKTsKLQkJCQkJbmV3RGlhZ3JhbVN1Yk1lbnUuYWRkKG5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcik7Ci0JCQkJCW5ld0RpYWdyYW1TdWJNZW51LmFkZChuZXdXUERpYWdyYW1FZGl0b3IpOwotCQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQobmV3U3VwcHJlc3NEaWFncmFtQWN0aW9uKTsKLQkJCQkJbmV3RGlhZ3JhbVN1Yk1lbnUuYWRkKG5ld0Fzc2lnblVzZXJEaWFncmFtKTsKLQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoc2VsZWN0ZWRBY3Rpdml0eSA9PSBnZXRQcm9jZXNzKCkpIHsKLQkJCQkJbmV3RGlhZ3JhbVN1Yk1lbnUuYWRkKG5ld1N1cHByZXNzQWxsRGlhZ3JhbXMpOwotCQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQobmV3UmV2ZWFsQWxsRGlhZ3JhbXMpOwotCQkJCX0KLQkJCQltZW51TWFuYWdlci5hcHBlbmRUb0dyb3VwKCJvcGVuIiwgbmV3RGlhZ3JhbVN1Yk1lbnUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChic0l0ZW1Qcm92aWRlciAhPSBudWxsCi0JCQkvLyB0aGlzIGlzIGFuIGV4cGVuc2l2ZSBjaGVjaywgcmVtb3ZlZCBpdAotCQkJLy8KLQkJCS8vICYmICgoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKQotCQkJLy8gYnNJdGVtUHJvdmlkZXIpLmhhc0NoaWxkcmVuKHNlbGVjdGVkT2JqZWN0KQotCQkJKSB7Ci0JCQkJbWVudU1hbmFnZXIuYXBwZW5kVG9Hcm91cCgib3BlbiIsIGV4cGFuZEFsbEFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQltZW51TWFuYWdlci5hcHBlbmRUb0dyb3VwKCJvcGVuIiwgY29sbGFwc2VBbGxBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzQ29tcG9uZW50KSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgYWN0aXZlRWRpdG9yCi0JCQkJCS5nZXRFZGl0b3JJbnB1dCgpKS5nZXRNZXRob2RFbGVtZW50KCkpLmdldFByb2Nlc3MoKTsKLQkJfQotCi0JCXByaXZhdGUgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpLnN1cHByZXNzaW9uOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRlcG9wdWxhdGVEeW5hbWljTWVudUl0ZW1zKCkgewotCQkJLy8gUmVtb3ZlIGFueSBtZW51IGl0ZW1zIGZvciBvbGQgc2VsZWN0aW9uLgotCQkJLy8KLQkJCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMpOwotCQkJfQotCQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLAotCQkJCQkJY3JlYXRlU2libGluZ0FjdGlvbnMpOwotCQkJfQotCQkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gbnVsbDsKLQkJCWNyZWF0ZVNpYmxpbmdBY3Rpb25zID0gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXQgYWN0aW9uIHN0YXRlIHRvIGVuYWJsZWQgb3IgZGlzYWJsZWQKLQkJICogCi0JCSAqIEBwYXJhbSBsb2NrZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRBY3Rpb25TdGF0ZSgpIHsKLQkJCWlmIChsb2NrZWQpIHsKLQkJCQkvLyBkaXNhYmxlIG1vZGlmeWluZyBhY3Rpb25zCi0JCQkJcGFzdGVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJY3V0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWRlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlhdXRvU3luY2hyb25pemUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJbWFudWFsU3luY2hyb25pemVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0gZWxzZSBpZiAoIW9sZExvY2tlZCkgewotCQkJCS8vIHVwZGF0ZSBzdGF0ZSBvZiBtb2RpZnlpbmcgYWN0aW9ucwotCQkJCS8vCi0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb25Qcm92aWRlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWN1dEFjdGlvbi5zZXRFbmFibGVkKGN1dEFjdGlvbi51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQkJcGFzdGVBY3Rpb24uc2V0RW5hYmxlZChwYXN0ZUFjdGlvbi51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQkJZGVsZXRlQWN0aW9uCi0JCQkJCQkuc2V0RW5hYmxlZChkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCQkJCWF1dG9TeW5jaHJvbml6ZS5zZXRFbmFibGVkKGF1dG9TeW5jaHJvbml6ZQotCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJCQltYW51YWxTeW5jaHJvbml6ZUFjdGlvbi5zZXRFbmFibGVkKG1hbnVhbFN5bmNocm9uaXplQWN0aW9uCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCQkJCXVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24KLQkJCQkJCS5zZXRFbmFibGVkKHVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24KLQkJCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJCX0KLQotCQkJYm9vbGVhbiBlbmFibGVkID0gIWxvY2tlZDsKLQotCQkJYWRkQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQljb250cmlidXRlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJCS8vIHN0YXRlIG9mIHRoZXNlIGFjdGlvbnMgaXMgc2V0IGluIHVwZGF0ZUFjdGlvbnMoKQotCQkJLy8KLQkJCS8vIG1vdmVEb3duQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkvLyBtb3ZlVXBBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCS8vIHJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJLy8gc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCXJlcGxhY2VBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCWxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJcmV2ZWFsQWxsRGlhZ3JhbXMuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCXN1cHByZXNzQWxsRGlhZ3JhbXMuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCXN1cHByZXNzRGlhZ3JhbUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJY29weUFjdGl2aXR5QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQlleHRlbmRBY3Rpdml0eUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJZGVlcENvcHlBY3Rpdml0eUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoQ29sbGVjdGlvbiBkZXNjcmlwdG9ycywKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJaWYgKGxvY2tlZCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKGRlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOwotCQl9Ci0KLQkJcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucygKLQkJCQlDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJaWYgKGxvY2tlZCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoZGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7Ci0JCX0KLQotCQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCUlTZWxlY3Rpb24gc2VsID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWw7Ci0JCQkJb2xkTG9ja2VkID0gbG9ja2VkOwotCQkJCWxvY2tlZCA9IFZpZXdIZWxwZXIuaXNMb2NrZWQoc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0KLQkJCQlzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWwpLnRvTGlzdCgpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJc2VsZWN0ZWRPYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWwpCi0JCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoc2VsZWN0ZWRPYmplY3QpOwotCQkJCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQkJc2VsZWN0ZWRFbGVtZW50ID0gb2JqOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCXNlbGVjdGVkQWN0aXZpdHkgPSAoQWN0aXZpdHkpIG9iajsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGRlcG9wdWxhdGVEeW5hbWljTWVudUl0ZW1zKCk7Ci0JCQkJCQkvLyBic0l0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCQkJCQlzZWxlY3RlZEFjdGl2aXR5ID0gbnVsbDsKLQkJCQkJfQotCQkJCQlBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZG9tYWluID0gKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSBhY3RpdmVFZGl0b3JQYXJ0KQotCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQkJCU9iamVjdCBwcm92aWRlck9iaiA9IGRvbWFpbi5nZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KAotCQkJCQkJCXNlbGVjdGVkT2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQlpZiAocHJvdmlkZXJPYmogaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpCi0JCQkJCQlic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIHByb3ZpZGVyT2JqOwotCi0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQlzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgb2JqOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50ID0gbnVsbDsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWRlcG9wdWxhdGVEeW5hbWljTWVudUl0ZW1zKCk7Ci0JCQkJCWJzSXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJCQkJc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDsKLQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSA9IG51bGw7Ci0JCQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCA9IG51bGw7Ci0JCQkJCXNlbGVjdGVkT2JqZWN0ID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQl1cGRhdGVBY3Rpb25zKCk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJZGVwb3B1bGF0ZUR5bmFtaWNNZW51SXRlbXMoKTsKLQkJCQlic0l0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCQkJc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDsKLQkJCQlzZWxlY3RlZEFjdGl2aXR5ID0gbnVsbDsKLQkJCQlzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgPSBudWxsOwotCQkJfQotCi0JCQkvLyAvLyB0ZXN0IGNvZGUKLQkJCS8vIC8vCi0JCQkvLyBpZihzZWxlY3RlZEFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9Ci0JCQkvLyBzZWxlY3RlZEFjdGl2aXR5LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkJLy8gRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0JCQkvLyBpZihTdHJpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhdHRyaWIuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkpKQotCQkJLy8gewotCQkJLy8gTGlzdCB2YWx1ZXMgPQotCQkJLy8gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRTdHJpbmdBdHRyaWJ1dGUoc2VsZWN0ZWRBY3Rpdml0eSwgYXR0cmliKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGF0dHJpYi5nZXROYW1lKCkgKyAiOiAiICsgdmFsdWVzKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJfQotCi0JCS8qKgotCQkgKiBVcGRhdGVzIGFjdGlvbnMgaW5jbHVkaW5nIGVuYWJsaW5nL2Rpc2FibGluZyB0aGVtIGJhc2VkIG9uIHNlbGVjdGlvbgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZUFjdGlvbnMoKSB7Ci0JCQlzaG93SW5MaWJyYXJ5VmlldwotCQkJCQkuc2V0RW5hYmxlZChzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yCi0JCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50KSAhPSBudWxsKTsKLQotCQkJaWYgKCFsb2NrZWQgJiYgc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCWlmIChnZXRTdXBwcmVzc2lvbigpLmNhblJldmVhbChzZWxlY3Rpb24pKSB7Ci0JCQkJCQlyZXZlYWxBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9IGVsc2UgaWYgKGdldFN1cHByZXNzaW9uKCkuY2FuU3VwcHJlc3Moc2VsZWN0aW9uKSkgewotCQkJCQkJc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5SZXZlYWwoCi0JCQkJCQkJc2VsZWN0aW9uKSk7Ci0JCQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5TdXBwcmVzcygKLQkJCQkJCQlzZWxlY3Rpb24pKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gQWN0aW9uIEVuYWJsZS9EaXNhYmxlIGZvciBTdXBwcmVzcyBUYXNrL1JldmVhbCBUYXNrIGNvbnRleHQgbWVudQotCQkJCWJvb2xlYW4gc2hvdyA9IHRydWU7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24uc2l6ZSgpOyBpKyspIHsKLQkJCQkJaWYgKGdldEFkYXB0ZXJGYWN0b3J5KCkgPT0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJCQkJCi0JCQkJCQlpZiAoIShzZWxlY3Rpb24uZ2V0KGkpIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgc2VsZWN0aW9uCi0JCQkJCQkJCS5nZXQoaSkgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpKSB7Ci0JCQkJCQkJc2hvdyA9IGZhbHNlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9IGVsc2UKLQkJCQkJCXNob3cgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKHNob3cpIHsKLQkJCQkJTGlzdCB0YXNrRGVzY3JpcHRvcnMgPSBQcm9jZXNzVXRpbC5nZXRUYXNrRGVzY3JpcHRvcnMoc2VsZWN0aW9uKTsKLQkJCQkJc3VwcHJlc3NUYXNrQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5TdXBwcmVzcyh0YXNrRGVzY3JpcHRvcnMpKTsKLQkJCQkJcmV2ZWFsVGFza0FjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuUmV2ZWFsKHRhc2tEZXNjcmlwdG9ycykpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3VwcHJlc3NUYXNrQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZXZlYWxUYXNrQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQotCQkJCS8vIGJvb2xlYW4gaGFzSW5oZXJpdGVkID0gZmFsc2U7Ci0JCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCS8vIE9iamVjdCBpdGVtID0gaXRlci5uZXh0KCk7Ci0JCQkJLy8gaWYgKGl0ZW0gaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCS8vICYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZW0pCi0JCQkJLy8gLmlzUmVhZE9ubHkoKSkgewotCQkJCS8vIGhhc0luaGVyaXRlZCA9IHRydWU7Ci0JCQkJLy8gYnJlYWs7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB1cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uLnNldEVuYWJsZWQoaGFzSW5oZXJpdGVkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXN1cHByZXNzVGFza0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlyZXZlYWxUYXNrQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQlpZiAoIWxvY2tlZCkgewotCQkJCXJlZnJlc2hNb3ZlQnV0dG9uQWN0aW9ucygpOwotCQkJfSBlbHNlIHsKLQkJCQltb3ZlVXBBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJbW92ZURvd25BY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCS8vIFNldCBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBBY3Rpb24gZW5hYmxlIHN0YXRlLgotCQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJfHwgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpCi0JCQkJc2V0QWN0aW9uU3RhdGVGb3JBREQoKTsKLQotCQkJLy8gY2hhbmdlIGFjdGlvbiBzdGF0ZSBmb3IgbG9ja2VkIHBsdWdpbgotCQkJc2V0QWN0aW9uU3RhdGUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgcGFydCkgewotCQkJaWYgKHRoaXMuYWN0aXZlRWRpdG9yICE9IG51bGwpIHsKLQkJCQlpbnQgcGFnZSA9ICgoUHJvY2Vzc0VkaXRvcikgdGhpcy5hY3RpdmVFZGl0b3IpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gdGhpcy5hY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJCQkuZ2V0QWN0aW9uQmFycygpOwotCi0JCQkJaWYgKHBhZ2UgPT0gMCkgewotCQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUKLQkJCQkJCQkuZ2V0SWQoKSwgbnVsbCk7Ci0JCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQkJCQlBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLCBudWxsKTsKLQkJCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWQotCQkJCQkJCS5nZXRJZCgpLCBudWxsKTsKLQkJCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUKLQkJCQkJCQkuZ2V0SWQoKSwgbnVsbCk7Ci0JCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8KLQkJCQkJCQkuZ2V0SWQoKSwgbnVsbCk7Ci0JCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8KLQkJCQkJCQkuZ2V0SWQoKSwgbnVsbCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFCi0JCQkJCQkJLmdldElkKCksIGRlbGV0ZUFjdGlvbik7Ci0JCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQkJCQlBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLCBjdXRBY3Rpb24pOwotCQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZCi0JCQkJCQkJLmdldElkKCksIGNvcHlBY3Rpb24pOwotCQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURQotCQkJCQkJCS5nZXRJZCgpLCBwYXN0ZUFjdGlvbik7Ci0JCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8KLQkJCQkJCQkuZ2V0SWQoKSwgdW5kb0FjdGlvbik7Ci0JCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8KLQkJCQkJCQkuZ2V0SWQoKSwgcmVkb0FjdGlvbik7Ci0JCQkJfQotCQkJCWFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZG9SZWZyZXNoKCkgewotCQkJLy8gdXBkYXRlIElEcwotCQkJLy8KLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCQkJCQl8fCBhZGFwdGVyRmFjdG9yeSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJUHJvY2VzcyBwcm9jID0gZ2V0UHJvY2VzcygpOwotCQkJCVByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhhZGFwdGVyRmFjdG9yeSwgcHJvYyk7Ci0JCQkJUHJvY2Vzc1V0aWwucmVmcmVzaFByZWRlY2Nlc3Nvckxpc3RzKGFkYXB0ZXJGYWN0b3J5LCBwcm9jKTsKLQkJCX0KLQotCQkJc3VwZXIuZG9SZWZyZXNoKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVmcmVzaE1vdmVCdXR0b25BY3Rpb25zKCkgewotCQkJaWYgKChzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgIT0gbnVsbCkgJiYgKGJzSXRlbVByb3ZpZGVyICE9IG51bGwpKSB7Ci0JCQkJbW92ZVVwQWN0aW9uLnNldEVuYWJsZWQoIWJzSXRlbVByb3ZpZGVyLmlzRmlyc3RFbGVtZW50KHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCkpOwotCQkJCW1vdmVEb3duQWN0aW9uLnNldEVuYWJsZWQoIWJzSXRlbVByb3ZpZGVyLmlzTGFzdEVsZW1lbnQoc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBTZXQgQWN0aW9uIHN0YXRlIGZvciBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBpbiBDb250ZXh0IE1lbnUgb24KLQkJICogc2VsZWN0aW9uIG9mIEFjdGl2aXR5LiBJZiBhbiBBY3Rpdml0eSBjb25zaXN0IGF0bGVhc3Qgb25lCi0JCSAqIHRhc2tkZXNjcmlwdG9yIGFuZCBpdHMgcHJpbWFyeSBwZXJmb3JtZXIgaW4gY3VycmVudCBjb25maWd1cmF0aW9uLAotCQkgKiB0aGVuIHN0YXRlIGlzIGVuYWJsZWQgZWxzZSBzdGF0ZSBpcyBkaXNhYmxlZCBpbiBjb250ZXh0IG1lbnUgKHByb2Nlc3MKLQkJICogZWRpdG9yKS4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRBY3Rpb25TdGF0ZUZvckFERCgpIHsKLQotCQkJLy8gc2V0IEFERCBBY3Rpb24gc3RhdGUgZmFsc2UKLQkJCW9wZW5Xb3JrZmxvd0RldGFpbEVkaXRvckFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJLy8gc2V0IEFEIEFjdGlvbiBzdGF0ZSB0cnVlIGFsd2F5cwotCQkJb3BlbldvcmtmbG93RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJCS8vIHNldCBXUEQgRGlhZ3JhbSBNZW51IEFjdGlvbiBzdGF0ZSB0cnUgYWx3YXlzCi0JCQlvcGVuV1BEZXBlbmRlbmN5RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJCWlmIChzZWxlY3RlZE9iamVjdCAhPSBudWxsKSB7Ci0KLQkJCQlpZiAoZ2V0U3VwcHJlc3Npb24oKS5pc1N1cHByZXNzZWQoc2VsZWN0ZWRPYmplY3QpKSB7Ci0JCQkJCW9wZW5Xb3JrZmxvd0RldGFpbEVkaXRvckFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJb3BlbldvcmtmbG93RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlvcGVuV1BEZXBlbmRlbmN5RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWFjdGl2aXR5ID0gc2VsZWN0ZWRBY3Rpdml0eTsKLQkJCQl9IGVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSAoKEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgc2VsZWN0ZWRPYmplY3QpCi0JCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJfQotCQkJCWlmIChhY3Rpdml0eSA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0KLQkJCQl3aGlsZSAoIWFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpLmVxdWFscygKLQkJCQkJCVZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKSkgewotCi0JCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGFjdGl2aXR5Ci0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJLy8gSWYgQWN0aXZpdHkgaXMgc2V0IHRvIGxvY2FsIGNvbnRyaWJ1dGlvbiwKLQkJCQkJLy8gbmVlZCB0byBnZXQgYnJlYWtkb3duIGVsZW1lbnRzIG9mIGxvY2FsIGNvbnRyaWJ1dGVkCi0JCQkJCS8vIGFjdGl2aXR5ICsgYmFzZSBhY3Rpdml0eS4gQW5kIGJhc2UgYWN0aXZpdHkgYnJlYWtkb3duCi0JCQkJCS8vIGVsZW1lbnRzCi0JCQkJCS8vIGFyZSBjb2xsZWN0ZWQgYWZ0ZXIgd2hpbGUgbG9vcCBlbmRzKQotCQkJCQkvLyBpZiAoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwuZXF1YWxzKGFjdGl2aXR5Ci0JCQkJCS8vIC5nZXRWYXJpYWJpbGl0eVR5cGUoKSkpIHsKLQkJCQkJLy8gbGlzdC5hZGRBbGwoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0JCQkJCS8vIH0KLQkJCQkJbGlzdC5hZGRBbGwoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0KLQkJCQkJaWYgKCh2ZSAhPSBudWxsKSAmJiAodmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQkJCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSB2ZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gRm9yIEFEIGRpYWdyYW0gbWVudSBvcHRpb24sIGlmIEJhc2UgQWN0aXZpdHkgZG9ub3QgaGF2ZSBhbnkKLQkJCQkvLyBBRCBkaWFncmFtLCBkb25vdCBzaG93IEFEIGRpYWdyYW0gb3B0aW9uIGluIGNvbnRleHQgbWVudSBmb3IKLQkJCQkvLyByZWFkb25seSBhY3Rpdml0eS4KLQkJCQlEaWFncmFtIGRpYWdyYW0gPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0VU1BRGlhZ3JhbShhY3Rpdml0eSwKLQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ESUFHUkFNLCBmYWxzZSk7Ci0JCQkJaWYgKGRpYWdyYW0gPT0gbnVsbAotCQkJCQkJJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJb3BlbldvcmtmbG93RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQotCQkJCS8vIEZvciBXUEQgZGlhZ3JhbSBtZW51IG9wdGlvbiwgaWYgQmFzZSBBY3Rpdml0eSBkb25vdCBoYXZlIGFueQotCQkJCS8vIFdQRCBkaWFncmFtLCBkb25vdCBzaG93IFdQRCBkaWFncmFtIG9wdGlvbiBpbiBjb250ZXh0IG1lbnUKLQkJCQkvLyBmb3IgcmVhZG9ubHkgYWN0aXZpdHkuCi0JCQkJZGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbSgKLQkJCQkJCWFjdGl2aXR5LAotCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNLAotCQkJCQkJZmFsc2UpOwotCQkJCWlmIChkaWFncmFtID09IG51bGwKLQkJCQkJCSYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCW9wZW5XUERlcGVuZGVuY3lFZGl0b3JBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCi0JCQkJLy8gQ29sbGVjdCB0aGUgYnJlYWtkb3duIGVsZW1lbnRzIHRvIHZlcmlmdHkgdGFza2Rlc2NyaXB0b3JzIGFyZQotCQkJCS8vIG5vdC4KLQkJCQlsaXN0LmFkZEFsbChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQotCQkJCS8vIEZvciBBREQgZGlhZ3JhbSBtZW51IG9wdGlvbiwgaWYgQmFzZSBBY3Rpdml0eSBkb25vdCBoYXZlIGFueQotCQkJCS8vIEFERCBkaWFncmFtLCBkb25vdCBzaG93IEFERCBkaWFncmFtIG9wdGlvbiBpbiBjb250ZXh0IG1lbnUKLQkJCQkvLyBmb3IKLQkJCQkvLyByZWFkb25seSBhY3Rpdml0eS4KLQkJCQlkaWFncmFtID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKAotCQkJCQkJYWN0aXZpdHksIEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0sCi0JCQkJCQlmYWxzZSk7Ci0JCQkJaWYgKGRpYWdyYW0gPT0gbnVsbAotCQkJCQkJJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJb3BlbldvcmtmbG93RGV0YWlsRWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgTGlzdCwgdG8gZmluZCB0YXNrZGVzY3JpcHRvciBhbmQgaGFzCi0JCQkJCS8vIHByaW1hcnkgcm9sZSB3aXRoaW4gY3VycmVudCBjb25maWd1cmF0aW9uLgotCQkJCQkvLyB0aGVuIGVuYWJsZSB0aGUgYWN0aW9uLgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJaWYgKCFnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChvYmopKSB7Ci0JCQkJCQkJCU9iamVjdCBlID0gKChUYXNrRGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCQkJCS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQkJCQkJCQlBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZG9tYWluID0gKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSBhY3RpdmVFZGl0b3JQYXJ0KQotCQkJCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQkJCQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBkb21haW4KLQkJCQkJCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJCQkJaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBFeHBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJCQkJCUlGaWx0ZXIgZmlsdGVyID0gKChFeHBvc2VkQWRhcHRlckZhY3RvcnkpIGZhY3RvcnkpCi0JCQkJCQkJCQkJCS5nZXRGaWx0ZXIoKTsKLQkJCQkJCQkJCWlmIChmaWx0ZXIgIT0gbnVsbAotCQkJCQkJCQkJCQkmJiBmaWx0ZXIuYWNjZXB0KGUpCi0JCQkJCQkJCQkJCSYmICFnZXRTdXBwcmVzc2lvbigpCi0JCQkJCQkJCQkJCQkJLmlzU3VwcHJlc3NlZChlKSkgewotCQkJCQkJCQkJCW9wZW5Xb3JrZmxvd0RldGFpbEVkaXRvckFjdGlvbgotCQkJCQkJCQkJCQkJLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFByb2Nlc3NFZGl0b3JEcm9wQWRhcHRlciBleHRlbmRzCi0JCQlFZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gZG9tYWluCi0JCSAqIEBwYXJhbSB2aWV3ZXIKLQkJICovCi0JCXB1YmxpYyBQcm9jZXNzRWRpdG9yRHJvcEFkYXB0ZXIoRWRpdGluZ0RvbWFpbiBkb21haW4sIFZpZXdlciB2aWV3ZXIpIHsKLQkJCXN1cGVyKGRvbWFpbiwgdmlld2VyKTsKLQkJfQotCi0JCS8qKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRuZC5FZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIjZ2V0RHJvcFRhcmdldChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQpCi0JCSAqLwotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldERyb3BUYXJnZXQoV2lkZ2V0IGl0ZW0pIHsKLQkJCU9iamVjdCB0YXJnZXQgPSBzdXBlci5nZXREcm9wVGFyZ2V0KGl0ZW0pOwotCQkJaWYgKHRhcmdldCA9PSBudWxsICYmIHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0ID0gc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50LmdldFByb2Nlc3MoKTsKLQkJCX0KLQkJCXJldHVybiB0YXJnZXQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRuZC5FZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIjZHJvcChvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoY3VycmVudFZpZXdlciBpbnN0YW5jZW9mIElBY3Rpb25UeXBlUHJvdmlkZXIpIHsKLQkJCQkoKElBY3Rpb25UeXBlUHJvdmlkZXIpIGN1cnJlbnRWaWV3ZXIpLnNldElucHV0RGF0YShuZXcgUG9pbnQoCi0JCQkJCQlldmVudC54LCBldmVudC55KSk7Ci0JCQl9Ci0JCQlzdXBlci5kcm9wKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQlwcml2YXRlIFZpZXdlciBjdXJyZW50Vmlld2VyOwotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIHZpZXdTZWxlY3Rpb247Ci0KLQlwcml2YXRlIFByb2Nlc3NDb21wb25lbnQgc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50OwotCi0JcHJpdmF0ZSBQcm9jZXNzIHNlbGVjdGVkUHJvY2VzczsKLQotCXByaXZhdGUgQWRhcHRlciBwcm9jZXNzQ29tcG9uZW50TGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChQcm9jZXNzQ29tcG9uZW50LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19OQU1FOgotCQkJCVN0cmluZyBuYW1lID0gbXNnLmdldE5ld1N0cmluZ1ZhbHVlKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQkJbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJc2V0UGFydE5hbWUobmFtZSk7Ci0KLQkJCQlpZiAocGFnZXMgIT0gbnVsbCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYWdlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBwYWdlID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NEZXNjcmlwdGlvbikgewotCQkJCQkJCSgoUHJvY2Vzc0Rlc2NyaXB0aW9uKSBwYWdlKQotCQkJCQkJCQkJLnJlZnJlc2hFbGVtZW50TmFtZShuYW1lKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBwcm9wQ29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWc7Ci0KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlicmFyeUxpc3RlbmVyID0gbmV3IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQlzd2l0Y2ggKG9wdGlvbikgewotCQkJLy8gY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9MT0FERUQ6Ci0JCQkvLyAvLyBjbG9zZSBhbGwgb3BlbiBkaWFncmFtIGVkaXRvcnMKLQkJCS8vIC8vCi0JCQkvLyBJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9Ci0JCQkvLyBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmcy5sZW5ndGg7IGkrKykgewotCQkJLy8gSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IGVkaXRvclJlZnNbaV0uZ2V0RWRpdG9yKGZhbHNlKTsKLQkJCS8vIGlmKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBHcmFwaGljYWxXb3JrZmxvd0VkaXRvcgotCQkJLy8gfHwgZWRpdG9yUGFydCBpbnN0YW5jZW9mIFByb2Nlc3NGb3JtRWRpdG9yKSB7Ci0JCQkvLyBnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKGVkaXRvclBhcnQsIHRydWUpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihQcm9jZXNzRm9ybUVkaXRvci50aGlzLCB0cnVlKTsKLQkJCWNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRDogewotCQkJCWlmIChjb2xsZWN0aW9uICE9IG51bGwgJiYgY29sbGVjdGlvbi5jb250YWlucyhjdXJyZW50Q29uZmlnKSkgewotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJCQl0cnkgewotCQkJCQkJUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRQotCQkJCQkJCQkuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsKLQkJCQkJCXJlZnJlc2hBbGwoKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UKLQkJCQkJCQkJLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCQkvLyBoYW5kbGVkIGJ5IGxpYlN2Y0xpc3RlbmVyCi0JCQkJLy8gY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DT05GSUdVUkFUSU9OX1NFTEVDVEVEOiB7Ci0JCQkJLy8gY29uZmlnQ2hhbmdlZCgpOwotCQkJCS8vIGJyZWFrOwotCQkJCS8vIH0KLQotCQkJfQotCi0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpYlN2Y0xpc3RlbmVyID0gbmV3IElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCWNvbmZpZ0NoYW5nZWQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgV0JTVGFiOwotCi0JcHJpdmF0ZSBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgT0JTVGFiOwotCi0JcHJpdmF0ZSBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgUEJTVGFiOwotCi0JcHJpdmF0ZSBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgcHJvY1RhYjsKLQotCXByaXZhdGUgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlW10gZXh0ZW5zaW9uVGFicyA9IG51bGw7Ci0KLQlwcml2YXRlIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZVtdIGJzUGFnZXM7Ci0KLQlwcml2YXRlIEVQRlByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXRQYWdlOwotCi0JcHVibGljIENvbGxlY3Rpb24gcmVzb3VyY2VzVG9TYXZlID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGZpcnN0RXhwYW5kZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIGEgbGlzdGVuZXIgdGhhdCBpcyBpbnRlcmVzdGVkIGluIHBhcnQgYWN0aXZhdGlvbiBldmVudHMuCi0JICovCi0JcHJpdmF0ZSBJUGFydExpc3RlbmVyIHBhcnRBY3RpdmF0aW9uTGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgewotCQkJCXJlbW92ZVByb3BlcnRpZXNEcm9wRG93bk1lbnUocGFydCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCS8vIGlmKCFmaXJzdEV4cGFuZGVkKSB7Ci0JCQkvLyBzeW5jaHJvbml6ZWQoUHJvY2Vzc0Zvcm1FZGl0b3IudGhpcykgewotCQkJLy8gaWYoZmlyc3RFeHBhbmRlZCkgewotCQkJLy8gKChBYnN0cmFjdFRyZWVWaWV3ZXIpIFdCU1RhYi5nZXRWaWV3ZXIoKSkuZXhwYW5kQWxsKCk7Ci0JCQkvLyAoKEFic3RyYWN0VHJlZVZpZXdlcikgT0JTVGFiLmdldFZpZXdlcigpKS5leHBhbmRBbGwoKTsKLQkJCS8vICgoQWJzdHJhY3RUcmVlVmlld2VyKSBQQlNUYWIuZ2V0Vmlld2VyKCkpLmV4cGFuZEFsbCgpOwotCQkJLy8gZmlyc3RFeHBhbmRlZCA9IHRydWU7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgewotCQkJCXByb3BlcnR5U2hlZXRQYWdlID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgewotCQkJCXJlbW92ZVByb3BlcnRpZXNEcm9wRG93bk1lbnUocGFydCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcmVmU3RvcmVMaXN0ZW5lcjsKLQotCS8vIHByaXZhdGUgUHJvY2Vzc0NvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQlwcml2YXRlIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIHN5bmNocm9uaXppbmdTZWxlY3Rpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5wdXRDaGFuZ2VkOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJQWRhcHRlckZhY3RvcnlQcm92aWRlciBhZGFwdGVyRmFjdG9yeVByb3ZpZGVyID0gbmV3IElBZGFwdGVyRmFjdG9yeVByb3ZpZGVyKCkgewotCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRDQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCXJldHVybiBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0KLQkJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFRCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQotCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0V0JTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRXUEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCX07Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjaXNWYWxpZGF0ZVJlc291cmNlc0JlZm9yZVNhdmVSZXF1aXJlZCgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZGF0ZVJlc291cmNlc0JlZm9yZVNhdmVSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2NyZWF0ZVZhbGlkYXRlUmVzb3VyY2VBY3Rpb24oKQotCSAqLwotCXByb3RlY3RlZCBMaWJyYXJ5VmFsaWRhdGVBY3Rpb24gY3JlYXRlVmFsaWRhdGVSZXNvdXJjZUFjdGlvbigpIHsKLQkJTGlicmFyeVZhbGlkYXRlQWN0aW9uIHZhbGlkYXRlQWN0aW9uID0gc3VwZXIuY3JlYXRlVmFsaWRhdGVSZXNvdXJjZUFjdGlvbigpOwotCQl2YWxpZGF0ZUFjdGlvbi5wdXRDb250ZXh0RGF0YShMaWJyYXJ5RVZhbGlkYXRvci5DVFhfQURBUFRFUl9GQUNUT1JZX1BST1ZJREVSLAotCQkJCWFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIpOwotCQlyZXR1cm4gdmFsaWRhdGVBY3Rpb247Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGlucHV0Q2hhbmdlZChPYmplY3QgbmV3SW5wdXQpIHsKLQkJaW5wdXRDaGFuZ2VkID0gZmFsc2U7Ci0JCWlmICghKG5ld0lucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSkKLQkJCXJldHVybjsKLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIG5ld0lucHV0OwotCi0JCU9iamVjdCBvYmogPSBtZXRob2RFbGVtZW50SW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIG9iajsKLQkJCXNlbGVjdGVkUHJvY2VzcyA9IChQcm9jZXNzKSBQcm9jZXNzVXRpbAotCQkJCQkuZ2V0VG9wQnJlYWtkb3duRWxlbWVudChzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQpOwotCQkJc3VwcHJlc3Npb24gPSBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihzZWxlY3RlZFByb2Nlc3MpOwotCi0JCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYWdlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCS8vIE9iamVjdCBwYWdlID0gaXRlci5uZXh0KCk7Ci0JCQkvLyBpZihwYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSB7Ci0JCQkvLyAoKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSlwYWdlKS5zZXRQcm9jZXNzKHByb2MpOwotCQkJLy8gfQotCQkJLy8gfQotCi0JCQlXQlNUYWIuc2V0UHJvY2VzcyhzZWxlY3RlZFByb2Nlc3MpOwotCQkJT0JTVGFiLnNldFByb2Nlc3Moc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCVBCU1RhYi5zZXRQcm9jZXNzKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQlwcm9jVGFiLnNldFByb2Nlc3Moc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCWlmIChleHRlbnNpb25UYWJzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvblRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGV4dGVuc2lvblRhYnNbaV0gIT0gbnVsbCkgewotCQkJCQkJZXh0ZW5zaW9uVGFic1tpXS5zZXRQcm9jZXNzKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8vIHByaXZhdGUgU3RyaW5nIGdldFRpdGxlUHJlZml4KCkgewotCS8vIElFZGl0b3JJbnB1dCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JLy8gaWYgKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JLy8gT2JqZWN0IG9iaiA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCS8vIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JLy8gUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KSBvYmo7Ci0JLy8gUHJvY2VzcyBwcm9jID0gcGMuZ2V0UHJvY2VzcygpOwotCS8vIGlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkvLyByZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0NBUEFCSUxJVFlfUEFUVEVSTjsKLQkvLyB9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkvLyByZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0RFTElWRVJZX1BST0NFU1M7Ci0JLy8gfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgUHJvY2Vzc0NvbnRyaWJ1dGlvbikgewotCS8vIHJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfUFJPQ0VTU19DT05UUklCVVRJT047Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JLy8gLmdldFN0cmluZygiQXV0aG9yaW5nVUkuUHJvY2Vzc0VkaXRvci5UaXRsZSIpOyAvLyROT04tTkxTLTEkCi0JLy8gfQotCi0JcHJpdmF0ZSBJbWFnZSBnZXRQcm9jVGl0bGVJbWFnZSgpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQlPYmplY3Qgb2JqID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgb2JqOwotCQkJCVByb2Nlc3MgcHJvYyA9IHBjLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX0NBUEFCSUxJVFlfUEFUVEVSTjsKLQkJCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfREVMSVZFUllfUFJPQ0VTUzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfUFJPQ0VTUzsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgUHJvcGVydGllcyB2aWV3IGRyb3AgZG93biBtZW51Ci0JICogCi0JICogQHBhcmFtIHBhcnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvcGVydGllc0Ryb3BEb3duTWVudShJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWlmIChwYXJ0IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgewotCQkJSVZpZXdTaXRlIHZpZXcgPSAoKFByb3BlcnR5U2hlZXQpIHBhcnQpLmdldFZpZXdTaXRlKCk7Ci0KLQkJCUlNZW51TWFuYWdlciBtZW51TWdyID0gdmlldy5nZXRBY3Rpb25CYXJzKCkuZ2V0TWVudU1hbmFnZXIoKTsKLQkJCS8vIElDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtZW51TWdyLmdldEl0ZW1zKCk7Ci0JCQkvLyBmb3IgKGludCBpPTA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLQkJCS8vIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiSWQgPSIgKyBpICsgIiAiICsgaXRlbXNbaV0uZ2V0SWQoKSArICIkIik7Ci0JCQkvLyB9Ci0JCQltZW51TWdyLnJlbW92ZUFsbCgpOwotCQkJbWVudU1nci51cGRhdGVBbGwodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQotCQkvLyBUT0RPOiBuZWVkIHJldmlzaXQKLQkJLy8gc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcihuZXcgRm9ybUVkaXRvclNlbGVjdGlvblByb3ZpZGVyKHRoaXMpKTsKLQkJLy8gYWN0aW9uTWFuYWdlciA9IGdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQlMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoZmFjdG9yaWVzKTsKLQotCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUKLQkJLy8gZXhlY3V0ZWQuCi0JCS8vCi0JCUNvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBhY3Rpb25NZ3IuZ2V0Q29tbWFuZFN0YWNrKCk7IC8vIG5ldwotCQkvLyBCYXNpY0NvbW1hbmRTdGFjaygpOwotCi0JCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8KLQkJLy8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCi0JCS8vCi0JCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcihuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGZpbmFsIEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQkJYm9vbGVhbiBydW4gPSBmYWxzZTsKLQkJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQpIHsKLQkJCQkJc3dpdGNoICgoKENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCkgZXZlbnQpLmdldFR5cGUoKSkgewotCQkJCQljYXNlIENvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5FWEVDVVRFRDoKLQkJCQkJY2FzZSBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuVU5ETzoKLQkJCQkJCXJ1biA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJ1biA9IHRydWU7Ci0JCQkJfQotCQkJCWlmIChydW4pIHsKLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0KLQkJCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBhZmZlY3RlZCBvYmplY3RzLgotCQkJCQkJCS8vCi0JCQkJCQkJQ29tbWFuZCBtb3N0UmVjZW50Q29tbWFuZCA9ICgoQ29tbWFuZFN0YWNrKSBldmVudAotCQkJCQkJCQkJLmdldFNvdXJjZSgpKS5nZXRNb3N0UmVjZW50Q29tbWFuZCgpOwotCQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCBpbnN0YW5jZW9mIENyZWF0ZUNoaWxkQ29tbWFuZAotCQkJCQkJCQkJCSYmIGN1cnJlbnRWaWV3ZXIgaW5zdGFuY2VvZiBQcm9jZXNzVmlld2VyKSB7Ci0JCQkJCQkJCQlPYmplY3RbXSBhcnIgPSBtb3N0UmVjZW50Q29tbWFuZAotCQkJCQkJCQkJCQkuZ2V0QWZmZWN0ZWRPYmplY3RzKCkudG9BcnJheSgpOwotCQkJCQkJCQkJaWYgKGFyci5sZW5ndGggPT0gMSkgewotCQkJCQkJCQkJCVByb2Nlc3NWaWV3ZXIgdmlld2VyID0gKFByb2Nlc3NWaWV3ZXIpIGN1cnJlbnRWaWV3ZXI7Ci0JCQkJCQkJCQkJdmlld2VyLmVkaXRFbGVtZW50KGFyclswXSwgMCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlpZiAoIShUbmdVdGlsLnVud3JhcChtb3N0UmVjZW50Q29tbWFuZCkgaW5zdGFuY2VvZiBTZXRDb21tYW5kKSkgewotCQkJCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKG1vc3RSZWNlbnRDb21tYW5kCi0JCQkJCQkJCQkJCQkuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCQkJCQkJCQkJfQotCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJLy8gaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCQkJCQkvLyBwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7Ci0JCQkJCQkJLy8gfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KLQkJZWRpdGluZ0RvbWFpbiA9IG5ldyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjayk7Ci0KLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5hZGRMaXN0ZW5lcihsaWJyYXJ5TGlzdGVuZXIpOwotCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKGFjdGlvbk1nci5nZXRDb21tYW5kU3RhY2soKSk7Ci0KLQkJCS8vIFRPRE86IG5lZWQgdG8gcmV2aXNpdCB0aGlzIGNvZGUKLQkJCWlmICghYWRkQWRhcHRlckZhY3RvcnlMaXN0ZW5lcnMpIHsKLQkJCQlhZGRBZGFwdGVyRmFjdG9yeUxpc3RlbmVycyA9IHRydWU7Ci0JCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQl9Ci0JCX0KLQotCQlzZXRQYXJ0TmFtZShpbnB1dC5nZXROYW1lKCkpOwotCQlzZXRUaXRsZUltYWdlKGdldFByb2NUaXRsZUltYWdlKCkpOwotCi0JCS8vIGdldCBtZXRob2QgZWxlbWVudCBvYmplY3QgZnJvbSBFZGl0b3IgaW5wdXQKLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCQllbGVtZW50T2JqID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQotCQlpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudE9iaik7Ci0JCQlzZWxlY3RlZFByb2Nlc3MgPSBzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQl9Ci0KLQkJaWYgKHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQuZUFkYXB0ZXJzKCkuYWRkKHByb2Nlc3NDb21wb25lbnRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBsaXN0ZW4gdG8gcmVzb3VyY2UgY2hhbmdlIHRvIHVwZGF0ZSBkaXJ0eSBmbGFnCi0JCS8vCi0JCS8vIGFkZFJlc291cmNlQ2hhbmdlZExpc3RlbmVyKCk7Ci0KLQkJLy8gYWRkIHBhcnQgbGlzdGVuZXIgdG8gbGlzdGVuIHRvIHByb3BlcnR5U2hlZXQgY2xvc2UgZXZlbnQKLQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKAotCQkJCXBhcnRBY3RpdmF0aW9uTGlzdGVuZXIpOwotCi0JCS8vIGlucHV0Q2hhbmdlZChpbnB1dCk7Ci0KLQkJLy8gbGlzdGVuIHRvIHRoZSBjaGFuZ2Ugb2YgY29sdW1uIGxpc3QgaW4gcHJlZmVyZW5jZSBzdG9yZQotCQkvLwotCQlpZiAocHJlZlN0b3JlTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJcHJlZlN0b3JlTGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBwYWdlID0gbnVsbDsKLQkJCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKAotCQkJCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSkgewotCQkJCQkJcGFnZSA9IFdCU1RhYjsKLQkJCQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscygKLQkJCQkJCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUykpIHsKLQkJCQkJCXBhZ2UgPSBPQlNUYWI7Ci0JCQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoCi0JCQkJCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TKSkgewotCQkJCQkJcGFnZSA9IFBCU1RhYjsKLQkJCQkJfQotCQkJCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJCQlDb2x1bW5EZXNjcmlwdG9yW10gY29scyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCQkJCQkJCWV2ZW50LmdldFByb3BlcnR5KCkpKTsKLQkJCQkJCXBhZ2UudXBkYXRlQ29sdW1ucyhjb2xzKTsKLQkJCQkJCWlmIChwYWdlID09IFdCU1RhYiB8fCBwYWdlID09IE9CU1RhYikgewotCQkJCQkJCS8vIHVwZGF0ZSBjb25zb2xpZGF0ZWQgdmlldyBhcyB3ZWxsCi0JCQkJCQkJLy8KLQkJCQkJCQkvLyBnZXQgV0JTIGNvbHVtbnMKLQkJCQkJCQlMaXN0IGxpc3QgPSB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KGdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSk7Ci0KLQkJCQkJCQkvLyBnZXQgVEJTIGNvbHVtbnMgCi0JCQkJCQkJQ29sdW1uRGVzY3JpcHRvcltdIHRlYW1Db2x1bW5EZXNjcmlwdG9ycyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpKTsKLQotCQkJCQkJCS8vIGlmIFRCUyBjb2x1bW5zIGhhcyBURUFNIGNvbHVtbiB0aGVuIGFkZCB0byBjb25zb2xpZGF0ZWQgdmlldwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVhbUNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCUNvbHVtbkRlc2NyaXB0b3IgY29sRGVzYyA9IHRlYW1Db2x1bW5EZXNjcmlwdG9yc1tpXTsKLQkJCQkJCQkJaWYgKGNvbERlc2MgPT0gQ09MX0RFU0NfVEVBTSkgewotCQkJCQkJCQkJbGlzdC5hZGQoY29sRGVzYyk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1ucyA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLQkJCQkJCQlsaXN0LnRvQXJyYXkoY29sdW1ucyk7Ci0JCQkJCQkJcHJvY1RhYi51cGRhdGVDb2x1bW5zKGNvbHVtbnMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0KLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmU3RvcmVMaXN0ZW5lcik7Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNldHMgdGhlIHNlbGVjdGlvbiBpbnRvIHdoaWNoZXZlciB2aWV3ZXIgaXMgYWN0aXZlLiAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5zZXRTZWxlY3Rpb25Ub1ZpZXdlcjoKLQkJLy8gc2VsZWN0aW9uPSIrY29sbGVjdGlvbik7Ci0JCWZpbmFsIENvbGxlY3Rpb24gdGhlU2VsZWN0aW9uID0gY29sbGVjdGlvbjsKLQkJLy8gTWFrZSBzdXJlIGl0J3Mgb2theS4KLQkJLy8KLQkJaWYgKHRoZVNlbGVjdGlvbiAhPSBudWxsICYmICF0aGVTZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkvLyBJIGRvbid0IGtub3cgaWYgdGhpcyBzaG91bGQgYmUgcnVuIHRoaXMgZGVmZXJyZWQKLQkJCS8vIGJlY2F1c2Ugd2UgbWlnaHQgaGF2ZSB0byBnaXZlIHRoZSBlZGl0b3IgYSBjaGFuY2UgdG8gcHJvY2VzcyB0aGUKLQkJCS8vIHZpZXdlciB1cGRhdGUgZXZlbnRzCi0JCQkvLyBhbmQgaGVuY2UgdG8gdXBkYXRlIHRoZSB2aWV3cyBmaXJzdC4KLQkJCS8vCi0JCQkvLwotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBpdGVtcyBpbiB0aGUgY3VycmVudCBjb250ZW50IHZpZXdlciBvZgotCQkJCQkvLyB0aGUgZWRpdG9yLgotCQkJCQkvLwotCQkJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCQljdXJyZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQkJdGhlU2VsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJcnVubmFibGUucnVuKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCQlyZXR1cm4gKEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcikgZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmU3RvcmVMaXN0ZW5lcik7Ci0KLQkJLy8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vCi0JCS8vIGdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0KLQkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCi0JCWlmIChnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGl2ZUVkaXRvcigpID09IHRoaXMpIHsKLQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKG51bGwpOwotCQl9Ci0KLQkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCXByb3BlcnR5U2hlZXRQYWdlLmRpc3Bvc2UoKTsKLQkJfQotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5yZW1vdmVMaXN0ZW5lcihsaWJyYXJ5TGlzdGVuZXIpOwotCQkJbWFuYWdlci5zdG9wTGlzdGVuaW5nVG8oZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSk7Ci0JCX0KLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0KLQkJaWYgKHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQuZUFkYXB0ZXJzKCkucmVtb3ZlKAotCQkJCQlwcm9jZXNzQ29tcG9uZW50TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gcmVtb3ZlUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIoKTsKLQotCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIoCi0JCQkJcGFydEFjdGl2YXRpb25MaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBzYXZlTmVlZGVkID0gaXNEaXJ0eSgpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQkvLyBjYWxsIHRoaXMgdG8gc2V0IG1vZGlmaWVkIGZsYWcgb2Ygc3VwcHJlc3Npb24gdG8gZmFsc2UKLQkJLy8KLQkJc3VwcHJlc3Npb24uc2F2ZUlzRG9uZSgpOwotCi0JCWlmIChzYXZlTmVlZGVkKSB7Ci0JCQkvLyB1c2VyIGRpc2NhcmRlZCBhbGwgdGhlIGNoYW5nZXMsIHNhdmUgdGhlIHJlc291cmNlcyBhZnRlciBjaGFuZ2VzCi0JCQkvLyBhcmUgdW5kb25lLgotCQkJLy8gVE9ETzogcmVsb2FkIHRoZSBwcm9jZXNzIGNvbXBvbmVudCByZXNvdXJjZSBpbnN0ZWFkIHNpbmNlIGl0IGlzCi0JCQkvLyBub3Qgc2hhcmVkLgotCQkJLy8KLQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCS8vIFJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCS8vIHNhdmVSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCQkvLyB9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRGVzY3JpcHRpb25QYWdlKCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJaWYgKHNlbGVjdGVkUHJvY2VzcyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJLy8gRGVsaXZlcnkgUHJvY2VzcwotCQkJYWRkUGFnZSgwLCBuZXcgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24odGhpcykpOwotCQl9IGVsc2UgewotCQkJLy8gQ2FwYWJpbGl0eSBQYXR0ZXJuCi0JCQkvLyBQcm9jZXNzIENvbnRyaWJ1dGlvbgotCQkJYWRkUGFnZSgwLCBuZXcgUHJvY2Vzc0Rlc2NyaXB0aW9uKHRoaXMpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3IjYWRkUGFnZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhZ2VzKCkgewotCQl0cnkgewotCQkJYWRkRGVzY3JpcHRpb25QYWdlKCk7Ci0KLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JCQkvLyBjcmVhdGUgRE5EIHRyYW5zZmVyIG9iamVjdHMKLQkJCS8vIGludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTks7Ci0JCQkvLyBUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdCi0JCQkvLyB7TG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0KLQkJCS8vIHByZWZlcmVuY2UgaXMgbWFuYWdlZCBieSBsaWJyYXJ5IHBsdWdpbiwKLQkJCS8vIHNpbmNlIHRoaXMgcHJlZmVyZW5jZXMgaXMgYWxzbyB1c2VkIGZvciBicm93c2luZyBhbmQgcHVibGlzaGluZwotCQkJLy8gSmluaHVhIFhpIDA4LzIxLzIwMDYKLQkJCS8vIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS8vIC5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCVByZWZlcmVuY2VVdGlsLnZhbGlkYXRlUHJlZmVyZW5jZXMoKTsKLQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQotCQkJTGlzdCBwYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJLy8gV0JTIHRhYgotCQkJV0JTVGFiID0gbmV3IFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSh0aGlzLCBXQlNfRk9STV9JRCwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9ycyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpOwotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWN1cnJlbnRDb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRQotCQkJCQkuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJLnNldEZpbHRlcihQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFKTsKLQkJCX0KLQkJCVdCU1RhYi5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCQlXQlNUYWIuc2V0Q29sdW1uRGVzY3JpcHRvcnMoY29sdW1uRGVzY3JpcHRvcnMpOwotCQkJaW50IGlkID0gYWRkUGFnZShXQlNUYWIuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSkpOwotCQkJc2V0UGFnZVRleHQoaWQsIFdCU1RhYi5nZXRUaXRsZSgpKTsKLQkJCVdCU1RhYi5zZXRUYWJJbmRleChpZCk7Ci0JCQlTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBXQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXIpOwotCQkJcGFnZXMuYWRkKFdCU1RhYik7Ci0JCQkvLyB2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcKLQkJCS8vIFByb2Nlc3NFZGl0b3JEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKLQkJCS8vIHZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpCi0JCQkvLyB7Ci0JCQkvLyBwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KQotCQkJLy8gewotCQkJLy8gVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuaGFuZGxlRG91YmxlQ2xpY2tFdmVudChldmVudCk7Ci0JCQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImRvdWJsZSBjbGlja2VkIC4uLiIpOwotCQkJLy8gLy8KLQkJCS8vIC8vIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQkvLyBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigic2VsIitzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJLy8gLy8KLQkJCS8vIFByb2R1Y3RFZGl0b3JWaWV3LmdldFZpZXcoKS5nZXRQcm9kdWN0Vmlld2VyKCkuc2V0SW5wdXQoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCS8vIH0KLQkJCS8vIH0pOwotCQkJLy8gYWRkUGFnZShXQlNUYWIpOwotCi0JCQkvLyBPQlMgdGFiCi0JCQlPQlNUYWIgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKHRoaXMsIFRBX0ZPUk1fSUQsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb24pOyAvLyROT04tTkxTLTEkIAotCQkJY29sdW1uRGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0JCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpKTsKLQkJCS8vIHNldENvbHVtbkluZGV4VG9OYW1lTWFwKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19BZGFwdGVyRmFjdG9yaWVzKCksCi0JCQkvLyBjb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJCSgoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkuc2V0RmlsdGVyKFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UpOwotCQkJfQotCQkJT0JTVGFiLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCU9CU1RhYi5zZXRDb2x1bW5EZXNjcmlwdG9ycyhjb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCQlpZCA9IGFkZFBhZ2UoT0JTVGFiLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpKTsKLQkJCXNldFBhZ2VUZXh0KGlkLCBPQlNUYWIuZ2V0VGl0bGUoKSk7Ci0JCQlPQlNUYWIuc2V0VGFiSW5kZXgoaWQpOwotCQkJdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIE9CU1RhYi5nZXRWaWV3ZXIoKTsKLQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcik7Ci0JCQlwYWdlcy5hZGQoT0JTVGFiKTsKLQkJCS8vIHZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldwotCQkJLy8gUHJvY2Vzc0VkaXRvckRyb3BBZGFwdGVyKGVkaXRpbmdEb21haW4sIHZpZXdlcikpOwotCQkJLy8gYWRkUGFnZShPQlNUYWIpOwotCi0JCQkvLyBQQlMgdGFiCi0JCQlQQlNUYWIgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKHRoaXMsIFdQQlNfRk9STV9JRCwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9Xb3JrUHJvZHVjdFVzYWdlKTsgLy8kTk9OLU5MUy0xJCAKLQkJCWNvbHVtbkRlc2NyaXB0b3JzID0gdG9Db2x1bW5EZXNjcmlwdG9ycyhzdG9yZQotCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUykpOwotCQkJLy8gc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0FkYXB0ZXJGYWN0b3JpZXMoKSwKLQkJCS8vIGNvbHVtbkRlc2NyaXB0b3JzKTsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCS5zZXRGaWx0ZXIoUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRSk7Ci0JCQl9Ci0JCQlQQlNUYWIuc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCQkJUEJTVGFiLnNldENvbHVtbkRlc2NyaXB0b3JzKGNvbHVtbkRlc2NyaXB0b3JzKTsKLQkJCWlkID0gYWRkUGFnZShQQlNUYWIuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSkpOwotCQkJc2V0UGFnZVRleHQoaWQsIFBCU1RhYi5nZXRUaXRsZSgpKTsKLQkJCVBCU1RhYi5zZXRUYWJJbmRleChpZCk7Ci0JCQl2aWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgUEJTVGFiLmdldFZpZXdlcigpOwotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyKTsKLQkJCXBhZ2VzLmFkZChQQlNUYWIpOwotCQkJLy8gdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3Ci0JCQkvLyBQcm9jZXNzRWRpdG9yRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7Ci0JCQkvLyBhZGRQYWdlKFBCU1RhYik7Ci0KLQkJCS8vIGNvbnNvbGlkYXRlZCB0YWIKLQkJCXByb2NUYWIgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKHRoaXMsCi0JCQkJCUNPTlNPTElEQVRFRF9GT1JNX0lELAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0NvbnNvbGlkYXRlZFZpZXcpOyAvLyROT04tTkxTLTEkIAotCQkJcHJvY1RhYi5zZXRSZWFkT25seSh0cnVlKTsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCS5zZXRGaWx0ZXIoUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRSk7Ci0JCQl9Ci0JCQlwcm9jVGFiLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLS8vCQkJY29sdW1uRGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0vLwkJCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpOwotLy8JCQkKLQkJCS8vIGdldCBXQlMgY29sdW1ucwotCQkJTGlzdCBsaXN0ID0gdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChzdG9yZQotCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSk7Ci0KLQkJCS8vIGdldCBUQlMgY29sdW1ucyAKLQkJCUNvbHVtbkRlc2NyaXB0b3JbXSB0ZWFtQ29sdW1uRGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0JCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpKTsKLQotCQkJLy8gaWYgVEJTIGNvbHVtbnMgaGFzIFRFQU0gY29sdW1uIHRoZW4gYWRkIHRvIGNvbnNvbGlkYXRlZCB2aWV3Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRlYW1Db2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUNvbHVtbkRlc2NyaXB0b3IgY29sRGVzYyA9IHRlYW1Db2x1bW5EZXNjcmlwdG9yc1tpXTsKLQkJCQlpZiAoY29sRGVzYyA9PSBDT0xfREVTQ19URUFNKSB7Ci0JCQkJCWxpc3QuYWRkKGNvbERlc2MpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5zID0gbmV3IENvbHVtbkRlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KGNvbHVtbnMpOwotCQkJcHJvY1RhYi5zZXRDb2x1bW5EZXNjcmlwdG9ycyhjb2x1bW5zKTsKLQkJCQotCQkJaWQgPSBhZGRQYWdlKHByb2NUYWIuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSkpOwotCQkJc2V0UGFnZVRleHQoaWQsIHByb2NUYWIuZ2V0VGl0bGUoKSk7Ci0JCQlwcm9jVGFiLnNldFRhYkluZGV4KGlkKTsKLQkJCXZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBwcm9jVGFiLmdldFZpZXdlcigpOwotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyKTsKLQkJCXBhZ2VzLmFkZChwcm9jVGFiKTsKLQotCQkJLy8gY2hlY2sgZm9yIGV4dGVuc3Rpb24gcG9pbnQgYW5kIGFkZCB0aGUgcGFnZSBpZiB0aGVyZQotCQkJTGlzdCBwYWdlUHJvdmlkZXJzID0gUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlci5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRQYWdlUHJvdmlkZXJzKCk7Ci0KLQkJCWlmIChwYWdlUHJvdmlkZXJzICE9IG51bGwgJiYgcGFnZVByb3ZpZGVycy5zaXplKCkgPiAwKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZXh0ZW5zaW9uVGFicyA9IG5ldyBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VbcGFnZVByb3ZpZGVycwotCQkJCQkJCS5zaXplKCldOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VQcm92aWRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCU9iamVjdCBwYWdlID0gcGFnZVByb3ZpZGVycy5nZXQoaSk7Ci0JCQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIElFeHRlbnNpb25Gb3JtUGFnZSkgewotCi0JCQkJCQkJSUV4dGVuc2lvbkZvcm1QYWdlIGZvcm1QYWdlID0gKElFeHRlbnNpb25Gb3JtUGFnZSkgcGFnZTsKLQkJCQkJCQlJRm9ybVBhZ2UgY29udHJvbCA9IGZvcm1QYWdlLnNldEVkaXRvcih0aGlzKTsKLQkJCQkJCQlmb3JtUGFnZS5zZXRJbnB1dChzZWxlY3RlZFByb2Nlc3MpOwotCQkJCQkJCVByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBleHRlbmRlZFBhZ2UgPSBudWxsOwotCQkJCQkJCWlmIChjb250cm9sIGluc3RhbmNlb2YgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSB7Ci0JCQkJCQkJCWV4dGVuZGVkUGFnZSA9IChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIGNvbnRyb2w7Ci0JCQkJCQkJCWV4dGVuc2lvblRhYnNbaV0gPSBleHRlbmRlZFBhZ2U7Ci0JCQkJCQkJfQotCi0JCQkJCQkJaWQgPSBhZGRQYWdlKGV4dGVuZGVkUGFnZQotCQkJCQkJCQkJLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpKTsKLQkJCQkJCQlzZXRQYWdlVGV4dChpZCwgZXh0ZW5kZWRQYWdlLmdldFRpdGxlKCkpOwotCQkJCQkJCWV4dGVuZGVkUGFnZS5zZXRUYWJJbmRleChpZCk7Ci0JCQkJCQkJdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGV4dGVuZGVkUGFnZQotCQkJCQkJCQkJLmdldFZpZXdlcigpOwotCQkJCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcik7Ci0KLQkJCQkJCQlwYWdlcy5hZGQoZXh0ZW5kZWRQYWdlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlic1BhZ2VzID0gbmV3IFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZVtwYWdlcy5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgewotCQkJCWJzUGFnZXNbaV0gPSAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSBwYWdlcy5nZXQoaSk7Ci0JCQl9Ci0KLQkJCS8vIGJzUGFnZXMgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlW10geyBXQlNUYWIsCi0JCQkvLyBPQlNUYWIsCi0JCQkvLyBQQlNUYWIsIHByb2NUYWIgfTsKLQotCQkJLy8gaWYoZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3JJbnB1dCkgewotCQkJLy8gaW50IHBhZ2VJZCA9Ci0JCQkvLyAoKFByb2Nlc3NFZGl0b3JJbnB1dClnZXRFZGl0b3JJbnB1dCgpKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkvLyBpZihwYWdlSWQgIT0gLTEpIHsKLQkJCS8vIHNldEFjdGl2ZVBhZ2UoMCk7Ci0JCQkvLyBzZXRBY3RpdmVQYWdlKHBhZ2VJZCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0KLQkJCWlucHV0Q2hhbmdlZChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFjdGl2ZVBhZ2UoaW50IHBhZ2VJbmRleCkgewotCQlzdXBlci5zZXRBY3RpdmVQYWdlKHBhZ2VJbmRleCk7Ci0KLQkJLy8gd29yayBhcm91bmQgZm9yIGFjdGl2ZSBwYWdlIHRoYXQgaXMgbm90IGEgZm9ybSBwYWdlLiBTdXBlciBtZXRob2QKLQkJLy8gZG9lcyBub3QgY2FsbCBwYWdlQ2hhbmdlKCkgaW4gdGhpcyBjYXNlCi0JCS8vCi0JCWhhbmRsZVBhZ2VDaGFuZ2UoKTsKLQkJaWYgKHBhZ2VJbmRleCA+IDAgJiYgYnNQYWdlcy5sZW5ndGggPD0gcGFnZUluZGV4KSB7Ci0JCQlWaWV3ZXIgdmlld2VyID0gYnNQYWdlc1twYWdlSW5kZXhdLmdldFZpZXdlcigpOwotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCUlTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJaWYgKGdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9ySW5wdXQpIHsKLQkJCQkJaW5pdGlhbFNlbGVjdGlvbiA9ICgoUHJvY2Vzc0VkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpKQotCQkJCQkJCS5nZXRJbml0aWFsU2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJCWlmIChpbml0aWFsU2VsZWN0aW9uID09IG51bGwpIHsKLQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZWxlY3Rpb24gPSBpbml0aWFsU2VsZWN0aW9uOwotCQkJCX0KLQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3Ijc2V0QWN0aXZlUGFnZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJRm9ybVBhZ2Ugc2V0QWN0aXZlUGFnZShTdHJpbmcgcGFnZUlkKSB7Ci0JCWludCBpZCA9IC0xOwotCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBwYWdlID0gcGFnZXMuZ2V0KGkpOwotCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBJRm9ybVBhZ2UpIHsKLQkJCQlJRm9ybVBhZ2UgZnBhZ2UgPSAoSUZvcm1QYWdlKSBwYWdlOwotCQkJCWlmIChmcGFnZS5nZXRJZCgpLmVxdWFscyhwYWdlSWQpKSB7Ci0JCQkJCWlkID0gaTsKLQkJCQkJYWN0aXZlUGFnZSA9IGZwYWdlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYoaWQgPT0gLTEpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnNQYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCVByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBwYWdlID0gYnNQYWdlc1tpXTsKLQkJCQlpZiAocGFnZS5nZXRJZCgpLmVxdWFscyhwYWdlSWQpKSB7Ci0JCQkJCWlkID0gcGFnZS5nZXRUYWJJbmRleCgpOwotCQkJCQlhY3RpdmVQYWdlID0gcGFnZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKGlkID09IC0xICYmIGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25UYWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIHBhZ2UgPSBleHRlbnNpb25UYWJzW2ldOwotCQkJCWlmIChwYWdlLmdldElkKCkuZXF1YWxzKHBhZ2VJZCkpIHsKLQkJCQkJaWQgPSBwYWdlLmdldFRhYkluZGV4KCk7Ci0JCQkJCWFjdGl2ZVBhZ2UgPSBwYWdlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZihhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCXNldEFjdGl2ZVBhZ2UoaWQpOwotCQkJcmV0dXJuIGFjdGl2ZVBhZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVQYWdlQ2hhbmdlKCkgewotCQlpbnQgaWQgPSBnZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChpZCAhPSAtMSkgewotCQkJT2JqZWN0IHBhZ2UgPSBwYWdlcy5nZXQoaWQpOwotCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzRGVzY3JpcHRpb24pIHsKLQkJCQkoKFByb2Nlc3NEZXNjcmlwdGlvbikgcGFnZSkuc2V0Rm9ybVRleHQoKTsKLQkJCX0KLQkJCWlmIChpZCA9PSBXQlNUYWIuZ2V0VGFiSW5kZXgoKSkgewotCQkJCXNldEN1cnJlbnRWaWV3ZXIoV0JTVGFiLmdldFZpZXdlcigpKTsKLQkJCX0gZWxzZSBpZiAoaWQgPT0gT0JTVGFiLmdldFRhYkluZGV4KCkpIHsKLQkJCQlzZXRDdXJyZW50Vmlld2VyKE9CU1RhYi5nZXRWaWV3ZXIoKSk7Ci0JCQl9IGVsc2UgaWYgKGlkID09IFBCU1RhYi5nZXRUYWJJbmRleCgpKSB7Ci0JCQkJc2V0Q3VycmVudFZpZXdlcihQQlNUYWIuZ2V0Vmlld2VyKCkpOwotCQkJfSBlbHNlIGlmIChpZCA9PSBwcm9jVGFiLmdldFRhYkluZGV4KCkpIHsKLQkJCQlzZXRDdXJyZW50Vmlld2VyKHByb2NUYWIuZ2V0Vmlld2VyKCkpOwotCQkJfSBlbHNlIGlmIChleHRlbnNpb25UYWJzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvblRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGV4dGVuc2lvblRhYnNbaV0gIT0gbnVsbCAmJiBpZCA9PSBleHRlbnNpb25UYWJzW2ldLmdldFRhYkluZGV4KCkpCi0JCQkJCQlzZXRDdXJyZW50Vmlld2VyKGV4dGVuc2lvblRhYnNbaV0uZ2V0Vmlld2VyKCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc2V0Q3VycmVudFZpZXdlcihudWxsKTsKLQkJCX0KLQotCQkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCQlwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBuZXdQYWdlSW5kZXgpIHsKLQkJc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOwotCQloYW5kbGVQYWdlQ2hhbmdlKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGNvbnRleHQgbWVudSBmb3IgdGhlIGdpdmUgdmlld2VyCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yKGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKLQkJTWVudSBtZW51ID0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIHZpZXdlcik7Ci0KLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCXNldFNlbGVjdGlvbihzZWwpOwotCQkJfQotCQl9KTsKLQotCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0xJTksgfCBETkQuRFJPUF9DT1BZOwotCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0JCXZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsCi0JCQkJbmV3IFByb2Nlc3NFZGl0b3JEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q3VycmVudFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIElmIGl0IGlzIGNoYW5naW5nLi4uCi0JCS8vCi0JCWlmIChjdXJyZW50Vmlld2VyICE9IHZpZXdlcikgewotCQkJaWYgKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQkJLy8gQ3JlYXRlIHRoZSBsaXN0ZW5lciBvbiBkZW1hbmQuCi0JCQkJLy8KLQkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJLy8gVGhpcyBqdXN0IG5vdGlmaWVzIHRob3NlIHRoaW5ncyB0aGF0IGFyZSBhZmZlY3RlZCBieSB0aGUKLQkJCQkJLy8gc2VjdGlvbi4KLQkJCQkJLy8KLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgKLQkJCQkJCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgc2VsZWN0aW9uQ2hhbmdlZEV2ZW50KSB7Ci0JCQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCS8vIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBvbGQgb25lLgotCQkJLy8KLQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKLQkJCQljdXJyZW50Vmlld2VyCi0JCQkJCQkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0KLQkJCS8vIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmV3IG9uZS4KLQkJCS8vCi0JCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0KLQkJCS8vIFJlbWVtYmVyIGl0LgotCQkJLy8KLQkJCWN1cnJlbnRWaWV3ZXIgPSB2aWV3ZXI7Ci0KLQkJCS8vIFNldCBhZGFwdGVyIGZhY3Rvcnkgb2YgZWRpdGluZ0RvbWFpbiB0byB0aGF0IG9mIHRoZSBjdXJyZW50IHZpZXcKLQkJCS8vCi0JCQlpZiAoY3VycmVudFZpZXdlciBpbnN0YW5jZW9mIFByb2Nlc3NWaWV3ZXIpIHsKLQkJCQlJQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9ICgoUHJvY2Vzc1ZpZXdlcikgY3VycmVudFZpZXdlcikKLQkJCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCQlpZiAoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIHsKLQkJCQkJQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgPSAoKEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXIpOwotCQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyCi0JCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIEVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJCQkoKEVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLnNldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllZGl0aW5nRG9tYWluLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJfQotCi0JCQkJCWlmIChwcm9wQ29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJCXByb3BDb250ZW50UHJvdmlkZXIuc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBTZXQgdGhlIGVkaXRvcnMgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdlcidzCi0JCQkvLyBzZWxlY3Rpb24uCi0JCQkvLwotCQkJc2V0U2VsZWN0aW9uKGN1cnJlbnRWaWV3ZXIgPT0gbnVsbCA/IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkKLQkJCQkJOiBjdXJyZW50Vmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgZ2V0UGFyZW50QWN0aXZpdHkoQnJlYWtkb3duRWxlbWVudCBlLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJQWN0aXZpdHkgYWN0ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShlKTsKLQkJaWYgKGFjdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWN0OwotCQl9Ci0KLQkJLy8gVE9ETzogaGFuZGxlIGVsZW1lbnQgdGhhdCBkb2VzIG5vdCBkaXJlY3RseSBiZWxvbmcgdG8gYW4gYWN0aXZpdHkKLQkJLy8gKGxpa2UgZGVsaXZlcmFibGUgcGFydCBvZiBhIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3IpCi0JCS8vCi0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKLQkJcmV0dXJuICgoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIHZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKSkKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKFZpZXdlciB2aWV3ZXIsCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBvdGhlclNlbCwgYm9vbGVhbiBhbHRlcm5hdGVTZWxlY3Rpb24pIHsKLQkJaWYgKGFsdGVybmF0ZVNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJT2JqZWN0IGN1cnJlbnRTZWxlY3Rpb24gPSBudWxsOwotCQkJaWYgKHNlbC5zaXplKCkgPT0gMSkgewotCQkJCWN1cnJlbnRTZWxlY3Rpb24gPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKGN1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9IGdldFBhcmVudEFjdGl2aXR5KAotCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBjdXJyZW50U2VsZWN0aW9uLAotCQkJCQkJCWdldEFkYXB0ZXJGYWN0b3J5KChTdHJ1Y3R1cmVkVmlld2VyKSB2aWV3ZXIpKTsKLQkJCQkJaWYgKGFjdCAhPSBvdGhlclNlbC5nZXRGaXJzdEVsZW1lbnQoKSkgewotCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihvdGhlclNlbCwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24ob3RoZXJTZWwsIHRydWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdmlld2VyLnNldFNlbGVjdGlvbihvdGhlclNlbCwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzeW5jaHJvbml6aW5nU2VsZWN0aW9uKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyAvLyBjaGVjayBpZiB0aGUgcmVzb3VyY2VzIG9mIHNlbGVjdGVkIG9iamVjdHMgYXJlIG91dCBvZiBzeW5jaCBvciBhbnkKLQkJLy8gb2YgdGhlIHNlbGVjdGVkIG9iamVjdHMKLQkJLy8gLy8gYmVjYW1lIHByb3h5IHRoZW4gcmVmcmVzaCB0aGVtIGlmIG5lZWRlZAotCQkvLyAvLwotCQkvLyBpZihyZWZyZXNoT3V0T2ZTeW5jaChzZWxlY3Rpb24pKSB7Ci0JCS8vIHJldHVybjsKLQkJLy8gfQotCi0JCXZpZXdTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCUFycmF5TGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyTGlzdAotCQkJCQkuZ2V0KGkpOwotCQkJbGlzdGVuZXIKLQkJCQkJLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsKLQkJfQotCi0JCS8vIHN5bmNocm9uaXplIHNlbGVjdGlvbiBpbiBhbGwgQlMgdmlld3MgaWYgb25seSBvbmUgZWxlbWVudCBpcyBzZWxlY3RlZAotCQkvLwotCQlzeW5jaHJvbml6ZVNlbGVjdGlvbihzZWxlY3Rpb24sIGN1cnJlbnRWaWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHJlZnJlc2hPdXRPZlN5bmNoKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWJvb2xlYW4gcmVmcmVzaFJlcXVpcmVkID0gZmFsc2U7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCUhhc2hTZXQgcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJRU9iamVjdCBlT2JqZWN0ID0gKChFT2JqZWN0KSBlKTsKLQkJCQkJaWYgKGVPYmplY3QuZUlzUHJveHkoKSkgewotCQkJCQkJZU9iamVjdCA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvbHZlKGVPYmplY3QpOwotCQkJCQkJcmVmcmVzaFJlcXVpcmVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVPYmplY3QuZVJlc291cmNlKCk7Ci0JCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghcmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCUFycmF5TGlzdCByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUFycmF5TGlzdCBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCVJlc291cmNlVXRpbC5jaGVja091dE9mU3luY2hSZXNvdXJjZXMocmVzb3VyY2VzLAotCQkJCQkJcmVtb3ZlZFJlc291cmNlcywgY2hhbmdlZFJlc291cmNlcyk7Ci0JCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCAhY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJYm9vbGVhbiByZXQgPSBwcm9tcHRSZWxvYWRGaWxlcygpOwotCQkJCQlpZiAocmV0KSB7Ci0JCQkJCQkvLyB1bmxvYWQgdGhlIHJlbW92ZWQgcmVzb3VyY2VzCi0JCQkJCQkvLwotCQkJCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgaXRlcgotCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlyZXNvdXJjZS51bmxvYWRXaXRob3V0UmVtb3ZlKCk7Ci0JCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlDb2xsZWN0aW9uIHJlbG9hZGVkUmVzb3VyY2VzID0gbnVsbDsKLQkJCQkJCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkvLyBSZWxvYWQgdGhlIGNoYW5nZWQgcmVzb3VyY2VzLgotCQkJCQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJCQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJCQkJcmVsb2FkZWRSZXNvdXJjZXMgPSBtYW5hZ2VyCi0JCQkJCQkJCQkJLnJlbG9hZFJlc291cmNlcyhjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQkJCQkJfHwgcmVsb2FkZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJCXJlZnJlc2hSZXF1aXJlZCA9IHRydWU7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHJlZnJlc2ggb3V0LW9mLXN5bmNoIHJlc291cmNlcwotCQkJCQkJLy8KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoYW5nZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaCgKLQkJCQkJCQkJCShSZXNvdXJjZSkgaXRlci5uZXh0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlZnJlc2hSZXF1aXJlZCkgewotCQkJCWN1cnJlbnRWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3luY2hyb25pemVTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIFZpZXdlciBjdXJyZW50Vmlld2VyKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6aW5nU2VsZWN0aW9uID0gdHJ1ZTsKLQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwKLQkJCQkJJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQlpZiAoc2VsLnNpemUoKSA9PSAxKSB7Ci0JCQkJCU9iamVjdCBzZWxlY3RlZCA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gb3RoZXJTZWwgPSBudWxsOwotCQkJCQlib29sZWFuIGFsdGVybmF0ZVNlbGVjdGlvbiA9IGZhbHNlOwotCQkJCQlBcnJheUxpc3Qgc2VsZWN0ZWRQYXRoID0gbnVsbDsKLQkJCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgoU3RydWN0dXJlZFZpZXdlcikgY3VycmVudFZpZXdlcik7Ci0JCQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlpZiAoKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgc2VsZWN0ZWQpCi0JCQkJCQkJCS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQkJCQkvLyBnZXQgcGF0aAotCQkJCQkJCQkvLwotCQkJCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKHNlbGVjdGVkKTsKLQkJCQkJCQkJc2VsZWN0ZWRQYXRoID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHNlbGVjdGVkOwotCQkJCQkJCQlkbyB7Ci0JCQkJCQkJCQlzZWxlY3RlZFBhdGguYWRkKDAsIGUpOwotCQkJCQkJCQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGUpOwotCQkJCQkJCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50OwotCQkJCQkJCQkJCWUgPSBUbmdVdGlsLnVud3JhcChwYXJlbnQpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJCQkJCS5hZGFwdCgKLQkJCQkJCQkJCQkJCQkJcGFyZW50LAotCQkJCQkJCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJCQkJCWUgPSBwYXJlbnQ7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gd2hpbGUgKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAocHJvY1RhYi5nZXRWaWV3ZXIoKSA9PSBjdXJyZW50Vmlld2VyKSB7Ci0JCQkJCQkJc2VsZWN0ZWQgPSBUbmdVdGlsLnVud3JhcChzZWxlY3RlZCk7Ci0JCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWQpOwotCQkJCQkJfSBlbHNlIGlmIChleHRlbnNpb25UYWJzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvblRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJaWYgKGV4dGVuc2lvblRhYnNbaV0uZ2V0Vmlld2VyKCkgPT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCQkJc2VsZWN0ZWQgPSBUbmdVdGlsLnVud3JhcChzZWxlY3RlZCk7Ci0JCQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQkJCQkJc2VsZWN0ZWQpOwotCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJaWYgKHByb2NUYWIuZ2V0Vmlld2VyKCkgIT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCXByb2NUYWIuZ2V0Vmlld2VyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJfQotCQkJCQkJaWYgKGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uVGFicy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlpZiAoZXh0ZW5zaW9uVGFic1tpXS5nZXRWaWV3ZXIoKSAhPSBjdXJyZW50Vmlld2VyKQotCQkJCQkJCQkJZXh0ZW5zaW9uVGFic1tpXS5nZXRWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oCi0JCQkJCQkJCQkJCXNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCQkJfHwgc2VsZWN0ZWQgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCQkJCQlvdGhlclNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlBY3Rpdml0eSBhY3QgPSBnZXRQYXJlbnRBY3Rpdml0eSgKLQkJCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBzZWxlY3RlZCwgYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCWlmIChhY3QgIT0gbnVsbCkgewotCQkJCQkJCQlvdGhlclNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGFjdCk7Ci0JCQkJCQkJCWFsdGVybmF0ZVNlbGVjdGlvbiA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChvdGhlclNlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBvd24gZWxlbWVudCBpcyBzZWxlY3RlZAotCQkJCQkJLy8KLQkJCQkJCVZpZXdlciB2aWV3ZXIgPSBXQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKHZpZXdlciwgb3RoZXJTZWwsCi0JCQkJCQkJCQkJYWx0ZXJuYXRlU2VsZWN0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl2aWV3ZXIgPSBPQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKHZpZXdlciwgb3RoZXJTZWwsCi0JCQkJCQkJCQkJYWx0ZXJuYXRlU2VsZWN0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl2aWV3ZXIgPSBQQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcih2aWV3ZXIsIG90aGVyU2VsLAotCQkJCQkJCQkJCWFsdGVybmF0ZVNlbGVjdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGVkUGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBpbmhlcml0ZWQgZWxlbWVudCBpcyBzZWxlY3RlZAotCQkJCQkJLy8KLQkJCQkJCVZpZXdlciB2aWV3ZXIgPSBXQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaW5kU2VsZWN0aW9uKAotCQkJCQkJCQkJc2VsZWN0ZWRQYXRoLCBXQlNUYWIuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCQl2aWV3ZXIgPSBPQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaW5kU2VsZWN0aW9uKAotCQkJCQkJCQkJc2VsZWN0ZWRQYXRoLCBPQlNUYWIuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCQl2aWV3ZXIgPSBQQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaW5kU2VsZWN0aW9uKAotCQkJCQkJCQkJc2VsZWN0ZWRQYXRoLCBQQlNUYWIuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCQl2aWV3ZXIgPSBwcm9jVGFiLmdldFZpZXdlcigpOwotCQkJCQkJaWYgKHZpZXdlciAhPSBjdXJyZW50Vmlld2VyKSB7Ci0JCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmluZFNlbGVjdGlvbigKLQkJCQkJCQkJCXNlbGVjdGVkUGF0aCwgcHJvY1RhYi5nZXRBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uVGFicy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQl2aWV3ZXIgPSBleHRlbnNpb25UYWJzW2ldLmdldFZpZXdlcigpOwotCQkJCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCQkJCQlmaW5kU2VsZWN0aW9uKAotCQkJCQkJCQkJCQkJCXNlbGVjdGVkUGF0aCwKLQkJCQkJCQkJCQkJCQlleHRlbnNpb25UYWJzW2ldCi0JCQkJCQkJCQkJCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQkJCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXN5bmNocm9uaXppbmdTZWxlY3Rpb24gPSBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIE9iamVjdCBmaW5kU2VsZWN0aW9uKExpc3Qgc2VsZWN0ZWRQYXRoLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaW50IHNpemUgPSBzZWxlY3RlZFBhdGguc2l6ZSgpOwotCQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlPYmplY3QgZSA9IHNlbGVjdGVkUGF0aC5nZXQoMCk7Ci0JCU9iamVjdCBzZWxlY3Rpb24gPSBlOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGUsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuKGUpOwotCQlmaW5kX3NlbGVjdGlvbjogZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKLQkJCWUgPSBzZWxlY3RlZFBhdGguZ2V0KGkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gZSkgewotCQkJCQlzZWxlY3Rpb24gPSBjaGlsZDsKLQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQkJCWNoaWxkLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQljaGlsZHJlbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZSk7Ci0JCQkJCWNvbnRpbnVlIGZpbmRfc2VsZWN0aW9uOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrIGZpbmRfc2VsZWN0aW9uOwotCQl9Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0JLy8gSW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIKLQkvLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2dldFNlbGVjdGlvbigpCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gdmlld1NlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyI2dldEVkaXRpbmdEb21haW4oKQotCSAqLwotCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyI2dldFZpZXdlcigpCi0JICovCi0JcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0JCXJldHVybiBjdXJyZW50Vmlld2VyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXIgZmFjdG9yeSBvZiB0aGUgY3VycmVudCBwYWdlIGlmIHRoZXJlIGlzIGFueQotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCUFkYXB0ZXIgRmFjdG9yeSBvZiB0aGUgY3VycmVudCBwYWdlIG9mIHRoZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCUlGb3JtUGFnZSBwYWdlID0gZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCWlmIChwYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIHBhZ2UpCi0JCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lciNtZW51QWJvdXRUb1Nob3cob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCSgoSU1lbnVMaXN0ZW5lcikgZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkpCi0JCQkJLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7Ci0JCQotCQkvLyBwb3B1bGF0ZSBjb250cmlidXRlZCBtZW51IGl0ZW1zCi0JCS8vCi0JCUlGb3JtUGFnZSBhY3RpdmVQYWdlID0gZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCWlmKGFjdGl2ZVBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIHsKLQkJCUlBY3Rpb25bXSBhY3Rpb25zID0gKChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpYWN0aXZlUGFnZSkuZ2V0QWRkaXRpb25hbEFjdGlvbnMoKTsKLQkJCWlmKGFjdGlvbnMgIT0gbnVsbCAmJiBhY3Rpb25zLmxlbmd0aCA+IDApIHsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgbmV3IFNlcGFyYXRvcigpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUFjdGlvbiBhY3Rpb24gPSBhY3Rpb25zW2ldOwotCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQkJCQlpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiBhY3Rpb24gaW5zdGFuY2VvZiBCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24pIHsKLQkJCQkJCSgoQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uKWFjdGlvbikuc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCQkJCX0KLQkJCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElXb3JrYmVuY2hQYXJ0QWN0aW9uKSB7Ci0JCQkJCQkoKElXb3JrYmVuY2hQYXJ0QWN0aW9uKSBhY3Rpb24pCi0JCQkJCQkJCS5zZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KHRoaXMpOwotCQkJCQl9Ci0JCQkJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBwcm9wZXJ0eSBzaGVldCBwYWdlCi0JICogQHJldHVybgotCSAqIAkJCVByb3BlcnR5U2hlZXQgUGFnZQotCSAqLwotCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7Ci0JCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZSA9IG5ldyBFUEZQcm9wZXJ0eVNoZWV0UGFnZSh0aGlzKTsKLQkJCS8vIHsKLQkJCS8vIHB1YmxpYyB2b2lkIG1ha2VDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwKLQkJCS8vIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSVN0YXR1c0xpbmVNYW5hZ2VyCi0JCQkvLyBzdGF0dXNMaW5lTWFuYWdlcikgewotCQkJLy8gc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLAotCQkJLy8gc3RhdHVzTGluZU1hbmFnZXIpOwotCQkJLy8gfQotCQkJLy8KLQkJCS8vIHB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQkJLy8gc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLQkJCS8vIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOwotCQkJLy8gfQotCQkJLy8gfTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2V0dGluZyBwcm92aWRlciAiKTsKLQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKLQkJCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSAoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpICgoUHJvY2Vzc1ZpZXdlcikgY3VycmVudFZpZXdlcikKLQkJCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCQlwcm9wQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQkJY29udGVudFByb3ZpZGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCXByb3BlcnR5U2hlZXRQYWdlCi0JCQkJCQkuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihwcm9wQ29udGVudFByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvcGVydHlTaGVldFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgewotCQlpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7Ci0JCQlyZXR1cm4gZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yI2dldENvbnRyaWJ1dG9ySWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udHJpYnV0b3JJZCgpIHsKLQkJcmV0dXJuIGdldFNpdGUoKS5nZXRJZCgpOwotCX0KLQotCQotCS8qKgotCSAqIFJldHVybiBjb2x1bW4gZGVzY3JpcHRvciBsaXN0IGZvciBnaXZlbiBzdHJpbmcKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqIAkJCWxpc3Qgb2YgY29sdW1uIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBFTGlzdCB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KFN0cmluZyBzdHIpIHsKLQkJRUxpc3QgY29sdW1uRGVzY3JpcHRvcnMgPSBuZXcgQmFzaWNFTGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCU9iamVjdCBjb2x1bW5EZXNjcmlwdG9yID0gUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcAotCQkJCQkuZ2V0KHRva2VuKTsKLQkJCWlmIChjb2x1bW5EZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQljb2x1bW5EZXNjcmlwdG9ycy5hZGQoY29sdW1uRGVzY3JpcHRvcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbHVtbkRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhcnJheSBvZiBjb2x1bW4gZGVzY3JpcHRvcnMgZm9yIHRoZSBnaXZlbiBzdHJpbmcKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqIAkJCWxpc3Qgb2YgY29sdW1uIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2x1bW5EZXNjcmlwdG9yW10gdG9Db2x1bW5EZXNjcmlwdG9ycyhTdHJpbmcgc3RyKSB7Ci0JCUxpc3QgbGlzdCA9IHRvQ29sdW1uRGVzY3JpcHRvckxpc3Qoc3RyKTsKLQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbnMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShjb2x1bW5zKTsKLQkJcmV0dXJuIGNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNnZXRDdXJyZW50UGFnZSgpCi0JICovCi0JcHVibGljIGludCBnZXRDdXJyZW50UGFnZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEN1cnJlbnRQYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHN1cHByZXNzaW9uIGluZm8KLQkgKi8KLQlwdWJsaWMgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKSB7Ci0JCXJldHVybiBzdXBwcmVzc2lvbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29uZmlnQ2hhbmdlZCgpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChjb25maWcgIT0gY3VycmVudENvbmZpZykgewotCQkJLy8gcmVmcmVzaCBvbmx5IGlmIHRoZSBhY3RpdmUgcGFydCBpcyB0aGlzIGVkaXRvciBvciBkaWFncmFtIGVkaXRvcgotCQkJLy8gb2YgYW55IGFjdGl2aXR5IGluIHRoaXMgcHJvY2VzcwotCQkJLy8KLQkJCUlXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkKLQkJCQkJLmdldFBhcnRTZXJ2aWNlKCkuZ2V0QWN0aXZlUGFydCgpOwotCQkJYm9vbGVhbiByZWZyZXNoID0gYWN0aXZlUGFydCA9PSB0aGlzOwotCQkJaWYgKCFyZWZyZXNoKSB7Ci0JCQkJaWYgKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGlucHV0ID0gKEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCkgKChJRWRpdG9yUGFydCkgYWN0aXZlUGFydCkKLQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJcmVmcmVzaCA9IGlucHV0LmdldFN1cHByZXNzaW9uKCkuZ2V0UHJvY2VzcygpID09IHNlbGVjdGVkUHJvY2VzczsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCWN1cnJlbnRDb25maWcgPSBjb25maWc7Ci0JCQkJcmVmcmVzaEFsbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCAhPSBnZXRFZGl0b3JJbnB1dCgpKSB7Ci0JCQlpbnB1dENoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXN1cGVyLnNldElucHV0KGlucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI3VwZGF0ZVBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYWdlcygpIHsKLQkJLy8gcmVtb3ZlIGFuZCBhZGQgZGVzY3JpcHRpb24gcGFnZSBpZiB0aGUgbW9kZWwueG1pIG9yIGNvbnRlbnQueG1pIG9mCi0JCS8vIHRoZSBwcm9jZXNzIGhhdmUgYmVlbiBjaGFuZ2VkCi0JCS8vCi0JCVJlc291cmNlIG1vZGVsUmVzb3VyY2UgPSBzZWxlY3RlZFByb2Nlc3MuZVJlc291cmNlKCk7Ci0JCVJlc291cmNlIGNvbnRlbnRSZXNvdXJjZSA9IHNlbGVjdGVkUHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKQotCQkJCS5lUmVzb3VyY2UoKTsKLQkJaWYgKGNoYW5nZWRSZXNvdXJjZXMuY29udGFpbnMobW9kZWxSZXNvdXJjZSkKLQkJCQl8fCAoY29udGVudFJlc291cmNlICE9IG51bGwgJiYgY2hhbmdlZFJlc291cmNlcwotCQkJCQkJLmNvbnRhaW5zKGNvbnRlbnRSZXNvdXJjZSkpKSB7Ci0JCQlyZW1vdmVQYWdlKDApOwotCQkJdHJ5IHsKLQkJCQlhZGREZXNjcmlwdGlvblBhZ2UoKTsKLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JNc2csIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKGlucHV0Q2hhbmdlZCkgewotCQkJaW5wdXRDaGFuZ2VkKGdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCQlwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZWZyZXNoQWxsKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaEFsbCgpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlkb1JlZnJlc2hBbGwodHJ1ZSk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2ggYWxsIHZpZXdlcnMgCi0JICogQHBhcmFtIHVwZGF0ZUlEcwotCSAqIAkJCWlmIHRydWUsIHRoZW4gcmVmcmVzaCBhbGwgaW5kZXggaW4gdmlld2VycwotCSAqLwotCXB1YmxpYyB2b2lkIGRvUmVmcmVzaEFsbChib29sZWFuIHVwZGF0ZUlEcykgewotCQlpZiAodXBkYXRlSURzKSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJUHJvY2Vzc1V0aWwudXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBzZWxlY3RlZFByb2Nlc3MpOwotCQkJUHJvY2Vzc1V0aWwucmVmcmVzaFByZWRlY2Nlc3Nvckxpc3RzKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQlzZWxlY3RlZFByb2Nlc3MpOwotCi0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJUHJvY2Vzc1V0aWwudXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBzZWxlY3RlZFByb2Nlc3MpOwotCQl9Ci0KLQkJV0JTVGFiLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJT0JTVGFiLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJUEJTVGFiLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJcHJvY1RhYi5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0KLQkJaWYgKGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25UYWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZXh0ZW5zaW9uVGFic1tpXS5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgewotCQkJcHJvcGVydHlTaGVldFBhZ2UucmVmcmVzaCgpOwotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogUmVmcmVzaCBhbGwgb3BlbiBwcm9jZXNzIGVkaXRvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQWxsUHJvY2Vzc0VkaXRvcnMoKSB7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQkJKChQcm9jZXNzRWRpdG9yKSBlZGl0b3IpLmRvUmVmcmVzaEFsbChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI2dldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIElGb3JtUGFnZSBnZXRBY3RpdmVQYWdlSW5zdGFuY2UoKSB7Ci0JCWludCBpbmRleCA9IGdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJcmV0dXJuIHN1cGVyLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBic1BhZ2VzW2luZGV4IC0gMV07Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBzdXBlci5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCQlpZiAoc3VwcHJlc3Npb24uaXNTYXZlTmVlZGVkKCkKLQkJCQkmJiAhbW9kaWZpZWRSZXNvdXJjZXMuY29udGFpbnMoc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQkuZVJlc291cmNlKCkpKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50LmVSZXNvdXJjZSgpKTsKLQkJfQotCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwocmVzb3VyY2VzVG9TYXZlKTsKLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzdXBwcmVzc2lvbi5zYXZlVG9Nb2RlbCgpOwotCQlzdXBlci5kb1NhdmUobW9uaXRvcik7Ci0JCXN1cHByZXNzaW9uLnNhdmVJc0RvbmUoKTsKLQkJcmVzb3VyY2VzVG9TYXZlLmNsZWFyKCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWlmIChzdXBwcmVzc2lvbi5pc1NhdmVOZWVkZWQoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzRGlydHkoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNmaXJlUHJvcGVydHlDaGFuZ2UoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgcHJvcGVydHlJZCkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHlJZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNnZXRVc2VkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRVc2VkUmVzb3VyY2VzKCkgewotCQlIYXNoU2V0IHVzZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JCS8vIG1vZGVsLnhtaQotCQkvLwotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVsZW1lbnRPYmouZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQl1c2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQotCQkvLyBjb250ZW50LnhtaQotCQkvLwotCQlyZXNvdXJjZSA9IHNlbGVjdGVkUHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXVzZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJfQotCi0JCS8vIGNvbmZpZ3VyYXRpb24ueG1pCi0JCS8vCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gc2VsZWN0ZWRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJcmVzb3VyY2UgPSBjb25maWcuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXVzZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlc291cmNlcyBvZiBvdGhlciBwcm9jZXNzZXMgdGhhdCB0aGlzIHByb2Nlc3MgaXMgZGVwZW5kaW5nIG9uCi0JCS8vCi0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gV0JTVGFiLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihhZGFwdGVyRmFjdG9yeSwKLQkJCQlzZWxlY3RlZFByb2Nlc3MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCXJlc291cmNlID0gKChFT2JqZWN0KSBvYmopLmVSZXNvdXJjZSgpOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXVzZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlsYXN0VXNlZFJlc291cmNlcyA9IHVzZWRSZXNvdXJjZXM7Ci0KLQkJcmV0dXJuIHVzZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciBzZWxlY3RlZCBvYmplY3RzIGNhbiBiZSByZXZlYWxlZCBvciBub3QgYW5kIHJldHVucyByZXN1bHQKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogCQkJTGlzdCBvZiBvYmplY3RzCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogCQkJQWRhcHRlciBmYWN0b3J5IG9mIHRoZSBzZWxlY3RlZCBvYmplY3RzCi0JICogQHBhcmFtIHN1cHByZXNzaW9uCi0JICogCQkJU3VwcHJlc3Npb24gaW5mb3JtYXRpb24KLQkgKiBAcmV0dXJuCi0JICogCQlCb29sZWFuIHZhbHVlIHRvIGluZGljYXRlIHdoZXRoZXIgc2VsZWN0ZWQgb2JqZWN0cyBjYW4gYmUgcmV2ZWFsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuUmV2ZWFsKENvbGxlY3Rpb24gc2VsZWN0aW9uLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCS8vIGNoZWNrIGlmIHJldmVhbGluZyB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgd2lsbCBjYXVzZSBuYW1lIGR1cGxpY2F0aW9uCi0JCS8vCi0JCVN0cmluZyBtc2cgPSBzdXBwcmVzc2lvbi5jaGVja0R1cGxpY2F0ZU5hbWVBZnRlclJldmVhbChzZWxlY3Rpb24sCi0JCQkJYWRhcHRlckZhY3RvcnkpOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfUmV2ZWFsX1RpdGxlLCAvLyROT04tTkxTLTEkIAotCQkJCQltc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgcmV2ZWFsaW5nIHRoZSBzZWxlY3RlZCBlbGVtZW50cyB3aWxsIGNhdXNlIGR1cGxpY2F0ZQotCQkvLyBkZXNjcmlwdG9ycy4KLQkJLy8gSWYgc28sIHByb21wdCB1c2VyIHRvIGRlbGV0ZSB0aGUgZHVwbGljYXRlcyBiZWZvcmUgY29udGludWluZy4KLQkJLy8KLQkJQ29sbGVjdGlvbiBkdXBsaWNhdGVzID0gUHJvY2Vzc1V0aWwKLQkJCQkuZ2V0RHVwbGljYXRlRGVzY3JpcHRvcnNBZnRlclJldmVhbChzZWxlY3Rpb24pOwotCQlpZiAoIWR1cGxpY2F0ZXMuaXNFbXB0eSgpKSB7Ci0JCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGR1cGxpY2F0ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRGVzY3JpcHRvciBkZXNjID0gKERlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCVN0cmluZyBkZXNjVHh0ID0gVG5nVXRpbC5nZXRUeXBlVGV4dChkZXNjKQotCQkJCQkJKyAiOiAiICsgZGVzYy5nZXRQcmVzZW50YXRpb25OYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKS5nZXRJZCgpLCAwLCBkZXNjVHh0LCBudWxsKSk7Ci0JCQl9Ci0JCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9SZXZlYWxfVGl0bGUsIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbCwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXN0YXR1cykgPT0gRGlhbG9nLkNBTkNFTCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLy8gZGVsZXRlIGR1cGxpY2F0ZSBkZXNjcmlwdG9ycwotCQkJdHJ5IHsKLQkJCQlQcm9jZXNzRGVsZXRlQWN0aW9uLmRlbGV0ZShkdXBsaWNhdGVzKTsKLQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc0luaGVyaXRlZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCS8vIHByZWZlcmVuY2UgaXMgbWFuYWdlZCBieSBsaWJyYXJ5IHBsdWdpbiwKLQkJLy8gc2luY2UgdGhpcyBwcmVmZXJlbmNlcyBpcyBhbHNvIHVzZWQgZm9yIGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nCi0JCS8vIEppbmh1YSBYaSAwOC8yMS8yMDA2Ci0JCS8vIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJLy8gLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJcmV0dXJuIHN0b3JlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Qcm9jZXNzRWRpdG9ySW5wdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OWM1NzhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLQotLyoqCi0gKiBBbiBlZGl0b3IgaW5wdXQgZm9yIHByb2Nlc3MgZWRpdG9yCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWRpdG9ySW5wdXQgZXh0ZW5kcyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgewotCXByaXZhdGUgSVNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uOwotCXByaXZhdGUgaW50IGFjdGl2ZVBhZ2UgPSAtMTsKLQotCXB1YmxpYyBQcm9jZXNzRWRpdG9ySW5wdXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhY3RpdmUgcGFnZSBvZiB0aGUgZWRpdG9yCi0JICovCi0JcHVibGljIGludCBnZXRBY3RpdmVQYWdlKCkgewotCQlyZXR1cm4gYWN0aXZlUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYWN0aXZlIHBhZ2UgZm9yIHRoZSBlZGl0b3IKLQkgKiBAcGFyYW0gYWN0aXZlUGFnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoaW50IGFjdGl2ZVBhZ2UpIHsKLQkJdGhpcy5hY3RpdmVQYWdlID0gYWN0aXZlUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gaW5pdGlhbCBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICogCQkJU2VsZWN0aW9uCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0SW5pdGlhbFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGluaXRpYWxTZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogU2V0IGluaXRpYWwgc2VsZWN0aW9uIAotCSAqIEBwYXJhbSBpbml0aWFsU2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pIHsKLQkJdGhpcy5pbml0aWFsU2VsZWN0aW9uID0gaW5pdGlhbFNlbGVjdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjMjcyNTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgbWV0aG9kLCBwcm9jZXNzIGFuZCBhY3Rpdml0eSBkaWFncmFtIGVkaXRvcnMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWJzdHJhY3RCYXNlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BYnN0cmFjdEJhc2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTliMjM0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BYnN0cmFjdEJhc2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyOwotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBVSSBmaWx0ZXJzLiBTdXBwb3J0cyBtdWx0aXBsZSBmaWx0ZXJzLgotICogU3VwcG9ydCBmaWx0ZXJpbmcgdGhlIGVsZW1lbnQgYmFzZWQgb24gdGhlIHBhdHRlcm4gYW5kIHR5cGUuIAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdEJhc2VGaWx0ZXIgewotCi0JcHJvdGVjdGVkIEZpbHRlckhlbHBlciBoZWxwZXI7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlcltdIGFkZGl0aW9uYWxGaWx0ZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIGFkZGVkIGZvciBmdXRoZXIgZmlsdGVyaW5nLiBGb3IgZXhhbXBsZSwgd2UgbWF5IHNldCBhIGZpbGVyIHRvIHByZXZlbnQKLQkgKiBnZW5lcmFsaXplcnMgYXMgYmFzZSBlbGVtZW50IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKiAKLQkgKiBAcGFyYW0gYWRkaXRpb25hbEZpbHRlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsRmlsdGVycyhJRmlsdGVyW10gYWRkaXRpb25hbEZpbHRlcnMpIHsKLQkJdGhpcy5hZGRpdGlvbmFsRmlsdGVycyA9IGFkZGl0aW9uYWxGaWx0ZXJzOwotCX0KLQotCXB1YmxpYyBGaWx0ZXJIZWxwZXIgZ2V0SGVscGVyKCkgewotCQlyZXR1cm4gaGVscGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlbHBlcihGaWx0ZXJIZWxwZXIgaGVscGVyKSB7Ci0JCXRoaXMuaGVscGVyID0gaGVscGVyOwotCX0KLQotCS8qCi0JICogc3ViY2xhc3MgbWV0aG9kIHNob3VsZCBjYWxsIHRoaXMgYmVmb3JlIHJldHVybmluZyB0cnVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0KLQkJLy8gSmluaHVhIFhpLCBhZGRlZCBmb3IgZnV0aGVyIGZpbHRlcmluZy4KLQkJLy8gRm9yIGV4YW1wbGUsIHdlIG1heSBzZXQgYSBmaWxlciB0byBwcmV2ZW50IGdlbmVyYWxpemVycyBhcyBiYXNlCi0JCS8vIGVsZW1lbnQgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeQotCQlpZiAoYWRkaXRpb25hbEZpbHRlcnMgIT0gbnVsbCAmJiBhZGRpdGlvbmFsRmlsdGVycy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZGl0aW9uYWxGaWx0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGFkZGl0aW9uYWxGaWx0ZXJzW2ldLmFjY2VwdChvYmopID09IGZhbHNlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjc3ZDU2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLS8qKgotICogQWN0aXZpdHkgdmFyaWFiaWxpdHkgZmlsdGVyCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXIgZXh0ZW5kcyBFeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IgewotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBMaXN0IHRyZWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTGlzdCBnZW5lcmFsaXplcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0IGJhc2VlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIExpc3QgYmFkZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVRhYmxlVmlld2VyIHZpZXdlciwgU3RyaW5nIHRhYk5hbWUsIEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQkKLQkJLy8gbG9hZCB0aGUgcGFyZW50bGlzdAotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJRmlsdGVyVXRpbC5nZXRTdWJUcmVlKGFkYXB0ZXIsIGFjdGl2aXR5LCB0cmVlTGlzdCk7Ci0JCUZpbHRlclV0aWwuZ2V0R2VuZXJhbGl6ZXJzKHRyZWVMaXN0LCBnZW5lcmFsaXplcnMpOwotCQlGaWx0ZXJVdGlsLmdldFZhcmlhYmlsaXR5QmFzZSh0cmVlTGlzdCwgYmFzZWVsZW1lbnRzKTsKLQkJCi0JCUZpbHRlclV0aWwuZ2V0U3ViVHJlZShhZGFwdGVyLCBnZW5lcmFsaXplcnMsIGJhZGVsZW1lbnRzKTsKLQkJRmlsdGVyVXRpbC5nZXRTdWJUcmVlKGFkYXB0ZXIsIGJhc2VlbGVtZW50cywgYmFkZWxlbWVudHMpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWlmIChzdXBlci5hY2NlcHQob2JqKSkgcmV0dXJuIHRydWU7Ci0JCXJldHVybiBjaGlsZEFjY2VwdChvYmopOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlpZiAoKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSl7Ci0JCQkJaWYodGhpcy5hY3Rpdml0eS5lcXVhbHMoKEFjdGl2aXR5KSBvYmopKSAKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKChBY3Rpdml0eSlvYmopLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZihlICE9IG51bGwgJiYgYWN0aXZpdHkuZXF1YWxzKGUpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCVByb2Nlc3Mgc3JjUHJvYyA9IFRuZ1V0aWwKLQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBvYmopOwotCQkJCVByb2Nlc3MgdGFyZ2V0UHJvYyA9IFRuZ1V0aWwKLQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSB0aGlzLmFjdGl2aXR5KTsKLQkJCQlpZiAoc3JjUHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcwotCQkJCQkJJiYgdGFyZ2V0UHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJaWYoVG5nVXRpbC5jb250YWlucyhnZW5lcmFsaXplcnMsIG9iaikgCi0JCQkJCQl8fCBUbmdVdGlsLmNvbnRhaW5zKGJhc2VlbGVtZW50cywgb2JqKQotCQkJCQkJfHxUbmdVdGlsLmNvbnRhaW5zKGJhZGVsZW1lbnRzLCBvYmopKXsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCQotLy8JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2VzcykgewotLy8JCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIG9iajsKLS8vCQkJCWlmIChwcm9jLmVxdWFscyhUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGhpcy5hY3Rpdml0eSkpKQotLy8JCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfQotLy8JCQlpZihvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0vLwkJCQlpZihUbmdVdGlsLmNvbnRhaW5zKGNvbnRyaWJ1dG9ycywgb2JqKSkgcmV0dXJuIGZhbHNlOwotLy8JCQkJaWYoVG5nVXRpbC5jb250YWlucyh2YXJpYWJpbGl0eWJhc2VzLCBvYmopKSByZXR1cm4gZmFsc2U7Ci0vLwkJCQlpZihvYmouZXF1YWxzKEZpbHRlclV0aWwuZ2V0UGFyZW50QWN0aXZpdHkoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgCi0vLwkJCQkJCWFjdGl2aXR5KSkpIHJldHVybiBmYWxzZTsKLS8vCQkJfQotCQkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWRkTGlua0ZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWRkTGlua0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwY2ZkNWExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FkZExpbmtGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklBbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogRmlsdGVyIGZvciBBZGRMaW5rIGluIFJpY2hUZXh0RWRpdG9yLgotICogCi0gKi8KLQotcHVibGljIGNsYXNzIEFkZExpbmtGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGaWx0ZXIgaW1wbGVtZW50cyBJQWxsRmlsdGVyIHsKLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQotCQkvLyBpZiBjYW4ndCBiZSBhY2NkZXB0ZWQgYnkgc3VwZXIsIHJldHVybi4KLQkJaWYob2JqID09IG51bGwgKXJldHVybiBmYWxzZTsKLQkJCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBmaWx0ZXJUeXBlU3RyaW5nID0gaGVscGVyLmdldEZpbHRlclR5cGVTdHIoKTsKLQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50ID0gaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCk7Ci0KLQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgIT0gbnVsbCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucygKLQkJCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKG9iaikpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsCi0JCQkJJiYgIShvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50IHx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpKSB7Ci0JCQlpZiAob2JqLmVxdWFscyhoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGZpbHRlclR5cGVTdHJpbmcgPT0gbnVsbAotCQkJCXx8IGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMpCi0JCQkJfHwgZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlMpKSB7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqKSkgewotCQkJCQlpZiAoKChDdXN0b21DYXRlZ29yeSkgb2JqKS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkJCQkuaXNFbXB0eSgpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWZvciAoSXRlcmF0b3IgaW9yID0gbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gaW9yLm5leHQoKTsKLQkJCQkJaWYgKCgoQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCkpCi0JCQkJCQlpb3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCQlyZXR1cm4gISgoRGlzY2lwbGluZUdyb3VwaW5nKSBvYmopLmdldERpc2NpcGxpbmVzKCkuaXNFbXB0eSgpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKW9iaikuaXNFbXB0eSgpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCQlyZXR1cm4gISgoUm9sZVNldEdyb3VwaW5nKSBvYmopLmdldFJvbGVTZXRzKCkuaXNFbXB0eSgpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXRSb2xlU2V0R3JvdXBzKChSb2xlU2V0KW9iaikuaXNFbXB0eSgpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCi0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cCIpKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRG9tYWluKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5UT09MUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVG9vbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9MRVMpKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVEFTS1MpKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGFzaykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSkpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlIHx8IG9iaiBpbnN0YW5jZW9mIFRhc2sKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QgfHwgb2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlBST0NFU1NFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJCWlmICgoKENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpKQotCQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdENhdGVnb3JpZXNHcm91cChPYmplY3Qgb2JqLCBTdHJpbmcgdHlwZSkgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICgoKENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopLmVxdWFscygKLQkJCQkJdHlwZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BbGxGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FsbEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDk3YjJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FsbEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklBbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBGaWx0ZXIgZm9yIGFsbCBlbGVtZW50cyBlZzogdXNlZCBpbiB7QGxpbmsgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlfSAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGaWx0ZXIgaW1wbGVtZW50cyBJQWxsRmlsdGVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUFsbEZpbHRlciNnZXRPYmplY3QoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIGlmIGNhbid0IGJlIGFjY2RlcHRlZCBieSBzdXBlciwgcmV0dXJuLgotCQlpZiAoIXN1cGVyLmFjY2VwdChvYmopKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlTdHJpbmcgZmlsdGVyVHlwZVN0cmluZyA9IGhlbHBlci5nZXRGaWx0ZXJUeXBlU3RyKCk7Ci0JCU9iamVjdCBjb250ZW50RWxlbWVudCA9IGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCi0JCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpICE9IG51bGwpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMoCi0JCQkJCQkoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbAotCQkJCSYmICEob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCB8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSkgewotCQkJaWYob2JqID09IG51bGwpewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibnVsbCIpOwotCQkJfQotCQkJaWYgKG9iai5lcXVhbHMoaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmaWx0ZXJUeXBlU3RyaW5nID09IG51bGwKLQkJCQl8fCBmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKQotCQkJCXx8IGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TKQotCQkJCXx8IGZpbHRlclR5cGVTdHJpbmcKLQkJCQkJCS5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLk9OTFlfQ09OVEVOVF9FTEVNRU5UUykpIHsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmopKSB7Ci0JCQkJCWlmICgoKEN1c3RvbUNhdGVnb3J5KSBvYmopLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkJCS5pc0VtcHR5KCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikgcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJaWYgKE1ldGhvZEVsZW1lbnRVdGlsLmdldEFsbE1vZGVscyhjb250ZW50RWxlbWVudCkKLQkJCQkJCQkJLmNvbnRhaW5zKG9iaikpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciBpb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBpb3IubmV4dCgpOwotCQkJCQlpZiAoKChDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKSkKLQkJCQkJCWlvci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkvLwkJCi0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQkJcmV0dXJuICEoKERpc2NpcGxpbmVHcm91cGluZykgb2JqKS5nZXREaXNjaXBsaW5lcygpLmlzRW1wdHkoKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ly8gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSlvYmopLmlzRW1wdHkoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIikpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykgewotCQkJCXJldHVybiAhKChSb2xlU2V0R3JvdXBpbmcpIG9iaikuZ2V0Um9sZVNldHMoKS5pc0VtcHR5KCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJCXJldHVybiB0cnVlOy8vIEFzc29jaWF0aW9uSGVscGVyLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpb2JqKS5pc0VtcHR5KCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cCIpKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERvbWFpbikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVE9PTFMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUb29sKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0xFUykpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVEFTS1MpKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2spCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUykpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFKSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSB8fCBvYmogaW5zdGFuY2VvZiBUYXNrCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0IHx8IG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKQotCQkJCXJldHVybiB0cnVlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJCWlmICgoKENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpKQotCQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpCi0JCQkJLy9yZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gY2hpbGRBY2NlcHQob2JqKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYob2JqIGluc3RhbmNlb2YgTWlsZXN0b25lKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vIHB1YmxpYyBGaWx0ZXJIZWxwZXIgZ2V0SGVscGVyKCkgewotCS8vIHJldHVybiBoZWxwZXI7Ci0JLy8gfQotCS8vCi0JLy8JCi0JLy8gcHVibGljIHZvaWQgc2V0SGVscGVyKEZpbHRlckhlbHBlciBoZWxwZXIpIHsKLQkvLyB0aGlzLmhlbHBlciA9IGhlbHBlcjsKLQkvLyB9Ci0JcHJvdGVjdGVkIExpc3QgZ2V0QW5jZXN0b3JzKEN1c3RvbUNhdGVnb3J5IG1ldGhvZE9iamVjdCkgewotCQlMaXN0IGFuY2VzdG9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlMaXN0IG9iakxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW9iakxpc3QuYWRkKG1ldGhvZE9iamVjdCk7Ci0KLQkJZ2V0QW5jZXN0b3JzKGFuY2VzdG9yTGlzdCwgb2JqTGlzdCk7Ci0KLQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBbmNlc3RvcnMoTGlzdCBhbmNlc3Rvckxpc3QsIExpc3QgbWV0aG9kT2JqZWN0TGlzdCkgewotCQlpZiAobWV0aG9kT2JqZWN0TGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gYW5jZXN0b3JMaXN0OwotCi0JCUxpc3QgYWxsUGFyZW50Q3VzdENhdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUN1c3RvbUNhdGVnb3J5IGVsZW1lbnQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJTGlzdCBwYXJlbnRMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhlbGVtZW50KTsKLQkJCWFsbFBhcmVudEN1c3RDYXRzLmFkZEFsbChwYXJlbnRMaXN0KTsKLQotCQl9Ci0KLQkJYW5jZXN0b3JMaXN0LmFkZEFsbChtZXRob2RPYmplY3RMaXN0KTsKLQkJTGlzdCBuZXh0Q2hlY2tMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxQYXJlbnRDdXN0Q2F0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWFuY2VzdG9yTGlzdC5jb250YWlucyhlbGVtZW50KSkKLQkJCQluZXh0Q2hlY2tMaXN0LmFkZChlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBnZXRBbmNlc3RvcnMoYW5jZXN0b3JMaXN0LCBuZXh0Q2hlY2tMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRNZXRob2RQbHVnaW4oT2JqZWN0IG9iaiwgT2JqZWN0IGNvbnRlbnRFbGVtZW50KSB7Ci0JCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KS5jb250YWlucyhvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKE9iamVjdCBvYmosIFN0cmluZyB0eXBlKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQlDb2xsZWN0aW9uIGxpc3QgPSAoKENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaikuZXF1YWxzKAotCQkJCQl0eXBlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9DYXRlZ29yeUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQ2F0ZWdvcnlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGNmOGNhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9DYXRlZ29yeUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEZpbHRlciBmb3Ige0BsaW5rIENvbnRlbnRDYXRlZ29yeX0KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeUZpbHRlciBleHRlbmRzIEFic3RyYWN0QmFzZUZpbHRlciBpbXBsZW1lbnRzCi0JCUlDYXRlZ29yeUZpbHRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDYXRlZ29yeUZpbHRlciNnZXRDYXRlZ29yeVBhY2thZ2VQYXRoKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q2F0ZWdvcnlQYWNrYWdlUGF0aCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRQYXRoQmFzZWRPblRhYlN0cmluZyhoZWxwZXIuZ2V0Q29udGVudENhdGVnb3J5VGFiU3RyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUNhdGVnb3J5RmlsdGVyI2dldE9iamVjdCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gaWYgY2FuJ3QgYmUgYWNjZGVwdGVkIGJ5IHN1cGVyLCByZXR1cm4uCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghaGVscGVyLmNoZWNrT2JqZWN0QWNjZXB0ZWQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gaGVscGVyLmFjY2VwdE1ldGhvZFBsdWdpbihvYmopOwotCQl9Ci0JCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Db250ZW50RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Db250ZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0NjkwNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQ29udGVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0KLS8qKgotICogRmlsdGVyIGltcGxlbWVudHMge0BsaW5rIElDb250ZW50RmlsdGVyfS4gRmlsdGVyIGNvbnRlbnQgZWxlbWVudCBpbiBjb250ZW50IHBhY2thZ2UuIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RCYXNlRmlsdGVyIGltcGxlbWVudHMgSUNvbnRlbnRGaWx0ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ29udGVudEZpbHRlciNnZXRDb250ZW50UGFja2FnZVBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb250ZW50UGFja2FnZVBhdGgoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0UGF0aEJhc2VkT25UYWJTdHJpbmcoaGVscGVyLmdldFRhYlN0cigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDb250ZW50RmlsdGVyI2dldE9iamVjdCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gaWYgY2FuJ3QgYmUgYWNjZGVwdGVkIGJ5IHN1cGVyLCByZXR1cm4uCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGZ1cnRoZXIgZmlsdGVyaW5nCi0JCWlmICghaGVscGVyLmNoZWNrT2JqZWN0QWNjZXB0ZWQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gaGVscGVyLmFjY2VwdE1ldGhvZFBsdWdpbihvYmopOwotCQl9Ci0KLQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCXJldHVybiBoZWxwZXIuYWNjZXB0Q29udGVudFBhY2thZ2Uob2JqKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0N1c3RvbUNhdGVnb3J5RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9DdXN0b21DYXRlZ29yeUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhODU0MGQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0N1c3RvbUNhdGVnb3J5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDdXN0b21GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEZpbHRlciBzcGVjaWZpYyBmb3Ige0BsaW5rIEN1c3RvbUNhdGVnb3J5fSBlbGVtZW50cy4gCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGaWx0ZXIgaW1wbGVtZW50cwotCQlJQ3VzdG9tRmlsdGVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUN1c3RvbUZpbHRlciNnZXRDb250ZW50UGFja2FnZVBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb250ZW50UGFja2FnZVBhdGgoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0UGF0aEJhc2VkT25UYWJTdHJpbmcoaGVscGVyLmdldFRhYlN0cigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDdXN0b21GaWx0ZXIjZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUN1c3RvbUZpbHRlciNnZXRTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gaWYgY2FuJ3QgYmUgYWNjZGVwdGVkIGJ5IHN1cGVyLCByZXR1cm4uCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghaGVscGVyLmNoZWNrT2JqZWN0QWNjZXB0ZWQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gaGVscGVyLmFjY2VwdE1ldGhvZFBsdWdpbihvYmopOwotCQl9Ci0KLQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGY4MDNmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0KLS8qKgotICogIE1ldGhvZCBjb25maWd1cmF0aW9uIHNwZWNpZmljIGZpbHRlciBmb3IgZmlsdGVyaW5nIGVsZW1lbnRzIGJhc2VkIG9uIGZpbHRlciBwYXR0ZXJuCi0gKiAgYW5kIHR5cGUgYWZ0ZXIgZWxlbWVudHMgYXJlIHJlYWxpemVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYWl0b24uCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIgZXh0ZW5kcyBDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCVN0cmluZyBmaWx0ZXJTdHI7Ci0KLQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLQlwcm90ZWN0ZWQgRmlsdGVySGVscGVyIGhlbHBlcjsKLQotCS8qKgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLAotCQkJVmlld2VyIHZpZXdlciwgU3RyaW5nIGZpbHRlclN0cikgewotCQlzdXBlcihtZXRob2RDb25maWcsIHZpZXdlcik7Ci0JCXRoaXMuZmlsdGVyU3RyID0gZmlsdGVyU3RyOwotCQl0aGlzLm1ldGhvZENvbmZpZ3VyYXRpb24gPSBtZXRob2RDb25maWc7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb24uZXF1YWxzKG9iaik7Ci0JCX0KLQotCQlpZiAoIXN1cGVyLmFjY2VwdChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZihoZWxwZXIgIT0gbnVsbCkgewotCQkJaWYgKGhlbHBlci5pc1Nob3dQcmVzZW50YXRpb25OYW1lKCkpIHsKLQkJCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5PblByZXNlbnRhdGlvbk5hbWUob2JqKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKCFoZWxwZXIuaXNPYmplY3RJblNlbGVjdGVkSXRlbXMob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCi0JfQotCi0JcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmosCi0JCQlvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSkgewotCQkvLyByZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqLCBjaGlsZEZlYXR1cmUpOwotCQkvLyBNb2RpZmllZCBjb2RlIHRvIGhhbmRsZSB0aGUgZmlsdGVyaW5nCi0JCS8vIHRvIGNoZWNrIGlmIHRoZSB2YXJpYWJpbGl0eSBvZiBwYXJlbnQgaXMgbm90IE4vQSwgZmlsdGVyIG91dCBhbHJlYWR5Ci0JCS8vIGV4aXNpdG5nCi0JCS8vIGVsZW1lbnQgZnJvbSBjaGlsZHJlbiBsaXN0LgotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iaiwgY2hpbGRGZWF0dXJlKTsKLQkJaWYoY29sICE9IG51bGwpewotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjb2wuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0b3IubmV4dCgpOwotCQkJaWYgKCFhY2NlcHQoZWxlbWVudCkpCi0JCQkJaXRvci5yZW1vdmUoKTsKLQkJfQotCQl9ZWxzZXsKLQkJCWNvbCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlbHBlcihGaWx0ZXJIZWxwZXIgaGVscGVyKSB7Ci0JCXRoaXMuaGVscGVyID0gaGVscGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKQotCXsKLQkJc3VwZXIuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQl0aGlzLm1ldGhvZENvbmZpZ3VyYXRpb24gPSBjb25maWc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2JjNjNkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklQcm9jZXNzRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotCi0KLS8qKgotICoge0BsaW5rIFByb2Nlc3N9IGZpbHRlciBmb3IgZmlsdGVyaW5nIHtAbGluayBQcm9jZXNzfSBlbGVtZW50cy4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JQcm9jZXNzRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RCYXNlRmlsdGVyIGltcGxlbWVudHMKLQkJSVByb2Nlc3NGaWx0ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyI2dldE9iamVjdCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gaWYgY2FuJ3QgYmUgYWNjZGVwdGVkIGJ5IHN1cGVyLCByZXR1cm4uCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghaGVscGVyLmlzT2JqZWN0SW5TZWxlY3RlZEl0ZW1zKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghbWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hdGNoUGF0dGVybihPYmplY3Qgb2JqKSB7Ci0JCS8vIGlmIG5vIHZhbGlkIGZpbHRlciB0eXBlIG9yIHBhdHRlcm4sIGFsd2F5cyByZXR1cm4gdHJ1ZQotCQlTdHJpbmcgZmlsdGVyVHlwZVN0ciA9IGhlbHBlci5nZXRGaWx0ZXJUeXBlU3RyKCk7Ci0JCS8vIFN0cmluZyBwYXR0ZXJuID0gaGVscGVyLmdldFBhdHRlcm4oKTsKLQkJU3RyaW5nIHRhYlN0ciA9IGhlbHBlci5nZXRUYWJTdHIoKTsKLQkJUGF0dGVybiByZWdleFBhdHRlcm4gPSBoZWxwZXIuZ2V0UmVnZXhQYXR0ZXJuKCk7Ci0JCWlmIChoZWxwZXIuZ2V0RmlsdGVyVHlwZVN0cigpID09IG51bGwgfHwgaGVscGVyLmdldFBhdHRlcm4oKSA9PSBudWxsCi0JCQkJfHwgaGVscGVyLmdldFBhdHRlcm4oKS5lcXVhbHNJZ25vcmVDYXNlKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKGZpbHRlclR5cGVTdHIuZXF1YWxzSWdub3JlQ2FzZSh0YWJTdHIpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJTWF0Y2hlciBtID0gcmVnZXhQYXR0ZXJuLm1hdGNoZXIoKChCcmVha2Rvd25FbGVtZW50KSBvYmopCi0JCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCQlib29sZWFuIGZvdW5kID0gbS5tYXRjaGVzKCk7Ci0JCQkJaWYgKGZvdW5kKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZWxzZSBmb3IgYWxsIG90aGVyIHR5cGVzIG9mIGVsZW1lbnRzCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJLy8gdGhlIEFsbCBjYXNlCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZXRBY3Rpdml0aWVzSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCwgTGlzdCBhY3Rpdml0eUxpc3QpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChlbGVtZW50KTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlhY3Rpdml0eUxpc3QuYWRkKHBhcmVudCk7Ci0JCQlnZXRBY3Rpdml0aWVzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudCwKLQkJCQkJYWN0aXZpdHlMaXN0KTsKLQkJfQotCX0KLQlwdWJsaWMgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBQcm9jZXNzQ29uZmlndXJhdG9yKGNvbmZpZywgbnVsbCkgfSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9FeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0V4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMTgwNjMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0V4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogQ29uZmlndXJhdGlvbiBmaWx0ZXIgdGhhdCBzdGlsbCBzaG93cyBjZXJ0YWluIGVsZW1lbnRzIGR1cmluZyBwcm9jZXNzIGF1dGhvcmluZyB0aGF0Ci0gKiBQcm9jZXNzQ29uZmlndXJhdG9yIGRvZXMgbm90IHNob3cuIEZpbHRlciBlbGVtZW50cyBiYXNlZCBvbiBzZWFyY2ggcGF0dGVybiBhbmQgdHlwZS4KLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IgZXh0ZW5kcwotCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yIHsKLQotCVN0cmluZyBmaWx0ZXJTdHI7Ci0KLQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLQlwcm90ZWN0ZWQgRmlsdGVySGVscGVyIGhlbHBlcjsKLQkvKioKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyBFeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsCi0JCQlWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKG1ldGhvZENvbmZpZywgdmlld2VyKTsKLQkJLy90aGlzLmZpbHRlclN0ciA9IGZpbHRlclN0cjsKLQkJdGhpcy5tZXRob2RDb25maWd1cmF0aW9uID0gbWV0aG9kQ29uZmlnOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCi0JCWlmKG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb24uZXF1YWxzKG9iaik7Ci0JCX0KLQotLy8JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpCi0vLwkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG1ldGhvZENvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJb2JqID0gTGlicmFyeVV0aWwudW53cmFwKG9iaik7Ci0KLS8vCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotLy8JCQlyZXR1cm4gbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhvYmopOwotLy8JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotLy8JCQlyZXR1cm4gdHJ1ZTsKLS8vCQl9IGVsc2UgewotLy8JCQlpZihMb2cuREVCVUcpIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqZWN0IGZpbHRlcmVkOiAiICsgKG9iaiA9PSBudWxsID8gbnVsbCA6IG9iai50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJfQotLy8JCX0KLQkJaWYgKGhlbHBlci5pc1Nob3dQcmVzZW50YXRpb25OYW1lKCkpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybk9uUHJlc2VudGF0aW9uTmFtZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoIWhlbHBlci5pc09iamVjdEluU2VsZWN0ZWRJdGVtcyhvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIZWxwZXIoRmlsdGVySGVscGVyIGhlbHBlcikgewotCQl0aGlzLmhlbHBlciA9IGhlbHBlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykKLQl7Ci0JCXN1cGVyLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJdGhpcy5tZXRob2RDb25maWd1cmF0aW9uID0gY29uZmlnOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0d1aWRhbmNlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9HdWlkYW5jZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNDNkOGJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0d1aWRhbmNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLQotLyoqCi0gKiBGaWx0ZXIgZm9yIHtAbGluayBHdWlkYW5jZX0gdHlwZSBlbGVtZW50cy4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VGaWx0ZXIgZXh0ZW5kcyBDb250ZW50RmlsdGVyIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLS8vCQkgV2hlbiB0eXBlIGlzIHNlbGVjdGVkIGFsbG93IHRob3NlIENsYXNzIHR5cGVzIHRvIGRpc3BsYXkuCi0JCUNsYXNzIGNscyA9IEZpbHRlckluaXRpYWxpemVyLmdldEluc3RhbmNlKCkuCi0JCQkJCQlnZXRDbGFzc0ZvclR5cGUoaGVscGVyLmdldEZpbHRlclR5cGVTdHIoKSk7Ci0JCWlmKGNscyAhPSBudWxsKXsKLQkJCWlmKGNscy5pc0luc3RhbmNlKG9iaikpewotCQkJCXJldHVybiB0cnVlOwotCQkJfWVsc2V7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIEZvciBhbGwgQ29udGVudEVsZW1lbnQgLSB0aGVzZSBndWlkYW5jZXMgYXJlIGFzc29jaWF0ZWQKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENoZWNrbGlzdCB8fCBvYmogaW5zdGFuY2VvZiBDb25jZXB0Ci0JCQkJfHwgb2JqIGluc3RhbmNlb2YgRXhhbXBsZSB8fCBvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwKLQkJCQl8fCBvYmogaW5zdGFuY2VvZiBHdWlkZWxpbmUgfHwgb2JqIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCS8vIEZvciB0YXNrIGV4dHJhIGd1aWRhbmNlcwotCQlpZihoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKSBpbnN0YW5jZW9mIFRhc2spewotCQkJaWYob2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvciAKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIEZvciB3b3JrUHJvZHVjdCBFeHRyYSBndWlkYW5jZXMuCi0JCWlmKGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpewotCQkJaWYob2JqIGluc3RhbmNlb2YgUmVwb3J0IHx8IG9iaiBpbnN0YW5jZW9mIFRlbXBsYXRlCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IgCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc0FjdGl2aXR5RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzQWN0aXZpdHlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmU1MTU3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzQWN0aXZpdHlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLQotLyoqCi0gKiBBY3Rpdml0eSBGaWx0ZXIgZm9yIGRvaW5nIFByb2Nlc3MgY29weS9leHRlbmQKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NBY3Rpdml0eUZpbHRlciBleHRlbmRzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgY29tbWFuZCA9IDA7Ci0KLQlwcml2YXRlIEFjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXIgZGVsZWdhdGVGaWx0ZXI7Ci0KLQlwdWJsaWMgUHJvY2Vzc0FjdGl2aXR5RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSwgQWN0aXZpdHkgYWN0aXZpdHksIGludCBjb21tYW5kKSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQl0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotCQlkZWxlZ2F0ZUZpbHRlciA9IG5ldyBBY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lLCBhY3Rpdml0eSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciNzZXRIZWxwZXIob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVscGVyKEZpbHRlckhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIuc2V0SGVscGVyKGhlbHBlcik7Ci0JCWRlbGVnYXRlRmlsdGVyLnNldEhlbHBlcihoZWxwZXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gYW55IGFjdGl2aXR5IGNhbiBiZSBkZWVwLWNvcGllZAotCQkvLwotCQlpZihjb21tYW5kID09IElBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZICYmIAotCQkJCShvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmopOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQotCQl9Ci0JCQotLy8JCWlmICgob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0vLwkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0vLwkJCQkvLyBpZiBzb3VyY2UgYW5kIHRhZ2V0IGlzIHNhbWUgcHJvY2VzcywgYmxvY2sgaXQKLS8vCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCk7Ci0vLwkJCQlpZiAoISh0aGlzLmNvbW1hbmQgPT0gSUFjdGlvblR5cGVQcm92aWRlci5DT1BZKSkgewotLy8JCQkJCWlmIChwcm9jLmVxdWFscyh0aGlzLmFjdGl2aXR5KSkKLS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0vLwkJCQkvLyBpZiBzb3VyY2UgYW5kIHRhZ2V0IGlzIHNhbWUgcHJvY2VzcywgYmxvY2sgaXQKLS8vCQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSBvYmo7Ci0vLwkJCQlpZiAoISh0aGlzLmNvbW1hbmQgPT0gSUFjdGlvblR5cGVQcm92aWRlci5DT1BZKSkgewotLy8JCQkJCWlmIChwcm9jLmVxdWFscyh0aGlzLmFjdGl2aXR5KSkKLS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCQlpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotLy8JCQkJUHJvY2VzcyBzcmNQcm9jID0gVG5nVXRpbAotLy8JCQkJCQkuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgb2JqKTsKLS8vCQkJCVByb2Nlc3MgdGFyZ2V0UHJvYyA9IFRuZ1V0aWwKLS8vCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIHRoaXMuYWN0aXZpdHkpOwotLy8JCQkJaWYgKHNyY1Byb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MKLS8vCQkJCQkJJiYgdGFyZ2V0UHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0vLwkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0vLwkJCQlQcm9jZXNzIHByb2MgPSAoUHJvY2Vzcykgb2JqOwotLy8JCQkJaWYgKHByb2MuZXF1YWxzKHRoaXMuYWN0aXZpdHkpKQotLy8JCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfQotLy8KLS8vCQkJcmV0dXJuIHRydWU7Ci0vLwkJfSBlbHNlCi0vLwkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlzd2l0Y2goY29tbWFuZCkgewotCQkJCWNhc2UgSUFjdGlvblR5cGVQcm92aWRlci5FWFRFTkQ6Ci0JCQkJCXJldHVybiBkZWxlZ2F0ZUZpbHRlci5hY2NlcHQob2JqKTsKLQkJCQljYXNlIElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWToKLQkJCQkJLy8gZGlzYWxsb3cgY29weWluZyBmcm9tIGRlbGl2ZXJ5IHByb2Nlc3MgdG8gY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCQkJCS8vCi0JCQkJCVByb2Nlc3Mgc3JjUHJvYyA9IG51bGw7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkvLyBpZiBzb3VyY2UgYW5kIHRhZ2V0IGlzIHNhbWUgcHJvY2VzcywgYmxvY2sgaXQKLQkJCQkJCXNyY1Byb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgb2JqOwotCQkJCQkJc3JjUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiZSk7Ci0JCQkJCX0KLQkJCQkJaWYoc3JjUHJvYyAhPSBudWxsKSB7Ci0JCQkJCQlQcm9jZXNzIHRhcmdldFByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGhpcy5hY3Rpdml0eSk7Ci0JCQkJCQlpZiAoc3JjUHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcwotCQkJCQkJCQkmJiB0YXJnZXRQcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc0d1aWRhbmNlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzR3VpZGFuY2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmVkNGU1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzR3VpZGFuY2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkd1aWRhbmNlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0KLS8qKgotICogR3VpZGFuY2UgRmlsdGVyIGZvciBXb3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUuIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzR3VpZGFuY2VGaWx0ZXIgZXh0ZW5kcyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0KLQlwdWJsaWMgUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSkgewotCQlzdXBlcihjb25maWcsIHZpZXdlciwgdGFiTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmopOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZUl0ZW1Qcm92aWRlcikpIHsKLQkJCUNvbGxlY3Rpb24gY29sID0gKChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgb2JqKS5nZXRDaGlsZHJlbihvYmopOwotCQkJaWYgKGNvbC5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZWxzZQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NSb2xlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzUm9sZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Y2JlY2E1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NSb2xlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5Sb2xlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLQotLyoqCi0gKiBGaWx0ZXJzIHtAbGluayBSb2xlU2V0fSwge0BsaW5rIFJvbGVTZXRHcm91cGluZ30gaW4gc3BlY2lmaWMge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259Ci0gKiBiYXNlZCBvbiBzZWFyY2ggcGF0dGVybi4gCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1JvbGVGaWx0ZXIgZXh0ZW5kcyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0KLQlwdWJsaWMgUHJvY2Vzc1JvbGVGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFRhYmxlVmlld2VyIHZpZXdlciwKLQkJCVN0cmluZyB0YWJOYW1lKSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0JCQlpZiAoKChDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSBvYmopLmdldFRleHQob2JqKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGVJdGVtUHJvdmlkZXIpIHx8IChvYmogaW5zdGFuY2VvZiBSb2xlKQotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJaWYob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKXsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSAoVG5nVXRpbC5nZXRDb250cmlidXRvcnMoKFZhcmlhYmlsaXR5RWxlbWVudClvYmopKTsKLQkJCWlmKGl0ZXIgIT0gbnVsbCl7Ci0JCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpewotCQkJCQlSb2xlU2V0R3JvdXBpbmcgZ3JvdXBpbmcgPSAoUm9sZVNldEdyb3VwaW5nKWl0ZXIubmV4dCgpOwotCQkJCQkvLyBUT0RPIDogQ2hlY2sgZm9yIChyZWN1cnNpdmUpUm9sZVNldHMgaXMgZW1wdHksIAotCQkJCQkvLyBpZiByb2xlc2V0J3Mgcm9sZXMgYXJlIGVtcHR5IGRvbm90IHNob3cgRGlzY2lwbGluZSBncm91cGluZyAKLQkJCQkJaWYoIWdyb3VwaW5nLmdldFJvbGVTZXRzKCkuaXNFbXB0eSgpKSByZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBUT0RPIDogQ2hlY2sgZm9yIChyZWN1cnNpdmUpUm9sZVNldHMgaXMgZW1wdHksIAotCQkJLy8gaWYgcm9sZXNldCdzIHJvbGVzIGFyZSBlbXB0eSBkb25vdCBzaG93IERpc2NpcGxpbmUgZ3JvdXBpbmcgCi0JCQlyZXR1cm4gISgoUm9sZVNldEdyb3VwaW5nKW9iaikuZ2V0Um9sZVNldHMoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJaWYob2JqIGluc3RhbmNlb2YgUm9sZVNldCl7Ci0JCQlyZXR1cm4gISgoUm9sZVNldClvYmopLmdldFJvbGVzKCkuaXNFbXB0eSgpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzU3BlY2lmaWNXb3JrUHJvZHVjdEZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1NwZWNpZmljV29ya1Byb2R1Y3RGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDk1Yjk3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzU3BlY2lmaWNXb3JrUHJvZHVjdEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFdvcmtQcm9kdWN0fXMgYmFzZWQgb24ge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259IGFuZCBzZWFyY2ggcGF0dGVybi4KLSAqIGFuZCB7QGxpbmsgV29ya1Byb2R1Y3RUeXBlfSAgCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1NwZWNpZmljV29ya1Byb2R1Y3RGaWx0ZXIgZXh0ZW5kcyBQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIgewotCi0JQ2xhc3Mgd29ya1Byb2R1Y3RUeXBlID0gbnVsbDsKLQotCXB1YmxpYyBQcm9jZXNzU3BlY2lmaWNXb3JrUHJvZHVjdEZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVRhYmxlVmlld2VyIHZpZXdlciwgU3RyaW5nIHRhYk5hbWUsIENsYXNzIHR5cGUpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCQl0aGlzLndvcmtQcm9kdWN0VHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJaWYgKHdvcmtQcm9kdWN0VHlwZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlIGlmIChvYmouZ2V0Q2xhc3MoKS5lcXVhbHModGhpcy53b3JrUHJvZHVjdFR5cGUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NUYXNrRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzVGFza0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYmE3YjUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NUYXNrRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5UYXNrSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLQotLyoqCi0gKiBGaWx0ZXJzIHtAbGluayBUYXNrfXMgaW4ge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259IGJhc2VkIG9uIHNlYXJjaCBwYXR0ZXJuLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NUYXNrRmlsdGVyIGV4dGVuZHMgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JcHVibGljIFByb2Nlc3NUYXNrRmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBUYWJsZVZpZXdlciB2aWV3ZXIsCi0JCQlTdHJpbmcgdGFiTmFtZSkgewotCQlzdXBlcihjb25maWcsIHZpZXdlciwgdGFiTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJaWYgKCgoQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaikuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFRhc2tJdGVtUHJvdmlkZXIpIHx8IChvYmogaW5zdGFuY2VvZiBUYXNrKQotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpewotCQkJSXRlcmF0b3IgaXRlciA9IChUbmdVdGlsLmdldENvbnRyaWJ1dG9ycygoVmFyaWFiaWxpdHlFbGVtZW50KW9iaikpOwotCQkJaWYoaXRlciAhPSBudWxsKXsKLQkJCQl3aGlsZShpdGVyLmhhc05leHQoKSl7Ci0JCQkJCURpc2NpcGxpbmVHcm91cGluZyBncm91cGluZyA9IChEaXNjaXBsaW5lR3JvdXBpbmcpaXRlci5uZXh0KCk7Ci0JCQkJCS8vIFRPRE8gOiBDaGVjayBmb3IgKHJlY3Vyc2l2ZSlEaXNjaXBsaW5lIGlzIGVtcHR5LCAKLQkJCQkJLy8gaWYgZGlzY2lwbGluZSdzIHRhc2tzIGFyZSBlbXB0eSBkb25vdCBzaG93IERpc2NpcGxpbmUgZ3JvdXBpbmcgCi0JCQkJCWlmKCFncm91cGluZy5nZXREaXNjaXBsaW5lcygpLmlzRW1wdHkoKSkgcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJLy8gVE9ETyA6IENoZWNrIGZvciAocmVjdXJzaXZlKURpc2NpcGxpbmUgaXMgZW1wdHksIAotCQkJLy8gaWYgZGlzY2lwbGluZSdzIHRhc2tzIGFyZSBlbXB0eSBkb25vdCBzaG93IERpc2NpcGxpbmUgZ3JvdXBpbmcgCi0JCQlyZXR1cm4gISgoRGlzY2lwbGluZUdyb3VwaW5nKW9iaikuZ2V0RGlzY2lwbGluZXMoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSl7Ci0JCQlyZXR1cm4gISgoRGlzY2lwbGluZSlvYmopLmdldFRhc2tzKCkuaXNFbXB0eSgpOwotCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzVmlld0ZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1ZpZXdGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDg0NjUyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzVmlld0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlciB7QGxpbmsgUHJvY2Vzc31lcyB3aXRoaW4ge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259IHVzZWQgaW4KLSAqIHtAbGluayBJdGVtc0ZpbHRlckRpYWxvZ30uCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NWaWV3RmlsdGVyIGV4dGVuZHMgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JcHVibGljIFByb2Nlc3NWaWV3RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBWaWV3ZXIgdmlld2VyLAotCQkJU3RyaW5nIGZpbHRlclN0cikgewotCQlzdXBlcihtZXRob2RDb25maWcsIHZpZXdlciwgZmlsdGVyU3RyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBmaWx0ZXJUeXBlID0gaGVscGVyLmdldEZpbHRlclR5cGVTdHIoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChmaWx0ZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTKSkgewotCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0IHx8IG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZyk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUykpIHsKLQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSB8fCBvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGUuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuRE9NQUlOUykpIHsKLQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRG9tYWluKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlCi0JCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVMpKSB7Ci0JCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5UT09MUykpIHsKLQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgVG9vbCk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZQotCQkJCS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUykpIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUykpIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBSb2xlU2V0IHx8IG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgRG9tYWluIHx8IG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZQotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBUb29sIHx8IG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5Ci0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZwotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmc7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzNmZjMwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkRvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFdvcmtQcm9kdWN0fXMgd2l0aCBpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0uIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlciBleHRlbmRzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCXB1YmxpYyBQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlUYWJsZVZpZXdlciB2aWV3ZXIsIFN0cmluZyB0YWJOYW1lKSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0JCQlpZiAoKChDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSBvYmopLmdldFRleHQob2JqKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIikpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWlmICgoKENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKQotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcikKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgRG9tYWluKQotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBEb21haW5JdGVtUHJvdmlkZXIpCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1JlZmVyZW5jZVdvcmtGbG93RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9SZWZlcmVuY2VXb3JrRmxvd0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYmEwMWRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1JlZmVyZW5jZVdvcmtGbG93RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklBbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLQotCi0vKioKLSAqIEZpbHRlcnMgdGhlIHtAbGluayBQcm9jZXNzfXMgZm9yIHJlZmVyZW5jZSB3b3JrZmxvd3Mgb2Yge0BsaW5rIERpc2NpcGxpbmV9LiAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VXb3JrRmxvd0ZpbHRlciBleHRlbmRzIEFic3RyYWN0QmFzZUZpbHRlciBpbXBsZW1lbnRzCi0JCUlBbGxGaWx0ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQWxsRmlsdGVyI2dldE9iamVjdCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBpZiBjYW4ndCBiZSBhY2NkZXB0ZWQgYnkgc3VwZXIsIHJldHVybi4KLQkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50ID0gaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCk7Ci0JCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAob2JqLmVxdWFscyhoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgIT0gbnVsbCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucygKLQkJCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZihoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKE1ldGhvZEVsZW1lbnRVdGlsLmdldEFsbE1vZGVscyhjb250ZW50RWxlbWVudCkKLQkJCQkJCS5jb250YWlucyhvYmopKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iaikuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaW9yID0gbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpb3IubmV4dCgpOwotCQkJCWlmICgoKENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3QpLmdldENoaWxkcmVuKAotCQkJCQkJb2JqZWN0KS5pc0VtcHR5KCkpCi0JCQkJCWlvci5yZW1vdmUoKTsKLQkJCX0KLQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkpIHsKLQkJCQlpZiAoKChQcm9jZXNzUGFja2FnZSkgb2JqKS5nZXRQcm9jZXNzRWxlbWVudHMoKS5pc0VtcHR5KCkKLQkJCQkJCSYmICgoUHJvY2Vzc1BhY2thZ2UpIG9iaikuZ2V0Q2hpbGRQYWNrYWdlcygpLmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUm9sZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUm9sZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OWNjNDNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1JvbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFJvbGV9IAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRmlsdGVyIGV4dGVuZHMgQWxsRmlsdGVyIHsKLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCU9iamVjdCBjb250ZW50RWxlbWVudCA9IGdldEhlbHBlcigpLmdldENvbnRlbnRFbGVtZW50KCk7Ci0JCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAob2JqLmVxdWFscyhjb250ZW50RWxlbWVudCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGdldEhlbHBlcigpLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKSAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0SGVscGVyKCkuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghZ2V0SGVscGVyKCkubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KQotCQkJCQkJCS5jb250YWlucyhvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzBkMGU5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NSb2xlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NDb21tYW5kVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLQotLyoqCi0gKiBGaWx0ZXJzIHtAbGluayBQcm9jZXNzfSdzIHtAbGluayBSb2xlfSB3aXRoaW4ge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259Ci0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFiaWxpdHlQcm9jZXNzUm9sZUZpbHRlciBleHRlbmRzIFByb2Nlc3NSb2xlRmlsdGVyIHsKLQotCUFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQotCXB1YmxpYyBWYXJpYWJpbGl0eVByb2Nlc3NSb2xlRmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkgewotLy8JCQlpZiAoUHJvY2Vzc1V0aWwuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KHRoaXMuYWN0aXZpdHkpLmNvbnRhaW5zKG9iaikpIHsKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfSBlbHNlCi0vLwkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0VmFsaWREZXNjcmlwdG9yKG9iaiwgYWN0aXZpdHksIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpID09IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1Rhc2tGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1Rhc2tGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODA4YzY5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NUYXNrRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NDb21tYW5kVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLQotLyoqCi0gKiBGaWx0ZXJzIHtAbGluayBQcm9jZXNzfSdzIHtAbGluayBUYXNrfSB3aXRoaW4ge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmlsaXR5UHJvY2Vzc1Rhc2tGaWx0ZXIgZXh0ZW5kcyBQcm9jZXNzVGFza0ZpbHRlciB7Ci0KLQlBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7Ci0KLQlwdWJsaWMgVmFyaWFiaWxpdHlQcm9jZXNzVGFza0ZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVRhYmxlVmlld2VyIHZpZXdlciwgU3RyaW5nIHRhYk5hbWUsIEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpIHsKLS8vCQkJaWYgKFByb2Nlc3NVdGlsLmdldFZhcmlhYmlsaXR5RWxlbWVudCh0aGlzLmFjdGl2aXR5KS5jb250YWlucyhvYmopKSB7Ci0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0gZWxzZQotLy8JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldFZhbGlkRGVzY3JpcHRvcihvYmosIGFjdGl2aXR5LCBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSA9PSBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvVmFyaWFiaWxpdHlQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQyYzJiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Qcm9jZXNzQ29tbWFuZFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFByb2Nlc3N9J3Mge0BsaW5rIFdvcmtQcm9kdWN0fSB3aXRoaW4ge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyIGV4dGVuZHMKLQkJUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyIHsKLQotCUFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQotCXB1YmxpYyBWYXJpYWJpbGl0eVByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVRhYmxlVmlld2VyIHZpZXdlciwgU3RyaW5nIHRhYk5hbWUsIEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpIHsKLS8vCQkJaWYgKFByb2Nlc3NVdGlsLmdldFZhcmlhYmlsaXR5RWxlbWVudCh0aGlzLmFjdGl2aXR5KS5jb250YWlucyhvYmopKSB7Ci0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0gZWxzZQotLy8JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldFZhbGlkRGVzY3JpcHRvcihvYmosIGFjdGl2aXR5LCBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSA9PSBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Xb3JrUHJvZHVjdEZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvV29ya1Byb2R1Y3RGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ2MjEzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Xb3JrUHJvZHVjdEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiBGaWx0ZXJzIHtAbGluayBXb3JrUHJvZHVjdH0gYmFzZWQgb24gc2VhcmNoIHBhdHRlcm4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RGaWx0ZXIgZXh0ZW5kcyBDb250ZW50RmlsdGVyIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5OGQ0NzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZmlsdGVycyBmb3IgdGhlIG1ldGhvZCBhbmQgcHJvY2VzcyBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQXNzb2NpYXRpb25Gb3JtUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Fzc29jaWF0aW9uRm9ybVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTVlZTE1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQXNzb2NpYXRpb25Gb3JtUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkVkaXRvcnNDb250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotCi0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBBc3NvY2lhdGlvbiB0eXBlIGZvcm0gcGFnZXMgaW4gdGhlIE1ldGhvZCBlZGl0b3JzLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NvY2lhdGlvbkZvcm1QYWdlIGV4dGVuZHMgQmFzZUZvcm1QYWdlIGltcGxlbWVudHMgSU1lbnVMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX1BSRUZJWCA9ICJBdXRob3JpbmdVSS4iOyAvLyROT04tTkxTLTEkCQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlclNlbGVjdGVkOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChvYmplY3QpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXJTZWxlY3RlZDI7Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChvYmplY3QpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXJTZWxlY3RlZDM7Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlclNlbGVjdGVkMyA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChvYmplY3QpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGFTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHZpZXdlcl9zZWxlY3RlZCwgdmlld2VyX3NlbGVjdGVkMiwgdmlld2VyX3NlbGVjdGVkMzsKLQotCXByb3RlY3RlZCBUYWJsZSBjdHJsX3NlbGVjdGVkLCBjdHJsX3NlbGVjdGVkMiwgY3RybF9zZWxlY3RlZDM7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfYWRkLCBjdHJsX3JlbW92ZSwgY3RybF9hZGQyLCBjdHJsX3JlbW92ZTIsIGN0cmxfYWRkMywKLQkJCWN0cmxfcmVtb3ZlMzsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF91cDEsIGN0cmxfZG93bjEsIGN0cmxfdXAyLCBjdHJsX2Rvd24yLCBjdHJsX3VwMywKLQkJCWN0cmxfZG93bjM7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX2JyaWVmRGVzYzsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9zZWxlY3QsIGN0cmxfY2xlYXI7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IHVzZWRDYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIExhYmVsIGxhYmVsX0NhdGVnb3J5LCBsYWJlbF9DYXRlZ29yeTIsIGxhYmVsX0NhdGVnb3J5MzsKLQotCXByaXZhdGUgYm9vbGVhbiB1c2VDYXRlZ29yeTEgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIHVzZUNhdGVnb3J5MiA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXNlQ2F0ZWdvcnkzID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBhbGxvd0NoYW5nZTEgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGFsbG93Q2hhbmdlMiA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWxsb3dDaGFuZ2UzID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDIgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDMgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24yID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjMgPSBmYWxzZTsKLQotCXByaXZhdGUgTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbiBsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uOwotCS8vIHN0cmluZ3MgdXNlZCBpbiB0aGUgZm9ybQotCXByb3RlY3RlZCBTdHJpbmcgZm9ybU5hbWVQcmVmaXggPSAiRm9ybSBwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlY3Rpb25OYW1lID0gIlNlY3Rpb24gbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgc2VjdGlvbkRlc2MgPSAiU2VjdGlvbiBkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgc2VsZWN0ZWRMYWJlbCA9ICJTZWxlY3RlZCBMYWJlbCAxIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBzZWxlY3RlZExhYmVsMiA9ICJTZWxlY3RlZCBMYWJlbCAyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBzZWxlY3RlZExhYmVsMyA9ICJTZWxlY3RlZCBMYWJlbCAzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gRGF0YSBtb2RlbCBtZXRob2RzLgotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IG5ld0l0ZW1zKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgbmV3SXRlbXMpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwzKEFycmF5TGlzdCBuZXdJdGVtcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3Qgcm1JdGVtcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMyhBcnJheUxpc3Qgcm1JdGVtcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVVcEl0ZW1zSW5TZWxlY3RlZEl0ZW1zMShBcnJheUxpc3QgbW92ZVVwSXRlbXMpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlRG93bkl0ZW1zSW5TZWxlY3RlZEl0ZW1zMShBcnJheUxpc3QgbW92ZURvd25JdGVtcykgewotCX0KLQkKLQkvLyBWaWV3ZXIgbWV0aG9kcy4KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKCkgewotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gImNvbnRlbnRlbGVtZW50Ijt9IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nMigpIHsKLQkJcmV0dXJuIGdldFRhYlN0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nMygpIHsKLQkJcmV0dXJuIGdldFRhYlN0cmluZygpOwotCX0KLQotCS8qCi0JICogZ2V0RmlsdGVyVHlwZXMgc2hvdWxkIGJlIG92ZXJyaWRlIHRvIHBhc3MgdHlwZXMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlclR5cGVzKCl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKgotCSAqIGdldEZpbHRlclR5cGVzIHNob3VsZCBiZSBvdmVycmlkZSB0byBwYXNzIHR5cGVzLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJUeXBlczIoKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qCi0JICogZ2V0RmlsdGVyVHlwZXMgc2hvdWxkIGJlIG92ZXJyaWRlIHRvIHBhc3MgdHlwZXMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlclR5cGVzMygpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkvLyBGaWx0ZXIgaW5mby4KLQlwcm90ZWN0ZWQgSUZpbHRlciBmaWx0ZXIsIGZpbHRlcjIsIGZpbHRlcjM7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMigpIHsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIzKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCS8vIE9yZGVyaW5nIG9mIGNvbnRyaWJ1dGVkIGNhdGVnb3JpemVkIGVsZW1lbnRzIGluIGN1c3RvbQotCS8vIGNhdGVnb3JpZXMKLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfb3JkZXJpbmc7Ci0KLQlwcm90ZWN0ZWQgQ29tYm9WaWV3ZXIgdmlld2VyX3NvcnQxOwotCQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXJTb3J0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCUxpc3Q8U3RyaW5nPiBzb3J0VHlwZXNMaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldENhdGVnb3J5U29ydFR5cGVzKCk7Ci0JCQlyZXR1cm4gc29ydFR5cGVzTGlzdC50b0FycmF5KCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXJTb3J0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCVN0cmluZyBzdHIgPSAoKFN0cmluZylvYmplY3QpOwotCQkJCXJldHVybiBDYXRlZ29yeVNvcnRIZWxwZXIuZ2V0U29ydFR5cGVEaXNwbGF5TmFtZShzdHIpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uRm9ybVBhZ2UoRm9ybUVkaXRvciBlZGl0b3IsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoZWRpdG9yLCBpZCwgbmFtZSk7Ci0JCXRoaXMuZWRpdG9yVGFiTmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0KLQkJVUlIZWxwZXIuc2V0Rm9ybVRleHQoZm9ybSwgY29udGVudEVsZW1lbnQpOwotCQkKLQkJLy8gQ3JlYXRlIGEgc2VjdGlvbi4KLQkJYVNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksIFNlY3Rpb24uVElUTEVfQkFSCi0JCQkJfCBTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRCk7Ci0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCWFTZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQlhU2VjdGlvbi5zZXRUZXh0KGdldFNlY3Rpb25OYW1lKCkpOwotCQlhU2VjdGlvbi5zZXREZXNjcmlwdGlvbihnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCWFTZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlhQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoYVNlY3Rpb24pOwotCQlhQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlhQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlhU2VjdGlvbi5zZXRDbGllbnQoYUNvbXBvc2l0ZSk7Ci0KLQkJaW50IG51bVRhYmxlc1VzZWQgPSAwOwotCi0JCWlmICh1c2VDYXRlZ29yeTEpCi0JCQludW1UYWJsZXNVc2VkKys7Ci0JCWlmICh1c2VDYXRlZ29yeTIpCi0JCQludW1UYWJsZXNVc2VkKys7Ci0JCWlmICh1c2VDYXRlZ29yeTMpCi0JCQludW1UYWJsZXNVc2VkKys7Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MSkgewotCQkJQ29tcG9zaXRlIHBhbmUxID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGFDb21wb3NpdGUsIDEpOwotCQkJbGFiZWxfQ2F0ZWdvcnkgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgZ2V0U2VsZWN0ZWRMYWJlbCgpKTsKLQotCQkJaWYgKGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKQotCQkJCWN0cmxfc2VsZWN0ZWQgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgU0lOR0xFX1JPVyk7Ci0JCQllbHNlIHsKLQkJCQlpZiAobnVtVGFibGVzVXNlZCA9PSAxKQotCQkJCQljdHJsX3NlbGVjdGVkID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIExBUkdFX1NJWkUpOwotCQkJCWVsc2UgaWYgKG51bVRhYmxlc1VzZWQgPT0gMikKLQkJCQkJY3RybF9zZWxlY3RlZCA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCBNRURJVU1fU0laRSk7Ci0JCQkJZWxzZQotCQkJCQljdHJsX3NlbGVjdGVkID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIFNNQUxMX1NJWkUpOwotCQkJfQotCi0JCQlsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uID0gbmV3IExpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdik7IAotCQkJdmlld2VyX3NlbGVjdGVkID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfc2VsZWN0ZWQpOwotCQkJdmlld2VyX3NlbGVjdGVkLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlclNlbGVjdGVkKTsKLQkJCWluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpOwotCQkJdmlld2VyX3NlbGVjdGVkLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmICghaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKQotCQkJCXZpZXdlcl9zZWxlY3RlZC5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpKTsKLQotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyX3NlbGVjdGVkKTsKLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQotCQkJQ29tcG9zaXRlIHBhbmUyID0gY3JlYXRlQ29tcG9zaXRlRm9yQnV0dG9ucyh0b29sa2l0LCBhQ29tcG9zaXRlKTsKLQkJCWlmIChhbGxvd0NoYW5nZTEpIHsKLQkJCQljdHJsX2FkZCA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJCShjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSkgPyBTRUxFQ1RfQlVUVE9OCi0JCQkJCQkJCTogQUREX0JVVFRPTik7Ci0JCQkJY3RybF9yZW1vdmUgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCQkoY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEpID8gQ0xFQVJfQlVUVE9OCi0JCQkJCQkJCTogUkVNT1ZFX0JVVFRPTik7Ci0KLQkJCQlpZiAoaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKSB7Ci0JCQkJCWN0cmxfdXAxID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBVUF9CVVRUT04pOwotCQkJCQljdHJsX2Rvd24xID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBET1dOX0JVVFRPTik7Ci0JCQkJCWN0cmxfb3JkZXJpbmcgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIE9SREVSX0JVVFRPTik7Ci0JCQkJCUNvbWJvIGN0cmxfc29ydDEgPSBjcmVhdGVDb21ib1dpdGhMYWJlbCh0b29sa2l0LCBwYW5lMiwgTGlicmFyeUVkaXRSZXNvdXJjZXMuU29ydFR5cGVfTGFiZWwpOwotCQkJCQl2aWV3ZXJfc29ydDEgPSBuZXcgQ29tYm9WaWV3ZXIoY3RybF9zb3J0MSk7Ci0JCQkJCXZpZXdlcl9zb3J0MS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU29ydCk7Ci0JCQkJCXZpZXdlcl9zb3J0MS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJTb3J0KTsKLQkJCQkJdmlld2VyX3NvcnQxLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQkJCQkJLy8gc2V0IGluaXRpYWwgc2VsZWN0aW9uCi0JCQkJCVN0cmluZyBzb3J0VHlwZSA9IENhdGVnb3J5U29ydEhlbHBlci5nZXRDYXRlZ29yeVNvcnRWYWx1ZShjb250ZW50RWxlbWVudCk7Ci0JCQkJCXZpZXdlcl9zb3J0MS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc29ydFR5cGUpLCB0cnVlKTsKLQotCQkJCQkvLyBjdHJsX29yZGVyaW5nLnNldExheW91dERhdGEobmV3Ci0JCQkJCS8vIEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCQkJfQotCQkJfQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTIpOwotCQl9Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MikgewotCQkJQ29tcG9zaXRlIHBhbmUzID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGFDb21wb3NpdGUsIDEpOwotCQkJbGFiZWxfQ2F0ZWdvcnkyID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTMsIGdldFNlbGVjdGVkTGFiZWwyKCkpOwotCQkJaWYgKGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24yKQotCQkJCWN0cmxfc2VsZWN0ZWQyID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTMsIFNJTkdMRV9ST1cpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKG51bVRhYmxlc1VzZWQgPT0gMSkKLQkJCQkJY3RybF9zZWxlY3RlZDIgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMywgTEFSR0VfU0laRSk7Ci0JCQkJZWxzZSBpZiAobnVtVGFibGVzVXNlZCA9PSAyKQotCQkJCQljdHJsX3NlbGVjdGVkMiA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUzLCBNRURJVU1fU0laRSk7Ci0JCQkJZWxzZQotCQkJCQljdHJsX3NlbGVjdGVkMiA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUzLCBTTUFMTF9TSVpFKTsKLQkJCX0KLQkJCXZpZXdlcl9zZWxlY3RlZDIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zZWxlY3RlZDIpOwotCQkJdmlld2VyX3NlbGVjdGVkMi5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJTZWxlY3RlZDIpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpOwotCQkJdmlld2VyX3NlbGVjdGVkMi5zZXRJbnB1dChjb250ZW50RWxlbWVudCk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyX3NlbGVjdGVkMik7Ci0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUzKTsKLQotCQkJQ29tcG9zaXRlIHBhbmU0ID0gY3JlYXRlQ29tcG9zaXRlRm9yQnV0dG9ucyh0b29sa2l0LCBhQ29tcG9zaXRlKTsKLQkJCWlmIChhbGxvd0NoYW5nZTIpIHsKLQkJCQljdHJsX2FkZDIgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTQsIEFERF9CVVRUT04pOwotCQkJCWN0cmxfcmVtb3ZlMiA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNCwgUkVNT1ZFX0JVVFRPTik7Ci0KLQkJCQlpZiAoaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQyKSB7Ci0JCQkJCWN0cmxfdXAyID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU0LCBVUF9CVVRUT04pOwotCQkJCQljdHJsX2Rvd24yID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU0LCBET1dOX0JVVFRPTik7Ci0JCQkJfQotCQkJfQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTQpOwotCQl9Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MykgewotCQkJQ29tcG9zaXRlIHBhbmU1ID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGFDb21wb3NpdGUsIDEpOwotCQkJbGFiZWxfQ2F0ZWdvcnkzID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTUsIGdldFNlbGVjdGVkTGFiZWwzKCkpOwotCQkJaWYgKGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24zKQotCQkJCWN0cmxfc2VsZWN0ZWQzID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTUsIFNJTkdMRV9ST1cpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKG51bVRhYmxlc1VzZWQgPT0gMSkKLQkJCQkJY3RybF9zZWxlY3RlZDMgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lNSwgTEFSR0VfU0laRSk7Ci0JCQkJZWxzZSBpZiAobnVtVGFibGVzVXNlZCA9PSAyKQotCQkJCQljdHJsX3NlbGVjdGVkMyA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmU1LCBNRURJVU1fU0laRSk7Ci0JCQkJZWxzZQotCQkJCQljdHJsX3NlbGVjdGVkMyA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmU1LCBTTUFMTF9TSVpFKTsKLQkJCX0KLQkJCXZpZXdlcl9zZWxlY3RlZDMgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zZWxlY3RlZDMpOwotCQkJdmlld2VyX3NlbGVjdGVkMy5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJTZWxlY3RlZDMpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpOwotCQkJdmlld2VyX3NlbGVjdGVkMy5zZXRJbnB1dChjb250ZW50RWxlbWVudCk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyX3NlbGVjdGVkMyk7Ci0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmU1KTsKLQotCQkJQ29tcG9zaXRlIHBhbmU2ID0gY3JlYXRlQ29tcG9zaXRlRm9yQnV0dG9ucyh0b29sa2l0LCBhQ29tcG9zaXRlKTsKLQkJCWlmIChhbGxvd0NoYW5nZTMpIHsKLQkJCQljdHJsX2FkZDMgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTYsIEFERF9CVVRUT04pOwotCQkJCWN0cmxfcmVtb3ZlMyA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNiwgUkVNT1ZFX0JVVFRPTik7Ci0KLQkJCQlpZiAoaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQzKSB7Ci0JCQkJCWN0cmxfdXAzID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU2LCBVUF9CVVRUT04pOwotCQkJCQljdHJsX2Rvd24zID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU2LCBET1dOX0JVVFRPTik7Ci0JCQkJfQotCQkJfQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTYpOwotCQl9Ci0KLQkJc2V0RW5hYmxlZEFkZEJ1dHRvbnModHJ1ZSk7Ci0KLQkJc2V0V2lkZ2V0V2lkdGhzKCk7Ci0JCUNvbXBvc2l0ZSBwYW5lNyA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBhQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkZJTExfQk9USCwgMSwgMSwgMSk7Ci0JCWN0cmxfYnJpZWZEZXNjID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWxMYXJnZSgKLQkJCQl0b29sa2l0LAotCQkJCXBhbmU3LAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkFzc29jaWF0aW9uRm9ybVBhZ2VfQnJpZWZEZXNjcmlwdGlvbkxhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmRGVzYy5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmU3KTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoYUNvbXBvc2l0ZSk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udGV4dEhlbHAoKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVuYWJsZWRBZGRCdXR0b25zKGJvb2xlYW4gdmFsdWUpIHsKLQkJaWYgKGFsbG93Q2hhbmdlMSkKLQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodmFsdWUpOwotCQlpZiAodXNlQ2F0ZWdvcnkyICYmIGFsbG93Q2hhbmdlMikKLQkJCWN0cmxfYWRkMi5zZXRFbmFibGVkKHZhbHVlKTsKLQkJaWYgKHVzZUNhdGVnb3J5MyAmJiBhbGxvd0NoYW5nZTMpCi0JCQljdHJsX2FkZDMuc2V0RW5hYmxlZCh2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5hYmxlZFJlbW92ZUJ1dHRvbnMoYm9vbGVhbiB2YWx1ZSkgewotCQlpZiAoYWxsb3dDaGFuZ2UxKQotCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZCh2YWx1ZSk7Ci0JCWlmICh1c2VDYXRlZ29yeTIgJiYgYWxsb3dDaGFuZ2UyKQotCQkJY3RybF9yZW1vdmUyLnNldEVuYWJsZWQodmFsdWUpOwotCQlpZiAodXNlQ2F0ZWdvcnkzICYmIGFsbG93Q2hhbmdlMykKLQkJCWN0cmxfcmVtb3ZlMy5zZXRFbmFibGVkKHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNhYmxlQnV0dG9uc0FuZERlc2VsZWN0VGFibGVzKCkgewotCQkvLyBzZXRFbmFibGVkQWRkQnV0dG9ucyhmYWxzZSk7Ci0JCXNldEVuYWJsZWRSZW1vdmVCdXR0b25zKGZhbHNlKTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJaWYgKHVzZUNhdGVnb3J5MikKLQkJCXZpZXdlcl9zZWxlY3RlZDIuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQlpZiAodXNlQ2F0ZWdvcnkzKQotCQkJdmlld2VyX3NlbGVjdGVkMy5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCWN0cmxfYnJpZWZEZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXdlcnMoKSB7Ci0KLQkJdmlld2VyX3NlbGVjdGVkLnJlZnJlc2goKTsKLQkJLy8gQ2hlY2sgaWYgZXhpc3RpbmcgZWxlbWVudCBpcyBjb250cmlidXRvci9jb250cmlidXRlcyBmb3Igc3RhbmRhcmQKLQkJLy8gY2F0ZWdvcmllcwotCQkvLyBzaG91bGQgbm90IHNob3duIGluIHRoZSB0YWJsZXZpZXdlci4KLQkJLy8gQ29tbWVudGVkIGJlbG93IHRvIGFsbG93IGNvbnRyaWJ1dG9ycyB0byBkaXNwbGF5IGluIHRoZSBsaXN0IGJveAotCQkvLyBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSl7Ci0JCS8vIGlmKCEoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpewotCQkvLyBPYmplY3RbXSBlbGVtZW50cyA9Ci0JCS8vIGNvbnRlbnRQcm92aWRlclNlbGVjdGVkLmdldEVsZW1lbnRzKGNvbnRlbnRFbGVtZW50KTsKLQkJLy8gZm9yKGludCBpPTA7IGk8ZWxlbWVudHMubGVuZ3RoOyBpKyspewotCQkvLyBPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpewotCQkvLyBpZihVSUhlbHBlci5pc0NvbnRyaWJ1dG9yKChDb250ZW50RWxlbWVudCllbGVtZW50KSl7Ci0JCS8vIHZpZXdlcl9zZWxlY3RlZC5yZW1vdmUoZWxlbWVudCk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCi0JCWlmICh1c2VDYXRlZ29yeTIpIHsKLQkJCXZpZXdlcl9zZWxlY3RlZDIucmVmcmVzaCgpOwotCQkJLy8gaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpewotCQkJLy8gT2JqZWN0W10gZWxlbWVudHMgPQotCQkJLy8gY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyLmdldEVsZW1lbnRzKGNvbnRlbnRFbGVtZW50KTsKLQkJCS8vIGZvcihpbnQgaT0wOyBpPGVsZW1lbnRzLmxlbmd0aDsgaSsrKXsKLQkJCS8vIE9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpewotCQkJLy8gaWYoVUlIZWxwZXIuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpZWxlbWVudCkpewotCQkJLy8gdmlld2VyX3NlbGVjdGVkMi5yZW1vdmUoZWxlbWVudCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0KLQkJfQotCQlpZiAodXNlQ2F0ZWdvcnkzKSB7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQzLnJlZnJlc2goKTsKLQkJCS8vIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KXsKLQkJCS8vIE9iamVjdFtdIGVsZW1lbnRzID0KLQkJCS8vIGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMy5nZXRFbGVtZW50cyhjb250ZW50RWxlbWVudCk7Ci0JCQkvLyBmb3IoaW50IGk9MDsgaTxlbGVtZW50cy5sZW5ndGg7IGkrKyl7Ci0JCQkvLyBPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KXsKLQkJCS8vIGlmKFVJSGVscGVyLmlzQ29udHJpYnV0b3IoKENvbnRlbnRFbGVtZW50KWVsZW1lbnQpKXsKLQkJCS8vIHZpZXdlcl9zZWxlY3RlZDMucmVtb3ZlKGVsZW1lbnQpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0JCWN0cmxfYnJpZWZEZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZm9ybS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAoZm9ybSAhPSBudWxsICYmICFmb3JtLmlzRGlzcG9zZWQoKSkgewotCQkJCQlVSUhlbHBlci5zZXRGb3JtVGV4dChmb3JtLCBjb250ZW50RWxlbWVudCk7Ci0JCQkJfQotCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWVuYWJsZUNvbnRyb2xzKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQllbmFibGVDb250cm9scyh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZm9ybS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChmb3JtICE9IG51bGwgJiYgIWZvcm0uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCVVJSGVscGVyLnNldEZvcm1UZXh0KGZvcm0sIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJZW5hYmxlQ29udHJvbHMoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVuYWJsZUNvbnRyb2xzKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MSkgewotCQkJLy8gQWRkIGZvY3VzIGxpc3RlbmVyIG9uIHByaW1hcnkgdGFza3MgbGlzdAotCQkJY3RybF9zZWxlY3RlZC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCWRpc2FibGVCdXR0b25zQW5kRGVzZWxlY3RUYWJsZXMoKTsKLQotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZAotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGFsbG93Q2hhbmdlMSAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZAotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJCQkJaWYgKGFsbG93Q2hhbmdlMSAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEKLQkJCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCQkJaWYgKHZpZXdlcl9zZWxlY3RlZC5nZXRUYWJsZSgpCi0JCQkJCQkJCQkJLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCQkJJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxICYmCi0JCQkJCQkJCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJCQkJY3RybF91cDEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQkJfSBlbHNlCi0JCQkJCQkJCQljdHJsX3VwMS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCQkJCQlpZiAodmlld2VyX3NlbGVjdGVkLmdldFRhYmxlKCkKLQkJCQkJCQkJCQkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdlcl9zZWxlY3RlZAotCQkJCQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KQotCQkJCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSAmJgotCQkJCQkJCQkJCUNhdGVnb3J5U29ydEhlbHBlci5pc01hbnVhbENhdGVnb3J5U29ydChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCQkJCWN0cmxfZG93bjEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQkJfSBlbHNlCi0JCQkJCQkJCQljdHJsX2Rvd24xLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJCX0KLQotCQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJCQkJCX0gZWxzZSBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQkJCQkJY3RybF9icmllZkRlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkJCQkJLnNpemUoKSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9KTsKLQotCQkJaWYgKGFsbG93Q2hhbmdlMSkgewotCQkJCWN0cmxfYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHZpZXdlcl9zZWxlY3RlZC5nZXRUYWJsZSgpCi0JCQkJCQkJCS5nZXRJdGVtcygpOwotCQkJCQkJTGlzdCBzZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc2VsZWN0ZWRMaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoZ2V0RmlsdGVyKCkgIT0gbnVsbCkgewotCQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKAotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCksIGdldEZpbHRlcigpLAotCQkJCQkJCQkJZ2V0Q29udGVudEVsZW1lbnQoKSwgZ2V0VGFiU3RyaW5nKCkpOwotCQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJCWZkLnNldFRpdGxlKGdldFRhYlN0cmluZygpKTsKLQkJCQkJCQlpZihjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSl7Ci0JCQkJCQkJCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmQuc2V0RXhpc3RpbmdFbGVtZW50cyhzZWxlY3RlZExpc3QpOwotCQkJCQkJCWlmKGdldEZpbHRlclR5cGVzKCkgIT0gbnVsbCl7Ci0JCQkJCQkJCWZkLnNldFR5cGVzKGdldEZpbHRlclR5cGVzKCkpOwotCQkJCQkJCX0KLQkJCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQkJYWRkSXRlbXNUb01vZGVsMShmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJfQotCQkJCQkJLy8gdmlld2VyX3NlbGVjdGVkLnJlZnJlc2goKTsKLQkJCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0KLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9yZW1vdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJCXJlbW92ZUl0ZW1zRnJvbU1vZGVsMShybUl0ZW1zKTsKLQkJCQkJCQkvLyB2aWV3ZXJfc2VsZWN0ZWQucmVmcmVzaCgpOwotCQkJCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJCXZpZXdlcl9zZWxlY3RlZC5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCQkJY3RybF9icmllZkRlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodXNlQ2F0ZWdvcnkyKSB7Ci0JCQkvLyBBZGQgZm9jdXMgbGlzdGVuZXIgb24gcHJpbWFyeSB0YXNrcyBsaXN0Ci0JCQljdHJsX3NlbGVjdGVkMi5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCWRpc2FibGVCdXR0b25zQW5kRGVzZWxlY3RUYWJsZXMoKTsKLQotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZDIKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChhbGxvd0NoYW5nZTIgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCWN0cmxfcmVtb3ZlMi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXZpZXdlcl9zZWxlY3RlZDIKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZDIKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQkJCWlmIChhbGxvd0NoYW5nZTIgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJCQljdHJsX3JlbW92ZTIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgc2VsZWN0aW9uCi0JCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKQotCQkJCQkJCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJCQkJCWRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWN0cmxfYnJpZWZEZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmRGVzYwotCQkJCQkJCQkJCS5zZXRUZXh0KGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oc2VsZWN0aW9uCi0JCQkJCQkJCQkJCQkuc2l6ZSgpKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCX0pOwotCi0JCQlpZiAoYWxsb3dDaGFuZ2UyKSB7Ci0JCQkJY3RybF9hZGQyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHZpZXdlcl9zZWxlY3RlZDIuZ2V0VGFibGUoKQotCQkJCQkJCQkuZ2V0SXRlbXMoKTsKLQkJCQkJCUxpc3Qgc2VsZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXNlbGVjdGVkTGlzdC5hZGQoaXRlbXNbaV0uZ2V0RGF0YSgpKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChnZXRGaWx0ZXIyKCkgIT0gbnVsbCkgewotCQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKAotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCksIGdldEZpbHRlcjIoKSwKLQkJCQkJCQkJCWdldENvbnRlbnRFbGVtZW50KCksIGdldFRhYlN0cmluZzIoKSk7Ci0JCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQkJZmQuc2V0VGl0bGUoZ2V0VGFiU3RyaW5nMigpKTsKLQkJCQkJCQlmZC5zZXRFeGlzdGluZ0VsZW1lbnRzKHNlbGVjdGVkTGlzdCk7Ci0JCQkJCQkJZmQub3BlbigpOwotCQkJCQkJCWFkZEl0ZW1zVG9Nb2RlbDIoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCX0KLQkJCQkJCXZpZXdlcl9zZWxlY3RlZDIucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZTIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMgotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtc0Zyb21Nb2RlbDIocm1JdGVtcyk7Ci0JCQkJCQkJdmlld2VyX3NlbGVjdGVkMi5yZWZyZXNoKCk7Ci0KLQkJCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQkJdmlld2VyX3NlbGVjdGVkMi5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCQkJY3RybF9icmllZkRlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWN0cmxfcmVtb3ZlMi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JCWlmICh1c2VDYXRlZ29yeTMpIHsKLQkJCS8vIEFkZCBmb2N1cyBsaXN0ZW5lciBvbiBwcmltYXJ5IHRhc2tzIGxpc3QKLQkJCWN0cmxfc2VsZWN0ZWQzLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJZGlzYWJsZUJ1dHRvbnNBbmREZXNlbGVjdFRhYmxlcygpOwotCi0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMwotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGFsbG93Q2hhbmdlMyAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJY3RybF9yZW1vdmUzLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyX3NlbGVjdGVkMwotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMwotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJCQkJaWYgKGFsbG93Q2hhbmdlMyAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQkJCWN0cmxfcmVtb3ZlMy5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCQkJCWN0cmxfYnJpZWZEZXNjCi0JCQkJCQkJCQkJLnNldFRleHQoZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkJCQkJCS5zaXplKCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfSk7Ci0KLQkJCWlmIChhbGxvd0NoYW5nZTMpIHsKLQkJCQljdHJsX2FkZDMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmlld2VyX3NlbGVjdGVkMy5nZXRUYWJsZSgpCi0JCQkJCQkJCS5nZXRJdGVtcygpOwotCQkJCQkJTGlzdCBzZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc2VsZWN0ZWRMaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJCQkJfQotCQkJCQkJaWYgKGdldEZpbHRlcjMoKSAhPSBudWxsKSB7Ci0JCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coCi0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZ2V0RmlsdGVyMygpLAotCQkJCQkJCQkJZ2V0Q29udGVudEVsZW1lbnQoKSwgZ2V0VGFiU3RyaW5nMygpKTsKLQkJCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCQlmZC5zZXRUaXRsZShnZXRUYWJTdHJpbmczKCkpOwotCQkJCQkJCWZkLnNldEV4aXN0aW5nRWxlbWVudHMoc2VsZWN0ZWRMaXN0KTsKLQkJCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQkJYWRkSXRlbXNUb01vZGVsMyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJfQotCQkJCQkJdmlld2VyX3NlbGVjdGVkMy5yZWZyZXNoKCk7Ci0KLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9yZW1vdmUzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZDMKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQkJcmVtb3ZlSXRlbXNGcm9tTW9kZWwzKHJtSXRlbXMpOwotCQkJCQkJCXZpZXdlcl9zZWxlY3RlZDMucmVmcmVzaCgpOwotCi0JCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJCXZpZXdlcl9zZWxlY3RlZDMuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZEZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQljdHJsX3JlbW92ZTMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCi0JCWlmIChhbGxvd0NoYW5nZTEgJiYgaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKSB7Ci0JCQljdHJsX3VwMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCUFycmF5TGlzdCBtb3ZlVXBJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCW1vdmVVcEl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJbW92ZVVwSXRlbXNJblNlbGVjdGVkSXRlbXMxKG1vdmVVcEl0ZW1zKTsKLQkJCQkJfQotCQkJCQkvLyB2aWV3ZXJfc2VsZWN0ZWQucmVmcmVzaCgpOwotCQkJCQlyZWZyZXNoVmlld2VycygpOwotCQkJCQlpZiAodmlld2VyX3NlbGVjdGVkLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgJiYKLQkJCQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQljdHJsX3VwMS5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWN0cmxfdXAxLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlpZiAodmlld2VyX3NlbGVjdGVkLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdlcl9zZWxlY3RlZAotCQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSAmJgotCQkJCQkJCUNhdGVnb3J5U29ydEhlbHBlci5pc01hbnVhbENhdGVnb3J5U29ydChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCWN0cmxfZG93bjEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQljdHJsX2Rvd24xLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX2Rvd24xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJQXJyYXlMaXN0IG1vdmVEb3duSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQltb3ZlRG93bkl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJbW92ZURvd25JdGVtc0luU2VsZWN0ZWRJdGVtczEobW92ZURvd25JdGVtcyk7Ci0JCQkJCX0KLQkJCQkJLy8gdmlld2VyX3NlbGVjdGVkLnJlZnJlc2goKTsKLQkJCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQkJaWYgKHZpZXdlcl9zZWxlY3RlZC5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmCi0JCQkJCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJY3RybF91cDEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQljdHJsX3VwMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJaWYgKHZpZXdlcl9zZWxlY3RlZC5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgJiYKLQkJCQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQljdHJsX2Rvd24xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJY3RybF9kb3duMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9vcmRlcmluZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nIGRsZyA9IG5ldyBDb250ZW50RWxlbWVudHNPcmRlckRpYWxvZygKLQkJCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LCBnZXRBY3Rpb25NYW5hZ2VyKCkpOwotCQkJCQlkbGcub3BlbigpOwotCQkJCQlpZiAoYWxsb3dDaGFuZ2UxICYmIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSkgewotCQkJCQkJU3RyaW5nIHNvcnRUeXBlID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldENhdGVnb3J5U29ydFZhbHVlKGNvbnRlbnRFbGVtZW50KTsKLQkJCQkJCXZpZXdlcl9zb3J0MS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc29ydFR5cGUpLCB0cnVlKTsKLQkJCQkJCXZpZXdlcl9zb3J0MS5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJdmlld2VyX3NvcnQxLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zb3J0MQotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJU3RyaW5nIHNvcnRUeXBlID0gKFN0cmluZylzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCWlmICghQ2F0ZWdvcnlTb3J0SGVscGVyLmdldENhdGVnb3J5U29ydFZhbHVlKGNvbnRlbnRFbGVtZW50KS5lcXVhbHMoc29ydFR5cGUpKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IENhdGVnb3J5U29ydEhlbHBlci5nZXRDYXRlZ29yeVNvcnRQcm9wZXJ0eShjb250ZW50RWxlbWVudCk7Ci0JCQkJCQkKLQkJCQkJCWlmIChwcm9wID09IG51bGwpIHsJCQkKLQkJCQkJCQlwcm9wID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmNyZWF0ZU5ld1NvcnRQcm9wZXJ0eShzb3J0VHlwZSk7Ci0JCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSwKLQkJCQkJCQkJCXByb3AsIC0xKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCXByb3AsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpLAotCQkJCQkJCQkJCXNvcnRUeXBlLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCQlMaWJyYXJ5Vmlldy5nZXRWaWV3KCkucmVmcmVzaFZpZXdzKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHZpZXdlcl9zZWxlY3RlZC5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmCi0JCQkJCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJY3RybF91cDEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQljdHJsX3VwMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJaWYgKHZpZXdlcl9zZWxlY3RlZC5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgJiYKLQkJCQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQljdHJsX2Rvd24xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJY3RybF9kb3duMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZUNvbnRyb2xzKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJaWYgKHVzZUNhdGVnb3J5MSkgewotCQkJaWYgKGFsbG93Q2hhbmdlMSkgewotCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGFsbG93Q2hhbmdlMSAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAodXNlQ2F0ZWdvcnkyKSB7Ci0JCQlpZiAoYWxsb3dDaGFuZ2UyKSB7Ci0JCQkJY3RybF9hZGQyLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChhbGxvd0NoYW5nZTIgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQljdHJsX3JlbW92ZTIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3JlbW92ZTIuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHVzZUNhdGVnb3J5MykgewotCQkJaWYgKGFsbG93Q2hhbmdlMykgewotCQkJCWN0cmxfYWRkMy5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZDMKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoYWxsb3dDaGFuZ2UzICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJY3RybF9yZW1vdmUzLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9yZW1vdmUzLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJfQotCQkJfQotCQl9Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQlpZiAodmlld2VyX3NlbGVjdGVkLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmCi0JCQkJCUNhdGVnb3J5U29ydEhlbHBlci5pc01hbnVhbENhdGVnb3J5U29ydChjb250ZW50RWxlbWVudCkpIHsKLQkJCQljdHJsX3VwMS5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlCi0JCQkJY3RybF91cDEuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCWlmICh2aWV3ZXJfc2VsZWN0ZWQuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgdmlld2VyX3NlbGVjdGVkCi0JCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgJiYKLQkJCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KGNvbnRlbnRFbGVtZW50KSkgewotCQkJCWN0cmxfZG93bjEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZQotCQkJCWN0cmxfZG93bjEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl2aWV3ZXJfc29ydDEuZ2V0Q29tYm8oKS5zZXRFbmFibGVkKHRydWUpOwotCQl9IGVsc2UgaWYgKGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJLy8gaXQncyBsb2NrZWQKLQkJCWN0cmxfdXAxLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJY3RybF9kb3duMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCS8vIGlmIGVsZW1lbnQgaXMgYmFzZWQgb24gYW5vdGhlciwgZW5hYmxlIHRoZSBPcmRlciBidXR0b24KLQkJCS8vIHNvIHRoZSB1c2VyIGNhbiB2aWV3IHRoZSByZWFsaXplZCBvcmRlciBsaXN0Ci0JCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQljdHJsX29yZGVyaW5nLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfb3JkZXJpbmcuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQl2aWV3ZXJfc29ydDEuZ2V0Q29tYm8oKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIGlmIChpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEgJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkvLyBubyBzZWxlY3Rpb24KLQkJCWN0cmxfdXAxLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJY3RybF9kb3duMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWN0cmxfb3JkZXJpbmcuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXZpZXdlcl9zb3J0MS5nZXRDb21ibygpLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSBpZiAoaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKSB7Ci0JCQkvLyBpdCdzIGxvY2tlZCBhbmQgbm8gc2VsZWN0aW9uCi0JCQl2aWV3ZXJfc29ydDEuZ2V0Q29tYm8oKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCS8vIGlmIGVsZW1lbnQgaXMgYmFzZWQgb24gYW5vdGhlciwgZW5hYmxlIHRoZSBPcmRlciBidXR0b24KLQkJCS8vIHNvIHRoZSB1c2VyIGNhbiB2aWV3IHRoZSByZWFsaXplZCBvcmRlciBsaXN0Ci0JCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQljdHJsX29yZGVyaW5nLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfb3JkZXJpbmcuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHNldERpcnR5KGJvb2xlYW4gYikgewotCQkvLyBQaG9uZyAoMDMvMDcvMjAwNSk6IHRoZSBkaXJ0eSBzdGF0ZSBvZiB0aGUgZWRpdG9yIGlzIGFscmVhZHkgdGFrZW4KLQkJLy8gY2FyZSBpbiBNZXRob2RFbGVtZW50RWRpdG9yLCB0cmFuc3BhcmVudCBmcm9tIHVzZXIKLQkJLy8gaW50ZXJhY3Rpb24uIE5vIGZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKSBzaG91bGQgYmUgY2FsbGVkCi0JCS8vIHNvbWV3aGVyZSBlbHNlLgotCQkvLyBOT1RFOiB1bm5lY2Vzc2FyeSBjYWxscyB0byBmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSkgd2lsbCBjYXVzZQotCQkvLyBwZXJmb3JtYW5jZSBwcm9ibGVtLgotCQkvLyBmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHVzZWRDYXRlZ29yaWVzLnNpemUoKSA+IDApCi0JCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VDYXRlZ29yaWVzKGNvbnRlbnRFbGVtZW50LAotCQkJCQl1c2VkQ2F0ZWdvcmllcyk7Ci0KLQkJaWYgKGxhYmVsUHJvdmlkZXJTZWxlY3RlZCAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyU2VsZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChsYWJlbFByb3ZpZGVyU2VsZWN0ZWQyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXJTZWxlY3RlZDIuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChsYWJlbFByb3ZpZGVyU2VsZWN0ZWQzICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXJTZWxlY3RlZDMuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWN0aW9uIG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VjdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJLy8gVFZUIGlzc3VlIHNpbmdsZSBxdW90ZSAKLQkJLy8gRm9ybWF0IHNob3VsZCBiZSBkb25lIG9ubHkgZm9yIENhdGVnb3J5R3VpZGFuY2VQYWdlLCBBdXRob3JpbmdVSS5jYXRlZ29yeUd1aWRhbmNlc1BhZ2Uuc2VjdGlvbkRlc2NyaXB0aW9uIGtleSAKLQkJLy8gaGF2ZSBoYXMgcmVwbGFjZW1lbnQgdmFyaWFibGUgaW4gaXRzIHZhbHVlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBjaGVjayBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQkgICAvKiAKLQkgICAgKiBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQkgICAgU3RyaW5ncyB3aGljaCBjb250YWluIHJlcGxhY2VtZW50IHZhcmlhYmxlcyBhcmUgcHJvY2Vzc2VkIGJ5IHRoZSAgCi0JICAgIE1lc3NhZ2VGb3JtYXQgY2xhc3MgKHNpbmdsZSBxdW90ZSBtdXN0IGJlIGNvZGVkIGFzIDIgY29uc2VjdXRpdmUgc2luZ2xlICAKLQkgICAgcXVvdGVzICcnKS4gU3RyaW5ncyB3aGljaCBkbyBOT1QgY29udGFpbiByZXBsYWNlbWVudCB2YXJpYWJsZXMgYXJlIE5PVCAgIAotCSAgICBwcm9jZXNzZWQgYnkgdGhlIE1lc3NhZ2VGb3JtYXQgY2xhc3MgKHNpbmdsZSBxdW90ZSBtdXN0IGJlIGNvZGVkIGFzIDEKLQkJc2luZ2xlIHF1b3RlICcpLiovCi0JCQotCQlpZiAobWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50Ci0JCQkJJiYgImNhdGVnb3J5R3VpZGFuY2VzUGFnZSIuZXF1YWxzSWdub3JlQ2FzZShnZXRJZCgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gTkxTLmJpbmQoUEFDS0FHRV9QUkVGSVggKyBnZXRJZCgpICsgIi5zZWN0aW9uRGVzY3JpcHRpb24iLCBMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dExvd2VyKG1ldGhvZEVsZW1lbnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IHNlbGVjdGVkIGxhYmxlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJLy8gaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJLy8gcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1hdFN0cmluZyhQQUNLQUdFX1BSRUZJWCArIGdldElkKCkgKwotCQkvLyAiLnNlbGVjdGVkTGFiZWwiLCBMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dChtZXRob2RFbGVtZW50KSk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWNvbmQgc2VsZWN0ZWQgbGFibGUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGhpcmQgc2VsZWN0ZWQgbGFibGUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbXVsdGlwbGUgc2VjdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBQQUNLQUdFX1BSRUZJWCArIGdldElkKCkgKyAiLm11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24iKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtdWx0aXBsZSBzZWN0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQsIFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoa2V5LCBuZXcgSW50ZWdlcihjb3VudCkpOwotCX0KLQotCS8qKgotCSAqIFNldCBkZXNjcmlwdGlvbiBmb3Igc2VjdGlvbgotCSAqIEBwYXJhbSBzZWN0aW9uRGVzYwotCSAqIAkJCURlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VjdGlvbkRlc2MoU3RyaW5nIHNlY3Rpb25EZXNjKSB7Ci0JCXRoaXMuc2VjdGlvbkRlc2MgPSBzZWN0aW9uRGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZmlyc3QgbGFiZWwKLQkgKiBAcGFyYW0gc2VsZWN0ZWRMYWJlbDEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZExhYmVsKFN0cmluZyBzZWxlY3RlZExhYmVsMSkgewotCQl0aGlzLnNlbGVjdGVkTGFiZWwgPSBzZWxlY3RlZExhYmVsMTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgc2Vjb25kIGxhYmVsCi0JICogQHBhcmFtIHNlbGVjdGVkTGFiZWwyCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRMYWJlbDIoU3RyaW5nIHNlbGVjdGVkTGFiZWwyKSB7Ci0JCXRoaXMuc2VsZWN0ZWRMYWJlbDIgPSBzZWxlY3RlZExhYmVsMjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhpcmQgbGFiZWwKLQkgKiBAcGFyYW0gc2VsZWN0ZWRMYWJlbDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZExhYmVsMyhTdHJpbmcgc2VsZWN0ZWRMYWJlbDMpIHsKLQkJdGhpcy5zZWxlY3RlZExhYmVsMyA9IHNlbGVjdGVkTGFiZWwzOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gZm9yIHRoZSBmaXJzdCBjYXRlZ29yeSB0byBiZSBlaXRoZXIgc2luZ2xlIHNlbGVjdGlvbiBvciBtdWx0aXBsZSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMShib29sZWFuIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKSB7Ci0JCXRoaXMuY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEgPSBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIGZvciB0aGUgc2Vjb25kIGNhdGVnb3J5IHRvIGJlIGVpdGhlciBzaW5nbGUgc2VsZWN0aW9uIG9yIG11bHRpcGxlIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24yKGJvb2xlYW4gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjIpIHsKLQkJdGhpcy5jYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMiA9IGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24yOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gZm9yIHRoZSB0aGlyZCBjYXRlZ29yeSB0byBiZSBlaXRoZXIgc2luZ2xlIHNlbGVjdGlvbiBvciBtdWx0aXBsZSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMyhib29sZWFuIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24zKSB7Ci0JCXRoaXMuY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjMgPSBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIHRvIHVzZSBmaXJzdCBjYXRlZ29yeQotCSAqIEBwYXJhbSB1c2VDYXRlZ29yeTEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VDYXRlZ29yeTEoYm9vbGVhbiB1c2VDYXRlZ29yeTEpIHsKLQkJdGhpcy51c2VDYXRlZ29yeTEgPSB1c2VDYXRlZ29yeTE7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byB1c2Ugc2Vjb25kIGNhdGVnb3J5Ci0JICogQHBhcmFtIHVzZUNhdGVnb3J5MgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZUNhdGVnb3J5Mihib29sZWFuIHVzZUNhdGVnb3J5MikgewotCQl0aGlzLnVzZUNhdGVnb3J5MiA9IHVzZUNhdGVnb3J5MjsKLQl9Ci0KLQkKLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIHRvIHVzZSB0aGlyZCBjYXRlZ29yeQotCSAqIEBwYXJhbSB1c2VDYXRlZ29yeTMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VDYXRlZ29yeTMoYm9vbGVhbiB1c2VDYXRlZ29yeTMpIHsKLQkJdGhpcy51c2VDYXRlZ29yeTMgPSB1c2VDYXRlZ29yeTM7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byBhbGxvdyBjaGFuZ2VzIGZvciBmaXJzdCB0YWJsZSBpbiBVSQotCSAqIEBwYXJhbSBhbGxvd0NoYW5nZTEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd0NoYW5nZTEoYm9vbGVhbiBhbGxvd0NoYW5nZTEpIHsKLQkJdGhpcy5hbGxvd0NoYW5nZTEgPSBhbGxvd0NoYW5nZTE7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byBhbGxvdyBjaGFuZ2VzIGZvciB0aGUgc2Vjb25kIHRhYmxlIGluIFVJCi0JICogQHBhcmFtIGFsbG93Q2hhbmdlMgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG93Q2hhbmdlMihib29sZWFuIGFsbG93Q2hhbmdlMikgewotCQl0aGlzLmFsbG93Q2hhbmdlMiA9IGFsbG93Q2hhbmdlMjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIHRvIGFsbG93IGNoYW5nZXMgZm9yIHRoaXJkIHRhYmxlLgotCSAqIEBwYXJhbSBhbGxvd0NoYW5nZTMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd0NoYW5nZTMoYm9vbGVhbiBhbGxvd0NoYW5nZTMpIHsKLQkJdGhpcy5hbGxvd0NoYW5nZTMgPSBhbGxvd0NoYW5nZTM7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byBzaG93IGZpcnN0IHNldCBvZiB1cC9kb3duIGJ1dHRvbnMKLQkgKiBAcGFyYW0gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKAotCQkJYm9vbGVhbiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEpIHsKLQkJdGhpcy5pc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEgPSBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDE7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byBzaG93IHNlY29uZCBzZXQgb2YgdXAvZG93biBidXR0b25zCi0JICogQHBhcmFtIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMigKLQkJCWJvb2xlYW4gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQyKSB7Ci0JCXRoaXMuaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQyID0gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQyOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gdG8gc2hvdyB0aGlyZCBzZXQgb2YgdXAvZG93biBidXR0b25zLgotCSAqIEBwYXJhbSBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDMoCi0JCQlib29sZWFuIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMykgewotCQl0aGlzLmlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMyA9IGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMzsKLQl9Ci0KLQkvLyBjYWxjdWxhdGUgd2lkdGhzIGZvciBsYWJlbHMgYW5kIHRhYmxlcywgYmFzZWQgb24gd2lkdGggb2YgbGFiZWxzCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0V2lkdGhzKCkgewotCQlpbnQgYWxsQ2F0ZWdvcmllc1dpZHRoID0gMCwgY2F0ZWdvcnlXaWR0aCA9IDAsIGNhdGVnb3J5MldpZHRoID0gMCwgY2F0ZWdvcnkzV2lkdGggPSAwOwotCQlpbnQgbGFyZ2VzdFdpZHRoID0gMDsKLQkJLy8gaWYgKHVzZUNhdGVnb3J5MSkgYWxsQ2F0ZWdvcmllc1dpZHRoID0KLQkJLy8gbGFiZWxfYWxsQ2F0ZWdvcmllcy5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCWlmICh1c2VDYXRlZ29yeTEpCi0JCQljYXRlZ29yeVdpZHRoID0gbGFiZWxfQ2F0ZWdvcnkKLQkJCQkJLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsKLQkJaWYgKHVzZUNhdGVnb3J5MikKLQkJCWNhdGVnb3J5MldpZHRoID0gbGFiZWxfQ2F0ZWdvcnkyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotCQkJCQlTV1QuREVGQVVMVCkueDsKLQkJaWYgKHVzZUNhdGVnb3J5MykKLQkJCWNhdGVnb3J5M1dpZHRoID0gbGFiZWxfQ2F0ZWdvcnkzLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotCQkJCQlTV1QuREVGQVVMVCkueDsKLQotCQlpZiAodXNlQ2F0ZWdvcnkxKQotCQkJbGFyZ2VzdFdpZHRoID0gTWF0aC5tYXgoYWxsQ2F0ZWdvcmllc1dpZHRoLCBjYXRlZ29yeVdpZHRoKTsKLQkJaWYgKHVzZUNhdGVnb3J5MikKLQkJCWxhcmdlc3RXaWR0aCA9IE1hdGgubWF4KGxhcmdlc3RXaWR0aCwgY2F0ZWdvcnkyV2lkdGgpOwotCQlpZiAodXNlQ2F0ZWdvcnkzKQotCQkJbGFyZ2VzdFdpZHRoID0gTWF0aC5tYXgobGFyZ2VzdFdpZHRoLCBjYXRlZ29yeTNXaWR0aCk7Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MSkgewotCQkJLy8gKChHcmlkRGF0YSlsYWJlbF9hbGxDYXRlZ29yaWVzLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0KLQkJCS8vIGxhcmdlc3RXaWR0aDsKLQkJCS8vICgoR3JpZERhdGEpY3RybF9hbGxBdmFpbGFibGUuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPQotCQkJLy8gbGFyZ2VzdFdpZHRoOwotCQkJKChHcmlkRGF0YSkgbGFiZWxfQ2F0ZWdvcnkuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBsYXJnZXN0V2lkdGg7Ci0JCQkoKEdyaWREYXRhKSBjdHJsX3NlbGVjdGVkLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbGFyZ2VzdFdpZHRoOwotCQl9Ci0JCWlmICh1c2VDYXRlZ29yeTIpIHsKLQkJCSgoR3JpZERhdGEpIGxhYmVsX0NhdGVnb3J5Mi5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGxhcmdlc3RXaWR0aDsKLQkJCSgoR3JpZERhdGEpIGN0cmxfc2VsZWN0ZWQyLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbGFyZ2VzdFdpZHRoOwotCQl9Ci0JCWlmICh1c2VDYXRlZ29yeTMpIHsKLQkJCSgoR3JpZERhdGEpIGxhYmVsX0NhdGVnb3J5My5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGxhcmdlc3RXaWR0aDsKLQkJCSgoR3JpZERhdGEpIGN0cmxfc2VsZWN0ZWQzLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbGFyZ2VzdFdpZHRoOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCUZvcm1FZGl0b3IgZWRpdG9yID0gZ2V0RWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yKSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q29udGV4dEhlbHAoKSB7Ci0JCS8vIGluIHRoZSBmdXR1cmUsIHdlIHNob3VsZCBjaGVjayB0aGUgc3ViY2xhc3MgdHlwZSB0byBzZXQgdXAgYQotCQkvLyBkaWZmZXJlbnQKLQkJLy8gY29udGV4dCBwYWdlIGZvciBlY2ggdHlwZSBvZiBhc3NvY2lhdGlvbnMKLQkJRWRpdG9yc0NvbnRleHRIZWxwZXIuc2V0SGVscChnZXRQYXJ0Q29udHJvbCgpLCBnZXRDb250ZW50RWxlbWVudCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGNvbnRleHQgbWVudSBmb3IgdGhlIGdpdmVuIHZpZXdlcgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKLQkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3Iob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7Ci0JCU1lbnUgbWVudSA9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGNvbnRleHRNZW51LCB2aWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0obGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9CYXNlRm9ybVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9CYXNlRm9ybVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzZlZjljMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQmFzZUZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRUb29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5EZWNvcmF0ZWRGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5JQ29udHJvbENyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgTWV0aG9kIGVkaXRvciBmb3JtIHBhZ2VzLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzYzODIKLSAqLwotcHVibGljIGNsYXNzIEJhc2VGb3JtUGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLQotCS8qKgotCSAqIEJ1dHRvbiB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfQlVUVE9OID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9CVVRUT04gPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBfQlVUVE9OID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPV05fQlVUVE9OID0gMzsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE9SREVSX0JVVFRPTiA9IDQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RfQlVUVE9OID0gNTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENMRUFSX0JVVFRPTiA9IDY7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBBVFRBQ0hfQlVUVE9OID0gNzsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFVEFDSF9CVVRUT04gPSA4OwotCi0JLyoqCi0JICogVGFibGUgdHlwZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU01BTExfU0laRSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRURJVU1fU0laRSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVJHRV9TSVpFID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTkdMRV9ST1cgPSAzOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWc7Ci0KLQlwcm90ZWN0ZWQgU2Nyb2xsZWRGb3JtIGZvcm07Ci0KLQlwcm90ZWN0ZWQgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZWRpdG9yVGFiTmFtZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgZWRpdG9yTmFtZTsKLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQgPSBudWxsOwotCi0JcHJvdGVjdGVkIFN0cmluZyBjb250ZW50RWxlbWVudFBhdGg7Ci0KLQlwcml2YXRlIGludCBTRUNUSU9OX0lEOwotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIERlY29yYXRlZExhYmVsQ3JlYXRvciBpbXBsZW1lbnRzIElDb250cm9sQ3JlYXRvciB7Ci0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCQlyZXR1cm4gbmV3IExhYmVsKHBhcmVudCwgc3R5bGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBEZWNvcmF0ZWRMYWJlbENyZWF0b3IgZGVjb3JhdGVkTGFiZWxDcmVhdG9yID0gbmV3IERlY29yYXRlZExhYmVsQ3JlYXRvcigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGZvcm0gZWRpdG9yLgotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIGZvcm0gcGFnZS4KLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGZvcm0gcGFnZS4KLQkgKi8KLQlwdWJsaWMgQmFzZUZvcm1QYWdlKEZvcm1FZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcihlZGl0b3IsIGlkLCB0aXRsZSk7Ci0JCWRlYnVnID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgQ29udGVudEVsZW1lbnQgb2JqZWN0IGZyb20gdGhlIGVkaXRvciBpbnB1dC4KLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCQlTdHJpbmcgbGliUGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCk7Ci0JCW1ldGhvZEVsZW1lbnQgPSBtZXRob2RFbGVtZW50SW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQlpZiAobWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCU9iamVjdCBvYmogPSAoKFByb2Nlc3NDb21wb25lbnQpIG1ldGhvZEVsZW1lbnQpLmdldFByb2Nlc3MoKTsKLQkJCWNvbnRlbnRFbGVtZW50UGF0aCA9IGxpYlBhdGggKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKChNZXRob2RFbGVtZW50KSBvYmopOwotCQl9IGVsc2UgewotCQkJaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQljb250ZW50RWxlbWVudFBhdGggPSBsaWJQYXRoICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCSsgUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgobWV0aG9kRWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBtZXRob2RFbGVtZW50OwotCQkJCWNvbnRlbnRFbGVtZW50UGF0aCA9IGxpYlBhdGggKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJKyBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChtZXRob2RFbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLmNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgYXNzb2NpYXRlZCBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGUoSHlwZXJsaW5rRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgZXhwYW5kL2NvbGxhcHNlIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIFRoZSBhc3NvY2lhdGVkIGV2ZW50LgotCSAqIEBwYXJhbSBvCi0JICogICAgICAgICAgICA/Pz8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGUoSHlwZXJsaW5rRXZlbnQgZXZlbnQsIGludCBvKSB7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZSBmb3IgdGhlIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdG9yTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0b3JOYW1lKFN0cmluZyBlZGl0b3JOYW1lKSB7Ci0JCXRoaXMuZWRpdG9yTmFtZSA9IGVkaXRvck5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgTWV0aG9kIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIEEgVGFibGVWaWV3ZXIuCi0JICogQHJldHVybiBBIGxpc3Qgb2YgTWV0aG9kIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBMaXN0IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyhUYWJsZVZpZXdlciB2aWV3ZXIpIHsKLQkJT2JqZWN0W10gZWxlbWVudHMgPSAoKElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKSB2aWV3ZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldEVsZW1lbnRzKHZpZXdlci5nZXRJbnB1dCgpKTsKLQkJTGlzdCBlbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJCWVsZW1lbnRMaXN0LmFkZChlbGVtZW50c1tpXSk7Ci0JCXJldHVybiBlbGVtZW50TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc2VjdGlvbiBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIHNlY3Rpb24gbmFtZS4KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIFRoZSBzZWN0aW9uIGRlc2NyaXB0aW9uLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIFNlY3Rpb24gY3JlYXRlU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU2VjdGlvbi5ERVNDUklQVElPTgotCQkJCXwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRCB8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJc2VjdGlvbi5zZXRUZXh0KHRpdGxlKTsKLS8vCQlTdHJpbmcgdGV4dCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGRlc2NyaXB0aW9uLAotLy8JCQkJbmV3IFN0cmluZ1tdIHsgTGlicmFyeVVJVGV4dC5nZXRVSVRleHRMb3dlcihtZXRob2RFbGVtZW50KSB9KTsKLS8vCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKHRleHQpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gZ3JpZERhdGFTdHlsZQotCSAqICAgICAgICAgICAgVGhlIEdyaWREYXRhIHN0eWxlLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0LCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIFNXVC5XUkFQCi0JCQkJfCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IChob3Jpem9udGFsU3BhbiA9PSAyKSA/IDExNSA6IDEwMDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlIHdpdGhvdXQgd3JhcCBhbmQgbm8gd2lkdGhIaW50LgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBncmlkRGF0YVN0eWxlCi0JICogICAgICAgICAgICBUaGUgR3JpZERhdGEgc3R5bGUuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgTGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5MYWJlbDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbFdpdGhOb1dyYXAoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0LCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIFNXVC5MRUZUX1RPX1JJR0hUKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQkJLy9ncmlkRGF0YS53aWR0aEhpbnQgPSAoaG9yaXpvbnRhbFNwYW4gPT0gMikgPyAxMTUgOiAxMDA7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHRleHQsIEdyaWREYXRhLkJFR0lOTklORywgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0LCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJcmV0dXJuIGNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgdGV4dCwgR3JpZERhdGEuQkVHSU5OSU5HLAotCQkJCWhvcml6b250YWxTcGFuKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgYmxhbmsgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgTGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5MYWJlbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVCbGFua0xhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJcmV0dXJuIGNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwKLQkJCQkiIiwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBob3Jpem9udGFsU3Bhbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGV4dCBjb250cm9sIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIFRleHQgc3R5bGUuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcGFyYW0gaGVpZ3RoCi0JICogICAgICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSBjb250cm9sLgotCSAqIEBwYXJhbSB3aWR0aAotCSAqICAgICAgICAgICAgVGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGNvbnRyb2wuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgVGV4dCBjb250cm9sLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXQoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBzdHlsZSwgaW50IGdyaWREYXRhU3R5bGUsIGludCBoZWlnaHQsIGludCB3aWR0aCwKLQkJCWludCBob3Jpem9udGFsU3BhbikgewotCQlUZXh0IGNvbnRyb2wgPSB0b29sa2l0LmNyZWF0ZVRleHQocGFyZW50LCAiIiwgc3R5bGUpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZS1saW5lIHRleHQgY29udHJvbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5XUkFQLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgU1dULkRFRkFVTFQsIDEwMCwgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHRleHRTdHlsZQotCSAqICAgICAgICAgICAgVGhlIFRleHQgc3R5bGUuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICogICAgICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSBjb250cm9sLgotCSAqIEBwYXJhbSB3aWR0aAotCSAqICAgICAgICAgICAgVGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGNvbnRyb2wuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgVGV4dCBjb250cm9sLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IHRleHRTdHlsZSwgaW50IGdyaWREYXRhU3R5bGUsIGludCBoZWlnaHQsCi0JCQlpbnQgd2lkdGgsIGludCBob3Jpem9udGFsU3BhbiwgU3RyaW5nIHRleHRMYWJlbCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHRleHRMYWJlbCk7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIHRleHRTdHlsZSwgZ3JpZERhdGFTdHlsZSwKLQkJCQloZWlnaHQsIHdpZHRoLCBob3Jpem9udGFsU3Bhbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZS1saW5lIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0LCAyKTsKLQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvdWJsZS1saW5lIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMihGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMLCA0MCwgMzAwLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc2luZ2xlIG9yIG11bHRpLWxpbmUgdGV4dCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwzKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0LCBpbnQgaGVpZ2h0LCBpbnQgc2luZ2xlT3JNdWx0aSkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIHNpbmdsZU9yTXVsdGkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlRSQVZFUlNFX1RBQl9ORVhULAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgaGVpZ2h0LAotCQkJCTMwMCwgMik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZSBvciBtdWx0aS1saW5lIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgaW4gYSBjb21wb3NpdGUuCi0JICogCi0JICogQGF1dGhvciBob3Blc2hhcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsNChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCwgaW50IGhlaWdodCwgaW50IHNpbmdsZU9yTXVsdGksIFN0cmluZyBmaWxsVGV4dCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCQotCQlpbnQgaG9yaXpvbnRhbFNwYW4gPSBjYWxjdWxhdGVTcGFuKGZpbGxUZXh0KTsKLQkJCi0JCWlmKGhvcml6b250YWxTcGFuPT0xKXsKLQkJCVRleHQgdGV4dCA9IGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgc2luZ2xlT3JNdWx0aSB8IFNXVC5XUkFQCi0JCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlRSQVZFUlNFX1RBQl9ORVhULCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwsIGhlaWdodCwgMjAwLCAxKTsKLQkJCVRleHQgdGV4dDIgPSBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIHNpbmdsZU9yTXVsdGkgfCBTV1QuV1JBUAotCQkJCQl8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMLCBoZWlnaHQsIDEwMCwgMSk7Ci0JCQl0ZXh0Mi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwKLQkJCQkJIiIsIDEpOwotCQkJcmV0dXJuIHRleHQ7Ci0JCX1lbHNlewotCQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgc2luZ2xlT3JNdWx0aSB8IFNXVC5XUkFQCi0JCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlRSQVZFUlNFX1RBQl9ORVhULAotCQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwsIGhlaWdodCwKLQkJCQkJMzAwLCAzKTsKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgZG91YmxlLWxpbmUgdGV4dCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiBAYXV0aG9yIGhvcGVzaGFyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWw1KEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0LCAyKTsKLQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwsIDQwLCAzMDAsIDIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgc2luZ2xlIG9yIG11bHRpLWxpbmUgdGV4dCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiBAYXV0aG9yIGhvcGVzaGFyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWw1KEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0LCBpbnQgaGVpZ2h0LCBpbnQgc2luZ2xlT3JNdWx0aSkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIHNpbmdsZU9yTXVsdGkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlRSQVZFUlNFX1RBQl9ORVhULAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgaGVpZ2h0LAotCQkJCTMwMCwgMyk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21ib2JveCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAYXV0aG9yIGhvcGVzaGFyZWQKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tYm9ib3g8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDb21ib1dpdGhMYWJlbDMoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBsYWJlbFRleHQpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQsIDIpOwotCQlyZXR1cm4gY3JlYXRlQ29tYm8ocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkZMQVQgfCBTV1QuUkVBRF9PTkxZIHxTV1QuVFJBVkVSU0VfVEFCX05FWFQsCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsY3VsYXRlIHRoZSB0ZXh0J3MgaG9yaXpvbnRhbCBzcGFuLgotCSAqIAotCSAqIEBhdXRob3IgaG9wZXNoYXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50IGNhbGN1bGF0ZVNwYW4oU3RyaW5nIGZpbGxUZXh0KXsKLQkJaW50IGxlbmd0aCA9IGZpbGxUZXh0Lmxlbmd0aCgpOwotCi0JCWlmKGxlbmd0aCA8IDYwKQotCQkJcmV0dXJuIDE7Ci0JCXJldHVybiAyOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhcmdlIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogPHA+Ci0JICogVXNlZCBmb3IgdGhlIEJyaWVmIERlc2NyaXB0aW9uIGJveC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWxMYXJnZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0KTsKLQkJKChHcmlkRGF0YSkgbGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBTV1QuREVGQVVMVDsKLQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwsIDgwLCBTV1QuREVGQVVMVCwgMyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBoeXBlcmxpbmsgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvciB0aGUgaHlwZXJsaW5rLgotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgVGhlIGh5cGVybGluayBpbWFnZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkltYWdlSHlwZXJsaW5rPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgY3JlYXRlSW1hZ2VIeXBlcmxpbmsoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBJbWFnZSBpbWFnZSkgewotCQlJbWFnZUh5cGVybGluayBsaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhwYXJlbnQsIFNXVC5MRUZUCi0JCQkJfCBTV1QuVE9QKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCQlsaW5rLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlsaW5rLnNldEltYWdlKGltYWdlKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkKLQkJCWxpbmsuc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBoeXBlcmxpbmsgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHNlY3Rpb25JZAotCSAqICAgICAgICAgICAgVGhlIHNjdGlvbiBJRC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkltYWdlSHlwZXJsaW5rPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgY3JlYXRlSHlwZXJMaW5rKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgZXhwYW5kZWRDb21wb3NpdGUsIGludCBzZWN0aW9uSUQpIHsKLQkJU0VDVElPTl9JRCA9IHNlY3Rpb25JRDsKLQkJSW1hZ2VIeXBlcmxpbmsgZXhwYW5kTGluayA9IHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsoCi0JCQkJZXhwYW5kZWRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZXhwYW5kTGluay5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfRVhQQU5ERUQpOwotCQlleHBhbmRMaW5rLnNldFVuZGVybGluZWQoZmFsc2UpOwotCQlleHBhbmRMaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdG9nZ2xlKGUsIFNFQ1RJT05fSUQpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGV4cGFuZExpbms7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBjb250cm9sIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIHJpY2ggdGV4dCBzdHlsZS4KLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICogICAgICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSBjb250cm9sLgotCSAqIEBwYXJhbSB3aWR0aAotCSAqICAgICAgICAgICAgVGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGNvbnRyb2wuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgVGV4dCBjb250cm9sLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SU1ldGhvZFJpY2hUZXh0PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0RWRpdChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhlaWdodCwKLQkJCWludCB3aWR0aCwgaW50IGhvcml6b250YWxTcGFuLCBEZWNvcmF0ZWRGaWVsZCBsYWJlbCkgewotCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSBNZXRob2RGb3JtVG9vbGtpdC5jcmVhdGVSaWNoVGV4dCh0b29sa2l0LAotCQkJCXBhcmVudCwgIiIsIHN0eWxlLCBjb250ZW50RWxlbWVudFBhdGgsIG1ldGhvZEVsZW1lbnQsIGxhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCXJpY2hUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gcmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBjb250cm9sIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SU1ldGhvZFJpY2hUZXh0PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0RWRpdChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlUmljaFRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBTV1QuREVGQVVMVCwKLQkJCQlTV1QuREVGQVVMVCwgMSwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRGVjb3JhdGVkRmllbGQgY3JlYXRlRGVjb3JhdGVkTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBjcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHRleHQsIEdyaWREYXRhLkJFR0lOTklORywgMSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgRGVjb3JhdGVkRmllbGQgY3JlYXRlRGVjb3JhdGVkTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0LCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCURlY29yYXRlZEZpZWxkIGRlY29yYXRlZExhYmVsID0gbmV3IERlY29yYXRlZEZpZWxkKHBhcmVudCwgU1dULldSQVAgfCBTV1QuTEVGVF9UT19SSUdIVCwgZGVjb3JhdGVkTGFiZWxDcmVhdG9yKTsKLQkJZGVjb3JhdGVkTGFiZWwuc2V0VXNlTWF4aW11bURlY29yYXRpb25XaWR0aChmYWxzZSk7Ci0JCUxhYmVsIGxhYmVsID0gKExhYmVsKWRlY29yYXRlZExhYmVsLmdldENvbnRyb2woKTsKLQkJLy8gc2V0IGNvbG9ycywgZXRjCi0JCXRvb2xraXQuYWRhcHQobGFiZWwsIGZhbHNlLCBmYWxzZSk7Ci0JCXRvb2xraXQuYWRhcHQoZGVjb3JhdGVkTGFiZWwuZ2V0TGF5b3V0Q29udHJvbCgpLCBmYWxzZSwgZmFsc2UpOwotCQkvLyBzZXQgbGFiZWwgdGV4dAotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQkvLyBzZXQgbGF5b3V0IGRhdGEKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gKGhvcml6b250YWxTcGFuID09IDIpID8gMTE1IDogMTAwOwotCQlkZWNvcmF0ZWRMYWJlbC5nZXRMYXlvdXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBkZWNvcmF0ZWRMYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGNvbnRyb2wgd2l0aCBhIGltYWdlIGh5cGVyTGluayBhbmQgbGFiZWwgb24gYSBmb3JtCi0JICogcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBzZWN0aW9uSWQKLQkgKiAgICAgICAgICAgIFRoZSBzZWN0aW9uIElELgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SVJpY2hNZXRob2RUZXh0PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rKAotCQkJRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCwKLQkJCWludCBoZWlnaHQsIGludCB3aWR0aCwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCUltYWdlSHlwZXJsaW5rIGxpbmsgPSBjcmVhdGVJbWFnZUh5cGVybGluayh0b29sa2l0LCBwYXJlbnQsIG51bGwsCi0JCQkJQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0NPTExBUFNFRCk7Ci0JCWxpbmsuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMub3BlblJURSk7Ci0JCS8vIGNyZWF0ZSBEZWNvcmF0ZWRGaWVsZCBoZXJlIGZvciBtYXJrZXJzCi0JCURlY29yYXRlZEZpZWxkIGRlY29yYXRlZExhYmVsID0gY3JlYXRlRGVjb3JhdGVkTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQpOwotCi0JCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gY3JlYXRlUmljaFRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJCi0JCQkJfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBoZWlnaHQsCi0JCQkJd2lkdGgsIGhvcml6b250YWxTcGFuLCBkZWNvcmF0ZWRMYWJlbCk7Ci0KLQkJbGluay5zZXRIcmVmKGNvbnRyb2wpOwotCQlsaW5rLnNldERhdGEoIlRpdGxlIiwgbGFiZWxUZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdG9nZ2xlKGUpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByaWNoIHRleHQgY29udHJvbCB3aXRoIGEgaW1hZ2UgaHlwZXJMaW5rIGFuZCBsYWJlbCBvbiBhIGZvcm0KLQkgKiBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHBhcmFtIHNlY3Rpb25JZAotCSAqICAgICAgICAgICAgVGhlIHNlY3Rpb24gSUQuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5JUmljaE1ldGhvZFRleHQ8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCwKLQkJCWludCBoZWlnaHQsIGludCB3aWR0aCwgaW50IHNlY3Rpb25JRCkgewotCQlmaW5hbCBpbnQgU0VDVElPTl9JRCA9IHNlY3Rpb25JRDsKLQkJSW1hZ2VIeXBlcmxpbmsgbGluayA9IGNyZWF0ZUltYWdlSHlwZXJsaW5rKHRvb2xraXQsIHBhcmVudCwgbnVsbCwKLQkJCQlBdXRob3JpbmdVSUltYWdlcy5JTUdfQ09MTEFQU0VEKTsKLQkJbGluay5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5vcGVuUlRFKTsKLQkJLy8gY3JlYXRlIERlY29yYXRlZEZpZWxkIGhlcmUgZm9yIG1hcmtlcnMKLQkJRGVjb3JhdGVkRmllbGQgZGVjb3JhdGVkTGFiZWwgPSBjcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCk7Ci0KLQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBjcmVhdGVSaWNoVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkKLQkJCQl8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIGhlaWdodCwKLQkJCQl3aWR0aCwgMSwgZGVjb3JhdGVkTGFiZWwpOwotCi0JCWxpbmsuc2V0SHJlZihjb250cm9sKTsKLQkJbGluay5zZXREYXRhKCJUaXRsZSIsIGxhYmVsVGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJbGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCXRvZ2dsZShlLCBTRUNUSU9OX0lEKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBlZGl0b3Igb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgcmljaCB0ZXh0IHN0eWxlLgotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKiAgICAgICAgICAgIFRoZSBoZWlnaHQgb2YgdGhlIGNvbnRyb2wuCi0JICogQHBhcmFtIHdpZHRoCi0JICogICAgICAgICAgICBUaGUgd2lkdGggb2YgdGhlIHRleHQgY29udHJvbC4KLQkgKiBAcGFyYW0gaG9yaXpvbnRhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBUZXh0IGNvbnRyb2wuCi0JICogQHJldHVybiBUaGUgbmV3IDxjb2RlPklNZXRob2RSaWNoVGV4dEVkaXRvcjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dEVkaXRvciBjcmVhdGVSaWNoVGV4dEVkaXRvcihGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhlaWdodCwKLQkJCWludCB3aWR0aCwgaW50IGhvcml6b250YWxTcGFuLCBEZWNvcmF0ZWRGaWVsZCBsYWJlbCkgewotCQlJTWV0aG9kUmljaFRleHRFZGl0b3IgZWRpdG9yID0gTWV0aG9kRm9ybVRvb2xraXQuY3JlYXRlUmljaFRleHRFZGl0b3IoCi0JCQkJdG9vbGtpdCwgcGFyZW50LCAiIiwgc3R5bGUsIGNvbnRlbnRFbGVtZW50UGF0aCwgbWV0aG9kRWxlbWVudCwgbGFiZWwsIGdldEVkaXRvcigpLmdldEVkaXRvclNpdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQllZGl0b3Iuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBlZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbWJvYm94IGNvbnRyb2wgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgQ29tYm9ib3ggc3R5bGUuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvYm94PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgZ3JpZERhdGFTdHlsZSkgewotCQlDb21ibyBjb250cm9sID0gbmV3IENvbWJvKHBhcmVudCwgc3R5bGUpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tYm9ib3ggY29udHJvbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvYm94PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlQ29tYm8ocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkZMQVQgfCBTV1QuUkVBRF9PTkxZLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbWJvYm94IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvciB0aGUgTGFiZWwuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgQ29tYm9ib3ggc3R5bGUuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvYm94PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlQ0NvbWJvV2l0aExhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dExhYmVsLCBpbnQgc3R5bGUsIGludCBncmlkRGF0YVN0eWxlKSB7Ci0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgdGV4dExhYmVsKTsKLQkJcmV0dXJuIGNyZWF0ZUNvbWJvKHBhcmVudCwgc3R5bGUsIGdyaWREYXRhU3R5bGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21ib2JveCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tYm9ib3g8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDb21ib1dpdGhMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGxhYmVsVGV4dCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCk7Ci0JCXJldHVybiBjcmVhdGVDb21ibyhwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuRkxBVCB8IFNXVC5SRUFEX09OTFksCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tcG9zaXRlIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBzZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IHNlY3Rpb24uCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoRm9ybVRvb2xraXQgdG9vbGtpdCwgU2VjdGlvbiBzZWN0aW9uKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gZ3JpZERhdGFTdHlsZQotCSAqICAgICAgICAgICAgVGhlIEdyaWREYXRhIHN0eWxlLgotCSAqIEBwYXJhbSB2ZXJ0aWNhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2Ygcm93IGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBDb21wb3NpdGUuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgQ29tcG9zaXRlLgotCSAqIEBwYXJhbSBudW1Db2x1bW5zCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWQuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IGdyaWREYXRhU3R5bGUsIGludCB2ZXJ0aWNhbFNwYW4sCi0JCQlpbnQgaG9yaXpvbnRhbFNwYW4sIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IHZlcnRpY2FsU3BhbjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG51bUNvbHVtbnMsIGZhbHNlKSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdmVydGljYWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJvdyBjZWxscyB0YWtlbiB1cCBieSB0aGUgQ29tcG9zaXRlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCB2ZXJ0aWNhbFNwYW4pIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBwYXJlbnQsIEdyaWREYXRhLkZJTExfQk9USCwKLQkJCQl2ZXJ0aWNhbFNwYW4sIDEsIDEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21wb3NpdGUgZm9yIGRpc3BsYXlpbmcgYnV0dG9ucyBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgVGhlIENvbXBvc2l0ZSB0eXBlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGVGb3JCdXR0b25zKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgcGFyZW50LCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSLCBTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIDEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBleHBhbmRlZCBjb21wb3NpdGUgaW4gdGhlIGZvcm0KLQkgKiA8cD4KLQkgKiBVc2VkIHRvIGhvbGQgYW4gZXhwYW5kZWQgcmljaCB0ZXh0IGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVFeHBhbmRlZENvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZXhwYW5kZWRDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJcmV0dXJuIGV4cGFuZGVkQ29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0YWJsZSBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBUYWJsZSBzdHlsZS4KLQkgKiBAcGFyYW0gZ3JpZERhdGFTdHlsZQotCSAqICAgICAgICAgICAgVGhlIEdyaWREYXRhIHN0eWxlLgotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKiAgICAgICAgICAgIFRoZSBoZWlnaHQgb2YgdGhlIFRhYmxlLgotCSAqIEBwYXJhbSB3aWR0aAotCSAqICAgICAgICAgICAgVGhlIHdpZHRoIG9mIHRoZSBUYWJsZS4KLQkgKiBAcGFyYW0gdmVydGljYWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJvdyBjZWxscyB0YWtlbiB1cCBieSB0aGUgVGFibGUuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgVGFibGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UYWJsZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUYWJsZSBjcmVhdGVUYWJsZShGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHN0eWxlLCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhlaWdodCwgaW50IHdpZHRoLAotCQkJaW50IHZlcnRpY2FsU3BhbiwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCVRhYmxlIHRhYmxlID0gdG9vbGtpdC5jcmVhdGVUYWJsZShwYXJlbnQsIHN0eWxlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSB2ZXJ0aWNhbFNwYW47Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRhYmxlIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICBUaGUgdGFibGUgdGFibGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UYWJsZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUYWJsZSBjcmVhdGVUYWJsZShGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHR5cGUpIHsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgU01BTExfU0laRToKLQkJCXJldHVybiBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQk1NiwgMjAwLCAxLCAxKTsKLQkJY2FzZSBNRURJVU1fU0laRToKLQkJCXJldHVybiBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQkxMTIsIDIwMCwgMSwgMSk7Ci0JCWNhc2UgTEFSR0VfU0laRToKLQkJCXJldHVybiBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQkyMDAsIDIwMCwgMSwgMSk7Ci0JCWNhc2UgU0lOR0xFX1JPVzoKLQkJCXJldHVybiBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwKLQkJCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCAyMCwgMjAwLCAxLCAxKTsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBidXR0b24gb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIFRoZSBidXR0b24gdHlwZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkJ1dHRvbjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdXR0b24gY3JlYXRlQnV0dG9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgdHlwZSkgewotCQlCdXR0b24gYnV0dG9uOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBBRERfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuQUREX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBSRU1PVkVfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuUkVNT1ZFX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBVUF9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5VUF9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRE9XTl9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5ET1dOX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUkRFUl9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5PUkRFUl9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0VMRUNUX0JVVFRPTjoKLQkJCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LlNFTEVDVF9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0xFQVJfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuQ0xFQVJfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQljYXNlIEFUVEFDSF9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5BVFRBQ0hfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQljYXNlIERFVEFDSF9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVRBQ0hfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgaGVpZ2h0IG9mIHRoZSByaWNoIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4KLQkgKiAJCUhlaWdodCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCkgewotCQlyZXR1cm4gZm9ybS5nZXRCb3VuZHMoKS5oZWlnaHQgLSAzICogMzI7Ci0JfQotCi0JLyoqCi0JICogR2V0IHdpZHRoIG9mIHRoZSByaWNoIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4KLQkgKiAJCVdpZHRoIG9mIHRoZSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpIHsKLQkJaW50IHdpZHRoID0gOTcwOwotCQlpbnQgbGFzdFdpZHRoID0gUmljaFRleHRUb29sQmFyLmdldExhc3RXaWR0aCgpOwotCQlpZiAobGFzdFdpZHRoICE9IC0xKSB7Ci0JCQl3aWR0aCA9IGxhc3RXaWR0aDsKLQkJfQotCQlyZXR1cm4gTWF0aC5tYXgod2lkdGgsIGZvcm0uZ2V0Qm91bmRzKCkud2lkdGggLSAyICogMzIpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ2F0ZWdvcnlHdWlkYW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DYXRlZ29yeUd1aWRhbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTk5ZjBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DYXRlZ29yeUd1aWRhbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkd1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBHdWlkYW5jZSBwYWdlIGluIHRoZSBjb250ZW50IGVsZW1lbnQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogVE9ETyAtIGNoYW5nZSBuYW1lIG9mIGNsYXNzIHRvIENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeUd1aWRhbmNlUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJjYXRlZ29yeUd1aWRhbmNlc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDYXRlZ29yeUd1aWRhbmNlUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkdVSURBTkNFX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBsaXN0ID0gTWV0aG9kRWxlbWVudFV0aWwKLQkJCQkJCS5nZXRTZWxlY3RlZEd1aWRhbmNlcyhjb250ZW50RWxlbWVudCk7Ci0JCQkJTGlzdCBsb2NhbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IgJiYgY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUb29sKSB8fCBvYmoKLQkJCQkJCQkuZXF1YWxzKGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSkpIHsKLQkJCQkJCWxvY2FsLmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBsb2NhbC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIEd1aWRhbmNlIGZvciBjb250ZW50IGVsZW1lbnQuCi0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQkJCQkoRXhhbXBsZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gYWRkIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkidG8gIgotCQkJCQkJCQkJCQkrIGNvbnRlbnRFbGVtZW50LmdldFR5cGUoKQotCQkJCQkJCQkJCQkJCS5nZXROYW1lKCkKLQkJCQkJCQkJCQkJKyAiOiIgKyBjb250ZW50RWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBHdWlkYW5jZSBmb3IgdGhlIG1ldGhvZCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJCQkJKENvbmNlcHQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJKEd1aWRlbGluZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJKFJldXNhYmxlQXNzZXQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5hYmxlIHRvIHJlbW92ZSBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJImZyb20gIgotCQkJCQkJCQkJCQkrIGNvbnRlbnRFbGVtZW50LmdldFR5cGUoKQotCQkJCQkJCQkJCQkJCS5nZXROYW1lKCkKLQkJCQkJCQkJCQkJKyAiOiIgKyBjb250ZW50RWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBHdWlkYW5jZUZpbHRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NoZWNrbGlzdEl0ZW1zUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NoZWNrbGlzdEl0ZW1zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZGExYjVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DaGVja2xpc3RJdGVtc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuU2VjdGlvbnNPcmRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkVkaXRvcnNDb250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlbW92ZUZyb21TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU2VjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkRlY29yYXRlZEZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLQotLyoqCi0gKiBUaGUgQ2hlY2sgSXRlbSBwYWdlIGluIHRoZSBDaGVja2xpc3QgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENoZWNrbGlzdEl0ZW1zUGFnZSBleHRlbmRzIEJhc2VGb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImNoZWNrbGlzdENoZWNrSXRlbXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbmFtZTsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYWRkLCBjdHJsX2RlbGV0ZSwgY3RybF91cCwgY3RybF9kb3duLCBjdHJsX29yZGVyOwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX2NoZWNrSXRlbXM7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGNoZWNrSXRlbXNUYWJsZVZpZXdlcjsKLQotCXByaXZhdGUgU2VjdGlvbkxpc3QgYWxsY2hlY2tJdGVtczsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGFjdGl2ZUNvbnRyb2w7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVzY0V4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGN0cmxfZXhwYW5kZWQ7Ci0KLQlwcml2YXRlIEltYWdlSHlwZXJsaW5rIGV4cGFuZExpbms7Ci0KLQlwcml2YXRlIERlY29yYXRlZEZpZWxkIGV4cGFuZExhYmVsOwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gZm9ybVNlY3Rpb247Ci0JcHJpdmF0ZSBTZWN0aW9uIGdlbmVyYWxTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlOwotCXByaXZhdGUgQ29tcG9zaXRlIGdlbmVyYWxDb21wb3NpdGU7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBleHBhbmRlZENvbXBvc2l0ZTsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfbWFpbmRlc2M7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNoZWNrSXRlbXNWaWV3ZXJDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGNoZWNrSXRlbXNWaWV3ZXJMYWJlbFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBDaGVja2xpc3QgY2hlY2tsaXN0OwotCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gY3VycmVudEl0ZW07Ci0KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGliTGlzdGVuZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBjb250ZW50TW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENoZWNrbGlzdEl0ZW1zUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkNIRUNLX0lURU1TX1RFWFQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgbWV0aG9kRWxlbWVudElucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCWNoZWNrbGlzdCA9IChDaGVja2xpc3QpIG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGZvcm0gY29udGVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0KLQkJU3RyaW5nIGVsZW1lbnRMYWJlbCA9IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KG1ldGhvZEVsZW1lbnQpOwotCQlmb3JtLnNldFRleHQoTGlicmFyeVVJVGV4dC5URVhUX0dVSURBTkNFCi0JCQkJKyAiICgiICsgZWxlbWVudExhYmVsICsgIik6ICIgKyBtZXRob2RFbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJZm9ybVNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksIFNlY3Rpb24uTk9fVElUTEUpOwotCQl7Ci0JCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQkJZm9ybVNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQkJfQotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSBmb3IgdGhlIHNlY3Rpb25zLgotCQlzZWN0aW9uQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZm9ybVNlY3Rpb24sIFNXVC5OT05FKTsKLQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCXNlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0JCWZvcm1TZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ29tcG9zaXRlKTsKLQotCQkvLyBDcmVhdGUgdGhlIEdlbmVyYWwgSW5mb3JtYXRpb24gc2VjdGlvbi4KLQkJZ2VuZXJhbFNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlTZWN0aW9uLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUKLQkJCQkJCXwgU2VjdGlvbi5FWFBBTkRFRCk7Ci0JCWdlbmVyYWxTZWN0aW9uCi0JCQkJLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuQ0hFQ0tfSVRFTVNfU0VDVElPTl9OQU1FKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlUZXh0LkNIRUNLX0lURU1TX1NFQ1RJT05fREVTQyk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlnZW5lcmFsQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbFNlY3Rpb24pOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCg0LCBmYWxzZSkpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRDbGllbnQoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0KLQkJRWRpdG9yc0NvbnRleHRIZWxwZXIuc2V0SGVscChnZW5lcmFsQ29tcG9zaXRlLmdldFBhcmVudCgpLCBjaGVja2xpc3QpOwotCi0JCUNvbXBvc2l0ZSBwYW5lMSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCXBhbmUxLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJcGFuZTEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl9Ci0KLQkJTGFiZWwgbF9uYW1lID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYW5lMSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQ0hFQ0tfSVRFTVNfVEVYVCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlsX25hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX2NoZWNrSXRlbXMgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKHBhbmUxLCBTV1QuTVVMVEkpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDE1MDsKLQkJCWN0cmxfY2hlY2tJdGVtcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWluaXRQcm92aWRlcnMoKTsKLQotCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9jaGVja0l0ZW1zKTsKLQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJLnNldENvbnRlbnRQcm92aWRlcihjaGVja0l0ZW1zVmlld2VyQ29udGVudFByb3ZpZGVyKTsKLQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoY2hlY2tJdGVtc1ZpZXdlckxhYmVsUHJvdmlkZXIpOwotCi0JCUNvbXBvc2l0ZSBwYW5lMiA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUpOwotCQlwYW5lMi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCXBhbmUyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljdHJsX2FkZCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLCBBdXRob3JpbmdVSVRleHQuQUREX0JVVFRPTl9URVhULAotCQkJCVNXVC5OT05FKTsKLQkJY3RybF9hZGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF9kZWxldGUgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVMRVRFX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCWN0cmxfZGVsZXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljdHJsX2RlbGV0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljdHJsX3VwID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsIEF1dGhvcmluZ1VJVGV4dC5VUF9CVVRUT05fVEVYVCwKLQkJCQlTV1QuTk9ORSk7Ci0JCWN0cmxfdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY3RybF9kb3duID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJY3RybF9kb3duLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY3RybF9vcmRlciA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5PUkRFUl9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQljdHJsX29yZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIG5hbWUKLQkJTGFiZWwgbmFtZUxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5OQU1FX1RFWFQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWN0cmxfbmFtZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULlNJTkdMRSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJCWN0cmxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWNyZWF0ZUJsYW5rTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgNCk7Ci0JCQotCQljdHJsX21haW5kZXNjID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmsoCi0JCQkJdG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1RFWFQsCi0JCQkJMjUwLCAzMDAsIDQpOwotCi0JCWNyZWF0ZVJpY2hUZXh0RWRpdG9yU2VjdGlvbigpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTIpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihnZW5lcmFsQ29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZXhwYW5kZWRDb21wb3NpdGUpOwotCi0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJbG9hZERhdGEoKTsKLQkJZW5hYmxlQ29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlicmFyeSBhbmQgc2VsZWN0aW9uIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKGN1cnJlbnRJdGVtKTsKLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCi0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0vLwkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KChFT2JqZWN0KSBjaGVja2xpc3QsCi0vLwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLS8vCQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCQkJbG9hZERhdGEoKTsKLS8vCQkJCX0KLQkJCQlsb2FkRGF0YSgpOwotCQkJCWlmIChUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQllbmFibGVDb250cm9scyhmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9hZGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJY2hlY2tTZWxlY3Rpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlkZWFjdGl2YXRlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZvcm0uYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCWlmIChjdHJsX2V4cGFuZGVkICE9IG51bGwpIHsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLmhlaWdodEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpOwotCQkJCQkoKEdyaWREYXRhKSBjdHJsX2V4cGFuZGVkLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpOwotCQkJCX0KLQkJCQlmb3JtU2VjdGlvbi5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9uYW1lLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlpZiAoY3VycmVudEl0ZW0gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkTmFtZSA9IGN1cnJlbnRJdGVtLmdldE5hbWUoKTsKLQkJCQkJU3RyaW5nIG5ld05hbWUgPSBjdHJsX25hbWUuZ2V0VGV4dCgpOwotCQkJCQkvL25ld05hbWUgPSBTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKG5ld05hbWUpOwotCQkJCQlpZiAoY3RybF9uYW1lLmdldFRleHQoKSA9PSBudWxsCi0JCQkJCQkJfHwgY3RybF9uYW1lLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwgTGlicmFyeVVJVGV4dC5URVhUX0NIRUNLX0lURU0pOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnLCBTdHJVdGlsLnRvTG93ZXIoTGlicmFyeVVJVGV4dC5URVhUX0NIRUNLX0lURU0pKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKG9sZE5hbWUgIT0gbnVsbCAmJiBvbGROYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJCQkJCQkuZ2V0QWN0aW9uQmFycygpCi0JCQkJCQkJCQkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCQkJCQkJLnNldEVycm9yTWVzc2FnZSgKLQkJCQkJCQkJCQkJUGxhdGZvcm1VSQotCQkJCQkJCQkJCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkJCS5nZXRTaGFyZWRJbWFnZXMoKQotCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgKLQkJCQkJCQkJCQkJCQkJCUlTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKSwKLQkJCQkJCQkJCQkJbXNnKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmICghb2xkTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQljdXJyZW50SXRlbSwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJCQkJbmV3TmFtZSwgLTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX21haW5kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbWFpbmRlc2MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlzYXZlTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQljaGVja1NlbGVjdGlvbigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF9hZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIGNoaWxkID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVTZWN0aW9uKCk7Ci0JCQkJU3RyaW5nIG5ld05hbWUgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUF1dGhvcmluZ1VJVGV4dC5ORVdfRUxFTUVOVF9URVhULAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgTGlicmFyeVVJVGV4dC5URVhUX0NIRUNLX0lURU0gfSk7Ci0JCQkJY2hpbGQuc2V0TmFtZShuZXdOYW1lKTsKLQkJCQlBZGRUb1NlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQoCi0JCQkJCQljaGVja2xpc3QsIGNoaWxkLCBhbGxjaGVja0l0ZW1zKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCWNoaWxkKSk7Ci0JCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJY3RybF9uYW1lLnNldFNlbGVjdGlvbigwLCBuZXdOYW1lLmxlbmd0aCgpKTsKLQkJCQlnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkKLQkJCQkJCS5zZXRFcnJvck1lc3NhZ2UoIiIpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2RlbGV0ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkKLQkJCQkJCS5zZXRFcnJvck1lc3NhZ2UoIiIpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLnRvTGlzdCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uKSB7Ci0JCQkJCQlSZW1vdmVGcm9tU2VjdGlvbkxpc3QgY21kID0gbmV3IFJlbW92ZUZyb21TZWN0aW9uTGlzdCgKLQkJCQkJCQkJY2hlY2tsaXN0LCAob3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uKSBvLAotCQkJCQkJCQlhbGxjaGVja0l0ZW1zKTsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQllZGl0SXRlbShudWxsKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF91cC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCi0JCQkJQXJyYXlMaXN0IG1vdmVVcEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVVcEl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCU1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKAotCQkJCQkJY2hlY2tsaXN0LCBtb3ZlVXBJdGVtcywgYWxsY2hlY2tJdGVtcywgMSk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQotCQkJCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNoZWNrbGlzdCkpIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChjaGVja0l0ZW1zVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNoZWNrbGlzdCkpIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9kb3duLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJQXJyYXlMaXN0IG1vdmVEb3duSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW92ZURvd25JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCWNoZWNrbGlzdCwgbW92ZURvd25JdGVtcywgYWxsY2hlY2tJdGVtcywgMCk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQotCQkJCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNoZWNrbGlzdCkpIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChjaGVja0l0ZW1zVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNoZWNrbGlzdCkpIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9vcmRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTZWN0aW9uc09yZGVyRGlhbG9nIGRsZyA9IG5ldyBTZWN0aW9uc09yZGVyRGlhbG9nKAotCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCWNoZWNrbGlzdCwKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoZWNrbGlzdE9yZGVyX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5DaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ2hlY2tsaXN0T3JkZXJfY2hlY2tsaXN0aXRlbXNfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlkbGcub3BlbigpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVDb250cm9scyhib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfbWFpbmRlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2FkZC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9kZWxldGUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfdXAuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfZG93bi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9vcmRlci5zZXRFbmFibGVkKHRydWUpOwotCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJLy8gU2F2ZSB0aGUgSXRlbSBvcmRlci4KLQkJaWYgKGFsbGNoZWNrSXRlbXMgIT0gbnVsbCkgewotCQkJYWxsY2hlY2tJdGVtcy5hcHBseSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGNvbnRyb2xzIHdpdGggZGF0YSBmcm9tIHRoZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCWFsbGNoZWNrSXRlbXMgPSBudWxsOwotCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIuc2V0SW5wdXQoY2hlY2tsaXN0KTsKLQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJZWRpdEl0ZW0oY3VycmVudEl0ZW0pOwotCX0KLQotCS8qKgotCSAqIEVkaXQgY3VycmVudCBJdGVtLgotCSAqLwotCXByaXZhdGUgdm9pZCBlZGl0SXRlbShvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gaXRlbSkgewotCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQotCQlpZiAoY3RybF9tYWluZGVzYy5nZXRNb2RpZmllZCgpKSB7Ci0JCQlzYXZlTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCX0KLQotCQljdXJyZW50SXRlbSA9IGl0ZW07Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY3VycmVudEl0ZW0gIT0gbnVsbCkgewotCQkJbmFtZSA9IGN1cnJlbnRJdGVtLmdldE5hbWUoKTsKLQkJCWRlc2MgPSBjdXJyZW50SXRlbS5nZXRTZWN0aW9uRGVzY3JpcHRpb24oKTsKLQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0JCQkJCS5zZXRFcnJvck1lc3NhZ2UoIiIpOwotCQl9Ci0JCWN0cmxfbmFtZS5zZXRUZXh0KG5hbWUgPT0gbnVsbCA/ICIiIDogbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9tYWluZGVzYy5zZXRUZXh0KGRlc2MgPT0gbnVsbCA/ICIiIDogZGVzYyk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9tYWluZGVzYy5zZXRNb2RhbE9iamVjdChjdXJyZW50SXRlbSk7Ci0JCWN0cmxfbWFpbmRlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNlY3Rpb25fU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQkvLyBjbG9zZSBhbnkgRmluZC9SZXBsYWNlIGRpYWxvZyBvcGVuIGluIHRoZSBSVEUKLQkJCWN0cmxfbWFpbmRlc2MuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKS5kaXNwb3NlKCk7Ci0JCX0KLQotCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkuc2V0RWxlbWVudChjdXJyZW50SXRlbSk7Ci0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXREaXNhYmxlKGN1cnJlbnRJdGVtID09IG51bGwpOwotCi0JCWVuYWJsZUNvbnRyb2xzKCk7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGNvbnRyb2xzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUNvbnRyb2xzKCkgewotCQlpZiAoY2hlY2tsaXN0LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY29udGFpbnMoY3VycmVudEl0ZW0pKSB7Ci0JCQlpZiAoIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJY3RybF9uYW1lLnNldEVkaXRhYmxlKHRydWUpOwotCQkJCWN0cmxfbWFpbmRlc2Muc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX25hbWUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJY3RybF9tYWluZGVzYy5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIGxpc3RlbmVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGxpYkxpc3RlbmVyICE9IG51bGwpIHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYkxpc3RlbmVyKTsKLQkJCX0KLQkJCWxpYkxpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVSaWNoVGV4dEVkaXRvclNlY3Rpb24oKSB7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZm9ybVNlY3Rpb24sIFNXVC5OT05FKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJLy8gSHlwZXJsaW5rIGRlc2MKLQkJZXhwYW5kTGluayA9IHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsoZXhwYW5kZWRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZXhwYW5kTGluay5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfRVhQQU5ERUQpOwotCQlleHBhbmRMaW5rLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsb3NlUlRFKTsgLy8kTk9OLU5MUy0xJAotCQlleHBhbmRMaW5rLnNldFVuZGVybGluZWQoZmFsc2UpOwotCQlleHBhbmRMaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdG9nZ2xlKGUpOwotCQkJfQotCQl9KTsKLQotCQlleHBhbmRMYWJlbCA9IGNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIGV4cGFuZGVkQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGUgRGVzY3JpcHRpb24gY29udHJvbCB0byBleHBhbmQgYW5kIGNvbnRyb2wgc3RhdGUKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlI3RvZ2dsZShvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJaWYgKGN1cnJlbnRJdGVtID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChjdHJsX2V4cGFuZGVkID09IG51bGwpIHsKLQkJCWN0cmxfZXhwYW5kZWQgPSBjcmVhdGVSaWNoVGV4dEVkaXRvcih0b29sa2l0LCBleHBhbmRlZENvbXBvc2l0ZSwKLQkJCQkJU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfQk9USCwKLQkJCQkJZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKSwgZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpLCAyLCBleHBhbmRMYWJlbCk7Ci0JCQljdHJsX2V4cGFuZGVkLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAoZGVzY0V4cGFuZEZsYWcpIHsKLQkJCXNlY3Rpb25Db21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KHNlY3Rpb25Db21wb3NpdGUpOwotCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gZ2V0QWN0aXZlUmljaFRleHRDb250cm9sKCk7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KGN0cmxfZXhwYW5kZWQuZ2V0VGV4dCgpKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHJpY2hUZXh0LmdldExpc3RlbmVycygpOyBpLmhhc05leHQoKTspIHsKLQkJCQlSaWNoVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gKFJpY2hUZXh0TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJCWN0cmxfZXhwYW5kZWQucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIuZ2V0RXZlbnRUeXBlKCksIGxpc3RlbmVyCi0JCQkJCQkuZ2V0TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQlpZiAoY3RybF9leHBhbmRlZC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCS5zYXZlTW9kaWZpZWRSaWNoVGV4dChjdHJsX2V4cGFuZGVkKTsKLQkJCX0KLQkJCXJpY2hUZXh0LnNldEZvY3VzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWN0aW9uQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWZvcm1TZWN0aW9uLnNldENsaWVudChleHBhbmRlZENvbXBvc2l0ZSk7Ci0JCQkoKExhYmVsKWV4cGFuZExhYmVsLmdldENvbnRyb2woKSkuc2V0VGV4dChjdXJyZW50SXRlbS5nZXROYW1lKCkgKwotCQkJCQkiIC0gIiArIChTdHJpbmcpICgoSW1hZ2VIeXBlcmxpbmspIGUuZ2V0U291cmNlKCkpLmdldERhdGEoIlRpdGxlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIGUuZ2V0SHJlZigpOwotCQkJY3RybF9leHBhbmRlZC5zZXRJbml0aWFsVGV4dChyaWNoVGV4dC5nZXRUZXh0KCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChyaWNoVGV4dC5nZXRNb2RhbE9iamVjdCgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKHJpY2hUZXh0Ci0JCQkJCS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEZpbmRSZXBsYWNlQWN0aW9uKHJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5hZGRMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWJvb2xlYW4gZWRpdGFibGUgPSAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWlmIChlZGl0YWJsZSkgewotCQkJCWN0cmxfZXhwYW5kZWQuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJCXNldEFjdGl2ZVJpY2hUZXh0Q29udHJvbChyaWNoVGV4dCk7Ci0JCX0KLQotCQlmb3JtLmdldEJvZHkoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCWRlc2NFeHBhbmRGbGFnID0gIWRlc2NFeHBhbmRGbGFnOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woSU1ldGhvZFJpY2hUZXh0IGVkaXRvcikgewotCQlhY3RpdmVDb250cm9sID0gZWRpdG9yOwotCX0KLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGFjdGl2ZUNvbnRyb2w7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRQcm92aWRlcnMoKSB7Ci0JCWNoZWNrSXRlbXNWaWV3ZXJDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0ICE9IGNoZWNrbGlzdCkKLQkJCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKG9iamVjdCk7Ci0JCQkJaWYgKGFsbGNoZWNrSXRlbXMgPT0gbnVsbCkgewotCQkJCQlhbGxjaGVja0l0ZW1zID0gbmV3IFNlY3Rpb25MaXN0KGNoZWNrbGlzdCwKLQkJCQkJCQlTZWN0aW9uTGlzdC5TVEVQU19GT1JfRUxFTUVOVF9PTkxZKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGFsbGNoZWNrSXRlbXMudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCWNoZWNrSXRlbXNWaWV3ZXJMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAhY2hlY2tsaXN0LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY29udGFpbnMoCi0JCQkJCQllbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZU1haW5EZXNjcmlwdGlvbigpIHsKLQkJaWYgKGN1cnJlbnRJdGVtICE9IG51bGwpIHsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCTogY3RybF9tYWluZGVzYzsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjdXJyZW50SXRlbS5nZXRTZWN0aW9uRGVzY3JpcHRpb24oKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKGNvbnRyb2wsCi0JCQkJCW9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjdXJyZW50SXRlbSwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3Rpb25fU2VjdGlvbkRlc2NyaXB0aW9uKCksCi0JCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJRm9ybUVkaXRvciBlZGl0b3IgPSBnZXRFZGl0b3IoKTsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IpIHsKLQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1NlbGVjdGlvbigpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjaGVja0l0ZW1zVGFibGVWaWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpKSB7Ci0JCQljdHJsX2RlbGV0ZS5zZXRFbmFibGVkKHRydWUpOwotCi0JCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY2hlY2tsaXN0KSAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCWlmIChjaGVja0l0ZW1zVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJZWRpdEl0ZW0oKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlnVmlld1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWdWaWV3UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZjE0NzJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWdWaWV3UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Db25maWd1cmF0aW9uT3JkZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1ZpZXdGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkZvcm1Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci0KLQotLyoqCi0gKiBQYWdlIGZvciBjdXN0b21pemluZyBwdWJsaXNoaW5nIHZpZXdzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczODI3Ci0gKiBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzQyNjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ1ZpZXdQYWdlIGV4dGVuZHMgRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBmb3JtUHJlZml4ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJpdmF0ZSBDVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQlwcml2YXRlIENUYWJJdGVtIHRhYkRlZmF1bHR2aWV3SXRlbTsKLQotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbiwgbWFrZURlZmF1bHRCdXR0b24sIG9yZGVyQnV0dG9uOwotCi0JcHJpdmF0ZSBPYmplY3Qgc2VsZWN0ZWRJdGVtID0gbnVsbDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gbnVsbDsKLQotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb25maWdWaWV3UGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigKLQkJCQllZGl0b3IsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdzLCBBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZV92aWV3cyk7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzZXRTaXRlKHNpdGUpOwotCQlzZXRJbnB1dChpbnB1dCk7Ci0KLQkJQ29uZmlndXJhdGlvbkVkaXRvcklucHV0IGNvbmZpZ0lucHV0ID0gKENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCWNvbmZpZyA9IGNvbmZpZ0lucHV0LmdldENvbmZpZ3VyYXRpb24oKTsKLQotCQlhY3Rpb25NZ3IgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0KLQkJLy8gZ2V0IHBsdWdpbiBsb2dnZXIKLQkJbG9nZ2VyID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2NyZWF0ZUZvcm1Db250ZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCWZvcm0uc2V0VGV4dChmb3JtUHJlZml4ICsgY29uZmlnLmdldE5hbWUoKSk7Ci0JCXRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQkvLyBDcmVhdGUgdGhlIHZpZXcgc2VjdGlvbi4KLQkJU2VjdGlvbiB2aWV3U2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCUdyaWREYXRhIHRkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXZpZXdTZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQl2aWV3U2VjdGlvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvblRpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQl2aWV3U2VjdGlvbgotCQkJCS5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25NZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQl2aWV3U2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJQ29tcG9zaXRlIHBhcmVudCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHZpZXdTZWN0aW9uKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl2aWV3U2VjdGlvbi5zZXRDbGllbnQocGFyZW50KTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudC5nZXRQYXJlbnQoKSwKLQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5DT05GSUdVUkFUSU9OX0VESVRPUl9BTExfQ09OVEVYVCk7Ci0KLQkJLy8gY3JlYXRlIGJ1dHRvbiBwYW5lCi0JCWNyZWF0ZUJ1dHRvblBhbmUocGFyZW50KTsKLQotCQkvLyBjcmVhdGUgdGFiZm9sZGVyIHBhbmUKLQkJY3JlYXRlVGFiUGFuZShwYXJlbnQpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhcmVudCk7Ci0JCWxvYWREYXRhKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIocGFyZW50LCBTV1QuRkxBVCB8IFNXVC5UT1AgfCBTV1QuQk9SREVSKTsKLQkJdGFiRm9sZGVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJdGFiRm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIHNldCB0YWJmb2xkZXIgYmFja2dyb3VuZCBjb2xvcgotCQlDb2xvciBzZWxlY3RlZENvbG9yID0gdG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRDb2xvcihGb3JtQ29sb3JzLlRCX0JHKTsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbkJhY2tncm91bmQobmV3IENvbG9yW10geyBzZWxlY3RlZENvbG9yLCB0b29sa2l0LmdldENvbG9ycygpLmdldEJhY2tncm91bmQoKSB9LCBuZXcgaW50W10geyA1MCB9KTsKLQkJCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHRhYkZvbGRlcik7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1dHRvblBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYnV0dG9uUGFuZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWJ1dHRvblBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKSk7Ci0KLQkJQnV0dG9uIGFkZEJ1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJYnV0dG9uUGFuZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX2FkZFZpZXdCdXR0b25UZXh0LCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2cgZmQgPSBuZXcKLQkJCQkvLyBDb25maWdQcm9jZXNzVmlld0RpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJLy8gY29uZmlnKTsKLQkJCQkvLyBDb25maWdQcm9jZXNzVmlld0RpYWxvZy5zZXREZWZhdWx0SW1hZ2UoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKS5nZXRJbWFnZSgpKTsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzVmlld0ZpbHRlcihjb25maWcsIG51bGwsCi0JCQkJCQlGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKTsKLQkJCQlDb25maWd1cmF0aW9uQWRkVmlld3NEaWFsb2cgZmQgPSBuZXcgQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nKAotCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJZmQuc2V0VHlwZXMoZ2V0VHlwZXMoKSk7Ci0JCQkJZmQKLQkJCQkJCS5zZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWdQcm9jZXNzVmlld0RpYWxvZ19TZWxlY3RDYXRlZ29yaWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZkLnNldElucHV0KGNvbmZpZyk7Ci0JCQkJZmQuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQkJZmQuc2V0RXhpc3RpbmdFbGVtZW50cyhjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCkpOwotCQkJCWZkLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKSksCi0JCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldEl0ZW1zRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQub3BlbigpOwotCQkJCUxpc3Qgdmlld3MgPSBmZC5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0KLQkJCQkvLyBhZGQgdmlldyB0byBjb25maWd1cmF0aW9uCi0JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gdmlld3MuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCi0JCQkJCQlpZiAoY29uZmlnLmdldFByb2Nlc3NWaWV3cygpLmNvbnRhaW5zKAotCQkJCQkJCQkoQ29udGVudENhdGVnb3J5KSBvYmopKSB7Ci0JCQkJCQkJU3RyaW5nIG5hbWUgPSAoKENvbnRlbnRDYXRlZ29yeSkgb2JqKS5nZXROYW1lKCk7Ci0JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX3RpdGxlOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlLCBuYW1lKTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbWVzc2FnZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJY29uZmlnLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCksCi0JCQkJCQkJCQkoQ29udGVudENhdGVnb3J5KSBvYmosIC0xKTsKLQkJCQkJCQlpZihzdGF0dXMpewotCQkJCQkJCQlhZGRWaWV3KChDb250ZW50Q2F0ZWdvcnkpIG9iaik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyByZW1vdmUgYnV0dG9uCi0JCXJlbW92ZUJ1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJYnV0dG9uUGFuZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX3JlbW92ZVZpZXdCdXR0b25UZXh0LCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZW1vdmVWaWV3KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIG1ha2UgZGVmYXVsdCBidXR0b24KLQkJbWFrZURlZmF1bHRCdXR0b24gPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCWJ1dHRvblBhbmUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZV9tYWtlRGVmYXVsdEJ1dHRvblRleHQsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJbWFrZURlZmF1bHRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJbWFrZURlZmF1bHRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCW1ha2VEZWZhdWx0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1ha2VEZWZhdWx0VmlldygpOwotCQkJfQotCQl9KTsKLQkJCi0JCW9yZGVyQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oCi0JCQkJYnV0dG9uUGFuZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5vcmRlckJ1dHRvbl90ZXh0LCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlvcmRlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUNvbmZpZ3VyYXRpb25PcmRlckRpYWxvZyBkbGcgPSBuZXcgQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nKAotCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCWNvbmZpZywKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSk7Ci0JCQkJaW50IHJldCA9IGRsZy5vcGVuKCk7Ci0JCQkJaWYocmV0ID09IFdpbmRvdy5PSykgcmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihidXR0b25QYW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNlbGVjdGVkIHZpZXcKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlVmlldygpIHsKLQkJQ1RhYkl0ZW0gaXRlbSA9IHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCS8vIGRvbid0IGNoYW5nZSBkZWZhdWx0IHZpZXcgaWYgdGhlIHZpZXcgaXMgbm90IHJlbW92ZWQuCi0JCS8vIDE1NTAyNSAtIGVycm9yIHdoZW4gcmVtb3ZpbmcgdGhlIHZpZXcgaW4gY29uZmlndXJhdGlvbgotCQlTdHJpbmcgaXRlbVRleHQgPSBpdGVtLmdldFRleHQoKTsJCQotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlLCBpdGVtIC8vJE5PTi1OTFMtMSQKLQkJLmdldFRleHQoKSk7Ci0JCWJvb2xlYW4gcmV0ID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJLmRpc3BsYXlDb25maXJtYXRpb24odGl0bGUsIG1lc3NhZ2UpOwotCi0JCWlmICghcmV0KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWJvb2xlYW4gcmVtb3ZlRGVmYXVsdCA9IGZhbHNlOwotCQlpZiAodGFiRGVmYXVsdHZpZXdJdGVtICE9IG51bGwgJiYgaXRlbSA9PSB0YWJEZWZhdWx0dmlld0l0ZW0pIHsKLQkJCXJlbW92ZURlZmF1bHQgPSB0cnVlOwotCQl9Ci0KLQkJCUxpc3Qgdmlld3MgPSBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCk7Ci0JCQkvLyBpZiB0aGVyZSBpcyBhIGRlZmF1bHQgdmlldyB0YWIsIGFuZCBpdCdzIHRoZSBvbmUgc2xlY3RlZCB0byBiZSByZW1vdmVkCi0JCQlpZiAocmVtb3ZlRGVmYXVsdCkgewotCQkJCVN0cmluZyBkZWZhdWx0VGV4dCA9ICIgIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgaWR4ID0gaXRlbVRleHQubGFzdEluZGV4T2YoZGVmYXVsdFRleHQpOwotCQkJCWlmIChpZHggPiAwKSB7Ci0JCQkJCWl0ZW1UZXh0ID0gaXRlbVRleHQuc3Vic3RyaW5nKDAsaWR4KTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHZpZXdzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCUNvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSA9IChDb250ZW50Q2F0ZWdvcnkpIGl0b3IubmV4dCgpOwotCQkJCQotCQkJCWlmIChjYXRlZ29yeS5nZXROYW1lKCkuZXF1YWxzKGl0ZW1UZXh0KSkgewotCQkJCQkvLyByZW1vdmUgaXQgZnJvbSB2aWV3cwotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBjb25maWcsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpLAotCQkJCQkJCWNhdGVnb3J5LCAtMSk7Ci0KLQkJCQkJQ29udGVudENhdGVnb3J5IGRlZmF1bHRWaWV3ID0gY29uZmlnLmdldERlZmF1bHRWaWV3KCk7Ci0KLQkJCQkJaWYgKChkZWZhdWx0VmlldyAhPSBudWxsKSAmJiAoZGVmYXVsdFZpZXcuZXF1YWxzKGNhdGVnb3J5KSkpIHsKLQkJCQkJCWlmICh2aWV3cy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJY29uZmlnLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCksCi0JCQkJCQkJCQkJCShDb250ZW50Q2F0ZWdvcnkpIHZpZXdzLmdldCgwKSwgLTEpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQljb25maWcsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSwKLQkJCQkJCQkJCQkJbnVsbCwgLTEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIHJlbW92ZSB0YWIgaXRlbQotCQkJCQlpdGVtLmRpc3Bvc2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCXZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpOwotCQlpZiAoKHZpZXdzID09IG51bGwpIHx8ICh2aWV3cy5zaXplKCkgPD0gMCkpIHsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCW1ha2VEZWZhdWx0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JCQotCQkvLyBtYWtlIHRoZSAxc3QgdGFiIGFzIHRoZSBkZWZhdWx0IHZpZXcgaWYgdGhlIGRlZmF1bHQgb25lIGlzIHJlbW92ZWQKLQkJaWYgKHJlbW92ZURlZmF1bHQpIHsKLQkJCUNvbnRyb2xbXSB0YWJMaXN0ID0gdGFiRm9sZGVyLmdldFRhYkxpc3QoKTsKLQkJCWlmICh0YWJMaXN0ICE9IG51bGwgJiYgdGFiTGlzdC5sZW5ndGggPiAwKSB7Ci0JCQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbigwKTsKLQkJCQltYWtlRGVmYXVsdFZpZXcoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB2aWV3Ci0JICogCi0JICogQHBhcmFtIG9iagotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRWaWV3KENvbnRlbnRDYXRlZ29yeSBvYmopIHsKLQkJc2VsZWN0ZWRJdGVtID0gb2JqOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJVHJlZVZpZXdlciB0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoY29tcG9zaXRlLCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUlGaWx0ZXIgY29uZmlnRmlsdGVyID0gbmV3IENvbmZpZ3VyYXRpb25GaWx0ZXIoY29uZmlnLCB0cmVlVmlld2VyKTsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRDb25maWd1cmF0aW9uVmlld19BZGFwdGVyRmFjdG9yeShjb25maWdGaWx0ZXIpOwotCi0JCUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkvLyBHZXQgdGhlIGFkYXB0ZXIgZnJvbSB0aGUgZmFjdG9yeS4KLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCS5hZGFwdChzZWxlY3RlZEl0ZW0sIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0KLQkJCQlyZXR1cm4gaXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKHNlbGVjdGVkSXRlbSkudG9BcnJheSgpOwotCQkJCS8vIHJldHVybiBpdGVtUHJvdmlkZXIuZ2V0RWxlbWVudHMoc2VsZWN0ZWRJdGVtKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb25maWd1cmF0aW9uTGFiZWxQcm92aWRlcihjb25maWcsCi0JCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJdHJ5IHsKLQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoY29uZmlnKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoIkVycm9yIGNyZWF0aW5nIHRyZWV2aWV3ZXIgZm9yIGNvbmZpZyIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJQ1RhYkl0ZW0gaXRlbSA9IG5ldyBDVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5UT1ApOwotCQlpdGVtLnNldFRleHQoKChDb250ZW50Q2F0ZWdvcnkpIG9iaikuZ2V0TmFtZSgpKTsKLQkJaXRlbS5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gbWFrZSBhbGwgYnV0dG9ucyBlbmFibGVkCi0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQltYWtlRGVmYXVsdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oaXRlbSk7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBzZWxlY3RlZCBhcyBkZWZhdWx0IHZpZXcKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFrZURlZmF1bHRWaWV3KCkgewotCQlDVGFiSXRlbSBpdGVtID0gdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpOwotCQlMaXN0IHZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB2aWV3cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSA9IChDb250ZW50Q2F0ZWdvcnkpIGl0b3IubmV4dCgpOwotCQkJaWYgKGNhdGVnb3J5LmdldE5hbWUoKS5lcXVhbHMoaXRlbS5nZXRUZXh0KCkpKSB7Ci0JCQkJY2xlYXJEZWZhdWx0Vmlld0luZGljYXRvcigpOwotCQkJCS8vIG1ha2UgdGhhdCB2aWV3IGRlZmF1bHQKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjb25maWcsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpLAotCQkJCQkJY2F0ZWdvcnksIC0xKTsKLQkJCQlzZXREZWZhdWx0Vmlld0luZGljYXRvcihpdGVtKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWQgaW5pdGlhbCBkYXRhCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQkvLyBnZXQgcHJvY2VzcyB2aWV3cwotCQlMaXN0IHZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB2aWV3cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCS8vIGNyZWF0ZSB2aWV3IGluIFVJCi0JCQlhZGRWaWV3KChDb250ZW50Q2F0ZWdvcnkpIGl0b3IubmV4dCgpKTsKLQkJfQotCi0JCS8vIGdldCBkZWZhdWx0IHZpZXcKLQkJQ29udGVudENhdGVnb3J5IGRlZmF1bHRWaWV3ID0gY29uZmlnLmdldERlZmF1bHRWaWV3KCk7Ci0JCWludCBjbnQgPSB0YWJGb2xkZXIuZ2V0SXRlbUNvdW50KCk7Ci0JCWlmIChkZWZhdWx0VmlldyAhPSBudWxsKSB7Ci0JCQkvLyBpZiBkZWZhdWx0IHZpZXcgaXMgZGVmaW5lZCwgc2VsZWN0IHRoYXQgdmlldwotCQkJQ1RhYkl0ZW1bXSBpdGVtcyA9IHRhYkZvbGRlci5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gaXRlbXNbaV0uZ2V0VGV4dCgpOwotCQkJCWlmIChuYW1lLmVxdWFscyhkZWZhdWx0Vmlldy5nZXROYW1lKCkpKSB7Ci0JCQkJCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oaXRlbXNbaV0pOwotCQkJCQlzZXREZWZhdWx0Vmlld0luZGljYXRvcihpdGVtc1tpXSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChjbnQgPiAwKSB7Ci0JCQkvLyBlbHNlIHNlbGVjdCBmaXJzdCB2aWV3Ci0JCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDApOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWZyZXNoKCl7Ci0JCUNvbnRlbnRDYXRlZ29yeSBkZWZhdWx0VmlldyA9IGNvbmZpZy5nZXREZWZhdWx0VmlldygpOwotCQlTdHJpbmcgZGVmYXVsdFZpZXdOYW1lID0gIiI7Ci0JCWlmKGRlZmF1bHRWaWV3IT1udWxsKSB7Ci0JCQlkZWZhdWx0Vmlld05hbWUgPSBkZWZhdWx0Vmlldy5nZXROYW1lKCk7Ci0JCQljbGVhckRlZmF1bHRWaWV3SW5kaWNhdG9yKCk7Ci0JCX0KLQkJU3RyaW5nIHNlbGVjdGVkVmlldyA9IHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKS5nZXRUZXh0KCk7Ci0JCU1hcCBvcmlnVmlld3MgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IoaW50IGk9MDtpPHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKTtpKyspewotCQkJQ1RhYkl0ZW0gaXRlbSA9IHRhYkZvbGRlci5nZXRJdGVtKGkpOwotCQkJb3JpZ1ZpZXdzLnB1dChpdGVtLmdldFRleHQoKSwgaXRlbS5nZXRDb250cm9sKCkpOwotCQl9Ci0JCUxpc3Qgdmlld3MgPSBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCk7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWludCBzZWxlY3RlZEluZGV4ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdmlld3MuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCkgJiYgaW5kZXg8dGFiRm9sZGVyLmdldEl0ZW1Db3VudCgpOykgewotCQkJU3RyaW5nIHZpZXcgPSAoKENvbnRlbnRDYXRlZ29yeSlpdG9yLm5leHQoKSkuZ2V0TmFtZSgpOwotCQkJQ1RhYkl0ZW0gaXRlbSA9IHRhYkZvbGRlci5nZXRJdGVtKGluZGV4KyspOwotCQkJaXRlbS5zZXRUZXh0KHZpZXcpOwotCQkJaXRlbS5zZXRDb250cm9sKChDb250cm9sKW9yaWdWaWV3cy5nZXQodmlldykpOwotCQkJaWYodmlldy5lcXVhbHMoZGVmYXVsdFZpZXdOYW1lKSkgc2V0RGVmYXVsdFZpZXdJbmRpY2F0b3IoaXRlbSk7Ci0JCQlpZih2aWV3LmVxdWFscyhzZWxlY3RlZFZpZXcpKSBzZWxlY3RlZEluZGV4ID0gaW5kZXgtMTsKLQkJfQotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGVkSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIGFwcGVuZGVkICIoZGVmYXVsdCkiIGZyb20gdGhlIHRhYiBmb3IgdGhlIGRlZmF1bHQKLQkgKiB2aWV3LiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2hhbmdpbmcgdGhlIGRlZmF1bHQgdmlldyEKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJEZWZhdWx0Vmlld0luZGljYXRvcigpIHsKLQkJQ29udGVudENhdGVnb3J5IGRlZmF1bHRWaWV3ID0gY29uZmlnLmdldERlZmF1bHRWaWV3KCk7Ci0JCWlmIChkZWZhdWx0VmlldyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZGVmYXVsdFZpZXdUYWJOYW1lID0gZGVmYXVsdFZpZXcuZ2V0TmFtZSgpCi0JCQkJCSsgIiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdDsgLy8kTk9OLU5MUy0xJAotCQkJQ1RhYkl0ZW1bXSBpdGVtcyA9IHRhYkZvbGRlci5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gaXRlbXNbaV0uZ2V0VGV4dCgpOwotCQkJCWlmIChuYW1lLmVxdWFscyhkZWZhdWx0Vmlld1RhYk5hbWUpKSB7Ci0JCQkJCWl0ZW1zW2ldLnNldFRleHQoZGVmYXVsdFZpZXcuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYXBwZW5kcyAiKGRlZmF1bHQpIiB0byB0aGUgdGFiIG9mIHRoZSBkZWZhdWx0IHZpZXcuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRWaWV3SW5kaWNhdG9yKENUYWJJdGVtIGl0ZW0pIHsKLQkJdGFiRGVmYXVsdHZpZXdJdGVtID0gaXRlbTsKLQkJCi0JCVN0cmluZyBuYW1lID0gaXRlbS5nZXRUZXh0KCkKLQkJCQkrICIgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdDsgLy8kTk9OLU5MUy0xJAotCQlpdGVtLnNldFRleHQobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRUeXBlcygpIHsKLQkJU3RyaW5nW10gQ2F0ZWdvcmllcyA9IG5ldyBTdHJpbmdbXSB7IEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUywKLQkJCQlGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTLCBGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVMsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlMsIEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUywKLQkJCQlGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUywgRmlsdGVyQ29uc3RhbnRzLlRPT0xTIH07Ci0JCXJldHVybiBDYXRlZ29yaWVzOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJcmV0dXJuIGFjdGlvbk1ncjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExMzc3MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGluIHRoZSBDb25maWd1cmF0aW9uIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRGVzY3JpcHRpb24gZXh0ZW5kcyBGb3JtUGFnZSBpbXBsZW1lbnRzIElSZWZyZXNoYWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QUkVGSVggPSBBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uRGVzY3JpcHRpb25Gb3JtUHJlZml4OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQotCXByaXZhdGUgU2Nyb2xsZWRGb3JtIGZvcm0gPSBudWxsOwotCi0JcHJpdmF0ZSBUZXh0IG5hbWVUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGRlc3BUZXh0OwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBtb2RlbE1vZGlmeUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uRGVzY3JpcHRpb24oRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoCi0JCQkJZWRpdG9yLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uLCBBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbik7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzZXRTaXRlKHNpdGUpOwotCQlzZXRJbnB1dChpbnB1dCk7Ci0JCUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCBjb25maWdJbnB1dCA9IChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGlucHV0OwotCQljb25maWcgPSBjb25maWdJbnB1dC5nZXRDb25maWd1cmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlmb3JtID0gbWFuYWdlZEZvcm0uZ2V0Rm9ybSgpOwotCQlmb3JtLnNldFRleHQoRk9STV9QUkVGSVggKyBjb25maWcuZ2V0TmFtZSgpKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQotCQlUYWJsZVdyYXBMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlV3JhcExheW91dCgpOwotCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlTZWN0aW9uIGdlblNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQljcmVhdGVHZW5lcmFsQ29udGVudCh0b29sa2l0LCBnZW5TZWN0aW9uKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZ2VuZXJhbCBjb250ZW50IGZvciB0aGUgZGVzY3JpcHRpb24gcGFnZQotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogQHBhcmFtIHNlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVHZW5lcmFsQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0LCBTZWN0aW9uIHNlY3Rpb24pIHsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCXNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uRGVzY3JpcHRpb25HZW5lcmFsSW5mbyk7IC8vJE5PTi1OTFMtMSQKLQkJc2VjdGlvbgotCQkJCS5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbl90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JCUNvbXBvc2l0ZSBzZWN0aW9uQ2xpZW50ID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCVRhYmxlV3JhcExheW91dCBsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJc2VjdGlvbkNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQl0b29sa2l0Ci0JCQkJLmNyZWF0ZUxhYmVsKAotCQkJCQkJc2VjdGlvbkNsaWVudCwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbk5hbWUsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQluYW1lVGV4dCA9IHRvb2xraXQuY3JlYXRlVGV4dChzZWN0aW9uQ2xpZW50LCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCW5hbWVUZXh0LnNldExheW91dERhdGEodGQpOwotCQluYW1lVGV4dC5zZXRUZXh0KGNvbmZpZy5nZXROYW1lKCkpOwotCi0JCUxhYmVsIGRlc3BMYWJlbCA9IHRvb2xraXQKLQkJCQkuY3JlYXRlTGFiZWwoCi0JCQkJCQlzZWN0aW9uQ2xpZW50LAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25MYWJlbCwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCVRhYmxlV3JhcERhdGEgdHdkMCA9IG5ldyBUYWJsZVdyYXBEYXRhKCk7Ci0JCWRlc3BMYWJlbC5zZXRMYXlvdXREYXRhKHR3ZDApOwotCi0JCWRlc3BUZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KHNlY3Rpb25DbGllbnQsCi0JCQkJIiIsIFNXVC5OT05FIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULldSQVApOyAvLyROT04tTkxTLTEkCi0JCVRhYmxlV3JhcERhdGEgdHdkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQl0d2QuaGVpZ2h0SGludCA9IDUwOwotCQlkZXNwVGV4dC5zZXRMYXlvdXREYXRhKHR3ZCk7Ci0JCWRlc3BUZXh0LnNldFRleHQoY29uZmlnLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0KLQkJc2VjdGlvbi5zZXRDbGllbnQoc2VjdGlvbkNsaWVudCk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHNlY3Rpb25DbGllbnQpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoCi0JCQkJc2VjdGlvbkNsaWVudC5nZXRQYXJlbnQoKSwgQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09ORklHVVJBVElPTl9FRElUT1JfQUxMX0NPTlRFWFQpOyAKLQotCQlEaXNwbGF5IGRpc3BsYXkgPSBmb3JtLmdldEJvZHkoKS5nZXREaXNwbGF5KCk7Ci0JCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCW5hbWVUZXh0LnNldEZvY3VzKCk7Ci0JCQkJCW5hbWVUZXh0LnNldFNlbGVjdGlvbigwLCBuYW1lVGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZmluYWwgQ29uZmlndXJhdGlvbkVkaXRvciBlZGl0b3IgPSAoQ29uZmlndXJhdGlvbkVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCW1vZGVsTW9kaWZ5TGlzdGVuZXIgPSBlZGl0b3IuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoY29uZmlnKTsKLQotCQlhY3Rpb25NZ3IgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0KLQkJbmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCW5hbWVUZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXIjZm9jdXNHYWluZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb25maWcuZ2V0TmFtZSgpOwotCQkJCWZpbmFsIE1ldGhvZENvbmZpZ3VyYXRpb24gaUNvbmZpZyA9IGNvbmZpZzsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChpc1RleHROb25FbXB0eShuYW1lVGV4dCkpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBuYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCQkJCQotCQkJCQkvLyAxNzg0NjIKLQkJCQkJU3RyaW5nIG1zZyA9IG51bGw7Ci0JCQkJCWlmIChuYW1lLmluZGV4T2YoIiYiKSA+IC0xKSB7Ci0JCQkJCQltc2cgPSBOTFMKLQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3I0X21zZywKLQkJCQkJCQkJCQluYW1lKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmNyZWF0ZU5hbWVWYWxpZGF0b3IoY29uZmlnLmVDb250YWluZXIoKSwKLQkJCQkJCQkJCQljb25maWcpOwotCQkJCQkJbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQobmFtZSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQltc2cpOwotCQkJCQkJbmFtZVRleHQuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQluYW1lVGV4dC5zZXRUZXh0KGlDb25maWcuZ2V0TmFtZSgpKTsKLQkJCQkJCQkJbmFtZVRleHQuc2VsZWN0QWxsKCk7Ci0JCQkJCQkJCW5hbWVUZXh0LnNldEZvY3VzKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJbmFtZSA9IG5hbWUudHJpbSgpOwkJCS8vMTY2NzU1Ci0JCQkJCQotCQkJCQlpZiAoIW5hbWUuZXF1YWxzKGNvbmZpZy5nZXROYW1lKCkpKSB7Ci0JCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCWNvbmZpZywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgbmFtZSwgLTEpOwotCQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gY29uZmlnLmVSZXNvdXJjZSgpOwotCQkJCQkJCWlmKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UgIT0gY29uZmlnLmVDb250YWluZXIoKS5lUmVzb3VyY2UoKSkgewotCQkJCQkJCQllZGl0b3IuYWRkUmVzb3VyY2VUb0FkanVzdExvY2F0aW9uKGNvbmZpZy5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWZvcm0uc2V0VGV4dChGT1JNX1BSRUZJWCArIGNvbmZpZy5nZXROYW1lKCkpOwotCQkJCQkJCW5hbWVUZXh0LnNldFRleHQobmFtZSk7Ci0JCQkJCQkJLy8gMTY0NzM5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSAgICAgICAgICAgIAotCQkJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsgICAgICAgICAgICAgCi0JCQkJCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCQkJSVZpZXdQYXJ0IHZpZXcgPSBhY3RpdmVQYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJCQkJCS5maW5kVmlldyhDb25maWd1cmF0aW9uVmlldy5WSUVXX0lEKTsgICAgICAgICAgICAgICAgCi0JCQkJCQkJCWlmICh2aWV3ICE9IG51bGwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCQkJCSgoQ29uZmlndXJhdGlvblZpZXcpIHZpZXcpLnNldERlc2NyaXB0aW9uKCAgICAgICAgICAgICAgIAotCQkJCQkJCQkJCQljb25maWcsIG5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnLCBTdHJVdGlsLnRvTG93ZXIoTGlicmFyeVVJVGV4dC5URVhUX01FVEhPRF9DT05GSUdVUkFUT04pKSk7IC8vJE5PTi1OTFMtMSQJCi0JCQkJCW5hbWVUZXh0LnNldFRleHQoY29uZmlnLmdldE5hbWUoKSk7Ci0JCQkJCW5hbWVUZXh0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCW5hbWVUZXh0LnNldEZvY3VzKCk7Ci0JCQkJCQkJbmFtZVRleHQuc2V0U2VsZWN0aW9uKDAsIG5hbWVUZXh0LmdldFRleHQoKQotCQkJCQkJCQkJLmxlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCi0JCWRlc3BUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQlkZXNwVGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29uZmlnLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBkZXNjMSA9IGRlc3BUZXh0LmdldFRleHQoKTsKLQkJCQlpZiAoIWRlc2MxLmVxdWFscyhjb25maWcuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjb25maWcsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJCQkJCQlkZXNjMSwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gVGV4dCBjb250cm9sIGNvbnRhaW4gY2hhcmFjdGVycwotCSAqIG90aGVyIHRoYW4gc3BhY2VzLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgVGV4dCBjb250cm9sLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIFRleHQgY29udHJvbCBjb250YWluIGNoYXJhY3RlcnMKLQkgKiAgICAgICAgIG90aGVyIHRoYW4gc3BhY2VzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUZXh0Tm9uRW1wdHkoVGV4dCB0KSB7Ci0JCVN0cmluZyBzID0gdC5nZXRUZXh0KCk7Ci0JCWlmICgocyAhPSBudWxsKSAmJiAocy50cmltKCkubGVuZ3RoKCkgPiAwKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5JUmVmcmVzaGFibGUjcmVmcmVzaE5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoTmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAobmV3TmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoKG5hbWVUZXh0ICE9IG51bGwpICYmICEobmFtZVRleHQuaXNEaXNwb3NlZCgpKSkgewotCQkJCW5hbWVUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCW5hbWVUZXh0LnNldFRleHQobmV3TmFtZSk7Ci0JCQkJbmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJZm9ybS5zZXRUZXh0KEZPUk1fUFJFRklYICsgY29uZmlnLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlndXJhdGlvblBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWd1cmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZGVlMzFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWd1cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5NZXNzYWdlVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnREZXBlbmRlbmN5RXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FcnJvckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQ29udGVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5NZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5QbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5FbGVtZW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZVZpZXdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlRXhwYW5zaW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLS8qKgotICogVGhlIENvbmZpZ3VyYXRpb24gcGFnZSBpbiB0aGUgTWV0aG9kIENvbmZpZ3VyYXRpb24gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblBhZ2UgZXh0ZW5kcyBGb3JtUGFnZSBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlciB7Ci0JTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCi0JQ29uZmlndXJhdGlvbkNsb3N1cmUgY2xvc3VyZSA9IG51bGw7Ci0KLQlDb25maWd1cmF0aW9uVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGNvbnRQcm92aWRlcjsKLQotCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbnVsbDsKLQotCVNjcm9sbGVkRm9ybSBmb3JtID0gbnVsbDsKLQotCWJvb2xlYW4gaXNEaXJ0eSA9IGZhbHNlOwotCQotCXByaXZhdGUgYm9vbGVhbiBuZWVkVXBkYXRlID0gZmFsc2U7Ci0KLQlwcml2YXRlIFN0cmluZyBmb3JtUHJlZml4ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfRm9ybVByZWZpeDsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcHJpdmF0ZSBFT2JqZWN0IGN1cnJlbnRSb290Tm9kZTsKLQlwcml2YXRlIEFycmF5TGlzdCBleHBhbmRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcHJpdmF0ZSBUZXh0IGN0cmxfbmFtZTsKLQotCS8vIHByaXZhdGUgVGV4dCBjdHJsX2JyaWVmX2Rlc2M7Ci0KLQlwcml2YXRlIExpc3QgbW9kaWZpZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgQnV0dG9uIGNsb3N1cmVCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBmaXhXYXJuaW5nQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gZXJyb3JCdXR0b247Ci0KLQkvLyBwcml2YXRlIEJ1dHRvbiBkZXBlbmRlbnRCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBoaWRlQnV0dG9uOwotCi0JLy8gcHJpdmF0ZSBUZXh0IGRlc3BUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGVsZW1EZXNwQ29udGVudFRleHQ7Ci0KLQkvLyBwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHBhcmVudFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCXByaXZhdGUgTWVzc2FnZVZpZXcgbXNnVmlldzsKLQotCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbXNnVmlld0xpc3RlbmVyID0gbnVsbDsKLQotCXByaXZhdGUgQ29uZmlnVHJlZUZpbHRlciBjb25maWdGaWx0ZXI7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXByaXZhdGUgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJMaXN0ZW5lciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciBjb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKAotCQkJCWVkaXRvciwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjEsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMik7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzZXRTaXRlKHNpdGUpOwotCQlzZXRJbnB1dChpbnB1dCk7Ci0KLQkJQ29uZmlndXJhdGlvbkVkaXRvcklucHV0IGNvbmZpZ0lucHV0ID0gKENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCWNvbmZpZyA9IGNvbmZpZ0lucHV0LmdldENvbmZpZ3VyYXRpb24oKTsKLQotCQkKLQkJY29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoCi0JCQkJCW9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBjYXRjaGVkIG1vZGlmeSBjb25maWcgbm90aWZpY2F0aW9uID0KLQkJCQkvLyAiICsgbXNnKTsKLQkJCQlpbnQgdHlwZSA9IG1zZy5nZXRFdmVudFR5cGUoKTsKLQkJCQlpZiAoCXR5cGUgPT0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLkFERAotCQkJCQkJfHwgdHlwZSA9PSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24uQUREX01BTlkKLQkJCQkJCXx8IHR5cGUgPT0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLlJFTU9WRQotCQkJCQkJfHwgICB0eXBlID09IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSkgewkJCQkJCi0JCQkJCW5lZWRVcGRhdGUgPSB0cnVlOwotCQkJCQkKLS8vCQkJCQlUaGlzIHdhcyBkb25lIHRvIHJlZnJlc2ggY29uZmlndXJhdGlvbiBwbHVnaW4tcGFja2FnZSBzZWN0aW9uIHBhZ2UuIEJ1dCBpdHMgbm90IHBlcmZlY3QKLS8vCQkJCQlzb2x1dGlvbi4gRG9lc250IGNvdmVyIGFsbCB0aGUgc2NlbmFyaW9zLiBTbyBjb21tZW50aW5nIGl0IG91dC4KLS8vCQkJCQlXaWxsIGhhdmUgdG8gdGhpbmsgb2YgYWx0ZXJuYXRlIHdheSB0byByZWZyZXNoIHBsdWdpbi9wYWNrYWdlIGNvbmZpZ3VyYXRpb24gcGFnZS4KLS8vCQkJCQlMb3cgUHJpb3JpdHkKLS8vCQkJCQkJfHwgdHlwZSA9PSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24uUkVNT1ZFCi0vLwkJCQkJCXx8IHR5cGUgPT0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZICkgewotLy8JCQkJCQotCQkJCQkKLS8vCQkJCQlpZiAodHJlZVZpZXdlciAhPSBudWxsKQl7Ci0vLwkJCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotLy8JCQkJCQl1cGRhdGVDaGVja1N0YXRlcygpOwotLy8JCQkJCQlzaG93RXJyb3JzKCk7Ci0vLwkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY29uZmlnLmVBZGFwdGVycygpLmFkZChjb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCByZUluaXRpYWxpemVDb25maWdGYWN0b3J5KCkgewotCQkvLyB0aGUgZm9sbG93aW5nIG1heSBub3QgYmUgdGhlIG1vc3QgZWZmaWNpZW50IHdheQotCQkvLyBuZWVkIGEgZmFzdCB3YXkgdG8gdXBkYXRlIHRoZSBjbG9zdXJlCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgcmVJbml0IGNsb3N1cmUgZm9yIGNvbmZpZyBhZGQgbm90aWZpY2F0aW9uISIpOwotCi0JCWNyZWF0ZUNvbmZpZ3VyYXRpb25DbG9zdXJlKCk7Ci0KLQkJY29uZmlnRmlsdGVyID0gbmV3IENvbmZpZ1RyZWVGaWx0ZXIoY2xvc3VyZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGlucHV0IGZvciBjb25uZmlndXJhdGlvbiB2aWV3ZXIKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJdHJlZVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0KLQkJLy8gaW5pdGlhbGx5IGV4cGFuZCB0aGUgd2hvbGUgdHJlZSBiZWZvcmUgdXBkYXRpbmcgdGhlIHRyZWUKLQkJLy8gdGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHRoZSBjb250ZW50IHByb3ZpZGVyIHRvIGJ1aWxkIHRoZSBjaGlsZCAtCi0JCS8vIHBhcmVudCBsb29rdXAgbWFwCi0JCXRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0KLQkJLy8gdXBkYXRlIHRoZSB0cmVlIHdpdGggdGhlIGRlZmF1bHQgY2xvc3VyZSBzZWxlY3Rpb24KLQkJdXBkYXRlQ2hlY2tTdGF0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNjcmVhdGVGb3JtQ29udGVudChvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCS8vIGNyZWF0ZSBmb3JtIHRvb2xraXQKLQkJZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJZm9ybS5zZXRUZXh0KGZvcm1QcmVmaXggKyBjb25maWcuZ2V0TmFtZSgpKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQotCQlUYWJsZVdyYXBMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlV3JhcExheW91dCgpOwotCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlTZWN0aW9uIHRyZWVTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJY3JlYXRlVHJlZUNvbnRlbnQodG9vbGtpdCwgdHJlZVNlY3Rpb24pOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIGZpbmFsbHkgc2V0IHRoZSBpbnB1dC4KLQkJLy8gUm9vdENvbnRlbnQgaW5wdXROb2RlID0gbmV3IFJvb3RDb250ZW50KGNsb3N1cmUKLQkJLy8gLmdldENvbmZpZ3VyYXRpb25GYWN0b3J5KCkuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJc2V0SW5wdXQoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdHJlZSBjb250ZW50Ci0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcGFyYW0gc2VjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVRyZWVDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQsIFNlY3Rpb24gc2VjdGlvbikgewotCQlzZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudCk7IC8vJE5PTi1OTFMtMSQKLQkJc2VjdGlvbgotCQkJCS5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCi0JCUNvbXBvc2l0ZSBzZWN0aW9uQ2xpZW50ID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KHNlY3Rpb25DbGllbnQpOwotCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJc2VjdGlvbkNsaWVudC5zZXRMYXlvdXQoZ2wpOwotCQlnbC5udW1Db2x1bW5zID0gNjsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKAotCQkJCXNlY3Rpb25DbGllbnQuZ2V0UGFyZW50KCksCi0JCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09ORklHVVJBVElPTl9FRElUT1JfQUxMX0NPTlRFWFQpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uQ2xpZW50KTsKLQkJewotCQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDY7Ci0JCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gNjsKLQkJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSAzOwotCQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCX0KLQotCQloaWRlQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCAiIiwgU1dULlBVU0ggLy8kTk9OLU5MUy0xJAotCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQloaWRlQnV0dG9uLnNldEltYWdlKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiaGlkZVVuY2hlY2tlZEVsZW0uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWhpZGVCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfaGlkZVRvb2xUaXApOyAvLyROT04tTkxTLTEkCi0JCWhpZGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5EKSk7Ci0KLQkJZml4V2FybmluZ0J1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgIiIsIFNXVC5QVVNIKTsgLy8kTk9OLU5MUy0xJAotCQlmaXhXYXJuaW5nQnV0dG9uLnNldEltYWdlKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRTaGFyZWRJbWFnZSgiYWRkcmVmX2NvLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlmaXhXYXJuaW5nQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX0FkZE1pc3NpbmdUb29sVGlwKTsgLy8kTk9OLU5MUy0xJAotCQlmaXhXYXJuaW5nQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCkpOwotCi0JCS8vIEFkZCB0aGUgY2xvc3VyZSBidXR0b24uCi0JCWNsb3N1cmVCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsICIiLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLQkJY2xvc3VyZUJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImNsb3N1cmVfY28uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWNsb3N1cmVCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfTWFrZUNsb3N1cmVUb29sVGlwKTsgLy8kTk9OLU5MUy0xJAotCQljbG9zdXJlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCkpOwotCQkvLyBjbG9zdXJlQnV0dG9uLnNldFRleHQoIiIpOwotCi0JCWVycm9yQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCAiIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0JCWVycm9yQnV0dG9uLnNldEltYWdlKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkic2hvd0NvbmZpZ0Vycm9yLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQllcnJvckJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9TaG93RXJyb3JUb29sVGlwKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQKLQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gMzsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWVycm9yQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQl9Ci0KLQkJTGFiZWwgdHJlZVRpdGxlTGFiZWwgPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUxhYmVsKAotCQkJCQkJc2VjdGlvbkNsaWVudCwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX1RyZWVUaXRsZUxhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9FTkQpOwotCQkJdHJlZVRpdGxlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDY7Ci0JCX0KLQotCQkvLyBDcmVhdGUgVmlld2VyIGFuZCBIYW5kbGUgTGlzdGVuZXIgZm9yIHRoZSB2aWV3ZXIuCi0JCWNyZWF0ZVZpZXdlcihzZWN0aW9uQ2xpZW50KTsKLQotCQlMYWJlbCBlbGVtRGVzcExhYmVsID0gdG9vbGtpdAotCQkJCS5jcmVhdGVMYWJlbChzZWN0aW9uQ2xpZW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgZ2QxID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkMS5ob3Jpem9udGFsU3BhbiA9IDY7Ci0JCWVsZW1EZXNwTGFiZWwuc2V0TGF5b3V0RGF0YShnZDEpOwotCi0JCWVsZW1EZXNwQ29udGVudFRleHQgPSB0b29sa2l0LmNyZWF0ZVRleHQoc2VjdGlvbkNsaWVudCwgIiIsIFNXVC5OT05FIC8vJE5PTi1OTFMtMSQKLQkJCQl8IFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkgfCBTV1QuV1JBUCk7Ci0JCUdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZDIuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdkMi5ob3Jpem9udGFsU3BhbiA9IDY7Ci0JCWdkMi5oZWlnaHRIaW50ID0gNTA7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3Ioc2VjdGlvbkNsaWVudCk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGJ1dHRvbkNvbXBvc2l0ZSk7Ci0JCWVsZW1EZXNwQ29udGVudFRleHQuc2V0TGF5b3V0RGF0YShnZDIpOwotCi0JCWhpZGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJaGlkZUJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQllcnJvckJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQllcnJvckJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQlmaXhXYXJuaW5nQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWZpeFdhcm5pbmdCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJY2xvc3VyZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQljbG9zdXJlQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb25maWd1cmF0aW9uQ2xvc3VyZSgpIHsKLQkJLy8gcmVmcmVzaCBjb25maWd1cmF0aW9uIGZyb20gZWRpdG9yCi0JCS8vCi0JCUZvcm1FZGl0b3IgZWRpdG9yID0gZ2V0RWRpdG9yKCk7Ci0JCWlmKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmKGlucHV0IGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSB7Ci0JCQkJY29uZmlnID0gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpaW5wdXQpLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCX0KLQkJfQotCQkKLQkJY2xvc3VyZSA9IG5ldyBDb25maWd1cmF0aW9uQ2xvc3VyZShjb25maWcpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgY29uZmlndXJhdGlvbiBmYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUNvbmZpZ0ZhY3RvcnkoKSB7Ci0JCS8vIGxvYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gY2xvc3VyZSBtaWdodCBiZSBzbG93LAotCQkvLyBkaXNwbGF5IGEgcHJvZ3Jlc3MgYmFyCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWNyZWF0ZUNvbmZpZ3VyYXRpb25DbG9zdXJlKCk7Ci0JCQl9Ci0KLQkJfTsKLQotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9Mb2FkaW5nTWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkvLyBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGNvbmZpZ0ZhY3RvcnkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJY29udFByb3ZpZGVyID0gbmV3IENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIoLy9jb25maWdGYWN0b3J5LAotCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlcgotCQkJCS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb25maWdQYWNrYWdlTGFiZWxQcm92aWRlcihjb250UHJvdmlkZXIpKTsKLQotCQljb25maWdGaWx0ZXIgPSBuZXcgQ29uZmlnVHJlZUZpbHRlcihjbG9zdXJlKTsKLQkJdHJlZVZpZXdlci5hZGRGaWx0ZXIoY29uZmlnRmlsdGVyKTsKLQotCQkvLyBzaG93IHRoZSBtZXNzYWdlIHZpZXcgaWYgdGhlcmUgaXMgZXJyb3IKLQkJdXBkYXRlTWVzc2FnZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHNlY3Rpb25DbGllbnQpIHsKLQotCQlzZWN0aW9uQ2xpZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXNlY3Rpb25DbGllbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCS8vIGNyZWF0ZSB0aGUgbGlicmFyeSB0cmVlIHZpZXdlcgotCQl0cmVlVmlld2VyID0gbmV3IENvbmZpZ3VyYXRpb25WaWV3ZXIoc2VjdGlvbkNsaWVudCk7Ci0JCS8vIHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDIwMDsKLQkJCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJaW5pdGlhbGl6ZUNvbmZpZ0ZhY3RvcnkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlhZGRFZGl0b3JTZXRGb2N1c0xpc2VuZXJzKCk7CQkKLQkJCi0JCWFjdGlvbk1nciA9ICgoQ29uZmlndXJhdGlvbkVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJLy8gbmFtZVRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkvLyBwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCS8vIGlmIChpc1RleHROb25FbXB0eShuYW1lVGV4dCkpIHsKLQkJLy8gU3RyaW5nIG5hbWUgPSBTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKG5hbWVUZXh0LmdldFRleHQoKSk7Ci0JCS8vIGlmICghbmFtZS5lcXVhbHMoY29uZmlnLmdldE5hbWUoKSkpIHsKLQkJLy8gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgY29uZmlnLAotCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkvLyBuYW1lLCAtMSk7Ci0JCS8vIGZvcm0uc2V0VGV4dChmb3JtUHJlZml4ICsgY29uZmlnLmdldE5hbWUoKSk7Ci0JCS8vIG5hbWVUZXh0LnNldFRleHQobmFtZSk7Ci0JCS8vIH0KLQkJLy8gfSBlbHNlIHsKLQkJLy8gLy8gRGlzcGxheSBhIHdhcm5pbmcgZGlhbG9nIGZvciBlbXB0eSBOYW1lLgotCQkvLyBuYW1lVGV4dC5zZXRUZXh0KGNvbmZpZy5nZXROYW1lKCkpOwotCQkvLyBNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJLy8gLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCS8vICJFbnRlciBDb25maWd1cmF0aW9uIE5hbWUiLAotCQkvLyAiTmFtZSBmaWVsZCBjYW5ub3QgYmUgZW1wdHkhIik7Ci0JCS8vIH0KLQkJLy8gLy8gY29uZmlnLnNldE5hbWUoU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShuYW1lVGV4dC5nZXRUZXh0KCkpKTsKLQkJLy8gLy8gZm9ybS5zZXRUZXh0KGZvcm1QcmVmaXggKyBjb25maWcuZ2V0TmFtZSgpKTsKLQkJLy8gfQotCQkvLyB9KTsKLQkJLy8gZGVzcFRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkvLyBwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCS8vIC8vIGNvbmZpZy5zZXRCcmllZkRlc2NyaXB0aW9uKFN0clV0aWwuZ2V0UGxhaW5UZXh0KGRlc3BUZXh0Ci0JCS8vIC8vIC5nZXRUZXh0KCkpKTsKLQkJLy8gU3RyaW5nIGRlc2MxID0gZGVzcFRleHQuZ2V0VGV4dCgpOwotCQkvLyBpZiAoIWRlc2MxLmVxdWFscyhjb25maWcuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKSkgewotCQkvLyBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjb25maWcsCi0JCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCS8vIC5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJLy8gZGVzYzEsIC0xKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0pOwotCQljbG9zdXJlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltYWtlQ2xvc3VyZSgpOwotCQkJfTsKLQkJfSk7Ci0JCWZpeFdhcm5pbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWZpeFdhcm5pbmcoKTsKLQkJCX07Ci0JCX0pOwotCQllcnJvckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2hvd0Vycm9ycygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQkJaGlkZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2hvd0hpZGVFbGVtZW50cygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQkJdHJlZVZpZXdlci5hZGRUcmVlTGlzdGVuZXIobmV3IElUcmVlVmlld2VyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ29sbGFwc2VkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotCQkJCU9iamVjdCBlbGVtZW50ID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCQkJCWV4cGFuZGVkRWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB0cmVlRXhwYW5kZWQoVHJlZUV4cGFuc2lvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBldmVudC5nZXRFbGVtZW50KCk7Ci0JCQkJZXhwYW5kZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0KLQkJCQkvLyAvLyB0aGlzIGlzIGEgcXVpY2sgZGlydHkgZml4IGZvciBjaGVjayBzdGF0ZSBpbml0aWFsaXplIGlzc3VlCi0JCQkJLy8gLy8gYmV0dGVyIHNvbHV0aW9uIGxhdGVyLiBqeGkgMDcvMDEvMDUKLQkJCQkvLyB1cGRhdGVUcmVlKCk7Ci0JCQkJLy8JCQkJCi0JCQkJLy8gLy8gcmVzdG9yZSB0aGUgY2hlY2sgc3RhdGUgb2YgdGhlIFVJIGVsZW1lbnRzCi0JCQkJLy8gT2JqZWN0IG9iaiA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQkJCQkvLyBib29sZWFuIHBhcmVudFN0YXRlID0gdHJlZVZpZXdlci5nZXRDaGVja2VkKG9iaik7Ci0JCQkJLy8JCQkJCi0JCQkJLy8gQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlciBjcCA9Ci0JCQkJLy8gKENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIpdHJlZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCQkvLyBPYmplY3RbXSBjaGlsZHJlbiA9IGNwLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJLy8gaWYgKCBjaGlsZHJlbiAhPSBudWxsICkKLQkJCQkvLyB7Ci0JCQkJLy8gZm9yICggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCQkJLy8gewotCQkJCS8vIGJvb2xlYW4gY2hlY2sgPSBmYWxzZTsKLQkJCQkvLyAvLyBpZiB0aGUgZm9sZGVyIGlzIGEgVUkgZm9sZGVyLCBrZWVwIHRoZSBjaGVjayBzdGF0ZQotCQkJCS8vIGlmICggY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gKQotCQkJCS8vIHsKLQkJCQkvLyBjaGVjayA9Ci0JCQkJLy8gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmNvbnRhaW5zKGNoaWxkcmVuW2ldKTsKLQkJCQkvLyB9Ci0JCQkJLy8gZWxzZSBpZiAoIGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSApCi0JCQkJLy8gewotCQkJCS8vIGNoZWNrID0KLQkJCQkvLyBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKGNoaWxkcmVuW2ldKTsKLQkJCQkvLyB9Ci0JCQkJLy8gZWxzZQotCQkJCS8vIHsKLQkJCQkvLyBjaGVjayA9IHBhcmVudFN0YXRlOwotCQkJCS8vIH0KLQkJCQkvLwkJCQkJCQotCQkJCS8vIGJvb2xlYW4gcmV0ID0gdHJlZVZpZXdlci5zZXRDaGVja2VkKGNoaWxkcmVuW2ldLCBjaGVjayk7Ci0JCQkJLy8gaWYgKCByZXQgPT0gZmFsc2UpCi0JCQkJLy8gewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FuJ3Qgc2V0IHN0YXRlIik7Ci0JCQkJLy8gfQotCQkJCS8vCi0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gbGlzdGVuIHRvIHRoZSBzZWxlY3Rpb24gY2hhbmdlIG9mIHRoZSBjdXJyZW50IHRyZWUgdmlld2VyCi0JCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJLy8gQ3JlYXRlIHRoZSBsaXN0ZW5lcgotCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJLy8gVGhpcyBqdXN0IG5vdGlmaWVzIHRob3NlIHRoaW5ncyB0aGF0IGFyZSBhZmZlY3RlZCBieSB0aGUKLQkJCQkvLyBzZWN0aW9uLgotCQkJCS8vCi0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLS8vCQkJCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJCQkucHJpbnRsbihBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9TZWxlY3RlZCArIGV2ZW50LmdldFNlbGVjdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX07Ci0KLQkJCXRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBhZGQgYSBjaGVjayBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIKLQkJdHJlZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJbW9kaWZpZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlib29sZWFuIGNoZWNrZWQgPSBldmVudC5nZXRDaGVja2VkKCk7Ci0JCQkJdXBkYXRlQ2hlY2tTdGF0ZXMoZXZlbnQuZ2V0RWxlbWVudCgpLCBjaGVja2VkKTsKLQotCQkJCS8qCi0JCQkJICogLy8gc2F2ZSB0aGUgcHJldmlvdXMgaW52YWxpZCBlbGVtZW50cyBMaXN0IGludmFsaWQgPQotCQkJCSAqIGNsb3N1cmUuZ2V0SW52YWxpZEVsZW1lbnRzKCk7Ci0JCQkJICogCi0JCQkJICogY2xvc3VyZS5zZXRTZWxlY3Rpb25zKHRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCQkJCSAqIAotCQkJCSAqIGlmICggY29uZmlnRmlsdGVyLmlzSGlkaW5nKCkgKSB7IHRyZWVWaWV3ZXIucmVmcmVzaCgpOyB9IGVsc2UgeyAvLwotCQkJCSAqIGdldCB0aGUgbmV3IGVycm9yIGVsZW1lbnRzLCBhZGQgdG8gdGhlIHByZXZpb3VzIGVycm9yCi0JCQkJICogZWxlbWVudHMsIC8vIGFuZCB1cGRhdGUgdGhlbSB0byB1cGRhdGUgdGhlIGVycm9yL3dhcm5pbmcKLQkJCQkgKiBpbWFnZXMgaW52YWxpZC5hZGRBbGwoY2xvc3VyZS5nZXRJbnZhbGlkRWxlbWVudHMoKSk7IC8vIGFsc28KLQkJCQkgKiBhZGQgdGhlIFVJIGZvbGRlcnMgQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlciBjcCA9Ci0JCQkJICogKENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIpdHJlZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCQkgKiBpbnZhbGlkLmFkZEFsbChjcC5nZXRVSUVsZW1lbnRzKCkpOwotCQkJCSAqIAotCQkJCSAqIHRyZWVWaWV3ZXIudXBkYXRlKGludmFsaWQudG9BcnJheSgpLCBudWxsKTsgfQotCQkJCSAqLwotCi0JCQkJc2hvd0Vycm9ycygpOwotCQkJCWlmICghc2F2ZUNvbmZpZ3VyYXRpb24oKSkgewotCQkJCQl1cGRhdGVDaGVja1N0YXRlcyhldmVudC5nZXRFbGVtZW50KCksIGZhbHNlKTsKLQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZGlmaWVkRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChtb2RpZmllZEVsZW1lbnRzLmdldChpKSwgZmFsc2UpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIHRyZWVWaWV3ZXIuYWRkVHJlZUxpc3RlbmVyKG5ldyBJVHJlZVZpZXdlckxpc3RlbmVyKCl7Ci0JCS8vCi0JCS8vIHB1YmxpYyB2b2lkIHRyZWVDb2xsYXBzZWQoVHJlZUV4cGFuc2lvbkV2ZW50IGV2ZW50KSB7Ci0JCS8vCQkJCQotCQkvLyB9Ci0JCS8vCi0JCS8vIHB1YmxpYyB2b2lkIHRyZWVFeHBhbmRlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLQkJLy8gLy91cGRhdGVDb25maWdTZWxlY3Rpb24oKTsKLQkJLy8KLQkJLy8gLy8gcmVzdG9yZSB0aGUgY2hlY2sgc3RhdGUgb2YgdGhlIFVJIGVsZW1lbnRzCi0JCS8vIE9iamVjdCBvYmogPSBldmVudC5nZXRFbGVtZW50KCk7Ci0JCS8vIGJvb2xlYW4gcGFyZW50U3RhdGUgPSB0cmVlVmlld2VyLmdldENoZWNrZWQob2JqKTsKLQkJLy8JCQkJCi0JCS8vIENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgY3AgPQotCQkvLyAoQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlcil0cmVlVmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkvLyBPYmplY3RbXSBjaGlsZHJlbiA9IGNwLmdldENoaWxkcmVuKG9iaik7Ci0JCS8vIGlmICggY2hpbGRyZW4gIT0gbnVsbCApCi0JCS8vIHsKLQkJLy8gZm9yICggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCS8vIHsKLQkJLy8gYm9vbGVhbiBjaGVjayA9IGZhbHNlOwotCQkvLyAvLyBpZiB0aGUgZm9sZGVyIGlzIGEgVUkgZm9sZGVyLCBrZWVwIHRoZSBjaGVjayBzdGF0ZQotCQkvLyBpZiAoIGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luICkKLQkJLy8gewotCQkvLyBjaGVjayA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jb250YWlucyhjaGlsZHJlbltpXSk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZiAoIGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSApCi0JCS8vIHsKLQkJLy8gY2hlY2sgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKGNoaWxkcmVuW2ldKTsKLQkJLy8gfQotCQkvLyBlbHNlCi0JCS8vIHsKLQkJLy8gY2hlY2sgPSBwYXJlbnRTdGF0ZTsKLQkJLy8gfQotCQkvLwkJCQkJCQotCQkvLyBib29sZWFuIHJldCA9IHRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChjaGlsZHJlbltpXSwgY2hlY2spOwotCQkvLyBpZiAoIHJldCA9PSBmYWxzZSkKLQkJLy8gewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbid0IHNldCBzdGF0ZSIpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIH0KLQkJLy8gfQotCQkvLwkJCQkKLQkJLy8gfX0pOwotCi0JCS8vIGxpc3RlbiB0byB0aGUgbGlicmFyeSBjaGFuZ2VzIGFuZCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSB0aGUKLQkJLy8gY29uZmlndXJhdGlvbiB2aWV3Ci0JCWxpYkxpc3RlbmVyID0gbmV3IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNoYW5nZWRJdGVtcykgewotCQkJCS8vIGZvciBwZXJmb3JtYW5jZSByZWFzb24sIHdlIHNob3VsZCBub3QgcmVzcG9uc2UgdG8gZXZlcnkKLQkJCQkvLyBsaWJyYXJ5IGNoYW5nZQotCQkJCS8vIG9ubHkgY292ZXIgcGFja2FnZSBhbmQgcGx1Z2luIGNoYW5nZXMKLQkJCQlpZiAob3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQKLQkJCQkJCXx8IG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRAotCQkJCQkJfHwgb3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxEKSB7Ci0JCQkJCWlmIChjaGFuZ2VkSXRlbXMgIT0gbnVsbCAmJiBjaGFuZ2VkSXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCQkJT2JqZWN0IG8gPSBjaGFuZ2VkSXRlbXMudG9BcnJheSgpWzBdOwotCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4KLQkJCQkJCQkJfHwgbyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJCQkJfHwgbyBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJCQlpZiAobyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQkJcmVJbml0aWFsaXplQ29uZmlnRmFjdG9yeSgpOwotCQkJCQkJCX0KLQkJCQkJCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQl1cGRhdGVDaGVja1N0YXRlcygpOwotCQkJCQkJCXNob3dFcnJvcnMoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuYWRkTGlzdGVuZXIobGliTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0hpZGVFbGVtZW50cygpIHsKLQkJY29uZmlnRmlsdGVyLnNldEhpZGUoKTsKLQkJdXBkYXRlQ2hlY2tTdGF0ZXMoKTsgLy8gbmVkZWQgdG8gaGF2ZSB0aGlzIHRvIHVwZGF0ZSB0aGUgY2hlY2sgc3RhdHVzCi0JfQotCi0JLyoqCi0JICogdGhlIFVJIHNlbGVjdGlvbnMgY29udGFpbnMgVUkgZm9sZGVycywgbmVlZCB0byBjb252ZXJ0IHRvIHRoZQotCSAqIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9ucwotCSAqIAotCSAqIEByZXR1cm4gT2JqZWN0W10gdGhlIGNvbnZlcnRlZCBzZWxlY3Rpb25zCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldENvbnZlcnRlZFNlbGVjdGlvbnMoKSB7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdFtdIHNlbHMgPSB0cmVlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCi0JCUNvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgY3AgPSAoQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcgotCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3Qgc2VsID0gY3AuZ2V0VUlUYXJnZXRFbGVtZW50KHNlbHNbaV0pOwotCQkJaWYgKHNlbCAhPSBudWxsICYmICFpdGVtcy5jb250YWlucyhzZWwpKSB7Ci0JCQkJaXRlbXMuYWRkKHNlbCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXRlbXMudG9BcnJheSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNob3dFcnJvcnMoKSB7Ci0JCS8vIENvbmZpZ3VyYXRpb25DbG9zdXJlIGMgPSBjbG9zdXJlOwotCQkvLyBjLnNldFNlbGVjdGlvbnModHJlZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSk7Ci0KLQkJLy8gc2F2ZSB0aGUgcHJldmlvdXMgaW52YWxpZCBlbGVtZW50cwotCQlMaXN0IGludmFsaWQgPSBjbG9zdXJlLmdldEludmFsaWRFbGVtZW50cygpOwotCi0JCS8vIGNvbnZlcnQgc2VsZWN0aW9ucyB0byBtZXRob2QgcGx1Z2lucyBhbmQgbWV0aG9kIHBhY2thZ2VzCi0JCWNsb3N1cmUuc2V0U2VsZWN0aW9ucyhnZXRDb252ZXJ0ZWRTZWxlY3Rpb25zKCkpOwotCi0JCWlmIChjb25maWdGaWx0ZXIuaXNIaWRpbmcoKSkgewotCQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBnZXQgdGhlIG5ldyBlcnJvciBlbGVtZW50cywgYWRkIHRvIHRoZSBwcmV2aW91cyBlcnJvciBlbGVtZW50cywKLQkJCS8vIGFuZCB1cGRhdGUgdGhlbSB0byB1cGRhdGUgdGhlIGVycm9yL3dhcm5pbmcgaW1hZ2VzCi0JCQlpbnZhbGlkLmFkZEFsbChjbG9zdXJlLmdldEludmFsaWRFbGVtZW50cygpKTsKLQotCQkJLy8gYWxzbyBhZGQgdGhlIFVJIGZvbGRlcnMKLQkJCUNvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgY3AgPSAoQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcgotCQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQlpbnZhbGlkLmFkZEFsbChjcC5nZXRVSUVsZW1lbnRzKCkpOwotCi0JCQl0cmVlVmlld2VyLnVwZGF0ZShpbnZhbGlkLnRvQXJyYXkoKSwgbnVsbCk7Ci0JCX0KLQotCQl1cGRhdGVNZXNzYWdlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2FkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2dldFNlbGVjdGlvbigpCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudFNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWN1cnJlbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0KLQkJZm9yIChJdGVyYXRvciBsaXN0ZW5lcnMgPSBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGxpc3RlbmVycwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVycwotCQkJCQkubmV4dCgpOwotCQkJbGlzdGVuZXIKLQkJCQkJLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsKLQkJfQotCi0JCS8vIG5vdGlmeSB0aGUgbWVzc2FnZSB2aWV3Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQlPYmplY3RbXSBzZWxPYmpzID0gc2VsLnRvQXJyYXkoKTsKLQkJaWYgKChzZWxPYmpzICE9IG51bGwpICYmIChzZWxPYmpzLmxlbmd0aCA+IDApKSB7Ci0JCQlPYmplY3Qgbm9kZSA9IHNlbE9ianNbMF07Ci0JCQlpZiAoY2xvc3VyZS5nZXRFcnJvcihub2RlKSAhPSBudWxsKSB7Ci0JCQkJZ2V0TWVzc2FnZVZpZXcoKS5zaG93RXJyb3Iobm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyB1cGRhdGUgdGhlIGRlc2NyaXB0aW9uIGZpZWxkCi0JCU9iamVjdCBvID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCVN0cmluZyBicmllZkRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIG8pLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCWVsZW1EZXNwQ29udGVudFRleHQuc2V0VGV4dChicmllZkRlc2MgIT0gbnVsbCA/IGJyaWVmRGVzYyA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBNYWtlIGNvbmZpZ3VyYXRpb24gY2xvc3VyZQotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbWFrZUNsb3N1cmUoKSB7Ci0JCS8vIHNldCB0aGUgc2VsZWN0aW9ucyB0byB0aGUgY2xvc3VyZQotCQlDb25maWd1cmF0aW9uQ2xvc3VyZSBjID0gY2xvc3VyZTsKLQkJLy8gYy5zZXRTZWxlY3Rpb25zKHRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCQljLm1ha2VDbG9zdXJlKCk7Ci0KLQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJdXBkYXRlQ2hlY2tTdGF0ZXMoKTsKLQotCQlzYXZlQ29uZmlndXJhdGlvbigpOwotCi0JCXVwZGF0ZU1lc3NhZ2UoKTsKLQotCX0KLQotCS8qKgotCSAqIEZpeCBhbGwgd2FybmluZ3MgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZml4V2FybmluZygpIHsKLQkJQ29uZmlndXJhdGlvbkNsb3N1cmUgYyA9IGNsb3N1cmU7Ci0JCS8vIGMuc2V0U2VsZWN0aW9ucyh0cmVlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpKTsKLQotCQljLmZpeFByb2JsZW1zKCk7Ci0KLQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCXVwZGF0ZUNoZWNrU3RhdGVzKCk7Ci0KLQkJc2F2ZUNvbmZpZ3VyYXRpb24oKTsKLQotCQl1cGRhdGVNZXNzYWdlKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2hlY2tTdGF0ZXMoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tlZCkgewotCi0JCS8vIE9iamVjdCBlbGVtZW50ID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCi0JCWlmIChjaGVja2VkID09IHRydWUpIHsKLQkJCUlUcmVlQ29udGVudFByb3ZpZGVyIGNwID0gKElUcmVlQ29udGVudFByb3ZpZGVyKSB0cmVlVmlld2VyCi0JCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCWNoZWNrUGFyZW50KGNwLCBlbGVtZW50KTsKLQkJCS8vIHRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCB0cnVlKTsKLQkJfSBlbHNlCi0JCQl0cmVlVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgZmFsc2UpOwotCi0JCXNlbGVjdGlvbkNoaWxkcmVuKGVsZW1lbnQsIGNoZWNrZWQpOwotCi0JfQotCi0JLyoqCi0JICogU2VsZWN0L3Vuc2VsZWN0IGFsbCB0aGUgY2hpbGRyZW4gZm9yIHRoZSBnaXZlbiBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY2hlY2tlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoaWxkcmVuKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGNoZWNrZWQpIHsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHRyZWVWaWV3ZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCU9iamVjdFtdIGNoaWxkcyA9IGNwLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcy5sZW5ndGg7IGkrKykgewotCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGNoaWxkc1tpXSwgY2hlY2tlZCk7Ci0JCQlzZWxlY3Rpb25DaGlsZHJlbihjaGlsZHNbaV0sIGNoZWNrZWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNoZWNrU3RhdGVzKCkgewotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJLy8gdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQotCQl0cnkgewotCQkJT2JqZWN0IGNvbnRlbnQgPSB0cmVlVmlld2VyLmdldElucHV0KCk7Ci0JCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQotCQkJCS8vIHNldCB0aGUgc2VsZWN0aW9uIHNpbmNlIHRoZSBjb2xzdXJlIG1heSBjaGFuZ2VkIHdpdGggbWFrZQotCQkJCS8vIGNsb3N1cmUgb3IgZml4IGVycm9yCi0JCQkJLy8gdHJlZVZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoY2xvc3VyZQotCQkJCS8vIC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJT2JqZWN0W10gc2VsZWN0aW9uTGlzdCA9IGNsb3N1cmUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlciBjcCA9IChDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyKSB0cmVlVmlld2VyCi0JCQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3Rpb25MaXN0W2ldOwotCi0JCQkJCWNoZWNrUGFyZW50KGNwLCBlbGVtZW50KTsKLQkJCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIHRydWUpOwotCQkJCX0KLQotCQkJCS8vIGFsc28gc2V0IHRoZSBVSSBmb2xkZXJzIGlmIHRoZSBjb3JyZXNwb25kaW5nIHBhY2thZ2UgaXMKLQkJCQkvLyBzZWxlY3RlZAotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBuZXcgQXJyYXlMaXN0KGNwLmdldFVJRWxlbWVudHMoKSkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJCQlPYmplY3QgbyA9IGNwLmdldFVJVGFyZ2V0RWxlbWVudChlbGVtZW50KTsKLQkJCQkJaWYgKG8gIT0gbnVsbCAmJiBjbG9zdXJlLmlzU2VsZWN0ZWQobykpIHsKLQkJCQkJCWNoZWNrUGFyZW50KGNwLCBlbGVtZW50KTsKLQkJCQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCB0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHJlc3RvcmUgdGhlIGV4cGFuZCBzdGF0ZQotCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRFbGVtZW50cyhleHBhbmRlZEVsZW1lbnRzLnRvQXJyYXkoKSk7Ci0KLQkJCX0KLQotCQl9IGZpbmFsbHkgewotCQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUGFyZW50KElUcmVlQ29udGVudFByb3ZpZGVyIGNwLCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5IC8qCi0JCQkJCQkJCQkJCQkJCQkJICogfHwgZWxlbWVudCA9PQotCQkJCQkJCQkJCQkJCQkJCSAqIGN1cnJlbnRSb290Tm9kZQotCQkJCQkJCQkJCQkJCQkJCSAqLykgewotCQkJcmV0dXJuOwotCQl9Ci0JCW1vZGlmaWVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQlPYmplY3QgcGFyZW50ID0gTGlicmFyeVV0aWwudW53cmFwKGNwLmdldFBhcmVudChlbGVtZW50KSk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKHBhcmVudCwgdHJ1ZSk7Ci0JCQkvLyBjb25maWdGYWN0b3J5LmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuYWRkKChFT2JqZWN0KXBhcmVudCwKLQkJCS8vIGZhbHNlKTsKLQkJCWNoZWNrUGFyZW50KGNwLCBwYXJlbnQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxsIHBhcmVudHMKLQkgKiBAcGFyYW0gbGlzdAotCSAqIEBwYXJhbSBwa2cKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRBbGxQYXJlbnRzKExpc3QgbGlzdCwgTWV0aG9kUGFja2FnZSBwa2cpIHsKLQkJTWV0aG9kUGFja2FnZSBwYXJlbnRQa2cgPSAoKE1ldGhvZFBhY2thZ2UpIHBrZykuZ2V0UGFyZW50UGFja2FnZSgpOwotCQlpZiAocGFyZW50UGtnICE9IG51bGwpIHsKLQkJCWxpc3QuYWRkKHBhcmVudFBrZyk7Ci0JCQlnZXRBbGxQYXJlbnRzKGxpc3QsIHBhcmVudFBrZyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBwYXJlbnRzIGZvciB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0UGFyZW50c0NoZWNrZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJV2lkZ2V0IHdpZGdldCA9IHRyZWVWaWV3ZXIudGVzdEZpbmRJdGVtKGVsZW1lbnQpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIHdpZGdldDsKLQkJCWl0ZW0gPSBpdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJCXdoaWxlIChpdGVtICE9IG51bGwpIHsKLQkJCQlpdGVtLnNldENoZWNrZWQodHJ1ZSk7Ci0JCQkJaXRlbSA9IGl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQkJLy8gcmV0dXJuIGlzRGlydHk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGRpcnR5IGZsYWcKLQkgKiBAcGFyYW0gZGlydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXJ0eShib29sZWFuIGRpcnR5KSB7Ci0JCWlzRGlydHkgPSBkaXJ0eTsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IHByb3ZpZGVyIGZvciBjb25maWd1cmF0aW9uIHBhY2thZ2VzCi0JICovCi0JcHVibGljIGNsYXNzIENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgZXh0ZW5kcwotCQkJQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgewotCQkvL3ByaXZhdGUgQ29uZmlndXJhdGlvbkZhY3RvcnkgY29uZmlnRmFjdG9yeTsKLQotCQkvLyBwcml2YXRlIGJvb2xlYW4gc2hvd01ldGhvZE1vZGVsT25seSA9IGZhbHNlOwotCi0JCS8vIHRoZXJlIGlzIGEgcHJvYmxlbSBpbiB0aGUgcGFzc2VkIGluIEFkYXB0ZXJGYWN0b3J5Ci0JCS8vIGl0IGNhbid0IGZpbmQgdGhlIGNvcnJlY3QgcGFyZW50IGZyb20gdGhlIGNoaWxkCi0JCS8vIG5lZWQgdG8gYnVpbGQgYSBtYXAgb2YgY2hpbGQgdG8gaXQncyBwYXJlbnQgaWYgdGhlIGNoaWxkIGlzIGEgVUkKLQkJLy8gZm9sZGVyCi0JCS8vIGNsZWFyIHRoZSBtYXAgd2hlbiB0aGUgaW5wdXQgaXMgc2V0Ci0JCU1hcCBjaGlsZFVJUGFyZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlMaXN0IHVpRm9sZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgTGlzdCBnZXRVSUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIHVpRm9sZGVyczsKLQkJfQotCi0JCS8qKgotCQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JCSAqLwotCQlwdWJsaWMgQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlcigvL0NvbmZpZ3VyYXRpb25GYWN0b3J5IGNvbmZpZ0ZhY3RvcnksCi0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkvKiAsIGJvb2xlYW4gc2hvd01ldGhvZE1vZGVsT25seSAqLykgewotCQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJLy8gdGhpcy5zaG93TWV0aG9kTW9kZWxPbmx5ID0gc2hvd01ldGhvZE1vZGVsT25seTsKLQkJfQotCi0JCS8qCi0JCXB1YmxpYyBDb25maWd1cmF0aW9uRmFjdG9yeSBnZXRDb25maWdGYWN0b3J5KCkgewotCQkJcmV0dXJuIGNvbmZpZ0ZhY3Rvcnk7Ci0JCX0KLQkJKi8KLQotCQkvLyBwdWJsaWMgdm9pZCBzZXRTaG93TWV0aG9kTW9kZWxPbmx5KGJvb2xlYW4gc2hvd09ubHkpIHsKLQkJLy8gc2hvd01ldGhvZE1vZGVsT25seSA9IHNob3dPbmx5OwotCQkvLyB9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJLy8gaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb290Q29udGVudCkgewotCQkJLy8gcmV0dXJuICgoUm9vdENvbnRlbnQpIHBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0JCQkvLyB9IGVsc2UgewotCQkJLy8gaWYgKHNob3dNZXRob2RNb2RlbE9ubHkpIHsKLQkJCS8vIHJldHVybiBudWxsOwotCQkJLy8gfSBlbHNlIHsKLQkJCU9iamVjdFtdIGl0ZW1zID0gZ2V0VmFsaWRJdGVtcyhwYXJlbnRFbGVtZW50LCBzdXBlcgotCQkJCQkuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCkpOwotCQkJcmV0dXJuIGl0ZW1zOwotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkvLyBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgUm9vdENvbnRlbnQpIHsKLQkJCS8vIHJldHVybiAoKFJvb3RDb250ZW50KSBpbnB1dEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0JCQkvLyB9IGVsc2UgewotCi0JCQlPYmplY3RbXSBpdGVtcyA9IGdldFZhbGlkSXRlbXMoaW5wdXRFbGVtZW50LCBzdXBlcgotCQkJCQkuZ2V0RWxlbWVudHMoaW5wdXRFbGVtZW50KSk7Ci0KLQkJCS8vIGlmIChzaG93TWV0aG9kTW9kZWxPbmx5ICYmIGl0ZW1zICE9IG51bGwpIHsKLQkJCS8vIExpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBpZiAoaXRlbXNbaV0gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCS8vIGVsZW1lbnRzLmFkZChpdGVtc1tpXSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyByZXR1cm4gZWxlbWVudHMudG9BcnJheSgpOwotCQkJLy8KLQkJCS8vIH0gZWxzZSB7Ci0JCQlyZXR1cm4gaXRlbXM7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNVSUZvbGRlcihPYmplY3QgZSkgewotCQkJcmV0dXJuIChlIGluc3RhbmNlb2YgQ29udGVudEl0ZW1Qcm92aWRlcgotCQkJCQl8fCBlIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIHx8IGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlciB8fAotCQkJCQllIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcgotCQkJLyoKLQkJCSAqIHx8IGUgaW5zdGFuY2VvZiBTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgfHwgZSBpbnN0YW5jZW9mCi0JCQkgKiBEaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciB8fCBlIGluc3RhbmNlb2YKLQkJCSAqIERvbWFpbnNJdGVtUHJvdmlkZXIgfHwgZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIgfHwKLQkJCSAqIGUgaW5zdGFuY2VvZiBSb2xlU2V0c0l0ZW1Qcm92aWRlciB8fCBlIGluc3RhbmNlb2YKLQkJCSAqIFRvb2xzSXRlbVByb3ZpZGVyIHx8IChlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpICYmCi0JCQkgKiBUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSllKQotCQkJICovCi0JCQkpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRVSVRhcmdldEVsZW1lbnQoT2JqZWN0IGUpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlyZXR1cm4gKChDdXN0b21DYXRlZ29yeSkgZSkuZUNvbnRhaW5lcigpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXJldHVybiBlOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQ29udGVudEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiAoKENvbnRlbnRJdGVtUHJvdmlkZXIpIGUpLmdldFBhcmVudChudWxsKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiAoKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgZSkuZ2V0UGFyZW50KG51bGwpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCU9iamVjdCB0YXJnZXQgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGUpLmdldFRhcmdldCgpOwotCQkJCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiB0YXJnZXQ7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByaXZhdGUgT2JqZWN0W10gZ2V0VmFsaWRJdGVtcyhPYmplY3QgcGFyZW50LCBPYmplY3RbXSBlbGVtZW50cykgewotCQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMubGVuZ3RoID09IDApIHsKLQkJCQlyZXR1cm4gZWxlbWVudHM7Ci0JCQl9Ci0KLQkJCUxpc3QgcGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3QgZSA9IExpYnJhcnlVdGlsLnVud3JhcChlbGVtZW50c1tpXSk7Ci0JCQkJYm9vbGVhbiB1aUZvbGRlciA9IGlzVUlGb2xkZXIoZSk7Ci0JCQkJaWYgKHVpRm9sZGVyIHx8IGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJCQl8fCBlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCXBrZ3MuYWRkKGUpOwotCi0JCQkJCWlmICh1aUZvbGRlcikgewotCQkJCQkJdWlGb2xkZXJzLmFkZChlKTsKLQkJCQkJfQotCi0JCQkJCS8vIGlmIHRoZSBwYXJlbnQgaXMgYSBVSSBmb2xkZXIsIG1hcCB0aGUgY2hpbGQgdG8gdGhlIHBhcmVudAotCQkJCQkvLyBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIHBhcmVudCBsYXRlcgotCQkJCQkvLyBpZiAoICEocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgKQotCQkJCQl7Ci0JCQkJCQljaGlsZFVJUGFyZW50TWFwLnB1dChlLCBwYXJlbnQpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJOyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIklnbm9yZWQ6ICIgKyBlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBwa2dzLnRvQXJyYXkoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCS8vIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9vdENvbnRlbnQpIHsKLQkJCS8vIHJldHVybiBudWxsOwotCQkJLy8gfSBlbHNlCi0JCQlpZiAoY2hpbGRVSVBhcmVudE1hcC5jb250YWluc0tleShlbGVtZW50KSkgewotCQkJCXJldHVybiBjaGlsZFVJUGFyZW50TWFwLmdldChlbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJLy8gaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb290Q29udGVudCkgewotCQkJLy8gcmV0dXJuIHRydWU7Ci0JCQkvLyB9IGVsc2UKLQkJCS8vIGlmIChzaG93TWV0aG9kTW9kZWxPbmx5KSB7Ci0JCQkvLyByZXR1cm4gZmFsc2U7Ci0JCQkvLyB9IGVsc2UgewotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCXJldHVybiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKTsKLQotCQkJLy8gcmV0dXJuIHRyZWVOb2RlUHJvdmlkZXIuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0JCQkvLyByZXR1cm4gc3VwZXIuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0JCQkvLyB9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCXN1cGVyLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0JCQljaGlsZFVJUGFyZW50TWFwLmNsZWFyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCi0JCQlpZiAoKG5vdGlmaWNhdGlvbiBpbnN0YW5jZW9mIElWaWV3ZXJOb3RpZmljYXRpb24pKSB7Ci0JCQkJZmluYWwgSVZpZXdlck5vdGlmaWNhdGlvbiB2bnQgPSAoSVZpZXdlck5vdGlmaWNhdGlvbikgbm90aWZpY2F0aW9uOwotCQkJCWZpbmFsIE9iamVjdCBlbGVtZW50ID0gdm50LmdldEVsZW1lbnQoKTsKLQkJCQlmaW5hbCBDb25maWd1cmF0aW9uVmlld2VyIGN0cmwgPSAoKENvbmZpZ3VyYXRpb25WaWV3ZXIpIHN1cGVyLnZpZXdlcik7Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiAodm50LmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQKLQkJCQkJCXx8IHZudC5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUKSkgewotCi0JCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQljdHJsLnNldENoZWNrZWQoZWxlbWVudCwgdHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCXVpRm9sZGVycy5jbGVhcigpOwotCQkJY2hpbGRVSVBhcmVudE1hcC5jbGVhcigpOwotCQkJLy9jb25maWdGYWN0b3J5ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIExhYmVsIHByb3ZpZGVyIGZvciBjb25maWd1cmF0aW9uIHBhY2thZ2VzCi0JICovCi0JcHVibGljIGNsYXNzIENvbmZpZ1BhY2thZ2VMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0JCUNvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JCS8vQ29uZmlndXJhdGlvbkZhY3RvcnkgY29uZmlnRmFjdG9yeTsKLQotCQlBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgYWZQcm92aWRlcjsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCQkgKiBAcGFyYW0gY29udGVudFByb3ZpZGVyCi0JCSAqLwotCQlwdWJsaWMgQ29uZmlnUGFja2FnZUxhYmVsUHJvdmlkZXIoCi0JCQkJQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJCXRoaXMuY29udGVudFByb3ZpZGVyID0gY29udGVudFByb3ZpZGVyOwotCQkJYWZQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoY29udGVudFByb3ZpZGVyCi0JCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCS8vdGhpcy5jb25maWdGYWN0b3J5ID0gY29udGVudFByb3ZpZGVyLmdldENvbmZpZ0ZhY3RvcnkoKTsKLQkJfQotCi0JCXByaXZhdGUgRWxlbWVudERlcGVuZGVuY3lFcnJvciBnZXRGaXJzdENoaWxkRXJyb3IoT2JqZWN0IGUpIHsKLQkJCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSBudWxsOwotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSBjb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oZSk7Ci0JCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCB8fCBjaGlsZHJlbi5sZW5ndGggPT0gMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGNoaWxkcmVuW2ldOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCXJldHVybiBnZXRGaXJzdENoaWxkRXJyb3Iob2JqZWN0KTsKLQkJCQl9IGVsc2UgewotCQkJCQllcnJvciA9IGNsb3N1cmUuZ2V0RXJyb3Iob2JqZWN0KTsKLQkJCQkJaWYgKGVycm9yICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBlcnJvcjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgSUxhYmVsUHJvdmlkZXJ9LmdldEltYWdlIGJ5IGZvcndhcmRpbmcgaXQgdG8KLQkJICogYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cwotCQkgKiB7QGxpbmsgSUl0ZW1MYWJlbFByb3ZpZGVyI2dldEltYWdlIElJdGVtTGFiZWxQcm92aWRlci5nZXRJbWFnZX0KLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQkvLyBkaXNhYmxlIGZvciBub3cgdGlsbCBpdCB3b3JrcwotCQkJQ29uZmlndXJhdGlvbkNsb3N1cmUgY29uZmlnMSA9IGNsb3N1cmU7Ci0JCQlpZiAoY29uZmlnMSAhPSBudWxsKSB7Ci0JCQkJLy8gbm8sIHRoaXMgd2lsbCBzaG93IHRoZSBlcnJvciBtYXJrIGV2ZW4gaWYgdGhlIGNoaWxkIGhhcyBubwotCQkJCS8vIGVycm9yLCBub3QgZ29vZAotCQkJCS8vIHNob3cgdGhlIGVycm9yIGlmIHRoZXJlIGlzIGNoaWxkIGVycm9yCi0JCQkJLy8gd2hpbGUgKCBvYmplY3QgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKQotCQkJCS8vIHsKLQkJCQkvLyBvYmplY3QgPSBjb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCQkJLy8gfQotCi0JCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IG51bGw7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJZXJyb3IgPSBnZXRGaXJzdENoaWxkRXJyb3Iob2JqZWN0KTsKLQkJCQl9IGVsc2UgewotCQkJCQllcnJvciA9IGNsb3N1cmUuZ2V0RXJyb3Iob2JqZWN0KTsKLQkJCQl9Ci0KLQkJCQlpZiAoZXJyb3IgIT0gbnVsbCkgewotCQkJCQlpZiAoZXJyb3IuaXNFcnJvcigpIHx8IGVycm9yLmlzQ2hpbGRFcnJvcigpKSB7Ci0JCQkJCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKQotCQkJCQkJCQkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19XQVJOX1RTSyk7IC8vIElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLCi0JCQkJCQkvLyBzaG93Ci0JCQkJCQkvLyB3YXJuaW5nCi0JCQkJCQkvLyBhcwotCQkJCQkJLy8gd2VsbAotCQkJCQl9IGVsc2UgaWYgKGVycm9yLmlzV2FybmluZygpIHx8IGVycm9yLmlzQ2hpbGRXYXJuaW5nKCkpIHsKLQkJCQkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpCi0JCQkJCQkJCS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1dBUk5fVFNLKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIGFmUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCi0JCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZUZyb21PYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBJTGFiZWxQcm92aWRlcn0uZ2V0VGV4dCBieSBmb3J3YXJkaW5nIGl0IHRvCi0JCSAqIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLQkJICoge0BsaW5rIElJdGVtTGFiZWxQcm92aWRlciNnZXRUZXh0IElJdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0fQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJLy8gcmV0dXJuCi0JCQkJLy8gKChQcm9jZXNzQ29tcG9uZW50KW9iamVjdCkuZ2V0UHJvY2VzcygpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQlQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpCi0JCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jICE9IG51bGwpCi0JCQkJCXJldHVybiBwcm9jLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQllbHNlCi0JCQkJCS8vIGlmIHByb2Nlc3MgaXMgbnVsbCwgcmV0dXJuIHByb2Nlc3Njb21wb25lbnQgbmFtZQotCQkJCQlyZXR1cm4gKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJCX0gZWxzZQotCQkJCXJldHVybiBhZlByb3ZpZGVyLmdldFRleHQob2JqZWN0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJCWNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0JCQlhZlByb3ZpZGVyID0gbnVsbDsKLQkJCS8vY29uZmlnRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaWx0ZXIgZm9yIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKgotCSAqLwotCXB1YmxpYyBjbGFzcyBDb25maWdUcmVlRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQkJYm9vbGVhbiBoaWRlVW5jaGVja2VkTm9kZXMgPSBmYWxzZTsKLQotCQlDaGVja2JveFRyZWVWaWV3ZXIgY2hlY2tUcmVlID0gbnVsbDsKLQotCQlDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlID0gbnVsbDsKLQotCQlDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGNwID0gbnVsbDsKLQotCQlwdWJsaWMgQ29uZmlnVHJlZUZpbHRlcihDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlKSB7Ci0JCQl0aGlzLmNsb3N1cmUgPSBjbG9zdXJlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0SGlkZSgpIHsKLQkJCWhpZGVVbmNoZWNrZWROb2RlcyA9IGhpZGVVbmNoZWNrZWROb2RlcyA9PSB0cnVlID8gZmFsc2UgOiB0cnVlOwotCQkJY2hlY2tUcmVlLnJlZnJlc2goKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwKLQkJCQlPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGNoZWNrVHJlZSA9PSBudWxsKSB7Ci0JCQkJY2hlY2tUcmVlID0gKENoZWNrYm94VHJlZVZpZXdlcikgdmlld2VyOwotCQkJCWNwID0gKENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIpIGNoZWNrVHJlZQotCQkJCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJfQotCi0JCQlpZiAoaGlkZVVuY2hlY2tlZE5vZGVzKSB7Ci0JCQkJT2JqZWN0IG8gPSBjcC5nZXRVSVRhcmdldEVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJcmV0dXJuIGNsb3N1cmUuaXNTZWxlY3RlZChvKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNIaWRpbmcoKSB7Ci0JCQlyZXR1cm4gaGlkZVVuY2hlY2tlZE5vZGVzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWNoZWNrVHJlZSA9IG51bGw7Ci0JCQljcCA9IG51bGw7Ci0JCQljbG9zdXJlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4KLQkgKiAJCVRydWUgaWYgY29uZmlndXJhdGlvbiBpcyBzYXZlIHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2F2ZUNvbmZpZ3VyYXRpb24oKSB7Ci0KLQkJYm9vbGVhbiBvbGROb3RpZnkgPSBjb25maWcuZURlbGl2ZXIoKTsKLQkgICAgdHJ5Ci0JICAgIHsKLQkgICAgCS8vY29uZmlnLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkgICAgCQotCQkJLy8gcmVtb3ZlIHRoZSBvbGQgZW50cmllcwotCQkJTGlzdCBwa2dMaXN0ID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCUxpc3QgcGxnTGlzdCA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkKLQkJCWFjdGlvbk1nciA9ICgoQ29uZmlndXJhdGlvbkVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJCWlmICghcGxnTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlpZiAoYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBjb25maWcsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSwKLQkJCQkJCXBsZ0xpc3QsIC0xKSA9PSBmYWxzZSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFwa2dMaXN0LmlzRW1wdHkoKSkgewotCQkJCWlmIChhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIGNvbmZpZywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwKLQkJCQkJCXBrZ0xpc3QsIC0xKSA9PSBmYWxzZSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQotCQkJLy8gYWRkIHRoZSBuZXcgZW50cmllcwotCQkJcGtnTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXBsZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCQkvLyBhbHdheXMgZ2V0IHNlbGVjdGlvbiBmcm9tIGNsb3N1cmUKLQkJCS8vIE9iamVjdFtdIG9ianMgPSB0cmVlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQkJLy8gLy9tb2RpZmllZExpc3QudG9BcnJheSgpOwotCQkJT2JqZWN0W10gb2JqcyA9IGNsb3N1cmUuZ2V0U2VsZWN0aW9uKCk7Ci0JCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIChvYmpzW2ldIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSAmJiAhcGxnTGlzdC5jb250YWlucyhvYmpzW2ldKSApIHsJCQkJCi0JCQkJCXBsZ0xpc3QuYWRkKG9ianNbaV0pOwotCQkJCQkKLQkJCQkJLy8gYWRkIGFsbCBzeXN0ZW0gcGFja2FnZXMgaW50byB0aGUgcGFja2FnZSBzZWxlY3Rpb24KLQkJCQkJTGlzdCBwa2dzID0gVG5nVXRpbC5nZXRBbGxTeXN0ZW1QYWNrYWdlcygoTWV0aG9kUGx1Z2luKW9ianNbaV0pOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgcGtnID0gaXQubmV4dCgpOwotCQkJCQkJaWYgKCFwa2dMaXN0LmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJCQlwa2dMaXN0LmFkZChwa2cpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCAob2Jqc1tpXSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpICYmICFwa2dMaXN0LmNvbnRhaW5zKG9ianNbaV0pICkgewotCQkJCQlwa2dMaXN0LmFkZChvYmpzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWFjdGlvbk1nciA9ICgoQ29uZmlndXJhdGlvbkVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJCWlmICghcGxnTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlpZiAoYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBjb25maWcsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSwKLQkJCQkJCXBsZ0xpc3QsIC0xKSA9PSBmYWxzZSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFwa2dMaXN0LmlzRW1wdHkoKSkgewotCQkJCWlmIChhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGNvbmZpZywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwKLQkJCQkJCXBrZ0xpc3QsIC0xKSA9PSBmYWxzZSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQl9IGZpbmFsbHkgewotCQkJY29uZmlnLmVTZXREZWxpdmVyKG9sZE5vdGlmeSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGxpYkxpc3RlbmVyICE9IG51bGwpIHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYkxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtc2dWaWV3ICE9IG51bGwgJiYgbXNnVmlld0xpc3RlbmVyICE9IG51bGwpIHsKLQkJCW1zZ1ZpZXcucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG1zZ1ZpZXdMaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAoY29uZmlnRmlsdGVyICE9IG51bGwpIHsKLQkJCWNvbmZpZ0ZpbHRlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZiAoY2xvc3VyZSAhPSBudWxsKSB7Ci0JCQljbG9zdXJlLmRpc3Bvc2UoKTsKLQkJCWNsb3N1cmUgPSBudWxsOwotCQl9Ci0KLQkJY29uZmlnLmVBZGFwdGVycygpLnJlbW92ZShjb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VWaWV3IGdldE1lc3NhZ2VWaWV3KCkgewotCQlpZiAobXNnVmlldyA9PSBudWxsIHx8IG1zZ1ZpZXcuaXNEaXNwb3NlZCgpKSB7Ci0JCQkvLyBhZGQgYSBsaXN0ZW5lciBmb3IgbWVzc2FnZSBzZWxlY3Rpb24gY2hhbmdlcwotCQkJbXNnVmlldyA9IE1lc3NhZ2VWaWV3LmdldFZpZXcoKTsKLQkJCW1zZ1ZpZXcuY29uZmlndXJhdGlvbkZhY3RvcnlDaGFuZ2VkKGNsb3N1cmUpOwotCi0JCQltc2dWaWV3TGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlPYmplY3RbXSBzZWxPYmpzID0gc2VsLnRvQXJyYXkoKTsKLQkJCQkJaWYgKChzZWxPYmpzICE9IG51bGwpICYmIChzZWxPYmpzLmxlbmd0aCA+IDApKSB7Ci0JCQkJCQlFT2JqZWN0IG5vZGUgPSBudWxsOwotCQkJCQkJaWYgKHNlbE9ianNbMF0gaW5zdGFuY2VvZiBFbGVtZW50RGVwZW5kZW5jeUVycm9yKSB7Ci0JCQkJCQkJbm9kZSA9IChFT2JqZWN0KSAoKEVsZW1lbnREZXBlbmRlbmN5RXJyb3IpIHNlbE9ianNbMF0pCi0JCQkJCQkJCQkuZ2V0RXJyb3JFbGVtZW50KCk7Ci0JCQkJCQl9IGVsc2UgaWYgKHNlbE9ianNbMF0gaW5zdGFuY2VvZiBFcnJvckluZm8pIHsKLQkJCQkJCQlFcnJvckluZm8gaW5mbyA9IChFcnJvckluZm8pIHNlbE9ianNbMF07Ci0JCQkJCQkJLy8gbm9kZSA9IChFT2JqZWN0KSBpbmZvLmdldE93bmVyRWxlbWVudCgpOwotCi0JCQkJCQkJLy8gc2hvdyB0aGUgY2F1c2UgZWxlbWVudAotCQkJCQkJCW5vZGUgPSAoRU9iamVjdCkgaW5mby5nZXRDYXVzZUVsZW1lbnQoKTsKLQotCQkJCQkJfQotCi0JCQkJCQllbHNlIGlmIChzZWxPYmpzWzBdIGluc3RhbmNlb2YgRWxlbWVudFJlZmVyZW5jZSkgewotCQkJCQkJCW5vZGUgPSAoRU9iamVjdCkgKChFbGVtZW50UmVmZXJlbmNlKSBzZWxPYmpzWzBdKQotCQkJCQkJCQkJLmdldFJlZkVsZW1lbnQoKTsKLQkJCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJCW5vZGUgPSBub2RlLmVDb250YWluZXIoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihMaWJyYXJ5VXRpbAotCQkJCQkJCQkJLmdldFNlbGVjdGFibGUobm9kZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQotCQkJbXNnVmlldy5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobXNnVmlld0xpc3RlbmVyKTsKLQkJfQotCi0JCXJldHVybiBtc2dWaWV3OwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVNZXNzYWdlKCkgewotCQkvLyBpZiBub3RoaW5nIHRvIHNob3csIGRvbid0IHNob3cgdGhlIG1lc3NhZ2UgdmlldwotCQlpZiAoY2xvc3VyZS5oYXNQcm9ibGVtKCkKLQkJCQl8fCAoKG1zZ1ZpZXcgIT0gbnVsbCkgJiYgIW1zZ1ZpZXcuaXNEaXNwb3NlZCgpKSkgewotCQkJZ2V0TWVzc2FnZVZpZXcoKS51cGRhdGVNZXNzYWdlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29uZmlndXJhdGlvbiBjbG9zdXJlCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25DbG9zdXJlIGdldENsb3N1cmUoKSB7Ci0JCXJldHVybiBjbG9zdXJlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkRWRpdG9yU2V0Rm9jdXNMaXNlbmVycygpIHsKLQkJaWYgKGdldEVkaXRvcigpIGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkVkaXRvcikgewotCQkJTGlzdGVuZXIgbGlzID0gbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCQlpZiAoZXZlbnQuZGF0YSA9PSBDb25maWd1cmF0aW9uUGFnZS50aGlzICYmIG5lZWRVcGRhdGUgJiYgdHJlZVZpZXdlciAhPSBudWxsKQl7Ci0JCQkJCQlyZUluaXRpYWxpemVDb25maWdGYWN0b3J5KCk7Ci0JCQkJCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCXVwZGF0ZUNoZWNrU3RhdGVzKCk7Ci0JCQkJCQlzaG93RXJyb3JzKCk7Ci0JCQkJCQluZWVkVXBkYXRlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJKChDb25maWd1cmF0aW9uRWRpdG9yKSBnZXRFZGl0b3IoKSkuYWRkVG9TZXRGb2N1c0xpc2VuZXJzKGxpcyk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db250ZW50RWxlbWVudEd1aWRhbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlY2YyNGE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db250ZW50RWxlbWVudEd1aWRhbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5HdWlkYW5jZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotLyoqCi0gKiBDbGFzcyBmb3IgR3VpZGFuY2UgdGFiIHBhZ2UgaW4gdGhlIGNvbnRlbnQgZWxlbWVudCBlZGl0b3IuCi0gKiBDbGFzcyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZSByZXBsYWNlcyBDYXRlZ29yeUd1aWRhbmNlUGFnZSBhbmQgaGFuZGxlcwotICogYWxsIGNvbnRlbnRlbGVtZW50J3MgZ3VpZGFuY2UgdGFiIGZlYXR1cmUuICAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImNhdGVnb3J5R3VpZGFuY2VzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuR1VJREFOQ0VfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IGxpc3QgPSBNZXRob2RFbGVtZW50VXRpbAotCQkJCQkJLmdldFNlbGVjdGVkR3VpZGFuY2VzKGNvbnRlbnRFbGVtZW50KTsKLQkJCQlMaXN0IGxvY2FsID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgUHJhY3RpY2UKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvciAmJiBjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRvb2wpIHx8IG9iagotCQkJCQkJCS5lcXVhbHMoY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpKSkgewotCQkJCQkJbG9jYWwuYWRkKG9iaik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGxvY2FsLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gQ29uc29saWRhdGluZyB0aGUgc2VwYXJhdGUgZm9ybSBwYWdlIGNvZGUKLQkJCQkvLyB0byBhY2NvbW9kYXRlIGJldHRlciBmaWx0ZXJpbmcuCi0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGFzaykgewotLy8JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGUpIHsKLS8vCQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0vLwkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0vLwkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Fc3RpbWF0ZSgpLAotLy8JCQkJCQkJCShFc3RpbWF0ZSkgaXRlbSwgLTEpOwotLy8JCQkJCX0gZWxzZSAKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcnMoKSwKLQkJCQkJCQkJKFRvb2xNZW50b3IpIGl0ZW0sIC0xKTsKLQkJCQkJfWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLAotCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gSW4gY2FzZSBvZiBXb3JrUHJvZHVjdCwgV29ya1Byb2R1Y3QgaXMgYXNzb2NpYXRlZCB0byBUb29sTWVudG9yLAotCQkJCS8vIEVzdGltYXRlLCBSZXBvcnQgYW5kIFRlbXBsYXRlIGd1aWRhbmNlCi0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBUZW1wbGF0ZSkgewotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCksCi0JCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpLAotCQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmVwb3J0KSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBjb250ZW50RWxlbWVudCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLAotCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCX0gCi0vLwkJCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRlKSB7Ci0vLwkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGNvbnRlbnRFbGVtZW50LAotLy8JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X0VzdGltYXRlKCksCi0vLwkJCQkJCQkJaXRlbSwgLTEpOwotLy8JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgewotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLAotCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBHdWlkYW5jZSBmb3IgY29udGVudCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQkoQ2hlY2tsaXN0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJCQkJKENvbmNlcHQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJKEd1aWRlbGluZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJKFJldXNhYmxlQXNzZXQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5hYmxlIHRvIGFkZCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJInRvICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrIGNvbnRlbnRFbGVtZW50LmdldFR5cGUoKQotCQkJCQkJCQkJCQkJCS5nZXROYW1lKCkKLQkJCQkJCQkJCQkJKyAiOiIgKyBjb250ZW50RWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCUlBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBJbiBjYXNlIG9mIFRhc2ssIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBUb29sTWVudG9yIGFuZAotCQkJCS8vIEVzdGltYXRlIGd1aWRhbmNlCi0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGFzaykgewotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcnMoKSwKLQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCQl9IAotLy8JCQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFc3RpbWF0ZSkgewotLy8JCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLS8vCQkJCQkJCQljb250ZW50RWxlbWVudCwKLS8vCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRlKCksIG51bGwsCi0vLwkJCQkJCQkJLTEpOwotLy8JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgewotCQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCBpdGVtLAotCQkJCQkJCQktMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gSW4gY2FzZSBvZiBXb3JrUHJvZHVjdCwgV29ya1Byb2R1Y3QgaXMgYXNzb2NpYXRlZCB0byBUb29sTWVudG9yLAotCQkJCS8vIEVzdGltYXRlLCBSZXBvcnQgYW5kIFRlbXBsYXRlIGd1aWRhbmNlCi0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXBvcnQpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCksIGl0ZW0sIC0xKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVGVtcGxhdGUpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSwgaXRlbSwgLTEpOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpLAotCQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQkJfSAKLS8vCQkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGUpIHsKLS8vCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgY29udGVudEVsZW1lbnQsCi0vLwkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGUoKSwKLS8vCQkJCQkJCQludWxsLCAtMSk7Ci0vLwkJCQkJfQotCQkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSB7Ci0JCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCBpdGVtLAotCQkJCQkJCQktMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gR3VpZGFuY2UgZm9yIHRoZSBtZXRob2QgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCShFeGFtcGxlKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQkJCShHdWlkZWxpbmUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCShSZXVzYWJsZUFzc2V0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byByZW1vdmUgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJmcm9tICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrIGNvbnRlbnRFbGVtZW50LmdldFR5cGUoKQotCQkJCQkJCQkJCQkJCS5nZXROYW1lKCkKLQkJCQkJCQkJCQkJKyAiOiIgKyBjb250ZW50RWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBHdWlkYW5jZUZpbHRlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldEZpbHRlclR5cGVzKCkKLQkgKiAgICAgIFR5cGVzIGFyZSByZXR1cm5lZCBpbiBvcmRlciB0byBkaXNwbGF5IGluIHRoZSBmaWx0ZXIgZGlhbG9nIGZvcgotCSAqICAgICAgc2VhcmNoIGJhc2VkIG9uIHR5cGUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlclR5cGVzKCkgewotCQkKLQkJU3RyaW5nW10gc3RyOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQlzdHIgPSBuZXcgU3RyaW5nWzExXTsKLQkJfSBlbHNlIGlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlzdHIgPSBuZXcgU3RyaW5nWzEzXTsKLQkJfSBlbHNlCi0JCQlzdHIgPSBuZXcgU3RyaW5nWzldOwotCQlpbnQgaSA9IDA7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5DSEVDS0xJU1RTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5DT05DRVBUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuRVhBTVBMRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkdVSURFTElORVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlJFVVNBQkxFX0FTU0VUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFM7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkVTVElNQVRFX0NPTlNJREVSQVRJT05TOwotCQkJLy8gVE9ETyBFc3RpbWF0ZSBjb250ZW50ZWxlbWVudAotCQl9IGVsc2UgaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlJFUE9SVFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5URU1QTEFURVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5FU1RJTUFURV9DT05TSURFUkFUSU9OUzsKLQkJCS8vIFRPRE8gRXN0aW1hdGUgY29udGVudGVsZW1lbnQKLQkJfQotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5DT05URU5UX1BBQ0tBR0VTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TOwotCQlyZXR1cm4gc3RyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5jYXRlZ29yeUd1aWRhbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJvbGVTZXQpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrcHJvZHVjdHR5cGVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBEb21haW4pewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbnNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRvb2wpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRhc2spewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRvb2wpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXaGl0ZXBhcGVyKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53aGl0ZXBhcGVyX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb25jZXB0KXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jb25jZXB0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDaGVja2xpc3QpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRXhhbXBsZSl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXhhbXBsZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgR3VpZGVsaW5lKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5ndWlkZWxpbmVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3VwcG9ydGluZ21hdGVyaWFsX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2FkbWFwKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2FkbWFwX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBQcmFjdGljZSl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlcG9ydCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwb3J0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yZXVzYWJsZWFzc2V0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUZW1wbGF0ZSl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50ZXJtZGVmaW5pdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVG9vbE1lbnRvcil7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbG1lbnRvcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbWNhdGVnb3J5X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCWlmKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uLCBjb250ZW50RWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbnRlbnRQYWNrYWdlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJhZjMwYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbnRlbnRQYWNrYWdlRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0KLS8qKgotICogVGhlIGRlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBDb250ZW50IFBhY2thZ2UgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZSBleHRlbmRzIEZvcm1QYWdlIGltcGxlbWVudHMgSVJlZnJlc2hhYmxlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BSRUZJWCA9IExpYnJhcnlVSVRleHQuVEVYVF9DT05URU5UX1BBQ0tBR0UKLQkJCSsgIjogIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbmFtZTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmX2Rlc2M7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgY3RybF9kZXBlbmRlbmN5OwotCi0JcHJpdmF0ZSBTY3JvbGxlZEZvcm0gZm9ybTsKLQotCXByaXZhdGUgQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2U7Ci0KLQlwcml2YXRlIEhhc2h0YWJsZSBhUGFja2FnZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyIG1vZGVsTW9kaWZ5TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIENvbnRlbnRQYWNrYWdlIG9iamVjdCBmcm9tIHRoZSBFZGl0b3IgaW5wdXQuCi0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQkJT2JqZWN0IG9iaiA9IG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCWNvbnRlbnRQYWNrYWdlID0gKENvbnRlbnRQYWNrYWdlKSBvYmo7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQkvLyBDcmVhdGUgdGhlIGZvcm0gdG9vbGtpdC4KLQkJZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5zZXRUZXh0KEZPUk1fUFJFRklYICsgY29udGVudFBhY2thZ2UuZ2V0TmFtZSgpKTsKLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBHZW5lcmFsIEluZm9ybWFpdG9uIHNlY3Rpb24uCi0JCVNlY3Rpb24gZ2VuZXJhbFNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuR0VORVJBTF9JTkZPX1NFQ1RJT05fTkFNRSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCUF1dGhvcmluZ1VJVGV4dC5HRU5FUkFMX0lORk9fU0VDVElPTl9ERVNDLAotCQkJCW5ldyBTdHJpbmdbXSB7IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIoY29udGVudFBhY2thZ2UpIH0pKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUNvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbFNlY3Rpb24pOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRDbGllbnQoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLmdldFBhcmVudCgpLmdldFBhcmVudCgpLAotCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkNPTlRFTlRfUEFDS0FHRV9FRElUT1JfQUxMX0NPTlRFWFQpOyAKLQotCQkvLyBuYW1lCi0JCUxhYmVsIGxfbmFtZSA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfbmFtZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWN0cmxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIGJyaWVmIGRlc2MKLQkJTGFiZWwgbF9icmllZl9kZXNjID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfYnJpZWZfZGVzYyA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCSIiLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCVNlY3Rpb24gZGVwZW5kZW5jeVNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkMSA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJZGVwZW5kZW5jeVNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZDEpOwotCQlkZXBlbmRlbmN5U2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5ERVBFTkRFTkNJRVNfU0VDVElPTl9OQU1FKTsKLQkJZGVwZW5kZW5jeVNlY3Rpb24KLQkJCQkuc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlUZXh0LkRFUEVOREVOQ0lFU19TRUNUSU9OX0RFU0MpOwotCQlkZXBlbmRlbmN5U2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJQ29tcG9zaXRlIGRlcGVuZGVuY3lDb21wb3NpdGUgPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUNvbXBvc2l0ZShkZXBlbmRlbmN5U2VjdGlvbik7Ci0JCWRlcGVuZGVuY3lDb21wb3NpdGUKLQkJCQkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWRlcGVuZGVuY3lDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWRlcGVuZGVuY3lTZWN0aW9uLnNldENsaWVudChkZXBlbmRlbmN5Q29tcG9zaXRlKTsKLQotCQlUYWJsZSBjdHJsX3RhYmxlID0gbmV3IFRhYmxlKGRlcGVuZGVuY3lDb21wb3NpdGUsIFNXVC5WX1NDUk9MTAotCQkJCXwgU1dULkNIRUNLIHwgU1dULlJFQURfT05MWSB8IFNXVC5DT0xPUl9CTFVFKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJCXwgR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAxMDA7Ci0JCQljdHJsX3RhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9kZXBlbmRlbmN5ID0gbmV3IENoZWNrYm94VGFibGVWaWV3ZXIoY3RybF90YWJsZSk7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQkJY3RybF9kZXBlbmRlbmN5LnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0KLQkJSGFzaHRhYmxlIGFNYXAgPSBnZXREZXBlbmRlbmNpZXNQYWNrYWdlcyhjb250ZW50UGFja2FnZSk7Ci0KLQkJaWYgKGFNYXAgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBhTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQljdHJsX2RlcGVuZGVuY3kuYWRkKGtleSk7Ci0JCQl9Ci0JCX0KLQkJY3RybF9kZXBlbmRlbmN5LnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCWN0cmxfZGVwZW5kZW5jeS5zZXRBbGxHcmF5ZWQodHJ1ZSk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGRlcGVuZGVuY3lDb21wb3NpdGUpOwotCi0JCS8vIGxvYWQgZGF0YQotCQlsb2FkRGF0YSgpOwotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyBzZXQgZm9jdXMgb24gdGhlIG5hbWUgYXR0cmlidXRlCi0JCURpc3BsYXkgZGlzcGxheSA9IGZvcm0uZ2V0Qm9keSgpLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJCWN0cmxfbmFtZS5zZXRTZWxlY3Rpb24oMCwgY3RybF9uYW1lLmdldFRleHQoKS5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCW1vZGVsTW9kaWZ5TGlzdGVuZXIgPSBlZGl0b3IuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoY29udGVudFBhY2thZ2UpOwotCi0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJLy8gcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQljdHJsX2RlcGVuZGVuY3kucmVmcmVzaCgpOwotCQkJCUhhc2h0YWJsZSBhTWFwID0gZ2V0RGVwZW5kZW5jaWVzUGFja2FnZXMoY29udGVudFBhY2thZ2UpOwotCi0JCQkJaWYgKGFNYXAgIT0gbnVsbCkgewotCQkJCQlJdGVyYXRvciBpdCA9IGFNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQkJCWN0cmxfZGVwZW5kZW5jeS5hZGQoa2V5KTsKLQkJCQkJfQotCQkJCX0KLQkJCQljdHJsX2RlcGVuZGVuY3kuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJCQljdHJsX2RlcGVuZGVuY3kuc2V0QWxsR3JheWVkKHRydWUpOwotCQkJCWlmIChUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRQYWNrYWdlKSkgewotCQkJCQllbmFibGVDb250cm9scyhmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZW5hYmxlQ29udHJvbHModHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJZmluYWwgQ29sbGVjdGlvbiBlQ2xhc3NlcyA9IENvbGxlY3Rpb25zCi0JCQkJCQkuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2UoKSk7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50UGFja2FnZS5nZXROYW1lKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbXNnID0gbnVsbCA7Ci0JCQkJU3RyaW5nIG5ld05hbWUgPSBjdHJsX25hbWUuZ2V0VGV4dCgpOwotCQkJCWlmKG5ld05hbWUgIT0gbnVsbCkgewotCQkJCQluZXdOYW1lID0gbmV3TmFtZS50cmltKCk7CQkJCQkKLQkJCQkJLy8gMTc4NDYyCi0JCQkJCWlmIChuZXdOYW1lLmluZGV4T2YoIiYiKSA+IC0xKSB7Ci0JCQkJCQltc2cgPSBOTFMKLQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3I0X21zZywKLQkJCQkJCQkJCQluZXdOYW1lKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW1zZyA9IFRuZ1V0aWwuY2hlY2tOYW1lKGNvbnRlbnRQYWNrYWdlLCBuZXdOYW1lLAotCQkJCQkJCQllQ2xhc3Nlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJCWlmICghbmV3TmFtZS5lcXVhbHMoY29udGVudFBhY2thZ2UuZ2V0TmFtZSgpKSkgewotCQkJCQkJY3RybF9uYW1lLnNldFRleHQobmV3TmFtZSk7Ci0JCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJY29udGVudFBhY2thZ2UsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCQkJCW5ld05hbWUsIC0xKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfdGl0bGUsIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY3RybF9uYW1lLnNldFRleHQoY29udGVudFBhY2thZ2UuZ2V0TmFtZSgpKTsKLQkJCQkJY3RybF9uYW1lLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCQkJCWN0cmxfbmFtZS5zZWxlY3RBbGwoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2JyaWVmX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYnJpZWZfZGVzYy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudFBhY2thZ2UuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld05hbWUgPSBjdHJsX2JyaWVmX2Rlc2MuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3TmFtZS5lcXVhbHMoY29udGVudFBhY2thZ2UuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQljb250ZW50UGFja2FnZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLAotCQkJCQkJCW5ld05hbWUsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KG5ld05hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2RlcGVuZGVuY3kuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdCBvYmogPSBldmVudC5nZXRTb3VyY2UoKTsKLQkJCQkoKENoZWNrYm94VGFibGVWaWV3ZXIpIG9iaikuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVDb250cm9scyhib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfYnJpZWZfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCVN0cmluZyBuYW1lID0gY29udGVudFBhY2thZ2UuZ2V0TmFtZSgpOwotCQlTdHJpbmcgZGVzYyA9IGNvbnRlbnRQYWNrYWdlLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQotCQlMaXN0IGRlcGVuZGVuY2llcyA9IGNvbnRlbnRQYWNrYWdlLmdldFJldXNlZFBhY2thZ2VzKCk7Ci0KLQkJY3RybF9uYW1lLnNldFRleHQobmFtZSA9PSBudWxsID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjID09IG51bGwgPyAiIiA6IGRlc2MpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbmNpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUl0ZXJhdG9yIGl0ID0gYVBhY2thZ2VNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQlpZiAoZGVwZW5kZW5jaWVzLmdldChpKSA9PSBlbnRyeS5nZXRWYWx1ZSgpKSB7Ci0JCQkJCWN0cmxfZGVwZW5kZW5jeS5zZXRDaGVja2VkKGVudHJ5LmdldEtleSgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgZGVwZW5kZW5jeSBwYWNrYWdlcyBmb3IgdGhlIGdpdmVuIGNvbnRlbnQgcGFja2FnZQotCSAqIEByZXR1cm4KLQkgKiAJCUxpc3Qgb2YgZGVwZW5kZW5jeSBwYWNrYWdlcwotCSAqLwotCXB1YmxpYyBIYXNodGFibGUgZ2V0RGVwZW5kZW5jaWVzUGFja2FnZXMoQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2UpIHsKLQotCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250ZW50UGFja2FnZS5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChjb250ZW50RWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCWVsZW1lbnRzLmFkZCgoQ29udGVudEVsZW1lbnQpIGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCX0KLQkJCWVsZW1lbnRzLmFkZEFsbChNZXRob2RFbGVtZW50VXRpbAotCQkJCQkuZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoY29udGVudEVsZW1lbnQpKTsKLQotCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZSkgewotCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldE1vZGlmaWVkV29ya1Byb2R1Y3RzKChSb2xlKSBjb250ZW50RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0TW9kaWZpZWRXb3JrUHJvZHVjdHMoKFJvbGUpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJfQotCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza3MoKFJvbGUpIGNvbnRlbnRFbGVtZW50KSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRQcmltYXJ5VGFza3MoKFJvbGUpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJfQotCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlci5nZXRTZWNvbmRhcnlUYXNrcygoUm9sZSkgY29udGVudEVsZW1lbnQpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldFNlY29uZGFyeVRhc2tzKChSb2xlKSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQlpZiAoKChUYXNrKSBjb250ZW50RWxlbWVudCkuZ2V0UGVyZm9ybWVkQnkoKSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZCgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRQZXJmb3JtZWRCeSgpKTsKLQkJCQl9Ci0JCQkJaWYgKCgoVGFzaykgY29udGVudEVsZW1lbnQpLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoKChUYXNrKSBjb250ZW50RWxlbWVudCkKLQkJCQkJCQkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCQkJfQotCQkJCWlmICgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRNYW5kYXRvcnlJbnB1dCgpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMKLQkJCQkJCQkuYWRkQWxsKCgoVGFzaykgY29udGVudEVsZW1lbnQpLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJCX0KLQkJCQlpZiAoKChUYXNrKSBjb250ZW50RWxlbWVudCkuZ2V0T3B0aW9uYWxJbnB1dCgpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKCgoVGFzaykgY29udGVudEVsZW1lbnQpLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCQkJfQotCQkJCWlmICgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRPdXRwdXQoKSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbCgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRPdXRwdXQoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRNb2RpZmllZEJ5KChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldE1vZGlmaWVkQnkoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRNYW5kYXRvcnlJbnB1dFRvVGFza3MoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cwotCQkJCQkJCS5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkJCS5nZXRNYW5kYXRvcnlJbnB1dFRvVGFza3MoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRPdXRwdXR0aW5nVGFza3MoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0T3V0cHV0dGluZ1Rhc2tzKChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQpKTsKLQkJCQl9Ci0JCQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlcygoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50KTsKLQkJCQlpZiAobGlzdCAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbChsaXN0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmplY3QgPSAoKENvbnRlbnRFbGVtZW50KSBlbGVtZW50cy5nZXQoaSkpLmVDb250YWluZXIoKTsKLQkJCS8vIE9iamVjdCBvYmplY3QgPSBlbGVtZW50cy5nZXQoaSk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGUKLQkJCS8vICIrKChDb250ZW50UGFja2FnZSlvYmplY3QpLmdldFR5cGUoKS5nZXROYW1lKCkpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJaWYgKCFjb250ZW50UGFja2FnZS5lcXVhbHMob2JqZWN0KSkgewotCQkJCQlhUGFja2FnZU1hcC5wdXQoKChDb250ZW50UGFja2FnZSkgb2JqZWN0KS5nZXROYW1lKCksCi0JCQkJCQkJKENvbnRlbnRQYWNrYWdlKSBvYmplY3QpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCXJldHVybiBhUGFja2FnZU1hcDsKLQl9CQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLklSZWZyZXNoYWJsZSNyZWZyZXNoTmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hOYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCWlmICgoY3RybF9uYW1lICE9IG51bGwpICYmICEoY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkpIHsKLQkJCQljdHJsX25hbWUucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJY3RybF9uYW1lLnNldFRleHQobmV3TmFtZSk7Ci0JCQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCVVJSGVscGVyLnNldEZvcm1UZXh0KGZvcm0sIGNvbnRlbnRQYWNrYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5QXNzaWduUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5QXNzaWduUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzY2OGExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkNhdGVnb3J5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIEFzc2lnbiBwYWdlIGluIHRoZSBDdXN0b20gQ2F0ZWdvcnkgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnk7Ci0KLQlwcml2YXRlIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGFsbFN0ZXBzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuQVNTSUdOX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAoYWxsU3RlcHMgPT0gbnVsbCkgewotCQkJCQlhbGxTdGVwcyA9IG5ldyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCgKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdC5DT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9PTkxZKTsKLQkJCQl9Ci0JCQkJTGlzdCByZXR1cm5MaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKGNvbnRlbnRFbGVtZW50LCBhbGxTdGVwcy50b0FycmF5KCkpOwotCQkJCXJldHVybiByZXR1cm5MaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJYm9vbGVhbiBvayA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoY2F0ZWdvcnksIGFkZEl0ZW1zKTsKLQkJaWYoISBvaykgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2lyY3VsYXJfZGVwZW5kZW5jeV9lcnJvcl90aXRsZTsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLmNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfbXNnKTsJCQkJCQkKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdCBhbmNlc3RvcnMgPSBnZXRBbmNlc3RvcnMoY2F0ZWdvcnkpOwotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IGN1c3RvbUNhdGVnb3J5ID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQlpZiAoY3VzdG9tQ2F0ZWdvcnkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeQotCQkJCQkJJiYgVG5nVXRpbAotCQkJCQkJCQkuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBjdXN0b21DYXRlZ29yeSkpIHsKLQkJCQl9IGVsc2UgaWYgKGFuY2VzdG9ycy5jb250YWlucyhjdXN0b21DYXRlZ29yeSkpIHsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoY3VzdG9tQ2F0ZWdvcnkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG9iamVjdCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgY3VzdG9tQ2F0ZWdvcnkpCi0JCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY2F0ZWdvcnksIG9iamVjdCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY2F0ZWdvcnksIGN1c3RvbUNhdGVnb3J5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJQXJyYXlMaXN0IGN1c3RvbUNhdGVnb3JpZXNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCU1ldGhvZFBsdWdpbiBjdXJyZW50UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotLy8JCQkJCUFkYXB0ZXIgYWRhcHRlciA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0vLwkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoCi0vLwkJCQkJCQkJCWNhdGVnb3J5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotLy8JCQkJCWlmIChhZGFwdGVyICE9IG51bGwKLS8vCQkJCQkJCSYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0vLwkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlcikKLS8vCQkJCQkJCQkuZ2V0Q2hpbGRyZW4oY2F0ZWdvcnkpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLS8vCQkJCQkJCWlmIChUbmdVdGlsLnVud3JhcChvKSA9PSBlKSB7Ci0vLwkJCQkJCQkJY3VzdG9tQ2F0ZWdvcmllc1RvRGVsZXRlLmFkZChvKTsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIHdpbGwgZGVsZXRlIGUgaWYgaXQgaXMgaW4gdGhlIGN1cnJlbnQgcGx1Z2luIGFuZAotCQkJCQkvLyB0aGUgbGFzdCBzdXBlciBjdXN0b20gY2F0ZWdvcnkgb2YgZSBpbiB0aGUgY3VycmVudCBwbHVnaW4KLQkJCQkJLy8KLQkJCQkJaWYoVG5nVXRpbC5pc0luUGx1Z2luV2l0aExlc3NUaGFuT25lU3VwZXJDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIGUsIGN1cnJlbnRQbHVnaW4pKSB7Ci0JCQkJCQljdXN0b21DYXRlZ29yaWVzVG9EZWxldGUuYWRkKGUpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbUN1c3RvbUNhdGVnb3J5KAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBjYXRlZ29yeSwgZSk7Ci0JCQl9Ci0KLQkJCWlmIChjdXN0b21DYXRlZ29yaWVzVG9EZWxldGUuc2l6ZSgpID4gMCkgewotCQkJCWludCBpID0gMDsKLQkJCQlTdHJpbmdCdWZmZXIgZWxlbWVudFN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY3VzdG9tQ2F0ZWdvcmllc1RvRGVsZXRlLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0Lm5leHQoKSk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJCQllbGVtZW50U3RyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZWxlbWVudFN0ci5hcHBlbmQoKChNZXRob2RFbGVtZW50KSBvYmopLmdldE5hbWUoKSk7Ci0KLQkJCQkJCWkrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZighQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlDb25maXJtYXRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVtb3ZlX3RleHQsCi0JCQkJCQlOTFMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5wcm9tcHREZWxldGVDdXN0b21DYXRlZ29yeUJlZm9yZVJlbW92ZUxhc3RSZWZUb0l0LCBlbGVtZW50U3RyKSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlMaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgTGlicmFyeVZpZXdEZWxldGVBY3Rpb24oKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbmZpcm0gPSBmYWxzZTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJc3VwZXIucnVuKCk7Ci0JCQkJCQl9IGNhdGNoIChNZXNzYWdlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJU3RyaW5nIGRldGFpbHMgPSBUbmdVdGlsLnRvU3RhY2tUcmFjZVN0cmluZyhlKTsKLQkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yTWVzc2FnZTsgLy8kTk9OLU5MUy0xJAkJCi0JCQkJCQkJU3RyaW5nIHJlYXNvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCByZWFzb24sCi0JCQkJCQkJCQkJCWRldGFpbHMsIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmFpbGVkKCkgewotCQkJCQkJLy8gbGlicmFyeSBuZWVkIHRvIGJlIHJlbG9hZGVkCi0JCQkJCQkvLwotCQkJCQkJU3RyaW5nIGxpYkRpciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpOwotCQkJCQkJTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLm9wZW5MaWJyYXJ5KGxpYkRpcik7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfTsKLQkJCQlkZWxldGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihMaWJyYXJ5Vmlldy5nZXRWaWV3KCkKLQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCkpOwotCQkJCWRlbGV0ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJY3VzdG9tQ2F0ZWdvcmllc1RvRGVsZXRlKSk7Ci0JCQkJZGVsZXRlQWN0aW9uLnJ1bigpOwotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNtb3ZlVXBJdGVtc0luU2VsZWN0ZWRJdGVtczEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vdmVVcEl0ZW1zSW5TZWxlY3RlZEl0ZW1zMShBcnJheUxpc3QgbW92ZVVwSXRlbXMpIHsKLQkJaWYgKCFtb3ZlVXBJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCQlNb3ZlSW5DYXRlZ29yeUNvbW1hbmQgY21kID0gbmV3IE1vdmVJbkNhdGVnb3J5Q29tbWFuZCgKLQkJCQkJKEN1c3RvbUNhdGVnb3J5KSBjb250ZW50RWxlbWVudCwgbW92ZVVwSXRlbXMsIGFsbFN0ZXBzLAotCQkJCQlmZWF0dXJlLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCwgMSk7Ci0JCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjbW92ZURvd25JdGVtc0luU2VsZWN0ZWRJdGVtczEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vdmVEb3duSXRlbXNJblNlbGVjdGVkSXRlbXMxKEFycmF5TGlzdCBtb3ZlRG93bkl0ZW1zKSB7Ci0JCWlmICghbW92ZURvd25JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCQlNb3ZlSW5DYXRlZ29yeUNvbW1hbmQgY21kID0gbmV3IE1vdmVJbkNhdGVnb3J5Q29tbWFuZCgKLQkJCQkJKEN1c3RvbUNhdGVnb3J5KSBjb250ZW50RWxlbWVudCwgbW92ZURvd25JdGVtcywgYWxsU3RlcHMsCi0JCQkJCWZlYXR1cmUsIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoLCAwKTsKLQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhbmNlc3RvcnMgZm9yIHRoZSBnaXZlbiBDdXN0b20gQ2F0ZWdvcnkuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEFuY2VzdG9ycyhDdXN0b21DYXRlZ29yeSBtZXRob2RPYmplY3QpIHsKLQkJTGlzdCBhbmNlc3Rvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgb2JqTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJb2JqTGlzdC5hZGQobWV0aG9kT2JqZWN0KTsKLQkJZ2V0QW5jZXN0b3JzKGFuY2VzdG9yTGlzdCwgb2JqTGlzdCk7Ci0JCXJldHVybiBhbmNlc3Rvckxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldEFuY2VzdG9ycyhMaXN0IGFuY2VzdG9yTGlzdCwgTGlzdCBtZXRob2RPYmplY3RMaXN0KSB7Ci0JCWlmIChtZXRob2RPYmplY3RMaXN0LmlzRW1wdHkoKSkKLQkJCXJldHVybiBhbmNlc3Rvckxpc3Q7Ci0KLQkJTGlzdCBhbGxQYXJlbnRDdXN0Q2F0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ3VzdG9tQ2F0ZWdvcnkgZWxlbWVudCA9IChDdXN0b21DYXRlZ29yeSkgaXRlci5uZXh0KCk7Ci0JCQlMaXN0IHBhcmVudExpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGVsZW1lbnQpOwotCQkJYWxsUGFyZW50Q3VzdENhdHMuYWRkQWxsKHBhcmVudExpc3QpOwotCQl9Ci0KLQkJYW5jZXN0b3JMaXN0LmFkZEFsbChtZXRob2RPYmplY3RMaXN0KTsKLQkJTGlzdCBuZXh0Q2hlY2tMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxQYXJlbnRDdXN0Q2F0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWFuY2VzdG9yTGlzdC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCW5leHRDaGVja0xpc3QuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGdldEFuY2VzdG9ycyhhbmNlc3Rvckxpc3QsIG5leHRDaGVja0xpc3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gY2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFM7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDdXN0b21DYXRlZ29yeUFzc2lnbkZpbHRlciBleHRlbmRzIEFsbEZpbHRlciB7Ci0JCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYob2JqIGluc3RhbmNlb2YgTWlsZXN0b25lKXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqKSkgewotCQkJCQlyZXR1cm4gISgoKEN1c3RvbUNhdGVnb3J5KSBvYmopLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkJCS5pc0VtcHR5KCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkvLyBpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSl7Ci0JCQkJLy8gcmV0dXJuCi0JCQkJLy8gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSlvYmopLmlzRW1wdHkoKTsKLQkJCQkvLyB9Ci0JCQkJLy8gaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpewotCQkJCS8vIHJldHVybgotCQkJCS8vIEFzc29jaWF0aW9uSGVscGVyLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpb2JqKS5pc0VtcHR5KCk7Ci0JCQkJLy8gfQotCQkJCXJldHVybiAhKGdldEhlbHBlcigpLmlzQ29udHJpYnV0b3IoKENvbnRlbnRFbGVtZW50KSBvYmopKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDdXN0b21DYXRlZ29yeUFzc2lnbkZpbHRlcigpOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5RGVzY3JpcHRpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ3VzdG9tQ2F0ZWdvcnlEZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWYyNTgwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ3VzdG9tQ2F0ZWdvcnlEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DdXN0b21DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBEb21haW4gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJjdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGNvbnRlbnRFbGVtZW50OwotCQlwdWJsaXNoQ2F0ZWdvcnlPbiA9IHRydWU7Ci0JCXNldEljb25TZWN0aW9uT24odHJ1ZSk7Ci0JCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gY2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IEN1c3RvbUNhdGVnb3J5RmlsdGVyKCk7Ci0JCS8vIHNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nCi0JCSgoQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJY2F0ZWdvcnkpIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21jYXRlZ29yeV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21jYXRlZ29yeV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9ICBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21jYXRlZ29yeV9JY29uU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTNjNTQ4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogRGVzY3JpcHRpb24gcGFnZSBmb3IgZGVsaXZlcnkgcHJvY2VzcwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBleHRlbmRzIFByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3NjYWxlLCBjdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9yaXNrX2xldmVsLCBjdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlczsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlLAotCQkJY3RybF90eXBlX29mX2NvbnRyYWN0OwotCi0JcHJpdmF0ZSBEZWxpdmVyeVByb2Nlc3MgZGVsaXZlcnlQcm9jZXNzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Zvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZGVsaXZlcnlQcm9jZXNzID0gKERlbGl2ZXJ5UHJvY2VzcykgcHJvY2VzczsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRGVzY3JpcHRpb24jY3JlYXRlRGV0YWlsU2VjdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGV0YWlsU2VjdGlvbigpIHsKLQkJc3VwZXIuY3JlYXRlRGV0YWlsU2VjdGlvbigpOwotCi0JCS8vIHNjYWxlCi0JCWN0cmxfc2NhbGUgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfU2NhbGUsIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHByb2plY3QgY2hhcmFjdGVyaXN0aWNzCi0JCWN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3MgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJdG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyByaXNrIGxldmVsCi0JCWN0cmxfcmlza19sZXZlbCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1Jpc2tMZXZlbCwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBFc3RpbWF0aW5nIHRlY2huaXF1ZQotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0VzdGltYXRpbmdUZWNobmlxdWUsIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgCi0KLQkJLy8gUHJvamVjdCBNZW1iZXIgZXhwZXJ0aXNlCi0JCWN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCXRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfUHJvamVjdE1lbWJlckV4cGVydGlzZSwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gVHlwZSBvZiBjb250cmFjdAotCQljdHJsX3R5cGVfb2ZfY29udHJhY3QgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJdG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19UeXBlT2ZDb250cmFjdCwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCX0KLQotCS8qKgotCSAqIExvYWRzIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByb2Nlc3NEZXNjcmlwdGlvbiNsb2FkRGF0YSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXN1cGVyLmxvYWREYXRhKCk7Ci0KLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBjb250ZW50ID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pIGRlbGl2ZXJ5UHJvY2VzcwotCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJU3RyaW5nIHNjYWxlID0gY29udGVudC5nZXRTY2FsZSgpOwotCQlTdHJpbmcgcHJvamVjdENoYXIgPSBjb250ZW50LmdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQkJU3RyaW5nIGVzdGltYXRpbmdUZWNobmlxdWUgPSBjb250ZW50LmdldEVzdGltYXRpbmdUZWNobmlxdWUoKTsKLQkJU3RyaW5nIHJpc2tMZXZlbCA9IGNvbnRlbnQuZ2V0Umlza0xldmVsKCk7Ci0JCVN0cmluZyBwcm9qZWN0TWVtYmVyRXhwZXJ0aWVzZSA9IGNvbnRlbnQuZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCQlTdHJpbmcgdHlwZU9mQ29udHJhY3QgPSBjb250ZW50LmdldFR5cGVPZkNvbnRyYWN0KCk7Ci0KLQkJY3RybF9zY2FsZS5zZXRUZXh0KHNjYWxlID09IG51bGwgPyAiIiA6IHNjYWxlKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzCi0JCQkJLnNldFRleHQocHJvamVjdENoYXIgPT0gbnVsbCA/ICIiIDogcHJvamVjdENoYXIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzCi0JCQkJLnNldFRleHQoZXN0aW1hdGluZ1RlY2huaXF1ZSA9PSBudWxsID8gIiIgOiBlc3RpbWF0aW5nVGVjaG5pcXVlKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3Jpc2tfbGV2ZWwuc2V0VGV4dChyaXNrTGV2ZWwgPT0gbnVsbCA/ICIiIDogcmlza0xldmVsKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZQotCQkJCS5zZXRUZXh0KHByb2plY3RNZW1iZXJFeHBlcnRpZXNlID09IG51bGwgPyAiIiA6IHByb2plY3RNZW1iZXJFeHBlcnRpZXNlKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3R5cGVfb2ZfY29udHJhY3QKLQkJCQkuc2V0VGV4dCh0eXBlT2ZDb250cmFjdCA9PSBudWxsID8gIiIgOiB0eXBlT2ZDb250cmFjdCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByb2Nlc3NEZXNjcmlwdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSk7Ci0JCWZpbmFsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCWZpbmFsIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gY29udGVudCA9IChvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKSBkZWxpdmVyeVByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0KLQkJY3RybF9zY2FsZS5zZXRNb2RhbE9iamVjdChkZWxpdmVyeVByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3NjYWxlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpKTsKLQkJY3RybF9zY2FsZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3NjYWxlLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9zY2FsZTsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRTY2FsZSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZGVsaXZlcnlQcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpLCBuZXdDb250ZW50LAotCQkJCQkJCS0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3Muc2V0TW9kYWxPYmplY3QoZGVsaXZlcnlQcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9wcm9qZWN0X2NoYXJhY3RlcmlzdGljcy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpKTsKLQkJY3RybF9wcm9qZWN0X2NoYXJhY3RlcmlzdGljcy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCW5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQkJOiBjdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzOwotCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkJCS5tdXN0UmVzdG9yZVZhbHVlKGNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQlkZWxpdmVyeVByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSwKLQkJCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF9yaXNrX2xldmVsLnNldE1vZGFsT2JqZWN0KGRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfcmlza19sZXZlbC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCkpOwotCQljdHJsX3Jpc2tfbGV2ZWwuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9yaXNrX2xldmVsLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9yaXNrX2xldmVsOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldFJpc2tMZXZlbCgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZGVsaXZlcnlQcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcy5zZXRNb2RhbE9iamVjdChkZWxpdmVyeVByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpKTsKLQkJY3RybF9lc3RpbWF0aW5nX3RlY2huaXF1ZXMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9lc3RpbWF0aW5nX3RlY2huaXF1ZXMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlczsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQlkZWxpdmVyeVByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpLAotCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2Uuc2V0TW9kYWxPYmplY3QoZGVsaXZlcnlQcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2UKLQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpKTsKLQkJY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2UuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2UuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQk6IGN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlOwotCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkJCS5tdXN0UmVzdG9yZVZhbHVlKGNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQlkZWxpdmVyeVByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKSwKLQkJCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF90eXBlX29mX2NvbnRyYWN0LnNldE1vZGFsT2JqZWN0KGRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfdHlwZV9vZl9jb250cmFjdC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKSk7Ci0JCWN0cmxfdHlwZV9vZl9jb250cmFjdC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3R5cGVfb2ZfY29udHJhY3QuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3R5cGVfb2ZfY29udHJhY3Q7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGRlbGl2ZXJ5UHJvY2VzcwotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Rlc2NyaXB0aW9uI3JlZnJlc2goYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJc3VwZXIucmVmcmVzaChlZGl0YWJsZSk7Ci0JCWN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9wcm9qZWN0X2NoYXJhY3RlcmlzdGljcy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9yaXNrX2xldmVsLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9zY2FsZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfdHlwZV9vZl9jb250cmFjdC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVzY3JpcHRpb25Gb3JtUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rlc2NyaXB0aW9uRm9ybVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWQ0OTQwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVzY3JpcHRpb25Gb3JtUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ2hhbmdlSGlzdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLlJlbmFtZUZpbGVDb25mbGljdERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuRWRpdG9yc0NvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuQ29udmVydEd1aWRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5EZWNvcmF0ZWRGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5EYXRlRm9ybWF0OwotCi0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBEZXNjcmlwdGlvbiBwYWdlcyBpbiB0aGUgTWV0aG9kIGVkaXRvcnMuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzYzODIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlc2NyaXB0aW9uRm9ybVBhZ2UgZXh0ZW5kcyBCYXNlRm9ybVBhZ2UgaW1wbGVtZW50cyBJUmVmcmVzaGFibGUgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0FQUExJQ0FCTEVfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5vdEFwcGxpY2FibGVfdGV4dDsgCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJJQlVURVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbnRyaWJ1dGVzX3RleHQ7IAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9DT05UUklCVVRFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubG9jYWxDb250cmlidXRlc190ZXh0OyAgCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTkRTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRzX3RleHQ7IAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTEFDRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcGxhY2VzX3RleHQ7IAotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX1JFUExBQ0VTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5sb2NhbFJlcGxhY2VzX3RleHQ7IAotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVORFNfUkVQTEFDRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4dGVuZHNSZXBsYWNlc190ZXh0OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpOwotCi0JLy8gQ29tcG9zaXRlcyBhbmQgc2VjdGlvbnMuCi0JcHJvdGVjdGVkIFNlY3Rpb24gZm9ybVNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGV4cGFuZGVkQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gZ2VuZXJhbFNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiB2YXJpYWJpbGl0eVNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGdlbmVyYWxDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHZhcmlhYmlsaXR5Q29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gdmVyc2lvblNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHZlcnNpb25Db21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBpY29uU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgaWNvbkNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQ2FudmFzIHBhbmUxOwotCi0JcHJpdmF0ZSBDYW52YXMgcGFuZTM7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBkZXRhaWxTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBkZXRhaWxDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBub3RhdGlvblNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIG5vdGF0aW9uQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gdGFpbG9yaW5nU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgdGFpbG9yaW5nQ29tcG9zaXRlOwotCi0JLy8gRWRpdCBjb250cm9scy4KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX25hbWU7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lOwotCi0JcHJvdGVjdGVkIExhYmVsIGN0cmxfdHlwZV9sYWJlbDsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF90eXBlX2J1dHRvbjsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfYnJpZWZfZGVzYzsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgY3RybF9mdWxsX2Rlc2M7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGN0cmxfa2V5OwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2V4cGFuZGVkOwotCi0JcHJvdGVjdGVkIENvbWJvVmlld2VyIHZpZXdlcl92YXJpYWJpbGl0eTsKLQotCXByb3RlY3RlZCBDb21ibyBjdHJsX3ZhcmlhYmlsaXR5OwotCi0JcHJvdGVjdGVkIExhYmVsIGxhYmVsX2Jhc2U7Ci0KLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgYmFzZV92aWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgVGFibGUgY3RybF9iYXNlOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX2Jhc2VfYnV0dG9uOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgYWN0aXZlQ29udHJvbDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2F1dGhvcnM7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9jaGFuZ2VfZGF0ZTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2NoYW5nZV9kZXNjOwotCi0JcHJpdmF0ZSBCdXR0b24gdmlld19oaXN0b3J5X2J1dHRvbjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX3ZlcnNpb247Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgbGFiZWxfY29weXJpZ2h0OwotCi0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIGNvcHlyaWdodF92aWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgVGFibGUgY3RybF9jb3B5cmlnaHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb3B5cmlnaHRfYnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY29weXJpZ2h0X2J1dHRvbl9kZXNlbGVjdDsKLQotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBleHBhbmREZXRhaWxMaW5rOwotCi0JcHJvdGVjdGVkIExhYmVsIGV4cGFuZERldGFpbExhYmVsOwotCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGV4cGFuZE5vdGF0aW9uTGluazsKLQotCXByb3RlY3RlZCBMYWJlbCBleHBhbmROb3RhdGlvbkxhYmVsOwotCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGV4cGFuZFRhaWxvcmluZ0xpbms7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgZXhwYW5kVGFpbG9yaW5nTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGN0cmxfcHVycG9zZTsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfZXh0ZXJuYWxfaWQ7Ci0KLQlwcml2YXRlIEltYWdlIHNoYXBlSW1hZ2U7Ci0KLQlwcml2YXRlIEltYWdlIG5vZGVJbWFnZTsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9zZWxlY3Rfc2hhcGVJY29uX2J1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX3NlbGVjdF9ub2RlSWNvbl9idXR0b247Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uOwotCQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9wdWJsaXNoX2NhdGVnb3JpZXNfYnV0dG9uOwotCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGV4cGFuZFZlcnNpb25MaW5rOwotCi0JcHJvdGVjdGVkIExhYmVsIGV4cGFuZFZlcnNpb25MYWJlbDsKLQotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBleHBhbmRMaW5rOwotCi0JcHJvdGVjdGVkIERlY29yYXRlZEZpZWxkIGV4cGFuZExhYmVsOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFzdENoYW5nZUhpc3RvcnkgPSAiIjsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXJWYXJpYWJpbGl0eTsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXJCYXNlOwotCQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyVmFyaWFiaWxpdHkgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgdmFyT2JqZWN0ID0gKFZhcmlhYmlsaXR5VHlwZSkgb2JqZWN0OwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuTkFfTElURVJBTCkKLQkJCQlyZXR1cm4gTk9UX0FQUExJQ0FCTEVfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwpCi0JCQkJcmV0dXJuIENPTlRSSUJVVEVTX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCkKLQkJCQlyZXR1cm4gTE9DQUxfQ09OVFJJQlVURVNfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkKLQkJCQlyZXR1cm4gRVhURU5EU19URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCkKLQkJCQlyZXR1cm4gUkVQTEFDRVNfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UX0xJVEVSQUwpCi0JCQkJcmV0dXJuIExPQ0FMX1JFUExBQ0VTX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX1JFUExBQ0VTX0xJVEVSQUwpCi0JCQkJcmV0dXJuIEVYVEVORFNfUkVQTEFDRVNfVEVYVDsKLQkJCQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXJCYXNlID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb3B5cmlnaHRDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGNvcHlyaWdodExhYmVsUHJvdmlkZXJCYXNlID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgbW9kZWxNb2RpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBjb250ZW50TW9kaWZ5TGlzdGVuZXI7Ci0KLQkvLyBFZGl0aW5nIGFuZCBkaXNwbGF5IGZsYWdzLgotCXByb3RlY3RlZCBib29sZWFuIGRlc2NFeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmFsU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGRldGFpbFNlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub3RhdGlvblNlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0YWlsb3JpbmdTZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmVyc2lvblNlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbGVtZW50U2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGljb25TZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZnVsbERlc2NPbiA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBrZXlDb25zaWRlcmF0aW9uT24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnJpZWZEZXNjT24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWxlbWVudFR5cGVPbiA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGVudEZpZWxkT24gPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHZlcnNpb25TZWN0aW9uT24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYW55QXR0cmlidXRlTW9kaWZpZWQgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGdlbmVyYWxTZWN0aW9uT24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm90YXRpb25TZWN0aW9uT24gPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGRldGFpbFNlY3Rpb25PbiA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0YWlsb3JpbmdTZWN0aW9uT24gPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHZhcmlhYmlsaXR5U2VjdGlvbk9uID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHB1cnBvc2VPbiA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXh0ZXJuYWxJZE9uID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpY29uU2VjdGlvbk9uID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaENhdGVnb3J5T24gPSBmYWxzZTsKLQotCS8vIGNvbW1lbnRlZCBiZWNhdXNlIHRoZXNlIHZhcmlhYmxlcyBhcmUgbm90IGluIHVzZQotCS8vIHByb3RlY3RlZCBTdHJpbmcgdmFyaWFiaWxpdHlUeXBlTm9uZSA9IE5PVF9BUFBMSUNBQkxFX1RFWFQ7Ci0JLy8gcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eVR5cGVDb250cmlidXRlcyA9IENPTlRSSUJVVEVTX1RFWFQ7Ci0JLy8gcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eVR5cGVFeHRlbmRzID0gRVhURU5EU19URVhUOwotCS8vIHByb3RlY3RlZCBTdHJpbmcgdmFyaWFiaWxpdHlUeXBlUmVwbGFjZXMgPSBSRVBMQUNFU19URVhUOwotCi0JLy8gSW50ZXJuYWwgSURzIGZvciB0aGUgc2VjdGlvbnMuCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgR0VORVJBTF9TRUNUSU9OX0lEID0gMTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFVEFJTF9TRUNUSU9OX0lEID0gMjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fU0VDVElPTl9JRCA9IDM7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBOT1RBVElPTl9TRUNUSU9OX0lEID0gNDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRBSUxPUklOR19TRUNUSU9OX0lEID0gNTsKLQotCXByaXZhdGUgaW50IHdhcm5pbmdDb3VudCA9IDE7Ci0KLQlwcml2YXRlIGludCBTRUNUSU9OUyA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgU0hBUEVJQ09OX1dJRFRIX01BWCA9IDMyOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IFNIQVBFSUNPTl9IRUlHSFRfTUFYID0gMzI7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTk9ERUlDT05fV0lEVEhfTUFYID0gMTY7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTk9ERUlDT05fSEVJR0hUX01BWCA9IDE2OwotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBib29sZWFuIGRpc3Bvc2VkOwotCi0JLy8gVG8gaGFuZGxlIHRoZSBpMTE4biBwcm9wZXJseSBhbmQgYXZvaWQgc3RyaW5nIGNvbmNhdGVuYXRpb24uCi0JcHVibGljIFN0cmluZyBnZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBTdHJpbmcgZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBTdHJpbmcgdGFpbG9yaW5nU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBTdHJpbmcgbm90YXRpb25TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIFN0cmluZyB2YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgU3RyaW5nIGljb25TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIFN0cmluZyB2ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHJpdmF0ZSBMYWJlbCBub2RlSWNvblBhdGg7Ci0KLQlwcml2YXRlIExhYmVsIHNoYXBlSWNvblBhdGg7Ci0JCi0JcHJpdmF0ZSBTdHJpbmdbXSBpbWFnZVR5cGVzID0gbmV3IFN0cmluZ1tdIHsgIiouZ2lmOyAqLmpwZzsgKi5wbmc7ICouaWNvOyAqLmJtcCIgfTsKLQlwcml2YXRlIFN0cmluZ1tdIGltYWdlTmFtZXMgPSBuZXcgU3RyaW5nW10geyAiSW1hZ2UiKyAiIChnaWYsIGpwZWcsIHBuZywgaWNvLCBibXApIiB9OwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQ29udGVudCBmaWx0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQ29udGVudCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlckJhc2UoKSB7Ci0JCWNvbnRlbnRQcm92aWRlckJhc2UgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlBcnJheUxpc3QgYmFzZV9zZWxlY3RlZF9saXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlmIChjb250ZW50RWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkKLQkJCQkJYmFzZV9zZWxlY3RlZF9saXN0LmFkZChjb250ZW50RWxlbWVudAotCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJCXJldHVybiBiYXNlX3NlbGVjdGVkX2xpc3QudG9BcnJheSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzKSkgewotCQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9OwotCQliYXNlX3ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyQmFzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGZvcm0gZWRpdG9yLgotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIGZvcm0gcGFnZS4KLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGZvcm0gcGFnZS4KLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRpb25Gb3JtUGFnZShGb3JtRWRpdG9yIGVkaXRvciwgU3RyaW5nIGlkLCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIoZWRpdG9yLCBpZCwgdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCi0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkJY29udGVudFByb3ZpZGVyVmFyaWFiaWxpdHkgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJTGlzdCB2YXJpYWJpbGl0eVR5cGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJdmFyaWFiaWxpdHlUeXBlc0xpc3QuYWRkKFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKTsKLQkJCQkJdmFyaWFiaWxpdHlUeXBlc0xpc3QKLQkJCQkJCQkuYWRkKFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMKTsKLQkJCQkJdmFyaWFiaWxpdHlUeXBlc0xpc3QuYWRkKFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKTsKLQkJCQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZXNMaXN0LnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQl9OwotCQl9IGVsc2UgewotCQkJY29udGVudFByb3ZpZGVyVmFyaWFiaWxpdHkgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJTGlzdCB2YXJpYWJpbGl0eVR5cGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJdmFyaWFiaWxpdHlUeXBlc0xpc3QuYWRkKFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKTsKLQkJCQkJdmFyaWFiaWxpdHlUeXBlc0xpc3QKLQkJCQkJCQkuYWRkKFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMKTsKLQkJCQkJdmFyaWFiaWxpdHlUeXBlc0xpc3QuYWRkKFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpOwotCQkJCQl2YXJpYWJpbGl0eVR5cGVzTGlzdC5hZGQoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpOwotCQkJCQl2YXJpYWJpbGl0eVR5cGVzTGlzdC5hZGQoVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfUkVQTEFDRVNfTElURVJBTCk7Ci0JCQkJCXJldHVybiB2YXJpYWJpbGl0eVR5cGVzTGlzdC50b0FycmF5KCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLmNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCQljcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCQlzZXRDb250ZXh0SGVscCgpOwotCQlzZXRGb3JtVGV4dFdpdGhWYXJpYWJsZUluZm8oKTsKLQkJbG9hZERhdGEoKTsKLQkJYWRkTGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpIHsKLQkJVUlIZWxwZXIuc2V0Rm9ybVRleHQoZm9ybSwgY29udGVudEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogQHNlZSBUbmdVdGlsI2dldExhYmVsIENvZGUgbW92ZWQgdG8gVG5nVXRpbC5nZXRMYWJlbChiZWxvdyBtb3JlIHNwZWNpZmljCi0JICogICAgICBtZXRob2QpcmV0dXJucyBsYWJlbCB3aXRoIHZhcmlhYmlsaXR5SW5mbwotCSAqICAgICAgPGNvZGU+VG5nVXRpbC5nZXRMYWJlbChWYXJpYWJpbGl0eUVsZW1lbnQgb2JqZWN0LCBTdHJpbmcgYWx0ZXJuYXRpdmVMYWJlbCwgYm9vbGVhbiBwcmVmZXJCYXNlKTwvY29kZT4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKFZhcmlhYmlsaXR5RWxlbWVudCBvYmplY3QsIFN0cmluZyBhbHRlcm5hdGl2ZUxhYmVsLAotCQkJYm9vbGVhbiBwcmVmZXJCYXNlKSB7Ci0JCVN0cmluZyBsYWJlbCA9IFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBhbHRlcm5hdGl2ZUxhYmVsKTsKLQkJaWYgKHByZWZlckJhc2UgJiYgb2JqZWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IG9iamVjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCVN0cmluZyB2YXJpYWJpbGl0eVR4dCA9IG51bGw7Ci0JCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCkgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCS5jb250cmlidXRlc190b190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUwpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCS5sb2NhbENvbnRyaWJ1dGVzX3RleHQ7IAkJCQotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpIHsJCQkJCQotCQkJCXZhcmlhYmlsaXR5VHh0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCS5leHRlbmRzX3RleHQ7Ci0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkucmVwbGFjZXNfdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UX0xJVEVSQUwpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkubG9jYWxSZXBsYWNlc190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFU19MSVRFUkFMKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCS5leHRlbmRzUmVwbGFjZXNfdGV4dDsgCi0JCQl9Ci0JCQlpZiAodmFyaWFiaWxpdHlUeHQgIT0gbnVsbCkgewotCQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKGxhYmVsKQotCQkJCQkJLmFwcGVuZCgiICgiKS5hcHBlbmQodmFyaWFiaWxpdHlUeHQpLmFwcGVuZCgiICciKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCS5hcHBlbmQoCi0JCQkJCQkJCVRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0Ci0JCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQkJCQkJCQlhbHRlcm5hdGl2ZUxhYmVsKSkuYXBwZW5kKCInIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlNZXRob2RQbHVnaW4gYmFzZVBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKG9iamVjdAotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCQkJaWYgKGJhc2VQbHVnaW4gIT0gbnVsbCkgewotCQkJCQlzdHJCdWYKLQkJCQkJCQkuYXBwZW5kKCIgaW4gJyIpLmFwcGVuZChiYXNlUGx1Z2luLmdldE5hbWUoKSkuYXBwZW5kKCInKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJbGFiZWwgPSBzdHJCdWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBlZGl0b3IgdGFiIGNvbnRlbnQKLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJY3JlYXRlRm9ybUNvbXBvc2l0ZXModG9vbGtpdCk7Ci0JCWxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKTsKLQkJLy8gQ3JlYXRlIHRoZSBHZW5lcmFsIHNlY3Rpb24uCi0JCWlmIChnZW5lcmFsU2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVHZW5lcmFsU2VjdGlvbih0b29sa2l0KTsKLQkJCVNFQ1RJT05TKys7Ci0JCX0KLQotCQkvLyBDcmVhdGUgdGhlIERldGFpbCBzZWN0aW9uLgotCQlpZiAoZGV0YWlsU2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVEZXRhaWxTZWN0aW9uKHRvb2xraXQpOwotCQkJU0VDVElPTlMrKzsKLQkJfQotCi0JCS8vIENyZWF0ZSB0aGUgTm90YXRpb24gc2VjdGlvbi4KLQkJaWYgKG5vdGF0aW9uU2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVOb3RhdGlvblNlY3Rpb24odG9vbGtpdCk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSBUYWlsb3JpbmcgU2VjdGlvbi4KLQkJaWYgKHRhaWxvcmluZ1NlY3Rpb25PbikgewotCQkJY3JlYXRlVGFpbG9yaW5nU2VjdGlvbih0b29sa2l0KTsKLQkJCVNFQ1RJT05TKys7Ci0JCX0KLQotCQkvLyBDcmVhdGUgdGhlIFZlcnNpb24gc2VjdGlvbi4KLQkJaWYgKHZlcnNpb25TZWN0aW9uT24pIHsKLQkJCWNyZWF0ZVZlcnNpb25TZWN0aW9uKHRvb2xraXQpOwotCQkJY3JlYXRlVmVyc2lvblNlY3Rpb25Db250ZW50KCk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0KLQkJaWYgKHZhcmlhYmlsaXR5U2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVWYXJpYWJpbGl0eVNlY3Rpb24odG9vbGtpdCk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0KLQkJLy8gSWNvbiBTZWN0aW9uCi0JCWlmIChpY29uU2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVJY29uU2VjdGlvbih0b29sa2l0KTsKLQkJCWNyZWF0ZUljb25TZWN0aW9uQ29udGVudCgpOwotCQkJU0VDVElPTlMrKzsKLQkJfQotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHZhcmlhYmlsaXR5Q29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZXhwYW5kZWRDb21wb3NpdGUpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihnZW5lcmFsQ29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodmVyc2lvbkNvbXBvc2l0ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvcm1Db21wb3NpdGVzKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBtYWluIHNlY3Rpb24gKHVzZWQgZm9yIHN3YXBwaW5nIGRpc3BsYXkgb2YKLQkJLy8gc2VjdGlvbkNvbXBvc2l0ZSBhbmQgZXhwYW5kZWRDb21wb3NpdGUpLgotCQlmb3JtU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwgU2VjdGlvbi5OT19USVRMRSk7Ci0JCXsKLQkJCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCQlmb3JtU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJCWZvcm1TZWN0aW9uLnNldExheW91dChuZXcgVGFibGVXcmFwTGF5b3V0KCkpOwotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgZm9yIHRoZSBzZWN0aW9ucy4KLQkJc2VjdGlvbkNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZvcm1TZWN0aW9uLCBTV1QuTk9ORSk7Ci0JCXNlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQlzZWN0aW9uQ29tcG9zaXRlLnNldExheW91dChuZXcgVGFibGVXcmFwTGF5b3V0KCkpOwotCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoc2VjdGlvbkNvbXBvc2l0ZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgZm9yIHRoZSBSaWNoVGV4dEVkaXRvci4KLQkJZXhwYW5kZWRDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtU2VjdGlvbiwgU1dULk5PTkUpOwotCQl7Ci0JCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0KLQkJLy8gQWRkIHRoZSBleHBhbmQvY29sbGFwc2UgaHlwZXJsaW5rIGltYWdlLgotCQlleHBhbmRMaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhleHBhbmRlZENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlleHBhbmRMaW5rLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCk7Ci0JCWV4cGFuZExpbmsuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xvc2VSVEUpOwotCQlleHBhbmRMaW5rLnNldFVuZGVybGluZWQoZmFsc2UpOwotCQlleHBhbmRMaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdG9nZ2xlKGUpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgdGhlIGV4cGFuZC9jb2xsYXBzZSBoeXBlcmxpbmsgdGV4dC4KLQkJZXhwYW5kTGFiZWwgPSBjcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBleHBhbmRlZENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgR2VuZXJhbCBzZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJZ2VuZXJhbFNlY3Rpb24gPSBjcmVhdGVTZWN0aW9uKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkdFTkVSQUxfSU5GT19TRUNUSU9OX05BTUUsCi0JCQkJZ2V0R2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBnZW5lcmFsU2VjdGlvbik7Ci0JCSgoR3JpZExheW91dCkgZ2VuZXJhbENvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDQ7Ci0JCWNyZWF0ZUdlbmVyYWxTZWN0aW9uQ29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEdlbmVyYWwgc2VjdGlvbiBjb250ZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbkNvbnRlbnQoKSB7Ci0JCS8vIEFkZCB0aGUgTmFtZSBsYWJlbCBhbmQgdGV4dCBjb250cm9sLgotCQljdHJsX25hbWUgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDModG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuTkFNRV9URVhULCBTV1QuREVGQVVMVCwgU1dULlNJTkdMRSk7Ci0KLQkJLy8gQWRkIHRoZSBQcmVzZW50YXRpb24gbmFtZSBsYWJlbCBhbmQgdGV4dCBjb250cm9sLgotCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwzKHRvb2xraXQsCi0JCQkJZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlBSRVNFTlRBVElPTl9OQU1FX1RFWFQsCi0JCQkJU1dULkRFRkFVTFQsIFNXVC5TSU5HTEUpOwotCi0JCWlmIChlbGVtZW50VHlwZU9uKSB7Ci0JCQljcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuVFlQRV9URVhULCAyKTsKLQkJCWN0cmxfdHlwZV9sYWJlbCA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJCWN0cmxfdHlwZV9sYWJlbC5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0U3lzdGVtQ29sb3IoMTkpKTsKLQkJCQljdHJsX3R5cGVfbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQl9Ci0JCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCWN0cmxfdHlwZV9idXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihnZW5lcmFsQ29tcG9zaXRlLAotCQkJCQkJQXV0aG9yaW5nVUlUZXh0LkNIQU5HRV9UWVBFX0JVVFRPTl9URVhULCBTV1QuUFVTSCk7Ci0JCQkJewotCQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQkJCWN0cmxfdHlwZV9idXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkJfQotCQkJCWlmIChDb252ZXJ0R3VpZGFuY2VUeXBlCi0JCQkJCQkuZ2V0VmFsaWROZXdHdWlkYW5jZVR5cGVzKChHdWlkYW5jZSkgY29udGVudEVsZW1lbnQpID09IG51bGwpIHsKLQkJCQkJY3RybF90eXBlX2J1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZXh0ZXJuYWxJZE9uKSB7Ci0JCQljdHJsX2V4dGVybmFsX2lkID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwzKHRvb2xraXQsCi0JCQkJCWdlbmVyYWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5VTklRVUVfSURfVEVYVCwKLQkJCQkJU1dULkRFRkFVTFQsIFNXVC5TSU5HTEUpOwotCQl9Ci0KLQkJaWYgKGJyaWVmRGVzY09uKSB7Ci0JCQljdHJsX2JyaWVmX2Rlc2MgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDModG9vbGtpdCwKLQkJCQkJZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQsCi0JCQkJCTQwLCBTV1QuTVVMVEkgfCBTV1QuVFJBVkVSU0VfVEFCX05FWFQpOwotCQl9CQkKLQotCQlpZiAocHVibGlzaENhdGVnb3J5T24pIHsKLQkJCWN0cmxfcHVibGlzaF9jYXRlZ29yaWVzX2J1dHRvbiA9IHRvb2xraXQKLQkJCS5jcmVhdGVCdXR0b24oCi0JCQkJCWdlbmVyYWxDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5QVUJMSVNIX0NBVEVHT1JJRVNfVEVYVCwgU1dULkNIRUNLKTsgCi0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWN0cmxfcHVibGlzaF9jYXRlZ29yaWVzX2J1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgQ29udGVudCBWYXJpYWJpbGl0eSBzZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVZhcmlhYmlsaXR5U2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXZhcmlhYmlsaXR5U2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuVkFSSUFCSUxJVFlfU0VDVElPTl9OQU1FLAotCQkJCWdldFZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQkKLQkJdmFyaWFiaWxpdHlDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZSh2YXJpYWJpbGl0eVNlY3Rpb24pOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5CRUdJTk5JTkcgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDI0OwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJdmFyaWFiaWxpdHlDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJdmFyaWFiaWxpdHlDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDUsIGZhbHNlKSk7Ci0JCXZhcmlhYmlsaXR5U2VjdGlvbi5zZXRDbGllbnQodmFyaWFiaWxpdHlDb21wb3NpdGUpOwotCi0JCWN0cmxfdmFyaWFiaWxpdHkgPSBjcmVhdGVDb21ib1dpdGhMYWJlbDModG9vbGtpdCwgdmFyaWFiaWxpdHlDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlZBUklBQklMSVRZX1RZUEVfVEVYVCk7Ci0KLQkJdmlld2VyX3ZhcmlhYmlsaXR5ID0gbmV3IENvbWJvVmlld2VyKGN0cmxfdmFyaWFiaWxpdHkpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5CRUdJTk5JTkcgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDI0OwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJdmlld2VyX3ZhcmlhYmlsaXR5LmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJWYXJpYWJpbGl0eSk7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJWYXJpYWJpbGl0eSk7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRJbnB1dChjb250ZW50RWxlbWVudCk7Ci0KLQkJdG9vbGtpdC5jcmVhdGVMYWJlbCh2YXJpYWJpbGl0eUNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vU3RyaW5nIGJhc2VFbGVtZW50ID0gTGlicmFyeVVJVGV4dC5nZXRVSVRleHRMb3dlcihtZXRob2RFbGVtZW50KTsKLQkJbGFiZWxfYmFzZSA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsIHZhcmlhYmlsaXR5Q29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CQVNFX0VMRU1FTlRfVEVYVCwgMik7Ci0JCWN0cmxfYmFzZSA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHZhcmlhYmlsaXR5Q29tcG9zaXRlLCBTV1QuU0lOR0xFCi0JCQkJfCBTV1QuUkVBRF9PTkxZLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5CRUdJTk5JTkcsIDUsIDMwMCwgMSwgMik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMjQ7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQljdHJsX2Jhc2Uuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQliYXNlX3ZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX2Jhc2UpOwotCQlpbml0Q29udGVudFByb3ZpZGVyQmFzZSgpOwotCQliYXNlX3ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJCYXNlKTsKLQkJYmFzZV92aWV3ZXIuc2V0SW5wdXQoY29udGVudEVsZW1lbnQpOwotCi0JCUNvbXBvc2l0ZSBiYXNlQnV0dG9uUGFuZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCB2YXJpYWJpbGl0eUNvbXBvc2l0ZSwgCi0JCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HLCAxLCAxLCAxKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJCWJhc2VCdXR0b25QYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWN0cmxfYmFzZV9idXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihiYXNlQnV0dG9uUGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuU0VMRUNUX0JVVFRPTl9URVhULCBTV1QuU0lNUExFKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDEwMDsKLQkJCWN0cmxfYmFzZV9idXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBTZXQgZm9jdXMgb24gdGhlIE5hbWUgdGV4dCBjb250cm9sLgotCQlEaXNwbGF5IGRpc3BsYXkgPSBmb3JtLmdldEJvZHkoKS5nZXREaXNwbGF5KCk7Ci0JCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmKGN0cmxfbmFtZS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJCi0JCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gY29udGVudEVsZW1lbnQKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24uZ2V0Q2hhbmdlRGF0ZSgpID09IG51bGwpCi0JCQkJCQljdHJsX25hbWUuc2V0U2VsZWN0aW9uKDAsIGN0cmxfbmFtZS5nZXRUZXh0KCkubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCi0JCWlmIChicmllZkRlc2NPbikgewotCQkJY3RybF9icmllZl9kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAocHVycG9zZU9uKSB7Ci0JCQljdHJsX3B1cnBvc2Uuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChmdWxsRGVzY09uKSB7Ci0JCQljdHJsX2Z1bGxfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKGtleUNvbnNpZGVyYXRpb25PbikgewotCQkJY3RybF9rZXkuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChleHRlcm5hbElkT24pIHsKLQkJCWN0cmxfZXh0ZXJuYWxfaWQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChlbGVtZW50VHlwZU9uKSB7Ci0JCQljdHJsX3R5cGVfYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQl9Ci0JCWlmICh2YXJpYWJpbGl0eVNlY3Rpb25PbikgewotCQkJY3RybF92YXJpYWJpbGl0eS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCWN0cmxfYmFzZV9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQlpZiAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3ZhcmlhYmlsaXR5LmdldFNlbGVjdGlvbigpKQotCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkgPT0gVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUwpIHsKLQkJCQljdHJsX2Jhc2VfYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWlmICh2ZXJzaW9uU2VjdGlvbk9uKSB7Ci0JCQljdHJsX2NoYW5nZV9kYXRlLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCWN0cmxfY2hhbmdlX2Rlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJY3RybF9hdXRob3JzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWN0cmxfdmVyc2lvbi5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQljb3B5cmlnaHRfYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJc2V0Q29weXJpZ2h0QnV0dG9uRGVzZWxlY3QoKTsKLQkJfQotCQlpZiAoaWNvblNlY3Rpb25PbikgewotCQkJY3RybF9zZWxlY3Rfc2hhcGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCWN0cmxfY2xlYXJfc2hhcGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlCi0JCQkJCSYmIGNvbnRlbnRFbGVtZW50LmdldFNoYXBlaWNvbigpICE9IG51bGwpOwotCQkJY3RybF9zZWxlY3Rfbm9kZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJY3RybF9jbGVhcl9ub2RlSWNvbl9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZQotCQkJCQkmJiBjb250ZW50RWxlbWVudC5nZXROb2RlaWNvbigpICE9IG51bGwpOwotCQl9Ci0JCWlmIChjdHJsX2V4cGFuZGVkICE9IG51bGwpIHsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBEZXRhaWwgc2VjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXRhaWxTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJZGV0YWlsU2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVUQUlMX1NFQ1RJT05fTkFNRSwKLQkJCQlnZXREZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCWRldGFpbENvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBkZXRhaWxTZWN0aW9uKTsKLQkJY3JlYXRlRGV0YWlsU2VjdGlvbkNvbnRlbnQoKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZGV0YWlsQ29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBEZXRhaWwgc2VjdGlvbiBjb250ZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVEZXRhaWxTZWN0aW9uQ29udGVudCgpIHsKLQkJaWYgKHB1cnBvc2VPbikgewotCQkJY3RybF9wdXJwb3NlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlBVUlBPU0VfVEVYVCwgNDAsIDQwMCwKLQkJCQkJREVUQUlMX1NFQ1RJT05fSUQpOwotCQl9Ci0KLQkJaWYgKGZ1bGxEZXNjT24pIHsKLQkJCWN0cmxfZnVsbF9kZXNjID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0Lk1BSU5fREVTQ1JJUFRJT05fVEVYVCwKLQkJCQkJMTAwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsKLQotCQl9Ci0KLQkJaWYgKGtleUNvbnNpZGVyYXRpb25PbikgewotCQkJY3RybF9rZXkgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuS0VZX0NPTlNJREVSQVRJT05TX1RFWFQsCi0JCQkJCTQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIE5vdGF0aW9uIHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTm90YXRpb25TZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJbm90YXRpb25TZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5OT1RBVElPTl9TRUNUSU9OX05BTUUsCi0JCQkJZ2V0Tm90YXRpb25TZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCW5vdGF0aW9uQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIG5vdGF0aW9uU2VjdGlvbik7Ci0JCWNyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3Iobm90YXRpb25Db21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIE5vdGF0aW9uIHNlY3Rpb24gY29udGVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVOb3RhdGlvblNlY3Rpb25Db250ZW50KCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhaWxvcmluZyBzZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhaWxvcmluZ1NlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQl0YWlsb3JpbmdTZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5UQUlMT1JJTkdfU0VDVElPTl9OQU1FLAotCQkJCWdldFRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJdGFpbG9yaW5nQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHRhaWxvcmluZ1NlY3Rpb24pOwotCQljcmVhdGVUYWlsb3JpbmdTZWN0aW9uQ29udGVudCgpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcih0YWlsb3JpbmdDb21wb3NpdGUpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFpbG9yaW5nU2VjdGlvbkNvbnRlbnQoKSB7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycyB0byBtb25pdG9yIGZvY3VzIGFuZCBtb2RpZmljYXRpb24gY2hhbmdlcyBpbiB0aGUgZWRpdAotCSAqIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkJbW9kZWxNb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihjb250ZW50RWxlbWVudCk7Ci0JCWNvbnRlbnRNb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihjb250ZW50RWxlbWVudAotCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWFjdGlvbk1nciA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0KLQkJZm9ybS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJCQkoKEdyaWREYXRhKSBjdHJsX2V4cGFuZGVkLmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IGdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCk7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCk7Ci0JCQkJfQotCQkJCWZvcm1TZWN0aW9uLmxheW91dCh0cnVlLCB0cnVlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWZvcm0uZ2V0UGFyZW50KCkuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmKGRpc3Bvc2VkKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJcmVmcmVzaCghVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpOwotCQkJCXNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQkJCQotCQkJCS8vIGRvIHJlZnJlc2ggdmFyaWFiaWxpdHkgYW5kIGNvcHlyaWdodCB2aWV3ZXIKLQkJCQlpZih2YXJpYWJpbGl0eVNlY3Rpb25PbikKLQkJCQkJYmFzZV92aWV3ZXIucmVmcmVzaCgpOwotCQkJCWlmKHZlcnNpb25TZWN0aW9uT24pCi0JCQkJCWNvcHlyaWdodF92aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCQlpZiAoZ2VuZXJhbFNlY3Rpb25PbikgewotCQkJYWRkR2VuZXJhbFNlY3Rpb25MaXN0ZW5lcnMoKTsKLQkJfQotCi0JCWlmIChkZXRhaWxTZWN0aW9uT24pIHsKLQkJCWFkZERldGFpbFNlY3Rpb25MaXN0ZW5lcnMoKTsKLQkJfQotCi0JCWlmICh2ZXJzaW9uU2VjdGlvbk9uKSB7Ci0JCQlhZGRWZXJzaW9uU2VjdGlvbkxpc3RlbmVycygpOwotCQl9Ci0KLQkJaWYgKGljb25TZWN0aW9uT24pIHsKLQkJCWFkZEljb25TZWN0aW9uTGlzdGVuZXJzKCk7Ci0JCX0KLQotCQl2aWV3ZXJfdmFyaWFiaWxpdHkKLQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfdmFyaWFiaWxpdHkKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCi0JCQkJCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IGVkaXRvcgotCQkJCQkJCQkJLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCksCi0JCQkJCQkJCQkJCShWYXJpYWJpbGl0eVR5cGUpIHNlbGVjdGlvbgotCQkJCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSwgLTEpOwotCQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpID09IFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKSB7Ci0JCQkJCQkJaWYgKGNvbnRlbnRFbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gZWRpdG9yCi0JCQkJCQkJCQkJLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksCi0JCQkJCQkJCQkJCQludWxsLCAtMSk7Ci0JCQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY3RybF9iYXNlX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCQliYXNlX3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUxpc3Qgc2VsZWN0aW9uQmFzZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBjb250ZW50RWxlbWVudAotCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJCQlzZWxlY3Rpb25CYXNlTGlzdC5hZGQoYmFzZSk7Ci0JCQkJCQkJY3RybF9iYXNlX2J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCWJhc2Vfdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCX0KLQkJCQkJCXNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF9iYXNlX2J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKLQkJCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGdldENvbnRlbnRFbGVtZW50KCksCi0JCQkJCQkJTGlicmFyeVVJVGV4dC5nZXRVSVRleHQoY29udGVudEVsZW1lbnQsIHRydWUpKTsKLQkJCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJZmQuc2V0VGl0bGUoTGlicmFyeVVJVGV4dC5nZXRVSVRleHQoY29udGVudEVsZW1lbnQsIHRydWUpKTsKLQkJCQkJZmQub3BlbigpOwotCQkJCQlmZC5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0JCQkJCWlmIChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkuc2l6ZSgpID4gMCkgewotCQkJCQkJSVN0YXR1cyBpc3RhdHVzID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbigKLQkJCQkJCQkJY29udGVudEVsZW1lbnQsIChWYXJpYWJpbGl0eUVsZW1lbnQpIGZkLmdldFNlbGVjdGVkSXRlbXMoKS5nZXQoMCkpOwotCQkJCQkJaWYoIWlzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgaXN0YXR1cy5nZXRNZXNzYWdlKCkpOwkJCQkJCQotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gZWRpdG9yCi0JCQkJCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksCi0JCQkJCQkJCQkJKFZhcmlhYmlsaXR5RWxlbWVudCkgZmQKLQkJCQkJCQkJCQkJCS5nZXRTZWxlY3RlZEl0ZW1zKCkuZ2V0KDApLCAtMSk7Ci0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCXN0YXR1cyA9IGVkaXRvcgotCQkJCQkJCQkuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCksCi0JCQkJCQkJCQkJKFZhcmlhYmlsaXR5VHlwZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3ZhcmlhYmlsaXR5Ci0JCQkJCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCksIC0xKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlzZXRGb3JtVGV4dFdpdGhWYXJpYWJsZUluZm8oKTsKLQkJCQlpZiAoKGN0cmxfYmFzZSAhPSBudWxsKSAmJiAoIShjdHJsX2Jhc2UuaXNEaXNwb3NlZCgpKSkpCi0JCQkJCWN0cmxfYmFzZS5yZWRyYXcoKTsKLQkJCQlpZiAoKGJhc2Vfdmlld2VyICE9IG51bGwpCi0JCQkJCQkmJiAoIShiYXNlX3ZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSkpCi0JCQkJCWJhc2Vfdmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEdlbmVyYWxTZWN0aW9uTGlzdGVuZXJzKCkgewotCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBjdHJsX25hbWUuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBjb250ZW50RWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKGNvbnRlbnRFbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJCXJldHVybjsKLQkJCQkKLQkJCQkvLyAxNzg0NjIKLQkJCQlTdHJpbmcgbXNnID0gbnVsbDsKLQkJCQlpZiAobmFtZS5pbmRleE9mKCImIikgPiAtMSkgewotCQkJCQltc2cgPSBOTFMuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjRfbXNnLAotCQkJCQkJCW5hbWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlTmFtZVZhbGlkYXRvcigKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQkJbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQobmFtZSk7Ci0JCQkJfQotCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQluYW1lID0gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShjdHJsX25hbWUuZ2V0VGV4dCgpKTsKLQkJCQkJaWYgKCFuYW1lLmVxdWFscyhjb250ZW50RWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwgY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCQkJCW5hbWUsIC0xKTsKLQkJCQkJCWlmICghc3VjY2VzcykgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0JCQkJCQkJCS5oYXNQcmVzZW50YXRpb24oY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQkJUmVzb3VyY2UgY29udGVudFJlc291cmNlID0gY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKTsKLQkJCQkJCQlpZiAoY29udGVudFJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJCQkuYWRkUmVzb3VyY2VUb0FkanVzdExvY2F0aW9uKGNvbnRlbnRSZXNvdXJjZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJc2V0Rm9ybVRleHRXaXRoVmFyaWFibGVJbmZvKCk7Ci0JCQkJCQljdHJsX25hbWUuc2V0VGV4dChuYW1lKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVFcnJvcl90aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJbXNnKTsKLQkJCQkJY3RybF9uYW1lLnNldFRleHQoY29udGVudEVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCQkJY3RybF9uYW1lLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCQkJCWN0cmxfbmFtZS5zZWxlY3RBbGwoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbC5nZXRQbGFpblRleHQoY3RybF9wcmVzZW50YXRpb25fbmFtZQotCQkJCQkJLmdldFRleHQoKSk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcykgewotCQkJCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyI2ZvY3VzR2FpbmVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQkJfQotCQl9KTsKLQotCQlpZiAoYnJpZWZEZXNjT24pIHsKLQkJCWN0cmxfYnJpZWZfZGVzYy5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCWN0cmxfYnJpZWZfZGVzYy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJCQl9Ci0KLQkJCQkvKiAobm9uLUphdmFkb2MpCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlciNmb2N1c0xvc3Qob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50KQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50RWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9icmllZl9kZXNjLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJaWYgKGVsZW1lbnRUeXBlT24pIHsKLQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJY3RybF90eXBlX2J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJCQkJCWlmIChlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcodGl0bGUsIG1lc3NhZ2UpOwotCQkJCQkJfSBlbHNlIGlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbigpOwotCQkJCQkJCWRlbGV0ZUFjdGlvbi5zZXRFZGl0aW5nRG9tYWluKExpYnJhcnlWaWV3LmdldFZpZXcoKQotCQkJCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKSk7Ci0JCQkJCQkJZGVsZXRlQWN0aW9uCi0JCQkJCQkJCQkuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQpKTsKLQkJCQkJCQlDb21tYW5kIGNtZCA9IGRlbGV0ZUFjdGlvbgotCQkJCQkJCQkJLmNyZWF0ZUNvbW1hbmQoQ29sbGVjdGlvbnMKLQkJCQkJCQkJCQkJLnNpbmdsZXRvbihjb250ZW50RWxlbWVudCkpOwotCQkJCQkJCWlmIChjbWQgaW5zdGFuY2VvZiBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCkgewotCQkJCQkJCQlHdWlkYW5jZSBuZXdHdWlkYW5jZTsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCW5ld0d1aWRhbmNlID0gQ29udmVydEd1aWRhbmNlVHlwZQotCQkJCQkJCQkJCS5jb252ZXJ0R3VpZGFuY2UoCi0JCQkJCQkJCQkJCQkoR3VpZGFuY2UpIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJCQkJbnVsbCwKLQkJCQkJCQkJCQkJCShEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCkgY21kKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJCXRyeSB7IGNtZC5kaXNwb3NlKCk7IH0gY2F0Y2goRXhjZXB0aW9uIGUpIHt9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKG5ld0d1aWRhbmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5jbG9zZUVkaXRvcigKLQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQpOwotCQkJCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IoCi0JCQkJCQkJCQkJCW5ld0d1aWRhbmNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAoZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX3RpdGxlOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlXYXJuaW5nKHRpdGxlLCBtZXNzYWdlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JCQotCQlpZiAocHVibGlzaENhdGVnb3J5T24pCXsKLQkJCWN0cmxfcHVibGlzaF9jYXRlZ29yaWVzX2J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsJCQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CQkJCQotCQkJCQlTdHJpbmcgdmFsID0gbmV3IEJvb2xlYW4oY3RybF9wdWJsaXNoX2NhdGVnb3JpZXNfYnV0dG9uLmdldFNlbGVjdGlvbigpKS50b1N0cmluZygpOwkJCQkKLQkJCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBUbmdVdGlsLmdldFB1Ymxpc2hDYXRlZ29yeVByb3BlcnR5KGNvbnRlbnRFbGVtZW50KTsKLQkJCQkJCQkJCQkKLQkJCQkJaWYgKHByb3AgPT0gbnVsbCkgewkJCQotCQkJCQkJcHJvcCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQkJCQkJcHJvcC5zZXROYW1lKFRuZ1V0aWwuUFVCTElTSF9DQVRFR09SWV9QUk9QRVJUWSk7Ci0JCQkJCQlwcm9wLnNldFZhbHVlKHZhbCk7Ci0JCQkJCQkJCQotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCksCi0JCQkJCQkJCXByb3AsIC0xKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJcHJvcCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpLAotCQkJCQkJCXZhbCwgLTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRGV0YWlsU2VjdGlvbkxpc3RlbmVycygpIHsKLQkJaWYgKGZ1bGxEZXNjT24pIHsKLQkJCWN0cmxfZnVsbF9kZXNjLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCWN0cmxfZnVsbF9kZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQkJCWN0cmxfZnVsbF9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX2Z1bGxfZGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQk6IGN0cmxfZnVsbF9kZXNjOwotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9mdWxsX2Rlc2MuZGVhY3RpdmF0ZUxpc3RlbmVyOiBjb250cm9sPSIgKyBjb250cm9sKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2Z1bGxfZGVzYy5kZWFjdGl2YXRlTGlzdGVuZXI6IGNvbnRlbnQgbm90IG1vZGlmaWVkLCBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkJLmdldE1haW5EZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9mdWxsX2Rlc2MuZGVhY3RpdmF0ZUxpc3RlbmVyOiByZXN0b3JlZCBvbGQgY29udGVudCwgZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9mdWxsX2Rlc2MuZGVhY3RpdmF0ZUxpc3RlbmVyOiBzYXZpbmcgbW9kaWZpZWQgY29udGVudCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSwKLQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2Z1bGxfZGVzYy5kZWFjdGl2YXRlTGlzdGVuZXI6IHNhdmVkIHN0YXR1cz0iICsgc3VjY2Vzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2Z1bGxfZGVzYy5kZWFjdGl2YXRlTGlzdGVuZXI6IGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlpZiAoa2V5Q29uc2lkZXJhdGlvbk9uKSB7Ci0JCQljdHJsX2tleS5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX2tleS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpKTsKLQkJCWN0cmxfa2V5LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX2tleS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQk6IGN0cmxfa2V5OwotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9rZXkuZGVhY3RpdmF0ZUxpc3RlbmVyOiBjb250cm9sPSIgKyBjb250cm9sKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2tleS5kZWFjdGl2YXRlTGlzdGVuZXI6IGNvbnRlbnQgbm90IG1vZGlmaWVkLCBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkJLmdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2tleS5kZWFjdGl2YXRlTGlzdGVuZXI6IHJlc3RvcmVkIG9sZCBjb250ZW50LCBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpLAotCQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfa2V5LmRlYWN0aXZhdGVMaXN0ZW5lcjogc2F2ZWQgc3RhdHVzPSIgKyBzdWNjZXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfa2V5LmRlYWN0aXZhdGVMaXN0ZW5lcjogZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBjb250cm9scyB3aXRoIGRhdGEgZnJvbSB0aGUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCWlmIChnZW5lcmFsU2VjdGlvbk9uKSB7Ci0JCQlsb2FkR2VuZXJhbFNlY3Rpb25EYXRhKCk7Ci0JCX0KLQkJaWYgKGRldGFpbFNlY3Rpb25PbikgewotCQkJbG9hZERldGFpbFNlY3Rpb25EYXRhKCk7Ci0JCX0KLQkJaWYgKG5vdGF0aW9uU2VjdGlvbk9uKSB7Ci0JCQlsb2FkTm90YXRpb25TZWN0aW9uRGF0YSgpOwotCQl9Ci0JCWlmICh0YWlsb3JpbmdTZWN0aW9uT24pIHsKLQkJCWxvYWRUYWlsb3JpbmdTZWN0aW9uRGF0YSgpOwotCQl9Ci0JCWlmICh2ZXJzaW9uU2VjdGlvbk9uKSB7Ci0JCQlsb2FkVmVyc2lvblNlY3Rpb25EYXRhKCk7Ci0JCX0KLQkJaWYgKGljb25TZWN0aW9uT24pIHsKLQkJCWxvYWRJY29uU2VjdGlvbkRhdGEoKTsKLQkJfQotCQlpZiAodmFyaWFiaWxpdHlTZWN0aW9uT24pIHsKLQkJCXZhcmlhYmlsaXR5U2VjdGlvbkRhdGEoKTsKLQkJfQotCQlmb3JtLmdldEJvZHkoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRHZW5lcmFsU2VjdGlvbkRhdGEoKSB7Ci0JCVN0cmluZyBuYW1lID0gY29udGVudEVsZW1lbnQuZ2V0TmFtZSgpOwotCQlTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IChjb250ZW50RWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQljdHJsX25hbWUuc2V0VGV4dChuYW1lID09IG51bGwgPyAiIiA6IG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUKLQkJCQkuc2V0VGV4dChwcmVzZW50YXRpb25OYW1lID09IG51bGwgPyAiIiA6IHByZXNlbnRhdGlvbk5hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGVsZW1lbnRUeXBlT24pIHsKLQkJCS8vIFN0cmluZyB0eXBlID0gY29udGVudEVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKTsKLQkJCVN0cmluZyB0eXBlID0gTGlicmFyeVVJVGV4dC5nZXRVSVRleHQoY29udGVudEVsZW1lbnQpOwotCQkJY3RybF90eXBlX2xhYmVsLnNldFRleHQodHlwZSA9PSBudWxsID8gIiIgOiB0eXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChicmllZkRlc2NPbikgewotCQkJU3RyaW5nIGJyaWVmX2Rlc2MgPSBjb250ZW50RWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChicmllZl9kZXNjID09IG51bGwgPyAiIiA6IGJyaWVmX2Rlc2MpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWlmIChwdWJsaXNoQ2F0ZWdvcnlPbikgewotCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBUbmdVdGlsLmdldFB1Ymxpc2hDYXRlZ29yeVByb3BlcnR5KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChwcm9wICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdmFsID0gcHJvcC5nZXRWYWx1ZSgpOwotCQkJCWN0cmxfcHVibGlzaF9jYXRlZ29yaWVzX2J1dHRvbi5zZXRTZWxlY3Rpb24oKG5ldyBCb29sZWFuKHZhbCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkRGV0YWlsU2VjdGlvbkRhdGEoKSB7Ci0JCWlmIChmdWxsRGVzY09uKSB7Ci0JCQlTdHJpbmcgZnVsbF9kZXNjID0gKGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKQotCQkJCQkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQljdHJsX2Z1bGxfZGVzYy5zZXRUZXh0KGZ1bGxfZGVzYyA9PSBudWxsID8gIiIgOiBmdWxsX2Rlc2MpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGtleUNvbnNpZGVyYXRpb25PbikgewotCQkJU3RyaW5nIGtleUNvbnNpZGVyYXRpb25zID0gKGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKQotCQkJCQkuZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKTsKLQkJCWN0cmxfa2V5Ci0JCQkJCS5zZXRUZXh0KGtleUNvbnNpZGVyYXRpb25zID09IG51bGwgPyAiIiA6IGtleUNvbnNpZGVyYXRpb25zKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRUYWlsb3JpbmdTZWN0aW9uRGF0YSgpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZE5vdGF0aW9uU2VjdGlvbkRhdGEoKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhcmlhYmlsaXR5U2VjdGlvbkRhdGEoKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBjb250ZW50RWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJTGlzdCBzZWxlY3Rpb25WYXJpYWJpbGl0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXNlbGVjdGlvblZhcmlhYmlsaXR5TGlzdC5hZGQodmFyaWFiaWxpdHlUeXBlKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQlzZWxlY3Rpb25WYXJpYWJpbGl0eUxpc3QpOwotCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0U2VsZWN0aW9uKG5ld1ZhcmlhYmlsaXR5U2VsZWN0aW9uLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGUgRGVzY3JpcHRpb24gY29udHJvbCB0byBleHBhbmQgYW5kIGNvbnRyb2wgc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgPT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZCA9IGNyZWF0ZVJpY2hUZXh0RWRpdG9yKHRvb2xraXQsIGV4cGFuZGVkQ29tcG9zaXRlLAotCQkJCQlTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQlnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpLCBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCksIDIsCi0JCQkJCWV4cGFuZExhYmVsKTsKLQkJCWN0cmxfZXhwYW5kZWQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCi0JCWlmIChkZXNjRXhwYW5kRmxhZykgewotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlzZWN0aW9uQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoc2VjdGlvbkNvbXBvc2l0ZSk7Ci0JCQllbmFibGVTZWN0aW9ucyh0cnVlKTsKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpOwotCQkJcmljaFRleHQuc2V0VGV4dChjdHJsX2V4cGFuZGVkLmdldFRleHQoKSk7Ci0JCQlyaWNoVGV4dC5zZXRGaW5kUmVwbGFjZUFjdGlvbihjdHJsX2V4cGFuZGVkLmdldEZpbmRSZXBsYWNlQWN0aW9uKCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWlmIChjdHJsX2V4cGFuZGVkLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJLnNhdmVNb2RpZmllZFJpY2hUZXh0KGN0cmxfZXhwYW5kZWQpOwotCQkJfQotCQkJcmljaFRleHQuc2V0Rm9jdXMoKTsKLQkJfSBlbHNlIHsKLQkJCXNlY3Rpb25Db21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KGV4cGFuZGVkQ29tcG9zaXRlKTsKLQkJCWVuYWJsZVNlY3Rpb25zKGZhbHNlKTsKLQkJCSgoTGFiZWwpZXhwYW5kTGFiZWwuZ2V0Q29udHJvbCgpKS5zZXRUZXh0KChTdHJpbmcpICgoSW1hZ2VIeXBlcmxpbmspIGUuZ2V0U291cmNlKCkpCi0JCQkJCS5nZXREYXRhKCJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gKElNZXRob2RSaWNoVGV4dCkgZS5nZXRIcmVmKCk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEluaXRpYWxUZXh0KHJpY2hUZXh0LmdldFRleHQoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KHJpY2hUZXh0LmdldE1vZGFsT2JqZWN0KCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdEZlYXR1cmUocmljaFRleHQKLQkJCQkJLmdldE1vZGFsT2JqZWN0RmVhdHVyZSgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RmluZFJlcGxhY2VBY3Rpb24ocmljaFRleHQuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2V4cGFuZGVkLmFkZExpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLCBsaXN0ZW5lcgotCQkJCQkJLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJYm9vbGVhbiBlZGl0YWJsZSA9ICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJaWYgKGVkaXRhYmxlKSB7Ci0JCQkJY3RybF9leHBhbmRlZC5zZXRGb2N1cygpOwotCQkJfQotCQkJc2V0QWN0aXZlUmljaFRleHRDb250cm9sKHJpY2hUZXh0KTsKLQkJfQotCQlmb3JtLmdldEJvZHkoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCWRlc2NFeHBhbmRGbGFnID0gIWRlc2NFeHBhbmRGbGFnOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgYWN0aXZlIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woSU1ldGhvZFJpY2hUZXh0IGN0cmwpIHsKLQkJYWN0aXZlQ29udHJvbCA9IGN0cmw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0aXZlIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGFjdGl2ZUNvbnRyb2w7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnJpZWZEZXNjT24oYm9vbGVhbiBicmllZkRlc2NPbikgewotCQl0aGlzLmJyaWVmRGVzY09uID0gYnJpZWZEZXNjT247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RnVsbERlc2NPbihib29sZWFuIGZ1bGxEZXNjT24pIHsKLQkJdGhpcy5mdWxsRGVzY09uID0gZnVsbERlc2NPbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRLZXlDb25zaWRlcmF0aW9uT24oYm9vbGVhbiBrZXlDb25zaWRlcmF0aW9uT24pIHsKLQkJdGhpcy5rZXlDb25zaWRlcmF0aW9uT24gPSBrZXlDb25zaWRlcmF0aW9uT247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRUeXBlT24KLQkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50VHlwZU9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50VHlwZU9uKGJvb2xlYW4gZWxlbWVudFR5cGVPbikgewotCQl0aGlzLmVsZW1lbnRUeXBlT24gPSBlbGVtZW50VHlwZU9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYW55QXR0cmlidXRlTW9kaWZpZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbnlBdHRyaWJ1dGVNb2RpZmllZCgpIHsKLQkJcmV0dXJuIGFueUF0dHJpYnV0ZU1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGlzIGlmIGFueSBhdHRyaWJ1dGUgaXMgbW9kaWZpZWQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBjaGFuZ2UKLQkgKiBkYXRlIGZpZWxkIGluIHZlcnNpb24gc2VjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYW55QXR0cmlidXRlTW9kaWZpZWQKLQkgKiAgICAgICAgICAgIFRoZSBhbnlBdHRyaWJ1dGVNb2RpZmllZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QW55QXR0cmlidXRlTW9kaWZpZWQoYm9vbGVhbiBhbnlBdHRyaWJ1dGVNb2RpZmllZCkgewotCQl0aGlzLmFueUF0dHJpYnV0ZU1vZGlmaWVkID0gYW55QXR0cmlidXRlTW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2ZXJzaW9uU2VjdGlvbk9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmVyc2lvblNlY3Rpb25PbigpIHsKLQkJcmV0dXJuIHZlcnNpb25TZWN0aW9uT247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZlcnNpb25TZWN0aW9uT24KLQkgKiAgICAgICAgICAgIFRoZSB2ZXJzaW9uU2VjdGlvbk9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uU2VjdGlvbk9uKGJvb2xlYW4gdmVyc2lvblNlY3Rpb25PbikgewotCQl0aGlzLnZlcnNpb25TZWN0aW9uT24gPSB2ZXJzaW9uU2VjdGlvbk9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFZlcnNpb24gSW5mb3JtYXRpb24gc2VjdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmVyc2lvblNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQl2ZXJzaW9uU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihzZWN0aW9uQ29tcG9zaXRlLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJdmVyc2lvblNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCXZlcnNpb25TZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlZFUlNJT05fSU5GT19TRUNUSU9OX05BTUUpOwotCQl2ZXJzaW9uU2VjdGlvbi5zZXREZXNjcmlwdGlvbihnZXRWZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQl2ZXJzaW9uU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJdmVyc2lvbkNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHZlcnNpb25TZWN0aW9uKTsKLQkJdmVyc2lvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdmVyc2lvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNSwgZmFsc2UpKTsKLQkJdmVyc2lvblNlY3Rpb24uc2V0Q2xpZW50KHZlcnNpb25Db21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgVmVyc2lvbiBzZWN0aW9uIGNvbnRlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZlcnNpb25TZWN0aW9uQ29udGVudCgpIHsKLQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpOwotCQlTdHJpbmcgZmlsbFRleHQgPSAoY29udGVudERlc2NyaXB0aW9uLmdldFZlcnNpb24oKSA9PSBudWxsID8gIiIgOiBjb250ZW50RGVzY3JpcHRpb24uZ2V0VmVyc2lvbigpKTsKLQkJY3RybF92ZXJzaW9uID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWw0KHRvb2xraXQsIHZlcnNpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlZFUlNJT05fVEVYVCwgU1dULkRFRkFVTFQsIFNXVC5TSU5HTEUsIGZpbGxUZXh0KTsKLQotCQlmaWxsVGV4dCA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDaGFuZ2VEYXRlKCkgPT0gbnVsbCA/ICIiIC8vJE5PTi1OTFMtMSQKLQkJCQk6IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKERhdGVGb3JtYXQuRlVMTCkuZm9ybWF0KAotCQkJCQkJY29udGVudERlc2NyaXB0aW9uLmdldENoYW5nZURhdGUoKSk7Ci0JCWN0cmxfY2hhbmdlX2RhdGUgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDQodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQ0hBTkdFX0RBVEVfVEVYVCwgU1dULkRFRkFVTFQsIFNXVC5TSU5HTEUsIGZpbGxUZXh0KTsKLQkJY3RybF9jaGFuZ2VfZGF0ZS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJY3RybF9jaGFuZ2VfZGVzYyA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsNSh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5DSEFOR0VfREVTQ1JJUFRJT05fVEVYVCk7Ci0KLQkJQ29tcG9zaXRlIHZpZXdIaXN0b3J5QnV0dG9uUGFuZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCXZlcnNpb25Db21wb3NpdGUsICBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCwgMSwgMSwgMSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDA7Ci0JCQl2aWV3SGlzdG9yeUJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJdmlld19oaXN0b3J5X2J1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHZpZXdIaXN0b3J5QnV0dG9uUGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuVklFV19ISVNUT1JZX0JVVFRPTl9URVhULCBTV1QuUFVTSCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDEwMDsKLQkJCXZpZXdfaGlzdG9yeV9idXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX2F1dGhvcnMgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDUodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQVVUSE9SU19URVhULCA0MCwgU1dULk1VTFRJKTsKLQotCQlsYWJlbF9jb3B5cmlnaHQgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5DT1BZUklHSFRfVEVYVCwgMik7Ci0JCWN0cmxfY29weXJpZ2h0ID0gY3JlYXRlVGFibGUodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwgU1dULlNJTkdMRQotCQkJCXwgU1dULlJFQURfT05MWSwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCwKLQkJCQk1LCA0MDAsIDEsIDIpOwotCi0JCWNvcHlyaWdodF92aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9jb3B5cmlnaHQpOwotCQlpbml0Q29udGVudFByb3ZpZGVyQ29weXJpZ2h0KCk7Ci0JCWNvcHlyaWdodF92aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihjb3B5cmlnaHRMYWJlbFByb3ZpZGVyQmFzZSk7Ci0JCWNvcHlyaWdodF92aWV3ZXIuc2V0SW5wdXQoY29udGVudEVsZW1lbnQpOwotCQlDb21wb3NpdGUgYnV0dG9ucGFuZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5ELCAxLCAxLCAxKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJYnV0dG9ucGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljb3B5cmlnaHRfYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9ucGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuU0VMRUNUX0JVVFRPTl9URVhULCBTV1QuU0lNUExFKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMTAwOwotCQkJY29weXJpZ2h0X2J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0ID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9ucGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVTRUxFQ1RfQlVUVE9OX1RFWFQsIFNXVC5TSU1QTEUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAxMDA7Ci0JCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJc2V0Q29weXJpZ2h0QnV0dG9uRGVzZWxlY3QoKTsKLQotCQkvLyBDcmVhdGUgdGhlIGV4cGFuZGVkIGNvbXBvc2l0ZS4KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodmVyc2lvbkNvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHZpZXdIaXN0b3J5QnV0dG9uUGFuZSk7Ci0JCS8vdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoYnV0dG9ucGFuZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJDb3B5cmlnaHQoKSB7Ci0JCWNvcHlyaWdodENvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQlsaXN0LmFkZChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJCS5nZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSk7Ci0JCQkJfQotCQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQl9Ci0JCX07Ci0JCWNvcHlyaWdodF92aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvcHlyaWdodENvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmVyc2lvblNlY3Rpb25MaXN0ZW5lcnMoKSB7Ci0JCWN0cmxfdmVyc2lvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3ZlcnNpb24uYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X1ZlcnNpb24oKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkuZ2V0VmVyc2lvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBTdHJVdGlsCi0JCQkJCQkuZ2V0UGxhaW5UZXh0KGN0cmxfdmVyc2lvbi5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfVmVyc2lvbigpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2F1dGhvcnMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9hdXRob3JzLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJLmdldEF1dGhvcnMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbAotCQkJCQkJLmdldFBsYWluVGV4dChjdHJsX2F1dGhvcnMuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0F1dGhvcnMoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY29weXJpZ2h0X2J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCUxpc3QgYWxyZWFkeUV4c3RpbmcgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGN0cmxfY29weXJpZ2h0LmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IGN0cmxfY29weXJpZ2h0LmdldEl0ZW1zKClbMF07Ci0JCQkJCWlmIChpdGVtLmdldERhdGEoKSAhPSBudWxsKQotCQkJCQkJYWxyZWFkeUV4c3RpbmcuYWRkKGl0ZW0uZ2V0RGF0YSgpKTsKLQkJCQl9Ci0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTLCBhbHJlYWR5RXhzdGluZyk7Ci0JCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCQkJZmQub3BlbigpOwotCQkJCWZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJCQlpZiAoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLnNpemUoKSA+IDApIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBmZC5nZXRTZWxlY3RlZEl0ZW1zKCkuZ2V0KDApLAotCQkJCQkJCS0xKTsKLQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljb3B5cmlnaHRfdmlld2VyLnJlZnJlc2goKTsKLQkJCQlzZXRDb3B5cmlnaHRCdXR0b25EZXNlbGVjdCgpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2NoYW5nZV9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfY2hhbmdlX2Rlc2MuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJLmdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCQkJY2hhciBkZWxpbWl0ZXIgPSBBdXRob3JpbmdVSVJlc291cmNlcy5DaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlci5jaGFyQXQoMCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9jaGFuZ2VfZGVzYy5nZXRUZXh0KCk7Ci0KLQkJCQluZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKGRlbGltaXRlciwgJyAnKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKGxhc3RDaGFuZ2VIaXN0b3J5KSkgewotCQkJCQlsYXN0Q2hhbmdlSGlzdG9yeSA9IG5ld0NvbnRlbnQ7Ci0JCQkJCWlmICgob2xkQ29udGVudCAhPSBudWxsKQotCQkJCQkJCSYmICghKFN0clV0aWwuaXNCbGFuayhvbGRDb250ZW50KSkpKSB7Ci0JCQkJCQluZXdDb250ZW50ID0gb2xkQ29udGVudCArIGRlbGltaXRlciArIG5ld0NvbnRlbnQ7Ci0JCQkJCX0KLQotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjb250ZW50RWxlbWVudAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpLCBuZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl2aWV3X2hpc3RvcnlfYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JCQkJQ2hhbmdlSGlzdG9yeURpYWxvZyBkbGcgPSBuZXcgQ2hhbmdlSGlzdG9yeURpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWNvbnRlbnRFbGVtZW50KTsKLQkJCQlkbGcub3BlbigpOwotCQkJfQotCQl9KTsKLQotCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKSwgbnVsbCwgLTEpOwotCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJY29weXJpZ2h0X3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCXNldENvcHlyaWdodEJ1dHRvbkRlc2VsZWN0KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKgotCSAqIHVwZGF0ZSB0aGUgY2hhbmdlIGRhdGUgaWYgYW55IGF0dHJpYnV0ZSBpcyBtb2RpZmllZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDaGFuZ2VEYXRlKCkgewotCi0JCURhdGUgY2hhbmdlRGF0ZSA9IGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldENoYW5nZURhdGUoKTsKLQkJRGF0ZUZvcm1hdCBkZiA9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKERhdGVGb3JtYXQuRlVMTCk7Ci0KLQkJU3RyaW5nIG9sZENvbnRlbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY2hhbmdlRGF0ZSAhPSBudWxsKSB7Ci0JCQlvbGRDb250ZW50ID0gZGYuZm9ybWF0KGNoYW5nZURhdGUpOwotCQl9Ci0KLQkJRGF0ZSBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7Ci0JCVN0cmluZyBuZXdDb250ZW50ID0gZGYuZm9ybWF0KGN1cnJlbnREYXRlKTsKLQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCksIGN1cnJlbnREYXRlLCAtMSk7Ci0JCQlpZiAoIXN0YXR1cykgewotCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF9jaGFuZ2VfZGF0ZS5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFZlcnNpb25TZWN0aW9uRGF0YSgpIHsKLQotCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gY29udGVudEVsZW1lbnQKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCWN0cmxfdmVyc2lvbgotCQkJCS5zZXRUZXh0KGNvbnRlbnREZXNjcmlwdGlvbi5nZXRWZXJzaW9uKCkgPT0gbnVsbCA/ICIiIDogY29udGVudERlc2NyaXB0aW9uLmdldFZlcnNpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9hdXRob3JzCi0JCQkJLnNldFRleHQoY29udGVudERlc2NyaXB0aW9uLmdldEF1dGhvcnMoKSA9PSBudWxsID8gIiIgOiBjb250ZW50RGVzY3JpcHRpb24uZ2V0QXV0aG9ycygpKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2NoYW5nZV9kZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfY2hhbmdlX2RhdGUKLQkJCQkuc2V0VGV4dChjb250ZW50RGVzY3JpcHRpb24uZ2V0Q2hhbmdlRGF0ZSgpID09IG51bGwgPyAiIiAvLyROT04tTkxTLTEkCi0JCQkJCQk6IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKERhdGVGb3JtYXQuRlVMTCkuZm9ybWF0KAotCQkJCQkJCQljb250ZW50RGVzY3JpcHRpb24uZ2V0Q2hhbmdlRGF0ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlIERlc2NyaXB0aW9uIGNvbnRyb2wgdG8gZXhwYW5kIGFuZCBjb250cm9sIHN0YXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGUsIGludCBpZCkgewotCQkvLyBUT0RPLSB3ZSBzaG91bGQgY29tYmluZSB0aGVzZSBtZXRob2RzIGludG8gb25lLiBPbmUgd2F5IHRvIGRvIGl0LAotCQkvLyBkaXNwb2luZwotCQkvLyBjdHJsX2V4cGFuZGVkIGV2ZXJ5IHRpbWUgaXQgY29sbGFwc2VzIGFuZCBjcmVhdGluZyBpdCB3aGVuIHdlIGV4cGFuZC4KLQkJLy8gQXQgcHJlc2VudCwgdGhlcmUgaXMgbm8gbWV0aG9kIHRvIGRpc3Bvc2UKLQkJdG9nZ2xlKGUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWNvblNlY3Rpb25Pbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ljb25TZWN0aW9uT24oKSB7Ci0JCXJldHVybiBpY29uU2VjdGlvbk9uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpY29uU2VjdGlvbk9uCi0JICogICAgICAgICAgICBUaGUgaWNvblNlY3Rpb25PbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWNvblNlY3Rpb25Pbihib29sZWFuIGljb25TZWN0aW9uT24pIHsKLQkJdGhpcy5pY29uU2VjdGlvbk9uID0gaWNvblNlY3Rpb25PbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBJY29uIHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSWNvblNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlpY29uU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihzZWN0aW9uQ29tcG9zaXRlLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJaWNvblNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCWljb25TZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LklDT05fU0VDVElPTl9OQU1FKTsKLQkJaWNvblNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZ2V0SWNvblNlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJaWNvblNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWljb25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShpY29uU2VjdGlvbik7Ci0JCWljb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWljb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIHRydWUpKTsKLQkJaWNvblNlY3Rpb24uc2V0Q2xpZW50KGljb25Db21wb3NpdGUpOwotCX0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSWNvblNlY3Rpb25Db250ZW50KCkgewotCQlDb21wb3NpdGUgc2hhcGVJY29uQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGljb25Db21wb3NpdGUsCi0JCQkJMSk7Ci0JCXNoYXBlSWNvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJc2hhcGVJY29uQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0vLwkJY3JlYXRlTGFiZWwoCi0vLwkJCQl0b29sa2l0LAotLy8JCQkJc2hhcGVJY29uQ29tcG9zaXRlLAotLy8JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsLCAyKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBObyB3cmFwIG5lZWRlZAotCQljcmVhdGVMYWJlbFdpdGhOb1dyYXAoCi0JCQkJdG9vbGtpdCwKLQkJCQlzaGFwZUljb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsLAotCQkJCUdyaWREYXRhLkJFR0lOTklORywKLQkJCQkyKTsgCi0JCQotCQlwYW5lMSA9IG5ldyBDYW52YXMoc2hhcGVJY29uQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDYwOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNjA7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAxOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJcGFuZTEuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlwYW5lMS5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0JCX0KLQkJLy8gcGFuZTEuc2V0U2l6ZSgzMCwzMCk7Ci0JCUNvbXBvc2l0ZSBwYW5lMiA9IGNyZWF0ZUNvbXBvc2l0ZUZvckJ1dHRvbnModG9vbGtpdCwgc2hhcGVJY29uQ29tcG9zaXRlKTsKLQkJY3RybF9zZWxlY3Rfc2hhcGVJY29uX2J1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJcGFuZTIsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWwsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24gPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCXBhbmUyLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWwsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCkgPT0gbnVsbCkKLQkJCWN0cmxfY2xlYXJfc2hhcGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZWxzZQotCQkJY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJQ29tcG9zaXRlIG5vZGVJY29uQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGljb25Db21wb3NpdGUsIDEpOwotCQlub2RlSWNvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbm9kZUljb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0vLwkJY3JlYXRlTGFiZWwoCi0vLwkJCQl0b29sa2l0LAotLy8JCQkJbm9kZUljb25Db21wb3NpdGUsCi0vLwkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbCwgMik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gTm8gd3JhcCBuZWVkIGZvciAKLQkJY3JlYXRlTGFiZWxXaXRoTm9XcmFwKAotCQkJCXRvb2xraXQsCi0JCQkJbm9kZUljb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfTGFiZWwsCi0JCQkJR3JpZERhdGEuQkVHSU5OSU5HLAotCQkJCTIpOyAKLQkJcGFuZTMgPSBuZXcgQ2FudmFzKG5vZGVJY29uQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDA7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAxOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJcGFuZTMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlwYW5lMy5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0JCX0KLQkJQ29tcG9zaXRlIHBhbmU0ID0gY3JlYXRlQ29tcG9zaXRlRm9yQnV0dG9ucyh0b29sa2l0LCBub2RlSWNvbkNvbXBvc2l0ZSk7Ci0JCWN0cmxfc2VsZWN0X25vZGVJY29uX2J1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJcGFuZTQsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19TZWxlY3RCdXR0b25MYWJlbCwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uID0gdG9vbGtpdAotCQkJCS5jcmVhdGVCdXR0b24oCi0JCQkJCQlwYW5lNCwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWwsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKSA9PSBudWxsKQotCQkJY3RybF9jbGVhcl9ub2RlSWNvbl9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UKLQkJCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQotCQluZXcgTGFiZWwoaWNvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzaGFwZUljb25QYXRoID0gY3JlYXRlTGFiZWxXaXRoTm9XcmFwKHRvb2xraXQsCi0JCQkJaWNvbkNvbXBvc2l0ZSwgIiIsIEdyaWREYXRhLkJFR0lOTklORywgMSk7Ci0JCW5vZGVJY29uUGF0aCA9IGNyZWF0ZUxhYmVsV2l0aE5vV3JhcCh0b29sa2l0LAotCQkJCWljb25Db21wb3NpdGUsICIiLCBHcmlkRGF0YS5CRUdJTk5JTkcsIDIpOwotLy8JCQluZXcgTGFiZWwobm9kZUljb25Db21wb3NpdGUsIFNXVC5OT05FKTsKLS8vCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0vLwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9MjsKLS8vCQlub2RlSWNvblBhdGguc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUyKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTMpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lNCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWNvblNlY3Rpb25MaXN0ZW5lcnMoKSB7Ci0KLQkJY3RybF9zZWxlY3Rfc2hhcGVJY29uX2J1dHRvbgotCQkJCS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLS8vCQkJCQlGaWxlIGxpYkRpckZpbGUgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0vLwkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpOwotCi0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWphdmEubmV0LlVSSSBzaGFwZUljb25VcmkgPSBudWxsOwotCQkJCQkJRmlsZURpYWxvZyBmaWxlQ2hvb3NlciA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkKLQkJCQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCQkJCQlmaWxlQ2hvb3Nlci5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfSWNvbkZpbGVDaG9vc2VyRGlhbG9nX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZmlsZUNob29zZXIuc2V0RmlsdGVyRXh0ZW5zaW9ucyhpbWFnZVR5cGVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZmlsZUNob29zZXIuc2V0RmlsdGVyTmFtZXMoaW1hZ2VOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyBpbWFnZUZpbGUgPSBudWxsOwotCQkJCQkJU3RyaW5nIGZpbGVuYW1lID0gbnVsbDsKLQkJCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCQkJaW1hZ2VGaWxlID0gZmlsZUNob29zZXIub3BlbigpOwotCQkJCQkJCWZpbGVuYW1lID0gZmlsZUNob29zZXIuZ2V0RmlsZU5hbWUoKTsKLQkJCQkJCQlpZiAoaW1hZ2VGaWxlICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKG5ldyBGaWxlKGltYWdlRmlsZSkuZXhpc3RzKCkpIHsKLS8vCQkJCQkJCQkJSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoCi0vLwkJCQkJCQkJCQkJaW1hZ2VGaWxlKTsKLS8vCQkJCQkJCQkJaWYgKGltYWdlRGF0YS53aWR0aCA+IFNIQVBFSUNPTl9XSURUSF9NQVgKLS8vCQkJCQkJCQkJCQl8fCBpbWFnZURhdGEuaGVpZ2h0ID4gU0hBUEVJQ09OX0hFSUdIVF9NQVgpIHsKLS8vCQkJCQkJCQkJCS8vIG1zZyB1c2VyIC0gaW1hZ2UgdG9vIGJpZwotLy8JCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLS8vCQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotLy8JCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLS8vCQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkIAotLy8JCQkJCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLS8vCQkJCQkJCQkJCQkJCQkJCS5mb3JtYXQoCi0vLwkJCQkJCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGUsIC8vJE5PTi1OTFMtMSQKLS8vCQkJCQkJCQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQlpbWFnZUZpbGUsCi0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJbmV3IEludGVnZXIoCi0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJCQlTSEFQRUlDT05fV0lEVEhfTUFYKSwKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQluZXcgSW50ZWdlcigKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVNIQVBFSUNPTl9IRUlHSFRfTUFYKSB9KSk7Ci0vLwkJCQkJCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCQkJCQlicmVhazsKLS8vCQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkvLyBtc2cgdXNlciAtIGZpbGUgZG9lc24ndCBleGlzdAotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCQkJCQkJTWVzc2FnZUZvcm1hdAotCQkJCQkJCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RlbXBsYXRlLCAvLyROT04tTkxTLTEkIAotCQkJCQkJCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBpbWFnZUZpbGUgfSkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCAmJiBpbWFnZUZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJU3RyaW5nIHVybCA9IGNvcHlSZXNvdXJjZVRvTGliKGZpbGVuYW1lLAotCQkJCQkJCQkJCWZpbGVDaG9vc2VyLmdldEZpbHRlclBhdGgoKSwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudCk7Ci0JCQkJCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsKTsKLQkJCQkJCQkJCXNoYXBlSWNvblVyaSA9IG5ldyBVUkkoTmV0VXRpbAotCQkJCQkJCQkJCQkuZW5jb2RlRmlsZVVSTChGaWxlVXRpbAotCQkJCQkJCQkJCQkJCS5nZXRSZWxhdGl2ZVBhdGgoZmlsZSwKLQkJCQkJCQkJCQkJCQkJCW5ldyBGaWxlKGdldFBsdWdpblBhdGgoY29udGVudEVsZW1lbnQpKSkpKTsKLQkJCQkJCQkJCWlmIChzaGFwZUljb25VcmkgIT0gbnVsbCkgewotCQkJCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSwKLQkJCQkJCQkJCQkJCQkJc2hhcGVJY29uVXJpLCAtMSk7Ci0JCQkJCQkJCQkJaWYgKCFzdGF0dXMpCi0JCQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXNoYXBlSW1hZ2UgPSBuZXcgSW1hZ2UoCi0JCQkJCQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLCBmaWxlCi0JCQkJCQkJCQkJCQkJLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCQkJCXNoYXBlSWNvblBhdGguc2V0VGV4dChzaGFwZUljb25VcmkuZ2V0UGF0aCgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlzaGFwZUljb25VcmkgPSBudWxsOwotCQkJCQkJCQlzaGFwZUltYWdlID0gbnVsbDsKLQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJLmxvZ0Vycm9yKGV4KTsKLQkJCQkJCQkJaWYgKGV4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX2NvcHlpbmdfZmlsZV90aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycl9jb3B5aW5nX2ZpbGVfZXJyb3IsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfY29weWluZ19maWxlX3JlYXNvbiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCWV4LmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfcHJvY2Vzc2luZ19maWxlX2Rlc2NyaXB0aW9uLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChzaGFwZUltYWdlICE9IG51bGwpIHsKLQkJCQkJCQlwYW5lMS5yZWRyYXcoKTsKLQkJCQkJCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24KLQkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSwKLQkJCQkJCQkJbnVsbCwgLTEpOwotCQkJCQkJaWYgKCFzdGF0dXMpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJcGFuZTEucmVkcmF3KCk7Ci0JCQkJCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlzaGFwZUljb25QYXRoLnNldFRleHQoIiIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF9zZWxlY3Rfbm9kZUljb25fYnV0dG9uCi0JCQkJLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotLy8JCQkJCUZpbGUgbGliRGlyRmlsZSA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSk7Ci0KLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJamF2YS5uZXQuVVJJIG5vZGVJY29uVXJpID0gbnVsbDsKLQkJCQkJCUZpbGVEaWFsb2cgZmlsZUNob29zZXIgPSBuZXcgRmlsZURpYWxvZyhEaXNwbGF5Ci0JCQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCQkJZmlsZUNob29zZXIuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZpbGVDaG9vc2VyLnNldEZpbHRlckV4dGVuc2lvbnMoaW1hZ2VUeXBlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZpbGVDaG9vc2VyLnNldEZpbHRlck5hbWVzKGltYWdlTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgaW1hZ2VGaWxlID0gbnVsbDsKLQkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IG51bGw7Ci0JCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJCWltYWdlRmlsZSA9IGZpbGVDaG9vc2VyLm9wZW4oKTsKLQkJCQkJCQlmaWxlbmFtZSA9IGZpbGVDaG9vc2VyLmdldEZpbGVOYW1lKCk7Ci0JCQkJCQkJaWYgKGltYWdlRmlsZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmIChuZXcgRmlsZShpbWFnZUZpbGUpLmV4aXN0cygpKSB7Ci0JCQkJCQkJCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YSgKLQkJCQkJCQkJCQkJaW1hZ2VGaWxlKTsKLQkJCQkJCQkJCWlmIChpbWFnZURhdGEud2lkdGggPiBOT0RFSUNPTl9XSURUSF9NQVgKLQkJCQkJCQkJCQkJfHwgaW1hZ2VEYXRhLmhlaWdodCA+IE5PREVJQ09OX0hFSUdIVF9NQVgpIHsKLQkJCQkJCQkJCQkvLyBtc2cgdXNlciAtIGltYWdlIHRvbyBiaWcKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkIAotCQkJCQkJCQkJCQkJCQlNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCWltYWdlRmlsZSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJbmV3IEludGVnZXIoCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJTk9ERUlDT05fV0lEVEhfTUFYKSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJbmV3IEludGVnZXIoCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJTk9ERUlDT05fSEVJR0hUX01BWCkgfSkpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCS8vIG1zZyB1c2VyIC0gZmlsZSBkb2Vzbid0IGV4aXN0Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190ZW1wbGF0ZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBpbWFnZUZpbGUgfSkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCAmJiBpbWFnZUZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJU3RyaW5nIHVybCA9IGNvcHlSZXNvdXJjZVRvTGliKGZpbGVuYW1lLAotCQkJCQkJCQkJCWZpbGVDaG9vc2VyLmdldEZpbHRlclBhdGgoKSwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudCk7Ci0JCQkJCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsKTsKLQkJCQkJCQkJCW5vZGVJY29uVXJpID0gbmV3IFVSSShOZXRVdGlsCi0JCQkJCQkJCQkJCS5lbmNvZGVGaWxlVVJMKEZpbGVVdGlsCi0JCQkJCQkJCQkJCQkJLmdldFJlbGF0aXZlUGF0aChmaWxlLAotCQkJCQkJCQkJCQkJCQkJbmV3IEZpbGUoZ2V0UGx1Z2luUGF0aChjb250ZW50RWxlbWVudCkpKSkpOwotCQkJCQkJCQkJaWYgKG5vZGVJY29uVXJpICE9IG51bGwpIHsKLQkJCQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKSwKLQkJCQkJCQkJCQkJCQkJbm9kZUljb25VcmksIC0xKTsKLQkJCQkJCQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJbm9kZUltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLAotCQkJCQkJCQkJCQlmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCQkJCW5vZGVJY29uUGF0aC5zZXRUZXh0KG5vZGVJY29uVXJpLmdldFBhdGgoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJbm9kZUljb25VcmkgPSBudWxsOwotCQkJCQkJCQlub2RlSW1hZ2UgPSBudWxsOwotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkubG9nRXJyb3IoZXgpOwotCQkJCQkJCQlpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfY29weWluZ19maWxlX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX2NvcHlpbmdfZmlsZV9lcnJvciwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycl9jb3B5aW5nX2ZpbGVfcmVhc29uLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJZXguZ2V0TWVzc2FnZSgpKTsKLQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX3Byb2Nlc3NpbmdfZmlsZV9kZXNjcmlwdGlvbiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobm9kZUltYWdlICE9IG51bGwpIHsKLQkJCQkJCQlwYW5lMy5yZWRyYXcoKTsKLQkJCQkJCQljdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCi0JCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWNvbnRlbnRFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCksIG51bGwsIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJcmV0dXJuOwotCQkJCXBhbmUzLnJlZHJhdygpOwotCQkJCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW5vZGVJY29uUGF0aC5zZXRUZXh0KCIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBzZWxlY3RlZCBzaGFwZU5vZGVJY29uIGFuZCBub2RlSWNvbiB0byByZXNvdXJjZXMgZm9sZGVyIG9mCi0JICogY29udGVudCBlbGVtZW50LiBQcm9tcHRzIHRvIG92ZXJ3cml0ZSBpZiBmaWxlIGFscmVhZHkgZXhpc3RzLgotCSAqIEBwYXJhbSBzRmlsZU5hbWUKLQkgKiBAcGFyYW0gc0ZpbGVQYXRoCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29weVJlc291cmNlVG9MaWIoU3RyaW5nIHNGaWxlTmFtZSwgU3RyaW5nIHNGaWxlUGF0aCwKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBsaWJEaXJzID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSk7Ci0JCVN0cmluZyByZXNvdXJjZUxvYyA9IGxpYkRpcnMuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRSZXNvdXJjZVBhdGgobWV0aG9kRWxlbWVudCk7Ci0KLQkJRmlsZSBzRmlsZSA9IG5ldyBGaWxlKHNGaWxlUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgc0ZpbGVOYW1lKTsKLQkJU3RyaW5nQnVmZmVyIHJlc291cmNlRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIocmVzb3VyY2VMb2MpLmFwcGVuZCgKLQkJCQlGaWxlLnNlcGFyYXRvcikuYXBwZW5kKHNGaWxlTmFtZSk7Ci0JCUZpbGUgZm9ybWF0RmlsZSA9IG5ldyBGaWxlKHJlc291cmNlRmlsZS50b1N0cmluZygpKTsKLQkJCi0JCWlmIChmb3JtYXRGaWxlLmV4aXN0cygpKSB7Ci0JCQlSZW5hbWVGaWxlQ29uZmxpY3REaWFsb2cgZGlhbG9nID0gbmV3IFJlbmFtZUZpbGVDb25mbGljdERpYWxvZygKLQkJCQkJY3RybF9zZWxlY3Rfbm9kZUljb25fYnV0dG9uLmdldFNoZWxsKCkpOwotCQkJZGlhbG9nCi0JCQkJCS5zZXRNZXNzYWdlU3RyKE1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9pY29uU2VjdGlvbl9maWxlTmFtZUNvbmZsaWN0X21zZywgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgc0ZpbGVOYW1lLCByZXNvdXJjZUxvYyB9KSk7Ci0JCQlkaWFsb2cuc2V0RGVzdGlhdGlvbihyZXNvdXJjZUxvYyk7Ci0JCQlkaWFsb2cuc2V0RmlsZVBhdGgoc0ZpbGVOYW1lKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0KLQkJCWlmKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpewotCQkJCXJldHVybiBudWxsOwotCQkJfWVsc2V7Ci0JCQkJc0ZpbGVOYW1lID0gZGlhbG9nLmdldEZpbGVQYXRoKCk7Ci0JCQkJZm9ybWF0RmlsZSA9IG5ldyBGaWxlKHJlc291cmNlTG9jK0ZpbGUuc2VwYXJhdG9yK3NGaWxlTmFtZSk7Ci0JCQl9Ci0JCX0KLQotCQlGaWxlVXRpbC5jb3B5ZmlsZShzRmlsZSwgZm9ybWF0RmlsZSk7Ci0KLQkJcmV0dXJuIGZvcm1hdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZEljb25TZWN0aW9uRGF0YSgpIHsKLQkJcGFuZTEuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkvLyBwYWludCB0aGUgZ3JleSBiYWNrZ3JvdW5kCi0JCQkJUmVjdGFuZ2xlIGNsaWVudFJlY3QgPSBwYW5lMS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJZS5nYy5zZXRDbGlwcGluZyhjbGllbnRSZWN0KTsKLQkJCQllLmdjLnNldEJhY2tncm91bmQoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtQ29sb3IoMTUpKTsKLQkJCQllLmdjLmZpbGxSZWN0YW5nbGUoY2xpZW50UmVjdCk7Ci0KLQkJCQlqYXZhLm5ldC5VUkkgdXJpID0gY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCk7Ci0JCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCkuZ2V0UGF0aCgpOwotCQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQkJCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJCQkJCQkJLy8gQ2hlY2sgZm9yIHRoZSB1cmkgY29udGFpbnMgdGhlIHJlbGF0aXZlIHRvIGxpYnJhcnkuCi0JCQkJCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY29udGVudEVsZW1lbnQpOwotCQkJCQkJCQkJaWYocGF0aC5pbmRleE9mKHBsdWdpbi5nZXROYW1lKCkpID4gLTEpewotCQkJCQkJCQkJCXBhdGggPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpCi0JCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHBhdGg7CQotCQkJCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCQkJcGF0aCA9IGdldFBsdWdpblBhdGgoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHBhdGg7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCQlmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJCWlmIChzaGFwZUltYWdlID09IG51bGwpIHsKLQkJCQkJCQkJCXNoYXBlSW1hZ2UgPSBuZXcgSW1hZ2UoCi0JCQkJCQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLCBwYXRoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZihjb250ZW50RWxlbWVudC5nZXRTaGFwZWljb24oKSAhPSBudWxsKXsKLQkJCQkJCQkJCXNoYXBlSWNvblBhdGguc2V0VGV4dChjb250ZW50RWxlbWVudC5nZXRTaGFwZWljb24oKS5nZXRQYXRoKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNsaWVudFJlY3QgPSBwYW5lMS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJCQkJCWUuZ2Muc2V0Q2xpcHBpbmcoY2xpZW50UmVjdCk7Ci0JCQkJCQkJCWUuZ2Muc2V0QmFja2dyb3VuZChEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJCQkJCS5nZXRTeXN0ZW1Db2xvcigxNSkpOwotCQkJCQkJCQllLmdjLmZpbGxSZWN0YW5nbGUoY2xpZW50UmVjdCk7Ci0JCQkJCQkJCWUuZ2MuZHJhd0ltYWdlKHNoYXBlSW1hZ2UsIHNoYXBlSW1hZ2UKLQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkueCwKLQkJCQkJCQkJCQlzaGFwZUltYWdlLmdldEJvdW5kcygpLnksIHNoYXBlSW1hZ2UKLQkJCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS53aWR0aCwgc2hhcGVJbWFnZQotCQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLmhlaWdodCwgcGFuZTEKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkueCwgcGFuZTEKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkueSwgcGFuZTEKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkud2lkdGgsIHBhbmUxCi0JCQkJCQkJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKHdhcm5pbmdDb3VudCA9PSAxKSB7Ci0JCQkJCQkJCQl3YXJuaW5nQ291bnQrKzsKLQkJCQkJCQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbldhcm5pbmcsIChuZXcgT2JqZWN0W10geyBjb250ZW50RWxlbWVudC5nZXROYW1lKCksIHBhdGggfSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlNc2dCb3guc2hvd1dhcm5pbmcobXNnKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yLCAobmV3IE9iamVjdFtdIHsgZXguZ2V0TWVzc2FnZSgpIH0pKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQkJcGFuZTEucmVkcmF3KCk7Ci0JCWlmKGNvbnRlbnRFbGVtZW50LmdldFNoYXBlaWNvbigpICE9IG51bGwpewotCQkJc2hhcGVJY29uUGF0aC5zZXRUZXh0KGNvbnRlbnRFbGVtZW50LmdldFNoYXBlaWNvbigpLmdldFBhdGgoKSk7Ci0JCX0KLQkJCi0JCXBhbmUzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkJLy8gcGFpbnQgdGhlIGdyZXkgYmFja2dyb3VuZAotCQkJCVJlY3RhbmdsZSBjbGllbnRSZWN0ID0gcGFuZTMuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCWUuZ2Muc2V0Q2xpcHBpbmcoY2xpZW50UmVjdCk7Ci0JCQkJZS5nYy5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKDE1KSk7Ci0JCQkJZS5nYy5maWxsUmVjdGFuZ2xlKGNsaWVudFJlY3QpOwotCi0JCQkJamF2YS5uZXQuVVJJIHVyaSA9IGNvbnRlbnRFbGVtZW50LmdldE5vZGVpY29uKCk7Ci0JCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKS5nZXRQYXRoKCk7Ci0JCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY29udGVudEVsZW1lbnQpOwotCQkJCQkJCQkJaWYocGF0aC5pbmRleE9mKHBsdWdpbi5nZXROYW1lKCkpID4gLTEpewotCQkJCQkJCQkJCXBhdGggPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpCi0JCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHBhdGg7CQotCQkJCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCQkJcGF0aCA9IGdldFBsdWdpblBhdGgoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHBhdGg7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCQlpZiAobm9kZUltYWdlID09IG51bGwpIHsKLQkJCQkJCQkJCW5vZGVJbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwKLQkJCQkJCQkJCQkJcGF0aCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYoY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKSAhPSBudWxsKXsKLQkJCQkJCQkJCW5vZGVJY29uUGF0aC5zZXRUZXh0KGNvbnRlbnRFbGVtZW50LmdldE5vZGVpY29uKCkuZ2V0UGF0aCgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQljbGllbnRSZWN0ID0gcGFuZTMuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCQkJCQllLmdjLnNldENsaXBwaW5nKGNsaWVudFJlY3QpOwotCQkJCQkJCQllLmdjLnNldEJhY2tncm91bmQoRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJCQkJCQkuZ2V0U3lzdGVtQ29sb3IoMTUpKTsKLQkJCQkJCQkJZS5nYy5maWxsUmVjdGFuZ2xlKGNsaWVudFJlY3QpOwotCQkJCQkJCQllLmdjLmRyYXdJbWFnZShub2RlSW1hZ2UsCi0JCQkJCQkJCQkJbm9kZUltYWdlLmdldEJvdW5kcygpLngsIG5vZGVJbWFnZQotCQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLnksIG5vZGVJbWFnZQotCQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLndpZHRoLCBub2RlSW1hZ2UKLQkJCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS5oZWlnaHQsIHBhbmUzCi0JCQkJCQkJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpLngsIHBhbmUzCi0JCQkJCQkJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpLnksIHBhbmUzCi0JCQkJCQkJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpLndpZHRoLCBwYW5lMwotCQkJCQkJCQkJCQkJLmdldENsaWVudEFyZWEoKS5oZWlnaHQpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmICh3YXJuaW5nQ291bnQgPT0gMSkgewotCQkJCQkJCQkJd2FybmluZ0NvdW50Kys7Ci0JCQkJCQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmcsIChuZXcgT2JqZWN0W10geyBjb250ZW50RWxlbWVudC5nZXROYW1lKCksIHBhdGggfSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlNc2dCb3guc2hvd1dhcm5pbmcobXNnKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3IsIChuZXcgT2JqZWN0W10geyBleC5nZXRNZXNzYWdlKCkgfSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCQlwYW5lMy5yZWRyYXcoKTsKLQkJaWYoY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKSAhPSBudWxsKXsKLQkJCW5vZGVJY29uUGF0aC5zZXRUZXh0KGNvbnRlbnRFbGVtZW50LmdldE5vZGVpY29uKCkuZ2V0UGF0aCgpKTsKLQkJfQotCX0KLQotCQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVNlY3Rpb25zKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWlmIChnZW5lcmFsU2VjdGlvbk9uKSB7Ci0JCQlnZW5lcmFsU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJZ2VuZXJhbFNlY3Rpb24uc2V0RXhwYW5kZWQoZ2VuZXJhbFNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZ2VuZXJhbFNlY3Rpb25FeHBhbmRGbGFnID0gZ2VuZXJhbFNlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJCWdlbmVyYWxTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGV0YWlsU2VjdGlvbk9uKSB7Ci0JCQlkZXRhaWxTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJCWlmIChlbmFibGUpIHsKLQkJCQlkZXRhaWxTZWN0aW9uLnNldEV4cGFuZGVkKGRldGFpbFNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGV0YWlsU2VjdGlvbkV4cGFuZEZsYWcgPSBkZXRhaWxTZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCQlkZXRhaWxTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5vdGF0aW9uU2VjdGlvbk9uKSB7Ci0JCQlub3RhdGlvblNlY3Rpb24uc2V0VmlzaWJsZShlbmFibGUpOwotCQkJaWYgKGVuYWJsZSkgewotCQkJCW5vdGF0aW9uU2VjdGlvbi5zZXRFeHBhbmRlZChub3RhdGlvblNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbm90YXRpb25TZWN0aW9uRXhwYW5kRmxhZyA9IG5vdGF0aW9uU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJbm90YXRpb25TZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRhaWxvcmluZ1NlY3Rpb25PbikgewotCQkJdGFpbG9yaW5nU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJdGFpbG9yaW5nU2VjdGlvbi5zZXRFeHBhbmRlZCh0YWlsb3JpbmdTZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCQl9IGVsc2UgewotCQkJCXRhaWxvcmluZ1NlY3Rpb25FeHBhbmRGbGFnID0gdGFpbG9yaW5nU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJdGFpbG9yaW5nU2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQkJfQotCQl9Ci0JCWlmICh2ZXJzaW9uU2VjdGlvbk9uKSB7Ci0JCQl2ZXJzaW9uU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJdmVyc2lvblNlY3Rpb24uc2V0RXhwYW5kZWQodmVyc2lvblNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvblNlY3Rpb25FeHBhbmRGbGFnID0gdmVyc2lvblNlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJCXZlcnNpb25TZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGljb25TZWN0aW9uT24pIHsKLQkJCWljb25TZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJCWlmIChlbmFibGUpIHsKLQkJCQlpY29uU2VjdGlvbi5zZXRFeHBhbmRlZChpY29uU2VjdGlvbkV4cGFuZEZsYWcpOwotCQkJfSBlbHNlIHsKLQkJCQlpY29uU2VjdGlvbkV4cGFuZEZsYWcgPSBpY29uU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJaWNvblNlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJCX0KLQkJfQotCQlpZiAodmFyaWFiaWxpdHlTZWN0aW9uT24pIHsKLQkJCXZhcmlhYmlsaXR5U2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJdmFyaWFiaWxpdHlTZWN0aW9uLnNldEV4cGFuZGVkKGVsZW1lbnRTZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCQl9IGVsc2UgewotCQkJCWVsZW1lbnRTZWN0aW9uRXhwYW5kRmxhZyA9IHZhcmlhYmlsaXR5U2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJdmFyaWFiaWxpdHlTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoc2hhcGVJbWFnZSAhPSBudWxsKSB7Ci0JCQlzaGFwZUltYWdlLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobm9kZUltYWdlICE9IG51bGwpIHsKLQkJCW5vZGVJbWFnZS5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGxhYmVsUHJvdmlkZXJWYXJpYWJpbGl0eSAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyVmFyaWFiaWxpdHkuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChjb250ZW50UHJvdmlkZXJWYXJpYWJpbGl0eSAhPSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXJWYXJpYWJpbGl0eS5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGxhYmVsUHJvdmlkZXJCYXNlICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXJCYXNlLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY29weXJpZ2h0TGFiZWxQcm92aWRlckJhc2UgIT0gbnVsbCkgewotCQkJY29weXJpZ2h0TGFiZWxQcm92aWRlckJhc2UuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCi0JCWRpc3Bvc2VkID0gdHJ1ZTsKLQl9CQkKLQotCXByaXZhdGUgdm9pZCBzZXRDb3B5cmlnaHRCdXR0b25EZXNlbGVjdCgpIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldENvcHlyaWdodFN0YXRlbWVudCgpICE9IG51bGwpIHsKLQkJCWNvcHlyaWdodF9idXR0b25fZGVzZWxlY3QKLQkJCQkJLnNldEVuYWJsZWQoKGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkJLmdldENvcHlyaWdodFN0YXRlbWVudCgpLmdldE5hbWUoKSA9PSBudWxsKSA/IGZhbHNlCi0JCQkJCQkJOiB0cnVlKTsKLQkJfSBlbHNlCi0JCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LnNldEVuYWJsZWQoZmFsc2UpOwotCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpCi0JCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDb250ZXh0SGVscCgpIHsKLQkJaWYgKHNlY3Rpb25Db21wb3NpdGUgIT0gbnVsbCkgewotCQkJRWRpdG9yc0NvbnRleHRIZWxwZXIuc2V0SGVscChzZWN0aW9uQ29tcG9zaXRlLmdldFBhcmVudCgpLAotCQkJCQlnZXRDb250ZW50RWxlbWVudCgpKTsKLQkJfQotCQlpZiAoZXhwYW5kZWRDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQkJZXhwYW5kZWRDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLlJJQ0hfVEVYVF9FRElUT1JfQ09OVEVYVF9JRCk7Ci0JCX0KLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSVJlZnJlc2hhYmxlI3JlZnJlc2hOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJaWYgKChjdHJsX25hbWUgIT0gbnVsbCkgJiYgIShjdHJsX25hbWUuaXNEaXNwb3NlZCgpKSkgewotCQkJCWN0cmxfbmFtZS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX25hbWUuc2V0VGV4dChuZXdOYW1lKTsKLQkJCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJc2V0Rm9ybVRleHRXaXRoVmFyaWFibGVJbmZvKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpewotCQkKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24oKXsKLQkJaWYoZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIGRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlyZXR1cm4gQXV0aG9yaW5nVUlUZXh0LkRFVEFJTF9TRUNUSU9OX0RFU0M7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0R2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbigpewotCQlpZihnZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uIT0gbnVsbCl7Ci0JCQlyZXR1cm4gZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlyZXR1cm4gQXV0aG9yaW5nVUlUZXh0LkdFTkVSQUxfSU5GT19TRUNUSU9OX0RFU0M7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFpbG9yaW5nU2VjdGlvbkRlc2NyaXB0aW9uKCl7Ci0JCWlmKHRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbiAhPSBudWxsKXsKLQkJCXJldHVybiB0YWlsb3JpbmdTZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5UQUlMT1JJTkdfU0VDVElPTl9ERVNDOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uKCl7Ci0JCWlmKG5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIG5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCXJldHVybiBBdXRob3JpbmdVSVRleHQuTk9UQVRJT05fU0VDVElPTl9ERVNDOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uKCl7Ci0JCWlmKHZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIHZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCXJldHVybiBBdXRob3JpbmdVSVRleHQuVkFSSUFCSUxJVFlfU0VDVElPTl9ERVNDOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRJY29uU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHVicwotCQlpZihpY29uU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIGljb25TZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5JQ09OX1NFQ1RJT05fREVTQzsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlpZih2ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIHZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5WRVJTSU9OX0lORk9fU0VDVElPTl9ERVNDOwotCX0KLQotCS8qKiAKLQkgKiBGb2xsb3dpbmcgbWV0aG9kcyBiZWxvdyBleHBvc2VkIHB1YmxpYyBpbiBvcmRlciB0byBhbGxvdyAKLQkgKiB0ZXN0IGF1dG9tYXRpb24gdG8gYWNjZXNzIHRoZSBmb3JtIG9iamVjdHMgdGhyb3VnaCB0ZXN0IG9iamVjdHMKLQkgKiBvZiBhbnkgYXV0b21hdGlvbiB0b29scy4KLQkgKi8KLQkKLQkvKioKLQkgKiBHZXQgYnJpZWYgZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN0cmxfYnJpZWZfZGVzYy4KLQkgKi8KLQlwdWJsaWMgVGV4dCBnZXRDdHJsX2JyaWVmX2Rlc2MoKSB7Ci0JCXJldHVybiBjdHJsX2JyaWVmX2Rlc2M7Ci0JfQotCi0JLyoqCi0JICogU2V0IGJyaWVmIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGN0cmxfYnJpZWZfZGVzYyBUaGUgY3RybF9icmllZl9kZXNjIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdHJsX2JyaWVmX2Rlc2MoVGV4dCBjdHJsX2JyaWVmX2Rlc2MpIHsKLQkJdGhpcy5jdHJsX2JyaWVmX2Rlc2MgPSBjdHJsX2JyaWVmX2Rlc2M7Ci0JfQotCi0JLyoqCi0JICogR2V0IG1haW4gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN0cmxfZnVsbF9kZXNjLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUmljaFRleHQgZ2V0Q3RybF9mdWxsX2Rlc2MoKSB7Ci0JCXJldHVybiBjdHJsX2Z1bGxfZGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbWFpbiBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBjdHJsX2Z1bGxfZGVzYyBUaGUgY3RybF9mdWxsX2Rlc2MgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN0cmxfZnVsbF9kZXNjKElNZXRob2RSaWNoVGV4dCBjdHJsX2Z1bGxfZGVzYykgewotCQl0aGlzLmN0cmxfZnVsbF9kZXNjID0gY3RybF9mdWxsX2Rlc2M7Ci0JfQotCi0JLyoqCi0JICogR2V0IHByZXNlbnRhdGlvbiBuYW1lCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lLgotCSAqLwotCXB1YmxpYyBUZXh0IGdldEN0cmxfcHJlc2VudGF0aW9uX25hbWUoKSB7Ci0JCXJldHVybiBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCBwcmVzZW50YXRpb24gbmFtZQotCSAqIEBwYXJhbSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lIFRoZSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdHJsX3ByZXNlbnRhdGlvbl9uYW1lKFRleHQgY3RybF9wcmVzZW50YXRpb25fbmFtZSkgewotCQl0aGlzLmN0cmxfcHJlc2VudGF0aW9uX25hbWUgPSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lOwotCX0KLQotCS8qKgotCSAqIEdldCBleHBhbmRlZCByaWNoIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3RybF9leHBhbmRlZC4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGdldEN0cmxfZXhwYW5kZWQoKSB7Ci0JCXJldHVybiBjdHJsX2V4cGFuZGVkOwotCX0KLQotCS8qKgotCSAqIFNldCBleHBhbmRlZCByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBjdHJsX2V4cGFuZGVkIFRoZSBjdHJsX2V4cGFuZGVkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdHJsX2V4cGFuZGVkKElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2V4cGFuZGVkKSB7Ci0JCXRoaXMuY3RybF9leHBhbmRlZCA9IGN0cmxfZXhwYW5kZWQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHJpY2ggdGV4dCBjb250cm9sCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdHJsX2tleS4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFJpY2hUZXh0IGdldEN0cmxfa2V5KCkgewotCQlyZXR1cm4gY3RybF9rZXk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHJpY2ggdGV4dCBjb250cm9sCi0JICogQHBhcmFtIGN0cmxfa2V5IFRoZSBjdHJsX2tleSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3RybF9rZXkoSU1ldGhvZFJpY2hUZXh0IGN0cmxfa2V5KSB7Ci0JCXRoaXMuY3RybF9rZXkgPSBjdHJsX2tleTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5QYXRoKE1ldGhvZEVsZW1lbnQgZSl7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJaWYocGx1Z2luICE9IG51bGwpewotCQkJRmlsZSBsaWJEaXJzID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSk7Ci0JCQlTdHJpbmcgcmVzb3VyY2VMb2MgPSBsaWJEaXJzLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmdldEVsZW1lbnRQYXRoKHBsdWdpbik7Ci0JCQlyZXR1cm4gcmVzb3VyY2VMb2M7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lRGVzY3JpcHRpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOWM2Y2QyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBEb21haW4gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJkaXNjaXBsaW5lRGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBEaXNjaXBsaW5lIGRpc2NpcGxpbmU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lRGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZGlzY2lwbGluZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gc2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcKLQkJKChDYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlkaXNjaXBsaW5lKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUzsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZUdyb3VwaW5nRGVzY3JpcHRpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZUdyb3VwaW5nRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyNTAwZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUdyb3VwaW5nRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRpc2NpcGxpbmVHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGlzY2lwbGluZUdyb3VwaW5nIGRpc2NpcGxpbmVHcm91cGluZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZGlzY2lwbGluZUdyb3VwaW5nID0gKERpc2NpcGxpbmVHcm91cGluZykgY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBTZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZy4KLQkJKChDYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlkaXNjaXBsaW5lR3JvdXBpbmcpIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lZ3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZWdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZWdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZWZhYmZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEaXNjaXBsaW5lcyBwYWdlIGluIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJkaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBEaXNjaXBsaW5lR3JvdXBpbmcgZGlzY2lwbGluZUdyb3VwaW5nOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuRElTQ0lQTElORVNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlkaXNjaXBsaW5lR3JvdXBpbmcgPSAoRGlzY2lwbGluZUdyb3VwaW5nKSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKERpc2NpcGxpbmVHcm91cGluZykgb2JqZWN0KS5nZXREaXNjaXBsaW5lcygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksCi0JCQkJCWRpc2NpcGxpbmVHcm91cGluZywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCksCi0JCQkJCWFkZEl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQlkaXNjaXBsaW5lR3JvdXBpbmcsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpLAotCQkJCQlybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmVHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNWYzZjUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5SZWZlcmVuY2VXb3JrRmxvd0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBSZWZlcmVuY2UgV29ya2Zsb3cgcGFnZSBpbiB0aGUgRGlzY2lwbGluZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERpc2NpcGxpbmUgZGlzY2lwbGluZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlJFRkVSRU5DRV9XT1JLRkxPV19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKHRydWUpOwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBkaXNjaXBsaW5lLmdldFJlZmVyZW5jZVdvcmtmbG93cygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0JCQkvLyBpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJLy8gUHJvY2VzcyBwcm9jZXNzID0KLQkJCS8vIChQcm9jZXNzKSgoUHJvY2Vzc0NvbXBvbmVudClvYmplY3QpLmdldFByb2Nlc3MoKTsKLQkJCS8vIGlmIChwcm9jZXNzICE9IG51bGwpIHsKLQkJCS8vIGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJLy8gZGlzY2lwbGluZSwKLQkJCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCksIHByb2Nlc3MsCi0JCQkvLyAtMSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyBlbHNlIHsKLQkJCS8vIGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJLy8gZGlzY2lwbGluZSwKLQkJCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCksIG9iamVjdCwKLQkJCS8vIC0xKTsKLQkJCS8vIH0KLQkJCU1ldGhvZEVsZW1lbnQgb2JqZWN0ID0gKE1ldGhvZEVsZW1lbnQpIGl0b3IubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlvYmplY3QgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkuZ2V0UHJvY2VzcygpOwotCQkJfQotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCk7Ci0JCQkJaWYgKFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeU9wcG9zaXRlKGRpc2NpcGxpbmUsCi0JCQkJCQlmZWF0dXJlLCBvYmplY3QpKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWRpc2NpcGxpbmUsIGZlYXR1cmUsIG9iamVjdCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksCi0JCQkJCWRpc2NpcGxpbmUsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCksCi0JCQkJCXJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZGlzY2lwbGluZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlBST0NFU1NFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBSZWZlcmVuY2VXb3JrRmxvd0ZpbHRlcigpOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVUYXNrc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lVGFza3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkZmI4ZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVUYXNrc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFRhc2tzIHBhZ2UgaW4gdGhlIERpc2NpcGxpbmUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZVRhc2tzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJkaXNjaXBsaW5lVGFza3NQYWdlIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgRGlzY2lwbGluZSBkaXNjaXBsaW5lOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZVRhc2tzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlRBU0tTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKERpc2NpcGxpbmUpIG9iamVjdCkuZ2V0VGFza3MoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJCi0JCQkJLy8JY2hlY2sgdG8gbWFpbnRhaW4gbWFueS10by1vbmUgcnVsZSBmb3IgZG9tYWluLXdvcmtwcm9kdWN0Ci0vLwkJCQlMaXN0IGRpc2NpcGxpbmVzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZXModGFzayk7Ci0vLwkJCQlpZiAoZGlzY2lwbGluZXMgIT0gbnVsbCAmJiBkaXNjaXBsaW5lcy5zaXplKCkgPiAwKQl7Ci0vLwkJCQkJT2JqZWN0IGFzc29jaWF0ZWREaXNjaXBsaW5lID0gZGlzY2lwbGluZXMuZ2V0KDApOwotLy8JCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0vLwkJCQkJLmZvcm1hdCgKLS8vCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLlVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHMsCi0vLwkJCQkJCQluZXcgT2JqZWN0W10gewotLy8JCQkJCQkJCQl0YXNrLmdldE5hbWUoKSwKLS8vCQkJCQkJCQkJVG5nVXRpbAotLy8JCQkJCQkJCQkJCS5nZXRMYWJlbFdpdGhQYXRoKGFzc29jaWF0ZWREaXNjaXBsaW5lKSwKLS8vCQkJCQkJCQkJZGlzY2lwbGluZS5nZXROYW1lKCkgfSk7Ci0vLwkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dXYXJuaW5nKAotLy8JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIG1zZyk7Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJfQotCQkJCQotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9EaXNjaXBsaW5lKAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBkaXNjaXBsaW5lLCB0YXNrKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbURpc2NpcGxpbmUoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGRpc2NpcGxpbmUsIHRhc2spOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuVEFTS1M7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJaWYgKGdldEhlbHBlcigpLmlzQ29udHJpYnV0b3IoKENvbnRlbnRFbGVtZW50KSBvYmopKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFRhc2spOwotCQkJfQotCQl9OwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RvbWFpbkRlc2NyaXB0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RvbWFpbkRlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNThmZjRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Eb21haW5EZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRvbWFpbkRlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRG9tYWluIGRvbWFpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbkRlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZG9tYWluID0gKERvbWFpbikgY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkb21haW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERvbWFpbik7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gc2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcKLQkJKChDYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlkb21haW4pIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5fZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRG9tYWluV29ya1Byb2R1Y3RzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RvbWFpbldvcmtQcm9kdWN0c1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmM2ZTFlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRG9tYWluV29ya1Byb2R1Y3RzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLldvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBXb3JrIFByb2R1Y3RzIHBhZ2UgaW4gdGhlIERvbWFpbiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5Xb3JrUHJvZHVjdHNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRvbWFpbldvcmtQcm9kdWN0c1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERvbWFpbiBkb21haW47Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbldvcmtQcm9kdWN0c1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5XT1JLX1BST0RVQ1RTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZG9tYWluID0gKERvbWFpbikgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChEb21haW4pIG9iamVjdCkuZ2V0V29ya1Byb2R1Y3RzKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVdXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCQkvLyBjaGVjayB0byBtYWludGFpbiBtYW55LXRvLW9uZSBydWxlIGZvciBkb21haW4td29ya3Byb2R1Y3QKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlMaXN0IGRvbWFpbnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREb21haW5zKChXb3JrUHJvZHVjdCkgZWxlbWVudCk7Ci0JCQkJaWYgKGRvbWFpbnMgIT0gbnVsbCAmJiBkb21haW5zLnNpemUoKSA+IDApCXsKLQkJCQkJT2JqZWN0IGFzc29jaWF0ZWREb21haW4gPSBkb21haW5zLmdldCgwKTsKLQkJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQKLQkJCQkJLmZvcm1hdCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQllbGVtZW50LmdldE5hbWUoKSwKLQkJCQkJCQkJCVRuZ1V0aWwKLQkJCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgoYXNzb2NpYXRlZERvbWFpbiksCi0JCQkJCQkJCQlkb21haW4uZ2V0TmFtZSgpIH0pOwotCQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd1dhcm5pbmcoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIG1zZyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJLy8gY2hlY2sgaWYgdGhpcyBvcGVyYXRpb24gd2lsbCBtb2RpZnkgdGhlIGVsZW1lbnQgaW4gb3Bwb3NpdGUKLQkJCQkvLyBmZWF0dXJlIHZhbHVlCi0JCQkJLy8JCi0vLwkJCQlpZiAoIVVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeU9wcG9zaXRlKGRvbWFpbiwKLS8vCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpLCBlbGVtZW50KSkgewotLy8JCQkJCXJldHVybjsKLS8vCQkJCX0KLQkJCX0KLQotCQkJYWN0aW9uTWdyCi0JCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZG9tYWluLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSwKLQkJCQkJCQlhZGRJdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBkb21haW4sCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSwgcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkb21haW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCWlmIChnZXRIZWxwZXIoKS5pc0NvbnRyaWJ1dG9yKChDb250ZW50RWxlbWVudCkgb2JqKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9HdWlkYW5jZURlc2NyaXB0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxYWY0YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBpbiBhIEd1aWRhbmNlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAiZ3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgR3VpZGFuY2UgZ3VpZGFuY2U7Ci0KLQlwcml2YXRlIFN0cmluZyBlbGVtZW50TGFiZWw7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX2NvbnRlbnQ7Ci0KLQlwcml2YXRlIGludCBjb250ZW50RmllbGRIZWlnaHQgPSA0MDA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZ3VpZGFuY2UgPSAoR3VpZGFuY2UpIGNvbnRlbnRFbGVtZW50OwotCQllbGVtZW50TGFiZWwgPSBMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dChndWlkYW5jZSk7Ci0JCXNldEVsZW1lbnRUeXBlT24odHJ1ZSk7Ci0JCWlmIChndWlkYW5jZSBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKQotCQkJc2V0QnJpZWZEZXNjT24oZmFsc2UpOwotCQlzZXRGdWxsRGVzY09uKGZhbHNlKTsKLQkJc2V0S2V5Q29uc2lkZXJhdGlvbk9uKGZhbHNlKTsKLQkJc2V0SWNvblNlY3Rpb25Pbih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGb3JtUHJlZml4KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZvcm1QcmVmaXgoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKExpYnJhcnlVSVRleHQuVEVYVF9HVUlEQU5DRSkKLQkJCQkuYXBwZW5kKCIgKCIpLmFwcGVuZChlbGVtZW50TGFiZWwpLmFwcGVuZCgiKTogIikudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXRvciB0YWIgY29udGVudAotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlzdXBlci5jcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCQljdHJsX2NvbnRlbnQgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5NQUlOX0RFU0NSSVBUSU9OX1RFWFQsCi0JCQkJY29udGVudEZpZWxkSGVpZ2h0LCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkJY3RybF9jb250ZW50LnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9jb250ZW50LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQljdHJsX2NvbnRlbnQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9jb250ZW50LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9jb250ZW50OwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBndWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJLmdldE1haW5EZXNjcmlwdGlvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNyZWZyZXNoKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXN1cGVyLnJlZnJlc2goZWRpdGFibGUpOwotCQljdHJsX2NvbnRlbnQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWREYXRhKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3VwZXIubG9hZERhdGEoKTsKLQkJaWYgKGd1aWRhbmNlICE9IG51bGwpIHsKLQkJCVN0cmluZyBjb250ZW50ID0gbnVsbDsKLQkJCWlmIChndWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJY29udGVudCA9IGd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpLmdldE1haW5EZXNjcmlwdGlvbigpOwotCQkJfQotCQkJY3RybF9jb250ZW50LnNldFRleHQoY29udGVudCA9PSBudWxsID8gIiIgOiBjb250ZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBndWlkYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIE1haW4gRGVzY3JpcHRpb24gdGV4dCBib3guCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50RmllbGRIZWlnaHQoKSB7Ci0JCXJldHVybiBjb250ZW50RmllbGRIZWlnaHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBNYWluIERlc2NyaXB0aW9uIHRleHQgYm94LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRGaWVsZEhlaWdodChpbnQgY29udGVudEZpZWxkSGVpZ2h0KSB7Ci0JCXRoaXMuY29udGVudEZpZWxkSGVpZ2h0ID0gY29udGVudEZpZWxkSGVpZ2h0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCQlyZXR1cm4gKCgoQ29udGVudEVsZW1lbnQpIG9iaikuZ2V0VHlwZSgpCi0JCQkJCQkJLmVxdWFscygoKEd1aWRhbmNlKSBjb250ZW50RWxlbWVudCkuZ2V0VHlwZSgpKSk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQotCQkvLyBTZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZy4KLQkJKChDb250ZW50RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCWd1aWRhbmNlKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXaGl0ZXBhcGVyKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndoaXRlcGFwZXJfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndoaXRlcGFwZXJfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud2hpdGVwYXBlcl9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb25jZXB0KXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmNlcHRfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmNlcHRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uY2VwdF9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDaGVja2xpc3QpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja2xpc3RfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoZWNrbGlzdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoZWNrbGlzdF9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBFeGFtcGxlKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4YW1wbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4YW1wbGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4YW1wbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5leGFtcGxlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXhhbXBsZV9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkZWxpbmUpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ3VpZGVsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5ndWlkZWxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmd1aWRlbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmd1aWRlbGluZV9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVzdGltYXRpb25jb25zaWRlcmF0aW9uX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25faWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUHJhY3RpY2UpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN1cHBvcnRpbmdtYXRlcmlhbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdXBwb3J0aW5nbWF0ZXJpYWxfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdXBwb3J0aW5nbWF0ZXJpYWxfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdXBwb3J0aW5nbWF0ZXJpYWxfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVwb3J0KXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcG9ydF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwb3J0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBvcnRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBvcnRfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9hZG1hcCl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2FkbWFwX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2FkbWFwX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2FkbWFwX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9hZG1hcF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvYWRtYXBfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGVtcGxhdGUpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlbXBsYXRlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZW1wbGF0ZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlbXBsYXRlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGVybURlZmluaXRpb24pewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVybWRlZmluaXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlcm1kZWZpbml0aW9uX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZXJtZGVmaW5pdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVybWRlZmluaXRpb25faWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXN1YWJsZWFzc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVzdWFibGVhc3NldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJldXNhYmxlYXNzZXRfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVG9vbE1lbnRvcil7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sbWVudG9yX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sbWVudG9yX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sbWVudG9yX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbG1lbnRvcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9HdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxNDc1Y2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGluIGEgR3VpZGFuY2UgKHdpdGggYXR0YWNobWVudHMpIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UgewotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hdHRhY2gsIGN0cmxfZGV0YWNoOyAvLyAsIGN0cmxfcmVtb3ZlOwotCi0JcHJpdmF0ZSBMaXN0IGN0cmxfYXR0YWNoZWRfZmlsZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0VfQVRUQUNITUVOVF9MQVNUX0RJUkVDVE9SWV9CUk9XU0VEX1BSRUYgPSAiZ3VpZGFuY2VfYXR0YWNobWVudF9sYXN0X2Rpcl9icm93c2VkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VXaXRoQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjY3JlYXRlRWRpdG9yQ29udGVudChvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlzdXBlci5jcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCi0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkFUVEFDSEVEX0ZJTEVfVEVYVCwgMik7Ci0JCWN0cmxfYXR0YWNoZWRfZmlsZXMgPSBuZXcgTGlzdChnZW5lcmFsQ29tcG9zaXRlLCBTV1QuU0lOR0xFCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlHcmlkRGF0YSBsaXN0R3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkJFR0lOTklORywKLQkJCQl0cnVlLCB0cnVlKTsKLQkJbGlzdEdyaWREYXRhLmhlaWdodEhpbnQgPSAzMDsKLQkJbGlzdEdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJY3RybF9hdHRhY2hlZF9maWxlcy5zZXRMYXlvdXREYXRhKGxpc3RHcmlkRGF0YSk7Ci0KLQkJY3RybF9hdHRhY2hlZF9maWxlcy5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwKLQkJCQlGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCTEpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDE7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQkJY3RybF9hdHRhY2ggPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBBVFRBQ0hfQlVUVE9OKTsKLQkJY3RybF9kZXRhY2ggPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBERVRBQ0hfQlVUVE9OKTsKLQkJLy8gY3RybF9yZW1vdmUgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBSRU1PVkVfQlVUVE9OKTsKLQotCQlsYWJlbF9iYXNlLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkJBU0VfRUxFTUVOVF9URVhUKTsKLQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCWZpbmFsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQljdHJsX2F0dGFjaC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpKTsKLQkJCQlkaWFsb2cKLQkJCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmF0dGFjaEd1aWRhbmNlRmlsZURpYWxvZ190aXRsZSk7IAotCQkJCVN0cmluZyBsYXN0RGlyID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCQkJLmdldFN0cmluZygKLQkJCQkJCQkJR1VJREFOQ0VfQVRUQUNITUVOVF9MQVNUX0RJUkVDVE9SWV9CUk9XU0VEX1BSRUYpOwotCQkJCWlmIChsYXN0RGlyICE9IG51bGwgJiYgbGFzdERpci50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGxhc3REaXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkKLQkJCQkJCQkrIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJKyBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChndWlkYW5jZSkpOwotCQkJCX0KLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCWlmIChkaWFsb2cuZ2V0RmlsZU5hbWUoKSAhPSBudWxsICYmIGRpYWxvZy5nZXRGaWxlTmFtZSgpICE9ICIiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdHJ5IHsKLQkJCQkJCUZpbGUgZmlsZVRvQXR0YWNoID0gbmV3IEZpbGUoZGlhbG9nLmdldEZpbHRlclBhdGgoKSwKLQkJCQkJCQkJZGlhbG9nLmdldEZpbGVOYW1lKCkpOwotCQkJCQkJU3RyaW5nIGZpbGVVcmwgPSBSZXNvdXJjZUhlbHBlci5nZXRVUkxGb3JBdHRhY2htZW50KAotCQkJCQkJCQlmaWxlVG9BdHRhY2gsIGd1aWRhbmNlLCB0cnVlKTsKLQkJCQkJCWlmIChjdHJsX2F0dGFjaGVkX2ZpbGVzLmluZGV4T2YoZmlsZVVybCkgIT0gLTEpIHsKLQkJCQkJCQkvLyBmaWxlIGlzIGFscmVhZHkgYW4gYXR0YWNobWVudAotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dCwgCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlX2FscmVhZHlBdHRhY2hlZF9tc2cpOyAKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQljdHJsX2F0dGFjaGVkX2ZpbGVzLmFkZChmaWxlVXJsKTsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSwKLQkJCQkJCQkJZ2V0RmlsZXNGcm9tTGlzdEN0cmwoKSwgLTEpOwotCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCQkJCS5zZXRWYWx1ZSgKLQkJCQkJCQkJCQkJR1VJREFOQ0VfQVRUQUNITUVOVF9MQVNUX0RJUkVDVE9SWV9CUk9XU0VEX1BSRUYsCi0JCQkJCQkJCQkJCWRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gVE9ETzogRGlzcGxheSBhbiBlcnJvciBkaWFsb2cuCi0JCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9kZXRhY2guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY3RybF9hdHRhY2hlZF9maWxlcy5yZW1vdmUoY3RybF9hdHRhY2hlZF9maWxlcwotCQkJCQkJLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpLAotCQkJCQkJZ2V0RmlsZXNGcm9tTGlzdEN0cmwoKSwgLTEpOwotCi0JCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJLy8gY3RybF9hdHRhY2hlZF9maWxlcy5zZXRUZXh0KG9sZENvbnRlbnQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBjdHJsX3JlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQkvLyBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vIC8vY3RybF9hdHRhY2hlZF9maWxlcy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBTdHJpbmcgb2xkQ29udGVudCA9Ci0JCS8vICgoR3VpZGFuY2VEZXNjcmlwdGlvbilndWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QXR0YWNobWVudHMoKTsKLQkJLy8gY3RybF9hdHRhY2hlZF9maWxlcy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCS8vIGd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpLAotCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCksCi0JCS8vIGN0cmxfYXR0YWNoZWRfZmlsZXMuZ2V0VGV4dCgpLCAtMSk7Ci0JCS8vIGlmKCFzdGF0dXMpewotCQkvLyAvL2N0cmxfYXR0YWNoZWRfZmlsZXMuc2V0VGV4dChvbGRDb250ZW50KTsKLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI3JlZnJlc2goYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJc3VwZXIucmVmcmVzaChlZGl0YWJsZSk7Ci0JCWN0cmxfYXR0YWNoLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX2RldGFjaC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJLy8gY3RybF9yZW1vdmUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBpbml0aWFsIGRhdGEgZnJvbSBtb2RlbAotCSAqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI2xvYWREYXRhKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3VwZXIubG9hZERhdGEoKTsKLQkJaWYgKGd1aWRhbmNlICE9IG51bGwpIHsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQkJU3RyaW5nIHRoaXJkcGFydHlmb3JtYXQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbikgY29udGVudCkKLQkJCQkJLmdldEF0dGFjaG1lbnRzKCk7Ci0JCQlzZXRGaWxlc1RvTGlzdEN0cmwodGhpcmRwYXJ0eWZvcm1hdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIHN0cmluZyBvZiBmaWxlcywgYWRkIHRoZSBmaWxlcyB0byB0aGUgTGlzdCBjb250cm9sCi0JICogCi0JICogQHBhcmFtIGZpbGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEZpbGVzVG9MaXN0Q3RybChTdHJpbmcgZmlsZVN0cmluZykgewotCQlqYXZhLnV0aWwuTGlzdCBhdHRhY2htZW50TGlzdCA9IFRuZ1V0aWwKLQkJCQkuY29udmVydEd1aWRhbmNlQXR0YWNobWVudHNUb0xpc3QoZmlsZVN0cmluZyk7Ci0JCWN0cmxfYXR0YWNoZWRfZmlsZXMucmVtb3ZlQWxsKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0YWNobWVudExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgYXR0YWNobWVudCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJY3RybF9hdHRhY2hlZF9maWxlcy5hZGQoYXR0YWNobWVudCk7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdGhlIGxpc3Qgb2YgZmlsZXMgYXMgYSBzdHJpbmcKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZXNGcm9tTGlzdEN0cmwoKSB7Ci0JCVN0cmluZyBmaWxlc1tdID0gY3RybF9hdHRhY2hlZF9maWxlcy5nZXRJdGVtcygpOwotCQlyZXR1cm4gVG5nVXRpbC5jb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvU3RyaW5nKEFycmF5cy5hc0xpc3QoZmlsZXMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JRXh0ZW5zaW9uRm9ybVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JRXh0ZW5zaW9uRm9ybVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTE5ZjUzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvSUV4dGVuc2lvbkZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuSUZvcm1QYWdlOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBiZSB1c2VkIGZvciBhbGwgcGFnZXMgYWRkZWQgdGhyb3VnaCBleHRlbnNpb24gcG9pbnRzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUV4dGVuc2lvbkZvcm1QYWdlICAgewotCi0JLyoqCi0JICogU2V0IGVkaXRvciBmb3IgZm9ybSBwYWdlCi0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBJRm9ybVBhZ2Ugc2V0RWRpdG9yKEZvcm1FZGl0b3IgZWRpdG9yKSA7Ci0JCi0JLyoqCi0JICogU2V0IGlucHV0IGZvciBmb3JtIHBhZ2UKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0lSZWZyZXNoYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0lSZWZyZXNoYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYWE2YTQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JUmVmcmVzaGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gcmVmcmVzaCBhIGZvcm0gdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW4gY2FzZSBvZiBtb2RlbCBjaGFuZ2Ugb3V0c2lkZSBvZiB0aGUgZm9ybQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hhYmxlIHsKLQkKLQkvKioKLQkgKiBSZWZyZXNoIG5hbWUgb2YgdGhlIGZvcm0KLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqLwotCXZvaWQgcmVmcmVzaE5hbWUoU3RyaW5nIG5ld05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL01ldGhvZEZvcm1Ub29sa2l0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kRm9ybVRvb2xraXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDNjOTMwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kRm9ybVRvb2xraXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRGVjb3JhdGVkRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBBIGhlbHAgY2xhc3MgZm9yIGNyZWF0aW5nIFVJIHdpZGdldHMgYWRhcHRlZCBhZGFwdGVkIHRvIHdvcmsgaW4gRWNsaXBzZQotICogZm9ybXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRm9ybVRvb2xraXQgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIFJpY2ggVGV4dCBjb250cm9sIGFuZCBhZGFwdHMgaXQgdG8gYmUgdXNlZCBpbiBhIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgaW5pdGlhbCB0ZXh0IGZvciB0aGUgdmlld2VyLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWwgc3R5bGUgZm9yIHRoZSB2aWV3ZXIuCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICBUaGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBocmVmcy4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPklNZXRob2RSaWNoVGV4dDwvY29kZT4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWV0aG9kUmljaFRleHQgY3JlYXRlUmljaFRleHQoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCwKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCwgRGVjb3JhdGVkRmllbGQgbGFiZWwpIHsKLQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gbmV3IE1ldGhvZFJpY2hUZXh0KHBhcmVudCwgc3R5bGUsIGJhc2VQYXRoKTsKLQkJcmljaFRleHQuaW5pdChtZXRob2RFbGVtZW50LCBsYWJlbCk7Ci0JCXJpY2hUZXh0LmdldENvbnRyb2woKS5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwKLQkJCQlGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldFRleHQodGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBSaWNoIFRleHQgZWRpdG9yIGFuZCBhZGFwdHMgaXQgdG8gYmUgdXNlZCBpbiBhIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgaW5pdGlhbCB0ZXh0IGZvciB0aGUgdmlld2VyLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWwgc3R5bGUgZm9yIHRoZSB2aWV3ZXIuCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICBUaGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBocmVmcy4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPklNZXRob2RSaWNoVGV4dEVkaXRvcjwvY29kZT4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWV0aG9kUmljaFRleHRFZGl0b3IgY3JlYXRlUmljaFRleHRFZGl0b3IoCi0JCQlGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlLAotCQkJU3RyaW5nIGJhc2VQYXRoLCBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQsIERlY29yYXRlZEZpZWxkIGxhYmVsLCBJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlKSB7Ci0JCUlNZXRob2RSaWNoVGV4dEVkaXRvciBlZGl0b3IgPSBuZXcgTWV0aG9kUmljaFRleHRFZGl0b3IocGFyZW50LCBzdHlsZSwKLQkJCQliYXNlUGF0aCwgbWV0aG9kRWxlbWVudCwgbGFiZWwsIGVkaXRvclNpdGUpOwotCQllZGl0b3IuZ2V0Q29udHJvbCgpLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLAotCQkJCUZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJZWRpdG9yLnNldFRleHQodGV4dCk7Ci0JCX0KLQkJcmV0dXJuIGVkaXRvcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL01ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExZjFmZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL01ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLQotLyoqCi0gKiBEZXNjcmlwdGlvbiBwYWdlIGZvciBtZXRob2QgbGlicmFyeQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2UgZXh0ZW5kcyBGb3JtUGFnZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UID0gMjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX25hbWU7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZl9kZXNjOwotCi0JcHJpdmF0ZSBTZWN0aW9uIGdlbmVyYWxTZWN0aW9uOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZTsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCi0JcHJpdmF0ZSBUZXh0IHRleHRBdXRob3JzOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfY2hhbmdlX2RhdGU7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9jaGFuZ2VfZGVzYzsKLQotCXByaXZhdGUgVGV4dCBjdHJsX3ZlcnNpb247Ci0KLQlwcml2YXRlIFRleHQgY3RybF9jb3B5cmlnaHQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigKLQkJCQllZGl0b3IsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25QYWdlX3RpdGxlLCBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblBhZ2VfdGl0bGUpOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0KLQkJLy8gZ2V0IE1ldGhvZExpYnJhcnkgb2JqZWN0IGZyb20gRWRpdG9yIGlucHV0Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQotCQlPYmplY3Qgb2JqID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCWxpYnJhcnkgPSAoTWV0aG9kTGlicmFyeSkgb2JqOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZm9ybSBjb250ZW50LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2NyZWF0ZUZvcm1Db250ZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJLy8gY3JlYXRlIGZvcm0gdG9vbGtpdAotCQlTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5zZXRUZXh0KGdldEVkaXRvcigpLmdldFBhcnROYW1lKCkpOwotCi0JCVRhYmxlV3JhcExheW91dCBsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIENyZWF0ZSBlZGl0b3IgY29udGVudAotCQljcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQsIGZvcm0uZ2V0Qm9keSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWRpdG9yIHRhYiBjb250ZW50Ci0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcGFyYW0gZWRpdG9yQ29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBlZGl0b3JDb21wb3NpdGUpIHsKLQkJLy8gQ3JlYXRlIEdlbmVyYWwgSW5mb3JtYXRpb24gc2VjdGlvbgotCQlnZW5lcmFsU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihlZGl0b3JDb21wb3NpdGUsCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJZ2VuZXJhbFNlY3Rpb24KLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQlnZW5lcmFsU2VjdGlvbgotCQkJCS5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX2Rlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJZ2VuZXJhbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxTZWN0aW9uKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0Q2xpZW50KGdlbmVyYWxDb21wb3NpdGUpOwotCi0JCS8vIG5hbWUKLQkJTGFiZWwgbF9uYW1lID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5hbWVfdGV4dCk7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfbmFtZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULlNJTkdMRSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX25hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBicmllZiBkZXNjCi0JCUxhYmVsIGxfYnJpZWZfZGVzYyA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvbl90ZXh0KTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbF9icmllZl9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9icmllZl9kZXNjID0gdG9vbGtpdC5jcmVhdGVUZXh0KGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJIiIsIFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDAwOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIEF1dGhvcnMKLQkJTGFiZWwgbGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXV0aG9yc190ZXh0KTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQl0ZXh0QXV0aG9ycyA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCSIiLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQl0ZXh0QXV0aG9ycy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIENoYW5nZSBEYXRlCi0JCUxhYmVsIGxfY2hhbmdlZGF0ZSA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbF9jaGFuZ2VkYXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9jaGFuZ2VfZGF0ZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCSIiLCBTV1QuUkVBRF9PTkxZKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWN0cmxfY2hhbmdlX2RhdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBBdXRob3JzCi0JCUxhYmVsIGxfY2hhbmdlX2Rlc2MgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkNIQU5HRV9ERVNDUklQVElPTl9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlsX2NoYW5nZV9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9jaGFuZ2VfZGVzYyA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULk1VTFRJKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWN0cmxfY2hhbmdlX2Rlc2Muc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBWZXJzaW9uCi0JCUxhYmVsIGxfdmVyc2lvbiA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlsX3ZlcnNpb24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX3ZlcnNpb24gPSB0b29sa2l0LmNyZWF0ZVRleHQoZ2VuZXJhbENvbXBvc2l0ZSwgIiIsIFNXVC5NVUxUSSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX3ZlcnNpb24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJTGFiZWwgbF9jb3B5cmlnaHQgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29weXJpZ2h0X3RleHQpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlsX2NvcHlyaWdodC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljdHJsX2NvcHlyaWdodCA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX2NvcHlyaWdodC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGdlbmVyYWxDb21wb3NpdGUpOwotCi0JCWFkZExpc3RlbmVycygpOwotCQlsb2FkRGF0YSgpOwotCi0JCS8vIFNldCBmb2N1cyBvbiB0aGUgbmFtZSBhdHRyaWJ1dGUKLQkJRGlzcGxheSBkaXNwbGF5ID0gZWRpdG9yQ29tcG9zaXRlLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCVN0cmluZyBuYW1lID0gbGlicmFyeS5nZXROYW1lKCk7Ci0JCVN0cmluZyBicmllZl9kZXNjID0gbGlicmFyeS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0KLQkJY3RybF9uYW1lLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobmFtZSkpOwotCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChicmllZl9kZXNjKSk7Ci0JCXRleHRBdXRob3JzLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobGlicmFyeS5nZXRBdXRob3JzKCkpKTsKLQkJaWYgKGxpYnJhcnkuZ2V0Q2hhbmdlRGF0ZSgpICE9IG51bGwpIHsKLQkJCWN0cmxfY2hhbmdlX2RhdGUuc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChsaWJyYXJ5LmdldENoYW5nZURhdGUoKQotCQkJCQkudG9Mb2NhbGVTdHJpbmcoKSkpOwotCQl9Ci0JCWN0cmxfY2hhbmdlX2Rlc2Muc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChsaWJyYXJ5Ci0JCQkJLmdldENoYW5nZURlc2NyaXB0aW9uKCkpKTsKLQkJY3RybF92ZXJzaW9uLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobGlicmFyeS5nZXRWZXJzaW9uKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgZm9jdXMgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF9uYW1lLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlsaWJyYXJ5LnNldE5hbWUoY3RybF9uYW1lLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYnJpZWZfZGVzYy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJbGlicmFyeS5zZXRCcmllZkRlc2NyaXB0aW9uKGN0cmxfYnJpZWZfZGVzYy5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQotCQl0ZXh0QXV0aG9ycy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJbGlicmFyeS5zZXRBdXRob3JzKHRleHRBdXRob3JzLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfY2hhbmdlX2Rlc2MuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWxpYnJhcnkuc2V0Q2hhbmdlRGVzY3JpcHRpb24oY3RybF9jaGFuZ2VfZGVzYy5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX3ZlcnNpb24uYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWxpYnJhcnkuc2V0VmVyc2lvbihjdHJsX3ZlcnNpb24uZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9jb3B5cmlnaHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL01ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL01ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMzUzMWNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ2hhbmdlSGlzdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlbW92ZVJlZmVyZW5jZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlBsdWdpblJlZmVyZW5jZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRGVjb3JhdGVkRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5EYXRlRm9ybWF0OwotCi0vKioKLSAqIERlc2NyaXB0aW9uIHBhZ2UgZm9yIG1ldGhvZCBwbHVnaW4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NjM4MgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgQmFzZUZvcm1QYWdlIGltcGxlbWVudHMgSVJlZnJlc2hhYmxlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BSRUZJWCA9IExpYnJhcnlVSVRleHQuVEVYVF9NRVRIT0RfUExVR0lOCi0JCQkrICI6ICI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGV4dCBjdHJsX25hbWU7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZl9kZXNjLCBjdHJsX3JfYnJpZWZfZGVzYzsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjdHJsX3JlZk1vZGVsOwotCi0JcHJpdmF0ZSBTZWN0aW9uIGdlbmVyYWxTZWN0aW9uLCByZWZNb2RlbFNlY3Rpb247Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlLCByZWZNb2RlbENvbXBvc2l0ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBkZXNjRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiB2ZXJzaW9uU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgdmVyc2lvbkNvbXBvc2l0ZTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2F1dGhvcnM7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9jaGFuZ2VfZGF0ZTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2NoYW5nZV9kZXNjOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdmVyc2lvbjsKLQotCXByb3RlY3RlZCBib29sZWFuIHZlcnNpb25TZWN0aW9uT24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYW55QXR0cmlidXRlTW9kaWZpZWQgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fU0VDVElPTl9JRCA9IDM7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGN0cmxfdmVyc2lvbl9leHBhbmRlZDsKLQotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBleHBhbmRWZXJzaW9uTGluazsKLQotCXByb3RlY3RlZCBEZWNvcmF0ZWRGaWVsZCBleHBhbmRWZXJzaW9uTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGV4cGFuZGVkVmVyc2lvbkNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBtb2RlbE1vZGlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEdFTkVSQUxfU0VDVElPTl9JRCA9IDE7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBhY3RpdmVDb250cm9sOwotCi0JcHJvdGVjdGVkIExhYmVsIGxhYmVsX2NvcHlyaWdodDsKLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciBjb3B5cmlnaHRfdmlld2VyOwotCi0JcHJvdGVjdGVkIFRhYmxlIGN0cmxfY29weXJpZ2h0OwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvcHlyaWdodENvbnRlbnRQcm92aWRlcjsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlckJhc2UgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTs7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb3B5cmlnaHRfYnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY29weXJpZ2h0X2J1dHRvbl9kZXNlbGVjdDsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfY2hhbmdlYWJsZTsKLQotCXByaXZhdGUgQnV0dG9uIHZpZXdfaGlzdG9yeV9idXR0b247Ci0KLQlwdWJsaWMgYm9vbGVhbiBub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBBZGFwdGVyIHVzZXJDaGFuZ2VhYmxlQWRhcHRlcjsKLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgbmFtZU1vZGlmeUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFzdENoYW5nZUhpc3RvcnkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCi0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXVzZXJDaGFuZ2VhYmxlQWRhcHRlciA9IG5ldyBVc2VyQ2hhbmdlYWJsZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCQlPYmplY3Qgb2JqID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgb2JqOwotCQlpZiAodXNlckNoYW5nZWFibGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCXBsdWdpbi5lQWRhcHRlcnMoKS5hZGQodXNlckNoYW5nZWFibGVBZGFwdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLmNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCQljcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCQljcmVhdGVSZWZlcmVuY2VDb250ZW50KHRvb2xraXQpOwotCQlzZXRDb250ZXh0SGVscCgpOwotCQlsb2FkRGF0YSgpOwotCQlhZGRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q29udGV4dEhlbHAoKSB7Ci0JCWlmIChnZW5lcmFsQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJZ2VuZXJhbENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5QTFVHSU5fRURJVE9SX0RFU0NSSVBUSU9OX0FMTF9DT05URVhUKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXRvciBwYWdlIGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCWZvcm0uc2V0VGV4dChGT1JNX1BSRUZJWCArIHBsdWdpbi5nZXROYW1lKCkpOwotCi0JCS8vIENyZWF0ZSB0aGUgR2VuZXJhbCBzZWN0aW9uLgotCQlnZW5lcmFsU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0KLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkdFTkVSQUxfSU5GT19TRUNUSU9OX05BTUUpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXREZXNjcmlwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQlBdXRob3JpbmdVSVRleHQuR0VORVJBTF9JTkZPX1NFQ1RJT05fREVTQywKLQkJCQluZXcgU3RyaW5nW10geyBMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dExvd2VyKG1ldGhvZEVsZW1lbnQpIH0pKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWdlbmVyYWxDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShnZW5lcmFsU2VjdGlvbik7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldENsaWVudChnZW5lcmFsQ29tcG9zaXRlKTsKLQotCQkvLyBuYW1lCi0JCWN0cmxfbmFtZSA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0Lk5BTUVfVEVYVCk7Ci0KLQkJLy8gYnJpZWYgZGVzYwotCQljdHJsX2JyaWVmX2Rlc2MgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDIodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQlJJRUZfREVTQ1JJUFRJT05fVEVYVCk7Ci0KLQkJaWYgKHZlcnNpb25TZWN0aW9uT24pIHsKLQkJCWNyZWF0ZVZlcnNpb25TZWN0aW9uKHRvb2xraXQpOwotCQkJY3JlYXRlVmVyc2lvblNlY3Rpb25Db250ZW50KCk7Ci0JCX0KLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihnZW5lcmFsQ29tcG9zaXRlKTsKLQotCQkvLyBzZXQgZm9jdXMgb24gdGhlIG5hbWUgYXR0cmlidXRlCi0JCURpc3BsYXkgZGlzcGxheSA9IGZvcm0uZ2V0Qm9keSgpLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUmVmZXJlbmNlQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCS8vIFJlZiBNb2RlbCBTZWN0aW9uCi0JCXJlZk1vZGVsU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCVRhYmxlV3JhcERhdGEgdGQxID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQlyZWZNb2RlbFNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZDEpOwotCQlyZWZNb2RlbFNlY3Rpb24KLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVRleHQuUkVGRVJFTkNFRF9QTFVHSU5TX1NFQ1RJT05fTkFNRSk7Ci0JCXJlZk1vZGVsU2VjdGlvbgotCQkJCS5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVRleHQuUkVGRVJFTkNFRF9QTFVHSU5TX1NFQ1RJT05fREVTQyk7Ci0JCXJlZk1vZGVsU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJcmVmTW9kZWxDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShyZWZNb2RlbFNlY3Rpb24pOwotCQlyZWZNb2RlbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmVmTW9kZWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXJlZk1vZGVsU2VjdGlvbi5zZXRDbGllbnQocmVmTW9kZWxDb21wb3NpdGUpOwotCi0JCVRhYmxlIGN0cmxfdGFibGUgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKHJlZk1vZGVsQ29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQkJfCBHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDEwMDsKLQkJCWN0cmxfdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX3JlZk1vZGVsID0gbmV3IENoZWNrYm94VGFibGVWaWV3ZXIoY3RybF90YWJsZSk7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBlbGVtZW50OwotCQkJCXJldHVybiBwbHVnaW4uZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCQljdHJsX3JlZk1vZGVsLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0KLQkJTGFiZWwgbF9yX2JyaWVmX2Rlc2MgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKHJlZk1vZGVsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWxfcl9icmllZl9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9yX2JyaWVmX2Rlc2MgPSB0b29sa2l0LmNyZWF0ZVRleHQocmVmTW9kZWxDb21wb3NpdGUsCi0JCQkJIiIsIFNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMIHwgU1dULlJFQURfT05MWSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJCWN0cmxfcl9icmllZl9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocmVmTW9kZWxDb21wb3NpdGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDaGVja2JveEZvckN1cnJlbnRCYXNlKExpc3QgY3VycmVudEJhc2VMaXN0KSB7Ci0JCWN0cmxfcmVmTW9kZWwuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudEJhc2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gbW9kZWwgPSAoTWV0aG9kUGx1Z2luKSBjdXJyZW50QmFzZUxpc3QuZ2V0KGkpOwotCQkJY3RybF9yZWZNb2RlbC5zZXRDaGVja2VkKG1vZGVsLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQotCQlmb3JtLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCS8vIENsZWFyIHRoZSBvbGQgaXRlbXMgYW5kIGFkZCB0aGUgbmV3bHkgYWxsb3dhYmxlIGl0ZW1zLgotCQkJCWN0cmxfcmVmTW9kZWwuZ2V0VGFibGUoKS5jbGVhckFsbCgpOwotCQkJCWN0cmxfcmVmTW9kZWwucmVmcmVzaCgpOwotCi0JCQkJTGlzdCBhbGxvd2FibGVMaXN0ID0gUGx1Z2luUmVmZXJlbmNlQ2hlY2tlcgotCQkJCQkJLmdldEFwcGxpY2FibGVCYXNlUGx1Z2lucyhwbHVnaW4pOwotCQkJCWN0cmxfcmVmTW9kZWwuYWRkKGFsbG93YWJsZUxpc3QudG9BcnJheSgpKTsKLQotCQkJCUxpc3QgY3VycmVudEJhc2VMaXN0ID0gcGx1Z2luLmdldEJhc2VzKCk7Ci0JCQkJc2V0Q2hlY2tib3hGb3JDdXJyZW50QmFzZShjdXJyZW50QmFzZUxpc3QpOwotCi0JCQkJaWYgKCFwbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQllbmFibGVDb250cm9scyhmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZW5hYmxlQ29udHJvbHModHJ1ZSk7Ci0JCQkJfQotCQkJCWNvcHlyaWdodF92aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCQlmaW5hbCBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IGVkaXRvcgotCQkJCS5jcmVhdGVNb2RpZnlMaXN0ZW5lcihwbHVnaW4pOwotCi0JCW5hbWVNb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihwbHVnaW4sIHRydWUpOwotCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmFtZU1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9uYW1lLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBwbHVnaW4uZ2V0TmFtZSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGN0cmxfbmFtZS5nZXRUZXh0KCkuZXF1YWxzKHBsdWdpbi5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQkvLyBDaGVjayBpbnZhbGlkIGNoYXJhY3RlcnMgZmlyc3QuCi0JCQkJCi0JCQkJLy8gMTc4NDYyCi0JCQkJU3RyaW5nIG1zZyA9IG51bGw7Ci0JCQkJU3RyaW5nIG5hbWUgPSBjdHJsX25hbWUuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChuYW1lLmluZGV4T2YoIiYiKSA+IC0xKSB7Ci0JCQkJCQltc2cgPSBOTFMKLQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3I0X21zZywKLQkJCQkJCQkJCQluYW1lKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW1zZyA9IExpYnJhcnlVdGlsLmNoZWNrUGx1Z2luTmFtZShudWxsLCBuYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlTdHJpbmcgdmFsaWROYW1lID0gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShjdHJsX25hbWUKLQkJCQkJCS5nZXRUZXh0KCkpOwotCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQkvLyBDaGVjayBkdXBsaWNhdGUgcGx1Zy1pbiBuYW1lLgotCQkJCQltc2cgPSBMaWJyYXJ5VXRpbC5jaGVja1BsdWdpbk5hbWUocGx1Z2luLCB2YWxpZE5hbWUpOwotCQkJCX0KLQkJCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQkJaWYgKCF2YWxpZE5hbWUuZXF1YWxzKHBsdWdpbi5nZXROYW1lKCkpKSB7Ci0JCQkJCQlTaGVsbCBzaGVsbCA9IGdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQkJCQkJbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZSwgKG5ldyBPYmplY3RbXSB7IHBsdWdpbi5nZXROYW1lKCksIGN0cmxfbmFtZS5nZXRUZXh0KCkgfSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKCFNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKHNoZWxsLCB0aXRsZSwgbXNnKSkgewotCQkJCQkJCWN0cmxfbmFtZS5zZXRUZXh0KHBsdWdpbi5nZXROYW1lKCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQkJCWN0cmxfbmFtZS5zZXRUZXh0KHZhbGlkTmFtZSk7Ci0JCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCXBsdWdpbiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgdmFsaWROYW1lLCAtMSk7Ci0KLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJZm9ybS5zZXRUZXh0KEZPUk1fUFJFRklYICsgcGx1Z2luLmdldE5hbWUoKSk7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0KLQkJCQkJCS8vIGFkanVzdCBwbHVnaW4gbG9jYXRpb24gYW5kIHNhdmUgdGhlIGVkaXRvcgotCQkJCQkJLy8KLQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNpdGUoKS5nZXRTaGVsbCgpCi0JCQkJCQkJCS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCQkJCQkJCQllZGl0b3IuZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZWRpdG9yCi0JCQkJCQkJCQkJLmdldFBlcnNpc3RlcigpOwotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJcGVyc2lzdGVyCi0JCQkJCQkJCQkJCS5hZGp1c3RMb2NhdGlvbihwbHVnaW4uZVJlc291cmNlKCkpOwotCQkJCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJCQkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCQkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCQkJCQkJCVZpZXdIZWxwZXIKLQkJCQkJCQkJCQkJCS5yZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKGdldFNpdGUoKQotCQkJCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpCi0JCQkJCQkJCQkJCQkJCQkuZ2V0VGV4dCgpLAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jYW5ub3RSZW5hbWVQbHVnaW5Gb2xkZXIKLQkJCQkJCQkJCQkJCQksIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9uYW1lLnNldFRleHQocGx1Z2luLmdldE5hbWUoKSk7Ci0JCQkJCVNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJc2hlbGwuZ2V0VGV4dCgpLCBtc2cpOwotCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJY3RybF9uYW1lLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCQkJCWN0cmxfbmFtZS5zZWxlY3RBbGwoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJY3RybF9uYW1lLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYnJpZWZfZGVzYy5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYnJpZWZfZGVzYy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gcGx1Z2luLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9icmllZl9kZXNjLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQlwbHVnaW4sIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3RhdHVzKSB7Ci0JCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9yZWZNb2RlbAotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkTGlzdCA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlNZXRob2RQbHVnaW4gc2VsZWN0ZWRPYmogPSAoTWV0aG9kUGx1Z2luKSBzZWxlY3RlZExpc3QKLQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQkJaWYgKHNlbGVjdGVkT2JqID09IG51bGwpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJY3RybF9yX2JyaWVmX2Rlc2Muc2V0VGV4dChzZWxlY3RlZE9iagotCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0KLQkJY3RybF9yZWZNb2RlbC5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQotCQkJCWN0cmxfcl9icmllZl9kZXNjLnNldFRleHQoKChNZXRob2RQbHVnaW4pIG9iaikKLQkJCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCi0JCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQocGx1Z2luKSkgewotCQkJCQljdHJsX3JlZk1vZGVsLnNldENoZWNrZWQob2JqLCAhZXZlbnQuZ2V0Q2hlY2tlZCgpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChldmVudC5nZXRDaGVja2VkKCkpIHsKLQkJCQkJLy8gVE9ETzogQ2hhbmdlIHRoaXMgdG8gYmUgbm90IHVuLWRvYWJsZSBkdWUgdG8gdGhlIGNpcmN1bGFyCi0JCQkJCS8vIGRlcGVuZGVuY3kgY2hlY2suCi0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHBsdWdpbiwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fQmFzZXMoKSwKLQkJCQkJCQkoTWV0aG9kUGx1Z2luKSBvYmosIC0xKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmaW5hbCBNZXRob2RQbHVnaW4gYmFzZSA9IChNZXRob2RQbHVnaW4pIG9iajsKLQotCQkJCQkvLyBDaGVja3MgaWYgdGhlIHBsdWdpbiBoYXMgYW55IHJlZmVyZW5jZSB0aGF0IGlzIGEgZWxlbWVudAotCQkJCQkvLyBvZiB0aGUgcmVtb3ZlZCBiYXNlCi0JCQkJCS8vCi0JCQkJCWlmIChVbWFVdGlsLmhhc1JlZmVyZW5jZShwbHVnaW4sIGJhc2UpKSB7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luRGVzY3JpcHRpb25SZW1vdmVSZWZDb25maXJtX21lc3NhZ2UsIHBsdWdpbi5nZXROYW1lKCkpOwotCQkJCQkJU2hlbGwgc2hlbGwgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oc2hlbGwuZ2V0VGV4dCgpLCBtZXNzYWdlKSkgewotCQkJCQkJCS8vIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0aGF0IGFyZSBlbGVtZW50IG9mIHRoZQotCQkJCQkJCS8vIHJlbW92ZWQgYmFzZQotCQkJCQkJCS8vCi0JCQkJCQkJYWN0aW9uTWdyLmV4ZWN1dGUobmV3IFJlbW92ZVJlZmVyZW5jZXNDb21tYW5kKAotCQkJCQkJCQkJcGx1Z2luLCBiYXNlKSk7Ci0JCQkJCQkJY3RybF9yZWZNb2RlbC5zZXRDaGVja2VkKGJhc2UsIGZhbHNlKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gcmVzdG9yZSB0aGUgY2hlY2tlZCBzdGF0ZSBvZiB0aGUKLQkJCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCWN0cmxfcmVmTW9kZWwuc2V0Q2hlY2tlZChiYXNlLCB0cnVlKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJfSk7Ci0KLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyBjaGFuZ2UgdGhpcyB0byBiZSBub3QgdW4tZG9hYmxlIGR1ZSB0byB0aGUgY2lyY3VsYXIKLQkJCQkJLy8gZGVwZW5kZW5jeSBjaGVjawotCQkJCQkvLyBwbHVnaW4uZ2V0QmFzZXMoKS5yZW1vdmUob2JqKTsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgcGx1Z2luLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9CYXNlcygpLAotCQkJCQkJCShNZXRob2RQbHVnaW4pIG9iaiwgLTEpOwotCQkJCX0KLQotCQkJCS8vIGRvdWJsZSBjaGVjayBjaXJjdWxhciBkZXBlbmRlbmN5LCBub3QgbmVjZXNzYXJ5IGhlcmUKLQkJCQlQbHVnaW5SZWZlcmVuY2VDaGVja2VyLmhhc0NpcmN1bGFyQ29uZmxpY3RXaXRoUGx1Z2luKHBsdWdpbik7Ci0KLQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJaWYgKHZlcnNpb25TZWN0aW9uT24pIHsKLQkJCWFkZFZlcnNpb25TZWN0aW9uTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVDb250cm9scyhib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfYXV0aG9ycy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfYnJpZWZfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfdmVyc2lvbi5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfY2hhbmdlX2Rlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljb3B5cmlnaHRfYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX3JfYnJpZWZfZGVzYy5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCVN0cmluZyBuYW1lID0gcGx1Z2luLmdldE5hbWUoKTsKLQkJU3RyaW5nIGRlc2MgPSBwbHVnaW4uZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQljdHJsX25hbWUuc2V0VGV4dChuYW1lID09IG51bGwgPyAiIiA6IG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KGRlc2MgPT0gbnVsbCA/ICIiIDogZGVzYyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAodmVyc2lvblNlY3Rpb25PbikgewotCQkJbG9hZFZlcnNpb25TZWN0aW9uRGF0YSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgdmVyc2lvbiBzZWN0aW9uIGlzIHZpc2libGUgb3Igbm90Ci0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2ZXJzaW9uU2VjdGlvbk9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmVyc2lvblNlY3Rpb25PbigpIHsKLQkJcmV0dXJuIHZlcnNpb25TZWN0aW9uT247Ci0JfQotCi0JLyoqCi0JICogU2V0IHZlcnNpb24gc2VjdGlvbiB0byBiZSB2aXNpYmxlIG9yIG5vdAotCSAqIEBwYXJhbSB2ZXJzaW9uU2VjdGlvbk9uCi0JICogICAgICAgICAgICBUaGUgdmVyc2lvblNlY3Rpb25PbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvblNlY3Rpb25Pbihib29sZWFuIHZlcnNpb25TZWN0aW9uT24pIHsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbk9uID0gdmVyc2lvblNlY3Rpb25PbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmVyc2lvblNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQl2ZXJzaW9uU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCXZlcnNpb25TZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQl2ZXJzaW9uU2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5WRVJTSU9OX0lORk9fU0VDVElPTl9OQU1FKTsKLQkJdmVyc2lvblNlY3Rpb24uc2V0RGVzY3JpcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlZFUlNJT05fSU5GT19TRUNUSU9OX0RFU0MsCi0JCQkJbmV3IFN0cmluZ1tdIHsgTGlicmFyeVVJVGV4dC5nZXRVSVRleHRMb3dlcihtZXRob2RFbGVtZW50KSB9KSk7Ci0JCXZlcnNpb25TZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQl2ZXJzaW9uQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUodmVyc2lvblNlY3Rpb24pOwotCQl2ZXJzaW9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl2ZXJzaW9uQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCg1LCBmYWxzZSkpOwotCQl2ZXJzaW9uU2VjdGlvbi5zZXRDbGllbnQodmVyc2lvbkNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBWZXJzaW9uIHNlY3Rpb24gY29udGVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmVyc2lvblNlY3Rpb25Db250ZW50KCkgewotCQlTdHJpbmcgZmlsbFRleHQgPSAocGx1Z2luLmdldFZlcnNpb24oKSA9PSBudWxsID8gIiIgOiBwbHVnaW4uZ2V0VmVyc2lvbigpKTsKLQkJY3RybF92ZXJzaW9uID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWw0KHRvb2xraXQsIHZlcnNpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlZFUlNJT05fVEVYVCwgU1dULkRFRkFVTFQsIFNXVC5TSU5HTEUsIGZpbGxUZXh0KTsKLQkJCi0JCWZpbGxUZXh0ID0gcGx1Z2luLmdldENoYW5nZURhdGUoKSA9PSBudWxsID8gIiIgOiAvLyROT04tTkxTLTEkCi0JCQlEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZShEYXRlRm9ybWF0LkZVTEwpLmZvcm1hdCgKLQkJCQkJcGx1Z2luLmdldENoYW5nZURhdGUoKSk7Ci0KLQkJY3RybF9jaGFuZ2VfZGF0ZSA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsNCh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5DSEFOR0VfREFURV9URVhULCBTV1QuREVGQVVMVCwgU1dULlNJTkdMRSwgZmlsbFRleHQpOwotCQljdHJsX2NoYW5nZV9kYXRlLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCi0JCWN0cmxfY2hhbmdlX2Rlc2MgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDUodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQ0hBTkdFX0RFU0NSSVBUSU9OX1RFWFQpOwotCi0JCUNvbXBvc2l0ZSB2aWV3SGlzdG9yeUJ1dHRvblBhbmUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwKLQkJCQl2ZXJzaW9uQ29tcG9zaXRlLCAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQsIDEsIDEsIDEpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSggR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwOwotCQkJdmlld0hpc3RvcnlCdXR0b25QYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCXZpZXdfaGlzdG9yeV9idXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbih2aWV3SGlzdG9yeUJ1dHRvblBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlZJRVdfSElTVE9SWV9CVVRUT05fVEVYVCwgU1dULlBVU0gpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAxMDA7Ci0JCQl2aWV3X2hpc3RvcnlfYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCQotCQljdHJsX2F1dGhvcnMgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDUodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQVVUSE9SU19URVhULCA0MCwgU1dULk1VTFRJKTsKLQkJCi0JCWxhYmVsX2NvcHlyaWdodCA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsIHZlcnNpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkNPUFlSSUdIVF9URVhULCAyKTsKLQkJY3RybF9jb3B5cmlnaHQgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLCBTV1QuU0lOR0xFCi0JCQkJfCBTV1QuUkVBRF9PTkxZLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMLAotCQkJCTUsIDQwMCwgMSwgMik7Ci0JCWNvcHlyaWdodF92aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9jb3B5cmlnaHQpOwotCQlpbml0Q29udGVudFByb3ZpZGVyQ29weXJpZ2h0KCk7Ci0JCWNvcHlyaWdodF92aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyQmFzZSk7Ci0JCWNvcHlyaWdodF92aWV3ZXIuc2V0SW5wdXQocGx1Z2luKTsKLQkJCi0JCQotCQlDb21wb3NpdGUgYnV0dG9ucGFuZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5ELCAxLCAxLCAxKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJYnV0dG9ucGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljb3B5cmlnaHRfYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9ucGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuU0VMRUNUX0JVVFRPTl9URVhULCBTV1QuU0lNUExFKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMTAwOwotCQkJY29weXJpZ2h0X2J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0ID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9ucGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVTRUxFQ1RfQlVUVE9OX1RFWFQsIFNXVC5TSU1QTEUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAxMDA7Ci0JCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9CQkKLQotCQljdHJsX2NoYW5nZWFibGUgPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCXZlcnNpb25Db21wb3NpdGUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbkxhYmVsLCBTV1QuQ0hFQ0spOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHRoZSBleHBhbmRlZCBjb21wb3NpdGUuCi0JCWV4cGFuZGVkVmVyc2lvbkNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHZlcnNpb25TZWN0aW9uLAotCQkJCVNXVC5OT05FKTsKLQkJZXhwYW5kZWRWZXJzaW9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlleHBhbmRlZFZlcnNpb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWV4cGFuZGVkVmVyc2lvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQkvLyBBZGQgdGhlIGV4cGFuZC9jb2xsYXBzZSBoeXBlcmxpbmsgaW1hZ2UuCi0JCWV4cGFuZFZlcnNpb25MaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluaygKLQkJCQlleHBhbmRlZFZlcnNpb25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZXhwYW5kVmVyc2lvbkxpbmsuc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0VYUEFOREVEKTsKLQkJZXhwYW5kVmVyc2lvbkxpbmsuc2V0VW5kZXJsaW5lZChmYWxzZSk7Ci0JCWV4cGFuZFZlcnNpb25MaW5rLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsb3NlUlRFKTsgLy8kTk9OLU5MUy0xJAotCQlleHBhbmRWZXJzaW9uTGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCXRvZ2dsZShlLCBWRVJTSU9OX1NFQ1RJT05fSUQpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgdGhlIGV4cGFuZC9jb2xsYXBzZSBoeXBlcmxpbmsgdGV4dC4KLQkJZXhwYW5kVmVyc2lvbkxhYmVsID0gY3JlYXRlRGVjb3JhdGVkTGFiZWwodG9vbGtpdCwgZXhwYW5kZWRWZXJzaW9uQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZXhwYW5kZWRWZXJzaW9uQ29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodmVyc2lvbkNvbXBvc2l0ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJDb3B5cmlnaHQoKSB7Ci0JCWNvcHlyaWdodENvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAocGx1Z2luLmdldENvcHlyaWdodFN0YXRlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJbGlzdC5hZGQocGx1Z2luLmdldENvcHlyaWdodFN0YXRlbWVudCgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQljb3B5cmlnaHRfdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb3B5cmlnaHRDb250ZW50UHJvdmlkZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFZlcnNpb25TZWN0aW9uTGlzdGVuZXJzKCkgewotCi0JCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCi0JCW1vZGVsTW9kaWZ5TGlzdGVuZXIgPSBlZGl0b3IuY3JlYXRlTW9kaWZ5TGlzdGVuZXIocGx1Z2luKTsKLQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKHBsdWdpbik7Ci0KLQkJY3RybF92ZXJzaW9uLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfdmVyc2lvbi5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfVmVyc2lvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gcGx1Z2luLmdldFZlcnNpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbAotCQkJCQkJLmdldFBsYWluVGV4dChjdHJsX3ZlcnNpb24uZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHBsdWdpbiwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X1ZlcnNpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYXV0aG9ycy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2F1dGhvcnMuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0F1dGhvcnMoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IHBsdWdpbi5nZXRBdXRob3JzKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IFN0clV0aWwKLQkJCQkJCS5nZXRQbGFpblRleHQoY3RybF9hdXRob3JzLmdldFRleHQoKSk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwbHVnaW4sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljb3B5cmlnaHRfYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IENvbnRlbnRGaWx0ZXIoKSB7Ci0JCQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJTGlzdCBhbHJlYWR5RXhzdGluZyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAoY3RybF9jb3B5cmlnaHQuZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0JCQkJCVRhYmxlSXRlbSBpdGVtID0gY3RybF9jb3B5cmlnaHQuZ2V0SXRlbXMoKVswXTsKLQkJCQkJaWYgKGl0ZW0uZ2V0RGF0YSgpICE9IG51bGwpCi0JCQkJCQlhbHJlYWR5RXhzdGluZy5hZGQoaXRlbS5nZXREYXRhKCkpOwotCQkJCX0KLQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWZpbHRlciwgcGx1Z2luLCBGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMsCi0JCQkJCQlhbHJlYWR5RXhzdGluZyk7Ci0JCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCQkJZmQub3BlbigpOwotCQkJCWZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJCQlpZiAoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLnNpemUoKSA+IDApIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJcGx1Z2luLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBmZC5nZXRTZWxlY3RlZEl0ZW1zKCkuZ2V0KDApLAotCQkJCQkJCS0xKTsKLQkJCQl9Ci0JCQkJY29weXJpZ2h0X3ZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9jaGFuZ2VfZGVzYy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2NoYW5nZV9kZXNjLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gcGx1Z2luLmdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCQkJY2hhciBkZWxpbWl0ZXIgPSBBdXRob3JpbmdVSVJlc291cmNlcy5DaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlci5jaGFyQXQoMCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjdHJsX2NoYW5nZV9kZXNjLmdldFRleHQoKTsKLQotCQkJCW5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoZGVsaW1pdGVyLCAnICcpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMobGFzdENoYW5nZUhpc3RvcnkpKSB7Ci0JCQkJCWxhc3RDaGFuZ2VIaXN0b3J5ID0gbmV3Q29udGVudDsKLQkJCQkJaWYgKChvbGRDb250ZW50ICE9IG51bGwpCi0JCQkJCQkJJiYgKCEoU3RyVXRpbC5pc0JsYW5rKG9sZENvbnRlbnQpKSkpIHsKLQkJCQkJCW5ld0NvbnRlbnQgPSBvbGRDb250ZW50ICsgZGVsaW1pdGVyICsgbmV3Q29udGVudDsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcGx1Z2luLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQotCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJfQotCi0JCQl9Ci0KLQkJfSk7Ci0KLQkJdmlld19oaXN0b3J5X2J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQotCQkJCUNoYW5nZUhpc3RvcnlEaWFsb2cgZGxnID0gbmV3IENoYW5nZUhpc3RvcnlEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlwbHVnaW4pOwotCQkJCWRsZy5vcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNvcHlyaWdodF9idXR0b25fZGVzZWxlY3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWN0aW9uTWdyCi0JCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwbHVnaW4sCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE1ldGhvZFVuaXRfQ29weXJpZ2h0U3RhdGVtZW50KCksCi0JCQkJCQkJCW51bGwsIC0xKTsKLQkJCQljb3B5cmlnaHRfdmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9jaGFuZ2VhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCi0JCQkJCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChwbHVnaW4sIGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCQkKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5fbWVzc2FnZSwKLQkJCQkJCQkJCXBsdWdpbi5nZXROYW1lKCkpOwotCQkJCQlTaGVsbCBzaGVsbCA9IGdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQkJCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oc2hlbGwuZ2V0VGV4dCgpLCBtZXNzYWdlKSkgewotCQkJCQkJLy8gY2xvc2UgZWRpdG9ycyBvbiBhbnkgY2hhbmdlIGluIGN0cmxfY2hhbmdlYWJsZQotCQkJCQkJLy8gaWYgKGN0cmxfY2hhbmdlYWJsZS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJZ2V0RGlydHlFZGl0b3JzKG51bGwpOwotCQkJCQkJYm9vbGVhbiByZXQgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQlwbHVnaW4sIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpLAotCQkJCQkJCQluZXcgQm9vbGVhbighY3RybF9jaGFuZ2VhYmxlLmdldFNlbGVjdGlvbigpKSwKLQkJCQkJCQkJLTEpOwotCQkJCQkJLy8gaW4gY2FzZSBvZiByZWFkb25seSBmaWxlLCByb2xsIGJhY2sgY2hhbmdlcy4KLQkJCQkJCWlmICghcmV0KSB7Ci0JCQkJCQkJY3RybF9jaGFuZ2VhYmxlLnNldFNlbGVjdGlvbighY3RybF9jaGFuZ2VhYmxlCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQotCQkJCQkJLy8gfQotCQkJCQkJZW5hYmxlQ29udHJvbHMoIWN0cmxfY2hhbmdlYWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBhY3Rpb25NZ3IudW5kbygpOwotCQkJCQkJY3RybF9jaGFuZ2VhYmxlLnNldFNlbGVjdGlvbighY3RybF9jaGFuZ2VhYmxlCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCQllbmFibGVDb250cm9scyghY3RybF9jaGFuZ2VhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJCS8vIHJldHVybjsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdERpYWxvZ190aXRsZSwKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQsCi0JCQkJCQkJc3RhdHVzKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQljb3B5cmlnaHRfdmlld2VyLnJlZnJlc2goKTsKLQkJCQkKLQkJCQkvLyByZWZyZXNoIGVkaXRvciB0aXRsZSBpbWFnZS4gCi0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKWdldEVkaXRvcigpKS5yZWZyZXNoVGl0bGVJbWFnZSgpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIFJldHVybiBhIGxpc3Qgb2YgZGlydHkgZWRpdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFBsdWdpbi4KLQkJCSAqIGVkaXRvcnMgZnJvbSBNZXRob2RFbGVtZW50RWRpdG9yLgotCQkJICogCi0JCQkgKiBAcmV0dXJuIExpc3QgdGhlIGRpcnR5IGVkaXRvcnMKLQkJCSAqLwotCQkJTGlzdCBnZXREaXJ0eUVkaXRvcnMoTWV0aG9kUGx1Z2luIG1ldGhvZHBsdWdpbikgewotCQkJCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQkJQXJyYXlMaXN0IGNsb3NlRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCQkJCWVsZW1lbnQgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQpCi0JCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgewotCQkJCQkJCWVsZW1lbnQgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgaW5wdXQpCi0JCQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbigpOwotCQkJCQkJfQotCQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbAotCQkJCQkJCQkmJiAoZWxlbWVudC5lQ29udGFpbmVyKCkgPT0gbnVsbCB8fCBVbWFVdGlsCi0JCQkJCQkJCQkJLmlzQ29udGFpbmVkQnkoZWxlbWVudCwgcGx1Z2luKSkpIHsKLQkJCQkJCQlpZiAoIWVsZW1lbnQuZXF1YWxzKHBsdWdpbikpCi0JCQkJCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpbnQgc2l6ZSA9IGNsb3NlRWRpdG9yUmVmcy5zaXplKCk7Ci0JCQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlyZWZlcmVuY2VzW2ldID0gKElFZGl0b3JSZWZlcmVuY2UpIGNsb3NlRWRpdG9yUmVmcy5nZXQoaSk7Ci0JCQkJfQotCQkJCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3JzKHJlZmVyZW5jZXMsIHRydWUpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKgotCSAqIHVwZGF0ZSB0aGUgY2hhbmdlIGRhdGUgaWYgYW55IGF0dHJpYnV0ZSBpcyBtb2RpZmllZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDaGFuZ2VEYXRlKCkgewotCi0JCURhdGUgY2hhbmdlRGF0ZSA9IHBsdWdpbi5nZXRDaGFuZ2VEYXRlKCk7Ci0JCURhdGVGb3JtYXQgZGYgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZShEYXRlRm9ybWF0LkZVTEwpOwotCi0JCVN0cmluZyBvbGRDb250ZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNoYW5nZURhdGUgIT0gbnVsbCkgewotCQkJb2xkQ29udGVudCA9IGRmLmZvcm1hdChjaGFuZ2VEYXRlKTsKLQkJfQotCi0JCURhdGUgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpOwotCQlTdHJpbmcgbmV3Q29udGVudCA9IGRmLmZvcm1hdChjdXJyZW50RGF0ZSk7Ci0JCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHBsdWdpbiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpLCBjdXJyZW50RGF0ZSwgLTEpOwotCQkJY3RybF9jaGFuZ2VfZGF0ZS5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFZlcnNpb25TZWN0aW9uRGF0YSgpIHsKLQkJY3RybF92ZXJzaW9uCi0JCQkJLnNldFRleHQocGx1Z2luLmdldFZlcnNpb24oKSA9PSBudWxsID8gIiIgOiBwbHVnaW4uZ2V0VmVyc2lvbigpKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2F1dGhvcnMKLQkJCQkuc2V0VGV4dChwbHVnaW4uZ2V0QXV0aG9ycygpID09IG51bGwgPyAiIiA6IHBsdWdpbi5nZXRBdXRob3JzKCkpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfY2hhbmdlX2Rlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9jaGFuZ2VfZGF0ZS5zZXRUZXh0KHBsdWdpbi5nZXRDaGFuZ2VEYXRlKCkgPT0gbnVsbCA/ICIiIDogLy8kTk9OLU5MUy0xJAotCQkJCURhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKERhdGVGb3JtYXQuRlVMTCkuZm9ybWF0KAotCQkJCQkJcGx1Z2luLmdldENoYW5nZURhdGUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfY2hhbmdlYWJsZQotCQkJCS5zZXRTZWxlY3Rpb24oIXBsdWdpbi5nZXRVc2VyQ2hhbmdlYWJsZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGUgRGVzY3JpcHRpb24gY29udHJvbCB0byBleHBhbmQgYW5kIGNvbnRyb2wgc3RhdGUKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGUoSHlwZXJsaW5rRXZlbnQgZSwgaW50IGlkKSB7Ci0JCS8vIFRPRE86IFdlIHNob3VsZCBjb21iaW5lIHRoZXNlIG1ldGhvZHMgaW50byBvbmUuIE9uZSB3YXkgdG8gZG8gaXQsCi0JCS8vIGRpc3BvaW5nCi0JCS8vIGN0cmxfZXhwYW5kZWQgZXZlcnkgdGltZSBpdCBjb2xsYXBzZXMgYW5kIGNyZWF0aW5nIGl0IHdoZW4gd2UgZXhwYW5kLgotCQkvLyBBdCBwcmVzZW50LCB0aGVyZSBpcyBubyBtZXRob2QgdG8gZGlzcG9zZQotCQlpZiAoaWQgPT0gR0VORVJBTF9TRUNUSU9OX0lEKSB7Ci0JCQl0b2dnbGUoZSk7Ci0JCX0KLQkJaWYgKGlkID09IFZFUlNJT05fU0VDVElPTl9JRCkgewotCQkJdG9nZ2xlVmVyc2lvblNlY3Rpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdG9nZ2xlVmVyc2lvblNlY3Rpb24oSHlwZXJsaW5rRXZlbnQgZSkgewotCQlpZiAoY3RybF92ZXJzaW9uX2V4cGFuZGVkID09IG51bGwpIHsKLQkJCWN0cmxfdmVyc2lvbl9leHBhbmRlZCA9IGNyZWF0ZVJpY2hUZXh0RWRpdG9yKHRvb2xraXQsCi0JCQkJCWV4cGFuZGVkVmVyc2lvbkNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQkJCQl8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9CT1RILCBnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpLCBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCksIDIsCi0JCQkJCQkJZXhwYW5kVmVyc2lvbkxhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF92ZXJzaW9uX2V4cGFuZGVkLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAoZGVzY0V4cGFuZEZsYWcpIHsKLQkJCXZlcnNpb25Db21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWV4cGFuZGVkVmVyc2lvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCXZlcnNpb25TZWN0aW9uLnNldENsaWVudCh2ZXJzaW9uQ29tcG9zaXRlKTsKLQkJCXJlZk1vZGVsU2VjdGlvbi5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCWdlbmVyYWxTZWN0aW9uLnNldEV4cGFuZGVkKHRydWUpOwotCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gZ2V0QWN0aXZlUmljaFRleHRDb250cm9sKCk7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KGN0cmxfdmVyc2lvbl9leHBhbmRlZC5nZXRUZXh0KCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF92ZXJzaW9uX2V4cGFuZGVkLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLAotCQkJCQkJbGlzdGVuZXIuZ2V0TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQlpZiAoY3RybF92ZXJzaW9uX2V4cGFuZGVkLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJLnNhdmVNb2RpZmllZFJpY2hUZXh0KGN0cmxfdmVyc2lvbl9leHBhbmRlZCk7Ci0JCQl9Ci0JCQlyaWNoVGV4dC5zZXRGb2N1cygpOwotCQl9IGVsc2UgewotCQkJdmVyc2lvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWV4cGFuZGVkVmVyc2lvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJdmVyc2lvblNlY3Rpb24uc2V0Q2xpZW50KGV4cGFuZGVkVmVyc2lvbkNvbXBvc2l0ZSk7Ci0JCQlyZWZNb2RlbFNlY3Rpb24uc2V0RXhwYW5kZWQoZmFsc2UpOwotCQkJZ2VuZXJhbFNlY3Rpb24uc2V0RXhwYW5kZWQoZmFsc2UpOwotCQkJKChMYWJlbClleHBhbmRWZXJzaW9uTGFiZWwuZ2V0Q29udHJvbCgpKQotCQkJCQkuc2V0VGV4dCgoU3RyaW5nKSAoKEltYWdlSHlwZXJsaW5rKSBlLmdldFNvdXJjZSgpKQotCQkJCQkJCS5nZXREYXRhKCJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJCAgICAJCQotCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gKElNZXRob2RSaWNoVGV4dCkgZS5nZXRIcmVmKCk7Ci0JCQljdHJsX3ZlcnNpb25fZXhwYW5kZWQuc2V0VGV4dChyaWNoVGV4dC5nZXRUZXh0KCkpOwotCQkJY3RybF92ZXJzaW9uX2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KHJpY2hUZXh0LmdldE1vZGFsT2JqZWN0KCkpOwotCQkJY3RybF92ZXJzaW9uX2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0RmVhdHVyZShyaWNoVGV4dAotCQkJCQkuZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF92ZXJzaW9uX2V4cGFuZGVkLmFkZExpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLAotCQkJCQkJbGlzdGVuZXIuZ2V0TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQljdHJsX3ZlcnNpb25fZXhwYW5kZWQuc2V0Rm9jdXMoKTsKLQkJCXNldEFjdGl2ZVJpY2hUZXh0Q29udHJvbChyaWNoVGV4dCk7Ci0JCX0KLQotCQl2ZXJzaW9uU2VjdGlvbi5sYXlvdXQodHJ1ZSk7Ci0JCWRlc2NFeHBhbmRGbGFnID0gIWRlc2NFeHBhbmRGbGFnOwotCX0KLQotCS8qKgotCSAqIFNldCBhY3RpdmUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QWN0aXZlUmljaFRleHRDb250cm9sKElNZXRob2RSaWNoVGV4dCBjdHJsKSB7Ci0JCWFjdGl2ZUNvbnRyb2wgPSBjdHJsOwotCX0KLQotCS8qKgotCSAqIEdldCBBY3RpdmUgUmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgZ2V0QWN0aXZlUmljaFRleHRDb250cm9sKCkgewotCQlyZXR1cm4gYWN0aXZlQ29udHJvbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVXNlckNoYW5nZWFibGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChNZXRob2RQbHVnaW4uY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQlzZXRVc2VyQ2hhbmdlYWJsZShiLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVc2VyQ2hhbmdlYWJsZShib29sZWFuIHVzZXJDaGFuZ2VhYmxlKSB7Ci0JCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJCXJldHVybjsKLQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQlwbHVnaW4uc2V0VXNlckNoYW5nZWFibGUoQm9vbGVhbi52YWx1ZU9mKHVzZXJDaGFuZ2VhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJcGx1Z2luLmVBZGFwdGVycygpLnJlbW92ZSh1c2VyQ2hhbmdlYWJsZUFkYXB0ZXIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLklSZWZyZXNoYWJsZSNyZWZyZXNoTmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hOYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCWlmICgoY3RybF9uYW1lICE9IG51bGwpICYmICEoY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkpIHsKLQkJCQljdHJsX25hbWUucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobmFtZU1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX25hbWUuc2V0VGV4dChuZXdOYW1lKTsKLQkJCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmFtZU1vZGlmeUxpc3RlbmVyKTsKLQkJCQlmb3JtLnNldFRleHQoRk9STV9QUkVGSVggKyBwbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZURlc2NyaXB0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1ByYWN0aWNlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3ZWIwNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1ByYWN0aWNlRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBpbiBhIFByYWN0aWNlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UgewotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9hZGRpdGlvbmFsX2luZm8sIGN0cmxfcHJvYmxlbSwKLQkJCWN0cmxfYmFja2dyb3VuZDsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfZ29hbHMsIGN0cmxfYXBwbGljYXRpb24sIGN0cmxfbGV2ZWxzX2Fkb3B0aW9uOwotCi0JcHJpdmF0ZSBQcmFjdGljZSBndWlkYW5jZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByYWN0aWNlRGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZ3VpZGFuY2UgPSAoUHJhY3RpY2UpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRDb250ZW50RmllbGRIZWlnaHQoMjAwKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjY3JlYXRlRWRpdG9yQ29udGVudChvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlzdXBlci5jcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCi0JCWN0cmxfYWRkaXRpb25hbF9pbmZvID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuQURESVRJT05BTF9JTkZPX1RFWFQsIDQwLCA0MDAsCi0JCQkJREVUQUlMX1NFQ1RJT05fSUQpOwotCQljdHJsX2dvYWxzID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuR09BTFNfVEVYVCwgNDAsIDQwMCwKLQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0JCWN0cmxfYXBwbGljYXRpb24gPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5BUFBMSUNBVElPTl9URVhULCA0MCwgNDAwLAotCQkJCURFVEFJTF9TRUNUSU9OX0lEKTsKLQkJY3RybF9wcm9ibGVtID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuUFJPQkxFTV9URVhULCA0MCwgNDAwLAotCQkJCURFVEFJTF9TRUNUSU9OX0lEKTsKLQkJY3RybF9iYWNrZ3JvdW5kID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuQkFDS0dST1VORF9URVhULCA0MCwgNDAwLAotCQkJCURFVEFJTF9TRUNUSU9OX0lEKTsKLQkJY3RybF9sZXZlbHNfYWRvcHRpb24gPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5MRVZFTF9PRl9BRE9QVElPTl9URVhULCA0MCwKLQkJCQk0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsKLQotCQlsYWJlbF9iYXNlLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkJBU0VfRUxFTUVOVF9URVhUKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQotCQlmaW5hbCBNb2RpZnlMaXN0ZW5lciBjb250ZW50TW9kaWZ5TGlzdGVuZXIgPSBlZGl0b3IKLQkJCQkuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCkpOwotCi0JCWN0cmxfYWRkaXRpb25hbF9pbmZvCi0JCQkJLnNldE1vZGFsT2JqZWN0KChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2FkZGl0aW9uYWxfaW5mby5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpKTsKLQkJY3RybF9hZGRpdGlvbmFsX2luZm8uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9hZGRpdGlvbmFsX2luZm8uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2FkZGl0aW9uYWxfaW5mbzsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEFkZGl0aW9uYWxJbmZvKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hcHBsaWNhdGlvbgotCQkJCS5zZXRNb2RhbE9iamVjdCgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9hcHBsaWNhdGlvbi5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpKTsKLQkJY3RybF9hcHBsaWNhdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2FwcGxpY2F0aW9uLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9hcHBsaWNhdGlvbjsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEFwcGxpY2F0aW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9nb2Fscy5zZXRNb2RhbE9iamVjdCgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfZ29hbHMuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKSk7Ci0JCWN0cmxfZ29hbHMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9nb2Fscy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfZ29hbHM7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRHb2FscygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCksCi0JCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfcHJvYmxlbS5zZXRNb2RhbE9iamVjdCgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfcHJvYmxlbS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCkpOwotCQljdHJsX3Byb2JsZW0uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9wcm9ibGVtLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9wcm9ibGVtOwotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFByb2JsZW0oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYmFja2dyb3VuZAotCQkJCS5zZXRNb2RhbE9iamVjdCgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9iYWNrZ3JvdW5kLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKSk7Ci0JCWN0cmxfYmFja2dyb3VuZC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2JhY2tncm91bmQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2JhY2tncm91bmQ7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QmFja2dyb3VuZCgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9sZXZlbHNfYWRvcHRpb24KLQkJCQkuc2V0TW9kYWxPYmplY3QoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfbGV2ZWxzX2Fkb3B0aW9uLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSk7Ci0JCWN0cmxfbGV2ZWxzX2Fkb3B0aW9uLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbGV2ZWxzX2Fkb3B0aW9uLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9sZXZlbHNfYWRvcHRpb247Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZC5nZXRUZXh0KCkKLQkJCQkJCTogY3RybF9sZXZlbHNfYWRvcHRpb24uZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI3JlZnJlc2goYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJc3VwZXIucmVmcmVzaChlZGl0YWJsZSk7Ci0JCWN0cmxfYWRkaXRpb25hbF9pbmZvLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9hcHBsaWNhdGlvbi5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfZ29hbHMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3Byb2JsZW0uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2xldmVsc19hZG9wdGlvbi5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfYmFja2dyb3VuZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBpbml0aWFsIGRhdGEgZnJvbSBtb2RlbAotCSAqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI2xvYWREYXRhKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3VwZXIubG9hZERhdGEoKTsKLQkJaWYgKGd1aWRhbmNlICE9IG51bGwpIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiBndWlkYW5jZURlc2NyaXB0aW9uID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQkJY3RybF9hZGRpdGlvbmFsX2luZm8KLQkJCQkJLnNldFRleHQoZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRBZGRpdGlvbmFsSW5mbygpID09IG51bGwgPyAiIiA6IGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0QWRkaXRpb25hbEluZm8oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWN0cmxfcHJvYmxlbQotCQkJCQkuc2V0VGV4dChndWlkYW5jZURlc2NyaXB0aW9uLmdldFByb2JsZW0oKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldFByb2JsZW0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWN0cmxfYmFja2dyb3VuZAotCQkJCQkuc2V0VGV4dChndWlkYW5jZURlc2NyaXB0aW9uLmdldEJhY2tncm91bmQoKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldEJhY2tncm91bmQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWN0cmxfYXBwbGljYXRpb24KLQkJCQkJLnNldFRleHQoZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRBcHBsaWNhdGlvbigpID09IG51bGwgPyAiIiA6IGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0QXBwbGljYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWN0cmxfZ29hbHMKLQkJCQkJLnNldFRleHQoZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRHb2FscygpID09IG51bGwgPyAiIiA6IGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0R29hbHMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWN0cmxfbGV2ZWxzX2Fkb3B0aW9uCi0JCQkJCS5zZXRUZXh0KGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpID09IG51bGwgPyAiIiA6IGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZ3VpZGFuY2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1ByYWN0aWNlUmVmZXJlbmNlc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZVJlZmVyZW5jZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIzNzQxNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1ByYWN0aWNlUmVmZXJlbmNlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5BbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgUmVmZXJlbmNlcyBwYWdlIGluIHRoZSBQcmFjdGljZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlUmVmZXJlbmNlc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicHJhY3RpY2VSZWZlcmVuY2VzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUHJhY3RpY2UgcHJhY3RpY2U7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByYWN0aWNlUmVmZXJlbmNlc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5SRUZFUkVOQ0VTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcHJhY3RpY2UgPSAoUHJhY3RpY2UpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWxpc3QuYWRkQWxsKHByYWN0aWNlLmdldENvbnRlbnRSZWZlcmVuY2VzKCkpOwotCQkJCWxpc3QuYWRkQWxsKHByYWN0aWNlLmdldEFjdGl2aXR5UmVmZXJlbmNlcygpKTsKLQkJCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgcHJhY3RpY2UsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgcHJhY3RpY2UsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCksCi0JCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgcHJhY3RpY2UsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgcHJhY3RpY2UsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCksCi0JCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBwcmFjdGljZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLk9OTFlfQ09OVEVOVF9FTEVNRU5UUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBBbGxGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYob2JqIGluc3RhbmNlb2YgTWlsZXN0b25lKSByZXR1cm4gZmFsc2U7Ci0JCQkJaWYob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyVHlwZXMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJUeXBlcygpIHsKLQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1sxNF07Ci0JCWludCBpID0gMDsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5ST0xFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVEFTS1M7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuRE9NQUlOUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuVE9PTFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5QUk9DRVNTRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkNPTlRFTlRfUEFDS0FHRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlM7Ci0JCXJldHVybiBzdHI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg2MWU2YjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNlbGxlZGl0b3JzLkFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnMuUHJvY2Vzc0NoZWNrQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5FeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlByb2Nlc3NWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLQotLyoqCi0gKiBCcmVhZG93biBzdHJ1Y3R1cmUgZWRpdG9yCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIGV4dGVuZHMgUHJvY2Vzc0Zvcm1QYWdlCi0JCWltcGxlbWVudHMgSVZpZXdlclByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWFRfVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRYVF9GQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBFQ0xBU1NFUzsKLQkKLQlwcml2YXRlIGludCB0YWJJbmRleCA9IDA7Ci0JCi0Jc3RhdGljIHsKLQkJRUNMQVNTRVMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVDTEFTU0VTLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCkpOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgZXh0ZW5kcwotCQkJVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElDb2xvclByb3ZpZGVyIHsKLQotCQlwcml2YXRlIERlY29yYXRpbmdMYWJlbFByb3ZpZGVyIGRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCQkgKi8KLQkJcHVibGljIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCWRlY29yYXRpbmdMYWJlbFByb3ZpZGVyID0gbmV3IERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKAotCQkJCQluZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSwKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXN1cGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCWRlY29yYXRpbmdMYWJlbFByb3ZpZGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewkJCQotCQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJZGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JCQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCWlmKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCQlyZXR1cm4gZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRDb2x1bW5JbWFnZShvYmplY3QsIGNvbHVtbkluZGV4KTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBkZWNvcmF0aW5nTGFiZWxQcm92aWRlci5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXIjZ2V0Rm9yZWdyb3VuZChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIENvbG9yIGdldEZvcmVncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChpc1N1cHByZXNzZWQoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gQ29sb3JzLlNVUFJFU1NFRF9FTEVNRU5UX0xBQkVMOwotCQkJfQotCQkJZWxzZSBpZiAoaXNFeHRlcm5hbChlbGVtZW50KSkgewotCQkJCXJldHVybiBDb2xvcnMuSU5IRVJJVEVEX0VMRU1FTlRfTEFCRUw7Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sb3JDb25zdGFudHMubGlzdEZvcmVncm91bmQ7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNTdXBwcmVzc2VkKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0U3VwcHJlc3Npb24oKQotCQkJCQkJLmlzU3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZCgKLQkJCQkJCShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwcml2YXRlIFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0VkaXRvcikgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlLnRoaXMKLQkJCQkJLmdldEVkaXRvcigpKS5nZXRTdXBwcmVzc2lvbigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXIjZ2V0QmFja2dyb3VuZChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIENvbG9yIGdldEJhY2tncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCS8vIGxldCBPUyB0YWtlIGNvbnRyb2wgb3ZlciB0cmVlIHdpZGdldCBiYWNrZ3JvdW5kCi0JCQkvLyByYXRoZXIgdGhhbiBzZW5kaW5nIG9uZSBmaXhlZCBiYWNrZ3JvdW5kLgotCQkJcmV0dXJuIG51bGw7Ly9Db2xvckNvbnN0YW50cy5saXN0QmFja2dyb3VuZDsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC51dGlsLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIjaXNFeHRlcm5hbChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKGVsZW1lbnQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQudXRpbC5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyI2dldEZvbnQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBGb250IGdldEZvbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChpc0V4dGVybmFsKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGl0YWxpY0ZvbnQ7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVndWxhckZvbnQ7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWRlY29yYXRpbmdMYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCWRlY29yYXRpbmdMYWJlbFByb3ZpZGVyID0gbnVsbDsKLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGV4dGVuZHMgVGV4dENlbGxFZGl0b3IgewotCQlwcm90ZWN0ZWQgT2JqZWN0IGxhc3RJbnZhbGlkRWxlbWVudDsKLQotCQlwcml2YXRlIGludCBjb2x1bW5JbmRleDsKLQotCQkvKioKLQkJICogQHBhcmFtIHBhcmVudAotCQkgKi8KLQkJcHVibGljIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQpOwotCQl9Ci0KLQkJdm9pZCBzZXRDb2x1bW5JbmRleChpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXRoaXMuY29sdW1uSW5kZXggPSBjb2x1bW5JbmRleDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXgoKSB7Ci0JCQlyZXR1cm4gY29sdW1uSW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldExhc3RJbnZhbGlkRWxlbWVudCgpIHsKLQkJCXJldHVybiBsYXN0SW52YWxpZEVsZW1lbnQ7Ci0JCX0KLQotCQlTdHJpbmcgaXNWYWxpZChTdHJpbmcgdHh0KSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJT2JqZWN0IGUgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG1zZyA9IGlzVmFsaWQoZSwgdHh0KTsKLQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJbGFzdEludmFsaWRFbGVtZW50ID0gZTsKLQkJCQl9IGVsc2UgewotCQkJCQlsYXN0SW52YWxpZEVsZW1lbnQgPSBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gbXNnOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IGUsIFN0cmluZyB0eHQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2VsbEVkaXRvclZhbGlkYXRvciBpbXBsZW1lbnRzIElDZWxsRWRpdG9yVmFsaWRhdG9yIHsKLQotCQlwcml2YXRlIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yOwotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBDZWxsRWRpdG9yVmFsaWRhdG9yKFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yKSB7Ci0JCQl0aGlzLmNlbGxFZGl0b3IgPSBjZWxsRWRpdG9yOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCQlyZXR1cm4gY2VsbEVkaXRvci5pc1ZhbGlkKChTdHJpbmcpIHZhbHVlKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBWYWxpZGF0aW5nRGVhY3RpdmF0ZUxpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIgewotCQlwcml2YXRlIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yOwotCi0JCVZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIoVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3IpIHsKLQkJCXRoaXMuY2VsbEVkaXRvciA9IGNlbGxFZGl0b3I7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGNlbGxFZGl0b3IuZ2V0TGFzdEludmFsaWRFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0UHJvY2Vzc0VsZW1lbnRFcnJvckRpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWNlbGxFZGl0b3IuZ2V0RXJyb3JNZXNzYWdlKCkpOwotCQkJCQkJdmlld2VyLmVkaXRFbGVtZW50KGNlbGxFZGl0b3IuZ2V0TGFzdEludmFsaWRFbGVtZW50KCksCi0JCQkJCQkJCWNlbGxFZGl0b3IuZ2V0Q29sdW1uSW5kZXgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSBjbGFzcyBWYWxpZGF0aW5nRm9jdXNBZGFwdGVyIGV4dGVuZHMgRm9jdXNBZGFwdGVyIHsKLQkvLyBwcml2YXRlIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yOwotCS8vCi0JLy8gVmFsaWRhdGluZ0ZvY3VzQWRhcHRlcihWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcikgewotCS8vIHRoaXMuY2VsbEVkaXRvciA9IGNlbGxFZGl0b3I7Ci0JLy8gfQotCS8vCi0JLy8gcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCS8vIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JLy8KLQkvLyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JLy8gaWYgKGNlbGxFZGl0b3IuZ2V0TGFzdEludmFsaWRFbGVtZW50KCkgIT0gbnVsbCkgewotCS8vIEF1dGhvcmluZ1VJUGx1Z2luCi0JLy8gLmdldERlZmF1bHQoKQotCS8vIC5nZXRNc2dEaWFsb2coKQotCS8vIC5kaXNwbGF5RXJyb3IoCi0JLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkvLyAuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS5lZGl0UHJvY2Vzc0VsZW1lbnRFcnJvckRpYWxvZy50aXRsZSIpLAotCS8vIC8vJE5PTi1OTFMtMSQKLQkvLyBjZWxsRWRpdG9yLmdldEVycm9yTWVzc2FnZSgpKTsKLQkvLyB2aWV3ZXIuZWRpdEVsZW1lbnQoY2VsbEVkaXRvci5nZXRMYXN0SW52YWxpZEVsZW1lbnQoKSwKLQkvLyBjZWxsRWRpdG9yLmdldENvbHVtbkluZGV4KCkpOwotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLyB9KTsKLQkvLyB9Ci0JLy8gfQotCi0JLy8gcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50ID0gbnVsbDsKLQotCXByaXZhdGUgQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbkRlc2NyaXB0b3JzOwotCi0JLy8gcHJpdmF0ZSBib29sZWFuIHZhbGlkTmFtZVByb21wdGVkID0gZmFsc2U7Ci0JLy8gcHJpdmF0ZSBpbnQgcHJvbXB0Q291bnQgPSAwOwotCi0JLy8gcHJpdmF0ZSBNZXRob2RFbGVtZW50IHByb21wdGVkRWxlbWVudDsKLQotCS8vIHByaXZhdGUgVGFibGVUcmVlVmlld2VyIHRhYmxlVHJlZVZpZXdlcjsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQkvLyBwcml2YXRlIGludCB0YWJJbmRleDsKLQotCS8vIHByaXZhdGUgT2JqZWN0IHRhYkZvbGRlcjsKLQotCXByb3RlY3RlZCBQcm9jZXNzVmlld2VyIHZpZXdlcjsKLQotCXByaXZhdGUgVGV4dENlbGxFZGl0b3IgdGV4dENlbGxFZGl0b3I7Ci0KLQlwcml2YXRlIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBuYW1lQ2VsbEVkaXRvcjsKLQotCXByaXZhdGUgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIHByZWRMaXN0Q2VsbEVkaXRvcjsKLQotCXByaXZhdGUgQ29tYm9Cb3hDZWxsRWRpdG9yIGNvbWJvQm94Q2VsbEVkaXRvcjsKLQotCXByaXZhdGUgQ2hlY2tib3hDZWxsRWRpdG9yIGNoZWNrQm94Q2VsbEVkaXRvcjsKLQotCXByaXZhdGUgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIHByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yOwotCi0JLy8gcHJpdmF0ZSBIYXNoTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwOwotCXByaXZhdGUgYm9vbGVhbiBpc1JlYWRPbmx5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKEZvcm1FZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsCi0JCQlTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIoZWRpdG9yLCBpZCwgdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIElmIHJldHVybnMgdHJ1ZSwgZWRpdGluZyBpcyBkaXNhYmxlZCBvciBub3QgYXZhaWxhYmxlIGZvciB0aGUgcHJvY2VzcyAKLQkgKiBicmVha2Rvd24gc3RydWN0dXJlLgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCWlmIChpc1JlYWRPbmx5KSB7Ci0JCQlyZXR1cm4gaXNSZWFkT25seTsKLQkJfQotCQlyZXR1cm4gVG5nVXRpbC5pc0xvY2tlZChwcm9jZXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgcmV0dXJucyB0cnVlLCBlZGl0aW5nIGlzIGRpc2FibGVkIG9yIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzIAotCSAqIGJyZWFrZG93biBzdHJ1Y3R1cmUuCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gYmFzaWNJc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gaXNSZWFkT25seTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzL2Rpc2FibGUgbW9kaWZ5aW5nIHByb2Nlc3MgYnJlYWtkb3duIHN0cnVjdHVyZQotCSAqIAotCSAqIEBwYXJhbSBpc1JlYWRPbmx5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiBpc1JlYWRPbmx5KSB7Ci0JCXRoaXMuaXNSZWFkT25seSA9IGlzUmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhZGFwdGVyIGZhY3RvcnkgdG8gY3JlYXRlIGl0ZW0gcHJvdmlkZXIgZm9yIGVhY2ggZWxlbWVudCBpbiAKLQkgKiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZQotCSAqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIFNldHMgY29sdW1uIGRlc2NyaXB0b3JzIHRvIGRlZmluZSB0aGUgY29sdW1ucyBvZiB0aGUgdHJlZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29sdW1uRGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5EZXNjcmlwdG9ycyhDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1uRGVzY3JpcHRvcnMpIHsKLQkJdGhpcy5jb2x1bW5EZXNjcmlwdG9ycyA9IGNvbHVtbkRlc2NyaXB0b3JzOwotCi0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDb2x1bW5Bd2FyZSkgewotCQkJTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQljb2x1bW5JbmRleFRvTmFtZU1hcC5wdXQobmV3IEludGVnZXIoaSksCi0JCQkJCQljb2x1bW5EZXNjcmlwdG9yc1tpXS5pZCk7Ci0JCQl9Ci0JCQkoKElDb2x1bW5Bd2FyZSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChjb2x1bW5JbmRleFRvTmFtZU1hcCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VGV4dChCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBwcm9wLCBTdHJpbmcgdHh0KSB7Ci0JCUlBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMpIHsKLQkJCUxpc3QgcHJlZGVjZXNzb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlOwotCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrUHJlZGVjZXNzb3JMaXN0KHdiZSwgdHh0LCBhZGFwdGVyRmFjdG9yeSwKLQkJCQkJcHJvY2VzcywgcHJlZGVjZXNzb3JzKSA9PSBudWxsKSB7Ci0JCQkJV29ya09yZGVyIHdvID0gbnVsbDsKLQkJCQlpbnQgc2l6ZSA9IHdiZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLnNpemUoKTsKLQkJCQkKLQkJCQkvLyByZW1vdmUgV29ya09yZGVycyBmb3IgcHJlZGVjZXNzb3JzIHRoYXQgYXJlIG5vdCBpbiBwcmVkZWNlc3NvciBsaXN0IGFuZCBhY2NlcHRlZCBieSB0aGUgZmlsdGVyCi0JCQkJLy8KLQkJCQlMaXN0IHByZWRUb0JlRGVsZXRlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJYm9vbGVhbiBudWxsRmlsdGVyID0gZmlsdGVyID09IG51bGw7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd2JlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJd28gPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJaW50IGlkID0gcHJlZGVjZXNzb3JzLmluZGV4T2Yod28uZ2V0UHJlZCgpKTsKLQkJCQkJaWYgKGlkID09IC0xICYmIChudWxsRmlsdGVyIHx8IGZpbHRlci5hY2NlcHQod28uZ2V0UHJlZCgpKSkpIHsKLQkJCQkJCXByZWRUb0JlRGVsZXRlZC5hZGQod28pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHByZWRUb0JlRGVsZXRlZC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlXb3JrT3JkZXIgdyA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXdiZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCQkJdywgLTEpOwotCQkJCX0KLQotCQkJCXNpemUgPSBwcmVkZWNlc3NvcnMuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHByZWRlY2Vzc29ycwotCQkJCQkJCS5nZXQoaSk7Ci0JCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJZmluZF9wcmVkOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd2JlCi0JCQkJCQkJLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJd28gPSAoV29ya09yZGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAod28uZ2V0UHJlZCgpID09IGVsZW1lbnQpIHsKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZmluZF9wcmVkOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghZm91bmQpIHsKLQkJCQkJCXdvID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya09yZGVyKCk7Ci0JCQkJCQl3by5zZXRQcmVkKGVsZW1lbnQpOwotCQkJCQkJLy8gd28uc2V0U3VjYyhlKTsKLQkJCQkJCXdvLnNldExpbmtUeXBlKFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSF9MSVRFUkFMKTsKLQotCQkJCQkJLy8gLy8gdHJ5IHRvIGFkZCB0aGUgbmV3IFdvcmtPcmRlciB0byB0aGUgcmlnaHQgcGxhY2Ugc28KLQkJCQkJCS8vIHRoZSBvcmRlciBvZiBXb3JrT3JkZXIgbGlzdCBjYW4gYmUgcHJlc2VydmVkLgotCQkJCQkJLy8gLy8KLQkJCQkJCS8vIGlmKHByZXYgIT0gbnVsbCkgewotCQkJCQkJLy8gaW50IGlkID0gZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLmluZGV4T2YocHJldikgKyAxOwotCQkJCQkJLy8gaWYoaWQgPj0gZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLnNpemUoKSkgewotCQkJCQkJLy8gZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLmFkZCh3byk7Ci0JCQkJCQkvLyB9Ci0JCQkJCQkvLyBlbHNlIHsKLQkJCQkJCS8vIGUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5hZGQoaWQsIHdvKTsKLQkJCQkJCS8vIH0KLQkJCQkJCS8vIH0KLQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJCXdiZSwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCQkJCQkJd28sIC0xKTsKLQkJCQkJCS8vIHdiZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLmFkZCh3byk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChlLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBhZGFwdGVyLnNldEF0dHJpYnV0ZShlLCBwcm9wLCB0eHQpOwotCi0JCVByb2Nlc3NVdGlsLnNldEF0dHJpYnV0ZShhY3Rpb25NZ3IsIGUsIHByb3AsIHR4dCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dChCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBwcm9wKSB7Ci0JCS8vIGhhbmRsZSBlZGl0aW5nIHByZXNlbnRhdGlvbiBuYW1lIG9mIGV4dGVuZGluZy9jb250cmlidXRpbmcgYWN0aXZpdHkKLQkJLy8gc3BlY2lhbGx5Ci0JCS8vCi0JCWlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUKLQkJCQkmJiBQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhlKSkgewotCQkJcmV0dXJuICgoRGVzY3JpYmFibGVFbGVtZW50KSBlKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCX0KLQotCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGUsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0QXR0cmlidXRlKGUsIHByb3ApOwotCX0KLQotCS8qKgotCSAqIFNldCB0YWIgaW5kZXggZm9yIHRoZSBmb3JtIHBhZ2UKLQkgKiBAcGFyYW0gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWJJbmRleChpbnQgaWQpIHsKLQkJIHRhYkluZGV4ID0gaWQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0YWIgaW5kZXggZm9yIHRoZSBmb3JtIHBhZ2UKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRhYkluZGV4KCkgewotCQlyZXR1cm4gdGFiSW5kZXg7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRhYiBmb2xkZXIKLQkgKiBAcGFyYW0gdGFiRm9sZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFiRm9sZGVyKENUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCS8vIHRoaXMudGFiRm9sZGVyID0gdGFiRm9sZGVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2NyZWF0ZUZvcm1Db250ZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJLy8gY3JlYXRlIGZvcm0gdG9vbGtpdAotCQlTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5zZXRUZXh0KGdldEVkaXRvcigpLmdldFBhcnROYW1lKCkpOwotCi0JCVRhYmxlV3JhcExheW91dCBsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChsYXlvdXQpOwotCi0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwKLQkJCQlTZWN0aW9uLkVYUEFOREVEIHwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIsCi0JCQkJVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQlzZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQlzZWN0aW9uCi0JCQkJLnNldFRleHQoZ2V0VGl0bGUoKQotCQkJCQkJKyAiICIgKyBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VfQlNFZGl0b3IpOyAKLQkJc2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQkvLyBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQkJQ29udHJvbCBjb250cm9sID0gY3JlYXRlQ29udHJvbChjb21wb3NpdGUpOwotCQl0b29sa2l0LmFkYXB0KGNvbnRyb2wsIHRydWUsIHRydWUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDEwOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNjAwOwotCQljb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCVByb2Nlc3NFZGl0b3IgZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIGdldEVkaXRvcigpOwotCQkvLyBlZGl0b3IuY3JlYXRlQ29udGV4dE1lbnVGb3IodGFibGVUcmVlVmlld2VyKTsKLQkJZWRpdG9yLmNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcik7Ci0KLQkJc2V0SW5wdXQocHJvY2Vzcyk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGUgY29udHJvbAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuCi0JICogCQkJQ29udHJvbAotCSAqLwotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyB0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJLy8gVGhpcyBpcyB0aGUgcGFnZSBmb3IgdGhlIHRhYmxlIHRyZWUgdmlld2VyLgotCQkvLwotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQl2aWV3ZXIgPSBuZXcgUHJvY2Vzc1ZpZXdlcihjb21wLCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ2QpOwotCQl2aWV3ZXIuc2V0dXBDb2x1bW5zKGNvbHVtbkRlc2NyaXB0b3JzKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBQcm9jZXNzQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7Ci0KLQotCQl2aWV3ZXIuc2V0QWN0aW9uTWFuYWdlcigoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJLmdldEFjdGlvbk1hbmFnZXIoKSk7Ci0KLQkJdGV4dENlbGxFZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3Iodmlld2VyLmdldENlbGxFZGl0b3JQYXJlbnQoKSk7Ci0JCWNvbWJvQm94Q2VsbEVkaXRvciA9IG5ldyBDb21ib0JveENlbGxFZGl0b3Iodmlld2VyCi0JCQkJLmdldENlbGxFZGl0b3JQYXJlbnQoKSwgbmV3IFN0cmluZ1tdIHsgVFhUX1RSVUUsIFRYVF9GQUxTRSB9KTsKLQkJY2hlY2tCb3hDZWxsRWRpdG9yID0gbmV3IENoZWNrYm94Q2VsbEVkaXRvcih2aWV3ZXIKLQkJCQkuZ2V0Q2VsbEVkaXRvclBhcmVudCgpKTsKLQotCQkvL3NldCBhbGwgZWRpdG9ycyBhbmQgbW9kaWZpZXJzCi0JCXNldEFsbEVkaXRvcnNBbmRNb2RpZmllcnMoKTsKLQkJCi0JCXZpZXdlci5zZXRBdXRvRXhwYW5kTGV2ZWwoMyk7Ci0JCXZpZXdlci5zZXRJbnB1dChwcm9jZXNzKTsKLQotCQkvLyBpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIDsKLQkJLy8gVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IFROR09ialRyYW5zZmVyLmdldEluc3RhbmNlKCkKLQkJLy8gfTsKLQkJLy8gdGFibGVUcmVlVmlld2VyLmFkZERyb3BTdXBwb3J0KERORC5EUk9QX01PVkUsIHRyYW5zZmVycywgbmV3Ci0JCS8vIEJTVGFiRHJvcEFkYXB0ZXIodGFibGVUcmVlVmlld2VyKSk7Ci0KLQkJLy8gQlNFZGl0b3JWaWV3LmdldFZpZXcoKS5jcmVhdGVDb250ZXh0TWVudUZvcih0YWJsZVRyZWVWaWV3ZXIpOwotCQkvLyByZXR1cm4gdGFibGVUcmVlVmlld2VyLmdldENvbnRyb2woKTsKLQotCQlzZXRDb250ZXh0SGVscCh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQotCQlyZXR1cm4gY29tcDsKLQotCX0KLQotCQotCS8qKgotCSAqIFNldCBhbGwgZWRpdG9ycyBhbmQgbW9kaWZpZXJzIGZvciB0aGUgdmlld2VyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFsbEVkaXRvcnNBbmRNb2RpZmllcnMoKQotCXsKLQkJc2V0Q2VsbEVkaXRvcnMoKTsKLQkJc2V0Q2hlY2tCb3hDZWxsRWRpdG9ycygpOwotCi0JCS8vIFNldCB0aGUgY2VsbCBtb2RpZmllcgotCQl2aWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKG5ldyBJQ2VsbE1vZGlmaWVyKCkgewotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllciNjYW5Nb2RpZnkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNhbk1vZGlmeTogZWxlbWVudD0iK2VsZW1lbnQrIiwKLQkJCQkvLyBwcm9wZXJ0eT0iK3Byb3BlcnR5KTsKLQotCQkJCWlmIChpc1JlYWRPbmx5KCkgfHwKLQkJCQkJCShlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkuaXNSZWFkT25seSgpKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0vLwkJCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkKLS8vCQkJCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYgISgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpCi0vLwkJCQkJCQkJLmlzUmVhZE9ubHkoKSkpIHsKLS8vCQkJCQlDb2xsZWN0aW9uIHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQkJCXR5cGVzLmFkZChWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKTsKLS8vCQkJCQlpZiAoVG5nVXRpbAotLy8JCQkJCQkJLmlzR2VuZXJhbGl6ZXIoCi0vLwkJCQkJCQkJCShWYXJpYWJpbGl0eUVsZW1lbnQpICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpCi0vLwkJCQkJCQkJCQkJLmdldE93bmVyKCksIHR5cGVzKSkKLS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJfQotCQkJCQotCQkJCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lECi0JCQkJCQl8fCBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUKLQkJCQkJCXx8IHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTwotCQkJCQkJfHwgcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9ERUxJVkVSQUJMRSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpCi0JCQkJCQkmJiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSB8fCBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KQotCQkJCQkJJiYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXIjZ2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkJCSAqLwotCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJnZXRWYWx1ZTogZWxlbWVudD0iK2VsZW1lbnQrIiwKLQkJCQkvLyBwcm9wZXJ0eT0iK3Byb3BlcnR5KTsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJU3RyaW5nIHZhbCA9IGdldFRleHQoZSwgcHJvcGVydHkpOwotCQkJCXN3aXRjaCAoZ2V0Q2VsbEVkaXRvclR5cGUocHJvcGVydHkpKSB7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ09NQk9fQk9PTEVBTjoKLQkJCQkJaWYgKFRYVF9UUlVFLmVxdWFsc0lnbm9yZUNhc2UodmFsKSkgewotCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKDApOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKDEpOwotCQkJCQl9Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVDoKLQkJCQkJcmV0dXJuIHZhbDsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOOgotCQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbCk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIHZhbDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXIjbW9kaWZ5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIG1vZGlmeShmaW5hbCBPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LAotCQkJCQlPYmplY3QgdmFsdWUpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1vZGlmeTogZWxlbWVudD0iK2VsZW1lbnQrIiwKLQkJCQkvLyBwcm9wZXJ0eT0iK3Byb3BlcnR5KyIsIHZhbHVlPSIrdmFsdWUpOwotCQkJCVdpZGdldCBpdGVtID0gKFdpZGdldCkgZWxlbWVudDsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKGl0ZW0KLQkJCQkJCS5nZXREYXRhKCkpOwotCi0JCQkJZmluYWwgaW50IGNvbHVtbkluZGV4ID0gZ2V0Q29sdW1uSW5kZXgocHJvcGVydHkpOwotCQkJCUNlbGxFZGl0b3IgY2VsbEVkaXRvciA9IHZpZXdlci5nZXRDZWxsRWRpdG9ycygpW2NvbHVtbkluZGV4XTsKLQkJCQlTdHJpbmcgZXJyTXNnID0gY2VsbEVkaXRvci5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQlpZiAoZXJyTXNnICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCVN0cmluZyB0eHQ7Ci0JCQkJc3dpdGNoIChnZXRDZWxsRWRpdG9yVHlwZShwcm9wZXJ0eSkpIHsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUOgotCQkJCQl0eHQgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ09NQk9fQk9PTEVBTjoKLQkJCQkJaW50IGluZGV4ID0gKChOdW1iZXIpIHZhbHVlKS5pbnRWYWx1ZSgpOwotCQkJCQlpZiAoaW5kZXggPT0gMCkgewotCQkJCQkJdHh0ID0gVFhUX1RSVUU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0eHQgPSBUWFRfRkFMU0U7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTjoKLQkJCQkJdHh0ID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdHh0ID0gVG5nVXRpbC5jaGVja051bGwodmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJCXNldFRleHQoYmUsIHByb3BlcnR5LCB0eHQpOwotCQkJCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FCi0JCQkJCQkmJiBTdHJVdGlsLmlzQmxhbmsoYmUuZ2V0TmFtZSgpKSkgewotCQkJCQliZS5zZXROYW1lKHR4dCk7Ci0JCQkJfQotCQkJCQotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQkvKioKLQkgKiBHZXQgY2VsbCBlZGl0b3IgZm9yIHRoZSBnaXZlbiBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uSUQKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKiBAcmV0dXJuCi0JICogCQkJQ2VsbCBFZGl0b3IKLQkgKi8KLQlwdWJsaWMgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKFN0cmluZyBjb2x1bW5JRCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChjb2x1bW5JRCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlpZiAocHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3IgPT0gbnVsbCkgewotCQkJCXByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yID0gbmV3IFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvcigKLQkJCQkJCXZpZXdlci5nZXRDZWxsRWRpdG9yUGFyZW50KCkpIHsKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBlLCBTdHJpbmcgdHh0KSB7Ci0JCQkJCQllID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9ICgoUHJvY2Vzc0VkaXRvcilnZXRFZGl0b3IoKSkuZ2V0U3VwcHJlc3Npb24oKTsKLQkJCQkJCWJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCA9IHRydWU7Ci0JCQkJCQlyZXR1cm4gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmNoZWNrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoCi0JCQkJCQkJCQkJYWRhcHRlckZhY3RvcnksIChCcmVha2Rvd25FbGVtZW50KSBlLAotCQkJCQkJCQkJCXR4dCwgc3VwcHJlc3Npb24sIGlnbm9yZVN1cHByZXNzZWQpOwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCXByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yCi0JCQkJCQkuc2V0VmFsaWRhdG9yKG5ldyBDZWxsRWRpdG9yVmFsaWRhdG9yKAotCQkJCQkJCQlwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvcikpOwotCQkJCS8vIHByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yLmdldENvbnRyb2woKS5hZGRGb2N1c0xpc3RlbmVyKG5ldwotCQkJCS8vIFZhbGlkYXRpbmdGb2N1c0FkYXB0ZXIocHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3IpKTsKLQkJCQlwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvci5nZXRDb250cm9sKCkuYWRkTGlzdGVuZXIoCi0JCQkJCQlTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCW5ldyBWYWxpZGF0aW5nRGVhY3RpdmF0ZUxpc3RlbmVyKAotCQkJCQkJCQlwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvcikpOwotCQkJfQotCQkJcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3Iuc2V0Q29sdW1uSW5kZXgoY29sdW1uSW5kZXgpOwotCi0JCQlyZXR1cm4gcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3I7Ci0JCX0gZWxzZSBpZiAoY29sdW1uSUQgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKSB7Ci0JCQlpZiAobmFtZUNlbGxFZGl0b3IgPT0gbnVsbCkgewotCQkJCW5hbWVDZWxsRWRpdG9yID0gbmV3IFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvcih2aWV3ZXIKLQkJCQkJCS5nZXRDZWxsRWRpdG9yUGFyZW50KCkpIHsKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBlLCBTdHJpbmcgdHh0KSB7Ci0JCQkJCQllID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9ICgoUHJvY2Vzc0VkaXRvcilnZXRFZGl0b3IoKSkuZ2V0U3VwcHJlc3Npb24oKTsKLQkJCQkJCXJldHVybiBUbmdVdGlsCi0JCQkJCQkJCS5jaGVja0FjdGl2aXR5TmFtZShhZGFwdGVyRmFjdG9yeSwgZSwgdHh0LCBzdXBwcmVzc2lvbik7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCW5hbWVDZWxsRWRpdG9yLnNldFZhbGlkYXRvcihuZXcgQ2VsbEVkaXRvclZhbGlkYXRvcigKLQkJCQkJCW5hbWVDZWxsRWRpdG9yKSk7Ci0JCQkJLy8gbmFtZUNlbGxFZGl0b3IuZ2V0Q29udHJvbCgpLmFkZEZvY3VzTGlzdGVuZXIobmV3Ci0JCQkJLy8gVmFsaWRhdGluZ0ZvY3VzQWRhcHRlcihuYW1lQ2VsbEVkaXRvcikpOwotCQkJCW5hbWVDZWxsRWRpdG9yLmdldENvbnRyb2woKS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCW5ldyBWYWxpZGF0aW5nRGVhY3RpdmF0ZUxpc3RlbmVyKG5hbWVDZWxsRWRpdG9yKSk7Ci0JCQl9Ci0JCQluYW1lQ2VsbEVkaXRvci5zZXRDb2x1bW5JbmRleChjb2x1bW5JbmRleCk7Ci0KLQkJCXJldHVybiBuYW1lQ2VsbEVkaXRvcjsKLQkJfSBlbHNlIGlmIChjb2x1bW5JRCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUykgewotCQkJaWYgKHByZWRMaXN0Q2VsbEVkaXRvciA9PSBudWxsKSB7Ci0JCQkJcHJlZExpc3RDZWxsRWRpdG9yID0gbmV3IFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvcih2aWV3ZXIKLQkJCQkJCS5nZXRDZWxsRWRpdG9yUGFyZW50KCkpIHsKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBlLCBTdHJpbmcgdHh0KSB7Ci0JCQkJCQllID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQkJCQlyZXR1cm4gUHJvY2Vzc1V0aWwuY2hlY2tQcmVkZWNlc3Nvckxpc3QoCi0JCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgZSwgdHh0LCBhZGFwdGVyRmFjdG9yeSwKLQkJCQkJCQkJcHJvY2VzcywgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXByZWRMaXN0Q2VsbEVkaXRvci5zZXRWYWxpZGF0b3IobmV3IENlbGxFZGl0b3JWYWxpZGF0b3IoCi0JCQkJCQlwcmVkTGlzdENlbGxFZGl0b3IpKTsKLQkJCQkvLyBwcmVkTGlzdENlbGxFZGl0b3IuZ2V0Q29udHJvbCgpLmFkZEZvY3VzTGlzdGVuZXIobmV3Ci0JCQkJLy8gVmFsaWRhdGluZ0ZvY3VzQWRhcHRlcihwcmVkTGlzdENlbGxFZGl0b3IpKTsKLQkJCQlwcmVkTGlzdENlbGxFZGl0b3IuZ2V0Q29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJbmV3IFZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIocHJlZExpc3RDZWxsRWRpdG9yKSk7Ci0JCQl9Ci0JCQlwcmVkTGlzdENlbGxFZGl0b3Iuc2V0Q29sdW1uSW5kZXgoY29sdW1uSW5kZXgpOwotCi0JCQlyZXR1cm4gcHJlZExpc3RDZWxsRWRpdG9yOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldCBjZWxsIGVkaXRvcnMgZm9yIGFsbCBjb2x1bW5zIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENlbGxFZGl0b3JzKCkgewotCQlDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvcltjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDZWxsRWRpdG9yIGNlbGxFZGl0b3IgPSBnZXRDZWxsRWRpdG9yKGNvbHVtbkRlc2NyaXB0b3JzW2ldLmlkLCBpKTsKLQkJCWlmIChjZWxsRWRpdG9yICE9IG51bGwpIHsKLQkJCQljZWxsRWRpdG9yc1tpXSA9IGNlbGxFZGl0b3I7Ci0JCQl9IGVsc2UgewotCQkJCXN3aXRjaCAoY29sdW1uRGVzY3JpcHRvcnNbaV0uY2VsbEVkaXRvclR5cGUpIHsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DT01CT19CT09MRUFOOgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IGNvbWJvQm94Q2VsbEVkaXRvcjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVDoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSB0ZXh0Q2VsbEVkaXRvcjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTjoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSBjaGVja0JveENlbGxFZGl0b3I7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdmlld2VyLnNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQl9Ci0JCi0JCi0JCi0KLQkvKioKLQkgKiBTZXQgaW5wdXQgZm9yIHZpZXdlcgotCSAqIEBwYXJhbSBuZXdJbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlwcm9jZXNzID0gKFByb2Nlc3MpIG5ld0lucHV0OwotCQkJaWYgKHByb2Nlc3MuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXZpZXdlci5zZXRJbnB1dChwcm9jZXNzLmVDb250YWluZXIoKSk7Ci0JCQkJLy8gdmlld2VyLmV4cGFuZEFsbCgpOwotLy8JCQkJdmlld2VyLnJldmVhbChwcm9jZXNzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJdmlld2VyLnNldElucHV0KG51bGwpOwotCX0KLQotCXByaXZhdGUgaW50IGdldENvbHVtbkluZGV4KFN0cmluZyBwcm9wZXJ0eSkgewotCQlPYmplY3RbXSBjb2xQcm9wcyA9IHZpZXdlci5nZXRDb2x1bW5Qcm9wZXJ0aWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sUHJvcHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb2xQcm9wc1tpXSA9PSBwcm9wZXJ0eSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0Q2VsbEVkaXRvclR5cGUoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCUNvbHVtbkRlc2NyaXB0b3IgZGVzYyA9IGNvbHVtbkRlc2NyaXB0b3JzW2ldOwotCQkJaWYgKGRlc2MuaWQgPT0gcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gZGVzYy5jZWxsRWRpdG9yVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX05PTkU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHZpZXdlcgotCSAqLwotCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIFNldCBwcm9jZXNzIGFzIGlucHV0Ci0JICogQHBhcmFtIHByb2MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzKFByb2Nlc3MgcHJvYykgewotCQlpZiAocHJvY2VzcyAhPSBwcm9jKSB7Ci0JCQlzZXRJbnB1dChwcm9jKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFkYXB0ZXJGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBjb2x1bW5zIHdpdGggbmV3IGNvbHVtbiBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSBuZXdDb2x1bW5EZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbHVtbnMoQ29sdW1uRGVzY3JpcHRvcltdIG5ld0NvbHVtbkRlc2NyaXB0b3JzKSB7Ci0JCXNldENvbHVtbkRlc2NyaXB0b3JzKG5ld0NvbHVtbkRlc2NyaXB0b3JzKTsKLQkJdmlld2VyLnNldHVwQ29sdW1ucyhuZXdDb2x1bW5EZXNjcmlwdG9ycyk7CQotCQlzZXRBbGxFZGl0b3JzQW5kTW9kaWZpZXJzKCk7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gaWYoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSB7Ci0JCS8vICgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZGlzcG9zZSgpOwotCQkvLyB9Ci0KLQkJaWYgKHZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKHZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCkgIT0gbnVsbCkgewotCQkJdmlld2VyLmdldExhYmVsUHJvdmlkZXIoKS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENvbnRleHRIZWxwKENvbnRyb2wgY29udHJvbCkgewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjID0gZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJQWRhcHRlckZhY3RvcnkgYWxsRmFjID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJQWRhcHRlckZhY3Rvcnkgd2JzRmFjID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJQWRhcHRlckZhY3Rvcnkgb2JzRmFjID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJQWRhcHRlckZhY3RvcnkgcGJzRmFjID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogY3VycmVudCBkYWRwdGVyIGZhYyA9ICIgKyBhZGFwdGVyRmFjKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6IGFsbCBkYWRwdGVyIGZhYyA9ICIgKyBhbGxGYWMpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogd2JzIGRhZHB0ZXIgZmFjID0gIiArIHdic0ZhYyk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiBvYnMgZGFkcHRlciBmYWMgPSAiICsgb2JzRmFjKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6IHBicyBkYWRwdGVyIGZhYyA9ICIgKyBwYnNGYWMpOwotCi0JCWlmIChhZGFwdGVyRmFjID09IHdic0ZhYykKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29udHJvbCwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRk9STV9FRElUT1JfUFJPQ0VTU19XQlNfQ09OVEVYVCk7Ci0JCWVsc2UgaWYgKGFkYXB0ZXJGYWMgPT0gb2JzRmFjKQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb250cm9sLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GT1JNX0VESVRPUl9QUk9DRVNTX09CU19DT05URVhUKTsKLQkJZWxzZSBpZiAoYWRhcHRlckZhYyA9PSBwYnNGYWMpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbnRyb2wsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkZPUk1fRURJVE9SX1BST0NFU1NfUEJTX0NPTlRFWFQpOwotCQllbHNlIGlmIChhZGFwdGVyRmFjID09IGFsbEZhYykKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29udHJvbCwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRk9STV9FRElUT1JfUFJPQ0VTU19BTExCU19DT05URVhUKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhZGRpdGlvbmFsIGFjdGlvbnMgdG8gY29udHJpYnV0ZSB0byB0aGUgY29udGV4dCBtZW51LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCQlBY3Rpb25zCi0JICovCi0JcHVibGljIElBY3Rpb25bXSBnZXRBZGRpdGlvbmFsQWN0aW9ucygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFNldCBjaGVjayBib3ggY2VsbCBlZGl0b3JzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tCb3hDZWxsRWRpdG9ycygpIHsKLQkJQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3JbXSBjZWxsRWRpdG9ycyA9IG5ldyBBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcltjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzd2l0Y2ggKGNvbHVtbkRlc2NyaXB0b3JzW2ldLmNlbGxFZGl0b3JUeXBlKSB7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTjoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSBuZXcgUHJvY2Vzc0NoZWNrQm94Q2VsbEVkaXRvcih2aWV3ZXIKLQkJCQkJCQkuZ2V0Q2VsbEVkaXRvclBhcmVudCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSBudWxsOwotCQkJfQotCQl9Ci0JCSgoUHJvY2Vzc1ZpZXdlcikgdmlld2VyKS5zZXRDaGVja0JveENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzllMDJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuRWRpdG9yc0NvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5EZWNvcmF0ZWRGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgcHJvY2VzcyBkZXNjcmlwdGlvbi4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogVE9ETzogUmVuYW1lIHRoaXMgY2xhc3MgdG8gUHJvY2Vzc0Rlc2NyaXB0aW9uUGFnZQotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0Rlc2NyaXB0aW9uIGV4dGVuZHMgUHJvY2Vzc0Zvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicHJvY2Vzc0Rlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVCA9IDI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBHRU5FUkFMX1NFQ1RJT05fSUQgPSAxOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVUQUlMX1NFQ1RJT05fSUQgPSAyOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQl9OwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBmb3JtU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGV4cGFuZGVkQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbmFtZTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZfZGVzYywgY3RybF9leHRlcm5hbF9pZDsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfcHVycG9zZTsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfZnVsbF9kZXNjOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9zY29wZSwgY3RybF91c2FnZV9ub3RlczsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfYWx0ZXJuYXRpdmVzLCBjdHJsX2hvd190b19zdGFmZiwKLQkJCWN0cmxfa2V5X2NvbnNpZGVyYXRpb247Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBhY3RpdmVDb250cm9sOwotCi0JcHJpdmF0ZSBTZWN0aW9uIGdlbmVyYWxTZWN0aW9uLCBkZXRhaWxTZWN0aW9uLCBjb25maWdTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlLCBkZXRhaWxDb21wb3NpdGUsIGNvbmZpZ0NvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGRlc2NFeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmFsU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGRldGFpbFNlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maWdTZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2V4cGFuZGVkOwotCi0JcHJpdmF0ZSBJbWFnZUh5cGVybGluayBleHBhbmRMaW5rOwotCi0JcHJpdmF0ZSBEZWNvcmF0ZWRGaWVsZCBleHBhbmRMYWJlbDsKLQotCS8vIHByaXZhdGUgU3RyaW5nW10gdmFyaWFiaWxpdHlUeXBlcyA9IG5ldyBTdHJpbmdbXSB7Ik4vQSIsICJDb250cmlidXRlcyIsCi0JLy8gIkV4dGVuZHMiLCAiUmVwbGFjZXMifTsKLQkvLyBwcml2YXRlIEhhc2hNYXAgdmFyaWFiaWxpdHlFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCBsaXN0X2NvbmZpZ3VyYXRpb25zOwotCi0JcHJpdmF0ZSBMaXN0Vmlld2VyIGNvbmZpZ0xpc3RWaWV3ZXI7Ci0KLQlwcml2YXRlIEJ1dHRvbiBidXR0b25BZGQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBidXR0b25SZW1vdmU7Ci0KLQkvLyBwcml2YXRlIEJ1dHRvbiBidXR0b25FZGl0OwotCXByaXZhdGUgQnV0dG9uIGJ1dHRvbk1ha2VEZWZhdWx0OwotCi0JcHJpdmF0ZSBUZXh0IHRleHRDb25maWdEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBjb25maWdMaXN0QWRhcHRlcjsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBjb250ZW50TW9kaWZ5TGlzdGVuZXI7Ci0KLS8vCXByaXZhdGUgQWRhcHRlciBwcm9jZXNzTGlzdGVuZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBwcm9jZXNzVHlwZTsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3I7Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG5hbWVNb2RpZnlMaXN0ZW5lcjsKLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwb3NlZDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NEZXNjcmlwdGlvbihGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25QYWdlX3RpdGxlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQkvLyBjcmVhdGUgZm9ybSB0b29sa2l0Ci0JCXN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKLQotCQlwcm9jZXNzVHlwZSA9IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIocHJvY2Vzcyk7Ci0JCXNldEZvcm1UZXh0KCk7Ci0KLQkJLy8gY3JlYXRlIGVkaXRvciBjb250ZW50Ci0JCWNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0KLS8vCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGlzdGVuIHRvIGNoYW5nZSBpbiBwcm9jZXNzJ3MgZGF0YQotLy8JCWlmIChwcm9jZXNzTGlzdGVuZXIgPT0gbnVsbCkgewotLy8JCQlwcm9jZXNzTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0vLwkJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLS8vCQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoUHJvY2Vzcy5jbGFzcykpIHsKLS8vCQkJCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fTkFNRToKLS8vCQkJCQkJcmVmcmVzaEVsZW1lbnROYW1lKG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpKTsKLS8vCQkJCQkJYnJlYWs7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9OwotLy8JCX0KLS8vCQlwcm9jZXNzLmVBZGFwdGVycygpLmFkZChwcm9jZXNzTGlzdGVuZXIpOwotCi0JCWxvYWREYXRhKCk7Ci0JCWFkZExpc3RlbmVycygpOwotCi0JCUVkaXRvcnNDb250ZXh0SGVscGVyLnNldEhlbHAoZ2V0UGFydENvbnRyb2woKSwgcHJvY2Vzc1R5cGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXRvciB0YWIgY29udGVudAotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQljcmVhdGVGb3JtQ29tcG9zaXRlcygpOwotCQljcmVhdGVHZW5lcmFsU2VjdGlvbigpOwotCQljcmVhdGVEZXRhaWxTZWN0aW9uKCk7Ci0JCWNyZWF0ZUNvbmZpZ3VyYXRpb25TZWN0aW9uKCk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGRldGFpbENvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbmZpZ0NvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGV4cGFuZGVkQ29tcG9zaXRlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRm9ybUNvbXBvc2l0ZXMoKSB7Ci0JCWZvcm1TZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLCBTZWN0aW9uLk5PX1RJVExFKTsKLQkJewotCQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJCWZvcm1TZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQkJZm9ybVNlY3Rpb24uc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgdGhlIGNvbXBvc2l0ZSBmb3IgdGhlIHNlY3Rpb25zCi0JCXNlY3Rpb25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtU2VjdGlvbiwgU1dULk5PTkUpOwotCQlzZWN0aW9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoKSk7Ci0JCXNlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0JCWZvcm1TZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ29tcG9zaXRlKTsKLQotCQlleHBhbmRlZENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZvcm1TZWN0aW9uLCBTV1QuTk9ORSk7Ci0JCXsKLQkJCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKHRkKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGV4cGFuZGVkQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLlJJQ0hfVEVYVF9FRElUT1JfQ09OVEVYVF9JRCk7Ci0KLQkJLy8gQWRkIHRoZSBleHBhbmQvY29sbGFwc2UgaHlwZXJsaW5rIGltYWdlLgotCQlleHBhbmRMaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhleHBhbmRlZENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlleHBhbmRMaW5rLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCk7Ci0JCWV4cGFuZExpbmsuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xvc2VSVEUpOwotCQlleHBhbmRMaW5rLnNldFVuZGVybGluZWQoZmFsc2UpOwotCQlleHBhbmRMaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdG9nZ2xlKGUpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgdGhlIGV4cGFuZC9jb2xsYXBzZSBoeXBlcmxpbmsgdGV4dC4KLQkJZXhwYW5kTGFiZWwgPSBjcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBleHBhbmRlZENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZ2VuZXJhbCBzZWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oKSB7Ci0JCS8vIGNyZWF0ZSBHZW5lcmFsIEluZm9ybWF0aW9uIHNlY3Rpb24KLQkJZ2VuZXJhbFNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuR0VORVJBTF9JTkZPX1NFQ1RJT05fTkFNRSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCUF1dGhvcmluZ1VJVGV4dC5HRU5FUkFMX0lORk9fU0VDVElPTl9ERVNDLAotCQkJCW5ldyBTdHJpbmdbXSB7IHByb2Nlc3NUeXBlIH0pKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWdlbmVyYWxDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShnZW5lcmFsU2VjdGlvbik7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldENsaWVudChnZW5lcmFsQ29tcG9zaXRlKTsKLQotCQkvLyBuYW1lCi0JCWN0cmxfbmFtZSA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0Lk5BTUVfVEVYVCk7Ci0KLQkJLy8gUHJlc2VudGF0aW9uIG5hbWUKLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZSA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsKHRvb2xraXQsCi0JCQkJZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlBSRVNFTlRBVElPTl9OQU1FX1RFWFQpOwotCi0JCS8vIGJyaWVmIGRlc2MKLQkJY3RybF9icmllZl9kZXNjID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwyKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQpOwotCi0JCS8vIEV4dGVybmFsIElkCi0JCWN0cmxfZXh0ZXJuYWxfaWQgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfRXh0ZXJuYWxJRCk7IAotCi0JCS8vIFB1cnBvc2UKLQkJY3RybF9wdXJwb3NlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCXRvb2xraXQsCi0JCQkJZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1B1cnBvc2UsIDQwLCA0MDAsIEdFTkVSQUxfU0VDVElPTl9JRCk7IAotCi0JCS8vIC8vIGNyZWF0ZSBleHBhbmRlZCBjb21wb3NpdGUKLQkJLy8gZXhwYW5kR2VuZXJhbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxTZWN0aW9uKTsKLQkJLy8gZXhwYW5kR2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldwotCQkvLyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJLy8gZXhwYW5kR2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJLy8gZXhwYW5kR2VuZXJhbENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJLy8JCQotCQkvLyAvLyBIeXBlcmxpbmsgZGVzYwotCQkvLyBleHBhbmRHZW5lcmFsTGluayA9Ci0JCS8vIHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsoZXhwYW5kR2VuZXJhbENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkvLyBleHBhbmRHZW5lcmFsTGluay5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfRVhQQU5ERUQpOwotCQkvLyBleHBhbmRHZW5lcmFsTGluay5zZXRVbmRlcmxpbmVkKGZhbHNlKTsKLQkJLy8gZXhwYW5kR2VuZXJhbExpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKQotCQkvLyB7Ci0JCS8vIHB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkKLQkJLy8gewotCQkvLyB0b2dnbGUoZSwgR0VORVJBTF9TRUNUSU9OX0lEKTsKLQkJLy8gfQotCQkvLyB9KTsKLQkJLy8JCQotCQkvLyBleHBhbmRHZW5lcmFsTGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBleHBhbmRHZW5lcmFsQ29tcG9zaXRlLAotCQkvLyAiIik7Ci0KLQkJLy8gc2V0IGZvY3VzIG9uIHRoZSBuYW1lIGF0dHJpYnV0ZQotCQlEaXNwbGF5IGRpc3BsYXkgPSBmb3JtLmdldEJvZHkoKS5nZXREaXNwbGF5KCk7Ci0JCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZGV0YWlsIHNlY3Rpb24KLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURldGFpbFNlY3Rpb24oKSB7Ci0JCS8vIGNyZWF0ZSBkZXRhaWwgc2VjdGlvbgotCQlkZXRhaWxTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJZGV0YWlsU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJZGV0YWlsU2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5ERVRBSUxfU0VDVElPTl9OQU1FKTsKLQkJZGV0YWlsU2VjdGlvbi5zZXREZXNjcmlwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQlBdXRob3JpbmdVSVRleHQuREVUQUlMX1NFQ1RJT05fREVTQywKLQkJCQluZXcgU3RyaW5nW10geyBwcm9jZXNzVHlwZSB9KSk7Ci0JCWRldGFpbFNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWRldGFpbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGRldGFpbFNlY3Rpb24pOwotCQlkZXRhaWxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWRldGFpbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJZGV0YWlsU2VjdGlvbi5zZXRDbGllbnQoZGV0YWlsQ29tcG9zaXRlKTsKLQotCQkvLyBmdWxsIGRlc2NyaXB0aW9uCi0JCWN0cmxfZnVsbF9kZXNjID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTUFJTl9ERVNDUklQVElPTl9URVhULCAxMDAsCi0JCQkJNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7Ci0KLQkJLy8gc2NvcGUKLQkJY3RybF9zY29wZSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19TY29wZSwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gdXNhZ2Ugbm90ZXMKLQkJY3RybF91c2FnZV9ub3RlcyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1VzYWdlTm90ZXMsIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgCi0KLQkJLy8gYWx0ZXJuYXRpdmVzCi0JCWN0cmxfYWx0ZXJuYXRpdmVzID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCXRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfQWx0ZXJuYXRpdmVzLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCi0JCS8vIGhvdyB0byBzdGFmZgotCQljdHJsX2hvd190b19zdGFmZiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0hvd1RvU3RhZmYsIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgCi0KLQkJLy8ga2V5IGNvbnNpZGVyYXRpb24KLQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0tleUNvbnNpZGVyYXRpb24sIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgCi0KLQkJLy8gLy8gY3JlYXRlIGV4cGFuZGVkIGNvbXBvc2l0ZQotCQkvLyBleHBhbmREZXRhaWxDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShkZXRhaWxTZWN0aW9uKTsKLQkJLy8gZXhwYW5kRGV0YWlsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3Ci0JCS8vIEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkvLyBleHBhbmREZXRhaWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCS8vIGV4cGFuZERldGFpbENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJLy8JCQotCQkvLyAvLyBIeXBlcmxpbmsgZGVzYwotCQkvLyBleHBhbmREZXRhaWxMaW5rID0KLQkJLy8gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhleHBhbmREZXRhaWxDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJLy8gZXhwYW5kRGV0YWlsTGluay5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfRVhQQU5ERUQpOwotCQkvLyBleHBhbmREZXRhaWxMaW5rLnNldFVuZGVybGluZWQoZmFsc2UpOwotCQkvLyBleHBhbmREZXRhaWxMaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkKLQkJLy8gewotCQkvLyBwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpCi0JCS8vIHsKLQkJLy8gdG9nZ2xlKGUsIERFVEFJTF9TRUNUSU9OX0lEKTsKLQkJLy8gfQotCQkvLyB9KTsKLQkJLy8JCQotCQkvLyBleHBhbmREZXRhaWxMYWJlbCA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsIGV4cGFuZERldGFpbENvbXBvc2l0ZSwgIiIpOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGNvbmZpZ3VyYXRpb24gc2VjdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbmZpZ3VyYXRpb25TZWN0aW9uKCkgewotCQkvLyBjcmVhdGUgQ29uZmlndXJhdGlvbiBzZWN0aW9uCi0JCWNvbmZpZ1NlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkMSA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJY29uZmlnU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkMSk7Ci0JCWNvbmZpZ1NlY3Rpb24KLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25UaXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJY29uZmlnU2VjdGlvbgotCQkJCS5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQljb25maWdTZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljb25maWdDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShjb25maWdTZWN0aW9uKTsKLQkJY29uZmlnQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb25maWdDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWNvbmZpZ1NlY3Rpb24uc2V0Q2xpZW50KGNvbmZpZ0NvbXBvc2l0ZSk7Ci0KLQkJTGFiZWwgbF9lbGVtZW50ID0gdG9vbGtpdAotCQkJCS5jcmVhdGVMYWJlbCgKLQkJCQkJCWNvbmZpZ0NvbXBvc2l0ZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9ucyk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkVORCwgdHJ1ZSwKLQkJCQkJdHJ1ZSwgMiwgMSk7Ci0JCQlsX2VsZW1lbnQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlsaXN0X2NvbmZpZ3VyYXRpb25zID0gVUlIZWxwZXIuY3JlYXRlTGlzdCh0b29sa2l0LCBjb25maWdDb21wb3NpdGUsCi0JCQkJU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDIwMDsKLQkJCWxpc3RfY29uZmlndXJhdGlvbnMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY29uZmlnTGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKGxpc3RfY29uZmlndXJhdGlvbnMpOwotCQljb25maWdMaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQljb25maWdMaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKSB7Ci0JCQkJCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoCi0JCQkJCQkJImljb25zL2NoZWNrZWQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCVN0cmluZyB0eHQgPSBsYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKSB7Ci0JCQkJCXR4dCA9IHR4dAotCQkJCQkJCSsgIiAiICsgQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ7IAotCQkJCX0KLQkJCQlyZXR1cm4gdHh0OwotCQkJfQotCQl9KTsKLQotCQlDb21wb3NpdGUgYnV0dG9uUGFuZWwgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShjb25maWdDb21wb3NpdGUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwKLQkJCQkJZmFsc2UpOwotCQkJLy8gZ3JpZERhdGEud2lkdGhIaW50ID0gODA7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gNDsKLQkJCWJ1dHRvblBhbmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJYnV0dG9uUGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCX0KLQkJLy8gQWRkIGJ1dHRvbgotCQlCdXR0b24gYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uUGFuZWwsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZEJ1dHRvbl90ZXh0LCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlidXR0b25BZGQgPSBidXR0b247Ci0KLQkJLy8gUmVtb3ZlIGJ1dHRvbgotCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25QYW5lbCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVtb3ZlQnV0dG9uX3RleHQsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWJ1dHRvblJlbW92ZSA9IGJ1dHRvbjsKLQotCQkvLyAvLyBFZGl0IGJ1dHRvbgotCQkvLyBidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25QYW5lbCwgIkVkaXQuLi4iLCBTV1QuTk9ORSk7Ci0JCS8vIHsKLQkJLy8gR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJLy8gZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVCAqIDY7Ci0JCS8vIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJLy8gfQotCQkvLyBidXR0b25FZGl0ID0gYnV0dG9uOwotCQkvLwkJCi0JCS8vCQkKLQkJLy8gTWFrZSBEZWZhdWx0IGJ1dHRvbgotCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25QYW5lbCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMubWFrZURlZmF1bHRCdXR0b25fdGV4dCwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlidXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJYnV0dG9uTWFrZURlZmF1bHQgPSBidXR0b247Ci0KLQkJLy8gY29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbgotCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQKLQkJCQkuY3JlYXRlTGFiZWwoCi0JCQkJCQljb25maWdDb21wb3NpdGUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuRU5ELCB0cnVlLAotCQkJCQlmYWxzZSwgMiwgMSk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCXRleHRDb25maWdEZXNjcmlwdGlvbiA9IHRvb2xraXQuY3JlYXRlVGV4dChjb25maWdDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCXRleHRDb25maWdEZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQl0ZXh0Q29uZmlnRGVzY3JpcHRpb24uc2V0RWRpdGFibGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0vLwkJaWYgKHByb2Nlc3NMaXN0ZW5lciAhPSBudWxsKSB7Ci0vLwkJCXByb2Nlc3MuZUFkYXB0ZXJzKCkucmVtb3ZlKHByb2Nlc3NMaXN0ZW5lcik7Ci0vLwkJfQotCi0JCWlmIChjb25maWdMaXN0QWRhcHRlciAhPSBudWxsKSB7Ci0JCQljb25maWdMaXN0QWRhcHRlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlkaXNwb3NlZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCBwcm92aWRlciBmb3IgY29uZmlndXJhdGlvbnMKLQkgKgotCSAqLwotCWNsYXNzIENvbmZpZ0xpc3RJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0JCQotCQkvKioKLQkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBDb25maWdMaXN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQlwcm9jZXNzLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcgPSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0KLQkJCWlmIChkZWZhdWx0Q29uZmlnICE9IG51bGwKLQkJCQkJJiYgIXByb2Nlc3MuZ2V0VmFsaWRDb250ZXh0KCkuY29udGFpbnMoZGVmYXVsdENvbmZpZykpIHsKLQkJCQlwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpLmFkZCgwLCBkZWZhdWx0Q29uZmlnKTsKLQkJCX0KLQkJCXJldHVybiBwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIG1zZykgewotCQkJYm9vbGVhbiByZWZyZXNoID0gZmFsc2U7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoUHJvY2Vzcy5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCQlyZWZyZXNoID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChyZWZyZXNoKQotCQkJCWNvbmZpZ0xpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgdm9pZCB1cGRhdGVNb2RlbENvbnRyb2xzKCkgewotCQlpZiAoKGN0cmxfbmFtZSAhPSBudWxsKSAmJiAoIWN0cmxfbmFtZS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlTdHJpbmcgc3RyID0gVG5nVXRpbC5jaGVja051bGwocHJvY2Vzcy5nZXROYW1lKCkpOwotCQkJaWYgKCFzdHIuZXF1YWxzKGN0cmxfbmFtZS5nZXRUZXh0KCkpKSB7Ci0JCQkJY3RybF9uYW1lLnNldFRleHQoc3RyKTsKLQkJCX0KLQkJfQotCQlpZiAoKGN0cmxfYnJpZWZfZGVzYyAhPSBudWxsKSAmJiAoIWN0cmxfYnJpZWZfZGVzYy5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChwcm9jZXNzCi0JCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpKTsKLQkJfQotCQlpZiAoKGN0cmxfcHJlc2VudGF0aW9uX25hbWUgIT0gbnVsbCkKLQkJCQkmJiAoIWN0cmxfcHJlc2VudGF0aW9uX25hbWUuaXNEaXNwb3NlZCgpKSkKLQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChwcm9jZXNzCi0JCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBpbml0aWFsIGRhdGEgZnJvbSBtb2RlbAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREYXRhKCkgewotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiBjb250ZW50ID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uKSBwcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpOwotCi0JCVN0cmluZyBleHRlcm5hbElEID0gY29udGVudC5nZXRFeHRlcm5hbElkKCk7Ci0JCVN0cmluZyBwdXJwb3NlID0gY29udGVudC5nZXRQdXJwb3NlKCk7Ci0JCVN0cmluZyBmdWxsRGVzYyA9IGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyBzY29wZSA9IGNvbnRlbnQuZ2V0U2NvcGUoKTsKLQkJU3RyaW5nIHVzYWdlTm90ZXMgPSBjb250ZW50LmdldFVzYWdlTm90ZXMoKTsKLQkJU3RyaW5nIGFsdGVybmF0aXZlcyA9IGNvbnRlbnQuZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCVN0cmluZyBob3dUb1N0YWZmID0gY29udGVudC5nZXRIb3d0b1N0YWZmKCk7Ci0JCVN0cmluZyBrZXlDb25zaWRlcmF0aW9uID0gY29udGVudC5nZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCi0JCXVwZGF0ZU1vZGVsQ29udHJvbHMoKTsKLQotCQljdHJsX2V4dGVybmFsX2lkLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwoZXh0ZXJuYWxJRCkpOwotCQljdHJsX3B1cnBvc2Uuc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChwdXJwb3NlKSk7Ci0JCWN0cmxfZnVsbF9kZXNjLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwoZnVsbERlc2MpKTsKLQkJY3RybF9zY29wZS5zZXRUZXh0KFRuZ1V0aWwuY2hlY2tOdWxsKHNjb3BlKSk7Ci0JCWN0cmxfdXNhZ2Vfbm90ZXMuc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbCh1c2FnZU5vdGVzKSk7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwoYWx0ZXJuYXRpdmVzKSk7Ci0JCWN0cmxfaG93X3RvX3N0YWZmLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwoaG93VG9TdGFmZikpOwotCQljdHJsX2tleV9jb25zaWRlcmF0aW9uLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwoa2V5Q29uc2lkZXJhdGlvbikpOwotCi0JCWlmIChjb25maWdMaXN0QWRhcHRlciA9PSBudWxsKSB7Ci0JCQljb25maWdMaXN0QWRhcHRlciA9IG5ldyBDb25maWdMaXN0SXRlbVByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0KLQotCQljb25maWdMaXN0Vmlld2VyLnNldElucHV0KGNvbmZpZ0xpc3RBZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQl0aGlzLmVkaXRvciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpOwotCQlmaW5hbCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlmaW5hbCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiBjb250ZW50ID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uKSBwcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQltb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihwcm9jZXNzKTsKLQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKHByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCi0JCWZvcm0uYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCWlmICghZGVzY0V4cGFuZEZsYWcpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKTsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLQkJCQl9Ci0JCQkJZm9ybVNlY3Rpb24ubGF5b3V0KHRydWUsIHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCWZvcm0uZ2V0UGFyZW50KCkuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYoZGlzcG9zZWQpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIHNhdmUgbGFzdCBtb2RpZmllZCByaWNoIHRleHQKLQkJCQllZGl0b3Iuc2F2ZU1vZGlmaWVkUmljaFRleHQoKTsJCQkKLQkJCQkKLQkJCQkvLyBTeW5jaCB1cCBkYXRhIGJldHdlZW4gZGVzY3JpcHRpb24gdGFiIGFuZCBwcm9wZXJ0aWVzIHdpbmRvdwotCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0VGV4dChwcm9jZXNzLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJY3RybF9icmllZl9kZXNjLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChwcm9jZXNzLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCQkJY3RybF9icmllZl9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJCQkKLQkJCQljdHJsX3B1cnBvc2UucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX3B1cnBvc2Uuc2V0VGV4dChjb250ZW50LmdldFB1cnBvc2UoKSk7Ci0JCQkJY3RybF9wdXJwb3NlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJY3RybF9mdWxsX2Rlc2MucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsJCQkKLQkJCQljdHJsX2Z1bGxfZGVzYy5zZXRUZXh0KGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCWN0cmxfZnVsbF9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbi5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24uc2V0VGV4dChjb250ZW50LmdldEtleUNvbnNpZGVyYXRpb25zKCkpOwotCQkJCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkKLQkJCQljdHJsX2FsdGVybmF0aXZlcy5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfYWx0ZXJuYXRpdmVzLnNldFRleHQoY29udGVudC5nZXRBbHRlcm5hdGl2ZXMoKSk7Ci0JCQkJY3RybF9hbHRlcm5hdGl2ZXMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkKLQkJCQljdHJsX2hvd190b19zdGFmZi5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfaG93X3RvX3N0YWZmLnNldFRleHQoY29udGVudC5nZXRIb3d0b1N0YWZmKCkpOwotCQkJCWN0cmxfaG93X3RvX3N0YWZmLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJCi0JCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQocHJvY2VzcykpIHsKLQkJCQkJcmVmcmVzaChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVmcmVzaCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCW5hbWVNb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihwcm9jZXNzLmVDb250YWluZXIoKSwKLQkJCQl0cnVlKTsKLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5hbWVNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbmFtZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gcHJvY2Vzcy5nZXROYW1lKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3TmFtZSA9IGN0cmxfbmFtZS5nZXRUZXh0KCkudHJpbSgpOwotCQkJCWlmIChuZXdOYW1lLmVxdWFscyhwcm9jZXNzLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgcHJvY2Vzcy5lQ29udGFpbmVyKCk7Ci0JCQkJCi0JCQkJU3RyaW5nIG1zZyA9IG51bGw7Ci0JCQkJaWYgKG5ld05hbWUuaW5kZXhPZigiJiIpID4gLTEpIHsKLQkJCQkJbXNnID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3I0X21zZywgbmV3TmFtZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuY3JlYXRlTmFtZVZhbGlkYXRvcigKLQkJCQkJCQlwcm9jQ29tcCwKLQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQkJbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQobmV3TmFtZSk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV90aXRsZTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX21lc3NhZ2U7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHRpdGxlLCBtZXNzYWdlKSkgewotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQlwcm9jZXNzLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBjdHJsX25hbWUKLQkJCQkJCQkJCQkuZ2V0VGV4dCgpLCAtMSk7Ci0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCWN0cmxfbmFtZS5zZXRUZXh0KHByb2Nlc3MuZ2V0TmFtZSgpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jQ29tcCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJCQkJY3RybF9uYW1lLmdldFRleHQoKSwgLTEpOwotCi0JCQkJCQlzZXRGb3JtVGV4dCgpOwotCi0JCQkJCQkvLyBhZGp1c3QgcGx1Z2luIGxvY2F0aW9uIGFuZCBzYXZlIHRoZSBlZGl0b3IKLQkJCQkJCS8vCi0JCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCQkJCQkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJCQkJCQkJZWRpdG9yLmFkZFJlc291cmNlVG9BZGp1c3RMb2NhdGlvbihwcm9jZXNzCi0JCQkJCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJZWRpdG9yLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY3RybF9uYW1lLnNldFRleHQocHJvY2Vzcy5nZXROYW1lKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwgbXNnKTsgLy8kTk9OLU5MUy0xJAotCQkJCQljdHJsX25hbWUuc2V0VGV4dChwcm9jZXNzLmdldE5hbWUoKSk7Ci0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQljdHJsX25hbWUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJCQkJY3RybF9uYW1lLnNlbGVjdEFsbCgpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQljdHJsX25hbWUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gcHJvY2Vzcy5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoKGN0cmxfcHJlc2VudGF0aW9uX25hbWUuZ2V0VGV4dCgpICE9IG51bGwpCi0JCQkJCQkmJiAoIWN0cmxfcHJlc2VudGF0aW9uX25hbWUuZ2V0VGV4dCgpLmVxdWFscygiIikpKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCQlpZiAoIWN0cmxfcHJlc2VudGF0aW9uX25hbWUuZ2V0VGV4dCgpLmVxdWFscyhvbGRDb250ZW50KSkgewotCi0JCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCXByb2Nlc3MsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCQkJCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuZ2V0VGV4dCgpLCAtMSk7Ci0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0VGV4dChvbGRDb250ZW50KTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0vLwkJCQkJCUxpYnJhcnlWaWV3IGVsZW1lbnRzVmlldyA9IExpYnJhcnlWaWV3LmdldFZpZXcoKTsKLS8vCQkJCQkJaWYgKGVsZW1lbnRzVmlldyAhPSBudWxsKQotLy8JCQkJCQkJZWxlbWVudHNWaWV3LmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHJlc3RvcmUgdGhlIG9sZCBuYW1lIGZpcnN0LCB0aGVuIHByZXNlbnQgdGhlIGVycm9yCi0JCQkJCS8vIG1lc3NhZ2UgYm94Ci0JCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0VGV4dChwcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5pbnZhbGlkUHJlc2VudGF0aW9uTmFtZUVycm9yX21zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYygKLQkJCQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9icmllZl9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9icmllZl9kZXNjLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBwcm9jZXNzLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9icmllZl9kZXNjLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJcHJvY2VzcywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9leHRlcm5hbF9pZC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2V4dGVybmFsX2lkLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0RXh0ZXJuYWxJZCgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF9leHRlcm5hbF9pZCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGN0cmxfZXh0ZXJuYWxfaWQuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQlwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcykgewotCQkJCQkJY3RybF9leHRlcm5hbF9pZC5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCi0JCWN0cmxfcHVycG9zZS5zZXRNb2RhbE9iamVjdChwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9wdXJwb3NlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSk7Ci0JCWN0cmxfcHVycG9zZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3B1cnBvc2UuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3B1cnBvc2U7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0UHVycG9zZSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF9wdXJwb3NlLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSwgbmV3Q29udGVudCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9mdWxsX2Rlc2Muc2V0TW9kYWxPYmplY3QocHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfZnVsbF9kZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQljdHJsX2Z1bGxfZGVzYy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2Z1bGxfZGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfZnVsbF9kZXNjOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldE1haW5EZXNjcmlwdGlvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF9mdWxsX2Rlc2MsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3Njb3BlLnNldE1vZGFsT2JqZWN0KHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3Njb3BlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKSk7Ci0JCWN0cmxfc2NvcGUuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9zY29wZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfc2NvcGU7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0U2NvcGUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfc2NvcGUsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpLCBuZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3VzYWdlX25vdGVzLnNldE1vZGFsT2JqZWN0KHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3VzYWdlX25vdGVzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpKTsKLQkJY3RybF91c2FnZV9ub3Rlcy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3VzYWdlX25vdGVzLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF91c2FnZV9ub3RlczsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRVc2FnZU5vdGVzKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljdHJsX3VzYWdlX25vdGVzLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jZXNzCi0JCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKSwKLQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYWx0ZXJuYXRpdmVzLnNldE1vZGFsT2JqZWN0KHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2FsdGVybmF0aXZlcy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSk7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9hbHRlcm5hdGl2ZXM7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljdHJsX2FsdGVybmF0aXZlcywgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY2VzcwotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwgbmV3Q29udGVudCwKLQkJCQkJCQktMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2hvd190b19zdGFmZi5zZXRNb2RhbE9iamVjdChwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9ob3dfdG9fc3RhZmYuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpKTsKLQkJY3RybF9ob3dfdG9fc3RhZmYuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9ob3dfdG9fc3RhZmYuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2hvd190b19zdGFmZjsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRIb3d0b1N0YWZmKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljdHJsX2hvd190b19zdGFmZiwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY2VzcwotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCksIG5ld0NvbnRlbnQsCi0JCQkJCQkJLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbi5zZXRNb2RhbE9iamVjdChwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbi5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkpOwotCQljdHJsX2tleV9jb25zaWRlcmF0aW9uLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2tleV9jb25zaWRlcmF0aW9uOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljdHJsX2tleV9jb25zaWRlcmF0aW9uLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljb25maWdMaXN0Vmlld2VyCi0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29uZmlnTGlzdFZpZXdlcgotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoKE1ldGhvZENvbmZpZ3VyYXRpb24pIHNlbGVjdGlvbgotCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQkJCQlpZiAoY29uZmlnID09IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKSkgewotCQkJCQkJCQlidXR0b25SZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJYnV0dG9uUmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCVN0cmluZyBkZXNjID0gY29uZmlnLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCWRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQl0ZXh0Q29uZmlnRGVzY3JpcHRpb24uc2V0VGV4dChkZXNjKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCi0JCWJ1dHRvbkFkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KHByb2Nlc3MpOwotCi0JCQkJZmluYWwgQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIgaW5wdXQgPSBuZXcgQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIoCi0JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlsaWIsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgTGlzdFNlbGVjdGlvbkRpYWxvZygKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQlpbnB1dCwKLQkJCQkJCWNvbnRlbnRQcm92aWRlciwKLQkJCQkJCWxhYmVsUHJvdmlkZXIsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRGVzY3JpcHRpb25fc2VsZWN0Q29uZmlndXJhdGlvbikgeyAvLyROT04tTkxTLTEkCi0JCQkJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkJCQkJZ2V0Vmlld2VyKCkuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0KLQkJCQkJCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwKLQkJCQkJCQkJCU9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJCQkJCQkvLyBpbnQgY291bnQgPQotCQkJCQkJCQkvLyBjb25maWdMaXN0Vmlld2VyLmdldExpc3QoKS5nZXRJdGVtQ291bnQoKTsKLQkJCQkJCQkJLy8gZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJCQkJLy8gaWYoZWxlbWVudCA9PQotCQkJCQkJCQkvLyBjb25maWdMaXN0Vmlld2VyLmdldEVsZW1lbnRBdChpKSkgcmV0dXJuCi0JCQkJCQkJCS8vIGZhbHNlOwotCQkJCQkJCQkvLyB9Ci0JCQkJCQkJCS8vIHJldHVybiB0cnVlOwotCQkJCQkJCQlyZXR1cm4gIXByb2Nlc3MuZ2V0VmFsaWRDb250ZXh0KCkuY29udGFpbnMoCi0JCQkJCQkJCQkJZWxlbWVudCk7Ci0JCQkJCQkJfQotCi0JCQkJCQl9KTsKLQkJCQkJCXJldHVybiBjb250cm9sOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCQkJCQlpbnB1dC5kaXNwb3NlKCk7Ci0JCQkJCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJaWYgKGRsZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCU9iamVjdCBvYnNbXSA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCQkJCS8vIGdldCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLS8vCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcgPSBwcm9jZXNzCi0vLwkJCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBvYnNbaV07Ci0JCQkJCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLS8vCQkJCQkJCQl8fCBjaGVja1ZhbGlkaXR5Rm9yU3VwZXJTZXQoZGVmYXVsdENvbmZpZywKLS8vCQkJCQkJCQkJCWNvbmZpZykpIHsKLQkJCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBwcm9jZXNzLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCksIGNvbmZpZywKLQkJCQkJCQkJCS0xKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWRkQ29uZmlnRXJyb3JEaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5pbnZhbGlkQ29uZmlnRXJyb3JfbXNnLCBjb25maWcuZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYnV0dG9uUmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25maWdMaXN0Vmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBwcm9jZXNzLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKSwKLQkJCQkJCXNlbGVjdGlvbi50b0xpc3QoKSwgLTEpOwotCQkJfQotCQl9KTsKLQotCQlidXR0b25NYWtlRGVmYXVsdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29uZmlnTGlzdFZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gcHJvY2VzcwotCQkJCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCi0JCQkJCWlmIChjdXJyZW50Q29uZmlnICE9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkgewotCQkJCQkJYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLQkJCQkJCUxpc3QgdmFsaWRDb250ZXh0ID0gcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHZhbGlkQ29udGV4dC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRvcgotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQlpZiAoIShjaGVja1ZhbGlkaXR5Rm9yU3VwZXJTZXQoCi0JCQkJCQkJCQkoTWV0aG9kQ29uZmlndXJhdGlvbikgc2VsZWN0aW9uCi0JCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSwgY29uZmlnKSkpIHsKLQkJCQkJCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaXNWYWxpZCkgewotCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jZXNzLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKSwKLQkJCQkJCQkJCXNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSwgLTEpOwotCQkJCQkJCWlmICghc3RhdHVzKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJYnV0dG9uUmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTdHJpbmcgc2VsZWN0ZWRDb25maWdOYW1lID0gKChNZXRob2RDb25maWd1cmF0aW9uKSBzZWxlY3Rpb24KLQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0TmFtZSgpOwotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNldERlZmF1bHRDb25maWdFcnJvckRpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNldERlZmF1bHRDb25maWdFcnJvcl9tc2csIHNlbGVjdGVkQ29uZmlnTmFtZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2ggYWxsIHRoZSBjb250cm9scwotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQljdHJsX25hbWUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9icmllZl9kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9wdXJwb3NlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9mdWxsX2Rlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2FsdGVybmF0aXZlcy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfZXh0ZXJuYWxfaWQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2tleV9jb25zaWRlcmF0aW9uLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9ob3dfdG9fc3RhZmYuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3Njb3BlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF91c2FnZV9ub3Rlcy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2V4cGFuZGVkICE9IG51bGwpIHsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWJ1dHRvbkFkZC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJYnV0dG9uTWFrZURlZmF1bHQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWJ1dHRvblJlbW92ZS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGUgRGVzY3JpcHRpb24gY29udHJvbCB0byBleHBhbmQgYW5kIGNvbnRyb2wgc3RhdGUKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGUoSHlwZXJsaW5rRXZlbnQgZSwgaW50IGlkKSB7Ci0JCS8vIFRPRE8tIHdlIHNob3VsZCBjb21iaW5lIHRoZXNlIG1ldGhvZHMgaW50byBvbmUuIE9uZSB3YXkgdG8gZG8gaXQsCi0JCS8vIGRpc3BvaW5nCi0JCS8vIGN0cmxfZXhwYW5kZWQgZXZlcnkgdGltZSBpdCBjb2xsYXBzZXMgYW5kIGNyZWF0aW5nIGl0IHdoZW4gd2UgZXhwYW5kLgotCQkvLyBBdCBwcmVzZW50LCB0aGVyZSBpcyBubyBtZXRob2QgdG8gZGlzcG9zZQotCQl0b2dnbGUoZSk7Ci0JCS8vIGlmIChpZCA9PSBHRU5FUkFMX1NFQ1RJT05fSUQpCi0JCS8vIHsKLQkJLy8gdG9nZ2xlR2VuZXJhbFNlY3Rpb24oZSk7Ci0JCS8vIH0KLQkJLy8gaWYgKGlkID09IERFVEFJTF9TRUNUSU9OX0lEKQotCQkvLyB7Ci0JCS8vIHRvZ2dsZURldGFpbFNlY3Rpb24oZSk7Ci0JCS8vIH0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGUoSHlwZXJsaW5rRXZlbnQgZSkgewotCQlpZiAoY3RybF9leHBhbmRlZCA9PSBudWxsKSB7Ci0JCQljdHJsX2V4cGFuZGVkID0gY3JlYXRlUmljaFRleHRFZGl0b3IodG9vbGtpdCwgZXhwYW5kZWRDb21wb3NpdGUsCi0JCQkJCVNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMLAotCQkJCQlHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMLCBnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpLAotCQkJCQlnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCksIDIsCi0JCQkJCWV4cGFuZExhYmVsKTsKLQkJCWN0cmxfZXhwYW5kZWQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCi0JCWlmIChkZXNjRXhwYW5kRmxhZykgewotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlzZWN0aW9uQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoc2VjdGlvbkNvbXBvc2l0ZSk7Ci0JCQllbmFibGVTZWN0aW9ucyh0cnVlKTsKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpOwotCQkJcmljaFRleHQuc2V0VGV4dChjdHJsX2V4cGFuZGVkLmdldFRleHQoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2V4cGFuZGVkLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLCBsaXN0ZW5lcgotCQkJCQkJLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJaWYgKGN0cmxfZXhwYW5kZWQuZ2V0TW9kaWZpZWQoKSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkuc2F2ZU1vZGlmaWVkUmljaFRleHQoY3RybF9leHBhbmRlZCk7Ci0JCQl9Ci0JCQllZGl0b3Iuc2V0Rm9jdXMoKTsKLQkJfSBlbHNlIHsKLQkJCXNlY3Rpb25Db21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KGV4cGFuZGVkQ29tcG9zaXRlKTsKLQkJCWVuYWJsZVNlY3Rpb25zKGZhbHNlKTsKLQkJCSgoTGFiZWwpZXhwYW5kTGFiZWwuZ2V0Q29udHJvbCgpKS5zZXRUZXh0KChTdHJpbmcpICgoSW1hZ2VIeXBlcmxpbmspIGUuZ2V0U291cmNlKCkpCi0JCQkJCS5nZXREYXRhKCJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gKElNZXRob2RSaWNoVGV4dCkgZS5nZXRIcmVmKCk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEluaXRpYWxUZXh0KHJpY2hUZXh0LmdldFRleHQoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KHJpY2hUZXh0LmdldE1vZGFsT2JqZWN0KCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdEZlYXR1cmUocmljaFRleHQKLQkJCQkJLmdldE1vZGFsT2JqZWN0RmVhdHVyZSgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RmluZFJlcGxhY2VBY3Rpb24ocmljaFRleHQuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2V4cGFuZGVkLmFkZExpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLCBsaXN0ZW5lcgotCQkJCQkJLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJYm9vbGVhbiBlZGl0YWJsZSA9ICFUbmdVdGlsLmlzTG9ja2VkKHByb2Nlc3MpOwotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQlpZiAoZWRpdGFibGUpIHsKLQkJCQljdHJsX2V4cGFuZGVkLnNldEZvY3VzKCk7Ci0JCQl9Ci0JCQlzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2wocmljaFRleHQpOwotCQl9Ci0JCWZvcm0uZ2V0Qm9keSgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQkJZGVzY0V4cGFuZEZsYWcgPSAhZGVzY0V4cGFuZEZsYWc7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIHN1cGVyc2V0IG9mIHNlbGVjdGVkCi0JICogY29uZmlndXJhdGlvbiBvciBub3QKLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja1ZhbGlkaXR5Rm9yU3VwZXJTZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJLy8gZ2V0IGRlZmF1bHQgcGx1Z2lucyBhbmQgcGFja2FnZXMKLQkJTGlzdCBkZWZhdWx0UGx1Z2lucyA9IGRlZmF1bHRDb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCUxpc3QgZGVmYXVsdFBhY2thZ2VzID0gZGVmYXVsdENvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkJLy8gZ2V0IGNvbmZpdWdyYXRpb24gcGx1Z2lucyBhbmQgcGFjYWtnZXMKLQkJTGlzdCBwYWNrYWdlcyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJYm9vbGVhbiBwbHVnaW5Db250YWlucyA9IGZhbHNlOwotCQlib29sZWFuIHBhY2thZ2VDb250YWlucyA9IGZhbHNlOwotCQlpZiAoKHBsdWdpbnMgIT0gbnVsbCkgJiYgKCEocGx1Z2lucy5pc0VtcHR5KCkpKSkgewotCQkJcGx1Z2luQ29udGFpbnMgPSBkZWZhdWx0UGx1Z2lucy5jb250YWluc0FsbChwbHVnaW5zKTsKLQkJfQotCQlpZiAoKHBhY2thZ2VzICE9IG51bGwpICYmICghKHBhY2thZ2VzLmlzRW1wdHkoKSkpKSB7Ci0JCQlwYWNrYWdlQ29udGFpbnMgPSBkZWZhdWx0UGFja2FnZXMuY29udGFpbnNBbGwocGFja2FnZXMpOwotCQl9Ci0KLQkJcmV0dXJuIChwbHVnaW5Db250YWlucykgJiYgKHBhY2thZ2VDb250YWlucyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFjdGl2ZSByaWNoIHRleHQgY29udHJvbAotCSAqIAotCSAqIEBwYXJhbSBjdHJsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjdGl2ZVJpY2hUZXh0Q29udHJvbChJTWV0aG9kUmljaFRleHQgY3RybCkgewotCQlhY3RpdmVDb250cm9sID0gY3RybDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgQWN0aXZlIFJpY2ggdGV4dCBjb250cm9sCi0JICogCi0JICogQHJldHVybgotCSAqIAkJUmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBnZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woKSB7Ci0JCXJldHVybiBhY3RpdmVDb250cm9sOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVNlY3Rpb25zKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJaWYgKGVuYWJsZSkgewotCQkJZ2VuZXJhbFNlY3Rpb24uc2V0RXhwYW5kZWQoZ2VuZXJhbFNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJfSBlbHNlIHsKLQkJCWdlbmVyYWxTZWN0aW9uRXhwYW5kRmxhZyA9IGdlbmVyYWxTZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCWdlbmVyYWxTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCX0KLQotCQlkZXRhaWxTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJaWYgKGVuYWJsZSkgewotCQkJZGV0YWlsU2VjdGlvbi5zZXRFeHBhbmRlZChkZXRhaWxTZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXRhaWxTZWN0aW9uRXhwYW5kRmxhZyA9IGRldGFpbFNlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJZGV0YWlsU2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQl9Ci0JCWNvbmZpZ1NlY3Rpb24uc2V0VmlzaWJsZShlbmFibGUpOwotCQlpZiAoZW5hYmxlKSB7Ci0JCQljb25maWdTZWN0aW9uLnNldEV4cGFuZGVkKGNvbmZpZ1NlY3Rpb25FeHBhbmRGbGFnKTsKLQkJfSBlbHNlIHsKLQkJCWNvbmZpZ1NlY3Rpb25FeHBhbmRGbGFnID0gY29uZmlnU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQljb25maWdTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgbmFtZSBmb3IgdGhlIGZvcm0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JtVGV4dCgpIHsKLQotCQlmb3JtLnNldFRleHQoTGlicmFyeVVJVGV4dC5nZXRVSVRleHQocHJvY2VzcykKLQkJCQkrICI6ICIgKyBtZXRob2RFbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoIGZvcm0gbmFtZQotCSAqIEBwYXJhbSBuZXdOYW1lCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEVsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCWlmICgoY3RybF9uYW1lICE9IG51bGwpICYmICEoY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkpIHsKLQkJCQljdHJsX25hbWUucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobmFtZU1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX25hbWUuc2V0VGV4dChuZXdOYW1lKTsKLQkJCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmFtZU1vZGlmeUxpc3RlbmVyKTsKLQkJCQlzZXRGb3JtVGV4dCgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NGb3JtUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NGb3JtUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZWFkNWIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRm9ybVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBQcm9jZXNzIGZvcm0gcGFnZXMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NGb3JtUGFnZSBleHRlbmRzIEJhc2VGb3JtUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgUHJvY2VzcyBwcm9jZXNzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGZvcm0gZWRpdG9yLgotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIGZvcm0gcGFnZS4KLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGZvcm0gcGFnZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0Zvcm1QYWdlKEZvcm1FZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcihlZGl0b3IsIGlkLCB0aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0KLQkJLy8gR2V0IHRoZSBQcm9jZXNzIG9iamVjdCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQuCi0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQotCQlPYmplY3Qgb2JqID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXByb2Nlc3MgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0Zvcm1VdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0Zvcm1VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwMGQxYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NGb3JtVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db2x1bW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciB0aGUgUHJvY2VzcyBlZGl0b3IgZm9ybSBwYWdlcy4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NGb3JtVXRpbCB7Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24gaW50byBjb2x1bW4gZGVzY3JpcHRvcnMgbGlzdAotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuCi0JICogCQlMaXN0IG9mIGNvbHVtbiBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUxpc3QgdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChTdHJpbmcgc3RyKSB7Ci0JCUVMaXN0IGNvbHVtbkRlc2NyaXB0b3JzID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0JCQlPYmplY3QgY29sdW1uRGVzY3JpcHRvciA9IFByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAKLQkJCQkJLmdldCh0b2tlbik7Ci0JCQlpZiAoY29sdW1uRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJY29sdW1uRGVzY3JpcHRvcnMuYWRkKGNvbHVtbkRlc2NyaXB0b3IpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb2x1bW5EZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24gaW50byBjb2x1bW4gZGVzY3JpcHRvcnMgYXJyYXkgbGlzdAotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuCi0JICogCQlBcnJheSBpc3Qgb2YgY29sdW1uIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2x1bW5EZXNjcmlwdG9yW10gdG9Db2x1bW5EZXNjcmlwdG9ycyhTdHJpbmcgc3RyKSB7Ci0JCUxpc3QgbGlzdCA9IHRvQ29sdW1uRGVzY3JpcHRvckxpc3Qoc3RyKTsKLQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbnMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShjb2x1bW5zKTsKLQkJcmV0dXJuIGNvbHVtbnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZUNhdGVnb3JpZXNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZUNhdGVnb3JpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdlZWFlN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVDYXRlZ29yaWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DdXN0b21DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIENhdGVnb3JpZXMgcGFnZSBpbiB0aGUgUm9sZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlQ2F0ZWdvcmllc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZUNhdGVnb3JpZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlIHJvbGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlQ2F0ZWdvcmllc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5DQVRFR09SSUVTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZSA9IChSb2xlKSBjb250ZW50RWxlbWVudDsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldENhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldHMoKFJvbGUpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlSb2xlU2V0IHJvbGVTZXQgPSAoUm9sZVNldCkgaXQubmV4dCgpOwotCQkJCS8vIFRPRE86IFRlc3Qgb24tdGhlLWZseSBjcmVhdGlvbiBvZiBjYXRlZ29yeSBjb250cmlidXRvcgotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9Sb2xlU2V0KGdldEFjdGlvbk1hbmFnZXIoKSwKLQkJCQkJCXJvbGVTZXQsIHJvbGUpOwotCQkJCWlmICh1c2VkQ2F0ZWdvcmllcy5jb250YWlucyhyb2xlU2V0KSkgewotCQkJCQl1c2VkQ2F0ZWdvcmllcy5yZW1vdmUocm9sZVNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVJvbGVTZXQgcm9sZVNldCA9IChSb2xlU2V0KSBpdC5uZXh0KCk7Ci0JCQkJLy8gVE9ETzogVGVzdCBvbi10aGUtZmx5IGNyZWF0aW9uIG9mIGNhdGVnb3J5IGNvbnRyaWJ1dG9yCi0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tUm9sZVNldCgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgcm9sZVNldCwgcm9sZSk7Ci0JCQkJaWYgKCF1c2VkQ2F0ZWdvcmllcy5jb250YWlucyhyb2xlU2V0KSkgewotCQkJCQl1c2VkQ2F0ZWdvcmllcy5hZGQocm9sZVNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoKFJvbGUpIG9iamVjdCkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGN1c3RvbUNhdGVnb3J5LCByb2xlKTsKLQkJCQlpZiAodXNlZENhdGVnb3JpZXMuY29udGFpbnMoY3VzdG9tQ2F0ZWdvcnkpKSB7Ci0JCQkJCXVzZWRDYXRlZ29yaWVzLnJlbW92ZShjdXN0b21DYXRlZ29yeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGN1c3RvbUNhdGVnb3J5LCByb2xlKTsKLQkJCQlpZiAoIXVzZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGN1c3RvbUNhdGVnb3J5KSkgewotCQkJCQl1c2VkQ2F0ZWdvcmllcy5hZGQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZzIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nMigpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcjIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZURlc2NyaXB0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVEZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2E5NTQ1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgUm9sZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZURlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX1JPTEUgPSBBdXRob3JpbmdVSVRleHQuQkFTRV9FTEVNRU5UX1RFWFQ7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3NraWxsczsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfYXNzaWduOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9zeW5vbnltczsKLQotCXByaXZhdGUgUm9sZSByb2xlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZSA9IChSb2xlKSBjb250ZW50RWxlbWVudDsKLQkJbm90YXRpb25TZWN0aW9uT24gPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2NyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0JCWxhYmVsX2Jhc2Uuc2V0VGV4dChCQVNFX1JPTEUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFN0YWZmaW5nIHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTm90YXRpb25TZWN0aW9uQ29udGVudCgpIHsKLQkJc3VwZXIuY3JlYXRlTm90YXRpb25TZWN0aW9uQ29udGVudCgpOwotCQlub3RhdGlvblNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuU1RBRkZJTkdfU0VDVElPTl9OQU1FKTsKLQkJbm90YXRpb25TZWN0aW9uLnNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJVGV4dC5TVEFGRklOR19TRUNUSU9OX0RFU0MpOwotCQljdHJsX3NraWxscyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCW5vdGF0aW9uQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuU0tJTExTX1RFWFQsIDQwLCA0MDAsCi0JCQkJTk9UQVRJT05fU0VDVElPTl9JRCk7Ci0JCWN0cmxfYXNzaWduID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJbm90YXRpb25Db21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5BU1NJR05NRU5UX0FQUFJPQUNIRVNfVEVYVCwKLQkJCQk0MCwgNDAwLCBOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJY3RybF9zeW5vbnltcyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCW5vdGF0aW9uQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuU1lOT05ZTVNfVEVYVCwgNDAsIDQwMCwKLQkJCQlOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkJY3RybF9za2lsbHMuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3NraWxscy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpKTsKLQkJY3RybF9za2lsbHMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9za2lsbHMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3NraWxsczsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbikgcm9sZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRTa2lsbHMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYXNzaWduLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9hc3NpZ24uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpKTsKLQkJY3RybF9hc3NpZ24uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9hc3NpZ24uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2Fzc2lnbjsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbikgcm9sZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfc3lub255bXMuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3N5bm9ueW1zLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKSk7Ci0JCWN0cmxfc3lub255bXMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9zeW5vbnltcy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfc3lub255bXM7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24pIHJvbGUKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0U3lub255bXMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJY3RybF9za2lsbHMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2Fzc2lnbi5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfc3lub255bXMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWREYXRhKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3VwZXIubG9hZERhdGEoKTsKLQotCQlTdHJpbmcgc2tpbGxzID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbikgcm9sZS5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkuZ2V0U2tpbGxzKCk7Ci0JCVN0cmluZyBhc3NpZ24gPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uKSByb2xlLmdldFByZXNlbnRhdGlvbigpKQotCQkJCS5nZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCQlTdHJpbmcgc3lub255bXMgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uKSByb2xlLmdldFByZXNlbnRhdGlvbigpKQotCQkJCS5nZXRTeW5vbnltcygpOwotCi0JCWN0cmxfc2tpbGxzLnNldFRleHQoc2tpbGxzID09IG51bGwgPyAiIiA6IHNraWxscyk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9hc3NpZ24uc2V0VGV4dChhc3NpZ24gPT0gbnVsbCA/ICIiIDogYXNzaWduKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3N5bm9ueW1zLnNldFRleHQoc3lub255bXMgPT0gbnVsbCA/ICIiIDogc3lub255bXMpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZSk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gU2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcuCi0JCSgoQ29udGVudEZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlyb2xlKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVHdWlkYW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlR3VpZGFuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmNzI5YjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVHdWlkYW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5HdWlkYW5jZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBHdWlkYW5jZSBwYWdlIGluIHRoZSBSb2xlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUd1aWRhbmNlUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJyb2xlR3VpZGFuY2VQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlIHJvbGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlR3VpZGFuY2VQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuR1VJREFOQ0VfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlID0gKFJvbGUpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gVUlIZWxwZXIuZ2V0U2VsZWN0ZWRHdWlkYW5jZXMocm9sZSk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIEd1aWRhbmNlIGZvciB0aGUgY29udGVudCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQlyb2xlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXJvbGUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkoUHJhY3RpY2UpIGl0ZW0sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCByb2xlLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXJvbGUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJcm9sZSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCShSZXVzYWJsZUFzc2V0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byBhZGQgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJ0byAiICsgcm9sZS5nZXRUeXBlKCkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgcm9sZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBHdWlkYW5jZSBmb3IgdGhlIG1ldGhvZCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQlyb2xlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXJvbGUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkoUHJhY3RpY2UpIGl0ZW0sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCByb2xlLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXJvbGUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJcm9sZSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCShSZXVzYWJsZUFzc2V0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byByZW1vdmUgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJmcm9tICIgKyByb2xlLmdldFR5cGUoKS5nZXROYW1lKCkKLQkJCQkJCQkJCQkJKyAiOiIgKyByb2xlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgR3VpZGFuY2VGaWx0ZXIoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldERlc2NyaXB0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXREZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmIyNTVlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldERlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldERlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJyb2xlU2V0RGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlU2V0IHJvbGVTZXQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlU2V0RGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlU2V0ID0gKFJvbGVTZXQpIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcm9sZVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gc2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcKLQkJKChDYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlyb2xlU2V0KSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUzsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldEdyb3VwaW5nRGVzY3JpcHRpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldEdyb3VwaW5nRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY0OWRkN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBEb21haW4gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0R3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZVNldEdyb3VwaW5nRGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlU2V0R3JvdXBpbmcgcm9sZVNldEdyb3VwaW5nOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldEdyb3VwaW5nRGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlU2V0R3JvdXBpbmcgPSAoUm9sZVNldEdyb3VwaW5nKSBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGVTZXRHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpOwotCQkJfQotCQl9OwotCi0JCS8vIHNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nCi0JCSgoQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJcm9sZVNldEdyb3VwaW5nKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNldGdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0Z3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0R3JvdXBpbmdSb2xlU2V0cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRHcm91cGluZ1JvbGVTZXRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiMmYyODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRHcm91cGluZ1JvbGVTZXRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgUm9sZSBTZXRzIHBhZ2UgaW4gdGhlIFJvbGUgU2V0IEdyb3VwaW5nIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogVE9ETzogUmVuYW1lIHRoaXMgY2xhc3MgdG8gUm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlIGFuZCBtb3ZlIGl0IHRvIHRoZQotICogb20uaWJtLnJtYy5hdXRob3JpbmcudWkudXRpbC5mb3JtcyBwYWNrYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0R3JvdXBpbmdSb2xlU2V0cyBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJyb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFJvbGVTZXRHcm91cGluZyByb2xlU2V0R3JvdXBpbmc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlU2V0R3JvdXBpbmdSb2xlU2V0cyhGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlJPTEVfU0VUU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGVTZXRHcm91cGluZyA9IChSb2xlU2V0R3JvdXBpbmcpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoUm9sZVNldEdyb3VwaW5nKSBvYmplY3QpLmdldFJvbGVTZXRzKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwKLQkJCQkJcm9sZVNldEdyb3VwaW5nLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKSwKLQkJCQkJYWRkSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksCi0JCQkJCXJvbGVTZXRHcm91cGluZywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksCi0JCQkJCXJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcm9sZVNldEdyb3VwaW5nOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KTsKLQkJCX0KLQkJfTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldFJvbGVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRSb2xlc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDAwM2Q4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldFJvbGVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgUm9sZXMgcGFnZSBpbiB0aGUgUm9sZSBTZXQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldFJvbGVzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJyb2xlU2V0Um9sZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlU2V0IHJvbGVTZXQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlU2V0Um9sZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuUk9MRVNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlU2V0ID0gKFJvbGVTZXQpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFJvbGVTZXQpIG9iamVjdCkuZ2V0Um9sZXMoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLAotCQkJCQlyb2xlU2V0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCksIGFkZEl0ZW1zLAotCQkJCQktMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQlyb2xlU2V0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCksIHJtSXRlbXMsCi0JCQkJCS0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcm9sZVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlJPTEVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENvbnRlbnRGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCWlmIChnZXRIZWxwZXIoKS5pc0NvbnRyaWJ1dG9yKChDb250ZW50RWxlbWVudCkgb2JqKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVUYXNrc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlVGFza3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNkZDgwNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVUYXNrc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgVGFza3MgcGFnZSBpbiB0aGUgUm9sZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZVRhc2tzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZSByb2xlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlRBU0tTX1BBR0VfVElUTEUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlID0gKFJvbGUpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTEoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTIoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza3MoKFJvbGUpIG9iamVjdCkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKHZpZXdlcl9zZWxlY3RlZDIpOwotCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHRhc2spKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCXRhc2ssIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwKLQkJCQkJCQlyb2xlLCAtMSk7Ci0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJdGFzay5zZXRQZXJmb3JtZWRCeShudWxsKTsKLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldFNlY29uZGFyeVRhc2tzKChSb2xlKSBvYmplY3QpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKHZpZXdlcl9zZWxlY3RlZCk7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnModGFzaykpIHsKLQkJCQkJdGFzay5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZChyb2xlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQl0YXNrLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkucmVtb3ZlKHJvbGUpOwotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5UQVNLUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgVGFzayk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVRhc2tzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVdvcmtQcm9kdWN0c1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlV29ya1Byb2R1Y3RzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTIxMGJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlV29ya1Byb2R1Y3RzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgV29yayBQcm9kdWN0cyBwYWdlIGluIHRoZSBSb2xlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVdvcmtQcm9kdWN0c1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZVdvcmtQcm9kdWN0c1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFJvbGUgcm9sZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVXb3JrUHJvZHVjdHNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuV09SS19QUk9EVUNUU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGUgPSAoUm9sZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLmNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCQljdHJsX2FkZDIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWN0cmxfcmVtb3ZlMi5zZXRWaXNpYmxlKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChSb2xlKSBvYmplY3QpLmdldFJlc3BvbnNpYmxlRm9yKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZighYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHJvbGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgYWRkSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBybUl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0vLwkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnNldFJlc3BvbnNpYmxlUm9sZSgKLS8vCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCAoV29ya1Byb2R1Y3QpIHJtSXRlbXMuZ2V0KGkpLCBudWxsKTsKLS8vCQkJfQotCQkJCi0JCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHJvbGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldE1vZGlmaWVkV29ya1Byb2R1Y3RzKChSb2xlKSBvYmplY3QpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBXb3JrUHJvZHVjdEZpbHRlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrQ2F0ZWdvcmllc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrQ2F0ZWdvcmllc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzkwZTc4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0NhdGVnb3JpZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkN1c3RvbUNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIENhdGVnb3JpZXMgcGFnZSBpbiB0aGUgVGFzayBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrQ2F0ZWdvcmllc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidGFza0NhdGVnb3JpZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUYXNrIHRhc2s7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUYXNrQ2F0ZWdvcmllc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5DQVRFR09SSUVTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJdGFzayA9IChUYXNrKSBjb250ZW50RWxlbWVudDsKLS8vCQlzZXRDYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVzKChUYXNrKSBvYmplY3QpLnRvQXJyYXkoKTsJCQkJCi0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQlPYmplY3QgZGlzY2lwbGluZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZihkaXNjaXBsaW5lIGluc3RhbmNlb2YgRGlzY2lwbGluZSl7Ci0vLwkJCQkJTGlzdCBkaXNjaXBsaW5lcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVzKHRhc2spOwotLy8JCQkJCWlmIChkaXNjaXBsaW5lcyAhPSBudWxsICYmIGRpc2NpcGxpbmVzLnNpemUoKSA+IDApCXsKLS8vCQkJCQkJT2JqZWN0IGFzc29jaWF0ZWREaXNjaXBsaW5lID0gZGlzY2lwbGluZXMuZ2V0KDApOwotLy8JCQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotLy8JCQkJCQkuZm9ybWF0KAotLy8JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLlVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHMsCi0vLwkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLS8vCQkJCQkJCQkJCXRhc2suZ2V0TmFtZSgpLAotLy8JCQkJCQkJCQkJVG5nVXRpbAotLy8JCQkJCQkJCQkJCQkuZ2V0TGFiZWxXaXRoUGF0aChhc3NvY2lhdGVkRGlzY2lwbGluZSksCi0vLwkJCQkJCQkJCQkoKERpc2NpcGxpbmUpIGRpc2NpcGxpbmUpLmdldE5hbWUoKSB9KTsKLS8vCQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dXYXJuaW5nKAotLy8JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCBtc2cpOwotLy8JCQkJCQlyZXR1cm47Ci0vLwkJCQkJfQotCi0JCQkJCQotCQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvRGlzY2lwbGluZShnZXRBY3Rpb25NYW5hZ2VyKCksCi0JCQkJCQkoRGlzY2lwbGluZSkgZGlzY2lwbGluZSwgdGFzayk7Ci0JCQkJCWlmICh1c2VkQ2F0ZWdvcmllcy5jb250YWlucyhkaXNjaXBsaW5lKSkgewotCQkJCQkJdXNlZENhdGVnb3JpZXMucmVtb3ZlKGRpc2NpcGxpbmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCURpc2NpcGxpbmUgZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tRGlzY2lwbGluZSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgZGlzY2lwbGluZSwgdGFzayk7Ci0JCQkJaWYgKCF1c2VkQ2F0ZWdvcmllcy5jb250YWlucyhkaXNjaXBsaW5lKSkgewotCQkJCQl1c2VkQ2F0ZWdvcmllcy5hZGQoZGlzY2lwbGluZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoKFRhc2spIG9iamVjdCkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGN1c3RvbUNhdGVnb3J5LCB0YXNrKTsKLQkJCQlpZiAodXNlZENhdGVnb3JpZXMuY29udGFpbnMoY3VzdG9tQ2F0ZWdvcnkpKSB7Ci0JCQkJCXVzZWRDYXRlZ29yaWVzLnJlbW92ZShjdXN0b21DYXRlZ29yeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGN1c3RvbUNhdGVnb3J5LCB0YXNrKTsKLQkJCQlpZiAoIXVzZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGN1c3RvbUNhdGVnb3J5KSkgewotCQkJCQl1c2VkQ2F0ZWdvcmllcy5hZGQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZzIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nMigpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMigpIHsKLQkJcmV0dXJuIGZpbHRlcjIgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCX0KLQkKLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0Rlc2NyaXB0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tEZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzRmNWE2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0Rlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgVGFzayBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidGFza0Rlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQJCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfVEFTSyA9IEF1dGhvcmluZ1VJVGV4dC5CQVNFX0VMRU1FTlRfVEVYVDsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfYWx0ZXJuYXRpdmVzOwotCi0JcHJpdmF0ZSBUYXNrIHRhc2s7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0YXNrID0gKFRhc2spIGNvbnRlbnRFbGVtZW50OwotCQlwdXJwb3NlT24gPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2NyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuQUxURVJOQVRJVkVTX1RFWFQsIDQwLCA0MDAsCi0JCQkJREVUQUlMX1NFQ1RJT05fSUQpOwotCQlsYWJlbF9iYXNlLnNldFRleHQoQkFTRV9UQVNLKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkRGF0YSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXN1cGVyLmxvYWREYXRhKCk7Ci0JCVN0cmluZyBwdXJwb3NlID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbikgdGFzay5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkuZ2V0UHVycG9zZSgpOwotCQlTdHJpbmcgYWx0ZXJuYXRpdmVzID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbikgdGFzawotCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCWN0cmxfcHVycG9zZS5zZXRUZXh0KHB1cnBvc2UgPT0gbnVsbCA/ICIiIDogcHVycG9zZSk7IC8vJE5PTi1OTFMtMSQJCi0JCWN0cmxfYWx0ZXJuYXRpdmVzLnNldFRleHQoYWx0ZXJuYXRpdmVzID09IG51bGwgPyAiIiA6IGFsdGVybmF0aXZlcyk7IC8vJE5PTi1OTFMtMSQJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQotCQljdHJsX3B1cnBvc2Uuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3B1cnBvc2Uuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCkpOwotCQljdHJsX3B1cnBvc2UuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9wdXJwb3NlLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9wdXJwb3NlOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uKSB0YXNrCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFB1cnBvc2UoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2FsdGVybmF0aXZlcy5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkpOwotCQljdHJsX2FsdGVybmF0aXZlcy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2FsdGVybmF0aXZlcy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfYWx0ZXJuYXRpdmVzOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uKSB0YXNrCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEFsdGVybmF0aXZlcygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNyZWZyZXNoKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXN1cGVyLnJlZnJlc2goZWRpdGFibGUpOwotCQljdHJsX2FsdGVybmF0aXZlcy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuVEFTS1M7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgVGFzayk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gU2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcuCi0JCSgoQ29udGVudEZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQl0YXNrKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0d1aWRhbmNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tHdWlkYW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQ3NTcxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0d1aWRhbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkd1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBHdWlkYW5jZSBwYWdlIGluIHRoZSBUYXNrIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza0d1aWRhbmNlUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ0YXNrR3VpZGFuY2VQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUYXNrIHRhc2s7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUYXNrR3VpZGFuY2VQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuR1VJREFOQ0VfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0YXNrID0gKFRhc2spIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIFVJSGVscGVyLmdldFNlbGVjdGVkR3VpZGFuY2VzKHRhc2spOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBHdWlkYW5jZXMgZm9yIGNvbnRlbnQgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJdGFzaywKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQkoQ2hlY2tsaXN0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQl0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCX0gCi0JCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCShFeGFtcGxlKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJKFByYWN0aWNlKSBpdGVtLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgdGFzaywgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQl0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCXRhc2ssCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJKEd1aWRlbGluZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJdGFzaywgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Ub29sTWVudG9ycygpLAotCQkJCQkJCShUb29sTWVudG9yKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQl0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCShSZXVzYWJsZUFzc2V0KSBpdGVtLCAtMSk7Ci0JCQkJfSAKLQkJCQllbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byBhZGQgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJ0byAiICsgdGFzay5nZXRUeXBlKCkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgdGFzay5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBHdWlkYW5jZSBmb3IgdGhlIG1ldGhvZCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQl0YXNrLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQl0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkoUHJhY3RpY2UpIGl0ZW0sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCB0YXNrLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJdGFzaywKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQl0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCX0gCi0vLwkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGUpIHsKLS8vCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLS8vCQkJCQkJCXRhc2ssIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfRXN0aW1hdGUoKSwKLS8vCQkJCQkJCW51bGwsIC0xKTsKLS8vCQkJCX0gCi0JCQkJZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gcmVtb3ZlIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkiZnJvbSAiICsgdGFzay5nZXRUeXBlKCkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgdGFzay5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IEd1aWRhbmNlRmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IpOwotCQkJfQotCQl9OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrUm9sZXNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1JvbGVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTc3NGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrUm9sZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgUm9sZXMgcGFnZSBpbiB0aGUgVGFzayBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tSb2xlc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidGFza1JvbGVzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGFzayB0YXNrOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUYXNrUm9sZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuUk9MRVNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0YXNrID0gKFRhc2spIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldENhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKHRydWUpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJUm9sZSByb2xlID0gKChUYXNrKSBvYmplY3QpLmdldFBlcmZvcm1lZEJ5KCk7Ci0JCQkJaWYgKHJvbGUgIT0gbnVsbCkKLQkJCQkJbGlzdC5hZGQocm9sZSk7Ci0JCQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJLy8gQmVsb3cgbGluZSBpcyBuZWVkZWQgdG8gZGlzYWxsb3dlZCBwcmltYXJ5IHBlcmZvcm1lciBhcyBhIGFkZGl0aW9uYWwgcGVyZm9ybWVyLgotCQkJTGlzdCBlbGVtZW50TGlzdCA9IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyh2aWV3ZXJfc2VsZWN0ZWQyKTsKLQkJCS8vIEJlbG93IGxpbmUgaXMgbmVlZGVkIHRvIHdhcm4gYmVmb3JlIGNoYW5naW5nIHByaW1hcnkgcGVyZm9ybWVyLgotCQkJTGlzdCBlbGVtZW50TGlzdDEgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkKTsKLQkJCWJvb2xlYW4gb2sgPSB0cnVlOwotCQkJaWYoIWVsZW1lbnRMaXN0MS5pc0VtcHR5KCkpewotCQkJCVN0cmluZyBuZXdQcmltYXJ5UGVyZm9tZXIgPSAoKFJvbGUpYWRkSXRlbXMuZ2V0KDApKS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tSb2xlc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9tb2RpZnlfbWVzc2FnZSwgKG5ldyBTdHJpbmdbXXtuZXdQcmltYXJ5UGVyZm9tZXJ9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgd2FybmluZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tSb2xlc1BhZ2VfY29uZmlybV90aXRsZTsKLQkJCQlvayA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHdhcm5pbmcsIG1lc3NhZ2UpOwotCQkJfQotCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucygoKFJvbGUpIGFkZEl0ZW1zLmdldCgwKSkpICYmIG9rKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwKLQkJCQkJCShSb2xlKSBhZGRJdGVtcy5nZXQoMCksIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHRhc2ssIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCksIG51bGwsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFRhc2spIG9iamVjdCkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkKTsKLQkJCUxpc3QgYWRkSXRlbXNGaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkSXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKCgoUm9sZSkgYWRkSXRlbXMuZ2V0KGkpKSkpIHsKLQkJCQkJYWRkSXRlbXNGaWx0ZXJlZC5hZGQoYWRkSXRlbXMuZ2V0KGkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWRkSXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJCQkJCWFkZEl0ZW1zRmlsdGVyZWQsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgdGFzaywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCQlybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ST0xFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9CW5ldyBDb250ZW50RmlsdGVyICgpewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmKHRhc2suZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSAhPSBudWxsKXsKLQkJCQkJTGlzdCBsaXN0ID0gdGFzay5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCQkJCQlmb3IoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspewotCQkJCQkJT2JqZWN0IG5leHQgPSBpdC5uZXh0KCk7Ci0JCQkJCQlpZihuZXh0IGluc3RhbmNlb2YgUm9sZSl7Ci0JCQkJCQkJaWYob2JqID09IG5leHQpIHJldHVybiBmYWxzZTsKLQkJCQkJCQlpZighY2hlY2tDb250cmlidXRpb24oKFZhcmlhYmlsaXR5RWxlbWVudCluZXh0LCBvYmopKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENvbnRlbnRGaWx0ZXIgKCl7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYodGFzay5nZXRQZXJmb3JtZWRCeSgpICE9IG51bGwpewotCQkJCQlSb2xlIHJvbGUgPSB0YXNrLmdldFBlcmZvcm1lZEJ5KCk7Ci0JCQkJCWlmKG9iaiA9PSByb2xlKSByZXR1cm4gZmFsc2U7Ci0JCQkJCWlmKCFjaGVja0NvbnRyaWJ1dGlvbihyb2xlLCBvYmopKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJvbGUgZmlsdGVyCi0JICoKLQkgKi8KLQlwdWJsaWMgY2xhc3MgUm9sZUZpbHRlciBleHRlbmRzIENvbnRlbnRGaWx0ZXIgewotCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlpZih0YXNrLmdldFBlcmZvcm1lZEJ5KCkgIT0gbnVsbCl7Ci0JCQkJUm9sZSByb2xlID0gdGFzay5nZXRQZXJmb3JtZWRCeSgpOwotCQkJCWlmKG9iaiA9PSByb2xlKSByZXR1cm4gZmFsc2U7Ci0JCQkJaWYoIWNoZWNrQ29udHJpYnV0aW9uKHJvbGUsIG9iaikpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZSk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ2hlY2sgY29udHJpYnV0aW9uCi0JICogQHBhcmFtIGNvbnRyaWJ1dG9yCi0JICogQHBhcmFtIG9iagotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoZWNrQ29udHJpYnV0aW9uKFZhcmlhYmlsaXR5RWxlbWVudCBjb250cmlidXRvciwgT2JqZWN0IG9iail7Ci0JCWlmKFRuZ1V0aWwuaXNDb250cmlidXRvcihjb250cmlidXRvcikgJiYgb2JqIGluc3RhbmNlb2YgUm9sZSl7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IGNvbnRyaWJ1dG9yLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmKGUgIT0gbnVsbCl7Ci0JCQkJaWYoZS5lcXVhbHMob2JqKSkgcmV0dXJuIGZhbHNlOwotCQkJCWlmKFRuZ1V0aWwuaXNDb250cmlidXRvcihlKSkKLQkJCQkJcmV0dXJuIGNoZWNrQ29udHJpYnV0aW9uKGUsIG9iaik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrUm9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tTdGVwc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrU3RlcHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4NzhmMDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tTdGVwc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuU2VjdGlvbnNPcmRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkVkaXRvcnNDb250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5BZGRUb1NlY3Rpb25MaXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVtb3ZlRnJvbVNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkRlY29yYXRlZEZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLQotLyoqCi0gKiBUaGUgU3RlcHMgcGFnZSBpbiB0aGUgVGFzayBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tTdGVwc1BhZ2UgZXh0ZW5kcyBCYXNlRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ0YXNrU3RlcHNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbmFtZTsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYWRkLCBjdHJsX2RlbGV0ZSwgY3RybF91cCwgY3RybF9kb3duLCBjdHJsX29yZGVyaW5nOwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3N0ZXBzOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBzdGVwc1RhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBTZWN0aW9uTGlzdCBhbGxTdGVwczsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgYWN0aXZlQ29udHJvbDsKLQotCXByb3RlY3RlZCBib29sZWFuIGRlc2NFeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGN0cmxfZXhwYW5kZWQ7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgZXhwYW5kTGluazsKLQotCXByb3RlY3RlZCBEZWNvcmF0ZWRGaWVsZCBleHBhbmRMYWJlbDsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGZvcm1TZWN0aW9uOwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gZ2VuZXJhbFNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGU7Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBleHBhbmRlZENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgY3RybF9tYWluZGVzYzsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIHN0ZXBzVmlld2VyTGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgVGFzayB0YXNrOwotCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gY3VycmVudFN0ZXA7Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcjsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza1N0ZXBzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlNURVBTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgbWV0aG9kRWxlbWVudElucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCXRhc2sgPSAoVGFzaykgbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5jcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0KLQkgKiAgICAgIG1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0KLQkJZm9ybS5zZXRUZXh0KExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KHRhc2spICsgIjogIiArIHRhc2suZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvcm1TZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLCBTZWN0aW9uLk5PX1RJVExFKTsKLQkJewotCQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJCWZvcm1TZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQkJZm9ybVNlY3Rpb24uc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0JCX0KLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgZm9yIHRoZSBzZWN0aW9ucy4KLQkJc2VjdGlvbkNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZvcm1TZWN0aW9uLCBTV1QuTk9ORSk7Ci0JCXNlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQlzZWN0aW9uQ29tcG9zaXRlLnNldExheW91dChuZXcgVGFibGVXcmFwTGF5b3V0KCkpOwotCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoc2VjdGlvbkNvbXBvc2l0ZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBHZW5lcmFsIEluZm9ybWF0aW9uIHNlY3Rpb24uCi0JCWdlbmVyYWxTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJU2VjdGlvbi5USVRMRV9CQVIgfCBTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFCi0JCQkJCQl8IFNlY3Rpb24uRVhQQU5ERUQpOwotCQlnZW5lcmFsU2VjdGlvbgotCQkJCS5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlNURVBTX1NFQ1RJT05fTkFNRSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJVGV4dC5TVEVQU19TRUNUSU9OX0RFU0MpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJZ2VuZXJhbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxTZWN0aW9uKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNCwgZmFsc2UpKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0Q2xpZW50KGdlbmVyYWxDb21wb3NpdGUpOwotCi0JCUVkaXRvcnNDb250ZXh0SGVscGVyLnNldEhlbHAoZ2VuZXJhbENvbXBvc2l0ZS5nZXRQYXJlbnQoKSwgdGFzayk7Ci0KLQkJQ29tcG9zaXRlIHBhbmUxID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAxOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJcGFuZTEuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlwYW5lMS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCX0KLQotCQlMYWJlbCBsX25hbWUgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKHBhbmUxLCBBdXRob3JpbmdVSVRleHQuU1RFUFNfVEVYVCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlsX25hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX3N0ZXBzID0gdG9vbGtpdC5jcmVhdGVUYWJsZShwYW5lMSwgU1dULk1VTFRJKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAxNTA7Ci0JCQljdHJsX3N0ZXBzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJaW5pdFByb3ZpZGVycygpOwotCi0JCXN0ZXBzVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zdGVwcyk7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyKTsKLQkJc3RlcHNUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHN0ZXBzVmlld2VyTGFiZWxQcm92aWRlcik7Ci0KLQkJQ29tcG9zaXRlIHBhbmUyID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXBhbmUyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpKTsKLQkJcGFuZTIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWN0cmxfYWRkID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsIEF1dGhvcmluZ1VJVGV4dC5BRERfQlVUVE9OX1RFWFQsCi0JCQkJU1dULk5PTkUpOwotCQljdHJsX2FkZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljdHJsX2RlbGV0ZSA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERUxFVEVfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJY3RybF9kZWxldGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWN0cmxfZGVsZXRlLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWN0cmxfdXAgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwgQXV0aG9yaW5nVUlUZXh0LlVQX0JVVFRPTl9URVhULAotCQkJCVNXVC5OT05FKTsKLQkJY3RybF91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljdHJsX2Rvd24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwKLQkJCQlBdXRob3JpbmdVSVRleHQuRE9XTl9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQljdHJsX2Rvd24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljdHJsX29yZGVyaW5nID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsCi0JCQkJQXV0aG9yaW5nVUlUZXh0Lk9SREVSX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCWN0cmxfb3JkZXJpbmcuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gbmFtZQotCQlMYWJlbCBuYW1lTGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlNURVBfTkFNRV9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJCW5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljdHJsX25hbWUgPSB0b29sa2l0LmNyZWF0ZVRleHQoZ2VuZXJhbENvbXBvc2l0ZSwgIiIsIFNXVC5TSU5HTEUpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCQljdHJsX25hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljcmVhdGVCbGFua0xhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIDQpOwotCi0JCWN0cmxfbWFpbmRlc2MgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGluaygKLQkJCQl0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fVEVYVCwKLQkJCQkyNTAsIDMwMCwgNCk7Ci0KLQkJY3JlYXRlUmljaFRleHRFZGl0b3JTZWN0aW9uKCk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMik7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGdlbmVyYWxDb21wb3NpdGUpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihleHBhbmRlZENvbXBvc2l0ZSk7Ci0KLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCi0JCWFkZExpc3RlbmVycygpOwotCQlsb2FkRGF0YSgpOwotCQllbmFibGVDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMgdG8gbW9uaXRvciBmb2N1cyBhbmQgbW9kaWZpY2F0aW9uIGNoYW5nZXMgaW4gdGhlIGVkaXQKLQkgKiBjb250cm9scy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCQljb250ZW50TW9kaWZ5TGlzdGVuZXIgPSBlZGl0b3IuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoY3VycmVudFN0ZXApOwotCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0KLQkJZm9ybS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLS8vCQkJCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQoKEVPYmplY3QpIHRhc2ssIGdldFNpdGUoKQotLy8JCQkJCQkuZ2V0U2hlbGwoKSk7Ci0vLwkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotLy8JCQkJCWxvYWREYXRhKCk7Ci0vLwkJCQl9Ci0JCQkJbG9hZERhdGEoKTsKLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJZW5hYmxlQ29udHJvbHMoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWNoZWNrU2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmb3JtLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZGVhY3RpdmF0ZSgpOwotCQkJfQotCQl9KTsKLQotCQlmb3JtLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKTsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLQkJCQl9Ci0JCQkJZm9ybVNlY3Rpb24ubGF5b3V0KHRydWUsIHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJaWYgKGN1cnJlbnRTdGVwICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjdXJyZW50U3RlcC5nZXROYW1lKCk7Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9uYW1lLmdldFRleHQoKTsKLQkJCQkJaWYgKGN0cmxfbmFtZS5nZXRUZXh0KCkgPT0gbnVsbAotCQkJCQkJCXx8IGN0cmxfbmFtZS5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfdGl0bGUsIExpYnJhcnlVSVRleHQuVEVYVF9TVEVQKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZywgU3RyVXRpbC50b0xvd2VyKExpYnJhcnlVSVRleHQuVEVYVF9TVEVQKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOwotCQkJCQkJY3RybF9uYW1lLnNldFNlbGVjdGlvbigwLCBvbGRDb250ZW50Lmxlbmd0aCgpKTsKLQkJCQkJfSBlbHNlIGlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGN1cnJlbnRTdGVwLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfbWFpbmRlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9tYWluZGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXNhdmVNYWluRGVzY3JpcHRpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc3RlcHNUYWJsZVZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQljaGVja1NlbGVjdGlvbigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF9hZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIGNoaWxkID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVTZWN0aW9uKCk7Ci0JCQkJU3RyaW5nIG5ld05hbWUgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUF1dGhvcmluZ1VJVGV4dC5ORVdfRUxFTUVOVF9URVhULAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgTGlicmFyeVVJVGV4dC5URVhUX1NURVAgfSk7Ci0JCQkJY2hpbGQuc2V0TmFtZShuZXdOYW1lKTsKLQkJCQlBZGRUb1NlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQodGFzaywKLQkJCQkJCWNoaWxkLCBhbGxTdGVwcyk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCQlzdGVwc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQlzdGVwc1RhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjaGlsZCkpOwotCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCWN0cmxfbmFtZS5zZXRTZWxlY3Rpb24oMCwgbmV3TmFtZS5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZGVsZXRlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi50b0xpc3QoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgewotCQkJCQkJUmVtb3ZlRnJvbVNlY3Rpb25MaXN0IGNtZCA9IG5ldyBSZW1vdmVGcm9tU2VjdGlvbkxpc3QoCi0JCQkJCQkJCXRhc2ssIChvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24pIG8sIGFsbFN0ZXBzKTsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJZWRpdFN0ZXAobnVsbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfdXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCQlBcnJheUxpc3QgbW92ZVVwSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW92ZVVwSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQoCi0JCQkJCQl0YXNrLCBtb3ZlVXBJdGVtcywgYWxsU3RlcHMsIDEpOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0KLQkJCQlzdGVwc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQotCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKHRhc2spKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKHRhc2spKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlBcnJheUxpc3QgbW92ZURvd25JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlRG93bkl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCU1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKAotCQkJCQkJdGFzaywgbW92ZURvd25JdGVtcywgYWxsU3RlcHMsIDApOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0KLQkJCQlzdGVwc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQotCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKHRhc2spKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKHRhc2spKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfb3JkZXJpbmcuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU2VjdGlvbnNPcmRlckRpYWxvZyBkbGcgPSBuZXcgU2VjdGlvbnNPcmRlckRpYWxvZygKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQl0YXNrLAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuU3RlcHNPcmRlckRpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuU3RlcHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RlcHNfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlkbGcub3BlbigpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVDb250cm9scyhib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfbWFpbmRlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2FkZC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9kZWxldGUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfdXAuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfZG93bi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9vcmRlcmluZy5zZXRFbmFibGVkKHRydWUpOwotCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCS8vIFNhdmUgdGhlIHN0ZXAgb3JkZXIuCi0JCWlmIChhbGxTdGVwcyAhPSBudWxsKSB7Ci0JCQlhbGxTdGVwcy5hcHBseSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGNvbnRyb2xzIHdpdGggZGF0YSBmcm9tIHRoZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCWFsbFN0ZXBzID0gbnVsbDsKLQkJc3RlcHNUYWJsZVZpZXdlci5zZXRJbnB1dCh0YXNrKTsKLQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCWVkaXRTdGVwKGN1cnJlbnRTdGVwKTsKLQl9Ci0KLQkvKioKLQkgKiBFZGl0IGN1cnJlbnQgc3RlcC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZWRpdFN0ZXAob3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIHN0ZXApIHsKLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0KLQkJaWYgKGN0cmxfbWFpbmRlc2MuZ2V0TW9kaWZpZWQoKSkgewotCQkJc2F2ZU1haW5EZXNjcmlwdGlvbigpOwotCQl9Ci0KLQkJY3VycmVudFN0ZXAgPSBzdGVwOwotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGN1cnJlbnRTdGVwICE9IG51bGwpIHsKLQkJCW5hbWUgPSBjdXJyZW50U3RlcC5nZXROYW1lKCk7Ci0JCQlkZXNjID0gY3VycmVudFN0ZXAuZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0JCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJfQotCQljdHJsX25hbWUuc2V0VGV4dChuYW1lID09IG51bGwgPyAiIiA6IG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfbWFpbmRlc2Muc2V0VGV4dChkZXNjID09IG51bGwgPyAiIiA6IGRlc2MpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfbWFpbmRlc2Muc2V0TW9kYWxPYmplY3QoY3VycmVudFN0ZXApOwotCQljdHJsX21haW5kZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJaWYgKHN0ZXAgPT0gbnVsbCkgewotCQkJLy8gY2xvc2UgYW55IEZpbmQvUmVwbGFjZSBkaWFsb2cgb3BlbiBpbiB0aGUgUlRFCi0JCQljdHJsX21haW5kZXNjLmdldEZpbmRSZXBsYWNlQWN0aW9uKCkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldEVsZW1lbnQoY3VycmVudFN0ZXApOwotCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkuc2V0RGlzYWJsZShjdXJyZW50U3RlcCA9PSBudWxsKTsKLQotCQllbmFibGVDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBjb250cm9scwotCSAqLwotCXByaXZhdGUgdm9pZCBlbmFibGVDb250cm9scygpIHsKLQkJaWYgKHRhc2suZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5jb250YWlucyhjdXJyZW50U3RlcCkpIHsKLQkJCWlmICghVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQljdHJsX25hbWUuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQkJY3RybF9tYWluZGVzYy5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQljdHJsX21haW5kZXNjLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UgbGlzdGVuZXIKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVSaWNoVGV4dEVkaXRvclNlY3Rpb24oKSB7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZm9ybVNlY3Rpb24sIFNXVC5OT05FKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQotCQkvLyBIeXBlcmxpbmsgZGVzYwotCQlleHBhbmRMaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhleHBhbmRlZENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlleHBhbmRMaW5rLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCk7Ci0JCWV4cGFuZExpbmsuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xvc2VSVEUpOyAvLyROT04tTkxTLTEkCi0JCWV4cGFuZExpbmsuc2V0VW5kZXJsaW5lZChmYWxzZSk7Ci0JCWV4cGFuZExpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWV4cGFuZExhYmVsID0gY3JlYXRlRGVjb3JhdGVkTGFiZWwodG9vbGtpdCwgZXhwYW5kZWRDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRvZ2dsZSBEZXNjcmlwdGlvbiBjb250cm9sIHRvIGV4cGFuZCBhbmQgY29udHJvbCBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGUoSHlwZXJsaW5rRXZlbnQgZSkgewotCQlpZiAoY3VycmVudFN0ZXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgPT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZCA9IGNyZWF0ZVJpY2hUZXh0RWRpdG9yKHRvb2xraXQsIGV4cGFuZGVkQ29tcG9zaXRlLAotCQkJCQlTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQlnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpLCBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCksIDIsIGV4cGFuZExhYmVsKTsKLQkJCWN0cmxfZXhwYW5kZWQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCi0JCWlmIChkZXNjRXhwYW5kRmxhZykgewotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoc2VjdGlvbkNvbXBvc2l0ZSk7Ci0JCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSBhY3RpdmVDb250cm9sOwotCQkJcmljaFRleHQuc2V0VGV4dChjdHJsX2V4cGFuZGVkLmdldFRleHQoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2V4cGFuZGVkLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLCBsaXN0ZW5lcgotCQkJCQkJLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJaWYgKGN0cmxfZXhwYW5kZWQuZ2V0TW9kaWZpZWQoKSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkuc2F2ZU1vZGlmaWVkUmljaFRleHQoY3RybF9leHBhbmRlZCk7Ci0JCQl9Ci0JCQlyaWNoVGV4dC5zZXRGb2N1cygpOwotCQl9IGVsc2UgewotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoZXhwYW5kZWRDb21wb3NpdGUpOwotCQkJKChMYWJlbClleHBhbmRMYWJlbC5nZXRDb250cm9sKCkpLnNldFRleHQoY3VycmVudFN0ZXAuZ2V0TmFtZSgpICsKLQkJCQkJIiAtICIgKyAoU3RyaW5nKSAoKEltYWdlSHlwZXJsaW5rKSBlLmdldFNvdXJjZSgpKS5nZXREYXRhKCJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSAoSU1ldGhvZFJpY2hUZXh0KSBlLmdldEhyZWYoKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0SW5pdGlhbFRleHQocmljaFRleHQuZ2V0VGV4dCgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QocmljaFRleHQuZ2V0TW9kYWxPYmplY3QoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0RmVhdHVyZShyaWNoVGV4dAotCQkJCQkuZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRGaW5kUmVwbGFjZUFjdGlvbihyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHJpY2hUZXh0LmdldExpc3RlbmVycygpOyBpLmhhc05leHQoKTspIHsKLQkJCQlSaWNoVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gKFJpY2hUZXh0TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJCWN0cmxfZXhwYW5kZWQuYWRkTGlzdGVuZXIobGlzdGVuZXIuZ2V0RXZlbnRUeXBlKCksIGxpc3RlbmVyCi0JCQkJCQkuZ2V0TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQlib29sZWFuIGVkaXRhYmxlID0gIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpOwotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQlpZiAoZWRpdGFibGUpIHsKLQkJCQljdHJsX2V4cGFuZGVkLnNldEZvY3VzKCk7Ci0JCQl9Ci0JCQlhY3RpdmVDb250cm9sID0gcmljaFRleHQ7Ci0JCX0KLQotCQlmb3JtLmdldEJvZHkoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCWRlc2NFeHBhbmRGbGFnID0gIWRlc2NFeHBhbmRGbGFnOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJzKCkgewotCQlzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCWlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJCWFsbFN0ZXBzID0gbmV3IFNlY3Rpb25MaXN0KHRhc2ssCi0JCQkJCQkJU2VjdGlvbkxpc3QuU1RFUFNfRk9SX0VMRU1FTlRfT05MWSk7Ci0JCQkJfQotCQkJCXJldHVybiBhbGxTdGVwcy50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJc3RlcHNWaWV3ZXJMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAhdGFzay5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmNvbnRhaW5zKGVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlTWFpbkRlc2NyaXB0aW9uKCkgewotCQlpZiAoY3VycmVudFN0ZXAgIT0gbnVsbCkgewotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJOiBjdHJsX21haW5kZXNjOwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9IGN1cnJlbnRTdGVwLmdldFNlY3Rpb25EZXNjcmlwdGlvbigpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwKLQkJCQkJb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGN1cnJlbnRTdGVwLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKSwKLQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQlGb3JtRWRpdG9yIGVkaXRvciA9IGdldEVkaXRvcigpOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcikgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU2VsZWN0aW9uKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSkgewotCQkJY3RybF9kZWxldGUuc2V0RW5hYmxlZCh0cnVlKTsKLQotCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKHRhc2spICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJZWRpdFN0ZXAoKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1dvcmtQcm9kdWN0c1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrV29ya1Byb2R1Y3RzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OWVkNWM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrV29ya1Byb2R1Y3RzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgV29yayBQcm9kdWN0cyBwYWdlIGluIHRoZSBUYXNrIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza1dvcmtQcm9kdWN0c1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidGFza1dvcmtQcm9kdWN0c1BhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBUYXNrIHRhc2s7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tXb3JrUHJvZHVjdHNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuV09SS19QUk9EVUNUU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXRhc2sgPSAoVGFzaykgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5jcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFRhc2spIG9iamVjdCkuZ2V0TWFuZGF0b3J5SW5wdXQoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKHZpZXdlcl9zZWxlY3RlZDIpOwotCQkJTGlzdCBhZGRJdGVtc0ZpbHRlcmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRJdGVtcy5zaXplKCk7IGkrKykgewotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMoKChXb3JrUHJvZHVjdCkgYWRkSXRlbXMuZ2V0KGkpKSkpIHsKLQkJCQkJYWRkSXRlbXNGaWx0ZXJlZC5hZGQoYWRkSXRlbXMuZ2V0KGkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWRkSXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwKLQkJCQkJCWFkZEl0ZW1zRmlsdGVyZWQsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgdGFzaywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLCBybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChUYXNrKSBvYmplY3QpLmdldE9wdGlvbmFsSW5wdXQoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkKTsKLQkJCUxpc3QgYWRkSXRlbXNGaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkSXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKCgoV29ya1Byb2R1Y3QpIGFkZEl0ZW1zLmdldChpKSkpKSB7Ci0JCQkJCWFkZEl0ZW1zRmlsdGVyZWQuYWRkKGFkZEl0ZW1zLmdldChpKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFkZEl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHRhc2ssCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwKLQkJCQkJCWFkZEl0ZW1zRmlsdGVyZWQsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgdGFzaywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCksIHJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMyA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFRhc2spIG9iamVjdCkuZ2V0T3V0cHV0KCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDMoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgdGFzaywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza19PdXRwdXQoKSwgYWRkSXRlbXMsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMyhBcnJheUxpc3Qgcm1JdGVtcykgewotCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHRhc2ssCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSwgcm1JdGVtcywgLTEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBXb3JrUHJvZHVjdEZpbHRlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcjIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIzKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IFdvcmtQcm9kdWN0RmlsdGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sRGVzY3JpcHRpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVG9vbERlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiODhkYjA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBEb21haW4gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInRvb2xEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBUb29sIHRvb2w7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUb29sRGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0b29sID0gKFRvb2wpIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdG9vbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgVG9vbCk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gc2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcKLQkJKChDYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQl0b29sKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlRPT0xTOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sVG9vbE1lbnRvcnNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVG9vbFRvb2xNZW50b3JzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzdkMzBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sVG9vbE1lbnRvcnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgVG9vbCBNZW50b3JzIHBhZ2UgaW4gdGhlIFRvb2wgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVG9vbFRvb2xNZW50b3JzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ0b29sVG9vbE1lbnRvcnNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUb29sIHRvb2w7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRvb2xUb29sTWVudG9yc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5UT09MX01FTlRPUlNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0b29sID0gKFRvb2wpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIHRvb2wuZ2V0VG9vbE1lbnRvcnMoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGlzIG9wZXJhdGlvbiB3aWxsIG1vZGlmeSB0aGUgZWxlbWVudCBpbiBvcHBvc2l0ZQotCQkJLy8gZmVhdHVyZSB2YWx1ZQotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoIVVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeU9wcG9zaXRlKHRvb2wsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCksIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHRvb2wsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKSwgYWRkSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgdG9vbCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpLCBybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRvb2w7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgR3VpZGFuY2VGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbFRvb2xNZW50b3JzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2MxYmI2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DdXN0b21DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBDYXRlZ29yaWVzIHBhZ2UgaW4gdGhlIFdvcmsgUHJvZHVjdCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gIndvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkNBVEVHT1JJRVNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5Myh0cnVlKTsKLQkJc2V0Q2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldERvbWFpbnMoKFdvcmtQcm9kdWN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBkb21haW4gPSBhZGRJdGVtcy5nZXQoMCk7Ci0JCQlMaXN0IGRvbWFpbnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREb21haW5zKHdvcmtQcm9kdWN0KTsKLQkJCWlmIChkb21haW5zICE9IG51bGwgJiYgZG9tYWlucy5zaXplKCkgPiAwKQl7Ci0JCQkJT2JqZWN0IGFzc29jaWF0ZWREb21haW4gPSBkb21haW5zLmdldCgwKTsKLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotCQkJCS5mb3JtYXQoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzLAotCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJd29ya1Byb2R1Y3QuZ2V0TmFtZSgpLAotCQkJCQkJCQlUbmdVdGlsCi0JCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgoYXNzb2NpYXRlZERvbWFpbiksCi0JCQkJCQkJCSgoRG9tYWluKSBkb21haW4pLmdldE5hbWUoKSB9KTsKLQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd1dhcm5pbmcoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgbXNnKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9Eb21haW4oZ2V0QWN0aW9uTWFuYWdlcigpLAotCQkJCQkoRG9tYWluKSBkb21haW4sIHdvcmtQcm9kdWN0KTsKLQkJCS8vIFN0YW5kYXJkIENhdGVnb3JpZXM6IGNvbnRyaWJ1dGluZyBzdGFuZGFyZAotCQkJLy8gY2F0ZWdvcnkgaXMgbm90IGRlbGV0ZWQgd2hlbiBpdCBpcyBlbXB0eQotCQkJaWYgKHVzZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGRvbWFpbikpIHsKLQkJCQl1c2VkQ2F0ZWdvcmllcy5yZW1vdmUoZG9tYWluKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlEb21haW4gZG9tYWluID0gKERvbWFpbikgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbURvbWFpbigKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgZG9tYWluLCB3b3JrUHJvZHVjdCk7Ci0JCQkJLy8gU3RhbmRhcmQgQ2F0ZWdvcmllczogY29udHJpYnV0aW5nIHN0YW5kYXJkCi0JCQkJLy8gY2F0ZWdvcnkgaXMgbm90IGRlbGV0ZWQgd2hlbiBpdCBpcyBlbXB0eQotCQkJCWlmICghdXNlZENhdGVnb3JpZXMuY29udGFpbnMoZG9tYWluKSkgewotCQkJCQl1c2VkQ2F0ZWdvcmllcy5hZGQoZG9tYWluKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0V29ya1Byb2R1Y3RUeXBlcygKLQkJCQkJCShXb3JrUHJvZHVjdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0VHlwZSB3cFR5cGUgPSAoV29ya1Byb2R1Y3RUeXBlKSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb1dvcmtQcm9kdWN0VHlwZSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgd3BUeXBlLCB3b3JrUHJvZHVjdCk7Ci0JCQkJLy8gU3RhbmRhcmQgQ2F0ZWdvcmllczogY29udHJpYnV0aW5nIHN0YW5kYXJkCi0JCQkJLy8gY2F0ZWdvcnkgaXMgbm90IGRlbGV0ZWQgd2hlbiBpdCBpcyBlbXB0eQotCQkJCWlmICh1c2VkQ2F0ZWdvcmllcy5jb250YWlucyh3cFR5cGUpKSB7Ci0JCQkJCXVzZWRDYXRlZ29yaWVzLnJlbW92ZSh3cFR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdFR5cGUgd3BUeXBlID0gKFdvcmtQcm9kdWN0VHlwZSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbVdvcmtQcm9kdWN0VHlwZSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgd3BUeXBlLCB3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKCF1c2VkQ2F0ZWdvcmllcy5jb250YWlucyh3cFR5cGUpKSB7Ci0JCQkJCXVzZWRDYXRlZ29yaWVzLmFkZCh3cFR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMyA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKAotCQkJCQkJKFdvcmtQcm9kdWN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMy5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwzKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwzKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGN1c3RvbUNhdGVnb3J5LCB3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKHVzZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGN1c3RvbUNhdGVnb3J5KSkgewotCQkJCQl1c2VkQ2F0ZWdvcmllcy5yZW1vdmUoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMyhBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwzKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUZyb21DdXN0b21DYXRlZ29yeSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY3VzdG9tQ2F0ZWdvcnksIHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAoIXVzZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGN1c3RvbUNhdGVnb3J5KSkgewotCQkJCQl1c2VkQ2F0ZWdvcmllcy5hZGQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ET01BSU5TOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZzIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nMigpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZzMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nMygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERvbWFpbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyMigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMigpIHsKLQkJcmV0dXJuIGZpbHRlcjIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcjMoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjMoKSB7Ci0JCXJldHVybiBmaWx0ZXIzID0gbmV3IEN1c3RvbUNhdGVnb3J5RmlsdGVyKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzhlZWQ2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLldvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVsaXZlcmFibGUgUGFydHMgcGFnZSBpbiB0aGUgV29yayBQcm9kdWN0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3Q7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRFTElWRVJBQkxFX1BBUlRTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJRGVsaXZlcmFibGUgd3AgPSAoRGVsaXZlcmFibGUpIHdvcmtQcm9kdWN0OwotCQkJCXJldHVybiB3cC5nZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0IGl0ZW0gPSAoV29ya1Byb2R1Y3QpIGl0Lm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB3b3JrUHJvZHVjdCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSwgaXRlbSwKLQkJCQkJCS0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdCBpdGVtID0gKFdvcmtQcm9kdWN0KSBpdC5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCksIGl0ZW0sCi0JCQkJCQktMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKSB7Ci0JCQkvKgotCQkJICogQXJyYXlMaXN0KGJhZGxpc3QpIGlzIHVzZWQgdG8gc3RvcmUgYWxsCi0JCQkgKiBnZW5lcmFsaXplci9iYXNldmFyaWFiaWxpdHkgZm9yIHN1YnBhcnRzIG9mCi0JCQkgKiBnZW5lcmFsaXplci9iYXNldmFyaWFiaWxpdHkgY2FuIGJlIHJlamVjdGVkLiBEZWxpdmVyYWJsZSBjYW5ub3QKLQkJCSAqIGhvbGQgaW5mb3JtYXRpb24gdG8gd2hvIGl0c2VsZiBpcyBhY3RpbmcgYXMgZGVsaXZlcmFibGUgcGFydC4KLQkJCSAqLwotCQkJTGlzdCBiYWRsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQkvKiAKLQkJCQkJICogQ2hlY2sgRGVsaXZlcmFibGUgYW5kIERlbGl2ZXJhYmxlUGFydHMgYXNzb2NpYXRpb24KLQkJCQkJICogY2lyY3VsYXIgZGVwZW5kZW5jeS4KLQkJCQkJKi8KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlCi0JCQkJCQkJJiYgd29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQkJLyoKLQkJCQkJCSAqIENoZWNrIHBhc3NlZCBvYmplY3QncyBjaGFpbmVkIGRlbGl2ZXJhYmxlIHBhcnRzCi0JCQkJCQkgKiAodHJlZSkgY29udGFpbiB3b3JrUHJvZHVjdCAoZWRpdG9yIG9iamVjdCkuCi0JCQkJCQkgKi8KLQkJCQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygKLQkJCQkJCQkJKERlbGl2ZXJhYmxlKSBvYmosIChEZWxpdmVyYWJsZSkgd29ya1Byb2R1Y3QpKSB7Ci0JCQkJCQkJYmFkbGlzdC5hZGQob2JqKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIWNoZWNrVmFyaWFiaWxpdHkoKERlbGl2ZXJhYmxlKSBvYmosIGJhZGxpc3QpKSB7Ci0JCQkJCQkJYmFkbGlzdC5hZGQob2JqKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBicm93c2UgdGhyb3VnaCBiYWRsaXN0IGFuZCBpdHMgZGVsaXZlcmFibGUgcGFydHMuCi0JCQkJCQlMaXN0IHRlbXBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJhZGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgYmFkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCVVJSGVscGVyLmRlbGl2ZXJhYmxlUGFydHNDaGFpbigoRGVsaXZlcmFibGUpIGJhZCwgdGVtcGxpc3QpOwotCQkJCQkJfQotCQkJCQkJaWYgKHRlbXBsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIHJldHVybiB0cnVlIGlmIGFib3ZlIGNvbmRpdGlvbiBhcmUgc3VjY2Vzc2Z1bAotCQkJCQkgKi8KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1ZhcmlhYmlsaXR5KERlbGl2ZXJhYmxlIGUsIExpc3QgYmFkbGlzdCkgewotCi0JCS8qCi0JCSAqIENoZWNrIGVkaXRvciBvYmplY3QncyB2YXJpYWJpbGl0eSBiYXNlIG9iamVjdCBpcyBjaGlsZCBpbgotCQkgKiBEZWxpdmVyYWJsZShlKSB0cmVlLiB0aGVuIERlbGl2ZXJhYmxlKGUpc2hvdWxkbm90IGJlIGFjY2VwdGVkLiBEMSAtPgotCQkgKiBEMiAtPiBEMyAoIC0+IGluZGljYXRlcyBkZWxpdmVyYWJsZSBwYXJ0IHJlbGF0aW9uc2hpcCkgRDYgY29udHJpYnV0ZXMKLQkJICogRDMuIEQ2IGNhbm5vdCBzZWxlY3QgRDEsRDIgYXMgZGVsaXZlcmFibGUgcGFydC4KLQkJICovCi0JCWlmICh3b3JrUHJvZHVjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJT2JqZWN0IG9iaiA9IHdvcmtQcm9kdWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcyhlLCAoRGVsaXZlcmFibGUpIG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgZWRpdG9yIERlbGl2ZXJhYmxlJ3MgZ2VuZXJhbGl6ZXIsIGlmIGdlbmVyYWxpemVyJ3Mgc3VicGFydHMKLQkJICogKHRyZWUpIGNvbnRhaW5zIHBhc3NlZCBkZWxpdmVyYWJsZS4gUmV0dXJuIGZhbHNlLgotCQkgKi8KLQotCQlJdGVyYXRvciBpdCA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKHdvcmtQcm9kdWN0KTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKHZlICE9IG51bGwpIHsKLQkJCQkvKgotCQkJCSAqIGdlbmVyYWxpemVyIGlzIGFkZGVkIHRvIGJhZGxpc3QsIGJlY2F1c2UgaWYgdmFyaWFiaWxpdHkgYmFzZQotCQkJCSAqIGlzIGZpbHRlcmVkIGJlZm9yZSBjb21pbmcgdG8gY2hpbGRBY2NlcHQob2JqZWN0KSBtZXRob2QsIHRoaXMKLQkJCQkgKiB3aWxsIHByZXZlbnRzIGFueSBzdWJwYXJ0cyBvZiBnZW5lcmFsaXplciB0byBiZSBhZGRlZCBhcyBhCi0JCQkJICogZGVsaXZlcmFibGUgcGFydCBvZiBEZWxpdmVyYWJsZSAoRWRpdG9yIG9iamVjdCBvciBsb2NhbAotCQkJCSAqIGRlZmluZWQgdmFyaWFibGUid29ya1Byb2R1Y3QiKS4KLQkJCQkgKiAKLQkJCQkgKiBlZzogRDEgLT4gRDIgLT4gRDMuICgtPiBpbmRpY2F0ZXMgZGVsaXZlcmFibGUgcGFydCkuIEQxCi0JCQkJICogY29udHJpYnV0ZXMgRDUuIGFuZCBENSdzIGRlbGl2ZXJhYmxlIHBhcnRzIGFzc2lnbiBmaWx0ZXIKLQkJCQkgKiBzaG91bGRub3Qgc2hvdyBEMiBhbmQgRDMuCi0JCQkJICogCi0JCQkJICovCi0JCQkJYmFkbGlzdC5hZGQodmUpOwotCQkJCWlmICh2ZS5lcXVhbHMoZSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoIVVJSGVscGVyLmNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoZSwgKERlbGl2ZXJhYmxlKSB2ZSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCS8qCi0JCSAqIAotCQkgKi8KLQkJaWYgKGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCU9iamVjdCBvYmogPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpIG9iaiwKLQkJCQkJKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8qCi0JCSAqIENoZWNrIHBhc3NlZCBvYmplY3QncyBnZW5lcmFsaXplcidzIGRlbGl2ZXJhYmxlIHBhcnRzIGxpc3QgZG9ub3QgaGF2ZQotCQkgKiB3b3JrUHJvZHVjdC4KLQkJICovCi0JCUl0ZXJhdG9yIGl0MSA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKGUpOwotCQl3aGlsZSAoaXQxLmhhc05leHQoKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQxLm5leHQoKTsKLQkJCWlmICh2ZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHZlLmVxdWFscyhlKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpIHZlLAotCQkJCQkJKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgd29ya1Byb2R1Y3Qgb2JqZWN0IChlZGl0b3Igb2JqZWN0KSdzIHZhcmlhYmlsaXR5IGFuZCBpdHMKLQkJICogZGVsaXZlcmFibGVzIHNob3VsZCBub3QgY29udGFpbiBwYXNzZWQgb2JqZWN0LgotCQkgKi8KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZWxpdmVyYWJsZVBhcnRzVmFyaWFiaWxpdHkoKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCwgbGlzdCk7Ci0JCWlmIChsaXN0LmNvbnRhaW5zKGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8qCi0JCSAqIENoZWNrIHBhc3NlZCBvYmplY3QgdmFyaWFiaWxpdHkgYW5kIGl0cyBkZWxpdmVyYWJsZXMgc2hvdWxkIG5vdAotCQkgKiBjb250YWluIHdvcmtwcm9kdWN0KGRlbGl2ZXJhYmxlIG9yIGVkaXRvciBvYmplY3QpLiBJZiBpdCBjb250YWlucywKLQkJICogcGFzc2VkIG9iamVjdCBzaG91bGRub3QgYmUgYWNjZXB0ZWQuCi0JCSAqLwotCQlkZWxpdmVyYWJsZVBhcnRzVmFyaWFiaWxpdHkoKERlbGl2ZXJhYmxlKSBlLCBsaXN0KTsKLQkJaWYgKGxpc3QuY29udGFpbnMod29ya1Byb2R1Y3QpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVsaXZlcmFibGVQYXJ0c1ZhcmlhYmlsaXR5KERlbGl2ZXJhYmxlIGUsIExpc3Qgcm9vdHMpIHsKLQkJTGlzdCBsaXN0ID0gKChEZWxpdmVyYWJsZSkgZSkuZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0JCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJaWYgKCgoRGVsaXZlcmFibGUpIG9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCXJvb3RzLmFkZCgoKERlbGl2ZXJhYmxlKSBvYmopCi0JCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJSXRlcmF0b3IgaXQxID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMoZSk7Ci0JCQkJCQl3aGlsZSAoaXQxLmhhc05leHQoKSkgewotCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0MQotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQlVSUhlbHBlci5kZWxpdmVyYWJsZVBhcnRzQ2hhaW4oKERlbGl2ZXJhYmxlKSB2ZSwgcm9vdHMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWRlbGl2ZXJhYmxlUGFydHNWYXJpYWJpbGl0eSgoRGVsaXZlcmFibGUpIG9iaiwgcm9vdHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQlJdGVyYXRvciBpdDEgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhlKTsKLQkJCXdoaWxlIChpdDEuaGFzTmV4dCgpKSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQxLm5leHQoKTsKLQkJCQlVSUhlbHBlci5kZWxpdmVyYWJsZVBhcnRzQ2hhaW4oKERlbGl2ZXJhYmxlKSB2ZSwgcm9vdHMpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTZkMDkzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Xb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgaW4gYSBXb3JrIFByb2R1Y3QgKEFydGlmYWN0LCBEZWxpdmVyYWJsZSBhbmQgT3V0Y29tZSkKLSAqIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9pbXBhY3Q7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3JlYXNvbjsKLQotCS8vIEZvciBBcnRpZmFjdAotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfYnJpZWZfb3V0bGluZTsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9uczsKLQotCS8vIEZvciBEZWxpdmVyYWJsZQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfZXh0ZXJuYWxfZGVzYywgY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2U7Ci0KLQlwcml2YXRlIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudDsKLQkJcHVycG9zZU9uID0gdHJ1ZTsKLQkJZXh0ZXJuYWxJZE9uID0gdHJ1ZTsKLQkJaWYgKCEoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBPdXRjb21lKSkgewotCQkJbm90YXRpb25TZWN0aW9uT24gPSB0cnVlOwotCQl9Ci0JCXRhaWxvcmluZ1NlY3Rpb25PbiA9IHRydWU7Ci0JCWljb25TZWN0aW9uT24gPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2NyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKSB7Ci0JCXN1cGVyLmNyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKTsKLQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWN0cmxfYnJpZWZfb3V0bGluZSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCQlub3RhdGlvbkNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkJSSUVGX09VVExJTkVfVEVYVCwgNDAsCi0JCQkJCTQwMCwgTk9UQVRJT05fU0VDVElPTl9JRCk7Ci0JCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJCXRvb2xraXQsIG5vdGF0aW9uQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSVRleHQuUkVQUkVTRU5UQVRJT05fT1BUSU9OU19URVhULCA0MCwgNDAwLAotCQkJCQlOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJfSBlbHNlIGlmICh3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQljdHJsX2V4dGVybmFsX2Rlc2MgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQkJbm90YXRpb25Db21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5FWFRFUk5BTF9ERVNDUklQVElPTl9URVhULCA0MCwgNDAwLAotCQkJCQlOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCQl0b29sa2l0LCBub3RhdGlvbkNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LlBBQ0tBR0lOR19HVUlEQU5DRV9URVhULCA0MCwgNDAwLAotCQkJCQlOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2NyZWF0ZVRhaWxvcmluZ1NlY3Rpb25Db250ZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWlsb3JpbmdTZWN0aW9uQ29udGVudCgpIHsKLQkJc3VwZXIuY3JlYXRlVGFpbG9yaW5nU2VjdGlvbkNvbnRlbnQoKTsKLQkJY3RybF9pbXBhY3QgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQl0YWlsb3JpbmdDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5JTVBBQ1RfT0ZfTk9UX0hBVklOR19URVhULAotCQkJCTQwLCA0MDAsIFRBSUxPUklOR19TRUNUSU9OX0lEKTsKLQkJY3RybF9yZWFzb24gPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQl0YWlsb3JpbmdDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlJFQVNPTl9GT1JfTk9UX05FRURJTkdfVEVYVCwgNDAsIDQwMCwKLQkJCQlUQUlMT1JJTkdfU0VDVElPTl9JRCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWZpbmFsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQljdHJsX3B1cnBvc2Uuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3B1cnBvc2Uuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpKTsKLQkJY3RybF9wdXJwb3NlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfcHVycG9zZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfcHVycG9zZTsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFB1cnBvc2UoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZXh0ZXJuYWxfaWQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9leHRlcm5hbF9pZC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEV4dGVybmFsSWQoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfZXh0ZXJuYWxfaWQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjdHJsX2V4dGVybmFsX2lkLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfaW1wYWN0LnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9pbXBhY3Quc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKSk7Ci0JCWN0cmxfaW1wYWN0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfaW1wYWN0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9pbXBhY3Q7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRJbXBhY3RPZk5vdEhhdmluZygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpLAotCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3JlYXNvbi5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfcmVhc29uLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCkpOwotCQljdHJsX3JlYXNvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3JlYXNvbi5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfcmVhc29uOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbikgd29ya1Byb2R1Y3QKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKSwKLQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWN0cmxfYnJpZWZfb3V0bGluZS5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX2JyaWVmX291dGxpbmUuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpKTsKLQkJCWN0cmxfYnJpZWZfb3V0bGluZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9icmllZl9vdXRsaW5lLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCTogY3RybF9icmllZl9vdXRsaW5lOwotCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRCcmllZk91dGxpbmUoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCS5nZXRUZXh0KCkgOiBjdHJsX2JyaWVmX291dGxpbmUuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwgY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCksCi0JCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9ucy5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudAotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJY3RybF9yZXByZXNlbnRhdGlvbl9vcHRpb25zCi0JCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKSk7Ci0JCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMKLQkJCQkJLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCW5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQkJOiBjdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnM7Ci0JCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKQotCQkJCQkJCQkJLmdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCQkJCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyCi0JCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCksCi0JCQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQl9Ci0KLQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCWN0cmxfZXh0ZXJuYWxfZGVzYy5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX2V4dGVybmFsX2Rlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKSk7Ci0JCQljdHJsX2V4dGVybmFsX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCWN0cmxfZXh0ZXJuYWxfZGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQk6IGN0cmxfZXh0ZXJuYWxfZGVzYzsKLQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCksCi0JCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2Uuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpKTsKLQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX3BhY2thZ2luZ19ndWlkYW5jZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQk6IGN0cmxfcGFja2FnaW5nX2d1aWRhbmNlOwotCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRQYWNrYWdpbmdHdWlkYW5jZSgpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpLAotCQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNyZWZyZXNoKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXN1cGVyLnJlZnJlc2goZWRpdGFibGUpOwotCQljdHJsX2ltcGFjdC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfcmVhc29uLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWN0cmxfYnJpZWZfb3V0bGluZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmICh3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQljdHJsX2V4dGVybmFsX2Rlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2Uuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZERhdGEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREYXRhKCkgewotCQlzdXBlci5sb2FkRGF0YSgpOwotCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBjb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJU3RyaW5nIHB1cnBvc2UgPSBjb250ZW50LmdldFB1cnBvc2UoKTsKLQkJU3RyaW5nIGltcGFjdCA9IGNvbnRlbnQuZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQkJU3RyaW5nIHJlYXNvbiA9IGNvbnRlbnQuZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQotCQljdHJsX3B1cnBvc2Uuc2V0VGV4dChwdXJwb3NlID09IG51bGwgPyAiIiA6IHB1cnBvc2UpOyAvLyROT04tTkxTLTEkCQotCQljdHJsX2ltcGFjdC5zZXRUZXh0KGltcGFjdCA9PSBudWxsID8gIiIgOiBpbXBhY3QpOyAvLyROT04tTkxTLTEkCQotCQljdHJsX3JlYXNvbi5zZXRUZXh0KHJlYXNvbiA9PSBudWxsID8gIiIgOiByZWFzb24pOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGV4dGVybmFsSWRPbikgewotCQkJU3RyaW5nIGV4dGVybmFsX2lkID0gY29udGVudC5nZXRFeHRlcm5hbElkKCk7Ci0JCQljdHJsX2V4dGVybmFsX2lkLnNldFRleHQoZXh0ZXJuYWxfaWQgPT0gbnVsbCA/ICIiIDogZXh0ZXJuYWxfaWQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJY3RybF9icmllZl9vdXRsaW5lCi0JCQkJCS5zZXRUZXh0KCgoQXJ0aWZhY3REZXNjcmlwdGlvbikgY29udGVudCkuZ2V0QnJpZWZPdXRsaW5lKCkgPT0gbnVsbCA/ICIiIDogKChBcnRpZmFjdERlc2NyaXB0aW9uKSBjb250ZW50KS5nZXRCcmllZk91dGxpbmUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9ucwotCQkJCQkuc2V0VGV4dCgoKEFydGlmYWN0RGVzY3JpcHRpb24pIGNvbnRlbnQpCi0JCQkJCQkJLmdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpID09IG51bGwgPyAiIiA6ICgoQXJ0aWZhY3REZXNjcmlwdGlvbikgY29udGVudCkuZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJY3RybF9leHRlcm5hbF9kZXNjCi0JCQkJCS5zZXRUZXh0KCgoRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgY29udGVudCkKLQkJCQkJCQkuZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpID09IG51bGwgPyAiIiA6ICgoRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgY29udGVudCkuZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2UKLQkJCQkJLnNldFRleHQoKChEZWxpdmVyYWJsZURlc2NyaXB0aW9uKSBjb250ZW50KQotCQkJCQkJCS5nZXRQYWNrYWdpbmdHdWlkYW5jZSgpID09IG51bGwgPyAiIiA6ICgoRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgY29udGVudCkuZ2V0UGFja2FnaW5nR3VpZGFuY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBXb3JrUHJvZHVjdEZpbHRlcigpIHsKLQkJCUxpc3QgYmFkbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKSB7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Ci0JCQkJCQkJCSYmICgoQ29udGVudEVsZW1lbnQpIGdldEhlbHBlcigpCi0JCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50KCkpLmdldFR5cGUoKS5lcXVhbHMoCi0JCQkJCQkJCQkJKChDb250ZW50RWxlbWVudCkgb2JqKS5nZXRUeXBlKCkpKSB7Ci0JCQkJCQkJLy8gcHJldmVudCBjaXJjdWxhciBkZXBlbmRlbmN5IGZyb20gZGVsaXZlcmFibGUKLQkJCQkJCQkvLyBwYXJ0cyBhbmQgdmFyaWFiaWxpdHkKLQkJCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUKLQkJCQkJCQkJCSYmIHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJCQkJaWYgKCFVSUhlbHBlci5jaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKAotCQkJCQkJCQkJCShEZWxpdmVyYWJsZSkgb2JqLAotCQkJCQkJCQkJCShEZWxpdmVyYWJsZSkgd29ya1Byb2R1Y3QpKSB7Ci0JCQkJCQkJCQliYWRsaXN0LmFkZChvYmopOwotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICgoKERlbGl2ZXJhYmxlKSBvYmopCi0JCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAoIVVJSGVscGVyCi0JCQkJCQkJCQkJCS5jaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKAotCQkJCQkJCQkJCQkJCShEZWxpdmVyYWJsZSkgKChEZWxpdmVyYWJsZSkgb2JqKQotCQkJCQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQkJCQkJCQkJCQkoRGVsaXZlcmFibGUpIHdvcmtQcm9kdWN0KSkgewotCQkJCQkJCQkJCWJhZGxpc3QuYWRkKG9iaik7Ci0JCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCUl0ZXJhdG9yIGl0MSA9IFRuZ1V0aWwKLQkJCQkJCQkJCQkuZ2V0R2VuZXJhbGl6ZXJzKChEZWxpdmVyYWJsZSkgb2JqKTsKLQkJCQkJCQkJd2hpbGUgKGl0MS5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0MQotCQkJCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCQkJaWYgKHZlICE9IG51bGwpIHsKLQkJCQkJCQkJCQlpZiAodmUuZXF1YWxzKG9iaikpCi0JCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQkJCQlpZiAoIVVJSGVscGVyCi0JCQkJCQkJCQkJCQkuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygKLQkJCQkJCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSB2ZSwKLQkJCQkJCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpIHsKLQkJCQkJCQkJCQkJYmFkbGlzdC5hZGQob2JqKTsKLQkJCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQotCQkJCQkJCQl9Ci0JCQkJCQkJCS8vIGJyb3dzZSB0aHJvdWdoIGJhZGxpc3QgYW5kIGl0cyBkZWxpdmVyYWJsZQotCQkJCQkJCQkvLyBwYXJ0cy4KLQkJCQkJCQkJTGlzdCB0ZW1wbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJhZGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJT2JqZWN0IGJhZCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJCVVJSGVscGVyLmRlbGl2ZXJhYmxlUGFydHNDaGFpbigKLQkJCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSBiYWQsIHRlbXBsaXN0KTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAodGVtcGxpc3QuY29udGFpbnMob2JqKSkKLQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gc2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcKLQkJKChDb250ZW50RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCXdvcmtQcm9kdWN0KSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBBcnRpZmFjdCl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3RfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFydGlmYWN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLm5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3Rfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFydGlmYWN0X2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBPdXRjb21lKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5vdXRjb21lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5ub3RhdGlvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3V0Y29tZV9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5ub3RhdGlvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX25vdGF0aW9uU2VjdGlvbl9kZXNjOwotCQkJdGhpcy50YWlsb3JpbmdTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZV9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdEd1aWRhbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OGJjNjMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdEd1aWRhbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkd1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBHdWlkYW5jZSBwYWdlIGluIHRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdEd1aWRhbmNlUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkdVSURBTkNFX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIFVJSGVscGVyLmdldFNlbGVjdGVkR3VpZGFuY2VzKHdvcmtQcm9kdWN0KTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gVGhlIGd1aWRhbmNlIGZvciB0aGUgY29udGVudCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIChQcmFjdGljZSkgaXRlbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksCi0JCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXBvcnQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gYWRkIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkidG8gIgotCQkJCQkJCQkJCQkrIHdvcmtQcm9kdWN0LmdldFR5cGUoKS5nZXROYW1lKCkKLQkJCQkJCQkJCQkJKyAiOiIgKyB3b3JrUHJvZHVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gVGhlIGd1aWRhbmNlIGZvciB0aGUgY29udGVudCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIChQcmFjdGljZSkgaXRlbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksCi0JCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXBvcnQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gcmVtb3ZlIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkiZnJvbSAiCi0JCQkJCQkJCQkJCSsgd29ya1Byb2R1Y3QuZ2V0VHlwZSgpLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICI6IiArIHdvcmtQcm9kdWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBHdWlkYW5jZUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlbXBsYXRlKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUmVwb3J0KQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFJvbGVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Um9sZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0MTk1NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Um9sZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBSb2xlcyBwYWdlIGluIHRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIFRPRE86IFJlbmFtZSB0aGlzIGNsYXNzIHRvIFdvcmtQcm9kdWN0Um9sZXNGb3JtUGFnZQotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RSb2xlc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3RSb2xlc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFJvbGVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlJPTEVTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldENhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTEoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTIoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGVzKChXb3JrUHJvZHVjdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSb2xlIHJvbGUgPSAoUm9sZSkgYWRkSXRlbXMuZ2V0KDApOwotCQkJaWYgKFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeU9wcG9zaXRlKHJvbGUsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgd29ya1Byb2R1Y3QpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgcm9sZSwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwKLQkJCQkJCXdvcmtQcm9kdWN0LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0vLwkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2V0UmVzcG9uc2libGVSb2xlKGdldEFjdGlvbk1hbmFnZXIoKSwKLS8vCQkJCQl3b3JrUHJvZHVjdCwgbnVsbCk7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUm9sZSByb2xlID0gKFJvbGUpIGl0ZXIubmV4dCgpOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHJvbGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgd29ya1Byb2R1Y3QsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRNb2RpZmllZEJ5KChXb3JrUHJvZHVjdCkgb2JqZWN0KQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFRhc2tzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VGFza3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5NjU5ODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VGFza3NQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFRhc2tzIHBhZ2UgaW4gdGhlIFdvcmsgUHJvZHVjdCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VGFza3NQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gIndvcmtQcm9kdWN0VGFza3NQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUYXNrc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5UQVNLU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRBbGxvd0NoYW5nZTEoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTIoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRNYW5kYXRvcnlJbnB1dFRvVGFza3MoCi0JCQkJCQkoV29ya1Byb2R1Y3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyh2aWV3ZXJfc2VsZWN0ZWQyKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHRhc2spKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLAotCQkJCQkJCXdvcmtQcm9kdWN0LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwKLQkJCQkJCXdvcmtQcm9kdWN0LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IHNlbGVjdGVkVGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJTGlzdCBhdmFpbGFibGVUYXNrc0xpc3QgPSBMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0QXZhaWxhYmxlVGFza3Mod29ya1Byb2R1Y3QpOwotCQkJCWlmIChhdmFpbGFibGVUYXNrc0xpc3QgIT0gbnVsbCAmJiBhdmFpbGFibGVUYXNrc0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IGF2YWlsYWJsZVRhc2tzTGlzdC5pdGVyYXRvcigpOyBpdAotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCQkJaWYgKHRhc2suZ2V0T3B0aW9uYWxJbnB1dCgpLmNvbnRhaW5zKHdvcmtQcm9kdWN0KSkKLQkJCQkJCQlzZWxlY3RlZFRhc2tzLmFkZCh0YXNrKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gc2VsZWN0ZWRUYXNrcy50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHRhc2spKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCksCi0JCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB0YXNrLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCksCi0JCQkJCQl3b3JrUHJvZHVjdCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dHRpbmdUYXNrcygKLQkJCQkJCShXb3JrUHJvZHVjdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDMuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMyhBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMyhBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB0YXNrLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSwgd29ya1Byb2R1Y3QsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMyhBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwzKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHRhc2ssCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLCB3b3JrUHJvZHVjdCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLldvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5MjlmMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VHlwZURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBXb3JrIHByb2R1Y3QgVHlwZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VHlwZURlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ3b3JrUHJvZHVjdFR5cGVEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0VHlwZSB3b3JrUHJvZHVjdFR5cGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGVEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXdvcmtQcm9kdWN0VHlwZSA9IChXb3JrUHJvZHVjdFR5cGUpIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RUeXBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpOwotCQkJfQotCQl9OwotCi0JCS8vIHNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nCi0JCSgoQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJd29ya1Byb2R1Y3RUeXBlKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya3Byb2R1Y3R0eXBlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyZTZkODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLldvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBXb3JrIFByb2R1Y3RzIHBhZ2UgaW4gdGhlIFdvcmsgUHJvZHVjdCBUeXBlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3RUeXBlIHdvcmtQcm9kdWN0VHlwZTsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LldPUktfUFJPRFVDVFNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdFR5cGUgPSAoV29ya1Byb2R1Y3RUeXBlKSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFdvcmtQcm9kdWN0VHlwZSkgb2JqZWN0KS5nZXRXb3JrUHJvZHVjdHMoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHdvcmtQcm9kdWN0VHlwZSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpLAotCQkJCQlhZGRJdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCB3b3JrUHJvZHVjdFR5cGUsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSwKLQkJCQkJcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdFR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCWlmIChnZXRIZWxwZXIoKS5pc0NvbnRyaWJ1dG9yKChDb250ZW50RWxlbWVudCkgb2JqKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiNzM3MTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGZvcm0gcGFnZXMgZm9yIHRoZSBtZXRob2QgYW5kIHByb2Nlc3MgZWRpdG9ycy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JUHJvYmxlbUNoYW5nZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZGM4ZTkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JUHJvYmxlbUNoYW5nZWRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotLyoqCi0gKiAKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudmlld3N1cHBvcnQuSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgewotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHByb2JsZW1zIGNoYW5nZWQuIFRoaXMgY2FsbCBpcyBwb3N0ZWQgaW4gYW4gYXluY2ggZXhlYywgdGhlcmVmb3JlIHBhc3NlZAotCSAqIHJlc291cmNlcyBtdXN0IG5vdCBleGlzdC4KLQkgKiBAcGFyYW0gY2hhbmdlZFJlc291cmNlcyAgQSBzZXQgd2l0aCBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gdGhhdAotCSAqIGRlc2NyaWJlIHRoZSByZXNvdXJjZXMgdGhhdCBoYWQgYW4gcHJvYmxlbSBjaGFuZ2UuCi0JICogQHBhcmFtIGlzTWFya2VyQ2hhbmdlIElmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIGNoYW5nZSB3YXMgYSBtYXJrZXIgY2hhbmdlLCBpZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIGNoYW5nZSBjYW1lIGZyb20gYW4gYW5ub3RhdGlvbiBtb2RlbCBtb2RpZmljYXRpb24uCi0JICovCi0Jdm9pZCBwcm9ibGVtc0NoYW5nZWQoSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcywgYm9vbGVhbiBpc01hcmtlckNoYW5nZSk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JbWFnZURlc2NyaXB0b3JSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNjM4NTI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JbWFnZURlc2NyaXB0b3JSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIAotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5JbWFnZURlc2NyaXB0b3JSZWdpc3RyeQotICoKLSAqLwotcHVibGljIGNsYXNzIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgSGFzaE1hcDxJbWFnZURlc2NyaXB0b3IsIEltYWdlPiBmUmVnaXN0cnk9IG5ldyBIYXNoTWFwPEltYWdlRGVzY3JpcHRvciwgSW1hZ2U+KDEwKTsKLQlwcml2YXRlIERpc3BsYXkgZkRpc3BsYXk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGUgY3VycmVudCBvciBkZWZhdWx0IGRpc3BsYXksCi0JICogcmVzcGVjdGl2ZWx5LgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJdGhpcyhBdXRob3JpbmdVSVBsdWdpbi5nZXRTdGFuZGFyZERpc3BsYXkoKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhlIGdpdmVuIGRpc3BsYXkuIEFsbCBpbWFnZXMKLQkgKiBtYW5hZ2VkIGJ5IHRoaXMgcmVnaXN0cnkgd2lsbCBiZSBkaXNwb3NlZCB3aGVuIHRoZSBkaXNwbGF5IGdldHMgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkgdGhlIGltYWdlcyBtYW5hZ2VkIGJ5IHRoaXMgcmVnaXN0cnkgYXJlIGFsbG9jYXRlZCBmb3IgCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KERpc3BsYXkgZGlzcGxheSkgewotCQlmRGlzcGxheT0gZGlzcGxheTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmRGlzcGxheSk7Ci0JCWhvb2tEaXNwbGF5KCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gaW1hZ2UgZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUgaW1hZ2UgZGVzY3JpcHRvciBmb3Igd2hpY2ggdGhlIHJlZ2lzdHJ5IG1hbmFnZXMgYW4gaW1hZ2UKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGltYWdlIGRlc2NyaXB0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgaWYgdGhlIGltYWdlIGRlc2NyaXB0b3IgY2FuJ3QgY3JlYXRlIHRoZSByZXF1ZXN0ZWQgaW1hZ2UuCi0JICovCi0JcHVibGljIEltYWdlIGdldChJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKQotCQkJZGVzY3JpcHRvcj0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCQotCQlJbWFnZSByZXN1bHQ9IChJbWFnZSlmUmVnaXN0cnkuZ2V0KGRlc2NyaXB0b3IpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQotCQlBc3NlcnQuaXNUcnVlKGZEaXNwbGF5ID09IEF1dGhvcmluZ1VJUGx1Z2luLmdldFN0YW5kYXJkRGlzcGxheSgpLCAiQWxsb2NhdGluZyBpbWFnZSBmb3Igd3JvbmcgZGlzcGxheS4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQ9IGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJZlJlZ2lzdHJ5LnB1dChkZXNjcmlwdG9yLCByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCBpbWFnZXMgbWFuYWdlZCBieSB0aGlzIHJlZ2lzdHJ5LgotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IGZSZWdpc3RyeS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQlJbWFnZSBpbWFnZT0gKEltYWdlKWl0ZXIubmV4dCgpOwotCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0JCWZSZWdpc3RyeS5jbGVhcigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaG9va0Rpc3BsYXkoKSB7Ci0JCWZEaXNwbGF5LmRpc3Bvc2VFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkaXNwb3NlKCk7Ci0JCQl9CQotCQl9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL0ltYWdlSW1hZ2VEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSW1hZ2VJbWFnZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjc4NjRkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSW1hZ2VJbWFnZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci0KLS8qKgotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5JbWFnZUltYWdlRGVzY3JpcHRvcgotICoKLSAqLwotcHVibGljIGNsYXNzIEltYWdlSW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgSW1hZ2VEZXNjcmlwdG9yIHsKLQotCXByaXZhdGUgSW1hZ2UgZkltYWdlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEltYWdJbWFnZURlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIEltYWdlSW1hZ2VEZXNjcmlwdG9yKEltYWdlIGltYWdlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZJbWFnZT0gaW1hZ2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSW1hZ2VEZXNjcmlwdG9yI2dldEltYWdlRGF0YSgpCi0JICovCi0JcHVibGljIEltYWdlRGF0YSBnZXRJbWFnZURhdGEoKSB7Ci0JCXJldHVybiBmSW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIChvYmogIT0gbnVsbCkgJiYgZ2V0Q2xhc3MoKS5lcXVhbHMob2JqLmdldENsYXNzKCkpICYmIGZJbWFnZS5lcXVhbHMoKChJbWFnZUltYWdlRGVzY3JpcHRvcilvYmopLmZJbWFnZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZkltYWdlLmhhc2hDb2RlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MGU3ODFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5qYXZhZWRpdG9yLkphdmFFZGl0b3JFcnJvclRpY2tVcGRhdGVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgaW1wbGVtZW50cyBJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnRFZGl0b3IgZk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci0JcHJpdmF0ZSBNZXRob2RFbGVtZW50VUlMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyOwotCi0JcHVibGljIE1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyKE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZWRpdG9yKTsKLQkJZk1ldGhvZEVsZW1lbnRFZGl0b3I9IGVkaXRvcjsKLQkJZkxhYmVsUHJvdmlkZXI9IG5ldyBNZXRob2RFbGVtZW50VUlMYWJlbFByb3ZpZGVyKCk7Ci0JCWZMYWJlbFByb3ZpZGVyLmFkZExhYmVsRGVjb3JhdG9yKG5ldyBQcm9ibGVtc0xhYmVsRGVjb3JhdG9yKG51bGwpKTsKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByb2JsZW1NYXJrZXJNYW5hZ2VyKCkuYWRkTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIjcHJvYmxlbXNDaGFuZ2VkKElSZXNvdXJjZVtdLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHByb2JsZW1zQ2hhbmdlZChJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKSB7Ci0JCWlmICghaXNNYXJrZXJDaGFuZ2UpCi0JCQlyZXR1cm47Ci0KLQkJSUVkaXRvcklucHV0IGlucHV0PSBmTWV0aG9kRWxlbWVudEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsgLy8gbWlnaHQgcnVuIGFzeW5jLCB0ZXN0cyBuZWVkZWQKLQkJCU1ldGhvZEVsZW1lbnQgbWVsZW1lbnQgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dClpbnB1dCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJaWYgKG1lbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCW1lbGVtZW50ID0gKChQcm9jZXNzQ29tcG9uZW50KSBtZWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQkJfQotCQkJaWYgKG1lbGVtZW50ICE9IG51bGwpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2U9IFBlcnNpc3RlbmNlVXRpbC5nZXRXb3Jrc3BhY2VSZXNvdXJjZShtZWxlbWVudCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VkUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChjaGFuZ2VkUmVzb3VyY2VzW2ldLmVxdWFscyhyZXNvdXJjZSkpIHsKLQkJCQkJCXVwZGF0ZUVkaXRvckltYWdlKG1lbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUVkaXRvckltYWdlKE1ldGhvZEVsZW1lbnQgbWVsZW1lbnQpIHsKLQkJSW1hZ2UgdGl0bGVJbWFnZT0gZk1ldGhvZEVsZW1lbnRFZGl0b3IuZ2V0VGl0bGVJbWFnZSgpOwotCQlpZiAodGl0bGVJbWFnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSW1hZ2UgbmV3SW1hZ2U7Ci0JCW5ld0ltYWdlPSBmTGFiZWxQcm92aWRlci5nZXRJbWFnZShtZWxlbWVudCk7Ci0JCWlmICh0aXRsZUltYWdlICE9IG5ld0ltYWdlKSB7Ci0JCQlwb3N0SW1hZ2VDaGFuZ2UobmV3SW1hZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvc3RJbWFnZUNoYW5nZShmaW5hbCBJbWFnZSBuZXdJbWFnZSkgewotCQlTaGVsbCBzaGVsbD0gZk1ldGhvZEVsZW1lbnRFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCk7Ci0JCWlmIChzaGVsbCAhPSBudWxsICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmTWV0aG9kRWxlbWVudEVkaXRvci51cGRhdGVkVGl0bGVJbWFnZShuZXdJbWFnZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmTGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9ibGVtTWFya2VyTWFuYWdlcigpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4ODIyMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0vKioKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yIHsKLQkKLQkvKiogRmxhZyB0byByZW5kZXIgdGhlIGVycm9yIGFkb3JubWVudC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFUlJPUj0JCQkweDA0MDsKLQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZCYXNlSW1hZ2U7Ci0JcHJpdmF0ZSBpbnQgZkZsYWdzOwotCXByaXZhdGUgUG9pbnQgZlNpemU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IE1ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGJhc2VJbWFnZSBhbiBpbWFnZSBkZXNjcmlwdG9yIHVzZWQgYXMgdGhlIGJhc2UgaW1hZ2UKLQkgKiBAcGFyYW0gZmxhZ3MgZmxhZ3MgaW5kaWNhdGluZyB3aGljaCBhZG9ybm1lbnRzIGFyZSB0byBiZSByZW5kZXJlZC4gU2VlIDxjb2RlPnNldEFkb3JubWVudHM8L2NvZGU+Ci0JICogCWZvciB2YWxpZCB2YWx1ZXMuCi0JICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBpbWFnZQotCSAqIEBzZWUgI3NldEFkb3JubWVudHMoaW50KQotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBiYXNlSW1hZ2UsIGludCBmbGFncywgUG9pbnQgc2l6ZSkgewotCQlmQmFzZUltYWdlPSBiYXNlSW1hZ2U7Ci0JCUFzc2VydC5pc05vdE51bGwoZkJhc2VJbWFnZSk7Ci0JCWZGbGFncz0gZmxhZ3M7Ci0JCUFzc2VydC5pc1RydWUoZkZsYWdzID49IDApOwotCQlmU2l6ZT0gc2l6ZTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmU2l6ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGRlc2NyaXB0b3JzIGFkb3JubWVudHMuIFZhbGlkIHZhbHVlcyBhcmU6IDxjb2RlPkFCU1RSQUNUPC9jb2RlPiwgPGNvZGU+RklOQUw8L2NvZGU+LAotCSAqIDxjb2RlPlNZTkNIUk9OSVpFRDwvY29kZT4sIDwvY29kZT5TVEFUSUM8Y29kZT4sIDwvY29kZT5SVU5OQUJMRTxjb2RlPiwgPC9jb2RlPldBUk5JTkc8Y29kZT4sIAotCSAqIDwvY29kZT5FUlJPUjxjb2RlPiwgPC9jb2RlPk9WRVJSSURERVM8Y29kZT4sIDxjb2RlPklNUExFTUVOVFM8L2NvZGU+LCA8Y29kZT5DT05TVFJVQ1RPUjwvY29kZT4sCi0JICogPGNvZGU+REVQUkVDQVRFRDwvY29kZT4sICBvciBhbnkgY29tYmluYXRpb24gb2YgdGhvc2UuCi0JICogCi0JICogQHBhcmFtIGFkb3JubWVudHMgdGhlIGltYWdlIGRlc2NyaXB0b3JzIGFkb3JubWVudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZG9ybm1lbnRzKGludCBhZG9ybm1lbnRzKSB7Ci0JCUFzc2VydC5pc1RydWUoYWRvcm5tZW50cyA+PSAwKTsKLQkJZkZsYWdzPSBhZG9ybm1lbnRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgYWRvcm5tZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGFkb3JubWVudHMKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFkcm9ubWVudHMoKSB7Ci0JCXJldHVybiBmRmxhZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UgY3JlYXRlZCBieSBjYWxsaW5nIDxjb2RlPmNyZWF0ZUltYWdlKCk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBpbWFnZSByZXR1cm5lZCBmcm9tIGNhbGxpbmcgPGNvZGU+Y3JlYXRlSW1hZ2UoKTwvY29kZT4KLQkgKiBAc2VlIEltYWdlRGVzY3JpcHRvciNjcmVhdGVJbWFnZSgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2VTaXplKFBvaW50IHNpemUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChzaXplKTsKLQkJQXNzZXJ0LmlzVHJ1ZShzaXplLnggPj0gMCAmJiBzaXplLnkgPj0gMCk7Ci0JCWZTaXplPSBzaXplOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBpbWFnZSBjcmVhdGVkIGJ5IGNhbGxpbmcgPGNvZGU+Y3JlYXRlSW1hZ2UoKTwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UgY3JlYXRlZCBieSBjYWxsaW5nIDxjb2RlPmNyZWF0ZUltYWdlKCk8L2NvZGU+Ci0JICogQHNlZSBJbWFnZURlc2NyaXB0b3IjY3JlYXRlSW1hZ2UoKQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRJbWFnZVNpemUoKSB7Ci0JCXJldHVybiBuZXcgUG9pbnQoZlNpemUueCwgZlNpemUueSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgaW4gQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiBmU2l6ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBPYmplY3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8ICFNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLmNsYXNzLmVxdWFscyhvYmplY3QuZ2V0Q2xhc3MoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvciBvdGhlcj0gKE1ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3Ipb2JqZWN0OwotCQlyZXR1cm4gKGZCYXNlSW1hZ2UuZXF1YWxzKG90aGVyLmZCYXNlSW1hZ2UpICYmIGZGbGFncyA9PSBvdGhlci5mRmxhZ3MgJiYgZlNpemUuZXF1YWxzKG90aGVyLmZTaXplKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gT2JqZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmQmFzZUltYWdlLmhhc2hDb2RlKCkgfCBmRmxhZ3MgfCBmU2l6ZS5oYXNoQ29kZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIGluIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJSW1hZ2VEYXRhIGJnPSBnZXRJbWFnZURhdGEoZkJhc2VJbWFnZSk7Ci0JCQkKLQkJCi0JCWRyYXdJbWFnZShiZywgMCwgMCk7Ci0JCQkJCi0JCWRyYXdUb3BSaWdodCgpOwotCQlkcmF3Qm90dG9tUmlnaHQoKTsKLQkJZHJhd0JvdHRvbUxlZnQoKTsKLQkJCi0KLQl9Ci0JCi0JcHJpdmF0ZSBJbWFnZURhdGEgZ2V0SW1hZ2VEYXRhKEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCUltYWdlRGF0YSBkYXRhPSBkZXNjcmlwdG9yLmdldEltYWdlRGF0YSgpOyAvLyBzZWUgYnVnIDUxOTY1OiBnZXRJbWFnZURhdGEgY2FuIHJldHVybiBudWxsCi0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCWRhdGE9IERFRkFVTFRfSU1BR0VfREFUQTsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigiSW1hZ2UgZGF0YSBub3QgYXZhaWxhYmxlOiAiICsgZGVzY3JpcHRvci50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBkYXRhOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgZHJhd1RvcFJpZ2h0KCkgewkJCi0JfQkJCi0JCi0JcHJpdmF0ZSB2b2lkIGRyYXdCb3R0b21SaWdodCgpIHsKLQl9CQkKLQkKLQlwcml2YXRlIHZvaWQgZHJhd0JvdHRvbUxlZnQoKSB7Ci0JCVBvaW50IHNpemU9IGdldFNpemUoKTsKLQkJaW50IHg9IDA7Ci0JCWlmICgoZkZsYWdzICYgRVJST1IpICE9IDApIHsKLQkJCUltYWdlRGF0YSBkYXRhPSBnZXRJbWFnZURhdGEoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0RFU0NfT1ZSX0VSUk9SKTsKLQkJCWRyYXdJbWFnZShkYXRhLCB4LCBzaXplLnkgLSBkYXRhLmhlaWdodCk7Ci0JCQl4Kz0gZGF0YS53aWR0aDsKLQkJfQotCX0JCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL1Byb2JsZW1NYXJrZXJNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvUHJvYmxlbU1hcmtlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2YyMjMwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvUHJvYmxlbU1hcmtlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIExpc3RlbnMgdG8gcmVzb3VyY2UgZGVsdGFzIGFuZCBmaWx0ZXJzIGZvciBtYXJrZXIgY2hhbmdlcyBvZiB0eXBlIElNYXJrZXIuUFJPQkxFTQotICogVmlld2VycyBzaG93aW5nIGVycm9yIHRpY2tzIHNob3VsZCByZWdpc3RlciBhcyBsaXN0ZW5lciB0bwotICogdGhpcyB0eXBlLgotICogCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LlByb2JsZW1NYXJrZXJNYW5hZ2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ibGVtTWFya2VyTWFuYWdlciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIFZpc2l0b3JzIHVzZWQgdG8gbG9vayBpZiB0aGUgZWxlbWVudCBjaGFuZ2UgZGVsdGEgY29udGFpbnMgYSBtYXJrZXIgY2hhbmdlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFByb2plY3RFcnJvclZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCi0JCXByaXZhdGUgSGFzaFNldDxJUmVzb3VyY2U+IGZDaGFuZ2VkRWxlbWVudHM7IAotCQkKLQkJcHVibGljIFByb2plY3RFcnJvclZpc2l0b3IoSGFzaFNldDxJUmVzb3VyY2U+IGNoYW5nZWRFbGVtZW50cykgewotCQkJZkNoYW5nZWRFbGVtZW50cz0gY2hhbmdlZEVsZW1lbnRzOwotCQl9Ci0JCQkKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlSZXNvdXJjZSByZXM9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlpZiAocmVzIGluc3RhbmNlb2YgSVByb2plY3QgJiYgZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0PSAoSVByb2plY3QpIHJlczsKLQkJCQlpZiAoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJLy8gb25seSB0cmFjayBvcGVuIEphdmEgcHJvamVjdHMKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWNoZWNrSW52YWxpZGF0ZShkZWx0YSwgcmVzKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY2hlY2tJbnZhbGlkYXRlKElSZXNvdXJjZURlbHRhIGRlbHRhLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCWludCBraW5kPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCQlpZiAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHx8IGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQURERUQgfHwgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiBpc0Vycm9yRGVsdGEoZGVsdGEpKSkgewotCQkJCS8vIGludmFsaWRhdGUgdGhlIHJlc291cmNlIGFuZCBhbGwgcGFyZW50cwotCQkJCXdoaWxlIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlJPT1QgJiYgZkNoYW5nZWRFbGVtZW50cy5hZGQocmVzb3VyY2UpKSB7Ci0JCQkJCXJlc291cmNlPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJCQl9Ci0JCQl9IAotCQl9CQotCQkKLQkJcHJpdmF0ZSBib29sZWFuIGlzRXJyb3JEZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewkKLQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1BUktFUlMpICE9IDApIHsKLQkJCQlJTWFya2VyRGVsdGFbXSBtYXJrZXJEZWx0YXM9IGRlbHRhLmdldE1hcmtlckRlbHRhcygpOwotCQkJCWZvciAoaW50IGk9IDA7IGkgPCBtYXJrZXJEZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKG1hcmtlckRlbHRhc1tpXS5pc1N1YnR5cGVPZihJTWFya2VyLlBST0JMRU0pKSB7Ci0JCQkJCQlpbnQga2luZD0gbWFya2VyRGVsdGFzW2ldLmdldEtpbmQoKTsKLQkJCQkJCWlmIChraW5kID09IElSZXNvdXJjZURlbHRhLkFEREVEIHx8IGtpbmQgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWludCBzZXZlcml0eT0gbWFya2VyRGVsdGFzW2ldLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCAtMSk7Ci0JCQkJCQlpbnQgbmV3U2V2ZXJpdHk9IG1hcmtlckRlbHRhc1tpXS5nZXRNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgLTEpOwotCQkJCQkJaWYgKG5ld1NldmVyaXR5ICE9IHNldmVyaXR5KQotCQkJCQkJCXJldHVybiB0cnVlOyAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGZMaXN0ZW5lcnM7Ci0JCi0JCi0JcHVibGljIFByb2JsZW1NYXJrZXJNYW5hZ2VyKCkgewotCQlmTGlzdGVuZXJzPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZAotCSAqLwkKLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJSGFzaFNldDxJUmVzb3VyY2U+IGNoYW5nZWRFbGVtZW50cz0gbmV3IEhhc2hTZXQ8SVJlc291cmNlPigpOwotCQkKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhICE9IG51bGwpCi0JCQkJZGVsdGEuYWNjZXB0KG5ldyBQcm9qZWN0RXJyb3JWaXNpdG9yKGNoYW5nZWRFbGVtZW50cykpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JCWlmICghY2hhbmdlZEVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJSVJlc291cmNlW10gY2hhbmdlcz0gKElSZXNvdXJjZVtdKSBjaGFuZ2VkRWxlbWVudHMudG9BcnJheShuZXcgSVJlc291cmNlW2NoYW5nZWRFbGVtZW50cy5zaXplKCldKTsKLQkJCWZpcmVDaGFuZ2VzKGNoYW5nZXMsIHRydWUpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElBbm5vdGF0aW9uTW9kZWxMaXN0ZW5lciNtb2RlbENoYW5nZWQoSUFubm90YXRpb25Nb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbENoYW5nZWQoSUFubm90YXRpb25Nb2RlbCBtb2RlbCkgewotCQkvLyBubyBhY3Rpb24KLQl9CQotCQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciBmb3IgcHJvYmxlbSBtYXJrZXIgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZkxpc3RlbmVycy5pc0VtcHR5KCkpIHsgCi0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlmTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIDxjb2RlPklQcm9ibGVtQ2hhbmdlZExpc3RlbmVyPC9jb2RlPi4KLQkgKi8JCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQlpZiAoZkxpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmaXJlQ2hhbmdlcyhmaW5hbCBJUmVzb3VyY2VbXSBjaGFuZ2VzLCBmaW5hbCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKSB7Ci0JCURpc3BsYXkgZGlzcGxheT0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ICE9IG51bGwgJiYgIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewkJCi0JCQkJCU9iamVjdFtdIGxpc3RlbmVycz0gZkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCQkJZm9yIChpbnQgaT0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgY3Vycj0gKElQcm9ibGVtQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0JCQkJCQljdXJyLnByb2JsZW1zQ2hhbmdlZChjaGFuZ2VzLCBpc01hcmtlckNoYW5nZSk7Ci0JCQkJCX0JCi0JCQkJfQotCQkJfSk7Ci0JCX0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmFlYmIwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgVUkgc2VydmljZXMgZm9yIHRoZSBBdXRob3JpbmcgYW5kIEJyb3dzaW5nIHBlcnNwZWN0aXZlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiNjBlOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0FwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VDb25zdGFudHM7Ci0KLS8qKgotICogCi0gKiBQcmVmZXJlbmNlIGNvbnN0YW50cyBmb3IgYXBwbGljYXRpb24KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMgaW1wbGVtZW50cyBQcmVmZXJlbmNlQ29uc3RhbnRzIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0VOQUJMRV9QUk9DRVNTX0NPTlRSSUJVVElPTiA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfRU5BQkxFX1BST0NFU1NfQ09OVFJJQlVUSU9OOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9FTkFCTEVfSEVBTFRIX0NIRUNLID0gTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9FTkFCTEVfSEVBTFRIX0NIRUNLOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFID0gTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTElCX1ZJRVdfTEFZT1VUID0gImxheW91dCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBTYXZlcyB0aGUgVVJJIG9mIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IHdhcyBvcGVuZWQgaW4gdGhlIGxhc3Qgc2Vzc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TGF5b3V0KFN0cmluZyB2YWx1ZSkgewotCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJUFJFRl9MSUJfVklFV19MQVlPVVQsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IHdhcyBvcGVuZWQgaW4gdGhlIGxhc3Qgc2Vzc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMYXlvdXQoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCVBSRUZfTElCX1ZJRVdfTEFZT1VUKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMmE3ZTJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BdXRob3JpbmdQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLQotLyoqCi0gKiBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZm9yIEF1dGhvcmluZ1BsdWdpbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1ByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzCi0JCUFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJc3RvcmUuc2V0RGVmYXVsdChBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUywKLQkJCQlQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UKLQkJCQkJCS50b1N0cmluZyhQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV0JTX0NPTFVNTlMpKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUywKLQkJCQlQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UKLQkJCQkJCS50b1N0cmluZyhQcm9jZXNzRWRpdG9yLkRFRkFVTFRfVEJTX0NPTFVNTlMpKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMsCi0JCQkJUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlCi0JCQkJCQkudG9TdHJpbmcoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1dQQlNfQ09MVU1OUykpOwotCQlzdG9yZS5zZXREZWZhdWx0KAotCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUsCi0JCQkJdHJ1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQ29tbW9uUHJlZlBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Db21tb25QcmVmUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNDA4NDZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Db21tb25QcmVmUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgY29tbW9uIG9wdGlvbnMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25QcmVmUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBkbyBub3RoaW5nIGluIHRoaXMgY29tbW9uIHByZWZlcmVuY2UgcGFnZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUdyaWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuRGlyZWN0b3J5RGlhbG9nKENvbXBvc2l0ZSBwYXJlbnQsIFRleHQgcGF0aF9jdHIpIHsKLQkJdHJ5IHsKLQkJCURpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2cocGFyZW50LmdldFNoZWxsKCksCi0JCQkJCVNXVC5OT05FKTsKLQotCQkJU3RyaW5nIGRlc3RpbmF0aW9uID0gZGQub3BlbigpOwotCQkJaWYgKGRlc3RpbmF0aW9uICE9IG51bGwpIHsKLQkJCQlwYXRoX2N0ci5zZXRUZXh0KGRlc3RpbmF0aW9uKTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRvIGNyZWF0ZSBhIExhYmVsCi0JICogQHBhcmFtIHBhcmVudCBwYXJlbnQgY29tcG9zaXRlIG9mIHRoZSBMYWJlbAotCSAqIEBwYXJhbSB0ZXh0IExhYmVsIHRleHQKLQkgKiBAcGFyYW0gc3BhbiBob3Jpem9udGFsIHNwYW4KLQkgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIExhYmVsCi0JICovCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3BhbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBjcmVhdGUgYSByYWRpbyBidXR0b24KLQkgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBjb21wb3NpdGUgb2YgdGhlIGJ1dHRvbgotCSAqIEBwYXJhbSBsYWJlbCB0aGUgYnV0dG9uIGxhYmVsCi0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBSYWRpbyBCdXR0b24KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyB8IFNXVC5MRUZUKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBjcmVhdGUgYSBsaW5lCi0JICogQHBhcmFtIHBhcmVudCBwYXJlbnQgY29tcG9zaXRlIG9mIHRoZSBsaW5lCi0JICogQHBhcmFtIG5jb2wgaG9yaXpvbnRhbCBzcGFuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTGluZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbmNvbCkgewotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuQk9MRCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbmNvbDsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHByZWZlcmVuY2Ugc3RvcmUKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQotCQlyZXR1cm4gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCS8vIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvRGVidWdQcmVmUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0RlYnVnUHJlZlBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTdmZjhhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvRGVidWdQcmVmUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBkZWJ1ZyBvcHRpb25zCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlYnVnUHJlZlBhZ2UgZXh0ZW5kcyBDb21tb25QcmVmUGFnZSBpbXBsZW1lbnRzCi0JCUlXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlpbnQgTlVNX0NPTFVNTiA9IDM7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGVfdGFiOwotCi0JLy8gcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotCXByaXZhdGUgQnV0dG9uIGVuYWJsZUhlYWx0aENoZWNrOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gY29tcG9zaXRlX3RhYiA8PCBwYXJlbnQKLQkJY29tcG9zaXRlX3RhYiA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIE5VTV9DT0xVTU4pOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZV90YWIsICIgIiwgTlVNX0NPTFVNTik7IC8vJE5PTi1OTFMtMSQKLQotCQllbmFibGVIZWFsdGhDaGVjayA9IG5ldyBCdXR0b24oY29tcG9zaXRlX3RhYiwgU1dULkNIRUNLKTsKLQkJZW5hYmxlSGVhbHRoQ2hlY2suc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5lbmFibGVIZWFsdGhDaGVja190ZXh0KTsgCi0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYiwgIiAiLCBOVU1fQ09MVU1OKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZV90YWIsIE5VTV9DT0xVTU4pOwotCi0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlX3RhYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyB0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3RvcmVWYWx1ZXMoKTsKLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkNvbW1vblByZWZQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQotCQlyZXR1cm4gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlzdG9yZS5zZXRWYWx1ZShBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9FTkFCTEVfSEVBTFRIX0NIRUNLLAotCQkJCWVuYWJsZUhlYWx0aENoZWNrLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHVzaW5nIGRlZmF1bHQgdmFsdWVzIGluIHRoZSBwcmVmZXJlbmNlCi0JICogc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCWVuYWJsZUhlYWx0aENoZWNrCi0JCQkJLnNldFNlbGVjdGlvbihzdG9yZQotCQkJCQkJLmdldERlZmF1bHRCb29sZWFuKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0VOQUJMRV9IRUFMVEhfQ0hFQ0spKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJZW5hYmxlSGVhbHRoQ2hlY2sKLQkJCQkuc2V0U2VsZWN0aW9uKHN0b3JlCi0JCQkJCQkuZ2V0Qm9vbGVhbihBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9FTkFCTEVfSEVBTFRIX0NIRUNLKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9EaWFncmFtUHJlZlBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9EaWFncmFtUHJlZlBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGZjZDFhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvRGlhZ3JhbVByZWZQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgZGlhZ3JhbSBvcHRpb25zCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTGUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVByZWZQYWdlIGV4dGVuZHMgQ29tbW9uUHJlZlBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQotCUNvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLQlpbnQgTlVNX0NPTFVNTiA9IDM7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX3B1Ymxpc2hfYWRfZm9yX2FjdGl2aXR5X2V4dGVuc2lvbjsKLQkKLQlwdWJsaWMgRGlhZ3JhbVByZWZQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQljb21wb3NpdGUgPSBjcmVhdGVHcmlkQ29tcG9zaXRlKHBhcmVudCwgTlVNX0NPTFVNTik7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiICIsIE5VTV9DT0xVTU4pOyAvLyROT04tTkxTLTEkCi0KLQkJY3RybF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWN0cmxfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZAotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb21wdGZvcl9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkX3RleHQpOyAKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQljdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWN0cmxfcHVibGlzaF9hZF9mb3JfYWN0aXZpdHlfZXh0ZW5zaW9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWN0cmxfcHVibGlzaF9hZF9mb3JfYWN0aXZpdHlfZXh0ZW5zaW9uCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtKTsgCi0JCQkJCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIiAiLCBOVU1fQ09MVU1OKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZSwgTlVNX0NPTFVNTik7Ci0KLQkJaW5pdGlhbGl6ZVZhbHVlcygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3RvcmVWYWx1ZXMoKTsKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQkvLyBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCS8vIHN0b3JlLnNldFZhbHVlKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUFJPTVBUX0ZPUl9MSUJSQVJZX0FUX1NUQVJUVVAsCi0JCS8vIGN0cmxfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZC5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLnNldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKGN0cmxfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZAotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oY3RybF9wdWJsaXNoX2FkX2Zvcl9hY3Rpdml0eV9leHRlbnNpb24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpIHsKLQkJLy8gSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQljdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJY3RybF9wdWJsaXNoX2FkX2Zvcl9hY3Rpdml0eV9leHRlbnNpb24uc2V0U2VsZWN0aW9uKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJLy8gSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvLyBjdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQuc2V0U2VsZWN0aW9uKHN0b3JlLmdldEJvb2xlYW4oTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9QUk9NUFRfRk9SX0xJQlJBUllfQVRfU1RBUlRVUCkpOwotCQljdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQuc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKCkpOwotCQljdHJsX3B1Ymxpc2hfYWRfZm9yX2FjdGl2aXR5X2V4dGVuc2lvbgotCQkJCS5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCS5nZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQ29tbW9uUHJlZlBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5TG9jYXRpb25EYXRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeUxvY2F0aW9uRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MGU4NjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5TG9jYXRpb25EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLQotLyoqCi0gKiBMb2NhdGlvbiBEYXRhIGZvciBsaWJyYXJ5IAotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzQwMQotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUxvY2F0aW9uRGF0YSB7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXJlbnRGb2xkZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBsaWJOYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGliQnJpZWZEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1NpbmdsZUxpYkZpbGU7Ci0KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0TGliRGlyOwotCi0JcHJpdmF0ZSBib29sZWFuIGRlZkxpYkRpckNoZWNrZWQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBsaWJyYXJ5RmlsZSA9ICJsaWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNPa1ByZXNzZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPa1ByZXNzZWQoKSB7Ci0JCXJldHVybiBpc09rUHJlc3NlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNPa1ByZXNzZWQKLQkgKiAgICAgICAgICAgIFRoZSBpc09rUHJlc3NlZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2tQcmVzc2VkKGJvb2xlYW4gaXNPa1ByZXNzZWQpIHsKLQkJdGhpcy5pc09rUHJlc3NlZCA9IGlzT2tQcmVzc2VkOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc09rUHJlc3NlZDsKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNTaW5nbGVMaWJGaWxlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2luZ2xlTGliRmlsZSgpIHsKLQkJcmV0dXJuIGlzU2luZ2xlTGliRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNTaW5nbGVMaWJGaWxlCi0JICogICAgICAgICAgICBUaGUgaXNTaW5nbGVMaWJGaWxlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaW5nbGVMaWJGaWxlKGJvb2xlYW4gaXNTaW5nbGVMaWJGaWxlKSB7Ci0JCXRoaXMuaXNTaW5nbGVMaWJGaWxlID0gaXNTaW5nbGVMaWJGaWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGliTmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYk5hbWUoKSB7Ci0JCXJldHVybiBsaWJOYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gRnVsbCBwYXRoIG9mIGxpYnJhcnkueG1pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5RmlsZSgpIHsKLQkJcmV0dXJuIGdldFBhcmVudEZvbGRlcigpICsgRmlsZS5zZXBhcmF0b3IgKyBsaWJyYXJ5RmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGliTmFtZQotCSAqICAgICAgICAgICAgVGhlIGxpYk5hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpYk5hbWUoU3RyaW5nIGxpYk5hbWUpIHsKLQkJdGhpcy5saWJOYW1lID0gbGliTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmVudEZvbGRlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudEZvbGRlcigpIHsKLQkJcmV0dXJuIHBhcmVudEZvbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Rm9sZGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50Rm9sZGVyIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRGb2xkZXIoU3RyaW5nIHBhcmVudEZvbGRlcikgewotCQl0aGlzLnBhcmVudEZvbGRlciA9IHBhcmVudEZvbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxpYkJyaWVmRGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJCcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbGliQnJpZWZEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGliQnJpZWZEZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgVGhlIGxpYkJyaWVmRGVzY3JpcHRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpYkJyaWVmRGVzY3JpcHRpb24oU3RyaW5nIGxpYkJyaWVmRGVzY3JpcHRpb24pIHsKLQkJdGhpcy5saWJCcmllZkRlc2NyaXB0aW9uID0gbGliQnJpZWZEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlZkxpYkRpckNoZWNrZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZMaWJEaXJDaGVja2VkKCkgewotCQlyZXR1cm4gZGVmTGliRGlyQ2hlY2tlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVmTGliRGlyQ2hlY2tlZAotCSAqICAgICAgICAgICAgVGhlIGRlZkxpYkRpckNoZWNrZWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZkxpYkRpckNoZWNrZWQoYm9vbGVhbiBkZWZMaWJEaXJDaGVja2VkKSB7Ci0JCXRoaXMuZGVmTGliRGlyQ2hlY2tlZCA9IGRlZkxpYkRpckNoZWNrZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZWZhdWx0TGliRGlyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdExpYkRpcigpIHsKLQkJcmV0dXJuIGRlZmF1bHRMaWJEaXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlZmF1bHRMaWJEaXIKLQkgKiAgICAgICAgICAgIFRoZSBkZWZhdWx0TGliRGlyIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TGliRGlyKFN0cmluZyBkZWZhdWx0TGliRGlyKSB7Ci0JCXRoaXMuZGVmYXVsdExpYkRpciA9IGRlZmF1bHRMaWJEaXI7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgcHJlZmVyZW5jZXMgZnJvbSB0aGUgc3RvcmUKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRGcm9tUHJlZmVyZW5jZVN0b3JlKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJU3RyaW5nIGxhc3REaXIgPSBzdG9yZQotCQkJCS5nZXRTdHJpbmcoTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MQVNUX0xJQlJBUllfUEFSRU5UX0RJUkVDVE9SWSk7Ci0JCXRoaXMuc2V0UGFyZW50Rm9sZGVyKGxhc3REaXIpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiBsYXN0X2Rpcj0gIiArIGxhc3REaXIpOwotCi0JCWJvb2xlYW4gbGFzdENoZWNrZWQgPSBzdG9yZQotCQkJCS5nZXRCb29sZWFuKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTEFTVF9ERUZBVUxUX0RJUkVDVE9SWV9DSEVDS0VEKTsKLQkJLy8gdGhlIGNvbnRhaW5zIG1ldGhvZCBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgc28gdXNlIGxhc3QgZGlyIGFzIGFuCi0JCS8vIGFwcHJveGltYXRpb24KLQkJLy8gaWYKLQkJLy8gKHN0b3JlLmNvbnRhaW5zKExpYmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MQVNUX0RFRkFVTFRfRElSRUNUT1JZX0NIRUNLRUQpKQotCQlpZiAobGFzdERpciA9PSBudWxsIHx8IGxhc3REaXIudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQl0aGlzLnNldERlZkxpYkRpckNoZWNrZWQodHJ1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMuc2V0RGVmTGliRGlyQ2hlY2tlZChsYXN0Q2hlY2tlZCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiREVCVUc6IGxhc3RfY2hlY2tlZCA9ICIgKyBsYXN0Q2hlY2tlZCk7Ci0KLQkJU3RyaW5nIGRlZkxpYlBQYXRoID0gc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9MSUJSQVJZX1BBUkVOVF9ESVJFQ1RPUlkpOwotCQlpZiAoZGVmTGliUFBhdGggPT0gbnVsbCB8fCBkZWZMaWJQUGF0aC5sZW5ndGgoKSA9PSAwKQotCQkJZGVmTGliUFBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpICsgLy8kTk9OLU5MUy0xJAotCQkJCQlGaWxlVXRpbC5GSUxFX1NFUCArIExpYnJhcnlVSVByZWZlcmVuY2VzLmdldEFwcGxpY2F0aW9uU2hvcnROYW1lKCkgKyAKLQkJCQkJRmlsZVV0aWwuRklMRV9TRVAgKyAiTWV0aG9kIExpYnJhcmllcyI7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5zZXREZWZhdWx0TGliRGlyKGRlZkxpYlBQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBkaWFsb2cgY2hvaWNlcyB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVRvUHJlZmVyZW5jZVN0b3JlKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMuZ2V0UGFyZW50Rm9sZGVyKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXRTYXZlZExpYnJhcnlQYXRoKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlzdG9yZS5zZXRWYWx1ZSgKLQkJCQlMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xBU1RfTElCUkFSWV9QQVJFTlRfRElSRUNUT1JZLAotCQkJCWZpbGUuZ2V0UGFyZW50KCkpOwotCQlzdG9yZS5zZXRWYWx1ZSgKLQkJCQlMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xBU1RfREVGQVVMVF9ESVJFQ1RPUllfQ0hFQ0tFRCwKLQkJCQl0aGlzLmlzRGVmTGliRGlyQ2hlY2tlZCgpKTsKLQotCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZlBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZlBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2I1MmUwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVByZWZQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiBMaWJyYXJ5IG9wdGlvbnMgcHJlZmVyZW5jZSBwYWdlCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVByZWZQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lciB7Ci0KLQlDb21wb3NpdGUgY29tcG9zaXRlX3RhYjsKLQotCVRleHQgY3RybF9saWJQYXJlbnRQYXRoOwotCi0JQnV0dG9uIGN0cmxfYnJvd3NlQnV0dG9uOwotCi0JU3RyaW5nIGRlZkxpYlBQYXRoID0gIi8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEJ1dHRvbiBiYWtDaGVja2JveDsKLQotCXByaXZhdGUgQnV0dG9uIGRpc2NhcmRVbnJlc29sdmVkUmVmQ2hlY2tCb3g7Ci0JCi0JVGV4dCBjdHJsX2RlZmF1bHRMaXN0TGVuZ3RoOwotCQotCXByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfTElTVF9MRU5HVEggPSAiMTAiOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gY29tcG9zaXRlX3RhYiA8PCBwYXJlbnQKLQkJY29tcG9zaXRlX3RhYiA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDMpOwotCi0JCS8vIGNyZWF0ZUxhYmVsKGNvbXBvc2l0ZV90YWIsICJDaG9vc2UgYSBsaWJyYXJ5IHNhdmUgb3B0aW9uOiIpOwotCQkvLwotCQkvLyByYWRpbyBidXR0b24gY29tcG9zaXRlIDw8IHRhYiBjb21wb3NpdGUKLQkJLy8gQ29tcG9zaXRlIGNvbXBvc2l0ZV9yYWRpb0J1dHRvbiA9IGNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGVfdGFiLCAxKTsKLQkJLy8gcmFkaW9CdXR0b24xID0gY3JlYXRlUmFkaW9CdXR0b24oY29tcG9zaXRlX3JhZGlvQnV0dG9uLCAiU2F2ZSBhcwotCQkvLyBtdWx0aXBsZSBmb2xkZXJzIik7Ci0JCS8vIHJhZGlvQnV0dG9uMiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGNvbXBvc2l0ZV9yYWRpb0J1dHRvbiwgIlNhdmUgYXMgYQotCQkvLyBzaW5nbGUgZmlsZSIpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZV90YWIsICIgIiwgMyk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYiwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0LCAzKTsgCi0KLQkJLy8gRGlyZWN0b3J5IFBhdGgKLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYiwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlyZWN0b3J5X3RleHQsIDEpOyAKLQotCQljdHJsX2xpYlBhcmVudFBhdGggPSBuZXcgVGV4dChjb21wb3NpdGVfdGFiLCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWN0cmxfbGliUGFyZW50UGF0aC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfbGliUGFyZW50UGF0aC5zZXRUZXh0KGRlZkxpYlBQYXRoKTsKLQotCQljdHJsX2Jyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlX3RhYiwgU1dULk5PTkUpOwotCQljdHJsX2Jyb3dzZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5CUk9XU0VfQlVUVE9OX1RFWFQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJY3RybF9icm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGVfdGFiLCAiICIsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGluZShjb21wb3NpdGVfdGFiLCAzKTsKLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYiwgIiAiLCAzKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBiYWNrdXAgYmVmb3JlIHNhdmUgY2hlY2sgYm94Ci0JCS8vCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZV90YWIsICIgIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJYmFrQ2hlY2tib3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZV90YWIsIFNXVC5DSEVDSyk7Ci0JCWJha0NoZWNrYm94LnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmFja3VwYmVmb3Jlc2F2ZV90ZXh0KTsgCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZV90YWIsICIgIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyAnZGlzY2FyZCB1bnJlc29sdmVkIHJlZmVyZW5jZXMnIGNoZWNrIGJveAotCQljcmVhdGVMYWJlbChjb21wb3NpdGVfdGFiLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWRpc2NhcmRVbnJlc29sdmVkUmVmQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZV90YWIsIFNXVC5DSEVDSyk7Ci0JCWRpc2NhcmRVbnJlc29sdmVkUmVmQ2hlY2tCb3guc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjYXJkdW5yZXNvbHZlZHJlZik7IAotCQljcmVhdGVMYWJlbChjb21wb3NpdGVfdGFiLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYiwgIiAiLCAzKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZV90YWIsIDMpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZV90YWJfc2l6ZSA9IGNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGVfdGFiLCAzKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuPTM7Ci0JCQljb21wb3NpdGVfdGFiX3NpemUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYl9zaXplLCBBdXRob3JpbmdVSVJlc291cmNlcy5kZWZhdWx0X2xpc3RfbGVuZ3RoX2xhYmVsLCAxKTsgCi0JCWN0cmxfZGVmYXVsdExpc3RMZW5ndGggPSBuZXcgVGV4dChjb21wb3NpdGVfdGFiX3NpemUsIFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQkJfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW49MjsKLQkJCWN0cmxfZGVmYXVsdExpc3RMZW5ndGguc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY3JlYXRlTGluZShjb21wb3NpdGVfdGFiLCAzKTsKLQotCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0KLQkJY3RybF9icm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3BlbkRpcmVjdG9yeURpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBmb250ID0gbnVsbDsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5EaXJlY3RvcnlEaWFsb2coKSB7Ci0JCXRyeSB7Ci0JCQlEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGNvbXBvc2l0ZV90YWIuZ2V0U2hlbGwoKSwKLQkJCQkJU1dULk5PTkUpOwotCi0JCQlTdHJpbmcgZGVzdGluYXRpb24gPSBkZC5vcGVuKCk7Ci0JCQlpZiAoZGVzdGluYXRpb24gIT0gbnVsbCkgewotCQkJCWN0cmxfbGliUGFyZW50UGF0aC5zZXRUZXh0KGRlc3RpbmF0aW9uKTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4pIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvLyBwcml2YXRlIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkvLyBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyB8IFNXVC5MRUZUKTsKLQkvLyBidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JLy8gYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCS8vIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkvLyBidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkvLyByZXR1cm4gYnV0dG9uOwotCS8vIH0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBuY29sKSB7Ci0JCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwKLQkJCQl8IFNXVC5CT0xEKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuY29sOwotCQlsaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0KLQkJcmV0dXJuIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvLyByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIHByZWZlcmVuY2UKLQkgKiBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJZGVmTGliUFBhdGggPSBzdG9yZQotCQkJCS5nZXREZWZhdWx0U3RyaW5nKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9MSUJSQVJZX1BBUkVOVF9ESVJFQ1RPUlkpOwotCQlpZiAoZGVmTGliUFBhdGggPT0gbnVsbCB8fCBkZWZMaWJQUGF0aC5sZW5ndGgoKSA9PSAwKQotCQkJZGVmTGliUFBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpICsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCUZpbGVVdGlsLkZJTEVfU0VQICsgTGlicmFyeVVJTWFuYWdlci5nZXRBcHBOYW1lKCkgKyAvLyROT04tTkxTLTEkCi0JCQkJCUZpbGVVdGlsLkZJTEVfU0VQICsgTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0QXBwbGljYXRpb25TaG9ydE5hbWUoKSArIAotCQkJCQlGaWxlVXRpbC5GSUxFX1NFUCArICJNZXRob2QgTGlicmFyaWVzIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiBkZWZhdWx0IGRlZkxpYlBQYXRoID0gIiArCi0JCS8vIGRlZkxpYlBQYXRoKTsKLQkJY3RybF9saWJQYXJlbnRQYXRoLnNldFRleHQoZGVmTGliUFBhdGgpOwotCi0JCS8vIHJhZGlvQnV0dG9uMS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkvLyByYWRpb0J1dHRvbjIuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJLy8gaW50IGNob2ljZSA9Ci0JCS8vIHN0b3JlLmdldERlZmF1bHRJbnQoTGliYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVfUkFESU9fU0FWRV9DSE9JQ0UpOwotCQkvLyBzd2l0Y2ggKGNob2ljZSkgewotCQkvLyBjYXNlIDE6Ci0JCS8vIHJhZGlvQnV0dG9uMS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIDI6Ci0JCS8vIHJhZGlvQnV0dG9uMi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCS8vIGJyZWFrOwotCQkvLyBkZWZhdWx0OgotCQkvLyByYWRpb0J1dHRvbjEuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkvLyBicmVhazsKLQkJLy8gfQotCi0JCWJha0NoZWNrYm94Ci0JCQkJLnNldFNlbGVjdGlvbihzdG9yZQotCQkJCQkJLmdldERlZmF1bHRCb29sZWFuKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQkFDS19VUF9CRUZPUkVfU0FWRSkpOwotCQlkaXNjYXJkVW5yZXNvbHZlZFJlZkNoZWNrQm94Ci0JCQkJLnNldFNlbGVjdGlvbihzdG9yZQotCQkJCQkJLmdldERlZmF1bHRCb29sZWFuKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpKTsKLQkJCi0JCVN0cmluZyBsaXN0TGVuZ3RoID0gc3RvcmUKLQkJLmdldFN0cmluZyhMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfSElTVE9SWV9TSVpFKTsKLQkJaWYobGlzdExlbmd0aD09bnVsbCB8fCBsaXN0TGVuZ3RoLmxlbmd0aCgpPD0wKQotCQkJbGlzdExlbmd0aCA9IERFRkFVTFRfTElTVF9MRU5HVEg7Ci0JCQotCQljdHJsX2RlZmF1bHRMaXN0TGVuZ3RoLnNldFRleHQobGlzdExlbmd0aCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0RpZ2l0U3RyKFN0cmluZyBzdHIpewotCSAgICAgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJbMC05XSsiKTsgCi0JICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIoKENoYXJTZXF1ZW5jZSlzdHIpOyAKLQkgICAgIHJldHVybiBtYXRjaGVyLm1hdGNoZXMoKTsgCi0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJZGVmTGliUFBhdGggPSBzdG9yZQotCQkJCS5nZXRTdHJpbmcoTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0xJQlJBUllfUEFSRU5UX0RJUkVDVE9SWSk7Ci0JCWlmIChkZWZMaWJQUGF0aCA9PSBudWxsIHx8IGRlZkxpYlBQYXRoLmxlbmd0aCgpID09IDApCi0JCQlkZWZMaWJQUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikgKyAvLyROT04tTkxTLTEkCi0vLwkJCQkJRmlsZVV0aWwuRklMRV9TRVAgKyBMaWJyYXJ5VUlNYW5hZ2VyLmdldEFwcE5hbWUoKSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJRmlsZVV0aWwuRklMRV9TRVAgKyBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpICsgCi0JCQkJCUZpbGVVdGlsLkZJTEVfU0VQICsgIk1ldGhvZCBMaWJyYXJpZXMiOyAvLyROT04tTkxTLTEkIAotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiByZWFkIGRlZkxpYlBQYXRoID0gIiArIGRlZkxpYlBQYXRoKTsKLQkJY3RybF9saWJQYXJlbnRQYXRoLnNldFRleHQoZGVmTGliUFBhdGgpOwotCi0JCS8vIGludCBjaG9pY2UgPQotCQkvLyBzdG9yZS5nZXRJbnQoTGliYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVfUkFESU9fU0FWRV9DSE9JQ0UpOwotCQkvLyBzd2l0Y2ggKGNob2ljZSkgewotCQkvLyBjYXNlIDE6Ci0JCS8vIHJhZGlvQnV0dG9uMS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIDI6Ci0JCS8vIHJhZGlvQnV0dG9uMi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCS8vIGJyZWFrOwotCQkvLyBkZWZhdWx0OgotCQkvLyByYWRpb0J1dHRvbjEuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkvLyBicmVhazsKLQkJLy8gfQotCi0JCWJha0NoZWNrYm94Ci0JCQkJLnNldFNlbGVjdGlvbihzdG9yZQotCQkJCQkJLmdldEJvb2xlYW4oTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9CQUNLX1VQX0JFRk9SRV9TQVZFKSk7Ci0JCWRpc2NhcmRVbnJlc29sdmVkUmVmQ2hlY2tCb3gKLQkJCQkuc2V0U2VsZWN0aW9uKHN0b3JlCi0JCQkJCQkuZ2V0Qm9vbGVhbihMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTKSk7Ci0JCQotCQlTdHJpbmcgbGlzdExlbmd0aCA9IHN0b3JlCi0JCS5nZXRTdHJpbmcoTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0hJU1RPUllfU0laRSk7Ci0JCWlmKGxpc3RMZW5ndGg9PW51bGwgfHwgbGlzdExlbmd0aC5sZW5ndGgoKTw9MCkKLQkJCWxpc3RMZW5ndGggPSBERUZBVUxUX0xJU1RfTEVOR1RIOwotCQljdHJsX2RlZmF1bHRMaXN0TGVuZ3RoLnNldFRleHQobGlzdExlbmd0aCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWluaXRpYWxpemVEZWZhdWx0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXN0b3JlVmFsdWVzKCk7Ci0JCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlkZWZMaWJQUGF0aCA9IGN0cmxfbGliUGFyZW50UGF0aC5nZXRUZXh0KCkudHJpbSgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiBkZWZMaWJQUGF0aCA9ICIgKyBkZWZMaWJQUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcmUKLQkJCQkuc2V0VmFsdWUoCi0JCQkJCQlMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfTElCUkFSWV9QQVJFTlRfRElSRUNUT1JZLAotCQkJCQkJZGVmTGliUFBhdGgpOwotCQkvLyBpbnQgY2hvaWNlID0gMTsKLQkJLy8gaWYgKHJhZGlvQnV0dG9uMi5nZXRTZWxlY3Rpb24oKSkKLQkJLy8gY2hvaWNlID0gMjsKLQkJLy8KLQkJLy8gc3RvcmUuc2V0VmFsdWUoTGliYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVfUkFESU9fU0FWRV9DSE9JQ0UsCi0JCS8vIGNob2ljZSk7Ci0KLQkJc3RvcmUuc2V0VmFsdWUoTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9CQUNLX1VQX0JFRk9SRV9TQVZFLAotCQkJCWJha0NoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLQkJc3RvcmUuc2V0VmFsdWUoCi0JCQkJTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUywKLQkJCQlkaXNjYXJkVW5yZXNvbHZlZFJlZkNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCi0JCVN0cmluZyBsaXN0TGVuZ3RoID0gY3RybF9kZWZhdWx0TGlzdExlbmd0aC5nZXRUZXh0KCk7Ci0JCWlmKCFpc0RpZ2l0U3RyKGxpc3RMZW5ndGgpKQotCQkJbGlzdExlbmd0aCA9IERFRkFVTFRfTElTVF9MRU5HVEg7Ci0JCWVsc2V7Ci0JCQlpZihJbnRlZ2VyLnBhcnNlSW50KGxpc3RMZW5ndGgpPD0wKQotCQkJCWxpc3RMZW5ndGggPSBERUZBVUxUX0xJU1RfTEVOR1RIOwotCQl9Ci0JCXN0b3JlLnNldFZhbHVlKAotCQkJCUxpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9ISVNUT1JZX1NJWkUsIGxpc3RMZW5ndGgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lciNtb2RpZnlUZXh0KG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyM2YxYzI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VDb25zdGFudHM7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBDb25zdGFudHMgZm9yIGxpYnJhcnkKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzIGV4dGVuZHMgUHJlZmVyZW5jZUNvbnN0YW50cyB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTU2NzliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0KLS8qKgotICogSW5pdGlhbGl6ZXIgZm9yIGxpYnJhcnkgcHJlZmVyZW5jZXMKLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5UHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJLy8gVGhlc2Ugc2V0dGluZ3Mgd2lsbCBzaG93IHVwIHdoZW4gdGhlIExpYnJhcnkgcHJlZmVyZW5jZSBwYWdlCi0JCS8vIGlzIHNob3duIGZvciB0aGUgZmlyc3QgdGltZS4KLQotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCS8vIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPQotCQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlzdG9yZS5zZXREZWZhdWx0KExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUkFESU9fU0FWRV9DSE9JQ0UsIDEpOwotCQlzdG9yZS5zZXREZWZhdWx0KExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQkFDS19VUF9CRUZPUkVfU0FWRSwKLQkJCQlmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTW9kZWxpbmdPcHRpb25zUHJlZlBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Nb2RlbGluZ09wdGlvbnNQcmVmUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWM0ZDc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Nb2RlbGluZ09wdGlvbnNQcmVmUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBtb2RlbGluZyBvcHRpb25zCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsaW5nT3B0aW9uc1ByZWZQYWdlIGV4dGVuZHMgQ29tbW9uUHJlZlBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JaW50IE5VTV9DT0xVTU4gPSAxOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlX3RhYjsKLQotCXByaXZhdGUgQnV0dG9uIGV4dGVuZFNlbWFudGljc0NoZWNrOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gY29tcG9zaXRlX3RhYiA8PCBwYXJlbnQKLQkJY29tcG9zaXRlX3RhYiA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIE5VTV9DT0xVTU4pOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZV90YWIsICIgIiwgTlVNX0NPTFVNTik7IC8vJE5PTi1OTFMtMSQKLQotCQlleHRlbmRTZW1hbnRpY3NDaGVjayA9IG5ldyBCdXR0b24oY29tcG9zaXRlX3RhYiwgU1dULkNIRUNLKTsKLQkJZXh0ZW5kU2VtYW50aWNzQ2hlY2suc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRfc2VtYW50aWNzX2J1dHRvbl90ZXh0KTsKLQotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlX3RhYiwgU1dULkxFRlR8IFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRfc2VtYW50aWNzX3RleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYiwgIiAiLCBOVU1fQ09MVU1OKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZV90YWIsIE5VTV9DT0xVTU4pOwotCi0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlX3RhYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyB0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3RvcmVWYWx1ZXMoKTsKLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkNvbW1vblByZWZQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQotCQlyZXR1cm4gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlib29sZWFuIHZhbHVlID0gZXh0ZW5kU2VtYW50aWNzQ2hlY2suZ2V0U2VsZWN0aW9uKCk7Ci0JCXN0b3JlLnNldFZhbHVlKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRVhURU5EX1NFTUFOVElDU19DSEVDSywKLQkJCQl2YWx1ZSk7Ci0JCQotCQkvLyBzZXQgdGhpcyBhcyB3ZWxsCi0JCUVsZW1lbnRSZWFsaXplci5zZXRJZ25vcmVCYXNlVG9NYW55QXNzb2NpYXRpb25zKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHVzaW5nIGRlZmF1bHQgdmFsdWVzIGluIHRoZSBwcmVmZXJlbmNlCi0JICogc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCWV4dGVuZFNlbWFudGljc0NoZWNrCi0JCQkJLnNldFNlbGVjdGlvbihzdG9yZQotCQkJCQkJLmdldERlZmF1bHRCb29sZWFuKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRVhURU5EX1NFTUFOVElDU19DSEVDSykpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlleHRlbmRTZW1hbnRpY3NDaGVjawotCQkJCS5zZXRTZWxlY3Rpb24oc3RvcmUKLQkJCQkJCS5nZXRCb29sZWFuKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRVhURU5EX1NFTUFOVElDU19DSEVDSykpOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmNGEyZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL1Byb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIFByb2Nlc3NFZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lciB7Ci0KLQkvLyBwcml2YXRlIFRleHQgbGluZVdpZHRoVGV4dDsKLQkvLyBwcml2YXRlIEJ1dHRvbiBpbmRlbnRDaGVja2JveDsKLQkvLyBwcml2YXRlIFRleHQgaW5kZW50U2l6ZVRleHQ7Ci0JLy8gcHJpdmF0ZSBDb21ibyBic0NvbWJvOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXQlNfVFhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQlNfVFhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbjsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1BCU19UWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U7IAotCi0JcHJpdmF0ZSBMaXN0Vmlld2VyIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcjsKLQotCS8vIHByaXZhdGUgTGlzdFZpZXdlciB0YnNTZWxlY3RlZENvbExpc3Q7Ci0JLy8gcHJpdmF0ZSBMaXN0Vmlld2VyIHdwYnNTZWxlY3RlZENvbExpc3Q7Ci0JcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCB3YnNDb2x1bW5EZXNjcmlwdG9yczsKLQotCXByaXZhdGUgamF2YS51dGlsLkxpc3QgdGJzQ29sdW1uRGVzY3JpcHRvcnM7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5MaXN0IHdwYnNDb2x1bW5EZXNjcmlwdG9yczsKLQotCXByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGRvd25CdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiB1cEJ1dHRvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJTX05BTUVTID0gbmV3IFN0cmluZ1tdIHsgV0JTX1RYVCwgVEJTX1RYVCwKLQkJCVdQQlNfVFhUIH07Ci0KLQlwcml2YXRlIExpc3RbXSBjb2x1bW5EZXNjcmlwdG9yTGlzdHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0W10gQUxMX0NPTFVNTl9ERVNDUklQVE9SX0xJU1RTID0gbmV3IExpc3RbXSB7Ci0JCQlQcm9jZXNzRWRpdG9yLkFMTF9XQlNfQ09MVU1OUywgUHJvY2Vzc0VkaXRvci5BTExfVEJTX0NPTFVNTlMsCi0JCQlQcm9jZXNzRWRpdG9yLkFMTF9XUEJTX0NPTFVNTlMgfTsKLQotCS8vIGNvbmZpZ3VyYXRpb24gc3dpdGNoaW5nIHByZWZlcmVuY2UKLQlwcml2YXRlIEJ1dHRvbiBjb25maWdTd2l0Y2hBbHdheXNCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb25maWdTd2l0Y2hOZXZlckJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGNvbmZpZ1N3aXRjaFByb21wdEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGluaGVyaXRTdXBwcmVzc2lvbkJ1dHRvbjsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbHVtbkRlc2NyaXB0b3JQcm92aWRlciBpbXBsZW1lbnRzCi0JCQlJVHJlZUNvbnRlbnRQcm92aWRlciwgSUxhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBDb2x1bW5EZXNjcmlwdG9yUHJvdmlkZXIoKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChqYXZhLnV0aWwuTGlzdCkgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChDb2x1bW5EZXNjcmlwdG9yKSBlbGVtZW50KS5sYWJlbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdERhdGEoKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbHVtbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb2x1bW5zQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQljb2x1bW5zQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbHVtbnNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jb2x1bW5zZWxlY3Rpb25fdGV4dCk7IAotCi0JCWZpbmFsIENvbWJvIGJzQ29tYm8gPSBuZXcgQ29tYm8oY29sdW1uc0NvbXBvc2l0ZSwgU1dULlJFQURfT05MWQotCQkJCXwgU1dULkJPUkRFUik7Ci0JCWJzQ29tYm8uc2V0SXRlbXMoQlNfTkFNRVMpOwotCQlic0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBlLmdldFNvdXJjZSgpOwotCQkJCWludCBpZCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJaWYgKGlkICE9IC0xKSB7Ci0JCQkJCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcgotCQkJCQkJCS5zZXRJbnB1dChjb2x1bW5EZXNjcmlwdG9yTGlzdHNbaWRdKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQkJCX0KLQotCQl9KTsKLQkJYnNDb21iby5zZWxlY3QoMCk7Ci0KLQkJLy8gQ1RhYkZvbGRlciB0YWJGb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcihjb2x1bW5zQ29tcG9zaXRlLCBTV1QuVE9QIHwKLQkJLy8gU1dULkJPUkRFUik7Ci0JCUNvbXBvc2l0ZSBsaXN0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGlzdENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJbGlzdENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihsaXN0Q29tcG9zaXRlLCBTV1QuTVVMVEkKLQkJCQl8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlmaW5hbCBDb2x1bW5EZXNjcmlwdG9yUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gbmV3IENvbHVtbkRlc2NyaXB0b3JQcm92aWRlcigpOwotCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGl0ZW1Qcm92aWRlcik7Ci0JCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGl0ZW1Qcm92aWRlcik7Ci0JCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5zZXRJbnB1dCh3YnNDb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKXsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0IHJlbW92ZUxpc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkudG9MaXN0KCk7Ci0JCQkJaWYgKHJlbW92ZUxpc3QuY29udGFpbnMoUHJvY2Vzc0VkaXRvci5DT0xfREVTQ19JRCkKLQkJCQkJCXx8IHJlbW92ZUxpc3QKLQkJCQkJCQkJLmNvbnRhaW5zKFByb2Nlc3NFZGl0b3IuQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUpKSB7Ci0JCQkJCS8vIGlmIHByZXNlbnQgbmFtZSBvciBpZCBzZWxlY3RlZCwgCi0JCQkJCS8vIGRpc2FibGUgInJlbW92ZSIsInVwIiBhbmQgImRvd24iIGJ1dHRvbgotCQkJCQkvLwotCQkJCQlpZihyZW1vdmVCdXR0b24uaXNFbmFibGVkKCkpIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJaWYodXBCdXR0b24uaXNFbmFibGVkKCkpIHVwQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlpZihkb3duQnV0dG9uLmlzRW5hYmxlZCgpKSBkb3duQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmKCFyZW1vdmVCdXR0b24uaXNFbmFibGVkKCkpIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQlpZighdXBCdXR0b24uaXNFbmFibGVkKCkpIHVwQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWlmKCFkb3duQnV0dG9uLmlzRW5hYmxlZCgpKSBkb3duQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0pOwotCi0JCS8vIHdic1NlbGVjdGVkQ29sdW1uc1RhYmxlLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7Ci0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfSUQsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLAotCQkvLyB9KTsKLQotCQkvLyBDVGFiSXRlbSB0YWJJdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkvLyB0YWJJdGVtLnNldFRleHQoIldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSIpOwotCQkvLyB0YWJJdGVtLnNldENvbnRyb2wod2JzU2VsZWN0ZWRDb2x1bW5zVGFibGUuZ2V0Q29udHJvbCgpKTsKLQotCQkvLyB0YnNTZWxlY3RlZENvbExpc3QgPSBuZXcgTGlzdFZpZXdlcihjb2x1bW5zQ29tcG9zaXRlLCBTV1QuQ0hFQ0sgfAotCQkvLyBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJLy8gdGJzU2VsZWN0ZWRDb2xMaXN0LnNldENvbnRlbnRQcm92aWRlcihpdGVtUHJvdmlkZXIpOwotCQkvLyB0YnNTZWxlY3RlZENvbExpc3Quc2V0TGFiZWxQcm92aWRlcihpdGVtUHJvdmlkZXIpOwotCQkvLyB0YnNTZWxlY3RlZENvbExpc3Quc2V0SW5wdXQodGJzQ29sdW1uRGVzY3JpcHRvcnMpOwotCQkvLyB0YnNTZWxlY3RlZENvbExpc3Quc2V0SXRlbXMobmV3IFN0cmluZ1tdIHsKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUsCi0JCS8vIH0pOwotCQkvLyB0YWJJdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkvLyB0YWJJdGVtLnNldFRleHQoIlRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSIpOwotCQkvLyB0YWJJdGVtLnNldENvbnRyb2wodGJzU2VsZWN0ZWRDb2xMaXN0LmdldENvbnRyb2woKSk7Ci0KLQkJLy8gd3Bic1NlbGVjdGVkQ29sTGlzdCA9IG5ldyBMaXN0Vmlld2VyKGNvbHVtbnNDb21wb3NpdGUsIFNXVC5DSEVDSyB8Ci0JCS8vIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQkvLyB3cGJzU2VsZWN0ZWRDb2xMaXN0LnNldENvbnRlbnRQcm92aWRlcihpdGVtUHJvdmlkZXIpOwotCQkvLyB3cGJzU2VsZWN0ZWRDb2xMaXN0LnNldExhYmVsUHJvdmlkZXIoaXRlbVByb3ZpZGVyKTsKLQkJLy8gd3Bic1NlbGVjdGVkQ29sTGlzdC5zZXRJbnB1dCh3cGJzQ29sdW1uRGVzY3JpcHRvcnMpOwotCQkvLyB0YWJJdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkvLyB0YWJJdGVtLnNldFRleHQoIldvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlIik7Ci0JCS8vIHRhYkl0ZW0uc2V0Q29udHJvbCh3cGJzU2VsZWN0ZWRDb2xMaXN0LmdldENvbnRyb2woKSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGxpc3RDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCS8vIGxheW91dC5tYXJnaW5MZWZ0ID0gNDsKLQkJLy8gbGF5b3V0Lm1hcmdpblJpZ2h0ID0gNDsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gODA7Ci0JCWJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCi0JCWFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhZGRCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuQUREX0JVVFRPTl9URVhUKTsKLQkJYWRkQnV0dG9uLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpbnQgaWQgPSBic0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJT2JqZWN0IGlucHV0ID0gQUxMX0NPTFVNTl9ERVNDUklQVE9SX0xJU1RTW2lkXTsKLQkJCQlmaW5hbCBMaXN0IHNlbGVjdGVkQ29sdW1ucyA9IGNvbHVtbkRlc2NyaXB0b3JMaXN0c1tpZF07Ci0JCQkJTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgTGlzdFNlbGVjdGlvbkRpYWxvZygKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQlpbnB1dCwKLQkJCQkJCWl0ZW1Qcm92aWRlciwKLQkJCQkJCWl0ZW1Qcm92aWRlciwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNlbGVjdENvbHVtbnN0b0FkZF90ZXh0KSB7IAotCQkJCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQkJCUNvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJCQkJCWdldFZpZXdlcigpLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkgewotCi0JCQkJCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsCi0JCQkJCQkJCQlPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJCQkJcmV0dXJuICFzZWxlY3RlZENvbHVtbnMuY29udGFpbnMoZWxlbWVudCk7Ci0JCQkJCQkJfQotCi0JCQkJCQl9KTsKLQkJCQkJCXJldHVybiBjb250cm9sOwotCQkJCQl9Ci0KLQkJCQl9OwotCQkJCWlmIChkbGcub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCQlzZWxlY3RlZENvbHVtbnMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZGxnLmdldFJlc3VsdCgpKSk7Ci0JCQkJCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0pOwotCi0JCXJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlyZW1vdmVCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5yZW1vdmVCdXR0b25fdGV4dCk7IAotCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJamF2YS51dGlsLkxpc3QgY29sdW1ucyA9IChqYXZhLnV0aWwuTGlzdCkgc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyCi0JCQkJCQkuZ2V0SW5wdXQoKTsKLQkJCQlMaXN0IHJlbW92ZUxpc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkudG9MaXN0KCk7Ci0JCQkJaWYgKHJlbW92ZUxpc3QuY29udGFpbnMoUHJvY2Vzc0VkaXRvci5DT0xfREVTQ19JRCkKLQkJCQkJCXx8IHJlbW92ZUxpc3QKLQkJCQkJCQkJLmNvbnRhaW5zKFByb2Nlc3NFZGl0b3IuQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUpKSB7Ci0JCQkJCS8vIGNhbm5vdCByZW1vdmUgbmFtZSBvciBJRCBjb2x1bW4KLQkJCQkJLy8KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQljb2x1bW5zLnJlbW92ZUFsbChyZW1vdmVMaXN0KTsKLQkJCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCi0JCX0pOwotCi0JCXVwQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXVwQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlVQX0JVVFRPTl9URVhUKTsKLQkJdXBCdXR0b24uc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJdXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkKLQkJCQkJcmV0dXJuOwotCQkJCUVMaXN0IGNvbHVtbnMgPSAoRUxpc3QpIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5nZXRJbnB1dCgpOwotCQkJCU9iamVjdCBzZWxlY3RlZCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpbnQgaWQgPSBjb2x1bW5zLmluZGV4T2Yoc2VsZWN0ZWQpOwotCQkJCWlmIChic0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCAmJiBpZCA8IDMpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoYnNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCAmJiBpZCA8IDIpCi0JCQkJCXJldHVybjsKLQkJCQljb2x1bW5zLm1vdmUoaWQgLSAxLCBpZCk7Ci0JCQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJc2VsZWN0ZWQpLCB0cnVlKTsKLQkJCX0KLQotCQl9KTsKLQotCQlkb3duQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRvd25CdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuRE9XTl9CVVRUT05fVEVYVCk7Ci0JCWRvd25CdXR0b24uc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJZG93bkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKQotCQkJCQlyZXR1cm47Ci0JCQkJRUxpc3QgY29sdW1ucyA9IChFTGlzdCkgc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLmdldElucHV0KCk7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWludCBpZCA9IGNvbHVtbnMuaW5kZXhPZihzZWxlY3RlZCk7Ci0JCQkJCi0JCQkJaWYgKGlkID09IGNvbHVtbnMuc2l6ZSgpIC0gMSB8fCAoYnNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IDAgJiYgaWQgPCAyKSkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChpZCA9PSBjb2x1bW5zLnNpemUoKSAtIDEgfHwgKGJzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAgJiYgaWQgPCAxKSkKLQkJCQkJcmV0dXJuOwotCQkJCWNvbHVtbnMubW92ZShpZCArIDEsIGlkKTsKLQkJCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQlzZWxlY3RlZCksIHRydWUpOwotCQkJfQotCi0JCX0pOwotCi0JCUdyb3VwIGNvbmZpZ1N3aXRjaEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULlNIQURPV19PVVQpOwotCQljb25maWdTd2l0Y2hHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJY29uZmlnU3dpdGNoR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNvbmZpZ1N3aXRjaEdyb3VwCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N3aXRjaENvbmZpZ3VyYXRpb24pOyAKLQotCQljb25maWdTd2l0Y2hBbHdheXNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbmZpZ1N3aXRjaEdyb3VwLCBTV1QuUkFESU8pOwotCQljb25maWdTd2l0Y2hBbHdheXNCdXR0b24uc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMuYWx3YXlzQnV0dG9uX3RleHQpOwotCQljb25maWdTd2l0Y2hOZXZlckJ1dHRvbiA9IG5ldyBCdXR0b24oY29uZmlnU3dpdGNoR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNvbmZpZ1N3aXRjaE5ldmVyQnV0dG9uLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLm5ldmVyQnV0dG9uX3RleHQpOwotCQljb25maWdTd2l0Y2hQcm9tcHRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbmZpZ1N3aXRjaEdyb3VwLCBTV1QuUkFESU8pOwotCQljb25maWdTd2l0Y2hQcm9tcHRCdXR0b24uc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMucHJvbXB0QnV0dG9uX3RleHQpOwotCi0JCXNldFN3aXRjaENvbmZpZ0J1dHRvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRTd2l0Y2hDb25maWcoKSk7Ci0KLQkJLy8gaW5oZXJpdCBzdXBwcmVzc2lvbiBzdGF0ZXMKLQkJR3JvdXAgc3VwcHJlc3Npb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5TSEFET1dfT1VUKTsKLQkJc3VwcHJlc3Npb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXN1cHByZXNzaW9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXN1cHByZXNzaW9uR3JvdXAKLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3VwcHJlc3Npb25Hcm91cFRpdGxlKTsgCi0KLQkJaW5oZXJpdFN1cHByZXNzaW9uQnV0dG9uID0gbmV3IEJ1dHRvbihzdXBwcmVzc2lvbkdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbmhlcml0U3VwcHJlc3Npb25CdXR0b24KLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGUpOyAKLQotCQlpbmhlcml0U3VwcHJlc3Npb25CdXR0b24uc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oCi0JCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSkpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGRhdGEgZnJvbSBwcmVmZXJlbmNlIHN0b3JlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXREYXRhKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJU3RyaW5nIHN0ciA9IHN0b3JlCi0JCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUyk7Ci0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJc3RyID0gc3RvcmUKLQkJCQkJLmdldERlZmF1bHRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpOwotCQl9Ci0JCXdic0NvbHVtbkRlc2NyaXB0b3JzID0gUHJvY2Vzc0VkaXRvci50b0NvbHVtbkRlc2NyaXB0b3JMaXN0KHN0cik7Ci0KLQkJc3RyID0gc3RvcmUuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TKTsKLQkJaWYgKHN0ciA9PSBudWxsKSB7Ci0JCQlzdHIgPSBzdG9yZQotCQkJCQkuZ2V0RGVmYXVsdFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUyk7Ci0JCX0KLQkJdGJzQ29sdW1uRGVzY3JpcHRvcnMgPSBQcm9jZXNzRWRpdG9yLnRvQ29sdW1uRGVzY3JpcHRvckxpc3Qoc3RyKTsKLQotCQlzdHIgPSBzdG9yZS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TKTsKLQkJaWYgKHN0ciA9PSBudWxsKSB7Ci0JCQlzdHIgPSBzdG9yZQotCQkJCQkuZ2V0RGVmYXVsdFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMpOwotCQl9Ci0JCXdwYnNDb2x1bW5EZXNjcmlwdG9ycyA9IFByb2Nlc3NFZGl0b3IudG9Db2x1bW5EZXNjcmlwdG9yTGlzdChzdHIpOwotCi0JCS8vIGxvYWQgYW5kIHNldCB0byB0aGUgZGVmYXVsdCBpZiBub3RoaW5nIGluIHRoZSBzdG9yZQotCQkvLyAxNTQ3NTggLSBQcm9jZXNzZXM6IFdCUyBpcyBibGFuayBhcyBkZWZhdWx0IHByZWZlcmVuY2UgaXMgbm90IHNldCBmb3IgdGhlIGZpcnN0IHRpbWUKLQkJaWYgKCB3YnNDb2x1bW5EZXNjcmlwdG9ycy5zaXplKCkgPT0gMCApIHsKLQkJCXdic0NvbHVtbkRlc2NyaXB0b3JzLmFkZEFsbChQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV0JTX0NPTFVNTlMpOwotCQkJc3RvcmUuc2V0VmFsdWUoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMsCi0JCQkJCXRvU3RyaW5nKHdic0NvbHVtbkRlc2NyaXB0b3JzKSk7Ci0JCQotCQl9Ci0JCQotCQlpZiAoIHRic0NvbHVtbkRlc2NyaXB0b3JzLnNpemUoKSA9PSAwICkgewotCQkJdGJzQ29sdW1uRGVzY3JpcHRvcnMuYWRkQWxsKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9UQlNfQ09MVU1OUyk7Ci0JCQlzdG9yZS5zZXRWYWx1ZShBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUywKLQkJCQkJdG9TdHJpbmcodGJzQ29sdW1uRGVzY3JpcHRvcnMpKTsKLQkJfQotCQkKLQkJaWYgKCB3cGJzQ29sdW1uRGVzY3JpcHRvcnMuc2l6ZSgpID09IDAgKSB7Ci0JCQl3cGJzQ29sdW1uRGVzY3JpcHRvcnMuYWRkQWxsKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9XUEJTX0NPTFVNTlMpOwotCQkJc3RvcmUuc2V0VmFsdWUoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TLAotCQkJCQl0b1N0cmluZyh3cGJzQ29sdW1uRGVzY3JpcHRvcnMpKTsKLQkJfQotCQkKLQkJY29sdW1uRGVzY3JpcHRvckxpc3RzID0gbmV3IExpc3RbXSB7IHdic0NvbHVtbkRlc2NyaXB0b3JzLAotCQkJCXRic0NvbHVtbkRlc2NyaXB0b3JzLCB3cGJzQ29sdW1uRGVzY3JpcHRvcnMgfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UucGVyZm9ybURlZmF1bHRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQotCQl3YnNDb2x1bW5EZXNjcmlwdG9ycy5jbGVhcigpOwotCQl3YnNDb2x1bW5EZXNjcmlwdG9ycy5hZGRBbGwoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1dCU19DT0xVTU5TKTsKLQotCQl0YnNDb2x1bW5EZXNjcmlwdG9ycy5jbGVhcigpOwotCQl0YnNDb2x1bW5EZXNjcmlwdG9ycy5hZGRBbGwoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1RCU19DT0xVTU5TKTsKLQotCQl3cGJzQ29sdW1uRGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJd3Bic0NvbHVtbkRlc2NyaXB0b3JzLmFkZEFsbChQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV1BCU19DT0xVTU5TKTsKLQotCQlpbmhlcml0U3VwcHJlc3Npb25CdXR0b24KLQkJCQkuc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkuZ2V0RGVmYXVsdEJvb2xlYW4oCi0JCQkJCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUpKTsKLQotCQlzZXRTd2l0Y2hDb25maWdCdXR0b24oTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlzdG9yZS5zZXRWYWx1ZShBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUywKLQkJCQl0b1N0cmluZyh3YnNDb2x1bW5EZXNjcmlwdG9ycykpOwotCQlzdG9yZS5zZXRWYWx1ZShBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUywKLQkJCQl0b1N0cmluZyh0YnNDb2x1bW5EZXNjcmlwdG9ycykpOwotCQlzdG9yZS5zZXRWYWx1ZShBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMsCi0JCQkJdG9TdHJpbmcod3Bic0NvbHVtbkRlc2NyaXB0b3JzKSk7Ci0JCXN0b3JlLnNldFZhbHVlKAotCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUsCi0JCQkJaW5oZXJpdFN1cHByZXNzaW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJLy8gc3dpdGNoIGNvbmZpZyBwcmVmZXJlbmNlIGlzIGluIGxpYnJhcnkudWkKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0U3dpdGNoQ29uZmlnKGdldFN3aXRjaENvbmZpZ1ZhbHVlKCkpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGdpdmVuIGxpc3QgaW50byBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcGFyYW0gY29sdW1uRGVzY3JpcHRvcnMKLQkgKiBAcmV0dXJuIAotCSAqIAkJCVN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gbGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGphdmEudXRpbC5MaXN0IGNvbHVtbkRlc2NyaXB0b3JzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBtYXggPSBjb2x1bW5EZXNjcmlwdG9ycy5zaXplKCkgLSAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKCgoQ29sdW1uRGVzY3JpcHRvcikgY29sdW1uRGVzY3JpcHRvcnMuZ2V0KGkpKS5pZCkKLQkJCQkJLmFwcGVuZCgnLCcpOwotCQl9Ci0JCXN0ckJ1Zi5hcHBlbmQoKChDb2x1bW5EZXNjcmlwdG9yKSBjb2x1bW5EZXNjcmlwdG9ycy5nZXQobWF4KSkuaWQpOwotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQoTW9kaWZ5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3dpdGNoQ29uZmlnVmFsdWUoKSB7Ci0JCWlmIChjb25maWdTd2l0Y2hBbHdheXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0JCQlyZXR1cm4gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuQUxXQVlTOwotCQlpZiAoY29uZmlnU3dpdGNoTmV2ZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0JCQlyZXR1cm4gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuTkVWRVI7Ci0JCWlmIChjb25maWdTd2l0Y2hQcm9tcHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0JCQlyZXR1cm4gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUOwotCi0JCS8vIHJldHVybiBQcm9tcHQgdmFsdWUgYXMgYSBkZWZhdWx0Ci0JCXJldHVybiBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFN3aXRjaENvbmZpZ0J1dHRvbihTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLkFMV0FZUy5lcXVhbHModmFsdWUpKSB7Ci0JCQljb25maWdTd2l0Y2hBbHdheXNCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJY29uZmlnU3dpdGNoTmV2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWNvbmZpZ1N3aXRjaFByb21wdEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9IGVsc2UgaWYgKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLk5FVkVSLmVxdWFscyh2YWx1ZSkpIHsKLQkJCWNvbmZpZ1N3aXRjaEFsd2F5c0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJY29uZmlnU3dpdGNoTmV2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJY29uZmlnU3dpdGNoUHJvbXB0QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0gZWxzZSB7IC8vIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVAotCQkJY29uZmlnU3dpdGNoQWx3YXlzQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQljb25maWdTd2l0Y2hOZXZlckJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJY29uZmlnU3dpdGNoUHJvbXB0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCQotCQkvLyBjaGFuZ2UgdG8gdXNlIExpYnJhcnlQbHVnaW4gc3RvcmUKLQkJLy8gd2UgbmVlZCB0byBzaGFyZSB0aGUgcHJlZmVyZW5jZSBpbiBMaWJyYXJ5IGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nCi0JCS8vIEppbmh1YSBYaSAwOC8xOS8yMDA2Ci0JCXJldHVybiBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUm9vdFByZWZQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUm9vdFByZWZQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1Njk5OTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL1Jvb3RQcmVmUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiBSb290IHByZWZlcmVuY2UgcGFnZQotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvb3RQcmVmUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbXBvc2l0ZV90YWI7Ci0KLQkvLyBwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0JLy8gRGlzYWJsZWluZyBlbmFibGUgcHJvY2VzcyBjb250cmlidXRpb24gcHJlZmVyZW5jZSBmb3Igbm93LgotCS8vIHByaXZhdGUgQnV0dG9uIGVuYWJsZVByb2Nlc3NDb250cmlidXRpb247Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBjb21wb3NpdGVfdGFiIDw8IHBhcmVudAotCQljb21wb3NpdGVfdGFiID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMyk7Ci0KLQkJLy8gZW5hYmxlUHJvY2Vzc0NvbnRyaWJ1dGlvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlX3RhYiwgU1dULkNIRUNLKTsKLQkJLy8gZW5hYmxlUHJvY2Vzc0NvbnRyaWJ1dGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdldFN0cmluZygiQXV0aG9yaW5nVUkuUm9vdFByZWZQYWdlLmVuYWJsZXByb2Nlc3Njb250cmlidXRpb24udGV4dCIpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCi0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQotCQkvLyBmb250ID0gbnVsbDsKLQkJcmV0dXJuIGNvbXBvc2l0ZV90YWI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJLy8gdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWluaXRpYWxpemVEZWZhdWx0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXN0b3JlVmFsdWVzKCk7Ci0JCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkgewotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIHByZWZlcmVuY2UKLQkgKiBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLy8gcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4pIHsKLQkvLyBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkvLyBsYWJlbC5zZXRUZXh0KHRleHQpOwotCS8vIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkvLyBkYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkvLyBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCS8vIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JLy8gcmV0dXJuIGxhYmVsOwotCS8vIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL1N0YXJ0dXBQcmVmUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL1N0YXJ0dXBQcmVmUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZWVkMTc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9TdGFydHVwUHJlZlBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiBTdGFydHVwIHByZWZlcmVuY2UgcGFnZQotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3RhcnR1cFByZWZQYWdlIGV4dGVuZHMgQ29tbW9uUHJlZlBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lciB7Ci0KLQlDb21wb3NpdGUgY29tcG9zaXRlX3RhYjsKLQotCWludCBuY29sID0gMzsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfc3RhcnR1cFByb21wdDsKLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQljb21wb3NpdGVfdGFiID0gY3JlYXRlR3JpZENvbXBvc2l0ZShwYXJlbnQsIG5jb2wpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZV90YWIsICIgIiwgbmNvbCk7IC8vJE5PTi1OTFMtMSQKLQotCQljdHJsX3N0YXJ0dXBQcm9tcHQgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZV90YWIsIFNXVC5DSEVDSyk7Ci0JCWN0cmxfc3RhcnR1cFByb21wdC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb21wdGZvcmxpYmFyeV90ZXh0KTsgCi0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYiwgIiAiLCBuY29sKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZV90YWIsIG5jb2wpOwotCi0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlX3RhYjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWluaXRpYWxpemVEZWZhdWx0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXN0b3JlVmFsdWVzKCk7Ci0JCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJLy8gSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvLyBzdG9yZS5zZXRWYWx1ZShMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BST01QVF9GT1JfTElCUkFSWV9BVF9TVEFSVFVQLAotCQkvLyBjdHJsX3N0YXJ0dXBQcm9tcHQuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5zZXRQcm9tcHRGb3JNZXRob2RMaWJyYXJ5QXRTdGFydHVwKGN0cmxfc3RhcnR1cFByb21wdAotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotCQkvLyBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWN0cmxfc3RhcnR1cFByb21wdC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQkvLyBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCS8vIGN0cmxfc3RhcnR1cFByb21wdC5zZXRTZWxlY3Rpb24oc3RvcmUuZ2V0Qm9vbGVhbihMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BST01QVF9GT1JfTElCUkFSWV9BVF9TVEFSVFVQKSk7Ci0JCWN0cmxfc3RhcnR1cFByb21wdC5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0UHJvbXB0Rm9yTWV0aG9kTGlicmFyeUF0U3RhcnR1cCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQ29tbW9uUHJlZlBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OGI1MzkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWJzdHJhY3RTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BYnN0cmFjdFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTRlYmMyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BYnN0cmFjdFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC52aWV3LlRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhIHNlY3Rpb24gaW4gYSB0YWIgaW4gdGhlIHByb3BlcnRpZXMgdmlldy4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlTZWN0aW9uIGltcGxlbWVudHMKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCXByb3RlY3RlZCBib29sZWFuIGVkaXRhYmxlID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgcGFnZTsKLQotCXByb3RlY3RlZCBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG5ldyBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yKAotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpLAotCQkJbnVsbCk7Ci0KLQlwcm90ZWN0ZWQgTG9nZ2VyIGxvZ2dlcjsKLQotCS8qCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIEFic3RyYWN0U2VjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQotCQkvLyBsaXN0ZW4gdG8gY2hhbmdlIGZvciBjdXJyZW50IHNlbGVjdGlvbiBvZiBNZXRob2RDb25maWd1cmF0aW9uCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5hZGRMaXN0ZW5lcihsaWJyYXJ5TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gZ2V0IGxvZ2dlcgotCQlsb2dnZXIgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wLCBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKGNvbXAsIHBhZ2UpOwotCQl0aGlzLnBhZ2UgPSBwYWdlOwotCX0KLQotCXByaXZhdGUgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJyYXJ5TGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCXN3aXRjaCAob3B0aW9uKSB7Ci0JCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQ6IHsKLQkJCQlzZWN0aW9uUmVmcmVzaCgpOwotCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIFJlZnJlc2ggdGhlIGN1cnJlbnQgc2VjdGlvbgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZWN0aW9uUmVmcmVzaCgpIHsKLQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJVGFiIHRhYiA9IHBhZ2UuZ2V0Q3VycmVudFRhYigpOwotCQkJaWYgKHRhYiAhPSBudWxsKSB7Ci0JCQkJSVNlY3Rpb24gc2VjdGlvbiA9IHRhYi5nZXRTZWN0aW9uQXRJbmRleCgwKTsKLQotCQkJCWlmICgoc2VjdGlvbiAhPSBudWxsKQotCQkJCQkJJiYgKHNlY3Rpb24gaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24pKSB7Ci0JCQkJCXNlY3Rpb24ucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAobGlicmFyeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYnJhcnlMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlci5zZXRJbnB1dChwYXJ0LCBzZWxlY3Rpb24pOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNldElucHV0OjpzZWxlY3Rpb24gLSAiK3NlbGVjdGlvbik7Ci0JCUFzc2VydC5pc1RydWUoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQlPYmplY3QgaW5wdXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCWluaXRFbGVtZW50RGF0YShpbnB1dCk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdEVsZW1lbnREYXRhKE9iamVjdCBpbnB1dCkgewotCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCXRoaXMuZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBpbnB1dDsKLQkJCWlmIChUbmdVdGlsLmlzTG9ja2VkKHRoaXMuZWxlbWVudCkpCi0JCQkJdGhpcy5lZGl0YWJsZSA9IGZhbHNlOwotCQkJZWxzZSB7Ci0JCQkJdGhpcy5lZGl0YWJsZSA9IHRydWU7Ci0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCQlpZiAoKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpCi0JCQkJCQkJfHwgKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpKQotCQkJCQkJdGhpcy5lZGl0YWJsZSA9IGZhbHNlOwotCQkJCQllbHNlCi0JCQkJCQl0aGlzLmVkaXRhYmxlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJdGhpcy5lbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIExpYnJhcnlVdGlsLnVud3JhcChpbnB1dCk7Ci0JCQl0aGlzLmVkaXRhYmxlID0gZmFsc2U7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFJldHVybiBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZmlyc3QgZWxlbWVudCBmcm9tIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJT2JqZWN0IGlucHV0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCXJldHVybiBpbnB1dDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gcHJvY2VzcyBlZGl0b3IKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlwcm9jZXNzIGVkaXRvcgotCSAqLwotCXB1YmxpYyBQcm9jZXNzRWRpdG9yIGdldEVkaXRvcigpIHsKLQkJcmV0dXJuIEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEVkaXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBJdGVtUHJvdmlkZXIKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQkJYWRhcHRlcgotCSAqLwotCXB1YmxpYyBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldEFkYXB0ZXIoKSB7Ci0JCXRyeSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgcHJvdmlkZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZmFjdG9yeS5hZGFwdCgKLQkJCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXJldHVybiBwcm92aWRlcjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBBZGFwdGVyIGZhY3RvcnkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQkJYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IEVQRlByb3BlcnR5U2hlZXRQYWdlCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGVsZW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdCBpbnB1dCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldEVsZW1lbnQ6OnNlbGVjdGlvbiAtICIrc2VsZWN0aW9uKTsKLQkJCXRyeSB7Ci0JCQkJaW5pdEVsZW1lbnREYXRhKGlucHV0KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nZ2VyCi0JCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCSJFcnJvciBnZXR0aW5nIGVsZW1lbnQgZnJvbSB0aGUgc2VsZWN0aW9uICIgKyBlbGVtZW50LCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHByb3BlcnR5IHNoZWV0IHBhZ2UKLQkgKiBAcmV0dXJuCi0JICogCQkJcHJvcGVydHkgc2hlZXQgcGFnZQotCSAqLwotCXB1YmxpYyBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcm9lcHJ0eUNoYW5nZUV2ZW50IiArIGV2dCk7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZmlsdGVyIGxpc3Qgb2YgZWxlbWVudHMuIEZpbHRlciBpcyBiYXNlZCBvbiBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGxpc3QKLQkgKiAJCQlPcmlnaW5hbCBsaXN0Ci0JICogQHJldHVybgotCSAqIAkJCWZpbHRlcmVkIGxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZExpc3QoTGlzdCBsaXN0KSB7Ci0JCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCWlmIChjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdG9yLm5leHQoKTsKLQkJCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZQotCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJaWYgKGNvbmZpZ3VyYXRvci5hY2NlcHQob2JqKSkgewotCQkJCQluZXdMaXN0LmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZGVmYXVsdCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gCi0JICogCQkJZGVmYXVsdCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGdldERlZmF1bHRDb25maWd1cmF0aW9uKCkgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZ2V0QWRhcHRlcigpOwotCQlPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQlwYXJlbnQgPSBic0l0ZW1Qcm92aWRlci5nZXRUb3BJdGVtKCk7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBwYXJlbnQpCi0JCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJcmV0dXJuIGNvbmZpZzsKLQkJfSBlbHNlIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoIkFic3RyYWN0U2VjdGlvbjo6Z2V0RGVmYXVsdENvbmZpZ3VyYXRpb24gLSBJQlNJdGVtUHJvdmlkZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHJldHVybgotCSAqIAkJCWN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQkvLyBpZiBjb25maWd1cmF0aW9uIGlzIG5vdCBzZWxlY3RlZCwgdXNlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCQkJcmV0dXJuIGdldERlZmF1bHRDb25maWd1cmF0aW9uKCk7Ci0JCX0KLQotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCi0JLy8gcHVibGljIHZvaWQgdXBkYXRlVGl0bGUoT2JqZWN0IG9iaikKLQkvLyB7Ci0JLy8gU3RyaW5nIG5hbWUgPSBnZXROYW1lUHJlZml4KCkgKyAoKEJyZWFrZG93bkVsZW1lbnQpb2JqKS5nZXROYW1lKCk7Ci0JLy8gVGFiYmVkUHJvcGVydHlDb21wb3NpdGUgY29tcCA9IChUYWJiZWRQcm9wZXJ0eUNvbXBvc2l0ZSkKLQkvLyBwYWdlLmdldENvbnRyb2woKTsKLQkvLyBUYWJiZWRQcm9wZXJ0eVRpdGxlIHRpdGxlID0gY29tcC5nZXRUaXRsZSgpOwotCS8vIGlmICh0aXRsZUltYWdlID09IG51bGwpCi0JLy8gewotCS8vIHRpdGxlSW1hZ2UgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLmdldEltYWdlKCk7Ci0JLy8gfQotCS8vIHRpdGxlLnNldFRpdGxlKG5hbWUsIHRpdGxlSW1hZ2UpOwotCS8vIH0KLQkKLQkKLQkKLQkvKioKLQkgKiBHZXQgbmFtZSBwcmVmaXggZm9yIHRoZSBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lUHJlZml4KCkgewotCQlyZXR1cm4gIlByb2Nlc3NFbGVtZW50OiAiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlEb2N1bWVudFNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5RG9jdW1lbnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5YjI4NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlEb2N1bWVudFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuUmljaFRleHRJbWFnZUxpbmtDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBUaGUgZG9jdW1lbnQgdGFiIGZvciBBY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURvY3VtZW50U2VjdGlvbiBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24gewotCi0JcHJvdGVjdGVkIEFjdGl2aXR5IGVsZW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IG1haW5EZXNjVGV4dDsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgcHVycG9zZVRleHQ7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGFsdGVybmF0aXZlc1RleHQ7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGhvd1RvU3RhZmZUZXh0OwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBwdXJwb3NlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZXhwYW5kRmxhZyA/IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJOiBwdXJwb3NlVGV4dDsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKEFjdGl2aXR5RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRQdXJwb3NlKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJcHVycG9zZVRleHQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCksIG5ld0NvbnRlbnQsIC0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3RlbmVyIG1haW5EZXNjTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZXhwYW5kRmxhZyA/IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJOiBtYWluRGVzY1RleHQ7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChBY3Rpdml0eURlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJbWFpbkRlc2NUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSwgbmV3Q29udGVudCwKLQkJCQkJCS0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3RlbmVyIGFsdGVybmF0aXZlc0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCTogYWx0ZXJuYXRpdmVzVGV4dDsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKEFjdGl2aXR5RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRBbHRlcm5hdGl2ZXMoKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQlhbHRlcm5hdGl2ZXNUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksIG5ld0NvbnRlbnQsIC0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3RlbmVyIGhvd1RvU3RhZmZMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IGhvd1RvU3RhZmZUZXh0OwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9ICgoQWN0aXZpdHlEZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEhvd3RvU3RhZmYoKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQlob3dUb1N0YWZmVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSwgbmV3Q29udGVudCwgLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNjcmVhdGVEb2N1bWVudFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50U2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWludCBtYWluRGVzY2hlaWdodEhpbnQgPSAxMDA7Ci0KLQkJc3VwZXIuY3JlYXRlRG9jdW1lbnRTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gbWFpbiBkZXNjcmlwdGlvbgotCQlSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciBtYWluRGVzY0NvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIG1haW5EZXNjaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19tYWluRGVzY3JpcHRpb24pOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihtYWluRGVzY0NvbnRhaW5lci5saW5rKTsKLQkJbWFpbkRlc2NUZXh0ID0gbWFpbkRlc2NDb250YWluZXIucmljaFRleHQ7Ci0KLQkJLy8gcHVycG9zZQotCQlSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciBwdXJwb3NlQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19wdXJwb3NlKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIocHVycG9zZUNvbnRhaW5lci5saW5rKTsKLQkJcHVycG9zZVRleHQgPSBwdXJwb3NlQ29udGFpbmVyLnJpY2hUZXh0OwotCi0JCS8vIGNyZWF0ZSBhbHRlcm5hdGl2ZXMKLQkJUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgYWx0ZXJuYXRpdmVzQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfYWx0ZXJuYXRpdmVzKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIoYWx0ZXJuYXRpdmVzQ29udGFpbmVyLmxpbmspOwotCQlhbHRlcm5hdGl2ZXNUZXh0ID0gYWx0ZXJuYXRpdmVzQ29udGFpbmVyLnJpY2hUZXh0OwotCQkKLQkJLy8gY3JlYXRlIGhvd3RvU3RhZmYKLQkJUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgaG93VG9TdGFmZkNvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X2hvd1RvU3RhZmYpOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihob3dUb1N0YWZmQ29udGFpbmVyLmxpbmspOwotCQlob3dUb1N0YWZmVGV4dCA9IGhvd1RvU3RhZmZDb250YWluZXIucmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCQotCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCQotCQlwdXJwb3NlVGV4dC5zZXRNb2RhbE9iamVjdChlbGVtZW50KTsKLQkJcHVycG9zZVRleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkpOwotCQlwdXJwb3NlVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgcHVycG9zZUxpc3RlbmVyKTsKLQkJCi0JCW1haW5EZXNjVGV4dC5zZXRNb2RhbE9iamVjdChlbGVtZW50KTsKLQkJbWFpbkRlc2NUZXh0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQltYWluRGVzY1RleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG1haW5EZXNjTGlzdGVuZXIpOwotCQkJCQotCQlhbHRlcm5hdGl2ZXNUZXh0LnNldE1vZGFsT2JqZWN0KGVsZW1lbnQpOwotCQlhbHRlcm5hdGl2ZXNUZXh0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpKTsKLQkJYWx0ZXJuYXRpdmVzVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgYWx0ZXJuYXRpdmVzTGlzdGVuZXIpOwotCQkKLQkJaG93VG9TdGFmZlRleHQuc2V0TW9kYWxPYmplY3QoZWxlbWVudCk7Ci0JCWhvd1RvU3RhZmZUZXh0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSk7Ci0JCWhvd1RvU3RhZmZUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBob3dUb1N0YWZmTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQlwdXJwb3NlVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCW1haW5EZXNjVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWFsdGVybmF0aXZlc1RleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlob3dUb1N0YWZmVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2F2ZU1vZGlmaWVkUmljaFRleHQoKTsKLQotCQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQkJCQlBY3Rpdml0eURlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQWN0aXZpdHlEZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCi0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCW1haW5EZXNjVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlwdXJwb3NlVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlhbHRlcm5hdGl2ZXNUZXh0Ci0JCQkJCQkJLnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCWhvd1RvU3RhZmZUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCQkuc2V0RWxlbWVudChlbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCW1haW5EZXNjVGV4dC5zZXRUZXh0KGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCXB1cnBvc2VUZXh0LnNldFRleHQoY29udGVudC5nZXRQdXJwb3NlKCkpOwotCQkJCWFsdGVybmF0aXZlc1RleHQuc2V0VGV4dChjb250ZW50LmdldEFsdGVybmF0aXZlcygpKTsKLQkJCQlob3dUb1N0YWZmVGV4dC5zZXRUZXh0KGNvbnRlbnQuZ2V0SG93dG9TdGFmZigpKTsKLQotCQkJCWlmIChleHBhbmRGbGFnKSB7Ci0JCQkJCWlmICgoKExhYmVsKWV4cGFuZERvY3VtZW50TGFiZWwuZ2V0Q29udHJvbCgpKS5nZXRUZXh0KCkuZXF1YWxzKAotCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19tYWluRGVzY3JpcHRpb24pKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50Ci0JCQkJCQkJCS5nZXRNYWluRGVzY3JpcHRpb24oKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFNlbGVjdGlvbigwKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQotCQkJCQl9IGVsc2UgaWYgKCgoTGFiZWwpZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRDb250cm9sKCkpLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3B1cnBvc2UpKSB7IAotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRUZXh0KGNvbnRlbnQuZ2V0UHVycG9zZSgpKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkpOwotCQkJCQl9IGVsc2UgaWYgKCgoTGFiZWwpZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRDb250cm9sKCkpLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9hbHRlcm5hdGl2ZXMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50Ci0JCQkJCQkJCS5nZXRBbHRlcm5hdGl2ZXMoKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkpOwotCQkJCQl9IGVsc2UgaWYgKCgoTGFiZWwpZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRDb250cm9sKCkpLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9ob3dUb1N0YWZmKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFRleHQoY29udGVudC5nZXRIb3d0b1N0YWZmKCkpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJCQkJLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZShmYWxzZSk7Ci0JCQkJfQotCi0JCQkJbWFpbkRlc2NUZXh0LnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCW1haW5EZXNjVGV4dC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCW1haW5EZXNjVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJcHVycG9zZVRleHQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJcHVycG9zZVRleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkpOwotCQkJCXB1cnBvc2VUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQlhbHRlcm5hdGl2ZXNUZXh0LnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCWFsdGVybmF0aXZlc1RleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSk7Ci0JCQkJYWx0ZXJuYXRpdmVzVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJaG93VG9TdGFmZlRleHQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJaG93VG9TdGFmZlRleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCkpOwotCQkJCWhvd1RvU3RhZmZUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBhY3Rpdml0eSBkb2N1bWVudGF0aW9uIHNlY3Rpb24gOiIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlHZW5lcmFsU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YWNjYTdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5R2VuZXJhbFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkFjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NWYXJpYWJpbGl0eUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9ncy5Db252ZXJ0QWN0aXZpdHlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGUgZ2VuZXJhbCB0YWIgc2VjdGlvbiBmb3IgQWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5R2VuZXJhbFNlY3Rpb24gZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgQWN0aXZpdHkgZWxlbWVudDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfQVBQTElDQUJMRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90QXBwbGljYWJsZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJJQlVURVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbnRyaWJ1dGVzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTkRTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwbGFjZXNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IG1vZGVsSW5mb1RleHQ7Ci0KLQlwcml2YXRlIExhYmVsIGFjdGl2aXR5VHlwZUxhYmVsOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdHlwZV90ZXh0OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF90eXBlX2J1dHRvbjsKLQotCXByaXZhdGUgQ29tYm8gY3RybF92YXJpYWJpbGl0eTsKLQotCXByaXZhdGUgQ29tYm9WaWV3ZXIgdmlld2VyX3ZhcmlhYmlsaXR5OwotCi0JcHJpdmF0ZSBUZXh0IGJhc2VUZXh0OwotCi0JcHJpdmF0ZSBCdXR0b24gc2VsZWN0QnV0dG9uOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIHZhcmlhYmlsaXR5TGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSB2YXJPYmplY3QgPSAoVmFyaWFiaWxpdHlUeXBlKSBvYmplY3Q7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKQotCQkJCXJldHVybiBOT1RfQVBQTElDQUJMRV9URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCkKLQkJCQlyZXR1cm4gQ09OVFJJQlVURVNfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkKLQkJCQlyZXR1cm4gRVhURU5EU19URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCkKLQkJCQlyZXR1cm4gUkVQTEFDRVNfVEVYVDsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciB2YXJpYWJpbGl0eUNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJTGlzdCB2YXJpYWJpbGl0eVR5cGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXZhcmlhYmlsaXR5VHlwZXNMaXN0LmFkZChWYXJpYWJpbGl0eVR5cGUuTkFfTElURVJBTCk7Ci0JCQl2YXJpYWJpbGl0eVR5cGVzTGlzdC5hZGQoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwpOwotCQkJdmFyaWFiaWxpdHlUeXBlc0xpc3QuYWRkKFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpOwotCQkJdmFyaWFiaWxpdHlUeXBlc0xpc3QuYWRkKFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKTsKLQkJCXJldHVybiB2YXJpYWJpbGl0eVR5cGVzTGlzdC50b0FycmF5KCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCS8vIGdldCBhY3Rpdml0eSBvYmplY3QKLQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jY3JlYXRlR2VuZXJhbFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlR2VuZXJhbFNlY3Rpb24oY29tcG9zaXRlKTsKLQotCQkvLyBNb2RlbCBJbmZvCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfTW9kZWxJbmZvKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1vZGVsSW5mb1RleHQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCBob3Jpem9udGFsU3Bhbik7Ci0JCW1vZGVsSW5mb1RleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCW1vZGVsSW5mb1RleHQuc2V0VGV4dChnZXRNb2RlbEluZm8oKSk7Ci0KLQkJLy8gVHlwZSBvZiBhbiBBY3Rpdml0eQotCQlhY3Rpdml0eVR5cGVMYWJlbCA9IEZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfVHlwZSk7Ci0JCQotCQljdHJsX3R5cGVfdGV4dCA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULlJFQURfT05MWSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWN0cmxfdHlwZV90ZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWN0cmxfdHlwZV9idXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5DSEFOR0VfVFlQRV9CVVRUT05fVEVYVCwgU1dULlBVU0gpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJY3RybF90eXBlX2J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlpZiAoQ29udmVydEFjdGl2aXR5RGlhbG9nLmdldFZhbGlkTmV3QWN0aXZpdHlUeXBlcyhlbGVtZW50KSA9PSBudWxsKSB7Ci0JCQljdHJsX3R5cGVfYnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0KLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFZhcmlhYmlsaXR5IFR5cGUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlZBUklBQklMSVRZX1RZUEVfVEVYVCk7Ci0KLQkJY3RybF92YXJpYWJpbGl0eSA9IEZvcm1VSS5jcmVhdGVDb21ibyh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCAyKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWN0cmxfdmFyaWFiaWxpdHkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQl2aWV3ZXJfdmFyaWFiaWxpdHkgPSBuZXcgQ29tYm9WaWV3ZXIoY3RybF92YXJpYWJpbGl0eSk7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5nZXRDb21ibygpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDEpKTsKLQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldENvbnRlbnRQcm92aWRlcih2YXJpYWJpbGl0eUNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRMYWJlbFByb3ZpZGVyKHZhcmlhYmlsaXR5TGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRJbnB1dChlbGVtZW50KTsKLQotCQlMYWJlbCBibGFua0xhYmVsID0gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJYmxhbmtMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIEJhc2UgZWxlbWVudHMKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJBU0VfRUxFTUVOVF9URVhUKTsKLQotCQliYXNlVGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUpOwotCQl7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQkJfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJYmFzZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCX0KLQkJYmFzZVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJLy8gQnV0dG9uIHRvIHNlbGVjdAotCQlzZWxlY3RCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlNFTEVDVF9CVVRUT05fVEVYVCk7Ci0JfQotCi0JLyoqCi0JICogYWRkIGxpc3RlbmVycwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCWN0cmxfdHlwZV9idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZmluYWwgUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxOyAvLyROT04tTkxTLTEkCi0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbWVzc2FnZSk7Ci0JCQkJfSBlbHNlICB7Ci0JCQkJCW5hbWVUZXh0LnJlbW92ZUxpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJCW5hbWVEZWFjdGl2YXRlTGlzdGVuZXIpOwotCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5yZW1vdmVMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCQlwcmVzZW50YXRpb25OYW1lRGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQotCQkJCQlBY3Rpdml0eSBuZXdBY3Rpdml0eSA9IENvbnZlcnRBY3Rpdml0eURpYWxvZwotCQkJCQkucXVlcnlVc2VyQW5kQ29udmVydCgoQWN0aXZpdHkpIGVsZW1lbnQsIG51bGwsIG51bGwpOwotCQkJCQlpZiAobmV3QWN0aXZpdHkgIT0gbnVsbCkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCW5ld0FjdGl2aXR5KTsKLQkJCQkJCS8vIGRlYWwgd2l0aCBwcm9wZXJ0eSBzaGVldCBkaXJlY3RseS4KLQkJCQkJCWdldFByb3BlcnR5U2hlZXRQYWdlKCkuc2VsZWN0aW9uQ2hhbmdlZChnZXRQYXJ0KCksCi0JCQkJCQkJCXNlbCk7Ci0JCQkJCQkvLyBnZXRFZGl0b3IoKS5zZXRTZWxlY3Rpb24oc2VsKTsKLQkJCQkJCXJlZnJlc2goKTsKLQkJCQkJCSgoUHJvY2Vzc1ZpZXdlcikgKChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIGdldEVkaXRvcigpCi0JCQkJCQkJCS5nZXRBY3RpdmVQYWdlSW5zdGFuY2UoKSkuZ2V0Vmlld2VyKCkpCi0JCQkJCQkJCS5leHBhbmRUb0xldmVsKG5ld0FjdGl2aXR5LCAzKTsKLQkJCQkJfQotCQkJCQluYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCQluYW1lRGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCQkJcHJlc2VudGF0aW9uTmFtZURlYWN0aXZhdGVMaXN0ZW5lcik7Ci0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfdmFyaWFiaWxpdHkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3ZhcmlhYmlsaXR5Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IChWYXJpYWJpbGl0eVR5cGUpIHNlbGVjdGlvbgotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCQkJaWYgKHZlICE9IG51bGwgJiB2ZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCQkJaWYodHlwZS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpCi0vLwkJCQkJCQkmJiB2ZSBpbnN0YW5jZW9mIFByb2Nlc3MpewotLy8JCQkJCQlPYmplY3RbXSBhcmdzID0geyBlbGVtZW50LmdldE5hbWUoKSB9OwotLy8JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0vLwkJCQkJCS5iaW5kKAotLy8JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzEsCi0vLwkJCQkJCQkJYXJncyk7Ci0vLwotLy8JCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLS8vCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0vLwkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQkJVmFyaWFiaWxpdHlUeXBlIHZ0eXBlID0gZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLS8vCQkJCQkJaWYodnR5cGUgIT0gbnVsbCl7Ci0vLwkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih2dHlwZSk7Ci0vLwkJCQkJCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0U2VsZWN0aW9uKHNlbCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJcmV0dXJuOwotLy8JCQkJCX0KLS8vCQkJCQlpZiAoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKChBY3Rpdml0eSkgdmUpCi0vLwkJCQkJCQkmJiB0eXBlLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKSkgewotLy8JCQkJCQlPYmplY3RbXSBhcmdzID0geyBlbGVtZW50LmdldE5hbWUoKSwKLS8vCQkJCQkJCQkoKEFjdGl2aXR5KSB2ZSkuZ2V0TmFtZSgpIH07Ci0vLwkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLS8vCQkJCQkJCQkuYmluZCgKLS8vCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZywKLS8vCQkJCQkJCQkJCWFyZ3MpOwotLy8KLS8vCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0vLwkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkJCQkJVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IGVsZW1lbnQKLS8vCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0vLwkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5ld1ZhcmlhYmlsaXR5U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0vLwkJCQkJCQkJdmFyaWFiaWxpdHlUeXBlKTsKLS8vCQkJCQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldFNlbGVjdGlvbigKLS8vCQkJCQkJCQluZXdWYXJpYWJpbGl0eVNlbGVjdGlvbiwgdHJ1ZSk7Ci0vLwotLy8JCQkJCQlyZXR1cm47Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJaWYodHlwZSAhPSBWYXJpYWJpbGl0eVR5cGUuTkFfTElURVJBTCkgewotCQkJCQkJSVN0YXR1cyBzdGF0ZSA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5QWZ0ZXJGaWx0ZXJTZWxlY3Rpb24oZWxlbWVudCwgKEFjdGl2aXR5KSB2ZSwgdHlwZSk7Ci0JCQkJCQlpZighc3RhdGUuaXNPSygpKSB7Ci0JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgc3RhdGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkKLQkJCQkJCQkvLyBzZXQgdmFyaWFiaWxpdHkgdG8gYmFjayB3aGF0ZXZlciBpdCB3YXMgZm9yIFVJCi0JCQkJCQkJVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQkJCXZhcmlhYmlsaXR5VHlwZSk7Ci0JCQkJCQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldFNlbGVjdGlvbihuZXdWYXJpYWJpbGl0eVNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSwKLQkJCQkJCQl0eXBlLCAtMSk7Ci0JCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQlpZiAoZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCkgPT0gbnVsbAotCQkJCQkJCQl8fCBlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKS5lcXVhbHMoIiIpKSB7Ci0JCQkJCQkJaWYgKHR5cGUuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKSkKLQkJCQkJCQkJZWxlbWVudC5zZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCkgPT0gbnVsbAotCQkJCQkJCXx8IGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpLmVxdWFscygiIikpIHsKLQkJCQkJCWlmICh0eXBlLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCkKLQkJCQkJCQkJfHwgdHlwZQotCQkJCQkJCQkJCS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpKQotCQkJCQkJCWVsZW1lbnQuc2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50LmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTkFfTElURVJBTCkgewotCQkJCQlpZiAodmUgIT0gbnVsbCkgewotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQkJCQkJCQludWxsLCAtMSk7Ci0KLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNlbGVjdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJYmFzZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlMaXN0IHNlbGVjdGlvbkJhc2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGVsZW1lbnQKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQlzZWxlY3Rpb25CYXNlTGlzdC5hZGQoYmFzZSk7Ci0JCQkJCXNlbGVjdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCi0JCQkJfQotCQkJCS8vIHNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQkJfQotCQl9KTsKLQotCQlzZWxlY3RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTOwotCi0JCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSAoVmFyaWFiaWxpdHlUeXBlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfdmFyaWFiaWxpdHkKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBBY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyKGNvbmZpZywgbnVsbCwKLQkJCQkJCXRhYk5hbWUsIGVsZW1lbnQpOwotCi0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIHRhYk5hbWUsIG51bGwsIGNvbmZpZyk7Ci0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJCWZkLnNldFRpdGxlKHRhYk5hbWUpOwotCQkJCWZkLm9wZW4oKTsKLQotCQkJCUxpc3Qgc2VsZWN0ZWRJdGVtcyA9IGZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQotCQkJCWlmIChzZWxlY3RlZEl0ZW1zICE9IG51bGwgJiYgIXNlbGVjdGVkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQkJCU9iamVjdCBvID0gc2VsZWN0ZWRJdGVtcy5nZXQoMCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvOwotLy8JCQkJCQlpZiAoaXNEaXJlY3RQYXJlbnQoYWN0KQotLy8JCQkJCQkJCXx8ICgoYWN0IGluc3RhbmNlb2YgUHJvY2VzcykgJiYgdHlwZS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpCi0vLwkJCQkJCQkJCQkmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSkpIAotLy8JCQkJCQl7Ci0vLwkJCQkJCQlPYmplY3RbXSBhcmdzID0geyBlbGVtZW50LmdldE5hbWUoKSB9OwotLy8JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotLy8JCQkJCQkJCQkuYmluZCgKLS8vCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxLAotLy8JCQkJCQkJCQkJCWFyZ3MpOwotLy8KLS8vCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotLy8JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0vLwkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkJCQkJCXJldHVybjsKLS8vCQkJCQkJfQotLy8JCQkJCQlpZiAoaXNDaXJjdWxhckRlcGVuZGVuY3koYWN0KSkgewotLy8JCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgZWxlbWVudC5nZXROYW1lKCksIGFjdC5nZXROYW1lKCkgfTsKLS8vCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLS8vCQkJCQkJCQkJLmJpbmQoCi0vLwkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMiwKLS8vCQkJCQkJCQkJCQlhcmdzKTsKLS8vCi0vLwkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLS8vCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwkJCQkJCQlyZXR1cm47Ci0vLwkJCQkJCX0KLS8vCQkJCQkJLy8gYmxvY2sgZm9yIGNoaWxkcmVuCi0vLwkJCQkJCWlmIChQcm9jZXNzVXRpbC5oYXNDb250cmlidXRvck9yUmVwbGFjZXIoYWN0KQotLy8JCQkJCQkJCSYmIHR5cGUuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpKSB7Ci0vLwkJCQkJCQlPYmplY3RbXSBhcmdzID0geyBlbGVtZW50LmdldE5hbWUoKSwgYWN0LmdldE5hbWUoKSB9OwotLy8JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotLy8JCQkJCQkJCQkuYmluZCgKLS8vCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2csCi0vLwkJCQkJCQkJCQkJYXJncyk7Ci0vLwotLy8JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0vLwkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwotLy8JCQkJCQkJcmV0dXJuOwotLy8JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbihlbGVtZW50LCAoQWN0aXZpdHkpIG8sIHR5cGUpOwotCQkJCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsJCQkJCQkKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG87Ci0KLQkJCQkJCUlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IFByb2Nlc3NWYXJpYWJpbGl0eUNvbmZpZ3VyYXRvcigKLQkJCQkJCQkJZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKSwgbnVsbCk7Ci0JCQkJCQlBY3Rpdml0eVZhcmlhYmlsaXR5Q29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQoCi0JCQkJCQkJCWVsZW1lbnQsIHZlLCB0eXBlLCBjb25maWd1cmF0b3IpOwotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCi0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQotCQkJCQkJYmFzZVRleHQuc2V0VGV4dChUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgodmUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgbW9kZWwgaW5mb3JtYXRpb24gZm9yIHRoZSBhY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKiAJCQltb2RlbCBpbmZvIHN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldE1vZGVsSW5mbygpIHsKLQkJU3RyaW5nIGluZm8gPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlPYmplY3QgbyA9IGdldEFkYXB0ZXIoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBvOwotCQkJCWluZm8gPSBhZGFwdGVyLmdldEF0dHJpYnV0ZShlbGVtZW50LAotCQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHByaW50IGV4Y2VwdGlvbgotCQl9Ci0JCWlmICghKFN0clV0aWwuaXNCbGFuayhpbmZvKSkpCi0JCQlyZXR1cm4gaW5mbzsKLQkJZWxzZQotCQkJcmV0dXJuIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Ob25lOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiN1cGRhdGVDb250cm9scygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQkJY3RybF90eXBlX2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF92YXJpYWJpbGl0eS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJc2VsZWN0QnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCi0JCWN0cmxfdmFyaWFiaWxpdHkuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmICgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfdmFyaWFiaWxpdHkuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJLmdldEZpcnN0RWxlbWVudCgpID09IFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKSB7Ci0JCQlzZWxlY3RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQotCQkJCW1vZGVsSW5mb1RleHQuc2V0VGV4dChnZXRNb2RlbEluZm8oKSk7Ci0KLQkJCQljdHJsX3R5cGVfdGV4dC5zZXRUZXh0KFByb3BlcnRpZXNVdGlsLmdldFR5cGUoZWxlbWVudCkpOwotCi0JCQkJLy8gaGlkZS9zaG93IGNvbWJvCi0JCQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKQotCQkJCQkJJiYgKGVsZW1lbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCB8fCBlbGVtZW50Ci0JCQkJCQkJCS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSkgewotCQkJCQlhY3Rpdml0eVR5cGVMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJY3RybF90eXBlX3RleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCWN0cmxfdHlwZV9idXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYWN0aXZpdHlUeXBlTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJY3RybF90eXBlX3RleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJY3RybF90eXBlX2J1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQkJCX0KLQotCQkJCVZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5ld1ZhcmlhYmlsaXR5U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQl2YXJpYWJpbGl0eVR5cGUpOwotCQkJCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRTZWxlY3Rpb24obmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24sIHRydWUpOwotCi0JCQkJaWYgKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpCi0JCQkJCWJhc2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW1lbnQKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSk7Ci0JCQkJZWxzZQotCQkJCQliYXNlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgQWN0aXZpdHkgZ2VuZXJhbCBzZWN0aW9uIDogIiArIGVsZW1lbnQsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNnZXROYW1lUHJlZml4KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfQ0FQQUJJTElUWV9QQVRURVJOICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfREVMSVZFUllfUFJPQ0VTUyArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfUEhBU0UgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9JVEVSQVRJT04gKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZQotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9BQ1RJVklUWSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5R3VpZGFuY2VTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eUd1aWRhbmNlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxODc0YTIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5R3VpZGFuY2VTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFkZEd1aWRhbmNlVG9BY3Rpdml0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotLyoqCi0gKiBUaGUgYWN0aXZpdHkgZ3VpZGFuY2Ugc2VjdGlvbi4gSXQgbGlzdCBhbGwgYXZhaWFibGUgZ3VpZGFuY2VzIG9mIGFuIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5R3VpZGFuY2VTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGRfMSwgY3RybF9yZW1vdmVfMSwgY3RybF9hZGRfMiwgY3RybF9yZW1vdmVfMjsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYWRkXzMsIGN0cmxfcmVtb3ZlXzMsIGN0cmxfYWRkXzQsIGN0cmxfcmVtb3ZlXzQ7Ci0KLQlwcml2YXRlIFRhYmxlIGN0cmxfdGFibGVfMSwgY3RybF90YWJsZV8yLCBjdHJsX3RhYmxlXzMsIGN0cmxfdGFibGVfNDsKLQotCXByaXZhdGUgU2VjdGlvbiBjb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLCBlZHVjYXRpb25NYXRlcmlhbFNlY3Rpb247Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcl8xLCB2aWV3ZXJfMiwgdmlld2VyXzMsIHZpZXdlcl80OwotCi0JLy8gZWxlbWVudAotCXByaXZhdGUgQWN0aXZpdHkgZWxlbWVudDsKLQotCS8vIGFjdGlvbiBtYW5hZ2VyCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0KLQlwcml2YXRlIElGaWx0ZXIgcm9hZE1hcEZpbHRlciA9IG51bGw7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZ2VuZXJhbEd1aWRhbmNlRmlsdGVyID0gbnVsbDsKLQotCXByaXZhdGUgSUZpbHRlciBzdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogR2V0IHJvYWQgbWFwIGd1aWRhbmNlIGZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFJvYWRNYXBGaWx0ZXIoKSB7Ci0JCWlmIChyb2FkTWFwRmlsdGVyID09IG51bGwpIHsKLQkJCXJvYWRNYXBGaWx0ZXIgPSBuZXcgUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwKLQkJCQkJdGFiTmFtZSkgewotCQkJCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9ICgoR3VpZGFuY2VJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopOwotCQkJCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1JvYWRtYXAiKSkgJiYgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkhKChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgb2JqKS5nZXRDaGlsZHJlbihvYmopCi0JCQkJCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2FkbWFwKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfTsKLQkJfSBlbHNlIHsKLQkJCSgoUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKSByb2FkTWFwRmlsdGVyKS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCX0KLQotCQlyZXR1cm4gcm9hZE1hcEZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgR2VuZXJhbCBndWlkYW5jZSBmaWx0ZXIKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRHZW5lcmFsR3VpZGFuY2VGaWx0ZXIoKSB7Ci0JCWlmIChnZW5lcmFsR3VpZGFuY2VGaWx0ZXIgPT0gbnVsbCkgewotCQkJZ2VuZXJhbEd1aWRhbmNlRmlsdGVyID0gbmV3IFByb2Nlc3NHdWlkYW5jZUZpbHRlcigKLQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLCB0YWJOYW1lKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2VJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCWlmICgoKEd1aWRhbmNlSXRlbVByb3ZpZGVyKSBvYmopLmdldENoaWxkcmVuKG9iaikKLQkJCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJQ2xhc3MgY2xzID0gRmlsdGVySW5pdGlhbGl6ZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDbGFzc0ZvclR5cGUoaGVscGVyLmdldEZpbHRlclR5cGVTdHIoKSk7Ci0JCQkJCWlmIChjbHMgIT0gbnVsbCkgewotCQkJCQkJaWYgKGNscy5pc0luc3RhbmNlKG9iaikpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICgob2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB8fCAob2JqIGluc3RhbmNlb2YgQ29uY2VwdCkKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgRXhhbXBsZSkKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgR3VpZGVsaW5lKQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJfQotCQkJfTsKLQkJfWVsc2UgewotCQkJKChQcm9jZXNzR3VpZGFuY2VGaWx0ZXIpIGdlbmVyYWxHdWlkYW5jZUZpbHRlcikuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihnZXRDb25maWd1cmF0aW9uKCkpOwotCQl9Ci0JCXJldHVybiBnZW5lcmFsR3VpZGFuY2VGaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0IFN1cHBvcnRpbmcgbWF0ZXJpY2FsIGd1aWRhbmNlIGZpbHRlcgotCSAqIAotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlcigpIHsKLQkJaWYgKHN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlciA9PSBudWxsKSB7Ci0JCQlzdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIgPSBuZXcgUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKAotCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIHRhYk5hbWUpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWlmICgob2JqIGluc3RhbmNlb2YgR3VpZGFuY2VJdGVtUHJvdmlkZXIpCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX07Ci0JCX0gZWxzZSB7Ci0JCQkoKFByb2Nlc3NHdWlkYW5jZUZpbHRlcikgc3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyKS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCQlpbml0KCk7Ci0KLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIGNyZWF0ZSBndWlkYW5jZSBzZWN0aW9uCi0JCWNyZWF0ZUd1aWRhbmNlU2VjdGlvbihwYXJlbnQpOwotCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRyb2xzCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCS8vIGdldCBhY3Rpdml0eSBvYmplY3QKLQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IGFjdGlvbiBtYW5hZ2VyCi0JCWFjdGlvbk1nciA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdG9nZ2xlU2VjdGlvbigpIHsKLQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykpIHsKLQkJCWlmIChjb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzRXhwYW5kZWQoKSkKLQkJCQljb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLnNldEV4cGFuZGVkKGZhbHNlKTsKLQkJCWlmIChlZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24uaXNFeHBhbmRlZCgpKQotCQkJCWVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRFeHBhbmRlZChmYWxzZSk7Ci0KLQkJCWlmIChjb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzVmlzaWJsZSgpKQotCQkJCWNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlpZiAoZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzVmlzaWJsZSgpKQotCQkJCWVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmICghY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5pc0V4cGFuZGVkKCkpCi0JCQkJY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCWlmICghZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzRXhwYW5kZWQoKSkKLQkJCQllZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0KLQkJCWlmICghY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5pc1Zpc2libGUoKSkKLQkJCQljb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlpZiAoIWVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5pc1Zpc2libGUoKSkKLQkJCQllZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogIFVwZGF0ZSBjb250cm9scyBiYXNlZCBvbiBlZGl0YWJsZSBmbGFnLiBDb250cm9scyBjYW4gYmVjb21lIGVkaXRhYmxlIG9yIHVuLWVkaXRhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCWN0cmxfYWRkXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfYWRkXzIuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfYWRkXzMuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfYWRkXzQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMQotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMi5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMy5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfNC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0KLQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0JCQkJdmlld2VyXzIucmVmcmVzaCgpOwotCQkJCXZpZXdlcl8zLnJlZnJlc2goKTsKLQkJCQl2aWV3ZXJfNC5yZWZyZXNoKCk7Ci0KLQkJCQkvLyBoaWRlL3Nob3cgY2VydGFpbiBzZWN0aW9ucy4KLQkJCQl0b2dnbGVTZWN0aW9uKCk7Ci0KLQkJCQkvLyBoaWRlL3Nob3cgY29udHJvbHMKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKCJFcnJvciByZWZyZXNoaW5nIGFjdGl2aXR5IGd1aWRhbmNlIHNlY3Rpb246ICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBndWlkYW5jZSBzZWN0aW9uIG9uIHRoZSBnaXZlbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUd1aWRhbmNlU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWludCB0YWJsZUhlaWdodCA9IDUwOwotCQlTdHJpbmcgc2VjdGlvblRpdGxlID0gbnVsbDsKLQkJU3RyaW5nIHNlY3Rpb25EZXNjID0gbnVsbDsKLQkJU3RyaW5nIHRhYmxlVGl0bGUgPSBudWxsOwotCQkvLyBMYWJlbCB0YWJsZUxhYmVsID0gbnVsbDsKLQotCQkvLyBST0FETUFQCi0JCXsKLQkJCXNlY3Rpb25UaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfUm9hZG1hcFRpdGxlOyAvLyROT04tTkxTLTEkCi0JCQlzZWN0aW9uRGVzYyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfUm9hZG1hcERlc2NyaXB0aW9uOyAvLyROT04tTkxTLTEkCi0JCQl0YWJsZVRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwOyAvLyROT04tTkxTLTEkCi0KLQkJCVNlY3Rpb24gc2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQkJc2VjdGlvblRpdGxlLCBzZWN0aW9uRGVzYyk7Ci0KLQkJCS8vIGNyZWF0ZSBjb21wb3NpdGUKLQkJCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCQlzZWN0aW9uLCAyLCBmYWxzZSk7Ci0KLQkJCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGVUaXRsZSk7Ci0KLQkJCWN0cmxfdGFibGVfMSA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgdGFibGVIZWlnaHQpOwotCQkJdmlld2VyXzEgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV8xKTsKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoZWxlbWVudC5nZXRSb2FkbWFwcygpKS50b0FycmF5KCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJdmlld2VyXzEuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdmlld2VyXzEuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTEKLQkJCUNvbXBvc2l0ZSBwYW5lMiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJCWN0cmxfYWRkXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsKLQkJCWN0cmxfcmVtb3ZlXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsKLQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCQl9Ci0KLQkJLy8gR0VORVJBTCBHVUlEQU5DRQotCQl7Ci0JCQlzZWN0aW9uVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlOyAvLyROT04tTkxTLTEkCi0JCQlzZWN0aW9uRGVzYyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlRGVzY3JpcHRpb247IC8vJE5PTi1OTFMtMSQKLQkJCXRhYmxlVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZTsgLy8kTk9OLU5MUy0xJAotCi0JCQlTZWN0aW9uIHNlY3Rpb24gPSBGb3JtVUkuY3JlYXRlU2VjdGlvbih0b29sa2l0LCBjb21wb3NpdGUsCi0JCQkJCXNlY3Rpb25UaXRsZSwgc2VjdGlvbkRlc2MpOwotCi0JCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCQlDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwKLQkJCQkJc2VjdGlvbiwgMiwgZmFsc2UpOwotCi0JCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTEsIHRhYmxlVGl0bGUpOwotCi0JCQljdHJsX3RhYmxlXzIgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIHRhYmxlSGVpZ2h0KTsKLQkJCXZpZXdlcl8yID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMik7Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KGdldFNlbGVjdGVkR3VpZGFuY2VzKCkpLnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl2aWV3ZXJfMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCXZpZXdlcl8yLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMi5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMgotCQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkJY3RybF9hZGRfMiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOwotCQkJY3RybF9yZW1vdmVfMiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOwotCi0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0JCX0KLQotCQkvLyBDT01NVU5JQ0FUSU9OIE1BVEVSSUFMCi0JCXsKLQkJCXNlY3Rpb25UaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsVGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJCXNlY3Rpb25EZXNjID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbjsgLy8kTk9OLU5MUy0xJAotCQkJdGFibGVUaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfU2VsZWN0ZWRfQ29tbXVuaWNhdGlvbk1hdGVyaWFsOyAvLyROT04tTkxTLTEkCi0KLQkJCVNlY3Rpb24gc2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQkJc2VjdGlvblRpdGxlLCBzZWN0aW9uRGVzYyk7Ci0KLQkJCS8vIGNyZWF0ZSBjb21wb3NpdGUKLQkJCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCQlzZWN0aW9uLCAyLCBmYWxzZSk7Ci0KLQkJCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGVUaXRsZSk7Ci0KLQkJCWN0cmxfdGFibGVfMyA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgdGFibGVIZWlnaHQpOwotCQkJdmlld2VyXzMgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV8zKTsKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJCQkoKERlbGl2ZXJ5UHJvY2VzcykgZWxlbWVudCkKLQkJCQkJCQkJCQkuZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSkKLQkJCQkJCQkJLnRvQXJyYXkoKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC50b0FycmF5KCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJdmlld2VyXzMuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMy5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdmlld2VyXzMuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTIKLQkJCUNvbXBvc2l0ZSBwYW5lMiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJCWN0cmxfYWRkXzMgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsKLQkJCWN0cmxfcmVtb3ZlXzMgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsKLQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCi0JCQljb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uID0gc2VjdGlvbjsKLQotCQl9Ci0KLQkJLy8gRURVQ0FUSU9OIE1BVEVSSUFMCi0JCXsKLQkJCXNlY3Rpb25UaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfRWR1Y2F0aW9uTWF0ZXJpYWxUaXRsZTsgLy8kTk9OLU5MUy0xJAotCQkJc2VjdGlvbkRlc2MgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb247IC8vJE5PTi1OTFMtMSQKLQkJCXRhYmxlVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1NlbGVjdGVkX0VkdWNhdGlvbk1hdGVyaWFsOyAvLyROT04tTkxTLTEkCi0KLQkJCVNlY3Rpb24gc2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQkJc2VjdGlvblRpdGxlLCBzZWN0aW9uRGVzYyk7Ci0KLQkJCS8vIGNyZWF0ZSBjb21wb3NpdGUKLQkJCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCQlzZWN0aW9uLCAyLCBmYWxzZSk7Ci0KLQkJCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGVUaXRsZSk7Ci0KLQkJCWN0cmxfdGFibGVfNCA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgdGFibGVIZWlnaHQpOwotCQkJdmlld2VyXzQgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV80KTsKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJCQkoKERlbGl2ZXJ5UHJvY2VzcykgZWxlbWVudCkKLQkJCQkJCQkJCQkuZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCkpLnRvQXJyYXkoKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC50b0FycmF5KCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJdmlld2VyXzQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl2aWV3ZXJfNC5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdmlld2VyXzQuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTIKLQkJCUNvbXBvc2l0ZSBwYW5lMiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJCWN0cmxfYWRkXzQgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsKLQkJCWN0cmxfcmVtb3ZlXzQgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsKLQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCi0JCQllZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24gPSBzZWN0aW9uOwotCi0JCX0KLQotCQkvLyBoaWRlL3Nob3cgY2VydGFpbiBzZWN0aW9ucwotCQl0b2dnbGVTZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBnZXRBZGFwdGVyKCk7Ci0JCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCXBhcmVudCA9IGJzSXRlbVByb3ZpZGVyLmdldFRvcEl0ZW0oKTsKLQkJfSBlbHNlIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoIkFjdGl2aXR5R3VpZGFuY2VTZWN0aW9uOjphZGRMaXN0ZW5lcnMgLSBJQlNJdGVtUHJvdmlkZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQl7Ci0JCQljdHJsX3RhYmxlXzEuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyXzEKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMQotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQljdHJsX2FkZF8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRSb2FkTWFwRmlsdGVyKCk7Ci0JCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBlbGVtZW50LAotCQkJCQkJCUZpbHRlckNvbnN0YW50cy5ST0FETUFQLCBlbGVtZW50LmdldFJvYWRtYXBzKCkpOwotCi0JCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5ST0FETUFQKTsKLQkJCQkJZmQuc2V0SW5wdXQoVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBlbGVtZW50KSk7Ci0JCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCWFkZEd1aWRhbmNlcyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWN0cmxfcmVtb3ZlXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCXJlbW92ZUd1aWRhbmNlcyhybUl0ZW1zKTsKLQkJCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQotCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJdmlld2VyXzEuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQl7Ci0JCQljdHJsX3RhYmxlXzIuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8yCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyXzIKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMgotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQljdHJsX2FkZF8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRHZW5lcmFsR3VpZGFuY2VGaWx0ZXIoKTsKLQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsCi0JCQkJCQkJRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFLCBnZXRFeGlzdGluZ0VsZW1lbnRzKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFKTsKLQkJCQkJZmQuc2V0SW5wdXQoVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBlbGVtZW50KSk7Ci0JCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQlmZC5zZXRUeXBlcyhnZXRGaWx0ZXJUeXBlcygpKTsKLQkJCQkJZmQub3BlbigpOwotCQkJCQlhZGRHdWlkYW5jZXMoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJdmlld2VyXzIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX3JlbW92ZV8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMgotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQlyZW1vdmVHdWlkYW5jZXMocm1JdGVtcyk7Ci0JCQkJCQl2aWV3ZXJfMi5yZWZyZXNoKCk7Ci0KLQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCXZpZXdlcl8yLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJfQotCQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJewotCQkJY3RybF90YWJsZV8zLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMwotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXZpZXdlcl8zCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzMKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJfQotCQkJCQl9KTsKLQotCQkJY3RybF9hZGRfMy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQlEZWxpdmVyeVByb2Nlc3MgcHJvYyA9IChEZWxpdmVyeVByb2Nlc3MpIGVsZW1lbnQ7Ci0KLQkJCQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0U3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyKCk7Ci0JCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBwcm9jLAotCQkJCQkJCQlGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMsIHByb2MKLQkJCQkJCQkJCQkuZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSk7Ci0KLQkJCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSk7Ci0JCQkJCQlmZAotCQkJCQkJCQkuc2V0SW5wdXQoVW1hVXRpbAotCQkJCQkJCQkJCS5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBlbGVtZW50KSk7Ci0JCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwKLQkJCQkJCQkJCQlwcm9jLAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCksCi0JCQkJCQkJCQkJZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLCAtMSk7Ci0JCQkJCX0KLQotCQkJCQl2aWV3ZXJfMy5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWN0cmxfcmVtb3ZlXzMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8zCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJCQlEZWxpdmVyeVByb2Nlc3MgcHJvYyA9IChEZWxpdmVyeVByb2Nlc3MpIGVsZW1lbnQ7Ci0JCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQkJCQkJCQlwcm9jLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSwKLQkJCQkJCQkJCQkJcm1JdGVtcywgLTEpOwotCQkJCQkJfQotCQkJCQkJdmlld2VyXzMucmVmcmVzaCgpOwotCi0JCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQl2aWV3ZXJfMy5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXsKLQkJCWN0cmxfdGFibGVfNC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzQKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfNAotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl80Ci0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWN0cmxfYWRkXzQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQkJRGVsaXZlcnlQcm9jZXNzIHByb2MgPSAoRGVsaXZlcnlQcm9jZXNzKSBlbGVtZW50OwotCi0JCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldFN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlcigpOwotCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgcHJvYywKLQkJCQkJCQkJRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTLCBwcm9jCi0JCQkJCQkJCQkJLmdldEVkdWNhdGlvbk1hdGVyaWFscygpKTsKLQotCQkJCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFKTsKLQkJCQkJCWZkCi0JCQkJCQkJCS5zZXRJbnB1dChVbWFVdGlsCi0JCQkJCQkJCQkJLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGVsZW1lbnQpKTsKLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQub3BlbigpOwotCi0JCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLAotCQkJCQkJCQkJCXByb2MsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCksCi0JCQkJCQkJCQkJZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLCAtMSk7Ci0KLQkJCQkJCXZpZXdlcl80LnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX3JlbW92ZV80LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfNAotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQkJCURlbGl2ZXJ5UHJvY2VzcyBwcm9jID0gKERlbGl2ZXJ5UHJvY2VzcykgZWxlbWVudDsKLQkJCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksCi0JCQkJCQkJCQkJCXByb2MsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbHMoKSwKLQkJCQkJCQkJCQkJcm1JdGVtcywgLTEpOwotCQkJCQkJfQotCQkJCQkJdmlld2VyXzQucmVmcmVzaCgpOwotCi0JCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQl2aWV3ZXJfNC5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0KLQkJCQkJfQotCQkJCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgZ3VpZGFuY2VzIHRvIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGFkZEl0ZW1zCi0JICogCQkJCWxpc3Qgb2YgZ3VpZGFuY2VzIHRvIGFkZAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRHdWlkYW5jZXMoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQotCQlBZGRHdWlkYW5jZVRvQWN0aXZpdHlDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkR3VpZGFuY2VUb0FjdGl2aXR5Q29tbWFuZCgKLQkJCQllbGVtZW50LCBhZGRJdGVtcyk7Ci0JCWFjdGlvbk1nci5leGVjdXRlKGNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBndWlkYW5jZXMgZnJvbSB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBybUl0ZW1zCi0JICogCQkJCWxpc3Qgb2YgZ3VpZGFuY2VzIHRvIHJlbW92ZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVHdWlkYW5jZXMoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gZ3VpZGFuY2VzIGZvciBhY3Rpdml0eQotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQ2hlY2tsaXN0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQ29uY2VwdHMoKSwgaXRlbSwKLQkJCQkJCQktMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0V4YW1wbGVzKCksIGl0ZW0sCi0JCQkJCQkJLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0QWN0aXZpdHlfU3VwcG9ydGluZ01hdGVyaWFscygpLCBpdGVtLAotCQkJCQkJCS0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9HdWlkZWxpbmVzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9SZXVzYWJsZUFzc2V0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSb2FkbWFwKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUm9hZG1hcHMoKSwgaXRlbSwKLQkJCQkJCQktMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbG9nZ2VyCi0JCQkJCQkJLmxvZ0Vycm9yKCJDYW4ndCByZW1vdmUgR3VpZGFuY2U6ICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBleGlzdGluZyBndWlkYW5jZXMgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQkJbGlzdCBvZiBleGlzdGluZyBndWlkYW5jZXMuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMoKSB7Ci0KLQkJTGlzdCBpdGVtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRDaGVja2xpc3RzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRDb25jZXB0cygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0RXhhbXBsZXMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldEd1aWRlbGluZXMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldFJldXNhYmxlQXNzZXRzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkpOwotCi0JCURpYWdyYW1JbmZvIGluZm8gPSBuZXcgRGlhZ3JhbUluZm8oKEFjdGl2aXR5KSBlbGVtZW50KTsKLQkJaWYgKGluZm8uZ2V0QWN0aXZpdHlEaWFncmFtKCkgIT0gbnVsbCkKLQkJCWl0ZW1MaXN0LmFkZChpbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpKTsKLQkJaWYgKGluZm8uZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgIT0gbnVsbCkKLQkJCWl0ZW1MaXN0LmFkZChpbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpKTsKLQkJaWYgKGluZm8uZ2V0V1BERGlhZ3JhbSgpICE9IG51bGwpCi0JCQlpdGVtTGlzdC5hZGQoaW5mby5nZXRXUEREaWFncmFtKCkpOwotCi0JCXJldHVybiBpdGVtTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgc2VsZWN0ZWQgZ3VpZGFuY2VzCi0JICogQHJldHVybgotCSAqIAkJCWxpc3Qgb2Ygc2VsZWN0ZWQgZ3VpZGFuY2VzCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFNlbGVjdGVkR3VpZGFuY2VzKCkgewotCQlMaXN0IGl0ZW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldENoZWNrbGlzdHMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldENvbmNlcHRzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRFeGFtcGxlcygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0R3VpZGVsaW5lcygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0UmV1c2FibGVBc3NldHMoKSk7Ci0JCUxpc3Qgc3VwcG9ydGluZ01hdGVyaWFscyA9IGVsZW1lbnQuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpOwotCQlEaWFncmFtSW5mbyBpbmZvID0gbmV3IERpYWdyYW1JbmZvKChBY3Rpdml0eSkgZWxlbWVudCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHN1cHBvcnRpbmdNYXRlcmlhbHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKQotCQkJCWlmICghaW5mby5pc0RpYWdyYW0oKFN1cHBvcnRpbmdNYXRlcmlhbCkgb2JqKSkgewotCQkJCQlpdGVtTGlzdC5hZGQob2JqKTsKLQkJCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXRlbUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGxpc3Qgb2YgZmlsdGVyIHR5cGVzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlclR5cGVzKCkgewotCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzE0XTsKLQkJaW50IGkgPSAwOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuQ0hFQ0tMSVNUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuQ09OQ0VQVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJKyBGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkVYQU1QTEVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5HVUlERUxJTkVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5QUkFDVElDRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlJFUE9SVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlJFVVNBQkxFX0FTU0VUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRFTVBMQVRFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVE9PTF9NRU5UT1JTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5XSElURV9QQVBFUlM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRFUk1fREVGSU5JVElPTlM7Ci0JCXJldHVybiBzdHI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5Um9sbHVwU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlSb2xsdXBTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczOTVmOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlSb2xsdXBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db2x1bW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkV4cG9zZWRBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlByb2Nlc3NWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIHJvbGx1cCBzZWN0aW9uIGZvciBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpdml0eVJvbGx1cFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCS8vIGNvbnRyb2xzCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gc2VjdGlvbjsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHJvbGx1cENvbXBvc2l0ZTsKLQotCXByaXZhdGUgUHJvY2Vzc1ZpZXdlciB2aWV3ZXI7Ci0KLQkvLyBwcml2YXRlIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0JLy8gZWxlbWVudAotCXByaXZhdGUgQWN0aXZpdHkgZWxlbWVudDsKLQotCS8vIGFjdGlvbiBtYW5hZ2VyCi0JLy8gcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlOwotCi0JcHJvdGVjdGVkIENvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9yczsKLQotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQotCS8qKgotCSAqIEluaXRpYWxpemUKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IEFjdGl2aXR5IG9iamVjdAotCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgYWN0aW9uIG1hbmFnZXIKLQkJLy8gYWN0aW9uTWdyID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWN0aW9uTWFuYWdlcigpOwotCi0JCS8vIGdldCBwcmVmZXJlbmNlIHN0b3JlCi0JCXN0b3JlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCi0JCS8vIHRoaXMudGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgPSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gY3JlYXRlIHJvbGx1cCBzZWN0aW9uCi0JCWNyZWF0ZVJvbGx1cFNlY3Rpb24ocGFyZW50KTsKLQotCQkvLyBhZGRMaXN0ZW5lcnMoKTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSByb2xsdXAgc2VjdGlvbiBvbiB0aGUgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVSb2xsdXBTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gY3JlYXRlIHNlY3Rpb24KLQkJc2VjdGlvbiA9IEZvcm1VSQotCQkJCS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Xb3JrUm9sbHVwLCAvLyROT04tTkxTLTEkCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBjcmVhdGUgcm9sbHVwIGNvbXBvc2l0ZQotCQlyb2xsdXBDb21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb24sIDIsIGZhbHNlKTsKLQotCQkvLyBzZXQgc2VjdGlvbiBsYWJlbHMKLQkJc2V0U2VjdGlvbkxhYmVscygpOwotCi0JCS8vIGNyZWF0ZSB2aWV3ZXIKLQkJdmlld2VyID0gbmV3IFByb2Nlc3NWaWV3ZXIocm9sbHVwQ29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDEwOwotCQkvLyBncmlkRGF0YS5oZWlnaHRIaW50ID0gNjAwOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIGluaXRBZGFwdGVyRmFjdG9yeQotCQlpbml0QWRhcHRlckZhY3RvcnkoKTsKLQotCQkvLyBzZXQgdXAgY29sdW1ucwotCQl2aWV3ZXIuc2V0dXBDb2x1bW5zKGNvbHVtbkRlc2NyaXB0b3JzKTsKLQkJc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoYWRhcHRlckZhY3RvcnksIGNvbHVtbkRlc2NyaXB0b3JzKTsKLQotCQkvLyBzZXQgdXAgcHJvdmlkZXJzCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQl2aWV3ZXIKLQkJCQkuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQkJYWRhcHRlckZhY3RvcnkpKTsKLQotCQkvLyBkbyByb2xsIHVwCi0JCXJvbGxVcCgpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJvbGxVcCgpIHsKLQkJLy8gc2V0IHVwIGNvbHVtbnMKLQkJdmlld2VyLnNldElucHV0KGVsZW1lbnQpOwotCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWFkYXB0ZXIuc2V0Um9sbGVkVXAodHJ1ZSk7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LAotCQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbkRlc2NyaXB0b3JzKSB7Ci0JCU1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbHVtbkluZGV4VG9OYW1lTWFwLnB1dChuZXcgSW50ZWdlcihpKSwgY29sdW1uRGVzY3JpcHRvcnNbaV0uaWQpOwotCQl9Ci0JCSgoSUNvbHVtbkF3YXJlKSBmYWN0b3J5KS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChjb2x1bW5JbmRleFRvTmFtZU1hcCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCS8vIGdldCBBY3Rpdml0eSBvYmplY3QKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQotCQkJCXJvbGxVcCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgYWN0aXZpdHkgd29yayByb2xsIHVwIHNlY3Rpb24iLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgYWRhcHRlciBmYWN0b3J5Ci0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0QWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIFNldCBsYWJlbCBmb3IgdGhlIHNlY3Rpb24KLQkgKgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldFNlY3Rpb25MYWJlbHMoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5VGVhbVJvbGx1cFNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5VGVhbVJvbGx1cFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA4NzY5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVRlYW1Sb2xsdXBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByb2Nlc3NGb3JtVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogVGhlIHRlYW0gcm9sbHVwIHNlY3Rpb24gZm9yIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5VGVhbVJvbGx1cFNlY3Rpb24gZXh0ZW5kcyBBY3Rpdml0eVJvbGx1cFNlY3Rpb24gewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlSb2xsdXBTZWN0aW9uI2luaXRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEFkYXB0ZXJGYWN0b3J5KCkgewotCQkvLyBnZXQgY29sdW1uIGRlc2NyaXB0b3JzCi0JCWNvbHVtbkRlc2NyaXB0b3JzID0gUHJvY2Vzc0Zvcm1VdGlsLnRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TKSk7Ci0KLQkJLy8gY3JlYXRlIGFkYXB0ZXIgZmFjdG9yeQotCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVRCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJLnNldEZpbHRlcihjb25maWd1cmF0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlSb2xsdXBTZWN0aW9uI3NldFNlY3Rpb25MYWJlbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNlY3Rpb25MYWJlbHMoKSB7Ci0JCXNlY3Rpb24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1RlYW1Sb2xsdXApOyAKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVdvcmtQcm9kdWN0c1JvbGx1cFNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5V29ya1Byb2R1Y3RzUm9sbHVwU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDM2NDFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5V29ya1Byb2R1Y3RzUm9sbHVwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRm9ybVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoZSB3b3JrIHByb2R1Y3RzIHJvbGx1cCBzZWN0aW9uIGZvciBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVdvcmtQcm9kdWN0c1JvbGx1cFNlY3Rpb24gZXh0ZW5kcyBBY3Rpdml0eVJvbGx1cFNlY3Rpb24gewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlSb2xsdXBTZWN0aW9uI2luaXRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEFkYXB0ZXJGYWN0b3J5KCkgewotCQkvLyBnZXQgY29sdW1uIGRlc2NyaXB0b3JzCi0JCWNvbHVtbkRlc2NyaXB0b3JzID0gUHJvY2Vzc0Zvcm1VdGlsLnRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUykpOwotCi0JCS8vIGNyZWF0ZSBhZGFwdGVyIGZhY3RvcnkKLQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eVJvbGx1cFNlY3Rpb24jc2V0U2VjdGlvbkxhYmVscygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VjdGlvbkxhYmVscygpIHsKLQkJc2VjdGlvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwKTsgLy8kTk9OLU5MUy0xJAotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlXb3JrUm9sbHVwU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlXb3JrUm9sbHVwU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMmVlMzQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5V29ya1JvbGx1cFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db2x1bW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIFRoZSB3b3JrIHJvbGx1cCBzZWN0aW9uIGZvciBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVdvcmtSb2xsdXBTZWN0aW9uIGV4dGVuZHMgQWN0aXZpdHlSb2xsdXBTZWN0aW9uIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFjdGl2aXR5Um9sbHVwU2VjdGlvbiNpbml0QWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJLy8gZ2V0IGNvbHVtbiBkZXNjcmlwdG9ycwotCQljb2x1bW5EZXNjcmlwdG9ycyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSk7Ci0KLQkJLy8gY3JlYXRlIGFkYXB0ZXIgZmFjdG9yeQotCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVdCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgc3RyaW5nIGludG8gY29sdW0gZGVzY3JpcHRvciBsaXN0Ci0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4KLQkgKiAJCUxpc3Qgb2YgY29sdW1uIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBFTGlzdCB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KFN0cmluZyBzdHIpIHsKLQkJRUxpc3QgY29sdW1uRGVzY3JpcHRvcnMgPSBuZXcgQmFzaWNFTGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCS8vIERPTiJUIFBVVCBJTkRFWCBDT0xVTU4KLQkJCWlmICghKHRva2VuLmVxdWFscyhQcm9jZXNzRWRpdG9yLkNPTF9ERVNDX0lELmlkKSkpIHsKLQkJCQlPYmplY3QgY29sdW1uRGVzY3JpcHRvciA9IFByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAKLQkJCQkJCS5nZXQodG9rZW4pOwotCQkJCWlmIChjb2x1bW5EZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJY29sdW1uRGVzY3JpcHRvcnMuYWRkKGNvbHVtbkRlc2NyaXB0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sdW1uRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBzdHJpbmcgaW50byBjb2x1bW4gZGVzY3JpcHRvcnMKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqIAkJbGlzdCBvZiBjb2x1bW4gZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbHVtbkRlc2NyaXB0b3JbXSB0b0NvbHVtbkRlc2NyaXB0b3JzKFN0cmluZyBzdHIpIHsKLQkJTGlzdCBsaXN0ID0gdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChzdHIpOwotCQlDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1ucyA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KGNvbHVtbnMpOwotCQlyZXR1cm4gY29sdW1uczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eVJvbGx1cFNlY3Rpb24jc2V0U2VjdGlvbkxhYmVscygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VjdGlvbkxhYmVscygpIHsKLQkJc2VjdGlvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfV29ya1JvbGx1cCk7IAotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfV29ya1JvbGx1cERlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjgwOTRmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLk1ldGhvZEZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5EZWNvcmF0ZWRGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIGJyZWFrZG93biBlbGVtZW50IGRvY3VtZW50YXRpb24gc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQotCS8vIGNvbnRyb2xzCi0JcHJvdGVjdGVkIFRleHQgcHJlZml4VGV4dDsKLQotCXByb3RlY3RlZCBUZXh0IGJyaWVmRGVzY1RleHQ7Ci0KLQlwcm90ZWN0ZWQgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGRvY3VtZW50U2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZG9jdW1lbnRDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGV4cGFuZERvY3VtZW50Q29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2RvY3VtZW50X2V4cGFuZGVkOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCB1c2FnZUd1aWRhbmNlOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBrZXlDb25zaWRlcmF0aW9uczsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWRfVGV4dDsKLQotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBleHBhbmREb2N1bWVudExpbms7Ci0KLQlwcm90ZWN0ZWQgRGVjb3JhdGVkRmllbGQgZXhwYW5kRG9jdW1lbnRMYWJlbDsKLQotCXByb3RlY3RlZCBib29sZWFuIGV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGV4cGFuZEZsYWdUZXh0ID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGFjdGl2ZUNvbnRyb2w7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBhY3RpdmVDb250cm9sVGV4dDsKLQotCS8vIGVsZW1lbnQKLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLy8gbW9kaWZ5IGxpc3RlbmVyCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIG1vZGVsTW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgY29udGVudE1vZGlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIFN0cmluZyBjb250ZW50RWxlbWVudFBhdGg7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBjb250ZW50RWxlbWVudE5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGludCBoZWlnaHRIaW50ID0gNDA7Ci0JCi0JcHJpdmF0ZSBMaXN0ZW5lciB1c2FnZUd1aWRhbmNlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IHVzYWdlR3VpZGFuY2U7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRVc2FnZUd1aWRhbmNlKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJdXNhZ2VHdWlkYW5jZSwgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpLAotCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgTGlzdGVuZXIga2V5Q29uc2lkZXJhdGlvbnNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCToga2V5Q29uc2lkZXJhdGlvbnM7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChDb250ZW50RGVzY3JpcHRpb24pIGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJCS5nZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCWtleUNvbnNpZGVyYXRpb25zLCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpLCBuZXdDb250ZW50LAotCQkJCQkJLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEluaXRpYWxpemUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBnZXQgQnJlYWtkb3duRWxlbWVudCBvYmplY3QKLQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgYWN0aW9uIG1hbmFnZXIKLQkJYWN0aW9uTWdyID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWN0aW9uTWFuYWdlcigpOwotCi0JCS8vIHNldCBjb250ZW50IGVsZW1lbnQgcGF0aAotCQlTdHJpbmcgbGliUGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCk7Ci0JCWNvbnRlbnRFbGVtZW50UGF0aCA9IGxpYlBhdGggKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbWVudCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgRG9jbWVudCBzZWN0aW9uCi0JCWNyZWF0ZURvY3VtZW50U2VjdGlvbihwYXJlbnQpOwotCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRyb2xzCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQotCQlwcmVmaXhUZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQlwcmVmaXhUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbC5nZXRQbGFpblRleHQocHJlZml4VGV4dC5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSwgbmV3Q29udGVudCwKLQkJCQkJCQktMSk7Ci0JCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCXByZWZpeFRleHQuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYnJpZWZEZXNjVGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gZWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQlicmllZkRlc2NUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbC5nZXRQbGFpblRleHQoYnJpZWZEZXNjVGV4dAotCQkJCQkJLmdldFRleHQoKSk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCWJyaWVmRGVzY1RleHQuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQkKLQkJdXNhZ2VHdWlkYW5jZS5zZXRNb2RhbE9iamVjdChlbGVtZW50KTsKLQkJdXNhZ2VHdWlkYW5jZS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSk7Ci0JCXVzYWdlR3VpZGFuY2UuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIHVzYWdlR3VpZGFuY2VMaXN0ZW5lcik7Ci0JCQotCQlrZXlDb25zaWRlcmF0aW9ucy5zZXRNb2RhbE9iamVjdChlbGVtZW50KTsKLQkJa2V5Q29uc2lkZXJhdGlvbnMuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpKTsKLQkJa2V5Q29uc2lkZXJhdGlvbnMKLQkJCQkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGtleUNvbnNpZGVyYXRpb25zTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZCBkb2N1bWVudGF0aW9uIHNlY3Rpb24gb24gdGhlIGdpdmVuIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb2N1bWVudFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpbnQgaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0JCS8vIGNyZWF0ZSBkb2N1bWVudCBzZWN0aW9uCi0JCWRvY3VtZW50U2VjdGlvbiA9IEZvcm1VSQotCQkJCS5jcmVhdGVTZWN0aW9uKAotCQkJCQkJdG9vbGtpdCwKLQkJCQkJCWNvbXBvc2l0ZSwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuYmluZChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uLCBQcm9wZXJ0aWVzVXRpbC5nZXRUeXBlTG93ZXIoZWxlbWVudCkpKTsgCi0KLQkJLy8gY3JlYXRlIGRvY3VtZW50IGNvbXBvc2l0ZQotCQlkb2N1bWVudENvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgZG9jdW1lbnRTZWN0aW9uLCAzLAotCQkJCWZhbHNlKTsKLQotCQkvLyBwcmVmaXgKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGRvY3VtZW50Q29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfcHJlZml4LCBob3Jpem9udGFsU3Bhbik7IC8vJE5PTi1OTFMtMSQKLQkJcHJlZml4VGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGRvY3VtZW50Q29tcG9zaXRlLCBoZWlnaHRIaW50KTsKLQotCQkvLyBicmllZiBkZXNjcmlwdGlvbgotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZG9jdW1lbnRDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19icmllZkRlc2NyaXB0aW9uLCBob3Jpem9udGFsU3Bhbik7IC8vJE5PTi1OTFMtMSQKLQkJYnJpZWZEZXNjVGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGRvY3VtZW50Q29tcG9zaXRlLAotCQkJCWhlaWdodEhpbnQpOwotCi0JCS8vIGNyZWF0ZSB1c2FnZSBndWlkYW5jZQotCQlSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciB1c2FnZUd1aWRhbmNlQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc191c2FnZUd1aWRhbmNlKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIodXNhZ2VHdWlkYW5jZUNvbnRhaW5lci5saW5rKTsKLQkJdXNhZ2VHdWlkYW5jZSA9IHVzYWdlR3VpZGFuY2VDb250YWluZXIucmljaFRleHQ7Ci0KLQkJLy8gY3JlYXRlIGtleSBjb25zaWRlcmF0aW9ucwotCQlSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciBrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfa2V5Q29uc2lkZXJhdGlvbnMpOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lci5saW5rKTsKLQkJa2V5Q29uc2lkZXJhdGlvbnMgPSBrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lci5yaWNoVGV4dDsKLQotCQkvLyBjcmVhdGUgZXhwYW5kZWQgY29tcG9zaXRlCi0JCWV4cGFuZERvY3VtZW50Q29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCWRvY3VtZW50U2VjdGlvbiwgMiwgdHJ1ZSk7Ci0KLQkJLy8gSHlwZXJsaW5rIGRlc2MKLQkJZXhwYW5kRG9jdW1lbnRMaW5rID0gRm9ybVVJLmNyZWF0ZUltYWdlSHlwZXJMaW5rKHRvb2xraXQsCi0JCQkJZXhwYW5kRG9jdW1lbnRDb21wb3NpdGUsIEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5jbG9zZVJURSk7IAotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihleHBhbmREb2N1bWVudExpbmspOwotCi0JCS8vIGV4cGFuZCBsYWJlbAotCQlleHBhbmREb2N1bWVudExhYmVsID0gQmFzZUZvcm1QYWdlLmNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIGV4cGFuZERvY3VtZW50Q29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIeXBlckxpbmtMaXN0ZW5lcihJbWFnZUh5cGVybGluayBsaW5rKSB7Ci0JCWxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHRFZGl0b3IgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJSU1ldGhvZFJpY2hUZXh0IGN0cmwgPSAoSU1ldGhvZFJpY2hUZXh0KSBlLmdldEhyZWYoKTsKLQkJaWYgKGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQgPT0gbnVsbCkgewotCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZCA9IE1ldGhvZEZvcm1Ub29sa2l0LmNyZWF0ZVJpY2hUZXh0RWRpdG9yKAotCQkJCQl0b29sa2l0LCBleHBhbmREb2N1bWVudENvbXBvc2l0ZSwKLQkJCQkJIiIsIFNXVC5NVUxUSSB8IFNXVC5XUkFQLCBjb250ZW50RWxlbWVudFBhdGgsIGVsZW1lbnQsIGV4cGFuZERvY3VtZW50TGFiZWwsIGdldEVkaXRvcigpLmdldEVkaXRvclNpdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDA7Ci0JCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQl9Ci0KLQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCi0JCWlmIChleHBhbmRGbGFnKSB7Ci0JCQlkb2N1bWVudENvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZG9jdW1lbnRTZWN0aW9uLnNldENsaWVudChkb2N1bWVudENvbXBvc2l0ZSk7Ci0KLQkJCWV4cGFuZERvY3VtZW50Q29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCi0JCQljdHJsID0gZ2V0QWN0aXZlUmljaFRleHRDb250cm9sKCk7Ci0JCQljdHJsLnNldFRleHQoY3RybF9kb2N1bWVudF9leHBhbmRlZC5nZXRUZXh0KCkpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBjdHJsLmdldExpc3RlbmVycygpOyBpLmhhc05leHQoKTspIHsKLQkJCQlSaWNoVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gKFJpY2hUZXh0TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIuZ2V0RXZlbnRUeXBlKCksCi0JCQkJCQlsaXN0ZW5lci5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQotCQkJaWYgKGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuZ2V0TW9kaWZpZWQoKSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkuc2F2ZU1vZGlmaWVkUmljaFRleHQoY3RybF9kb2N1bWVudF9leHBhbmRlZCk7Ci0JCQl9Ci0KLQkJCWN0cmwuc2V0Rm9jdXMoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGV4cGFuZGVkCi0JCQlkb2N1bWVudENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWRvY3VtZW50U2VjdGlvbi5zZXRDbGllbnQoZXhwYW5kRG9jdW1lbnRDb21wb3NpdGUpOwotCi0JCQlleHBhbmREb2N1bWVudENvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCi0JCQkoKExhYmVsKWV4cGFuZERvY3VtZW50TGFiZWwuZ2V0Q29udHJvbCgpKS5zZXRUZXh0KChTdHJpbmcpICgoSW1hZ2VIeXBlcmxpbmspIGUKLQkJCQkJLmdldFNvdXJjZSgpKS5nZXREYXRhKCJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0QWN0aXZlUmljaFRleHRDb250cm9sKGN0cmwpOwotCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRJbml0aWFsVGV4dChjdHJsLmdldFRleHQoKSk7Ci0JCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGN0cmwuZ2V0TW9kYWxPYmplY3QoKSk7Ci0JCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0RmVhdHVyZShjdHJsCi0JCQkJCS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKSk7Ci0JCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldEZpbmRSZXBsYWNlQWN0aW9uKGN0cmwuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaSA9IGN0cmwuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5hZGRMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwKLQkJCQkJCWxpc3RlbmVyLmdldExpc3RlbmVyKCkpOwotCQkJfQotCi0JCX0KLQotCQlkb2N1bWVudFNlY3Rpb24ubGF5b3V0KHRydWUpOwotCi0JCS8vIHNldCBlZGl0YWJsZQotCQlpZiAoY3RybF9kb2N1bWVudF9leHBhbmRlZCAhPSBudWxsKQotCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0KLQkJZXhwYW5kRmxhZyA9ICFleHBhbmRGbGFnOwotCQlyZXR1cm4gY3RybF9kb2N1bWVudF9leHBhbmRlZDsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2F2ZU1vZGlmaWVkUmljaFRleHQoKTsKLQotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCi0JCQkJLy8gdXBkYXRlIHNlY3Rpb24gbmFtZQotCQkJCWRvY3VtZW50U2VjdGlvbgotCQkJCQkJLnNldERlc2NyaXB0aW9uKFByb3BlcnRpZXNSZXNvdXJjZXMuYmluZChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uLCBQcm9wZXJ0aWVzVXRpbC5nZXRUeXBlTG93ZXIoZWxlbWVudCkpKTsgCi0KLQkJCQlpZiAobW9kZWxNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCXByZWZpeFRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCWJyaWVmRGVzY1RleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJfQotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCXVzYWdlR3VpZGFuY2UucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJa2V5Q29uc2lkZXJhdGlvbnMKLQkJCQkJCQkucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQl9Ci0KLQkJCQltb2RlbE1vZGlmeUxpc3RlbmVyID0gZ2V0RWRpdG9yKCkuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoZWxlbWVudCk7Ci0JCQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZ2V0RWRpdG9yKCkuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoCi0JCQkJCQllbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQotCQkJCWlmIChtb2RlbE1vZGlmeUxpc3RlbmVyICE9IG51bGwKLQkJCQkJCSYmIG1vZGVsTW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgbW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBtb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCQkJCX0KLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgIT0gbnVsbAotCQkJCQkJJiYgY29udGVudE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RWxlbWVudChlbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0JCQkJfQotCi0JCQkJcHJlZml4VGV4dC5zZXRUZXh0KGVsZW1lbnQuZ2V0UHJlZml4KCkpOwotCQkJCWJyaWVmRGVzY1RleHQuc2V0VGV4dChlbGVtZW50LmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0KLQkJCQl1c2FnZUd1aWRhbmNlLnNldFRleHQoY29udGVudC5nZXRVc2FnZUd1aWRhbmNlKCkpOwotCQkJCWtleUNvbnNpZGVyYXRpb25zLnNldFRleHQoY29udGVudC5nZXRLZXlDb25zaWRlcmF0aW9ucygpKTsKLQotCQkJCWlmIChleHBhbmRGbGFnKSB7Ci0JCQkJCWlmICgoKExhYmVsKWV4cGFuZERvY3VtZW50TGFiZWwuZ2V0Q29udHJvbCgpKS5nZXRUZXh0KCkuZXF1YWxzKAotCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc191c2FnZUd1aWRhbmNlKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFRleHQoY29udGVudAotCQkJCQkJCQkuZ2V0VXNhZ2VHdWlkYW5jZSgpKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0U2VsZWN0aW9uKDApOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJCQkJLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpKTsKLQkJCQkJfSBlbHNlIGlmICgoKExhYmVsKWV4cGFuZERvY3VtZW50TGFiZWwuZ2V0Q29udHJvbCgpKQotCQkJCQkJCS5nZXRUZXh0KCkKLQkJCQkJCQkuZXF1YWxzKAotCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5CcmVha2Rvd25FbGVtZW50X2tleUNvbnNpZGVyYXRpb25zKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFRleHQoY29udGVudAotCQkJCQkJCQkuZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQkJCQlpZiAobW9kZWxNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBtb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKGZhbHNlKTsKLQkJCQl9Ci0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUoZmFsc2UpOwotCQkJCX0KLQotCQkJCXByZWZpeFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJYnJpZWZEZXNjVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCXVzYWdlR3VpZGFuY2Uuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJdXNhZ2VHdWlkYW5jZS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpKTsKLQkJCQl1c2FnZUd1aWRhbmNlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQlrZXlDb25zaWRlcmF0aW9ucy5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQlrZXlDb25zaWRlcmF0aW9ucy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSk7Ci0JCQkJa2V5Q29uc2lkZXJhdGlvbnMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciByZWZyZXNoaW5nIGJyZWFrZG93biBlbGVtZW50IGRvY3VtZW50YXRpb24gc2VjdGlvbiIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXByZWZpeFRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlicmllZkRlc2NUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJdXNhZ2VHdWlkYW5jZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWtleUNvbnNpZGVyYXRpb25zLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhY3RpdmUgInVuZXhwYW5kZWQiIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woSU1ldGhvZFJpY2hUZXh0IGN0cmwpIHsKLQkJYWN0aXZlQ29udHJvbCA9IGN0cmw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0aXZlICJ1bmV4cGFuZGVkIiByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBnZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woKSB7Ci0JCXJldHVybiBhY3RpdmVDb250cm9sOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjYyNTBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnZpZXcuVGFiYmVkUHJvcGVydHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllcy50YWJiZWQudmlldy5UYWJiZWRQcm9wZXJ0eVRpdGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIGdlbmVyYWwgdGFiIHNlY3Rpb24gZm9yIGJyZWFrZG93bkVsZW1lbnQKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQkvLyBjb250cm9scwotCXByb3RlY3RlZCBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gZ2VuZXJhbFNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGdlbmVyYWxDb21wb3NpdGUsIGNoZWNrQm94Q29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBwcmVzZW50YXRpb25OYW1lVGV4dDsKLQotCXByaXZhdGUgQnV0dG9uIG11bHRpcGxlQnV0dG9uLCBvcHRpb25hbEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHBsYW5uZWRCdXR0b24sIHN1cHJlc3NlZEJ1dHRvbjsKLQotCXByb3RlY3RlZCBpbnQgbnVtT2ZDb2x1bW5zID0gNDsKLQotCXByb3RlY3RlZCBpbnQgaG9yaXpvbnRhbFNwYW4gPSAzOwotCi0JLy8gcHJpdmF0ZSBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCS8vIGVsZW1lbnQKLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLy8gbW9kaWZ5IGxpc3RlbmVyCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIG1vZGVsTW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgbmFtZU1vZGlmeUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JZmluYWwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBMaXN0ZW5lciBuYW1lRGVhY3RpdmF0ZUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IEVQRlByb3BlcnR5U2hlZXRQYWdlCi0JCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCi0JCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCVN0cmluZyBvbGRDb250ZW50ID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJbmFtZVRleHQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0JCQlpZiAoIVN0clV0aWwuaXNCbGFuayhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEVkaXRvcigpCi0JCQkJCQkuZ2V0U3VwcHJlc3Npb24oKTsKLQkJCQltZXNzYWdlID0gUHJvY2Vzc1V0aWwuY2hlY2tCcmVha2Rvd25FbGVtZW50TmFtZSgKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBlbGVtZW50LCBuYW1lVGV4dC5nZXRUZXh0KCksCi0JCQkJCQlzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JCQl9Ci0JCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQkJaWYgKCFuYW1lVGV4dC5nZXRUZXh0KCkuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCQkJCSYmIChlbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKSB7Ci0JCQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gKFByb2Nlc3NDb21wb25lbnQpIGVsZW1lbnQKLQkJCQkJCQkJLmVDb250YWluZXIoKTsKLQkJCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmNyZWF0ZU5hbWVWYWxpZGF0b3IoCi0JCQkJCQkJCQkJcHJvY0NvbXAsCi0JCQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQobmFtZVRleHQuZ2V0VGV4dCgpKTsKLQotCQkJCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJCQkJbXNnID0gUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbmFtZV9NZXNzYWdlOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW5hbWVfVGl0bGUsIG1zZykpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQkJCQkJCW5hbWVUZXh0LmdldFRleHQoKSwgLTEpOwotCQkJCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQkJLy8gbmFtZVRleHQuc2V0VGV4dChlbGVtZW50LmdldE5hbWUoKSk7Ci0KLQkJCQkJCQkJfQotCQkJCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCXByb2NDb21wLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCQkJCQkJbmFtZVRleHQuZ2V0VGV4dCgpLCAtMSk7Ci0JCQkJCQkJCWdldEVkaXRvcigpLnNldFBhcnROYW1lKCk7Ci0KLQkJCQkJCQkJLy8gYWRqdXN0IHBsdWdpbiBsb2NhdGlvbiBhbmQgc2F2ZSB0aGUKLQkJCQkJCQkJLy8gZWRpdG9yCi0JCQkJCQkJCS8vCi0JCQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkKLQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJCQkJCQkJCQllZGl0b3IKLQkJCQkJCQkJCQkJCS5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGVkaXRvcgotCQkJCQkJCQkJCQkJLmdldFBlcnNpc3RlcigpOwotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCXBlcnNpc3RlcgotCQkJCQkJCQkJCQkJCS5hZGp1c3RMb2NhdGlvbihlbGVtZW50Ci0JCQkJCQkJCQkJCQkJCQkuZVJlc291cmNlKCkpOwotCQkJCQkJCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJCQkJCQl0aHJvdyBlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQotCQkJCQkJCQl9KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyByZXBsYWNlIHdpdGggZXhpc3RpbmcgbmFtZQotCQkJCQkJCQluYW1lVGV4dC5zZXRUZXh0KG9sZENvbnRlbnQpOwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyByZXN0b3JlIHRoZSBvbGQgbmFtZSBmaXJzdCwgdGhlbiBwcmVzZW50IHRoZQotCQkJCQkJCS8vIGVycm9yIG1lc3NhZ2UgYm94Ci0JCQkJCQkJbmFtZVRleHQuc2V0VGV4dChvbGRDb250ZW50KTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfSW52YWxpZE5hbWVUaXRsZSwgbXNnKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQkJCW5hbWVUZXh0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQluYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJCQkJCQkJbmFtZVRleHQuc2VsZWN0QWxsKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJCQkJCQluYW1lVGV4dC5nZXRUZXh0KCksIC0xKTsKLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyByZXN0b3JlIHRoZSBvbGQgbmFtZSBmaXJzdCwgdGhlbiBwcmVzZW50IHRoZSBlcnJvcgotCQkJCS8vIG1lc3NhZ2UgYm94Ci0JCQkJbmFtZVRleHQuc2V0VGV4dChvbGRDb250ZW50KTsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfSW52YWxpZE5hbWVUaXRsZSwgbWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQluYW1lVGV4dC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbmFtZVRleHQuc2V0Rm9jdXMoKTsKLQkJCQkJCW5hbWVUZXh0LnNlbGVjdEFsbCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgTGlzdGVuZXIgcHJlc2VudGF0aW9uTmFtZURlYWN0aXZhdGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZQotCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQotCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9IGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCQkJCi0JCQkvLyB5b3UgY2FuIGhhdmUgYmxhbmsgcHJlc2VudGF0aW9uIG5hbWUgZm9yIGFjdGl2aXR5IHRoYXQgZXh0ZW5kcyAKLQkJCWlmIChTdHJVdGlsLmlzQmxhbmsocHJlc2VudGF0aW9uTmFtZVRleHQuZ2V0VGV4dCgpKQotCQkJCQkmJiBlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLQkJCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwKLQkJCQkJCSYmIHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpLmVxdWFscygKLQkJCQkJCQkJVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkpIHsKLQkJCQkJCi0JCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJCWlmICghcHJlc2VudGF0aW9uTmFtZVRleHQuZ2V0VGV4dCgpLmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQkJCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5nZXRUZXh0KCksIC0xKTsKLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoIVN0clV0aWwuaXNCbGFuayhlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSkpIHsKLQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEVkaXRvcigpCi0JCQkJCQkuZ2V0U3VwcHJlc3Npb24oKTsKLQkJCQltZXNzYWdlID0gUHJvY2Vzc1V0aWwKLQkJCQkJCS5jaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJCQlhZGFwdGVyRmFjdG9yeSwgZWxlbWVudCwKLQkJCQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuZ2V0VGV4dCgpLCBzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JCQl9Ci0KLQkJCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCWlmICghcHJlc2VudGF0aW9uTmFtZVRleHQuZ2V0VGV4dCgpLmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQkJCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LmdldFRleHQoKSwgLTEpOwotCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyByZXN0b3JlIHRoZSBvbGQgbmFtZSBmaXJzdCwgdGhlbiBwcmVzZW50IHRoZSBlcnJvcgotCQkJCS8vIG1lc3NhZ2UgYm94Ci0JCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuc2V0VGV4dChlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0KLQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfSW52YWxpZE5hbWVUaXRsZSwgbWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuc2V0Rm9jdXMoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfTsKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBnZXQgQnJlYWtkb3duRWxlbWVudCBvYmplY3QKLQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgYWN0aW9uIG1hbmFnZXIKLQkJYWN0aW9uTWdyID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWN0aW9uTWFuYWdlcigpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCQlpbml0KCk7Ci0JCS8vIHRoaXMudGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgPSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gY3JlYXRlIGdlbmVyYWwgc2VjdGlvbgotCQljcmVhdGVHZW5lcmFsU2VjdGlvbihwYXJlbnQpOwotCi0JCS8vIGFkZExpc3RlbmVycwotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyB1cGRhdGUgY29udHJvbHMKLQkJdXBkYXRlQ29udHJvbHMoKTsKLQotCX0KLQotCS8qKgotCSAqICBBZGQgbGlzdGVuZXJzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQluYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihldmVudC53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCX0KLQkJCQotCQl9KTsKLQkJbmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5hbWVEZWFjdGl2YXRlTGlzdGVuZXIpOwotCi0JCXByZXNlbnRhdGlvbk5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGV2ZW50LndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQkJfQotCQkJCi0JCX0pOwkJCi0JCXByZXNlbnRhdGlvbk5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBwcmVzZW50YXRpb25OYW1lRGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQotCQltdWx0aXBsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YobXVsdGlwbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpLCAtMSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJCW11bHRpcGxlQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50Ci0JCQkJCQkJLmdldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKS5ib29sZWFuVmFsdWUoKSk7Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJb3B0aW9uYWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKSwgQm9vbGVhbgotCQkJCQkJCQkudmFsdWVPZihvcHRpb25hbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJb3B0aW9uYWxCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNPcHRpb25hbCgpCi0JCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlwbGFubmVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKSwgQm9vbGVhbgotCQkJCQkJCQkudmFsdWVPZihwbGFubmVkQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlwbGFubmVkQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzUGxhbm5lZCgpCi0JCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJc3VwcmVzc2VkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlpZiAoZWxlbWVudC5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJLy8gcmV2ZWFsaW5nCi0JCQkJCVByb2Nlc3NFZGl0b3IgZWRpdG9yID0gZ2V0RWRpdG9yKCk7Ci0JCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gZWRpdG9yLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJCWJvb2xlYW4gY2FuUmV2ZWFsID0gUHJvY2Vzc0VkaXRvci5jYW5SZXZlYWwoCi0JCQkJCQkJQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10geyBlbGVtZW50IH0pLAotCQkJCQkJCUVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJc3VwcHJlc3Npb24pOwotCQkJCQotCQkJCQlpZiAoIWNhblJldmVhbCkJCQkJCQotCQkJCQkJc3VwcmVzc2VkQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsJCi0JCQkJCWVsc2UKLQkJCQkJCXN1cHJlc3NlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCX0KLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCksIEJvb2xlYW4KLQkJCQkJCQkJLnZhbHVlT2Yoc3VwcmVzc2VkQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlzdXByZXNzZWRCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGdlbmVyYWwgc2VjdGlvbiBvbiB0aGUgZ2l2ZW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gY3JlYXRlIGdlbmVyYWwgc2VjdGlvbgotCQlnZW5lcmFsU2VjdGlvbiA9IEZvcm1VSQotCQkJCS5jcmVhdGVTZWN0aW9uKAotCQkJCQkJdG9vbGtpdCwKLQkJCQkJCWNvbXBvc2l0ZSwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25UaXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5iaW5kKFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbiwgUHJvcGVydGllc1V0aWwuZ2V0VHlwZUxvd2VyKGVsZW1lbnQpKSk7IAotCi0JCS8vIGNyZWF0ZSBnZW5lcmFsIGNvbXBvc2l0ZQotCQlnZW5lcmFsQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBnZW5lcmFsU2VjdGlvbiwKLQkJCQludW1PZkNvbHVtbnMsIGZhbHNlKTsKLQotCQkvLyBuYW1lCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJbmFtZVRleHQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBTV1QuREVGQVVMVCwKLQkJCQlob3Jpem9udGFsU3Bhbik7Ci0KLQkJLy8gcHJlc2VudGF0aW9uIG5hbWUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfcHJlc2VudGF0aW9uTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJcHJlc2VudGF0aW9uTmFtZVRleHQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCBob3Jpem9udGFsU3Bhbik7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZSBmb3IgY2hlY2tib3gKLQkJY2hlY2tCb3hDb21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBudW1PZkNvbHVtbnMsIHRydWUpOwotCi0JCS8vIG9wdGlvbmFsCi0JCW9wdGlvbmFsQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTEpOwotCQlvcHRpb25hbEJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9PcHRpb25fT3B0aW9uYWwpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gTXVsdGlwbGUgT2N1cnJhbmNlcwotCQltdWx0aXBsZUJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVDaGVja0J1dHRvbih0b29sa2l0LCBjaGVja0JveENvbXBvc2l0ZSwKLQkJCQkxKTsKLQkJbXVsdGlwbGVCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX011bHRpcGxlT2N1cnJhbmNlKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHBsYW5uZWQKLQkJcGxhbm5lZEJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVDaGVja0J1dHRvbih0b29sa2l0LCBjaGVja0JveENvbXBvc2l0ZSwKLQkJCQkxKTsKLQkJcGxhbm5lZEJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9PcHRpb25fUGxhbm5lZCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBzdXByZXNzZWQKLQkJc3VwcmVzc2VkQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTEpOwotCQlzdXByZXNzZWRCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N1cHJlc3NlZCk7IC8vJE5PTi1OTFMtMSQKLQkJc3VwcmVzc2VkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGdlbmVyYWxDb21wb3NpdGUpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihjaGVja0JveENvbXBvc2l0ZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgbGlzdG5lciBmb3IgbmFtZSBhbmQgcHJlc2VudGF0aW9uIG5hbWUKLQkgKgotCSAqLwotCXB1YmxpYyBjbGFzcyBOYW1lTW9kaWZ5TGlzdGVuZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyIHsKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JCSAqLwotCi0JCXB1YmxpYyBOYW1lTW9kaWZ5TGlzdGVuZXIoRU9iamVjdCBlbGVtZW50LCBib29sZWFuIGNoZWNrQ29udGFpbmVyKSB7Ci0KLQkJCWdldEVkaXRvcigpLnN1cGVyKGVsZW1lbnQsIGNoZWNrQ29udGFpbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJc3VwZXIubW9kaWZ5VGV4dChlKTsKLQotCQkJdXBkYXRlVGl0bGUobmFtZVRleHQuZ2V0VGV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBuYW1lIG1vZGlmeSBsaXN0ZW5lciBmb3IgdGhlIGdpdmVuIG9iamVjdAotCSAqIEBwYXJhbSBlT2JqCi0JICogQHJldHVybgotCSAqIAkJCWxpc3RlbmVyCi0JICovCi0JcHVibGljIE1vZGlmeUxpc3RlbmVyIGNyZWF0ZU5hbWVNb2RpZnlMaXN0ZW5lcihFT2JqZWN0IGVPYmopIHsKLQkJcmV0dXJuIGNyZWF0ZU5hbWVNb2RpZnlMaXN0ZW5lcihlT2JqLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIE1vZGlmeUxpc3RlbmVyIGNyZWF0ZU5hbWVNb2RpZnlMaXN0ZW5lcihFT2JqZWN0IGVPYmosCi0JCQlib29sZWFuIGNoZWNrQ29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgTmFtZU1vZGlmeUxpc3RlbmVyKGVPYmosIGNoZWNrQ29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGl0bGUgb2YgdGhlIHByb3BlcnRpZXMgcGFnZQotCSAqIEBwYXJhbSB0eHQKLQkgKiAJCQluZXcgdGl0bGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVUaXRsZShTdHJpbmcgdHh0KSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0TmFtZVByZWZpeCgpICsgdHh0OwotCQlUYWJiZWRQcm9wZXJ0eUNvbXBvc2l0ZSBjb21wID0gKFRhYmJlZFByb3BlcnR5Q29tcG9zaXRlKSBwYWdlCi0JCQkJLmdldENvbnRyb2woKTsKLQkJVGFiYmVkUHJvcGVydHlUaXRsZSB0aXRsZSA9IGNvbXAuZ2V0VGl0bGUoKTsKLQotCQl0aXRsZS5zZXRUaXRsZShuYW1lLCBnZXRJbWFnZShlbGVtZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChsYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQlUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KTsKLQkJfQotCQlJbWFnZSB0aXRsZUltYWdlID0gbGFiZWxQcm92aWRlci5nZXRJbWFnZShvYmopOwotCQlyZXR1cm4gdGl0bGVJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkvLyBnZXQgQnJlYWtkb3duRWxlbWVudCBvYmplY3QKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkJCS8vIHVwZGF0ZSBzZWN0aW9uIG5hbWUKLQkJCQlnZW5lcmFsU2VjdGlvbgotCQkJCQkJLnNldERlc2NyaXB0aW9uKFByb3BlcnRpZXNSZXNvdXJjZXMuYmluZChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb24sIFByb3BlcnRpZXNVdGlsLmdldFR5cGVMb3dlcihlbGVtZW50KSkpOyAKLQotCQkJCS8vIE1vZGVsIE1vZGlmeSBsaXN0ZW5lciBmb3IgcHJlc2VudGF0aW9uIG5hbWUKLQkJCQlpZiAobW9kZWxNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0Ci0JCQkJCQkJLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCX0KLQkJCQltb2RlbE1vZGlmeUxpc3RlbmVyID0gZ2V0RWRpdG9yKCkuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoZWxlbWVudCk7Ci0KLQkJCQkvLyBNb2RpZnkgbGlzdGVuZXIgZm9yIG5hbWUKLQkJCQlpZiAobmFtZU1vZGlmeUxpc3RlbmVyICE9IG51bGwpCi0JCQkJCW5hbWVUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKG5hbWVNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCQkJbmFtZU1vZGlmeUxpc3RlbmVyID0gY3JlYXRlTmFtZU1vZGlmeUxpc3RlbmVyKAotCQkJCQkJCSgoUHJvY2VzcykgZWxlbWVudCkuZUNvbnRhaW5lcigpLCB0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQluYW1lTW9kaWZ5TGlzdGVuZXIgPSBjcmVhdGVOYW1lTW9kaWZ5TGlzdGVuZXIoZWxlbWVudCk7Ci0JCQkJfQotCi0JCQkJaWYgKG1vZGVsTW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgbW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBtb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCQkJCX0KLQkJCQlpZiAobmFtZU1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIG5hbWVNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQl9Ci0KLQkJCQluYW1lVGV4dC5zZXRUZXh0KGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5zZXRUZXh0KGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQotCQkJCWlmIChtb2RlbE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIG1vZGVsTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUoZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAobmFtZU1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIG5hbWVNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZShmYWxzZSk7Ci0JCQkJfQotCi0JCQkJbmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmFtZU1vZGlmeUxpc3RlbmVyKTsKLQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCW11bHRpcGxlQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlvcHRpb25hbEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc09wdGlvbmFsKCkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcGxhbm5lZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc1BsYW5uZWQoKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQkvLyBnZXQgc2VsZWN0ZWQgb3JpZ2luYWwgaW5wdXQgb2JqZWN0Ci0JCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlpZiAoZ2V0RWRpdG9yKCkuZ2V0U3VwcHJlc3Npb24oKS5pc0luU3VwcHJlc3NlZExpc3QoCi0JCQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBpbnB1dCkpIHsKLQkJCQkJCXN1cHJlc3NlZEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdXByZXNzZWRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCXN1cHJlc3NlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRTdXBwcmVzc2VkKCkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0KLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgYnJlYWtkb3duIGVsZW1lbnQgZ2VuZXJhbCBzZWN0aW9uIiArIGVsZW1lbnQsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCW5hbWVUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJcHJlc2VudGF0aW9uTmFtZVRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQluYW1lVGV4dC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJcHJlc2VudGF0aW9uTmFtZVRleHQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJbXVsdGlwbGVCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCW9wdGlvbmFsQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlwbGFubmVkQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotLy8JCXN1cHJlc3NlZEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Db21wb3NpdGVSb2xlUm9sZVNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0NvbXBvc2l0ZVJvbGVSb2xlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNGMzY2RkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0NvbXBvc2l0ZVJvbGVSb2xlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JQcm9jZXNzRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSBjb21wb3NpdGUgcm9sZSAtIHJvbGUgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVSb2xlUm9sZVNlY3Rpb24gZXh0ZW5kcyBPQlNSZWxhdGlvblNlY3Rpb24gewotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcigpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChDb21wb3NpdGVSb2xlKSBlbGVtZW50KS5nZXRBZ2dyZWdhdGVkUm9sZXMoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCWVsZW1lbnQgPSAoQ29tcG9zaXRlUm9sZSkgZWxlbWVudDsKLQotCQlTdHJpbmcgdGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU7Ci0JCVN0cmluZyBkZXNjID0gUHJvcGVydGllc1Jlc291cmNlcy5Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uOwotCQlTdHJpbmcgdGFibGUxID0gUHJvcGVydGllc1Jlc291cmNlcy5Db21wb3NpdGVSb2xlX1JvbGVfVGFibGUxOwotCQlzZXRUYWJEYXRhKHRpdGxlLCBkZXNjLCB0YWJsZTEpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2hvd0FkZEZyb21Qcm9jZXNzQnV0dG9uID0gdHJ1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCQllbGVtZW50ID0gKENvbXBvc2l0ZVJvbGUpIGdldEVsZW1lbnQoKTsKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgQ29tcG9zaXRlIHJvbGUgLSByb2xlIHNlY3RpbiAiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBjb21wb3NpdGUgcm9sZXMgCi0JICogQHBhcmFtIGl0ZW1zCi0JICogCQlMaXN0IG9mIHJvbGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZChMaXN0IGl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCShDb21wb3NpdGVSb2xlKSBlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCksCi0JCQkJCQkJKFJvbGUpIG9iaiwgLTEpOwotCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJUm9sZSByb2xlID0gKChSb2xlRGVzY3JpcHRvcikgb2JqKS5nZXRSb2xlKCk7Ci0JCQkJCWlmIChyb2xlICE9IG51bGwpCi0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkoQ29tcG9zaXRlUm9sZSkgZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSwKLQkJCQkJCQkJcm9sZSwgLTEpOwotCQkJCQllbHNlIHsKLQkJCQkJCU1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7ICgoUm9sZURlc2NyaXB0b3IpIG9iaikuZ2V0TmFtZSgpLAotCQkJCQkJCQkoKENvbXBvc2l0ZVJvbGUpIGVsZW1lbnQpLmdldE5hbWUoKSB9OwotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlJbmZvKAotCQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlLCBtZi5mb3JtYXQoYXJncykpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jcmVtb3ZlKGphdmEudXRpbC5BcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlSb2xlIHJvbGUgPSAoUm9sZSkgaXRvci5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCShDb21wb3NpdGVSb2xlKSBlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSwgcm9sZSwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI29wZW5BZGREaWFsb2coKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5BZGREaWFsb2coKSB7Ci0JCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9ICgoQ29tcG9zaXRlUm9sZSkgZWxlbWVudCkuZ2V0QWdncmVnYXRlZFJvbGVzKCk7Ci0JCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgZ2V0RmlsdGVyKCksIGVsZW1lbnQsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVTLCBleGlzdGluZ0VsZW1lbnRzKTsKLQotCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJZmQub3BlbigpOwotCQlhZGQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jb3BlbkFkZEZyb21Qcm9jZXNzRGlhbG9nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRnJvbVByb2Nlc3NEaWFsb2coKSB7Ci0JCVN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlM7Ci0JCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IGdldEV4aXN0aW5nRWxlbWVudHMoKTsKLQkJUHJvY2VzcyBwcm9jZXNzID0gKFByb2Nlc3MpIGdldFByb2Nlc3MoZWxlbWVudCk7Ci0JCUlGaWx0ZXIgZGVzY3JpcHRvckZpbHRlciA9IGdldERlc2NyaXB0b3JGaWx0ZXIoKTsKLQkJaWYgKGRlc2NyaXB0b3JGaWx0ZXIgIT0gbnVsbCAmJiBwcm9jZXNzICE9IG51bGwpIHsKLQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCWRlc2NyaXB0b3JGaWx0ZXIsIHByb2Nlc3MsIHRhYk5hbWUsIGV4aXN0aW5nRWxlbWVudHMpOwotCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUyk7Ci0JCQlmZC5vcGVuKCk7Ci0JCQlhZGQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgRmluZCBwYXJlbnQgdW50aWwgaXQncyBhY3Rpdml0eS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiAJCXByb2Nlc3Mgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9jZXNzKEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0UHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBkZXNjcmlwdG9yIHByb2Nlc3MgZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RGVzY3JpcHRvckZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcihnZXRDb25maWd1cmF0aW9uKCkpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJLy8gTGlzdCBsaXN0ID0gKChBY3Rpdml0eSlvYmopLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZ2V0QWN0aXZpdGllc0luU2NvcGUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZWxlbWVudCwgbGlzdCk7Ci0JCQkJCWlmIChsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJCQlpZiAob2JqLmVxdWFscyhlbGVtZW50KSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRGVzY3JpcHRvckRvY3VtZW50U2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRGVzY3JpcHRvckRvY3VtZW50U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGYyOTMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Rlc2NyaXB0b3JEb2N1bWVudFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuUmljaFRleHRJbWFnZUxpbmtDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBUaGUgZG9jdW1lbnQgdGFiIHNlY3Rpb24gZm9yIERlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvckRvY3VtZW50U2VjdGlvbiBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24gewotCi0JcHJvdGVjdGVkIERlc2NyaXB0b3IgZWxlbWVudDsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IHJlZmluZWREZXNjOwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZWxlbWVudCA9IChEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCTogcmVmaW5lZERlc2M7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChEZXNjcmlwdG9yRGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRSZWZpbmVkRGVzY3JpcHRpb24oKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQlyZWZpbmVkRGVzYywgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCksCi0JCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jY3JlYXRlRG9jdW1lbnRTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb2N1bWVudFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVEb2N1bWVudFNlY3Rpb24oY29tcG9zaXRlKTsKLQkJaW50IGhlaWdodEhpbnQgPSAyMDA7Ci0KLQkJLy8gcmVmaW5lZCBkZXNjcmlwdGlvbgotCQlSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciByZWZpbmVkQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb24pOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihyZWZpbmVkQ29udGFpbmVyLmxpbmspOwotCQlyZWZpbmVkRGVzYyA9IHJlZmluZWRDb250YWluZXIucmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCXJlZmluZWREZXNjLnNldE1vZGFsT2JqZWN0KGdldEVsZW1lbnQoKSk7Ci0JCXJlZmluZWREZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSk7Ci0JCXJlZmluZWREZXNjLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiN1cGRhdGVDb250cm9scygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRyb2xzKCk7Ci0JCXJlZmluZWREZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2F2ZU1vZGlmaWVkUmljaFRleHQoKTsKLQotCQkJCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJCURlc2NyaXB0b3JEZXNjcmlwdGlvbiBjb250ZW50ID0gKERlc2NyaXB0b3JEZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCi0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCXJlZmluZWREZXNjLnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCQkuc2V0RWxlbWVudChlbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJlZmluZWREZXNjLnNldFRleHQoY29udGVudC5nZXRSZWZpbmVkRGVzY3JpcHRpb24oKSk7Ci0KLQkJCQlpZiAoZXhwYW5kRmxhZykgewotCQkJCQlpZiAoKChMYWJlbClleHBhbmREb2N1bWVudExhYmVsLmdldENvbnRyb2woKSkKLQkJCQkJCQkuZ2V0VGV4dCgpCi0JCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb24pKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50Ci0JCQkJCQkJCS5nZXRSZWZpbmVkRGVzY3JpcHRpb24oKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFNlbGVjdGlvbigwKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlyZWZpbmVkRGVzYy5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQlyZWZpbmVkRGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkpOwotCQkJCXJlZmluZWREZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyBkZXNjcmlwdG9yIGRvY3VtZW50YXRpb24gc2VjdGlvbiA6IiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Rlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOGM0NjJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Rlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLQotLyoqCi0gKiBUaGUgZ2VuZXJhbCB0YWIgc2VjdGlvbiBmb3IgRGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24gewotCXByb3RlY3RlZCBEZXNjcmlwdG9yIGVsZW1lbnQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBzeW5jaHJvbml6ZWRCdXR0b247Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0JCS8vIGdldCBEZXNjcmlwdG9yIG9iamVjdAotCQllbGVtZW50ID0gKERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNjcmVhdGVHZW5lcmFsU2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVHZW5lcmFsU2VjdGlvbihjb21wb3NpdGUpOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUgZm9yIGNoZWNrYm94Ci0JCWNoZWNrQm94Q29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgbnVtT2ZDb2x1bW5zLCB0cnVlKTsKLQotCQlzeW5jaHJvbml6ZWRCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCXN5bmNocm9uaXplZEJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3luY2hyb25pemVkKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQlzeW5jaHJvbml6ZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKHN5bmNocm9uaXplZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQkJc3luY2hyb25pemVkQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCQkJc3luY2hyb25pemVkQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50Ci0JCQkJCQkuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBEZXNjcmlwdG9yIGdlbmVyYWwgc2VjdGlvbjogIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jZ2V0TmFtZVByZWZpeCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lUHJlZml4KCkgewotCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0RFU0NSSVBUT1IgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VQRlByb3BlcnR5U2hlZXRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9FUEZQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYThjYjZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VQRlByb3BlcnR5U2hlZXRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuSUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBwcm9wZXJ0eSBzaGVldCBwYWdlIGZvciBwcm9jZXNzIGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEVQRlByb3BlcnR5U2hlZXRQYWdlIGV4dGVuZHMgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgewotCi0JcHJpdmF0ZSBJUHJvcGVydHlTaGVldEVudHJ5IHJvb3RFbnRyeTsKLQotCXByaXZhdGUgc3RhdGljIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIHNvdXJjZVByb3ZpZGVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvY2Vzc0VkaXRvciBwcm9jZXNzRWRpdG9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybVBhZ2VJRCA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIGZvcm1QYWdlID0gbnVsbDsKLQotCXB1YmxpYyBFUEZQcm9wZXJ0eVNoZWV0UGFnZShQcm9jZXNzRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigoSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IpIGVkaXRvcik7Ci0KLQkJYWN0aW9uTWdyID0gKChQcm9jZXNzRWRpdG9yKSBlZGl0b3IpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJcHJvY2Vzc0VkaXRvciA9IGVkaXRvcjsKLQotCX0KLQotCS8qKgotCSAqIEdldCBhY3Rpb24gbWFuYWdlcgotCSAqIEByZXR1cm4KLQkgKiAJCQlBY3Rpb24gTWFuYWdlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJcmV0dXJuIGFjdGlvbk1ncjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZWRpdG9yIGFzc29jaWF0ZWQgd2l0aCBwcm9wZXJ0eSBzaGVldCBwYWdlCi0JICogQHJldHVybgotCSAqIAkJCVByb2Nlc3MgRWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzRWRpdG9yIGdldEVkaXRvcigpIHsKLQkJcmV0dXJuIHByb2Nlc3NFZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZ2l2ZW4gcHJvcGVydHkgc291cmNlIHByb3ZpZGVyIGFzIHRoZSBwcm9wZXJ0eSBzb3VyY2UgcHJvdmlkZXIuCi0JICogPHA+Ci0JICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBvbmx5IHZhbGlkIGlmIHlvdSBhcmUgdXNpbmcgdGhpcyBwYWdlJ3MgZGVmYXVsdAotCSAqIHJvb3QgZW50cnkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXdQcm92aWRlcgotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHNvdXJjZSBwcm92aWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5U291cmNlUHJvdmlkZXIoSVByb3BlcnR5U291cmNlUHJvdmlkZXIgbmV3UHJvdmlkZXIpIHsKLQkJc291cmNlUHJvdmlkZXIgPSBuZXdQcm92aWRlcjsKLQkJaWYgKHJvb3RFbnRyeSA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYSBuZXcgcm9vdAotCQkJUHJvcGVydHlTaGVldEVudHJ5IHJvb3QgPSBuZXcgUHJvcGVydHlTaGVldEVudHJ5KCk7Ci0KLQkJCXJvb3RFbnRyeSA9IHJvb3Q7Ci0JCX0KLQkJaWYgKHNvdXJjZVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCS8vIHNldCB0aGUgcHJvcGVydHkgc291cmNlIHByb3ZpZGVyIGZvciByb290IGVudHJ5Ci0JCQlpZiAocm9vdEVudHJ5IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldEVudHJ5KSB7Ci0JCQkJKChQcm9wZXJ0eVNoZWV0RW50cnkpIHJvb3RFbnRyeSkKLQkJCQkJCS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKHNvdXJjZVByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBwcm9wZXJ0eSBzb3VyY2UgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGdldFByb3BlcnR5U291cmNlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBzb3VyY2VQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gc2VsZWN0aW9uIG9mIHRoZSBvYmplY3QgZnJvbSBicmVha2Rvd24gc3RydWN0dXJlIG9mIHRoZSBwcm9jZXNzIGVkaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsKSB7Ci0JCXNlbGVjdGlvbiA9IHNlbDsKLQotCQlpZiAocGFydCBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3IpIHsKLQkJCXByb2Nlc3NFZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgcGFydDsKLQkJCWFjdGlvbk1nciA9IHByb2Nlc3NFZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQkJSUZvcm1QYWdlIGFjdGl2ZVBhZ2UgPSBwcm9jZXNzRWRpdG9yLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpCi0JCQkJZm9ybVBhZ2UgPSAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSBhY3RpdmVQYWdlOwotCQkJZm9ybVBhZ2VJRCA9IGFjdGl2ZVBhZ2UgIT0gbnVsbCA/IGFjdGl2ZVBhZ2UuZ2V0SWQoKSA6IG51bGw7Ci0JCX0KLQotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHBhcnQsIHNlbGVjdGlvbik7Ci0JCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UjaGFuZGxlUGFydEFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVQYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQlwcm9jZXNzRWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIHBhcnQ7Ci0JCQlzZWxlY3Rpb24gPSBwcm9jZXNzRWRpdG9yLmdldFNlbGVjdGlvbigpOwotCQkJYWN0aW9uTWdyID0gcHJvY2Vzc0VkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9IHByb2Nlc3NFZGl0b3IuZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCQlpZiAoYWN0aXZlUGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkKLQkJCQlmb3JtUGFnZSA9IChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIGFjdGl2ZVBhZ2U7Ci0JCQlmb3JtUGFnZUlEID0gYWN0aXZlUGFnZSAhPSBudWxsID8gYWN0aXZlUGFnZS5nZXRJZCgpIDogbnVsbDsKLQkJfQotCi0JCXN1cGVyLmhhbmRsZVBhcnRBY3RpdmF0ZWQocGFydCk7Ci0JCQotCQl0aGlzLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY3VycmVudCBhZGFwdGVyIGZhY3Rvcnkgb2YgZWRpdG9yCi0JICogQHJldHVybgotCSAqIAkJCUFkYXB0ZXIgRmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBmb3JtUGFnZS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UjcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQotCQkvLyB3aWxsIHNlZSBpZiB0aGlzIHdvcmtzLi4KLQkJdHJ5IHsKLQkJCXN1cGVyLnJlZnJlc2goKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotCQl9Ci0JCQotLy8gVE9ETyAtIGdldCByaWQgb2YgaW50ZXJuYWwgQVBJcy4KLS8vCQlpZiAodGhpcy5nZXRDdXJyZW50VGFiKCkgIT0gbnVsbCkgewotLy8JCQl0aGlzLmdldEN1cnJlbnRUYWIoKS5yZWZyZXNoKCk7Ci0vLwotLy8JCQkvLyBhbHNvIHJlZnJlc2ggc2VjdGlvbgotLy8JCQlJU2VjdGlvbiBzZWN0aW9uID0gdGhpcy5nZXRDdXJyZW50VGFiKCkuZ2V0U2VjdGlvbkF0SW5kZXgoMCk7Ci0vLwkJCWlmIChzZWN0aW9uICE9IG51bGwpIHsKLS8vCQkJCXNlY3Rpb24ucmVmcmVzaCgpOwotLy8JCQl9Ci0vLwkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRWxlbWVudExhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VsZW1lbnRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjODNkNTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRWxlbWVudExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVHlwZU1hcHBlcjsKLQotCi0vKioKLSAqIExhYmVsIHByb3ZpZGVyIGZvciB0aGUgdGl0bGUgYmFyIGZvciB0aGUgdGFiYmVkIHByb3BlcnR5IHNoZWV0IHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJVHlwZU1hcHBlciB0eXBlTWFwcGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBFbGVtZW50TGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQkJdHlwZU1hcHBlciA9IG5ldyBFbGVtZW50VHlwZU1hcHBlcigpOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3RzKSB7Ci0JCWlmIChvYmplY3RzID09IG51bGwgfHwgb2JqZWN0cy5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUltYWdlIGltYWdlID0gTGlicmFyeVVJSW1hZ2VzLklNR19QUk9DRVNTOwotCQlmaW5hbCBib29sZWFuIG11bHRpcGxlW10gPSB7IGZhbHNlIH07Ci0JCWZpbmFsIE9iamVjdCBvYmplY3QgPSBnZXRPYmplY3Qob2JqZWN0cywgbXVsdGlwbGUpOwotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0cykuc2l6ZSgpID4gMSkgewotCQkJcmV0dXJuIGltYWdlOwotCQl9IGVsc2UgewotCQkJT2JqZWN0IG9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmplY3QpOwotCQkJaWYgKGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpOwotCQkJfQotCQkJSW1hZ2UgdGl0bGVJbWFnZSA9IGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqKTsKLQotCQkJcmV0dXJuIHRpdGxlSW1hZ2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdHMpIHsKLQkJaWYgKG9iamVjdHMgPT0gbnVsbCB8fCBvYmplY3RzLmVxdWFscyhTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKSkgewotCQkJcmV0dXJuIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Ob0l0ZW1zOyAKLQkJfQotCQlmaW5hbCBib29sZWFuIG11bHRpcGxlW10gPSB7IGZhbHNlIH07Ci0JCWZpbmFsIE9iamVjdCBvYmplY3QgPSBnZXRPYmplY3Qob2JqZWN0cywgbXVsdGlwbGUpOwotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0cykuc2l6ZSgpID4gMSkgewotCQkJT2JqZWN0IHNpemUgPSBuZXcgSW50ZWdlcigoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvYmplY3RzKS5zaXplKCkpOwotCQkJU3RyaW5nIG1zZyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuYmluZChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfSXRlbXNTZWxlY3RlZCwgKG5ldyBPYmplY3RbXSB7IHNpemUgfSkpOyAKLQkJCXJldHVybiBtc2c7Ci0JCX0gZWxzZSB7Ci0KLQkJCU9iamVjdCBvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqZWN0KTsKLQkJCXJldHVybiBnZXROYW1lKG9iaik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JCVN0cmluZyBwcmVmaXggPSBQcm9wZXJ0aWVzVXRpbC5nZXRUeXBlKG9iaik7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCW5hbWUgPSBwcmVmaXggKyAiIDogIiArICgoQnJlYWtkb3duRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCW5hbWUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTm9Qcm9wZXJ0aWVzQXZhaWxhYmxlOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgYSBtdWx0aXBsZSBvYmplY3Qgc2VsZWN0aW9uIGhhcyBiZWVuIHBhc3NlZCB0byB0aGUgbGFiZWwKLQkgKiBwcm92aWRlci4gSWYgdGhlIG9iamVjdHMgaXMgYSBJU3RydWN0dXJlZFNlbGVjdGlvbiwgc2VlIGlmIGFsbCB0aGUKLQkgKiBvYmplY3RzIGluIHRoZSBzZWxlY3Rpb24gYXJlIHRoZSBzYW1lIGFuZCBpZiBzbywgd2Ugd2FudCB0byBwcm92aWRlCi0JICogbGFiZWxzIGZvciB0aGUgY29tbW9uIHNlbGVjdGVkIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG9iamVjdHMKLQkgKiAgICAgICAgICAgIGEgc2luZ2xlIG9iamVjdCBvciBhIElTdHJ1Y3R1cmVkU2VsZWN0aW9uLgotCSAqIEBwYXJhbSBtdWx0aXBsZQotCSAqICAgICAgICAgICAgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgaXMgdHJ1ZSBpZiB0aGVyZSBpcyBtdWx0aXBsZQotCSAqICAgICAgICAgICAgdW5lcXVhbCBzZWxlY3RlZCBlbGVtZW50cyBpbiBhIElTdHJ1Y3R1cmVkU2VsZWN0aW9uLgotCSAqIEByZXR1cm4gdGhlIG9iamVjdCB0byBnZXQgbGFiZWxzIGZvci4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRPYmplY3QoT2JqZWN0IG9iamVjdHMsIGJvb2xlYW4gbXVsdGlwbGVbXSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG9iamVjdHMpOwotCQlPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLQkJaWYgKG9iamVjdHMgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvYmplY3RzOwotCQkJb2JqZWN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCS8vIG9uZSBlbGVtZW50IHNlbGVjdGVkCi0JCQkJbXVsdGlwbGVbMF0gPSBmYWxzZTsKLQkJCQlyZXR1cm4gb2JqZWN0OwotCQkJfQotCQkJLy8gbXVsdGlwbGUgZWxlbWVudHMgc2VsZWN0ZWQKLQkJCW11bHRpcGxlWzBdID0gdHJ1ZTsKLS8vCQkJQ2xhc3MgZmlyc3RDbGFzcyA9IHR5cGVNYXBwZXIubWFwVHlwZShvYmplY3QsIG9iamVjdC5nZXRDbGFzcygpKTsKLQkJCUNsYXNzIGZpcnN0Q2xhc3MgPSB0eXBlTWFwcGVyLm1hcFR5cGUob2JqZWN0KTsKLQkJCS8vIGRldGVybWluZSBpZiBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIHNlbGVjdGlvbiBhcmUgdGhlIHNhbWUgdHlwZQotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbmV4dCA9IGkubmV4dCgpOwotLy8JCQkJCUNsYXNzIG5leHRDbGFzcyA9IHR5cGVNYXBwZXIubWFwVHlwZShuZXh0LCBuZXh0Ci0vLwkJCQkJCQkuZ2V0Q2xhc3MoKSk7Ci0JCQkJCUNsYXNzIG5leHRDbGFzcyA9IHR5cGVNYXBwZXIubWFwVHlwZShuZXh0KTsKLQkJCQkJaWYgKCFuZXh0Q2xhc3MuZXF1YWxzKGZpcnN0Q2xhc3MpKSB7Ci0JCQkJCQkvLyB0d28gZWxlbWVudHMgbm90IGVxdWFsID09IG11bHRpcGxlIHNlbGVjdGVkIHVuZXF1YWwKLQkJCQkJCW11bHRpcGxlWzBdID0gZmFsc2U7Ci0JCQkJCQlvYmplY3QgPSBudWxsOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQltdWx0aXBsZVswXSA9IGZhbHNlOwotCQkJb2JqZWN0ID0gb2JqZWN0czsKLQkJfQotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VsZW1lbnRUeXBlTWFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9FbGVtZW50VHlwZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOGVjMDU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VsZW1lbnRUeXBlTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVR5cGVNYXBwZXI7Ci0KLQotLyoqCi0gKiBUeXBlIG1hcHBlciBmb3IgdGhlIGxvZ2ljIGV4YW1wbGUuIFdlIHdhbnQgdG8gZ2V0IHRoZSBHRUYgbW9kZWwgb2JqZWN0IGZyb20KLSAqIHRoZSBzZWxlY3RlZCBlbGVtZW50IGluIHRoZSBvdXRsaW5lIHZpZXcgYW5kIHRoZSBkaWFncmFtLiBXZSBjYW4gdGhlbiBmaWx0ZXIKLSAqIG9uIHRoZSBtb2RlbCBvYmplY3QgdHlwZS4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudFR5cGVNYXBwZXIgaW1wbGVtZW50cyBJVHlwZU1hcHBlciB7Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVR5cGVNYXBwZXIjbWFwVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDbGFzcyBtYXBUeXBlKE9iamVjdCBvYmplY3QpIHsKLS8vCQlDbGFzcyB0eXBlID0gZWZmZWN0aXZlVHlwZTsKLQkJQ2xhc3MgdHlwZSA9IG51bGw7Ci0JCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJdHlwZSA9IG9iamVjdC5nZXRDbGFzcygpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQl0eXBlID0gKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QpLmdldENsYXNzKCk7Ci0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIHR5cGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Zvcm1VSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRm9ybVVJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0NTZkYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRm9ybVVJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuTWV0aG9kRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5EZWNvcmF0ZWRGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLQotCi0vKioKLSAqIFRoZSBVSSB1dGlsIGNsYXNzIHRhaWxvcmVkIGZvciBwcm9wZXJ0aWVzIHZpZXcgZm9yIHByb2Nlc3MgYXV0aG9yaW5nCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZvcm1VSSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XSURUSCA9IDMwMDsKLQotCXByaXZhdGUgc3RhdGljIExhYmVsIF9jcmVhdGVMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHN0ciwgaW50IGdyaWREYXRhU3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwocGFyZW50LCBzdHIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgc3RyKSB7Ci0JCS8vIG1ha2UgaG9yaXpvbmF0YWxTcGFuIDEKLQkJcmV0dXJuIF9jcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHN0ciwgR3JpZERhdGEuQkVHSU5OSU5HLCAxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgc3RyLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJLy8gbWFrZSBob3Jpem9uYXRhbFNwYW4gMgotCQlyZXR1cm4gX2NyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgc3RyLCBHcmlkRGF0YS5CRUdJTk5JTkcsCi0JCQkJaG9yaXpvbnRhbFNwYW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRleHQgX2NyZWF0ZVRleHQoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCB0ZXh0U3R5bGUsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCi0JCQlpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJVGV4dCBjb250cm9sID0gdG9vbGtpdC5jcmVhdGVUZXh0KHBhcmVudCwgIiIsIHRleHRTdHlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQljb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBfY3JlYXRlVGV4dCh0b29sa2l0LCBwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuV1JBUCwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIFNXVC5ERUZBVUxULCBERUZBVUxUX1dJRFRILAotCQkJCVNXVC5ERUZBVUxUKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IGhlaWdodCkgewotCQlyZXR1cm4gX2NyZWF0ZVRleHQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuV1JBUCwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIGhlaWdodCwgREVGQVVMVF9XSURUSCwgU1dULkRFRkFVTFQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgaGVpZ2h0LCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJcmV0dXJuIF9jcmVhdGVUZXh0KHRvb2xraXQsIHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5XUkFQLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgaGVpZ2h0LCBERUZBVUxUX1dJRFRILCBob3Jpem9udGFsU3Bhbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSU1ldGhvZFJpY2hUZXh0IF9jcmVhdGVSaWNoVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IGhlaWdodCwgaW50IHdpZHRoLCBTdHJpbmcgcGF0aCwKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCwgRGVjb3JhdGVkRmllbGQgbGFiZWwpIHsKLQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBNZXRob2RGb3JtVG9vbGtpdC5jcmVhdGVSaWNoVGV4dCh0b29sa2l0LAotCQkJCXBhcmVudCwKLQkJCQkiIiwgU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwsIHBhdGgsIG1ldGhvZEVsZW1lbnQsIGxhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciBjcmVhdGVSaWNoVGV4dFdpdGhMaW5rKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgaGVpZ2h0LCBTdHJpbmcgcGF0aCwKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCwgU3RyaW5nIGxhYmVsVGV4dCkgewotCQlJbWFnZUh5cGVybGluayBsaW5rID0gY3JlYXRlSW1hZ2VIeXBlckxpbmsodG9vbGtpdCwgcGFyZW50LCBBdXRob3JpbmdVSUltYWdlcy5JTUdfQ09MTEFQU0VELAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5SVEUpOwotCQlsaW5rLnNldERhdGEoIlRpdGxlIiwgbGFiZWxUZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlEZWNvcmF0ZWRGaWVsZCBkZWNvcmF0ZWRMYWJlbCA9IEJhc2VGb3JtUGFnZS5jcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCk7Ci0JCSgoR3JpZERhdGEpZGVjb3JhdGVkTGFiZWwuZ2V0TGF5b3V0Q29udHJvbCgpLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCi0JCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gX2NyZWF0ZVJpY2hUZXh0KHRvb2xraXQsIHBhcmVudCwgaGVpZ2h0LCBERUZBVUxUX1dJRFRILCBwYXRoLAotCQkJCW1ldGhvZEVsZW1lbnQsIGRlY29yYXRlZExhYmVsKTsKLQkJbGluay5zZXRIcmVmKGNvbnRyb2wpOwotCi0JCXJldHVybiBuZXcgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIoY29udHJvbCwgbGluayk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZUh5cGVybGluayBjcmVhdGVJbWFnZUh5cGVyTGluayhGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgSW1hZ2UgaW1hZ2UsIFN0cmluZyB0b29sVGlwKSB7Ci0JCUltYWdlSHlwZXJsaW5rIGxpbmsgPSB0b29sa2l0LmNyZWF0ZUltYWdlSHlwZXJsaW5rKHBhcmVudCwgU1dULkxFRlQKLQkJCQl8IFNXVC5UT1ApOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlsaW5rLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlsaW5rLnNldEltYWdlKGltYWdlKTsKLQkJbGluay5zZXRUb29sVGlwVGV4dCh0b29sVGlwKTsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIFNlY3Rpb24uREVTQ1JJUFRJT04KLQkJCQl8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZWN0aW9uLnNldExheW91dERhdGEoZ2QpOwotCQlzZWN0aW9uLnNldFRleHQodGl0bGUpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJdG9vbGtpdC5jcmVhdGVDb21wb3NpdGVTZXBhcmF0b3Ioc2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgZ2RTdHlsZSkgewotCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBTZWN0aW9uLkRFU0NSSVBUSU9OCi0JCQkJfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVEKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoZ2RTdHlsZSk7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlY3Rpb24uc2V0VGV4dCh0aXRsZSk7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQl0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZVNlcGFyYXRvcihzZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJU2VjdGlvbiBzZWN0aW9uLCBpbnQgbnVtT2ZDb2x1bW5zLCBib29sZWFuIGV4cGFuZGVkKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG51bU9mQ29sdW1ucywgZmFsc2UpKTsKLQkJaWYgKCFleHBhbmRlZCkKLQkJCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCWVsc2UKLQkJCWNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgZ3JpZFN0eWxlKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWRTdHlsZSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlyZXR1cm4gcGFuZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCBncmlkU3R5bGUsIGludCBudW1PZkNvbHVtbnMsCi0JCQlib29sZWFuIGVxdWFsU2l6ZUNvbHVtbikgewotCQlDb21wb3NpdGUgcGFuZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkU3R5bGUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG51bU9mQ29sdW1uczsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dChudW1PZkNvbHVtbnMsIGVxdWFsU2l6ZUNvbHVtbik7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlwYW5lLnNldExheW91dChsYXlvdXQpOwotCQlyZXR1cm4gcGFuZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBCdXR0b24gX2NyZWF0ZUJ1dHRvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGJ1dHRvblN0ciwgaW50IHN0eWxlLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJQnV0dG9uIGNvbnRyb2wgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsIGJ1dHRvblN0ciwgc3R5bGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQljb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBCdXR0b24gX2NyZWF0ZUJ1dHRvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGJ1dHRvblN0ciwgaW50IHN0eWxlKSB7Ci0JCUJ1dHRvbiBjb250cm9sID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LCBidXR0b25TdHIsIHN0eWxlKTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCQotCQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tYm8gX2NyZWF0ZUNvbWJvKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgc3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIHN0eWxlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZUNvbWJvKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJcmV0dXJuIF9jcmVhdGVDb21ibyh0b29sa2l0LCBwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuRkxBVAotCQkJCXwgU1dULlJFQURfT05MWSwgaG9yaXpvbnRhbFNwYW4pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBidXR0b25TdHIpIHsKLQkJcmV0dXJuIF9jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFyZW50LCBidXR0b25TdHIsIFNXVC5OT05FKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHN0eWxlLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJcmV0dXJuIF9jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFyZW50LCAiIiwgc3R5bGUsIGhvcml6b250YWxTcGFuKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVDaGVja0J1dHRvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LCBpbnQgaG9yaXpvbnRhbFNwYW4pCi0JewotCQlCdXR0b24gY29udHJvbCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwgIiIsIFNXVC5DSEVDSyk7CQkvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRhYmxlIF9jcmVhdGVUYWJsZShGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHRhYmxlU3R5bGUsIGludCBncmlkU3R5bGUsIGludCBoZWlnaHQsIGludCB3aWR0aCwKLQkJCWludCB2ZXJ0aWNhbFNwYW4sIGludCBob3Jpem9udGFsU3BhbikgewotCQlUYWJsZSB0YWJsZSA9IHRvb2xraXQuY3JlYXRlVGFibGUocGFyZW50LCB0YWJsZVN0eWxlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZFN0eWxlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IHZlcnRpY2FsU3BhbjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRhYmxlIGNyZWF0ZVRhYmxlKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIF9jcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCTIwMCwgMjAwLCAxLCAxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRhYmxlIGNyZWF0ZVRhYmxlKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgaGVpZ2h0KSB7Ci0JCXJldHVybiBfY3JlYXRlVGFibGUodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEksIEdyaWREYXRhLkZJTExfQk9USCwKLQkJCQloZWlnaHQsIDIwMCwgMSwgMSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvTWlsZXN0b25lRG9jdW1lbnRTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9NaWxlc3RvbmVEb2N1bWVudFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzAyYTU5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9NaWxlc3RvbmVEb2N1bWVudFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuUmljaFRleHRJbWFnZUxpbmtDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBUaGUgZG9jdW1lbnQgdGFiIHNlY3Rpb24gZm9yIE1pbGVzdG9uZQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWxlc3RvbmVEb2N1bWVudFNlY3Rpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uIHsKLQotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBtYWluRGVzYzsKLQotCXByaXZhdGUgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IG1haW5EZXNjOwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9ICgoQ29udGVudERlc2NyaXB0aW9uKSBlbGVtZW50LmdldFByZXNlbnRhdGlvbigpKQotCQkJCQkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZShtYWluRGVzYywKLQkJCQkJb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksIG5ld0NvbnRlbnQsCi0JCQkJCQktMSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNjcmVhdGVEb2N1bWVudFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50U2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXN1cGVyLmNyZWF0ZURvY3VtZW50U2VjdGlvbihjb21wb3NpdGUpOwotCQlpbnQgaGVpZ2h0SGludCA9IDIwMDsKLQotCQkvLyBtYWluIGRlc2NyaXB0aW9uCi0JCVJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIG1haW5EZXNjQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19tYWluRGVzY3JpcHRpb24pOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihtYWluRGVzY0NvbnRhaW5lci5saW5rKTsKLQkJbWFpbkRlc2MgPSBtYWluRGVzY0NvbnRhaW5lci5yaWNoVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJbWFpbkRlc2Muc2V0TW9kYWxPYmplY3QoZ2V0RWxlbWVudCgpKTsKLQkJbWFpbkRlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQkJbWFpbkRlc2MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQkJbWFpbkRlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNhdmVNb2RpZmllZFJpY2hUZXh0KCk7Ci0KLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQltYWluRGVzYy5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkJLnNldEVsZW1lbnQoZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQltYWluRGVzYy5zZXRUZXh0KGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCkpOwotCi0JCQkJaWYgKGV4cGFuZEZsYWcpIHsKLQkJCQkJaWYgKCgoTGFiZWwpZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRDb250cm9sKCkpLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX21haW5EZXNjcmlwdGlvbikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRUZXh0KGNvbnRlbnQKLQkJCQkJCQkJLmdldE1haW5EZXNjcmlwdGlvbigpKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0U2VsZWN0aW9uKDApOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJCQkJLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUoZmFsc2UpOwotCQkJCX0KLQotCQkJCW1haW5EZXNjLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCW1haW5EZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSk7Ci0JCQkJbWFpbkRlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciB3aGlsZSByZWZyZXNoaW5nIG1pbGVzdG9uZSBkb2N1bWVudGF0aW9uIHNlY3Rpb24gOiIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvT0JTUmVsYXRpb25TZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9PQlNSZWxhdGlvblNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTc0YmVlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9PQlNSZWxhdGlvblNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NSb2xlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgYmFzZSBPQlMgcmVsYXRpb24gc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNSZWxhdGlvblNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZF8xLCBjdHJsX2FkZF8yLCBjdHJsX3JlbW92ZTsKLQotCXByaXZhdGUgVGFibGUgY3RybF9zZWxlY3RlZDsKLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciB2aWV3ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQkKLQlwcml2YXRlIFN0cmluZyBkZXNjOwotCQotCXByaXZhdGUgU3RyaW5nIHRhYmxlMTsKLQotCS8vIGVsZW1lbnQKLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLy8gYnkgZGVmYXVsdCB0aGlzIGJ1dHRvbiBpcyBmYWxzZQotCXByb3RlY3RlZCBib29sZWFuIHNob3dBZGRGcm9tUHJvY2Vzc0J1dHRvbiA9IGZhbHNlOwotCi0JLy8gZmlsdGVyCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0KLQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJZmlsdGVyID0gbmV3IFByb2Nlc3NSb2xlRmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwKLQkJCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCWluaXQoKTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gY3JlYXRlIHNlY3Rpb24KLQkJY3JlYXRlU2VjdGlvbihwYXJlbnQpOwotCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRyb2xzCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IGJyZWFrZG93bmVsZW1lbnQgb2JqZWN0Ci0JCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IGFjdGlvbiBtYW5hZ2VyCi0JCWFjdGlvbk1nciA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJEYXRhKFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2MsIFN0cmluZyB0YWJsZTEpIHsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLmRlc2MgPSBkZXNjOwotCQl0aGlzLnRhYmxlMSA9IHRhYmxlMTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBzZWN0aW9uCi0JCVNlY3Rpb24gYVNlY3Rpb24gPSBGb3JtVUkuY3JlYXRlU2VjdGlvbih0b29sa2l0LCBwYXJlbnQsCi0JCQkJdGl0bGUsIGRlc2MpOwotCi0JCS8vIGNyZWF0ZSBnZW5lcmFsIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBhU2VjdGlvbiwgMiwKLQkJCQlmYWxzZSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTEsIHRhYmxlMSk7Ci0KLQkJY3RybF9zZWxlY3RlZCA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSk7Ci0JCXZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3NlbGVjdGVkKTsKLQotCQlpbml0Q29udGVudFByb3ZpZGVyKCk7Ci0KLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkvLyBjcmVhdGUgYnV0dG9uIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCi0JCS8vIGNyZWF0ZSBidXR0b25zCi0JCWN0cmxfYWRkXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc2hvd0FkZEZyb21Qcm9jZXNzQnV0dG9uKSB7Ci0JCQljdHJsX2FkZF8yID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzKTsgCi0JCX0KLQkJY3RybF9yZW1vdmUgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTIpOwotCi0JfQotCi0JLyoqCi0JICogR2V0IERlZmF1bHQgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGdldERlZmF1bHRDb25maWd1cmF0aW9uKCkgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZ2V0QWRhcHRlcigpOwotCQlPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQlwYXJlbnQgPSBic0l0ZW1Qcm92aWRlci5nZXRUb3BJdGVtKCk7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBwYXJlbnQpCi0JCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJcmV0dXJuIGNvbmZpZzsKLQkJfSBlbHNlIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoIk9CU1JlbGF0aW9uU2VjdGlvbjo6Z2V0RGVmYXVsdENvbmZpZ3VyYXRpb24gLSBJQlNJdGVtUHJvdmlkZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQkvLyBBZGQgZm9jdXMgbGlzdGVuZXIgb24gcHJpbWFyeSB0YXNrcyBsaXN0Ci0JCWN0cmxfc2VsZWN0ZWQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2FkZF8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW9wZW5BZGREaWFsb2coKTsKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCQlpZiAoc2hvd0FkZEZyb21Qcm9jZXNzQnV0dG9uKSB7Ci0JCQljdHJsX2FkZF8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJb3BlbkFkZEZyb21Qcm9jZXNzRGlhbG9nKCk7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQljdHJsX3JlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQlyZW1vdmUocm1JdGVtcyk7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCX0KLQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRWxlbWVudCAiK2VsZW1lbnQuZ2V0TmFtZSgpICsKLQkJLy8gIkVkaXRhYmxlLSIrZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfMSAhPSBudWxsKQotCQkJY3RybF9hZGRfMS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkXzIgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzIuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJaWYgKGN0cmxfcmVtb3ZlICE9IG51bGwpCi0JCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQl9IGVsc2UgewotCQkJaWYgKGN0cmxfcmVtb3ZlICE9IG51bGwpCi0JCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl1cGRhdGVDb250cm9scygpOwotCi0JCXN1cGVyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50IGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JLy8gcHJvdGVjdGVkIEFjdGl2aXR5IGdldFBhcmVudEFjdGl2aXR5KEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkKLQkvLyB7Ci0JLy8gQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCS8vIEFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0KLQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCS8vIEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKQotCS8vIGFGYWN0b3J5LmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JLy8gT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCS8vIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkvLyB7Ci0JLy8gYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkvLyB9Ci0JLy8JCQotCS8vIHJldHVybiBhY3Rpdml0eTsKLQkvLyB9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb250ZW50IHByb3ZpZGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIFVJIERpYWxvZyB0byBhZGQgbWV0aG9kIGVsZW1lbnRzCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRGlhbG9nKCkgewotCX0KLQotCS8qKgotCSAqIE9wZW4gVUkgRGlhbG9nIHRvIGFkZCBkZXNjcmlwdG9yIGVsZW1lbnRzCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRnJvbVByb2Nlc3NEaWFsb2coKSB7Ci0JfQotCi0JLy8gcHJvdGVjdGVkIHZvaWQgYWRkKE9iamVjdFtdIGl0ZW1zKSB7fQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShBcnJheUxpc3Qgcm1JdGVtcykgewotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc29zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9QcmVkZWNlc3NvckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJlZGVjZXNzb3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzlhNjliOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9QcmVkZWNlc3NvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLS8qKgotICogRGlhbG9nIGZvciBhZGRpbmcgcHJlZGVjZXNzb3IgZGVwZW5kZW5jeQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJlZGVjZXNzb3JEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHJpdmF0ZSBUZXh0IHByZWRJZFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgcHJlc2VudGF0aW9uTmFtZTsKLQotCXByaXZhdGUgQ29tYm8gZGVwZW5kZW5jeTsKLQotCS8qKiBEZXBlbmRlbmN5IExpdGVyYWxzICogKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOSVNIX1RPX1NUQVJUID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19TVEFSVDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTklTSF9UT19GSU5JU0ggPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RPX1NUQVJUID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVE9fRklOSVNIID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmdbXSBkZXBlbmRlbmN5TGlzdCA9IG5ldyBTdHJpbmdbXSB7IEZJTklTSF9UT19TVEFSVCwKLQkJCUZJTklTSF9UT19GSU5JU0gsIFNUQVJUX1RPX1NUQVJULCBTVEFSVF9UT19GSU5JU0ggfTsKLQotCXByaXZhdGUgV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCXByaXZhdGUgT2JqZWN0IHByb2Nlc3M7Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBMaXN0IHByZWRlY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgTGlzdCBwcmVkTWFwTGlzdDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvck1hcCBwcmVkTWFwOwotCi0JLyoqCi0JICogRGlhbG9nIGZvciBzZXR0aW5nIHByZWRlY2Vzc29yIGZvciB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIAkJCVRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIAkJCVdvcmsgQnJlYWsgZG93biBFbGVtZW50Ci0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAJCQlQcm9jZXNzIG9mIHRoZSB3b3JrYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAJCQlBZGFwdGVyIEZhY3RvcnkgCi0JICogQHBhcmFtIHByZWRNYXAKLQkgKiAJCQlQcmVkZWNlc3NvciBNYXAKLQkgKiBAcGFyYW0gcHJlZE1hcExpc3QKLQkgKiAJCQlQcmVkZWNlc3NvciBNYXAgbGlzdAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKiAJCQlBY3Rpb24gTWFuYWdlcgotCSAqLwotCXB1YmxpYyBQcmVkZWNlc3NvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudCwKLQkJCU9iamVjdCBwcm9jZXNzLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCVByZWRlY2Vzc29yTWFwIHByZWRNYXAsIExpc3QgcHJlZE1hcExpc3QsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0KLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5wcm9jZXNzID0gcHJvY2VzczsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQl0aGlzLnByZWRNYXAgPSBwcmVkTWFwOwotCQl0aGlzLnByZWRNYXBMaXN0ID0gcHJlZE1hcExpc3Q7Ci0JCXRoaXMuYWN0aW9uTWdyID0gYWN0aW9uTWdyOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIGRpYWxvZyBoZWFkZXIKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIGJsYW5rIGxhYmVsCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIFByZWRlY2Vzc29yIElEIGluZGV4Ci0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfSW5kZXgpOyAKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcHJlZElkVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDEwMDsKLQkJcHJlZElkVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcHJlZElkVGV4dC5zZXRUZXh0KG5ldyBJbnRlZ2VyKHByZWRNYXAuZ2V0SWQoKSkudG9TdHJpbmcoKSk7Ci0JCS8vIHByZWRJZFRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCS8vIFByZXNlbnRhaW9uIE5hbWUKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlwcmVzZW50YXRpb25OYW1lID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDAwOwotCQlwcmVzZW50YXRpb25OYW1lLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJcHJlc2VudGF0aW9uTmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlXb3JrT3JkZXIgd28gPSBwcmVkTWFwLmdldFdvcmtPcmRlcigpOwotCQlwcmVzZW50YXRpb25OYW1lLnNldFRleHQoUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSh3by5nZXRQcmVkKCkpKTsKLQotCQkvLyBEZXBlbmRlbmN5Ci0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfRGVwZW5kZW5jeSk7IC8vJE5PTi1OTFMtMSQKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJZGVwZW5kZW5jeSA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJZGVwZW5kZW5jeS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZGVwZW5kZW5jeS5zZXRJdGVtcyhkZXBlbmRlbmN5TGlzdCk7Ci0KLQkJU3RyaW5nIGRlcGVkZW5jeU5hbWUgPSB3by5nZXRMaW5rVHlwZSgpLmdldE5hbWUoKTsKLQkJaWYgKHdvLmdldExpbmtUeXBlKCkuZ2V0VmFsdWUoKSA9PSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0gpIHsKLQkJCWRlcGVkZW5jeU5hbWUgPSBGSU5JU0hfVE9fRklOSVNIOwotCQl9IGVsc2UgaWYgKHdvLmdldExpbmtUeXBlKCkuZ2V0VmFsdWUoKSA9PSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVCkgewotCQkJZGVwZWRlbmN5TmFtZSA9IEZJTklTSF9UT19TVEFSVDsKLQkJfSBlbHNlIGlmICh3by5nZXRMaW5rVHlwZSgpLmdldFZhbHVlKCkgPT0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19GSU5JU0gpIHsKLQkJCWRlcGVkZW5jeU5hbWUgPSBTVEFSVF9UT19GSU5JU0g7Ci0JCX0gZWxzZSBpZiAod28uZ2V0TGlua1R5cGUoKS5nZXRWYWx1ZSgpID09IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fU1RBUlQpIHsKLQkJCWRlcGVkZW5jeU5hbWUgPSBTVEFSVF9UT19TVEFSVDsKLQkJfQotCQlkZXBlbmRlbmN5LnNldFRleHQoZGVwZWRlbmN5TmFtZSk7Ci0KLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxpbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcHJlZElkVGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBldmVudCkgewotCQkJCWludCBuZXdJZDsKLQkJCQl0cnkgewotCQkJCQluZXdJZCA9IG5ldyBJbnRlZ2VyKHByZWRJZFRleHQuZ2V0VGV4dCgpKS5pbnRWYWx1ZSgpOwotCQkJCQlpZiAobmV3SWQgPCAwKQotCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5V2FybmluZygKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJUaXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlck1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJcHJlZElkVGV4dC5zZXRUZXh0KG5ldyBJbnRlZ2VyKHByZWRNYXAuZ2V0SWQoKSkudG9TdHJpbmcoKSk7Ci0JCQkJCXByZWRJZFRleHQuc2V0Rm9jdXMoKTsKLQkJCQkJcHJlZElkVGV4dC5zZWxlY3RBbGwoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChhbHJlYWR5RXhpc3RzKG5ld0lkKSkgewotCQkJCQlwcmVkSWRUZXh0LnNldFRleHQobmV3IEludGVnZXIocHJlZE1hcC5nZXRJZCgpKS50b1N0cmluZygpKTsKLQotCQkJCQlwcmVkSWRUZXh0LnNlbGVjdEFsbCgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHByZWRJRExpc3QgPSBnZXRQcmVkSWQobmV3SWQpOwotCQkJCWlmIChwcmVkSURMaXN0ID09IG51bGwpCi0JCQkJCXJldHVybjsKLQotCQkJCVN0cmluZyBzdHIgPSBQcm9jZXNzVXRpbC5jaGVja1ByZWRlY2Vzc29yTGlzdChlbGVtZW50LAotCQkJCQkJcHJlZElETGlzdCwgYWRhcHRlckZhY3RvcnksIHByb2Nlc3MsIHByZWRlY2Vzc29ycyk7Ci0JCQkJaWYgKHN0ciAhPSBudWxsKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZSwgc3RyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcmVkSWRUZXh0LnNldFRleHQobmV3IEludGVnZXIocHJlZE1hcC5nZXRJZCgpKS50b1N0cmluZygpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlwcmVzZW50YXRpb25OYW1lLnNldFRleHQoZ2V0TmFtZShuZXdJZCkpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEdldCBwcmVzZW50YXRpb24gbmFtZS9uYW1lIGZvciB0aGlzIHByZWRlY2Vzc29yIGlkCi0JICogCi0JICogQHBhcmFtIG5ld0lkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldE5hbWUoaW50IG5ld0lkKSB7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LAotCQkJCXByb2Nlc3MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJSW50ZWdlciBpZCA9IG5ldyBJbnRlZ2VyKGl0ZW1Qcm92aWRlci5nZXRJZCgpKTsKLQkJCW9iaiA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0KLQkJCWlmIChuZXdJZCA9PSBpZC5pbnRWYWx1ZSgpKSB7Ci0JCQkJbmFtZSA9ICgoQnJlYWtkb3duRWxlbWVudCkgb2JqKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJaWYgKFN0clV0aWwuaXNCbGFuayhuYW1lKSkgewotCQkJCQluYW1lID0gKChCcmVha2Rvd25FbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgcHJlZGVjZXNzb3IgSWQgYWxyZWFkeSBleGlzdHMKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFscmVhZHlFeGlzdHMoaW50IG5ld0lkKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRNYXBMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gKFByZWRlY2Vzc29yTWFwKSBpdG9yLm5leHQoKTsKLQkJCWlmICgobWFwLmdldElkKCkgPT0gbmV3SWQpICYmIChwcmVkTWFwLmdldElkKCkgIT0gbmV3SWQpKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yTWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29tbWFuZCBzZXBhcmF0ZWQgbGlzdCBvZiBhbGwgcHJlZGVjZXNzb3IKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZElkKGludCBuZXdJZCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRNYXBMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gKFByZWRlY2Vzc29yTWFwKSBpdG9yLm5leHQoKTsKLQkJCWlmIChwcmVkTWFwLmdldElkKCkgPT0gbWFwLmdldElkKCkpIHsKLQkJCQlidWYuYXBwZW5kKG5ld0lkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnVmLmFwcGVuZChtYXAuZ2V0SWQoKSk7Ci0JCQl9Ci0KLQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHBhcmVudCk7Ci0JCXBhcmVudAotCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfVGl0bGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNva1ByZXNzZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJLy8gbmV3IGlkCi0JCWludCBuZXdJZCA9IG5ldyBJbnRlZ2VyKHByZWRJZFRleHQuZ2V0VGV4dCgpKS5pbnRWYWx1ZSgpOwotCQkvLyBuZSBsaW5rIHR5cGUKLQkJV29ya09yZGVyVHlwZSB3b3JrT3JkZXJUeXBlID0gZ2V0V29ya09yZGVyVHlwZSgpOwotCi0JCWlmICgobmV3SWQgIT0gcHJlZE1hcC5nZXRJZCgpKQotCQkJCXx8ICghd29ya09yZGVyVHlwZS5lcXVhbHMocHJlZE1hcC5nZXRXb3JrT3JkZXIoKS5nZXRMaW5rVHlwZSgpKSkpIHsKLQkJCVN0cmluZyBwcmVkSURMaXN0ID0gZ2V0UHJlZElkKG5ld0lkKTsKLQkJCWlmIChwcmVkSURMaXN0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlTdHJpbmcgc3RyID0gUHJvY2Vzc1V0aWwuY2hlY2tQcmVkZWNlc3Nvckxpc3QoZWxlbWVudCwgcHJlZElETGlzdCwKLQkJCQkJYWRhcHRlckZhY3RvcnksIHByb2Nlc3MsIHByZWRlY2Vzc29ycyk7Ci0JCQlpZiAoc3RyICE9IG51bGwpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZSwgc3RyKTsgLy8kTk9OLU5MUy0xJAotCQkJCXByZWRJZFRleHQuc2V0VGV4dChuZXcgSW50ZWdlcihwcmVkTWFwLmdldElkKCkpLnRvU3RyaW5nKCkpOwotCQkJfQotCi0JCQkvLyByZW1vdmUgaXQKLQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQkJcHJlZE1hcC5nZXRXb3JrT3JkZXIoKSwgLTEpOwotCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQljbG9zZSgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXByZWRNYXBMaXN0LnJlbW92ZShwcmVkTWFwKTsKLQotCQkJaW50IHNpemUgPSBwcmVkZWNlc3NvcnMuc2l6ZSgpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHByZWRlY2Vzc29ycwotCQkJCQkJLmdldChpKTsKLQotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQlmaW5kX3ByZWQ6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50Ci0JCQkJCQkuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVdvcmtPcmRlciB3byA9IChXb3JrT3JkZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKHdvLmdldFByZWQoKSA9PSBlKSB7Ci0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQlicmVhayBmaW5kX3ByZWQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFmb3VuZCkgewotCQkJCQlXb3JrT3JkZXIgd28gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKTsKLQkJCQkJd28uc2V0UHJlZChlKTsKLQkJCQkJd28uc2V0TGlua1R5cGUod29ya09yZGVyVHlwZSk7Ci0JCQkJCWJvb2xlYW4gc3RhdCA9IGFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQkJCQkJCXdvLCAtMSk7Ci0JCQkJCWlmICghc3RhdCkKLQkJCQkJCXJldHVybjsKLQotCQkJCQlwcmVkTWFwLnNldElkKG5ld0lkKTsKLQkJCQkJcHJlZE1hcC5zZXRXb3JrT3JkZXIod28pOwotCQkJCQlwcmVkTWFwTGlzdC5hZGQocHJlZE1hcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHdvcmsgb3JkZXIgbGluayB0eXBlIGZyb20gVUkKLQkgKiAKLQkgKiBAcmV0dXJuIAotCSAqIAkJCVdvcmsgT3JkZXIgdHlwZQotCSAqLwotCXByaXZhdGUgV29ya09yZGVyVHlwZSBnZXRXb3JrT3JkZXJUeXBlKCkgewotCQlpbnQgaW5kZXggPSBkZXBlbmRlbmN5LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCVdvcmtPcmRlclR5cGUgdHlwZTsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVF9MSVRFUkFMOwotCQl9IGVsc2UgaWYgKGluZGV4ID09IDEpIHsKLQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0hfTElURVJBTDsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSAyKSB7Ci0JCQl0eXBlID0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVF9MSVRFUkFMOwotCQl9IGVsc2UgewotCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fRklOSVNIX0xJVEVSQUw7Ci0JCX0KLQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9QcmVkZWNlc3Nvck1hcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJlZGVjZXNzb3JNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODVkNTAyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9QcmVkZWNlc3Nvck1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci0KLS8qKgotICogTWFwIG9mIHByZWRlY2Vzc29yIElEIGFuZCBjb3JyZXNwb25kaW5nIHdvcmsgb3JkZXIKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJlZGVjZXNzb3JNYXAgewotCXByaXZhdGUgaW50IGlkOwotCi0JcHJpdmF0ZSBXb3JrT3JkZXIgd287Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAJCVByZWRlY2Vzc29yIElECi0JICogQHBhcmFtIHdvCi0JICogCQlXb3JrT3JkZXIgb2JqZWN0Ci0JICovCi0JcHVibGljIFByZWRlY2Vzc29yTWFwKGludCBpZCwgV29ya09yZGVyIHdvKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy53byA9IHdvOwotCX0KLQotCS8qKgotCSAqIEdldCBwcmVkZWNlc3NvciBJRAotCSAqIEByZXR1cm4KLQkgKiAJCQlQcmVkZWNlc3NvciBJRAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SWQoKSB7Ci0JCXJldHVybiB0aGlzLmlkOwotCX0KLQotCS8qKgotCSAqIFNldCBQcmVkZWNlc3NvciBJRAotCSAqIEBwYXJhbSBpZAotCSAqIAkJCVByZWRlY2Vzc29yIElECi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoaW50IGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHdvcmsgb3JkZXIKLQkgKiBAcmV0dXJuCi0JICogCQlXb3JrIE9yZGVyCi0JICovCi0JcHVibGljIFdvcmtPcmRlciBnZXRXb3JrT3JkZXIoKSB7Ci0JCXJldHVybiB0aGlzLndvOwotCX0KLQotCS8qKgotCSAqIFNldCBXb3JrIE9yZGVyCi0JICogQHBhcmFtIHdvCi0JICogCQkJV29yayBPcmRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtPcmRlcihXb3JrT3JkZXIgd28pIHsKLQkJdGhpcy53byA9IHdvOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDMzOWI1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSAqIFByb3BlcnRpZXMgcmVzb3VyY2VzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9wZXJ0aWVzUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKQotCQkJCQkJCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgUHJvcGVydGllc1Jlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0RvY3VtZW50SW5mb3JtYXRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9ndWlkYW5jZUluZm9ybWF0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9vcHRpb25JbmZvcm1hdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdG9yX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlsZXN0b25lX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pbGVzdG9uZV9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdG9yX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX05vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUHJlc2VudGF0aW9uTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX2JyaWVmRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19tYWluRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19wdXJwb3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfcHJlZml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfVHlwZV9OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVHlwZV9UYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVHlwZV9Sb2xlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVHlwZV9Xb3JrUHJvZHVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdF9UeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X01vZGVsSW5mbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9UeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X3ByZXNlbnRhdGlvbk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfYWx0ZXJuYXRpdmVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X2hvd1RvU3RhZmY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX3VzYWdlR3VpZGFuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfUm9hZG1hcFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1JvYWRtYXBEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfU2VsZWN0ZWRfUm9hZG1hcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9TZWxlY3RlZF9HZW5lcmFsR3VpZGFuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfU2VsZWN0ZWRfQ29tbXVuaWNhdGlvbk1hdGVyaWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1NlbGVjdGVkX0VkdWNhdGlvbk1hdGVyaWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0RpYWdyYW1UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9EaWFncmFtRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfQURJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9BRERJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9XUERJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Vc2VBREltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1VzZUFEREltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1VzZVdQREltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0Fzc2lnbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Xb3JrUm9sbHVwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1RlYW1Sb2xsdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9UZWFtUm9sbHVwRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9PcHRpb25fTXVsdGlwbGVPY3VycmFuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9PcHRpb25fT3B0aW9uYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9PcHRpb25fUGxhbm5lZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X09wdGlvbl9TdXByZXNzZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRXZlbnREcml2ZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfT25nb2luZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9SZXBlYXRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfUFJFU0VOVEFUSU9OX05BTUVfVEVYVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9ERVBFTkRFTkNZX1RFWFQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9BZGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9FZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdG9yX1JlZmluZWREZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkX1N0ZXBzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JfVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcG9zaXRlUm9sZV9Sb2xlX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZWFtUHJvZmlsZV9Sb2xlX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1JpY2hUZXh0X0NvbGxhcHNlSW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19SaWNoVGV4dF9FeHBhbmRJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0FkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0FkZEZyb21Qcm9jZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUmVuYW1lX01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19SZW1vdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19VcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0Rvd247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0ludmFsaWROYW1lVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19JbnZhbGlkTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1JlbmFtZV9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0ludmFsaWRQcmVzZW50YXRpb25OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UZWFtQXNzaWduRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1RlYW1EaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Db21wb3NpdGVSb2xlQXNzaWduRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Ob0l0ZW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfSXRlbXNTZWxlY3RlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX05vUHJvcGVydGllc0F2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVkZWNlc3NvckRpYWxvZ19UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWRlY2Vzc29yRGlhbG9nX0luZGV4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWRlY2Vzc29yRGlhbG9nX1ByZXNlbnRhdGlvbk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZGVjZXNzb3JEaWFsb2dfRGVwZW5kZW5jeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX3RleHRFZGl0Q2VsbF9wcm9ibGVtX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFByb3BlcnRpZXNSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleSBhbmQgZm9ybWF0dGVkCi0JICogd2l0aCBhIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gb2JqZWN0LgotCSAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBrZXksIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIG5ldyBPYmplY3RbXSB7IGRhdGEgfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YTBlNDUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBwcm9wZXJ0aWVzIAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzVXRpbCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHR5cGUgb2YgdGhlIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICogCQlUeXBlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBwcmVmaXggPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfVHlwZV9OYW1lOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfQ0FQQUJJTElUWV9QQVRURVJOOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX0RFTElWRVJZX1BST0NFU1M7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX1BST0NFU1M7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9QSEFTRTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9JVEVSQVRJT047Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9BQ1RJVklUWTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX1RBU0tfREVTQ1JJUFRPUjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX1JPTEVfREVTQ1JJUFRPUjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9NSUxFU1RPTkU7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9URUFNX1BST0ZJTEU7Ci0JCX0KLQotCQlyZXR1cm4gcHJlZml4OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHlwZSBvZiB0aGUgb2JqZWN0IGluIGxvd2VyIGNhc2UKLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybgotCSAqIAkJVHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVMb3dlcihPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyB0eXBlID0gZ2V0VHlwZShvYmopOwotCQkKLQkJcmV0dXJuIFN0clV0aWwudG9Mb3dlcih0eXBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNWaWV3Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzVmlld0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODY3NTA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNWaWV3Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLS8qKgotICogQ29uc3RhbnRzIGZvciBwcm9wZXJ0aWVzIHZpZXcKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnRpZXNWaWV3Q29uc3RhbnRzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfREVTQ1JJUFRPUiA9ICJSb2xlRGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktQUk9EVUNUUyA9ICJXb3JrUHJvZHVjdHMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0RFU0NSSVBUT1IgPSAiVGFza0Rlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFUyA9ICJSb2xlcyI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVsYXRpb25TZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZWxhdGlvblNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzAyNmFmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZWxhdGlvblNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIHVzZWQgdG8gZGlzcGxheSByZWxhdGlvbnNoaXBzIGJldHdlZW4gZGVzY3JpcHRvcnMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVsYXRpb25TZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbnVsbDsKLQotCS8vIGVsZW1lbnQKLQlwcm90ZWN0ZWQgRGVzY3JpcHRvciBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGRfMSwgY3RybF9hZGRfMiwgY3RybF9hZGRfMywgY3RybF9hZGRfNDsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfcmVtb3ZlXzEsIGN0cmxfcmVtb3ZlXzIsIGN0cmxfcmVtb3ZlXzMsIGN0cmxfcmVtb3ZlXzQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZF9wcm9jXzEsIGN0cmxfYWRkX3Byb2NfMiwgY3RybF9hZGRfcHJvY18zLAotCQkJY3RybF9hZGRfcHJvY180OzsKLQotCXByaXZhdGUgVGFibGUgY3RybF90YWJsZV8xLCBjdHJsX3RhYmxlXzIsIGN0cmxfdGFibGVfMywgY3RybF90YWJsZV80OwotCi0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyMSwgdGFibGVWaWV3ZXIyLCB0YWJsZVZpZXdlcjMsCi0JCQl0YWJsZVZpZXdlcjQ7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZl9kZXNjOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFiU3RyaW5nOwotCQotCXByaXZhdGUgU3RyaW5nIHRpdGxlLCBkZXNjLCB0YWJsZTEsIHRhYmxlMiwgdGFibGUzLCB0YWJsZTQ7Ci0KLQlwcml2YXRlIGludCB0YWJsZUNvdW50OwotCi0JcHJpdmF0ZSBib29sZWFuW10gY2hhbmdlc0FsbG93ZWQ7Ci0KLQlQcm9jZXNzIHByb2Nlc3M7Ci0KLQlJRmlsdGVyIGRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyOwotCi0JcHJvdGVjdGVkIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0b3JUYWJOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCQlpbml0KCk7Ci0KLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIGNyZWF0ZSBzZWN0aW9uCi0JCWNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQotCQkvLyBhZGQgbGlzdGVuZXJzCi0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIHVwZGF0ZSBjb250cm9scwotCQl1cGRhdGVDb250cm9scygpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFiRGF0YShTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjLCBTdHJpbmcgdGFibGUxLCBTdHJpbmcgdGFibGUyLCBTdHJpbmcgdGFibGUzLCBTdHJpbmcgdGFibGU0LCBTdHJpbmcgdGFiU3RyaW5nKSB7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJdGhpcy5kZXNjID0gZGVzYzsKLQkJdGhpcy50YWJsZTEgPSB0YWJsZTE7Ci0JCXRoaXMudGFibGUyID0gdGFibGUyOwotCQl0aGlzLnRhYmxlMyA9IHRhYmxlMzsKLQkJdGhpcy50YWJsZTQgPSB0YWJsZTQ7Ci0JCQotCQl0aGlzLnRhYlN0cmluZyA9IHRhYlN0cmluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJsZURhdGEoaW50IHRhYmxlQ291bnQsIGJvb2xlYW5bXSBjaGFuZ2VzQWxsb3dlZCkgewotCQl0aGlzLnRhYmxlQ291bnQgPSB0YWJsZUNvdW50OwotCQl0aGlzLmNoYW5nZXNBbGxvd2VkID0gY2hhbmdlc0FsbG93ZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IGRlc2NyaXB0b3Igb2JqZWN0Ci0JCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IGFjdGlvbiBtYW5hZ2VyCi0JCWFjdGlvbk1nciA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCQkJaW5pdENvbnRlbnRQcm92aWRlcjEoKTsKLQkJCQlpbml0Q29udGVudFByb3ZpZGVyMigpOwotCQkJCWluaXRDb250ZW50UHJvdmlkZXIzKCk7Ci0JCQkJaW5pdENvbnRlbnRQcm92aWRlcjQoKTsKLQotCQkJCS8vIGhpZGUvc2hvdyBjb250cm9scyBiYXNlZCBvbiBlZGl0YWJsZQotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBkZXNjcmlwdG9yIHJlbGF0aW9uIHNlY3Rpb246ICIgKyBlbGVtZW50LCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBjb250cm9scyBiYXNlZCBvbiBlZGl0YWJsZSBib29sZWFuIHZhbHVlLiBDb250cm9scyBjb3VsZCBiZQotCSAqIGVkaXRhYmxlIG9yIHJlYWQtb25seSBhZnRlciB0aGlzLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVsZW1lbnQgIitlbGVtZW50LmdldE5hbWUoKSArCi0JCS8vICJFZGl0YWJsZS0iK2VkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkXzEgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF8yICE9IG51bGwpCi0JCQljdHJsX2FkZF8yLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfMyAhPSBudWxsKQotCQkJY3RybF9hZGRfMy5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkXzQgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJaWYgKGN0cmxfYWRkX3Byb2NfMSAhPSBudWxsKQotCQkJY3RybF9hZGRfcHJvY18xLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfcHJvY18yICE9IG51bGwpCi0JCQljdHJsX2FkZF9wcm9jXzIuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF9wcm9jXzMgIT0gbnVsbCkKLQkJCWN0cmxfYWRkX3Byb2NfMy5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkX3Byb2NfNCAhPSBudWxsKQotCQkJY3RybF9hZGRfcHJvY180LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIxCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQlpZiAodGFibGVWaWV3ZXIyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIyLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQkJCWlmIChjdHJsX3JlbW92ZV8yICE9IG51bGwpCi0JCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGN0cmxfcmVtb3ZlXzIgIT0gbnVsbCkKLQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHRhYmxlVmlld2VyMyAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMy5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCWlmICh0YWJsZVZpZXdlcjQgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIGFsbCBsYWJlbCBhbmQgY29udGVudCBwcm92aWRlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIGZpcnN0IHRhYmxlIGluIHByb3BlcnRpZXMgdmlldwotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjEoKSB7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgc2Vjb25kIHRhYmxlIGluIHByb3BlcnRpZXMgdmlldwotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjIoKSB7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgdGhpcmQgdGFibGUgaW4gcHJvcGVydGllcyB2aWV3Ci0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMygpIHsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBmb3VydGggdGFibGUgaW4gcHJvcGVydGllcyB2aWV3Ci0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyNCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiBkZXNjcmlwdG9ycyBmcm9tIHRoZSBwcm9jZXNzCi0JICogQHJldHVybgotCSAqIAkJCUxpc3Qgb2YgZGVzY3JpcHRvcnMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXREZXNjcmlwdG9yc0Zyb21Qcm9jZXNzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGZpbHRlciB3aGljaCBhbGxvd3MgZmlsdGVyaW5nIGVsZW1lbnQgYmFzZWQgb24gbWV0aG9kIGNvbmZpZ3VyYXRpb24gCi0JICogQHJldHVybgotCSAqIAkJRmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaW50IHRhYmxlSGVpZ2h0ID0gODA7Ci0KLQkJLy8gY3JlYXRlIHNlY3Rpb24KLQkJU2VjdGlvbiBhU2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQl0aXRsZSwgZGVzYyk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgYVNlY3Rpb24sCi0JCQkJMiwgZmFsc2UpOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSAxCi0JCWludCBjb3VudCA9IDA7Ci0JCXsKLQkJCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGUxKTsKLQotCQkJY3RybF90YWJsZV8xID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCB0YWJsZUhlaWdodCk7Ci0JCQl0YWJsZVZpZXdlcjEgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV8xKTsKLQkJCWluaXRDb250ZW50UHJvdmlkZXIxKCk7Ci0KLQkJCXRhYmxlVmlld2VyMS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdGFibGVWaWV3ZXIxLnNldElucHV0KGVsZW1lbnQpOwotCi0JCQkvLyBjcmVhdGUgYnV0dG9ucyBmb3IgdGFibGUxCi0JCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCi0JCQlpZiAoY2hhbmdlc0FsbG93ZWRbY291bnRdKSB7Ci0JCQkJY3RybF9hZGRfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsgCi0JCQkJY3RybF9hZGRfcHJvY18xID0gRm9ybVVJCi0JCQkJCQkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkRnJvbVByb2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJY3RybF9yZW1vdmVfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0JCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJfQotCQljb3VudCsrOwotCi0JCS8vIGNyZWF0ZSB0YWJsZTIKLQkJaWYgKGNvdW50IDwgdGFibGVDb3VudCkgewotCQkJQ29tcG9zaXRlIHBhbmUzID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUzLCB0YWJsZTIpOwotCi0JCQljdHJsX3RhYmxlXzIgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTMsIHRhYmxlSGVpZ2h0KTsKLQkJCXRhYmxlVmlld2VyMiA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzIpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlcjIoKTsKLQotCQkJdGFibGVWaWV3ZXIyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl0YWJsZVZpZXdlcjIuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTIKLQkJCUNvbXBvc2l0ZSBwYW5lNCA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0JCQlpZiAoY2hhbmdlc0FsbG93ZWRbY291bnRdKSB7Ci0JCQkJY3RybF9hZGRfMiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTQsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsgCi0JCQkJY3RybF9hZGRfcHJvY18yID0gRm9ybVVJCi0JCQkJCQkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU0LCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkRnJvbVByb2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJY3RybF9yZW1vdmVfMiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTQsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0JCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUzKTsKLQkJfQotCi0JCWNvdW50Kys7Ci0KLQkJLy8gQ3JlYXRlIHRhYmxlMwotCQlpZiAoY291bnQgPCB0YWJsZUNvdW50KSB7Ci0JCQlDb21wb3NpdGUgcGFuZTUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTUsIHRhYmxlMyk7Ci0KLQkJCWN0cmxfdGFibGVfMyA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lNSwgdGFibGVIZWlnaHQpOwotCQkJdGFibGVWaWV3ZXIzID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMyk7Ci0JCQlpbml0Q29udGVudFByb3ZpZGVyMygpOwotCi0JCQl0YWJsZVZpZXdlcjMuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCXRhYmxlVmlld2VyMy5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMgotCQkJQ29tcG9zaXRlIHBhbmU2ID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWlmICgobmV3IEJvb2xlYW4oY2hhbmdlc0FsbG93ZWRbY291bnRdKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQljdHJsX2FkZF8zID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNiwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOyAKLQkJCQljdHJsX2FkZF9wcm9jXzMgPSBGb3JtVUkKLQkJCQkJCS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTYsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQljdHJsX3JlbW92ZV8zID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNiwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOyAKLQkJCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTUpOwotCQl9Ci0JCWNvdW50Kys7Ci0KLQkJaWYgKGNvdW50IDwgdGFibGVDb3VudCkgewotCQkJQ29tcG9zaXRlIHBhbmU3ID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmU3LCB0YWJsZTQpOwotCi0JCQljdHJsX3RhYmxlXzQgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTcsIHRhYmxlSGVpZ2h0KTsKLQkJCXRhYmxlVmlld2VyNCA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzQpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlcjQoKTsKLQotCQkJdGFibGVWaWV3ZXI0LnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl0YWJsZVZpZXdlcjQuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTQKLQkJCUNvbXBvc2l0ZSBwYW5lOCA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0JCQlpZiAoKG5ldyBCb29sZWFuKGNoYW5nZXNBbGxvd2VkW2NvdW50XSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJY3RybF9hZGRfNCA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTgsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsgCi0JCQkJY3RybF9hZGRfcHJvY180ID0gRm9ybVVJCi0JCQkJCQkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU4LCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkRnJvbVByb2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJY3RybF9yZW1vdmVfNCA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTgsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0JCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmU4KTsKLQotCQl9Ci0KLQkJLy8gY3JlYXRlIGJyaWVmIGRlc2NyaXB0aW9uCi0JCWludCBoZWlnaHRIaW50ID0gNDA7Ci0JCS8vIGludCBob3Jpem9udGFsU3BhbiA9IDI7Ci0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfYnJpZWZEZXNjcmlwdGlvbiwgaGVpZ2h0SGludCk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9icmllZl9kZXNjID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQloZWlnaHRIaW50LCBoZWlnaHRIaW50KTsKLQkJY3RybF9icmllZl9kZXNjLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihzZWN0aW9uQ29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGRMaXN0ZXJlcnMKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCS8qKgotCQkgKiBGaXJzdCBzZXQgb2YgbGlzdGVuZXJzCi0JCSAqLwotCQlpbnQgY291bnQgPSAwOwotCQlpZiAoY291bnQgPCB0YWJsZUNvdW50KSB7Ci0JCQljdHJsX3RhYmxlXzEuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMQotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXRhYmxlVmlld2VyMQotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMQotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb24gKyAiIC0gIiArIHNlbGVjdGlvbi5zaXplKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQlpZiAoY2hhbmdlc0FsbG93ZWRbY291bnRdKSB7Ci0JCQkJY3RybF9hZGRfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKLQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoZ2V0RXhpc3RpbmdFbGVtZW50czEoKSk7Ci0KLQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsIHRhYlN0cmluZywKLQkJCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQuc2V0VGl0bGUodGFiU3RyaW5nKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCWFkZEl0ZW1zMShmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJdGFibGVWaWV3ZXIxLnJlZnJlc2goKTsKLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX2FkZF9wcm9jXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyID0gZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKTsKLQkJCQkJCXByb2Nlc3MgPSBnZXRQcm9jZXNzKCk7Ci0JCQkJCQlpZiAoZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgIT0gbnVsbCAmJiBwcm9jZXNzICE9IG51bGwpIHsKLQkJCQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBnZXRFeGlzdGluZ0VsZW1lbnRzMSgpOwotCQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKAotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCksCi0JCQkJCQkJCQlkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciwgcHJvY2VzcywKLQkJCQkJCQkJCWdldERlc2NyaXB0b3JUYWJOYW1lKCksIGV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQkJZmQub3BlbigpOwotCQkJCQkJCWFkZEZyb21Qcm9jZXNzSXRlbXMxKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIxLnJlZnJlc2goKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZV8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMQotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtczEocm1JdGVtcyk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIxLnJlZnJlc2goKTsKLQotCQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCQl0YWJsZVZpZXdlcjEuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JCWNvdW50Kys7Ci0KLQkJLyoqCi0JCSAqIFNlY29uZCBzZXQgb2YgbGlzdGVuZXJzCi0JCSAqLwotCQlpZiAoY291bnQgPCB0YWJsZUNvdW50KSB7Ci0JCQljdHJsX3RhYmxlXzIuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMgotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpIHsKLQkJCQkJCWlmIChjdHJsX3JlbW92ZV8yICE9IG51bGwpCi0JCQkJCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXRhYmxlVmlld2VyMgotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMgotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKSB7Ci0JCQkJCQkJCWlmIChjdHJsX3JlbW92ZV8yICE9IG51bGwpCi0JCQkJCQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCQkJCWN0cmxfYnJpZWZfZGVzYwotCQkJCQkJCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbiArICIgLSAiICsgc2VsZWN0aW9uLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWlmIChjaGFuZ2VzQWxsb3dlZFtjb3VudF0pIHsKLQkJCQljdHJsX2FkZF8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcigpOwotCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdChnZXRFeGlzdGluZ0VsZW1lbnRzMigpKTsKLQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsIHRhYlN0cmluZywKLQkJCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQuc2V0VGl0bGUodGFiU3RyaW5nKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCWFkZEl0ZW1zMihmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJdGFibGVWaWV3ZXIyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9hZGRfcHJvY18yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciA9IGdldEZpbHRlckZvckRlc2NyaXB0b3JzKCk7Ci0JCQkJCQlwcm9jZXNzID0gZ2V0UHJvY2VzcygpOwotCQkJCQkJaWYgKGRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyICE9IG51bGwgJiYgcHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gZ2V0RXhpc3RpbmdFbGVtZW50czIoKTsKLQkJCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZygKLQkJCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCQkJCS5nZXRTaGVsbCgpLAotCQkJCQkJCQkJZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIsIHByb2Nlc3MsCi0JCQkJCQkJCQlnZXREZXNjcmlwdG9yVGFiTmFtZSgpLCBleGlzdGluZ0VsZW1lbnRzKTsKLQotCQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCQlhZGRGcm9tUHJvY2Vzc0l0ZW1zMihmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJCXRhYmxlVmlld2VyMi5yZWZyZXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfcmVtb3ZlXzIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIyCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJCXJlbW92ZUl0ZW1zMihybUl0ZW1zKTsKLQkJCQkJCQl0YWJsZVZpZXdlcjIucmVmcmVzaCgpOwotCi0JCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJCXRhYmxlVmlld2VyMi5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJY291bnQrKzsKLQotCQkvKioKLQkJICogVGhpcmQgc2V0IG9mIGxpc3RlbmVycwotCQkgKi8KLQkJaWYgKGNvdW50IDwgdGFibGVDb3VudCkgewotCQkJY3RybF90YWJsZV8zLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjMKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl0YWJsZVZpZXdlcjMKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjMKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCQkJCWN0cmxfYnJpZWZfZGVzYwotCQkJCQkJCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbiArICIgLSAiICsgc2VsZWN0aW9uLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWlmICgobmV3IEJvb2xlYW4oY2hhbmdlc0FsbG93ZWRbY291bnRdKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQljdHJsX2FkZF8zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcigpOwotCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdChnZXRFeGlzdGluZ0VsZW1lbnRzMygpKTsKLQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsIHRhYlN0cmluZywKLQkJCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQuc2V0VGl0bGUodGFiU3RyaW5nKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCWFkZEl0ZW1zMyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJdGFibGVWaWV3ZXIzLnJlZnJlc2goKTsKLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX2FkZF9wcm9jXzMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyID0gZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKTsKLQkJCQkJCXByb2Nlc3MgPSBnZXRQcm9jZXNzKCk7Ci0JCQkJCQlpZiAoZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgIT0gbnVsbCAmJiBwcm9jZXNzICE9IG51bGwpIHsKLQkJCQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBnZXRFeGlzdGluZ0VsZW1lbnRzMygpOwotCQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKAotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCksCi0JCQkJCQkJCQlkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciwgcHJvY2VzcywKLQkJCQkJCQkJCWdldERlc2NyaXB0b3JUYWJOYW1lKCksIGV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQkJZmQub3BlbigpOwotCQkJCQkJCWFkZEZyb21Qcm9jZXNzSXRlbXMzKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIzLnJlZnJlc2goKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZV8zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMwotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtczMocm1JdGVtcyk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIzLnJlZnJlc2goKTsKLQotCQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCQl0YWJsZVZpZXdlcjMuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JCWNvdW50Kys7Ci0KLQkJLyoqCi0JCSAqIEZvdXRoIHNldCBvZiBsaXN0ZW5lcnMKLQkJICovCi0JCWlmIChjb3VudCA8IHRhYmxlQ291bnQpIHsKLQkJCWN0cmxfdGFibGVfNC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXI0Ci0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdGFibGVWaWV3ZXI0Ci0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXI0Ci0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb24gKyAiIC0gIiArIHNlbGVjdGlvbi5zaXplKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQlpZiAoKG5ldyBCb29sZWFuKGNoYW5nZXNBbGxvd2VkW2NvdW50XSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJY3RybF9hZGRfNC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKLQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoZ2V0RXhpc3RpbmdFbGVtZW50czQoKSk7Ci0JCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBlbGVtZW50LCB0YWJTdHJpbmcsCi0JCQkJCQkJCWV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCWZkLnNldFRpdGxlKHRhYlN0cmluZyk7Ci0JCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQlhZGRJdGVtczQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCXRhYmxlVmlld2VyNC5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfYWRkX3Byb2NfNC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgPSBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpOwotCQkJCQkJcHJvY2VzcyA9IGdldFByb2Nlc3MoKTsKLQkJCQkJCWlmIChkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciAhPSBudWxsICYmIHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IGdldEV4aXN0aW5nRWxlbWVudHM0KCk7Ci0JCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coCi0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyLCBwcm9jZXNzLAotCQkJCQkJCQkJZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSwgZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQkJYWRkRnJvbVByb2Nlc3NJdGVtczQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCQl0YWJsZVZpZXdlcjQucmVmcmVzaCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZV80LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyNAotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtczQocm1JdGVtcyk7Ci0JCQkJCQkJdGFibGVWaWV3ZXI0LnJlZnJlc2goKTsKLQotCQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCQl0YWJsZVZpZXdlcjQuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMxKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczIoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMyhMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXM0KExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMShMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczIoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMzKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zNChMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMxKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczIoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMyhMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXM0KExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfTsKLQotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9OwotCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czMoKSB7Ci0JCXJldHVybiBudWxsOwotCX07Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzNCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JlbW92ZURlc2NyaXB0b3JDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZW1vdmVEZXNjcmlwdG9yQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTUxZjA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JlbW92ZURlc2NyaXB0b3JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuUmVmZXJlbmNlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLlByb2Nlc3NEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gcmVtb3ZlIGRlc2NyaXB0b3JzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIExpc3QgZWxlbWVudHM7Ci0KLQlwcml2YXRlIERlc2NyaXB0b3IgZGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgQ29tbWFuZCBkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgZmVhdHVyZUlEOwotCi0JcHJpdmF0ZSBMaXN0IHJlZmVyZW5jZXM7Ci0KLQkvKioKLQkgKiBSZW1vdmUgcmVsYXRpb25zaGlwcwotCSAqLwotCXB1YmxpYyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChEZXNjcmlwdG9yIGRlc2MsIExpc3QgZWxlbWVudHMsIGludCBmZWF0dXJlSUQpIHsKLQotCQlzdXBlcigpOwotCi0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJdGhpcy5kZXNjID0gZGVzYzsKLQkJdGhpcy5mZWF0dXJlSUQgPSBmZWF0dXJlSUQ7Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkKLQkJTGlzdCBub3RVc2VkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJRGVzY3JpcHRvciBvID0gKERlc2NyaXB0b3IpIGVsZW1lbnRzLmdldChpKTsKLQotCQkJYm9vbGVhbiBjaGVja1JlZjsKLQkJCWlmIChvIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJewotCQkJCWNoZWNrUmVmID0gUHJvY2Vzc1V0aWwuY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JSZWZlcmVuY2VzKENvbGxlY3Rpb25zCi0JCQkJLnNpbmdsZXRvbihkZXNjKSwgKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbywgdHJ1ZSwgZmVhdHVyZUlEKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQljaGVja1JlZiA9IFByb2Nlc3NVdGlsLmNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoZGVzYywgbyk7Ci0JCQkKLQkJCWlmICghY2hlY2tSZWYpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGRlc2MpOwotCQkJCWlmIChhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhvKSkKLQkJCQkJbm90VXNlZFJlZmVyZW5jZXMuYWRkKG8pOwotCQkJfQotCQl9Ci0JCWlmICghKG5vdFVzZWRSZWZlcmVuY2VzLmlzRW1wdHkoKSkpIHsKLQkJCU9iamVjdFtdIHJlZlRvQmVEZWxldGVkID0gUmVmZXJlbmNlU2VsZWN0aW9uCi0JCQkJCS5nZXRSZWZlcmVuY2VzKG5vdFVzZWRSZWZlcmVuY2VzKTsKLQkJCXJlZmVyZW5jZXMgPSBBcnJheXMuYXNMaXN0KHJlZlRvQmVEZWxldGVkKTsKLQkJfQotCQkKLQkJcmVkbygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlpZiAoZGVzYyBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKQotCQl7Ci0JCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5zZXRQZXJmb3JtZWRQcmltYXJpbHlCeShudWxsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5yZW1vdmVBbGwoCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRBc3Npc3RlZEJ5KCkucmVtb3ZlQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRNYW5kYXRvcnlJbnB1dCgpLnJlbW92ZUFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRFeHRlcm5hbElucHV0KCkucmVtb3ZlQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldE9wdGlvbmFsSW5wdXQoKS5yZW1vdmVBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldE91dHB1dCgpLnJlbW92ZUFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZGVzYyBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQl7Ci0JCQlzd2l0Y2ggKGZlYXR1cmVJRCl7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJKChSb2xlRGVzY3JpcHRvcikgZGVzYykuZ2V0UmVzcG9uc2libGVGb3IoKS5yZW1vdmVBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhcmVmZXJlbmNlcy5pc0VtcHR5KCkpIHsKLQkJCWlmIChkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgPT0gbnVsbCkgewotCQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCA9IG5ldyBEZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoCi0JCQkJCQlyZWZlcmVuY2VzLCBmYWxzZSwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCkgewotCi0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGRlbGV0ZShMaXN0IGVsZW1lbnRzKSB7Ci0JCQkJCQlyZXR1cm4gUHJvY2Vzc0RlbGV0ZUFjdGlvbi5kZWxldGUoZWxlbWVudHMpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQotCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCi0JCQlpZiAoZGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGRlc2MuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJLy8gYmFzaWNhbGx5IHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0KLQkJaWYgKGRlc2MgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikKLQkJewotCQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQkJT2JqZWN0IG8gPSBlbGVtZW50cy5nZXQoMCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKFJvbGVEZXNjcmlwdG9yKW8pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZEFsbCgKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldEFzc2lzdGVkQnkoKS5hZGRBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldEV4dGVybmFsSW5wdXQoKS5hZGRBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0T3B0aW9uYWxJbnB1dCgpLmFkZEFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0T3V0cHV0KCkuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChkZXNjIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpCi0JCXsKLQkJCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJKChSb2xlRGVzY3JpcHRvcikgZGVzYykuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGRBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhcmVmZXJlbmNlcy5pc0VtcHR5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCAhPSBudWxsKQotCQkJCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQudW5kbygpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JewotCQlpZiAoZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kICE9IG51bGwpCi0JCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuZGlzcG9zZSgpOwotCQlpZihyZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCXJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJfQotCQlpZihtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5jbGVhcigpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3ByZXBhcmUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM4N2Y2NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9R2VuZXJhbCBJbmZvcm1hdGlvbgotUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGU9RG9jdW1lbnRhdGlvbiBJbmZvcm1hdGlvbgotQWN0aXZpdHlfZ3VpZGFuY2VJbmZvcm1hdGlvblRpdGxlPUd1aWRhbmNlCi1CcmVha2Rvd25FbGVtZW50X29wdGlvbkluZm9ybWF0aW9uVGl0bGU9QnJlYWtkb3duIE9wdGlvbnMKLVRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvblRpdGxlPVN0ZXBzCi0KLVRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIHN0ZXBzIHRvIHBlcmZvcm0gdGhpcyB0YXNrIGRlc2NyaXB0b3IuCi0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotUHJvY2Vzc19kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBkb2N1bWVudGF0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotCi1EZXNjcmlwdG9yX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlc2NyaXB0b3IuCi1EZXNjcmlwdG9yX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlc2NyaXB0b3IuCi1NaWxlc3RvbmVfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbWlsZXN0b25lLgotTWlsZXN0b25lX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG1pbGVzdG9uZS4KLQotQnJlYWtkb3duRWxlbWVudF9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBicmVha2Rvd24gZWxlbWVudC4KLVdvcmtCcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQuCi1EZXNjcmlwdG9yX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0b249UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGVzY3JpcHRvci4KLUFjdGl2aXR5X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFjdGl2aXR5LgotCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBicmVha2Rvd24gZWxlbWVudC4KLUFjdGl2aXR5X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhY3Rpdml0eS4KLURlc2NyaXB0b3JfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZG9jdW1lbnRhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlc2NyaXB0b3IuCi1Qcm9jZXNzX05vbmU9PDwgTk9ORSA+PgotUHJvY2Vzc19uYW1lPU5hbWU6Ci1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9UHJlc2VudGF0aW9uIG5hbWU6Ci1Qcm9jZXNzX2JyaWVmRGVzY3JpcHRpb249QnJpZWYgZGVzY3JpcHRpb246Ci1Qcm9jZXNzX21haW5EZXNjcmlwdGlvbj0gTWFpbiBkZXNjcmlwdGlvbjoKLVByb2Nlc3NfcHVycG9zZT1QdXJwb3NlOgotUHJvY2Vzc19wcmVmaXg9UHJlZml4OgotCi1CcmVha2Rvd25FbGVtZW50X1R5cGVfTmFtZT1CcmVha2Rvd24gRWxlbWVudAotCi1Qcm9jZXNzX1R5cGVfVGFzaz1NZXRob2QgdGFzazoKLVByb2Nlc3NfVHlwZV9Sb2xlPU1ldGhvZCByb2xlOgotUHJvY2Vzc19UeXBlX1dvcmtQcm9kdWN0PU1ldGhvZCB3b3JrIHByb2R1Y3Q6Ci0KLVdvcmtQcm9kdWN0X1R5cGU9V29yayBQcm9kdWN0IFR5cGU6Ci0KLUFjdGl2aXR5X01vZGVsSW5mbz1Nb2RlbCBpbmZvcm1hdGlvbjoKLUFjdGl2aXR5X1R5cGU9QWN0aXZpdHkgVHlwZToKLUFjdGl2aXR5X3ByZXNlbnRhdGlvbk5hbWU9UHJlc2VudGF0aW9uIG5hbWU6Ci1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmVzOgotQWN0aXZpdHlfaG93VG9TdGFmZj1Ib3cgdG8gc3RhZmY6Ci1CcmVha2Rvd25FbGVtZW50X2tleUNvbnNpZGVyYXRpb25zPUtleSBjb25zaWRlcmF0aW9uczoKLVByb2Nlc3NfdXNhZ2VHdWlkYW5jZT1Vc2FnZSBndWlkYW5jZToKLQotQWN0aXZpdHlfUm9hZG1hcFRpdGxlPVJvYWRtYXBzCi1BY3Rpdml0eV9Sb2FkbWFwRGVzY3JpcHRpb249UHJvdmlkZSBsaW5rcyB0byBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtIG9mIHJvYWRtYXBzLgotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlVGl0bGU9R2VuZXJhbCBHdWlkYW5jZQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlRGVzY3JpcHRpb249UHJvdmlkZSBsaW5rcyB0byBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtIG9mIGd1aWRhbmNlLgotQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsVGl0bGU9Q29tbXVuaWNhdGlvbiBNYXRlcmlhbHMKLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPVByb3ZpZGUgbGlua3MgdG8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiBjb21tdW5pY2F0aW9uIG1hdGVyaWFscy4KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU9RWR1Y2F0aW9uIE1hdGVyaWFscwotQWN0aXZpdHlfRWR1Y2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1Qcm92aWRlIGxpbmtzIHRvIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YgZWR1Y2F0aW9uIG1hdGVyaWFscy4KLQotQWN0aXZpdHlfU2VsZWN0ZWRfUm9hZG1hcD1Sb2FkbWFwczoKLUFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZT1HdWlkYW5jZToKLUFjdGl2aXR5X1NlbGVjdGVkX0NvbW11bmljYXRpb25NYXRlcmlhbD1Db21tdW5pY2F0aW9uIE1hdGVyaWFsczoKLUFjdGl2aXR5X1NlbGVjdGVkX0VkdWNhdGlvbk1hdGVyaWFsPUVkdWNhdGlvbiBNYXRlcmlhbHM6Ci0KLUFjdGl2aXR5X0RpYWdyYW1UaXRsZT1EaWFncmFtCi1BY3Rpdml0eV9EaWFncmFtRGVzY3JpcHRpb24gPSBQcm92aWRlIGRpYWdyYW0gaW1hZ2VzIGZvciB0aGlzIHswfS4KLUFjdGl2aXR5X0FESW1hZ2U9QWN0aXZpdHkgRGlhZ3JhbQotQWN0aXZpdHlfQURESW1hZ2U9QWN0aXZpdHkgRGV0YWlsIERpYWdyYW0KLUFjdGl2aXR5X1dQREltYWdlPVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0KLUFjdGl2aXR5X1VzZUFESW1hZ2U9VXNlIEFjdGl2aXR5IERpYWdyYW0gZm9yIHB1Ymxpc2hpbmcKLUFjdGl2aXR5X1VzZUFEREltYWdlPVVzZSBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBmb3IgcHVibGlzaGluZwotQWN0aXZpdHlfVXNlV1BESW1hZ2U9VXNlIFdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0gZm9yIHB1Ymxpc2hpbmcKLUFjdGl2aXR5X0Fzc2lnbj1Bc3NpZ24uLi4KLQotVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM9U3RlcHM6Ci1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nVGl0bGU9U3RlcHMKLVRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dNZXNzYWdlPVNlbGVjdCBzdGVwcwotCi1BY3Rpdml0eV9Xb3JrUm9sbHVwPVdvcmsgUm9sbHVwCi1BY3Rpdml0eV9UZWFtUm9sbHVwPVRlYW0gUm9sbHVwCi1BY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXA9V29yayBQcm9kdWN0cyBSb2xsdXAKLUFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbj1SZXZpZXcgdGhlIHdvcmsgcm9sbC11cCBmb3IgdGhpcyBhY3Rpdml0eSBpbiB0aGlzIHNlY3Rpb24uCi1BY3Rpdml0eV9UZWFtUm9sbHVwRGVzY3JpcHRpb249UmV2aWV3IHRoZSB0ZWFtIHJvbGwtdXAgZm9yIHRoaXMgYWN0aXZpdHkgaW4gdGhpcyBzZWN0aW9uLgotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb249UmV2aWV3IHRoZSB3b3JrIHByb2R1Y3Qgcm9sbC11cCBmb3IgdGhpcyBhY3Rpdml0eSBpbiB0aGlzIHNlY3Rpb24uCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9NdWx0aXBsZU9jdXJyYW5jZT1NdWx0aXBsZSBPY2N1cnJlbmNlcwotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fT3B0aW9uYWw9T3B0aW9uYWwKLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1BsYW5uZWQ9UGxhbm5lZAotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkPVN1cHByZXNzZWQKLQotV29ya0JyZWFrZG93bkVsZW1lbnRfRXZlbnREcml2ZW49RXZlbnQgRHJpdmVuCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9PbmdvaW5nPU9uZ29pbmcKLVdvcmtCcmVha2Rvd25FbGVtZW50X1JlcGVhdGFibGU9UmVwZWF0YWJsZQotV29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3JzPVByZWRlY2Vzc29yczoKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3k9RGVwZW5kZW5jeToKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQ9SW5kZXgKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX1BSRVNFTlRBVElPTl9OQU1FX1RFWFQ9UHJlc2VudGF0aW9uIE5hbWUKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0RFUEVOREVOQ1lfVEVYVD1EZXBlbmRlbmN5Ci1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZD1BZGQKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfRWRpdD1FZGl0Ci1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X1JlbW92ZT1SZW1vdmUKLQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fU1RBUlQ9RmluaXNoIFRvIFN0YXJ0Ci1Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19GSU5JU0g9RmluaXNoIFRvIEZpbmlzaAotV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g9U3RhcnQgVG8gRmluaXNoCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUPVN0YXJ0IFRvIFN0YXJ0Ci0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZD1TeW5jaHJvbml6ZWQgd2l0aCBzb3VyY2UKLQotRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb249UmVmaW5lZCBkZXNjcmlwdGlvbjoKLQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlPVJvbGVzCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb249QXNzaWduIHRoZSByb2xlIGRlc2NyaXB0b3JzIHRvIHBlcmZvcm0gdGhpcyB0YXNrIGRlc2NyaXB0b3IuCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE9UHJpbWFyeSBQZXJmb3JtZXI6Ci1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9QWRkaXRpb25hbCBQZXJmb3JtZXJzOgotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUzPUFzc2lzdGVkIEJ5OgotCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPVdvcmsgUHJvZHVjdHMKLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgZm9yIHRoaXMgdGFzayBkZXNjcmlwdG9yLgotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1NYW5kYXRvcnkgSW5wdXQ6Ci1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyPU9wdGlvbmFsIElucHV0OgotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMz1FeHRlcm5hbCBJbnB1dDoKLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTQ9T3V0cHV0OgotCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uVGl0bGU9VGFza3MKLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbj1UaGlzIHJvbGUgZGVzY3JpcHRvciBpcyBwZXJmb3JtZXIgb2YgZm9sbG93aW5nIHRhc2sgZGVzY3JpcHRvcnMuCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTE9UHJpbWFyeSBQZXJmb3JtZXI6Ci1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTI9QWRkaXRpb25hbCBQZXJmb3JtZXJzOgotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUzPUFzc2lzdGVkIEJ5OgotCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPVdvcmsgUHJvZHVjdHMKLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249VGhpcyByb2xlIGRlc2NyaXB0b3IgaXMgcmVzcG9uc2libGUgZm9yIGFuZCBtb2RpZmllcyBmb2xsb3dpbmcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzLgotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1SZXNwb25zaWJsZSBmb3I6Ci1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyPU1vZGlmaWVzOgotCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlPVJvbGVzCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPVRoZSBmb2xsb3dpbmcgcm9sZSBkZXNjcmlwdG9ycyBhcmUgcmVzcG9uc2libGUgZm9yIGFuZCBtb2RpZmllcyB0aGlzIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yLgotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1SZXNwb25zaWJsZSBmb3I6Ci1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUyPU1vZGlmaWVkIGJ5OgotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1R5cGU9VHlwZToKLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGU9QWN0aXZpdHkgRW50cnkgU3RhdGU6Ci1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGU9QWN0aXZpdHkgRXhpdCBTdGF0ZToKLQotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uVGl0bGU9RGVsaXZlcmFibGUgUGFydHMKLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvbkRlc2NyaXB0aW9uPVRoZSBkZWxpdmVyYWJsZSBoYXMgZm9sbG93aW5nIGRlbGl2ZXJhYmxlIHBhcnRzLgotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9UYWJsZTE9RGVsaXZlcmFibGUgUGFydHMKLQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uVGl0bGU9VGVhbXMKLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvbkRlc2NyaXB0aW9uPVRoaXMgcm9sZSBkZXNjcmlwdG9yIHJlZmVycyB0byBmb2xsb3dpbmcgdGVhbXMuCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMT1UZWFtczoKLQotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25UaXRsZT1Sb2xlcwotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1UaGlzIGNvbXBvc2l0ZSByb2xlIGhhcyBmb2xsb3dpbmcgYWdncmVnYXRlZCByb2xlcy4KLUNvbXBvc2l0ZVJvbGVfUm9sZV9UYWJsZTE9QWdncmVnYXRlZCBSb2xlczoKLQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uVGl0bGU9Um9sZXMKLVRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uPUFkZCBvciByZW1vdmUgcm9sZXMgdG8vZnJvbSB0aGUgdGVhbSBwcm9maWxlLgotVGVhbVByb2ZpbGVfUm9sZV9UYWJsZTE9Um9sZXM6Ci0KLVByb2Nlc3NfUmljaFRleHRfQ29sbGFwc2VJbWFnZT1jb2xsYXBzZWQuZ2lmCi1Qcm9jZXNzX1JpY2hUZXh0X0V4cGFuZEltYWdlPWV4cGFuZGVkLmdpZgotUHJvY2Vzc19BZGQ9QWRkLi4uCi1Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzPUFkZCBmcm9tIFByb2Nlc3MuLi4KLVByb2Nlc3NfUmVuYW1lX01lc3NhZ2U9WW91IGFyZSBhYm91dCB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBwcm9jZXNzLiBUaGlzIHdpbGwgc2F2ZSB0aGlzIGVkaXRvciBhbmQgcmVuYW1lIHRoZSBwcm9jZXNzIGZvbGRlciB0byB0aGUgbmV3IG5hbWUuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotUHJvY2Vzc19SZW1vdmU9UmVtb3ZlCi1Qcm9jZXNzX1VwPVVwCi1Qcm9jZXNzX0Rvd249RG93bgotUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbj1NdWx0aXBsZSBTZWxlY3Rpb24KLVByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50PUxpbmsgTWV0aG9kIEVsZW1lbnQuLi4KLQotIyMgRXJyb3IvV2FybmluZwotUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlPUludmFsaWQgbmFtZQotUHJvY2Vzc19JbnZhbGlkTmFtZT1JVVBBMDA4MUU6IFRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBuYW1lLgotUHJvY2Vzc19SZW5hbWVfVGl0bGU9UmVuYW1lCi1Qcm9jZXNzX0ludmFsaWRQcmVzZW50YXRpb25OYW1lPUlVUEEwMDgyRTogVGhlIHByZXNlbnRhdGlvbiBuYW1lIGNhbm5vdCBiZSBlbXB0eS4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBwcmVzZW50YXRpb24gbmFtZS4KLVByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZT1MaW5rIE1ldGhvZCBFbGVtZW50Ci1Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudD1JVVBBMDA4M0U6IENhbm5vdCBsaW5rIHRvICcnezB9Jycgc2luY2UgdGhpcyBNZXRob2RFbGVtZW50IGlzIGFscmVhZHkgYmVpbmcgdXNlZCBmb3IgYW5vdGhlciBkZXNjcmlwdG9yIHVuZGVyIHRoZSBzYW1lIHBhcmVudC4KLVByb2Nlc3NfQXNzaWdubWVudEluZm9UaXRsZT1JbmZvcm1hdGlvbgotUHJvY2Vzc19UZWFtQXNzaWduRXJyb3I9SVVQQTAwODRFOiBDYW5ub3QgYWRkICcnezB9JycgdG8gdGhlIHRlYW0gJyd7MX0nJyBcblxuUm9sZSBkZXNjcmlwdG9yKHMpIG11c3QgaGF2ZSBtZXRob2QgZWxlbWVudCByb2xlIGFzc29jaWF0ZWQgd2l0aCBpdCB0byBiZSBhc3NpZ25lZCB0byB0ZWFtLlxuXG4gRml4IHRoZSBhc3NvY2F0aW9uIGZpcnN0IGFuZCB0cnkgYWdhaW4uCi1Qcm9jZXNzX1RlYW1EaWFsb2dNZXNzYWdlPVNlbGVjdCB0ZWFtcwotUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGU9VGVhbXMKLQotUHJvY2Vzc19EZWxpdmVyYWJsZUFzc2lnbkVycm9yPUlVUEEwMDg1RTogQ2Fubm90IGFkZCAnJ3swfScnIHRvIHRoZSBkZWxpdmVyYWJsZSAnJ3sxfScnIHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgbWV0aG9kIGVsZW1lbnQgd29ya3Byb2R1Y3QgYXNzb2NpYXRlZCB3aXRoIGl0LgotUHJvY2Vzc19Db21wb3NpdGVSb2xlQXNzaWduRXJyb3I9SVVQQTAwODZFOiBDYW5ub3QgYWRkICAnJ3swfScnIHRvIHRoZSBDb21wb3NpdGUgcm9sZSAnJ3sxfScnIHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgbWV0aG9kIGVsZW1lbnQgcm9sZSBhc3NvY2lhdGVkIHdpdGggaXQuCi1Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlck1lc3NhZ2U9SVVQQTAwODdXOiBQbGVhc2UgZW50ZXIgdmFsaWQgbnVtYmVyIGZvciBwcmVkZWNlc3NvcnMuCi1Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlclRpdGxlPUludmFsaWQgUHJlZGVjZXNzb3IgSWQKLQotUHJvY2Vzc19Ob0l0ZW1zPU5vIGl0ZW1zIHNlbGVjdGVkCi1Qcm9jZXNzX0l0ZW1zU2VsZWN0ZWQ9ezB9IGl0ZW1zIHNlbGVjdGVkCi1Qcm9jZXNzX05vUHJvcGVydGllc0F2YWlsYWJsZT1ObyBQcm9wZXJ0aWVzIGF2YWlsYWJsZQotCi1QcmVkZWNlc3NvckRpYWxvZ19UaXRsZT1QcmVkZWNlc3NvciBEZXBlbmRlbmN5Ci1QcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlPUVudGVyIGRlcGVuZGVuY3kgdHlwZSBmb3IgcHJlZGVjZXNzb3I6Ci1QcmVkZWNlc3NvckRpYWxvZ19JbmRleD1JbmRleDoKLVByZWRlY2Vzc29yRGlhbG9nX1ByZXNlbnRhdGlvbk5hbWU9UHJlc2VudGF0aW9uIE5hbWU6Ci1QcmVkZWNlc3NvckRpYWxvZ19EZXBlbmRlbmN5PURlcGVuZGVuY3k6Ci1QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGU9UHJlZGVjZXNzb3IKLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JNZXNzYWdlPUlVUEEwMDg4RTogUHJlZGVjZXNzb3Igd2l0aCB0aGF0IElkIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQuCi0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c9SVVQQTAwOTBFOiBUaGVyZSB3YXMgYW4gZXJyb3IgZWRpdGluZyBhIHByb3BlcnR5LgotUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX2NlbGxFZGl0b3JfaW52YWxpZFByZWRjZXNzb3JfcHJvYmxlbV9tc2c9SVVQQTAwODlXOiBJbnZhbGlkIHByZWRlY2Vzc29yIGxpc3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWIwMjJkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1JvbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTGlua01ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIFRoZSBnZW5lcmFsIHRhYiBzZWN0aW9uIGZvciBSb2xlIERlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiBleHRlbmRzIERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiB7Ci0JcHJvdGVjdGVkIFJvbGVEZXNjcmlwdG9yIGVsZW1lbnQ7Ci0KLQlwcml2YXRlIExhYmVsIGN0cmxfbWV0aG9kX2VsZW1lbnRfbGFiZWw7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9tZXRob2RfZWxlbWVudDsKLQotCXByaXZhdGUgQnV0dG9uIGxpbmtCdXR0b247Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJLy8gZ2V0IFJvbGVEZXNjcmlwdG9yIG9iamVjdAotCQllbGVtZW50ID0gKFJvbGVEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNjcmVhdGVHZW5lcmFsU2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVHZW5lcmFsU2VjdGlvbihjb21wb3NpdGUpOwotCi0JCS8vIG1ldGhvZCBlbGVtZW50Ci0JCWN0cmxfbWV0aG9kX2VsZW1lbnRfbGFiZWwgPSBGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfVHlwZV9Sb2xlKTsgLy8kTk9OLU5MUy0xJAotCi0JCWN0cmxfbWV0aG9kX2VsZW1lbnQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCAxKTsKLQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlsaW5rQnV0dG9uID0gRm9ybVVJCi0JCQkJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBTV1QuUFVTSCwgMSk7Ci0JCWxpbmtCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHNob3cvaGlkZSBtZXRob2Qgcm9sZQotCQl0b2dnbGVNZXRob2RSb2xlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZU1ldGhvZFJvbGUoKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJY3RybF9tZXRob2RfZWxlbWVudF9sYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlsaW5rQnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJY3RybF9tZXRob2RfZWxlbWVudF9sYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRWaXNpYmxlKHRydWUpOwotCQkJbGlua0J1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJbGlua0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzUm9sZUZpbHRlcigKLQkJCQkJCWdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0Um9sZSgpICE9IG51bGwpIHsKLQkJCQkJZXhpc3RpbmdFbGVtZW50cy5hZGQoZWxlbWVudC5nZXRSb2xlKCkpOwotCQkJCX0KLQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWZpbHRlciwgZWxlbWVudCwgRmlsdGVyQ29uc3RhbnRzLlJPTEVTLAotCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJCQlmZC5vcGVuKCk7Ci0JCQkJc2V0TWV0aG9kRWxlbWVudChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCi0JCQkJLy8gdXBkYXRlIG1ldGhvZCBlbGVtZW50IGNvbnRyb2wKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZTEpIHsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1ldGhvZEVsZW1lbnQoTGlzdCBpdGVtcykgewotCQlpZiAoKGl0ZW1zICE9IG51bGwpICYmIChpdGVtcy5zaXplKCkgPj0gMSkpIHsKLQkJCWlmIChpdGVtcy5nZXQoMCkgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJUm9sZSByb2xlID0gKFJvbGUpIGl0ZW1zLmdldCgwKTsKLQotCQkJCUxpc3QgbGlzdCA9IFByb2Nlc3NVdGlsCi0JCQkJCQkuZ2V0U2libGluZ3MoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGdldEFkYXB0ZXIoKSwKLQkJCQkJCQkJZWxlbWVudCk7Ci0JCQkJYm9vbGVhbiBjYW5Bc3NpZ24gPSB0cnVlOwotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgb2JqOwotCQkJCQkJaWYgKCghcm9sZURlc2MuZXF1YWxzKGVsZW1lbnQpKQotCQkJCQkJCQkmJiAoIXJvbGVEZXNjLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkpIHsKLQkJCQkJCQlSb2xlIGV4aXNpbmdSb2xlID0gcm9sZURlc2MuZ2V0Um9sZSgpOwotCQkJCQkJCWlmIChyb2xlLmVxdWFscyhleGlzaW5nUm9sZSkpIHsKLQkJCQkJCQkJY2FuQXNzaWduID0gZmFsc2U7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY2FuQXNzaWduKSB7Ci0JCQkJCUxpbmtNZXRob2RFbGVtZW50Q29tbWFuZCBjbWQgPSBuZXcgTGlua01ldGhvZEVsZW1lbnRDb21tYW5kKAotCQkJCQkJCWVsZW1lbnQsIHJvbGUsIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFKTsKLQkJCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQotCQkJCQkvLyBzZXQgc2VsZWN0aW9uIHRvIHNhbWUgZWxlbWVudCB0byBlbmFibGUgY29ycmVjdCBhY3Rpb25zCi0JCQkJCWdldEVkaXRvcigpLnNldFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19JbnZhbGlkTGlua01ldGhvZEVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCU9iamVjdFtdIGFyZ3MgPSB7IHJvbGUuZ2V0TmFtZSgpIH07Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlLCBtZi5mb3JtYXQoYXJncykpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudE5hbWUoUm9sZURlc2NyaXB0b3IgZWxlbWVudCkgewotCQlTdHJpbmcgc3RyID0gUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX05vbmU7IAotCQlpZiAoZWxlbWVudC5nZXRSb2xlKCkgIT0gbnVsbCkgewotCQkJc3RyID0gZWxlbWVudC5nZXRSb2xlKCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQotCQlsaW5rQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlPYmplY3Qgb2JqID0gZ2V0RWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBvYmo7Ci0JCQlpZiAoKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpCi0JCQkJCXx8IChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSkgewotCQkJCW5hbWVUZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQluYW1lVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJZWxlbWVudCA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0KLQkJCQkvLyBzaG93L2hpZGUgbWV0aG9kIHJvbGUKLQkJCQl0b2dnbGVNZXRob2RSb2xlKCk7Ci0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoCi0JCQkJCSJFcnJvciByZWZyZXNoaW5nIFJvbGVEZXNjcmlwdG9yIGdlbmVyYWwgc2VjdGlvbjogIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI2dldE5hbWVQcmVmaXgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVByZWZpeCgpIHsKLQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfQ09NUE9TSVRFX1JPTEUgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9ST0xFX0RFU0NSSVBUT1IgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUm9sZURlc2NyaXB0b3JUZWFtU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUm9sZURlc2NyaXB0b3JUZWFtU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OTNlZjY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yVGVhbVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIFJvbGUgZGVzY3JpcHRvciAtIHRlYW0gcHJvZmlsZSBzZWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9yVGVhbVNlY3Rpb24gZXh0ZW5kcyBPQlNSZWxhdGlvblNlY3Rpb24gewotCXByaXZhdGUgSW1hZ2UgdGl0bGVJbWFnZSA9IG51bGw7Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcigpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldFNlbGVjdGVkVGVhbXMoZWxlbWVudCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQllbGVtZW50ID0gKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50OwotCi0JCQotCQlzZXRUYWJEYXRhKFByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uVGl0bGUsIAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uRGVzY3JpcHRpb24sCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Sb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMSk7IAotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJZWxlbWVudCA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBSb2xlIERlc2NyaXB0b3IgdGVhbSBzZWN0aW9uICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZChPYmplY3RbXSBpdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgaXRlbXNbaV07Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJCUNvbXBvc2l0ZVJvbGUgY29tcFJvbGUgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5jcmVhdGVDb21wb3NpdGVSb2xlKChDb21wb3NpdGVSb2xlKSBlbGVtZW50KTsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGVhbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQljb21wUm9sZSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFJvbGUoKTsKLQkJCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJCQkJaWYgKCFpc1BhcnRPZlRlYW0ocm9sZSwgdGVhbSkpIHsKLQkJCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3Iocm9sZSk7Ci0JCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGVhbSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQkJCXJvbGVEZXNjLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoCi0JCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19UZWFtQXNzaWduRXJyb3IpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlPYmplY3RbXSBhcmdzID0geyBlbGVtZW50LmdldE5hbWUoKSwgdGVhbS5nZXROYW1lKCkgfTsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gbWYuZm9ybWF0KGFyZ3MpOwotCQkJCQkJU3RyaW5nIHRpdGxlID0gZ2V0RWRpdG9yKCkuZ2V0VGl0bGUoKTsKLQkJCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGVhbSwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJZWxlbWVudCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI3JlbW92ZShqYXZhLnV0aWwuQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgaXRvci5uZXh0KCk7Ci0JCQkJUm9sZSByb2xlID0gKChSb2xlRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0Um9sZSgpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHRlYW0sCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCWVsZW1lbnQsIC0xKTsKLQotCQkJCS8vIEdldCB0aGUgbGlzdCBvZiByb2xlRGVzY3JpcHRvcnMgZnJvbSB0ZWFtIHByb2ZpbGUgd2hpY2gKLQkJCQkvLyBoYXMgc2FtZSByb2xlIG9yaWdpbmFsIHJvbGUgZGVzY3JpcHRvcgotCQkJCUxpc3QgdGVhbVJvbGVzID0gdGVhbS5nZXRUZWFtUm9sZXMoKTsKLQkJCQlMaXN0IHJvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRlYW1Sb2xlcy5zaXplKCk7IGkrKykgewotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgdGVhbVJvbGVzLmdldChpKTsKLQotCQkJCQlpZiAocm9sZURlc2MuZ2V0Um9sZSgpLmVxdWFscyhyb2xlKSkKLQkJCQkJewotCQkJCQkJcm9sZURlc2NMaXN0LmFkZChyb2xlRGVzYyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBpZiByb2xlRGVzY3JpcG9yIGp1c3QgaGFzIG9uZSBlbGVtZW50LCBkZWxldGUgdGhhdCBvbmUgdG9vLgotCQkJCS8vIHNpbmNlIHRoYXQgd291bGQgYmUgdGhlIGxhc3Qgb25lCi0JCQkJaWYgKHJvbGVEZXNjTGlzdC5zaXplKCkgPT0gMSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB0ZWFtLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJCShSb2xlRGVzY3JpcHRvcikgcm9sZURlc2NMaXN0LmdldCgwKSwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNQYXJ0T2ZUZWFtKFJvbGUgcm9sZSwgVGVhbVByb2ZpbGUgdGVhbSkgewotCQlMaXN0IHRlYW1Sb2xlcyA9IHRlYW0uZ2V0VGVhbVJvbGVzKCk7Ci0JCUxpc3Qgcm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHRlYW1Sb2xlcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKTsKLQkJCXJvbGVzLmFkZChyb2xlRGVzYy5nZXRSb2xlKCkpOwotCQl9Ci0KLQkJaWYgKHJvbGVzLmNvbnRhaW5zKHJvbGUpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNvcGVuQWRkRGlhbG9nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRGlhbG9nKCkgewotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB0ZWFtQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBpdGVtcyA9IGdldFRlYW1zKCk7Ci0JCQkJaXRlbXMucmVtb3ZlQWxsKGdldFNlbGVjdGVkVGVhbXMoZWxlbWVudCkpOwotCQkJCXJldHVybiBpdGVtcy50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJSUxhYmVsUHJvdmlkZXIgdGVhbUxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2coUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBlbGVtZW50LAotCQkJCXRlYW1Db250ZW50UHJvdmlkZXIsIHRlYW1MYWJlbFByb3ZpZGVyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfVGVhbURpYWxvZ01lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JCXRpdGxlSW1hZ2UgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLmdldEltYWdlKCk7Ci0JCUxpc3RTZWxlY3Rpb25EaWFsb2cuc2V0RGVmYXVsdEltYWdlKHRpdGxlSW1hZ2UpOwotCi0JCWRsZy5zZXRUaXRsZShQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfVGVhbURpYWxvZ1RpdGxlKTsgCi0JCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGxnLm9wZW4oKTsKLQkJYWRkKGRsZy5nZXRSZXN1bHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiAJCVBhcmVudCBvZiB0aGUgZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0UGFyZW50KEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgVGVhbXMgZnJvbSBwYXJlbnQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQkJTGlzdCBvZiB0ZWFtcwotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRUZWFtcygpIHsKLQkJQXJyYXlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KGVsZW1lbnQpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgcGFyZW50OwotCQkJCUxpc3QgYnJlYWtkb3duRWxlbWVudHMgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBlbGVtZW50OwotCQkJCQkJaXRlbXMuYWRkKHRlYW0pOwotCQkJCQkJLy8gYWRkIGFueSBzdWIgdGVhbXMgaWYgdGhlcmUKLQkJCQkJCUxpc3Qgc3ViVGVhbXMgPSB0ZWFtLmdldFN1YlRlYW0oKTsKLQkJCQkJCWl0ZW1zLmFkZEFsbChzdWJUZWFtcyk7Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcGFyZW50ID0gZ2V0UGFyZW50KChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCS8qKgotCSAqIEdldCBzZWxlY3RlZCB0ZWFtcyBmb3IgdGhhdCByb2xlIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqIAkJTGlzdCBvZiBzZWxlY3RlZCB0ZWFtIAotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRTZWxlY3RlZFRlYW1zKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiBQcm9jZXNzVXRpbAotCQkJCQkuZ2V0VGVhbVByb2ZpbGVzKChSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIGlucHV0KTsKLQkJfSBlbHNlIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBvYmplY3Q7Ci0JCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0VGVhbVByb2ZpbGVzKHJvbGVEZXNjLCBnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MTVmZWE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQXNzaWduV1BUb1JvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLklBY3Rpb25UeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBSb2xlIERlc2NyaXB0b3IgLSB3b3JrIHByb2R1Y3Qgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbiBleHRlbmRzIFJlbGF0aW9uU2VjdGlvbiB7Ci0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXQgcHJvY2VzcyB3b3JrIHByb2R1Y3QgZmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWZpbHRlciA9IG5ldyBQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpLAotCQkJCQludWxsLCBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMSgpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgKLQkJCQkJCSgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFJlc3BvbnNpYmxlRm9yKCkpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjEuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMigpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRNb2RpZmllcygpKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0KLQkJbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkJaW50IG51bU9mVGFibGVzID0gMjsKLQkJCi0JCXNldFRhYkRhdGEoUHJvcGVydGllc1Jlc291cmNlcy5Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbiwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTEsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyLAotCQkJCW51bGwsCi0JCQkJbnVsbCwKLQkJCQlGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKTsgCi0KLQkJYm9vbGVhbltdIGNoYW5nZXNBbGxvd2VkID0geyB0cnVlLCBmYWxzZSB9OwotCQlzZXRUYWJsZURhdGEobnVtT2ZUYWJsZXMsIGNoYW5nZXNBbGxvd2VkKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWVsZW1lbnQgPSAoUm9sZURlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJfQotCQlzdXBlci5yZWZyZXNoKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEVsZW1lbnRzSW5TY29wZShnZXRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LAotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUFzc2lnbldQVG9Sb2xlRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduV1BUb1JvbGVEZXNjcmlwdG9yKAotCQkJCQkoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQsIGl0ZW1zLAotCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfUkVTUE9OU0lCTEVfRk9SLCBnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1IpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3QgZ2V0V29ya1Byb2R1Y3RzKExpc3QgaXRlbXMpIHsKLQkJTGlzdCB3cExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJd3BMaXN0LmFkZCgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlbXMuZ2V0KGkpKQotCQkJCQkJLmdldFdvcmtQcm9kdWN0KCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHdwTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RXhpc3RpbmdFbGVtZW50czEoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMxKCkgewotCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3RzKCgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFJlc3BvbnNpYmxlRm9yKCkpOwotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0UHJvY2VzcygpCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IG9iaiA9IFByb2Nlc3NVdGlsLmdldFJvb3RQcm9jZXNzKGFGYWN0b3J5LCBhZGFwdGVyLCBlbGVtZW50KTsKLQkJcmV0dXJuIChQcm9jZXNzKSBvYmo7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEZpbHRlckZvckRlc2NyaXB0b3JzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcihnZXRDb25maWd1cmF0aW9uKCkpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlnZXRBY3Rpdml0aWVzSW5TY29wZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LCBsaXN0KTsKLQkJCQkJaWYgKGxpc3QuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCS8vIFVuY29tbWVudCB0byBzaG93IGV4dGVuZGVkIGFjdGl2aXR5J3Mgd29ya3Byb2R1Y3RzCi0JCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJLy8gT2JqZWN0IG9iamVjdCA9Ci0JCQkJLy8gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilvYmopLmdldFBhcmVudChvYmopOwotCQkJCS8vIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkvLyBnZXRBY3Rpdml0aWVzSW5TY29wZSgKLQkJCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCS8vIGVsZW1lbnQsIGxpc3QpOwotCQkJCS8vIGlmKGxpc3QuY29udGFpbnMob2JqZWN0KSkgcmV0dXJuIHRydWU7Ci0JCQkJLy8gfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvclRhYk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRGcm9tUHJvY2Vzc0l0ZW1zMShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksCi0JCQkJCWl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZmNjMzMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzVGFza0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTGlua01ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBUaGUgZ2VuZXJhbCB0YWIgc2VjdGlvbiBmb3IgVGFzayBEZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24gZXh0ZW5kcwotCQlXb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0b3IgZWxlbWVudDsKLQotCXByaXZhdGUgQnV0dG9uIHN5bmNocm9uaXplZEJ1dHRvbjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX21ldGhvZF9lbGVtZW50OwotCi0JcHJpdmF0ZSBCdXR0b24gbGlua0J1dHRvbjsKLQotCS8vIHByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgc3luY2hyb25pemVkQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJLy8gZ2V0IFRhc2tEZXNjcmlwdG9yIG9iamVjdAotCQllbGVtZW50ID0gKFRhc2tEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNjcmVhdGVHZW5lcmFsU2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVHZW5lcmFsU2VjdGlvbihjb21wb3NpdGUpOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUgZm9yIGNoZWNrYm94Ci0JCWNoZWNrQm94Q29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgbnVtT2ZDb2x1bW5zLCB0cnVlKTsKLQotCQkvLyBzeW5jaHJvbml6ZWQgd2l0aCBzb3VyY2UKLQkJc3luY2hyb25pemVkQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTEpOwotCQlzeW5jaHJvbml6ZWRCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBtZXRob2QgZWxlbWVudAotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1R5cGVfVGFzayk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9tZXRob2RfZWxlbWVudCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJU1dULkRFRkFVTFQsIDEpOwotCi0JCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJbGlua0J1dHRvbiA9IEZvcm1VSQotCQkJCS5jcmVhdGVCdXR0b24odG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgU1dULlBVU0gsIDEpOwotCQlsaW5rQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNZXRob2RFbGVtZW50KExpc3QgaXRlbXMpIHsKLQkJaWYgKChpdGVtcyAhPSBudWxsKSAmJiAoaXRlbXMuc2l6ZSgpID49IDEpKSB7Ci0JCQlpZiAoaXRlbXMuZ2V0KDApIGluc3RhbmNlb2YgVGFzaykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdGVtcy5nZXQoMCk7Ci0KLQkJCQlMaXN0IGxpc3QgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmdldFNpYmxpbmdzKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBnZXRBZGFwdGVyKCksCi0JCQkJCQkJCWVsZW1lbnQpOwotCQkJCWJvb2xlYW4gY2FuQXNzaWduID0gdHJ1ZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIG9iajsKLQkJCQkJCWlmICgoIXRhc2tEZXNjLmVxdWFscyhlbGVtZW50KSkKLQkJCQkJCQkJJiYgKCF0YXNrRGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0JCQkJCQkJVGFzayBleGlzaW5nVGFzayA9IHRhc2tEZXNjLmdldFRhc2soKTsKLQkJCQkJCQlpZiAodGFzay5lcXVhbHMoZXhpc2luZ1Rhc2spKSB7Ci0JCQkJCQkJCWNhbkFzc2lnbiA9IGZhbHNlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGNhbkFzc2lnbikgewotCQkJCQlMaW5rTWV0aG9kRWxlbWVudENvbW1hbmQgY21kID0gbmV3IExpbmtNZXRob2RFbGVtZW50Q29tbWFuZCgKLQkJCQkJCQllbGVtZW50LCB0YXNrLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSyk7Ci0JCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0KLQkJCQkJLy8gc2V0IHNlbGVjdGlvbiB0byBzYW1lIGVsZW1lbnQgdG8gZW5hYmxlIGNvcnJlY3QgYWN0aW9ucwotCQkJCQlnZXRFZGl0b3IoKS5zZXRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfSW52YWxpZExpbmtNZXRob2RFbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCQlPYmplY3RbXSBhcmdzID0geyB0YXNrLmdldE5hbWUoKSB9OwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZSwgbWYuZm9ybWF0KGFyZ3MpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKFRhc2tEZXNjcmlwdG9yIGVsZW1lbnQpIHsKLQkJU3RyaW5nIHN0ciA9IFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Ob25lOyAKLQkJaWYgKGVsZW1lbnQuZ2V0VGFzaygpICE9IG51bGwpIHsKLQkJCXN0ciA9IGVsZW1lbnQuZ2V0VGFzaygpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiBzdHI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc3luY2hyb25pemVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihzeW5jaHJvbml6ZWRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpLCAtMSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWxpbmtCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc1Rhc2tGaWx0ZXIoCi0JCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIEZpbHRlckNvbnN0YW50cy5UQVNLUyk7Ci0JCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlmIChlbGVtZW50LmdldFRhc2soKSAhPSBudWxsKSB7Ci0JCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkKGVsZW1lbnQuZ2V0VGFzaygpKTsKLQkJCQl9Ci0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIGVsZW1lbnQsIEZpbHRlckNvbnN0YW50cy5UQVNLUywKLQkJCQkJCWV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5UQVNLUyk7Ci0JCQkJZmQub3BlbigpOwotCQkJCXNldE1ldGhvZEVsZW1lbnQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQotCQkJCS8vIHVwZGF0ZSBtZXRob2QgZWxlbWVudCBjb250cm9sCi0JCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUxKSB7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQlzeW5jaHJvbml6ZWRCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWxpbmtCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJZWxlbWVudCA9IChUYXNrRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJCXN5bmNocm9uaXplZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudAotCQkJCQkJLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgVGFza0Rlc2NyaXB0b3IgZ2VuZXJhbCBzZWN0aW9uOiAiICsgZWxlbWVudCwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2dldE5hbWVQcmVmaXgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVByZWZpeCgpIHsKLQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9UQVNLX0RFU0NSSVBUT1IgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JSb2xlU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JSb2xlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZTM3N2E2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yUm9sZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1JvbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFzc2lnblByaW1hcnlQZXJmb3JtZXJUb1Rhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLklBY3Rpb25UeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgVGFzayBkZXNjcmlwdG9yIC0gcm9sZSB0YWIgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvclJvbGVTZWN0aW9uIGV4dGVuZHMgUmVsYXRpb25TZWN0aW9uIHsKLQlwcml2YXRlIElGaWx0ZXIgcm9sZUZpbHRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXQgcHJvY2VzcyByb2xlZGVzY3JpcHRvciBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWlmIChyb2xlRmlsdGVyID09IG51bGwpIHsKLQkJCXJvbGVGaWx0ZXIgPSBuZXcgUHJvY2Vzc1JvbGVGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLAotCQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRVMpOwotCQl9Ci0JCXJldHVybiByb2xlRmlsdGVyOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMSgpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGUgPSAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQkJaWYgKHJvbGUgIT0gbnVsbCkKLQkJCQkJbGlzdC5hZGQocm9sZSk7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdChsaXN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIyKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIzKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0QXNzaXN0ZWRCeSgpKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMy5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWludCBudW1PZlRhYmxlcyA9IDM7Ci0JCQotCQlzZXRUYWJEYXRhKFByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUxLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUyLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUzLAotCQkJCW51bGwsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJCi0JCWJvb2xlYW5bXSBjaGFuZ2VzQWxsb3dlZCA9IHsgdHJ1ZSwgdHJ1ZSwgdHJ1ZSB9OwotCQlzZXRUYWJsZURhdGEobnVtT2ZUYWJsZXMsIGNoYW5nZXNBbGxvd2VkKTsKLQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVmcmVzaGluZyBUYXNrRGVzY3JpcHRvciBST0xFUyBTZWN0aW9uIik7Ci0JCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJZWxlbWVudCA9IChUYXNrRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXN1cGVyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEVsZW1lbnRzSW5TY29wZShnZXRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LAotCQkJCVJvbGVEZXNjcmlwdG9yLmNsYXNzLCBpdGVtcyk7Ci0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0Um9sZXMoTGlzdCBpdGVtcykgewotCQlMaXN0IHJvbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCXJvbGVMaXN0LmFkZCgoKFJvbGVEZXNjcmlwdG9yKSBpdGVtcy5nZXQoaSkpLmdldFJvbGUoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcm9sZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEl0ZW1zMShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IGdldFJvbGVzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJCWVsZW1lbnRMaXN0LmFkZEFsbChnZXRSb2xlcygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0QXNzaXN0ZWRCeSgpKSk7Ci0KLQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBvYmo7Ci0JCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMocm9sZSkpCi0JCQkJCQluZXdMaXN0LmFkZChyb2xlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobmV3TGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJQXNzaWduUHJpbWFyeVBlcmZvcm1lclRvVGFza0Rlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnblByaW1hcnlQZXJmb3JtZXJUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50LCAoUm9sZSkgbmV3TGlzdC5nZXQoMCksIGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkSXRlbXMyKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMihMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9ICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQkJTGlzdCBlbGVtZW50TGlzdCA9IGdldFJvbGVzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRBc3Npc3RlZEJ5KCkpOwotCQkJaWYgKHJvbGVEZXNjICE9IG51bGwpCi0JCQkJZWxlbWVudExpc3QuYWRkKHJvbGVEZXNjLmdldFJvbGUoKSk7Ci0KLQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBvYmo7Ci0JCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMocm9sZSkpCi0JCQkJCQluZXdMaXN0LmFkZChyb2xlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobmV3TGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50LCBuZXdMaXN0LAotCQkJCQkJSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FERElUSU9OQUxfUEVSRk9STUVSLCBnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEl0ZW1zMyhqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczMoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBnZXRSb2xlcygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCQlpZiAocm9sZURlc2MgIT0gbnVsbCkKLQkJCQllbGVtZW50TGlzdC5hZGQocm9sZURlc2MuZ2V0Um9sZSgpKTsKLQotCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBpdGVtcy5nZXQoaSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCQkJUm9sZSByb2xlID0gKFJvbGUpIG9iajsKLQkJCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyhyb2xlKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHJvbGUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChuZXdMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlBc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IoCi0JCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQsIG5ld0xpc3QsCi0JCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfQVNTSVNURURfQlksIGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRBc3Npc3RlZEJ5KCkpOwotCi0JCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwKLQkJCQkJCWl0ZW1zLmdldCgwKSwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXMyKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMyKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRBc3Npc3RlZEJ5KCkpOwotCQkJaXRlbXMucmVtb3ZlKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpOwotCi0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJCWl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczMoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczMoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJCWl0ZW1zLnJlbW92ZSgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBlbGVtZW50LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCksIGl0ZW1zLAotCQkJCQktMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlbW92ZUl0ZW1zMihqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczIoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQgY21kID0gbmV3IFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKGVsZW1lbnQsCi0JCQkJCWl0ZW1zLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZW1vdmVJdGVtczMoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMzKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCVJlbW92ZURlc2NyaXB0b3JDb21tYW5kIGNtZCA9IG5ldyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChlbGVtZW50LAotCQkJCQlpdGVtcywgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHMxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMSgpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9ICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCWlmIChyb2xlRGVzYyAhPSBudWxsKQotCQkJbGlzdC5hZGQocm9sZURlc2MpOwotCi0JCXJldHVybiBsaXN0OwotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RXhpc3RpbmdFbGVtZW50czIoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMyKCkgewotCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHMzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMygpIHsKLQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEFzc2lzdGVkQnkoKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEZpbHRlckZvckRlc2NyaXB0b3JzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcihnZXRDb25maWd1cmF0aW9uKCkpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlnZXRBY3Rpdml0aWVzSW5TY29wZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LCBsaXN0KTsKLQkJCQkJaWYgKGxpc3QuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRQcm9jZXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3Qgb2JqID0gUHJvY2Vzc1V0aWwuZ2V0Um9vdFByb2Nlc3MoYUZhY3RvcnksIGFkYXB0ZXIsIGVsZW1lbnQpOwotCQlyZXR1cm4gKFByb2Nlc3MpIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvclRhYk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvclN0ZXBTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvclN0ZXBTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5ZmFjN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JTdGVwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSB0YXNrIGRlc2NyaXB0b3IgLSBzdGVwIHNlY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JTdGVwU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JcHJpdmF0ZSBUYXNrRGVzY3JpcHRvciBlbGVtZW50OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZCwgY3RybF9yZW1vdmUsIGN0cmxfdXAsIGN0cmxfZG93bjsKLQotCXByaXZhdGUgVGFibGUgY3RybF9zZWxlY3RlZDsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyOwotCi0JLy8gcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZfZGVzYzsKLQlwcml2YXRlIEltYWdlIHRpdGxlSW1hZ2U7Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgc3RlcHMgc2VjdGlvbgotCQljcmVhdGVTdGVwU2VjdGlvbihwYXJlbnQpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZQotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCS8vIGdldCBhY3Rpdml0eSBvYmplY3QKLQkJZWxlbWVudCA9IChUYXNrRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IGFjdGlvbiBtYW5hZ2VyCi0JCWFjdGlvbk1nciA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQllbGVtZW50ID0gKFRhc2tEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQotCQkJCS8vIGhpZGUvcmVmcmVzaCBjb250cm9scwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKCJFcnJvciByZWZyZXNoaW5nIFRhc2tEZXNjcmlwdG9yIHN0ZXAgc2VjdGlvbiIgKyBlbGVtZW50LCBleCk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBjb250cm9scyBiYXNlZCBvbiBlZGl0YWJsZSBmbGFnLiBDb250cm9scyB3aWxsIGJlIGVpdGhlciBlZGl0YWJsZSAKLQkgKiBvciByZWFkLW9ubHkgYWZ0ZXIgdXBkYXRpbmcgdGhpcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJY3RybF9hZGQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChlbGVtZW50LmdldFRhc2soKSA9PSBudWxsKQotCQkJY3RybF9hZGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UgewotCQkJTGlzdCBzdGVwcyA9IGdldFN0ZXBzKCk7Ci0JCQlpZiAoc3RlcHMgIT0gbnVsbCAmJiBzdGVwcy5zaXplKCkgPiAwKSAKLQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKHRydWUpOwotCQkJZWxzZSAKLQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQkKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQljdHJsX3VwLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQl9IGVsc2UgewotCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgU3RlcCBzZWN0aW9uIG9uIHRoZSBnaXZlbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVN0ZXBTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gY3JlYXRlIHN0ZXAgc2VjdGlvbgotCQlTZWN0aW9uIHN0ZXBTZWN0aW9uID0gRm9ybVVJCi0JCQkJLmNyZWF0ZVNlY3Rpb24oCi0JCQkJCQl0b29sa2l0LAotCQkJCQkJY29tcG9zaXRlLAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZSwgCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvbkRlc2NyaXB0aW9uKTsgCi0KLQkJLy8gY3JlYXRlIHN0ZXAgY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBzdGVwQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzdGVwU2VjdGlvbiwKLQkJCQkyLCBmYWxzZSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHN0ZXBDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkX1N0ZXBzKTsgCi0KLQkJY3RybF9zZWxlY3RlZCA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSk7Ci0JCXZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3NlbGVjdGVkKTsKLQotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZWxlbWVudC5nZXRTZWxlY3RlZFN0ZXBzKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkvLyBjcmVhdGUgYnV0dG9uIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHN0ZXBDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkvLyBjcmVhdGUgYnV0dG9ucwotCQljdHJsX2FkZCA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOwotCQljdHJsX2FkZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3RybF9yZW1vdmUgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0JCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQljdHJsX3VwID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1VwKTsgCi0JCWN0cmxfZG93biA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Eb3duKTsgCi0KLQkJaWYgKGVsZW1lbnQuZ2V0VGFzaygpICE9IG51bGwpIHsKLQkJCUxpc3Qgc3RlcHMgPSBnZXRTdGVwcygpOwotCQkJaWYgKHN0ZXBzICE9IG51bGwgJiYgc3RlcHMuc2l6ZSgpID4gMCkgewotCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gY3JlYXRlIGJyaWVmIGRlc2NyaXB0aW9uCi0JCS8vIGludCBoZWlnaHRIaW50ID0gNDA7Ci0JCS8vIGludCBob3Jpem9udGFsU3BhbiA9IDI7Ci0JCS8vIExhYmVsIGxhYmVsID0gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHN0ZXBDb21wb3NpdGUsCi0JCS8vIFByb3BlcnRpZXNSZXNvdXJjZXMuZ2V0U3RyaW5nKCJQcm9jZXNzLmJyaWVmRGVzY3JpcHRpb24iKSwKLQkJLy8gaGVpZ2h0SGludCk7Ci0JCS8vIGN0cmxfYnJpZWZfZGVzYyA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIHN0ZXBDb21wb3NpdGUsCi0JCS8vIGhlaWdodEhpbnQsIGhlaWdodEhpbnQpOwotCQkvLyBjdHJsX2JyaWVmX2Rlc2Muc2V0RWRpdGFibGUoZmFsc2UpOwotCQkvLwkJCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHN0ZXBDb21wb3NpdGUpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJLy8gQWRkIGZvY3VzIGxpc3RlbmVyIG9uIHByaW1hcnkgdGFza3MgbGlzdAotCQljdHJsX3NlbGVjdGVkLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpIHsKLQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkgewotCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCi0JCQkJCWlmICh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQkJaWYgKHZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3ZXIKLQkJCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCX0KLQotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQkvLyBjdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCS8vIGN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuZ2V0U3RyaW5nKCJQcm9jZXNzLk11bHRpcGxlU2VsZWN0aW9uIikKLQkJCQkJLy8gKyAiIC0gIiArIHNlbGVjdGlvbi5zaXplKCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgc3RlcENvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCi0JCQkJCQlyZXR1cm4gZ2V0U3RlcHMoKS50b0FycmF5KCk7Ci0vLwkJCQkJCS8vIGdldCBhbGwgc3RlcHMKLS8vCQkJCQkJSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ0FwcGxpY2F0b3IgPSBQcm92aWRlcnMKLS8vCQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKTsKLS8vCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoCi0vLwkJCQkJCQkJZWxlbWVudCkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLS8vCQkJCQkJTGlzdCBzdGVwcyA9IChMaXN0KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZSgKLS8vCQkJCQkJCQllbGVtZW50LmdldFRhc2soKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLS8vCQkJCQkJCQkJCS5nZXRUYXNrX1N0ZXBzKCksIGNvbmZpZyk7Ci0vLwotLy8JCQkJCQkvLyByZW1vdmUgYWxyZWFkeSBleGlzdGluZyBzdGVwcwotLy8JCQkJCQlzdGVwcy5yZW1vdmVBbGwoZWxlbWVudC5nZXRTZWxlY3RlZFN0ZXBzKCkpOwotLy8JCQkJCQlyZXR1cm4gc3RlcHMudG9BcnJheSgpOwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCUlMYWJlbFByb3ZpZGVyIHN0ZXBMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBvYmopIHsKLQotCQkJCQkJYm9vbGVhbiBmbGFnID0gIWVsZW1lbnQuZ2V0VGFzaygpLmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkJCS5nZXRTZWN0aW9ucygpLmNvbnRhaW5zKG9iaik7Ci0JCQkJCQlyZXR1cm4gZmxhZzsKLQkJCQkJfQotCQkJCX07Ci0KLQkJCQlMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJZWxlbWVudC5nZXRUYXNrKCksIHN0ZXBDb250ZW50UHJvdmlkZXIsCi0JCQkJCQlzdGVwTGFiZWxQcm92aWRlciwgUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nTWVzc2FnZSk7IAotCQkJCXRpdGxlSW1hZ2UgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLmdldEltYWdlKCk7Ci0JCQkJTGlzdFNlbGVjdGlvbkRpYWxvZy5zZXREZWZhdWx0SW1hZ2UodGl0bGVJbWFnZSk7Ci0JCQkJZGxnLnNldFRpdGxlKFByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ1RpdGxlKTsKLQkJCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZGxnLm9wZW4oKTsKLQotCQkJCWFkZFN0ZXBzKGRsZy5nZXRSZXN1bHQoKSk7Ci0JCQkJCi0JCQkJLy8gZW5hYmxlL2Rpc2FibGUgYWRkIGJ1dHRvbgotCQkJCUxpc3Qgc3RlcHMgPSBnZXRTdGVwcygpOwotCQkJCWlmIChzdGVwcyAhPSBudWxsICYmIHN0ZXBzLnNpemUoKSA+IDApIAotCQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWVsc2UgCi0JCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCXJlbW92ZVN0ZXBzKHJtSXRlbXMpOwotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJLy8gY3RybF9icmllZl9kZXNjLnNldFRleHQoIiIpOwotCQkJCX0KLQkJCQkvLyBjdHJsX3JlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkKLQkJCQkvLyBlbmFibGUvZGlzYWJsZSBhZGQgYnV0dG9uCi0JCQkJTGlzdCBzdGVwcyA9IGdldFN0ZXBzKCk7Ci0JCQkJaWYgKHN0ZXBzICE9IG51bGwgJiYgc3RlcHMuc2l6ZSgpID4gMCkgCi0JCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZWxzZSAKLQkJCQkJY3RybF9hZGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfdXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQXJyYXlMaXN0IHN0ZXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCUFycmF5TGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCUJhc2ljRUxpc3Qgc3RlcExpc3QgPSAoQmFzaWNFTGlzdCkgZWxlbWVudAotCQkJCQkJCS5nZXRTZWxlY3RlZFN0ZXBzKCk7Ci0KLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQkJCQlpbnQgaW5kZXggPSBzdGVwTGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQkJCXN0ZXBMaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCi0JCQkJCX0KLQkJCQkJc3RlcHMuYWRkQWxsKHN0ZXBMaXN0KTsKLQkJCQkJLy8gVE9ETyAtIHdyaXRlIGEgY29tbWFuZC4gCi0JCQkJCS8vIGFjdGl2YXRlIGRpcnR5IGZsYWcKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpLAotCQkJCQkJCXN0ZXBMaXN0LCAtMSk7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwgc3RlcHMsCi0JCQkJCQkJLTEpOwotCi0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCi0JCQkJaWYgKHZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwICYmIGVkaXRhYmxlKQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJaWYgKHZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3ZXIuZ2V0VGFibGUoKQotCQkJCQkJLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJJiYgZWRpdGFibGUpCi0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCWVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCX0pOwotCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlBcnJheUxpc3Qgc3RlcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJQXJyYXlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJQmFzaWNFTGlzdCBzdGVwTGlzdCA9IChCYXNpY0VMaXN0KSBlbGVtZW50Ci0JCQkJCQkJLmdldFNlbGVjdGVkU3RlcHMoKTsKLQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLQkJCQkJCWludCBpbmRleCA9IHN0ZXBMaXN0LmluZGV4T2Yob2JqZWN0KTsKLQotCQkJCQkJaWYgKGluZGV4IDwgc3RlcExpc3Quc2l6ZSgpIC0gMSkKLQkJCQkJCQlzdGVwTGlzdC5tb3ZlKGluZGV4ICsgaXRlbXMuc2l6ZSgpLCBvYmplY3QpOwotCi0JCQkJCX0KLQkJCQkJc3RlcHMuYWRkQWxsKHN0ZXBMaXN0KTsKLQotCQkJCQkvLyBUT0RPIC0gd3JpdGUgYSBjbW1hbmQuIEhhY2tpbmcgaXQgZm9yIG5vdyB0byBhY3RpdmF0ZQotCQkJCQkvLyBkaXJ0eSBmbGFnCi0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwKLQkJCQkJCQlzdGVwTGlzdCwgLTEpOwotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCksIHN0ZXBzLAotCQkJCQkJCS0xKTsKLQotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQotCQkJCWlmICh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCAmJiBlZGl0YWJsZSkKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWVsc2UKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCWlmICh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgdmlld2VyLmdldFRhYmxlKCkKLQkJCQkJCS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmIGVkaXRhYmxlKQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQllbHNlCi0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIEFzc2lnbiBTdGVwcyB0byB0YXNrIGRlc2NyaXB0b3IKLQkgKiBAcGFyYW0gYWRkSXRlbXMKLQkgKiAJCQlMaXN0IG9mIHN0ZXBzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFN0ZXBzKE9iamVjdFtdIGFkZEl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKGFkZEl0ZW1zICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gaXRlbSA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24pIGFkZEl0ZW1zW2ldOwotCi0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwKLQkJCQkJCWl0ZW0sIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhc3NpZ25lZCBzdGVwcyBmb3IgdGhlIHRhc2sgZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBybUl0ZW1zCi0JICogCQkJTGlzdCBvZiBzdGVwcyAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RlcHMoTGlzdCBybUl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiBpdGVtID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgaXQubmV4dCgpOwotCi0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwKLQkJCQkJCWl0ZW0sIC0xKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgc3RlcHMgdGhhdCBjb3VsZCBiZSBhc3NpZ25lZCB0byB0aGlzIHRhc2sgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0U3RlcHMoKXsKLQkJLy8JZ2V0IGFsbCBzdGVwcwotCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycwotCQkJCS5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygKLQkJCQllbGVtZW50KS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlMaXN0IHN0ZXBzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKAotCQkJCWVsZW1lbnQuZ2V0VGFzaygpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tfU3RlcHMoKSwgY29uZmlnKTsKLQotCQkvLyByZW1vdmUgYWxyZWFkeSBleGlzdGluZyBzdGVwcwotCQlzdGVwcy5yZW1vdmVBbGwoZWxlbWVudC5nZXRTZWxlY3RlZFN0ZXBzKCkpOwotCQlyZXR1cm4gc3RlcHM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOGMxYjFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLklBY3Rpb25UeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSB0YXNrIGRlc2NyaXB0b3IgLSB3b3JrIHByb2R1Y3Qgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbiBleHRlbmRzIFJlbGF0aW9uU2VjdGlvbiB7Ci0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXQgcHJvY2VzcyB3b3JrIHByb2R1Y3QgZmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWZpbHRlciA9IG5ldyBQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLAotCQkJCQlGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIxKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TWFuZGF0b3J5SW5wdXQoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIyKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0T3B0aW9uYWxJbnB1dCgpKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyMygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjMoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRFeHRlcm5hbElucHV0KCkpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjMuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXI0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyNCgpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPdXRwdXQoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyNC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWludCBudW1PZlRhYmxlcyA9IDQ7Ci0JCXNldFRhYkRhdGEoUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbiwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTEsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMywKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTQsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUyk7Ci0JCQotCQlib29sZWFuW10gY2hhbmdlc0FsbG93ZWQgPSB7IHRydWUsIHRydWUsIHRydWUsIHRydWUgfTsKLQkJc2V0VGFibGVEYXRhKG51bU9mVGFibGVzLCBjaGFuZ2VzQWxsb3dlZCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWVsZW1lbnQgPSAoVGFza0Rlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJfQotCQlzdXBlci5yZWZyZXNoKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEVsZW1lbnRzSW5TY29wZShnZXRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LAotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgaXRlbXMpOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRXb3JrUHJvZHVjdHMoTGlzdCBpdGVtcykgewotCQlMaXN0IHdwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQl3cExpc3QuYWRkKCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVtcy5nZXQoaSkpCi0JCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gd3BMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBnZXRXb3JrUHJvZHVjdHMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCQllbGVtZW50TGlzdC5hZGRBbGwoZ2V0V29ya1Byb2R1Y3RzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRFeHRlcm5hbElucHV0KCkpKTsKLQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgb2JqOwotCQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHdwKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHdwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobmV3TGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yIGNtZCA9IG5ldyBBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IoCi0JCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQsIG5ld0xpc3QsCi0JCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfTUFOREFUT1JZX0lOUFVULAotCQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMyKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBnZXRXb3JrUHJvZHVjdHMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJZWxlbWVudExpc3QuYWRkQWxsKGdldFdvcmtQcm9kdWN0cygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0RXh0ZXJuYWxJbnB1dCgpKSk7Ci0KLQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgb2JqOwotCQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHdwKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHdwKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuZXdMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnbldQVG9UYXNrRGVzY3JpcHRvcigKLQkJCQkJCShUYXNrRGVzY3JpcHRvcikgZWxlbWVudCwgbmV3TGlzdCwKLQkJCQkJCUlBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9PUFRJT05BTF9JTlBVVCwKLQkJCQkJCWdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkSXRlbXMzKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMyhMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gZ2V0V29ya1Byb2R1Y3RzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCWVsZW1lbnRMaXN0LmFkZEFsbChnZXRXb3JrUHJvZHVjdHMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldE9wdGlvbmFsSW5wdXQoKSkpOwotCi0JCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZW1zLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIG9iajsKLQkJCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyh3cCkpCi0JCQkJCQluZXdMaXN0LmFkZCh3cCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5ld0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCUFzc2lnbldQVG9UYXNrRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50LCBuZXdMaXN0LAotCQkJCQkJSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0VYVEVSTkFMX0lOUFVULAotCQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczQoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXM0KExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUFzc2lnbldQVG9UYXNrRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQsIGl0ZW1zLAotCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfT1VUUFVULCBnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMyKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMihMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVCk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZW1vdmVJdGVtczMoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMzKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCVJlbW92ZURlc2NyaXB0b3JDb21tYW5kIGNtZCA9IG5ldyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChlbGVtZW50LAotCQkJCQlpdGVtcywgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlbW92ZUl0ZW1zNChqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczQoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQgY21kID0gbmV3IFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKGVsZW1lbnQsCi0JCQkJCWl0ZW1zLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHMxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMSgpIHsKLQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE1hbmRhdG9yeUlucHV0KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzMigpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czIoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPcHRpb25hbElucHV0KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzMygpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czMoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRFeHRlcm5hbElucHV0KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzNCgpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czQoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPdXRwdXQoKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldFByb2Nlc3MoKQotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBvYmogPSBQcm9jZXNzVXRpbC5nZXRSb290UHJvY2VzcyhhRmFjdG9yeSwgYWRhcHRlciwgZWxlbWVudCk7Ci0JCXJldHVybiAoUHJvY2Vzcykgb2JqOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBuZXcgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUxpc3QgbGlzdDEgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWdldEFjdGl2aXRpZXNJblNjb3BlKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGVsZW1lbnQsIGxpc3QxKTsKLQkJCQkJaWYgKGxpc3QxLmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPcHRpb25hbElucHV0KCkpOwotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEV4dGVybmFsSW5wdXQoKSk7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksCi0JCQkJCWl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczIoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEV4dGVybmFsSW5wdXQoKSk7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwKLQkJCQkJaXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRGcm9tUHJvY2Vzc0l0ZW1zMyhqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMyhMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0T3B0aW9uYWxJbnB1dCgpKTsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpLAotCQkJCQlpdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXM0KGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXM0KExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksIGl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvclRhYk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JTOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1RlYW1Qcm9maWxlUm9sZVNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1RlYW1Qcm9maWxlUm9sZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWVjZTFlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UZWFtUHJvZmlsZVJvbGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5XcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkNvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWRkUm9sZVRvVGVhbUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIHRlYW0gcHJvZmlsZSAtIHJvbGUvY29tcG9zaXRlIHJvbGUgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUZWFtUHJvZmlsZVJvbGVTZWN0aW9uIGV4dGVuZHMgT0JTUmVsYXRpb25TZWN0aW9uIHsKLQotCUxpc3Qgcm9sZUxpc3QgPSBudWxsOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJTGlzdCB0ZWFtUm9sZXMgPSAoKFRlYW1Qcm9maWxlKSBlbGVtZW50KS5nZXRUZWFtUm9sZXMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0ZWFtUm9sZXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKQotCQkJCQkJCXx8IChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHJvbGVEZXNjKTsKLQkJCQl9Ci0KLQkJCQkvLyByZXR1cm4gKChUZWFtUHJvZmlsZSllbGVtZW50KS5nZXRUZWFtUm9sZXMoKS50b0FycmF5KCk7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdChuZXdMaXN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCWVsZW1lbnQgPSAoVGVhbVByb2ZpbGUpIGVsZW1lbnQ7Ci0KLQkJc2V0VGFiRGF0YShQcm9wZXJ0aWVzUmVzb3VyY2VzLlRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvblRpdGxlLCAKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGVhbVByb2ZpbGVfUm9sZV9UYWJsZTEpOyAKLQkJc2hvd0FkZEZyb21Qcm9jZXNzQnV0dG9uID0gdHJ1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCQkJCWVsZW1lbnQgPSAoVGVhbVByb2ZpbGUpIGdldEVsZW1lbnQoKTsKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigiRXJyb3IgcmVmcmVzaGluZyBUZWFtIFByb2ZpbGUgcm9sZSBzZWN0aW9uICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFydE9mVGVhbShSb2xlIHJvbGUsIFRlYW1Qcm9maWxlIHRlYW0pIHsKLQkJTGlzdCB0ZWFtUm9sZXMgPSB0ZWFtLmdldFRlYW1Sb2xlcygpOwotCQlMaXN0IHJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0ZWFtUm9sZXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCk7Ci0JCQlyb2xlcy5hZGQocm9sZURlc2MuZ2V0Um9sZSgpKTsKLQkJfQotCi0JCWlmIChyb2xlcy5jb250YWlucyhyb2xlKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkKExpc3QgaXRlbXMpIHsKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCUxpc3Qgcm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGUpCi0JCQkJCQkmJiAoIWlzUGFydE9mVGVhbSgoUm9sZSkgb2JqLCAoVGVhbVByb2ZpbGUpIGVsZW1lbnQpKSkgewotCQkJCQlyb2xlcy5hZGQoKFJvbGUpIG9iaik7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIXJvbGVzLmlzRW1wdHkoKSkgewotCQkJCUFkZFJvbGVUb1RlYW1Db21tYW5kIGNtZCA9IG5ldyBBZGRSb2xlVG9UZWFtQ29tbWFuZCgKLQkJCQkJCShUZWFtUHJvZmlsZSkgZWxlbWVudCwgcm9sZXMpOwotCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRnJvbVByb2Nlc3MoTGlzdCBpdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBpdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQkJQ29tcG9zaXRlUm9sZSBjb21wUm9sZSA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJLmNyZWF0ZUNvbXBvc2l0ZVJvbGUoKENvbXBvc2l0ZVJvbGUpIG9iaik7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQkJY29tcFJvbGUsIC0xKTsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQlvYmosIC0xKTsKLQkJCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIG9iaikuZ2V0Um9sZSgpOwotCQkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoIWlzUGFydE9mVGVhbShyb2xlLCAoVGVhbVByb2ZpbGUpIGVsZW1lbnQpKSB7Ci0JCQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGUpOwotCQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQkJCQlyb2xlRGVzYywgLTEpOwotCQkJCQkJfQotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQkJCQlvYmosIC0xKTsKLQotCQkJCQkJLy8gZmlyZSBOb3RpZmljYXRpb24KLQkJCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCQlBY3Rpdml0eSBwYXJlbnQgPSAoQWN0aXZpdHkpIGdldFBhcmVudEFjdGl2aXR5KGVsZW1lbnQpOwotCQkJCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCi0JCQkJCQlmaXJlTm90aWZpY2F0aW9uKGNoaWxkcmVuLCAoUm9sZURlc2NyaXB0b3IpIG9iaik7Ci0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCU1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1RlYW1Bc3NpZ25FcnJvcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7ICgoUm9sZURlc2NyaXB0b3IpIG9iaikuZ2V0TmFtZSgpLAotCQkJCQkJCQkoKFRlYW1Qcm9maWxlKSBlbGVtZW50KS5nZXROYW1lKCkgfTsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQXNzaWdubWVudEluZm9UaXRsZSwgbWYuZm9ybWF0KGFyZ3MpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVOb3RpZmljYXRpb24oQ29sbGVjdGlvbiBjaGlsZHJlbiwgUm9sZURlc2NyaXB0b3Igcm9sZURlc2MpIHsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCS5hZGFwdCgoQWN0aXZpdHkpIG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQljaGlsZHJlbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oKEFjdGl2aXR5KSBvYmopOwotCQkJCWZpcmVOb3RpZmljYXRpb24oY2hpbGRyZW4sIHJvbGVEZXNjKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlPYmplY3QgbzEgPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VmFsdWUoKTsKLQkJCQlBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIgYWN0aXZpdHlBZGFwdGVyID0gKEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqOwotCQkJCWZpcmVOb3RpZmljYXRpb24oYWN0aXZpdHlBZGFwdGVyLmdldENoaWxkcmVuKG8xKSwgcm9sZURlc2MpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCVJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBwcm92aWRlciA9IChSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIG9iajsKLQkJCQlpZiAoKChSb2xlRGVzY3JpcHRvcikgcHJvdmlkZXIuZ2V0VmFsdWUoKSkuZ2V0Um9sZSgpLmVxdWFscygKLQkJCQkJCXJvbGVEZXNjLmdldFJvbGUoKSkpIHsKLQkJCQkJcHJvdmlkZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJCQkJCQluZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uU0VULCBwcm92aWRlciwKLQkJCQkJCQkJCXByb3ZpZGVyKSwgcHJvdmlkZXIsIGZhbHNlLCB0cnVlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZW1vdmUoamF2YS51dGlsLkFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQkoUm9sZURlc2NyaXB0b3IpIG9iaiwgLTEpOwotCQkJCX0KLQotCQkJCS8vIGZpbmQgbWF0Y2hpbmcgcm9sZURlc2NyaXB0b3IgaW4gdGVhbSByb2xlcwotCQkJCUxpc3Qgcm9sZURlc2NMaXN0ID0gZmluZFJvbGVEZXNjcmlwdG9yKChPYmplY3QpIG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciByb2xlRGVzY0l0b3IgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgcm9sZURlc2NJdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgcm9sZURlc2NJdG9yCi0JCQkJCQkJLm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQlyb2xlRGVzYywgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBmaW5kUm9sZURlc2NyaXB0b3IoT2JqZWN0IG9iaikgewotCQlMaXN0IHRlYW1Sb2xlcyA9ICgoVGVhbVByb2ZpbGUpIGVsZW1lbnQpLmdldFRlYW1Sb2xlcygpOwotCQlMaXN0IHJvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdGVhbVJvbGVzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0b3JPYmplY3QgPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJaWYgKGl0b3JPYmplY3QgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJCUxpc3QgZmlyc3RPYmplY3RBZ2dSb2xlcyA9ICgoQ29tcG9zaXRlUm9sZSkgb2JqKQotCQkJCQkJCS5nZXRBZ2dyZWdhdGVkUm9sZXMoKTsKLQkJCQkJTGlzdCBzZWNvbmRPYmplY3RBZ2dSb2xlcyA9ICgoQ29tcG9zaXRlUm9sZSkgaXRvck9iamVjdCkKLQkJCQkJCQkuZ2V0QWdncmVnYXRlZFJvbGVzKCk7Ci0JCQkJCWlmIChmaXJzdE9iamVjdEFnZ1JvbGVzLmVxdWFscyhzZWNvbmRPYmplY3RBZ2dSb2xlcykpIHsKLQkJCQkJCXJvbGVEZXNjTGlzdC5hZGQoaXRvck9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKChpdG9yT2JqZWN0IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpCi0JCQkJCQkmJiAoIShpdG9yT2JqZWN0IGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkpKSB7Ci0JCQkJCU9iamVjdCBvYmpSb2xlID0gKChSb2xlRGVzY3JpcHRvcikgb2JqKS5nZXRSb2xlKCk7Ci0JCQkJCU9iamVjdCBpdG9yT2JqUm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIGl0b3JPYmplY3QpCi0JCQkJCQkJLmdldFJvbGUoKTsKLQkJCQkJaWYgKG9ialJvbGUuZXF1YWxzKGl0b3JPYmpSb2xlKSkgewotCQkJCQkJcm9sZURlc2NMaXN0LmFkZChpdG9yT2JqZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByb2xlRGVzY0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI29wZW5BZGREaWFsb2coKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5BZGREaWFsb2coKSB7Ci0JCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IFByb2Nlc3NVdGlsCi0JCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdCgoKFRlYW1Qcm9maWxlKSBlbGVtZW50KQotCQkJCQkJLmdldFRlYW1Sb2xlcygpKTsKLQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBnZXRGaWx0ZXIoKSwgZWxlbWVudCwKLQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUywgZXhpc3RpbmdFbGVtZW50cyk7Ci0JCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuUk9MRVMpOwotCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nW117RmlsdGVyQ29uc3RhbnRzLlJPTEVTfTsKLQkJZmQuc2V0VHlwZXMoc3RyKTsKLQkJZmQub3BlbigpOwotCQlhZGQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jb3BlbkFkZEZyb21Qcm9jZXNzRGlhbG9nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRnJvbVByb2Nlc3NEaWFsb2coKSB7Ci0JCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9ICgoVGVhbVByb2ZpbGUpIGVsZW1lbnQpLmdldFRlYW1Sb2xlcygpOwotCQlQcm9jZXNzIHByb2Nlc3MgPSAoUHJvY2VzcykgZ2V0UHJvY2VzcyhlbGVtZW50KTsKLQkJSUZpbHRlciBkZXNjcmlwdG9yRmlsdGVyID0gZ2V0RGVzY3JpcHRvckZpbHRlcigpOwotCi0JCWlmIChkZXNjcmlwdG9yRmlsdGVyICE9IG51bGwgJiYgcHJvY2VzcyAhPSBudWxsKSB7Ci0JCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQlkZXNjcmlwdG9yRmlsdGVyLCBwcm9jZXNzLAotCQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUywgZXhpc3RpbmdFbGVtZW50cyk7Ci0JCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5ST0xFX0RFU0NSSVBUT1JTKTsKLQkJCWZkLm9wZW4oKTsKLQkJCWFkZEZyb21Qcm9jZXNzKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50IEZpbmQgcGFyZW50IHVudGlsIGl0J3MgYWN0aXZpdHkuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQkJUHJvY2VzcwotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvY2VzcyhCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJcmV0dXJuIHBhcmVudDsKLQotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldFByb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgZGVzY3JpcHRvciBmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXREZXNjcmlwdG9yRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IERlc2NyaXB0b3JQcm9jZXNzRmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCUxpc3QgcGFyZW50c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWdldEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCBlbGVtZW50LCBwYXJlbnRzTGlzdCk7Ci0JCQkJCWlmIChwYXJlbnRzTGlzdC5jb250YWlucyhvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWlmIChvYmouZXF1YWxzKGdldFBhcmVudEFjdGl2aXR5KGVsZW1lbnQpKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlMaXN0IGNoaWxkTGlzdCA9ICgoQWN0aXZpdHkpIG9iaikuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQkJaWYgKGNoaWxkTGlzdC5jb250YWlucyhnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KSkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJTGlzdCBsaXN0ID0gZ2V0QWxsb3dhYmxlQWN0aXZpdGllcygpOwotCQkJCQlpZiAobGlzdC5jb250YWlucyhvYmopKXsKLQkJCQkJCUxpc3QgYmVsZW1lbnRzID0gKChBY3Rpdml0eSlvYmopLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQkJCQlpZighYmVsZW1lbnRzLmlzRW1wdHkoKSl7Ci0JCQkJCQkJaWYoY29udGFpbnNUeXBlKGJlbGVtZW50cywgUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0JCQkJCQkJCQkJCWdldEhlbHBlcigpKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJT2JqZWN0IHBhcmVudEFjdGl2aXR5ID0gZ2V0UGFyZW50QWN0aXZpdHkoKEJyZWFrZG93bkVsZW1lbnQpIG9iaik7Ci0JCQkJCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KTsKLQkJCQkJaWYgKHBhcmVudC5lcXVhbHMocGFyZW50QWN0aXZpdHkpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQkJaWYgKHBhcmVudEFjdGl2aXR5IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCWlmIChnZXRCYXNlQWN0aXZpdGllcygoQWN0aXZpdHkpIHBhcmVudCkuY29udGFpbnMoCi0JCQkJCQkJCXBhcmVudEFjdGl2aXR5KSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWlmIChnZXRBbGxvd2FibGVBY3Rpdml0aWVzKCkuY29udGFpbnMocGFyZW50QWN0aXZpdHkpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkJLmdldFBhcmVudChvYmopOwotCQkJCQlpZiAoZ2V0UGFyZW50QWN0aXZpdHkoZWxlbWVudCkuZXF1YWxzKG9iamVjdCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJfHwgb2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJb2JqZWN0ID0gKChBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCQkJfQotCQkJCQkJaWYgKGdldEFsbG93YWJsZUFjdGl2aXRpZXMoKS5jb250YWlucyhvYmplY3QpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IHBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCQkuZ2V0UGFyZW50KG9iaik7Ci0JCQkJCWlmIChnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KS5lcXVhbHMocGFyZW50KSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlPYmplY3Qgb2JqZWN0ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCUxpc3QgbGlzdCA9IGdldEFsbG93YWJsZUFjdGl2aXRpZXMoKTsKLQkJCQkJCWlmIChsaXN0LmNvbnRhaW5zKG9iamVjdCkpewotCQkJCQkJCS8vcmV0dXJuIHRydWU7Ci0JCQkJCQkJTGlzdCBiZWxlbWVudHMgPSAoKEFjdGl2aXR5KW9iaikuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQkJCQlpZighYmVsZW1lbnRzLmlzRW1wdHkoKSl7Ci0JCQkJCQkJCWlmKGNvbnRhaW5zVHlwZShiZWxlbWVudHMsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLGdldEhlbHBlcigpKSkKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBMaXN0IGdldEJhc2VBY3Rpdml0aWVzKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKCFhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKQotCQkJCS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUwpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkJCWlmICgodmUgIT0gbnVsbCkgJiYgKHZlIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0KLQkJCQlsaXN0LmFkZCh2ZSk7Ci0KLQkJCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgdmU7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgYWN0aXZpdHkgZm9yIGJyZWFrZG93bmVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gYnJFbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJCVBhcmVudCBhY3Rpdml0eQotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFBhcmVudEFjdGl2aXR5KEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYnJFbGVtZW50LAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBjaGlsZHJlbiBvZiB0aGUgYWN0aXZpdHkgcGFyZW50IHJlY3Vyc2l2ZWx5LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gYWN0aXZpdHlMaXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGdldENoaWxkQWN0aXZpdGllc0luU2NvcGUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlBY3Rpdml0eSBwYXJlbnQsIExpc3QgYWN0aXZpdHlMaXN0KSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0KLQkJT2JqZWN0IG8gPSBhZGFwdGVyLmdldENoaWxkcmVuKHBhcmVudCk7Ci0JCWlmIChvIGluc3RhbmNlb2YgTGlzdCkgewotCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBvOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWFjdGl2aXR5TGlzdC5hZGQob2JqKTsKLQkJCQlnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG9iaiwKLQkJCQkJCWFjdGl2aXR5TGlzdCk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IG8xID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmopLmdldFZhbHVlKCk7Ci0JCQkJCWFjdGl2aXR5TGlzdC5hZGQobzEpOwotCQkJCQlnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG8xLAotCQkJCQkJCWFjdGl2aXR5TGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zVHlwZShMaXN0IGxpc3QsIENsYXNzIGNsYXNzMSwgRmlsdGVySGVscGVyIGhlbHBlcikgewotCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgCi0JCQkJCSYmIGNsYXNzMS5pc0luc3RhbmNlKG9iaikKLQkJCQkJJiYgaGVscGVyLm1hdGNoZXIob2JqKSkgCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJcmV0dXJuIGNvbnRhaW5zVHlwZSgoKEFjdGl2aXR5KW9iaikuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSwKLQkJCQkJCWNsYXNzMSwgaGVscGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBhY3Rpdml0aWVzIGluIHNjb3BlCi0JICogCi0JICogQHJldHVybgotCSAqIAkJTGlzdCBvZiBhY3Rpdml0aWVzIGluIHNjb3BlCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEFsbG93YWJsZUFjdGl2aXRpZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gcGFyZW50IGFjdGl2aXR5Ci0JCU9iamVjdCBvYmplY3QgPSBnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJLy8gZ2V0IGFsbCBjaGlsZCBhY3Rpdml0aWVzIGluIHNjb3BlCi0JCQlnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG9iamVjdCwgbGlzdCk7Ci0JCX0KLQkJLy8gZ2V0IGJhc2UgYWN0aXZpdGllcyBmb3IgYWxsIGFjdGl2aXRpZXMgaW4gc2NvcGUKLQkJSGFzaFNldCBiYXNlQWN0aXZ0aWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWJhc2VBY3RpdnRpZXMuYWRkQWxsKGdldEJhc2VBY3Rpdml0aWVzKChBY3Rpdml0eSkgb2JqKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZXR1cm4gY29tcGxldGUgbGlzdCBvZiBjaGlsZCBhY3Rpdml0aWVzIGFuZCBpdCdzIGJhc2UgYWN0aXZpdGllcwotCQlsaXN0LmFkZEFsbChiYXNlQWN0aXZ0aWVzKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1dvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1dvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTNlMjlmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogVGhlIGdlbmVyYWwgdGFiIHNlY3Rpb24gZm9yIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24gZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24gewotCXByb3RlY3RlZCBXb3JrQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBldmVudERyaXZlbkJ1dHRvbiwgb25nb2luZ0J1dHRvbiwgcmVwZWF0YWJsZUJ1dHRvbjsKLQotCS8vIHByb3RlY3RlZCBUZXh0IHByZWRlY2Vzc29yVGV4dDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZEJ1dHRvbiwgZWRpdEJ1dHRvbiwgcmVtb3ZlQnV0dG9uOwotCi0JLy8gcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBldmVudERyaXZlbkJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyOwotCS8vIHByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgb25nb2luZ0J1dHRvblNlbGVjdGlvbkxpc3RlbmVyOwotCS8vIHByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgcmVwZWF0YWJsZUJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyOwotCi0JLy8gcHJpdmF0ZSBMaXN0ZW5lciBwcmVkZWNlc3NvcnNMaXN0ZW5lcjsKLQotCS8vIHByaXZhdGUgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyOwotCi0JLy8gcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQlwcml2YXRlIFRleHRDZWxsRWRpdG9yIHRleHRDZWxsRWRpdG9yOwotCi0JcHJpdmF0ZSBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgaWRDZWxsRWRpdG9yOwotCi0JcHJpdmF0ZSBDb21ib0JveENlbGxFZGl0b3IgY29tYm9Cb3hDZWxsRWRpdG9yOwotCi0JLy8gcHJlZGVjZXNzb3IgbWFwIGxpc3QKLQlwcml2YXRlIExpc3QgcHJlZE1hcExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGNsYXNzIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBleHRlbmRzIFRleHRDZWxsRWRpdG9yIHsKLQkJcHJvdGVjdGVkIE9iamVjdCBsYXN0SW52YWxpZEVsZW1lbnQ7Ci0KLQkJcHJpdmF0ZSBpbnQgY29sdW1uSW5kZXg7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBwYXJlbnQKLQkJICovCi0JCXB1YmxpYyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50KTsKLQkJfQotCi0JCXZvaWQgc2V0Q29sdW1uSW5kZXgoaW50IGNvbHVtbkluZGV4KSB7Ci0JCQl0aGlzLmNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvbHVtbkluZGV4KCkgewotCQkJcmV0dXJuIGNvbHVtbkluZGV4OwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRMYXN0SW52YWxpZEVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gbGFzdEludmFsaWRFbGVtZW50OwotCQl9Ci0KLQkJU3RyaW5nIGlzVmFsaWQoU3RyaW5nIHR4dCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCU9iamVjdCBlID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBtc2cgPSBpc1ZhbGlkKGUsIHR4dCk7Ci0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCWxhc3RJbnZhbGlkRWxlbWVudCA9IGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGFzdEludmFsaWRFbGVtZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIG1zZzsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBlLCBTdHJpbmcgdHh0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKiBEZXBlbmRlbmN5IExpdGVyYWxzICogKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOSVNIX1RPX1NUQVJUID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19TVEFSVDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTklTSF9UT19GSU5JU0ggPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RPX1NUQVJUID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVE9fRklOSVNIID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSDsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIENvbHVtbiBpZHMgKiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSUQgPSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lEOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9QUkVTRU5UQVRJT05fTkFNRSA9IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0RFUEVOREVOQ1kgPSAiZGVwZW5kZW5jeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKiBDb2x1bW4gZGVzY3JpcHRvciBjb25zdGFudHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSUQgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUNPTF9JRCwKLQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfSURfVEVYVCwgMCwgMTAwLCB0cnVlLCBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCwgU1dULkNFTlRFUik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJQ09MX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9QUkVTRU5UQVRJT05fTkFNRV9URVhULCAxLCAyNTAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9OT05FKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0RFUEVOREVOQ1kgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUNPTF9ERVBFTkRFTkNZLAotCQkJUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9ERVBFTkRFTkNZX1RFWFQsIDIsIDEwMCwgdHJ1ZSwgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU4pOyAvLyROT04tTkxTLTEkCi0KLQlDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1uRGVzY3JpcHRvcnMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcltdIHsKLQkJCUNPTF9ERVNDX0lELCBDT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSwgQ09MX0RFU0NfREVQRU5ERU5DWSB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2VsbEVkaXRvclZhbGlkYXRvciBpbXBsZW1lbnRzIElDZWxsRWRpdG9yVmFsaWRhdG9yIHsKLQotCQlwcml2YXRlIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yOwotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBDZWxsRWRpdG9yVmFsaWRhdG9yKFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yKSB7Ci0JCQl0aGlzLmNlbGxFZGl0b3IgPSBjZWxsRWRpdG9yOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLQkJCXJldHVybiBjZWxsRWRpdG9yLmlzVmFsaWQoKFN0cmluZykgdmFsdWUpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCXByaXZhdGUgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3I7Ci0KLQkJVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lcihWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcikgewotCQkJdGhpcy5jZWxsRWRpdG9yID0gY2VsbEVkaXRvcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlZhbGlkYXREZWFjdGl2YXRlZTo6cnVuIik7Ci0JCQkJCWlmIChjZWxsRWRpdG9yLmdldExhc3RJbnZhbGlkRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gY2VsbEVkaXRvci5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQkJCVN0cmluZyB0aXRsZSA9IGdldEVkaXRvcigpLmdldFRpdGxlKCk7Ci0JCQkJCQlTdHJpbmcgcHJvYmxlbSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX3RleHRFZGl0Q2VsbF9wcm9ibGVtX21zZzsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBwcm9ibGVtLCBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdmlld2VyLmVkaXRFbGVtZW50KGNlbGxFZGl0b3IuZ2V0TGFzdEludmFsaWRFbGVtZW50KCksCi0JCQkJCQkJCWNlbGxFZGl0b3IuZ2V0Q29sdW1uSW5kZXgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQotCQkvLyBnZXQgd29ya2JyZWFrZG93bmVsZW1lbnQgb2JqZWN0Ci0JCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jY3JlYXRlR2VuZXJhbFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlR2VuZXJhbFNlY3Rpb24oY29tcG9zaXRlKTsKLQotCQkvLyBFdmVudCBEcml2ZW4KLQkJZXZlbnREcml2ZW5CdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCWV2ZW50RHJpdmVuQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9FdmVudERyaXZlbik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBPbmdvaW5nCi0JCW9uZ29pbmdCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCW9uZ29pbmdCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X09uZ29pbmcpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gcmVwZWF0YWJsZQotCQlyZXBlYXRhYmxlQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTIpOwotCQlyZXBlYXRhYmxlQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9SZXBlYXRhYmxlKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHByZWRlY2Vzc29ycwotCQkvLyBGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJLy8gUHJvcGVydGllc1Jlc291cmNlcy5nZXRTdHJpbmcoIldvcmtCcmVha2Rvd25FbGVtZW50LlByZWRlY2Vzc29ycyIpKTsKLQkJLy8gcHJlZGVjZXNzb3JUZXh0ID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJLy8gU1dULkRFRkFVTFQsIGhvcml6b250YWxTcGFuKTsKLQkJLy8gcHJlZGVjZXNzb3JUZXh0LnNldFRleHQoZ2V0UHJlZGVjZXNzb3JzTGlzdCgpKTsKLQotCQkvLyBkZXBlbmVuY3kgdHlwZQotCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3kpOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCS8vIGNyZWF0ZSB2aWV3ZXIKLQkJCWNyZWF0ZVZpZXdlcihnZW5lcmFsQ29tcG9zaXRlLCAyKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciBjcmVhdGluZyB2aWV3ZXIgZm9yIHdvcmticmVha2Rvd24gZWxlbWVudCBnZW5lcmFsIHNlY3Rpb246ICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gY3JlYXRlIGJ1dHRvbiBwYW5lCi0JCUNvbXBvc2l0ZSBidXR0b25QYW5lID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCWJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotCQlidXR0b25QYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgYnV0dG9uUGFuZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uUGFuZSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQWRkKTsgLy8kTk9OLU5MUy0xJAotCQllZGl0QnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25QYW5lLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9FZGl0KTsgLy8kTk9OLU5MUy0xJAotCQlyZW1vdmVCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvblBhbmUsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X1JlbW92ZSk7IC8vJE5PTi1OTFMtMSQKLQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJZXZlbnREcml2ZW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKGV2ZW50RHJpdmVuQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlldmVudERyaXZlbkJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc0V2ZW50RHJpdmVuKCkKLQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCW9uZ29pbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCksIEJvb2xlYW4KLQkJCQkJCQkJLnZhbHVlT2Yob25nb2luZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJb25nb2luZ0J1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc09uZ29pbmcoKQotCQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJcmVwZWF0YWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihyZXBlYXRhYmxlQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlyZXBlYXRhYmxlQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzUmVwZWF0YWJsZSgpCi0JCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIExpc3QgcHJlZExpc3QgPSBlbGVtZW50LmdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0JCQkJV29ya09yZGVyIG8gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKTsKLQkJCQlvLnNldExpbmtUeXBlKFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUX0xJVEVSQUwpOwotCi0JCQkJLy8gcHJlZExpc3QuYWRkKG8pOwotCi0JCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gbmV3IFByZWRlY2Vzc29yTWFwKC0xLCAoV29ya09yZGVyKSBvKTsKLQkJCQlwcmVkTWFwTGlzdC5hZGQobWFwKTsKLQotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJdmlld2VyLmVkaXRFbGVtZW50KG1hcCwgMCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGdldCBzZWxlY3Rpb24KLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQlQcmVkZWNlc3Nvck1hcCBwcmVkTWFwID0gKFByZWRlY2Vzc29yTWFwKSBzZWxlY3Rpb24KLQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0QlNBZGFwdGVyKCk7Ci0JCQkJCU9iamVjdCBwcm9jZXNzID0gYWRhcHRlci5nZXRUb3BJdGVtKCk7Ci0KLQkJCQkJUHJlZGVjZXNzb3JEaWFsb2cgZGxnID0gbmV3IFByZWRlY2Vzc29yRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwgZWxlbWVudCwgcHJvY2VzcywgZ2V0QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQlwcmVkTWFwLCBwcmVkTWFwTGlzdCwgYWN0aW9uTWdyKTsKLQkJCQkJZGxnLm9wZW4oKTsKLQotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCVByZWRlY2Vzc29yTWFwIG1hcCA9IChQcmVkZWNlc3Nvck1hcCkgc2VsZWN0aW9uCi0JCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlwcmVkTWFwTGlzdC5yZW1vdmUobWFwKTsKLQotCQkJCQlXb3JrT3JkZXIgd28gPSBtYXAuZ2V0V29ya09yZGVyKCk7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQl3YmUsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQkJCQkJCXdvLCAtMSk7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQl9Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEgJiYgZWRpdGFibGUpIHsKLQkJCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWVkaXRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBwcmVkZWNlc3NvcnMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JLy8gcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZGVjZXNzb3JzTGlzdCgpCi0JLy8gewotCS8vIElCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0QlNBZGFwdGVyKCk7Ci0JLy8gcmV0dXJuIGFkYXB0ZXIuZ2V0QXR0cmlidXRlKGVsZW1lbnQsIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTKTsKLQkvLyB9Ci0JLy8gcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkKLQkvLyB7Ci0JLy8gc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JLy8JCQotCS8vIGV2ZW50RHJpdmVuQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50RHJpdmVuQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCS8vIG9uZ29pbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIob25nb2luZ0J1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQkvLyByZXBlYXRhYmxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHJlcGVhdGFibGVCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JLy8gLy9wcmVkZWNlc3NvclRleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIHByZWRlY2Vzc29yc0xpc3RlbmVyKTsKLQkvLyB9Ci0JLy8JCi0JLy8gcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTGlzdGVuZXJzKCkKLQkvLyB7Ci0JLy8gc3VwZXIucmVtb3ZlTGlzdGVuZXJzKCk7Ci0JLy8JCQkKLQkvLyBldmVudERyaXZlbkJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihldmVudERyaXZlbkJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQkvLyBvbmdvaW5nQnV0dG9uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG9uZ29pbmdCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JLy8gcmVwZWF0YWJsZUJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihyZXBlYXRhYmxlQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCS8vIC8vcHJlZGVjZXNzb3JUZXh0LnJlbW92ZUxpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBwcmVkZWNlc3NvcnNMaXN0ZW5lcik7Ci0JLy8gfQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQlldmVudERyaXZlbkJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJb25nb2luZ0J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJcmVwZWF0YWJsZUJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJdmlld2VyLmdldFRhYmxlKCkuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWFkZEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSAmJiBlZGl0YWJsZSkgewotCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotLy8JCWlmICgoRVBGUHJvcGVydHlTaGVldFBhZ2UuZm9ybVBhZ2VJRAotLy8JCQkJLmVxdWFscyhQcm9jZXNzRWRpdG9yLlRBX0ZPUk1fSUQpKQotLy8JCQkJfHwgKEVQRlByb3BlcnR5U2hlZXRQYWdlLmZvcm1QYWdlSUQKLS8vCQkJCQkJLmVxdWFscyhQcm9jZXNzRWRpdG9yLldQQlNfRk9STV9JRCkpKSB7Ci0JCWlmICghKEVQRlByb3BlcnR5U2hlZXRQYWdlLmZvcm1QYWdlSUQuZXF1YWxzKFByb2Nlc3NFZGl0b3IuV0JTX0ZPUk1fSUQpIHx8IEVQRlByb3BlcnR5U2hlZXRQYWdlLmZvcm1QYWdlSUQKLQkJCQkuZXF1YWxzKFByb2Nlc3NFZGl0b3IuQ09OU09MSURBVEVEX0ZPUk1fSUQpKSkgewotCQkJYWRkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXZpZXdlci5nZXRUYWJsZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0JCQkJZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JCQkJZXZlbnREcml2ZW5CdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNFdmVudERyaXZlbigpCi0JCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJCW9uZ29pbmdCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNPbmdvaW5nKCkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmVwZWF0YWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc1JlcGVhdGFibGUoKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQkvLyBwcmVkZWNlc3NvclRleHQuc2V0VGV4dChnZXRQcmVkZWNlc3NvcnNMaXN0KCkpOwotCi0JCQkJLy8gcmUtaW5pdGlhbGl6ZSBwcmVkTGlzdAotCQkJCXByZWRNYXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWluaXRpYWxpemVQcmVkTGlzdCgpOwotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciByZWZyZXNoaW5nIFdvcmticmVha2Rvd24gZWxlbWVudCBnZW5lcmFsIHNlY3Rpb246IiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbikgewotCQkvLyBjcmVhdGUgcHJvY2VzcyB2aWV3ZXIKLQkJdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSA1MDsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBzZXQgdXAgY29sdW1ucwotCQlTdHJpbmdbXSBjb2xQcm9wcyA9IG5ldyBTdHJpbmdbY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJY29sUHJvcHNbaV0gPSBjb2x1bW5EZXNjcmlwdG9yc1tpXS5pZDsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih2aWV3ZXIuZ2V0VGFibGUoKSwKLQkJCQkJY29sdW1uRGVzY3JpcHRvcnNbaV0uYWxpZ25tZW50KTsKLQkJCWNvbHVtbi5zZXRUZXh0KGNvbHVtbkRlc2NyaXB0b3JzW2ldLmxhYmVsKTsKLQkJCWNvbHVtbi5zZXRSZXNpemFibGUoY29sdW1uRGVzY3JpcHRvcnNbaV0ucmVzaXphYmxlKTsKLQkJCWNvbHVtbi5zZXRXaWR0aChjb2x1bW5EZXNjcmlwdG9yc1tpXS53aWR0aCk7Ci0KLQkJfQotCQl2aWV3ZXIuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl2aWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhjb2xQcm9wcyk7Ci0KLQkJLy8gdGFibGUgPSB2aWV3ZXIuZ2V0VGFibGUoKTsKLQotCQkvLyBmaW5hbCBUYWJsZUN1cnNvciBjdXJzb3IgPSBuZXcgVGFibGVDdXJzb3IodGFibGUsIFNXVC5OT05FKTsKLQkJLy8gZmluYWwgQ29udHJvbEVkaXRvciBlZGl0b3IgPSBuZXcgQ29udHJvbEVkaXRvcihjdXJzb3IpOwotCQkvLyBlZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkvLyBlZGl0b3IuZ3JhYlZlcnRpY2FsID0gdHJ1ZTsKLQotCQkvLyBmaW5hbCBUYWJsZUN1cnNvciBjdXJzb3IgPSBuZXcgVGFibGVDdXJzb3IodGFibGUsIFNXVC5OT05FKTsKLQkJLy8gLy8gY3JlYXRlIGFuIGVkaXRvciB0byBlZGl0IHRoZSBjZWxsIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiCi0JCS8vIC8vIHdoaWxlIG92ZXIgYSBjZWxsIGluIHRoZSB0YWJsZQotCQkvLyBmaW5hbCBDb250cm9sRWRpdG9yIGVkaXRvciA9IG5ldyBDb250cm9sRWRpdG9yKGN1cnNvcik7Ci0JCS8vIGVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCS8vIGVkaXRvci5ncmFiVmVydGljYWwgPSB0cnVlOwotCQkvLwotCQkvLyBjdXJzb3IuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCS8vIC8vIHdoZW4gdGhlIFRhYmxlRWRpdG9yIGlzIG92ZXIgYSBjZWxsLCBzZWxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgcm93Ci0JCS8vIGluCi0JCS8vIC8vIHRoZSB0YWJsZQotCQkvLyBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vIHRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyBjdXJzb3IuZ2V0Um93KCl9KTsKLQkJLy8gfQotCQkvLyAvLyB3aGVuIHRoZSB1c2VyIGhpdHMgIkVOVEVSIiBpbiB0aGUgVGFibGVDdXJzb3IsIHBvcCB1cCBhIHRleHQKLQkJLy8gZWRpdG9yIHNvIHRoYXQKLQkJLy8gLy8gdGhleSBjYW4gY2hhbmdlIHRoZSB0ZXh0IG9mIHRoZSBjZWxsCi0JCS8vIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vIGZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KGN1cnNvciwgU1dULk5PTkUpOwotCQkvLyBUYWJsZUl0ZW0gcm93ID0gY3Vyc29yLmdldFJvdygpOwotCQkvLyBpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkvLyB0ZXh0LnNldFRleHQocm93LmdldFRleHQoY29sdW1uKSk7Ci0JCS8vIHRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCS8vIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkvLyAvLyBjbG9zZSB0aGUgdGV4dCBlZGl0b3IgYW5kIGNvcHkgdGhlIGRhdGEgb3ZlcgotCQkvLyAvLyB3aGVuIHRoZSB1c2VyIGhpdHMgIkVOVEVSIgotCQkvLyBpZiAoZS5jaGFyYWN0ZXIgPT0gU1dULkNSKSB7Ci0JCS8vIFRhYmxlSXRlbSByb3cgPSBjdXJzb3IuZ2V0Um93KCk7Ci0JCS8vIGludCBjb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uKCk7Ci0JCS8vIGlmIChjb2x1bW4gPT0gMSkgcmV0dXJuOwotCQkvLyByb3cuc2V0VGV4dChjb2x1bW4sIHRleHQuZ2V0VGV4dCgpKTsKLQkJLy8gdGV4dC5kaXNwb3NlKCk7Ci0JCS8vIH0KLQkJLy8gLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIHdoZW4gdGhlIHVzZXIgaGl0cyAiRVNDIgotCQkvLyBpZiAoZS5jaGFyYWN0ZXIgPT0gU1dULkVTQykgewotCQkvLyB0ZXh0LmRpc3Bvc2UoKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0pOwotCQkvLyBlZGl0b3Iuc2V0RWRpdG9yKHRleHQpOwotCQkvLyB0ZXh0LnNldEZvY3VzKCk7Ci0JCS8vIH0KLQkJLy8gfSk7Ci0JCS8vIC8vIEhpZGUgdGhlIFRhYmxlQ3Vyc29yIHdoZW4gdGhlIHVzZXIgaGl0cyB0aGUgIkNUUkwiIG9yICJTSElGVCIga2V5LgotCQkvLyAvLyBUaGlzIGFsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCBtdWx0aXBsZSBpdGVtcyBpbiB0aGUgdGFibGUuCi0JCS8vIGN1cnNvci5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJLy8gcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCS8vIGlmIChlLmtleUNvZGUgPT0gU1dULkNUUkwKLQkJLy8gfHwgZS5rZXlDb2RlID09IFNXVC5TSElGVAotCQkvLyB8fCAoZS5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMAotCQkvLyB8fCAoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApIHsKLQkJLy8gY3Vyc29yLnNldFZpc2libGUoZmFsc2UpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfSk7Ci0JCS8vIC8vIFNob3cgdGhlIFRhYmxlQ3Vyc29yIHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgdGhlICJTSElGVCIgb3IgIkNUUkwiCi0JCS8vIGtleS4KLQkJLy8gLy8gVGhpcyBzaWduYWxzIHRoZSBlbmQgb2YgdGhlIG11bHRpcGxlIHNlbGVjdGlvbiB0YXNrLgotCQkvLyB0YWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJLy8gcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkvLyBpZiAoZS5rZXlDb2RlID09IFNXVC5DT05UUk9MICYmIChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkKLQkJLy8gcmV0dXJuOwotCQkvLyBpZiAoZS5rZXlDb2RlID09IFNXVC5TSElGVCAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMCkKLQkJLy8gcmV0dXJuOwotCQkvLyBpZiAoZS5rZXlDb2RlICE9IFNXVC5DT05UUk9MCi0JCS8vICYmIChlLnN0YXRlTWFzayAmIFNXVC5DT05UUk9MKSAhPSAwKQotCQkvLyByZXR1cm47Ci0JCS8vIGlmIChlLmtleUNvZGUgIT0gU1dULlNISUZUICYmIChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkKLQkJLy8gcmV0dXJuOwotCQkvLwotCQkvLyBUYWJsZUl0ZW1bXSBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJLy8gVGFibGVJdGVtIHJvdyA9IChzZWxlY3Rpb24ubGVuZ3RoID09IDApID8KLQkJLy8gdGFibGUuZ2V0SXRlbSh0YWJsZS5nZXRUb3BJbmRleCgpKSA6IHNlbGVjdGlvblswXTsKLQkJLy8gdGFibGUuc2hvd0l0ZW0ocm93KTsKLQkJLy8gY3Vyc29yLnNldFNlbGVjdGlvbihyb3csIDApOwotCQkvLyBjdXJzb3Iuc2V0VmlzaWJsZSh0cnVlKTsKLQkJLy8gY3Vyc29yLnNldEZvY3VzKCk7Ci0JCS8vIH0KLQkJLy8gfSk7Ci0KLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmVkTWFwTGlzdDo6IitwcmVkTWFwTGlzdCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJcmV0dXJuICgoTGlzdCkgcHJlZE1hcExpc3QpLnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb246OmxhYmVsUHJvdmlkZXIKLQkJCQkvLyBPYmplY3QtICIgKyBvYmopOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcmVkZWNlc3Nvck1hcCkgewotCQkJCQlpbnQgaWQgPSAoKFByZWRlY2Vzc29yTWFwKSBvYmopLmdldElkKCk7Ci0JCQkJCVdvcmtPcmRlciB3byA9ICgoUHJlZGVjZXNzb3JNYXApIG9iaikuZ2V0V29ya09yZGVyKCk7Ci0KLQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGlkKTsKLQkJCQkJfQotCQkJCQlpZiAoaSA9PSAxKSB7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAod28uZ2V0UHJlZCgpICE9IG51bGwpIHsKLQkJCQkJCQluYW1lID0gd28uZ2V0UHJlZCgpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5hbWUpKSB7Ci0JCQkJCQkJCXJldHVybiB3by5nZXRQcmVkKCkuZ2V0TmFtZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBuYW1lOwotCQkJCQl9Ci0JCQkJCWlmIChpID09IDIpIHsKLQkJCQkJCWlmICh3by5nZXRMaW5rVHlwZSgpLmdldFZhbHVlKCkgPT0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIKQotCQkJCQkJCXJldHVybiBGSU5JU0hfVE9fRklOSVNIOwotCQkJCQkJZWxzZSBpZiAod28uZ2V0TGlua1R5cGUoKS5nZXRWYWx1ZSgpID09IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUKQotCQkJCQkJCXJldHVybiBGSU5JU0hfVE9fU1RBUlQ7Ci0JCQkJCQllbHNlIGlmICh3by5nZXRMaW5rVHlwZSgpLmdldFZhbHVlKCkgPT0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVCkKLQkJCQkJCQlyZXR1cm4gU1RBUlRfVE9fU1RBUlQ7Ci0JCQkJCQllbHNlIGlmICh3by5nZXRMaW5rVHlwZSgpLmdldFZhbHVlKCkgPT0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19GSU5JU0gpCi0JCQkJCQkJcmV0dXJuIFNUQVJUX1RPX0ZJTklTSDsKLQkJCQkJCXJldHVybiB3by5nZXRMaW5rVHlwZSgpLmdldE5hbWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQotCQl0ZXh0Q2VsbEVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcih2aWV3ZXIuZ2V0VGFibGUoKSk7Ci0JCWNvbWJvQm94Q2VsbEVkaXRvciA9IG5ldyBDb21ib0JveENlbGxFZGl0b3Iodmlld2VyLmdldFRhYmxlKCksCi0JCQkJbmV3IFN0cmluZ1tdIHsgRklOSVNIX1RPX1NUQVJULCBGSU5JU0hfVE9fRklOSVNILAotCQkJCQkJU1RBUlRfVE9fU1RBUlQsIFNUQVJUX1RPX0ZJTklTSCB9KTsKLQotCQlzZXRDZWxsRWRpdG9ycygpOwotCQlzZXRDZWxsTW9kaWZpZXJzKCk7Ci0KLQkJaW5pdGlhbGl6ZVByZWRMaXN0KCk7Ci0JCXZpZXdlci5zZXRJbnB1dChwcmVkTWFwTGlzdCk7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIGludCBnZXRDZWxsRWRpdG9yVHlwZShTdHJpbmcgcHJvcGVydHkpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJQ29sdW1uRGVzY3JpcHRvciBkZXNjID0gY29sdW1uRGVzY3JpcHRvcnNbaV07Ci0JCQlpZiAoZGVzYy5pZCA9PSBwcm9wZXJ0eSkgewotCQkJCXJldHVybiBkZXNjLmNlbGxFZGl0b3JUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfTk9ORTsKLQl9Ci0KLQlwdWJsaWMgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKFN0cmluZyBjb2x1bW5JRCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChjb2x1bW5JRCA9PSBDT0xfSUQpIHsKLQkJCWlmIChpZENlbGxFZGl0b3IgPT0gbnVsbCkgewotCQkJCWlkQ2VsbEVkaXRvciA9IG5ldyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3Iodmlld2VyLmdldFRhYmxlKCkpIHsKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBlLCBTdHJpbmcgdHh0KSB7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvcjo6aXNWYWxpZCIpOwotCQkJCQkJZSA9IFRuZ1V0aWwudW53cmFwKGUpOwotCi0JCQkJCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldEJTQWRhcHRlcigpOwotCQkJCQkJT2JqZWN0IHByb2Nlc3MgPSBhZGFwdGVyLmdldFRvcEl0ZW0oKTsKLQotCQkJCQkJTGlzdCBwcmVkZWNlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQkJCVN0cmluZyBzdHIgPSBnZXRQcmVkSWQoKTsKLQkJCQkJCVN0cmluZyByZXN1bHQgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkuY2hlY2tQcmVkZWNlc3Nvckxpc3Qod2JlLCBzdHIsCi0JCQkJCQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSwgcHJvY2VzcywKLQkJCQkJCQkJCQlwcmVkZWNlc3NvcnMpOwotCi0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCWlkQ2VsbEVkaXRvcgotCQkJCQkJLnNldFZhbGlkYXRvcihuZXcgQ2VsbEVkaXRvclZhbGlkYXRvcihpZENlbGxFZGl0b3IpKTsKLQkJCQlpZENlbGxFZGl0b3IuZ2V0Q29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJbmV3IFZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIoaWRDZWxsRWRpdG9yKSk7Ci0JCQl9Ci0JCQlpZENlbGxFZGl0b3Iuc2V0Q29sdW1uSW5kZXgoY29sdW1uSW5kZXgpOwotCi0JCQlyZXR1cm4gaWRDZWxsRWRpdG9yOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENlbGxFZGl0b3JzKCkgewotCQlDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvcltjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDZWxsRWRpdG9yIGNlbGxFZGl0b3IgPSBnZXRDZWxsRWRpdG9yKGNvbHVtbkRlc2NyaXB0b3JzW2ldLmlkLCBpKTsKLQkJCWlmIChjZWxsRWRpdG9yICE9IG51bGwpIHsKLQkJCQljZWxsRWRpdG9yc1tpXSA9IGNlbGxFZGl0b3I7Ci0JCQl9IGVsc2UgewotCQkJCXN3aXRjaCAoY29sdW1uRGVzY3JpcHRvcnNbaV0uY2VsbEVkaXRvclR5cGUpIHsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUOgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IHRleHRDZWxsRWRpdG9yOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DT01CT19CT09MRUFOOgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IGNvbWJvQm94Q2VsbEVkaXRvcjsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQl2aWV3ZXIuc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDZWxsTW9kaWZpZXJzKCkgewotCQkvLyBTZXQgdGhlIGNlbGwgbW9kaWZpZXIKLQkJdmlld2VyLnNldENlbGxNb2RpZmllcihuZXcgSUNlbGxNb2RpZmllcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjYW5Nb2RpZnk6IGVsZW1lbnQ9IitlbGVtZW50KyIsCi0JCQkJLy8gcHJvcGVydHk9Iitwcm9wZXJ0eSk7Ci0JCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFByZWRlY2Vzc29yTWFwKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChwcm9wZXJ0eSA9PSBDT0xfUFJFU0VOVEFUSU9OX05BTUUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldFZhbHVlOiBlbGVtZW50PSIrZWxlbWVudCsiLAotCQkJCS8vIHByb3BlcnR5PSIrcHJvcGVydHkpOwotCi0JCQkJU3RyaW5nIHZhbCA9IG51bGw7Ci0JCQkJc3dpdGNoIChnZXRDZWxsRWRpdG9yVHlwZShwcm9wZXJ0eSkpIHsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUOgotCQkJCQl2YWwgPSBuZXcgSW50ZWdlcigoKFByZWRlY2Vzc29yTWFwKSBlbGVtZW50KS5nZXRJZCgpKQotCQkJCQkJCS50b1N0cmluZygpOwotCQkJCQlyZXR1cm4gdmFsOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU46Ci0JCQkJCWludCB2YWx1ZSA9ICgoKFByZWRlY2Vzc29yTWFwKSBlbGVtZW50KS5nZXRXb3JrT3JkZXIoKSkKLQkJCQkJCQkuZ2V0TGlua1R5cGUoKS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAoV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlQgPT0gdmFsdWUpIHsKLQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcigwKTsKLQkJCQkJfSBlbHNlIGlmIChXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0ggPT0gdmFsdWUpIHsKLQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcigxKTsKLQkJCQkJfSBlbHNlIGlmIChXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUID09IHZhbHVlKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEludGVnZXIoMik7Ci0JCQkJCX0gZWxzZQotCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKDMpOwotCi0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnkoZmluYWwgT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwKLQkJCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJtb2RpZnk6IGVsZW1lbnQ9IitlbGVtZW50KyIsCi0JCQkJLy8gcHJvcGVydHk9Iitwcm9wZXJ0eSsiLCB2YWx1ZT0iK3ZhbHVlKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGVsZW1lbnQ7Ci0JCQkJUHJlZGVjZXNzb3JNYXAgcHJlZE1hcCA9IChQcmVkZWNlc3Nvck1hcCkgaXRlbS5nZXREYXRhKCk7Ci0JCQkJV29ya09yZGVyIHdvID0gcHJlZE1hcC5nZXRXb3JrT3JkZXIoKTsKLQotCQkJCWlmIChwcm9wZXJ0eS5lcXVhbHMoQ09MX0lEKSkgewotCQkJCQlpdGVtLnNldFRleHQoMCwgdmFsdWUudG9TdHJpbmcoKSk7Ci0KLQkJCQkJaW50IHByZWRJZDsKLQkJCQkJdHJ5IHsKLQkJCQkJCXByZWRJZCA9IG5ldyBJbnRlZ2VyKHZhbHVlLnRvU3RyaW5nKCkpLmludFZhbHVlKCk7Ci0JCQkJCQlpZiAocHJlZElkIDwgMCkKLQkJCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlclRpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlck1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlwcmVkTWFwTGlzdC5yZW1vdmUocHJlZE1hcCk7Ci0JCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXByZWRNYXAuc2V0SWQocHJlZElkKTsKLQkJCQl9Ci0KLQkJCQlmaW5hbCBpbnQgY29sdW1uSW5kZXggPSBnZXRDb2x1bW5JbmRleChwcm9wZXJ0eSk7Ci0JCQkJQ2VsbEVkaXRvciBjZWxsRWRpdG9yID0gdmlld2VyLmdldENlbGxFZGl0b3JzKClbY29sdW1uSW5kZXhdOwotCQkJCVN0cmluZyBlcnJNc2cgPSBjZWxsRWRpdG9yLmdldEVycm9yTWVzc2FnZSgpOwotCQkJCWlmIChlcnJNc2cgIT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJV29ya09yZGVyVHlwZSB0eXBlOwotCQkJCXN3aXRjaCAoZ2V0Q2VsbEVkaXRvclR5cGUocHJvcGVydHkpKSB7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVDoKLQotCQkJCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldEJTQWRhcHRlcigpOwotCQkJCQlPYmplY3QgcHJvY2VzcyA9IGFkYXB0ZXIuZ2V0VG9wSXRlbSgpOwotCi0JCQkJCUxpc3QgcHJlZGVjZXNzb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIHN0ciA9IGdldFByZWRJZCgpOwotCQkJCQlTdHJpbmcgcmVzdWx0ID0gUHJvY2Vzc1V0aWwuY2hlY2tQcmVkZWNlc3Nvckxpc3Qod2JlLCBzdHIsCi0JCQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSwgcHJvY2VzcywgcHJlZGVjZXNzb3JzKTsKLQotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJCVdvcmtPcmRlciBvID0gbnVsbDsKLQkJCQkJCWludCBzaXplID0gd2JlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuc2l6ZSgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd2JlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCW8gPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpbnQgaWQgPSBwcmVkZWNlc3NvcnMuaW5kZXhPZihvLmdldFByZWQoKSk7Ci0JCQkJCQkJaWYgKGlkID09IC0xKSB7Ci0JCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlzaXplID0gcHJlZGVjZXNzb3JzLnNpemUoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgcHJlZGVjZXNzb3JzCi0JCQkJCQkJCQkuZ2V0KGkpOwotCQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJCQlmaW5kX3ByZWQ6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB3YmUKLQkJCQkJCQkJCS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlvID0gKFdvcmtPcmRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAoby5nZXRQcmVkKCkgPT0gZSkgewotCQkJCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCQkJYnJlYWsgZmluZF9wcmVkOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghZm91bmQpIHsKLQkJCQkJCQkJbyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpOwotCQkJCQkJCQlvLnNldFByZWQoZSk7Ci0JCQkJCQkJCW8KLQkJCQkJCQkJCQkuc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlRfTElURVJBTCk7Ci0JCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJCQkJd2JlLAotCQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCQkJCQkJCQlvLCAtMSk7Ci0JCQkJCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCQkJCXByZWRNYXAuc2V0V29ya09yZGVyKG8pOwotCi0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlwcmVkTWFwTGlzdC5yZW1vdmUocHJlZE1hcCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBzaG93IGVycm9yIG1lc3NhZ2UgYm94Ci0JCQkJCQlTdHJpbmcgdGl0bGUgPSBnZXRFZGl0b3IoKS5nZXRUaXRsZSgpOwotCQkJCQkJU3RyaW5nIHByb2JsZW0gPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc19jZWxsRWRpdG9yX2ludmFsaWRQcmVkY2Vzc29yX3Byb2JsZW1fbXNnOyAvLyROT04tTkxTLTEkCi0JCQkJCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQkJCWRpYWxvZy5kaXNwbGF5V2FybmluZyh0aXRsZSwgcHJvYmxlbSwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcHJlZE1hcExpc3QucmVtb3ZlKHByZWRNYXApOwotCQkJCQl9Ci0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ09NQk9fQk9PTEVBTjoKLQkJCQkJaW50IGluZGV4ID0gKChOdW1iZXIpIHZhbHVlKS5pbnRWYWx1ZSgpOwotCQkJCQlpZiAoaW5kZXggPT0gMCkgewotCQkJCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUX0xJVEVSQUw7Ci0JCQkJCX0gZWxzZSBpZiAoaW5kZXggPT0gMSkgewotCQkJCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSF9MSVRFUkFMOwotCQkJCQl9IGVsc2UgaWYgKGluZGV4ID09IDIpIHsKLQkJCQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUX0xJVEVSQUw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0eXBlID0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19GSU5JU0hfTElURVJBTDsKLQkJCQkJfQotCi0JCQkJCS8vIHNldCB3b3JrcHJvZHVjdCB0eXBlCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidHlwZSAtIit0eXBlKTsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgd28sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya09yZGVyX0xpbmtUeXBlKCksIHR5cGUsCi0JCQkJCQkJLTEpOwotCQkJCQlicmVhazsKLQotCQkJCWRlZmF1bHQ6Ci0JCQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0hfTElURVJBTDsKLQkJCQl9Ci0KLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgbGlzdCBvZiBpdGVtIHByb3ZpZGVycyBmb3IgcHJlZGVjZXNzb3JzCi0JICogCi0JICogQHJldHVybgotCSAqLwotCS8vIHByaXZhdGUgT2JqZWN0IGdldFByZWRJdGVtUHJvdmlkZXJzKCkKLQkvLyB7Ci0JLy8gSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXRCU0FkYXB0ZXIoKTsKLQkvLyBpZiAoYWRhcHRlciAhPSBudWxsKQotCS8vIHJldHVybiBhZGFwdGVyLmdldFByZWRlY2Vzc29ycygpOwotCS8vICAgIAkKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldEJTQWRhcHRlcigpIHsKLQkJdHJ5IHsKLQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOy8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBwcm92aWRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBmYWN0b3J5LmFkYXB0KAotCQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcmV0dXJuIHByb3ZpZGVyOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gY29sdW1uIGluZGV4IGZvciBwcm9wZXJ0eQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRDb2x1bW5JbmRleChTdHJpbmcgcHJvcGVydHkpIHsKLQkJT2JqZWN0W10gY29sUHJvcHMgPSB2aWV3ZXIuZ2V0Q29sdW1uUHJvcGVydGllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbFByb3BzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29sUHJvcHNbaV0gPT0gcHJvcGVydHkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNnZXROYW1lUHJlZml4KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfVEVBTV9QUk9GSUxFICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfTUlMRVNUT05FICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfV09SS19QUk9EVUNUX0VMRU1FTlQgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZElkKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRNYXBMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gKFByZWRlY2Vzc29yTWFwKSBpdG9yLm5leHQoKTsKLQkJCWJ1Zi5hcHBlbmQobWFwLmdldElkKCkpOwotCQkJYnVmLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgcHJlZCBsaXN0Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQcmVkTGlzdCgpIHsKLQkJdHJ5IHsKLQkJCUxpc3QgcHJlZFByb3ZpZGVycyA9IG51bGw7Ci0KLQkJCS8vIGdldCB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JCQllbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJCS8vIGdldCBwcmVkZWNlc3NvciBpdGVtIHByb3ZpZGVycwotCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIHByb3ZpZGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGZhY3RvcnkKLQkJCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChwcm92aWRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQlwcmVkUHJvdmlkZXJzID0gKChJQlNJdGVtUHJvdmlkZXIpIHByb3ZpZGVyKQotCQkJCQkJCS5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG5lZWQgZm9sbG93aW5nIGZvciBzcGVjaWFsIGNhc2UgKFdyYXBwZXJJdGVtUHJvdmlkZXJzKS4KLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlPYmplY3QgaW5wdXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJcHJlZFByb3ZpZGVycyA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGlucHV0KQotCQkJCQkJCS5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldCBsaW5rIHRvIHByZWRlY2Vzc29ycwotCQkJaWYgKChlbGVtZW50ICE9IG51bGwpICYmIChwcmVkUHJvdmlkZXJzICE9IG51bGwpKSB7Ci0JCQkJTGlzdCBwcmVkTGlzdCA9IGVsZW1lbnQuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZW1JdGVyYXRvciA9IHByZWRQcm92aWRlcnMuaXRlcmF0b3IoKTsgaXRlbUl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCU9iamVjdCBpdGVtT2JqID0gKE9iamVjdCkgaXRlbUl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJT2JqZWN0IHRhcmdldE9iaiA9IG51bGw7Ci0JCQkJCWlmIChpdGVtT2JqIGluc3RhbmNlb2YgV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJdGFyZ2V0T2JqID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVtT2JqKS5nZXRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChpdGVtT2JqIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQkJdGFyZ2V0T2JqID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBpdGVtT2JqKS5nZXRUYXJnZXQoKTsKLQkJCQkJfQotCQkJCQlpZiAodGFyZ2V0T2JqICE9IG51bGwpIHsKLQkJCQkJCWludCBpZCA9ICgoSUJTSXRlbVByb3ZpZGVyKSBpdGVtT2JqKS5nZXRJZCgpOwotCQkJCQkJZm91bmQgPSBhZGRQcmVkZWNlc3NvcihwcmVkTGlzdCwgaWQsIHRhcmdldE9iaik7Ci0KLQkJCQkJCWlmICgoIWZvdW5kKQotCQkJCQkJCQkmJiAodGFyZ2V0T2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSkgewotCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIHRhcmdldE9iajsKLQkJCQkJCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsID0gdmUKLQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJCQl0YXJnZXRPYmogPSBlbDsKLQotCQkJCQkJCQkvLyBhZGQgYmFzZSB2YXJpYWJpbGl0eSBvYmplY3QKLQkJCQkJCQkJYWRkUHJlZGVjZXNzb3IocHJlZExpc3QsIGlkLCB0YXJnZXRPYmopOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRvcj1wcmVkTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspCi0JCQkJLy8gewotCQkJCS8vIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkvLyBPYmplY3QgbyA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJCS8vIGlmIChvIGluc3RhbmNlb2YgV29ya09yZGVyKQotCQkJCS8vIHsKLQkJCQkvLyAvL1N5c3RlbS5vdXQucHJpbnRsbigiZ2V0RWxlbWVudDo6V29ya09yZGVyID0gIisgKChXb3JrT3JkZXIpCi0JCQkJLy8gbykuZ2V0UHJlZCgpKTsKLQkJCQkvLyBXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSAoKFdvcmtPcmRlcikgbykuZ2V0UHJlZCgpOwotCQkJCS8vIGlmICh3YmUgIT0gbnVsbCkKLQkJCQkvLyB7Ci0JCQkJLy8gZm9yIChJdGVyYXRvciBpdGVtSXRlcmF0b3I9cHJlZFByb3ZpZGVycy5pdGVyYXRvcigpOwotCQkJCS8vIGl0ZW1JdGVyYXRvci5oYXNOZXh0KCk7KQotCQkJCS8vIHsKLQkJCQkvLyBPYmplY3QgaXRlbU9iaiA9IChPYmplY3QpIGl0ZW1JdGVyYXRvci5uZXh0KCk7Ci0JCQkJLy8gT2JqZWN0IHRhcmdldE9iaiA9IG51bGw7Ci0JCQkJLy8gaWYgKGl0ZW1PYmogaW5zdGFuY2VvZiBXcmFwcGVySXRlbVByb3ZpZGVyKQotCQkJCS8vIHsKLQkJCQkvLyB0YXJnZXRPYmogPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZW1PYmopLmdldFZhbHVlKCk7Ci0JCQkJLy8gfQotCQkJCS8vIGlmIChpdGVtT2JqIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkJCQkvLyB7Ci0JCQkJLy8gdGFyZ2V0T2JqID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKWl0ZW1PYmopLmdldFRhcmdldCgpOwotCQkJCS8vIH0KLQkJCQkvLyBpZiAodGFyZ2V0T2JqICE9IG51bGwpCi0JCQkJLy8gewotCQkJCS8vIGlmICh0YXJnZXRPYmouZXF1YWxzKHdiZSkpCi0JCQkJLy8gewotCQkJCS8vIC8vIGNyZWF0ZSBtYXBPYmplY3RMaXN0Ci0JCQkJLy8gaW50IGlkID0gKChJQlNJdGVtUHJvdmlkZXIpIGl0ZW1PYmopLmdldElkKCk7Ci0JCQkJLy8gUHJlZGVjZXNzb3JNYXAgbWFwID0gbmV3IFByZWRlY2Vzc29yTWFwKGlkLCAoV29ya09yZGVyKSBvKTsKLQkJCQkvLyBwcmVkTWFwTGlzdC5hZGQobWFwKTsKLQkJCQkvLwkJCi0JCQkJLy8gZm91bmQ9dHJ1ZTsKLQkJCQkvLyBicmVhazsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyBpZiAoIWZvdW5kKQotCQkJCS8vIHsKLQkJCQkvLyAvLyBpZiBwcm92aWRlciBpcyBub3QgZm91bmQsIHRoZW4gYWRkIHdpdGggaWQ9MAotCQkJCS8vIC8vIGRvIGl0IG9ubHkgZm9yIFRlYW1BbGxvY2F0aW9uIGFuZCBXb3JrUHJvZHVjdFVzYWdlIHZpZXcKLQkJCQkvLyAvLyBpZgotCQkJCS8vICgoRVBGUHJvcGVydHlTaGVldFBhZ2UuZm9ybVBhZ2VJRC5lcXVhbHMoUHJvY2Vzc0Zvcm1FZGl0b3IuVEFfRk9STV9JRCkpCi0JCQkJLy8gfHwKLQkJCQkvLyAvLwotCQkJCS8vIChFUEZQcm9wZXJ0eVNoZWV0UGFnZS5mb3JtUGFnZUlELmVxdWFscyhQcm9jZXNzRm9ybUVkaXRvci5XUEJTX0ZPUk1fSUQpKSkKLQkJCQkvLyB7Ci0JCQkJLy8gUHJlZGVjZXNzb3JNYXAgbWFwID0gbmV3IFByZWRlY2Vzc29yTWFwKDAsIChXb3JrT3JkZXIpIG8pOwotCQkJCS8vIHByZWRNYXBMaXN0LmFkZChtYXApOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoIkluaXRpYWxpemluZyBQcmVkZWNlc3NvciBMaXN0IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGRQcmVkZWNlc3NvcihMaXN0IHByZWRMaXN0LCBpbnQgaWQsIE9iamVjdCB0YXJnZXRPYmopIHsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcHJlZExpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldEVsZW1lbnQ6OldvcmtPcmRlciA9ICIrICgoV29ya09yZGVyKQotCQkJCS8vIG8pLmdldFByZWQoKSk7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlID0gKChXb3JrT3JkZXIpIG8pLmdldFByZWQoKTsKLQotCQkJCWlmICh0YXJnZXRPYmouZXF1YWxzKHdiZSkpIHsKLQkJCQkJLy8gY3JlYXRlIG1hcE9iamVjdExpc3QKLQkJCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gbmV3IFByZWRlY2Vzc29yTWFwKGlkLCAoV29ya09yZGVyKSBvKTsKLQkJCQkJcHJlZE1hcExpc3QuYWRkKG1hcCk7Ci0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGE0OTU2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1NwZWNpZmljV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Bc3NpZ25XUFRvRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTGlua01ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSBnZW5lcmFsIHRhYiBzZWN0aW9uIGZvciBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiBleHRlbmRzCi0JCURlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiB7Ci0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBlbGVtZW50OwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbWV0aG9kX2VsZW1lbnQ7Ci0KLQlwcml2YXRlIFRleHQgY3RybF93b3JrUHJvZHVjdF90eXBlOwotCi0JcHJpdmF0ZSBUZXh0IGFjdGl2aXR5RW50cnlTdGF0ZSwgYWN0aXZpdHlFeGl0U3RhdGU7Ci0KLQlwcml2YXRlIEJ1dHRvbiBsaW5rQnV0dG9uOwotCi0KLQlwcml2YXRlIFRhYmxlIGN0cmxfdGFibGVfMTsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyXzE7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZF8xLCBjdHJsX2FkZF9wcm9jXzEsIGN0cmxfcmVtb3ZlXzE7Ci0KLQlwcml2YXRlIFNlY3Rpb24gZGVsaXZlcmFibGVTZWN0aW9uOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciB3cE1vZGVsTW9kaWZ5TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQkvLyBnZXQgV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9iamVjdAotCQllbGVtZW50ID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCB0b2dnbGVTZWN0aW9uKCkgewotCQlpZiAoIShlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkpIHsKLQkJCWlmIChkZWxpdmVyYWJsZVNlY3Rpb24uaXNFeHBhbmRlZCgpKQotCQkJCWRlbGl2ZXJhYmxlU2VjdGlvbi5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JCQlpZiAoZGVsaXZlcmFibGVTZWN0aW9uLmlzVmlzaWJsZSgpKQotCQkJCWRlbGl2ZXJhYmxlU2VjdGlvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmICghZGVsaXZlcmFibGVTZWN0aW9uLmlzRXhwYW5kZWQoKSkKLQkJCQlkZWxpdmVyYWJsZVNlY3Rpb24uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCQlpZiAoIWRlbGl2ZXJhYmxlU2VjdGlvbi5pc1Zpc2libGUoKSkKLQkJCQlkZWxpdmVyYWJsZVNlY3Rpb24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWxpdmVyYWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlTdHJpbmcgc2VjdGlvblRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc2VjdGlvbkRlc2MgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvbkRlc2NyaXB0aW9uOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0YWJsZVRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMTsgLy8kTk9OLU5MUy0xJAotCi0JCVNlY3Rpb24gc2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQlzZWN0aW9uVGl0bGUsIHNlY3Rpb25EZXNjKTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uLAotCQkJCTIsIGZhbHNlKTsKLQotCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCB0YWJsZVRpdGxlKTsKLQotCQlpbnQgdGFibGVIZWlnaHQgPSA4MDsKLQkJY3RybF90YWJsZV8xID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCB0YWJsZUhlaWdodCk7Ci0JCXZpZXdlcl8xID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMSk7Ci0JCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlMaXN0IGRlbGl2ZXJhYmxlUGFydHMgPSBlbGVtZW50LmdldERlbGl2ZXJhYmxlUGFydHMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBkZWxpdmVyYWJsZVBhcnRzLml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdG9yCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJaWYgKHdwRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsCi0JCQkJCQkJfHwgd3BEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpCi0JCQkJCQluZXdMaXN0LmFkZCh3cERlc2MpOwotCQkJCX0KLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KG5ld0xpc3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJdmlld2VyXzEuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdlcl8xLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlcl8xLnNldElucHV0KGVsZW1lbnQpOwotCi0JCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTIKLQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJY3RybF9hZGRfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYWRkX3Byb2NfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzKTsgCi0JCWN0cmxfcmVtb3ZlXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQotCQlkZWxpdmVyYWJsZVNlY3Rpb24gPSBzZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJLy8gaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJLy8gewotCQkvLyBsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJLy8gfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNjcmVhdGVHZW5lcmFsU2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVHZW5lcmFsU2VjdGlvbihjb21wb3NpdGUpOwotCi0JCS8vIG1ldGhvZCBlbGVtZW50Ci0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfVHlwZV9Xb3JrUHJvZHVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9tZXRob2RfZWxlbWVudCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJU1dULkRFRkFVTFQsIDEpOwotCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQljdHJsX21ldGhvZF9lbGVtZW50LnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWxpbmtCdXR0b24gPSBGb3JtVUkKLQkJCQkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFNXVC5QVVNILCAxKTsKLQkJbGlua0J1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsICIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHR5cGUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya1Byb2R1Y3RfVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF93b3JrUHJvZHVjdF90eXBlID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlTV1QuREVGQVVMVCwgaG9yaXpvbnRhbFNwYW4pOwotCQljdHJsX3dvcmtQcm9kdWN0X3R5cGUuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50VHlwZShlbGVtZW50KSk7Ci0JCWN0cmxfd29ya1Byb2R1Y3RfdHlwZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkvLyBhY3Rpdml0eUVudHJ5c3RhdGUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYWN0aXZpdHlFbnRyeVN0YXRlID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlTV1QuREVGQVVMVCwgaG9yaXpvbnRhbFNwYW4pOwotCi0JCS8vIGFjdGl2aXR5RXhpdHN0YXRlCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYWN0aXZpdHlFeGl0U3RhdGUgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCBob3Jpem9udGFsU3Bhbik7Ci0KLQkJLy8gQ1JFQVRFIERFTElWRVJBQkxFIFNFQ1RJT04KLQkJY3JlYXRlRGVsaXZlcmFibGVTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0JCXRvZ2dsZVNlY3Rpb24oKTsKLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBlbGVtZW50KSB7Ci0JCVN0cmluZyBzdHIgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTm9uZTsgCi0JCWlmIChlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkgIT0gbnVsbCkgewotCQkJc3RyID0gZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiBzdHI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudFR5cGUoV29ya1Byb2R1Y3REZXNjcmlwdG9yIGVsZW1lbnQpIHsKLQkJU3RyaW5nIHN0ciA9IFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Ob25lOyAKLQkJaWYgKGVsZW1lbnQuZ2V0V29ya1Byb2R1Y3QoKSAhPSBudWxsKSB7Ci0JCQlzdHIgPSBlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkuZ2V0VHlwZSgpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiBzdHI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQlhY3Rpdml0eUVudHJ5U3RhdGUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCkpOwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZWxlbWVudCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGVsZW1lbnQuZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQlhY3Rpdml0eUVudHJ5U3RhdGUsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBTdHJVdGlsLmdldFBsYWluVGV4dChhY3Rpdml0eUVudHJ5U3RhdGUKLQkJCQkJCS5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKSwKLQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJYWN0aXZpdHlFbnRyeVN0YXRlLnNldFRleHQobmV3Q29udGVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWFjdGl2aXR5RXhpdFN0YXRlLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCkpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGVsZW1lbnQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBlbGVtZW50LmdldEFjdGl2aXR5RXhpdFN0YXRlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQlhY3Rpdml0eUV4aXRTdGF0ZSwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IFN0clV0aWwuZ2V0UGxhaW5UZXh0KGFjdGl2aXR5RXhpdFN0YXRlCi0JCQkJCQkuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSwKLQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJYWN0aXZpdHlFeGl0U3RhdGUuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF90YWJsZV8xLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApCi0JCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hZGRfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIoCi0JCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMpOyAvLyROT04tTkxTLTEkCi0JCQkJLy8gYmxvY2sgaXQncyBkZWxpdmVyYWJsZSBwYXJ0cwotCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlleGlzdGluZ0VsZW1lbnRzCi0JCQkJCQkuYWRkQWxsKFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCQkJCQkJLmdldERlbGl2ZXJhYmxlUGFydHMoKSkpOwotCQkJCS8vIGJsb2NrIGl0c2VsZgotCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkKFByb2Nlc3NVdGlsCi0JCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkpOwotCQkJCS8vIGFsc28gYmxvY2sgaXQncyBwYXJlbnQgd29yayBwcm9kdWN0cywgaWYgYW55Ci0JCQkJZXhpc3RpbmdFbGVtZW50cwotCQkJCQkJLmFkZEFsbCgoQ29sbGVjdGlvbikgZ2V0UGFyZW50V29ya1Byb2R1Y3RzKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpKTsKLQotCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJZmlsdGVyLCBlbGVtZW50LCBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTLAotCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUyk7Ci0JCQkJZmQub3BlbigpOwotCQkJCWFkZEl0ZW1zKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJdmlld2VyXzEucmVmcmVzaCgpOwotCi0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYWRkX3Byb2NfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUlM7Ci0JCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkQWxsKCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkJLmdldERlbGl2ZXJhYmxlUGFydHMoKSk7Ci0JCQkJZXhpc3RpbmdFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0KLQkJCQlleGlzdGluZ0VsZW1lbnRzCi0JCQkJCQkuYWRkQWxsKGdldFBhcmVudERlbGl2ZXJhYmxlcygoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KSk7Ci0JCQkJUHJvY2VzcyBwcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGVsZW1lbnQpOwotCi0JCQkJSUZpbHRlciBkZXNjcmlwdG9yRmlsdGVyID0gZ2V0RGVzY3JpcHRvckZpbHRlcigpOwotCQkJCWlmIChkZXNjcmlwdG9yRmlsdGVyICE9IG51bGwgJiYgcHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwgZGVzY3JpcHRvckZpbHRlciwgcHJvY2VzcywgdGFiTmFtZSwKLQkJCQkJCQlleGlzdGluZ0VsZW1lbnRzKTsKLQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCWZkLnNldFRpdGxlKHRhYk5hbWUpOwotCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCWFkZEZyb21Qcm9jZXNzSXRlbXMoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJdmlld2VyXzEucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9yZW1vdmVfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCXJlbW92ZUl0ZW1zKHJtSXRlbXMpOwotCQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0KLQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQl2aWV3ZXJfMS5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWxpbmtCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOyAvLyROT04tTkxTLTEkCi0JCQkJQ2xhc3Mgd29ya1Byb2R1Y3RUeXBlID0gbnVsbDsKLQkJCQlpZiAoZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpICE9IG51bGwpIHsKLQkJCQkJd29ya1Byb2R1Y3RUeXBlID0gZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpLmdldENsYXNzKCk7Ci0JCQkJfQotCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAoZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpICE9IG51bGwpIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSBlbGVtZW50LmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkKHdwKTsKLQkJCQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJCUxpc3Qgc3ViQXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZ2V0QWxsU3ViQXJ0aWZhY3RzKChBcnRpZmFjdCkgd3AsIHN1YkFydGlmYWN0cywKLQkJCQkJCQkJKChBcnRpZmFjdCkgd3ApLmdldENvbnRhaW5lZEFydGlmYWN0cygpKTsKLQkJCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkQWxsKHN1YkFydGlmYWN0cyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlMaXN0IGxpc3QgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmdldFNpYmxpbmdzKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBnZXRBZGFwdGVyKCksCi0JCQkJCQkJCWVsZW1lbnQpOwotCi0JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqOwotCQkJCQkJaWYgKCghd3BEZXNjLmVxdWFscyhlbGVtZW50KSkKLQkJCQkJCQkJJiYgKCF3cERlc2MuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSkgewotCQkJCQkJCVdvcmtQcm9kdWN0IHdwID0gd3BEZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0KLQkJCQkJCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCQkJCQlleGlzdGluZ0VsZW1lbnRzLmFkZCh3cCk7Ci0KLQkJCQkJCQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJCQkJCUxpc3Qgc3ViQXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQkJZ2V0QWxsU3ViQXJ0aWZhY3RzKChBcnRpZmFjdCkgd3AsCi0JCQkJCQkJCQkJCXN1YkFydGlmYWN0cywgKChBcnRpZmFjdCkgd3ApCi0JCQkJCQkJCQkJCQkJLmdldENvbnRhaW5lZEFydGlmYWN0cygpKTsKLQkJCQkJCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkQWxsKHN1YkFydGlmYWN0cyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc1NwZWNpZmljV29ya1Byb2R1Y3RGaWx0ZXIoCi0JCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIHRhYk5hbWUsIHdvcmtQcm9kdWN0VHlwZSk7Ci0KLQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWZpbHRlciwgZWxlbWVudCwgdGFiTmFtZSwgZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQkJZmQuc2V0VGl0bGUodGFiTmFtZSk7Ci0JCQkJZmQub3BlbigpOwotCQkJCXNldE1ldGhvZEVsZW1lbnQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQotCQkJCS8vIHVwZGF0ZSBtZXRob2QgZWxlbWVudCBjb250cm9sCi0JCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUxKSB7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRBbGxTdWJBcnRpZmFjdHMoQXJ0aWZhY3QgYXJ0aWZhY3QsIExpc3Qgc3ViQXJ0aWZhY3RzLAotCQkJTGlzdCBjb250YWluZWRBcnRpZmFjdHMpIHsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY29udGFpbmVkQXJ0aWZhY3RzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJaWYgKCFzdWJBcnRpZmFjdHMuY29udGFpbnMob2JqKSkKLQkJCQkJc3ViQXJ0aWZhY3RzLmFkZChvYmopOwotCQkJCWdldEFsbFN1YkFydGlmYWN0cygoQXJ0aWZhY3QpIG9iaiwgc3ViQXJ0aWZhY3RzLAotCQkJCQkJKChBcnRpZmFjdCkgb2JqKS5nZXRDb250YWluZWRBcnRpZmFjdHMoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQlhY3Rpdml0eUVudHJ5U3RhdGUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlhY3Rpdml0eUV4aXRTdGF0ZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWxpbmtCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWFjdGl2aXR5RW50cnlTdGF0ZS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJYWN0aXZpdHlFeGl0U3RhdGUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJaWYgKGN0cmxfYWRkXzEgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF9wcm9jXzEgIT0gbnVsbCkKLQkJCWN0cmxfYWRkX3Byb2NfMS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfcmVtb3ZlXzEgIT0gbnVsbCkKLQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQllbGVtZW50ID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJLy8gTW9kZWwgTW9kaWZ5IGxpc3RlbmVyIGZvciBhY3Rpdml0eSBlbnRyeSBzdGF0ZSBhbmQgYWN0aXZpdHkKLQkJCQkvLyBleGl0IHN0YXRlCi0JCQkJaWYgKHdwTW9kZWxNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCWFjdGl2aXR5RW50cnlTdGF0ZQotCQkJCQkJCS5yZW1vdmVNb2RpZnlMaXN0ZW5lcih3cE1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlhY3Rpdml0eUV4aXRTdGF0ZQotCQkJCQkJCS5yZW1vdmVNb2RpZnlMaXN0ZW5lcih3cE1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJfQotCi0JCQkJd3BNb2RlbE1vZGlmeUxpc3RlbmVyID0gZ2V0RWRpdG9yKCkuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoCi0JCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KTsKLQotCQkJCWlmICh3cE1vZGVsTW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgd3BNb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHdwTW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQl9Ci0KLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJCWN0cmxfd29ya1Byb2R1Y3RfdHlwZS5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnRUeXBlKGVsZW1lbnQpKTsKLQkJCQlhY3Rpdml0eUVudHJ5U3RhdGUuc2V0VGV4dChlbGVtZW50LmdldEFjdGl2aXR5RW50cnlTdGF0ZSgpKTsKLQkJCQlhY3Rpdml0eUV4aXRTdGF0ZS5zZXRUZXh0KGVsZW1lbnQuZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKSk7Ci0KLQkJCQlpZiAod3BNb2RlbE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHdwTW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZShmYWxzZSk7Ci0JCQkJfQotCi0JCQkJYWN0aXZpdHlFbnRyeVN0YXRlLmFkZE1vZGlmeUxpc3RlbmVyKHdwTW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJYWN0aXZpdHlFeGl0U3RhdGUuYWRkTW9kaWZ5TGlzdGVuZXIod3BNb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCWlmICh2aWV3ZXJfMSAhPSBudWxsKSB7Ci0JCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQkJCQl9Ci0KLQkJCQkvLyBoaWRlL3Nob3cgY2VydGFpbiBzZWN0aW9ucy4KLQkJCQl0b2dnbGVTZWN0aW9uKCk7Ci0KLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGdlbmVyYWwgc2VjdGlvbiA6ICIgKyBlbGVtZW50LCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJdGVtcyhMaXN0IGl0ZW1zKSB7Ci0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlMaXN0IHdwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpCi0JCQkJCQkmJiAoIWlzUGFydE9mRGVsaXZlcmFibGUoKFdvcmtQcm9kdWN0KSBvYmosCi0JCQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpKSkgewotCQkJCQl3cHMuYWRkKChXb3JrUHJvZHVjdCkgb2JqKTsKLQotCQkJCX0KLQkJCX0KLQkJCWlmICghd3BzLmlzRW1wdHkoKSkgewotCQkJCUFzc2lnbldQVG9EZWxpdmVyYWJsZSBjbWQgPSBuZXcgQXNzaWduV1BUb0RlbGl2ZXJhYmxlKAotCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCwgd3BzKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JCXZpZXdlcl8xLnJlZnJlc2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXREZXNjcmlwdG9yRmlsdGVyKCkgewotCi0JCXJldHVybiBuZXcgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZ2V0QWN0aXZpdGllc0luU2NvcGUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZWxlbWVudCwgbGlzdCk7Ci0JCQkJCWlmIChsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMoTGlzdCBpdGVtcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCQkJaWYgKCFpc1BhcnRPZkRlbGl2ZXJhYmxlKHdwLAotCQkJCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KSkgewotCQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCk7Ci0JCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwKLQkJCQkJCQkJCQkJd3BEZXNjLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwKLQkJCQkJCQkJCQlvYmosIC0xKTsKLQkJCQkJCQotCQkJCQl9IGVsc2UgewotCQkJCQkJTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfRGVsaXZlcmFibGVBc3NpZ25FcnJvcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7Ci0JCQkJCQkJCSgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmopLmdldE5hbWUoKSwKLQkJCQkJCQkJKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE5hbWUoKSB9OwotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlJbmZvKAotCQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlLCBtZi5mb3JtYXQoYXJncykpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVJdGVtcyhMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBpdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCksCi0JCQkJCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmosIC0xKTsKLQkJCQl9Ci0KLQkJCQkvLyBmaW5kIG1hdGNoaW5nIGRlbGl2ZXJhYmxlIHBhcnRzCi0JCQkJT2JqZWN0IHdwRGVzYyA9IGZpbmREZWxpdmVyYWJsZVBhcnRzKChPYmplY3QpIG9iaik7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLAotCQkJCQkJd3BEZXNjLCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBmaW5kRGVsaXZlcmFibGVQYXJ0cyhPYmplY3Qgb2JqKSB7Ci0JCUxpc3QgcGFydHMgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0RGVsaXZlcmFibGVQYXJ0cygpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHBhcnRzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0b3JPYmplY3QgPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoaXRvck9iamVjdCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQlPYmplY3Qgb2JqV1AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlPYmplY3QgaXRvcldQID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0b3JPYmplY3QpCi0JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCWlmIChvYmpXUC5lcXVhbHMoaXRvcldQKSkgewotCQkJCQkJcmV0dXJuIGl0b3JPYmplY3Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHBhcmVudCBwcm9jZXNzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9jZXNzKEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3MpKSB7Ci0JCQlickVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50OwotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBkZWxpdmVyYWJsZXMKLQkgKiAKLQkgKiBAcGFyYW0gYnJFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRQYXJlbnREZWxpdmVyYWJsZXMoQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQpIHsKLQkJTGlzdCBwYXJlbnREZWxpdmVyYWJsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgcGFyZW50OwotCQkJCWlmICh3cGRlc2MuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCXBhcmVudERlbGl2ZXJhYmxlcy5hZGQod3BkZXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KGJyRWxlbWVudCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudERlbGl2ZXJhYmxlczsKLQl9Ci0JLyoqCi0JICogRmluZCBhbGwgc2libGluZyB3b3JrIHByb2R1Y3RzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0UGFyZW50V29ya1Byb2R1Y3RzKEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUhhc2hTZXQgd29ya1Byb2R1Y3RzID0gbmV3IEhhc2hTZXQoKTsKLQotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQlickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCWJyRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQ7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHBhcmVudDsKLQkJCQlpZiAod3BkZXNjLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQl3b3JrUHJvZHVjdHMuYWRkKHdwZGVzYy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KGJyRWxlbWVudCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCX0KLQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUxpc3QgYnJFbGVtZW50cyA9ICgoQWN0aXZpdHkpIHBhcmVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGJyRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlpZiAod3AgIT0gbnVsbCkKLQkJCQkJCXdvcmtQcm9kdWN0cy5hZGQod3ApOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gd29ya1Byb2R1Y3RzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNnZXROYW1lUHJlZml4KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1ldGhvZEVsZW1lbnQoTGlzdCBpdGVtcykgewotCQlpZiAoKGl0ZW1zICE9IG51bGwpICYmIChpdGVtcy5zaXplKCkgPj0gMSkpIHsKLQkJCWlmIChpdGVtcy5nZXQoMCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBpdGVtcy5nZXQoMCk7Ci0KLQkJCQlMaXN0IGxpc3QgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmdldFNpYmxpbmdzKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBnZXRBZGFwdGVyKCksCi0JCQkJCQkJCWVsZW1lbnQpOwotCQkJCWJvb2xlYW4gY2FuQXNzaWduID0gdHJ1ZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmo7Ci0JCQkJCQlpZiAoKCF3cERlc2MuZXF1YWxzKGVsZW1lbnQpKQotCQkJCQkJCQkmJiAoIXdwRGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0JCQkJCQkJV29ya1Byb2R1Y3QgZXhpc2luZ1dQID0gd3BEZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCQkJaWYgKHdwLmVxdWFscyhleGlzaW5nV1ApKSB7Ci0JCQkJCQkJCWNhbkFzc2lnbiA9IGZhbHNlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGNhbkFzc2lnbikgewotCQkJCQlMaW5rTWV0aG9kRWxlbWVudENvbW1hbmQgY21kID0gbmV3IExpbmtNZXRob2RFbGVtZW50Q29tbWFuZCgKLQkJCQkJCQllbGVtZW50LCB3cCwKLQkJCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QpOwotCQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCi0JCQkJCS8vIHNldCBzZWxlY3Rpb24gdG8gc2FtZSBlbGVtZW50IHRvIGVuYWJsZSBjb3JyZWN0IGFjdGlvbnMKLQkJCQkJZ2V0RWRpdG9yKCkuc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJT2JqZWN0W10gYXJncyA9IHsgd3AuZ2V0TmFtZSgpIH07Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlLCBtZi5mb3JtYXQoYXJncykpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFydE9mRGVsaXZlcmFibGUoV29ya1Byb2R1Y3Qgd3AsCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUpIHsKLQotCQlMaXN0IGRlbGl2ZXJhYmxlUGFydHMgPSBQcm9jZXNzVXRpbAotCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoZGVsaXZlcmFibGUuZ2V0RGVsaXZlcmFibGVQYXJ0cygpKTsKLQkJaWYgKGRlbGl2ZXJhYmxlUGFydHMuY29udGFpbnMod3ApKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDdhYTdjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0YWJiZWQgcGFnZXMgZm9yIHRoZSBicmVha2Rvd24gZWxlbWVudHMgUHJvcGVydGllcyB2aWV3LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzY5ZmQwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGUgbGFiZWwgcHJvdmlkZXIgZm9yIHRoZSBDb25maWd1cmF0aW9uIHZpZXcgdHJlZSwKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbG9yUHJvdmlkZXIgewotCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQotCXB1YmxpYyBDb25maWd1cmF0aW9uTGFiZWxQcm92aWRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBJTGFiZWxQcm92aWRlcn0uZ2V0SW1hZ2UgYnkgZm9yd2FyZGluZyBpdCB0byBhbgotCSAqIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSUl0ZW1MYWJlbFByb3ZpZGVyI2dldEltYWdlIElJdGVtTGFiZWxQcm92aWRlci5nZXRJbWFnZX0KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQkvLyBieSBkZWZhdWx0LCByZXR1cm4gdGhlIGRlZmF1bHQgaW1hZ2UKLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBJTGFiZWxQcm92aWRlcn0uZ2V0VGV4dCBieSBmb3J3YXJkaW5nIGl0IHRvIGFuCi0JICogb2JqZWN0IHRoYXQgaW1wbGVtZW50cwotCSAqIHtAbGluayBJSXRlbUxhYmVsUHJvdmlkZXIjZ2V0VGV4dCBJSXRlbUxhYmVsUHJvdmlkZXIuZ2V0VGV4dH0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqZWN0LCBjb25maWcpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJbmFtZSA9IFByb2Nlc3NVdGlsCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCW5hbWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5hbWUpKSB7Ci0JCQkJLy8gdHJ5IHRvIGdldCBuYW1lIG9uIHRoZSBvYmplY3QgaXRzZWxmLgotCQkJCW5hbWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCk7Ci0JCQl9Ci0JCQkvLyBuYW1lID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXROYW1lKChNZXRob2RFbGVtZW50KW9iamVjdCwKLQkJCS8vIGNvbmZpZyk7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSAoKEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJLmdldFZhbHVlKCk7Ci0JCQluYW1lID0gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQpOwotCQkJaWYgKFN0clV0aWwuaXNCbGFuayhuYW1lKSkgewotCQkJCW5hbWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUob2JqZWN0KTsKLQkJCX0KLQotCQl9Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCW5hbWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoVG5nVXRpbC51bndyYXAob2JqZWN0KSk7Ci0JCX0KLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJbmFtZSA9IHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQkJfQotCi0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNvbmZpZyA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXIjZ2V0Rm9yZWdyb3VuZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChpc1N1cHByZXNzZWQoZWxlbWVudCkpIHsKLQkJCXJldHVybiBDb2xvcnMuU1VQUkVTU0VEX0VMRU1FTlRfTEFCRUw7Ci0JCX0KLQkJZWxzZSBpZiAoaXNFeHRlcm5hbChlbGVtZW50KSkgewotCQkJcmV0dXJuIENvbG9ycy5JTkhFUklURURfRUxFTUVOVF9MQUJFTDsKLQkJfQotCQlyZXR1cm4gQ29sb3JDb25zdGFudHMubGlzdEZvcmVncm91bmQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU3VwcHJlc3NlZChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KTsKLQkJCWlmKHByb2MgIT0gbnVsbCkgewotCQkJCXJldHVybiBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKS5pc1N1cHByZXNzZWQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlPYmplY3QgdG9wID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRUb3BJdGVtKCk7Ci0JCQlpZih0b3AgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHsKLQkJCQlyZXR1cm4gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24oKFByb2Nlc3MpIHRvcCkuaXNTdXBwcmVzc2VkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXIjZ2V0QmFja2dyb3VuZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0JCS8vIGxldCBPUyB0YWtlIGNvbnRyb2wgb3ZlciB0cmVlIHdpZGdldCBiYWNrZ3JvdW5kCi0JCS8vIHJhdGhlciB0aGFuIHNlbmRpbmcgb25lIGZpeGVkIGJhY2tncm91bmQuCi0JCXJldHVybiBudWxsOy8vQ29sb3JDb25zdGFudHMubGlzdEJhY2tncm91bmQ7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyI2lzRXh0ZXJuYWwoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChlbGVtZW50KSB8fCBQcm9jZXNzVXRpbC5pc0NvbnRyaWJ1dGVkKGVsZW1lbnQpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlciNnZXRGb250KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEZvbnQgZ2V0Rm9udChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoUHJvY2Vzc1V0aWwuaXNJbmhlcml0ZWQoZWxlbWVudCkpIHsKLQkJCXJldHVybiBpdGFsaWNGb250OwotCQl9Ci0JCWVsc2UgaWYoUHJvY2Vzc1V0aWwuaXNDb250cmlidXRlZChlbGVtZW50KSkgewotCQkJcmV0dXJuIGJvbGRJdGFsaWNGb250OwotCQl9Ci0JCXJldHVybiByZWd1bGFyRm9udDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0VkaXRvclBhZ2VFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0VkaXRvclBhZ2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmMjFmNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9FZGl0b3JQYWdlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogTW9kZWxzIGEgPGVkaXRvclBhZ2U+IGVsZW1lbnQgaW4gdGhlICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkVkaXRvclBhZ2VQcm92aWRlciIKLSAqIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVkaXRvclBhZ2VFbGVtZW50IHsKLQotCS8vIHBsdWdpbiBidW5kbGUKLQlCdW5kbGUgYnVuZGxlOwotCQotCS8vIFRoZSBwYWdlIElELgotCXByaXZhdGUgU3RyaW5nIGlkOwotCQotCS8vIFRoZSBwYWdlIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8vIFRoZSBjb250cmlidXRvciBjbGFzcyBmb3IgdGhlIHBhZ2UuCi0JcHJpdmF0ZSBTdHJpbmcgY29udHJpYnV0b3JDbGFzczsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiAJCQkgIEluc3RhbGxlZCBCdW5kbGUKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIFRoZSBwYWdlIElELgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgcGFnZSBuYW1lLiAgICAgICAgICAgIAotCSAqIEBwYXJhbSBjb250cmlidXRvckNsYXNzCi0JICogICAgICAgICAgICBUaGUgcGFnZSBjb250cmlidXRvciBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgRWRpdG9yUGFnZUVsZW1lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRyaWJ1dG9yQ2xhc3MpIHsKLQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5jb250cmlidXRvckNsYXNzID0gY29udHJpYnV0b3JDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWdlIElELgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHBhZ2UgSUQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWdlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBUaGUgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFnZSBjb250cmlidXRvciBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwYWdlIGNvbnRyaWJ1dG9yIGNsYXNzLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29udHJpYnV0b3JDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJQ2xhc3MgY2xhenogPSBidW5kbGUubG9hZENsYXNzKGNvbnRyaWJ1dG9yQ2xhc3MpOwotCQlyZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsJCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9FeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjMDE2NDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9FeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcwotCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElWaWV3ZXJQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWRpdG9yUGFnZVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVkaXRvclBhZ2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3N2MwMjRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWRpdG9yUGFnZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSA8ZWRpdG9yUGFnZT4gZWxlbWVudHMgZGVmaW5lZCB2aWEgdGhlCi0gKiAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5FZGl0b3JQYWdlUHJvdmlkZXIiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVkaXRvclBhZ2VQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUgPSAiVGFza0VkaXRvclBhZ2VQcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gQXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfSUQgPSAiaWQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9OQU1FID0gIm5hbWUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9DTEFTUyA9ICJjbGFzcyI7Ci0KLQkvLyBDb250YWlucyB0aGUgZWRpdG9yIHBhZ2UgcHJvdmlkZXJzIGxvYWRlZCB2aWEgdGhlCi0JLy8gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuTWV0aG9kRWRpdG9yUGFnZVByb3ZpZGVyIiBleHRlbnNpb24gcG9pbnQuCi0JcHJpdmF0ZSBBcnJheUxpc3QgcGFnZVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vCSBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIE1ldGhvZEVkaXRvclBhZ2VQcm92aWRlciBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RFZGl0b3JQYWdlUHJvdmlkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKE1ldGhvZEVkaXRvclBhZ2VQcm92aWRlci5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IE1ldGhvZEVkaXRvclBhZ2VQcm92aWRlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE1ldGhvZEVkaXRvclBhZ2VQcm92aWRlcigpIHsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBwYWdlIHByb3ZpZGVycwotCSAqIAotCSAqIEByZXR1cm4gYWxsIHRoZSBwYWdlIHByb3ZpZGVycy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQYWdlUHJvdmlkZXJzKCkgewotCQlMaXN0IHBhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VQcm92aWRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUVkaXRvclBhZ2VFbGVtZW50IHBhZ2VFbGVtZW50ID0gKEVkaXRvclBhZ2VFbGVtZW50KSBwYWdlUHJvdmlkZXJzCi0JCQkJCS5nZXQoaSk7Ci0JCQlPYmplY3QgY29udHJpYnV0b3JDbGFzcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNvbnRyaWJ1dG9yQ2xhc3MgPSBwYWdlRWxlbWVudC5nZXRDb250cmlidXRvckNsYXNzKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQkJcGFnZXMuYWRkKGNvbnRyaWJ1dG9yQ2xhc3MpOwotCQl9Ci0JCXJldHVybiBwYWdlczsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgY29uZmlndXJhdGlvbiBwcm92aWRlcnMgc3BlY2lmaWVkIHZpYSB0aGUKLQkgKiAiY29tLmlibS5wcm9jZXNzLnBhZ2VQcm92aWRlcnMiIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkUHJvdmlkZXJzKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlQQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRVNQQUNFLAotCQkJCVBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0KLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9JRCk7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShQQUdFX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX05BTUUpOwotCQkJCQkJU3RyaW5nIGNvbnRyaWJ1dG9yQ2xhc3MgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJRWRpdG9yUGFnZUVsZW1lbnQgcGFnZUVsZW1lbnQgPSBuZXcgRWRpdG9yUGFnZUVsZW1lbnQoCi0JCQkJCQkJCWJ1bmRsZSwgaWQsIG5hbWUsIGNvbnRyaWJ1dG9yQ2xhc3MpOwotCQkJCQkJcGFnZVByb3ZpZGVycy5hZGQocGFnZUVsZW1lbnQpOwotCQkJCQkJCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkJCSJGYWlsZWQgdG8gbG9hZCBFZGl0b3IgUGFnZSBQcm92aWRlciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTM0MGU1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIExhYmVsIGRlY29yYXRvciBmb3IgbWV0aG9kIGVsZW1lbnQKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3IgaW1wbGVtZW50cyBJTGFiZWxEZWNvcmF0b3IgewotCXByaXZhdGUgc3RhdGljIElMYWJlbERlY29yYXRvciBkZWxlZ2F0ZURlY29yYXRvcjsKLQkKLQlwcml2YXRlIHN0YXRpYyBJTGFiZWxEZWNvcmF0b3IgZ2V0RGVsZWdhdGVEZWNvcmF0b3IoKSB7Ci0JCWlmIChkZWxlZ2F0ZURlY29yYXRvciA9PSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZURlY29yYXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlRGVjb3JhdG9yOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJUmVzb3VyY2UgZ2V0V29ya3NwYWNlUmVzb3VyY2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkvLyBkb24ndCBkZWNvcmF0ZSBpY29uIG9mIHByZWRlZmluZWQgZWxlbWVudHMgaW4gbGlicmFyeSB2aWV3IGIvYyBzb21lIG9mIHRoZW0gYXJlIHNob3duIGFzIFVJIGZvbGRlcgotCQkvLwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBUbmdVdGlsLmlzUHJlZGVmaW5lZCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBQZXJzaXN0ZW5jZVV0aWwuZ2V0V29ya3NwYWNlUmVzb3VyY2UoZWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3IoKSB7Ci0JCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3IjZGVjb3JhdGVJbWFnZShvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGRlY29yYXRlSW1hZ2UoSW1hZ2UgaW1hZ2UsIE9iamVjdCBlbGVtZW50KSB7CQkKLQkJSVJlc291cmNlIHdzUmVzID0gZ2V0V29ya3NwYWNlUmVzb3VyY2UoZWxlbWVudCk7Ci0JCWlmKHdzUmVzICE9IG51bGwpIHsKLQkJCWltYWdlID0gZ2V0RGVsZWdhdGVEZWNvcmF0b3IoKS5kZWNvcmF0ZUltYWdlKGltYWdlLCB3c1Jlcyk7Ci0JCX0KLQkJcmV0dXJuIGdldERlbGVnYXRlRGVjb3JhdG9yKCkuZGVjb3JhdGVJbWFnZShpbWFnZSwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvciNkZWNvcmF0ZVRleHQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGRlY29yYXRlVGV4dChTdHJpbmcgdGV4dCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXREZWxlZ2F0ZURlY29yYXRvcigpLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlJUmVzb3VyY2Ugd3NSZXMgPSBnZXRXb3Jrc3BhY2VSZXNvdXJjZShlbGVtZW50KTsKLQkJaWYod3NSZXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlRGVjb3JhdG9yKCkuaXNMYWJlbFByb3BlcnR5KHdzUmVzLCBwcm9wZXJ0eSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZ2V0RGVsZWdhdGVEZWNvcmF0b3IoKS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0NDY3YTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciBpbXBsZW1lbnRzCi0JCUlMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3Igb3ZlcmxheSA9IG51bGw7Ci0JCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUNPUkFUT1JfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IiOwotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciNkZWNvcmF0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWNvcmF0ZShPYmplY3QgZWxlbWVudCwgSURlY29yYXRpb24gZGVjb3JhdGlvbikgewotCQl0cnkgewotCQkJaWYoTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuaXNJbnZhbGlkKGVsZW1lbnQpIHx8Ci0JCQkJCU1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyLmlzSW52YWxpZChlbGVtZW50KSkgewotCQkJCWRlY29yYXRpb24uYWRkT3ZlcmxheShnZXRFcnJvck92ZXJsYXkoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0JCi0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEVycm9yT3ZlcmxheSgpIHsKLQkJaWYob3ZlcmxheSA9PSBudWxsKSB7Ci0JCQlvdmVybGF5ID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmIik7Ci0JCX0KLQkJcmV0dXJuIG92ZXJsYXk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRVSUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyN2RiZTQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LkphdmFVSUxhYmVsUHJvdmlkZXIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKLQkKLQlwcm90ZWN0ZWQgTGlzdGVuZXJMaXN0IGZMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JCi0JSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCi0JcHJpdmF0ZSBBcnJheUxpc3Q8SUxhYmVsRGVjb3JhdG9yPiBmTGFiZWxEZWNvcmF0b3JzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsYWJlbCBwcm92aWRlciB3aXRoIGRlZmF1bHQgZmxhZ3MuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRVSUxhYmVsUHJvdmlkZXIoKSB7Ci0JCWZMYWJlbERlY29yYXRvcnM9IG51bGw7IAotCX0KLQkKLQkvKioKLQkgKiBBZGRzIGEgZGVjb3JhdG9yIHRvIHRoZSBsYWJlbCBwcm92aWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExhYmVsRGVjb3JhdG9yKElMYWJlbERlY29yYXRvciBkZWNvcmF0b3IpIHsKLQkJaWYgKGZMYWJlbERlY29yYXRvcnMgPT0gbnVsbCkgewotCQkJZkxhYmVsRGVjb3JhdG9ycz0gbmV3IEFycmF5TGlzdDxJTGFiZWxEZWNvcmF0b3I+KDIpOwotCQl9Ci0JCWZMYWJlbERlY29yYXRvcnMuYWRkKGRlY29yYXRvcik7Ci0JfQotCQotCXByb3RlY3RlZCBJbWFnZSBkZWNvcmF0ZUltYWdlKEltYWdlIGltYWdlLCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZkxhYmVsRGVjb3JhdG9ycyAhPSBudWxsICYmIGltYWdlICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmTGFiZWxEZWNvcmF0b3JzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcj0gKElMYWJlbERlY29yYXRvcikgZkxhYmVsRGVjb3JhdG9ycy5nZXQoaSk7Ci0JCQkJaW1hZ2U9IGRlY29yYXRvci5kZWNvcmF0ZUltYWdlKGltYWdlLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSW1hZ2UgcmVzdWx0PSBmTGFiZWxQcm92aWRlci5nZXRJbWFnZShlbGVtZW50KTsKLQkJcmV0dXJuIGRlY29yYXRlSW1hZ2UocmVzdWx0LCBlbGVtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29yYXRlVGV4dChTdHJpbmcgdGV4dCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGZMYWJlbERlY29yYXRvcnMgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZMYWJlbERlY29yYXRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yPSAoSUxhYmVsRGVjb3JhdG9yKSBmTGFiZWxEZWNvcmF0b3JzLmdldChpKTsKLQkJCQl0ZXh0PSBkZWNvcmF0b3IuZGVjb3JhdGVUZXh0KHRleHQsIGVsZW1lbnQpOwotCQkJfQotCQl9CQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldFRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHJlc3VsdD0gZkxhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJcmV0dXJuIGRlY29yYXRlVGV4dChyZXN1bHQsIGVsZW1lbnQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZMYWJlbERlY29yYXRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZMYWJlbERlY29yYXRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yPSAoSUxhYmVsRGVjb3JhdG9yKSBmTGFiZWxEZWNvcmF0b3JzLmdldChpKTsKLQkJCQlkZWNvcmF0b3IuZGlzcG9zZSgpOwotCQkJfQotCQkJZkxhYmVsRGVjb3JhdG9ycz0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmTGFiZWxEZWNvcmF0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmTGFiZWxEZWNvcmF0b3JzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcj0gKElMYWJlbERlY29yYXRvcikgZkxhYmVsRGVjb3JhdG9ycy5nZXQoaSk7Ci0JCQkJZGVjb3JhdG9yLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQlmTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoT2JqZWN0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIHRydWU7CQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZMYWJlbERlY29yYXRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZMYWJlbERlY29yYXRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yPSAoSUxhYmVsRGVjb3JhdG9yKSBmTGFiZWxEZWNvcmF0b3JzLmdldChpKTsKLQkJCQlkZWNvcmF0b3IucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCWZMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUxhYmVsRGVjb3JhdG9yW10gZ2V0RGVjb3JhdG9ycyhib29sZWFuIGVycm9ydGljaywgSUxhYmVsRGVjb3JhdG9yIGV4dHJhKSB7Ci0JCWlmIChlcnJvcnRpY2spIHsKLQkJCWlmIChleHRyYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBJTGFiZWxEZWNvcmF0b3JbXSB7fTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBJTGFiZWxEZWNvcmF0b3JbXSB7IGV4dHJhIH07Ci0JCQl9Ci0JCX0KLQkJaWYgKGV4dHJhICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgSUxhYmVsRGVjb3JhdG9yW10geyBleHRyYSB9OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBGaXJlcyBhIGxhYmVsIHByb3ZpZGVyIGNoYW5nZWQgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCi0gICAgICogT25seSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYXJlIG5vdGlmaWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50IGEgbGFiZWwgcHJvdmlkZXIgY2hhbmdlZCBldmVudAotICAgICAqCi0gICAgICogQHNlZSBJTGFiZWxQcm92aWRlckxpc3RlbmVyI2xhYmVsUHJvdmlkZXJDaGFuZ2VkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKGZpbmFsIExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgT2JqZWN0W10gbGlzdGVuZXJzID0gZkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGZpbmFsIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbCA9IChJTGFiZWxQcm92aWRlckxpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0gICAgICAgICAgICBTYWZlUnVubmVyLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgbC5sYWJlbFByb3ZpZGVyQ2hhbmdlZChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvUHJvYmxlbXNMYWJlbERlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1NmVhOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbC5JUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsLkltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwuSW1hZ2VJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbC5NZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLQotLyoqCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LnVpLlByb2JsZW1zTGFiZWxEZWNvcmF0b3IgCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJvYmxlbXNMYWJlbERlY29yYXRvciBpbXBsZW1lbnRzIElMYWJlbERlY29yYXRvciwgSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IgewotCQotCS8qKgotCSAqIFRoaXMgaXMgYSBzcGVjaWFsIDxjb2RlPkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ8L2NvZGU+IGNhcnJ5aW5nIGFkZGl0aW9uYWwgCi0JICogaW5mb3JtYXRpb24gd2hldGhlciB0aGUgZXZlbnQgb3JpZ2lucyBmcm9tIGEgbWFrZXIgY2hhbmdlLgotCSAqIDxwPgotCSAqIDxjb2RlPlByb2JsZW1zTGFiZWxDaGFuZ2VkRXZlbnQ8L2NvZGU+cyBhcmUgb25seSBnZW5lcmF0ZWQgYnkgPGNvZGU+Ci0JICogUHJvYmxlbXNMYWJlbERlY29yYXRvcjwvY29kZT5zLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByb2JsZW1zTGFiZWxDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IHsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQ9IDFMOwotCQkKLQkJcHJpdmF0ZSBib29sZWFuIGZNYXJrZXJDaGFuZ2U7Ci0KLQkJLyoqCi0JCSAqIE5vdGU6IFRoaXMgY29uc3RydWN0b3IgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIGNvbnN0cnVjdG9yLgotCQkgKiAKLQkJICogQHBhcmFtIGV2ZW50U291cmNlIHRoZSBiYXNlIGxhYmVsIHByb3ZpZGVyCi0JCSAqIEBwYXJhbSBjaGFuZ2VkUmVzb3VyY2UgdGhlIGNoYW5nZWQgcmVzb3VyY2VzCi0JCSAqIEBwYXJhbSBpc01hcmtlckNoYW5nZSA8Y29kZT50cnVlPGNvZGU+IGlmIHRoZSBjaGFuZ2UgaXMgYSBtYXJrZXIgY2hhbmdlOyBvdGhlcndpc2UKLQkJICogIDxjb2RlPmZhbHNlPC9jb2RlPiAKLQkJICovCi0JCXB1YmxpYyBQcm9ibGVtc0xhYmVsQ2hhbmdlZEV2ZW50KElCYXNlTGFiZWxQcm92aWRlciBldmVudFNvdXJjZSwgSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlLCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKSB7Ci0JCQlzdXBlcihldmVudFNvdXJjZSwgY2hhbmdlZFJlc291cmNlKTsKLQkJCWZNYXJrZXJDaGFuZ2U9IGlzTWFya2VyQ2hhbmdlOwotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZXZlbnQgb3JpZ2lucyBmcm9tIG1hcmtlciBjaGFuZ2VzLiBJZiA8Y29kZT5mYWxzZTwvY29kZT4gYW4gYW5ub3RhdGlvbiAKLQkJICogbW9kZWwgY2hhbmdlIGlzIHRoZSBvcmlnaW4uIEluIHRoaXMgY2FzZSB2aWV3ZXJzIG5vdCBkaXNwbGF5aW5nIHdvcmtpbmcgY29waWVzIGNhbiBpZ25vcmUgdGhlc2UgCi0JCSAqIGV2ZW50cy4KLQkJICogCi0JCSAqIEByZXR1cm4gaWYgdGhpcyBldmVudCBvcmlnaW5zIGZyb20gYSBtYXJrZXIgY2hhbmdlLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNNYXJrZXJDaGFuZ2UoKSB7Ci0JCQlyZXR1cm4gZk1hcmtlckNoYW5nZTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVSUk9SVElDS19FUlJPUj0gTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUjsJCi0KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IGZSZWdpc3RyeTsKLQlwcml2YXRlIGJvb2xlYW4gZlVzZU5ld1JlZ2lzdHJ5PSBmYWxzZTsKLQlwcml2YXRlIElQcm9ibGVtQ2hhbmdlZExpc3RlbmVyIGZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyOwotCQotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGZMaXN0ZW5lcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByb2JsZW1zTGFiZWxEZWNvcmF0b3I8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBQcm9ibGVtc0xhYmVsRGVjb3JhdG9yKCkgewotCQl0aGlzKG51bGwpOwotCQlmVXNlTmV3UmVnaXN0cnk9IHRydWU7Ci0JfQotCQotCS8qKgotCSAqIE5vdGU6IFRoaXMgY29uc3RydWN0b3IgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSByZWdpc3RyeSBUaGUgcmVnaXN0cnkgdG8gdXNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgSmF2YSBwbHVnaW4ncwotCSAqICBpbWFnZSByZWdpc3RyeQotCSAqLwotCXB1YmxpYyBQcm9ibGVtc0xhYmVsRGVjb3JhdG9yKEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCWZSZWdpc3RyeT0gcmVnaXN0cnk7Ci0JCWZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCkgewotCQlpZiAoZlJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWZSZWdpc3RyeT0gZlVzZU5ld1JlZ2lzdHJ5ID8gbmV3IEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgOiBBdXRob3JpbmdVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBmUmVnaXN0cnk7Ci0JfQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUxhYmVsRGVjb3JhdG9yI2RlY29yYXRlVGV4dChTdHJpbmcsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGRlY29yYXRlVGV4dChTdHJpbmcgdGV4dCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElMYWJlbERlY29yYXRvciNkZWNvcmF0ZUltYWdlKEltYWdlLCBPYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGRlY29yYXRlSW1hZ2UoSW1hZ2UgaW1hZ2UsIE9iamVjdCBvYmopIHsKLQkJaW50IGFkb3JubWVudEZsYWdzPSBjb21wdXRlQWRvcm5tZW50RmxhZ3Mob2JqKTsKLQkJaWYgKGFkb3JubWVudEZsYWdzICE9IDApIHsKLQkJCUltYWdlRGVzY3JpcHRvciBiYXNlSW1hZ2U9IG5ldyBJbWFnZUltYWdlRGVzY3JpcHRvcihpbWFnZSk7Ci0JCQlSZWN0YW5nbGUgYm91bmRzPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJCXJldHVybiBnZXRSZWdpc3RyeSgpLmdldChuZXcgTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvcihiYXNlSW1hZ2UsIGFkb3JubWVudEZsYWdzLCBuZXcgUG9pbnQoYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KSkpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBvYmogdGhlIGVsZW1lbnQgdG8gY29tcHV0ZSB0aGUgZmxhZ3MgZm9yCi0JICogCi0JICogQHJldHVybiB0aGUgYWRvcm5tZW50IGZsYWdzCi0JICovCi0JcHJvdGVjdGVkIGludCBjb21wdXRlQWRvcm5tZW50RmxhZ3MoT2JqZWN0IG9iaikgewotCQl0cnkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0RXJyb3JUaWNrc0Zyb21NYXJrZXJzKFBlcnNpc3RlbmNlVXRpbC5nZXRXb3Jrc3BhY2VSZXNvdXJjZShvYmopLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlyZXR1cm4gZ2V0RXJyb3JUaWNrc0Zyb21NYXJrZXJzKChJUmVzb3VyY2UpIG9iaiwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gSVJlc291cmNlU3RhdHVzLk1BUktFUl9OT1RfRk9VTkQpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCQotCQkJQXV0aG9yaW5nVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXByaXZhdGUgaW50IGdldEVycm9yVGlja3NGcm9tTWFya2VycyhJUmVzb3VyY2UgcmVzLCBpbnQgZGVwdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHJlcyA9PSBudWxsIHx8ICFyZXMuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWludCBpbmZvPSAwOwotCQkKLQkJSU1hcmtlcltdIG1hcmtlcnM9IHJlcy5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsIGRlcHRoKTsKLQkJaWYgKG1hcmtlcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoICYmIChpbmZvICE9IEVSUk9SVElDS19FUlJPUik7IGkrKykgewotCQkJCUlNYXJrZXIgY3Vycj0gbWFya2Vyc1tpXTsKLQkJCQlpbnQgcHJpb3JpdHk9IGN1cnIuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIC0xKTsKLQkJCQlpZiAocHJpb3JpdHkgPT0gSU1hcmtlci5TRVZFUklUWV9FUlJPUikgewotCQkJCQlpbmZvPSBFUlJPUlRJQ0tfRVJST1I7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCXJldHVybiBpbmZvOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyICE9IG51bGwpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9ibGVtTWFya2VyTWFuYWdlcigpLnJlbW92ZUxpc3RlbmVyKGZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyKTsKLQkJCWZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyPSBudWxsOwotCQl9Ci0JCWlmIChmUmVnaXN0cnkgIT0gbnVsbCAmJiBmVXNlTmV3UmVnaXN0cnkpIHsKLQkJCWZSZWdpc3RyeS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KE9iamVjdCwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWZMaXN0ZW5lcnM9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkJfQotCQlmTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCWlmIChmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcj0gbmV3IElQcm9ibGVtQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb2JsZW1zQ2hhbmdlZChJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKSB7Ci0JCQkJCWZpcmVQcm9ibGVtc0NoYW5nZWQoY2hhbmdlZFJlc291cmNlcywgaXNNYXJrZXJDaGFuZ2UpOwotCQkJCX0KLQkJCX07Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvYmxlbU1hcmtlck1hbmFnZXIoKS5hZGRMaXN0ZW5lcihmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQl9CQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZkxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCQlpZiAoZkxpc3RlbmVycy5pc0VtcHR5KCkgJiYgZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9ibGVtTWFya2VyTWFuYWdlcigpLnJlbW92ZUxpc3RlbmVyKGZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyKTsKLQkJCQlmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcj0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmlyZVByb2JsZW1zQ2hhbmdlZChJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKSB7Ci0JCWlmIChmTGlzdGVuZXJzICE9IG51bGwgJiYgIWZMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50PSBuZXcgUHJvYmxlbXNMYWJlbENoYW5nZWRFdmVudCh0aGlzLCBjaGFuZ2VkUmVzb3VyY2VzLCBpc01hcmtlckNoYW5nZSk7Ci0JCQlPYmplY3RbXSBsaXN0ZW5lcnM9IGZMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJKChJTGFiZWxQcm92aWRlckxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pLmxhYmVsUHJvdmlkZXJDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciNkZWNvcmF0ZShqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29yYXRlKE9iamVjdCBlbGVtZW50LCBJRGVjb3JhdGlvbiBkZWNvcmF0aW9uKSB7IAotCQlpbnQgYWRvcm5tZW50RmxhZ3M9IGNvbXB1dGVBZG9ybm1lbnRGbGFncyhlbGVtZW50KTsKLQkJaWYgKGFkb3JubWVudEZsYWdzID09IEVSUk9SVElDS19FUlJPUikgewotCQkJZGVjb3JhdGlvbi5hZGRPdmVybGF5KEF1dGhvcmluZ1VJSW1hZ2VzLklNR19ERVNDX09WUl9FUlJPUik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Qcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1MDRmOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Qcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSA8ZWRpdG9yUGFnZT4gZWxlbWVudHMgZGVmaW5lZCB2aWEgdGhlCi0gKiAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5FZGl0b3JQYWdlUHJvdmlkZXIiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FID0gIlByb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIEF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX0lEID0gImlkIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfTkFNRSA9ICJuYW1lIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfQ0xBU1MgPSAiY2xhc3MiOwotCi0JLy8gQ29udGFpbnMgdGhlIGVkaXRvciBwYWdlIHByb3ZpZGVycyBsb2FkZWQgdmlhIHRoZQotCS8vICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlByb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIiIGV4dGVuc2lvbiBwb2ludC4KLQlwcml2YXRlIEFycmF5TGlzdCBwYWdlUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8JIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlciBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChQcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFByb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIoKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgcGFnZSBwcm92aWRlcnMKLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB0aGUgcGFnZSBwcm92aWRlcnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGFnZVByb3ZpZGVycygpIHsKLQkJTGlzdCBwYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlUHJvdmlkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlFZGl0b3JQYWdlRWxlbWVudCBwYWdlRWxlbWVudCA9IChFZGl0b3JQYWdlRWxlbWVudCkgcGFnZVByb3ZpZGVycwotCQkJCQkuZ2V0KGkpOwotCQkJT2JqZWN0IGNvbnRyaWJ1dG9yQ2xhc3MgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljb250cmlidXRvckNsYXNzID0gcGFnZUVsZW1lbnQuZ2V0Q29udHJpYnV0b3JDbGFzcygpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCXBhZ2VzLmFkZChjb250cmlidXRvckNsYXNzKTsKLQkJfQotCQlyZXR1cm4gcGFnZXM7Ci0JfQotCQotCS8qKgotCSAqIExvYWRzIHRoZSBjb25maWd1cmF0aW9uIHByb3ZpZGVycyBzcGVjaWZpZWQgdmlhIHRoZQotCSAqICJjb20uaWJtLnByb2Nlc3MucGFnZVByb3ZpZGVycyIgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRQcm92aWRlcnMoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCVBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FU1BBQ0UsCi0JCQkJUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9JRCk7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShQQUdFX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX05BTUUpOwotCQkJCQkJU3RyaW5nIGNvbnRyaWJ1dG9yQ2xhc3MgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUVkaXRvclBhZ2VFbGVtZW50IHBhZ2VFbGVtZW50ID0gbmV3IEVkaXRvclBhZ2VFbGVtZW50KGJ1bmRsZSwKLQkJCQkJCQkJaWQsIG5hbWUsIGNvbnRyaWJ1dG9yQ2xhc3MpOwotCQkJCQkJcGFnZVByb3ZpZGVycy5hZGQocGFnZUVsZW1lbnQpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCQkiRmFpbGVkIHRvIGxvYWQgRWRpdG9yIFBhZ2UgUHJvdmlkZXIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL1ZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTU3MjdjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL1ZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZvbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyIGV4dGVuZHMKLQkJQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUZvbnRQcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgcmVndWxhckZvbnQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgYm9sZEZvbnQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgaXRhbGljRm9udDsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgYm9sZEl0YWxpY0ZvbnQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgc3RyaWtlb3V0Rm9udDsJCi0KLQlzdGF0aWMgewotCQlGb250IGRlZmF1bHRGb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0RGVmYXVsdEZvbnQoKTsKLQkJcmVndWxhckZvbnQgPSBkZWZhdWx0Rm9udDsKLQkJRm9udERhdGFbXSBmZHMgPSBKRmFjZVJlc291cmNlcy5nZXREZWZhdWx0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0JCWlmIChmZHMubGVuZ3RoID4gMCkgewotCQkJRm9udERhdGEgZmQgPSBmZHNbMF07Ci0JCQlpbnQgaCA9IGZkLmdldEhlaWdodCgpOwotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlib2xkRm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZkLmdldE5hbWUoKSwgaCwgZmQuZ2V0U3R5bGUoKQotCQkJCQl8IFNXVC5CT0xEKTsKLQkJCWl0YWxpY0ZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBmZC5nZXROYW1lKCksIGgsIGZkLmdldFN0eWxlKCkKLQkJCQkJfCBTV1QuSVRBTElDKTsKLQkJCWJvbGRJdGFsaWNGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQuZ2V0TmFtZSgpLCBoLCBmZC5nZXRTdHlsZSgpCi0JCQkJCXwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBnZXRJdGFsaWNGb250KCkgewotCQlyZXR1cm4gaXRhbGljRm9udDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgZ2V0RGVmYXVsdEZvbnQoKSB7Ci0JCXJldHVybiByZWd1bGFyRm9udDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIEZvbnQgZ2V0Rm9udChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoaXNFeHRlcm5hbChlbGVtZW50KSkgewotCQkJcmV0dXJuIGl0YWxpY0ZvbnQ7Ci0JCX0KLQkJcmV0dXJuIGJvbGRGb250OwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMjZmM2U3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZXh0ZW5zaW9uIHBvaW50IG1hbmFnZW1lbnQgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L0lNZXRob2RSaWNoVGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L0lNZXRob2RSaWNoVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYWIxZTg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9JTWV0aG9kUmljaFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkRlY29yYXRlZEZpZWxkOwotCi0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBSaWNoIFRleHQgY29udHJvbCB1c2VkIGluIHRoZSBNZXRob2QgZWRpdG9ycy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZFJpY2hUZXh0IGV4dGVuZHMgSVJpY2hUZXh0IHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RhbE9iamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0KEVPYmplY3QgbW9kYWxPYmplY3QpOwotCi0JLyoqCi0JICogUmV0dXJucyBtb2RhbCBvYmplY3QgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1vZGFsT2JqZWN0RmVhdHVyZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kYWwgb2JqZWN0IGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kYWxPYmplY3RGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBtb2RhbE9iamVjdEZlYXR1cmUpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgTWV0aG9kUmljaFRleHQgd2l0aCB0aGUgZWRpdGVkIE1ldGhvZEVsZW1udCBhbmQgbmFtZSBvZiB0aGUgZmllbGQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmaWVsZE5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRGVjb3JhdGVkRmllbGQgbGFiZWwpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvSU1ldGhvZFJpY2hUZXh0RWRpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvSU1ldGhvZFJpY2hUZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5ZjUzOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L0lNZXRob2RSaWNoVGV4dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dFRvb2xCYXI7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBSaWNoIFRleHQgZWRpdG9yIHVzZWQgaW4gdGhlIE1ldGhvZCBlZGl0b3JzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kUmljaFRleHRFZGl0b3IgZXh0ZW5kcyBJTWV0aG9kUmljaFRleHQsIElSaWNoVGV4dEVkaXRvciB7Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgUmljaCBUZXh0IGVkaXRvciB0b29sIGJhciB3aXRoIGFjdGlvbiBpdGVtcy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbEJhcgotCSAqICAgICAgICAgICAgVGhlIFJpY2ggdGV4dCBlZGl0b3IgdG9vbCBiYXIuCi0JICovCi0JcHVibGljIHZvaWQgZmlsbFRvb2xCYXIoSVJpY2hUZXh0VG9vbEJhciB0b29sQmFyKTsKLQkKLQkvKioKLQkgKiBTZWxlY3RzIHRoZSBSaWNoIFRleHQgb3IgSFRNTCB0YWIuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICAwIGZvciB0aGUgUmljaCBUZXh0IHRhYiwgMSBmb3IgdGhlIEhUTUwgdGFiLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgaW5kZXgpOwkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L1JpY2hUZXh0Q29udGVudFZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L1JpY2hUZXh0Q29udGVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzk0ZDM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9SaWNoVGV4dENvbnRlbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dDsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5EZWZhdWx0Q29udGVudFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGlua0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBTcGVjaWFsIGNvbnRlbnQgdmFsaWRhdG9yIGZvciB0aGUgUmljaCBUZXh0IEVkaXRvcgotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRDb250ZW50VmFsaWRhdG9yIGV4dGVuZHMgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IgewotCi0JLyoqCi0JICogdmFsaWRhdGVzIGEgVVJMIHdpdGhvdXQgZGVjb2RpbmcgaXQKLQkgKi8KLQlwdWJsaWMgTGlua0luZm8gdmFsaWRhdGVMaW5rKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBhdHRyaWJ1dGVzLAotCQkJU3RyaW5nIHRleHQsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0KLQkJTGlua0luZm8gaW5mbyA9IG5ldyBMaW5rSW5mbyhvd25lciwgdGhpcywgcHViRGlyKSB7Ci0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29kZShTdHJpbmcgc3RyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCQkJcmV0dXJuIHN0cjsKLQkJCX0KLQkJfTsKLQkJaW5mby52YWxpZGF0ZUxpbmsoYXR0cmlidXRlcywgdGV4dCwgY29uZmlnKTsKLQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZDhlZmY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyByaWNoIHRleHQgZWRpdGluZyBzdXBwb3J0IGZvciB0aGUgZWRpdG9ycyBhbmQgUHJvcGVydGllcyB2aWV3LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0F1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmNGJjZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUxpc3RlbmVyOwotCi0vKioKLSAqIEFjY2Vzc2libGUgbGlzdGVuZXIgd2hpbGUgYXV0aG9yaW5nIHRoZSBjb250ZW50Ci0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lciBpbXBsZW1lbnRzIEFjY2Vzc2libGVMaXN0ZW5lciB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKFN0cmluZyBuYW1lKXsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUxpc3RlbmVyI2dldERlc2NyaXB0aW9uKG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXREZXNjcmlwdGlvbihBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQllLnJlc3VsdCA9IHRoaXMuZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlTGlzdGVuZXIjZ2V0SGVscChvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZ2V0SGVscChBY2Nlc3NpYmxlRXZlbnQgZSkgewotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlTGlzdGVuZXIjZ2V0S2V5Ym9hcmRTaG9ydGN1dChvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZ2V0S2V5Ym9hcmRTaG9ydGN1dChBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUxpc3RlbmVyI2dldE5hbWUob3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsJCQotCQllLnJlc3VsdCA9IHRoaXMubmFtZTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogU2V0IG5hbWUgZm9yIHRoZSBsaXN0ZW5lcgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSl7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvRWRpdG9yc0NvbnRleHRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0VkaXRvcnNDb250ZXh0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3MWQ3NGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvRWRpdG9yc0NvbnRleHRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogRWRpdG9ycyBjb250ZXh0IGhlbHBlcgotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JzQ29udGV4dEhlbHBlciB7Ci0KLQkvKioKLQkgKiBTZXQgY29udGV4dCBoZWxwIGZvciBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSB1aUNvbXBvc2l0ZQotCSAqIEBwYXJhbSBvYmoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SGVscChDb250cm9sIHVpQ29tcG9zaXRlLCBPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqKTsKLQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGUpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfUk9MRV9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgVGFzaykpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9UQVNLX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX1dPUktfUFJPRFVDVF9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfR1VJREFOQ0VfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfRElTQ0lQTElORV9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSkgewotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfRElTQ0lQTElORV9HUk9VUElOR19DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgRG9tYWluKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX0RPTUFJTl9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSkgewotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfV09SS19QUk9EVUNUX1RZUEVfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfUk9MRV9TRVRfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykpIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX1JPTFNFX1NFVF9HUk9VUElOR19DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgVG9vbCkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9UT09MX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCXVpQ29tcG9zaXRlLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9DVVNUT01fQ0FURUdPUllfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCBjb250ZXh0IGhlbHAgZm9yIHByb2Nlc3MgdHlwZQotCSAqIAotCSAqIEBwYXJhbSB1aUNvbXBvc2l0ZQotCSAqIEBwYXJhbSBwcm9jVHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIZWxwKENvbnRyb2wgdWlDb21wb3NpdGUsIFN0cmluZyBwcm9jVHlwZSkgewotCQlpZiAoKHByb2NUeXBlICE9IG51bGwgJiYgcHJvY1R5cGUKLQkJCQkuZXF1YWxzSWdub3JlQ2FzZSgiY2FwYWJpbGl0eSBwYXR0ZXJuIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX0NQX0RFU0NSSVBUSU9OX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoKHByb2NUeXBlICE9IG51bGwgJiYgcHJvY1R5cGUuZXF1YWxzSWdub3JlQ2FzZSgiZGVsaXZlcnkgcHJvY2VzcyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCXVpQ29tcG9zaXRlLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9EUF9ERVNDUklQVElPTl9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfRFBfREVTQ1JJUFRJT05fQ09OVEVYVF9IRUxQX0lEKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0xpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNjc5Y2E4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0xpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbi5FY2xpcHNlUmVzb3VyY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkNvbnRlbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlciBleHRlbmRzIEVjbGlwc2VSZXNvdXJjZXNVdGlsIHsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlciBJTlNUQU5DRSA9IG5ldyBMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSUQgPSAiZ3VpZCI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29udGFpbmVyU2V0IGV4dGVuZHMgSGFzaFNldCB7Ci0JCS8qKgotCQkgKiAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBDb250YWluZXJTZXQoKSB7Ci0JCQlzdXBlcigpOwotCQkJaW5pdCgpOwotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihuZXcgTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQlpbml0KCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWNsZWFyKCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJaW5pdCgpOwotCQkJCX0JCQkJCi0JCQl9KTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCQljbGVhcigpOwotCQkJCi0JCQkvLyBmaWxsIHRoaXMgc2V0IHdpdGggY29udGFpbmVycyBvZiBtYXJrZWQgb2JqZWN0cwotCQkJLy8KLQkJCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJaWYobGliICE9IG51bGwpIHsKLQkJCQlJUHJvamVjdCBwcmogPSBNZXRob2RMaWJyYXJ5UHJvamVjdC5maW5kUHJvamVjdChsaWIpOwotCQkJCWlmKHByaiAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJTWFya2VyW10gbWFya2VycyA9IHByai5maW5kTWFya2VycyhJTlNUQU5DRS5nZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCk7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQkJCQkvLyByZW1vdmUgaXRzIGNvbnRhaW5lcnMgZnJvbSBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzCi0JCQkJCQkJCS8vCi0JCQkJCQkJCW1hcmtDb250YWluZXJzKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBtYXJrQ29udGFpbmVycyhNZXRob2RFbGVtZW50IGUpIHsKLQkJCWZvcihFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbDsgY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKSkgewotCQkJCWFkZChjb250YWluZXIpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHVubWFya0NvbnRhaW5lcnMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlmb3IoRU9iamVjdCBjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGw7IGNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCkpIHsKLQkJCQlyZW1vdmUoY29udGFpbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBDb250YWluZXJTZXQgY29udGFpbmVyc09mTWFya2VkT2JqZWN0cyA9IG5ldyBDb250YWluZXJTZXQoKTsJCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5NYXJrZXJIZWxwZXIjZ2V0RmlsZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlKFVSSSB1cmkpIHsKLQkJaWYodXJpLmlzRmlsZSgpKSB7Ci0JCQlyZXR1cm4gKElGaWxlKSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKHVyaS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEZpbGUodXJpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlNYXJrZXJIZWxwZXIjYWRqdXN0TWFya2VyKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkanVzdE1hcmtlcihJTWFya2VyIG1hcmtlciwgRGlhZ25vc3RpYyBkaWFnbm9zdGljKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gcmV0ID0gc3VwZXIuYWRqdXN0TWFya2VyKG1hcmtlciwgZGlhZ25vc3RpYyk7Ci0JCWlmKCFkaWFnbm9zdGljLmdldERhdGEoKS5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBvID0gZGlhZ25vc3RpYy5nZXREYXRhKCkuZ2V0KDApOwotCQkJaWYobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKEdVSUQsICgoTWV0aG9kRWxlbWVudClvKS5nZXRHdWlkKCkpOwotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTiwgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG8pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnZhbGlkKE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkvLyB0aGlzIGlzIGFuIFVJIG9iamVjdDogUHJvY2Vzc2VzCi0JCQkvLwotCQkJUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGlwID0gKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0OwotCQkJT2JqZWN0IG87Ci0JCQlyZXR1cm4gKChvID0gaXAuZ2V0Q2FwYWJpbGl0eVBhdHRlcm5QYWNrYWdlKCkpICE9IG51bGwgJiYgY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5jb250YWlucyhvKSkKLQkJCQl8fCAoKG8gPSBpcC5nZXREZWxpdmVyeVByb2Nlc3NQYWNrYWdlKCkpICE9IG51bGwgJiYgY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5jb250YWlucyhvKSk7Ci0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlcgotCQkJCXx8IG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRJdGVtUHJvdmlkZXIpIHsKLQkJCS8vIHRoaXMgaXMgYW4gVUkgb2JqZWN0Ci0JCQkvLwotCQkJb2JqZWN0ID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKW9iamVjdCkuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgewotCQkJLy8gdGhpcyBpcyBhbiBVSSBvYmplY3Q6IGVpdGhlciBUYXNrcywgUm9sZXMsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlCi0JCQkvLwotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9ICgoVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYoSU5TVEFOQ0UuaGFzTWFya2VycyhpdGVyLm5leHQoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5jb250YWlucyhvYmplY3QpIHx8IElOU1RBTkNFLmhhc01hcmtlcnMob2JqZWN0KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5NYXJrZXJIZWxwZXIjaGFzTWFya2VycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc01hcmtlcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRGaWxlKG9iamVjdCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCVN0cmluZyBndWlkID0gKChNZXRob2RFbGVtZW50KW9iamVjdCkuZ2V0R3VpZCgpOwotCQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQkJaWYoZ3VpZC5lcXVhbHMobWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKSkpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuaGFzTWFya2VycyhvYmplY3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWxldGVNYXJrZXJzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0RmlsZShvYmplY3QpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudClvYmplY3QpLmdldEd1aWQoKTsKLQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJCWlmKGd1aWQuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCkpKSB7Ci0JCQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3VwZXIuZGVsZXRlTWFya2VycyhvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZU1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIGluY2x1ZGVTdWJ0eXBlcywgaW50IGRlcHRoKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewkJCQkKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQkJLy8gcmVtb3ZlIGl0cyBjb250YWluZXJzIGZyb20gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cwotCQkJCQkJLy8KLQkJCQkJCWNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMudW5tYXJrQ29udGFpbmVycyhlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCi0JCQl9CQkJCi0JCX0KLQkJCQotCQlzdXBlci5kZWxldGVNYXJrZXJzKHJlc291cmNlLCBpbmNsdWRlU3VidHlwZXMsIGRlcHRoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTWFya2VycyhJUmVzb3VyY2UgcmVzb3VyY2UsIERpYWdub3N0aWMgZGlhZ25vc3RpYywgRGlhZ25vc3RpYyBwYXJlbnREaWFnbm9zdGljKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmNyZWF0ZU1hcmtlcnMocmVzb3VyY2UsIGRpYWdub3N0aWMsIHBhcmVudERpYWdub3N0aWMpOwotCQkKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCXRyeSB7CQkJCQotCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQkJaWYoZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyByZW1vdmUgaXRzIGNvbnRhaW5lcnMgZnJvbSBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzCi0JCQkJCQkvLwotCQkJCQkJY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5tYXJrQ29udGFpbmVycyhlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCi0JCQl9CQkJCi0JCX0KLQl9Ci0JCi0JLy9PdmVycmlkZSB0byBzZXBlcmF0ZSBlcnJvciBtZXNzYWdlIGluIGVycm9yIGRpYWxvZyBhbmQgcHJvYmxlbXMgdmlldyAoYnVnIDE3NDM1MSkKLQkvL05vdGU6IGJldHRlciBmaXggaXMgdG8gZXh0ZW5kIEJhc2ljRGlhZ25vc3RpYyB0byBlbmNhcHN1bGF0ZSBib3RoIHR5cGVzIG9mIG1zZ3MgLT4gdG8gZG8gbGF0ZXIKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXBvc2VNZXNzYWdlKERpYWdub3N0aWMgZGlhZ25vc3RpYywgRGlhZ25vc3RpYyBwYXJlbnREaWFnbm9zdGljKSB7Ci0JCWludCBpeCA9IGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpLmluZGV4T2YoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2cyKTsKLQkJaWYgKGl4ID4gMCkgewotCQkJcmV0dXJuIGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpLnN1YnN0cmluZygwLCBpeCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNvbXBvc2VNZXNzYWdlKGRpYWdub3N0aWMsIHBhcmVudERpYWdub3N0aWMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL01hcmtlclJlc29sdXRpb25HZW5lcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL01hcmtlclJlc29sdXRpb25HZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjBhZDU4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3I7Ci0KLS8qKgotICogQ3JlYXRlIHJlc291bHRpb25zIGZvciB0aGUgZ2l2ZW4gbWFya2VyCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciBpbXBsZW1lbnRzIElNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTWFya2VyUmVzb2x1dGlvbltdIEVNUFRZX1JFU09MVVRJT05TID0gbmV3IElNYXJrZXJSZXNvbHV0aW9uWzBdOwotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFNob3dPd25lckluTGlicmFyeVZpZXcgaW1wbGVtZW50cyBJTWFya2VyUmVzb2x1dGlvbiB7Ci0KLQkJcHJpdmF0ZSBPYmplY3Qgb3duZXI7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBvd25lcgotCQkgKi8KLQkJcHJpdmF0ZSBTaG93T3duZXJJbkxpYnJhcnlWaWV3KE9iamVjdCBvd25lcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uI2dldExhYmVsKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9zaG93T3duZXJJbkxpYnJhcnlWaWV3OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb24jcnVuKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oSU1hcmtlciBtYXJrZXIpIHsKLQkJCUxpYnJhcnlWaWV3LmdldFZpZXcoKS5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihvd25lcik7Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hcmtlclJlc29sdXRpb24gaW1wbGVtZW50cyBJTWFya2VyUmVzb2x1dGlvbiB7Ci0JCXByaXZhdGUgRU9iamVjdCBvd25lcjsKLQkJcHJpdmF0ZSBFUmVmZXJlbmNlIHJlZmVyZW5jZTsKLQkJcHJpdmF0ZSBpbnQgaW5kZXg7Ci0JCQkJCi0JCXByaXZhdGUgTWFya2VyUmVzb2x1dGlvbihFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZiwgaW50IGluZGV4KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQkJdGhpcy5yZWZlcmVuY2UgPSByZWY7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbiNnZXRMYWJlbCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKElNYXJrZXIgbWFya2VyKSB7Ci0JCQlpZihyZWZlcmVuY2UuaXNNYW55KCkpIHsKLQkJCQkoKExpc3Qpb3duZXIuZUdldChyZWZlcmVuY2UpKS5yZW1vdmUoaW5kZXgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJb3duZXIuZVNldChyZWZlcmVuY2UsIG51bGwpOwotCQkJfQotCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJcGVyc2lzdGVyLnNhdmUob3duZXIuZVJlc291cmNlKCkpOwotCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJfQotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IjZ2V0UmVzb2x1dGlvbnMob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLQkgKi8KLQlwdWJsaWMgSU1hcmtlclJlc29sdXRpb25bXSBnZXRSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcikgewotCQkvLyBUaGUgb25seSByZXNvbHV0aW9uIHdlIHByb3ZpZGUgcmlnaHQgbm93IGlzIHJlbW92aW5nIHRoZSB1bnJlc29sdmluZyBwcm94eQotCQkvLwotCQl0cnkgewotCQkJU3RyaW5nIHByb3h5VVJJID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLlBST1hZX1VSSSk7Ci0JCQlTdHJpbmcgb3duZXJHVUlEID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLk9XTkVSX0dVSUQpOwotCQkJaWYocHJveHlVUkkgIT0gbnVsbCAmJiBvd25lckdVSUQgIT0gbnVsbCkgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlKG1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCUVPYmplY3Qgb3duZXIgPSByZXNvdXJjZS5nZXRFT2JqZWN0KG93bmVyR1VJRCk7Ci0JCQkJCWlmKG93bmVyICE9IG51bGwpIHsKLQkJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJKTsKLQkJCQkJCS8vIGZpbmQgdGhlIHByb3h5Ci0JCQkJCQkvLwotCQkJCQkJaW50IGluZGV4ID0gLTE7Ci0JCQkJCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG51bGw7Ci0JCQkJCQlmaW5kX3Byb3h5X2xvb3A6Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvd25lci5lQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZihyZWYuaXNDaGFuZ2VhYmxlKCkgJiYgIXJlZi5pc0Rlcml2ZWQoKSkgewotCQkJCQkJCQlpZihyZWYuaXNNYW55KCkpIHsKLQkJCQkJCQkJCUludGVybmFsRUxpc3QgbGlzdCA9IChJbnRlcm5hbEVMaXN0KSBvd25lci5lR2V0KHJlZik7Ci0JCQkJCQkJCQlpbnQgaWQgPSAwOwotCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuYmFzaWNJdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJCWlmKG8uZUlzUHJveHkoKSAmJiB1cmkuZXF1YWxzKG8uZVByb3h5VVJJKCkpKSB7Ci0JCQkJCQkJCQkJCWluZGV4ID0gaWQ7Ci0JCQkJCQkJCQkJCXJlZmVyZW5jZSA9IHJlZjsKLQkJCQkJCQkJCQkJYnJlYWsgZmluZF9wcm94eV9sb29wOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlpZCsrOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJSW50ZXJuYWxFT2JqZWN0IG8gPSAoSW50ZXJuYWxFT2JqZWN0KSBvd25lci5lR2V0KHJlZiwgZmFsc2UpOwotCQkJCQkJCQkJaWYobyAhPSBudWxsICYmIG8uZUlzUHJveHkoKSAmJiB1cmkuZXF1YWxzKG8uZVByb3h5VVJJKCkpKSB7Ci0JCQkJCQkJCQkJcmVmZXJlbmNlID0gcmVmOwotCQkJCQkJCQkJCWJyZWFrIGZpbmRfcHJveHlfbG9vcDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJCQkJT2JqZWN0IHNlbGVjdGFibGVPd25lciA9IGdldFNlbGVjdGFibGVPYmplY3Qob3duZXIpOwotCQkJCQkJCWlmKHNlbGVjdGFibGVPd25lciAhPSBudWxsKSB7Ci0JCQkJCQkJCXJldHVybiBuZXcgSU1hcmtlclJlc29sdXRpb25bXSB7Ci0JCQkJCQkJCQkJbmV3IE1hcmtlclJlc29sdXRpb24ob3duZXIsIHJlZmVyZW5jZSwgaW5kZXgpLAotCQkJCQkJCQkJCW5ldyBTaG93T3duZXJJbkxpYnJhcnlWaWV3KHNlbGVjdGFibGVPd25lcikKLQkJCQkJCQkJfTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXJldHVybiBuZXcgSU1hcmtlclJlc29sdXRpb25bXSB7Ci0JCQkJCQkJCQkJbmV3IE1hcmtlclJlc29sdXRpb24ob3duZXIsIHJlZmVyZW5jZSwgaW5kZXgpLAotCQkJCQkJCQl9OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gRU1QVFlfUkVTT0xVVElPTlM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHNlbGVjdGFibGUgb2JqZWN0IAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEByZXR1cm4KLQkgKiAJCQlvYmplY3QgaXRzZWxmCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFNlbGVjdGFibGVPYmplY3QoRU9iamVjdCBvd25lcikgewotCQlpZihvd25lciBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBvd25lciBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50IHx8IG93bmVyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgCi0JCQkJfHwgb3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gb3duZXI7Ci0JCX0KLQkJaWYob3duZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gVW1hVXRpbC5nZXRQcm9jZXNzQ29tcG9uZW50KChNZXRob2RFbGVtZW50KSBvd25lcik7Ci0JCQlpZihwcm9jQ29tcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHByb2NDb21wOwotCQkJfQotCQl9Ci0JCWlmKG93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCXJldHVybiBvd25lcjsKLQkJfQotCQlpZihvd25lciBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiAmJiBvd25lci5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJcmV0dXJuIG93bmVyLmVDb250YWluZXIoKTsgCi0JCX0KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvd25lci5lUmVzb3VyY2UoKTsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlpZihlICE9IG93bmVyKSB7Ci0JCQlyZXR1cm4gZ2V0U2VsZWN0YWJsZU9iamVjdChlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9NZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmY4YThhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9NZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb24uRWNsaXBzZVJlc291cmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQ29udGVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5NZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBiYXNlZCBvbiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIgCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlciBleHRlbmRzIEVjbGlwc2VSZXNvdXJjZXNVdGlsIHsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlciBJTlNUQU5DRSA9IG5ldyBNZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSUQgPSAiZ3VpZCI7Ci0KLQkvLyBtYXJrZXIgSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5tZXRob2RSaWNoVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBtYXJrZXIgYXR0cmlidXRlCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1FVEhPRF9GSUVMRE5BTUUgPSAiTWV0aG9kRmllbGROYW1lIjsKLQotCS8vIHByaXZhdGUgY29uc3RydWN0b3IKLQlwcml2YXRlIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyKCkgewotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250YWluZXJNYXAgZXh0ZW5kcyBIYXNoTWFwPE9iamVjdCwgSW50ZWdlcj4gewotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgQ29udGFpbmVyTWFwKCkgewotCQkJc3VwZXIoKTsKLQkJCWluaXRNYXAoKTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobmV3IExpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJaW5pdE1hcCgpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQljbGVhcigpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWluaXRNYXAoKTsKLQkJCQl9CQkJCQotCQkJfSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBpbml0TWFwKCkgewotCQkJY2xlYXIoKTsKLQkJCQotCQkJLy8gZmlsbCB0aGlzIHNldCB3aXRoIGNvbnRhaW5lcnMgb2YgbWFya2VkIG9iamVjdHMKLQkJCS8vCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCWlmKGxpYiAhPSBudWxsKSB7Ci0JCQkJSVByb2plY3QgcHJqID0gTWV0aG9kTGlicmFyeVByb2plY3QuZmluZFByb2plY3QobGliKTsKLQkJCQlpZihwcmogIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBwcmouZmluZE1hcmtlcnMoSU5TVEFOQ0UuZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpOwotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQkJCQlpZihlICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gcmVtb3ZlIGl0cyBjb250YWluZXJzIGZyb20gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cwotCQkJCQkJCQkvLwotCQkJCQkJCQltYXJrQ29udGFpbmVycyhlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaW5jcmVtZW50KE9iamVjdCBvYmplY3QpIHsKLQkJCUludGVnZXIgY291bnQ7Ci0JCQlpZiAoY29udGFpbnNLZXkob2JqZWN0KSkgewotCQkJCWNvdW50ID0gZ2V0KG9iamVjdCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvdW50ID0gbmV3IEludGVnZXIoMCk7Ci0JCQl9Ci0JCQljb3VudCsrOwotCQkJcHV0KG9iamVjdCwgY291bnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRlY3JlbWVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAoY29udGFpbnNLZXkob2JqZWN0KSkgewotCQkJCUludGVnZXIgY291bnQgPSBnZXQob2JqZWN0KTsKLQkJCQlpZiAoY291bnQgPT0gMSkgewotCQkJCQkvLyByZW1vdmUgb2JqZWN0Ci0JCQkJCXJlbW92ZShvYmplY3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvdW50LS07Ci0JCQkJCXB1dChvYmplY3QsIGNvdW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBtYXJrQ29udGFpbmVycyhNZXRob2RFbGVtZW50IGUpIHsKLQkJCWZvcihFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbDsgY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKSkgewotCQkJCWluY3JlbWVudChjb250YWluZXIpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHVubWFya0NvbnRhaW5lcnMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlmb3IoRU9iamVjdCBjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGw7IGNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCkpIHsKLQkJCQlkZWNyZW1lbnQoY29udGFpbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBDb250YWluZXJNYXAgY29udGFpbmVyc09mTWFya2VkT2JqZWN0cyA9IG5ldyBDb250YWluZXJNYXAoKTsJCi0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXJrZXJJRCgpIHsKLQkJcmV0dXJuIE1BUktFUl9JRDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5NYXJrZXJIZWxwZXIjZ2V0RmlsZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlKFVSSSB1cmkpIHsKLQkJaWYodXJpLmlzRmlsZSgpKSB7Ci0JCQlyZXR1cm4gKElGaWxlKSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKHVyaS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEZpbGUodXJpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlNYXJrZXJIZWxwZXIjYWRqdXN0TWFya2VyKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkanVzdE1hcmtlcihJTWFya2VyIG1hcmtlciwgRGlhZ25vc3RpYyBkaWFnbm9zdGljKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gcmV0ID0gc3VwZXIuYWRqdXN0TWFya2VyKG1hcmtlciwgZGlhZ25vc3RpYyk7Ci0JCWlmKCFkaWFnbm9zdGljLmdldERhdGEoKS5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBvID0gZGlhZ25vc3RpYy5nZXREYXRhKCkuZ2V0KDApOwotCQkJT2JqZWN0IHN0ciA9IGRpYWdub3N0aWMuZ2V0RGF0YSgpLmdldCgxKTsKLQkJCWlmKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShHVUlELCAoKE1ldGhvZEVsZW1lbnQpbykuZ2V0R3VpZCgpKTsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTE9DQVRJT04sIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChvKSk7Ci0JCQl9Ci0JCQlpZiAoc3RyIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShNRVRIT0RfRklFTEROQU1FLCAoU3RyaW5nKXN0cik7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnZhbGlkKE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkvLyB0aGlzIGlzIGFuIFVJIG9iamVjdDogUHJvY2Vzc2VzCi0JCQkvLwotCQkJUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGlwID0gKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0OwotCQkJT2JqZWN0IG87Ci0JCQlyZXR1cm4gKChvID0gaXAuZ2V0Q2FwYWJpbGl0eVBhdHRlcm5QYWNrYWdlKCkpICE9IG51bGwgJiYgY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5jb250YWluc0tleShvKSkKLQkJCQl8fCAoKG8gPSBpcC5nZXREZWxpdmVyeVByb2Nlc3NQYWNrYWdlKCkpICE9IG51bGwgJiYgY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5jb250YWluc0tleShvKSk7Ci0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlcgotCQkJCXx8IG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRJdGVtUHJvdmlkZXIpIHsKLQkJCS8vIHRoaXMgaXMgYW4gVUkgb2JqZWN0Ci0JCQkvLwotCQkJb2JqZWN0ID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKW9iamVjdCkuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgewotCQkJLy8gdGhpcyBpcyBhbiBVSSBvYmplY3Q6IGVpdGhlciBUYXNrcywgUm9sZXMsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlCi0JCQkvLwotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9ICgoVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmKGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMuY29udGFpbnNLZXkob2JqKSB8fCBJTlNUQU5DRS5oYXNNYXJrZXJzKG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5jb250YWluc0tleShvYmplY3QpIHx8IElOU1RBTkNFLmhhc01hcmtlcnMob2JqZWN0KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5NYXJrZXJIZWxwZXIjaGFzTWFya2VycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc01hcmtlcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRGaWxlKG9iamVjdCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCVN0cmluZyBndWlkID0gKChNZXRob2RFbGVtZW50KW9iamVjdCkuZ2V0R3VpZCgpOwotCQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQkJaWYoZ3VpZC5lcXVhbHMobWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKSkpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuaGFzTWFya2VycyhvYmplY3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWxldGVNYXJrZXJzKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0RmlsZShvYmplY3QpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudClvYmplY3QpLmdldEd1aWQoKTsKLQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJCWlmKGd1aWQuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCkpICYmIChmaWVsZE5hbWUgPT0gbnVsbCB8fAotCQkJCQkJCQlmaWVsZE5hbWUuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoTUVUSE9EX0ZJRUxETkFNRSkpKSkgewotCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKLQkJCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCQkJaWYoZSAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIHJlbW92ZSBpdHMgY29udGFpbmVycyBmcm9tIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMKLQkJCQkJCQkJLy8KLQkJCQkJCQkJY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy51bm1hcmtDb250YWluZXJzKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN1cGVyLmRlbGV0ZU1hcmtlcnMob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVNYXJrZXJzKElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBpbmNsdWRlU3VidHlwZXMsIGludCBkZXB0aCkgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdHJ5IHsJCQkJCi0JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJCQlpZihlICE9IG51bGwpIHsKLQkJCQkJCS8vIHJlbW92ZSBpdHMgY29udGFpbmVycyBmcm9tIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMKLQkJCQkJCS8vCi0JCQkJCQljb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLnVubWFya0NvbnRhaW5lcnMoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQotCQkJfQkJCQotCQl9Ci0JCQkKLQkJc3VwZXIuZGVsZXRlTWFya2VycyhyZXNvdXJjZSwgaW5jbHVkZVN1YnR5cGVzLCBkZXB0aCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlLCBEaWFnbm9zdGljIGRpYWdub3N0aWMsIERpYWdub3N0aWMgcGFyZW50RGlhZ25vc3RpYykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5jcmVhdGVNYXJrZXJzKHJlc291cmNlLCBkaWFnbm9zdGljLCBwYXJlbnREaWFnbm9zdGljKTsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IG51bGw7Ci0JCWlmKCFkaWFnbm9zdGljLmdldERhdGEoKS5pc0VtcHR5KCkgJiYgZGlhZ25vc3RpYy5nZXREYXRhKCkuc2l6ZSgpID4gMSkgewotCQkJZmllbGROYW1lID0gKFN0cmluZylkaWFnbm9zdGljLmdldERhdGEoKS5nZXQoMSk7Ci0JCX0KLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgZmllbGROYW1lICE9IG51bGwpIHsKLQkJCXRyeSB7CQkJCQotCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCk7Ci0JCQkJCWlmKGZpZWxkTmFtZS5lcXVhbHMobWFya2VyLmdldEF0dHJpYnV0ZShNRVRIT0RfRklFTEROQU1FKSkpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQkJCS8vIGFkZCBpdHMgY29udGFpbmVycyB0byBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzCi0JCQkJCQkJLy8KLQkJCQkJCQljb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLm1hcmtDb250YWluZXJzKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkKLQkJCX0JCQkKLQkJfQotCi0JfQotCQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcG9zZU1lc3NhZ2UoRGlhZ25vc3RpYyBkaWFnbm9zdGljLCBEaWFnbm9zdGljIHBhcmVudERpYWdub3N0aWMpCi0gICAgewotICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKTsKLSAgICAgIGlmIChwYXJlbnREaWFnbm9zdGljICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwYXJlbnRNZXNzYWdlID0gcGFyZW50RGlhZ25vc3RpYy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChwYXJlbnRNZXNzYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSAhPSBudWxsID8gcGFyZW50TWVzc2FnZSArICIgIiArIG1lc3NhZ2UgOiBwYXJlbnRNZXNzYWdlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvUmVmcmVzaEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1JlZnJlc2hIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkMzhkZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvUmVmcmVzaEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqIE5vdGlmeSBjaGFuZ2VzIGluIHJlc291cmNlcyB0byByZWZyZXNoCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZyZXNoSGFuZGxlciBpbXBsZW1lbnRzIElSZWZyZXNoSGFuZGxlciB7Ci0KLQlwcml2YXRlIExpYnJhcnlWaWV3IGxpYlZpZXc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIFJlZnJlc2hIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hIYW5kbGVyI3JlZnJlc2gob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJbGliVmlldyA9IExpYnJhcnlWaWV3LmdldFZpZXcoKTsKLQkJVmlld2VyIHZpZXdlciA9IGxpYlZpZXcgIT0gbnVsbCA/IGxpYlZpZXcuZ2V0Vmlld2VyKCkgOiBudWxsOwotCQlDb250cm9sIGN0cmwgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCWlmIChjdHJsLmdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQlkb1JlZnJlc2gobW9uaXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlkb1JlZnJlc2gobW9uaXRvcik7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb1JlZnJlc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmICghUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKLQkJCUFycmF5TGlzdCByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdChSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldFJlbW92ZWRSZXNvdXJjZXMoKSk7Ci0JCQloYW5kbGVSZW1vdmVkUmVzb3VyY2VzKHJlbW92ZWRSZXNvdXJjZXMpOwotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCXJlbW92ZWRSZXNvdXJjZXMpOwotCQl9Ci0JCWlmICghUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldENoYW5nZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKLQkJCUFycmF5TGlzdCBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdChSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0JCQloYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldENoYW5nZWRSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCWNoYW5nZWRSZXNvdXJjZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHJlbW92ZSByZXNvdXJjZXMKLQkgKiBAcGFyYW0gcmVtb3ZlZFJlc291cmNlczIKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gaGFuZGxlUmVtb3ZlZFJlc291cmNlcyhDb2xsZWN0aW9uIHJlbW92ZWRSZXNvdXJjZXMpIHsKLQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGNoYW5nZWQgcmVzb3VyY2VzCi0JICogCi0JICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZXMKLQkgKiBAcmV0dXJuIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiByZWxvYWRlZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKENvbGxlY3Rpb24gY2hhbmdlZFJlc291cmNlcykgewotCQlDb250cm9sIGN0cmwgPSBsaWJWaWV3LmdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJaWYgKGN0cmwgPT0gbnVsbCB8fCBjdHJsLmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gbGliVmlldy5nZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQlTaGVsbCBzaGVsbCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJQXJyYXlMaXN0IGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXJyYXlMaXN0IGNoYW5nZWRSZXNvdXJjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KGNoYW5nZWRSZXNvdXJjZXMpOwotCQkvLyBmaW5kIGFsbCBlZGl0b3Igd2l0aCBkaXJ0eSBjb25mbGljdAotCQkvLwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiBlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IGNoYW5nZWRSZXNvdXJjZUxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGNoYW5nZWRSZXNvdXJjZUxpc3QuZ2V0KGopOwotCQkJCQlpZiAodXNlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5hZGQoZWRpdG9yKTsKLQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsIEFycmF5TGlzdCBlZGl0b3JzVG9SZWZyZXNoID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5pc0VtcHR5KCkpIHsKLQkJCS8vIHByb21wdCB1c2VyIHRvIGRpc2NhcmQgY2hhbmdlcyBpbiBlZGl0b3JzIHRoYXQgY29uZmxpY3Qgd2l0aAotCQkJLy8gb3V0c2lkZSBjaGFuZ2UKLQkJCS8vCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJTGlzdCBmQ29udGVudHM7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCQlpZiAoZkNvbnRlbnRzICE9IG51bGwgJiYgZkNvbnRlbnRzID09IGlucHV0RWxlbWVudCkKLQkJCQkJCXJldHVybiBmQ29udGVudHMudG9BcnJheSgpOwotCQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsCi0JCQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCQkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJCWZDb250ZW50cyA9IChMaXN0KSBuZXdJbnB1dDsKLQkJCQkJZWxzZQotCQkJCQkJZkNvbnRlbnRzID0gbnVsbDsKLQotCQkJCX0KLQotCQkJfTsKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JCQkJICovCi0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCQkJCXJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZSgpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JCQkJICovCi0JCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCQkJCXJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZUltYWdlKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOwotCQkJCX0KLQkJCX07Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfRmlsZUNvbmZsaWN0X2xhYmVsOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1dBUk5fRmlsZUNvbmZsaWN0OyAKLQkJCUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2coc2hlbGwsCi0JCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCwgY29udGVudFByb3ZpZGVyLCBsYWJlbFByb3ZpZGVyLAotCQkJCQltc2cpOwotCQkJZGxnLnNldFRpdGxlKHRpdGxlKTsKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5vcGVuKCk7Ci0JCQlPYmplY3RbXSByZXN1bHQgPSBkbGcuZ2V0UmVzdWx0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJCU9iamVjdCBlZGl0b3IgPSByZXN1bHRbaV07Ci0JCQkJZWRpdG9yc1RvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQlkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QucmVtb3ZlKGVkaXRvcik7Ci0JCQl9Ci0JCQkvLyByZW1vdmUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IGRpcnR5IGVkaXRvcnMgd2l0aCBjb25mbGljdCBmcm9tIHRoZQotCQkJLy8gY29sbGVjdGlvbiBvZiBjaGFuZ2VkIHJlc291cmNlcwotCQkJLy8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0Ci0JCQkJCQkuZ2V0KGkpOwotCQkJCUNvbGxlY3Rpb24gdXNlZFJlc291cmNlcyA9IGVkaXRvci5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJY2hhbmdlZFJlc291cmNlTGlzdC5yZW1vdmVBbGwodXNlZFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWNoYW5nZWRSZXNvdXJjZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiAhZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQlDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCQljaGVja19yZXNvdXJjZTogZm9yIChpbnQgaiA9IDA7IGogPCBjaGFuZ2VkUmVzb3VyY2VMaXN0Ci0JCQkJCQkJLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgY2hhbmdlZFJlc291cmNlTGlzdAotCQkJCQkJCQkuZ2V0KGopOwotCQkJCQkJaWYgKHVzZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCQkJZWRpdG9yc1RvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQkJCQlicmVhayBjaGVja19yZXNvdXJjZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmVsb2FkIHRoZSBzZWxlY3RlZCBjaGFuZ2VkIHJlc291cmNlcy4KLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5yZWxvYWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlTGlzdCk7Ci0JCQl9Ci0KLQkJCWxpYlZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJQ29uZmlndXJhdGlvblZpZXcgY29uZmlnVmlldyA9IENvbmZpZ3VyYXRpb25WaWV3LmdldFZpZXcoKTsKLQkJCWlmIChjb25maWdWaWV3ICE9IG51bGwpIHsKLQkJCQljdHJsID0gY29uZmlnVmlldy5nZXRWaWV3ZXIoKS5nZXRDb250cm9sKCk7Ci0JCQkJaWYgKGN0cmwgIT0gbnVsbCAmJiAhY3RybC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJY29uZmlnVmlldy5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghZWRpdG9yc1RvUmVmcmVzaC5pc0VtcHR5KCkpIHsKLQkJCXNoZWxsLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvcnNUb1JlZnJlc2guc2l6ZSgpOyBpKyspIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcnNUb1JlZnJlc2gKLQkJCQkJCQkJLmdldChpKTsKLQkJCQkJCWVkaXRvci5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0KLQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZUxpc3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNiZDgwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLQotLyoqCi0gKiBTaW1wbGUgY29udGFpbmVyIGNsYXNzIHVzZWQgYXMgYSByZXR1cm4gdmFsdWUgZm9yIEZvcm1VSSBjb252ZW5pZW5jZSBtZXRob2RzCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciB7Ci0JcHVibGljIElNZXRob2RSaWNoVGV4dCByaWNoVGV4dDsKLQlwdWJsaWMgSW1hZ2VIeXBlcmxpbmsgbGluazsKLQkKLQlwdWJsaWMgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIoSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0LCBJbWFnZUh5cGVybGluayBsaW5rKSB7Ci0JCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQkJdGhpcy5saW5rID0gbGluazsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9VSUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvVUlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjc5YWRlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9VSUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLQotCi0vKioKLSAqIEhlbHBlciBVdGlsaXR5IGNsYXNzIGZvciBVSQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVJSGVscGVyIHsKLQotCS8qKgotCSAqIFNldHRpbmcgaXRlbXMgaW4gYSB0YWJsZQotCSAqIAotCSAqIEBwYXJhbSB0YWJsZQotCSAqIEBwYXJhbSBpdGVtcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJdGVtcyhUYWJsZSB0YWJsZSwgQXJyYXlMaXN0IGl0ZW1zKSB7Ci0JCXRhYmxlLnJlbW92ZUFsbCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCgoU3RyaW5nKSBpdGVtcy5nZXQoaSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGxpc3Qgb24gdGhlIGdpdmVuIGNvbXBvc2l0ZSB3aXRoIGdpdmVuIHN0eWxlCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGNyZWF0ZUxpc3QoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBzdHlsZSkgewotCQlMaXN0IGxpc3QgPSBuZXcgTGlzdChwYXJlbnQsIHN0eWxlIHwgU1dULk5VTEwpOwotCQl0b29sa2l0LmFkYXB0KGxpc3QsIHRydWUsIHRydWUpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKgotCSAqIE1ldGhvZCB3aWxsIHJldHVybiBPYmplY3RbXSBvZiBndWlkYW5jZSBleGNsdWRpbmcgUHJhY3RpY2UuCi0JICogTWV0aG9kRWxlbWVudFV0aWwjZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoRU9iamVjdCkgY2FsY3VsYXRlcyBhbGwgZ3VpZGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRTZWxlY3RlZEd1aWRhbmNlcyhDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCkgewotCQlqYXZhLnV0aWwuTGlzdCBsaXN0ID0gTWV0aG9kRWxlbWVudFV0aWwKLQkJCQkuZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoY29udGVudEVsZW1lbnQpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlKQotCQkJCWl0LnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybVBhZ2VUaXRsZVByZWZpeEZvcihNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJU3RyaW5nIGVsZW1lbnRMYWJlbCA9IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KG1ldGhvZEVsZW1lbnQpOwotCQlpZiAobWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX1dPUktfUFJPRFVDVCArICIgKCIgKyBlbGVtZW50TGFiZWwgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9HVUlEQU5DRSArICIgKCIgKyBlbGVtZW50TGFiZWwgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVsZW1lbnRMYWJlbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGV4dCBmb3IgdGhlIGdpdmVuIGZvcm0gYmFzZWQgb24gdGhlIGdpdmVuIGVsZW1lbnQsIGluY2x1ZGluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbiBvZiB0aGUgZWxlbWVudAotCSAqIGlmIHRoZXJlIGlzIGFueS4KLQkgKiAKLQkgKiBAcGFyYW0gZm9ybQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZvcm1UZXh0KFNjcm9sbGVkRm9ybSBmb3JtLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGZvcm0gIT0gbnVsbCAmJiAhZm9ybS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzdHIuYXBwZW5kKGdldEZvcm1QYWdlVGl0bGVQcmVmaXhGb3IoZWxlbWVudCkpOwotCQkJc3RyLmFwcGVuZChBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXMpOwotCQkJCi0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJc3RyLmFwcGVuZChUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQsCi0JCQkJCQkiIiwgdHJ1ZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmKGVsZW1lbnQuZ2V0TmFtZSgpICE9IG51bGwpewotCQkJCXN0ci5hcHBlbmQoZWxlbWVudC5nZXROYW1lKCkpOwotCQkJfQotCQkJZm9ybS5zZXRUZXh0KHN0ci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgZ2l2ZW4gZGVsaXZlcmFibGVzIGxlYWRzIHRvIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKiBAcGFyYW0gdG9CZVBhcnQKLQkgKiBAcGFyYW0gZGVsaXZlcmFibGUKLQkgKiBAcmV0dXJuCi0JICogCQkJQm9vbGVhbiB2YWx1ZSB0byBpbmRpY2F0ZSB3aGV0aGVyIGNpY3VsYXIgZGVwZW5kZW5jeSBpcyBkZXRlY3RlZAotCSAqIEBkZXByZWNhdGVkIG1vdmVkIHRvIHtAbGluayBEZXBlbmRlbmN5Q2hlY2tlciNjaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKERlbGl2ZXJhYmxlLCBEZWxpdmVyYWJsZSl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoRGVsaXZlcmFibGUgdG9CZVBhcnQsCi0JCQlEZWxpdmVyYWJsZSBkZWxpdmVyYWJsZSkgewotCQlyZXR1cm4gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcyh0b0JlUGFydCwgZGVsaXZlcmFibGUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgZGVsaXZlcmFibGUgcGFydHMgYXJlIGluIGNoYWluCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gcm9vdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaXZlcmFibGVQYXJ0c0NoYWluKERlbGl2ZXJhYmxlIGUsIGphdmEudXRpbC5MaXN0IHJvb3RzKSB7Ci0JCWphdmEudXRpbC5MaXN0IGxpc3QgPSBlLmdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpOwotCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCXJvb3RzLmFkZChvYmopOwotCQkJCQlkZWxpdmVyYWJsZVBhcnRzQ2hhaW4oKERlbGl2ZXJhYmxlKSBvYmosIHJvb3RzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBSZXNvbHZlIGNvbnRlbnQgZWxlbWVudCBuYW1lIGNvbmZsaWN0cwotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlQ29udGVudEVsZW1lbnROYW1lQ29uZmxpY3QoRU9iamVjdCBjb250YWluZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVJlZmVyZW5jZQotCQkJcmVmZXJlbmNlKSB7Ci0KLQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKGNvbnRhaW5lcgotCQkJCSwgcmVmZXJlbmNlLAotCQkJCShDb250ZW50RWxlbWVudCkgZWxlbWVudCwgbmV3IFZhbGlkYXRvckZhY3RvcnkuVHlwZUZpbHRlcihlbGVtZW50KSk7Ci0JCQotCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQoZWxlbWVudC5nZXROYW1lKCkpOwotCQkKLQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZmVhdHVyZVR4dCA9IFRuZ1V0aWwuZ2V0RmVhdHVyZVRleHQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZTsgLy8kTk9OLU5MUy0xJAkJCQotCQkJU3RyaW5nIGRsZ01zZyA9IE5MUy5iaW5kKAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQsCi0JCQkJCVN0clV0aWwudG9Mb3dlcihmZWF0dXJlVHh0KSwgZWxlbWVudC5nZXROYW1lKCkpOwotCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IChTdHJpbmcpIGVsZW1lbnQuZUdldChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0KLQkJCUlJbnB1dFZhbGlkYXRvciBpbnB1dFZhbGlkYXRvciA9IG5ldyBJSW5wdXRWYWxpZGF0b3IoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCXJldHVybiB2YWxpZGF0b3IuaXNWYWxpZChuZXdUZXh0KTsKLQkJCQl9Ci0JCQl9OwotCi0JCQlJbnB1dERpYWxvZyBpbnB1dERsZyA9IG5ldyBJbnB1dERpYWxvZygKLQkJCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLCB0aXRsZSwgZGxnTXNnLCBjdXJyZW50VmFsdWUsCi0JCQkJCWlucHV0VmFsaWRhdG9yKTsKLQkJCWlmIChpbnB1dERsZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIGlucHV0RGxnLmdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8qKgotCSAqIERpYWdyYW0gZWRpdG9ycyBvZiBvYmplY3QgaXRzZWxmIHdpbGwgYmUgY2xvc2VkLiBBbmQgUGFyZW50IGRpYWdyYW0gZWRpdG9ycyAKLQkgKiB3aWxsIGJlIHJlZnJlc2hlZC4gIAotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoT3BlbkRpYWdyYW1FZGl0b3JzT2ZQYXJlbnQoT2JqZWN0IHJlZnJlc2hFbGVtZW50LCBqYXZhLnV0aWwuTGlzdCBvcGVuRWRpdG9yUmVmcykgewotCQlvcGVuRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gTm93IHJlZnJlc2ggb2JqZWN0J3MgcGFyZW50J3MgZGlhZ3JhbXMuCi0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBiaW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KWlucHV0OwotCQkJCQlpZiAoYmlucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gYmlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJT2JqZWN0IHBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZWxlbWVudCkuZ2V0UGFyZW50KG51bGwpOwotCQkJCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkJaWYoZWxlbWVudC5lcXVhbHMocmVmcmVzaEVsZW1lbnQpKQotCQkJCQkJCQkJcmVmcmVzaE9wZW5EaWFncmFtRWRpdG9yc09mUGFyZW50KHBhcmVudCwgb3BlbkVkaXRvclJlZnMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVsZW1lbnQgPSBiaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfSAKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKQotCQkJCXsKLQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJCWlmKCgoQWN0aXZpdHkpZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhyZWZyZXNoRWxlbWVudCkpCi0JCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQllbHNlIGlmKHJlZnJlc2hFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCU9iamVjdCBsb2NhbFJlZnJlc2hFbGVtZW50ID0gcmVmcmVzaEVsZW1lbnQ7Ci0JCQkJCQkJd2hpbGUoKGxvY2FsUmVmcmVzaEVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkJCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbG9jYWxSZWZyZXNoRWxlbWVudCkuZ2V0T3duZXIoKSE9IG51bGwpewotCQkJCQkJCQlpZigoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWxvY2FsUmVmcmVzaEVsZW1lbnQpLmdldE93bmVyKCkKLQkJCQkJCQkJCQkuZXF1YWxzKGVsZW1lbnQpKXsKLQkJCQkJCQkJCW9wZW5FZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWxvY2FsUmVmcmVzaEVsZW1lbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWxvY2FsUmVmcmVzaEVsZW1lbnQpLmdldE93bmVyKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9ZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJQ29sbGVjdGlvbiBjID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCQkJCWlmKGMgIT0gbnVsbCAmJiBjLmNvbnRhaW5zKHJlZnJlc2hFbGVtZW50KSl7Ci0JCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gb3BlbkVkaXRvclJlZnMuc2l6ZSgpOwotCQkvL0lFZGl0b3JSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IElFZGl0b3JSZWZlcmVuY2Vbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChJRWRpdG9yUmVmZXJlbmNlKSBvcGVuRWRpdG9yUmVmcy5nZXQoaSk7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYoZWRpdG9yIGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yICl7Ci0JCQkJKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpZWRpdG9yKS5yZWZyZXNoRGlhZ3JhbSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENsb3NlIGRpYWdyYW0gZWRpdG9ycyBpbmNsdWRpbmcgcGFyZW50IGVkaXRvcnMKLQkgKiBAcGFyYW0gY2xvc2VFbGVtZW50Ci0JICogQHBhcmFtIGNsb3NlRWRpdG9yUmVmcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZURpYWdyYW1FZGl0b3JzSW5jbHVkaW5nUGFyZW50KE9iamVjdCBjbG9zZUVsZW1lbnQsIGphdmEudXRpbC5MaXN0IGNsb3NlRWRpdG9yUmVmcykgewotCQljbG9zZUVkaXRvclJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBiaW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KWlucHV0OwotCQkJCQlpZiAoYmlucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gYmlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJT2JqZWN0IHBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZWxlbWVudCkuZ2V0UGFyZW50KG51bGwpOwotCQkJCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkJaWYoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkKLQkJCQkJCQkJCWNsb3NlRGlhZ3JhbUVkaXRvcnNJbmNsdWRpbmdQYXJlbnQocGFyZW50LCBjbG9zZUVkaXRvclJlZnMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVsZW1lbnQgPSBiaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfSAKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKQotCQkJCXsKLQkJCQkJCS8vY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQkJaWYoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkKLQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkKLQkJCQkJCWlmKCgoQWN0aXZpdHkpZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhjbG9zZUVsZW1lbnQpKQotCQkJCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCWVsc2UgaWYoY2xvc2VFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpY2xvc2VFbGVtZW50KS5nZXRPd25lcigpCi0JCQkJCQkJCQkhPSBudWxsKQotCQkJCQkJCQlpZigoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWNsb3NlRWxlbWVudCkuZ2V0T3duZXIoKQotCQkJCQkJCQkJLmVxdWFscyhlbGVtZW50KSl7Ci0JCQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpY2xvc2VFbGVtZW50KS5nZXRPd25lcigpCi0JCQkJCQkJCQlpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkJCQkJCQkJY2xvc2VFbGVtZW50KS5nZXRPd25lcigpKS5nZXRPd25lcigpLmVxdWFscyhlbGVtZW50KSkKLQkJCQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX1lbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQlDb2xsZWN0aW9uIGMgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWVsZW1lbnQpLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQkJCQkJaWYoYyAhPSBudWxsICYmIGMuY29udGFpbnMoY2xvc2VFbGVtZW50KSl7Ci0JCQkJCQkJY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gY2xvc2VFZGl0b3JSZWZzLnNpemUoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlZmVyZW5jZXNbaV0gPSAoSUVkaXRvclJlZmVyZW5jZSkgY2xvc2VFZGl0b3JSZWZzLmdldChpKTsKLQkJfQotCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZlcmVuY2VzLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCBiYXNlIGFjdGl2aXR5IGZvciB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICogCQkJQmFzZSBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlFbGVtZW50IGdldEJhc2VBY3Rpdml0eShBY3Rpdml0eSBhY3Rpdml0eSl7Ci0JCXdoaWxlICghYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkuZXF1YWxzKAotCQkJCVZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKSkgewotCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBhY3Rpdml0eQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKCh2ZSAhPSBudWxsKSAmJiAodmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgdmU7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Rpdml0eTsKLQl9Ci0JCi0JLyoqCi0JICogQ2xvc2UgZGlhZ3JhbSBlZGl0b3JzCi0JICogCi0JICogQHBhcmFtIGNsb3NlRWxlbWVudAotCSAqIEBwYXJhbSBjbG9zZUVkaXRvclJlZnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VEaWFncmFtRWRpdG9ycyhPYmplY3QgY2xvc2VFbGVtZW50LCBqYXZhLnV0aWwuTGlzdCBjbG9zZUVkaXRvclJlZnMpIHsKLQkJY2xvc2VFZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgYmlucHV0ID0gKEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dClpbnB1dDsKLQkJCQkJaWYgKGJpbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCkgewotCQkJCQkJZWxlbWVudCA9IGJpbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCU9iamVjdCBwYXJlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWVsZW1lbnQpLmdldFBhcmVudChlbGVtZW50KTsKLQkJCQkJCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJCWlmKGVsZW1lbnQuZXF1YWxzKGNsb3NlRWxlbWVudCkpCi0JCQkJCQkJCQljbG9zZURpYWdyYW1FZGl0b3JzKHBhcmVudCwgY2xvc2VFZGl0b3JSZWZzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllbGVtZW50ID0gYmlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0gCi0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmVxdWFscyhjbG9zZUVsZW1lbnQpKQotCQkJCXsKLQkJCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IHNpemUgPSBjbG9zZUVkaXRvclJlZnMuc2l6ZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBJRWRpdG9yUmVmZXJlbmNlW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmZXJlbmNlc1tpXSA9IChJRWRpdG9yUmVmZXJlbmNlKSBjbG9zZUVkaXRvclJlZnMuZ2V0KGkpOwotCQl9Ci0JCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3JzKHJlZmVyZW5jZXMsIGZhbHNlKTsKLQkJcmVmZXJlbmNlcyA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIERpYWdyYW0gZWRpdG9ycyBvZiBvYmplY3QgaXRzZWxmIHdpbGwgYmUgY2xvc2VkLiBBbmQgUGFyZW50IGRpYWdyYW0gZWRpdG9ycyAKLQkgKiB3aWxsIGJlIHJlZnJlc2hlZC4gIGNvZGUgbm90IHRlc3RlZCB1c2UgcmVmcmVzaE9wZW5EaWFncmFtRWRpdG9ycyBtZXRob2QuCi0JICogQHBhcmFtIG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzeW5jRGlhZ3JhbUVkaXRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlqYXZhLnV0aWwuTGlzdCBjbG9zZUVkaXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWphdmEudXRpbC5MaXN0IHJlZnJlc2hFZGl0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCU9iamVjdCBlZGl0b3JFbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGJpbnB1dCA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQ7Ci0JCQkJCWlmKGJpbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCl7Ci0JCQkJCQllZGl0b3JFbGVtZW50ID0gYmlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJfWVsc2V7Ci0JCQkJCQllZGl0b3JFbGVtZW50ID0gYmlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihlZGl0b3JFbGVtZW50ICE9IG51bGwpewotCQkJCQlpZihlZGl0b3JFbGVtZW50LmVxdWFscyhvYmplY3QpKXsKLQkJCQkJCWNsb3NlRWRpdG9ycy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJfWVsc2V7Ci0JCQkJCQlpZihlZGl0b3JFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQkJCWlmKCgoQWN0aXZpdHkpZWRpdG9yRWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhvYmplY3QpKQotCQkJCQkJCQlyZWZyZXNoRWRpdG9ycy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkJT2JqZWN0IGxvY2FsID0gb2JqZWN0OwotCQkJCQkJCQl3aGlsZSgobG9jYWwgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkJCQkJCQkmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWxvY2FsKS5nZXRPd25lcigpIT0gbnVsbCl7Ci0JCQkJCQkJCQlpZigoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWxvY2FsKS5nZXRPd25lcigpCi0JCQkJCQkJCQkJCS5lcXVhbHMoZWRpdG9yRWxlbWVudCkpewotCQkJCQkJCQkJCXJlZnJlc2hFZGl0b3JzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJbG9jYWwgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWxvY2FsKS5nZXRPd25lcigpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfWVsc2UgaWYoZWRpdG9yRWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQlDb2xsZWN0aW9uIGMgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWVkaXRvckVsZW1lbnQpLmdldENoaWxkcmVuKGVkaXRvckVsZW1lbnQpOwotCQkJCQkJCWlmKGMgIT0gbnVsbCAmJiBjLmNvbnRhaW5zKG9iamVjdCkpewotCQkJCQkJCQlyZWZyZXNoRWRpdG9ycy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gQ2xvc2UgZWRpdG9yIHJlZmVyZW5jZXMgYW5kIHJlZnJlc2ggZWRpdG9ycy4KLQkJaW50IHNpemUgPSBjbG9zZUVkaXRvcnMuc2l6ZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBJRWRpdG9yUmVmZXJlbmNlW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmZXJlbmNlc1tpXSA9IChJRWRpdG9yUmVmZXJlbmNlKSBjbG9zZUVkaXRvcnMuZ2V0KGkpOwotCQl9Ci0JCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3JzKHJlZmVyZW5jZXMsIGZhbHNlKTsKLQkJcmVmZXJlbmNlcyA9IG51bGw7Ci0JCQotCQlzaXplID0gcmVmcmVzaEVkaXRvcnMuc2l6ZSgpOwotCQkvL0lFZGl0b3JSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IElFZGl0b3JSZWZlcmVuY2Vbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChJRWRpdG9yUmVmZXJlbmNlKSByZWZyZXNoRWRpdG9ycy5nZXQoaSk7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYoZWRpdG9yIGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yICl7Ci0JCQkJKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpZWRpdG9yKS5yZWZyZXNoRGlhZ3JhbSgpOwotCQkJfQotCQl9Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1VJTGF5b3V0SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9VSUxheW91dEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNWZlMGM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1VJTGF5b3V0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkZvcm1Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLQotLyoqCi0gKiBMYXlvdXQgSGVscGVyIGZvciBVSS4gCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUxheW91dEhlbHBlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21wb3NpdGUgZWRpdG9yQ29tcG9zaXRlLCBwcmV2aWV3Q29tcG9zaXRlOwotCi0JcHJpdmF0ZSBzdGF0aWMgQ1RhYkZvbGRlciB0YWJGb2xkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGFicyBpbiBmb3JtIAotCSAqIEBwYXJhbSBmb3JtCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlVGFicyhTY3JvbGxlZEZvcm0gZm9ybSwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQkvLyBjcmVhdGUgdGFiZm9sZGVyCi0JCXRhYkZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKGZvcm0uZ2V0Qm9keSgpLCBTV1QuRkxBVCB8IFNXVC5UT1ApOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQl0YWJGb2xkZXIuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0KLQkJLy8gc2V0IHRhYmZvbGRlciBiYWNrZ3JvdW5kIGNvbG9yCi0JCUNvbG9yIHNlbGVjdGVkQ29sb3IgPSB0b29sa2l0LmdldENvbG9ycygpCi0JCQkJLmdldENvbG9yKEZvcm1Db2xvcnMuU0VQQVJBVE9SKTsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbkJhY2tncm91bmQobmV3IENvbG9yW10geyBzZWxlY3RlZENvbG9yLAotCQkJCXRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0QmFja2dyb3VuZCgpIH0sIG5ldyBpbnRbXSB7IDUwIH0pOwotCi0JCS8vIGNyZWF0ZSBlZGl0b3IgdGFiIGl0ZW0gYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBvc2l0ZQotCQlDVGFiSXRlbSBlZGl0b3JJdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5VTEwpOwotCQllZGl0b3JJdGVtLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkVESVRPUl9URVhUKTsKLQkJZWRpdG9yQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQpOwotCQllZGl0b3JJdGVtLnNldENvbnRyb2woZWRpdG9yQ29tcG9zaXRlKTsKLQotCQkvLyBjcmVhdGUgcHJldmlldyB0YWIgaXRlbSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY29tcG9zaXRlCi0JCUNUYWJJdGVtIHByZXZpZXdJdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5VTEwpOwotCQlwcmV2aWV3SXRlbS5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5QUkVWSUVXX1BBR0VfVElUTEUpOwotCQlwcmV2aWV3Q29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQpOwotCQlwcmV2aWV3SXRlbS5zZXRDb250cm9sKHByZXZpZXdDb21wb3NpdGUpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHRhYkZvbGRlcik7Ci0KLQkJdG9vbGtpdC5hZGFwdCh0YWJGb2xkZXIsIHRydWUsIHRydWUpOwotCi0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGNvbXBvc2l0ZSBvbiB0aGUgZm9ybQotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogQHJldHVybgotCSAqIAkJCVVJIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUodGFiRm9sZGVyKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgVGFibGVXcmFwTGF5b3V0KCkpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGVkaXRvciBjb21wb3NpdGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlVSSBDb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBnZXRFZGl0b3JDb21wb3NpdGUoKSB7Ci0JCXJldHVybiBlZGl0b3JDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHByZXZpZXcgY29tcG9zaXRlCi0JICogCi0JICogQHJldHVybgotCSAqIAkJUHJldmlldyBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBnZXRQcmV2aWV3Q29tcG9zaXRlKCkgewotCQlyZXR1cm4gcHJldmlld0NvbXBvc2l0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTY0NTY1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciB0aGUgQXV0aG9yaW5nIFVJLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9BYnN0cmFjdEJhc2VWaWV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQWJzdHJhY3RCYXNlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4Yjg5MGExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9BYnN0cmFjdEJhc2VWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIE1ldGhvZCBMaWJyYXJ5IHZpZXdzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCYXNlVmlldyBleHRlbmRzIFNhdmVhYmxlTGlicmFyeVZpZXdQYXJ0Ci0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5Qcm92aWRlciwgSVNlbGVjdGlvblByb3ZpZGVyLAotCQlJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciwgSU1lbnVMaXN0ZW5lciwgSVZpZXdlclByb3ZpZGVyLCBJR290b01hcmtlciB7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7Ci0KLQlwcm90ZWN0ZWQgVUlBY3Rpb25EaXNwYXRjaGVyIGFjdGlvbkRpc3BhdGNoZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJvdGVjdGVkIElMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgYWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAocGFydCA9PSBBYnN0cmFjdEJhc2VWaWV3LnRoaXMpIHsKLQkJCQloYW5kbGVBY3RpdmF0ZShwYXJ0KTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgYWN0aXZhdGlvbiBvZiB0aGlzIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkvLyBTZXQgdGhlIHJpZ2h0IGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIGVkaXRpbmcgZG9tYWluLgotCQllZGl0aW5nRG9tYWluLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQotCQkvLyBSZWNvbXB1dGUgdGhlIHJlYWQgb25seSBzdGF0ZS4KLQkJaWYgKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkgIT0gbnVsbCkgewotCQkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKS5jbGVhcigpOwotCi0JCQkvLyBSZWZyZXNoIGFueSBhY3Rpb25zIHRoYXQgbWF5IGJlY29tZSBlbmFibGVkIG9yIGRpc2FibGVkLgotCQkJc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsKLQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX0ZpbGVDb25mbGljdF9sYWJlbDsgCi0JCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5fV0FSTl9GaWxlQ29uZmxpY3Q7IAotCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlQcm9tcHQoCi0JCQkJdGl0bGUsIG1zZyk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBjaGFuZ2VkIHJlc291cmNlcyB3aGVuIHRoaXMgdmlldyBpcyBhY3RpdmF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0KCk7Ci0KLQkJYWN0aW9uRGlzcGF0Y2hlciA9IG5ldyBVSUFjdGlvbkRpc3BhdGNoZXIodGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSB2aWV3ZXIuCi0JCWNyZWF0ZVZpZXdlcihwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgYWN0aW9uIGJhciBjb250cmlidXRvci4KLQkJdHJ5IHsKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yID0gY3JlYXRlQWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLmluaXQoZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCksIGdldFNpdGUoKQotCQkJCQkuZ2V0UGFnZSgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JCS8vIEFkZCBhIHNlbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSB2aWV3ZXIuCi0JCVZpZXdlciB2aWV3ZXIgPSBnZXRWaWV3ZXIoKTsKLQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgKLQkJCQkJCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgc2VsZWN0aW9uQ2hhbmdlZEV2ZW50KSB7Ci0JCQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBBZGQgYSBsaWJyYXJ5IHNlcnZpY2UgbGlzdGVuZXIuCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIodGhpcyk7Ci0KLQkJT2JqZWN0IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCXNldElucHV0Rm9yVmlld2VyKGxpYnJhcnkpOwotCQkJTGlicmFyeVVJVXRpbC51cGRhdGVTaGVsbFRpdGxlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQllZGl0aW5nRG9tYWluID0gbWFuYWdlci5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IChDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBlZGl0aW5nRG9tYWluCi0JCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0KLQkJSVZpZXdTaXRlIHNpdGUgPSAoSVZpZXdTaXRlKSB0aGlzLmdldFNpdGUoKTsKLQkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKLQkJc2l0ZS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKLQkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKLQkJTWVudSBtZW51ID0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIHZpZXdlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lciNtZW51QWJvdXRUb1Nob3cob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCXRyeSB7Ci0JCQlhY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVWaWV3KHRoaXMpOwotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3IubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXIjZ2V0RWRpdGluZ0RvbWFpbigpCi0JICovCi0JcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWFjdGlvbkRpc3BhdGNoZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3JlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlhY3Rpb25EaXNwYXRjaGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjZ2V0QWRhcHRlcihDbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7Ci0JCWlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNnZXRTZWxlY3Rpb24oKQotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGFjdGlvbkRpc3BhdGNoZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNzZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRTZWxlY3Rpb24odGhpcywgc2VsZWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb25Qcm92aWRlciBzb3VyY2UsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWFjdGlvbkRpc3BhdGNoZXIuc2V0U2VsZWN0aW9uKHNvdXJjZSwgc2VsZWN0aW9uKTsKLQkJVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuc2V0U2VsZWN0aW9uKHNvdXJjZSwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlzZXRJbnB1dEZvclZpZXdlcihudWxsKTsKLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJKChDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJc2V0SW5wdXRGb3JWaWV3ZXIobGlicmFyeSk7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLnNldEFjdGl2ZVZpZXcoQWJzdHJhY3RCYXNlVmlldy50aGlzKTsKLQkJCUxpYnJhcnlVSVV0aWwudXBkYXRlU2hlbGxUaXRsZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKAotCQkvLyByZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQotCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCi0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCSgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmIChhY3Rpb25CYXJDb250cmlidXRvci5nZXRBY3RpdmVWaWV3KCkgPT0gdGhpcykgewotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlVmlldyhudWxsKTsKLQkJfQotCi0JCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5IHNoZWV0LgotCSAqLwotCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7Ci0JCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZSA9IG5ldyBQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBtYWtlQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsCi0JCQkJCQlJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsCi0JCQkJCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsKLQkJCQkJc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLAotCQkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLQkJCQkJaWYgKGFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLAotCQkJCQkJCQlhY3Rpb25CYXJzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZQotCQkJCQkuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydHlTaGVldFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXIjZ290b01hcmtlcihJTWFya2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJdHJ5IHsKLQkJCWlmIChtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhFVmFsaWRhdG9yLk1BUktFUikpIHsKLQkJCQlTdHJpbmcgdXJpQXR0cmlidXRlID0gbWFya2VyLmdldEF0dHJpYnV0ZSgKLQkJCQkJCUVWYWxpZGF0b3IuVVJJX0FUVFJJQlVURSwgbnVsbCk7Ci0JCQkJaWYgKHVyaUF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaUF0dHJpYnV0ZSk7Ci0JCQkJCUVPYmplY3QgZU9iamVjdCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKQotCQkJCQkJCS5nZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7Ci0JCQkJCWlmIChlT2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zCi0JCQkJCQkJCS5zaW5nbGV0b24oZWRpdGluZ0RvbWFpbi5nZXRXcmFwcGVyKGVPYmplY3QpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBzZWxlY3Rpb24gaW50byB3aGljaGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJZmluYWwgQ29sbGVjdGlvbiB0aGVTZWxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCQlpZiAodGhlU2VsZWN0aW9uICE9IG51bGwgJiYgIXRoZVNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgY29udGVudCB2aWV3ZXIgb2YKLQkJCQkJLy8gdGhlIGVkaXRvci4KLQkJCQkJVmlld2VyIHZpZXdlciA9IGdldFZpZXdlcigpOwotCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCXRoZVNlbGVjdGlvbi50b0FycmF5KCkpLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlydW5uYWJsZS5ydW4oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgVmlld2VyIGdldFZpZXdlcigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmlld2VyIGluIHRoZSBnaXZlbiBwYXJlbnQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogQHJldHVybiBhIG5ldyBhY3Rpb25CYXJDb250cmlidXRlcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGNyZWF0ZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbnB1dCBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBtb2RlbCBuZXcgaW5wdXQgZm9yIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJbnB1dEZvclZpZXdlcihPYmplY3QgbW9kZWwpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZGJjNWIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5Mb2NhbFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuQ29uZmlndXJhdGlvblZpZXdFZGl0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQuTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuSFRNTFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBjb250ZW50IG9mIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogPHA+Ci0gKiBUaGUgY3VycmVudCBjb25maWd1cmF0aW9uIGlzIHNldCB2aWEgdGhlIENvbmZpZ3VyYXRpb24gY29tYm9ib3ggaW4gdGhlIHN5c3RlbQotICogdG9vbGJhci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25WaWV3IGV4dGVuZHMgQWJzdHJhY3RCYXNlVmlldyBpbXBsZW1lbnRzCi0JCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhlIHZpZXcgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19JRCA9IENvbmZpZ3VyYXRpb25WaWV3LmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgU3RyaW5nIGNvbmZpZ05hbWU7Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXByaXZhdGUgSURvdWJsZUNsaWNrTGlzdGVuZXIgZG91YmxlQ2xpY2tMaXN0ZW5lcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25WaWV3KCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNpbml0KElWaWV3U2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3U2l0ZSBzaXRlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzdXBlci5pbml0KHNpdGUpOwotCQljcmVhdGVBY3Rpb25zKHNpdGUpOwotCQlMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVBhcnRDb250cm9sKHBhcmVudCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsCi0JCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09ORklHVVJBVElPTl9WSUVXX0NPTlRFWFQpOwotCi0JCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKGFkYXB0ZXJGYWN0b3J5LAotCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJYWRhcHRlckZhY3RvcnkgPSAoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgZWRpdGluZ0RvbWFpbgotCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCi0JCS8vIE9wZW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkJc2V0Q29uZmlndXJhdGlvbihudWxsKTsKLQotCQkvLyBBZGQgYSBsaWJyYXJ5IGNoYW5nZSBsaXN0ZW5lci4KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLmFkZExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJc2V0SW5wdXRGb3JWaWV3ZXIobnVsbCk7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCSgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeVNldChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXNldE1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIjbGlicmFyeUNoYW5nZWQoaW50LCBDb2xsZWN0aW9uKQotCSAqLwkKLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNoYW5nZWRJdGVtcykgewotCQlzd2l0Y2ggKG9wdGlvbikgewotCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQ6Ci0JCQlpZiAoY2hhbmdlZEl0ZW1zICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hhbmdlZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQkJaWYgKCgoTWV0aG9kQ29uZmlndXJhdGlvbikgZWxlbWVudCkuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCQkJZ2V0Q3VycmVudENvbmZpZygpKSkgewotCQkJCQkJCXNldE1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IHZpZXdlZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50Q29uZmlnKCkgewotCQlyZXR1cm4gY29uZmlnTmFtZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWFjdGlvbkJhckNvbnRyaWJ1dG9yLnNldEFjdGl2ZVZpZXcodGhpcyk7Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0ZWQuaXNFbXB0eSgpKQotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3IuZGlzYWJsZUdsb2JhbEVkaXRNZW51KCk7Ci0JCWVsc2UKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLmVuYWJsZUdsb2JhbEVkaXRNZW51KCk7Ci0KLQkJaWYgKHRyZWVWaWV3ZXIgIT0gbnVsbCkgewotCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGNvbnRyb2xzLgotCQlDb21wb3NpdGUgY29udGVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29udGVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoY29udGVudCk7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIEFkZCBkcmFnLWFuZC1kcm9wIHN1cHBvcnQuCi0JCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkU7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKLQkJCQlMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKLQkJdHJlZVZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsCi0JCQkJbmV3IExpYnJhcnlWaWV3ZXJEcmFnQWRhcHRlcih0cmVlVmlld2VyKSk7Ci0KLQkJLy8gQWRkIGEgZG91YmxlIGNsaWNrIGxpc3RlbmVyLgotCQlkb3VibGVDbGlja0xpc3RlbmVyID0gbmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLmhhbmRsZURvdWJsZUNsaWNrRXZlbnQoZXZlbnQpOwotCQkJfQotCQl9OwotCQl0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIoZG91YmxlQ2xpY2tMaXN0ZW5lcik7Ci0KLQkJY3JlYXRlQ29udGV4dE1lbnVGb3IodHJlZVZpZXdlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgYWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVBY3Rpb25zKElWaWV3U2l0ZSB2aWV3U2l0ZSkgewotCQlJQWN0aW9uIGVkaXRBY3Rpb24gPSBuZXcgQWN0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbkxhYmVsX2VkaXQpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVUlBY3Rpb25EaXNwYXRjaGVyLmVkaXRDb25maWd1cmF0aW9uKGNvbmZpZ05hbWUpOwotCQkJfQotCQl9OwotCQllZGl0QWN0aW9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRDb25maWd1cmF0aW9uX3Rvb2x0aXApOyAKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzZXQoKSB7Ci0JCS8vIFByZXZlbnQgbWVtb3J5IGxlYWsuCi0JCWNvbmZpZ05hbWUgPSBudWxsOwotCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJCQkoKElEaXNwb3NhYmxlKSBhZGFwdGVyRmFjdG9yeSkuZGlzcG9zZSgpOwotCQkJfQotCQkJYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl9Ci0JCWVkaXRpbmdEb21haW4uc2V0QWRhcHRlckZhY3RvcnkobnVsbCk7Ci0JCUlDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gdHJlZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCUlCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gdHJlZVZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gZW1wdHlTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotCQlhY3Rpb25EaXNwYXRjaGVyLnNldFNlbGVjdGlvbihlbXB0eVNlbGVjdGlvbik7Ci0JCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLnNldFNlbGVjdGlvbihlbXB0eVNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZ2l2ZW4gTWV0aG9kIENvbmZpZ3VyYXRpb24gYXMgdGhpcyB2aWV3ZXIncyBpbnB1dAotCSAqIEBwYXJhbSBjb25maWcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUNvbnRyb2wgY3RybCA9IHRoaXMuZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAodHJlZVZpZXdlci5nZXRJbnB1dCgpID09IGNvbmZpZykKLQkJCXJldHVybjsKLQkJU3RyaW5nIHRpdGxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCXRoaXMuY29uZmlnTmFtZSA9IGNvbmZpZy5nZXROYW1lKCk7Ci0JCQlJRmlsdGVyIGNvbmZpZ0ZpbHRlciA9IG5ldyBDb25maWd1cmF0aW9uRmlsdGVyKGNvbmZpZywgdHJlZVZpZXdlcik7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uVmlld19BZGFwdGVyRmFjdG9yeShjb25maWdGaWx0ZXIpOwotCQkJZWRpdGluZ0RvbWFpbi5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0JCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IENvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyKGNvbmZpZywKLQkJCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJCXRpdGxlID0gY29uZmlnLmdldE5hbWUoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFByZXZlbnQgbWVtb3J5IGxlYWsuCi0JCQljb25maWdOYW1lID0gbnVsbDsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJCQkJKChJRGlzcG9zYWJsZSkgYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCQkJZWRpdGluZ0RvbWFpbi5zZXRBZGFwdGVyRmFjdG9yeShudWxsKTsKLQkJCUlDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gdHJlZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IHRyZWVWaWV3ZXIuZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJfQotCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBlbXB0eVNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0JCQlhY3Rpb25EaXNwYXRjaGVyLnNldFNlbGVjdGlvbihlbXB0eVNlbGVjdGlvbik7Ci0JCQlVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5zZXRTZWxlY3Rpb24oZW1wdHlTZWxlY3Rpb24pOwotCQl9Ci0KLQkJdHJlZVZpZXdlci5zZXRJbnB1dChjb25maWcpOwotCQlzZXRDb250ZW50RGVzY3JpcHRpb24odGl0bGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhpcyB2aWV3ZXIncyBpbnB1dCB0byB0aGUgTWV0aG9kIENvbmZpZ3VyYXRpb24KLQkgKiB3aXRoIHRoZSBnaXZlbiBuYW1lIAotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihTdHJpbmcgbmFtZSkgewotCQljb25maWdOYW1lID0gbmFtZTsKLQotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQljb25maWdOYW1lID0gY29uZmlnLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChjb25maWdOYW1lICE9IG51bGwpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgY29uZmlnTmFtZSk7Ci0JCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5jb25maWdOYW1lID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChkb3VibGVDbGlja0xpc3RlbmVyICE9IG51bGwpIHsKLQkJCXRyZWVWaWV3ZXIucmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihkb3VibGVDbGlja0xpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIENvbmZpZ3VyYXRpb25WaWV3IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvblZpZXcgZ2V0VmlldygpIHsKLQkJdHJ5IHsKLQkJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJSVZpZXdQYXJ0IHZpZXcgPSBhY3RpdmVQYWdlLmZpbmRWaWV3KFZJRVdfSUQpOwotCQkJCWlmICh2aWV3ID09IG51bGwpIHsKLQkJCQkJdmlldyA9IGFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoVklFV19JRCk7Ci0JCQkJfQotCQkJCXJldHVybiAoQ29uZmlndXJhdGlvblZpZXcpIHZpZXc7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I2dldFZpZXdlcigpCi0JICovCi0JcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0JCXJldHVybiB0cmVlVmlld2VyOwotCX0KLQotCXByaXZhdGUgY2xhc3MgQ29uZmlndXJhdGlvblZpZXdBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzCi0JCQlMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JCXByaXZhdGUgTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbiBsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uOwotCi0JCXB1YmxpYyBDb25maWd1cmF0aW9uVmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yKEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbikgewotCQkJc3VwZXIoZWRpdGluZ0RvbWFpbik7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQoSUFjdGlvbkJhcnMpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJCXZpZXdBY3Rpb25CYXJzID0gYWN0aW9uQmFyczsKLQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uID0gbmV3IENvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbigKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uTGFiZWxfZWRpdCk7IAotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCQkib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLm9wZW5FbGVtZW50IiwgLy8kTk9OLU5MUy0xJAotCQkJCQljb25maWdWaWV3RWRpdEFjdGlvbik7Ci0JCQlsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uID0gbmV3IExpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24oCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbkxhYmVsX2ZpbmRFbGVtZW50SW5MaWJOYXYpOyAKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQkJTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbi5BQ1RJT05fSUQsIAotCQkJCQlsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjYWN0aXZhdGUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCQlhY3RpdmVWaWV3UGFydC5hZGRQcm9wZXJ0eUxpc3RlbmVyKHRoaXMpOwotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJU2VsZWN0aW9uUHJvdmlkZXIgPyAoSVNlbGVjdGlvblByb3ZpZGVyKSBhY3RpdmVWaWV3UGFydAotCQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGNvbmZpZ1ZpZXdFZGl0QWN0aW9uKTsKLQkJCXNlbGVjdGlvblByb3ZpZGVyCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbik7Ci0JCQl1cGRhdGUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNkZWFjdGl2YXRlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCQlhY3RpdmVWaWV3UGFydC5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKHRoaXMpOwotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJU2VsZWN0aW9uUHJvdmlkZXIgPyAoSVNlbGVjdGlvblByb3ZpZGVyKSBhY3RpdmVWaWV3UGFydAotCQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjb25maWdWaWV3RWRpdEFjdGlvbik7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlcgotCQkJCQkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI3VwZGF0ZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBhY3RpdmVWaWV3UGFydCBpbnN0YW5jZW9mIElTZWxlY3Rpb25Qcm92aWRlciA/IChJU2VsZWN0aW9uUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0Ci0JCQkJCTogYWN0aXZlVmlld1BhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uID8gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24KLQkJCQkJOiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCQkJY29uZmlnVmlld0VkaXRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjZGlzYWJsZUdsb2JhbEVkaXRNZW51KCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc2FibGVHbG9iYWxFZGl0TWVudSgpIHsKLQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2VuYWJsZUdsb2JhbEVkaXRNZW51KCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVuYWJsZUdsb2JhbEVkaXRNZW51KCkgewotCQkJY29uZmlnVmlld0VkaXRBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQkJLy8gQWRkIG91ciBzdGFuZGFyZCBtYXJrZXJzLgotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImVkaXQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gQWRkIG91ciBvdGhlciBzdGFuZGFyZCBtYXJrZXIuCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlhZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKLQotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oY29uZmlnVmlld0VkaXRBY3Rpb24pKTsKLQkJCWlmIChQZXJzcGVjdGl2ZUxpc3RVdGlsLmlzQXV0aG9yaW5nUGVyc3BlY3RpdmUoKSkgewotCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSgKLQkJCQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24pKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I2NyZWF0ZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCkKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciBjcmVhdGVBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uVmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yKGVkaXRpbmdEb21haW4pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I3NldElucHV0Rm9yVmlld2VyKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dEZvclZpZXdlcihPYmplY3QgbW9kZWwpIHsKLQkJaWYgKChtb2RlbCA9PSBudWxsKSB8fCAobW9kZWwgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSkgewotCQkJc2V0TWV0aG9kQ29uZmlndXJhdGlvbigoTWV0aG9kQ29uZmlndXJhdGlvbikgbW9kZWwpOwotCQl9IGVsc2UgewotCQkJcmVzZXQoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgU3RyaW5nIG5hbWUpewotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWlmKG1ldGhvZENvbmZpZyA9PSBjb25maWcpewotCQkJc2V0Q29udGVudERlc2NyaXB0aW9uKG5hbWUpOwotCQl9Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYmY5OGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIHNlbGVjdGFibGUgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIG9mIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gYQotICogdHJlZSB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25WaWV3ZXIgZXh0ZW5kcyBDaGVja2JveFRyZWVWaWV3ZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyB0aGUgZ2l2ZW4gZWxlbWVudCBpbiB0aGUgdHJlZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oT2JqZWN0IGVsZW1lbnQpIHsKLQkJc3VwZXIuZXhwYW5kVG9MZXZlbChlbGVtZW50LCAwKTsKLQkJV2lkZ2V0IGN0cmwgPSBzdXBlci5maW5kSXRlbShlbGVtZW50KTsKLQkJaWYgKGN0cmwgIT0gbnVsbCkgewotCQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWl0ZW1zLmFkZChjdHJsKTsKLQkJCXN1cGVyLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JCQl0aGlzLmdldFRyZWUoKS5zZXRGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBjb250ZW50IG9mIHRoZSB2aWV3ZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaChmaW5hbCBPYmplY3QgZWxlbWVudCwgZmluYWwgYm9vbGVhbiB1cGRhdGVMYWJlbHMpIHsKLQkJT2JqZWN0W10gY2hlY2tlZCA9IHRoaXMuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCXN1cGVyLnJlZnJlc2goZWxlbWVudCwgdXBkYXRlTGFiZWxzKTsKLQkJdGhpcy5zZXRDaGVja2VkRWxlbWVudHMoY2hlY2tlZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29udGVudFZpZXcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db250ZW50Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjBlNzI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db250ZW50Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWN0aXZpdHlEaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuTmV3QWN0aXZpdHlEaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkJyb3dzaW5nUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5VSUFjdGlvbkRpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotCi0vKioKLSAqIFRoZSBDb250ZW50IHZpZXcuCi0gKiA8cD4KLSAqIERpc3BsYXlzIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgTWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCi0JLyoqCi0JICogVGhlIHZpZXcgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19JRCA9IENvbnRlbnRWaWV3LmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgRWxlbWVudEhUTUxWaWV3ZXIgY29udGVudFZpZXdlcjsKLQotCXByaXZhdGUgT2JqZWN0IGRpc3BsYXllZEVsZW1lbnQ7Ci0KLQlwcml2YXRlIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0gbmV3IElQYXJ0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJaGFuZGxlU2VsZWN0aW9uKFVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRTZWxlY3Rpb25Tb3VyY2UoKSwgVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQloYW5kbGVTZWxlY3Rpb24oZXZlbnQuZ2V0U291cmNlKCksIGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlicmFyeUNoYW5nZUxpc3RlbmVyID0gbmV3IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDaGFuZ2VkKGludCBvcHRpb24sIENvbGxlY3Rpb24gY2hhbmdlZEl0ZW1zKSB7Ci0vLwkJCWlmIChvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTE9BREVECi0vLwkJCQkJfHwgb3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NSRUFURUQpIHsKLS8vCQkJCWlmIChjb250ZW50Vmlld2VyICE9IG51bGwpIHsKLS8vCQkJCQljb250ZW50Vmlld2VyLnNldEh0bWxCdWlsZGVyKG5ldyBIdG1sQnVpbGRlcigpKTsKLS8vCQkJCQljb250ZW50Vmlld2VyLmdldEJyb3dzZXIoKS5yZWRyYXcoKTsKLS8vCQkJCX0KLS8vCQkJfQotCi0JCQlpZiAoY2hhbmdlZEl0ZW1zICE9IG51bGwgJiYgZGlzcGxheWVkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNoYW5nZWRJdGVtcy5jb250YWlucyhkaXNwbGF5ZWRFbGVtZW50KSkgewotCQkJCQlkaXNwbGF5ZWRFbGVtZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBsaWJTdmNMaXN0ZW5lciA9IG5ldyBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbmZpZ3VyYXRpb24gc2V0OiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoY29uZmlnKSk7Ci0JCQljb250ZW50Vmlld2VyLmdldEJyb3dzZXIoKS5zZXRVcmwoImFib3V0OmJsYW5rIik7IC8vJE5PTi1OTFMtMSQKLQkJCWRpc3BsYXllZEVsZW1lbnQgPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTGlicmFyeSBjbG9zZWQ6ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShsaWJyYXJ5KSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTGlicmFyeSBjcmVhdGVkOiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUobGlicmFyeSkpOwotCQkJY2xlYW51cCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTGlicmFyeSBvcGVuZWQ6ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShsaWJyYXJ5KSk7Ci0JCQljbGVhbnVwKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxpYnJhcnkgcmVvcGVuZWQ6ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShsaWJyYXJ5KSk7Ci0JCQljbGVhbnVwKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJMaWJyYXJ5IHNldDogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGxpYnJhcnkpKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGNsZWFudXAoKSB7Ci0JCQlpZiAoY29udGVudFZpZXdlciAhPSBudWxsKSB7Ci0JCQkJY29udGVudFZpZXdlci5zZXRIdG1sQnVpbGRlcihuZXcgSHRtbEJ1aWxkZXIoKSk7Ci0JCQkJY29udGVudFZpZXdlci5nZXRCcm93c2VyKCkucmVkcmF3KCk7Ci0JCQl9Ci0JCX0KLQl9OwotCQotCS8vIFBhZ2UgbmF2aWdhdGlvbiBhY3Rpb25zLgotCXByaXZhdGUgQWN0aW9uIGJhY2tBY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiBmb3J3YXJkQWN0aW9uOwotCi0JcHJpdmF0ZSBBY3Rpb24gc3RvcEFjdGlvbjsKLQotCXByaXZhdGUgQWN0aW9uIHJlZnJlc2hBY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiBwcmludEFjdGlvbjsKLQotCS8vIEEgaGlkZGVuIGNvbXBvc2l0ZSB0byBob2xkIHRoZSBkaWFncmFtIHZpZXdlciBmb3IgZGlhZ3JhbSBpbWFnZQotCS8vIGdlbmVyYXRpb24uCi0JcHJpdmF0ZSBDb21wb3NpdGUgZGlhZ3JhbVZpZXdlckhvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRWaWV3KCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRyeSB7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJCWNvbnRlbnRWaWV3ZXIgPSBuZXcgRWxlbWVudEhUTUxWaWV3ZXIocGFyZW50KTsKLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJZGlhZ3JhbVZpZXdlckhvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgxLCAxKSk7IC8vIHNpemUKLQkJCS8vIGNhbid0IGJlCi0JCQkvLyAwLDAKLQkJCS8vIG90aGVyd2lzZQotCQkJLy8gdGhlCi0JCQkvLyBkaWFncmFtCi0JCQkvLyB3aWxsIG5vdAotCQkJLy8gYmUKLQkJCS8vIHBhaW50ZWQKLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJZGlhZ3JhbVZpZXdlckhvbGRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQkJLy8gQ3JlYXRlIHRoZSBwYWdlIG5hdmlnYXRpb24gdG9vbCBidXR0b25zLgotCQkJY3JlYXRlQWN0aW9ucygpOwotCi0JCQkvLyBBZGQgYSBwYXJ0IGxpc3RlbmVyIHRvIG1vbml0b3IgcGFydCBhY3RpdmF0aW9uIGFuZCB1cGRhdGUgdGhpcwotCQkJLy8gdmlldwotCQkJLy8gYXMgYW5kIHdoZW4gbmVlZGVkLgotCQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKAotCQkJCQlwYXJ0TGlzdGVuZXIpOwotCi0JCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuYWRkUGVyc3BlY3RpdmVMaXN0ZW5lcigKLQkJCQkJbmV3IElQZXJzcGVjdGl2ZUxpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgcGVyc3BlY3RpdmVBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQkJCQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBkZXNjKSB7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBlcnNwZWN0aXZlQ2hhbmdlZChJV29ya2JlbmNoUGFnZSBwYWdlLAotCQkJCQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2MsIFN0cmluZyBpZCkgewotCQkJCQkJCWlmIChkZXNjLmdldElkKCkuZXF1YWxzKAotCQkJCQkJCQkJQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCkpIHsKLQkJCQkJCQkJaWYgKGlkCi0JCQkJCQkJCQkJLmVxdWFscyhJV29ya2JlbmNoUGFnZS5DSEFOR0VfRURJVE9SX0FSRUFfU0hPVykpIHsKLQkJCQkJCQkJCXBhZ2Uuc2V0RWRpdG9yQXJlYVZpc2libGUoZmFsc2UpOwotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLndhcm5pbmdEaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZyk7IAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQotCQkJLy8gQWRkIHNlbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdG8gdXBkYXRlIHRoaXMgdmlldyBhcyBhbmQgd2hlbgotCQkJLy8gbmVlZGVkLgotCQkJVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJCQlzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCi0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5hZGRMaXN0ZW5lcihsaWJyYXJ5Q2hhbmdlTGlzdGVuZXIpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETzogRGlzcGxheSBhbiBlcnJvciBkaWFsb2cuCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJY29udGVudFZpZXdlci5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlicmFyeUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCQlVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQkJc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIoCi0JCQkJcGFydExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBhY3Rpb25zIGZvciB0aGlzIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJYmFja0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gY29udGVudFZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlicm93c2VyLmJhY2soKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWJhY2tBY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5iYWNrX3RleHQpOyAKLQkJYmFja0FjdGlvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5iYWNrX3RleHQpOyAKLQkJYmFja0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQlJU2hhcmVkSW1hZ2VzLklNR19UT09MX0JBQ0spKTsKLQotCQlmb3J3YXJkQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSBjb250ZW50Vmlld2VyLmdldEJyb3dzZXIoKTsKLQkJCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWJyb3dzZXIuZm9yd2FyZCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJZm9yd2FyZEFjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcndhcmRfdGV4dCk7IAotCQlmb3J3YXJkQWN0aW9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcndhcmRfdGV4dCk7IAotCQlmb3J3YXJkQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCUlTaGFyZWRJbWFnZXMuSU1HX1RPT0xfRk9SV0FSRCkpOwotCi0JCXN0b3BBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IGNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpOwotCQkJCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkJYnJvd3Nlci5zdG9wKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlzdG9wQWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RvcF90ZXh0KTsgCi0JCXN0b3BBY3Rpb24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RvcF90ZXh0KTsgCi0JCXN0b3BBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19ERVNDX1NUT1ApOwotCi0JCXJlZnJlc2hBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIEJyb3dzZXIgYnJvd3NlciA9IGNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpOwotCQkJCS8vIGlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkvLyBicm93c2VyLnJlZnJlc2goKTsKLQkJCQkvLyB9Ci0KLQkJCQkvLyBuZWVkIHRvIHJlZ2VuZXJhdGUgdGhlIGNvbnRlbnQKLQkJCQljb250ZW50Vmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfTsKLQkJcmVmcmVzaEFjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZnJlc2hfdGV4dCk7IAotCQlyZWZyZXNoQWN0aW9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZnJlc2hfdGV4dCk7IAotCQlyZWZyZXNoQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSUltYWdlcy5JTUdfREVTQ19SRUZSRVNIKTsKLQotCQlwcmludEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJY29udGVudFZpZXdlci5wcmludCgpOwotCQkJfQotCQl9OwotCQlwcmludEFjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByaW50X3RleHQpOyAKLQkJcHJpbnRBY3Rpb24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJpbnRfdGV4dCk7IAotCQlwcmludEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0RFU0NfUFJJTlQpOwotCi0JCUlBY3Rpb25CYXJzIGJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIgPSBiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCW1hbmFnZXIuYWRkKGJhY2tBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChmb3J3YXJkQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQoc3RvcEFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKHJlZnJlc2hBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChwcmludEFjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgZ2l2ZW4gc2VsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBMaWJyYXJ5IG9yIENvbmZpZ3VyYXRpb24gdmlldy4KLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgc2VsZWN0aW9uIGluIHRoZSBMaWJyYXJ5IG9yIENvbmZpZ3VyYXRpb24gdmlldy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZWxlY3Rpb24oT2JqZWN0IHNvdXJjZSwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGFjdGl2ZVBhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVZpZXdQYXJ0IHZpZXcgPSBhY3RpdmVQYWdlLmZpbmRWaWV3KFZJRVdfSUQpOwotCQlpZiAodmlldyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJT2JqZWN0W10gc2VsZWN0ZWRFbGVtZW50cyA9IHNlbC50b0FycmF5KCk7Ci0JCQlpZiAoc2VsZWN0ZWRFbGVtZW50cyAhPSBudWxsICYmIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJCU9iamVjdCBlbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1swXTsKLQkJCQkKLQkJCQkvLyBkb24ndCB1bndyYXAgdGhlIG9iamVjdC4gCi0JCQkJLy8gRm9yIGFjdGl2aXR5LCB3ZSBuZWVkIHRvIHdyYXBwZWQgaXRlbSBwcm92aWRlciB0byBnZXQgdGhlIHN1cHByZXNzIHN0YXR1cy4KLQkJCQkvLyBPYmplY3QgZWxlbWVudCA9IExpYnJhcnlVdGlsLnVud3JhcChzZWxlY3RlZEVsZW1lbnQpOwotCQkJCWlmIChkaXNwbGF5ZWRFbGVtZW50ICE9IG51bGwgJiYgZGlzcGxheWVkRWxlbWVudCA9PSBlbGVtZW50KSB7Ci0JCQkJCWRpc3BsYXllZEVsZW1lbnQgPSBudWxsOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChkaXNwbGF5Q29udGVudFBhZ2Uoc291cmNlLCBlbGVtZW50KSkgewotCQkJCQlkaXNwbGF5ZWRFbGVtZW50ID0gZWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgY29udGVudCBwYWdlIGZvciB0aGUgZ2l2ZW4gQ29udGVudEVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIExpYnJhcnkgb3IgQ29uZmlndXJhdGlvbiB2aWV3LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgc2VsZWN0ZWQgTWV0aG9kIGVsZW1lbnQuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudCBwYWdlIGlzIGRpc3BsYXllZAotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRpc3BsYXlDb250ZW50UGFnZShPYmplY3Qgc291cmNlLCBPYmplY3QgcmF3X2VsZW1lbnQpIHsKLQkJT2JqZWN0IGVsZW1lbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAocmF3X2VsZW1lbnQpOwotCQllbGVtZW50ID0gVmlld0hlbHBlci5oYW5kbGVEYW5nbGluZyhlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWdyID0gbnVsbDsKLQkJYm9vbGVhbiBpc0Jyb3dzaW5nID0gUGVyc3BlY3RpdmVVdGlsCi0JCQkJLmlzQWN0aXZlUGVyc3BlY3RpdmUoQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCWJvb2xlYW4gaXNDb25maWdTb3VyY2UgPSAoc291cmNlICE9IG51bGwpCi0JCQkJJiYgKHNvdXJjZSBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25WaWV3KTsKLQotCQkvLyBpZiBpbiBicm93c2luZyBidXQgdGhlIHNvdXJjZSBpcyBub3QgZnJvbSBjb25maWdydWF0aW9uIHZpZXcKLQkJLy8gaWdub3JlIGl0Ci0JCWlmIChpc0Jyb3dzaW5nICYmICFpc0NvbmZpZ1NvdXJjZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGlzQ29uZmlnU291cmNlKSB7Ci0JCQkvLyBHZXQgdGhlIEVsZW1lbnQgTGF5b3V0IE1hbmFnZXIgZm9yIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCQlsYXlvdXRNZ3IgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRFbGVtZW50TGF5b3V0TWFuYWdlcigpOwotCi0JCQkvLyBBZGQgdGhlIGFjdGl2aXR5IGRpYWdyYW0gc2VydmljZSB0byBnZW5lcmF0ZSBkaWFncmFtIGltYWdlcy4KLQkJCQotCQkJU3RyaW5nIG5ld0RpYWdyYW1zID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygiUFVCTElTSF9ORVdfRElBR1JBTSIpOwotCQkJQm9vbGVhbiBuZXdEaWFncmFtID0gbmV3IEJvb2xlYW4obmV3RGlhZ3JhbXMpOwotCQkJaWYobmV3RGlhZ3JhbS5ib29sZWFuVmFsdWUoKSl7Ci0JCQkJTmV3QWN0aXZpdHlEaWFncmFtU2VydmljZSBkaWFncmFtU2VydmljZSA9IChOZXdBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKSBsYXlvdXRNZ3IKLQkJCQkJLmdldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoKTsKLQkJCQlpZiAoZGlhZ3JhbVNlcnZpY2UgPT0gbnVsbCkgewotCQkJCQlkaWFncmFtU2VydmljZSA9IG5ldyBOZXdBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKAotCQkJCQkJZGlhZ3JhbVZpZXdlckhvbGRlciwKLQkJCQkJCW5ldyBGaWxlKGxheW91dE1nci5nZXRQdWJsaXNoRGlyKCkpKTsKLQkJCQkJbGF5b3V0TWdyLnNldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoZGlhZ3JhbVNlcnZpY2UpOwotCQkJCX0KLS8vCQkJCSBGb3IgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gCi0JCQkJYm9vbGVhbiBvcHRpb24gPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCgpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hlZFVuQ3JlYXRlZEFERChvcHRpb24pOwotCQkJCQotCQkJCS8vIEZvciBBY3Rpdml0eSBEaWFncmFtIAotCQkJCW9wdGlvbiA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKCk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24ob3B0aW9uKTsKLQkJCX1lbHNlewotLy8JCQkJIEFkZCB0aGUgYWN0aXZpdHkgZGlhZ3JhbSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGRpYWdyYW0gaW1hZ2VzLgotCQkJCUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVNlcnZpY2UgPSAoQWN0aXZpdHlEaWFncmFtU2VydmljZSkgbGF5b3V0TWdyCi0JCQkJCQkuZ2V0QWN0aXZpdHlEaWFncmFtU2VydmljZSgpOwotCQkJCWlmIChkaWFncmFtU2VydmljZSA9PSBudWxsKSB7Ci0JCQkJCWRpYWdyYW1TZXJ2aWNlID0gbmV3IEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoCi0JCQkJCQkJZGlhZ3JhbVZpZXdlckhvbGRlciwKLQkJCQkJCQluZXcgRmlsZShsYXlvdXRNZ3IuZ2V0UHVibGlzaERpcigpKSk7Ci0JCQkJCWxheW91dE1nci5zZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKGRpYWdyYW1TZXJ2aWNlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gRm9yIEFjdGl2aXR5IERldGFpbCBEaWFncmFtIAotCQkJCWJvb2xlYW4gb3B0aW9uID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoZWRVbkNyZWF0ZWRBREQob3B0aW9uKTsKLQkJCQkKLQkJCQkvLyBGb3IgQWN0aXZpdHkgRGlhZ3JhbSAKLQkJCQlvcHRpb24gPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKG9wdGlvbik7Ci0JCQl9Ci0JCQkKLQkJCQotCQkJCi0JCX0KLQotCQljb250ZW50Vmlld2VyLnNldExheW91dE1hbmFnZXIobGF5b3V0TWdyKTsKLQkJY29udGVudFZpZXdlci5zaG93RWxlbWVudENvbnRlbnQocmF3X2VsZW1lbnQpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBIVE1MIGNvbnRlbnQgcGFnZSBmb3IgYSBNZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgQSBNZXRob2QgZWxlbWVudC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBIVE1MIGNvbnRlbnQgcGFnZSBpcyBkaXNwbGF5ZWQKLQkgKiAgICAgICAgIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNwbGF5SFRNTENvbnRlbnRQYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWVsZW1lbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCWVsZW1lbnQgPSBWaWV3SGVscGVyLmhhbmRsZURhbmdsaW5nKGVsZW1lbnQpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQljb250ZW50Vmlld2VyLnNldExheW91dE1hbmFnZXIobnVsbCk7Ci0JCQljb250ZW50Vmlld2VyLnNob3dFbGVtZW50Q29udGVudChlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9FbGVtZW50SFRNTFZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0VsZW1lbnRIVE1MVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAxMDllMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0VsZW1lbnRIVE1MVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0Lkh0bWxCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5PcGVuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuU3RhdHVzVGV4dEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5XaW5kb3dFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogRGlzcGxheXMgdGhlIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgYSBNZXRob2QgZWxlbWVudCBpbiBhIFNXVCBCcm93c2VyLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50SFRNTFZpZXdlciB7Ci0KLS8vCS8vIFRoZSBkZWZhdWx0IEhUTUwgd3JhcHBlcnMgZm9yIGRpc2FibGluZyB0aGUgIkRpc3BsYXkgVHJlZSBCcm93c2VyIiBsaW5rCi0vLwkvLyBpbiB0aGUgSFRNTCBjb250ZW50IHBhZ2VzLgotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09OVEVOVF9XUkFQUEVSX1NUQVJUID0gIjxodG1sPjxoZWFkPiA8bWV0YSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgY29udGVudD1cInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOFwiPjwvaGVhZD48dGl0bGU+UmF0aW9uYWwgVW5maWVkIFByb2Nlc3M8L3RpdGxlPiIgLy8kTk9OLU5MUy0xJAotLy8JCQkrICI8c2NyaXB0IGxhbmd1YWdlPVwiamF2YXNjcmlwdFwiPmZ1bmN0aW9uIGluaXQoKSB7IHBhcmVudC5vcnlfdG9jPVwiZGlzYWJsZVwiOyBwYXJlbnQuY29udGVudGZyYW1lLmxvY2F0aW9uPVwiIjsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTlRFTlRfV1JBUFBFUl9FTkQgPSAiXCI7IH08L3NjcmlwdD48L2hlYWQ+IiAvLyROT04tTkxTLTEkCi0vLwkJCSsgIjxmcmFtZXNldCByb3dzPVwiMTAwJSwqXCIgZnJhbWVib3JkZXI9XCJub1wiIGJvcmRlcj1cIjBcIiBmcmFtZXNwYWNpbmc9XCIwXCIgaWQ9XCJjb250ZW50ZnJhbWVzZXRcIiBuYW1lPVwiY29udGVudGZyYW1lc2V0XCI+IiAvLyROT04tTkxTLTEkCi0vLwkJCSsgIjxmcmFtZSBzcmM9XCJhYm91dDpibGFua1wiIGlkPVwiY29udGVudGZyYW1lXCIgbmFtZT1cImNvbnRlbnRmcmFtZVwiIHNjcm9sbGluZz1cImF1dG9cIi8+IiAvLyROT04tTkxTLTEkCi0vLwkJCSsgIjxmcmFtZSBzcmM9XCJhYm91dDpibGFua1wiIGlkPVwiYmxhbmtmcmFtZVwiIG5hbWU9XCJibGFua2ZyYW1lXCIgb25sb2FkPVwiaW5pdCgpXCIvPiIgLy8kTk9OLU5MUy0xJAotLy8JCQkrICI8L2ZyYW1lc2V0PjwvaHRtbD4iOyAvLyROT04tTkxTLTEkCi0KLS8vCS8vIFRoZSBkZWZhdWx0IEhUTUwgd3JhcHBlcnMgZm9yIHByaW50aW5nIHRoZSBwcm9jZXNzIGNvbnRlbnQgcGFnZXMuCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QUklOVF9XUkFQUEVSX1NUQVJUID0gREVGQVVMVF9DT05URU5UX1dSQVBQRVJfU1RBUlQKLS8vCQkJKyAicHJpbnQoKTsiOyAvLyROT04tTkxTLTEkCi0vLwotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUFJJTlRfV1JBUFBFUl9FTkQgPSBERUZBVUxUX0NPTlRFTlRfV1JBUFBFUl9FTkQ7Ci0vLwotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU5UX0ZJTEUgPSAicHJpbnQuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBIVE1MIHdyYXBwZXJzIGZvciBkaXNhYmxpbmcgdGhlICJEaXNwbGF5IFRyZWUgQnJvd3NlciIgbGluayBpbiB0aGUKLQkvLyBIVE1MIGNvbnRlbnQgcGFnZXMuCi0vLwlwcml2YXRlIFN0cmluZyBjb250ZW50V3JhcHBlclNhcnQ7Ci0vLwotLy8JcHJpdmF0ZSBTdHJpbmcgY29udGVudFdyYXBwZXJFbmQ7Ci0KLS8vCS8vIFRoZSBIVE1MIHdyYXBwZXJzIGZvciBwcmludGluZyB0aGUgSFRNTCBjb250ZW50IHBhZ2VzLgotLy8JcHJpdmF0ZSBTdHJpbmcgcHJpbnRXcmFwcGVyU2FydDsKLS8vCi0vLwlwcml2YXRlIFN0cmluZyBwcmludFdyYXBwZXJFbmQ7Ci0vLwotLy8JLy8gVGhlIGJ1aWx0LWluIGJyb3dzZXIgZm9yIHByaW50aW5nIHRoZSBIVE1MIHBhZ2VzLgotLy8JLy8gZG9uJ3QgdXNlIGEgc2Vjb25kIAotLy8JcHJpdmF0ZSBCcm93c2VyIHByaW50QnJvd3NlcjsKLQotCXByb3RlY3RlZCBCcm93c2VyIGJyb3dzZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlwcml2YXRlIFN0cmluZyBjdXJyZW50TG9jYXRpb24gPSBudWxsOwotCi0JLy8gc2F2ZSB0aGUgY3VycmVudCB0ZXh0IGZyb20gdGhlIHN0YXR1cyBsaXN0ZW5lcgotCS8vIHdlIG5lZWQgdGhpcyB0byBvcGVuIGJyb3dzZXIgd2l0aCB0aGlzIHVybCAKLQkvLyBzaW5jZSB1bmRlciBsaW51eCBicm93c2VyIGNhbid0IGJlIG9wZW5lZCBhdXRvbWF0aWNhbGx5LCB3aGljaCBpcyByZWFsbHkgYmFkCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudFRleHQgPSBudWxsOwotCXByaXZhdGUgSHRtbEJ1aWxkZXIgaHRtbEJ1aWxkZXI7Ci0KLQlwcml2YXRlIEN1cnNvciB3YWl0Q3Vyc29yID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEVsZW1lbnRIVE1MVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCWh0bWxCdWlsZGVyID0gbmV3IEh0bWxCdWlsZGVyKCk7Ci0JCWNyZWF0ZUNvbnRyb2woKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBTV1QgYnJvd3NlciBjb250cm9scyBmb3Igdmlld2luZyBhbmQgcHJpbnRpbmcgdGhlIEhUTUwKLQkgKiBjb250ZW50IHBhZ2VzLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHBhcmVudCwgU1dULk5PTkUpOwotCQkJYnJvd3Nlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEh8R3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCQkJYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGUpIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxvY2F0aW9uIGNoYW5nZWQiKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGUpIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxvY2F0aW9uIGNoYW5naW5nLi4uIik7Ci0JCQkJCS8vIEdldCB0aGUgY3VycmVudCBsb2NhdGlvbi4KLQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gZ2V0RWxlbWVudFVybChlLmxvY2F0aW9uKTsKLQkJCQkJaWYgKCBsb2NhdGlvbiA9PSBudWxsIHx8IGxvY2F0aW9uLnN0YXJ0c1dpdGgoUmVzb3VyY2VIZWxwZXIuVVJMX1NUUl9KQVZBU0NSSVBUKSkKLQkJCQkJewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmIChpc0xvY2F0aW9uQ2hhbmdlZChsb2NhdGlvbikpIHsKLQkJCQkJCS8vIFNhdmUgdGhlIGN1cnJlbnQgbG9jYXRpb24gZm9yIHByaW50aW5nIHB1cnBvc2VzLgotCQkJCQkJY3VycmVudExvY2F0aW9uID0gbG9jYXRpb247Ci0JCQkJCQlnZW5lcmF0ZUh0bWwoY3VycmVudExvY2F0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQlicm93c2VyLmFkZFN0YXR1c1RleHRMaXN0ZW5lcihuZXcgU3RhdHVzVGV4dExpc3RlbmVyKCkKLQkJCXsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFN0YXR1c1RleHRFdmVudCBldmVudCkKLQkJCQl7Ci0JCQkJCS8vIEdldCB0aGUgY3VycmVudCB0ZXh0LgotCQkJCQlTdHJpbmcgdGV4dCA9IGV2ZW50LnRleHQ7Ci0JCQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJCXsKLQkJCQkJCS8vIFNhdmUgdGhlIGN1cnJlbnQgdGV4dCBmb3IgYXBwbGljYXRpb24gbGF1bmNoaW5nIHB1cnBvc2VzLgotCQkJCQkJY3VycmVudFRleHQgPSB0ZXh0OwotCQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlN0YXR1cyBjaGFuZ2VkOiAiICsgdGV4dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpewotCi0JCQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQkJCQkvLyBoYW5kbGUgb3BlbiB3aW5kb3cuCi0JCQkJCS8vIHdpdGggbW96aWxsYSBpbiBsaW51eCwgb3BlbiB3aW5kb3cgZG9lcyBub3Qgd29yawotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiT3BlbiB3aW5kb3cgZXZlbnQ6ICIgKyBldmVudCk7Ci0JCQkJCQotCQkJCQkvLyB3aW5kb3dzIGNhbiBsYXVuY2ggdGhlIGJyb3dzZXIgd2l0aG91dCBwcm9ibGVtCi0JCQkJCS8vIGxpbnV4IG5lZWRzIG1vcmUgY2FyZQotCQkJCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQkKLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0JCQkJCXsKLQkJCQkJICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0JCQkJCQl7Ci0JCQkJCQkJdHJ5Ci0JCQkJCQkJewotLy8JCQkJCQkJCS8vIGlmIHRoZSB1cmwgaXMgYSByZXNvdXJjZSB3aXRoIHJlbGF0aXZlIHBhdGgsIGZpbmQgdGhlIGFic29sdXRlIHBhdGgKLS8vCQkJCQkJCQlpZiAoIGN1cnJlbnRUZXh0LnN0YXJ0c1dpdGgoImZpbGU6IikgKQotLy8JCQkJCQkJCXsKLS8vCQkJCQkJCQkJLy8gZ2V0IHRoZSBmaWxlIHBhdGggZnJvbSB0aGUgCi0vLwkJCQkJCQkJfQotCQkJCQkJCQkJCQkJCQkJCQotLy8JCQkJCQkJCS8vIG9wZW4gYW5vdGhlciBzd3QgYnJvd3NlciBzaW5jZSB3ZSBoYXZlIG5vIChzaW1wbGUpIHdheSBvZiBjcmVhdGluZyBhIHN5c3RlbSBkZWZhdWx0IGJyb3dzZXIKLS8vCQkJCQkJCQkvLyB0aGUgRWNsaXBzZSBndXlzIGhpZGUgYWxsIHRoZSBnb29kIGFwaXMgYXMgaW50ZXJuYWwKLQkJCQkJCQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJCQkJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCQkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCQkJCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCQkJCQkJc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkJCQkJCUJyb3dzZXIgcG9wdXBfYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQkJCQkJCXBvcHVwX2Jyb3dzZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIfEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTHxHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0JCQkJCQkJCXBvcHVwX2Jyb3dzZXIuc2V0VXJsKGN1cnJlbnRUZXh0KTsKLQkJCQkJCQkJCQkJCQkJCQkKLQkJCQkJCQkJc2hlbGwub3BlbigpOwotCi0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJCQkJCQl7Ci0JCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9fSk7Ci0JCQkKLS8vCQkJLy8gZG9uJ3QgdXNlIGEgc2VwZXJhdGUgYnJvd3NlciBmb3IgcHJpbnRpbmcgc2luY2UgdGhpcyB3aWxsIGxvc2UgdGhlIAotLy8JCQkvLyBzdGF0ZXMgb2YgdGhlIGN1cnJlbnQgcGFnZSwgZm9yIGV4YW1wbGUsIHRoZSBleHBhbmRlZCBzZWN0aW9ucywgZXRjLgotLy8JCQkvLyBKaW5odWEgWGksICAzLzUvMjAwNwotLy8JCQkvLyBDcmVhdGUgdGhlIGhpZGRlbiBicm93c2VyIHVzZWQgZm9yIHByaW50aW5nIHRoZSBIVE1MIGNvbnRlbnQKLS8vCQkJLy8gcGFnZXMuCi0vLwkJCXByaW50QnJvd3NlciA9IG5ldyBCcm93c2VyKHBhcmVudCwgU1dULk5PTkUpOwotLy8JCQlwcmludEJyb3dzZXIuc2V0U2l6ZSgxLCAxKTsKLS8vCQkJcHJpbnRCcm93c2VyLnNldFZpc2libGUoZmFsc2UpOwotLy8KLS8vCQkJLy8gTGludXg6IFRoZXJlIGlzIHVudXNlZCBzcGFjZSBpbiBwcmV2aWV3L2Jyb3dzaW5nLCB3aGljaCBpcyBpbiBncmV5LgotLy8JCQkvLyB0aGlzIGlzIG5lZWRlZCBmb3IgbGludXgKLS8vCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLS8vCQkJZ2QuaGVpZ2h0SGludCA9IDE7Ci0vLwkJCXByaW50QnJvd3Nlci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQotCQkJCi0JCQkvLyBSZWFkIHRoZSBIVE1MIHdyYXBwZXJzIGZvciBkaXNhYmxpbmcgdGhlICJEaXNwbGF5IFRyZWUgQnJvd3NlciIKLQkJCS8vIGxpbmsgaW4gdGhlIEhUTUwgY29udGVudCBwYWdlcy4KLS8vCQkJY29udGVudFdyYXBwZXJTYXJ0ID0gSFRNTFdyYXBwZXJzCi0vLwkJCQkJLmdldFN0cmluZygiQ09OVEVOVF9XUkFQUEVSX1NUQVJUIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJaWYgKGNvbnRlbnRXcmFwcGVyU2FydCA9PSBudWxsKSB7Ci0vLwkJCQljb250ZW50V3JhcHBlclNhcnQgPSBERUZBVUxUX0NPTlRFTlRfV1JBUFBFUl9TVEFSVDsKLS8vCQkJfQotLy8JCQljb250ZW50V3JhcHBlckVuZCA9IEhUTUxXcmFwcGVycy5nZXRTdHJpbmcoIkNPTlRFTlRfV1JBUFBFUl9FTkQiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlpZiAoY29udGVudFdyYXBwZXJFbmQgPT0gbnVsbCkgewotLy8JCQkJY29udGVudFdyYXBwZXJFbmQgPSBERUZBVUxUX0NPTlRFTlRfV1JBUFBFUl9TVEFSVDsKLS8vCQkJfQotCi0vLwkJCS8vIFJlYWQgdGhlIEhUTUwgd3JhcHBlcnMgZm9yIHByaW50aW5nIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuCi0vLwkJCXByaW50V3JhcHBlclNhcnQgPSBIVE1MV3JhcHBlcnMuZ2V0U3RyaW5nKCJQUklOVF9XUkFQUEVSX1NUQVJUIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJaWYgKHByaW50V3JhcHBlclNhcnQgPT0gbnVsbCkgewotLy8JCQkJcHJpbnRXcmFwcGVyU2FydCA9IERFRkFVTFRfUFJJTlRfV1JBUFBFUl9TVEFSVDsKLS8vCQkJfQotLy8JCQlwcmludFdyYXBwZXJFbmQgPSBIVE1MV3JhcHBlcnMuZ2V0U3RyaW5nKCJQUklOVF9XUkFQUEVSX0VORCIpOyAvLyROT04tTkxTLTEkCi0vLwkJCWlmIChwcmludFdyYXBwZXJFbmQgPT0gbnVsbCkgewotLy8JCQkJcHJpbnRXcmFwcGVyRW5kID0gREVGQVVMVF9QUklOVF9XUkFQUEVSX0VORDsKLS8vCQkJfQotCi0JCQl3YWl0Q3Vyc29yID0gcGFyZW50LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUN1cnNvcigKLQkJCQkJU1dULkNVUlNPUl9XQUlUKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWJyb3dzZXIgPSBudWxsOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTG9jYXRpb25DaGFuZ2VkKFN0cmluZyBsb2NhdGlvbikgewotCQlpZiAobG9jYXRpb24gPT0gbnVsbCB8fCBjdXJyZW50TG9jYXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciAhPSAnLycpIHsKLQkJCWxvY2F0aW9uID0gbG9jYXRpb24ucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCQlTdHJpbmcgb2xkTG9jYXRpb24gPSBjdXJyZW50TG9jYXRpb24ucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsCi0JCQkJCScvJyk7Ci0KLQkJCS8vIFNvbWUgdGltZXMgdGhlIGNvcnJlbnQgVVJMIGlzIGEgZnVsbCBwYXRoLCBzbyBqdXN0IGNvbXBhcmUgdGhlCi0JCQkvLyBlbmQuCi0JCQlyZXR1cm4gIWxvY2F0aW9uLmVuZHNXaXRoKG9sZExvY2F0aW9uKQotCQkJCQkmJiAhb2xkTG9jYXRpb24uZW5kc1dpdGgobG9jYXRpb24pOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICFsb2NhdGlvbi5lbmRzV2l0aChjdXJyZW50TG9jYXRpb24pCi0JCQkJCSYmICFjdXJyZW50TG9jYXRpb24uZW5kc1dpdGgobG9jYXRpb24pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBTV1QgYnJvd3NlciB0aGF0IGRpc3BsYXlzIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuCi0JICovCi0JcHVibGljIEJyb3dzZXIgZ2V0QnJvd3NlcigpIHsKLQkJcmV0dXJuIGJyb3dzZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBmb2N1cyB0byB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCWJyb3dzZXIuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEhUTUwgQnVpbGRlci4KLQkgKi8KLQlwdWJsaWMgSHRtbEJ1aWxkZXIgZ2V0SHRtbEJ1aWxkZXIoKSB7Ci0JCXJldHVybiBodG1sQnVpbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBIVE1MIEJ1aWxkZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHRtbEJ1aWxkZXIoSHRtbEJ1aWxkZXIgYnVpbGRlcikgewotCQl0aGlzLmh0bWxCdWlsZGVyID0gYnVpbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBFbGVtZW50IExheW91dCBNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExheW91dE1hbmFnZXIoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWdyKSB7Ci0JCWh0bWxCdWlsZGVyLnNldExheW91dE1hbmFnZXIobGF5b3V0TWdyKTsKLQl9Ci0KLQotCQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dFbGVtZW50Q29udGVudChPYmplY3QgcmF3X2VsZW1lbnQpIHsKLQotCQlzdGFydFdhaXQoKTsKLQotCQl0cnkgewotCQkJU3RyaW5nIGZpbGVfdXJsID0gImFib3V0OmJsYW5rIjsgLy8kTk9OLU5MUy0xJAotCQkJT2JqZWN0IGVsZW1lbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAocmF3X2VsZW1lbnQpOwotCQkJaWYgKCByYXdfZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciApIHsKLQkJCQlBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpcmF3X2VsZW1lbnQ7Ci0JCQkJT2JqZWN0IHByb2MgPSB3cmFwcGVyLmdldFRvcEl0ZW0oKTsKLQkJCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIHByb2MgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dC5nZXRQYXRoKHdyYXBwZXIpOwotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbih0b3BJdGVtKTsKLQkJCQkJSUVsZW1lbnRMYXlvdXQgbGF5b3V0ID0gaHRtbEJ1aWxkZXIuZ2V0TGF5b3V0TWFuYWdlcigpCi0JCQkJCQkuY3JlYXRlTGF5b3V0KChNZXRob2RFbGVtZW50KWVsZW1lbnQsIAotCQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKXByb2MsIHBhdGgpOwotCQkJCQlmaWxlX3VybCA9IGh0bWxCdWlsZGVyLmdlbmVyYXRlSHRtbChsYXlvdXQpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJZmlsZV91cmwgPSBodG1sQnVpbGRlci5nZW5lcmF0ZUh0bWwoKE1ldGhvZEVsZW1lbnQpZWxlbWVudCk7Ci0JCQl9Ci0JCQkKLQkJCWlmICggZmlsZV91cmwgPT0gbnVsbCApIHsKLQkJCQlmaWxlX3VybCA9ICJhYm91dDpibGFuayI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIG9uIGxpbnV4LCB0aGUgZmlsZSBwYXRoIG5lZWQgdG8gYmUgc3BlY2lmaWVkIGFzIGZpbGUsIG90aGVyd2lzZSBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgdXJsCi0JCQkvLyBhbmQgY2FzdWlnbiBlbmNvZGluZy9kZWNvZGluZyBpc3N1ZQotCQkJLy8gTGludXg6IENvbmZpZ3VyYXRpb24gbmFtZXMgY29udGFpbmluZyBhY2NlbnRlZCBjaGFyYWN0ZXJzIGNhbm5vdCBiZSBicm93c2VkLgotCQkJZWxzZSBpZiAoIVNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygid2luMzIiKSAmJiAhZmlsZV91cmwuc3RhcnRzV2l0aCgiZmlsZTovLyIpICYmIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkhZmlsZV91cmwuZXF1YWxzKCJhYm91dDpibGFuayIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJZmlsZV91cmwgPSAiZmlsZTovLyIgKyBmaWxlX3VybDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkKLQkJCS8vIFNldCB0aGUgY3VycmVudCBsb2NhdGlvbiB0byBhdm9pZCByZS1nZW5lcmF0aW5nIHRoZSBIVE1MIGZpbGUgaW4KLQkJCS8vIHJlc3BvbmQgdG8gYSBsb2NhdGlvbiBjaGFuZ2UuCi0JCQljdXJyZW50TG9jYXRpb24gPSBmaWxlX3VybDsKLQkJCWJyb3dzZXIuc2V0VXJsKGZpbGVfdXJsKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQllbmRXYWl0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSHRtbChTdHJpbmcgdXJsKSB7Ci0JCXN0YXJ0V2FpdCgpOwotCQl0cnkgewotCQkJaHRtbEJ1aWxkZXIuZ2VuZXJhdGVIdG1sKHVybCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQkJZW5kV2FpdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnQgVVJMLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEVsZW1lbnRVcmwoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsIHx8IGxvY2F0aW9uLmxlbmd0aCgpID09IDAKLQkJCQl8fCBsb2NhdGlvbi5lcXVhbHMoImFib3V0OmJsYW5rIikgIC8vJE5PTi1OTFMtMSQKLQkJCQl8fCBsb2NhdGlvbi50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoUmVzb3VyY2VIZWxwZXIuVVJMX1NUUl9KQVZBU0NSSVBUKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlsb2NhdGlvbiA9IGdldFVybChsb2NhdGlvbik7Ci0JCWlmIChsb2NhdGlvbi5pbmRleE9mKFJlc291cmNlSGVscGVyLk1JU1NJTkdfUEFHRVNfRk9MREVSKSA+PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIG1ha2Ugc3VyZSB0aGUgdXJsIGlzIGFuIGVsZW1lbnQgdXJsLCBjaGVjayB0aGUgZ3VpZAotCQlpZiAoIFJlc291cmNlSGVscGVyLmdldEd1aWRGcm9tRmlsZU5hbWUobG9jYXRpb24pID09IG51bGwgKQotCQl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMIGZvciB0aGUgZ2l2ZW4gbG9jYXRpb24uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VXJsKFN0cmluZyBsb2NhdGlvbikgewotCQlTdHJpbmcgcHVibGlzaF9kaXIgPSBodG1sQnVpbGRlci5nZXRQdWJsaXNoRGlyKCk7Ci0JCVN0cmluZyB1cmwgPSBmaXhQYXRoKGxvY2F0aW9uKTsKLQkJaW50IGluZGV4ID0gdXJsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigKLQkJCQlmaXhQYXRoKHB1Ymxpc2hfZGlyKS50b0xvd2VyQ2FzZSgpKTsKLQkJaWYgKGluZGV4ID49IDApIHsKLQkJCXVybCA9IHVybC5zdWJzdHJpbmcoaW5kZXggKyBwdWJsaXNoX2Rpci5sZW5ndGgoKSk7Ci0JCX0KLQkJaW5kZXggPSB1cmwuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmRleCA+IDApIHsKLQkJCXVybCA9IHVybC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZml4UGF0aChTdHJpbmcgcGF0aCkgewotCQl0cnkgewotCQkJcGF0aCA9IFVSTERlY29kZXIuZGVjb2RlKHBhdGgsICJ1dGYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykgewotCQkJCXJldHVybiBwYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQkJfQotCQkJcmV0dXJuIHBhdGg7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgdGhlIGN1cnJlbnQgSFRNTCBwYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50KCkgewotCQlib29sZWFuIGIgPSB0aGlzLmJyb3dzZXIuZXhlY3V0ZSgid2luZG93LnByaW50KCk7Iik7Ci0vLwkJaWYgKCAhYiApIHsKLS8vCQkJZmluYWwgU3RyaW5nIHByaW50RmlsZSA9IGh0bWxCdWlsZGVyLmdldFB1Ymxpc2hEaXIoKSArIFBSSU5UX0ZJTEU7Ci0vLwkJCWlmIChjdXJyZW50TG9jYXRpb24gIT0gbnVsbCkgewotLy8JCQkJU3RyaW5nQnVmZmVyIHdyYXBwZXJIVE1MID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotLy8JCQkJd3JhcHBlckhUTUwuYXBwZW5kKHByaW50V3JhcHBlclNhcnQpLmFwcGVuZChjdXJyZW50TG9jYXRpb24pCi0vLwkJCQkJCS5hcHBlbmQocHJpbnRXcmFwcGVyRW5kKTsKLS8vCQkJCVN0cmluZyBodG1sVGV4dCA9IHdyYXBwZXJIVE1MLnRvU3RyaW5nKCk7Ci0vLwkJCQlpZiAoRmlsZVV0aWwud3JpdGVVVEY4RmlsZShwcmludEZpbGUsIGh0bWxUZXh0KSkgewotLy8JCQkJCXByaW50QnJvd3Nlci5zZXRVcmwocHJpbnRGaWxlKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRXYWl0KCkgewotCQlwYXJlbnQuZ2V0U2hlbGwoKS5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZFdhaXQoKSB7Ci0JCXBhcmVudC5nZXRTaGVsbCgpLnNldEN1cnNvcihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIGNvbnRlbnQuCi0JICogPHA+Ci0JICogUmVnZW5lcmF0ZXMgdGhlIGNvbnRlbnQgYmVmb3JlIHJlZnJlc2hpbmcgdGhlIGJyb3dzZXIuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJZ2VuZXJhdGVIdG1sKGN1cnJlbnRMb2NhdGlvbik7Ci0JCWJyb3dzZXIucmVmcmVzaCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0VsZW1lbnRzVmlld0NvbnRleHRIZWxwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvRWxlbWVudHNWaWV3Q29udGV4dEhlbHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmFiMjA1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvRWxlbWVudHNWaWV3Q29udGV4dEhlbHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiAKLSAqIENvbnRleHQgSGVscCBmb3IgZWxlbWVudAotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50c1ZpZXdDb250ZXh0SGVscCB7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBoZWxwIG9mIHRoZSBnaXZlbiBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHBhcmFtIHVpQ29tcG9zaXRlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEhlbHAoSVNlbGVjdGlvbiBzZWxlY3Rpb24sIENvbXBvc2l0ZSB1aUNvbXBvc2l0ZSkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkvLyBpZiBtdWx0aXBsZSBpdGVtcyBzZWxlY3RlZCwgb25seSB0aGUgZmlyc3QgaXRlbSdzIGNvbnRleHQgaGVscCB3aWxsCi0JCS8vIGJlIGRpc3BsYXllZAotCQlPYmplY3Qgb2JqID0gc2VsZWN0ZWQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIFNldHRpbmcgaGVscCBmb3IgdGhlIHNlbGVjdGlvbiBvYmogPSAiICsKLQkJLy8gb2JqKTsKLQkJc2V0SGVscChvYmosIHVpQ29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBoZWxwIG9mIHRoZSBvYmplY3QKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIHVpQ29tcG9zaXRlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEhlbHAoT2JqZWN0IG9iaiwgQ29tcG9zaXRlIHVpQ29tcG9zaXRlKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqKTsKLQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgUm9sZSkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFRhc2spKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoCi0JCQkJCXVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBEb21haW4pKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgVG9vbCkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykpIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCXVpQ29tcG9zaXRlLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9IVE1MV3JhcHBlcnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9IVE1MV3JhcHBlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTMyYzk5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvSFRNTFdyYXBwZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogVGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIEhUTUwgd3JhcHBlcnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTFdyYXBwZXJzIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCi0JCQkuZ2V0QnVuZGxlKEhUTUxXcmFwcGVycy5jbGFzcy5nZXROYW1lKCkpOwotCi0JLyoqCi0JICogRGVmYXVsdCBwcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmb3JtIGJlaW5nCi0JICogaW5zdGFudGlhdGVkLgotCSAqLwotCXByaXZhdGUgSFRNTFdyYXBwZXJzKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgZ2l2ZW4gdGhlIHJlc291cmNlIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5LgotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBmb3JtYXR0ZWQgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIHJlc291cmNlIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSBhcmd1bWVudHMuCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIGZvcm1hdHRlZCBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0hUTUxXcmFwcGVycy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0hUTUxXcmFwcGVycy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTU4Y2E1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9IVE1MV3JhcHBlcnMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ09OVEVOVF9XUkFQUEVSX1NUQVJUPVwKLSAgPGh0bWw+XAotICA8aGVhZD5cCi0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij5cCi0gIDwvaGVhZD5cCi0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPlwKLSAgZnVuY3Rpb24gaW5pdCgpIHsgcGFyZW50Lm9yeV90b2M9ImRpc2FibGUiOyBwYXJlbnQuY29udGVudGZyYW1lLmxvY2F0aW9uPSIKLSAgCi1DT05URU5UX1dSQVBQRVJfRU5EPVwKLSAgIjsgfVwKLSAgPC9zY3JpcHQ+XAotICA8L2hlYWQ+XAotICA8ZnJhbWVzZXQgcm93cz0iMTAwJSwqIiBmcmFtZWJvcmRlcj0ibm8iIGJvcmRlcj0iMCIgZnJhbWVzcGFjaW5nPSIwIiBpZD0iY29udGVudGZyYW1lc2V0IiBuYW1lPSJjb250ZW50ZnJhbWVzZXQiPlwKLSAgPGZyYW1lIHNyYz0iYWJvdXQ6YmxhbmsiIGlkPSJjb250ZW50ZnJhbWUiIG5hbWU9ImNvbnRlbnRmcmFtZSIgc2Nyb2xsaW5nPSJhdXRvIi8+XAotICA8ZnJhbWUgc3JjPSJhYm91dDpibGFuayIgaWQ9ImJsYW5rZnJhbWUiIG5hbWU9ImJsYW5rZnJhbWUiIG9ubG9hZD0iaW5pdCgpIi8+XAotICA8L2ZyYW1lc2V0PlwKLSAgPC9odG1sPgotCi1QUklOVF9XUkFQUEVSX1NUQVJUPVwKLSAgPGh0bWw+XAotICA8aGVhZD5cCi0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij5cCi0gIDwvaGVhZD5cCi0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPlwKLSAgZnVuY3Rpb24gaW5pdCgpIHsgcGFyZW50Lm9yeV90b2M9ImRpc2FibGUiOyB9XAotICA8L3NjcmlwdD5cCi0gIDwvaGVhZD5cCi0gIDxmcmFtZXNldCByb3dzPSIxMDAlLCoiIGZyYW1lYm9yZGVyPSJubyIgYm9yZGVyPSIwIiBmcmFtZXNwYWNpbmc9IjAiIGlkPSJwcmludGZyYW1lc2V0IiBuYW1lPSJwcmludGZyYW1lc2V0IiBvbmxvYWQ9ImphdmFzY3JpcHQ6cHJpbnQoKSI+XAotICA8ZnJhbWUgc3JjPSJhYm91dDpibGFuayIgaWQ9ImJsYW5rZnJhbWUiIG5hbWU9ImJsYW5rZnJhbWUiIG9ubG9hZD0iaW5pdCgpIi8+XAotICA8ZnJhbWUgc3JjPSIKLQotUFJJTlRfV1JBUFBFUl9FTkQ9XAotICAiIGlkPSJwcmludGZyYW1lIiBuYW1lPSJwcmludGZyYW1lIiBzY3JvbGxpbmc9ImF1dG8iIG9ubG9hZD0iamF2YXNjcmlwdDpwYXJlbnQucHJpbnRmcmFtZS5mb2N1cygpIi8+XAotICA8L2ZyYW1lc2V0PlwKLSAgPGh0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0xpYnJhcnlWaWV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTGlicmFyeVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODdkYzJkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTGlicmFyeVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlBhc3RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5Mb2NhbFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGF5b3V0QWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdDb3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld0N1dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3UGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk5ld1BsdWdpbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuTW92ZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuVmFyaWFiaWxpdHlTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQuTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuSUVkaXRvcktlZXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLk1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QbHVnaW5VSVBhY2thZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLlN3aXRjaENvbmZpZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkltcG9ydEV4cG9ydFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5MaWJyYXJ5U2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWVzc2FnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklucHV0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuSFRNTFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlNob3dJbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZU5hdmlnYXRvcjsKLQotLyoqCi0gKiBUaGUgTGlicmFyeSB2aWV3LgotICogPHA+Ci0gKiBEaXNwbGF5cyB0aGUgcGh5c2ljYWwgcmVwcmVzZW50YXRpb24gb2YgYSBNZXRob2QgTGlicmFyeS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWaWV3IGV4dGVuZHMgQWJzdHJhY3RCYXNlVmlldyBpbXBsZW1lbnRzIElSZWZyZXNoSGFuZGxlciwKLQkJSVNob3dJblRhcmdldCB7Ci0KLQkvKioKLQkgKiBUaGUgdmlldyBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0lEID0gTGlicmFyeVZpZXcuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXByb3RlY3RlZCBJRG91YmxlQ2xpY2tMaXN0ZW5lciBkb3VibGVDbGlja0xpc3RlbmVyID0gbnVsbDsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JCi0JcHJpdmF0ZSBMYXlvdXRBY3Rpb25Hcm91cCBmTGF5b3V0QWN0aW9uU2V0OwotCi0JLy8gTGlzdGVuIHRvIHByb2Nlc3MgZWRpdG9yIGFjdGl2YXRpb24gYW5kIHByb21wdCB0aGUgdXNlciB0byBsb2FkIHRoZQotCS8vIHRoZSBwcm9jZXNzJ3MgZGVmYXVsdCBDb25maWd1cmF0aW9uIGludG8gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLQlwcml2YXRlIElQYXJ0TGlzdGVuZXIgZWRpdG9yUGFydExpc3RlbmVyID0gbmV3IElQYXJ0TGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCU9iamVjdCBvYmogPSBudWxsOwotCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBpbnB1dCA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpICgoSUVkaXRvclBhcnQpIHBhcnQpCi0JCQkJCQkJLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJCWlmIChpbnB1dC5nZXRTdXBwcmVzc2lvbigpLmdldFByb2Nlc3MoKSAhPSBudWxsKSB7Ci0JCQkJCQlvYmogPSBpbnB1dC5nZXRTdXBwcmVzc2lvbigpLmdldFByb2Nlc3MoKS5lQ29udGFpbmVyKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlvYmogPSBFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuZ2V0U2VsZWN0ZWRFZGl0b3JJbnB1dCgpOwotCQkJCX0KLQkJCQlpZiAob2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlTd2l0Y2hDb25maWdEaWFsb2cgZGlhbG9nID0gbmV3IFN3aXRjaENvbmZpZ0RpYWxvZyhEaXNwbGF5Ci0JCQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCkKLQkJCQkJCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpKTsKLQkJCQkJZGlhbG9nLmV4ZWN1dGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIGxvbmcgbGFzdFJlZnJlc2hUaW1lU3RhbXA7Ci0KLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIG1hcmtlckxpc3RlbmVyID0gbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpID09IG51bGwKLQkJCQkJfHwgTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKQotCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCkgPT0gbnVsbAotCQkJCQl8fCBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpCi0JCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJdHJ5IHsKLQkJCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKQotCQkJCQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1BUktFUlMpID09IElSZXNvdXJjZURlbHRhLk1BUktFUlMpIHsKLQkJCQkJCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQ6Ci0JCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOgotCQkJCQkJCQkvLyBzaG93IFByb2JsZW1zIFZpZXcKLQkJCQkJCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9ICgoSUxpYnJhcnlSZXNvdXJjZVNldCkgTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKQotCQkJCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkJCQkJCWlmIChyZXNvdXJjZVNldC5oYXNVbnJlc29sdmVkUHJveHkoKSkgewotCQkJCQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIKLQkJCQkJCQkJCQkJLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJCQkJUGxhdGZvcm1VSQotCQkJCQkJCQkJCQkJCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkJCQkJCS5nZXRBY3RpdmVQYWdlKCkKLQkJCQkJCQkJCQkJCQkJCQkuc2hvd1ZpZXcoCi0JCQkJCQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MuUHJvYmxlbVZpZXciLCBudWxsLCBJV29ya2JlbmNoUGFnZS5WSUVXX1ZJU0lCTEUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkJCQkJLy8gY291bGRuJ3Qgb3BlbiB0aGUKLQkJCQkJCQkJCQkJCQkJLy8gcHJvYmxlbSB2aWV3LCB0b28KLQkJCQkJCQkJCQkJCQkJLy8gYmFkLi4KLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCX0pOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQk7Ci0KLQkJCQlSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCk7Ci0JCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOwotCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJfQotCi0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElSZWZyZXNoTGlzdGVuZXIgcmVmcmVzaExpc3RlbmVyID0gbmV3IElSZWZyZXNoTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgbm90aWZ5UmVmcmVzaGVkKElSZWZyZXNoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5nZXRSZWZyZXNoZWRPYmplY3RzKCkgIT0gbnVsbAotCQkJCQkmJiAhZXZlbnQuZ2V0UmVmcmVzaGVkT2JqZWN0cygpLmlzRW1wdHkoKSkgewotCQkJCUNvbnRyb2wgY3RybCA9IGdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlpZiAoY3RybC5nZXREaXNwbGF5KCkuZ2V0VGhyZWFkKCkgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkgewotCQkJCQlkb1JlZnJlc2goZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWRvUmVmcmVzaChudWxsKTsKLQkJCQkJCX0KLQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5VmlldygpIHsKLQkJLy8gcmVhZCBsYXlvdXQgcHJlZgotCQlpZiAoUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5GTEFUX0xBWU9VVC5lcXVhbHMoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLmdldExheW91dCgpKSkgewotCQkJUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5zZXRMYXlvdXRGbGF0KCk7Ci0JCX0gZWxzZSBpZiAoUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5ISUVSQVJDSElDQUxfTEFZT1VULmVxdWFscyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuZ2V0TGF5b3V0KCkpKSB7Ci0JCQlQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLnNldExheW91dEhpZXJhcmNoaWNhbCgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVQYXJ0Q29udHJvbChwYXJlbnQpOwotCQkKLQkJbWFrZUFjdGlvbnMoKTsKLQkJCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LAotCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfTkFWSUdBVE9SX1ZJRVdfQ09OVEVYVCk7Ci0KLQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldFJlZnJlc2hIYW5kbGVyKHRoaXMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0JCWZMYXlvdXRBY3Rpb25TZXQ9IG5ldyBMYXlvdXRBY3Rpb25Hcm91cCh0aGlzKTsKLQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycz0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCWZMYXlvdXRBY3Rpb25TZXQuZmlsbEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQkvLyBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgdGhlIGdsb2JhbCBlZGl0IGFjdGlvbiB3b3JrIHRoZSBmaXJzdCB0aW1lLgotCQlhY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVWaWV3KHRoaXMpOwotCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGVkLmlzRW1wdHkoKSkKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLmRpc2FibGVHbG9iYWxFZGl0TWVudSgpOwotCQllbHNlCi0JCQlhY3Rpb25CYXJDb250cmlidXRvci5lbmFibGVHbG9iYWxFZGl0TWVudSgpOwotCi0JCWlmICh0cmVlVmlld2VyICE9IG51bGwpIHsKLQkJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHRyZWUgdmlld2VyLgotCSAqLwotCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdHJlZVZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB1bmRlcmx5aW5nIHRyZWUgdmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyI2hhbmRsZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCkKLQkJCSAqLwotCQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTGFiZWxQcm92aWRlckNoYW5nZWQoCi0JCQkJCUxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVJlc291cmNlCi0JCQkJCQkmJiBldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIElMYWJlbERlY29yYXRvcikgewotCQkJCQl0aGlzLnJlZnJlc2goKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlzdXBlci5oYW5kbGVMYWJlbFByb3ZpZGVyQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX07Ci0KLQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUKLQkJLy8gZXhlY3V0ZWQuCi0JCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOwotCi0JCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8KLQkJLy8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCi0JCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcihuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGZpbmFsIEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKLQotCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KLQkJCQkJCUNvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaykgZXZlbnQKLQkJCQkJCQkJLmdldFNvdXJjZSgpKS5nZXRNb3N0UmVjZW50Q29tbWFuZCgpOwotCQkJCQkJaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZAotCQkJCQkJCQkJLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsCi0JCQkJCQkJCSYmIHByb3BlcnR5U2hlZXRQYWdlLmdldENvbnRyb2woKSAhPSBudWxsCi0JCQkJCQkJCSYmICFwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpCi0JCQkJCQkJCSYmIHByb3BlcnR5U2hlZXRQYWdlLmdldENvbnRyb2woKS5pc1Zpc2libGUoKSkgewotCQkJCQkJCXByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwpIHsKLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlydW5uYWJsZS5ydW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBQZXJzaXN0ZW5jZVNlcnZpY2UuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUmVzb3VyY2VTZXQoU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZW5jZVR5cGUoKSk7Ci0KLQkJZWRpdGluZ0RvbWFpbiA9IG5ldyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgcmVzb3VyY2VTZXQpOwotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5yZWdpc3RlckVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0KLQkJCW1hbmFnZXIuYWRkUHJvcGVydHlMaXN0ZW5lcihuZXcgSVByb3BlcnR5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wSWQpIHsKLQkJCQkJLy8gVE9ETzogUmVwbGFjZSBoYXJkY29kZWQgY29uc3RhbnQgd2l0aCB2YXJpYWJsZS4KLQkJCQkJaWYgKHByb3BJZCA9PSAxKSB7Ci0JCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCi0JCS8vIHRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcKLQkJLy8gQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIoCi0JCQkJbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSksCi0JCQkJbmV3IE1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvcigpKSk7Ci0KLQkJLy8gQWRkIGEgZG91YmxlIGNsaWNrIGxpc3RlbmVyIGZvciBsYXVuY2hpbmcgdGhlIE1ldGhvZCBlZGl0b3JzLgotCQlkb3VibGVDbGlja0xpc3RlbmVyID0gbmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLmhhbmRsZURvdWJsZUNsaWNrRXZlbnQoZXZlbnQpOwotCQkJfQotCQl9OwotCQl0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIoZG91YmxlQ2xpY2tMaXN0ZW5lcik7Ci0KLQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIoZWRpdG9yUGFydExpc3RlbmVyKTsKLQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKLQkJCQkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihtYXJrZXJMaXN0ZW5lcik7Ci0KLQkJY3JlYXRlQ29udGV4dE1lbnVGb3IodHJlZVZpZXdlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjc2V0SW5wdXRGb3JWaWV3ZXIoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0Rm9yVmlld2VyKE9iamVjdCBtb2RlbCkgewotCQlDb250cm9sIGN0cmwgPSB0aGlzLmdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJaWYgKGN0cmwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG1vZGVsID09IG51bGwgfHwgbW9kZWwgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkvLyBQcmV2ZW50IG1lbW9yeSBsZWFrLgotCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBlbXB0eVNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0JCQlhY3Rpb25EaXNwYXRjaGVyLnNldFNlbGVjdGlvbihlbXB0eVNlbGVjdGlvbik7Ci0JCQlVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5zZXRTZWxlY3Rpb24oZW1wdHlTZWxlY3Rpb24pOwotCi0JCQlnZXRWaWV3ZXIoKS5zZXRJbnB1dChtb2RlbCk7Ci0JCQl1cGRhdGVMYXN0UmVmcmVzaFRpbWVzdGFtcCgpOwotCQl9IGVsc2UgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJMaWJyYXJ5IHZpZXdlciBpbnB1dCBpcyBub3QgYSBNZXRob2RMaWJyYXJ5IG9iamVjdDogIiArIG1vZGVsKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUxhc3RSZWZyZXNoVGltZXN0YW1wKCkgewotCQlsYXN0UmVmcmVzaFRpbWVTdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyB2aWV3LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVZpZXcgZ2V0VmlldygpIHsKLQkJcmV0dXJuIChMaWJyYXJ5VmlldykgVmlld0hlbHBlci5vcGVuVmlldyhWSUVXX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJKChMaWJyYXJ5Vmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yKSBhY3Rpb25CYXJDb250cmlidXRvcikKLQkJCQkudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0KLQkJc3VwZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCi0JCS8vIGlmIG9ubHkgb25lIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIHNob3cgcGF0aCB0byBpdHMgZmlsZSBpbiBzdGF0dXMgbGluZQotCQkvLwotCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKQotCQkJCS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAoc3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEVPYmplY3QpIG8pLmVSZXNvdXJjZSgpOwotCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQlVUkkgdXJpID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQkJCQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5pc0ZpbGUoKSkgewotCQkJCQkJCQlwYXRoID0gdXJpLnRvRmlsZVN0cmluZygpOwotCQkJCQkJCQlpZiAobyBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9ICgoQ29udGVudEVsZW1lbnQpIG8pCi0JCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCQkJCQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQkJCQkJCQlyZXNvdXJjZSA9IGNvbnRlbnQuZVJlc291cmNlKCk7Ci0JCQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJVVJJIGNvbnRlbnRVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCQkJCQkJCQkJaWYgKGNvbnRlbnRVUkkgIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJcGF0aCA9IHBhdGgKLQkJCQkJCQkJCQkJCQkJKyAiLC4iICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgY29udGVudFVSSS5kZXJlc29sdmUodXJpKS50b0ZpbGVTdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShwYXRoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlyZWZyZXNoVmlld3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYWN0aW9uIGJhciBmb3IgdGhlIGxpYnJhcnkgdmlldwotCSAqLwotCWNsYXNzIExpYnJhcnlWaWV3QWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcyBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JCXByaXZhdGUgSUFjdGlvbiBuZXdQbHVnaW5BY3Rpb24gPSBuZXcgTmV3UGx1Z2luQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld19wbHVnaW4pOwotCi0JCXByaXZhdGUgSUFjdGlvbiBtb3ZlQWN0aW9uID0gbmV3IEFjdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5tb3ZlKSB7Ci0KLQkJCXByaXZhdGUgdm9pZCBkb01vdmUoKSB7Ci0JCQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvTW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIExpYnJhcnlWaWV3LnRoaXMuc2VsZWN0aW9uOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCQkJfHwgKGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KSkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQkJLy8gSGFuZGxlIEN1c3RvbUNhdGVnb3J5IHNwZWNpYWxseS4KLQkJCQkJCUVPYmplY3QgY29udGFpbmVyID0gKChFT2JqZWN0KSBlbGVtZW50KS5lQ29udGFpbmVyKCk7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeSgKLQkJCQkJCQkJY29udGFpbmVyLCBnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfbW92ZUVycm9yLAotCQkJCQkJCQkJCQlzdGF0dXMpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWVsZW1lbnRzVG9Nb3ZlLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIFRPRE86IFByb21wdCB0aGUgdXNlciB0aGUgc2F2ZSBlZGl0aW5nIGNoYW5nZXMgZm9yCi0JCQkJLy8gZWxlbWVudHMgdGhhdCB3aWxsIGJlIG1vdmVkLgotCi0JCQkJLy8gUmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIG1vdmUgbGlzdCBpZiB0aGVpciBjb250YWluZXJzIGFyZQotCQkJCS8vIGFscmVhZHkgaW4gdGhlIG1vdmUgbGlzdC4KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudHNUb01vdmUuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWJvb2xlYW4gaXNDb250YWluZWQgPSBmYWxzZTsKLQkJCQkJY2hlY2tfY29udGFpbmVkOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvTW92ZQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGVsZW1lbnQsIGUpKSB7Ci0JCQkJCQkJaXNDb250YWluZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGNoZWNrX2NvbnRhaW5lZDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoaXNDb250YWluZWQpIHsKLQkJCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTW92ZURpYWxvZyBkbGcgPSBuZXcgTW92ZURpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWVsZW1lbnRzVG9Nb3ZlLCBlZGl0aW5nRG9tYWluKTsKLQkJCQlkbGcub3BlbigpOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQkJCXJ1bm5lci5zZXRQcm9ncmVzc01vbml0b3IoZ2V0QWN0aW9uQmFycygpCi0JCQkJCQkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJZG9Nb3ZlKCk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiByZW5hbWVBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZUFjdGlvbl90ZXh0KSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmaW5hbCBOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpIFRuZ1V0aWwKLQkJCQkJCS51bndyYXAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoZSwgZ2V0U2l0ZSgpCi0JCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRGlhbG9nX3RpdGxlLAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ19yZW5hbWVFcnJvciwKLQkJCQkJCQlzdGF0dXMpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKGUuZUNvbnRhaW5lcigpICE9IG51bGwKLQkJCQkJCSYmIGUuZUNvbnRhaW5lcigpLmVSZXNvdXJjZSgpICE9IGUuZVJlc291cmNlKCkpIHsKLQkJCQkJc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KGUuZUNvbnRhaW5lcigpLAotCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfcmVuYW1lRXJyb3IsCi0JCQkJCQkJCQkJc3RhdHVzKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWZpbmFsIElWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVOYW1lVmFsaWRhdG9yKGUsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQlJSW5wdXRWYWxpZGF0b3IgaW5wdXRWYWxpZGF0b3IgPSBuZXcgSUlucHV0VmFsaWRhdG9yKCkgewotCQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCS5nZXRTaW1wbGVFcnJvck1lc3NhZ2UodmFsaWRhdG9yCi0JCQkJCQkJCQkJCS5pc1ZhbGlkKG5ld1RleHQpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCWJvb2xlYW4gZ2V0SW5wdXQgPSB0cnVlOwotCQkJCUlucHV0RGlhbG9nIGlucHV0RGxnID0gbmV3IElucHV0RGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lX3RleHQsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXduYW1lX3RleHQsIGUuZ2V0TmFtZSgpLAotCQkJCQkJaW5wdXRWYWxpZGF0b3IpOwotCQkJCXdoaWxlIChnZXRJbnB1dCkgewotCQkJCQlnZXRJbnB1dCA9IGZhbHNlOwotCQkJCQlpZiAoaW5wdXREbGcub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCQkJZmluYWwgU3RyaW5nIG5ld05hbWUgPSBpbnB1dERsZy5nZXRWYWx1ZSgpLnRyaW0oKTsKLQkJCQkJCWlmICghbmV3TmFtZS5lcXVhbHMoZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCQkJCVN0cmluZ1tdIGNvbmZpZ05hbWVzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lcyhMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJaWYgKG5ld05hbWUuZXF1YWxzKGNvbmZpZ05hbWVzW2ldKSkgewotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwKLQkJCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQkJCQkJCQkJCQkJCQkJbmV3TmFtZSkpOwotCQkJCQkJCQkJCWdldElucHV0ID0gdHJ1ZTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoZ2V0SW5wdXQgPT0gdHJ1ZSkgewotCQkJCQkJCQlpbnB1dERsZyA9IG5ldyBJbnB1dERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJCQkJCS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZV90ZXh0LAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld25hbWVfdGV4dCwgZQotCQkJCQkJCQkJCQkJLmdldE5hbWUoKSwgaW5wdXRWYWxpZGF0b3IpOwotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJZG9SZW5hbWUoZSwgbmV3TmFtZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIHJlcGxhY2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld19yZXBsYWNlQWN0aW9uX3RleHQpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghZ2V0UGFnZSgpLmNsb3NlQWxsRWRpdG9ycyh0cnVlKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJZmluYWwgUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJUHJvY2VzcyBwcm9jID0gcHJvY0NvbXAuZ2V0UHJvY2VzcygpOwotCQkJCWZpbmFsIFN0cmluZyB0eXBlU3RyOwotCQkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJdHlwZVN0ciA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld18yMDsKLQkJCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJdHlwZVN0ciA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld18yMTsKLQkJCQl9IGVsc2UgewotCQkJCQl0eXBlU3RyID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3XzIyOwotCQkJCX0KLQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlyRGxnID0gbmV3IERpcmVjdG9yeURpYWxvZyhnZXRTaXRlKCkKLQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQlkaXJEbGcuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfcmVwbGFjZV90ZXh0KTsKLQkJCQlkaXJEbGcKLQkJCQkJCS5zZXRNZXNzYWdlKE1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfbWlncmF0aW9uX2Rpcl9kbGdfZGVzY3JpcHRpb25fdGV4dCwKLQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyB0eXBlU3RyIH0pKTsKLQkJCQlmaW5hbCBTdHJpbmcgZGlyID0gZGlyRGxnLm9wZW4oKTsKLQkJCQlpZiAoZGlyID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWJvb2xlYW4gcmV0ID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkucnVuV2l0aFByb2dyZXNzKAotCQkJCQkJCQluZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCUltcG9ydEV4cG9ydFV0aWwucmVwbGFjZShwcm9jQ29tcCwKLQkJCQkJCQkJCQkJCQlkaXIpOwotCQkJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSwKLQkJCQkJCQkJTWVzc2FnZUZvcm1hdAotCQkJCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfcmVwbGFjZWluZ3dpdGhmb3JtYXRfdGV4dCwKLQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IHR5cGVTdHIgfSkpOwotCi0JCQkJaWYgKHJldCkgewotCQkJCQkvLyBSZW9wZW4gdGhlIGxpYnJhcnkuCi0JCQkJCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5vcGVuTGlicmFyeSgKLQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gb3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfb3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uX3RleHQpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqOwotCQkJCQlWYXJpYWJpbGl0eVNlbGVjdGlvbiB2YXJpYWJpbGl0eVNlbGVjdGlvbiA9IG5ldyBWYXJpYWJpbGl0eVNlbGVjdGlvbigpOwotCQkJCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSB2YXJpYWJpbGl0eVNlbGVjdGlvbgotCQkJCQkJCS5nZXRTZWxlY3RlZFZhcmlhYmlsaXR5KGVsZW1lbnQpOwotCQkJCQlpZiAoc2VsZWN0ZWRPYmplY3QgIT0gbnVsbCkgewotCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3Ioc2VsZWN0ZWRPYmplY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgYm9vbGVhbiBsb2NrZWQ7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGNhblJlbmFtZTsKLQotCQlwcml2YXRlIGJvb2xlYW4gY2FuTW92ZTsKLQotCQlwcml2YXRlIElBY3Rpb24gc2hvd0luUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uX2xhYmVsKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVJlc291cmNlTmF2aWdhdG9yIG5hdmlnYXRvcjsKLQkJCQl0cnkgewotCQkJCQluYXZpZ2F0b3IgPSAoUmVzb3VyY2VOYXZpZ2F0b3IpIGdldFBhZ2UoKS5zaG93VmlldygKLQkJCQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MuUmVzb3VyY2VOYXZpZ2F0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlPYmplY3Qgb2JqID0gVG5nVXRpbAotCQkJCQkJCS51bndyYXAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQkJSVJlc291cmNlIHdzUmVzID0gUGVyc2lzdGVuY2VVdGlsLmdldFdvcmtzcGFjZVJlc291cmNlKG9iaik7Ci0JCQkJCWlmICh3c1JlcyAhPSBudWxsKSB7Ci0JCQkJCQluYXZpZ2F0b3IuZ2V0Vmlld2VyKCkuc2V0U2VsZWN0aW9uKAotCQkJCQkJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbih3c1JlcyksIHRydWUpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCQkgKi8KLQkJcHVibGljIExpYnJhcnlWaWV3QWN0aW9uQmFyQ29udHJpYnV0b3IoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCQlzdXBlcihlZGl0aW5nRG9tYWluKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjY3JlYXRlRGVsZXRlQWN0aW9uKCkKLQkJICovCi0JCXByb3RlY3RlZCBEZWxldGVBY3Rpb24gY3JlYXRlRGVsZXRlQWN0aW9uKCkgewotCQkJTGlicmFyeVZpZXdEZWxldGVBY3Rpb24gYWN0aW9uID0gbmV3IExpYnJhcnlWaWV3RGVsZXRlQWN0aW9uKCkgewotCQkJCS8qKgotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkVsZW1lbnRzVmlld1Bhc3RlQWN0aW9uI3VwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCQkgKi8KLQkJCQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJCWlmIChsb2NrZWQpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclRpdGxlOwotCQkJCQl0cnkgewotCQkJCQkJc3VwZXIucnVuKCk7Ci0JCQkJCX0gY2F0Y2ggKE1lc3NhZ2VFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVN0cmluZyBkZXRhaWxzID0gVG5nVXRpbC50b1N0YWNrVHJhY2VTdHJpbmcoZSk7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yTWVzc2FnZTsKLQkJCQkJCVN0cmluZyByZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclJlYXNvbjsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCByZWFzb24sIGRldGFpbHMsCi0JCQkJCQkJCQkJZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVGYWlsZWQoKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5SW5mbygKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kbGdUaXRsZV9yZWxvYWRMaWJyYXJ5LAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm1zZ19yZWxvYWRMaWJyYXJ5KTsKLQotCQkJCQkvLyBMaWJyYXJ5IG5lZWQgdG8gYmUgcmVsb2FkZWQuCi0JCQkJCVN0cmluZyBsaWJEaXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpOwotCQkJCQlMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkub3BlbkxpYnJhcnkobGliRGlyKTsKLQotCQkJCQkvLyBVc2VyIHRyaWVkIHRvIHNlbGVjdCB0aGUgb2xkIHNlbGVjdGlvbi4KLQkJCQkJaWYgKGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7Ci0JCQkJCQlmaW5hbCBBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQkJCVN0cmluZyBndWlkID0gKChNZXRob2RFbGVtZW50KSBlKS5nZXRHdWlkKCk7Ci0JCQkJCQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCQkJCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbWFuYWdlcgotCQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQkJCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcikgYWN0aXZlVmlld1BhcnQpCi0JCQkJCQkJCQkuZ2V0Vmlld2VyKCk7Ci0JCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQkJCWVsZW1lbnRzKSwgdHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJYWN0aW9uLnNldFByb2dyZXNzTW9uaXRvcihnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCQkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJcmV0dXJuIGFjdGlvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjY3JlYXRlQ3V0QWN0aW9uKCkKLQkJICovCi0JCXByb3RlY3RlZCBDdXRBY3Rpb24gY3JlYXRlQ3V0QWN0aW9uKCkgewotCQkJcmV0dXJuIG5ldyBMaWJyYXJ5Vmlld0N1dEFjdGlvbigpIHsKLQkJCQkvKioKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5FbGVtZW50c1ZpZXdQYXN0ZUFjdGlvbiN1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQkJICovCi0JCQkJcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCQlpZiAobG9ja2VkKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2NyZWF0ZUNvcHlBY3Rpb24oKQotCQkgKi8KLQkJcHJvdGVjdGVkIENvcHlBY3Rpb24gY3JlYXRlQ29weUFjdGlvbigpIHsKLQkJCXJldHVybiBuZXcgTGlicmFyeVZpZXdDb3B5QWN0aW9uKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2NyZWF0ZVBhc3RlQWN0aW9uKCkKLQkJICovCi0JCXByb3RlY3RlZCBQYXN0ZUFjdGlvbiBjcmVhdGVQYXN0ZUFjdGlvbigpIHsKLQkJCUxpYnJhcnlWaWV3UGFzdGVBY3Rpb24gYWN0aW9uID0gbmV3IExpYnJhcnlWaWV3UGFzdGVBY3Rpb24oKSB7Ci0JCQkJLyoqCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuRWxlbWVudHNWaWV3UGFzdGVBY3Rpb24jdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJaWYgKGxvY2tlZCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQl9OwotCQkJYWN0aW9uLnNldFByb2dyZXNzTW9uaXRvcihnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCQkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJcmV0dXJuIGFjdGlvbjsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjaGVja0xvY2tlZCgpIHsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCWJvb2xlYW4gd2FzTG9ja2VkID0gbG9ja2VkOwotCQkJCWxvY2tlZCA9IFZpZXdIZWxwZXIuaXNMb2NrZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwotCQkJCWlmICh3YXNMb2NrZWQgIT0gbG9ja2VkKSB7Ci0JCQkJCWRlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKGRlbGV0ZUFjdGlvbgotCQkJCQkJCS51cGRhdGVTZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pKTsKLQkJCQkJY3V0QWN0aW9uLnNldEVuYWJsZWQoY3V0QWN0aW9uCi0JCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikpOwotCQkJCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKHBhc3RlQWN0aW9uCi0JCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikpOwotCQkJCQlib29sZWFuIGVuYWJsZWQgPSAhbG9ja2VkOwotCQkJCQlyZW5hbWVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQkJbW92ZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXZvaWQgdXBkYXRlU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQotCQkJbG9ja2VkID0gVmlld0hlbHBlci5pc0xvY2tlZChzZWwpOwotCi0JCQlib29sZWFuIGVuYWJsZWQgPSAhbG9ja2VkOwotCQkJcmVuYW1lQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQltb3ZlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJCWNhblJlbmFtZSA9IGNhblJlbmFtZShzZWwpOwotCQkJY2FuTW92ZSA9IGNhbk1vdmUoc2VsKTsKLQotCQkJaWYgKCFsb2NrZWQgJiYgc2VsLnNpemUoKSA9PSAxCi0JCQkJCSYmIHNlbC5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlyZXBsYWNlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlcGxhY2VBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCWlmIChzZWwuc2l6ZSgpID09IDEpIHsKLQkJCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQlvcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb24KLQkJCQkJCS5zZXRFbmFibGVkKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudAotCQkJCQkJCQkmJiAhVG5nVXRpbC5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIG9iaikpOwotCQkJCXNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uCi0JCQkJCQkuc2V0RW5hYmxlZChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNlbmFibGVHbG9iYWxFZGl0TWVudSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbmFibGVHbG9iYWxFZGl0TWVudSgpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IjYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQkJc3VwZXIuYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7Ci0JCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiZml4ZWQtYWRkaXRpb25zIiwgbmV3UGx1Z2luQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGNhbk1vdmUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQkJCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KQotCQkJCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKQotCQkJCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJCQkJCSYmICFUbmdVdGlsLmlzUHJlZGVmaW5lZCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI21lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQljaGVja0xvY2tlZCgpOwotCi0JCQkvLyBBZGQgb3VyIHN0YW5kYXJkIG1hcmtlci4KLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJmaXhlZC1hZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJmaXhlZC1hZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZWRpdCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBBZGQgdGhlIGVkaXQgbWVudSBhY3Rpb25zLgotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGxpYnJhcnlWaWV3RWRpdEFjdGlvbikpOwotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGNvcHlBY3Rpb24pKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShwYXN0ZUFjdGlvbikpOwotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oZGVsZXRlQWN0aW9uKSk7Ci0JCQlpZiAoY2FuUmVuYW1lKSB7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKHJlbmFtZUFjdGlvbikpOwotCQkJfQotCQkJaWYgKGNhbk1vdmUpIHsKLQkJCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0obW92ZUFjdGlvbikpOwotCQkJfQotCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigidmlldyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG9wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSgKLQkJCQkJCW9wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbikpOwotCQkJfQotCQkJaWYgKHNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKAotCQkJCQkJc2hvd0luUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb24pKTsKLQkJCX0KLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0JCQkvLyBBZGQgb3VyIG90aGVyIHN0YW5kYXJkIG1hcmtlciB3aGVyZSBvdGhlciBwbHVnaW5zIHdpbGwgY29udHJpYnV0ZQotCQkJLy8gbWVudQotCQkJLy8KLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCi0KLQkJCWFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOwotCi0JCQlpZiAoIWxvY2tlZCkgewotCQkJCU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbnVsbDsKLQkJCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0pOwotCQkJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQkvLyBtZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbigiUmVsb2FkIikgewotCQkJLy8gLyoKLQkJCS8vICogKG5vbi1KYXZhZG9jKQotCQkJLy8gKgotCQkJLy8gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJCS8vICovCi0JCQkvLyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkvLyBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQkJLy8gaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkvLyBPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJLy8gLmdldEZpcnN0RWxlbWVudCgpOwotCQkJLy8gb2JqZWN0ID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJCS8vIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCS8vIEludGVybmFsRU9iamVjdCBlID0gKChJbnRlcm5hbEVPYmplY3QpIG9iamVjdCk7Ci0JCQkvLyBJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIGUKLQkJCS8vIC5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJLy8gcmVzb3VyY2VTZXQudW5sb2FkKGUpOwotCQkJLy8gVVJJIHVyaSA9IGUuZVByb3h5VVJJKCk7Ci0JCQkvLyBFT2JqZWN0IG5ld09iamVjdCA9IHJlc291cmNlU2V0LmdldEVPYmplY3QoZSwgdXJpLAotCQkJLy8gdHJ1ZSk7Ci0JCQkvLyByZWZyZXNoVmlld3MoKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlbGVjdGVkIG1ldGhvZCBlbGVtZW50cyBjYW4gYmUKLQkJICogcmVuYW1lZC4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBjYW5SZW5hbWUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQKLQkJCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlbGVtZW50KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI3JlZnJlc2hWaWV3ZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlld2VyKGZpbmFsIFZpZXdlciB2aWV3ZXIpIHsKLQkJCWlmICh2aWV3ZXIgPT0gTGlicmFyeVZpZXcudGhpcy5nZXRWaWV3ZXIoKSkgewotCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtKTsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBSZWZyZXNoIGFsbCBsb2FkZWQgcmVzb3VyY2VzLgotCQkJCQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJCQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBtYW5hZ2VyCi0JCQkJCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0Ci0JCQkJCQkJCQkJJiYgKChJTGlicmFyeVJlc291cmNlU2V0KSByZXNvdXJjZVNldCkKLQkJCQkJCQkJCQkJCS5nZXRQZXJzaXN0ZW5jZVR5cGUoKQotCQkJCQkJCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCQkJCQkJU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKSB7Ci0JCQkJCQkJCQlMaXN0IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCQlMaXN0IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KAotCQkJCQkJCQkJCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKSkKLQkJCQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyCi0JCQkJCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCQkJCVN0cmluZyBsb2MgPSByZXNvdXJjZS5nZXRVUkkoKQotCQkJCQkJCQkJCQkJLnRvRmlsZVN0cmluZygpOwotCQkJCQkJCQkJCUlSZXNvdXJjZSB3c1JlcyA9IEZpbGVNYW5hZ2VyCi0JCQkJCQkJCQkJCQkuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihsb2MpOwotCQkJCQkJCQkJCWlmICh3c1JlcyA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJCQl9IGVsc2UgaWYgKCF3c1JlcwotCQkJCQkJCQkJCQkJLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKSkgewotCQkJCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJbW9uaXRvci53b3JrZWQoMik7Ci0JCQkJCQkJCQlpZiAocmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQkJCQkJCQkJJiYgY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlkb1JlZnJlc2gocmVtb3ZlZFJlc291cmNlcywKLQkJCQkJCQkJCQkJCWNoYW5nZWRSZXNvdXJjZXMsIG51bGwsIGZhbHNlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9OwotCQkJCUlSdW5uYWJsZUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpCi0JCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bkluVUkoY29udGV4dCwgcnVubmFibGUsCi0JCQkJCQkJCQludWxsKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yVGl0bGU7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJdGl0bGUsIGUudG9TdHJpbmcoKSwgZSk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCXN1cGVyLnJlZnJlc2hWaWV3ZXIodmlld2VyKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I2NyZWF0ZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCkKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciBjcmVhdGVBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciBhY3Rpb25CYXIgPSBuZXcgTGlicmFyeVZpZXdBY3Rpb25CYXJDb250cmlidXRvcigKLQkJCQllZGl0aW5nRG9tYWluKTsKLQkJcmV0dXJuIGFjdGlvbkJhcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNjcmVhdGVDb250ZXh0TWVudUZvcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXIpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoZmluYWwgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIuY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyKTsKLQkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTks7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKLQkJCQlUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0JCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsCi0JCQkJbmV3IExpYnJhcnlWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNtZW51QWJvdXRUb1Nob3cob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0I2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdTaXRlIHNpdGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmluaXQoc2l0ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldFJlZnJlc2hIYW5kbGVyKG51bGwpOwotCi0JCWlmIChmTGF5b3V0QWN0aW9uU2V0ICE9IG51bGwpCQotCQkJZkxheW91dEFjdGlvblNldC5kaXNwb3NlKCk7Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAoZG91YmxlQ2xpY2tMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQl0cmVlVmlld2VyLnJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIoZG91YmxlQ2xpY2tMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBJdGVtUHJvdmlkZXIKLQkgKiBAcmV0dXJuIFByb2Nlc3NDb21wb25lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmoKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudCBnZXRQcm9jZXNzQ29tcG9uZW50KE9iamVjdCBvYmopIHsKLQkJT2JqZWN0IHBhcmVudDsKLQkJZm9yIChwYXJlbnQgPSBvYmo7IChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKTspIHsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJfQotCQlyZXR1cm4gKFByb2Nlc3NDb21wb25lbnQpIHBhcmVudDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdGF0dXNXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gZXh0ZW5kcwotCQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHsKLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGVyck1zZzsKLQotCQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJCXJldHVybiBlcnJNc2c7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBvcGVucyBhIE1ldGhvZCBMaWJyYXJ5Ci0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHBhdGggdG8gdGhlIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuTGlicmFyeShmaW5hbCBTdHJpbmcgcGF0aCkgewotCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZwotCQkvLyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCi0JCVN0YXR1c1dvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgU3RhdHVzV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCi0JCQkvLyBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBnZXRzIGludm9rZWQgd2hlbiB0aGUgb3BlcmF0aW9uIHJ1bnMuCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5pbmdMaWJyYXJ5VGFza19uYW1lLAotCQkJCQkJMik7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBYTUlMaWJyYXJ5VXRpbAotCQkJCQkJCS5vcGVuTWV0aG9kTGlicmFyeShwYXRoKTsKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRDdXJyZW50TWV0aG9kTGlicmFyeSgKLQkJCQkJCQlsaWJyYXJ5KTsKLQkJCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0U2F2ZWRMaWJyYXJ5UGF0aChwYXRoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJaWYgKGV4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gZXguZ2V0TWVzc2FnZSgpOwotCQkJCQkJaWYgKG1lc3NhZ2Uuc3RhcnRzV2l0aCgiIyMjIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBwcm9qZWN0RmlsZU5hbWUgPSBtZXNzYWdlLnN1YnN0cmluZygzKTsKLQkJCQkJCQlTdHJpbmcgcHJvbXB0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld18zNSwKLQkJCQkJCQkJCShuZXcgT2JqZWN0W10geyBwcm9qZWN0RmlsZU5hbWUgfSkpOwotCQkJCQkJCWlmIChNc2dCb3gucHJvbXB0KHByb21wdCwgU1dULlJFVFJZIHwgU1dULkNBTkNFTCkgPT0gU1dULlJFVFJZKSB7Ci0JCQkJCQkJCW9wZW5MaWJyYXJ5KHBhdGgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMub3BlbkxpYnJhcnlFcnJvcl9tc2csCi0JCQkJCQkJCQkJZXgpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQkvLyBUaGlzIHJ1bnMgdGhlIG9wdGlvbnMsIGFuZCBzaG93cyBwcm9ncmVzcy4KLQkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpLnJ1bih0cnVlLCBmYWxzZSwKLQkJCQkJb3BlcmF0aW9uKTsKLQkJCWlmIChvcGVyYXRpb24uZ2V0RXJyb3JNZXNzYWdlKCkgPT0gbnVsbCkgewotCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I2hhbmRsZUFjdGl2YXRlKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFjdGl2YXRlKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJc3VwZXIuaGFuZGxlQWN0aXZhdGUocGFydCk7Ci0KLQkJLy8gVE9ETzogUmV2aWV3IGltcGxlbWVudGF0aW9uLgotCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbWV0aG9kIGxpYnJhcnkgb3BlbiBpcyBub3QgY2xvc2VkLgotCQlYTUlMaWJyYXJ5VXRpbC5vcGVuTWV0aG9kTGlicmFyeVByb2plY3QoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKQotCQkJCS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuU2F2ZWFibGVMaWJyYXJ5Vmlld1BhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCS8vIFRoaXMgdmlldyBzaG91bGQgbm90IHBhcnRpY2lwYXRlIGluIGFsbCB0aGUgc2F2ZSBjb21tYW5kcy4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5TYXZlYWJsZUxpYnJhcnlWaWV3UGFydCNkb1NhdmVBcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0V3JhcHBlcihMaXN0IGxpc3RlbmVycywgT2JqZWN0IHZhbHVlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBsaXN0ZW5lciA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYobGlzdGVuZXIgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJCSYmIFRuZ1V0aWwudW53cmFwKGxpc3RlbmVyKSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiAoRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgbGlzdGVuZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFVzZWQgYnkgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpbmtXaXRoRWRpdG9yIEdpdmVuIGFuCi0JICogb2JqZWN0IHRoYXQgaXMgYSBNZXRob2RFbGVtZW50LCBzZWxlY3RzIHRoYXQgb2JqZWN0IGluIHRoZSBMaWIgTmF2Ci0JICogCi0JICogQHBhcmFtIG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpKQotCQkJcmV0dXJuOwotCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXN1cGVyLnNldFNlbGVjdGlvblRvVmlld2VyKEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsgbyB9KSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoTWV0aG9kRWxlbWVudCkgbyk7Ci0JCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUocGx1Z2luLCB0cnVlKTsKLQotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHBsdWdpbkFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJCS5nZXRBZGFwdGVyKHBsdWdpbiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQotCQkJaWYgKG8gaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7CQkJCQotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudClvKTsKLQkJCQlpZihwcm9jICE9IG51bGwpIHsKLQkJCQkJbyA9IHByb2MuZUNvbnRhaW5lcigpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChvIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCB8fCBvIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQotCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShwbHVnaW5BZGFwdGVyLmdldENoaWxkcmVuKHBsdWdpbikKLQkJCQkJCS50b0FycmF5KClbMV0sIHRydWUpOwotCQkJCS8vIEV4cGFuZCB0aGUgcHJvY2VzcyBwYWNrYWdlcy4KLQkJCQlleHBhbmRUcmVlVmlld2VyUGFja2FnZXMoKChNZXRob2RFbGVtZW50KSBvKS5lQ29udGFpbmVyKCkpOwotCi0JCQl9IGVsc2UgewotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBtZXRob2RDb250ZW50UGtnID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGx1Z2luQWRhcHRlcgotCQkJCQkJLmdldENoaWxkcmVuKHBsdWdpbikudG9BcnJheSgpWzBdOwotCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShtZXRob2RDb250ZW50UGtnLCB0cnVlKTsKLQotCQkJCWlmIChvIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsJCQkJCQotCQkJCQlDdXN0b21DYXRlZ29yeSByb290Q0MgPSBUbmdVdGlsCi0JCQkJCQkJLmdldFJvb3RDdXN0b21DYXRlZ29yeShwbHVnaW4pOwotCQkJCQkJCQkJCQotCQkJCQkvLyBmaW5kIHRoZSB0cmVlIHBhdGggdG8gdGhlIGN1c3RvbSBjYXRlZ29yeSBmcm9tIHRoZSByb290IGN1c3RvbSBjYXRlZ29yeQotCQkJCQkvLwotCQkJCQlmaW5hbCBMaXN0IHRyZWVQYXRoID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IoQ3VzdG9tQ2F0ZWdvcnkgY2MgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG87IGNjICE9IHJvb3RDQzspIHsKLQkJCQkJCXRyZWVQYXRoLmFkZCgwLCBjYyk7Ci0JCQkJCQljYyA9IChDdXN0b21DYXRlZ29yeSkgQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhjYykuZ2V0KDApOwkJCQkJCSAKLQkJCQkJfQotCQkJCQlPYmplY3QgcGFyZW50ID0gcm9vdENDOwotCQkJCQlpbnQgc2l6ZSA9IHRyZWVQYXRoLnNpemUoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCU9iamVjdCBlID0gdHJlZVBhdGguZ2V0KGkpOwotCQkJCQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZFN0YXRlKHBhcmVudCwgdHJ1ZSk7Ci0JCQkJCQkvLyBnZXQgd3JhcHBlcgotCQkJCQkJLy8KLQkJCQkJCUN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGUsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlmaW5kX3dyYXBwZXI6Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWRhcHRlci5nZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlpZihsaXN0ZW5lciBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJCQkJCSYmIFRuZ1V0aWwudW53cmFwKGxpc3RlbmVyKSA9PSBlKSB7Ci0JCQkJCQkJCUZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSBsaXN0ZW5lcjsKLQkJCQkJCQkJZm9yKDt3cmFwcGVyICE9IG51bGwgJiYgd3JhcHBlci5nZXRPd25lcigpICE9IHBhcmVudDsgCi0JCQkJCQkJCQl3cmFwcGVyID0gZ2V0V3JhcHBlcih3cmFwcGVyLmdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoKSwgZSkpIHsJCQkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCQlpZih3cmFwcGVyICE9IG51bGwpIHsKLQkJCQkJCQkJCXBhcmVudCA9IHdyYXBwZXI7Ci0JCQkJCQkJCQlicmVhayBmaW5kX3dyYXBwZXI7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbyA9IHBhcmVudDsKLQkJCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCQkJT2JqZWN0IHN0ZENhdHMgPSBtZXRob2RDb250ZW50UGtnLmdldENoaWxkcmVuKG8pLnRvQXJyYXkoKVsxXTsKLQkJCQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZFN0YXRlKHN0ZENhdHMsIHRydWUpOwotCi0JCQkJfSBlbHNlIHsKLQkJCQkJT2JqZWN0IGNvcmVDb250ZW50ID0gbWV0aG9kQ29udGVudFBrZy5nZXRDaGlsZHJlbihvKQotCQkJCQkJCS50b0FycmF5KClbMF07Ci0JCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShjb3JlQ29udGVudCwgdHJ1ZSk7Ci0KLQkJCQkJLy8gRXhwYW5kIHRoZSBjb250ZW50IHBhY2thZ2VzLgotCQkJCQlleHBhbmRUcmVlVmlld2VyUGFja2FnZXMoKChNZXRob2RFbGVtZW50KSBvKS5lQ29udGFpbmVyKCkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0KLQkJc3VwZXIuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10geyBvIH0pKTsKLQotCQlpZihvIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCAmJiBvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkvLyBvcGVuIHRoZSBwcm9jZXNzIGluIGl0cyBlZGl0b3IgYW5kIHNlbGVjdCB0aGUgYnJlYWtkb3duIGVsZW1lbnQKLQkJCS8vCi0JCQlJRWRpdG9yS2VlcGVyLlJFRkVSRU5DRS5nZXRFZGl0b3JLZWVwZXIoKS5vcGVuRWRpdG9yKG8pOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5maW5kRWRpdG9yKG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoKE1ldGhvZEVsZW1lbnQpIG8pKTsKLQkJCWlmKGVkaXRvciBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3IpIHsKLQkJCQlQcm9jZXNzRWRpdG9yIHByb2NFZGl0b3IgPSAoKFByb2Nlc3NFZGl0b3IpZWRpdG9yKTsKLQkJCQlTdHJpbmcgcGFnZUlkOwotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yIHx8IG9iamVjdCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCXBhZ2VJZCA9IFByb2Nlc3NFZGl0b3IuVEFfRk9STV9JRDsKLQkJCQl9Ci0JCQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJcGFnZUlkID0gUHJvY2Vzc0VkaXRvci5XUEJTX0ZPUk1fSUQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwYWdlSWQgPSBQcm9jZXNzRWRpdG9yLldCU19GT1JNX0lEOwotCQkJCX0KLQkJCQlwcm9jRWRpdG9yLnNldEFjdGl2ZVBhZ2UocGFnZUlkKTsKLQkJCQlwcm9jRWRpdG9yLnNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qob2JqZWN0KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhwYW5kVHJlZVZpZXdlclBhY2thZ2VzKEVPYmplY3QgZSkgewotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlIHx8IGUgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJZXhwYW5kVHJlZVZpZXdlclBhY2thZ2VzKGUuZUNvbnRhaW5lcigpKTsKLQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShlLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuSVJlZnJlc2hIYW5kbGVyI3JlZnJlc2gob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJQ29udHJvbCBjdHJsID0gZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCWlmIChjdHJsLmdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQlkb1JlZnJlc2goZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQl9IGVsc2UgewotCQkJY3RybC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlkb1JlZnJlc2gobnVsbCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGJsb2NraW5nUmVmcmVzaChmaW5hbCBBcnJheUxpc3QgcmVtb3ZlZFJlc291cmNlcywKLQkJCWZpbmFsIEFycmF5TGlzdCBjaGFuZ2VkUmVzb3VyY2VzLAotCQkJZmluYWwgQ29sbGVjdGlvbiBhZGRlZFdvcmtzcGFjZVJlc291cmNlcywKLQkJCWZpbmFsIGJvb2xlYW4gcmVmcmVzaFZpZXdzLCBTaGVsbCBzaGVsbCkgewotCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJbW9uaXRvcgotCQkJCQkJLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtKTsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl0cnkgewotCQkJCQkvLyBtb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJZG9SZWZyZXNoKHJlbW92ZWRSZXNvdXJjZXMsIGNoYW5nZWRSZXNvdXJjZXMsCi0JCQkJCQkJYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMsIHJlZnJlc2hWaWV3cyk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0KLQkJSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCk7Ci0JCXRyeSB7Ci0JCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkKLQkJCQkJLnJ1bkluVUkoCi0JCQkJCQkJY29udGV4dCwKLQkJCQkJCQlydW5uYWJsZSwKLQkJCQkJCQluZXcgTGlicmFyeVNjaGVkdWxpbmdSdWxlKExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwKLQkJCQkJZS50b1N0cmluZygpLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE11c3QgYmUgc3luY2hyb25pemVkIHRvIGF2b2lkIHN0ZXBwaW5nIG9uIGVhY2ggb3RoZXIgaW4gcmVsb2FkaW5nCi0JICogcmVzb3VyY2VzL3JlZnJlc2hpbmcgVUkKLQkgKiAKLQkgKiBAcGFyYW0gcmVtb3ZlZFJlc291cmNlcwotCSAqIEBwYXJhbSBjaGFuZ2VkUmVzb3VyY2VzCi0JICogQHBhcmFtIGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzCi0JICogICAgICAgICAgICBjb2xsZWN0aW9uIG9mIElSZXNvdXJjZSBvYmplY3RzIHRoYXQgYXJlIGp1c3QgbmV3bHkgYWRkZWQgdG8KLQkgKiAgICAgICAgICAgIHRoZSBsaWJyYXJ5Ci0JICogQHBhcmFtIHJlZnJlc2hWaWV3cwotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZG9SZWZyZXNoKENvbGxlY3Rpb24gcmVtb3ZlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb24gY2hhbmdlZFJlc291cmNlcywgQ29sbGVjdGlvbiBhZGRlZFdvcmtzcGFjZVJlc291cmNlcywKLQkJCWJvb2xlYW4gcmVmcmVzaFZpZXdzKSB7Ci0JCUhhc2hTZXQgZWRpdG9yc1RvUmVmcmVzaCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZVJlbW92ZWRSZXNvdXJjZXMocmVtb3ZlZFJlc291cmNlcywgZWRpdG9yc1RvUmVmcmVzaCk7Ci0JCQlyZWZyZXNoVmlld3MgPSB0cnVlOwotCQl9Ci0JCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcywgZWRpdG9yc1RvUmVmcmVzaCwKLQkJCQkJcmVmcmVzaFZpZXdzKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChyZWZyZXNoVmlld3MpIHsKLQkJCQlyZWZyZXNoVmlld3MoKTsKLQkJCX0KLQotCQkJaWYgKCFlZGl0b3JzVG9SZWZyZXNoLmlzRW1wdHkoKSkgewotCQkJCS8vIHJlZnJlc2ggdGhlIGVkaXRvcnMgdGhhdCBoYW5kbGVSZW1vdmVkUmVzb3VyY2VzIHJlcXVlc3RlZAotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWRpdG9yc1RvUmVmcmVzaC5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWRpdG9yID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yKSB7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChhZGRlZFdvcmtzcGFjZVJlc291cmNlcyAhPSBudWxsCi0JCQkJJiYgIWFkZGVkV29ya3NwYWNlUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJSUxpYnJhcnlNYW5hZ2VyIG1nciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCQkJKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlU2V0KQotCQkJCQkJCS5sb2FkTmV3UmVzb3VyY2VzKGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWaWV3T2JqZWN0KE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCSYmICEobyBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbgotCQkJCQkJfHwgbyBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50IHx8IChvIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UgJiYgVW1hVXRpbAotCQkJCQkJLmdldFByb2Nlc3NDb21wb25lbnQoKE1ldGhvZEVsZW1lbnQpIG8pID09IG51bGwpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9SZWZyZXNoKElSZWZyZXNoRXZlbnQgZXZlbnQsIFNoZWxsIHNoZWxsKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiUmVmcmVzaGVkIG9iamVjdHM6ICIgKyBldmVudC5nZXRSZWZyZXNoZWRPYmplY3RzKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiByZWZyZXNoID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGV2ZW50LmdldFJlZnJlc2hlZE9iamVjdHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoaXNWaWV3T2JqZWN0KGUpKSB7Ci0JCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlZnJlc2gpIHsKLQkJCXJlZnJlc2hWaWV3cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBMaWJyYXJ5IFZpZXcKLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9SZWZyZXNoKFNoZWxsIHNoZWxsKSB7Ci0JCUFycmF5TGlzdCBtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldE1vdmVkUmVzb3VyY2VzKCkpOwotCQlpZiAoIW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW92ZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmICgoKElQcm9qZWN0KW8pLmhhc05hdHVyZShNZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5OQVRVUkVfSUQpKSB7Ci0JCQkJCQkJLy8gVE9ETzogc2FmZSB0byBhc3N1bWUgWE1JIGxpYnJhcnk/Ci0JCQkJCQkJWE1JTGlicmFyeVV0aWwub3Blbk1ldGhvZExpYnJhcnkoKChJUHJvamVjdClvKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsgCi0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWwgYm9vbGVhbiByZWZyZXNoVmlld3MgPSAhUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFJlbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcygpLmlzRW1wdHkoKQotCQkJCXx8ICFSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0QWRkZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCk7Ci0JCUFycmF5TGlzdCByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdChSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsKLQkJQXJyYXlMaXN0IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotCQlBcnJheUxpc3QgYWRkZWRXc1Jlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEFkZGVkV29ya3NwYWNlUmVzb3VyY2VzKCkpOwotCi0JCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkgfHwgIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpCi0JCQkJfHwgIWFkZGVkV3NSZXNvdXJjZXMuaXNFbXB0eSgpIHx8IHJlZnJlc2hWaWV3cykgewotCQkJYmxvY2tpbmdSZWZyZXNoKHJlbW92ZWRSZXNvdXJjZXMsIGNoYW5nZWRSZXNvdXJjZXMsCi0JCQkJCWFkZGVkV3NSZXNvdXJjZXMsIHJlZnJlc2hWaWV3cywgc2hlbGwpOwotCQl9Ci0KLQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCXJlbW92ZWRSZXNvdXJjZXMpOwotCQl9Ci0JCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkucmVtb3ZlQWxsKAotCQkJCQljaGFuZ2VkUmVzb3VyY2VzKTsKLQkJfQotCQlpZiAoIWFkZGVkV3NSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0QWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCWFkZGVkV3NSZXNvdXJjZXMpOwotCQl9Ci0JCWlmIChyZWZyZXNoVmlld3MpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRSZWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMoKQotCQkJCQkuY2xlYXIoKTsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRBZGRlZFJlc291cmNlcygpLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVtb3ZlZFJlc291cmNlczIKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gaGFuZGxlUmVtb3ZlZFJlc291cmNlcyhDb2xsZWN0aW9uIHJlbW92ZWRSZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uIGVkaXRvcnNUb1JlZnJlc2gpIHsKLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IGdldFNpdGUoKS5nZXRQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCUFycmF5TGlzdCBkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCByZW1vdmVkUmVzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdChyZW1vdmVkUmVzb3VyY2VzKTsKLQkJaWYgKGVkaXRvcnNUb1JlZnJlc2ggPT0gbnVsbCkgewotCQkJZWRpdG9yc1RvUmVmcmVzaCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQkvLyBmaW5kIGFsbCBlZGl0b3Igd2l0aCBkaXJ0eSBjb25mbGljdAotCQkvLwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiBlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IGlucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgZWRpdG9yCi0JCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGlucHV0LmdldE1ldGhvZEVsZW1lbnQoKSAhPSBudWxsID8gaW5wdXQKLQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCkuZVJlc291cmNlKCkgOiBudWxsOwotCQkJCWlmICghcmVtb3ZlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkJLmdldFVzZWRSZXNvdXJjZXMoKTsKLQkJCQkJY2hlY2tfcmVzb3VyY2U6IGZvciAoaW50IGogPSAwOyBqIDwgcmVtb3ZlZFJlc291cmNlTGlzdAotCQkJCQkJCS5zaXplKCk7IGorKykgewotCQkJCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHJlbW92ZWRSZXNvdXJjZUxpc3QuZ2V0KGopOwotCQkJCQkJaWYgKHVzZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCQkJZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LmFkZChlZGl0b3IpOwotCQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWRpdG9yc1RvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIHNlbGVjdGVkID0gc2VsZWN0RGlydHlFZGl0b3JzKGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZWRpdG9yc1RvUmVmcmVzaC5hZGQoc2VsZWN0ZWRbaV0pOwotCQkJfQotCQl9Ci0KLQkJLy8gVW5sb2FkIHRoZSByZW1vdmVkIHJlc291cmNlcy4KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVtb3ZlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgcmVzb3VyY2UKLQkJCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlU2V0LnVubG9hZChyZXNvdXJjZSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBtYW5hZ2VyLmdldEVkaXRpbmdEb21haW4oKQotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlQWxsKHJlbW92ZWRSZXNvdXJjZXMpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IgJiYgIWVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCS5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJY2hlY2tfcmVzb3VyY2U6IGZvciAoaW50IGogPSAwOyBqIDwgcmVtb3ZlZFJlc291cmNlTGlzdC5zaXplKCk7IGorKykgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgcmVtb3ZlZFJlc291cmNlTGlzdC5nZXQoaik7Ci0JCQkJCWlmICh1c2VkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQkJZWRpdG9yc1RvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZXMKLQkgKiBAcmV0dXJuIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiByZWxvYWRlZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKENvbGxlY3Rpb24gY2hhbmdlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb24gZWRpdG9yc1RvUmVmcmVzaCwgYm9vbGVhbiBmb3JjZVJlZnJlc2hWaWV3cykgewotCQlpZiAoIWZvcmNlUmVmcmVzaFZpZXdzKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGFuZ2VkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlCi0JCQkJCQkmJiAoKElMaWJyYXJ5UmVzb3VyY2UpIHJlc291cmNlKS5nZXRMb2FkU3RhbXAoKSA+IGxhc3RSZWZyZXNoVGltZVN0YW1wKSB7Ci0JCQkJCWZvcmNlUmVmcmVzaFZpZXdzID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMsIG51bGwsCi0JCQkJZm9yY2VSZWZyZXNoVmlld3MsIGVkaXRvcnNUb1JlZnJlc2gpOwotCX0KLQotCS8qKgotCSAqIHVwZGF0ZXMgTGlicmFyeSBWaWV3IHdoZW4gcmVzb3VyY2VzIGNoYW5nZQotCSAqIAotCSAqIEBwYXJhbSBjaGFuZ2VkUmVzb3VyY2VzCi0JICogQHBhcmFtIGVkaXRvcnNOb3RUb1JlZnJlc2gKLQkgKiBAcGFyYW0gZm9yY2VSZWZyZXNoVmlld3MKLQkgKiBAcGFyYW0gZWRpdG9yc1RvUmVmcmVzaAotCSAqIEByZXR1cm4gTGlzdCBvZiBjaGFuZ2VkIHJlc291cmNlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoQ29sbGVjdGlvbiBjaGFuZ2VkUmVzb3VyY2VzLAotCQkJQ29sbGVjdGlvbiBlZGl0b3JzTm90VG9SZWZyZXNoLCBib29sZWFuIGZvcmNlUmVmcmVzaFZpZXdzLAotCQkJQ29sbGVjdGlvbiBlZGl0b3JzVG9SZWZyZXNoKSB7Ci0JCUNvbnRyb2wgY3RybCA9IGdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJaWYgKGN0cmwgPT0gbnVsbCB8fCBjdHJsLmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCi0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlBcnJheUxpc3QgZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlBcnJheUxpc3QgY2hhbmdlZFJlc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3QoY2hhbmdlZFJlc291cmNlcyk7Ci0JCS8vIGZpbmQgYWxsIGVkaXRvciB3aXRoIGRpcnR5IGNvbmZsaWN0Ci0JCS8vCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yICYmIGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCS5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJY2hlY2tfcmVzb3VyY2U6IGZvciAoaW50IGogPSAwOyBqIDwgY2hhbmdlZFJlc291cmNlTGlzdC5zaXplKCk7IGorKykgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgY2hhbmdlZFJlc291cmNlTGlzdC5nZXQoaik7Ci0JCQkJCWlmICh1c2VkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQkJZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LmFkZChlZGl0b3IpOwotCQkJCQkJYnJlYWsgY2hlY2tfcmVzb3VyY2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWwgQXJyYXlMaXN0IGVkaXRvckxpc3RUb1JlZnJlc2ggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChlZGl0b3JzVG9SZWZyZXNoICE9IG51bGwpIHsKLQkJCWVkaXRvckxpc3RUb1JlZnJlc2guYWRkQWxsKGVkaXRvcnNUb1JlZnJlc2gpOwotCQl9Ci0JCWlmICghZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gcmVzdWx0ID0gc2VsZWN0RGlydHlFZGl0b3JzKGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJCU9iamVjdCBlZGl0b3IgPSByZXN1bHRbaV07Ci0JCQkJaWYgKChlZGl0b3JzTm90VG9SZWZyZXNoID09IG51bGwgfHwgIWVkaXRvcnNOb3RUb1JlZnJlc2gKLQkJCQkJCS5jb250YWlucyhlZGl0b3IpKQotCQkJCQkJJiYgKGVkaXRvcnNUb1JlZnJlc2ggPT0gbnVsbCB8fCAhZWRpdG9yc1RvUmVmcmVzaAotCQkJCQkJCQkuY29udGFpbnMoZWRpdG9yKSkpIHsKLQkJCQkJZWRpdG9yTGlzdFRvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQkJZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LnJlbW92ZShlZGl0b3IpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHJlbW92ZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgZGlydHkgZWRpdG9ycyB3aXRoIGNvbmZsaWN0IGZyb20gdGhlCi0JCQkvLyBjb2xsZWN0aW9uIG9mIGNoYW5nZWQgcmVzb3VyY2VzCi0JCQkvLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzID0gZWRpdG9yLmdldFVzZWRSZXNvdXJjZXMoKTsKLQkJCQljaGFuZ2VkUmVzb3VyY2VMaXN0LnJlbW92ZUFsbCh1c2VkUmVzb3VyY2VzKTsKLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gcmVmcmVzaFZpZXdzID0gZmFsc2U7Ci0JCWlmICghY2hhbmdlZFJlc291cmNlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yICYmICFlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJCUNvbGxlY3Rpb24gdXNlZFJlc291cmNlcyA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKQotCQkJCQkJCS5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IGNoYW5nZWRSZXNvdXJjZUxpc3QKLQkJCQkJCQkuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBjaGFuZ2VkUmVzb3VyY2VMaXN0Ci0JCQkJCQkJCS5nZXQoaik7Ci0JCQkJCQlpZiAodXNlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJCQllZGl0b3JMaXN0VG9SZWZyZXNoLmFkZChlZGl0b3IpOwotCQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBSZWxvYWQgdGhlIHNlbGVjdGVkIGNoYW5nZWQgcmVzb3VyY2VzLgotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlDb2xsZWN0aW9uIHJlbG9hZGVkUmVzb3VyY2VzID0gbWFuYWdlcgotCQkJCQkJLnJlbG9hZFJlc291cmNlcyhjaGFuZ2VkUmVzb3VyY2VMaXN0KTsKLQotCQkJCXJlZnJlc2hWaWV3cyA9ICFyZWxvYWRlZFJlc291cmNlcy5pc0VtcHR5KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZvcmNlUmVmcmVzaFZpZXdzIHx8IHJlZnJlc2hWaWV3cykgewotCQkJcmVmcmVzaFZpZXdzKCk7Ci0JCX0KLQkJaWYgKCFlZGl0b3JMaXN0VG9SZWZyZXNoLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JMaXN0VG9SZWZyZXNoLnNpemUoKTsgaSsrKSB7Ci0JCQkJTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yTGlzdFRvUmVmcmVzaAotCQkJCQkJLmdldChpKTsKLQkJCQl0cnkgewotCQkJCQllZGl0b3IucmVmcmVzaCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIExpYnJhcnkgYW5kIENvbmZpZ3VyYXRpb24gdmlld3MgaWYgbmVjZXNzYXJ5Ci0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlZnJlc2hWaWV3cygpIHsKLQkJRU9iamVjdCBpbnB1dCA9IChFT2JqZWN0KSBnZXRWaWV3ZXIoKS5nZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0LmVJc1Byb3h5KCkpIHsKLQkJCQlzZXRJbnB1dEZvclZpZXdlcihSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZShpbnB1dCkpOwotCQkJfSBlbHNlIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJCQl1cGRhdGVMYXN0UmVmcmVzaFRpbWVzdGFtcCgpOwotCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJCU9iamVjdCBvID0gbnVsbDsKLQkJCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID09IDEKLQkJCQkJCQkmJiAobyA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpIGluc3RhbmNlb2YgRU9iamVjdAotCQkJCQkJCSYmICgoRU9iamVjdCkgbykuZUlzUHJveHkoKSkgewotCQkJCQkJbyA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvbHZlKChFT2JqZWN0KSBvKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIobyk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzdG9yZVNlbGVjdGlvbihnZXRWaWV3ZXIoKSwgc2VsZWN0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUNvbmZpZ3VyYXRpb25WaWV3IGNvbmZpZ1ZpZXcgPSBDb25maWd1cmF0aW9uVmlldy5nZXRWaWV3KCk7Ci0JCWlmIChjb25maWdWaWV3ICE9IG51bGwpIHsKLQkJCUNvbnRyb2wgY3RybCA9IGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotCQkJaWYgKGN0cmwgIT0gbnVsbCAmJiAhY3RybC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlpbnB1dCA9IChFT2JqZWN0KSBjb25maWdWaWV3LmdldFZpZXdlcigpLmdldElucHV0KCk7Ci0JCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQkJaWYgKGlucHV0LmVJc1Byb3h5KCkpIHsKLQkJCQkJCWNvbmZpZ1ZpZXcuc2V0SW5wdXRGb3JWaWV3ZXIoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCS5yZXNvbHZlKGlucHV0KSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJY29uZmlnVmlldy5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQkJCQlyZXN0b3JlU2VsZWN0aW9uKGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCksIHNlbGVjdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIHNlbGVjdERpcnR5RWRpdG9ycyhMaXN0IGRpcnR5RWRpdG9ycykgewotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfRmlsZUNvbmZsaWN0X2xhYmVsOwotCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2VsZWN0RWRpdG9yc1RvRGlzY2FyZENvbmZsaWN0Q2hhbmdlczsKLQkJcmV0dXJuIHNlbGVjdEVkaXRvcnMoZGlydHlFZGl0b3JzLCB0aXRsZSwgbXNnKTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIHNlbGVjdEVkaXRvcnMoTGlzdCBlZGl0b3JzLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJLy8gcHJvbXB0IHVzZXIgdG8gZGlzY2FyZCBjaGFuZ2VzIGluIGVkaXRvcnMgdGhhdCBjb25mbGljdCB3aXRoIG91dHNpZGUKLQkJLy8gY2hhbmdlCi0JCS8vCi0JCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCUxpc3QgZkNvbnRlbnRzOwotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCWlmIChmQ29udGVudHMgIT0gbnVsbCAmJiBmQ29udGVudHMgPT0gaW5wdXRFbGVtZW50KQotCQkJCQlyZXR1cm4gZkNvbnRlbnRzLnRvQXJyYXkoKTsKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwKLQkJCQkJT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJZkNvbnRlbnRzID0gKExpc3QpIG5ld0lucHV0OwotCQkJCWVsc2UKLQkJCQkJZkNvbnRlbnRzID0gbnVsbDsKLQotCQkJfQotCi0JCX07Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCQlyZXR1cm4gKChJRWRpdG9yUGFydCkgZWxlbWVudCkuZ2V0VGl0bGUoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCQkJcmV0dXJuICgoSUVkaXRvclBhcnQpIGVsZW1lbnQpLmdldFRpdGxlSW1hZ2UoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOwotCQkJfQotCQl9OwotCQlMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpLAotCQkJCWVkaXRvcnMsIGNvbnRlbnRQcm92aWRlciwgbGFiZWxQcm92aWRlciwgbXNnKTsKLQkJZGxnLnNldFRpdGxlKHRpdGxlKTsKLQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkbGcub3BlbigpOwotCQlyZXR1cm4gZGxnLmdldFJlc3VsdCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVzdG9yZVNlbGVjdGlvbihWaWV3ZXIgdmlld2VyLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWJvb2xlYW4gcmVzdG9yZSA9IGZhbHNlOwotCQkJQXJyYXlMaXN0IHJlc29sdmVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCQkJCWlmIChlT2JqLmVJc1Byb3h5KCkpIHsKLQkJCQkJCWVPYmogPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZShlT2JqKTsKLQkJCQkJCXJlc3RvcmUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmICghZU9iai5lSXNQcm94eSgpKSB7Ci0JCQkJCQlyZXNvbHZlZExpc3QuYWRkKGVPYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlc3RvcmUpIHsKLQkJCQl2aWV3ZXIKLQkJCQkJCS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocmVzb2x2ZWRMaXN0KSwKLQkJCQkJCQkJdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW5hbWUgYW4gZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBlbGVtZW50IHRvIHJlbmFtZQotCSAqIEBwYXJhbSBuZXdOYW1lCi0JICogICAgICAgICAgICB0aGUgbmV3IG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuUmVuYW1lKGZpbmFsIE5hbWVkRWxlbWVudCBlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZG9SZW5hbWUoZSwgbmV3TmFtZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZG9SZW5hbWUoZmluYWwgTmFtZWRFbGVtZW50IGUsIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gZS5nZXROYW1lKCk7Ci0KLQkJaWYgKGZhbHNlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBvbGROYW1lOiAiICsgb2xkTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG5ld05hbWU6ICIgKyBuZXdOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZS5zZXROYW1lKG5ld05hbWUpOwotCi0JCS8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIFByb2Nlc3NDb21wb25lbnQgdG8ga2VlcCBpdHMKLQkJLy8gbmFtZSBhbmQgdGhlIG5hbWUgb2YgaXRzIHByb2Nlc3MgaW4gc3luYy4KLQkJaWYgKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGUpLmdldFByb2Nlc3MoKTsKLQkJCXByb2Muc2V0TmFtZShuZXdOYW1lKTsKLQkJfQotCi0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gU2F2ZSB0aGUgbW9kaWZpZWQgZmlsZShzKS4KLQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnNhdmUoZS5lUmVzb3VyY2UoKSk7Ci0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQotCQkJCQlDb2xsZWN0aW9uIHJlbmFtZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQKLQkJCQkJCQkmJiBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0JCQkJCQkJCQkuaGFzUHJlc2VudGF0aW9uKChNZXRob2RFbGVtZW50KSBlKSkgewotCQkJCQkJcmVuYW1lZFJlc291cmNlcy5hZGQoKChDb250ZW50RWxlbWVudCkgZSkKLQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCQlyZW5hbWVkUmVzb3VyY2VzLmFkZChlLmVSZXNvdXJjZSgpKTsKLQotCQkJCQlwZXJzaXN0ZXIuYWRqdXN0TG9jYXRpb24ocmVuYW1lZFJlc291cmNlcyk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlMSk7Ci0KLQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0KLQkJCQkJU3RyaW5nIGRldGFpbHMgPSBlMS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IE1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkuZm9ybWF0KCI6IHswfSIsIG5ldyBPYmplY3RbXSB7IGUxLmdldE1lc3NhZ2UoKSB9KSA6ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld19lcnJfc2F2aW5nLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQllLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpLAotCQkJCQkJCQkJZGV0YWlscyB9KTsKLQkJCQkJdGhyb3cgbmV3IE1lc3NhZ2VFeGNlcHRpb24obXNnKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQotCQlpZiAoIVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQpKSB7Ci0JCQkvLyByZXN0b3JlIG9sZCBuYW1lCi0JCQllLnNldE5hbWUob2xkTmFtZSk7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0I3Nob3cob3JnLmVjbGlwc2UudWkucGFydC5TaG93SW5Db250ZXh0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3coU2hvd0luQ29udGV4dCBjb250ZXh0KSB7Ci0JCWlmIChjb250ZXh0LmdldElucHV0KCkgaW5zdGFuY2VvZiBNYXJrZXJBZGFwdGVyKSB7Ci0JCQlJVmlld1BhcnQgdmlldyA9IGdldFZpZXdTaXRlKCkuZ2V0UGFnZSgpLmZpbmRWaWV3KAotCQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MuUHJvYmxlbVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gdmlldy5nZXRWaWV3U2l0ZSgpCi0JCQkJCS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJT2JqZWN0IG8gPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElNYXJrZXIpIHsKLQkJCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSBvOwotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgbWFya2VyCi0JCQkJCQkJLmdldEF0dHJpYnV0ZShMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5HVUlEKTsKLQkJCQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJCQkJSVJlc291cmNlIHdzUmVzID0gbWFya2VyLmdldFJlc291cmNlKCk7Ci0JCQkJCQlJTGlicmFyeU1hbmFnZXIgbGliTWdyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsJCQkJCQkKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gbGliTWdyLmdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpCi0JCQkJCQkJCS5nZXRSZXNvdXJjZSgKLQkJCQkJCQkJCQlVUkkuY3JlYXRlRmlsZVVSSSh3c1Jlcy5nZXRMb2NhdGlvbigpCi0JCQkJCQkJCQkJCQkudG9TdHJpbmcoKSksIGZhbHNlKTsKLQkJCQkJCU9iamVjdCBlbGVtZW50OwotCQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCWVsZW1lbnQgPSByZXNvdXJjZS5nZXRFT2JqZWN0KGd1aWQpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJZWxlbWVudCA9IGxpYk1nci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJCQkJfQotCQkJCQkJaWYoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIoZWxlbWVudCk7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChjb250ZXh0LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgVHJlZVNlbGVjdGlvbikgewotCQkJLy8gZnJvbSBzZWFyY2ggcmVzdWx0cyB2aWV3Ci0JCQlUcmVlU2VsZWN0aW9uIHNlbCA9IChUcmVlU2VsZWN0aW9uKWNvbnRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcihzZWwuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTWVzc2FnZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL01lc3NhZ2VDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGVkYzIzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTWVzc2FnZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50RGVwZW5kZW5jeUVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRXJyb3JJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLkVsZW1lbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuUGFja2FnZURlcGVuZGVuY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuUGFja2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBUaGUgY29udGVudCBwcm92aWRlciBmb3IgYSBDb25maWd1cmF0aW9uIGVycm9yIG9yIHdhcm5pbmcgbWVzc2FnZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25DbG9zdXJlIGNsb3N1cmU7Ci0KLQlwdWJsaWMgTWVzc2FnZUNvbnRlbnRQcm92aWRlcihDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlKSB7Ci0JCXRoaXMuY2xvc3VyZSA9IGNsb3N1cmU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGNsb3N1cmUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkNsb3N1cmUpIHsKLQkJCXJldHVybiAoKENvbmZpZ3VyYXRpb25DbG9zdXJlKSBpbnB1dEVsZW1lbnQpLmdldERlcGVuZGVuY3lFcnJvcnMoKTsKLQkJfSBlbHNlIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50RGVwZW5kZW5jeUVycm9yKSB7Ci0JCQlMaXN0IGVycm9ycyA9ICgoRWxlbWVudERlcGVuZGVuY3lFcnJvcikgaW5wdXRFbGVtZW50KS5nZXRBbGwoKTsKLQkJCWlmIChlcnJvcnMgIT0gbnVsbCkgewotCQkJCXJldHVybiBlcnJvcnMudG9BcnJheSgpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgRXJyb3JJbmZvKSB7Ci0JCQlFcnJvckluZm8gaW5mbyA9IChFcnJvckluZm8pIGlucHV0RWxlbWVudDsKLQkJCWludCByZWxhdGlvbiA9IGluZm8uZ2V0UmVsYXRpb24oKTsKLQkJCU1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGluZm8uZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQlNZXRob2RFbGVtZW50IGNhdXNlRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpbmZvLmdldENhdXNlRWxlbWVudCgpOwotCQkJUGFja2FnZURlcGVuZGVuY3kgZGVwOwotCQkJUGFja2FnZVJlZmVyZW5jZSBwa2dSZWYgPSBudWxsOwotCi0JCQlpZiAocmVsYXRpb24gPT0gRXJyb3JJbmZvLlJFRkVSRU5DRV9UTykgewotCQkJCWRlcCA9IGNsb3N1cmUuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXREZXBlbmRlbmN5TWFuYWdlcigpCi0JCQkJCQkuZ2V0RGVwZW5kZW5jeShvd25lckVsZW1lbnQpOwotCQkJCXBrZ1JlZiA9IGRlcC5nZXRSZWZlcmVuY2UoY2F1c2VFbGVtZW50LCBmYWxzZSk7Ci0JCQl9IGVsc2UgaWYgKHJlbGF0aW9uID09IEVycm9ySW5mby5SRUZFUkVOQ0VEX0JZKSB7Ci0JCQkJZGVwID0gY2xvc3VyZS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldERlcGVuZGVuY3lNYW5hZ2VyKCkKLQkJCQkJCS5nZXREZXBlbmRlbmN5KGNhdXNlRWxlbWVudCk7Ci0JCQkJcGtnUmVmID0gZGVwLmdldFJlZmVyZW5jZShvd25lckVsZW1lbnQsIGZhbHNlKTsKLQkJCX0KLQotCQkJaWYgKHBrZ1JlZiAhPSBudWxsKSB7Ci0JCQkJTGlzdCByZWZFcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZ1JlZi5nZXRSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVsZW1lbnRSZWZlcmVuY2UgcmVmID0gKEVsZW1lbnRSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLQotCQkJCQkvLyBEb24ndCBzaG93IHRoZSBlbnRyeSBpZiB0aGUgcmVmZXJlbmNlIGNhbiBiZSBpZ25vcmVkLgotCQkJCQlpZiAocmVmLmNhbklnbm9yZSgpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlFcnJvckluZm8gZWxlbWVudEVycm9yOwotCQkJCQlpZiAocmVsYXRpb24gPT0gRXJyb3JJbmZvLlJFRkVSRU5DRV9UTykgewotCQkJCQkJZWxlbWVudEVycm9yID0gbmV3IEVycm9ySW5mbygKLQkJCQkJCQkJaW5mby5nZXRFcnJvclR5cGUoKSwKLQkJCQkJCQkJIiIsIHJlZi5nZXRFbGVtZW50KCksIHJlZi5nZXRSZWZFbGVtZW50KCksIHJlbGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudEVycm9yID0gbmV3IEVycm9ySW5mbygKLQkJCQkJCQkJaW5mby5nZXRFcnJvclR5cGUoKSwKLQkJCQkJCQkJIiIsIHJlZi5nZXRSZWZFbGVtZW50KCksIHJlZi5nZXRFbGVtZW50KCksIHJlbGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJcmVmRXJyb3JzLmFkZChlbGVtZW50RXJyb3IpOwotCQkJCX0KLQotCQkJCXJldHVybiByZWZFcnJvcnMudG9BcnJheSgpOwotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRFbGVtZW50cyhwYXJlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uQ2xvc3VyZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVycm9ySW5mbykgewotCQkJcmV0dXJuIHRoaXMuY2xvc3VyZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uQ2xvc3VyZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnREZXBlbmRlbmN5RXJyb3IpIHsKLQkJCXJldHVybiAoKEVsZW1lbnREZXBlbmRlbmN5RXJyb3IpIGVsZW1lbnQpLnNpemUoKSA+IDA7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVycm9ySW5mbykgewotCQkJaWYgKCgoRXJyb3JJbmZvKSBlbGVtZW50KS5nZXRFcnJvck1lc3NhZ2UoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTWVzc2FnZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9NZXNzYWdlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZmE2MTY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9NZXNzYWdlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50RGVwZW5kZW5jeUVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRXJyb3JJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLkVsZW1lbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBUaGUgbGFiZWwgcHJvdmlkZXIgZm9yIGEgQ29uZmlndXJhdGlvbiBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2UuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlTGFiZWxQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgTWVzc2FnZUxhYmVsUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJYm9vbGVhbiBpc19lcnJvciA9IGZhbHNlOwotCQlib29sZWFuIGlzX3dhcm5pbmcgPSBmYWxzZTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnREZXBlbmRlbmN5RXJyb3IpIHsKLQkJCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSAoRWxlbWVudERlcGVuZGVuY3lFcnJvcikgb2JqZWN0OwotCQkJaXNfZXJyb3IgPSBlcnJvci5pc0Vycm9yKCkgfHwgZXJyb3IuaXNDaGlsZEVycm9yKCk7Ci0JCQlpc193YXJuaW5nID0gZXJyb3IuaXNXYXJuaW5nKCkgfHwgZXJyb3IuaXNDaGlsZFdhcm5pbmcoKTsKLQkJfSBlbHNlIGlmICgob2JqZWN0IGluc3RhbmNlb2YgRXJyb3JJbmZvKSkgewotCQkJRXJyb3JJbmZvIGVycm9yID0gKEVycm9ySW5mbykgb2JqZWN0OwotCQkJU3RyaW5nIG1zZyA9IGVycm9yLmdldEVycm9yTWVzc2FnZSgpOwotCQkJaWYgKG1zZyAhPSBudWxsICYmIG1zZy5sZW5ndGgoKSA+IDApIHsKLQkJCQlpc19lcnJvciA9IGVycm9yLmlzRXJyb3IoKSB8fCBlcnJvci5pc0NoaWxkRXJyb3IoKTsKLQkJCQlpc193YXJuaW5nID0gZXJyb3IuaXNXYXJuaW5nKCkgfHwgZXJyb3IuaXNDaGlsZFdhcm5pbmcoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChpc19lcnJvcikgewotCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoCi0JCQkJCUlTaGFyZWRJbWFnZXMuSU1HX09CSlNfV0FSTl9UU0spOwotCQl9IGVsc2UgaWYgKGlzX3dhcm5pbmcpIHsKLQkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKAotCQkJCQlJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1dBUk5fVFNLKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciNnZXRJbWFnZUZyb21PYmplY3QoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2VGcm9tT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCXJldHVybiB0aGlzLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuIGdldE5hbWUoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQl9Ci0KLQkJU3RyaW5nIHRleHQgPSBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCWludCBpbmRleCA9IHRleHQuaW5kZXhPZigiKCIpOyAvLyROT04tTkxTLTEkCi0JCWludCBpbmRleDIgPSB0ZXh0Lmxhc3RJbmRleE9mKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4ID49IDAgJiYgaW5kZXgyID4gMCkgewotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKGluZGV4LCBpbmRleDIgKyAxKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZShNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIChlID09IG51bGwpID8gIiIgOiBlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJU3RyaW5nIHRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50RGVwZW5kZW5jeUVycm9yKSB7Ci0JCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gKEVsZW1lbnREZXBlbmRlbmN5RXJyb3IpIG9iamVjdDsKLQkJCU9iamVjdCBlID0gZXJyb3IuZ2V0RXJyb3JFbGVtZW50KCk7Ci0JCQlPYmplY3RbXSByZWZzID0gZXJyb3IuZ2V0Q2F1c2VFbGVtZW50cygpOwotCQkJaWYgKGNvbHVtbkluZGV4ID09IE1lc3NhZ2VWaWV3LkVSUk9SX0VMRU1FTlRfQ09MVU1OKSB7Ci0JCQkJdGV4dCA9IGdldFN0cmluZyhlKTsKLQotCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSBNZXNzYWdlVmlldy5DQVVTRV9FTEVNRU5UX0NPTFVNTikgewotCQkJCWlmIChyZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGkgPiAwKQotCQkJCQkJCWIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQliLmFwcGVuZChnZXRTdHJpbmcocmVmc1tpXSkpOwotCQkJCQl9Ci0JCQkJCXRleHQgPSBiLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZXJyb3IuaXNFcnJvcigpIHx8IGVycm9yLmlzV2FybmluZygpKSB7Ci0JCQkJCXRleHQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1lc3NhZ2VMYWJlbFByb3ZpZGVyX3Vuc2VsZWN0ZWRwYWNrYWdlcywgKG5ldyBTdHJpbmdbXSB7IGdldFN0cmluZyhlKSB9KSk7Ci0JCQkJfSBlbHNlIGlmIChlcnJvci5pc0NoaWxkRXJyb3IoKSB8fCBlcnJvci5pc0NoaWxkV2FybmluZygpKSB7Ci0JCQkJCXRleHQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5NZXNzYWdlTGFiZWxQcm92aWRlcl9lcnJjaGlsZHBrZ3M7IAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFcnJvckluZm8pIHsKLQkJCUVycm9ySW5mbyBlcnJvciA9IChFcnJvckluZm8pIG9iamVjdDsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSBNZXNzYWdlVmlldy5FUlJPUl9FTEVNRU5UX0NPTFVNTikgewotCQkJCWVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgZXJyb3IuZ2V0T3duZXJFbGVtZW50KCk7Ci0KLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gTWVzc2FnZVZpZXcuQ0FVU0VfRUxFTUVOVF9DT0xVTU4pIHsKLQkJCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGVycm9yLmdldENhdXNlRWxlbWVudCgpOwotCQkJfQotCi0JCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJdGV4dCA9IGdldE5hbWUoZWxlbWVudCk7Ci0JCQkJaWYgKGNvbHVtbkluZGV4ICE9IE1lc3NhZ2VWaWV3LkVSUk9SX01FU1NBR0VfQ09MVU1OCi0JCQkJCQkmJiAhTGlicmFyeVV0aWwuc2VsZWN0YWJsZShlbGVtZW50KSkgewotCQkJCQl0ZXh0ID0gIiAgICAgICIgKyB0ZXh0OyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0ZXh0ID0gZXJyb3IuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQl9Ci0JCX0KLQotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50UmVmZXJlbmNlKSB7Ci0JCQlFbGVtZW50UmVmZXJlbmNlIHJlZiA9IChFbGVtZW50UmVmZXJlbmNlKSBvYmplY3Q7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gTWVzc2FnZVZpZXcuRVJST1JfRUxFTUVOVF9DT0xVTU4pIHsKLQkJCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHJlZi5nZXRFbGVtZW50KCk7Ci0JCQkJdGV4dCA9ICIgICAgICAiICsgZ2V0TmFtZShlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSBNZXNzYWdlVmlldy5DQVVTRV9FTEVNRU5UX0NPTFVNTikgewotCQkJCWVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgcmVmLmdldFJlZkVsZW1lbnQoKTsKLQkJCQl0ZXh0ID0gIiAgICAgICIgKyBnZXROYW1lKGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfQotCi0JCWlmICh0ZXh0ID09IG51bGwpIHsKLQkJCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtblRleHQob2JqZWN0LCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSB3ZSB3b24ndCBldmVyIGdlbmVyYXRlIHRoZXNlIG5vdGlmaWNhdGlvbnMsIHdlIGNhbiBqdXN0IGlnbm9yZQotCSAqIHRoaXMuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCS8qKgotCSAqIFNpbmNlIHdlIHdvbid0IGV2ZXIgYWRkIGxpc3RlbmVycywgd2UgY2FuIGp1c3QgaWdub3JlIHRoaXMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL01lc3NhZ2VWaWV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTWVzc2FnZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTgzMTIxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTWVzc2FnZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnREZXBlbmRlbmN5RXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotCi0KLS8qKgotICogVGhlIE1lc3NhZ2Ugdmlldy4KLSAqIDxwPgotICogRGlzcGxheXMgdGhlIE1ldGhvZCBMaWJyYXJ5IGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlVmlldyBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyLAotCQlJUGFydExpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRoZSB2aWV3IElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfSUQgPSBNZXNzYWdlVmlldy5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9NRVNTQUdFX0NPTFVNTiA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9FTEVNRU5UX0NPTFVNTiA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVVTRV9FTEVNRU5UX0NPTFVNTiA9IDI7Ci0KLQlwcm90ZWN0ZWQgTWVzc2FnZVZpZXdlciB0YWJsZVZpZXdlcjsKLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbnVsbDsKLQotCXByb3RlY3RlZCBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlID0gbnVsbDsKLQotCXB1YmxpYyBNZXNzYWdlVmlldygpIHsKLQl9Ci0KLQkvKioKLQkgKiB1cGRhdGVzIFZpZXcgd2hlbiBjb25maWd1cmF0aW9uRmFjdG9yeSBjaGFuZ2VzCi0JICogQHBhcmFtIGNsb3N1cmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uRmFjdG9yeUNoYW5nZWQoQ29uZmlndXJhdGlvbkNsb3N1cmUgY2xvc3VyZSkgewotCQl0aGlzLmNsb3N1cmUgPSBjbG9zdXJlOwotCi0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlpZiAoY2xvc3VyZSAhPSBudWxsKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IChDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBjbG9zdXJlCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBNZXNzYWdlTGFiZWxQcm92aWRlcigKLQkJCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJfQotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IE1lc3NhZ2VDb250ZW50UHJvdmlkZXIoY2xvc3VyZSkpOwotCi0JCXVwZGF0ZU1lc3NhZ2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2FkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2dldFNlbGVjdGlvbigpCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudFNlbGVjdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWN1cnJlbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0KLQkJZm9yIChJdGVyYXRvciBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMpCi0JCQkJLml0ZXJhdG9yKCk7IGxpc3RlbmVycy5oYXNOZXh0KCk7KSB7Ci0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVycwotCQkJCQkubmV4dCgpOwotCQkJbGlzdGVuZXIKLQkJCQkJLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQl0YWJsZVZpZXdlciA9IG5ldyBNZXNzYWdlVmlld2VyKGNvbXBvc2l0ZSk7Ci0KLQkJSVZpZXdTaXRlIHNpdGUgPSAoSVZpZXdTaXRlKSB0aGlzLmdldFNpdGUoKTsKLQkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKLQotCQlpZiAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKLQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIKLQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCS8vIFRoaXMganVzdCBub3RpZmllcyB0aG9zZSB0aGluZ3MgdGhhdCBhcmUgYWZmZWN0ZWQgYnkgdGhlCi0JCQkJLy8gc2VjdGlvbi4KLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotLy8JCQkJCVN5c3RlbS5vdXQKLS8vCQkJCQkJCS5wcmludGxuKEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQgKyBldmVudC5nZXRTZWxlY3Rpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIFNldCBjb2x1bW4gaW5mby4KLQkJc2V0Q29sdW1ucygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDb2x1bW5zKCkgewotCQlUcmVlIHRhYmxlID0gdGFibGVWaWV3ZXIuZ2V0VHJlZSgpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJVHJlZUNvbHVtbiBjb2x1bW47Ci0KLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odGFibGUsIFNXVC5OT05FLCBFUlJPUl9NRVNTQUdFX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1lc3NhZ2VWaWV3X2Vycm1zZ190ZXh0KTsgCi0JCWNvbHVtbi5zZXRXaWR0aCg0NTApOwotCi0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgRVJST1JfRUxFTUVOVF9DT0xVTU4pOwotCQljb2x1bW4uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5NZXNzYWdlVmlld19lcnJlbGVtZW50X3RleHQpOyAKLQkJY29sdW1uLnNldFdpZHRoKDIwMCk7Ci0KLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odGFibGUsIFNXVC5OT05FLCBDQVVTRV9FTEVNRU5UX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dCk7IAotCQljb2x1bW4uc2V0V2lkdGgoMjAwKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZVZpZXdlcihwYXJlbnQpOwotCi0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOwotCQl3b3JrYmVuY2hXaW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5hZGRQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIE1lc3NhZ2VWaWV3IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWVzc2FnZVZpZXcgZ2V0VmlldygpIHsKLQkJdHJ5IHsKLQkJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJSVZpZXdQYXJ0IHZpZXcgPSBhY3RpdmVQYWdlLmZpbmRWaWV3KFZJRVdfSUQpOwotCQkJCWlmICh2aWV3ID09IG51bGwpIHsKLQkJCQkJdmlldyA9IGFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoVklFV19JRCk7Ci0JCQkJfQotCQkJCXJldHVybiAoTWVzc2FnZVZpZXcpIHZpZXc7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHVwZGF0ZSBNZXNzYWdlIFZpZXcgYWNjb3JkaW5nIHRvIHRoZSBjb25maWd1cmF0aW9uIGNsb3N1cmUgc3RhdGUKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU1lc3NhZ2UoKSB7Ci0JCWlmIChjbG9zdXJlICE9IG51bGwpIHsKLQkJCXRhYmxlVmlld2VyLnNldElucHV0KGNsb3N1cmUpOwotCQl9IGVsc2UgewotCQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQobmV3IE9iamVjdCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaWYgdmlld2VyIGhhcyBpbnB1dAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiAoY2xvc3VyZSA9PSBudWxsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCk7Ci0JCXdvcmtiZW5jaFdpbmRvdy5nZXRQYXJ0U2VydmljZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcih0aGlzKTsKLQotCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmNsZWFyKCk7Ci0JCWNsb3N1cmUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFNob3cgdGhlIGVycm9yIGZvciB0aGUgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoT2JqZWN0IGUpIHsKLQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IGNsb3N1cmUuZ2V0RXJyb3IoZSk7Ci0JCWlmIChlcnJvciAhPSBudWxsKSB7Ci0JCQl0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oZXJyb3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIFZpZXdlciBjbGFzcyB1bmRlcmx5aW5nIHRoaXMgdmlldyAKLQkgKgotCSAqLwotCXB1YmxpYyBjbGFzcyBNZXNzYWdlVmlld2VyIGV4dGVuZHMgVHJlZVZpZXdlciB7Ci0KLQkJcHVibGljIE1lc3NhZ2VWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJdGhpcyhwYXJlbnQsIFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCX0KLQotCQlwdWJsaWMgTWVzc2FnZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCi0JCQlUcmVlIHRyZWUgPSBnZXRUcmVlKCk7Ci0JCQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCQl0cmVlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlzdXBlci5leHBhbmRUb0xldmVsKGVsZW1lbnQsIDEpOwotCQkJV2lkZ2V0IGN0cmwgPSBzdXBlci5maW5kSXRlbShlbGVtZW50KTsKLQkJCWlmIChjdHJsICE9IG51bGwpIHsKLQkJCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWl0ZW1zLmFkZChjdHJsKTsKLQkJCQlzdXBlci5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyI3BhcnRBY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWlmIChwYXJ0IGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkVkaXRvcikgewotCQkJQ29uZmlndXJhdGlvbkNsb3N1cmUgYyA9ICgoQ29uZmlndXJhdGlvbkVkaXRvcikgcGFydCkuZ2V0Q2xvc3VyZSgpOwotCQkJaWYgKGMgIT0gY2xvc3VyZSkgewotCQkJCWNvbmZpZ3VyYXRpb25GYWN0b3J5Q2hhbmdlZChjKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lciNwYXJ0QnJvdWdodFRvVG9wKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lciNwYXJ0Q2xvc2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlpZiAocGFydCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3IpIHsKLQkJCUNvbmZpZ3VyYXRpb25DbG9zdXJlIGMgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3IpIHBhcnQpLmdldENsb3N1cmUoKTsKLQkJCWlmIChjID09IGNsb3N1cmUpIHsKLQkJCQljb25maWd1cmF0aW9uRmFjdG9yeUNoYW5nZWQobnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXIjcGFydERlYWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyI3BhcnRPcGVuZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Qcm9jZXNzVHJlZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMTBiYzAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Qcm9jZXNzVHJlZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFjdGl2aXR5RHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSU9wZW5FdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuT3BlblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVWaWV3ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVFeHBhbnNpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJlZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJlZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0KLS8qKgotICogRGlzcGxheXMgdGhlIFByb2Nlc3MgZWxlbWVudHMgaW4gYSB0cmVlIHRhYmxlIHZpZXdlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVHJlZVZpZXdlciBleHRlbmRzIFRyZWVWaWV3ZXIgaW1wbGVtZW50cwotCQlJQWN0aW9uVHlwZVByb3ZpZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWV9UWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb3B5X3RleHQ7IAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTkRfVFhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXh0ZW5kX3RleHQ7IAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUVQX0NPUFlfVFhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVlcENvcHlfdGV4dDsgCi0KLQlwcml2YXRlIGludCBhY3Rpb25UeXBlID0gSUFjdGlvblR5cGVQcm92aWRlci5DT1BZOwotCi0JcHJpdmF0ZSBNZW51IGFjdGlvblR5cGVQb3B1cDsKLQotCXByaXZhdGUgUG9pbnQgYWN0aW9uVHlwZVBvcHVwTG9jYXRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0KLQkJVHJlZSB0cmVlID0gZ2V0VHJlZSgpOwotCQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCWFkZFRyZWVMaXN0ZW5lcihuZXcgSVRyZWVWaWV3ZXJMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRJdGVtUHJvdmlkZXJFeHBhbmRlZChldmVudC5nZXRFbGVtZW50KCksIGZhbHNlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotCQkJCXNldEl0ZW1Qcm92aWRlckV4cGFuZGVkKGV2ZW50LmdldEVsZW1lbnQoKSwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHVwIGNvbHVubXMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBhcnJheSBvZiBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSBjb2x1bW5EZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldHVwQ29sdW1ucyhDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1uRGVzY3JpcHRvcnMpIHsKLQkJLy8gUmVtb3ZlIGFsbCBvbGQgVHJlZUNvbHVtbnMuCi0JCVRyZWVDb2x1bW5bXSBjb2xzID0gZ2V0VHJlZSgpLmdldENvbHVtbnMoKTsKLQkJaW50IHNpemUgPSBjb2xzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWNvbHNbaV0uZGlzcG9zZSgpOwotCQl9Ci0KLQkJU3RyaW5nW10gY29sUHJvcHMgPSBuZXcgU3RyaW5nW2NvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbFByb3BzW2ldID0gY29sdW1uRGVzY3JpcHRvcnNbaV0uaWQ7Ci0JCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKGdldFRyZWUoKSwKLQkJCQkJY29sdW1uRGVzY3JpcHRvcnNbaV0uYWxpZ25tZW50KTsKLQkJCWNvbHVtbi5zZXRUZXh0KGNvbHVtbkRlc2NyaXB0b3JzW2ldLmxhYmVsKTsKLQkJCWNvbHVtbi5zZXRSZXNpemFibGUoY29sdW1uRGVzY3JpcHRvcnNbaV0ucmVzaXphYmxlKTsKLQkJCWNvbHVtbi5zZXRXaWR0aChjb2x1bW5EZXNjcmlwdG9yc1tpXS53aWR0aCk7Ci0JCX0KLQotCQlzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbFByb3BzKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRJdGVtUHJvdmlkZXJFeHBhbmRlZChPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBleHBhbmQpIHsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBnZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGVsZW1lbnQsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCSgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRFeHBhbmRlZChCb29sZWFuLnZhbHVlT2YoZXhwYW5kKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBBZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGdldENvbnRlbnRQcm92aWRlcigpID09IG51bGwgPyBudWxsCi0JCQkJOiAoKEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKSBnZXRDb250ZW50UHJvdmlkZXIoKSkKLQkJCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVRyZWVWaWV3ZXIjc2V0RXhwYW5kZWQoSXRlbSwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFeHBhbmRlZChJdGVtIG5vZGUsIGJvb2xlYW4gZXhwYW5kKSB7Ci0JCXN1cGVyLnNldEV4cGFuZGVkKG5vZGUsIGV4cGFuZCk7Ci0JCU9iamVjdCBhZGFwdGVyID0gZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChub2RlLmdldERhdGEoKSwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpOwotCQkJaWYgKGJzSXRlbVByb3ZpZGVyLmlzRXhwYW5kZWQoKSA9PSBudWxsKSB7Ci0JCQkJYnNJdGVtUHJvdmlkZXIuc2V0RXhwYW5kZWQoKEJvb2xlYW4udmFsdWVPZihleHBhbmQpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyI2NyZWF0ZVRyZWVJdGVtKFdpZGdldCwKLQkgKiAgICAgIE9iamVjdCwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRyZWVJdGVtKFdpZGdldCBwYXJlbnQsIE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJc3VwZXIuY3JlYXRlVHJlZUl0ZW0ocGFyZW50LCBlbGVtZW50LCBpbmRleCk7Ci0JCU9iamVjdCBhZGFwdGVyID0gZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChlbGVtZW50LAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQlCb29sZWFuIGV4cGFuZCA9ICgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5pc0V4cGFuZGVkKCk7Ci0JCQlpZiAoZXhwYW5kICE9IG51bGwpIHsKLQkJCQlzZXRFeHBhbmRlZFN0YXRlKGVsZW1lbnQsIGV4cGFuZC5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVUcmVlVmlld2VyI2RvVXBkYXRlSXRlbShJdGVtLCBPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VcGRhdGVJdGVtKEl0ZW0gaXRlbSwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJc3VwZXIuZG9VcGRhdGVJdGVtKGl0ZW0sIGVsZW1lbnQpOwotCQlzZXRFeHBhbmRlZChpdGVtLCBlbGVtZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RXhwYW5kZWQoSXRlbSBpdGVtLCBPYmplY3QgZWxlbWVudCkgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoZWxlbWVudCwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZihhZGFwdGVyLmhhc0NoaWxkcmVuKGVsZW1lbnQpKSB7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCUJvb2xlYW4gZXhwYW5kID0gKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLmlzRXhwYW5kZWQoKTsKLQkJCQlpZiAoZXhwYW5kICE9IG51bGwpIHsKLQkJCQkJc2V0RXhwYW5kZWRTdGF0ZShpdGVtLCBleHBhbmQuYm9vbGVhblZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXIjaW50ZXJuYWxSZWZyZXNoKFdpZGdldCwKLQkgKiAgICAgIE9iamVjdCwgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFJlZnJlc2goV2lkZ2V0IHdpZGdldCwgT2JqZWN0IGVsZW1lbnQsCi0JCQlib29sZWFuIGRvU3RydWN0LCBib29sZWFuIHVwZGF0ZUxhYmVscykgewotCQlzdXBlci5pbnRlcm5hbFJlZnJlc2god2lkZ2V0LCBlbGVtZW50LCBkb1N0cnVjdCwgdXBkYXRlTGFiZWxzKTsKLQotCQlpZiAoZG9TdHJ1Y3QpIHsKLQkJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBJdGVtKSB7Ci0JCQkJc2V0RXhwYW5kZWQoKEl0ZW0pIHdpZGdldCwgZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCUl0ZW1bXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHdpZGdldCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQlJdGVtIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEl0ZW0pIHsKLQkJCQkJCUl0ZW0gaXRlbSA9IChJdGVtKSBjaGlsZDsKLQkJCQkJCXNldEV4cGFuZGVkKGl0ZW0sIGl0ZW0uZ2V0RGF0YSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBjb21tYW5kOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXIjZ2V0QWN0aW9uVHlwZSgpCi0JICovCi0vLwlwdWJsaWMgaW50IGdldEFjdGlvblR5cGUoKSB7Ci0vLwkJaWYgKGFjdGlvblR5cGVQb3B1cCA9PSBudWxsKSB7Ci0vLwkJCWNyZWF0ZUFjdGlvblR5cGVQb3B1cCgpOwotLy8JCX0KLS8vCi0vLwkJRGlzcGxheS5nZXRDdXJyZW50KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotLy8KLS8vCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJYWN0aW9uVHlwZSA9IDA7Ci0vLwkJCQlhY3Rpb25UeXBlUG9wdXAuc2V0TG9jYXRpb24oYWN0aW9uVHlwZVBvcHVwTG9jYXRpb24pOwotLy8JCQkJYWN0aW9uVHlwZVBvcHVwLnNldFZpc2libGUodHJ1ZSk7Ci0vLwkJCX0KLS8vCi0vLwkJfSk7Ci0vLwotLy8JCXJldHVybiBhY3Rpb25UeXBlOwotLy8JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFjdGlvblR5cGVQb3B1cChib29sZWFuIGNhbkV4dGVuZCkgewotCQlhY3Rpb25UeXBlUG9wdXAgPSBuZXcgTWVudShnZXRDb250cm9sKCkpOwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWVudUl0ZW0gaXRlbSA9ICgoTWVudUl0ZW0pIGUuZ2V0U291cmNlKCkpOwotCQkJCVN0cmluZyB0ZXh0ID0gaXRlbS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHRleHQgPT0gQ09QWV9UWFQpIHsKLQkJCQkJUHJvY2Vzc1RyZWVWaWV3ZXIudGhpcy5hY3Rpb25UeXBlID0gSUFjdGlvblR5cGVQcm92aWRlci5DT1BZOwotCQkJCX0gZWxzZSBpZiAodGV4dCA9PSBFWFRFTkRfVFhUKSB7Ci0JCQkJCVByb2Nlc3NUcmVlVmlld2VyLnRoaXMuYWN0aW9uVHlwZSA9IElBY3Rpb25UeXBlUHJvdmlkZXIuRVhURU5EOwotCQkJCX0gZWxzZSBpZiAodGV4dCA9PSBERUVQX0NPUFlfVFhUKSB7Ci0JCQkJCVByb2Nlc3NUcmVlVmlld2VyLnRoaXMuYWN0aW9uVHlwZSA9IERFRVBfQ09QWTsKLQkJCQl9Ci0KLQkJCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIEFjdGl2aXR5RHJvcENvbW1hbmQpIHsKLQkJCQkJQWN0aXZpdHlEcm9wQ29tbWFuZCBjbWQgPSAoKEFjdGl2aXR5RHJvcENvbW1hbmQpIGNvbW1hbmQpOwotCQkJCQljbWQuc2V0VHlwZShQcm9jZXNzVHJlZVZpZXdlci50aGlzLmFjdGlvblR5cGUpOwotCQkJCQljbWQuc2V0TGFiZWwodGV4dCk7Ci0JCQkJfQotCi0JCQkJaWYgKGFjdGlvbk1hbmFnZXIgIT0gbnVsbAotCQkJCQkJJiYgY29tbWFuZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY29tbWFuZCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCQkJfQotCi0JCQkJYWN0aW9uVHlwZVBvcHVwLnNldFZpc2libGUoZmFsc2UpOwotCQkJfQotCi0JCX07Ci0JCU1lbnVJdGVtIG1lbnVJdGVtOwotCQlpZiAoY2FuRXh0ZW5kKQl7Ci0JCQltZW51SXRlbSA9IG5ldyBNZW51SXRlbShhY3Rpb25UeXBlUG9wdXAsIFNXVC5DQVNDQURFKTsKLQkJCW1lbnVJdGVtLnNldFRleHQoQ09QWV9UWFQpOwotCQkJbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkJbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0oYWN0aW9uVHlwZVBvcHVwLCBTV1QuQ0FTQ0FERSk7Ci0JCQltZW51SXRlbS5zZXRUZXh0KEVYVEVORF9UWFQpOwotCQkJbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JCW1lbnVJdGVtID0gbmV3IE1lbnVJdGVtKGFjdGlvblR5cGVQb3B1cCwgU1dULkNBU0NBREUpOwotCQltZW51SXRlbS5zZXRUZXh0KERFRVBfQ09QWV9UWFQpOwotCQltZW51SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXIjc2V0SW5wdXREYXRhKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dERhdGEoT2JqZWN0IG9iamVjdCkgewotCQlhY3Rpb25UeXBlUG9wdXBMb2NhdGlvbiA9IChQb2ludCkgb2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNtZCwgYm9vbGVhbiBjYW5FeHRlbmQpIHsKLS8vCQlpZiAoYWN0aW9uVHlwZVBvcHVwID09IG51bGwpIHsKLQkJCWNyZWF0ZUFjdGlvblR5cGVQb3B1cChjYW5FeHRlbmQpOwotLy8JCX0KLQotCQl0aGlzLmNvbW1hbmQgPSBjbWQ7Ci0JCWFjdGlvblR5cGVQb3B1cC5zZXRMb2NhdGlvbihhY3Rpb25UeXBlUG9wdXBMb2NhdGlvbik7Ci0JCWFjdGlvblR5cGVQb3B1cC5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyI2hvb2tDb250cm9sKENvbnRyb2wpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaG9va0NvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCS8vIEZyb20gQ29udGVudFZpZXdlci4KLQkJY29udHJvbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCWhhbmRsZURpc3Bvc2UoZXZlbnQpOwotCQkJfQotCQl9KTsKLQotCQkvLyBGcm9tIFN0cnVjdHVyZWRWaWV3ZXIuCi0JCU9wZW5TdHJhdGVneSBoYW5kbGVyID0gbmV3IE9wZW5TdHJhdGVneShjb250cm9sKTsKLQkJaGFuZGxlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlU2VsZWN0KGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZURvdWJsZVNlbGVjdChlKTsKLQkJCX0KLQkJfSk7Ci0JCWhhbmRsZXIuYWRkUG9zdFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVBvc3RTZWxlY3QoZSk7Ci0JCQl9Ci0JCX0pOwotCQloYW5kbGVyLmFkZE9wZW5MaXN0ZW5lcihuZXcgSU9wZW5FdmVudExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlT3BlbihTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJUHJvY2Vzc1RyZWVWaWV3ZXIudGhpcy5oYW5kbGVPcGVuKGUpOwotCQkJfQotCQl9KTsKLQotCQkvLyBGcm9tIEFic3RyYWN0VHJlZVZpZXdlci4KLQkJYWRkVHJlZUxpc3RlbmVyKGNvbnRyb2wsIG5ldyBUcmVlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB0cmVlRXhwYW5kZWQoVHJlZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlVHJlZUV4cGFuZChldmVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDb2xsYXBzZWQoVHJlZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlVHJlZUNvbGxhcHNlKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0KLQkJZ2V0VHJlZSgpLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvdWJsZUNsaWNrLCBuZXcgTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZUl0ZW1bXSB0cmVlSXRlbXMgPSBnZXRUcmVlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCQkvLyBEb24ndCBlZGl0IGlmIG1vcmUgdGhhbiBvbmUgaXRlbXMgYXJlIHNlbGVjdGVkLgotCQkJCWlmICh0cmVlSXRlbXMgPT0gbnVsbCB8fCB0cmVlSXRlbXMubGVuZ3RoICE9IDEpCi0JCQkJCXJldHVybjsKLQotCQkJCS8vIEZpbmQgdGhlIGVkaXQgY29sdW1uLgotCQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gdHJlZUl0ZW1zWzBdOwotCQkJCWlmICh0cmVlSXRlbSA9PSBudWxsIHx8IHRyZWVJdGVtLmlzRGlzcG9zZWQoKSkgewotCQkJCQkvLyBJdGVtIG5vIGxvbmdlciBleGlzdHMuCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaW50IGNvbHVtblRvRWRpdDsKLQkJCQlpbnQgY29sdW1ucyA9IGdldFRyZWUoKS5nZXRDb2x1bW5Db3VudCgpOwotCQkJCWlmIChjb2x1bW5zID09IDApIHsKLQkJCQkJLy8gSWYgbm8gVGFibGVDb2x1bW4sIFRhYmxlIGFjdHMgYXMgaWYgaXQgaGFzIGEgc2luZ2xlCi0JCQkJCS8vIGNvbHVtbiB3aGljaCB0YWtlcyB0aGUgd2hvbGUgd2lkdGguCi0JCQkJCWNvbHVtblRvRWRpdCA9IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29sdW1uVG9FZGl0ID0gLTE7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uczsgaSsrKSB7Ci0JCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKGkpOwotCQkJCQkJaWYgKGJvdW5kcy5jb250YWlucyhldmVudC54LCBldmVudC55KSkgewotCQkJCQkJCWNvbHVtblRvRWRpdCA9IGk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGNvbHVtblRvRWRpdCA9PSAtMSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJZWRpdEVsZW1lbnQodHJlZUl0ZW0uZ2V0RGF0YSgpLCBjb2x1bW5Ub0VkaXQpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyI3NldEFjdGlvbk1hbmFnZXIoSUFjdGlvbk1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aW9uTWFuYWdlcihJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJYWN0aW9uTWFuYWdlciA9IGFjdGlvbk1ncjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvUHJvY2Vzc1ZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1Byb2Nlc3NWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI3MDVkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvUHJvY2Vzc1ZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNlbGxlZGl0b3JzLkFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBQcm9jZXNzIGVsZW1lbnRzIGluIGEgdHJlZSB0YWJsZSB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1ZpZXdlciBleHRlbmRzIFByb2Nlc3NUcmVlVmlld2VyIHsKLQotCXByaXZhdGUgU3RyaW5nW10gY29sdW1uUHJvcGVydGllczsKLQotCXByaXZhdGUgQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3JbXSBjaGVja0JveENlbGxFZGl0b3JzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBwYXJlbnQgLSB1bmRlcmx5aW5nIHRyZWUKLQkgKiAKLQkgKiBAcmV0dXJuIHBhcmVudAotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgZ2V0Q2VsbEVkaXRvclBhcmVudCgpIHsKLQkJcmV0dXJuIGdldFRyZWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgY2hlY2sgYm94IGNlbGwgZWRpdG9ycwotCSAqIAotCSAqIEBwYXJhbSBjaGVja0JveENlbGxFZGl0b3JzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tCb3hDZWxsRWRpdG9ycygKLQkJCUFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yW10gY2hlY2tCb3hDZWxsRWRpdG9ycykgewotCQl0aGlzLmNoZWNrQm94Q2VsbEVkaXRvcnMgPSBjaGVja0JveENlbGxFZGl0b3JzOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrQm94Q2VsbEVkaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCUFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yIGVkaXRvciA9IGNoZWNrQm94Q2VsbEVkaXRvcnNbaV07Ci0JCQlpZiAoZWRpdG9yID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQllZGl0b3Iuc2V0Q29sdW1uSW5kZXgoaSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuUHJvY2Vzc1RyZWVWaWV3ZXIjaG9va0NvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBob29rQ29udHJvbChDb250cm9sIGNvbnRyb2wpIHsKLQkJc3VwZXIuaG9va0NvbnRyb2woY29udHJvbCk7Ci0JCWdldFRyZWUoKS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJbW9kaWZ5SXRlbShlKTsKLQkJCX0KLQkJfSk7Ci0JCS8vIGdldFRyZWUoKS5hZGRNb3VzZU1vdmVMaXN0ZW5lcihuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKXsKLQkJLy8gcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSl7Ci0JCS8vIHNldFVuc2V0RWRpdG9yKGUpOwotCQkvLyB9Ci0JCS8vIH0pOwotCQlMaXN0ZW5lciBwYWludExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5QYWludEl0ZW06IHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJldmVudC5pbmRleCA9ICIrIGV2ZW50LmluZGV4KTsKLQkJCQkJSW1hZ2UgaW1hZ2UgPSBnZXRDaGVja0JveENlbGxFZGl0b3JJbWFnZShldmVudCk7Ci0JCQkJCWlmIChpbWFnZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCQlUcmVlQ29sdW1uIGNvbCA9IGdldFRyZWUoKS5nZXRDb2x1bW4oZXZlbnQuaW5kZXgpOwotCQkJCQlpbnQgeCA9IGV2ZW50LnggKyBjb2wuZ2V0V2lkdGgoKSAvIDI7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQkJCWludCBvZmZzZXQgPSBNYXRoLm1heCgwLCAoZXZlbnQuaGVpZ2h0IC0gcmVjdC5oZWlnaHQpIC8gMik7Ci0JCQkJCWV2ZW50LmdjLmRyYXdJbWFnZShpbWFnZSwgeCAtIHJlY3Qud2lkdGggLyAyLCBldmVudC55Ci0JCQkJCQkJKyBvZmZzZXQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlnZXRUcmVlKCkuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgcGFpbnRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlByb2Nlc3NUcmVlVmlld2VyI2RvVXBkYXRlSXRlbShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VwZGF0ZUl0ZW0oSXRlbSBpdGVtLCBPYmplY3QgZWxlbWVudCkgewotCQlzdXBlci5kb1VwZGF0ZUl0ZW0oaXRlbSwgZWxlbWVudCk7Ci0KLQkJaWYgKGNoZWNrQm94Q2VsbEVkaXRvcnMgIT0gbnVsbCAmJiBjb2x1bW5Qcm9wZXJ0aWVzICE9IG51bGwKLQkJCQkmJiBjb2x1bW5Qcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tCb3hDZWxsRWRpdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yIGVkaXRvciA9IGNoZWNrQm94Q2VsbEVkaXRvcnNbaV07Ci0JCQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQkoKFRyZWVJdGVtKSBpdGVtKS5zZXRUZXh0KGksICIiKTsKLQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldENoZWNrQm94Q2VsbEVkaXRvckltYWdlKEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBnZXRDaGVja0JveENlbGxFZGl0b3JJbWFnZShldmVudC5pbmRleCwgKFRyZWVJdGVtKSBldmVudC5pdGVtKTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldENoZWNrQm94Q2VsbEVkaXRvckltYWdlKGludCBjb2x1bW5JbmRleCwgVHJlZUl0ZW0gaXRlbSkgewotCQlpZiAoY2hlY2tCb3hDZWxsRWRpdG9ycyA9PSBudWxsCi0JCQkJfHwgY2hlY2tCb3hDZWxsRWRpdG9yc1tjb2x1bW5JbmRleF0gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY2hlY2tCb3hDZWxsRWRpdG9yc1tjb2x1bW5JbmRleF0uZ2V0SW1hZ2UoaXRlbSwKLQkJCQljb2x1bW5Qcm9wZXJ0aWVzW2NvbHVtbkluZGV4XSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIjc2V0Q2VsbE1vZGlmaWVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDZWxsTW9kaWZpZXIoSUNlbGxNb2RpZmllciBtb2RpZmllcikgewotCQlzdXBlci5zZXRDZWxsTW9kaWZpZXIobW9kaWZpZXIpOwotCi0JCWlmIChjaGVja0JveENlbGxFZGl0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tCb3hDZWxsRWRpdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yIGVkaXRvciA9IGNoZWNrQm94Q2VsbEVkaXRvcnNbaV07Ci0JCQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQllZGl0b3Iuc2V0Q2VsbE1vZGlmaWVyKG1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIG1vdXNlIGRvd24gbGlzdGVuZXIKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgbW9kaWZ5SXRlbShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCVBvaW50IHB0ID0gbmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpOwotCQlUcmVlSXRlbSBpdGVtID0gZ2V0VHJlZSgpLmdldEl0ZW0ocHQpOwotCQlpZiAoaXRlbSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0VHJlZSgpLmdldENvbHVtbkNvdW50KCk7IGkrKykgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyhpKTsKLQkJCWlmIChyZWN0LmNvbnRhaW5zKHB0KSkgewotCQkJCUltYWdlIGltYWdlID0gZ2V0Q2hlY2tCb3hDZWxsRWRpdG9ySW1hZ2UoaSwgaXRlbSk7Ci0JCQkJaWYgKGltYWdlID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlSZWN0YW5nbGUgaW1nUmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJCWludCBvZmZzZXQgPSBNYXRoLm1heCgwLCAocmVjdC5oZWlnaHQgLSBpbWdSZWN0LmhlaWdodCkgLyAyKTsKLQkJCQlpbnQgeCA9IHJlY3QueCArIHJlY3Qud2lkdGggLyAyIC0gaW1nUmVjdC53aWR0aCAvIDI7Ci0JCQkJaW50IHkgPSByZWN0LnkgKyBvZmZzZXQ7Ci0JCQkJaW1nUmVjdCA9IG5ldyBSZWN0YW5nbGUoeCwgeSwgaW1nUmVjdC53aWR0aCwgaW1nUmVjdC5oZWlnaHQpOwotCQkJCWlmIChpbWdSZWN0LmNvbnRhaW5zKHB0KSkgewotCQkJCQljaGVja0JveENlbGxFZGl0b3JzW2ldLm1vZGlmeShpdGVtLCBjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyI3NldENvbHVtblByb3BlcnRpZXMoamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtblByb3BlcnRpZXMoU3RyaW5nW10gY29sdW1uUHJvcGVydGllcykgewotCQlzdXBlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCQl0aGlzLmNvbHVtblByb3BlcnRpZXMgPSBjb2x1bW5Qcm9wZXJ0aWVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvU2F2ZWFibGVMaWJyYXJ5Vmlld1BhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9TYXZlYWJsZUxpYnJhcnlWaWV3UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTIwYjRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9TYXZlYWJsZUxpYnJhcnlWaWV3UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGNsYXNzIGZvciBhbGwgdmlld3MgdGhhdCByZXF1aXJlcyB0aGUgc3VwcG9ydCBvZiBzYXZpbmcgYSBNZXRob2QKLSAqIExpYnJhcnkgdmlhIHRoZSBTYXZlIGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTYXZlYWJsZUxpYnJhcnlWaWV3UGFydCBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMKLQkJSVNhdmVhYmxlUGFydCB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yCi0JCQkJCS5iZWdpblRhc2soCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2aW5nTGlicmFyeVRhc2tfbmFtZSwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgCi0JCQlTdHJpbmcgbGliUGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpOwotCQkJdHJ5IHsKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGUsIAotCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5VG9FcnJvcl9tc2csIGxpYlBhdGgpLCAKLQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JfcmVhc29uLCAKLQkJCQkJCQkJZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVBc0FsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVPbkNsb3NlTmVlZGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVPbkNsb3NlTmVlZGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9WaWV3SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvVmlld0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNmRhMDQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9WaWV3SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyB0aGUgdmlld3MgYW5kIGVkaXRvcnMgaW4gdGhlIEF1dGhvcmluZwotICogcGVyc3BlY3RpdmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZpZXdIZWxwZXIgewotCi0JLyoqCi0JICogUHJvbXB0cyB0aGUgdXNlciB0byBzYXZlIHRoZSBvcGVuIGxpYnJhcnkgaWYgaXQgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPGNvZGU+IGlmIHRoZSB1c2VyIHNhdmVkIG9yIGRpc2NhcmRlZCB0aGUgY2hhbmdlLAotCSAqIAkJICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSB1c2VyIGNhbmNlbGxlZCB0aGUgYWN0aW9uIHRoYXQKLQkgKiAgICAgICAgIHRyaWdnZXJlZCB0aGlzIGNhbGwuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHByb21wdFNhdmUoKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCAmJiBtYW5hZ2VyLmlzTWV0aG9kTGlicmFyeU1vZGlmaWVkKCkpIHsKLQkJCWludCByZXQgPSBNc2dCb3gucHJvbXB0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dCwgCi0JCQkJCVNXVC5ZRVMgfCBTV1QuTk8gfCBTV1QuQ0FOQ0VMKTsKLQkJCXN3aXRjaCAocmV0KSB7Ci0JCQljYXNlIFNXVC5ZRVM6Ci0JCQkJdHJ5IHsKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCQlkaWFsb2cKLQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2ZUxpYnJhcnlFcnJvcl9tc2csIAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JfcmVhc29uLCBlKTsgCi0KLQkJCQkJcmV0dXJuIGRpYWxvZwotCQkJCQkJCS5kaXNwbGF5UHJvbXB0KAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMub3BlbkxpYnJhcnlEaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMub3BlbkxpYnJhcnlEaWFsb2dfdGV4dCk7IAotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULk5POgotCQkJCS8vIERpc2NhcmQgYWxsIGNoYW5nZXMgYnkgcmVzZXR0aW5nIGFsbCByZXNvdXJjZXMgYXMgdW5jaGFuZ2VkLgotCQkJCW1hbmFnZXIuZGlzY2FyZE1ldGhvZExpYnJhcnlDaGFuZ2VzKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5DQU5DRUw6Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc2F2ZSB0aGUgb3BlbiBsaWJyYXJ5IGlmIGl0IGhhcyBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNob2ljZSB0aGUgdXNlciBtYWRlIHdoZW4gcHJvbXB0ZWQgdG8gc2F2ZSAtIG9uZSBvZiBTV1QuWUVTLCBTV1QuTk8sIFNXVC5DQU5DRUwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBwcm9tcHRTYXZlSW50KCkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwgJiYgbWFuYWdlci5pc01ldGhvZExpYnJhcnlNb2RpZmllZCgpKSB7Ci0JCQlpbnQgcmV0ID0gTXNnQm94LnByb21wdChBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190aXRsZSwgCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RleHQsIAotCQkJCQlTV1QuWUVTIHwgU1dULk5PIHwgU1dULkNBTkNFTCk7Ci0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2FzZSBTV1QuWUVTOgotCQkJCXRyeSB7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQkJZGlhbG9nCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RXJyb3JfbXNnLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgZSk7IAotCQkJCX0KLQkJCQlyZXR1cm4gU1dULllFUzsKLQkJCWNhc2UgU1dULk5POgotCQkJCS8vIERpc2NhcmQgYWxsIGNoYW5nZXMgYnkgcmVzZXR0aW5nIGFsbCByZXNvdXJjZXMgYXMgdW5jaGFuZ2VkLgotCQkJCW1hbmFnZXIuZGlzY2FyZE1ldGhvZExpYnJhcnlDaGFuZ2VzKCk7Ci0JCQkJcmV0dXJuIFNXVC5OTzsKLQkJCWNhc2UgU1dULkNBTkNFTDoKLQkJCQlyZXR1cm4gU1dULkNBTkNFTDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBTV1QuQ0FOQ0VMOwotCX0KLQotCS8qKgotCSAqIGNsb3NlcyBhbGwgZWRpdG9ycyBvbiB0aGUgYWN0aXZlIHBhZ2UKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZUFsbEVkaXRvcnMoKSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJLmNsb3NlQWxsRWRpdG9ycyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBjbG9zZXMgdGhlIE1lc3NhZ2VWaWV3IChlcnJvciB2aWV3KQotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlTWVzc2FnZVZpZXcoKSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJLmhpZGVWaWV3KE1lc3NhZ2VWaWV3LmdldFZpZXcoKSk7Ci0JfQotCi0JLyoqCi0JICogaGFuZGxlcyBhIGRhbmdsaW5nIG9iamVjdAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICogCQkJT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgaGFuZGxlRGFuZ2xpbmcoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCSYmICgoRU9iamVjdCkgb2JqZWN0KS5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnLCAoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0OwotCQkJT2JqZWN0IHZhbHVlID0gYWRhcHRlci5nZXRWYWx1ZSgpOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkmJiAoKEVPYmplY3QpIHZhbHVlKS5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJT2JqZWN0IG93bmVyID0gVG5nVXRpbC51bndyYXAoYWRhcHRlci5nZXRQYXJlbnQodmFsdWUpKTsKLQkJCQlpZiAob3duZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCS8vIFRoaXMgaXMgYSBVSSBpdGVtIHByb3ZpZGVyLgotCQkJCQlvd25lciA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgb3duZXIpLmdldFRhcmdldCgpOwotCQkJCX0KLQkJCQlTdHJpbmcgb3duZXJOYW1lID0gKChNZXRob2RFbGVtZW50KSBvd25lcikuZ2V0TmFtZSgpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlci5nZXRGZWF0dXJlKCk7Ci0JCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlQcm9tcHQoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZWxldGVEaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkY29uZmlybV90ZXh0LCAoKE1ldGhvZEVsZW1lbnQpIHZhbHVlKQotCQkJCQkJCQkJLmdldE5hbWUoKSwgb3duZXJOYW1lKSkpIHsgCi0JCQkJCQkvLyBSZW1vdmUgdGhlIGFzc29jaWF0aW9uLgotCQkJCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkoKENvbGxlY3Rpb24pICgoRU9iamVjdCkgb3duZXIpLmVHZXQoZmVhdHVyZSkpCi0JCQkJCQkJCQkucmVtb3ZlKHZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVsZW1lbnRBbHJlYWR5RGVsZXRlZEVycm9yX21zZywgKChNZXRob2RFbGVtZW50KSB2YWx1ZSkKLQkJCQkJCQkJCS5nZXROYW1lKCkpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0KLQkvKiBUT0RPOiBJcyB0aGlzIHN0aWxsIG5lZWRlZD8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9hZEFsbEFuZFNhdmVBbGwoKSB7Ci0JCWZpbmFsIE1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGliID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbiBiZWNhdXNlIHRoaXMgaXMgYSBsb25nIHJ1bm5pbmcKLQkJLy8gYWN0aXZpdHkgdGhhdCBtb2RpZmllcyB0aGUgd29ya2JlbmNoLgotCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCS8vIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IGdldHMgaW52b2tlZCB3aGVuIHRoZSBvcGVyYXRpb24gcnVucy4KLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnVwZ3JhZGluZ0xpYnJhcnlUYXNrLm5hbWUiKSwgMyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQl0cnkgewotCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zZXRUYXNrTmFtZShBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLmxvYWRpbmdMaWJyYXJ5RWxlbWVudHNUYXNrLm5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCU1vZGVsU3RvcmFnZS5sb2FkQWxsUHJveGllcyhsaWIpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkZUxpYnJhcnlEaWFsb2cudGl0bGUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRlTGlicmFyeUVycm9yLm1zZyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnVwZ3JhZGVMaWJyYXJ5RXJyb3IucmVhc29uIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQllKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zZXRUYXNrTmFtZShBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnNhdmluZ1VwZ3JhZGVkRWxlbWVudHNUYXNrLm5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGxpYgotCQkJCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQkJCXJlc291cmNlU2V0LnNhdmUoTGlicmFyeVByb2Nlc3Nvci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCS5nZXRTYXZlT3B0aW9ucygpLCB0cnVlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnVwZ3JhZGVMaWJyYXJ5RGlhbG9nLnRpdGxlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkZUxpYnJhcnlFcnJvci5tc2ciKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS5zYXZlVXBncmFkZWRMaWJyYXJ5RXJyb3IucmVhc29uIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQllKTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJLy8gUnVuIHRoZSBvcGVyYXRpb24gYW5kIGRpc3BsYXkgdGhlIHByb2dyZXNzLgotCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpKQotCQkJCQkucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkZUxpYnJhcnlEaWFsb2cudGl0bGUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRlTGlicmFyeUVycm9yLm1zZyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLmludGVybmFsRXJyb3IucmVhc29uIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQllKTsKLQkJfQotCX0KLQkqLwotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBsb2NrZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG9ja2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJd2hpbGUgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCQllbGVtZW50ID0gKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGVsZW1lbnQpLmdldFBhcmVudChudWxsKTsKLQkJCX0KLQkJCWVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdAotCQkJCQkmJiBUbmdVdGlsLmlzTG9ja2VkKChFT2JqZWN0KSBlbGVtZW50KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEZpeGVzIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIEdVSURzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaXhDb250ZW50RGVzY3JpcHRpb25HVUlEcygpIHsKLQkJZmluYWwgTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlIYXNoU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlJbnRlcm5hbEVPYmplY3QgZWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudC5lUHJveHlVUkkoKSA9PSBudWxsKSB7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZWxlbWVudDsKLQkJCQkJCQlEZXNjcmliYWJsZUVsZW1lbnQgY29udGFpbmVyID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudAotCQkJCQkJCQkJLmVDb250YWluZXIoKTsKLQkJCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJCQkJU3RyaW5nIGd1aWQgPSBVbWFVdGlsLmdlbmVyYXRlR1VJRChjb250YWluZXIKLQkJCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJCQkJaWYgKCFndWlkLmVxdWFscyhjb250ZW50LmdldEd1aWQoKSkpIHsKLQkJCQkJCQkJCWNvbnRlbnQuc2V0R3VpZChndWlkKTsKLQkJCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjb250ZW50LmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzCi0JCQkJCQkJCQkJCS5hZGQoY29udGFpbmVyLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCQkiVW5yZXNvbHZlZCBwcm94eSBpbiAnIiArIGVsZW1lbnQuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgKyAiJzogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQotCQkJCW1vbml0b3Iuc3ViVGFzayhBdXRob3JpbmdVSVJlc291cmNlcy5zYXZpbmdGaWxlc1Rhc2tfbmFtZSk7Ci0JCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQl0cnkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmluZ1Rhc2tfbmFtZSwgcmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpKTsKLQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkucnVuV2l0aFByb2dyZXNzKAotCQkJCQkJcnVubmFibGUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5maXhpbmdDb250ZW50RGVzY3JpcHRpb25HVUlEc1Rhc2tfbmFtZSk7IAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja1Byb3h5KEludGVybmFsRU9iamVjdCBlbGVtZW50LCBFUmVmZXJlbmNlIHJlZiwKLQkJCU9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCUludGVybmFsRU9iamVjdCBlT2JqID0gKEludGVybmFsRU9iamVjdCkgdmFsdWU7Ci0JCQlpZiAoZU9iai5lSXNQcm94eSgpKSB7Ci0JCQkJRU9iamVjdCByZXNvbHZlZCA9IGVsZW1lbnQuZVJlc29sdmVQcm94eShlT2JqKTsKLQkJCQlTdHJpbmcgZXJyTXNnID0gbnVsbDsKLQkJCQlpZiAocmVzb2x2ZWQgPT0gZU9iaikgewotCQkJCQllcnJNc2cgPSAiVW5yZXNvbHZlZCBwcm94eSI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKCFyZWYuZ2V0RVR5cGUoKS5pc0luc3RhbmNlKHJlc29sdmVkKSkgewotCQkJCQllcnJNc2cgPSAiSW52YWxpZCBkYXRhIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoZXJyTXNnICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHBhdGg7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JCQkJCQlwYXRoID0gcmVmLmdldEVUeXBlKCkuZ2V0TmFtZSgpCi0JCQkJCQkJCSsgIigiICsgTWlzYy5nZXRQYXRoUmVsYXRpdmVUb0xpYnJhcnkoKE5hbWVkRWxlbWVudCkgZWxlbWVudCkgKyAiKS4iICsgcmVmLmdldE5hbWUoKSArICIgPSAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9IGVsc2UgewotCQkJCQkJcGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIGVyck1zZwotCQkJCQkJCSsgIiBpbiAnIiArIGVsZW1lbnQuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgKyAiJzogIiArIHBhdGggKyByZXNvbHZlZDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExpYnJhcnkgaGVhbHRoIGNoZWNrCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tMaWJyYXJ5SGVhbHRoKCkgewotCQlmaW5hbCBNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0luZm8oCi0JCQkJCQkiKysrKyBMSUJSQVJZIEhFQUxUSCBDSEVDSyBSRVBPUlQgLSBTVEFSVCArKysiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZ1dyaXRlciBzdHJXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQkJUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyV3JpdGVyKTsKLQkJCQlwcmludFdyaXRlci5wcmludGxuKCk7Ci0JCQkJcHJpbnRXcml0ZXIKLQkJCQkJCS5wcmludGxuKCJVTlJFU09MVkVEL0lOVkFMSUQgUFJPWElFUyBJTiBYLVJFRkVSRU5DRVMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXByaW50V3JpdGVyCi0JCQkJCQkucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlJbnRlcm5hbEVPYmplY3QgZWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudC5lUHJveHlVUkkoKSA9PSBudWxsKSB7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZWxlbWVudDsKLQkJCQkJCQlEZXNjcmliYWJsZUVsZW1lbnQgY29udGFpbmVyID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudAotCQkJCQkJCQkJLmVDb250YWluZXIoKTsKLQkJCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJCQkJU3RyaW5nIGd1aWQgPSBVbWFVdGlsLmdlbmVyYXRlR1VJRChjb250YWluZXIKLQkJCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJCQkJaWYgKCFndWlkLmVxdWFscyhjb250ZW50LmdldEd1aWQoKSkpIHsKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCQkJCQkiQ29udGVudERlc2NyaXB0aW9uIHdpdGggaW52YWxpZCBHVUlEOiAiICsgY29udGVudC5nZXRHdWlkKCkgKyAiIGluICciICsgY29udGVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJCQkiQ29udGVudERlc2NyaXB0aW9uIHdpdGhvdXQgYSBjb250YWluZXI6ICIgKyBjb250ZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQotCQkJCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKSB7Ci0JCQkJCQkJCS8vIGNoZWNrIGlmIHRoZSBjb250ZW50LnhtaSBvZiB0aGUgcHJvY2VzcyBpcyBpbgotCQkJCQkJCQkvLyB0aGUgcmlnaHQgcGxhY2UKLQkJCQkJCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IFVtYVV0aWwKLQkJCQkJCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudChjb250ZW50KTsKLQkJCQkJCQkJaWYgKHByb2NDb21wICE9IG51bGwpIHsKLQkJCQkJCQkJCVN0cmluZyBtb2RlbFBhdGggPSBwcm9jQ29tcC5lUmVzb3VyY2UoKQotCQkJCQkJCQkJCQkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJCQkJCQlGaWxlIGRpciA9IG5ldyBGaWxlKG1vZGVsUGF0aCkKLQkJCQkJCQkJCQkJLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJCQkJCVN0cmluZyBjb250ZW50UGF0aCA9IGNvbnRlbnQuZVJlc291cmNlKCkKLQkJCQkJCQkJCQkJLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCi0JCQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1vZGVsIHBhdGg6ICIgKwotCQkJCQkJCQkJLy8gbW9kZWxQYXRoKTsKLQkJCQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudCBwYXRoOiAiICsKLQkJCQkJCQkJCS8vIGNvbnRlbnRQYXRoKTsKLQkJCQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigpOwotCi0JCQkJCQkJCQlGaWxlIGNvbnRlbnREaXIgPSBuZXcgRmlsZShjb250ZW50UGF0aCkKLQkJCQkJCQkJCQkJLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJCQkJCWlmICghZGlyLmVxdWFscyhjb250ZW50RGlyKSkgewotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCQkJCQkJIkNvbnRlbnQgZmlsZSBvZiAiICsgY29udGFpbmVyLmVDbGFzcygpLmdldE5hbWUoKSArICIgJyIgKyBjb250YWluZXIuZ2V0TmFtZSgpICsgIicgaW4gJyIgKyBtb2RlbFBhdGggKyAiIGlzIG1pc3BsYWNlZDogIiArIGNvbnRlbnRQYXRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvLyBjaGVjayBmb3IgdW5yZXNvbHZlZCBwcm94aWVzIGluIGNyb3NzIHJlZmVyZW5jZXMKLQkJCQkJCUFycmF5TGlzdCB4UmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoZWxlbWVudC5lQ2xhc3MoKQotCQkJCQkJCQkuZ2V0RUFsbFJlZmVyZW5jZXMoKSk7Ci0JCQkJCQl4UmVmZXJlbmNlcy5yZW1vdmVBbGwoZWxlbWVudC5lQ2xhc3MoKQotCQkJCQkJCQkuZ2V0RUFsbENvbnRhaW5tZW50cygpKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB4UmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUVSZWZlcmVuY2UgcmVmID0gKEVSZWZlcmVuY2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQocmVmLCBmYWxzZSk7Ci0JCQkJCQkJaWYgKHJlZi5pc01hbnkoKSkgewotCQkJCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbEVMaXN0KSB7Ci0JCQkJCQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgdmFsdWU7Ci0JCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gbGlzdC5iYXNpY0l0ZXJhdG9yKCk7IGl0ZXIxCi0JCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJU3RyaW5nIG1zZyA9IGNoZWNrUHJveHkoZWxlbWVudCwgcmVmLAotCQkJCQkJCQkJCQkJaXRlcjEubmV4dCgpKTsKLQkJCQkJCQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJcHJpbnRXcml0ZXIucHJpbnRsbihtc2cpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCVN0cmluZyBtc2cgPSBjaGVja1Byb3h5KGVsZW1lbnQsIHJlZiwgdmFsdWUpOwotCQkJCQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJCQkJCXByaW50V3JpdGVyLnByaW50bG4obXNnKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCQkiVW5yZXNvbHZlZCBwcm94eSBpbiAnIiArIGVsZW1lbnQuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgKyAiJzogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCi0JCQkJfQotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCXN0cldyaXRlci50b1N0cmluZygpKTsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nSW5mbygKLQkJCQkJCSIrKysrIExJQlJBUlkgSEVBTFRIIENIRUNLIFJFUE9SVCAtIEVORCArKysiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX07Ci0JCWlmIChVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBBdXRob3JpbmdVSVJlc291cmNlcy52aWV3SGVscGVyX3BlcmZvcm1IZWFsdGhDaGVjaykpIHsgCi0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy52aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfdGl0bGU7IAotCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy52aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZTsgCi0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUluZm8odGl0bGUsCi0JCQkJCW1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlcyBpbnZhbGlkIHJlZmVyZW5jZSBpbiB0aGUgb3BlbiBsaWJyYXJ5Ci0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlSW52YWxpZFJlZmVyZW5jZXMoKSB7Ci0JCWZpbmFsIE1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGliID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJSGFzaFNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQuZVByb3h5VVJJKCkgPT0gbnVsbCkgewotCQkJCQkJQXJyYXlMaXN0IHhSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdChlbGVtZW50LmVDbGFzcygpCi0JCQkJCQkJCS5nZXRFQWxsUmVmZXJlbmNlcygpKTsKLQkJCQkJCXhSZWZlcmVuY2VzLnJlbW92ZUFsbChlbGVtZW50LmVDbGFzcygpCi0JCQkJCQkJCS5nZXRFQWxsQ29udGFpbm1lbnRzKCkpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHhSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChyZWYsIGZhbHNlKTsKLQkJCQkJCQlpZiAocmVmLmlzTWFueSgpKSB7Ci0JCQkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRUxpc3QpIHsKLQkJCQkJCQkJCUludGVybmFsRUxpc3QgbGlzdCA9IChJbnRlcm5hbEVMaXN0KSB2YWx1ZTsKLQkJCQkJCQkJCUFycmF5TGlzdCBpbnZhbGlkUHJveGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBsaXN0LmJhc2ljSXRlcmF0b3IoKTsgaXRlcjEKLQkJCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQlPYmplY3QgdiA9IGl0ZXIxLm5leHQoKTsKLQkJCQkJCQkJCQlpZiAoaXNJbnZhbGlkUmVmZXJlbmNlKGVsZW1lbnQsIHJlZiwgdikpIHsKLQkJCQkJCQkJCQkJaW52YWxpZFByb3hpZXMuYWRkKHYpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmICghaW52YWxpZFByb3hpZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJcmVtb3ZlSW52YWxpZFJlZmVyZW5jZXMoZWxlbWVudCwgbGlzdCwKLQkJCQkJCQkJCQkJCWludmFsaWRQcm94aWVzKTsKLQkJCQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZWxlbWVudAotCQkJCQkJCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmIChpc0ludmFsaWRSZWZlcmVuY2UoZWxlbWVudCwgcmVmLCB2YWx1ZSkpIHsKLQkJCQkJCQkJCWVsZW1lbnQuZVNldChyZWYsIG51bGwpOwotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCSJVbnJlc29sdmVkIHByb3h5IGluICciICsgZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSArICInOiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJbW9uaXRvci5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmluZ0ZpbGVzVGFza19uYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQltb25pdG9yLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5zYXZpbmdUYXNrX25hbWUsIHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKSk7Ci0JCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByaXZhdGUgYm9vbGVhbiBpc0ludmFsaWRSZWZlcmVuY2UoSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQsCi0JCQkJCUVSZWZlcmVuY2UgcmVmLCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCQkJSW50ZXJuYWxFT2JqZWN0IGVPYmogPSAoSW50ZXJuYWxFT2JqZWN0KSB2YWx1ZTsKLQkJCQkJaWYgKGVPYmouZUlzUHJveHkoKSkgewotCQkJCQkJRU9iamVjdCByZXNvbHZlZCA9IGVsZW1lbnQuZVJlc29sdmVQcm94eShlT2JqKTsKLQkJCQkJCWlmICghcmVmLmdldEVUeXBlKCkuaXNJbnN0YW5jZShyZXNvbHZlZCkpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgdm9pZCByZW1vdmVJbnZhbGlkUmVmZXJlbmNlcyhJbnRlcm5hbEVPYmplY3QgZWxlbWVudCwKLQkJCQkJSW50ZXJuYWxFTGlzdCB2YWx1ZXMsIENvbGxlY3Rpb24gaW52YWxpZFByb3hpZXMpIHsKLQkJCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QodmFsdWVzLmJhc2ljTGlzdCgpKTsKLQkJCQlsaXN0LnJlbW92ZUFsbChpbnZhbGlkUHJveGllcyk7Ci0JCQkJdmFsdWVzLmNsZWFyKCk7Ci0JCQkJaW50IG1heCA9IGxpc3Quc2l6ZSgpIC0gMTsKLQkJCQlmb3IgKGludCBpID0gbWF4OyBpID4gLTE7IGktLSkgewotCQkJCQlsaXN0LnNldChpLCBlbGVtZW50LmVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgbGlzdAotCQkJCQkJCS5nZXQoaSkpKTsKLQkJCQl9Ci0JCQkJdmFsdWVzLmFkZEFsbChsaXN0KTsKLQkJCX0KLQotCQl9OwotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxldGluZ0ludmFsaWRSZWZlcmVuY2VzVGFza19uYW1lKTsgCi0KLQl9Ci0KLQkvKioKLQkgKiByZWxvYWRzIHRoZSBjdXJyZW50IGxpYnJhcnkuICBVc2VkIG9uIGEgcm9sbGJhY2sgZXJyb3IKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVsb2FkQ3VycmVudExpYmFyeU9uUm9sbGJhY2tFcnJvcihTaGVsbCBzaGVsbCkgewotCQlyZWxvYWRDdXJyZW50TGlicmFyeShzaGVsbCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuVmlld0hlbHBlcl9yZWxvYWRMaWJPblJvbGxiYWNrRXJyb3IpOyAKLQl9Ci0KLQkvKioKLQkgKiBkaXNwbGF5cyB0aGUgbWVzc2FnZSBhbmQgcmVsb2FkcyB0aGUgY3VycmVudCBsaWJyYXJ5IAotCSAqIEBwYXJhbSBzaGVsbAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbG9hZEN1cnJlbnRMaWJyYXJ5KFNoZWxsIHNoZWxsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCQl9Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbG9hZERpYWxvZ190aXRsZTsgCi0JCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCW1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWxvYWREaWFsb2dfbWVzc2FnZTsgCi0JCX0KLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKHRpdGxlLAotCQkJCW1lc3NhZ2UpOwotCi0JCS8vIFRoZSBsaWJyYXJ5IG5lZWRzIHRvIGJlIHJlbG9hZGVkLgotCQlTdHJpbmcgbGliRGlyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKTsKLQkJTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLm9wZW5MaWJyYXJ5KGxpYkRpcik7Ci0JfQotCi0JLyoqCi0JICogb3BlbnMgdGhlIGdpdmVuIHZpZXdJZAotCSAqIEBwYXJhbSB2aWV3SWQKLQkgKiBAcmV0dXJuCi0JICogCQkJVmlldwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpZXdQYXJ0IG9wZW5WaWV3KFN0cmluZyB2aWV3SWQpIHsKLQkJdHJ5IHsKLQkJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJSVZpZXdQYXJ0IHZpZXcgPSBhY3RpdmVQYWdlLmZpbmRWaWV3KHZpZXdJZCk7Ci0JCQkJaWYgKHZpZXcgPT0gbnVsbCkgewotCQkJCQl2aWV3ID0gYWN0aXZlUGFnZS5zaG93Vmlldyh2aWV3SWQpOwotCQkJCX0KLQkJCQlyZXR1cm4gdmlldzsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuaW50ZXJuYWxFcnJvcl9tc2csIAotCQkJCQllKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MzM5YmM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB2aWV3cyBmb3IgdGhlIEF1dGhvcmluZyBhbmQgQnJvd3NpbmcgcGVyc3BlY3RpdmVzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL0NvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL0NvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjFhOGRkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9Db25maWd1cmF0aW9uVGFibGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBUaGUgbGFiZWwgcHJvdmlkZXIgZm9yIHRoZSBDb25maWd1cmF0aW9uIHRhYmxlIGluIHRoZSBPcGVuIENvbmZpZ3VyYXRpb24KLSAqIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVsZW1lbnQ7Ci0JCXJldHVybiBjb25maWcuZ2V0TmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvSVdpemFyZFJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9JV2l6YXJkUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzNjYjAxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9JV2l6YXJkUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJV2l6YXJkUmVnaXN0cnkgewotCVN0cmluZyBnZXROZXdNZXRob2RQbHVnaW5XaXphcmRJZCgpOwotCQotCVN0cmluZyBnZXROZXdNZXRob2RDb25maWd1cmF0aW9uV2l6YXJkSWQoKTsKLQkKLQlTdHJpbmcgZ2V0T3Blbk1ldGhvZExpYnJhcnlXaXphcmRJZCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjI3ODA5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIGVudGVyIGEgbmFtZSBhbmQgZGVzY3JpcHRpb24gZm9yIGEgbmV3Ci0gKiBNZXRob2QgQ29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBwYWdlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJvdGVjdGVkIFRleHQgbmFtZVRleHQsIGJyaWVmRGVzY1RleHQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbm9PcGVuTGlicmFyeTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZSgpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZSk7IC8vJE5PTi1OTFMtMSQpOwotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vTmV3LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkRGF0YSBsYWJlbEdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIG5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbmFtZUxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0Lk5BTUVfVEVYVCk7Ci0JCW5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGxhYmVsR3JpZERhdGEpOwotCi0JCW5hbWVUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCSgoR3JpZERhdGEpIG5hbWVUZXh0LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0JCUxhYmVsIGJyaWVmRGVzY0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlicmllZkRlc2NMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9URVhUKTsKLQkJYnJpZWZEZXNjTGFiZWwuc2V0TGF5b3V0RGF0YShsYWJlbEdyaWREYXRhKTsKLQotCQlicmllZkRlc2NUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCk7Ci0JCWJyaWVmRGVzY1RleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCSgoR3JpZERhdGEpIGJyaWVmRGVzY1RleHQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCSgoR3JpZERhdGEpIGJyaWVmRGVzY1RleHQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gNzA7Ci0JCSgoR3JpZERhdGEpIGJyaWVmRGVzY1RleHQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSA0ODA7Ci0vLwkJYnJpZWZEZXNjVGV4dAotLy8JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX0RlZmF1bHRCcmllZkRlc2NyaXB0aW9uKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlub09wZW5MaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGw7Ci0JCWlmIChub09wZW5MaWJyYXJ5KSB7Ci0JCQkvLyBGSVhNRSEgRXh0ZXJuYWxpemUgc3RyaW5nLgotCQkJc2V0RXJyb3JNZXNzYWdlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlFcnJvcl9tc2cpOwotCQl9Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAobm9PcGVuTGlicmFyeSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIGNvbmZpZ05hbWUgPSBnZXRDb25maWd1cmF0aW9uTmFtZSgpOwotCQlpZiAoY29uZmlnTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoY29uZmlndXJhdGlvbkV4aXN0cyhjb25maWdOYW1lKSkgewotCQkJU3RyaW5nIGVyck1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQljb25maWdOYW1lKTsKLQkJCXNldEVycm9yTWVzc2FnZShlcnJNc2cpOwotCQl9IGVsc2UgewotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQl9Ci0KLQkJcmV0dXJuIGdldEVycm9yTWVzc2FnZSgpID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBsaXN0ZW5lcnMgdG8gdGhlIHdpemFyZCBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQluYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGxpc3RlbmVycyB0byB0aGUgd2l6YXJkIGNvbnRyb2xzLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjb25maWd1cmF0aW9uRXhpc3RzKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCVN0cmluZ1tdIGNvbmZpZ05hbWVzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lcyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb25maWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoY29uZmlnTmFtZXNbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgdXNlciBzcGVjaWZpZWQgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgY29uZmlndXJhaXRvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlndXJhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGJyaWVmIGRlY3JpcHRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgdXNlciBzcGVjaWZpZWQgYnJpZWYgZGVjcmlwdGlvbiBmb3IgdGhlIG5ldyBtZXRob2QKLQkgKiAgICAgICAgIGNvbmZpZ3VyYWl0b24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbmZpZ3VyYXRpb25CcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYnJpZWZEZXNjVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotCQkvL1RPRE86IHZhbGlkYXRlIGlucHV0Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA5NjQ4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBNZXRob2QgQ29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDb25maWd1cmF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9IE5ld0NvbmZpZ3VyYXRpb25XaXphcmQuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlIG1haW5QYWdlOwotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3Q29uZmlndXJhdGlvbldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0V2luZG93VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fbmV3Q29uZmlndXJhdGlvbldpemFyZF90aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGUpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0JCi0JCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQltYWluUGFnZSA9IGNyZWF0ZU1haW5QYWdlKCk7Ci0JCWFkZFBhZ2UobWFpblBhZ2UpOwotCX0KLQotCXByb3RlY3RlZCBOZXdDb25maWd1cmF0aW9uTWFpblBhZ2UgY3JlYXRlTWFpblBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNhbkZpbmlzaCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlTdHJpbmcgY29uZmlnTmFtZSA9IG1haW5QYWdlLmdldENvbmZpZ3VyYXRpb25OYW1lKCk7Ci0JCWlmIChjb25maWdOYW1lICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCQkJaWYodGhpcy5jb25maWcgPT0gbnVsbCkgewotCQkJCQljb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oCi0JCQkJCQkJCQljb25maWdOYW1lLAotCQkJCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljb25maWcgPSB0aGlzLmNvbmZpZzsKLQkJCQkJY29uZmlnLnNldE5hbWUoY29uZmlnTmFtZSk7Ci0JCQkJfQotCQkJCVN0cmluZyBicmllZkRlc2NyaXB0aW9uID0gbWFpblBhZ2UKLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uQnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCWlmIChicmllZkRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJY29uZmlnLnNldEJyaWVmRGVzY3JpcHRpb24oYnJpZWZEZXNjcmlwdGlvbik7Ci0JCQkJfQotCQkJCQotCQkJCS8vIDE3ODQ2MgkKLQkJCQlTdHJpbmcgbXNnID0gbnVsbDsKLQkJCQlpZiAoY29uZmlnTmFtZS5pbmRleE9mKCImIikgPiAtMSkgewotCQkJCQltc2cgPSBOTFMKLQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yNF9tc2csCi0JCQkJCQkJCQljb25maWdOYW1lKTsKLQkJCQl9IGVsc2UgewotCQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZU5hbWVWYWxpZGF0b3IoY29uZmlnLmVDb250YWluZXIoKSwgY29uZmlnKTsKLQkJCQkJbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQoY29uZmlnTmFtZSk7Ci0JCQkJfQotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQltc2cpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkucmVtb3ZlKGNvbmZpZyk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gY29uZmlnOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlLAotCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5pbnRlcm5hbEVycm9yX21zZywgZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJY29uZmlnID0gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBOZXdDb25maWd1cmF0aW9uV2l6YXJkIGNyZWF0ZSgpIHsKLQkJTmV3Q29uZmlndXJhdGlvbldpemFyZCB3aXphcmQgPSBudWxsOwotCQkKLQkJSVdpemFyZFJlZ2lzdHJ5IHdpemFyZFJlZ2lzdHJ5ID0gV2l6YXJkSGVscGVyLmdldFdpemFyZFJlZ2lzdHJ5KCk7CQkKLQkJaWYod2l6YXJkUmVnaXN0cnkgIT0gbnVsbCkgewotCQkJaWYod2l6YXJkUmVnaXN0cnkuZ2V0TmV3TWV0aG9kQ29uZmlndXJhdGlvbldpemFyZElkKCkgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXdpemFyZCA9IChOZXdDb25maWd1cmF0aW9uV2l6YXJkKSBXaXphcmRIZWxwZXIuY3JlYXRlTmV3V2l6YXJkKHdpemFyZFJlZ2lzdHJ5LmdldE5ld01ldGhvZENvbmZpZ3VyYXRpb25XaXphcmRJZCgpKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZih3aXphcmQgPT0gbnVsbCkgewotCQkJd2l6YXJkID0gbmV3IE5ld0NvbmZpZ3VyYXRpb25XaXphcmQoKTsKLQkJfQotCQlyZXR1cm4gd2l6YXJkOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbiB0byBwb3B1bGF0ZSBpdHMgZGF0YSB1c2VyIHdpbGwgc3BlY2lmeSBpbiB3aXphcmQuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5TWFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDVmZTEwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5TWFpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gZW50ZXIgdGhlIG5hbWUsIGJyaWVmIGRlc2NyaXB0aW9uIGFuZAotICogdHlwZSBmb3IgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3TGlicmFyeU1haW5QYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBwYWdlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gTmV3TGlicmFyeU1haW5QYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0KLQlwcml2YXRlIENvbWJvIGxpYnJhcnlQYXRoQ29tYm87Ci0KLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcml2YXRlIFRleHQgYnJpZWZEZXNjVGV4dDsKLQotCXByaXZhdGUgU3RyaW5nIGxpYnJhcnlUeXBlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3TGlicmFyeU1haW5QYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkTWFpblBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkTWFpblBhZ2VfZGVzY3JpcHRpb24pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vTmV3LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMubGlicmFyeVBhdGhMYWJlbF90ZXh0KTsKLQotCQlsaWJyYXJ5UGF0aENvbWJvID0gY3JlYXRlQ29tYm9ib3goY29tcG9zaXRlKTsKLQotCQlicm93c2VCdXR0b24gPSBjcmVhdGVCdXR0b24oY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUk9XU0VfQlVUVE9OX1RFWFQpOwotCi0JCUxhYmVsIGJyaWVmRGVzY0xhYmVsID0gY3JlYXRlTGFiZWwoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9URVhUKTsKLQkJYnJpZWZEZXNjTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0JCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJYnJpZWZEZXNjVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChjb21wb3NpdGUsICIiLCA0ODAsIDcwLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCU1hcCB0eXBlcyA9IExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlUeXBlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdHlwZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJbGlicmFyeVR5cGUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJU3RyaW5nW10gbmV3TGlicmFyeVBhdGhzID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0TmV3TGlicmFyeVBhdGhzKCk7Ci0JCWxpYnJhcnlQYXRoQ29tYm8uc2V0SXRlbXMobmV3TGlicmFyeVBhdGhzKTsKLQkJaWYgKG5ld0xpYnJhcnlQYXRocy5sZW5ndGggPiAwKSB7Ci0JCQlsaWJyYXJ5UGF0aENvbWJvLnNldFRleHQobmV3TGlicmFyeVBhdGhzWzBdKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWxpYnJhcnlQYXRoQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbGlicmFyeVBhdGhDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCwgU1dULk5PTkUpOwotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGdldExpYnJhcnlQYXRoKCkpOwotCQkJCVN0cmluZyBzZWxlY3RlZERpciA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHNlbGVjdGVkRGlyICE9IG51bGwpIHsKLQkJCQkJbGlicmFyeVBhdGhDb21iby5hZGQoc2VsZWN0ZWREaXIsIDApOwotCQkJCQlsaWJyYXJ5UGF0aENvbWJvLnNldFRleHQoc2VsZWN0ZWREaXIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiBnZXRMaWJyYXJ5TmFtZSgpLmxlbmd0aCgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5TmFtZSgpIHsKLQkJU3RyaW5nIGxpYlBhdGggPSBnZXRMaWJyYXJ5UGF0aCgpOwotCQlTdHJpbmcgbGliTmFtZSA9IG5ldyBGaWxlKGxpYlBhdGgpLmdldE5hbWUoKTsKLQkJaWYgKCFsaWJQYXRoLmVxdWFscyhsaWJOYW1lKSkgewotCQkJcmV0dXJuIGxpYk5hbWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlQYXRoKCkgewotCQlyZXR1cm4gbGlicmFyeVBhdGhDb21iby5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYnJpZWZEZXNjVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IHR5cGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5VHlwZSgpIHsKLQkJcmV0dXJuIGxpYnJhcnlUeXBlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlMi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZTFjNmE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0xpYnJhcnlNYWluUGFnZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5TWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIGVudGVyIHRoZSBuYW1lLCBicmllZiBkZXNjcmlwdGlvbiBhbmQKLSAqIHR5cGUgZm9yIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIE5ld0xpYnJhcnlNYWluUGFnZTIgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE5ld0xpYnJhcnlNYWluUGFnZTIuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JRCA9ICJ0eXBlSWQiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBUZXh0IG5hbWVUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGJyaWVmRGVzY1RleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbltdIHJhZGlvQnV0dG9uczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlNYWluUGFnZTIoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV9kZXNjcmlwdGlvbik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9OZXcuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCi0JCUxhYmVsIG5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQluYW1lTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQotCQluYW1lVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCW5hbWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkoKEdyaWREYXRhKSBuYW1lVGV4dC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlMYWJlbCBicmllZkRlc2NMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQlicmllZkRlc2NMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9URVhUKTsKLQotCQlicmllZkRlc2NUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCk7Ci0JCWJyaWVmRGVzY1RleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCSgoR3JpZERhdGEpIGJyaWVmRGVzY1RleHQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCSgoR3JpZERhdGEpIGJyaWVmRGVzY1RleHQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gNzA7Ci0JCSgoR3JpZERhdGEpIGJyaWVmRGVzY1RleHQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSA0ODA7Ci0KLQkJTGFiZWwgbGlicmFyeVR5cGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQlsaWJyYXJ5VHlwZUxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMubGlicmFyeVR5cGVMYWJlbF90ZXh0KTsKLQotCQlDb21wb3NpdGUgdHlwZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9STUFMKTsKLQkJdHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJdHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlNYXAgdHlwZXMgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5VHlwZXMoKTsKLQkJcmFkaW9CdXR0b25zID0gbmV3IEJ1dHRvblt0eXBlcy5zaXplKCldOwotCQlpbnQgcmFkaW9CdXR0b25JbmRleCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB0eXBlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgdHlwZUlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJU3RyaW5nIHR5cGVOYW1lID0gKFN0cmluZykgdHlwZXMuZ2V0KHR5cGVJZCk7Ci0JCQlCdXR0b24gcmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uKHR5cGVDb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCQlyYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXJhZGlvQnV0dG9uLnNldFRleHQodHlwZU5hbWUpOwotCQkJcmFkaW9CdXR0b24uc2V0RGF0YShUWVBFX0lELCB0eXBlSWQpOwotCQkJcmFkaW9CdXR0b25zW3JhZGlvQnV0dG9uSW5kZXgrK10gPSByYWRpb0J1dHRvbjsKLQkJfQotCi0JCWlmIChyYWRpb0J1dHRvbnMubGVuZ3RoID4gMCkgewotCQkJcmFkaW9CdXR0b25zWzBdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlOZXdMaWJyYXJ5V2l6YXJkUGFnZSB3aXphcmRQYWdlID0gTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5Ci0JCQkJLmdldEluc3RhbmNlKCkuZ2V0V2l6YXJkUGFnZShnZXRMaWJyYXJ5VHlwZSgpKTsKLQkJaWYgKHdpemFyZFBhZ2UgIT0gbnVsbCkgewotCQkJd2l6YXJkUGFnZS5vbkVudGVyUGFnZShnZXRMaWJyYXJ5TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gd2l6YXJkUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGdldExpYnJhcnlOYW1lKCkubGVuZ3RoKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIEFkZHMgbGlzdGVuZXJzIHRvIHRoZSB3aXphcmQgY29udHJvbHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJbmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlicmFyeSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0JCXJldHVybiBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgdHlwZSBzZWxlY3RlZCBieSB0aGUgdXNlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlUeXBlKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHJhZGlvQnV0dG9ucy5sZW5ndGg7IGkrKykgewotCQkJQnV0dG9uIHJhZGlvQnV0dG9uID0gcmFkaW9CdXR0b25zW2ldOwotCQkJaWYgKHJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpIHJhZGlvQnV0dG9uLmdldERhdGEoVFlQRV9JRCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmcpIHJhZGlvQnV0dG9uc1swXS5nZXREYXRhKFRZUEVfSUQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzNmYmZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQSB3aXphcmQgdGhhdCBndWlkZXMgdGhlIHVzZXIgdG8gY3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld0xpYnJhcnlXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gTmV3TGlicmFyeVdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgbWFpbiB3aXphcmQgcGFnZS4KLQlwcml2YXRlIE5ld0xpYnJhcnlNYWluUGFnZSBtYWluUGFnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRXaW5kb3dUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIHRydWUsIG51bGwsIG51bGwsIG51bGwpOwotCQltYWluUGFnZSA9IG5ldyBOZXdMaWJyYXJ5TWFpblBhZ2UoKTsKLQkJYWRkUGFnZShtYWluUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbmFtZSA9IG1haW5QYWdlLmdldExpYnJhcnlOYW1lKCk7Ci0JCQlTdHJpbmcgZGVzYyA9IG1haW5QYWdlLmdldExpYnJhcnlEZXNjcmlwdGlvbigpOwotCQkJU3RyaW5nIHR5cGUgPSBtYWluUGFnZS5nZXRMaWJyYXJ5VHlwZSgpOwotCQkJTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKG1haW5QYWdlLmdldExpYnJhcnlQYXRoKCkpOwotCQkJb3B0aW9ucy5wdXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCwgbGlicmFyeVBhdGgKLQkJCQkJLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQotCQkJaWYgKFhNSUxpYnJhcnlVdGlsCi0JCQkJLmNvbnRhaW5zUGx1Z2luT3JDb25maWdTcGVjRXhwb3J0RmlsZShsaWJyYXJ5UGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSkpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX3JlYXNvbjQpOwotCQkJfQotCQkJCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5jcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIHR5cGUsIG9wdGlvbnMpOwotCQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJCWlmIChkZXNjLmxlbmd0aCgpID4gMCkgewotCQkJCQlsaWJyYXJ5LnNldEJyaWVmRGVzY3JpcHRpb24oZGVzYyk7Ci0JCQkJfQotCQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLmFkZE5ld0xpYnJhcnlQYXRoKGxpYnJhcnlQYXRoCi0JCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCVBlcnNwZWN0aXZlVXRpbAotCQkJCQkJLm9wZW5QZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAocmVhc29uID09IG51bGwpIHsKLQkJCQlyZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbjsKLQkJCX0KLQkJCXJlYXNvbiArPSAiXG5cbiIgKyBBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5RXJyb3JfYWR2aWNlOyAgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5RXJyb3JfbXNnLCByZWFzb24pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5RXJyb3JfbXNnLCByZWFzb24sIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmQyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMjFmNzE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk5ld0xpYnJhcnlXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQSB3aXphcmQgdGhhdCBndWlkZXMgdGhlIHVzZXIgdG8gY3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIE5ld0xpYnJhcnlXaXphcmQyIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9IE5ld0xpYnJhcnlXaXphcmQyLmNsYXNzLmdldE5hbWUoKTsKLQotCS8vIFRoZSBtYWluIHdpemFyZCBwYWdlLgotCXByaXZhdGUgTmV3TGlicmFyeU1haW5QYWdlIG1haW5QYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3TGlicmFyeVdpemFyZDIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRXaW5kb3dUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIHRydWUsIG51bGwsIG51bGwsIG51bGwpOwotCQltYWluUGFnZSA9IG5ldyBOZXdMaWJyYXJ5TWFpblBhZ2UoKTsKLQkJYWRkUGFnZShtYWluUGFnZSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldExpYnJhcnlUeXBlcygpLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBwZXJzaXN0ZW5jZUlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJU3RyaW5nIHBhZ2VJZCA9IHBlcnNpc3RlbmNlSWQgKyAiUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQkJCU5ld0xpYnJhcnlXaXphcmRQYWdlIHBhZ2UgPSBOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkKLQkJCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlV2l6YXJkUGFnZShwYWdlSWQsIHBlcnNpc3RlbmNlSWQpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXBhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC93aXpiYW4vTmV3LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCQkJCi0JCQkJYWRkUGFnZShwYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJSVdpemFyZFBhZ2VbXSBwYWdlcyA9IGdldFBhZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghcGFnZXNbaV0uaXNQYWdlQ29tcGxldGUoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSAhPSBtYWluUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJU3RyaW5nIG5hbWUgPSBtYWluUGFnZS5nZXRMaWJyYXJ5TmFtZSgpOwotCQlTdHJpbmcgdHlwZSA9IG1haW5QYWdlLmdldExpYnJhcnlUeXBlKCk7Ci0JCU5ld0xpYnJhcnlXaXphcmRQYWdlIHBhZ2UgPSBOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRXaXphcmRQYWdlKHR5cGUpOwotCQl0cnkgewotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuY3JlYXRlTWV0aG9kTGlicmFyeShuYW1lLCB0eXBlLCBwYWdlLmdldFNlbGVjdGlvbnMoKSk7Ci0JCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQkJYWRkUmVjZW50bHlPcGVuZWRMaWJyYXJ5KGxpYnJhcnkpOwotCQkJCVBlcnNwZWN0aXZlVXRpbAotCQkJCQkJLm9wZW5QZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAocmVhc29uID09IG51bGwpIHsKLQkJCQlyZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbjsKLQkJCX0KLQkJCXJlYXNvbiArPSAiXG5cbiIgKyBBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5RXJyb3JfYWR2aWNlOyAgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5RXJyb3JfbXNnLCByZWFzb24pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5RXJyb3JfbXNnLCByZWFzb24sIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBuZXdseSBvcGVuZWQgb3IgY3JlYXRlZCBtZXRob2QgbGlicmFyeSB0byB0aGUgcmVjZW50bHkgb3BlbmVkCi0JICogbWV0aG9kIGxpYnJhcmllcyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVjZW50bHlPcGVuZWRMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbGlicmFyeVVSSSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0TGlicmFyeU1hbmFnZXIoCi0JCQkJCWxpYnJhcnkpLmdldE1ldGhvZExpYnJhcnlVUkkoKS50b1N0cmluZygpOwotCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuYWRkT3BlbkxpYnJhcnlVUkkobGlicmFyeVVSSSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld01ldGhvZFBsdWdpbldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TWV0aG9kUGx1Z2luV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlYjdhZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TWV0aG9kUGx1Z2luV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Nb2RlbFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQSB3aXphcmQgdGhhdCBndWlkZXMgdGhlIHVzZXIgdG8gY3JlYXRlIGEgbmV3IE1ldGhvZCBQbHVnLWluLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3TWV0aG9kUGx1Z2luV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9IE5ld01ldGhvZFBsdWdpbldpemFyZC5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBOZXdNZXRob2RQbHVnaW5XaXphcmRQYWdlIG1haW5QYWdlOwotCi0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gbmV3UGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3TWV0aG9kUGx1Z2luV2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0V2luZG93VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3UGx1Z2luV2l6YXJkX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJbWFpblBhZ2UgPSBjcmVhdGVNYWluUGFnZSgpOwotCQlhZGRQYWdlKG1haW5QYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE5ld01ldGhvZFBsdWdpbldpemFyZFBhZ2UgY3JlYXRlTWFpblBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgTmV3TWV0aG9kUGx1Z2luV2l6YXJkUGFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY2FuRmluaXNoKCk7Ci0JfQotCQotCXByb3RlY3RlZCBNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IG1haW5QYWdlLmdldFBsdWdpbk5hbWUoKTsKLQkJTWV0aG9kUGx1Z2luIG5ld1BsdWdpbiA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCQluZXdQbHVnaW4uc2V0TmFtZShTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKHBsdWdpbk5hbWUpKTsKLQkJbmV3UGx1Z2luLnNldEJyaWVmRGVzY3JpcHRpb24obWFpblBhZ2UuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJbmV3UGx1Z2luLnNldEF1dGhvcnMobWFpblBhZ2UuZ2V0QXV0aG9ycygpKTsKLQkJT2JqZWN0W10gcmVmZXJlbmNlZFBsdWdpbnMgPSBtYWluUGFnZS5nZXRSZWZlcmVuY2VkUGx1Z2lucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZWRQbHVnaW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgcmVmZXJlbmNlZFBsdWdpbnNbaV07Ci0JCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQluZXdQbHVnaW4uZ2V0QmFzZXMoKS5hZGQocGx1Z2luKTsKLQkJCX0KLQkJfQotCQlNb2RlbFN0b3JhZ2UuaW5pdGlhbGl6ZShuZXdQbHVnaW4pOwotCQlyZXR1cm4gbmV3UGx1Z2luOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBtYWluUGFnZS5nZXRQbHVnaW5OYW1lKCk7Ci0JCWlmIChwbHVnaW5OYW1lICE9IG51bGwgJiYgcGx1Z2luTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJLy8gQ3JlYXRlIHRoZSBtZXRob2QgcGx1Zy1pbiBhbmQgYWRkIGl0IHRvIHRoZSBjdXJyZW50IG1ldGhvZAotCQkJCS8vIGxpYnJhcnkuCi0JCQkJbmV3UGx1Z2luID0gY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCQkJCi0JCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQltYW5hZ2VyLmFkZE1ldGhvZFBsdWdpbihuZXdQbHVnaW4pOwotCQkJCX0KLQotCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCS8vIFNlbGVjdCB0aGUgbmV3IE1ldGhvZCBQbHVnLWluIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0JCQkJCQlMaXN0IHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCXNlbGVjdGlvbi5hZGQobmV3UGx1Z2luKTsKLQkJCQkJCUxpYnJhcnlWaWV3LmdldFZpZXcoKS5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihzZWxlY3Rpb24pOwotCi0JCQkJCQkvLyBPcGVuIHRoZSBlZGl0b3IgZm9yIG5ld2x5IGNyZWF0ZWQgcGx1Zy1pbi4KLQkJCQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKG5ld1BsdWdpbik7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCXJldHVybiB0cnVlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3UGx1Z2luRXJyb3JfcmVhc29uOwotCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdQbHVnaW5XaXphcmRfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbkVycm9yX21zZywgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlyZWFzb24sCi0JCQkJCQllKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TWV0aG9kUGx1Z2luV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TWV0aG9kUGx1Z2luV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZjAxNjNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld01ldGhvZFBsdWdpbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Nb2RlbFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciBhIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGZvciBhIG5ldwotICogTWV0aG9kIFBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdNZXRob2RQbHVnaW5XaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE5ld01ldGhvZFBsdWdpbldpemFyZFBhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBuYW1lVGV4dDsKLQotCXByaXZhdGUgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGF1dGhvcnNUZXh0OwotCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIHJlZmVyZW5jZWRQbHVnaW5zVmlld2VyOwotCi0JcHJpdmF0ZSBMaXN0IHBsdWdpbnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdNZXRob2RQbHVnaW5XaXphcmRQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5uZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5uZXdQbHVnaW5XaXphcmRQYWdlX3RleHQpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9OZXcuZ2lmIikpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCUdyaWREYXRhIGxhYmVsR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQluYW1lTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQkJbmFtZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQkvLyBUT0RPOiBQcm92aWRlIGEgdW5pcXVlIGRlZmF1bHQgcGx1Zy1pbiBuYW1lLgotCQluYW1lVGV4dC5zZXRUZXh0KCJuZXdfcGx1Zy1pbiIpOyAvLyROT04tTkxTLTEkCi0JCW5hbWVUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCUxhYmVsIGJyaWVmRGVzY0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlicmllZkRlc2NMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQkJYnJpZWZEZXNjTGFiZWwuc2V0TGF5b3V0RGF0YShsYWJlbEdyaWREYXRhKTsKLQkJYnJpZWZEZXNjVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwpOwotCQlHcmlkRGF0YSBicmllZkRlc2NHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlicmllZkRlc2NHcmlkRGF0YS5oZWlnaHRIaW50ID0gNzA7Ci0JCWJyaWVmRGVzY1RleHQuc2V0TGF5b3V0RGF0YShicmllZkRlc2NHcmlkRGF0YSk7Ci0KLQkJTGFiZWwgYXV0aG9yc0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhdXRob3JzTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVRleHQuQVVUSE9SU19URVhUKTsKLQkJYXV0aG9yc0xhYmVsLnNldExheW91dERhdGEobGFiZWxHcmlkRGF0YSk7Ci0JCWF1dGhvcnNUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGF1dGhvcnNHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlhdXRob3JzR3JpZERhdGEuaGVpZ2h0SGludCA9IDM1OwotCQlhdXRob3JzVGV4dC5zZXRMYXlvdXREYXRhKGF1dGhvcnNHcmlkRGF0YSk7Ci0KLQkJTGFiZWwgcmVmZXJlbmNlZFBsdWdpbnNMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcmVmZXJlbmNlZFBsdWdpbnNMYWJlbAotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5SRUZFUkVOQ0VEX1BMVUdJTlNfU0VDVElPTl9OQU1FKTsKLQkJcmVmZXJlbmNlZFBsdWdpbnNMYWJlbC5zZXRMYXlvdXREYXRhKGxhYmVsR3JpZERhdGEpOwotCQlwbHVnaW5zID0gTW9kZWxTdG9yYWdlLmdldEJhc2VNb2RlbHMoKTsKLQkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW3BsdWdpbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gbW9kZWwgPSAoTWV0aG9kUGx1Z2luKSBwbHVnaW5zLmdldChpKTsKLQkJCWl0ZW1zW2ldID0gbW9kZWwuZ2V0TmFtZSgpOwotCQl9Ci0JCXJlZmVyZW5jZWRQbHVnaW5zVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QoY29tcG9zaXRlLAotCQkJCVNXVC5CT1JERVIgfCBTV1QuRklMTCB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJR3JpZERhdGEgcmVmZXJlbmNlZFBsdWdpbnNHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlyZWZlcmVuY2VkUGx1Z2luc0dyaWREYXRhLmhlaWdodEhpbnQgPSAxNTA7Ci0JCXJlZmVyZW5jZWRQbHVnaW5zVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YSgKLQkJCQlyZWZlcmVuY2VkUGx1Z2luc0dyaWREYXRhKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0KLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9QTFVHSU47Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZFBsdWdpbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0KLQkJcmVmZXJlbmNlZFBsdWdpbnNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQotCQlpZiAocGx1Z2lucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlyZWZlcmVuY2VkUGx1Z2luc1ZpZXdlci5hZGQoaXQubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQkvLyBHZXQgdGhlIHBhcmVudCBzaGVsbC4KLQkJU2hlbGwgc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLQotCQluYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkJbmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCB0aGlzKTsKLQotCQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0JCWlmIChkaXNwbGF5ICE9IG51bGwgJiYgIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQluYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJCQluYW1lVGV4dC5zZXRTZWxlY3Rpb24oMCwgbmFtZVRleHQuZ2V0VGV4dCgpLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkgewotCQkJdmFsaWRhdGVOYW1lKCk7Ci0JCX0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIHBsdWctaW4gbmFtZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5hbWUoKSB7Ci0JCWJvb2xlYW4gYW5zd2VyOwotCi0JCVN0cmluZyBtc2cgPSBMaWJyYXJ5VXRpbC5jaGVja1BsdWdpbk5hbWUobnVsbCwgZ2V0UGx1Z2luTmFtZSgpKTsKLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQlhbnN3ZXIgPSB0cnVlOwotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJc2V0TWVzc2FnZShBdXRob3JpbmdVSVJlc291cmNlcy5uZXdQbHVnaW5XaXphcmRQYWdlX3RleHQpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlhbnN3ZXIgPSBmYWxzZTsKLQkJCWludCBpZHggPSBtc2cuaW5kZXhPZigiJy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGlkeCA+PSAwKQotCQkJCW1zZyA9IG1zZy5zdWJzdHJpbmcoaWR4ICsgMyk7Ci0JCQkvLyBDaGVjayBmb3IgSVVQTDAxMDFFIGluIHRoZSBtc2csIGluIG9yZGVyIHRvIGRpc3BsYXkgZXJyb3IgbXNnLAotCQkJLy8gV2hpY2ggZml0cyBpbiBlcnJvciBtZXNzYWdlIGFyZWEgb2YgdGhlIHdpemFyZC4gCi0JCQlpbnQgaSA9IG1zZy5pbmRleE9mKCJJVVBMMDEwMUUiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYoaT49MCl7Ci0JCQkJbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5kdXBsaWNhdGVQbHVnaW5OYW1lRXJyb3JfbXNnLCBnZXRQbHVnaW5OYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzZXRFcnJvck1lc3NhZ2UobXNnKTsKLQkJCXNldE1lc3NhZ2UobnVsbCk7Ci0JCX0KLQotCQlyZXR1cm4gYW5zd2VyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gaXNUZXh0Tm9uRW1wdHkobmFtZVRleHQpICYmIGdldEVycm9yTWVzc2FnZSgpID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBUZXh0IGNvbnRyb2wgY29udGFpbnMgYSB2bGFpZCB0ZXh0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUZXh0Tm9uRW1wdHkoVGV4dCB0KSB7Ci0JCVN0cmluZyB0ZXh0ID0gdC5nZXRUZXh0KCk7Ci0JCXJldHVybiB0ZXh0ICE9IG51bGwgJiYgdGV4dC50cmltKCkubGVuZ3RoKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgZm9yIHRoZSBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luTmFtZSgpIHsKLQkJcmV0dXJuIG5hbWVUZXh0LmdldFRleHQoKSAhPSBudWxsID8gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYnJpZWZEZXNjVGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXV0aG9ycy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF1dGhvcnMoKSB7Ci0JCXJldHVybiBhdXRob3JzVGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBwbHVnLWlucy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0UmVmZXJlbmNlZFBsdWdpbnMoKSB7Ci0JCXJldHVybiByZWZlcmVuY2VkUGx1Z2luc1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzk2NTMxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIE1ldGhvZCBDb25maWd1cmF0aW9uIHRvIG9wZW4uCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cwotCQlJQ2hlY2tTdGF0ZUxpc3RlbmVyLCBMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBPcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCXByaXZhdGUgaW50IGNoZWNrZWRDb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBPcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlKFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHRpdGxlLAotCQkJSW1hZ2VEZXNjcmlwdG9yIHRpdGxlSW1hZ2UpIHsKLQkJc3VwZXIocGFnZU5hbWUsIHRpdGxlLCB0aXRsZUltYWdlKTsKLQkJc2V0VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyI2NoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCi0JCU9wZW5Db25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCA9IChPcGVuQ29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCWlmIChldmVudC5nZXRDaGVja2VkKCkpIHsKLQkJCWNoZWNrZWRDb3VudCsrOwotCQkJd2l6YXJkLmNvbmZpZ3VyYXRpb25zLmFkZChvYmopOwotCQl9IGVsc2UgewotCQkJY2hlY2tlZENvdW50LS07Ci0JCQl3aXphcmQuY29uZmlndXJhdGlvbnMucmVtb3ZlKG9iaik7Ci0JCX0KLQotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJT3BlbkNvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkID0gKE9wZW5Db25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKTsKLQotCQlpZiAoY2hlY2tlZENvdW50ID4gMCkgewotCQkJd2l6YXJkLm9rVG9Db21wbGV0ZSA9IHRydWU7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXdpemFyZC5va1RvQ29tcGxldGUgPSBmYWxzZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgd2lkZ2V0cy4KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBkZXNpcmVkIGxheW91dCBmb3IgdGhpcyB3aXphcmQgcGFnZS4KLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCi0JCS8vIEFkZCBhbiBlbXB0eSBsaW5lIGZpcnN0LgotCQlMYWJlbCBlbXB0eUxpbmUgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWVtcHR5TGluZS5zZXRUZXh0KCIgICAiKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQkJfCBHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJZW1wdHlMaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIiAgICIpOyAvLyROT04tTkxTLTEkCi0KLQkJdGFibGUgPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQkJfCBHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDMwMDsKLQkJCXRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCXRhYmxlVmlld2VyID0gbmV3IENoZWNrYm94VGFibGVWaWV3ZXIodGFibGUpOwotCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb25maWd1cmF0aW9uVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlNZXRob2RDb25maWd1cmF0aW9uW10gY29uZmlncyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KGNvbmZpZ3MpOwotCi0JCXRhYmxlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBTZXQgdGhlIGNvbXBvc2l0ZSBhcyB0aGUgY29udHJvbCBmb3IgdGhpcyBwYWdlLgotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9PcGVuQ29uZmlndXJhdGlvbldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvT3BlbkNvbmZpZ3VyYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDYzOTJhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9PcGVuQ29uZmlndXJhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGd1aWRlcyB0aGUgdXNlciB0byBvcGVuIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkNvbmZpZ3VyYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCXByb3RlY3RlZCBPcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlIG1haW5QYWdlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gb2tUb0NvbXBsZXRlID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjb25maWd1cmF0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBPcGVuQ29uZmlndXJhdGlvbldpemFyZChMaXN0IGNvbmZpZ3VyYXRpb25zKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29uZmlndXJhdGlvbnMgPSBjb25maWd1cmF0aW9uczsKLQkJc2V0V2luZG93VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25XaXphcmRfd2luZG93VGl0bGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3BlbkNvbmZpZ3VyYXRpb25XaXphcmQoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCW1haW5QYWdlID0gbmV3IE9wZW5Db25maWd1cmF0aW9uTWFpblBhZ2UoCi0JCQkJT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZS5QQUdFX05BTUUsIG51bGwsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWFkZFBhZ2UobWFpblBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCXJldHVybiBva1RvQ29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1DYW5jZWwoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0JCWlmIChjb25maWd1cmF0aW9ucyAhPSBudWxsKQotCQkJY29uZmlndXJhdGlvbnMuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TYXZlQWxsRWRpdG9yc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1NhdmVBbGxFZGl0b3JzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZmU2MWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1NhdmVBbGxFZGl0b3JzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JUGFnZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlBhZ2VDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBsaXN0cyB0aGUgY3VycmVudGx5IG9wZW4gZWRpdG9ycyBhbmQgcHJvbXB0cyB0aGUgdXNlciB0bwotICogc2F2ZSB0aGVtIGJlZm9yZSBwZXJmb3JtaW5nIGFuIGltcG9ydCBvciBleHBvcnQgb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2F2ZUFsbEVkaXRvcnNQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfQU5EX0NMT1NFX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZVRpdGxlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfQU5EX0NMT1NFX1BBR0VfREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlRGVzY3JpcHRpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVUaXRsZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX1BBR0VfREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gZG9DbG9zZTsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjdHJsX2Noa2JveFRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBCdXR0b24gc2VsZWN0QWxsOwotCi0JcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGw7Ci0KLQkvKioKLQkgKiBBZGRzIHRoaXMgd2l6YXJkIHBhZ2UgdG8gYSB3aXphcmQgb25seSB3aGVuIG5lY2Vzc2FyeS4KLQkgKiAKLQkgKiBAcGFyYW0gd2l6YXJkCi0JICogICAgICAgICAgICBUaGUgd2l6YXJkIHdoaWNoIHRoaXMgcGFnZSBtaWdodCBiZSBhZGRlZC4KLQkgKiBAcGFyYW0gZG9DbG9zZQotCSAqICAgICAgICAgICAgSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoaXMgcGFnZSB3aWxsIGJlIGFkZGVkIGlmZiB0aGVyZSBhcmUKLQkgKiAgICAgICAgICAgIG9wZW4gZWRpdG9ycy4gSWYgPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGlzIHBhZ2Ugd2lsbCBiZQotCSAqICAgICAgICAgICAgYWRkZWQgaWZmIHRoZXJlIGFyZSBkaXJ0eSBlZGl0b3JzLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBhZ2Ugd2lsbCBiZSBhZGRlZCB0byB0aGUgd2l6YXJkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRQYWdlSWZOZWVkZWQoV2l6YXJkIHdpemFyZCwgYm9vbGVhbiBkb0Nsb3NlKSB7Ci0JCWlmIChpc1Vuc2F2ZWRFZGl0b3IoZG9DbG9zZSkpIHsKLQkJCXdpemFyZC5hZGRQYWdlKG5ldyBTYXZlQWxsRWRpdG9yc1BhZ2UoZG9DbG9zZSkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCi0JfQotCi0JLyoqCi0JICogQWRkcyB0aGlzIHdpemFyZCBwYWdlIHRvIGEgd2l6YXJkIG9ubHkgd2hlbiBuZWNlc3NhcnkuCi0JICogCi0JICogQHBhcmFtIHdpemFyZAotCSAqICAgICAgICAgICAgVGhlIHdpemFyZCB3aGljaCB0aGlzIHBhZ2UgbWlnaHQgYmUgYWRkZWQuCi0JICogQHBhcmFtIGRvQ2xvc2UKLQkgKiAgICAgICAgICAgIElmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGlzIHBhZ2Ugd2lsbCBiZSBhZGRlZCBpZmYgdGhlcmUgYXJlCi0JICogICAgICAgICAgICBvcGVuIGVkaXRvcnMuIElmIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhpcyBwYWdlIHdpbGwgYmUKLQkgKiAgICAgICAgICAgIGFkZGVkIGlmZiB0aGVyZSBhcmUgZGlydHkgZWRpdG9ycy4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYWdlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHdpemFyZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkUGFnZUlmTmVlZGVkKFdpemFyZCB3aXphcmQsIGJvb2xlYW4gZG9DbG9zZSwKLQkJCVN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpIHsKLQotCQlpZiAoaXNVbnNhdmVkRWRpdG9yKGRvQ2xvc2UpKSB7Ci0JCQlTYXZlQWxsRWRpdG9yc1BhZ2UgcGFnZSA9IG5ldyBTYXZlQWxsRWRpdG9yc1BhZ2UoZG9DbG9zZSk7Ci0JCQlpZiAodGl0bGUgIT0gbnVsbCkgewotCQkJCXBhZ2Uuc2V0VGl0bGUodGl0bGUpOwotCQkJfQotCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQlwYWdlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJCX0KLQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJcGFnZS5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2UpOwotCQkJfQotCQkJd2l6YXJkLmFkZFBhZ2UocGFnZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnRhbmNlLgotCSAqLwotCXB1YmxpYyBTYXZlQWxsRWRpdG9yc1BhZ2UoYm9vbGVhbiBjbG9zZSkgewotCQlzdXBlcihTQVZFX1BBR0VfVElUTEUpOwotCQl0aGlzLmRvQ2xvc2UgPSBjbG9zZTsKLQkJaWYgKGRvQ2xvc2UpIHsKLQkJCXNldFRpdGxlKFNBVkVfQU5EX0NMT1NFX1BBR0VfVElUTEUpOwotCQkJc2V0RGVzY3JpcHRpb24oU0FWRV9BTkRfQ0xPU0VfUEFHRV9ERVNDKTsKLQkJfSBlbHNlIHsKLQkJCXNldFRpdGxlKFNBVkVfUEFHRV9USVRMRSk7Ci0JCQlzZXREZXNjcmlwdGlvbihTQVZFX1BBR0VfREVTQyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KGNvbnRhaW5lciwKLQkJCQlTV1QuQk9SREVSIHwgU1dULkZJTEwgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKAotCQkJCW5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlJRWRpdG9yUmVmZXJlbmNlIHJlZiA9IChJRWRpdG9yUmVmZXJlbmNlKSBlbGVtZW50OwotCQkJCXJldHVybiByZWYuZ2V0RWRpdG9yKGZhbHNlKS5nZXRUaXRsZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlJRWRpdG9yUmVmZXJlbmNlIHJlZiA9IChJRWRpdG9yUmVmZXJlbmNlKSBlbGVtZW50OwotCQkJCXJldHVybiByZWYuZ2V0RWRpdG9yKGZhbHNlKS5nZXRUaXRsZUltYWdlKCk7Ci0JCQl9Ci0JCX0pOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0SW5wdXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRGaWx0ZXIobmV3IFZpZXdlckZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFZGl0b3JSZWZlcmVuY2UpIHsKLQkJCQkJaWYgKCgoSUVkaXRvclJlZmVyZW5jZSllbGVtZW50KS5pc0RpcnR5KCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9KTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKHRydWUpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25Db250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpKTsKLQkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5ERUZBVUxULCBTV1QuQkVHSU5OSU5HLAotCQkJCWZhbHNlLCB0cnVlKSk7Ci0KLQkJc2VsZWN0QWxsID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX1NlbGVjdEFsbEJ1dHRvbkxhYmVsKTsKLQkJc2VsZWN0QWxsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCBmYWxzZSwKLQkJCQl0cnVlKSk7Ci0KLQkJZGVzZWxlY3RBbGwgPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOwotCQlkZXNlbGVjdEFsbAotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsKTsKLQkJZGVzZWxlY3RBbGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIGZhbHNlLAotCQkJCXRydWUpKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaCAoKSB7Ci0JCWlmIChjdHJsX2Noa2JveFRhYmxlVmlld2VyICE9IG51bGwpIHsKLQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJaWYgKGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpICE9IG51bGwpIHsKLQkJCQkJaWYgKGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRDb250cm9sKCkgIT0gbnVsbCkKLQkJCQkJCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXNlbGVjdEFsbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCWRlc2VsZWN0QWxsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRXaXphcmQoKSAhPSBudWxsKSB7Ci0JCQlJV2l6YXJkQ29udGFpbmVyIGNvbnRhaW5lciA9IGdldFdpemFyZCgpLmdldENvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFdpemFyZERpYWxvZykgewotCQkJCSgoV2l6YXJkRGlhbG9nKWNvbnRhaW5lcikuYWRkUGFnZUNoYW5nZWRMaXN0ZW5lcihuZXcgSVBhZ2VDaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHBhZ2VDaGFuZ2VkKFBhZ2VDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCXJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JCXNlbGVjdEFsbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCi0JCX0pOwotCi0JCWRlc2VsZWN0QWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQoZmFsc2UpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCi0JCX0pOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSBvdXIgc2F2ZSAoYW5kIHBvc3NpYmx5IGNsb3NlKSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCU9iamVjdFtdIGNoZWNrZWRBcnJheSA9IGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tlZEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCS5nZXRBY3RpdmVQYWdlKCkuc2F2ZUVkaXRvcigKLQkJCQkJCQkoKElFZGl0b3JSZWZlcmVuY2UpIGNoZWNrZWRBcnJheVtpXSkKLQkJCQkJCQkJCS5nZXRFZGl0b3IoZmFsc2UpLCBmYWxzZSk7Ci0JCX0KLQkJaWYgKGRvQ2xvc2UpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCS5nZXRBY3RpdmVQYWdlKCkuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKTsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0TmV4dFBhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja2VkIHdoZXRoZXIgdGhlcmUgaXMgYW55IHVuc2F2ZWQgZWRpdG9yIG9wZW4KLQkgKiAKLQkgKiBAcGFyYW0gZG9DbG9zZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhbiB1bnNhdmVkIGVkaXRvciBvcGVuCi0JICogCXRydWUgaWYgZG9DbG9zZSBpcyB0cnVlIGFuZCB0aGVyZSBpcyBhbiBvcGVuIGVkaXRvcgotCSAqICBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVW5zYXZlZEVkaXRvcihib29sZWFuIGRvQ2xvc2UpIHsKLQkJYm9vbGVhbiBhbkVkaXRvcklzRGlydHkgPSBmYWxzZTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGxpc3QgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxpc3RbaV0uaXNEaXJ0eSgpKSB7Ci0JCQkJYW5FZGl0b3JJc0RpcnR5ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKGFuRWRpdG9ySXNEaXJ0eSB8fCBkb0Nsb3NlICYmIGxpc3QubGVuZ3RoID4gMCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gIWlzVW5zYXZlZEVkaXRvcihkb0Nsb3NlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25DaG9pY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25DaG9pY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVkNTNhMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uQ2hvaWNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLS8qKgotICogSXQgc3RvcmVzIGFuZCBtYW5hZ2VzIGFsbCBjaG9pY2VzIGZvciBzeW5jaHJvbml6YXRpb24KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uQ2hvaWNlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGludCBTWU5DX05PTkUgPSAwOwotCXB1YmxpYyBzdGF0aWMgaW50IFNZTkNfRlJPTV9DT05FVE5UID0gMTsKLQlwdWJsaWMgc3RhdGljIGludCBTWU5DX0ZST01fUFJPQ0VTUyA9IDI7Ci0JCi0JcHJpdmF0ZSBQcm9jZXNzIHNlbGVjdGVkUHJvY2VzczsKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gc2VsZWN0ZWRDb25maWc7Ci0JcHJpdmF0ZSBpbnQgc3luY05hbWU9IFNZTkNfRlJPTV9DT05FVE5UOwotCXByaXZhdGUgaW50IHN5bmNQcmVzTmFtZT0gU1lOQ19GUk9NX0NPTkVUTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY0JyaWVmRGVzYz0gU1lOQ19GUk9NX0NPTkVUTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY09wdElucHV0PSBTWU5DX0ZST01fQ09ORVROVDsKLQlwcml2YXRlIGludCBzeW5jTWFuSW5wdXQ9IFNZTkNfRlJPTV9DT05FVE5UOwotCXByaXZhdGUgaW50IHN5bmNPdXRwdXQ9IFNZTkNfRlJPTV9DT05FVE5UOwotCXByaXZhdGUgaW50IHN5bmNQcmltUGVyZm9ybWVyPSBTWU5DX0ZST01fQ09ORVROVDsKLQlwcml2YXRlIGludCBzeW5jQWRkblBlcmZvcm1lcj0gU1lOQ19GUk9NX0NPTkVUTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY1Jlc3BSb2xlPSBTWU5DX0ZST01fQ09ORVROVDsKLQlwcml2YXRlIGludCBzeW5jQ29udEFydGlmYWN0PSBTWU5DX0ZST01fQ09ORVROVDsKLQlwcml2YXRlIGludCBzeW5jRGVsaXZQYXJ0PSBTWU5DX0ZST01fQ09ORVROVDsKLQlwcml2YXRlIGludCBzeW5jU2VsU3RlcD0gU1lOQ19GUk9NX0NPTkVUTlQ7Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGaW5pc2hQcmVzc2VkOwotCi0JLyoqCi0JICogR2V0IHNlbGVjdGVkIHByb2Nlc3MKLQkgKi8KLQlwdWJsaWMgUHJvY2VzcyBnZXRTZWxlY3RlZFByb2Nlc3MoKSB7Ci0JCXJldHVybiBzZWxlY3RlZFByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0IHNlbGVjdGVkIHByb2Nlc3MKLQkgKiBAcGFyYW0gc2VsZWN0ZWRQcm9jZXNzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRQcm9jZXNzKFByb2Nlc3Mgc2VsZWN0ZWRQcm9jZXNzKSB7Ci0JCXRoaXMuc2VsZWN0ZWRQcm9jZXNzID0gc2VsZWN0ZWRQcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIEdldCBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldFNlbGVjdGVkQ29uZmlnKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRDb25maWc7Ci0JfQotCi0JLyoqCi0JICogU2V0IHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHNlbGVjdGVkQ29uZmlnCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRDb25maWcoTWV0aG9kQ29uZmlndXJhdGlvbiBzZWxlY3RlZENvbmZpZykgewotCQl0aGlzLnNlbGVjdGVkQ29uZmlnID0gc2VsZWN0ZWRDb25maWc7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIGNvbnRhaW5lZCBhcnRpZmFjdHMKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNDb250QXJ0aWZhY3QoKSB7Ci0JCXJldHVybiBzeW5jQ29udEFydGlmYWN0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgY29udGFpbmVkIGFydGlmYWN0cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNDb250QXJ0aWZhY3QoaW50IHN5bmNDb250QXJ0aWZhY3QpIHsKLQkJdGhpcy5zeW5jQ29udEFydGlmYWN0ID0gc3luY0NvbnRBcnRpZmFjdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgZGVsaXZlcmFibGUgcGFydHMKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNEZWxpdlBhcnQoKSB7Ci0JCXJldHVybiBzeW5jRGVsaXZQYXJ0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgZGVsaXZlcmFibGUgcGFydHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jRGVsaXZQYXJ0KGludCBzeW5jRGVsaXZQYXJ0KSB7Ci0JCXRoaXMuc3luY0RlbGl2UGFydCA9IHN5bmNEZWxpdlBhcnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIG1hbmRhdG9yeSBpbnB1dAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY01hbklucHV0KCkgewotCQlyZXR1cm4gc3luY01hbklucHV0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgbWFuZGF0b3J5IGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY01hbklucHV0KGludCBzeW5jTWFuSW5wdXQpIHsKLQkJdGhpcy5zeW5jTWFuSW5wdXQgPSBzeW5jTWFuSW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIG9wdGlvbmFsIGlucHV0Ci0JICovCi0JcHVibGljIGludCBnZXRTeW5jT3B0SW5wdXQoKSB7Ci0JCXJldHVybiBzeW5jT3B0SW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBmb3Igc3luY2hyb25pemluZyBvcHRpb25hbCBpbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNPcHRJbnB1dChpbnQgc3luY09wdElucHV0KSB7Ci0JCXRoaXMuc3luY09wdElucHV0ID0gc3luY09wdElucHV0OwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBvdXRwdXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNPdXRwdXQoKSB7Ci0JCXJldHVybiBzeW5jT3V0cHV0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgb3V0cHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY091dHB1dChpbnQgc3luY091dHB1dCkgewotCQl0aGlzLnN5bmNPdXRwdXQgPSBzeW5jT3V0cHV0OwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBwcmVzZW50YXRpb24gbmFtZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY1ByZXNOYW1lKCkgewotCQlyZXR1cm4gc3luY1ByZXNOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgcHJlc2V0bmF0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jUHJlc05hbWUoaW50IHN5bmNQcmVzTmFtZSkgewotCQl0aGlzLnN5bmNQcmVzTmFtZSA9IHN5bmNQcmVzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgcmVzcG9uc2libGUgcm9sZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY1Jlc3BSb2xlKCkgewotCQlyZXR1cm4gc3luY1Jlc3BSb2xlOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgcmVzcG9uc2libGUgcm9sZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNSZXNwUm9sZShpbnQgc3luY1Jlc3BSb2xlKSB7Ci0JCXRoaXMuc3luY1Jlc3BSb2xlID0gc3luY1Jlc3BSb2xlOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBzdGVwcwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY1NlbFN0ZXAoKSB7Ci0JCXJldHVybiBzeW5jU2VsU3RlcDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIHN0ZXBzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY1NlbFN0ZXAoaW50IHN5bmNTZWxTdGVwKSB7Ci0JCXRoaXMuc3luY1NlbFN0ZXAgPSBzeW5jU2VsU3RlcDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGJvb2xlYW4gdmFsdWUgYmFzZWQgb24gd2l6YXJkIGlzIGNvbXBsZXRlZCBvciBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaFByZXNzZWQoKSB7Ci0JCXJldHVybiBpc0ZpbmlzaFByZXNzZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBiYXNlZCBvbiB3aXphcmQgaW4gY29tcGxldGVkIG9yIG5vdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaFByZXNzZWQoYm9vbGVhbiBpc0ZpbmlzaFByZXNzZWQpIHsKLQkJdGhpcy5pc0ZpbmlzaFByZXNzZWQgPSBpc0ZpbmlzaFByZXNzZWQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIGFkZGl0aW9uYWwgcGVyZm9ybWVyCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jQWRkblBlcmZvcm1lcigpIHsKLQkJcmV0dXJuIHN5bmNBZGRuUGVyZm9ybWVyOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgYWRkaXRpb25hbCBwZXJmb3JtZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jQWRkblBlcmZvcm1lcihpbnQgc3luY0FkZG5QZXJmb3JtZXIpIHsKLQkJdGhpcy5zeW5jQWRkblBlcmZvcm1lciA9IHN5bmNBZGRuUGVyZm9ybWVyOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBwcmltYXJ5IHBlcmZvcm1lcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY1ByaW1QZXJmb3JtZXIoKSB7Ci0JCXJldHVybiBzeW5jUHJpbVBlcmZvcm1lcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIHByaW1hcnkgcGVyZm9ybWVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY1ByaW1QZXJmb3JtZXIoaW50IHN5bmNQcmltUGVyZm9ybWVyKSB7Ci0JCXRoaXMuc3luY1ByaW1QZXJmb3JtZXIgPSBzeW5jUHJpbVBlcmZvcm1lcjsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyBhbGwgc3luY2hyb25pemF0aW9uIG9wdGlvbnMvY2hvaWNlcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQotCQlTdHJpbmdCdWZmZXIgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2J1Zi5hcHBlbmQoIltQcm9jZXNzOiIgKyAoKHNlbGVjdGVkUHJvY2VzcyAhPSBudWxsKT9zZWxlY3RlZFByb2Nlc3MuZ2V0TmFtZSgpOiJudWxsIikgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlzYnVmLmFwcGVuZCgiQ29uZmlndXJhdGlvbjoiICsgKChzZWxlY3RlZENvbmZpZyAhPSBudWxsKT9zZWxlY3RlZENvbmZpZy5nZXROYW1lKCk6Im51bGwiKSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXNidWYuYXBwZW5kKCJOYW1lOiIgKyBzeW5jTmFtZSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiUHJlc05hbWU6IiArIHN5bmNQcmVzTmFtZSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiQnJlaWZEZXNjOiIgKyBzeW5jQnJpZWZEZXNjICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJPcHRJbnB1dDoiICsgc3luY09wdElucHV0ICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJNYW5JbnB1dDoiICsgc3luY01hbklucHV0ICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJPdXRwdXQ6IiArIHN5bmNPdXRwdXQgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIlByaW1QZXJmb3JtZXI6IiArIHN5bmNQcmltUGVyZm9ybWVyICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJBZGRuUGVyZm9ybWVyczoiICsgc3luY0FkZG5QZXJmb3JtZXIgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIlJlc3BSb2xlOiIgKyBzeW5jUmVzcFJvbGUgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIkNvbnRBcnRpZmFjdDoiICsgc3luY0NvbnRBcnRpZmFjdCArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiRGVsaXZQYXJ0OiIgKyBzeW5jRGVsaXZQYXJ0ICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJTZWxTdGVwOiIgKyBzeW5jU2VsU3RlcCArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXJldHVybiBzYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIGJyaWVmIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jQnJpZWZEZXNjKCkgewotCQlyZXR1cm4gc3luY0JyaWVmRGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIGJyaWVmIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY0JyaWVmRGVzYyhpbnQgc3luY0JyaWVmRGVzYykgewotCQl0aGlzLnN5bmNCcmllZkRlc2MgPSBzeW5jQnJpZWZEZXNjOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBuYW1lCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jTmFtZSgpIHsKLQkJcmV0dXJuIHN5bmNOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNOYW1lKGludCBzeW5jTmFtZSkgewotCQl0aGlzLnN5bmNOYW1lID0gc3luY05hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uRGVzY3JpcHRpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDg4YzRjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhlIHdpemFyZCBwYWdlIHdoaWNoIGRlc2NyaWJlcyBjdXN0b20gc3luY2hyb25pemF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY0Nob2ljZXMgPSBudWxsOwotCQotCXByaXZhdGUgVGV4dCBjdHJsX2V4cGxhaW5UZXh0OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0JCQlTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlKTsgCi0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfdGV4dCk7IAotCQl0aGlzLnN5bmNDaG9pY2VzID0gY2hvaWNlczsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB3aWRnZXRzLgotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQkKLQkJU3RyaW5nIGV4cGxhaW5UZXh0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dDsgCi0JCWN0cmxfZXhwbGFpblRleHQgPSBjcmVhdGVUZXh0TXVsdGkoY29tcG9zaXRlLCAiICIsIDQwMCwgMjQwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2V4cGxhaW5UZXh0LnNldFRleHQoZXhwbGFpblRleHQpOwotCQkKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25PcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NWE0MGVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLS8qKgotICogUnVucyBzeW5jaG9uaXphdGlvbiBvcGVyYXRpb24KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uT3BlcmF0aW9uIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQotCXByaXZhdGUgU3luY2hyb25pemF0aW9uQ2hvaWNlcyBzeW5jaENob2ljZXM7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiAJCQlMaXN0IG9mIGVsZW1lbnRzIHRvIGJlIHN5bmNocm9uaXplZAotCSAqIEBwYXJhbSBjaG9pY2VzCi0JICogCQkJU3luY2hyb25pemF0aW9uIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemF0aW9uT3BlcmF0aW9uKENvbGxlY3Rpb24gZWxlbWVudHMsIFN5bmNocm9uaXphdGlvbkNob2ljZXMgY2hvaWNlcykgewotCQl0aGlzLnN5bmNoQ2hvaWNlcyA9IGNob2ljZXM7Ci0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCB3b2tlIHVwIGFmdGVyIDEgc2Vjb25kIHNsZWVwLCAjIiArIChpKzEpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uUHJldmlld1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblByZXZpZXdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjYzhjZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uUHJldmlld1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhlIHdpemFyZCBwYWdlIHdoaWNoIGxldHMgeW91IHByZXZpZXcgZWxlbWVudHMgdG8gYmUgc3luY2hvbml6ZWQKLSAqIGFuZCBhbHNvIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgU3luY2hyb25pemF0aW9uQ2hvaWNlcyBzeW5jQ2hvaWNlcyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBUZXh0IGN0cmxfcHJldmlld1RleHQ7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemF0aW9uUHJldmlld1BhZ2UoU3RyaW5nIHBhZ2VOYW1lLAotCQkJU3luY2hyb25pemF0aW9uQ2hvaWNlcyBjaG9pY2VzKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RpdGxlKTsgCi0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90ZXh0KTsgCi0JCXRoaXMuc3luY0Nob2ljZXMgPSBjaG9pY2VzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIHRvIGhvbGQgdGhlIHdpZGdldHMuCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCQotCQlTdHJpbmcgZXhwbGFpblRleHQgPSAiUHJldmlldyB0ZXh0IGNvbWluZyBoZXJlLlxuXG4iICsJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkiXHRUaGlzIGhhcyB0byBiZSBjb21pbmcgZnJvbSBzb21lIHVuZGVybHlpbiBBUEkgY2FsbC4gVGhpcyBtYXkgYmUgY3V0IG9mZiBpZiB0aGVyZSBpcyBub3QgZW5vdWcgdGltZS4iOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcHJldmlld1RleHQgPSBjcmVhdGVUZXh0TXVsdGkoY29tcG9zaXRlLCAiICIsIDQwMCwgMjQwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3ByZXZpZXdUZXh0LnNldFRleHQoZXhwbGFpblRleHQpOwotCQkKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uU2VsZWN0Q29uZmlnUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uU2VsZWN0Q29uZmlnUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYTEzOGEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblNlbGVjdENvbmZpZ1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgd2l6YXJkIHBhZ2Ugd2hpY2ggbGV0IHVzZXIgc2VsZWN0IG1ldGhvZCBjb25maWd1cmF0aW9uIGR1cmluZwotICogc3luY2hyb25pemF0aW9uCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvblNlbGVjdENvbmZpZ1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25DaG9pY2VzIHN5bmNDaG9pY2VzID0gbnVsbDsKLQkKLQlwcml2YXRlIENvbWJvVmlld2VyIGNvbmZpZ0NvbWJvVmlld2VyOwotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbltdIHZhbGlkQ29uZmlndXJhdGlvbnM7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemF0aW9uU2VsZWN0Q29uZmlnUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0JCQlTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZSk7IAotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0KTsgCi0JCXRoaXMuc3luY0Nob2ljZXMgPSBjaG9pY2VzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIHRvIGhvbGQgdGhlIHdpZGdldHMuCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQl7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJfQotCQkKLQkJLy8gYWRkIGFuIGVtcHR5IGxpbmUKLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiICIsIDIpOyAvLyROT04tTkxTLTEkCi0JCQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX2NvbmZpZ0xhYmVsKTsgCi0JCQotCQljb25maWdDb21ib1ZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJY29uZmlnQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKAotCQkJCW5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWNvbmZpZ0NvbWJvVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQotCQkvLyBnZXQgYWxsIHZhbGlkIGNvbmZpZ3VyYXRpb25zLCBhbmQgZGVmYXVsdCBvbmUsIGFuZCBzZWxlY3QgYW5kIHNob3cgdGhlIGRlZmF1bHQgb25lCi0JCVByb2Nlc3Mgc2VsZWN0ZWRQcm9jZXNzID0gc3luY0Nob2ljZXMuZ2V0U2VsZWN0ZWRQcm9jZXNzKCk7Ci0JCXZhbGlkQ29uZmlndXJhdGlvbnMgPSAoTWV0aG9kQ29uZmlndXJhdGlvbltdKXNlbGVjdGVkUHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKS50b0FycmF5KCk7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyLmFkZCh2YWxpZENvbmZpZ3VyYXRpb25zKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnID0gc2VsZWN0ZWRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCXN5bmNDaG9pY2VzLnNldFNlbGVjdGVkQ29uZmlnKGRlZmF1bHRDb25maWcpOwotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGRlZmF1bHRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihkZWZhdWx0Q29uZmlnKTsKLQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKGRlZmF1bHRTZWxlY3Rpb24sIHRydWUpOwotCQkKLQkJYWRkTGlzdGVuZXJzKGNvbXBvc2l0ZSk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGluaXQgY29uZmlnID0iICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXJzIGZvciB0aGUgY29udHJvbHMgb24gdGhpcyBwYWdlLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQljb25maWdDb21ib1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gY29uZmlnID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCXN5bmNDaG9pY2VzLnNldFNlbGVjdGVkQ29uZmlnKChNZXRob2RDb25maWd1cmF0aW9uKWNvbmZpZ1swXSk7Ci0JCX0gCi0JCQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGNvbmZpZyA9IiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uU2VsZWN0RGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2IxNzc1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGUgd2l6YXJkIHBhZ2Ugd2hpY2ggbGV0IHVzZXIgc2VsZWN0IHByb3BlcnRpZXMgb2YgbWV0aG9kIGNvbnRlbnQgdG8gCi0gKiBiZSBjb25zaWRlcmVkIGZvciBzeW5jaG9uaXphdGlvbi4gCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvblNlbGVjdERldGFpbHNQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY0Nob2ljZXMgPSBudWxsOwotCQotCXByaXZhdGUgQnV0dG9uIGJjX25hbWU7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfcHJlc05hbWU7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfYnJpZWZEZXNjOwotCXByaXZhdGUgQnV0dG9uIGJjX29wdElucHV0OwotCXByaXZhdGUgQnV0dG9uIGJjX21hbklucHV0OwotCXByaXZhdGUgQnV0dG9uIGJjX291dHB1dDsKLQlwcml2YXRlIEJ1dHRvbiBiY19wcmltUGVyZm9ybWVyOwotCXByaXZhdGUgQnV0dG9uIGJjX2FkZG5QZXJmb3JtZXI7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfcmVzcFJvbGU7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfY29udEFydGlmYWN0OwotCXByaXZhdGUgQnV0dG9uIGJjX2RlbGl2UGFydDsKLQlwcml2YXRlIEJ1dHRvbiBiY19zZWxTdGVwOwotCQotLy8JcHJpdmF0ZSBCdXR0b25bXSBicl9wcmVzTmFtZSA9IG5ldyBCdXR0b25bMl07Ci0vLwlwcml2YXRlIEJ1dHRvbltdIGJyX29wdElucHV0ID0gbmV3IEJ1dHRvblsyXTsKLS8vCXByaXZhdGUgQnV0dG9uW10gYnJfbWFuSW5wdXQgPSBuZXcgQnV0dG9uWzJdOwotLy8JcHJpdmF0ZSBCdXR0b25bXSBicl9vdXRwdXQgPSBuZXcgQnV0dG9uWzJdOwotLy8JcHJpdmF0ZSBCdXR0b25bXSBicl9yZXNwUm9sZSA9IG5ldyBCdXR0b25bMl07Ci0vLwlwcml2YXRlIEJ1dHRvbltdIGJyX2NvbnRBcnRpZmFjdCA9IG5ldyBCdXR0b25bMl07Ci0vLwlwcml2YXRlIEJ1dHRvbltdIGJyX2RlbGl2UGFydCA9IG5ldyBCdXR0b25bMl07Ci0vLwlwcml2YXRlIEJ1dHRvbltdIGJyX3NlbFN0ZXAgPSBuZXcgQnV0dG9uWzJdOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXphdGlvblNlbGVjdERldGFpbHNQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCVN5bmNocm9uaXphdGlvbkNob2ljZXMgY2hvaWNlcykgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90aXRsZSk7IAotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGV4dCk7IAotCQl0aGlzLnN5bmNDaG9pY2VzID0gY2hvaWNlczsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB3aWRnZXRzLgotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJewotLy8JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQl9Ci0JCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Byb3BlcnRpZXNfbGFibGUpOyAKLS8vCQljcmVhdGVMYWJlbChjb21wb3NpdGUsICJDb25ldG50IFRvIFByb2Nlc3MgICIpOwotLy8JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIiAgUHJvY2VzcyBUbyBDb250ZW50Iik7Ci0JCQotCQliY19uYW1lID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbmFtZV9sYWJsZSk7IAotCQkKLQkJYmNfcHJlc05hbWUgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmVzZW50YXRpb25OYW1lX2xhYmxlKTsgCi0vLwkJY3JlYXRlVHdvUmFkaW9Hcm91cChjb21wb3NpdGUsIGJyX3ByZXNOYW1lKTsKLQkJCi0JCWJjX2JyaWVmRGVzYyA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2JyaWVmRGVzY19sYWJsZSk7IAotCQkKLQkJYmNfb3B0SW5wdXQgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vcHRpb25hbElub3V0c19sYWJlbCk7IAotLy8JCWNyZWF0ZVR3b1JhZGlvR3JvdXAoY29tcG9zaXRlLCBicl9vcHRJbnB1dCk7Ci0JCQotCQliY19tYW5JbnB1dCA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX21hbmRhdG9yeUlucHV0c19sYWJsZSk7IAotLy8JCWNyZWF0ZVR3b1JhZGlvR3JvdXAoY29tcG9zaXRlLCBicl9tYW5JbnB1dCk7Ci0JCQotCQliY19vdXRwdXQgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vdXRwdXRzX2xhYmVsKTsgCi0vLwkJY3JlYXRlVHdvUmFkaW9Hcm91cChjb21wb3NpdGUsIGJyX291dHB1dCk7Ci0JCQotCQliY19wcmltUGVyZm9ybWVyID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9sYWJlbCk7IAotCQliY19hZGRuUGVyZm9ybWVyID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYWRkblBlcmZvcm1lcnNfbGFibGUpOyAKLQkJCi0JCWJjX3Jlc3BSb2xlID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcmVzcG9uc2libGVSb2xlc19sYWJsZSk7IAotLy8JCWNyZWF0ZVR3b1JhZGlvR3JvdXAoY29tcG9zaXRlLCBicl9yZXNwUm9sZSk7Ci0JCQotCQliY19jb250QXJ0aWZhY3QgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9jb250bkFydGlmYWN0c19sYWJlbCk7IAotLy8JCWNyZWF0ZVR3b1JhZGlvR3JvdXAoY29tcG9zaXRlLCBicl9jb250QXJ0aWZhY3QpOwotCQkKLQkJYmNfZGVsaXZQYXJ0ID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfZGlsdmVkUGFydHNfbGFiZWwpOyAKLS8vCQljcmVhdGVUd29SYWRpb0dyb3VwKGNvbXBvc2l0ZSwgYnJfZGVsaXZQYXJ0KTsKLQkJCi0JCWJjX3NlbFN0ZXAgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxTdGVwc19sYWJlbCk7IAotLy8JCWNyZWF0ZVR3b1JhZGlvR3JvdXAoY29tcG9zaXRlLCBicl9zZWxTdGVwKTsKLQkJCi0JCWFkZExpc3RlbmVycyhjb21wb3NpdGUpOwotCQlzZXRBbGxDaGVja2VkKCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGluaXQgZGV0YWlsID0iICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRBbGxDaGVja2VkKCkgewotCQliY19uYW1lLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfcHJlc05hbWUuc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19icmllZkRlc2Muc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19vcHRJbnB1dC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX21hbklucHV0LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfb3V0cHV0LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfcHJpbVBlcmZvcm1lci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX2FkZG5QZXJmb3JtZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19yZXNwUm9sZS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX2NvbnRBcnRpZmFjdC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX2RlbGl2UGFydC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX3NlbFN0ZXAuc2V0U2VsZWN0aW9uKHRydWUpOwkKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXJzIGZvciB0aGUgY29udHJvbHMgb24gdGhpcyBwYWdlLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQliY19uYW1lLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX25hbWUuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNOYW1lKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNOYW1lKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJYmNfcHJlc05hbWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfcHJlc05hbWUuZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJCQlicl9wcmVzTmFtZVswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX3ByZXNOYW1lWzFdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJaWYgKGJyX3ByZXNOYW1lWzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1ByZXNOYW1lKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1ByZXNOYW1lKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotCQkJCX0gZWxzZSB7Ci0vLwkJCQkJYnJfcHJlc05hbWVbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCQkJYnJfcHJlc05hbWVbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNQcmVzTmFtZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgIiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCWJjX2JyaWVmRGVzYy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19icmllZkRlc2MuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNCcmllZkRlc2MoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0JyaWVmRGVzYyhTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCWJjX29wdElucHV0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX29wdElucHV0LmdldFNlbGVjdGlvbigpKSB7Ci0vLwkJCQkJYnJfb3B0SW5wdXRbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlicl9vcHRJbnB1dFsxXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWlmIChicl9vcHRJbnB1dFswXS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNPcHRJbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQkJCQllbHNlCi0vLwkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNPcHRJbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLQkJCQl9IGVsc2UgewotLy8JCQkJCWJyX29wdElucHV0WzBdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQkJCWJyX29wdElucHV0WzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jT3B0SW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYmNfbWFuSW5wdXQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfbWFuSW5wdXQuZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJCQlicl9tYW5JbnB1dFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX21hbklucHV0WzFdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJaWYgKGJyX21hbklucHV0WzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY01hbklucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY01hbklucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCQkJCQotCQkJCX0gZWxzZSB7Ci0vLwkJCQkJYnJfbWFuSW5wdXRbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCQkJYnJfbWFuSW5wdXRbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNNYW5JbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgIiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQliY19vdXRwdXQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfb3V0cHV0LmdldFNlbGVjdGlvbigpKSB7Ci0vLwkJCQkJYnJfb3V0cHV0WzBdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJYnJfb3V0cHV0WzFdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJaWYgKGJyX291dHB1dFswXS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNPdXRwdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJCQkJZWxzZQotLy8JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jT3V0cHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotCQkJCX0gZWxzZSB7Ci0vLwkJCQkJYnJfb3V0cHV0WzBdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQkJCWJyX291dHB1dFsxXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY091dHB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgIiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQliY19wcmltUGVyZm9ybWVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX3ByaW1QZXJmb3JtZXIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1ByaW1QZXJmb3JtZXIoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1ByaW1QZXJmb3JtZXIoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYmNfYWRkblBlcmZvcm1lci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQlpZiAoYmNfYWRkblBlcmZvcm1lci5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0FkZG5QZXJmb3JtZXIoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQWRkblBlcmZvcm1lcihTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJCX0KLQkJCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCX0KLQkJfSk7Ci0JCQotCQliY19yZXNwUm9sZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19yZXNwUm9sZS5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX3Jlc3BSb2xlWzBdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJYnJfcmVzcFJvbGVbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfcmVzcFJvbGVbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUmVzcFJvbGUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJCQkJZWxzZQotLy8JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUmVzcFJvbGUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9yZXNwUm9sZVswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9yZXNwUm9sZVsxXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1Jlc3BSb2xlKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWJjX2NvbnRBcnRpZmFjdC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19jb250QXJ0aWZhY3QuZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJCQlicl9jb250QXJ0aWZhY3RbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlicl9jb250QXJ0aWZhY3RbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfY29udEFydGlmYWN0WzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0NvbnRBcnRpZmFjdChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQkJCQllbHNlCi0vLwkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNDb250QXJ0aWZhY3QoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9jb250QXJ0aWZhY3RbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCQkJYnJfY29udEFydGlmYWN0WzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQ29udEFydGlmYWN0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWJjX2RlbGl2UGFydC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19kZWxpdlBhcnQuZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJCQlicl9kZWxpdlBhcnRbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlicl9kZWxpdlBhcnRbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfZGVsaXZQYXJ0WzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0RlbGl2UGFydChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQkJCQllbHNlCi0vLwkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNEZWxpdlBhcnQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9kZWxpdlBhcnRbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCQkJYnJfZGVsaXZQYXJ0WzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jRGVsaXZQYXJ0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWJjX3NlbFN0ZXAuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfc2VsU3RlcC5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX3NlbFN0ZXBbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlicl9zZWxTdGVwWzFdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJaWYgKGJyX3NlbFN0ZXBbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jU2VsU3RlcChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQkJCQllbHNlCi0vLwkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNTZWxTdGVwKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotCQkJCX0gZWxzZSB7Ci0vLwkJCQkJYnJfc2VsU3RlcFswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9zZWxTdGVwWzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jU2VsU3RlcChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgIiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLS8vCQlicl9wcmVzTmFtZVswXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9vcHRJbnB1dFswXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9tYW5JbnB1dFswXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9vdXRwdXRbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfcmVzcFJvbGVbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfY29udEFydGlmYWN0WzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX2RlbGl2UGFydFswXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9zZWxTdGVwWzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCQotLy8JCWJyX3ByZXNOYW1lWzFdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX29wdElucHV0WzFdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX21hbklucHV0WzFdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX291dHB1dFsxXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9yZXNwUm9sZVsxXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9jb250QXJ0aWZhY3RbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfZGVsaXZQYXJ0WzFdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX3NlbFN0ZXBbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCi0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9wcmVzTmFtZVswXSAmJiBicl9wcmVzTmFtZVswXS5nZXRTZWxlY3Rpb24oKSkgeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY1ByZXNOYW1lKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX29wdElucHV0WzBdICYmIGJyX29wdElucHV0WzBdLmdldFNlbGVjdGlvbigpKSB7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jT3B0SW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfbWFuSW5wdXRbMF0gJiYgYnJfbWFuSW5wdXRbMF0uZ2V0U2VsZWN0aW9uKCkpIHsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNNYW5JbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9vdXRwdXRbMF0gJiYgYnJfb3V0cHV0WzBdLmdldFNlbGVjdGlvbigpKSB7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jT3V0cHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX3Jlc3BSb2xlWzBdICYmIGJyX3Jlc3BSb2xlWzBdLmdldFNlbGVjdGlvbigpKSB7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUmVzcFJvbGUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfY29udEFydGlmYWN0WzBdICYmIGJyX2NvbnRBcnRpZmFjdFswXS5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQ29udEFydGlmYWN0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX2RlbGl2UGFydFswXSAmJiBicl9kZWxpdlBhcnRbMF0uZ2V0U2VsZWN0aW9uKCkpIHsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNEZWxpdlBhcnQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfc2VsU3RlcFswXSAmJiBicl9zZWxTdGVwWzBdLmdldFNlbGVjdGlvbigpKXsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNTZWxTdGVwKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCX0KLS8vCi0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9wcmVzTmFtZVsxXSAmJiBicl9wcmVzTmFtZVsxXS5nZXRTZWxlY3Rpb24oKSl7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJlc05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfb3B0SW5wdXRbMV0gJiYgYnJfb3B0SW5wdXRbMV0uZ2V0U2VsZWN0aW9uKCkpeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY09wdElucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX21hbklucHV0WzFdICYmIGJyX21hbklucHV0WzFdLmdldFNlbGVjdGlvbigpKXsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNNYW5JbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9vdXRwdXRbMV0gJiYgYnJfb3V0cHV0WzFdLmdldFNlbGVjdGlvbigpKXsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNPdXRwdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfcmVzcFJvbGVbMV0gJiYgYnJfcmVzcFJvbGVbMV0uZ2V0U2VsZWN0aW9uKCkpeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY1Jlc3BSb2xlKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX2NvbnRBcnRpZmFjdFsxXSAmJiBicl9jb250QXJ0aWZhY3RbMV0uZ2V0U2VsZWN0aW9uKCkpewotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQ29udEFydGlmYWN0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX2RlbGl2UGFydFsxXSAmJiBicl9kZWxpdlBhcnRbMV0uZ2V0U2VsZWN0aW9uKCkpeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY0RlbGl2UGFydChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9zZWxTdGVwWzFdICYmIGJyX3NlbFN0ZXBbMV0uZ2V0U2VsZWN0aW9uKCkpewotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jU2VsU3RlcChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLS8vCQl9Ci0vLy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCWlmIChzeW5jQ2hvaWNlcy5nZXRTeW5jTmFtZSgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY1ByZXNOYW1lKCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jQnJpZWZEZXNjKCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jT3B0SW5wdXQoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNNYW5JbnB1dCgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY091dHB1dCgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY1ByaW1QZXJmb3JtZXIoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNBZGRuUGVyZm9ybWVyKCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jUmVzcFJvbGUoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNDb250QXJ0aWZhY3QoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNEZWxpdlBhcnQoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNTZWxTdGVwKCkgPiAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQl9Ci0JCi0vLwlwcml2YXRlIHZvaWQgY3JlYXRlVHdvUmFkaW9Hcm91cChDb21wb3NpdGUgcGFyZW50LCBCdXR0b25bXSByYnMpIHsKLS8vCQlDb21wb3NpdGUgYUdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLS8vCQkKLS8vCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLS8vCQlhR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0vLwkJCi0vLwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLS8vCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0vLwkJYUdyb3VwLnNldExheW91dERhdGEoZ2QpOwotLy8JCQotLy8JCXJic1swXSA9IGNyZWF0ZVJhZGlvQnV0dG9uKGFHcm91cCwgIiIsIDEsIHRydWUpOyAvLyROT04tTkxTLTEkCi0vLwkJcmJzWzFdID0gY3JlYXRlUmFkaW9CdXR0b24oYUdyb3VwLCAiIiwgMSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0vLwkJCi0vLwkJcmJzWzBdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCXJic1sxXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDIzYzNlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLQotLyoqCi0gKiBUaGUgd2l6YXJkIHRoYXQgZ3VpZGVzIHVzZXIgdG8gZG8gY3VzdG9tIHN5bmNocm9uaXphdGlvbiBmb3IgcHJvY2VzcwotICogZGVzY3JpcHRvcnMgZnJvbSBtZXRob2QgZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UgZGVzY1BhZ2U7Ci0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlIHNlbGVjdENvbmZpZ1BhZ2U7Ci0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZSBzZWxlY3REZXRhaWxzUGFnZTsKLS8vCXByaXZhdGUgU3luY2hyb25pemF0aW9uUHJldmlld1BhZ2UgcHJldmlld1BhZ2U7Ci0JCi0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25DaG9pY2VzIHN5bmNDaG9pY2VzID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25XaXphcmQoU3luY2hyb25pemF0aW9uQ2hvaWNlcyBjaG9pY2VzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3luY0Nob2ljZXMgPSBjaG9pY2VzOwotCQlzZXRXaW5kb3dUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfdGl0bGVfdGV4dCk7IAotCX0KLQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL3dpemJhbi9zeW5jaHJvbml6YXRpb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCQlkZXNjUGFnZSA9IG5ldyBTeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UoCi0JCQkJIlN5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZSIsIHN5bmNDaG9pY2VzKTsgLy8kTk9OLU5MUy0xJAotCQlkZXNjUGFnZS5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yKTsKLQkJYWRkUGFnZShkZXNjUGFnZSk7Ci0KLQkJc2VsZWN0Q29uZmlnUGFnZSA9IG5ldyBTeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlKAotCQkJCSJTeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlIiwgc3luY0Nob2ljZXMpOyAvLyROT04tTkxTLTEkCi0JCXNlbGVjdENvbmZpZ1BhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcik7Ci0JCWFkZFBhZ2Uoc2VsZWN0Q29uZmlnUGFnZSk7Ci0JCQotCQlzZWxlY3REZXRhaWxzUGFnZSA9IG5ldyBTeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZSgKLQkJCQkiU3luY2hyb25pemF0aW9uU2VsZWN0RGV0YWlsc1BhZ2UiLCBzeW5jQ2hvaWNlcyk7IC8vJE5PTi1OTFMtMSQKLQkJc2VsZWN0RGV0YWlsc1BhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcik7Ci0JCWFkZFBhZ2Uoc2VsZWN0RGV0YWlsc1BhZ2UpOwotCQkKLS8vCQlwcmV2aWV3UGFnZSA9IG5ldyBTeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZSgKLS8vCQkJCSJTeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZSIsIHN5bmNDaG9pY2VzKTsgLy8kTk9OLU5MUy0xJAotLy8JCXByZXZpZXdQYWdlLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3IpOwotLy8JCWFkZFBhZ2UocHJldmlld1BhZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlyZXR1cm4gKHNlbGVjdERldGFpbHNQYWdlLmlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJc3luY0Nob2ljZXMuc2V0RmluaXNoUHJlc3NlZCh0cnVlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtQ2FuY2VsKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlzeW5jQ2hvaWNlcy5zZXRGaW5pc2hQcmVzc2VkKGZhbHNlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvV2l6YXJkSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9XaXphcmRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjliNjA5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9XaXphcmRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZERlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIElXaXphcmRSZWdpc3RyeSB3aXphcmRSZWdpc3RyeTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVdpemFyZFJlZ2lzdHJ5IGdldFdpemFyZFJlZ2lzdHJ5KCkgewotCQlpZih3aXphcmRSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQl3aXphcmRSZWdpc3RyeSA9IChJV2l6YXJkUmVnaXN0cnkpIEV4dGVuc2lvbk1hbmFnZXIuZ2V0RXh0ZW5zaW9uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAid2l6YXJkUmVnaXN0cnlQcm92aWRlciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHdpemFyZFJlZ2lzdHJ5OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElXb3JrYmVuY2hXaXphcmQgY3JlYXRlTmV3V2l6YXJkKFN0cmluZyBuZXdXaXphcmRJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV2l6YXJkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXROZXdXaXphcmRSZWdpc3RyeSgpLmZpbmRXaXphcmQobmV3V2l6YXJkSWQpOwotCQlpZihkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiBkZXNjcmlwdG9yLmNyZWF0ZVdpemFyZCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWM1NjAwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB3aXphcmRzIGZvciBhdXRob3JpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhNzk3YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllM2E4MTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVuX2xpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlX2VuLmh0bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzVjYTA1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotZmVhdHVyZU5hbWU9RVBGIEJhc2UgRmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1kZXNjcmlwdGlvbj1FUEYgQmFzZSBGZWF0dXJlLgotdXBkYXRlU2l0ZU5hbWU9RVBGIEZlYXR1cmUgVXBkYXRlcwotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLWxpY2Vuc2VVUkw9bGljZW5zZV9lbi5odG1sCi1saWNlbnNlVGV4dD1Vc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgdGVybXMgYW5kIGNvbmRpdGlvbnMgd2hpY2ggZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIFByb2R1Y3Qgd2hpY2ggaW5jbHVkZWQgdGhpcyBmZWF0dXJlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNzBkOGMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYmFzZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYmFzZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2VUZXh0Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRyYXcyZCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmdlZiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZm9ybXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pbnRybyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49ImNvbS5pYm0uaWN1Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuYXBhY2hlLmFudCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJlY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMnhtbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uub3NnaSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmhlbHAuYmFzZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUubHVjZW5lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc2VhcmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lZGl0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24iLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYmFzZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudWkuaW50cm8iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51bWEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvbGljZW5zZV9lbi5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2xpY2Vuc2VfZW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvbGljZW5zZV9lbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxYmUwOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5iYXNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjMDljYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZlYXR1cmVQbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuYmFzZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjOTkwODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0LmluaSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MDRmNGZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWZlYXR1cmVUZXh0Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1hcHBsaWNhdGlvbl8zMi5naWYKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi1hcHBOYW1lPSVmZWF0dXJlTmFtZQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLXdlbGNvbWVQYWdlPSRubCQvd2VsY29tZS54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQubWFwcGluZ3MgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhY2E5NTJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLSMgVXN1YWxseSBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZS4KLQotMD1AYnVpbGRJZEAKLTE9MS4yLjAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTE5ODRhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIEJhc2UKLQotZmVhdHVyZVRleHQ9RVBGIEJhc2VcblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotQnVpbGQgTGFiZWw6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cblwKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2FwcGxpY2F0aW9uXzMyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYXBwbGljYXRpb25fMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYXBwbGljYXRpb25fMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1Y2NlYzUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhcHBsaWNhdGlvbl8zMi5naWYsXAotICAgICAgICAgICAgICAgd2VsY29tZS54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MGU3YWZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLWZlYXR1cmVQbHVnaW5OYW1lPUVQRiBCYXNlIEZlYXR1cmUKLWZlYXR1cmVQbHVnaW5OYW1lTkw9RVBGIEJhc2UgRmVhdHVyZSAoTkwxKQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS93ZWxjb21lLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2Uvd2VsY29tZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI2NDBkMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS93ZWxjb21lLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHdlbGNvbWVQYWdlIAotCXRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIj4KLQotPGludHJvPldlbGNvbWUgdG8gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yawotPC9pbnRybz4KLQotPGl0ZW0+PGI+V2hhdCBpcyBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrPzwvYj4KLQkKLTwvaXRlbT4KLQotPGl0ZW0+PGI+TGVhcm4gTW9yZTwvYj4KLQotPC9pdGVtPgotCi08L3dlbGNvbWVQYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZjlhNDM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4NjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTg2ZTVkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnN3dAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYTFhMDA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzAxNDdjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBXaW4zMiBDb21tb24KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi93aW4zMi9XaW4zMkhUTUxUcmFuc2Zlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi93aW4zMi9XaW4zMkhUTUxUcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MjZkOGQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vd2luMzIvV2luMzJIVE1MVHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5CeXRlQXJyYXlUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLkNPTTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLkZPUk1BVEVUQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLklEYXRhT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuU1RHTUVESVVNOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUzsKLQotLyoqCi0gKiBUaGUgY2xhc3MgPGNvZGU+SFRNTFRyYW5zZmVyPC9jb2RlPiBwcm92aWRlcyBhIHBsYXRmb3JtIHNwZWNpZmljIG1lY2hhbmlzbQotICogZm9yIGNvbnZlcnRpbmcgdGV4dCBpbiBIVE1MIGZvcm1hdCByZXByZXNlbnRlZCBhcyBhIGphdmEgPGNvZGU+U3RyaW5nPC9jb2RlPgotICogdG8gYSBwbGF0Zm9ybSBzcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YSBhbmQgdmljZSB2ZXJzYS4gU2VlCi0gKiA8Y29kZT5UcmFuc2ZlcjwvY29kZT4gZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCi0gKiAKLSAqIDxwPgotICogQW4gZXhhbXBsZSBvZiBhIGphdmEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIEhUTUwgdGV4dCBpcyBzaG93bgotICogYmVsb3c6Ci0gKiA8L3A+Ci0gKiAKLSAqIDxjb2RlPjxwcmU+Ci0gKiAgICAgICBTdHJpbmcgaHRtbERhdGEgPSAmcXVvdDsKLSAqIDxwPgotICogIFRoaXMgaXMgYSBwYXJhZ3JhcGggb2YgdGV4dC4KLSAqIDwvcD4KLSAqICAmcXVvdDs7Ci0gKiA8L2NvZGU+PC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXaW4zMkhUTUxUcmFuc2ZlciBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQotCXN0YXRpYyBXaW4zMkhUTUxUcmFuc2ZlciBfaW5zdGFuY2UgPSBuZXcgV2luMzJIVE1MVHJhbnNmZXIoKTsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9GT1JNQVQgPSAiSFRNTCBGb3JtYXQiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgaW50IEhUTUxfRk9STUFUSUQgPSByZWdpc3RlclR5cGUoSFRNTF9GT1JNQVQpOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOVU1CRVIgPSAiMDAwMDAwMDAiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUiA9ICJWZXJzaW9uOjAuOVxyXG5TdGFydEhUTUw6IiArIE5VTUJFUgotCQkJKyAiXHJcbkVuZEhUTUw6IiArIE5VTUJFUiArICJcclxuU3RhcnRGcmFnbWVudDoiICsgTlVNQkVSCi0JCQkrICJcclxuRW5kRnJhZ21lbnQ6IiArIE5VTUJFUiArICJcclxuIjsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIjxodG1sPjxib2R5PjwhLS1TdGFydEZyYWdtZW50LS0+IjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTVUZGSVggPSAiPCEtLUVuZEZyYWdtZW50LS0+PC9ib2R5PjwvaHRtbD4iOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFN0YXJ0RnJhZ21lbnQgPSAiU3RhcnRGcmFnbWVudDoiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVuZEZyYWdtZW50ID0gIkVuZEZyYWdtZW50OiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBXaW4zMkhUTUxUcmFuc2ZlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEhUTUxUcmFuc2ZlciBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEhUTUxUcmFuc2ZlciBjbGFzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2luMzJIVE1MVHJhbnNmZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5qYXZhVG9OYXRpdmU8L2NvZGU+IGNvbnZlcnRzCi0JICogSFRNTC1mb3JtYXR0ZWQgdGV4dCByZXByZXNlbnRlZCBieSBhIGphdmEgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBhCi0JICogcGxhdGZvcm0gc3BlY2lmaWMgcmVwcmVzZW50YXRpb24uIEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHNlZQotCSAqIDxjb2RlPlRyYW5zZmVyI2phdmFUb05hdGl2ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgYSBqYXZhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyBIVE1MIHRleHQKLQkgKiBAcGFyYW0gdHJhbnNmZXJEYXRhCi0JICogICAgICAgICAgICBhbiBlbXB0eSA8Y29kZT5UcmFuc2ZlckRhdGE8L2NvZGU+IG9iamVjdDsgdGhpcyBvYmplY3Qgd2lsbAotCSAqICAgICAgICAgICAgYmUgZmlsbGVkIGluIG9uIHJldHVybiB3aXRoIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBmb3JtYXQgb2YKLQkgKiAgICAgICAgICAgIHRoZSBkYXRhCi0JICovCi0JcHVibGljIHZvaWQgamF2YVRvTmF0aXZlKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkJaWYgKCFjaGVja0hUTUwob2JqZWN0KSB8fCAhaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyRGF0YSkpIHsKLQkJCURORC5lcnJvcihETkQuRVJST1JfSU5WQUxJRF9EQVRBKTsKLQkJfQotCQlTdHJpbmcgc3RyaW5nID0gKFN0cmluZykgb2JqZWN0OwotCQlpbnQgY291bnQgPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW2NvdW50ICsgMV07Ci0JCXN0cmluZy5nZXRDaGFycygwLCBjb3VudCwgY2hhcnMsIDApOwotCQlpbnQgY29kZVBhZ2UgPSBPUy5HZXRBQ1AoKTsKLQkJaW50IGNjaE11bHRpQnl0ZSA9IE9TLldpZGVDaGFyVG9NdWx0aUJ5dGUoY29kZVBhZ2UsIDAsIGNoYXJzLCAtMSwgbnVsbCwKLQkJCQkwLCBudWxsLCBudWxsKTsKLQkJaWYgKGNjaE11bHRpQnl0ZSA9PSAwKSB7Ci0JCQl0cmFuc2ZlckRhdGEuc3RnbWVkaXVtID0gbmV3IFNUR01FRElVTSgpOwotCQkJdHJhbnNmZXJEYXRhLnJlc3VsdCA9IENPTS5EVl9FX1NUR01FRElVTTsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgc3RhcnRIVE1MID0gSEVBREVSLmxlbmd0aCgpOwotCQlpbnQgc3RhcnRGcmFnbWVudCA9IHN0YXJ0SFRNTCArIFBSRUZJWC5sZW5ndGgoKTsKLQkJaW50IGVuZEZyYWdtZW50ID0gc3RhcnRGcmFnbWVudCArIGNjaE11bHRpQnl0ZSAtIDE7Ci0JCWludCBlbmRIVE1MID0gZW5kRnJhZ21lbnQgKyBTVUZGSVgubGVuZ3RoKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoSEVBREVSKTsKLQkJaW50IG1heExlbmd0aCA9IE5VTUJFUi5sZW5ndGgoKTsKLQkJLy8gc3RhcnRIVE1MCi0JCWludCBzdGFydCA9IGJ1ZmZlci50b1N0cmluZygpLmluZGV4T2YoTlVNQkVSKTsKLQkJU3RyaW5nIHRlbXAgPSBJbnRlZ2VyLnRvU3RyaW5nKHN0YXJ0SFRNTCk7Ci0JCWJ1ZmZlci5yZXBsYWNlKHN0YXJ0ICsgbWF4TGVuZ3RoIC0gdGVtcC5sZW5ndGgoKSwgc3RhcnQgKyBtYXhMZW5ndGgsCi0JCQkJdGVtcCk7Ci0JCS8vIGVuZEhUTUwKLQkJc3RhcnQgPSBidWZmZXIudG9TdHJpbmcoKS5pbmRleE9mKE5VTUJFUiwgc3RhcnQpOwotCQl0ZW1wID0gSW50ZWdlci50b1N0cmluZyhlbmRIVE1MKTsKLQkJYnVmZmVyLnJlcGxhY2Uoc3RhcnQgKyBtYXhMZW5ndGggLSB0ZW1wLmxlbmd0aCgpLCBzdGFydCArIG1heExlbmd0aCwKLQkJCQl0ZW1wKTsKLQkJLy8gc3RhcnRGcmFnbWVudAotCQlzdGFydCA9IGJ1ZmZlci50b1N0cmluZygpLmluZGV4T2YoTlVNQkVSLCBzdGFydCk7Ci0JCXRlbXAgPSBJbnRlZ2VyLnRvU3RyaW5nKHN0YXJ0RnJhZ21lbnQpOwotCQlidWZmZXIucmVwbGFjZShzdGFydCArIG1heExlbmd0aCAtIHRlbXAubGVuZ3RoKCksIHN0YXJ0ICsgbWF4TGVuZ3RoLAotCQkJCXRlbXApOwotCQkvLyBlbmRGcmFnbWVudAotCQlzdGFydCA9IGJ1ZmZlci50b1N0cmluZygpLmluZGV4T2YoTlVNQkVSLCBzdGFydCk7Ci0JCXRlbXAgPSBJbnRlZ2VyLnRvU3RyaW5nKGVuZEZyYWdtZW50KTsKLQkJYnVmZmVyLnJlcGxhY2Uoc3RhcnQgKyBtYXhMZW5ndGggLSB0ZW1wLmxlbmd0aCgpLCBzdGFydCArIG1heExlbmd0aCwKLQkJCQl0ZW1wKTsKLQotCQlidWZmZXIuYXBwZW5kKFBSRUZJWCk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3RyaW5nKTsKLQkJYnVmZmVyLmFwcGVuZChTVUZGSVgpOwotCi0JCWNvdW50ID0gYnVmZmVyLmxlbmd0aCgpOwotCQljaGFycyA9IG5ldyBjaGFyW2NvdW50ICsgMV07Ci0JCWJ1ZmZlci5nZXRDaGFycygwLCBjb3VudCwgY2hhcnMsIDApOwotCQljY2hNdWx0aUJ5dGUgPSBPUy5XaWRlQ2hhclRvTXVsdGlCeXRlKGNvZGVQYWdlLCAwLCBjaGFycywgLTEsIG51bGwsIDAsCi0JCQkJbnVsbCwgbnVsbCk7Ci0JCWludCBscE11bHRpQnl0ZVN0ciA9IE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULAotCQkJCWNjaE11bHRpQnl0ZSk7Ci0JCU9TLldpZGVDaGFyVG9NdWx0aUJ5dGUoY29kZVBhZ2UsIDAsIGNoYXJzLCAtMSwgbHBNdWx0aUJ5dGVTdHIsCi0JCQkJY2NoTXVsdGlCeXRlLCBudWxsLCBudWxsKTsKLQkJdHJhbnNmZXJEYXRhLnN0Z21lZGl1bSA9IG5ldyBTVEdNRURJVU0oKTsKLQkJdHJhbnNmZXJEYXRhLnN0Z21lZGl1bS50eW1lZCA9IENPTS5UWU1FRF9IR0xPQkFMOwotCQl0cmFuc2ZlckRhdGEuc3RnbWVkaXVtLnVuaW9uRmllbGQgPSBscE11bHRpQnl0ZVN0cjsKLQkJdHJhbnNmZXJEYXRhLnN0Z21lZGl1bS5wVW5rRm9yUmVsZWFzZSA9IDA7Ci0JCXRyYW5zZmVyRGF0YS5yZXN1bHQgPSBDT00uU19PSzsKLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+bmF0aXZlVG9KYXZhPC9jb2RlPiBjb252ZXJ0cyBhIHBsYXRmb3JtCi0JICogc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgSFRNTCB0ZXh0IHRvIGEgamF2YSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHNlZSA8Y29kZT5UcmFuc2ZlciNuYXRpdmVUb0phdmE8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB0cmFuc2ZlckRhdGEKLQkgKiAgICAgICAgICAgIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YSB0byBiZSBiZWVuCi0JICogICAgICAgICAgICBjb252ZXJ0ZWQKLQkgKiBAcmV0dXJuIGEgamF2YSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgSFRNTCB0ZXh0IGlmIHRoZQotCSAqICAgICAgICAgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bDsgb3RoZXJ3aXNlIG51bGwKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JCWlmICghaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyRGF0YSkgfHwgdHJhbnNmZXJEYXRhLnBJRGF0YU9iamVjdCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlEYXRhT2JqZWN0IGRhdGEgPSBuZXcgSURhdGFPYmplY3QodHJhbnNmZXJEYXRhLnBJRGF0YU9iamVjdCk7Ci0JCWRhdGEuQWRkUmVmKCk7Ci0JCVNUR01FRElVTSBzdGdtZWRpdW0gPSBuZXcgU1RHTUVESVVNKCk7Ci0JCUZPUk1BVEVUQyBmb3JtYXRldGMgPSB0cmFuc2ZlckRhdGEuZm9ybWF0ZXRjOwotCQlzdGdtZWRpdW0udHltZWQgPSBDT00uVFlNRURfSEdMT0JBTDsKLQkJdHJhbnNmZXJEYXRhLnJlc3VsdCA9IGRhdGEuR2V0RGF0YShmb3JtYXRldGMsIHN0Z21lZGl1bSk7Ci0JCWRhdGEuUmVsZWFzZSgpOwotCQlpZiAodHJhbnNmZXJEYXRhLnJlc3VsdCAhPSBDT00uU19PSykKLQkJCXJldHVybiBudWxsOwotCQlpbnQgaE1lbSA9IHN0Z21lZGl1bS51bmlvbkZpZWxkOwotCi0JCXRyeSB7Ci0JCQlpbnQgbHBNdWx0aUJ5dGVTdHIgPSBPUy5HbG9iYWxMb2NrKGhNZW0pOwotCQkJaWYgKGxwTXVsdGlCeXRlU3RyID09IDApCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl0cnkgewotCQkJCWludCBjb2RlUGFnZSA9IE9TLkdldEFDUCgpOwotCQkJCWludCBjY2hXaWRlQ2hhciA9IE9TLk11bHRpQnl0ZVRvV2lkZUNoYXIoY29kZVBhZ2UsCi0JCQkJCQlPUy5NQl9QUkVDT01QT1NFRCwgbHBNdWx0aUJ5dGVTdHIsIC0xLCBudWxsLCAwKTsKLQkJCQlpZiAoY2NoV2lkZUNoYXIgPT0gMCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJY2hhcltdIGxwV2lkZUNoYXJTdHIgPSBuZXcgY2hhcltjY2hXaWRlQ2hhciAtIDFdOwotCQkJCU9TCi0JCQkJCQkuTXVsdGlCeXRlVG9XaWRlQ2hhcihjb2RlUGFnZSwgT1MuTUJfUFJFQ09NUE9TRUQsCi0JCQkJCQkJCWxwTXVsdGlCeXRlU3RyLCAtMSwgbHBXaWRlQ2hhclN0ciwKLQkJCQkJCQkJbHBXaWRlQ2hhclN0ci5sZW5ndGgpOwotCQkJCXJldHVybiBuZXcgU3RyaW5nKGxwV2lkZUNoYXJTdHIpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlPUy5HbG9iYWxVbmxvY2soaE1lbSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlPUy5HbG9iYWxGcmVlKGhNZW0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKSB7Ci0JCXJldHVybiBuZXcgaW50W10geyBIVE1MX0ZPUk1BVElEIH07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IEhUTUxfRk9STUFUIH07Ci0JfQotCi0JYm9vbGVhbiBjaGVja0hUTUwoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKG9iamVjdCAhPSBudWxsICYmIG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZyAmJiAoKFN0cmluZykgb2JqZWN0KQotCQkJCS5sZW5ndGgoKSA+IDApOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGNoZWNrSFRNTChvYmplY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vd2luMzIvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi93aW4zMi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljNTRlNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi93aW4zMi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB3aW5kb3dzLXNwZWNpZmljIGNsaXBib2FyZCB0cmFuc2ZlciBzZXJ2aWNlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLmNkdHByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLmNkdHByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxZGNlMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5jZHRwcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlLWNkdCB2ZXJzaW9uPSIyLjAiPz4KLQotPGNkdHByb2plY3Q+Ci08ZGF0YS8+Ci08L2NkdHByb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMzI3NzhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvanRpZHktOC4wLTIwMDYwODAxLjEzMTA1OS0zLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5ZjE1ZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBDb21tb24gcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmNWRkNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmNvbW1vbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzOGZmMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb247c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiBjb21tb24uamFyLCBsaWIvanRpZHktOC4wLTIwMDYwODAxLjEzMTA1OS0zLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IGNvbS5pYm0uaWN1O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuYXBhY2hlLmFudAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbiwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWI0MWJmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9IklCTSBXZWJTcGhlcmUgU3R1ZGlvIj4KLTx0aXRsZT5QbHVnLWluIExpY2Vuc2UgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxoMz5QbHVnLWluIExpY2Vuc2UgQWdyZWVtZW50PC9oMz4KLQotPHA+VXNlIG9mIHRoaXMgUGx1Zy1pbiBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIHdoaWNoIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBQcm9kdWN0IHdoaWNoIGluY2x1ZGVkIHRoaXMgUGx1Zy1pbi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDgyNzUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuY29tbW9uLmphciA9IHNyYy8KLW91dHB1dC5jb21tb24uamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gY29tbW9uLmphcixcCi0gICAgICAgICAgICAgICBsaWIvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9saWIvanRpZHktOC4wLTIwMDYwODAxLjEzMTA1OS0zLmphciBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9saWIvanRpZHktOC4wLTIwMDYwODAxLjEzMTA1OS0zLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzdmYzk3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vbGliL2p0aWR5LTguMC0yMDA2MDgwMS4xMzEwNTktMy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmMzRmZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBDb21tb24KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzRmYjFlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idmVyc2lvbiIgbmFtZT0iVmVyc2lvbiIgc2NoZW1hPSJzY2hlbWEvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi52ZXJzaW9uLmV4c2QiLz4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJlcGYiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi52ZXJzaW9uIj4KLSAgICAgICAgIDx2ZXJzaW9ucwotICAgICAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkVQRlZlcnNpb25zIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc2NoZW1hL29yZy5lY2xpcHNlLmVwZi5jb21tb24udmVyc2lvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NjaGVtYS9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnZlcnNpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTVlMjVhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc2NoZW1hL29yZy5lY2xpcHNlLmVwZi5jb21tb24udmVyc2lvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iIGlkPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnZlcnNpb24iIG5hbWU9IlZlcnNpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRGVmaW5lIHNjaGVtYS90b29sIHZlcnNpb25zCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZlcnNpb25zIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJsaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2ZXJzaW9ucyI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5WZXJzaW9ucyIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJsaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LklMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vQ29tbW9uUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vQ29tbW9uUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAxNDUyYjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0NvbW1vblBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBDb21tb24gcGx1Zy1pbiBhY3RpdmF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25QbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQ29tbW9uUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbW1vblBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21tb25QbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9IVE1MRm9ybWF0dGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9IVE1MRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3YTgwYzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvSFRNTEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLnczYy50aWR5LlRpZHk7Ci0KLS8qKgotICogUHJldHR5LWZvcm1hdHMgSFRNTCBzb3VyY2UgYW5kIG1ha2VzIGl0IFhIVE1MIGNvbXBsaWFudC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0JPRFlfU1RBUlRfVEFHID0gIjxib2R5PiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0JPRFlfRU5EX1RBRyA9ICI8L2JvZHk+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhUTUxfQk9EWV9TVEFSVF9UQUdfTEVOR1RIID0gSFRNTF9CT0RZX1NUQVJUX1RBRwotCQkJLmxlbmd0aCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR05PU1RJQ19TT1VSQ0UgPSAib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5IVE1MRm9ybWF0dGVyIjsKLQotCXByaXZhdGUgaW50IGxpbmVXaWR0aDsKLQotCXByaXZhdGUgYm9vbGVhbiBpbmRlbnQ7Ci0KLQlwcml2YXRlIGludCBpbmRlbnRTaXplOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFzdEVycm9yU3RyOwotCi0JLyoKLQkgKiBTdHJpbmcgbG9jYXRpb24gPSBtLmdyb3VwKDEpOwotCSAqIFN0cmluZyBsaW5lU3RyID0gbS5ncm91cCgyKTsKLQkgKiBTdHJpbmcgY29sdW1uU3RyID0gbS5ncm91cCgzKTsKLQkgKiBTdHJpbmcgZXJyb3JNc2cgPSBtLmdyb3VwKDQpOwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBqVGlkeUVycm9yUGFyc2VyID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSIobGluZVxccysoXFxkKylcXHMrY29sdW1uXFxzKyhcXGQrKSlcXHMrLVxccysoLispIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSFRNTEZvcm1hdHRlcigpIHsKLQkJdGhpcygxMzIsIHRydWUsIDQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEhUTUxGb3JtYXR0ZXIoaW50IGxpbmVXaWR0aCwgYm9vbGVhbiBpbmRlbnQsIGludCBpbmRlbnRTaXplKSB7Ci0JCXRoaXMubGluZVdpZHRoID0gbGluZVdpZHRoOwotCQl0aGlzLmluZGVudCA9IGluZGVudDsKLQkJdGhpcy5pbmRlbnRTaXplID0gaW5kZW50U2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtYXhpbXVtIGNoYXJhY3RlciB3aWR0aCBvZiBhIGxpbmUuCi0JICogCi0JICogQHBhcmFtIGxpbmVXaWR0aAotCSAqICAgICAgICAgICAgVGhlIGxpbmUgd2lkdGggKGluIG51bWJlciBvZiBjaGFyYWN0ZXJzKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5lV2lkdGgoaW50IGxpbmVXaWR0aCkgewotCQl0aGlzLmxpbmVXaWR0aCA9IGxpbmVXaWR0aDsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRhZ3MgaW5kZW50LgotCSAqIAotCSAqIEBwYXJhbSBpbmRlbnQKLQkgKiAgICAgICAgICAgIElmIHRydWUsIGlkZW50IHRoZSB0YWdzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluZGVudChib29sZWFuIGluZGVudCkgewotCQl0aGlzLmluZGVudCA9IGluZGVudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmRlbnQgc2l6ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZW50U2l6ZQotCSAqICAgICAgICAgICAgVGhlIGluZGVudCBzaXplIChpbiBudW1iZXIgb2YgY2hhcmFjdGVycykuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5kZW50U2l6ZShpbnQgaW5kZW50U2l6ZSkgewotCQl0aGlzLmluZGVudFNpemUgPSBpbmRlbnRTaXplOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIGdpdmVuIEhUTUwgc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBodG1sCi0JICogICAgICAgICAgICBUaGUgSFRNTCBzb3VyY2UuCi0JICogQHJldHVybiBUaGUgcHJldHR5LWZvcm1hdHRlZCBIVE1MIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZvcm1hdEhUTUwoU3RyaW5nIGh0bWwpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJaWYgKGh0bWwgPT0gbnVsbCB8fCBodG1sLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBodG1sOwotCQl9Ci0KLQkJbGFzdEVycm9yU3RyID0gbnVsbDsKLQotCQlUaWR5IHRpZHkgPSBuZXcgVGlkeSgpOwotCQl0aWR5LnNldFhIVE1MKHRydWUpOwotCQl0aWR5LnNldERyb3BFbXB0eVBhcmFzKGZhbHNlKTsKLQkJdGlkeS5zZXREcm9wRm9udFRhZ3MoZmFsc2UpOwotCQl0aWR5LnNldFF1aWV0KHRydWUpOwotCQl0aWR5LnNldFNob3dXYXJuaW5ncyhmYWxzZSk7Ci0JCXRpZHkuc2V0U21hcnRJbmRlbnQoZmFsc2UpOwotCQl0aWR5LnNldFRpZHlNYXJrKGZhbHNlKTsKLQkJdGlkeS5zZXRXcmFwbGVuKGxpbmVXaWR0aCk7Ci0JCXRpZHkuc2V0SW5kZW50QXR0cmlidXRlcyhmYWxzZSk7Ci0JCXRpZHkuc2V0SW5kZW50Q29udGVudChpbmRlbnQpOwotCQl0aWR5LnNldFNwYWNlcyhpbmRlbnRTaXplKTsKLQkJdGlkeS5zZXRJbnB1dEVuY29kaW5nKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCXRpZHkuc2V0T3V0cHV0RW5jb2RpbmcoIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gdGhpcyB3aWxsIGFkZCA8cD4gYXJvdW5kIGVhY2ggdGV4dCBibG9jayAoP3RoYXQgaXNuJ3QgaW4gYSBibG9jayBhbHJlYWR5PykKLS8vCQl0aWR5LnNldEVuY2xvc2VCbG9ja1RleHQodHJ1ZSk7Ci0JCS8vIHNldHRpbmcgdGhpcyBzZWVtZWQgdG8gcHJldmVudCBKVGlkeSBmcm9tIGluZGVudGluZyB0aGUgc291cmNlCi0vLwkJdGlkeS5zZXRQcmludEJvZHlPbmx5KHRydWUpOwotCi0KLQkJUmVhZGVyIGlucHV0ID0gbmV3IFN0cmluZ1JlYWRlcihodG1sKTsKLQkJV3JpdGVyIG91dHB1dCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQotCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQkJdGlkeS5zZXRFcnJvdXQocHcpOwotCQl0aWR5LnBhcnNlKGlucHV0LCBvdXRwdXQpOwotCQlTdHJpbmcgZXJyb3IgPSBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5sZW5ndGgoKSA+IDAKLQkJCQkmJiBlcnJvci5zdGFydHNXaXRoKCJsaW5lIikgJiYgZXJyb3IuaW5kZXhPZigiY29sdW1uIikgPiAwKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbGFzdEVycm9yU3RyID0gZXJyb3I7Ci0JCQlyZXR1cm4gaHRtbDsKLQkJfQotCi0JCVN0cmluZyBmb3JtYXR0ZWRIVE1MID0gb3V0cHV0LnRvU3RyaW5nKCk7Ci0JCWZvcm1hdHRlZEhUTUwgPSBTdHJVdGlsLmdldEVzY2FwZWRIVE1MKGZvcm1hdHRlZEhUTUwpOwotCi0JCWlmICghaHRtbC5zdGFydHNXaXRoKCI8IURPQ1RZUEUiKSAmJiAhaHRtbC5zdGFydHNXaXRoKCI8aHRtbCIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaW50IHN0YXJ0ID0gZm9ybWF0dGVkSFRNTC5pbmRleE9mKEhUTUxfQk9EWV9TVEFSVF9UQUcpOwotCQkJaW50IGVuZCA9IGZvcm1hdHRlZEhUTUwuaW5kZXhPZihIVE1MX0JPRFlfRU5EX1RBRyk7Ci0JCQlpZiAoc3RhcnQgPT0gLTEgfHwgZW5kID09IC0xKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzdGFydCArPSBIVE1MX0JPRFlfU1RBUlRfVEFHX0xFTkdUSDsKLQkJCWlmIChzdGFydCA+PSBlbmQpIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXN0YXJ0ICs9IEZpbGVVdGlsLkxJTkVfU0VQX0xFTkdUSDsKLQkJCWVuZCAtPSBGaWxlVXRpbC5MSU5FX1NFUF9MRU5HVEg7Ci0JCQlpZiAoaW5kZW50ICYmIGluZGVudFNpemUgPiAwKSB7Ci0JCQkJZW5kIC09IGluZGVudFNpemU7Ci0JCQl9Ci0JCQlpZiAoc3RhcnQgPj0gZW5kKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJpbmcgcmVzdWx0ID0gZm9ybWF0dGVkSFRNTC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0JCQlpZiAoaW5kZW50ICYmIGluZGVudFNpemUgPiAwKSB7Ci0JCQkJU3RyaW5nIGluZGVudFN0ciA9IGdldEluZGVudFN0cihpbmRlbnRTaXplICogMik7Ci0JCQkJcmVzdWx0ID0gZml4SW5kZW50YXRpb24ocmVzdWx0LCBpbmRlbnRTdHIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZvcm1hdHRlZEhUTUw7Ci0JfQotCQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIGdpdmVuIEhUTUwgc291cmNlIHdpdGggb3B0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gaHRtbAotCSAqICAgICAgICAgICAgVGhlIEhUTUwgc291cmNlLgotCSAqIEByZXR1cm4gVGhlIHByZXR0eS1mb3JtYXR0ZWQgSFRNTCBzb3VyY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBmb3JtYXRIVE1MKFN0cmluZyBodG1sLCBib29sZWFuIGZvcmNlT3V0cHV0LCBib29sZWFuIG1ha2VCYXJlLCBib29sZWFuIHdvcmQyMDAwKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCWlmIChodG1sID09IG51bGwgfHwgaHRtbC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gaHRtbDsKLQkJfQotCi0JCWxhc3RFcnJvclN0ciA9IG51bGw7Ci0KLQkJVGlkeSB0aWR5ID0gbmV3IFRpZHkoKTsKLQkJdGlkeS5zZXRYSFRNTCh0cnVlKTsKLQkJdGlkeS5zZXREcm9wRW1wdHlQYXJhcyhmYWxzZSk7Ci0JCXRpZHkuc2V0RHJvcEZvbnRUYWdzKGZhbHNlKTsKLQkJdGlkeS5zZXRRdWlldCh0cnVlKTsKLQkJdGlkeS5zZXRTaG93V2FybmluZ3MoZmFsc2UpOwotCQl0aWR5LnNldFNtYXJ0SW5kZW50KGZhbHNlKTsKLQkJdGlkeS5zZXRUaWR5TWFyayhmYWxzZSk7Ci0JCXRpZHkuc2V0V3JhcGxlbihsaW5lV2lkdGgpOwotCQl0aWR5LnNldEluZGVudEF0dHJpYnV0ZXMoZmFsc2UpOwotCQl0aWR5LnNldEluZGVudENvbnRlbnQoaW5kZW50KTsKLQkJdGlkeS5zZXRTcGFjZXMoaW5kZW50U2l6ZSk7Ci0JCXRpZHkuc2V0SW5wdXRFbmNvZGluZygiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQl0aWR5LnNldE91dHB1dEVuY29kaW5nKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHRoaXMgd2lsbCBhZGQgPHA+IGFyb3VuZCBlYWNoIHRleHQgYmxvY2sgKD90aGF0IGlzbid0IGluIGEgYmxvY2sgYWxyZWFkeT8pCi0vLwkJdGlkeS5zZXRFbmNsb3NlQmxvY2tUZXh0KHRydWUpOwotCQkvLyBzZXR0aW5nIHRoaXMgc2VlbWVkIHRvIHByZXZlbnQgSlRpZHkgZnJvbSBpbmRlbnRpbmcgdGhlIHNvdXJjZQotLy8JCXRpZHkuc2V0UHJpbnRCb2R5T25seSh0cnVlKTsKLQkJaWYgKGZvcmNlT3V0cHV0KSB7Ci0JCQkvLyBvdXRwdXQgZG9jdW1lbnQgZXZlbiBpZiBlcnJvcnMgYXJlIHByZXNlbnQKLQkJCXRpZHkuc2V0Rm9yY2VPdXRwdXQodHJ1ZSk7Ci0JCX0KLQkJaWYgKG1ha2VCYXJlKSB7Ci0JCQkvLyByZW1vdmUgTVMgY2x1dHRlcgotCQkJdGlkeS5zZXRNYWtlQmFyZSh0cnVlKTsKLQkJfQotCQlpZiAod29yZDIwMDApIHsKLQkJCS8vIGRyYWNvbmlhbiBXb3JkMjAwMCBjbGVhbmluZwotCQkJdGlkeS5zZXRXb3JkMjAwMCh0cnVlKTsKLQkJfQotCi0KLQkJUmVhZGVyIGlucHV0ID0gbmV3IFN0cmluZ1JlYWRlcihodG1sKTsKLQkJV3JpdGVyIG91dHB1dCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQotCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQkJdGlkeS5zZXRFcnJvdXQocHcpOwotCQl0aWR5LnBhcnNlKGlucHV0LCBvdXRwdXQpOwotCQlTdHJpbmcgZXJyb3IgPSBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5sZW5ndGgoKSA+IDAKLQkJCQkmJiBlcnJvci5zdGFydHNXaXRoKCJsaW5lIikgJiYgZXJyb3IuaW5kZXhPZigiY29sdW1uIikgPiAwKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbGFzdEVycm9yU3RyID0gZXJyb3I7Ci0JCX0KLQotCQlTdHJpbmcgZm9ybWF0dGVkSFRNTCA9IG91dHB1dC50b1N0cmluZygpOwotCQlmb3JtYXR0ZWRIVE1MID0gU3RyVXRpbC5nZXRFc2NhcGVkSFRNTChmb3JtYXR0ZWRIVE1MKTsKLQotCQlpZiAoIWh0bWwuc3RhcnRzV2l0aCgiPCFET0NUWVBFIikgJiYgIWh0bWwuc3RhcnRzV2l0aCgiPGh0bWwiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWludCBzdGFydCA9IGZvcm1hdHRlZEhUTUwuaW5kZXhPZihIVE1MX0JPRFlfU1RBUlRfVEFHKTsKLQkJCWludCBlbmQgPSBmb3JtYXR0ZWRIVE1MLmluZGV4T2YoSFRNTF9CT0RZX0VORF9UQUcpOwotCQkJaWYgKHN0YXJ0ID09IC0xIHx8IGVuZCA9PSAtMSkgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc3RhcnQgKz0gSFRNTF9CT0RZX1NUQVJUX1RBR19MRU5HVEg7Ci0JCQlpZiAoc3RhcnQgPj0gZW5kKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzdGFydCArPSBGaWxlVXRpbC5MSU5FX1NFUF9MRU5HVEg7Ci0JCQllbmQgLT0gRmlsZVV0aWwuTElORV9TRVBfTEVOR1RIOwotCQkJaWYgKGluZGVudCAmJiBpbmRlbnRTaXplID4gMCkgewotCQkJCWVuZCAtPSBpbmRlbnRTaXplOwotCQkJfQotCQkJaWYgKHN0YXJ0ID49IGVuZCkgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJU3RyaW5nIHJlc3VsdCA9IGZvcm1hdHRlZEhUTUwuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCQkJaWYgKGluZGVudCAmJiBpbmRlbnRTaXplID4gMCkgewotCQkJCVN0cmluZyBpbmRlbnRTdHIgPSBnZXRJbmRlbnRTdHIoaW5kZW50U2l6ZSAqIDIpOwotCQkJCXJlc3VsdCA9IGZpeEluZGVudGF0aW9uKHJlc3VsdCwgaW5kZW50U3RyKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBmb3JtYXR0ZWRIVE1MOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmRlbnQgc3RyaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJbmRlbnRTdHIoaW50IGluZGVudExlbmd0aCkgewotCQlpZiAoaW5kZW50TGVuZ3RoID09IDApIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZ0J1ZmZlciBpbmRlbnRTdHIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50TGVuZ3RoOyBpKyspIHsKLQkJCWluZGVudFN0ci5hcHBlbmQoJyAnKTsKLQkJfQotCQlyZXR1cm4gaW5kZW50U3RyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFX1RBR19TVEFSVCA9ICI8cHJlPiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRV9UQUdfRU5EID0gIjwvcHJlPiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9UQUdfRU5EX0xFTkdUSCA9IFBSRV9UQUdfRU5ELmxlbmd0aCgpOwotCi0JLyoqCi0JICogVW5kbyB0aGUgSlRpZHkgaW5kZW50LCBidXQgaWdub3JlICZsdDtwcmUmZ3Q7IHRhZ3MKLQkgKiAKLQkgKiBAcGFyYW0gaHRtbAotCSAqIEBwYXJhbSBpbmRlbnRTdHIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpeEluZGVudGF0aW9uKFN0cmluZyBodG1sLCBTdHJpbmcgaW5kZW50U3RyKSB7Ci0JCWlmIChodG1sLnN0YXJ0c1dpdGgoaW5kZW50U3RyKSkgewotCQkJaHRtbCA9IGh0bWwuc3Vic3RyaW5nKGluZGVudFN0ci5sZW5ndGgoKSk7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IHByZV9pbmRleCA9IC0xOwotCQlpbnQgbGFzdF9wcmVfZW5kX2luZGV4ID0gLTE7Ci0JCXdoaWxlICgocHJlX2luZGV4ID0gaHRtbC5pbmRleE9mKFBSRV9UQUdfU1RBUlQsIGxhc3RfcHJlX2VuZF9pbmRleCkpICE9IC0xKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKGh0bWwuc3Vic3RyaW5nKAotCQkJCQlsYXN0X3ByZV9lbmRfaW5kZXggPCAwID8gMCA6IGxhc3RfcHJlX2VuZF9pbmRleAotCQkJCQkJCSsgUFJFX1RBR19FTkRfTEVOR1RILCBwcmVfaW5kZXgpLnJlcGxhY2VBbGwoCi0JCQkJCSJcclxuIiArIGluZGVudFN0ciwgIlxyXG4iKSk7Ci0JCQlsYXN0X3ByZV9lbmRfaW5kZXggPSBodG1sLmluZGV4T2YoUFJFX1RBR19FTkQsIHByZV9pbmRleCk7Ci0JCQlpZiAobGFzdF9wcmVfZW5kX2luZGV4ICE9IC0xKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChodG1sLnN1YnN0cmluZyhwcmVfaW5kZXgsIGxhc3RfcHJlX2VuZF9pbmRleAotCQkJCQkJKyBQUkVfVEFHX0VORF9MRU5HVEgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZm91bmQgPHByZT4sIGJ1dCBubyBlbmRpbmcgPC9wcmU+IC0gc2hvdWxkbid0IGV2ZXIgZ2V0IGhlcmUKLQkJCQkvLyBhcHBlbmQgcmVzdCBvZiBzdHJpbmcgYW5kIHJldHVybiBpdAotCQkJCXN0ckJ1Zi5hcHBlbmQoaHRtbC5zdWJzdHJpbmcocHJlX2luZGV4KSk7Ci0JCQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCXN0ckJ1Zi5hcHBlbmQoaHRtbC5zdWJzdHJpbmcoCi0JCQkJbGFzdF9wcmVfZW5kX2luZGV4IDwgMCA/IDAgOiBsYXN0X3ByZV9lbmRfaW5kZXgKLQkJCQkJCSsgUFJFX1RBR19FTkRfTEVOR1RIKS5yZXBsYWNlQWxsKCJcclxuIiArIGluZGVudFN0ciwKLQkJCQkiXHJcbiIpKTsKLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdEVycm9yU3RyKCkgewotCQlyZXR1cm4gbGFzdEVycm9yU3RyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL0hUTUxQYXJzZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL0hUTUxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU3MjQ4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9IVE1MUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5odG1sOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MudGlkeS5UaWR5OwotCi0vKioKLSAqIEV4dHJhY3RzIHRoZSB0aXRsZSwgbWV0YSB0YWdzIGFuZCB0ZXh0IGZyb20gYSBIVE1MIGZpbGUgb3Igc291cmNlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxQYXJzZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNDA5NjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1NDUklQVF9UQUcgPSAic2NyaXB0IjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1RJVExFX1RBRyA9ICJ0aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX01FVEFfVEFHID0gIm1ldGEiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRpZHkgdGlkeTsKLQotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JcHJpdmF0ZSBTdHJpbmcgc3VtbWFyeTsKLQotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0KLQlwcml2YXRlIFByb3BlcnRpZXMgbWV0YVRhZ3M7Ci0KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBodG1sVGV4dDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEhUTUxQYXJzZXIoKSB7Ci0JCXRyeSB7Ci0JCQl0aWR5ID0gbmV3IFRpZHkoKTsKLQkJCXRpZHkuc2V0WEhUTUwodHJ1ZSk7Ci0JCQl0aWR5LnNldERyb3BFbXB0eVBhcmFzKHRydWUpOwotCQkJdGlkeS5zZXREcm9wRm9udFRhZ3ModHJ1ZSk7Ci0JCQl0aWR5LnNldFF1aWV0KHRydWUpOwotCQkJdGlkeS5zZXRTaG93V2FybmluZ3MoZmFsc2UpOwotCQkJdGlkeS5zZXRTbWFydEluZGVudChmYWxzZSk7Ci0JCQl0aWR5LnNldFRpZHlNYXJrKGZhbHNlKTsKLQkJCXRpZHkuc2V0V3JhcGxlbigxMzIpOwotCQkJdGlkeS5zZXRJbmRlbnRBdHRyaWJ1dGVzKGZhbHNlKTsKLQkJCXRpZHkuc2V0SW5kZW50Q29udGVudChmYWxzZSk7Ci0JCQl0aWR5LnNldFNwYWNlcygyKTsKLQkJCXRpZHkuc2V0SW5wdXRFbmNvZGluZygiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGlkeS5zZXRPdXRwdXRFbmNvZGluZygiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGlkeSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGdpdmVuIEhUTUwgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZShGaWxlIGZpbGUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAodGlkeSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpIHx8ICFmaWxlLmNhblJlYWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCUlucHV0U3RyZWFtUmVhZGVyIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaXMsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzcik7Ci0KLQkJU3RyaW5nQnVmZmVyIHRleHRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKEJVRkZFUl9TSVpFKTsKLQkJY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyW0JVRkZFUl9TSVpFXTsKLQkJaW50IGNoYXJzUmVhZDsKLQkJd2hpbGUgKChjaGFyc1JlYWQgPSBici5yZWFkKGJ1ZmZlciwgMCwgQlVGRkVSX1NJWkUpKSA+IDApIHsKLQkJCXRleHRCdWZmZXIuYXBwZW5kKGJ1ZmZlciwgMCwgY2hhcnNSZWFkKTsKLQkJfQotCi0JCXBhcnNlKHRleHRCdWZmZXIudG9TdHJpbmcoKSk7Ci0KLQkJaWYgKGJyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJYnIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gSFRNTCBzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2UoU3RyaW5nIGh0bWxTb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotCQl0aXRsZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXN1bW1hcnkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJbWV0YVRhZ3MgPSBuZXcgUHJvcGVydGllcygpOwotCi0JCURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGh0bWxTb3VyY2UpOwotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCWh0bWxUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigxMDI0KTsKLQkJCWV4dHJhY3QoZG9jLmdldENoaWxkTm9kZXMoKSk7Ci0JCQl0ZXh0ID0gaHRtbFRleHQudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpdGxlIHRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEhUTUwgbWV0YSB0YWdzLgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldE1ldGFUYWdzKCkgewotCQlyZXR1cm4gbWV0YVRhZ3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3VtbWFyeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnkoKSB7Ci0JCXJldHVybiBzdW1tYXJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJvZHkgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIERPTSBkb2N1bWVudCBmb3IgdGhlIGdpdmVuIEhUTUwgc291cmNlLgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudCBnZXREb2N1bWVudChTdHJpbmcgaHRtbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChodG1sID09IG51bGwgfHwgaHRtbC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGh0bWwKLQkJCQkuZ2V0Qnl0ZXMoIlVURi04IikpOyAvLyROT04tTkxTLTEkCQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0JCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCQl0aWR5LnNldEVycm91dChwdyk7Ci0KLQkJcmV0dXJuIHRpZHkucGFyc2VET00oaW5wdXQsIG91dHB1dCk7Ci0JfQotCi0JLyoqCi0JICogRXh0cmFjdHMgdGhlIHRpdGxlLCBtZXRhIHRhZ3MgYW5kIGJvZHkgdGV4dCBmcm9tIHRoZSBnaXZlbiBub2Rlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleHRyYWN0KE5vZGVMaXN0IG5vZGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBub2RlTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgotCQkJCWlmICghbm9kZU5hbWUuZXF1YWxzKEhUTUxfU0NSSVBUX1RBRykpIHsKLQkJCQkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJTm9kZSBhdHRyTm9kZSA9IGF0dHJzLml0ZW0oaik7Ci0JCQkJCQlTdHJpbmcgYXR0ck5vZGVOYW1lID0gYXR0ck5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCVN0cmluZyBhdHRyTm9kZVZhbHVlID0gYXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQlpZiAoYXR0ck5vZGVOYW1lLmVxdWFscyhIVE1MX1RJVExFX1RBRykpIHsKLQkJCQkJCQl0aXRsZSA9IGF0dHJOb2RlVmFsdWU7Ci0JCQkJCQl9IGVsc2UgaWYgKGF0dHJOb2RlTmFtZS5lcXVhbHMoSFRNTF9NRVRBX1RBRykpIHsKLQkJCQkJCQltZXRhVGFncy5wdXQoYXR0ck5vZGVOYW1lLCBhdHRyTm9kZVZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJCWlmIChjaGlsZE5vZGVzICE9IG51bGwgJiYgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJCWV4dHJhY3QoY2hpbGROb2Rlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFOgotCQkJCWh0bWxUZXh0LmFwcGVuZChub2RlLmdldE5vZGVWYWx1ZSgpKS5hcHBlbmQoJyAnKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYzUyYmJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGNvbW1vbiBIVE1MIHBhcnNpbmcgYW5kIHByZXR0eS1mb3JtYXRpbmcgc2VydmljZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxZjg5M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBhY3RpdmF0b3IgZm9yIG1hbmFnaW5nIHRoZSBDb21tb24gcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3BsdWdpbi9BYnN0cmFjdFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3BsdWdpbi9BYnN0cmFjdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNTdmOTZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wbHVnaW4vQWJzdHJhY3RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkkxOG5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgRVBGIHBsdWctaW5zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGljb25zLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1BBVEggPSAiaWNvbnMvIjsgLy8kTk9OLU5MUy0xJDsKLQotCS8vIFRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoaXMgcGx1Zy1pbi4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JLy8gVGhpcyBwbHVnLWluIElELgotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCi0JLy8gVGhlIHBsdWctaW4gaW5zdGFsbCBVUkwuCi0JcHJpdmF0ZSBVUkwgaW5zdGFsbFVSTDsKLQotCS8vIFRoZSBwbHVnLWluIGluc3RhbGwgcGF0aC4KLQlwcml2YXRlIFN0cmluZyBpbnN0YWxsUGF0aDsKLQotCS8vIFRoZSBwbHVnLWluIGljb24gVVJMLgotCXByaXZhdGUgVVJMIGljb25VUkw7Ci0KLQkvLyBUaGUgbG9nZ2VyIGhhc2ggbWFwLgotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIExvZ2dlcj4gbG9nZ2VycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTG9nZ2VyPigpOwotCi0JLy8gVGhlIG1lc3NhZ2UgZGlhbG9nIGhhc2ggbWFwLgotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE1zZ0RpYWxvZz4gbXNnRGlhbG9ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTXNnRGlhbG9nPigpOwotCi0JLy8gVGhlIHNoYXJlZCBpbWFnZSBoYXNoIG1hcC4KLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBJbWFnZT4gc2hhcmVkSW1hZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbWFnZT4oKTsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEFic3RyYWN0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQotCQlpbml0KGNvbnRleHQpOwotCi0JCWlmIChpc0RlYnVnZ2luZygpKSB7Ci0JCQlnZXRMb2dnZXIoKS5sb2dJbmZvKCJTdGFydGVkICIgKyBwbHVnaW5JZCk7IC8vJE5PTi1OTFMtMSQJCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gRnJlZSB0aGUgc2hhcmVkIGltYWdlcy4KLQkJZm9yIChJdGVyYXRvciBpbWFnZXMgPSBzaGFyZWRJbWFnZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaW1hZ2VzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUltYWdlIGltYWdlID0gKEltYWdlKSBpbWFnZXMubmV4dCgpOwotCQkJaWYgKGltYWdlICE9IG51bGwgJiYgIWltYWdlLmlzRGlzcG9zZWQoKSkgewotCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0KLQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCWdldExvZ2dlcigpLmxvZ0luZm8oIlN0b3BwZWQgIiArIHBsdWdpbklkKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICBUaGUgYnVuZGxlIGNvbnRleHQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBHZXQgdGhlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnLWluLgotCQlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKCk7Ci0KLQkJLy8gR2V0IHRoZSByZXNvdWNlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnLWluLgotCQlyZXNvdXJjZUJ1bmRsZSA9IFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKGJ1bmRsZSk7Ci0KLQkJLy8gR2V0IHRoZSBJRCBmb3IgdGhpcyBwbHVnLWluLgotCQlwbHVnaW5JZCA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQotCQlpZiAoaXNEZWJ1Z2dpbmcoKSkgewotCQkJZ2V0TG9nZ2VyKCkubG9nSW5mbygiSW5pdGlhbGl6aW5nICIgKyBwbHVnaW5JZCk7IC8vJE5PTi1OTFMtMSQJCQotCQl9Ci0KLQkJLy8gR2V0IHRoZSBpbnN0YWxsIHBhdGggb2YgdGhpcyBwbHVnLWluLgotCQlpbnN0YWxsVVJMID0gYnVuZGxlLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQotCQl0cnkgewotCQkJaW5zdGFsbFBhdGggPSBGaWxlTG9jYXRvci5yZXNvbHZlKGluc3RhbGxVUkwpLmdldFBhdGgoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaW5zdGFsbFBhdGggPSBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRVUkwoKS5nZXRQYXRoKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJaWNvblVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgSUNPTl9QQVRIKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCWdldExvZ2dlcigpLmxvZ0luZm8oCi0JCQkJCSJJbml0aWFsaXplZCAiICsgcGx1Z2luSWQgKyAiLCBpbnN0YWxsUGF0aD0iICsgaW5zdGFsbFBhdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElEIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBJRCBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHBsdWdpbklkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbGwgVVJMIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gVGhlCi0JICogICAgICAgICAgICBpbnN0YWxsIFVSTCBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFVSTCBnZXRJbnN0YWxsVVJMKCkgewotCQlyZXR1cm4gaW5zdGFsbFVSTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YWxsIHBhdGggb2YgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBUaGUKLQkgKiAgICAgICAgICAgIGluc3RhbGwgcGF0aCBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnN0YWxsUGF0aCgpIHsKLQkJcmV0dXJuIGluc3RhbGxQYXRoOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGFuZCByZXR1cm5zIHRoZSBsb2NhbGl6ZWQgcHJvcGVydGllcyBvZiBhIEphdmEgcHJvcGVydGllcyBmaWxlLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgcHJvcGVydGllcyBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4gcm9vdC4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+UHJvcGVydGllczwvY29kZT4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcHM7Ci0JCX0KLQkJCi0JCVN0cmluZyBmaWxlUGF0aCA9IGdldExvY2FsaXplZEZpbGUocGF0aCwgdHJ1ZSk7Ci0JCQotLy8JCVN0cmluZyBmaWxlUGF0aCA9IG51bGw7Ci0vLwkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVV0aWwuZ2V0RmlsZU5hbWUocGF0aCk7Ci0vLwkJaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihmaWxlTmFtZSk7Ci0vLwkJU3RyaW5nIHBhdGhOYW1lID0gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotLy8KLS8vCQlMb2NhbGUgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLS8vCQlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKCk7Ci0vLwkJQnVuZGxlW10gYnVuZGxlcyA9IFBsYXRmb3JtLmdldEZyYWdtZW50cyhidW5kbGUpOwotLy8JCWlmIChidW5kbGVzICE9IG51bGwpIHsKLS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQlVUkwgZW50cnkgPSBidW5kbGVzW2ldLmdldEVudHJ5KHBhdGhOYW1lKTsKLS8vCQkJCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0vLwkJCQkJVVJMIHVybCA9IFBsYXRmb3JtLnJlc29sdmUoZW50cnkpOwotLy8JCQkJCWZpbGVQYXRoID0gSTE4blV0aWwuZ2V0TG9jYWxpemVkRmlsZSh1cmwuZ2V0UGF0aCgpICsgZmlsZU5hbWUsIGxvY2FsZSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotLy8JCQkJCQlicmVhazsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCWlmIChmaWxlUGF0aCA9PSBudWxsKSB7Ci0vLwkJCVVSTCBlbnRyeSA9IGJ1bmRsZS5nZXRFbnRyeShwYXRoKTsKLS8vCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLS8vCQkJCVVSTCB1cmwgPSBQbGF0Zm9ybS5yZXNvbHZlKGVudHJ5KTsKLS8vCQkJCWZpbGVQYXRoID0gSTE4blV0aWwuZ2V0TG9jYWxpemVkRmlsZSh1cmwuZ2V0UGF0aCgpLCBsb2NhbGUpOwotLy8JCQkJaWYgKGZpbGVQYXRoID09IG51bGwpIHsKLS8vCQkJCQlmaWxlUGF0aCA9IHVybC5nZXRQYXRoKCk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0KLQkJaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKLQkJCXByb3BzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlUGF0aCkpOwotCQl9Ci0KLQkJcmV0dXJuIHByb3BzOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbG9jYWxlIHNwZWNpZmljIGFic29sdXRlIGZpbGUgcGF0aCBuYW1lIG9mIHRoZSBnaXZlbiBmaWxlIGluIHRoZSBwbHVnaW4uCi0JICogQHBhcmFtIHBhdGggVGhlIHByb3BlcnRpZXMgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluIHJvb3QuCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGxvY2FsZSBzcGVjaWZpYyBhYnNvbHV0ZSBmaWxlIHBhdGggbmFtZSBvZiB0aGUgZ2l2ZW4gZmlsZS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRGaWxlKFN0cmluZyBwYXRoLCBib29sZWFuIHVzZURlZmF1bHQpIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIGZpbGVQYXRoID0gbnVsbDsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVV0aWwuZ2V0RmlsZU5hbWUocGF0aCk7Ci0JCWludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2YoZmlsZU5hbWUpOwotCQlTdHJpbmcgcGF0aE5hbWUgPSBwYXRoLnN1YnN0cmluZygwLCBpbmRleCk7Ci0KLQkJTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JCQotCQlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKCk7Ci0JCUJ1bmRsZVtdIGJ1bmRsZXMgPSBQbGF0Zm9ybS5nZXRGcmFnbWVudHMoYnVuZGxlKTsKLQkJaWYgKGJ1bmRsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVVJMIGVudHJ5ID0gYnVuZGxlc1tpXS5nZXRFbnRyeShwYXRoTmFtZSk7Ci0JCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoZW50cnkpOwotCQkJCQlmaWxlUGF0aCA9IEkxOG5VdGlsLmdldExvY2FsaXplZEZpbGUodXJsLmdldFBhdGgoKSArIGZpbGVOYW1lLCBsb2NhbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChmaWxlUGF0aCAhPSBudWxsKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChmaWxlUGF0aCA9PSBudWxsKSB7Ci0JCQlVUkwgZW50cnkgPSBidW5kbGUuZ2V0RW50cnkocGF0aCk7Ci0JCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKGVudHJ5KTsKLQkJCQlmaWxlUGF0aCA9IEkxOG5VdGlsLmdldExvY2FsaXplZEZpbGUodXJsLmdldFBhdGgoKSwgbG9jYWxlKTsKLQkJCQlpZiAoZmlsZVBhdGggPT0gbnVsbCAmJiB1c2VEZWZhdWx0KSB7Ci0JCQkJCWZpbGVQYXRoID0gdXJsLmdldFBhdGgoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmlsZVBhdGg7Ci0JfQotCQotLy8JLyoqCi0vLwkgKiBnZXQgdGhlIGxvY2FsaXplZCBmaWxlcyBmb3IgdGhlIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyLiBUaGUgZm9sZGVyIGlzIGEgcmVsYXRpdmUgcGF0aCB0byB0aGUgcGx1Z2luLgotLy8JICogcmV0dXJucyBhIG1hcCBvZiB0aGUgZmlsZXMgKGluIHJhbGl0aXZlIHBhdGggdG8gdGhlIHBsdWdpbikgdG8gdGhlaXIgbG9jYWxpemVkIGZpbGVzIGluIGFic29sdXRlIHBhdGguCi0vLwkgKiBAcGFyYW0gZm9sZGVyIFN0cmluZyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHBsdWdpbgotLy8JICogQHBhcmFtIHJlY3Vyc2l2ZSBib29sZWFuIGlmIHRydWUgcmVjdXJpc2VseSBnZXQgYWxsIGZpbGVzIGluIHN1YiBmb2xkZXJzCi0vLwkgKiBAcmV0dXJuIE1hcCBhIG1hcCBvZiB0aGUgZmlsZXMgKGluIHJhbGl0aXZlIHBhdGggdG8gdGhlIHBsdWdpbikgdG8gdGhlaXIgbG9jYWxpemVkIGZpbGVzIGluIGFic29sdXRlIHBhdGguCi0vLwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0vLwkgKi8KLS8vCXB1YmxpYyBNYXAgZ2V0TG9jYWxpemVkRmlsZXMoU3RyaW5nIGZvbGRlciwgYm9vbGVhbiByZWN1cnNpdmUpIHRocm93cyBJT0V4Y2VwdGlvbgotLy8JewotLy8JCU1hcCBmaWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLS8vCQkKLS8vCQlTdHJpbmcgcGx1Z2luUGF0aCA9IGdldEluc3RhbGxQYXRoKCk7Ci0vLwkJCi0vLwkJTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlGaWxlIGYgPSBuZXcgRmlsZShwbHVnaW5QYXRoLCBmb2xkZXIpOwotLy8JCUZpbGVVdGlsLmdldEFsbEZpbGVzKGYsIGZpbGVzLCB0cnVlKTsKLS8vCi0vLwkJLy8gZm9yIGVhY2ggZmlsZSBmb3VuZCBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlciwgZ2V0IHRoZSBsb2NhbGl6ZWQgZmlsZQotLy8JCS8vIHB1dCBhbiBhbnRyeSBvZiB0aGUgb3JpZ2luYWwgZmlsZSBhbmQgdGhlIGxvY2FsaXplZCBmaWxlCi0vLwkJVVJJIHBsdWdpblVyaSA9IG5ldyBGaWxlKHBsdWdpblBhdGgpLnRvVVJJKCk7Ci0vLwkJCi0vLwkJZm9yICggSXRlcmF0b3IgaXQgPSBmaWxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLS8vCQl7Ci0vLwkJCUZpbGUgc3JjID0gKEZpbGUpaXQubmV4dCgpOwotLy8JCQlTdHJpbmcgcmVsUGF0aCA9IHBsdWdpblVyaS5yZWxhdGl2aXplKHNyYy50b1VSSSgpKS5nZXRQYXRoKCk7Ci0vLwkJCQotLy8JCQkvLyBvbmx5IGdldCB0aGUgbG9jYWxlIHNwZWNpZmljIGZpbGUsIGRvbid0IGluY2x1ZGUgdGhlIGRlZmF1bHQgb25lCi0vLwkJCVN0cmluZyBsb2NhbGl6ZWRGaWxlID0gZ2V0TG9jYWxpemVkRmlsZShyZWxQYXRoLCBmYWxzZSk7Ci0vLwkJCWlmICggbG9jYWxpemVkRmlsZSAhPSBudWxsICkKLS8vCQkJewotLy8JCQkJZmlsZU1hcC5wdXQocmVsUGF0aCwgbG9jYWxpemVkRmlsZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJCi0vLwkJcmV0dXJuIGZpbGVNYXA7Ci0vLwl9Ci0JCi0JLyoqCi0JICogZm9yIHRoZSBnaXZlbiBwYXRoIGluIHRoZSBwbHVnaW4sIGZpbmQgdGhlIGxvY2FsaXplZCBmaWxlcyBmb3JtIHRoZSBubCBmcmFnZW1lbmV0cyAKLQkgKiBhbmQgY29weSB0aGUgbG9jYWxpemVkIGZpbGVzIHRvIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIKLQkgKiBAcGFyYW0gcGF0aCBTdHJpbmcgYSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBwbHVnaW4gcm9vdC4gCi0JICogVGhlIGZpbGVzIGluIHRoaXMgZm9sZGVyIHdpbGwgYmUgaXRlcmF0ZWQgYW5kIHRoZWlyIGxvY2FsaXplZCBmaWxlcyB3aWxsIGJlIGNvcGllZCBvdmVyCi0JICogQHBhcmFtIHRvRGlyIEZJbGUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlciAKLQkgKiBAcGFyYW0gcmVjdXJzaXZlIGJvb2xlYW4gcmVjdXJpdmVseSBsb29raW5nIGZvciBmaWxlcyBpbnQgdGhlIHNwZWNpZmllZCBmb2xkZXIKLQkgKiBAcGFyYW0gdXNlTG9jYWxlRmlsZU5hbWUgYm9vbGVhbiBpZiB0cnVlIHRoZSBsb2NhbGUgc3BlY2lmaWMgZmlsZSBuYW1lcyB3aWxsIGJlIHVzZWQgaW4gdGhlIGNvcGllZCBkZXN0aW5hdGlvbiwgCi0JICogb3RoZXJ3aXNlLCB0aGUgbG9jYWxlIHNwZWNpZmljIGZpbGUgbmFtZSB3aWxsIGJlIHJlbmFtZWQgdG8gdGhlIGRlZmF1bHQgb25lIGluIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY29weUxvY2FsaXplZEZpbGVzKFN0cmluZyBwYXRoLCBGaWxlIHRvRGlyLCBib29sZWFuIHJlY3Vyc2l2ZSwgYm9vbGVhbiB1c2VMb2NhbGVGaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IGdldEluc3RhbGxQYXRoKCk7Ci0JCVVSSSBwbHVnaW5VcmkgPSBuZXcgRmlsZShwbHVnaW5QYXRoKS50b1VSSSgpOwotCSAgICBVUkkgcGF0aFVyaSA9IG5ldyBGaWxlKHBsdWdpblBhdGgsIHBhdGgpLnRvVVJJKCk7Ci0KLQkJTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRmlsZSBmID0gbmV3IEZpbGUocGx1Z2luUGF0aCwgcGF0aCk7Ci0JCUZpbGVVdGlsLmdldEFsbEZpbGVzKGYsIGZpbGVzLCByZWN1cnNpdmUpOwotCi0JCS8vIGZvciBlYWNoIGZpbGUgZm91bmQgaW4gdGhlIHNwZWNpZmllZCBmb2xkZXIsIGdldCB0aGUgbG9jYWxpemVkIGZpbGUKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBmaWxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLQkJewotCQkJVVJJIHNyY1VyaSA9ICgoRmlsZSlpdC5uZXh0KCkpLnRvVVJJKCk7Ci0JCQkKLQkJCS8vIGdldCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZmlsZSB0byB0aGUgcGx1Z2luIHJvb3QsIHRoZW4gZmluZCB0aGUgbG9jYWxpemVkIGZpbGUKLQkJCVN0cmluZyByZWxQYXRoID0gcGx1Z2luVXJpLnJlbGF0aXZpemUoc3JjVXJpKS5nZXRQYXRoKCk7Ci0JCQkKLQkJCS8vIG9ubHkgZ2V0IHRoZSBsb2NhbGUgc3BlY2lmaWMgZmlsZSwgZG9uJ3QgaW5jbHVkZSB0aGUgZGVmYXVsdCBvbmUKLQkJCVN0cmluZyBsb2NhbGl6ZWRGaWxlID0gZ2V0TG9jYWxpemVkRmlsZShyZWxQYXRoLCBmYWxzZSk7Ci0JCQlpZiAoIGxvY2FsaXplZEZpbGUgPT0gbnVsbCApCi0JCQl7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkJCQkKLSAgICAJCS8vIG5lZWQgdG8gY2hhbmdlIHRoZSB0YXJnZXQgZmlsZSBwYXRoIHRvIHJlbGF0aXZlIHRvIHRoZSBwYXRoIGluc3RlYWQgb2YgdGhlIHBsdWdpbiByb290Ci0gICAgCQlyZWxQYXRoID0gcGF0aFVyaS5yZWxhdGl2aXplKHNyY1VyaSkuZ2V0UGF0aCgpOwotICAgIAkJRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUobG9jYWxpemVkRmlsZSk7Ci0gICAgCQlGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0b0RpciwgcmVsUGF0aCk7Ci0gICAgCQlGaWxlIHRhcmdldFBhcmVudCA9IHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotICAgIAkJCi0JCQkvLyBjb3B5IHRoZSBmaWxlIHRvIHRoZSBkZXNpdGluYXRpb24KLQkJCS8vIGlmIHVzZUxvY2FsZUZpbGVOYW1lIGlzIHRydWUsIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG5hbWUgc2hvdWxkIGFsc28gdXNlIHRoZSBsb2NhbGUgc3BlY2lmaWMgZmlsZSBuYW1lCi0gICAgCQlpZiAoIHVzZUxvY2FsZUZpbGVOYW1lICkKLSAgICAJCXsKLSAgICAJCQlTdHJpbmcgZmlsZU5hbWUgPSBzcmNGaWxlLmdldE5hbWUoKTsKLSAgICAJCQl0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0UGFyZW50LCBmaWxlTmFtZSk7Ci0gICAgCQl9Ci0gICAgCQkKLSAgICAJCWlmIChpc0RlYnVnZ2luZygpKSB7Ci0JICAgIAkJU3lzdGVtLm91dC5wcmludGxuKCJDb3B5aW5nIGxvY2FsaXplZCBmaWxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCSAgICAJCVN5c3RlbS5vdXQucHJpbnRsbigiU291cmNlOiAiICsgc3JjRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkgICAgCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRhcmdldDogIiArIHRhcmdldEZpbGUpOyAvLyROT04tTkxTLTEkCi0JICAgIAkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJfQotICAgIAkJCi0gICAgCQl0cnkgewotICAgIAkJCWlmICggIXRhcmdldFBhcmVudC5leGlzdHMoKSApCi0gICAgCQkJewotICAgIAkJCQl0YXJnZXRQYXJlbnQubWtkaXJzKCk7Ci0gICAgCQkJfQotICAgIAkJCQotICAgIAkJCWlmICggIXRhcmdldEZpbGUuZXhpc3RzKCkgKQotICAgIAkJCXsKLSAgICAJCQkJdGFyZ2V0RmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgCQkJfQotICAgIAkJCQotCQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyY0ZpbGUsIHRhcmdldEZpbGUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5LgotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICdbJyArIGtleSArICddJzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbG9jYWxpemVkIG1lc3NhZ2UgZ2l2ZW4gdGhlIHJlc291cmNlIGtleSBhbmQgdGhlCi0JICogbWVzc2FnZSBhcmd1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBhcmd1bWVudAotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2UgYXJndW1lbnQuCi0JICogQHJldHVybiBUaGUgZm9ybWF0dGVkIGxvY2FsaXplZCBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZm9ybWF0TWVzc2FnZShTdHJpbmcga2V5LCBPYmplY3QgYXJndW1lbnQpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIG1zZyA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJCU9iamVjdFtdIGFyZ3VtZW50cyA9IHsgYXJndW1lbnQgfTsKLQkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobXNnLCBhcmd1bWVudHMpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIFVSTCBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCi0JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluJ3Mgcm9vdC4KLQkgKiBAcmV0dXJuIFRoZSBpbWFnZSBVUkwuCi0JICovCi0JcHVibGljIFVSTCBnZXRJbWFnZVVSTChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChpY29uVVJMLCByZWxhdGl2ZVBhdGgpOwotCQkJcmV0dXJuIEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCi0JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluJ3Mgcm9vdC4KLQkgKiBAcmV0dXJuIFRoZSBpbWFnZSBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKGljb25VUkwsIHJlbGF0aXZlUGF0aCk7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZ2l2ZW4gdGhlIHJlbGF0aXZlIHBhdGguCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHJldHVybmVkIGltYWdlIG5lZWQgdG8gYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCi0JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluJ3Mgcm9vdC4KLQkgKiBAcmV0dXJuIFRoZSBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihyZWxhdGl2ZVBhdGgpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWltYWdlID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKGZhbHNlKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW1hZ2UgZ2l2ZW4gdGhlIHJlbGF0aXZlIHBhdGguCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHJldHVybmVkIGltYWdlIHdpbGwgYmUgYXV0b21hdGljYWxseSBmcmVlZCB3aGVuIHRoZSBwbHVnLWluCi0JICogc2h1dHMgZG93bi4KLQkgKiAKLQkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCi0JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluJ3Mgcm9vdC4KLQkgKiBAcmV0dXJuIFRoZSBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0U2hhcmVkSW1hZ2UoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgc2hhcmVkSW1hZ2VzLmdldChyZWxhdGl2ZVBhdGgpOwotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIGltYWdlOwotCQl9Ci0KLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihyZWxhdGl2ZVBhdGgpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWltYWdlID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKGZhbHNlKTsKLQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJc2hhcmVkSW1hZ2VzLnB1dChyZWxhdGl2ZVBhdGgsIGltYWdlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2dnZXIgZ2l2ZW4gdGhlIHBsdWctaW4gSUQuCi0JICogCi0JICogQHJldHVybiBUaGUgbmV3IG9yIGNhY2hlZCBsb2dnZXIuCi0JICovCi0JcHVibGljIExvZ2dlciBnZXRMb2dnZXIoKSB7Ci0JCUxvZ2dlciBsb2dnZXIgPSAoTG9nZ2VyKSBsb2dnZXJzLmdldChwbHVnaW5JZCk7Ci0JCWlmIChsb2dnZXIgPT0gbnVsbCkgewotCQkJbG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKTsKLQkJCWxvZ2dlcnMucHV0KHBsdWdpbklkLCBsb2dnZXIpOwotCQl9Ci0JCXJldHVybiBsb2dnZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVzc2FnZSBkaWFsb2cgZ2l2ZW4gdGhlIHBsdWctaW4gSUQuCi0JICogCi0JICogQHJldHVybiBUaGUgbmV3IG9yIGNhY2hlZCBtZXNzYWdlIGRpYWxvZy4KLQkgKi8KLQlwdWJsaWMgTXNnRGlhbG9nIGdldE1zZ0RpYWxvZygpIHsKLQkJTXNnRGlhbG9nIG1zZ0RpYWxvZyA9IChNc2dEaWFsb2cpIG1zZ0RpYWxvZ3MuZ2V0KHBsdWdpbklkKTsKLQkJaWYgKG1zZ0RpYWxvZyA9PSBudWxsKSB7Ci0JCQltc2dEaWFsb2cgPSBuZXcgTXNnRGlhbG9nKHRoaXMpOwotCQkJbXNnRGlhbG9ncy5wdXQocGx1Z2luSWQsIG1zZ0RpYWxvZyk7Ci0JCX0KLQkJcmV0dXJuIG1zZ0RpYWxvZzsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhbmRhcmQgZGlzcGxheSB0byBiZSB1c2VkLiBUaGUgbWV0aG9kIGZpcnN0IGNoZWNrcywgaWYKLQkgKiB0aGUgdGhyZWFkIGNhbGxpbmcgdGhpcyBtZXRob2QgaGFzIGFuIGFzc29jaWF0ZWQgZGlzYXBseS4gSWYgc28sIHRoaXMKLQkgKiBkaXNwbGF5IGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIG1ldGhvZCByZXR1cm5zIHRoZSBkZWZhdWx0IGRpc3BsYXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFN0YW5kYXJkRGlzcGxheSgpIHsKLQkJRGlzcGxheSBkaXNwbGF5OwotCQlkaXNwbGF5PSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKLQkJCWRpc3BsYXk9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gZGlzcGxheTsJCQotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcGx1Z2luL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wbHVnaW4vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjEyMjY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wbHVnaW4vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgY29tbW9uIHNlcnZpY2VzIGZvciBhY2Nlc3NpbmcgYSBwbHVnLWluJ3MgaW5zdGFsbCBwYXRoLCBpbWFnZXMsIGxvZ2dlciBhbmQgcmVzb3VyY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9EZWJ1Z1RyYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvRGVidWdUcmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzBiYTg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9EZWJ1Z1RyYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eTsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbGl0eSBmb3IgcHJpbnRpbmcgZGVidWcgdHJhY2VzIHRvIHRoZSBjb25zb2xlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlYnVnVHJhY2UgewotCi0JLyoqCi0JICogUHJpbnRzIGEgZGVidWcgdHJhY2UgdG8gdGhlIGNvbnNvbGUuCi0JICogCi0JICogQHBhcmFtIGluc3RhbmNlCi0JICogICAgICAgICAgICBhIGNsYXNzIGluc3RhbmNlCi0JICogQHBhcmFtIG1ldGhvZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgbmFtZQotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIGEgZGVidWcgbWVzc2FnZQotCSAqIEBwYXJhbSB0aAotCSAqICAgICAgICAgICAgYSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBtZXRob2QsIFN0cmluZyBtc2csCi0JCQlUaHJvd2FibGUgdGgpIHsKLQkJU3RyaW5nQnVmZmVyIGRlYnVnTXNnID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkgewotCQkJZGVidWdNc2cuYXBwZW5kKGluc3RhbmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCWRlYnVnTXNnLmFwcGVuZCgnLicpLmFwcGVuZChtZXRob2QpOwotCQkJfQotCQkJZGVidWdNc2cuYXBwZW5kKCI6ICIpOwotCQl9Ci0JCWlmIChtc2cgIT0gbnVsbCAmJiBtc2cubGVuZ3RoKCkgPiAwKSB7Ci0JCQlkZWJ1Z01zZy5hcHBlbmQobXNnKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihkZWJ1Z01zZyk7Ci0JCWlmICh0aCAhPSBudWxsKSB7Ci0JCQl0aC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50cyBhIGRlYnVnIHRyYWNlIHRvIHRoZSBjb25zb2xlLgotCSAqIAotCSAqIEBwYXJhbSBpbnN0YW5jZQotCSAqICAgICAgICAgICAgYSBjbGFzcyBpbnN0YW5jZQotCSAqIEBwYXJhbSBtZXRob2QKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIG5hbWUKLQkgKiBAcGFyYW0gdGgKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnQoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgbWV0aG9kLCBUaHJvd2FibGUgdGgpIHsKLQkJcHJpbnQoaW5zdGFuY2UsIG1ldGhvZCwgbnVsbCwgdGgpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBhIGRlYnVnIHRyYWNlIHRvIHRoZSBjb25zb2xlLgotCSAqIAotCSAqIEBwYXJhbSBpbnN0YW5jZQotCSAqICAgICAgICAgICAgYSBjbGFzcyBpbnN0YW5jZQotCSAqIEBwYXJhbSBtZXRob2QKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIG5hbWUKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBhIGRlYnVnIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnQoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbXNnKSB7Ci0JCXByaW50KGluc3RhbmNlLCBtZXRob2QsIG1zZywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIGEgZGVidWcgdHJhY2UgdG8gdGhlIGNvbnNvbGUuCi0JICogCi0JICogQHBhcmFtIGluc3RhbmNlCi0JICogICAgICAgICAgICBhIGNsYXNzIGluc3RhbmNlCi0JICogQHBhcmFtIG1ldGhvZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBtZXRob2QpIHsKLQkJcHJpbnQoaW5zdGFuY2UsIG1ldGhvZCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIGEgZGVidWcgdHJhY2UgdG8gdGhlIGNvbnNvbGUuCi0JICogCi0JICogQHBhcmFtIHRoCi0JICogICAgICAgICAgICBhIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50KFRocm93YWJsZSB0aCkgewotCQlpZiAodGggIT0gbnVsbCkgewotCQkJdGgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9FUEZWZXJzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvRVBGVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZDdkMDI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9FUEZWZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eTsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNpbmdsZSB2ZXJzaW9uIG9mIEVQRiBDb21wb3Nlci4KLSAqIEl0IGNvbnRhaW5zIGFsbCB0aGUgdmVyc2lvbnMgb2YgdGhlIHN1Yi1jb21wb25lbnRzIG9mIEVQRi4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2ljbmUgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFUEZWZXJzaW9uIHsKLQotCS8vIHRoZSB0b29sIHZlcnNpb24KLQlwcm90ZWN0ZWQgVmVyc2lvbiB0b29sVmVyc2lvbjsKLQkKLQkvLyB0aGUgbGlicmFyeSB2ZXJzaW9uCi0JcHJvdGVjdGVkIFZlcnNpb24gbGlicmFyeVZlcnNpb247Ci0JCi0JLy8gdGhlIHNjaGVtYSB2ZXJzaW9uCi0JcHJvdGVjdGVkIFZlcnNpb24geG1sU2NoZW1hVmVyc2lvbjsKLQkKLQkKLQlwdWJsaWMgRVBGVmVyc2lvbigpIHsKLQkJdGhpcy50b29sVmVyc2lvbiA9IFZlcnNpb24uZW1wdHlWZXJzaW9uOwotCQl0aGlzLmxpYnJhcnlWZXJzaW9uID0gVmVyc2lvbi5lbXB0eVZlcnNpb247Ci0JCXRoaXMueG1sU2NoZW1hVmVyc2lvbiA9IFZlcnNpb24uZW1wdHlWZXJzaW9uOwotCX07Ci0JCi0JcHVibGljIEVQRlZlcnNpb24oU3RyaW5nIHRvb2xWZXJzaW9uLCBTdHJpbmcgbGlicmFyeVZlcnNpb24sIFN0cmluZyB4bWxTY2hlbWFWZXJzaW9uKSB7Ci0JCXRoaXMudG9vbFZlcnNpb24gPSBuZXcgVmVyc2lvbih0b29sVmVyc2lvbik7Ci0JCXRoaXMubGlicmFyeVZlcnNpb24gPSBuZXcgVmVyc2lvbihsaWJyYXJ5VmVyc2lvbik7Ci0JCXRoaXMueG1sU2NoZW1hVmVyc2lvbiA9IG5ldyBWZXJzaW9uKHhtbFNjaGVtYVZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHRvb2wgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBWZXJzaW9uIGdldFRvb2xWZXJzaW9uKCkgewotCQlyZXR1cm4gdG9vbFZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbGlicmFyeSB2ZXJzaW9uCi0JICovCi0JcHVibGljIFZlcnNpb24gZ2V0TGlicmFyeVZlcnNpb24oKSB7Ci0JCXJldHVybiBsaWJyYXJ5VmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBYTUwgc2NoZW1hIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgVmVyc2lvbiBnZXRYTUxTY2hlbWFWZXJzaW9uKCkgewotCQlyZXR1cm4geG1sU2NoZW1hVmVyc2lvbjsKLQl9Ci0JCi0JLyoqCi0JICogQ29tcGFyZXMgdGhlIGdpdmVuIHRvb2wgdmVyc2lvbiB0byB0aGlzIG9uZQotCSAqIAotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb24jY29tcGFyZVRvKCkKLQkgKiAKLQkgKiBAcGFyYW0gc2NoZW1hVmVyc2lvbiBUaGUgc2NoZW1hIHZlcnNpb24gdG8gYmUgY29tcGFyZWQuCi0JICogQHJldHVybiBBIG5lZ2F0aXZlIGludGVnZXIgaWYgdGhpcyB0b29sIHZlcnNpb24gaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBvbmU8YnIgLz4KLQkgKiBaZXJvIGlmIHRoZSB0aGlzIHRvb2wgdmVyc2lvbiBpcyB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gb25lPGJyIC8+Ci0JICogQSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgdG9vbCB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gb25lPGJyIC8+Ci0JICogCi0JICovCi0JcHVibGljIGludCBjb21wYXJlVG9vbFZlcnNpb25UbyhWZXJzaW9uIHRvb2xWZXJzaW9uKSB7Ci0JCWlmICghVmVyc2lvblV0aWwuaXNWZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCgpKQotCQkJcmV0dXJuIGdldFRvb2xWZXJzaW9uKCkuY29tcGFyZVRvKHRvb2xWZXJzaW9uKTsKLQkJZWxzZSAKLQkJCXJldHVybiAwOwotCX0KLQkKLQkvKioKLQkgKiBDb21wYXJlcyB0aGUgZ2l2ZW4gbGlicmFyeSB2ZXJzaW9uIHRvIHRoaXMgb25lCi0JICogCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbiNjb21wYXJlVG8oKQotCSAqIAotCSAqIEBwYXJhbSBzY2hlbWFWZXJzaW9uIFRoZSBzY2hlbWEgdmVyc2lvbiB0byBiZSBjb21wYXJlZC4KLQkgKiBAcmV0dXJuIEEgbmVnYXRpdmUgaW50ZWdlciBpZiB0aGlzIGxpYnJhcnkgdmVyc2lvbiBpcyBsZXNzIHRoYW4gdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIFplcm8gaWYgdGhlIHRoaXMgbGlicmFyeSB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBnaXZlbiBvbmU8YnIgLz4KLQkgKiBBIHBvc2l0aXZlIGludGVnZXIgaWYgdGhpcyBsaWJyYXJ5IHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBvbmU8YnIgLz4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmVMaWJyYXJ5VmVyc2lvblRvKFZlcnNpb24gbGlicmFyeVZlcnNpb24pIHsKLQkJaWYgKCFWZXJzaW9uVXRpbC5pc1ZlcnNpb25DaGVja2luZ0Rpc2FibGVkKCkpCi0JCQlyZXR1cm4gZ2V0TGlicmFyeVZlcnNpb24oKS5jb21wYXJlVG8obGlicmFyeVZlcnNpb24pOwotCQllbHNlIAotCQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogQ29tcGFyZXMgdGhlIGdpdmVuIFhNTCBTY2hlbWEgdmVyc2lvbiB0byB0aGlzIG9uZQotCSAqIAotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb24jY29tcGFyZVRvKCkKLQkgKiAKLQkgKiBAcGFyYW0gc2NoZW1hVmVyc2lvbiBUaGUgc2NoZW1hIHZlcnNpb24gdG8gYmUgY29tcGFyZWQuCi0JICogQHJldHVybiBBIG5lZ2F0aXZlIGludGVnZXIgaWYgdGhpcyBYTUwgU2NoZW1hIHZlcnNpb24gaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBvbmU8YnIgLz4KLQkgKiBaZXJvIGlmIHRoZSB0aGlzIFhNTCBTY2hlbWEgdmVyc2lvbiBpcyB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gb25lPGJyIC8+Ci0JICogQSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgWE1MIFNjaGVtYSB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gb25lPGJyIC8+Ci0JICogCi0JICovCi0JcHVibGljIGludCBjb21wYXJlWE1MU2NoZW1hVmVyc2lvblRvKFZlcnNpb24gWE1MU2NoZW1hVmVyc2lvbikgewotCQlpZiAoIVZlcnNpb25VdGlsLmlzVmVyc2lvbkNoZWNraW5nRGlzYWJsZWQoKSkKLQkJCXJldHVybiBnZXRYTUxTY2hlbWFWZXJzaW9uKCkuY29tcGFyZVRvKFhNTFNjaGVtYVZlcnNpb24pOwotCQllbHNlIAotCQkJcmV0dXJuIDA7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRUb29sVmVyc2lvbigpLnRvU3RyaW5nKCkgKyAiLCIgKyAvLyROT04tTkxTLTEkCi0JCWdldExpYnJhcnlWZXJzaW9uKCkudG9TdHJpbmcoKSArICIsIiArIC8vJE5PTi1OTFMtMSQKLQkJZ2V0WE1MU2NoZW1hVmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gdGhpcykgeyAvLyBxdWlja3Rlc3QKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRVBGVmVyc2lvbikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUVQRlZlcnNpb24gb3RoZXIgPSAoRVBGVmVyc2lvbikgb2JqZWN0OwotCQlyZXR1cm4gKGdldFRvb2xWZXJzaW9uKCkuZXF1YWxzKG90aGVyLmdldFRvb2xWZXJzaW9uKCkpKSAmJiAoZ2V0TGlicmFyeVZlcnNpb24oKS5lcXVhbHMob3RoZXIuZ2V0TGlicmFyeVZlcnNpb24oKSkpCi0JCQkJJiYgKGdldFhNTFNjaGVtYVZlcnNpb24oKS5lcXVhbHMob3RoZXIuZ2V0WE1MU2NoZW1hVmVyc2lvbigpKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0VQRlZlcnNpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvRVBGVmVyc2lvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWY2MGQ5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvRVBGVmVyc2lvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHN0b3JlcyBhbGwgb2YgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBrbm93biBFUEYgdmVyc2lvbnMuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRVBGVmVyc2lvbnMgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfSUQgPSAiZXBmIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vdGhlIG5hbWUgc3BhY2UgVVJJIHN0cmluZyBmb3IgdGhlIFRPT0xfSUQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbnNVcmkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBFUEYgMS4wCi0JcHJpdmF0ZSBzdGF0aWMgRVBGVmVyc2lvbiBFUEZfMTAgPSAKLQkJbmV3IEVQRlZlcnNpb24oIjEuMCIsIC8vJE5PTi1OTFMtMSQgIHRvb2wgdmVyc2lvbgotCQkJCSIxLjAuMy4wIiwgLy8kTk9OLU5MUy0xJCAgbGlicmFyeSB2ZXJzaW9uCi0JCQkJIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQgIHhtbCBzY2hlbWEgdmVyc2lvbgotCi0JLy8gRVBGIDEuMSAtIFRoaXMgaXMgRVBGIDEuMiBJdGVyYXRpb24gMQotCXByaXZhdGUgc3RhdGljIEVQRlZlcnNpb24gRVBGXzExID0gCi0JbmV3IEVQRlZlcnNpb24oIjEuMSIsIC8vJE5PTi1OTFMtMSQgIHRvb2wgdmVyc2lvbgotCQkJIjEuMC40LjAiLCAvLyROT04tTkxTLTEkICBsaWJyYXJ5IHZlcnNpb24KLQkJCSIxLjAuMCIpOyAvLyROT04tTkxTLTEkICB4bWwgc2NoZW1hIHZlcnNpb24KLQotCS8vIEVQRiAxLjIKLQlwcml2YXRlIHN0YXRpYyBFUEZWZXJzaW9uIEVQRl8xMiA9IAotCW5ldyBFUEZWZXJzaW9uKCIxLjIiLCAvLyROT04tTkxTLTEkICB0b29sIHZlcnNpb24KLQkJCSIxLjAuNC4wIiwgLy8kTk9OLU5MUy0xJCAgbGlicmFyeSB2ZXJzaW9uCi0JCQkiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJCAgeG1sIHNjaGVtYSB2ZXJzaW9uCi0KLQlwcml2YXRlIHN0YXRpYyBFUEZWZXJzaW9uIGN1cnJlbnRWZXJzaW9uID0gRVBGXzExOwotCQotCXB1YmxpYyBFUEZWZXJzaW9uIGdldEN1cnJlbnRWZXJzaW9uKCkgewotCQlyZXR1cm4gY3VycmVudFZlcnNpb247Ci0JfQotCQotCXB1YmxpYyBFUEZWZXJzaW9uIGdldFZlcnNpb24oU3RyaW5nIHRvb2xWZXJzaW9uKSB7Ci0JCWlmICh0b29sVmVyc2lvbiAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRBbGxWZXJzaW9ucygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRVBGVmVyc2lvbiB2ZXIgPSAoRVBGVmVyc2lvbilpdGVyLm5leHQoKTsKLQkJCQlpZiAodmVyLmdldFRvb2xWZXJzaW9uKCkuZXF1YWxzKG5ldyBWZXJzaW9uKHRvb2xWZXJzaW9uKSkpIHsKLQkJCQkJcmV0dXJuIHZlcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFsbFZlcnNpb25zKCkgewotCQlMaXN0IHZlcnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQl2ZXJzaW9ucy5hZGQoRVBGXzEwKTsKLQkJdmVyc2lvbnMuYWRkKEVQRl8xMSk7Ci0JCXJldHVybiB2ZXJzaW9uczsKLQl9Ci0JCi0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeVZlcnNpb24KLQkgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIHRvb2wgdmVyc2lvbiB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBsaWJyYXJ5IHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgRVBGVmVyc2lvbiBnZXRNaW5Ub29sVmVyc2lvbkZvckxpYnJhcnlWZXJzaW9uKFZlcnNpb24gbGlicmFyeVZlcnNpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0QWxsVmVyc2lvbnMoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJRVBGVmVyc2lvbiB2ZXJzaW9uSW5mbyA9IChFUEZWZXJzaW9uKWl0ZXIubmV4dCgpOwotCQkJaWYgKHZlcnNpb25JbmZvLmdldExpYnJhcnlWZXJzaW9uKCkuY29tcGFyZVRvKGxpYnJhcnlWZXJzaW9uKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIHZlcnNpb25JbmZvOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIHRvb2wgdmVyc2lvbiB0aGF0IHVzZXMgdGhlIGN1cnJlbnQgbGlicmFyeSB2ZXJzaW9uCi0JICovCi0JcHVibGljIEVQRlZlcnNpb24gZ2V0TWluVG9vbFZlcnNpb25Gb3JDdXJyZW50TGlicmFyeVZlcnNpb24oKSB7Ci0JCVZlcnNpb24gbGlicmFyeVZlcnNpb24gPSBnZXRDdXJyZW50VmVyc2lvbigpLmdldExpYnJhcnlWZXJzaW9uKCk7Ci0JCXJldHVybiBnZXRNaW5Ub29sVmVyc2lvbkZvckxpYnJhcnlWZXJzaW9uKGxpYnJhcnlWZXJzaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0geG1sU2NoZW1hVmVyc2lvbgotCSAqIEByZXR1cm4gdGhlIG1pbmltdW0gdG9vbCB2ZXJzaW9uIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkIFhNTCBTY2hlbWEgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBFUEZWZXJzaW9uIGdldE1pblRvb2xWZXJzaW9uRm9yWE1MU2NoZW1hVmVyc2lvbihWZXJzaW9uIHhtbFNjaGVtYVZlcnNpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0QWxsVmVyc2lvbnMoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJRVBGVmVyc2lvbiB2ZXJzaW9uSW5mbyA9IChFUEZWZXJzaW9uKWl0ZXIubmV4dCgpOwotCQkJaWYgKHZlcnNpb25JbmZvLmdldFhNTFNjaGVtYVZlcnNpb24oKS5jb21wYXJlVG8oeG1sU2NoZW1hVmVyc2lvbikgPT0gMCkgewotCQkJCXJldHVybiB2ZXJzaW9uSW5mbzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgbWluaW11bSB0b29sIHZlcnNpb24gdGhhdCB1c2VzIHRoZSBjdXJyZW50IFhNTCBTY2hlbWEgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBFUEZWZXJzaW9uIGdldE1pblRvb2xWZXJzaW9uRm9yQ3VycmVudFhNTFNjaGVtYVZlcnNpb24oKSB7Ci0JCVZlcnNpb24geG1sU2NoZW1hVmVyc2lvbiA9IGdldEN1cnJlbnRWZXJzaW9uKCkuZ2V0WE1MU2NoZW1hVmVyc2lvbigpOwotCQlyZXR1cm4gZ2V0TWluVG9vbFZlcnNpb25Gb3JYTUxTY2hlbWFWZXJzaW9uKHhtbFNjaGVtYVZlcnNpb24pOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIHNwYWNlIFVSSSBzdHJpbmcgZm9yIHRoZSBUT09MX0lECi0JICovCi0JcHVibGljIFN0cmluZyBnZXROc1VSSSgpIHsKLQkJcmV0dXJuIG5zVXJpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0Vycm9yRGlhbG9nTm9SZWFzb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9FcnJvckRpYWxvZ05vUmVhc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2NjE5NjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0Vycm9yRGlhbG9nTm9SZWFzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSWNvbkFuZE1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogRGlzcGxheXMgYW4gZXJyb3IgZGlhbG9nIHdpdGhvdXQgdGhlIERldGFpbHMgYnV0dG9uLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVycm9yRGlhbG9nTm9SZWFzb24gZXh0ZW5kcyBJY29uQW5kTWVzc2FnZURpYWxvZyB7Ci0KLQkvKioKLQkgKiBTdGF0aWMgdG8gcHJldmVudCBvcGVuaW5nIG9mIGVycm9yIGRpYWxvZ3MgZm9yIGF1dG9tYXRlZCB0ZXN0aW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBBVVRPTUFURURfTU9ERSA9IGZhbHNlOwotCi0JLyoqCi0JICogUmVzZXJ2ZSByb29tIGZvciB0aGlzIG1hbnkgbGlzdCBpdGVtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9JVEVNX0NPVU5UID0gNzsKLQotCS8qKgotCSAqIFRoZSBuZXN0aW5nIGluZGVudC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVTVElOR19JTkRFTlQgPSAiICAiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgRGV0YWlscyBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBkZXRhaWxzQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0KLQkvKioKLQkgKiBUaGUgU1dUIGxpc3QgY29udHJvbCB0aGF0IGRpc3BsYXlzIHRoZSBlcnJvciBkZXRhaWxzLgotCSAqLwotCXByaXZhdGUgTGlzdCBsaXN0OwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVycm9yIGRldGFpbHMgdmlld2VyIGlzIGN1cnJlbnRseSBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsaXN0Q3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogRmlsdGVyIG1hc2sgZm9yIGRldGVybWluaW5nIHdoaWNoIHN0YXR1cyBpdGVtcyB0byBkaXNwbGF5LgotCSAqLwotCXByaXZhdGUgaW50IGRpc3BsYXlNYXNrID0gMHhGRkZGOwotCi0JLyoqCi0JICogVGhlIG1haW4gc3RhdHVzIG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzOwotCi0JLyoqCi0JICogVGhlIGN1cnJlbnQgY2xpcGJvYXJkLiBUbyBiZSBkaXNwb3NlZCB3aGVuIGNsb3NpbmcgdGhlIGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIENsaXBib2FyZCBjbGlwYm9hcmQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkSW5jbHVkZVRvcExldmVsRXJyb3JJbkRldGFpbHMgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZXJyb3IgZGlhbG9nLiBOb3RlIHRoYXQgdGhlIGRpYWxvZyB3aWxsIGhhdmUgbm8gdmlzdWFsCi0JICogcmVwcmVzZW50YXRpb24gKG5vIHdpZGdldHMpIHVudGlsIGl0IGlzIHRvbGQgdG8gb3Blbi4KLQkgKiA8cD4KLQkgKiBOb3JtYWxseSBvbmUgc2hvdWxkIHVzZSA8Y29kZT5vcGVuRXJyb3I8L2NvZGU+IHRvIGNyZWF0ZSBhbmQgb3BlbiBvbmUKLQkgKiBvZiB0aGVzZS4gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgb25seSBpZiB0aGUgZXJyb3Igb2JqZWN0IGJlaW5nCi0JICogZGlzcGxheWVkIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQgPC9pdD4geW91IG5lZWQgdG8gc3BlY2lmeSBhIG1hc2sKLQkgKiB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlIGNoaWxkcmVuLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiAgICAgICAgICAgIHRoZSBzaGVsbCB1bmRlciB3aGljaCB0byBjcmVhdGUgdGhpcyBkaWFsb2cKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLQkgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0JICogQHBhcmFtIGRpc3BsYXlNYXNrCi0JICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcwotCSAqICAgICAgICAgICAgcGVyIDxjb2RlPklTdGF0dXMubWF0Y2hlczwvY29kZT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI21hdGNoZXMoaW50KQotCSAqLwotCXB1YmxpYyBFcnJvckRpYWxvZ05vUmVhc29uKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsCi0JCQlTdHJpbmcgbWVzc2FnZSwgSVN0YXR1cyBzdGF0dXMsIGludCBkaXNwbGF5TWFzaykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMudGl0bGUgPSBkaWFsb2dUaXRsZSA9PSBudWxsID8gSkZhY2VSZXNvdXJjZXMKLQkJCQkuZ2V0U3RyaW5nKCJQcm9ibGVtX09jY3VycmVkIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZGlhbG9nVGl0bGU7Ci0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgPT0gbnVsbCA/IHN0YXR1cy5nZXRNZXNzYWdlKCkgOiBtZXNzYWdlOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuc3RhdHVzID0gc3RhdHVzOwotCQl0aGlzLmRpc3BsYXlNYXNrID0gZGlzcGxheU1hc2s7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuIEhhbmRsZXMgdGhlIHByZXNzaW5nIG9mIHRoZSBPawotCSAqIG9yIERldGFpbHMgYnV0dG9uIGluIHRoaXMgZGlhbG9nLiBJZiB0aGUgT2sgYnV0dG9uIHdhcyBwcmVzc2VkIHRoZW4gY2xvc2UKLQkgKiB0aGlzIGRpYWxvZy4gSWYgdGhlIERldGFpbHMgYnV0dG9uIHdhcyBwcmVzc2VkIHRoZW4gdG9nZ2xlIHRoZSBkaXNwbGF5aW5nCi0JICogb2YgdGhlIGVycm9yIGRldGFpbHMgYXJlYS4gTm90ZSB0aGF0IHRoZSBEZXRhaWxzIGJ1dHRvbiB3aWxsIG9ubHkgYmUKLQkgKiB2aXNpYmxlIGlmIHRoZSBlcnJvciBiZWluZyBkaXNwbGF5ZWQgc3BlY2lmaWVzIGNoaWxkIGRldGFpbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgaWQpIHsKLQkJaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCkgewotCQkJLy8gd2FzIHRoZSBkZXRhaWxzIGJ1dHRvbiBwcmVzc2VkPwotCQkJdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmJ1dHRvblByZXNzZWQoaWQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBXaW5kb3cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KHRpdGxlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIE9LIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQkJaWYgKHNob3VsZFNob3dEZXRhaWxzQnV0dG9uKCkpIHsKLQkJCWRldGFpbHNCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0JCQkJCUlEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5EaWFsb2c8L2NvZGU+IGZyYW1ld29yayBtZXRob2QgY3JlYXRlcwotCSAqIGFuZCBsYXlzIG91dCBhIGNvbXBvc2l0ZSBhbmQgY2FsbHMgPGNvZGU+Y3JlYXRlTWVzc2FnZUFyZWE8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmNyZWF0ZUN1c3RvbUFyZWE8L2NvZGU+IHRvIHBvcHVsYXRlIGl0LiBTdWJjbGFzc2VzIHNob3VsZAotCSAqIG92ZXJyaWRlIDxjb2RlPmNyZWF0ZUN1c3RvbUFyZWE8L2NvZGU+IHRvIGFkZCBjb250ZW50cyBiZWxvdyB0aGUKLQkgKiBtZXNzYWdlLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVNZXNzYWdlQXJlYShwYXJlbnQpOwotCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBzdGFuZGFyZCBtYXJnaW5zIGFuZCBzcGFjaW5nCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBjaGlsZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY2hpbGREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoY2hpbGREYXRhKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEljb25BbmRNZXNzYWdlRGlhbG9nI2NyZWF0ZURpYWxvZ0FuZEJ1dHRvbkFyZWEoQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURpYWxvZ0FuZEJ1dHRvbkFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVEaWFsb2dBbmRCdXR0b25BcmVhKHBhcmVudCk7Ci0JCWlmICh0aGlzLmRpYWxvZ0FyZWEgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLQkJCS8vIENyZWF0ZSBhIGxhYmVsIGlmIHRoZXJlIGFyZSBubyBjaGlsZHJlbiB0byBmb3JjZSBhIHNtYWxsZXIgbGF5b3V0Ci0JCQlDb21wb3NpdGUgZGlhbG9nQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgZGlhbG9nQXJlYTsKLQkJCWlmIChkaWFsb2dDb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPT0gMCkKLQkJCQluZXcgTGFiZWwoZGlhbG9nQ29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSWNvbkFuZE1lc3NhZ2VEaWFsb2cjZ2V0SW1hZ2UoKQotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQotCQkJCXJldHVybiBnZXRXYXJuaW5nSW1hZ2UoKTsKLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLklORk8pCi0JCQkJcmV0dXJuIGdldEluZm9JbWFnZSgpOwotCQl9Ci0JCS8vIElmIGl0IHdhcyBub3QgYSB3YXJuaW5nIG9yIGFuIGVycm9yIHRoZW4gcmV0dXJuIHRoZSBlcnJvciBpbWFnZQotCQlyZXR1cm4gZ2V0RXJyb3JJbWFnZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGlzIGRpYWxvZydzIGRyb3AtZG93biBsaXN0IGNvbXBvbmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIGRyb3AtZG93biBsaXN0IGNvbXBvbmVudAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZURyb3BEb3duTGlzdChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSB0aGUgbGlzdAotCQlsaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMCi0JCQkJfCBTV1QuTVVMVEkpOwotCQkvLyBmaWxsIHRoZSBsaXN0Ci0JCXBvcHVsYXRlTGlzdChsaXN0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwKLQkJCQl8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBsaXN0LmdldEl0ZW1IZWlnaHQoKSAqIExJU1RfSVRFTV9DT1VOVDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGlzdC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlNZW51IGNvcHlNZW51ID0gbmV3IE1lbnUobGlzdCk7Ci0JCU1lbnVJdGVtIGNvcHlJdGVtID0gbmV3IE1lbnVJdGVtKGNvcHlNZW51LCBTV1QuTk9ORSk7Ci0JCWNvcHlJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCS8qCi0JCQkgKiBAc2VlIFNlbGVjdGlvbkxpc3RlbmVyLndpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNvcHlUb0NsaXBib2FyZCgpOwotCQkJfQotCi0JCQkvKgotCQkJICogQHNlZSBTZWxlY3Rpb25MaXN0ZW5lci53aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY29weVRvQ2xpcGJvYXJkKCk7Ci0JCQl9Ci0JCX0pOwotCQljb3B5SXRlbS5zZXRUZXh0KEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiY29weSIpKTsgLy8kTk9OLU5MUy0xJAotCQlsaXN0LnNldE1lbnUoY29weU1lbnUpOwotCQlsaXN0Q3JlYXRlZCA9IHRydWU7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotCSAqLwotCS8qKgotCSAqIEV4dGVuZHMgPGNvZGU+V2luZG93Lm9wZW4oKTwvY29kZT4uIE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0byBkaXNwbGF5Ci0JICogdGhlIGVycm9yLiBJZiB5b3Ugc3BlY2lmaWVkIGEgbWFzayB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UKLQkgKiBjaGlsZHJlbiwgdGhlIGVycm9yIGRpYWxvZyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIGF0IGxlYXN0Ci0JICogb25lIGNoaWxkIHN0YXR1cyBtYXRjaGluZyB0aGUgbWFzay4KLQkgKi8KLQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCWlmICghQVVUT01BVEVEX01PREUgJiYgc2hvdWxkRGlzcGxheShzdGF0dXMsIGRpc3BsYXlNYXNrKSkgewotCQkJcmV0dXJuIHN1cGVyLm9wZW4oKTsKLQkJfQotCQlzZXRSZXR1cm5Db2RlKE9LKTsKLQkJcmV0dXJuIE9LOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0byBkaXNwbGF5IHRoZSBnaXZlbiBlcnJvci4gVXNlIHRoaXMgbWV0aG9kIGlmIHRoZQotCSAqIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQgZG9lcyBub3QgY29udGFpbiBjaGlsZCBpdGVtcywgb3IgaWYgeW91IHdpc2gKLQkgKiB0byBkaXNwbGF5IGFsbCBzdWNoIGl0ZW1zIHdpdGhvdXQgZmlsdGVyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZQotCSAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotCSAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLQkgKiBAcmV0dXJuIHRoZSBjb2RlIG9mIHRoZSBidXR0b24gdGhhdCB3YXMgcHJlc3NlZCB0aGF0IHJlc3VsdGVkIGluIHRoaXMKLQkgKiAgICAgICAgIGRpYWxvZyBjbG9zaW5nLiBUaGlzIHdpbGwgYmUgPGNvZGU+RGlhbG9nLk9LPC9jb2RlPiBpZiB0aGUgT0sKLQkgKiAgICAgICAgIGJ1dHRvbiB3YXMgcHJlc3NlZCwgb3IgPGNvZGU+RGlhbG9nLkNBTkNFTDwvY29kZT4gaWYgdGhpcwotCSAqICAgICAgICAgZGlhbG9nJ3MgY2xvc2Ugd2luZG93IGRlY29yYXRpb24gb3IgdGhlIEVTQyBrZXkgd2FzIHVzZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgb3BlbkVycm9yKFNoZWxsIHBhcmVudCwgU3RyaW5nIGRpYWxvZ1RpdGxlLAotCQkJU3RyaW5nIG1lc3NhZ2UsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCXJldHVybiBvcGVuRXJyb3IocGFyZW50LCBkaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBJU3RhdHVzLk9LCi0JCQkJfCBJU3RhdHVzLklORk8gfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhbiBlcnJvciBkaWFsb2cgdG8gZGlzcGxheSB0aGUgZ2l2ZW4gZXJyb3IuIFVzZSB0aGlzIG1ldGhvZCBpZiB0aGUKLQkgKiBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQgPC9pdD4geW91IHdpc2gKLQkgKiB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlCi0JICogY2hpbGRyZW4uIFRoZSBlcnJvciBkaWFsb2cgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpZiB0aGVyZSBpcyBhdCBsZWFzdAotCSAqIG9uZSBjaGlsZCBzdGF0dXMgbWF0Y2hpbmcgdGhlIG1hc2suCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLQkgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0JICogQHBhcmFtIGRpc3BsYXlNYXNrCi0JICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcwotCSAqICAgICAgICAgICAgcGVyIDxjb2RlPklTdGF0dXMubWF0Y2hlczwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBjb2RlIG9mIHRoZSBidXR0b24gdGhhdCB3YXMgcHJlc3NlZCB0aGF0IHJlc3VsdGVkIGluIHRoaXMKLQkgKiAgICAgICAgIGRpYWxvZyBjbG9zaW5nLiBUaGlzIHdpbGwgYmUgPGNvZGU+RGlhbG9nLk9LPC9jb2RlPiBpZiB0aGUgT0sKLQkgKiAgICAgICAgIGJ1dHRvbiB3YXMgcHJlc3NlZCwgb3IgPGNvZGU+RGlhbG9nLkNBTkNFTDwvY29kZT4gaWYgdGhpcwotCSAqICAgICAgICAgZGlhbG9nJ3MgY2xvc2Ugd2luZG93IGRlY29yYXRpb24gb3IgdGhlIEVTQyBrZXkgd2FzIHVzZWQuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNtYXRjaGVzKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBvcGVuRXJyb3IoU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwKLQkJCVN0cmluZyBtZXNzYWdlLCBJU3RhdHVzIHN0YXR1cywgaW50IGRpc3BsYXlNYXNrKSB7Ci0JCUVycm9yRGlhbG9nTm9SZWFzb24gZGlhbG9nID0gbmV3IEVycm9yRGlhbG9nTm9SZWFzb24ocGFyZW50U2hlbGwsCi0JCQkJdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIGxpc3QgdXNpbmcgdGhpcyBlcnJvciBkaWFsb2cncyBzdGF0dXMgb2JqZWN0LiBUaGlzIHdhbGtzCi0JICogdGhlIGNoaWxkIHN0YXRpYyBvZiB0aGUgc3RhdHVzIG9iamVjdCBhbmQgZGlzcGxheXMgdGhlbSBpbiBhIGxpc3QuIFRoZQotCSAqIGZvcm1hdCBmb3IgZWFjaCBlbnRyeSBpcyBzdGF0dXNfcGF0aCA6IHN0YXR1c19tZXNzYWdlIElmIHRoZSBzdGF0dXMncwotCSAqIHBhdGggd2FzIG51bGwgdGhlbiBpdCAoYW5kIHRoZSBjb2xvbikgYXJlIG9taXR0ZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RUb1BvcHVsYXRlCi0JICogICAgICAgICAgICBUaGUgbGlzdCB0byBmaWxsLgotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUxpc3QoTGlzdCBsaXN0VG9Qb3B1bGF0ZSkgewotCQlwb3B1bGF0ZUxpc3QobGlzdFRvUG9wdWxhdGUsIHN0YXR1cywgMCwKLQkJCQlzaG91bGRJbmNsdWRlVG9wTGV2ZWxFcnJvckluRGV0YWlscyk7Ci0JfQotCi0JLyoqCi0JICogUG9wdWxhdGUgdGhlIGxpc3Qgd2l0aCB0aGUgbWVzc2FnZXMgZnJvbSB0aGUgZ2l2ZW4gc3RhdHVzLiBUcmF2ZXJzZSB0aGUKLQkgKiBjaGlsZHJlbiBvZiB0aGUgc3RhdHVzIGRlZXBseSBhbmQgYWxzbyB0cmF2ZXJzZSBDb3JlRXhjZXB0aW9ucyB0aGF0Ci0JICogYXBwZWFyIGluIHRoZSBzdGF0dXMuCi0JICogCi0JICogQHBhcmFtIGxpc3RUb1BvcHVsYXRlCi0JICogICAgICAgICAgICB0aGUgbGlzdCB0byBwb3B1bGF0ZQotCSAqIEBwYXJhbSBidWlsZGluZ1N0YXR1cwotCSAqICAgICAgICAgICAgdGhlIHN0YXR1cyBiZWluZyBkaXNwbGF5ZWQKLQkgKiBAcGFyYW0gbmVzdGluZwotCSAqICAgICAgICAgICAgdGhlIG5lc3RpbmcgbGV2ZWwgKGluY3JlYXNlcyBvbmUgbGV2ZWwgZm9yIGVhY2ggbGV2ZWwgb2YKLQkgKiAgICAgICAgICAgIGNoaWxkcmVuKQotCSAqIEBwYXJhbSBpbmNsdWRlU3RhdHVzCi0JICogICAgICAgICAgICB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIGJ1aWxkaW5nU3RhdHVzIGluIHRoZSBkaXNwbGF5IG9yIGp1c3QKLQkgKiAgICAgICAgICAgIGl0cyBjaGlsZHJlbgotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUxpc3QoTGlzdCBsaXN0VG9Qb3B1bGF0ZSwgSVN0YXR1cyBidWlsZGluZ1N0YXR1cywKLQkJCWludCBuZXN0aW5nLCBib29sZWFuIGluY2x1ZGVTdGF0dXMpIHsKLQotCQlpZiAoIWJ1aWxkaW5nU3RhdHVzLm1hdGNoZXMoZGlzcGxheU1hc2spKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlUaHJvd2FibGUgdCA9IGJ1aWxkaW5nU3RhdHVzLmdldEV4Y2VwdGlvbigpOwotCQlib29sZWFuIGlzQ29yZUV4Y2VwdGlvbiA9IHQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uOwotCQlib29sZWFuIGluY3JlbWVudE5lc3RpbmcgPSBmYWxzZTsKLQotCQlpZiAoaW5jbHVkZVN0YXR1cykgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0aW5nOyBpKyspIHsKLQkJCQlzYi5hcHBlbmQoTkVTVElOR19JTkRFTlQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IGJ1aWxkaW5nU3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCXNiLmFwcGVuZChtZXNzYWdlKTsKLQkJCWxpc3RUb1BvcHVsYXRlLmFkZChzYi50b1N0cmluZygpKTsKLQkJCWluY3JlbWVudE5lc3RpbmcgPSB0cnVlOwotCQl9Ci0KLQkJaWYgKCFpc0NvcmVFeGNlcHRpb24gJiYgdCAhPSBudWxsKSB7Ci0JCQkvLyBJbmNsdWRlIGxvdy1sZXZlbCBleGNlcHRpb24gbWVzc2FnZQotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0aW5nOyBpKyspIHsKLQkJCQlzYi5hcHBlbmQoTkVTVElOR19JTkRFTlQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IHQuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkKLQkJCQltZXNzYWdlID0gdC50b1N0cmluZygpOwotCi0JCQlzYi5hcHBlbmQobWVzc2FnZSk7Ci0JCQlsaXN0VG9Qb3B1bGF0ZS5hZGQoc2IudG9TdHJpbmcoKSk7Ci0JCQlpbmNyZW1lbnROZXN0aW5nID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChpbmNyZW1lbnROZXN0aW5nKQotCQkJbmVzdGluZysrOwotCi0JCS8vIExvb2sgZm9yIGEgbmVzdGVkIGNvcmUgZXhjZXB0aW9uCi0JCWlmIChpc0NvcmVFeGNlcHRpb24pIHsKLQkJCUNvcmVFeGNlcHRpb24gY2UgPSAoQ29yZUV4Y2VwdGlvbikgdDsKLQkJCUlTdGF0dXMgZVN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotCQkJLy8gT25seSBwcmludCB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgaWYgaXQgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGUKLQkJCS8vIHBhcmVudCBtZXNzYWdlCi0JCQlpZiAobWVzc2FnZSA9PSBudWxsIHx8IG1lc3NhZ2UuaW5kZXhPZihlU3RhdHVzLmdldE1lc3NhZ2UoKSkgPT0gLTEpIHsKLQkJCQlwb3B1bGF0ZUxpc3QobGlzdFRvUG9wdWxhdGUsIGVTdGF0dXMsIG5lc3RpbmcsIHRydWUpOwotCQkJfQotCQl9Ci0KLQkJLy8gTG9vayBmb3IgY2hpbGQgc3RhdHVzCi0JCUlTdGF0dXNbXSBjaGlsZHJlbiA9IGJ1aWxkaW5nU3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXBvcHVsYXRlTGlzdChsaXN0VG9Qb3B1bGF0ZSwgY2hpbGRyZW5baV0sIG5lc3RpbmcsIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBzdGF0dXMgb2JqZWN0IHNob3VsZCBiZSBkaXNwbGF5ZWQuCi0JICogCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgYSBzdGF0dXMgb2JqZWN0Ci0JICogQHBhcmFtIG1hc2sKLQkgKiAgICAgICAgICAgIGEgbWFzayBhcyBwZXIgPGNvZGU+SVN0YXR1cy5tYXRjaGVzPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHN0YXR1cyBzaG91bGQgYmUgZGlzcGxheWVkLCBhbmQKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI21hdGNoZXMoaW50KQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBzaG91bGREaXNwbGF5KElTdGF0dXMgc3RhdHVzLCBpbnQgbWFzaykgewotCQlJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4ubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBzdGF0dXMubWF0Y2hlcyhtYXNrKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW5baV0ubWF0Y2hlcyhtYXNrKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgdW5mb2xkaW5nIG9mIHRoZSBkZXRhaWxzIGFyZWEuIFRoaXMgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyCi0JICogcHJlc3NpbmcgdGhlIGRldGFpbHMgYnV0dG9uLgotCSAqLwotCXByaXZhdGUgdm9pZCB0b2dnbGVEZXRhaWxzQXJlYSgpIHsKLQkJUG9pbnQgd2luZG93U2l6ZSA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotCQlQb2ludCBvbGRTaXplID0gZ2V0U2hlbGwoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlpZiAobGlzdENyZWF0ZWQpIHsKLQkJCWxpc3QuZGlzcG9zZSgpOwotCQkJbGlzdENyZWF0ZWQgPSBmYWxzZTsKLQkJCWRldGFpbHNCdXR0b24uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCk7Ci0JCX0gZWxzZSB7Ci0JCQlsaXN0ID0gY3JlYXRlRHJvcERvd25MaXN0KChDb21wb3NpdGUpIGdldENvbnRlbnRzKCkpOwotCQkJZGV0YWlsc0J1dHRvbi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuSElERV9ERVRBSUxTX0xBQkVMKTsKLQkJfQotCQlQb2ludCBuZXdTaXplID0gZ2V0U2hlbGwoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlnZXRTaGVsbCgpCi0JCQkJLnNldFNpemUoCi0JCQkJCQluZXcgUG9pbnQod2luZG93U2l6ZS54LCB3aW5kb3dTaXplLnkKLQkJCQkJCQkJKyAobmV3U2l6ZS55IC0gb2xkU2l6ZS55KSkpOwotCX0KLQotCS8qKgotCSAqIFB1dCB0aGUgZGV0YWlscyBvZiB0aGUgc3RhdHVzIG9mIHRoZSBlcnJvciBvbnRvIHRoZSBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIGJ1aWxkaW5nU3RhdHVzCi0JICogQHBhcmFtIGJ1ZmZlcgotCSAqIEBwYXJhbSBuZXN0aW5nCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29weUJ1ZmZlcihJU3RhdHVzIGJ1aWxkaW5nU3RhdHVzLAotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IG5lc3RpbmcpIHsKLQkJaWYgKCFidWlsZGluZ1N0YXR1cy5tYXRjaGVzKGRpc3BsYXlNYXNrKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGluZzsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKE5FU1RJTkdfSU5ERU5UKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoYnVpbGRpbmdTdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIExvb2sgZm9yIGEgbmVzdGVkIGNvcmUgZXhjZXB0aW9uCi0JCVRocm93YWJsZSB0ID0gYnVpbGRpbmdTdGF0dXMuZ2V0RXhjZXB0aW9uKCk7Ci0JCWlmICh0IGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJQ29yZUV4Y2VwdGlvbiBjZSA9IChDb3JlRXhjZXB0aW9uKSB0OwotCQkJcG9wdWxhdGVDb3B5QnVmZmVyKGNlLmdldFN0YXR1cygpLCBidWZmZXIsIG5lc3RpbmcgKyAxKTsKLQkJfQotCi0JCUlTdGF0dXNbXSBjaGlsZHJlbiA9IGJ1aWxkaW5nU3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXBvcHVsYXRlQ29weUJ1ZmZlcihjaGlsZHJlbltpXSwgYnVmZmVyLCBuZXN0aW5nICsgMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgc3RhdHVzZXMgdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29weVRvQ2xpcGJvYXJkKCkgewotCQlpZiAoY2xpcGJvYXJkICE9IG51bGwpCi0JCQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCQlTdHJpbmdCdWZmZXIgc3RhdHVzQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlwb3B1bGF0ZUNvcHlCdWZmZXIoc3RhdHVzLCBzdGF0dXNCdWZmZXIsIDApOwotCQljbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKGxpc3QuZ2V0RGlzcGxheSgpKTsKLQkJY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBPYmplY3RbXSB7IHN0YXR1c0J1ZmZlci50b1N0cmluZygpIH0sCi0JCQkJbmV3IFRyYW5zZmVyW10geyBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY2xvc2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQlpZiAoY2xpcGJvYXJkICE9IG51bGwpCi0JCQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBTaG93IHRoZSBkZXRhaWxzIHBvcnRpb24gb2YgdGhlIGRpYWxvZyBpZiBpdCBpcyBub3QgYWxyZWFkeSB2aXNpYmxlLiBUaGlzCi0JICogbWV0aG9kIHdpbGwgb25seSB3b3JrIHdoZW4gaXQgaXMgaW52b2tlZCBhZnRlciB0aGUgY29udHJvbCBvZiB0aGUgZGlhbG9nCi0JICogaGFzIGJlZW4gc2V0LiBJbiBvdGhlciB3b3JkcywgYWZ0ZXIgdGhlIDxjb2RlPmNyZWF0ZUNvbnRlbnRzPC9jb2RlPgotCSAqIG1ldGhvZCBoYXMgYmVlbiBpbnZva2VkIGFuZCBoYXMgcmV0dXJuZWQgdGhlIGNvbnRyb2wgZm9yIHRoZSBjb250ZW50IGFyZWEKLQkgKiBvZiB0aGUgZGlhbG9nLiBJbnZva2luZyB0aGUgbWV0aG9kIGJlZm9yZSB0aGUgY29udGVudCBhcmVhIGhhcyBiZWVuIHNldAotCSAqIG9yIGFmdGVyIHRoZSBkaWFsb2cgaGFzIGJlZW4gZGlzcG9zZWQgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2hvd0RldGFpbHNBcmVhKCkgewotCQlpZiAoIWxpc3RDcmVhdGVkKSB7Ci0JCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250ZW50cygpOwotCQkJaWYgKGNvbnRyb2wgIT0gbnVsbCAmJiAhY29udHJvbC5pc0Rpc3Bvc2VkKCkpCi0JCQkJdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBEZXRhaWxzIGJ1dHRvbiBzaG91bGQgYmUgaW5jbHVkZWQuIFRoaXMgbWV0aG9kIGlzCi0JICogaW52b2tlZCBvbmNlIHdoZW4gdGhlIGRpYWxvZyBpcyBidWlsdC4gQnkgZGVmYXVsdCwgdGhlIERldGFpbHMgYnV0dG9uIGlzCi0JICogb25seSBpbmNsdWRlZCBpZiB0aGUgc3RhdHVzIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgZGlhbG9nIHdhcyBhCi0JICogbXVsdGktc3RhdHVzIG9yIGlmIHRoZSBzdGF0dXMgY29udGFpbnMgYW4gZXhjZXB0aW9uLiBTdWJjbGFzc2VzIG1heQotCSAqIG92ZXJyaWRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgRGV0YWlscyBidXR0b24gc2hvdWxkIGJlIGluY2x1ZGVkCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNob3dEZXRhaWxzQnV0dG9uKCkgewotCQlyZXR1cm4gc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSB8fCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHN0YXR1cyBkaXNwbGF5ZWQgYnkgdGhpcyBlcnJvciBkaWFsb2cgdG8gdGhlIGdpdmVuIHN0YXR1cy4gVGhpcwotCSAqIG9ubHkgYWZmZWN0cyB0aGUgc3RhdHVzIGRpc3BsYXllZCBieSB0aGUgRGV0YWlscyBsaXN0LiBUaGUgbWVzc2FnZSwgaW1hZ2UKLQkgKiBhbmQgdGl0bGUgc2hvdWxkIGJlIHVwZGF0ZWQgYnkgdGhlIHN1YmNsYXNzLCBpZiBkZXNpcmVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIHRoZSBzdGF0dXMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBkZXRhaWxzIGxpc3QKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmICh0aGlzLnN0YXR1cyAhPSBzdGF0dXMpIHsKLQkJCXRoaXMuc3RhdHVzID0gc3RhdHVzOwotCQl9Ci0JCXNob3VsZEluY2x1ZGVUb3BMZXZlbEVycm9ySW5EZXRhaWxzID0gdHJ1ZTsKLQkJaWYgKGxpc3RDcmVhdGVkKSB7Ci0JCQlyZXBvcHVsYXRlTGlzdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3B1bGF0ZSB0aGUgc3VwcGxpZWQgbGlzdCB3aWRnZXQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlcG9wdWxhdGVMaXN0KCkgewotCQlpZiAobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRGlzcG9zZWQoKSkgewotCQkJbGlzdC5yZW1vdmVBbGwoKTsKLQkJCXBvcHVsYXRlTGlzdChsaXN0KTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9JTGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0lMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4MjgzZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0lMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5WZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHBlcmZvcm1pbmcgbWV0aG9kIGxpYnJhcnkgdmVyc2lvbiBjaGVjay4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlFeHRlbnNpb25WZXJzaW9uQ2hlY2sgewotCi0JLyoqCi0JICogQ2hlY2tzIGFuZCByZXR1cm5zIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIG1ldGhvZAotCSAqIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkgWE1JIGZpbGUKLQkgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBsaWJyYXJ5IFhNSSBmaWxlIGRvZXMgbm90IGNvbnRhaW4gdGhlCi0JICogICAgICAgICB2ZXJzaW9uIGluZm9ybWF0aW9uIG9mIHRoZSB0b29sIHRoYXQgY3JlYXRlZCBpdDsgb3IKLQkgKiAgICAgICAgIDxjb2RlPlZlcnNpb25DaGVja0luZm88L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBWZXJzaW9uQ2hlY2tJbmZvIGNoZWNrTGlicmFyeVZlcnNpb24oRmlsZSBsaWJQYXRoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0xvZ2dlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMDM4Zjg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbjsKLQotLyoqCi0gKiBHZW5lcmljIGxvZ2dlciB1c2VkIGZvciBsb2dnaW5nIHN0YXR1cyBtZXNzYWdlcywgd2FybmluZyBtZXNzYWdlcywgZXJyb3IKLSAqIG1lc3NhZ2VzLCBhbmQgZXhjZXB0aW9uIHN0YWNrIHRyYWNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCi0JLy8gVGhlIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBBYnN0cmFjdFBsdWdpbiBwbHVnaW47Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRC4KLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyA8Y29kZT5Mb2dnZXI8L2NvZGU+IGdpdmVuIHRoZSBwbHVnLWluIGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExvZ2dlcihBYnN0cmFjdFBsdWdpbiBwbHVnaW4pIHsKLQkJdGhpcy5wbHVnaW4gPSBwbHVnaW47Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW4uZ2V0SWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtc2cpIHsKLQkJbG9nTXNnKElTdGF0dXMuRVJST1IsIG1zZywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihUaHJvd2FibGUgZXgpIHsKLQkJbG9nTXNnKElTdGF0dXMuRVJST1IsIG51bGwsIGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtc2csIFRocm93YWJsZSBleCkgewotCQlsb2dNc2coSVN0YXR1cy5FUlJPUiwgbXNnLCBleCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSB3YXJuaW5nIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbXNnKSB7Ci0JCWxvZ01zZyhJU3RhdHVzLldBUk5JTkcsIG1zZywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpIHsKLQkJbG9nTXNnKElTdGF0dXMuV0FSTklORywgbXNnLCBleCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gc3RhdHVzIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgc3RhdHVzIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbXNnKSB7Ci0JCWxvZ01zZyhJU3RhdHVzLklORk8sIG1zZywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqICAgICAgICAgICAgVGhlIHNldmVyaXR5LgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbG9nTXNnKGludCBzZXZlcml0eSwgU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KSB7Ci0JCWlmIChtc2cgPT0gbnVsbCAmJiBleCAhPSBudWxsKSB7Ci0JCQltc2cgPSBleC5nZXRNZXNzYWdlKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBwbHVnaW5JZCwgSVN0YXR1cy5PSywgbXNnLCBleCk7Ci0KLQkJLy8gQ2FsbCB0aGUgRWNsaXBzZSBMb2dnZXIuCi0JCXBsdWdpbi5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvTXNnQm94LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvTXNnQm94LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmYzE1MjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L01zZ0JveC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gZGlzcGxheSBhIG1lc3NhZ2UgYm94LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNc2dCb3ggewotCS8qKgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byBzaG93IGVycm9yIG1lc3NhZ2UgaWYgeW91IGRvbid0IHdhbnQgbG9uZyBwYXRoIHRvIGJlCi0JICogY3V0IG9mZi4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIG5hdGl2ZVNob3dFcnJvcihTaGVsbCBzaGVsbCwgU3RyaW5nIG1zZykgewotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJc2hlbGwgPSBnZXREZWZhdWx0U2hlbGwoKTsKLQkJCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCU1lc3NhZ2VCb3ggbXNnQm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5PSyB8IFNXVC5JQ09OX0VSUk9SKTsKLQkJbXNnQm94LnNldE1lc3NhZ2UobXNnKTsKLQkJbXNnQm94LnNldFRleHQoc2hlbGwuZ2V0VGV4dCgpKTsKLQkJbXNnQm94Lm9wZW4oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2hvd0Vycm9yKFN0cmluZyBtc2cpIHsKLQkJc2hvd0Vycm9yKGdldERlZmF1bHRTaGVsbCgpLCBtc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzaG93RXJyb3IoU2hlbGwgc2hlbGwsIFN0cmluZyBtc2cpIHsKLQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBzaGVsbCA9PSBudWxsID8gbnVsbCA6IHNoZWxsCi0JCQkJLmdldFRleHQoKSwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2hvd1dhcm5pbmcoU3RyaW5nIG1zZykgewotCQlzaG93V2FybmluZyhnZXREZWZhdWx0U2hlbGwoKSwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2hvd1dhcm5pbmcoU2hlbGwgc2hlbGwsIFN0cmluZyBtc2cpIHsKLQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoc2hlbGwsIHNoZWxsID09IG51bGwgPyBudWxsIDogc2hlbGwKLQkJCQkuZ2V0VGV4dCgpLCBtc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2hlbGwgZ2V0RGVmYXVsdFNoZWxsKCkgewotCQl0cnkgewotCQkJRGlzcGxheSBkID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQlpZiAoZCA9PSBudWxsKSB7Ci0JCQkJZCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJfQotCi0JCQlTaGVsbCBzID0gbnVsbDsKLQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQlzID0gZC5nZXRBY3RpdmVTaGVsbCgpOwotCQkJfQotCi0JCQlyZXR1cm4gczsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGlzcGxheSBnZXREaXNwbGF5KCkgewotCQl0cnkgewotCQkJRGlzcGxheSBkID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQlpZiAoZCA9PSBudWxsKSB7Ci0JCQkJZCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJfQotCi0JCQlyZXR1cm4gZDsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb21wdChTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBwcm9tcHQoZ2V0RGVmYXVsdFNoZWxsKCksIG1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvbXB0KFNoZWxsIHNoZWxsLCBTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBwcm9tcHQoc2hlbGwsIG51bGwsIG1zZywgU1dULllFUyB8IFNXVC5OTyB8IFNXVC5DQU5DRUwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb21wdChTdHJpbmcgbXNnLCBpbnQgYnV0dG9ucykgewotCQlyZXR1cm4gcHJvbXB0KGdldERlZmF1bHRTaGVsbCgpLCBudWxsLCBtc2csIGJ1dHRvbnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb21wdChTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIGludCBidXR0b25zKSB7Ci0JCXJldHVybiBwcm9tcHQoZ2V0RGVmYXVsdFNoZWxsKCksIHRpdGxlLCBtc2csIGJ1dHRvbnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb21wdChTaGVsbCBzaGVsbCwgU3RyaW5nIG1zZywgaW50IGJ1dHRvbnMpIHsKLQkJcmV0dXJuIHByb21wdChzaGVsbCwgbnVsbCwgbXNnLCBidXR0b25zKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9tcHQoU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywKLQkJCWludCBidXR0b25zKSB7Ci0JCU1lc3NhZ2VCb3ggbXNnQm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIGJ1dHRvbnMgfCBTV1QuSUNPTl9RVUVTVElPTik7Ci0JCW1zZ0JveC5zZXRUZXh0KHRpdGxlICE9IG51bGwgJiYgdGl0bGUubGVuZ3RoKCkgPiAwID8gdGl0bGUgOiBzaGVsbAotCQkJCS5nZXRUZXh0KCkpOwotCQltc2dCb3guc2V0TWVzc2FnZShtc2cpOwotCQlyZXR1cm4gbXNnQm94Lm9wZW4oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9Nc2dEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9Nc2dEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmViZDU2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvTXNnRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEEgbWVzc2FnZSBkaWFsb2cgdXNlZCBmb3IgZGlzcGxheWluZyBlcnJvciwgd2FybmluZywgY29uZmlybWF0aW9uIG9yCi0gKiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1zZ0RpYWxvZyB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIEFic3RyYWN0UGx1Z2luIHBsdWdpbjsKLQotCS8vIFRoZSBwbHVnLWluIElELgotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCi0JLy8gVGhlIHBsdWctaW4gbG9nZ2VyLgotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBUaGUgcGx1Z2luIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNc2dEaWFsb2coQWJzdHJhY3RQbHVnaW4gcGx1Z2luKSB7Ci0JCXRoaXMucGx1Z2luID0gcGx1Z2luOwotCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luLmdldElkKCk7Ci0JCXRoaXMubG9nZ2VyID0gcGx1Z2luLmdldExvZ2dlcigpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGFuIGVycm9yIGRpYWxvZyB3aXRob3V0IHRoZSBlcnJvcgotCSAqIHJlYXNvbiBhbmQgRGV0YWlscyBidXR0b24uCi0JICogPHA+Ci0JICogTm90ZTogVGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5FUlJPUiwgdGl0bGUsIG1zZywgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UgaW4gYW4gZXJyb3IgZGlhbG9nIHdpdGhvdXQgdGhlIGVycm9yCi0JICogcmVhc29uIGFuZCBEZXRhaWxzIGJ1dHRvbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4gdG8KLQkgKiB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5FUlJPUiwgdGl0bGUsIG1zZywgbnVsbCwgbnVsbCwgZXgpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGFuIGVycm9yIGRpYWxvZyB3aXRob3V0IHRoZSBEZXRhaWxzCi0JICogYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHJlYXNvbgotCSAqICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhlIGVycm9yLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24pIHsKLQkJZGlzcGxheShJU3RhdHVzLkVSUk9SLCB0aXRsZSwgbXNnLCByZWFzb24sIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGFuIGVycm9yIGRpYWxvZyB3aXRob3V0IHRoZSBEZXRhaWxzCi0JICogYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHdpbGwgYmUgd3JpdHRlbiB0bwotCSAqIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgZXJyb3IuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwKLQkJCVRocm93YWJsZSBleCkgewotCQlkaXNwbGF5KElTdGF0dXMuRVJST1IsIHRpdGxlLCBtc2csIHJlYXNvbiwgbnVsbCwgZXgpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGFuIGVycm9yIGRpYWxvZy4gVGhlIERldGFpbHMgYnV0dG9uCi0JICogd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIDxjb2RlPmRldGFpbHM8L2NvZGU+IHBhcmFtZXRlciBpdCBub3QgbnVsbCBvcgotCSAqIGVtcHR5LgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHJlYXNvbgotCSAqICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhlIGVycm9yLgotCSAqIEBwYXJhbSBkZXRhaWxzCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgZGV0YWlscy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLAotCQkJU3RyaW5nIGRldGFpbHMpIHsKLQkJZGlzcGxheShJU3RhdHVzLkVSUk9SLCB0aXRsZSwgbXNnLCByZWFzb24sIGRldGFpbHMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGFuIGVycm9yIGRpYWxvZy4gVGhlIERldGFpbHMgYnV0dG9uCi0JICogd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIDxjb2RlPmRldGFpbHM8L2NvZGU+IHBhcmFtZXRlciBpdCBub3QgbnVsbCBvcgotCSAqIGVtcHR5LgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHdpbGwgYmUgd3JpdHRlbiB0bwotCSAqIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgZXJyb3IuCi0JICogQHBhcmFtIGRldGFpbHMKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBkZXRhaWxzLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQlTdHJpbmcgZGV0YWlscywgVGhyb3dhYmxlIGV4KSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5FUlJPUiwgdGl0bGUsIG1zZywgcmVhc29uLCBkZXRhaWxzLCBleCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGVycm9yIHN0YXR1cyBpbiBhbiBlcnJvciBkaWFsb2cuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuIHRvCi0JICogdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBzdGF0dXMuCi0JICovCi0JcHVibGljIGludCBkaXNwbGF5RXJyb3IoU3RyaW5nIHRpdGxlLCBJU3RhdHVzIHN0YXR1cykgewotCQlyZXR1cm4gZGlzcGxheSh0aXRsZSwgbnVsbCwgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3Igc3RhdHVzIGluIGFuIGVycm9yIGRpYWxvZy4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4gdG8KLQkgKiB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgaW50IGRpc3BsYXlFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIElTdGF0dXMgc3RhdHVzKSB7Ci0JCXJldHVybiBkaXNwbGF5KHRpdGxlLCBtc2csIHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIHdhcm5pbmcgbWVzc2FnZSBpbiBhIHdhcm5pbmcgZGlhbG9nIHdpdGhvdXQgdGhlCi0JICogd2FybmluZyByZWFzb24gYW5kIERldGFpbHMgYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB3YW5pbmcgbWVzc2FnZSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgd2FybmluZyBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJZGlzcGxheShJU3RhdHVzLldBUk5JTkcsIHRpdGxlLCBtc2csIG51bGwsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiB3YXJuaW5nIG1lc3NhZ2UgaW4gYSB3YXJuaW5nIGRpYWxvZyB3aXRob3V0IHRoZQotCSAqIHdhcm5pbmcgcmVhc29uIGFuZCBEZXRhaWxzIGJ1dHRvbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgd2FybmluZyBtZXNzYWdlIGFuZCB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHdpbGwgYmUgd3JpdHRlbgotCSAqIHRvIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIHdhcm5pbmcgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSB3YXJuaW5nIG1lc3NhZ2UuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2FybmluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFRocm93YWJsZSBleCkgewotCQlkaXNwbGF5KElTdGF0dXMuV0FSTklORywgdGl0bGUsIG1zZywgbnVsbCwgbnVsbCwgZXgpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiB3YXJuaW5nIG1lc3NhZ2UgaW4gYSB3YXJuaW5nIGRpYWxvZyB3aXRob3V0IHRoZQotCSAqIHdhcm5pbmcgcmVhc29uIGFuZCBEZXRhaWxzIGJ1dHRvbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgd2FuaW5nIG1lc3NhZ2Ugd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIHdhcm5pbmcgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSB3YXJuaW5nIG1lc3NhZ2UuCi0JICogQHBhcmFtIHJlYXNvbgotCSAqICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhlIHdhcm5pbmcuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uKSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5XQVJOSU5HLCB0aXRsZSwgbXNnLCByZWFzb24sIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiB3YXJuaW5nIG1lc3NhZ2UgaW4gYSB3YXJuaW5nIGRpYWxvZyB3aXRob3V0IHRoZQotCSAqIHdhcm5pbmcgcmVhc29uIGFuZCBEZXRhaWxzIGJ1dHRvbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgd2FybmluZyBtZXNzYWdlIGFuZCB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHdpbGwgYmUgd3JpdHRlbgotCSAqIHRvIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIHdhcm5pbmcgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSB3YXJuaW5nIG1lc3NhZ2UuCi0JICogQHBhcmFtIHJlYXNvbgotCSAqICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhlIHdhcm5pbmcuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2FybmluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQlUaHJvd2FibGUgZXgpIHsKLQkJZGlzcGxheShJU3RhdHVzLldBUk5JTkcsIHRpdGxlLCBtc2csIHJlYXNvbiwgbnVsbCwgZXgpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiB3YXJuaW5nIG1lc3NhZ2UgaW4gYSB3YXJuaW5nIGRpYWxvZy4gVGhlIERldGFpbHMKLQkgKiBidXR0b24gd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIDxjb2RlPmRldGFpbHM8L2NvZGU+IHBhcmFtZXRlciBpdCBub3QKLQkgKiBudWxsIG9yIGVtcHR5LgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB3YW5pbmcgbWVzc2FnZSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSB3YXJuaW5nIG1lc3NhZ2UuCi0JICogQHBhcmFtIHJlYXNvbgotCSAqICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhlIHdhcm5pbmcuCi0JICogQHBhcmFtIGRldGFpbHMKLQkgKiAgICAgICAgICAgIFRoZSB3YXJuaW5nIGRldGFpbHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLAotCQkJU3RyaW5nIGRldGFpbHMpIHsKLQkJZGlzcGxheShJU3RhdHVzLldBUk5JTkcsIHRpdGxlLCBtc2csIHJlYXNvbiwgZGV0YWlscywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIHdhcm5pbmcgbWVzc2FnZSBpbiBhIHdhcm5pbmcgZGlhbG9nLiBUaGUgRGV0YWlscwotCSAqIGJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgPGNvZGU+ZGV0YWlsczwvY29kZT4gcGFyYW1ldGVyIGl0IG5vdAotCSAqIG51bGwgb3IgZW1wdHkuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHdhcm5pbmcgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4KLQkgKiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgd2FybmluZy4KLQkgKiBAcGFyYW0gZGV0YWlscwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgZGV0YWlscy4KLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXJuaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwKLQkJCVN0cmluZyBkZXRhaWxzLCBUaHJvd2FibGUgZXgpIHsKLQkJZGlzcGxheShJU3RhdHVzLldBUk5JTkcsIHRpdGxlLCBtc2csIHJlYXNvbiwgZGV0YWlscywgZXgpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiB3YXJuaW5nIHN0YXR1cyBpbiBhbiBlcnJvciBkaWFsb2cuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHdhcm5pbmcgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4KLQkgKiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhTdHJpbmcgdGl0bGUsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWRpc3BsYXkodGl0bGUsIG51bGwsIHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIHdhcm5pbmcgc3RhdHVzIGluIGFuIGVycm9yIGRpYWxvZy4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgd2FybmluZyBtZXNzYWdlIGFuZCB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHdpbGwgYmUgd3JpdHRlbgotCSAqIHRvIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogICAgICAgICAgICBUaGUgZXJyb3Igc3RhdHVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJZGlzcGxheSh0aXRsZSwgbXNnLCBzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2UgaW4gYW4gZXJyb3Igb3Igd2FybmluZwotCSAqIGRpYWxvZy4gVGhlIERldGFpbHMgYnV0dG9uIHdpbGwgYmUgZGlzcGxheWVkIGlmIHRoZSA8Y29kZT5kZXRhaWxzPC9jb2RlPgotCSAqIHBhcmFtZXRlciBpdCBub3QgbnVsbCBvciBlbXB0eS4KLQkgKiAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkgKiAgICAgICAgICAgIFRoZSBzZXZlcml0eSwgZWl0aGVyIElTdGF0dXMuRVJST1Igb3IgSVN0YXR1cy5XQVJOSU5HLgotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLgotCSAqIEBwYXJhbSByZWFzb24KLQkgKiAgICAgICAgICAgIFRoZSByZWFzb24gZm9yIHRoZSBlcnJvci4KLQkgKiBAcGFyYW0gZGV0YWlscwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIGRldGFpbHMuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRpc3BsYXkoaW50IHNldmVyaXR5LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csCi0JCQlTdHJpbmcgcmVhc29uLCBTdHJpbmcgZGV0YWlscywgVGhyb3dhYmxlIGV4KSB7Ci0JCWlmIChtc2cgPT0gbnVsbCAmJiBleCAhPSBudWxsKSB7Ci0JCQltc2cgPSBleC5nZXRNZXNzYWdlKCk7Ci0JCX0KLQotCQlpZiAobXNnID09IG51bGwpIHsKLQkJCW1zZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUiB8fCBzZXZlcml0eSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCWxvZ2dlci5sb2dNc2coc2V2ZXJpdHksIG1zZywgZXgpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJInNldmVyaXR5IGFyZ3VtZW50IG11c3QgYmUgSVN0YXR1cy5FUlJPUiBvciBJU3RhdHVzLldBUk5JTkciKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nCi0JCQkJLmdldERlZmF1bHRJbWFnZSgpOwotCQlJbWFnZSBzaGVsbEltYWdlID0gZ2V0U2hlbGxJbWFnZSgpOwotCQlpZiAoc2hlbGxJbWFnZSAhPSBudWxsKSB7Ci0JCQlFcnJvckRpYWxvZy5zZXREZWZhdWx0SW1hZ2Uoc2hlbGxJbWFnZSk7Ci0JCX0KLQotCQlTaGVsbCBzaGVsbCA9IHBsdWdpbi5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQotCQlpZiAoZGV0YWlscyAhPSBudWxsICYmIGRldGFpbHMubGVuZ3RoKCkgPiAwKSB7Ci0JCQlNdWx0aVN0YXR1cyBtU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKHBsdWdpbklkLCBJU3RhdHVzLk9LLCByZWFzb24sCi0JCQkJCWV4KTsKLQkJCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBwbHVnaW5JZCwgSVN0YXR1cy5PSywgZGV0YWlscywKLQkJCQkJZXgpOwotCQkJbVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCW9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbXNnLAotCQkJCQltU3RhdHVzKTsKLQkJfSBlbHNlIGlmIChyZWFzb24gIT0gbnVsbCAmJiByZWFzb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgcGx1Z2luSWQsIElTdGF0dXMuT0ssIHJlYXNvbiwKLQkJCQkJZXgpOwotCQkJb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtc2csCi0JCQkJCXN0YXR1cyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCVdyYXBwZWRNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1zZyk7Ci0JCQl9IGVsc2UgaWYgKHNldmVyaXR5ID09IElTdGF0dXMuV0FSTklORykgewotCQkJCVdyYXBwZWRNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKHNoZWxsLCB0aXRsZSwgbXNnKTsKLQkJCX0KLQkJfQotCi0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nLnNldERlZmF1bHRJbWFnZShvbGRJbWFnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlIGluIGFuIGVycm9yIG9yIHdhcm5pbmcKLQkgKiBkaWFsb2cuIFRoZSBEZXRhaWxzIGJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgPGNvZGU+ZGV0YWlsczwvY29kZT4KLQkgKiBwYXJhbWV0ZXIgaXQgbm90IG51bGwgb3IgZW1wdHkuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBkaXNwbGF5KFN0cmluZyB0aXRsZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJcmV0dXJuIGRpc3BsYXkodGl0bGUsIG51bGwsIHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGVycm9yIG9yIHdhcm5pbmcgbWVzc2FnZSBpbiBhbiBlcnJvciBvciB3YXJuaW5nCi0JICogZGlhbG9nLiBUaGUgRGV0YWlscyBidXR0b24gd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIDxjb2RlPmRldGFpbHM8L2NvZGU+Ci0JICogcGFyYW1ldGVyIGl0IG5vdCBudWxsIG9yIGVtcHR5LgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLgotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBzdGF0dXMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgZGlzcGxheShTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic3RhdHVzIGFyZ3VtZW50IGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJfQotCQlpZiAobXNnID09IG51bGwpIHsKLQkJCW1zZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLQkJaWYgKHNldmVyaXR5ID09IElTdGF0dXMuRVJST1IgfHwgc2V2ZXJpdHkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQlsb2dnZXIubG9nTXNnKHNldmVyaXR5LCBtc2csIHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7Ci0JCX0KLQotCQlJbWFnZSBvbGRJbWFnZSA9IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2cKLQkJCQkuZ2V0RGVmYXVsdEltYWdlKCk7Ci0JCUltYWdlIHNoZWxsSW1hZ2UgPSBnZXRTaGVsbEltYWdlKCk7Ci0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nLnNldERlZmF1bHRJbWFnZShzaGVsbEltYWdlKTsKLQkJfQotCi0JCVNoZWxsIHNoZWxsID0gcGx1Z2luLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCi0JCWludCByYyA9IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwKLQkJCQltc2csIHN0YXR1cyk7Ci0KLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cuc2V0RGVmYXVsdEltYWdlKG9sZEltYWdlKTsKLQkJfQotCi0JCXJldHVybiByYzsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gbWVzc2FnZSBpbiBhIGluZm9ybWF0aW9uYWwgZGlhbG9nIHdpdGggYW4gIk9LIiBidXR0b24uCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBpbmZvcm1hdGlvbiBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5SW5mbyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBXcmFwcGVkTWVzc2FnZURpYWxvZy5nZXREZWZhdWx0SW1hZ2UoKTsKLQkJSW1hZ2Ugc2hlbGxJbWFnZSA9IGdldFNoZWxsSW1hZ2UoKTsKLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cuc2V0RGVmYXVsdEltYWdlKHNoZWxsSW1hZ2UpOwotCQl9Ci0KLQkJU2hlbGwgc2hlbGwgPSBwbHVnaW4uZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCVdyYXBwZWRNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihzaGVsbCwgdGl0bGUsIG1zZyk7Ci0KLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cuc2V0RGVmYXVsdEltYWdlKG9sZEltYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBtZXNzYWdlIGluIGEgcXVlc3Rpb24gZGlhbG9nIHdpdGggYSAiWWVzIiBhbmQgIk5vIgotCSAqIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGluZm9ybWF0aW9uIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc3BsYXlQcm9tcHQoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUltYWdlIG9sZEltYWdlID0gV3JhcHBlZE1lc3NhZ2VEaWFsb2cuZ2V0RGVmYXVsdEltYWdlKCk7Ci0JCUltYWdlIHNoZWxsSW1hZ2UgPSBnZXRTaGVsbEltYWdlKCk7Ci0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCVdyYXBwZWRNZXNzYWdlRGlhbG9nLnNldERlZmF1bHRJbWFnZShzaGVsbEltYWdlKTsKLQkJfQotCi0JCVNoZWxsIHNoZWxsID0gcGx1Z2luLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlib29sZWFuIHJlc3VsdCA9IFdyYXBwZWRNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihzaGVsbCwgdGl0bGUsIG1zZyk7Ci0KLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cuc2V0RGVmYXVsdEltYWdlKG9sZEltYWdlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIG1lc3NhZ2UgaW4gYSBjb25maXJtYXRpb24gZGlhbG9nIHdpdGggYSAiWWVzIiBhbmQKLQkgKiAiQ2FuY2VsIiBidXR0b24uCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBpbmZvcm1hdGlvbiBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNwbGF5Q29uZmlybWF0aW9uKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQlpZiAobXNnID09IG51bGwpIHsKLQkJCW1zZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJbWFnZSBvbGRJbWFnZSA9IFdyYXBwZWRNZXNzYWdlRGlhbG9nLmdldERlZmF1bHRJbWFnZSgpOwotCQlJbWFnZSBzaGVsbEltYWdlID0gZ2V0U2hlbGxJbWFnZSgpOwotCQlpZiAoc2hlbGxJbWFnZSAhPSBudWxsKSB7Ci0JCQlXcmFwcGVkTWVzc2FnZURpYWxvZy5zZXREZWZhdWx0SW1hZ2Uoc2hlbGxJbWFnZSk7Ci0JCX0KLQotCQlTaGVsbCBzaGVsbCA9IHBsdWdpbi5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJYm9vbGVhbiByZXN1bHQgPSBXcmFwcGVkTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShzaGVsbCwgdGl0bGUsIG1zZyk7Ci0KLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cuc2V0RGVmYXVsdEltYWdlKG9sZEltYWdlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBkaXNwbGF5Q29uZmlybWF0aW9uKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGF0dXMgYXJndW1lbnQgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUltYWdlIHNoZWxsSW1hZ2UgPSBnZXRTaGVsbEltYWdlKCk7Ci0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nTm9SZWFzb24uc2V0RGVmYXVsdEltYWdlKHNoZWxsSW1hZ2UpOwotCQl9Ci0KLQkJU2hlbGwgc2hlbGwgPSBwbHVnaW4uZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0KLQkJaW50IHJjID0gRXJyb3JEaWFsb2dOb1JlYXNvbi5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtc2csIHN0YXR1cyk7Ci0KLQkJcmV0dXJuIHJjOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIHRoZSBjdXJyZW50IHNoZWxsLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2hlbGwgaW1hZ2UuCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBnZXRTaGVsbEltYWdlKCkgewotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCWlmICh3b3JrYmVuY2ggIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2gKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKSB7Ci0JCQkJU2hlbGwgc2hlbGwgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKTsKLQkJCQlpZiAoc2hlbGwgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gc2hlbGwuZ2V0SW1hZ2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L1ZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L1ZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNzczNDEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9WZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHk7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgdG9vbCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZQotICogbWV0aG9kIGxpYnJhcnkgaXQgaXMgdHJ5aW5nIHRvIG9wZW4uCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCXByaXZhdGUgVmVyc2lvbiBleHBlY3RlZDsKLQotCXByaXZhdGUgVmVyc2lvbiBhY3R1YWw7Ci0KLQlwdWJsaWMgVmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uKFZlcnNpb24gZXhwZWN0ZWQsIFN0cmluZyBhY3R1YWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5leHBlY3RlZCA9IGV4cGVjdGVkOwotCQlpZiAoYWN0dWFsID09IG51bGwpIHsKLQkJCXRoaXMuYWN0dWFsID0gVmVyc2lvbi5lbXB0eVZlcnNpb247Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmFjdHVhbCA9IG5ldyBWZXJzaW9uKGFjdHVhbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVmVyc2lvbiBnZXRBY3R1YWwoKSB7Ci0JCXJldHVybiBhY3R1YWw7Ci0JfQotCi0JcHVibGljIFZlcnNpb24gZ2V0RXhwZWN0ZWQoKSB7Ci0JCXJldHVybiBleHBlY3RlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvVmVyc2lvblV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9WZXJzaW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDZlNDI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9WZXJzaW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogUHJvdmlkZXMgdXRpbGl0aWVzIHRvIHF1ZXJ5IGEgbWV0aG9kIGxpYnJhcnkgc2NoZW1hIGFuZCB0aGUgdmVyc2lvbiBvZiB0aGUKLSAqIHRvb2wgdGhhdCBjcmVhdGVkIGl0LgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb25VdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVmVyc2lvbkNoZWNrSW5mbyB7Ci0JCXB1YmxpYyBWZXJzaW9uQ2hlY2tJbmZvKFN0cmluZyBpZCwgU3RyaW5nIHRvb2xWZXJzaW9uLAotCQkJCVN0cmluZyBjdXJyZW50TWluVG9vbFZlcnNpb24sIGludCByZXN1bHQpIHsKLQkJCXRoaXMudG9vbElEID0gaWQ7Ci0JCQl0aGlzLnRvb2xWZXJzaW9uID0gdG9vbFZlcnNpb247Ci0JCQl0aGlzLmN1cnJlbnRNaW5Ub29sVmVyc2lvbiA9IGN1cnJlbnRNaW5Ub29sVmVyc2lvbjsKLQkJCXRoaXMucmVzdWx0ID0gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b29sSUQ7Ci0KLQkJcHVibGljIFN0cmluZyB0b29sVmVyc2lvbjsKLQotCQlwdWJsaWMgU3RyaW5nIGN1cnJlbnRNaW5Ub29sVmVyc2lvbjsKLQotCQkvKioKLQkJICogPCAwOiBmaWxlVG9vbFZlcnNpb24gaXMgb2xkZXIgdGhhbiBjdXJyZW50TWluVG9vbFZlcnNpb24gPGJyLz4gPT0gMDoKLQkJICogbWF0Y2ggPGJyLz4gPiAwIDogZmlsZVRvb2xWZXJzaW9uIGlzIG5ld2VyIHRoYW4gY3VycmVudE1pblRvb2xWZXJzaW9uCi0JCSAqIDxici8+Ci0JCSAqLwotCQlwdWJsaWMgaW50IHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFID0gQ29tbW9uUGx1Z2luLmNsYXNzCi0JCQkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1ZFUlNJT05TX0lORk8gPSAidmVyc2lvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fTElCX0VYVEVOU0lPTl9DSEVDSyA9ICJsaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfVkVSU0lPTl9DSEVDS0lOR19QUkVGID0gImRpc2FibGVfdmVyc2lvbl9jaGVja2luZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgTWFwIHZlcnNpb25zID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQotCXB1YmxpYyBzdGF0aWMgTWFwIGxpYkV4dENoZWNrZXJzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiB2ZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogTGlzdCBvZiB0b29sSURzIHRvIGNoZWNrLCBpbiBvcmRlcgotCSAqLwotCXByaXZhdGUgc3RhdGljIExpc3QgdG9vbElEc0NoZWNrTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXN0YXRpYyB7Ci0JCXRvb2xJRHNDaGVja0xpc3QuYWRkKEVQRlZlcnNpb25zLlRPT0xfSUQpOwotCi0JCS8vIHJlYWQgcHJvcGVydGllcyBmaWxlCi0JCXRyeSB7Ci0JCQlTdHJpbmcgdmFsdWVTdHIgPSBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCS5nZXRTdHJpbmcoRElTQUJMRV9WRVJTSU9OX0NIRUNLSU5HX1BSRUYpOwotCQkJdmVyc2lvbkNoZWNraW5nRGlzYWJsZWQgPSBCb29sZWFuLnZhbHVlT2YodmFsdWVTdHIpLmJvb2xlYW5WYWx1ZSgpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJdmVyc2lvbkNoZWNraW5nRGlzYWJsZWQgPSBmYWxzZTsKLQkJfQotCi0JCS8vIFByb2Nlc3MgdGhlICJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnZlcnNpb24iIGV4dGVuc2lvbiBwb2ludAotCQkvLyBjb250cmlidXRvcnMuCi0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCUVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UsIEVYVEVOU0lPTl9QT0lOVF9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCWluaXRFeHRlbnNpb24oZXh0ZW5zaW9uKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGluaXRFeHRlbnNpb24oSUV4dGVuc2lvbiBleHRlbnNpb24pIHsKLQkJU3RyaW5nIGV4dGVuc2lvbklEID0gZXh0ZW5zaW9uLmdldFNpbXBsZUlkZW50aWZpZXIoKTsKLQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJdHJ5IHsKLQkJCQlpZiAoRVhURU5TSU9OX1ZFUlNJT05TX0lORk8uZXF1YWxzKGNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQl2ZXJzaW9ucy5wdXQoZXh0ZW5zaW9uSUQsIChFUEZWZXJzaW9ucykgYnVuZGxlCi0JCQkJCQkJCS5sb2FkQ2xhc3MoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChFWFRFTlNJT05fTElCX0VYVEVOU0lPTl9DSEVDSy5lcXVhbHMoY29uZmlnRWxlbWVudAotCQkJCQkJLmdldE5hbWUoKSkpIHsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCQkJbGliRXh0Q2hlY2tlcnMucHV0KGV4dGVuc2lvbklELAotCQkJCQkJCQkoSUxpYnJhcnlFeHRlbnNpb25WZXJzaW9uQ2hlY2spIGJ1bmRsZQotCQkJCQkJCQkJCS5sb2FkQ2xhc3MoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgbWFwIG9mIFRvb2wgSURzLXRvLVZlcnNpb25zIGNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0VmVyc2lvbnNNYXAoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodmVyc2lvbnMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYSBTZXQgb2YgYWxsIGtub3duIFRvb2wgSURzCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXQgZ2V0QWxsVG9vbElEcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCh2ZXJzaW9ucy5rZXlTZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHRvb2xJRAotCSAqIEByZXR1cm4gVGhlIFZlcnNpb25zIGNsYXNzIGZvciB0aGUgZ2l2ZW4gVG9vbCBJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVBGVmVyc2lvbnMgZ2V0VmVyc2lvbnMoU3RyaW5nIHRvb2xJRCkgewotCQlyZXR1cm4gKEVQRlZlcnNpb25zKSB2ZXJzaW9ucy5nZXQodG9vbElEKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWZmIHZlcnNpb24gY2hlY2tpbmcgaXMgZGlzYWJsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCgpIHsKLQkJcmV0dXJuIHZlcnNpb25DaGVja2luZ0Rpc2FibGVkOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX1hNSVZlcnNpb25QYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAotCQkJIihcXHcrPyk6dmVyc2lvbj1cIiguKz8pXCIiLCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX1hNTFZlcnNpb25BdHRyaWJ1dGVQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAotCQkJInRvb2w9XCIoLio/KVwiIiwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9YTUlfRUxFTUVOVF9TVEFSVF9UQUcgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgiPD94bWwgdmVyc2lvbj1cIi4rP1wiIGVuY29kaW5nPVwiLis/XCI/PiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9FTkRfVEFHID0gIj4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUlfQVRUUklCVVRFX1RBRyA9ICJ4bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9TVEFSVF9UQUcgPSAiPHVtYTpNZXRob2RMaWJyYXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1ZFUlNJT05TX1NFUEFSQVRPUiA9ICI7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RPT0xfVkVSU0lPTl9TRVBBUkFUT1IgPSAiPSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdpdmVuIGFuIFhNTCBmaWxlLCB3aWxsIHJlYWQgdGhlIHRvb2w9ImZvbz1hLmIuYy5kO2Jhcj13LngueS56IgotCSAqIGF0dHJpYnV0ZXMgYW5kIHJldHVybiBhIG1hcCBvZiB0aGUgaWQtdG8tdmVyc2lvbnMuCi0JICogCi0JICogQHBhcmFtIHhtbEZpbGUKLQkgKiAgICAgICAgICAgIGZpbGUgdG8gcHJvY2VzcwotCSAqIEByZXR1cm4gbnVsbCBpZiBubyB2ZXJzaW9ucyBmb3VuZDsgYSBtYXAgb2YgdGhlIGlkLXRvLXZlcnNpb25zIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTWFwIHJlYWRWZXJzaW9uc0Zyb21YTUxGaWxlKEZpbGUgeG1sRmlsZSkgewotCQlNYXAgdmVyc2lvbnMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJ1ZiA9IEZpbGVVdGlsLnJlYWRGaWxlKHhtbEZpbGUsIEZpbGVVdGlsLkVOQ09ESU5HX1VURl84KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotCQlpZiAoYnVmICE9IG51bGwpIHsKLQkJCWludCB4bWlFbGVtZW50U3RhcnRJZHggPSBidWYuaW5kZXhPZihYTUxfRUxFTUVOVF9TVEFSVF9UQUcpOwotCQkJaWYgKHhtaUVsZW1lbnRTdGFydElkeCAhPSAtMSkgewotCQkJCWludCB4bWlFbGVtZW50RW5kSWR4ID0gYnVmLmluZGV4T2YoWE1MX0VMRU1FTlRfRU5EX1RBRywKLQkJCQkJCXhtaUVsZW1lbnRTdGFydElkeCArIFhNTF9FTEVNRU5UX1NUQVJUX1RBRy5sZW5ndGgoKSk7Ci0JCQkJaWYgKHhtaUVsZW1lbnRFbmRJZHggIT0gLTEpIHsKLQkJCQkJU3RyaW5nIHJvb3RFbGVtZW50ID0gYnVmLnN1YnN0cmluZyh4bWlFbGVtZW50U3RhcnRJZHgsCi0JCQkJCQkJeG1pRWxlbWVudEVuZElkeCk7Ci0JCQkJCU1hdGNoZXIgbUF0dHJpYnV0ZSA9IHBfWE1MVmVyc2lvbkF0dHJpYnV0ZVBhdHRlcm4KLQkJCQkJCQkubWF0Y2hlcihyb290RWxlbWVudCk7Ci0JCQkJCWlmIChtQXR0cmlidXRlLmZpbmQoKSkgewotCQkJCQkJU3RyaW5nIHRvb2xzQXR0cmlidXRlID0gbUF0dHJpYnV0ZS5ncm91cCgxKTsKLQkJCQkJCWlmICh0b29sc0F0dHJpYnV0ZSAhPSBudWxsCi0JCQkJCQkJCSYmIHRvb2xzQXR0cmlidXRlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCVN0cmluZ1tdIHZlcnNpb25zQXJyYXkgPSBTdHJVdGlsLnNwbGl0KAotCQkJCQkJCQkJdG9vbHNBdHRyaWJ1dGUsIFhNTF9WRVJTSU9OU19TRVBBUkFUT1IpOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmVyc2lvbnNBcnJheS5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlpZiAodmVyc2lvbnNBcnJheVtpXSAhPSBudWxsCi0JCQkJCQkJCQkJJiYgdmVyc2lvbnNBcnJheVtpXS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJCVN0cmluZ1tdIHZlcnNpb25JbmZvQXJyYXkgPSBTdHJVdGlsLnNwbGl0KAotCQkJCQkJCQkJCQl2ZXJzaW9uc0FycmF5W2ldLAotCQkJCQkJCQkJCQlYTUxfVE9PTF9WRVJTSU9OX1NFUEFSQVRPUik7Ci0JCQkJCQkJCQlpZiAodmVyc2lvbkluZm9BcnJheS5sZW5ndGggIT0gMikKLQkJCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQkJCVN0cmluZyB0b29sSUQgPSB2ZXJzaW9uSW5mb0FycmF5WzBdOwotCQkJCQkJCQkJU3RyaW5nIHRvb2xWZXJzaW9uID0gdmVyc2lvbkluZm9BcnJheVsxXTsKLQkJCQkJCQkJCWlmICh0b29sSUQgIT0gbnVsbAotCQkJCQkJCQkJCQkmJiB0b29sSUQudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkJCQkmJiB0b29sVmVyc2lvbiAhPSBudWxsCi0JCQkJCQkJCQkJCSYmIHRvb2xWZXJzaW9uLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0JCQkJCQkJCQkJdmVyc2lvbnMucHV0KHRvb2xJRCwgdG9vbFZlcnNpb24pOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh2ZXJzaW9ucy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdmVyc2lvbnM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBYTUkgZmlsZSwgd2lsbCByZWFkIHRoZSBmb286dmVyc2lvbj0ieC54LngiIGF0dHJpYnV0ZXMgYW5kCi0JICogcmV0dXJuIGEgbWFwIG9mIHRoZSBpZC10by12ZXJzaW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0geG1sRmlsZQotCSAqICAgICAgICAgICAgZmlsZSB0byBwcm9jZXNzCi0JICogQHJldHVybiBudWxsIGlmIG5vIHZlcnNpb25zIGZvdW5kOyBhIG1hcCBvZiB0aGUgaWQtdG8tdmVyc2lvbnMgb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNYXAgcmVhZFZlcnNpb25zRnJvbVhNSUZpbGUoRmlsZSB4bWlGaWxlKSB7Ci0JCU1hcCB2ZXJzaW9ucyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBudWxsOwotCQl0cnkgewotCQkJYnVmID0gRmlsZVV0aWwucmVhZEZpbGUoeG1pRmlsZSwgRmlsZVV0aWwuRU5DT0RJTkdfVVRGXzgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0JCWlmIChidWYgIT0gbnVsbCkgewotCQkJTWF0Y2hlciBkb2NTdGFydE1hdGNoZXIgPSBwX1hNSV9FTEVNRU5UX1NUQVJUX1RBRy5tYXRjaGVyKGJ1Zik7Ci0JCQlpZiAoZG9jU3RhcnRNYXRjaGVyLmZpbmQoKSkgewotCQkJCWludCBkb2NIZWFkZXJFbmRJZHggPSBkb2NTdGFydE1hdGNoZXIuZW5kKCk7Ci0JCQkJaW50IHhtaUVsZW1lbnRFbmRJZHggPSBidWYuaW5kZXhPZihYTUxfRUxFTUVOVF9FTkRfVEFHLAotCQkJCQkJZG9jSGVhZGVyRW5kSWR4KTsKLQkJCQlpZiAoeG1pRWxlbWVudEVuZElkeCAhPSAtMSkgewotCQkJCQlTdHJpbmcgcm9vdEVsZW1lbnQgPSBidWYuc3Vic3RyaW5nKGRvY0hlYWRlckVuZElkeCwKLQkJCQkJCQl4bWlFbGVtZW50RW5kSWR4ICsgMSk7Ci0JCQkJCU1hdGNoZXIgbSA9IHBfWE1JVmVyc2lvblBhdHRlcm4ubWF0Y2hlcihyb290RWxlbWVudCk7Ci0JCQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCQkJU3RyaW5nIHRvb2xJRCA9IG0uZ3JvdXAoMSk7Ci0JCQkJCQlpZiAodG9vbElELmVxdWFscyhYTUlfQVRUUklCVVRFX1RBRykpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlTdHJpbmcgdG9vbFZlcnNpb24gPSBtLmdyb3VwKDIpOwotCQkJCQkJaWYgKHRvb2xJRCAhPSBudWxsICYmIHRvb2xJRC50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHRvb2xWZXJzaW9uICE9IG51bGwKLQkJCQkJCQkJJiYgdG9vbFZlcnNpb24udHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQkJCQl2ZXJzaW9ucy5wdXQodG9vbElELCB0b29sVmVyc2lvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHZlcnNpb25zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB2ZXJzaW9uczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgZmlsZSwgd2lsbCByZWFkIHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIHJldHVybiBhIG1hcCBvZiB0aGUKLQkgKiBpZC10by12ZXJzaW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgZmlsZSB0byBwcm9jZXNzCi0JICogQHJldHVybiBudWxsIGlmIG5vIHZlcnNpb25zIGZvdW5kOyBhIG1hcCBvZiB0aGUgaWQtdG8tdmVyc2lvbnMgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgcmVhZFZlcnNpb25zRnJvbUZpbGUoRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpLmVuZHNXaXRoKCJYTUkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcmVhZFZlcnNpb25zRnJvbVhNSUZpbGUoZmlsZSk7Ci0JCX0gZWxzZSBpZiAoZmlsZS5nZXROYW1lKCkudG9VcHBlckNhc2UoKS5lbmRzV2l0aCgiWE1MIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHJlYWRWZXJzaW9uc0Zyb21YTUxGaWxlKGZpbGUpOwotCQl9IGVsc2UgewotCQkJTWFwIHZlcnNpb25zID0gcmVhZFZlcnNpb25zRnJvbVhNSUZpbGUoZmlsZSk7Ci0JCQlpZiAodmVyc2lvbnMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gdmVyc2lvbnM7Ci0JCQl2ZXJzaW9ucyA9IHJlYWRWZXJzaW9uc0Zyb21YTUxGaWxlKGZpbGUpOwotCQkJaWYgKHZlcnNpb25zICE9IG51bGwpCi0JCQkJcmV0dXJuIHZlcnNpb25zOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgZmlsZSwgd2lsbCBjb21wYXJlIHdpdGggY3VycmVudCBYTUwgU2NoZW1hIHZlcnNpb24uCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuIG51bGwgaWYgZmlsZSB0b29sIHZlcnNpb24gY2FuIG5vdCBiZSBmb3VuZDsgYSBWZXJzaW9uQ2hlY2tJbmZvCi0JICogICAgICAgICBvYmplY3Qgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBWZXJzaW9uQ2hlY2tJbmZvIGNoZWNrWE1MVmVyc2lvbihGaWxlIGZpbGUpIHsKLQkJTWFwIHZlcnNpb25NYXAgPSBWZXJzaW9uVXRpbC5yZWFkVmVyc2lvbnNGcm9tRmlsZShmaWxlKTsKLQkJaWYgKHZlcnNpb25NYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlWZXJzaW9uQ2hlY2tJbmZvIHZjaSA9IG51bGw7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0b29sSURzQ2hlY2tMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyB0b29sSUQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAodmVyc2lvbk1hcC5nZXQodG9vbElEKSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB0b29sVmVyc2lvbiA9IChTdHJpbmcpIHZlcnNpb25NYXAuZ2V0KHRvb2xJRCk7Ci0JCQkJCXZjaSA9IF9jaGVja1hNTFZlcnNpb24odG9vbElELCB0b29sVmVyc2lvbik7Ci0JCQkJCWlmICh2Y2kgIT0gbnVsbCkKLQkJCQkJCXJldHVybiB2Y2k7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFZlcnNpb25DaGVja0luZm8gX2NoZWNrWE1MVmVyc2lvbihTdHJpbmcgdG9vbElELAotCQkJU3RyaW5nIHRvb2xWZXJzaW9uKSB7Ci0JCS8vIGdldCB0aGUgY2xhc3MgdGhhdCBzdG9yZXMgYWxsIHRoZSB2ZXJzaW9uIGluZm8gZm9yIHRoaXMgdG9vbCBJRAotCQlFUEZWZXJzaW9ucyB2ZXJzaW9ucyA9IGdldFZlcnNpb25zKHRvb2xJRCk7Ci0JCWlmICh2ZXJzaW9ucyAhPSBudWxsKSB7Ci0JCQlFUEZWZXJzaW9uIG1pbkN1cnJWZXJzaW9uID0gdmVyc2lvbnMKLQkJCQkJLmdldE1pblRvb2xWZXJzaW9uRm9yQ3VycmVudFhNTFNjaGVtYVZlcnNpb24oKTsKLQkJCWludCByZXN1bHQgPSBtaW5DdXJyVmVyc2lvbi5jb21wYXJlVG9vbFZlcnNpb25UbyhuZXcgVmVyc2lvbigKLQkJCQkJdG9vbFZlcnNpb24pKTsKLQkJCVN0cmluZyBjdXJyZW50TWluVG9vbFZlcnNpb24gPSBtaW5DdXJyVmVyc2lvbi5nZXRUb29sVmVyc2lvbigpCi0JCQkJCS50b1N0cmluZygpOwotCQkJcmV0dXJuIG5ldyBWZXJzaW9uQ2hlY2tJbmZvKHRvb2xJRCwgdG9vbFZlcnNpb24sCi0JCQkJCWN1cnJlbnRNaW5Ub29sVmVyc2lvbiwgLXJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBmaWxlLCBjb21wYXJlcyB3aXRoIGN1cnJlbnQgbGlicmFyeSBzY2hlbWEgdmVyc2lvbgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybiBudWxsIGlmIGZpbGUgdG9vbCB2ZXJzaW9uIGNhbiBub3QgYmUgZm91bmQ7IGEgVmVyc2lvbkNoZWNrSW5mbwotCSAqICAgICAgICAgb2JqZWN0IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVyc2lvbkNoZWNrSW5mbyBjaGVja0xpYnJhcnlWZXJzaW9uKEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzKCJsaWJyYXJ5LnhtaSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIGNoZWNrIGxpYnJhcnkgZXh0ZW5zaW9ucyBmaXJzdAotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdG9vbElEc0NoZWNrTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgdG9vbElEID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGxpYkV4dENoZWNrZXJzLmdldCh0b29sSUQpICE9IG51bGwpIHsKLQkJCQkJVmVyc2lvbkNoZWNrSW5mbyB2Y2kgPSBudWxsOwotCQkJCQlJTGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjayBleHRDaGVjayA9IChJTGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjaykgbGliRXh0Q2hlY2tlcnMKLQkJCQkJCQkuZ2V0KHRvb2xJRCk7Ci0JCQkJCXZjaSA9IGV4dENoZWNrLmNoZWNrTGlicmFyeVZlcnNpb24oZmlsZS5nZXRQYXJlbnRGaWxlKCkpOwotCQkJCQlpZiAodmNpICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gdmNpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlNYXAgdmVyc2lvbk1hcCA9IFZlcnNpb25VdGlsLnJlYWRWZXJzaW9uc0Zyb21GaWxlKGZpbGUpOwotCQlpZiAodmVyc2lvbk1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCVZlcnNpb25DaGVja0luZm8gdmNpID0gbnVsbDsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRvb2xJRHNDaGVja0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHRvb2xJRCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCWlmICh2ZXJzaW9uTWFwLmdldCh0b29sSUQpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHRvb2xWZXJzaW9uID0gKFN0cmluZykgdmVyc2lvbk1hcC5nZXQodG9vbElEKTsKLQkJCQkJdmNpID0gX2NoZWNrTGliVmVyc2lvbih0b29sSUQsIHRvb2xWZXJzaW9uKTsKLQkJCQkJaWYgKHZjaSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHZjaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVmVyc2lvbkNoZWNrSW5mbyBfY2hlY2tMaWJWZXJzaW9uKFN0cmluZyB0b29sSUQsCi0JCQlTdHJpbmcgdG9vbFZlcnNpb24pIHsKLQkJLy8gZ2V0IHRoZSBjbGFzcyB0aGF0IHN0b3JlcyBhbGwgdGhlIHZlcnNpb24gaW5mbyBmb3IgdGhpcyB0b29sIElECi0JCUVQRlZlcnNpb25zIHZlcnNpb25zID0gZ2V0VmVyc2lvbnModG9vbElEKTsKLQkJaWYgKHZlcnNpb25zICE9IG51bGwpIHsKLQkJCUVQRlZlcnNpb24gbWluQ3VyclZlcnNpb24gPSB2ZXJzaW9ucwotCQkJCQkuZ2V0TWluVG9vbFZlcnNpb25Gb3JDdXJyZW50TGlicmFyeVZlcnNpb24oKTsKLQkJCWludCByZXN1bHQgPSBtaW5DdXJyVmVyc2lvbi5jb21wYXJlVG9vbFZlcnNpb25UbyhuZXcgVmVyc2lvbigKLQkJCQkJdG9vbFZlcnNpb24pKTsKLQkJCVN0cmluZyBjdXJyZW50TWluVG9vbFZlcnNpb24gPSBtaW5DdXJyVmVyc2lvbi5nZXRUb29sVmVyc2lvbigpCi0JCQkJCS50b1N0cmluZygpOwotCQkJcmV0dXJuIG5ldyBWZXJzaW9uQ2hlY2tJbmZvKHRvb2xJRCwgdG9vbFZlcnNpb24sCi0JCQkJCWN1cnJlbnRNaW5Ub29sVmVyc2lvbiwgLXJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3QgdG9vbElEIHRoYXQgaXMgY2hlY2tlZC4gSW4gbW9zdCBjYXNlcywgdGhlIElEIG9mIHRoZQotCSAqICAgICAgICAgY3VycmVudGx5IHJ1bm5pbmcgYXBwbGljYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmltYXJ5VG9vbElEKCkgewotCQlyZXR1cm4gKFN0cmluZykgdG9vbElEc0NoZWNrTGlzdC5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHRvb2wgSUQgdG8gdGhlIG9yZGVyIG9mIHRvb2xzIHRvIGNoZWNrLgotCSAqIAotCSAqIEBwYXJhbSB0b29sSUQKLQkgKiAgICAgICAgICAgIHRvb2xJRCB0byBhZGQKLQkgKiBAcGFyYW0gdG9vbElEZm9sbG93aW5nCi0JICogICAgICAgICAgICBpZiBudWxsLCBhZGRzIHRvb2xJRCB0byBmcm9udCBvZiBsaXN0LiBvdGhlcndpc2UsIGFkZHMgdG9vbElECi0JICogICAgICAgICAgICBiZWZvcmUgdGhlIHNwZWNpZmllZCBJRAotCSAqIEByZXR1cm4gZmFsc2UgaWZmIHRvb2xJRGZvbGxvd2luZyBpcyBub3QgbnVsbCBhbmQgY291bGQgbm90IGJlIGZvdW5kIGluCi0JICogICAgICAgICBsaXN0OyB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUb29sSUQoU3RyaW5nIHRvb2xJRCwgU3RyaW5nIHRvb2xJRGZvbGxvd2luZykgewotCQlpZiAodG9vbElEZm9sbG93aW5nICE9IG51bGwpIHsKLQkJCWludCBpZHggPSB0b29sSURzQ2hlY2tMaXN0LmluZGV4T2YodG9vbElEZm9sbG93aW5nKTsKLQkJCWlmIChpZHggIT0gLTEpIHsKLQkJCQl0b29sSURzQ2hlY2tMaXN0LmFkZChpZHgsIHRvb2xJRCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQl0b29sSURzQ2hlY2tMaXN0LmFkZCgwLCB0b29sSUQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9WZXJzaW9uVXRpbC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L1ZlcnNpb25VdGlsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0ZjI2ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L1ZlcnNpb25VdGlsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12ZXJzaW9uQ2hlY2tpbmdFbmFibGVkPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9XcmFwcGVkTWVzc2FnZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L1dyYXBwZWRNZXNzYWdlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjMjMyMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L1dyYXBwZWRNZXNzYWdlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogRGlzcGxheXMgYSBtZXNzYWdlIGRpYWxvZyB0aGF0IGRpc3BsYXlzIHdyYXBwZWQgdGV4dC4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXcmFwcGVkTWVzc2FnZURpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCi0JcHVibGljIFdyYXBwZWRNZXNzYWdlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsCi0JCQlJbWFnZSBkaWFsb2dUaXRsZUltYWdlLCBTdHJpbmcgZGlhbG9nTWVzc2FnZSwgaW50IGRpYWxvZ0ltYWdlVHlwZSwKLQkJCVN0cmluZ1tdIGRpYWxvZ0J1dHRvbkxhYmVscywgaW50IGRlZmF1bHRJbmRleCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIGRpYWxvZ1RpdGxlSW1hZ2UsIGRpYWxvZ01lc3NhZ2UsCi0JCQkJZGlhbG9nSW1hZ2VUeXBlLCBkaWFsb2dCdXR0b25MYWJlbHMsIGRlZmF1bHRJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlTWVzc2FnZUFyZWEoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCi0JCUNvbnRyb2wgckNvbXBvc2l0ZSA9IHN1cGVyLmNyZWF0ZU1lc3NhZ2VBcmVhKGNvbXBvc2l0ZSk7Ci0KLQkJaW50IG1pbldpZHRoID0gSURpYWxvZ0NvbnN0YW50cy5NSU5JTVVNX01FU1NBR0VfQVJFQV9XSURUSDsvLyArIDMwMDsKLQkJLy8gVE8tRE86IG5lZWQgdG8gcmV2aXN0IHRoZSAjIG9mIGRpYWxvZyBkaXNwbGF5IHVuaXRzIGFuZCBtYXJnaW4KLQkJLy8gd2hlbiBpbiBvdGhlciBsYW5ndWFnZXMKLQkJaW50IGNoYXJzUGVyTGluZSA9IG1pbldpZHRoIC8gNCAtIDE1OwotCQlHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSkgbWVzc2FnZUxhYmVsLmdldExheW91dERhdGEoKTsKLQkJZ2QubWluaW11bVdpZHRoID0gbWluV2lkdGg7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KGFkZExpbmVCcmVha3MobWVzc2FnZSwgY2hhcnNQZXJMaW5lKSk7Ci0KLQkJcmV0dXJuIHJDb21wb3NpdGU7Ci0JfQotCi0JU3RyaW5nIGFkZExpbmVCcmVha3MoU3RyaW5nIG1zZywgaW50IG1heENoYXJzKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiBvcmlnaW5hbCBtZXNzYWdlID0gIiArIG1zZyk7Ci0KLQkJaWYgKG1zZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtc2cubGVuZ3RoKCk7IGkrKykgewotCQkJc3RyQnVmLmFwcGVuZChtc2cuY2hhckF0KGkpKTsKLQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG1zZy5jaGFyQXQoaSkpKQotCQkJCWNvdW50ID0gMDsKLQkJCWVsc2UKLQkJCQljb3VudCsrOwotCi0JCQlpZiAoY291bnQgPj0gbWF4Q2hhcnMpIHsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UobXNnLmNoYXJBdChpKSkpIHsKLQkJCQkJc3RyQnVmLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQljb3VudCA9IDA7Ci0JCQl9Ci0JCX0KLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogYnJva2VuIG1lc3NhZ2UgPSAiICsKLQkJLy8gc3RyQnVmLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5Db25maXJtKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotCQlXcmFwcGVkTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgV3JhcHBlZE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwKLQkJCQludWxsLCAvLyBhY2NlcHQKLQkJCQkvLyB0aGUKLQkJCQkvLyBkZWZhdWx0Ci0JCQkJLy8gd2luZG93Ci0JCQkJLy8gaWNvbgotCQkJCW1lc3NhZ2UsIFFVRVNUSU9OLCBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwgfSwgMCk7IC8vIE9LIGlzIHRoZQotCQkvLyBkZWZhdWx0Ci0JCXJldHVybiBkaWFsb2cub3BlbigpID09IDA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5FcnJvcihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IFdyYXBwZWRNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsCi0JCQkJbnVsbCwgLy8gYWNjZXB0Ci0JCQkJLy8gdGhlCi0JCQkJLy8gZGVmYXVsdAotCQkJCS8vIHdpbmRvdwotCQkJCS8vIGljb24KLQkJCQltZXNzYWdlLCBFUlJPUiwgbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCB9LCAwKTsgLy8gb2sKLQkJLy8gaXMKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuSW5mb3JtYXRpb24oU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsCi0JCQlTdHJpbmcgbWVzc2FnZSkgewotCQlXcmFwcGVkTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgV3JhcHBlZE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwKLQkJCQludWxsLCAvLyBhY2NlcHQKLQkJCQkvLyB0aGUKLQkJCQkvLyBkZWZhdWx0Ci0JCQkJLy8gd2luZG93Ci0JCQkJLy8gaWNvbgotCQkJCW1lc3NhZ2UsIElORk9STUFUSU9OLAotCQkJCW5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwgfSwgMCk7Ci0JCS8vIG9rIGlzIHRoZSBkZWZhdWx0Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlblF1ZXN0aW9uKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLAotCQkJU3RyaW5nIG1lc3NhZ2UpIHsKLQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IFdyYXBwZWRNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsCi0JCQkJbnVsbCwgLy8gYWNjZXB0Ci0JCQkJLy8gdGhlCi0JCQkJLy8gZGVmYXVsdAotCQkJCS8vIHdpbmRvdwotCQkJCS8vIGljb24KLQkJCQltZXNzYWdlLCBRVUVTVElPTiwgbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsCi0JCQkJCQlJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMIH0sIDApOyAvLyB5ZXMgaXMgdGhlCi0JCS8vIGRlZmF1bHQKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3Blbldhcm5pbmcoU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCVdyYXBwZWRNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBXcmFwcGVkTWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLAotCQkJCW51bGwsIC8vIGFjY2VwdAotCQkJCS8vIHRoZQotCQkJCS8vIGRlZmF1bHQKLQkJCQkvLyB3aW5kb3cKLQkJCQkvLyBpY29uCi0JCQkJbWVzc2FnZSwgV0FSTklORywgbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCB9LCAwKTsgLy8gb2sKLQkJLy8gaXMKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTMzNDdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tb24gZXJyb3IgaGFuZGxpbmcsIGxvZ2dpbmcgYW5kIHZlcnNpb25pbmcgc2VydmljZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0NsaXBib2FyZFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9DbGlwYm9hcmRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY1NDA2Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0NsaXBib2FyZFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciByZXRyaWV2aW5nIGRhdGEgZnJvbSB0aGUgY2xpcGJvYXJkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENsaXBib2FyZFV0aWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9VUkwgPSAiU291cmNlVVJMOiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFRyYW5zZmVyIGh0bWxUcmFuc2ZlciA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtCi0JCQkJCQkuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4NiIpOyAvLyROT04tTkxTLTEkCi0JCQkJQ2xhc3MgYyA9IGJ1bmRsZQotCQkJCQkJLmxvYWRDbGFzcygib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi5XaW4zMkhUTUxUcmFuc2ZlciIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGMgIT0gbnVsbCkgewotCQkJCQlodG1sVHJhbnNmZXIgPSAoVHJhbnNmZXIpIGMubmV3SW5zdGFuY2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWh0bWxUcmFuc2ZlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBIVE1MIHNvdXJjZSBVUkwgZnJvbSB0aGUgY3VycmVudCBjbGlwYm9hcmQuCi0JICogCi0JICogQHJldHVybiB0aGUgSFRNTCBzb3VyY2UgVVJMIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SFRNTFNvdXJjZVVSTCgpIHsKLQkJaWYgKGh0bWxUcmFuc2ZlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNsaXBib2FyZCBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VVUkwgPSBudWxsOwotCQkJU3RyaW5nIGh0bWxDb250ZW50ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKGh0bWxUcmFuc2Zlcik7Ci0JCQlpZiAoaHRtbENvbnRlbnQgIT0gbnVsbCAmJiBodG1sQ29udGVudC5sZW5ndGgoKSA+IDApIHsKLQkJCQlpbnQgaW5kZXggPSBodG1sQ29udGVudC5pbmRleE9mKFNPVVJDRV9VUkwpOwotCQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQkJc291cmNlVVJMID0gaHRtbENvbnRlbnQuc3Vic3RyaW5nKGluZGV4Ci0JCQkJCQkJKyBTT1VSQ0VfVVJMLmxlbmd0aCgpKTsKLQkJCQkJc291cmNlVVJMID0gc291cmNlVVJMLnN1YnN0cmluZygwLCBzb3VyY2VVUkwKLQkJCQkJCQkuaW5kZXhPZihGaWxlVXRpbC5MSU5FX1NFUCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzb3VyY2VVUkw7Ci0JCX0gZmluYWxseSB7Ci0JCQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvRmlsZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9GaWxlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MDM3MjhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9GaWxlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLk1hcHBlZEJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2s7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBtYW5hZ2luZyBkaXJlY3RvcmllcyBhbmQgZmlsZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbGVVdGlsIHsKLQotCS8qKgotCSAqIFBsYXRmb3JtLXNwZWNpZmljIGxpbmUgc2VwYXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfU0VQID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQbGF0Zm9ybS1zcGVjaWZpYyBmaWxlIHNlcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1NFUCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUGxhdGZvcm0tc3BlY2lmaWMgbGluZSBzZXBhcmF0b3IgbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJTkVfU0VQX0xFTkdUSCA9IExJTkVfU0VQLmxlbmd0aCgpOwotCi0JLyoqCi0JICogVU5DIHBhdGggcHJlZml4LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQ19QQVRIX1BSRUZJWCA9ICJcXFxcIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVU5DIHBhdGggcHJlZml4IGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkNfUEFUSF9QUkVGSVhfTEVOR1RIID0gVU5DX1BBVEhfUFJFRklYLmxlbmd0aCgpOwotCi0JLyoqCi0JICogSVNPLTg4NTktMSBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPRElOR19JU09fODg1OV8xID0gIklTTy04ODU5LTEiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBVVEYtOCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPRElOR19VVEZfOCA9ICJVVEYtOCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIEFsbAotCSAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQgYmUgc3RhdGljLgotCSAqLwotCXByaXZhdGUgRmlsZVV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBmb3IgdGhlIGdpdmVuIGZpbGUgb3IgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBUaGUgZ2l2ZW4gZmlsZSBvciBkaXJlY3RvcnkuCi0JICogQHJldHVybiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZ2l2ZW4gZmlsZSBvciBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBmb3IgdGhlIGdpdmVuIGZpbGUgb3IgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBUaGUgZ2l2ZW4gZmlsZSBvciBkaXJlY3RvcnkgbmFtZS4KLQkgKiBAcmV0dXJuIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBnaXZlbiBmaWxlIG9yIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoU3RyaW5nIGZpbGUpIHsKLQkJcmV0dXJuIGdldEFic29sdXRlUGF0aChuZXcgRmlsZShmaWxlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBmb3IgdGhlIGdpdmVuIFVSTC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBUaGUgZ2l2ZW4gVVJMLgotCSAqIEByZXR1cm4gVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGdpdmVuIFVSTC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoVVJMIHVybCkgewotCQlTdHJpbmcgcGF0aE5hbWUgPSB1cmwuZ2V0RmlsZSgpLnN1YnN0cmluZygxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IE5ldFV0aWwuZGVjb2RlVXJsKHBhdGhOYW1lLCBudWxsKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgcGF0aCBuYW1lLgotCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFyZW50RGlyZWN0b3J5KFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiAobmV3IEZpbGUocGF0aCkpLmdldFBhcmVudCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgbmFtZSBhbmQgZXh0ZW5zaW9uIGZyb20gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIG5hbWUuCi0JICogQHJldHVybiBUaGUgZmlsZSBuYW1lIGFuZCB0aGUgZmlsZSBleHRlbnNpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGdldEZpbGVOYW1lKHBhdGgsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgbmFtZSBmcm9tIHRoZSBnaXZlbiBwYXRoLCB3aXRoIG9yIHdpdGhvdXQgdGhlIGZpbGUKLQkgKiBleHRlbnNpb24uCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIG5hbWUuCi0JICogQHBhcmFtIHdpdGhFeHRlbnNpb24KLQkgKiAgICAgICAgICAgIElmIHRydWUsIGluY2x1ZGUgdGhlIGZpbGUgZXh0ZW5zaW9uIGluIHRoZSByZXN1bHQuCi0JICogQHJldHVybiBUaGUgZmlsZSBuYW1lIHdpdGggb3Igd2l0aG91dCB0aGUgZmlsZSBleHRlbnNpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoU3RyaW5nIHBhdGgsIGJvb2xlYW4gd2l0aEV4dGVuc2lvbikgewotCQlTdHJpbmcgbm9ybWFsaXplZFBhdGggPSBwYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQotCQlpbnQgcHJlZml4TGVuZ3RoID0gMDsKLQkJaWYgKG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoTmV0VXRpbC5GSUxFX1VSSV9QUkVGSVgpKSB7Ci0JCQlwcmVmaXhMZW5ndGggPSBOZXRVdGlsLkZJTEVfVVJJX1BSRUZJWF9MRU5HVEg7Ci0JCX0gZWxzZSBpZiAobm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChOZXRVdGlsLkhUVFBfVVJJX1BSRUZJWCkpIHsKLQkJCXByZWZpeExlbmd0aCA9IE5ldFV0aWwuSFRUUF9VUklfUFJFRklYX0xFTkdUSDsKLQkJfQotCi0JCVN0cmluZyBmaWxlTmFtZTsKLQkJaW50IGluZGV4ID0gbm9ybWFsaXplZFBhdGgubGFzdEluZGV4T2YoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXggPCBwcmVmaXhMZW5ndGgpIHsKLQkJCWZpbGVOYW1lID0gbm9ybWFsaXplZFBhdGguc3Vic3RyaW5nKHByZWZpeExlbmd0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlmaWxlTmFtZSA9IHBhdGguc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCX0KLQotCQlpZiAod2l0aEV4dGVuc2lvbikgewotCQkJcmV0dXJuIGZpbGVOYW1lOwotCQl9Ci0KLQkJaW5kZXggPSBmaWxlTmFtZS5pbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIChpbmRleCA+IDApID8gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KSA6IGZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlbGF0aXZlIHBhdGggZm9yIHRoZSB0YXJnZXQgcGF0aCBmcm9tIHRoZSBiYXNlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgcGF0aC4KLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBiYXNlIHBhdGguCi0JICogQHJldHVybiBUaGUgcmVsYXRpdmUgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGhUb0Jhc2UoRmlsZSBwYXRoLCBGaWxlIGJhc2VQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgZGlyID0gcGF0aC50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQlTdHJpbmcgYmFzZURpciA9IGJhc2VQYXRoLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZiAoZGlyLmluZGV4T2YoYmFzZURpcikgPT0gMCkgewotCQkJCVN0cmluZyBkZWx0YSA9IGRpci5zdWJzdHJpbmcoYmFzZURpci5sZW5ndGgoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWlmIChkZWx0YS5jaGFyQXQoaSkgPT0gJy8nKSB7Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCIuLi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoRmlsZSBwYXRoLCBGaWxlIGJhc2VQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgZGlyID0gcGF0aC50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQlTdHJpbmcgYmFzZURpciA9IGFwcGVuZFNlcGFyYXRvcihiYXNlUGF0aC50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCksCi0JCQkJCSIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl3aGlsZSAoZGlyLmluZGV4T2YoYmFzZURpcikgPT0gLTEpIHsKLQkJCQliYXNlUGF0aCA9IGJhc2VQYXRoLmdldFBhcmVudEZpbGUoKTsKLQkJCQliYXNlRGlyID0gYXBwZW5kU2VwYXJhdG9yKGJhc2VQYXRoLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSwKLQkJCQkJCSIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKCIuLi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGRpci5pbmRleE9mKGJhc2VEaXIpID09IDApIHsKLQkJCQlTdHJpbmcgZGVsdGEgPSBkaXIuc3Vic3RyaW5nKGJhc2VEaXIubGVuZ3RoKCkpOwotCQkJCXJlc3VsdC5hcHBlbmQoZGVsdGEpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmRzIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBwYXRoIHNlcGFyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBnaXZlbgotCSAqIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIG5hbWUuCi0JICogQHJldHVybiBUaGUgcGF0aCBuYW1lIGFwcGVuZGVkIHdpdGggdGhlIHBsYXRmb3JtIHNwZWNpZmljIHBhdGggc2VwYXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGVuZFNlcGFyYXRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gYXBwZW5kU2VwYXJhdG9yKHBhdGgsIEZpbGUuc2VwYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmRzIHRoZSBnaXZlbiBwYXRoIHNlcGFyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgcGF0aCBuYW1lLgotCSAqIEBwYXJhbSBzZXBhcmF0b3IKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIHNlcGFyYXRvci4KLQkgKiBAcmV0dXJuIFRoZSBwYXRoIG5hbWUgYXBwZW5kZWQgd2l0aCB0aGUgZ2l2ZW4gc2VwYXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGVuZFNlcGFyYXRvcihTdHJpbmcgcGF0aCwgU3RyaW5nIHNlcGFyYXRvcikgewotCQlyZXR1cm4gcGF0aC5lbmRzV2l0aChzZXBhcmF0b3IpID8gcGF0aCA6IHBhdGggKyBzZXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZW5kaW5nIHBhdGggc2VwYXJhdG9yIGZyb20gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIG5hbWUuCi0JICogQHJldHVybiBUaGUgcGF0aCBuYW1lIG1pbnVzIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBwYXRoIHNlcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVTZXBhcmF0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIHBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpID8gcGF0aC5zdWJzdHJpbmcoMCwKLQkJCQlwYXRoLmxlbmd0aCgpIC0gMSkgOiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGVuZGluZyBwYXRoIHNlcGFyYXRvciBmcm9tIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgcGF0aCBuYW1lLgotCSAqIEByZXR1cm4gVGhlIHBhdGggbmFtZSBtaW51cyB0aGUgcGF0aCBzZXBhcmF0b3IgIlxcIiBvciAiLyIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQWxsU2VwYXJhdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBwYXRoLmVuZHNXaXRoKCIvIikgfHwgcGF0aC5lbmRzV2l0aCgiXFwiKSA/IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSAxKSA6IHBhdGg7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGVuZGluZyBwYXRoIHNlcGFyYXRvciBmcm9tIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgcGF0aCBuYW1lLgotCSAqIEBwYXJhbSBzZXBhcmF0b3IKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIHNlcGFyYXRvci4KLQkgKiBAcmV0dXJuIFRoZSBwYXRoIG5hbWUgbWludXMgdGhlIHNlcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVTZXBhcmF0b3IoU3RyaW5nIHBhdGgsIFN0cmluZyBzZXBhcmF0b3IpIHsKLQkJcmV0dXJuIHBhdGguZW5kc1dpdGgoc2VwYXJhdG9yKSA/IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSAxKQotCQkJCTogcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgZmlsZSBuYW1lIHdpdGggYW5vdGhlciBpbiB0aGUgZ2l2ZW4gcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGggbmFtZS4KLQkgKiBAcGFyYW0gb2xkRmlsZU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBvbGQgZmlsZSBuYW1lLgotCSAqIEBwYXJhbSBuZXdGaWxlTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5ldyBmaWxlIG5hbWUuCi0JICogQHJldHVybiBUaGUgbmV3IHBhdGggbmFtZSB3aXRoIHRoZSBuZXcgZmlsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VGaWxlTmFtZShTdHJpbmcgcGF0aCwgU3RyaW5nIG9sZEZpbGVOYW1lLAotCQkJU3RyaW5nIG5ld0ZpbGVOYW1lKSB7Ci0JCWludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2Yob2xkRmlsZU5hbWUpOwotCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpICsgbmV3RmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgdGhlIGZpbGUgZXh0ZW5zaW9uIHdpdGggYW5vdGhlciBpbiB0aGUgZ2l2ZW4gcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGggbmFtZS4KLQkgKiBAcGFyYW0gb2xkRmlsZUV4dAotCSAqICAgICAgICAgICAgVGhlIG9sZCBmaWxlIGV4dGVuc2lvbi4KLQkgKiBAcGFyYW0gbmV3RmlsZUV4dAotCSAqICAgICAgICAgICAgVGhlIG5ldyBmaWxlIGV4dGVuc2lvbi4KLQkgKiBAcmV0dXJuIFRoZSBuZXcgcGF0aCB3aXRoIHRoZSBuZXcgZmlsZSBleHRlbnNpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUV4dGVuc2lvbihTdHJpbmcgcGF0aCwgU3RyaW5nIG9sZEV4dCwKLQkJCVN0cmluZyBuZXdFeHQpIHsKLQkJaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihvbGRFeHQpOwotCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpICsgbmV3RXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBwYXRoIG9mIGEgYmFzZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgYmFzZSBwYXRoIG5hbWUuCi0JICogQHBhcmFtIGxvY2FsZVN0cgotCSAqICAgICAgICAgICAgVGhlIGxvY2FsZSBzdHJpbmcuCi0JICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIHBhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYWxlUGF0aChTdHJpbmcgcGF0aCwgU3RyaW5nIGxvY2FsZVN0cikgewotCQlpZiAoU3RyVXRpbC5pc0JsYW5rKGxvY2FsZVN0cikpIHsKLQkJCXJldHVybiBwYXRoOwotCQl9Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKHBhdGgpOwotCQlyZXR1cm4gcmVwbGFjZUZpbGVOYW1lKHBhdGgsIGZpbGVOYW1lLCBsb2NhbGVTdHIgKyAiLyIgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgcGF0aCBvZiBhIGJhc2UgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIGJhc2UgcGF0aCBuYW1lLgotCSAqIEBwYXJhbSBsb2NhbGUKLQkgKiAgICAgICAgICAgIFRoZSBsb2NhbGUgb2JqZWN0LgotCSAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsZVBhdGgoU3RyaW5nIHBhdGgsIExvY2FsZSBsb2NhbGUpIHsKLQkJcmV0dXJuIGxvY2FsZSA9PSBudWxsID8gcGF0aCA6IGdldExvY2FsZVBhdGgocGF0aCwgbG9jYWxlLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgZ2l2ZW4gdGV4dCB0byBhIHRleHQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZmlsZSBuYW1lLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCB0byB3cml0ZS4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHRleHQgaXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkgdG8gZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gd3JpdGVGaWxlKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHRleHQpIHsKLQkJRmlsZVdyaXRlciB3cml0ZXIgPSBudWxsOwotCQl0cnkgewotCQkJd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoZmlsZW5hbWUpOwotCQkJd3JpdGVyLndyaXRlKHRleHQpOwotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3cml0ZXIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXdyaXRlci5jbG9zZSgpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgdGhlIGdpdmVuIHRleHQgdG8gYSBmaWxlIHdpdGggVVRGLTggZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGZpbGUgbmFtZS4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgdG8gd3JpdGUuCi0JICogQHBhcmFtIGFwcGVuZCB0dXJlIHRvIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBmYWxzZSB0byBvdmVycmlkZSB0aGUgZmlsZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSB0byBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3cml0ZVVURjhGaWxlKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIHdyaXRlVVRGOEZpbGUoZmlsZW5hbWUsIHRleHQsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSB0aGUgZ2l2ZW4gdGV4dCB0byBhIGZpbGUgd2l0aCBVVEYtOCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZmlsZSBuYW1lLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCB0byB3cml0ZS4KLQkgKiBAcGFyYW0gYXBwZW5kIHR1cmUgdG8gYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGZhbHNlIHRvIG92ZXJyaWRlIHRoZSBmaWxlCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5IHRvIGZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHdyaXRlVVRGOEZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgdGV4dCwgYm9vbGVhbiBhcHBlbmQpIHsKLQkJT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZmlsZU91dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaWxlT3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUsIGFwcGVuZCk7Ci0JCQl3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZpbGVPdXQsIEVOQ09ESU5HX1VURl84KTsKLQkJCXdyaXRlci53cml0ZSh0ZXh0KTsKLQkJCXdyaXRlci5mbHVzaCgpOwotCQkJZmlsZU91dC5mbHVzaCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdyaXRlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZpbGVPdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZpbGVPdXQuY2xvc2UoKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFdyaXRlIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBVUkkgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIHNvdXJjZSBVUkkuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRmlsZShTdHJpbmcgdXJpLCBPdXRwdXRTdHJlYW0gb3V0cHV0KQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnB1dCA9IE5ldFV0aWwuZ2V0SW5wdXRTdHJlYW0odXJpKTsKLQkJCWludCBieXRlc1JlYWQ7Ci0JCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbNDA5Nl07Ci0JCQl3aGlsZSAoKGJ5dGVzUmVhZCA9IGlucHV0LnJlYWQoYnVmLCAwLCA0MDk2KSkgPiAwKSB7Ci0JCQkJb3V0cHV0LndyaXRlKGJ1ZiwgMCwgYnl0ZXNSZWFkKTsKLQkJCX0KLQkJCW91dHB1dC5mbHVzaCgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIFVSSSB0byB0aGUgZ2l2ZW4gUHJpbnRXcml0ZXIuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIHNvdXJjZSBVUkkuCi0JICogQHBhcmFtIHdyaXRlcgotCSAqICAgICAgICAgICAgVGhlIFByaW50V3JpdGVyIG9iZWpjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVGaWxlKFN0cmluZyB1cmksIFByaW50V3JpdGVyIHB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAodXJpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlucHV0U3RyZWFtUmVhZGVyIGlucHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlucHV0ID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKE5ldFV0aWwuZ2V0SW5wdXRTdHJlYW0odXJpKSk7Ci0JCQlpbnQgY2hhcnNSZWFkOwotCQkJY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzQwOTZdOwotCQkJd2hpbGUgKChjaGFyc1JlYWQgPSBpbnB1dC5yZWFkKGJ1ZiwgMCwgNDA5NikpID4gMCkgewotCQkJCXB3LndyaXRlKGJ1ZiwgMCwgY2hhcnNSZWFkKTsKLQkJCX0KLQkJCXB3LmZsdXNoKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWN1cnNpdmVseSBkZWxldGUgYWxsIHN1Yi1kaXJlY3RvcmllcyBhbmQgZmlsZXMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeS4KLQkgKiBEb2VzIG5vdCBkZWxldGUgdGhlIGdpdmVuIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHN1Yi1kaXJlY3RvcmllcyBhbmQgZmlsZXMuCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgZGVsZXRlIHN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlQWxsRmlsZXMoU3RyaW5nIGRpcikgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCUZpbGUgdGFyZ2V0RGlyID0gbmV3IEZpbGUoZGlyKTsKLQkJRmlsZVtdIGZpbGVzID0gdGFyZ2V0RGlyLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCXJldCA9IHJldCAmJiBkZWxldGVBbGxGaWxlcyhmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJfQotCQkJCXJldCA9IHJldCAmJiBmaWxlc1tpXS5kZWxldGUoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZSB0byB0aGUgdGFyZ2V0IGZpbGUuCi0JICogCi0JICogQHBhcmFtIHNyY0ZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBzb3VyY2UgZmlsZSBvciBwYXRoLgotCSAqIEBwYXJhbSB0Z3RGaWxlCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGZpbGUgb3IgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weUZpbGUoRmlsZSBzcmNGaWxlLCBGaWxlIHRndEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChzcmNGaWxlLmVxdWFscyh0Z3RGaWxlKSkKLQkJCXJldHVybjsKLQotCQlpZiAoIXNyY0ZpbGUuZXhpc3RzKCkgfHwgIXNyY0ZpbGUuY2FuUmVhZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAodGd0RmlsZS5leGlzdHMoKSAmJiAhdGd0RmlsZS5jYW5Xcml0ZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIXNyY0ZpbGUuaXNGaWxlKCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IHNyY0ZpbGUubGlzdEZpbGVzKCk7Ci0JCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJY29weUZpbGUoZmlsZXNbaV0sIHRndEZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQkKLQotCQlGaWxlSW5wdXRTdHJlYW0gc3JjID0gbnVsbDsKLQkJRmlsZU91dHB1dFN0cmVhbSB0Z3QgPSBudWxsOwotCQl0cnkgewotCQkJc3JjID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmNGaWxlKTsKLQkJCWlmICh0Z3RGaWxlLmlzRmlsZSgpKSB7Ci0JCQkJdGd0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGd0RmlsZSk7Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyBzcmNQYXRoID0gc3JjRmlsZS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0JCQkJaW50IGluZGV4ID0gc3JjUGF0aC5sYXN0SW5kZXhPZigiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHNyY0ZpbGVOYW1lID0gc3JjUGF0aC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQlTdHJpbmcgc3JjQ2Fub25pY2FsUGF0aCA9IHNyY0ZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJCVN0cmluZyB0Z3RDYW5vbmljYWxQYXRoID0gbmV3IEZpbGUodGd0RmlsZSwgc3JjRmlsZU5hbWUpLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCQlpZiAoc3JjQ2Fub25pY2FsUGF0aC5lcXVhbHModGd0Q2Fub25pY2FsUGF0aCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl0Z3QgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZSh0Z3RGaWxlLCBzcmNGaWxlTmFtZSkpOwotCQkJfQotCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzQwOTZdOwotCQkJaW50IGJ5dGVzX3JlYWQ7Ci0JCQl3aGlsZSAoKGJ5dGVzX3JlYWQgPSBzcmMucmVhZChidWZmZXIpKSAhPSAtMSkgewotCQkJCXRndC53cml0ZShidWZmZXIsIDAsIGJ5dGVzX3JlYWQpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHNyYyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3JjLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodGd0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl0Z3QuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCXRndEZpbGUuc2V0TGFzdE1vZGlmaWVkKHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZSB0byB0aGUgdGFyZ2V0IGZpbGUuCi0JICogCi0JICogQHBhcmFtIHNyY0ZpbGVOYW1lCi0JICogICAgICAgICAgICBUaGUgc291cmNlIGZpbGUgbmFtZS4KLQkgKiBAcGFyYW0gdGd0RmlsZU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZmlsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RmlsZShTdHJpbmcgc3JjRmlsZU5hbWUsIFN0cmluZyB0Z3RGaWxlTmFtZSkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNvcHlGaWxlKG5ldyBGaWxlKHNyY0ZpbGVOYW1lKSwgbmV3IEZpbGUodGd0RmlsZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgYSBkaXJlY3RvcnkgdG8gYW5vdGhlciBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIHNyY0Rpck5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBzb3VyY2UgZGlyZWN0b3J5IG5hbWUuCi0JICogQHBhcmFtIHRndERpck5hbWUKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZGlyZWN0b3J5IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlEaXIoU3RyaW5nIHNyY0Rpck5hbWUsIFN0cmluZyB0Z3REaXJOYW1lKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY29weUZpbGUobmV3IEZpbGUoc3JjRGlyTmFtZSksIG5ldyBGaWxlKHRndERpck5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgb25lIGZpbGUgdG8gYW5vdGhlciAtIG9wZXJhdGVzIE9OTFkgb24gZmlsZXMsIG5vdCBvbiBkaXJlY3Rvcmllcy4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIGRlc3QKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlmaWxlKEZpbGUgc291cmNlLCBGaWxlIGRlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChzb3VyY2UuZXF1YWxzKGRlc3QpKQotCQkJcmV0dXJuOwotCi0JCUZpbGVJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbnVsbDsKLQotCQl0cnkgewotCQkJaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZSk7Ci0JCQlGaWxlQ2hhbm5lbCBpbiA9IGlucHV0LmdldENoYW5uZWwoKTsKLQkJCWlmICghZGVzdC5leGlzdHMoKSkgewotCQkJCWRlc3QuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQkJfQotCQkJb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdCk7Ci0JCQlGaWxlQ2hhbm5lbCBvdXQgPSBvdXRwdXQuZ2V0Q2hhbm5lbCgpOwotCQkJb3V0LnRyYW5zZmVyRnJvbShpbiwgMCwgc291cmNlLmxlbmd0aCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG91dHB1dCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5ZGlyZWN0b3J5KEZpbGUgc291cmNlRGlyLCBGaWxlIGRlc3REaXIpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIXNvdXJjZURpci5leGlzdHMoKSB8fCAhZGVzdERpci5leGlzdHMoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFzb3VyY2VEaXIuaXNEaXJlY3RvcnkoKSB8fCAhZGVzdERpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlGaWxlW10gZmlsZXMgPSBzb3VyY2VEaXIubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gY2FsYyBkZXN0aW5hdGlvbiBuYW1lCi0JCQkJU3RyaW5nIGRlc3ROYW1lID0gZGVzdERpcgotCQkJCQkJKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJKyBmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKS5zdWJzdHJpbmcoCi0JCQkJCQkJCXNvdXJjZURpci5nZXRBYnNvbHV0ZVBhdGgoKS5sZW5ndGgoKSArIDEpOwotCQkJCWlmIChmaWxlc1tpXS5pc0ZpbGUoKSkgewotCQkJCQkvLyBjb3B5IHRoZSBmaWxlCi0JCQkJCWNvcHlmaWxlKGZpbGVzW2ldLCBuZXcgRmlsZShkZXN0TmFtZSkpOwotCQkJCX0gZWxzZSBpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQkvLyBjb3B5IGRpcmVjdG9yeSByZWN1cnNpdmVseQotCQkJCQlGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUoZGVzdE5hbWUpOwotCQkJCQlkZXN0RmlsZS5ta2RpcnMoKTsKLQkJCQkJY29weWRpcmVjdG9yeShmaWxlc1tpXSwgZGVzdEZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLy8gZm9yIHNvbWUgcmVhc29uLCB0aGlzIGd1eSBsb2NrcyB0aGUgZmlsZSwgaWYgeW91IHRyeSB0byB1cGRhdGUgdGhlIGZpbGUsCi0JLy8gZ290IHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uCi0JLy8gamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb246Ci0JLy8gKFRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gYSBmaWxlIHdpdGggYSB1c2VyLW1hcHBlZAotCS8vIHNlY3Rpb24gb3BlbikKLQkvLyBuZWVkIHRvIGhhbmRsZSBsYXRlcgotCXB1YmxpYyBzdGF0aWMgQ2hhckJ1ZmZlciByZWFkRmlsZShGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCUNoYXJCdWZmZXIgY2hhckJ1ZmZlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQlGaWxlQ2hhbm5lbCBpbkNoYW5uZWwgPSBpbnB1dC5nZXRDaGFubmVsKCk7Ci0JCQlpbnQgbGVuZ3RoID0gKGludCkgaW5DaGFubmVsLnNpemUoKTsKLQkJCU1hcHBlZEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IGluQ2hhbm5lbC5tYXAoCi0JCQkJCUZpbGVDaGFubmVsLk1hcE1vZGUuUkVBRF9PTkxZLCAwLCBsZW5ndGgpOwotCQkJQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKEVOQ09ESU5HX0lTT184ODU5XzEpOwotCQkJQ2hhcnNldERlY29kZXIgZGVjb2RlciA9IGNoYXJzZXQubmV3RGVjb2RlcigpOwotCQkJY2hhckJ1ZmZlciA9IGRlY29kZXIuZGVjb2RlKGJ5dGVCdWZmZXIpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoYXJCdWZmZXI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgcmVhZEZpbGUoRmlsZSBmaWxlLCBTdHJpbmcgZW5jb2RpbmcpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOwotCQlJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIgPSBudWxsOwotCQl0cnkgewotCQkJY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzEwMjRdOwotCQkJZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCXJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaXMsIGVuY29kaW5nKTsKLQkJCWludCBzaXplOwotCQkJd2hpbGUgKChzaXplID0gcmVhZGVyLnJlYWQoYnVmZmVyLCAwLCAxMDI0KSkgPiAwKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChidWZmZXIsIDAsIHNpemUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGZpcyAhPSBudWxsKSB7Ci0JCQkJZmlzLmNsb3NlKCk7Ci0JCQl9Ci0KLQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJCXJlYWRlci5jbG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VzIEphdmEgMS40J3MgRmlsZUxvY2sgY2xhc3MgdG8gdGVzdCBmb3IgYSBmaWxlIGxvY2sKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGaWxlTG9ja2VkKEZpbGUgZmlsZSkgewotCQlib29sZWFuIGlzTG9ja2VkID0gZmFsc2U7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotCQlGaWxlTG9jayBsb2NrID0gbnVsbDsKLQotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0cnkgewotCQkJaW5wdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJCUZpbGVDaGFubmVsIGZpbGVDaGFubmVsID0gaW5wdXQuZ2V0Q2hhbm5lbCgpOwotCi0JCQlsb2NrID0gZmlsZUNoYW5uZWwudHJ5TG9jaygpOwotCi0JCQlpZiAobG9jayA9PSBudWxsKQotCQkJCWlzTG9ja2VkID0gdHJ1ZTsKLQkJCWVsc2UKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgU2VjdXJpdHlFeGNlcHRpb24pCi0JCQkJLy8gQ2FuJ3Qgd3JpdGUgdG8gZmlsZS4KLQkJCQlpc0xvY2tlZCA9IHRydWU7Ci0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKQotCQkJCWlzTG9ja2VkID0gZmFsc2U7Ci0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pCi0JCQkJaXNMb2NrZWQgPSB0cnVlOwotCQkJLy8gT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvbiBtZWFucyB0aGF0IHRoaXMgSlZNIGhhcyBpdCBsb2NrZWQKLQkJCS8vIHRoZXJlZm9yZSBpdCBpcyBub3QgbG9ja2VkIHRvIHVzCi0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvbikKLQkJCQlpc0xvY2tlZCA9IGZhbHNlOwotCQkJLy8gQ291bGQgbm90IGdldCBhIGxvY2sgZm9yIHNvbWUgb3RoZXIgcmVhc29uLgotCQkJZWxzZQotCQkJCWlzTG9ja2VkID0gdHJ1ZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzTG9ja2VkOwotCX0KLQotCS8qKgotCSAqIExvY2tzIGEgZmlsZSBmb3IgdGhlIGN1cnJlbnQgSlZNLiBXaWxsIGNyZWF0ZSB0aGUgZmlsZSBpZiBpdCBkb2VzIG5vdAotCSAqIGV4aXN0Ci0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuIGEgRmlsZUxvY2sgb2JqZWN0LCBvciBudWxsIGlmIGZpbGUgY291bGQgbm90IGJlIGxvY2tlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZUxvY2sgbG9ja0ZpbGUoRmlsZSBmaWxlKSB7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotCQlGaWxlTG9jayBsb2NrID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlucHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCQlGaWxlQ2hhbm5lbCBmaWxlQ2hhbm5lbCA9IGlucHV0LmdldENoYW5uZWwoKTsKLQkJCWxvY2sgPSBmaWxlQ2hhbm5lbC50cnlMb2NrKCk7Ci0KLQkJCWlmIChsb2NrLmlzVmFsaWQoKSkKLQkJCQlyZXR1cm4gbG9jazsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIENvdWxkIG5vdCBnZXQgYSBsb2NrIGZvciBzb21lIHJlYXNvbi4KLQkJCXJldHVybiBudWxsOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW5wdXQgIT0gbnVsbCAmJiAobG9jayA9PSBudWxsIHx8ICFsb2NrLmlzVmFsaWQoKSkpIHsKLQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYWxsIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgcGF0aAotCSAqIEBwYXJhbSBwYXRoLCBhYnNvbHV0ZSBwYXRoIG9mIGEgZm9sZGVyCi0JICogQHBhcmFtIGZpbGVMaXN0IExpc3QgdGhlIGxpc3QgdG8gY29sbGVjdCB0aGUgRmlsZXMKLQkgKiBAcGFyYW0gcmVjdXJzaXZlIGJvb2xlYW4sIGlmIHRydWUgZmluZCB0aGUgZmlsZXMgaW4gc3ViIGZvbGRlcnMgYXMgd2VsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxGaWxlcyhGaWxlIHBhdGgsIExpc3QgZmlsZUxpc3QsIGJvb2xlYW4gcmVjdXJzaXZlKQotCXsKLQkJLy8gZ2V0IGFsbCBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlcgotCQlpZiAocGF0aC5pc0RpcmVjdG9yeSgpKSAKLQkJewkJCi0JCQlGaWxlW10gZmlsZXMgPSBwYXRoLmxpc3RGaWxlcygpOwotCQkJaWYgKGZpbGVzICE9IG51bGwpIAotCQkJewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIAotCQkJCXsJCi0JCQkJCWlmICggZmlsZXNbaV0uaXNGaWxlKCkgKQotCQkJCQl7Ci0JCQkJCQlmaWxlTGlzdC5hZGQoZmlsZXNbaV0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHJlY3Vyc2l2ZSkKLQkJCQkJewotCQkJCQkJZ2V0QWxsRmlsZXMoZmlsZXNbaV0sIGZpbGVMaXN0LCByZWN1cnNpdmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2l2ZW4gYSBkaXJlY3RvcnkgYW5kIGV4dGVuc2lvbiwgcmV0dXJucyBhbGwgZmlsZXMgKHJlY3Vyc2l2ZWx5KSB3aG9zZQotCSAqIGV4dGVuc2lvbiBzdGFydHNXaXRoIHRoZSBnaXZlbiBleHRlbnNpb24KLQkgKiAKLQkgKiBAcGFyYW0gZgotCSAqIEBwYXJhbSBleHRlbnNpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGZpbGVMaXN0KEZpbGUgZiwgU3RyaW5nIGV4dGVuc2lvbikgewotCQlleHRlbnNpb24gPSBleHRlbnNpb24udG9VcHBlckNhc2UoKTsKLQkJTGlzdCByZXR1cm5MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkgeyAvLyBpZiBkaXIgdGhlbiByZWN1cnNlCi0JCQkJU3RyaW5nW10gZmxpc3QgPSBmLmxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsaXN0Lmxlbmd0aDsgKytpKSB7Ci0JCQkJCUZpbGUgZmMgPSBuZXcgRmlsZShmLmdldFBhdGgoKSwgZmxpc3RbaV0pOwotCQkJCQlyZXR1cm5MaXN0LmFkZEFsbChmaWxlTGlzdChmYywgZXh0ZW5zaW9uKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsgLy8gb3JkaW5hcnkgZmlsZQotCQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCWlmIChuYW1lLmxhc3RJbmRleE9mKCIuIikgIT0gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChuYW1lCi0JCQkJCQkJCS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSkuc3RhcnRzV2l0aChleHRlbnNpb24pKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyZXR1cm5MaXN0LmFkZChmKTsKLQkJCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuTGlzdC5hZGQoZik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JfQotCi0JLyoqCi0JICogZ2l2ZW4gYSBkaXJlY3RvcnkgYW5kIGV4dGVuc2lvbiwgcmV0dXJucyBhbGwgZmlsZXMgKHJlY3Vyc2l2ZWx5KXdob3NlCi0JICogZXh0ZW5zaW9uIGRvZXMgbm90IHN0YXJ0c1dpdGggdGhlIGdpdmVuIGV4dGVuc2lvbgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIGV4dGVuc2lvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZmlsZUxpc3RFeGNsdWRlRXh0KEZpbGUgZiwgU3RyaW5nIGV4dGVuc2lvbikgewotCQlMaXN0IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSB7IC8vIGlmIGRpciB0aGVuIHJlY3Vyc2UKLQkJCQlTdHJpbmdbXSBmbGlzdCA9IGYubGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxpc3QubGVuZ3RoOyArK2kpIHsKLQkJCQkJRmlsZSBmYyA9IG5ldyBGaWxlKGYuZ2V0UGF0aCgpLCBmbGlzdFtpXSk7Ci0JCQkJCXJldHVybkxpc3QuYWRkQWxsKGZpbGVMaXN0RXhjbHVkZUV4dChmYywgZXh0ZW5zaW9uKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsgLy8gb3JkaW5hcnkgZmlsZQotCQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpOwotCQkJCQlpZiAobmFtZS5sYXN0SW5kZXhPZigiLiIpICE9IC0xKSAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoIShuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKS5zdGFydHNXaXRoKGV4dGVuc2lvbikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyZXR1cm5MaXN0LmFkZChmKTsKLQkJCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuTGlzdC5hZGQoZik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhbGwgZmlsZSBwYXRocyBpbiB0aGUgc3BlY2lmaWVkIHBhdGgKLQkgKiBAcGFyYW0gcGF0aCwgYWJzb2x1dGUgcGF0aCBvZiBhIGZvbGRlcgotCSAqIEBwYXJhbSByZWN1cnNpdmUgYm9vbGVhbiwgaWYgdHJ1ZSBmaW5kIHRoZSBmaWxlcyBpbiBzdWIgZm9sZGVycyBhcyB3ZWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBBcnJheUxpc3QgZ2V0QWxsRmlsZUFic29sdXRlUGF0aHMoRmlsZSBwYXRoLCBib29sZWFuIHJlY3Vyc2l2ZSkgewkKLQkJQXJyYXlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRBbGxGaWxlcyhwYXRoLCBmaWxlcywgcmVjdXJzaXZlKTsKLQkJQXJyYXlMaXN0IHBhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPTA7IGk8ZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBhYnNQYXRoID0gKChGaWxlKSBmaWxlcy5nZXQoaSkpLmdldEFic29sdXRlUGF0aCgpOwotCQkJcGF0aHMuYWRkKGFic1BhdGgpOwotCQl9Ci0JCXJldHVybiBwYXRoczsKLQl9Ci0JCi0JLyoqCi0JICogTW92ZXMgYSBmaWxlCi0JICogCi0JICogQXR0ZW1wdHMgdG8gcmVuYW1lIHRoZSBmaWxlIGZpcnN0LiAgSWYgdGhhdCBmYWlscywKLQkgKiB3aWxsIGNvcHkgdGhlIHNvdXJjZUZpbGUgdG8gZGVzdEZpbGUgYW5kIGRlbGV0ZSB0aGUgc291cmNlRmlsZS4KLQkgKiBAcGFyYW0gc291cmNlRmlsZQotCSAqIEBwYXJhbSBkZXN0RmlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbW92ZUZpbGUoRmlsZSBzb3VyY2VGaWxlLCBGaWxlIGRlc3RGaWxlKSB7Ci0JCXRyeSB7Ci0JCQkvLyBmaXJzdCB0cnkgdGhlIHJlbmFtZVRvIG1ldGhvZAotCQkJaWYgKHNvdXJjZUZpbGUucmVuYW1lVG8oZGVzdEZpbGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0cnkgdG8gY29weSBmaWxlLCBkZWxldGUgb3JpZ2luYWwKLQkJCQljb3B5ZmlsZShzb3VyY2VGaWxlLCBkZXN0RmlsZSk7Ci0JCQkJc291cmNlRmlsZS5kZWxldGUoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIHQpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IodCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0kxOG5VdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSTE4blV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmFmNjZiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSTE4blV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogSGVscGVyIHV0aWx0aWllcyBmb3IgaGFuZGxpbmcgaW50ZXJuYXRpb25hbGl6YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSTE4blV0aWwgewotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIEFsbAotCSAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQgYmUgc3RhdGljLgotCSAqLwotCXByaXZhdGUgSTE4blV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBrZXkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JICogICAgICAgICAgICBBIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcmV0dXJuIEEgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsIFN0cmluZyBrZXkpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIGEgZ2l2ZW4gc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBidW5kbGUuCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdC4KLQkgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0U3RyaW5nKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLAotCQkJU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGxvY2FsaXplZFN0ciA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0Ci0JCQkJCQkuZm9ybWF0KGxvY2FsaXplZFN0ciwgbmV3IE9iamVjdFtdIHsgZGF0YSB9KTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICdbJyArIGtleSArICddJzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleSBhbmQgZm9ybWF0dGVkCi0JICogd2l0aCB0d28gZ2l2ZW4gc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBidW5kbGUuCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGRhdGExCi0JICogICAgICAgICAgICBBbiBvYmplY3QuCi0JICogQHBhcmFtIGRhdGEyCi0JICogICAgICAgICAgICBBbiBvYmplY3QuCi0JICogQHJldHVybiBBIGZvcm1hdHRlZCBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdFN0cmluZyhSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwKLQkJCVN0cmluZyBrZXksIE9iamVjdCBkYXRhMSwgT2JqZWN0IGRhdGEyKSB7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBsb2NhbGl6ZWRTdHIgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobG9jYWxpemVkU3RyLCBuZXcgT2JqZWN0W10geyBkYXRhMSwKLQkJCQkJCWRhdGEyIH0pOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIGEgZ2l2ZW4gc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBidW5kbGUuCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIEFuIGFycmF5IG9mIG9iamVjdHMuCi0JICogQHJldHVybiBBIGZvcm1hdHRlZCBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdFN0cmluZyhSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwKLQkJCVN0cmluZyBrZXksIE9iamVjdFtdIGRhdGEpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGxvY2FsaXplZFN0ciA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChsb2NhbGl6ZWRTdHIsIGRhdGEpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBpbnRlZ2VyIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGUKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2UgYnVuZGxlLgotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcmVzb3VyY2Uga2V5IGNhbm5vdCBiZQotCSAqICAgICAgICAgICAgbG9jYXRlZC4KLQkgKiBAcmV0dXJuIEEgbG9jYWxpemVkIGludGVyZ2VyIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEludChTdHJpbmcgaW50U3RyaW5nLAotCQkJaW50IGRlZmF1bHRWYWx1ZSkgewotCQl0cnkgewotCQkJaWYgKGludFN0cmluZyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoaW50U3RyaW5nKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCB2ZXJzaW9uIG9mIGEgVVMgRW5nbGlzaCByZXNvdXJjZSBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgcGF0aCB0byBhIHJlc291cmNlIGZpbGUuCi0JICogQHBhcmFtIGxvY2FsZQotCSAqICAgICAgICAgICAgQSBsb2NhbGUuCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHJlc291cmNlIGZpbGUuIElmIG5vbmUgZXhpc3RzLCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2NhbGl6ZWRGaWxlKFN0cmluZyBwYXRoLCBMb2NhbGUgbG9jYWxlKSB7Ci0JCWlmIChsb2NhbGUuZXF1YWxzKExvY2FsZS5VUykgfHwgcGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIEJ1aWxkIHRoZSBsb2NhbGUgc3RyaW5nIGFycmF5LiBUaGlzIGlzIHVzZWQgdG8gY29uc3RydWN0IHRoZQotCQkvLyBsb2NhbGl6ZWQgZmlsZSBuYW1lcy4KLQkJU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0JCVN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKLQkJU3RyaW5nIHZhcmlhbnQgPSBsb2NhbGUuZ2V0VmFyaWFudCgpOwotCi0JCVN0cmluZ1tdIGxvY2FsZVN0cnMgPSBuZXcgU3RyaW5nWzNdOwotCQlpZiAodmFyaWFudCAhPSBudWxsICYmIHZhcmlhbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlsb2NhbGVTdHJzWzBdID0gbG9jYWxlLnRvU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKGNvdW50cnkgIT0gbnVsbCAmJiBjb3VudHJ5Lmxlbmd0aCgpID4gMCkgewotCQkJbG9jYWxlU3Ryc1sxXSA9IGxhbmd1YWdlICsgIl8iICsgY291bnRyeTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsYW5ndWFnZSAhPSBudWxsKSB7Ci0JCQlsb2NhbGVTdHJzWzJdID0gbGFuZ3VhZ2U7Ci0JCX0KLQotCQlTdHJpbmcgZGlyID0gcGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCVN0cmluZyBmaWxlTmFtZTsKLQotCQlpbnQgcGF0aEluZGV4ID0gZGlyLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHBhdGhJbmRleCA+IDApIHsKLQkJCWRpciA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGhJbmRleCArIDEpOwotCQkJZmlsZU5hbWUgPSBwYXRoLnN1YnN0cmluZyhwYXRoSW5kZXggKyAxKTsKLQkJfSBlbHNlIHsKLQkJCWZpbGVOYW1lID0gZGlyOwotCQkJZGlyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN0cmluZyBmaWxlRXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQJCQotCQlpbnQgZXh0SW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChleHRJbmRleCA+IDApIHsKLQkJCWZpbGVFeHQgPSBmaWxlTmFtZS5zdWJzdHJpbmcoZXh0SW5kZXgpOwotCQkJZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZXh0SW5kZXgpOwotCQl9Ci0KLQkJZmlsZU5hbWUgPSBkaXIgKyBmaWxlTmFtZSArICJfIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIExvb2sgZm9yIHRoZSBsb2NhbGl6ZWQgZmlsZS4KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWlmIChsb2NhbGVTdHJzW2ldICE9IG51bGwpIHsKLQkJCQkvLyBHZXRzIHRoZSBsb2NhbGl6ZWQgcGF0aCBuYW1lLgotCQkJCVN0cmluZyBmbmFtZSA9IGZpbGVOYW1lICsgbG9jYWxlU3Ryc1tpXSArIGZpbGVFeHQ7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZm5hbWUpOwotCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXJldHVybiBmbmFtZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSW1hZ2VVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSW1hZ2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4OGU1ZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0ltYWdlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuRm9udDsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOwotaW1wb3J0IGphdmEuYXd0LkltYWdlOwotaW1wb3J0IGphdmEuYXd0Lk1lZGlhVHJhY2tlcjsKLWltcG9ydCBqYXZhLmF3dC5mb250LkZvbnRSZW5kZXJDb250ZXh0OwotaW1wb3J0IGphdmEuYXd0LmZvbnQuTGluZUJyZWFrTWVhc3VyZXI7Ci1pbXBvcnQgamF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IGphdmEuYXd0LmZvbnQuVGV4dExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5nZW9tLlBvaW50MkQ7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yOwotaW1wb3J0IGphdmEudGV4dC5BdHRyaWJ1dGVkU3RyaW5nOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgbWFuYWdpbmcgaW1hZ2UgZmlsZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VVdGlsIHsKLQotCS8vIFRoZSBkZWZhdWx0IG1heGltdW0gbGluZXMgb2Ygd3JhcHBlZCB0ZXh0LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfV1JBUF9MSU5FID0gMzsKLQotCS8vIFRoZSBCdWZmZXJlZEltYWdlIGNhY2hlLgotCXByaXZhdGUgc3RhdGljIEhhc2hNYXAgaW1hZ2VDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBJbWFnZVV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIDxjb2RlPkJ1ZmZlcmVkSW1hZ2U8L2NvZGU+IGZyb20gdGhlIGdpdmVuIGltYWdlIGZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBCdWZmZXJlZEltYWdlIGdldEJ1ZmZlcmVkSW1hZ2UoU3RyaW5nIGltYWdlRmlsZSwgQ29tcG9uZW50IGMpIHsKLQkJaWYgKGltYWdlRmlsZSA9PSBudWxsIHx8IGMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlCdWZmZXJlZEltYWdlIGJ1ZmZlcmVkSW1hZ2UgPSAoQnVmZmVyZWRJbWFnZSkgaW1hZ2VDYWNoZS5nZXQoaW1hZ2VGaWxlKTsKLQkJaWYgKGJ1ZmZlcmVkSW1hZ2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIGJ1ZmZlcmVkSW1hZ2U7Ci0JCX0KLQotCQlJbWFnZSBpbWFnZSA9IGMuZ2V0VG9vbGtpdCgpLmdldEltYWdlKGltYWdlRmlsZSk7Ci0JCU1lZGlhVHJhY2tlciB0cmFja2VyID0gbmV3IE1lZGlhVHJhY2tlcihjKTsKLQkJdHJhY2tlci5hZGRJbWFnZShpbWFnZSwgMCk7Ci0JCXRyeSB7Ci0JCQl0cmFja2VyLndhaXRGb3JBbGwoKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJYnVmZmVyZWRJbWFnZSA9IG5ldyBCdWZmZXJlZEltYWdlKGltYWdlLmdldFdpZHRoKGMpLAotCQkJCWltYWdlLmdldEhlaWdodChjKSwgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKTsKLQotCQlHcmFwaGljczJEIGcyZCA9IGJ1ZmZlcmVkSW1hZ2UuY3JlYXRlR3JhcGhpY3MoKTsKLQkJZzJkLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgYyk7Ci0JCWltYWdlQ2FjaGUucHV0KGltYWdlRmlsZSwgYnVmZmVyZWRJbWFnZSk7Ci0KLQkJcmV0dXJuIGJ1ZmZlcmVkSW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBpbWFnZSBpcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3YWl0Rm9ySW1hZ2UoSW1hZ2UgaW1hZ2UsIENvbXBvbmVudCBjKSB7Ci0JCU1lZGlhVHJhY2tlciB0cmFja2VyID0gbmV3IE1lZGlhVHJhY2tlcihjKTsKLQkJdHJhY2tlci5hZGRJbWFnZShpbWFnZSwgMCk7Ci0JCXRyeSB7Ci0JCQl0cmFja2VyLndhaXRGb3JBbGwoKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJfQotCQlyZXR1cm4gKCF0cmFja2VyLmlzRXJyb3JBbnkoKSk7Ci0JfQotCi0JLyoqCi0JICogRHJhd3MgdGhlIGdpdmVuIHRleHQuCi0JICogCi0JICogQHBhcmFtIGcyZAotCSAqICAgICAgICAgICAgVGhlIDxjb2RlPkdyYXBoaWNzMkQ8L2NvZGU+IGNvbnRleHQuCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IHRvIGJlIHJlbmRlcmVkLgotCSAqIEBwYXJhbSBmb250Ci0JICogICAgICAgICAgICBUaGUgZm9udCB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQuCi0JICogQHBhcmFtIGNvbG9yCi0JICogICAgICAgICAgICBUaGUgY29sb3IgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB0ZXh0LgotCSAqIEBwYXJhbSB4Ci0JICogICAgICAgICAgICBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dC4KLQkgKiBAcGFyYW0geQotCSAqICAgICAgICAgICAgVGhlIHZlcnRpY2FsY29vcmRpbmF0ZSB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRyYXdUZXh0KEdyYXBoaWNzMkQgZzJkLCBTdHJpbmcgdGV4dCwgRm9udCBmb250LAotCQkJQ29sb3IgY29sb3IsIGludCB4LCBpbnQgeSkgewotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWcyZC5zZXRDb2xvcihjb2xvcik7Ci0JCUZvbnRSZW5kZXJDb250ZXh0IGZyYyA9IGcyZC5nZXRGb250UmVuZGVyQ29udGV4dCgpOwotCQlUZXh0TGF5b3V0IHRleHRsYXlvdXQgPSBuZXcgVGV4dExheW91dCh0ZXh0LCBmb250LCBmcmMpOwotCQl0ZXh0bGF5b3V0LmRyYXcoZzJkLCB4LCB5KTsKLQl9Ci0KLQkvKioKLQkgKiBEcmF3cyB0aGUgZ2l2ZW4gdGV4dCBhbmQgd3JhcHMgaXQgYmFzZWQgb24gdGhlIGdpdmVuIHdpZHRoLgotCSAqIAotCSAqIEBwYXJhbSBnMmQKLQkgKiAgICAgICAgICAgIFRoZSA8Y29kZT5HcmFwaGljczJEPC9jb2RlPiBjb250ZXh0LgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCB0byBiZSByZW5kZXJlZC4KLQkgKiBAcGFyYW0gZm9udAotCSAqICAgICAgICAgICAgVGhlIGZvbnQgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB0ZXh0LgotCSAqIEBwYXJhbSBjb2xvcgotCSAqICAgICAgICAgICAgVGhlIGNvbG9yIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dC4KLQkgKiBAcGFyYW0geAotCSAqICAgICAgICAgICAgVGhlIGhvcml6b250YWwgY29vcmRpbmF0ZSB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQuCi0JICogQHBhcmFtIHkKLQkgKiAgICAgICAgICAgIFRoZSB2ZXJ0aWNhbGNvb3JkaW5hdGUgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB0ZXh0LgotCSAqIEBwYXJhbSB3aWR0aAotCSAqICAgICAgICAgICAgVGhlIG1heGltdW0gd2lkdGggb2YgdGhlIHdyYXBwZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZHJhd1RleHQoR3JhcGhpY3MyRCBnMmQsIFN0cmluZyB0ZXh0LCBGb250IGZvbnQsCi0JCQlDb2xvciBjb2xvciwgaW50IHgsIGludCB5LCBmbG9hdCB3aWR0aCkgewotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZsb2F0IG1heFdyYXBXaWR0aCA9IHdpZHRoIC0gMTA7Ci0JCWcyZC5zZXRDb2xvcihjb2xvcik7Ci0JCVBvaW50MkQuRmxvYXQgcGVuID0gbmV3IFBvaW50MkQuRmxvYXQoeCwgeSk7Ci0JCU1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJYXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5GT05ULCBmb250KTsKLQkJQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIHRleHRJdGVyYXRvciA9IG5ldyBBdHRyaWJ1dGVkU3RyaW5nKHRleHQsCi0JCQkJYXR0cmlidXRlcykuZ2V0SXRlcmF0b3IoKTsKLQkJRm9udFJlbmRlckNvbnRleHQgZnJjID0gZzJkLmdldEZvbnRSZW5kZXJDb250ZXh0KCk7Ci0JCUxpbmVCcmVha01lYXN1cmVyIG1lYXN1cmVyID0gbmV3IExpbmVCcmVha01lYXN1cmVyKHRleHRJdGVyYXRvciwgZnJjKTsKLQkJaW50IGxpbmUgPSAxOwotCQl3aGlsZSAobGluZSA8PSBNQVhfV1JBUF9MSU5FKSB7Ci0JCQlUZXh0TGF5b3V0IGxheW91dCA9IG1lYXN1cmVyLm5leHRMYXlvdXQobWF4V3JhcFdpZHRoKTsKLQkJCWlmIChsYXlvdXQgPT0gbnVsbCkKLQkJCQlicmVhazsKLQkJCXBlbi55ICs9IGxheW91dC5nZXRBc2NlbnQoKTsKLQkJCWZsb2F0IGR4ID0gMDsKLQkJCWlmIChsYXlvdXQuaXNMZWZ0VG9SaWdodCgpKSB7Ci0JCQkJZHggPSAod2lkdGggLSBsYXlvdXQuZ2V0QWR2YW5jZSgpKTsKLQkJCX0KLQkJCWxheW91dC5kcmF3KGcyZCwgcGVuLnggKyBkeCAvIDIsIHBlbi55KTsKLQkJCXBlbi55ICs9IGxheW91dC5nZXREZXNjZW50KCkgKyBsYXlvdXQuZ2V0TGVhZGluZygpIC0gMTsKLQkJCWxpbmUrKzsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL01hdGhVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvTWF0aFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGMwNzRmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvTWF0aFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgcGVyZm9ybWluZyBtYXRoIG9wZXJhdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXRoVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgY2VpbDEwMDAobG9uZyBsKSB7Ci0JCXJldHVybiAobCAtIChsICYgNykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL01lbnVVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvTWVudVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODVlYTE0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvTWVudVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgcmV0cmlldmluZyBFY2xpcHNlIG1lbnVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1lbnVVdGlsIHsKLQotCS8qKgotCSAqIFNlYXJjaGVzIGFuIGFycmF5IG9mIG1lbnUgaXRlbXMgYW5kIHJldHVybnMgdGhlIG1lbnUgaXRlbSB0aGF0IG1hdGNoZXMKLQkgKiB0aGUgZ2l2ZW4gbWVudSB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBtZW51SXRlbXMKLQkgKiAgICAgICAgICAgIEFuIGFycmF5IG9mIG1lbnUgaXRlbXMuCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IHRvIGxvb2sgZm9yLgotCSAqIEByZXR1cm4gVGhlIG1lbnUgaXRlbSBpZiBmb3VuZCwgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWVudUl0ZW0gZ2V0TWVudUl0ZW0oTWVudUl0ZW1bXSBtZW51SXRlbXMsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChtZW51SXRlbXMgPT0gbnVsbCB8fCB0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVudUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobWVudUl0ZW1zW2ldLmdldFRleHQoKS5zdGFydHNXaXRoKHRleHQpKSB7Ci0JCQkJcmV0dXJuIG1lbnVJdGVtc1tpXTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL05ldFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9OZXRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxM2JhZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL05ldFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotCi0vKioKLSAqIEltcGxlbWVudHMgYSB1dGlsaXR5IGNsYXNzIGZvciBtYW5hZ2luZyBVUkxzIGFuZCBVUklzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ldFV0aWwgewotCi0JLyoqCi0JICogRklMRSBzY2hlbWUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRklMRV9TQ0hFTUUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZpbGUgVVJJIHByZWZpeC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFX1VSSV9QUkVGSVggPSBGSUxFX1NDSEVNRSArICI6LyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZpbGUgVVJJIHByZWZpeCBzaXplLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEZJTEVfVVJJX1BSRUZJWF9MRU5HVEggPSBGSUxFX1VSSV9QUkVGSVgubGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBIVFRQIHNjaGVtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBIVFRQX1NDSEVNRSA9ICJodHRwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSFRUUCBVUkkgcHJlZml4LgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhUVFBfVVJJX1BSRUZJWCA9IEhUVFBfU0NIRU1FICsgIjovLyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEhUVFAgVVJJIHByZWZpeCBzaXplLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhUVFBfVVJJX1BSRUZJWF9MRU5HVEggPSBIVFRQX1VSSV9QUkVGSVgubGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBBIHRhYmxlIG9mIGhleCB2YWx1ZXMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gSEVYX1ZBTFVFUyA9IHsKLQkJCSIlMDAiLCAiJTAxIiwgIiUwMiIsICIlMDMiLCAiJTA0IiwgIiUwNSIsICIlMDYiLCAiJTA3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTA4IiwgIiUwOSIsICIlMEEiLCAiJTBCIiwgIiUwQyIsICIlMEQiLCAiJTBFIiwgIiUwRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiUxMCIsICIlMTEiLCAiJTEyIiwgIiUxMyIsICIlMTQiLCAiJTE1IiwgIiUxNiIsICIlMTciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlMTgiLCAiJTE5IiwgIiUxQSIsICIlMUIiLCAiJTFDIiwgIiUxRCIsICIlMUUiLCAiJTFGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTIwIiwgIiUyMSIsICIlMjIiLCAiJTIzIiwgIiUyNCIsICIlMjUiLCAiJTI2IiwgIiUyNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiUyOCIsICIlMjkiLCAiJTJBIiwgIiUyQiIsICIlMkMiLCAiJTJEIiwgIiUyRSIsICIlMkYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlMzAiLCAiJTMxIiwgIiUzMiIsICIlMzMiLCAiJTM0IiwgIiUzNSIsICIlMzYiLCAiJTM3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTM4IiwgIiUzOSIsICIlM0EiLCAiJTNCIiwgIiUzQyIsICIlM0QiLCAiJTNFIiwgIiUzRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU0MCIsICIlNDEiLCAiJTQyIiwgIiU0MyIsICIlNDQiLCAiJTQ1IiwgIiU0NiIsICIlNDciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlNDgiLCAiJTQ5IiwgIiU0QSIsICIlNEIiLCAiJTRDIiwgIiU0RCIsICIlNEUiLCAiJTRGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTUwIiwgIiU1MSIsICIlNTIiLCAiJTUzIiwgIiU1NCIsICIlNTUiLCAiJTU2IiwgIiU1NyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU1OCIsICIlNTkiLCAiJTVBIiwgIiU1QiIsICIlNUMiLCAiJTVEIiwgIiU1RSIsICIlNUYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlNjAiLCAiJTYxIiwgIiU2MiIsICIlNjMiLCAiJTY0IiwgIiU2NSIsICIlNjYiLCAiJTY3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTY4IiwgIiU2OSIsICIlNkEiLCAiJTZCIiwgIiU2QyIsICIlNkQiLCAiJTZFIiwgIiU2RiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU3MCIsICIlNzEiLCAiJTcyIiwgIiU3MyIsICIlNzQiLCAiJTc1IiwgIiU3NiIsICIlNzciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlNzgiLCAiJTc5IiwgIiU3QSIsICIlN0IiLCAiJTdDIiwgIiU3RCIsICIlN0UiLCAiJTdGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTgwIiwgIiU4MSIsICIlODIiLCAiJTgzIiwgIiU4NCIsICIlODUiLCAiJTg2IiwgIiU4NyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU4OCIsICIlODkiLCAiJThBIiwgIiU4QiIsICIlOEMiLCAiJThEIiwgIiU4RSIsICIlOEYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlOTAiLCAiJTkxIiwgIiU5MiIsICIlOTMiLCAiJTk0IiwgIiU5NSIsICIlOTYiLCAiJTk3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTk4IiwgIiU5OSIsICIlOUEiLCAiJTlCIiwgIiU5QyIsICIlOUQiLCAiJTlFIiwgIiU5RiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVBMCIsICIlQTEiLCAiJUEyIiwgIiVBMyIsICIlQTQiLCAiJUE1IiwgIiVBNiIsICIlQTciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlQTgiLCAiJUE5IiwgIiVBQSIsICIlQUIiLCAiJUFDIiwgIiVBRCIsICIlQUUiLCAiJUFGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUIwIiwgIiVCMSIsICIlQjIiLCAiJUIzIiwgIiVCNCIsICIlQjUiLCAiJUI2IiwgIiVCNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVCOCIsICIlQjkiLCAiJUJBIiwgIiVCQiIsICIlQkMiLCAiJUJEIiwgIiVCRSIsICIlQkYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlQzAiLCAiJUMxIiwgIiVDMiIsICIlQzMiLCAiJUM0IiwgIiVDNSIsICIlQzYiLCAiJUM3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUM4IiwgIiVDOSIsICIlQ0EiLCAiJUNCIiwgIiVDQyIsICIlQ0QiLCAiJUNFIiwgIiVDRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVEMCIsICIlRDEiLCAiJUQyIiwgIiVEMyIsICIlRDQiLCAiJUQ1IiwgIiVENiIsICIlRDciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlRDgiLCAiJUQ5IiwgIiVEQSIsICIlREIiLCAiJURDIiwgIiVERCIsICIlREUiLCAiJURGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUUwIiwgIiVFMSIsICIlRTIiLCAiJUUzIiwgIiVFNCIsICIlRTUiLCAiJUU2IiwgIiVFNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVFOCIsICIlRTkiLCAiJUVBIiwgIiVFQiIsICIlRUMiLCAiJUVEIiwgIiVFRSIsICIlRUYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlRjAiLCAiJUYxIiwgIiVGMiIsICIlRjMiLCAiJUY0IiwgIiVGNSIsICIlRjYiLCAiJUY3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUY4IiwgIiVGOSIsICIlRkEiLCAiJUZCIiwgIiVGQyIsICIlRkQiLCAiJUZFIiwgIiVGRiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JfTsKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIE5ldFV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJJIGZvciB0aGUgZ2l2ZW4gZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgVGhlIGlucHV0IGZpbGUuCi0JICogQHJldHVybiBUaGUgVVJJIGZvciB0aGUgZ2l2ZW4gZmlsZS4KLQkgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VyIHdoaWxlIGNvbnN0cnVjdGluZyB0aGUgVVJJIGZvciB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgICAgICBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVyaShGaWxlIGZpbGUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlTdHJpbmcgdXJsID0gZmlsZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCB1cmxMZW5ndGggPSB1cmwubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJsTGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB1cmwuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnICc6Ci0JCQkJc3RyQnVmLmFwcGVuZCgiJTIwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc3RyQnVmLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmVzIHRoZSBnaXZlbiBVUkkgdXNpbmcgdGhlIGdpdmVuIHRoZSBiYXNlIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgVVJJIHRvIHJlc29sdmUuCi0JICogQHBhcmFtIGJhc2VVcmkKLQkgKiAgICAgICAgICAgIFRoZSBiYXNlIFVSSS4KLQkgKiBAcmV0dXJuIEEgZnVsbHkgZm9ybWVkIFVSSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlVXJpKFN0cmluZyB1cmksIFN0cmluZyBiYXNlVXJpKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAodXJpLnN0YXJ0c1dpdGgoIi4uLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChiYXNlVXJpLmVuZHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWJhc2VVcmkgPSBiYXNlVXJpLnN1YnN0cmluZygwLCBiYXNlVXJpLmxlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCQl3aGlsZSAodXJpLnN0YXJ0c1dpdGgoIi4uLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl1cmkgPSB1cmkuc3Vic3RyaW5nKDMpOwotCQkJCWludCBpbmRleCA9IGJhc2VVcmkubGFzdEluZGV4T2YoJy8nKTsKLQkJCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQkJCWJhc2VVcmkgPSBiYXNlVXJpLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJfQotCQkJfQotCQkJdXJpID0gIi8iICsgdXJpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAodXJpLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gYmFzZVVyaS5lbmRzV2l0aCgiLyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJPyBiYXNlVXJpICsgdXJpLnN1YnN0cmluZygxKSA6IGJhc2VVcmkgKyB1cmk7Ci0JCX0KLQotCQlpZiAodXJpLnN0YXJ0c1dpdGgoRklMRV9VUklfUFJFRklYKSB8fCB1cmkuc3RhcnRzV2l0aChIVFRQX1VSSV9QUkVGSVgpKSB7Ci0JCQlyZXR1cm4gdXJpOwotCQl9Ci0KLQkJcmV0dXJuIGJhc2VVcmkuZW5kc1dpdGgoIi8iKSA/IGJhc2VVcmkgKyB1cmkgOiBiYXNlVXJpICsgJy8nICsgdXJpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5wdXQgc3RyZWFtIGZvciB0aGUgZ2l2ZW4gVVJJLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSBzb3VyY2UgVVJJLgotCSAqIEByZXR1cm4gVGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlIGdpdmVuIFVSSS4KLQkgKiBAdGhyb3cgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIGEgZ2l2ZW4gWE1MIGRvY3VtZW50IFVSSSBpcyBpbnZhbGlkLgotCSAqIEB0aHJvdyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXIgd2hpbGUgYWNjZXNzaW5nIHRoZSBVUkkuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgdXJpKQotCQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAodXJpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHVyaS5zdGFydHNXaXRoKEhUVFBfVVJJX1BSRUZJWCkpIHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVyaSk7Ci0JCQlyZXR1cm4gdXJsLm9wZW5TdHJlYW0oKTsKLQkJfSBlbHNlIGlmICh1cmkuc3RhcnRzV2l0aChGSUxFX1VSSV9QUkVGSVgpKSB7Ci0JCQl1cmkgPSB1cmkuc3Vic3RyaW5nKEZJTEVfVVJJX1BSRUZJWF9MRU5HVEgpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0oTmV0VXRpbC5kZWNvZGVVcmwodXJpLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSmF2YSBzdHJpbmcgcmVwcmVzZW50aW9uIChlbmNvZGVkIGluIFVURi0xNikgb2YgdGhlIGdpdmVuIFVSTAotCSAqIChlbmNvZGVkIGluIHRoZSBnaXZlbiBlbmNvZGluZyBhbmQgQVNDSUktZXNjYXBlZCkuCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgVGhlIFVSTCB0byBkZWNvZGUuCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgZW5jb2Rpbmcgb2YgdGhlIFVSTC4KLQkgKiBAcmV0dXJuIFRoZSBKYXZhIFVURi0xNiBzdHJpbmcgcmVzcHJlc2VudGF0aW9uLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIFVSTCBjb250YWluIGltcHJvcGVybHkgZXNjYXBlZCBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZVVybChTdHJpbmcgdXJsLCBTdHJpbmcgZW5jb2RpbmcpIHsKLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0JCQotCQlpbnQgbGVuID0gdXJsLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQotCQkvLyBVbmVzY2FwZSB0aGUgdXJsLgotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGNoID0gdXJsLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJysnOgotCQkJCXN0ckJ1Zi5hcHBlbmQoJyAnKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyUnOgotCQkJCXRyeSB7Ci0JCQkJCXN0ckJ1Zi5hcHBlbmQoKGNoYXIpIEludGVnZXIucGFyc2VJbnQodXJsLnN1YnN0cmluZyhpICsgMSwKLQkJCQkJCQlpICsgMyksIDE2KSk7Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlpICs9IDI7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXN0ckJ1Zi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLy8gQ29udmVydCB0aGUgdW4tZXNjYXBlZCBieXRlIHZhbHVlcyB0byBKYXZhIFVURi0xNiBzdHJpbmcuCi0JCVN0cmluZyByZXN1bHQgPSBzdHJCdWYudG9TdHJpbmcoKTsKLQkJaWYgKGVuY29kaW5nICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJYnl0ZVtdIGJ5dGVzID0gcmVzdWx0LmdldEJ5dGVzKCI4ODU5XzEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IG5ldyBTdHJpbmcoYnl0ZXMsIGVuY29kaW5nKTsKLQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBBU0NJSS1lc2NhcGVkIHJlcHJlc2VudGF0aW9uIChlbmNvZGVkIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBlbmNvZGluZykgb2YgdGhlIGdpdmVuIFVSTCAoZW5jb2RlZCBpbiBVVEYtMTYpLgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIFRoZSBVUkwgdG8gZW5jb2RlLgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIGVuY29kaW5nIG9mIHRoZSBVUkwuCi0JICogQHJldHVybiB0aGUgQVNDSUktZXNjYXBlZCByZXNwcmVzZW50YXRpb24uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gVVJMIGNvbnRhaW4gaW1wcm9wZXJseSBlc2NhcGVkIGNoYXJhY3RlcnMuCi0JICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIGNvZGluZyBpcyB1bnN1cHBvcnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlVXJsKFN0cmluZyB1cmwsIFN0cmluZyBlbmNvZGluZykKLQkJCXRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9CQkKLQkJaW50IGxlbiA9IHVybC5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlieXRlW10gYnl0ZXMgPSB1cmwuZ2V0Qnl0ZXMoZW5jb2RpbmcpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGNoID0gKGNoYXIpIGJ5dGVzW2ldOwotCi0JCQlpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykgewotCQkJCXJlc3VsdC5hcHBlbmQoY2gpOwotCQkJfSBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChjaCk7Ci0JCQl9IGVsc2UgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3dpdGNoIChjaCkgewotCQkJCWNhc2UgJy0nOgotCQkJCWNhc2UgJ18nOgotCQkJCWNhc2UgJy4nOgotCQkJCWNhc2UgJyEnOgotCQkJCWNhc2UgJ34nOgotCQkJCWNhc2UgJyonOgotCQkJCWNhc2UgJ1wnJzoKLQkJCQljYXNlICcoJzoKLQkJCQljYXNlICcpJzoKLQkJCQkJcmVzdWx0LmFwcGVuZChjaCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJlc3VsdC5hcHBlbmQoSEVYX1ZBTFVFU1tjaCAmIDB4RkZdKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEFTQ0lJLWVzY2FwZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGZpbGUgVVJMLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlVVJMCi0JICogICAgICAgICAgICBUaGUgZmlsZSBVUkwgdG8gZW5jb2RlLgotCSAqIEByZXR1cm4gdGhlIEFTQ0lJLWVzY2FwZWQgcmVzcHJlc2VudGF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZUZpbGVVUkwoU3RyaW5nIGZpbGVVUkwpIHsKLQkJU3RyaW5nIHVybCA9IGZpbGVVUkw7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCB1cmxMZW5ndGggPSB1cmwubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJsTGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB1cmwuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnICc6Ci0JCQkJc3RyQnVmLmFwcGVuZCgiJTIwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc3RyQnVmLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEFTQ0lJLWVzY2FwZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGZpbGUgVVJMLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlVVJMCi0JICogICAgICAgICAgICBUaGUgZmlsZSBVUkwgdG8gZW5jb2RlLgotCSAqIEByZXR1cm4gdGhlIEFTQ0lJLWVzY2FwZWQgcmVzcHJlc2VudGF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZWRGaWxlVXJsKFN0cmluZyBmaWxlVVJMKSB7Ci0JCVN0cmluZyB1cmwgPSBmaWxlVVJMOwotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgdXJsTGVuZ3RoID0gdXJsLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybExlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGNoID0gdXJsLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJyUnOgotCQkJCXRyeSB7Ci0JCQkJCXN0ckJ1Zi5hcHBlbmQoKGNoYXIpIEludGVnZXIucGFyc2VJbnQodXJsLnN1YnN0cmluZyhpICsgMSwKLQkJCQkJCQlpICsgMyksIDE2KSk7Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlpICs9IDI7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXN0ckJ1Zi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlVVJMIChTdHJpbmcgdXJsKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0vLwkJdXJsID0gdXJsLnJlcGxhY2VBbGwoIlxcKyIsICIlMkIiKTsgLy8kTk9OLU5MUy0xJAotCQl1cmwgPSBVUkxEZWNvZGVyLmRlY29kZSh1cmwsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB1cmw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1BlcnNwZWN0aXZlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1BlcnNwZWN0aXZlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVjZDI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9QZXJzcGVjdGl2ZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLldvcmtiZW5jaEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBhY2Nlc3NpbmcgcGVyc3BlY3RpdmVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlVXRpbCB7Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBQZXJzcGVjdGl2ZVV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGFjdGl2ZSBwZXJzcGVjdGl2ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBhY3RpdmUgcGVyc3BlY3RpdmUgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aXZlUGVyc3BlY3RpdmVJZCgpIHsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGFjdGl2ZVBlcnNwZWN0aXZlID0gYWN0aXZlUGFnZQotCQkJCQkuZ2V0UGVyc3BlY3RpdmUoKTsKLQkJCXJldHVybiBhY3RpdmVQZXJzcGVjdGl2ZS5nZXRJZCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgcGVyc3BlY3RpdmUuCi0JICogCi0JICogQHBhcmFtIHBlcnNwZWN0aXZlSWQKLQkgKiAgICAgICAgICAgIFRoZSBwZXJzcGVjdGl2ZSBJRC4KLQkgKiBAcmV0dXJuIFRoZSBwcmV2aW91c2x5IGFjdGl2ZSBwZXJzcGVjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQZXJzcGVjdGl2ZURlc2NyaXB0b3Igb3BlblBlcnNwZWN0aXZlKFN0cmluZyBwZXJzcGVjdGl2ZUlkKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJSVBlcnNwZWN0aXZlUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCk7Ci0JCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIG9sZFBlcnNwZWN0aXZlID0gYWN0aXZlUGFnZS5nZXRQZXJzcGVjdGl2ZSgpOwotCQkJaWYgKCFvbGRQZXJzcGVjdGl2ZS5nZXRJZCgpLmVxdWFscyhwZXJzcGVjdGl2ZUlkKSkgewotCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcGVyc3BlY3RpdmUgPSByZWdpc3RyeQotCQkJCQkJLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZChwZXJzcGVjdGl2ZUlkKTsKLQkJCQlhY3RpdmVQYWdlLnNldFBlcnNwZWN0aXZlKHBlcnNwZWN0aXZlKTsKLQkJCX0KLQkJCXJldHVybiBvbGRQZXJzcGVjdGl2ZTsKLQkJfSBlbHNlIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQl0cnkgewotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuc2hvd1BlcnNwZWN0aXZlKAotCQkJCQkJcGVyc3BlY3RpdmVJZCwgYWN0aXZlV2luZG93KTsKLQkJCX0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwZXJzcGVjdGl2ZSBpcyBhbHJlYWR5IGFjdGl2ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGVyc3BlY3RpdmVJZAotCSAqICAgICAgICAgICAgVGhlIHBlcnNwZWN0aXZlIElELgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY3RpdmVQZXJzcGVjdGl2ZShTdHJpbmcgcGVyc3BlY3RpdmVJZCkgewotCQlTdHJpbmcgYWN0aXZlUGVyc3BlY3RpdmVJZCA9IFBlcnNwZWN0aXZlVXRpbC5nZXRBY3RpdmVQZXJzcGVjdGl2ZUlkKCk7Ci0JCWlmIChwZXJzcGVjdGl2ZUlkID09IG51bGwgfHwgYWN0aXZlUGVyc3BlY3RpdmVJZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2ZVBlcnNwZWN0aXZlSWQuZXF1YWxzSWdub3JlQ2FzZShwZXJzcGVjdGl2ZUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2aWV3IHBhcnQgd2l0aCB0aGUgZ2l2ZW4gdmlldyBJRC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld0lkCi0JICogICAgICAgICAgICBUaGUgdmlldyBJRC4KLQkgKiBAcmV0dXJuIFRoZSB2aWV3IHBhcnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlld1BhcnQgZ2V0VmlldyhTdHJpbmcgdmlld0lkKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZS5maW5kVmlldyh2aWV3SWQpOwotCQkJCWlmICh2aWV3ID09IG51bGwpIHsKLQkJCQkJdmlldyA9IGFjdGl2ZVBhZ2Uuc2hvd1ZpZXcodmlld0lkKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHZpZXc7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvUHJlZmVyZW5jZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9QcmVmZXJlbmNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YjhhODM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9QcmVmZXJlbmNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGFjY2Vzc2luZyBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlVXRpbCB7Ci0KLQkvLyBUaGUgbXVsdGktc3RyaW5nIHByZWZlcmVuY2UgZGVsaW1pdGVyLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0RFTElNSVRFUiA9ICI7IjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfTElTVCA9IG5ldyBPYmplY3RbMF07Ci0KLQkvKioKLQkgKiBHZXRzIGEgbGlzdCBjb250YWluaW5nIHN0cmluZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlZlN0b3JlCi0JICogICAgICAgICAgICBhIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgbmFtZQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHN0cmluZyB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TGlzdChJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSwgU3RyaW5nIG5hbWUpIHsKLQkJTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChwcmVmU3RvcmUgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IHByZWZTdG9yZS5nZXRTdHJpbmcobmFtZSk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwKLQkJCQkJUFJFRkVSRU5DRV9ERUxJTUlURVIpOwotCQkJaW50IHRva2VuQ291bnQgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5Db3VudDsgaSsrKSB7Ci0JCQkJdmFsdWVzLmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3RyaW5nIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcmVmU3RvcmUKLQkgKiAgICAgICAgICAgIGEgcHJlZmVyZW5jZSBzdG9yZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSBuYW1lCi0JICogQHJldHVybiBhIGxpc3Qgb2Ygc3RyaW5nIHByZWZlcmVuY2UgdmFsdWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTdHJpbmdWYWx1ZXMoSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUsCi0JCQlTdHJpbmcgbmFtZSkgewotCQlMaXN0IGxpc3QgPSBnZXRMaXN0KHByZWZTdG9yZSwgbmFtZSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkodmFsdWVzKTsKLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBhIGxpc3QgY29udGFpbmluZyBzdHJpbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHByZWZTdG9yZQotCSAqICAgICAgICAgICAgYSBwcmVmZXJlbmNlIHN0b3JlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICBhIGxpc3Qgb2Ygc3RyaW5nIHZhbHVlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMaXN0KElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlLCBTdHJpbmcgbmFtZSwKLQkJCUxpc3QgdmFsdWVzKSB7Ci0JCWlmIChwcmVmU3RvcmUgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwgJiYgdmFsdWVzICE9IG51bGwpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZSk7Ci0JCQkJYnVmZmVyLmFwcGVuZChQUkVGRVJFTkNFX0RFTElNSVRFUik7Ci0JCQl9Ci0JCQlwcmVmU3RvcmUuc2V0VmFsdWUobmFtZSwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHN0cmluZyB2YWx1ZSB0byBhIGxpc3QgY29udGFpbmluZyBzdHJpbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBhCi0JICogbmFtZWQgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlZlN0b3JlCi0JICogICAgICAgICAgICBhIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgYSBzdHJpbmcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVG9MaXN0KElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlLCBTdHJpbmcgbmFtZSwKLQkJCVN0cmluZyB2YWx1ZSkgewotCQlpZiAocHJlZlN0b3JlICE9IG51bGwgJiYgbmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHsKLQkJCUxpc3QgbGlzdCA9IGdldExpc3QocHJlZlN0b3JlLCBuYW1lKTsKLQkJCWxpc3QucmVtb3ZlKHZhbHVlKTsKLQkJCWxpc3QuYWRkKDAsIHZhbHVlKTsKLQkJCS8vIEZJWE1FISBSZWFkIGZyb20gZ2xvYmFsIHByZWZlcmVuY2UuCi0JCQlpZiAobGlzdC5zaXplKCkgPiAxMCkgewotCQkJCWxpc3QgPSBsaXN0LnN1Ykxpc3QoMCwgMTApOwotCQkJfQotCQkJc2V0TGlzdChwcmVmU3RvcmUsIG5hbWUsIGxpc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcmVmU3RvcmUKLQkgKiAgICAgICAgICAgIGEgcHJlZmVyZW5jZSBzdG9yZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSBuYW1lCi0JICogQHBhcmFtIHZhbHVlcwotCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTdHJpbmdWYWx1ZXMoSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUsIFN0cmluZyBuYW1lLAotCQkJU3RyaW5nW10gdmFsdWVzKSB7Ci0JCWlmIChwcmVmU3RvcmUgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwgJiYgdmFsdWVzICE9IG51bGwpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCWJ1ZmZlci5hcHBlbmQodmFsdWVzW2ldKTsKLQkJCQlidWZmZXIuYXBwZW5kKFBSRUZFUkVOQ0VfREVMSU1JVEVSKTsKLQkJCX0KLQkJCXByZWZTdG9yZS5zZXRWYWx1ZShuYW1lLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9Qcm9maWxpbmdVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvUHJvZmlsaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0M2Q0MDNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9Qcm9maWxpbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHByb2ZpbGluZwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2ZpbGluZ1V0aWwgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGZ1bGxHQygpIHsKLQkJUnVudGltZSBydCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOwotCQlsb25nIGlzRnJlZSA9IHJ0LmZyZWVNZW1vcnkoKTsKLQkJbG9uZyB3YXNGcmVlOwotCQlkbyB7Ci0JCQl3YXNGcmVlID0gaXNGcmVlOwotCQkJcnQucnVuRmluYWxpemF0aW9uKCk7Ci0JCQlydC5nYygpOwotCQkJaXNGcmVlID0gcnQuZnJlZU1lbW9yeSgpOwotCQl9IHdoaWxlIChpc0ZyZWUgPiB3YXNGcmVlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvU3RyVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1N0clV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAwOTIxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvU3RyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LmxhbmcuVUNoYXJhY3RlcjsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgbWFudWlwdWxhdGluZyBzdHJpbmdzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQiA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWFBfQU5ZX1NQRUNJQUxfQ0hBUlMgPSAiKGB8fnwhfEB8I3xcXCR8JXxcXF58JnxcXCp8XFwofFxcKXxcXCt8PXxcXFt8XFxdfFxcfHxcXDp8XCJ8PHw+fFxcP3wvfCd8XFxzfFxcXFwpKyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWFBfSU5WQUxJRF9QVUJMSVNIRURfUEFUSF9DSEFSUyA9ICIoXFxbfCN8XFwqfFxcP3xcInw8fD58XFx8fCF8JXwvfFxcXSkrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYUF9JTlZBTElEX1BVQkxJU0hFRF9QQVRIX0NIQVJTX0xJTlVYID0gIihcXFt8I3xcXCp8XFw/fFwifDx8PnxcXHx8IXwlfFxcXSkrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYUF9JTlZBTElEX0ZJTEVOQU1FX0NIQVJTID0gIihcXFt8I3wvfFxcXFx8XFw6fFxcKnxcXD98XCJ8PHw+fFxcfHxcXF18XFxzKSsiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gSEVYX0RJR0lUUyA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywKLQkJCSc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJyB9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9GRUVEID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0ZFRURfUkVHRVggPSBMSU5FX0ZFRUQucmVwbGFjZUFsbCgKLQkJCSJcXFxcIiwgIlxcXFwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0JSRUFLID0gIjxici8+IjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0NPUFkgPSAiJmNvcHk7IjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0VVUk8gPSAiJmV1cm87IjsvLyROT04tTkxTLTEkIAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfUkVHID0gIiZyZWc7IjsvLyROT04tTkxTLTEkIAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9UUkFERU1BUksgPSAiJnRyYWRlOyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIEFsbAotCSAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQgYmUgc3RhdGljLgotCSAqLwotCXByaXZhdGUgU3RyVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyBmb3IgbnVsbCBzdHJpbmcuCi0JICogPHA+Ci0JICogQSBudWxsIHN0cmluZyBpcyBkZWZpbmVkIGFzIG9uZSB0aGF0IGhhcyBhbiBlbXB0eSByZWZlcmVuY2Ugb3IgaGFzIHplcm8KLQkgKiBsZW5ndGguCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBudWxsIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc051bGwoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgZm9yIGJsYW5rIHN0cmluZy4KLQkgKiA8cD4KLQkgKiBBIGJsYW5rIHN0cmluZyBpcyBkZWZpbmVkIGFzIG9uZSB0aGF0IGhhcyBhbiBlbXB0eSByZWZlcmVuY2Ugb3IgaGFzIHplcm8KLQkgKiBsZW5ndGggYWZ0ZXIgdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlIGNoYXJhY3RlcnMgYXJlIHRyaW1tZWQuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBibGFuayBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCbGFuayhTdHJpbmcgc3RyKSB7Ci0JCXJldHVybiBzdHIgPT0gbnVsbCB8fCBzdHIudHJpbSgpLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2UgY2hhcmFjdGVycyBmcm9tIGEgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHJldHVybiBhIHN0cmluZyB3aXRoIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlIGNoYXJhY3RlcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0cmltKFN0cmluZyBzdHIpIHsKLQkJcmV0dXJuIHN0ciA9PSBudWxsID8gbnVsbCA6IHN0ci50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgKFRBQiwgQ1IsIExGIGFuZCBTUEFDRSkgZnJvbSBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEByZXR1cm4gYSBzdHJpbmcgd2l0aCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcmVtb3ZlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVdoaXRlU3BhY2VDaGFycyhTdHJpbmcgc3RyKSB7Ci0JCWludCBsZW4gPSAoc3RyID09IG51bGwpID8gMCA6IHN0ci5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJc3dpdGNoIChzdHIuY2hhckF0KGkpKSB7Ci0JCQljYXNlICdcdCc6Ci0JCQljYXNlICdccic6Ci0JCQljYXNlICdcbic6Ci0JCQljYXNlICcgJzoKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIHN0cjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTcGxpdHMgYSBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBzdHJpbmcgdG9rZW5zLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHBhcmFtIHNlcAotCSAqICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc3RyaW5nIHNlcGFyYXRvcnMKLQkgKiBAcGFyYW0gY291bnQKLQkgKiAgICAgICAgICAgIHRoZSBkZXNpcmVkIG51bWJlciBvZiBzdHJpbmcgdG9rZW5zCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBzdHJpbmcgdG9rZW5zCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzcGxpdChTdHJpbmcgc3RyLCBTdHJpbmcgc2VwLCBpbnQgY291bnQpIHsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IGNvdW50ID09IDAgfHwgY291bnQgPCAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsIHNlcCwKLQkJCQljb3VudCA9PSAtMSA/IGZhbHNlIDogdHJ1ZSk7Ci0KLQkJaWYgKGNvdW50ID09IC0xKSB7Ci0JCQljb3VudCA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQl9Ci0KLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tjb3VudF07Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaWYgKGkgPCBjb3VudCkgewotCQkJCWlmICgodC5sZW5ndGgoKSA9PSAxKSAmJiAoc2VwLmluZGV4T2YodCkgIT0gLTEpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlyZXN1bHRbaSsrXSA9IHQ7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdFtjb3VudCAtIDFdICs9IHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTcGxpdHMgYSBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBzdHJpbmcgdG9rZW5zLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHBhcmFtIHNlcAotCSAqICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc3RyaW5nIHNlcGFyYXRvcnMKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHN0cmluZyB0b2tlbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNwbGl0KFN0cmluZyBzdHIsIFN0cmluZyBzZXApIHsKLQkJcmV0dXJuIHNwbGl0KHN0ciwgc2VwLCAtMSk7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgYSBzdWJzdHJpbmcgd2l0aGluIGEgc3RyaW5nIHdpdGggYW5vdGhlciBzdWJzdHJpbmcuCi0JICogPHA+Ci0JICogTm90ZTogT25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3Vic3RyaW5nIHdpbGwgYmUgcmVwbGFjZWQuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcGFyYW0gc3JjCi0JICogICAgICAgICAgICB0aGUgc3Vic3RyaW5nIHRvIHJlcGxhY2UKLQkgKiBAcGFyYW0gdGd0Ci0JICogICAgICAgICAgICB0aGUgc3Vic3RyaW5nIHRvIHVzZSBmb3IgdGhlIHJlcGxhY2VtZW50Ci0JICogQHJldHVybiBhIHN0cmluZyB3aXRoIHRoZSBmaXJzdCBzdWJzdHJpbmcgcmVwbGFjZWQKLQkgKiAKLQkgKiBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uIENhbGwgU3RyaW5nLnJlcGxhY2VGaXJzdCgpIGluc3RlYWQ/Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgc3RyLCBTdHJpbmcgc3JjLCBTdHJpbmcgdGd0KSB7Ci0JCWlmICgoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApCi0JCQkJfHwgKHNyYyA9PSBudWxsIHx8IHNyYy5sZW5ndGgoKSA9PSAwKSkgewotCQkJcmV0dXJuIHN0cjsKLQkJfQotCi0JCVN0cmluZyB0bXBTdHIgPSBzdHI7Ci0JCWludCBpbmRleDsKLQkJd2hpbGUgKChpbmRleCA9IHRtcFN0ci5pbmRleE9mKHNyYykpICE9IC0xKSB7Ci0JCQl0bXBTdHIgPSB0bXBTdHIuc3Vic3RyaW5nKDAsIGluZGV4KSArIHRndAotCQkJCQkrIHRtcFN0ci5zdWJzdHJpbmcoaW5kZXggKyBzcmMubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiB0bXBTdHI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZSBvZiBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKLQkgKiAgICAgICAgICAgIGEgZGVmYXVsdCBpbnRlZ2VyIHZhbHVlIGZvciB0aGUgc3RyaW5nCi0JICogQHJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgZ2l2ZW4gc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50VmFsdWUoU3RyaW5nIHN0ciwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQlpZiAoU3RyVXRpbC5pc0JsYW5rKHN0cikpIHsKLQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoc3RyKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgVVRGLTggZW5jb2Rpbmcgb2YgYSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBVVEYtOCBlbmNvZGluZyBvZiB0aGUgZ2l2ZW4gc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gZ2V0VVRGOEJ5dGVzKFN0cmluZyBzdHIpIHsKLQkJY2hhcltdIGMgPSBzdHIudG9DaGFyQXJyYXkoKTsKLQkJaW50IGxlbiA9IGMubGVuZ3RoOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpbnQgY2ggPSBjW2ldOwotCQkJaWYgKGNoIDw9IDB4N2YpIHsKLQkJCQljb3VudCsrOwotCQkJfSBlbHNlIGlmIChjaCA8PSAweDdmZikgewotCQkJCWNvdW50ICs9IDI7Ci0JCQl9IGVsc2UgewotCQkJCWNvdW50ICs9IDM7Ci0JCQl9Ci0JCX0KLQotCQlieXRlW10gYiA9IG5ldyBieXRlW2NvdW50XTsKLQkJaW50IG9mZiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWludCBjaCA9IGNbaV07Ci0JCQlpZiAoY2ggPD0gMHg3ZikgewotCQkJCWJbb2ZmKytdID0gKGJ5dGUpIGNoOwotCQkJfSBlbHNlIGlmIChjaCA8PSAweDdmZikgewotCQkJCWJbb2ZmKytdID0gKGJ5dGUpICgoY2ggPj4gNikgfCAweGMwKTsKLQkJCQliW29mZisrXSA9IChieXRlKSAoKGNoICYgMHgzZikgfCAweDgwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYltvZmYrK10gPSAoYnl0ZSkgKChjaCA+PiAxMikgfCAweGUwKTsKLQkJCQliW29mZisrXSA9IChieXRlKSAoKChjaCA+PiA2KSAmIDB4M2YpIHwgMHg4MCk7Ci0JCQkJYltvZmYrK10gPSAoYnl0ZSkgKChjaCAmIDB4M2YpIHwgMHg4MCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGV4aWRlY2ltYWwgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uIGZvciBhbiBpbnRlZ2VyLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgYW4gaW50ZWdlcgotCSAqIEByZXR1cm4gdGhlIGhleGlkZWNpbWFsIHJlcHJlc2VudGF0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhciB0b0hleChpbnQgdmFsdWUpIHsKLQkJcmV0dXJuIEhFWF9ESUdJVFNbKHZhbHVlICYgMHhGKV07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXNjYXBlZCBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIGEgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHBhcmFtIHNraXBBU0NJSQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGF2b2lkIGVzY2FwaW5nIHRoZSBBU0NJSSBjaGFyYWN0ZXJzCi0JICogQHJldHVybiB0aGUgZXNjYXBlZCBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0VzY2FwZWRVbmljb2RlKFN0cmluZyBzdHIsIGJvb2xlYW4gc2tpcEFTQ0lJKSB7Ci0JCWludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbiAqIDIpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotCi0JCQlpZiAoc2tpcEFTQ0lJICYmIGNoIDwgMHgwMDdFKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChjaCk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdC5hcHBlbmQoIlxcdSIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZCh0b0hleCgoY2ggPj4gMTIpICYgMHhGKSk7Ci0JCQkJcmVzdWx0LmFwcGVuZCh0b0hleCgoY2ggPj4gOCkgJiAweEYpKTsKLQkJCQlyZXN1bHQuYXBwZW5kKHRvSGV4KChjaCA+PiA0KSAmIDB4RikpOwotCQkJCXJlc3VsdC5hcHBlbmQodG9IZXgoY2ggJiAweEYpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlc2NhcGVkIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgYSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcmV0dXJuIHRoZSBlc2NhcGVkIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVzY2FwZWRIVE1MKFN0cmluZyBzdHIpIHsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnJSc6Ci0JCQkJU3RyaW5nIGhleFN0ciA9IHN0ci5zdWJzdHJpbmcoaSArIDEsIGkgKyA1KTsKLQkJCQl0cnkgewotCQkJCQlpbnQgY29kZVBvaW50ID0gSW50ZWdlci5wYXJzZUludChoZXhTdHIsIDE2KTsKLQkJCQkJLy8gTm90ZTogMHg0ZTAwIGlzIHRoZSBmaXJzdCBjb2RlIHBvaW50IGZvciBDSksgSWRlb2dyYXBoLgotCQkJCQlpZiAoY29kZVBvaW50ID49IDB4NGUwMAotCQkJCQkJCSYmIGNvZGVQb2ludCA8IENoYXJhY3Rlci5NQVhfQ09ERV9QT0lOVCkgewotCQkJCQkJY2hhcltdIGMgPSBVQ2hhcmFjdGVyLnRvQ2hhcnMoY29kZVBvaW50KTsKLQkJCQkJCXJlc3VsdC5hcHBlbmQoYyk7Ci0JCQkJCQlpICs9IDQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCXJlc3VsdC5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHUwMGE5JzoKLQkJCQlyZXN1bHQuYXBwZW5kKEhUTUxfQ09QWSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcdTAwYWUnOgotCQkJCXJlc3VsdC5hcHBlbmQoSFRNTF9SRUcpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHUyMGFjJzoKLQkJCQlyZXN1bHQuYXBwZW5kKEhUTUxfRVVSTyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcdTIxMjInOgotCQkJCXJlc3VsdC5hcHBlbmQoSFRNTF9UUkFERU1BUkspOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGxhaW4gdGV4dCBmcm9tIEhUTUwgdGV4dC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBBbGwgSFRNTCB0YWdzIHdpbGwgYmUgc3RyaXBwZWQuCi0JICogCi0JICogQHBhcmFtIGh0bWwKLQkgKiAgICAgICAgICAgIHRoZSBIVE1MIHRleHQuCi0JICogQHJldHVybiB0aGUgcGxhaW4gdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gSFRNTCB0ZXh0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGxhaW5UZXh0KFN0cmluZyBodG1sKSB7Ci0JCWlmIChodG1sID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZmluYWwgUGF0dGVybiBwX3BsYWludGV4dF9maWx0ZXIgPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkJIjxbXj5dKj8+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFBhdHRlcm4gcF9wbGFpbnRleHRfZmlsdGVyMiA9IFBhdHRlcm4uY29tcGlsZSgKLQkJCQkiJi57MSw1fVteO107IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFBhdHRlcm4gcF9wbGFpbnRleHRfZmlsdGVyMyA9IFBhdHRlcm4uY29tcGlsZSgKLQkJCQkiXFxzKyIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyByZXN1bHQgPSBodG1sLnJlcGxhY2VBbGwocF9wbGFpbnRleHRfZmlsdGVyLnBhdHRlcm4oKSwgIiAiKSAvLyROT04tTkxTLTEkCi0JCQkJLnJlcGxhY2VBbGwocF9wbGFpbnRleHRfZmlsdGVyMi5wYXR0ZXJuKCksICIgIikgLy8kTk9OLU5MUy0xJAotCQkJCS5yZXBsYWNlQWxsKHBfcGxhaW50ZXh0X2ZpbHRlcjMucGF0dGVybigpLCAiICIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYSBzdHJpbmcgaW50byBhIHZhbGlkIGZpbGUgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEByZXR1cm4gYSB2YWxpZCBmaWxlIG5hbWUgZGVydmllZCBmcm9tIHRoZSBnaXZlbiBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlVmFsaWRGaWxlTmFtZShTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBsYWluVGV4dChzdHIpCi0JCQkJLnJlcGxhY2VBbGwoUkVHRVhQX0lOVkFMSURfRklMRU5BTUVfQ0hBUlMsICIgIikudHJpbSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVTcGVjaWFsQ2hhcmFjdGVycyhTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBsYWluVGV4dChzdHIpCi0JCQkJLnJlcGxhY2VBbGwoUkVHRVhQX0FOWV9TUEVDSUFMX0NIQVJTLCAiICIpLnRyaW0oKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBwYXRoIGRvZXMgbm90IGNvbnRhaW4gYW55IGludmFsaWQgZmlsZW5hbWUKLQkgKiBjaGFyYWN0ZXJzLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgZmlsZSBwYXRoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGF0aCBjb250YWlucyBvbmx5IHZhbGlkCi0JICogICAgICAgICBmaWxlbmFtZSBjaGFyYWN0ZXJzCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRQdWJsaXNoUGF0aChTdHJpbmcgcGF0aCkgewotCQkvLyByZXR1cm4gcGF0aC5yZXBsYWNlQWxsKGludmFsaWRQdWJsaXNoUGF0aENoYXJzUmVnRXhwLAotCQkvLyAiIikuZXF1YWxzKHBhdGgpOwotCi0JCWlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCXJldHVybiBwYXRoCi0JCQkJCS5yZXBsYWNlQWxsKFJFR0VYUF9JTlZBTElEX1BVQkxJU0hFRF9QQVRIX0NIQVJTLCAiIikuZXF1YWxzKHBhdGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBlbHNlIGRlZmF1bHQgdG8gTGludXgKLQkJcmV0dXJuIHBhdGgKLQkJCQkucmVwbGFjZUFsbChSRUdFWFBfSU5WQUxJRF9QVUJMSVNIRURfUEFUSF9DSEFSU19MSU5VWCwgIiIpLmVxdWFscyhwYXRoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvd2VyLWNhc2Ugb2Ygc3RyIHVubGVzcyB0aGUgY3VycmVudCBsb2NhbGUgaXMgR2VybWFuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0xvd2VyKFN0cmluZyBzdHIpIHsKLQkJaWYgKFBsYXRmb3JtLmdldE5MKCkuc3RhcnRzV2l0aCgiZGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gc3RyOwotCQl9Ci0JCXJldHVybiBzdHIudG9Mb3dlckNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBlc2NhcGUgdGhlICIgYW5kICcKLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgc3RyKSB7Ci0JCXJldHVybiBzdHIucmVwbGFjZUFsbCgiJyIsICJcXFxcXCciKS5yZXBsYWNlQWxsKCJcIiIsICJcXFxcXCIiKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIDxjb2RlPkxpc3Q8L2NvZGU+IHRvIGFuIFN0cmluZyBhcnJheS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdAotCSAqICAgICAgICAgICAgYSA8Y29kZT5MaXN0PC9jb2RlPgotCSAqIEByZXR1cm4gYSBTdHJpbmcgYXJyYXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGNvbnZlcnRMaXN0VG9TdHJBcnJheShMaXN0IGxpc3QpIHsKLQkJaWYgKGxpc3QgIT0gbnVsbCkgewotCQkJaW50IGNudCA9IGxpc3Quc2l6ZSgpOwotCQkJU3RyaW5nW10gc3RyQXJyYXkgPSBuZXcgU3RyaW5nW2NudF07Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKyspIHsKLQkJCQlTdHJpbmcgc3RyID0gKFN0cmluZykgbGlzdC5nZXQoaSk7Ci0JCQkJc3RyQXJyYXlbaV0gPSBuZXcgU3RyaW5nKHN0cik7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyQXJyYXk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTmFtZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmFtZS5yZXBsYWNlQWxsKFJFR0VYUF9BTllfU1BFQ0lBTF9DSEFSUywgIiIpLmVxdWFscyhuYW1lKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JLyoqCi0JICogYWRkZWQgc29tZSB0ZXN0IGNvZGUKLQkgKiAKLQkgKiBAcGFyYW0gYXJncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlTdHJpbmcgdGV4dCA9ICJBJiUgICAgICBgJiMgICAgICAgICAgICR+IUAjJCVeJiooKV8tKz17fVtcIl06fFxcOjtcIic8LD4uPy8gXHRcclxuWiI7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJbIiArIHRleHQgKyAiXSA8PT0gdGV4dCIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiICsgdGV4dC5yZXBsYWNlQWxsKFJFR0VYUF9BTllfU1BFQ0lBTF9DSEFSUywgIiAiKQotCQkJCSsgIl0gPD09IEFsbCIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiCi0JCQkJKyB0ZXh0LnJlcGxhY2VBbGwoUkVHRVhQX0lOVkFMSURfRklMRU5BTUVfQ0hBUlMsICIgIikKLQkJCQkrICJdIDw9PSBGaWxlIE5hbWUiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJbIgotCQkJCSsgdGV4dC5yZXBsYWNlQWxsKFJFR0VYUF9JTlZBTElEX1BVQkxJU0hFRF9QQVRIX0NIQVJTLCAiICIpCi0JCQkJKyAiXSA8PT0gcGF0aCIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiCi0JCQkJKyB0ZXh0LnJlcGxhY2VBbGwoUkVHRVhQX0lOVkFMSURfUFVCTElTSEVEX1BBVEhfQ0hBUlNfTElOVVgsCi0JCQkJCQkiICIpICsgIl0gPD09IHBhdGgsIExpbnV4Iik7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyB0aGUgcGxhdGZvcm0gbGluZS1zZXBhcmF0b3IgKFxuIG9yIFxuXHIgb3IgXHIpIHRvICZsdDtici8mZ3Q7Ci0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydE5ld2xpbmVzVG9IVE1MKFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCXRleHQgPSB0ZXh0LnJlcGxhY2VBbGwoTElORV9GRUVEX1JFR0VYLCBIVE1MX0JSRUFLICsgTElORV9GRUVEKTsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1RocmVhZFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9UaHJlYWRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1YjQyM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1RocmVhZFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgaGFuZGxpbmcgdGhyZWFkcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUaHJlYWRVdGlsIHsKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIFRocmVhZFV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogUHV0cyB0aGUgY3VycmVudCB0aHJlYWQgdG8gc2xlZXAgZm9yIGEgZ2l2ZW4gZHVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHRpbWUKLQkgKiAgICAgICAgICAgIFRoZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhdXNlKGxvbmcgdGltZSkgewotCQl0cnkgewotCQkJVGhyZWFkLnNsZWVwKHRpbWUpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9UaW1lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1RpbWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5ZjI5OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1RpbWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogQSBzaW1wbGUgdGltZXIgZm9yIHRyYWNraW5nIHRpbWUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lciB7Ci0KLQlwcml2YXRlIGxvbmcgaW5pdFRpbWU7Ci0KLQlwcml2YXRlIGxvbmcgc3RhcnRUaW1lOwotCi0JcHJpdmF0ZSBsb25nIGVuZFRpbWU7Ci0KLQlwdWJsaWMgVGltZXIoKSB7Ci0JCXN0YXJ0KCk7Ci0JCWluaXRUaW1lID0gc3RhcnRUaW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQlzdGFydFRpbWUgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCWVuZFRpbWUgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGltZSgpIHsKLQkJcmV0dXJuIChpbnQpIChlbmRUaW1lIC0gc3RhcnRUaW1lKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRvdGFsVGltZSgpIHsKLQkJcmV0dXJuIChpbnQpIChlbmRUaW1lIC0gaW5pdFRpbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1dhclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9XYXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5MmFmZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1dhclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5XYXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLQotCi1wdWJsaWMgY2xhc3MgV2FyVXRpbCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd2FyIGZpbGUuCi0JICogCi0JICogQHBhcmFtIG91dHB1dFdhckZpbGUKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIHRhcmdldCB3YXIgZmlsZQotCSAqIEBwYXJhbSB3ZWJBcHBEaXJlY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZXMgYW5kIHN1YgotCSAqICAgICAgICAgICAgZGlyZWN0b3JpZXMgdG8gYmUgd2FyZWQKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGUgemlwIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYnVpbGRXYXJGaWxlKFN0cmluZyBvdXRwdXRXYXJGaWxlLCBTdHJpbmcgd2ViQXBwRGlyZWN0b3J5LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlQcm9qZWN0IGFudFByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotCQkJYW50UHJvamVjdC5pbml0KCk7Ci0JCQlXYXIgd2FyVGFzayA9IG5ldyBXYXIoKTsKLQkJCXdhclRhc2suc2V0UHJvamVjdChhbnRQcm9qZWN0KTsKLQkJCXdhclRhc2suc2V0RGVzdEZpbGUobmV3IEZpbGUob3V0cHV0V2FyRmlsZSkpOwotCQkJd2FyVGFzay5zZXRXZWJ4bWwobmV3IEZpbGUod2ViQXBwRGlyZWN0b3J5ICsgRmlsZS5zZXBhcmF0b3IgKyAiV0VCLUlORiIKLQkJCQkJKyBGaWxlLnNlcGFyYXRvciArICJ3ZWIueG1sIikpOwotCQkJRmlsZVNldCB3ZWJGaWxlcyA9IG5ldyBGaWxlU2V0KCk7Ci0JCQl3ZWJGaWxlcy5zZXREaXIobmV3IEZpbGUod2ViQXBwRGlyZWN0b3J5KSk7Ci0JCQl3YXJUYXNrLmFkZEZpbGVzZXQod2ViRmlsZXMpOwotCQkJd2FyVGFzay5leGVjdXRlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9YTUxVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvWE1MVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MmVhZjYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9YTUxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHByb2Nlc3NpbmcgWE1MIGRvY3VtZW50cy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MVXRpbCB7Ci0KLQkvKioKLQkgKiBYTUwgZGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0RFQ0xBUkFUSU9OID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFhNTCBFc2NhcGUgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfQU1QID0gIiZhbXA7IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9CQUNLU0xBU0ggPSAiJiM5MjsiOyAvLyROT04tTkxTLTEkCQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0FQT1MgPSAiJmFwb3M7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0NSID0gIiYjMTM7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0dUID0gIiZndDsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfTFQgPSAiJmx0OyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9MRiA9ICImIzEwOyI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfUVVPVCA9ICImcXVvdDsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfVEFCID0gIiYjOTsiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JMRiA9ICJcclxuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIENSTEZfQllURVMgPSBDUkxGLmdldEJ5dGVzKCk7Ci0JCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIEFsbAotCSAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQgYmUgc3RhdGljLgotCSAqLwotCXByaXZhdGUgWE1MVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDbG9uZXMgdGhlIGdpdmVuIERPTSBub2RlIGludG8gdGhlIGdpdmVuIERPTSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgVGhlIERPTSBub2RlIHRvIGNsb25lLgotCSAqIEBwYXJhbSBkb2MKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgRE9NIGRvY3VtZW50LgotCSAqIEByZXR1cm4gVGhlIGNsb25lZCBub2RlIGluIHRoZSB0YXJnZXQgRE9NIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBjbG9uZU5vZGUoTm9kZSBub2RlLCBEb2N1bWVudCBkb2MpIHsKLQkJTm9kZSBjbG9uZSA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCWNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0JCQljbG9uZSA9IGRvYy5jcmVhdGVFbGVtZW50KG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgYXR0ck5vZGUgPSBhdHRycy5pdGVtKGkpOwotCQkJCUF0dHIgYXR0ckNsb25lID0gZG9jLmNyZWF0ZUF0dHJpYnV0ZShhdHRyTm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCQlhdHRyQ2xvbmUuc2V0Tm9kZVZhbHVlKGF0dHJOb2RlLmdldE5vZGVWYWx1ZSgpKTsKLQkJCQkoKEVsZW1lbnQpIGNsb25lKS5zZXRBdHRyaWJ1dGVOb2RlKGF0dHJDbG9uZSk7Ci0JCQl9Ci0KLQkJCS8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGNoaWxkIG5vZGVzLgotCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJaWYgKGNoaWxkTm9kZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCU5vZGUgY2hpbGROb2RlID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotCQkJCQlOb2RlIGNoaWxkQ2xvbmUgPSBjbG9uZU5vZGUoY2hpbGROb2RlLCBkb2MpOwotCQkJCQljbG9uZS5hcHBlbmRDaGlsZChjaGlsZENsb25lKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE5vZGUuVEVYVF9OT0RFOgotCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOgotCQkJY2xvbmUgPSBkb2MuY3JlYXRlVGV4dE5vZGUobm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCWNsb25lLnNldE5vZGVWYWx1ZShub2RlLmdldE5vZGVWYWx1ZSgpKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBjbG9uZTsKLQl9Ci0JCi0JLyoqCi0JICogRXNjYXBlcyBhIFhNTCBhdHRyaWJ1dGUgdG8gbWFrZSBpdCBYTUwgcGFyc2VyIGZyaWVuZGx5LgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgYXR0cmlidXRlIHN0cmluZy4KLQkgKiBAcmV0dXJuIFRoZSBlc2NhcGVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGVBdHRyKFN0cmluZyBzdHIpIHsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGxlbiA9IHN0ci5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjaCA9IHN0ci5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICc8JzoKLQkJCQlzYi5hcHBlbmQoWE1MX0xUKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyYnOgotCQkJCXNiLmFwcGVuZChYTUxfQU1QKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyInOgotCQkJCXNiLmFwcGVuZChYTUxfUVVPVCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQkKLQotCS8qKgotCSAqIEVzY2FwZXMgdGhlIGdpdmVuIHN0cmluZyB0byBtYWtlIGl0IFhNTCBwYXJzZXIgZnJpZW5kbHkuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgVGhlIHNvdXJjZSBzdHJpbmcuCi0JICogQHJldHVybiBUaGUgZXNjYXBlZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBzdHIpIHsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGxlbiA9IHN0ci5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjaCA9IHN0ci5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICc8JzoKLQkJCQlzYi5hcHBlbmQoWE1MX0xUKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJz4nOgotCQkJCXNiLmFwcGVuZChYTUxfR1QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnJic6Ci0JCQkJc2IuYXBwZW5kKFhNTF9BTVApOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnIic6Ci0JCQkJc2IuYXBwZW5kKFhNTF9RVU9UKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1wnJzoKLQkJCQlzYi5hcHBlbmQoWE1MX0FQT1MpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHInOgotCQkJCXNiLmFwcGVuZChYTUxfQ1IpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXG4nOgotCQkJCXNiLmFwcGVuZChYTUxfTEYpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXFwnOgotCQkJCXNiLmFwcGVuZChYTUxfQkFDS1NMQVNIKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBFc2NhcGVzIHRoZSBnaXZlbiBzdHJpbmcgdG8gbWFrZSBpdCBYTUwgcGFyc2VyIGZyaWVuZGx5LgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIFRoZSBzb3VyY2Ugc3RyaW5nLgotCSAqIEBwYXJhbSBpZ25vcmVDUkxGCi0JICogICAgICAgICAgICBJZiB0cnVlLCBkbyBub3QgZXNjYXBlIHRoZSBDUiBhbmQgTEYgY2hhcmFjdGVycy4KLQkgKiBAcmV0dXJuIFRoZSBlc2NhcGVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHN0ciwgYm9vbGVhbiBpZ25vcmVDUkxGKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnPCc6Ci0JCQkJc2IuYXBwZW5kKFhNTF9MVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc+JzoKLQkJCQlzYi5hcHBlbmQoWE1MX0dUKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyYnOgotCQkJCXNiLmFwcGVuZChYTUxfQU1QKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyInOgotCQkJCXNiLmFwcGVuZChYTUxfUVVPVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcJyc6Ci0JCQkJc2IuYXBwZW5kKFhNTF9BUE9TKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xyJzoKLQkJCQlpZiAoaWdub3JlQ1JMRikKLQkJCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQllbHNlCi0JCQkJCXNiLmFwcGVuZChYTUxfQ1IpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXG4nOgotCQkJCWlmIChpZ25vcmVDUkxGKQotCQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJCWVsc2UKLQkJCQkJc2IuYXBwZW5kKFhNTF9MRik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVW5lc2NhcGVzIHRoZSBnaXZlbiBYTUwgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIFRoZSBzb3VyY2Ugc3RyaW5nLgotCSAqIEByZXR1cm4gVGhlIGVzY2FwZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlKFN0cmluZyBzdHIpIHsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGxlbiA9IHN0ci5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjaCA9IHN0ci5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICcmJzoKLQkJCQlpZiAoc3RyLnN0YXJ0c1dpdGgoWE1MX0xULCBpKSkgewotCQkJCQlzYi5hcHBlbmQoJzwnKTsKLQkJCQkJaSArPSAzOwotCQkJCX0gZWxzZSBpZiAoc3RyLnN0YXJ0c1dpdGgoWE1MX0dULCBpKSkgewotCQkJCQlzYi5hcHBlbmQoJz4nKTsKLQkJCQkJaSArPSAzOwotCQkJCX0gZWxzZSBpZiAoc3RyLnN0YXJ0c1dpdGgoWE1MX0FNUCwgaSkpIHsKLQkJCQkJc2IuYXBwZW5kKCcmJyk7Ci0JCQkJCWkgKz0gNDsKLQkJCQl9IGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9RVU9ULCBpKSkgewotCQkJCQlzYi5hcHBlbmQoJyInKTsKLQkJCQkJaSArPSA1OwotCQkJCX0gZWxzZSBpZiAoc3RyLnN0YXJ0c1dpdGgoWE1MX0FQT1MsIGkpKSB7Ci0JCQkJCXNiLmFwcGVuZCgiXCciKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpICs9IDU7Ci0JCQkJfSBlbHNlIGlmIChzdHIuc3RhcnRzV2l0aChYTUxfQ1IsIGkpKSB7Ci0JCQkJCXNiLmFwcGVuZCgnXHInKTsKLQkJCQkJaSArPSA0OwotCQkJCX0gZWxzZSBpZiAoc3RyLnN0YXJ0c1dpdGgoWE1MX0xGLCBpKSkgewotCQkJCQlzYi5hcHBlbmQoJ1xuJyk7Ci0JCQkJCWkgKz0gNDsKLQkJCQl9IGVsc2UgewotCQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIERPTSBkb2N1bWVudCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0geG1sRG9jCi0JICogICAgICAgICAgICBUaGUgRE9NIGRvY3VtZW50LgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgc3RyZWFtLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXIgd2hpbGUgYWNjZXNzaW5nIHRoZSBvdXRwdXQgc3RyZWFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZURvY3VtZW50KERvY3VtZW50IHhtbERvYywgT3V0cHV0U3RyZWFtIG91dHB1dCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0cHV0KTsKLQkJd3JpdGVOb2RlKHhtbERvYywgIiIsIG91dCk7IC8vJE5PTi1OTFMtMSQKLQkJb3V0LmZsdXNoKCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBET00gZG9jdW1lbnQgdG8gdGhlIFByaW50V3JpdGVyLgotCSAqIAotCSAqIEBwYXJhbSB4bWxEb2MKLQkgKiAgICAgICAgICAgIFRoZSBET00gZG9jdW1lbnQuCi0JICogQHBhcmFtIHB3Ci0JICogICAgICAgICAgICBUaGUgUHJpbnRXcml0ZXIgb2JqZWN0LgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXIgd2hpbGUgYWNjZXNzaW5nIHRoZSBvdXRwdXQgc3RyZWFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZURvY3VtZW50KERvY3VtZW50IHhtbERvYywgUHJpbnRXcml0ZXIgcHcpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3MpOwotCQl3cml0ZU5vZGUoeG1sRG9jLCAiIiwgb3V0KTsgLy8kTk9OLU5MUy0xJAotCQlvdXQuZmx1c2goKTsKLQkJLy8gRklYTUUhIE5lZWQgdG8gc3BlY2lmeSBlbmNvZGluZz8KLQkJU3RyaW5nIHMgPSBvcy50b1N0cmluZygpOwotCQlwdy53cml0ZShzKTsKLQkJcHcuZmx1c2goKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gRE9NIGRvY3VtZW50IHRvIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHhtbERvYwotCSAqICAgICAgICAgICAgVGhlIERPTSBkb2N1bWVudC4KLQkgKiBAcGFyYW0geG1sRmlsZQotCSAqICAgICAgICAgICAgVGhlIFhNTCBmaWxlLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXIgd2hpbGUgYWNjZXNzaW5nIHRoZSBvdXRwdXQgc3RyZWFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlRG9jdW1lbnQoRG9jdW1lbnQgeG1sRG9jLCBTdHJpbmcgeG1sRmlsZSkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oCi0JCQkJeG1sRmlsZSkpOwotCQl3cml0ZU5vZGUoeG1sRG9jLCAiIiwgb3V0KTsgLy8kTk9OLU5MUy0xJAotCQlvdXQuZmx1c2goKTsKLQkJb3V0LmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGdpdmVuIFhNTCBzdHJpbmcgdG8gdGhlIGdpdmVuIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzdHJpbmcuCi0JICogQHBhcmFtIHhtbEZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgZmlsZS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VyIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZURvY3VtZW50KFN0cmluZyB4bWxTdHIsIFN0cmluZyB4bWxGaWxlKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgKLQkJCQl4bWxGaWxlKSk7Ci0JCW91dC53cml0ZSh4bWxTdHIuZ2V0Qnl0ZXMoKSk7Ci0JCW91dC5mbHVzaCgpOwotCQlvdXQuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhlIGdpdmVuIERPTSB0cmVlIG5vZGUgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIFRoZSBET00gbm9kZS4KLQkgKiBAcGFyYW0gaW5kZW50Ci0JICogICAgICAgICAgICBUaGUgc3RyaW5nIGluZGVudGF0aW9uIChjb250YWluaW5nIHNwYWNlIGNoYXJhY3RlcnMpLgotCSAqIEBwYXJhbSBvdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgc3RyZWFtLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXIgd2hpbGUgYWNjZXNzaW5nIHRoZSBvdXRwdXQgc3RyZWFtLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVOb2RlKE5vZGUgbm9kZSwgU3RyaW5nIGluZGVudCwgRGF0YU91dHB1dFN0cmVhbSBvdXQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgdGV4dDsKLQotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQljYXNlIE5vZGUuRE9DVU1FTlRfTk9ERToKLQkJCS8vIFdyaXRlIHRoZSBYTUwgZmlsZSBzaWduYXR1cmUuCi0JCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoWE1MX0RFQ0xBUkFUSU9OKSk7Ci0JCQlvdXQud3JpdGUoQ1JMRl9CWVRFUyk7Ci0KLQkJCS8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGNoaWxkIG5vZGVzLgotCQkJTm9kZUxpc3Qgbm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCWlmIChub2RlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCXdyaXRlTm9kZShub2Rlcy5pdGVtKGkpLCAiIiwgb3V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0JCQlTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcyhpbmRlbnQgKyAiPCIgKyBuYW1lKSk7IC8vJE5PTi1OTFMtMSQKLQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBhdHRyTm9kZSA9IGF0dHJzLml0ZW0oaSk7Ci0JCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKCIgIiArIGF0dHJOb2RlLmdldE5vZGVOYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyAiPVwiIiArIGVzY2FwZShhdHRyTm9kZS5nZXROb2RlVmFsdWUoKSkgKyAiXCIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKCI+IikpOyAvLyROT04tTkxTLTEkCi0JCQlvdXQud3JpdGUoQ1JMRl9CWVRFUyk7Ci0KLQkJCS8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGNoaWxkIG5vZGVzLgotCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJaWYgKGNoaWxkTm9kZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCXdyaXRlTm9kZShjaGlsZE5vZGVzLml0ZW0oaSksIGluZGVudCwgb3V0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoaW5kZW50ICsgIjwvIiArIG5hbWUgKyAiPiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlvdXQud3JpdGUoQ1JMRl9CWVRFUyk7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTm9kZS5URVhUX05PREU6Ci0JCQl0ZXh0ID0gU3RyVXRpbC5yZW1vdmVXaGl0ZVNwYWNlQ2hhcnMobm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQlpZiAodGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoZXNjYXBlKHRleHQpKSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOgotCQkJdGV4dCA9IFN0clV0aWwucmVtb3ZlV2hpdGVTcGFjZUNoYXJzKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKCI8IVtDREFUQVsiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXModGV4dCkpOwotCQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcygiXV0+IikpOyAvLyROT04tTkxTLTEkCi0JCQkJb3V0LndyaXRlKENSTEZfQllURVMpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKLQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcygiPD8iICsgbm9kZS5nZXROb2RlTmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiICIgKyBub2RlLmdldE5vZGVWYWx1ZSgpICsgIj8+IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW91dC53cml0ZShDUkxGX0JZVEVTKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREU6Ci0JCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoIiYiICsgbm9kZS5nZXROb2RlTmFtZSgpICsgIjsiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIGxvY2F0aW9uIHdoZXJlIHRoZSBnaXZlbiBTQVggZXhjZXB0aW9uIG9jY3VycmVkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBUaGUgU0FYIHBhcnNlIGV4Y2VwdGlvbi4KLQkgKiBAcmV0dXJuIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZpbGUgbG9jYXRpb24gd2hlcmUgdGhlIGV4Y2VwdGlvbgotCSAqICAgICAgICAgb2NjdXJyZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYXRpb25PZkV4Y2VwdGlvbihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKCJyb3cgIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKGUuZ2V0TGluZU51bWJlcigpKTsKLQkJc2IuYXBwZW5kKCIsIGNvbCAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoZS5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0KLQkJU3RyaW5nIHN5c3RlbUlkID0gZS5nZXRTeXN0ZW1JZCgpOwotCQlpZiAoc3lzdGVtSWQgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gc3lzdGVtSWQubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCXN5c3RlbUlkID0gc3lzdGVtSWQuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoIiBvZiBYTUwgZG9jdW1lbnQgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXNiLmFwcGVuZChzeXN0ZW1JZCk7Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IGxvYWRYbWwoRmlsZSBmaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBidWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkKLQkJCQkubmV3SW5zdGFuY2UoKTsKLQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBidWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQotCQlyZXR1cm4gYnVpbGRlci5wYXJzZShmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50QnVpbGRlckZhY3RvcnkgYnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ci0JCQkJLm5ld0luc3RhbmNlKCk7Ci0JCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gYnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCXJldHVybiBidWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogdGV4dCBvZiBhIGxlYWYgbm9kZSwgd2l0aG91dCBjaGlsZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIHRhZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Tm9kZVRleHQoRWxlbWVudCB0YWcpIHsKLQkJU3RyaW5nIHRleHQgPSB0YWcudG9TdHJpbmcoKTsKLQkJaW50IGkgPSB0ZXh0LmluZGV4T2YoIj4iKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaiA9IHRleHQubGFzdEluZGV4T2YoIjwvIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGkgPCAwIHx8IGogPCAwIHx8IGogPCBpKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiB0ZXh0LnN1YnN0cmluZyhpICsgMSwgaik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2hpbGRUZXh0KEVsZW1lbnQgdGFnLCBTdHJpbmcgY2hpbGRUYWdOYW1lKSB7Ci0JCUVsZW1lbnQgY2hpbGQgPSBnZXRGaXJzdENoaWxkKHRhZywgY2hpbGRUYWdOYW1lKTsKLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXROb2RlVGV4dChjaGlsZCk7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0Rmlyc3RDaGlsZChFbGVtZW50IHRhZywgU3RyaW5nIGNoaWxkVGFnTmFtZSkgewotCQlOb2RlTGlzdCBub2RlcyA9IHRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShjaGlsZFRhZ05hbWUpOwotCQlpZiAobm9kZXMgPT0gbnVsbCB8fCBub2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRvciBvZiBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIHRhZwotCSAqIEByZXR1cm4gSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGNoaWxkSXRlcmF0b3IoRWxlbWVudCB0YWcpIHsKLQkJTm9kZUxpc3Qgbm9kZXMgPSB0YWcuZ2V0Q2hpbGROb2RlcygpOwotCi0JCS8vIE5vZGVMaXN0IGNvbnRhaW5zIG5vIEVsZW1lbnQgbm9kZXMgc3VjaCBhcyB0ZXh0IG5vZGVzLCBpZ25vcmUgdGhvc2UKLQkJTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKG5vZGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJCWVsZW1lbnRzLmFkZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudHMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb2RlSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0JCWludCBjdXJyZW50SW5kZXggPSAtMTsKLQotCQlpbnQgc2l6ZSA9IDA7Ci0KLQkJTm9kZUxpc3Qgbm9kZXMgPSBudWxsOwotCi0JCXB1YmxpYyBOb2RlSXRlcmF0b3IoTm9kZUxpc3Qgbm9kZXMpIHsKLQkJCXRoaXMubm9kZXMgPSBub2RlczsKLQkJCWlmIChub2RlcyAhPSBudWxsKQotCQkJCXNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCS8vIERvIG5vdGhpbmcsIHRoaXMgaXMgYSByZWFkb25seSBpdGVyYXRvci4KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gY3VycmVudEluZGV4ICsgMSA8IHNpemU7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQlpZiAoaGFzTmV4dCgpKSB7Ci0JCQkJcmV0dXJuIG5vZGVzLml0ZW0oKytjdXJyZW50SW5kZXgpOwotCQkJfQotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBpdGVyYXRvciBvZiBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIHRhZwotCSAqIEByZXR1cm4gSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGNoaWxkSXRlcmF0b3IoRWxlbWVudCB0YWcsIFN0cmluZyBjaGlsZFRhZ05hbWUpIHsKLQkJTm9kZUxpc3Qgbm9kZXMgPSB0YWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoY2hpbGRUYWdOYW1lKTsKLQkJcmV0dXJuIG5ldyBOb2RlSXRlcmF0b3Iobm9kZXMpOwotCX0KLQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9aaXBVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvWmlwVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOGI3MzBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9aaXBVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB6aXAgZmlsZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgWmlwVXRpbCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgemlwIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHppcEZpbGVQYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB0YXJnZXQgemlwIGZpbGUKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZXMgYW5kIHN1YgotCSAqICAgICAgICAgICAgZGlyZWN0b3JpZXMgdG8gYmUgemlwcGVkCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIHppcCBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVppcEZpbGUoU3RyaW5nIHppcEZpbGVQYXRoLCBTdHJpbmcgY29udGVudFBhdGgsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVppcE91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQl0cnkgewotCQkJb3V0ID0gbmV3IFppcE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgKLQkJCQkJemlwRmlsZVBhdGgpKTsKLQkJCUZpbGUgY29udGVudERpciA9IG5ldyBGaWxlKGNvbnRlbnRQYXRoKTsKLQkJCXBvcHVsYXRlWmlwRmlsZShvdXQsIGNvbnRlbnREaXIuZ2V0QWJzb2x1dGVQYXRoKCksIGNvbnRlbnREaXIsCi0JCQkJCW1vbml0b3IpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChvdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCW91dC5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgYSB6aXAgZmlsZSB3aXRoIGRpcmVjdG9yaWVzIGFuZCBmaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gb3V0Ci0JICogICAgICAgICAgICBhIHppcCBmaWxlIG91dHB1dCBzdHJlYW0KLQkgKiBAcGFyYW0gcm9vdFBhdGgKLQkgKiAgICAgICAgICAgIGEgcm9vdCBwYXRoIHRoYXQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUKLQkgKiAgICAgICAgICAgIHppcCBjb250ZW50Ci0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGEgZmlsZSBvciBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBvcHVsYXRlWmlwRmlsZShaaXBPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgcm9vdFBhdGgsCi0JCQlGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQlwb3B1bGF0ZVppcEZpbGUob3V0LCByb290UGF0aCwgZmlsZXNbaV0sIG1vbml0b3IpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZyBmaWxlUGF0aCA9IGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQlGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVQYXRoKTsKLQkJCQkJU3RyaW5nIHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoCi0JCQkJCQkJLnN1YnN0cmluZyhyb290UGF0aC5sZW5ndGgoKSArIDEpOwotCQkJCQlvdXQucHV0TmV4dEVudHJ5KG5ldyBaaXBFbnRyeShyZWxhdGl2ZVBhdGgpKTsKLQkJCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotCQkJCQlpbnQgbGVuOwotCQkJCQl3aGlsZSAoKGxlbiA9IGluLnJlYWQoYnVmZmVyKSkgPiAwKSB7Ci0JCQkJCQlvdXQud3JpdGUoYnVmZmVyLCAwLCBsZW4pOwotCQkJCQl9Ci0JCQkJCW91dC5jbG9zZUVudHJ5KCk7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzIxNmJhYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGNvbW1vbiBjbGlwYm9hcmQsIGZpbGUsIEkxOE4sIGltYWdlLCBuZXR3b3JraW5nLCBzdHJpbmcgbWFuaXB1bGF0aW9uIGFuZCB0aHJlYWRpbmcgc2VydmljZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3htbC9BYnN0cmFjdFNBWFBhcnNlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3htbC9BYnN0cmFjdFNBWFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YzkxYTFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvQWJzdHJhY3RTQVhQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIEFuIGFic3RyYWN0IFNBWCBwYXJzZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBwYXJzZSBhIHNpbmdsZSBYTUwgZmlsZSBvciBhCi0gKiBkaXJlY3Rvcnkgb2YgWE1MIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U0FYUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0JLyoqCi0JICogVGhlIGxvZ2dlciB1c2VkIGZvciBsb2dnaW5nIHdhcm5pbmdzLCBlcnJvcnMgYW5kIGV4Y2VwdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIExvZ2dlciBsb2dnZXI7Ci0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBYTUwgZmlsZSBiZWluZyBwYXJzZWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB4bWxGaWxlOwotCi0JLyoqCi0JICogVGhlIFN0cmluZyBidWZmZXIgZm9yIGFjY3VtdWxhdGluZyB0ZXh0LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdCdWZmZXIgc3RyQnVmOwotCi0JLyoqCi0JICogVGhlIFhNTCB2YWxpZGF0aW5nIGZsYWcuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRpbmc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0U2F4UGFyc2VyPC9jb2RlPiBnaXZlbiB0aGUgdmFsaWRhdGluZyBmbGFnLgotCSAqIAotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKiAgICAgICAgICAgIFRoZSBsb2dnZXIgZm9yIGxvZ2dpbmcgd2FybmluZ3MgYW5kIGVycm9ycy4KLQkgKiBAcGFyYW0gdmFsaWRhdGluZwotCSAqICAgICAgICAgICAgSWYgdHJ1ZSwgdmFsaWRhdGUgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RTQVhQYXJzZXIoTG9nZ2VyIGxvZ2dlciwgYm9vbGVhbiB2YWxpZGF0aW5nKSB7Ci0JCXRoaXMubG9nZ2VyID0gbG9nZ2VyOwotCQl0aGlzLnZhbGlkYXRpbmcgPSB2YWxpZGF0aW5nOwotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gWE1MIGRpcmVjdG9yeSBvciBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4bWxQYXRoCi0JICogICAgICAgICAgICBUaGUgWE1MIGRpcmVjdG9yeSBvciBmaWxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyB4bWxQYXRoKSB7Ci0JCVN0cmluZyBwYXRoTmFtZSA9IFN0clV0aWwucmVwbGFjZSh4bWxQYXRoLCAiJTIwIiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUZpbGUgcGF0aCA9IG5ldyBGaWxlKHBhdGhOYW1lKTsKLQkJRmlsZVtdIGZpbGVzID0gcGF0aC5pc0ZpbGUoKSA/IG5ldyBGaWxlW10geyBwYXRoIH0gOiBwYXRoLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQl0cnkgewotCQkJCQkJcGFyc2VGaWxlKGZpbGVzW2ldLmdldEFic29sdXRlRmlsZSgpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWlmIChsb2dnZXIgIT0gbnVsbCkgewotCQkJCQkJCWxvZ2dlcgotCQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCQkiRmFpbGVkIHRvIHBhcnNlIFwiIiArIGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpICsgJyInLCBlKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBnaXZlbiBYTUwgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0geG1sRmlsZQotCSAqICAgICAgICAgICAgVGhlIFhNTCBmaWxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhcnNlRmlsZShGaWxlIHhtbEZpbGUpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLAotCQkJSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCS8vIENyZWF0ZSB0aGUgU0FYIHBhcnNlciBmYWN0b3J5LgotCQlTQVhQYXJzZXJGYWN0b3J5IHNwZiA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotCQkvLyBTZXQgdGhlIFhNTCB2YWxpZGF0aW5nIGZsYWcuCi0JCXNwZi5zZXRWYWxpZGF0aW5nKHZhbGlkYXRpbmcpOwotCi0JCS8vIENyZWF0ZSB0aGUgU0FYIHBhcnNlci4KLQkJU0FYUGFyc2VyIHNheFBhcnNlciA9IHNwZi5uZXdTQVhQYXJzZXIoKTsKLQotCQkvLyBHZXQgdGhlIFNBWCBYTUwgcmVhZGVyLgotCQlYTUxSZWFkZXIgeG1sUmVhZGVyID0gc2F4UGFyc2VyLmdldFhNTFJlYWRlcigpOwotCi0JCS8vIFNldCB0aGUgU0FYIHBhcnNlciBoYW5kbGVycyB0byB0aGlzIGNsYXNzLgotCQl4bWxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIodGhpcyk7Ci0JCXhtbFJlYWRlci5zZXRFcnJvckhhbmRsZXIodGhpcyk7Ci0KLQkJLy8gSW5zdHJ1Y3QgdGhlIFNBWCBwYXJzZXIgdG8gcGFyc2UgdGhlIGdpdmVuIFhNTCBmaWxlLgotCQl0aGlzLnhtbEZpbGUgPSB4bWxGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQl4bWxSZWFkZXIucGFyc2UoTmV0VXRpbC5nZXRVcmkoeG1sRmlsZSkpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBYTUwgcGFyc2VyIHN0YXJ0cyB0byBwYXJzZSB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHsKLQkJc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSB0aGUgWE1MIHBhcnNlciBlbmNvdW50ZXJzIHRoZSBjaGFyYXJhY3RlciBkYXRhIHdpdGhpbiBhCi0JICogdGV4dCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGJ1ZmZlciwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN0ckJ1Zi5hcHBlbmQoYnVmZmVyLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgcGFyc2VyIHN0YXJ0cyB0byBwYXJzZSBlYWNoIG5ldyBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJMLCBTdHJpbmcgbG9jYWxOYW1lLAotCQkJU3RyaW5nIHFuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpOwotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFhNTCBwYXJzZXIgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBhbiBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSTCwgU3RyaW5nIGxvY2FsTmFtZSwKLQkJCVN0cmluZyBxbmFtZSk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgWE1MIHBhcnNlciByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgewotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIFNBWCBwYXJzaW5nIHdhcm5pbmcuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIFRoZSBTQVggcGFyc2UgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZSkgewotCQlpZiAobG9nZ2VyICE9IG51bGwpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nV2FybmluZygiU0FYIHBhcnNpbmcgd2FybmluZyBlbmNvdW50ZXJlZCBhdCAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIFhNTFV0aWwuZ2V0TG9jYXRpb25PZkV4Y2VwdGlvbihlKQotCQkJCQkJCSsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgU0FYIHBhcnNpbmcgZXJyb3IuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIFRoZSBTQVggcGFyc2UgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLQkJaWYgKGxvZ2dlciAhPSBudWxsKSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKCJTQVggcGFyc2luZyBlcnJvciBlbmNvdW50ZXJlZCBhdCAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIFhNTFV0aWwuZ2V0TG9jYXRpb25PZkV4Y2VwdGlvbihlKQotCQkJCQkJCSsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgU0FYIG5vbi1yZWNvdmVyYWJsZSBlcnJvciBhbmQgZXhpdHMuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIFRoZSBTQVggcGFyc2UgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChsb2dnZXIgIT0gbnVsbCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigiU0FYIHBhcnNpbmcgZmF0YWwgZXJyb3IgZW5jb3VudGVyZWQgYXQgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBYTUxVdGlsLmdldExvY2F0aW9uT2ZFeGNlcHRpb24oZSkKLQkJCQkJCQkrICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgWE1MIGZpbGUgdGhhdCBpcyBiZWluZyBwYXJzZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgWE1MIGZpbGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRYTUxGaWxlKCkgewotCQlyZXR1cm4geG1sRmlsZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24veG1sL1hTTFRQcm9jZXNzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvWFNMVFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMzczMTNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvWFNMVFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBBIHdyYXBwZXIgb3ZlciB0aGUgWFNMVCBwcm9jZXNzb3IgYnVuZGxlZCB3aXRoIHRoZSBKUkUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWFNMVFByb2Nlc3NvciB7Ci0KLQkvLyBJZiB0cnVlLCBjYWNoZSB0aGUgY29tcGlsZWQgdGhlIFhTTCB0cmFuc2Zvcm1lciB3aXRoIHRoZSBjb21waWxlZCBYU0wKLQkvLyB0ZW1wbGF0ZXMuCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYWNoZVhTTDsKLQotCS8vIENhY2hlcyB0aGUgWFNMIHRyYW5zZm9ybWVycy4KLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBUcmFuc2Zvcm1lcj4gdHJhbnNmb3JtZXJDYWNoZTsKLQotCXN0YXRpYyB7Ci0JCVN0cmluZyBjYWNoZVhTTFByb3BlcnR5ID0gQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmcoCi0JCQkJImNhY2hlWFNMIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNhY2hlWFNMUHJvcGVydHkgIT0gbnVsbCAmJiAhY2FjaGVYU0xQcm9wZXJ0eS5zdGFydHNXaXRoKCJbIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJY2FjaGVYU0wgPSBCb29sZWFuLmdldEJvb2xlYW4oY2FjaGVYU0xQcm9wZXJ0eSk7Ci0JCX0gZWxzZSB7Ci0JCQljYWNoZVhTTCA9IHRydWU7Ci0JCX0KLQkJaWYgKGNhY2hlWFNMKSB7Ci0JCQl0cmFuc2Zvcm1lckNhY2hlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUcmFuc2Zvcm1lcj4oKTsKLQkJfQotCQkKLQkJLy8gSW5jcmVhc2UgdGhlIGVudGl0eSBleHBhbnNpb24gbGluZSBsaW1pdCB0byBoYW5kbGUgYSBsYXJnZXIgbnVtYmVyIG9mIFhNTCBlbnRpdGllcy4gCi0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiZW50aXR5RXhwYW5zaW9uTGltaXQiLCAiMTAwMDAwMCIpOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgcHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZwotCSAqIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIFhTTFRQcm9jZXNzb3IoKSB7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHNvdXJjZSwgWE1MIHNvdXJjZSwgdGFyZ2V0Ci0JICogb3V0cHV0IGFuZCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0geHNsU291cmNlCi0JICogICAgICAgICAgICBUaGUgWFNMIHNvdXJjZS4KLQkgKiBAcGFyYW0geG1sU291cmNlCi0JICogICAgICAgICAgICBUaGUgWE1MIHNvdXJjZS4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHRhcmdldC4KLQkgKiBAcGFyYW0gcGFyYW1zCi0JICogICAgICAgICAgICBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbi4KLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTb3VyY2UgeHNsU291cmNlLCBTb3VyY2UgeG1sU291cmNlLAotCQkJV3JpdGVyIG91dHB1dCwgUHJvcGVydGllcyBwYXJhbXMsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh4c2xTb3VyY2UgIT0gbnVsbCAmJiB4bWxTb3VyY2UgIT0gbnVsbCkgewotCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBudWxsOwotCQkJU3RyaW5nIHhzbEZpbGUgPSB4c2xTb3VyY2UuZ2V0U3lzdGVtSWQoKTsKLQkJCWlmIChjYWNoZVhTTCAmJiB4c2xGaWxlICE9IG51bGwpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKHRyYW5zZm9ybWVyQ2FjaGUpIHsKLQkJCQkJdHJhbnNmb3JtZXIgPSAoVHJhbnNmb3JtZXIpIHRyYW5zZm9ybWVyQ2FjaGUuZ2V0KHhzbEZpbGUpOwotCQkJCQlpZiAodHJhbnNmb3JtZXIgPT0gbnVsbCkgewotCQkJCQkJVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkKLQkJCQkJCQkJLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQl0cmFuc2Zvcm1lciA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoeHNsU291cmNlKTsKLQkJCQkJCXRyYW5zZm9ybWVyQ2FjaGUucHV0KHhzbEZpbGUsIHRyYW5zZm9ybWVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCQl0cmFuc2Zvcm1lciA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoeHNsU291cmNlKTsKLQkJCX0KLQkJCWlmIChwYXJhbXMgIT0gbnVsbCAmJiBwYXJhbXMuc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaSA9IHBhcmFtcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJU3RyaW5nIHBhcmFtTmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotCQkJCQlTdHJpbmcgcGFyYW1WYWx1ZSA9IHBhcmFtcy5nZXRQcm9wZXJ0eShwYXJhbU5hbWUpOwotCQkJCQl0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIocGFyYW1OYW1lLCBwYXJhbVZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZW5jb2RpbmcgIT0gbnVsbCAmJiBlbmNvZGluZy5sZW5ndGgoKSA+IDApIHsKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgiZW5jb2RpbmciLCBlbmNvZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoImVuY29kaW5nIiwgInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHhtbFNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChvdXRwdXQpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzb3VyY2UsIFhNTCBzb3VyY2UsIHRhcmdldAotCSAqIG91dHB1dCBhbmQgZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIHhzbFNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzb3VyY2UuCi0JICogQHBhcmFtIHhtbFNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIFhNTCBzb3VyY2UuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU291cmNlIHhzbFNvdXJjZSwgU291cmNlIHhtbFNvdXJjZSwKLQkJCVdyaXRlciBvdXRwdXQsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xTb3VyY2UsIHhtbFNvdXJjZSwgb3V0cHV0LCBudWxsLCBlbmNvZGluZyk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc291cmNlLAotCSAqIHRhcmdldCBvdXRwdXQgYW5kIGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzb3VyY2UuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24uCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU291cmNlIHhtbFNvdXJjZSwKLQkJCVdyaXRlciBvdXRwdXQsIFByb3BlcnRpZXMgcGFyYW1zLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSB4c2xJbnB1dCA9IGdldFhzbElucHV0U3RyZWFtKHhzbFVyaSk7Ci0JCWlmICh4c2xJbnB1dCAhPSBudWxsKSB7Ci0JCQlTdHJlYW1Tb3VyY2UgeHNsU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSh4c2xJbnB1dCk7Ci0JCQl4c2xTb3VyY2Uuc2V0U3lzdGVtSWQobmV3IEZpbGUoeHNsVXJpKSk7Ci0JCQl0cmFuc2Zvcm0oeHNsU291cmNlLCB4bWxTb3VyY2UsIG91dHB1dCwgcGFyYW1zLCBlbmNvZGluZyk7Ci0JCQl0cnkgewotCQkJCXhzbElucHV0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc291cmNlLAotCSAqIHRhcmdldCBvdXRwdXQgYW5kIGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzb3VyY2UuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU291cmNlIHhtbFNvdXJjZSwKLQkJCVdyaXRlciBvdXRwdXQsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xVcmksIHhtbFNvdXJjZSwgb3V0cHV0LCBudWxsLCBlbmNvZGluZyk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc3RyaW5nLAotCSAqIHRhcmdldCBvdXRwdXQgYW5kIGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzdHJpbmcuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24uCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU3RyaW5nIHhtbFN0ciwgV3JpdGVyIG91dHB1dCwKLQkJCVByb3BlcnRpZXMgcGFyYW1zLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSB4c2xJbnB1dCA9IGdldFhzbElucHV0U3RyZWFtKHhzbFVyaSk7Ci0JCWlmICh4c2xJbnB1dCAhPSBudWxsKSB7Ci0JCQlTdHJlYW1Tb3VyY2UgeHNsU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSh4c2xJbnB1dCk7Ci0JCQl4c2xTb3VyY2Uuc2V0U3lzdGVtSWQobmV3IEZpbGUoeHNsVXJpKSk7Ci0KLQkJCWJ5dGVbXSB4bWwgPSB4bWxTdHIuZ2V0Qnl0ZXMoInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHhtbElucHV0ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbCk7Ci0JCQlTdHJlYW1Tb3VyY2UgeG1sU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSh4bWxJbnB1dCk7Ci0KLQkJCXRyYW5zZm9ybSh4c2xTb3VyY2UsIHhtbFNvdXJjZSwgb3V0cHV0LCBwYXJhbXMsIGVuY29kaW5nKTsKLQotCQkJdHJ5IHsKLQkJCQl4c2xJbnB1dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHN0cmluZywKLQkgKiB0YXJnZXQgb3V0cHV0IGFuZCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFN0cmluZyB4bWxTdHIsIFdyaXRlciBvdXRwdXQsCi0JCQlTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTdHIsIG91dHB1dCwgbnVsbCwgZW5jb2RpbmcpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHN0cmluZywKLQkgKiB0YXJnZXQgb3V0cHV0IGFuZCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBUaGUgb3V0cHV0IGZpbGUuCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24uCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU3RyaW5nIHhtbFN0ciwgRmlsZSBmaWxlLAotCQkJUHJvcGVydGllcyBwYXJhbXMsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGVXcml0ZXIgb3V0cHV0ID0gbmV3IEZpbGVXcml0ZXIoZmlsZSk7Ci0JCWlmIChvdXRwdXQgIT0gbnVsbCkgewotCQkJdHJhbnNmb3JtKHhzbFVyaSwgeG1sU3RyLCBvdXRwdXQsIHBhcmFtcywgZW5jb2RpbmcpOwotCQkJdHJ5IHsKLQkJCQlvdXRwdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzdHJpbmcsCi0JICogdGFyZ2V0IG91dHB1dCBhbmQgZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHN0cmluZy4KLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCBmaWxlLgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFN0cmluZyB4bWxTdHIsIEZpbGUgZmlsZSwKLQkJCVN0cmluZyBlbmNvZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xVcmksIHhtbFN0ciwgZmlsZSwgbnVsbCwgZW5jb2RpbmcpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHNvdXJjZQotCSAqIGFuZCB0YXJnZXQgb3V0cHV0LgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzb3VyY2UuCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24uCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTb3VyY2UgeG1sU291cmNlLAotCQkJUHJvcGVydGllcyBwYXJhbXMsIFdyaXRlciBvdXRwdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTb3VyY2UsIG91dHB1dCwgcGFyYW1zLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzb3VyY2UKLQkgKiBhbmQgdGFyZ2V0IG91dHB1dC4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc291cmNlLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU291cmNlIHhtbFNvdXJjZSwgV3JpdGVyIG91dHB1dCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTb3VyY2UsIG91dHB1dCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc3RyaW5nCi0JICogYW5kIHRhcmdldCBvdXRwdXQuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHN0cmluZy4KLQkgKiBAcGFyYW0gcGFyYW1zCi0JICogICAgICAgICAgICBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbi4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFN0cmluZyB4bWxTdHIsCi0JCQlQcm9wZXJ0aWVzIHBhcmFtcywgV3JpdGVyIG91dHB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xVcmksIHhtbFN0ciwgb3V0cHV0LCBwYXJhbXMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHN0cmluZwotCSAqIGFuZCB0YXJnZXQgb3V0cHV0LgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzdHJpbmcuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTdHJpbmcgeG1sU3RyLCBXcml0ZXIgb3V0cHV0KQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xVcmksIHhtbFN0ciwgb3V0cHV0LCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzdHJpbmcKLQkgKiBhbmQgdGFyZ2V0IG91dHB1dCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzdHJpbmcuCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24uCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTdHJpbmcgeG1sU3RyLAotCQkJUHJvcGVydGllcyBwYXJhbXMsIEZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xVcmksIHhtbFN0ciwgZmlsZSwgcGFyYW1zLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzdHJpbmcKLQkgKiBhbmQgdGFyZ2V0IG91dHB1dCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzdHJpbmcuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTdHJpbmcgeG1sU3RyLCBGaWxlIGZpbGUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJhbnNmb3JtKHhzbFVyaSwgeG1sU3RyLCBmaWxlLCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBYU0wgaW5wdXQgc3RyZWFtIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRYc2xJbnB1dFN0cmVhbShTdHJpbmcgeHNsVXJpKSB7Ci0JCUlucHV0U3RyZWFtIHhzbElucHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhzbElucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh4c2xVcmkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKHhzbElucHV0ID09IG51bGwpIHsKLQkJCQl4c2xJbnB1dCA9IFhTTFRQcm9jZXNzb3IuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKQotCQkJCQkJLmdldFJlc291cmNlQXNTdHJlYW0oeHNsVXJpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4geHNsSW5wdXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24veG1sL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MmNhNzQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgWE1MIGFuZCBYU0xUIHByb2Nlc3Npbmcgc2VydmljZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjFiOWU4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTUyOWYwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZywKLSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmludGVybmFsLmltcG9ydGluZywKLSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3ZDk4NDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjI2YzU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLXBsdWdpbk5hbWU9RVBGIERhdGEgRXhjaGFuZ2UgUGx1Zy1pbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9MaWJyYXJ5U2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9MaWJyYXJ5U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZTQ3MjM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbXBvcnRpbmcvTGlicmFyeVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbnRlcm5hbC5pbXBvcnRpbmcuTGlicmFyeVNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIExpYnJhcnkgc2VydmljZSBmb3IgaW1wb3J0aW5nIGV4dGVybmFsIGxpYnJhcnkvcGx1Z2lucyBpbnRvIHRoZSBjdXJyZW50IGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpYnJhcnlTZXJ2aWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVNlcnZpY2UgSU5TVEFOQ0UgPSBuZXcgTGlicmFyeVNlcnZpY2VJbXBsKCk7Ci0JLyoqCi0JICogY3JlYXRlIGEgbmV3IE1ldGhvZFBsdWdpbiBhbmQgYWRkIHRvIHRoZSBsaWJyYXJ5LCBwZXJmb3JtIGluaXRpYWxpemF0aW9uIGFzIG5lZWRlZAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBNZXRob2RQbHVnaW4gCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbiBjcmVhdGVQbHVnaW4oU3RyaW5nIG5hbWUsIFN0cmluZyBndWlkKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JLyoqCi0JICogY3JlYXRlIGEgTWV0aG9kQ29uZmlndXJhdGlvbiBmb3IgdGhpcyBsaWJyYXJ5Ci0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgZ3VpZCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBwbHVnaW4gc2VydmljZSBmb3IgdGhlIHNwZWNpZmllZCBwbHVnaW4KLQkgKiBAcGFyYW0gcGx1Z2luIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gUGx1Z2luU2VydmljZQotCSAqLwotCXB1YmxpYyBQbHVnaW5TZXJ2aWNlIGNyZWF0ZVBsdWdpblNlcnZpY2UoTWV0aG9kUGx1Z2luIHBsdWdpbik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9QbHVnaW5TZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW1wb3J0aW5nL1BsdWdpblNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQ1NTYzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW1wb3J0aW5nL1BsdWdpblNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBQbHVnaW4gc2VydmljZSBmb3IgaW1wb3J0aW5nIGV4dGVybmFsIHBsdWdpbiBkYXRhIGludG8gdGhlIGN1cnJlbnQgbGlicmFyeQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBQbHVnaW5TZXJ2aWNlIHsKLQotCXB1YmxpYyBDb250ZW50UGFja2FnZSBnZXRDb250ZW50UGFja2FnZVJvb3QoKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIERpc2NpcGxpbmUgb2JqZWN0IGFkZCBhZGQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IERpc2NpcGxpbmVzIHBhY2thZ2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gRGlzY2lwbGluZQotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lIGNyZWF0ZURpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIERpc2NpcGxpbmVHcm91cGluZyBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgRGlzY2lwbGluZXMgcGFja2FnZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBEaXNjaXBsaW5lR3JvdXBpbmcKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUdyb3VwaW5nIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgVG9vbCBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgVG9vbHMgcGFja2FnZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBUb29sCi0JICovCi0JcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgRG9tYWluIG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBEb21haW5zIHBhY2thZ2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gRG9tYWluCi0JICovCi0JcHVibGljIERvbWFpbiBjcmVhdGVEb21haW4oKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIFdvcmtQcm9kdWN0VHlwZSBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgV29ya1Byb2R1Y3RUeXBlcyBwYWNrYWdlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFdvcmtQcm9kdWN0VHlwZQotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGUgY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBSb2xlU2V0IG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBSb2xlU2V0cyBwYWNrYWdlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFJvbGVTZXQKLQkgKi8KLQlwdWJsaWMgUm9sZVNldCBjcmVhdGVSb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBSb2xlU2V0R3JvdXBpbmcgb2JqZWN0IGFkZCBhZGQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IFJvbGVTZXRzIHBhY2thZ2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gUm9sZVNldEdyb3VwaW5nCi0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZyBjcmVhdGVSb2xlU2V0R3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIEN1c3RvbUNhdGVnb3J5IG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBDdXN0b21DYXRlZ29yaWVzIHBhY2thZ2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gQ3VzdG9tQ2F0ZWdvcnkKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnkgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkgcGFyZW50KTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIENhcGFiaWxpdHlQYXR0ZXJuIG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBDYXBhYmlsaXR5UGF0dGVybnMgcGFja2FnZQotCSAqIHBlcmZvcm0gb3RoZXIgaW5pdGlhbGl6YXRpb25zIGFzIG5lZWRlZCwgc3VjaCBhcyBjcmVhdGUgdGhlIGNvbnRhaW5pbmcgUHJvY2Vzc0NvbXBvbmVudC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gUHJvY2Vzc1NlcnZpY2UgYSBQcm9jZXNzU2VydmljZSB0aGF0IGNvbnRhaW5zIHRoZSBjcmVhdGVkIENhcGFiaWxpdHlQYXR0ZXJuCi0JICovCi0JcHVibGljIENhcGFiaWxpdHlQYXR0ZXJuIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKE1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbmZpZyk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBEZWxpdmVyeVByb2Nlc3Mgb2JqZWN0IGFkZCBhZGQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IERlbGl2ZXJ5UHJvY2Vzc2VzIHBhY2thZ2UuCi0JICogcGVyZm9ybSBvdGhlciBpbml0aWFsaXphdGlvbnMgYXMgbmVlZGVkLCBzdWNoIGFzIGNyZWF0ZSB0aGUgY29udGFpbmluZyBQcm9jZXNzQ29tcG9uZW50LgotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBQcm9jZXNzU2VydmljZSBhIFByb2Nlc3NTZXJ2aWNlIHRoYXQgY29udGFpbnMgdGhlIGNyZWF0ZWQgRGVsaXZlcnlQcm9jZXNzCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2VzcyBjcmVhdGVEZWxpdmVyeVByb2Nlc3MoTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIGNvbnRlbnQgcGFja2FnZSBhcyB0aGUgY2hpbGQgb2YgdGhlIGludGVybmFsIHJvb3QgY29udGVudCBwYWNrYWdlLAotCSAqIEByZXR1cm4gQ29udGVudFBhY2thZ2VTZXJ2aWNlIGEgQ29udGVudFBhY2thZ2VTZXJ2aWNlIHRoYXQgY29udGFpbnMgdGhlIGNyZWF0ZWQgQ29udGVudFBhY2thZ2UKLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2UoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQotCi0JLyoqCi0JICogY3JlYXRlIGEgbmV3IGNoaWxkIHBhY2thZ2UKLQkgKiBAcmV0dXJuIENvbnRlbnRQYWNrYWdlU2VydmljZSBhIENvbnRlbnRQYWNrYWdlU2VydmljZSBmb3IgdGhlIGNyZWF0ZWQgcGFja2FnZQotCSAqLwotCS8vcHVibGljIENvbnRlbnRQYWNrYWdlIGNyZWF0ZUNoaWxkUGFja2FnZShDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCi0JcHVibGljIEFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIENoZWNrbGlzdCBjcmVhdGVDaGVja2xpc3QoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgQ29uY2VwdCBjcmVhdGVDb25jZXB0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIERlbGl2ZXJhYmxlIGNyZWF0ZURlbGl2ZXJhYmxlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIEV4YW1wbGUgY3JlYXRlRXhhbXBsZShDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBHdWlkYW5jZSBjcmVhdGVHdWlkYW5jZShDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBPdXRjb21lIGNyZWF0ZU91dGNvbWUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgUHJhY3RpY2UgY3JlYXRlUHJhY3RpY2UoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgUmVwb3J0IGNyZWF0ZVJlcG9ydChDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBSZXVzYWJsZUFzc2V0IGNyZWF0ZVJldXNhYmxlQXNzZXQoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgUm9hZG1hcCBjcmVhdGVSb2FkbWFwKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFJvbGUgY3JlYXRlUm9sZShDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFRhc2sgY3JlYXRlVGFzayhDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBUZW1wbGF0ZSBjcmVhdGVUZW1wbGF0ZShDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBUZXJtRGVmaW5pdGlvbiBjcmVhdGVUZXJtRGVmaW5pdGlvbihDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBUb29sTWVudG9yIGNyZWF0ZVRvb2xNZW50b3IoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgV2hpdGVwYXBlciBjcmVhdGVXaGl0ZXBhcGVyKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBBY3Rpdml0eSBhcyBhIGJyZWFrZG93biBlbGVtZW50IG9mIHRoZSBzZXJ2aWNpbmcgZWxlbWVudC4KLQkgKiBAcmV0dXJuIEFjdGl2aXR5Ci0JICovCi0JcHVibGljIEFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KEFjdGl2aXR5IHN1cGVyQWN0aXZpdHkpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgbmV3IFBoYXNlIGFzIGEgYnJlYWtkb3duIGVsZW1lbnQgb2YgdGhlIHNlcnZpY2luZyBlbGVtZW50LgotCSAqIEByZXR1cm4gUGhhc2UKLQkgKi8KLQlwdWJsaWMgUGhhc2UgY3JlYXRlUGhhc2UoQWN0aXZpdHkgc3VwZXJBY3Rpdml0eSk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBuZXcgSXRlcmF0aW9uIGFzIGEgYnJlYWtkb3duIGVsZW1lbnQgb2YgdGhlIHNlcnZpY2luZyBlbGVtZW50LgotCSAqIEByZXR1cm4gSXRlcmF0aW9uCi0JICovCi0JcHVibGljIEl0ZXJhdGlvbiBjcmVhdGVJdGVyYXRpb24oQWN0aXZpdHkgc3VwZXJBY3Rpdml0eSk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBuZXcgTWlsZXN0b25lIGFzIGEgYnJlYWtkb3duIGVsZW1lbnQgb2YgdGhlIHNlcnZpY2luZyBlbGVtZW50LgotCSAqIEByZXR1cm4gTWlsZXN0b25lCi0JICovCi0JcHVibGljIE1pbGVzdG9uZSBjcmVhdGVNaWxlc3RvbmUoQWN0aXZpdHkgc3VwZXJBY3Rpdml0eSk7Ci0KLQotCS8qKgotCSAqIGFkZCB0aGUgdGFzayBhbmQgY3JlYXRlIHRoZSBicmVha2Rvd24gZWxlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrCi0JICogY2FsbCB0aGlzIG1ldGhvZCBvbmx5IHdoZW4gdGhlIGNyb3NzIHJlZmVyZW5jZXMgKFJvbGVzLCB3b3JrcHJvZHVjdHMpIG9mIHRoZSBUYXNrIGlzIGFscmVhZHkgZXN0YWJsaXNoZWQuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUYXNrVG9BY3Rpdml0eShBY3Rpdml0eSBhY3QsIFRhc2sgZWxlbWVudCk7Ci0KLQlwdWJsaWMgdm9pZCBhZGRUYXNrc1RvQWN0aXZpdHkoQWN0aXZpdHkgYWN0LCBMaXN0IHRhc2tzKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW1wb3J0aW5nL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQ0YmI4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW1wb3J0aW5nL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB0aGUgZGF0YSBleGNoYW5nZSBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbnRlcm5hbC9pbXBvcnRpbmcvTGlicmFyeVNlcnZpY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW50ZXJuYWwvaW1wb3J0aW5nL0xpYnJhcnlTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OWIyNmY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbnRlcm5hbC9pbXBvcnRpbmcvTGlicmFyeVNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmludGVybmFsLmltcG9ydGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Nb2RlbFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci0KLS8qKgotICogTGlicmFyeSBzZXJ2aWNlIGZvciBpbXBvcnRpbmcgZXh0ZXJuYWwgbGlicmFyeS9wbHVnaW5zIGludG8gdGhlIGN1cnJlbnQKLSAqIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIFRPRE86IE1lcmdlIHdpdGggb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIExpYnJhcnlTZXJ2aWNlIHsKLQotCXB1YmxpYyBMaWJyYXJ5U2VydmljZUltcGwoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5MaWJyYXJ5U2VydmljZSNjcmVhdGVQbHVnaW4oU3RyaW5nLCBTdHJpbmcpCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbiBjcmVhdGVQbHVnaW4oU3RyaW5nIG5hbWUsIFN0cmluZyBndWlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCQlwbHVnaW4uc2V0TmFtZShuYW1lKTsKLQkJcGx1Z2luLnNldEd1aWQoZ3VpZCk7Ci0KLQkJLy8gaW5pdGlhbGl6ZSB0aGUgcGx1Z2luCi0JCXBsdWdpbiA9IE1vZGVsU3RvcmFnZS5pbml0aWFsaXplKHBsdWdpbik7Ci0KLQkJLy8gTVVTVCBzYXZlIHRoZSBwbHVnaW4gYmVmb3JlIHByb2Nlc3MgYW55dGhpbmcgZWxzZQotCQkvLyB0aGlzIG1ldGhvZCBjYWxsIHdpbGwgY2F1c2UgcmVzb3VyY2UgcmVmcmVzaCB3aGljaCBpcyBub3QgZGVzaXJlZCBpbgotCQkvLyB0aGUgaW1wb3J0aW5nIHByb2Nlc3MKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQotCQlsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKS5hZGQocGx1Z2luKTsKLQkJCi0JCS8vIDE1MDA2MyAtIFhNTCBpbXBvcnQ6IENQL0RQcyBhcmUgdW5yZXNvdmxlZCBhZnRlciBYTUwgcGx1Z2luIGltcG9ydCAKLQkJLy8gbmVlZCB0byBzYXZlIHRodCBsaWJyYXJ5IGFuZCBwbHVnaW4gcmVzb3VyY2VzIHNwZWNpZmljYWxseSwgY2FuJ3QgdXNlIHNhdmVMaWJyYXJ5Ci0vLwkJTGlicmFyeVV0aWwuc2F2ZUxpYnJhcnkobGlicmFyeSwgZmFsc2UsIGZhbHNlKTsKLQkJTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5zYXZlKGxpYnJhcnkuZVJlc291cmNlKCkpOwotCQlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLnNhdmUocGx1Z2luLmVSZXNvdXJjZSgpKTsKLQotCQkvLyBzdGlsbCBtYXJrIHRoZSByZXNvdXJjZSBhcyBkaXJ0eQotCQlsaWJyYXJ5LmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQlwbHVnaW4uZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5MaWJyYXJ5U2VydmljZSNjcmVhdGVDb25maWd1cmF0aW9uKFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGNyZWF0ZUNvbmZpZ3VyYXRpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBndWlkKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQljb25maWcuc2V0TmFtZShuYW1lKTsKLQkJY29uZmlnLnNldEd1aWQoZ3VpZCk7Ci0KLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlib29sZWFuIG9sZE5vdGlmeSA9IGxpYnJhcnkuZURlbGl2ZXIoKTsKLQkJdHJ5IHsKLQkJCWxpYnJhcnkuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJbGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5hZGQoY29uZmlnKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWxpYnJhcnkuZVNldERlbGl2ZXIob2xkTm90aWZ5KTsKLQkJfQotCi0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGEgcGx1Z2luIHNlcnZpY2UgZm9yIHRoZSBzcGVjaWZpZWQgcGx1Z2luCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgTWV0aG9kUGx1Z2luCi0JICogQHJldHVybiBQbHVnaW5TZXJ2aWNlCi0JICovCi0JcHVibGljIFBsdWdpblNlcnZpY2UgY3JlYXRlUGx1Z2luU2VydmljZShNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXJldHVybiBuZXcgUGx1Z2luU2VydmljZUltcGwocGx1Z2luKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ludGVybmFsL2ltcG9ydGluZy9QbHVnaW5TZXJ2aWNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ludGVybmFsL2ltcG9ydGluZy9QbHVnaW5TZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MjU5NGI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbnRlcm5hbC9pbXBvcnRpbmcvUGx1Z2luU2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmludGVybmFsLmltcG9ydGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5XQlNEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIFBsdWdpbiBzZXJ2aWNlIGZvciBpbXBvcnRpbmcgZXh0ZXJuYWwgcGx1Z2luIGRhdGEgaW50byB0aGUgY3VycmVudCBsaWJyYXJ5Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luU2VydmljZUltcGwgaW1wbGVtZW50cyBQbHVnaW5TZXJ2aWNlIHsKLQotCU1ldGhvZFBsdWdpbiBwbHVnaW47Ci0KLQlwdWJsaWMgUGx1Z2luU2VydmljZUltcGwoTWV0aG9kUGx1Z2luIGVsZW1lbnQpCi0JewotCQlwbHVnaW4gPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbWV0aG9kIHBsdWdoaW4KLQkgKiBAcmV0dXJuIHtAbGluayBNZXRob2RQbHVnaW59Ci0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbiBnZXRQbHVnaW4oKQotCXsKLQkJcmV0dXJuIChNZXRob2RQbHVnaW4pcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNnZXRDb250ZW50UGFja2FnZVJvb3QoKQotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZSBnZXRDb250ZW50UGFja2FnZVJvb3QoKQotCXsKLQkJcmV0dXJuIFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVEaXNjaXBsaW5lKCkKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZSBjcmVhdGVEaXNjaXBsaW5lKCkgewotCQlEaXNjaXBsaW5lIGQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNjaXBsaW5lKCk7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IChDb250ZW50UGFja2FnZSlVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCXBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZCk7Ci0KLQkJcmV0dXJuIGQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZyBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKSB7Ci0JCURpc2NpcGxpbmVHcm91cGluZyBkID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IChDb250ZW50UGFja2FnZSlVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCXBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZCk7Ci0KLQkJcmV0dXJuIGQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVRvb2woKQotCSAqLwotCXB1YmxpYyBUb29sIGNyZWF0ZVRvb2woKSB7Ci0JCVRvb2wgdG9vbCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRvb2woKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpOwotCQkoKENvbnRlbnRQYWNrYWdlKXBrZykuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKHRvb2wpOwotCQlyZXR1cm4gdG9vbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlRG9tYWluKCkKLQkgKi8KLQlwdWJsaWMgRG9tYWluIGNyZWF0ZURvbWFpbigpIHsKLQkJRG9tYWluIGQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEb21haW4oKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCk7Ci0JCSgoQ29udGVudFBhY2thZ2UpcGtnKS5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZCk7Ci0JCXJldHVybiBkOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVXb3JrUHJvZHVjdFR5cGUoKQotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGUgY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCkgewotCQlXb3JrUHJvZHVjdFR5cGUgdyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShnZXRQbHVnaW4oKSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQkJKChDb250ZW50UGFja2FnZSlwa2cpLmdldENvbnRlbnRFbGVtZW50cygpLmFkZCh3KTsKLQkJcmV0dXJuIHc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVJvbGVTZXQoKQotCSAqLwotCXB1YmxpYyBSb2xlU2V0IGNyZWF0ZVJvbGVTZXQoKSB7Ci0JCVJvbGVTZXQgciA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVTZXQoKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCQkoKENvbnRlbnRQYWNrYWdlKXBrZykuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKHIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlUm9sZVNldEdyb3VwaW5nKCkKLQkgKi8KLQlwdWJsaWMgUm9sZVNldEdyb3VwaW5nIGNyZWF0ZVJvbGVTZXRHcm91cGluZygpIHsKLQkJUm9sZVNldEdyb3VwaW5nIHIgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlU2V0R3JvdXBpbmcoKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCQkoKENvbnRlbnRQYWNrYWdlKXBrZykuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKHIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkpCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5IGNyZWF0ZUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IHBhcmVudCkgewotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShnZXRQbHVnaW4oKSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCQlDdXN0b21DYXRlZ29yeSBjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKTsKLQotCQkvLyBhbHNvIG5lZWQgdG8gYWRkIHRoZSBjYXRlZ29yeSBvYmplY3QgaW50byB0aGUgcGFyZW50IHBhY2thZ2UKLQkJcGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChjKTsKLQkJaWYgKCBwYXJlbnQgIT0gbnVsbCApCi0JCXsKLQkJCSgoQ3VzdG9tQ2F0ZWdvcnkpcGFyZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuYWRkKGMpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gYWRkIHRvIHRoZSByb290IGNhdGVnb3J5Ci0JCQlUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShnZXRQbHVnaW4oKSkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmFkZChjKTsKLQkJfQotCi0JCXJldHVybiBjOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVDYXBhYmlsaXR5UGF0dGVybihNZXRob2RDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyBDYXBhYmlsaXR5UGF0dGVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybihNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcpIHsKLQotCQlDYXBhYmlsaXR5UGF0dGVybiBjcCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0JCWNwLnNldERlZmF1bHRDb250ZXh0KGRlZmF1bHRDb25maWcpOwotCi0JCVByb2Nlc3NQYWNrYWdlIGNhcGFiaWxpdHlQYXR0ZXJuUGtncyA9IChQcm9jZXNzUGFja2FnZSlVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0JCUxpc3QgaXRlbXMgPSBjYXBhYmlsaXR5UGF0dGVyblBrZ3MuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCi0JCS8vIG5lZWQgdG8gY3JlYXRlIGEgcGFja2FnZSBmb3IgdGhpcyBjYXBhYmlsaXR5IHBhdHRlcm4KLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0ZSBwa2csIFRPRElPIik7Ci0JCS8vIHRvIGFkZCBhIGNhcGFiaWxpdHkgcHJvY2VzcywgeW91IG5lZWQgdG8gY3JlYXRlIGEgUHJvY2Vzc0NvbXBvbmVudCBwYWNrYWdlIHRvIGhvbGQgdGhlIHByb2Nlc3MKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50IHBjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCQlwYy5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0JCWl0ZW1zLmFkZChwYyk7Ci0JCXBjLnNldFByb2Nlc3MoY3ApOwotCi0JCXJldHVybiBjcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlRGVsaXZlcnlQcm9jZXNzKE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2VzcyBjcmVhdGVEZWxpdmVyeVByb2Nlc3MoTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnKSB7Ci0JCURlbGl2ZXJ5UHJvY2VzcyBkcCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpOwotCQlkcC5zZXREZWZhdWx0Q29udGV4dChkZWZhdWx0Q29uZmlnKTsKLQotCQkvLyB0aGlzIGlzIHRoZSBwYWNrYWdlIHRoYXQgc3RvcmVzIGFsbCBjYXBhYmlsaXR5IHBhdHRlcm5zCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBnZXRQbHVnaW4oKTsKLQkJUHJvY2Vzc1BhY2thZ2UgZGVsaXZlcnlQcm9jZXNzUGtncyA9IChQcm9jZXNzUGFja2FnZSlVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoKTsKLQkJTGlzdCBpdGVtcyA9IGRlbGl2ZXJ5UHJvY2Vzc1BrZ3MuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCi0JCS8vIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIFByb2Nlc3NDb21wb25lbnQgcGFja2FnZSB0byBob2xkIHRoZSBwcm9jZXNzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCBwYyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKTsKLQkJcGMuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCQlpdGVtcy5hZGQocGMpOwotCQlwYy5zZXRQcm9jZXNzKGRwKTsKLQotCQlyZXR1cm4gZHA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZUNvbnRlbnRQYWNrYWdlKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZShDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpOwotCQlpZiAoIGNvbnRhaW5lciA9PSBudWxsKQotCQl7Ci0JCQljb250YWluZXIgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShnZXRQbHVnaW4oKSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQl9Ci0JCWNvbnRhaW5lci5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCXJldHVybiBwa2c7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZUFydGlmYWN0KENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBBcnRpZmFjdCBjcmVhdGVBcnRpZmFjdChDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJQXJ0aWZhY3QgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFydGlmYWN0KCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVDaGVja2xpc3QoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIENoZWNrbGlzdCBjcmVhdGVDaGVja2xpc3QoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCUNoZWNrbGlzdCBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2hlY2tsaXN0KCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVDb25jZXB0KENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBDb25jZXB0IGNyZWF0ZUNvbmNlcHQoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCUNvbmNlcHQgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbmNlcHQoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZURlbGl2ZXJhYmxlKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZSBjcmVhdGVEZWxpdmVyYWJsZShDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJRGVsaXZlcmFibGUgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJhYmxlKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVFeGFtcGxlKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBFeGFtcGxlIGNyZWF0ZUV4YW1wbGUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCUV4YW1wbGUgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV4YW1wbGUoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZUd1aWRhbmNlKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBHdWlkYW5jZSBjcmVhdGVHdWlkYW5jZShDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJR3VpZGFuY2UgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlbGluZSgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlT3V0Y29tZShDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgT3V0Y29tZSBjcmVhdGVPdXRjb21lKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlPdXRjb21lIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPdXRjb21lKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVQcmFjdGljZShDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgUHJhY3RpY2UgY3JlYXRlUHJhY3RpY2UoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCVByYWN0aWNlIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZSgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlUmVwb3J0KENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBSZXBvcnQgY3JlYXRlUmVwb3J0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlSZXBvcnQgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlcG9ydCgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlUmV1c2FibGVBc3NldChDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgUmV1c2FibGVBc3NldCBjcmVhdGVSZXVzYWJsZUFzc2V0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlSZXVzYWJsZUFzc2V0IGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXVzYWJsZUFzc2V0KCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVSb2FkbWFwKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBSb2FkbWFwIGNyZWF0ZVJvYWRtYXAoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCVJvYWRtYXAgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvYWRtYXAoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVJvbGUoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFJvbGUgY3JlYXRlUm9sZShDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJUm9sZSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZSgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlVGFzayhDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgVGFzayBjcmVhdGVUYXNrKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlUYXNrIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVUZW1wbGF0ZShDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCVRlbXBsYXRlIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZW1wbGF0ZSgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlVGVybURlZmluaXRpb24oQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFRlcm1EZWZpbml0aW9uIGNyZWF0ZVRlcm1EZWZpbml0aW9uKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlUZXJtRGVmaW5pdGlvbiBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVybURlZmluaXRpb24oKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVRvb2xNZW50b3IoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFRvb2xNZW50b3IgY3JlYXRlVG9vbE1lbnRvcihDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJVG9vbE1lbnRvciBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbE1lbnRvcigpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlV2hpdGVwYXBlcihDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgV2hpdGVwYXBlciBjcmVhdGVXaGl0ZXBhcGVyKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlXaGl0ZXBhcGVyIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXaGl0ZXBhcGVyKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVBY3Rpdml0eShBY3Rpdml0eSkKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoQWN0aXZpdHkgc3VwZXJBY3Rpdml0eSkgewotCQlBY3Rpdml0eSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKTsKLQkJc3VwZXJBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChlKTsKLQotCQlhZGRBY3Rpdml0eVRvQ29udGFpbmVyKGUpOwotCQkKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVBoYXNlKEFjdGl2aXR5KQotCSAqLwotCXB1YmxpYyBQaGFzZSBjcmVhdGVQaGFzZShBY3Rpdml0eSBzdXBlckFjdGl2aXR5KSB7Ci0JCVBoYXNlIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpOwotCQlzdXBlckFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGUpOwotCi0JCWFkZEFjdGl2aXR5VG9Db250YWluZXIoZSk7Ci0KLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZUl0ZXJhdGlvbihBY3Rpdml0eSkKLQkgKi8KLQlwdWJsaWMgSXRlcmF0aW9uIGNyZWF0ZUl0ZXJhdGlvbihBY3Rpdml0eSBzdXBlckFjdGl2aXR5KSB7Ci0JCUl0ZXJhdGlvbiBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCk7Ci0JCXN1cGVyQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoZSk7Ci0KLQkJYWRkQWN0aXZpdHlUb0NvbnRhaW5lcihlKTsKLQotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlTWlsZXN0b25lKEFjdGl2aXR5KQotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKEFjdGl2aXR5IHN1cGVyQWN0aXZpdHkpIHsKLQkJTWlsZXN0b25lIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNaWxlc3RvbmUoKTsKLQkJc3VwZXJBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChlKTsKLQotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjYWRkVGFza1RvQWN0aXZpdHkoQWN0aXZpdHksIFRhc2spCi0JICovCi0JcHVibGljIHZvaWQgYWRkVGFza1RvQWN0aXZpdHkoQWN0aXZpdHkgYWN0LCBUYXNrIHRhc2spIHsKLQkJYWRkVGFza3NUb0FjdGl2aXR5KGFjdCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh0YXNrKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNhZGRUYXNrc1RvQWN0aXZpdHkoQWN0aXZpdHksIExpc3QpCi0JICovCi0JcHVibGljIHZvaWQgYWRkVGFza3NUb0FjdGl2aXR5KGZpbmFsIEFjdGl2aXR5IGFjdCwgZmluYWwgTGlzdCB0YXNrcykgewotCQkvLyB0aGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGFueSBtb3JlZHVlIHRvIGxhdGVyIGNoYW5nZXMKLQkJLy8gdXNlIG91ciBvd24gY29kZSBpbnN0ZWFkCi0JCS8vUHJvY2Vzc1V0aWwuYWRkVGFza1RvQWN0aXZpdHkodGFzaywgYWN0KTsKLQkJCi0JCS8vIGJlZm9yZSBkb2luZyB0aGUgY29tbWFuZCwgbWFrZSBzdXJlIHRoZSBvYmplY3QgaXMgCi0JCS8vIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIG93aW5nIHByb2Nlc3MKLQkJLy8gb3RoZXJ3aXNlIHlvdSB3aWxsIGdldCBtc2cgYm94IGFza2luZyBmb3IgdGhhdCwgd2hpY2ggbWF5IGNhdXNlIGVycm9yIGZvciBiYWNrZ3JvdW5kIHByb2Nlc3MKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBwcm9jLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCWlmICggY29uZmlnICE9IG51bGwgKSB7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB0YXNrcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKWl0Lm5leHQoKTsJCQkKLQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IChNZXRob2RQYWNrYWdlKXRhc2suZUNvbnRhaW5lcigpOwotCQkJCUxpc3QgcGtncyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQkJaWYgKCAhcGtncy5jb250YWlucyhwa2cpICkgewotCQkJCQlwa2dzLmFkZChwa2cpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHtwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlXQlNEcm9wQ29tbWFuZCBjbWQgPSBuZXcgV0JTRHJvcENvbW1hbmQoYWN0LCB0YXNrcyk7Ci0JCQl0cnkgewotCQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9CQotCQkJZmluYWxseSB7Ci0JCQkJY21kLmRpc3Bvc2UoKTsKLQkJCX0JCi0JICAgIH19KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgcHJvY2VzcyBjb21wb25lbnQgZm9yIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGUgQnJlYWtkb3duRWxlbWVudAotCSAqIEByZXR1cm4gUHJvY2Vzc0NvbXBvbmVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvY2Vzc0NvbXBvbmVudCBnZXRQcm9jZXNzQ29tcG9uZW50KEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQkKLQkJaWYgKCBlLmVDb250YWluZXIoKSA9PSBudWxsICkgewotCQkJQWN0aXZpdHkgcGFyZW50ID0gZS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCWlmICggcGFyZW50ID09IG51bGwgKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBnZXRQcm9jZXNzQ29tcG9uZW50KHBhcmVudCk7Ci0JCX0KLQkKLQkJRU9iamVjdCBjb250YWluZXI7Ci0JCWZvciAoY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7IGNvbnRhaW5lciAhPSBudWxsCi0JCQkJJiYgIShjb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KTsgY29udGFpbmVyID0gY29udGFpbmVyCi0JCQkJLmVDb250YWluZXIoKSkKLQkJCTsKLQotCQlpZiAoIGNvbnRhaW5lciAhPSBudWxsICkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudCkgY29udGFpbmVyKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRBY3Rpdml0eVRvQ29udGFpbmVyKEFjdGl2aXR5IGFjdCkgewotCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gZ2V0UHJvY2Vzc0NvbXBvbmVudChhY3QpOwotCQlpZiAoIHBjICE9IG51bGwgKSB7Ci0JCQkvLyBjcmVhdGUgYSBwcm9jZXNzIHBhY2thZ2UgZm9yIHRoZSBhY3Rpdml0eQotCQkJIFByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQkgcGtnLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCQkgcGtnLnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQkJCSBwYy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCQkgCi0JCQkgcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChhY3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ludGVybmFsL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW50ZXJuYWwvaW1wb3J0aW5nL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmIwMWRhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW50ZXJuYWwvaW1wb3J0aW5nL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGRhdGEgZXhjaGFuZ2Ugc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9CYXNlUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9CYXNlUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2MmMyNTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvQmFzZVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiBjb250ZW50IHJlc291cmNlIGhhbmRsZXIgdG8gcHJvY2VzcyB0aGUgcmVzcG91cmNlcyBpbiB0aGUgY29udGVudAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VSZXNvdXJjZUhhbmRsZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByb3RlY3RlZCBGaWxlIHNvdXJjZUxpYlJvb3Q7Ci0JcHJvdGVjdGVkIEZpbGUgdGFyZ2V0TGliUm9vdDsKLQotCXB1YmxpYyBCYXNlUmVzb3VyY2VIYW5kbGVyKEZpbGUgc291cmNlTGliUm9vdCwgRmlsZSB0YXJnZXRMaWJSb290KSB7Ci0JCXRoaXMuc291cmNlTGliUm9vdCA9IHNvdXJjZUxpYlJvb3Q7Ci0JCXRoaXMudGFyZ2V0TGliUm9vdCA9IHRhcmdldExpYlJvb3Q7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBVcmxJbmZvIHJlc29sdmVGaWxlVXJsKE9iamVjdCBvd25lciwgU3RyaW5nIHNyY1VybCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQkKLQkKLQkvKioKLQkgKiBjb3B5aW5nIHRoZSByZXNvdXJjZSBmaWxlIGZyb20gdGhlIHNvdXJjZSBsaWJyYXJ5IHRvIHRoZSB0YXJnZXQKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlRmlsZSB0aGUgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2Ugcm9vdAotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSZXNvdXJjZShTdHJpbmcgc291cmNlRmlsZSkgewotCQlGaWxlIHNyYyA9IG5ldyBGaWxlKHNvdXJjZUxpYlJvb3QsIHNvdXJjZUZpbGUpOwotCQlpZiAoIHNyYy5leGlzdHMoKSApIHsKLQkJCUZpbGUgdGd0ID0gbmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgc291cmNlRmlsZSk7Ci0JCQlSZXNvdXJjZUhlbHBlci5jb3B5RmlsZShzcmMsIHRndCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9Db250ZW50UHJvY2Vzc29yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9Db250ZW50UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiNmEwM2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvQ29udGVudFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLQotCi0KLS8qKgotICogY29udGVudCBwcm9jZXNzZXIgdG8gZml4IHJlZmVyZW5jZXMgYW5kIGNvcHkgcmVzb3VyY2VzIHRvIHRoZSB0YXJnZXQgbGlicmFyeSBsb2NhdGlvbgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRQcm9jZXNzb3IgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfc3JjX3JlZiA9IFBhdHRlcm4uY29tcGlsZSgic3JjXFxzKj1cXHMqXCIoLio/KVwiIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0vLwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9saW5rX3JlZiA9IFBhdHRlcm4uY29tcGlsZSgiPGFcXHMrPyhbXj5dKik+KC4qPyk8L2E+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaHJlZl9yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoImhyZWZcXHMqPVxccypcIiguKj8pXCIiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCUlSZXNvdXJjZUhhbmRsZXIgaGFuZGxlcjsKLQlJTG9nZ2VyIGxvZ2dlcjsKLQkKLQlwdWJsaWMgQ29udGVudFByb2Nlc3NvcihJUmVzb3VyY2VIYW5kbGVyIGhhbmRsZXIsIElMb2dnZXIgbG9nZ2VyKSB7Ci0JCXRoaXMuaGFuZGxlciA9IGhhbmRsZXI7Ci0JCXRoaXMubG9nZ2VyID0gbG9nZ2VyOwotCX0KLQkKLQkvKioKLQkgKiByZXNvdmxlIHRoZSByZXNvdXJjZSBzdHJpbmcgZm9yIHRoZSBnaXZlbiBvd25lci4gCi0JICogVGhlIG93bmVyIGlzIGEgbWV0aG9kIGVsZW1lbnQsIGJ1dCBjYW4gYmUgZWl0aGVyIGZyb20gdW1hIG1vZGVsIG9yIHhtbCBtb2RlbC4gCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVSZXNvdXJjZUZpbGVzKE9iamVjdCBvd25lciwgU3RyaW5nIHNvdXJjZSkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJdHJ5Ci0JCXsKLQkJCS8vIHByb2Nlc3MgaW1hZ2VzIGFuZCBvdGhlciBzcmMgcmVzb3VyY2VzCi0JCQlNYXRjaGVyIG0gPSBwX3NyY19yZWYubWF0Y2hlcihzb3VyY2UpOwotCQkJd2hpbGUgKCBtLmZpbmQoKSApCi0JCQl7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQkJU3RyaW5nIG5ld191cmwgID0gcHJvY2Vzc1Jlc291cmNlVXJsKG93bmVyLCB1cmwpOwotCQkJCVN0cmluZyByZXBsYWNlbWVudCA9ICJzcmM9XCIiICsgbmV3X3VybCArICJcIiI7IAkJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIGZpeFJlcGxhY2VtZW50U3RyKHJlcGxhY2VtZW50KSk7Ci0JCQl9Ci0JCQltLmFwcGVuZFRhaWwoc2IpOwotCQkJCi0JCQkvLyBwcm9jZXNzIGhyZWZzCi0JCQltID0gcF9ocmVmX3JlZi5tYXRjaGVyKHNiLnRvU3RyaW5nKCkpOwotCQkJc2Iuc2V0TGVuZ3RoKDApOwotCQkJCi0JCQl3aGlsZSAoIG0uZmluZCgpICkKLQkJCXsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgxKTsKLQkJCQlTdHJpbmcgbWFyayA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQlpbnQgaW5kZXggPSB1cmwuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCBpbmRleCA+PSAwICkKLQkJCQl7Ci0JCQkJCW1hcmsgPSB1cmwuc3Vic3RyaW5nKGluZGV4KTsKLQkJCQkJdXJsID0gdXJsLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJfQotCi0JCQkJaWYgKCB1cmwubGVuZ3RoKCkgPiAwICkKLQkJCQl7Ci0JCQkJCXVybCA9IHByb2Nlc3NSZXNvdXJjZVVybChvd25lciwgdXJsKTsKLQkJCQl9Ci0JCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgZml4UmVwbGFjZW1lbnRTdHIoImhyZWY9XCIiICsgdXJsICsgbWFyayArICJcIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQltLmFwcGVuZFRhaWwoc2IpOwotCQkJCi0JCQkvLyBhbnl0aGluZyBlbHNlID8/PwotCQkJCi0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLQkJewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKHNiKTsKLQkJCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBmaXhSZXBsYWNlbWVudFN0cihTdHJpbmcgc3RyKSB7Ci0JCS8vIGVzY2FwZSB0aGUgJCBzaW5jZSBpdCdzIHRyZWF0ZWQgYXMgYSBncm91cCBzZXF1ZW5jZQotCQl0cnkgewotCQkJaW50IGluZGV4ID0gc3RyLmluZGV4T2YoIiQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCBpbmRleCA8IDAgKSB7Ci0JCQkJcmV0dXJuIHN0cjsKLQkJCX0KLQkJCQotCQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpbnQgc3RhcnQgPSAwOwotCQkJd2hpbGUgKCBpbmRleCA+PSAwICkgewotCQkJCWIuYXBwZW5kKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KSkuYXBwZW5kKCJcXCQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN0YXJ0ID0gaW5kZXgrMTsKLQkJCQlpbmRleCA9IHN0ci5pbmRleE9mKCIkIiwgc3RhcnQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCWIuYXBwZW5kKHN0ci5zdWJzdHJpbmcoc3RhcnQpKTsKLQkJCQotCQkJcmV0dXJuIGIudG9TdHJpbmcoKTsKLQkJCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN0cjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGaWxlVXJsKFN0cmluZyB1cmwpCi0JewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUHJvY2Vzc2luZyBpbWFnZSB1cmwgWyIgKyB1cmwgKyAiXSIpOwotCQlpZiAoIAl1cmwgPT0gbnVsbCB8fCB1cmwubGVuZ3RoKCkgPT0gMAotCQkJCXx8IHVybC5zdGFydHNXaXRoKCJodHRwIikgLy8kTk9OLU5MUy0xJAotCQkJCXx8IHVybC5zdGFydHNXaXRoKCJ3d3cuIikgLy8kTk9OLU5MUy0xJAotCQkJCXx8IHVybC5zdGFydHNXaXRoKCJtYWlsdG86IikgLy8kTk9OLU5MUy0xJAotCQkJCXx8IHVybC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImphdmFzY3JpcHQ6IikgPj0wICkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEZpbGVQYXRoKEZpbGUgZikgewotCQlyZXR1cm4gKGYgIT0gbnVsbCkgJiYgZi5leGlzdHMoKTsKLQl9Ci0JCi0KLQlwdWJsaWMgU3RyaW5nIHByb2Nlc3NSZXNvdXJjZVVybChPYmplY3Qgb3duZXIsIFN0cmluZyB1cmwpCi0JewotCQlpZiAoICFpc0ZpbGVVcmwodXJsKSApCi0JCXsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQotCQlVcmxJbmZvIGluZm8gPSBudWxsOwotCQl0cnkgewotCQkJaW5mbyA9IGhhbmRsZXIucmVzb2x2ZUZpbGVVcmwob3duZXIsIHVybCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoImVycm9yIHByb2Nlc3NpbmcgdXJsICciICsgdXJsICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gdXJsOwotCQl9Ci0JCQotCQlpZiAoIGluZm8uc291cmNlRmlsZSA9PSBudWxsIHx8IGluZm8udGFyZ2V0RmlsZSA9PSBudWxsICkgewotCQkJcmV0dXJuIHVybDsKLQkJfQotCQkKLQkJaWYgKCBpbmZvLnNvdXJjZUZpbGUuaXNGaWxlKCkgJiYgaW5mby5zb3VyY2VGaWxlLmV4aXN0cygpICkKLQkJewotCQkJUmVzb3VyY2VIZWxwZXIuY29weUZpbGUoaW5mby5zb3VyY2VGaWxlLCBpbmZvLnRhcmdldEZpbGUpOwotCQkJCi0JCQkvLyByZXR1cm4gdGhlIGZpeGVkIHRhcmdldCB1cmwgaWYgdGhlIGZpbGUgZXhpc3RzIAotCQkJLy8gYW5kIGlzIGNvcGllZCBvdmVyIHRvIHRoZSB0YXJnZXQgbG9jYXRpb24KLQkJCXJldHVybiBpbmZvLnRhcmdldFVybDsKLQkJfQotCi0JCXJldHVybiB1cmw7Ci0JfQotCi0KLQkvKioKLQkgKiBwcm9jZXNzIHRoZSB1cmwsIHVwZGF0ZSB0aGUgcmVzdWx0IGJ1ZmZlciwgYW5kIHJldHVybiB0aGUgYXNzb2NpYXRlZCBlbGVtZW50IGlmIGFueQotCSAqIEBwYXJhbSBzb3VyY2UgdGVoIHVybCB0ZXh0IHN0cmluZwotCSAqIEBwYXJhbSByZXN1bHQgU3RyaW5nQnVmZmVyCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50IHRoZSBsaW5rZWQgZWxlbWVudCBvciBudWxsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1VybFRleHQoT2JqZWN0IG93bmVyLCBTdHJpbmcgc291cmNlKQotCXsKLQkJTWF0Y2hlciBtID0gcF9ocmVmX3JlZi5tYXRjaGVyKHNvdXJjZSk7Ci0JCWlmICggbS5maW5kKCkgKQotCQl7Ci0JCQlTdHJpbmcgdXJsID0gbS5ncm91cCgxKTsKLQkJCWlmICggdXJsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiamF2YVNjcmlwdDoiKSA8IDAgKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJaW50IGluZGV4ID0gdXJsLmluZGV4T2YoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICggaW5kZXggPj0gMCApCi0JCQkJewotCQkJCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQl9Ci0KLQkJCQlpZiAoIHVybC5sZW5ndGgoKSA+IDAgKQotCQkJCXsKLQkJCQkJcHJvY2Vzc1Jlc291cmNlVXJsKG93bmVyLCB1cmwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2UoU3RyaW5nIHNvdXJjZUZpbGUpIHsKLQkJaGFuZGxlci5jb3B5UmVzb3VyY2Uoc291cmNlRmlsZSk7Ci0JfQotCQotCS8qKgotCSAqIHRoaXMgbWV0aG9kIGlzIGZvciByZXNvbHZlaW5nIHRoZSB0ZW1wbGF0ZSBhdHRhY2htZW50IHJlc291cmNlcwotCSAqIFRoZSByZXNvdXJjZSBpcyBhIHNldCBvZiB1cmxzIHNlcGVyYXRlZCBieSB8Ci0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIHVybHMKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZUF0dGFjaG1lbnRSZXNvdXJjZXMoT2JqZWN0IG93bmVyLCBTdHJpbmcgdXJscykgewotCQlpZiAoICh1cmxzICE9IG51bGwpICYmIHVybHMubGVuZ3RoKCkgIT0gMCApIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHVybHMsICJ8Iik7IC8vIHRoaXMgaXMgaGFyZGNvZGVkIHNvbWVob3cKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkgKSB7Ci0JCQkJU3RyaW5nIHVybCA9IHN0Lm5leHRUb2tlbigpOwotCQkJCXVybCA9IHByb2Nlc3NSZXNvdXJjZVVybChvd25lciwgdXJsKTsKLQkJCQlpZiAoIGJ1ZmZlci5sZW5ndGgoKSA+IDAgKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoInwiKTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZCh1cmwpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCXJldHVybiAiIjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9EZWZhdWx0TG9nZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9EZWZhdWx0TG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0Zjk1MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvRGVmYXVsdExvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotcHVibGljIGNsYXNzIERlZmF1bHRMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyIHsKLQotCXByb3RlY3RlZCBQcmludFN0cmVhbSBpbmZvID0gU3lzdGVtLm91dDsKLQlwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gd2FybmluZyA9IFN5c3RlbS5vdXQ7Ci0JcHJvdGVjdGVkIFByaW50U3RyZWFtIGVycm9yID0gU3lzdGVtLmVycjsKLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRoKSB7Ci0JCWVycm9yLnByaW50bG4oKTsKLQkJaWYgKCB0aCAhPSBudWxsICkgewotCQkJdGgucHJpbnRTdGFja1RyYWNlKGVycm9yKTsKLQkJfQkKLQl9Ci0JcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbWVzc2FnZSkgewotCQl3YXJuaW5nLnByaW50bG4obWVzc2FnZSk7Ci0JfQotCXB1YmxpYyB2b2lkIGxvZ01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaW5mby5wcmludGxuKG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0ZpbGVMb2dnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0ZpbGVMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmE1MDBiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9GaWxlTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLS8qKgotICogZmlsZSBMb2dnZXIgY2xhc3MKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlTG9nZ2VyIGV4dGVuZHMgRGVmYXVsdExvZ2dlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9MT0dfRklMRU5BTUUgPSAiZXJyb3IubG9nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTklOR19MT0dfRklMRU5BTUUgPSAid2FybmluZy5sb2ciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX0xPR19GSUxFTkFNRSA9ICJpbmZvLmxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBGaWxlIGxvZ1BhdGg7Ci0KLQlwdWJsaWMgRmlsZUxvZ2dlcihGaWxlIGxvZ1BhdGgpIHsKLQkJdGhpcy5sb2dQYXRoID0gbG9nUGF0aDsKLQotCQlpZiAoIXRoaXMubG9nUGF0aC5leGlzdHMoKSkgewotCQkJdGhpcy5sb2dQYXRoLm1rZGlycygpOwotCQl9Ci0KLQkJc3VwZXIuaW5mbyA9IGdldFN0cmVhbShuZXcgRmlsZShsb2dQYXRoLCBJTkZPX0xPR19GSUxFTkFNRSkpOwotCQlzdXBlci53YXJuaW5nID0gZ2V0U3RyZWFtKG5ldyBGaWxlKGxvZ1BhdGgsIFdBUk5JTkdfTE9HX0ZJTEVOQU1FKSk7Ci0JCXN1cGVyLmVycm9yID0gZ2V0U3RyZWFtKG5ldyBGaWxlKGxvZ1BhdGgsIEVSUk9SX0xPR19GSUxFTkFNRSkpOwotCi0JfQotCi0JcHJpdmF0ZSBQcmludFN0cmVhbSBnZXRTdHJlYW0oRmlsZSBmKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIGRpciA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJZGlyLm1rZGlycygpOwotCi0JCQlpZiAoIWYuZXhpc3RzKCkpIHsKLQkJCQlmLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCX0KLQotCQkJcmV0dXJuIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmKSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWluZm8uY2xvc2UoKTsKLQkJd2FybmluZy5jbG9zZSgpOwotCQllcnJvci5jbG9zZSgpOwotCi0JfQotCQotCXB1YmxpYyBGaWxlIGdldExvZ1BhdGgoKSB7Ci0JCXJldHVybiBsb2dQYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0lMb2dnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0lMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzBmMTViYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9JTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWw7Ci0KLS8qKgotICogTG9nZ2VyIGludGVyZmFjZSBmb3IgZXhwb3J0IGFuZCBpbXBvcnQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxvZ2dlciB7Ci0KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRoKTsKLQkKLQlwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyBtZXNzYWdlKTsKLQkKLQlwdWJsaWMgdm9pZCBsb2dNZXNzYWdlKFN0cmluZyBtZXNzYWdlKTsKLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9JUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9JUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1ZjcyOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvSVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsOwotCi0vKioKLSAqIFJlc291cmNlIGhhbmRsZXIgaW50ZXJmYWNlIGZvciB4bWwgZXhwb3J0IGFuZCBpbXBvcnQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlSGFuZGxlciB7Ci0KLQlwdWJsaWMgVXJsSW5mbyByZXNvbHZlRmlsZVVybChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHRocm93cyBFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBjb3B5aW5nIHRoZSByZXNvdXJjZSBmaWxlIGZyb20gdGhlIHNvdXJjZSBsaWJyYXJ5IHRvIHRoZSB0YXJnZXQKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlRmlsZSB0aGUgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2Ugcm9vdAotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSZXNvdXJjZShTdHJpbmcgc291cmNlRmlsZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9VcmxJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9VcmxJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjMmU4YzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvVXJsSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIERhdGEgc3RydWN0dXJlIHRvIHN0b3JlIHVybCBpbmZvIGluIGNvbnRlbnQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVcmxJbmZvIHsKLQotCXB1YmxpYyBGaWxlIHNvdXJjZUZpbGU7Ci0JcHVibGljIEZpbGUgdGFyZ2V0RmlsZTsKLQlwdWJsaWMgU3RyaW5nIHNvdXJjZVVybDsKLQlwdWJsaWMgU3RyaW5nIHRhcmdldFVybDsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjY5YzYwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciB0aGUgZGF0YSBleGNoYW5nZSBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGYyNjdiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW08L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0MmZiNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kcmF3MmQsCi0gb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNzJlM2NkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLnByb2plY3QsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9tb2RlbC9kaWFncmFtLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9tb2RlbC9kaWFncmFtLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMGE3OGVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vbW9kZWwvZGlhZ3JhbS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Im1vZGVsIgotICAgIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbCI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL05vZGVDb250YWluZXIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMaW5rIiBlU3VwZXJUeXBlcz0iIy8vTGlua2VkT2JqZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvdXJjZSIgZVR5cGU9IiMvL05vZGUiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhcmdldCIgZVR5cGU9IiMvL05vZGUiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vTm9kZS9pbmNvbWluZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJlbmRwb2ludHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQWJzb2x1dGVCZW5kcG9pbnQiIHRyYW5zaWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb3VyY2VFbmRQb2ludCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFyZ2V0RW5kUG9pbnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxpbmtlZE9iamVjdCIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaW5rZWRFbGVtZW50IiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvYmplY3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VKYXZhT2JqZWN0IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZWROb2RlIiBlU3VwZXJUeXBlcz0iIy8vTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTm9kZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9MaW5rZWRPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhdGlvbiIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2lkdGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iLTEiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGVpZ2h0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ii0xIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY29taW5nQ29ubmVjdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTGluayIgZU9wcG9zaXRlPSIjLy9MaW5rL3RhcmdldCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRnb2luZ0Nvbm5lY3Rpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0xpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIGVPcHBvc2l0ZT0iIy8vTGluay9zb3VyY2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhZE9ubHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW0iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUeXBlZE5vZGUiIGVTdXBlclR5cGVzPSIjLy9Ob2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0Tm9kZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dG9MYXlvdXQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5vZGVDb250YWluZXIiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5vZGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL05vZGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZU5vZGUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZE5vZGUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlVGFza0NvbXBvc2l0ZSIgZVN1cGVyVHlwZXM9IiMvL05vZGVDb250YWluZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb3dJbmRleCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrTm9kZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluZGV4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSItMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGUiIGVTdXBlclR5cGVzPSIjLy9Ob2RlQ29udGFpbmVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBYnNvbHV0ZUJlbmRwb2ludCIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlBvaW50IiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUm9sZURlc2NyaXB0b3IiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIi8+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9tb2RlbC9kaWFncmFtLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMjc1OWQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0iIG1vZGVsTmFtZT0iRGlhZ3JhbSIgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLmphdmEiCi0gICAgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5nZW5tb2RlbCMvL3VtYSI+Ci0gIDxmb3JlaWduTW9kZWw+QG1vZGVsPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9Ik1vZGVsIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0iIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9ImRpYWdyYW0uZWNvcmUjLyI+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJkaWFncmFtLmVjb3JlIy8vQWJzb2x1dGVCZW5kcG9pbnQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9ImRpYWdyYW0uZWNvcmUjLy9Qb2ludCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iZGlhZ3JhbS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL0RpYWdyYW0iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vTGluayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL0xpbmsvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTGluay9zb3VyY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTGluay90YXJnZXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTGluay9iZW5kcG9pbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL0xpbmsvc291cmNlRW5kUG9pbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTGluay90YXJnZXRFbmRQb2ludCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9MaW5rZWRPYmplY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRpYWdyYW0uZWNvcmUjLy9MaW5rZWRPYmplY3QvbGlua2VkRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9MaW5rZWRPYmplY3Qvb2JqZWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9OYW1lZE5vZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9OYW1lZE5vZGUvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Ob2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTm9kZS9sb2NhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlL3dpZHRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL05vZGUvaGVpZ2h0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZGlhZ3JhbS5lY29yZSMvL05vZGUvaW5jb21pbmdDb25uZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL05vZGUvcmVhZE9ubHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL0FjdGl2aXR5RGlhZ3JhbSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9UeXBlZE5vZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9UeXBlZE5vZGUvdHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdE5vZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdE5vZGUvdHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vQWN0aXZpdHlEZXRhaWxEaWFncmFtIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Sb2xlTm9kZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Sb2xlVGFza0NvbXBvc2l0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9UYXNrTm9kZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdENvbXBvc2l0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0Q29tcG9zaXRlL3R5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPG5lc3RlZEdlblBhY2thZ2VzIHByZWZpeD0iTW9kZWwiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgICAgZWNvcmVQYWNrYWdlPSJkaWFncmFtLmVjb3JlIy8iPgotICAgICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJkaWFncmFtLmVjb3JlIy8vQWJzb2x1dGVCZW5kcG9pbnQiLz4KLSAgICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iZGlhZ3JhbS5lY29yZSMvL1BvaW50Ii8+Ci0gICAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9ImRpYWdyYW0uZWNvcmUjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL0RpYWdyYW0iIGxhYmVsRmVhdHVyZT0iIy8vbW9kZWwvbW9kZWwvTGlua2VkT2JqZWN0L29iamVjdCIvPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL0xpbmsiIGxhYmVsRmVhdHVyZT0iIy8vbW9kZWwvbW9kZWwvTGluay9uYW1lIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9MaW5rL25hbWUiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTGluay9zb3VyY2UiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIKLSAgICAgICAgICAgIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTGluay90YXJnZXQiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9MaW5rL2JlbmRwb2ludHMiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9MaW5rL3NvdXJjZUVuZFBvaW50Ii8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTGluay90YXJnZXRFbmRQb2ludCIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vTGlua2VkT2JqZWN0IiBsYWJlbEZlYXR1cmU9IiMvL21vZGVsL21vZGVsL0xpbmtlZE9iamVjdC9vYmplY3QiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIgotICAgICAgICAgICAgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRpYWdyYW0uZWNvcmUjLy9MaW5rZWRPYmplY3QvbGlua2VkRWxlbWVudCIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL0xpbmtlZE9iamVjdC9vYmplY3QiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9OYW1lZE5vZGUiIGxhYmVsRmVhdHVyZT0iIy8vbW9kZWwvbW9kZWwvTmFtZWROb2RlL25hbWUiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Ob2RlIiBsYWJlbEZlYXR1cmU9IiMvL21vZGVsL21vZGVsL0xpbmtlZE9iamVjdC9vYmplY3QiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL05vZGUvbG9jYXRpb24iLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlL3dpZHRoIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTm9kZS9oZWlnaHQiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIKLSAgICAgICAgICAgIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTm9kZS9pbmNvbWluZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZGlhZ3JhbS5lY29yZSMvL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL05vZGUvcmVhZE9ubHkiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9BY3Rpdml0eURpYWdyYW0iIGxhYmVsRmVhdHVyZT0iIy8vbW9kZWwvbW9kZWwvTGlua2VkT2JqZWN0L29iamVjdCIvPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL1R5cGVkTm9kZSIgbGFiZWxGZWF0dXJlPSIjLy9tb2RlbC9tb2RlbC9MaW5rZWRPYmplY3Qvb2JqZWN0Ij4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9UeXBlZE5vZGUvdHlwZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0iIGxhYmVsRmVhdHVyZT0iIy8vbW9kZWwvbW9kZWwvTGlua2VkT2JqZWN0L29iamVjdCIvPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0Tm9kZSIgbGFiZWxGZWF0dXJlPSIjLy9tb2RlbC9tb2RlbC9OYW1lZE5vZGUvbmFtZSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3ROb2RlL3R5cGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9BY3Rpdml0eURldGFpbERpYWdyYW0iIGxhYmVsRmVhdHVyZT0iIy8vbW9kZWwvbW9kZWwvTGlua2VkT2JqZWN0L29iamVjdCIvPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lciIgbGFiZWxGZWF0dXJlPSIjLy9tb2RlbC9tb2RlbC9MaW5rZWRPYmplY3Qvb2JqZWN0Ij4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL1JvbGVOb2RlIiBsYWJlbEZlYXR1cmU9IiMvL21vZGVsL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vUm9sZVRhc2tDb21wb3NpdGUiIGxhYmVsRmVhdHVyZT0iIy8vbW9kZWwvbW9kZWwvTGlua2VkT2JqZWN0L29iamVjdCIvPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL1Rhc2tOb2RlIiBsYWJlbEZlYXR1cmU9IiMvL21vZGVsL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgbGFiZWxGZWF0dXJlPSIjLy9tb2RlbC9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSIgbGFiZWxGZWF0dXJlPSIjLy9tb2RlbC9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0Q29tcG9zaXRlIiBsYWJlbEZlYXR1cmU9IiMvL21vZGVsL21vZGVsL0xpbmtlZE9iamVjdC9vYmplY3QiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0Q29tcG9zaXRlL3R5cGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8L25lc3RlZEdlblBhY2thZ2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDBlN2M2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIERpYWdyYW0gTW9kZWwKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhM2ExZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICA8cGFja2FnZSAKLSAgICAgICB1cmkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIiAKLSAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2UiIC8+Ci0gIDwvZXh0ZW5zaW9uPgotICA8ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmRpYWdyYW1NYW5hZ2VyIj4KLSAgICAgPGRpYWdyYW1NYW5hZ2VyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1NYW5hZ2VyIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vRGlhZ3JhbVJlc291cmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vRGlhZ3JhbVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNmM1MWVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL0RpYWdyYW1SZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIHJlc291cmNlIGNsYXNzIG9mIGRpYWdyYW0gcGx1Z2luCi0gKiAKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEaWFncmFtUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGlhZ3JhbVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZV9hY3Rpdml0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0QmFzZU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZV9XUEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZV9hY3Rpdml0eURldGFpbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRGcmVlVHh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHR5cGVfdW5rbm93bjsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIERpYWdyYW1SZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzNzFhNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi10eXBlX2FjdGl2aXR5PUFjdGl2aXR5IERpYWdyYW0KLWRlZmF1bHRCYXNlTmFtZT1OZXcgezB9Ci10eXBlX1dQRD1Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtCi10eXBlX2FjdGl2aXR5RGV0YWlsPUFjdGl2aXR5IERldGFpbCBEaWFncmFtCi1hZGRGcmVlVHh0PUFkZCBGcmVlIFRleHQKLXR5cGVfdW5rbm93bj1Vbmtub3duCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9BY3Rpdml0eURldGFpbERpYWdyYW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMzI0Nzc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbSBtb2RlbCBvYmplY3QKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBBY3Rpdml0eURldGFpbERpYWdyYW0gZXh0ZW5kcyBEaWFncmFtIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dG8gTGF5b3V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdXRvIExheW91dDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvIExheW91dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXV0b0xheW91dChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlI2dldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9BdXRvTGF5b3V0KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0F1dG9MYXlvdXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSNpc0F1dG9MYXlvdXQgPGVtPkF1dG8gTGF5b3V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvIExheW91dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNBdXRvTGF5b3V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRvTGF5b3V0KGJvb2xlYW4gdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9BY3Rpdml0eURpYWdyYW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0FjdGl2aXR5RGlhZ3JhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMjJiMDM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0FjdGl2aXR5RGlhZ3JhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhY3Rpdml0eSBkaWFncmFtIG1vZGVsIG9iamVjdAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHlEaWFncmFtIGV4dGVuZHMgRGlhZ3JhbSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0RpYWdyYW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0RpYWdyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzVjZWNmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9EaWFncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci0KLS8qKgotICogQmFzZSBkaWFncmFtIGludGVyZmFjZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlhZ3JhbSBleHRlbmRzIE5vZGVDb250YWluZXIgewotCi0JLyoqCi0JICogR2V0cyB0aGUgVU1BIG1vZGVsIG9iamVjdCBmb3IgdGhpcyBkaWFncmFtCi0JICogCi0JICogQHJldHVybgotCSAqLwotCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBnZXRVTUFEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBTZXRzIGRlZmF1bHQgbmFtZSBmb3IgbmV3IG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Tm9kZQotCSAqLwotCXZvaWQgc2V0RGVmYXVsdE5hbWUoTmFtZWROb2RlIG5ld05vZGUpOwotCi0JLyoqCi0JICogU2V0cyBhIHN1cHByZXNzaW9uIGluc3RhbmNlIGZvciB0aGlzIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gc3VwcHJlc3Npb24KLQkgKi8KLQl2b2lkIHNldFN1cHByZXNzaW9uKFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHN1cHByZXNzaW9uIGluc3RhbmNlIHVzZWQgaW4gdGhpcyBkaWFncmFtCi0JICogCi0JICogQHJldHVybgotCSAqLwotCVN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIGZpbHRlciB1c2VkIHRvIHRvIGZpbHRlciBkaWFncmFtIGVsZW1lbnRzIGluIHRoaXMgZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKi8KLQl2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcik7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhpcyBkaWFncmFtIGlzIG5ld2x5IGNyZWF0ZWQgYW5kIG5vdCBzYXZlZCB5ZXQpCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaXNOZXcoKTsKLQotCS8qKgotCSAqIFNldHMgb3IgdW5zZXRzIHRoZSBpc05ldyBmbGFnIG9mIHRoaXMgZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBuCi0JICogQHNlZSAjaXNOZXcoKQotCSAqLwotCXZvaWQgc2V0TmV3KGJvb2xlYW4gbik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTGluay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOWUyMjcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0xpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBtb2RlbCBvYmplY3QgZm9yIGEgbGluayBiZXR3ZWVuIGRpYWdyYW0gbm9kZXMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpbmsgZXh0ZW5kcyBMaW5rZWRPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlI2dldExpbmtfTmFtZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc291cmNlIG5vZGUgb2YgdGhpcyBsaW5rLgotCSAqIAotCSAqIEBtb2RlbAotCSAqLwotCU5vZGUgZ2V0U291cmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvdXJjZTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U291cmNlKE5vZGUgdmFsdWUpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFyZ2V0IG5vZGUgb2YgdGhpcyBsaW5rCi0JICogCi0JICogQG1vZGVsCi0JICovCi0JTm9kZSBnZXRUYXJnZXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRhcmdldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFyZ2V0KE5vZGUgdmFsdWUpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBiZW5kIHBvaW50cyBpbiB0aGlzIGxpbmsKLQkgKiAKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50IiBsb3dlcj0iMCIgdHJhbnNpZW50PSJ0cnVlIgotCSAqLwotCUVMaXN0IGdldEJlbmRwb2ludHMoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGVuZCBwb2ludCBvZiB0aGlzIGxpbmsgaW4gdGhlIHNvdXJjZSBub2RlCi0JICogCi0JICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiBAcmV0dXJuCi0JICovCi0JUG9pbnQgZ2V0U291cmNlRW5kUG9pbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0U291cmNlRW5kUG9pbnQgPGVtPlNvdXJjZSBFbmQgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2UgRW5kIFBvaW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTb3VyY2VFbmRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U291cmNlRW5kUG9pbnQoUG9pbnQgdmFsdWUpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZW5kIHBvaW50IG9mIHRoaXMgbGluayBpbiB0YXJnZXQgbm9kZQotCSAqIAotCSAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiCi0JICogQHJldHVybgotCSAqLwotCVBvaW50IGdldFRhcmdldEVuZFBvaW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFRhcmdldEVuZFBvaW50IDxlbT5UYXJnZXQgRW5kIFBvaW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IEVuZCBQb2ludDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFyZ2V0RW5kUG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhcmdldEVuZFBvaW50KFBvaW50IHZhbHVlKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0xpbmtlZE9iamVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTGlua2VkT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmMWU3MGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTGlua2VkT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIG9iamVjdHMgdGhhdCBpcyBsaW5rZWQgd2l0aCBvdGhlciBvYmplY3QgaW4gYQotICogZGlmZmVyZW5jZSBtb2RlbAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpbmtlZE9iamVjdCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiCi0JICovCi0JT2JqZWN0IGdldE9iamVjdCgpOwotCi0Jdm9pZCBzZXRPYmplY3QoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIEBtb2RlbAotCSAqLwotCU1ldGhvZEVsZW1lbnQgZ2V0TGlua2VkRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0I2dldExpbmtlZEVsZW1lbnQgPGVtPkxpbmtlZCBFbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rZWQgRWxlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TGlua2VkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGlua2VkRWxlbWVudChNZXRob2RFbGVtZW50IHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTW9kZWxGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Nb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzM4ZjlkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Nb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RlbEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBNb2RlbEZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbEZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRGlhZ3JhbSBjcmVhdGVEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxpbms8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIExpbmsgY3JlYXRlTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OYW1lZCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OYW1lZCBOb2RlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBOYW1lZE5vZGUgY3JlYXRlTmFtZWROb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEFjdGl2aXR5RGlhZ3JhbSBjcmVhdGVBY3Rpdml0eURpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHlwZWQgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHlwZWQgTm9kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgVHlwZWROb2RlIGNyZWF0ZVR5cGVkTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdE5vZGUgY3JlYXRlV29ya1Byb2R1Y3ROb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZpdHlEZXRhaWxEaWFncmFtIGNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgTm9kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZU5vZGUgY3JlYXRlUm9sZU5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZVRhc2tDb21wb3NpdGUgY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIE5vZGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2tOb2RlIGNyZWF0ZVRhc2tOb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdENvbXBvc2l0ZSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBNb2RlbFBhY2thZ2UgZ2V0TW9kZWxQYWNrYWdlKCk7Ci0KLX0gLy9Nb2RlbEZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL01vZGVsUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTW9kZWxQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmMjhjM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTW9kZWxQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFN0cmluZyBlTkFNRSA9ICJtb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIE1vZGVsUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVDb250YWluZXJJbXBsIDxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUNvbnRhaW5lckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXROb2RlQ29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua2VkT2JqZWN0SW1wbCA8ZW0+TGlua2VkIE9iamVjdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua2VkT2JqZWN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldExpbmtlZE9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBMSU5LRURfT0JKRUNUID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCA8ZW0+RGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IERJQUdSQU0gPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsIDxlbT5MaW5rPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgTElOSyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwgPGVtPk5vZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBOT0RFID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsIDxlbT5OYW1lZCBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0TmFtZWROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREUgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGlhZ3JhbUltcGwgPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGlhZ3JhbUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eURpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgQUNUSVZJVFlfRElBR1JBTSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVHlwZWROb2RlSW1wbCA8ZW0+VHlwZWQgTm9kZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVHlwZWROb2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFR5cGVkTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0gPSA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Tm9kZUltcGwgPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdE5vZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3ROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFID0gODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5BY3Rpdml0eURldGFpbERpYWdyYW1JbXBsIDxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZU5vZGVJbXBsIDxlbT5Sb2xlIE5vZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlJvbGVOb2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFJvbGVOb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfTk9ERSA9IDExOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlJvbGVUYXNrQ29tcG9zaXRlSW1wbCA8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZVRhc2tDb21wb3NpdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Um9sZVRhc2tDb21wb3NpdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9UQVNLX0NPTVBPU0lURSA9IDEyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlRhc2tOb2RlSW1wbCA8ZW0+VGFzayBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5UYXNrTm9kZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRUYXNrTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLX05PREUgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREUgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0xJTktFRF9FTEVNRU5UID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19PQkpFQ1QgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX09CSkVDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0xPQ0FUSU9OID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1dJRFRIID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19IRUlHSFQgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fUkVBRF9PTkxZID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IERJQUdSQU1fX05PREVTID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EaWFncmFtPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IERJQUdSQU1fRkVBVFVSRV9DT1VOVCA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJTktfX0xJTktFRF9FTEVNRU5UID0gTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJTktfX09CSkVDVCA9IE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19PQkpFQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJTktfX05BTUUgPSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTElOS19fU09VUkNFID0gTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTElOS19fVEFSR0VUID0gTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmVuZHBvaW50czwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTElOS19fQkVORFBPSU5UUyA9IE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZSBFbmQgUG9pbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSU5LX19TT1VSQ0VfRU5EX1BPSU5UID0gTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVuZCBQb2ludDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJTktfX1RBUkdFVF9FTkRfUE9JTlQgPSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5MaW5rPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IExJTktfRkVBVFVSRV9DT1VOVCA9IE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJTktFRF9PQkpFQ1RfX09CSkVDVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TGlua2VkIE9iamVjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBMSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRURfTk9ERV9fTElOS0VEX0VMRU1FTlQgPSBNb2RlbFBhY2thZ2UuTk9ERV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRURfTk9ERV9fT0JKRUNUID0gTW9kZWxQYWNrYWdlLk5PREVfX09CSkVDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREVfX0xPQ0FUSU9OID0gTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTkFNRURfTk9ERV9fV0lEVEggPSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTkFNRURfTk9ERV9fSEVJR0hUID0gTW9kZWxQYWNrYWdlLk5PREVfX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTkFNRURfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5BTUVEX05PREVfX1JFQURfT05MWSA9IE1vZGVsUGFja2FnZS5OT0RFX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREVfX05BTUUgPSBNb2RlbFBhY2thZ2UuTk9ERV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5OYW1lZCBOb2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREVfRkVBVFVSRV9DT1VOVCA9IE1vZGVsUGFja2FnZS5OT0RFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9fTElOS0VEX0VMRU1FTlQgPSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9fT0JKRUNUID0gTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfX09CSkVDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5PREVfX0xPQ0FUSU9OID0gTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOT0RFX19XSURUSCA9IE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5PREVfX0hFSUdIVCA9IE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfX1JFQURfT05MWSA9IE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk5vZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTk9ERV9GRUFUVVJFX0NPVU5UID0gTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ESUFHUkFNX19MSU5LRURfRUxFTUVOVCA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ESUFHUkFNX19PQkpFQ1QgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fT0JKRUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRElBR1JBTV9fTE9DQVRJT04gPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ESUFHUkFNX19XSURUSCA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ESUFHUkFNX19IRUlHSFQgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ESUFHUkFNX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRElBR1JBTV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRElBR1JBTV9fUkVBRF9PTkxZID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgQUNUSVZJVFlfRElBR1JBTV9fTk9ERVMgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fTk9ERVM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBBQ1RJVklUWV9ESUFHUkFNX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRZUEVEX05PREVfX0xJTktFRF9FTEVNRU5UID0gTW9kZWxQYWNrYWdlLk5PREVfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRZUEVEX05PREVfX09CSkVDVCA9IE1vZGVsUGFja2FnZS5OT0RFX19PQkpFQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFX19MT0NBVElPTiA9IE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFRZUEVEX05PREVfX1dJRFRIID0gTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFRZUEVEX05PREVfX0hFSUdIVCA9IE1vZGVsUGFja2FnZS5OT0RFX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFRZUEVEX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUWVBFRF9OT0RFX19SRUFEX09OTFkgPSBNb2RlbFBhY2thZ2UuTk9ERV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFX19UWVBFID0gTW9kZWxQYWNrYWdlLk5PREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VHlwZWQgTm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuTk9ERV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU1fX0xJTktFRF9FTEVNRU5UID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU1fX09CSkVDVCA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX19PQkpFQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX19MT0NBVElPTiA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU1fX1dJRFRIID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU1fX0hFSUdIVCA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU1fX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX19SRUFEX09OTFkgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX19OT0RFUyA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX19OT0RFUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU1fRkVBVFVSRV9DT1VOVCA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX05PREVfX0xJTktFRF9FTEVNRU5UID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19PQkpFQ1QgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fT0JKRUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX05PREVfX0xPQ0FUSU9OID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX05PREVfX1dJRFRIID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19IRUlHSFQgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9fUkVBRF9PTkxZID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX05PREVfX05BTUUgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX05PREVfX1RZUEUgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgTm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9GRUFUVVJFX0NPVU5UID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fTElOS0VEX0VMRU1FTlQgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX09CSkVDVCA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX19PQkpFQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fTE9DQVRJT04gPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fV0lEVEggPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0hFSUdIVCA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19SRUFEX09OTFkgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fTk9ERVMgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fTk9ERVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0byBMYXlvdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9GRUFUVVJFX0NPVU5UID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUl9fTElOS0VEX0VMRU1FTlQgPSBNb2RlbFBhY2thZ2UuTk9ERV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9DT05UQUlORVJfX09CSkVDVCA9IE1vZGVsUGFja2FnZS5OT0RFX19PQkpFQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUl9fTE9DQVRJT04gPSBNb2RlbFBhY2thZ2UuTk9ERV9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUl9fV0lEVEggPSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9DT05UQUlORVJfX0hFSUdIVCA9IE1vZGVsUGFja2FnZS5OT0RFX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9DT05UQUlORVJfX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX19SRUFEX09OTFkgPSBNb2RlbFBhY2thZ2UuTk9ERV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUl9fTk9ERVMgPSBNb2RlbFBhY2thZ2UuTk9ERV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UID0gTW9kZWxQYWNrYWdlLk5PREVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfX0xJTktFRF9FTEVNRU5UID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfTk9ERV9fT0JKRUNUID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX09CSkVDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfTk9ERV9fTE9DQVRJT04gPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfX1dJRFRIID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfTk9ERV9fSEVJR0hUID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfX1JFQURfT05MWSA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfTk9ERV9fTkFNRSA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgTm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfRkVBVFVSRV9DT1VOVCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9UQVNLX0NPTVBPU0lURV9fTElOS0VEX0VMRU1FTlQgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX09CSkVDVCA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fT0JKRUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9UQVNLX0NPTVBPU0lURV9fTE9DQVRJT04gPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9UQVNLX0NPTVBPU0lURV9fV0lEVEggPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX0hFSUdIVCA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19SRUFEX09OTFkgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9UQVNLX0NPTVBPU0lURV9fTk9ERVMgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdyBJbmRleDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX1JPV19JTkRFWCA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfRkVBVFVSRV9DT1VOVCA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9fTElOS0VEX0VMRU1FTlQgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19PQkpFQ1QgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fT0JKRUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19MT0NBVElPTiA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9fV0lEVEggPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19IRUlHSFQgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9fUkVBRF9PTkxZID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19OQU1FID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5kZXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfX0lOREVYID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFzayBOb2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9GRUFUVVJFX0NPVU5UID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFX19MSU5LRURfRUxFTUVOVCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFX19PQkpFQ1QgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fT0JKRUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fTE9DQVRJT04gPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFX19XSURUSCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFX19IRUlHSFQgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fUkVBRF9PTkxZID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fTkFNRSA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9GRUFUVVJFX0NPVU5UID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERSA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX19MSU5LRURfRUxFTUVOVCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREVfX09CSkVDVCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19PQkpFQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREVfX0xPQ0FUSU9OID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX19XSURUSCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREVfX0hFSUdIVCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX19SRUFEX09OTFkgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREVfX05BTUUgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwgPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0Q29tcG9zaXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEUgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfX0xJTktFRF9FTEVNRU5UID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19PQkpFQ1QgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX09CSkVDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfX0xPQ0FUSU9OID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfX1dJRFRIID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19IRUlHSFQgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fUkVBRF9PTkxZID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfX05PREVTID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fVFlQRSA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfRkVBVFVSRV9DT1VOVCA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+QWJzb2x1dGUgQmVuZHBvaW50PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0QWJzb2x1dGVCZW5kcG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgQUJTT0xVVEVfQkVORFBPSU5UID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlBvaW50PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0UG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgUE9JTlQgPSAxODsKLQotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SID0gMTk7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUNsYXNzIGdldERpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsgPGVtPkxpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUNsYXNzIGdldExpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGlua19OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPlNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0U291cmNlKCkKLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRVJlZmVyZW5jZSBnZXRMaW5rX1NvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VGFyZ2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRUYXJnZXQoKQotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFUmVmZXJlbmNlIGdldExpbmtfVGFyZ2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRCZW5kcG9pbnRzIDxlbT5CZW5kcG9pbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5CZW5kcG9pbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRCZW5kcG9pbnRzKCkKLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUF0dHJpYnV0ZSBnZXRMaW5rX0JlbmRwb2ludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRTb3VyY2VFbmRQb2ludCA8ZW0+U291cmNlIEVuZCBQb2ludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvdXJjZSBFbmQgUG9pbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFNvdXJjZUVuZFBvaW50KCkKLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMaW5rX1NvdXJjZUVuZFBvaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0VGFyZ2V0RW5kUG9pbnQgPGVtPlRhcmdldCBFbmQgUG9pbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXJnZXQgRW5kIFBvaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRUYXJnZXRFbmRQb2ludCgpCi0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGlua19UYXJnZXRFbmRQb2ludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0IDxlbT5MaW5rZWQgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxpbmtlZCBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUNsYXNzIGdldExpbmtlZE9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3QjZ2V0TGlua2VkRWxlbWVudCA8ZW0+TGlua2VkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5MaW5rZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdCNnZXRMaW5rZWRFbGVtZW50KCkKLQkgKiBAc2VlICNnZXRMaW5rZWRPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldExpbmtlZE9iamVjdF9MaW5rZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdCNnZXRPYmplY3QgPGVtPk9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdCNnZXRPYmplY3QoKQotCSAqIEBzZWUgI2dldExpbmtlZE9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGlua2VkT2JqZWN0X09iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlIDxlbT5OYW1lZCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk5hbWVkIE5vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUNsYXNzIGdldE5hbWVkTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGUjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0TmFtZWROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUF0dHJpYnV0ZSBnZXROYW1lZE5vZGVfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSA8ZW0+Tm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Ob2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0Tm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRMb2NhdGlvbigpCi0JICogQHNlZSAjZ2V0Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Tm9kZV9Mb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldpZHRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRXaWR0aCgpCi0JICogQHNlZSAjZ2V0Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Tm9kZV9XaWR0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldEhlaWdodCA8ZW0+SGVpZ2h0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGVpZ2h0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRIZWlnaHQoKQotCSAqIEBzZWUgI2dldE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldE5vZGVfSGVpZ2h0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zIDxlbT5JbmNvbWluZyBDb25uZWN0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldEluY29taW5nQ29ubmVjdGlvbnMoKQotCSAqIEBzZWUgI2dldE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFUmVmZXJlbmNlIGdldE5vZGVfSW5jb21pbmdDb25uZWN0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0T3V0Z29pbmdDb25uZWN0aW9ucyA8ZW0+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk91dGdvaW5nIENvbm5lY3Rpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkKLQkgKiBAc2VlICNnZXROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRVJlZmVyZW5jZSBnZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNpc1JlYWRPbmx5IDxlbT5SZWFkIE9ubHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWFkIE9ubHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2lzUmVhZE9ubHkoKQotCSAqIEBzZWUgI2dldE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE5vZGVfUmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbSA8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BY3Rpdml0eSBEaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXRBY3Rpdml0eURpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZSA8ZW0+VHlwZWQgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UeXBlZCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXRUeXBlZE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFR5cGVkTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0VHlwZWROb2RlX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gPGVtPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZSA8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0Tm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGUjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3ROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdE5vZGVfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtIDxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSNpc0F1dG9MYXlvdXQgPGVtPkF1dG8gTGF5b3V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0byBMYXlvdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW0jaXNBdXRvTGF5b3V0KCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9BdXRvTGF5b3V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyIDxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE5vZGVDb250YWluZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyI2dldE5vZGVzIDxlbT5Ob2RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Tm9kZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyI2dldE5vZGVzKCkKLQkgKiBAc2VlICNnZXROb2RlQ29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXROb2RlQ29udGFpbmVyX05vZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZSA8ZW0+Um9sZSBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGUgPGVtPlJvbGUgVGFzayBDb21wb3NpdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlVGFza0NvbXBvc2l0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZSNnZXRSb3dJbmRleCA8ZW0+Um93IEluZGV4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um93IEluZGV4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGUjZ2V0Um93SW5kZXgoKQotCSAqIEBzZWUgI2dldFJvbGVUYXNrQ29tcG9zaXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlVGFza0NvbXBvc2l0ZV9Sb3dJbmRleCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGUgPGVtPlRhc2sgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrIE5vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFza05vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGUjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5kZXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZSNnZXRJbmRleCgpCi0JICogQHNlZSAjZ2V0VGFza05vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tOb2RlX0luZGV4KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGUgPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdENvbXBvc2l0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0Q29tcG9zaXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdENvbXBvc2l0ZV9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50IDxlbT5BYnNvbHV0ZSBCZW5kcG9pbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkFic29sdXRlIEJlbmRwb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVEYXRhVHlwZSBnZXRBYnNvbHV0ZUJlbmRwb2ludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludCA8ZW0+UG9pbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlBvaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ci0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRURhdGFUeXBlIGdldFBvaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRSb2xlRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgTW9kZWxGYWN0b3J5IGdldE1vZGVsRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCA8ZW0+RGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0RGlhZ3JhbSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESUFHUkFNID0gZUlOU1RBTkNFLmdldERpYWdyYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua0ltcGwgPGVtPkxpbms8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldExpbmsoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTElOSyA9IGVJTlNUQU5DRS5nZXRMaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTElOS19fTkFNRSA9IGVJTlNUQU5DRS5nZXRMaW5rX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBMSU5LX19TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0TGlua19Tb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhcmdldDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExJTktfX1RBUkdFVCA9IGVJTlNUQU5DRS5nZXRMaW5rX1RhcmdldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmVuZHBvaW50czwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTElOS19fQkVORFBPSU5UUyA9IGVJTlNUQU5DRS5nZXRMaW5rX0JlbmRwb2ludHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZSBFbmQgUG9pbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMSU5LX19TT1VSQ0VfRU5EX1BPSU5UID0gZUlOU1RBTkNFLmdldExpbmtfU291cmNlRW5kUG9pbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbmQgUG9pbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMSU5LX19UQVJHRVRfRU5EX1BPSU5UID0gZUlOU1RBTkNFLmdldExpbmtfVGFyZ2V0RW5kUG9pbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua2VkT2JqZWN0SW1wbCA8ZW0+TGlua2VkIE9iamVjdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua2VkT2JqZWN0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRMaW5rZWRPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTElOS0VEX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRMaW5rZWRPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0TGlua2VkT2JqZWN0X0xpbmtlZEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExJTktFRF9PQkpFQ1RfX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRMaW5rZWRPYmplY3RfT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwgPGVtPk5hbWVkIE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0TmFtZWROb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE5BTUVEX05PREUgPSBlSU5TVEFOQ0UuZ2V0TmFtZWROb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTkFNRURfTk9ERV9fTkFNRSA9IGVJTlNUQU5DRS5nZXROYW1lZE5vZGVfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCA8ZW0+Tm9kZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Tm9kZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBOT0RFID0gZUlOU1RBTkNFLmdldE5vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTk9ERV9fTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0Tm9kZV9Mb2NhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBOT0RFX19XSURUSCA9IGVJTlNUQU5DRS5nZXROb2RlX1dpZHRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBOT0RFX19IRUlHSFQgPSBlSU5TVEFOQ0UuZ2V0Tm9kZV9IZWlnaHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBOT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IGVJTlNUQU5DRS5nZXROb2RlX0luY29taW5nQ29ubmVjdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBOT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IGVJTlNUQU5DRS5nZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE5PREVfX1JFQURfT05MWSA9IGVJTlNUQU5DRS5nZXROb2RlX1JlYWRPbmx5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGlhZ3JhbUltcGwgPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGlhZ3JhbUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0QWN0aXZpdHlEaWFncmFtKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWSVRZX0RJQUdSQU0gPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEaWFncmFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlR5cGVkTm9kZUltcGwgPGVtPlR5cGVkIE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlR5cGVkTm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0VHlwZWROb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRZUEVEX05PREUgPSBlSU5TVEFOQ0UuZ2V0VHlwZWROb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVFlQRURfTk9ERV9fVFlQRSA9IGVJTlNUQU5DRS5nZXRUeXBlZE5vZGVfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3ROb2RlSW1wbCA8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Tm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3ROb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVF9OT0RFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0Tm9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9OT0RFX19UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0Tm9kZV9UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgPGVtPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5BY3Rpdml0eURldGFpbERpYWdyYW1JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dG8gTGF5b3V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VUID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9BdXRvTGF5b3V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVDb250YWluZXJJbXBsIDxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUNvbnRhaW5lckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Tm9kZUNvbnRhaW5lcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBOT0RFX0NPTlRBSU5FUiA9IGVJTlNUQU5DRS5nZXROb2RlQ29udGFpbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTk9ERV9DT05UQUlORVJfX05PREVTID0gZUlOU1RBTkNFLmdldE5vZGVDb250YWluZXJfTm9kZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZU5vZGVJbXBsIDxlbT5Sb2xlIE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlJvbGVOb2RlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRSb2xlTm9kZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX05PREUgPSBlSU5TVEFOQ0UuZ2V0Um9sZU5vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZVRhc2tDb21wb3NpdGVJbXBsIDxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Sb2xlVGFza0NvbXBvc2l0ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Um9sZVRhc2tDb21wb3NpdGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9UQVNLX0NPTVBPU0lURSA9IGVJTlNUQU5DRS5nZXRSb2xlVGFza0NvbXBvc2l0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um93IEluZGV4PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYID0gZUlOU1RBTkNFLmdldFJvbGVUYXNrQ29tcG9zaXRlX1Jvd0luZGV4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlRhc2tOb2RlSW1wbCA8ZW0+VGFzayBOb2RlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5UYXNrTm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0VGFza05vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTS19OT0RFID0gZUlOU1RBTkNFLmdldFRhc2tOb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfTk9ERV9fSU5ERVggPSBlSU5TVEFOQ0UuZ2V0VGFza05vZGVfSW5kZXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwgPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdENvbXBvc2l0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0Q29tcG9zaXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdENvbXBvc2l0ZV9UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5BYnNvbHV0ZSBCZW5kcG9pbnQ8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0QWJzb2x1dGVCZW5kcG9pbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgQUJTT0xVVEVfQkVORFBPSU5UID0gZUlOU1RBTkNFLmdldEFic29sdXRlQmVuZHBvaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5Qb2ludDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRQb2ludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBQT0lOVCA9IGVJTlNUQU5DRS5nZXRQb2ludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBST0xFX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKTsKLQotCX0KLQotfSAvL01vZGVsUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTmFtZWROb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9OYW1lZE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWRjM2NkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9OYW1lZE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi0vKioKLSAqIEEgZGlhZ3JhbSBub2RlIHdpdGggbmFtZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWROb2RlIGV4dGVuZHMgTm9kZSB7Ci0JLyoqCi0JICogR2V0cyBub2RlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgbm9kZQotCSAqIEBtb2RlbAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHN1cHByZXNzaW9uIHN0YXR1cyBvZiB0aGlzIG5vZGUKLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIHN1cHByZXNzZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBpc1N1cHByZXNzZWQoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHdyYXBwZXIgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHRoYXQgdGhpcyBub2RlIHJlcHJlc2VudHMKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB3cmFwcGVyCi0JICovCi0JT2JqZWN0IGdldFdyYXBwZXIoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL05vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWQ1NWM5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci0KLS8qKgotICogVGhlIGRpYWdyYW0gbm9kZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGUgZXh0ZW5kcyBMaW5rZWRPYmplY3QgewotCi0JLyoqCi0JICogR2V0cyBsb2NhdGlvbiBvZiB0aGlzIG5vZGUKLQkgKiAKLQkgKiBAbW9kZWwgdHJhbnNpZW50PSJ0cnVlIgotCSAqLwotCVBvaW50IGdldExvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHdpZHRoCi0JICogCi0JICogQG1vZGVsIGRlZmF1bHQ9Ii0xIiB0cmFuc2llbnQ9InRydWUiCi0JICovCi0JaW50IGdldFdpZHRoKCk7Ci0KLQkvKioKLQkgKiBHZXRzIGhlaWdodAotCSAqIAotCSAqIEByZXR1cm4gdGhlIGhlaWdodAotCSAqIEBtb2RlbCBkZWZhdWx0PSItMSIgdHJhbnNpZW50PSJ0cnVlIgotCSAqLwotCWludCBnZXRIZWlnaHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0SGVpZ2h0IDxlbT5IZWlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IZWlnaHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGVpZ2h0KGludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldpZHRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXaWR0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V2lkdGgoaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2NhdGlvbihQb2ludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXRzIGluY29taW5nIGxpbmtzCi0JICogCi0JICogQG1vZGVsIHR5cGU9IkxpbmsiIG9wcG9zaXRlPSJ0YXJnZXQiIGxvd2VyPSIwIgotCSAqLwotCUVMaXN0IGdldEluY29taW5nQ29ubmVjdGlvbnMoKTsKLQotCS8qKgotCSAqIEdldHMgb3V0Z29pbmcgbGlua3MKLQkgKiAKLQkgKiBAbW9kZWwgdHlwZT0iTGluayIgY29udGFpbm1lbnQ9InRydWUiIG9wcG9zaXRlPSJzb3VyY2UiIGxvd2VyPSIwIgotCSAqLwotCUVMaXN0IGdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGlzIG5vZGUgaXMgcmVhZC1vbmx5Ci0JICogCi0JICogQG1vZGVsCi0JICovCi0JYm9vbGVhbiBpc1JlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2lzUmVhZE9ubHkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaWFncmFtIG9mIHRoaXMgbm9kZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlEaWFncmFtIGdldERpYWdyYW0oKTsKLQotCS8qKgotCSAqIFNldHMgZGlhZ3JhbSBmb3IgdGhpcyBub2RlCi0JICogCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKi8KLQl2b2lkIHNldERpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIEdyYXBoTm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlHcmFwaE5vZGUgZ2V0R3JhcGhOb2RlKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0eXBlIG9mIG1ldGhvZCBlbGVtZW50IGFkYXB0ZXIuIE1ldGhvZCBlbGVtZW50IGFkYXB0ZXIgaXMgYSBub2RlCi0JICogaW50ZXJuYWwge0BsaW5rIEFkYXB0ZXIgYWRhcHRlcn0gdGhhdCBpcyBsaXN0ZW5pbmcgb24gY2hhbmdlcyBvZiBsaW5rZWQKLQkgKiBtZXRob2QgZWxlbWVudCBvciBpdHMgd3JhcHBlciB0byB1cGRhdGUgdGhlIG5vZGUgYWNjb3JkaW5nbHkuCi0JICogCi0JICogQHJldHVybiB0aGUgY2xhc3Mgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFkYXB0ZXIgb2YgdGhpcyBub2RlCi0JICovCi0JQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCB0aGUgVU1BIGRpYWdyYW0gZm9yIHRoZSBuZXcgbm9kZSBzbyBpdCBjYW4KLQkgKiBmaW5kIHRoZSBHcmFwaE5vZGUgZm9yIHRoZSBsaW5rZWQgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHVtYURpYWdyYW0KLQkgKi8KLQl2b2lkIHNldFVNQURpYWdyYW0ob3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIHVtYURpYWdyYW0pOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZ3JhcGggbm9kZSB0aGF0IGlzIHRoZSBjb250YWluZXIgb2YgdGhlCi0JICoge0BsaW5rICNnZXRHcmFwaE5vZGUoKSBsaW5rZWQgZ3JhcGggbm9kZX0KLQkgKiAKLQkgKiBAcGFyYW0gdW1hQ29udGFpbmVyCi0JICovCi0Jdm9pZCBzZXRVTUFDb250YWluZXIoR3JhcGhOb2RlIHVtYUNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjb25zdW1lciB0byB0aGUgY29uc3VtZXIgbGlzdCBvZiB0aGlzIG5vZGUuCi0JICogCi0JICogQHBhcmFtIGNvbnN1bWVyCi0JICovCi0Jdm9pZCBhZGRDb25zdW1lcihPYmplY3QgY29uc3VtZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29uc3VtZXIgZnJvbSB0aGUgY29uc3VtZXIgbGlzdCBvZiB0aGlzIG5vZGUuIERpc3Bvc2VzCi0JICogdGhlIG5vZGUgaWYgaXQgZG9lcyBub3QgaGF2ZSBhbnkgbW9yZSBjb25zdW1lciBhZnRlciB0aGlzIGNhbGwuIERpc3Bvc2luZwotCSAqIGEgbm9kZSB3aWxsIHRha2UgY2FyZSBvZiByZW1vdmluZyB0aGlzIG5vZGUncyBsaXN0ZW5lciBmcm9tIHRoZSBVTUEKLQkgKiBvYmplY3QgYW5kIGFsbCB0aGUgYWRhcHRlcnMgdGhhdCBoYWQgYmVlbiBhZGRlZCB0byB0aGUgYWRhcHRlciBsaXN0IG9mCi0JICogdGhpcyBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBjb25zdW1lcgotCSAqLwotCXZvaWQgcmVtb3ZlQ29uc3VtZXIoT2JqZWN0IGNvbnN1bWVyKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL05vZGVDb250YWluZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL05vZGVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2IyNTkxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Ob2RlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiBBIGNvbXBvc2l0ZSBub2RlIHRoYXQgY2FuIGNvbnRhaW4gY2hpbGQgbm9kZXMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqLwotcHVibGljIGludGVyZmFjZSBOb2RlQ29udGFpbmVyIGV4dGVuZHMgTm9kZSB7Ci0JLyoqCi0JICogR2V0cyBjaGlsZCBub2RlcwotCSAqIAotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHlwZT0iTm9kZSIKLQkgKi8KLQlFTGlzdCBnZXROb2RlcygpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvUm9sZU5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1JvbGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhYTQ2NzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvUm9sZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi0vKioKLSAqIE5vZGUgdGhhdCByZXByZXNlbnRzIGEgcm9sZSBpbiBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlTm9kZSBleHRlbmRzIE5hbWVkTm9kZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1JvbGVUYXNrQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Sb2xlVGFza0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OTYzNmVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1JvbGVUYXNrQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBBIGNvbnRhaW5lciB0aGF0IGdyb3VwcyBhIFJvbGVOb2RlIGFuZCBUYXNrTm9kZXMgd2hvc2UgdGFza3MgdGhlIFJvbGUgcGVyZm9ybXMuCi0gKiBUaGUgbGlua2VkIG9iamVjdCBmb3IgUm9sZVRhc2tDb21wb3NpdGUgaXMgUm9sZURlc2NyaXB0b3IuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlVGFza0NvbXBvc2l0ZSBleHRlbmRzIE5vZGVDb250YWluZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvdyBJbmRleDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um93IEluZGV4PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvdyBJbmRleDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Um93SW5kZXgoaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlI2dldFJvbGVUYXNrQ29tcG9zaXRlX1Jvd0luZGV4KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IGdldFJvd0luZGV4KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZSNnZXRSb3dJbmRleCA8ZW0+Um93IEluZGV4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3cgSW5kZXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJvd0luZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSb3dJbmRleChpbnQgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9UYXNrTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvVGFza05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTA0MTNlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9UYXNrTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogTm9kZSB0aGF0IHJlcHJlc2VudHMgYSB0YXNrIGluIGRpYWdyYW0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2tOb2RlIGV4dGVuZHMgTmFtZWROb2RlIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Ii0xIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5kZXgoaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlI2dldFRhc2tOb2RlX0luZGV4KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iLTEiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBnZXRJbmRleCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGUjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluZGV4KGludCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1R5cGVkTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvVHlwZWROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjMGY0Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvVHlwZWROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBOb2RlIHRoYXQgaXMgbm90IGxpbmtlZCB0byBhbnkgbWV0aG9kIGVsZW1lbnQgKG5vdCBhIHtAbGluayBMaW5rZWRPYmplY3R9KS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGVkTm9kZSBleHRlbmRzIE5vZGUgewotCXN0YXRpYyBmaW5hbCBpbnQgU1lOQ0hfQkFSID0gMTsKLQotCXN0YXRpYyBmaW5hbCBpbnQgREVDSVNJT04gPSAyOwotCi0Jc3RhdGljIGZpbmFsIGludCBTVEFSVCA9IDM7Ci0KLQlzdGF0aWMgZmluYWwgaW50IEVORCA9IDQ7Ci0KLQlzdGF0aWMgZmluYWwgaW50IFNUSUNLWV9OT1RFID0gNTsKLQotCXN0YXRpYyBmaW5hbCBpbnQgRlJFRV9URVhUID0gNjsKLQotCS8qKgotCSAqIEdldHMgdHlwZS4gVGhlIHR5cGUgbXVzdCBiZSBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkIGluIHRoaXMKLQkgKiBpbnRlcmZhY2UuCi0JICogCi0JICogQG1vZGVsCi0JICovCi0JaW50IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShpbnQgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjcxNGZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotCi0vKioKLSAqIE5vZGUgdGhhdCByZXByZXNlbnRzIGEge0BsaW5rIFdvcmtCcmVha2Rvd25FbGVtZW50fQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIGV4dGVuZHMgTmFtZWROb2RlIHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3RDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjMTI2MTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3RDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiBOb2RlIHRoYXQgcmVwcmVzZW50cyBhIGdyb3VwIG9mIHtAbGluayBXb3JrUHJvZHVjdH0KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdENvbXBvc2l0ZSBleHRlbmRzIE5vZGVDb250YWluZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5QVVRTID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVFBVVFMgPSAyOwotCi0JLyoqCi0JICogR2V0cyB0eXBlLgotCSAqIAotCSAqIEByZXR1cm4ge0BsaW5rICNJTlBVVFN9IG9yIHtAbGluayAjT1VUUFVUU30KLQkgKiBAbW9kZWwKLQkgKi8KLQlpbnQgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoaW50IHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5N2RiODFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgdGhlIG1vZGVsIG9mIHRoZSBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGV4dGVuZHMgRGlhZ3JhbSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGM0ODEyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBOb2RlIGZvciBXb3JrUHJvZHVjdERlc2NyaXB0b3IgaW4gQWN0aXZpdHlEZXRhaWxEaWFncmFtLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSBleHRlbmRzIE5hbWVkTm9kZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0Tm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3ROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1ZDRmYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3ROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBub2RlIGluIFdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0Tm9kZSBleHRlbmRzIE5hbWVkTm9kZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlRJRkFDVCA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUxJVkVSQUJMRSA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRDT01FID0gMzsKLQotCS8qKgotCSAqIEdldHMgdGhlIHdvcmsgcHJvZHVjdCB0eXBlIG9mIHRoaXMgbm9kZS4gVGhpcyBtdXN0IGJlIG9uZSBvZiB0aGUKLQkgKiBmb2xsb3dpbmcgY29uc3RhbnRzOiB7QGxpbmsgI0FSVElGQUNUfSwge0BsaW5rICNERUxJVkVSQUJMRX0sIHtAbGluayAjT1VUQ09NRX0KLQkgKiAKLQkgKiBAbW9kZWwKLQkgKi8KLQlpbnQgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKGludCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9BY3Rpdml0eURldGFpbERpYWdyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlNmVhMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9BY3Rpdml0eURldGFpbERpYWdyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWRhcHRlckZhY3RvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCNpc0F1dG9MYXlvdXQgPGVtPkF1dG8gTGF5b3V0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBleHRlbmRzIERpYWdyYW1JbXBsIGltcGxlbWVudHMKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvTGF5b3V0KCkgPGVtPkF1dG8gTGF5b3V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0F1dG9MYXlvdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBVVRPX0xBWU9VVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvTGF5b3V0KCkgPGVtPkF1dG8gTGF5b3V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0F1dG9MYXlvdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF1dG9MYXlvdXQgPSBBVVRPX0xBWU9VVF9FREVGQVVMVDsKLQotCXByaXZhdGUgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBBY3Rpdml0eUFkYXB0ZXIKLQkJCWltcGxlbWVudHMgSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIHsKLQkJLy8gLyogKG5vbi1KYXZhZG9jKQotCQkvLyAqIEBzZWUKLQkJLy8gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbC5BY3Rpdml0eUFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCS8vICovCi0JCS8vIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkvLyBpZighbm90aWZpY2F0aW9uRW5hYmxlZCkgcmV0dXJuOwotCQkvLyBub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCS8vIHRyeSB7Ci0JCS8vIE9iamVjdCBvYmo7Ci0JCS8vIHN3aXRjaChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkvLyBjYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJLy8gcmVwb3B1bGF0ZURpYWdyYW0oKTsKLQkJLy8gYnJlYWs7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBmaW5hbGx5IHsKLQkJLy8gbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gfQotCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJZGlhZ3JhbUNoYW5nZUxpc3RlbmVyID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VUOgotCQkJCXJldHVybiBpc0F1dG9MYXlvdXQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19BVVRPX0xBWU9VVDoKLQkJCQlzZXRBdXRvTGF5b3V0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQ6Ci0JCQkJc2V0QXV0b0xheW91dChBVVRPX0xBWU9VVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQ6Ci0JCQkJcmV0dXJuIGF1dG9MYXlvdXQgIT0gQVVUT19MQVlPVVRfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdXRvTGF5b3V0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdXRvTGF5b3V0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVwb3B1bGF0ZURpYWdyYW0oKSB7Ci0JCS8vIGNsZWFyIGRpYWdyYW0KLQkJLy8KLQotCQlpbnQgc2l6ZSA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCi0JCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIGZvciBhbGwgbm9kZXMgaW4gdGhpcyBkaWFncmFtIHRvIGF2b2lkIHVud2FudGVkCi0JCS8vIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZWlyIGNvbm5lY3Rpb24gbGlzdAotCQkvLwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTm9kZUltcGwgbm9kZSA9ICgoTm9kZUltcGwpIGdldE5vZGVzKCkuZ2V0KGkpKTsKLQkJCW5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0aW9uID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRpb24uaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXJhdGlvbi5uZXh0KCk7Ci0KLQkJCS8vIGNsZWFyIGFsbCBsaW5rcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCQl9Ci0JCQlub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJbm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJfQotCi0JCWdldE5vZGVzKCkuY2xlYXIoKTsKLQotCQlwb3B1bGF0ZURpYWdyYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9MYXlvdXQoKSB7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCXJldHVybiBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVRfVkFMVUVfVFJVRS5lcXVhbHMoCi0JCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0QXV0b0xheW91dEZsYWcodGhpcykpOwotCQl9Ci0JCXJldHVybiBhdXRvTGF5b3V0OwotCX0KLQotCi0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRvTGF5b3V0KGJvb2xlYW4gbmV3QXV0b0xheW91dCkgewotCQlib29sZWFuIG9sZEF1dG9MYXlvdXQgPSBhdXRvTGF5b3V0OwotCQlhdXRvTGF5b3V0ID0gbmV3QXV0b0xheW91dDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19BVVRPX0xBWU9VVCwgb2xkQXV0b0xheW91dCwgYXV0b0xheW91dCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1NldEF1dG9MYXlvdXQoYm9vbGVhbiBuZXdBdXRvTGF5b3V0KSB7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuY3JlYXRlUHJvcGVydHkodGhpcy5ncmFwaE5vZGUsIAotCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVQsIAotCQkJCQlTdHJpbmcudmFsdWVPZihuZXdBdXRvTGF5b3V0KSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRBdXRvTGF5b3V0KG5ld0F1dG9MYXlvdXQpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gZ2V0QWxsQnJlYWtkb3duRWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBicmVha2Rvd24gZWxlbWVudHMgb3IgdGhlaXIgd3JhcHBlcnMgZm9yIHRoZSBhY3Rpdml0eSBvZiB0aGlzCi0JICogZGlhZ3JhbQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlDb2xsZWN0aW9uIGdldEFsbEJyZWFrZG93bkVsZW1lbnRzKCkgewotCQlBcnJheUxpc3QgYnJlYWtkb3duRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllczsKLQkJaWYoZmlsdGVyIGluc3RhbmNlb2YgSUFkYXB0ZXJGYWN0b3J5RmlsdGVyKSB7Ci0JCQlJQWRhcHRlckZhY3RvcnlGaWx0ZXIgYWRhcHRlckZhY3RvcnlGaWx0ZXIgPSAoSUFkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXI7Ci0JCQlhZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQlhZGFwdGVyRmFjdG9yeUZpbHRlci5nZXRXQlNBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQlhZGFwdGVyRmFjdG9yeUZpbHRlci5nZXRUQlNBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQlhZGFwdGVyRmFjdG9yeUZpbHRlci5nZXRXUEJTQWRhcHRlckZhY3RvcnkoKSAKLQkJCX07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGFwdGVyRmFjdG9yaWVzID0gREVGQVVMVF9BREFQVEVSX0ZBQ1RPUklFUzsKLQkJfQotCQlpZiAod3JhcHBlciAhPSBudWxsKSB7Ci0JCQlMaXN0IHdyYXBwZXJzID0gUHJvY2Vzc1V0aWwuZ2V0V3JhcHBlcnMod3JhcHBlciwgYWRhcHRlckZhY3Rvcmllcyk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cmFwcGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3ID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVyCi0JCQkJCQkubmV4dCgpOwotCQkJCWV4dHJhY3RDaGlsZHJlbih3LCB3LCBicmVha2Rvd25FbGVtZW50cyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcmllc1tpXTsKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJCS5hZGFwdChnZXRPYmplY3QoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlleHRyYWN0Q2hpbGRyZW4oYWRhcHRlciwgZ2V0T2JqZWN0KCksIGJyZWFrZG93bkVsZW1lbnRzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnJlYWtkb3duRWxlbWVudHM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI3BvcHVsYXRlTm9kZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTm9kZXMoKSB7Ci0JCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0JCWlmIChhY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCS8vIHRvIHBvcHVsYXRlIHRoZSB0eXBlZG5vZGUuCi0JCQlzdXBlci5wb3B1bGF0ZU5vZGVzKCk7Ci0JCX0KLQotCQlpZihmaWx0ZXIgPT0gbnVsbCl7Ci0JCQlmaWx0ZXIgPSAoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpREVGQVVMVF9BREFQVEVSX0ZBQ1RPUklFU1swXSkuZ2V0RmlsdGVyKCk7CQotCQl9Ci0JCQotCQkvL05vZGUgbmV3Tm9kZSA9IG51bGw7Ci0JCUFycmF5TGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29sbGVjdGlvbiBicmVha2Rvd25FbGVtZW50cyA9IGdldEFsbEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCUNvbGxlY3Rpb24gcm9sZURlc2NyaXB0b3JzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA9IGRlc2NyaXB0b3IKLQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJCQlpZiAocm9sZURlc2NyaXB0b3IgIT0gbnVsbCAmJiBmaWx0ZXIuYWNjZXB0KHJvbGVEZXNjcmlwdG9yKQotCQkJCQkJLy9UT0RPOiBuZWVkIHRvIGNoZWNrIGlmIHRoZSByb2xlIGRlc2NyaXB0b3IgaXMgaW5oZXJpdGVkIGFuZCBsb2NhbGx5IHN1cHByZXNzZWQKLQkJCQkJCS8vIGlmIGxvY2FsbHkgc3VwcHJlc3NlZCwgY2hlY2sgdGhlIHdyYXBwZXIgb2YgdGhlIHJvbGUgZGVzY3JpcHRvcgotCQkJCQkJLy8KLQkJCQkJCSYmICFyb2xlRGVzY3JpcHRvci5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkgCi0JCQkJCQkmJiAhcm9sZURlc2NyaXB0b3JzLmNvbnRhaW5zKHJvbGVEZXNjcmlwdG9yKSkgewotCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKHJvbGVEZXNjcmlwdG9yKTsKLS8vCQkJCQluZXdOb2RlID0gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUocm9sZURlc2NyaXB0b3IpOwotLy8JCQkJCWlmKG5ld05vZGUgIT0gbnVsbCkgewotLy8JCQkJCQlpZihQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChvYmplY3QpKSB7Ci0vLwkJCQkJCQkvLyB0YXNrIGRlc2NyaXB0b3IgaXMgaW5oZXJpdGVkLCBpdHMgcHJpbWFyeSBwZXJmb3JtZXIgaXMgbm90IGxvY2FsCi0vLwkJCQkJCQkvLyBzZXQgcm9sZSBub2RlIG9mIHRoZSBSb2xlVGFza0NvbXBvc2l0ZSB0byByZWFkLW9ubHkJCQkJCQkKLS8vCQkJCQkJCS8vCi0vLwkJCQkJCQlOb2RlIHJvbGVOb2RlID0gKE5vZGUpICgoTm9kZUNvbnRhaW5lciluZXdOb2RlKS5nZXROb2RlcygpLmdldCgwKTsKLS8vCQkJCQkJCXJvbGVOb2RlLnNldFJlYWRPbmx5KHRydWUpOwotLy8JCQkJCQl9Ci0vLwkJCQkJCW5vZGVzLmFkZChuZXdOb2RlKTsKLS8vCQkJCQl9Ci0JCQkJCWNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlUm93cyhyb2xlRGVzY3JpcHRvciwgb2JqZWN0LCBub2Rlcyk7Ci0JCQkJfQotCQkJCWlmKHJvbGVEZXNjcmlwdG9ycy5jb250YWlucyhyb2xlRGVzY3JpcHRvcikpewotCQkJCQljcmVhdGVUYXNrSW5wdXRPdXRwdXROb2RlcyhkZXNjcmlwdG9yLCBub2Rlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXNlbGVjdE5vZGVzKG5vZGVzKTsKLQl9CQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlUm93cyhSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciwgCi0gICAgCQlPYmplY3Qgb2JqZWN0LCBMaXN0IG5vZGVzKSB7Ci0gICAgCQotICAgIAlpbnQgdGFza3NQZXJSb3cgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFRhc2tzUGVyUm93KCk7Ci0gICAgCUxpc3QgcHJpbWFyeVRhc2tEZXNjcmlwdG9ycyA9IC8vQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzY3JpcHRvcik7Ci0gICAgCQlnZXRSZWFsaXplZFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2NyaXB0b3IpOwotICAgIAlpbnQgdG90YWxUYXNrcyA9IHByaW1hcnlUYXNrRGVzY3JpcHRvcnMuc2l6ZSgpOwotICAgIAkKLSAgICAJaWYodGFza3NQZXJSb3cgPiAwICYmIHRvdGFsVGFza3MgPiAwICAmJiB0b3RhbFRhc2tzID4gdGFza3NQZXJSb3cKLSAgICAJCQkmJiBpc0F1dG9MYXlvdXQoKSl7Ci0gICAgCQlmb3IoaW50IGkgPTA7IGkgPD0gdG90YWxUYXNrcy90YXNrc1BlclJvdzsgaSsrKXsKLSAgICAJCQlOb2RlIG5ld05vZGUgPSBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZShyb2xlRGVzY3JpcHRvciwgaSk7Ci0gICAgCQkJaWYobmV3Tm9kZSAhPSBudWxsKSB7Ci0gICAgCQkJCWlmKFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKG9iamVjdCkpIHsKLSAgICAJCQkJCS8vIHRhc2sgZGVzY3JpcHRvciBpcyBpbmhlcml0ZWQsIGl0cyBwcmltYXJ5IHBlcmZvcm1lciBpcyBub3QgbG9jYWwKLSAgICAJCQkJCS8vIHNldCByb2xlIG5vZGUgb2YgdGhlIFJvbGVUYXNrQ29tcG9zaXRlIHRvIHJlYWQtb25seQkJCQkJCQotICAgIAkJCQkJLy8KLSAgICAJCQkJCUxpc3Qgbm9kcyA9ICgoTm9kZUNvbnRhaW5lciluZXdOb2RlKS5nZXROb2RlcygpOwotICAgIAkJCQkJaWYoIW5vZHMuaXNFbXB0eSgpKXsKLSAgICAJCQkJCQlOb2RlIHJvbGVOb2RlID0gKE5vZGUpIG5vZHMuZ2V0KDApOwotICAgIAkJCQkJCXJvbGVOb2RlLnNldFJlYWRPbmx5KHRydWUpOwotICAgIAkJCQkJfQotICAgIAkJCQl9Ci0gICAgCQkJCW5vZGVzLmFkZChuZXdOb2RlKTsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX1lbHNlewotICAgIAkJTm9kZSBuZXdOb2RlID0gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUocm9sZURlc2NyaXB0b3IpOwotCQkJaWYobmV3Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYoUHJvY2Vzc1V0aWwuaXNJbmhlcml0ZWQob2JqZWN0KSkgewotCQkJCQkvLyB0YXNrIGRlc2NyaXB0b3IgaXMgaW5oZXJpdGVkLCBpdHMgcHJpbWFyeSBwZXJmb3JtZXIgaXMgbm90IGxvY2FsCi0JCQkJCS8vIHNldCByb2xlIG5vZGUgb2YgdGhlIFJvbGVUYXNrQ29tcG9zaXRlIHRvIHJlYWQtb25seQkJCQkJCQotCQkJCQkvLwotCQkJCQlMaXN0IG5vZHMgPSAoKE5vZGVDb250YWluZXIpbmV3Tm9kZSkuZ2V0Tm9kZXMoKTsKLQkJCQkJaWYoIW5vZHMuaXNFbXB0eSgpKXsKLQkJCQkJCU5vZGUgcm9sZU5vZGUgPSAoTm9kZSkgbm9kcy5nZXQoMCk7Ci0JCQkJCQlyb2xlTm9kZS5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlub2Rlcy5hZGQobmV3Tm9kZSk7Ci0JCQl9Ci0gICAgCX0KLSAgICAJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tEZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCU5vZGUgY3JlYXRlTm9kZShUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvcikgewotCQlOb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tOb2RlKCk7Ci0JCW5vZGUuc2V0VU1BQ29udGFpbmVyKGdldEdyYXBoTm9kZSgpKTsKLQkJbm9kZS5zZXREaWFncmFtKHRoaXMpOwotCQlub2RlLnNldE9iamVjdCh0YXNrRGVzY3JpcHRvcik7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCU5vZGUgY3JlYXRlTm9kZShXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlOb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKTsKLQkJbm9kZS5zZXRVTUFDb250YWluZXIoZ2V0R3JhcGhOb2RlKCkpOwotCQlub2RlLnNldERpYWdyYW0odGhpcyk7Ci0JCW5vZGUuc2V0T2JqZWN0KGRlc2NyaXB0b3IpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjcG9wdWxhdGVMaW5rcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcygpIHsKLQkJcG9wdWxhdGVMaW5rcyhnZXROb2RlcygpLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3Tm9kZXMKLQkgKiBAcGFyYW0gZGlzYWJsZU5vdGlmaWNhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUxpbmtzKENvbGxlY3Rpb24gbmV3Tm9kZXMsIGJvb2xlYW4gZGlzYWJsZU5vdGlmaWNhdGlvbikgewotCQkvLyBmaWxsIG91dGdvaW5nL2luY29taW5nIGNvbm5lY3Rpb24gbGlzdHMgb2YgYWxsIG5vZGVzCi0JCS8vCi0JCWludCBzaXplID0gZ2V0Tm9kZXMoKS5zaXplKCk7Ci0JCWJvb2xlYW5bXSBub3RpZmllcyA9IG5ldyBib29sZWFuW3NpemVdOwotCQl0cnkgewotCQkJaWYgKGRpc2FibGVOb3RpZmljYXRpb24pCi0JCQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gZm9yIGFsbCBub2RlcyBpbiB0aGlzIGRpYWdyYW0gdG8gYXZvaWQKLQkJCQkvLyB1bndhbnRlZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvZiB0aGVpciBjb25uZWN0aW9uIGxpc3QKLQkJCQkvLwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCU5vZGUgbm9kZSA9ICgoTm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaSkpOwotCQkJCQlub3RpZmllc1tpXSA9IG5vZGUuZURlbGl2ZXIoKTsKLQkJCQkJbm9kZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdOb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlOb2RlIGNoaWxkID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQkJCS8vIFdvcmtQcm9kdWN0Q29tcG9zaXRlIHdvcmtwcm9kdWN0Q29tcG9zaXRlID0KLQkJCQkJLy8gKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSBjaGlsZC5nZXRPYmplY3QoKTsKLQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgd29ya3Byb2R1Y3RDb21wb3NpdGUgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGUpIGNoaWxkOwotCQkJCQlpZiAod29ya3Byb2R1Y3RDb21wb3NpdGUuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCQkJT2JqZWN0IG9iamVjdCA9IHdvcmtwcm9kdWN0Q29tcG9zaXRlLmdldE9iamVjdCgpOwotCQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLAotCQkJCQkJCQkJb2JqZWN0KTsKLQkJCQkJCQlpZihHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRMaW5rKGNoaWxkLCBvYmplY3QpID09IG51bGwpIHsKLQkJCQkJCQkJTGluayBsaW5rID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5rKCk7Ci0JCQkJCQkJCWxpbmsuc2V0U291cmNlKGNoaWxkKTsKLQkJCQkJCQkJbGluay5zZXRUYXJnZXQobm9kZSk7Ci0JCQkJCQkJCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuYWRkR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAod29ya3Byb2R1Y3RDb21wb3NpdGUuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCQkJCU9iamVjdCBvYmplY3QgPSB3b3JrcHJvZHVjdENvbXBvc2l0ZS5nZXRPYmplY3QoKTsKLQkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLQkJCQkJCQkJCW9iamVjdCk7Ci0JCQkJCQkJaWYoR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTGluayhub2RlLCBvYmplY3QpID09IG51bGwpIHsKLQkJCQkJCQkJTGluayBsaW5rID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5rKCk7Ci0JCQkJCQkJCWxpbmsuc2V0U291cmNlKG5vZGUpOwotCQkJCQkJCQlsaW5rLnNldFRhcmdldChjaGlsZCk7Ci0JCQkJCQkJCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuYWRkR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLSAJCX0gZmluYWxseSB7Ci0JCQlpZiAoZGlzYWJsZU5vdGlmaWNhdGlvbikKLQkJCQkvLyByZXN0b3JlIG5vdGlmaWNhdGlvbiBmbGFnCi0JCQkJLy8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkoKEVPYmplY3QpIGdldE5vZGVzKCkuZ2V0KGkpKS5lU2V0RGVsaXZlcihub3RpZmllc1tpXSk7Ci0JCQkJfQotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBSb2xlVGFza0NvbXBvc2l0ZSBkb0NyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yKSB7Ci0JCVJvbGVUYXNrQ29tcG9zaXRlIHJvbGVUYXNrQ29tcG9zaXRlID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGUpIHsKLQkJCQlSb2xlVGFza0NvbXBvc2l0ZSBydGMgPSAoUm9sZVRhc2tDb21wb3NpdGUpIGVsZW1lbnQ7Ci0JCQkJaWYocnRjLmdldExpbmtlZEVsZW1lbnQoKSA9PSByb2xlRGVzY3JpcHRvcikgewotCQkJCQlyb2xlVGFza0NvbXBvc2l0ZSA9IHJ0YzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHJvbGVUYXNrQ29tcG9zaXRlID09IG51bGwpIHsKLQkJCXJvbGVUYXNrQ29tcG9zaXRlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoKTsKLQkJCXJvbGVUYXNrQ29tcG9zaXRlLnNldFVNQUNvbnRhaW5lcihnZXRHcmFwaE5vZGUoKSk7Ci0JCQlyb2xlVGFza0NvbXBvc2l0ZS5zZXREaWFncmFtKHRoaXMpOwotCQl9Ci0JCXJldHVybiByb2xlVGFza0NvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGUgY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoCi0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvcikgewotCQlSb2xlVGFza0NvbXBvc2l0ZSByb2xlVGFza0NvbXBvc2l0ZSA9IGRvQ3JlYXRlUm9sZVRhc2tDb21wb3NpdGUocm9sZURlc2NyaXB0b3IpOwotCQlyb2xlVGFza0NvbXBvc2l0ZS5zZXRPYmplY3Qocm9sZURlc2NyaXB0b3IpOwotCQlyZXR1cm4gcm9sZVRhc2tDb21wb3NpdGU7Ci0JfQotCQotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZSBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yLCBpbnQgcm93SW5kZXgpIHsKLQkJUm9sZVRhc2tDb21wb3NpdGUgcm9sZVRhc2tDb21wb3NpdGUgPSBkb0NyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVEZXNjcmlwdG9yKTsKLQkJKChSb2xlVGFza0NvbXBvc2l0ZUltcGwpcm9sZVRhc2tDb21wb3NpdGUpLnNldFJvd0luZGV4KHJvd0luZGV4KTsKLQkJcm9sZVRhc2tDb21wb3NpdGUuc2V0T2JqZWN0KHJvbGVEZXNjcmlwdG9yKTsKLQkJcmV0dXJuIHJvbGVUYXNrQ29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZSgKLQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yLCBpbnQgdHlwZSkgewotCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3b3JrcHJvZHVjdENvbXBvc2l0ZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgd3BjID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSBlbGVtZW50OwotCQkJCWlmKHdwYy5nZXRMaW5rZWRFbGVtZW50KCkgPT0gdGFza0Rlc2NyaXB0b3IgJiYgd3BjLmdldFR5cGUoKSA9PSB0eXBlKSB7CQkJCQkKLQkJCQkJd29ya3Byb2R1Y3RDb21wb3NpdGUgPSB3cGM7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZih3b3JrcHJvZHVjdENvbXBvc2l0ZSA9PSBudWxsKSB7Ci0JCQl3b3JrcHJvZHVjdENvbXBvc2l0ZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCS5jcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZSgpOwotCQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0VHlwZSh0eXBlKTsKLQkJfQotCQl3b3JrcHJvZHVjdENvbXBvc2l0ZS5zZXRVTUFDb250YWluZXIoZ2V0R3JhcGhOb2RlKCkpOwotCQl3b3JrcHJvZHVjdENvbXBvc2l0ZS5zZXREaWFncmFtKHRoaXMpOwotCQl3b3JrcHJvZHVjdENvbXBvc2l0ZS5zZXRPYmplY3QodGFza0Rlc2NyaXB0b3IpOwotCQlyZXR1cm4gd29ya3Byb2R1Y3RDb21wb3NpdGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI2dldFR5cGUoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI2dldERpYWdyYW1DaGFuZ2VMaXN0ZW5lclR5cGUoKQotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXJUeXBlKCkgewotCQlyZXR1cm4gSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50VHlwZSgpCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldEJyZWFrZG93bkVsZW1lbnRUeXBlKCkgewotCQlyZXR1cm4gRGVzY3JpcHRvci5jbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjdG9Ob2RlKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSB0b05vZGUoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCUxpc3QgbGlzdCA9IC8vQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycygoUm9sZURlc2NyaXB0b3IpIGUpOwotCQkJCWdldFJlYWxpemVkUHJpbWFyeVRhc2tEZXNjcmlwdG9ycygoUm9sZURlc2NyaXB0b3IpZSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJY3JlYXRlVGFza0lucHV0T3V0cHV0Tm9kZXMoKFRhc2tEZXNjcmlwdG9yKSBvYmosIGdldE5vZGVzKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgoUm9sZURlc2NyaXB0b3IpIGUpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJY3JlYXRlVGFza0lucHV0T3V0cHV0Tm9kZXMoKFRhc2tEZXNjcmlwdG9yKSBlLCBnZXROb2RlcygpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjYWRkTm9kZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBOb2RlIGFkZE5vZGUoT2JqZWN0IG9iaikgewotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWZpbHRlciA9ICgoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgREVGQVVMVF9BREFQVEVSX0ZBQ1RPUklFU1swXSkKLQkJCQkJLmdldEZpbHRlcigpOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcgotCQkJCSYmICFmaWx0ZXIuYWNjZXB0KCgoVGFza0Rlc2NyaXB0b3IpIG9iaikKLQkJCQkJCS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKSkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlIG5vZGUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKChUYXNrRGVzY3JpcHRvcikgb2JqKQotCQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJCW5vZGUgPSBmaW5kTm9kZSh0aGlzLCByb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJbm9kZSA9IGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlnZXROb2RlcygpLmFkZChub2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbm9kZSA9IHN1cGVyLmFkZE5vZGUoZ2V0Tm9kZXMoKSwgb2JqKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW5vZGUgPSBzdXBlci5hZGROb2RlKGdldE5vZGVzKCksIG9iaik7Ci0JCX0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJcG9wdWxhdGVMaW5rcyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5vZGUpLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI2FkZE5vZGVzKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGFkZE5vZGVzKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlDb2xsZWN0aW9uIG5vZGVzID0gc3VwZXIuYWRkTm9kZXMoY29sbGVjdGlvbik7Ci0JCWlmICghbm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQlwb3B1bGF0ZUxpbmtzKG5vZGVzLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNyZW1vdmVGcm9tVW1hTW9kZWwob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVW1hTW9kZWwoTm9kZSByZW1vdmVkTm9kZSkgewotCQkvLyBpZiB0aGUgcmVtb3ZlZCBub2RlIGlzIGEgVGFza05vZGUgdGhhdCBoYWQgYmVlbiBtb3ZlZCB0byBhCi0JCS8vIFJvbGVUYXNrQ29tcG9zaXRlCi0JCS8vIHRoZW4gaXRzIFRhc2tEZXNjcmlwdG9yIHdpbGwgbm90IGJlIHJlbW92ZWQgZnJvbSBtb2RlbAotCQkvLwotCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLCByZW1vdmVkTm9kZS5nZXRPYmplY3QoKSkgIT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChyZW1vdmVkTm9kZSBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlCi0JCQkJfHwgcmVtb3ZlZE5vZGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSkKLQkJCXJldHVybjsKLQotCQlzdXBlci5yZW1vdmVGcm9tVW1hTW9kZWwocmVtb3ZlZE5vZGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvVW1hTW9kZWwoaW50IHBvc2l0aW9uLCBOb2RlIGFkZGVkTm9kZSkgewotCQlzdXBlci5hZGRUb1VtYU1vZGVsKHBvc2l0aW9uLCBhZGRlZE5vZGUpOwotCi0JCWlmIChhZGRlZE5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQkJLy8gdHJhbnNsYXRlIE5vZGUgaW5kZXggdG8gQWN0aXZpdHkgaW5kZXgKLQkJCWludCBpID0gdG9BY3Rpdml0eUluZGV4KHBvc2l0aW9uKTsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIkFjdGl2aXR5RGV0YWlsRGlhZ3JhbS5hZGRUb1VtYU1vZGVsKCk6IFdvcmtCcmVha2Rvd25FbGVtZW50IGluZGV4OiAiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpID09IC0xKSB7Ci0JCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGFkZGVkTm9kZS5nZXRPYmplY3QoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChpLCBhZGRlZE5vZGUuZ2V0T2JqZWN0KCkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGludCB0b0FjdGl2aXR5SW5kZXgoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA9PSAtMSkKLQkJCXJldHVybiBpbmRleDsKLQkJaW50IHNpemUgPSBnZXROb2RlcygpLnNpemUoKTsKLQkJaW50IGkgPSBpbmRleCArIDE7Ci0JCWlmIChpID09IHNpemUpCi0JCQlyZXR1cm4gLTE7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBnZXROb2RlcygpLmdldChpKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlmb3IgKDsgIShub2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgJiYgaSA8IHNpemU7IGkrKykgewotCQkJbm9kZSA9IChOb2RlKSBnZXROb2RlcygpLmdldChpKTsKLQkJfQotCQlpZiAoaSA9PSBzaXplKQotCQkJcmV0dXJuIC0xOwotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQlyZXR1cm4gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihub2RlLmdldE9iamVjdCgpKTsKLQotCX0KLQotCXB1YmxpYyBOb2RlIGZpbmROb2RlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgPT0gZWxlbWVudC5nZXRPYmplY3QoKSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyRmFjdG9yeVtdIERFRkFVTFRfQURBUFRFUl9GQUNUT1JJRVMgPSB7CQkJCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgCi0JfTsgCi0JCi0JcHVibGljIHZvaWQgY3JlYXRlVGFza0lucHV0T3V0cHV0Tm9kZXMoVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvciwgQ29sbGVjdGlvbiBub2RlcykgewotCQlOb2RlIG5ld05vZGUgPSBudWxsOwotCQlpZiAoIWRlc2NyaXB0b3IuZ2V0TWFuZGF0b3J5SW5wdXQoKS5pc0VtcHR5KCkpIHsKLQkJCW5ld05vZGUgPSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZShkZXNjcmlwdG9yLAotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpOwotCQkJbm9kZXMuYWRkKG5ld05vZGUpOwotCQl9Ci0JCWlmICghZGVzY3JpcHRvci5nZXRPdXRwdXQoKS5pc0VtcHR5KCkpIHsKLQkJCW5ld05vZGUgPSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZShkZXNjcmlwdG9yLAotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKTsKLQkJCW5vZGVzLmFkZChuZXdOb2RlKTsKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI3NldE5ldyhib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5ldyhib29sZWFuIG4pIHsKLQkJc3VwZXIuc2V0TmV3KG4pOwotCQlpZihuKXsKLQkJCWRvU2V0QXV0b0xheW91dCh0cnVlKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI21vdmVOb2RlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgbW92ZU5vZGUoT2JqZWN0IG9sZFZhbHVlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0UmVhbGl6ZWRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKFJvbGVEZXNjcmlwdG9yIHIpewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmKHIgIT0gbnVsbCl7Ci0JCQlMaXN0IGFjdHVhbExpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHIpOwotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gZ2V0QWxsQnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGFjdHVhbExpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyl7Ci0JCQkJT2JqZWN0IGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYoVG5nVXRpbC5jb250YWlucyhjb2xsZWN0aW9uLCBlKSl7Ci0JCQkJCWxpc3QuYWRkKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi19IC8vIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvQWN0aXZpdHlEaWFncmFtSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9BY3Rpdml0eURpYWdyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhiMjAzOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9BY3Rpdml0eURpYWdyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eSBEaWFncmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtSW1wbCBleHRlbmRzIERpYWdyYW1JbXBsIGltcGxlbWVudHMgQWN0aXZpdHlEaWFncmFtIHsKLQlwcml2YXRlIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgQWN0aXZpdHlBZGFwdGVyCi0JCQlpbXBsZW1lbnRzIElBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lciB7Ci0KLQl9OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5RGlhZ3JhbUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJZGlhZ3JhbUNoYW5nZUxpc3RlbmVyID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENsYXNzIGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lclR5cGUoKSB7Ci0JCXJldHVybiBJQWN0aXZpdHlEaWFncmFtQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RJQUdSQU07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVOb2RlcygpIHsKLQkJLy8gQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGRpYWdyYW0gPSBnZXRVTUFEaWFncmFtKCk7Ci0KLQkJLy8gYWRkIFR5cGVkTm9kZXMKLQkJLy8KLQkJTGlzdCB0eXBlZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWludCB0eXBlID0gZ2V0VHlwZShlbGVtZW50KTsKLQkJCWlmICh0eXBlID4gMCkgewotCQkJCVR5cGVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlZE5vZGUoKTsKLQkJCQlub2RlLnNldFR5cGUodHlwZSk7Ci0JCQkJbm9kZS5zZXRPYmplY3QoZWxlbWVudCk7Ci0JCQkJdHlwZWROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJZ2V0Tm9kZXMoKS5hZGRBbGwodHlwZWROb2Rlcyk7Ci0KLQkJLy8gYWRkIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZXMKLQkJLy8KLQkJYWRkRWxlbWVudE5vZGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkV29ya09yZGVyKFdvcmtPcmRlciB3bywgT2JqZWN0IHByZWQpIHsKLQkJaWYgKHdvLmdldFByZWQoKSA9PSBwcmVkKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmIChwcmVkIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgcHJlZDsKLQkJCS8vIGNoZWNrIGlmIHByZWRlY2Vzc29yIHJlZmVyZW5jZSBpbiB0aGUgZ2l2ZW4gd29yayBvcmRlciBpcyBiYXNlIG9mCi0JCQkvLyBwcmVkCi0JCQkvLwotCQkJZm9yIChWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOyB2ZSAhPSBudWxsOyB2ZSA9IHZlCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQlpZiAodmUgPT0gd28uZ2V0UHJlZCgpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZChMaW5rIGxpbmspIHsKLQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgPT0gbnVsbCB8fCBsaW5rLmdldFRhcmdldCgpID09IG51bGwKLQkJCQl8fCAhZ2V0Tm9kZXMoKS5jb250YWlucyhsaW5rLmdldFNvdXJjZSgpKQotCQkJCXx8ICFnZXROb2RlcygpLmNvbnRhaW5zKGxpbmsuZ2V0VGFyZ2V0KCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcygpIHsKLQkJc3VwZXIucG9wdWxhdGVMaW5rcygpOwotCi0JCS8vIHJlbW92ZSB0aGUgaW52YWxpZCBsaW5rcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKChOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSBudWxsOwotCQkJaWYgKG5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZS5nZXRPYmplY3QoKTsKLQkJCX0KLQkJCUFycmF5TGlzdCBsaW5rc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbGlua0xpc3RXYWxrOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZQotCQkJCQkuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICghaXNWYWxpZChsaW5rKSkgewotCQkJCQlsaW5rc1RvUmVtb3ZlLmFkZChsaW5rKTsKLQkJCQl9Ci0KLQkJCQlpZiAod2JlICE9IG51bGwpIHsKLQkJCQkJLy8gVE9ETzogbmVlZCByZXZpc2l0IHRvIGNoZWNrIHRoZSB2YWxpZCBjb25uZWN0aW9uIGZyb20gYQotCQkJCQkvLyBUeXBlZE5vZGUKLQkJCQkJLy8KLQkJCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUpCi0JCQkJCQljb250aW51ZSBsaW5rTGlzdFdhbGs7Ci0KLQkJCQkJT2JqZWN0IHByZWQgPSBsaW5rLmdldFNvdXJjZSgpLmdldE9iamVjdCgpOwotCQkJCQlib29sZWFuIHdvcmtPcmRlckZvdW5kID0gZmFsc2U7Ci0JCQkJCWZpbmRfV29ya09yZGVyOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9IHdiZQotCQkJCQkJCS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlXb3JrT3JkZXIgd28gPSAoV29ya09yZGVyKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQkJaWYgKGlzVmFsaWRXb3JrT3JkZXIod28sIHByZWQpKSB7Ci0JCQkJCQkJd29ya09yZGVyRm91bmQgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZpbmRfV29ya09yZGVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghd29ya09yZGVyRm91bmQpIHsKLQkJCQkJCS8vIGludmFsaWQgbGluaywgcmVtb3ZlIGl0Ci0JCQkJCQkvLwotCQkJCQkJbGlua3NUb1JlbW92ZS5hZGQobGluayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaW5rc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUxpbmsobGluayk7Ci0JCQl9Ci0JCQlsaW5rc1RvUmVtb3ZlLmNsZWFyKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKCFpc1ZhbGlkKGxpbmspKSB7Ci0JCQkJCWxpbmtzVG9SZW1vdmUuYWRkKGxpbmspOwotCQkJCX0KLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpbmtzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlTGluayhsaW5rKTsKLQkJCX0KLQkJCWxpbmtzVG9SZW1vdmUuY2xlYXIoKTsKLQkJCWxpbmtzVG9SZW1vdmUgPSBudWxsOwotCQl9Ci0KLQkJLy8gQ2hlY2sgdGhlIGxpbmtzIG9mIGVhY2ggQWN0aXZpdHlOb2RlCi0JCS8vIHNldCB0aGUgV29ya09yZGVyIHRvIHRoZSBsaW5rIGlmIG5lZWRlZAotCQkvLyBhZGQgbmV3IGxpbmsgZm9yIHRob3NlIFdvcmtPcmRlcnMgdGhhdCBzdGlsbCBkb24ndCBoYXZlIHRoZQotCQkvLyBjb3JyZXNwb25kaW5nIGxpbmsKLQkJLy8KLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9ICgoTm9kZSkgaXRlci5uZXh0KCkpOwotCQkJaWYgKG5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCQkJLy8gR2V0IHRoZSByYXcgZGF0YSBvZiB3b3Jrb3JkZXJzIGZvciBvYmplY3QuCi0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgbG9jYWwgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJbGlzdC5hZGRBbGwobG9jYWwuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKSk7Ci0JCQkJCi0JCQkJLy8gR2V0IHRoZSBQcmVkZWNlc3NvciBMaXN0IG9uIHRvcCBvZiByYXcgZGF0YSwgdGhpcyBpcyBuZWVkIGZvciBpbiBjYXNlIG9mIGV4dGVuZC4KLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IG51bGw7Ci0JCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJCS5hZGFwdChsb2NhbCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKXsKLQkJCQkJbGlzdC5hZGRBbGwoKChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcikuZ2V0UHJlZGVjZXNzb3JzKCkpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBJdGVyYXRlIHdvcmsgb3JkZXJzIGFuZCBjcmVhdGUgbGlua3MuCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gbnVsbDsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBwcmVkID0gbnVsbDsKLQkJCQkJaWYobmV4dCBpbnN0YW5jZW9mIFdvcmtPcmRlcil7Ci0JCQkJCQl3b3JrT3JkZXIgPSAoV29ya09yZGVyKW5leHQ7Ci0JCQkJCQlwcmVkID0gd29ya09yZGVyLmdldFByZWQoKTsKLQkJCQkJfQotCQkJCQlpZihuZXh0IGluc3RhbmNlb2YgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCQkJcHJlZCA9IChCcmVha2Rvd25FbGVtZW50KSgoV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIpbmV4dCkuZ2V0VGFyZ2V0KCk7IAotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAocHJlZCAhPSBudWxsICYmIHByZWQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJTm9kZSBwcmVkTm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLQkJCQkJCQkJcHJlZCwgdHJ1ZSk7Ci0JCQkJCQlpZiAocHJlZE5vZGUgIT0gbnVsbCkgewotCQkJCQkJCS8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgbGluayBmb3IgdGhpcyB3b3JrIG9yZGVyCi0JCQkJCQkJLy8gYWxyZWFkeQotCQkJCQkJCS8vCi0JCQkJCQkJYm9vbGVhbiBsaW5rRm91bmQgPSBmYWxzZTsKLQkJCQkJCQlmaW5kX2xpbms6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gbm9kZQotCQkJCQkJCQkJLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQkJCQlpZiAobGluay5nZXRTb3VyY2UoKSA9PSBwcmVkTm9kZSkgewotCQkJCQkJCQkJLy8gbGluayBhbHJlYWR5IGV4aXN0cwotCQkJCQkJCQkJLy8gY2hlY2sgaWYgd29yayBvcmRlciBpcyBzZXQgdG8gdGhpcyBsaW5rCi0JCQkJCQkJCQkvLwotCQkJCQkJCQkJbGlua0ZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgbGluawotCQkJCQkJCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJCQlpZiAoZWRnZS5nZXRTZW1hbnRpY01vZGVsKCkgPT0gbnVsbCkgewotCQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuc2V0U2VtYW50aWNNb2RlbCgKLQkJCQkJCQkJCQkJCWxpbmssIHdvcmtPcmRlcik7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlicmVhayBmaW5kX2xpbms7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFsaW5rRm91bmQpIHsKLQkJCQkJCQkJLy8gY2hlY2sgaWYgdGhpcyBXb3JrT3JkZXIgY2FuIGJlIHJlcHJlc2VudGVkCi0JCQkJCQkJCS8vIHZpYSBsaW5rcyBvZiBUeXBlZE5vZGVzCi0JCQkJCQkJCS8vCi0JCQkJCQkJCWlmICghY2FuUmVhY2hBc0ZpcnN0QWN0aXZpdHlOb2RlKHByZWROb2RlLCBub2RlKSkgewotCQkJCQkJCQkJLy8gYWRkIG5ldyBsaW5rIGZvciB0aGlzIHdvcmsgb3JkZXIKLQkJCQkJCQkJCS8vCi0JCQkJCQkJCQlOYW1lZE5vZGVJbXBsIG5vZGVJbXBsID0gKChOYW1lZE5vZGVJbXBsKSBub2RlKTsKLQkJCQkJCQkJCU5hbWVkTm9kZUltcGwgcHJlZE5vZGVJbXBsID0gKE5hbWVkTm9kZUltcGwpIHByZWROb2RlOwotCQkJCQkJCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCQkJCQkJYm9vbGVhbiBwcmVkTm9kZU5vdGlmeSA9IHByZWROb2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCQkJCQkJcHJlZE5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCQkJCQlub2RlSW1wbC5hZGRJbmNvbWluZ0Nvbm5lY3Rpb24ocHJlZCk7IAotCQkJCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5OwotCQkJCQkJCQkJCXByZWROb2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gcHJlZE5vZGVOb3RpZnk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2xlYW5EdXBsaWNhdGVMaW5rcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhbkR1cGxpY2F0ZUxpbmtzKCkgewotCQlMaXN0IGR1cGxpY2F0ZUxpbmtzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG5vZGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCU5vZGUgd2JOb2RlID0gKE5vZGUpIG5vZGU7Ci0JCQkJaWYod2JOb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKSAhPSBudWxsKXsKLQkJCQkJZmluZER1cGxpY2F0ZUxpbmtzKGR1cGxpY2F0ZUxpbmtzLCB3Yk5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpKTsKLQkJCQl9Ci0JCQkJaWYod2JOb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKSAhPW51bGwpewotCQkJCQlmaW5kRHVwbGljYXRlTGlua3MoZHVwbGljYXRlTGlua3MsIHdiTm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkdXBsaWNhdGVMaW5rcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVMaW5rKGxpbmspOwotCQl9Ci0JCWR1cGxpY2F0ZUxpbmtzLmNsZWFyKCk7Ci0JCWR1cGxpY2F0ZUxpbmtzID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmluZER1cGxpY2F0ZUxpbmtzKExpc3QgZHVwbGljYXRlTGlua3MsIExpc3QgbGlua3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rcy5zaXplKCk7IGkrKykgewotCQkJTGluayBsaW5rID0gKExpbmspIGxpbmtzLmdldChpKTsKLQkJCWlmKCFkdXBsaWNhdGVMaW5rcy5jb250YWlucyhsaW5rKSl7Ci0JCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbGlua3Muc2l6ZSgpOyBqKyspIHsKLQkJCQkJTGluayBsaW5rMSA9IChMaW5rKSBsaW5rcy5nZXQoaik7Ci0JCQkJCWlmIChsaW5rMS5nZXRTb3VyY2UoKSA9PSBsaW5rLmdldFNvdXJjZSgpCi0JCQkJCQkJJiYgbGluazEuZ2V0VGFyZ2V0KCkgPT0gbGluay5nZXRUYXJnZXQoKSkgewotCQkJCQkJZHVwbGljYXRlTGlua3MuYWRkKGxpbmsxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBOb2RlIHNyYyBjYW4gcmVhY2ggTm9kZSB0YXJnZXQgYXMgdGhlIGZpcnN0IEFjdGl2aXR5Tm9kZSBpbiB0aGUKLQkgKiBkaWFncmFtCi0JICogCi0JICogQHBhcmFtIHNyYwotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYW5SZWFjaEFzRmlyc3RBY3Rpdml0eU5vZGUoTm9kZSBzcmMsIE5vZGUgdGFyZ2V0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNyYy5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSA9PSB0YXJnZXQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChsaW5rLmdldFRhcmdldCgpIGluc3RhbmNlb2YgVHlwZWROb2RlCi0JCQkJCSYmIGNhblJlYWNoQXNGaXJzdEFjdGl2aXR5Tm9kZShsaW5rLmdldFRhcmdldCgpLCB0YXJnZXQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIHByaXZhdGUgTGlzdCB0b05vZGVzKExpc3QgYWN0aXZpdGllcykgewotCS8vIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0aWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIGxpc3QuYWRkKHRvTm9kZSgoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCkpKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGxpc3Q7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI25ld05vZGUoKQotCSAqLwotCXByb3RlY3RlZCBOb2RlIG5ld05vZGUoKSB7Ci0JCXJldHVybiBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKCkgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCi0JCQkvL1R1cm4gb2ZmIHRoZSBWYXJpYWJpbGl0eUluZm8gZm9yIHRoZSBhY3Rpdml0eSBkaWFncmFtLgotCQkJT2JqZWN0IG9iaiA9IG51bGw7Ci0JCQlib29sZWFuIGVuYWJsZVZhcmlhYmlsaXR5SW5mbyA9IGZhbHNlOwotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJb2JqID0gKChBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpYWRhcHRlcikuZ2V0RGVsZWdhdGluZ0l0ZW1Qcm92aWRlcigpOwotCQkJfQotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCW9iaiA9IGFkYXB0ZXI7Ci0JCQl9Ci0JCQkKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCWVuYWJsZVZhcmlhYmlsaXR5SW5mbyA9ICgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilvYmopLmlzRW5hYmxlVmFyaWFiaWxpdHlJbmZvKCk7Ci0JCQkJKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKW9iaikuc2V0RW5hYmxlVmFyaWFiaWxpdHlJbmZvKGZhbHNlKTsKLQkJCX0KLQkJCS8vIGVuZCBvZiB2YXJpYWJpbGl0eSBpbmZvIAotCQkJCi0JCQkKLQkJCS8vIHJldHVybiBhZGFwdGVyLmdldENoaWxkcmVuKGdldE9iamVjdCgpKTsKLQkJCS8vIGNvbW1lbnRlZCBhYm92ZSBsaW5lLCBGb3IgZGlhZ3JhbXMgLSByb2xsdXAgc2hvdWxkIGJlIGZhbHNlLCBmb3IKLQkJCS8vIGhhbmRsaW5nIHJvbGx1cCBzdGF0ZSBiZWxvdyBjb2RlLgotCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWV4dHJhY3RDaGlsZHJlbihhZGFwdGVyLCBnZXRPYmplY3QoKSwgY2hpbGRyZW4pOwotCQkJCi0JCQkvLyByZXNldCB2YXJpYWJpbGl0eWluZm8gc3RhdHVzIGJhY2sKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCSgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilvYmopLnNldEVuYWJsZVZhcmlhYmlsaXR5SW5mbyhlbmFibGVWYXJpYWJpbGl0eUluZm8pOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFbGVtZW50Tm9kZXMoKSB7Ci0KLQkJQXJyYXlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBjaGlsZCA9IFRuZ1V0aWwudW53cmFwKGUpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlOYW1lZE5vZGVJbXBsIG5vZGUgPSAoTmFtZWROb2RlSW1wbCkgdG9Ob2RlKChNZXRob2RFbGVtZW50KSBjaGlsZCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZSk7Ci0JCQkJCWlmICh3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCQkJbm9kZS5pdGVtUHJvdmlkZXIgPSB3cmFwcGVyOwotCQkJCQkJLy8gVE9ETzogY2hlY2sgaWYgcmVhZE9ubHkgYXR0cmlidXRlIGlzIHN0aWxsIG5lZWRlZAotCQkJCQkJLy8gYWZ0ZXIgaW50cm9kdWN0aW9uIG9mIGl0ZW1Qcm92aWRlcgotCQkJCQkJLy8KLQkJCQkJCW5vZGUucmVhZE9ubHkgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCi0JCWdldE5vZGVzKCkuYWRkQWxsKG5vZGVzKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VHlwZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBHcmFwaE5vZGUpIHsKLQkJCUdyYXBoTm9kZSBub2RlID0gKEdyYXBoTm9kZSkgb2JqOwotCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IG5vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJaWYgKG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgdHlwZSA9ICgoU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpIG1vZGVsQnJpZGdlKQotCQkJCQkJLmdldFR5cGVJbmZvKCk7Ci0JCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9TWU5DSF9CQVIuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuU1lOQ0hfQkFSOwotCQkJCX0gZWxzZSBpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0RFQ0lTSU9OLmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLkRFQ0lTSU9OOwotCQkJCX0gZWxzZSBpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0VORC5lcXVhbHModHlwZSkpIHsKLQkJCQkJcmV0dXJuIFR5cGVkTm9kZS5FTkQ7Ci0JCQkJfSBlbHNlIGlmIChHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfU1RBUlQuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuU1RBUlQ7Ci0JCQkJfSBlbHNlIGlmIChHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfRlJFRV9URVhUCi0JCQkJCQkuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuRlJFRV9URVhUOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ESUFHUkFNOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEJyZWFrZG93bkVsZW1lbnRUeXBlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgaW50IHRvQWN0aXZpdHlJbmRleChpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuIGluZGV4OwotCQlpbnQgc2l6ZSA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCQlpbnQgaSA9IGluZGV4ICsgMTsKLQkJaWYgKGkgPT0gc2l6ZSkKLQkJCXJldHVybiAtMTsKLQkJTm9kZSBub2RlID0gKE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCi0JCWZvciAoOyAhKG5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSAmJiBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlub2RlID0gKE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpOwotCQl9Ci0JCWlmIChpID09IHNpemUpCi0JCQlyZXR1cm4gLTE7Ci0JCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0JCXJldHVybiBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pbmRleE9mKG5vZGUuZ2V0T2JqZWN0KCkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI2FkZFRvVW1hTW9kZWwoaW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1VtYU1vZGVsKGludCBwb3NpdGlvbiwgTm9kZSBhZGRlZE5vZGUpIHsKLQkJaWYgKGFkZGVkTm9kZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0KLQkJCS8vIHRyYW5zbGF0ZSBBY3Rpdml0eU5vZGUgaW5kZXggdG8gQWN0aXZpdHkgaW5kZXgKLQkJCS8vCi0JCQlpbnQgaSA9IHRvQWN0aXZpdHlJbmRleChwb3NpdGlvbik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpYWdyYW1JbXBsLmFkZFRvVW1hTW9kZWwoKToKLQkJCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50IGluZGV4OiAiICsgaSk7Ci0JCQlpZiAoaSA9PSAtMSkgewotCQkJCWFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChhZGRlZE5vZGUuZ2V0T2JqZWN0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoaSwgYWRkZWROb2RlLmdldE9iamVjdCgpKTsKLQkJCX0KLQkJfQotCi0JCXN1cGVyLmFkZFRvVW1hTW9kZWwocG9zaXRpb24sIGFkZGVkTm9kZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI2FkZE5vZGUoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBOb2RlIGFkZE5vZGUoQ29sbGVjdGlvbiBub2RlcywgT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCS8vIGZpbmQgZXhpc3Rpbmcgbm9kZSBmb3IgYmFzZSBhbmQgbGluayBpdCB0byB0aGUgYWN0aXZpdHkKLQkJCQkvLwotCQkJCU5vZGVJbXBsIGJhc2VOb2RlID0gKE5vZGVJbXBsKSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKAotCQkJCQkJdGhpcywgYmFzZSk7Ci0JCQkJaWYgKGJhc2VOb2RlICE9IG51bGwpIHsKLQkJCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IGJhc2VOb2RlLmdldEdyYXBoTm9kZSgpOwotCQkJCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBncmFwaE5vZGUKLQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQlpZiAoYnJpZGdlLmdldEVsZW1lbnQoKSAhPSBhY3QpIHsKLQkJCQkJCWJyaWRnZS5zZXRFbGVtZW50KGFjdCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQliYXNlTm9kZSA9IChOb2RlSW1wbCkgR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLAotCQkJCQkJCWFjdCk7Ci0JCQkJfQotCQkJCWlmIChiYXNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJCS8vIGRpc2Fzc29jaWF0ZSB3aXRoIHRoZSBiYXNlCi0JCQkJCS8vCi0JCQkJCWlmIChiYXNlTm9kZS5tZXRob2RFbGVtZW50QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQliYXNlLmVBZGFwdGVycygpLnJlbW92ZShiYXNlTm9kZS5tZXRob2RFbGVtZW50QWRhcHRlcik7Ci0JCQkJCX0KLQotCQkJCQliYXNlTm9kZS5iYXNpY1NldE9iamVjdChhY3QpOwotCQkJCQliYXNlTm9kZS5zZXRSZWFkT25seShmYWxzZSk7Ci0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5hZGROb2RlKG5vZGVzLCBvYmopOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNyZW1vdmVOb2RlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlTm9kZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvYmo7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciB0aGUgb2xkIGFjdGl2aXR5IGFuZCByZWxpbmsgaXQgdG8gaXRzCi0JCQkJLy8gYmFzZQotCQkJCS8vCi0JCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLAotCQkJCQkJYWN0KTsKLQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBub2RlLmdldEdyYXBoTm9kZSgpOwotCQkJCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBncmFwaE5vZGUKLQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQlpZiAoYnJpZGdlLmdldEVsZW1lbnQoKSAhPSBiYXNlKSB7Ci0JCQkJCQlicmlkZ2Uuc2V0RWxlbWVudChiYXNlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCW5vZGUgPSAoTm9kZUltcGwpIEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywgYmFzZSk7Ci0JCQkJfQotCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJLy8gZGlzYXNzb2NpYXRlIHdpdGggdGhlIG9sZCBhY3Rpdml0eQotCQkJCQkvLwotCQkJCQlpZiAobm9kZS5tZXRob2RFbGVtZW50QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlhY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKG5vZGUubWV0aG9kRWxlbWVudEFkYXB0ZXIpOwotCQkJCQl9Ci0KLQkJCQkJbm9kZS5iYXNpY1NldE9iamVjdChiYXNlKTsKLQkJCQkJbm9kZS5zZXRSZWFkT25seSh0cnVlKTsKLQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5yZW1vdmVOb2RlKG9iaik7Ci0JfQotCS8qKgotCSAqIE1vdmVkIGNvZGUgZnJvbSBnZXRDaGlsZHJlbi4gZ2V0QWRhcHRlcigpIHdpbGwgcmV0dXJuIEFkYXB0ZXIsCi0JICogd2hpY2ggd2lsbCBhbGxvdyB1cyB0byBmaW5kIGl0ZW1wcm92aWRlciBmb3IgdGhlIGNoaWxkcmVuLiAKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgZ2V0QWRhcHRlcigpewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IG51bGw7Ci0JCWlmICh3cmFwcGVyICE9IG51bGwpIHsKLQkJCWFkYXB0ZXIgPSB3cmFwcGVyOwotCQl9IGVsc2UgewotCQkJCi0JCQlhZGFwdGVyID0oSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKWdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoCi0JCQkJCWdldE9iamVjdCgpLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCl7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUFkYXB0ZXJGYWN0b3J5RmlsdGVyKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSAoKElBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCQkuZ2V0V0JTQWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotfSAvLyBBY3Rpdml0eURpYWdyYW1JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0RpYWdyYW1JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0RpYWdyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhODUxZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9EaWFncmFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5EaWFncmFtUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklEaWFncmFtQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUltcGwgZXh0ZW5kcyBOb2RlQ29udGFpbmVySW1wbCBpbXBsZW1lbnRzIERpYWdyYW0gewotCi0JcHJpdmF0ZSBib29sZWFuIG5ld0RpYWdyYW07Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNOwotCX0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCS8vIFN0YXJ0IGN1c3RvbSBjb2RlIC8vCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0KLQlwcm90ZWN0ZWQgY2xhc3MgQWN0aXZpdHlBZGFwdGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25hbE5vZGVMaW5rIGltcGxlbWVudHMKLQkJCUlEaWFncmFtQ2hhbmdlTGlzdGVuZXIgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciNnZXREaWFncmFtKCkKLQkJICovCi0JCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUltcGwudGhpczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBhZGROb2RlKG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gYmFzZUFjdCkgewotCQkJCQkJbm9kZS5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCXJlbW92ZU5vZGUobXNnLmdldE9sZFZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJQ29sbGVjdGlvbiBub2RlcyA9IGFkZE5vZGVzKChDb2xsZWN0aW9uKSBtc2cKLQkJCQkJCQkuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSA9PSBiYXNlQWN0KSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJbm9kZSA9IChOb2RlSW1wbCkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJbm9kZS5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJcmVtb3ZlTm9kZXMoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCQkJbW92ZU5vZGUobXNnLmdldE5ld1ZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGRpYWdyYW1DaGFuZ2VMaXN0ZW5lcjsKLQotCXByaXZhdGUgQWN0aXZpdHkgYmFzZUFjdDsKLQotCXByaXZhdGUgT2JqZWN0IGRpYWdyYW1BZGFwdGVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJCQlyZXR1cm47Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCS8vQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoRGlhZ3JhbS5jbGFzcykpIHsKLQkJCQljYXNlIE1vZGVsUGFja2FnZS5ESUFHUkFNX19OT0RFUzoKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIubm90aWZ5Q2hhbmdlZCgpOiBpbmRleD0iICsKLQkJCQkJLy8gbXNnLmdldFBvc2l0aW9uKCkpOwotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb247Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJCW5vZGVBZGRlZChtc2cuZ2V0UG9zaXRpb24oKSwgKE5vZGUpIG1zZwotCQkJCQkJCQkuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCW5vZGVSZW1vdmVkKChOb2RlKSBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlub2RlQWRkZWQobXNnLmdldFBvc2l0aW9uKCksIG5vZGUpOwotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW5vZGVSZW1vdmVkKChOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIE5vZGUgYWRkTm9kZShPYmplY3Qgb2JqKSB7Ci0JCU5vZGUgbm9kZSA9IGFkZE5vZGUoZ2V0Tm9kZXMoKSwgb2JqKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBub2RlOwotCQlwb3B1bGF0ZUxpbmtzKG5vZGUsIHRydWUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBhZGROb2RlKENvbGxlY3Rpb24gbm9kZXMsIE9iamVjdCBvYmopIHsKLQkJaWYgKFRuZ1V0aWwuaXNJbnN0YW5jZU9mKGdldEJyZWFrZG93bkVsZW1lbnRUeXBlcygpLCBvYmopKSB7Ci0JCQlOb2RlIG5vZGUgPSB0b05vZGUoKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGFkZE5vZGVzKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJYWRkTm9kZShub2RlcywgaXRlci5uZXh0KCkpOwotCQl9Ci0KLQkJLy8gdXNlIGFkZEFsbCgpIHRvIGF2b2lkIHVubmVjZXNzYXJ5IG5vdGlmaWNhdGlvbnMKLQkJLy8KLQkJZ2V0Tm9kZXMoKS5hZGRBbGwobm9kZXMpOwotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iagotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZU5vZGUoT2JqZWN0IG9iaikgewotCQlpZiAoIVRuZ1V0aWwuaXNJbnN0YW5jZU9mKGdldEJyZWFrZG93bkVsZW1lbnRUeXBlcygpLCBvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywgb2JqKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJfQotCQlub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQlub2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCi0JCWdldE5vZGVzKCkucmVtb3ZlKG5vZGUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb2RlcyhDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXJlbW92ZU5vZGUoaXRlci5uZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtI2dldFVNQURpYWdyYW0oKQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZ2V0VU1BRGlhZ3JhbSgpIHsKLQkJcmV0dXJuIChvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0pIGdldEdyYXBoTm9kZSgpOwotCX0KLQotCXByb3RlY3RlZCBDbGFzcyBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXJUeXBlKCkgewotCQlyZXR1cm4gSURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRCcmVha2Rvd25FbGVtZW50VHlwZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEJyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vZGVBZGRlZChpbnQgaW5kZXgsIE5vZGUgbm9kZSkgewotCQlhZGRUb1VtYU1vZGVsKGluZGV4LCBub2RlKTsKLQkJbm9kZS5hZGRDb25zdW1lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpIHsKLQkJcmVtb3ZlRnJvbVVtYU1vZGVsKG5vZGUpOwotCQlub2RlLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTmV3KCkgewotCQlyZXR1cm4gdGhpcy5uZXdEaWFncmFtOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5ldyhib29sZWFuIG4pIHsKLQkJdGhpcy5uZXdEaWFncmFtID0gbjsKLQl9Ci0KLQkvKioKLQkgKiBOT1RFOiB0aGlzIG1ldGhvZCBpcyByZS1lbnRyYW50LCBtYWtlIHN1cmUgdG8gaGFuZGxlIHRoZSBkYXRhIGNvcnJlY3RseSB0byBhdm9pZCBtZW1vcnkgbGVhayBhbmQgZGF0YSBjb3JydXB0aW9uCi0JICogCi0JICogQHBhcmFtIG5ld09iamVjdAotCSAqICAgICAgICAgICAgbXVzdCBiZSBhbiBBY3Rpdml0eQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCWlmIChuZXdPYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG5ld09iamVjdCkKLQkJCQkJCS5pc1JlYWRPbmx5KCkpIHsKLQkJCXdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG5ld09iamVjdDsKLQkJCXNldFJlYWRPbmx5KHRydWUpOwotCQl9Ci0JCW5ld09iamVjdCA9IFRuZ1V0aWwudW53cmFwKG5ld09iamVjdCk7Ci0KLQkJT2JqZWN0IG9sZE9iamVjdCA9IG9iamVjdDsKLQkJb2JqZWN0ID0gbmV3T2JqZWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fT0JKRUNULCBvbGRPYmplY3QsIG9iamVjdCkpOwotCi0JCS8vIGFkZCBkaWFncmFtIGNoYW5nZSBsaXN0ZW5lciB0byB0aGUgbGlua2VkIG9iamVjdC4gUmVtb3ZlIHRoZSBvbGQKLQkJLy8gbGlzdGVuZXIgaWYgdGhlcmUgaXMgYW55LgotCQkvLyBCdXQgZmlyc3Qga2VlcCB0aGUgb2xkIGxpc3RlbmVyIHRvIGhlbHAgZmluZCB0aGUgVU1BIGRpYWdyYW0gb2YgdGhlCi0JCS8vIGFjdGl2aXR5IHF1aWNrbHkuCi0JCS8vCi0JCUFjdGl2aXR5IGUgPSAoQWN0aXZpdHkpIG5ld09iamVjdDsJCQotCQlpZihQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhlKSkgewotCQkJYmFzZUFjdCA9IChBY3Rpdml0eSkgZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCX0KLQkJYmFzZUFjdCA9IG51bGw7Ci0JCQotCQlpZihuZXdPYmplY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gc2V0IHRoZSBVTUEgZGlhZ3JhbSBmb3IgdGhpcyBkaWFncmFtCi0JCS8vCi0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCWdyYXBoTm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbShlLAotCQkJCQlnZXRUeXBlKCksIGZhbHNlKTsKLQkJCS8vIHNldCB0aGUgZmxhZyB0byBpbmRpY2F0ZSB0aGlzIGlzIGEgbmV3IGRpYWdyYW0gb3Igbm90Ci0JCQlpZiAoZ3JhcGhOb2RlID09IG51bGwpIHsKLQkJCQlncmFwaE5vZGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0oZSwKLQkJCQkJCWdldFR5cGUoKSwgdHJ1ZSk7Ci0JCQkJc2V0TmV3KHRydWUpOwotCQkJfQotCQl9Ci0KLQkJaWYoIWUuZUFkYXB0ZXJzKCkuY29udGFpbnMoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyKSkgewotCQkJZS5lQWRhcHRlcnMoKS5hZGQoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCQlpZiAoYmFzZUFjdCAhPSBudWxsKSB7Ci0JCQliYXNlQWN0LmVBZGFwdGVycygpLmFkZChkaWFncmFtQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0KLQkJcG9wdWxhdGVEaWFncmFtKCk7Ci0KLQkJaWYoIWVBZGFwdGVycygpLmNvbnRhaW5zKGRpYWdyYW1BZGFwdGVyKSkgewotCQkJdGhpcy5lQWRhcHRlcnMoKS5hZGQoZGlhZ3JhbUFkYXB0ZXIpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIGRpYWdyYW0gd2l0aCB0aGUgZGF0YSBmcm9tIHRoZSBVTUEgbW9kZWwuIFN1YmNsYXNzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlRGlhZ3JhbSgpIHsKLQkJcG9wdWxhdGVOb2RlcygpOwotCQlwb3B1bGF0ZUxpbmtzKCk7Ci0KLQkJLy8gYWRkIHRoaXMgZGlhZ3JhbSB0byB0aGUgY29uc3VtZXIgbGlzdCBvZiBhbGwgbm9kZXMgc28gdGhleSB3aWxsIG5vdAotCQkvLyBiZSBkaXNwb3NlZAotCQkvLyBiZWZvcmUgdGhpcyBkaWFncmFtLgotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgaXRlci5uZXh0KCk7Ci0JCQlub2RlLmFkZENvbnN1bWVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUG9wdWxhdGVzIHRoZSBpbmNvbWluZy9vdXRnb2luZyBsaW5rcyBvZiB0aGUgZ2l2ZW4gbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcyhOb2RlIG5vZGUsIGJvb2xlYW4gZGlzYWJsZU5vdGlmaWNhdGlvbikgewotCQlpbnQgc2l6ZSA9IDA7Ci0JCWJvb2xlYW5bXSBub3RpZmllcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoZGlzYWJsZU5vdGlmaWNhdGlvbikgewotCQkJCXNpemUgPSBnZXROb2RlcygpLnNpemUoKTsKLQkJCQlub3RpZmllcyA9IG5ldyBib29sZWFuW3NpemVdOwotCQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIGZvciBhbGwgbm9kZXMgaW4gdGhpcyBkaWFncmFtIHRvIGF2b2lkCi0JCQkJLy8gdW53YW50ZWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgdGhlaXIgY29ubmVjdGlvbiBsaXN0Ci0JCQkJLy8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlOb2RlIGNoaWxkID0gKChOb2RlKSBnZXROb2RlcygpLmdldChpKSk7Ci0JCQkJCW5vdGlmaWVzW2ldID0gY2hpbGQuZURlbGl2ZXIoKTsKLQkJCQkJY2hpbGQuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQotCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IG5vZGUuZ2V0R3JhcGhOb2RlKCk7Ci0JCQlpZiAoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmZpbGxDb25uZWN0aW9ucyhub2RlLCBncmFwaE5vZGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGRpc2FibGVOb3RpZmljYXRpb24pIHsKLQkJCQkvLyByZXN0b3JlIG5vdGlmaWNhdGlvbiBmbGFnCi0JCQkJLy8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkoKEVPYmplY3QpIGdldE5vZGVzKCkuZ2V0KGkpKS5lU2V0RGVsaXZlcihub3RpZmllc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVOb2RlcygpIHsJCQotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZGlhZ3JhbSA9IGdldFVNQURpYWdyYW0oKTsKLQkJaWYoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlMaXN0IHR5cGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaW50IHR5cGUgPSBnZXRUeXBlKGVsZW1lbnQpOwotCQkJCWlmICh0eXBlID4gMCkgewotCQkJCQlUeXBlZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZWROb2RlKCk7Ci0JCQkJCW5vZGUuc2V0VHlwZSh0eXBlKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoZWxlbWVudCk7Ci0JCQkJCXR5cGVkTm9kZXMuYWRkKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWdldE5vZGVzKCkuYWRkQWxsKHR5cGVkTm9kZXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFR5cGUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgR3JhcGhOb2RlKSB7Ci0JCQlHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpIG9iajsKLQkJCVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSBub2RlLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCWlmIChtb2RlbEJyaWRnZSBpbnN0YW5jZW9mIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSAoKFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KSBtb2RlbEJyaWRnZSkKLQkJCQkJCS5nZXRUeXBlSW5mbygpOwotCQkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfU1lOQ0hfQkFSLmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLlNZTkNIX0JBUjsKLQkJCQl9IGVsc2UgaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9ERUNJU0lPTi5lcXVhbHModHlwZSkpIHsKLQkJCQkJcmV0dXJuIFR5cGVkTm9kZS5ERUNJU0lPTjsKLQkJCQl9IGVsc2UgaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9FTkQuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuRU5EOwotCQkJCX0gZWxzZSBpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX1NUQVJULmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLlNUQVJUOwotCQkJCX0gZWxzZSBpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0ZSRUVfVEVYVAotCQkJCQkJLmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLkZSRUVfVEVYVDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlua3MoKSB7Ci0JCS8vIGZpbGwgb3V0Z29pbmcvaW5jb21pbmcgY29ubmVjdGlvbiBsaXN0cyBvZiBhbGwgbm9kZXMKLQkJLy8KLQkJaW50IHNpemUgPSBnZXROb2RlcygpLnNpemUoKTsKLQkJYm9vbGVhbltdIG5vdGlmaWVzID0gbmV3IGJvb2xlYW5bc2l6ZV07Ci0JCXRyeSB7Ci0JCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBmb3IgYWxsIG5vZGVzIGluIHRoaXMgZGlhZ3JhbSB0byBhdm9pZAotCQkJLy8gdW53YW50ZWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgdGhlaXIgY29ubmVjdGlvbiBsaXN0Ci0JCQkvLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlOb2RlIG5vZGUgPSAoKE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpKTsKLQkJCQlub3RpZmllc1tpXSA9IG5vZGUuZURlbGl2ZXIoKTsKLQkJCQlub2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCXBvcHVsYXRlTGlua3Mobm9kZSwgZmFsc2UpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSBub3RpZmljYXRpb24gZmxhZwotCQkJLy8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJKChFT2JqZWN0KSBnZXROb2RlcygpLmdldChpKSkuZVNldERlbGl2ZXIobm90aWZpZXNbaV0pOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBkYXRhIGZvciB0aGUgcmVtb3ZlZCBub2RlIGZyb20gdGhlIFVNQSBtb2RlbCBTdWJjbGFzcyBzaG91bGQKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVtb3ZlZE5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVW1hTW9kZWwoTm9kZSByZW1vdmVkTm9kZSkgewotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQlpZiAocmVtb3ZlZE5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmUocmVtb3ZlZE5vZGUuZ2V0T2JqZWN0KCkpOwotCQl9Ci0JCQotCQlpZihnZXRVTUFEaWFncmFtKCkgIT0gbnVsbCkgewotCQkJZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpLnJlbW92ZShyZW1vdmVkTm9kZS5nZXRHcmFwaE5vZGUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBkYXRhIGZvciB0aGUgbmV3bHkgYWRkZWQgbm9kZSB0byB0aGUgVU1BIG1vZGVsIFN1YmNsYXNzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRvVW1hTW9kZWwoaW50IHBvc2l0aW9uLCBOb2RlIGFkZGVkTm9kZSkgewotCi0JCWlmIChhZGRlZE5vZGUuZ2V0R3JhcGhOb2RlKCkgPT0gbnVsbCkgewotCQkJLy8gdGhpcyBub2RlIGlzIHJlYWRkZWQgYWZ0ZXIgdW5kbwotCQkJLy8KLQkJCSgoTm9kZUltcGwpIGFkZGVkTm9kZSkuYmFzaWNTZXRPYmplY3QoYWRkZWROb2RlLmdldE9iamVjdCgpKTsKLQkJfQotCQkKLQkJaWYoZ2V0VU1BRGlhZ3JhbSgpICE9IG51bGwpIHsKLQkJCWdldFVNQURpYWdyYW0oKS5nZXRDb250YWluZWQoKS5hZGQoYWRkZWROb2RlLmdldEdyYXBoTm9kZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgbmV3IG5vZGUgZm9yIHRoaXMgZGlhZ3JhbSBmb3IgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgdG9Ob2RlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlOb2RlIG5vZGUgPSBuZXdOb2RlKCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJbm9kZS5zZXRVTUFEaWFncmFtKGdldFVNQURpYWdyYW0oKSk7Ci0JCW5vZGUuc2V0RGlhZ3JhbSh0aGlzKTsKLQkJbm9kZS5zZXRPYmplY3QoZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIG5ld05vZGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXJUeXBlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2Rpc3Bvc2UoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRpc3Bvc2UgYWxsIG5vZGVzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgaXRlci5uZXh0KCk7Ci0JCQlub2RlLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmIChkaWFncmFtQ2hhbmdlTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJQWN0aXZpdHkgZSA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0JCQlpZiAoYmFzZUFjdCAhPSBudWxsKSB7Ci0JCQkJYmFzZUFjdC5lQWRhcHRlcnMoKS5yZW1vdmUoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyKTsKLQkJCX0KLQkJCWUuZUFkYXB0ZXJzKCkucmVtb3ZlKGRpYWdyYW1DaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtI3NldERlZmF1bHROYW1lKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShOYW1lZE5vZGUgbmV3Tm9kZSkgewotCQlNZXRob2RFbGVtZW50IG9iaiA9IChNZXRob2RFbGVtZW50KSBuZXdOb2RlLmdldE9iamVjdCgpOwotCQlpbnQgY2xhc3NJRCA9IG9iai5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKTsKLQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJQXJyYXlMaXN0IHNpYmxpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpID09IGNsYXNzSUQpIHsKLQkJCQlzaWJsaW5ncy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGJhc2VOYW1lID0gTWVzc2FnZUZvcm1hdAotCQkJCS5mb3JtYXQoCi0JCQkJCQlEaWFncmFtUmVzb3VyY2VzLmRlZmF1bHRCYXNlTmFtZSwgbmV3IE9iamVjdFtdIHsgVG5nVXRpbC5nZXRUeXBlVGV4dChvYmouZUNsYXNzKCkuZ2V0TmFtZSgpKSB9KTsgCi0JCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoc2libGluZ3MsIG9iaiwgYmFzZU5hbWUpOwotCQluZXdOb2RlLnNldE5hbWUob2JqLmdldE5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGV4dHJhY3RDaGlsZHJlbihJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciwgT2JqZWN0IG9iamVjdCwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQkvLyBkaXNhYmxlIHJvbGx1cCBiZWZvcmUgZ2V0dGluZyB0aGUgY2hpbGRyZW4KLQkJLy8KLQkJYm9vbGVhbiBvbGRSb2xsZWRVcCA9IGZhbHNlOwotCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilhZGFwdGVyOwotCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJaXRlbVByb3ZpZGVyLmJhc2ljU2V0Um9sbGVkVXAoZmFsc2UpOwotCQl9Ci0JCWVsc2UgaWYoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcil7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcilhZGFwdGVyOwotCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJaXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCS8vIGZpbHRlciBvdXQgdGhlIHN1cHByZXNzZWQgZWxlbWVudHMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYoIWdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKGNoaWxkKSkgewotCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gZG9uJ3QgZmlsdGVyIHN1cHByZXNzZWQgZWxlbWVudHMKLQkJCS8vCi0JCQkvL2NoaWxkcmVuLmFkZEFsbChhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSB0aGUgcm9sbGVkLXVwIGZsYWcKLQkJCS8vCi0JCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcikuc2V0Um9sbGVkVXAob2xkUm9sbGVkVXApOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKCkgewotCQlyZXR1cm4gc3VwcHJlc3Npb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3VwcHJlc3Npb24oU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJdGhpcy5zdXBwcmVzc2lvbiA9IHN1cHByZXNzaW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogSW4gUHJvY2VzcyBXQlMsIGlmIGJyZWFrZG93bmVsZW1lbnQgaXMgbW92ZWQKLQkgKiB1cCBvciBkb3duLCBkaWFncmFtIHNob3VsZCBiZSB1cGRhdGVkIGFjY29yZGluZ2x5LiAKLQkgKiBTdWItY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIGRpYWdyYW0gbmVlZHMgdXBkYXRlIG9uIG1vdmUuIAotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmVOb2RlKE9iamVjdCBvbGRWYWx1ZSkgewotCX0KLQkJCi0JcHVibGljIGJvb2xlYW4gaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBncmFwaGljYWxEYXRhUmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R3JhcGhpY2FsRGF0YVJlcXVpcmVkKGJvb2xlYW4gZ3JhcGhpY2FsRGF0YVJlcXVpcmVkKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsRGF0YVJlcXVpcmVkID0gZ3JhcGhpY2FsRGF0YVJlcXVpcmVkOwotCX0KLQkJCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXcmFwcGVyKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQlwcml2YXRlIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXI7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBmaWx0ZXI7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGdyYXBoaWNhbERhdGFSZXF1aXJlZCA9IHRydWU7Ci0KLX0gLy8gRGlhZ3JhbUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTGlua0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTGlua0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FiMTQ1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0xpbmtJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGluazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsI2dldEJlbmRwb2ludHMgPGVtPkJlbmRwb2ludHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua0ltcGwjZ2V0U291cmNlRW5kUG9pbnQgPGVtPlNvdXJjZSBFbmQgUG9pbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua0ltcGwjZ2V0VGFyZ2V0RW5kUG9pbnQgPGVtPlRhcmdldCBFbmQgUG9pbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rSW1wbCBleHRlbmRzIExpbmtlZE9iamVjdEltcGwgaW1wbGVtZW50cyBMaW5rIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXQoKSA8ZW0+VGFyZ2V0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFyZ2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSB0YXJnZXQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmVuZHBvaW50cygpIDxlbT5CZW5kcG9pbnRzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCZW5kcG9pbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYmVuZHBvaW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlRW5kUG9pbnQoKSA8ZW0+U291cmNlIEVuZCBQb2ludDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNvdXJjZUVuZFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBvaW50IFNPVVJDRV9FTkRfUE9JTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlRW5kUG9pbnQoKSA8ZW0+U291cmNlIEVuZCBQb2ludDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNvdXJjZUVuZFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgc291cmNlRW5kUG9pbnQgPSBTT1VSQ0VfRU5EX1BPSU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldEVuZFBvaW50KCkgPGVtPlRhcmdldCBFbmQgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbmRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQb2ludCBUQVJHRVRfRU5EX1BPSU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldEVuZFBvaW50KCkgPGVtPlRhcmdldCBFbmQgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbmRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IHRhcmdldEVuZFBvaW50ID0gVEFSR0VUX0VORF9QT0lOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlua0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkxJTks7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5MSU5LX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb2RlIGdldFNvdXJjZSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRSkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoTm9kZSllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U291cmNlKE5vZGUgbmV3U291cmNlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdTb3VyY2UsIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0UsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlKE5vZGUgbmV3U291cmNlKSB7Ci0JCWlmIChuZXdTb3VyY2UgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRSAmJiBuZXdTb3VyY2UgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdTb3VyY2UpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdTb3VyY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U291cmNlKS5lSW52ZXJzZUFkZCh0aGlzLCBNb2RlbFBhY2thZ2UuTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMsIE5vZGUuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U291cmNlKG5ld1NvdXJjZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFLCBuZXdTb3VyY2UsIG5ld1NvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRUYXJnZXQoKSB7Ci0JCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFRhcmdldCA9IChJbnRlcm5hbEVPYmplY3QpdGFyZ2V0OwotCQkJdGFyZ2V0ID0gKE5vZGUpZVJlc29sdmVQcm94eShvbGRUYXJnZXQpOwotCQkJaWYgKHRhcmdldCAhPSBvbGRUYXJnZXQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VULCBvbGRUYXJnZXQsIHRhcmdldCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb2RlIGJhc2ljR2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUYXJnZXQoTm9kZSBuZXdUYXJnZXQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTm9kZSBvbGRUYXJnZXQgPSB0YXJnZXQ7Ci0JCXRhcmdldCA9IG5ld1RhcmdldDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVCwgb2xkVGFyZ2V0LCBuZXdUYXJnZXQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm9kZSBuZXdUYXJnZXQpIHsKLQkJaWYgKG5ld1RhcmdldCAhPSB0YXJnZXQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHRhcmdldCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YXJnZXQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUywgTm9kZS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3VGFyZ2V0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RhcmdldCkuZUludmVyc2VBZGQodGhpcywgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TLCBOb2RlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFRhcmdldChuZXdUYXJnZXQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVCwgbmV3VGFyZ2V0LCBuZXdUYXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEJlbmRwb2ludHMoKSB7Ci0JCWlmIChiZW5kcG9pbnRzID09IG51bGwpIHsKLQkJCWJlbmRwb2ludHMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoQWJzb2x1dGVCZW5kcG9pbnQuY2xhc3MsIHRoaXMsIE1vZGVsUGFja2FnZS5MSU5LX19CRU5EUE9JTlRTKTsKLQkJfQotCQlyZXR1cm4gYmVuZHBvaW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGdldFNvdXJjZUVuZFBvaW50KCkgewotCQlyZXR1cm4gc291cmNlRW5kUG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUVuZFBvaW50KFBvaW50IG5ld1NvdXJjZUVuZFBvaW50KSB7Ci0JCVBvaW50IG9sZFNvdXJjZUVuZFBvaW50ID0gc291cmNlRW5kUG9pbnQ7Ci0JCXNvdXJjZUVuZFBvaW50ID0gbmV3U291cmNlRW5kUG9pbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0VfRU5EX1BPSU5ULCBvbGRTb3VyY2VFbmRQb2ludCwgc291cmNlRW5kUG9pbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGdldFRhcmdldEVuZFBvaW50KCkgewotCQlyZXR1cm4gdGFyZ2V0RW5kUG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldEVuZFBvaW50KFBvaW50IG5ld1RhcmdldEVuZFBvaW50KSB7Ci0JCVBvaW50IG9sZFRhcmdldEVuZFBvaW50ID0gdGFyZ2V0RW5kUG9pbnQ7Ci0JCXRhcmdldEVuZFBvaW50ID0gbmV3VGFyZ2V0RW5kUG9pbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVRfRU5EX1BPSU5ULCBvbGRUYXJnZXRFbmRQb2ludCwgdGFyZ2V0RW5kUG9pbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0U6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldFNvdXJjZSgoTm9kZSlvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVQ6Ci0JCQkJaWYgKHRhcmdldCAhPSBudWxsKQotCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdGFyZ2V0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMsIE5vZGUuY2xhc3MsIG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldFRhcmdldCgoTm9kZSlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRTb3VyY2UobnVsbCwgbXNncyk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVQ6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VGFyZ2V0KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRToKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TLCBOb2RlLmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFOgotCQkJCXJldHVybiBnZXRTb3VyY2UoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFRhcmdldCgpOwotCQkJCXJldHVybiBiYXNpY0dldFRhcmdldCgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fQkVORFBPSU5UUzoKLQkJCQlyZXR1cm4gZ2V0QmVuZHBvaW50cygpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFX0VORF9QT0lOVDoKLQkJCQlyZXR1cm4gZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVF9FTkRfUE9JTlQ6Ci0JCQkJcmV0dXJuIGdldFRhcmdldEVuZFBvaW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChOb2RlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVQ6Ci0JCQkJc2V0VGFyZ2V0KChOb2RlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19CRU5EUE9JTlRTOgotCQkJCWdldEJlbmRwb2ludHMoKS5jbGVhcigpOwotCQkJCWdldEJlbmRwb2ludHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRV9FTkRfUE9JTlQ6Ci0JCQkJc2V0U291cmNlRW5kUG9pbnQoKFBvaW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVRfRU5EX1BPSU5UOgotCQkJCXNldFRhcmdldEVuZFBvaW50KChQb2ludCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChOb2RlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVDoKLQkJCQlzZXRUYXJnZXQoKE5vZGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fQkVORFBPSU5UUzoKLQkJCQlnZXRCZW5kcG9pbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0VfRU5EX1BPSU5UOgotCQkJCXNldFNvdXJjZUVuZFBvaW50KFNPVVJDRV9FTkRfUE9JTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVF9FTkRfUE9JTlQ6Ci0JCQkJc2V0VGFyZ2V0RW5kUG9pbnQoVEFSR0VUX0VORF9QT0lOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldFNvdXJjZSgpICE9IG51bGw7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVQ6Ci0JCQkJcmV0dXJuIHRhcmdldCAhPSBudWxsOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fQkVORFBPSU5UUzoKLQkJCQlyZXR1cm4gYmVuZHBvaW50cyAhPSBudWxsICYmICFiZW5kcG9pbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRV9FTkRfUE9JTlQ6Ci0JCQkJcmV0dXJuIFNPVVJDRV9FTkRfUE9JTlRfRURFRkFVTFQgPT0gbnVsbCA/IHNvdXJjZUVuZFBvaW50ICE9IG51bGwgOiAhU09VUkNFX0VORF9QT0lOVF9FREVGQVVMVC5lcXVhbHMoc291cmNlRW5kUG9pbnQpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUX0VORF9QT0lOVDoKLQkJCQlyZXR1cm4gVEFSR0VUX0VORF9QT0lOVF9FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0RW5kUG9pbnQgIT0gbnVsbCA6ICFUQVJHRVRfRU5EX1BPSU5UX0VERUZBVUxULmVxdWFscyh0YXJnZXRFbmRQb2ludCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmVuZHBvaW50czogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYmVuZHBvaW50cyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc291cmNlRW5kUG9pbnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNvdXJjZUVuZFBvaW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0YXJnZXRFbmRQb2ludDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFyZ2V0RW5kUG9pbnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCQlzdXBlci5zZXRPYmplY3QobmV3T2JqZWN0KTsKLQotCQlpZiAobmV3T2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBuZXdPYmplY3Q7Ci0KLQkJLy8gY29weSBiZW5kcG9pbnRzIGZyb20gZWRnZQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlZGdlLmdldFdheXBvaW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJZ2V0QmVuZHBvaW50cygpLmFkZCgKLQkJCQkJbmV3IEFic29sdXRlQmVuZHBvaW50KEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkudG9Qb2ludCgob3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCkgaXRlci5uZXh0KCkpKSk7Ci0JCX0KLQotCQkvLyBjb3B5IGVuZCBwb2ludHMgZnJvbSBHcmFwaENvbm5lY3RvcnMKLQkJLy8KLQkJaWYgKGdldFNvdXJjZUdyYXBoQ29ubmVjdG9yKCkuZ2V0UG9zaXRpb24oKSAhPSBudWxsKSB7Ci0JCQlzb3VyY2VFbmRQb2ludCA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJLnRvUG9pbnQoZ2V0U291cmNlR3JhcGhDb25uZWN0b3IoKS5nZXRQb3NpdGlvbigpKTsKLQkJfQotCQlpZiAoZ2V0VGFyZ2V0R3JhcGhDb25uZWN0b3IoKS5nZXRQb3NpdGlvbigpICE9IG51bGwpIHsKLQkJCXRhcmdldEVuZFBvaW50ID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkudG9Qb2ludChnZXRUYXJnZXRHcmFwaENvbm5lY3RvcigpLmdldFBvc2l0aW9uKCkpOwotCQl9Ci0JCQkJCi0JCWVBZGFwdGVycygpLmFkZChuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJCVBvaW50IHA7Ci0JCQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBnZXRPYmplY3QoKTsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTGluay5jbGFzcykpIHsKLQkJCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19CRU5EUE9JTlRTOgotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCQlwID0gKEFic29sdXRlQmVuZHBvaW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWludCBpbmRleCA9IG1zZy5nZXRQb3NpdGlvbigpOwotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCB1bWFQb2ludCA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJLm5ld01vZGVsUG9pbnQocC54LCBwLnkpOwotCQkJCQkJaWYgKGluZGV4ID09IE5vdGlmaWNhdGlvbi5OT19JTkRFWCkgewotCQkJCQkJCWVkZ2UuZ2V0V2F5cG9pbnRzKCkuYWRkKHVtYVBvaW50KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZWRnZS5nZXRXYXlwb2ludHMoKS5hZGQoaW5kZXgsIHVtYVBvaW50KTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJLy8gcCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQkvLyBlZGdlLmdldFdheXBvaW50cygpLnJlbW92ZShHcmFwaGljYWxEYXRhSGVscGVyLm5ld01vZGVsUG9pbnQocC54LAotCQkJCQkJLy8gcC55KSk7Ci0KLQkJCQkJCWluZGV4ID0gbXNnLmdldFBvc2l0aW9uKCk7Ci0JCQkJCQlpZiAoaW5kZXggPT0gTm90aWZpY2F0aW9uLk5PX0lOREVYKSB7Ci0JCQkJCQkJZWRnZS5nZXRXYXlwb2ludHMoKS5yZW1vdmUobXNnLmdldFBvc2l0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllZGdlLmdldFdheXBvaW50cygpLnJlbW92ZShpbmRleCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlBcnJheUxpc3QgdW1hUG9pbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJcCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJdW1hUG9pbnRzLmFkZChHcmFwaGljYWxEYXRhSGVscGVyLm5ld01vZGVsUG9pbnQoCi0JCQkJCQkJCQlwLngsIHAueSkpOwotCQkJCQkJfQotCQkJCQkJaW5kZXggPSBtc2cuZ2V0UG9zaXRpb24oKTsKLQkJCQkJCWlmIChpbmRleCA9PSBOb3RpZmljYXRpb24uTk9fSU5ERVgpIHsKLQkJCQkJCQllZGdlLmdldFdheXBvaW50cygpLmFkZEFsbCh1bWFQb2ludHMpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllZGdlLmdldFdheXBvaW50cygpLmFkZEFsbChpbmRleCwgdW1hUG9pbnRzKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJLy8gY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCS8vIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkvLyAuaGFzTmV4dCgpOykgewotCQkJCQkvLyBwID0gKEFic29sdXRlQmVuZHBvaW50KSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJLy8gZWRnZS5nZXRXYXlwb2ludHMoKS5yZW1vdmUoR3JhcGhpY2FsRGF0YUhlbHBlci5uZXdNb2RlbFBvaW50KHAueCwKLQkJCQkJLy8gcC55KSk7Ci0JCQkJCS8vIH0KLQkJCQkJLy8gcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCQkJCQlwID0gKEFic29sdXRlQmVuZHBvaW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLS8vCQkJCQkJUG9pbnQgb2xkcCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQlpbnQgcG9pbnRJbmRleCA9IG1zZy5nZXRQb3NpdGlvbigpOwotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBuZXdVbWFQb2ludCA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJLm5ld01vZGVsUG9pbnQocC54LCBwLnkpOwotLy8JCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IG9sZFVtYVBvaW50ID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotLy8JCQkJCQkJCS5uZXdNb2RlbFBvaW50KG9sZHAueCwgb2xkcC55KTsKLQkJCQkJCWlmIChwb2ludEluZGV4ID09IE5vdGlmaWNhdGlvbi5OT19JTkRFWCkgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJJbmRleCBmb3IgYmVuZHBvaW50IGlzIC0xLCBDYW5ub3Qgc2V0IHRoZSBiZW5kIHBvaW50IGxvY2F0aW9uLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWVkZ2UuZ2V0V2F5cG9pbnRzKCkucmVtb3ZlKHBvaW50SW5kZXgpOwotCQkJCQkJCWVkZ2UuZ2V0V2F5cG9pbnRzKCkuYWRkKHBvaW50SW5kZXgsIG5ld1VtYVBvaW50KTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFX0VORF9QT0lOVDoKLQkJCQkJcCA9IChQb2ludCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLm5vdGlmeUNoYW5nZWQoKTogbmV3IHNvdXJjZSBlbmQKLQkJCQkJLy8gcG9pbnQ6ICIgKyBwICsgIi4gIiArIGdldFNvdXJjZSgpKTsKLQkJCQkJaWYgKHAgIT0gbnVsbCkgewotCQkJCQkJLy8gdHJhbnNsYXRlIHRvIHJlbGF0aXZlIHBvc2l0aW9uCi0JCQkJCQkvLwotCQkJCQkJLy8gcC50cmFuc2xhdGUoZ2V0U291cmNlKCkuZ2V0TG9jYXRpb24oKS5nZXROZWdhdGVkKCkpOwotCQkJCQkJZ2V0U291cmNlR3JhcGhDb25uZWN0b3IoKS5zZXRQb3NpdGlvbigKLQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5uZXdNb2RlbFBvaW50KHAueCwgcC55KSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVF9FTkRfUE9JTlQ6Ci0JCQkJCXAgPSAoUG9pbnQpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi5ub3RpZnlDaGFuZ2VkKCk6IG5ldyB0YXJnZXQgZW5kCi0JCQkJCS8vIHBvaW50OiAiICsgcCArICIuICIgKyBnZXRUYXJnZXQoKSk7Ci0JCQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQkJCS8vIHRyYW5zbGF0ZSB0byByZWxhdGl2ZSBwb3NpdGlvbgotCQkJCQkJLy8KLQkJCQkJCS8vIHAudHJhbnNsYXRlKExpbmtJbXBsLnRoaXMuZ2V0VGFyZ2V0KCkuZ2V0TG9jYXRpb24oKS5nZXROZWdhdGVkKCkpOwotCQkJCQkJZ2V0VGFyZ2V0R3JhcGhDb25uZWN0b3IoKS5zZXRQb3NpdGlvbigKLQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5uZXdNb2RlbFBvaW50KHAueCwgcC55KSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRToKLQkJCQkJLy8gVE9ETwotCQkJCQlyZXR1cm47Ci0JCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUOgotCQkJCQkvLyBUT0RPCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgR3JhcGhDb25uZWN0b3IgZ2V0U291cmNlR3JhcGhDb25uZWN0b3IoKSB7Ci0JCXJldHVybiAoR3JhcGhDb25uZWN0b3IpICgoR3JhcGhFZGdlKSBnZXRPYmplY3QoKSkuZ2V0QW5jaG9yKCkuZ2V0KDApOwotCX0KLQotCXByaXZhdGUgR3JhcGhDb25uZWN0b3IgZ2V0VGFyZ2V0R3JhcGhDb25uZWN0b3IoKSB7Ci0JCXJldHVybiAoR3JhcGhDb25uZWN0b3IpICgoR3JhcGhFZGdlKSBnZXRPYmplY3QoKSkuZ2V0QW5jaG9yKCkuZ2V0KDEpOwotCX0KLQotfSAvLyBMaW5rSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9MaW5rZWRPYmplY3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0xpbmtlZE9iamVjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDRjYTAxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0xpbmtlZE9iamVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5MaW5rZWQgT2JqZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtlZE9iamVjdEltcGwjZ2V0TGlua2VkRWxlbWVudCA8ZW0+TGlua2VkIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua2VkT2JqZWN0SW1wbCNnZXRPYmplY3QgPGVtPk9iamVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExpbmtlZE9iamVjdEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzCi0JCUxpbmtlZE9iamVjdCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlua2VkRWxlbWVudCgpIDxlbT5MaW5rZWQgRWxlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua2VkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgbGlua2VkRWxlbWVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0KCkgPGVtPk9iamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBPQkpFQ1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0KCkgPGVtPk9iamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IG9iamVjdCA9IE9CSkVDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlua2VkT2JqZWN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTElOS0VEX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRMaW5rZWRFbGVtZW50KCkgewotCQlpZiAobGlua2VkRWxlbWVudCAhPSBudWxsICYmICgoRU9iamVjdClsaW5rZWRFbGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkTGlua2VkRWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpbGlua2VkRWxlbWVudDsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCllUmVzb2x2ZVByb3h5KG9sZExpbmtlZEVsZW1lbnQpOwotCQkJaWYgKGxpbmtlZEVsZW1lbnQgIT0gb2xkTGlua2VkRWxlbWVudCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19MSU5LRURfRUxFTUVOVCwgb2xkTGlua2VkRWxlbWVudCwgbGlua2VkRWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaW5rZWRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGJhc2ljR2V0TGlua2VkRWxlbWVudCgpIHsKLQkJcmV0dXJuIGxpbmtlZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlua2VkRWxlbWVudChNZXRob2RFbGVtZW50IG5ld0xpbmtlZEVsZW1lbnQpIHsKLQkJTWV0aG9kRWxlbWVudCBvbGRMaW5rZWRFbGVtZW50ID0gbGlua2VkRWxlbWVudDsKLQkJbGlua2VkRWxlbWVudCA9IG5ld0xpbmtlZEVsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19MSU5LRURfRUxFTUVOVCwgb2xkTGlua2VkRWxlbWVudCwgbGlua2VkRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCU9iamVjdCBvbGRPYmplY3QgPSBvYmplY3Q7Ci0JCW9iamVjdCA9IG5ld09iamVjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfX09CSkVDVCwgb2xkT2JqZWN0LCBvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19MSU5LRURfRUxFTUVOVDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGdldE9iamVjdCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19MSU5LRURfRUxFTUVOVDoKLQkJCQlzZXRMaW5rZWRFbGVtZW50KChNZXRob2RFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19PQkpFQ1Q6Ci0JCQkJc2V0T2JqZWN0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19MSU5LRURfRUxFTUVOVDoKLQkJCQlzZXRMaW5rZWRFbGVtZW50KChNZXRob2RFbGVtZW50KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfX09CSkVDVDoKLQkJCQlzZXRPYmplY3QoT0JKRUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5UOgotCQkJCXJldHVybiBsaW5rZWRFbGVtZW50ICE9IG51bGw7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19PQkpFQ1Q6Ci0JCQkJcmV0dXJuIE9CSkVDVF9FREVGQVVMVCA9PSBudWxsID8gb2JqZWN0ICE9IG51bGwgOiAhT0JKRUNUX0VERUZBVUxULmVxdWFscyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAob2JqZWN0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvYmplY3QpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gTGlua2VkT2JqZWN0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Nb2RlbEZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL01vZGVsRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWFjZGMxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL01vZGVsRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uIDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBNb2RlbEZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZGVsRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJTW9kZWxGYWN0b3J5IHRoZU1vZGVsRmFjdG9yeSA9IChNb2RlbEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSIpOyAKLQkJCWlmICh0aGVNb2RlbEZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVNb2RlbEZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgTW9kZWxGYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZGVsRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ESUFHUkFNOiByZXR1cm4gY3JlYXRlRGlhZ3JhbSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOSzogcmV0dXJuIGNyZWF0ZUxpbmsoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREU6IHJldHVybiBjcmVhdGVOYW1lZE5vZGUoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RJQUdSQU06IHJldHVybiBjcmVhdGVBY3Rpdml0eURpYWdyYW0oKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREU6IHJldHVybiBjcmVhdGVUeXBlZE5vZGUoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06IHJldHVybiBjcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfTk9ERTogcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0Tm9kZSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06IHJldHVybiBjcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW0oKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfTk9ERTogcmV0dXJuIGNyZWF0ZVJvbGVOb2RlKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX1RBU0tfQ09NUE9TSVRFOiByZXR1cm4gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRBU0tfTk9ERTogcmV0dXJuIGNyZWF0ZVRhc2tOb2RlKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFOiByZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFOiByZXR1cm4gY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFOiByZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUJTT0xVVEVfQkVORFBPSU5UOgotCQkJCXJldHVybiBjcmVhdGVBYnNvbHV0ZUJlbmRwb2ludEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUE9JTlQ6Ci0JCQkJcmV0dXJuIGNyZWF0ZVBvaW50RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVEZXNjcmlwdG9yRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFCU09MVVRFX0JFTkRQT0lOVDoKLQkJCQlyZXR1cm4gY29udmVydEFic29sdXRlQmVuZHBvaW50VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlBPSU5UOgotCQkJCXJldHVybiBjb252ZXJ0UG9pbnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBjb252ZXJ0Um9sZURlc2NyaXB0b3JUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtIGNyZWF0ZURpYWdyYW0oKSB7Ci0JCURpYWdyYW1JbXBsIGRpYWdyYW0gPSBuZXcgRGlhZ3JhbUltcGwoKTsKLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaW5rIGNyZWF0ZUxpbmsoKSB7Ci0JCUxpbmtJbXBsIGxpbmsgPSBuZXcgTGlua0ltcGwoKTsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOYW1lZE5vZGUgY3JlYXRlTmFtZWROb2RlKCkgewotCQlOYW1lZE5vZGVJbXBsIG5hbWVkTm9kZSA9IG5ldyBOYW1lZE5vZGVJbXBsKCk7Ci0JCXJldHVybiBuYW1lZE5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW0gY3JlYXRlQWN0aXZpdHlEaWFncmFtKCkgewotCQlBY3Rpdml0eURpYWdyYW1JbXBsIGFjdGl2aXR5RGlhZ3JhbSA9IG5ldyBBY3Rpdml0eURpYWdyYW1JbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eURpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUeXBlZE5vZGUgY3JlYXRlVHlwZWROb2RlKCkgewotCQlUeXBlZE5vZGVJbXBsIHR5cGVkTm9kZSA9IG5ldyBUeXBlZE5vZGVJbXBsKCk7Ci0JCXJldHVybiB0eXBlZE5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKSB7Ci0JCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gPSBuZXcgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdE5vZGUgY3JlYXRlV29ya1Byb2R1Y3ROb2RlKCkgewotCQlXb3JrUHJvZHVjdE5vZGVJbXBsIHdvcmtQcm9kdWN0Tm9kZSA9IG5ldyBXb3JrUHJvZHVjdE5vZGVJbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW0gY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgewotCQlBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eURldGFpbERpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlTm9kZSBjcmVhdGVSb2xlTm9kZSgpIHsKLQkJUm9sZU5vZGVJbXBsIHJvbGVOb2RlID0gbmV3IFJvbGVOb2RlSW1wbCgpOwotCQlyZXR1cm4gcm9sZU5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZSBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgpIHsKLQkJUm9sZVRhc2tDb21wb3NpdGVJbXBsIHJvbGVUYXNrQ29tcG9zaXRlID0gbmV3IFJvbGVUYXNrQ29tcG9zaXRlSW1wbCgpOwotCQlyZXR1cm4gcm9sZVRhc2tDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrTm9kZSBjcmVhdGVUYXNrTm9kZSgpIHsKLQkJVGFza05vZGVJbXBsIHRhc2tOb2RlID0gbmV3IFRhc2tOb2RlSW1wbCgpOwotCQlyZXR1cm4gdGFza05vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCkgewotCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsIHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSA9IG5ldyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsKCk7Ci0JCXJldHVybiB3b3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZSgpIHsKLQkJV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsIHdvcmtQcm9kdWN0Q29tcG9zaXRlID0gbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3RDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBYnNvbHV0ZUJlbmRwb2ludCBjcmVhdGVBYnNvbHV0ZUJlbmRwb2ludEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEFic29sdXRlQmVuZHBvaW50KXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRBYnNvbHV0ZUJlbmRwb2ludFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBjcmVhdGVQb2ludEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFBvaW50KXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQb2ludFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoUm9sZURlc2NyaXB0b3Ipc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJvbGVEZXNjcmlwdG9yVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZGVsUGFja2FnZSBnZXRNb2RlbFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoTW9kZWxQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2RlbFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vIE1vZGVsRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Nb2RlbFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzZTMwMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Nb2RlbFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIE1vZGVsUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpYWdyYW1FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxpbmtFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxpbmtlZE9iamVjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbmFtZWROb2RlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBub2RlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3Rpdml0eURpYWdyYW1FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHR5cGVkTm9kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3ROb2RlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3Rpdml0eURldGFpbERpYWdyYW1FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG5vZGVDb250YWluZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVOb2RlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlVGFza0NvbXBvc2l0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza05vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3RDb21wb3NpdGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGFic29sdXRlQmVuZHBvaW50RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBwb2ludEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgcm9sZURlc2NyaXB0b3JFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZQotCSAqIHBhY2thZ2UgcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Ci0JICogTm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYyBmYWN0b3J5Ci0JICogbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uIG9mIHRoZQotCSAqIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwgaWYgb25lIGFscmVhZHkgZXhpc3RzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1vZGVsUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZGVsUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoTW9kZWxQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCU1vZGVsUGFja2FnZUltcGwgdGhlTW9kZWxQYWNrYWdlID0gKE1vZGVsUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgTW9kZWxQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IE1vZGVsUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlNb2RlbFBhY2thZ2VJbXBsIHRoZU1vZGVsUGFja2FnZV8xID0gKE1vZGVsUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIE1vZGVsUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RlbFBhY2thZ2UuZU5TX1VSSSkgOiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVNb2RlbFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZU1vZGVsUGFja2FnZV8xLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlTW9kZWxQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlTW9kZWxQYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlTW9kZWxQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVNb2RlbFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGRpYWdyYW1FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TGluaygpIHsKLQkJcmV0dXJuIGxpbmtFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGlua19OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMaW5rX1NvdXJjZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TGlua19UYXJnZXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExpbmtfQmVuZHBvaW50cygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGlua19Tb3VyY2VFbmRQb2ludCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGlua19UYXJnZXRFbmRQb2ludCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMaW5rZWRPYmplY3QoKSB7Ci0JCXJldHVybiBsaW5rZWRPYmplY3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TGlua2VkT2JqZWN0X0xpbmtlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsaW5rZWRPYmplY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMaW5rZWRPYmplY3RfT2JqZWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGlua2VkT2JqZWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TmFtZWROb2RlKCkgewotCQlyZXR1cm4gbmFtZWROb2RlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROYW1lZE5vZGVfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5hbWVkTm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5vZGUoKSB7Ci0JCXJldHVybiBub2RlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROb2RlX0xvY2F0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROb2RlX1dpZHRoKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROb2RlX0hlaWdodCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Tm9kZV9JbmNvbWluZ0Nvbm5lY3Rpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upbm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlub2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE5vZGVfUmVhZE9ubHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlub2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZpdHlEaWFncmFtKCkgewotCQlyZXR1cm4gYWN0aXZpdHlEaWFncmFtRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFR5cGVkTm9kZSgpIHsKLQkJcmV0dXJuIHR5cGVkTm9kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VHlwZWROb2RlX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0eXBlZE5vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdE5vZGUoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdE5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0Tm9kZV9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3ROb2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgewotCQlyZXR1cm4gYWN0aXZpdHlEZXRhaWxEaWFncmFtRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9BdXRvTGF5b3V0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlEZXRhaWxEaWFncmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Tm9kZUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG5vZGVDb250YWluZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE5vZGVDb250YWluZXJfTm9kZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlub2RlQ29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZU5vZGUoKSB7Ci0JCXJldHVybiByb2xlTm9kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlVGFza0NvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIHJvbGVUYXNrQ29tcG9zaXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVUYXNrQ29tcG9zaXRlX1Jvd0luZGV4KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZVRhc2tDb21wb3NpdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYXNrTm9kZSgpIHsKLQkJcmV0dXJuIHRhc2tOb2RlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tOb2RlX0luZGV4KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza05vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKSB7Ci0JCXJldHVybiB3b3JrQnJlYWtkb3duRWxlbWVudE5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdENvbXBvc2l0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGVfVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0Q29tcG9zaXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0QWJzb2x1dGVCZW5kcG9pbnQoKSB7Ci0JCXJldHVybiBhYnNvbHV0ZUJlbmRwb2ludEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRQb2ludCgpIHsKLQkJcmV0dXJuIHBvaW50RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFJvbGVEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gcm9sZURlc2NyaXB0b3JFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEZhY3RvcnkgZ2V0TW9kZWxGYWN0b3J5KCkgewotCQlyZXR1cm4gKE1vZGVsRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJZGlhZ3JhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhESUFHUkFNKTsKLQotCQlsaW5rRUNsYXNzID0gY3JlYXRlRUNsYXNzKExJTkspOwotCQljcmVhdGVFQXR0cmlidXRlKGxpbmtFQ2xhc3MsIExJTktfX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGxpbmtFQ2xhc3MsIExJTktfX1NPVVJDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobGlua0VDbGFzcywgTElOS19fVEFSR0VUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsaW5rRUNsYXNzLCBMSU5LX19CRU5EUE9JTlRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsaW5rRUNsYXNzLCBMSU5LX19TT1VSQ0VfRU5EX1BPSU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsaW5rRUNsYXNzLCBMSU5LX19UQVJHRVRfRU5EX1BPSU5UKTsKLQotCQlsaW5rZWRPYmplY3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTElOS0VEX09CSkVDVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobGlua2VkT2JqZWN0RUNsYXNzLCBMSU5LRURfT0JKRUNUX19MSU5LRURfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGlua2VkT2JqZWN0RUNsYXNzLCBMSU5LRURfT0JKRUNUX19PQkpFQ1QpOwotCi0JCW5hbWVkTm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOQU1FRF9OT0RFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShuYW1lZE5vZGVFQ2xhc3MsIE5BTUVEX05PREVfX05BTUUpOwotCi0JCW5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTk9ERSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobm9kZUVDbGFzcywgTk9ERV9fTE9DQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG5vZGVFQ2xhc3MsIE5PREVfX1dJRFRIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShub2RlRUNsYXNzLCBOT0RFX19IRUlHSFQpOwotCQljcmVhdGVFUmVmZXJlbmNlKG5vZGVFQ2xhc3MsIE5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShub2RlRUNsYXNzLCBOT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobm9kZUVDbGFzcywgTk9ERV9fUkVBRF9PTkxZKTsKLQotCQlhY3Rpdml0eURpYWdyYW1FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZJVFlfRElBR1JBTSk7Ci0KLQkJdHlwZWROb2RlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRZUEVEX05PREUpOwotCQljcmVhdGVFQXR0cmlidXRlKHR5cGVkTm9kZUVDbGFzcywgVFlQRURfTk9ERV9fVFlQRSk7Ci0KLQkJd29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKTsKLQotCQl3b3JrUHJvZHVjdE5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX05PREUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0Tm9kZUVDbGFzcywgV09SS19QUk9EVUNUX05PREVfX1RZUEUpOwotCi0JCWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlEZXRhaWxEaWFncmFtRUNsYXNzLCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQpOwotCi0JCW5vZGVDb250YWluZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTk9ERV9DT05UQUlORVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKG5vZGVDb250YWluZXJFQ2xhc3MsIE5PREVfQ09OVEFJTkVSX19OT0RFUyk7Ci0KLQkJcm9sZU5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9OT0RFKTsKLQotCQlyb2xlVGFza0NvbXBvc2l0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX1RBU0tfQ09NUE9TSVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlVGFza0NvbXBvc2l0ZUVDbGFzcywgUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYKTsKLQotCQl0YXNrTm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLX05PREUpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tOb2RlRUNsYXNzLCBUQVNLX05PREVfX0lOREVYKTsKLQotCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREUpOwotCi0JCXdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREUpOwotCi0JCXdvcmtQcm9kdWN0Q29tcG9zaXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9DT01QT1NJVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0Q29tcG9zaXRlRUNsYXNzLCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQlhYnNvbHV0ZUJlbmRwb2ludEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShBQlNPTFVURV9CRU5EUE9JTlQpOwotCQlwb2ludEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShQT0lOVCk7Ci0JCXJvbGVEZXNjcmlwdG9yRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFJPTEVfREVTQ1JJUFRPUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlNb2RlbFBhY2thZ2UgdGhlTW9kZWxQYWNrYWdlXzEgPSAoTW9kZWxQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKTsKLQkJVW1hUGFja2FnZSB0aGVVbWFQYWNrYWdlID0gKFVtYVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVW1hUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWRpYWdyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kZWxQYWNrYWdlXzEuZ2V0Tm9kZUNvbnRhaW5lcigpKTsKLQkJbGlua0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RlbFBhY2thZ2VfMS5nZXRMaW5rZWRPYmplY3QoKSk7Ci0JCW5hbWVkTm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RlbFBhY2thZ2VfMS5nZXROb2RlKCkpOwotCQlub2RlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU1vZGVsUGFja2FnZV8xLmdldExpbmtlZE9iamVjdCgpKTsKLQkJYWN0aXZpdHlEaWFncmFtRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU1vZGVsUGFja2FnZV8xLmdldERpYWdyYW0oKSk7Ci0JCXR5cGVkTm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RlbFBhY2thZ2VfMS5nZXROb2RlKCkpOwotCQl3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU1vZGVsUGFja2FnZV8xLmdldERpYWdyYW0oKSk7Ci0JCXdvcmtQcm9kdWN0Tm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RlbFBhY2thZ2VfMS5nZXROYW1lZE5vZGUoKSk7Ci0JCWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RlbFBhY2thZ2VfMS5nZXREaWFncmFtKCkpOwotCQlub2RlQ29udGFpbmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU1vZGVsUGFja2FnZV8xLmdldE5vZGUoKSk7Ci0JCXJvbGVOb2RlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU1vZGVsUGFja2FnZV8xLmdldE5hbWVkTm9kZSgpKTsKLQkJcm9sZVRhc2tDb21wb3NpdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kZWxQYWNrYWdlXzEuZ2V0Tm9kZUNvbnRhaW5lcigpKTsKLQkJdGFza05vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kZWxQYWNrYWdlXzEuZ2V0TmFtZWROb2RlKCkpOwotCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU1vZGVsUGFja2FnZV8xLmdldE5hbWVkTm9kZSgpKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnROb2RlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU1vZGVsUGFja2FnZV8xLmdldE5hbWVkTm9kZSgpKTsKLQkJd29ya1Byb2R1Y3RDb21wb3NpdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kZWxQYWNrYWdlXzEuZ2V0Tm9kZUNvbnRhaW5lcigpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGRpYWdyYW1FQ2xhc3MsIERpYWdyYW0uY2xhc3MsICJEaWFncmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MobGlua0VDbGFzcywgTGluay5jbGFzcywgIkxpbmsiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExpbmtfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsICIiLCAwLCAxLCBMaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMaW5rX1NvdXJjZSgpLCB0aGVNb2RlbFBhY2thZ2VfMS5nZXROb2RlKCksIHRoZU1vZGVsUGFja2FnZV8xLmdldE5vZGVfT3V0Z29pbmdDb25uZWN0aW9ucygpLCAic291cmNlIiwgbnVsbCwgMCwgMSwgTGluay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldExpbmtfVGFyZ2V0KCksIHRoZU1vZGVsUGFja2FnZV8xLmdldE5vZGUoKSwgdGhlTW9kZWxQYWNrYWdlXzEuZ2V0Tm9kZV9JbmNvbWluZ0Nvbm5lY3Rpb25zKCksICJ0YXJnZXQiLCBudWxsLCAwLCAxLCBMaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMaW5rX0JlbmRwb2ludHMoKSwgdGhlTW9kZWxQYWNrYWdlXzEuZ2V0QWJzb2x1dGVCZW5kcG9pbnQoKSwgImJlbmRwb2ludHMiLCBudWxsLCAwLCAtMSwgTGluay5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMaW5rX1NvdXJjZUVuZFBvaW50KCksIHRoZU1vZGVsUGFja2FnZV8xLmdldFBvaW50KCksICJzb3VyY2VFbmRQb2ludCIsIG51bGwsIDAsIDEsIExpbmsuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGlua19UYXJnZXRFbmRQb2ludCgpLCB0aGVNb2RlbFBhY2thZ2VfMS5nZXRQb2ludCgpLCAidGFyZ2V0RW5kUG9pbnQiLCBudWxsLCAwLCAxLCBMaW5rLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhsaW5rZWRPYmplY3RFQ2xhc3MsIExpbmtlZE9iamVjdC5jbGFzcywgIkxpbmtlZE9iamVjdCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMaW5rZWRPYmplY3RfTGlua2VkRWxlbWVudCgpLCB0aGVVbWFQYWNrYWdlLmdldE1ldGhvZEVsZW1lbnQoKSwgbnVsbCwgImxpbmtlZEVsZW1lbnQiLCBudWxsLCAwLCAxLCBMaW5rZWRPYmplY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExpbmtlZE9iamVjdF9PYmplY3QoKSwgZWNvcmVQYWNrYWdlLmdldEVKYXZhT2JqZWN0KCksICJvYmplY3QiLCBudWxsLCAwLCAxLCBMaW5rZWRPYmplY3QuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG5hbWVkTm9kZUVDbGFzcywgTmFtZWROb2RlLmNsYXNzLCAiTmFtZWROb2RlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXROYW1lZE5vZGVfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIE5hbWVkTm9kZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG5vZGVFQ2xhc3MsIE5vZGUuY2xhc3MsICJOb2RlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE5vZGVfTG9jYXRpb24oKSwgdGhlTW9kZWxQYWNrYWdlXzEuZ2V0UG9pbnQoKSwgImxvY2F0aW9uIiwgbnVsbCwgMCwgMSwgTm9kZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXROb2RlX1dpZHRoKCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJ3aWR0aCIsICItMSIsIDAsIDEsIE5vZGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Tm9kZV9IZWlnaHQoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgImhlaWdodCIsICItMSIsIDAsIDEsIE5vZGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Tm9kZV9JbmNvbWluZ0Nvbm5lY3Rpb25zKCksIHRoZU1vZGVsUGFja2FnZV8xLmdldExpbmsoKSwgdGhlTW9kZWxQYWNrYWdlXzEuZ2V0TGlua19UYXJnZXQoKSwgImluY29taW5nQ29ubmVjdGlvbnMiLCBudWxsLCAwLCAtMSwgTm9kZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCksIHRoZU1vZGVsUGFja2FnZV8xLmdldExpbmsoKSwgdGhlTW9kZWxQYWNrYWdlXzEuZ2V0TGlua19Tb3VyY2UoKSwgIm91dGdvaW5nQ29ubmVjdGlvbnMiLCBudWxsLCAwLCAtMSwgTm9kZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Tm9kZV9SZWFkT25seSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJlYWRPbmx5IiwgbnVsbCwgMCwgMSwgTm9kZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFjdGl2aXR5RGlhZ3JhbUVDbGFzcywgQWN0aXZpdHlEaWFncmFtLmNsYXNzLCAiQWN0aXZpdHlEaWFncmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3ModHlwZWROb2RlRUNsYXNzLCBUeXBlZE5vZGUuY2xhc3MsICJUeXBlZE5vZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFR5cGVkTm9kZV9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgVHlwZWROb2RlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVDbGFzcywgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbS5jbGFzcywgIldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrUHJvZHVjdE5vZGVFQ2xhc3MsIFdvcmtQcm9kdWN0Tm9kZS5jbGFzcywgIldvcmtQcm9kdWN0Tm9kZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3ROb2RlX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdE5vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhY3Rpdml0eURldGFpbERpYWdyYW1FQ2xhc3MsIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbS5jbGFzcywgIkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtX0F1dG9MYXlvdXQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJhdXRvTGF5b3V0IiwgbnVsbCwgMCwgMSwgQWN0aXZpdHlEZXRhaWxEaWFncmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mobm9kZUNvbnRhaW5lckVDbGFzcywgTm9kZUNvbnRhaW5lci5jbGFzcywgIk5vZGVDb250YWluZXIiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Tm9kZUNvbnRhaW5lcl9Ob2RlcygpLCB0aGVNb2RlbFBhY2thZ2VfMS5nZXROb2RlKCksIG51bGwsICJub2RlcyIsIG51bGwsIDAsIC0xLCBOb2RlQ29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mocm9sZU5vZGVFQ2xhc3MsIFJvbGVOb2RlLmNsYXNzLCAiUm9sZU5vZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhyb2xlVGFza0NvbXBvc2l0ZUVDbGFzcywgUm9sZVRhc2tDb21wb3NpdGUuY2xhc3MsICJSb2xlVGFza0NvbXBvc2l0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZVRhc2tDb21wb3NpdGVfUm93SW5kZXgoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgInJvd0luZGV4IiwgbnVsbCwgMCwgMSwgUm9sZVRhc2tDb21wb3NpdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0YXNrTm9kZUVDbGFzcywgVGFza05vZGUuY2xhc3MsICJUYXNrTm9kZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza05vZGVfSW5kZXgoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgImluZGV4IiwgIi0xIiwgMCwgMSwgVGFza05vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRUNsYXNzLCBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlLmNsYXNzLCAiV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVDbGFzcywgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzLCAiV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Mod29ya1Byb2R1Y3RDb21wb3NpdGVFQ2xhc3MsIFdvcmtQcm9kdWN0Q29tcG9zaXRlLmNsYXNzLCAiV29ya1Byb2R1Y3RDb21wb3NpdGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0Q29tcG9zaXRlX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdENvbXBvc2l0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLQkJaW5pdEVEYXRhVHlwZShhYnNvbHV0ZUJlbmRwb2ludEVEYXRhVHlwZSwgQWJzb2x1dGVCZW5kcG9pbnQuY2xhc3MsICJBYnNvbHV0ZUJlbmRwb2ludCIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFRGF0YVR5cGUocG9pbnRFRGF0YVR5cGUsIFBvaW50LmNsYXNzLCAiUG9pbnQiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RURhdGFUeXBlKHJvbGVEZXNjcmlwdG9yRURhdGFUeXBlLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgIlJvbGVEZXNjcmlwdG9yIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQl9Ci0KLX0gLy8gTW9kZWxQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9OYW1lZE5vZGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL05hbWVkTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjRlZDQ5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL05hbWVkTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSU5vZGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lZCBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5hbWVkTm9kZUltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIE5hbWVkTm9kZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTmFtZWROb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCS8vIFN0YXJ0IGN1c3RvbSBjb2RlICAvLwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCi0JcHJvdGVjdGVkIGNsYXNzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25hbE5vZGVMaW5rIHsKLQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJc2V0TmFtZShtc2cuZ2V0TmV3U3RyaW5nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJCQlyZXR1cm47Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCUludGVybmFsVHJhbnNhY3Rpb24gdHggPSBudWxsOwotCQkJCUludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGdldE5vZGUoKSk7Ci0JCQkJaWYoZG9tYWluICE9IG51bGwpIHsKLQkJCQkJdHggPSBkb21haW4uc3RhcnRUcmFuc2FjdGlvbihmYWxzZSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaGFuZGxlTm90aWZpY2F0aW9uKG1zZyk7Ci0JCQkJCi0JCQkJaWYodHggIT0gbnVsbCkgewotCQkJCQl0eC5jb21taXQoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJCXJldHVybiBOYW1lZE5vZGVJbXBsLnRoaXM7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBMaW5rIGFkZEluY29taW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHNvdXJjZSkgewotCQlOb2RlIHNyY05vZGUgPSBmaW5kTm9kZShzb3VyY2UpOwotCQlpZiAoc3JjTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpbmsgbGluayA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpOwotCQlsaW5rLnNldFRhcmdldCh0aGlzKTsKLQotCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBvZiBzcmNOb2RlIGJlZm9yZSBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgbGluawotCQkvLyBzbyBpdCB3aWxsIG5vdCBjcmVhdGUgZHVwbGljYXRlIFVNQSBkYXRhCi0JCS8vCi0JCU5vZGVJbXBsIHNyY05vZGVJbXBsID0gKE5vZGVJbXBsKSBzcmNOb2RlOwotCQlib29sZWFuIG5vdGlmeSA9IHNyY05vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCXRyeSB7Ci0JCQlzcmNOb2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlsaW5rLnNldFNvdXJjZShzcmNOb2RlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNyY05vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCX0KLQotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlHcmFwaGljYWxEYXRhSGVscGVyLmFkZEdyYXBoaWNhbERhdGEobGluayk7Ci0JCX0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgZmluZE5vZGUoTWV0aG9kRWxlbWVudCBsaW5rZWRFbGVtZW50KSB7Ci0JCXJldHVybiBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKGdldERpYWdyYW0oKSwgbGlua2VkRWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpbmsgYWRkT3V0Z29pbmdDb25uZWN0aW9uKE1ldGhvZEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCU5vZGUgdGFyZ2V0Tm9kZSA9IGZpbmROb2RlKHRhcmdldCk7Ci0JCWlmICh0YXJnZXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGluayBsaW5rID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5rKCk7Ci0KLQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gb2YgdGFyZ2V0Tm9kZSBiZWZvcmUgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGxpbmsKLQkJLy8gc28gaXQgd2lsbCBub3QgY3JlYXRlIGR1cGxpY2F0ZSBVTUEgZGF0YQotCQkvLwotCQlOb2RlSW1wbCBub2RlSW1wbCA9IChOb2RlSW1wbCkgdGFyZ2V0Tm9kZTsKLQkJYm9vbGVhbiBub3RpZnkgPSBub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJbGluay5zZXRUYXJnZXQodGFyZ2V0Tm9kZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQl9Ci0KLQkJbGluay5zZXRTb3VyY2UodGhpcyk7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuYWRkR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJfQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJbmNvbWluZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCBzb3VyY2UpIHsKLQkJLy8gbG9vayBmb3IgdGhlIGluY29taW5nIGNvbm5lY3Rpb24gd2l0aCBzb3VyY2UgYXMgbGlua2VkIG9iamVjdCBvZiB0aGUKLQkJLy8gc291cmNlIG5vZGUKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbAotCQkJCQkmJiBsaW5rLmdldFNvdXJjZSgpLmdldE9iamVjdCgpID09IHNvdXJjZSkgewotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJCQkvLyBkaXNhYmxlIGludGVybmFsIG5vdGlmaWNhdGlvbiBvZiB0aGUgc291cmNlIG5vZGUKLQkJCQkvLwotCQkJCU5vZGVJbXBsIHNvdXJjZU5vZGUgPSAoTm9kZUltcGwpIGxpbmsuZ2V0U291cmNlKCk7Ci0JCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJdHJ5IHsKLQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTsKLQkJCQl9Ci0JCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCQkJbGluay5zZXRPYmplY3QobnVsbCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZU91dGdvaW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHRhcmdldCkgewotCQkvLyBsb29rIGZvciB0aGUgaW5jb21pbmcgY29ubmVjdGlvbiB3aXRoIHNvdXJjZSBhcyBsaW5rZWQgb2JqZWN0IG9mIHRoZQotCQkvLyBzb3VyY2Ugbm9kZQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsCi0JCQkJCSYmIGxpbmsuZ2V0VGFyZ2V0KCkuZ2V0T2JqZWN0KCkgPT0gdGFyZ2V0KSB7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVHcmFwaGljYWxEYXRhKGxpbmspOwotCQkJCS8vIGRpc2FibGUgaW50ZXJuYWwgbm90aWZpY2F0aW9uIG9mIHRoZSBzb3VyY2Ugbm9kZQotCQkJCS8vCi0JCQkJTm9kZUltcGwgdGFyZ2V0Tm9kZSA9IChOb2RlSW1wbCkgbGluay5nZXRUYXJnZXQoKTsKLQkJCQlib29sZWFuIG9sZE5vdGlmeSA9IHRhcmdldE5vZGUubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQl0cnkgewotCQkJCQl0YXJnZXROb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdGFyZ2V0Tm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5OwotCQkJCX0KLQkJCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCQlsaW5rLnNldE9iamVjdChudWxsKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJc3VwZXIuc2V0T2JqZWN0KG5ld09iamVjdCk7Ci0KLQkJaWYgKG5ld09iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkJLy8gdXNlIHByZXNlbnRhdGlvbiBuYW1lCi0JCWlmIChuZXdPYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBlbGVtZW50ID0gKERlc2NyaWJhYmxlRWxlbWVudCkgbmV3T2JqZWN0OwotCQkJbmFtZSA9IFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQpOwotCQl9Ci0KLQkJLy8gaWYgaXQncyBibGFuayB0aGVuIHVzZSBuYW1lCi0JCWlmIChTdHJVdGlsLmlzQmxhbmsobmFtZSkpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBuZXdPYmplY3Q7Ci0JCQluYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCX0KLQotCQl0aGlzLm5hbWUgPSBuYW1lOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2Jhc2ljU2V0T2JqZWN0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNTZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCQlzdXBlci5iYXNpY1NldE9iamVjdChuZXdPYmplY3QpOwotCi0JCWlmIChuZXdPYmplY3QgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQKLQkJCQkmJiBQcm9jZXNzVXRpbAotCQkJCQkJLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKChCcmVha2Rvd25FbGVtZW50KSBuZXdPYmplY3QpKSB7Ci0JCQkvLyBsaXN0ZW4gdG8gY2hhbmdlIGluIHRoZSBiYXNlCi0JCQkvLwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSAoKFZhcmlhYmlsaXR5RWxlbWVudCkgbmV3T2JqZWN0KQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCWlmIChiYXNlTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJCQliYXNlTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzKSkgewotCQkJCQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCQkJCQkJRGVzY3JpYmFibGVFbGVtZW50IGUgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBnZXRPYmplY3QoKTsKLQkJCQkJCQkJaWYgKFN0clV0aWwuaXNCbGFuayhlLmdldFByZXNlbnRhdGlvbk5hbWUoKSkpIHsKLQkJCQkJCQkJCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJCQkJCQkJCW5hbWUgPSBtc2cuZ2V0TmV3U3RyaW5nVmFsdWUoKTsKLQkJCQkJCQkJCWlmICghbmFtZS5lcXVhbHMob2xkTmFtZSkpIHsKLQkJCQkJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQkJCQkJCQlOYW1lZE5vZGVJbXBsLnRoaXMsIC0xLAotCQkJCQkJCQkJCQlNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRSwKLQkJCQkJCQkJCQkJb2xkTmFtZSwgbmFtZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0JCQkJYmFzZS5lQWRhcHRlcnMoKS5hZGQoYmFzZUxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNkaXNwb3NlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBnZXRPYmplY3QoKTsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlpZiAoYmFzZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQlvYmouZUFkYXB0ZXJzKCkucmVtb3ZlKGJhc2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2NyZWF0ZU5vZGVBZGFwdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgQWRhcHRlciBjcmVhdGVOb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBOb2RlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJCQkJcmV0dXJuOwotCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTmFtZWROb2RlLmNsYXNzKSkgewotCQkJCQljYXNlIE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19OQU1FOgotCQkJCQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUCi0JCQkJCQkJCSYmIGdldE9iamVjdCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJCVN0cmluZyBuZXdOYW1lID0gbXNnLmdldE5ld1N0cmluZ1ZhbHVlKCk7Ci0JCQkJCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKChCcmVha2Rvd25FbGVtZW50KSBnZXRPYmplY3QoKSk7Ci0JCQkJCQkJZS5zZXRQcmVzZW50YXRpb25OYW1lKG5ld05hbWUpOwotCQkJCQkJCWlmIChTdHJVdGlsLmlzQmxhbmsoZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJCWUuc2V0TmFtZShuZXdOYW1lKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkJCX0KLQotCQkJfQotCQl9OwotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOb3RpZmljYXRpb25FbmFibGVkKCkgewotCQlyZXR1cm4gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gbm90aWZpY2F0aW9uRW5hYmxlZCkgewotCQl0aGlzLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZmljYXRpb25FbmFibGVkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3VwcHJlc3NlZCgpIHsKLQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBnZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKTsKLQkJaWYgKHN1cHByZXNzaW9uICE9IG51bGwpIHsKLQkJCU9iamVjdCBvID0gaXRlbVByb3ZpZGVyICE9IG51bGwgPyBpdGVtUHJvdmlkZXIgOiBnZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQlyZXR1cm4gZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKG8pOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIE9iamVjdCBnZXRXcmFwcGVyKCkgewotCQlyZXR1cm4gaXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGl0ZW0gcHJvdmlkZXIgZm9yIHRoZSB0aGlzIG5vZGUgaWYgdGhlcmUgaXMgYSByZWFkLW9ubHkgd3JhcHBlcgotCSAqIGZvciB0aGUgbm9kZSBpbiB0aGUgZ2l2ZW4gZWxlbWVudCBjb2xsZWN0aW9uCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gYWxsRWxlbWVudHMKLQkgKi8KLQl2b2lkIHNldEl0ZW1Qcm92aWRlcihDb2xsZWN0aW9uIGFsbEVsZW1lbnRzKSB7Ci0JCU9iamVjdCBvYmplY3QgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRFbGVtZW50KGFsbEVsZW1lbnRzLAotCQkJCWdldE9iamVjdCgpKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCQlpZiAod3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkJCQlpdGVtUHJvdmlkZXIgPSB3cmFwcGVyOwotCQkJCXJlYWRPbmx5ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQWRhcHRlckltcGwgYmFzZUxpc3RlbmVyOwotCi0JLyoqCi0JICogSXRlbSBwcm92aWRlciBvZiB0aGUgbGlua2VkIG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXI7Ci0KLX0gLy8gTmFtZWROb2RlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Ob2RlQ29udGFpbmVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Ob2RlQ29udGFpbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMzA5Mzc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTm9kZUNvbnRhaW5lckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Tm9kZSBDb250YWluZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUNvbnRhaW5lckltcGwjZ2V0Tm9kZXMgPGVtPk5vZGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUNvbnRhaW5lckltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzCi0JCU5vZGVDb250YWluZXIgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vZGVzKCkgPGVtPk5vZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG5vZGVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUNvbnRhaW5lckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfQ09OVEFJTkVSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Tm9kZXMoKSB7Ci0JCWlmIChub2RlcyA9PSBudWxsKSB7Ci0JCQlub2RlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChOb2RlLmNsYXNzLCB0aGlzLCBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTKTsKLQkJfQotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Tm9kZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTk9ERVM6Ci0JCQkJcmV0dXJuIGdldE5vZGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzoKLQkJCQlnZXROb2RlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Tm9kZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTk9ERVM6Ci0JCQkJZ2V0Tm9kZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJCXJldHVybiBub2RlcyAhPSBudWxsICYmICFub2Rlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNzZXRSZWFkT25seShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gbmV3UmVhZE9ubHkpIHsKLQkJc3VwZXIuc2V0UmVhZE9ubHkobmV3UmVhZE9ubHkpOwotCQlpZiAobmV3UmVhZE9ubHkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZSBjaGlsZCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQljaGlsZC5zZXRSZWFkT25seShuZXdSZWFkT25seSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVtb3ZlZE5vZGVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEJhY2tUb0RpYWdyYW0oQ29sbGVjdGlvbiByZW1vdmVkTm9kZXMpIHsKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLQkJQ29sbGVjdGlvbiBicmVha2Rvd25FbGVtZW50cyA9IGRpYWdyYW0uZ2V0QWxsQnJlYWtkb3duRWxlbWVudHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVtb3ZlZE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFicmVha2Rvd25FbGVtZW50cy5jb250YWlucyhub2RlLmdldE9iamVjdCgpKSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJLy8gewotCQkvLyBPYmplY3Qgbm9kZSA9IGl0ZXIubmV4dCgpOwotCQkvLyBpZihub2RlIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGUpewotCQkvLyBMaXN0IGxpc3QgPSAoKFJvbGVUYXNrQ29tcG9zaXRlKW5vZGUpLmdldE5vZGVzKCk7Ci0JCS8vIGJvb2xlYW4gZGVzdHJveSA9IHRydWU7Ci0JCS8vIGZvcihJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyl7Ci0JCS8vIE9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCS8vIGlmKG9iaiBpbnN0YW5jZW9mIFRhc2tOb2RlKSBkZXN0cm95ID0gZmFsc2U7Ci0JCS8vIH0KLQkJLy8gaWYoZGVzdHJveSkgaXRlci5yZW1vdmUoKTsKLQkJLy8gfQotCQkvLyB9Ci0JCWlmICghcmVtb3ZlZE5vZGVzLmlzRW1wdHkoKSkgewotCQkJZGlhZ3JhbS5nZXROb2RlcygpLmFkZEFsbChyZW1vdmVkTm9kZXMpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdE5vZGVzKENvbGxlY3Rpb24gbm9kZXMpIHsKLQkJaWYgKCFub2Rlcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIGl0ZXIubmV4dCgpOwotCQkJCW5vZGUudmlzaWJsZSA9IHRydWU7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIGl0ZXIubmV4dCgpOwotCQkJCWlmKCFub2Rlcy5jb250YWlucyhub2RlKSkgewotCQkJCQlub2RlLnZpc2libGUgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlnZXROb2RlcygpLmFkZEFsbChub2Rlcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIGl0ZXIubmV4dCgpOwotCQkJCW5vZGUudmlzaWJsZSA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCQotfSAvLyBOb2RlQ29udGFpbmVySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Ob2RlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MmUzNzQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbC5NZXRob2RFbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklOb2RlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Tm9kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZ2V0V2lkdGggPGVtPldpZHRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldEhlaWdodCA8ZW0+SGVpZ2h0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldEluY29taW5nQ29ubmVjdGlvbnMgPGVtPkluY29taW5nIENvbm5lY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldE91dGdvaW5nQ29ubmVjdGlvbnMgPGVtPk91dGdvaW5nIENvbm5lY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2lzUmVhZE9ubHkgPGVtPlJlYWQgT25seTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVJbXBsIGV4dGVuZHMgTGlua2VkT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE5vZGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvbigpIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBvaW50IExPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uKCkgPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBsb2NhdGlvbiA9IExPQ0FUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdpZHRoKCkgPGVtPldpZHRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2lkdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFdJRFRIX0VERUZBVUxUID0gLTE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXaWR0aCgpIDxlbT5XaWR0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdpZHRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHdpZHRoID0gV0lEVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGVpZ2h0KCkgPGVtPkhlaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSEVJR0hUX0VERUZBVUxUID0gLTE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIZWlnaHQoKSA8ZW0+SGVpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGVpZ2h0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGhlaWdodCA9IEhFSUdIVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY29taW5nQ29ubmVjdGlvbnMoKSA8ZW0+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluY29taW5nQ29ubmVjdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmNvbWluZ0Nvbm5lY3Rpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGdvaW5nQ29ubmVjdGlvbnMoKSA8ZW0+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGdvaW5nQ29ubmVjdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBvdXRnb2luZ0Nvbm5lY3Rpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlYWRPbmx5KCkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRUFEX09OTFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVhZE9ubHkoKSA8ZW0+UmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZE9ubHkgPSBSRUFEX09OTFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oUG9pbnQgbmV3TG9jYXRpb24pIHsKLQkJUG9pbnQgb2xkTG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJbG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OLCBvbGRMb2NhdGlvbiwgbG9jYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIHdpZHRoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChpbnQgbmV3V2lkdGgpIHsKLQkJaW50IG9sZFdpZHRoID0gd2lkdGg7Ci0JCXdpZHRoID0gbmV3V2lkdGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5OT0RFX19XSURUSCwgb2xkV2lkdGgsIHdpZHRoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgewotCQlyZXR1cm4gaGVpZ2h0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoaW50IG5ld0hlaWdodCkgewotCQlpbnQgb2xkSGVpZ2h0ID0gaGVpZ2h0OwotCQloZWlnaHQgPSBuZXdIZWlnaHQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5OT0RFX19IRUlHSFQsIG9sZEhlaWdodCwgaGVpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkgewotCQlpZiAoaW5jb21pbmdDb25uZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQlpbmNvbWluZ0Nvbm5lY3Rpb25zID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0KExpbmsuY2xhc3MsIHRoaXMsIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUywgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVCk7Ci0JCX0KLQkJcmV0dXJuIGluY29taW5nQ29ubmVjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkgewotCQlpZiAob3V0Z29pbmdDb25uZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQlvdXRnb2luZ0Nvbm5lY3Rpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoTGluay5jbGFzcywgdGhpcywgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TLCBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFKTsKLQkJfQotCQlyZXR1cm4gb3V0Z29pbmdDb25uZWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobG9jYXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxvY2F0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3aWR0aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQod2lkdGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhlaWdodDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaGVpZ2h0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWFkT25seTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVhZE9ubHkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGluY29taW5nIGNvbm5lY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gbGluawotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb1VNQShMaW5rIGxpbmspIHsKLQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgPT0gbnVsbCB8fCBsaW5rLmdldFNvdXJjZSgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuYWRkR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIG91dGdvaW5nIGNvbm5lY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gbGluawotCSAqIEBwYXJhbSBvbGRTb3VyY2UKLQkgKiBAcGFyYW0gb2xkVGFyZ2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShMaW5rIGxpbmssIE5vZGUgb2xkU291cmNlLCBOb2RlIG9sZFRhcmdldCkgewotCQkvLyBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUdyYXBoQ29ubmVjdG9yUGFpcihvbGRTb3VyY2UuZ2V0R3JhcGhOb2RlKCksCi0JCS8vIG9sZFRhcmdldC5nZXRHcmFwaE5vZGUoKSk7Ci0JCQotCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUdyYXBoaWNhbERhdGEobGluayk7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBnZXRVTUFEaWFncmFtKCkgewotCQlpZiAoZ2V0RGlhZ3JhbSgpID09IG51bGwpCi0JCQlyZXR1cm4gdW1hRGlhZ3JhbTsKLQkJcmV0dXJuIGdldERpYWdyYW0oKS5nZXRVTUFEaWFncmFtKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEdyYXBoTm9kZSBnZXRVTUFDb250YWluZXIoKSB7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGVDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKQotCQkJcmV0dXJuIHVtYUNvbnRhaW5lcjsKLQkJcmV0dXJuIGNvbnRhaW5lci5nZXRHcmFwaE5vZGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjc2V0VU1BQ29udGFpbmVyKG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVNQUNvbnRhaW5lcihHcmFwaE5vZGUgdW1hQ29udGFpbmVyKSB7Ci0JCXRoaXMudW1hQ29udGFpbmVyID0gdW1hQ29udGFpbmVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlOb2RlI3NldFVNQURpYWdyYW0ob3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVNQURpYWdyYW0ob3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIHVtYURpYWdyYW0pIHsKLQkJdGhpcy51bWFEaWFncmFtID0gdW1hRGlhZ3JhbTsKLQkJdW1hQ29udGFpbmVyID0gdW1hRGlhZ3JhbTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgTm9kZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5vZGUuY2xhc3MpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19XSURUSDoKLQkJCQlnZXRHcmFwaE5vZGUoKS5nZXRTaXplKCkuc2V0V2lkdGgoCi0JCQkJCQluZXcgRG91YmxlKG1zZy5nZXROZXdJbnRWYWx1ZSgpKSk7Ci0JCQkJcmV0dXJuOwotCi0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19IRUlHSFQ6Ci0JCQkJaWYgKGdldEdyYXBoTm9kZSgpICE9IG51bGwpIHsKLQkJCQkJZ2V0R3JhcGhOb2RlKCkuZ2V0U2l6ZSgpLnNldEhlaWdodCgKLQkJCQkJCQluZXcgRG91YmxlKG1zZy5nZXROZXdJbnRWYWx1ZSgpKSk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fTE9DQVRJT046Ci0JCQkJaWYgKGdldEdyYXBoTm9kZSgpICE9IG51bGwgJiYgbXNnLmdldE5ld1ZhbHVlKCkgIT0gbnVsbCkgewotCQkJCQlQb2ludCBwID0gKFBvaW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZ2V0R3JhcGhOb2RlKCkuZ2V0UG9zaXRpb24oKS5zZXRYKG5ldyBEb3VibGUocC54KSk7Ci0JCQkJCWdldEdyYXBoTm9kZSgpLmdldFBvc2l0aW9uKCkuc2V0WShuZXcgRG91YmxlKHAueSkpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJCUxpbmsgbGluazsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJbGluayA9IChMaW5rKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJYWRkVG9VTUEobGluayk7Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlhZGRUb1VNQSgoTGluaykgaXRlci5uZXh0KCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJbGluayA9IChMaW5rKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkJCQkJKChOb2RlSW1wbCkgbGluay5nZXRTb3VyY2UoKSkucmVtb3ZlRnJvbVVNQShsaW5rLCBsaW5rCi0JCQkJCQkJCS5nZXRTb3VyY2UoKSwgKE5vZGUpIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkJCQkJCSgoTm9kZUltcGwpIGxpbmsuZ2V0U291cmNlKCkpLnJlbW92ZUZyb21VTUEobGluaywKLQkJCQkJCQkJCWxpbmsuZ2V0U291cmNlKCksIChOb2RlKSBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlsaW5rID0gKExpbmspIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJCQkoKE5vZGVJbXBsKSBsaW5rLmdldFRhcmdldCgpKS5hZGRUb1VNQShsaW5rKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQkJCSgoTm9kZUltcGwpIGxpbmsuZ2V0VGFyZ2V0KCkpLmFkZFRvVU1BKGxpbmspOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJbGluayA9IChMaW5rKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQkJcmVtb3ZlRnJvbVVNQShsaW5rLCAoTm9kZSkgbXNnLmdldE5vdGlmaWVyKCksIGxpbmsKLQkJCQkJCQkJLmdldFRhcmdldCgpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQkJCXJlbW92ZUZyb21VTUEobGluaywgKE5vZGUpIG1zZy5nZXROb3RpZmllcigpLCBsaW5rCi0JCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0KLQkJCX0KLQkJfQotCi0JfQotCQotCS8qKgotCSAqIExvYWRzIGdyYXBobm9kZSBkYXRhIGFuZCBhc3NvY2lhdGVzIHRoZSBhZGFwdGVycy4KLQkgKiBAcGFyYW0gbmV3T2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNTZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCQlpZiAobmV3T2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5vYmplY3QgPSBuZXdPYmplY3Q7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBuZXdPYmplY3Q7Ci0JCQotCQlncmFwaE5vZGUgPSBnZXRHcmFwaE5vZGUoZWxlbWVudCk7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJOb2RlSW1wbC5zZXRPYmplY3QoKTogZWxlbWVudDogJyIgKwotCQkvLyBlbGVtZW50LmdldE5hbWUoKSArICInLCBncmFwaE5vZGU6ICIgKyBncmFwaE5vZGUpOwotCi0JCWlmKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBwb3B1bGF0ZS9zeW5jaCBkYXRhCi0JCQkvLwotCQkJaWYgKGhlaWdodCA9PSBIRUlHSFRfRURFRkFVTFQpIHsKLQkJCQlzZXRIZWlnaHQoZ3JhcGhOb2RlLmdldFNpemUoKS5nZXRIZWlnaHQoKS5pbnRWYWx1ZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZ3JhcGhOb2RlLmdldFNpemUoKS5zZXRIZWlnaHQobmV3IERvdWJsZShoZWlnaHQpKTsKLQkJCX0KLQotCQkJaWYgKHdpZHRoID09IFdJRFRIX0VERUZBVUxUKSB7Ci0JCQkJc2V0V2lkdGgoZ3JhcGhOb2RlLmdldFNpemUoKS5nZXRXaWR0aCgpLmludFZhbHVlKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlncmFwaE5vZGUuZ2V0U2l6ZSgpLnNldFdpZHRoKG5ldyBEb3VibGUod2lkdGgpKTsKLQkJCX0KLQotCQkJaWYgKGxvY2F0aW9uID09IExPQ0FUSU9OX0VERUZBVUxUKSB7Ci0JCQkJc2V0TG9jYXRpb24oR3JhcGhpY2FsRGF0YUhlbHBlci50b1BvaW50KGdyYXBoTm9kZS5nZXRQb3NpdGlvbigpKSk7Ci0JCQl9IGVsc2UgewotCQkJCWdyYXBoTm9kZS5nZXRQb3NpdGlvbigpLnNldFgobmV3IERvdWJsZShsb2NhdGlvbi54KSk7Ci0JCQkJZ3JhcGhOb2RlLmdldFBvc2l0aW9uKCkuc2V0WShuZXcgRG91YmxlKGxvY2F0aW9uLnkpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBtZXRob2RFbGVtZW50QWRhcHRlcgotCQkvLwotCQlnZXRNZXRob2RFbGVtZW50QWRhcHRlcigpOwotCQlpZiAobWV0aG9kRWxlbWVudEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJZWxlbWVudC5lQWRhcHRlcnMoKS5hZGQobWV0aG9kRWxlbWVudEFkYXB0ZXIpOwotCQl9Ci0KLQkJdGhpcy5lQWRhcHRlcnMoKS5hZGQoY3JlYXRlTm9kZUFkYXB0ZXIoKSk7Ci0JCQkJCi0JCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXNldExpbmtlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBUcmFuc2FjdGlvbmFsTm9kZUxpbmsgZXh0ZW5kcyBBZGFwdGVySW1wbCAKLQlpbXBsZW1lbnRzIElOb2RlQ2hhbmdlTGlzdGVuZXIKLQl7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKCFub3RpZmljYXRpb25FbmFibGVkKQotCQkJCXJldHVybjsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJSW50ZXJuYWxUcmFuc2FjdGlvbiB0eCA9IG51bGw7Ci0JCQkJSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZ2V0Tm9kZSgpKTsKLQkJCQlpZihkb21haW4gIT0gbnVsbCkgewotCQkJCQl0eCA9IGRvbWFpbi5zdGFydFRyYW5zYWN0aW9uKGZhbHNlLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJCX0KLQkJCQkKLQkJCQloYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQkJCQkKLQkJCQlpZih0eCAhPSBudWxsKSB7Ci0JCQkJCXR4LmNvbW1pdCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZyk7Ci0KLQkJcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJCXJldHVybiBOb2RlSW1wbC50aGlzOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogU3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgTWV0aG9kRWxlbWVudEFkYXB0ZXIgdGhhdCB3aWxsIHN5bmNocm9uaXplCi0JICogdGhlIGNoYW5nZSBmcm9tIG1ldGhvZCBlbGVtZW50IHRvIHRoZSBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBlbGVtZW50IGFkYXB0ZXIgb2YgdGhpcyBub2RlCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRNZXRob2RFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRBZGFwdGVyOwotCX0KLQotCXB1YmxpYyBHcmFwaE5vZGUgZ2V0R3JhcGhOb2RlKE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCl7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCXJldHVybiBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEdyYXBoTm9kZSgKLQkJCQkJZ2V0VU1BRGlhZ3JhbSgpLCBtZXRob2RFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua2VkT2JqZWN0SW1wbCNzZXRPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCQlzdXBlci5zZXRPYmplY3QobmV3T2JqZWN0KTsKLQkJCi0JCS8vVE9ETzogPz8/IHdoeSB0YXNrIGRlc2NyaXB0b3IgaXMgZXhjbHVkZWQgaWYgdGhlIGRpYWdyYW0gaXMgYW4gYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0KLQkJLy8KLS8vCQlpZiAoISgobmV3T2JqZWN0IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpICYmIGdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkpCi0JCQliYXNpY1NldE9iamVjdChuZXdPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgQWRhcHRlciBjcmVhdGVOb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBOb2RlQWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBHcmFwaE5vZGUgZ2V0R3JhcGhOb2RlKCkgewotCQlyZXR1cm4gZ3JhcGhOb2RlOwotCX0KLQotCS8vIFRPRE86IGZvcmNlIHN1YmNsYXNzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBJTm9kZUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXREaWFncmFtKCkKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlFT2JqZWN0IHBhcmVudCA9IGVDb250YWluZXI7Ci0JCWZvciAoOyBwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIERpYWdyYW0pOyBwYXJlbnQgPSBwYXJlbnQKLQkJCQkuZUNvbnRhaW5lcigpKQotCQkJOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJcmV0dXJuIChEaWFncmFtKSBwYXJlbnQ7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI3NldERpYWdyYW0ob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaWFncmFtKERpYWdyYW0gZGlhZ3JhbSkgewotCQl0aGlzLmRpYWdyYW0gPSBkaWFncmFtOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNhZGRDb25zdW1lcihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbnN1bWVyKE9iamVjdCBjb25zdW1lcikgewotCQlpZiAoIWNvbnN1bWVycy5jb250YWlucyhjb25zdW1lcikpIHsKLQkJCWNvbnN1bWVycy5hZGQoY29uc3VtZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI3JlbW92ZUNvbnN1bWVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uc3VtZXIoT2JqZWN0IGNvbnN1bWVyKSB7Ci0JCWNvbnN1bWVycy5yZW1vdmUoY29uc3VtZXIpOwotCQlpZiAoY29uc3VtZXJzLmlzRW1wdHkoKSkgewotCQkJLy8gbm8gbW9yZSBjb25zdW1lciBvZiB0aGlzIG5vZGUsIGl0IHNob3VsZCBiZSBkaXNwb3NlZAotCQkJZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgZ2V0T2JqZWN0KCk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJaWYgKG1ldGhvZEVsZW1lbnRBZGFwdGVyICE9IG51bGwpIHsKLQkJCQlvYmouZUFkYXB0ZXJzKCkucmVtb3ZlKG1ldGhvZEVsZW1lbnRBZGFwdGVyKTsKLQkJCX0KLQkJfQotCi0JCWVBZGFwdGVycygpLmNsZWFyKCk7Ci0KLQkJdW1hQ29udGFpbmVyID0gbnVsbDsKLQkJdW1hRGlhZ3JhbSA9IG51bGw7Ci0JCWdyYXBoTm9kZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gbmV3UmVhZE9ubHkpIHsKLQkJYm9vbGVhbiBvbGRSZWFkT25seSA9IHJlYWRPbmx5OwotCQlyZWFkT25seSA9IG5ld1JlYWRPbmx5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTk9ERV9fUkVBRF9PTkxZLCBvbGRSZWFkT25seSwgcmVhZE9ubHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluY29taW5nQ29ubmVjdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OOgotCQkJCXJldHVybiBnZXRMb2NhdGlvbigpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFdpZHRoKCkpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hUOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRIZWlnaHQoKSk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM6Ci0JCQkJcmV0dXJuIGdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1JFQURfT05MWToKLQkJCQlyZXR1cm4gaXNSZWFkT25seSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fTE9DQVRJT046Ci0JCQkJc2V0TG9jYXRpb24oKFBvaW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19XSURUSDoKLQkJCQlzZXRXaWR0aCgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0hFSUdIVDoKLQkJCQlzZXRIZWlnaHQoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzoKLQkJCQlnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19SRUFEX09OTFk6Ci0JCQkJc2V0UmVhZE9ubHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OOgotCQkJCXNldExvY2F0aW9uKExPQ0FUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19XSURUSDoKLQkJCQlzZXRXaWR0aChXSURUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hUOgotCQkJCXNldEhlaWdodChIRUlHSFRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJCWdldEluY29taW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJCWdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1JFQURfT05MWToKLQkJCQlzZXRSZWFkT25seShSRUFEX09OTFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fTE9DQVRJT046Ci0JCQkJcmV0dXJuIExPQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyBsb2NhdGlvbiAhPSBudWxsIDogIUxPQ0FUSU9OX0VERUZBVUxULmVxdWFscyhsb2NhdGlvbik7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19XSURUSDoKLQkJCQlyZXR1cm4gd2lkdGggIT0gV0lEVEhfRURFRkFVTFQ7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19IRUlHSFQ6Ci0JCQkJcmV0dXJuIGhlaWdodCAhPSBIRUlHSFRfRURFRkFVTFQ7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzoKLQkJCQlyZXR1cm4gaW5jb21pbmdDb25uZWN0aW9ucyAhPSBudWxsICYmICFpbmNvbWluZ0Nvbm5lY3Rpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJCXJldHVybiBvdXRnb2luZ0Nvbm5lY3Rpb25zICE9IG51bGwgJiYgIW91dGdvaW5nQ29ubmVjdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fUkVBRF9PTkxZOgotCQkJCXJldHVybiByZWFkT25seSAhPSBSRUFEX09OTFlfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBjb25zdW1lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEdyYXBoTm9kZSB1bWFDb250YWluZXI7Ci0KLQlwcml2YXRlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSB1bWFEaWFncmFtOwotCi0JcHJpdmF0ZSBEaWFncmFtIGRpYWdyYW07Ci0KLQlwcm90ZWN0ZWQgR3JhcGhOb2RlIGdyYXBoTm9kZTsKLQotCXByb3RlY3RlZCBib29sZWFuIG5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCi0JcHJvdGVjdGVkIElOb2RlQ2hhbmdlTGlzdGVuZXIgbWV0aG9kRWxlbWVudEFkYXB0ZXI7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2aXNpYmxlOwotCQotCS8qKgotCSAqIGFkZERlZmF1bHRXb3JrT3JkZXIgaXMgbW92ZWQgZnJvbQotCSAqIEdyYXBoaWNhbERhdGFIZWxwZXIuYWRkRGVmYXVsdFdvcmtPcmRlcihOYW1lZE5vZGVJbXBsLAotCSAqIFdvcmticmVha2Rvd25FbGVtZW50KSBNZXRob2Qgd2lsbCBzZXQgbm90aWZpY2F0aW9uRW5hYmxlZCBmbGFnIHRvIGZhbHNlCi0JICogb2YgYWxsIGFkYXB0ZXJzIG9mIHR5cGUgTWV0aG9kRWxlbWVudEFkYXB0ZXIgb2YgU3VjY2Vzc29yIG9iamVjdCBiZWZvcmUKLQkgKiBjcmVhdGluZyBhIFdvcmtPcmRlciBvYmplY3QuIEFmdGVyIGNyZWF0aW9uIG9mIFdvcmtPcmRlciAoUHJlZGVjZXNzb3IKLQkgKiBsaW5rKSByZXN0b3JlcyB0aGUgbm90aWZpY2F0aW9uRW5hYmxlZCBmbGFnIG9mIFN1Y2Nlc3NvcidzIGFkYXB0ZXJzIG9mCi0JICogdHlwZSBNZXRob2RFbGVtZW50QWRhcHRlci4KLQkgKiAKLQkgKiBlZzogSWYgYW4gQWN0aXZpdHkgImFjdEEiIGlzIGV4dGVuZGVkIGluIGFub3RoZXIgQ1AuIEJhc2UgImFjdEEiIEFECi0JICogZGlhZ3JhbSBpcyBvcGVuZWQsIGFuZCBFeHRlbmRlZCAiYWN0QSIgQUQgRGlhZ3JhbSBpcyBvcGVuZWQuIE9uIGNyZWF0aW5nCi0JICogcHJlZGVjZXNzb3IgbGluayBiZXR3ZWVuIGFueSB0d28gY2hpbGQgYWN0aXZpdGllcywgY3JlYXRlcyBhIGV4dHJhIGxpbmsKLQkgKiBpbiBFeHRlbmRlZCAiYWN0QSIgQUQgZGlhZ3JhbSwgYmVjYXVzZSBjcmVhdGluZyB3b3Jrb3JkZXIgd2lsbCBub3RpZnkgdGhlCi0JICogZXh0ZW5kZWQgImFjdEEiIGRpYWdyYW0gdG8gZHJhdyBhIGxpbmsuIFRvIGF2b2lkIGR1cGxpY2F0ZSBsaW5rcyBpbiB0aGUKLQkgKiBleHRlbmRlZCBhY3Rpdml0eSBkaWFncmFtLCB3ZSBoYXZlIHRvIHNldCBub3RpZmljYXRpb25FbmFibGVkIGZsYWcgdG8KLQkgKiBmYWxzZSwgYmVmb3JlIGNyZWF0aW5nIGEgV29ya09yZGVyIG9iamVjdC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyIGFkZERlZmF1bHRXb3JrT3JkZXIoTmFtZWROb2RlSW1wbCBub2RlLAotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJYm9vbGVhbiBub3RpZnkgPSBub2RlLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTGlzdCBsaXN0ID0gKChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZS5nZXRPYmplY3QoKSkuZUFkYXB0ZXJzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEFkYXB0ZXIpIHsKLQkJCQlOb2RlSW1wbCBub2Rlb2JqID0gKE5vZGVJbXBsKSAoKE1ldGhvZEVsZW1lbnRBZGFwdGVyKSBvYmopCi0JCQkJCQkuZ2V0Tm9kZSgpOwotCQkJCWJvb2xlYW4gcHJlZE5vdGlmaWNhdGlvbiA9IG5vZGUubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQkoKE5vZGVJbXBsKSAoKChNZXRob2RFbGVtZW50QWRhcHRlcikgb2JqKS5nZXROb2RlKCkpKS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJbWFwLnB1dChub2Rlb2JqLCBuZXcgQm9vbGVhbihwcmVkTm90aWZpY2F0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCW5vZGUuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm4gVW1hVXRpbC5jcmVhdGVEZWZhdWx0V29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkuZ2V0T2JqZWN0KCksIHByZWRCcmVha2Rvd25FbGVtZW50KTsKLQkJfSBmaW5hbGx5IHsKLQkJCW5vZGUuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZnkpOwotCQkJU2V0IHNldCA9IG1hcC5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNldC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IG9iaiA9IG1hcC5nZXQob2JqZWN0KTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJCQlib29sZWFuIHByZWRub3QgPSAoKEJvb2xlYW4pIG9iaikuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCSgoTm9kZUltcGwpIG9iamVjdCkubm90aWZpY2F0aW9uRW5hYmxlZCA9IHByZWRub3Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkgewotCQlEaWFncmFtSW1wbCBkaWFncmFtID0gKERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCk7Ci0JCXJldHVybiBkaWFncmFtLmlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLQkJcmV0dXJuIHZpc2libGUgOwotCX0KLQotfSAvLyBOb2RlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Sb2xlTm9kZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvUm9sZU5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE4ZjFkY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Sb2xlTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTm9kZUltcGwgZXh0ZW5kcyBOYW1lZE5vZGVJbXBsIGltcGxlbWVudHMgUm9sZU5vZGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBSb2xlTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgUm9sZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLlJPTEVfTk9ERTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFJvbGVEZXNjcmlwdG9yQWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBSb2xlRGVzY3JpcHRvckFkYXB0ZXIuY2xhc3M7Ci0JfQotfSAvLyBSb2xlTm9kZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvUm9sZVRhc2tDb21wb3NpdGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1JvbGVUYXNrQ29tcG9zaXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNWZjNGNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvUm9sZVRhc2tDb21wb3NpdGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgVGFzayBDb21wb3NpdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZVRhc2tDb21wb3NpdGVJbXBsI2dldFJvd0luZGV4IDxlbT5Sb3cgSW5kZXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUltcGwgZXh0ZW5kcyBOb2RlQ29udGFpbmVySW1wbCBpbXBsZW1lbnRzCi0JCVJvbGVUYXNrQ29tcG9zaXRlIHsKLQkKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um93SW5kZXgoKSA8ZW0+Um93IEluZGV4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb3dJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUk9XX0lOREVYX0VERUZBVUxUID0gMDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvd0luZGV4KCkgPGVtPlJvdyBJbmRleDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um93SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgcm93SW5kZXggPSBST1dfSU5ERVhfRURFRkFVTFQ7Ci0KLS8vCXByaXZhdGUgaW50IHJvd0luZGV4OwotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBSb2xlVGFza0NvbXBvc2l0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgUm9sZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLlJPTEVfVEFTS19DT01QT1NJVEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRSb3dJbmRleCgpIHsKLQkJcmV0dXJuIHJvd0luZGV4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvd0luZGV4KGludCBuZXdSb3dJbmRleCkgewotCQlpbnQgb2xkUm93SW5kZXggPSByb3dJbmRleDsKLQkJcm93SW5kZXggPSBuZXdSb3dJbmRleDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLlJPTEVfVEFTS19DT01QT1NJVEVfX1JPV19JTkRFWCwgb2xkUm93SW5kZXgsIHJvd0luZGV4KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRSb3dJbmRleCgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYOgotCQkJCXNldFJvd0luZGV4KCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfVEFTS19DT01QT1NJVEVfX1JPV19JTkRFWDoKLQkJCQlzZXRSb3dJbmRleChST1dfSU5ERVhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYOgotCQkJCXJldHVybiByb3dJbmRleCAhPSBST1dfSU5ERVhfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyb3dJbmRleDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocm93SW5kZXgpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKENvbGxlY3Rpb24gbWl4ZWRDb2xsZWN0aW9uLCBPYmplY3QgZWxlbWVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtaXhlZENvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiggZWxlbWVudCA9PSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSkgKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9CQkKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNzZXRPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCQlzdXBlci5zZXRPYmplY3QobmV3T2JqZWN0KTsKLQkJcG9wdWxhdGVOb2RlcyhuZXdPYmplY3QpOwotLy8JCWlmIChuZXdPYmplY3QgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotLy8JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA9IChSb2xlRGVzY3JpcHRvcikgbmV3T2JqZWN0OwotLy8JCQlBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsIGRpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCkgZ2V0RGlhZ3JhbSgpOwotLy8JCQlDb2xsZWN0aW9uIGFsbEVsZW1lbnRzID0gZGlhZ3JhbS5nZXRBbGxCcmVha2Rvd25FbGVtZW50cygpOwotLy8JCQlMaXN0IHByaW1hcnlUYXNrRGVzY3JpcHRvcnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjcmlwdG9yKTsKLS8vCQkJaWYgKCFwcmltYXJ5VGFza0Rlc2NyaXB0b3JzLmlzRW1wdHkoKSkgeyAvLyBvdmVycmlkaW5nCi0vLwkJCQkJCQkJCQkJCQkJCQkJCi0vLwkJCQkvLyB1c2UgbGlzdCB0byBtYWludGFpbiBvcmRlciBvZgotLy8JCQkJLy8gdGFza2Rlc2NyaXB0b3JzLgotLy8JCQkJTGlzdCB0YXNrRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCQl0YXNrRGVzY3JpcHRvcnMuYWRkQWxsKHByaW1hcnlUYXNrRGVzY3JpcHRvcnMpOwotLy8JCQkJLy8gdGFza0Rlc2NyaXB0b3JzLmFkZEFsbChyb2xlRGVzY3JpcHRvci5nZXRQZXJmb3Jtc0FkZGl0aW9uYWxseSgpKTsKLS8vCQkJCS8vIHRhc2tEZXNjcmlwdG9ycy5hZGRBbGwocm9sZURlc2NyaXB0b3IuZ2V0QXNzaXN0c0luKCkpOwotLy8KLS8vCQkJCUhhc2hTZXQgc2VsZWN0ZWREZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0vLwkJCQlMaXN0IHRhc2tOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJCQotLy8JCQkJU3RyaW5nIGF1dG9sYXlvdXQgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldEF1dG9MYXlvdXRGbGFnKChBY3Rpdml0eURldGFpbERpYWdyYW0pZ2V0RGlhZ3JhbSgpKTsgCi0vLwkJCQlpZihhdXRvbGF5b3V0ICE9IG51bGwpewotLy8JCQkJCWludCBpbmRleCA9IDA7Ci0vLwkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWxsRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLS8vCQkJCQkJb2JqID0gVG5nVXRpbC51bndyYXAob2JqKTsKLS8vCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yCi0vLwkJCQkJCQkJJiYgVG5nVXRpbC5jb250YWlucyh0YXNrRGVzY3JpcHRvcnMsIG9iaikpIHsKLS8vCQkJCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBvYmo7Ci0vLwotLy8JCQkJCQkJLy8gZWxpbWluYXRlIGRlc2NyaXB0b3IgdGhhdCBpcyBkdXBsaWNhdGUsCi0vLwkJCQkJCQkvLyBzdXBwcmVzc2VkIG9yIGZpbHRlcmVkIG91dAotLy8JCQkJCQkJLy8KLS8vCQkJCQkJCWlmICghc2VsZWN0ZWREZXNjcmlwdG9ycy5jb250YWlucyh0YXNrRGVzY3JpcHRvcikKLS8vCQkJCQkJCS8vICYmIGNvbnRhaW5zKGFsbEVsZW1lbnRzLCB0YXNrRGVzY3JpcHRvcikgLy8gbWFrZQotLy8JCQkJCQkJLy8gc3VyZSB0aGF0IHRhc2sgZGVzY3JpcHRvciBpcyBvZiB0aGUgb3duaW5nCi0vLwkJCQkJCQkvLyBhY3Rpdml0eQotLy8JCQkJCQkJKSB7Ci0vLwkJCQkJCQkJc2VsZWN0ZWREZXNjcmlwdG9ycy5hZGQodGFza0Rlc2NyaXB0b3IpOwotLy8JCQkJCQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUoCi0vLwkJCQkJCQkJCQl0aGlzLCB0YXNrRGVzY3JpcHRvciwKLS8vCQkJCQkJCQkJCVRhc2tOb2RlLmNsYXNzKTsKLS8vCQkJCQkJCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0vLwkJCQkJCQkJCW5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0vLwkJCQkJCQkJCQkJLmNyZWF0ZVRhc2tOb2RlKCk7Ci0vLwkJCQkJCQkJCW5vZGUuc2V0RGlhZ3JhbShnZXREaWFncmFtKCkpOwotLy8JCQkJCQkJCQlub2RlLnNldE9iamVjdCh0YXNrRGVzY3JpcHRvcik7Ci0vLwkJCQkJCQkJCSgoTmFtZWROb2RlSW1wbCkgbm9kZSkKLS8vCQkJCQkJCQkJCQkuc2V0SXRlbVByb3ZpZGVyKGFsbEVsZW1lbnRzKTsKLS8vCQkJCQkJCQkJaWYoR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kUHJvcGVydHkobm9kZS5nZXRHcmFwaE5vZGUoKSwgCi0vLwkJCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYKSA9PSBudWxsCi0vLwkJCQkJCQkJCQkJfHwgR3JhcGhpY2FsRGF0YUhlbHBlci5pc0F1dG9MYXlvdXQoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSlnZXREaWFncmFtKCkpKXsKLS8vCQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuY3JlYXRlUHJvcGVydHkobm9kZQotLy8JCQkJCQkJCQkJCS5nZXRHcmFwaE5vZGUoKSwKLS8vCQkJCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgsCi0vLwkJCQkJCQkJCQkJbmV3IEludGVnZXIoaW5kZXgpLnRvU3RyaW5nKCkpOwotLy8JCQkJCQkJCQkJaW5kZXgrKzsKLS8vCQkJCQkJCQkJfQotLy8JCQkJCQkJCQkKLS8vCQkJCQkJCQl9Ci0vLwkJCQkJCQkJdGFza05vZGVzLmFkZChub2RlKTsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCQkvLyBTb3J0IHRoZSB0YXNrTm9kZSBiYXNlZCBvbiB0aGVpciBpbmRleCBpZiBhdXRvbGF5b3V0IGlzCi0vLwkJCQkJLy8gZmFsc2UKLS8vCQkJCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9fTEFZT1VUX1ZBTFVFX0ZBTFNFCi0vLwkJCQkJCQkuZXF1YWxzKGF1dG9sYXlvdXQpKSB7Ci0vLwkJCQkJCUNvbGxlY3Rpb25zLnNvcnQodGFza05vZGVzLCBjb21wYXJhdG9yKTsKLS8vCQkJCQl9Ci0vLwkJCSAgfWVsc2V7Ci0vLwkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFza0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0vLwkJCQkJCQotLy8JCQkJCQkvLyBlbGltaW5hdGUgZGVzY3JpcHRvciB0aGF0IGlzIGR1cGxpY2F0ZSwgc3VwcHJlc3NlZCBvciBmaWx0ZXJlZCBvdXQKLS8vCQkJCQkJLy8KLS8vCQkJCQkJaWYoIXNlbGVjdGVkRGVzY3JpcHRvcnMuY29udGFpbnModGFza0Rlc2NyaXB0b3IpCi0vLwkJCQkJCQkJJiYgY29udGFpbnMoYWxsRWxlbWVudHMsIHRhc2tEZXNjcmlwdG9yKSAvLyBtYWtlIHN1cmUgdGhhdCB0YXNrIGRlc2NyaXB0b3IgaXMgb2YgdGhlIG93bmluZyBhY3Rpdml0eQotLy8JCQkJCQkpIHsKLS8vCQkJCQkJCXNlbGVjdGVkRGVzY3JpcHRvcnMuYWRkKHRhc2tEZXNjcmlwdG9yKTsJCQkJCQotLy8JCQkJCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKGdldERpYWdyYW0oKSwKLS8vCQkJCQkJCQkJdGFza0Rlc2NyaXB0b3IsIFRhc2tOb2RlLmNsYXNzKTsKLS8vCQkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotLy8JCQkJCQkJbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza05vZGUoKTsKLS8vCQkJCQkJCW5vZGUuc2V0RGlhZ3JhbShnZXREaWFncmFtKCkpOwotLy8JCQkJCQkJbm9kZS5zZXRPYmplY3QodGFza0Rlc2NyaXB0b3IpOwotLy8JCQkJCQkJKChOYW1lZE5vZGVJbXBsKSBub2RlKS5zZXRJdGVtUHJvdmlkZXIoYWxsRWxlbWVudHMpOwotLy8JCQkJCQl9Ci0vLwkJCQkJCXRhc2tOb2Rlcy5hZGQobm9kZSk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCQlpZighdGFza05vZGVzLmlzRW1wdHkoKSkgewotLy8JCQkJCS8vIGFkZCByb2xlIG5vZGUKLS8vCQkJCQkvLwotLy8JCQkJCU5vZGUgbm9kZSA9IChOYW1lZE5vZGVJbXBsKSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVOb2RlKCk7Ci0vLwkJCQkJbm9kZS5zZXREaWFncmFtKGdldERpYWdyYW0oKSk7Ci0vLwkJCQkJbm9kZS5zZXRPYmplY3Qocm9sZURlc2NyaXB0b3IpOwotLy8JCQkJCSgoTmFtZWROb2RlSW1wbCkgbm9kZSkuc2V0SXRlbVByb3ZpZGVyKGFsbEVsZW1lbnRzKTsKLS8vCQkJCQlnZXROb2RlcygpLmFkZChub2RlKTsKLS8vCQkJCQkvLyBhZGQgdGFzayBub2RlcwotLy8JCQkJCS8vCi0vLwkJCQkJZ2V0Tm9kZXMoKS5hZGRBbGwodGFza05vZGVzKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQotCQkKLQl9Ci0JCi0JcHVibGljIEdyYXBoTm9kZSBnZXRHcmFwaE5vZGUoTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50KSB7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCWlmIChnZXRVTUFEaWFncmFtKCkgPT0gbnVsbCkgewotCQkJCS8vIG5ldyBNZXRob2RFbGVtZW50Ci0JCQkJLy8KLQkJCQlyZXR1cm4gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVHcmFwaE5vZGUobWV0aG9kRWxlbWVudCk7Ci0JCQl9Ci0JCQlHcmFwaE5vZGUgbm9kZSA9IGZpbmRHcmFwaE5vZGUoZ2V0VU1BRGlhZ3JhbSgpLCBtZXRob2RFbGVtZW50KTsKLQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQlub2RlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVHcmFwaE5vZGUobWV0aG9kRWxlbWVudCk7Ci0JCQkJLy8gY3JlYXRlR3JhcGhDb25uZWN0b3JzKG5vZGUsIGdldFVNQURpYWdyYW0oKSk7Ci0JCQkJZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpLmFkZChub2RlKTsKLQkJCX0KLQkJCVN0cmluZyBhdXRvbGF5b3V0ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRBdXRvTGF5b3V0RmxhZygoQWN0aXZpdHlEZXRhaWxEaWFncmFtKWdldERpYWdyYW0oKSk7Ci0JCQlpZihhdXRvbGF5b3V0ICE9IG51bGwpewotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuY3JlYXRlUHJvcGVydHkobm9kZSwgR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYLCBuZXcgSW50ZWdlcihyb3dJbmRleCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgR3JhcGhOb2RlIGZpbmRHcmFwaE5vZGUoRGlhZ3JhbSBkaWFncmFtLCBPYmplY3QgbWV0aG9kRWxlbWVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJR3JhcGhOb2RlIGVsZW1lbnQgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmdldFNlbWFudGljTW9kZWwoKSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UKLQkJCQkJJiYgbWV0aG9kRWxlbWVudCA9PSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGVsZW1lbnQKLQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpKS5nZXRFbGVtZW50KCkpIHsKLQotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kUHJvcGVydHkoZWxlbWVudCwgR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYKTsKLQkJCQkKLQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgaW5kZXggPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAoaW5kZXggIT0gbnVsbCkgewotCQkJCQkJaWYgKGdldFJvd0luZGV4KCkgPT0gbmV3IEludGVnZXIoaW5kZXgpLmludFZhbHVlKCkpCi0JCQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJCX0KLQkJCQl9ZWxzZXsKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLS8vCXB1YmxpYyBHcmFwaE5vZGUgY3JlYXRlR3JhcGhOb2RlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotLy8JCUdyYXBoTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVHcmFwaE5vZGUoZWxlbWVudCk7Ci0vLwkJR3JhcGhpY2FsRGF0YUhlbHBlci5jcmVhdGVQcm9wZXJ0eShub2RlLAotLy8JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYLCBuZXcgSW50ZWdlcihyb3dJbmRleCkKLS8vCQkJCQkJLnRvU3RyaW5nKCkpOwotLy8JCXJldHVybiBub2RlOwotLy8JfQotCQotCXByaXZhdGUgY2xhc3MgUm9sZURlc2NyaXB0b3JBZGFwdGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25hbE5vZGVMaW5rIHsKLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmKG1zZyBpbnN0YW5jZW9mIE9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbikgewotCQkJCU9iamVjdCBmZWF0dXJlID0gKChPcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24pbXNnKS5nZXRPcHBzaXRlRmVhdHVyZSgpOwotCQkJCWlmKGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9ycykgewotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCQlhZGROb2RlKChUYXNrRGVzY3JpcHRvcikgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCQlyZW1vdmVOb2RlKG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlhZGROb2RlKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJcmVtb3ZlTm9kZSgoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1PVkVFRUVFRUVEIik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5vZGUoT2JqZWN0IG9sZFZhbHVlKSB7Ci0JCUNvbGxlY3Rpb24gcmVtb3ZlZE5vZGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob2xkVmFsdWUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgUm9sZU5vZGUpIHsKLQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBkID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpZ2V0RGlhZ3JhbSgpOwotCQkJCQlMaXN0IGxpc3QgPSAvL0Fzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMoKFJvbGVEZXNjcmlwdG9yKSBub2RlLmdldE9iamVjdCgpKTsKLQkJCQkJCWQuZ2V0UmVhbGl6ZWRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKChSb2xlRGVzY3JpcHRvcikgbm9kZS5nZXRPYmplY3QoKSk7Ci0JCQkJCWlmIChsaXN0ID09IG51bGwgfHwgbGlzdC5zaXplKCkgPCAxKSB7Ci0JCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQkJcmVtb3ZlZE5vZGVzLmFkZChub2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChub2RlLmdldE9iamVjdCgpID09IG9sZFZhbHVlKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCQlyZW1vdmVkTm9kZXMuYWRkKG5vZGUpOwotCQkJCWlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCU5vZGUgd3Bub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSgKLQkJCQkJCQkoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBnZXREaWFncmFtKCksIG9sZFZhbHVlKTsKLQkJCQkJZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCkucmVtb3ZlKHdwbm9kZSk7Ci0JCQkJCXdwbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUoCi0JCQkJCQkJKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZ2V0RGlhZ3JhbSgpLCBvbGRWYWx1ZSk7Ci0JCQkJCWdldERpYWdyYW0oKS5nZXROb2RlcygpLnJlbW92ZSh3cG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQlnZXREaWFncmFtKCkuZ2V0Tm9kZXMoKS5yZW1vdmUodGhpcyk7Ci0JCX0KLQkJLy8gcHVzaEJhY2tUb0RpYWdyYW0ocmVtb3ZlZE5vZGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGROb2RlKFRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJYWRkTm9kZShnZXROb2RlcygpLCBkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTm9kZShDb2xsZWN0aW9uIG5vZGVzLCBUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0KLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSgoTm9kZUNvbnRhaW5lcikgZGlhZ3JhbSwKLQkJCQlkZXNjcmlwdG9yKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKChUYXNrRGVzY3JpcHRvcikgZGVzY3JpcHRvcikKLQkJCQkJCS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQkJCU5vZGUgcm9sZU5vZGUgPSAoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKSkuZmluZE5vZGUoCi0JCQkJCQkoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBnZXREaWFncmFtKCksIHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocm9sZU5vZGUgPT0gbnVsbCkgewotCQkJCQlyb2xlTm9kZSA9ICgoQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCkgZ2V0RGlhZ3JhbSgpKQotCQkJCQkJCS5jcmVhdGVSb2xlVGFza0NvbXBvc2l0ZShyb2xlRGVzY3JpcHRvcik7Ci0JCQkJCWdldERpYWdyYW0oKS5nZXROb2RlcygpLmFkZChyb2xlTm9kZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbm9kZSA9IGRpYWdyYW0uY3JlYXRlTm9kZShkZXNjcmlwdG9yKTsKLQkJCQkJaW50IGkgPSBnZXROZXh0SW5kZXgoZ2V0Tm9kZXMoKSk7Ci0JCQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBUYXNrTm9kZUltcGwpewotCQkJCQkJKChUYXNrTm9kZUltcGwpbm9kZSkuZG9TZXRJbmRleChpICsgMSk7Ci0JCQkJCX0KLQkJCQkJLy9jcmVhdGVUYXNrSW5wdXRPdXRwdXROb2RlcyhkZXNjcmlwdG9yLCBnZXREaWFncmFtKCkuZ2V0Tm9kZXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKG5vZGUgIT0gbnVsbCl7Ci0JCQlub2Rlcy5hZGQobm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTm9kZShDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCUNvbGxlY3Rpb24gbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnRzLmNvbnRhaW5zKG5vZGUuZ2V0T2JqZWN0KCkpKSB7Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCWdldE5vZGVzKCkucmVtb3ZlQWxsKG5vZGVzKTsKLQkJLy8gcHVzaEJhY2tUb0RpYWdyYW0obm9kZXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGROb2RlKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJQ29sbGVjdGlvbiBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCWFkZE5vZGUobm9kZXMsIGRlc2NyaXB0b3IpOwotCQl9Ci0KLQkJZ2V0Tm9kZXMoKS5hZGRBbGwobm9kZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBSb2xlRGVzY3JpcHRvckFkYXB0ZXIuY2xhc3M7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBnZXROZXh0SW5kZXgoTGlzdCBub2RlcykgewotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7CQkJCi0vLwkJCWlmKG9iaiBpbnN0YW5jZW9mIE5vZGUpewotLy8JCQkJTm9kZSBub2RlID0gKE5vZGUpb2JqOwotLy8JCQkJLy9TdHJpbmcgdGVtcCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZFByb3BlcnR5KG5vZGUuZ2V0R3JhcGhOb2RlKCksIEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCkuZ2V0VmFsdWUoKTsKLS8vCQkJCUxpc3QgbGlzdCA9IG5vZGUuZ2V0R3JhcGhOb2RlKCkuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLS8vCQkJCWlmKGxpc3QgIT0gbnVsbCAmJiAhbGlzdC5pc0VtcHR5KCkpewotLy8JCQkJCWZvciAoaW50IGkgPSBsaXN0LnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0vLwkJCQkJCVByb3BlcnR5IHByb3AgPSAoUHJvcGVydHkpIGxpc3QuZ2V0KGkpOwotLy8JCQkJCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYLmVxdWFscyhwcm9wLmdldEtleSgpKSl7Ci0vLwkJCQkJCQlpbnQgdGVtcCAgPSBJbnRlZ2VyLnBhcnNlSW50KHByb3AuZ2V0VmFsdWUoKSk7Ci0vLwkJCQkJCQlpZih0ZW1wID4gaW5kZXggKSBpbmRleCA9IHRlbXA7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFRhc2tOb2RlSW1wbCkgewotCQkJCWludCBpZCA9ICgoVGFza05vZGVJbXBsKW9iaikuZG9HZXRJbmRleCgpOwotCQkJCWlmKGlkID4gaW5kZXgpIHsKLQkJCQkJaW5kZXggPSBpZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGV4OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyKSB7Ci0JCQlpZiAob2JqMSA9PSBvYmoyKQotCQkJCXJldHVybiAwOwotCQkJaWYob2JqMSBpbnN0YW5jZW9mIFRhc2tOb2RlSW1wbCAmJiBvYmoyIGluc3RhbmNlb2YgVGFza05vZGVJbXBsKXsKLQkJCQlUYXNrTm9kZUltcGwgbm9kZTEgPSAoVGFza05vZGVJbXBsKW9iajE7Ci0JCQkJVGFza05vZGVJbXBsIG5vZGUyID0gKFRhc2tOb2RlSW1wbClvYmoyOwotCQkJCWlmKG5vZGUxLmRvR2V0SW5kZXgoKSA+ICBub2RlMi5kb0dldEluZGV4KCkpCi0JCQkJCXJldHVybiAxOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCX07Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVUYXNrSW5wdXRPdXRwdXROb2RlcyhUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBDb2xsZWN0aW9uIG5vZGVzKSB7Ci0JCU5vZGUgbmV3Tm9kZSA9IG51bGw7Ci0JCWlmICghZGVzY3JpcHRvci5nZXRNYW5kYXRvcnlJbnB1dCgpLmlzRW1wdHkoKSkgewotCQkJbmV3Tm9kZSA9IGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKGRlc2NyaXB0b3IsCi0JCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUyk7Ci0JCQlub2Rlcy5hZGQobmV3Tm9kZSk7Ci0JCX0KLQkJaWYgKCFkZXNjcmlwdG9yLmdldE91dHB1dCgpLmlzRW1wdHkoKSkgewotCQkJbmV3Tm9kZSA9IGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKGRlc2NyaXB0b3IsCi0JCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpOwotCQkJbm9kZXMuYWRkKG5ld05vZGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZSgKLQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yLCBpbnQgdHlwZSkgewotCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3b3JrcHJvZHVjdENvbXBvc2l0ZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoKTsKLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0VU1BQ29udGFpbmVyKGdldEdyYXBoTm9kZSgpKTsKLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0RGlhZ3JhbShnZXREaWFncmFtKCkpOwotCQl3b3JrcHJvZHVjdENvbXBvc2l0ZS5zZXRUeXBlKHR5cGUpOwotCQl3b3JrcHJvZHVjdENvbXBvc2l0ZS5zZXRPYmplY3QodGFza0Rlc2NyaXB0b3IpOwotCQlyZXR1cm4gd29ya3Byb2R1Y3RDb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgVGFza05vZGUgY3JlYXRlVGFza05vZGUoVGFza0Rlc2NyaXB0b3IgdGQpIHsKLQkJVGFza05vZGUgdGFza05vZGUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYobm9kZSBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJVGFza05vZGUgdG4gPSAoVGFza05vZGUpIG5vZGU7Ci0JCQkJaWYodG4uZ2V0TGlua2VkRWxlbWVudCgpID09IHRkKSB7Ci0JCQkJCXRhc2tOb2RlID0gdG47Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZih0YXNrTm9kZSA9PSBudWxsKSB7Ci0JCQl0YXNrTm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza05vZGUoKTsKLQkJCXRhc2tOb2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLQkJfQotCQl0YXNrTm9kZS5zZXRPYmplY3QodGQpOwotCQlyZXR1cm4gdGFza05vZGU7Ci0JfQotCQotCXByaXZhdGUgUm9sZU5vZGUgY3JlYXRlUm9sZU5vZGUoUm9sZURlc2NyaXB0b3IgcmQpIHsKLQkJUm9sZU5vZGUgcm9sZU5vZGUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYobm9kZSBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQkJUm9sZU5vZGUgcm4gPSAoUm9sZU5vZGUpIG5vZGU7Ci0JCQkJaWYocm4uZ2V0TGlua2VkRWxlbWVudCgpID09IHJkKSB7Ci0JCQkJCXJvbGVOb2RlID0gcm47Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihyb2xlTm9kZSA9PSBudWxsKSB7Ci0JCQlyb2xlTm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZU5vZGUoKTsKLQkJCXJvbGVOb2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLQkJCXJvbGVOb2RlLnNldE9iamVjdChyZCk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVOb2RlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZU5vZGVzKE9iamVjdCBuZXdPYmplY3QpewotCQkKLQkJaWYgKG5ld09iamVjdCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA9IChSb2xlRGVzY3JpcHRvcikgbmV3T2JqZWN0OwotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLQkJCUNvbGxlY3Rpb24gYWxsRWxlbWVudHMgPSBkaWFncmFtLmdldEFsbEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQlMaXN0IHRhc2tOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3QgcHJpbWFyeVRhc2tEZXNjcmlwdG9ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKCFwcmltYXJ5VGFza0Rlc2NyaXB0b3JzLmlzRW1wdHkoKSkgeyAvLyBvdmVycmlkaW5nCi0JCQkJCQkJCQkJCQkJCQkJCQotCQkJCUxpc3QgdGFza0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXRhc2tEZXNjcmlwdG9ycy5hZGRBbGwocHJpbWFyeVRhc2tEZXNjcmlwdG9ycyk7Ci0JCQkJSGFzaFNldCBzZWxlY3RlZERlc2NyaXB0b3JzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlib29sZWFuIGF1dG9MYXlvdXQgPSAoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpZ2V0RGlhZ3JhbSgpKS5pc0F1dG9MYXlvdXQoKTsKLQkJCQlpZihhdXRvTGF5b3V0KSB7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWludCByb3dUYXNrc0NvdW50ID0gMDsKLQkJCQkJaW50IHN0YXJ0Q291bnQgPSAwOwotCQkJCQkKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWxsRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlvYmogPSBUbmdVdGlsLnVud3JhcChvYmopOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yCi0JCQkJCQkJCSYmIFRuZ1V0aWwuY29udGFpbnModGFza0Rlc2NyaXB0b3JzLCBvYmopKSB7Ci0JCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIG9iajsKLQkJCQkJCQkKLQkJCQkJCQlpZihzdGFydENvdW50IDwgcm93SW5kZXggKiBHcmFwaGljYWxEYXRhSGVscGVyLmdldFRhc2tzUGVyUm93KCkpewotCQkJCQkJCQlzdGFydENvdW50Kys7Ci0JCQkJCQkJfSBlbHNlIHsKLQotCQkJCQkJCQlpZiAoIXNlbGVjdGVkRGVzY3JpcHRvcnMKLQkJCQkJCQkJCQkuY29udGFpbnModGFza0Rlc2NyaXB0b3IpKSB7Ci0JCQkJCQkJCQlzZWxlY3RlZERlc2NyaXB0b3JzLmFkZCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJCQkJCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKAotCQkJCQkJCQkJCQl0aGlzLCB0YXNrRGVzY3JpcHRvciwKLQkJCQkJCQkJCQkJVGFza05vZGUuY2xhc3MpOwotCQkJCQkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotLy8JCQkJCQkJCQkJbm9kZSA9IGNyZWF0ZVRhc2tOb2RlKHRhc2tEZXNjcmlwdG9yLAotLy8JCQkJCQkJCQkJCQlpbmRleCwgYWxsRWxlbWVudHMpOwotCQkJCQkJCQkJCW5vZGUgPSBjcmVhdGVUYXNrTm9kZSh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJCQkJCQkJKChOYW1lZE5vZGVJbXBsKSBub2RlKS5zZXRJdGVtUHJvdmlkZXIoYWxsRWxlbWVudHMpOwotCQkJCQkJCQkJCVRhc2tOb2RlSW1wbCB0biA9IChUYXNrTm9kZUltcGwpIG5vZGU7Ci0JCQkJCQkJCQkJaWYgKGF1dG9MYXlvdXQgfHwgdG4uZG9HZXRJbmRleCgpID09IC0xKSB7Ci0JCQkJCQkJCQkJCXRuLmRvU2V0SW5kZXgoaW5kZXgpOwotCQkJCQkJCQkJCQlpbmRleCsrOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkvL3JldHVybiBub2RlOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJCQkJCWlmIChyb3dUYXNrc0NvdW50IDwgR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCQkJCQkJLmdldFRhc2tzUGVyUm93KCkpIHsKLQkJCQkJCQkJCQkJdGFza05vZGVzLmFkZChub2RlKTsKLQkJCQkJCQkJCQkJcm93VGFza3NDb3VudCsrOwotCQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBTb3J0IHRoZSB0YXNrTm9kZSBiYXNlZCBvbiB0aGVpciBpbmRleCBpZiBhdXRvbGF5b3V0IGlzCi0JCQkJCS8vIGZhbHNlCi0JCQkJCWlmICghYXV0b0xheW91dCkgewotCQkJCQkJQ29sbGVjdGlvbnMuc29ydCh0YXNrTm9kZXMsIGNvbXBhcmF0b3IpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTGlzdCBvbGRUYXNrRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCURpYWdyYW0gdW1hRGlhZ3JhbSA9IGdldFVNQURpYWdyYW0oKTsKLQkJCQkJaWYodW1hRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBMYW1lIHdheSBvZiBkb2luZyB0aGlzLCB0byBmaXggYSBkZWZlY3Qgb2YgMS4wIHRvIDEuMC4xIG1pZ3JhdGlvbgkJCQkgIAotCQkJCQkJTGlzdCBncmFwaE5vZGVzID0gdW1hRGlhZ3JhbS5nZXRDb250YWluZWQoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdyYXBoTm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJR3JhcGhOb2RlIGVsZW1lbnQgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlPYmplY3QgYnJpZGdlID0gZWxlbWVudC5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCQkJaWYoYnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSl7Ci0JCQkJCQkJCU9iamVjdCB0YXNrT2JqZWN0ID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKWJyaWRnZSkuZ2V0RWxlbWVudCgpOwotCQkJCQkJCQlMaXN0IGxpc3QgPSBlbGVtZW50LmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQkJCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsCi0JCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX1dPUktfUFJPRFVDVF9DT01QT1NJVEVfVFlQRSk7Ci0JCQkJCQkJCWlmICh0YXNrRGVzY3JpcHRvcnMuY29udGFpbnModGFza09iamVjdCkgJiYgcHJvcGVydHkgPT0gbnVsbCkgewotCQkJCQkJCQkJb2xkVGFza0Rlc2NyaXB0b3JzLmFkZCh0YXNrT2JqZWN0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZihub2RlLmdldExpbmtlZEVsZW1lbnQoKSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJCW9sZFRhc2tEZXNjcmlwdG9ycy5hZGQobm9kZS5nZXRMaW5rZWRFbGVtZW50KCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbGRUYXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0KLQkJCQkJCS8vIGVsaW1pbmF0ZSBkZXNjcmlwdG9yIHRoYXQgaXMgZHVwbGljYXRlLCBzdXBwcmVzc2VkIG9yIGZpbHRlcmVkIG91dAotCQkJCQkJLy8KLQkJCQkJCWlmKCFzZWxlY3RlZERlc2NyaXB0b3JzLmNvbnRhaW5zKHRhc2tEZXNjcmlwdG9yKQotCQkJCQkJCQkmJiBjb250YWlucyhhbGxFbGVtZW50cywgdGFza0Rlc2NyaXB0b3IpIC8vIG1ha2Ugc3VyZSB0aGF0IHRhc2sgZGVzY3JpcHRvciBpcyBvZiB0aGUgb3duaW5nIGFjdGl2aXR5Ci0JCQkJCQkpIHsKLQkJCQkJCQlzZWxlY3RlZERlc2NyaXB0b3JzLmFkZCh0YXNrRGVzY3JpcHRvcik7CQkJCQkKLQkJCQkJCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKGdldERpYWdyYW0oKSwKLQkJCQkJCQkJCXRhc2tEZXNjcmlwdG9yLCBUYXNrTm9kZS5jbGFzcyk7Ci0JCQkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCQkJCQlub2RlID0gY3JlYXRlVGFza05vZGUodGFza0Rlc2NyaXB0b3IpOwotCQkJCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0JCQkJCQkJfQotCQkJCQkJCXRhc2tOb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZighdGFza05vZGVzLmlzRW1wdHkoKSkgewotCQkJCS8vIGFkZCByb2xlIG5vZGUKLQkJCQkvLwotCQkJCU5hbWVkTm9kZUltcGwgbmFtZWROb2RlID0gKChOYW1lZE5vZGVJbXBsKSBjcmVhdGVSb2xlTm9kZShyb2xlRGVzY3JpcHRvcikpOwotCQkJCW5hbWVkTm9kZS52aXNpYmxlID0gdHJ1ZTsKLQkJCQluYW1lZE5vZGUuc2V0SXRlbVByb3ZpZGVyKGFsbEVsZW1lbnRzKTsKLQkJCQlnZXROb2RlcygpLmFkZChuYW1lZE5vZGUpOwkJCi0JCQkJdGFza05vZGVzLmFkZChuYW1lZE5vZGUpOwotCQkJfQotCQkJc2VsZWN0Tm9kZXModGFza05vZGVzKTsKLQkJfQotCQkKLQl9Ci0JCi0vLwlwdWJsaWMgTm9kZSBjcmVhdGVUYXNrTm9kZShUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciwgaW50IGluZGV4LCBDb2xsZWN0aW9uIGFsbEVsZW1lbnRzKSB7Ci0vLwkJTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrTm9kZSgpOwotLy8JCW5vZGUuc2V0RGlhZ3JhbShnZXREaWFncmFtKCkpOwotLy8JCW5vZGUuc2V0T2JqZWN0KHRhc2tEZXNjcmlwdG9yKTsKLS8vCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0vLwkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZFByb3BlcnR5KG5vZGUuZ2V0R3JhcGhOb2RlKCksCi0vLwkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgpID09IG51bGwKLS8vCQkJCXx8IEdyYXBoaWNhbERhdGFIZWxwZXIKLS8vCQkJCQkJLmlzQXV0b0xheW91dCgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBnZXREaWFncmFtKCkpKSB7Ci0vLwkJCUdyYXBoaWNhbERhdGFIZWxwZXIuY3JlYXRlUHJvcGVydHkobm9kZS5nZXRHcmFwaE5vZGUoKSwKLS8vCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgsIG5ldyBJbnRlZ2VyKGluZGV4KQotLy8JCQkJCQkJLnRvU3RyaW5nKCkpOwotLy8JCQlpbmRleCsrOwotLy8JCX0KLS8vCQlyZXR1cm4gbm9kZTsKLS8vCX0KLQkKLX0gLy8gUm9sZVRhc2tDb21wb3NpdGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1Rhc2tOb2RlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9UYXNrTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWViZDI1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1Rhc2tOb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrIE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVGFza05vZGVJbXBsI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlSW1wbCBleHRlbmRzIE5hbWVkTm9kZUltcGwgaW1wbGVtZW50cyBUYXNrTm9kZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZGV4KCkgPGVtPkluZGV4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfRURFRkFVTFQgPSAtMTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZGV4KCkgPGVtPkluZGV4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCBpbmRleCA9IElOREVYX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIFRhc2tOb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQltZXRob2RFbGVtZW50QWRhcHRlciA9IG5ldyBUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuVEFTS19OT0RFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0JCi0JcHVibGljIGludCBkb0dldEluZGV4KCkgewotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlQcm9wZXJ0eSBwcm9wID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRQcm9wZXJ0eSh0aGlzLCBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgpOwotCQkJaWYocHJvcCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW50IGkgPSBJbnRlZ2VyLnBhcnNlSW50KHByb3AuZ2V0VmFsdWUoKSk7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCQljYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkvLwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0SW5kZXgoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRleChpbnQgbmV3SW5kZXgpIHsKLQkJaW50IG9sZEluZGV4ID0gaW5kZXg7Ci0JCWluZGV4ID0gbmV3SW5kZXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5UQVNLX05PREVfX0lOREVYLCBvbGRJbmRleCwgaW5kZXgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9TZXRJbmRleChpbnQgbmV3SW5kZXgpIHsKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5jcmVhdGVQcm9wZXJ0eShnZXRHcmFwaE5vZGUoKSwgCi0JCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCwgU3RyaW5nLnZhbHVlT2YobmV3SW5kZXgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEluZGV4KG5ld0luZGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRBU0tfTk9ERV9fSU5ERVg6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEluZGV4KCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UQVNLX05PREVfX0lOREVYOgotCQkJCXNldEluZGV4KCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRBU0tfTk9ERV9fSU5ERVg6Ci0JCQkJc2V0SW5kZXgoSU5ERVhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVEFTS19OT0RFX19JTkRFWDoKLQkJCQlyZXR1cm4gaW5kZXggIT0gSU5ERVhfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpbmRleDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW5kZXgpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhc2tEZXNjcmlwdG9yQWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlNZXRob2RFbGVtZW50IG9iajsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoVGFza0Rlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlhZGRJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmopOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlhZGRPdXRnb2luZ0Nvbm5lY3Rpb24ob2JqKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJcmVtb3ZlT3V0Z29pbmdDb25uZWN0aW9uKG9iaik7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWFkZE91dGdvaW5nQ29ubmVjdGlvbihvYmopOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJcmVtb3ZlT3V0Z29pbmdDb25uZWN0aW9uKG9iaik7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQotCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklOb2RlQ2hhbmdlTGlzdGVuZXIjZ2V0Tm9kZSgpCi0JCSAqLwotCQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQkJcmV0dXJuIFRhc2tOb2RlSW1wbC50aGlzOwotCQl9Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbCNzZXRPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JLy8gT2JqZWN0IG9sZE9iamVjdCA9IG9iamVjdDsKLQkvLyBvYmplY3QgPSBuZXdPYmplY3Q7Ci0JLy8gaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCS8vIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JLy8gTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfX09CSkVDVCwgb2xkT2JqZWN0LCBvYmplY3QpKTsKLQkvLwotCS8vIGlmKG5ld09iamVjdCA9PSBudWxsKSByZXR1cm47Ci0JLy8JCQotCS8vIE1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBuZXdPYmplY3Q7Ci0JLy8gaWYoZWxlbWVudCAhPSBudWxsICYmIGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpICE9IG51bGwpIHsKLQkvLyAvLyByZW1vdmUgb2xkIG1ldGhvZEVsZW1lbnRBZGFwdGVyCi0JLy8gLy8KLQkvLyBPYmplY3Qgb2xkQWRhcHRlciA9IFVtYVV0aWwuZ2V0QWRhcHRlcihlbGVtZW50LAotCS8vIGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpKTsKLQkvLyBpZihvbGRBZGFwdGVyICE9IG51bGwpIHsKLQkvLyBlbGVtZW50LmVBZGFwdGVycygpLnJlbW92ZShvbGRBZGFwdGVyKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGdyYXBoTm9kZSA9Ci0JLy8gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRHcmFwaE5vZGUoZ2V0VU1BRGlhZ3JhbSgpLAotCS8vIGVsZW1lbnQpOwotCS8vICAgICAgICAKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGVJbXBsLnNldE9iamVjdCgpOiBlbGVtZW50OiAnIiArCi0JLy8gZWxlbWVudC5nZXROYW1lKCkgKyAiJywgZ3JhcGhOb2RlOiAiICsgZ3JhcGhOb2RlKTsKLQkvLyAgICAgICAgCi0JLy8gLy8gcG9wdWxhdGUgZGF0YQotCS8vIC8vCi0JLy8gc2V0SGVpZ2h0KGdyYXBoTm9kZS5nZXRTaXplKCkuZ2V0SGVpZ2h0KCkuaW50VmFsdWUoKSk7Ci0JLy8gc2V0TG9jYXRpb24oR3JhcGhpY2FsRGF0YUhlbHBlci50b1BvaW50KGdyYXBoTm9kZS5nZXRQb3NpdGlvbigpKSk7Ci0JLy8gc2V0V2lkdGgoZ3JhcGhOb2RlLmdldFNpemUoKS5nZXRXaWR0aCgpLmludFZhbHVlKCkpOwotCS8vICAgICAgICAKLQkvLyAvLyBhZGQgbWV0aG9kRWxlbWVudEFkYXB0ZXIKLQkvLyAvLwotCS8vIGlmKG1ldGhvZEVsZW1lbnRBZGFwdGVyICE9IG51bGwpIHsKLQkvLyBlbGVtZW50LmVBZGFwdGVycygpLmFkZChtZXRob2RFbGVtZW50QWRhcHRlcik7Ci0JLy8gfQotCS8vICAgICAgICAKLQkvLyB0aGlzLmVBZGFwdGVycygpLmFkZChjcmVhdGVOb2RlQWRhcHRlcigpKTsKLQkvLwotCS8vIHNldE5hbWUoZWxlbWVudC5nZXROYW1lKCkpOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNhZGRUb1VNQShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKExpbmsgbGluaykgewotCQlpZiAoIXN1cGVyLmFkZFRvVU1BKGxpbmspKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIGdldE9iamVjdCgpOwotCQlOb2RlSW1wbCBub2RlSW1wbCA9IChOb2RlSW1wbCkgbGluay5nZXRTb3VyY2UoKTsKLQkJYm9vbGVhbiBub3RpZnkgPSBub3RpZmljYXRpb25FbmFibGVkOwotCQlib29sZWFuIG5vdGlmeVNvdXJjZSA9IG5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCXRyeSB7Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkvLyB0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChsaW5rLmdldFNvdXJjZSgpLmdldE9iamVjdCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5U291cmNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI3JlbW92ZUZyb21VTUEob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluaywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUsIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShMaW5rIGxpbmssIE5vZGUgb2xkU291cmNlLCBOb2RlIG9sZFRhcmdldCkgewotCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgZ2V0T2JqZWN0KCk7Ci0JCXRhc2tEZXNjLmdldE91dHB1dCgpLnJlbW92ZShsaW5rLmdldFRhcmdldCgpLmdldE9iamVjdCgpKTsKLQotCQlzdXBlci5yZW1vdmVGcm9tVU1BKGxpbmssIG9sZFNvdXJjZSwgb2xkVGFyZ2V0KTsKLQl9Ci0KLX0gLy8gVGFza05vZGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1R5cGVkTm9kZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvVHlwZWROb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OTc5NGMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvVHlwZWROb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHlwZWQgTm9kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5UeXBlZE5vZGVJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlZE5vZGVJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBUeXBlZE5vZGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUWVBFX0VERUZBVUxUID0gMDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFR5cGVkTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLlRZUEVEX05PREU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IG5ld1R5cGUpIHsKLQkJaW50IG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19UWVBFOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRUeXBlKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19UWVBFOgotCQkJCXNldFR5cGUoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fVFlQRToKLQkJCQlyZXR1cm4gdHlwZSAhPSBUWVBFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBiYXNpY1NldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCS8vcG9wdWxhdGUgZGF0YSBmcm9tIGxpbmtlZCBHcmFwaE5vZGUKLQkJLy8gCi0JCWdyYXBoTm9kZSA9IChHcmFwaE5vZGUpIG5ld09iamVjdDsKLQkJc2V0V2lkdGgoZ3JhcGhOb2RlLmdldFNpemUoKS5nZXRXaWR0aCgpLmludFZhbHVlKCkpOwotCQlzZXRIZWlnaHQoZ3JhcGhOb2RlLmdldFNpemUoKS5nZXRIZWlnaHQoKS5pbnRWYWx1ZSgpKTsKLQkJc2V0TG9jYXRpb24oR3JhcGhpY2FsRGF0YUhlbHBlci50b1BvaW50KGdyYXBoTm9kZS5nZXRQb3NpdGlvbigpKSk7Ci0vLwkJIHRoaXMuZUFkYXB0ZXJzKCkuYWRkKG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJLy8gLyogKG5vbi1KYXZhZG9jKQotCQkvLyAqIEBzZWUKLQkJLy8gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJLy8gKi8KLQkJLy8gcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCS8vIEdyYXBoTm9kZSBncmFwaE5vZGUgPSAoR3JhcGhOb2RlKSBnZXRPYmplY3QoKTsKLQkJLy8gc3dpdGNoKG1zZy5nZXRGZWF0dXJlSUQoVHlwZWROb2RlLmNsYXNzKSkgewotCQkvLyBjYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19XSURUSDoKLQkJLy8gZ3JhcGhOb2RlLmdldFNpemUoKS5zZXRXaWR0aChuZXcgRG91YmxlKG1zZy5nZXROZXdJbnRWYWx1ZSgpKSk7Ci0JCS8vIHJldHVybjsKLQkJLy8gICAgICAgICAgICAgICAgICAgIAotCQkvLyBjYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19IRUlHSFQ6Ci0JCS8vIGdyYXBoTm9kZS5nZXRTaXplKCkuc2V0SGVpZ2h0KG5ldyBEb3VibGUobXNnLmdldE5ld0ludFZhbHVlKCkpKTsKLQkJLy8gcmV0dXJuOwotCQkvLyAgICAgICAgICAgICAgICAgICAgICAgIAotCQkvLyBjYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19MT0NBVElPTjoKLQkJLy8gUG9pbnQgcCA9IChQb2ludCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZWROb2RlSW1wbCQubm90aWZ5Q2hhbmdlZCgpOiBuZXcgbG9jYXRpb246ICIgKwotCQkvLyBwICsgIi4gIiArIFR5cGVkTm9kZUltcGwudGhpcyk7Ci0JCS8vIGdyYXBoTm9kZS5nZXRQb3NpdGlvbigpLnNldFgobmV3IERvdWJsZShwLngpKTsKLQkJLy8gZ3JhcGhOb2RlLmdldFBvc2l0aW9uKCkuc2V0WShuZXcgRG91YmxlKHAueSkpOwotCQkvLyByZXR1cm47Ci0JCS8vICAgICAgICAgICAgICAgICAgICAKLQkJLy8gY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCS8vIExpbmsgbGluazsKLQkJLy8gc3dpdGNoKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCS8vIGFkZFRvVU1BKChMaW5rKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKW1zZy5nZXROZXdWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyCi0JCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCS8vIGFkZFRvVU1BKChMaW5rKSBpdGVyLm5leHQoKSk7Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJLy8gbGluayA9IChMaW5rKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJLy8gaWYobGluay5nZXRTb3VyY2UoKSAhPSBudWxsKSB7Ci0JCS8vICgoTm9kZUltcGwpbGluay5nZXRTb3VyY2UoKSkucmVtb3ZlRnJvbVVNQShsaW5rLCBsaW5rLmdldFNvdXJjZSgpLAotCQkvLyAoTm9kZSltc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pbXNnLmdldE9sZFZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJLy8gLmhhc05leHQoKTspIHsKLQkJLy8gbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJLy8gaWYobGluay5nZXRTb3VyY2UoKSAhPSBudWxsKSB7Ci0JCS8vICgoTm9kZUltcGwpbGluay5nZXRTb3VyY2UoKSkucmVtb3ZlRnJvbVVNQShsaW5rLCBsaW5rLmdldFNvdXJjZSgpLAotCQkvLyAoTm9kZSltc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBicmVhazsKLQkJLy8gfQotCQkvLyByZXR1cm47Ci0JCS8vCi0JCS8vIGNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkvLyBzd2l0Y2gobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJLy8gYWRkVG9VTUEoKExpbmspIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pbXNnLmdldE5ld1ZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJLy8gLmhhc05leHQoKTspIHsKLQkJLy8gYWRkVG9VTUEoKExpbmspIGl0ZXIubmV4dCgpKTsKLQkJLy8gfQotCQkvLyBicmVhazsKLQkJLy8KLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkvLyBsaW5rID0gKExpbmspIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkvLyBpZihsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJLy8gcmVtb3ZlRnJvbVVNQShsaW5rLCAoTm9kZSltc2cuZ2V0Tm90aWZpZXIoKSwgbGluay5nZXRUYXJnZXQoKSk7Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pbXNnLmdldE9sZFZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJLy8gLmhhc05leHQoKTspIHsKLQkJLy8gbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJLy8gaWYobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCS8vIHJlbW92ZUZyb21VTUEobGluaywgKE5vZGUpbXNnLmdldE5vdGlmaWVyKCksIGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8KLQkJLy8gfSk7Ci0JCWVBZGFwdGVycygpLmFkZChuZXcgTm9kZUFkYXB0ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKExpbmsgbGluaykgewotCQlpZiAoIXN1cGVyLmFkZFRvVU1BKGxpbmspKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZQotCQkJCQkmJiAoKFR5cGVkTm9kZSkgbGluay5nZXRUYXJnZXQoKSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpIHsKLQkJCQlDb2xsZWN0aW9uIHRhcmdldEFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0U3luY0JhclRhcmdldE5vZGVzKChUeXBlZE5vZGUpIGxpbmsKLQkJCQkJCS5nZXRUYXJnZXQoKSwgdGFyZ2V0QWN0Tm9kZXMpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldEFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlOYW1lZE5vZGVJbXBsIG5vZGUgPSAoKE5hbWVkTm9kZUltcGwpIGl0ZXIubmV4dCgpKTsKLQkJCQkJaWYgKFVtYVV0aWwuZmluZFdvcmtPcmRlcigoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJCQkuZ2V0T2JqZWN0KCksIChXb3JrQnJlYWtkb3duRWxlbWVudCkgbGluawotCQkJCQkJCS5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKSkgPT0gbnVsbCkgewotCQkJCQkJYWRkRGVmYXVsdFdvcmtPcmRlcihub2RlLCAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGxpbmsKLQkJCQkJCQkJLmdldFNvdXJjZSgpLmdldE9iamVjdCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkvLyBQcmVkZWNlc3NvciBzaG91bGQgYmUgY3JlYXRlZCBvbmx5IGluIGNhc2Ugb2YKLQkJCS8vIFN5bmNyb25pemF0aW9uIEJhciwgbm90IGZvciBEZWNpc2lvblBvaW50LgotCQkJaWYgKCgoVHlwZWROb2RlKSBsaW5rLmdldFNvdXJjZSgpKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikgewotCQkJCUNvbGxlY3Rpb24gc3JjQWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRTeW5jQmFyU291cmNlTm9kZXMoKFR5cGVkTm9kZSkgbGluawotCQkJCQkJLmdldFNvdXJjZSgpLCBzcmNBY3ROb2Rlcyk7Ci0JCQkJQ29sbGVjdGlvbiB0YXJnZXRBY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmdldFN5bmNCYXJUYXJnZXROb2RlcygoVHlwZWROb2RlKSBsaW5rCi0JCQkJCQkuZ2V0VGFyZ2V0KCksIHRhcmdldEFjdE5vZGVzKTsKLQotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldEFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlOYW1lZE5vZGVJbXBsIG5vZGUgPSAoKE5hbWVkTm9kZUltcGwpIGl0ZXIubmV4dCgpKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNyY0FjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpICgoTm9kZSkgaXRlcmF0b3IKLQkJCQkJCQkJLm5leHQoKSkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQlpZiAoVW1hVXRpbC5maW5kV29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkJCQkuZ2V0T2JqZWN0KCksIHByZWQpID09IG51bGwpIHsKLQkJCQkJCQlhZGREZWZhdWx0V29ya09yZGVyKG5vZGUsIHByZWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShMaW5rIGxpbmssIE5vZGUgb2xkU291cmNlLCBOb2RlIG9sZFRhcmdldCkgewotCQlUeXBlZE5vZGUgdHlwZWROb2RlID0gKFR5cGVkTm9kZSkgb2xkU291cmNlOwotCQlDb2xsZWN0aW9uIHNyY0FjdE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRTb3VyY2VOb2Rlcyh0eXBlZE5vZGUsCi0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQotCQlpZiAob2xkVGFyZ2V0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjQWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCS8vIE9iamVjdCBwcmVkID0gKChOb2RlKSBpdGVyYXRvci5uZXh0KCkpLmdldE9iamVjdCgpOwotCQkJCS8vIEdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlV29ya09yZGVyKChOYW1lZE5vZGVJbXBsKQotCQkJCS8vIG9sZFRhcmdldCwgcHJlZCk7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJLmNhblJlbW92ZUFsbFByZWRzKGxpbmssIG5vZGUsIG9sZFRhcmdldCkpIHsKLQkJCQkJd2hpbGUgKFVtYVV0aWwuZmluZFdvcmtPcmRlcigKLQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG9sZFRhcmdldC5nZXRPYmplY3QoKSwKLQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCkpICE9IG51bGwpIHsKLQkJCQkJCVVtYVV0aWwucmVtb3ZlV29ya09yZGVyKAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG9sZFRhcmdldC5nZXRPYmplY3QoKSwKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlLmdldE9iamVjdCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChvbGRUYXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCUNvbGxlY3Rpb24gdGFyZ2V0QWN0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFRhcmdldE5vZGVzKAotCQkJCQkoVHlwZWROb2RlKSBvbGRUYXJnZXQsIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcyk7Ci0KLQkJCS8vIHJlbW92ZSB0aGUgd29yayBvcmRlcnMgb2YgdGFyZ2V0IGFjdGl2aXRpZXMgdGhhdCBoYXZlIHRoZQotCQkJLy8gcHJlZGVjZXNzb3IgaW4gc3JjQWN0Tm9kZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXRBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlOYW1lZE5vZGVJbXBsIG5vZGUgPSAoKE5hbWVkTm9kZUltcGwpIGl0ZXIubmV4dCgpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjQWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCS8vIE9iamVjdCBwcmVkID0gKChOb2RlKSBpdGVyYXRvci5uZXh0KCkpLmdldE9iamVjdCgpOwotCQkJCQkvLyBHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZVdvcmtPcmRlcihub2RlLCBwcmVkKTsKLQkJCQkJTm9kZSBwcmVkbm9kZSA9IChOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLmNhblJlbW92ZUFsbFByZWRzKGxpbmssIHByZWRub2RlLAotCQkJCQkJCW5vZGUpKSB7Ci0JCQkJCQl3aGlsZSAoVW1hVXRpbC5maW5kV29ya09yZGVyKAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgcHJlZG5vZGUuZ2V0T2JqZWN0KCkpICE9IG51bGwpIHsKLQkJCQkJCQlVbWFVdGlsCi0JCQkJCQkJCQkucmVtb3ZlV29ya09yZGVyKAotCQkJCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJCQkJCQkJCQkuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgcHJlZG5vZGUKLQkJCQkJCQkJCQkJCQkuZ2V0T2JqZWN0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVNQShsaW5rLCBvbGRTb3VyY2UsIG9sZFRhcmdldCk7Ci0JfQotfSAvLyBUeXBlZE5vZGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYzViN2YwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsIGV4dGVuZHMgTmFtZWROb2RlSW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlXb3JrT3JkZXIgb2JqOwotCQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjoKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJb2JqID0gKFdvcmtPcmRlcikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlhZGRJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqLmdldFByZWQoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCW9iaiA9IChXb3JrT3JkZXIpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iai5nZXRQcmVkKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW9iaiA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmouZ2V0UHJlZCgpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJb2JqID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JCQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iai5nZXRQcmVkKCkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQotCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVU1BKExpbmsgbGluaywgTm9kZSBvbGRTb3VyY2UsIE5vZGUgb2xkVGFyZ2V0KSB7Ci0JCWlmIChvbGRUYXJnZXQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCS8vIHRoaXMgaXMgYSBkaXJlY3QgbGluawotCQkJLy8gcmVtb3ZlIFdvcmtPcmRlcgotCQkJLy8KLQkJCS8vIEdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgbGluay5nZXRPYmplY3QoKTsKLQkJCS8vIFdvcmtPcmRlciBvcmRlciA9IChXb3JrT3JkZXIpCi0JCQkvLyAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpZWRnZS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50IGJlID0gVW1hVXRpbC5nZXRPd25lcihvcmRlcik7Ci0JCQkvLyBpZihiZSAhPSBudWxsKSB7Ci0JCQlOYW1lZE5vZGVJbXBsIHRhcmdldCA9IChOYW1lZE5vZGVJbXBsKSBvbGRUYXJnZXQ7Ci0JCQlib29sZWFuIG5vdGlmeSA9IHRhcmdldC5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJdHJ5IHsKLQkJCQl0YXJnZXQubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCS8vIGJlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkucmVtb3ZlKG9yZGVyKTsKLQkJCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5jYW5SZW1vdmVBbGxQcmVkcyhsaW5rLCBvbGRTb3VyY2UsCi0JCQkJCQlvbGRUYXJnZXQpKSB7Ci0JCQkJCXdoaWxlIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSB0YXJnZXQKLQkJCQkJCQkuZ2V0T2JqZWN0KCksIG9sZFNvdXJjZS5nZXRPYmplY3QoKSkgIT0gbnVsbCkgewotCQkJCQkJVW1hVXRpbC5yZW1vdmVXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSB0YXJnZXQKLQkJCQkJCQkJLmdldE9iamVjdCgpLCBvbGRTb3VyY2UuZ2V0T2JqZWN0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQl0YXJnZXQubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJCX0KLQkJCS8vIH0KLQkJfSBlbHNlIGlmIChvbGRUYXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCS8vIGdldCBhbGwgdGhlIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZXMgdGhhdCB0aGlzIFR5cGVkTm9kZSBhcmUKLQkJCS8vIGNvbWluZyB0byBhbmQKLQkJCS8vIHJlbW92ZSB0aGUgV29ya09yZGVycyB3aXRoIHRoaXMgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlJ3MKLQkJCS8vIGFjdGl2aXR5IGFzIHByZWRlY2Vzc29yIGZyb20gdGhlbQotCQkJLy8KLQkJCUNvbGxlY3Rpb24gYWN0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFRhcmdldE5vZGVzKAotCQkJCQkoVHlwZWROb2RlKSBvbGRUYXJnZXQsIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcyk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlOYW1lZE5vZGVJbXBsIG5vZGUgPSAoTmFtZWROb2RlSW1wbCkgaXRlci5uZXh0KCk7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkJLmdldE9iamVjdCgpOwotCQkJCWJvb2xlYW4gbm90aWZ5ID0gbm9kZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCXRyeSB7Ci0JCQkJCW5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5jYW5SZW1vdmVBbGxQcmVkcyhsaW5rLCBvbGRTb3VyY2UsCi0JCQkJCQkJbm9kZSkpIHsKLQkJCQkJCXdoaWxlIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoZSwgb2xkU291cmNlLmdldE9iamVjdCgpKSAhPSBudWxsKSB7Ci0JCQkJCQkJVW1hVXRpbC5yZW1vdmVXb3JrT3JkZXIoZSwgb2xkU291cmNlLmdldE9iamVjdCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gcmVtb3ZlIGdyYXBoaWNhbCBkYXRhIGZyb20gVU1BIG1vZGVsCi0JCS8vCi0JCXN1cGVyLnJlbW92ZUZyb21VTUEobGluaywgb2xkU291cmNlLCBvbGRUYXJnZXQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaW5rCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9VTUEoTGluayBsaW5rKSB7Ci0JCWlmICghc3VwZXIuYWRkVG9VTUEobGluaykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTm9kZSBzcmMgPSBsaW5rLmdldFNvdXJjZSgpOwotCQlpZiAoc3JjIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkvLyB0aGlzIGlzIGEgZGlyZWN0IGxpbmsKLQkJCS8vIGFkZCBuZXcgV29ya09yZGVyIG9iamVjdCB0byBVTUEKLQkJCS8vCi0JCQlXb3JrT3JkZXIgb3JkZXIgPSBudWxsOwotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgc3VjYyA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbGluay5nZXRUYXJnZXQoKQotCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBzcmMuZ2V0T2JqZWN0KCk7Ci0JCQlpZiAoVW1hVXRpbC5maW5kV29ya09yZGVyKHN1Y2MsIHByZWQpID09IG51bGwpIHsKLQkJCQlOb2RlSW1wbCBzb3VyY2VOb2RlID0gKChOb2RlSW1wbCkgc3JjKTsKLQkJCQlib29sZWFuIHNvdXJjZU5vdGlmeSA9IHNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQl0cnkgewotCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJLy9VbWFVdGlsLmNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoc3VjYywgcHJlZCk7Ci0JCQkJCS8vQ3JlYXRlIGEgd29ya29yZGVyIGFuZCBkaXNhYmxlIG5vdGlmaWNhdGlvbiBmbGFnLgotCQkJCQlhZGREZWZhdWx0V29ya09yZGVyKChOYW1lZE5vZGVJbXBsKWxpbmsuZ2V0VGFyZ2V0KCksIHByZWQpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IHNvdXJjZU5vdGlmeTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHNldCB0aGUgV29ya09yZGVyIGFzIHRoZSBlbGVtZW50IG9mIHRoZSBTZW1hbnRpY01vZGVsIG9mIHRoZQotCQkJLy8gbGluaydzIEdyYXBoRWRnZQotCQkJLy8KLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuc2V0U2VtYW50aWNNb2RlbChsaW5rLCBvcmRlcik7Ci0JCX0gZWxzZSBpZiAoc3JjIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkvLyBnZXQgYWxsIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZXMgdGhhdCBhcmUgY29tbWluZyB0byB0aGlzCi0JCQkvLyBUeXBlZE5vZGUsIGJvdGggZGlyZWN0bHkgYW5kIGluZGlyZWN0bHkKLQkJCS8vIGFuZCBjcmVhdGUgd29yayBvcmRlcnMgd2l0aCB0aGVpciBhY3Rpdml0eSBhcyBwcmVkZWNlc3NvcgotCQkJLy8KLQotCQkJLy8gUHJlZGVjZXNzb3Igc2hvdWxkIGJlIGNyZWF0ZWQgb25seSBpbiBjYXNlIG9mCi0JCQkvLyBTeW5jcm9uaXphdGlvbiBCYXIsIG5vdCBmb3IgRGVjaXNpb25Qb2ludC4KLQkJCWlmICgoKFR5cGVkTm9kZSkgc3JjKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikgewotCQkJCQotCQkJCUNvbGxlY3Rpb24gYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJLy8gR2V0IHRoZSBjb2xsZWN0aW9uIGluY29taW5nIGNvbm5lY3Rpb24gb2Ygc3luY2JhciAKLQkJCQkvLyBleGNsdWRpbmcgZGVjaXNpb25wb2ludCBpbmNvbWluZyBjb25uZWN0aW9uCi0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRTeW5jQmFyU291cmNlTm9kZXMoKFR5cGVkTm9kZSlzcmMsIGFjdE5vZGVzKTsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBsaW5rCi0JCQkJCQkuZ2V0VGFyZ2V0KCkuZ2V0T2JqZWN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkJCS5nZXRPYmplY3QoKTsKLQkJCQkJaWYgKFVtYVV0aWwuZmluZFdvcmtPcmRlcihzdWNjLCBwcmVkKSA9PSBudWxsKSB7Ci0JCQkJCQlOb2RlSW1wbCBzb3VyY2VOb2RlID0gKChOb2RlSW1wbCkgbm9kZSk7Ci0JCQkJCQlib29sZWFuIHNvdXJjZU5vdGlmeSA9IHNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCQkJLy9VbWFVdGlsLmNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoc3VjYywgcHJlZCk7Ci0JCQkJCQkJLy8gQ3JlYXRlIGEgd29ya29yZGVyIGFuZCBkaXNhYmxlIG5vdGlmaWNhdGlvbiBmbGFnLgotCQkJCQkJCWFkZERlZmF1bHRXb3JrT3JkZXIoKE5hbWVkTm9kZUltcGwpbGluay5nZXRUYXJnZXQoKSxwcmVkKTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gc291cmNlTm90aWZ5OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIExpbmsgYWRkSW5jb21pbmdDb25uZWN0aW9uKE1ldGhvZEVsZW1lbnQgc291cmNlKSB7Ci0JCUxpbmsgbGluayA9IHN1cGVyLmFkZEluY29taW5nQ29ubmVjdGlvbihzb3VyY2UpOwotCQlpZiAobGluayA9PSBudWxsKQotCQkJcmV0dXJuIGxpbms7Ci0KLQkJV29ya09yZGVyIHdvcmtPcmRlciA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcigKLQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldE9iamVjdCgpLCBzb3VyY2UpOwotCQlHcmFwaGljYWxEYXRhSGVscGVyLnNldFNlbWFudGljTW9kZWwobGluaywgd29ya09yZGVyKTsKLQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGluayBhZGRPdXRnb2luZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCB0YXJnZXQpIHsKLQkJTGluayBsaW5rID0gc3VwZXIuYWRkT3V0Z29pbmdDb25uZWN0aW9uKHRhcmdldCk7Ci0KLQkJV29ya09yZGVyIHdvcmtPcmRlciA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcigKLQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHRhcmdldCwgZ2V0T2JqZWN0KCkpOwotCQlHcmFwaGljYWxEYXRhSGVscGVyLnNldFNlbWFudGljTW9kZWwobGluaywgd29ya09yZGVyKTsKLQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLX0gLy8gV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5NWQwOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsIGV4dGVuZHMgTm9kZUNvbnRhaW5lckltcGwgaW1wbGVtZW50cwotCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRZUEVfRURFRkFVTFQgPSAwOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCBuZXdUeXBlKSB7Ci0JCWludCBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0NPTVBPU0lURV9fVFlQRToKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0VHlwZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0NPTVBPU0lURV9fVFlQRToKLQkJCQlzZXRUeXBlKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEU6Ci0JCQkJcmV0dXJuIHR5cGUgIT0gVFlQRV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYXNrRGVzY3JpcHRvckFkYXB0ZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbmFsTm9kZUxpbmsgewotCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKFRhc2tEZXNjcmlwdG9yLmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlPYmplY3Qgb2JqID0gbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWlmIChvYmogIT0gbnVsbCAmJiB0eXBlID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCQkJCWFkZE5vZGUob2JqKTsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlvYmogPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKG9iaiAhPSBudWxsICYmIHR5cGUgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUykgewotCQkJCQkJcmVtb3ZlTm9kZShvYmopOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCU9iamVjdCBvYmogPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJaWYgKG9iaiAhPSBudWxsICYmIHR5cGUgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQkJCQlhZGROb2RlKG9iaik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWlmIChvYmogIT0gbnVsbCAmJiB0eXBlID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCQkJcmVtb3ZlTm9kZShvYmopOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCi0JcHJpdmF0ZSBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IChEaWFncmFtSW1wbCkgZ2V0RGlhZ3JhbSgpOwotCQlpZiAoZGlhZ3JhbS5maWx0ZXIgPT0gbnVsbCkgewotCQkJQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCXJldHVybiBhZGFwdGVyRmFjdG9yeS5nZXRGaWx0ZXIoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBkaWFncmFtLmZpbHRlcjsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCQkKLQkJc3VwZXIuc2V0T2JqZWN0KG5ld09iamVjdCk7Ci0JCXBvcHVsYXRlTm9kZXMobmV3T2JqZWN0KTsKLQkJCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNTZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCi0JCXN1cGVyLmJhc2ljU2V0T2JqZWN0KG5ld09iamVjdCk7Ci0JCQotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQkvLyBTZXQgdGhlIFR5cGUgaW5mb3JtYXRpb24gZm9yIHdvcmtwcm9kdWN0IGNvbXBvc2l0ZS4KLQkJCWlmICh0eXBlID09IFRZUEVfRURFRkFVTFQpIHsKLQkJCQlMaXN0IGxpc3QgPSBncmFwaE5vZGUuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShsaXN0LAotCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX1dPUktfUFJPRFVDVF9DT01QT1NJVEVfVFlQRSk7Ci0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJcHJvcGVydHkuc2V0VmFsdWUocHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JCQkJCWxpc3QuYWRkKHByb3BlcnR5KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUxpc3QgbGlzdCA9IGdyYXBoTm9kZS5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsCi0JCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfV09SS19QUk9EVUNUX0NPTVBPU0lURV9UWVBFKTsKLQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQlwcm9wZXJ0eS5zZXRWYWx1ZShuZXcgSW50ZWdlcihnZXRUeXBlKCkpLnRvU3RyaW5nKCkpOwotCQkJCQlsaXN0LmFkZChwcm9wZXJ0eSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSB3cGROb2RlID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlICYmIG5vZGUuZ2V0TGlua2VkRWxlbWVudCgpID09IHdwZCkgewotCQkJCXdwZE5vZGUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkgbm9kZTsKLQkJCX0KLQkJfQotCQlpZih3cGROb2RlID09IG51bGwpIHsKLQkJCXdwZE5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKTsKLQkJCXdwZE5vZGUuc2V0RGlhZ3JhbShnZXREaWFncmFtKCkpOwotCQl9Ci0JCXdwZE5vZGUuc2V0T2JqZWN0KHdwZCk7Ci0JCXJldHVybiB3cGROb2RlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZU5vZGVzKE9iamVjdCBuZXdPYmplY3QpewotCQlpZiAobmV3T2JqZWN0IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCUxpc3Qgd3BsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKGdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQlpZiAoISgoVGFza0Rlc2NyaXB0b3IpIG5ld09iamVjdCkuZ2V0TWFuZGF0b3J5SW5wdXQoKS5pc0VtcHR5KCkpCi0JCQkJCXdwbGlzdC5hZGRBbGwoKChUYXNrRGVzY3JpcHRvcikgbmV3T2JqZWN0KQotCQkJCQkJCS5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCEoKFRhc2tEZXNjcmlwdG9yKSBuZXdPYmplY3QpLmdldE91dHB1dCgpLmlzRW1wdHkoKSkKLQkJCQkJd3BsaXN0LmFkZEFsbCgoKFRhc2tEZXNjcmlwdG9yKSBuZXdPYmplY3QpLmdldE91dHB1dCgpKTsKLQkJCX0KLQotCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKLQkJCUNvbGxlY3Rpb24gYWxsRWxlbWVudHMgPSAoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKSkKLQkJCQkJLmdldEFsbEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQlBcnJheUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2NyaXB0b3IgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyCi0vLwkJCQkJCS5uZXh0KCk7Ci0vLwkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdCh3cERlc2NyaXB0b3IpKSB7Ci0vLwkJCQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLAotLy8JCQkJCQkJd3BEZXNjcmlwdG9yKTsKLS8vCQkJCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0vLwkJCQkJCW5vZGUgPSBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKHdwRGVzY3JpcHRvcik7Ci0vLwkJCQkJCSgoTmFtZWROb2RlSW1wbCkgbm9kZSkuc2V0SXRlbVByb3ZpZGVyKGFsbEVsZW1lbnRzKTsKLS8vCQkJCQl9Ci0vLwkJCQkJbm9kZXMuYWRkKG5vZGUpOwotLy8JCQkJfQotLy8JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlPYmplY3Qgd3BEZXNjcmlwdG9yID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJCQlpZih3cERlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpewotCQkJCQlpZihUbmdVdGlsLmNvbnRhaW5zKHdwbGlzdCwgd3BEZXNjcmlwdG9yKSl7Ci0JCQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdCh3cERlc2NyaXB0b3IpKSB7Ci0JCQkJCQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLAotCQkJCQkJCQkJd3BEZXNjcmlwdG9yKTsKLQkJCQkJCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJCQkJCW5vZGUgPSBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKChXb3JrUHJvZHVjdERlc2NyaXB0b3Ipd3BEZXNjcmlwdG9yKTsKLQkJCQkJCQkJKChOYW1lZE5vZGVJbXBsKSBub2RlKS5zZXRJdGVtUHJvdmlkZXIoYWxsRWxlbWVudHMpOwotCQkJCQkJCX0KLQkJCQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJfQotCQkJc2VsZWN0Tm9kZXMobm9kZXMpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE5vZGUoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUNvbGxlY3Rpb24gbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZXIKLQkJCQkJLm5leHQoKTsKLQkJCWFkZE5vZGUobm9kZXMsIGRlc2NyaXB0b3IpOwotCQl9Ci0KLQkJZ2V0Tm9kZXMoKS5hZGRBbGwobm9kZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU5vZGUoT2JqZWN0IG9sZFZhbHVlKSB7Ci0JCUNvbGxlY3Rpb24gcmVtb3ZlZE5vZGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCU5vZGUgbm9kZSA9IGZpbmROb2RlKChBY3Rpdml0eURldGFpbERpYWdyYW0pIGdldERpYWdyYW0oKSwKLQkJCQkJZ2V0T2JqZWN0KCkpOwotCQkJZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCkucmVtb3ZlKG5vZGUpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0T2JqZWN0KCkgPT0gb2xkVmFsdWUpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCXJlbW92ZWROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gcHVzaEJhY2tUb0RpYWdyYW0ocmVtb3ZlZE5vZGVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGROb2RlKE9iamVjdCBkZXNjcmlwdG9yKSB7Ci0JCWFkZE5vZGUoZ2V0Tm9kZXMoKSwgZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5vZGUoQ29sbGVjdGlvbiBub2RlcywgT2JqZWN0IGRlc2NyaXB0b3IpIHsKLQkJCi0JCWlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCU5vZGUgbm9kZSA9IGZpbmROb2RlKChBY3Rpdml0eURldGFpbERpYWdyYW0pIGdldERpYWdyYW0oKSwKLQkJCQkJZGVzY3JpcHRvcik7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJbm9kZSA9ICgoQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCkgZ2V0RGlhZ3JhbSgpKQotCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKAotCQkJCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGRlc2NyaXB0b3IsIHRoaXMudHlwZSk7Ci0JCQkJZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCkuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCWlmKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpewotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcyAsCi0JCQkJCWRlc2NyaXB0b3IpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCWlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKXsKLQkJCQkJbm9kZSA9IGRpYWdyYW0uY3JlYXRlTm9kZSgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yKTsKLQkJCQl9Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICovCi0vLwlwcml2YXRlIHZvaWQgcmVtb3ZlTm9kZShDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0vLwkJQ29sbGVjdGlvbiBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotLy8JCQlpZiAoZWxlbWVudHMuY29udGFpbnMobm9kZS5nZXRPYmplY3QoKSkpIHsKLS8vCQkJCW5vZGVzLmFkZChub2RlKTsKLS8vCQkJfQotLy8JCX0KLS8vCQlnZXROb2RlcygpLnJlbW92ZUFsbChub2Rlcyk7Ci0vLwkJcHVzaEJhY2tUb0RpYWdyYW0obm9kZXMpOwotLy8JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpCi0JICovCi0JcHVibGljIENsYXNzIGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpIHsKLQkJcmV0dXJuIFRhc2tEZXNjcmlwdG9yQWRhcHRlci5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oKSB7Ci0JCWlmIChnZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0TG9jYXRpb24oKTsKLQkJfQotCQlpZiAoZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCXJldHVybiBzdXBlci5nZXRMb2NhdGlvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG5ldyBQb2ludCgtMSwgLTEpOwotCQl9Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBnZXRHcmFwaE5vZGUoTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50KSB7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCWlmIChnZXRVTUFEaWFncmFtKCkgPT0gbnVsbCkgewotCQkJCS8vIG5ldyBNZXRob2RFbGVtZW50Ci0JCQkJLy8KLQkJCQlyZXR1cm4gY3JlYXRlR3JhcGhOb2RlKG1ldGhvZEVsZW1lbnQpOwotCQkJfQotCQkJR3JhcGhOb2RlIG5vZGUgPSBmaW5kR3JhcGhOb2RlKGdldFVNQURpYWdyYW0oKSwgbWV0aG9kRWxlbWVudCk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJbm9kZSA9IGNyZWF0ZUdyYXBoTm9kZShtZXRob2RFbGVtZW50KTsKLQkJCQkvLyBjcmVhdGVHcmFwaENvbm5lY3RvcnMobm9kZSwgZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQlnZXRVTUFEaWFncmFtKCkuZ2V0Q29udGFpbmVkKCkuYWRkKG5vZGUpOwotCQkJfQotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBmaW5kR3JhcGhOb2RlKERpYWdyYW0gZGlhZ3JhbSwgT2JqZWN0IG1ldGhvZEVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUdyYXBoTm9kZSBlbGVtZW50ID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5nZXRTZW1hbnRpY01vZGVsKCkgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JCQkJCSYmIG1ldGhvZEVsZW1lbnQgPT0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBlbGVtZW50Ci0JCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKSkuZ2V0RWxlbWVudCgpKSB7Ci0KLQkJCQlMaXN0IGxpc3QgPSBlbGVtZW50LmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFByb3BlcnR5QnlLZXkobGlzdCwKLQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX1RZUEUpOwotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB0eXBlU3RyaW5nID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKHR5cGVTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJaWYgKGdldFR5cGUoKSA9PSBuZXcgSW50ZWdlcih0eXBlU3RyaW5nKS5pbnRWYWx1ZSgpKQotCQkJCQkJCXJldHVybiBlbGVtZW50OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgR3JhcGhOb2RlIGNyZWF0ZUdyYXBoTm9kZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoTm9kZSgpOwotCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCQltb2RlbEJyaWRnZS5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQlncmFwaE5vZGUuc2V0U2VtYW50aWNNb2RlbChtb2RlbEJyaWRnZSk7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgcG9pbnQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb2ludCgpOwotCQlwb2ludC5zZXRYKG5ldyBEb3VibGUoLTEpKTsKLQkJcG9pbnQuc2V0WShuZXcgRG91YmxlKC0xKSk7Ci0JCWdyYXBoTm9kZS5zZXRQb3NpdGlvbihwb2ludCk7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uIGRpbSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpbWVuc2lvbigpOwotCQlkaW0uc2V0V2lkdGgobmV3IERvdWJsZSgtMSkpOwotCQlkaW0uc2V0SGVpZ2h0KG5ldyBEb3VibGUoLTEpKTsKLQkJZ3JhcGhOb2RlLnNldFNpemUoZGltKTsKLQotCQkvLyBGb3Igc2V0dGluZyB0eXBlIG9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlCi0JCVByb3BlcnR5IHByb3BlcnR5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJcHJvcGVydHkuc2V0S2V5KEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX1RZUEUpOwotCQlwcm9wZXJ0eS5zZXRWYWx1ZShuZXcgSW50ZWdlcihnZXRUeXBlKCkpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbGlzdC5hZGQocHJvcGVydHkpOwotCQlncmFwaE5vZGUuc2V0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFksIGxpc3QpOwotCQlyZXR1cm4gZ3JhcGhOb2RlOwotCX0KLQotCXB1YmxpYyBOb2RlIGZpbmROb2RlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgPT0gZWxlbWVudC5nZXRPYmplY3QoKQotCQkJCQkmJiBlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpIHsKLQkJCQlpZiAoKChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgZWxlbWVudCkuZ2V0VHlwZSgpID09IHRoaXMudHlwZSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCWlmKG1ldGhvZEVsZW1lbnRBZGFwdGVyID09IG51bGwpIHsKLQkJCW1ldGhvZEVsZW1lbnRBZGFwdGVyID0gbmV3IFRhc2tEZXNjcmlwdG9yQWRhcHRlcigpOwotCQl9Ci0JCXJldHVybiBtZXRob2RFbGVtZW50QWRhcHRlcjsKLQl9Ci19IC8vIFdvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZjNkZWI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwgZXh0ZW5kcyBEaWFncmFtSW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gewotCXByaXZhdGUgY2xhc3MgV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgQWN0aXZpdHlBZGFwdGVyIGltcGxlbWVudHMKLQkJCUlXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXIgewotCi0JfTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQlkaWFncmFtQ2hhbmdlTGlzdGVuZXIgPSBuZXcgV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENsYXNzIGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lclR5cGUoKSB7Ci0JCXJldHVybiBJV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFkYXB0ZXJGYWN0b3J5W10gREVGQVVMVF9BREFQVEVSX0ZBQ1RPUklFUyA9IHsJCQkKLQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSAKLQl9OyAKLQotCS8vCi0JLy8gU3RhcnQgY3VzdG9tIGNvZGUKLQkvLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKCkgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IG51bGw7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJaWYgKHdyYXBwZXIgIT0gbnVsbCkgewotCQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3NTUyCi0JCQlMaXN0IHdyYXBwZXJzID0gUHJvY2Vzc1V0aWwuZ2V0V3JhcHBlcnMod3JhcHBlciwgREVGQVVMVF9BREFQVEVSX0ZBQ1RPUklFUyk7Ci0JCQlpZih3cmFwcGVycyAhPSBudWxsICYmIHdyYXBwZXJzLnNpemUoKSA+IDApewotCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKXdyYXBwZXJzLmdldCgwKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoZ2V0T2JqZWN0KCksCi0JCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJCWFkYXB0ZXJGYWN0b3J5ID0gKChJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJCS5nZXRXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCQlnZXRPYmplY3QoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCX0KLQkJfQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkvLyByZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihnZXRPYmplY3QoKSk7Ci0JCQkvLyBjb21tZW50ZWQgYWJvdmUgbGluZSwgRm9yIGRpYWdyYW1zIC0gcm9sbHVwIHNob3VsZCBiZSBmYWxzZSwgZm9yCi0JCQkvLyBoYW5kbGluZyByb2xsdXAgc3RhdGUgYmVsb3cgY29kZS4KLQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlleHRyYWN0Q2hpbGRyZW4oYWRhcHRlciwgZ2V0T2JqZWN0KCksIGNoaWxkcmVuKTsKLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVOb2RlcygpIHsKLQkJLy8gQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQotCQkvLyBnZXQgYWxsIFdvcmtQcm9kdWN0RGVzY3JpcHRvcnMgdW5kZXIgdGhlIGFjdGl2aXR5Ci0JCS8vCi0JCXN1cGVyLnBvcHVsYXRlTm9kZXMoKTsKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKQotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGFjdCwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQotCQkvLyBBcnJheUxpc3Qgd3BEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXJyYXlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0Tm9kZSBub2RlID0gKFdvcmtQcm9kdWN0Tm9kZSkgR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLCBlbGVtZW50KTsKLQkJCQlpZihub2RlID09IG51bGwpIHsKLQkJCQkJbm9kZSA9IChXb3JrUHJvZHVjdE5vZGUpIHRvTm9kZSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQkJfQotCQkJCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZTsKLQkJCQkJaWYgKHdyYXBwZXIuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpLml0ZW1Qcm92aWRlciA9IHdyYXBwZXI7Ci0JCQkJCQlub2RlLnNldFJlYWRPbmx5KHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCW5vZGUuc2V0VHlwZSgxKTsKLQkJCQl9Ci0JCQkJaWYgKCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJbm9kZS5zZXRUeXBlKDIpOwotCQkJCX0KLQkJCQlpZiAoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBPdXRjb21lKSB7Ci0JCQkJCW5vZGUuc2V0VHlwZSgzKTsKLQkJCQl9Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCXNlbGVjdE5vZGVzKG5vZGVzKTsKLQl9Ci0JcHJvdGVjdGVkIE5vZGUgdG9Ob2RlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZihlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKXsKLQkJCXJldHVybiBzdXBlci50b05vZGUoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgbmV3Tm9kZSgpIHsKLQkJcmV0dXJuIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3ROb2RlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gR3JhcGhpY2FsRGF0YUhlbHBlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOwotCX0KLQotCXByb3RlY3RlZCBDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50VHlwZSgpIHsKLQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1VtYU1vZGVsKGludCBwb3NpdGlvbiwgTm9kZSBhZGRlZE5vZGUpIHsJCQotCQlpZiAoYWRkZWROb2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJKChBY3Rpdml0eSkgZ2V0T2JqZWN0KCkpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKAotCQkJCQlhZGRlZE5vZGUuZ2V0T2JqZWN0KCkpOwotCQl9Ci0JCXN1cGVyLmFkZFRvVW1hTW9kZWwocG9zaXRpb24sIGFkZGVkTm9kZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG5vZGVBZGRlZChpbnQgaW5kZXgsIE5vZGUgbm9kZSkgewotCQlpZihub2RlLmdldE9iamVjdCgpID09IG51bGwpIHsKLQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm9kZUFkZGVkKGluZGV4LCBub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcygpIHsKLQkJc3VwZXIucG9wdWxhdGVMaW5rcygpOwotCQkKLQkJLy8gQ2xlYW4gdXAgdW4tdXNlZCB0aGUgbGlua3MuCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoKE5vZGUpIGl0ZXIubmV4dCgpKTsKLQkJCUFycmF5TGlzdDxMaW5rPiBsaW5rc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDxMaW5rPigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5vZGUKLQkJCQkJLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoIWlzVmFsaWQobGluaykpIHsKLQkJCQkJbGlua3NUb1JlbW92ZS5hZGQobGluayk7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpbmtzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlTGluayhsaW5rKTsKLQkJCX0KLQkJCWxpbmtzVG9SZW1vdmUuY2xlYXIoKTsKLQkJCWxpbmtzVG9SZW1vdmUgPSBudWxsOwotCQl9Ci0JCS8vIFJlZnJlc2ggbGlua3MgYmFzZWQgb24gbW9kZWwgaW5mby4KLQkJZm9yKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyl7Ci0JCQlOb2RlIG5vZGUgPSAoKE5vZGUpaXRlci5uZXh0KCkpOwotCQkJT2JqZWN0IHdiZSA9IG51bGw7Ci0JCQkvL3diZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkvL2lmKHdiZSAhPSBudWxsKXsKLQkJCXdiZSA9ICBub2RlLmdldE9iamVjdCgpOwotCQkJaWYod2JlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKXsKLQkJCQlMaXN0IGltcGFjdGVkQnkgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcil3YmUpLmdldEltcGFjdGVkQnkoKTsKLQkJCQlpZighaW1wYWN0ZWRCeS5pc0VtcHR5KCkpewotCQkJCQlmb3IoSXRlcmF0b3IgaXRlcjEgPSBpbXBhY3RlZEJ5Lml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspewotCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHNvdXJjZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpaXRlcjEubmV4dCgpOwotCQkJCQkJTGluayBsaW5rID0gZmluZExpbmsobm9kZSwgc291cmNlKTsKLQkJCQkJCWlmKGxpbmsgPT0gbnVsbCl7Ci0JCQkJCQkJTmFtZWROb2RlSW1wbCBub2RlSW1wbCA9ICgoTmFtZWROb2RlSW1wbCkgbm9kZSk7Ci0JCQkJCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCQkJbm9kZUltcGwuYWRkSW5jb21pbmdDb25uZWN0aW9uKHNvdXJjZSk7IAotCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBvbGROb3RpZnk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQoTGluayBsaW5rKSB7Ci0JCWlmIChsaW5rLmdldFNvdXJjZSgpID09IG51bGwgfHwgbGluay5nZXRUYXJnZXQoKSA9PSBudWxsCi0JCQkJfHwgIWdldE5vZGVzKCkuY29udGFpbnMobGluay5nZXRTb3VyY2UoKSkKLQkJCQl8fCAhZ2V0Tm9kZXMoKS5jb250YWlucyhsaW5rLmdldFRhcmdldCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgTGluayBmaW5kTGluayhOb2RlIHRhcmdldCwgT2JqZWN0IHNvdXJjZUxpbmtlZEVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0LmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCU5vZGUgc291cmNlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJCWlmKHNvdXJjZS5nZXRMaW5rZWRFbGVtZW50KCkgPT0gc291cmNlTGlua2VkRWxlbWVudCkgewotCQkJCXJldHVybiBsaW5rOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0gLy8gV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxNGRmNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsIGV4dGVuZHMgTmFtZWROb2RlSW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQltZXRob2RFbGVtZW50QWRhcHRlciA9IG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREU7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEFkYXB0ZXIgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbC5NZXRob2RFbGVtZW50QWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKCFub3RpZmljYXRpb25FbmFibGVkKQotCQkJCXJldHVybjsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQotCQkJdHJ5IHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzKSkgewotCQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ6Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKW1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJLy8gVE9ETzogaW1wbGVtZW50IGhhbmRsaW5nIHN1cHByZXNzLgotCQkJCQl9Ci0JCQkJfQotCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0JCQl9Ci0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsLk1ldGhvZEVsZW1lbnRBZGFwdGVyI2dldE5vZGUoKQotCQkgKi8KLQkJcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJCXJldHVybiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbC50aGlzOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwjZmluZE5vZGUob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXByb3RlY3RlZCBOb2RlIGZpbmROb2RlKE1ldGhvZEVsZW1lbnQgbGlua2VkRWxlbWVudCkgewotCQlyZXR1cm4gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSgKLQkJCQkoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBnZXREaWFncmFtKCksIGxpbmtlZEVsZW1lbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNhZGRUb1VNQShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKExpbmsgbGluaykgewotCQlpZiAoIXN1cGVyLmFkZFRvVU1BKGxpbmspKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXRPYmplY3QoKTsKLQotCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBvZiBzb3VyY2Ugbm9kZSBiZWZvcmUgY2hhbmdpbmcgdGhlIFVNQSBvYmplY3QKLQkJLy8gYXNzb2NpYXRlZCB3aXRoIGl0Ci0JCS8vIHNvIGl0IHdpbGwgbm90IGNyZWF0ZSBkdXBsaWNhdGUgbGlua3MKLQkJLy8KLQkJTm9kZUltcGwgbm9kZUltcGwgPSAoTm9kZUltcGwpIGxpbmsuZ2V0U291cmNlKCk7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJYm9vbGVhbiBub3RpZnlUYXJnZXQgPSBub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotLy8JCQl3cGQuZ2V0T3V0cHV0RnJvbSgpLmFkZChsaW5rLmdldFNvdXJjZSgpLmdldE9iamVjdCgpKTsKLQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBsaW5rLmdldFNvdXJjZSgpLmdldE9iamVjdCgpOwotCQkJaWYodGFza0Rlc2MgIT0gbnVsbCkgewotCQkJCXRhc2tEZXNjLmdldE91dHB1dCgpLmFkZCh3cGQpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnlUYXJnZXQ7Ci0JCX0KLQotCQkvLyBUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgbGluay5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKTsKLQkJLy8gdGQuZ2V0T3V0cHV0KCkuYWRkKGdldE9iamVjdCgpKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjcmVtb3ZlRnJvbVVNQShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSwgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVU1BKExpbmsgbGluaywgTm9kZSBvbGRTb3VyY2UsIE5vZGUgb2xkVGFyZ2V0KSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXRPYmplY3QoKTsKLS8vCQl3cGQuZ2V0TWFuZGF0b3J5SW5wdXRUbygpLnJlbW92ZShvbGRUYXJnZXQuZ2V0T2JqZWN0KCkpOwotCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgb2xkVGFyZ2V0LmdldE9iamVjdCgpOwotCQlpZih0YXNrRGVzYyAhPSBudWxsKSB7Ci0JCQl0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpLnJlbW92ZSh3cGQpOwotCQl9Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVNQShsaW5rLCBvbGRTb3VyY2UsIG9sZFRhcmdldCk7Ci0JfQotfSAvLyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdE5vZGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0Tm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjUxNTc1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0Tm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Tm9kZUltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUltcGwgZXh0ZW5kcyBOYW1lZE5vZGVJbXBsIGltcGxlbWVudHMKLQkJV29ya1Byb2R1Y3ROb2RlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FREVGQVVMVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JcHJpdmF0ZSBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEFkYXB0ZXIgewotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3ROb2RlSW1wbC50aGlzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCi0JCQl0cnkgewotCQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCQkJTWV0aG9kRWxlbWVudCBvYmo7Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmopOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQlyZW1vdmVJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJYWRkSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJCQlyZW1vdmVJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ6Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKW1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJaWYoYi5ib29sZWFuVmFsdWUoKT09dHJ1ZSl7Ci0JCQkJCQkJcmVtb3ZlTGlua3MoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0Tm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgbmV3VHlwZSkgewotCQlpbnQgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX05PREVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfTk9ERV9fVFlQRToKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0VHlwZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX05PREVfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfTk9ERV9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX05PREVfX1RZUEU6Ci0JCQkJcmV0dXJuIHR5cGUgIT0gVFlQRV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9VTUEoTGluayBsaW5rKSB7Ci0JCWlmICghc3VwZXIuYWRkVG9VTUEobGluaykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBsaW5rCi0JCQkJLmdldFNvdXJjZSgpLmdldE9iamVjdCgpOwotCi0JCU5vZGVJbXBsIHNvdXJjZSA9IChOb2RlSW1wbCkgbGluay5nZXRTb3VyY2UoKTsKLQkJTm9kZUltcGwgdGFyZ2V0ID0gKE5vZGVJbXBsKSBsaW5rLmdldFRhcmdldCgpOwotCQlib29sZWFuIG5vdGlmeVNvdXJjZSA9IHNvdXJjZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQlib29sZWFuIG5vdGlmeVRhcmdldCA9IHRhcmdldC5ub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJc291cmNlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0YXJnZXQubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJZGVzY3JpcHRvci5nZXRJbXBhY3RzKCkuYWRkKGxpbmsuZ2V0VGFyZ2V0KCkuZ2V0T2JqZWN0KCkpOwotCQl9IGZpbmFsbHkgewotCQkJc291cmNlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnlTb3VyY2U7Ci0JCQl0YXJnZXQubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeVRhcmdldDsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VTUEoTGluayBsaW5rLCBOb2RlIG9sZFNvdXJjZSwgTm9kZSBvbGRUYXJnZXQpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvbGRUYXJnZXQKLQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCS8vIGRpc2FibGUgaW50ZXJuYWwgbm90aWZpY2F0aW9uIG9mIHRoZSB0YXJnZXQgbm9kZSBiZWZvcmUgcmVtb3ZpbmcgaXRzCi0JCS8vIGRlc2NyaXB0b3IgZnJvbSB0aGUgZGVwZW5kZW5jeSBsaXN0Ci0JCS8vCi0JCU5hbWVkTm9kZUltcGwgbm9kZUltcGwgPSAoTmFtZWROb2RlSW1wbCkgb2xkU291cmNlOwotCQlib29sZWFuIG5vdGlmeSA9IG5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCXRyeSB7Ci0JCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlkZXNjcmlwdG9yLmdldEltcGFjdGVkQnkoKS5yZW1vdmUobm9kZUltcGwuZ2V0T2JqZWN0KCkpOwotCQl9IGZpbmFsbHkgewotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJfQotCi0JCXN1cGVyLnJlbW92ZUZyb21VTUEobGluaywgb2xkU291cmNlLCBvbGRUYXJnZXQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUxpbmtzKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlpZiAobGluay5nZXRTb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVHcmFwaGljYWxEYXRhKGxpbmspOwotCQkJCS8vIGRpc2FibGUgaW50ZXJuYWwgbm90aWZpY2F0aW9uIG9mIHRoZSBzb3VyY2Ugbm9kZQotCQkJCS8vCi0JCQkJTm9kZUltcGwgc291cmNlTm9kZSA9IChOb2RlSW1wbCkgbGluay5nZXRTb3VyY2UoKTsKLQkJCQlib29sZWFuIG9sZE5vdGlmeSA9IHNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQl0cnkgewotCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5OwotCQkJCX0KLQkJCQkvL2xpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJCWxpbmsuc2V0T2JqZWN0KG51bGwpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJCQkvLyBkaXNhYmxlIGludGVybmFsIG5vdGlmaWNhdGlvbiBvZiB0aGUgc291cmNlIG5vZGUKLQkJCQkvLwotCQkJCU5vZGVJbXBsIHRhcmdldE5vZGUgPSAoTm9kZUltcGwpIGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQkJYm9vbGVhbiBvbGROb3RpZnkgPSB0YXJnZXROb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJdHJ5IHsKLQkJCQkJdGFyZ2V0Tm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXRhcmdldE5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTsKLQkJCQl9Ci0JCQkJLy9saW5rLnNldFNvdXJjZShudWxsKTsKLQkJCQlsaW5rLnNldE9iamVjdChudWxsKTsKLQkJCX0KLQkJfQotCX0KLX0gLy8gV29ya1Byb2R1Y3ROb2RlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2IxZGYxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW0gbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM2OWQ5NWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBhY3Rpdml0eSBkaWFncmFtIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9EaWFncmFtSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9EaWFncmFtSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDI3MDU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvRGlhZ3JhbUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnN0cmFpbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzdG9yZXMgZGlhZ3JhbSBwdWJsaXNoIG9wdGlvbnMgYW5kIHJlZmVyZW5jZXMgdG8gdXNlci1zcGVjaWZpZWQKLSAqIGRpYWdyYW1zIHRvIHJlcGxhY2UgdGhlIGFjdGl2aXR5IGRpYWdyYW0sIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtLCBvciB3b3JrCi0gKiBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbSBmb3IgYW4gYWN0aXZpdHkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSW5mbyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEX0lNQUdFX1VSSSA9ICJhZF9pbWFnZV91cmkiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9JTUFHRV9VUkkgPSAiYWRkX2ltYWdlX3VyaSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1BEX0lNQUdFX1VSSSA9ICJ3cGRfaW1hZ2VfdXJpIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0FEX0lNQUdFID0gInB1Ymxpc2hfYWRfaW1hZ2UiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQUREX0lNQUdFID0gInB1Ymxpc2hfYWRkX2ltYWdlIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX1dQRF9JTUFHRSA9ICJwdWJsaXNoX3dwZF9pbWFnZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU1JVEVSID0gInwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBTdHJpbmcgQURfSW1hZ2VVUkk7Ci0KLQlwcml2YXRlIFN0cmluZyBBRERfSW1hZ2VVUkk7Ci0KLQlwcml2YXRlIFN0cmluZyBXUERfSW1hZ2VVUkk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaEFESW1hZ2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaEFEREltYWdlOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hXUERJbWFnZTsKLQotCXByaXZhdGUgQ29uc3RyYWludCBjb25zdHJhaW50OwotCi0JcHJpdmF0ZSBTdXBwb3J0aW5nTWF0ZXJpYWwgYWN0aXZpdHlEaWFncmFtOwotCi0JcHJpdmF0ZSBTdXBwb3J0aW5nTWF0ZXJpYWwgYWN0aXZpdHlEZXRhaWxEaWFncmFtOwotCi0JcHJpdmF0ZSBTdXBwb3J0aW5nTWF0ZXJpYWwgd3BkRGlhZ3JhbTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYW5kIGxvYWRzIGEgRGlhZ3JhbUluZm8gaW5zdGFuY2UgZm9yIGEgZ2l2ZW4gYWN0aXZpdHkKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUluZm8oQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQlyZWZyZXNoKCk7Ci0JfQotCi0JcHJpdmF0ZSBEaWFncmFtSW5mbygpIHsKLQkJQURfSW1hZ2VVUkkgPSBBRERfSW1hZ2VVUkkgPSBXUERfSW1hZ2VVUkkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgRGlhZ3JhbUluZm8gbG9hZCgpIHsKLQkJRGlhZ3JhbUluZm8gaW5mbyA9IG5ldyBEaWFncmFtSW5mbygpOwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbnN0cmFpbnQuZ2V0Qm9keSgpLAotCQkJCURFTElNSVRFUik7IHRva2Vucy5oYXNNb3JlVG9rZW5zKCk7KSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0JCQlpbnQgaWQgPSB0b2tlbi5pbmRleE9mKCc9Jyk7Ci0JCQlpbnQgbWF4ID0gdG9rZW4ubGVuZ3RoKCkgLSAxOwotCQkJaWYgKGlkICE9IC0xICYmIGlkIDwgbWF4KSB7Ci0JCQkJU3RyaW5nIGtleSA9IHRva2VuLnN1YnN0cmluZygwLCBpZCk7Ci0JCQkJaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKEFEX0lNQUdFX1VSSSkpIHsKLQkJCQkJaW5mby5BRF9JbWFnZVVSSSA9IHRva2VuLnN1YnN0cmluZyhpZCArIDEpOwotCQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoQUREX0lNQUdFX1VSSSkpIHsKLQkJCQkJaW5mby5BRERfSW1hZ2VVUkkgPSB0b2tlbi5zdWJzdHJpbmcoaWQgKyAxKTsKLQkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKFdQRF9JTUFHRV9VUkkpKSB7Ci0JCQkJCWluZm8uV1BEX0ltYWdlVVJJID0gdG9rZW4uc3Vic3RyaW5nKGlkICsgMSk7Ci0JCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShQVUJMSVNIX0FEX0lNQUdFKSkgewotCQkJCQlpbmZvLnB1Ymxpc2hBREltYWdlID0gQm9vbGVhbi52YWx1ZU9mKAotCQkJCQkJCXRva2VuLnN1YnN0cmluZyhpZCArIDEpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKFBVQkxJU0hfQUREX0lNQUdFKSkgewotCQkJCQlpbmZvLnB1Ymxpc2hBRERJbWFnZSA9IEJvb2xlYW4udmFsdWVPZigKLQkJCQkJCQl0b2tlbi5zdWJzdHJpbmcoaWQgKyAxKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShQVUJMSVNIX1dQRF9JTUFHRSkpIHsKLQkJCQkJaW5mby5wdWJsaXNoV1BESW1hZ2UgPSBCb29sZWFuLnZhbHVlT2YoCi0JCQkJCQkJdG9rZW4uc3Vic3RyaW5nKGlkICsgMSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZSgpIHsKLQkJaWYgKGNvbnN0cmFpbnQgPT0gbnVsbCkgewotCQkJY29uc3RyYWludCA9IENvbnN0cmFpbnRNYW5hZ2VyLmdldENvbnN0cmFpbnQoYWN0aXZpdHksCi0JCQkJCUNvbnN0cmFpbnRNYW5hZ2VyLkFDSVRJVllfRElBR1JBTSwgdHJ1ZSk7Ci0JCX0KLQkJaWYgKGFjdGl2aXR5RGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlBRF9JbWFnZVVSSSA9IGFjdGl2aXR5RGlhZ3JhbS5nZXRHdWlkKCk7Ci0JCX0KLQkJaWYgKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlBRERfSW1hZ2VVUkkgPSBhY3Rpdml0eURldGFpbERpYWdyYW0uZ2V0R3VpZCgpOwotCQl9Ci0JCWlmICh3cGREaWFncmFtICE9IG51bGwpIHsKLQkJCVdQRF9JbWFnZVVSSSA9IHdwZERpYWdyYW0uZ2V0R3VpZCgpOwotCQl9Ci0KLQkJRGlhZ3JhbUluZm8gaW5mbyA9IGxvYWQoKTsKLQotCQlpZiAoQURfSW1hZ2VVUkkgIT0gbnVsbCkgewotCQkJaW5mby5BRF9JbWFnZVVSSSA9IEFEX0ltYWdlVVJJOwotCQl9Ci0JCWlmIChBRERfSW1hZ2VVUkkgIT0gbnVsbCkgewotCQkJaW5mby5BRERfSW1hZ2VVUkkgPSBBRERfSW1hZ2VVUkk7Ci0JCX0KLQkJaWYgKFdQRF9JbWFnZVVSSSAhPSBudWxsKSB7Ci0JCQlpbmZvLldQRF9JbWFnZVVSSSA9IFdQRF9JbWFnZVVSSTsKLQkJfQotCQlpbmZvLnB1Ymxpc2hBREltYWdlID0gcHVibGlzaEFESW1hZ2U7Ci0JCWluZm8ucHVibGlzaEFEREltYWdlID0gcHVibGlzaEFEREltYWdlOwotCQlpbmZvLnB1Ymxpc2hXUERJbWFnZSA9IHB1Ymxpc2hXUERJbWFnZTsKLQotCQlTdHJpbmcgc3RyID0gbmV3IFN0cmluZ0J1ZmZlcihBRF9JTUFHRV9VUkkpLmFwcGVuZCgnPScpLmFwcGVuZCgKLQkJCQlpbmZvLkFEX0ltYWdlVVJJKS5hcHBlbmQoREVMSU1JVEVSKS5hcHBlbmQoUFVCTElTSF9BRF9JTUFHRSkKLQkJCQkuYXBwZW5kKCc9JykuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGluZm8ucHVibGlzaEFESW1hZ2UpKQotCQkJCS5hcHBlbmQoREVMSU1JVEVSKS5hcHBlbmQoQUREX0lNQUdFX1VSSSkuYXBwZW5kKCc9JykuYXBwZW5kKAotCQkJCQkJU3RyaW5nLnZhbHVlT2YoaW5mby5BRERfSW1hZ2VVUkkpKS5hcHBlbmQoREVMSU1JVEVSKQotCQkJCS5hcHBlbmQoUFVCTElTSF9BRERfSU1BR0UpLmFwcGVuZCgnPScpLmFwcGVuZCgKLQkJCQkJCVN0cmluZy52YWx1ZU9mKGluZm8ucHVibGlzaEFEREltYWdlKSkuYXBwZW5kKERFTElNSVRFUikKLQkJCQkuYXBwZW5kKFdQRF9JTUFHRV9VUkkpLmFwcGVuZCgnPScpLmFwcGVuZCgKLQkJCQkJCVN0cmluZy52YWx1ZU9mKGluZm8uV1BEX0ltYWdlVVJJKSkuYXBwZW5kKERFTElNSVRFUikKLQkJCQkuYXBwZW5kKFBVQkxJU0hfV1BEX0lNQUdFKS5hcHBlbmQoJz0nKS5hcHBlbmQoCi0JCQkJCQlTdHJpbmcudmFsdWVPZihpbmZvLnB1Ymxpc2hXUERJbWFnZSkpLnRvU3RyaW5nKCk7Ci0KLQkJY29uc3RyYWludC5zZXRCb2R5KHN0cik7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoaXMgRGlhZ3JhbUluZm8gb2JqZWN0IGZyb20gdGhlIG1vZGVsCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJY29uc3RyYWludCA9IENvbnN0cmFpbnRNYW5hZ2VyLmdldENvbnN0cmFpbnQoYWN0aXZpdHksCi0JCQkJQ29uc3RyYWludE1hbmFnZXIuQUNJVElWWV9ESUFHUkFNLCBmYWxzZSk7Ci0JCWlmIChjb25zdHJhaW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCURpYWdyYW1JbmZvIGluZm8gPSBsb2FkKCk7Ci0KLQkJQURfSW1hZ2VVUkkgPSBpbmZvLkFEX0ltYWdlVVJJOwotCQlBRERfSW1hZ2VVUkkgPSBpbmZvLkFERF9JbWFnZVVSSTsKLQkJV1BEX0ltYWdlVVJJID0gaW5mby5XUERfSW1hZ2VVUkk7Ci0JCXB1Ymxpc2hBREltYWdlID0gaW5mby5wdWJsaXNoQURJbWFnZTsKLQkJcHVibGlzaEFEREltYWdlID0gaW5mby5wdWJsaXNoQURESW1hZ2U7Ci0JCXB1Ymxpc2hXUERJbWFnZSA9IGluZm8ucHVibGlzaFdQREltYWdlOwotCi0JCWFjdGl2aXR5RGlhZ3JhbSA9IGdldFN1cHBvcnRpbmdNYXRlcmlhbChBRF9JbWFnZVVSSSk7Ci0JCWFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA9IGdldFN1cHBvcnRpbmdNYXRlcmlhbChBRERfSW1hZ2VVUkkpOwotCQl3cGREaWFncmFtID0gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKFdQRF9JbWFnZVVSSSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBRF9JbWFnZVVSSSgpIHsKLQkJcmV0dXJuIEFEX0ltYWdlVVJJOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QUREX0ltYWdlVVJJKCkgewotCQlyZXR1cm4gQUREX0ltYWdlVVJJOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V1BEX0ltYWdlVVJJKCkgewotCQlyZXR1cm4gV1BEX0ltYWdlVVJJOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wdGlvbiB0byBwdWJsaXNoIHVzZXItc3BlY2lmaWVkIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0JICogaW5zdGVhZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5QdWJsaXNoQURESW1hZ2UoKSB7Ci0JCXJldHVybiBwdWJsaXNoQURESW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgb3B0aW9uIHRvIHB1Ymxpc2ggdXNlci1zcGVjaWZpZWQgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0KLQkgKiBpbnN0ZWFkLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoQURESW1hZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoQURESW1hZ2UoYm9vbGVhbiBwdWJsaXNoQURESW1hZ2UpIHsKLQkJdGhpcy5wdWJsaXNoQURESW1hZ2UgPSBwdWJsaXNoQURESW1hZ2U7Ci0JCXNhdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHRpb24gdG8gcHVibGlzaCB1c2VyLXNwZWNpZmllZCBhY3Rpdml0eSBkaWFncmFtIGluc3RlYWQuCi0JICogCi0JICogQHJldHVybgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RGlhZ3JhbSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUHVibGlzaEFESW1hZ2UoKSB7Ci0JCXJldHVybiBwdWJsaXNoQURJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBvcHRpb24gdG8gcHVibGlzaCB1c2VyLXNwZWNpZmllZCBpbWFnZSBmb3IgYWN0aXZpdHkgZGlhZ3JhbQotCSAqIGluc3RlYWQgb2YgdGhlIGFjdGl2aXR5IGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaEFESW1hZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoQURJbWFnZShib29sZWFuIHB1Ymxpc2hBREltYWdlKSB7Ci0JCXRoaXMucHVibGlzaEFESW1hZ2UgPSBwdWJsaXNoQURJbWFnZTsKLQkJc2F2ZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wdGlvbiB0byBwdWJsaXNoIHVzZXItc3BlY2lmaWVkIHdvcmsgcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0KLQkgKiBpbnN0ZWFkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAc2VlICNnZXRXUEREaWFncmFtKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5QdWJsaXNoV1BESW1hZ2UoKSB7Ci0JCXJldHVybiBwdWJsaXNoV1BESW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgb3B0aW9uIHRvIHB1Ymxpc2ggdXNlci1zcGVjaWZpZWQgaW1hZ2UgZm9yIHdvcmsgcHJvZHVjdAotCSAqIGRlcGVuZGVuY3kgZGlhZ3JhbSBpbnN0ZWFkIG9mIHRoZSB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hXUERJbWFnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hXUERJbWFnZShib29sZWFuIHB1Ymxpc2hXUERJbWFnZSkgewotCQl0aGlzLnB1Ymxpc2hXUERJbWFnZSA9IHB1Ymxpc2hXUERJbWFnZTsKLQkJc2F2ZSgpOwotCX0KLQotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgZ2V0QWN0aXZpdHlEaWFncmFtKCkgewotCQlyZXR1cm4gYWN0aXZpdHlEaWFncmFtOwotCX0KLQotCS8qKgotCSAqIEdldHMgdXNlci1zcGVjaWZpZWQgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0uCi0JICogCi0JICogQHJldHVybiBhIHtAbGluayBTdXBwb3J0aW5nTWF0ZXJpYWx9IHdpdGggdGhlIGRpZ3JhbSBpbiBpdHMgbWFpbgotCSAqICAgICAgICAgZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHVzZXItc3BlY2lmaWVkIHdvcmsgcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0uCi0JICogCi0JICogQHJldHVybiBhIHtAbGluayBTdXBwb3J0aW5nTWF0ZXJpYWx9IHdpdGggdGhlIGRpZ3JhbSBpbiBpdHMgbWFpbgotCSAqICAgICAgICAgZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGdldFdQRERpYWdyYW0oKSB7Ci0JCXJldHVybiB3cGREaWFncmFtOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdQRERpYWdyYW0oU3VwcG9ydGluZ01hdGVyaWFsIHdwZERpYWdyYW0pIHsKLQkJaWYgKHRoaXMud3BkRGlhZ3JhbSAhPSB3cGREaWFncmFtKSB7Ci0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgb2xkID0gdGhpcy53cGREaWFncmFtOwotCQkJdGhpcy53cGREaWFncmFtID0gd3BkRGlhZ3JhbTsKLQkJCXVwZGF0ZShvbGQsIHdwZERpYWdyYW0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKAotCQkJU3VwcG9ydGluZ01hdGVyaWFsIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQlpZiAodGhpcy5hY3Rpdml0eURldGFpbERpYWdyYW0gIT0gYWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgb2xkID0gdGhpcy5hY3Rpdml0eURldGFpbERpYWdyYW07Ci0JCQl0aGlzLmFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA9IGFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLQkJCXVwZGF0ZShvbGQsIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eURpYWdyYW0oU3VwcG9ydGluZ01hdGVyaWFsIGFjdGl2aXR5RGlhZ3JhbSkgewotCQlpZiAodGhpcy5hY3Rpdml0eURpYWdyYW0gIT0gYWN0aXZpdHlEaWFncmFtKSB7Ci0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgb2xkID0gdGhpcy5hY3Rpdml0eURpYWdyYW07Ci0JCQl0aGlzLmFjdGl2aXR5RGlhZ3JhbSA9IGFjdGl2aXR5RGlhZ3JhbTsKLQkJCXVwZGF0ZShvbGQsIGFjdGl2aXR5RGlhZ3JhbSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBTdXBwb3J0aW5nTWF0ZXJpYWwgb2JqZWN0IGZvciB0aGUgZGlhZ3JhbSB3aXRoIHRoZSBnaXZlbiBVUkkKLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbVVSSQotCSAqIEByZXR1cm4gbnVsbCBvZiB0aGUgU3VwcG9ydGluZ01hdGVyaWFsIG9iamVjdCBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlCi0JICogICAgICAgICBsaWJyYXJ5Ci0JICovCi0JcHJpdmF0ZSBTdXBwb3J0aW5nTWF0ZXJpYWwgZ2V0U3VwcG9ydGluZ01hdGVyaWFsKFN0cmluZyBkaWFncmFtVVJJKSB7Ci0JCS8vIGRpYWdyYW1VUkkgaXMgdGhlIEdVSUQgb2YgdGhlIHN1cHBvcnRpbmcgbWF0ZXJpYWwgdGhhdCBtdXN0IGJlIGluIHRoZQotCQkvLyBsaXN0Ci0JCS8vIG9mIHN1cHBvcnRpbmcgbWF0ZXJpYWxzIG9mIHRoZSBhY3Rpdml0eQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0eS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgZSA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGUuZ2V0R3VpZCgpLmVxdWFscyhkaWFncmFtVVJJKSkgewotCQkJCXJldHVybiBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGUoU3VwcG9ydGluZ01hdGVyaWFsIG9sZCwgU3VwcG9ydGluZ01hdGVyaWFsIG5ldSkgewotCQlpZiAob2xkICE9IG51bGwpIHsKLQkJCWFjdGl2aXR5LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5yZW1vdmUob2xkKTsKLQkJfQotCQlpZiAobmV1ICE9IG51bGwpIHsKLQkJCWFjdGl2aXR5LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5hZGQobmV1KTsKLQkJfQotCQlzYXZlKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBzdXBwb3J0aW5nIG1hdGVyaWFsIGlzIGEgdXNlci1kZWZpbmVkIGRpYWdyYW0gb2YgdGhpcwotCSAqIERpYWdyYW1JbmZvJ3MgYWN0aXZpdHkKLQkgKiAKLQkgKiBAcGFyYW0gc20KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaWFncmFtKFN1cHBvcnRpbmdNYXRlcmlhbCBzbSkgewotCQlyZXR1cm4gc20gIT0gbnVsbAotCQkJCSYmIChzbSA9PSBhY3Rpdml0eURpYWdyYW0gfHwgc20gPT0gYWN0aXZpdHlEZXRhaWxEaWFncmFtIHx8IHNtID09IHdwZERpYWdyYW0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvRGlhZ3JhbU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvRGlhZ3JhbU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzgzM2I2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0RpYWdyYW1NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLQotLyoqCi0gKiBFeHRlbnNpb24gdG8gY29udHJpYnV0ZSB0byBleHRlbnNpb24gcG9pbnQKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmRpYWdyYW1NYW5hZ2VyIgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1biAyNywgMjAwNgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU1hbmFnZXIgaW1wbGVtZW50cyBJRGlhZ3JhbU1hbmFnZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyI2dldERpYWdyYW0ob3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKEFjdGl2aXR5IGFjdCwgaW50IHR5cGUpIHsKLQkJcmV0dXJuIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbShhY3QsIHR5cGUsCi0JCQkJZmFsc2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9HcmFwaGljYWxEYXRhSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0dyYXBoaWNhbERhdGFIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGQ1YTA4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0dyYXBoaWNhbERhdGFIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5EaWFncmFtUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaGljYWxEYXRhSGVscGVyIHsKLQkvKiogRGlhZ3JhbSB0eXBlIGNvbnN0YW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0RJQUdSQU0gPSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0gPSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNID0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOwotCi0Jc3RhdGljIGZpbmFsIGludFtdIERJQUdSQU1fVFlQRVMgPSB7IEFDVElWSVRZX0RJQUdSQU0sCi0JCQlBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSwgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSB9OwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIERJQUdSQU1fVFlQRV9URVhUUyA9IHsKLQkJCURpYWdyYW1SZXNvdXJjZXMudHlwZV9hY3Rpdml0eSwgRGlhZ3JhbVJlc291cmNlcy50eXBlX1dQRCwgRGlhZ3JhbVJlc291cmNlcy50eXBlX2FjdGl2aXR5RGV0YWlsIH07IAotCi0JLyoqIFByb3BlcnR5IG5hbWVzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1dPUktfUFJPRFVDVF9DT01QT1NJVEVfVFlQRSA9ICJ3cENvbXBvc2l0ZVR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHByb3BlcnR5IG5hbWVzIGZvciBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbSAqKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0FVVE9fTEFZT1VUID0gImF1dG9sYXlvdXQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9JTkRFWCA9ICJpbmRleCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogcHJvcGVydHkgdmFsdWVzIGNvbnN0YW50cyBmb3IgYXV0b2xheW91dCAqKi8KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0FVVE9fTEFZT1VUX1ZBTFVFX1RSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0FVVE9fTEFZT1VUX1ZBTFVFX0ZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBUeXBlIGluZm8gZm9yIFVJIG5vZGUgKEBzZWUgVHlwZWROb2RlKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX05PREVfU1lOQ0hfQkFSID0gInN5bmNobm9uaXphdGlvbiBiYXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX1NUQVJUID0gInN0YXJ0IG5vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0VORCA9ICJlbmQgbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX05PREVfREVDSVNJT04gPSAiZGVjaXNpb24gbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX05PREVfRlJFRV9URVhUID0gImZyZWUgdGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKiBEaWFncmFtIHR5cGUgc3RyaW5nIGNvbnN0YW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fV09SS0ZMT1cgPSAiV29ya2Zsb3ciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHUkFNX1dPUktfUFJPRFVDVF9ERVBFTkRFTkNZID0gIldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9BQ1RJVklUWV9ERVRBSUwgPSAiQWN0aXZpdHkgRGV0YWlsIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9ESUFHUkFNX1RBU0tTX1BFUl9ST1cgPSAiQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fVEFTS1NfUEVSX1JPVyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgUG9pbnQgdG9Qb2ludChvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IHApIHsKLQkJcmV0dXJuIG5ldyBQb2ludChwLmdldFgoKS5kb3VibGVWYWx1ZSgpLCBwLmdldFkoKS5kb3VibGVWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgbmV3TW9kZWxQb2ludChpbnQgeCwgaW50IHkpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBwID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9pbnQoKTsKLQkJcC5zZXRYKG5ldyBEb3VibGUoeCkpOwotCQlwLnNldFkobmV3IERvdWJsZSh5KSk7Ci0JCXJldHVybiBwOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHkgZmluZFByb3BlcnR5KEdyYXBoTm9kZSBub2RlLCBTdHJpbmcgcHJvcEtleSkgewotCQlmb3IgKGludCBpID0gbm9kZS5nZXRQcm9wZXJ0eSgpLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSBub2RlLmdldFByb3BlcnR5KCkuZ2V0KGkpOwotCQkJaWYgKHByb3BLZXkuZXF1YWxzKHByb3AuZ2V0S2V5KCkpKQotCQkJCXJldHVybiBwcm9wOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3aWR0aAotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBEaW1lbnNpb24gbmV3TW9kZWxEaW1lbnNpb24oaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCURpbWVuc2lvbiBzaXplID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGltZW5zaW9uKCk7Ci0JCXNpemUuc2V0V2lkdGgobmV3IERvdWJsZSh3aWR0aCkpOwotCQlzaXplLnNldEhlaWdodChuZXcgRG91YmxlKGhlaWdodCkpOwotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZmlsbENvbm5lY3Rpb25zKE5vZGUgbm9kZSwgR3JhcGhOb2RlIGdyYXBoTm9kZSkgewotCQlib29sZWFuIG9sZCA9IG5vZGUuZURlbGl2ZXIoKTsKLQkJdHJ5IHsKLQkJCW5vZGUuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkaWFncmFtID0gKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIG5vZGUKLQkJCQkJLmVDb250YWluZXIoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdyYXBoTm9kZS5nZXRBbmNob3JhZ2UoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJR3JhcGhDb25uZWN0b3IgY29ubiA9ICgoR3JhcGhDb25uZWN0b3IpIGl0ZXIubmV4dCgpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29ubi5nZXRHcmFwaEVkZ2UoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmKGVkZ2UuZ2V0QW5jaG9yKCkuc2l6ZSgpID4gMSkgeyAKLQkJCQkJCUdyYXBoQ29ubmVjdG9yIHRhcmdldENvbm5lY3RvcjsKLQkJCQkJCUxpbmsgbGluayA9IG51bGw7Ci0JCQkJCQlpZiAoZWRnZS5lQ29udGFpbmVyKCkgPT0gZ3JhcGhOb2RlKSB7Ci0JCQkJCQkJdGFyZ2V0Q29ubmVjdG9yID0gKEdyYXBoQ29ubmVjdG9yKSBlZGdlLmdldEFuY2hvcigpCi0JCQkJCQkJLmdldCgxKTsKLQkJCQkJCQlHcmFwaE5vZGUgdGFyZ2V0R3JhcGhOb2RlID0gKEdyYXBoTm9kZSkgdGFyZ2V0Q29ubmVjdG9yCi0JCQkJCQkJLmVDb250YWluZXIoKTsKLQkJCQkJCQlpZiAoZ3JhcGhOb2RlLmVDb250YWluZXIoKSA9PSB0YXJnZXRHcmFwaE5vZGUKLQkJCQkJCQkJCS5lQ29udGFpbmVyKCkpIHsKLQkJCQkJCQkJT2JqZWN0IGxpbmtlZE9iamVjdCA9IHRhcmdldEdyYXBoTm9kZTsKLQkJCQkJCQkJaWYgKHRhcmdldEdyYXBoTm9kZS5nZXRTZW1hbnRpY01vZGVsKCkgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB7Ci0JCQkJCQkJCQlsaW5rZWRPYmplY3QgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHRhcmdldEdyYXBoTm9kZQotCQkJCQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJTm9kZSB0YXJnZXROb2RlID0gZmluZE5vZGUoZGlhZ3JhbSwgbGlua2VkT2JqZWN0KTsKLQkJCQkJCQkJbGluayA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpOwotCQkJCQkJCQlsaW5rLnNldFNvdXJjZShub2RlKTsKLQkJCQkJCQkJbGluay5zZXRUYXJnZXQodGFyZ2V0Tm9kZSk7Ci0JCQkJCQkJCWxpbmsuc2V0T2JqZWN0KGVkZ2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbm9kZS5lU2V0RGVsaXZlcihvbGQpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZGlhZ3JhbSwKLQkJCUdyYXBoTm9kZSBnTm9kZSwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSBnTm9kZS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCWlmIChicmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB7Ci0JCQlJTm9kZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gKElOb2RlQ2hhbmdlTGlzdGVuZXIpIFVtYVV0aWwKLQkJCQkJLmdldEFkYXB0ZXIoKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBicmlkZ2UpLmdldEVsZW1lbnQoKSwKLQkJCQkJCQlhZGFwdGVyVHlwZSk7Ci0JCQlyZXR1cm4gbGlzdGVuZXIuZ2V0Tm9kZSgpOwotCQl9Ci0KLQkJLy8gZ05vZGUgaXMgbm90IGEgYWN0aXZpdHkncyBHcmFwaE5vZGUuIFRyeSB0byBmaW5kIGEgTm9kZSB3aXRoIGdOb2RlIGFzCi0JCS8vIGEgbGlua2VkIG9iamVjdCBpbiB0aGUgZGlhZ3JhbS4KLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGdOb2RlID09IGVsZW1lbnQuZ2V0T2JqZWN0KCkpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBub2RlIHdob3NlIGxpbmtlZCBvYmplY3QgaXMgdGhlIGdpdmVuIG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgZmluZE5vZGUoTm9kZUNvbnRhaW5lciBjb250YWluZXIsIE9iamVjdCBvYmplY3QpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGFpbmVyLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0ID09IGVsZW1lbnQuZ2V0T2JqZWN0KCkgfHwgb2JqZWN0ID09IGVsZW1lbnQuZ2V0TGlua2VkRWxlbWVudCgpKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgbm9kZSB3aG9zZSBsaW5rZWQgb2JqZWN0IG9yIG9uZSBvZiBpdHMgYmFzZSBpcyB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlKE5vZGVDb250YWluZXIgY29udGFpbmVyLCBPYmplY3Qgb2JqZWN0LAotCQkJYm9vbGVhbiBjaGVja0Jhc2UpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGFpbmVyLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0ID09IG5vZGUuZ2V0T2JqZWN0KCkpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0gZWxzZSBpZiAoY2hlY2tCYXNlCi0JCQkJCSYmIG5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlmb3IgKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBub2RlCi0JCQkJCQkuZ2V0T2JqZWN0KCkpLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsgdmUgIT0gbnVsbDsgdmUgPSB2ZQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCQlpZiAodmUgPT0gb2JqZWN0KSB7Ci0JCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE5vZGUgZmluZE5vZGUoQWN0aXZpdHlEZXRhaWxEaWFncmFtIGRpYWdyYW0sIE9iamVjdCBvYmplY3QpIHsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSkgewotCQkJCW5vZGUgPSBmaW5kTm9kZSgoTm9kZUNvbnRhaW5lcikgZWxlbWVudCwgb2JqZWN0KTsKLQkJCQlpZiAobm9kZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJCWlmIChvYmplY3QgPT0gZWxlbWVudC5nZXRPYmplY3QoKSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpbmsgZmluZExpbmsoTm9kZSBzb3VyY2UsIE9iamVjdCB0YXJnZXRMaW5rZWRFbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNvdXJjZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQlpZih0YXJnZXQuZ2V0TGlua2VkRWxlbWVudCgpID09IHRhcmdldExpbmtlZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gbGluazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZyhpbnQgdHlwZSkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBUeXBlZE5vZGUuREVDSVNJT046Ci0JCQlyZXR1cm4gR1JBUEhfTk9ERV9ERUNJU0lPTjsKLQkJY2FzZSBUeXBlZE5vZGUuRU5EOgotCQkJcmV0dXJuIEdSQVBIX05PREVfRU5EOwotCQljYXNlIFR5cGVkTm9kZS5TVEFSVDoKLQkJCXJldHVybiBHUkFQSF9OT0RFX1NUQVJUOwotCQljYXNlIFR5cGVkTm9kZS5TWU5DSF9CQVI6Ci0JCQlyZXR1cm4gR1JBUEhfTk9ERV9TWU5DSF9CQVI7Ci0JCWNhc2UgVHlwZWROb2RlLkZSRUVfVEVYVDoKLQkJCXJldHVybiBHUkFQSF9OT0RFX0ZSRUVfVEVYVDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEdyYXBoTm9kZSBuZXdUeXBlZEdyYXBoTm9kZShpbnQgdHlwZSkgewotCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhOb2RlKCk7Ci0JCVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IGJyaWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCk7Ci0JCWJyaWRnZS5zZXRUeXBlSW5mbyhnZXRUeXBlU3RyaW5nKHR5cGUpKTsKLQkJZ3JhcGhOb2RlLnNldFNlbWFudGljTW9kZWwoYnJpZGdlKTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBwb2ludCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvaW50KCk7Ci0JCXBvaW50LnNldFgobmV3IERvdWJsZSgtMSkpOwotCQlwb2ludC5zZXRZKG5ldyBEb3VibGUoLTEpKTsKLQkJZ3JhcGhOb2RlLnNldFBvc2l0aW9uKHBvaW50KTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24gZGltID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGltZW5zaW9uKCk7Ci0JCWRpbS5zZXRXaWR0aChuZXcgRG91YmxlKC0xKSk7Ci0JCWRpbS5zZXRIZWlnaHQobmV3IERvdWJsZSgtMSkpOwotCQlncmFwaE5vZGUuc2V0U2l6ZShkaW0pOwotCi0JCWlmICh0eXBlID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpIHsKLQkJCWdyYXBoTm9kZS5zZXROYW1lKERpYWdyYW1SZXNvdXJjZXMuYWRkRnJlZVR4dCk7IAotCQl9Ci0JCWlmICh0eXBlID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpIHsKLQkJCVByb3BlcnR5IHByb3BlcnR5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJCXByb3BlcnR5LnNldEtleShHUkFQSF9OT0RFX0ZSRUVfVEVYVCk7Ci0JCQlwcm9wZXJ0eS5zZXRWYWx1ZShEaWFncmFtUmVzb3VyY2VzLmFkZEZyZWVUeHQpOyAKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWxpc3QuYWRkKHByb3BlcnR5KTsKLQkJCWdyYXBoTm9kZS5zZXQoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSwgbGlzdCk7Ci0JCX0KLQotCQlyZXR1cm4gZ3JhcGhOb2RlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaW5rCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUdyYXBoaWNhbERhdGEoTGluayBsaW5rKSB7Ci0JCS8vIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlR3JhcGhDb25uZWN0b3JQYWlyKGxpbmsuZ2V0U291cmNlKCkuZ2V0R3JhcGhOb2RlKCksCi0JCS8vIGxpbmsuZ2V0VGFyZ2V0KCkuZ2V0R3JhcGhOb2RlKCkpOwotCQkKLQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBsaW5rLmdldE9iamVjdCgpOwotCQlpZihlZGdlICE9IG51bGwpIHsKLQkJCUdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlR3JhcGhFZGdlKGVkZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpbmsKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkR3JhcGhpY2FsRGF0YShMaW5rIGxpbmspIHsKLQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBsaW5rLmdldE9iamVjdCgpOwotCQlpZiAoZWRnZSA9PSBudWxsKSB7Ci0JCQkvLyBuZXcgbGluawotCQkJLy8KLQkJCWVkZ2UgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZEdyYXBoQ29ubmVjdG9yUGFpcigKLQkJCQkJbGluay5nZXRTb3VyY2UoKS5nZXRHcmFwaE5vZGUoKSwKLQkJCQkJbGluay5nZXRUYXJnZXQoKS5nZXRHcmFwaE5vZGUoKSk7Ci0JCQlsaW5rLnNldE9iamVjdChlZGdlKTsKLQotCQkJLy8gc2F2ZSB0aGUgc291cmNlIGVuZCBwb2ludCBhbmQgdGFyZ2V0IGVuZCBwb2ludCBmcm9tIHRoZSBnaXZlbgotCQkJLy8gbGluawotCQkJLy8KLQkJCWxpbmsuc2V0U291cmNlRW5kUG9pbnQobGluay5nZXRTb3VyY2VFbmRQb2ludCgpKTsKLQkJCWxpbmsuc2V0VGFyZ2V0RW5kUG9pbnQobGluay5nZXRUYXJnZXRFbmRQb2ludCgpKTsKLQkJfSBlbHNlIHsKLQkJCS8vIHVuZG8gZGVsZXRlZCBsaW5rCi0JCQkvLwotCQkJR3JhcGhOb2RlIHNyY05vZGUgPSBsaW5rLmdldFNvdXJjZSgpLmdldEdyYXBoTm9kZSgpOwotCQkJR3JhcGhOb2RlIHRhcmdldE5vZGUgPSBsaW5rLmdldFRhcmdldCgpLmdldEdyYXBoTm9kZSgpOwotCQkJT2JqZWN0IHNyY0Nvbm5lY3RvciA9IGVkZ2UuZ2V0QW5jaG9yKCkuZ2V0KDApOwotCQkJc3JjTm9kZS5nZXRBbmNob3JhZ2UoKS5hZGQoc3JjQ29ubmVjdG9yKTsKLQkJCXNyY05vZGUuZ2V0Q29udGFpbmVkKCkuYWRkKGVkZ2UpOwotCQkJT2JqZWN0IHRhcmdldENvbm5lY3RvciA9IGVkZ2UuZ2V0QW5jaG9yKCkuZ2V0KDEpOwotCQkJdGFyZ2V0Tm9kZS5nZXRBbmNob3JhZ2UoKS5hZGQodGFyZ2V0Q29ubmVjdG9yKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTZW1hbnRpY01vZGVsKExpbmsgbGluaywgV29ya09yZGVyIHdvcmtPcmRlcikgewotCQkvLyBzZXQgdGhlIFdvcmtPcmRlciBhcyB0aGUgZWxlbWVudCBvZiB0aGUgU2VtYW50aWNNb2RlbCBvZiB0aGUgbGluaydzCi0JCS8vIEdyYXBoRWRnZQotCQkvLwotCQlHcmFwaEVkZ2UgZWRnZSA9IChHcmFwaEVkZ2UpIGxpbmsuZ2V0T2JqZWN0KCk7Ci0JCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCQlicmlkZ2Uuc2V0RWxlbWVudCh3b3JrT3JkZXIpOwotCQllZGdlLnNldFNlbWFudGljTW9kZWwoYnJpZGdlKTsKLQl9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0U291cmNlQWN0aXZpdHlOb2RlcyhUeXBlZE5vZGUgdHlwZWROb2RlKSB7Ci0JLy8gTGlzdCBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBnZXRTb3VyY2VBY3Rpdml0eU5vZGVzKGFjdE5vZGVzLCB0eXBlZE5vZGUpOwotCS8vIHJldHVybiBhY3ROb2RlczsKLQkvLyB9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0U291cmNlTm9kZXMoVHlwZWROb2RlIHR5cGVkTm9kZSwgQ2xhc3MgdHlwZSkgewotCQlMaXN0IGFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRTb3VyY2VOb2RlcyhhY3ROb2RlcywgdHlwZWROb2RlLCB0eXBlKTsKLQkJcmV0dXJuIGFjdE5vZGVzOwotCX0KLQotCS8vIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTb3VyY2VBY3Rpdml0eU5vZGVzKENvbGxlY3Rpb24gYWN0Tm9kZXMsIFR5cGVkTm9kZQotCS8vIHR5cGVkTm9kZSkgewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsKLQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBMaW5rIGxpbmsgPSAoTGluaylpdGVyLm5leHQoKTsKLQkvLyBOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JLy8gaWYoc291cmNlIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JLy8gYWN0Tm9kZXMuYWRkKHNvdXJjZSk7Ci0JLy8gfQotCS8vIGVsc2UgaWYoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JLy8gZ2V0U291cmNlQWN0aXZpdHlOb2RlcyhhY3ROb2RlcywgKFR5cGVkTm9kZSkgc291cmNlKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQotCS8vIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRUYXJnZXRBY3Rpdml0eU5vZGVzKFR5cGVkTm9kZSB0eXBlZE5vZGUpIHsKLQkvLyBMaXN0IGFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGdldFRhcmdldEFjdGl2aXR5Tm9kZXMoYWN0Tm9kZXMsIHR5cGVkTm9kZSk7Ci0JLy8gcmV0dXJuIGFjdE5vZGVzOwotCS8vIH0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRUYXJnZXROb2RlcyhUeXBlZE5vZGUgdHlwZWROb2RlLCBDbGFzcyB0eXBlKSB7Ci0JCUxpc3QgYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldFRhcmdldE5vZGVzKGFjdE5vZGVzLCB0eXBlZE5vZGUsIHR5cGUpOwotCQlyZXR1cm4gYWN0Tm9kZXM7Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyB2b2lkIGdldFRhcmdldEFjdGl2aXR5Tm9kZXMoQ29sbGVjdGlvbiBhY3ROb2RlcywgVHlwZWROb2RlCi0JLy8gdHlwZWROb2RlKSB7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOwotCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIExpbmsgbGluayA9IChMaW5rKWl0ZXIubmV4dCgpOwotCS8vIE5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkvLyBpZih0YXJnZXQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkvLyBhY3ROb2Rlcy5hZGQodGFyZ2V0KTsKLQkvLyB9Ci0JLy8gZWxzZSBpZih0YXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkvLyBnZXRUYXJnZXRBY3Rpdml0eU5vZGVzKGFjdE5vZGVzLCAoVHlwZWROb2RlKSB0YXJnZXQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0JLyoqCi0JICogR2V0cyBhbGwgbm9kZXMgd2l0aCB0aGUgZ2l2ZW4gdHlwZSB0aGF0IGFyZSBkaXJlY3Qgb3IgaW5kaXJlY3QgdGFyZ2V0cyBvZgotCSAqIHRoZSBnaXZlbiBzb3VyY2UgdHlwZWROb2RlLgotCSAqIAotCSAqIEBwYXJhbSBhY3ROb2RlcwotCSAqIEBwYXJhbSB0eXBlZE5vZGUKLQkgKiBAcGFyYW0gdHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRUYXJnZXROb2RlcyhDb2xsZWN0aW9uIGFjdE5vZGVzLCBUeXBlZE5vZGUgdHlwZWROb2RlLAotCQkJQ2xhc3MgdHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJTm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJaWYgKHR5cGUuaXNJbnN0YW5jZSh0YXJnZXQpKSB7Ci0JCQkJYWN0Tm9kZXMuYWRkKHRhcmdldCk7Ci0JCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCWdldFRhcmdldE5vZGVzKGFjdE5vZGVzLCAoVHlwZWROb2RlKSB0YXJnZXQsIHR5cGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFNvdXJjZU5vZGVzKENvbGxlY3Rpb24gYWN0Tm9kZXMsIFR5cGVkTm9kZSB0eXBlZE5vZGUsCi0JCQlDbGFzcyB0eXBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQlpZiAodHlwZS5pc0luc3RhbmNlKHNvdXJjZSkpIHsKLQkJCQlhY3ROb2Rlcy5hZGQoc291cmNlKTsKLQkJCX0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJZ2V0U291cmNlTm9kZXMoYWN0Tm9kZXMsIChUeXBlZE5vZGUpIHNvdXJjZSwgdHlwZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE5vZGUgZ2V0Rmlyc3RTb3VyY2VOb2RlKFR5cGVkTm9kZSB0eXBlZE5vZGUsIENsYXNzIHR5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCU5vZGUgc291cmNlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJCWlmICh0eXBlLmlzSW5zdGFuY2Uoc291cmNlKSkgewotCQkJCXJldHVybiBzb3VyY2U7Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCXNvdXJjZSA9IGdldEZpcnN0U291cmNlTm9kZSgoVHlwZWROb2RlKSBzb3VyY2UsIHR5cGUpOwotCQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHNvdXJjZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlciByZW1vdmVXb3JrT3JkZXIoTmFtZWROb2RlSW1wbCBub2RlLAotCQkJT2JqZWN0IHByZWRCcmVha2Rvd25FbGVtZW50KSB7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm9kZS5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCW5vZGUuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm4gVW1hVXRpbC5yZW1vdmVXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlCi0JCQkJCS5nZXRPYmplY3QoKSwgcHJlZEJyZWFrZG93bkVsZW1lbnQpOwotCQl9IGZpbmFsbHkgewotCQkJbm9kZS5zZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmeSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlciBhZGREZWZhdWx0V29ya09yZGVyKE5hbWVkTm9kZUltcGwgbm9kZSwKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWRCcmVha2Rvd25FbGVtZW50KSB7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm9kZS5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCW5vZGUuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm4gVW1hVXRpbC5jcmVhdGVEZWZhdWx0V29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkuZ2V0T2JqZWN0KCksIHByZWRCcmVha2Rvd25FbGVtZW50KTsKLQkJfSBmaW5hbGx5IHsKLQkJCW5vZGUuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZnkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza0Rlc2NyaXB0b3IKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc05vUm9sZURlc2NyaXB0b3JBc3NvY2lhdGVkKAotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IpIHsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdG9yLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkgPT0gbnVsbDsKLQkJLy8gY29tbWVudGVkIC0gcmVxdWlyZW1lbnRzIG5vdCB0byBhbGxvdyBhZGRpdGlvbmFsIHBlcmZvcm1lciBhbmQKLQkJLy8gYXNzaXN0ZWQgYnkgaW4gZGlhZ3JhbXMuCi0JCS8vICYmIHRhc2tEZXNjcmlwdG9yLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuaXNFbXB0eSgpOwotCQkvLyAmJiB0YXNrRGVzY3JpcHRvci5nZXRBc3Npc3RlZEJ5KCkuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKE5vZGVDb250YWluZXIgY29udGFpbmVyLCBOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGFpbmVyLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCA9PSBub2RlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcgotCQkJCQkmJiBjb250YWlucygoTm9kZUNvbnRhaW5lcikgY2hpbGQsIG5vZGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZWZyZXNoRnJvbUJhc2UoRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCS8vIGZpbmQgdGhlIGJhc2UgZGlhZ3JhbQotCQkvLwotCQlTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gZGlhZ3JhbS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCWlmIChtb2RlbEJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHsKLQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgdW1hTW9kZWxCcmlkZ2UgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIG1vZGVsQnJpZGdlKTsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgdW1hTW9kZWxCcmlkZ2UuZ2V0RWxlbWVudCgpOwotCQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlID09IG51bGwKLQkJCQkJfHwgYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaW50IGRpYWdyYW1UeXBlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbSk7Ci0JCQlzd2l0Y2ggKGRpYWdyYW1UeXBlKSB7Ci0JCQljYXNlIEFDVElWSVRZX0RJQUdSQU06IHsKLQkJCQlEaWFncmFtIGJhc2VEaWFncmFtID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldFVNQURpYWdyYW0oYmFzZSwgZGlhZ3JhbVR5cGUsIGZhbHNlKTsKLQkJCQlpZiAoYmFzZURpYWdyYW0gPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUxpc3Qgb2xkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJRGlhZ3JhbSBjb3B5ID0gY29weURpYWdyYW0oYmFzZURpYWdyYW0pOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGJhc2VEaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUdyYXBoTm9kZSBiYXNlTm9kZSA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQltb2RlbEJyaWRnZSA9IGJhc2VOb2RlLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQkJaWYgKG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJCQkJLy8gdGhpcyBpcyBhIGVsZW1lbnQncyBub2RlCi0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIG1vZGVsQnJpZGdlKQotCQkJCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCQkJR3JhcGhOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5maW5kR3JhcGhOb2RlKAotCQkJCQkJCQlkaWFncmFtLCBlKTsKLQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCQlvbGROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoaXNVSUdyYXBoTm9kZShiYXNlTm9kZSkpIHsKLQkJCQkJCUdyYXBoTm9kZSBub2RlID0gZmluZFVJR3JhcGhOb2RlKGRpYWdyYW0sIGJhc2VOb2RlCi0JCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJCW9sZE5vZGVzLmFkZChub2RlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIC8vIHJlbW92ZSBhbGwgdGhlIEdyYXBoRWRnZXMgb2YgdGhlIG9sZCBub2RlcwotCQkJCS8vIC8vCi0JCQkJLy8gTGlzdCByZW1vdmVFZGdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbGROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkvLyBHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2RlLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7Ci0JCQkJLy8gaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCS8vIE9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBHcmFwaEVkZ2UpIHsKLQkJCQkvLyByZW1vdmVFZGdlcy5hZGQoZWxlbWVudCk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gaWYoIXJlbW92ZUVkZ2VzLmlzRW1wdHkoKSkgewotCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZUVkZ2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkvLyAuaGFzTmV4dCgpOykgewotCQkJCS8vIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlR3JhcGhFZGdlKChHcmFwaEVkZ2UpCi0JCQkJLy8gaXRlci5uZXh0KCkpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0KLQkJCQkvLyByZW1vdmUgb2xkIG5vZGVzCi0JCQkJLy8KLQkJCQlkaWFncmFtLmdldENvbnRhaW5lZCgpLnJlbW92ZUFsbChvbGROb2Rlcyk7Ci0KLQkJCQkvLyByZW1vdmUgdW51c2VkIG9sZCBVSSBub2RlcyAmJiBub2RlcyBvZiBjb250cmlidXRvci9yZXBsYWNlcgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJR3JhcGhOb2RlIG5vZGUgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGlzVUlHcmFwaE5vZGUobm9kZSkKLQkJCQkJCQkmJiBub2RlLmdldEJyaWVmRGVzY3JpcHRpb24oKSAhPSBudWxsCi0JCQkJCQkJJiYgbm9kZS5nZXRCcmllZkRlc2NyaXB0aW9uKCkubGVuZ3RoKCkgPiAwCi0JCQkJCS8vICYmIG5vZGUuZ2V0Q29udGFpbmVkKCkuaXNFbXB0eSgpCi0JCQkJCSkgewotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gbm9kZS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCQlpZiAoYnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgYnJpZGdlKQotCQkJCQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJCQkmJiAoKEFjdGl2aXR5KSBlKQotCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyByZXBsYWNlIGFzc29jaWF0ZWQgYmFzZSBlbGVtZW50IHdpdGggY29udHJpYnV0aW5nL3JlcGxhY2luZwotCQkJCS8vIGVsZW1lbnQKLQkJCQkvLwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlRWxlbWVudCA9ICgoQWN0aXZpdHkpIGVsZW1lbnQpCi0JCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCQlHcmFwaE5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmZpbmRHcmFwaE5vZGUoCi0JCQkJCQkJCWNvcHksIGJhc2VFbGVtZW50KTsKLQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBub2RlCi0JCQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJCWJyaWRnZS5zZXRFbGVtZW50KChNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGFkZCBuZXcgbm9kZXMKLQkJCQkvLwotCQkJCWRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuYWRkQWxsKGNvcHkuZ2V0Q29udGFpbmVkKCkpOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0OiB7Ci0JCQkJRGlhZ3JhbSBiYXNlRGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRVTUFEaWFncmFtKGJhc2UsIGRpYWdyYW1UeXBlLCBmYWxzZSk7Ci0JCQkJaWYgKGJhc2VEaWFncmFtID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlMaXN0IG9sZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCURpYWdyYW0gY29weSA9IGNvcHlEaWFncmFtKGJhc2VEaWFncmFtKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBiYXNlRGlhZ3JhbS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlHcmFwaE5vZGUgYmFzZU5vZGUgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJbW9kZWxCcmlkZ2UgPSBiYXNlTm9kZS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCWlmIChtb2RlbEJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHsKLQkJCQkJCS8vIHRoaXMgaXMgYSBlbGVtZW50J3Mgbm9kZQotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBtb2RlbEJyaWRnZSkKLQkJCQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCQkJCUdyYXBoTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZmluZEdyYXBoTm9kZSgKLQkJCQkJCQkJZGlhZ3JhbSwgZSk7Ci0JCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJb2xkTm9kZXMuYWRkKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gcmVtb3ZlIG9sZCBub2RlcwotCQkJCS8vCi0JCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5yZW1vdmVBbGwob2xkTm9kZXMpOwotCi0JCQkJLy8gYWRkIG5ldyBub2RlcwotCQkJCS8vCi0JCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5hZGRBbGwoY29weS5nZXRDb250YWluZWQoKSk7Ci0KLQkJCQlicmVhazsKLQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gYmFzZUd1aWQKLQkgKiAgICAgICAgICAgIHRoZSBHVUlEIG9mIHRoZSBiYXNlIFVJIEdyYXBoTm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBHcmFwaE5vZGUgZmluZFVJR3JhcGhOb2RlKERpYWdyYW0gZGlhZ3JhbSwgU3RyaW5nIGJhc2VHdWlkKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGlzVUlHcmFwaE5vZGUobm9kZSkKLQkJCQkJJiYgYmFzZUd1aWQuZXF1YWxzKG5vZGUuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKSkgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VJR3JhcGhOb2RlKEdyYXBoTm9kZSBnTm9kZSkgewotCQlTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gZ05vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQlpZiAobW9kZWxCcmlkZ2UgaW5zdGFuY2VvZiBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCkgewotCQkJU3RyaW5nIHR5cGVJbmZvID0gKChTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCkgbW9kZWxCcmlkZ2UpCi0JCQkJCS5nZXRUeXBlSW5mbygpOwotCQkJaWYgKHR5cGVJbmZvLmVxdWFscyhHUkFQSF9OT0RFX0RFQ0lTSU9OKQotCQkJCQl8fCB0eXBlSW5mby5lcXVhbHMoR1JBUEhfTk9ERV9FTkQpCi0JCQkJCXx8IHR5cGVJbmZvLmVxdWFscyhHUkFQSF9OT0RFX1NUQVJUKQotCQkJCQl8fCB0eXBlSW5mby5lcXVhbHMoR1JBUEhfTk9ERV9TWU5DSF9CQVIpCi0JCQkJCXx8IHR5cGVJbmZvLmVxdWFscyhHUkFQSF9OT0RFX0ZSRUVfVEVYVCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEaWFncmFtIGNvcHlEaWFncmFtKERpYWdyYW0gYmFzZURpYWdyYW0pIHsKLQkJRGlhZ3JhbSBjb3B5ID0gKERpYWdyYW0pIFRuZ1V0aWwuY29weShiYXNlRGlhZ3JhbSk7Ci0KLQkJLy8gSEFDSzoKLQkJLy8gZ28gdGhydSB0aGUgbm9kZXMgb2YgdGhlIGRpYWdyYW0gY29weSwgaWYgYW55IG5vZGUgaXMgYSBVSS1vbmx5IG5vZGUKLQkJLy8gKHNlZSBUeXBlZE5vZGUpCi0JCS8vIHNhdmUgdGhlIEdVSUQgb2YgdGhlIG9yaWdpbmFsIG9uZSBpbiBpdHMgYnJpZWZEZXNjcmlwdGlvbiB0byByZW1lbWJlcgotCQkvLyB3aG8gaXMgYmFzZS4KLQkJLy8KLQkJaW50IHNpemUgPSBjb3B5LmdldENvbnRhaW5lZCgpLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUdyYXBoTm9kZSBnTm9kZSA9IChHcmFwaE5vZGUpIGNvcHkuZ2V0Q29udGFpbmVkKCkuZ2V0KGkpOwotCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuaXNVSUdyYXBoTm9kZShnTm9kZSkpIHsKLQkJCQlnTm9kZS5zZXRCcmllZkRlc2NyaXB0aW9uKCgoRGlhZ3JhbUVsZW1lbnQpIGJhc2VEaWFncmFtCi0JCQkJCQkuZ2V0Q29udGFpbmVkKCkuZ2V0KGkpKS5nZXRHdWlkKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgZGlhZ3JhbXMgb2YgdGhpcyBhY3Rpdml0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3RlZEFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXREaWFncmFtcyhBY3Rpdml0eSBhY3QpIHsKLQkJcmV0dXJuIGdldERpYWdyYW1zKGFjdCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXREaWFncmFtcyhBY3Rpdml0eSBhY3QsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCUFycmF5TGlzdCBkaWFncmFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBESUFHUkFNX1RZUEVTLmxlbmd0aDsgaSsrKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0oCi0JCQkJCWFjdCwgRElBR1JBTV9UWVBFU1tpXSwgY3JlYXRlKTsKLQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQlkaWFncmFtcy5hZGQoZGlhZ3JhbSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW1zOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpYWdyYW1UeXBlVGV4dChEaWFncmFtIGRpYWdyYW0pIHsKLQkJaW50IHR5cGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldERpYWdyYW1UeXBlKGRpYWdyYW0pOwotCQlpZiAodHlwZSAhPSAtMSkgewotCQkJcmV0dXJuIERJQUdSQU1fVFlQRV9URVhUU1t0eXBlXTsKLQkJfQotCQlyZXR1cm4gRGlhZ3JhbVJlc291cmNlcy50eXBlX3Vua25vd247IAotCX0KLQotCS8qKgotCSAqIFNldHMgb3IgdW5zZXRzIHN1cHByZXNzZWQgZmxhZyBvZiBhbGwgZGlhZ3JhbXMgaW4gdGhlIGdpdmVuIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gcHJvYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBbGxEaWFncmFtU3VwcHJlc3NlZChQcm9jZXNzIHByb2MsIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHByb2MpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjE4OTQ5MDE0NDc2MzcxMTE0TDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iamVjdDsKLQkJCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlDb2xsZWN0aW9uIGRpYWdyYW1zID0gZ2V0RGlhZ3JhbXMoKEFjdGl2aXR5KSBpdGVyLm5leHQoKSwKLQkJCQkJc3VwcHJlc3NlZCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGlhZ3JhbXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZGlhZ3JhbS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4udmFsdWVPZihzdXBwcmVzc2VkKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlVU1BUG9pbnQoQ29sbGVjdGlvbiB1bWFQb2ludHMsIGludCB4LCBpbnQgeSkKLQkvLyB7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gdW1hUG9pbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgcCA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50KSBpdGVyLm5leHQoKTsKLQkvLyBpZihwLmdldFgoKS5pbnRWYWx1ZSgpID09IHggJiYgcC5nZXRZKCkuaW50VmFsdWUoKSA9PSB5KSB7Ci0JLy8gaXRlci5yZW1vdmUoKTsKLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTGluayhMaW5rIGxpbmspIHsKLQkJTm9kZSBzb3VyY2VOb2RlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJTm9kZSB0YXJnZXROb2RlID0gbGluay5nZXRUYXJnZXQoKTsKLQkJYm9vbGVhbiBzcmNOb3RpZnkgPSBzb3VyY2VOb2RlICE9IG51bGwgPyBzb3VyY2VOb2RlLmVEZWxpdmVyKCkgOiBmYWxzZTsKLQkJYm9vbGVhbiB0YXJnZXROb3RpZnkgPSB0YXJnZXROb2RlICE9IG51bGwgPyB0YXJnZXROb2RlLmVEZWxpdmVyKCkKLQkJCQk6IGZhbHNlOwotCQl0cnkgewotCQkJaWYgKHNvdXJjZU5vZGUgIT0gbnVsbCkgewotCQkJCXNvdXJjZU5vZGUuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJfQotCQkJaWYgKHRhcmdldE5vZGUgIT0gbnVsbCkgewotCQkJCXRhcmdldE5vZGUuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJfQotCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzb3VyY2VOb2RlICE9IG51bGwpIHsKLQkJCQlzb3VyY2VOb2RlLmVTZXREZWxpdmVyKHNyY05vdGlmeSk7Ci0JCQl9Ci0JCQlpZiAodGFyZ2V0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0Tm9kZS5lU2V0RGVsaXZlcih0YXJnZXROb3RpZnkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIG9iamVjdCBvciBpdHMgd3JhcHBlciBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBhbGxFbGVtZW50cwotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGZpbmRFbGVtZW50KENvbGxlY3Rpb24gYWxsRWxlbWVudHMsIE9iamVjdCBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlID09IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCQkvLyBJZiBvYmplY3QgKGUpIGlzIGEgd29ya3Byb2R1Y3QgZGVzY3JpcHRvciggc3ViLWFydGlmYWN0KQotCQkJLy8gcGFzc2VkIGNvbGxlY3Rpb24gZG9ub3QgaGF2ZSB3cmFwcGVyIGZvciBzdWItYXJ0aWZhY3QsIGNoZWNrIHRoZQotCQkJLy8gY29udGFpbmVyIGFydGlmYWN0J3Mgd3JhcHBlci4KLQkJCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTkxNAotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCU9iamVjdCBjaGlsZEVsZW1lbnQgPSBmaW5kRWxlbWVudCgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpZWxlbWVudCkuZ2V0Q2hpbGRyZW4oZWxlbWVudCksIGUpOwotCQkJCWlmKGNoaWxkRWxlbWVudCAhPSBudWxsKXsKLQkJCQkJcmV0dXJuIGNoaWxkRWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBNZXRob2QgdG8gY2hlY2sgaWYgYW55IGR1cGxpY2F0ZSBwcmVkZWNlc3NvciBpbiB0aGUgcHJlZGVjZXNzb3JzIGxpc3Qgb2YKLQkgKiBXb3JrQnJlYWtkb3duRWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYW55RHVwbGljYXRlUHJlZGVjZXNzb3JzKFdvcmtCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHByZWRsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRQcmVkcyhlLCBwcmVkbGlzdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKCFsaXN0LmNvbnRhaW5zKG9iaikpIHsKLQkJCQlsaXN0LmFkZChvYmopOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBnZXQgYWxsIHRoZSBwcmVkZWNlc3NvcnMgYWN0aXZpdGllcyBpbnN0ZWFkIG9mCi0JICogd29ya29yZGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UHJlZHMoV29ya0JyZWFrZG93bkVsZW1lbnQgZSwgTGlzdCBsaXN0KSB7Ci0JCUxpc3QgcHJlZGxpc3QgPSBlLmdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJV29ya09yZGVyIHdvcmtvcmRlciA9IChXb3JrT3JkZXIpIGl0b3IubmV4dCgpOwotCQkJbGlzdC5hZGQod29ya29yZGVyLmdldFByZWQoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIE1ldGhvZCB0byBjaGVjayBiZWZvcmUgZGVsZXRpbmcgYSBsaW5rLiBJZiBkdXBsaWNhdGUgcHJlZGVjZXNzb3IgZXhpc3RzCi0JICogaW4gdGhlIGxlZ2FjeSBkYXRhLCBjaGVjayBpZiBkZWxldGluZyBsaW5rIHNob3VsZCByZW1vdmUgYWxsIHRoZQotCSAqIHByZWRlY2Vzc29ycyBvciBub3QgYnkgdmVyaWZ5aW5nIGlmIHRhcmdldCBvciBpbmRpcmVjdCB0YXJnZXQgaGF2ZSBkaXJlY3QKLQkgKiBvciBpbmRpcmVjdCBsaW5rcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuUmVtb3ZlQWxsUHJlZHMoTGluayBsaW5rLCBOb2RlIG9sZFNvdXJjZSwKLQkJCU5vZGUgb2xkVGFyZ2V0KSB7Ci0KLQkJaWYgKG9sZFRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJTGlzdCBpbmxpc3QgPSBvbGRUYXJnZXQuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaW5saXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgaW5jb21pbmdsaW5rID0gKExpbmspIGl0b3IubmV4dCgpOwotCQkJCS8vIFJBVExDMDAzODQyNDUgOiBQcmVkZWNlc3NvciBjaGFuZ2VzIHNob3VsZCBiZSBkb25lIG9ubHkgaW4KLQkJCQkvLyBjYXNlIG9mIFN5bmNocm9uaXphdGlvbiBCYXIuCi0JCQkJaWYgKGluY29taW5nbGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZQotCQkJCQkJJiYgKChUeXBlZE5vZGUpIGluY29taW5nbGluay5nZXRTb3VyY2UoKSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpIHsKLQkJCQkJQ29sbGVjdGlvbiBjb2wgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFNvdXJjZU5vZGVzKAotCQkJCQkJCShUeXBlZE5vZGUpIGluY29taW5nbGluay5nZXRTb3VyY2UoKSwKLQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJCQlpZiAoY29sLmNvbnRhaW5zKG9sZFNvdXJjZSkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJCWlmIChpbmNvbWluZ2xpbmsuZ2V0U291cmNlKCkuZXF1YWxzKG9sZFNvdXJjZSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogTWV0aG9kIHRvIGdldCB0aGUgc291cmNlcyBvZiBTeW5jQmFyIGluQ29tbWluZyBjb25uZWN0aW9ucwotCSAqIGFuZCBpZiBzeW5jYmFyIGhhdmUgaW5jb21pbmcgY29ubmVjdGlvbiBmcm9tIGRlY2lzaW9uIHBvaW50LCAKLQkgKiBhbmQgZGVjaXNpb24gcG9pbnQgaGF2ZSBpbmNvbW1pbmcgY29ubmVjdGlvbnMgKHdvcmticmVhZGRvd24gZWxlbXRucykKLQkgKiBjb2xsZWN0aW9ucyB3aWxsIGlnbm9yZSBhbGwgdGhlIGluY29taW5nIGNvbm5lY3Rpb24gZnJvbSBkZWNpc2lvbiBwb2ludC4gIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U3luY0JhclNvdXJjZU5vZGVzKFR5cGVkTm9kZSB0eXBlZE5vZGUsIENvbGxlY3Rpb24gYWN0Tm9kZXMpewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQkJaWYoc291cmNlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKXsKLQkJCQkJYWN0Tm9kZXMuYWRkKHNvdXJjZSk7Ci0JCQkJfWVsc2UgaWYoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKXsKLQkJCQkJaWYoKChUeXBlZE5vZGUpc291cmNlKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikKLQkJCQkJCWdldFN5bmNCYXJTb3VyY2VOb2RlcygoVHlwZWROb2RlKXNvdXJjZSxhY3ROb2Rlcyk7Ci0JCQkJfQotCQl9Ci0JfQotCS8qCi0JICogTWV0aG9kIHRvIGNvbGxlY3Qgc3luY2hyb25pemF0aW9uIGJhciBvdXRnb2luZyBjb25uZWN0aW9uCi0JICogZXhjZXB0IGFueSBjb25uZWN0aW9uIGdvaW5nIGZyb20gZGVjaXNpb24gcG9pbnRzLiAgCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFN5bmNCYXJUYXJnZXROb2RlcyhUeXBlZE5vZGUgdHlwZWROb2RlLCBDb2xsZWN0aW9uIGFjdE5vZGVzKXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJTm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWlmKHRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSl7Ci0JCQkJCWFjdE5vZGVzLmFkZCh0YXJnZXQpOwotCQkJCX1lbHNlIGlmKHRhcmdldCBpbnN0YW5jZW9mIFR5cGVkTm9kZSl7Ci0JCQkJCWlmKCgoVHlwZWROb2RlKXRhcmdldCkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpCi0JCQkJCQlnZXRTeW5jQmFyVGFyZ2V0Tm9kZXMoKFR5cGVkTm9kZSl0YXJnZXQsIGFjdE5vZGVzKTsKLQkJCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlKE5vZGVDb250YWluZXIgY29udGFpbmVyLCBPYmplY3Qgb2JqZWN0LCBDbGFzcyBub2RlVHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250YWluZXIuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgPT0gZWxlbWVudC5nZXRPYmplY3QoKSAmJiBub2RlVHlwZS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gYWRkIGEgcHJvcGVydHkgdG8gR3JhcGhOb2RlIHByb3BlcnR5IGxpc3QKLQkgKiAoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSkgVmVyaWZpZXMgcHJvcGVydHkgZXhpc3RzIG9yIG5vdCwgaWYgbm90Ci0JICogY3JlYXRlcyBhIHByb3BlcnR5IHdpdGggZ2l2ZW4ga2V5IGFuZCB2YWx1ZS4gYW5kIHNldCBpbnRvIGdyYXBoIG5vZGUKLQkgKiBwcm9wZXJ0eSBsaXN0LCBpZiBleGlzdHMganVzdCBzZXRzIHZhbHVlIGZvciBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0gZ3JhcGhOb2RlCi0JICogQHBhcmFtIGtleQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gUHJvcGVydHkKLQkgKiBAYXV0aG9yIHNrYW5ub29yCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eSBjcmVhdGVQcm9wZXJ0eShHcmFwaE5vZGUgZ3JhcGhOb2RlLCBTdHJpbmcga2V5LAotCQkJU3RyaW5nIHZhbHVlKSB7Ci0JCVByb3BlcnR5IHByb3BlcnR5ID0gbnVsbDsKLQkJaWYgKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCQlwcm9wZXJ0eSA9IGZpbmRQcm9wZXJ0eShncmFwaE5vZGUsIGtleSk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCXByb3BlcnR5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJCXByb3BlcnR5LnNldEtleShrZXkpOwotCQkJcHJvcGVydHkuc2V0VmFsdWUodmFsdWUpOwotCQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlncmFwaE5vZGUuc2V0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFksIGxpc3QpOwotCQkJfQotCQkJbGlzdC5hZGQocHJvcGVydHkpOwotCQl9IGVsc2UgewotCQkJcHJvcGVydHkuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eTsKLQl9Ci0JCi0JLyoqCi0JICogQWNjZXNpYmxlIG1ldGhvZCBmb3IgQWN0aXZpdHlEZXRhaWxEaWFncmFtLCB0byBnZXQgYSBhdXRvbGF5b3V0IGZsYWcgZnJvbQotCSAqIEdyYXBoaE5vZGUgcHJvcGVydHkgbGlzdC4gcmV0dXJuIHN0cmluZyBjYW4gYmUKLQkgKiBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT0xBWU9VVF9WQUxVRV9UUlVFLAotCSAqIEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPTEFZT1VUX1ZBTFVFX0ZBTFNFLCBvciBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdXRvTGF5b3V0RmxhZyhBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSkgewotCQlTdHJpbmcgZmxhZyA9IG51bGw7Ci0JCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBkaWFncmFtLmdldEdyYXBoTm9kZSgpOwotCQlpZiAoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCUxpc3QgcHJvcExpc3QgPSBncmFwaE5vZGUuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCWlmIChwcm9wTGlzdCAhPSBudWxsICYmIHByb3BMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZFByb3BlcnR5KGdyYXBoTm9kZSwKLQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVCk7Ci0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJZmxhZyA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmbGFnOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdXRvTGF5b3V0KEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtKXsKLQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IGRpYWdyYW0uZ2V0R3JhcGhOb2RlKCk7Ci0JCWlmKGdyYXBoTm9kZSAhPSBudWxsKXsKLQkJCUxpc3QgcHJvcExpc3QgPSBncmFwaE5vZGUuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCWlmKHByb3BMaXN0ICE9IG51bGwgJiYgcHJvcExpc3Quc2l6ZSgpID4gMCl7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRQcm9wZXJ0eSgKLQkJCQkJZ3JhcGhOb2RlLCBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVQpOwotCQkJCWlmKHByb3BlcnR5ICE9IG51bGwpewotCQkJCQlTdHJpbmcgdGVtcCA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCWlmKHRlbXAgIT0gbnVsbCAmJiB0ZW1wICE9ICIiICYmIAotCQkJCQkJCShHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVRfVkFMVUVfVFJVRS5lcXVhbHModGVtcCkKLQkJCQkJCQkJCXx8IEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVF9WQUxVRV9GQUxTRS5lcXVhbHModGVtcCkpKXsKLQkJCQkJCXJldHVybiBuZXcgQm9vbGVhbih0ZW1wKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGdldFRhc2tzUGVyUm93KCl7Ci0JCVN0cmluZyBjb3VudCA9IExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkuZ2V0U3RyaW5nKEdyYXBoaWNhbERhdGFIZWxwZXIuQUREX0RJQUdSQU1fVEFTS1NfUEVSX1JPVyk7Ci0JCWlmKGNvdW50ICE9IG51bGwgfHwgY291bnQgIT0gIiIpewotCQkJaW50IGkgPSBJbnRlZ2VyLnBhcnNlSW50KGNvdW50KTsKLQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiAxMDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdCB0aGUgbGlzdCBvZiB7QGxpbmsgUHJvcGVydHl9IG9iamVjdHMKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHkgZ2V0UHJvcGVydHlCeUtleShMaXN0IGxpc3QsIFN0cmluZyBrZXkpIHsKLQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpcm9yID0gbGlzdC5pdGVyYXRvcigpOyBpcm9yLmhhc05leHQoKTspIHsKLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSkgaXJvci5uZXh0KCk7Ci0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJaWYgKHByb3BlcnR5LmdldEtleSgpLmVxdWFscyhrZXkpKSB7Ci0JCQkJCQlyZXR1cm4gcHJvcGVydHk7Ci0JCQkJCX0KLS8vCQkJCQkJZWxzZSB7Ci0vLwkJCQkJCXJldHVybiBudWxsOwotLy8JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eSBnZXRQcm9wZXJ0eShOb2RlIG5vZGUsIFN0cmluZyBrZXkpIHsKLQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IG5vZGUuZ2V0R3JhcGhOb2RlKCk7Ci0JCWlmIChncmFwaE5vZGUgIT0gbnVsbCkgewotCQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlLmdldFByb3BlcnR5KCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSBsaXN0LnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJCVByb3BlcnR5IHByb3AgPSAoUHJvcGVydHkpIGxpc3QuZ2V0KGkpOwotCQkJCQlpZiAoa2V5LmVxdWFscyhwcm9wLmdldEtleSgpKSkgewotCQkJCQkJcmV0dXJuIHByb3A7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9HcmFwaGljYWxEYXRhTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9HcmFwaGljYWxEYXRhTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNTBiN2IzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvR3JhcGhpY2FsRGF0YU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlZhcnlBY3Rpdml0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogRGlhZ3JhbSBkYXRhIHN0b3JlZCBpbiBVTUE6IFNlbWFudGljTW9kZWxCcmlkZ2UgLlByZXNlbnRhdGlvbiBkaWFncmFtIHR5cGUsCi0gKiBpdHMgdmFsdWUgY2FuIGJlIG9uZSBvZiBmb2xsb3dpbmcgY29uc3RhbnRzIGRlZmluZWQgaW4gR3JhcGhpY2FsRGF0YUhlbHBlcgotICogRElBR1JBTV9XT1JLRkxPVywgRElBR1JBTV9XT1JLX1BST0RVQ1RfREVQRU5ERU5DWSwgRElBR1JBTV9BQ1RJVklUWV9ERVRBSUwKLSAqIAotICogVU1BU2VtYW50aWNNb2RlbEJyaWRnZSAuRWxlbWVudCBCcmVha2Rvd25FbGVtZW50IHRoYXQgdGhlIERpYWdyYW1FbGVtZW50IG9mCi0gKiB0aGlzIFNlbWFudGljTW9kZWxCcmlkZ2UgcmVwcmVzZW50cwotICogCi0gKiBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCAuVHlwZUluZm8gdHlwZSBpbmZvcm1hdGlvbiBmb3IgVHlwZWROb2RlLCBpdHMKLSAqIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkIGluIEdyYXBoaWNhbERhdGFIZWxwZXIKLSAqIHdwQ29tcG9zaXRlVHlwZSBXb3JrUHJvZHVjdENvbXBvc2l0ZSB0eXBlCi0gKiAKLSAqIERpYWdyYW1FbGVtZW50IC5Qcm9wZXJ0eSAobGlzdCBvZiBwcm9wZXJ0aWVzKQotICogCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBHcmFwaGljYWxEYXRhTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGlhZ3JhbVByZXNlbnRhdGlvbnMgPSBuZXcgU3RyaW5nW10gewotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5ESUFHUkFNX1dPUktGTE9XLAotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5ESUFHUkFNX1dPUktfUFJPRFVDVF9ERVBFTkRFTkNZLAotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5ESUFHUkFNX0FDVElWSVRZX0RFVEFJTCB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBjaGlsZFR5cGVzID0gbmV3IENsYXNzW10geyBBY3Rpdml0eS5jbGFzcywKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgRGVzY3JpcHRvci5jbGFzcyB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBkaWFncmFtQ2hhbmdlTGlzdGVuZXJDbGFzc2VzID0gbmV3IENsYXNzW10gewotCQkJSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmNsYXNzLAotCQkJSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzcywKLQkJCUlBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzcyB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgR3JhcGhpY2FsRGF0YU1hbmFnZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLy9wcml2YXRlIE1hcCBncmFwaGljYWxEYXRhTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgTGlzdCBjb21tYW5kTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBHcmFwaGljYWxEYXRhTWFuYWdlcigpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEdyYXBoaWNhbERhdGFNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChHcmFwaGljYWxEYXRhTWFuYWdlci5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IEdyYXBoaWNhbERhdGFNYW5hZ2VyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvLyBwdWJsaWMgR3JhcGhOb2RlIGdldEdyYXBoTm9kZShBY3Rpdml0eSBhY3QsIGludCBkaWFncmFtVHlwZSwgQWN0aXZpdHkKLQkvLyBwYXJlbnQpIHsKLQkvLyAvLyBJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGFjdCwKLQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCS8vIC8vIE9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChhY3QpOwotCS8vIC8vIGlmKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JLy8gaWYocGFyZW50ID09IG51bGwpIHsKLQkvLyAvLyBuZXcgQWN0aXZpdHkKLQkvLyAvLwotCS8vIHJldHVybiBjcmVhdGVHcmFwaE5vZGUoYWN0KTsKLQkvLyB9Ci0JLy8gaWYoIWFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKS5jb250YWlucyhwYXJlbnQpKSB7Ci0JLy8gdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzdXBlciBhY3Rpdml0eSBmb3IgIiArIGFjdCArCi0JLy8gIjogIiArIHBhcmVudCk7Ci0JLy8gfQotCS8vIEFjdGl2aXR5IHBhcmVudEFjdCA9IChBY3Rpdml0eSkgcGFyZW50OwotCS8vIERpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW0ocGFyZW50QWN0LCBkaWFncmFtVHlwZSkuZ2V0VU1BRGlhZ3JhbSgpOwotCS8vIHJldHVybiBnZXRHcmFwaE5vZGUoZGlhZ3JhbSwgYWN0KTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBHcmFwaE5vZGUgb2YgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gZGlhZ3JhbS4KLQkgKiBDcmVhdGUgdGhlIEdyYXBoTm9kZSBpZiBpdCBkb2VzIG5vdCBleGlzdCB5ZXQuCi0JICogCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgR3JhcGhOb2RlIGdldEdyYXBoTm9kZShEaWFncmFtIGRpYWdyYW0sIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgewotCQlpZiAoZGlhZ3JhbSA9PSBudWxsKSB7Ci0JCQkvLyBuZXcgTWV0aG9kRWxlbWVudAotCQkJLy8KLQkJCXJldHVybiBjcmVhdGVHcmFwaE5vZGUobWV0aG9kRWxlbWVudCk7Ci0JCX0KLQkJR3JhcGhOb2RlIG5vZGUgPSBmaW5kR3JhcGhOb2RlKGRpYWdyYW0sIG1ldGhvZEVsZW1lbnQpOwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlub2RlID0gY3JlYXRlR3JhcGhOb2RlKG1ldGhvZEVsZW1lbnQpOwotCQkJY3JlYXRlR3JhcGhDb25uZWN0b3JzKG5vZGUsIGRpYWdyYW0pOwotCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5hZGQobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBHcmFwaE5vZGUgZmluZEdyYXBoTm9kZShEaWFncmFtIGRpYWdyYW0sIE9iamVjdCBtZXRob2RFbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlHcmFwaE5vZGUgZWxlbWVudCA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuZ2V0U2VtYW50aWNNb2RlbCgpIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCQkJCQkmJiBtZXRob2RFbGVtZW50ID09ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZWxlbWVudAotCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHB1YmxpYyBEaWFncmFtRWxlbWVudCBnZXREaWFncmFtRWxlbWVudChPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gaWYob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkvLyByZXR1cm4gZ2V0R3JhcGhOb2RlKChBY3Rpdml0eSkgb2JqZWN0KTsKLQkvLyB9Ci0JLy8gZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkvLyBXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgb2JqZWN0OwotCS8vIEJyZWFrZG93bkVsZW1lbnQgYmUgPSB3b3JrT3JkZXIuZ2V0UHJlZCgpOwotCS8vIGlmKGJlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkvLyBHcmFwaE5vZGUgZ3JhcGhOb2RlID0gZ2V0R3JhcGhOb2RlKChBY3Rpdml0eSkgYmUpOwotCS8vIExpc3QgbGlzdCA9IGdyYXBoTm9kZS5nZXRDb250YWluZWQoKTsKLQkvLyBQb2x5bGluZSBwb2x5bGluZSA9IG51bGw7Ci0JLy8gZm9yKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkvLyBPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JLy8gaWYob2JqIGluc3RhbmNlb2YgUG9seWxpbmUpIHsKLQkvLyBwb2x5bGluZSA9IChQb2x5bGluZSkgb2JqOwotCS8vIGJyZWFrOwotCS8vIH0KLQkvLyB9Ci0JLy8gaWYocG9seWxpbmUgPT0gbnVsbCkgewotCS8vIHBvbHlsaW5lID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9seWxpbmUoKTsKLQkvLyBsaXN0LmFkZCgwLCBwb2x5bGluZSk7Ci0JLy8gfQotCS8vIHJldHVybiBwb2x5bGluZTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBEaWFncmFtIGNyZWF0ZURpYWdyYW0oQWN0aXZpdHkgYWN0LCBpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJLy8gY2hlY2sgaWYgdGhpcyBhY3Rpdml0eSBjb250cmlidXRlcy9leHRlbmRzIG90aGVyIGFjdGl2aXR5IGFuZCB0cnkKLQkJLy8gY29weQotCQkvLyB0aGUgZXhpc3RpbmcgZGlhZ3JhbSBmcm9tIHRoZSBiYXNlCi0JCS8vCi0JCWlmIChQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhhY3QpKSB7Ci0JCQlEaWFncmFtIGJhc2VEaWFncmFtID0gZ2V0VU1BRGlhZ3JhbSgoQWN0aXZpdHkpIGFjdAotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCBkaWFncmFtVHlwZSwgZmFsc2UpOwotCQkJaWYgKGJhc2VEaWFncmFtICE9IG51bGwpIHsKLQkJCQlEaWFncmFtIGNvcHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmNvcHlEaWFncmFtKGJhc2VEaWFncmFtKTsKLQotCQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSAoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgY29weQotCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQltb2RlbEJyaWRnZS5zZXRFbGVtZW50KGFjdCk7Ci0JCQkJcmV0dXJuIGNvcHk7Ci0JCQl9Ci0JCX0KLQotCQlEaWFncmFtIGRpYWdyYW0gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaWFncmFtKCk7Ci0JCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0JCW1vZGVsQnJpZGdlLnNldEVsZW1lbnQoYWN0KTsKLQkJbW9kZWxCcmlkZ2Uuc2V0UHJlc2VudGF0aW9uKGRpYWdyYW1QcmVzZW50YXRpb25zW2RpYWdyYW1UeXBlXSk7Ci0JCWRpYWdyYW0uc2V0U2VtYW50aWNNb2RlbChtb2RlbEJyaWRnZSk7Ci0KLQkJLy8gZ2V0RGlhZ3JhbShhY3QsIGRpYWdyYW1UeXBlKS5zZXRVTUFEaWFncmFtKGRpYWdyYW0pOwotCi0JCXBvcHVsYXRlRGlhZ3JhbShkaWFncmFtLCBhY3QsIGRpYWdyYW1UeXBlKTsKLQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVEaWFncmFtKERpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHkgYWN0LCBpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJLy8gY3JlYXRlIEdyYXBoTm9kZSBmb3IgZWFjaCBCcmVha2Rvd25FbGVtZW50IGFuZCBhZGQgaXQgdG8gdGhlIGRpYWdyYW0KLQkJLy8KLQkJTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkVHlwZXNbZGlhZ3JhbVR5cGVdLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQlHcmFwaE5vZGUgbm9kZSA9IGNyZWF0ZUdyYXBoTm9kZSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5hZGQobm9kZSk7Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIEdyYXBoQ29ubmVjdG9ycyBmb3IgZWFjaCBCcmVha2Rvd25FbGVtZW50Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJR3JhcGhOb2RlIG5vZGUgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhub2RlLCBkaWFncmFtLCBkaWFncmFtVHlwZSk7Ci0JCX0KLQl9Ci0KLS8vCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUFjdGl2aXR5RGlhZ3JhbShEaWFncmFtIGRpYWdyYW0sIEFjdGl2aXR5IGFjdCkgewotLy8JCS8vIGNyZWF0ZSBHcmFwaE5vZGUgZm9yIGVhY2ggY2hpbGQgYWN0aXZpdHkgYW5kIGFkZCBpdCB0byB0aGUgZGlhZ3JhbQotLy8JCS8vIAotLy8JCUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJLmhhc05leHQoKTspIHsKLS8vCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLS8vCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotLy8JCQkJQWN0aXZpdHkgY2hpbGRBY3QgPSAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0vLwkJCQlHcmFwaE5vZGUgbm9kZSA9IGNyZWF0ZUdyYXBoTm9kZShjaGlsZEFjdCk7Ci0vLwkJCQlkaWFncmFtLmdldENvbnRhaW5lZCgpLmFkZChub2RlKTsKLS8vCQkJCW5vZGVzLmFkZChub2RlKTsKLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJLy8gY3JlYXRlIEdyYXBoQ29ubmVjdG9ycyBmb3IgZWFjaCBjaGlsZCBhY3Rpdml0eQotLy8JCS8vCi0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCUdyYXBoTm9kZSBub2RlID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0vLwkJCWNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhub2RlLCBkaWFncmFtKTsKLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lcihBY3Rpdml0eSBhY3QsCi0JCQlpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChkaWFncmFtQ2hhbmdlTGlzdGVuZXJDbGFzc2VzW2RpYWdyYW1UeXBlXS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIChJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyKSBlbGVtZW50OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBjcmVhdGVHcmFwaE5vZGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaE5vZGUoKTsKLQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJbW9kZWxCcmlkZ2Uuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJZ3JhcGhOb2RlLnNldFNlbWFudGljTW9kZWwobW9kZWxCcmlkZ2UpOwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IHBvaW50ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9pbnQoKTsKLQkJcG9pbnQuc2V0WChuZXcgRG91YmxlKC0xKSk7Ci0JCXBvaW50LnNldFkobmV3IERvdWJsZSgtMSkpOwotCQlncmFwaE5vZGUuc2V0UG9zaXRpb24ocG9pbnQpOwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiBkaW0gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaW1lbnNpb24oKTsKLQkJZGltLnNldFdpZHRoKG5ldyBEb3VibGUoLTEpKTsKLQkJZGltLnNldEhlaWdodChuZXcgRG91YmxlKC0xKSk7Ci0JCWdyYXBoTm9kZS5zZXRTaXplKGRpbSk7Ci0KLQkJcmV0dXJuIGdyYXBoTm9kZTsKLQl9Ci0KLQlwdWJsaWMgR3JhcGhFZGdlIGFkZEdyYXBoQ29ubmVjdG9yUGFpcihEaWFncmFtIGRpYWdyYW0sCi0JCQlHcmFwaE5vZGUgZ3JhcGhOb2RlLCBXb3JrT3JkZXIgZWxlbWVudCkgewotCQlHcmFwaENvbm5lY3RvciBzcmNDb25uZWN0b3IgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCQlncmFwaE5vZGUuZ2V0QW5jaG9yYWdlKCkuYWRkKHNyY0Nvbm5lY3Rvcik7Ci0JCUdyYXBoRWRnZSBlZGdlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhFZGdlKCk7Ci0JCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCQlicmlkZ2Uuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJZWRnZS5zZXRTZW1hbnRpY01vZGVsKGJyaWRnZSk7Ci0JCWdyYXBoTm9kZS5nZXRDb250YWluZWQoKS5hZGQoZWRnZSk7Ci0JCWVkZ2UuZ2V0QW5jaG9yKCkuYWRkKHNyY0Nvbm5lY3Rvcik7Ci0KLQkJR3JhcGhOb2RlIHN1Y2NOb2RlID0gZ2V0R3JhcGhOb2RlKGRpYWdyYW0sIFVtYVV0aWwKLQkJCQkuZ2V0T3duaW5nQWN0aXZpdHkoZWxlbWVudCkpOwotCQlHcmFwaENvbm5lY3RvciB0YXJnZXRDb25uZWN0b3IgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCQlzdWNjTm9kZS5nZXRBbmNob3JhZ2UoKS5hZGQodGFyZ2V0Q29ubmVjdG9yKTsKLQkJZWRnZS5nZXRBbmNob3IoKS5hZGQodGFyZ2V0Q29ubmVjdG9yKTsKLQkJcmV0dXJuIGVkZ2U7Ci0JfQotCi0JcHVibGljIEdyYXBoRWRnZSBhZGRHcmFwaENvbm5lY3RvclBhaXIoR3JhcGhOb2RlIHNyY05vZGUsCi0JCQlHcmFwaE5vZGUgdGFyZ2V0Tm9kZSkgewotCQlHcmFwaENvbm5lY3RvciBzcmNDb25uZWN0b3IgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCQlzcmNOb2RlLmdldEFuY2hvcmFnZSgpLmFkZChzcmNDb25uZWN0b3IpOwotCQlHcmFwaEVkZ2UgZWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoRWRnZSgpOwotCQlzcmNOb2RlLmdldENvbnRhaW5lZCgpLmFkZChlZGdlKTsKLQkJZWRnZS5nZXRBbmNob3IoKS5hZGQoc3JjQ29ubmVjdG9yKTsKLQotCQlHcmFwaENvbm5lY3RvciB0YXJnZXRDb25uZWN0b3IgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCQl0YXJnZXROb2RlLmdldEFuY2hvcmFnZSgpLmFkZCh0YXJnZXRDb25uZWN0b3IpOwotCQllZGdlLmdldEFuY2hvcigpLmFkZCh0YXJnZXRDb25uZWN0b3IpOwotCQlyZXR1cm4gZWRnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVHcmFwaEVkZ2UoR3JhcGhFZGdlIGVkZ2UpIHsKLQkJRWNvcmVVdGlsLnJlbW92ZShlZGdlKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWRnZS5nZXRBbmNob3IoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUdyYXBoQ29ubmVjdG9yIGNvbm4gPSAoR3JhcGhDb25uZWN0b3IpIGl0ZXIubmV4dCgpOwotCQkJRWNvcmVVdGlsLnJlbW92ZShjb25uKTsKLQkJfQotCX0KLQotCS8vIHB1YmxpYyB2b2lkIHJlbW92ZUdyYXBoQ29ubmVjdG9yUGFpcihHcmFwaE5vZGUgc3JjTm9kZSwgR3JhcGhOb2RlCi0JLy8gdGFyZ2V0Tm9kZSkgewotCS8vIC8vIGZpbmQgdGhlIHNvdXJjZSBHcmFwaENvbm5lY3RvciBhbmQgcmVtb3ZlIGl0LCBpdHMgR3JhcGhFZGdlLCBhbmQgaXRzCi0JLy8gdGFyZ2V0IEdyYXBoQ29ubmVjdG9yCi0JLy8gLy8KLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzcmNOb2RlLmdldEFuY2hvcmFnZSgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkvLyB7Ci0JLy8gR3JhcGhDb25uZWN0b3IgY29ubmVjdG9yID0gKEdyYXBoQ29ubmVjdG9yKSBpdGVyLm5leHQoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29ubmVjdG9yLmdldEdyYXBoRWRnZSgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JLy8gLmhhc05leHQoKTspIHsKLQkvLyBHcmFwaEVkZ2UgZWRnZSA9IChHcmFwaEVkZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkvLyBPYmplY3QgdGFyZ2V0Q29ubmVjdG9yID0gZWRnZS5nZXRBbmNob3IoKS5nZXQoMSk7Ci0JLy8gaWYodGFyZ2V0Tm9kZS5nZXRBbmNob3JhZ2UoKS5yZW1vdmUodGFyZ2V0Q29ubmVjdG9yKSkgewotCS8vIHNyY05vZGUuZ2V0Q29udGFpbmVkKCkucmVtb3ZlKGVkZ2UpOwotCS8vIC8vIGRvbid0IHJlbW92ZSB0aGUgZWRnZSBmcm9tIGNvbm5lY3RvciB0byBzdXBwb3J0IHVuZG8KLQkvLyAvLwotCS8vIC8vIGl0ZXJhdG9yLnJlbW92ZSgpOwotCS8vIH0KLQkvLyB9Ci0JLy8gaWYoY29ubmVjdG9yLmdldEdyYXBoRWRnZSgpLmlzRW1wdHkoKSkgewotCS8vIGl0ZXIucmVtb3ZlKCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVHcmFwaENvbm5lY3Rpb25QYWlyKEdyYXBoTm9kZSBncmFwaE5vZGUsCi0JCQlXb3JrT3JkZXIgd29ya09yZGVyKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdyYXBoTm9kZS5nZXRBbmNob3JhZ2UoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUdyYXBoQ29ubmVjdG9yIGNvbm4gPSAoR3JhcGhDb25uZWN0b3IpIGl0ZXIubmV4dCgpOwotCQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBjb25uLmdldEdyYXBoRWRnZSgpLmdldCgwKTsKLQkJCWlmIChlZGdlLmVDb250YWluZXIoKSA9PSBncmFwaE5vZGUpIHsKLQkJCQlHcmFwaENvbm5lY3RvciBjb25uMiA9IChHcmFwaENvbm5lY3RvcikgZWRnZS5nZXRBbmNob3IoKS5nZXQoMSk7Ci0JCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSBjb25uMi5nZXRHcmFwaEVsZW1lbnQoKQotCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQlpZiAoYnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCQkJCQkJJiYgKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBicmlkZ2UpLmdldEVsZW1lbnQoKSA9PSBVbWFVdGlsCi0JCQkJCQkJCS5nZXRPd25pbmdBY3Rpdml0eSh3b3JrT3JkZXIpKSB7Ci0JCQkJCWNvbm4yLmdldEdyYXBoRWxlbWVudCgpLmdldEFuY2hvcmFnZSgpLnJlbW92ZShjb25uMik7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCWdyYXBoTm9kZS5nZXRDb250YWluZWQoKS5yZW1vdmUoZWRnZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlR3JhcGhDb25uZWN0b3JzKEdyYXBoTm9kZSBncmFwaE5vZGUsIERpYWdyYW0gZGlhZ3JhbSkgewotCQljcmVhdGVHcmFwaENvbm5lY3RvcnMoZ3JhcGhOb2RlLCBkaWFncmFtLCBnZXREaWFncmFtVHlwZShkaWFncmFtKSk7Ci0JfQotCi0JaW50IGdldERpYWdyYW1UeXBlKERpYWdyYW0gZGlhZ3JhbSkgewotCQlTdHJpbmcgdHlwZVN0ciA9IGRpYWdyYW0uZ2V0U2VtYW50aWNNb2RlbCgpLmdldFByZXNlbnRhdGlvbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRpYWdyYW1QcmVzZW50YXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZGlhZ3JhbVByZXNlbnRhdGlvbnNbaV0uZXF1YWxzKHR5cGVTdHIpKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlR3JhcGhDb25uZWN0b3JzKEdyYXBoTm9kZSBncmFwaE5vZGUsIERpYWdyYW0gZGlhZ3JhbSwKLQkJCWludCBkaWFncmFtVHlwZSkgewotCQlNZXRob2RFbGVtZW50IGUgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGdyYXBoTm9kZQotCQkJCS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJc3dpdGNoIChkaWFncmFtVHlwZSkgewotCQljYXNlIEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGU7Ci0JCQkJLy8gY3JlYXRlIGNvbm5lY3RvcnMKLQkJCQkvLwotCQkJCS8vIExpc3QgbGlzdCA9IGFjdC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCQkJCS8vIGludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCQkJLy8JCQkJCi0JCQkJLy8gQWN0aXZpdHkgcGFyZW50ID0gKEFjdGl2aXR5KQotCQkJCS8vICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSlkaWFncmFtLmdldFNlbWFudGljTW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQkJCS8vIExpc3QgYnJlYWtkb3duRWxlbWVudHMgPSBwYXJlbnQuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQkvLyBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJLy8gV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIGxpc3QuZ2V0KGkpOwotCQkJCS8vIGlmKGJyZWFrZG93bkVsZW1lbnRzLmNvbnRhaW5zKHdvcmtPcmRlci5nZXRQcmVkKCkpKSB7Ci0JCQkJLy8gYWRkR3JhcGhDb25uZWN0b3JQYWlyKGRpYWdyYW0sIGdyYXBoTm9kZSwgd29ya09yZGVyKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlHcmFwaE5vZGUgc3JjTm9kZSA9IGZpbmRHcmFwaE5vZGUoZGlhZ3JhbSwgd29ya09yZGVyCi0JCQkJCQkJLmdldFByZWQoKSk7Ci0JCQkJCWlmIChzcmNOb2RlICE9IG51bGwpIHsKLQkJCQkJCWFkZEdyYXBoQ29ubmVjdG9yUGFpcihzcmNOb2RlLCBncmFwaE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlicmVhazsKLQkJY2FzZSBHcmFwaGljYWxEYXRhSGVscGVyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXNjcmlwdG9yLmdldEltcGFjdHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgaW1wYWN0ZWREZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCUdyYXBoTm9kZSB0YXJnZXROb2RlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZmluZEdyYXBoTm9kZSgKLQkJCQkJCQlkaWFncmFtLCBpbXBhY3RlZERlc2NyaXB0b3IpOwotCQkJCQlpZiAodGFyZ2V0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRHcmFwaENvbm5lY3RvclBhaXIoZ3JhcGhOb2RlLCB0YXJnZXROb2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIFVNQSBkaWFncmFtIGZyb20gdGhlIFVNQSBtb2RlbCBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogICAgICAgICAgICBvbmUgb2YgdGhlIGRpYWdyYW0gdHlwZSBjb25zdGFudHMgZGVmaW5lZCBpbgotCSAqICAgICAgICAgICAge0BsaW5rIEdyYXBoaWNhbERhdGFIZWxwZXIgR3JhcGhpY2FsRGF0YUhlbHBlciB9Ci0JICogQHBhcmFtIGNyZWF0ZQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgbmV3IFVNQSBkaWFncmFtIHdpbGwgYmUgY3JlYXRlZCBpZiB0aGUgYWN0aXZpdHkgZG9lcwotCSAqICAgICAgICAgICAgbm90IGhhdmUgb25lIGFscmVhZHkuCi0JICogQHJldHVybgotCSAqIEBzZWUgR3JhcGhpY2FsRGF0YUhlbHBlciNBQ1RJVklUWV9ESUFHUkFNCi0JICogQHNlZSBHcmFwaGljYWxEYXRhSGVscGVyI0FDVElWSVRZX0RFVEFJTF9ESUFHUkFNCi0JICogQHNlZSBHcmFwaGljYWxEYXRhSGVscGVyI1dPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBnZXRVTUFEaWFncmFtKEFjdGl2aXR5IGUsIGludCBkaWFncmFtVHlwZSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJRGlhZ3JhbSBkaWFncmFtID0gbnVsbDsKLQotCQkvLyAvLyBsb29rIGZvciBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGluIGFjdGl2aXR5J3MgYWRhcHRlciBsaXN0IGZpcnN0Ci0JCS8vIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSURpYWdyYW1DaGFuZ2VMaXN0ZW5lcikKLQkJLy8gVW1hVXRpbC5nZXRBZGFwdGVyKGUsIGRpYWdyYW1MaXN0ZW5lclR5cGUpOwotCQkvLyBpZihsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCS8vIGRpYWdyYW0gPSBsaXN0ZW5lci5nZXREaWFncmFtKCkuZ2V0VU1BRGlhZ3JhbSgpOwotCQkvLyBpZihkaWFncmFtICE9IG51bGwpIHJldHVybiBkaWFncmFtOwotCQkvLyB9Ci0KLQkJT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGtnLmdldERpYWdyYW1zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyLm5leHQoKTsKLQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gZGlhZ3JhbS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJaWYgKG1vZGVsQnJpZGdlICE9IG51bGwKLQkJCQkJCSYmIG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCQkJCQkJJiYgZSA9PSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIG1vZGVsQnJpZGdlKQotCQkJCQkJCQkuZ2V0RWxlbWVudCgpCi0JCQkJCQkmJiBkaWFncmFtUHJlc2VudGF0aW9uc1tkaWFncmFtVHlwZV0KLQkJCQkJCQkJLmVxdWFscygoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIG1vZGVsQnJpZGdlKQotCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkpIHsKLQkJCQkJcmV0dXJuIGRpYWdyYW07Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGNyZWF0ZSkgewotCQkJLy8gY291bGQgbm90IGZpbmQgaXQsIGNyZWF0ZSBuZXcgb25lCi0JCQkvLwotCQkJZGlhZ3JhbSA9IGNyZWF0ZURpYWdyYW0oZSwgZGlhZ3JhbVR5cGUpOwotCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJKChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyKS5nZXREaWFncmFtcygpLmFkZChkaWFncmFtKTsKLQkJCX0KLQkJCXJldHVybiBkaWFncmFtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHB1YmxpYyBEaWFncmFtIGdldFVNQURpYWdyYW0oQWN0aXZpdHkgYWN0LCBpbnQgZGlhZ3JhbVR5cGUpIHsKLQkvLyBEaWFncmFtIGRpYWdyYW0gPSBudWxsOwotCS8vICAgICAgICAKLQkvLyAvLyBsb29rIGZvciBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGluIGFjdGl2aXR5J3MgYWRhcHRlciBsaXN0IGZpcnN0Ci0JLy8gSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lcihhY3QsCi0JLy8gZGlhZ3JhbVR5cGUpOwotCS8vIGlmKGxpc3RlbmVyICE9IG51bGwpIHsKLQkvLyBkaWFncmFtID0gbGlzdGVuZXIuZ2V0RGlhZ3JhbSgpLmdldFVNQURpYWdyYW0oKTsKLQkvLyBpZihkaWFncmFtICE9IG51bGwpIHJldHVybiBkaWFncmFtOwotCS8vIH0KLQkvLyBPYmplY3QgY29udGFpbmVyID0gYWN0LmVDb250YWluZXIoKTsKLQkvLyBpZihjb250YWluZXIgIT0gbnVsbCkgewotCS8vIFByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXREaWFncmFtcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlci5uZXh0KCk7Ci0JLy8gU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IGRpYWdyYW0uZ2V0U2VtYW50aWNNb2RlbCgpOwotCS8vIGlmKG1vZGVsQnJpZGdlICE9IG51bGwgJiYgbW9kZWxCcmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JLy8gJiYgYWN0ID09ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSltb2RlbEJyaWRnZSkuZ2V0RWxlbWVudCgpCi0JLy8gJiYKLQkvLyBkaWFncmFtUHJlc2VudGF0aW9uc1tkaWFncmFtVHlwZV0uZXF1YWxzKCgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSltb2RlbEJyaWRnZSkuZ2V0UHJlc2VudGF0aW9uKCkpKQotCS8vIHsKLQkvLyByZXR1cm4gZGlhZ3JhbTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAgICAgICAgCi0JLy8gLy8gY291bGQgbm90IGZpbmQgaXQsIGNyZWF0ZSBuZXcgb25lCi0JLy8gLy8KLQkvLyByZXR1cm4gY3JlYXRlRGlhZ3JhbShhY3QsIGRpYWdyYW1UeXBlKTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgYWN0LAotCQkJaW50IGRpYWdyYW1UeXBlKSB7Ci0JCUlEaWFncmFtQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXIoYWN0LAotCQkJCWRpYWdyYW1UeXBlKTsKLQkJcmV0dXJuIGxpc3RlbmVyID09IG51bGwgPyBudWxsIDogbGlzdGVuZXIuZ2V0RGlhZ3JhbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgbGlzdCBvZiBjb21tYW5kIGxpc3RlbmVycyB0aGF0IHdpbGwgaGFuZGxlIHRoZSBkaWFncmFtIHJlbGF0ZWQgY2hhbmdlcyBvZiB0aGUgY29tbWFuZHMgb2YgaW50ZXJlc3NlcwotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAc2VlIElDb21tYW5kTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb21tYW5kTGlzdGVuZXJzKCkgewotCQlpZiAoY29tbWFuZExpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQljb21tYW5kTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0KLQkJY29tbWFuZExpc3RlbmVycy5hZGQobmV3IElDb21tYW5kTGlzdGVuZXIoKSB7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUV4ZWN1dGVkKENvbW1hbmQgY29tbWFuZCkgewotCQkJCS8vIGdldCBjb250cmlidXRvci9yZXBsYWNlciBvZiB0aGUgYWN0aXZpdHkKLQkJCQkvLwotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgY29tbWFuZC5nZXRSZXN1bHQoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gYWN0LmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBnZXRVTUFEaWFncmFtKHBhcmVudEFjdCwKLQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU0sIGZhbHNlKTsKLQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciBiYXNlIGFuZCBsaW5rIGl0IHRvIHRoZQotCQkJCQkJLy8gY29udHJpYnV0b3JlL3JlcGxhY2VyIG9mIHRoZSBhY3Rpdml0eQotCQkJCQkJLy8KLQkJCQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBmaW5kR3JhcGhOb2RlKGRpYWdyYW0sIGJhc2UpOwotCQkJCQkJaWYgKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSAoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZ3JhcGhOb2RlCi0JCQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJCWlmIChicmlkZ2UuZ2V0RWxlbWVudCgpICE9IGFjdCkgewotCQkJCQkJCQlicmlkZ2Uuc2V0RWxlbWVudChhY3QpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYoYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCkgewotCQkJCQkJLy8gY29weSBkaWFncmFtcyBhbmQgdGhlaXIgcHVibGlzaGluZyBvcHRpb25zCi0JCQkJCQkvLwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBHcmFwaGljYWxEYXRhSGVscGVyLkRJQUdSQU1fVFlQRVMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlpbnQgZGlhZ3JhbVR5cGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLkRJQUdSQU1fVFlQRVNbaV07Ci0JCQkJCQkJZGlhZ3JhbSA9IGdldFVNQURpYWdyYW0oYmFzZSwgZGlhZ3JhbVR5cGUsIGZhbHNlKTsKLQkJCQkJCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCQkJCURpYWdyYW0gY29weSA9IGdldFVNQURpYWdyYW0oYWN0LCBkaWFncmFtVHlwZSwgdHJ1ZSk7Ci0JCQkJCQkJCWNvcHkuc2V0U3VwcHJlc3NlZChkaWFncmFtLmdldFN1cHByZXNzZWQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgQ2xhc3MgZ2V0Q29tbWFuZFR5cGUoKSB7Ci0JCQkJcmV0dXJuIFZhcnlBY3Rpdml0eUNvbW1hbmQuY2xhc3M7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHByZVVuZG8oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJLy8gZ2V0IG9sZCBjb250cmlidXRvci9yZXBsYWNlciBvZiB0aGUgYWN0aXZpdHkKLQkJCQkvLwotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgY29tbWFuZC5nZXRSZXN1bHQoKS5pdGVyYXRvcigpLm5leHQoKTsKLS8vCQkJCVZhcnlBY3Rpdml0eUNvbW1hbmQgY21kID0gKFZhcnlBY3Rpdml0eUNvbW1hbmQpIGNvbW1hbmQ7Ci0vLwkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBhZGFwdGVyID0gY21kLmdldFdyYXBwZXIoKTsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZUFjdCA9IGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKGJhc2VBY3QgIT0gbnVsbCkgewotCQkJCQlBY3Rpdml0eSBwYXJlbnRBY3QgPSBhY3QuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IGdldFVNQURpYWdyYW0ocGFyZW50QWN0LAotCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfRElBR1JBTSwgZmFsc2UpOwotCQkJCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBmaW5kIGV4aXN0aW5nIG5vZGUgZm9yIHRoZSBvbGQgY29udHJpYnV0b3JlL3JlcGxhY2VyCi0JCQkJCQkvLyBvbGQgYW5kIHJlbGluayBpdCB0byB0aGUgYmFzZSBhY3Rpdml0eQotCQkJCQkJLy8KLQkJCQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBmaW5kR3JhcGhOb2RlKGRpYWdyYW0sIGFjdCk7Ci0JCQkJCQlpZiAoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCQkJCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBncmFwaE5vZGUKLQkJCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCQkJaWYgKGJyaWRnZS5nZXRFbGVtZW50KCkgIT0gYmFzZUFjdCkgewotCQkJCQkJCQlicmlkZ2Uuc2V0RWxlbWVudChiYXNlQWN0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHByZUV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJCi0JCQl9Ci0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbW1hbmRMaXN0ZW5lcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3MGVhNTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLS8qKgotICogRGlhZ3JhbSBjaGFuZ2UgbGlzdGVuZXIgZm9yIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMKLQkJSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTJhZGMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi0vKioKLSAqIERpYWdyYW0gY2hhbmdlIGxpc3RlbmVyIGZvciBhY3Rpdml0eSBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5Tm9kZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eU5vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MWNjZTMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5Tm9kZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi0vKioKLSAqIE5vZGUgY2hhbmdlIGxpc3RlbmVyIGZvciBhY3Rpdml0eSBub2RlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGl2aXR5Tm9kZUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgSU5vZGVDaGFuZ2VMaXN0ZW5lciB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFkYXB0ZXJGYWN0b3J5RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBZGFwdGVyRmFjdG9yeUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNWIwOTRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFkYXB0ZXJGYWN0b3J5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci0KLS8qKgotICogRmlsdGVyIHRoYXQgcHJvdmlkZXMgYWRhcHRlciBmYWN0b3JpZXMgZm9yIGRpZmZlcmVudCB2aWV3cyBvZiBwcm9jZXNzCi0gKiBicmVha2Rvd24gc3RydWN0dXJlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBZGFwdGVyRmFjdG9yeUZpbHRlciBleHRlbmRzIElGaWx0ZXIsIElBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViMTg5YTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotCi0vKioKLSAqIEFkYXB0ZXIgdG8gbGlzdGVuIHRvIGRpYWdyYW0gY2hhbmdlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVyIHsKLQlEaWFncmFtIGdldERpYWdyYW0oKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSU5vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JTm9kZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0ODBkMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JTm9kZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi0vKioKLSAqIEFkYXB0ZXIgdG8gbGlzdGVuIHRvIGNoYW5nZXMgaW4gZGlhZ3JhbSBub2RlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEFkYXB0ZXIgewotCU5vZGUgZ2V0Tm9kZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWM2MDJlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLS8qKgotICogRGlhZ3JhbSBjaGFuZ2UgbGlzdGVuZXIgZm9yIHdvcmsgcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL01vZGVsQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NTZiZGE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE1vZGVsUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE1vZGVsQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBNb2RlbFN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBNb2RlbFN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZURpYWdyYW0oRGlhZ3JhbSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGlhZ3JhbUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUxpbmsoTGluayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTGlua0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUxpbmtlZE9iamVjdChMaW5rZWRPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxpbmtlZE9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU5hbWVkTm9kZShOYW1lZE5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU5hbWVkTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU5vZGUoTm9kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2aXR5RGlhZ3JhbShBY3Rpdml0eURpYWdyYW0gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVR5cGVkTm9kZShUeXBlZE5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVkTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0Tm9kZShXb3JrUHJvZHVjdE5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0Tm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbShBY3Rpdml0eURldGFpbERpYWdyYW0gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU5vZGVDb250YWluZXIoTm9kZUNvbnRhaW5lciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTm9kZUNvbnRhaW5lckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVOb2RlKFJvbGVOb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVUYXNrQ29tcG9zaXRlKFJvbGVUYXNrQ29tcG9zaXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRhc2tOb2RlKFRhc2tOb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYXNrTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZShXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0Q29tcG9zaXRlKFdvcmtQcm9kdWN0Q29tcG9zaXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1vZGVsX0xpbmtlZE9iamVjdChMaW5rZWRPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1vZGVsX0xpbmtlZE9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1vZGVsX05vZGUoTm9kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTW9kZWxfTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1vZGVsX05vZGVDb250YWluZXIoTm9kZUNvbnRhaW5lciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTW9kZWxfTm9kZUNvbnRhaW5lckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1vZGVsX0RpYWdyYW0oRGlhZ3JhbSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTW9kZWxfRGlhZ3JhbUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1vZGVsX05hbWVkTm9kZShOYW1lZE5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1vZGVsX05hbWVkTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayA8ZW0+TGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpbmtBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdCA8ZW0+TGlua2VkIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlTGlua2VkT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGUgPGVtPk5hbWVkIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5hbWVkTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSA8ZW0+Tm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbSA8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlEaWFncmFtQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGUgPGVtPlR5cGVkIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVR5cGVkTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSA8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZSA8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0Tm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtIDxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyIDxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5vZGVDb250YWluZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlIDxlbT5Sb2xlIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZU5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlIDxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZSA8ZW0+VGFzayBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tOb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGUgPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdCA8ZW0+TGlua2VkIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kZWxfTGlua2VkT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIDxlbT5Ob2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kZWxfTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lciA8ZW0+Tm9kZSBDb250YWluZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2RlbF9Ob2RlQ29udGFpbmVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kZWxfRGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlIDxlbT5OYW1lZCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2RlbF9OYW1lZE5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vTW9kZWxBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9Nb2RlbFN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9Nb2RlbFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMjcyZWQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvTW9kZWxTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBNb2RlbFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBNb2RlbFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ESUFHUkFNOiB7Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURpYWdyYW0oZGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZUNvbnRhaW5lcihkaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9Ob2RlKGRpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX0xpbmtlZE9iamVjdChkaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LOiB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxpbmsobGluayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTGlua2VkT2JqZWN0KGxpbmspOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1Q6IHsKLQkJCQlMaW5rZWRPYmplY3QgbGlua2VkT2JqZWN0ID0gKExpbmtlZE9iamVjdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KGxpbmtlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERTogewotCQkJCU5hbWVkTm9kZSBuYW1lZE5vZGUgPSAoTmFtZWROb2RlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VOYW1lZE5vZGUobmFtZWROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9Ob2RlKG5hbWVkTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTGlua2VkT2JqZWN0KG5hbWVkTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERTogewotCQkJCU5vZGUgbm9kZSA9IChOb2RlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VOb2RlKG5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX0xpbmtlZE9iamVjdChub2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ESUFHUkFNOiB7Ci0JCQkJQWN0aXZpdHlEaWFncmFtIGFjdGl2aXR5RGlhZ3JhbSA9IChBY3Rpdml0eURpYWdyYW0pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGlhZ3JhbShhY3Rpdml0eURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX0RpYWdyYW0oYWN0aXZpdHlEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9Ob2RlQ29udGFpbmVyKGFjdGl2aXR5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZShhY3Rpdml0eURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX0xpbmtlZE9iamVjdChhY3Rpdml0eURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREU6IHsKLQkJCQlUeXBlZE5vZGUgdHlwZWROb2RlID0gKFR5cGVkTm9kZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVHlwZWROb2RlKHR5cGVkTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZSh0eXBlZE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX0xpbmtlZE9iamVjdCh0eXBlZE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06IHsKLQkJCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gPSAoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSh3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9EaWFncmFtKHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05vZGVDb250YWluZXIod29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZSh3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9MaW5rZWRPYmplY3Qod29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX05PREU6IHsKLQkJCQlXb3JrUHJvZHVjdE5vZGUgd29ya1Byb2R1Y3ROb2RlID0gKFdvcmtQcm9kdWN0Tm9kZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3ROb2RlKHdvcmtQcm9kdWN0Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTmFtZWROb2RlKHdvcmtQcm9kdWN0Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZSh3b3JrUHJvZHVjdE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX0xpbmtlZE9iamVjdCh3b3JrUHJvZHVjdE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOiB7Ci0JCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW0pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbShhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX0RpYWdyYW0oYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9Ob2RlQ29udGFpbmVyKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZShhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX0xpbmtlZE9iamVjdChhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSOiB7Ci0JCQkJTm9kZUNvbnRhaW5lciBub2RlQ29udGFpbmVyID0gKE5vZGVDb250YWluZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU5vZGVDb250YWluZXIobm9kZUNvbnRhaW5lcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZShub2RlQ29udGFpbmVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9MaW5rZWRPYmplY3Qobm9kZUNvbnRhaW5lcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9OT0RFOiB7Ci0JCQkJUm9sZU5vZGUgcm9sZU5vZGUgPSAoUm9sZU5vZGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJvbGVOb2RlKHJvbGVOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9OYW1lZE5vZGUocm9sZU5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05vZGUocm9sZU5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX0xpbmtlZE9iamVjdChyb2xlTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURTogewotCQkJCVJvbGVUYXNrQ29tcG9zaXRlIHJvbGVUYXNrQ29tcG9zaXRlID0gKFJvbGVUYXNrQ29tcG9zaXRlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSb2xlVGFza0NvbXBvc2l0ZShyb2xlVGFza0NvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZUNvbnRhaW5lcihyb2xlVGFza0NvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZShyb2xlVGFza0NvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTGlua2VkT2JqZWN0KHJvbGVUYXNrQ29tcG9zaXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UQVNLX05PREU6IHsKLQkJCQlUYXNrTm9kZSB0YXNrTm9kZSA9IChUYXNrTm9kZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGFza05vZGUodGFza05vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05hbWVkTm9kZSh0YXNrTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZSh0YXNrTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTGlua2VkT2JqZWN0KHRhc2tOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFOiB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSB3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUod29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTmFtZWROb2RlKHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05vZGUod29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTGlua2VkT2JqZWN0KHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERTogewotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSB3b3JrQnJlYWtkb3duRWxlbWVudE5vZGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUod29ya0JyZWFrZG93bkVsZW1lbnROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9OYW1lZE5vZGUod29ya0JyZWFrZG93bkVsZW1lbnROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9Ob2RlKHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTGlua2VkT2JqZWN0KHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0NPTVBPU0lURTogewotCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdvcmtQcm9kdWN0Q29tcG9zaXRlID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdENvbXBvc2l0ZSh3b3JrUHJvZHVjdENvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZUNvbnRhaW5lcih3b3JrUHJvZHVjdENvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZSh3b3JrUHJvZHVjdENvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTGlua2VkT2JqZWN0KHdvcmtQcm9kdWN0Q29tcG9zaXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VEaWFncmFtKERpYWdyYW0gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpbms8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgY2FzZUxpbmsoTGluayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpbmtlZCBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGlua2VkIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBjYXNlTGlua2VkT2JqZWN0KExpbmtlZE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZWQgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBjYXNlTmFtZWROb2RlKE5hbWVkTm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBjYXNlTm9kZShOb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eSBEaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VBY3Rpdml0eURpYWdyYW0oQWN0aXZpdHlEaWFncmFtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHlwZWQgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UeXBlZCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VUeXBlZE5vZGUoVHlwZWROb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV29ya1Byb2R1Y3ROb2RlKFdvcmtQcm9kdWN0Tm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBY3Rpdml0eURldGFpbERpYWdyYW0oQWN0aXZpdHlEZXRhaWxEaWFncmFtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZSBDb250YWluZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZSBDb250YWluZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU5vZGVDb250YWluZXIoTm9kZUNvbnRhaW5lciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIE5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVOb2RlKFJvbGVOb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlVGFza0NvbXBvc2l0ZShSb2xlVGFza0NvbXBvc2l0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIE5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRhc2tOb2RlKFRhc2tOb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdENvbXBvc2l0ZShXb3JrUHJvZHVjdENvbXBvc2l0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpbmtlZCBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGlua2VkIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTW9kZWxfTGlua2VkT2JqZWN0KExpbmtlZE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTW9kZWxfTm9kZShOb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZSBDb250YWluZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZSBDb250YWluZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1vZGVsX05vZGVDb250YWluZXIoTm9kZUNvbnRhaW5lciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTW9kZWxfRGlhZ3JhbShEaWFncmFtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZWQgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lZCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNb2RlbF9OYW1lZE5vZGUoTmFtZWROb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Nb2RlbFN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTE3YzhhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgYWN0aXZpdHkgZGlhZ3JhbSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTQ5YzQwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyByZXNvdXJjZSBidW5kbGUgc3VwcG9ydCBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW0gbW9kZWxzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyNzRlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBSaWNoIFRleHQgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0MDMxYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTMzZmIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AuRXhwb3J0TVNQUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUNsYXNzUGF0aDogZXhwb3J0bXNwLmphcgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkMmU0NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuZXhwb3J0bXNwLmphciA9IHNyYy8KLW91dHB1dC5leHBvcnRtc3AuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gZXhwb3J0bXNwLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRlbXBsYXRlLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1ZmUwZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyBXaXphcmRzCi1leHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmROYW1lPU1pY3Jvc29mdCBQcm9qZWN0Ci1leHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbj1FeHBvcnQgYSBwcm9jZXNzIHRvIGEgTWljcm9zb2Z0IFByb2plY3QuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2N2UyZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLTwhLS0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzLkV4cG9ydE1TUFdpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTVNQcm9qZWN0LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC53aXphcmRzLkV4cG9ydFRvTVNQcm9qZWN0V2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9ImV4cG9ydE1TUFdpemFyZCIKLSAgICAgICAgIG5hbWU9IkV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQgRXh0ZW5zaW9uIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvRXhwb3J0TVNQV2l6YXJkLmV4c2QiIC8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC53aXphcmRzLkV4cG9ydFRvTVNQcm9qZWN0V2l6YXJkIi8+Ci0gICA8L2V4dGVuc2lvbj4KLS0tPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0YmM3MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYW4gRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUEV4Y2VwdGlvbiBleHRlbmRzIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTkyMzE4OTcwMDU2MTgwNjI2Mkw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIocm9vdENhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihlcnJvck1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uIGFuZCB0aGUKLQkgKiBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIEV4cG9ydE1TUEV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlLCBTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIocm9vdENhdXNlLCBlcnJvck1zZyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQT3B0aW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOWM3MjU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQcm9jZXNzT3B0aW9uczsKLQotLyoqCi0gKiBUaGUgZXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IG9wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDcuMgotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0TVNQT3B0aW9ucyBleHRlbmRzIEV4cG9ydFByb2Nlc3NPcHRpb25zIHsKLQotCXByaXZhdGUgU3RyaW5nIG1zcHJvamVjdE5hbWU7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGV4cG9ydGVkIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1TUHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBtc3Byb2plY3ROYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWUuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlTmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGV4cG9ydGVkIE1pY3Jvc29mdCBQcm9qZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TVNQcm9qZWN0TmFtZShTdHJpbmcgbXNwcm9qZWN0TmFtZSkgewotCQl0aGlzLm1zcHJvamVjdE5hbWUgPSBtc3Byb2plY3ROYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjhkNmIyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0TVNQUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFeHBvcnRNU1BQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwb3J0TVNQUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMTM4Yzk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgbWVzc2FnZSByZXNvdXJjZSBidW5kbGUgYWNjZXNzb3IgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRXhwb3J0TVNQUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IEV4cG9ydE1TUFJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEV4cG9ydE1TUFJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0TVNQV2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0TVNQVGFza19uYW1lOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRXhwb3J0TVNQUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjYyNzBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBTZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUFNlcnZpY2UgaW1wbGVtZW50cyBJRXhwb3J0TVNQU2VydmljZSB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEV4cG9ydE1TUFNlcnZpY2UgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwb3J0TVNQU2VydmljZSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoRXhwb3J0TVNQU2VydmljZS5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IEV4cG9ydE1TUFNlcnZpY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AuSUV4cG9ydE1TUFNlcnZpY2UjZXhwb3J0TVNQcm9qZWN0KFByb2Nlc3MsCi0JICogICAgICBFeHBvcnRNU1BPcHRpb25zKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cG9ydE1TUHJvamVjdChQcm9jZXNzIHByb2Nlc3MsCi0JCQlFeHBvcnRNU1BPcHRpb25zIGV4cG9ydE9wdGlvbnMpIHRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBFeHBvcnRNU1BYTUxTZXJ2aWNlKCkuZXhwb3J0KHByb2Nlc3MsIGV4cG9ydE9wdGlvbnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZmZhMTFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIEV4cG9ydCBQcm9qZWN0IFBsYW4gU2VydmljZSBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MTAzNjg5ODY4NTcyNDgwMzU5TDsKLQotCS8qKgotCSAqIFRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIFRocm93YWJsZSByb290Q2F1c2U7Ci0KLQkvKioKLQkgKiBUaGUgZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTXNnOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJdGhpcyhyb290Q2F1c2UsIHJvb3RDYXVzZS5nZXRNZXNzYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQl0aGlzKG51bGwsIGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24gYW5kIHRoZQotCSAqIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlLCBTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yb290Q2F1c2UgPSByb290Q2F1c2U7Ci0JCXRoaXMuZXJyb3JNc2cgPSBlcnJvck1zZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIFRocm93YWJsZSBnZXRSb290Q2F1c2UoKSB7Ci0JCXJldHVybiByb290Q2F1c2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQWE1MT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BYTUxPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTZlYzNlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BYTUxPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBmaWxlIG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BYTUxPcGVyYXRpb24gaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCi0JcHJpdmF0ZSBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hNZ3I7Ci0KLQlwcml2YXRlIFN0cmluZyBwdWJsaXNoZWRfdXJsOwotCi0JcHJpdmF0ZSBFeGNlcHRpb24gZXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQWE1MT3BlcmF0aW9uKEFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1ncikgewotCQlzdXBlcigpOwotCQl0aGlzLnB1Ymxpc2hNZ3IgPSBwdWJsaXNoTWdyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHB1Ymxpc2hlZCBVUkwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoZWRVcmwoKSB7Ci0JCXJldHVybiBwdWJsaXNoZWRfdXJsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4Y2VwdGlvbiwgaWYgYW55LCB0aGF0IG9jY3VycmVkIHdoaWxlIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIGV4Y2VwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWV4Y2VwdGlvbiA9IG51bGw7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0TVNQUmVzb3VyY2VzLmV4cG9ydE1TUFRhc2tfbmFtZSk7Ci0JCXRyeSB7Ci0JCQlwdWJsaXNoTWdyLnB1Ymxpc2gobW9uaXRvcik7Ci0JCQlwdWJsaXNoZWRfdXJsID0gcHVibGlzaE1nci5nZXRQdWJsaXNoZWRVcmwoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFhNTFNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFhNTFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGQ0MDBjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BYTUxTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsLk1zcHJvamVjdFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy53aXphcmRzLlB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgUGxhbiBTZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogCi0gKiBCdWdzIGZpeGVkOiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MDg5Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MDg2Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MDk1Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3MjY1Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MTU1Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2OTU5Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3MzIxCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5MjMwCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyMzM2Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4ODAxCi0gKiBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzY5NTEKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUFhNTFNlcnZpY2UgewotCi0JLy8gSWYgdHJ1ZSwgZ2VuZXJhdGUgZGVidWcgdHJhY2VzLgotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBFeHBvcnRNU1BQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBBbGwgVGFza3MgcmVmZXJlbmNlZCBieSB0aGUgZXhwb3J0ZWQgUHJvamVjdCBUZW1wbGF0ZS4KLQlwcml2YXRlIExpc3QgcmVmZXJlbmNlZFRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHJvbGVzVG9VaWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHRhc2tVaWRUb1dic1dhcHBlclBhdGhNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdic1dhcHBlclBhdGhUb0xvY2FsUHJlZExpc3RNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdic0d1aWRUb1Rhc2tVaWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdic1dyYXBwZXJQYXRoVG9QcmVkTGlzdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBUaGUgbmFtZSBvZiB0aGUgY29udGVudCBmb2xkZXIuIFRoaXMgd2lsbCBiZSBuYW1lZCBhZnRlciB0aGUgY29udGV4dC4KLQlwcml2YXRlIFN0cmluZyBjb250ZW50Rm9sZGVyTmFtZTsKLQotCXByaXZhdGUgU3RyaW5nIGFiVGFyZ2V0RGlyOwotCi0JLy8gSWYgdHJ1ZSwgb25seSBleHBvcnQgYnJlYWtkb3duIGVsZW1lbnRzIHdpdGggJ2lzUGxhbm5lZCcgYXR0cmlidXRlcyBzZXQKLQkvLyB0byB0cnVlLgotCXByaXZhdGUgYm9vbGVhbiBleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hDb250ZW50U2l0ZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBpbnQgdGFza191aWQgPSAxOwotCi0JcHJpdmF0ZSBpbnQgcmVzX3VpZCA9IDE7Ci0KLQlwcml2YXRlIGludCBhc3NpZ25fdWlkID0gMTsKLQotCXByaXZhdGUgTXNwcm9qZWN0RmFjdG9yeSBwcm9qZWN0RmFjdG9yeSA9IE1zcHJvamVjdEZhY3RvcnkuZUlOU1RBTkNFOwotCi0JLy8gVGhlIHByb2Nlc3MgdG8gYmUgZXhwb3J0ZWQuCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnkgd2JzQWRhcHRlckZhY3Rvcnk7Ci0KLQkvLyBUaGUgcHJvY2VzcyBjb25maWd1cmF0b3IgZm9yIGZpbHRlcmluZyBicmVha2Rvd24gZWxlbWVudHMgaW4gYQotCS8vIGNvbmZpZ3VyYXRpb24uCi0JcHJpdmF0ZSBQcm9jZXNzQ29uZmlndXJhdG9yIGJyZWFrZG93bkVsZW1lbnRGaWx0ZXI7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHdic0NvbnRlbnRQcm92aWRlcjsKLQotCS8vIE1hcCBwcm9jZXNzZXMgdG8gc3VwcHJlc3Npb24gb2JqZWN0cy4KLQlwcml2YXRlIE1hcCBzdXBwcmVzc2lvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBUaGUgc3VwcHJlc3Npb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgcHJvY2VzcyB0byBiZQotCS8vIGV4cG9ydGVkLgotCXByaXZhdGUgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0KLQkvLyBUaGUgV0JTIGVsZW1lbnQgcGF0aHMuCi0JcHJpdmF0ZSBTdGFjayBlbGVtZW50UGF0aHMgPSBuZXcgU3RhY2soKTsKLQotCXByaXZhdGUgT2JqZWN0IGN1cnJlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudEVsZW1lbnRQYXRoOwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvckxpc3QgY3VycmVudFByZWRMaXN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQWE1MU2VydmljZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHBvcnQgYSBwcm9jZXNzIHRvIGEgTWljcm9zb2Z0IFByb2plY3QgWE1MIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAgICAgICAgICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MKLQkgKiBAcGFyYW0gZXhwb3J0T3B0aW9ucwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIG9mIHVzZXIgc3BlY2lmaWVkIGV4cG9ydCBvcHRpb25zCi0JICogQHRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwb3J0KFByb2Nlc3MgcHJvY2VzcywgRXhwb3J0TVNQT3B0aW9ucyBleHBvcnRPcHRpb25zKQotCQkJdGhyb3dzIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24gewotCQlTdHJpbmcgbXNwcm9qZWN0TmFtZSA9IGV4cG9ydE9wdGlvbnMuZ2V0TVNQcm9qZWN0TmFtZSgpOwotCQlGaWxlIGV4cG9ydERpciA9IGV4cG9ydE9wdGlvbnMuZ2V0RXhwb3J0RGlyKCk7Ci0JCXB1Ymxpc2hDb250ZW50U2l0ZSA9IGV4cG9ydE9wdGlvbnMuZ2V0UHVibGlzaFdlYlNpdGUoKTsKLQkJUHVibGlzaE9wdGlvbnMgcHVibGlzaGluZ09wdGlvbnMgPSBleHBvcnRPcHRpb25zLmdldFB1Ymxpc2hpbmdPcHRpb25zKCk7Ci0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBleHBvcnRpbmcgdG8gTWljcm9zb2Z0IFByb2plY3QhIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHByb2Nlc3MgICAgICAgICAgICAgICAgICAgPSAiICsgcHJvY2Vzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIG1zcHJvamVjdE5hbWUgICAgICAgICAgICAgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBtc3Byb2plY3ROYW1lKTsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIiQkJCB0YXJnZXREaXIgICAgICAgICAgICAgICAgID0gIiArIGV4cG9ydERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHB1Ymxpc2hDb25maWdPcHRpb25zICAgICAgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBwdWJsaXNoaW5nT3B0aW9ucyk7Ci0JCX0KLQotCQkvLyBjb25zdHJ1Y3QgdGhlIGV4cG9ydCB0YXJnZXQgeG1sIGZpbGUgcGF0aAotCQlpZiAoIWV4cG9ydERpci5leGlzdHMoKSkgewotCQkJZXhwb3J0RGlyLm1rZGlycygpOwotCQl9Ci0JCWFiVGFyZ2V0RGlyID0gZXhwb3J0RGlyLmdldEFic29sdXRlUGF0aCgpOwotCQlQYXRoIGV4cG9ydFBhdGggPSBuZXcgUGF0aChhYlRhcmdldERpcik7Ci0JCWJvb2xlYW4gZW5kV2l0aFhtbEV4dCA9IG1zcHJvamVjdE5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBleHBvcnRQYXRoU3RyID0gKGV4cG9ydFBhdGguYXBwZW5kKGVuZFdpdGhYbWxFeHQgPyBtc3Byb2plY3ROYW1lCi0JCQkJOiAobXNwcm9qZWN0TmFtZSArICIueG1sIikpKS50b09TU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgZXhwb3J0UGF0aFN0ciAgICAgICAgICAgICAgICAgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBleHBvcnRQYXRoU3RyKTsKLQotCQkvLyBjb25zdHJ1Y3QgdGhlIGVtcHR5IE1TIHByb2plY3QgeG1sIHRlbXBsYXRlIGZpbGUgcGF0aAotCQlTdHJpbmcgZW1wdHlUZW1wbGF0ZUZpbGUgPSBFeHBvcnRNU1BQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldEluc3RhbGxQYXRoKCkKLQkJCQkrICJ0ZW1wbGF0ZSIgLy8kTk9OLU5MUy0xJAotCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyAibXNwcm9qZWN0XzIwMDNfdGVtcGxhdGUueG1sIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZGVidWcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBlbXB0eVRlbXBsYXRlRmlsZSAgICAgICAgICAgICA9ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGVtcHR5VGVtcGxhdGVGaWxlKTsKLQotCQkvLyBjb3B5IHRoZSBlbXB0eSB0ZW1wbGF0ZSBNUyBwcm9qZWN0IHhtbCBmaWxlIHRvIHRoZSBleHBvcnQgdGFyZ2V0Ci0JCXRyeSB7Ci0JCQlGaWxlIHNyYyA9IG5ldyBGaWxlKGVtcHR5VGVtcGxhdGVGaWxlKTsKLQkJCUZpbGUgZHN0ID0gbmV3IEZpbGUoZXhwb3J0UGF0aFN0cik7Ci0JCQljb3B5KHNyYywgZHN0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKGV4cG9ydFBhdGhTdHIpOwotCi0JCXRyeSB7Ci0KLQkJCVhNTFJlc291cmNlIHJlcyA9IG5ldyBNc3Byb2plY3RSZXNvdXJjZUltcGwoZmlsZVVSSSk7Ci0JCQlyZXMuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCQkJcmVzLmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dCgKLQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQkJCXJlcy5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1NDSEVNQV9MT0NBVElPTiwKLQkJCQkJQm9vbGVhbi5UUlVFKTsKLQkJCXJlcy5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoCi0JCQkJCVhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsCi0JCQkJCUJvb2xlYW4uVFJVRSk7Ci0JCQlyZXMuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0xFWElDQUxfSEFORExFUiwgQm9vbGVhbi5UUlVFKTsKLQkJCXJlcy5sb2FkKG51bGwpOwotCi0JCQlEb2N1bWVudFJvb3QgZG9jUm9vdCA9IChEb2N1bWVudFJvb3QpIHJlcy5nZXRFT2JqZWN0KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2plY3QgPSAoUHJvamVjdCkgZG9jUm9vdC5nZXRQcm9qZWN0KCk7Ci0KLQkJCWdlbmVyYXRlTVNQcm9qZWN0KHByb2Nlc3MsIHByb2plY3QsIGV4cG9ydE9wdGlvbnMpOwotCi0JCQlyZXMuc2F2ZShudWxsKTsKLQotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnRNU1Byb2plY3QocHJvamVjdCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBuZXcgRXhwb3J0TVNQRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRXhwb3J0cyBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzIHRvIGEgTWljcm9zb2Z0IFByb2plY3QKLQkgKiBYTUwgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqICAgICAgICAgICAgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcwotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBhIE1pY3Jvc29mdCBQcm9qZWN0IG9iamVjdAotCSAqIEBwYXJhbSBleHBvcnRPcHRpb25zCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgdXNlciBzcGVjaWZpZWQgZXhwb3J0IG9wdGlvbnMKLQkgKiBAdGhyb3dzIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZW5lcmF0ZU1TUHJvamVjdChQcm9jZXNzIHByb2Nlc3MsIFByb2plY3QgcHJvamVjdCwKLQkJCUV4cG9ydE1TUE9wdGlvbnMgZXhwb3J0T3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9jZXNzID09IG51bGwgfHwgcHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBleHBvcnRPcHRpb25zLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCS8vIEdldCB0aGUgZGVmYXVsdCBtZXRob2QgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlCi0JCQkJLy8gcHJvY2Vzcy4KLQkJCQlpZiAocHJvY2VzcyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQljb25maWcgPSAoKERlbGl2ZXJ5UHJvY2VzcykgcHJvY2VzcykuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQl9IGVsc2UgaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQljb25maWcgPSAoKENhcGFiaWxpdHlQYXR0ZXJuKSBwcm9jZXNzKS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIENyZWF0ZSB0aGUgc3ViIGZvbGRlciB0byBzdG9yZSB0aGUgcHVibGlzaGVkIEhUTUwgY29udGVudCBmaWxlcy4KLQkJCWNvbnRlbnRGb2xkZXJOYW1lID0gY29uZmlnLmdldE5hbWUoKTsKLQotCQkJUHVibGlzaE9wdGlvbnMgcHVibGlzaGluZ09wdGlvbnMgPSBleHBvcnRPcHRpb25zCi0JCQkJCS5nZXRQdWJsaXNoaW5nT3B0aW9ucygpOwotCQkJaWYgKHB1Ymxpc2hDb250ZW50U2l0ZSAmJiBwdWJsaXNoaW5nT3B0aW9ucyAhPSBudWxsKSB7Ci0JCQkJRmlsZSBjb250ZW50RGlyID0gbmV3IEZpbGUoZXhwb3J0T3B0aW9ucy5nZXRFeHBvcnREaXIoKSwKLQkJCQkJCWNvbnRlbnRGb2xkZXJOYW1lKTsKLQkJCQlpZiAoIWNvbnRlbnREaXIuZXhpc3RzKCkpIHsKLQkJCQkJY29udGVudERpci5ta2RpcnMoKTsKLQkJCQl9Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHZpZUJ1aWxkZXIgbWV0aG9kQ29uZmlnID0gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBjb25maWcpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCB2aWVCdWlsZGVyIHB1Ymxpc2hDb25maWdPcHRpb25zID0gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBwdWJsaXNoaW5nT3B0aW9ucyk7Ci0JCQkJfQotCi0JCQkJLy8gUHVibGlzaCB0aGUgYXNzb2NpYXRlZCBjb25maWd1cmF0aW9uLgotCQkJCWlmICghcHVibGlzaENvbmZpZ3VyYXRpb24oY29udGVudERpci5nZXRBYnNvbHV0ZVBhdGgoKSwgY29uZmlnLAotCQkJCQkJcHVibGlzaGluZ09wdGlvbnMpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgPSBleHBvcnRPcHRpb25zCi0JCQkJCS5nZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzKCk7Ci0KLQkJCS8vIEdlbmVyYXRlIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgZmlsZS4KLQkJCS8vIHBvcHVsYXRlIHRoZSBwcm9qZWN0J3MgYXR0cmlidXRlcwotCQkJcHJvamVjdC5zZXROYW1lKHByb2Nlc3MuZ2V0TmFtZSgpKTsKLQkJCXByb2plY3Quc2V0U3RhcnREYXRlKG5ldyBEYXRlKCkpOwotCQkJcHJvamVjdC5zZXRDcmVhdGlvbkRhdGUobmV3IERhdGUoKSk7Ci0JCQlwcm9qZWN0LnNldExhc3RTYXZlZChuZXcgRGF0ZSgpKTsKLQkJCXByb2plY3Quc2V0RmluaXNoRGF0ZShuZXcgRGF0ZSgpKTsKLQotCQkJZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2VzKHByb2Nlc3MsIGNvbmZpZywgcHJvamVjdCk7Ci0JCQlnZW5lcmF0ZVByb2plY3RUYXNrcyhwcm9jZXNzLCBjb25maWcsIHByb2plY3QpOwotCQkJZ2VuZXJhdGVMaW5rcyhwcm9jZXNzLCBwcm9qZWN0KTsKLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXhwb3J0IG9wdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGV4cG9ydE9wdGlvbnMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiBvZiB1c2VyIHNwZWNpZmllZCBleHBvcnQgb3B0aW9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEV4cG9ydE9wdGlvbnMoRXhwb3J0T3B0aW9ucyBleHBvcnRPcHRpb25zKSB7Ci0JCUJvb2xlYW4gZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cyA9IChCb29sZWFuKSBleHBvcnRPcHRpb25zCi0JCQkJLmdldChFeHBvcnRPcHRpb25zLkVYUE9SVF9PTkxZX1BMQU5ORURfRUxFTUVOVFMpOwotCQl0aGlzLmV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgPSBleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgcHJvamVjdCByZXNvdXJjZXMgZm9yIGFsbCB0aGUgdGFzayBkZXNjcmlwdG9ycyBpbiB0aGUKLQkgKiBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogICAgICAgICAgICBhIHByb2Nlc3MKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHVzZWQgdG8gZmlsdGVyIHRoZSB3b3JrIGJyZWFrZG93bgotCSAqICAgICAgICAgICAgZWxlbWVudHMgaW4gdGhlIHByb2Nlc3MKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgYW4gb2JqZWN0IHRvIHN0b3JlIHRoZSBnZW5lcmF0ZWQgTWljcm9zb2Z0IFByb2plY3QgV0JTCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZ2VuZXJhdGluZyB0aGUgTWljcm9zb2Z0IFByb2plY3QgV0JTCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2VzKFByb2Nlc3MgcHJvY2VzcywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9qZWN0IHByb2plY3QpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVRCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJLnNldEZpbHRlcihuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihjb25maWcsIG51bGwpKTsKLQkJCX0KLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCi0JCQlMaXN0IGVsZW1lbnRzID0gcHJvY2Vzcy5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA+IDApIHsKLQkJCQlnZW5lcmF0ZVByb2plY3RSZXNvdXJjZShjb250ZW50UHJvdmlkZXIsCi0JCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgcHJvY2VzcywgcHJvamVjdCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBwcm9qZWN0IHJlc291cmNlcyBmb3IgYWxsIHRoZSByb2xlIGRlc2NyaXB0b3JzIGluIHRoZQotCSAqIHByb2Nlc3MuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2UoCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlCcmVha2Rvd25FbGVtZW50IGJyZWFrZG93bkVsZW1lbnQsIFByb2plY3QgcHJvamVjdCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlpZiAoYnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkJCXx8IGJyZWFrZG93bkVsZW1lbnQuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpCi0JCQkJfHwgKGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgJiYgIWJyZWFrZG93bkVsZW1lbnQKLQkJCQkJCS5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChicmVha2Rvd25FbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWFkZFJlc291cmNlKGJyZWFrZG93bkVsZW1lbnQsIHByb2plY3QpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhicmVha2Rvd25FbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBwcm92aWRlciA9IChSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JCQkJCU9iamVjdCB2YWx1ZSA9IHByb3ZpZGVyLmdldFZhbHVlKCk7Ci0JCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCQlhZGRSZXNvdXJjZSgoQnJlYWtkb3duRWxlbWVudCkgdmFsdWUsIHByb2plY3QpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJYWRkUmVzb3VyY2UoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQsIHByb2plY3QpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJCQlPYmplY3QgdmFsdWUgPSBwcm92aWRlci5nZXRWYWx1ZSgpOwotCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2UoY29udGVudFByb3ZpZGVyLAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHZhbHVlLCBwcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWdlbmVyYXRlUHJvamVjdFJlc291cmNlKGNvbnRlbnRQcm92aWRlciwKLQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQsIHByb2plY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLy8gZm9yIGVhY2ggUm9sZURlc2NyaXB0b3IsIGNyZWF0ZSBhIE1TIFByb2plY3QgcmVzb3VyY2UKLQkvLyBmb3IgdGhlIFJvbGVEZXNjcmlwdG9yIGFuZCBpdHMgdW5kZXJseWluZyByb2xlLCByZW1lbWJlciB0aGUgYXNzaWduZWQKLQkvLyByZXNfdWlkCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2UoQnJlYWtkb3duRWxlbWVudCBicmVha2Rvd25FbGVtZW50LCBQcm9qZWN0IHByb2opCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCEoYnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gY2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgdW5kZXJseWluZyByb2xlIG9mIHRoaXMgcm9sZURlc2NyaXB0b3IKLQkJLy8gYW5kIHNraXAgdGhlIGNyZWF0aW9uIGlmIGEgcmVzb3VyY2UgZm9yIHRoZSByb2xlIGFscmVhZHkgZXhpc3RzCi0JCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKSBicmVha2Rvd25FbGVtZW50OwotCQlpZiAoZGVidWcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBoYW5kbGUgUm9sZURlc2NyaXB0b3IgPSAiICsgcm9sZURlc2NyaXB0b3IpOyAvLyROT04tTkxTLTEkCi0JCVJvbGUgcmVmX2VkUm9sZSA9IHJvbGVEZXNjcmlwdG9yLmdldFJvbGUoKTsKLQkJaWYgKGRlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgaGFuZGxlIFJlZi1lZCBSb2xlID0gIiArIHJlZl9lZFJvbGUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gY2hlY2sgdGhlIG5lZWQgdG8gYWRkIGEgbmV3IHJlc291cmNlIGJhc2VkIG9uIFJvbGVEZXNjcmlwdG9yJ3MgZGlzcGx5Ci0JCS8vIG5hbWUKLQkJYm9vbGVhbiBuZXdSRFJlc291cmNlID0gdHJ1ZTsKLQkJU3RyaW5nIHJkUmVzb3VyY2VOYW1lID0gZ2V0RGlzcGxheU5hbWUocm9sZURlc2NyaXB0b3IpOwotCQlpZiAocm9sZXNUb1VpZE1hcC5nZXQocmRSZXNvdXJjZU5hbWUpICE9IG51bGwpIHsKLQkJCW5ld1JEUmVzb3VyY2UgPSBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIHRoZSBuZWVkIHRvIGFkZCBhIG5ldyByZXNvdXJjZSBiYXNlZCBvbiBhc3NvY2lhdGVkIHJvbGUncwotCQkvLyBkaXNwbHkgbmFtZQotCQlib29sZWFuIG5ld1JvbGVSZW91cmNlID0gZmFsc2U7Ci0JCVN0cmluZyByb2xlUmVzb3VyY2VOYW1lID0gbnVsbDsKLQkJaWYgKHJlZl9lZFJvbGUgIT0gbnVsbAotCQkJCSYmIHJvbGVzVG9VaWRNYXAKLQkJCQkJCS5nZXQoKHJvbGVSZXNvdXJjZU5hbWUgPSBnZXREaXNwbGF5TmFtZShyZWZfZWRSb2xlKSkpID09IG51bGwKLQkJCQkmJiAhcm9sZVJlc291cmNlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHJkUmVzb3VyY2VOYW1lKSkgewotCQkJbmV3Um9sZVJlb3VyY2UgPSB0cnVlOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoZSBSb2xlRGVzY3JpcHRvcgotCQlpZiAobmV3UkRSZXNvdXJjZSkgewotCQkJUmVzb3VyY2UgYVJlcyA9IHByb2plY3RGYWN0b3J5LmNyZWF0ZVJlc291cmNlKCk7Ci0KLQkJCWFSZXMuc2V0VUlEKEJpZ0ludGVnZXIudmFsdWVPZihyZXNfdWlkKSk7Ci0JCQlhUmVzLnNldElEKEJpZ0ludGVnZXIudmFsdWVPZihyZXNfdWlkKSk7Ci0JCQlhUmVzLnNldE5hbWUocmRSZXNvdXJjZU5hbWUpOwotCQkJcHJvai5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZSgpLmFkZChhUmVzKTsKLQotCQkJcm9sZXNUb1VpZE1hcC5wdXQocmRSZXNvdXJjZU5hbWUsIEJpZ0ludGVnZXIudmFsdWVPZihyZXNfdWlkKSk7Ci0JCQlyZXNfdWlkKys7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSByZXNvdXJjZSBmb3IgdGhlIHVuZGVybHlpbmcgYXNzb2NpYXRlZCByb2xlIHRvbwotCQlpZiAobmV3Um9sZVJlb3VyY2UpIHsKLQkJCVJlc291cmNlIGFSZXMgPSBwcm9qZWN0RmFjdG9yeS5jcmVhdGVSZXNvdXJjZSgpOwotCi0JCQlhUmVzLnNldFVJRChCaWdJbnRlZ2VyLnZhbHVlT2YocmVzX3VpZCkpOwotCQkJYVJlcy5zZXRJRChCaWdJbnRlZ2VyLnZhbHVlT2YocmVzX3VpZCkpOwotCQkJYVJlcy5zZXROYW1lKHJvbGVSZXNvdXJjZU5hbWUpOwotCQkJcHJvai5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZSgpLmFkZChhUmVzKTsKLQotCQkJcm9sZXNUb1VpZE1hcC5wdXQocm9sZVJlc291cmNlTmFtZSwgQmlnSW50ZWdlci52YWx1ZU9mKHJlc191aWQpKTsKLQkJCXJlc191aWQrKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgTVMgUHJvamVjdCBXQlMgZm9yIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5Ci0JICogcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqICAgICAgICAgICAgYSBwcm9jZXNzCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiB1c2VkIHRvIGZpbHRlciB0aGUgd29yayBicmVha2Rvd24KLQkgKiAgICAgICAgICAgIGVsZW1lbnRzIGluIHRoZSBwcm9jZXNzCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIGFuIG9iamVjdCB0byBzdG9yZSB0aGUgZ2VuZXJhdGVkIE1pY3Jvc29mdCBQcm9qZWN0IFdCUwotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGdlbmVyYXRpbmcgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFdCUwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlUHJvamVjdFRhc2tzKFByb2Nlc3MgcHJvY2VzcywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9qZWN0IHByb2plY3QpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBTYXZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGV4cG9ydGVkIHByb2Nlc3MuCi0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0KLQkJd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl0cnkgewotCQkJLy8gQWRkIHRoZSBzdXBwcmVzc2lvbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzIHRvIGJlCi0JCQkvLyBleHBvcnRlZAotCQkJLy8gdG8gdGhlIHN1cHByZXNzaW9uIG1hcC4KLQkJCXN1cHByZXNzaW9uID0gbmV3IFN1cHByZXNzaW9uKHByb2Nlc3MpOwotCQkJc3VwcHJlc3Npb25NYXAucHV0KHByb2Nlc3MsIHN1cHByZXNzaW9uKTsKLQotCQkJd2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVdCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWJyZWFrZG93bkVsZW1lbnRGaWx0ZXIgPSBuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihjb25maWcsIG51bGwpOwotCQkJd2JzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGJyZWFrZG93bkVsZW1lbnRGaWx0ZXIpOwotCi0JCQl3YnNDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCXdic0FkYXB0ZXJGYWN0b3J5KTsKLQotCQkJLy8gdGVzdAotCQkJLy8gZW51bWVyYXRlUHJvY2Vzc1ByZWRlY2Vzc29yTGlzdHMoKTsKLQotCQkJY3VycmVudEVsZW1lbnQgPSBwcm9jZXNzOwotCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCWdlbmVyYXRlUHJvamVjdFRhc2sod2JzQ29udGVudFByb3ZpZGVyLAotCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIHByb2Nlc3MsIDEsIHByb2plY3QpOwotCQkJfSBlbHNlIHsKLQkJCQlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gcHJvY2Vzcy5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJCWlmIChicmVha2Rvd25FbGVtZW50cy5zaXplKCkgPiAwKSB7Ci0JCQkJCWdlbmVyYXRlUHJvamVjdFRhc2sod2JzQ29udGVudFByb3ZpZGVyLAotCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBwcm9jZXNzLCAxLCBwcm9qZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3YnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJd2JzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJfQotCQkJaWYgKHN1cHByZXNzaW9uTWFwICE9IG51bGwpIHsKLQkJCQlzdXBwcmVzc2lvbk1hcC5jbGVhcigpOwotCQkJCXN1cHByZXNzaW9uTWFwID0gbnVsbDsKLQkJCX0KLQkJCWlmICh3YnNDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCXdic0NvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW51bWVyYXRlUHJvY2Vzc1ByZWRlY2Vzc29yTGlzdHMoKSB7Ci0JCS8vIFdCUyB0cmVlCi0JCUl0ZXJhdG9yIHdic1RyZWVJdGVyYXRvciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcigKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeSwgcHJvY2Vzcyk7Ci0JCU9iamVjdCBvYmo7Ci0JCXdoaWxlICh3YnNUcmVlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlvYmogPSB3YnNUcmVlSXRlcmF0b3IubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0cmVlSXRlcmF0b3I6ICIgKyBvYmopOwotCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSB3YnNBZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJUHJlZGVjZXNzb3JMaXN0IHByZWRMaXN0ID0gYWRhcHRlci5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHByZWRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlCU0l0ZW1Qcm92aWRlciBlID0gKElCU0l0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgcHJlZExpc3Q6ICIgKyBlKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgdW53cmFwcGVkUHJlZExpc3Q6ICIKLQkJCQkJCQkrICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgTWljcm9zZnQgUHJvamVjdCB0YXNrIGZvciBhIGJyZWFrZG93biBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50UHJvdmlkZXIKLQkgKiAgICAgICAgICAgIGEgY29udGVudCBwcm92aWRlcgotCSAqIEBwYXJhbSBicmVha2Rvd25FbGVtZW50Ci0JICogICAgICAgICAgICBhIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHBhcmFtIHN0ckJ1ZgotCSAqICAgICAgICAgICAgYSA8Y29kZT5TdHJpbmdCdWZmZXI8L2NvZGU+IHRvIHN0b3JlIHRoZSBnZW5lcmF0ZWQgWE1MCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVQcm9qZWN0VGFzaygKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciwKLQkJCU9iamVjdCBlbGVtZW50T3JXcmFwcGVyLCBpbnQgdGFza09MZXZlbCwgUHJvamVjdCBwcm9qKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJV29ya0JyZWFrZG93bkVsZW1lbnQgYnJlYWtkb3duRWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbAotCQkJCS51bndyYXAoZWxlbWVudE9yV3JhcHBlcik7Ci0KLQkJLy8gbm90IHJlYWxseSBuZWNjZXNzYXJ5IGhlcmUKLQkJaWYgKGJyZWFrZG93bkVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkJCQl8fCBicmVha2Rvd25FbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IKLQkJCQl8fCBicmVha2Rvd25FbGVtZW50LmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKQotCQkJCXx8IChleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzICYmICFicmVha2Rvd25FbGVtZW50Ci0JCQkJCQkuZ2V0SXNQbGFubmVkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlib29sZWFuIGlzU3ViVGFza3NQbGFubmVkID0gZmFsc2U7Ci0JCWlmIChleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzICYmIGJyZWFrZG93bkVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCSYmIGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhlbGVtZW50T3JXcmFwcGVyKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJfHwgKChBY3Rpdml0eSkgZWxlbWVudCkuZ2V0SXNQbGFubmVkKCkKLQkJCQkJCQkJCS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJaXNTdWJUYXNrc1BsYW5uZWQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IHdyYXBwZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJCWlmICh3cmFwcGVkRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlpZiAoIWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMKLQkJCQkJCQkJfHwgKChBY3Rpdml0eSkgd3JhcHBlZEVsZW1lbnQpLmdldElzUGxhbm5lZCgpCi0JCQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJaXNTdWJUYXNrc1BsYW5uZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJfHwgZGVzY3JpcHRvci5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJaXNTdWJUYXNrc1BsYW5uZWQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IHdyYXBwZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJCWlmICh3cmFwcGVkRWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSB3cmFwcGVkRWxlbWVudDsKLQkJCQkJCWlmICghZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCQkJCQl8fCBkZXNjcmlwdG9yLmdldElzUGxhbm5lZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJaXNTdWJUYXNrc1BsYW5uZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgdGFzayBmb3IgdGhlIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCS8vIGRlY2lkZWQganVzdCB0byBjaGVjayB0aGUgaXNQbGFubmVkIGZsYWcgb24gdGhlIFdCUwotCQlib29sZWFuIGlzUGxhbm5lZFRhc2sgPSBicmVha2Rvd25FbGVtZW50LmdldElzUGxhbm5lZCgpLmJvb2xlYW5WYWx1ZSgpOwotCQlUYXNrIG5ld1Rhc2sgPSBudWxsOwotCQlpZiAoIWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgfHwgZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCSYmIGlzUGxhbm5lZFRhc2spIHsKLQkJCWJvb2xlYW4gc3VwcHJlc3NlZCA9IGlzU3VwcHJlc3NlZChicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmICghc3VwcHJlc3NlZCkgewotCQkJCW5ld1Rhc2sgPSBhZGRUYXNrKGVsZW1lbnRPcldyYXBwZXIsIHRhc2tPTGV2ZWwsIHByb2opOwotCQkJfQotCQl9Ci0KLQkJLy8gaWYgZXhwb3J0IHBsYW5uZWQgb25seSB3YnMsIHRoZW4gd2UgbmVlZCB0byBkbyB0aGUgcm9sZSByb2xsdXAKLQkJLy8gY2FsY3VsYXRpb24KLQkJaWYgKGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgJiYgbmV3VGFzayAhPSBudWxsCi0JCQkJJiYgYnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJJiYgY29udGVudFByb3ZpZGVyICE9IG51bGwgJiYgIWlzU3ViVGFza3NQbGFubmVkKSB7Ci0JCQlBcnJheUxpc3Qgcm9sbHVwUm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlib29sZWFuIHJiID0gY2FsY3VsYXRlUm9sbHVwUm9sZXMoY29udGVudFByb3ZpZGVyLAotCQkJCQlicmVha2Rvd25FbGVtZW50LCByb2xsdXBSb2xlcyk7Ci0JCQkvLyBpZiB0aGUgd2hvbGUgc3VidHJlZSBvZiB0aGUgYnJlYWtkb3duRWxlbW50IGlzIG5vdCBwbGFubmVkCi0JCQkvLyB0aGVuIHJvbGwgdXAgYWxsIHRoZSByb2xlcwotCQkJaWYgKCFyYikgewotCQkJCUhhc2hTZXQgcm9sZXNTZXQgPSBuZXcgSGFzaFNldChyb2xsdXBSb2xlcyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sZXNTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyByb2xlTmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQlhZGRBc3NpZ25tZW50KHJvbGVOYW1lLCBuZXdUYXNrLmdldFVJRCgpLmludFZhbHVlKCksIHByb2opOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGV4cG9ydCB0aGUgbmV4dCBsZXZlbCB3YnMKLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHN1cHByZXNzZWQgPSBpc1N1cHByZXNzZWQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAoIXN1cHByZXNzZWQpIHsKLQkJCQllbGVtZW50UGF0aHMucHVzaChicmVha2Rvd25FbGVtZW50LmdldEd1aWQoKSk7Ci0JCQkJT2JqZWN0W10gZWxlbWVudHMgPSBjb250ZW50UHJvdmlkZXIKLQkJCQkJCS5nZXRFbGVtZW50cyhlbGVtZW50T3JXcmFwcGVyKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0KLQkJCQkJLy8gZ2V0IHRoZSBjdXJyZW50IGVsZW1lbnRPcldyYXBwZXIgYW5kIHRoZSBoaWVyYXJjYWwgZ3VpZAotCQkJCQkvLyBwYXRoIHRvIGl0Ci0JCQkJCWN1cnJlbnRFbGVtZW50ID0gZWxlbWVudDsKLQkJCQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW2VsZW1lbnRQYXRocy5zaXplKCldOwotCQkJCQllbGVtZW50UGF0aHMudG9BcnJheShwYXRocyk7Ci0JCQkJCVN0cmluZ0J1ZmZlciBwYXRoU3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHBhdGhzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlwYXRoU3RyLmFwcGVuZChwYXRoc1tqXSArICIuIik7Ci0JCQkJCX0KLQkJCQkJaWYgKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCU9iamVjdCB3cmFwcGVkID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJCQlwYXRoU3RyLmFwcGVuZCgoKEJyZWFrZG93bkVsZW1lbnQpIHdyYXBwZWQpLmdldEd1aWQoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwYXRoU3RyLmFwcGVuZCgoKEJyZWFrZG93bkVsZW1lbnQpIGN1cnJlbnRFbGVtZW50KQotCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJfQotCQkJCQljdXJyZW50RWxlbWVudFBhdGggPSBwYXRoU3RyLnRvU3RyaW5nKCk7Ci0JCQkJCS8vIGlmIChkZWJ1ZykgU3lzdGVtLm91dC5wcmludGxuKCIgcGF0aDogIiArCi0JCQkJCS8vIGN1cnJlbnRFbGVtZW50UGF0aCk7Ci0KLQkJCQkJZ2VuZXJhdGVQcm9qZWN0VGFzayhjb250ZW50UHJvdmlkZXIsIGVsZW1lbnQsCi0JCQkJCQkJdGFza09MZXZlbCArIDEsIHByb2opOwotCQkJCX0KLQkJCQlnZW5lcmF0ZUxpbmtzKHByb2Nlc3MsIHByb2opOwotCQkJCWVsZW1lbnRQYXRocy5wb3AoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIHN1cHByZXNzZWQgd29yayBicmVha2Rvd24gZWxlbWVudCBpbgotCSAqIGl0cyBvd25pbmcgcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBhbiBvYmplY3QKLQkgKiBAcmV0dXJuIDxvY2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgYSBzdXBwcmVzc2VkIHdvcmsgYnJlYWtkb3duCi0JICogICAgICAgICBlbGVtZW50IGluIGl0cyBvd25pbmcgcHJvY2Vzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cHByZXNzZWQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGRlYnVnKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlc2NyaXB0b3IgPSAiCi0JCQkJCQkJKyAoKERlc2NyaXB0b3IpIG9iamVjdCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCVByb2Nlc3Mgb3duaW5nUHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhvYmplY3QpOwotCQkJU3VwcHJlc3Npb24gb3duaW5nUHJvY2Vzc1N1cHByZXNzaW9uID0gKFN1cHByZXNzaW9uKSBzdXBwcmVzc2lvbk1hcAotCQkJCQkuZ2V0KG93bmluZ1Byb2Nlc3MpOwotCQkJaWYgKG93bmluZ1Byb2Nlc3NTdXBwcmVzc2lvbiA9PSBudWxsKSB7Ci0JCQkJb3duaW5nUHJvY2Vzc1N1cHByZXNzaW9uID0gbmV3IFN1cHByZXNzaW9uKG93bmluZ1Byb2Nlc3MpOwotCQkJCXN1cHByZXNzaW9uTWFwLnB1dChvd25pbmdQcm9jZXNzLCBvd25pbmdQcm9jZXNzU3VwcHJlc3Npb24pOwotCQkJfQotCQkJaWYgKG93bmluZ1Byb2Nlc3NTdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQob2JqZWN0KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG93bmluZ1Byb2Nlc3MgIT0gcHJvY2VzcwotCQkJCQkmJiBvYmplY3QgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCWVsZW1lbnRQYXRocy5wdXNoKCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIG9iamVjdCkuZ2V0R3VpZCgpKTsKLQkJCQlTdHJpbmdbXSBwYXRocyA9IG5ldyBTdHJpbmdbZWxlbWVudFBhdGhzLnNpemUoKV07Ci0JCQkJZWxlbWVudFBhdGhzLnRvQXJyYXkocGF0aHMpOwotCQkJCU9iamVjdCB3cmFwcGVyID0gc3VwcHJlc3Npb24uZ2V0T2JqZWN0QnlQYXRoKHBhdGhzLAotCQkJCQkJd2JzQWRhcHRlckZhY3RvcnkpOwotCQkJCWVsZW1lbnRQYXRocy5wb3AoKTsKLQkJCQlyZXR1cm4gc3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKHdyYXBwZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgdGFzayB0byBhIE1pY3Jvc29mdCBQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcGFyYW0gdGFza09MZXZlbAotCSAqICAgICAgICAgICAgdGhlIG91dGxpbmUgbGV2ZWwKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgYSBNaWNyb3NvZnQgUHJvamVjdCBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSBuZXdseSBhZGRlZCB0YXNrCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBUYXNrIGFkZFRhc2soT2JqZWN0IGVsZW1lbnRPcldyYXBwZXIsIGludCB0YXNrT0xldmVsLAotCQkJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlpZiAoZWxlbWVudE9yV3JhcHBlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVdvcmtCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwKLQkJCQkudW53cmFwKGVsZW1lbnRPcldyYXBwZXIpOwotCi0JCVRhc2sgdGFzayA9IHByb2plY3RGYWN0b3J5LmNyZWF0ZVRhc2soKTsKLQkJdGFzay5zZXROYW1lKGdldERpc3BsYXlOYW1lKGVsZW1lbnQpKTsKLQkJdGFzay5zZXRPdXRsaW5lTGV2ZWwoQmlnSW50ZWdlci52YWx1ZU9mKHRhc2tPTGV2ZWwpKTsKLQkJdGFzay5zZXRVSUQoQmlnSW50ZWdlci52YWx1ZU9mKHRhc2tfdWlkKSk7Ci0JCXRhc2suc2V0SUQoQmlnSW50ZWdlci52YWx1ZU9mKHRhc2tfdWlkKSk7Ci0JCXRhc2suc2V0VHlwZShCaWdJbnRlZ2VyLnZhbHVlT2YoMCkpOwotCi0JCUdyZWdvcmlhbkNhbGVuZGFyIGdjRGF0ZSA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotCQkvLyBnY0RhdGUuYWRkKEdyZWdvcmlhbkNhbGVuZGFyLkRBVEUsIDgwKTsKLQkJRGF0ZSBzdGFydERhdGUgPSBnY0RhdGUuZ2V0VGltZSgpOwotCQl0YXNrLnNldFN0YXJ0KHN0YXJ0RGF0ZSk7Ci0KLQkJLy8gdGFzay5zZXREdXJhdGlvbigiUFQyMEgwTTBTIik7Ci0KLQkJU3RyaW5nIG5vdGVzID0gZ2V0QnJpZWZEZXNjcmlwdGlvbihlbGVtZW50KTsKLQkJaWYgKG5vdGVzICE9IG51bGwgfHwgbm90ZXMudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJdGFzay5zZXROb3Rlcyhub3Rlcyk7Ci0JCX0KLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJdGFzay5zZXRNaWxlc3RvbmUodHJ1ZSk7Ci0JCQl0YXNrLnNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIudmFsdWVPZig3KSk7Ci0JCX0KLQotCQkvLyBBc3NpZ24gdGhlIHRhc2sgdG8gYWxsIHRoZSBhc3NvY2lhdGVkIHJvbGVzLgotCQlMaXN0IHJvbGVzTGlzdCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJvbGVzTGlzdCA9IGdldFJvbGVzRm9yVGFza0QoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrKSB7Ci0JCQlyb2xlc0xpc3QgPSBnZXRSb2xlc0ZvclRhc2soKG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzaykgZWxlbWVudCk7Ci0JCX0KLQkJaWYgKHJvbGVzTGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHJvbGVOYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJYWRkQXNzaWdubWVudChyb2xlTmFtZSwgdGFza191aWQsIHByb2plY3QpOwotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIHRoZSBnZW5lcmF0ZWQgVVJMIGxpbmsgdG8gdGhlIHRhc2suCi0JCWlmIChwdWJsaXNoQ29udGVudFNpdGUpIHsKLQkJCVN0cmluZyBsaW5rVVJMID0gZ2V0RWxlbWVudFVSTChlbGVtZW50KTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sgcmVmX2VkVGFzayA9IHRhc2tEZXNjcmlwdG9yLmdldFRhc2soKTsKLQkJCQlyZWZlcmVuY2VkVGFza3MuYWRkKHJlZl9lZFRhc2spOwotCQkJfQotCQkJdGFzay5zZXRIeXBlcmxpbmtBZGRyZXNzKGxpbmtVUkwpOwotCQl9Ci0KLQkJLy8gYVRhc2suc2V0VHlwZShuZXcgQmlnSW50ZWdlcigiMSIpKTsKLQkJLy8gYVRhc2suc2V0U3RhcnQobmV3IERhdGUoKSk7Ci0JCS8vIGFUYXNrLnNldFN1bW1hcnkoZmFsc2UpOwotCQkvLyBhVGFzay5zZXRDb25zdHJhaW50VHlwZShuZXcgQmlnSW50ZWdlcigiMiIpKTsKLQotCQkvLyBBZGQgdGhlIHRhc2sgdG8gdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG9iamVjdC4KLQkJcHJvamVjdC5nZXRUYXNrcygpLmdldFRhc2soKS5hZGQodGFzayk7Ci0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCB0aGVDdXJyZW50IGVsZW1lbnQ6IHRhc2tVaWQ9IiArIHRhc2tfdWlkCi0JCQkJCSsgIiwgIiArIGN1cnJlbnRFbGVtZW50KTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICAgICAgICAgICAgcGF0aDogIiArIGN1cnJlbnRFbGVtZW50UGF0aCk7Ci0JCX0KLQotCQkvLyBTdG9yZSB0aGUgdGFzaydzIGxvY2FsIHByZWRlY2Vzc29ycy4KLQkJc3RvcmVUYXNrUHJlZGVjZXNzb3JzKGVsZW1lbnQpOwotCi0JCXRhc2tVaWRUb1dic1dhcHBlclBhdGhNYXAucHV0KEJpZ0ludGVnZXIudmFsdWVPZih0YXNrX3VpZCksCi0JCQkJY3VycmVudEVsZW1lbnRQYXRoKTsKLQkJd2JzR3VpZFRvVGFza1VpZE1hcAotCQkJCS5wdXQoZWxlbWVudC5nZXRHdWlkKCksIEJpZ0ludGVnZXIudmFsdWVPZih0YXNrX3VpZCkpOwotCi0JCS8vIGdldCBwcmVkZWNlc3NvcnMgb2YgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgd2JzQWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudE9yV3JhcHBlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJUHJlZGVjZXNzb3JMaXN0IGN1cnJlbnRQcmVkTGlzdCA9IGFkYXB0ZXIuZ2V0UHJlZGVjZXNzb3JzKCk7Ci0JCUxpc3QgZ3VpZFByZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjdXJyZW50UHJlZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGRlYnVnKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIHdyYXBwZXJQcmVkTGlzdE1lbWJlcjogIiArIGUpOwotCQkJT2JqZWN0IHVud3JhcHBlZEUgPSBUbmdVdGlsLnVud3JhcChlKTsKLQkJCWlmICh1bndyYXBwZWRFIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlndWlkUHJlZExpc3QuYWRkKCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIHVud3JhcHBlZEUpLmdldEd1aWQoKSk7Ci0JCQkJaWYgKGRlYnVnKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICB1bndyYXBwZWRQcmVkTGlzdE1lbWJlcjogIgotCQkJCQkJCSsgdW53cmFwcGVkRSk7Ci0JCQl9Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQl1bndyYXBwZWRFID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBlKS5nZXRUYXJnZXQoKTsKLQkJCQlndWlkUHJlZExpc3QuYWRkKCgoQnJlYWtkb3duRWxlbWVudCkgdW53cmFwcGVkRSkuZ2V0R3VpZCgpKTsKLQkJCQlpZiAoZGVidWcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIHVud3JhcHBlZFByZWRMaXN0TWVtYmVyOiAiCi0JCQkJCQkJKyB1bndyYXBwZWRFKTsKLQkJCX0KLQkJfQotCQl3YnNXcmFwcGVyUGF0aFRvUHJlZExpc3RNYXAucHV0KGN1cnJlbnRFbGVtZW50UGF0aCwgZ3VpZFByZWRMaXN0KTsKLQkJaWYgKGRlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgX193cmFwcGVyUHJlZExpc3Q6ICIgKyBndWlkUHJlZExpc3QpOwotCi0JCXRhc2tfdWlkKys7Ci0KLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QnJpZWZEZXNjcmlwdGlvbihXb3JrQnJlYWtkb3duRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgYnJpZWZEZXNjID0gZWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCWlmICgoYnJpZWZEZXNjID09IG51bGwgfHwgYnJpZWZEZXNjLnRyaW0oKS5sZW5ndGgoKSA8PSAwKSkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayByZWZfZWRUYXNrID0gdGFza0Rlc2NyaXB0b3IuZ2V0VGFzaygpOwotCQkJCWlmIChyZWZfZWRUYXNrICE9IG51bGwpCi0JCQkJCWJyaWVmRGVzYyA9IHJlZl9lZFRhc2suZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJyaWVmRGVzYzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQXNzaWdubWVudChTdHJpbmcgcmVzTmFtZSwgaW50IHRhc2tVaWQsIFByb2plY3QgcHJvaikgewotCQlBc3NpZ25tZW50IGFzc2lnbm1lbnQgPSBwcm9qZWN0RmFjdG9yeS5jcmVhdGVBc3NpZ25tZW50KCk7Ci0KLQkJYXNzaWdubWVudC5zZXRVSUQoQmlnSW50ZWdlci52YWx1ZU9mKGFzc2lnbl91aWQpKTsKLQkJYXNzaWdubWVudC5zZXRUYXNrVUlEKEJpZ0ludGVnZXIudmFsdWVPZih0YXNrVWlkKSk7Ci0JCUJpZ0ludGVnZXIgcmVzSUQgPSAoQmlnSW50ZWdlcikgcm9sZXNUb1VpZE1hcC5nZXQocmVzTmFtZSk7Ci0JCWFzc2lnbm1lbnQuc2V0UmVzb3VyY2VVSUQocmVzSUQpOwotCi0JCXByb2ouZ2V0QXNzaWdubWVudHMoKS5nZXRBc3NpZ25tZW50KCkuYWRkKGFzc2lnbm1lbnQpOwotCi0JCWFzc2lnbl91aWQrKzsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0Um9sZXNGb3JUYXNrRChUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvcikgewotCQlBcnJheUxpc3Qgcm9sZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcnAgPSB0YXNrRGVzY3JpcHRvci5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JwID0gKFJvbGVEZXNjcmlwdG9yKSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJLmdldENhbGN1bGF0ZWRFbGVtZW50KHRhc2tEZXNjcmlwdG9yLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCksCi0JCQkJCQlicmVha2Rvd25FbGVtZW50RmlsdGVyLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0KLQkJaWYgKHJvbGVEZXNjcnAgIT0gbnVsbCkgewotCQkJcm9sZXNMaXN0LmFkZChnZXREaXNwbGF5TmFtZShyb2xlRGVzY3JwKSk7Ci0JCX0KLQkJLy8gTGlzdCByb2xlRGVzY3JwTGlzdCA9IHRhc2tEZXNjcmlwdG9yLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCUxpc3Qgcm9sZURlc2NycExpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50cygKLQkJCQl0YXNrRGVzY3JpcHRvci5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCWJyZWFrZG93bkVsZW1lbnRGaWx0ZXIuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY3JwTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXJvbGVEZXNjcnAgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJcm9sZXNMaXN0LmFkZChnZXREaXNwbGF5TmFtZShyb2xlRGVzY3JwKSk7Ci0JCX0KLQotCQlyZXR1cm4gcm9sZXNMaXN0OwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRSb2xlc0ZvclRhc2sob3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrIHVtYVRhc2spIHsKLQkJQXJyYXlMaXN0IHJvbGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlSb2xlIHJvbGUgPSB1bWFUYXNrLmdldFBlcmZvcm1lZEJ5KCk7Ci0JCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCXJvbGVzTGlzdC5hZGQoZ2V0RGlzcGxheU5hbWUocm9sZSkpOwotCQl9Ci0JCUxpc3QgbGlzdCA9IHVtYVRhc2suZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXJvbGUgPSAoUm9sZSkgaXRlci5uZXh0KCk7Ci0JCQlyb2xlc0xpc3QuYWRkKGdldERpc3BsYXlOYW1lKHJvbGUpKTsKLQkJfQotCi0JCXJldHVybiByb2xlc0xpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbGN1bGF0ZVJvbGx1cFJvbGVzKAotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotCQkJQnJlYWtkb3duRWxlbWVudCBicmVha2Rvd25FbGVtZW50LCBMaXN0IHJvbGx1cFJvbGVzKSB7Ci0KLQkJYm9vbGVhbiBpc0FueVN1YlRhc2tQbGFubmVkID0gZmFsc2U7Ci0KLQkJT2JqZWN0W10gZWxlbWVudHMgPSBjb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMoYnJlYWtkb3duRWxlbWVudCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQl8fCAoKEFjdGl2aXR5KSBlbGVtZW50KS5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlpc0FueVN1YlRhc2tQbGFubmVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlpc0FueVN1YlRhc2tQbGFubmVkID0gY2FsY3VsYXRlUm9sbHVwUm9sZXMoY29udGVudFByb3ZpZGVyLAotCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50LCByb2xsdXBSb2xlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJT2JqZWN0IHdyYXBwZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJaWYgKHdyYXBwZWRFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJfHwgKChBY3Rpdml0eSkgd3JhcHBlZEVsZW1lbnQpLmdldElzUGxhbm5lZCgpCi0JCQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWlzQW55U3ViVGFza1BsYW5uZWQgPSB0cnVlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaXNBbnlTdWJUYXNrUGxhbm5lZCA9IGNhbGN1bGF0ZVJvbGx1cFJvbGVzKAotCQkJCQkJCQljb250ZW50UHJvdmlkZXIsCi0JCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSB3cmFwcGVkRWxlbWVudCwgcm9sbHVwUm9sZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCWlmICghZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCQkJfHwgZGVzY3JpcHRvci5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlpc0FueVN1YlRhc2tQbGFubmVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyb2xsdXBSb2xlcwotCQkJCQkJCS5hZGRBbGwoZ2V0Um9sZXNGb3JUYXNrRCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlPYmplY3Qgd3JhcHBlZEVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQlpZiAod3JhcHBlZEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSB3cmFwcGVkRWxlbWVudDsKLQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJfHwgZGVzY3JpcHRvci5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJaXNBbnlTdWJUYXNrUGxhbm5lZCA9IHRydWU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyb2xsdXBSb2xlcwotCQkJCQkJCQkuYWRkQWxsKGdldFJvbGVzRm9yVGFza0QoKFRhc2tEZXNjcmlwdG9yKSB3cmFwcGVkRWxlbWVudCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGlzQW55U3ViVGFza1BsYW5uZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIGEgd29yayBicmVha2Rvd24gZWxlbWVudCdzIHByZWRlY2Vzc29ycywgc3RvcmVzIHRoZW0gaW4gYW4KLQkgKiA8b2NkZT5BcnJheUxpc3Q8L2NvZGU+LCBhbmQgcHV0IGl0IGludG8gYSBtYXAuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVRhc2tQcmVkZWNlc3NvcnMoV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IHByZWRlY2Vzc29ycyA9IGVsZW1lbnQuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJTGlzdCBwcmVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHByZWRlY2Vzc29ycyAhPSBudWxsICYmIHByZWRlY2Vzc29ycy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBwcmVkZWNlc3NvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIGkubmV4dCgpOwotCQkJCUJyZWFrZG93bkVsZW1lbnQgcHJlZGVjZXNzb3IgPSB3b3JrT3JkZXIuZ2V0UHJlZCgpOwotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBsb2NhbFByZWRMaXN0TWVtYmVyOiAiCi0JCQkJCQkJKyBwcmVkZWNlc3Nvcik7Ci0JCQkJfQotCQkJCWlmIChwcmVkZWNlc3NvciAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwcmVkR3VpZCA9IHByZWRlY2Vzc29yLmdldEd1aWQoKTsKLQkJCQkJaWYgKHByZWRHdWlkICE9IG51bGwpCi0JCQkJCQlwcmVkTGlzdC5hZGQocHJlZEd1aWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgbG9jYWwgcHJlZGxpc3QgZm9yICIgKyBlbGVtZW50LmdldE5hbWUoKQotCQkJCQkrICIgPSAiICsgcHJlZExpc3QudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQl3YnNXYXBwZXJQYXRoVG9Mb2NhbFByZWRMaXN0TWFwLnB1dChjdXJyZW50RWxlbWVudFBhdGgsIHByZWRMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUxpbmtzKFByb2Nlc3MgcHJvY2VzcywgUHJvamVjdCBwcm9qZWN0KQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVMaXN0IHRhc2tzID0gcHJvamVjdC5nZXRUYXNrcygpLmdldFRhc2soKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFza3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYXNrIHRhc2sgPSAoVGFzaykgaXRlci5uZXh0KCk7Ci0JCQlCaWdJbnRlZ2VyIHRhc2tVaWQgPSB0YXNrLmdldFVJRCgpOwotCQkJLy8gc2tpcCB0aGUgTVMgcHJvamVjdCBoaWRkZW4gdGFzayB3aXRoIHVpZCA9IDAKLQkJCWlmICh0YXNrVWlkLmludFZhbHVlKCkgPT0gMCkKLQkJCQljb250aW51ZTsKLQotCQkJU3RyaW5nIHdic1BhdGhTdHIgPSAoU3RyaW5nKSB0YXNrVWlkVG9XYnNXYXBwZXJQYXRoTWFwLmdldCh0YXNrVWlkKTsKLQotCQkJLy8gTGlzdCBwcmVkTGlzdCA9IChBcnJheUxpc3QpCi0JCQkvLyB3YnNXYXBwZXJQYXRoVG9Mb2NhbFByZWRMaXN0TWFwLmdldCh3YnNQYXRoU3RyKTsKLQkJCUxpc3QgcHJlZExpc3QgPSAoQXJyYXlMaXN0KSB3YnNXcmFwcGVyUGF0aFRvUHJlZExpc3RNYXAKLQkJCQkJLmdldCh3YnNQYXRoU3RyKTsKLQkJCWlmIChwcmVkTGlzdCAhPSBudWxsKSB7Ci0JCQkJTGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcmVkTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJU3RyaW5nIHByZWRHdWlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlCaWdJbnRlZ2VyIHByZWRUYXNrVWlkID0gKEJpZ0ludGVnZXIpIHdic0d1aWRUb1Rhc2tVaWRNYXAKLQkJCQkJCQkuZ2V0KHByZWRHdWlkKTsKLQotCQkJCQlpZiAocHJlZFRhc2tVaWQgPT0gbnVsbAotCQkJCQkJCXx8IHByZWRUYXNrVWlkLmludFZhbHVlKCkgPT0gdGFza1VpZC5pbnRWYWx1ZSgpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgdGFza1VpZCA9ICIgKyB0YXNrVWlkCi0JCQkJCQkJCSsgIiwgd2JzUGF0aFN0ciA9ICIgKyB3YnNQYXRoU3RyKTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIGxvY2FsUHJlZExpc3Q6ICIgKyBwcmVkTGlzdCk7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBmb3VuZCBwcmVkIGd1aWQ6ICIgKyBwcmVkR3VpZCk7Ci0JCQkJCX0KLQotCQkJCQlyZW1vdmVMaXN0LmFkZChwcmVkR3VpZCk7Ci0KLQkJCQkJUHJlZGVjZXNzb3JMaW5rIHByZUxpbmsgPSBwcm9qZWN0RmFjdG9yeQotCQkJCQkJCS5jcmVhdGVQcmVkZWNlc3NvckxpbmsoKTsKLQkJCQkJdGFzay5nZXRQcmVkZWNlc3NvckxpbmsoKS5hZGQocHJlTGluayk7Ci0JCQkJCXByZUxpbmsuc2V0UHJlZGVjZXNzb3JVSUQocHJlZFRhc2tVaWQpOwotCQkJCQlwcmVMaW5rLnNldFR5cGUobmV3IEJpZ0ludGVnZXIoIjEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJlTGluay5zZXRDcm9zc1Byb2plY3QoZmFsc2UpOwotCQkJCQlwcmVMaW5rLnNldExpbmtMYWcobmV3IEJpZ0ludGVnZXIoIjAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJlTGluay5zZXRMYWdGb3JtYXQobmV3IEJpZ0ludGVnZXIoIjciKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcHJlZExpc3QucmVtb3ZlQWxsKHJlbW92ZUxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIEhUTUwgY29udGVudCBmaWxlIFVSTCBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIFVSTCBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgY29udGVudCBmaWxlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50VVJMKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGVsZW1lbnRQYXRoID0gbnVsbDsKLQkJU3RyaW5nIGVsZW1lbnRGaWxlTmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKGVsZW1lbnQpOwotCQkJZWxlbWVudEZpbGVOYW1lID0gUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZU5hbWUoZWxlbWVudCwKLQkJCQkJUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVsZW1lbnRQYXRoICE9IG51bGwgJiYgZWxlbWVudEZpbGVOYW1lICE9IG51bGwpIHsKLQkJCWVsZW1lbnRQYXRoID0gZWxlbWVudFBhdGgucmVwbGFjZSgnXFwnLCAnLycpOwotCQkJZWxlbWVudEZpbGVOYW1lID0gZWxlbWVudEZpbGVOYW1lLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCVN0cmluZyB1cmwgPSBjb250ZW50Rm9sZGVyTmFtZQotCQkJCQkrICIvIiArIGVsZW1lbnRQYXRoICsgZWxlbWVudEZpbGVOYW1lOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gYWJUYXJnZXREaXIgKyBGaWxlLnNlcGFyYXRvciArIHVybDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheSBuYW1lIG9mIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpc3BsYXlOYW1lKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJbmFtZSA9IFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCW5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQl9Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQluYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIFhNTFV0aWwuZXNjYXBlQXR0cihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBQdWJsaXNoZXMgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBleHBvcnRlZAotCSAqIHByb2Nlc3MuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgdGhlIG91dHB1dCBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiB0byBwdWJsaXNoCi0JICogQHBhcmFtIHB1Ymxpc2hDb25maWdPcHRpb25zCi0JICogICAgICAgICAgICB0aGUgcHVibGlzaGluZyBvcHRpb25zCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29uZmlndXJhdGlvbiB3YXMgcHVibGlzaGVkCi0JICogICAgICAgICBzdWNjZXNzZnVsbHksIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwdWJsaXNoaW5nIHRoZSBjb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaENvbmZpZ3VyYXRpb24oU3RyaW5nIGRpciwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQdWJsaXNoT3B0aW9ucyBwdWJsaXNoQ29uZmlnT3B0aW9ucykKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXB1Ymxpc2hNZ3IgPSBuZXcgUHVibGlzaE1hbmFnZXIoKTsKLQkJCXB1Ymxpc2hNZ3IuaW5pdChkaXIsIGNvbmZpZywgcHVibGlzaENvbmZpZ09wdGlvbnMpOwotCi0JCQlFeHBvcnRNU1BYTUxPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEV4cG9ydE1TUFhNTE9wZXJhdGlvbigKLQkJCQkJcHVibGlzaE1ncik7Ci0JCQlQdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGRsZyA9IG5ldyBQdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKAotCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBwdWJsaXNoTWdyCi0JCQkJCQkJLmdldFZpZXdCdWlsZGVyKCkpOwotCQkJYm9vbGVhbiBzdWNjZXNzID0gVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhvcGVyYXRpb24sCi0JCQkJCWRsZywgdHJ1ZSwgRXhwb3J0TVNQUmVzb3VyY2VzLmV4cG9ydE1TUFdpemFyZF90aXRsZSk7Ci0JCQlpZiAob3BlcmF0aW9uLmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQl0aHJvdyBvcGVyYXRpb24uZ2V0RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzcyAmJiAhZGxnLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocHVibGlzaE1nciAhPSBudWxsKSB7Ci0JCQkJcHVibGlzaE1nci5kaXNwb3NlKCk7Ci0JCQkJcHVibGlzaE1nciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgYSBzb3VyY2UgZmlsZSB0byBhIGRlc3RpbmF0aW9uIGZpbGUuIFRoZSBkZXN0aW5hdGlvbiBmaWxlIGlzCi0JICogY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGlmIGl0IG9kZXMgbm90IGV4aXN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gc3JjCi0JICogICAgICAgICAgICB0aGUgc291cmNlIGZpbGUKLQkgKiBAcGFyYW0gdGd0Ci0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IGZpbGUKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNvcHkgdGhlIGZpbGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29weShGaWxlIHNyYywgRmlsZSBkc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmMpOwotCQlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZHN0KTsKLQotCQkvLyBUcmFuc2ZlciBieXRlcyBmcm9tIGluIHRvIG91dAotCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07Ci0JCWludCBsZW47Ci0JCXdoaWxlICgobGVuID0gaW4ucmVhZChidWYpKSA+IDApIHsKLQkJCW91dC53cml0ZShidWYsIDAsIGxlbik7Ci0JCX0KLQkJaW4uY2xvc2UoKTsKLQkJb3V0LmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIHRoZSB0cmFjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIE1pY3Jvc29mdCBQcm9qZWN0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRNU1Byb2plY3QoUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG4kJCQgcmVhZC1pbiBwcm9qZWN0ID0gIiArIHByb2plY3QpOyAvLyROT04tTkxTLTEkCi0KLQkJRUxpc3QgdGFza3MgPSBwcm9qZWN0LmdldFRhc2tzKCkuZ2V0VGFzaygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVRhc2sgZWxlbWVudCA9IChUYXNrKSBpdGVyLm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGEgdGFzayA9ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJRUxpc3QgcmVzb3VyY2VzID0gcHJvamVjdC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlIGVsZW1lbnQgPSAob3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSkgaXRlcgotCQkJCQkubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgYSByZXNvdXJjZSA9ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJRUxpc3QgYXNzaWdubWVudHMgPSBwcm9qZWN0LmdldEFzc2lnbm1lbnRzKCkuZ2V0QXNzaWdubWVudCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhc3NpZ25tZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFzc2lnbm1lbnQgZWxlbWVudCA9IChBc3NpZ25tZW50KSBpdGVyLm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGFuIGFzc2lnbm1lbnQgPSAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkPT09XG4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0T3B0aW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0T3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDkyMGNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQSBIYXNoTWFwIGZvciBFeHBvcnQgT3B0aW9ucwotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRPcHRpb25zIGV4dGVuZHMgSGFzaE1hcCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTg5NzAxMjE1OTEzMjEyMjczTDsKLQkKLQkvKioKLQkgKiBUaGUgcHVibGlzaCBzZWxlY3RlZCBjb25maWd1cmF0aW9uIG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJRyA9ICJwdWJsaXNoQ29uZmlnIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4cG9ydCBvbmx5IHBsYW5uZWQgd29ya2JyZWFrZG93biBlbGVtZW50cyBvcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX09OTFlfUExBTk5FRF9FTEVNRU5UUyA9ICJleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4cG9ydCBlZmZvcnQgZXN0aW1hdGVzIGZvciB3b3JrYnJlYWtkb3duIGVsZW1lbnRzIG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfRVNUSU1BVEVTID0gImV4cG9ydEVzdGltYXRlcyI7Ci0KLQkvKioKLQkgKiBUaGUgZXN0aW1hdGluZyBtb2RlbCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgZWZmb3J0IGVzdGltYXRlcyBvZiB0aGUKLQkgKiBleHBvcnRlZCB3b3JrYnJlYWtkb3duIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVTVElNQVRJTkdfTU9ERUwgPSAiZXN0aW1hdGluZ01vZGVsIjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRPcHRpb25zKCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvSUV4cG9ydE1TUFNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0lFeHBvcnRNU1BTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0OTM0YTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvSUV4cG9ydE1TUFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgU2VydmljZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUV4cG9ydE1TUFNlcnZpY2UgewotCi0JLyoqCi0JICogRXhwb3J0IGEgcHJvY2VzcyB0byBhIE1pY3Jvc29mdCBQcm9qZWN0IGZpbGUuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAgICAgICAgICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MKLQkgKiBAcGFyYW0gZXhwb3J0T3B0aW9ucwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIG9mIHVzZXIgc3BlY2lmaWVkIGV4cG9ydCBvcHRpb25zCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb3BlcmF0aW9uIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Ci0JICogQHRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwb3J0TVNQcm9qZWN0KFByb2Nlc3MgcHJvY2VzcywKLQkJCUV4cG9ydE1TUE9wdGlvbnMgZXhwb3J0T3B0aW9ucykgdGhyb3dzIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmODgwN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFdpemFyZAotZXhwb3J0TVNQV2l6YXJkX3RpdGxlPUV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdAotCi0jIFByb2dyZXNzIE1lc3NhZ2VzCi1leHBvcnRNU1BUYXNrX25hbWU9RXhwb3J0aW5nIHNlbGVjdGVkIHByb2Nlc3MgdG8gTWljcm9zb2Z0IFByb2plY3QuLi4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmZhNTIyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3Qgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3RlbXBsYXRlL21zcHJvamVjdF8yMDAzX3RlbXBsYXRlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvdGVtcGxhdGUvbXNwcm9qZWN0XzIwMDNfdGVtcGxhdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZmU1MGMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvdGVtcGxhdGUvbXNwcm9qZWN0XzIwMDNfdGVtcGxhdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9lcGYuZWNsaXBzZS5vcmcvbXNwcm9qZWN0Ij4KLTxOYW1lPm1zcHJvamVjdF8yMDAzX3RlbXBsYXRlLnhtbDwvTmFtZT4KLTxDb21wYW55PkVjbGlwc2Uub3JnPC9Db21wYW55PgotPEF1dGhvcj48L0F1dGhvcj4KLTxDcmVhdGlvbkRhdGU+MjAwNi0wMi0xMFQxNDozNjowMDwvQ3JlYXRpb25EYXRlPgotPExhc3RTYXZlZD4yMDA2LTAyLTEwVDE1OjE5OjAwPC9MYXN0U2F2ZWQ+Ci08U2NoZWR1bGVGcm9tU3RhcnQ+MTwvU2NoZWR1bGVGcm9tU3RhcnQ+Ci08U3RhcnREYXRlPjIwMDYtMDItMTBUMDg6MDA6MDA8L1N0YXJ0RGF0ZT4KLTxGaW5pc2hEYXRlPjIwMDYtMDItMTBUMDg6MDA6MDA8L0ZpbmlzaERhdGU+Ci08RllTdGFydERhdGU+MTwvRllTdGFydERhdGU+Ci08Q3JpdGljYWxTbGFja0xpbWl0PjA8L0NyaXRpY2FsU2xhY2tMaW1pdD4KLTxDdXJyZW5jeURpZ2l0cz4yPC9DdXJyZW5jeURpZ2l0cz4KLTxDdXJyZW5jeVN5bWJvbD4kPC9DdXJyZW5jeVN5bWJvbD4KLTxDdXJyZW5jeVN5bWJvbFBvc2l0aW9uPjA8L0N1cnJlbmN5U3ltYm9sUG9zaXRpb24+Ci08Q2FsZW5kYXJVSUQ+MTwvQ2FsZW5kYXJVSUQ+Ci08RGVmYXVsdFN0YXJ0VGltZT4wODowMDowMDwvRGVmYXVsdFN0YXJ0VGltZT4KLTxEZWZhdWx0RmluaXNoVGltZT4xNzowMDowMDwvRGVmYXVsdEZpbmlzaFRpbWU+Ci08TWludXRlc1BlckRheT40ODA8L01pbnV0ZXNQZXJEYXk+Ci08TWludXRlc1BlcldlZWs+MjQwMDwvTWludXRlc1BlcldlZWs+Ci08RGF5c1Blck1vbnRoPjIwPC9EYXlzUGVyTW9udGg+Ci08RGVmYXVsdFRhc2tUeXBlPjA8L0RlZmF1bHRUYXNrVHlwZT4KLTxEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbD4zPC9EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbD4KLTxEZWZhdWx0U3RhbmRhcmRSYXRlPjA8L0RlZmF1bHRTdGFuZGFyZFJhdGU+Ci08RGVmYXVsdE92ZXJ0aW1lUmF0ZT4wPC9EZWZhdWx0T3ZlcnRpbWVSYXRlPgotPER1cmF0aW9uRm9ybWF0Pjc8L0R1cmF0aW9uRm9ybWF0PgotPFdvcmtGb3JtYXQ+MjwvV29ya0Zvcm1hdD4KLTxFZGl0YWJsZUFjdHVhbENvc3RzPjA8L0VkaXRhYmxlQWN0dWFsQ29zdHM+Ci08SG9ub3JDb25zdHJhaW50cz4wPC9Ib25vckNvbnN0cmFpbnRzPgotPEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeT4xPC9JbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk+Ci08TXVsdGlwbGVDcml0aWNhbFBhdGhzPjA8L011bHRpcGxlQ3JpdGljYWxQYXRocz4KLTxOZXdUYXNrc0VmZm9ydERyaXZlbj4xPC9OZXdUYXNrc0VmZm9ydERyaXZlbj4KLTxOZXdUYXNrc0VzdGltYXRlZD4xPC9OZXdUYXNrc0VzdGltYXRlZD4KLTxTcGxpdHNJblByb2dyZXNzVGFza3M+MTwvU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzPgotPFNwcmVhZEFjdHVhbENvc3Q+MDwvU3ByZWFkQWN0dWFsQ29zdD4KLTxTcHJlYWRQZXJjZW50Q29tcGxldGU+MDwvU3ByZWFkUGVyY2VudENvbXBsZXRlPgotPFRhc2tVcGRhdGVzUmVzb3VyY2U+MTwvVGFza1VwZGF0ZXNSZXNvdXJjZT4KLTxGaXNjYWxZZWFyU3RhcnQ+MDwvRmlzY2FsWWVhclN0YXJ0PgotPFdlZWtTdGFydERheT4wPC9XZWVrU3RhcnREYXk+Ci08TW92ZUNvbXBsZXRlZEVuZHNCYWNrPjA8L01vdmVDb21wbGV0ZWRFbmRzQmFjaz4KLTxNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaz4wPC9Nb3ZlUmVtYWluaW5nU3RhcnRzQmFjaz4KLTxNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZD4wPC9Nb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZD4KLTxNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ+MDwvTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkPgotPEJhc2VsaW5lRm9yRWFybmVkVmFsdWU+MDwvQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZT4KLTxBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3M+MTwvQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzPgotPEN1cnJlbnREYXRlPjIwMDYtMDItMTBUMDg6MDA6MDA8L0N1cnJlbnREYXRlPgotPE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkw+MTwvTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTD4KLTxBdXRvbGluaz4xPC9BdXRvbGluaz4KLTxOZXdUYXNrU3RhcnREYXRlPjA8L05ld1Rhc2tTdGFydERhdGU+Ci08RGVmYXVsdFRhc2tFVk1ldGhvZD4wPC9EZWZhdWx0VGFza0VWTWV0aG9kPgotPFByb2plY3RFeHRlcm5hbGx5RWRpdGVkPjA8L1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkPgotPEV4dGVuZGVkQ3JlYXRpb25EYXRlPjE5ODQtMDEtMDFUMDA6MDA6MDA8L0V4dGVuZGVkQ3JlYXRpb25EYXRlPgotPEFjdHVhbHNJblN5bmM+MTwvQWN0dWFsc0luU3luYz4KLTxSZW1vdmVGaWxlUHJvcGVydGllcz4wPC9SZW1vdmVGaWxlUHJvcGVydGllcz4KLTxBZG1pblByb2plY3Q+MDwvQWRtaW5Qcm9qZWN0PgotPE91dGxpbmVDb2Rlcy8+Ci08V0JTTWFza3MvPgotPEV4dGVuZGVkQXR0cmlidXRlcy8+Ci08Q2FsZW5kYXJzPgotPENhbGVuZGFyPgotPFVJRD4xPC9VSUQ+Ci08TmFtZT5TdGFuZGFyZDwvTmFtZT4KLTxJc0Jhc2VDYWxlbmRhcj4xPC9Jc0Jhc2VDYWxlbmRhcj4KLTxCYXNlQ2FsZW5kYXJVSUQ+LTE8L0Jhc2VDYWxlbmRhclVJRD4KLTxXZWVrRGF5cz4KLTxXZWVrRGF5PgotPERheVR5cGU+MTwvRGF5VHlwZT4KLTxEYXlXb3JraW5nPjA8L0RheVdvcmtpbmc+Ci08L1dlZWtEYXk+Ci08V2Vla0RheT4KLTxEYXlUeXBlPjI8L0RheVR5cGU+Ci08RGF5V29ya2luZz4xPC9EYXlXb3JraW5nPgotPFdvcmtpbmdUaW1lcz4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4wODowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjEyOjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjEzOjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTc6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08L1dvcmtpbmdUaW1lcz4KLTwvV2Vla0RheT4KLTxXZWVrRGF5PgotPERheVR5cGU+MzwvRGF5VHlwZT4KLTxEYXlXb3JraW5nPjE8L0RheVdvcmtpbmc+Ci08V29ya2luZ1RpbWVzPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjA4OjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTI6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MTM6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xNzowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTwvV29ya2luZ1RpbWVzPgotPC9XZWVrRGF5PgotPFdlZWtEYXk+Ci08RGF5VHlwZT40PC9EYXlUeXBlPgotPERheVdvcmtpbmc+MTwvRGF5V29ya2luZz4KLTxXb3JraW5nVGltZXM+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MDg6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xMjowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4xMzowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjE3OjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPC9Xb3JraW5nVGltZXM+Ci08L1dlZWtEYXk+Ci08V2Vla0RheT4KLTxEYXlUeXBlPjU8L0RheVR5cGU+Ci08RGF5V29ya2luZz4xPC9EYXlXb3JraW5nPgotPFdvcmtpbmdUaW1lcz4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4wODowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjEyOjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjEzOjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTc6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08L1dvcmtpbmdUaW1lcz4KLTwvV2Vla0RheT4KLTxXZWVrRGF5PgotPERheVR5cGU+NjwvRGF5VHlwZT4KLTxEYXlXb3JraW5nPjE8L0RheVdvcmtpbmc+Ci08V29ya2luZ1RpbWVzPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjA4OjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTI6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MTM6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xNzowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTwvV29ya2luZ1RpbWVzPgotPC9XZWVrRGF5PgotPFdlZWtEYXk+Ci08RGF5VHlwZT43PC9EYXlUeXBlPgotPERheVdvcmtpbmc+MDwvRGF5V29ya2luZz4KLTwvV2Vla0RheT4KLTwvV2Vla0RheXM+Ci08L0NhbGVuZGFyPgotPC9DYWxlbmRhcnM+Ci08VGFza3M+Ci08VGFzaz4KLTxVSUQ+MDwvVUlEPgotPElEPjA8L0lEPgotPFR5cGU+MTwvVHlwZT4KLTxJc051bGw+MDwvSXNOdWxsPgotPENyZWF0ZURhdGU+MjAwNi0wMi0xMFQxNDozNjowMDwvQ3JlYXRlRGF0ZT4KLTxXQlM+MDwvV0JTPgotPE91dGxpbmVOdW1iZXI+MDwvT3V0bGluZU51bWJlcj4KLTxPdXRsaW5lTGV2ZWw+MDwvT3V0bGluZUxldmVsPgotPFByaW9yaXR5PjUwMDwvUHJpb3JpdHk+Ci08U3RhcnQ+MjAwNi0wMi0xMFQwODowMDowMDwvU3RhcnQ+Ci08RmluaXNoPjIwMDYtMDItMTBUMDg6MDA6MDA8L0ZpbmlzaD4KLTxEdXJhdGlvbj5QVDBIME0wUzwvRHVyYXRpb24+Ci08RHVyYXRpb25Gb3JtYXQ+NTM8L0R1cmF0aW9uRm9ybWF0PgotPFdvcms+UFQwSDBNMFM8L1dvcms+Ci08UmVzdW1lVmFsaWQ+MDwvUmVzdW1lVmFsaWQ+Ci08RWZmb3J0RHJpdmVuPjA8L0VmZm9ydERyaXZlbj4KLTxSZWN1cnJpbmc+MDwvUmVjdXJyaW5nPgotPE92ZXJBbGxvY2F0ZWQ+MDwvT3ZlckFsbG9jYXRlZD4KLTxFc3RpbWF0ZWQ+MTwvRXN0aW1hdGVkPgotPE1pbGVzdG9uZT4wPC9NaWxlc3RvbmU+Ci08U3VtbWFyeT4xPC9TdW1tYXJ5PgotPENyaXRpY2FsPjE8L0NyaXRpY2FsPgotPElzU3VicHJvamVjdD4wPC9Jc1N1YnByb2plY3Q+Ci08SXNTdWJwcm9qZWN0UmVhZE9ubHk+MDwvSXNTdWJwcm9qZWN0UmVhZE9ubHk+Ci08RXh0ZXJuYWxUYXNrPjA8L0V4dGVybmFsVGFzaz4KLTxFYXJseVN0YXJ0PjIwMDYtMDItMTBUMDg6MDA6MDA8L0Vhcmx5U3RhcnQ+Ci08RWFybHlGaW5pc2g+MjAwNi0wMi0xMFQwODowMDowMDwvRWFybHlGaW5pc2g+Ci08TGF0ZVN0YXJ0PjIwMDYtMDItMTBUMDg6MDA6MDA8L0xhdGVTdGFydD4KLTxMYXRlRmluaXNoPjIwMDYtMDItMTBUMDg6MDA6MDA8L0xhdGVGaW5pc2g+Ci08U3RhcnRWYXJpYW5jZT4wPC9TdGFydFZhcmlhbmNlPgotPEZpbmlzaFZhcmlhbmNlPjA8L0ZpbmlzaFZhcmlhbmNlPgotPFdvcmtWYXJpYW5jZT4wPC9Xb3JrVmFyaWFuY2U+Ci08RnJlZVNsYWNrPjA8L0ZyZWVTbGFjaz4KLTxUb3RhbFNsYWNrPjA8L1RvdGFsU2xhY2s+Ci08Rml4ZWRDb3N0PjA8L0ZpeGVkQ29zdD4KLTxGaXhlZENvc3RBY2NydWFsPjM8L0ZpeGVkQ29zdEFjY3J1YWw+Ci08UGVyY2VudENvbXBsZXRlPjA8L1BlcmNlbnRDb21wbGV0ZT4KLTxQZXJjZW50V29ya0NvbXBsZXRlPjA8L1BlcmNlbnRXb3JrQ29tcGxldGU+Ci08Q29zdD4wPC9Db3N0PgotPE92ZXJ0aW1lQ29zdD4wPC9PdmVydGltZUNvc3Q+Ci08T3ZlcnRpbWVXb3JrPlBUMEgwTTBTPC9PdmVydGltZVdvcms+Ci08QWN0dWFsRHVyYXRpb24+UFQwSDBNMFM8L0FjdHVhbER1cmF0aW9uPgotPEFjdHVhbENvc3Q+MDwvQWN0dWFsQ29zdD4KLTxBY3R1YWxPdmVydGltZUNvc3Q+MDwvQWN0dWFsT3ZlcnRpbWVDb3N0PgotPEFjdHVhbFdvcms+UFQwSDBNMFM8L0FjdHVhbFdvcms+Ci08QWN0dWFsT3ZlcnRpbWVXb3JrPlBUMEgwTTBTPC9BY3R1YWxPdmVydGltZVdvcms+Ci08UmVndWxhcldvcms+UFQwSDBNMFM8L1JlZ3VsYXJXb3JrPgotPFJlbWFpbmluZ0R1cmF0aW9uPlBUMEgwTTBTPC9SZW1haW5pbmdEdXJhdGlvbj4KLTxSZW1haW5pbmdDb3N0PjA8L1JlbWFpbmluZ0Nvc3Q+Ci08UmVtYWluaW5nV29yaz5QVDBIME0wUzwvUmVtYWluaW5nV29yaz4KLTxSZW1haW5pbmdPdmVydGltZUNvc3Q+MDwvUmVtYWluaW5nT3ZlcnRpbWVDb3N0PgotPFJlbWFpbmluZ092ZXJ0aW1lV29yaz5QVDBIME0wUzwvUmVtYWluaW5nT3ZlcnRpbWVXb3JrPgotPEFDV1A+MDwvQUNXUD4KLTxDVj4wPC9DVj4KLTxDb25zdHJhaW50VHlwZT4wPC9Db25zdHJhaW50VHlwZT4KLTxDYWxlbmRhclVJRD4tMTwvQ2FsZW5kYXJVSUQ+Ci08TGV2ZWxBc3NpZ25tZW50cz4xPC9MZXZlbEFzc2lnbm1lbnRzPgotPExldmVsaW5nQ2FuU3BsaXQ+MTwvTGV2ZWxpbmdDYW5TcGxpdD4KLTxMZXZlbGluZ0RlbGF5PjA8L0xldmVsaW5nRGVsYXk+Ci08TGV2ZWxpbmdEZWxheUZvcm1hdD44PC9MZXZlbGluZ0RlbGF5Rm9ybWF0PgotPElnbm9yZVJlc291cmNlQ2FsZW5kYXI+MDwvSWdub3JlUmVzb3VyY2VDYWxlbmRhcj4KLTxIaWRlQmFyPjA8L0hpZGVCYXI+Ci08Um9sbHVwPjA8L1JvbGx1cD4KLTxCQ1dTPjA8L0JDV1M+Ci08QkNXUD4wPC9CQ1dQPgotPFBoeXNpY2FsUGVyY2VudENvbXBsZXRlPjA8L1BoeXNpY2FsUGVyY2VudENvbXBsZXRlPgotPEVhcm5lZFZhbHVlTWV0aG9kPjA8L0Vhcm5lZFZhbHVlTWV0aG9kPgotPEFjdHVhbFdvcmtQcm90ZWN0ZWQ+UFQwSDBNMFM8L0FjdHVhbFdvcmtQcm90ZWN0ZWQ+Ci08QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkPlBUMEgwTTBTPC9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ+Ci08L1Rhc2s+Ci08L1Rhc2tzPgotPFJlc291cmNlcz4KLTxSZXNvdXJjZT4KLTxVSUQ+MDwvVUlEPgotPElEPjA8L0lEPgotPFR5cGU+MTwvVHlwZT4KLTxJc051bGw+MDwvSXNOdWxsPgotPFdvcmtHcm91cD4wPC9Xb3JrR3JvdXA+Ci08TWF4VW5pdHM+MTwvTWF4VW5pdHM+Ci08UGVha1VuaXRzPjA8L1BlYWtVbml0cz4KLTxPdmVyQWxsb2NhdGVkPjA8L092ZXJBbGxvY2F0ZWQ+Ci08Q2FuTGV2ZWw+MTwvQ2FuTGV2ZWw+Ci08QWNjcnVlQXQ+MzwvQWNjcnVlQXQ+Ci08V29yaz5QVDBIME0wUzwvV29yaz4KLTxSZWd1bGFyV29yaz5QVDBIME0wUzwvUmVndWxhcldvcms+Ci08T3ZlcnRpbWVXb3JrPlBUMEgwTTBTPC9PdmVydGltZVdvcms+Ci08QWN0dWFsV29yaz5QVDBIME0wUzwvQWN0dWFsV29yaz4KLTxSZW1haW5pbmdXb3JrPlBUMEgwTTBTPC9SZW1haW5pbmdXb3JrPgotPEFjdHVhbE92ZXJ0aW1lV29yaz5QVDBIME0wUzwvQWN0dWFsT3ZlcnRpbWVXb3JrPgotPFJlbWFpbmluZ092ZXJ0aW1lV29yaz5QVDBIME0wUzwvUmVtYWluaW5nT3ZlcnRpbWVXb3JrPgotPFBlcmNlbnRXb3JrQ29tcGxldGU+MDwvUGVyY2VudFdvcmtDb21wbGV0ZT4KLTxTdGFuZGFyZFJhdGU+MDwvU3RhbmRhcmRSYXRlPgotPFN0YW5kYXJkUmF0ZUZvcm1hdD4yPC9TdGFuZGFyZFJhdGVGb3JtYXQ+Ci08Q29zdD4wPC9Db3N0PgotPE92ZXJ0aW1lUmF0ZT4wPC9PdmVydGltZVJhdGU+Ci08T3ZlcnRpbWVSYXRlRm9ybWF0PjI8L092ZXJ0aW1lUmF0ZUZvcm1hdD4KLTxPdmVydGltZUNvc3Q+MDwvT3ZlcnRpbWVDb3N0PgotPENvc3RQZXJVc2U+MDwvQ29zdFBlclVzZT4KLTxBY3R1YWxDb3N0PjA8L0FjdHVhbENvc3Q+Ci08QWN0dWFsT3ZlcnRpbWVDb3N0PjA8L0FjdHVhbE92ZXJ0aW1lQ29zdD4KLTxSZW1haW5pbmdDb3N0PjA8L1JlbWFpbmluZ0Nvc3Q+Ci08UmVtYWluaW5nT3ZlcnRpbWVDb3N0PjA8L1JlbWFpbmluZ092ZXJ0aW1lQ29zdD4KLTxXb3JrVmFyaWFuY2U+MDwvV29ya1ZhcmlhbmNlPgotPENvc3RWYXJpYW5jZT4wPC9Db3N0VmFyaWFuY2U+Ci08U1Y+MDwvU1Y+Ci08Q1Y+MDwvQ1Y+Ci08QUNXUD4wPC9BQ1dQPgotPENhbGVuZGFyVUlEPjI8L0NhbGVuZGFyVUlEPgotPEJDV1M+MDwvQkNXUz4KLTxCQ1dQPjA8L0JDV1A+Ci08SXNHZW5lcmljPjA8L0lzR2VuZXJpYz4KLTxJc0luYWN0aXZlPjA8L0lzSW5hY3RpdmU+Ci08SXNFbnRlcnByaXNlPjA8L0lzRW50ZXJwcmlzZT4KLTxCb29raW5nVHlwZT4wPC9Cb29raW5nVHlwZT4KLTxBY3R1YWxXb3JrUHJvdGVjdGVkPlBUMEgwTTBTPC9BY3R1YWxXb3JrUHJvdGVjdGVkPgotPEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZD5QVDBIME0wUzwvQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkPgotPENyZWF0aW9uRGF0ZT4yMDA2LTAyLTEwVDE0OjM2OjAwPC9DcmVhdGlvbkRhdGU+Ci08L1Jlc291cmNlPgotPC9SZXNvdXJjZXM+Ci08QXNzaWdubWVudHMvPgotPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNzMxYmQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIHhtbCBleHBvcnQgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxNzllMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMGFlMjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWw7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5FeHBvcnRYTUxQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2U7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbCwKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcywKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY4YmNjMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNiNDRiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2ljb25zL2Z1bGwvb2JqMTYvWE1MRmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyNDk4MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9pY29ucy9mdWxsL3dpemJhbi9FeHBvcnRYTUwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmMmJhM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBFeHBvcnQgWE1MIFBsdWctaW4KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIEV4cG9ydCBYTUwgV2l6YXJkCi1leHBvcnRYTUxXaXphcmROYW1lPVhNTAotZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249RXhwb3J0IG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgdG8gYSBYTUwgZmlsZS4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjQ2NDY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkcy5FeHBvcnRYTUxXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L1hNTEZpbGUuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHMuRXhwb3J0WE1MV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJWV4cG9ydFhNTFdpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJWV4cG9ydFhNTFdpemFyZERlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHMuRXhwb3J0WE1MV2l6YXJkIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9FeHBvcnRYTUxQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL0V4cG9ydFhNTFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZWMzMThjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL0V4cG9ydFhNTFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IFhNTCBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRYTUxQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRXhwb3J0WE1MUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydFhNTFBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwb3J0WE1MUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9FeHBvcnRYTUxSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL0V4cG9ydFhNTFJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YmUxNDM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL0V4cG9ydFhNTFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgWE1MIG1lc3NhZ2UgcmVzb3VyY2UgYnVuZGxlIGFjY2Vzc29yIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV4cG9ydFhNTFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBFeHBvcnRYTUxSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFeHBvcnRYTUxSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFhNTFdpemFyZF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRDb25maWdzUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdmVyd3JpdGVUZXh0X21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydGluZ1hNTF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFhNTEZpbGVfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRYTUxXaXphcmRfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFhNTFNlcnZpY2VfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9ub19wbHVnaW47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X25vX2ZlYXR1cmU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X25vX2NsYXNzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9pbnZhbGlkX2ZlYXR1cmVfdmFsdWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfZXJyb3JfcHJvY2Vzc193cm9uZ19jb250YWluZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X25ld19pZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfaWRfbm90X3VuaXF1ZTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEV4cG9ydFhNTFJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0OTk4M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIwotIyBNZXNzYWdlIElEIFJhbmdlOgotIwotCi0jIEV4cG9ydCBYTUwgV2l6YXJkCi1leHBvcnRYTUxXaXphcmRfdGl0bGU9RXhwb3J0IFhNTAotCi0jIFNlbGVjdCBFeHBvcnQgVHlwZSBXaXphcmQgUGFnZQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1TZWxlY3QgdGhlIHR5cGUgb2YgbWV0aG9kIGxpYnJhcnkgY29udGVudCB0byBleHBvcnQuCi1leHBvcnRMaWJyYXJ5UmFkaW9CdXR0b25fdGV4dD1FeHBvcnQgdGhlIGVudGlyZSBtZXRob2QgbGlicmFyeQotZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ9RXhwb3J0IG9uZSBvciBtb3JlIG1ldGhvZCBwbHVnLWlucwotZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uX3RleHQ9RXhwb3J0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQotIyBTZWxlY3QgRGVzdGluYXRpb24gWE1MIEZpbGUgV2l6YXJkIFBhZ2UKLXNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlPVNwZWNpZnkgZXhwb3J0IGZpbGUKLXNlbGVjdFhNTEZpbGVQYWdlX2Rlc2M9U3BlY2lmeSBhIGRlc3RpbmF0aW9uIFhNTCBmaWxlIHRvIHN0b3JlIHRoZSBleHBvcnRlZCBtZXRob2QgbGlicmFyeSBjb250ZW50LgotZmlsZUxhYmVsX3RleHQ9WE1MIEZpbGU6Ci1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLQotIyBPdmVyd3JpdGUgQ29uZmlybWF0aW9uIERpYWxvZwotb3ZlcndyaXRlVGV4dF9tc2c9Jyd7MH0nJyBhbHJlYWR5IGV4aXN0cy5cbkRvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSBpdD8KLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotZXhwb3J0aW5nWE1MX3RleHQ9RXhwb3J0IG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgdG8gWE1MIGZpbGUuLi4KLQotIyBFcnJvciBNZXNzYWdlcwotaW52YWxpZFhNTEZpbGVfZXJyb3I9VGhlIHNwZWNpZmllZCBYTUwgZmlsZSBpcyBub3QgdmFsaWQuCi1leHBvcnRYTUxXaXphcmRfZXJyb3I9SVVQTTAwMDBFOiBUaGUgRXhwb3J0IGZhaWxlZDogezB9Ci1leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nPUV4cG9ydCBjb21wbGV0ZWQuIFBsZWFzZSByZXZpZXcgdGhlIGxvZyBmaWxlcyB1bmRlciB0aGUgZXhwb3J0IGRpcmVjdG9yeS4KLWV4cG9ydFhNTFNlcnZpY2VfZXJyb3I9RXJyb3IgZXhwb3J0aW5nIGxpYnJhcnk6IHswfQotZXhwb3J0WE1MU2VydmljZV9mZWF0dXJlX2Vycm9yPUVycm9yIHNldHRpbmcgZmVhdHVyZSB2YWx1ZTo6IEVsZW1lbnQ9ezB9LCBmZWF0dXJlPXsxfQoteG1sTGlicmFyeV9lcnJvcl9sb2FkX3htbD1VbmFibGUgdG8gbG9hZCB4bWwgc291cmNlICcnezB9JycKLXhtbExpYnJhcnlfbm9fcGx1Z2luPU5vIE1ldGhvZFBsdWdpbiBmb3IgaWQgezB9Ci14bWxMaWJyYXJ5X25vX2ZlYXR1cmU9VW5hYmxlIHRvIGdldCBYbWwgZmVhdHVyZSBmb3IgezB9X3sxfQoteG1sTGlicmFyeV9ub19jbGFzcz1VbmFibGUgdG8gZ2V0IEVDbGFzcyBmb3IgezB9Ci14bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PUVycm9yIGNyZWF0aW5nIGVsZW1lbnQsIERvbicndCBrbm93IGhvdyB0byBzZXQgdmFsdWUgZm9yIGZlYXR1cmUgezB9Ci14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZT1FcnJvciBjcmVhdGluZyBlbGVtZW50LCBDYW4nJ3Qgc2V0IHZhbHVlIHswfSB0byBjb250YWluZXIgezF9Ci14bWxMaWJyYXJ5X2ludmFsaWRfZmVhdHVyZV92YWx1ZT1JbnZhbGlkIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlIGZvciBmZWF0dXJlIHswfSwgd2l0aCB2YWx1ZSB7MX0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzI9RXJyb3Igc2V0dGluZyBhdHRyaWJ1dGUsIFVuYWJsZSB0byBzZXQgdmFsdWUgZm9yIGZlYXR1cmU9ezB9LCBvYmplY3Q9ezF9LCB2YWx1ZT17Mn0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzM9RG9uJyd0IGtub3cgaG93IHRvIHNldCB2YWx1ZSBmb3IgZmVhdHVyZT17MH0sIG9iamVjdD17MX0sIHZhbHVlPXsyfQoteG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPUVycm9yIHNldHRpbmcgcmVmZXJlbmNlLCBVbmFibGUgdG8gc2V0IHZhbHVlIGZvciBmZWF0dXJlPXswfSwgb2JqZWN0PXsxfSwgdmFsdWU9ezJ9Ci14bWxMaWJyYXJ5X2Vycm9yX3Byb2Nlc3Nfd3JvbmdfY29udGFpbmVyPXByb2Nlc3MgJyd7MH0nJyBkb24nJ3QgaGF2ZSBhIHZhbGlkIGNvbnRhaW5lci4gVGhlIGNvbnRhaW5lciBpcyBvZiB0eXBlICcnezF9JycsIHdoaWNoIGlzIG5vdCBhIFByb2Nlc3NwYWNrYWdlCi14bWxMaWJyYXJ5X25ld19pZD1FbGVtZW50IHswfSBpcyBhc3NpZ25lZCB3aXRoIGEgbmV3IGlkIHsxfSBiZWNhdXNlIGl0IGRvZXMgbm90IGhhdmUgYSB2YWxpZCBvbmUKLXhtbExpYnJhcnlfaWRfbm90X3VuaXF1ZT1FbGVtZW50IElkICcnezB9JycgaXMgdXNlZCBieSBtb3JlIHRoYW4gb25lIGVsZW1lbnQKLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUzMDk5ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIEV4cG9ydCBYTUwgcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcHJlZmVyZW5jZXMvRXhwb3J0WE1MUHJlZmVyZW5jZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3ByZWZlcmVuY2VzL0V4cG9ydFhNTFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4M2UwNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcHJlZmVyZW5jZXMvRXhwb3J0WE1MUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLkV4cG9ydFhNTERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgWE1MIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFhNTFByZWZlcmVuY2VzIHsKLQotCS8qKgotCSAqIFRoZSBleHBvcnQgdHlwZSBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfVFlQRSA9ICJleHBvcnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4cG9ydGVkIFhNTCBmaWxlIHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9GSUxFID0gInhtbEZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgewotCQkvLyBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChFWFBPUlRfVFlQRSwgRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX0xJQlJBUlkpOyAvLyROT04tTkxTLTEkCQkKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxfRklMRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhwb3J0IHR5cGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBleHBvcnQgdHlwZSBwcmVmZXJlbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RXhwb3J0VHlwZSgpIHsKLQkJcmV0dXJuIEV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0SW50KAotCQkJCUVYUE9SVF9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHBvcnRlZCB0eXBlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGV4cG9ydFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB1c2VyIHNwZWNpZmllZCBleHBvcnQgdHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFeHBvcnRUeXBlKGludCBleHBvcnRUeXBlKSB7Ci0JCUV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoRVhQT1JUX1RZUEUsCi0JCQkJZXhwb3J0VHlwZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhwb3J0ZWQgWE1MIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBleHBvcnRlZCBYTUwgZmlsZSBwcmVmZXJlbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0WE1MRmlsZSgpIHsKLQkJcmV0dXJuIEV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCVhNTF9GSUxFKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHBvcnRlZCBYTUwgZmlsZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIFhNTCBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFhNTEZpbGUoU3RyaW5nIHBhdGgpIHsKLQkJRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxfRklMRSwKLQkJCQlwYXRoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTJjMjBjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSBFeHBvcnQgWE1MIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0UmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTQwNjE0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLkJhc2VSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLlVybEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFRoZSByZXNvdXJjZSBoYW5kbGVyIGZvciBjb250ZW50IGluIHRoZSBleHBvcnRlZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0UmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgQmFzZVJlc291cmNlSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRSZXNvdXJjZUhhbmRsZXIoRmlsZSBzb3VyY2VMaWJSb290LCBGaWxlIHRhcmdldExpYlJvb3QpIHsKLQkJc3VwZXIoc291cmNlTGliUm9vdCwgdGFyZ2V0TGliUm9vdCk7Ci0JfQotCi0JLyoqCi0JICogcmVzb2x2ZSB0aGUgdXJsLiBGb3IgWE1MIGV4cG9ydCwgd2Ugc2hvdWxkIHJlc2VydmUgdGhlIHJlc291cmNlIGxvY2F0aW9ucy4KLQkgKi8KLQlwdWJsaWMgVXJsSW5mbyByZXNvbHZlRmlsZVVybChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gbG9hZFVybEluZm9XaXRoRml4ZWRQYXRoKG93bmVyLCBzcmNVcmwpOwotCX0KLQotCQotCS8qKgotCSAqIHRoZSByZXNvdXJjZSBwYXRoIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxpYmFyeSByb290LiB1cmxzIG5lZWRzIHRvIGJlCi0JICogZml4ZWQKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvd25lciBvYmplY3QgaW4gdGhlIHRhcmdldCBsaWJyYXJ5Ci0JICogQHBhcmFtIHNyY1VybAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFVybEluZm8gbG9hZFVybEluZm9XaXRoRml4ZWRQYXRoKE9iamVjdCBvd25lciwgU3RyaW5nIHNyY1VybCkgewotCQlVcmxJbmZvIGluZm8gPSBuZXcgVXJsSW5mbygpOwotCQlpbmZvLnNvdXJjZVVybCA9IHNyY1VybDsKLQkJaW5mby50YXJnZXRVcmwgPSBzcmNVcmw7Ci0JCVN0cmluZyBzcmNGaWxlID0gZ2V0RmlsZVJlbFBhdGgob3duZXIsIHNyY1VybCk7Ci0JCWlmIChzcmNGaWxlICE9IG51bGwpIHsKLQkJCWluZm8uc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZUxpYlJvb3QsIHNyY0ZpbGUpOwotCQkJaW5mby50YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgc3JjRmlsZSk7Ci0JCQlpbmZvLnRhcmdldFVybCA9IHNyY0ZpbGUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCX0KLQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRGaWxlUmVsUGF0aChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHsKLQkJdHJ5IHsKLQkJCWlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgaWQgPSAoKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQpIG93bmVyKQotCQkJCQkJLmdldElkKCk7Ci0JCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoaWQpOwotCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShuZXcgRmlsZShzb3VyY2VMaWJSb290LAotCQkJCQkJCQlSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChlbGVtZW50KSksIHNyY1VybCk7Ci0JCQkJCQlTdHJpbmcgcGF0aCA9IGYuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKHNvdXJjZUxpYlJvb3QuZ2V0Q2Fub25pY2FsUGF0aCgpCi0JCQkJCQkJCS5sZW5ndGgoKSArIDEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBMb2cgZXJyb3IgaGVyZQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0vLwkvKioKLS8vCSAqIHRoZSByZXNvdXJjZSBwYXRoIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIG93bmVyIGVsZW1lbnQuIHVybHMgd2lsbCBub3QgYmUKLS8vCSAqIGNoYW5nZWQgYnV0IHJlc291cmNlIGZpbGVzIGlzIHJlbGljYXRlZC4KLS8vCSAqIAotLy8JICogQHBhcmFtIG93bmVyCi0vLwkgKiBAcGFyYW0gc3JjVXJsCi0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXByaXZhdGUgVXJsSW5mbyBsb2FkVXJsSW5mb1dpdGhSZWxhdGl2ZVBhdGgoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB7Ci0vLwkJVXJsSW5mbyBpbmZvID0gbmV3IFVybEluZm8oKTsKLS8vCi0vLwkJdHJ5IHsKLS8vCQkJaW5mby5zb3VyY2VVcmwgPSBzcmNVcmw7Ci0vLwkJCWluZm8udGFyZ2V0VXJsID0gc3JjVXJsOyAvLyBubyB1cmwgY2hhbmdlCi0vLwotLy8JCQkvLyBnZXQgdGhlIHJtYyBvYmplY3QKLS8vCQkJaWYgKG93bmVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCkgewotLy8JCQkJU3RyaW5nIGlkID0gKChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50KSBvd25lcikKLS8vCQkJCQkJLmdldElkKCk7Ci0vLwkJCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotLy8JCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotLy8JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChpZCk7Ci0vLwkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotLy8JCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShuZXcgRmlsZShzb3VyY2VMaWJSb290LAotLy8JCQkJCQkJCVJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKGVsZW1lbnQpKSwgc3JjVXJsKTsKLS8vCQkJCQkJZiA9IGYuZ2V0Q2Fub25pY2FsRmlsZSgpOwotLy8KLS8vCQkJCQkJaW5mby5zb3VyY2VGaWxlID0gZjsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCi0vLwkJCWluZm8udGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldExpYlJvb3QsIHNyY1VybCkKLS8vCQkJCQkuZ2V0Q2Fub25pY2FsRmlsZSgpOwotLy8KLS8vCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0vLwkJCS8vIGxvZyBlcnJvciBUT0RPCi0vLwkJfQotLy8JCXJldHVybiBpbmZvOwotLy8JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRYTUxEYXRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRYTUxEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyOTQwMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogU3RvcmVzIHRoZSBzZWxlY3Rpb25zIGFuZCBzZXR0aW5ncyBtYWRlIGJ5IHRoZSB1c2VyIGluIHRoZSBFeHBvcnQgWE1MIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0WE1MRGF0YSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfTUVUSE9EX0xJQlJBUlkgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQT1JUX01FVEhPRF9QTFVHSU5TID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUE9SVF9NRVRIT0RfQ09ORklHUyA9IDM7Ci0KLQlwcm90ZWN0ZWQgaW50IGV4cG9ydFR5cGUgPSBFWFBPUlRfTUVUSE9EX0xJQlJBUlk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZFBsdWdpbnM7Ci0JCi0JcHJvdGVjdGVkIEhhc2hTZXQgYXNzb2NpYXRlZENvbmZpZ3M7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZENvbmZpZ3M7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHhtbEZpbGU7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBleHBvcnQgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIGV4cG9ydCBvcGVyYXRpb24gdG8gcGVyZm9ybS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEV4cG9ydFR5cGUoKSB7Ci0JCXJldHVybiBleHBvcnRUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGV4cG9ydCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBleHBvclR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGV4cG9ydCBvcGVyYXRpb24gdG8gcGVyZm9ybQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cG9ydFR5cGUoaW50IGV4cG9ydFR5cGUpIHsKLQkJdGhpcy5leHBvcnRUeXBlID0gZXhwb3J0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBwbHVnLWlucy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBtZXRob2QgcGx1Zy1pbnMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZFBsdWdpbnMoKSB7Ci0JCXJldHVybiBzZWxlY3RlZFBsdWdpbnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYXNzb2NpYXRlZCBjb25maWdzIHdpdGggcmVzcGVjdGVkIHRvIHNlbGVjdGVkIHBsdWctaW5zCi0JICogCi0JICogQHBhcmFtIGFzc29jaWF0ZWRDb25maWdNYXAKLQkgKiAgICAgICAgICAgTWFwIG9mIHNlbGVjdGVkIHBsdWctaW5zIHRvIGFzc29jaWF0ZWQgY29uZmlncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFzc29jaWF0ZWRDb25maWdzKE1hcCBhc3NvY2lhdGVkQ29uZmlnTWFwKSB7Ci0JCWlmIChhc3NvY2lhdGVkQ29uZmlnTWFwID09IG51bGwgfHwgYXNzb2NpYXRlZENvbmZpZ01hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NvY2lhdGVkQ29uZmlncyA9IG5ldyBIYXNoU2V0KCk7IAotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYXNzb2NpYXRlZENvbmZpZ01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlMaXN0IGNvbmZpZ0xpc3QgPSAoTGlzdCkgaXQubmV4dCgpOwotCQkJaW50IHN6ID0gY29uZmlnTGlzdCA9PSBudWxsID8gMCA6IGNvbmZpZ0xpc3Quc2l6ZSgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBjb25maWdMaXN0LmdldChpKTsKLQkJCQlpZiAoIWFzc29jaWF0ZWRDb25maWdzLmNvbnRhaW5zKGNvbmZpZy5nZXRHdWlkKCkpKSB7Ci0JCQkJCWFzc29jaWF0ZWRDb25maWdzLmFkZChjb25maWcuZ2V0R3VpZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBwbHVnLWlucy4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2lucwotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIG1ldGhvZCBwbHVnLWlucwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkUGx1Z2lucyhMaXN0IHBsdWdpbnMpIHsKLQkJc2VsZWN0ZWRQbHVnaW5zID0gcGx1Z2luczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbnMuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgbWV0aG9kIGNvbmZpZ3VyYXRpb25zCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VsZWN0ZWRDb25maWdzKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRDb25maWdzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdzCi0JICogICAgICAgICAgICBhIGxpc3Qgb2YgbWV0aG9kIGNvbmZpZ3VyYXRpb25zCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRDb25maWdzKExpc3QgY29uZmlncykgewotCQlzZWxlY3RlZENvbmZpZ3MgPSBjb25maWdzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIFhNTCBmaWxlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgWE1MIGZpbGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhNTEZpbGUoKSB7Ci0JCXJldHVybiB4bWxGaWxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIFhNTCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4bWxGaWxlCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBYTUwgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhNTEZpbGUoU3RyaW5nIHhtbEZpbGUpIHsKLQkJdGhpcy54bWxGaWxlID0geG1sRmlsZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFhNTExvZ2dlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhNTMzNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5GaWxlTG9nZ2VyOwotCi0KLS8qKgotICogTG9nZ2VyIGNsYXNzIGZvciB4bWwgZXhwb3J0Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0WE1MTG9nZ2VyIGV4dGVuZHMgRmlsZUxvZ2dlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HU19GT0xERVIgPSAibG9ncyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRYTUxMb2dnZXIoRmlsZSBsb2dSb290KSB7Ci0JCXN1cGVyKG5ldyBGaWxlKGxvZ1Jvb3QsIExPR1NfRk9MREVSKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTA3MDk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFhNTFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5Db250ZW50UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5JUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuRGlhZ3JhbUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogWG1sRXhwb3J0IHNlcnZpY2UgY2xhc3MgdG8gcHJvY2VzcyB0aGUgZXhwb3J0aW5nIHRhc2sKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFhNTFNlcnZpY2UgewotCi0JLy8gU3RyaW5nIHhtbFBhdGg7Ci0JcHJpdmF0ZSBFeHBvcnRYTUxEYXRhIGRhdGE7Ci0KLQlwcml2YXRlIFhNTExpYnJhcnkgeG1sTGliOwotCi0JcHJpdmF0ZSBMaXN0IGRpc2NhcmRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JRXhwb3J0WE1MTG9nZ2VyIGxvZ2dlciA9IG51bGw7Ci0KLQkvLyBpbiBjYXNlIHdlIG5lZWQgdG8gbWFwcGluZyB0aGUgdW1hIG9iamVjdHMgdG8geG1sIG9iamVjdHMKLQkvLyBzdWNoIGFzIHRoZSBjb250ZW50IGNhdGVnb3JpZXMKLQlwcml2YXRlIE1hcCB1bWFJZFRvWG1sSWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgRGlhZ3JhbUhhbmRsZXIgZGlhZ3JhbUhhbmRsZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRYTUxTZXJ2aWNlKEV4cG9ydFhNTERhdGEgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCQlsb2dnZXIgPSBuZXcgRXhwb3J0WE1MTG9nZ2VyKG5ldyBGaWxlKHRoaXMuZGF0YS54bWxGaWxlKQotCQkJCS5nZXRQYXJlbnRGaWxlKCkpOwotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSBsb2dnZXIgZmlsZS4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRMb2dQYXRoKCkgewotCQlyZXR1cm4gbG9nZ2VyLmdldExvZ1BhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJbG9nZ2VyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIFhNTCBsaWJyYXJ5IGV4cG9ydC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0V4cG9ydChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQotCQkJSVJlc291cmNlSGFuZGxlciBoYW5kbGVyID0gbmV3IEV4cG9ydFJlc291cmNlSGFuZGxlcigKLQkJCQkJbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSksIG5ldyBGaWxlKGRhdGEKLQkJCQkJCQkuZ2V0WE1MRmlsZSgpKS5nZXRQYXJlbnRGaWxlKCkpOwotCQkJQ29udGVudFByb2Nlc3NvciBjb250ZW50UHJvYyA9IG5ldyBDb250ZW50UHJvY2Vzc29yKGhhbmRsZXIsCi0JCQkJCXRoaXMubG9nZ2VyKTsKLQkJCQotCQkJZGlhZ3JhbUhhbmRsZXIgPSBuZXcgRGlhZ3JhbUhhbmRsZXIoCi0JCQkJCW5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpLCBuZXcgRmlsZShkYXRhCi0JCQkJCQkJLmdldFhNTEZpbGUoKSkuZ2V0UGFyZW50RmlsZSgpKTsKLQotCQkJLy8gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UucHJpbnRGZWF0dXJlTmFtZU1hcHBpbmcoKTsKLQotCQkJLy8gZXhwb3J0IHRoZSBjdXJyZW50IGxpYnJhcnkgdG8gdGhlIHhtbCBmaWxlCi0JCQkvLyBnZXQgdGhlIGN1cnJlbnQgbGlicmFyeSBpbnN0YW5jZSBhbmQgZXhwb3J0IGFsbCB0byB0aGUgeG1sCi0JCQlNZXRob2RMaWJyYXJ5IHNyYyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJCXRoaXMueG1sTGliID0gbmV3IFhNTExpYnJhcnkoY29udGVudFByb2MsIGxvZ2dlciwgZGF0YQotCQkJCQkuZ2V0WE1MRmlsZSgpKTsKLQotCQkJdGhpcy54bWxMaWIuY3JlYXRlTGlicmFyeShzcmMuZ2V0R3VpZCgpLCBzcmMuZ2V0TmFtZSgpKTsKLQkJCUVEYXRhT2JqZWN0IHRhcmdldCA9IHRoaXMueG1sTGliLmdldFJvb3QoKTsKLQotCQkJY3JlYXRFRGF0YU9iamVjdFRyZWUoc3JjLCB0YXJnZXQpOwotCQkJaXRlcmF0RURhdGFPYmplY3Qoc3JjKTsKLQotCQkJdGhpcy54bWxMaWIuZml4TGlicmFyeUZvckV4cG9ydCgpOwotCQkJCi0JCQl0aGlzLnhtbExpYi5zYXZlKCk7Ci0JCQlkaWFncmFtSGFuZGxlci5leGVjdXRlKCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZChFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0WE1MU2VydmljZV9lcnJvciwKLQkJCQkJZS5nZXRNZXNzYWdlKCkpLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BsdWdpblNlbGVjdGVkKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJaWYgKGRhdGEuZXhwb3J0VHlwZSA9PSBFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfTElCUkFSWSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZGF0YS5leHBvcnRUeXBlID09IEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9QTFVHSU5TKSB7Ci0JCQlyZXR1cm4gKGRhdGEuc2VsZWN0ZWRQbHVnaW5zICE9IG51bGwpCi0JCQkJCSYmIGRhdGEuc2VsZWN0ZWRQbHVnaW5zLmNvbnRhaW5zKHBsdWdpbik7Ci0JCX0gZWxzZSBpZiAoZGF0YS5leHBvcnRUeXBlID09IEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9DT05GSUdTKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NvbmZpZ0V4Y2x1ZGVkKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChkYXRhLmV4cG9ydFR5cGUgPT0gRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX1BMVUdJTlMpIHsKLQkJCXJldHVybiBkYXRhLmFzc29jaWF0ZWRDb25maWdzID09IG51bGwgfHwgCi0JCQkJCSFkYXRhLmFzc29jaWF0ZWRDb25maWdzLmNvbnRhaW5zKGNvbmZpZy5nZXRHdWlkKCkpOwotCQl9IAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdEVEYXRhT2JqZWN0VHJlZShNZXRob2RFbGVtZW50IHNyY09iaiwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldE9iaikgewotCi0JCS8vIGlmIGl0J3MgYSBwbHVnaW4sIHNraXAgYWxsIHRoZSBzeXN0ZW0gcGFja2FnZXMKLQkJLy8gYW5kIGZpbmQgdGhlIHRvcCBtb3N0IHVzZXIgcGFja2FnZXMKLQkJaWYgKHNyY09iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgc3JjT2JqOwotCQkJaWYgKCFpc1BsdWdpblNlbGVjdGVkKHBsdWdpbikpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIGFsbCBzeXN0ZW0gcGFja2FnZXMgYXJlIGRpc2NhcmRlZAotCQkJZGlzY2FyZGVkRWxlbWVudHMuYWRkQWxsKFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKSk7Ci0KLQkJCUxpc3QgdG9wbW9zdFVzZXJQYWNrYWdlcyA9IGdldFRvcG1vc3RVc2VyUGFja2FnZShwbHVnaW4pOwotCQkJTGlzdCBjYXRlZ29yeVBrZ3MgPSBUbmdVdGlsLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VzKHBsdWdpbik7Ci0KLQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgeG1sUGtnID0gKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIHRoaXMueG1sTGliCi0JCQkJCS5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKHBsdWdpbi5nZXRHdWlkKCkpOwotCQkJU3RyaW5nIGNvbnRlbnRDYXRlZ29yeVBhY2thZ2VJZCA9IHhtbFBrZy5nZXRJZCgpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0cCA9IHRvcG1vc3RVc2VyUGFja2FnZXMuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IChNZXRob2RQYWNrYWdlKSBpdHAubmV4dCgpOwotCi0JCQkJLy8gaWYgaXQncyBhIGNhdGVnb3J5IHBhY2thZ2UsCi0JCQkJLy8gY3JlYXRlIGFsbCBjb250YWluZWQgZWxlbWVudHMgaW4gdGhlIHNpbmdsZSBjdXN0b20gY2F0ZWdvcnkKLQkJCQkvLyBwYWNrYWdlCi0JCQkJaWYgKGNhdGVnb3J5UGtncy5jb250YWlucyhwa2cpKSB7Ci0KLQkJCQkJLy8gc2V0IHRoZSBpdCBtYXBwaW5nCi0JCQkJCXNldElkTWFwcGluZyhwa2cuZ2V0R3VpZCgpLCBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlSWQpOwotCQkJCQljcmVhdEVEYXRhT2JqZWN0VHJlZShwa2csIHhtbFBrZyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3JlYXRFRGF0YU9iamVjdFRyZWUocGtnLCB0YXJnZXRPYmopOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzcmNPYmouZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgY2hpbGQgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCi0JCQkJLy8gaW4gdW1hIG1vZGVsLCBXb3JrT3JkZXIgaXMgY29udGFpbmVkIGluIHBhY2thZ2UKLQkJCQkvLyBpbiB4bWwgbW9kZWwsIFdvcmtPcmRlciBpcyBjb250YWluZWQgYnkgdGhlIG93bmluZwotCQkJCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50LAotCQkJCS8vIHNvIGRlbGF5IHRoZSBjcmVhdGlvbiBpZiB0aGUgb3duZXIgaXMgYSBwYWNrYWdlCi0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgV29ya09yZGVyCi0JCQkJCQkmJiBzcmNPYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICgoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pCi0JCQkJCQkmJiAhaXNQbHVnaW5TZWxlY3RlZCgoTWV0aG9kUGx1Z2luKSBjaGlsZCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gJiYKLQkJCQkJaXNDb25maWdFeGNsdWRlZCgoTWV0aG9kQ29uZmlndXJhdGlvbikgY2hpbGQpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICghaXNEaXNjYXJkZWQoY2hpbGQpKSB7Ci0JCQkJCWNyZWF0ZVhtbE9iamVjdChjaGlsZCwgdGFyZ2V0T2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0SWRNYXBwaW5nKFN0cmluZyB1bWFJZCwgU3RyaW5nIHhtbElkKSB7Ci0JCWlmICghdW1hSWRUb1htbElkTWFwLmNvbnRhaW5zS2V5KHVtYUlkKSkgewotCQkJdW1hSWRUb1htbElkTWFwLnB1dCh1bWFJZCwgeG1sSWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0WG1sSWQoU3RyaW5nIHVtYUlkKSB7Ci0JCWlmICh1bWFJZFRvWG1sSWRNYXAuY29udGFpbnNLZXkodW1hSWQpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgdW1hSWRUb1htbElkTWFwLmdldCh1bWFJZCk7Ci0JCX0KLQkJcmV0dXJuIHVtYUlkOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0Rpc2NhcmRlZChPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBkaXNjYXJkZWRFbGVtZW50cy5jb250YWlucyhvKTsKLQl9Ci0KLQlwcml2YXRlIEVEYXRhT2JqZWN0IGdldFhtbE9iamVjdChNZXRob2RFbGVtZW50IHNyY09iaikgewotCQlTdHJpbmcgaWQgPSBzcmNPYmouZ2V0R3VpZCgpOwotCQlpZiAodW1hSWRUb1htbElkTWFwLmNvbnRhaW5zS2V5KGlkKSkgewotCQkJaWQgPSAoU3RyaW5nKSB1bWFJZFRvWG1sSWRNYXAuZ2V0KGlkKTsKLQkJfQotCQlyZXR1cm4gdGhpcy54bWxMaWIuZ2V0RWxlbWVudChpZCk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGFuIHhtbCBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyLCBiYXNlZCBvbiB0aGUgdW1hIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gdW1hRWxlbWVudAotCSAqIEBwYXJhbSB0YXJnZXRDb250YWluZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlWG1sT2JqZWN0KE1ldGhvZEVsZW1lbnQgdW1hRWxlbWVudCwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldENvbnRhaW5lcikgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IHVtYUVsZW1lbnQuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQljcmVhdGVYbWxPYmplY3QodW1hRWxlbWVudCwgdGFyZ2V0Q29udGFpbmVyLCBmZWF0dXJlLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGFuIHhtbCBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyLCBiYXNlZCBvbiB0aGUgdW1hIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gdW1hRWxlbWVudAotCSAqIEBwYXJhbSB0YXJnZXRDb250YWluZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlWG1sT2JqZWN0KE1ldGhvZEVsZW1lbnQgdW1hRWxlbWVudCwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldENvbnRhaW5lciwgU3RyaW5nIGNvbnRhaW5tZW50RmVhdHVyZSkgewotCi0JCXRyeSB7Ci0JCQlpZiAodW1hRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBnZXQgdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUgc28gd2UgY2FuIGNyZWF0ZSB0aGUgb2JqZWN0IG9mIHRoZQotCQkJLy8gc2FtZSB0eXBlCi0JCQlTdHJpbmcgZWxlbWVudFR5cGUgPSB1bWFFbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCk7Ci0JCQlFRGF0YU9iamVjdCB4bWxFbGVtZW50ID0geG1sTGliLmNyZWF0ZUVsZW1lbnQodGFyZ2V0Q29udGFpbmVyLAotCQkJCQljb250YWlubWVudEZlYXR1cmUsIHVtYUVsZW1lbnQuZUNsYXNzKCkuZ2V0TmFtZSgpLAotCQkJCQllbGVtZW50VHlwZSwgdW1hRWxlbWVudC5nZXRHdWlkKCkpOwotCQkJaWYgKHhtbEVsZW1lbnQgIT0gbnVsbCkgewotCi0JCQkJLy8gcmVjdXJzaXZlCi0JCQkJY3JlYXRFRGF0YU9iamVjdFRyZWUodW1hRWxlbWVudCwgeG1sRWxlbWVudCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyB0aGUgZXJyb3IgYW5kIGNvbnRpbnVlPz8/Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdEVEYXRhT2JqZWN0KE1ldGhvZEVsZW1lbnQgc3JjT2JqKSB7Ci0JCWRpYWdyYW1IYW5kbGVyLnJlZ2lzdGVyRWxlbWVudChzcmNPYmosIHRydWUpOwotCQkKLQkJaWYgKHNyY09iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHNyY09iajsKLQkJCWlmICghaXNQbHVnaW5TZWxlY3RlZChwbHVnaW4pKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJaWYgKGlzUHJvY2Vzc2VkKHNyY09iai5nZXRHdWlkKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0UHJvY2Vzc2VkKHNyY09iai5nZXRHdWlkKCkpOwotCi0JCUVEYXRhT2JqZWN0IHRhcmdldE9iaiA9IGdldFhtbE9iamVjdChzcmNPYmopOwotCi0JCS8vIGlmIG9iamVjdCBpcyBub3QgY3JlYXRlZCwKLQkJLy8gd2hpY2ggbWVhbnMgaXQncyBlaXRoZXIgYSBzeXN0ZW0gcGFja2FnZSBvciBzb21ldGhpbmcgd3JvbmcKLQkJaWYgKHRhcmdldE9iaiA9PSBudWxsKSB7Ci0JCQlpZiAoc3JjT2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCS8vIGl0ZXJhdGUgdGhlIGNoaWxkIHBhY2thZ2VzCi0JCQkJZm9yIChJdGVyYXRvciBpdCA9ICgoTWV0aG9kUGFja2FnZSkgc3JjT2JqKS5nZXRDaGlsZFBhY2thZ2VzKCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCWl0ZXJhdEVEYXRhT2JqZWN0KChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gLy8gZWxlbWVudHMgY2FuIGJlIHJlZmVyZW5jZSBpbiBvdGhlciBwbHVnaW5zCi0JCQkvLyAvLyBkb24ndCBuZWVkIHRvIGNhcmUgYWJvdXQgdGhpcwotCQkJLy8gZWxzZSBpZiAoIWlzRGlzY2FyZGVkKHNyY09iaikgKSB7Ci0JCQkvLyBsb2dnZXIubG9nV2FybmluZygiV2FybmluZzogeG1sIG9iamVjdCBub3QgY3JlYXRlZCBmb3IgIiArCi0JCQkvLyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShzcmNPYmopICk7Ci0JCQkvLyB9Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCUVDbGFzcyBlQ2xhc3MgPSBzcmNPYmouZUNsYXNzKCk7Ci0KLQkJRUxpc3QgZmVhdHVyZXMgPSBlQ2xhc3MuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdC5uZXh0KCk7Ci0KLQkJCU9iamVjdCB2YWx1ZSA9IHNyY09iai5lR2V0KGZlYXR1cmUpOwotCi0JCQl0cnkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdHYgPSAoKExpc3QpIHZhbHVlKS5pdGVyYXRvcigpOyBpdHYKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJTWV0aG9kRWxlbWVudCBzcmNfdmFsdWUgPSAoTWV0aG9kRWxlbWVudCkgaXR2Lm5leHQoKTsKLQotCQkJCQkJLy8gaGFuZGxlIHRoZQotCQkJCQkJLy8gVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcgotCQkJCQkJLy8gZmVhdHVyZSB2YWx1ZQotCQkJCQkJLy8gdGhlIFdvcmtPcmRlciBpbiB1bWEgaXMgYSBwcm9jZXNzIGVsZW1lbnQgaW4gYQotCQkJCQkJLy8gcGFja2FnZQotCQkJCQkJLy8gaW4geG1sIG1vZGVsLCBpdCdzIGFuIEVEYXRhT2JqZWN0IGNvbnRhaW5lZCBieSB0aGUKLQkJCQkJCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCQkJCQlpZiAoc3JjX3ZhbHVlIGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQkJCQkJLy8gZ2V0IHRoZSBvd25lciBvZiB0aGUgV29ya09yZGVyCi0JCQkJCQkJRURhdGFPYmplY3Qgd29ya09yZGVyID0gZ2V0WG1sT2JqZWN0KHNyY192YWx1ZSk7Ci0JCQkJCQkJaWYgKHdvcmtPcmRlciA9PSBudWxsKSB7Ci0JCQkJCQkJCWNyZWF0ZVhtbE9iamVjdChzcmNfdmFsdWUsIHRhcmdldE9iaiwgZmVhdHVyZQotCQkJCQkJCQkJCS5nZXROYW1lKCkpOwotCQkJCQkJCX0KLQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIndvcmtvcmRlciB2YWx1ZSIpOwotCQkJCQkJfQotCi0JCQkJCQkvLyBzZXQgdGhlIHJlZmVyZW5jZQotCQkJCQkJU3RyaW5nIHhtbElkID0gZ2V0WG1sSWQoc3JjX3ZhbHVlLmdldEd1aWQoKSk7Ci0JCQkJCQl4bWxMaWIuc2V0UmVmZXJlbmNlVmFsdWUodGFyZ2V0T2JqLCBmZWF0dXJlLmdldE5hbWUoKSwKLQkJCQkJCQkJeG1sSWQsIHNyY192YWx1ZS5nZXRUeXBlKCkpOwotCi0JCQkJCQlpdGVyYXRFRGF0YU9iamVjdChzcmNfdmFsdWUpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJLy8gZ2V0IHRoZSB4bWwgb2JqZWN0IGFuZCBpdGVyYXRlIGFnYWluCi0JCQkJCU1ldGhvZEVsZW1lbnQgc3JjX3ZhbHVlID0gKE1ldGhvZEVsZW1lbnQpIHZhbHVlOwotCi0JCQkJCS8vIGlmICggc3JjX3ZhbHVlIGluc3RhbmNlb2YgV29ya09yZGVyICkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIndvcmtvcmRlciB2YWx1ZSIpOwotCQkJCQkvLyB9Ci0KLQkJCQkJLy8gZWxlbWVudHMgbGlrZSBQcmVzZW50YXRpb24gbWF5IG5vdCBoYXZlIGEgQ29udGVudAotCQkJCQkvLyBEZXNjcmlwdGlvbgotCQkJCQkvLyB0aGUgb25lIHJldHVybmVkIG1heSBub3QgaGF2ZSBhIGNvbnRhaW5lcgotCQkJCQlpZiAoc3JjX3ZhbHVlLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgeG1sSWQgPSBnZXRYbWxJZChzcmNfdmFsdWUuZ2V0R3VpZCgpKTsKLQkJCQkJCXhtbExpYi5zZXRSZWZlcmVuY2VWYWx1ZSh0YXJnZXRPYmosIGZlYXR1cmUuZ2V0TmFtZSgpLAotCQkJCQkJCQl4bWxJZCwgc3JjX3ZhbHVlLmdldFR5cGUoKSk7Ci0KLQkJCQkJCWl0ZXJhdEVEYXRhT2JqZWN0KHNyY192YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKCFpc0Rpc2NhcmRlZChzcmNPYmopKSB7Ci0JCQkJCS8vIGlmICggdGFyZ2V0T2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5UGFja2FnZSkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhycmUiKTsKLQkJCQkJLy8gfQotCi0JCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFdvcmtPcmRlclR5cGUpIHsKLQkJCQkJCXZhbHVlID0gKChXb3JrT3JkZXJUeXBlKSB2YWx1ZSkuZ2V0TmFtZSgpOwotCQkJCQl9Ci0KLQkJCQkJeG1sTGliLnNldEF0cmlidXRlRmVhdHVyZVZhbHVlKHRhcmdldE9iaiwKLQkJCQkJCQlmZWF0dXJlLmdldE5hbWUoKSwgdmFsdWUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKAotCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFNlcnZpY2VfZmVhdHVyZV9lcnJvciwKLQkJCQkJCUxpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHNyY09iaiksIGZlYXR1cmUuZ2V0TmFtZSgpKTsKLQkJCQlsb2dnZXIubG9nRXJyb3IobXNnLCBlKTsKLQkJCX0KLQotCQl9Ci0KLQl9Ci0KLQkvLyBnb2lkIG9mIHByb2Nlc3NlZCBlbGVtZW50Ci0JcHJpdmF0ZSBMaXN0IHByb2Nlc3NlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzUHJvY2Vzc2VkKFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiBwcm9jZXNzZWRFbGVtZW50cy5jb250YWlucyhndWlkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UHJvY2Vzc2VkKFN0cmluZyBndWlkKSB7Ci0JCWlmICghcHJvY2Vzc2VkRWxlbWVudHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCXByb2Nlc3NlZEVsZW1lbnRzLmFkZChndWlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRUb3Btb3N0VXNlclBhY2thZ2UoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX2NvcmVfY29udGVudCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19jdXN0b21fY2F0ZWdvcmllcyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19kaXNjaXBsaW5lcyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19kb21haW5zID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19yb2xlc2V0cyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX3Rvb2xzID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfd3B0eXBlcyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfY3AgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfZHAgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGgpOwotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX3Byb2NfY29udHJpYnV0aW9uID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5wcm9jZXNzQ29udHJpYnV0aW9uUGF0aCk7Ci0KLQkJTGlzdCBwa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQlwa2dzLmFkZChwa2dfY29yZV9jb250ZW50KTsKLQkJcGtncy5hZGQocGtnX2N1c3RvbV9jYXRlZ29yaWVzKTsKLQkJcGtncy5hZGQocGtnX2Rpc2NpcGxpbmVzKTsKLQkJcGtncy5hZGQocGtnX2RvbWFpbnMpOwotCQlwa2dzLmFkZChwa2dfcm9sZXNldHMpOwotCQlwa2dzLmFkZChwa2dfdG9vbHMpOwotCQlwa2dzLmFkZChwa2dfd3B0eXBlcyk7Ci0JCXBrZ3MuYWRkKHBrZ19jcCk7Ci0JCXBrZ3MuYWRkKHBrZ19kcCk7Ci0KLQkJaWYgKCBwa2dfcHJvY19jb250cmlidXRpb24gIT0gbnVsbCApIHsKLQkJCXBrZ3MuYWRkKHBrZ19wcm9jX2NvbnRyaWJ1dGlvbik7Ci0JCX0KLQkJCi0JCXJldHVybiBwa2dzOwotCi0JCS8vIExpc3Qgc3lzdGVtUGtncyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKTsKLQkJLy8JCQotCQkvLyBMaXN0IHVucHJvY2Vzc2VkUGtncyA9IG5ldyBBcnJheUxpc3QocGx1Z2luLmdldE1ldGhvZFBhY2thZ2VzKCkpOwotCQkvLyB3aGlsZSAodW5wcm9jZXNzZWRQa2dzLnNpemUoKSA+IDAgKSB7Ci0JCS8vIE1ldGhvZFBhY2thZ2UgcGtnID0gKE1ldGhvZFBhY2thZ2UpIHVucHJvY2Vzc2VkUGtncy5yZW1vdmUoMCk7Ci0JCS8vIGlmICggIXN5c3RlbVBrZ3MuY29udGFpbnMocGtnKSApIHsKLQkJLy8gaWYgKCAhcGtncy5jb250YWlucyhwa2cpICkgewotCQkvLyBwa2dzLmFkZChwa2cpOwotCQkvLyB9Ci0JCS8vIGNvbnRpbnVlOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIGZvciAoIEl0ZXJhdG9yIGl0ID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7Ci0JCS8vICkgewotCQkvLyBNZXRob2RQYWNrYWdlIHAgPSAoTWV0aG9kUGFja2FnZSlpdC5uZXh0KCk7Ci0JCS8vIGlmICggc3lzdGVtUGtncy5jb250YWlucyhwKSApCi0JCS8vIHsKLQkJLy8gaWYgKCAhdW5wcm9jZXNzZWRQa2dzLmNvbnRhaW5zKHApICkgewotCQkvLyB1bnByb2Nlc3NlZFBrZ3MuYWRkKHApOwotCQkvLyB9Ci0JCS8vIH0gZWxzZSB7Ci0JCS8vIGlmICggIXBrZ3MuY29udGFpbnMocCkgKSB7Ci0JCS8vIHBrZ3MuYWRkKHApOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwkJCQotCQkvLyBpZiAoIHVucHJvY2Vzc2VkUGtncy5zaXplKCkgPT0gMCApIHsKLQkJLy8gYnJlYWs7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwkJCi0JCS8vIC8vIG5lZWQgdG8gaW5jbHVkZSB0aGUgY29udGVudCBwYWNrYWdlcwotCQkvLyBwa2dzLmFkZEFsbChUbmdVdGlsLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VzKHBsdWdpbikpOwotCi0JfQotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGlzU3lzdGVtUGFja2FnZShFRGF0YU9iamVjdCBlbGVtZW50KSB7Ci0JLy8JCQotCS8vIGlmICggIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgKSB7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLwkJCi0JLy8gTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkvLyBpZiAoIHBsdWdpbiA9PSBudWxsICkgewotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8JCQotCS8vIHJldHVybiBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHBsdWdpbikuY29udGFpbnMoZWxlbWVudCk7Ci0JLy8JCQotCS8vIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0ZlYXR1cmVNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9GZWF0dXJlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZjQzZjQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0ZlYXR1cmVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRXh0ZW5kZWRNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBtYW5hZ2UgdGhlIGZlYXR1cmVzIG9mIEVDbGFzcy4KLSAqIG1haW50YWlucyBhIG1hcCBvZiBmZWF0dXJlIG5hbWUgdG8gdGhlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QgZm9yIGVhc2llciBhY2Nlc3MKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlTWFuYWdlciB7Ci0KLQlwdWJsaWMgc3RhdGljIEZlYXR1cmVNYW5hZ2VyIElOU1RBTkNFID0gbmV3IEZlYXR1cmVNYW5hZ2VyKCk7Ci0JCi0JLy9wcml2YXRlIE1hcCBjbGFzc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLy8gbWFwIG9mIHVtYSBmZWF0dXJlIG5hbWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgeG1sIGZlYXR1cmUgbmFtZQotCXByaXZhdGUgTWFwIGZlYXR1cmVOYW1lTWFwID0gbmV3IFRyZWVNYXAoKTsKLQkKLQkvLyB1bWEgZmVhdHVyZXMgdGhhdCBzaG91bGQgYmUgaWdub3JlZAotCXByaXZhdGUgTGlzdCB1bm5lZWRlZFJtY0ZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8geG1sIGZlYXR1cmVzIHRoYXQgY2FuIGJlIGlnbm9yZWQKLQlwcml2YXRlIExpc3QgdW5uZWVkZWRYbWxGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIG1hcCBvZiBFQ2xhc3MgbmFtZSB0byBFQ2xhc3MgT2JqZWN0IGZvciB4bWwgbW9kZWwKLQkvLyBub3RlOiB3ZSBjYW4ndCB1c2UgZmVhdHVyZS5nZXRFVHlwZSgpIHRvIGdldCB0aGUgRUNsYXNzIGZyb20gZmVhdHVyZQotCS8vIHRoZSBwcm9ibGVtIGlzIHRoZSBhYm92ZSByZXR1cm5lZCBFQ2xhc3MgbWF5IG5vdCBiZSB0aGUgY29uY3JlYXRlIEVDbGFzcywgaW5zdGVhZCwgaXQgaXMgdGhlIGJhc2UgY2xhc3MKLQkvLyBmb3IgZXhhbXBsZSwgaXQgcmV0dXJucyBNZXRob2RQYWNrYWdlIGluc3RlYWQgb2YgUHJvY2Vzc1BhY2thZ2Ugb3IgQ29udGVudFBhY2thZ2UKLQkvLyBzbyB3ZSBoYXZlIHRvIG1haW50YWluIGEgbWFwIG1hbnVhbGx5Ci0JcHJpdmF0ZSBNYXAgeG1sRUNsYXNzTWFwID0gbmV3IFRyZWVNYXAoKTsKLQkKLQkvLyBtYXAgb2YgRWNsYXMgbmFtZSB0byBFQ2xhc3Mgb2JqZWN0IGZvciB1bWEgbW9kZWwKLQlwcml2YXRlIE1hcCB1bWFFQ2xhc3NNYXAgPSBuZXcgVHJlZU1hcCgpOwotCQotCXByaXZhdGUgRmVhdHVyZU1hbmFnZXIoKSB7Ci0JCQotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIk9wdGlvbmFsSW5wdXRUbyIsICJvcHRpb25hbElucHV0VG8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiUm9sZSIsICJyb2xlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIlRhc2siLCAidGFzayIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJhY3Rpdml0eVJlZmVyZW5jZXMiLCAiYWN0aXZpdHlSZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYWdncmVnYXRlZFJvbGVzIiwgImFnZ3JlZ2F0ZWRSb2xlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImFzc2V0cyIsICJyZXVzYWJsZUFzc2V0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImF0dGFjaG1lbnRzIiwgImF0dGFjaG1lbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYmFzZUNvbmZpZ3VyYXRpb25zIiwgImJhc2VDb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImJhc2VkT25Qcm9jZXNzZXMiLCAiYmFzZVByb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYmFzZXMiLCAicmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJib2R5IiwgIm1haW5EZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJicmVha2Rvd25FbGVtZW50cyIsICJicmVha2Rvd25FbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNhdGVnb3JpemVkRWxlbWVudHMiLCAiY2F0ZWdvcml6ZWRFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNoZWNrbGlzdHMiLCAiY2hlY2tsaXN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNoaWxkUGFja2FnZXMiLCAibWV0aG9kUGFja2FnZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjb21tdW5pY2F0aW9uc01hdGVyaWFscyIsICJjb21tdW5pY2F0aW9uc01hdGVyaWFsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNvbmNlcHRzIiwgImNvbmNlcHQsd2hpdGVwYXBlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjb25jZXB0c0FuZFBhcGVycyIsICJjb25jZXB0LHdoaXRlcGFwZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiY29udGFpbmVkQXJ0aWZhY3RzIiwgImNvbnRhaW5lZEFydGlmYWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNvbnRlbnRFbGVtZW50cyIsICJjb250ZW50RWxlbWVudCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjb250ZW50UmVmZXJlbmNlcyIsICJjb250ZW50UmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNvcHlyaWdodFN0YXRlbWVudCIsICJjb3B5cmlnaHQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiZGVsaXZlcmVkV29ya1Byb2R1Y3RzIiwgImRlbGl2ZXJlZFdvcmtQcm9kdWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImRpc2NpcGxpbmVzIiwgImRpc2NpcGxpbmUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiZWR1Y2F0aW9uTWF0ZXJpYWxzIiwgImVkdWNhdGlvbk1hdGVyaWFsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImVzdGltYXRpb25Db25kZXJhdGlvbnMiLCAiZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImV4YW1wbGVzIiwgImV4YW1wbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiZ3VpZCIsICJpZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJndWlkZWxpbmVzIiwgImd1aWRlbGluZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJob3d0b1N0YWZmIiwgImhvd1RvU3RhZmYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiaW5jbHVkZXNQYXR0ZXJucyIsICJpbmNsdWRlc1BhdHRlcm4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiaW50ZXJmYWNlcyIsICJpbnRlcmZhY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgibGlua1RvUHJlZGVjZXNzb3IiLCAicHJlZGVjZXNzb3IiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgibWV0aG9kUGFja2FnZXMiLCAibWV0aG9kUGFja2FnZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJtZXRob2RQbHVnaW5zIiwgIm1ldGhvZFBsdWdpbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJvd25lZFJ1bGVzIiwgIm93bmVkUnVsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiLCAibWV0aG9kQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJwcm9jZXNzRWxlbWVudHMiLCAicHJvY2Vzc0VsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicHJvY2Vzc1ZpZXdzIiwgInByb2Nlc3NWaWV3Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInJlZmVyZW5jZVdvcmtmbG93cyIsICJyZWZlcmVuY2VXb3JrZmxvdyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyZXBvcnRzIiwgInJlcG9ydCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyZXVzYWJsZUFzc2V0cyIsICJyZXVzYWJsZUFzc2V0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInJldXNlZFBhY2thZ2VzIiwgInJldXNlZFBhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicm9hZG1hcHMiLCAicm9hZG1hcCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyb2xlU2V0cyIsICJyb2xlU2V0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInJvbGVzIiwgInJvbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic2VjdGlvbkRlc2NyaXB0aW9uIiwgImRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInNlY3Rpb25zIiwgInNlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic2VsZWN0ZWRTdGVwcyIsICJzdGVwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1YkNhdGVnb3JpZXMiLCAic3ViQ2F0ZWdvcnkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic3ViZGlzY2lwbGluZSIsICJzdWJEaXNjaXBsaW5lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1YlByYWN0aWNlcyIsICJzdWJQcmFjdGljZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzdWJTZWN0aW9ucyIsICJzdWJTZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1YmRvbWFpbnMiLCAic3ViZG9tYWluIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1cGVyQWN0aXZpdGllcyIsICJzdXBlckFjdGl2aXR5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1cHBvcnRpbmdNYXRlcmlhbHMiLCAic3VwcG9ydGluZ01hdGVyaWFsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInRhc2tzIiwgInRhc2siKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgidGVhbVJvbGVzIiwgInJvbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgidGVtcGxhdGVzIiwgInRlbXBsYXRlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInRvb2xNZW50b3JzIiwgInRvb2xNZW50b3IiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiV29ya1Byb2R1Y3QiLCAid29ya1Byb2R1Y3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgid29ya1Byb2R1Y3RzIiwgIndvcmtQcm9kdWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInByZWQiLCAidmFsdWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgiY29udGFpbmVyQXJ0aWZhY3QiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgibW9kaWZpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgicGFyZW50UGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJkaWFncmFtcyIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJtb2RpZmllcyIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJzdGVwcyIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJ3b3JrZWRPbkJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJdW5uZWVkZWRSbWNGZWF0dXJlcy5hZGQoImRpYWdyYW1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXVubmVlZGVkWG1sRmVhdHVyZXMuYWRkKCJncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkWG1sRmVhdHVyZXMuYWRkKCJncm91cDEiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFhtbEZlYXR1cmVzLmFkZCgiZ3JvdXAyIik7IC8vJE5PTi1OTFMtMSQKLQkJdW5uZWVkZWRYbWxGZWF0dXJlcy5hZGQoInByZWRlY2Vzc29yMSIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlsb2FkWG1sQ2xhc3NlcygpOwotCQlsb2FkUm1jQ2xhc3NlcygpOwotCQkKLS8vCQkvLyBwcmludCBvdXQgdGhlIEVDbGFzc2VzIGFuZCBmZWF0dXJlIG1hcCwgZm9yIHRlc3RpbmcgcHVycG9zZQotLy8JCS8vIGRvbid0IGRlbGV0ZSB0aGlzIGNvZGUgc2VnbWVudAotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09IExvYWRpbmcgRUNsYXNzZXMgZm9yIFhNTCBVbWEgbW9kZWwgPT09PT09PT09PT09PT09PT0iKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ID0geG1sRUNsYXNzTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgaXQubmV4dCgpKTsJCQkKLS8vCQl9Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotLy8KLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZU5hbWVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0vLwkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKWVudHJ5LmdldEtleSgpOwotLy8JCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWVudHJ5LmdldFZhbHVlKCk7Ci0vLwkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCApIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRmZWF0dXJlTmFtZU1hcC5wdXQoXCIiICsga2V5ICsgIlwiLCBcIiIgKyB2YWx1ZSArICJcIik7Iik7CQotLy8JCQl9Ci0vLwkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZFJtY0NsYXNzZXMoKSB7Ci0JCQotCQkvLyBsb2FkIEVDbGFzcyBtYXAKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENhcGFiaWxpdHlQYXR0ZXJuKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDaGVja2xpc3QoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmNlcHQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnN0cmFpbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEV4YW1wbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkZWxpbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kTGlicmFyeSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Y29tZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaGFzZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2VzcygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXBvcnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJldXNhYmxlQXNzZXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvYWRtYXAoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlcm1EZWZpbml0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sTWVudG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXaGl0ZXBhcGVyKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0RlZmluaXRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtPcmRlcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlKCkpOwkKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRYbWxDbGFzc2VzKCkgewotCQkKLQkJLy8gbG9hZCBFQ2xhc3MgbWFwCi0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDaGVja2xpc3QoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uY2VwdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnN0cmFpbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCkpOwotLy8JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXRlZ29yeVR5cGUoKSk7Ci0vLwkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENhdGVnb3J5VHlwZU9iamVjdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmcoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW4oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0ZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVzdGltYXRpbmdNZXRyaWMoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGFtcGxlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGVsaW5lKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SXRlcmF0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRjb21lKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGhhc2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQbGFubmluZ0RhdGEoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXBvcnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXVzYWJsZUFzc2V0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9hZG1hcCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmcoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFzaygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZW1wbGF0ZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlcm1EZWZpbml0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xNZW50b3IoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXaGl0ZXBhcGVyKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrRGVmaW5pdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtPcmRlcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZSgpKTsJCi0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkTW9kZWxDbGFzc2VzKE1hcCBjbGFzc01hcCwgRUNsYXNzIGNsYXp6KSB7Ci0KLQkJU3RyaW5nIG5hbWUgPSBjbGF6ei5nZXROYW1lKCk7Ci0JCWlmKCBjbGFzc01hcC5jb250YWluc0tleShuYW1lKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJY2xhc3NNYXAucHV0KG5hbWUsIGNsYXp6KTsKLQkJCQotCQkvL2ZvciAoSXRlcmF0b3IgaXQgPSBjbGF6ei5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJZm9yIChJdGVyYXRvciBlbGVtZW50cyA9IEV4dGVuZGVkTWV0YURhdGEuSU5TVEFOQ0UuZ2V0QWxsRWxlbWVudHMoY2xhenopLml0ZXJhdG9yKCk7IAotCQkJCWVsZW1lbnRzLmhhc05leHQoKTsgKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSllbGVtZW50cy5uZXh0KCk7Ci0JCQlFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA9IGVTdHJ1Y3R1cmFsRmVhdHVyZS5nZXRFVHlwZSgpOwotCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpZUNsYXNzaWZpZXI7CQkJCQotCQkJCS8vIHJlY3Vyc2l2ZWx5IGZpbmQgdGhlIG5lc3RlZHQgZmVhdHVyZXMKLQkJCQlsb2FkTW9kZWxDbGFzc2VzKGNsYXNzTWFwLCBlQ2xhc3MpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNsYXp6Ci0JICogQHBhcmFtIHVtYUZlYXR1cmVOYW1lCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB4bWwgZmVhdHVyZS4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldFhtbEZlYXR1cmUoRUNsYXNzIGNsYXp6LCBTdHJpbmcgdW1hRmVhdHVyZU5hbWUpIHsKLQkJcmV0dXJuIGdldFhtbEZlYXR1cmUoY2xhenosIHVtYUZlYXR1cmVOYW1lLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHVtYUNsYXp6Ci0JICogQHBhcmFtIHhtbEZlYXR1cmVOYW1lCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Um1jRmVhdHVyZShFQ2xhc3MgdW1hQ2xhenosIFN0cmluZyB4bWxGZWF0dXJlTmFtZSkgewotCQlmb3IgKCBJdGVyYXRvciBpdCA9IHVtYUNsYXp6LmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLQkJewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWl0Lm5leHQoKTsKLQkJCVN0cmluZyB1bWFGZWF0dXJlbmFtZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOwotCQkJCi0JCQkvLyBpZiB0aGUgZmVhdHVyZSBuYW1lIGlzIHRoZSBzYW1lLCBnb3QgaXQKLQkJCWlmICggdW1hRmVhdHVyZW5hbWUuZXF1YWxzKHhtbEZlYXR1cmVOYW1lKSApIHsKLQkJCQlyZXR1cm4gZmVhdHVyZTsKLQkJCX0KLQkJCQotCQkJLy8gY2hlY2sgaWYgdGhlIGZlYXR1cmUgbmFtZSBpcyBtYXBwZWQgdG8gYW5vdGhlciB4bWwgZmVhdHVyZSBuYW1lCi0JCQlTdHJpbmcgZmVhdHVyZU5hbWUgPSAoU3RyaW5nKWZlYXR1cmVOYW1lTWFwLmdldCh1bWFGZWF0dXJlbmFtZSk7Ci0JCQlpZiAoIGZlYXR1cmVOYW1lICE9IG51bGwgKSB7Ci0JCQkJaW50IGkgPSBmZWF0dXJlTmFtZS5pbmRleE9mKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIGkgPiAwICkgewotCQkJCQlpZiAoIGZlYXR1cmVOYW1lLnN1YnN0cmluZygwLGkpLmVxdWFscyh4bWxGZWF0dXJlTmFtZSkgfHwgCi0JCQkJCQkgZmVhdHVyZU5hbWUuc3Vic3RyaW5nKGkrMSkuZXF1YWxzKHhtbEZlYXR1cmVOYW1lKQkpIHsKLQkJCQkJCXJldHVybiBmZWF0dXJlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCBmZWF0dXJlTmFtZS5lcXVhbHMoeG1sRmVhdHVyZU5hbWUpICkgewotCQkJCQkJcmV0dXJuIGZlYXR1cmU7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0KLQkJLy9TeXN0ZW0ub3V0LnByaW50KCJGZWF0dXJlTWFuYWdlcjogVW5hYmxlIHRvIGZpbmQgdW1hIGZlYXR1cmUgZm9yIHhtbCBmZWF0dXJlIiArIHhtbEZlYXR1cmVOYW1lKTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gY2xhenoKLQkgKiBAcGFyYW0gdW1hRmVhdHVyZU5hbWUKLQkgKiBAcGFyYW0gb2JqZWN0VHlwZQotCSAqIEByZXR1cm4gdGhlIGNvcnJzcG9uZGluZyB4bWwgZmVhdHVyZS4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldFhtbEZlYXR1cmUoRUNsYXNzIGNsYXp6LCBTdHJpbmcgdW1hRmVhdHVyZU5hbWUsIFN0cmluZyBvYmplY3RUeXBlKSB7Ci0KLQkJU3RyaW5nIGZlYXR1cmVOYW1lID0gdW1hRmVhdHVyZU5hbWU7Ci0JCWlmICggZmVhdHVyZU5hbWVNYXAuY29udGFpbnNLZXkoZmVhdHVyZU5hbWUpICkgewotCQkJZmVhdHVyZU5hbWUgPSAoU3RyaW5nKWZlYXR1cmVOYW1lTWFwLmdldChmZWF0dXJlTmFtZSk7Ci0JCQkKLQkJCS8vIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCB1bmlxdWUsIHVzZSB0aGUgZmlyc3Qgb25lCi0JCQlpbnQgaSA9IGZlYXR1cmVOYW1lLmluZGV4T2YoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCBpID4gMCApIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmVOYW1lLnN1YnN0cmluZygwLCBpKTsKLQkJCQlpZiAoIG9iamVjdFR5cGUgIT0gbnVsbCApIHsJCQkJCi0JCQkJCS8vIHBpY2sgdGhlIGZlYXR1cmUgYmFzZWQgb24gb2JqZWN0IHR5cGUKLQkJCQkJaWYgKCAhbmFtZS5lcXVhbHNJZ25vcmVDYXNlKG9iamVjdFR5cGUpICkgewotCQkJCQkJbmFtZSA9IGZlYXR1cmVOYW1lLnN1YnN0cmluZyhpKzEpOwotCQkJCQl9Ci0JCQkJCWlmICggIW5hbWUuZXF1YWxzSWdub3JlQ2FzZShvYmplY3RUeXBlKSApIHsKLQkJCQkJCW5hbWUgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWZlYXR1cmVOYW1lID0gbmFtZTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCBmZWF0dXJlTmFtZSA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gY2xhenouZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmVOYW1lKTsKLQkJaWYgKCAoZmVhdHVyZT09bnVsbCkgJiYgKGNsYXp6LmdldE5hbWUoKS5lcXVhbHMoIkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiKSkgJiYgZmVhdHVyZU5hbWUuZXF1YWxzKCJjb250ZW50RWxlbWVudCIpICkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZlYXR1cmUgPSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpOwotCQl9Ci0KLS8vCQlpZiAoIGZlYXR1cmUgPT0gbnVsbCApIHsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJObyB4bWwgZmVhdHVyZSAiICsgZmVhdHVyZU5hbWUgKyAiIGZvciBjbGFzcyAiICsgY2xhenouZ2V0TmFtZSgpKTsKLS8vCQl9Ci0JCQotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHVtYUVDbGFzc05hbWUKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHhtbCBlY2xhc3MKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVDbGFzcyhTdHJpbmcgdW1hRUNsYXNzTmFtZSkgewotLy8JCUVDbGFzcyByb290Q2xhc3MgPSBFeHRlbmRlZE1ldGFEYXRhLklOU1RBTkNFLmdldERvY3VtZW50Um9vdChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0vLwkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3Mpcm9vdENsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSh1bWFFQ2xhc3NOYW1lKTsKLS8vCQlyZXR1cm4gZUNsYXNzOwotCQkKLQkJRUNsYXNzIGNscyA9IChFQ2xhc3MpeG1sRUNsYXNzTWFwLmdldCh1bWFFQ2xhc3NOYW1lKTsKLS8vCQlpZiAoIGNscyA9PSBudWxsICkgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHhtbCBFQ2xhc3MgZm9yIHVtYSBjbGFzcyAiICsgdW1hRUNsYXNzTmFtZSk7Ci0vLwkJfQotCQkKLQkJcmV0dXJuIGNsczsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHhtbEVDbGFzc05hbWUKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEVDbGFzcyBvYmplY3QuCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSbWNFQ2xhc3MoU3RyaW5nIHhtbEVDbGFzc05hbWUpIHsKLQkJRUNsYXNzIGNscyA9IChFQ2xhc3MpdW1hRUNsYXNzTWFwLmdldCh4bWxFQ2xhc3NOYW1lKTsKLS8vCQlpZiAoIGNscyA9PSBudWxsICkgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHVtYSBFQ2xhc3MgZm9yIHhtbCBjbGFzcyAiICsgeG1sRUNsYXNzTmFtZSk7Ci0vLwkJfQotCQkKLQkJcmV0dXJuIGNsczsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGZlYXR1cmVuYW1lCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBmZWF0dXJlIGlzIHVubmVlZGVkIGdpdmVuIGJ5IGZlYXR1cmVuYW1lLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVW5uZWVkZWRSbWNGZWF0dXJlKFN0cmluZyBmZWF0dXJlbmFtZSkgewotCQlyZXR1cm4gdW5uZWVkZWRSbWNGZWF0dXJlcy5jb250YWlucyhmZWF0dXJlbmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBmZWF0dXJlbmFtZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgeG1sIGZlYXR1cmUgaXMgdW5uZWVkZWQgZ2l2ZW4gYnkgZmVhdHVyZW5hbWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVbm5lZWRlZFhtbEZlYXR1cmUoU3RyaW5nIGZlYXR1cmVuYW1lKSB7Ci0JCXJldHVybiB1bm5lZWRlZFhtbEZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmVuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJpbnRzIHRoZSBmZWF0dXJlLW5hbWUgbWFwLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50RmVhdHVyZU5hbWVNYXBwaW5nKCkgewotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNoZWNrbGlzdCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDaGVja2xpc3QoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21wb3NpdGVSb2xlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBvc2l0ZVJvbGUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25jZXB0KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbmNlcHQoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJhYmxlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJhYmxlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEb21haW4oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG9tYWluKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV4YW1wbGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXhhbXBsZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlbGluZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkZWxpbmUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJdGVyYXRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kTGlicmFyeSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RMaWJyYXJ5KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFBsdWdpbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1pbGVzdG9uZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNaWxlc3RvbmUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPdXRjb21lKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU91dGNvbWUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBsYW5uaW5nRGF0YSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQbGFubmluZ0RhdGEoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVwb3J0KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlcG9ydCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJldXNhYmxlQXNzZXQoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmV1c2FibGVBc3NldCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvYWRtYXAoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9hZG1hcCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVTZXQoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVTZXRHcm91cGluZygpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlU2V0R3JvdXBpbmcoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3Rpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFzaygpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVhbVByb2ZpbGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVhbVByb2ZpbGUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZW1wbGF0ZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZW1wbGF0ZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlcm1EZWZpbml0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlcm1EZWZpbml0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbE1lbnRvcigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sTWVudG9yKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2hpdGVwYXBlcigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXaGl0ZXBhcGVyKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya09yZGVyKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCkpOwotLy8JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKCkpOwotLy8JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKCkpOwotCi0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIHByaW50RmVhdHVyZShFT2JqZWN0IG9iajEsIEVPYmplY3Qgb2JqMikgewotCQlMaXN0IG1hdGNoZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdW5tYXRjaGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHVtYUZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQotCQlFTGlzdCBmZWF0dXJlcyA9IG9iajEuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpaXQubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSBmZWF0dXJlLmdldE5hbWUoKTsKLQkJCWlmICggZmVhdHVyZU5hbWVNYXAuY29udGFpbnNLZXkobmFtZSkgKSB7Ci0JCQkJU3RyaW5nIHhtbF9uYW1lID0gKFN0cmluZykgZmVhdHVyZU5hbWVNYXAuZ2V0KG5hbWUpOwotCQkJCWludCBpbmR4ID0geG1sX25hbWUuaW5kZXhPZigiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCBpbmR4ID4gMCApIHsKLQkJCQkJbWF0Y2hlZC5hZGQoeG1sX25hbWUuc3Vic3RyaW5nKDAsIGluZHgpKTsKLQkJCQkJbWF0Y2hlZC5hZGQoeG1sX25hbWUuc3Vic3RyaW5nKGluZHgrMSkudHJpbSgpKTsJCQkJCQotCQkJCX0KLQkJCQllbHNlIGlmICggIW1hdGNoZWQuY29udGFpbnMoeG1sX25hbWUpICkgewotCQkJCQltYXRjaGVkLmFkZCh4bWxfbmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoIXVubmVlZGVkUm1jRmVhdHVyZXMuY29udGFpbnMobmFtZSkgJiYgIXVtYUZlYXR1cmVzLmNvbnRhaW5zKG5hbWUpICkgewotCQkJCXVtYUZlYXR1cmVzLmFkZChuYW1lKTsKLQkJCX0KLQkJfQkJCQotCQkKLQkJZmVhdHVyZXMgPSBvYmoyLmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWl0Lm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gZmVhdHVyZS5nZXROYW1lKCk7Ci0JCQlpZiAoIHVtYUZlYXR1cmVzLmNvbnRhaW5zKG5hbWUpICkgewotCQkJCXVtYUZlYXR1cmVzLnJlbW92ZShuYW1lKTsKLQkJCX0gZWxzZSBpZiAoIXVubmVlZGVkWG1sRmVhdHVyZXMuY29udGFpbnMobmFtZSkgJiYgIW1hdGNoZWQuY29udGFpbnMobmFtZSkgJiYgIXVubWF0Y2hlZC5jb250YWlucyhuYW1lKSApIHsKLQkJCQl1bm1hdGNoZWQuYWRkKG5hbWUpOwotCQkJfQotCQl9CQotCQkKLQkJaWYgKCB1bWFGZWF0dXJlcy5zaXplKCkgKyB1bm1hdGNoZWQuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT0gdW4tbWF0Y2hlZCBmZWF0dXJlcyBmb3IgIiArIG9iajEuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIiA9PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gdW1hRmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZylpdC5uZXh0KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0ZmVhdHVyZU5hbWVNYXAucHV0KFwiIiArIG5hbWUgKyAiXCIsIFwiXCIpOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKG5hbWUpOwotCQl9Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gdW5tYXRjaGVkLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpaXQubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IiArIG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0JCQotCX0KLQkKLS8vCXB1YmxpYyBjbGFzcyBGZWF0dXJlTWFwIHsKLS8vCQlwcml2YXRlIE1hcCBmZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLS8vCQkKLS8vCQlGZWF0dXJlTWFwKEVDbGFzcyBjbGF6eikgewotLy8JCQlFTGlzdCBmZWF0dXJlcyA9IGNsYXp6LmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLS8vCQkJZm9yICggSXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWl0Lm5leHQoKTsKLS8vCQkJCWZlYXR1cmVNYXAucHV0KGZlYXR1cmUuZ2V0TmFtZSgpLCBmZWF0dXJlKTsKLS8vCQkJfQkJCQotLy8JCX0KLS8vCQkKLS8vCQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0vLwkJCXJldHVybiAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlTWFwLmdldChmZWF0dXJlTmFtZSk7CQkJCi0vLwkJfQotLy8JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvWE1MTGlicmFyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvWE1MTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzBhOTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL1hNTExpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5Db250ZW50UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5JTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWwuVW1hUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGNvbW1vbmouc2RvLlR5cGU7Ci0KLS8qKgotICogWG1sTGlicmFyeSByZXByZXNlbnRzIGEgbWV0aG9kIGxpYnJhcnkgbG9hZGVkIGZyb20gYSBzcGVjaWZpZWQgeG1sIGZpbGUgVGhlCi0gKiB4bWwgZmlsZSBzaG91bGQgYmUgdmFsaWQgdG8gdGhlIHhtbCBzY2hlbWEgZm9yIE1ldGhvZExpYnJhcnkKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIxNTMKLSAqLwotcHVibGljIGNsYXNzIFhNTExpYnJhcnkgewotCi0JcHJpdmF0ZSBTdHJpbmcgZmlsZVBhdGg7Ci0KLQlwcml2YXRlIElMb2dnZXIgbG9nZ2VyOwotCi0JcHJpdmF0ZSBDb250ZW50UHJvY2Vzc29yIGNvbnRlbnRQcm9jID0gbnVsbDsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSByb290T2JqZWN0OwotCi0JLy8gbWFwIG9mIGNvbnRlbnQgY2F0ZWdvcnkgcGFja2FnZSBmb3IgZWFjaCBwbHVnaW4gaWQKLQlwcml2YXRlIE1hcCBjb250ZW50Q2F0ZWdvcnlQa2dNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gbWFwIG9mIGNyZWF0ZWQgZWxlbWVudHMsIGd1aWQgLSBFRGF0YU9iamVjdAotCXByaXZhdGUgTWFwIGVsZW1lbnRzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFhNTExpYnJhcnkoQ29udGVudFByb2Nlc3NvciBjb250ZW50UHJvYywgSUxvZ2dlciBsb2dnZXIsCi0JCQlTdHJpbmcgZmlsZVBhdGgpIHsKLQkJdGhpcy5jb250ZW50UHJvYyA9IGNvbnRlbnRQcm9jOwotCQl0aGlzLmxvZ2dlciA9IGxvZ2dlcjsKLQkJdGhpcy5maWxlUGF0aCA9IGZpbGVQYXRoOwotCi0JfQotCi0JLyoqCi0JICogQHJldHVybiByb290IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIHRoaXMucm9vdE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGZpbGUgcGF0aCBzdHJpbmcuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aCgpIHsKLQkJcmV0dXJuIHRoaXMuZmlsZVBhdGg7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGFuIGFycmF5IG9mIHBsdWdpbiBpZHMgaW4gdGhlIGxpYnJhcnkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFBsdWdpbklkcygpIHsKLQkJTGlzdCBwbHVnaW5zID0gcm9vdE9iamVjdC5nZXRNZXRob2RQbHVnaW4oKTsKLQkJU3RyaW5nW10gaWRzID0gbmV3IFN0cmluZ1twbHVnaW5zLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJaWRzW2ldID0gKChNZXRob2RQbHVnaW4pIHBsdWdpbnMuZ2V0KGkpKS5nZXRJZCgpOwotCQl9Ci0KLQkJcmV0dXJuIGlkczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gYSBuZXcgWE1MIGxpYnJhcnkuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGNyZWF0ZUxpYnJhcnkoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotCi0JCU1ldGhvZExpYnJhcnkgcm9vdCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZExpYnJhcnkoKTsKLQkJU3RyaW5nIHZlcnNpb24gPSAiIjsJCQkJCQkJCS8vJE5PTi1OTFMtMSQJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IFZlcnNpb25VdGlsLmdldEFsbFRvb2xJRHMoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHRvb2xJRCA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgdG9vbFZlcnNpb24gPSBWZXJzaW9uVXRpbC5nZXRWZXJzaW9ucyh0b29sSUQpLmdldE1pblRvb2xWZXJzaW9uRm9yQ3VycmVudFhNTFNjaGVtYVZlcnNpb24oKS5nZXRUb29sVmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JCQlpZiAodmVyc2lvbi5sZW5ndGgoKSA+IDApIHsKLQkJCQl2ZXJzaW9uICs9IFZlcnNpb25VdGlsLlhNTF9WRVJTSU9OU19TRVBBUkFUT1I7Ci0JCQl9Ci0JCQl2ZXJzaW9uICs9IHRvb2xJRCArIFZlcnNpb25VdGlsLlhNTF9UT09MX1ZFUlNJT05fU0VQQVJBVE9SICsgdG9vbFZlcnNpb247CQkKLQkJfQotCQlpZiAodmVyc2lvbi5sZW5ndGgoKSA+IDApIHsKLQkJCXJvb3Quc2V0VG9vbCh2ZXJzaW9uKTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlKGlkLCBuYW1lLCByb290KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgeG1sIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgbG9hZCgpIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCi0JCQkvLyBHZXQgdGhlIFVSSSBvZiB0aGUgbW9kZWwgZmlsZS4KLQkJCS8vCi0JCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKChuZXcgRmlsZSh0aGlzLmZpbGVQYXRoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0JCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBmb3IgdGhpcyBmaWxlLgotCQkJLy8KLQkJCS8vIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoZmlsZVVSSSk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBVbWFSZXNvdXJjZUZhY3RvcnlJbXBsKCkKLQkJCQkJLmNyZWF0ZVJlc291cmNlKGZpbGVVUkkpOwotCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQotCQkJcmVzb3VyY2UubG9hZChuZXcgSGFzaE1hcCgpKTsKLQotCQkJLy8gUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShmaWxlVVJJLCBmYWxzZSk7Ci0KLQkJCS8vIEVDbGFzcyBlQ2xhc3MgPQotCQkJLy8gRXh0ZW5kZWRNZXRhRGF0YS5JTlNUQU5DRS5nZXREb2N1bWVudFJvb3QodW1hUGFja2FnZSk7Ci0KLQkJCURvY3VtZW50Um9vdCByb290ID0gKERvY3VtZW50Um9vdCkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJvb3QuZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgbyA9IGl0ci5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJCXRoaXMucm9vdE9iamVjdCA9IChNZXRob2RMaWJyYXJ5KSBvOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgbG9hZGVkIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZCgKLQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfZXJyb3JfbG9hZF94bWwsIGZpbGVQYXRoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgdGhlIGxpYnJhcnkgYW5kIHJldHVybiB0aGUgcm9vdCBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGNyZWF0ZShTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBNZXRob2RFbGVtZW50IHJvb3QpIHsKLQotCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQKLQkJLy8KLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0KLQkJLy8gR2V0IHRoZSBVUkkgb2YgdGhlIG1vZGVsIGZpbGUuCi0JCS8vCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMuZmlsZVBhdGgpOwotCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0JCS8vIENyZWF0ZSBhIHJlc291cmNlIGZvciB0aGlzIGZpbGUuCi0JCS8vCi0JCS8vIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoZmlsZVVSSSk7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbmV3IFVtYVJlc291cmNlRmFjdG9yeUltcGwoKQotCQkJCS5jcmVhdGVSZXNvdXJjZShmaWxlVVJJKTsKLQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQotCQkvLyBBZGQgdGhlIGluaXRpYWwgbW9kZWwgb2JqZWN0IHRvIHRoZSBjb250ZW50cy4KLQkJLy8gcm9vdC5zZXRJZChpZCk7Ci0JCS8vIHJvb3Quc2V0TmFtZShuYW1lKTsKLQotCQlzZXRFbGVtZW50KGlkLCByb290KTsKLQotCQkvLyB0aGlzLnJvb3RPYmplY3QgPSByb290OwotCQlpZiAocm9vdCAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChyb290KTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJaWYgKHJvb3QgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQl0aGlzLnJvb3RPYmplY3QgPSAoTWV0aG9kTGlicmFyeSkgcm9vdDsKLQkJfQotCi0JCXJldHVybiB0aGlzLnJvb3RPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBsdWdpbklkCi0JICogQHJldHVybiBhIGNvbnRlbnQgY2F0ZXJnb3J5IHBhY2thZ2UgaW4gdGhlIHBsdWdpbiBnaXZlbiBieSBwbHVnaW5JZC4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZShTdHJpbmcgcGx1Z2luSWQpIHsKLQotCQlDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIHBrZyA9IChDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKSBjb250ZW50Q2F0ZWdvcnlQa2dNYXAKLQkJCQkuZ2V0KHBsdWdpbklkKTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGtnOwotCQl9Ci0KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGdldEVsZW1lbnQocGx1Z2luSWQpOwotCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X25vX3BsdWdpbiwKLQkJCQkJcGx1Z2luSWQpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudENhdGVnb3J5UGFja2FnZSgpOwotCQlwa2cuc2V0TmFtZSgiQ29udGVudENhdGVnb3JpZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXNldEVsZW1lbnQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpLCBwa2cpOwotCi0JCXBsdWdpbi5nZXRNZXRob2RQYWNrYWdlKCkuYWRkKHBrZyk7Ci0KLQkJY29udGVudENhdGVnb3J5UGtnTWFwLnB1dChwbHVnaW5JZCwgcGtnKTsKLQkJcmV0dXJuIHBrZzsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgeG1sIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgcmVzb3VyY2UgdG8gdGhlIGZpbGUgc3lzdGVtLgotCQkvLwotCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290T2JqZWN0LmVSZXNvdXJjZSgpOwotCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHJvb3Qgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBvcGVuKCkgewotCQlyZXR1cm4gcm9vdE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZ3VpZAotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYmFzZSBsaWJyYXJ5IGVsZW1lbnQuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGdldEVsZW1lbnQoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIChFRGF0YU9iamVjdCkgZWxlbWVudHNNYXAuZ2V0KGd1aWQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGJhc2UgbGlicmFyeSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBnZXRFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRFbGVtZW50KCgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXRJZCgpKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCQotCS8qKgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuIGVsbWVuZW50IGlkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRJZChFRGF0YU9iamVjdCBvYmopIHsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXRJZCgpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJcmV0dXJuICgoV29ya09yZGVyKSBvYmopLmdldElkKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RWxlbWVudChTdHJpbmcgZ3VpZCwgRURhdGFPYmplY3Qgb2JqKSB7Ci0JCS8vIGFkZEVsZW1lbnRUb0NvbnRhaW5lcihjb250YWluZXIsIG9iaik7Ci0JCWlmICghZWxlbWVudHNNYXAuY29udGFpbnNLZXkoZ3VpZCkpIHsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnQpIG9iaikuc2V0SWQoZ3VpZCk7Ci0JCQl9Ci0KLQkJCWVsZW1lbnRzTWFwLnB1dChndWlkLCBvYmopOwotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSB2b2lkIGFkZEVsZW1lbnRUb0NvbnRhaW5lcihFRGF0YU9iamVjdCBjb250YWluZXIsIEVEYXRhT2JqZWN0Ci0JLy8gY2hpbGQpIHsKLQkvLwkJCi0JLy8gdHJ5IHsKLQkvLyBpZiAoIGNvbnRhaW5lciA9PSBudWxsICkgewotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8JCQkKLQkvLyBpZiAoIGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSB8fCBjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fAotCS8vIGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSApIHsKLQkvLyByZXR1cm47Ci0JLy8gfQotCS8vCQkJCi0JLy8gd2hpbGUgKCAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpICYmIChjb250YWluZXIgIT0gbnVsbCkgKSB7Ci0JLy8gY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsKLQkvLyB9Ci0JLy8JCQkKLQkvLyBpZiAoIGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlICkgewotCS8vICgoQ29udGVudFBhY2thZ2UpY29udGFpbmVyKS5nZXRDb250ZW50RWxlbWVudCgpLmFkZChjaGlsZCk7Ci0JLy8gfSBlbHNlIGlmICggY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UgKSB7Ci0JLy8gKChQcm9jZXNzUGFja2FnZSljb250YWluZXIpLmdldFByb2Nlc3NFbGVtZW50KCkuYWRkKGNoaWxkKTsKLQkvLyB9IGVsc2UgewotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRG9uJ3Qga25vdyBob3cgdG8gc2V0IGVsZW1lbnQgIiArIGNoaWxkKTsKLQkvLyB9Ci0JLy8gfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JLy8gLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JLy8gfQotCS8vIH0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIGNoaWxkIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGd1aWQKLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICogICAgICAgICAgICBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQgdG8gYmUgY3JlYXRlZAotCSAqIEBwYXJhbSB1bWFGZWF0dXJlTmFtZQotCSAqICAgICAgICAgICAgdW1hIGZlYXR1cmUgZm9yIHRoZSBlbGVtZW50IHRvIGJlIGNyZWF0ZWQKLQkgKiBAcGFyYW0gdW1hRUNsYXNzTmFtZQotCSAqICAgICAgICAgICAgdW1hIEVDbGFzcyBuYW1lIGZvciB0aGUgZmVhdHVyZQotCSAqIEBwYXJhbSB1bWFFbGVtZW50VHlwZQotCSAqICAgICAgICAgICAgdW1hIGVsZW1lbnQgdHlwZSBmb3IgdGhlIGVsZW1lbnQgdG8gYmUgY3JlYXRlZAotCSAqIEBwYXJhbSBndWlkCi0JICogICAgICAgICAgICBndWlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIGNyZWF0ZWQKLQkgKiBAcmV0dXJuIEVEYXRhT2JqZWN0IHRoZSBYbWwgdW1hIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgY3JlYXRlRWxlbWVudChFRGF0YU9iamVjdCBjb250YWluZXIsCi0JCQlTdHJpbmcgdW1hRmVhdHVyZU5hbWUsIFN0cmluZyB1bWFFQ2xhc3NOYW1lLCBTdHJpbmcgdW1hRWxlbWVudFR5cGUsCi0JCQlTdHJpbmcgZ3VpZCkgewotCi0JCUVEYXRhT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoZ3VpZCk7Ci0JCWlmIChvYmogPT0gbnVsbCkgewotCQkJaWYgKEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmlzVW5uZWVkZWRSbWNGZWF0dXJlKHVtYUZlYXR1cmVOYW1lKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRYbWxGZWF0dXJlKAotCQkJCQljb250YWluZXIuZUNsYXNzKCksIHVtYUZlYXR1cmVOYW1lLCB1bWFFbGVtZW50VHlwZSk7Ci0JCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoCi0JCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9ub19mZWF0dXJlLCBjb250YWluZXIKLQkJCQkJCQkJLmVDbGFzcygpLmdldE5hbWUoKSwgdW1hRmVhdHVyZU5hbWUpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gaWYgKCAhKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSApIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgY3JlYXRpbmcgZWxlbWVudDogY29udGFpbm1lbnQgZmVhdHVyZQotCQkJLy8gc2hvdWxkIGJlIEVSZWZlcmVuY2UgdHlwZS4gIiArIGZlYXR1cmUuZ2V0TmFtZSgpKTsKLQkJCS8vIC8vcmV0dXJuIG51bGw7Ci0JCQkvLyB9Ci0KLQkJCS8vIC8vIHRoaXMgaXMgYW4gZWFzaWVyIHdheSwgdGVzdCBpdCwKLQkJCS8vIC8vIGRvZXMgbm90IHdvcmsgc2luY2UgZmVhdHVyZS5nZXRFVHlwZSgpIHJldHVybnMgdGhlIGJhc2UKLQkJCS8vIGVsZW1lbnQgdHlwZSwgbm90IHRoZSBleHRlbmRlZCBvbmUKLQkJCS8vIC8vIGZvciBleGFtcGxlLCBpdCByZXR1cm5zIE1ldGhvZFBhY2thZ2UgaW5zdGVhZCBvZgotCQkJLy8gUHJvY2Vzc1BhY2thZ2Ugb3IgQ29udGVudFBhY2thZ2UKLQkJCS8vIC8vIHNvIHdlIG5lZWQgdG8gbWFrZSBvdXIgb3duIG1hcAotCQkJLy8gRUNsYXNzaWZpZXIgYyA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJCS8vIGlmICggIWMuZ2V0TmFtZSgpLmVxdWFscyh1bWFFQ2xhc3NOYW1lKSApIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRUNsYXNzIG5hbWUgbm90IG1hdGNoOiAiICsgYy5nZXROYW1lKCkgKyAiCi0JCQkvLyAtLS0gIiArIHVtYUVDbGFzc05hbWUpOwotCQkJLy8gfQotCi0JCQlFQ2xhc3Mgb2JqQ2xhc3MgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRQotCQkJCQkuZ2V0WG1sRUNsYXNzKHVtYUVDbGFzc05hbWUpOwotCQkJaWYgKG9iakNsYXNzID09IG51bGwpIHsKLQkJCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZCgKLQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X25vX2NsYXNzLCB1bWFFQ2xhc3NOYW1lKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCW9iaiA9IChFRGF0YU9iamVjdCkgRWNvcmVVdGlsLmNyZWF0ZShvYmpDbGFzcyk7Ci0JCQlzZXRFbGVtZW50KGd1aWQsIG9iaik7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkvLyBXb3JrT3JkZXIgaXMgbm90IGNvbnRhaW5lZCBpbiBhIHByb2Nlc3NQYWNrYWdlIGluIHhtbCBtb2RlbAotCQkJCS8vIGl0J3MgY29udGFpbmVkIGJ5IHRoZSBicmVha2Rvd25FbGVtZW50Ci0JCQkJLy8gc28gd2Ugc2F2ZSB0aGUgZWxlbWVudCBpZC1vYmplY3QgdG8gdGhlIG1hcCBhbmQgY29udGludWUKLQkJCQkvLyBkb24ndCBzZXQgdGhlIGZlYXR1cmUgdmFsdWUKLQkJCQkKLQkJCQkvLyB0aGUgd29ya09yZGVyIGluIEVQRiBVTUEgbW9kZWwgaXMgcmVmZXJlbmNlZCBieSBmZWF0dXJlCi0JCQkJLy8gV29ya0JyZWFrRG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IsCi0JCQkJLy8gdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZSBpbiB0aGUgeG1sIG1vZGVsIGlzIAotCQkJCS8vIFdvcmtCcmVha0Rvd25FbGVtZW50X1ByZWRlY2Vzc29yLCAKLQkJCQkvLyB0aGUgZmVhdHVyZSB2YWx1ZSBpcyBhIGxpc3Qgb2YgZ3VpZCBvZiB0aGUgV29ya09yZGVycwotCQkJCS8vIHdoZW4gdGhpcyBmZWF0dXJlIHZhbHVlIGlzIHNldCBpbiB0aGUgc2V0UmVmZXJlbmNlVmFsdWUoKSBjYWxsCi0JCQkJLy8gZ2V0IHRoZSBYbWxVbWEgb2JqZWN0LCBpZiBpdCdzIFdvcmtPcmRlciwgCi0JCQkJLy8gYWRkIHRvIHRoZSBjdXJyZW50IHdvcmtvcmRlciB0byB0aGUgV29ya0JyZWFrRG93bkVsZW1lbnQKLQkJCQkvLyBKaW5odWEgWGksIDA4LzI0LzIwMDYKLQkJCQlyZXR1cm4gb2JqOwotCQkJfQotCi0JCQkvLyBub3RlOiBhbGwgZWxlbWVudCByZWZlcmVuY2VzIGFyZSBzdHJpbmcgdHlwZSAoaWQpCi0JCQkvLyBwYWNrYWdlIHJlZmVyZW5jZXMgYXJlIG9iamVjdCByZWZlcmVuY2VzCi0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIGNvbnRhaW5lci5lR2V0KGZlYXR1cmUpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgewotCQkJCQkJdmFsdWVzLmFkZChndWlkKTsKLQotCQkJCQkJLy8gbmVlZCB0byBwdXQgdGhlIG9iamVjdCBpbiBhIGNvbnRhaW5lcgotCQkJCQkJLy8gZm9yIGV4YW1wbGUsIHRoZSBDb250YWllZEFydGlmYWN0cwotCQkJCQkJYWRkVG9Db250YWluZXIoY29udGFpbmVyLCBvYmopOwotCi0JCQkJCX0gZWxzZSBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWVzLmFkZChvYmopOwotCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsb2dnZXIKLQkJCQkJCQkJLmxvZ1dhcm5pbmcoTkxTCi0JCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudCwKLQkJCQkJCQkJCQkJCWZlYXR1cmUuZ2V0TmFtZSgpKSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKAotCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZSwgb2JqLAotCQkJCQkJCWNvbnRhaW5lciksIGUpOwotCQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQkJCWNvbnRhaW5lci5lU2V0KGZlYXR1cmUsIGd1aWQpOwotCQkJCQlhZGRUb0NvbnRhaW5lcihjb250YWluZXIsIG9iaik7Ci0JCQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCQljb250YWluZXIuZVNldChmZWF0dXJlLCBvYmopOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKAotCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50LAotCQkJCQkJCWZlYXR1cmUuZ2V0TmFtZSgpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9Db250YWluZXIoRU9iamVjdCBjb250YWluZXIsIEVPYmplY3Qgb2JqKSB7Ci0KLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkoKENvbnRlbnRQYWNrYWdlKSBjb250YWluZXIpLmdldENvbnRlbnRFbGVtZW50KCkuYWRkKG9iaik7Ci0JCX0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCSgoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lcikuZ2V0UHJvY2Vzc0VsZW1lbnQoKS5hZGQob2JqKTsKLQkJCS8vIH0gZWxzZSBpZiAoIChvYmogaW5zdGFuY2VvZiBDb25zdHJhaW50KSAmJiAoY29udGFpbmVyIGluc3RhbmNlb2YKLQkJCS8vIE1ldGhvZEVsZW1lbnQpICkgewotCQkJLy8gLy8gdGhlIG93bmVyIHJ1bGUgc2hvdWxkIGJlIGEgY29udGFpbm1lbnQgMC4ubiBmZWF0dXJlLCB3YWl0aW5nCi0JCQkvLyBmb3IgbW9kZWwgZml4Ci0JCQkvLyAvLygoTWV0aG9kRWxlbWVudCljb250YWluZXIpLnNldE8KLQkJfSBlbHNlIHsKLQkJCWFkZFRvQ29udGFpbmVyKGNvbnRhaW5lci5lQ29udGFpbmVyKCksIG9iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlLgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0cmlidXRlRmVhdHVyZVZhbHVlKEVEYXRhT2JqZWN0IG9iaiwgU3RyaW5nIGZlYXR1cmVOYW1lLAotCQkJT2JqZWN0IHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG9iaiA9PSBudWxsIHx8IGZlYXR1cmVOYW1lID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCB8fCB2YWx1ZSBpbnN0YW5jZW9mIEVEYXRhT2JqZWN0KSB7Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZCgKLQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlLAotCQkJCQlmZWF0dXJlTmFtZSwgdmFsdWUpKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZmluZCB0aGUgZmVhdHVyZSBhbmQgc2V0IHRoZSB2YWx1ZQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFhtbEZlYXR1cmUob2JqCi0JCQkJLmVDbGFzcygpLCBmZWF0dXJlTmFtZSk7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQotCQkJLy8gaWdub3JlIG1pc3NpbmcgZmVhdHVyZXMgZm9yIFdvcmtPcmRlcgotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgV29ya09yZGVyKSkgewotCQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZmVhdHVyZU5hbWUsIG9iaiwgdmFsdWUgfTsKLQkJCQlsb2dnZXIKLQkJCQkJCS5sb2dXYXJuaW5nKE5MUwotCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMiwKLQkJCQkJCQkJCQlwYXJhcykpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gMTU4Njg4IC0gTWlzc2luZyB0ZW1wbGF0ZSBmaWxlcyBpbiBleHBvcnRlZCB4bWwgbGlicmFyeQotCQkvLyBwcm9jZXNzIHRoZSBhdHRhY2htZW50IHVybAotCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50KCkgKSB7Ci0JCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7Ci0JCQkJdmFsdWUgPSBjb250ZW50UHJvYy5yZXNvbHZlQXR0YWNobWVudFJlc291cmNlcyhvYmosIHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpKTsKLQkJCX0KLQkJCW9iai5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJfQotCQkKLQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQl0cnkgewotCQkJCWlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoInZhcmlhYmlsaXR5VHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSBWYXJpYWJpbGl0eVR5cGUuZ2V0KHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJsaW5rVHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSBXb3JrT3JkZXJUeXBlLmdldCh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgamF2YS51dGlsLkRhdGUpIHsKLQkJCQkJLy8gY29udmVydCBqYXZhLnV0aWwuRGF0ZSB0byB4bWwgRGF0ZQotCQkJCQl2YWx1ZSA9IGdldFhtbERhdGUoKGphdmEudXRpbC5EYXRlKSB2YWx1ZSk7Ci0JCQkJfSBlbHNlIGlmICgoY29udGVudFByb2MgIT0gbnVsbCkKLQkJCQkJCSYmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQkJCQkJJiYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCQl2YWx1ZSA9IGNvbnRlbnRQcm9jLnJlc29sdmVSZXNvdXJjZUZpbGVzKAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBvYmosIChTdHJpbmcpIHZhbHVlKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgamF2YS5uZXQuVVJJKSB7Ci0JCQkJCXZhbHVlID0gKChqYXZhLm5ldC5VUkkpIHZhbHVlKS5nZXRQYXRoKCk7Ci0JCQkJCWlmIChjb250ZW50UHJvYyAhPSBudWxsKSB7Ci0JCQkJCQljb250ZW50UHJvYy5jb3B5UmVzb3VyY2UoKFN0cmluZykgdmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW9iai5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZmVhdHVyZU5hbWUsIG9iaiwgdmFsdWUgfTsKLQkJCQlsb2dnZXIKLQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJTkxTCi0JCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMiwKLQkJCQkJCQkJCQkJCXBhcmFzKSwgZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgaWQgcmVmZXJlbmNlcyBmb3IgdGhlIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIEVEYXRhT2JqZWN0IHRoZSBvYmplY3QKLQkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgZmVhdHVyZSBvZiB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIGlkVmFsdWUKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgaWQgcmVmZXJlbmNlIHZhbHVlIG9mIHRoZSBmZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlVHlwZQotCSAqICAgICAgICAgICAgVHlwZSB0aGUgb2JqZWN0IHR5cGUgb2YgdGhlIHJlZmVyZW5jZS4gTmVlZCB0byBoYXZlIHRoaXMgdG8KLQkgKiAgICAgICAgICAgIGRldGVybWluZSB0aGUgeG1sIGZlYXR1cmUgaW4gY2FzZSB0aGUgZmVhdHVyZSBtYXBwdGluZyBpcyBub3QKLQkgKiAgICAgICAgICAgIHVuaXF1ZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlVmFsdWUoRURhdGFPYmplY3Qgb2JqLCBTdHJpbmcgZmVhdHVyZU5hbWUsCi0JCQlTdHJpbmcgaWRWYWx1ZSwgVHlwZSB2YWx1ZVR5cGUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAob2JqID09IG51bGwgfHwgZmVhdHVyZU5hbWUgPT0gbnVsbCB8fCBpZFZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5pc1VubmVlZGVkUm1jRmVhdHVyZShmZWF0dXJlTmFtZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGZpbmQgdGhlIGZlYXR1cmUgYW5kIHNldCB0aGUgdmFsdWUKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRYbWxGZWF0dXJlKG9iagotCQkJCS5lQ2xhc3MoKSwgZmVhdHVyZU5hbWUsIHZhbHVlVHlwZS5nZXROYW1lKCkpOwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGZlYXR1cmVOYW1lLCBvYmosIGlkVmFsdWUgfTsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKAotCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlLCBwYXJhcykpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIHN0ciA9IGZlYXR1cmUuZ2V0RVR5cGUoKS5nZXROYW1lKCk7Ci0JCWlmIChzdHIuZXF1YWxzKCJTdHJpbmciKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3QgbCA9IChMaXN0KSBvYmouZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoIWwuY29udGFpbnMoaWRWYWx1ZSkpIHsKLQkJCQkJbC5hZGQoaWRWYWx1ZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlvYmouZVNldChmZWF0dXJlLCBpZFZhbHVlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnQoKSkgewotCQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgYnJlYWtkb3duIGVsZW1lbnQuIEluIHVtYSwgYnJlYWtkb3duCi0JCQkvLyBlbGVtZW50cyBhcmUgdW5kZXIgcHJvY2VzcyBwYWNrYWdlcwotCQkJLy8gaW4geG1sIG1vZGVsLCB0aGV5IGFyZSBvd25lZCBieSB0aGUgYWN0aXZpdHkKLQkJCUVEYXRhT2JqZWN0IHYgPSBnZXRFbGVtZW50KGlkVmFsdWUpOwotCQkJaWYgKHYgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJRU9iamVjdCBvbGRfY29udGFpbmVyID0gdi5lQ29udGFpbmVyKCk7Ci0JCQkJTGlzdCBsID0gKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpOwotCQkJCWlmICghbC5jb250YWlucyh2KSkgewotCQkJCQlsLmFkZCh2KTsKLQkJCQl9Ci0KLQkJCQkvLyBpZiB0aGUgb2xkIGNvbnRhaW5lciBwYWNrYWdlIGlzIGVtcHR5LCBkZWxldGUgaXQKLQkJCQlpZiAoKG9sZF9jb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkKLQkJCQkJCSYmIChvbGRfY29udGFpbmVyLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKSB7Ci0JCQkJCWlmICgoKFByb2Nlc3NQYWNrYWdlKSBvbGRfY29udGFpbmVyKS5nZXRQcm9jZXNzRWxlbWVudCgpCi0JCQkJCQkJLnNpemUoKSA9PSAwKSB7Ci0JCQkJCQkoKFByb2Nlc3NQYWNrYWdlKSBvbGRfY29udGFpbmVyLmVDb250YWluZXIoKSkKLQkJCQkJCQkJLmdldE1ldGhvZFBhY2thZ2UoKS5yZW1vdmUob2xkX2NvbnRhaW5lcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3IoKSApIHsKLQkJCS8vIHRoZSBvcmtlciBvcmRlciBuZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgV29ya0JyZWFrZG93bkVsZW1lbnQKLQkJCS8vIHNpbmNlIGluIFhtbCBtb2RlbCB0aGUgd29yayBvcmRlciBpcyBjb250YWluZWQgYnkgdGhlIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCQkvLyBKaW5odWEgWGksIDA4LzI0LzIwMDYKLQkJCU9iamVjdCB2ID0gZ2V0RWxlbWVudChpZFZhbHVlKTsKLQkJCWlmICh2IGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQkJKChXb3JrQnJlYWtkb3duRWxlbWVudClvYmopLmdldFByZWRlY2Vzc29yKCkuYWRkKHYpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gbm90IGhhbmRsZWQsIGFkZCB3YXJuaW5nIGxvZwotCQkJLy8gdGhlIGlkIGZlYXR1cmUgdmFsdWUgaXMgbm90IHNldAotCQkJLy8gSkluaHVhIFhpLCBUT0RPCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZHQKLQkgKiBAcmV0dXJuIGEgWG1sIGRhdGUuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRYbWxEYXRlKGphdmEudXRpbC5EYXRlIGR0KSB7Ci0JCVNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgaGg6bW06c3MiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZHRTdHIgPSBzZGYuZm9ybWF0KGR0KTsKLQkJZHRTdHIgPSBkdFN0ci5yZXBsYWNlKCcgJywgJ1QnKTsKLQkJRURhdGFUeXBlIHR5cGUgPSBYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGF0ZVRpbWUoKTsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKHR5cGUsIGR0U3RyKTsKLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0cmluZyhPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBzdHIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQlzdHIgPSBtZS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgbWUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAob2JqICE9IG51bGwpIHsKLQkJCXN0ciA9IG9iai50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKioKLQkgKiBmaXggdGhlIGxpYnJhcnkgc28gdGhhdCBpdCBtZWV0cyB0aGUgdW1hIGxpYnJhcnkgc3RhbmRhcmRzCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZml4TGlicmFyeUZvckltcG9ydCgpIHsKLQotCQlmaXhHdWlkKChNZXRob2RFbGVtZW50KSByb290T2JqZWN0KTsKLQotCQlpZiAocm9vdE9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSAoKE1ldGhvZExpYnJhcnkpIHJvb3RPYmplY3QpLmdldE1ldGhvZFBsdWdpbigpCi0JCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJZml4UGx1Z2luKChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocm9vdE9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJZml4UGx1Z2luKChNZXRob2RQbHVnaW4pIHJvb3RPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZml4IHRoZSBsaWJyYXJ5IHNvIHRoYXQgaXQgbWVldHMgdGhlIHhtbCBzY2hlbWEgc3RhbmRhcmRzCi0JICogYWxzbyByZW1vdmUgcG9zc2libGUgc3RydWN0dXJlIGVycm9ycyBzdWNoIGFzIFByb2Nlc3NDb21wb25lbnQgd2l0aG91dCBwcm9jZXNzIGluIGl0LgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpeExpYnJhcnlGb3JFeHBvcnQoKSB7Ci0KLQkJTGlzdCBpbnZhbGlkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSAoKE1ldGhvZExpYnJhcnkpIHJvb3RPYmplY3QpLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICkgewotCQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudClvYmopLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAoIHByb2MgPT0gbnVsbCApIHsKLQkJCQkJaW52YWxpZEl0ZW1zLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSB0aGUgb2JqZWN0cwotCQl3aGlsZSAoaW52YWxpZEl0ZW1zLnNpemUoKSA+IDAgKSB7Ci0JCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KWludmFsaWRJdGVtcy5yZW1vdmUoMCk7Ci0JCQlFY29yZVV0aWwucmVtb3ZlKG9iaik7Ci0JCX0KLQl9Ci0KLQkKLQkKLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIHJlZmVyZW5jZWQgcGx1Z2lucyBmb3IgdGhlIGxpYnJhcnkuIFRoZSByZWZlcmVuY2VkIHBsdWdpbnMKLQkgKiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvbmVzIGluc2lkZSB0aGlzIGxpYnJhcnkuIFdoZW4gaW1wb3J0aW5nLCB0aGVzZQotCSAqIHBsdWdpbnMgbXVzdCBiZSBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkgYWxyZWFkeS4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIHJlZmVyZW5jZWQgcGx1Z2lucwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlZmVyZW5jZWRQbHVnaW5zKCkgewotCi0JCUxpc3QgZXh0ZXJuYWxQbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmICghKHJvb3RPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSkgewotCQkJcmV0dXJuIGV4dGVybmFsUGx1Z2luczsKLQkJfQotCi0JCUxpc3Qgc2VsZWN0ZWRQbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gKChNZXRob2RMaWJyYXJ5KSByb290T2JqZWN0KS5nZXRNZXRob2RQbHVnaW4oKQotCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJU3RyaW5nIGlkID0gcGx1Z2luLmdldElkKCk7Ci0JCQlzZWxlY3RlZFBsdWdpbnMuYWRkKGlkKTsKLQkJCWlmIChleHRlcm5hbFBsdWdpbnMuY29udGFpbnMoaWQpKSB7Ci0JCQkJZXh0ZXJuYWxQbHVnaW5zLnJlbW92ZShpZCk7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRyID0gcGx1Z2luLmdldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKS5pdGVyYXRvcigpOyBpdHIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgcmVmID0gKFN0cmluZykgaXRyLm5leHQoKTsKLQkJCQlpZiAoIXNlbGVjdGVkUGx1Z2lucy5jb250YWlucyhyZWYpCi0JCQkJCQkmJiAhZXh0ZXJuYWxQbHVnaW5zLmNvbnRhaW5zKHJlZikpIHsKLQkJCQkJZXh0ZXJuYWxQbHVnaW5zLmFkZChyZWYpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBleHRlcm5hbFBsdWdpbnM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpeEd1aWQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGlmIHRoZSB4bWwgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGlkIHNwZWNpZmllZCwgY3JlYXRlIGEgbmV3IG9uZQotCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldElkKCk7Ci0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWQgPSBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCk7Ci0JCQllbGVtZW50LnNldElkKGlkKTsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9uZXdfaWQsCi0JCQkJCWdldFN0cmluZyhlbGVtZW50KSwgaWQpOwotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcobXNnKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBlbGVtZW50IGhhcyBhIHVuaXF1ZSBpZCBvciBub3QKLQkJCU9iamVjdCBvbGQgPSBnZXRFbGVtZW50KGlkKTsKLQkJCWlmICgob2xkICE9IG51bGwpICYmIChvbGQgIT0gZWxlbWVudCkpIHsKLQkJCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZCgKLQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2lkX25vdF91bmlxdWUsIGlkKSk7Ci0JCQl9Ci0KLQkJCXNldEVsZW1lbnQoaWQsIGVsZW1lbnQpOwotCQl9Ci0JCS8vIGl0ZXJhdGUgdGhlIGNoaWxkcmVuCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50LmVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZml4R3VpZCgoTWV0aG9kRWxlbWVudCkgbyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZml4UGx1Z2luKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQotCQkvLyBmaW5kIGFsbCBwcm9jZXNzZXMgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSB3cmFwcGVkIHdpdGggYQotCQkvLyBQcm9jZXNzQ29tcG9uZW50LAotCQkvLyBpZiBub3QsIGNyZWF0ZSBvbmUuCi0JCS8vIGNvbGxlY3QgdGhlIHByb2Nlc3NlcyB0byBiZSBmaXhlZCwKLQkJLy8gZG9uJ3QgZml4IHdpdGhpbiB0aGUgaXRlcmF0aW9uLCBtYXkgY2F1c2UgY29uY3VycmVudCBtb2RpZmljYXRpb24KLQkJLy8gZXhlY2VwdGlvbgotCQlMaXN0IHByb2NzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2luLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJaWYgKGlzUHJvY2VzcyhvKSkgewotCQkJCXByb2NzLmFkZChvKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9jcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvY3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWZpeFByb2Nlc3MoKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MpIGl0Lm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbiBFUEYsIGEgcHJvY2VzcyAoQ2FwYWJpbGl0eSBwYXR0ZXJuIGFuZCBEZWxpdmVyeSBQcm9jZXNzKSBjYW4gYmUgcmVzaWRlCi0JICogaW4gYSBQcm9jZXNzUGFja2FnZSBvciBhIFByb2Nlc3NDb21wb25lbnQuIElmIGl0J3MgaW4gYSBwcm9jZXNzQ29tcG9uZW50LAotCSAqIGl0IGlzIHRyZWF0ZWQgYXMgYSByb290IGxldmVsIHByb2Nlc3MuIElmIGl0J3MgaW4gYSBQcm9jZXNzUGFja2FnZSwgaXQgaXMKLQkgKiB0cmVhdGVkIGFzIGEgbG9jYWwgY29weSBvZiBhbm90aGVyIHByb2Nlc3MuIFNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlCi0JICogcGFyZW50IGFuZCBzZWUgaXQgdGhpcyBwcm9jZXNzIGlzIGNvbnRhaW5lZCBieSBhIFByb2Nlc3NDb21wb25lbnQuCi0JICogCi0JICogQHBhcmFtIE9iagotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1Byb2Nlc3MoRU9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCW9iaiA9IG9iai5lQ29udGFpbmVyKCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIGlmIGl0J3MgaW1tZWRpYXRlIHBhcmVudCBpcyBub3QgYSBQcm9jZXNzQ29tcG9uZW50IGJ1dCBpdCdzIHdpdGhpbiBhCi0JCS8vIFByb2Nlc3NDb21wb25lbnQKLQkJLy8gaXQncyBhIGxvY2FsIGNvcHkgb2YgdGhlIHByb2Nlc3MKLQkJd2hpbGUgKCgob2JqID0gb2JqLmVDb250YWluZXIoKSkgIT0gbnVsbCkKLQkJCQkmJiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXhQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcHJvYykgewotCQlFRGF0YU9iamVjdCBjb250YWluZXIgPSAoRURhdGFPYmplY3QpIHByb2MuZUNvbnRhaW5lcigpOwotCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSkgewotCQkJU3RyaW5nIG1zZyA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9wcm9jZXNzX3dyb25nX2NvbnRhaW5lciwKLQkJCQkJCQlwcm9jLmdldE5hbWUoKSwgY29udGFpbmVyLmdldFR5cGUoKS5nZXROYW1lKCkpOwotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcobXNnKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXBjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCQlTdHJpbmcgaWQgPSBnZXRUYXJnZXRQYXJlbnRJZChwcm9jLmdldElkKCkpOwotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJaWQgPSBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCk7Ci0JCX0KLQotCQlwYy5zZXRJZChpZCk7Ci0JCXBjLnNldE5hbWUocHJvYy5nZXROYW1lKCkpOwotCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIpLmdldFByb2Nlc3NFbGVtZW50KCkucmVtb3ZlKHByb2MpOwotCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIpLmdldE1ldGhvZFBhY2thZ2UoKS5hZGQocGMpOwotCQlwYy5zZXRQcm9jZXNzKHByb2MpOwotCi0JfQotCi0JLyoqCi0JICogaWYgdGhlIHByb2Nlc3MgZXhpc3RzIGluIHRoZSB0YXJnZXQgbGlicmFyeSwgZ2V0IHRoZSBwcm9jZXNzIGNvbXBvbmVudCBpZAotCSAqIGZyb20gdGhlIHRhcmdldCBsaWJyYXJ5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0UGFyZW50SWQoU3RyaW5nIGlkKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJRU9iamVjdCBvYmogPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoaWQpOwotCQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQkJb2JqID0gb2JqLmVDb250YWluZXIoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkgb2JqKS5nZXRHdWlkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBrZwotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHByb2Nlc3NlcyBpbiBwa2cuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWxsUHJvY2Vzc2VzKE1ldGhvZFBhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlfaXRlcmF0ZVBhY2thZ2VGb3JQcm9jZXNzZXMocGtnLCBwcm9jZXNzZXMpOwotCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9pdGVyYXRlUGFja2FnZUZvclByb2Nlc3NlcyhNZXRob2RQYWNrYWdlIHBrZywgTGlzdCBwcm9jZXNzZXMpIHsKLQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgcGtnKQotCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJaWYgKHAgIT0gbnVsbCAmJiAhcHJvY2Vzc2VzLmNvbnRhaW5zKHApKSB7Ci0JCQkJcHJvY2Vzc2VzLmFkZChwKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2cuZ2V0TWV0aG9kUGFja2FnZSgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCV9pdGVyYXRlUGFja2FnZUZvclByb2Nlc3NlcygoTWV0aG9kUGFja2FnZSkgaXQubmV4dCgpLCBwcm9jZXNzZXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmYjc2NzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9uIGZvciB0aGUgRXhwb3J0IFhNTCBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvRXhwb3J0WE1MV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL0V4cG9ydFhNTFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOTEyODUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvRXhwb3J0WE1MV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlcy5FeHBvcnRYTUxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5FeHBvcnRYTUxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLkV4cG9ydFhNTFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBYTUwgd2l6YXJkLgotICogPHA+Ci0gKiBUaGlzIHdpemFyZCBpcyB1c2VkIHRvIGV4cG9ydCBtZXRob2QgbGlicmFyeSBjb250ZW50IHRvIFhNTCBmaWxlcy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0WE1MV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwcml2YXRlIFNlbGVjdEV4cG9ydFR5cGVQYWdlIHNlbGVjdEV4cG9ydFR5cGVQYWdlOwotCi0JcHJvdGVjdGVkIFNlbGVjdFBsdWdpblBhZ2Ugc2VsZWN0UGx1Z2luUGFnZTsKLQotCXByb3RlY3RlZCBWaWV3UGx1Z2luSW5mb1BhZ2Ugdmlld1BsdWdpbkluZm9QYWdlOwotCi0JcHJvdGVjdGVkIFZpZXdFeHBvcnRTdW1tYXJ5UGFnZSB2aWV3RXhwb3J0U3VtbWFyeVBhZ2U7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0Q29uZmlnUGFnZSBzZWxlY3RDb25maWdQYWdlOwotCi0JcHJvdGVjdGVkIFNlbGVjdFhNTEZpbGVQYWdlIHNlbGVjdFhNTEZpbGVQYWdlOwotCi0JcHJvdGVjdGVkIEV4cG9ydFhNTERhdGEgeG1sRGF0YSA9IG5ldyBFeHBvcnRYTUxEYXRhKCk7Ci0KLQlwcm90ZWN0ZWQgUGx1Z2luRXhwb3J0RGF0YSBwbHVnaW5EYXRhID0gbmV3IFBsdWdpbkV4cG9ydERhdGEoKTsKLQotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBjb25maWdEYXRhID0gbmV3IENvbmZpZ3VyYXRpb25FeHBvcnREYXRhKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRYTUxXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKEV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxXaXphcmRfdGl0bGUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc2VsZWN0RXhwb3J0VHlwZVBhZ2UgPSBuZXcgU2VsZWN0RXhwb3J0VHlwZVBhZ2UoKTsKLQkJc2VsZWN0UGx1Z2luUGFnZSA9IG5ldyBTZWxlY3RQbHVnaW5QYWdlKHBsdWdpbkRhdGEpOwotCQl2aWV3UGx1Z2luSW5mb1BhZ2UgPSBuZXcgVmlld1BsdWdpbkluZm9QYWdlKHBsdWdpbkRhdGEpOwotCQl2aWV3RXhwb3J0U3VtbWFyeVBhZ2UgPSBuZXcgVmlld0V4cG9ydFN1bW1hcnlQYWdlKHBsdWdpbkRhdGEpOwotCQlzZWxlY3RDb25maWdQYWdlID0gbmV3IFNlbGVjdENvbmZpZ1BhZ2UoY29uZmlnRGF0YSk7Ci0JCXNlbGVjdFhNTEZpbGVQYWdlID0gbmV3IFNlbGVjdFhNTEZpbGVQYWdlKCk7Ci0KLQkJYWRkUGFnZShzZWxlY3RFeHBvcnRUeXBlUGFnZSk7Ci0JCWFkZFBhZ2Uoc2VsZWN0UGx1Z2luUGFnZSk7Ci0JCWFkZFBhZ2Uodmlld1BsdWdpbkluZm9QYWdlKTsKLQkJYWRkUGFnZSh2aWV3RXhwb3J0U3VtbWFyeVBhZ2UpOwotCQlhZGRQYWdlKHNlbGVjdENvbmZpZ1BhZ2UpOwotCQlhZGRQYWdlKHNlbGVjdFhNTEZpbGVQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L1hNTEZpbGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJcmV0dXJuIGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgPT0gc2VsZWN0WE1MRmlsZVBhZ2UKLQkJCQkmJiBzZWxlY3RYTUxGaWxlUGFnZS5pc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJU3RyaW5nIHhtbEZpbGVQYXRoID0gc2VsZWN0WE1MRmlsZVBhZ2UuZ2V0UGF0aCgpOwotCQlGaWxlIHhtbEZpbGUgPSBuZXcgRmlsZSh4bWxGaWxlUGF0aCk7Ci0JCWlmICh4bWxGaWxlLmV4aXN0cygpKSB7Ci0JCQlib29sZWFuIG9rID0gRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0WE1MV2l6YXJkX3RpdGxlLAotCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy5iaW5kKAotCQkJCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLm92ZXJ3cml0ZVRleHRfbXNnLAotCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgeG1sRmlsZVBhdGggfSkpOwotCQkJaWYgKCFvaykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJRXhwb3J0WE1MU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLmJlZ2luVGFzayhFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0aW5nWE1MX3RleHQsCi0JCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQotCQkJCQl4bWxEYXRhLnNldFhNTEZpbGUoc2VsZWN0WE1MRmlsZVBhZ2UuZ2V0UGF0aCgpKTsKLQkJCQkJc2VydmljZSA9IG5ldyBFeHBvcnRYTUxTZXJ2aWNlKHhtbERhdGEpOwotCQkJCQlzZXJ2aWNlLmRvRXhwb3J0KG1vbml0b3IpOwotCQkJCQlFeHBvcnRYTUxQcmVmZXJlbmNlcy5zZXRFeHBvcnRUeXBlKHhtbERhdGEuZ2V0RXhwb3J0VHlwZSgpKTsKLQkJCQkJRXhwb3J0WE1MUHJlZmVyZW5jZXMuc2V0WE1MRmlsZSh4bWxEYXRhLmdldFhNTEZpbGUoKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCWlmIChzZXJ2aWNlICE9IG51bGwpIHsKLQkJCQkJCXNlcnZpY2UuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFdpemFyZF90aXRsZSwKLQkJCQkJTkxTLmJpbmQoRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFdpemFyZF9lcnJvciwKLQkJCQkJCQlyZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSksIHJlYWxFeGNlcHRpb24pOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIG1zZyA9IEV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nOwotCQlNc2dCb3gucHJvbXB0KG1zZywgU1dULk9LKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0Q29uZmlnUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RDb25maWdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxZTZjYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RDb25maWdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gKiBzcGVjaWZpY2F0aW9ucyB0byBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0Q29uZmlnUGFnZSBleHRlbmRzIEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5lcyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0Q29uZmlnUGFnZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKGRhdGEpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXN1cGVyLnNhdmVEYXRhVG9Nb2RlbCgpOwotCQlFeHBvcnRYTUxXaXphcmQgd2l6YXJkID0gKEV4cG9ydFhNTFdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCXdpemFyZC54bWxEYXRhLnNldFNlbGVjdGVkQ29uZmlncyh3aXphcmQuY29uZmlnRGF0YS5zZWxlY3RlZENvbmZpZ3MpOwkJCi0JCXJldHVybiB3aXphcmQuc2VsZWN0WE1MRmlsZVBhZ2U7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RFeHBvcnRUeXBlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RFeHBvcnRUeXBlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMTRhMTA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0RXhwb3J0VHlwZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlcy5FeHBvcnRYTUxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5FeHBvcnRYTUxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgZGlzcGxheXMgdGhlIHR5cGUgb2YgbWV0aG9kIGxpYnJhcnkgY29udGVudCB0byBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdEV4cG9ydFR5cGVQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RFeHBvcnRUeXBlUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIEJ1dHRvbiBleHBvcnRMaWJyYXJ5UmFkaW9CdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBleHBvcnRQbHVnaW5zUmFkaW9CdXR0b247Ci0KLQkvLyBQb3N0cG9uZWQgdG8gbmV4dCByZWxlYXNlLgotCS8vcHJpdmF0ZSBCdXR0b24gZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0RXhwb3J0VHlwZVBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFhNTFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9FeHBvcnRYTUwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlleHBvcnRMaWJyYXJ5UmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihjb250YWluZXIsCi0JCQkJRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbl90ZXh0LCAxLCBmYWxzZSk7Ci0KLQkJZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29udGFpbmVyLAotCQkJCUV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRQbHVnaW5zUmFkaW9CdXR0b25fdGV4dCwgMSwgZmFsc2UpOwotCi0JCS8vIFBvc3Rwb25lZCB0byBuZXh0IHJlbGVhc2UuCi0JCS8vZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29udGFpbmVyLAotCQkvLwkJRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbl90ZXh0LCAxLCBmYWxzZSk7Ci0JCQotCQlzd2l0Y2ggKEV4cG9ydFhNTFByZWZlcmVuY2VzLmdldEV4cG9ydFR5cGUoKSkgewotCQljYXNlIEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9MSUJSQVJZOgotCQkJZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9QTFVHSU5TOgotCQkJZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWJyZWFrOwotCQkvLyBQb3N0cG9uZWQgdG8gbmV4dCByZWxlYXNlLgkJCQotCQkvL2Nhc2UgRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX0NPTkZJR1M6Ci0JCS8vCWV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCS8vCWJyZWFrOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlleHBvcnRQbHVnaW5zUmFkaW9CdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCS8vIFBvc3Rwb25lZCB0byBuZXh0IHJlbGVhc2UuCQkKLQkJLy9leHBvcnRDb25maWdzUmFkaW9CdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKExpYnJhcnlVSVJlc291cmNlcy5ub09wZW5MaWJyYXJ5V2FybmluZ19tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGdldEVycm9yTWVzc2FnZSgpID09IG51bGw7Ci0JfQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJRXhwb3J0WE1MV2l6YXJkIHdpemFyZCA9IChFeHBvcnRYTUxXaXphcmQpIGdldFdpemFyZCgpOwotCi0JCWlmIChleHBvcnRMaWJyYXJ5UmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXdpemFyZC54bWxEYXRhLnNldEV4cG9ydFR5cGUoRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX0xJQlJBUlkpOwotCQkJcmV0dXJuIHdpemFyZC5zZWxlY3RYTUxGaWxlUGFnZTsKLQkJfSBlbHNlIGlmIChleHBvcnRQbHVnaW5zUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXdpemFyZC54bWxEYXRhLnNldEV4cG9ydFR5cGUoRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX1BMVUdJTlMpOwotCQkJcmV0dXJuIHdpemFyZC5zZWxlY3RQbHVnaW5QYWdlOwotCQl9Ci0JCS8vIFBvc3Rwb25lZCB0byBuZXh0IHJlbGVhc2UuCi0JCS8vZWxzZSBpZiAoZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCS8vCXdpemFyZC54bWxEYXRhLnNldEV4cG9ydFR5cGUoRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX0NPTkZJR1MpOwotCQkvLwlyZXR1cm4gd2l6YXJkLnNlbGVjdENvbmZpZ1BhZ2U7Ci0JCS8vfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0UGx1Z2luUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RQbHVnaW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExYjZmMzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RQbHVnaW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3Qgb25lIG9yIG1vcmUgbWV0aG9kIHBsdWctaW5zIHRvCi0gKiBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0UGx1Z2luUGFnZSBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5TZWxlY3RQbHVnaW5QYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFBsdWdpblBhZ2UoUGx1Z2luRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc3VwZXIuc2F2ZURhdGFUb01vZGVsKCk7Ci0JCUV4cG9ydFhNTFdpemFyZCB3aXphcmQgPSAoRXhwb3J0WE1MV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJd2l6YXJkLnhtbERhdGEuc2V0U2VsZWN0ZWRQbHVnaW5zKHdpemFyZC5wbHVnaW5EYXRhLnNlbGVjdGVkUGx1Z2lucyk7Ci0JCVZpZXdQbHVnaW5JbmZvUGFnZSBwYWdlID0gd2l6YXJkLnZpZXdQbHVnaW5JbmZvUGFnZTsKLQkJcGFnZS5vbkVudGVyUGFnZShudWxsKTsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdFhNTEZpbGVQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdFhNTEZpbGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0MDcxZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RYTUxGaWxlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlcy5FeHBvcnRYTUxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgWE1MIGZpbGUgdG8gc3RvcmUgdGhlCi0gKiBleHBvcnRlZCBtZXRob2QgbGlicmFyeSBjb250ZW50LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RYTUxGaWxlUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0WE1MRmlsZVBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUZXh0IHBhdGhUZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFhNTEZpbGVQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRYTUxSZXNvdXJjZXMuc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRYTUxSZXNvdXJjZXMuc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0WE1MLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGZpbGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZmlsZUxhYmVsLnNldFRleHQoRXhwb3J0WE1MUmVzb3VyY2VzLmZpbGVMYWJlbF90ZXh0KTsKLQotCQlwYXRoVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXBhdGhUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwYXRoVGV4dC5zZXRUZXh0KEV4cG9ydFhNTFByZWZlcmVuY2VzLmdldFhNTEZpbGUoKSk7Ci0JCXBhdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChpc1ZhbGlkUGF0aChwYXRoVGV4dC5nZXRUZXh0KCkudHJpbSgpKSkgewotCQkJCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkJCQlzZXRFcnJvck1lc3NhZ2UoRXhwb3J0WE1MUmVzb3VyY2VzLmludmFsaWRYTUxGaWxlX2Vycm9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5EKSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KEV4cG9ydFhNTFJlc291cmNlcy5icm93c2VCdXR0b25fdGV4dCk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlGaWxlRGlhbG9nIGZkID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuU0FWRSk7Ci0JCQkJZmQuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKi54bWwiLCAiKi4qIiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJU3RyaW5nIHBhdGggPSBmZC5vcGVuKCk7Ci0JCQkJYm9vbGVhbiBvayA9IGZhbHNlOwotCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJcGF0aFRleHQuc2V0VGV4dChwYXRoKTsKLQkJCQkJb2sgPSBpc1ZhbGlkUGF0aChwYXRoKTsKLQkJCQl9Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKG9rKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQlzZXRQYWdlQ29tcGxldGUoaXNWYWxpZFBhdGgocGF0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKSkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSB1c2VyIHNwZWNpZmljIHBhdGggaXMgdmFsaWQuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSB1c2VyIHNwZWNpZmljIHBhdGgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHNwZWNpZmllZCBwYXRoIGlzIHZhbGlkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUGF0aChTdHJpbmcgcGF0aCkgewotCQlJUGF0aCBlY1BhdGggPSBQYXRoLmZyb21PU1N0cmluZyhwYXRoKTsKLQkJaWYgKGVjUGF0aC5pc1ZhbGlkUGF0aChwYXRoKSAmJiBwYXRoLmVuZHNXaXRoKCIueG1sIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXJldHVybiBudWxsOyAvLyBubyBtb3JlIHBhZ2UKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBYTUwgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIFhNTCBmaWxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gdGhpcy5wYXRoOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9WaWV3RXhwb3J0U3VtbWFyeVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvVmlld0V4cG9ydFN1bW1hcnlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0Yzg2MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9WaWV3RXhwb3J0U3VtbWFyeVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydFBsdWdpblN1bW1hcnlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgZGlzcGxheXMgYSBzdW1tYXJ5IG9mIHRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Zy1pbnMgdGhhdAotICogd2lsbCBiZSBleHBvcnRlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3RXhwb3J0U3VtbWFyeVBhZ2UgZXh0ZW5kcyBFeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBWaWV3RXhwb3J0U3VtbWFyeVBhZ2UoUGx1Z2luRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJRXhwb3J0WE1MV2l6YXJkIHdpemFyZCA9IChFeHBvcnRYTUxXaXphcmQpIGdldFdpemFyZCgpOwotCQlyZXR1cm4gd2l6YXJkLnNlbGVjdFhNTEZpbGVQYWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9WaWV3UGx1Z2luSW5mb1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvVmlld1BsdWdpbkluZm9QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkNzlkYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9WaWV3UGx1Z2luSW5mb1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLlBsdWdpbkluZm9QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byByZXZpZXcgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgbWV0aG9kCi0gKiBwbHVnLWlucyB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZCBmb3IgZXhwb3J0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZpZXdQbHVnaW5JbmZvUGFnZSBleHRlbmRzIFBsdWdpbkluZm9QYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFZpZXdQbHVnaW5JbmZvUGFnZShQbHVnaW5FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzdXBlci5zYXZlRGF0YVRvTW9kZWwoKTsKLQkJRXhwb3J0WE1MV2l6YXJkIHdpemFyZCA9IChFeHBvcnRYTUxXaXphcmQpIGdldFdpemFyZCgpOwotCQl3aXphcmQueG1sRGF0YS5zZXRBc3NvY2lhdGVkQ29uZmlncyh3aXphcmQucGx1Z2luRGF0YS5hc3NvY2lhdGVkQ29uZmlnTWFwKTsKLQkJVmlld0V4cG9ydFN1bW1hcnlQYWdlIHBhZ2UgPSB3aXphcmQudmlld0V4cG9ydFN1bW1hcnlQYWdlOwotCQlwYWdlLm9uRW50ZXJQYWdlKG51bGwpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0YzFjY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB3aXphcmRzIGZvciBleHBvcnRpbmcgbWV0aG9kIGxpYnJhcnkgY29udGVudCB0byBYTUwuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ly5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGM0ZjIwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZmNzU5NDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ly5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBleHBvcnQgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1YWE0OTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmV4cG9ydDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiZDE5MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS5hbnQsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjNzgwY2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0F1dGhvcmluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvQXV0aG9yaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTMxYmFmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvQXV0aG9yaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9Db250ZW50UGFja2FnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvQ29udGVudFBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9Db250ZW50UGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvRm9sZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9Gb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjQxOWQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9Gb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL01ldGhvZFBsdWdpbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvTWV0aG9kUGx1Z2luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmI4MmMzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvTWV0aG9kUGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9QYWNrYWdpbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1BhY2thZ2luZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5NjM5NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1BhY2thZ2luZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvUm9sZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1JvbGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTRhM2Y2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvUm9sZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1Rhc2tzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9UYXNrcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzOGJkODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1Rhc2tzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9jb25maWd1cmF0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9jb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvY29uZmlndXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZXJyb3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Vycm9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzVlN2E5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZXJyb3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9mdWxsL3dpemJhbi9FeHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyNDk4MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9mdWxsL3dpemJhbi9FeHBvcnRNZXRob2RQbHVnaW5zLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9mdWxsL3dpemJhbi9FeHBvcnRNZXRob2RQbHVnaW5zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI0OTgzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0TWV0aG9kUGx1Z2lucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvd2FybmluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvd2FybmluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlZTIwYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL3dhcm5pbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNGQyNzg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgRXhwb3J0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyBQZXJzcGVjdGl2ZQotcGFja2FnaW5nUGVyc3BlY3RpdmVOYW1lPVBhY2thZ2luZwotCi0jIENhdGVnb3J5Ci1wYWNrYWdpbmdDYXRlZ29yeU5hbWU9UGFja2FnaW5nCi0KLSMgVmlld3MKLXBhY2thZ2luZ1ZpZXdOYW1lPVBhY2thZ2luZyBNZXRob2QgTGlicmFyeQotcGFja2FnaW5nTWVzc2FnZVZpZXdOYW1lPUxpYnJhcnkgUGFja2FnaW5nIE1lc3NhZ2UKLQotIyBBY3Rpb24gU2V0Ci1wYWNrYWdpbmdBY3Rpb25TZXQ9UGFja2FnaW5nCi0KLSMgQWN0aW9ucwotbmV3Q29uZmlnQWN0aW9uPSZDb25maWd1cmF0aW9uCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPUNyZWF0ZSBhIG5ldyBsaWJyYXJ5IENvbmZpZ3VyYXRpb24KLW9wZW5Db25maWdBY3Rpb249JkNvbmZpZ3VyYXRpb24KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPU9wZW4gYW4gZXhpc3RpbmcgbGlicmFyeSBjb25maWd1cmF0aW9uCi0KLSMgRXhwb3J0IFdpemFyZCBDYXRlZ29yeQotZXhwb3J0Q2F0ZWdvcnlOYW1lPU1ldGhvZAotCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkCi1leHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZE5hbWU9TGlicmFyeSBDb25maWd1cmF0aW9uCi1leHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbj1FeHBvcnQgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uCi0KLSMgRXhwb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQKLWV4cG9ydE1ldGhvZFBsdWdpbnNXaXphcmROYW1lPU1ldGhvZCBQbHVnLWlucwotZXhwb3J0TWV0aG9kUGx1Z2lucz1FeHBvcnQgb25lIG9yIG1vcmUgbWV0aG9kIHBsdWctaW5zLgotCi0KLQotICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDVmZDNhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQiCi0gICAgICAgICAgICBpY29uPSIvaWNvbnMvY29uZmlndXJhdGlvbi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVleHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5FeHBvcnRQbHVnaW5XaXphcmQiCi0gICAgICAgICAgICBpY29uPSIvaWNvbnMvTWV0aG9kUGx1Z2luLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0UGx1Z2luV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJWV4cG9ydE1ldGhvZFBsdWdpbnNXaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4gCi0gICAgICAgICAgICAgICAlZXhwb3J0TWV0aG9kUGx1Z2lucwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPiAKLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQiLz4KLSAgICAgIDx3aXphcmQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5FeHBvcnRQbHVnaW5XaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRPcHRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0T3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MjEzYjQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIFRoZSBleHBvcnQgb3B0aW9ucy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRPcHRpb25zIHsKLQotCXByb3RlY3RlZCBGaWxlIGV4cG9ydERpcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydE9wdGlvbnMoKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzZWxlY3RlZCBleHBvcnQgZGlyZWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gYSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgdGhlIGV4cG9ydGVkIGNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRFeHBvcnREaXIoKSB7Ci0JCXJldHVybiBleHBvcnREaXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdXNlciBzZWxlY3RlZCBleHBvcnQgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBleHBvcnREaXIKLQkgKiAgICAgICAgICAgIGEgZGlyZWN0b3J5IGZvciBzdG9yaW5nIHRoZSBleHBvcnRlZCBjb250ZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwb3J0RGlyKEZpbGUgZXhwb3J0RGlyKSB7Ci0JCXRoaXMuZXhwb3J0RGlyID0gZXhwb3J0RGlyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTk2ODc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoZSBFeHBvcnQgcGx1Z2luIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFeHBvcnRQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHBvcnRQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRQcm9jZXNzT3B0aW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFByb2Nlc3NPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjODU5OTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFByb2Nlc3NPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgZXhwb3J0IHByY29lc3Mgb3B0aW9ucy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRQcm9jZXNzT3B0aW9ucyBleHRlbmRzIEV4cG9ydE9wdGlvbnMgewotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hXZWJTaXRlOwotCi0JcHJpdmF0ZSBQdWJsaXNoT3B0aW9ucyBwdWJsaXNoaW5nT3B0aW9uczsKLQotCXByaXZhdGUgYm9vbGVhbiBleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0UHJvY2Vzc09wdGlvbnMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgZXhwb3J0IHRoZSBwcm9jZXNzLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgZXhwb3J0IHRoZSBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggcHJvY2VzcyB3ZWIgc2l0ZSBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvY2VzcyB3ZWIgc2l0ZSBzaG91bGQgYmUgcHVibGlzaGVkCi0JICogICAgICAgICBhcyBwYXJ0IG9mIHRoZSBleHBvcnQgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaFdlYlNpdGUoKSB7Ci0JCXJldHVybiBwdWJsaXNoV2ViU2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIHByb2Nlc3Mgd2ViIHNpdGUgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoV2ViU2l0ZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2ggdGhlIHByb2Nlc3Mgd2ViIHNpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoV2ViU2l0ZShib29sZWFuIHB1Ymxpc2hXZWJTaXRlKSB7Ci0JCXRoaXMucHVibGlzaFdlYlNpdGUgPSBwdWJsaXNoV2ViU2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgcHVibGlzaGluZyBvcHRpb25zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHB1Ymxpc2ggdGhlIHByb2Nlc3MKLQkgKiAgICAgICAgIHdlYiBzaXRlCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcHRpb25zIGdldFB1Ymxpc2hpbmdPcHRpb25zKCkgewotCQlyZXR1cm4gcHVibGlzaGluZ09wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaGluZyBvcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoaW5nT3B0aW9ucwotCSAqICAgICAgICAgICAgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBwdWJsaXNoIHRoZQotCSAqICAgICAgICAgICAgcHJvY2VzcyB3ZWIgc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hpbmdPcHRpb25zKFB1Ymxpc2hPcHRpb25zIHB1Ymxpc2hpbmdPcHRpb25zKSB7Ci0JCXRoaXMucHVibGlzaGluZ09wdGlvbnMgPSBwdWJsaXNoaW5nT3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleHBvcnQgb25seSBwbGFubmVkIFdCUyBlbGVtZW50cyBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBvbmx5IHBsYW5uZWQgV0JTIGVsZW1lbnRzIHNob3VsZCBiZQotCSAqICAgICAgICAgZXhwb3J0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cygpIHsKLQkJcmV0dXJuIGV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXhwb3J0IG9ubHkgcGxhbm5lZCBXQlMgZWxlbWVudHMgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZXhwb3J0IG9ubHkgcGxhbm5lZCBXQlMgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzKAotCQkJYm9vbGVhbiBleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzKSB7Ci0JCXRoaXMuZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cyA9IGV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiNGQ1NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRXhwb3J0UmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LlJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFeHBvcnRSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydENvbmZpZ1dpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnU3BlY3NMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnU3BlY3NQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1NwZWNzUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0NvbmZpZ1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tDb25maWdQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVzdGluYXRpb25QYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlc3RpbmF0aW9uUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFBsdWdpbnNXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc1BhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdQbHVnaW5zUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdQbHVnaW5zUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld1BsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX25vUGx1Z2luX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3BlY2lmeVBhdGhQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNwZWNpZnlQYXRoUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVQbHVnaW5QYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0UGx1Z2luV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydFBsdWdpbkVycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRDb25maWdFcnJvckRpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRDb25maWdFcnJvckRpYWxvZ19tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYW5hbHl6aW5nQ29uZmlnVGFza19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2VfY2hlY2tpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfYnJvd3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kZWZhdWx0X2RpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRQbHVnaW5XaXphcmRfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUxpYnJhcnlQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVQbHVnaW5QYWdlX2xhYmVsX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUxpYnJhcnlQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0UGx1Z2luV2l6YXJkX01TRzE7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBFeHBvcnRSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljNjYxNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMKLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAwMDBFIC0gSVVQRTAwOTlFCi0jCi0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQKLWV4cG9ydENvbmZpZ1dpemFyZF90aXRsZT1FeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZT1TZWxlY3QgZXhwb3J0IHR5cGUKLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M9U2VsZWN0IHRoZSB0eXBlIG9mIGxpYnJhcnkgY29uZmlndXJhdGlvbiB0byBleHBvcnQuCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0PUV4cG9ydCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGFuZCBhbGwgaXRzIG1ldGhvZCBwbHVnLWlucwotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnU3BlY3NMYWJlbF90ZXh0PUV4cG9ydCBvbmUgb3IgbW9yZSBtZXRob2QgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucwotc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TZWxlY3QgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLXNlbGVjdENvbmZpZ1BhZ2VfZGVzYz1TZWxlY3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0byBleHBvcnQuIEFsbCByZWZlcmVuY2VkIG1ldGhvZCBwbHVnLWlucyBpbiB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBleHBvcnQuCi1zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PU1ldGhvZCBjb25maWd1cmF0aW9uczoKLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV90aXRsZT1TZWxlY3QgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucwotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2M9U2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZCBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRvbnMgdG8gZXhwb3J0Lgotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PU1ldGhvZCBjb25maWd1cmF0aW9uczoKLWNoZWNrQ29uZmlnUGFnZV90aXRsZT1SZXZpZXcgY29uZmlndXJhdGlvbiBlcnJvcnMKLWNoZWNrQ29uZmlnUGFnZV9kZXNjPUFuIGludGVncml0eSBjaGVjayBoYXMgYmVlbiBwZXJmb3JtZWQgb24gdGhlIHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uLiBSZXZpZXcgdGhlIGVycm9yIHJlcG9ydCBhbmQgcGVyZm9ybSB0aGUgbmVjZXNzYXJ5IGNvcnJlY3RpdmUgYWN0aW9ucy4KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV90aXRsZT1TcGVjaWZ5IGV4cG9ydCBkaXJlY3RvcnkKLXNlbGVjdERlc3RpbmF0aW9uUGFnZV9kZXNjPVNwZWNpZnkgYSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgdG8gc3RvcmUgdGhlIGV4cG9ydGVkIGNvbmZpZ3VyYXRpb24uCi0KLSMgRXhwb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQKLWV4cG9ydFBsdWdpbnNXaXphcmRfdGl0bGU9RXhwb3J0IE1ldGhvZCBQbHVnLWlucwotc2VsZWN0UGx1Z2luc1BhZ2VfdGl0bGU9U2VsZWN0IG1ldGhvZCBwbHVnLWlucwotc2VsZWN0UGx1Z2luc1BhZ2VfZGVzYz1TZWxlY3Qgb25lIG9yIG1vcmUgbWV0aG9kIHBsdWctaW5zIHRvIGV4cG9ydC4KLXNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PU1ldGhvZCBwbHVnLWluczoKLXJldmlld1BsdWdpbnNQYWdlX3RpdGxlPVJldmlldyBkZXBlbmRlbmNpZXMKLXJldmlld1BsdWdpbnNQYWdlX2Rlc2M9U2VsZWN0IGVhY2ggbWV0aG9kIHBsdWctaW4gdG8gcmV2aWV3IGl0cyBkZXBlbmRlbmNpZXMuIENsaWNrIEJhY2sgdG8gc2VsZWN0IHRoZSBkZXBlbmRlbnQgcGx1Zy1pbnMgaWYgdGhleSBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBleHBvcnQuCi1yZXZpZXdQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dD1NZXRob2QgUGx1Zy1pbnM6Ci1yZXZpZXdQbHVnaW5zUGFnZV9kZXBlbmRlbnRQbHVnaW5zTGFiZWxfdGV4dD1EZXBlbmRlbnQgbWV0aG9kIHBsdWctaW5zOgotcmV2aWV3UGx1Z2luc1BhZ2VfYXNzb2NpYXRlZENvbmZpZ3NMYWJlbF90ZXh0PUFzc29jaWF0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb25zOgotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfdGl0bGU9Q29uZmlybSBleHBvcnQKLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX2Rlc2M9Q29uZmlybSB0aGUgbWV0aG9kIHBsdWctaW5zIHRoYXQgd2lsbCBiZSBleHBvcnRlZC4KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX25vUGx1Z2luX3RleHQ9Tm8gbWV0aG9kIHBsdWctaW4gaGFzIGJlZW4gc2VsZWN0ZWQuCi1zcGVjaWZ5UGF0aFBhZ2VfdGl0bGU9U3BlY2lmeSBleHBvcnQgZGlyZWN0b3J5Ci1zcGVjaWZ5UGF0aFBhZ2VfZGVzYz1TcGVjaWZ5IGEgZGVzdGluYXRpb24gZGlyZWN0b3J5IHRvIHN0b3JlIHRoZSBleHBvcnRlZCBtZXRob2QgcGx1Zy1pbnMuCi1TYXZlUGx1Z2luUGFnZV9kZXNjPUV4cG9ydCB0aGUgc2VsZWN0ZWQgUGx1Z2lucyBhbmQgQ29uZmlndXJhdGlvbnMgdG8gdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi1FeHBvcnRQbHVnaW5XaXphcmRfdGl0bGU9RXhwb3J0IE1ldGhvZCBQbHVnLWluIFdpemFyZCBFcnJvcgotRXhwb3J0UGx1Z2luRXJyb3JfbXNnPUlVUEUwMDAwRTogRXJyb3IgZW5jb3VudGVyZWQgaW4gZXhwb3J0aW5nCi0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBFcnJvciBEaWFsb2cKLWV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPUV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24KLWV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX21zZz1JVVBFMDAwMUU6IFRoZSBleHBvcnQgb3BlcmF0aW9uIGNhbm5vdCBwcm9jZWVkLgotCi0jIFByb2dyZXNzIE1lc3NhZ2VzCi1hbmFseXppbmdDb25maWdUYXNrX25hbWU9QW5hbHl6aW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbi4uLgotCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4KLUNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMD1FeHBvcnRpbmcgY29uZmlndXJhdGlvbi4uLgotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cxPUV4cG9ydCBkb25lLgotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMT1DaGVja2luZyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLi4uXG4KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzI9Tm8gY29uaWd1cmF0aW9uIHNlbGVjdGVkLlxuCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8zPVRoZXJlIGlzIG5vIHByb2JsZW0gaW4gdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uXG4KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzQ9VGhlcmUgYXJlIHswfSBwcm9ibGVtcyBpbiB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4gXG5Zb3UgY2FuIG9wZW4gdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yIGFuZCBmaXggdGhvc2UgcHJvYmxlbXMuIFxuT3IgeW91IGNhbiBjaG9vc2UgdG8gaWdub3JlIHRoZXNlIHByb2JsZW1zIGFuZCBjb250aW51ZS4KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9jaGVja2luZz1DaGVja2luZyBjb25maWd1cmF0aW9uLCBwbGVhc2Ugd2FpdC4uLgotRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZV90aXRsZT1DaG9vc2UgTWV0aG9kIENvbmZpZ3VyYXRpb24KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9icm93c2U9QnJvd3NlLi4uCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGVmYXVsdF9kaXI9VXNlIGRlZmF1bHQgZGlyZWN0b3J5Ci1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwPUV4cG9ydGluZyBjb25maWd1cmF0aW9uLi4uCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyPUlVUEUwMDAyRTogRXhwb3J0IGZhaWxlZDogRXJyb3IgbG9hZGluZyBsaWJyYXJ5Ci1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c0PUlVUEUwMDAzRTogRXhwb3J0IGZhaWxlZDogRXJyb3IgY29weWluZyBsaWJyYXJ5Ci1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RTogRXhwb3J0IGZhaWxlZDogRXJyb3IgbWFraW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbiBjbG9zdXJlCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c5PUlVUEUwMDA1RTogRXhwb3J0IGZhaWxlZDogRXJyb3Igc2F2aW5nIGxpYnJhcnkKLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPU5hbWU6Ci1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGlyPURpcmVjdG9yeToKLUV4cG9ydFBsdWdpbldpemFyZF9lcnJvcj1FcnJvcgotRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlPURlZmF1bHQgVGl0bGUKLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjPURlZmF1bHQgZGVzY3JpcHRpb246Ci1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzA9RXhwb3J0aW5nIHBsdWctaW5zLi4uCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE9Q3JlYXRpbmcgZXhwb3J0IGRpcmVjdG9yeS4uLgotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyPUNvcHlpbmcgZmlsZXMuLi4KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMz1HZW5lcmF0aW5nIGxpYnJhcnkgYW5kIHJlc291cmNlIGZpbGUuLi4KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHND1FeHBvcnQgZG9uZS4KLVNhdmVMaWJyYXJ5UGFnZV90aXRsZT1FeHBvcnQgTWV0aG9kIFBsdWctaW4KLVNhdmVQbHVnaW5QYWdlX2xhYmVsX25hbWU9RXhwb3J0IG5hbWU6Ci1TYXZlTGlicmFyeVBhZ2VfZGVzYz1FeHBvcnQgdGhlIHNlbGVjdGVkIG1ldGhvZCBwbHVnLWlucyBhbmQgYXNzb2NpYXRlZCBjb25maWd1cmF0aW9ucwotRXhwb3J0UGx1Z2luV2l6YXJkX01TRzE9QW5hbHl6aW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbi4uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzYjZhYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBhY3RpdmF0b3IgZm9yIG1hbmFnaW5nIHRoZSBFeHBvcnQgcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0Jhc2VFeHBvcnRTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQmFzZUV4cG9ydFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzY4MDcxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQmFzZUV4cG9ydFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0aGUgRXhwb3J0IFNlcnZpY2UuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VFeHBvcnRTZXJ2aWNlIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGV4cG9ydEZpbGUgPSAiZXhwb3J0LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGxpYnJhcnlGaWxlID0gImxpYnJhcnkueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIExpc3Qgc2VsZWN0ZWRJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZFBsdWdpbk5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJZFNlbGVjdGVkKFN0cmluZyB1cmkpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHNlbGVjdGVkSWRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCWlmICh1cmkuaW5kZXhPZihpZCkgPj0gMCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGVkUGx1Z2luUmVzb3VyY2UoU3RyaW5nIHVyaSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc2VsZWN0ZWRQbHVnaW5OYW1lcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcGx1Z2luX25hbWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlpZiAodXJpLnN0YXJ0c1dpdGgocGx1Z2luX25hbWUgKyAiLyIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXNvdXJjZVNlbGVjdGVkKFN0cmluZyB1cmkpIHsKLQkJaWYgKGlzSWRTZWxlY3RlZCh1cmkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gaXNTZWxlY3RlZFBsdWdpblJlc291cmNlKHVyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpYnJhcnlEb2N1bWVudCBwcm9jZXNzTGlicmFyeUZpbGUoRmlsZSBzb3VyY2UsIEZpbGUgdGFyZ2V0KSB7Ci0JCXRyeSB7Ci0JCQlMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgTGlicmFyeURvY3VtZW50KHNvdXJjZSk7Ci0KLQkJCS8vIFJlbG9hZCB0aGUgZWxlbWVudCBtYXBwaW5nLgotCQkJTm9kZUxpc3Qgbm9kZXMgPSBkb2N1bWVudC5nZXRQbHVnaW5zKCk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2hyZWYpOwotCQkJCWlmICghaXNJZFNlbGVjdGVkKHVyaSkpIHsKLQkJCQkJZG9jdW1lbnQucmVtb3ZlUGx1Z2luKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFJlbW92ZSB0aGUgdW5uZWVkZWQgY29uZmlndXJhdGlvbnMuCi0JCQlub2RlcyA9IGRvY3VtZW50LmdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlpID0gMDsKLQkJCXdoaWxlIChpIDwgbm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCQkKLQkJCQkvLyAxNDIzNzkgLSB1cGRhdGUgcGx1Z2luIGltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHRvIG1hdGNoIHdpdGggdGhlIG5ldyBmaWxlIGZvcm1hdAotCQkJCS8vIGNvbmZpZ3VyYXRpb24gaXMgc2F2ZWQgYXMgc2VwZXJhdGUgcmVzb3VyY2Ugc2luY2UgMS4wbTMKLQkJCQlTdHJpbmcgdXJpID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaHJlZik7Ci0JCQkJaWYgKCFpc0lkU2VsZWN0ZWQodXJpKSkgewotCQkJCQlkb2N1bWVudC5yZW1vdmVDb25maWd1cmF0aW9uKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFJlbG9hZCB0aGUgZWxlbWVudCBtYXBwaW5nLgotCQkJbm9kZXMgPSBkb2N1bWVudC5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCk7Ci0JCQlpID0gMDsKLQkJCXdoaWxlIChpIDwgbm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCQlTdHJpbmcgaWQgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9pZCk7Ci0JCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX3VyaSk7Ci0JCQkJaWYgKCFpc0lkU2VsZWN0ZWQoaWQpCi0JCQkJCQkmJiAhaXNSZXNvdXJjZVNlbGVjdGVkKFVSTERlY29kZXIuZGVjb2RlKHVyaSwgIlVURi04IikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZG9jdW1lbnQucmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW5vZGVzID0gZG9jdW1lbnQuZ2V0UmVzb3VyY2VTdWJNYW5hZ2VycygpOwotCQkJaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2hyZWYpOwotCQkJCWlmICghaXNSZXNvdXJjZVNlbGVjdGVkKHVyaSkpIHsKLQkJCQkJZG9jdW1lbnQucmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUxpc3QgcGx1Z2luTGlzdCA9ICBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCQlkb2N1bWVudC5zdG9yZUV4dHJhSW5mbyhwbHVnaW5MaXN0KTsKLQkJCQotCQkJZG9jdW1lbnQuc2F2ZUFzKHRhcmdldC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkKLQkJCXJldHVybiBkb2N1bWVudDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvbkV4cG9ydERhdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uRXhwb3J0RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNWJmOWQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uRXhwb3J0RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5TG9jYXRpb25EYXRhOwotCi0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSBpbnB1dCBkYXRhIHJlcXVpcmVkIHRvIGV4cG9ydCBhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIHsKLQotCXB1YmxpYyBib29sZWFuIGV4cG9ydE9uZUNvbmZpZzsKLQotCXB1YmxpYyBib29sZWFuIGV4cG9ydENvbmZpZ1NwZWNzOwotCi0JcHVibGljIExpc3Qgc2VsZWN0ZWRDb25maWdzOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoZSBicm9rZW4gcmVmZXJlbmNlcyBzaG91bGQgYmUgcmVtb3ZlZCBvciBub3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQnJva2VuUmVmZXJlbmNlcyA9IGZhbHNlOwotCi0JcHVibGljIExpYnJhcnlMb2NhdGlvbkRhdGEgbGxEYXRhID0gbnVsbDsKLQotCXB1YmxpYyBTdHJpbmcgZXJyb3JNc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5lcyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEoKSB7Ci0JCWxsRGF0YSA9IG5ldyBMaWJyYXJ5TG9jYXRpb25EYXRhKCk7Ci0JCWxsRGF0YS5sb2FkRnJvbVByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4ZTQ4OGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklDb25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25DbG9zdXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBFeHBvcnRzIGEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjbHVkZXMgPSAiLmNvcHlhcmVhLmRhdCwgKiovLmNvcHlhcmVhLmRhdCwgLmNvcHlhcmVhLmRiLCAqKi8uY29weWFyZWEuZGIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UoQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQkKLQkvKioKLQkgKiBSdW4gdG8gZXhwb3J0IGEgY29uZmlndXJhdGlvbiBjbG9zdXJlCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKGRhdGEuc2VsZWN0ZWRDb25maWdzID09IG51bGwKLQkJCQkJfHwgZGF0YS5zZWxlY3RlZENvbmZpZ3Muc2l6ZSgpID09IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGV4cG9ydExpYlBhdGggPSBkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKTsKLQkJCUZpbGUgZXhwb3J0TGliRm9sZGVyID0gbmV3IEZpbGUoZXhwb3J0TGliUGF0aCk7Ci0JCQlpZiAoIWV4cG9ydExpYkZvbGRlci5leGlzdHMoKSkgewotCQkJCWV4cG9ydExpYkZvbGRlci5ta2RpcigpOwotCQkJfQotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgZGF0YS5zZWxlY3RlZENvbmZpZ3MKLQkJCQkJLmdldCgwKTsKLQkJCWV4cG9ydENvbmZpZyhjb25maWcuZ2V0TmFtZSgpLCBleHBvcnRMaWJGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCksCi0JCQkJCW1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4cG9ydCBhIGNvbmZpZ3VyYXRpb24gY2xvc3VyZQotCSAqLwotCXB1YmxpYyB2b2lkIGV4cG9ydENvbmZpZyhTdHJpbmcgc2VsZWN0ZWRDb25maWdOYW1lLCBTdHJpbmcgZmlsZVBhdGgsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIG5lZWQgdG8gZGlzYWJsZSB0aGUgd29ya3NwYWNlIHJlZnJlc2hpbmcKLQkJYm9vbGVhbiByZWZyZXNoID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmlzRW5hYmxlZCgpOwotCQl0cnkgewotCQkJaWYgKHJlZnJlc2gpIHsKLQkJCQkvLyBkaXNhYmxlIHJlc291cmNlIHJlZnJlc2hpbmcgZHVyaW5nIGltcG9ydAotCQkJCS8vCi0JCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJZG9FZXhwb3J0Q29uZmlnKHNlbGVjdGVkQ29uZmlnTmFtZSwgZmlsZVBhdGgsIG1vbml0b3IpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlZnJlc2gpIHsKLQkJCQkvLyByZS1lbmFibGUgcmVzb3VyY2UgcmVmcmVzaGluZwotCQkJCS8vCi0JCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9FZXhwb3J0Q29uZmlnKFN0cmluZyBzZWxlY3RlZENvbmZpZ05hbWUsIFN0cmluZyBmaWxlUGF0aCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTWV0aG9kTGlicmFyeSBjdXJyZW50TGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCXRyeSB7Ci0JCQkvLyBMb2FkIHRoZSB3aG9sZSBNZXRob2QgTGlicmFyeS4KLQkJCUxpYnJhcnlVdGlsLmxvYWRBbGwoY3VycmVudExpYik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgbG9hZGluZyBsaWJyYXJ5IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRhdGEuZXJyb3JNc2cgPSBFeHBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMjsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gQ29weSB0aGUgY3VycmVudCBsaWJyYXJ5IHRvIGEgbmV3IGxpYnJhcnksCi0JCS8vIHNpbmNlIHdlIG5lZWQgdG8gbWFrZSBjaGFuZ2VzIHdoZW4gcGFja2FnaW5nIHRoZSBuZXcgbGlicmFyeS4KLQkJTWV0aG9kTGlicmFyeSBuZXdMaWJyYXJ5ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW5ld0xpYnJhcnkgPSAoTWV0aG9kTGlicmFyeSkgRWNvcmVVdGlsLmNvcHkoY3VycmVudExpYik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJZGF0YS5lcnJvck1zZyA9IEV4cG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c0OyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlJQ29uZmlndXJhdGlvbkNsb3N1cmUgY2xvc3VyZSA9IG51bGw7Ci0JCUlMaWJyYXJ5TWFuYWdlciBsaWJNZ3IgPSBudWxsOwotCQl0cnkgewotCQkJLy8gRGV0YWNoIHRoZSBuZXcgbGlicmFyeSBmcm9tIHRoZSBjdXJyZW50IHJlc291cmNlIHNvIGl0IGNhbiBiZQotCQkJLy8gYWRkZWQgdG8gYSBuZXcgTGlicmFyeSBQcm9jZXNzb3IgaW5zdGFuY2UuCi0JCQlMaWJyYXJ5VXRpbC5kZXRhY2hGcm9tUmVzb3VyY2UobmV3TGlicmFyeSk7Ci0KLQkJCS8vIENyZWF0ZSBhIG5ldyBMaWJyYXJ5IE1hbmFnZXIgYW5kIGNyZWF0ZSBhIG5ldyByZXNvdXJjZSBmb3IgdGhlCi0JCQkvLyBuZXcgbGlicmFyeS4KLQkJCS8vIFRPRE86IFVwZGF0ZSB0aGUgVUkgdG8gcHJvbXB0IGZvciB0aGUgbWV0aG9kIGxpYnJhcnkgdHlwZS4KLQkJCU1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJcGFyYW1zLnB1dCgibGlicmFyeS5wYXRoIiwgZmlsZVBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCS8vIHRoaXMgd2lsbCBub3Qgd29yayBzaW5jZSB0aGlzIHdpbGwgbWVzcyB1cCB0aGUgbWFpbiBsaWJyYXJ5Ci0JCQkvLyBKaW5odWEgWGkgMDcvMTMvMDYKLS8vCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotLy8JCQkJCS5jcmVhdGVNZXRob2RMaWJyYXJ5KCJsaWJyYXJ5LnhtaSIsICJ4bWkiLCBwYXJhbXMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLS8vCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZXBsYWNlTWV0aG9kTGlicmFyeShsaWJyYXJ5LAotLy8JCQkJCW5ld0xpYnJhcnkpOwotLy8JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KG5ld0xpYnJhcnkpOwotCi0JCQlTdHJpbmcgbmFtZSA9ICJsaWJyYXJ5LnhtaSI7CS8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB0eXBlID0gInhtaSI7CQkvLyROT04tTkxTLTEkCi0JCQlsaWJNZ3IgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5jcmVhdGVMaWJyYXJ5TWFuYWdlcih0eXBlKTsJCi0JCQlsaWJNZ3IuY3JlYXRlTWV0aG9kTGlicmFyeShuYW1lLCBwYXJhbXMpOwotCQkJbGliTWdyLnNldE1ldGhvZExpYnJhcnkobmV3TGlicmFyeSk7Ci0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldExpYnJhcnlNYW5hZ2VyKGxpYk1ncik7Ci0JCQkKLQkJCS8vIEJlZ2luIHBhY2thZ2luZyB0aGUgbmV3IGxpYnJhcnkgZm9yIGV4cG9ydC4KLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKG5ld0xpYnJhcnksIHNlbGVjdGVkQ29uZmlnTmFtZSk7Ci0KLQkJCS8vIFZhbGlkYXRlIHRoZSBjb25maWd1cmF0aW9uIGFuZCBtYWtlIHN1cmUgdGhlIGdsb2JhbCBwYWNrYWdlcyBhcmUKLQkJCS8vIHNlbGVjdGVkLiBJZiBnbG9iYWwgcGFja2FnZXMgYXJlIG1pc3NpbmcsIHRoZSBleHBvcnRlZCBsaWJyYXJ5Ci0JCQkvLyBjYW4ndCBiZSBsb2FkZWQuCi0JCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQotCQkJY2xvc3VyZSA9IG5ldyBDb25maWd1cmF0aW9uQ2xvc3VyZShjb25maWcpOwotCQkJY2xvc3VyZS5wYWNrYWdlTGlicmFyeShkYXRhLnJlbW92ZUJyb2tlblJlZmVyZW5jZXMpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJIkVycm9yIG1ha2luZyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gY2xvc3VyZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlkYXRhLmVycm9yTXNnID0gRXhwb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzE7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGNsb3N1cmUgIT0gbnVsbCkKLQkJCQljbG9zdXJlLmRpc3Bvc2UoKTsKLQkJCWlmICggbGliTWdyICE9IG51bGwgKSB7Ci0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaWJyYXJ5TWFuYWdlcihsaWJNZ3IpOwotCQkJCWxpYk1nci5jbG9zZU1ldGhvZExpYnJhcnkoKTsKLQkJCQlsaWJNZ3IuZGlzcG9zZSgpOwotCQkJfQotCQkJCi0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJTGlicmFyeVV0aWwuc2F2ZUFsbChuZXdMaWJyYXJ5KTsKLQotCQkJLy8gdGhlIGZpcnN0IHJvdW5kIG9mIHNhdmUgd2lsbCBjcmVhdGUgdGhlIHJlc291cmNlIHN0cnVjdHVyZSwKLQkJCS8vIG5lZWQgdG8gc2F2ZSBhZ2FpbiB0byBtYWtlIHN1cmUgYWxsIHJlZmVyZW5jZXMgYXJlIHNhdmVkLgotCQkJLy8gVGhpcyBzdGVwIGlzIGNyaXRpY2FsIHNpbmNlIHRoZSBmaXJzdCByb3VuZCBvbmx5IGNyZWF0ZWQgdGhlIGRhdGEKLQkJCS8vIHN0cnVjdHVyZQotCQkJLy8gc29tZSBvZiB0aGUgY3Jvc3MtcmVmZXJlbmNlZCBlbGVtZW50cyBtaWdodCBiZSBsb3N0IG9uIHRoZSBmaXJzdAotCQkJLy8gc2F2aW5nCi0JCQkvLyBmb3IgZXhhbXBsZSwgd2hlbiBjcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiB3aXRoIHJlZmVyZW5jZXMKLQkJCS8vIHRvIGEgbmV3IHBsdWdpbiwKLQkJCS8vIHdoaWNoIGFyZSBub3Qgc2F2ZWQgeWV0LCB0aG9zZSByZWZlcmVuY2VzIHdpbGwgYmUgbG9zdC4KLQkJCS8vIDE0NTg5MSAtIEltcG9ydCBDb25maWd1cmF0aW9uOiBkZWZhdWx0IGNvbmZpZyBpcyBsb3NzIGFmdGVyCi0JCQkvLyBpbXBvcnQKLQkJCUxpYnJhcnlVdGlsLnNhdmVBbGwobmV3TGlicmFyeSk7Ci0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCSJFcnJvciBzYXZpbmcgbGlicmFyeSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlkYXRhLmVycm9yTXNnID0gRXhwb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGNsb3N1cmUgIT0gbnVsbCkKLQkJCQljbG9zdXJlLmRpc3Bvc2UoKTsKLQkJCWlmICggbGliTWdyICE9IG51bGwgKSB7Ci0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaWJyYXJ5TWFuYWdlcihsaWJNZ3IpOwotCQkJCWxpYk1nci5jbG9zZU1ldGhvZExpYnJhcnkoKTsKLQkJCQlsaWJNZ3IuZGlzcG9zZSgpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gQ29weSB0aGUgcmVzb3VyY2UgZmlsZXMgaW4gdGhlIGN1cnJlbnQgbGlicmFyeSB0byB0aGUgbmV3IGxpYnJhcnkuCi0JCS8vIEZvciBzaW1wbGljaXR5IHNha2UsIGNvcHkgYWxsIHJlc291cmNlIGZpbGVzIGlmIHRoZSBmaWxlcyBkbyBub3QKLQkJLy8gZXhpc3QgaW4gdGhlIHRhcmdldCBsaWJyYXJ5IG9yIGlmIHRoZSBmaWxlcyBhcmUgbmV3ZXIKLQkJLy9TdHJpbmcgaW5jbHVkZXMgPSAicmVzb3VyY2VzLyoqLCAqKi9yZXNvdXJjZXMvKioiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBpbmNsdWRlcyA9ICJyZXNvdXJjZXMvKiosICoqL3Jlc291cmNlcy8qKiwgKiovZGlhZ3JhbS54bWkiOyAvLyROT04tTkxTLTEkCi0KLQkJRmlsZSBzcmNEaXIgPSBMaWJyYXJ5VXRpbC5nZXRMaWJyYXJ5Um9vdFBhdGgoY3VycmVudExpYik7Ci0JCUZpbGUgZGVzdERpciA9IExpYnJhcnlVdGlsLmdldExpYnJhcnlSb290UGF0aChuZXdMaWJyYXJ5KTsKLQotCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihzcmNEaXIsIGRlc3REaXIsIGluY2x1ZGVzLCBleGNsdWRlcyk7Ci0KLQkJLy8gQ2xvc2UgdGhlIG5ld2x5IGNyZWF0ZWQgbGlicmFyeS4KLQkJaWYgKGNsb3N1cmUgIT0gbnVsbCkKLQkJCWNsb3N1cmUuZGlzcG9zZSgpOwotCQlpZiAoIGxpYk1nciAhPSBudWxsICkgewotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaWJyYXJ5TWFuYWdlcihsaWJNZ3IpOwotCQkJbGliTWdyLmNsb3NlTWV0aG9kTGlicmFyeSgpOwotCQkJbGliTWdyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uU3BlYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25TcGVjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhZGRjOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25TcGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBNb2RlbHMgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25TcGVjIHsKLQotCXB1YmxpYyBTdHJpbmcgbmFtZTsKLQotCXB1YmxpYyBTdHJpbmcgZ3VpZDsKLQotCXB1YmxpYyBTdHJpbmcgdmVyc2lvbjsKLQotCXB1YmxpYyBTdHJpbmcgYnJpZWZfZGVzYzsKLQotCXB1YmxpYyBMaXN0IHBsdWdpbklkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBMaXN0IHBhY2thZ2VJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgTGlzdCB2aWV3SWRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblNwZWMoKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjVjNmU3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLQotLyoqCi0gKiBFeHBvcnRzIGEgbGlicmFyeSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyMTUzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlIGV4dGVuZHMgQmFzZUV4cG9ydFNlcnZpY2UgewotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogUnVuIHRvIGV4cG9ydCBhIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhaXRvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChkYXRhLnNlbGVjdGVkQ29uZmlncyA9PSBudWxsIHx8IGRhdGEuc2VsZWN0ZWRDb25maWdzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzApOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHRoZSBleHBvcnQgbGlicmFyeSBmb2xkZXIuCi0JCUZpbGUgbGliRm9sZGVyOwotCQlGaWxlIGV4cG9ydExpYkZvbGRlcjsKLQotCQlTdHJpbmcgZXhwb3J0TGliUGF0aCA9IChuZXcgRmlsZShkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKSkpLmdldEFic29sdXRlUGF0aCgpOwotCQlleHBvcnRMaWJGb2xkZXIgPSBuZXcgRmlsZShleHBvcnRMaWJQYXRoKTsKLQkJaWYgKCFleHBvcnRMaWJGb2xkZXIuZXhpc3RzKCkpIHsKLQkJCWV4cG9ydExpYkZvbGRlci5ta2RpcigpOwotCQl9Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgZGF0YS5zZWxlY3RlZENvbmZpZ3MKLQkJCQkuZ2V0KDApOwotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IChNZXRob2RMaWJyYXJ5KSBjb25maWcuZUNvbnRhaW5lcigpOwotCQlVUkkgdXJpID0gbGliLmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQlTdHJpbmcgcGF0aCA9IHVyaS50b0ZpbGVTdHJpbmcoKTsKLQkJbGliRm9sZGVyID0gKG5ldyBGaWxlKHBhdGgpKS5nZXRQYXJlbnRGaWxlKCk7Ci0KLQkJLy8gUHJlcGFyZSB0aGUgaWQgc2VsZWN0aW9ucywKLQkJZ2V0U2VsZWN0ZWRJZHMoZGF0YS5zZWxlY3RlZENvbmZpZ3MpOwotCi0JCS8vIExvYWQgdGhlIGxpYnJhcnkueG1pIGFuZCByZW1vdmUgdW5uZWVkZWQgZWxlbWVudHMuCi0JCUxpYnJhcnlEb2N1bWVudCBkb2N1bWVudCA9IHByb2Nlc3NMaWJyYXJ5RmlsZShuZXcgRmlsZShsaWJGb2xkZXIsIGxpYnJhcnlGaWxlKSwgbmV3IEZpbGUoCi0JCQkJZXhwb3J0TGliRm9sZGVyLCBleHBvcnRGaWxlKSk7Ci0KLQkJaWYgKCBkb2N1bWVudCAhPSBudWxsICkgewotCQkJLy8gY29weSB0aGUgY29uaWZ1cmF0aW9uIGZpbGVzCi0JCQkvLyAxNDMwMzMgLSB1cGRhdGUgY29uZmlnIHNwZWNzJyBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZyB0byBtYXRjaCB3aXRoIHRoZSBuZXcgZmlsZSBmb3JtYXQKLQkJCWNvcHlDb25maWd1cmF0aW9uRmlsZXMoZG9jdW1lbnQsIGxpYkZvbGRlciwgZXhwb3J0TGliRm9sZGVyKTsKLQkJfQotCQkKLQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cxKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvcHlDb25maWd1cmF0aW9uRmlsZXMoTGlicmFyeURvY3VtZW50IGRvY3VtZW50LCBGaWxlIGxpYkZvbGRlciwgRmlsZSBleHBvcnRMaWJGb2xkZXIpIHsKLQkJLy8gMTQzMDMzIC0gdXBkYXRlIGNvbmZpZyBzcGVjcycgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgdG8gbWF0Y2ggd2l0aCB0aGUgbmV3IGZpbGUgZm9ybWF0Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLnNlbGVjdGVkQ29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3VpZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JCQlTdHJpbmcgdXJpID0gZG9jdW1lbnQuZ2V0UmVzb3VyY2VVcmkoZ3VpZCk7Ci0JCQlpZiAodXJpID09IG51bGwpIHsKLQkJCQlVUkkgcmVzVXJpID0gY29uZmlnLmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQkJCXVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FICsgRmlsZS5zZXBhcmF0b3IgKyByZXNVcmkubGFzdFNlZ21lbnQoKTsKLQkJCQl1cmkgPSBkb2N1bWVudC5kZWNvZGVVcmkodXJpKTsKLQkJCX0KLQkJCWlmICggdXJpICE9IG51bGwgKSB7Ci0JCQkJRmlsZSBzcmMgPSBuZXcgRmlsZShsaWJGb2xkZXIsIHVyaSk7Ci0JCQkJRmlsZSB0YXJnZXQgPSAgbmV3IEZpbGUoZXhwb3J0TGliRm9sZGVyLCB1cmkpOwotCQkJCVJlc291cmNlSGVscGVyLmNvcHlGaWxlKHNyYywgdGFyZ2V0KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ2V0U2VsZWN0ZWRJZHMoTGlzdCBjb25maWdzKSB7Ci0JCXNlbGVjdGVkSWRzLmNsZWFyKCk7Ci0JCXNlbGVjdGVkUGx1Z2luTmFtZXMuY2xlYXIoKTsKLQotCQkvLyBHZXQgc2VsZWN0ZWQgY29uZmlnIGlkcy4KLQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3VpZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JCQlpZiAoc2VsZWN0ZWRJZHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gQWRkIHRoZSBjb25maWd1cmF0aW9uLgotCQkJc2VsZWN0ZWRJZHMuYWRkKGd1aWQpOwotCi0JCQkvLyBGb3IgZWFjaCBjb25maWd1cmF0aW9uLCB3ZSBuZWVkIHRvIHNhdmUgdGhlIG1ldGhvZCBwbHVnaW4gaWRzIGFuZAotCQkJLy8gbWV0aG9kIHBhY2thZ2UgaWRzIHNvIHRoYXQgdGhlaXIgZW50cmllcyBpbiB0aGUgcmVzb3VyY2UgZmlsZSBjYW4KLQkJCS8vIGJlIGtlcHQuCi0JCQlMaXN0IHJlZnMgPSBjb25maWcuZUNyb3NzUmVmZXJlbmNlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdHIgPSByZWZzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdHIubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IG8gaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCWd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpIG8pLmdldEd1aWQoKTsKLQkJCQkJaWYgKCFzZWxlY3RlZElkcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJc2VsZWN0ZWRJZHMuYWRkKGd1aWQpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJRXhwb3J0UGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmV4cGVjdGVkIGVsZW1lbnQgdHlwZSAnIiArICgoTWV0aG9kRWxlbWVudCkgbykuZ2V0VHlwZSgpLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgIicgaW4gY29uZmlndXJhdGlvbiAnIiArIGNvbmZpZy5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvRGlhZ3JhbUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9EaWFncmFtSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZWM4ODRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9EaWFncmFtSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgZGlhZ3JhbSBleHBvcnQvaW1wb3J0Ci0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSGFuZGxlciB7Ci0JCi0JLy9UbyBkbzogbmVlZCB0byBjb25zaWRlciBlbGVtZW50IHJlbmFtZSBpc3N1ZS4gCi0JLy8JCSAtPiBSZXNvdmxlIHRoZSBpbnZvbHZlZCBmaWxlIG5hbWVzIGFmdGVyIGFsbCByZXNvdXJjZSBuYW1lcyBhcmUgc2V0dGxlZC4KLQkvLwkJIC0+IExldCBhIHN1YiBjbGFzcyB0byB0YWtlIG9mIGl0PwotCi0JcHJpdmF0ZSBGaWxlIHNvdXJjZUxpYlJvb3Q7Ci0JcHJpdmF0ZSBGaWxlIHRhcmdldExpYlJvb3Q7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXBFbnRyeVZhbHVlPiBlbGVtZW50TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXBFbnRyeVZhbHVlPigpOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQkJCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8JCi0JcHVibGljIERpYWdyYW1IYW5kbGVyKEZpbGUgc291cmNlTGliUm9vdCwgRmlsZSB0YXJnZXRMaWJSb290KSB7Ci0JCXRoaXMuc291cmNlTGliUm9vdCA9IHNvdXJjZUxpYlJvb3Q7Ci0JCXRoaXMudGFyZ2V0TGliUm9vdCA9IHRhcmdldExpYlJvb3Q7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBuZWVkVG9Qcm9jZXNzKE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlib29sZWFuIGIgPSBlbGVtIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4gfHwKLQkJCQkJCQkJZWxlbSBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzczsKLQkJcmV0dXJuIGI7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWdpc3RlckVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCXJlZ2lzdGVyRWxlbWVudChlbGVtLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW0sIGJvb2xlYW4gcHJvY2Vzc0VudHJ5KSB7Ci0JCWlmICghIG5lZWRUb1Byb2Nlc3MoZWxlbSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZWxlbWVudE1hcC5jb250YWluc0tleShlbGVtLmdldEd1aWQoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTWFwRW50cnlWYWx1ZSBtYXBFbnRyeVZhbHVlID0gbmV3IE1hcEVudHJ5VmFsdWUoKTsKLQkJbWFwRW50cnlWYWx1ZS5lbGVtZW50ID0gZWxlbTsKLQkJZWxlbWVudE1hcC5wdXQoZWxlbS5nZXRHdWlkKCksIG1hcEVudHJ5VmFsdWUpOwkJCi0JCQotCQlpZiAocHJvY2Vzc0VudHJ5KSB7Ci0JCQlwcm9jZXNzRW50cnkoZWxlbSwgbWFwRW50cnlWYWx1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcG9zdFJlZ2lzdGVyRWxlbWVudHMoKSB7Ci0JCWZvciAoSXRlcmF0b3I8TWFwRW50cnlWYWx1ZT4gaXQgPSBlbGVtZW50TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcEVudHJ5VmFsdWUgdmFsdWUgPSBpdC5uZXh0KCk7Ci0JCQlwcm9jZXNzRW50cnkodmFsdWUuZWxlbWVudCwgdmFsdWUpOwotCQl9CQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRW50cnkoTWV0aG9kRWxlbWVudCBlbGVtLCBNYXBFbnRyeVZhbHVlIG1hcEVudHJ5VmFsdWUpIHsKLQkJRmlsZVtdIGZpbGVzID0gZ2V0RmlsZXMoZWxlbSk7Ci0JCUZpbGUgc291cmNlRmlsZSA9IGZpbGVzWzBdOwotCQlGaWxlIHRhcmdldEZpbGUgPSBmaWxlc1sxXTsKLQotCQlpZiAoc291cmNlRmlsZSAhPSBudWxsICYmIHNvdXJjZUZpbGUuZXhpc3RzKCkpIHsKLQkJCW1hcEVudHJ5VmFsdWUuc291cmNlRmlsZSA9IHNvdXJjZUZpbGU7Ci0JCX0KLQotCQlpZiAodGFyZ2V0RmlsZS5leGlzdHMoKSkgewotCQkJaWYgKG1hcEVudHJ5VmFsdWUuc291cmNlRmlsZSA9PSBudWxsIHx8IG5lZWRDb3B5KG1hcEVudHJ5VmFsdWUuc291cmNlRmlsZSwgdGFyZ2V0RmlsZSkpIHsKLQkJCQltYXBFbnRyeVZhbHVlLnRhcmdldEZpbGUgPSB0YXJnZXRGaWxlOwotCQkJfQotCQkJbWFwRW50cnlWYWx1ZS5leGlzdGluZyA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobWFwRW50cnlWYWx1ZS5zb3VyY2VGaWxlICE9IG51bGwpIHsKLQkJCQltYXBFbnRyeVZhbHVlLnRhcmdldEZpbGUgPSB0YXJnZXRGaWxlOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG1hcEVudHJ5VmFsdWU6ICIpOwkJCQkJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKG1hcEVudHJ5VmFsdWUudG9EZWJ1Z1N0cmluZygiTEQ+ICIpKTsJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldE1vZGlmaWVkRmlsZXMoKSB7Ci0JCUxpc3QgcmV0ID0gbmV3IEFycmF5TGlzdCgpOwkJCi0JCWZvciAoSXRlcmF0b3I8TWFwRW50cnlWYWx1ZT4gaXQgPSBlbGVtZW50TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcEVudHJ5VmFsdWUgdmFsdWUgPSBpdC5uZXh0KCk7Ci0JCQlpZiAodmFsdWUuZXhpc3RpbmcgJiYgdmFsdWUudGFyZ2V0RmlsZSAhPSBudWxsKSB7Ci0JCQkJcmV0LmFkZCh2YWx1ZS50YXJnZXRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogY29weSBhbGwgdGhlIGZpbGVzIHRvIHRoZSBkZXN0aW5hdGlvbgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCWV4ZWN1dGVfKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZXhlY3V0ZV8oKSB7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPE1hcEVudHJ5VmFsdWU+IGl0ID0gZWxlbWVudE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWFwRW50cnlWYWx1ZSB2YWx1ZSA9IGl0Lm5leHQoKTsKLQkJCWlmICh2YWx1ZS50YXJnZXRGaWxlID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAodmFsdWUuc291cmNlRmlsZSAhPSBudWxsKSB7Ci0JCQkJRmlsZSBwYXJlbnRGaWxlID0gdmFsdWUudGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJUmVzb3VyY2VIZWxwZXIuY29weUZpbGUodmFsdWUuc291cmNlRmlsZSwgdmFsdWUudGFyZ2V0RmlsZSk7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ6IEZpbGUgY29waWVkOiAiICsgdmFsdWUuc291cmNlRmlsZSk7CS8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXZhbHVlLnRhcmdldEZpbGUuZGVsZXRlKCk7Ci0JCQl9Ci0JCX0JCi0JfQotCQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBjb3B5IGFjdGlvbiBpcyBuZWVkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG5lZWRDb3B5KEZpbGUgc291cmNlLCBGaWxlIGRlc3QpIHsKLQkJYm9vbGVhbiByZXQgPSB0cnVlOwotCQlpZiAoZGVzdC5leGlzdHMoKSkgewotCQkJcmV0ID0gKGRlc3QubGFzdE1vZGlmaWVkKCkgIT0gc291cmNlLmxhc3RNb2RpZmllZCgpKQotCQkJCQl8fCAoZGVzdC5sZW5ndGgoKSAhPSBzb3VyY2UubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXN0YXRpYyBjbGFzcyBNYXBFbnRyeVZhbHVlIHsKLQotCQlwdWJsaWMgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCQlwdWJsaWMgRmlsZSBzb3VyY2VGaWxlOwotCQlwdWJsaWMgRmlsZSB0YXJnZXRGaWxlOwotCQlwdWJsaWMgYm9vbGVhbiBleGlzdGluZyA9IGZhbHNlOwkJCi0JCQotCQlwdWJsaWMgU3RyaW5nIHRvRGVidWdTdHJpbmcoU3RyaW5nIHByb21wdCkgewotCQkJU3RyaW5nIHN0ciA9IHByb21wdCArICJlbGVtZW50OiAiICsgZWxlbWVudC5nZXROYW1lKCk7CQkvLyROT04tTkxTLTEkCi0JCQlzdHIgKz0gIlxuIiArIHByb21wdCArICJzb3VyY2VGaWxlOiAiICsgc291cmNlRmlsZTsJCS8vJE5PTi1OTFMtMSQKLQkJCXN0ciArPSAiXG4iICsgcHJvbXB0ICsgInRhcmdldEZpbGU6ICIgKyB0YXJnZXRGaWxlOwkJLy8kTk9OLU5MUy0xJCAJLy8kTk9OLU5MUy0yJAotCQkJc3RyICs9ICJcbiIgKyBwcm9tcHQgKyAiZXhpc3Rpbmc6ICIgKyBleGlzdGluZzsJCQkvLyROT04tTkxTLTEkIAkvLyROT04tTkxTLTIkCQkJCi0JCQlyZXR1cm4gc3RyOwotCQl9Ci0JCQotCX0KLQotCS8vWzBdOiBzb3VyY2VGaWxlCi0JLy9bMV06IHRhcmdldEZpbGUKLQlwcml2YXRlIEZpbGVbXSBnZXRGaWxlcyhNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJRmlsZVtdIGZpbGVzID0gbmV3IEZpbGVbMl07Ci0JCQotCQlTdHJpbmcgZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChlbGVtKTsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBlbGVtZW50UGF0aDogIiArIGVsZW1lbnRQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChlbGVtZW50UGF0aCA9PSBudWxsIHx8IGVsZW1lbnRQYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGVsZW1lbnRQYXRoIGlzIG51bGwgb3IgZW1wdHkhIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBmaWxlczsKLQkJfQotCi0JCVN0cmluZyBkaWFncmFtUGF0aCA9IGVsZW1lbnRQYXRoICsgZWxlbS5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvciArIAotCQkJCQkJCQkiZGlhZ3JhbS54bWkiOwkJCQkvLyROT04tTkxTLTEkCi0KLQkJZmlsZXNbMF0gPSBuZXcgRmlsZShzb3VyY2VMaWJSb290LCBkaWFncmFtUGF0aCk7Ci0JCWZpbGVzWzFdID0gbmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgZGlhZ3JhbVBhdGgpOwkJCi0KLQkJcmV0dXJuIGZpbGVzOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9MaWJyYXJ5RG9jdW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9MaWJyYXJ5RG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2U2NDJkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvTGlicmFyeURvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICogRW5jYXBzdWxhdGVzIGEgbWV0aG9kIGxpYnJhcnkgdXNpbmcgYSBET00gZG9jdW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlEb2N1bWVudCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfbWV0aG9kUGx1Z2lucyA9ICJtZXRob2RQbHVnaW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX3ByZWRlZmluZWRDb25maWd1cmF0aW9ucyA9ICJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfcmVzb3VyY2VEZXNjcmlwdG9ycyA9ICJyZXNvdXJjZURlc2NyaXB0b3JzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX3Jlc291cmNlU3ViTWFuYWdlcnMgPSAic3ViTWFuYWdlcnMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX21ldGhvZEVsZW1lbnRQcm9wZXJ0eSA9ICJtZXRob2RFbGVtZW50UHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX2hyZWYgPSAiaHJlZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfaWQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX3VyaSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX2d1aWQgPSAiZ3VpZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX3ZhbHVlID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXhwb3J0RmlsZSA9ICJleHBvcnQueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGlicmFyeUZpbGUgPSAibGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgRmlsZSBsaWJGaWxlOwotCi0JcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OwotCi0JcHJvdGVjdGVkIEVsZW1lbnQgbGliVGFnID0gbnVsbDsKLQotCXByb3RlY3RlZCBFbGVtZW50IHJlc1RhZyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwIGd1aWRUb1VyaU1hcCA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGd1aWRUb1BsdWdOYW1lTWFwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeURvY3VtZW50KEZpbGUgbGliRmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMubGliRmlsZSA9IGxpYkZpbGU7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmRvY3VtZW50ID0gWE1MVXRpbC5sb2FkWG1sKGxpYkZpbGUpOwotCi0JCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQlOb2RlTGlzdCBub2RlcyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChub2RlcyAhPSBudWxsICYmIG5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJbGliVGFnID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7Ci0JCX0KLQotCQlub2RlcyA9IHJvb3QKLQkJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChub2RlcyAhPSBudWxsICYmIG5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJcmVzVGFnID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7Ci0JCX0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBmaWVsZAotICAgICAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZG9jdW1lbnQ7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGliRmlsZSBmaWVsZAotICAgICAqLwotCXB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBsaWJGaWxlOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpYlRhZyBmaWVsZAotICAgICAqLwotCXB1YmxpYyBFbGVtZW50IGdldExpYlRhZygpIHsKLQkJcmV0dXJuIGxpYlRhZzsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IG5hbWUKLSAgICAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlOYW1lKCkgewotCQlyZXR1cm4gbGliVGFnLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlicmFyeSBndWlkCi0gICAgICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5R3VpZCgpIHsKLQkJcmV0dXJuIGxpYlRhZy5nZXRBdHRyaWJ1dGUoImd1aWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIHRhZwotICAgICAqLwotCXB1YmxpYyBFbGVtZW50IGdldFJlc291cmNlVGFnKCkgewotCQlyZXR1cm4gcmVzVGFnOwotCX0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBwbHVnaW4gbm9kZQotICAgICAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBsdWdpbihFbGVtZW50IG5vZGUpIHsKLQkJbGliVGFnLnJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBjb25maWcgbm9kZQotICAgICAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyYXRpb24oRWxlbWVudCBub2RlKSB7Ci0JCWxpYlRhZy5yZW1vdmVDaGlsZChub2RlKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgcmVzb3VyY2UgZGVzY3JpcHRvciBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKEVsZW1lbnQgbm9kZSkgewotCQlyZXNUYWcucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBwbHVnaW4gbm9kZSBsaXN0Ci0gICAgICovCi0JcHVibGljIE5vZGVMaXN0IGdldFBsdWdpbnMoKSB7Ci0JCXJldHVybiBsaWJUYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVEFHX21ldGhvZFBsdWdpbnMpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY29uZmlndXJhdGlvbiBub2RlIGxpc3QKLSAgICAgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0Q29uZmlndXJhdGlvbnMoKSB7Ci0JCXJldHVybiBsaWJUYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVEFHX3ByZWRlZmluZWRDb25maWd1cmF0aW9ucyk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyByZXNvdXJjZSBkZXNjcmlwdG9yIG5vZGUgbGlzdAotICAgICAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gcmVzVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKFRBR19yZXNvdXJjZURlc2NyaXB0b3JzKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHJlc291cmNlIHN1Ym1hbmFnZXIgbm9kZSBsaXN0Ci0gICAgICovCi0JcHVibGljIE5vZGVMaXN0IGdldFJlc291cmNlU3ViTWFuYWdlcnMoKSB7Ci0JCXJldHVybiByZXNUYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVEFHX3Jlc291cmNlU3ViTWFuYWdlcnMpOwotCX0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBwbHVnaW4gbm9kZQotICAgICAqLwotCXB1YmxpYyB2b2lkIGFkZFBsdWdpbihFbGVtZW50IG5vZGUpIHsKLQkJbGliVGFnLmFwcGVuZENoaWxkKGdldFZhbGlkTm9kZShub2RlKSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGNvbmZpZ3VyYXRpb24gbm9kZQotICAgICAqLwotCXB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyYXRpb24oRWxlbWVudCBub2RlKSB7Ci0JCWxpYlRhZy5hcHBlbmRDaGlsZChnZXRWYWxpZE5vZGUobm9kZSkpOwotCX0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZXNvdXJjZSBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2UoRWxlbWVudCBub2RlKSB7Ci0JCXJlc1RhZy5hcHBlbmRDaGlsZChnZXRWYWxpZE5vZGUobm9kZSkpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB2YWxpZCBub2RlCi0gICAgICovCi0JcHVibGljIE5vZGUgZ2V0VmFsaWROb2RlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXRPd25lckRvY3VtZW50KCkgPT0gZG9jdW1lbnQpIHsKLQkJCXJldHVybiBub2RlOwotCQl9Ci0KLQkJcmV0dXJuIGRvY3VtZW50LmltcG9ydE5vZGUobm9kZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlIHBsdWdpbnMgYnkgZ3VpZAotCSAqIAotCSAqIEBwYXJhbSByZW1vdmVMaXN0Ci0JICogICAgICAgICAgICBMaXN0IGEgbGlzdCBvZiBndWlkcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBsdWdpbnMoTGlzdCByZW1vdmVMaXN0KSB7Ci0JCS8vIEltcG9ydGluZyBhIHBhY2thZ2Ugb2YgcGxnaW5zIHR3aWNlIGdlbmVyYXRlcyAyCi0JCS8vIGlkZW50aWNhbCBwbHVnaW5zCi0JCS8vIHJlbW92ZSB0aGUgbm9kZSB3aWxsIGNhdXNlIHRoZSBub2RlIGxpc3QgdG8gc2hyaW5rLCBzbyBkb24ndCBpbmNyZWFzZQotCQkvLyB0aGUgaW5kZXgKLQkJTm9kZUxpc3Qgbm9kZXMgPSBnZXRQbHVnaW5zKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBub2Rlcy5nZXRMZW5ndGgoKSkgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWQobm9kZSk7Ci0JCQlpZiAocmVtb3ZlTGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCWxpYlRhZy5yZW1vdmVDaGlsZChub2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBsaXN0IGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gbm9kZXMKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25maWd1cmF0aW9ucyhMaXN0IHJlbW92ZUxpc3QpIHsKLQkJLy8gcmVtb3ZlIHRoZSB1bm5lZWRlZCBjb25maWd1cmF0aW9ucwotCQlOb2RlTGlzdCBub2RlcyA9IGdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBub2Rlcy5nZXRMZW5ndGgoKSkgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWQobm9kZSk7Ci0JCQlpZiAocmVtb3ZlTGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCWxpYlRhZy5yZW1vdmVDaGlsZChub2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBsaXN0IGZyb20gdGhlIHJlc291cmNlIG5vZGVzCi0gICAgICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VFbnRyaWVzKExpc3QgcmVtb3ZlTGlzdCkgewotCQlOb2RlTGlzdCBub2RlcyA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9pZCk7Ci0JCQlTdHJpbmcgdXJpID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl91cmkpOwotCQkJaWYgKHJlbW92ZUxpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQlyZXNUYWcucmVtb3ZlQ2hpbGQobm9kZSk7Ci0KLQkJCQkvLyBjaGVjayB0aGUgcGx1Z2luIHhtaSBmaWxlLCBpZiBleGlzdHMsIGRlbGV0ZSB0aGUgZm9sZGVyCi0JCQkJRmlsZSBwbHVnbl9maWxlID0gZ2V0RmlsZUZyb21VcmkodXJpKTsKLQkJCQlpZiAocGx1Z25fZmlsZS5leGlzdHMoKSkgewotCQkJCQkvLyBkZWxldGUgdGhlIGZvbGRlciA/Pz8KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWkrKzsKLQkJCX0KLQkJfQotCi0JCS8vIGFsc28gcmVtb3ZlIHRoZSBzdWIgbWFuYWdlcnMKLQkJbm9kZXMgPSBnZXRSZXNvdXJjZVN1Yk1hbmFnZXJzKCk7Ci0JCWkgPSAwOwotCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gZ2V0U3ViTWFuYWdlckJhc2VHdWlkKG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfaHJlZikpOwotCQkJaWYgKHJlbW92ZUxpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQlyZXNUYWcucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCQl9IGVsc2UgewotCQkJCWkrKzsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcmVzb3VyY2UgdXJpIGZvciB0aGUgcmVzb3VyY2UgZ3VpZAotCSAqIEBwYXJhbSBndWlkCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHVyaQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VVcmkoU3RyaW5nIGd1aWQpIHsKLQkJU3RyaW5nIHVyaSA9IGdldFVyaUZyb21HdWlkVG9VcmlNYXAoZ3VpZCk7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJdXJpID0gZ2V0UmVzb3VyY2VVcmlfKGd1aWQpOwotCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJLy9hZGRUb0d1aWRUb1VyaU1hcChndWlkLCB1cmkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFJlc291cmNlVXJpXyhTdHJpbmcgZ3VpZCkgewotCQotCQlOb2RlTGlzdCBub2RlcyA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrICkgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgaWQgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSX2lkKTsKLQkJCVN0cmluZyB1cmkgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSX3VyaSk7Ci0JCQlpZiAoIGd1aWQuZXF1YWxzKGlkKSApIHsKLQkJCQlyZXR1cm4gZGVjb2RlVXJpKHVyaSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlY29yZWQgVVJJLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjb2RlVXJpKFN0cmluZyB1cmkpIHsKLQkJdHJ5IHsKLQkJCXVyaSA9IFVSTERlY29kZXIuZGVjb2RlKHVyaSwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gdXJpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIGdpdmVuIHRoZSB1cmkuCi0JICovCi0JcHVibGljIEZpbGUgZ2V0RmlsZUZyb21VcmkoU3RyaW5nIHVyaSkgewotCQl1cmkgPSBkZWNvZGVVcmkodXJpKTsKLQkJCi0JCWludCBpID0gdXJpLmluZGV4T2YoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaSA+IDApIHsKLQkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoMCwgaSk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IEZpbGUobGliRmlsZS5nZXRQYXJlbnRGaWxlKCksIHVyaSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2F2ZUFzKGxpYkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBkb2N1bWVudCBpbiB0aGUgZmlsZSBnaXZlbiBieSBmaWxlUGF0aE5hbWUuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUFzKFN0cmluZyBmaWxlUGF0aE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlYTUxVdGlsLnNhdmVEb2N1bWVudCh0aGlzLmRvY3VtZW50LCBmaWxlUGF0aE5hbWUpOwotCX0KLQotCS8qKgotCSAqIElzIHRoZSBkb2N1bWVudCBmb3IgY29uZmlndXRhdGlvbiBzcGVjaWZpY2F0aW9uIGV4cG9ydC9pbXBvcnQgb25seT8KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZpZ1NwZWNzT25seSgpIHsKLQkJTm9kZUxpc3Qgbm9kZXMgPSBnZXRQbHVnaW5zKCk7Ci0JCWlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBocmVmID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaHJlZik7Ci0JCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWRGcm9tSHJlZihocmVmKTsKLQkJCVN0cmluZyB1cmkgPSBnZXRSZXNvdXJjZVVyaShndWlkKTsKLQkJCQotCQkJLy8gY2hlY2sgaWYgdGhlIHJlc291cmNlIGZpbGVzIGFyZSB0aGVyZQotCQkJRmlsZSBwbHVnbl9maWxlID0gZ2V0RmlsZUZyb21VcmkodXJpKTsKLQkJCWlmIChwbHVnbl9maWxlLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gc3RhdGljIGhscGVyIG1ldGhvZHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8qKgotCSAqIFJldHVybnMgc3VibWFuYWdlcidzIGJhc2UgZ3VpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdWJNYW5hZ2VyQmFzZUd1aWQoU3RyaW5nIGhyZWYpIHsKLQkJZmluYWwgUGF0dGVybiBwID0gUGF0dGVybi5jb21waWxlKAotCQkJCSJ1bWE6Ly8oLio/KSMoLio/KSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCQlNYXRjaGVyIG0gPSBwLm1hdGNoZXIoaHJlZik7Ci0JCWlmIChtLmZpbmQoKSkgewotCQkJcmV0dXJuIG0uZ3JvdXAoMSk7Ci0JCX0KLQotCQlyZXR1cm4gaHJlZjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNoaWxkIHZhbHVlIG9mIHRoZSBjaGlsZCB0YWcgZ2l2ZW4gYnkgY2hpbGRUYWdOYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENoaWxkVmFsdWUoRWxlbWVudCB0YWcsIFN0cmluZyBjaGlsZFRhZ05hbWUpIHsKLQkJTm9kZUxpc3Qgbm9kZXMgPSB0YWcuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAobm9kZXMgPT0gbnVsbCB8fCBub2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJaWYgKChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLQkJCQkJJiYgKChFbGVtZW50KSBub2RlKS5nZXRUYWdOYW1lKCkuZXF1YWxzKGNoaWxkVGFnTmFtZSkpIHsKLQkJCQlyZXR1cm4gZ2V0Tm9kZVRleHQoKEVsZW1lbnQpIG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogdGV4dCBvZiBhIGxlYWYgbm9kZSwgd2l0aG91dCBjaGlsZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIHRhZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROb2RlVGV4dChFbGVtZW50IHRhZykgewotCi0JCU5vZGVMaXN0IG5vZGVzID0gdGFnLmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZ3VpZCBmcm9tIGhyZWYuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3VpZEZyb21IcmVmKFN0cmluZyBocmVmKSB7Ci0JCWludCBpID0gaHJlZi5pbmRleE9mKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGkgPiAwKSB7Ci0JCQlyZXR1cm4gaHJlZi5zdWJzdHJpbmcoaSArIDEpOwotCQl9Ci0KLQkJcmV0dXJuIGhyZWY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBndWlkIG9mIHRoZSBub2RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEd1aWQoRWxlbWVudCBub2RlKSB7Ci0JCVN0cmluZyBpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKCJ4bWk6aWQiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCApIHsKLQkJCVN0cmluZyBocmVmID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKTsKLQkJCWlkID0gZ2V0R3VpZEZyb21IcmVmKGhyZWYpOwotCQl9Ci0JCQotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCS8vIDE0MzAzMyAtIHVwZGF0ZSBjb25maWcgc3BlY3MnIGltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHRvIG1hdGNoIHdpdGggdGhlIG5ldyBmaWxlIGZvcm1hdAotCXByb3RlY3RlZCBFbGVtZW50IGdldENvbmZpZ05vZGUoRWxlbWVudCBjb25maWdOb2RlKSB7Ci0JCXRyeSB7Ci0JCQkKLQkJCS8vIG5ldyBtb2RlbCBkZWZpbmVzIGhyZWYgZm9yIGNvbmZpZ3VyYXRpb24gCi0JCQlTdHJpbmcgaHJlZiA9IGNvbmZpZ05vZGUuZ2V0QXR0cmlidXRlKEFUVFJfaHJlZik7Ci0JCQlpZiAoaHJlZiA9PSBudWxsIHx8IGhyZWYubGVuZ3RoKCkgPT0gMCApIHsKLQkJCQlyZXR1cm4gY29uZmlnTm9kZTsKLQkJCX0gCi0KLQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21IcmVmKGhyZWYpOwotCQkJU3RyaW5nIHVyaSA9IGdldFJlc291cmNlVXJpKGd1aWQpOwotCQkJaWYgKCB1cmkgPT0gbnVsbCApIHsKLQkJCQlyZXR1cm4gY29uZmlnTm9kZTsKLQkJCX0KLQkJCQotCQkJRmlsZSBzb3VyY2UgPSBnZXRGaWxlRnJvbVVyaSh1cmkpOwotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBYTUxVdGlsLmxvYWRYbWwoc291cmNlKTsKLQkJCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCi0JCQlFbGVtZW50IGNvbmZpZ1RhZyA9IG51bGw7Ci0JCQlpZiAocm9vdC5nZXRUYWdOYW1lKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWNvbmZpZ1RhZyA9IHJvb3Q7Ci0JCQl9IGVsc2UgewotCQkJCU5vZGVMaXN0IG5vZGVzID0gcm9vdAotCQkJCQkJLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJY29uZmlnVGFnID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlyZXR1cm4gY29uZmlnVGFnOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gY29uZmlnTm9kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBDb25maWd1cmF0aW9uU3BlYyBpbnN0YW5jZSBnaXZlbiB0aGUgZWxlbWVudCBub2RlIGNvbmZpZy4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblNwZWMgZ2V0Q29uZmlndXJhdGlvblNwZWMoRWxlbWVudCBjb25maWcpIHsKLQkJQ29uZmlndXJhdGlvblNwZWMgc3BlYyA9IG5ldyBDb25maWd1cmF0aW9uU3BlYygpOwotCQkKLQkJRWxlbWVudCBjb25maWdOb2RlID0gZ2V0Q29uZmlnTm9kZShjb25maWcpOwotCQlzcGVjLmd1aWQgPSBjb25maWdOb2RlLmdldEF0dHJpYnV0ZSgieG1pOmlkIik7IC8vJE5PTi1OTFMtMSQKLQkJc3BlYy5uYW1lID0gY29uZmlnTm9kZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlzcGVjLmJyaWVmX2Rlc2MgPSBjb25maWdOb2RlLmdldEF0dHJpYnV0ZSgiYnJpZWZEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBnZXQgcGx1Z2lucwotCQlOb2RlTGlzdCBub2RlcyA9IGNvbmZpZ05vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGhvZFBsdWdpblNlbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChub2RlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWRGcm9tSHJlZihub2RlLmdldEF0dHJpYnV0ZShBVFRSX2hyZWYpKTsKLQkJCQlzcGVjLnBsdWdpbklkcy5hZGQoZ3VpZCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBnZXQgcGFja2FnZXMKLQkJbm9kZXMgPSBjb25maWdOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21IcmVmKG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfaHJlZikpOwotCQkJCXNwZWMucGFja2FnZUlkcy5hZGQoZ3VpZCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBnZXQgdmlld3MKLQkJbm9kZXMgPSBjb25maWdOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwcm9jZXNzVmlld3MiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobm9kZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkRnJvbUhyZWYobm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKSk7Ci0JCQkJc3BlYy52aWV3SWRzLmFkZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzcGVjOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIGd1aWQvdXJpIHBhaXIgdG8gZ3VpZFRvVXJpTWFwLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRvR3VpZFRvVXJpTWFwKFN0cmluZyBndWlkLCBTdHJpbmcgdXJpKSB7Ci0JCWlmIChndWlkVG9VcmlNYXAgPT0gbnVsbCkgewotCQkJZ3VpZFRvVXJpTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlndWlkVG9VcmlNYXAucHV0KGd1aWQsIHVyaSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdXJpIGZyb20gZ3VpZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVyaUZyb21HdWlkVG9VcmlNYXAoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIGd1aWRUb1VyaU1hcCA9PSBudWxsID8gbnVsbCA6IChTdHJpbmcpIGd1aWRUb1VyaU1hcC5nZXQoZ3VpZCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIENvbmZpZ0RvY1Zpc2l0b3IgewotCQlwdWJsaWMgdm9pZCB2aXNpdChGaWxlIGZpbGUsIEVsZW1lbnQgbm9kZSkgewkJCQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFZpc2l0IGNvbmZpZ3VyYXRpb24gZmlsZXMgZ2l2ZW4gYnkgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBmb2xkZXIgY29uZmlnRGlyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB2aXNpdENvbmZpZ0ZpbGVzKEZpbGUgY29uZmlnRGlyLCBDb25maWdEb2NWaXNpdG9yIHZpc2l0b3IpIHsJCi0JCUZpbGVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotCQkJCXJldHVybiAhcGF0aG5hbWUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImN2cyIpICYmIAkJLy8kTk9OLU5MUy0xJAotCQkJCQkJcGF0aG5hbWUuaXNEaXJlY3RvcnkoKSB8fCBwYXRobmFtZS5nZXROYW1lKCkuZW5kc1dpdGgoTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTik7Ci0JCQl9CQkJCi0JCX07CQkKLQkJRmlsZVtdIGZpbGVzID0gY29uZmlnRGlyLmxpc3RGaWxlcyhmaWx0ZXIpOwotCQlpZiAoZmlsZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGk9MDsgaTxmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBmaWxlID0gZmlsZXNbaV07Ci0JCQl0cnkgewotCQkJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpCi0JCQkJCQkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQkJRG9jdW1lbnQgZG9jID0gYnVpbGRlci5wYXJzZShmaWxlKTsKLQkJCQlFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJdmlzaXRvci52aXNpdChmaWxlLCByb290KTsJCQkJCi0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhIG1hcCBmcm9tIHBsdWlnbiBndWlkcyB0byByZXNvdXJjZSBtYW5hZ2VyIGd1aWRzLgotCSAqLwotCXB1YmxpYyBNYXAgYnVpbGRQbHVnaW5HdWlkVG9SZXNNZ3JHdWlkTWFwKExpc3QgcGx1Z2luR3VpZHMpIHsKLQkJaWYgKHBsdWdpbkd1aWRzID09IG51bGwgfHwgcGx1Z2luR3VpZHMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCU5vZGVMaXN0IHN1Yk1ncnMgPSBnZXRSZXNvdXJjZVN1Yk1hbmFnZXJzKCk7Ci0JCWlmIChzdWJNZ3JzID09IG51bGwgfHwgc3ViTWdycy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQkJCQkKLQkJSGFzaE1hcCBwbHVnaW5HdWlkVG9SZXNNZ3JHdWlkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHBsdWdpbkd1aWRzLnNpemUoKTsgaSsrKSB7CQkJCi0JCQlTdHJpbmcgcGx1Z2luR3VpZCA9IChTdHJpbmcpIHBsdWdpbkd1aWRzLmdldChpKTsKLQkJCXBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAucHV0KHBsdWdpbkd1aWQsIG51bGwpOwotCQl9Ci0JCWJvb2xlYW4gaXNFbXB0eSA9IHRydWU7Ci0JCWZvciAoaW50IGk9MDsgaTxzdWJNZ3JzLmdldExlbmd0aCgpOyBpKyspIHsJCQkKLQkJCUVsZW1lbnQgbWdyID0gKEVsZW1lbnQpIHN1Yk1ncnMuaXRlbShpKTsKLQkJCVN0cmluZyAgaHJlZiA9IG1nci5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKTsKLQkJCVN0cmluZyBwbHVnaW5HdWlkID0gZ2V0U3ViTWFuYWdlckJhc2VHdWlkKGhyZWYpOwotCQkJaWYgKHBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAuY29udGFpbnNLZXkocGx1Z2luR3VpZCkpIHsKLQkJCQlwbHVnaW5HdWlkVG9SZXNNZ3JHdWlkTWFwLnB1dChwbHVnaW5HdWlkLCBnZXRHdWlkRnJvbUhyZWYoaHJlZikpOwotCQkJCWlzRW1wdHkgPSBmYWxzZTsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBpc0VtcHR5ID8gIG51bGwgOiBwbHVnaW5HdWlkVG9SZXNNZ3JHdWlkTWFwOwotCX0KLQkKLQkvKioKLQkgKiBTYXZlIGV4dHJhIGluZm8gKGFsbCBwbHVnaW4gZ3VpZHMgYW5kIG5hbWVzKSBpbiBsaWJUYWcncyBNZXRob2RFbGVtZW50UHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9yZUV4dHJhSW5mbyhMaXN0PE1ldGhvZFBsdWdpbj4gcGx1Z2lucykgewotCQlpZiAocGx1Z2lucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCi0JCUVsZW1lbnQgdmVyc2lvbk5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFRBR19tZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQl2ZXJzaW9uTm9kZS5zZXRBdHRyaWJ1dGUoQVRUUl92YWx1ZSwgIjAiKTsJLy8kTk9OLU5MUy0xJCAKLQkJbGliVGFnLmFwcGVuZENoaWxkKHZlcnNpb25Ob2RlKTsJCQotCQkKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1ZyA9IGl0Lm5leHQoKTsKLQkJCQotCQkJRWxlbWVudCBndWlkTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoVEFHX21ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7CQotCQkJZ3VpZE5vZGUuc2V0QXR0cmlidXRlKEFUVFJfdmFsdWUsIHBsdWcuZ2V0R3VpZCgpKTsKLQkJCUVsZW1lbnQgbmFtZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFRBR19tZXRob2RFbGVtZW50UHJvcGVydHkpOwkKLQkJCW5hbWVOb2RlLnNldEF0dHJpYnV0ZShBVFRSX3ZhbHVlLCBwbHVnLmdldE5hbWUoKSk7Ci0JCQkKLQkJCWxpYlRhZy5hcHBlbmRDaGlsZChndWlkTm9kZSk7Ci0JCQlsaWJUYWcuYXBwZW5kQ2hpbGQobmFtZU5vZGUpOwotCQl9Ci0JCQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIHJlY2FsbEV4dHJhSW5mbygpIHsKLQkJdHJ5IHsKLQkJCU5vZGVMaXN0IG5vZGVzID0gZ2V0TWV0aG9kRWxlbWVudFByb3BlcnRpZXMoKTsKLQkJCWlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlFbGVtZW50IHZlcnNpb25Ob2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7Ci0JCQlTdHJpbmcgdmVyc2lvblN0ciA9IHZlcnNpb25Ob2RlLmdldEF0dHJpYnV0ZShBVFRSX3ZhbHVlKTsKLQkJCQotCQkJaWYgKHZlcnNpb25TdHIuZXF1YWxzKCIwIikpIHsgLy8kTk9OLU5MUy0xJCAKLQkJCQlndWlkVG9QbHVnTmFtZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7KSB7Ci0JCQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJCQlTdHJpbmcgZ3VpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfdmFsdWUpOwotCQkJCQlub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSArIDEpOwotCQkJCQlTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfdmFsdWUpOwotCQkJCQlndWlkVG9QbHVnTmFtZU1hcC5wdXQoZ3VpZCwgbmFtZSk7Ci0JCQkJCWlmIChmYWxzZSkgewkJCQkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGd1aWQ6ICIgKyBndWlkKTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG5hbWU6ICIgKyBuYW1lKTsKLQkJCQkJfQkJCQkJCi0JCQkJCWkgKz0gMjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJZ3VpZFRvUGx1Z05hbWVNYXAgPSBudWxsOwotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBHZXQgZ3VpZCB0byBwbHVnaW4gbWFwCi0JICovCi0JcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0R3VpZFRvUGx1Z05hbWVNYXAoKSB7Ci0JCWlmIChndWlkVG9QbHVnTmFtZU1hcCA9PSBudWxsKSB7Ci0JCQlyZWNhbGxFeHRyYUluZm8oKTsKLQkJfQkJCi0JCXJldHVybiBndWlkVG9QbHVnTmFtZU1hcDsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBtZXRob2RFbGVtZW50UHJvcGVydHkgbm9kZSBsaXN0Ci0gICAgICovCi0JcHJpdmF0ZSBOb2RlTGlzdCBnZXRNZXRob2RFbGVtZW50UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGxpYlRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfbWV0aG9kRWxlbWVudFByb3BlcnR5KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0RGF0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL1BsdWdpbkV4cG9ydERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmI1ODIzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkxpYnJhcnlMb2NhdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgaW5wdXQgZGF0YSByZXF1aXJlZCB0byBleHBvcnQgYSBtZXRob2QgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luRXhwb3J0RGF0YSB7Ci0KLQlwdWJsaWMgTGlzdCBzZWxlY3RlZFBsdWdpbnMgPSBudWxsOwotCi0JcHVibGljIExpYnJhcnlMb2NhdGlvbkRhdGEgbGxEYXRhID0gbnVsbDsKLQotCXB1YmxpYyBIYXNodGFibGUgYXNzb2NpYXRlZENvbmZpZ01hcCA9IG5ldyBIYXNodGFibGUoKTsKLQotCS8vIGRvbid0IG5lZWQgaXQgYWZ0ZXIgdGhlIHNlcnZpY2UgY29kZSBjaGFuZ2VzCi0JcHVibGljIExpc3QgYXNzb2NpYXRlZENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQbHVnaW5FeHBvcnREYXRhKCkgewotCQlsbERhdGEgPSBuZXcgTGlicmFyeUxvY2F0aW9uRGF0YSgpOwotCQlsbERhdGEubG9hZEZyb21QcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHNlbGVjdGVkIHBsdWdpbnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VsZWN0ZWRQbHVnaW5zKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRQbHVnaW5zOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxpc3Qgb2Ygc2VsZWN0ZWQgcGx1Z2lucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFBsdWdpbnMoTGlzdCBzZWxlY3RlZFBsdWdpbnMpIHsKLQkJdGhpcy5zZWxlY3RlZFBsdWdpbnMgPSBzZWxlY3RlZFBsdWdpbnM7Ci0JfTsKLQotCS8qKgotCSAqIHZhbGlkYXRlIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGRzIGFzc29jaWF0ZWRDb25maWdNYXAuCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRBc3NvY2lhdGVkQ29uZmlnTWFwKCkgewotCQlpZiAoZ2V0U2VsZWN0ZWRQbHVnaW5zKCkgIT0gbnVsbCkgewotCQkJYXNzb2NpYXRlZENvbmZpZ01hcC5jbGVhcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0U2VsZWN0ZWRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZFBsdWdpbiBlbGVtZW50ID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQkJYXNzb2NpYXRlZENvbmZpZ01hcC5wdXQoZWxlbWVudCwgTGlicmFyeVV0aWwKLQkJCQkJCS5nZXRBc3NvY2lhdGVkQ29uZmlndXJhdGlvbnMoZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0U2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL1BsdWdpbkV4cG9ydFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDNiYTZlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotLyoqCi0gKiBFeHBvcnRzIG9uZSBvciBtb3JlIG1ldGhvZCBwbHVnLWlucyB0byBhIHRhcmdldCBkaXJlY3RvcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIxNTMKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkV4cG9ydFNlcnZpY2UgZXh0ZW5kcyBCYXNlRXhwb3J0U2VydmljZSB7Ci0KLQlQbHVnaW5FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQbHVnaW5FeHBvcnRTZXJ2aWNlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIFJ1biB0byBleHBvcnQgcGx1Z2lucwotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRSZXNvdXJjZXMuUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwKTsgLy8kTk9OLU5MUy0xJAotCi0JCUxpc3QgcGx1Z2lucyA9IGRhdGEuc2VsZWN0ZWRQbHVnaW5zOwotCQlpZiAocGx1Z2lucyA9PSBudWxsIHx8IHBsdWdpbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0UmVzb3VyY2VzLlBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgdGhlIGxpYnJhcnkgZm9sZGVyIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5LgotCQlTdHJpbmcgZXhwb3J0TGliUGF0aCA9IChuZXcgRmlsZShkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKSkpLmdldEFic29sdXRlUGF0aCgpOwotCQlGaWxlIGV4cG9ydExpYkZvbGRlciA9IG5ldyBGaWxlKGV4cG9ydExpYlBhdGgpOwotCQlpZiAoIWV4cG9ydExpYkZvbGRlci5leGlzdHMoKSkgewotCQkJZXhwb3J0TGliRm9sZGVyLm1rZGlyKCk7Ci0JCX0KLQotCQlGaWxlIGxpYkZvbGRlciA9IG51bGw7Ci0KLQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRSZXNvdXJjZXMuUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEl0ZXJhdGUgdGhlIHNlbGVjdGVkIHBsdWctaW5zIGFuZCBjb3B5IHRoZWlyIGFzc29jaWF0ZWQgbW9kZWwgZmlsZXMuCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gU3RlcCAxOiBDcmVhdGUgdGhlIHBsdWctaW4gZm9sZGVyLgotCQkJVVJJIHVyaSA9IHBsdWdpbi5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJCVN0cmluZyBwYXRoID0gdXJpLnRvRmlsZVN0cmluZygpOwotCi0JCQlGaWxlIHBsdWdpbkZvbGRlciA9IChuZXcgRmlsZShwYXRoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQkJaWYgKGxpYkZvbGRlciA9PSBudWxsKSB7Ci0JCQkJbGliRm9sZGVyID0gcGx1Z2luRm9sZGVyLmdldFBhcmVudEZpbGUoKTsKLQkJCX0KLQotCQkJU3RyaW5nIHBsdWdpblBhdGggPSBsaWJGb2xkZXIudG9VUkkoKS5yZWxhdGl2aXplKAotCQkJCQlwbHVnaW5Gb2xkZXIudG9VUkkoKSkuZ2V0UGF0aCgpOwotCQkJRmlsZSBleHBvcnRQbHVnaW5Gb2xkZXIgPSBuZXcgRmlsZShleHBvcnRMaWJGb2xkZXIsIHBsdWdpblBhdGgpOwotCi0JCQkvLyBTdGVwIDI6IENvcHkgdGhlIHBsdWctaW4gZmlsZXMuCi0JCQljb3B5RGlyKHBsdWdpbkZvbGRlciwgZXhwb3J0UGx1Z2luRm9sZGVyKTsJCQkKLQkJfQotCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0UmVzb3VyY2VzLlBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMyk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBHZXQgdGhlIHNlbGVjdGVkIHBsdWctaW4gYW5kIGNvbmZpZ3VyYXRpb24gaWRzIHNvIHdlIGNhbiByZW1vdmUgdGhlCi0JCS8vIHVubmVlZGVkIHN0dWZmLgotCQlnZXRTZWxlY3RlZElkcyhkYXRhLnNlbGVjdGVkUGx1Z2lucywgZGF0YS5hc3NvY2lhdGVkQ29uZmlnTWFwKTsKLQotCQkvLyBTdGVwIDM6IExvYWQgdGhlIGxpYnJhcnkueG1pIGFuZCB0aGUgcmVzbWdyLnhtaSwgcmVtb3ZlIHRoZSB1bm5lZWRlZAotCQkvLyBzdHVmZi4KLQkJTGlicmFyeURvY3VtZW50IGRvY3VtZW50ID0gcHJvY2Vzc0xpYnJhcnlGaWxlKG5ldyBGaWxlKGxpYkZvbGRlciwgbGlicmFyeUZpbGUpLCBuZXcgRmlsZSgKLQkJCQlleHBvcnRMaWJGb2xkZXIsIGV4cG9ydEZpbGUpKTsKLQotCQlpZiAoIGRvY3VtZW50ICE9IG51bGwgKSB7Ci0JCQkvLyBjb3B5IHRoZSBjb25pZnVyYXRpb24gZmlsZXMKLQkJCS8vIDE0MjM3OSAtIHVwZGF0ZSBwbHVnaW4gaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgdG8gbWF0Y2ggd2l0aCB0aGUgbmV3IGZpbGUgZm9ybWF0Ci0JCQljb3B5Q29uZmlndXJhdGlvbkZpbGVzKGRvY3VtZW50LCBsaWJGb2xkZXIsIGV4cG9ydExpYkZvbGRlcik7Ci0JCX0KLQkJCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0UmVzb3VyY2VzLlBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHNCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkKLQlwcml2YXRlIHZvaWQgY29weUNvbmZpZ3VyYXRpb25GaWxlcyhMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQsIEZpbGUgbGliRm9sZGVyLCBGaWxlIGV4cG9ydExpYkZvbGRlcikgewotCQkvLyAvLyAxNDIzNzkgLSB1cGRhdGUgcGx1Z2luIGltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHRvIG1hdGNoIHdpdGggdGhlIG5ldyBmaWxlIGZvcm1hdAotCQkvLyBHZXQgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaWRzLgotCQlmb3IgKEl0ZXJhdG9yIGl0YyA9IGRhdGEuYXNzb2NpYXRlZENvbmZpZ01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGMuaGFzTmV4dCgpOykgewotCQkJTGlzdCBjb25maWdzID0gKExpc3QpIGl0Yy5uZXh0KCk7Ci0JCQlpZiAoY29uZmlncyA9PSBudWxsIHx8IGNvbmZpZ3Muc2l6ZSgpID09IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0Lm5leHQoKTsKLQkJCQlTdHJpbmcgZ3VpZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JCQkJU3RyaW5nIHVyaSA9IGRvY3VtZW50LmdldFJlc291cmNlVXJpKGd1aWQpOwotCQkJCWlmICh1cmkgPT0gbnVsbCkgewotCQkJCQlVUkkgcmVzVXJpID0gY29uZmlnLmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQkJCQl1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSArIEZpbGUuc2VwYXJhdG9yICsgcmVzVXJpLmxhc3RTZWdtZW50KCk7Ci0JCQkJCXVyaSA9IGRvY3VtZW50LmRlY29kZVVyaSh1cmkpOwotCQkJCX0JCQkJCi0JCQkJaWYgKCB1cmkgIT0gbnVsbCApIHsKLQkJCQkJRmlsZSBzcmMgPSBuZXcgRmlsZShsaWJGb2xkZXIsIHVyaSk7Ci0JCQkJCUZpbGUgdGFyZ2V0ID0gIG5ldyBGaWxlKGV4cG9ydExpYkZvbGRlciwgdXJpKTsKLQkJCQkJUmVzb3VyY2VIZWxwZXIuY29weUZpbGUoc3JjLCB0YXJnZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvcGllcyBkaXJlY3RvcmllcyBmcm9tICJmcm9tRGlyIiB0byAidG9EaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyKEZpbGUgZnJvbURpciwgRmlsZSB0b0RpcikgewotCQlDb3B5IGNwID0gbmV3IENvcHkoKTsKLQkJY3Auc2V0T3ZlcndyaXRlKHRydWUpOwotCQlGaWxlU2V0IHNldCA9IG5ldyBGaWxlU2V0KCk7Ci0JCXNldC5zZXRFeGNsdWRlcyhDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZS5leGNsdWRlcyk7Ci0JCXNldC5zZXREaXIoZnJvbURpcik7Ci0JCWNwLmFkZEZpbGVzZXQoc2V0KTsKLQkJY3Auc2V0VG9kaXIodG9EaXIpOwotCQljcC5zZXRQcm9qZWN0KG5ldyBQcm9qZWN0KCkpOwotCQljcC5zZXRQcmVzZXJ2ZUxhc3RNb2RpZmllZCh0cnVlKTsKLQkJY3AuZXhlY3V0ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRTZWxlY3RlZElkcyhMaXN0IHBsdWdpbnMsIE1hcCBjb25maWdzTWFwKSB7Ci0JCXNlbGVjdGVkSWRzLmNsZWFyKCk7Ci0JCXNlbGVjdGVkUGx1Z2luTmFtZXMuY2xlYXIoKTsKLQotCQkvLyBHZXQgdGhlIHBsdWctaW4gaWRzIGFuZCBuYW1lcy4KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBndWlkID0gcGx1Z2luLmdldEd1aWQoKTsKLQkJCXNlbGVjdGVkUGx1Z2luTmFtZXMuYWRkKHBsdWdpbi5nZXROYW1lKCkpOwotCQkJaWYgKCFzZWxlY3RlZElkcy5jb250YWlucyhndWlkKSkgewotCQkJCXNlbGVjdGVkSWRzLmFkZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCS8vIFNhdmUgdGhlIGxpYnJhcnkgZ3VpZCBzbyB0aGF0IHRoZSBlbnRyeSBpbiByZXNnci54bWkgd2lsbCBiZSBrZXB0LgotCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCU1ldGhvZExpYnJhcnkgbGliID0gKE1ldGhvZExpYnJhcnkpIHBsdWdpbi5lQ29udGFpbmVyKCk7Ci0JCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQlzZWxlY3RlZElkcy5hZGQobGliLmdldEd1aWQoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBHZXQgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaWRzLgotCQlmb3IgKEl0ZXJhdG9yIGl0YyA9IGNvbmZpZ3NNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRjLmhhc05leHQoKTspIHsKLQkJCUxpc3QgY29uZmlncyA9IChMaXN0KSBpdGMubmV4dCgpOwotCQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLnNpemUoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBjb25maWcuZ2V0R3VpZCgpOwotCQkJCWlmIChzZWxlY3RlZElkcy5jb250YWlucyhndWlkKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvLyBBZGQgdGhlIGNvbmZpZ3VyYXRpb24uCi0JCQkJc2VsZWN0ZWRJZHMuYWRkKGd1aWQpOwotCi0JCQkJLy8gRm9yIGVhY2ggY29uZmlndXJhdGlvbiwgc2F2ZSB0aGUgbWV0aG9kIHBsdWctaW4gYW5kIHBhY2thZ2UKLQkJCQkvLyBpZHMgc28gdGhhdCB0aGVpciBlbnRyaWVzIGluIHRoZSByZXNvdXJjZSBmaWxlIGNhbiBiZSBrZXB0LgotCQkJCUxpc3QgcmVmcyA9IGNvbmZpZy5lQ3Jvc3NSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdHIgPSByZWZzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvID0gaXRyLm5leHQoKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgbyBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJCWd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpIG8pLmdldEd1aWQoKTsKLQkJCQkJCWlmICghc2VsZWN0ZWRJZHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQkJCQlzZWxlY3RlZElkcy5hZGQoZ3VpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJVbmV4cGVjdGVkIGVsZW1lbnQgdHlwZSAnIiArICgoTWV0aG9kRWxlbWVudCkgbykuZ2V0VHlwZSgpLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyAiJyBpbiBjb25maWd1cmF0aW9uICciICsgY29uZmlnLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ0YWFhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbWV0aG9kIHBsdWctaW4gYW5kIGNvbmZpZ3VyYXRpb24gZXhwb3J0IHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0Rlc3RpbmF0aW9uQ29tbW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRGVzdGluYXRpb25Db21tb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiOWI3NzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRGVzdGluYXRpb25Db21tb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5TG9jYXRpb25EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZm9yIGFuCi0gKiBleHBvcnQgb3IgaW1wb3J0IG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzQwMQotICovCi1wdWJsaWMgY2xhc3MgRGVzdGluYXRpb25Db21tb25QYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGFnZVRpdGxlID0gRXhwb3J0UmVzb3VyY2VzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZV90aXRsZTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHBhZ2VEZXNjID0gRXhwb3J0UmVzb3VyY2VzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBDb21ibyBjdHJsX2V4cG9ydFBhdGg7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfYnJvd3NlX2J1dHRvbjsKLQotCXByb3RlY3RlZCBMaWJyYXJ5TG9jYXRpb25EYXRhIGxsRGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERlc3RpbmF0aW9uQ29tbW9uUGFnZShTdHJpbmcgcGFnZU5hbWUsIExpYnJhcnlMb2NhdGlvbkRhdGEgbGxEYXRhKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUocGFnZVRpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24ocGFnZURlc2MpOwotCQl0aGlzLmxsRGF0YSA9IGxsRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEV4cG9ydFJlc291cmNlcy5EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGlyKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2V4cG9ydFBhdGggPSBzdXBlci5jcmVhdGVDb21ib2JveChjb250YWluZXIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYnJvd3NlX2J1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWN0cmxfYnJvd3NlX2J1dHRvbi5zZXRUZXh0KEV4cG9ydFJlc291cmNlcy5EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfYnJvd3NlKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2Jyb3dzZV9idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3BlbkRpcmVjdG9yeURpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsICIiKTsgLy8kTk9OLU5MUy0xJAkJCi0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCi0JCWluaXRDb21ib0l0ZW1zKCk7Ci0JCQotCQlzZXREZWZhdWx0VmFsdWUoKTsKLQkJCi0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRWYWx1ZSgpewotLy8JCXNldCBsYXN0IG9wZW5lZCBkaXIgYXMgdGhlIGRlZmF1bHQgc2VsZWN0aW9uIHdoZW4gaW5pdCB0aGlzIHBhZ2UKLQkJYWRkRGVmYXVsdFRvSXRlbXMoKTsKLQkJY3RybF9leHBvcnRQYXRoLnNlbGVjdCgwKTsKLQkJY3RybF9leHBvcnRQYXRoLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWN0cmxfYnJvd3NlX2J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRUb0l0ZW1zKCl7Ci0JCVN0cmluZ1tdIGl0ZW1zID0gY3RybF9leHBvcnRQYXRoLmdldEl0ZW1zKCk7Ci0JCWludCBpbmRleD0wOwotCQlpZihpdGVtcyE9bnVsbCAmJiBpdGVtcy5sZW5ndGg+MCl7Ci0JCQlmb3IoaW50IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKyl7Ci0JCQkJaWYoaXRlbXNbaV0uZXF1YWxzKEV4cG9ydFVJUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEV4cG9ydFBhdGgoKSkpCi0JCQkJCXJldHVybjsKLQkJCQlpbmRleCA9IGk7Ci0JCQl9Ci0JCQlpbmRleCsrOwotCQl9Ci0JCWlmKGluZGV4PkV4cG9ydFVJUHJlZmVyZW5jZXMuZ2V0TGlzdExlbmd0aCgpLTEpewotCQkJaW5kZXggPSBFeHBvcnRVSVByZWZlcmVuY2VzLmdldExpc3RMZW5ndGgoKS0xOwotCQkJY3RybF9leHBvcnRQYXRoLnJlbW92ZShpbmRleCk7Ci0JCX0KLQkJY3RybF9leHBvcnRQYXRoLmFkZChFeHBvcnRVSVByZWZlcmVuY2VzLmdldERlZmF1bHRFeHBvcnRQYXRoKCksIGluZGV4KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQljdHJsX2V4cG9ydFBhdGguYWRkTGlzdGVuZXIoU1dULkZvY3VzSW4sIHRoaXMpOwotCQljdHJsX2V4cG9ydFBhdGguYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JCWN0cmxfZXhwb3J0UGF0aC5hZGRMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIHRoaXMpOwotCQljdHJsX2V4cG9ydFBhdGguYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2Ujc2V0VmlzaWJsZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmICh2aXNpYmxlKSB7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBjb250YWluZXIuZ2V0RGlzcGxheSgpOwotCQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJY3RybF9leHBvcnRQYXRoLnNldEZvY3VzKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJV2l6YXJkIHdpemFyZCA9IChXaXphcmQpIGdldFdpemFyZCgpOwotCQkKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQl3aXphcmQuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVRvRGF0YU1vZGVsKCkgewotCQlTdHJpbmcgbGliTmFtZSA9IGN0cmxfZXhwb3J0UGF0aC5nZXRUZXh0KCk7Ci0JCWlmIChsaWJOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJaWYgKCFsaWJOYW1lLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSl7Ci0JCQkJbGliTmFtZSA9IGxpYk5hbWUuc3Vic3RyaW5nKGxpYk5hbWUubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKzEsIGxpYk5hbWUubGVuZ3RoKCkpOwotCQkJfWVsc2UKLQkJCQlsaWJOYW1lID0gIiI7Ci0JCX0KLQkJbGxEYXRhLnNldExpYk5hbWUobGliTmFtZSk7Ci0JCWxsRGF0YS5zZXRQYXJlbnRGb2xkZXIoY3RybF9leHBvcnRQYXRoLmdldFRleHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5EaXJlY3RvcnlEaWFsb2coKSB7Ci0JCXRyeSB7Ci0JCQlEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGNvbnRhaW5lci5nZXRTaGVsbCgpLAotCQkJCQlTV1QuTk9ORSk7Ci0JCQlkZC5zZXRGaWx0ZXJQYXRoKGN0cmxfZXhwb3J0UGF0aC5nZXRUZXh0KCkpOwotCi0JCQlTdHJpbmcgZGVzdGluYXRpb24gPSBkZC5vcGVuKCk7Ci0JCQlpZiAoZGVzdGluYXRpb24gIT0gbnVsbCkgewotCQkJCWN0cmxfZXhwb3J0UGF0aC5zZXRUZXh0KGRlc3RpbmF0aW9uKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiB1c2UgdGhlIG9wZW5lZCBkaXJzIHRvIGluaXQgY29tYm8gbGlzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb21ib0l0ZW1zKCl7Ci0JCXJldHVybjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0NoZWNraW5nUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4MGY0MjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklDb25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25DbG9zdXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyB0aGUgcmVzdWx0IG9mIGEgY29uZmlndXJhdGlvbiBpbnRlZ3JpdHkgY2hlY2suCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFRleHRWaWV3ZXIgdGV4dFZpZXdlcjsKLQotCXByaXZhdGUgVGV4dFByZXNlbnRhdGlvbiBzdHlsZTsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YTsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25DbG9zdXJlIGNsb3N1cmUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlKENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLmNoZWNrQ29uZmlnUGFnZV90aXRsZSk7IAotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuY2hlY2tDb25maWdQYWdlX2Rlc2MpOyAKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9FeHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXRleHRWaWV3ZXIgPSBjcmVhdGVUZXh0Vmlld2VyKGNvbnRhaW5lciwgMzYwLCAxNjAsIDEpOwotCQlEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQl0ZXh0Vmlld2VyLnNldERvY3VtZW50KGRvYyk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlTdW1tYXJ5KCkgewotCQlzdHlsZSA9IG5ldyBUZXh0UHJlc2VudGF0aW9uKCk7Ci0JCURvY3VtZW50IGRvYyA9IGdldFN1bW1hcnlUZXh0KCk7Ci0JCXRleHRWaWV3ZXIuc2V0RG9jdW1lbnQoZG9jKTsKLQkJdGV4dFZpZXdlci5jaGFuZ2VUZXh0UHJlc2VudGF0aW9uKHN0eWxlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWRpc3BsYXlTdW1tYXJ5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRvY3VtZW50IG9mIHN1bW1hcnkgdGV4dC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0U3VtbWFyeVRleHQoKSB7Ci0JCWZpbmFsIFN0cmluZ0J1ZmZlciB0ZXh0QnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWlmIChkYXRhLnNlbGVjdGVkQ29uZmlncy5zaXplKCkgPT0gMCkgewotCQkJdGV4dEJ1Zi5hcHBlbmQoRXhwb3J0UmVzb3VyY2VzLkV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlmaW5hbCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBkYXRhLnNlbGVjdGVkQ29uZmlncwotCQkJCQkuZ2V0KDApOwotCQkJaWYgKChjbG9zdXJlID09IG51bGwpIHx8IChjbG9zdXJlLmdldENvbmZpZ3VyYXRpb24oKSAhPSBjb25maWcpKSB7Ci0JCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJLy8gQ2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gY2xvc3VyZS4KLQkJCQkJCWNsb3N1cmUgPSBuZXcgQ29uZmlndXJhdGlvbkNsb3N1cmUoY29uZmlnKTsKLQkJCQkJfQotCi0JCQkJfTsKLQotCQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIEV4cG9ydFJlc291cmNlcy5FeHBvcnRDb25maWdDaGVja2luZ1BhZ2VfY2hlY2tpbmcpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlMaXN0IGVycm9ycyA9IGNsb3N1cmUuZ2V0QWxsRXJyb3JzKCk7Ci0JCWlmIChlcnJvcnMuc2l6ZSgpID09IDApIHsKLQkJCXRleHRCdWYuYXBwZW5kKEV4cG9ydFJlc291cmNlcy5FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8zKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJdGV4dEJ1ZgotCQkJCQkuYXBwZW5kKEV4cG9ydFJlc291cmNlcy5iaW5kKEV4cG9ydFJlc291cmNlcy5FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV80LCAobmV3IE9iamVjdFtdIHsgSW50ZWdlci50b1N0cmluZyhlcnJvcnMuc2l6ZSgpKSB9KSkpOyAKLQkJfQotCi0JCURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCh0ZXh0QnVmLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gZG9jOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmODQyMDU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0Nob29zZU1vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgZGlzcGxheXMgdGhlIHR5cGVzIG9mIGNvbmZpZ3VyYXRpb24gdGhhdCBjYW4gYmUgZXhwb3J0ZWQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRDb25maWdDaG9vc2VNb2RlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBFeHBvcnRDb25maWdDaG9vc2VNb2RlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBCdXR0b24gb25lQ29uZmlnQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY29uZmlnU3BlY0J1dHRvbjsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydENvbmZpZ0Nob29zZU1vZGUoQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYyk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9FeHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCW9uZUNvbmZpZ0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGNvbnRhaW5lciwKLQkJCQlFeHBvcnRSZXNvdXJjZXMuc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnTGFiZWxfdGV4dCwgMSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCQljb25maWdTcGVjQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdTcGVjc0xhYmVsX3RleHQsIDEsCi0JCQkJZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJb25lQ29uZmlnQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQljb25maWdTcGVjQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVEYXRhVG9Nb2RlbCgpIHsKLQkJZGF0YS5leHBvcnRPbmVDb25maWcgPSBvbmVDb25maWdCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWRhdGEuZXhwb3J0Q29uZmlnU3BlY3MgPSBjb25maWdTcGVjQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBnZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZURhdGFUb01vZGVsKCk7Ci0JCWlmIChkYXRhLmV4cG9ydE9uZUNvbmZpZykgewotCQkJRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZSBwYWdlID0gKChFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuc2VsZWN0Q29uZmlnUGFnZTsKLQkJCXJldHVybiBwYWdlOwotCQl9IGVsc2UgaWYgKGRhdGEuZXhwb3J0Q29uZmlnU3BlY3MpIHsKLQkJCUV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZSBwYWdlID0gKChFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuc2VsZWN0U3BlY3NQYWdlOwotCQkJcmV0dXJuIHBhZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdEZXN0aW5hdGlvblBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNDQwNDM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLQotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIGZvciB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IG9mIGFuCi0gKiBleHBvcnQgb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0Q29uZmlnRGVzdGluYXRpb25QYWdlIGV4dGVuZHMgRGVzdGluYXRpb25Db21tb25QYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IEV4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSwgZGF0YS5sbERhdGEpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuc2VsZWN0RGVzdGluYXRpb25QYWdlX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc2VsZWN0RGVzdGluYXRpb25QYWdlX2Rlc2MpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCUV4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkID0gKEV4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpOwotCQlpZiAoY3RybF9leHBvcnRQYXRoLmdldFRleHQoKS5sZW5ndGgoKT4wICYmICFjdHJsX2V4cG9ydFBhdGguZ2V0VGV4dCgpLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJc2F2ZVRvRGF0YU1vZGVsKCk7Ci0JCQl3aXphcmQub2tUb0NvbXBsZXRlID0gdHJ1ZTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXdpemFyZC5va1RvQ29tcGxldGUgPSBmYWxzZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRGVzdGluYXRpb25Db21tb25QYWdlI2luaXRDb21ib0l0ZW1zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29tYm9JdGVtcygpIHsKLQkJTGlzdCBkaXJMaXN0ID0gRXhwb3J0VUlQcmVmZXJlbmNlcy5nZXRSZWNlbnRseUV4cG9ydGVkQ29uZmlnRGlycygpOwotCQkKLQkJaWYoZGlyTGlzdCE9bnVsbCAmJiAhZGlyTGlzdC5pc0VtcHR5KCkpewotCQkJU3RyaW5nW10gZGlycyA9IG5ldyBTdHJpbmdbZGlyTGlzdC5zaXplKCldOwotCQkJZm9yKGludCBpPTA7IGk8ZGlyTGlzdC5zaXplKCk7IGkrKyl7Ci0JCQkJZGlyc1tpXSA9IGRpckxpc3QuZ2V0KGkpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQljdHJsX2V4cG9ydFBhdGguc2V0SXRlbXMoZGlycyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDNiNTNlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvCi0gKiBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBFeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgY3RybF90YWJsZVZpZXdlcjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmRGVzYzsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UoQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnUGFnZV90aXRsZSk7IAotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnUGFnZV9kZXNjKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL0V4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBFeHBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnUGFnZV9jb25maWdzTGFiZWxfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQljdHJsX3RhYmxlVmlld2VyID0gY3JlYXRlVGFibGVWaWV3ZXIoY29udGFpbmVyLCAzNjAsIDEyMCwgMSk7Ci0JCXRhYmxlID0gY3RybF90YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kQ29uZmlndXJhdGlvbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQljdHJsX3RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWN0cmxfdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJaWYgKGNvbmZpZ3MgIT0gbnVsbCkgewotCQkJY3RybF90YWJsZVZpZXdlci5zZXRJbnB1dChjb25maWdzKTsKLQkJfQotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQpOyAvLyROT04tTkxTLTEkCi0KLQkJY3RybF9icmllZkRlc2MgPSBjcmVhdGVUZXh0TXVsdGkoY29udGFpbmVyLCAiIiwgMzYwLCA4MCwgMyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoY29uZmlncyAhPSBudWxsICYmIGNvbmZpZ3MubGVuZ3RoID4gMCkgewotCQkJdGFibGUuc2VsZWN0KDApOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF0pOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF90YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBjb25maWdzID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCXNldERpc3BsYXlBdHRyaWJ1dGVzKChNZXRob2RDb25maWd1cmF0aW9uKSBjb25maWdzWzBdKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGxheUF0dHJpYnV0ZXMoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChjb25maWcuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRGF0YVRvTW9kZWwoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY3RybF90YWJsZVZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0W10gY29uZmlncyA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF07Ci0JCUxpc3QgYXJyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYXJyTGlzdC5hZGQoY29uZmlnKTsKLQkJZGF0YS5zZWxlY3RlZENvbmZpZ3MgPSBhcnJMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZURhdGFUb01vZGVsKCk7Ci0JCUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZSBwYWdlID0gKChFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuY29uZmlnQ2hlY2tpbmdQYWdlOwotCQlwYWdlLm9uRW50ZXJQYWdlKG51bGwpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnU2VsZWN0U3BlY3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3YjIzMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnU2VsZWN0U3BlY3NQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZAotICogY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucyB0byBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSUNoZWNrU3RhdGVMaXN0ZW5lciwgTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gRXhwb3J0Q29uZmlnU2VsZWN0U3BlY3NQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjdHJsX2Noa2JveFRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZEZXNjOwotCi0JcHJpdmF0ZSBpbnQgY2hlY2tlZENvdW50ID0gMDsKLQotCXByaXZhdGUgTGlzdCBjaGVja2VkQ29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdTcGVjc1BhZ2VfdGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdTcGVjc1BhZ2VfZGVzYyk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9FeHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgRXhwb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyID0gY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcihjb250YWluZXIsIDEpOwotCQl0YWJsZSA9IGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uW10gY29uZmlncyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTjsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWlmIChjb25maWdzICE9IG51bGwpIHsKLQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0SW5wdXQoY29uZmlncyk7Ci0JCX0KLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQkJY3RybF9icmllZkRlc2MgPSBjcmVhdGVUZXh0TXVsdGkoY29udGFpbmVyLCAiIiwgMzYwLCA4MCwgMyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoY29uZmlncyAhPSBudWxsICYmIGNvbmZpZ3MubGVuZ3RoID4gMCkgewotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF0pOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyI2NoZWNrU3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBvYmogPSBldmVudC5nZXRFbGVtZW50KCk7Ci0KLQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJY2hlY2tlZENvdW50Kys7Ci0JCQljaGVja2VkQ29uZmlnTGlzdC5hZGQob2JqKTsKLQkJfSBlbHNlIHsKLQkJCWNoZWNrZWRDb3VudC0tOwotCQkJY2hlY2tlZENvbmZpZ0xpc3QucmVtb3ZlKG9iaik7Ci0JCX0KLQotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIGNvbmZpZ3MgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGxheUF0dHJpYnV0ZXMoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChjb25maWcuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKGdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBjaGVja2VkQ291bnQgPiAwOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVEYXRhVG9Nb2RlbCgpIHsKLQkJZGF0YS5zZWxlY3RlZENvbmZpZ3MgPSBjaGVja2VkQ29uZmlnTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXNhdmVEYXRhVG9Nb2RlbCgpOwotCQlFeHBvcnRDb25maWdEZXN0aW5hdGlvblBhZ2UgcGFnZSA9ICgoRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLmRlc3RpbmF0aW9uUGFnZTsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlNjJmMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuU2F2ZUFsbEVkaXRvcnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuRGlyZWN0b3J5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLQotLyoqCi0gKiBUaGUgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZSBtb2RlUGFnZTsKLQotCXByb3RlY3RlZCBFeHBvcnRDb25maWdTZWxlY3RTcGVjc1BhZ2Ugc2VsZWN0U3BlY3NQYWdlOwotCi0JcHJvdGVjdGVkIEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2Ugc2VsZWN0Q29uZmlnUGFnZTsKLQotCXByb3RlY3RlZCBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2UgY29uZmlnQ2hlY2tpbmdQYWdlOwotCi0JcHJvdGVjdGVkIEV4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZSBkZXN0aW5hdGlvblBhZ2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBva1RvQ29tcGxldGUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhID0gbmV3IENvbmZpZ3VyYXRpb25FeHBvcnREYXRhKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKCkgewotCQlzZXRXaW5kb3dUaXRsZShFeHBvcnRSZXNvdXJjZXMuZXhwb3J0Q29uZmlnV2l6YXJkX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJU2F2ZUFsbEVkaXRvcnNQYWdlLmFkZFBhZ2VJZk5lZWRlZCh0aGlzLCBmYWxzZSwgbnVsbCwgbnVsbCwKLQkJCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL3dpemJhbi9FeHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQltb2RlUGFnZSA9IG5ldyBFeHBvcnRDb25maWdDaG9vc2VNb2RlKGRhdGEpOwotCQlhZGRQYWdlKG1vZGVQYWdlKTsKLQotCQlzZWxlY3RTcGVjc1BhZ2UgPSBuZXcgRXhwb3J0Q29uZmlnU2VsZWN0U3BlY3NQYWdlKGRhdGEpOwotCQlhZGRQYWdlKHNlbGVjdFNwZWNzUGFnZSk7Ci0KLQkJc2VsZWN0Q29uZmlnUGFnZSA9IG5ldyBFeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlKGRhdGEpOwotCQlhZGRQYWdlKHNlbGVjdENvbmZpZ1BhZ2UpOwotCi0JCWNvbmZpZ0NoZWNraW5nUGFnZSA9IG5ldyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2UoZGF0YSk7Ci0JCWFkZFBhZ2UoY29uZmlnQ2hlY2tpbmdQYWdlKTsKLQotCQlkZXN0aW5hdGlvblBhZ2UgPSBuZXcgRXhwb3J0Q29uZmlnRGVzdGluYXRpb25QYWdlKGRhdGEpOwotCQlhZGRQYWdlKGRlc3RpbmF0aW9uUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUxpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX0NPTkZJR1VSQVRPTik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJLy8gQ2Fubm90IGNvbXBsZXRlIHRoZSB3aXphcmQgaWYgaXQncyBub3QgdGhlIGxhc3QgcGFnZS4KLQkJaWYgKHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSAhPSBkZXN0aW5hdGlvblBhZ2UpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBva1RvQ29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlTdHJpbmcgZXhwb3J0TGliUGF0aCA9IGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpOwotCQlpZiAoIWNoZWNrQW5kQ3JlYXRlRGlyKGV4cG9ydExpYlBhdGgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IKLQkJCQkJCQkuYmVnaW5UYXNrKAotCQkJCQkJCQkJRXhwb3J0UmVzb3VyY2VzLmV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJaWYgKGRhdGEudmFsaWRhdGUoKSkgewotCQkJCQkJaWYgKGRhdGEuZXhwb3J0Q29uZmlnU3BlY3MpIHsKLQkJCQkJCQkvLyBFeHBvcnQgY29uZmlndXJhdGlvbiBzcGVjcyBvbmx5LgotCQkJCQkJCShuZXcgQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZShkYXRhKSkKLQkJCQkJCQkJCS5ydW4obW9uaXRvcik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEV4cG9ydCBhIGNvbmZpZ3VyYXRpb24gY2xvc3VyZS4KLQkJCQkJCQkobmV3IENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlKGRhdGEpKS5ydW4obW9uaXRvcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUV4cG9ydFJlc291cmNlcy5leHBvcnRDb25maWdFcnJvckRpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQlyZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZGF0YS5lcnJvck1zZyAhPSBudWxsICYmIGRhdGEuZXJyb3JNc2cubGVuZ3RoKCkgPiAwKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJRXhwb3J0UmVzb3VyY2VzLmV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCWRhdGEuZXJyb3JNc2cpOwotCQl9Ci0JCQotCQkvL3JlY29yZCB0aGlzIGV4cG9ydCBwYXRoIGludG8gcHJlZmVyZW5jZSBzdG9yZSB3aGVuIHN1Y2Nlc3MKLQkJRXhwb3J0VUlQcmVmZXJlbmNlcy5hZGRSZWNlbnRseUV4cG9ydENvbmZpZ0RpcihleHBvcnRMaWJQYXRoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tBbmRDcmVhdGVEaXIoU3RyaW5nIGRpcikgewotCQlyZXR1cm4gRGlyZWN0b3J5VmFsaWRhdG9yLmNoZWNrQW5kQ3JlYXRlRGlyKGRpciwgRXhwb3J0UmVzb3VyY2VzLmV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJRXhwb3J0UmVzb3VyY2VzLkV4cG9ydFBsdWdpbkVycm9yX21zZyk7IAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFBsdWdpblN1bW1hcnlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQzMmRhNTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyBhIHN1bW1hcnkgb2YgdGhlIHNlbGVjdGVkIG1ldGhvZCBwbHVnLWlucyB0aGF0Ci0gKiB3aWxsIGJlIGV4cG9ydGVkLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IEV4cG9ydFBsdWdpblN1bW1hcnlQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUZXh0Vmlld2VyIHRleHRWaWV3ZXI7Ci0KLQlwcml2YXRlIFRleHRQcmVzZW50YXRpb24gc3R5bGU7Ci0KLQlwcml2YXRlIFBsdWdpbkV4cG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydFBsdWdpblN1bW1hcnlQYWdlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfdGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9kZXNjKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL0V4cG9ydE1ldGhvZFBsdWdpbnMuZ2lmIikpOyAvLyROT04tTkxTLTEkCQkKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXRleHRWaWV3ZXIgPSBjcmVhdGVUZXh0Vmlld2VyKGNvbnRhaW5lciwgMzYwLCAxNjAsIDEpOwotCQlEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoIiIpOyAvLyROT04tTkxTLTEkCQkKLQkJdGV4dFZpZXdlci5zZXREb2N1bWVudChkb2MpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwbGF5U3VtbWFyeSgpIHsKLQkJc3R5bGUgPSBuZXcgVGV4dFByZXNlbnRhdGlvbigpOwotCQlEb2N1bWVudCBkb2MgPSBnZXRTdW1tYXJ5VGV4dCgpOwotCQl0ZXh0Vmlld2VyLnNldERvY3VtZW50KGRvYyk7Ci0JCXRleHRWaWV3ZXIuY2hhbmdlVGV4dFByZXNlbnRhdGlvbihzdHlsZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlkaXNwbGF5U3VtbWFyeSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBkb2N1bWVudCBvZiB0aGUgc3VtbWFyeSB0ZXh0LgotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRTdW1tYXJ5VGV4dCgpIHsKLQkJU3RyaW5nQnVmZmVyIHRleHRCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJaWYgKGRhdGEuc2VsZWN0ZWRQbHVnaW5zID09IG51bGwgfHwgZGF0YS5zZWxlY3RlZFBsdWdpbnMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG5ldyBEb2N1bWVudChFeHBvcnRSZXNvdXJjZXMuZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2Vfbm9QbHVnaW5fdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLnNlbGVjdGVkUGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGRhdGEuc2VsZWN0ZWRQbHVnaW5zLmdldChpKTsKLQkJCXN0YXJ0ID0gdGV4dEJ1Zi5sZW5ndGgoKTsKLQkJCW9mZnNldCA9IHBsdWdpbi5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQlzdHlsZS5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBvZmZzZXQsIG51bGwsIG51bGwsCi0JCQkJCVNXVC5CT0xEKSk7Ci0JCQl0ZXh0QnVmLmFwcGVuZChwbHVnaW4uZ2V0TmFtZSgpKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJc3RhcnQgPSB0ZXh0QnVmLmxlbmd0aCgpOwotCQkJb2Zmc2V0ID0gQXV0aG9yaW5nVUlUZXh0LkFVVEhPUlNfVEVYVC5sZW5ndGgoKTsKLQkJCXN0eWxlLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIG9mZnNldCwgbnVsbCwgbnVsbCwKLQkJCQkJU1dULkJPTEQgfCBTV1QuSVRBTElDKSk7Ci0JCQl0ZXh0QnVmCi0JCQkJCS5hcHBlbmQoIlx0IikuYXBwZW5kKEF1dGhvcmluZ1VJVGV4dC5BVVRIT1JTX1RFWFQpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXh0QnVmLmFwcGVuZCgiXHRcdCIpLmFwcGVuZChwbHVnaW4uZ2V0QXV0aG9ycygpKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlzdGFydCA9IHRleHRCdWYubGVuZ3RoKCk7Ci0JCQlvZmZzZXQgPSBBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9URVhULmxlbmd0aCgpOwotCQkJc3R5bGUuYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgb2Zmc2V0LCBudWxsLCBudWxsLAotCQkJCQlTV1QuQk9MRCB8IFNXVC5JVEFMSUMpKTsKLQkJCXRleHRCdWYKLQkJCQkJLmFwcGVuZCgiXHQiKS5hcHBlbmQoQXV0aG9yaW5nVUlUZXh0LlZFUlNJT05fVEVYVCkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRleHRCdWYuYXBwZW5kKCJcdFx0IikuYXBwZW5kKHBsdWdpbi5nZXRWZXJzaW9uKCkpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCXN0YXJ0ID0gdGV4dEJ1Zi5sZW5ndGgoKTsKLQkJCW9mZnNldCA9IEF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhULmxlbmd0aCgpOwotCQkJc3R5bGUuYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgb2Zmc2V0LCBudWxsLCBudWxsLAotCQkJCQlTV1QuQk9MRCB8IFNXVC5JVEFMSUMpKTsKLQkJCXRleHRCdWYKLQkJCQkJLmFwcGVuZCgiXHQiKS5hcHBlbmQoQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXh0QnVmCi0JCQkJCS5hcHBlbmQoIlx0XHQiKS5hcHBlbmQocGx1Z2luLmdldEJyaWVmRGVzY3JpcHRpb24oKSkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJc3RhcnQgPSB0ZXh0QnVmLmxlbmd0aCgpOwotCQkJb2Zmc2V0ID0gRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0Lmxlbmd0aCgpOyAvLyROT04tTkxTLTEkCi0JCQlzdHlsZS5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBvZmZzZXQsIG51bGwsIG51bGwsCi0JCQkJCVNXVC5CT0xEIHwgU1dULklUQUxJQykpOwotCQkJdGV4dEJ1ZgotCQkJCQkuYXBwZW5kKCJcdCIpLmFwcGVuZChFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQpLmFwcGVuZCgiXG4iKTsgCi0JCQlMaXN0IGRlcGVuZGVudFBsdWdpbkxpc3QgPSBwbHVnaW4uZ2V0QmFzZXMoKTsKLQkJCWJvb2xlYW4gYWRkTGluZWZlZWQgPSB0cnVlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVwZW5kZW50UGx1Z2luTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJCXRleHRCdWYuYXBwZW5kKCJcdFx0IikuYXBwZW5kKGVsZW1lbnQuZ2V0TmFtZSgpKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWFkZExpbmVmZWVkID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoYWRkTGluZWZlZWQpCi0JCQkJdGV4dEJ1Zi5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJc3RhcnQgPSB0ZXh0QnVmLmxlbmd0aCgpOwotCQkJb2Zmc2V0ID0gRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dC5sZW5ndGgoKTsgLy8kTk9OLU5MUy0xJAotCQkJc3R5bGUuYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgb2Zmc2V0LCBudWxsLCBudWxsLAotCQkJCQlTV1QuQk9MRCB8IFNXVC5JVEFMSUMpKTsKLQkJCXRleHRCdWYKLQkJCQkJLmFwcGVuZCgiXHQiKS5hcHBlbmQoRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dCkuYXBwZW5kKCJcbiIpOyAKLQkJCUxpc3QgYXNzb2NpYXRlZENvbmZpZ0xpc3QgPSAoTGlzdCkgZGF0YS5hc3NvY2lhdGVkQ29uZmlnTWFwCi0JCQkJCS5nZXQocGx1Z2luKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFzc29jaWF0ZWRDb25maWdMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGVsZW1lbnQgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJdGV4dEJ1Zi5hcHBlbmQoIlx0XHQiKS5hcHBlbmQoZWxlbWVudC5nZXROYW1lKCkpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCXRleHRCdWYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQodGV4dEJ1Zi50b1N0cmluZygpKTsKLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFBsdWdpbldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0UGx1Z2luV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyZWY5YjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0UGx1Z2luV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TYXZlQWxsRWRpdG9yc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5EaXJlY3RvcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotCi0vKioKLSAqIFRoZSBFeHBvcnQgTWV0aG9kIFBsdWctaW4gd2l6YXJkLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRQbHVnaW5XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJSW1wb3J0V2l6YXJkIHsKLQotCXByb3RlY3RlZCBTZWxlY3RQbHVnaW5QYWdlIHBhZ2UxOwotCi0JcHJvdGVjdGVkIFBsdWdpbkluZm9QYWdlIHBhZ2UyOwotCi0JcHJvdGVjdGVkIEV4cG9ydFBsdWdpblN1bW1hcnlQYWdlIHBhZ2UzOwotCi0JcHJvdGVjdGVkIFNhdmVQbHVnaW5QYWdlIHBhZ2U0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gb2tUb0NvbXBsZXRlID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgUGx1Z2luRXhwb3J0RGF0YSBkYXRhID0gbmV3IFBsdWdpbkV4cG9ydERhdGEoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydFBsdWdpbldpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoRXhwb3J0UmVzb3VyY2VzLmV4cG9ydFBsdWdpbnNXaXphcmRfdGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIGZhbHNlLCBudWxsLCBudWxsLAotCQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvd2l6YmFuL0V4cG9ydE1ldGhvZFBsdWdpbnMuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLQkJcGFnZTEgPSBuZXcgU2VsZWN0UGx1Z2luUGFnZShkYXRhKTsKLQkJYWRkUGFnZShwYWdlMSk7Ci0KLQkJcGFnZTIgPSBuZXcgUGx1Z2luSW5mb1BhZ2UoZGF0YSk7Ci0JCWFkZFBhZ2UocGFnZTIpOwotCi0JCXBhZ2UzID0gbmV3IEV4cG9ydFBsdWdpblN1bW1hcnlQYWdlKGRhdGEpOwotCQlhZGRQYWdlKHBhZ2UzKTsKLQotCQlwYWdlNCA9IG5ldyBTYXZlUGx1Z2luUGFnZShkYXRhKTsKLQkJYWRkUGFnZShwYWdlNCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSAhPSBwYWdlNCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9rVG9Db21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCVN0cmluZyBleHBvcnRMaWJQYXRoID0gZGF0YS5sbERhdGEuZ2V0UGFyZW50Rm9sZGVyKCk7Ci0JCWlmIChjaGVja0FuZENyZWF0ZURpcihleHBvcnRMaWJQYXRoKSA9PSBmYWxzZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yCi0JCQkJCQkJLmJlZ2luVGFzaygKLQkJCQkJCQkJCUV4cG9ydFJlc291cmNlcy5FeHBvcnRQbHVnaW5XaXphcmRfTVNHMSwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCWlmIChkYXRhLnZhbGlkYXRlKCkpIHsKLQkJCQkJCShuZXcgUGx1Z2luRXhwb3J0U2VydmljZShkYXRhKSkucnVuKG1vbml0b3IpOwotCQkJCQl9Ci0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJRXhwb3J0UGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJRXhwb3J0UmVzb3VyY2VzLkV4cG9ydFBsdWdpbldpemFyZF9lcnJvciwgcmVhbEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0vLwkJcmVjb3JkIHRoaXMgZXhwb3J0IHBhdGggaW50byBwcmVmZXJlbmNlIHN0b3JlIHdoZW4gc3VjY2VzcwotCQlFeHBvcnRVSVByZWZlcmVuY2VzLmFkZFJlY2VudGx5RXhwb3J0UGx1Z2luRGlyKGV4cG9ydExpYlBhdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0FuZENyZWF0ZURpcihTdHJpbmcgZGlyKSB7Ci0JCXJldHVybiBEaXJlY3RvcnlWYWxpZGF0b3IuY2hlY2tBbmRDcmVhdGVEaXIoZGlyLCBFeHBvcnRSZXNvdXJjZXMuRXhwb3J0UGx1Z2luV2l6YXJkX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJRXhwb3J0UmVzb3VyY2VzLkV4cG9ydFBsdWdpbkVycm9yX21zZyk7IAotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFVJUHJlZmVyZW5jZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFVJUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGEzNzEzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRVSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBleHBvcnQgVUkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgaG9wZXNoYXJlZAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0VUlQcmVmZXJlbmNlcyB7Ci0JCi0JLyoqCi0JICogVGhlIHJlY2VudGx5IG9wZW5lZCBkaXIgcHJlZmVyZW5jZSBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9ERUxJTUlURVIgPSAiOyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBzZXQgPGNvZGU+MTA8L2NvZGU+IGFzIHRoZSBkZWZhdWx0IGxlbmd0aCBvZiB0aGUgY29tYm8gcG9wdXAgbGlzdAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBSUxfTElTVF9MRU5HVEggPSAxMDsKLQkKLQkvKioKLQkgKiBUaGUgRXhwb3J0IFBsdWdpbiBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0VYUE9SVF9QTFVHSU5fUEFUSCA9ICJsYXN0RXhwb3J0UGx1Z2luUGF0aCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgRXhwb3J0IENvbmZpZ3VyYXRpb24gcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9FWFBPUlRfQ09ORklHX1BBVEggPSAibGFzdEV4cG9ydENvbmZpZ1BhdGgiOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgZXhwb3J0IHBhdGguCi0JICogCi0JICogQHJldHVybiBUaGUgZGVmYXVsdCBleHBvcnQgcGF0aC4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEV4cG9ydFBhdGgoKSB7Ci0JCVN0cmluZyBkZWZFeHBvcnRQUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikgKyAvLyROT04tTkxTLTEkCi0JCQkJRmlsZVV0aWwuRklMRV9TRVAgKyBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpICsgCi0JCQkJRmlsZVV0aWwuRklMRV9TRVAgKyAiRXhwb3J0IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVmRXhwb3J0UFBhdGg7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHJlY2VudGx5IG9wZW5lZCBtZXRob2QgcGx1Z2luIGRpciBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSZWNlbnRseUV4cG9ydGVkUGx1Z2luRGlycygpIHsKLQkJTGlzdCBkaXJzID0gZ2V0UHJvcGVydHlMaXN0KExBU1RfRVhQT1JUX1BMVUdJTl9QQVRIKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChkaXJzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBkaXJzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgZGlyID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCXJlc3VsdC5hZGQoZGlyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSByZWNlbnRseSBvcGVuZWQgbWV0aG9kIHBsdWdpbiBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkaXIgICBleHBvcnQgcGx1Z2luIGRpcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZWNlbnRseUV4cG9ydFBsdWdpbkRpcihTdHJpbmcgZGlyKSB7Ci0JCWlmIChkaXIgPT0gbnVsbCB8fCBkaXIubGVuZ3RoKCk9PTApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgZGlycyA9IGdldFJlY2VudGx5RXhwb3J0ZWRQbHVnaW5EaXJzKCk7Ci0KLQkJYWRkUHJvcGVydHkoZGlycywgZGlyLCBMQVNUX0VYUE9SVF9QTFVHSU5fUEFUSCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHJlY2VudGx5IGV4cG9ydCBjb25maWcgZGlycyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSZWNlbnRseUV4cG9ydGVkQ29uZmlnRGlycygpIHsKLQkJLy9UT0RPCi0JCUxpc3QgZGlycyA9IGdldFByb3BlcnR5TGlzdChMQVNUX0VYUE9SVF9DT05GSUdfUEFUSCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGlycy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGlycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGRpciA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlyZXN1bHQuYWRkKGRpcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgcmVjZW50bHkgb3BlbmVkIG1ldGhvZCBjb25maWcgZGlyIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGRpciAgIGV4cG9ydCBjb25maWcgZGlyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlY2VudGx5RXhwb3J0Q29uZmlnRGlyKFN0cmluZyBkaXIpIHsKLQkJaWYgKGRpciA9PSBudWxsIHx8IGRpci5sZW5ndGgoKT09MCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBkaXJzID0gZ2V0UmVjZW50bHlFeHBvcnRlZENvbmZpZ0RpcnMoKTsKLQotCQlhZGRQcm9wZXJ0eShkaXJzLCBkaXIsIExBU1RfRVhQT1JUX0NPTkZJR19QQVRIKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIHRoZSBwcm9wZXJ0eSB0byB0aGUgZmlyc3QgcG9zaXRpb24uCi0JICogCi0JICogQHBhcmFtIG9sZFByb3BlcnR5TGlzdCAgIG9sZCBwcm9wZXJ0eSBsaXN0Ci0JICogQHBhcmFtIG5ld1Byb3BlcnR5ICAgICAgIG5ldyBwcm9wZXJ0eSB2YWx1ZSAKLQkgKiBAcGFyYW0gcHJvcGVydHlLZXkgICAgICAgdGFyZ2V0IHByb3BlcnR5IGtleQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkUHJvcGVydHkoTGlzdCBvbGRQcm9wZXJ0eUxpc3QsIFN0cmluZyBuZXdQcm9wZXJ0eSwgU3RyaW5nIHByb3BlcnR5S2V5KXsKLQkJTGlzdCBkaXJzUmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJaWYob2xkUHJvcGVydHlMaXN0LmNvbnRhaW5zKG5ld1Byb3BlcnR5KSkKLQkJCW9sZFByb3BlcnR5TGlzdC5yZW1vdmUobmV3UHJvcGVydHkpOwotCQkKLQkJZGlyc1Jlc3VsdC5hZGQoMCwgbmV3UHJvcGVydHkpOwotCQkKLQkJZm9yIChpbnQgaT0wOyBpPG9sZFByb3BlcnR5TGlzdC5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBvbGRQcm9wZXJ0eUxpc3QuZ2V0KGkpOwotCQkJZGlyc1Jlc3VsdC5hZGQoaSsxLCBwYXRoKTsKLQkJfQotCQkKLQkJaWYoZGlyc1Jlc3VsdC5zaXplKCk+Z2V0TGlzdExlbmd0aCgpKQotCQkJZGlyc1Jlc3VsdCA9IGRpcnNSZXN1bHQuc3ViTGlzdCgwLCBnZXRMaXN0TGVuZ3RoKCkpOwotCQkJCi0JCXNldFByb3BlcnR5TGlzdChwcm9wZXJ0eUtleSwgU3RyVXRpbC5jb252ZXJ0TGlzdFRvU3RyQXJyYXkoZGlyc1Jlc3VsdCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgcHJlZmVyZW5jZSBhcyBhCi0JICogPG9jZGU+TGlzdDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRQcm9wZXJ0eUxpc3QoU3RyaW5nIG5hbWUpIHsKLQkJTGlzdCBsaXN0ID0gY29udmVydFRvTGlzdChFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJLmdldFN0cmluZyhuYW1lKSk7Ci0JCWludCBsZW5ndGggPSBnZXRMaXN0TGVuZ3RoKCk7Ci0JCWlmKGxpc3Quc2l6ZSgpPmxlbmd0aCl7Ci0JCQlsaXN0ID0gbGlzdC5zdWJMaXN0KDAsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIFNhdmVzIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldFByb3BlcnR5TGlzdChTdHJpbmcgbmFtZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZChpdGVtc1tpXSk7Ci0JCQlidWZmZXIuYXBwZW5kKFBSRUZFUkVOQ0VfREVMSU1JVEVSKTsKLQkJfQotCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKG5hbWUsCi0JCQkJYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0cyB0aGUgc3VwcGxpZWQgUFJFRkVSRU5DRV9ERUxJTUlURVIgZGVsaW1pdGVkIHN0cmluZyBpbnRvIGEKLQkgKiA8Y29kZT5MaXN0PC9jb2RlPiBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbnZlcnRUb0xpc3QoU3RyaW5nIHByZWZlcmVuY2VWYWx1ZSkgewotCQlBcnJheUxpc3QgdG9waWNzID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcmVmZXJlbmNlVmFsdWUsCi0JCQkJUFJFRkVSRU5DRV9ERUxJTUlURVIpOwotCQlpbnQgdG9rZW5Db3VudCA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2VuQ291bnQ7IGkrKykgewotCQkJdG9waWNzLmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQl9Ci0JCXJldHVybiB0b3BpY3M7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiBsaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGlzdExlbmd0aCgpewotCQlTdHJpbmcgbGVuZ3RoID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9ISVNUT1JZX1NJWkUpOwotCQlpbnQgbGwgPSAwOwotCQlpZihsZW5ndGghPW51bGwgJiYgbGVuZ3RoLmxlbmd0aCgpPjApewotCQkJdHJ5ewotCQkJCWxsID0gSW50ZWdlci5wYXJzZUludChsZW5ndGgpOwotCQkJfWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxsPjA/bGw6REVGQUlMX0xJU1RfTEVOR1RIOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1BsdWdpbkluZm9QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9QbHVnaW5JbmZvUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTAxNTcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1BsdWdpbkluZm9QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gcmV2aWV3IHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIG1ldGhvZAotICogcGx1Zy1pbnMgdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQgZm9yIGV4cG9ydC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luSW5mb1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFBsdWdpbkluZm9QYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGN0cmxfdGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGN0cmxfZGVwZW5kUGx1Z2luc1ZpZXdlcjsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgY3RybF9hc3NvY2lhdGVkQ29uZmlnVmlld2VyOwotCi0JcHJpdmF0ZSBMaXN0IGRlcGVuZGVudFBsdWdpbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIExpc3QgYXNzb2NpYXRlZENvbmZpZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIFBsdWdpbkV4cG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBsdWdpbkluZm9QYWdlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfdGl0bGUpOyAKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2Rlc2MpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0TWV0aG9kUGx1Z2lucy5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQpOyAvLyROT04tTkxTLTEkCi0KLQkJY3RybF90YWJsZVZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKGNvbnRhaW5lciwgMzYwLCA2MCwgMSk7Ci0JCXRhYmxlID0gY3RybF90YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9QTFVHSU47Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZFBsdWdpbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQljdHJsX3RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWN0cmxfdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJaWYgKGRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkgIT0gbnVsbCkgewotCQkJY3RybF90YWJsZVZpZXdlci5zZXRJbnB1dChkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpLnRvQXJyYXkoKSk7Ci0JCX0KLQotCQljcmVhdGVMYWJlbCgKLQkJCQljb250YWluZXIsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWN0cmxfZGVwZW5kUGx1Z2luc1ZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKGNvbnRhaW5lciwgMzYwLCA2MCwgMSk7Ci0JCWN0cmxfZGVwZW5kUGx1Z2luc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX2RlcGVuZFBsdWdpbnNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJY3RybF9kZXBlbmRQbHVnaW5zVmlld2VyLnNldElucHV0KGRlcGVuZGVudFBsdWdpbkxpc3QpOwotCi0JCWNyZWF0ZUxhYmVsKAotCQkJCWNvbnRhaW5lciwKLQkJCQlFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfYXNzb2NpYXRlZENvbmZpZ3NMYWJlbF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWN0cmxfYXNzb2NpYXRlZENvbmZpZ1ZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKGNvbnRhaW5lciwgMzYwLCA2MCwgMSk7Ci0JCWN0cmxfYXNzb2NpYXRlZENvbmZpZ1ZpZXdlcgotCQkJCS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb25maWd1cmF0aW9uVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotCQljdHJsX2Fzc29jaWF0ZWRDb25maWdWaWV3ZXIKLQkJCQkuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJY3RybF9hc3NvY2lhdGVkQ29uZmlnVmlld2VyLnNldElucHV0KGFzc29jaWF0ZWRDb25maWdMaXN0KTsKLQotCQlpZiAoZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKSAhPSBudWxsCi0JCQkJJiYgIWRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkuaXNFbXB0eSgpKSB7Ci0JCQl0YWJsZS5zZWxlY3QoMCk7Ci0JCQlkaXNwbGF5UmVsYXRlZEluZm8oKE1ldGhvZFBsdWdpbikgZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKS5nZXQoMCkpOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWN0cmxfdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gcGx1Z2luID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCWRpc3BsYXlSZWxhdGVkSW5mbygoTWV0aG9kUGx1Z2luKSBwbHVnaW5bMF0pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKGRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkgIT0gbnVsbAotCQkJCSYmICFkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpLmlzRW1wdHkoKSkgewotCQkJY3RybF90YWJsZVZpZXdlci5zZXRJbnB1dChkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpLnRvQXJyYXkoKSk7Ci0JCQl0YWJsZS5zZWxlY3QoMCk7Ci0JCQlkaXNwbGF5UmVsYXRlZEluZm8oKE1ldGhvZFBsdWdpbikgZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKS5nZXQoMCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlSZWxhdGVkSW5mbyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlkZXBlbmRlbnRQbHVnaW5MaXN0ID0gcGx1Z2luLmdldEJhc2VzKCk7Ci0JCWN0cmxfZGVwZW5kUGx1Z2luc1ZpZXdlci5zZXRJbnB1dChkZXBlbmRlbnRQbHVnaW5MaXN0LnRvQXJyYXkoKSk7Ci0JCWFzc29jaWF0ZWRDb25maWdMaXN0ID0gTGlicmFyeVV0aWwuZ2V0QXNzb2NpYXRlZENvbmZpZ3VyYXRpb25zKHBsdWdpbik7Ci0JCWN0cmxfYXNzb2NpYXRlZENvbmZpZ1ZpZXdlci5zZXRJbnB1dChhc3NvY2lhdGVkQ29uZmlnTGlzdC50b0FycmF5KCkpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVEYXRhVG9Nb2RlbCgpIHsKLQkJLy9XaWxsIHJlZmFjdG9yIHRvIHVzZTogZGF0YS5idWlsZEFzc29jaWF0ZWRDb25maWdNYXAoKQotCQkKLQkJaWYgKGRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkgIT0gbnVsbCkgewotCQkJZGF0YS5hc3NvY2lhdGVkQ29uZmlnTWFwLmNsZWFyKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJCWRhdGEuYXNzb2NpYXRlZENvbmZpZ01hcC5wdXQoZWxlbWVudCwgTGlicmFyeVV0aWwKLQkJCQkJCS5nZXRBc3NvY2lhdGVkQ29uZmlndXJhdGlvbnMoZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzYXZlRGF0YVRvTW9kZWwoKTsKLQkJRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UgcGFnZSA9ICgoRXhwb3J0UGx1Z2luV2l6YXJkKSBnZXRXaXphcmQoKSkucGFnZTM7Ci0JCXBhZ2Uub25FbnRlclBhZ2UobnVsbCk7Ci0JCXJldHVybiBwYWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvU2F2ZVBsdWdpblBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1NhdmVQbHVnaW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkYjJkNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvU2F2ZVBsdWdpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0RGF0YTsKLQotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBpbmZvcm1zIHRoZSB1c2VyIHRoYXQgY2hhbmdlcyB0byB0aGUgZXhpc3RpbmcgbWV0aG9kCi0gKiBwbHVnLWlucyB3aWxsIGJlIHNhdmVkIHByaW9yIHRvIGFuIGV4cG9ydCBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNhdmVQbHVnaW5QYWdlIGV4dGVuZHMgRGVzdGluYXRpb25Db21tb25QYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNhdmVQbHVnaW5QYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNhdmVQbHVnaW5QYWdlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUsIGRhdGEubGxEYXRhKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLnNwZWNpZnlQYXRoUGFnZV90aXRsZSk7IAotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc3BlY2lmeVBhdGhQYWdlX2Rlc2MpOyAKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9FeHBvcnRNZXRob2RQbHVnaW5zLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlFeHBvcnRQbHVnaW5XaXphcmQgd2l6YXJkID0gKEV4cG9ydFBsdWdpbldpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCWlmIChjdHJsX2V4cG9ydFBhdGguZ2V0VGV4dCgpLmxlbmd0aCgpPjAgJiYgIWN0cmxfZXhwb3J0UGF0aC5nZXRUZXh0KCkuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQlzYXZlVG9EYXRhTW9kZWwoKTsKLQkJCXdpemFyZC5va1RvQ29tcGxldGUgPSB0cnVlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJd2l6YXJkLm9rVG9Db21wbGV0ZSA9IGZhbHNlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5EZXN0aW5hdGlvbkNvbW1vblBhZ2UjaW5pdENvbWJvSXRlbXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb21ib0l0ZW1zKCkgewotCQlMaXN0IGRpckxpc3QgPSBFeHBvcnRVSVByZWZlcmVuY2VzLmdldFJlY2VudGx5RXhwb3J0ZWRQbHVnaW5EaXJzKCk7Ci0JCQotCQlpZihkaXJMaXN0IT1udWxsICYmICFkaXJMaXN0LmlzRW1wdHkoKSl7Ci0JCQlTdHJpbmdbXSBkaXJzID0gbmV3IFN0cmluZ1tkaXJMaXN0LnNpemUoKV07Ci0JCQlmb3IoaW50IGk9MDsgaTxkaXJMaXN0LnNpemUoKTsgaSsrKXsKLQkJCQlkaXJzW2ldID0gZGlyTGlzdC5nZXQoaSkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWN0cmxfZXhwb3J0UGF0aC5zZXRJdGVtcyhkaXJzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvU2VsZWN0UGx1Z2luUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvU2VsZWN0UGx1Z2luUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YmQxODhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1NlbGVjdFBsdWdpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCB0aGUgbWV0aG9kIHBsdWctaW5zIHRvIGJlCi0gKiBleHBvcnRlZC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0UGx1Z2luUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSUNoZWNrU3RhdGVMaXN0ZW5lciwgTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0UGx1Z2luUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGN0cmxfY2hrYm94VGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9hdXRob3I7Ci0KLQlwcml2YXRlIFRleHQgY3RybF92ZXJzaW9uOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZEZXNjOwotCi0JcHJpdmF0ZSBpbnQgY2hlY2tlZENvdW50ID0gMDsKLQotCXByaXZhdGUgTGlzdDxPYmplY3Q+IGNoZWNrZWRQbHVnaW5MaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0KLQlwcml2YXRlIFBsdWdpbkV4cG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFBsdWdpblBhZ2UoUGx1Z2luRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3RQbHVnaW5zUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5zZWxlY3RQbHVnaW5zUGFnZV9kZXNjKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL0V4cG9ydE1ldGhvZFBsdWdpbnMuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIgPSBjcmVhdGVDaGVja2JveFRhYmxlVmlld2VyKGNvbnRhaW5lciwgMSk7Ci0JCXRhYmxlID0gY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCi0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJTGlzdCBwbHVnaW5zID0gKGxpYnJhcnkgPT0gbnVsbCkgPyBuZXcgQXJyYXlMaXN0KCkgOiBsaWJyYXJ5Ci0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTjsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kUGx1Z2luKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWlmIChwbHVnaW5zICE9IG51bGwpIHsKLQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0SW5wdXQocGx1Z2lucy50b0FycmF5KCkpOwotCQl9Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBBdXRob3JpbmdVSVRleHQuQVVUSE9SU19URVhUKTsKLQkJY3RybF9hdXRob3IgPSBjcmVhdGVUZXh0TXVsdGkoY29udGFpbmVyLCAiIiwgMzYwLCA0MCwgMyk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEF1dGhvcmluZ1VJVGV4dC5WRVJTSU9OX1RFWFQpOwotCQljdHJsX3ZlcnNpb24gPSBjcmVhdGVUZXh0KGNvbnRhaW5lciwgIiIsIDM2MCwgMyk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQkJY3RybF9icmllZkRlc2MgPSBjcmVhdGVUZXh0TXVsdGkoY29udGFpbmVyLCAiIiwgMzYwLCA4MCwgMyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAocGx1Z2lucyAhPSBudWxsICYmICFwbHVnaW5zLmlzRW1wdHkoKSkgewotCQkJdGFibGUuc2VsZWN0KDApOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZFBsdWdpbikgcGx1Z2lucy5nZXQoMCkpOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lciNjaGVja1N0YXRlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCi0JCWlmIChldmVudC5nZXRDaGVja2VkKCkpIHsKLQkJCWNoZWNrZWRDb3VudCsrOwotCQkJY2hlY2tlZFBsdWdpbkxpc3QuYWRkKG9iaik7Ci0JCX0gZWxzZSB7Ci0JCQljaGVja2VkQ291bnQtLTsKLQkJCWNoZWNrZWRQbHVnaW5MaXN0LnJlbW92ZShvYmopOwotCQl9Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBwbHVnaW4gPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZFBsdWdpbikgcGx1Z2luWzBdKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGxheUF0dHJpYnV0ZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQljdHJsX2F1dGhvci5zZXRUZXh0KHBsdWdpbi5nZXRBdXRob3JzKCkpOwotCQljdHJsX3ZlcnNpb24uc2V0VGV4dChwbHVnaW4uZ2V0VmVyc2lvbigpKTsKLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChwbHVnaW4uZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGNoZWNrZWRDb3VudCA+IDA7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZURhdGFUb01vZGVsKCkgewotCQlkYXRhLnNldFNlbGVjdGVkUGx1Z2lucyhjaGVja2VkUGx1Z2luTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzYXZlRGF0YVRvTW9kZWwoKTsKLQkJUGx1Z2luSW5mb1BhZ2UgcGFnZSA9ICgoRXhwb3J0UGx1Z2luV2l6YXJkKSBnZXRXaXphcmQoKSkucGFnZTI7Ci0JCXBhZ2Uub25FbnRlclBhZ2UobnVsbCk7Ci0JCXJldHVybiBwYWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4Yzc2NzlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpemFyZHMgZm9yIGV4cG9ydGluZyBtZXRob2QgcGx1Zy1pbnMgYW5kIGNvbmZpZ3VyYXRpb25zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTM2ZGM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkZWE5MDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5Eb2NQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5oZWxwCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUNsYXNzUGF0aDogZG9jLmphcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvYWNjZXNzaWJpbGl0eS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9hY2Nlc3NpYmlsaXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmM5YzkxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9hY2Nlc3NpYmlsaXR5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iQWNjZXNzaWJpbGl0eSIgbGlua190bz0ibWFpbi54bWwjYWNjZXNzaWJpbGl0eV9pZCI+Ci0gICA8dG9waWMgbGFiZWw9IktleWJvYXJkIG5hdmlnYXRpb24iIGhyZWY9Imh0bWwvaGVscC9hY19uYXZpZ2F0aW9uLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRm9udHMgYW5kIGNvbG9ycyIgaHJlZj0iaHRtbC9oZWxwL2FjX2ZvbnRzYW5kY29sb3JzLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3YTBhZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLXNvdXJjZS5kb2MuamFyID0gc3JjLwotb3V0cHV0LmRvYy5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGRvYy5qYXIsXAotICAgICAgICAgICAgICAgZG9jLnppcCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhY2Nlc3NpYmlsaXR5LnhtbCxcCi0gICAgICAgICAgICAgICBjYXRlZ29yaXppbmdfbWV0aG9kX2NvbnRlbnQueG1sLFwKLSAgICAgICAgICAgICAgIGNvZGVfbWFuYWdlbWVudC54bWwsXAotICAgICAgICAgICAgICAgY29uY2VwdHMueG1sLFwKLSAgICAgICAgICAgICAgIGNvbnRleHRzX2F1dGhvcmluZ191aS54bWwsXAotICAgICAgICAgICAgICAgY3JlYXRpbmdfbWV0aG9kX2NvbnRlbnQueG1sLFwKLSAgICAgICAgICAgICAgIGNyZWF0aW5nX3Byb2Nlc3Nlcy54bWwsXAotICAgICAgICAgICAgICAgZ2V0dGluZ3N0YXJ0ZWQueG1sLFwKLSAgICAgICAgICAgICAgIGdsb3NzYXJ5LnhtbCxcCi0gICAgICAgICAgICAgICBtYWluLnhtbCxcCi0gICAgICAgICAgICAgICBvdmVydmlldy54bWwsXAotICAgICAgICAgICAgICAgcHVibGlzaGluZ19leHBvcnRpbmcueG1sLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZS54bWwsXAotICAgICAgICAgICAgICAgdGFza3MueG1sLFwKLSAgICAgICAgICAgICAgIHR1dG9yaWFscy54bWwsXAotICAgICAgICAgICAgICAgY2hlYXRzaGVldHMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2F0ZWdvcml6ZW1ldGhjb250LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NhdGVnb3JpemVtZXRoY29udC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkNTI2OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2F0ZWdvcml6ZW1ldGhjb250LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iQ2F0ZWdvcml6ZSBtZXRob2QgY29udGVudCIgbGlua190bz0ibWFpbi54bWwjY2F0ZWdvcml6ZW1ldGhvZGNvbnRfaWQiPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIiBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIHZpZXcgd2l0aCBjdXN0b20gY2F0ZWdvcmllcyIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jdXN0b21fY2F0ZWdvcmllcy5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NhdGVnb3JpemluZ19tZXRob2RfY29udGVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jYXRlZ29yaXppbmdfbWV0aG9kX2NvbnRlbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTJjMzJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NhdGVnb3JpemluZ19tZXRob2RfY29udGVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkNhdGVnb3JpemluZyBtZXRob2QgY29udGVudCIgbGlua190bz0ibWFpbi54bWwjY2F0ZWdvcml6aW5nX21ldGhvZF9jb250ZW50X2lkIj4gIAotICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIG1ldGhvZCB2aWV3IHdpdGggY3VzdG9tIGNhdGVnb3JpZXMiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfY3VzdG9tX2NhdGVnb3JpZXMuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hZGRtZXRob2RyZWZfb3JfaHlwZXJsaW5rLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FkZG1ldGhvZHJlZl9vcl9oeXBlcmxpbmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDk4N2VmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FkZG1ldGhvZHJlZl9vcl9oeXBlcmxpbmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJBZGQgYSBNZXRob2QgUmVmZXJlbmNlIG9yIEh5cGVybGluayAoVVJMKSI+Ci0JPGludHJvIAotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rLmh0bWwiPgotCQk8ZGVzY3JpcHRpb24+VGhlcmUgYXJlIHR3byB0eXBlcyBvZiByZWZlcmVuY2VzIG9yIGh5cGVybGlua3MgdG8gb3RoZXIgY29udGVudCB3aXRoaW4geW91ciBjb250ZW50IHRleHQ6IHJlZmVyZW5jZXMgIHRvIG90aGVyIGVsZW1lbnRzIGluIHRoZSBtZXRob2QgbGlicmFyeSBvciByZWZlcmVuY2VzIHRvIGV4dGVybmFsIHRleHQgb3V0c2lkZSB0aGUgbWV0aG9kIGxpYnJhcnkgd2l0aCBhIFVSTC4gVGhpcyBjaGVhdCBzaGVldCB3YWxrcyB5b3UgdGhyb3VnaCBjcmVhdGluZyBib3RoIHR5cGVzLjwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQotCTxpdGVtCi0JCXRpdGxlPSJDcmVhdGUgYSBIeXBlcmxpbmsgdG8gYW5vdGhlciBlbGVtZW50IGluIHRoZSBNZXRob2QgTGlicmFyeSIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+WW91IGNhbiByZWNvZ25pemUgYSB0ZXh0IGZpZWxkIHRoYXQgc3VwcG9ydHMgaHlwZXJsaW5rcyBieSB0aGUgbGl0dGxlIHRyaWFuZ2xlIG5leHQgdG8gdGhlIHRleHQgZmllbGQncyBsYWJlbC4gIFRoaXMgdHJpYW5nbGUgYWxsb3dzIHlvdSB0byBleHBhbmQgdGhlIHRleHQgZmllbGQgaW50byBhIGZ1bGwgc2l6ZSBlZGl0b3Igd2l0aCBhbiBlZGl0b3IgdG9vbGJhciBwcm92aWRpbmcgcmljaCB0ZXh0IGVkaXRpbmcgZnVuY3Rpb25hbGl0eSBzdWNoIGFzIGZvbnQgc3R5bGVzLCBidWxsZXQgcG9pbnRzLCBldGMuPGJyLz48YnIvPlRvIGluc2VydCBhIGh5cGVybGluayB0byBhbm90aGVyIGVsZW1lbnQgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IGluIHRoZSB0ZXh0IGZpZWxkIHNpbXBseSBmaW5kIHRoZSBlbGVtZW50IGluIHRoZSBsaWJyYXJ5IG9yIGNvbmZpZ3VyYXRpb24gdmlldyBhbmQgZHJhZyBpdCBpbnRvIGFuIGV4cGFuZGVkIG9yIGNvbGxhcHNlZCBmb3JtIGZpZWxkLjxici8+PGJyLz5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGFsc28gcG9zaXRpb24gdGhlIGN1cnNvciB3aGVyZSB5b3Ugd2FudCB0aGUgbGluayB0byBiZSBhZGRlZCBhbmQgY2xpY2sgdGhlIEFkZCBMaW5rIGJ1dHRvbiBpbiB0aGUgdG9vbCBiYXIuIEl0IG9wZW5zIHRoZSBBZGQgTGluayBkaWFsb2cgdGhhdCBwcm92aWRlcyB5b3UgYW1vbmdzdCBvdGhlcnMgd2l0aCB0aHJlZSBvcHRpb25zIGZvciBjcmVhdGluZyBsaW5rcyB0byBvdGhlciBjb250ZW50IGVsZW1lbnRzIGJ5IHNlbGVjdGluZyB0aGUgZWxlbWVudCB2aWEgdGhlICJCcm93c2UuLi4iIGJ1dHRvbi4gIEV2ZXJ5IG9wdGlvbiBvZmZlcnMgYSBkaWZmZXJlbnQgd2F5IGZvciBkaXNwbGF5aW5nIHRoZSBsaW5rJ3MgbmFtZTo8YnIvPjxici8+Ik1ldGhvZCBFbGVtZW50IjogbGlua3MgdGhhdCBkaXNwbGF5cyB0aGUgZWxlbWVudCBuYW1lLiI8YnIvPjxici8+Ik1ldGhvZCB3aXRoIHR5cGUgcHJlZml4IjogbGluayB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50IG5hbWUgYW5kIHR5cGUuPGJyLz48YnIvPiJNZXRob2QgZWxlbWVudCB3aXRoIGN1c3RvbSB0ZXh0IjogbGluayB0aGF0IGRpc3BsYXlzIGEgdXNlciBkZWZpbmVkIHRleHQuIFRvIGRlZmluZSB0aGlzIHRleHQgbWFuaXB1bGF0ZSB0aGUgdGV4dCBpbiBiZXR3ZWVuIHRoZSAmbHQ7YSZndDsmbHQ7L2EmZ3Q7IHRhZ3MgaW4gdGhlIFVSTCB0ZXh0IGZpZWxkIG9uY2UgeW91IGhhdmUgc2VsZWN0ZWQgYW4gZWxlbWVudCB1c2luZyB0aGUgIkJyb3dzZS4uLiIgYnV0dG9uLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkNyZWF0ZSBhIEh5cGVybGluayB0byBhbiBFeHRlcm5hbCBwYWdlIHVzaW5nIGEgVVJMIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5UbyBpbnNlcnQgYSBoeXBlcmxpbmsgdG8gYW4gZXh0ZXJuYWwgVVJMLCBleHBhbmQgdGhlIGVkaXRvciwgcG9zaXRpb24gdGhlIGN1cnNvciB3aGVyZSB5b3Ugd2FudCB0aGUgbGluayB0byBiZSBhZGRlZCBhbmQgdGhlbiBjbGljayB0aGUgIkFkZCBMaW5rIiBidXR0b24gaW4gdGhlIHRvb2wgYmFyLiBGaWxsIGluIHRoZSBkaWFsb2cgd2l0aCB0aGUgbGluayBVUkwgZGV0YWlscyBhbmQgdGhlbiBjbGljayBPSy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRG9uZSI+PGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+PC9pdGVtPgotPC9jaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvYWRkbmV3bWV0aG9kY29udGVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hZGRuZXdtZXRob2Rjb250ZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGM3ZDU0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hZGRuZXdtZXRob2Rjb250ZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08Y2hlYXRzaGVldCB0aXRsZT0iQWRkIG5ldyBNZXRob2QgQ29udGVudCBzdWNoIGFzIFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cyBvciBHdWlkYW5jZSI+Ci0KLQk8aW50cm8gCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiPgotCQk8ZGVzY3JpcHRpb24+VGhpcyBjaGVhdCBzaGVldCBndWlkZXMgeW91IHRob3VnaCB0aGUgc3RlcHMgb2YgY3JlYXRpbmcgeW91ciBvd24gbWV0aG9kIGNvbnRlbnQuIFlvdSBzaG91bGQgYWx3YXlzIGNyZWF0ZSBtZXRob2QgY29udGVudCBpbiBhIG1ldGhvZCBwbHVnLWluIHRoYXQgeW91IHByb2R1Y2UuIFRoaXMgc2VwYXJhdGVzIHlvdXIgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCB5b3UgcmV1c2VkIGZyb20gdGhpcmQgcGFydGllcyBhbmQgYWxsb3dzIHlvdSB0byB1cGRhdGUgeW91ciBvd24gbGlicmFyeSB3aXRoIG5ldyByZWxlYXNlcyBvZiBzdWNoIHRoaXJkIHBhcnR5IHBsdWctaW5zIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjb250ZW50IHRoYXQgeW91IGhhdmUgY3JlYXRlZCBpbiB5b3VyIG93biBwbHVnLWlucy48YnIvPjxici8+QWxsIHBsdWctaW5zIHNoaXBwZWQgd2l0aCB5b3VyIG1ldGhvZCBsaWJyYXJ5IGFyZSBwcm90ZWN0ZWQgZnJvbSBkaXJlY3QgbW9kaWZpY2F0aW9uLiBDcmVhdGluZyBuZXcgZWxlbWVudHMgaW4geW91ciBvd24gcGx1Zy1pbiBhbmQgdGhlbiByZWxhdGluZyB0aG9zZSBlbGVtZW50cyB0byB0aGUgZWxlbWVudHMgaW4gdGhlIGxvY2tlZCBwbHVnLWluIGFsbG93cyB5b3UgdG8gdGFpbG9yIHRoZSBjb250ZW50cyBvZiB0aGUgbG9ja2VkIHBsdWctaW4gZm9yIHlvdXIgb3duIHVzZS4gSWYgeW91IGhhdmUgbm90IGNyZWF0ZWQgeW91ciBvd24gbWV0aG9kIHBsdWctaW4sIHBlcmZvcm0gdGhlICJDcmVhdGUgeW91ciBvd24gTWV0aG9kIFBsdWctaW4iIGNoZWF0IHNoZWV0IGZpcnN0LjwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50cGFja2FnZS5odG1sIgotCQl0aXRsZT0iU2VsZWN0IG9yIENyZWF0ZSBhIENvbnRlbnQgUGFja2FnZSIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+Q29udGVudCBwYWNrYWdlcyBhcmUgdXNlZCB0byBncm91cCByZWxhdGVkIG1ldGhvZCBjb250ZW50IHRvZ2V0aGVyLiBTaW5jZSBjb250ZW50IHBhY2thZ2VzIGFyZSBzZWxlY3RhYmxlIGF0IHB1YmxpY2F0aW9uIHRpbWUsIGl0IGlzIHJlY29tbWVuZGVkIHByYWN0aWNlIHRvIGdyb3VwIGNvbnRlbnQgdGhhdCBuZWVkcyB0byBiZSBwdWJsaXNoZWQgdG9nZXRoZXIgaW50byB0aGUgc2FtZSBjb250ZW50IHBhY2thZ2UuPGJyLz48YnIvPkZpbmQgeW91ciBtZXRob2QgcGx1Zy1pbiBpbiB0aGUgTGlicmFyeSB2aWV3LiBEcmlsbCBpbnRvIHRoZSBwbHVnLWluJ3MgcGFja2FnZXMgdG8gbG9jYXRlIHRoZSBwYWNrYWdlIGNhbGxlZCAiQ29udGVudCBQYWNrYWdlcyIuIFRoaXMgcGFja2FnZSBjb250YWlucyBhbGwgcGFja2FnZXMgdGhhdCBhcmUgYWxsb3dlZCB0byBjb250YWluIG1ldGhvZCBlbGVtZW50cy4gU2VsZWN0IGFuZCBleHBhbmQgYSBwYWNrYWdlIGluIHRoZSAiQ29udGVudCBQYWNrYWdlcyIgaGllcmFyY2h5IGluIHdoaWNoIHlvdSB3YW50IHRvIGNyZWF0ZSB5b3VyIGVsZW1lbnQsIG9yIHRvIGNyZWF0ZSBhIG5ldyBjb250ZW50IHBhY2thZ2UuIFJpZ2h0IGNsaWNrIGEgcGFja2FnZSBhbmQgc2VsZWN0IE5ldyAtJmd0OyBDb250ZW50IFBhY2thZ2UuPGJyLz48YnIvPkFuIGVkaXRvciBvcGVucyB0aGF0IGFsbG93cyB5b3UgdG8gcHJvdmlkZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgcGFja2FnZSBhcyB3ZWxsIGFzIHRvIGJyaWVmbHkgZGVzY3JpYmUgaXRzIHB1cnBvc2UuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudC5odG1sIgotCQl0aXRsZT0iQ3JlYXRlIE1ldGhvZCBDb250ZW50IEVsZW1lbnQiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkluIHlvdXIgZXhwYW5kZWQgY29udGVudCBwYWNrYWdlIHdpdGhpbiB0aGUgbGlicmFyeSB2aWV3LCByaWdodCBjbGljayBhbnkgb25lIG9mIHJvbGVzLCB0YXNrcywgd29yayBwcm9kdWN0cywgb3IgZ3VpZGFuY2UgdG8gY3JlYXRlIGFueSBvZiB0aGVzZSBjb250ZW50IGVsZW1lbnRzLiBIaWdobGlnaHQgIk5ldyIgYW5kIHRoZW4gc2VsZWN0IHRoZSBjb25jcmV0ZSB0eXBlIG9mIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIGNyZWF0ZSAoZS5nLiBmb3Igd29yayBwcm9kdWN0cyBjaG9vc2UgYmV0d2VlbiBhcnRpZmFjdCwgb3V0Y29tZSwgb3IgZGVsaXZlcmFibGUpLiBUaGUgbmV3IGVsZW1lbnQgaXMgY3JlYXRlZCBhbmQgaXRzIHJlc3BlY3RpdmUgZWRpdG9yIGlzIG9wZW5lZC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJEZXRhaWwgdGhlIE5ld2x5IENyZWF0ZWQgTWV0aG9kIENvbnRlbnQgRWxlbWVudCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoZSBmaWVsZHMgaW4gdGhlIGNvbnRlbnQgZWxlbWVudCBlZGl0b3IgdG8gc3BlY2lmeSB0aGUgY29udGVudCBlbGVtZW50IGRldGFpbHMuIFN0YXJ0IGJ5IGFzc2lnbmluZyBhIHVuaXF1ZSAiTmFtZSIgdG8gdGhlIGVsZW1lbnQgYXMgd2VsbCBhcyBnaXZpbmcgaXQgYSAiUHJlc2VudGF0aW9uIE5hbWUiIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBleHRlcm5hbCB2aXNpYmxlIG5hbWUgd2hlbiBvdGhlciBlbGVtZW50cyByZWZlciB0byB0aGlzIGVsZW1lbnQgb3Igd2hlbiB0aGUgZWxlbWVudCBpcyBwdWJsaXNoZWQuPGJyLz48YnIvPkV2ZXJ5IGVsZW1lbnQgb3ducyBzZXZlcmFsIHNwZWNpZmljIGNvbnRlbnQgZmllbGRzIGRpc3RyaWJ1dGVkIG9uIHNldmVyYWwgc3RhY2tlZCBlZGl0b3IgdGFicyBhbmQgc2VjdGlvbnMgd2l0aGluIHRoZXNlIHRhYnMgdGhhdCB5b3UgY2FuIHVzZSBmb3IgeW91ciBkZXNjcmlwdGlvbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlIGRlc2NyaXB0aW9uIGZpZWxkcyBhcyB3ZWxsIGFzIGhvdyB0byB1c2UgdGhlIHJpY2ggdGV4dCBlZGl0b3Igc2VlIHRoZSBvbmxpbmUgaGVscC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRG9uZSI+PGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+PC9pdGVtPgotPC9jaGVhdHNoZWV0PgotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hcHBseWNhcGFiaWxpdHlwYXR0ZXJuLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FwcGx5Y2FwYWJpbGl0eXBhdHRlcm4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTg1NDM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FwcGx5Y2FwYWJpbGl0eXBhdHRlcm4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJBcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybiI+Ci0KLQk8aW50cm8gCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPldoZW4gZGV2ZWxvcGluZyBhIHByb2Nlc3MgeW91IGRvIG5vdCBuZWVkIHRvIHdvcmsgZnJvbSBzY3JhdGNoIGJ5IGNyZWF0aW5nIGFjdGl2aXRpZXMgYW5kIGRlc2NyaXB0b3JzIG9uZSBieSBvbmUuICBUaGlzIGNoZWF0IHNoZWV0IHdhbGtzIHlvdSB0aHJvdWdoIGFwcGx5aW5nIHByZS1kZWZpbmVkIGNhcGFiaWxpdHkgcGF0dGVybnMgb3IgZXZlbiBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcyBwYXJ0cyBhcyBidWlsZGluZyBibG9ja3MgdG8geW91ciBwcm9jZXNzLjxici8+PGJyLz5BIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBhIHNwZWNpYWwgcHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgYWN0aXZpdGllcyBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBwYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgZGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgYSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgZGVsaXZlcnkgcHJvY2Vzc2VzIG9yIGxhcmdlciBjYXBhYmlsaXR5IHBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4gWW91IGNhbiBhcHBseSB0aGUgc2FtZSBwYXR0ZXJuIHNldmVyYWwgdGltZXMgdG8gdGhlIHNhbWUgcHJvY2VzcyBhbmQgZGVmaW5lIGxvY2FsIG1vZGlmaWNhdGlvbnMgdG8gZWFjaCBpbmRpdmlkdWFsIHBhdHRlcm4gYXBwbGljYXRpb24uIFRoaXMgYWxsb3dzIHlvdSB0byBleHByZXNzIHNwZWNpZmljIGNoYW5nZXMgZWFjaCB0aW1lIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHBlcmZvcm1lZCB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlIGEgcHJvY2VzcyByZXByZXNlbnRzLjwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQotCTxpdGVtCi0JCXRpdGxlPSJGaW5kIGFuIEFjdGl2aXR5IHRvIHdoaWNoIGEgUGF0dGVybiB3aWxsIGJlIEFwcGxpZWQiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkdpdmVuIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBvcGVuZWQgeW91ciBwcm9jZXNzIGluIHRoZSBwcm9jZXNzIGVkaXRvciwgc3dpdGNoIHRvIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGFiIGFuZCByZXZpZXcgeW91ciBwcm9jZXNzLiBGaW5kIHRoZSBsb2NhdGlvbiB3aGVyZSB5b3Ugd2FudCB0byBhcHBseSBhIGNhcGFiaWxpdHkgcGF0dGVybi4gQSBjYXBhYmlsaXR5IHBhdHRlcm4gaGFzIHRvIGJlIGFwcGxpZWQgdG8gb25lIHNwZWNpZmljIGFjdGl2aXR5IChpbmNsdWRpbmcgaXRlcmF0aW9uIG9yIHBoYXNlIHdoaWNoIGFyZSBzcGVjaWFsIGFjdGl2aXRpZXMpIGluIGEgcHJvY2Vzcy4gU3VjaCBhbiBhY3Rpdml0eSBjYW4gZWl0aGVyIGJlIGRlZmluZWQgbG9jYWxseSBpbiB0aGUgcHJvY2VzcyAocHJlc2VudGVkIGFzIGEgbmFtZSBpbiBhIHN0YW5kYXJkIGJsYWNrIGZvbnQpIG9yIGFuIGFjdGl2aXR5IHdoaWNoIGhhZCBiZWVuIGFkZGVkIHRvIHRoZSBwcm9jZXNzIGJ5IGFwcGx5aW5nIGFub3RoZXIgY2FwYWJpbGl0eSBwYXR0ZXJuIChwcmVzZW50ZWQgYXMgYSBuYW1lIGluIGEgZ3JlZW4taXRhbGljIGZvbnQpLjxici8+PGJyLz5JZiB5b3Ugd2FudCB0byBhcHBseSBhIHBhdHRlcm4gdG8gYSBsb2NhbCBhY3Rpdml0eSAoYmxhY2sgZm9udCksIGdvIHRvIHN0ZXAgIlNlbGVjdCBhIENhcGFiaWxpdHkgUGF0dGVybiBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3Ii4gSWYgeW91IHdhbnQgdG8gYXBwbHkgYSBwYXR0ZXJuIHRvIGFuIGFjdGl2aXR5IGZyb20gYW5vdGhlciBwYXR0ZXJuIChncmVlbiBpdGFsaWMgZm9udCksIHBsZWFzZSBnbyB0byBzdGVwICJDb250cmlidXRlIHRvIGFuIEFjdGl2aXR5IGZyb20gQW5vdGhlciBQYXR0ZXJuIi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJDb250cmlidXRlIHRvIGFuIEFjdGl2aXR5IGZyb20gQW5vdGhlciBQYXR0ZXJuIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPk9ubHkgaWYgeW91IHdhbnQgdG8gYXBwbHkgYSBwYXR0ZXJuIHRvIGFuIGFjdGl2aXR5IGZyb20gYW5vdGhlciBwYXR0ZXJuIChyZWNvZ25pemFibGUgYnkgdGhlIGdyZWVuIGl0YWxpYyBmb250KSB0aGVuIHlvdSBuZWVkIHRvIGNyZWF0ZSBhbiBhY3Rpdml0eSBjb250cmlidXRpb24sIHdoaWNoIGFsbG93cyB5b3UgdG8gbWFrZSBsb2NhbCBjaGFuZ2VzIHRvIHRoZSBhY3Rpdml0eS48YnIvPjxici8+RmluZCB0aGUgYWN0aXZpdHkncyBwYXJlbnQgZWxlbWVudC4gSWYgdGhpcyBlbGVtZW50IGlzIGEgbm90IGEgbG9jYWwgZWxlbWVudCAoZ3JlZW4gaXRhbGljIGZvbnQpIHRoZW4geW91IGZpcnN0IG5lZWQgY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvIHRoaXMgcGFyZW50IGFuZCBzbyBvbiAoaWYgdGhlIHBhcmVudCdzIHBhcmVudCBpcyBub3QgbG9jYWwgdGhlbiBjcmVhdGUgYSBjb250cmlidXRpb24gdG8gdGhlIHBhcmVudCdzIHBhcmVudCBmaXJzdCwgZXRjLikgPGJyLz48YnIvPlRvIGNyZWF0ZSBhIGNvbnRyaWJ1dGlvbiB0byBhIG5vbi1sb2NhbCBhY3Rpdml0eSwgcmlnaHQtY2xpY2sgdGhlIG5vbi1sb2NhbCBhY3Rpdml0eSBhbmQgdGhlbiBjbGljayAiQ29udHJpYnV0ZSIuIERvIHRoaXMgd2l0aCBhbGwgcGFyZW50cyB0b3AtZG93biB1bnRpbCB5b3UgcmVhY2ggdGhlIGFjdGl2aXR5IHRvIHdoaWNoIHlvdSB3YW50IHRvIGFwcGx5IHRoZSBwYXR0ZXJuLiBPbmNlIHlvdSBjbGlja2VkICJDb250cmlidXRlIiwgdGhlIGFjdGl2aXR5IGJlY29tZSBsb2NhbCBhbmQgaXMgcHJlc2VudGVkIHdpdGggYSBzdGFuZGFyZCBibGFjayBmb250LjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb252aWV3Lmh0bWwiIAotCQl0aXRsZT0iU2VsZWN0IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXciCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkZpbmQgYSBjYXBhYmlsaXR5IHBhdHRlcm4gaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gRXhwYW5kIHRoZSBwYWNrYWdlICJQcm9jZXNzZXMgLSZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJucyIgYXMgd2VsbCBhcyBpdHMgc3ViLXBhY2thZ2VzLiBTZWxlY3QgdGhlIHBhdHRlcm4geW91IHdhbnQgdG8gYXBwbHkgdG8geW91ciBwcm9jZXNzLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkFwcGx5IHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBBY3Rpdml0eSIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+WW91IGNhbiBhcHBseSBlaXRoZXIgdGhlIHdob2xlIGNhcGFiaWxpdHkgcGF0dGVybiB0byB5b3VyIHByb2Nlc3Mgb3IganVzdCBvbmUgb3IgbW9yZSBhY3Rpdml0aWVzIGZyb20gaXQuIFRvIGFwcGx5IHRoZSB3aG9sZSBjYXBhYmlsaXR5IHBhdHRlcm4gZHJhZyB0aGUgcGF0dGVybiBvdmVyIHRoZSBhY3Rpdml0eSBzZWxlY3RlZCBlYXJsaWVyIGluIHlvdXIgcHJvY2Vzcy4gVG8gYXBwbHkgb25lIG9yIG1vcmUgYWN0aXZpdGllcyBvZiB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIHNlbGVjdCB0aGVtIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIFlvdSBjYW4gbXVsdGkgc2VsZWN0IGJ5IHByZXNzaW5nIGN0cmwgKyBzZWxlY3QsIG9yIHNoaWZ0ICsgc2VsZWN0IHRvIGNhcHR1cmUgYW4gYWxsLWluY2x1c2l2ZSBzZWN0aW9uLjxici8+PGJyLz5EcmFnIHRoZW0gdG8gdGhlIGFjdGl2aXR5IHNlbGVjdGVkIGVhcmxpZXIgaW4geW91ciBwcm9jZXNzLiBBZnRlciBkcmFnZ2luZyB0aGUgcGF0dGVybiBvciBhY3Rpdml0aWVzIHlvdSB3aWxsIGJlIHByb21wdGVkIHlvdSB0byBhcHBseSB0aGUgcGF0dGVybi9hY3Rpdml0aWVzIHZpYSBFeHRlbmRzIChkeW5hbWljIGJpbmRpbmcpIG9yIENvcHkgKFNlZSB0aGUgb25saW5lIGhlbHAgc2VjdGlvbiAiUHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXciIGZvciBtb3JlIGRldGFpbHMgb24gdGhlc2UgdHdvIGNob2ljZXMpLiBNYWtlIHlvdXIgY2hvaWNlIGJ5IGNsaWNraW5nLjxici8+PGJyLz5BcyBhbiBhbHRlcm5hdGl2ZSB0byBkcmFnZ2luZyB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIHlvdSBjYW4gYWxzbyByaWdodC1jbGljayB0aGUgYWN0aXZpdHkgdG8gd2hpY2ggeW91IHdhbnQgdG8gYXBwbHkgdGhlIHBhdHRlcm4gYW5kIHNlbGVjdCB0aGUgbWVudSBvcHRpb24gIkFwcGx5IFBhdHRlcm4gLSZndDsgQ29weS4uLiIgb3IgIkFwcGx5IFBhdHRlcm4gLSZndDsgRXh0ZW5kLi4uIjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCQotCTxpdGVtCi0JCXRpdGxlPSJNYWtlIExvY2FsIENoYW5nZXMgdG8gYSBQYXR0ZXJuIEFwcGxpY2F0aW9uIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPklmIHlvdSBhcHBsaWVkIHRoZSBwYXR0ZXJuIHZpYSBjb3B5LCB5b3UgY2FuIGZyZWVseSBtYWtlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGNvcGllZCBlbGVtZW50cy4gSWYgeW91IGFwcGxpZWQgdGhlIHBhdHRlcm4gdmlhIGV4dGVuZHMgKGR5bmFtaWMgYmluZGluZykgeW91IGNhbiBzdGlsbCBwcm92aWRlIGxvY2FsIGFkZGl0aW9ucyB0byB0aGUgcGF0dGVybiBieSBkZWZpbmluZyBhIGNvbnRyaWJ1dGlvbiB0byB0aGUgcGF0dGVybidzIGFjdGl2aXRpZXMuIEZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIG9mIHRoZSBzdGVwICJDb250cmlidXRlIHRvIGFuIEFjdGl2aXR5IGZyb20gQW5vdGhlciBQYXR0ZXJuIiBhYm92ZSB0byBkZWZpbmUgc3VjaCBhIGNvbnRyaWJ1dGlvbi4gQWZ0ZXIgeW91IGNyZWF0ZSB0aGUgbG9jYWwgYWN0aXZpdHkgY29udHJpYnV0aW9uLCB5b3UgY2FuIGFkZCBhZGRpdGlvbmFsIGRlc2NyaXB0b3JzIG9yIHBhdHRlcm5zIHRvIHRoaXMgYWN0aXZpdHkuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JCi0JPGl0ZW0KLQkJdGl0bGU9IlN1cHByZXNzIFBhdHRlcm4gRWxlbWVudHMiCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+WW91IGNhbiBzdXBwcmVzcyBlbGVtZW50cyBzdWNoIGFzIGRlc2NyaXB0b3JzIG9yIGFjdGl2aXRpZXMgb2YgYSBkeW5hbWljYWxseSBib3VuZHMgcGF0dGVybiAodmlhIGV4dGVuZHMpIGJ5IHJpZ2h0IGNsaWNraW5nIGFuZCBzZWxlY3RpbmcgIlN1cHByZXNzIiBmcm9tIHRoZSBjb250ZXh0IG1lbnUuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRvbmUiPjxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZWFwcm9jZXNzLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZWFwcm9jZXNzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzRjNzk1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9jcmVhdGVhcHJvY2Vzcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGNoZWF0c2hlZXQgdGl0bGU9IkNyZWF0ZSBhIFByb2Nlc3MgKENhcGFiaWxpdHkgUGF0dGVybiBvciBEZWxpdmVyeSBQcm9jZXNzKSI+Ci0KLQk8aW50cm8gCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGlzIGNoZWF0IHNoZWV0IGd1aWRlcyB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgb2YgY3JlYXRpbmcgYSBQcm9jZXNzLiBUaGVyZSBhcmUgdHdvIG1haW4gdHlwZXMgb2YgcHJvY2Vzc2VzOiBDYXBhYmlsaXR5IFBhdHRlcm5zIGFuZCBEZWxpdmVyeSBQcm9jZXNzZXMuIEEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBBY3Rpdml0aWVzIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLCB3aGlsZSBhIERlbGl2ZXJ5IFByb2Nlc3MgZGVzY3JpYmVzIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyB0eXBlIG9mIGRldmVsb3BtZW50IHByb2plY3QuIFNlZSB0aGUgb25saW5lIGhlbHAgc2VjdGlvbiAiUHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXciIGZvciBtb3JlIGRldGFpbHMuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uLmh0bWwiCi0JCXRpdGxlPSJTZWxlY3Qgb3IgQ3JlYXRlIGEgRGVmYXVsdCBNZXRob2QgQ29uZmlndXJhdGlvbiBmb3IgeW91ciBQcm9jZXNzIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPllvdXIgcHJvY2VzcyBjYW4gY29udGFpbiBjb250ZW50IGZyb20gbWFueSBkaWZmZXJlbnQgbWV0aG9kIHBsdWctaW5zLiBUaGUgY29udGVudCBlbGVtZW50cyBmcm9tIHRoZXNlIHBsdWctaW5zLCBzdWNoIGFzIHRhc2tzIG9yIHdvcmsgcHJvZHVjdHMsIGFwcGxpZWQgdG8geW91ciBwcm9jZXNzIHZpYSBkcmFnIGFuZCBkcm9wLCBjYW4gaGF2ZSBtYW55IGNvbnRyaWJ1dGlvbnMgb3IgcmVwbGFjZW1lbnRzLiBTdWNoIGNvbnRyaWJ1dGlvbnMgb3IgcmVwbGFjZW1lbnRzIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGF0IG5lZWQgdG8gYmUgY29uc2lkZXJlZCBmb3IgY3JlYXRpbmcgdGhlIHByb2Nlc3MgZWxlbWVudHMgd2l0aCB0aGVpciBtaXJyb3JlZCBzZXQgb2YgcmVsYXRpb25zaGlwcy48YnIvPjxici8+Rm9yIHRoYXQgcmVhc29uIHlvdSBuZWVkIHRvIGRlZmluZSBhIGNvbmZpZ3VyYXRpb24gdGhhdCBkZWZpbmVzIHRoZSB2aXNpYmxlIHNldCBvZiBlbGVtZW50cyBhbmQgcmVsYXRpb25zaGlwcyB3aGVuIHRoZSBwcm9jZXNzIGlzIGF1dGhvcmVkLiBUaGlzIHByb2Nlc3MgYXV0aG9yaW5nIGNvbmZpZ3VyYXRpb24gaXMgcmVmZXJyZWQgdG8gYXMgdGhlICJEZWZhdWx0IENvbmZpZ3VyYXRpb24iIGZvciB0aGUgcHJvY2VzcyBhbmQgc2hvdWxkIGRlZmluZSB0aGUgbGFyZ2VzdCByZWFzb25hYmxlIHNldCBvZiBtZXRob2QgcGx1Zy1pbnMsIGNvbnRlbnQgcGFja2FnZXMsIGFuZCBvdGhlciBwcm9jZXNzZXMgZnJvbSB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB3aWxsIGJlIHJlZmVycmVkIHRvIGJ5IHRoZSBwcm9jZXNzIGF0IHNvbWUgcG9pbnQuPGJyLz48YnIvPkluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGEgcHJvY2VzcyBjYW4gYmUgbGlua2VkIHRvIG1hbnkgYWRkaXRpb25hbCBtZXRob2QgY29uZmlndXJhdGlvbnMgdGhhdCBoYXZlIGJlZW4gdmVyaWZpZWQgdG8gYWxzbyBwcm9kdWNlIHZhbGlkIHJlc3VsdHMuIEhvd2V2ZXIsIGFsbCBvdGhlciB2YWxpZCBjb25maWd1cmF0aW9ucyBuZWVkIHRvIGRlZmluZSBzdWItc2V0cyBvZiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLiAgSW4gb3RoZXIgd29yZHMsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBsaW5rIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8gYSBwcm9jZXNzIHRoYXQgcmVmZXJzIHRvIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGJlY2F1c2Ugc3VjaCBlbGVtZW50cyB3ZXJlIG5vdCBjb25zaWRlcmVkIHdoZW4gdGhlIHByb2Nlc3Mgd2FzIGNyZWF0ZWQuPGJyLz48YnIvPlByb2Nlc3MgZWxlbWVudHMgdGhhdCByZWZlciB0byBjb250ZW50IHBhY2thZ2VzIHRoYXQgYXJlIGRlZmluZWQgb3V0c2lkZSB0aGUgc2NvcGUgb2Ygc3VjaCBhIGNvbmZpZ3VyYXRpb24gd2lsbCBub3QgYmUgc2hvd24gaW4gdGhlIHByb2Nlc3Mgd2hlbiBwdWJsaXNoZWQgb3IgdXNlZCB1bmRlciBzdWNoIGEgY29uZmlndXJhdGlvbi4gVGhpcyBhbGxvd3MgeW91IHRvIGVhc2lseSBoaWRlIGNvbnRlbnQgZnJvbSBhIHByb2Nlc3MgYnkgbW92aW5nIGNvbnRlbnQgcGFja2FnZXMgaW4gb3Igb3V0IG9mIHRoZSByZWxhdGVkIGNvbmZpZ3VyYXRpb24uPGJyLz48YnIvPlRoZXJlZm9yZSwgYmVmb3JlIHlvdSBzdGFydCBjcmVhdGluZyBhIHByb2Nlc3MsIHJldmlldyB5b3VyIGxpc3Qgb2YgY29uZmlndXJhdGlvbnMgaW4gdGhlIGxpYnJhcnkgdmlldyBhbmQgZGVjaWRlIHdoaWNoIGNvbmZpZ3VyYXRpb24geW91IGFyZSBnb2luZyB0byB1c2UuICBJZiBuZWNlc3NhcnksIG9wZW4gY29uZmlndXJhdGlvbnMgYW5kIGV4YW1pbmUgdGhlaXIgc3BlY2lmaWNhdGlvbi4gSWYgeW91IGRvIG5vdCBmaW5kIGEgZml0dGluZyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgcmlnaHQgc2V0IG9mIGVsZW1lbnRzLCBjcmVhdGUgYSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24uICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwcm9jZXNzIGFuZCBtZXRob2QgY29uZmlndXJhdGlvbiBzZWUgdGhlIHNlY3Rpb24gIlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3IiBpbiB0aGUgb25saW5lIGhlbHAuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sIgotCQl0aXRsZT0iQ2hvb3NlIGEgTWV0aG9kIFBsdWctaW4gdG8gSG9sZCB5b3VyIFByb2Nlc3MiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlNpbmNlIHlvdSBjYW5ub3QgYWRkIHByb2Nlc3NlcyB0byB3cml0ZS1sb2NrZWQgdGhpcmQtcGFydHkgbWV0aG9kIHBsdWctaW5zIHlvdXIgcHJvY2VzcyBuZWVkcyB0byBiZSBjcmVhdGVkIGluIG9uZSBvZiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbnMuIFRoZXJlZm9yZSwgaXQgaXMgYmVzdCB0byBjcmVhdGUgeW91ciBwcm9jZXNzIHdpdGhpbiB0aGUgcGx1Zy1pbiBpbiB3aGljaCBpdCBpcyBnb2luZyB0byBiZSB1c2VkLiBGb3IgaW5zdGFuY2UsIGlmIHlvdSB3YW50IHRvIGRldmVsb3AgYSBzZXQgb2YgY2FwYWJpbGl0eSBwYXR0ZXJucyB0byB1c2UgdG8gYXNzZW1ibGUgYSBkZWxpdmVyeSBwcm9jZXNzLCB0cnkgdG8gbWFpbnRhaW4gYWxsIG9mIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm5zIGluIHRoZSBzYW1lIG1ldGhvZCBwbHVnLWluLjxici8+PGJyLz5JZiB5b3UgaGF2ZSBub3QgY3JlYXRlZCBhIG1ldGhvZCBwbHVnLWluLCBnbyB0byB0aGUgIkNyZWF0ZSB5b3VyIG93biBNZXRob2QgUGx1Zy1pbiIgY2hlYXQgc2hlZXQuPGJyLz48YnIvPkluIHRoZSBsaWJyYXJ5IHZpZXcsIHNlbGVjdCBhIHBsdWctaW4gZnJvbSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbWV0aG9kIHBsdWctaW5zLiBJY29ucyB0aGF0IGFwcGVhciB0byBiZSBncmF5ZWQtb3V0IGhhdmUgYmVlbiBsb2NrZWQgZm9yIG1vZGlmaWNhdGlvbiBhbmQgY2Fubm90IGJlIHVzZWQuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzcy5odG1sIiAKLQkJdGl0bGU9IkZpbmQgb3IgQ3JlYXRlIGEgUHJvY2VzcyBQYWNrYWdlIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Qcm9jZXNzZXMgY2FuIGJlIG9yZ2FuaXplZCB3aXRoIHByb2Nlc3MgcGFja2FnZXMgdG8gaW5jcmVhc2UgbWFpbnRhaW5hYmlsaXR5IGFuZCB0byBtYWtlIGl0IGVhc2llciBmb3IgdGhlIHByb2Nlc3MgdXNlciB0byBicm93c2UgYW5kIGZpbmQgdGhlbS4gUGxlYXNlIGJlIGF3YXJlIHRoYXQgeW91IGNhbiBjcmVhdGUgY2FwYWJpbGl0eSBwYXR0ZXJucyBvbmx5IGluIGEgY2FwYWJpbGl0eSBwYXR0ZXJucyBwYWNrYWdlIG9yIHN1Yi1wYWNrYWdlIGFuZCBkZWxpdmVyeSBwcm9jZXNzZXMgb25seSBpbiBhIGRlbGl2ZXJ5IHByb2Nlc3MgcGFja2FnZSBvciBzdWItcGFja2FnZS48YnIvPjxici8+VXNpbmcgdGhlIGxpYnJhcnkgdmlldywgcmV2aWV3IHRoZSBzdHJ1Y3R1cmUgb2YgcHJvY2VzcyBwYWNrYWdlcyBhdmFpbGFibGUgaW4gdGhlIG1ldGhvZCBwbHVnLWluIHRoYXQgeW91IHNlbGVjdGVkIG9yIGNyZWF0ZWQgaW4gdGhlIGxhc3Qgc3RlcCBhbmQgdGhlbiBzZWxlY3Qgb25lIG9mIHRoZSBwYWNrYWdlcyBwcmVzZW50IGFzIGEgY29udGFpbmVyIGZvciB5b3VyIHByb2Nlc3MuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY3JlYXRlIGEgbmV3IFByb2Nlc3MgUGFja2FnZSBieSByaWdodC1jbGlja2luZyBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzIHBhY2thZ2Ugb3Igc3ViLXBhY2thZ2UgYW5kIHRoZW4gY2xpY2tpbmcgTmV3IC0mZ3Q7IFByb2Nlc3MgUGFja2FnZS4gSW4gdGhlIGRpYWxvZyBib3ggdGhhdCBhcHBlYXJzLCBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGFuZCB0aGVuIGNsaWNrIE9LLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwiIAotCQl0aXRsZT0iQ3JlYXRlIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gb3IgRGVsaXZlcnkgUHJvY2VzcyIKLQkJc2tpcD0iZmFsc2UiPgkKLQkJPGRlc2NyaXB0aW9uPlRvIGNyZWF0ZSBhIG5ldyBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzczogUmlnaHQgY2xpY2sgdGhlIHNlbGVjdGVkIG9yIG5ld2x5IGNyZWF0ZWQgcHJvY2VzcyBwYWNrYWdlIGFuZCB0aGVuIGNsaWNrIE5ldyAtJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm4gb3IgTmV3IC0mZ3Q7IERlbGl2ZXJ5IFByb2Nlc3MuICBJbiB0aGUgZGlhbG9nIGJveCB0aGF0IGFwcGVhcnMsIHNwZWNpZnkgdGhlIHByb2Nlc3MgbmFtZSBhbmQgZGVmYXVsdCBjb25maWd1cmF0aW9uIGFuZCB0aGVuIGNsaWNrIE9LLiBUaGUgcHJvY2VzcyBpcyBjcmVhdGVkIGFuZCB0aGUgZWRpdG9yIGlzIG9wZW5lZC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQkKLQk8aXRlbQotCQl0aXRsZT0iRG9jdW1lbnQgeW91ciBQcm9jZXNzIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5XaXRoIHRoZSBwcm9jZXNzIGVkaXRvciBvcGVuZWQgaW4gdGhlIERlc2NyaXB0aW9uIHRhYiwgZG9jdW1lbnQgeW91ciBwcm9jZXNzIHVzaW5nIHRoZSBhdmFpbGFibGUgdGV4dCBmaWVsZHMuICBBdCBhIG1pbmltdW0gcHJvdmlkZSBhIHByZXNlbnRhdGlvbiBuYW1lIGFuZCBhIGJyaWVmIGRlc2NyaXB0aW9uIGZvciB5b3VyIHByb2Nlc3MuICBTZWUgdGhlIG9ubGluZSBoZWxwIGZvciBkZWZpbml0aW9ucyBvZiBlYWNoIGF2YWlsYWJsZSBkb2N1bWVudGF0aW9uIGZpZWxkLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCQotPGl0ZW0KLQkJdGl0bGU9IkRlY2lkZSBvbiB5b3VyIFByaW1hcnkgUHJvY2VzcyBBdXRob3JpbmcgVmlldyIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+WW91IGNhbiBkZXZlbG9wIGEgcHJvY2VzcyBmcm9tIHRocmVlIGRpZmZlcmVudCB2aWV3czo8YnIvPjxici8+QnJlYWtkb3duIFN0cnVjdHVyZTogIENyZWF0ZSB5b3VyIHByb2Nlc3MgYnkgZGVmaW5pbmcgYSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBDcmVhdGUgaXRlcmF0aW9ucyBhbmQgYWN0aXZpdGllcyBmaXJzdCBhbmQgdGhlbiBwb3B1bGF0ZSB5b3VyIGFjdGl2aXRpZXMgYnkgZWl0aGVyIGFwcGx5aW5nIHRhc2tzIGZyb20geW91ciBtZXRob2QgY29udGVudCBvciBhcHBseWluZyBjYXBhYmlsaXR5IHBhdHRlcm5zLiBHbyB0byBzdGVwICJEZXZlbG9wIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUiIHRvIHdvcmsgd2l0aCB0aGlzIHZpZXcuPGJyLz48YnIvPlRlYW0gQWxsb2NhdGlvbjogQ3JlYXRlIHlvdXIgcHJvY2VzcyBieSBkZWZpbmluZyB3aGljaCB0ZWFtcyBhbmQgcm9sZXMgc2hhbGwgcGFydGljaXBhdGUgaW4gYWN0aXZpdGllcyBhbmQgZmluZGluZyByZXNwb25zaWJsZSB3b3JrIHByb2R1Y3RzIGFuZCB0YXNrcyBmcm9tIHRoZXJlLiAgR28gdG8gc3RlcCAiRGV2ZWxvcCB0aGUgVGVhbSBBbGxvY2F0aW9uIFN0cnVjdHVyZSIgdG8gd29yayB3aXRoIHRoaXMgdmlldy48YnIvPjxici8+V29yayBQcm9kdWN0IFVzYWdlOiBDcmVhdGUgeW91ciBwcm9jZXNzIGJ5IGRlZmluaW5nIHdoaWNoIHdvcmsgcHJvZHVjdHMgc2hvdWxkIGJlIGNyZWF0ZWQgaW4gYWN0aXZpdGllcyBhbmQgZmluZGluZyB0YXNrcyBhbmQgcm9sZXMgZnJvbSB0aGVyZS4gR28gdG8gc3RlcCAiRGV2ZWxvcCBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlIiB0byB3b3JrIHdpdGggdGhpcyB2aWV3LjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sIiAKLQkJdGl0bGU9IkRldmVsb3AgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5CZWZvcmUgeW91IHN0YXJ0LCBlbnN1cmUgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIHNlbGVjdGVkIGluIHRoZSB0b29sIGJhciBpcyB0aGUgc2FtZSBhcyB0aGUgY29uZmlndXJhdGlvbiB5b3Ugc2VsZWN0ZWQgYXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgeW91ciBwcm9jZXNzLjxici8+PGJyLz5UbyBhY2Nlc3MgdGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IsIHNlbGVjdCB0aGUgIldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSIgdGFiIGluIHRoZSBwcm9jZXNzIGVkaXRvci48YnIvPjxici8+UmlnaHQtY2xpY2sgdGhlIGVsZW1lbnQgaW4gdGhlIGZpcnN0IHJvdyBvZiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdGhlbiBjbGljayBOZXcgQ2hpbGQgLSZndDsgQWN0aXZpdHkgdG8gY3JlYXRlIGEgbmV3IGFjdGl2aXR5LiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGNyZWF0ZSBhIHBoYXNlIG9yIGl0ZXJhdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSBzY29wZSBvZiB5b3VyIHByb2Nlc3MuIElmIG5lZWRlZCwgY3JlYXRlIG1vcmUgYWN0aXZpdGllcyB0byBzZXQtdXAgeW91ciBicmVha2Rvd24gc3RydWN0dXJlLiBBY3Rpdml0aWVzIGNhbiBiZSBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXIuPGJyLz48YnIvPlJldmlldyB0aGUgbGlzdCBvZiB0YXNrcyBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBJbiB0aGlzIHZpZXcgdGFza3MgYXJlIHNvcnRlZCBieSBkaXNjaXBsaW5lLiBEcmlsbCBpbnRvIHRoZSBkaXNjaXBsaW5lcyBoaWVyYXJjaHkgdG8gc2VlIHdoaWNoIHRhc2tzIGFyZSBhdmFpbGFibGUgaW4gdGhpcyBjb25maWd1cmF0aW9uLiBTZWxlY3QgYSB0YXNrIHRoYXQgeW91IHdhbnQgdG8gYWRkIHRvIHlvdXIgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgZHJhZyBpdCBvbiB0b3Agb2Ygb25lIG9mIHRoZSBhY3Rpdml0aWVzIHlvdSBqdXN0IGNyZWF0ZWQuIFRoZSB0YXNrIGlzIGFkZGVkIGFzIGEgc28tY2FsbGVkIHRhc2sgZGVzY3JpcHRvciAoYW4gb2NjdXJyZW5jZSBvZiBhIHRhc2sgaW4gb25lIHNwZWNpZmljIGFjdGl2aXR5KS48YnIvPjxici8+UmV2aWV3IHRoZSB0YXNrIGRlc2NyaXB0b3IncyBkZXRhaWxzIGluIGl0cyBwcm9wZXJ0aWVzIHZpZXcuIElmIHRoZSBwcm9wZXJ0aWVzIHZpZXcgaXMgbm90IGRpc3BsYXllZCB0aGVuIHNlbGVjdCB0aGUgdGFzayBpbiB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgcmlnaHQtY2xpY2ssIGFuZCBzZWxlY3QgIlByb3BlcnRpZXMiLiBVc2UgdGhlIHRhYnMgb24gdGhlIHNpZGUgb2YgdGhlIHByb3BlcnRpZXMgdmlldyB0byByZXZpZXcgZGlmZmVyZW50IGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRvci48YnIvPjxici8+UGVyZm9ybSBpbmRpdmlkdWFsIG1vZGlmaWNhdGlvbnMgb2YgdGhlIHRhc2sgZGVzY3JpcHRvciBpbiB0aGUgcHJvcGVydGllcyB2aWV3LiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gY2hhbmdlIHRoZSBwcmVzZW50YXRpb24gbmFtZSwgYWRkIHRleHR1YWwgZGVzY3JpcHRpb25zLCBjaGFuZ2UgcGVyZm9ybWluZyByb2xlcywgY2hhbmdlIHRoZSBpbnB1dHMgYW5kIG91dHB1dHMsIGV0Yy4gV2hlbiBjaGFuZ2luZyB0aGUgdGFzayBkZXNjcmlwdG9yJ3MgcmVsYXRpb25zaGlwcyBpbiB0aGUgcHJvcGVydHkgd2luZG93IHRhYnMgcm9sZXMgb3Igd29yayBwcm9kdWN0cywgeW91IGNhbiBlaXRoZXIgYWRkIG5ldyBlbGVtZW50cyBmcm9tIHlvdXIgbWV0aG9kIGNvbnRlbnQgYnkgdXNpbmcgdGhlICdBZGQuLicgYnV0dG9uIG9yIGNvbm5lY3QgeW91ciB0YXNrIGRlc2NyaXB0b3Igd2l0aCB0YXNrcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBhY3Rpdml0eS48YnIvPjxici8+SW5zdGVhZCBvZiBkcmFnZ2luZyB0YXNrIG9uZSBieSBvbmUgeW91IGNhbiBhbHNvIGFwcGx5IHdob2xlIGNhcGFiaWxpdHkgcGF0dGVybnMgb3IgYWN0aXZpdGllcyBmcm9tIG90aGVyIHByb2Nlc3NlcyBhdmFpbGFibGUgaW4geW91ciBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLiAgU2VsZWN0IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGFueSBhY3Rpdml0eSBvZiBzdWNoIGEgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzIGF2YWlsYWJsZSBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3IGFuZCBkcmFnIGl0IG9uIHRvcCBvZiBhbiBhY3Rpdml0eSB3aXRoaW4geW91ciBwcm9jZXNzIGJyZWFrZG93biBpbiB0aGUgcHJvY2VzcyBlZGl0b3IuIChGaW5kIGEgZGV0YWlsZWQgd2Fsa3Rocm91Z2ggdG8gYXBwbHlpbmcgY2FwYWJpbGl0eSBwYXR0ZXJuIGluIHRoZSBjaGVhdCBzaGVldCAiQXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4iLik8YnIvPjxici8+Q29udGludWUgYWRkaW5nIG1vcmUgdGFza3MsIGFjdGl2aXRpZXMgb3IgcGF0dGVybnMgdG8geW91ciBhY3Rpdml0aWVzIG9yIHN3aXRjaCB0byB0aGUgdGVhbSBhbGxvY2F0aW9uIHRhYiB0byBhZGQgcm9sZXMgb3IgdG8gdGhlIHdvcmsgcHJvZHVjdCB1c2FnZSB0YWIgdG8gYWRkIHdvcmsgcHJvZHVjdHMuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwiIAotCQl0aXRsZT0iRGV2ZWxvcCB0aGUgVGVhbSBBbGxvY2F0aW9uIFN0cnVjdHVyZSIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5CZWZvcmUgeW91IHN0YXJ0LCBlbnN1cmUgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0ZWQgaW4gdGhlIHRvb2wgYmFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25maWd1cmF0aW9uIHlvdSBzZWxlY3RlZCBhcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB5b3VyIHByb2Nlc3MuPGJyLz48YnIvPkluIHRoZSBwcm9jZXNzIGVkaXRvciwgY2xpY2sgdGhlICJUZWFtIEFsbG9jYXRpb24iIHRhYiB0byBvcGVuIHRoZSB0ZWFtIGFsbG9jYXRpb24gZWRpdG9yLjxici8+PGJyLz5SaWdodC1jbGljayB0aGUgZWxlbWVudCBpbiB0aGUgZmlyc3Qgcm93IG9mIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0aGVuIGNsaWNrIE5ldyBDaGlsZCAtJmd0OyBBY3Rpdml0eSB0byBjcmVhdGUgYSBuZXcgYWN0aXZpdHkuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY3JlYXRlIGEgcGhhc2Ugb3IgaXRlcmF0aW9uLCBkZXBlbmRpbmcgb24gdGhlIHNjb3BlIG9mIHlvdXIgcHJvY2Vzcy4gSWYgbmVlZGVkLCBjcmVhdGUgbW9yZSBhY3Rpdml0aWVzIHRvIHNldC11cCB5b3VyIGJyZWFrZG93biBzdHJ1Y3R1cmUuIEFjdGl2aXRpZXMgY2FuIGJlIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlci48YnIvPjxici8+WW91IGNhbiBhZGQgcm9sZXMgZGlyZWN0bHkgdG8geW91ciBhY3Rpdml0aWVzIG5vdy4gSW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldywgcmV2aWV3IHRoZSBsaXN0IG9mIHJvbGVzLiBJbiB0aGlzIHZpZXcgcm9sZXMgYXJlIG9yZ2FuaXplZCBpbnRvIHJvbGUgc2V0cy4gRHJpbGwgaW50byB0aGUgcm9sZSBzZXRzIGhpZXJhcmNoeSB0byBzZWUgd2hpY2ggcm9sZXMgYXJlIGF2YWlsYWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uIFNlbGVjdCBhIFJvbGUgdGhhdCB5b3Ugd2FudCB0byBhZGQgdG8geW91ciBhY3Rpdml0eSBhbmQgZHJhZyBpdCBvbiB0b3Agb2YgdGhlIGFjdGl2aXR5IHlvdSBjcmVhdGVkIGVhcmxpZXIuIFRoZSByb2xlIGlzIGFkZGVkIGFzIGEgcm9sZSBkZXNjcmlwdG9yIChhbiBvY2N1cnJlbmNlIG9mIGEgcm9sZSBpbiBvbmUgc3BlY2lmaWMgYWN0aXZpdHkpLjxici8+PGJyLz5JZiB0aGUgcm9sZSB0aGF0IHlvdSBqdXN0IGRyYWdnZWQgaGFzIHJlc3BvbnNpYmlsaXR5IHJlbGF0aW9uc2hpcHMgdG8gd29yayBwcm9kdWN0cyBkZWZpbmVkLCBhIHdpemFyZCBhcHBlYXJzIHByb21wdGluZyB5b3UgdG8gYWRkIGFueSBvZiB0aGUgd29yayBwcm9kdWN0cyB0byB0aGUgcHJvY2Vzcy4gU2VsZWN0IHplcm8gdG8gbWFueSB3b3JrIHByb2R1Y3RzIGFuZCB0aGVuIGNsaWNrIE9LLjxici8+PGJyLz5Gb3IgZWFjaCBzZWxlY3RlZCB3b3JrIHByb2R1Y3QgdGhlIG5leHQgd2l6YXJkIHdpbmRvdyBwcm9tcHRzIHlvdSB0byBzZWxlY3QgdGFza3MgdGhhdCBwcm9kdWNlIHRoZXNlIHdvcmsgcHJvZHVjdHMuIEFnYWluLCBzZWxlY3QgemVybyB0byBtYW55IHRhc2tzIGFuZCB0aGVuIGNsaWNrIE9LIHRvIGFkZCB0aGVzZSBlbGVtZW50cyB0byB5b3VyIHByb2Nlc3MuPGJyLz48YnIvPlJldmlldyB0aGUgcm9sZSBkZXNjcmlwdG9yJ3MgZGV0YWlscyBpbiBpdHMgcHJvcGVydGllcyB2aWV3LiBJZiB0aGUgcHJvcGVydGllcyB2aWV3IGlzIG5vdCBkaXNwbGF5ZWQgdGhlbiBzZWxlY3QgdGhlIHJvbGUgaW4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yLCByaWdodC1jbGljaywgYW5kIHNlbGVjdCAiUHJvcGVydGllcyIuIFVzZSB0aGUgdGFicyBvbiB0aGUgc2lkZSBvZiB0aGUgcHJvcGVydGllcyB2aWV3IHRvIHJldmlldyBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aGUgcm9sZSBkZXNjcmlwdG9yLiBZb3UgY2FuIGFsc28gcGVyZm9ybSBpbmRpdmlkdWFsIG1vZGlmaWNhdGlvbnMgb2YgdGhlIHJvbGUgZGVzY3JpcHRvciwgc3VjaCBhcyBjaGFuZ2UgdGhlIHByZXNlbnRhdGlvbiBuYW1lLCBhZGQgdGV4dHVhbCBkZXNjcmlwdGlvbnMsIGNoYW5nZSB3b3JrIHByb2R1Y3RzIHRoZSByb2xlIGlzIHJlc3BvbnNpYmxlIGZvciwgZXRjLjxici8+PGJyLz5XaGVuIGNoYW5naW5nIHRoZSByb2xlIGRlc2NyaXB0b3LigJlzIHJlbGF0aW9uc2hpcHMgaW4gdGhlIHByb3BlcnR5IHdpbmRvdyB0YWLigJlzIHJvbGVzIG9yIHdvcmsgcHJvZHVjdHMsIHlvdSBjYW4gYWRkIG5ldyBlbGVtZW50cyBmcm9tIHlvdXIgbWV0aG9kIGNvbnRlbnQgYnkgdXNpbmcgdGhlICJBZGTigKYiIGJ1dHRvbiwgb3IgY29ubmVjdCB5b3VyIHJvbGUgZGVzY3JpcHRvciB3aXRoIHdvcmsgcHJvZHVjdHMgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgYWN0aXZpdHkuPGJyLz48YnIvPkNvbnRpbnVlIGFkZGluZyBtb3JlIHJvbGVzIHRvIHlvdXIgYWN0aXZpdGllcywgb3Igc3dpdGNoIHRvIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGFiIHRvIGFkZCB0YXNrcyBvciB0byB0aGUgd29yayBwcm9kdWN0IHVzYWdlIHRhYiB0byBhZGQgd29yayBwcm9kdWN0cy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sIiAKLQkJdGl0bGU9IkRldmVsb3AgdGhlIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmUiCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+QmVmb3JlIHlvdSBzdGFydCwgZW5zdXJlIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGVkIGluIHRoZSB0b29sIGJhciBpcyB0aGUgc2FtZSBhcyB0aGUgY29uZmlndXJhdGlvbiB5b3Ugc2VsZWN0ZWQgYXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgeW91ciBwcm9jZXNzLjxici8+PGJyLz5JbiB0aGUgcHJvY2VzcyBlZGl0b3IsIGNsaWNrIHRoZSAiV29yayBQcm9kdWN0IFVzYWdlIiB0YWIgdG8gb3BlbiB0aGUgd29yayBwcm9kdWN0IHVzYWdlIGVkaXRvci48YnIvPjxici8+UmlnaHQtY2xpY2sgdGhlIGVsZW1lbnQgaW4gdGhlIGZpcnN0IHJvdyBvZiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdGhlbiBjbGljayBOZXcgQ2hpbGQgLSZndDsgQWN0aXZpdHkgdG8gY3JlYXRlIGEgbmV3IGFjdGl2aXR5LiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGNyZWF0ZSBhIHBoYXNlIG9yIGl0ZXJhdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSBzY29wZSBvZiB5b3VyIHByb2Nlc3MuIElmIG5lZWRlZCwgY3JlYXRlIG1vcmUgYWN0aXZpdGllcyB0byBzZXQtdXAgeW91ciBicmVha2Rvd24gc3RydWN0dXJlLiBBY3Rpdml0aWVzIGNhbiBiZSBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXIuPGJyLz48YnIvPlJldmlldyB0aGUgbGlzdCBvZiB3b3JrIHByb2R1Y3RzIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIEluIHRoaXMgdmlldyB3b3JrIHByb2R1Y3RzIGFyZSBzb3J0ZWQgYnkgZG9tYWluIGFzIHdlbGwgYXMgd29yayBwcm9kdWN0IHR5cGVzLiAgRHJpbGwgaW50byBlaXRoZXIgb2YgdGhlc2UgaGllcmFyY2hpZXMgdG8gc2VlIHdoaWNoIHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uIFNlbGVjdCBhIHdvcmsgcHJvZHVjdCB5b3Ugd2FudCB0byBhZGQgdG8gYW4gYWN0aXZpdHkgYW5kIHRoZW4gZHJhZyBpdCBvbiB0b3Agb2YgYW4gQWN0aXZpdHkgdGhhdCB5b3UgY3JlYXRlZCBlYXJsaWVyLiBUaGUgd29yayBwcm9kdWN0IGlzIGFkZGVkIGFzIGEgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgKGFuIG9jY3VycmVuY2Ugb2YgYSB3b3JrIHByb2R1Y3QgaW4gb25lIHNwZWNpZmljIGFjdGl2aXR5KS48YnIvPjxici8+QWZ0ZXIgeW91IGhhdmUgYWRkZWQgdGhlIHdvcmsgcHJvZHVjdCB0byB0aGUgYWN0aXZpdHksIGEgd2l6YXJkIHByb21wdHMgeW91IHRvIGFkZCB0YXNrcyB0aGF0IHByb2R1Y2UgdGhpcyB3b3JrIHByb2R1Y3QgdG8gdGhpcyBhY3Rpdml0eS4gU2VsZWN0IHplcm8gdG8gbWFueSB0YXNrcyBhbmQgdGhlbiBjbGljayBPSy4gVGhlIHdpemFyZCBhZGRzIHRhc2sgZGVzY3JpcHRvcnMgZm9yIGVhY2ggc2VsZWN0ZWQgdGFzayB0byB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlLjxici8+PGJyLz5SZXZpZXcgdGhlIG5ldyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcuKAmXMgZGV0YWlscyBpbiBpdHMgcHJvcGVydGllcyB2aWV3LiBJZiB0aGUgcHJvcGVydGllcyB2aWV3IGlzIG5vdCBkaXNwbGF5ZWQgdGhlbiBzZWxlY3QgdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGluIHRoZSBwcm9jZXNzIGVkaXRvciwgcmlnaHQtY2xpY2ssIGFuZCBzZWxlY3QgIlByb3BlcnRpZXMiLiBVc2UgdGhlIHRhYnMgb24gdGhlIHNpZGUgb2YgdGhlIHByb3BlcnRpZXMgdmlldyB0byByZXZpZXcgZGlmZmVyZW50IGFzcGVjdHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yLiBZb3UgY2FuIGFsc28gcGVyZm9ybSBpbmRpdmlkdWFsIG1vZGlmaWNhdGlvbnMgb2YgdGhlIHJvbGUgZGVzY3JpcHRvciwgc3VjaCBhcyBjaGFuZ2UgdGhlIHByZXNlbnRhdGlvbiBuYW1lIGFkZCB0ZXh0dWFsIGRlc2NyaXB0aW9ucywgYWRkIGVudHJ5IGFuZCBleGl0IHN0YXRlcywgZXRjLjxici8+PGJyLz5XaGVuIGNoYW5naW5nIHRoZSByb2xlIGRlc2NyaXB0b3LigJlzIHJlbGF0aW9uc2hpcHMgaW4gdGhlIHByb3BlcnR5IHdpbmRvdyB0YWLigJlzIHJvbGVzIG9yIHdvcmsgcHJvZHVjdHMsIHlvdSBjYW4gYWRkIG5ldyBlbGVtZW50cyBmcm9tIHlvdXIgbWV0aG9kIGNvbnRlbnQgYnkgdXNpbmcgdGhlICJBZGTigKYiIGJ1dHRvbiwgb3IgY29ubmVjdCB5b3VyIHJvbGUgZGVzY3JpcHRvciB3aXRoIHdvcmsgcHJvZHVjdHMgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgQWN0aXZpdHkuPGJyLz48YnIvPkNvbnRpbnVlIGJ5IGFkZGluZyBtb3JlIHdvcmsgcHJvZHVjdHMgdG8geW91ciBhY3Rpdml0aWVzLCBvciBzd2l0Y2ggdG8gdGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSB0YWIgdG8gYWRkIHRhc2tzIG9yIHRoZSB0ZWFtIGFsbG9jYXRpb24gdGFiIHRvIGFkZCByb2xlcy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwiIAotCQl0aXRsZT0iQXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlciBvciBDYXBhYmlsaXR5IFBhdHRlcm4ncyBBY3Rpdml0eSIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgZG8gbm90IG5lZWQgdG8gZGV2ZWxvcCB5b3VyIHByb2Nlc3MgZnJvbSBzY3JhdGNoIGJ5IGFkZGluZyBkZXNjcmlwdG9ycyBvbmUgYnkgb25lIGFzIGRlc2NyaWJlZCBpbiB0aGUgbGFzdCBzdGVwcy4gIFlvdSBjYW4gYWxzbyByZXVzZSBleGlzdGluZyBjYXBhYmlsaXR5IHBhdHRlcm5zIG9yIGV2ZW4gY2FwYWJpbGl0eSBwYXR0ZXJuIHBhcnRzLiBHbyB0byB0aGUgY2hlYXQgc2hlZXQgIkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIiB0byBzZWUgaG93LjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZGNvbmZpZ3VyYXRpb24ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlbWV0aG9kY29uZmlndXJhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwYmQzMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlbWV0aG9kY29uZmlndXJhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGNoZWF0c2hlZXQgdGl0bGU9IkNyZWF0ZSB5b3VyIG93biBNZXRob2QgQ29uZmlndXJhdGlvbiI+Ci0JPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbi5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPlRoaXMgY2hlYXQgc2hlZXQgZ3VpZGVzIHlvdSB0aG91Z2ggdGhlIHN0ZXBzIG9mIGNyZWF0aW5nIHlvdXIgb3duIG1ldGhvZCBjb25maWd1cmF0aW9uLiBCZWNhdXNlIHRoZSBtZXRob2QgbGlicmFyeSBjYW4gY29udGFpbiBsYXJnZSBudW1iZXJzIG9mIGVsZW1lbnRzLCB5b3UgbWF5IHdhbnQgdG8gbGltaXQgeW91ciB3b3JrIHRvIGEgdXNlci1kZWZpbmVkIHN1YnNldCBvZiB0aGUgbGlicmFyeSBjYWxsZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uIEEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZGVmaW5lcyBhIHdvcmtpbmcgc2V0IG9mIHBhY2thZ2VzIHdpdGhpbiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCBoZWxwcyB5b3UgbGltaXQgeW91ciB2aWV3IHRvIGEgc3Vic2V0IG9mIGFsbCBlbGVtZW50cy4gTWV0aG9kIGNvbmZpZ3VyYXRpb25zIGFyZSBub3Qgb25seSB1c2VkIGZvciBjcmVhdGluZyBwcm9jZXNzZXMgKHlvdSBkcmFnIGFuZCBkcm9wIGVsZW1lbnRzIGludG8gYSBwcm9jZXNzIGZyb20gaGVyZSksIGJ1dCBhbHNvIGZvciBwdWJsaWNhdGlvbiwgYmVjYXVzZSBhIGNvbmZpZ3VyYXRpb24gZGVmaW5lcyB3aGljaCBlbGVtZW50cyB3aWxsIGJlIHB1Ymxpc2hlZCBpbiBIVE1MIGFuZCB3aGljaCB3aWxsIG5vdC48YnIvPjxici8+VGhlIGVsZW1lbnRzIHRoYXQgYXJlIHBhcnQgb2YgYSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gVGhlIGNvbmZpZ3VyYXRpb24gdmlldyBhbGxvd3MgeW91IHRvIGJyb3dzZSB0aGUgY29sbGVjdGlvbiBvZiBtZXRob2QgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiwgYW5kIHRvIHBvcHVsYXRlIHByb2Nlc3NlcyBieSBkcmFnZ2luZyBlbGVtZW50cyBmcm9tIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgaW50byB0aGUgcHJvY2VzcyBlZGl0b3IuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwiCi0JCXRpdGxlPSJQcmVwYXJlIENyZWF0aW5nIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24iCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkJlZm9yZSBjcmVhdGluZyBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHlvdSBzaG91bGQgZGV0ZXJtaW5lIHlvdXIgbmVlZHMgYW5kIGdvYWxzIGZvciB0aGUgY29uZmlndXJhdGlvbi4gT25lIHNjZW5hcmlvIGZvciBjcmVhdGluZyBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGlzIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkIGEgbmV3IG1ldGhvZCBwbHVnLWluIGluIHdoaWNoIHlvdSB3YW50IHRvIGRlZmluZSBtZXRob2QgZWxlbWVudHMgdGhhdCBleHRlbmQgYW4gYWxyZWFkeSBleGlzdGluZyBwbHVnLWluLiBJbiB0aGlzIGNhc2UsIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gdGhhdCBpbmNsdWRlcyB5b3VyIG5ldyBwbHVnLWluIGFzIHdlbGwgYXMgdGhlIGV4aXN0aW5nIHBsdWctaW4uIElmIHlvdSB3YW50IHRvIGNyZWF0ZSB5b3VyIG93biBtZXRob2QgcGx1Zy1pbiBmaXJzdCB0aGVuIGdvIHRoZSBjaGVhdCAiQ3JlYXRlIHlvdXIgb3duIE1ldGhvZCBQbHVnLWluIi48YnIvPjxici8+QW5vdGhlciBzY2VuYXJpbyBmb3IgY3JlYXRpbmcgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpcyB0aGF0IHlvdSB3YW50IHRvIGRlZmluZSBhIG5ldyBjb25maWd1cmF0aW9uIGZvciBwdWJsaWNhdGlvbiBwdXJwb3NlcyBvbiBleGlzdGluZyBwbHVnLWlucywgZGVmaW5pbmcgd2hpY2ggZWxlbWVudHMgdG8gcHVibGlzaC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjdXJyZW50IHNldCBvZiBjb25maWd1cmF0aW9ucyBhdmFpbGFibGUgZG9lcyBub3QgbWVldCB5b3VyIG5lZWRzLCB5b3UgY291bGQgbm93IGVpdGhlciBjdXN0b21pemUgYW4gZXhpc3RpbmcgY29uZmlndXJhdGlvbiBvciBjcmVhdGUgYSBjb21wbGV0ZWx5IG5ldyBjb25maWd1cmF0aW9uIGZyb20gc2NyYXRjaC48YnIvPjxici8+SWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYnkgY29weWluZyBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uIGdvIHRvIHRoZSBuZXh0IHN0ZXAgIkNyZWF0ZSBhIE1ldGhvZCBDb25maWd1cmF0aW9uIGJ5IGNvcHlpbmcgYW4gZXhpc3RpbmcgY29uZmlndXJhdGlvbiIuPGJyLz48YnIvPklmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGNvbXBsZXRlbHkgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLCBza2lwIHRvIHN0ZXAgIkNyZWF0ZSBhIG5ldyBNZXRob2QgQ29uZmlndXJhdGlvbiBmcm9tIHNjcmF0Y2giLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkNyZWF0ZSBhIE1ldGhvZCBDb25maWd1cmF0aW9uIGJ5IENvcHlpbmcgYW4gRXhpc3RpbmcgQ29uZmlndXJhdGlvbiIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5FeHBhbmQgdGhlICJDb25maWd1cmF0aW9ucyIgcGFja2FnZSBhdCB0aGUgZW5kIG9mIHRoZSBMaWJyYXJ5IHZpZXcuIFJpZ2h0IGNsaWNrIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiB5b3Ugd2FudCB0byBjb3B5LCBhbmQgdGhlbiBzZWxlY3QgIkNvcHkiIGZyb20gdGhlIG1lbnUuIFJpZ2h0IGNsaWNrIHRoZSBjb25maWd1cmF0aW9ucyBwYWNrYWdlIGFuZCB0aGVuIHNlbGVjdCAiUGFzdGUiIGZyb20gdGhlIG1lbnUuPGJyLz48YnIvPkEgZGlhbG9nIHByb21wdHMgeW91ciBmb3IgYSBuZXcgY29uZmlndXJhdGlvbiBuYW1lLiBQcm92aWRlIGEgbmFtZSB0aGF0IHJlZmxlY3RzIHRoZSBjaGFyYWN0ZXIgb3IgcHVycG9zZSBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uIFRvIGNvbnRpbnVlIHNwZWNpZnlpbmcgeW91ciBtZXRob2QgY29uZmlndXJhdGlvbiwgc2tpcCB0byBzdGVwICJTcGVjaWZ5IHRoZSBNZXRob2QgQ29uZmlndXJhdGlvbiIuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iQ3JlYXRlIGEgbmV3IE1ldGhvZCBDb25maWd1cmF0aW9uIGZyb20gU2NyYXRjaCIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5SaWdodCBjbGljayB0aGUgY29uZmlndXJhdGlvbnMgcGFja2FnZSBhbmQgc2VsZWN0IE5ldyAtJmd0OyBNZXRob2QgQ29uZmlndXJhdGlvbiBmcm9tIHRoZSBtZW51LiBUaGUgbmV3IGNvbmZpZ3VyYXRpb24gaXMgYWRkZWQgdG8gdGhlIGxpc3QgYW5kIGl0cyBlZGl0b3IgaXMgb3BlbmVkLiBDaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIG5ldyBjb25maWd1cmF0aW9uIHRvIHJlZmxlY3QgaXRzIGNoYXJhY3RlciBvciBwdXJwb3NlIGFuZCB0aGVuIGNvbnRpbnVlIHRvIHRoZSBuZXh0IHN0ZXAsICJTcGVjaWZ5IHRoZSBNZXRob2QgQ29uZmlndXJhdGlvbiIuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iU3BlY2lmeSB0aGUgTWV0aG9kIENvbmZpZ3VyYXRpb24iCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkNsaWNrIHRoZSAiUGx1Zy1pbiBhbmQgUGFja2FnZSBTZWxlY3Rpb24iIHRhYiBpbiB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZWRpdG9yIHRvIGdvIHRvIHRoZSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24gZm9ybS4gVGhpcyBmb3JtIGRpc3BsYXlzIGEgbGlzdCBvZiBhbGwgbWV0aG9kIHBsdWctaW5zIGFuZCBmb3IgZXZlcnkgcGx1Zy1pbiBhbGwgb2YgaXRzIGNvbnRlbnQgcGFja2FnZXMgYXMgd2VsbCBhcyBhbGwgcHJvY2Vzc2VzLiBVc2UgdGhlIGNoZWNrIGJveGVzIHRvIGFkZCBvciByZW1vdmUgcGx1Zy1pbnMsIHBhY2thZ2VzLCBhbmQgcHJvY2Vzc2VzIHRvIG9yIGZyb20geW91ciBjb25maWd1cmF0aW9uLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9udmlldy5odG1sIiAKLQkJdGl0bGU9IlByZXZpZXcgeW91ciBDb25maWd1cmF0aW9uIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXciCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBjYW4gaW1tZWRpYXRlbHkgcHJldmlldyB5b3VyIG1ldGhvZCBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIFJlZnJlc2ggeW91ciBjb25maWd1cmF0aW9uIHZpZXcgYnkgY2xpY2tpbmcgdGhlIHZpZXcncyAiUmVmcmVzaCBBbGwiIGljb24uIERyaWxsIGludG8gdGhlIHRyZWUgc3RydWN0dXJlcyBkaXNwbGF5ZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24gdmlldyB0byBzZWUgZWxlbWVudHMgaW5jbHVkZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwiIAotCQl0aXRsZT0iRGVmaW5lIE5hdmlnYXRpb24gVmlld3MgZm9yIHRoZSBNZXRob2QgQ29uZmlndXJhdGlvbiIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+QSBuYXZpZ2F0aW9uIHZpZXcgaXMgYSBuYXZpZ2F0aW9uIHRyZWUgYnJvd3NlciBmb3IgYSBjb25maWd1cmF0aW9uIHB1Ymxpc2hlZCBhcyBIVE1MLiBFdmVyeSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBjYW4gaGF2ZSBzZXZlcmFsIHZpZXdzIHRoYXQgYXJlIGRpc3BsYXllZCBhcyBzdGFja2VkIHRyZWUgYnJvd3NlciB0YWJzLiBUaGUgc3RydWN0dXJlIG9mIHRoZSBuYXZpZ2F0aW9uIHZpZXcgaXMgZGVmaW5lZCBhcyBjdXN0b20gY2F0ZWdvcmllcy4gQSBjdXN0b20gY2F0ZWdvcnkgaXMgYSB1c2VyLWRlZmluZWQgY29sbGVjdGlvbiBvZiBjYXRlZ29yaXppbmcgZWxlbWVudHMsIHdoaWNoIG1heSBpdHNlbGYgY29udGFpbiBzdWJjYXRlZ29yaWVzLiBUaGlzIHN0cnVjdHVyZSBpcyB3aGF0IGRlZmluZXMgdGhlIHN0cnVjdHVyZSBmb3IgdGhlIHRyZWUgYnJvd3Nlci4gKEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IEN1c3RvbSBDYXRlZ29yaWVzLCBzZWUgdGhlIG9ubGluZSBoZWxwLikgVGhlcmVmb3JlLCB0byBkZWZpbmUgYSBuYXZpZ2F0aW9uIHZpZXcgeW91IHNlbGVjdCBhIGN1c3RvbSBjYXRlZ29yeSBhbmQgYWxsIG9mIHRoaXMgY2F0ZWdvcmllcyBzdWItZWxlbWVudHMgbWFrZSB1cCB0aGUgdHJlZSBicm93c2VyIHN0cnVjdHVyZSBkaXNwbGF5ZWQgYnkgdGhlIHZpZXcuPGJyLz48YnIvPlRvIGFkZCBuYXZpZ2F0aW9uIHZpZXdzIHRvIHlvdXIgY29uZmlndXJhdGlvbiBjbGljayB0aGUgIlZpZXdzIiB0YWIgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yLiBVc2UgdGhlICJBZGQgVmlldy4uLiIgYW5kICJSZW1vdmUgVmlldyIgYnV0dG9ucyB0byBzZWxlY3QgdGhlIGN1c3RvbSBjYXRlZ29yaWVzIHlvdSB3YW50IHRvIGFkZCBhbmQgcmVtb3ZlIGFzIGEgdmlldywgcmVzcGVjdGl2ZWx5LiBDbGljayB0aGUgdGFiIG9mIHRoZSB2aWV3cyB5b3UganVzdCBhZGRlZCB0byBwcmV2aWV3Ljxici8+PGJyLz5UbyBzZWxlY3QgYSB2aWV3IHRvIGRpc3BsYXkgYXMgdGhlIHN0YXJ0LXVwIHZpZXcsIGNsaWNrIHRoZSAiTWFrZSBEZWZhdWx0IiBidXR0b24uIFRoZSBzdGFydC11cCB2aWV3IGlzIHRoZSBmaXJzdCB2aWV3IHNob3duIHdoZW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBpcyBkaXNwbGF5ZWQgd2hlbiBzdGFydGluZyB1cC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRG9uZSI+PGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotPC9jaGVhdHNoZWV0PgotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9jcmVhdGVtZXRob2RwbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlbWV0aG9kcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQzYWIwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9jcmVhdGVtZXRob2RwbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gLS0+Ci08Y2hlYXRzaGVldCB0aXRsZT0iQ3JlYXRlIHlvdXIgb3duIE1ldGhvZCBQbHVnLWluIj4KLQotCTxpbnRybyAKLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5CZWNhdXNlIHRoZSBwbHVnLWlucyBzaGlwcGVkIHdpdGggdGhlIG1ldGhvZCBsaWJyYXJ5IGFyZSBsb2NrZWQgYW5kIHJlYWQtb25seSwgYWxsIHlvdXIgY2hhbmdlcywgYWRkaXRpb25zLCBhbmQgZXh0ZW5zaW9ucyB0byBleGlzdGluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGhhdmUgdG8gYmUgcGxhY2VkIGluIHlvdXIgb3duIG1ldGhvZCBwbHVnLWlucy4gSG93ZXZlciwgeW91IGNhbiB1c2UgdmFyaW91cyBjYXBhYmlsaXRpZXMgdG8gbG9naWNhbGx5IG1lcmdlIHlvdXIgcGx1Zy1pbiBjb250ZW50cyBpbnRvIG90aGVyIHBsdWctaW5zIGFsbG93aW5nIHlvdSwgYXMgYSByZXN1bHQsIHRvIHB1Ymxpc2ggZXh0ZW5kZWQgbWV0aG9kcyBhbmQgcHJvY2Vzc2VzIHRoYXQgc2VhbWxlc3NseSBpbmNvcnBvcmF0ZSB5b3VyIG1ldGhvZCBlbGVtZW50cy4gVG8gY3JlYXRlIHlvdXIgb3duIG1ldGhvZCBwbHVnLWlucyBmb2xsb3cgdGhlc2Ugc3RlcHMuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCi0JPGl0ZW0KLQkJdGl0bGU9IlVzZSB0aGUgTWV0aG9kIFBsdWctaW4gV2l6YXJkIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5DcmVhdGUgYSBuZXcgbWV0aG9kIHBsdWctaW4gdXNpbmcgdGhlICJOZXcgTWV0aG9kIFBsdWctaW4iIHdpemFyZC4gVG8gb3BlbiB0aGUgd2l6YXJkIHNlbGVjdCBGaWxlIC0mZ3Q7IE5ldyAtJmd0OyBNZXRob2QgUGx1Zy1pbi4gU3BlY2lmeSBhdCBsZWFzdCB0aGUgbmFtZSBmb3IgeW91ciBuZXcgbWV0aG9kIHBsdWctaW4gYW5kIHNlbGVjdCB0aGUgY2hlY2sgYm94IGZvciBhbnkgb3RoZXIgbWV0aG9kIHBsdWctaW5zIHdoaWNoIGNvbnRlbnQgeW91IHdpc2ggdG8gZXh0ZW5kIG9yIHJldXNlLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJdGl0bGU9Ik9wZW4gdGhlIE1ldGhvZCBQbHVnaW4gRWRpdG9yIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5BZnRlciB5b3UgaGF2ZSBjcmVhdGVkIHRoZSBwbHVnLWluLCB5b3UgY2FuIG1ha2UgY2hhbmdlcyB0byBpdHMgc3BlY2lmaWNhdGlvbnMgaW4gdGhlIG1ldGhvZCBwbHVnLWluIGVkaXRvci4gSW4gdGhlIGxpYnJhcnkgdmlldywgZG91YmxlIGNsaWNrIHRoZSBtZXRob2QgcGx1Zy1pbiB0aGF0IHlvdSBqdXN0IGNyZWF0ZWQgdG8gb3BlbiB0aGUgZWRpdG9yLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJdGl0bGU9IlNwZWNpZnkgVmVyc2lvbiBJbmZvcm1hdGlvbiIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+SW4gYWRkaXRpb24gdG8gdGhlIGluZm9ybWF0aW9uIGFscmVhZHkgc3BlY2lmaWVkIGluIHRoZSBtZXRob2QgcGx1Zy1pbiB3aXphcmQsIHlvdSBjYW4gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBwbHVnLWluLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJdGl0bGU9IlNlbGVjdCB0aGUgRGVmYXVsdCBDb3B5cmlnaHQgRGVmaW5pdGlvbiBGaWxlIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlICJTZWxlY3QiIGJ1dHRvbiB0byBzcGVjaWZ5IHdoaWNoIHBhZ2Ugb2YgdGhlIHR5cGUgIlN1cHBvcnRpbmcgTWF0ZXJpYWwiIGNvbnRhaW5zIHRoZSBjb3B5cmlnaHQgaW5mb3JtYXRpb24gZm9yIGVsZW1lbnRzIG9mIHRoaXMgcGx1Zy1pbi4gIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgd2lsbCBiZSBhcHBlbmRlZCB0byBldmVyeSBwYWdlIHRoYXQgZ2V0cyBwdWJsaXNoZWQgYmFzZWQgb24gYW4gZWxlbWVudCBmcm9tIHRoaXMgcGx1Zy1pbi4gIE5vdGUsIHRoYXQgaW5kaXZpZHVhbCBtZXRob2QgZWxlbWVudHMgY2FuIG92ZXJyaWRlIHRoaXMgc3RhbmRhcmQgc2VsZWN0aW9uIHdpdGggdGhlIGNvcHlyaWdodCBmaWVsZCBpbiB0aGVpciBvd24gZWRpdG9ycy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRG9uZSI+PGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+PC9pdGVtPgotPC9jaGVhdHNoZWV0PgotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9uYXZpZ2F0ZW1ldGhvZGNvbnRlbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvbmF2aWdhdGVtZXRob2Rjb250ZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjdlNjUxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9uYXZpZ2F0ZW1ldGhvZGNvbnRlbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08Y2hlYXRzaGVldCB0aXRsZT0iTmF2aWdhdGUgTWV0aG9kIENvbnRlbnQiPgotCTxpbnRybyBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiPgotCQk8ZGVzY3JpcHRpb24+VGhlcmUgYXJlIHR3byB3YXlzIHRvIG5hdmlnYXRlIG1ldGhvZCBjb250ZW50OiBieSB1c2luZyB0aGUgcGh5c2ljYWwgbGlicmFyeSBzdHJ1Y3R1cmUgaW4gdGhlIGxpYnJhcnkgdmlldyBvciBieSB1c2luZyB0aGUgbG9naWNhbCBjYXRlZ29yaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiAgVGhpcyBjaGVhdCBzaGVldCB3YWxrcyB5b3UgdGhyb3VnaCBib3RoIHNjZW5hcmlvcy48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0JPGl0ZW0gaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2F1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwiIHRpdGxlPSJTd2l0Y2ggdG8gQXV0aG9yaW5nIFBlcnNwZWN0aXZlIiBza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBjYW4gd29yayB3aXRoIHR3byBwZXJzcGVjdGl2ZXM6IHRoZSBhdXRob3JpbmcgcGVyc3BlY3RpdmUgYW5kIHRoZSBicm93c2luZyBwZXJzcGVjdGl2ZS4gQSBwZXJzcGVjdGl2ZSBkZWZpbmVzIGEgc2V0IG9mIHZpZXdzIGFuZCBmdW5jdGlvbnMgdG8gYmUgYXZhaWxhYmxlIGZvciBzcGVjaWZpYyB0YXNrcy4gVGhlIGF1dGhvcmluZyBwZXJzcGVjdGl2ZSBwcm92aWRlcyB2aWV3cyBhbmQgZnVuY3Rpb25zIHRvIG5hdmlnYXRlIGFuZCBhdXRob3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcywgd2hpbGUgdGhlIGJyb3dzaW5nIHBlcnNwZWN0aXZlIGFsbG93cyB5b3UgdG8gcHJldmlldyBhbmQgYnJvd3NlIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uIFRoaXMgY2hlYXQgc2hlZXQgcmVmZXJzIHRvIHRoZSBhdXRob3JpbmcgcGVyc3BlY3RpdmUuPGJyLz48YnIvPkNsaWNrIHRoZSAiT3BlbiBQZXJzcGVjdGl2ZSIgYnV0dG9uIG9yIHRoZSBXaW5kb3ctJmd0O09wZW4gUGVyc3BlY3RpdmUgbWVudSBhbmQgdGhlbiBzZWxlY3QgIkF1dGhvcmluZyIgdG8gc3dpdGNoIHRvIHRoZSBhdXRob3JpbmcgcGVyc3BlY3RpdmUuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2xpYnJhcnl2aWV3Lmh0bWwiIHRpdGxlPSJPcGVuIHRoZSBMaWJyYXJ5IFZpZXciIHNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+SWYgeW91IGRvIG5vdCBzZWUgYSB0cmVlLWJyb3dzZXIgdmlldyBsYWJlbGVkICJMaWJyYXJ5IiBpbiB5b3VyIGF1dGhvcmluZyBwZXJzcGVjdGl2ZSBjbGljayB0aGUgV2luZG93LSZndDtSZXNldCBQZXJzcGVjdGl2ZSBtZW51LjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIGhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50cGFja2FnZS5odG1sIiB0aXRsZT0iRHJpbGwgaW50byBNZXRob2QgQ29udGVudCBQYWNrYWdlcyIgc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+V2l0aGluIHRoZSBsaWJyYXJ5IHZpZXcgdHJlZS1icm93c2VyLCBleHBhbmQgYSBwbHVnLWluIGFuZCBkcmlsbCBpbnRvIHRoZSBwYWNrYWdlcyAiTWV0aG9kIENvbnRlbnQiLSZndDsiQ29udGVudCBQYWNrYWdlcyIgYW5kIGl0cyBzdWItcGFja2FnZXMuIEV4YW1pbmUgdGhlIGNvbnRlbnRzLgotCQk8L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iUmV2aWV3IENvbnRlbnQgUGFja2FnZXMiIHNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkV2ZXJ5IGNvbnRlbnQgcGFja2FnZSBjb250YWlucyBkaWZmZXJlbnQgdHlwZXMgb2YgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgd2hpY2ggYXJlIHNvcnRlZCBpbnRvIGRpZmZlcmVudCBjYXRlZ29yaWVzLiBUaGUgY2F0ZWdvcmllcyBhcmUgcm9sZXMsIHRhc2tzLCB3b3JrIHByb2R1Y3RzLCBhbmQgZ3VpZGFuY2UuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnQuaHRtbCIgdGl0bGU9Ik9wZW4gYSBNZXRob2QgQ29udGVudCBFbGVtZW50IEVkaXRvciIgc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+U2VsZWN0IGEgbWV0aG9kIGVsZW1lbnQsIHN1Y2ggYXMgYSB0YXNrLCBhbmQgZG91YmxlIGNsaWNrIHRvIG9wZW4gaXRzIGVkaXRvci48YnIvPjxici8+VGhlIGVkaXRvciBwcm92aWRlcyB0YWJzIGFuZCBmb3JtcyB0byBvcmdhbml6ZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciB0aGUgZWxlbWVudC4gIFNlbGVjdCB0aGUgZGlmZmVyZW50IHRhYnMgYW5kIHRoZSBib3R0b20gb2YgZXZlcnkgZWRpdG9yIGFuZCByZXZpZXcgdGhlIGRpZmZlcmVudCBmb3JtcyBkaXNwbGF5ZWQuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwiIHRpdGxlPSJFeGFtaW5lIENhdGVnb3JpZXMiIHNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPldpdGhpbiB0aGUgbGlicmFyeSB2aWV3IHRyZWUtYnJvd3NlciwgZXhwYW5kIHRoZSBwYWNrYWdlcyB0byB0aGUgc2FtZSBsZXZlbCBhcyBjb250ZW50IHBhY2thZ2VzIHVudGlsIHlvdSBmaW5kIHRoZSAiQ3VzdG9tIENhdGVnb3JpZXMiIGFuZCAiU3RhbmRhcmQgQ2F0ZWdvcmllcyIgcGFja2FnZXMuIERyaWxsIGludG8gdGhlc2UgcGFja2FnZXMgYW5kIHRoZW4gZXhhbWluZSB0aGVpciBjb250ZW50cy48YnIvPjxici8+RXZlcnkgY2F0ZWdvcnkgbGlzdGVkIGhlcmUgaXMgYSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbC4gIE9wZW4gdGhlIGRlc2NyaXB0aW9uIG9mIGEgY2F0ZWdvcnkgc3VjaCBhcyBhIGRpc2NpcGxpbmUgb3IgYSBkb21haW4gYnkgZG91YmxlIGNsaWNraW5nIHRoZSBjYXRlZ29yeSB3aGljaCBvcGVucyB0aGUgY2F0ZWdvcnkgZWRpdG9yLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIGhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9udmlldy5odG1sIiB0aXRsZT0iU2VsZWN0IGEgQ29uZmlndXJhdGlvbiBmb3IgdGhlIENvbmZpZ3VyYXRpb24gVmlldyIgc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5CZWNhdXNlIHRoZSBtZXRob2QgbGlicmFyeSBjYW4gY29udGFpbiBsYXJnZSBudW1iZXJzIG9mIGVsZW1lbnRzLCB5b3UgbWF5IHdhbnQgdG8gbGltaXQgeW91ciB3b3JrIHRvIGEgdXNlci1kZWZpbmVkIHN1YnNldCBvZiB0aGUgbGlicmFyeSBjYWxsZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uIEEgY29uZmlndXJhdGlvbiBkZWZpbmVzIGEgd29ya2luZyBzZXQgb2YgcGFja2FnZXMgd2l0aGluIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IGhlbHBzIHlvdSBsaW1pdCB5b3VyIHZpZXcgdG8gYSBzdWJzZXQgb2YgYWxsIGVsZW1lbnRzLiBUaGUgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiBhIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gYXJlIGRpc3BsYXllZCBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3Ljxici8+PGJyLz5UaGUgY29uZmlndXJhdGlvbiB2aWV3IGRpc3BsYXlzIGNhdGVnb3JpemVkIG1ldGhvZCBlbGVtZW50cyBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uICBUaGlzIGlzIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgaGFzIGJlZW4gc2VsZWN0ZWQgaW4gdGhlIHVubGFiZWxlZCBjb21ibyBib3ggaW4gdGhlIHRvb2wgYmFyLiAgVXNlIHRoaXMgY29tYm8gYm94IHRvIHNlbGVjdCBhIGNvbmZpZ3VyYXRpb24uPGJyLz48YnIvPkFmdGVyIHNlbGVjdGluZyBhIGNvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBpcyAocmUtKXBvcHVsYXRlZCB3aXRoIG5ldyB0cmVlcyBzaG93aW5nIGVsZW1lbnRzIGZyb20gdGhhdCBjb25maWd1cmF0aW9uLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEcmlsbCBpbnRvIENhdGVnb3JpZXMgaW4gQ29uZmlndXJhdGlvbiBWaWV3IiBza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5EcmlsbCBpbnRvIHRoZSBjb25maWd1cmF0aW9uIHZpZXcncyBjYXRlZ29yaWVzIGZvbGRlcnMgYW5kIGV4YW1pbmUgdGhlIGVsZW1lbnRzIGxpc3RlZCB0aGVyZS48YnIvPjxici8+QXMgaW4gdGhlIGxpYnJhcnkgdmlldyB5b3UgY2FuIG9wZW4gZWxlbWVudHMgbGlzdGVkIGhlcmUgdmlhIGEgZG91YmxlLWNsaWNrLiBIb3dldmVyLCB0aGUgY29uZmlndXJhdGlvbiB2aWV3IGNvbXB1dGVzIHNvLWNhbGxlZCBjb250cmlidXRpb25zIGFuZCByZXBsYWNlbWVudHMgb2YgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgKHNlZSAiVmFyaWFiaWxpdHkgT3ZlcnZpZXciIGluIHRoZSBvbmxpbmUgaGVscCBmb3IgbW9yZSBkZXRhaWxzKS4gSWYgYW4gZWxlbWVudCBoYXMgY29udHJpYnV0aW5nIGVsZW1lbnRzIHRoZW4gYSBkb3VibGUgY2xpY2sgd2lsbCBzaG93IHlvdSBhIGRpYWxvZyB3aXRoIGFsbCB0aGUgZWxlbWVudHMgcGFydGljaXBhdGluZyBpbiB0aGUgY29udHJpYnV0aW9uLiAgU2VsZWN0IG9uZSBlbGVtZW50IHRvIG9wZW4gaXRzIGVkaXRvci48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRG9uZSI+Ci0JCTxkZXNjcmlwdGlvbi8+Ci0JPC9pdGVtPgotPC9jaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvcmVwbGFjZWV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvcmVwbGFjZWV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNzVmYjYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL3JlcGxhY2VleGlzdGluZ21ldGhvZGVsZW1lbnRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08Y2hlYXRzaGVldCB0aXRsZT0iUmVwbGFjZSBFeGlzdGluZyBNZXRob2QgRWxlbWVudHMgKFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cywgb3IgR3VpZGFuY2UpIj4KLQotCTxpbnRybyAKLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ZhcmlhYmlsaXR5Lmh0bWwiPgotCQk8ZGVzY3JpcHRpb24+WW91IGNhbiB0YWlsb3IgZXhpc3RpbmcgbWV0aG9kIGVsZW1lbnRzLCBzdWNoIGFzIGFuIGVsZW1lbnQgdGhhdCBpcyBkZWZpbmVkIGluIGEgbG9ja2VkIHBsdWctaW4sIHdpdGhvdXQgZGlyZWN0bHkgbW9kaWZ5aW5nIGl0LCBidXQgYnkgcmVwbGFjaW5nIGl0IHdpdGggb25lIG9mIHlvdXIgb3duIGVsZW1lbnRzIGRlZmluZWQgaW4geW91ciBvd24gbWV0aG9kIHBsdWctaW4uIFRoaXMgY2hlYXQgc2hlZXQgd2Fsa3MgeW91IHRocm91Z2ggdGhlIHN0ZXBzIG9mIGNyZWF0aW5nIHN1Y2ggYSByZXBsYWNlbWVudC4gIFNlZSB0aGUgb25saW5lIGhlbHAgc2VjdGlvbiAiVmFyaWFiaWxpdHkgT3ZlcnZpZXciIGZvciBhbiBpbnRyb2R1Y3Rpb24gb24gdmFyaWFiaWxpdHkgYW5kIHJlcGxhY2VtZW50cy48YnIvPjxici8+UmVwbGFjZW1lbnRzIGNhbiBhbHNvIGJlIGFwcGxpZWQgd2l0aGluIHRoZSBzYW1lIG1ldGhvZCBwbHVnLWluIGJldHdlZW4gbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgZnJvbSBkaWZmZXJlbnQgY29udGVudCBwYWNrYWdlcy4gIFRoaXMgaXMgdXNlZnVsIGluIHRoZSBjYXNlIHdoZXJlIHlvdSB3YW50IHRvIHByb3ZpZGUgYWx0ZXJuYXRpdmUgY29udGVudCB0aGF0IGNhbiBiZSBzZWxlY3RlZCB1c2luZyBkaWZmZXJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb25zLjwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQotCTxpdGVtCi0JCXRpdGxlPSJQbGFuIHlvdXIgUmVwbGFjZW1lbnQiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPldoZW4gZGVmaW5pbmcgdGhlIHJlcGxhY2VtZW50IG9mIGFuIGV4aXN0aW5nIG1ldGhvZCBlbGVtZW50IHlvdSBuZWVkIHRvIGtub3cgd2hlcmUgdGhlIGV4aXN0aW5nIGVsZW1lbnQgdGhhdCB5b3Ugd2FudCB0byByZXBsYWNlIGlzIHBoeXNpY2FsbHkgbG9jYXRlZCB3aXRoaW4gaXRzIG1ldGhvZCBwbHVnLWluLiBZb3UgYWxzbyBuZWVkIHRvIGRlY2lkZSB3ZXJlIHRvIGNyZWF0ZSBhbmQgcGxhY2UgdGhlIHJlcGxhY2luZyBlbGVtZW50LiBUeXBpY2FsbHkgeW91IGNyZWF0ZSB0aGUgcmVwbGFjaW5nIGVsZW1lbnQgd2l0aGluIGEgc3BlY2lmaWMgY29udGVudCBwYWNrYWdlIGluIHlvdXIgb3duIG1ldGhvZCBwbHVnLWluLiBGaW5hbGx5LCB5b3UgbmVlZCB0byBrbm93IHdoYXQgdGhlIHJlcGxhY2luZyBlbGVtZW50J3MgY29udGVudCBpcywgYmVjYXVzZSBhbGwgb2YgdGhlIHJlcGxhY2VkIGVsZW1lbnTigJlzIGNvbnRlbnQgKGkuZS4gaXRzIHRleHQgYXR0cmlidXRlcyBhcyB3ZWxsIGFzIGl0cyByZWxhdGlvbnNoaXBzIHRoYXQgcG9pbnQgdG8gb3RoZXIgZWxlbWVudHMpIHdpbGwgYmUgcmVtb3ZlZC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiCi0JCXRpdGxlPSJDcmVhdGUgYSBSZXBsYWNpbmcgQ29udGVudCBFbGVtZW50IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5DcmVhdGUgYSBtZXRob2QgY29udGVudCBlbGVtZW50IGluIHlvdXIgbWV0aG9kIHBsdWctaW4gdGhhdCB5b3UgaW50ZW5kIHRvIGJlIHRoZSByZXBsYWNpbmcgY29udGVudCBlbGVtZW50LiBSZW1lbWJlciwgeW91IG11c3QgcHJvdmlkZSB0aGlzIGVsZW1lbnQgd2l0aCBpdHMgb3duIGNvbnRlbnQgYmVjYXVzZSBhbGwgYXR0cmlidXRlcyBvZiB0aGUgcmVwbGFjZWQgZWxlbWVudCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggZW1wdHkgZmllbGRzLCBpZiB5b3UgZG8gbm90IHByb3ZpZGUgbmV3IGRlc2NyaXB0aW9ucy48YnIvPjxici8+R28gdG8gY2hlYXQgc2hlZXQgIkFkZCBhIG5ldyBNZXRob2QgQ29udGVudCBzdWNoIGFzIFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cywgb3IgR3VpZGFuY2UiIHRvIGJlIGd1aWRlZCB0aHJvdWdoIHRoZXNlIHN0ZXBzLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JlcGxhY2UuaHRtbCIgCi0JCXRpdGxlPSJTcGVjaWZ5IHRoZSBSZXBsYWNlbWVudCBSZWxhdGlvbnNoaXAiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkdvIHRvIHRoZSAiQ29udGVudCBWYXJpYWJpbGl0eSIgc2VjdGlvbiBvZiB0aGUgZWxlbWVudHMgZGVzY3JpcHRpb24gdGFiLiBTZWxlY3QgIlJlcGxhY2VzIiBmcm9tIHRoZSBjb21ibyBib3guIENsaWNrIHRoZSAiU2VsZWN0Li4uIiBidXR0b24gb2YgdGhlIGJhc2Ugcm9sZSBmaWVsZCBhbmQgc2VsZWN0IHRoZSBlbGVtZW50IHRoYXQgeW91ciBuZXcgZWxlbWVudCByZXBsYWNlcy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIiAKLQkJdGl0bGU9IlJldmlldyB5b3VyIFJlcGxhY2VkIEVsZW1lbnQiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlRvIHJldmlldyB5b3VyIHJlcGxhY2VkIGVsZW1lbnQsIHNlbGVjdCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gY29tYm8gYm94IGluIHRoZSB0b29sIGJhciB0aGF0IGNvbnRhaW5zIHRoZSBtZXRob2QgcGx1Zy1pbnMgYW5kIGNvbnRlbnQgcGFja2FnZXMgb2YgYm90aCBlbGVtZW50cyBwYXJ0aWNpcGF0aW5nIGluIHlvdXIgcmVwbGFjZW1lbnQuIEluIG90aGVyIHdvcmRzLCB0aGUgY29uZmlndXJhdGlvbiBtdXN0IGNvbnRhaW4gdGhlIHJlcGxhY2luZyBlbGVtZW50IGFzIHdlbGwgYXMgdGhlIHJlcGxhY2VkIGJhc2UgZWxlbWVudC48YnIvPjxici8+U3dpdGNoIHRvIHRoZSBCcm93c2luZyBwZXJzcGVjdGl2ZS4gRmluZCBhbmQgc2VsZWN0IHRoZSByZXBsYWNpbmcgZWxlbWVudCAoaS5lLiB5b3VyIG5ldyBlbGVtZW50KSBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBUaGUgY29udGVudCB3aW5kb3cgZGlzcGxheXMgdGhlIHJlc3VsdHMgb2YgdGhlIHJlcGxhY2VtZW50LiBSZXZpZXcgYW4gZWxlbWVudCB0aGF0IHJlZmVycmVkIHRvIHRoZSByZXBsYWNlZCBlbGVtZW50LiBJbiBvdGhlciB3b3JkcywgaWYgeW91IHJlcGxhY2VkIGFuIGFydGlmYWN0LCBmaW5kIGEgdGFzayB0aGF0IHVzZWQgdGhpcyBhcnRpZmFjdCBhcyBhbiBpbnB1dCBvciBvdXRwdXQuIE1ha2Ugc3VyZSB0aGlzIGVsZW1lbnQgbm93IHJlZmVycyB0byB0aGUgcmVwbGFjaW5nIGVsZW1lbnQuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRvbmUiPjxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLTwvY2hlYXRzaGVldD4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvdGFpbG9yZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy90YWlsb3JleGlzdGluZ21ldGhvZGVsZW1lbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGFmNzI2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy90YWlsb3JleGlzdGluZ21ldGhvZGVsZW1lbnRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08Y2hlYXRzaGVldCB0aXRsZT0iVGFpbG9yIEV4aXN0aW5nIE1ldGhvZCBFbGVtZW50cyAoUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzLCBvciBHdWlkYW5jZSkgVXNpbmcgQ29udHJpYnV0aW9uIj4KLQotCTxpbnRybyAKLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ZhcmlhYmlsaXR5Lmh0bWwiPgotCQk8ZGVzY3JpcHRpb24+WW91IGNhbiB0YWlsb3IgZXhpc3RpbmcgbWV0aG9kIGVsZW1lbnRzLCBzdWNoIGFzIGFuIGVsZW1lbnQgdGhhdCBpcyBkZWZpbmVkIGluIGEgbG9ja2VkIG1ldGhvZCBwbHVnLWluLCB3aXRob3V0IGRpcmVjdGx5IG1vZGlmeWluZyBpdCwgYnV0IGJ5IGNvbnRyaWJ1dGluZyBuZXcgY29udGVudCBvciByZWxhdGlvbnNoaXBzIHRvIGl0IGZyb20gYW4gZWxlbWVudCBkZWZpbmVkIGluIG9uZSBvZiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbnMuIFRoaXMgY2hlYXQgc2hlZXQgd2Fsa3MgeW91IHRocm91Z2ggdGhlIHN0ZXBzIG9mIGNyZWF0aW5nIHN1Y2ggYSBjb250cmlidXRpb24uICBTZWUgdGhlIG9ubGluZSBoZWxwIHNlY3Rpb24gIlZhcmlhYmlsaXR5IE92ZXJ2aWV3IiBmb3IgYW4gaW50cm9kdWN0aW9uIG9uIHZhcmlhYmlsaXR5IGFuZCBjb250cmlidXRpb25zLjxici8+PGJyLz5Db250cmlidXRpb25zIGNhbiBhbHNvIGJlIGFwcGxpZWQgd2l0aGluIHRoZSBzYW1lIG1ldGhvZCBwbHVnLWluIGJldHdlZW4gZWxlbWVudHMgZnJvbSBkaWZmZXJlbnQgY29udGVudCBwYWNrYWdlcy4gVGhpcyBpcyB1c2VmdWwgaW4gdGhlIGV2ZW50IHlvdSB3YW50IHRvIGJ1aWxkIHVwIHlvdXIgY29udGVudCBlbGVtZW50cyBpbiBsYXllcnMgb2YgY29tcGxleGl0eSBieSBncmFkdWFsbHkgYWRkaW5nIG1vcmUgYW5kIG1vcmUgY29udGVudCB2aWEgY29udHJpYnV0aW9uLiAgVGhlIHJlc3BlY3RpdmUgbGV2ZWxzIG9mIGNvbnRyaWJ1dGlvbiBjYW4gdGhlbiBiZSBzZWxlY3RlZCB3aXRoaW4gbWV0aG9kIGNvbmZpZ3VyYXRpb25zIHRoYXQgYWxsb3cgeW91IHRvIGluY2x1ZGUgb3IgZXhjbHVkZSB0aGUgY29udGVudCBwYWNrYWdlcyB3aXRoIHRoZSBjb250cmlidXRpbmcgZWxlbWVudHMuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCi0JPGl0ZW0KLQkJdGl0bGU9IlBsYW4geW91ciBDb250cmlidXRpb24iCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkJlZm9yZSB5b3UgY2FuIGNyZWF0ZSBhIGNvbnRyaWJ1dGlvbiB0byBhbiBleGlzdGluZyBtZXRob2QgY29udGVudCBlbGVtZW50IHlvdSBuZWVkIHRvIGtub3cgd2hlcmUgdGhpcyBlbGVtZW50IGlzIGxvY2F0ZWQgd2l0aGluIGl0cyBtZXRob2QgcGx1Zy1pbi4gWW91IGFsc28gbmVlZCB0byBkZWNpZGUgd2hlcmUgdG8gY3JlYXRlIGFuZCBwbGFjZSB0aGUgY29udHJpYnV0aW5nIGVsZW1lbnQuIFR5cGljYWxseSwgeW91IGNyZWF0ZSB0aGlzIGVsZW1lbnQgaW4geW91ciBvd24gbWV0aG9kIHBsdWctaW4sIGluIGEgc3BlY2lmaWMgY29udGVudCBwYWNrYWdlLiBGaW5hbGx5LCB5b3UgbmVlZCB0byBrbm93IHdoYXQgaXQgaXMgeW91IGFjdHVhbGx5IHdhbnQgdG8gY29udHJpYnV0ZS4gVGhpcyBjb3VsZCBiZSBhZGRpdGlvbmFsIHRleHQgZm9yIHRoZSBmb3JtIGZpZWxkcywgbmV3IHJlbGF0aW9uc2hpcHMgdG8gb3RoZXIgZWxlbWVudHMsIG9yIG5ldyBjYXRlZ29yaXphdGlvbnMuIChTZWUgdGhlIG9ubGluZSBoZWxwIGZvciBtb3JlIGRldGFpbHMgb24gdGhlc2UgZmllbGRzIGFuZCByZWxhdGlvbnNoaXBzLik8L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiCi0JCXRpdGxlPSJDcmVhdGUgYSBDb250cmlidXRpbmcgQ29udGVudCBFbGVtZW50IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5DcmVhdGUgYSBjb250ZW50IGVsZW1lbnQgaW4geW91ciBtZXRob2QgcGx1Zy1pbiB0aGF0IHByb3ZpZGVzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIGNvbnRlbnQgZWxlbWVudCB0aGF0IHlvdSB3aXNoIHRvIHRhaWxvci4gIEdvIHRvIHRoZSBjaGVhdCBzaGVldCAiQWRkIGEgbmV3IE1ldGhvZCBDb250ZW50IHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzLCBvciBHdWlkYW5jZSIgdG8gYmUgZ3VpZGVkIHRocm91Z2ggdGhlc2Ugc3RlcHMuPGJyLz48YnIvPkFkZCB5b3VyIGNvbnRyaWJ1dGlvbnMgc3VjaCBhcyByZXZpc2VkIHRleHQgZm9yIGZvcm0gZmllbGRzIG9yIGFkZGl0aW9uYWwgcmVsYXRpb25zaGlwcyB0byB5b3VyIG1ldGhvZCBjb250ZW50IGVsZW1lbnQuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29udHJpYnV0ZXMuaHRtbCIgCi0JCXRpdGxlPSJTcGVjaWZ5IHRoZSBDb250cmlidXRpb24gUmVsYXRpb25zaGlwIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5HbyB0byB0aGUgIkNvbnRlbnQgVmFyaWFiaWxpdHkiIHNlY3Rpb24gb2YgdGhlIGVsZW1lbnRzIGRlc2NyaXB0aW9uIHRhYi4gU2VsZWN0ICJDb250cmlidXRlcyIgZnJvbSB0aGUgY29tYm8gYm94LiBDbGljayB0aGUgIlNlbGVjdC4uLiIgYnV0dG9uIG9mIHRoZSBiYXNlIHJvbGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IHRoZSBlbGVtZW50IHRoYXQgeW91IHdhbnQgeW91ciBuZXcgZWxlbWVudCB0byBjb250cmlidXRlIHRvLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwiIAotCQl0aXRsZT0iUmV2aWV3IHlvdXIgQ29udHJpYnV0aW9ucyIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+VG8gcmV2aWV3IHlvdXIgY29udHJpYnV0aW9ucyBzZWxlY3QgKG9yIGNyZWF0ZSBmaXJzdCBhbmQgdGhlbiBzZWxlY3QpIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBjb21ibyBib3ggaW4gdGhlIHRvb2wgYmFyIHRoYXQgY29udGFpbnMgdGhlIHBsdWctaW5zIGFuZCBwYWNrYWdlcyBvZiBib3RoIG9mIHRoZSBlbGVtZW50cyBwYXJ0aWNpcGF0aW5nIGluIHlvdXIgY29udHJpYnV0aW9uLiAgSW4gb3RoZXIgd29yZHMgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGNvbnRhaW4gdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50IGFzIHdlbGwgYXMgdGhlIGJhc2UgZWxlbWVudC48YnIvPjxici8+U3dpdGNoIHRvIHRoZSAiQnJvd3NpbmcgUGVyc3BlY3RpdmUiLiBGaW5kIGFuZCBzZWxlY3QgdGhlIGJhc2UgZWxlbWVudCAoaS5lLiB0aGUgZWxlbWVudCB5b3UgY29udHJpYnV0ZWQgdG8pIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIFRoZSBjb250ZW50IHdpbmRvdyBkaXNwbGF5cyB0aGUgcmVzdWx0cyBvZiB0aGUgY29udHJpYnV0aW9uLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgkKLQk8aXRlbSB0aXRsZT0iRG9uZSI+PGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+PC9pdGVtPgotPC9jaGVhdHNoZWV0PgotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb2RlX21hbmFnZW1lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29kZV9tYW5hZ2VtZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDJiMzJiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb2RlX21hbmFnZW1lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx0b2MgbGFiZWw9IlN1cHBvcnQgZm9yIGNvZGUgbWFuYWdlbWVudCIgbGlua190bz0ibWFpbi54bWwjY29kZV9tYW5hZ2VtZW50X2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iU3VwcG9ydCBmb3IgQ1ZTIiBocmVmPSJodG1sL2hlbHAvY21fY3ZzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU3Vwb3J0IGZvciBSYXRpb25hbCBDbGVhckNhc2UiIGhyZWY9Imh0bWwvaGVscC9jbV9yYXRpb25hbGNjLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU3VwcG9ydCBmb3IgUmF0aW9uYWwgQ0NSQyIgaHJlZj0iaHRtbC9oZWxwL2NtX2NjcmMuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb25jZXB0cy54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb25jZXB0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgxODgxYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29uY2VwdHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJDb25jZXB0cyIgbGlua190bz0ibWFpbi54bWwjY29uY2VwdHNfaWQiPgotICAgPHRvcGljIGxhYmVsPSJPdmVydmlldyBvZiBFUEYgQ29tcG9zZXIiIGhyZWY9Imh0bWwvb3ZlcnZpZXcvcHJvZHVjdF9vdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGF1dGhvcmluZyBvdmVydmlldyIgaHJlZj0iaHRtbC9vdmVydmlldy9tZXRob2RfY29udGVudF9hdXRob3Jpbmdfb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJQcm9jZXNzIGF1dGhvcmluZyBvdmVydmlldyIgaHJlZj0iaHRtbC9vdmVydmlldy9wcm9jZXNzX2F1dGhvcmluZ19vdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb25maWd1cmF0aW9ucyBvdmVydmlldyIgaHJlZj0iaHRtbC9vdmVydmlldy9tZXRob2RfY29uZmlndXJhdGlvbnNfb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJVc2VyIHJvbGVzIGFuZCByb2xlIHNwZWNpZmljIHRhc2tzIiBocmVmPSJodG1sL2hlbHAvdXNlcl9yb2xlcy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL2hlbHAvbWV0aG9kX2NvbnRlbnQuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb250ZXh0c19TZWFyY2gueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29udGV4dHNfU2VhcmNoLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDQ3YjgwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb250ZXh0c19TZWFyY2gueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGNvbnRleHRzPgotCTxjb250ZXh0ICBpZD0ib3Blbl9zZWFyY2hfZGlhbG9nX2FjdGlvbl9jb250ZXh0IiA+Ci0gICAgICAJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+Ci0gCQk8dG9waWMgbGFiZWw9IlNlYXJjaCBmb3IgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9zZWFyY2hmb3JtZXRob2RfY29udGVudC5odG1sIi8+Ci0gICAJPC9jb250ZXh0PgotCi0gICAJPGNvbnRleHQgIGlkPSJmaWxlX3NlYXJjaF9hY3Rpb25fY29udGV4dCIgPgotICAgICAJIDxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPgotIAkJPHRvcGljIGxhYmVsPSJTZWFyY2ggZm9yIG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL2hlbHAvc2VhcmNoZm9ybWV0aG9kX2NvbnRlbnQuaHRtbCIvPgotICAgCTwvY29udGV4dD4KLSAgIAkKLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb250ZXh0c19hdXRob3JpbmdfdWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29udGV4dHNfYXV0aG9yaW5nX3VpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDM5ZjEwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb250ZXh0c19hdXRob3JpbmdfdWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGNvbnRleHRzPiAKLQk8Y29udGV4dCAgaWQ9ImZpbGVfbmV3X2xpYnJhcnlfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbGlicmFyeV9vdmVydmlldy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBsaWJyYXJ5IG92ZXJ2aWV3Ii8+ICAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZmlsZV9uZXdfcGx1Z2luX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9tZXRob2RfcGx1Z2luLmh0bWwiICBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIHBsdWctaW4iLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImZpbGVfbmV3X2NvbmZpZ3VyYXRpb25fY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29uZmlndXJhdGlvbnMgb3ZlcnZpZXciLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImZpbGVfb3Blbl9saWJyYXJ5X2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2xpYnJhcnlfb3ZlcnZpZXcuaHRtbCIgIGxhYmVsPSJNZXRob2QgbGlicmFyeSBvdmVydmlldyIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZmlsZV9vcGVuX2NvbmZpZ3VyYXRpb25fY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29uZmlndXJhdGlvbnMgb3ZlcnZpZXciLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfbmF2aWdhdG9yX3ZpZXdfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+IDwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2xpYnJhcnlfdmlldy5odG1sIiAgbGFiZWw9IkxpYnJhcnkgdmlldyIvPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9hdXRob3JpbmdfcGVyc3BlY3RpdmUuaHRtbCIgIGxhYmVsPSJBdXRob3JpbmcgcGVyc3BlY3RpdmUiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iY29uZmlndXJhdGlvbl92aWV3X2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbmZpZ3VyYXRpb25fdmlldy5odG1sIiAgbGFiZWw9IkNvbmZpZ3VyYXRpb24gdmlldyIvPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9icm93c2luZ3BlcnNwZWN0aXZlLmh0bWwiICBsYWJlbD0iQnJvd3NpbmcgcGVyc3BlY3RpdmUiLz4gCi0JPC9jb250ZXh0PiAKLQkKLQkJCTwhLS0gYmVnaW5uaW5nIG9mIHRoZSBsaWJyYXJ5IG5hdmlnYXRvciBub2RlIHNlbnNpdGl2ZSBGMSBjb250ZXh0IGhlbHBzIC0tPgotCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfbWV0aG9kX3BsdWdpbl9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IG1ldGhvZCBwbHVnLWluIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19jb250ZW50X3BhY2thZ2VfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBDb250ZW50UGFja2FnZSBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfdGFza19jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IG1ldGhvZCBUYXNrIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld193b3JrX3Byb2R1Y3RfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBXb3JrUHJvZHVjdCBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfZ3VpZGFuY2VfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBHdWlkYW5jZSBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfZGlzY2lwbGluZV9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IERpc2NpcGxpbmUgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X2Rpc2NpcGxpbmVfZ3JvdXBpbmdfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBEaXNjaXBsaW5lR3JvdXBpbmcgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X2RvbWFpbl9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IERvbWFpbiBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfcm9sZV9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IFJvbGUgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3dvcmtfcHJvZHVjdF90eXBlX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgV29ya1Byb2R1Y3RUeXBlIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3JvbGVfc2V0X2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgUm9sZVNldCBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkKLQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3Rvb2xfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBtZXRob2QgVG9vbCBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19yb2xlX3NldF9ncm91cGluZ19jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IFJvbGVTZXRHcm91cGluZyBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19jdXN0b21fY2F0ZWdvcnlfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBDdXN0b21DYXRlZ29yeSBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19wcm9jZXNzX2NvbXBvbmVudF9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IFByb2Nlc3NDb21wb25lbnQgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3Byb2Nlc3NfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBQcm9jZXNzIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19tZXRob2RfY29uZmlndXJhdGlvbl9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IE1ldGhvZENvbmZpZ3VyYXRpb24gbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCTwhLS0gZW5kIG9mIHRoZSBsaWJyYXJ5IG5hdmlnYXRvciBub2RlIHNlbnNpdGl2ZSBGMSBjb250ZXh0IGhlbHBzIC0tPgotCQotCQotCTwhLS0gZm9ybSBlZGl0b3Igc2VjdGlvbiBjb250ZXh0IGhlbHAgLS0+Ci0JCi0JPGNvbnRleHQgIGlkPSJwbHVnaW5fZWRpdG9yX2Rlc2NyaXB0aW9uX2FsbF9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj4gPC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX21ldGhvZF9wbHVnaW4uaHRtbCIgIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgcGx1Zy1pbiIvPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tZXRob2RwbHVnaW4uaHRtbCIgIGxhYmVsPSJNZXRob2QgcGx1Zy1pbiIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iY29uZmlndXJhdGlvbl9lZGl0b3JfYWxsX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9tZXRob2RfY29uZmlndXJhdGlvbi5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIi8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbmZpZ3VyYXRpb25zIG92ZXJ2aWV3Ii8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJjb250ZW50X3BhY2thZ2VfZWRpdG9yX2FsbF9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfY29udGVudHBhY2thZ2UuaHRtbCIgIGxhYmVsPSJDcmVhdGluZyBhIGNvbnRlbnQgcGFja2FnZSIvPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tZXRob2Rjb250ZW50cGFja2FnZS5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IHBhY2thZ2UiLz4gCi0JPC9jb250ZXh0PiAKLQkKLQkKLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl9yb2xlX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX3JvbGUuaHRtbCIgIGxhYmVsPSJDcmVhdGUgYSByb2xlIi8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl90YXNrX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX3Rhc2suaHRtbCIgIGxhYmVsPSJDcmVhdGUgYSB0YXNrIi8+ICAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3Jfd29ya19wcm9kdWN0X2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX3dvcmtwcm9kdWN0Lmh0bWwiICBsYWJlbD0iQ3JlYXRlIHdvcmsgcHJvZHVjdCIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfZ3VpZGFuY2VfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfZ3VpZGFuY2UuaHRtbCIgIGxhYmVsPSJDcmVhdGluZyBndWlkYW5jZSIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfZGlzY2lwbGluZV9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2Rpc2NpcGxpbmVfZ3JvdXBpbmdfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIi8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl9kb21haW5fY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIi8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl93b3JrX3Byb2R1Y3RfdHlwZV9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPiA8L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIi8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl9yb2xlX3NldF9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX3JvbHNlX3NldF9ncm91cGluZ19jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX3Rvb2xfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIi8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl9jdXN0b21fY2F0ZWdvcnlfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIi8+IAotCTwvY29udGV4dD4gCi0JCi0JCQk8IS0tIGJlZ2lubmluZyBvZiBzZWN0aW9uIGJhc2VkIEYxIGNvbnRleHQgaGVscCAtLT4KLQkJCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZ2VuZXJhbF9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZ2VuZXJhbF9jb250ZXh0LjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9kZXRhaWxfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2RldGFpbF9jb250ZXh0LjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9ub3RhdGlvbl9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fbm90YXRpb25fY29udGV4dC48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fdGFpbG9yaW5nX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl90YWlsb3JpbmdfY29udGV4dC48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fdmVyc2lvbl9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fdmVyc2lvbl9jb250ZXh0LjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2VsZW1lbnRfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2VsZW1lbnRfY29udGV4dC48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9pY29uX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9pY29uX2NvbnRleHQuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQk8IS0tIGVuZCBvZiBzZWN0aW9uIGJhc2VkIEYxIGNvbnRleHQgaGVscCAtLT4KLQkKLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl9jcF9kZXNjcmlwdGlvbl9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotCQk8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NhcGFiaWxpdHlwYXR0ZXJuLmh0bWwiICBsYWJlbD0iQ2FwYWJpbGl0eSBwYXR0ZXJuIi8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jYXBhYmlsaXR5X3BhdHRlcm4uaHRtbCIgIGxhYmVsPSJDcmVhdGUgYSByZXVzYWJsZSBjYXBhYmlsaXR5IHBhdHRlcm4iLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl9kcF9kZXNjcmlwdGlvbl9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotCQk8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2RlbGl2ZXJ5X3Byb2Nlc3MuaHRtbCIgIGxhYmVsPSJEZWxpdmVyeSBwcm9jZXNzIi8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9kZWxpdmVyeV9wcm9jZXNzLmh0bWwiICBsYWJlbD0iQ3JlYXRlIGEgZGVsaXZlcnkgcHJvY2VzcyIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfcHJvY2Vzc193YnNfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF93YnMuaHRtbCIgIGxhYmVsPSJEZXZlbG9wIGEgd29yayBicmVha2Rvd24gc3RydWN0dXJlIi8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9wcm9jZXNzX29ic19jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3RlYW1fc3RydWN0dXJlLmh0bWwiICBsYWJlbD0iRGV2ZWxvcCBhIHRlYW0gYWxsb2NhdGlvbiBzdHJ1Y3R1cmUiLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX3Byb2Nlc3NfcGJzX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3Bfd29ya3Byb2R1Y3Rfc3RydWN0dXJlLmh0bWwiICBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgcHJvZHVjdCB1c2FnZSBzdHJ1Y3R1cmUiLz4gCi0JPC9jb250ZXh0PiAKLQotCQotCTxjb250ZXh0ICBpZD0iY29uZmlndXJhdGlvbl9wdWJsaXNoX3dpemFyZF9hbGxfcGFnZXNfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvcHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwiICBsYWJlbD0iUHVibGlzaGluZyBvdmVydmlldyIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0icmljaF90ZXh0X2VkaXRvcl9jb250ZXh0X0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9yaWNodGV4dGVkaXRvci5odG1sIiAgbGFiZWw9IlJpY2ggdGV4dCBlZGl0b3IiLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvYWRkX2h5cGVybGluay5odG1sIiAgbGFiZWw9IkFkZGluZyBhIHJlZmVyZW5jZSBvciBoeXBlcmxpbmsiLz4gCi0JPC9jb250ZXh0PiAKLQkKLTwvY29udGV4dHM+IApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRlcmV1c2FibGVtZXRob2Rjb250ZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0ZXJldXNhYmxlbWV0aG9kY29udGVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4ZWVmYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRlcmV1c2FibGVtZXRob2Rjb250ZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iQ3JlYXRlIFJldXNhYmxlIE1ldGhvZCBDb250ZW50IiBsaW5rX3RvPSJtYWluLnhtbCNjcmVhdGVyZXVzYWJsZW1ldGhvZGNvbnRlbnRfaWQiPgotICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGF1dGhvcmluZyBvdmVydmlldyIgaHJlZj0iaHRtbC9oZWxwL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9tZXRob2RfY29udGVudC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9tZXRob2RfY29udGVudC5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgcm9sZSIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9yb2xlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgdGFzayIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV90YXNrLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgd29yayBwcm9kdWN0IiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX3dvcmtwcm9kdWN0Lmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGd1aWRhbmNlIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2d1aWRhbmNlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iVmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eS5odG1sIj4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iQ29udHJpYnV0ZXMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9jb250cmlidXRlcy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkV4dGVuZHMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9leHRlbmRzLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iUmVwbGFjZXMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9yZXBsYWNlLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iVmFyaWFiaWxpdHkgYXNzb2NpYXRpb25zIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfYXNzb2NpYXRpb25zLmh0bWwiLz4KLSAgICAgIDwvdG9waWM+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJCcm93c2UgYW5kIHByZXZpZXcgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9icm93c2VfY29udGVudC5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0aW5nX21ldGhvZF9jb250ZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0aW5nX21ldGhvZF9jb250ZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGRkYzQ4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGluZ19tZXRob2RfY29udGVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHRvYyBsYWJlbD0iQ3JlYXRpbmcgcmV1c2FibGUgbWV0aG9kIGNvbnRlbnQiIGxpbmtfdG89Im1haW4ueG1sI2NyZWF0aW5nX21ldGhvZF9jb250ZW50X2lkIj4gIAotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX2NvbnRlbnQuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHJvbGUiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfcm9sZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHRhc2siIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfdGFzay5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHdvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV93b3JrcHJvZHVjdC5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBndWlkYW5jZSIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9ndWlkYW5jZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBDb250ZW50IFZhcmlhYmlsaXR5IiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHkuaHRtbCI+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkNvbnRyaWJ1dGVzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfY29udHJpYnV0ZXMuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJFeHRlbmRzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfZXh0ZW5kcy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IlJlcGxhY2VzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfcmVwbGFjZS5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkFzc29jaWF0aW9ucyBpbXBhY3RlZCBieSB2YXJpYWJpbGl0eSIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2Fzc29jaWF0aW9ucy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkJyb3dzaW5nIHZhcmlhYmlsaXR5IGFzc29jaWF0aW9ucyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2Jyb3dzaW5nLmh0bWwiLz4KLSAgICAgIDwvdG9waWM+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJCcm93c2UgYW5kIHByZXZpZXcgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9icm93c2VfY29udGVudC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGluZGV4IGVudHJpZXMiIGhyZWY9Imh0bWwvaGVscC9pbmRleGluZy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGdsb3NzYXJ5IGVudHJpZXMiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeV9lbnRyaWVzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ2hhbmdpbmcgY29weXJpZ2h0IG5vdGljZXMiIGhyZWY9Imh0bWwvaGVscC9jaGFuZ2luZ19jb3B5cmlnaHQuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGluZ19wcm9jZXNzZXMueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdfcHJvY2Vzc2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YwZWE5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGluZ19wcm9jZXNzZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJDcmVhdGluZyBwcm9jZXNzZXMiIGxpbmtfdG89Im1haW4ueG1sI2NyZWF0aW5nX3Byb2Nlc3Nlc19pZCI+ICAKLSAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSByZXVzYWJsZSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfY2FwYWJpbGl0eV9wYXR0ZXJuLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBkZWxpdmVyeSBwcm9jZXNzIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2RlbGl2ZXJ5X3Byb2Nlc3MuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3dicy5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHRlYW0gYWxsb2NhdGlvbiBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3RlYW1fc3RydWN0dXJlLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJEZXZlbG9wIGEgd29yayBwcm9kdWN0IHVzYWdlIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3Bfd29ya3Byb2R1Y3Rfc3RydWN0dXJlLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJBcHBseSBhIGNhcGFiaWxpdHkgcGF0dGVybiIgaHJlZj0iaHRtbC9oZWxwL2FwcGx5X2NhcGFiaWxpdHlwYXR0ZXJuLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJQcm9jZXNzIGVsZW1lbnQgcHJvcGVydGllcyB2aWV3IiBocmVmPSJodG1sL2hlbHAvcHJvcGVydGllc192aWV3Lmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJVc2luZyBkZWVwIGNvcHkiIGhyZWY9Imh0bWwvaGVscC91c2luZ19kZWVwX2NvcHkuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IlVzaW5nIGFjdGl2aXR5IHZhcmlhYmlsaXR5IiBocmVmPSJodG1sL2hlbHAvdXNpbmdfYWN0aXZpdHlfdmFyaWFiaWxpdHkuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBwcm9jZXNzIGRpYWdyYW1zIiBocmVmPSJodG1sL2hlbHAvcHJvY2Vzc19kaWFncmFtcy5odG1sIj4KLSAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggYWN0aXZpdHkgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9hY3Rpdml0eV9kaWFncmFtcy5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyIgaHJlZj0iaHRtbC9oZWxwL2FjdGl2aXR5X2RldGFpbF9kaWFncmFtcy5odG1sIi8+Ci0gIDwvdG9waWM+Ci0KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdwcm9jZXNzZXMueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdwcm9jZXNzZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OGZjN2IzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0aW5ncHJvY2Vzc2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iQ3JlYXRpbmcgUHJvY2Vzc2VzIiBsaW5rX3RvPSJtYWluLnhtbCNjcmVhdGluZ3Byb2Nlc3Nlc19pZCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IlByb2Nlc3MgYXV0aG9yaW5nIG92ZXJ2aWV3IiBocmVmPSJodG1sL2hlbHAvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJQcm9jZXNzIiBocmVmPSJodG1sL2hlbHAvcHJvY2Vzcy5odG1sIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSByZXVzYWJsZSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfY2FwYWJpbGl0eV9wYXR0ZXJuLmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJDYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvaGVscC9jYXBhYmlsaXR5cGF0dGVybi5odG1sIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBkZWxpdmVyeSBwcm9jZXNzIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2RlbGl2ZXJ5X3Byb2Nlc3MuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkRlbGl2ZXJ5IHByb2Nlc3MiIGhyZWY9Imh0bWwvaGVscC9kZWxpdmVyeV9wcm9jZXNzLmh0bWwiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3dicy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB0ZWFtIGFsbG9jYXRpb24gc3RydWN0dXJlIiBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF90ZWFtX3N0cnVjdHVyZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB3b3JrIHByb2R1Y3QgdXNhZ2Ugc3RydWN0dXJlIiBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF93b3JrcHJvZHVjdF9zdHJ1Y3R1cmUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJBcHBseSBhIGNhcGFiaWxpdHkgcGF0dGVybiIgaHJlZj0iaHRtbC9oZWxwL2FwcGx5X2NhcGFiaWxpdHlwYXR0ZXJuLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyBlbGVtZW50IHByb3BlcnRpZXMgdmlldyIgaHJlZj0iaHRtbC9oZWxwL3Byb3BlcnRpZXNfdmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBwcm9jZXNzIGRpYWdyYW1zIiBocmVmPSJodG1sL2hlbHAvcHJvY2Vzc19kaWFncmFtcy5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIGFjdGl2aXR5IGRpYWdyYW1zIiBocmVmPSJodG1sL2hlbHAvYWN0aXZpdHlfZGlhZ3JhbXMuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIiBocmVmPSJodG1sL2hlbHAvYWN0aXZpdHlfZGV0YWlsX2RpYWdyYW1zLmh0bWwiLz4KLSAgIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2RvYy56aXAgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9kb2MuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYzFlZmY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2RvYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9nZXR0aW5nc3RhcnRlZC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9nZXR0aW5nc3RhcnRlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4YjE3ZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2V0dGluZ3N0YXJ0ZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJHZXR0aW5nIFN0YXJ0ZWQiIGxpbmtfdG89Im1haW4ueG1sI2dldHRpbmdzdGFydGVkX2lkIj4KLSAgPHRvcGljIGxhYmVsPSJNZXRob2QgbGlicmFyeSBvdmVydmlldyIgaHJlZj0iaHRtbC9oZWxwL2xpYnJhcnlfb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJUb29sIGludGVyZmFjZSIgaHJlZj0iaHRtbC9oZWxwL3VzZXJpbnRlcmZhY2Vfb3ZlcnZpZXcuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkF1dGhvcmluZyBwZXJzcGVjdGl2ZSIgaHJlZj0iaHRtbC9oZWxwL2F1dGhvcmluZ19wZXJzcGVjdGl2ZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkJyb3dzaW5nIHBlcnNwZWN0aXZlIiBocmVmPSJodG1sL2hlbHAvYnJvd3NpbmdfcGVyc3BlY3RpdmUuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDb25maWd1cmF0aW9uIFZpZXciIGhyZWY9Imh0bWwvaGVscC9jb25maWd1cmF0aW9uX3ZpZXcuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJMaWJyYXJ5IHZpZXciIGhyZWY9Imh0bWwvaGVscC9saWJyYXJ5X3ZpZXcuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJCcm93c2UgYW5kIHByZXZpZXcgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9icm93c2VfY29udGVudC5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IlNlYXJjaCBmb3IgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9zZWFyY2hfY29udGVudC5odG1sIi8+Ci0gICA8L3RvcGljPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgcGx1Zy1pbiIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9tZXRob2RfcGx1Z2luLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgY29udGVudCBwYWNrYWdlIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2NvbnRlbnRwYWNrYWdlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX2NvbmZpZ3VyYXRpb24uaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9nbG9zc2FyeS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9nbG9zc2FyeS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhNWI0MjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2xvc3NhcnkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJHbG9zc2FyeSIgbGlua190bz0ibWFpbi54bWwjZ2xvc3NhcnlfaWQiPgotICA8dG9waWMgbGFiZWw9IkFjdGl2aXR5IiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvYWN0aXZpdHkuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkFjdGl2aXR5IHZhcmlhYmlsaXR5IiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvYWN0aXZpdHlfdmFyaWFiaWxpdHkuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJBcnRpZmFjdCIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L2FydGlmYWN0Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDaGVja2xpc3QiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9jaGVja2xpc3QuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDb25jZXB0IiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvY29uY2VwdC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNvbnRyaWJ1dGVzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfY29udHJpYnV0ZXMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEZWxpdmVyYWJsZSIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L2RlbGl2ZXJhYmxlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRGVlcCBjb3B5IiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvZGVlcF9jb3B5Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRGlzY2lwbGluZSIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L2Rpc2NpcGxpbmUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEb21haW4iIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9kb21haW4uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJFc3RpbWF0aW5nIGd1aWRlbGluZSIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L2VzdGltYXRpbmdfZ3VpZGVsaW5lLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRXhhbXBsZSIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L2V4YW1wbGUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJFeHRlbmRzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfZXh0ZW5kcy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ikd1aWRhbmNlIiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvZ3VpZGFuY2UuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJHdWlkZWxpbmUiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9ndWlkZWxpbmUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJJdGVyYXRpb24iIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9pdGVyYXRpb24uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29uZmlndXJhdGlvbiIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L21ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgcGFja2FnZSIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L21ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIHBsdWctaW4iIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9tZXRob2RwbHVnaW4uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNaWxlc3RvbmUiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9taWxlc3RvbmUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJPdXRjb21lIiBocmVmPSJodG1sL2hlbHAvZ2xvc3Nhcnkvb3V0Y29tZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlBlcnNwZWN0aXZlcyIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3BlcnNwZWN0aXZlcy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlBoYXNlIiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvcGhhc2UuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJQcmFjdGljZSIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3ByYWN0aWNlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUHJldmlldyIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3ByZXZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJQcm9jZXNzIiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvcHJvY2Vzcy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlJlcGxhY2VzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfcmVwbGFjZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlJlcG9ydCIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3JlcG9ydC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlJldXNhYmxlIGFzc2V0IiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvcmV1c2FibGVhc3NldC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlJvYWRtYXAiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9yb2FkbWFwLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUm9sZSIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3JvbGUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJSb2xlIHNldCIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3JvbGVzZXQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJSb2xlIHNldCBncm91cGluZyIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3JvbGVzZXRncm91cGluZy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlN0ZXAiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9zdGVwLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU3VwcG9ydGluZyBtYXRlcmlhbCIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3N1cHBvcnRpbmdtYXRlcmlhbC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlN5bmNocm9uaXphdGlvbiIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3N5bmNocm9uaXphdGlvbi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlRhc2siIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS90YXNrLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iVGVtcGxhdGUiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS90ZW1wbGF0ZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlRlcm0gZGVmaW5pdGlvbiIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3Rlcm1kZWZpbml0aW9uLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iVG9vbCBtZW50b3IiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS90b29sbWVudG9yLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iVmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IldoaXRlcGFwZXIiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS93aGl0ZXBhcGVyLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iV29yayBwcm9kdWN0IiBocmVmPSJodG1sL2hlbHAvZ2xvc3Nhcnkvd29ya3Byb2R1Y3QuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJXb3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS93b3JrcHJvZHVjdGRlc2NyaXB0b3JzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iV29yayBwcm9kdWN0IGtpbmQiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS93b3JrcHJvZHVjdGtpbmQuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL0F1dGhvclBlcnNwLkpQRyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvQXV0aG9yUGVyc3AuSlBHCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYTRlNzkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvQXV0aG9yUGVyc3AuSlBHCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hYm91dGVwZmNvbXBvc2VyLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Fib3V0ZXBmY29tcG9zZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGNhNTYyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Fib3V0ZXBmY29tcG9zZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBYm91dCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sI21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCNwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYWJvdXRlcGZjb21wb3NlciIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5BYm91dCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJhYm91dGVwZmNvbXBvc2VyIj48YSBuYW1lPSJhYm91dGVwZmNvbXBvc2VyIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWJvdXQgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvaDE+Ci08ZGl2PjxwPldlbGNvbWUgdG8gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciAoRVBGIENvbXBvc2VyKS4gRVBGIENvbXBvc2VyIGlzIGEgdG9vbCBwbGF0Zm9ybSB0aGF0Ci1lbmFibGVzIHByb2Nlc3MgZW5naW5lZXJzIGFuZCBtYW5hZ2VycyB0byBpbXBsZW1lbnQsIGRlcGxveSwgYW5kIG1haW50YWluCi1wcm9jZXNzZXMgZm9yIG9yZ2FuaXphdGlvbnMgb3IgaW5kaXZpZHVhbCBwcm9qZWN0cy4gVHlwaWNhbGx5LCB0d28ga2V5IHByb2JsZW1zCi1uZWVkIHRvIGJlIGFkZHJlc3NlZCB0byBzdWNjZXNzZnVsbHkgZGVwbG95IG5ldyBwcm9jZXNzZXMuPC9wPgotPHA+Rmlyc3QsIGRldmVsb3BtZW50IHRlYW1zIG5lZWQgdG8gYmUgZWR1Y2F0ZWQgb24gdGhlIG1ldGhvZHMgYXBwbGljYWJsZQotdG8gdGhlIHJvbGVzIHRoYXQgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiBTb2Z0d2FyZSBkZXZlbG9wZXJzIHR5cGljYWxseQotbmVlZCB0byBsZWFybiBob3cgdG8gZG8gYW5hbHlzaXMgYW5kIGRlc2lnbiwgdGVzdGVycyBuZWVkIHRvIGxlYXJuIGhvdyB0bwotdGVzdCBpbXBsZW1lbnRhdGlvbnMgYWdhaW5zdCByZXF1aXJlbWVudHMsIG1hbmFnZXJzIG5lZWQgdG8gbGVhcm4gaG93IHRvIG1hbmFnZQotdGhlIHByb2plY3Qgc2NvcGUgYW5kIGNoYW5nZSwgYW5kIHNvIG9uLiBTb21lIG9yZ2FuaXphdGlvbnMgYXNzdW1lIHRoYXQgZGV2ZWxvcGVycwotaW1wbGljaXRseSBrbm93IGhvdyB0byBkbyBzdWNoIHdvcmsgd2l0aG91dCBkb2N1bWVudGluZyB0aGVpciBtZXRob2RzLCBidXQKLW1hbnkgb3JnYW5pemF0aW9ucyB3YW50IHRvIGVzdGFibGlzaCBjb21tb24gYW5kIHJlZ3VsYXRlZCBwcmFjdGljZXMsIHRvIGRyaXZlCi1zcGVjaWZpYyBpbXByb3ZlbWVudCBvYmplY3RpdmVzLCBhbmQgdG8gbWVldCBjb21wbGlhbmNlIHN0YW5kYXJkcy4gPC9wPgotPHA+U2Vjb25kLCBkZXZlbG9wbWVudCB0ZWFtcyBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRvIGFwcGx5IHRoZXNlIG1ldGhvZHMKLXRocm91Z2hvdXQgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFRoYXQgaXMsIHRoZXkgbmVlZCB0byBkZWZpbmUgb3Igc2VsZWN0Ci1hIGRldmVsb3BtZW50IHByb2Nlc3MuIEZvciBleGFtcGxlLCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCBtZXRob2RzIGhhdmUgdG8KLWJlIGFwcGxpZWQgZGlmZmVyZW50bHkgaW4gZWFybHkgcGhhc2VzIG9mIGEgcHJvamVjdCB3aGVyZSB0aGUgZm9jdXMgaXMgb24KLWVsaWNpdGF0aW9uIG9mIHN0YWtlaG9sZGVyIG5lZWRzIGFuZCByZXF1aXJlbWVudHMgYW5kIHNjb3BpbmcgYSB2aXNpb24sIHRoYW4KLWluIGxhdGVyIHBoYXNlcyB3aGVyZSB0aGUgZm9jdXMgaXMgb24gbWFuYWdpbmcgcmVxdWlyZW1lbnRzIHVwZGF0ZXMgYW5kIGNoYW5nZXMKLWFuZCBwZXJmb3JtaW5nIGltcGFjdCBhbmFseXNpcyBvZiB0aGVzZSByZXF1aXJlbWVudHMgY2hhbmdlcy4gVGVhbXMgYWxzbyBuZWVkCi1jbGVhciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUgZGlmZmVyZW50IHRhc2tzIG9mIHRoZSBtZXRob2RzIHJlbGF0ZSB0byBlYWNoCi1vdGhlciwgZm9yIGV4YW1wbGUsIGhvdyB0aGUgY2hhbmdlIG1hbmFnZW1lbnQgbWV0aG9kIGltcGFjdHMgdGhlIHJlcXVpcmVtZW50cwotbWFuYWdlbWVudCBtZXRob2QgYXMgd2VsbCBhcyByZWdyZXNzaW9uIHRlc3RpbmcgbWV0aG9kIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZS4KLUV2ZW4gc2VsZi1vcmdhbml6aW5nIHRlYW1zIG5lZWQgdG8gZGVmaW5lIGEgcHJvY2VzcyB0aGF0IGdpdmVzIGF0IG1pbmltdW0KLXNvbWUgZ3VpZGFuY2Ugb24gaG93IHRoZSBkZXZlbG9wbWVudCB3aWxsIGJlIHNjb3BlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUsCi13aGVuIG1pbGVzdG9uZXMgd2lsbCBiZSBhY2hpZXZlZCBhbmQgdmVyaWZpZWQsIGFuZCBzbyBvbi4gIDwvcD4KLTxkaXYgY2xhc3M9InAiPlRvIHRoYXQgZW5kLCBFUEYgQ29tcG9zZXIgaGFzIHR3byBtYWluIHB1cnBvc2VzOjx1bD48bGk+VG8gcHJvdmlkZSBhIGtub3dsZWRnZSBiYXNlIG9mIGludGVsbGVjdHVhbCBjYXBpdGFsIHdoaWNoIHlvdSBjYW4gYnJvd3NlLAotbWFuYWdlIGFuZCBkZXBsb3kuIFRoaXMgY29udGVudCBjYW4gaW5jbHVkZSBleHRlcm5hbGx5IGRldmVsb3BlZCBjb250ZW50LAotYW5kLCBtb3JlIGltcG9ydGFudGx5LCBjYW4gaW5jbHVkZSB5b3VyIG93biBjb250ZW50IGluY2x1ZGluZyBvZiB3aGl0ZXBhcGVycywKLWd1aWRlbGluZXMsIHRlbXBsYXRlcywgcHJpbmNpcGxlcywgYmVzdCBwcmFjdGljZXMsIGludGVybmFsIHByb2NlZHVyZXMgYW5kCi1yZWd1bGF0aW9ucywgdHJhaW5pbmcgbWF0ZXJpYWwsIGFuZCBhbnkgb3RoZXIgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgeW91cgotbWV0aG9kcy4gVGhpcyBrbm93bGVkZ2UgYmFzZSBjYW4gdXNlZCBmb3IgcmVmZXJlbmNlIGFuZCBlZHVjYXRpb24uIEl0IGFsc28KLWZvcm1zIHRoZSBiYXNpcyBmb3IgZGV2ZWxvcGluZyBwcm9jZXNzZXMgKHRoZSBzZWNvbmQgcHVycG9zZSkuIEVQRiBDb21wb3NlciBpcyBkZXNpZ25lZAotdG8gYmUgYSBjb250ZW50IG1hbmFnZW1lbnQgc3lzdGVtIHRoYXQgcHJvdmlkZXMgYSBjb21tb24gbWFuYWdlbWVudCBzdHJ1Y3R1cmUKLWFuZCBsb29rIGFuZCBmZWVsIGZvciBhbGwgb2YgeW91ciBjb250ZW50LCByYXRoZXIgdGhhbiBiZWluZyBhIGRvY3VtZW50IG1hbmFnZW1lbnQKLXN5c3RlbSBpbiB3aGljaCB5b3Ugd291bGQgc3RvcmUgYW5kIGFjY2VzcyBoYXJkIHRvIG1haW50YWluIGxlZ2FjeSBkb2N1bWVudHMKLWFsbCBpbiB0aGVpciBvd24gc2hhcGVzIGFuZCBmb3JtYXRzLiBBbGwgY29udGVudCBtYW5hZ2VkIGluIEVQRiBDb21wb3NlciBjYW4gYmUgcHVibGlzaGVkCi10byBodG1sIGFuZCBkZXBsb3llZCB0byBXZWIgc2VydmVycyBmb3IgZGlzdHJpYnV0ZWQgdXNhZ2UuIDwvbGk+Ci08bGk+VG8gcHJvdmlkZSBwcm9jZXNzIGVuZ2luZWVyaW5nIGNhcGFiaWxpdGllcyBieSBzdXBwb3J0aW5nIHByb2Nlc3MgZW5naW5lZXJzCi1hbmQgcHJvamVjdCBtYW5hZ2VycyBpbiBzZWxlY3RpbmcsIHRhaWxvcmluZywgYW5kIHJhcGlkbHkgYXNzZW1ibGluZyBwcm9jZXNzZXMKLWZvciB0aGVpciBjb25jcmV0ZSBkZXZlbG9wbWVudCBwcm9qZWN0cy4gRVBGIENvbXBvc2VyIHByb3ZpZGVzIGNhdGFsb2dzIG9mIHByZS1kZWZpbmVkCi1wcm9jZXNzZXMgZm9yIHR5cGljYWwgcHJvamVjdCBzaXR1YXRpb25zIHRoYXQgY2FuIGJlIGFkYXB0ZWQgdG8gaW5kaXZpZHVhbAotbmVlZHMuIEl0IGFsc28gcHJvdmlkZXMgcHJvY2VzcyBidWlsZGluZyBibG9ja3MsIGNhbGxlZCBjYXBhYmlsaXR5IHBhdHRlcm5zLAotdGhhdCByZXByZXNlbnQgYmVzdCBkZXZlbG9wbWVudCBwcmFjdGljZXMgZm9yIHNwZWNpZmljIGRpc2NpcGxpbmVzLCB0ZWNobm9sb2dpZXMsCi1vciBtYW5hZ2VtZW50IHN0eWxlcy4gVGhlc2UgYnVpbGRpbmcgYmxvY2tzIGZvcm0gYSB0b29sa2l0IGZvciBxdWljayBhc3NlbWJseQotb2YgcHJvY2Vzc2VzIGJhc2VkIG9uIHByb2plY3Qtc3BlY2lmaWMgbmVlZHMuIEVQRiBDb21wb3NlciBhbHNvIGFsbG93cyB5b3UgdG8gc2V0IHVwCi15b3VyIG93biBvcmdhbml6YXRpb24tc3BlY2lmaWMgY2FwYWJpbGl0eSBwYXR0ZXJuIGxpYnJhcmllcy4gRmluYWxseSwgdGhlCi1wcm9jZXNzZXMgY3JlYXRlZCB3aXRoIEVQRiBDb21wb3NlciBjYW4gYmUgcHVibGlzaGVkIGFuZCBkZXBsb3llZCBhcyBXZWIgc2l0ZXMuIDwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgS2V5IENvbmNlcHRzPC9zdHJvbmc+PHVsPjxsaT5Qcm92aWRlcyBjb21wbGV0ZWx5IHJlZGVzaWduZWQgdG9vbHMgZm9yIGF1dGhvcmluZywgY29uZmlndXJpbmcsIHZpZXdpbmcsCi1hbmQgcHVibGlzaGluZyBkZXZlbG9wbWVudCBwcm9jZXNzZXMuIDwvbGk+Ci08bGk+UHJvdmlkZXMganVzdC1pbi10aW1lIGdlbmVyYXRpb24gb2YgcHVibGljYXRpb24gcHJldmlld3MgaW4gZGVkaWNhdGVkCi1icm93c2luZyBwZXJzcGVjdGl2ZSB0aGF0IGFsbG93cyByYXBpZCBjb25maWd1cmF0aW9uIHN3aXRjaGluZy4gPC9saT4KLTxsaT5NYW5hZ2VzIG1ldGhvZCBjb250ZW50IHVzaW5nIHNpbXBsZSBmb3JtLWJhc2VkIHVzZXIgaW50ZXJmYWNlcy4gVGhlcmVmb3JlLAotVU1MIG1vZGVsaW5nIHNraWxscyBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkLiA8L2xpPgotPGxpPlByb3ZpZGVzIGludHVpdGl2ZSByaWNoIHRleHQgZWRpdG9ycyBmb3IgY3JlYXRpbmcgaWxsdXN0cmF0aXZlIGNvbnRlbnQKLWRlc2NyaXB0aW9ucy4gRWRpdG9ycyBhbGxvdyB1c2Ugb2Ygc3R5bGVzLCBpbWFnZXMsIHRhYmxlcywgaHlwZXJsaW5rcywgYW5kCi1kaXJlY3QgSFRNTCBlZGl0aW5nLjwvbGk+Ci08bGk+QWxsb3dzIGNyZWF0aW5nIHByb2Nlc3NlcyB3aXRoIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9ycyBhbmQgd29ya2Zsb3cKLWRpYWdyYW1zIHRocm91Z2ggdXNlIG9mIG11bHRpLXByZXNlbnRhdGlvbiBwcm9jZXNzIGVkaXRvcnMuIEJyZWFrZG93biBzdHJ1Y3R1cmUKLWVkaXRvciBzdXBwb3J0cyBkaWZmZXJlbnQgcHJvY2VzcyB2aWV3czogd29yay1icmVha2Rvd24gdmlldywgd29yayBwcm9kdWN0Ci11c2FnZSB2aWV3LCBhbmQgdGVhbSBhbGxvY2F0aW9uIHZpZXcuIEVQRiBDb21wb3NlciBhdXRvbWF0aWNhbGx5IHN5bmNocm9uaXplcyBhbGwgcHJlc2VudGF0aW9ucwotd2l0aCBwcm9jZXNzIGNoYW5nZXMuIDwvbGk+Ci08bGk+UHJvdmlkZXMgc3VwcG9ydCBmb3IgbWFueSBhbHRlcm5hdGl2ZSBsaWZlY3ljbGUKLW1vZGVscy4gRm9yIGV4YW1wbGUsIHdhdGVyZmFsbCwgaW5jcmVtZW50YWwsIG9yIGl0ZXJhdGl2ZSBtb2RlbHMgY2FuIGJlIGNyZWF0ZWQKLXdpdGggdGhlIHNhbWUgb3ZlcmxhcHBpbmcgbWV0aG9kIGNvbnRlbnQuIDwvbGk+Ci08bGk+SW1wcm92ZWQgcmV1c2UgYW5kIGV4dGVuc2liaWxpdHkgY2FwYWJpbGl0aWVzLiBUaGUgcGx1Zy1pbiBtZWNoYW5pc21zCi1mcm9tIHBhc3QgdmVyc2lvbnMgaGF2ZSBiZWVuIGV4dGVuZGVkIHRvIHN1cHBvcnQgZXh0ZW5zaW9ucyBmb3IgYnJlYWtkb3duCi1zdHJ1Y3R1cmVzLjwvbGk+Ci08bGk+U3VwcG9ydHMgcmV1c2FibGUgZHluYW1pY2FsbHktbGlua2VkIHByb2Nlc3MgcGF0dGVybnMgb2YgYmVzdCBwcmFjdGljZXMKLWZvciByYXBpZCBwcm9jZXNzIGFzc2VtYmx5IHZpYSBkcmFnLWFuZC1kcm9wLiA8L2xpPgotPC91bD4KLTwvZGl2PgotPHA+PHN0cm9uZz5LZXkgVGVybWlub2xvZ3kgYW5kIENvbmNlcHRzPC9zdHJvbmc+PC9wPgotPHA+VG8gZWZmZWN0aXZlbHkgd29yayB3aXRoIEVQRiBDb21wb3NlciwgeW91IG5lZWQgdG8gdW5kZXJzdGFuZCBhIGZldwotY29uY2VwdHMgdGhhdCBhcmUgdXNlZCB0byBvcmdhbml6ZSB0aGUgY29udGVudC4gVGhlIHBhZ2VzIE1ldGhvZCBDb250ZW50IEF1dGhvcmluZwotT3ZlcnZpZXcgYW5kIFByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3IGNvbnRhaW4gbW9yZSBkZXRhaWwgYW5kIGNvbmNyZXRlIGV4YW1wbGVzCi1vZiBob3cgdG8gd29yayBpbiB0aGUgdG9vbC4gVGhpcyBwYWdlIHByb3ZpZGVzIHlvdSB3aXRoIGEgZ2VuZXJhbCBvdmVydmlldwotb2YgdGhlc2UgY29uY2VwdHMuIDwvcD4KLTxwPlRoZSBtb3N0IGZ1bmRhbWVudGFsIHByaW5jaXBsZSBpbiBFUEYgQ29tcG9zZXIgaXMgdGhlIHNlcGFyYXRpb24gb2YgcmV1c2FibGUgY29yZQotbWV0aG9kIGNvbnRlbnQgZnJvbSBpdHMgYXBwbGljYXRpb24gaW4gcHJvY2Vzc2VzLiBUaGlzIGRpcmVjdGx5IHJlbGF0ZXMgYmFjawotdG8gdGhlIHR3byBwdXJwb3NlcyBvZiBFUEYgQ29tcG9zZXIgZGVzY3JpYmVkIGluIHRoZSBmaXJzdCBzZWN0aW9uLiBBbG1vc3QgYWxsIG9mIEVQRiBDb21wb3NlcidzCi1jb25jZXB0cyBhcmUgY2F0ZWdvcml6ZWQgYWxvbmcgdGhpcyBzZXBhcmF0aW9uLiBNZXRob2QgY29udGVudCBkZXNjcmliZXMgd2hhdAotaXMgdG8gYmUgcHJvZHVjZWQsIHRoZSBuZWNlc3Nhcnkgc2tpbGxzIHJlcXVpcmVkIGFuZCB0aGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucwotZGVzY3JpYmluZyBob3cgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkLiBUaGVzZSBtZXRob2QgY29udGVudAotZGVzY3JpcHRpb25zIGFyZSBpbmRlcGVuZGVudCBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gUHJvY2Vzc2VzIGRlc2NyaWJlCi10aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgdGFrZSB0aGUgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgYW5kCi1yZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcwotb2YgcHJvamVjdHMuIDwvcD4KLTxwPjxpbWcgc3JjPSJ1bWFfaHVtcC5naWYiIGFsdD0iIiAvPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgc2hvd3MgaG93IHRoaXMgc2VwYXJhdGlvbiBpcyBkZXBpY3RlZCBpbiBCYXNpYyBVbmlmaWVkCi1Qcm9jZXNzLiBNZXRob2QgY29udGVudCwgZGVzY3JpYmluZyBob3cgZGV2ZWxvcG1lbnQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQsCi1pcyBjYXRlZ29yaXplZCBieSBkaXNjaXBsaW5lcyBhbG9uZyB0aGUgeS1heGlzIG9mIHRoZSBkaWFncmFtLiBUaGUgd29yayBkZXNjcmliZWQKLWluIGEgcHJvY2VzcyBpcyBzZWVuIGFsb25nIHRoZSB4LWF4aXMgcmVwcmVzZW50aW5nIHRoZSB0aW1lbGluZS4gVGhpcyBpcyB0aGUKLWxpZmVjeWNsZSBvZiBhIGRldmVsb3BtZW50IHByb2plY3QuIEl0IGV4cHJlc3NlcyB3aGVuIHdoYXQgd29yayB3aWxsIGJlIHBlcmZvcm1lZC4KLVRoZSBncmFwaCBpbiB0aGUgaWxsdXN0cmF0aW9uIHJlcHJlc2VudHMgYW4gZXN0aW1hdGVkIHdvcmtsb2FkIGZvciBlYWNoIGRpc2NpcGxpbmUuCi1BcyB5b3Ugc2VlLCBmb3IgZXhhbXBsZSwgb25lIG5ldmVyIHN0b3BzIHdvcmtpbmcgb24gcmVxdWlyZW1lbnRzIGluIE9wZW5VUC9CYXNpYywgYnV0Ci10aGVyZSBhcmUgY2VydGFpbmx5IHBlYWsgdGltZXMgaW4gd2hpY2ggbW9zdCBvZiB0aGUgcmVxdWlyZW1lbnRzIGVsaWNpdGF0aW9uCi1hbmQgZGVzY3JpcHRpb24gd29yayBpcyBwZXJmb3JtZWQuIFRoZXJlIGFyZSBhbHNvIHRpbWVzIGF0IHdoaWNoIGEgZG93bndhcmQKLXRyZW5kIG5lZWRzIHRvIGJlIG9ic2VydmVkIHdoZXJlIGZld2VyIGFuZCBmZXdlciByZXF1aXJlbWVudHMgY2hhbmdlcyBoYXZlCi10byBiZSBwcm9jZXNzZWQgdG8gYnJpbmcgdGhlIHByb2plY3QgdG8gYSBjbG9zZS4gVGhpcyBhdm9pZHMgd2hhdCBpcyByZWZlcnJlZAotdG8gYXMgZmVhdHVyZSBjcmVlcCBpbiB3aGljaCByZXF1aXJlbWVudHMgd29yayByZW1haW5zIGNvbnN0YW50IG9yIGV2ZW4gaW5jcmVhc2VzLgotSGVuY2UsIGEgbGlmZWN5Y2xlIChwcm9jZXNzKSBleHByZXNzZXMgdGhlIHZhcmlhbmNlcyBvZiB3b3JrIHBlcmZvcm1lZCBpbgotdGhlIHZhcmlvdXMgZGlzY2lwbGluZXMgKG1ldGhvZCBjb250ZW50KS4gPC9wPgotPHA+PGltZyBzcmM9Im1ldGhfdnNfcHJvYy5naWYiIGFsdD0iIiAvPjwvcD4KLTxwPlRoZSBwaWN0dXJlIGFib3ZlIHByb3ZpZGVzIGEgc3VtbWFyeSBvZiB0aGUga2V5IGVsZW1lbnRzIHVzZWQgaW4gRVBGIENvbXBvc2VyIGFuZAotaG93IHRoZXkgcmVsYXRlIHRvIG1ldGhvZCBjb250ZW50IG9yIHByb2Nlc3MuIEFzIHlvdSBzZWUsIG1ldGhvZCBjb250ZW50IGlzCi1wcmltYXJpbHkgZXhwcmVzc2VkIHVzaW5nIHdvcmsgcHJvZHVjdHMsIHJvbGVzLCB0YXNrcywgYW5kIGd1aWRhbmNlLiBHdWlkYW5jZSwKLXN1Y2ggYXMgY2hlY2tsaXN0cywgZXhhbXBsZXMsIG9yIHJvYWRtYXBzLCBjYW4gYWxzbyBiZSBkZWZpbmVkIHRvIHByb3ZpZGUKLWV4ZW1wbGFyeSB3YWxrdGhyb3VnaHMgb2YgYSBwcm9jZXNzLiBPbiB0aGUgcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBkaWFncmFtLAoteW91IHNlZSB0aGUgZWxlbWVudHMgdXNlZCB0byByZXByZXNlbnQgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3Nlci4gVGhlIG1haW4gZWxlbWVudAotaXMgdGhlIGFjdGl2aXR5IHRoYXQgY2FuIGJlIG5lc3RlZCB0byBkZWZpbmUgYnJlYWtkb3duIHN0cnVjdHVyZXMgYXMgd2VsbAotYXMgcmVsYXRlZCB0byBlYWNoIG90aGVyIHRvIGRlZmluZSBhIGZsb3cgb2Ygd29yay4gQWN0aXZpdGllcyBhbHNvIGNvbnRhaW4KLWRlc2NyaXB0b3JzIHRoYXQgcmVmZXJlbmNlIG1ldGhvZCBjb250ZW50LiBBY3Rpdml0aWVzIGFyZSB1c2VkIHRvIGRlZmluZSBwcm9jZXNzZXMKLW9mIHdoaWNoIEVQRiBDb21wb3NlciBzdXBwb3J0IHR3byBtYWluIGtpbmRzOiBkZWxpdmVyeSBwcm9jZXNzZXMgYW5kIGNhcGFiaWxpdHkgcGF0dGVybnMuCi1EZWxpdmVyeSBwcm9jZXNzZXMgcmVwcmVzZW50IGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgcHJvY2VzcyB0ZW1wbGF0ZSBmb3IKLXBlcmZvcm1pbmcgb25lIHNwZWNpZmljIHR5cGUgb2YgcHJvamVjdC4gVGhleSBkZXNjcmliZSBhIGNvbXBsZXRlIGVuZC10by1lbmQKLXByb2plY3QgbGlmZWN5Y2xlIGFuZCBhcmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIKLWNoYXJhY3RlcmlzdGljcy4gQ2FwYWJpbGl0eSBwYXR0ZXJucyBhcmUgcHJvY2Vzc2VzIHRoYXQgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUKLXByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBkaXNjaXBsaW5lIG9yIGEgYmVzdAotcHJhY3RpY2UuIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgZGVsaXZlcnkgcHJvY2Vzc2VzCi1vciBsYXJnZXIgY2FwYWJpbGl0eSBwYXR0ZXJucy4gVGhpcyBlbnN1cmVzIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uCi1vZiB0aGVpciBrZXkgYmVzdCBwcmFjdGljZXMgaW4gcHJvY2VzcyBhdXRob3JpbmcgYWN0aXZpdGllcyBpbiBFUEYgQ29tcG9zZXIuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCNtZXRob2RhdXRob3JpbmdvdmVydmlldyI+TWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCNwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWN0aXZpdHkuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWN0aXZpdHkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTg1MjE0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FjdGl2aXR5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBY3Rpdml0eSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImFjdGl2aXR5IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkFjdGl2aXR5PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJhY3Rpdml0eSI+PGEgbmFtZT0iYWN0aXZpdHkiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BY3Rpdml0eTwvaDE+Ci08ZGl2PjxwPkFjdGl2aXRpZXMgcmVwcmVzZW50IHRoZSBrZXkgYnVpbGRpbmcgYmxvY2tzIGZvciBwcm9jZXNzZXMuIEFjdGl2aXRpZXMKLXJlcHJlc2VudCBhIGdyb3VwaW5nIG9mIGJyZWFrZG93biBlbGVtZW50cyBzdWNoIGFzIG90aGVyIGFjdGl2aXRpZXMsIHRhc2sKLWRlc2NyaXB0b3JzLCByb2xlIGRlc2NyaXB0b3JzLCA8YSBocmVmPSJ3b3JrcHJvZHVjdGRlc2NyaXB0b3JzLmh0bWwjd29ya3Byb2R1Y3RkZXNjcmlwdG9ycyI+d29yayBwcm9kdWN0IGRlc2NyaXB0b3JzPC9hPiwgYW5kIDxhIGhyZWY9Im1pbGVzdG9uZS5odG1sI21pbGVzdG9uZSI+bWlsZXN0b25lczwvYT4uIEluIGFkZGl0aW9uIHRvIGJyZWFrZG93biBzdHJ1Y3R1cmVzLCBhY3Rpdml0aWVzCi1jYW4gYWxzbyBiZSBwcmVzZW50ZWQgaW4gYWN0aXZpdHkgZGlhZ3JhbXMgdGhhdCBncmFwaGljYWxseSBzaG93IHRoZSBmbG93Ci1vZiB3b3JrIGJ5IHNob3dpbmcgd2hpY2ggYWN0aXZpdGllcyBwcmVjZWRlIG90aGVyIGFjdGl2aXRpZXMuIDxhIGhyZWY9InBoYXNlLmh0bWwjcGhhc2UiPlBoYXNlPC9hPiBhbmQgPGEgaHJlZj0iaXRlcmF0aW9uLmh0bWwjaXRlcmF0aW9uIj5pdGVyYXRpb248L2E+IGFyZQotc3BlY2lhbCB0eXBlcyBvZiBhY3Rpdml0aWVzIHRoYXQgZGVmaW5lIHNwZWNpZmljIHByb3BlcnRpZXMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZGFyZWZlcmVuY2Vvcmh5cGVybGluay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDEyNTAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGQgYSBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImFkZGFyZWZlcmVuY2Vvcmh5cGVybGluayIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5BZGQgYSBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08ZGl2IGNsYXNzPSJuZXN0ZWQwIiBpZD0iYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rIj48YSBuYW1lPSJhZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsiPjwhLS0gLS0+PC9hPjxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZCBhIFJlZmVyZW5jZSBvciBIeXBlcmxpbms8L2gxPgotPGRpdj48cD5Zb3UgY2FuIGFkZCB0d28gdHlwZXMgb2YgcmVmZXJlbmNlcyBvciBoeXBlcmxpbmtzIHRvIHlvdXIgY29udGVudCB0ZXh0OgotcmVmZXJlbmNlcyAgdG8gb3RoZXIgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IG9yIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwKLXRleHQgd2l0aCBhIFVSTCB0aGF0IHJlc2lkZXMgb3V0c2lkZSB0aGUgbWV0aG9kIGxpYnJhcnkuPC9wPgotPHA+VGV4dCBmaWVsZHMgdGhhdCBzdXBwb3J0IGh5cGVybGlua3MgaGF2ZSBhIHR3aXN0eSBzeW1ib2wgPGltZyBzcmM9InR3aXN0eSBzeW1ib2wxLkpQRyIgYWx0PSIiIC8+IG5leHQgdG8gdGhlIHRleHQgZmllbGQncyBsYWJlbC4gQ2xpY2sgdGhlIHN5bWJvbCB0byBleHBhbmQKLXRoZSBmaWVsZCBpbnRvIGEgZnVsbCB0ZXh0IGVkaXRvci4gPC9wPgotPHA+VG8gaW5zZXJ0IGEgaHlwZXJsaW5rIHRvIGFub3RoZXIgZWxlbWVudCBpbiB0aGUgbWV0aG9kIGxpYnJhcnkgaW50byBhIHRleHQKLWZpZWxkLCBsb2NhdGUgdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gY3JlYXRlIGEgbGluayB0byBpbiB0aGUgbGlicmFyeSBvciBjb25maWd1cmF0aW9uCi12aWV3IGFuZCB0aGVuIGRyYWcgaXQgaW50byB0aGUgYXBwcm9wcmlhdGUgdGV4dCBmaWVsZCwgVGhlIGxpbmsgdG8gdGhlIGVsZW1lbnQKLWlzIGFkZGVkIGFzIGEgbWV0aG9kIGVsZW1lbnQgd2l0aCB0eXBlIHByZWZpeCwgbWVhbmluZyB0aGF0IHRoZSBtZXRob2QgZWxlbWVudAotbmFtZSBpcyBwcmVmaXhlZCB3aXRoIHRoZSBtZXRob2QgZWxlbWVudCB0eXBlLiBZb3UgY2FuIGFsc28gZHJhZyBhIG1ldGhvZAotZWxlbWVudCBpbnRvIGFuIHVuZXhwYW5kZWQgdGV4dCBmaWVsZCB0aGF0IHN1cHBvcnRzIGh5cGVybGlua3Mgd2l0aCB0aGUgc2FtZQotcmVzdWx0LjwvcD4KLTxkaXYgY2xhc3M9InAiPllvdSBjYW4gdXNlIHRoZSBBZGQgTGluayBmdW5jdGlvbiBpbiB0aGUgcmljaCB0ZXh0IGVkaXRvciB0byBhZGQgbGlua3MKLXRoYXQgYXJlIHJlZmVyZW5jZXMgdG8gb3RoZXIgbWV0aG9kIGVsZW1lbnRzIG9yIGxpbmtzIHRvIGZpbGVzIG9yIFdlYiBwYWdlcy4KLVRoaXMgZ2l2ZXMgeW91IGZ1cnRoZXIgb3B0aW9ucyBpbiBob3cgeW91ciBsaW5rcyBhcmUgZGlzcGxheWVkLjxvbD48bGk+SW4gdGhlIHRleHQgZWRpdG9yLCBwb3NpdGlvbiB0aGUgY3Vyc29yIHdoZXJlIHlvdSB3YW50IHRvIGluc2VydCB0aGUgbGluawotYW5kIHRoZW4gY2xpY2sgdGhlIDxzdHJvbmc+QWRkIExpbms8L3N0cm9uZz4gYnV0dG9uIDxpbWcgc3JjPSJhZGRsaW5rX2NvLmdpZiIgYWx0PSIiIC8+IGluIHRoZSB0b29sIGJhci4gVGhlIEFkZCBMaW5rIGRpYWxvZyBvcGVucy48L2xpPgotPGxpPkNsaWNrIHRoZSA8c3Ryb25nPkJyb3dzZTwvc3Ryb25nPiBidXR0b24gdG8gbG9jYXRlIGFuZCBzZWxlY3QgdGhlIGVsZW1lbnQgeW91IHdpc2gKLXRvIGNyZWF0ZSBhIGxpbmsgdG8uIFRoZXJlIGFyZSBzZXZlcmFsIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGxpbmtzIHRvIG90aGVyCi1jb250ZW50IGVsZW1lbnRzLCB3aXRoIGVhY2ggb3B0aW9uIG9mZmVyaW5nIGEgZGlmZmVyZW50IHdheSBmb3IgZGlzcGxheWluZwotdGhlIGxpbmsncyBuYW1lOjx1bD48bGk+TWV0aG9kIGVsZW1lbnQ6IHRoZSBsaW5rIGRpc3BsYXlzIHRoZSBlbGVtZW50IG5hbWUuPC9saT4KLTxsaT5NZXRob2Qgd2l0aCB0eXBlIHByZWZpeDogdGhlIGxpbmsgZGlzcGxheXMgdGhlIGVsZW1lbnQgbmFtZSBhbmQgdHlwZS48L2xpPgotPGxpPk1ldGhvZCBlbGVtZW50IHdpdGggY3VzdG9tIHRleHQ6IHRoZSBsaW5rIGRpc3BsYXlzIHVzZXIgZGVmaW5lZCB0ZXh0LgotVG8gZGVmaW5lIHRoaXMgdGV4dCBtYW5pcHVsYXRlIHRoZSB0ZXh0IGluIGJldHdlZW4gdGhlICZsdDthJmd0OyZsdDsvYSZsdDsKLXRhZ3MgaW4gdGhlIFVSTCB0ZXh0IGZpZWxkIG9uZSB5b3UgaGF2ZSBzZWxlY3RlZCBhbiBlbGVtZW50IHVzaW5nIHRoZSA8c3Ryb25nPkJyb3dzZTwvc3Ryb25nPiBidXR0b24uPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPlRvIGluc2VydCBhIGh5cGVybGluayB0byBhbiBleHRlcm5hbCBVUkwsIHNlbGVjdCBVUkwgZnJvbSB0aGUgVHlwZSBkcm9wCi1kb3duIGxpc3QsIHR5cGUgdGhlIFVSTCBkZXRhaWxzIGluIHRoZSBVUkwgZmllbGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uPC9saT4KLTxsaT5UbyBpbnNlcnQgYSBoeXBlcmxpbmsgdG8gYSBmaWxlLCBpbiB0aGUgVHlwZSBkcm9wIGRvd24gbGlzdCwgY2xpY2sgPHN0cm9uZz5GaWxlPC9zdHJvbmc+LAotZW50ZXIgdGhlIGZpbGUgbmFtZSBvciBicm93c2UgdG8gZmluZCB0aGUgZmlsZSwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4KLUVhY2ggdGltZSB5b3UgYWRkIGEgbGluayB5b3UgY2FuIGNob29zZSB0byBoYXZlIHRoZSB0YXJnZXQgb3BlbiBpbiB0aGUgc2FtZQotYnJvd3NlciB3aW5kb3cgb3IgaW4gYSBuZXcgd2luZG93LjwvbGk+Ci08L29sPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIj5SaWNoIFRleHQgRWRpdG9yPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRpbWdfY28uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRpbWdfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlY2JkNzIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkaW1nX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkbGlua19jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZGxpbmtfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MWEzODZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkbGlua19jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZG9yZGxpc3RfY28uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRvcmRsaXN0X2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTcxZDY3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZG9yZGxpc3RfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGR0YWJsZV9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZHRhYmxlX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjUzNmRkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZHRhYmxlX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkdW5vcmRsaXN0X2NvLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkdW5vcmRsaXN0X2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzA3NDllNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZHVub3JkbGlzdF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjNzM2OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3MuaHRtbCNwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImFwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJhcHBseWFjYXBhYmlsaXR5cGF0dGVybiI+PGEgbmFtZT0iYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybjwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPldoZW4gZGV2ZWxvcGluZyBhIHByb2Nlc3MsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZGV2ZWxvcCB0aGUgcHJvY2VzcwotZnJvbSBzY3JhdGNoLCBhZGRpbmcgZGVzY3JpcHRvcnMgb25lIGJ5IG9uZS4gWW91IGNhbiByZXVzZSBleGlzdGluZyBjYXBhYmlsaXR5Ci1wYXR0ZXJucyBvciBldmVuIGNhcGFiaWxpdHkgcGF0dGVybiBwYXJ0cyB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MKLWNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGZvciB3aGljaCBpdCBpcyBhcHBsaWVkLiBBIGNhcGFiaWxpdHkKLXBhdHRlcm4gbXVzdCBiZSBhcHBsaWVkIHRvIG9uZSBzcGVjaWZpYyBhY3Rpdml0eSBpbiBhIHByb2Nlc3MuIEZvciBtb3JlIGluZm9ybWF0aW9uCi1zZWUgPGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPi48L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRoZXJlIGFyZSB0d28gd2F5cyB0byBhcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybjogQ29weSBhbmQgRXh0ZW5kLiA8cD48c3Ryb25nPkNvcHkKLWEgY2FwYWJpbGl0eSBwYXR0ZXJuOjwvc3Ryb25nPjwvcD4KLTxkaXYgY2xhc3M9InAiPklmIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGNvcGllZCBpbnRvIGEgcHJvY2VzcywKLW1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGluIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gYXJlIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZQotb3JpZ2luYWwuIFRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gZWxlbWVudHMgY2FuIGJlIGFsdGVyZWQsIGRlbGV0ZWQgb3IgY2hhbmdlZAotYXMgeW91IHdhbnQgaW4gdGhlIHByb2Nlc3MgZWRpdG9yIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvcmlnaW5hbCBtZXRob2QgY29udGVudAotZWxlbWVudHMuIE1ldGhvZCBlbGVtZW50cyBpbiBhIGNvcGllZCBjYXBhYmlsaXR5IHBhdHRlcm4gYXBwZWFyIGluIHJlZ3VsYXIKLWJsYWNrIGZvbnQuIFRvIGNvcHkgYSBjYXBhYmlsaXR5IHBhdHRlcm46PG9sPjxsaT5JbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPiwKLXNlbGVjdCBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBpdHMgcGFydHMgdGhhdCB5b3Ugd2FudCB0byBjb3B5IGludG8gYW4gYWN0aXZpdHkKLWluIGEgcHJvY2VzcyBhbmQgZHJhZyB0aGUgcGF0dGVybiBvciBwYXJ0cyBpbnRvIHRoZSBhY3Rpdml0eSB0byB3aGljaCB5b3UKLXdhbnQgaXQgdG8gYXBwbHkuIFRvIHNlbGVjdCBtdWx0aXBsZSBhY3Rpdml0aWVzIGluIGEgY2FwYWJpbGl0eSBwYXR0ZXJuLCBwcmVzcwotdGhlIENUUkwgb3IgU0hJRlQga2V5cyB3aGlsZSB5b3Ugc2VsZWN0LiA8L2xpPgotPGxpPkluIHRoZSBwb3AtdXAgYm94IHRoYXQgYXBwZWFycywgY2xpY2sgPHN0cm9uZz5Db3B5PC9zdHJvbmc+LiBUaGUgY2FwYWJpbGl0eSBwYXR0ZXJuCi1uYW1lIGlzIGRpc3BsYXllZCBpbiBibGFjayBhbmQgaXMgbm93IGF2YWlsYWJsZSBmb3IgeW91IHRvIGVkaXQuPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPk9yLDxvbD48bGk+SW4gdGhlIHByb2Nlc3MgdmlldywgcmlnaHQgY2xpY2sgYW4gYWN0aXZpdHksIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+QXBwbHkKLVBhdHRlcm4gJmd0OyBDb3B5PC9zdHJvbmc+LiBUaGUgU2VsZWN0IERpYWxvZyBGb3IgUHJvY2Vzc2VzIHdpbmRvdyBhcHBlYXJzLjwvbGk+Ci08bGk+RHJpbGwgZG93biBpbnRvIHRoZSBwcm9jZXNzIHRyZWUgdW50aWwgeW91IGxvY2F0ZSB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuCi15b3Ugd2FudCB0byBjb3B5LjwvbGk+Ci08bGk+U2VsZWN0IHRoZSBwYXR0ZXJuLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUaGUgU2VsZWN0IERpYWxvZyBGb3IgUHJvY2Vzc2VzCi13aW5kb3cgY2xvc2VzIGFuZCB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGFwcGxpZWQuPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxwPjxzdHJvbmc+RXh0ZW5kIGEgY2FwYWJpbGl0eSBwYXR0ZXJuOjwvc3Ryb25nPjwvcD4KLTxkaXYgY2xhc3M9InAiPklmIGEgY2FwYWJpbGl0eSBwYXR0ZXJuCi1pcyBleHRlbmRlZCBpbnRvIGEgcHJvY2VzcywgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybgotcmV0YWluIGEgY29ubmVjdGlvbiB0byB0aGUgb3JpZ2luYWwuIEV4dGVuZGVkIGNhcGFiaWxpdHkgcGF0dGVybiBlbGVtZW50cwotY2Fubm90IGJlIGRlbGV0ZWQgb3IgbW9kaWZpZWQgYW5kIGFwcGVhciBhcyByZWFkLW9ubHkgaW4gYSBncmVlbi1pdGFsaWMgZm9udC4KLVRvIGV4dGVuZCBhIGNhcGFiaWxpdHkgcGF0dGVybjogPG9sPjxsaT5JbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPiwKLXNlbGVjdCBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBpdHMgcGFydHMgdGhhdCB5b3Ugd2FudCB0byBleHRlbmQgaW50byBhbiBhY3Rpdml0eQotaW4gYSBwcm9jZXNzIGFuZCBkcmFnIHRoZSBwYXR0ZXJuIG9yIHBhcnRzIGludG8gdGhlIGFjdGl2aXR5IHRvIHdoaWNoIHlvdQotd2FudCBpdCB0byBhcHBseS4gVG8gc2VsZWN0IG11bHRpcGxlIGFjdGl2aXRpZXMgaW4gYSBjYXBhYmlsaXR5IHBhdHRlcm4sIHByZXNzCi10aGUgQ1RSTCBvciBTSElGVCBrZXlzIHdoaWxlIHlvdSBzZWxlY3QuPC9saT4KLTxsaT5JbiB0aGUgcG9wLXVwIGJveCB0aGF0IGFwcGVhcnMsIGNsaWNrIDxzdHJvbmc+RXh0ZW5kPC9zdHJvbmc+LiBUaGUgY2FwYWJpbGl0eSBwYXR0ZXJuCi1uYW1lIGlzIGRpc3BsYXllZCBpbiBncmVlbiwgd2hpY2ggaW5kaWNhdGVzIGl0IGlzIHBhcnQgb2YgYSBwcm9jZXNzIGRlZmluZWQKLWVsc2V3aGVyZS48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+T3IsIDxvbD48bGk+SW4gdGhlIHByb2Nlc3MgdmlldywgcmlnaHQgY2xpY2sgYW4gYWN0aXZpdHkgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5BcHBseQotUGF0dGVybiAmZ3Q7IEV4dGVuZDwvc3Ryb25nPi4gVGhlIFNlbGVjdCBEaWFsb2cgRm9yIFByb2Nlc3NlcyB3aW5kb3cgYXBwZWFycy48L2xpPgotPGxpPkRyaWxsIGRvd24gaW50byB0aGUgcHJvY2VzcyB0cmVlIHVudGlsIHlvdSBsb2NhdGUgdGhlIGNhcGFiaWxpdHkgcGF0dGVybgoteW91IHdhbnQgdG8gZXh0ZW5kLjwvbGk+Ci08bGk+U2VsZWN0IHRoZSBwYXR0ZXJuLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUaGUgU2VsZWN0IERpYWxvZyBGb3IgUHJvY2Vzc2VzCi13aW5kb3cgY2xvc2VzIGFuZCB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGFwcGxpZWQuPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPjxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBJZiB5b3UgZG8gbm90IHdhbnQgYSBzcGVjaWZpYyBhY3Rpdml0eSBvciB0YXNrIGluIHRoZSBjYXBhYmlsaXR5Ci1wYXR0ZXJuIHRvIGJlIGluY2x1ZGVkIGluIHlvdXIgcHJvY2VzcyB5b3UgY2FuIHN1cHByZXNzIGl0LiBUaGUgYWN0aXZpdHkgb3IKLXRhc2sgd2lsbCBub3QgYXBwZWFyIGluIHRoZSBwdWJsaXNoZWQgcHJvY2VzcyBvciBiZSBleHBvcnRlZCB0byBhIHByb2plY3QKLXBsYW5uaW5nIHRvb2wuIFRvIHN1cHByZXNzIGEgcHJvY2VzcyBlbGVtZW50LCByaWdodCBjbGljayB0aGUgZWxlbWVudCBhbmQKLXRoZW4gc2VsZWN0IDxzdHJvbmc+U3VwcHJlc3M8L3N0cm9uZz4uIFRoZSBlbGVtZW50IGFwcGVhcnMgZ3JheWVkIG91dCBpbiB0aGUgcHJvY2Vzcwotdmlldy48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJwIj5UbyBhZGQgZWxlbWVudHMgdG8gYW4gYWN0aXZpdHkgaW4gYW4gZXh0ZW5kZWQgY2FwYWJpbGl0eSBwYXR0ZXJuOjxvbD48bGk+RmluZCB0aGUgYWN0aXZpdHkncyBwYXJlbnQgZWxlbWVudC4gSWYgdGhpcyBlbGVtZW50IGlzIGEgbm90IGEgbG9jYWwgZWxlbWVudAotdGhhdCBhcHBlYXJzIGluIGdyZWVuIGl0YWxpYyBmb250LCB0aGVuIHlvdSBuZWVkIGNyZWF0ZSBhIGNvbnRyaWJ1dGlvbiB0bwotdGhpcyBwYXJlbnQgZmlyc3QuICBJZiB0aGUgcGFyZW50J3MgcGFyZW50IGlzIG5vdCBsb2NhbCwgYWxzbyBhcHBlYXJpbmcgaW4KLWdyZWVuIGl0YWxpYyBmb250LCB0aGVuIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIGNvbnRyaWJ1dGlvbiB0byB0aGUgcGFyZW50IGZpcnN0LAotYW5kIHNvIG9uLiA8L2xpPgotPGxpPlRvIGNyZWF0ZSBhIGNvbnRyaWJ1dGlvbiB0byBhbiBleHRlbmRlZCBhY3Rpdml0eSwgcmlnaHQgY2xpY2sgdGhlIGV4dGVuZGVkCi1hY3Rpdml0eSBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkNvbnRyaWJ1dGU8L3N0cm9uZz4uIFRoZSBhY3Rpdml0eSBiZWNvbWVzIGxvY2FsIGFuZAotYXBwZWFycyBpbiBhIHN0YW5kYXJkIGJsYWNrIGZvbnQuIERvIHRoaXMgd2l0aCBhbGwgcGFyZW50IGVsZW1lbnRzLCB0b3AtZG93biwKLXVudGlsIHlvdSByZWFjaCB0aGUgYWN0aXZpdHkgdG8gd2hpY2ggeW91IHdhbnQgdG8gYXBwbHkgdGhlIGVsZW1lbnQuIE9uY2UKLXlvdSBjbGljayBDb250cmlidXRlLCB0aGUgYWN0aXZpdHkgYmVjb21lcyBsb2NhbCBhbmQgaXMgcHJlc2VudGVkIGluIHN0YW5kYXJkCi1ibGFjayBmb250LjwvbGk+Ci08L29sPgotRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9ImNvbnRyaWJ1dGVzLmh0bWwjY29udHJpYnV0ZXMiPkNvbnRyaWJ1dGVzPC9hPi48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiPlJlcGxhY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJwcm9jZXNzLmh0bWwjcHJvY2VzcyI+UHJvY2VzczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIj5DcmVhdGUgYSBSZXVzYWJsZSBDYXBhYmlsaXR5IFBhdHRlcm48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hcnRpZmFjdC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hcnRpZmFjdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZmU1ZmM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXJ0aWZhY3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFydGlmYWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRlbGl2ZXJhYmxlLmh0bWwjZGVsaXZlcmFibGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im91dGNvbWUuaHRtbCNvdXRjb21lIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImFydGlmYWN0IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkFydGlmYWN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJhcnRpZmFjdCI+PGEgbmFtZT0iYXJ0aWZhY3QiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BcnRpZmFjdDwvaDE+Ci08ZGl2PjxwPkFuIGFydGlmYWN0IGlzIGEgdGFuZ2libGUgd29yayBwcm9kdWN0IHRoYXQgaXMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZAotYnkgdGFza3MuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbAotYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuIDwvcD4KLTxwPlJvbGVzIHVzZSBhcnRpZmFjdHMgdG8gcGVyZm9ybSB0YXNrcyBhbmQgdG8gcHJvZHVjZSBvdGhlciBhcnRpZmFjdHMuIEVhY2gKLWFydGlmYWN0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSByb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeQotdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbgotcHJvZHVjZWQgaW4gYSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9ubHkKLW9uZSByb2xlIGlzIHJlc3BvbnNpYmxlIGZvciBhbiBhcnRpZmFjdCwgb3RoZXIgcm9sZXMgbWF5IHVzZSB0aGUgYXJ0aWZhY3RzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZGVsaXZlcmFibGUuaHRtbCNkZWxpdmVyYWJsZSI+RGVsaXZlcmFibGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Im91dGNvbWUuaHRtbCNvdXRjb21lIj5PdXRjb21lPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGM2NGE2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2F1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBdXRob3JpbmcgUGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJhdXRob3JpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImF1dGhvcmluZ3BlcnNwZWN0aXZlIj48YSBuYW1lPSJhdXRob3JpbmdwZXJzcGVjdGl2ZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvaDE+Ci08ZGl2PjxwPlRoZSBBdXRob3JpbmcgUGVyc3BlY3RpdmUgcHJvdmlkZXMgdmlld3MgYW5kIGZ1bmN0aW9ucyB0byBuYXZpZ2F0ZSBhbmQKLWF1dGhvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiBZb3UgbXVzdCBiZSBpbiB0aGUgQXV0aG9yaW5nIFBlcnNwZWN0aXZlCi10byBjcmVhdGUgb3IgbW9kaWZ5IGFueSBlbGVtZW50IHR5cGVzLjwvcD4KLTxwPkNsaWNrIHRoZSBPcGVuIFBlcnNwZWN0aXZlIGJ1dHRvbiA8aW1nIHNyYz0ib3BlbnBlcnNwLkpQRyIgYWx0PSIiIC8+IGFuZCBzZWxlY3QgQXV0aG9yaW5nIHRvIG9wZW4gdGhlIEF1dGhvcmluZyBQZXJzcGVjdGl2ZS4gPC9wPgotPHA+PGltZyBzcmM9IkF1dGhvclBlcnNwLkpQRyIgYWx0PSIiIC8+PC9wPgotPHA+VGhlIEF1dGhvcmluZyBQZXJzcGVjdGl2ZSBjb250YWlucyB0d28gVmlld3M6IHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+IGFuZCB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPi4gRG91YmxlIGNsaWNrIGFueSBlbGVtZW50IGluIHRoZQotTGlicmFyeSBWaWV3IG9yIENvbmZpZ3VyYXRpb24gVmlldyB0byBvcGVuIHRoZSBFZGl0b3Igd2luZG93IG9uIHRoZSByaWdodC4KLVRoZSBFZGl0b3Igd2luZG93IGNvbnRhaW5zIHNldmVyYWwgdGFicyB0aHJvdWdoIHdoaWNoIHlvdSBjYW4gZWRpdCBpbmZvcm1hdGlvbgotYWJvdXQgdGhlIGVsZW1lbnQgeW91IGhhdmUgc2VsZWN0ZWQuPC9wPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTxkaXYgY2xhc3M9Im5leHRsaW5rIj48c3Ryb25nPk5leHQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ib2xkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYm9sZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwYzQ2ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ib2xkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzNjYzAxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJCcm93c2UgYW5kIFByZXZpZXcgTWV0aG9kIENvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkJyb3dzZSBhbmQgUHJldmlldyBNZXRob2QgQ29udGVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQiPjxhIG5hbWU9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QnJvd3NlIGFuZCBQcmV2aWV3IE1ldGhvZCBDb250ZW50PC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+WW91IGNhbiBicm93c2UgbWV0aG9kIGNvbnRlbnQgaW4gYm90aCB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPiBhbmQgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+LiBXaGlsZSBhdXRob3JpbmcgbWV0aG9kIGNvbnRlbnQsIHlvdSBjYW4gc2VlIGEgcHJldmlldwotb2YgdGhlIHB1Ymxpc2hlZCBwYWdlIGZvciB0aGUgY29udGVudCB5b3UgYXJlIGVkaXRpbmcgYnkgc2VsZWN0aW5nIHRoZSA8c3Ryb25nPlByZXZpZXc8L3N0cm9uZz4gdGFiCi1hdCB0aGUgYm90dG9tIG9mIHRoZSBjb250ZW50IGVkaXRvci4gQ2xpY2sgYW55IGxpbmsgaW4gdGhlIGRpc3BsYXllZCBwYWdlCi10byBnbyB0byB0aGF0IHBhZ2UuIFVzZSB0aGUgYnV0dG9ucyBpbiB0aGUgZWRpdG9yIHRvb2xiYXIgdG8gcGVyZm9ybSBmYW1pbGlhcgotYnJvd3NlciBhY3Rpb25zIHN1Y2ggYXMgYmFjayBvciByZWZyZXNoLiBXaGlsZSBicm93c2luZyBtZXRob2QgY29udGVudCBpbgotdGhlIGJyb3dzaW5nIHBlcnNwZWN0aXZlIHlvdSBjYW4gc2VlIGEgcHJldmlldyBvZiBhbnkgbWV0aG9kIGFuZCBwcm9jZXNzIGNvbnRlbnQKLWluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYXMgaXQgYXBwZWFycyBpbiBhIHB1Ymxpc2hlZCBXZWIgc2l0ZS4gPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBicm93c2UgYW5kIHByZXZpZXcgPGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+IGluIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+OjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIE9wZW4gUGVyc3BlY3RpdmUgYnV0dG9uIDxpbWcgc3JjPSJvcGVucGVyc3AuSlBHIiBhbHQ9IiIgLz4gYW5kIHNlbGVjdCA8c3Ryb25nPkF1dGhvcmluZzwvc3Ryb25nPi4gVGhlIEF1dGhvcmluZyBwZXJzcGVjdGl2ZQotb3BlbnMgd2l0aCB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiBhbmQgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPiBvbgotdGhlIGxlZnQgYW5kIHRoZSBjb250ZW50IHZpZXcgb24gdGhlIHJpZ2h0LiBJZiBhIG1ldGhvZCBlbGVtZW50IGlzIHNlbGVjdGVkLAotdGhlIGFwcHJvcHJpYXRlIGVkaXRvciBpcyBvcGVuIG9uIHRoZSByaWdodC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RXhwbG9yZSB0aGUgY29udGVudHMgaW4gdGhlIGJvdGggdGhlIExpYnJhcnkgVmlldyBhbmQgQ29uZmlndXJhdGlvbgotVmlldyBieSBleHBhbmRpbmcgdGhlIGRpZmZlcmVudCBjb250ZW50IHBhY2thZ2VzIGFuZCBtZXRob2QgcGx1Zy1pbnMgZG93bgotdG8gdGhlaXIgbWV0aG9kIGVsZW1lbnRzLiBEb3VibGUgY2xpY2sgYW4gZWxlbWVudCB0byBvcGVuIGl0IGluIHRoZSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPlByZXZpZXc8L3N0cm9uZz4gdGFiIGF0IHRoZSBib3R0b20gb2YgdGhlIGNvbnRlbnQgZWRpdG9yCi10byBwcmV2aWV3IHRoZSBjb250ZW50IG9mIGFueSBzZWxlY3RlZCBlbGVtZW50Ljwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoZSBwcmV2aWV3Ci1wYWdlIGluIHRoZSBjb250ZW50IGVkaXRvciBkb2VzIG5vdCByZXNvbHZlIGNvbnRlbnQgdmFyaWFiaWxpdHkgcmVsYXRpb25zaGlwcy4KLUlmIHlvdSBhcmUgZXh0ZW5kaW5nLCBjb250cmlidXRpbmcgdG8sIG9yIHJlcGxhY2luZyBhIGJhc2UgY29udGVudCBpdGVtLCB5b3UKLWNhbiBvbmx5IHNlZSB0aGUgcmVzdWx0IG9mIHRoaXMgaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldyBpbiB0aGUgQnJvd3NpbmcKLVBlcnNwZWN0aXZlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSI+VmFyaWFiaWxpdHk8L2E+LjwvZGl2PgotPHA+PC9wPgotPC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBicm93c2UgYW5kIHByZXZpZXc8YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT4gaW4gdGhlIDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPjo8L3A+Ci08b2w+PGxpPkNsaWNrIHRoZSBPcGVuIFBlcnNwZWN0aXZlIGJ1dHRvbiA8aW1nIHNyYz0ib3BlbnBlcnNwLkpQRyIgYWx0PSIiIC8+IGFuZCBzZWxlY3QgPHN0cm9uZz5Ccm93c2luZzwvc3Ryb25nPi4gVGhlIDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPiBvcGVucyB3aXRoIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+IG9uIHRoZSBsZWZ0IGFuZCB0aGUgQ29udGVudCBWaWV3IG9uIHRoZSByaWdodC48cD48L3A+Ci08L2xpPgotPGxpPlNlbGVjdCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZHJvcC1kb3duIGxpc3QgaW4KLXRoZSB0b29sIGJhci4gVGhlIGNvbnRlbnQgb2YgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGFwcGVhcnMgaW4gdGhlIGNvbnRlbnQKLXZpZXcsIGFzIGl0IHdpbGwgYXBwZWFyIGluIGEgcHVibGlzaGVkIFdlYiBzaXRlLjxwPjwvcD4KLTwvbGk+Ci08bGk+RXhwbG9yZSBhbmQgcHJldmlldyB0aGUgY29udGVudCBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IGJ5IGV4cGFuZGluZwotdGhlIGNhdGVnb3JpZXMgYW5kIG90aGVyIGZvbGRlcnMgZG93biB0byBtZXRob2QgZWxlbWVudHMuIENsaWNrIGEgbWV0aG9kIGVsZW1lbnQKLXRvIG9wZW4gaXQgaW4gdGhlIGNvbnRlbnQgdmlldy48L2xpPgotPC9vbD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlcGVyc3AuSlBHIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2VwZXJzcC5KUEcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmNjkxZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2VwZXJzcC5KUEcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNjFmZTQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQnJvd3NpbmcgUGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYnJvd2luZ3BlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJicm93aW5ncGVyc3BlY3RpdmUiPjxhIG5hbWU9ImJyb3dpbmdwZXJzcGVjdGl2ZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9oMT4KLTxkaXY+PHA+VGhlIEJyb3dzaW5nIFBlcnNwZWN0aXZlIGFsbG93cyB5b3UgdG8gcHJldmlldyBhbmQgbmF2aWdhdGUgdGhyb3VnaCBhIE1ldGhvZAotQ29uZmlndXJhdGlvbiB3aXRob3V0IG1ha2luZyBhbnkgY2hhbmdlcy48L3A+Ci08cD5DbGljayB0aGUgT3BlbiBQZXJzcGVjdGl2ZSBidXR0b24gPGltZyBzcmM9Im9wZW5wZXJzcC5KUEciIGFsdD0iIiAvPiBhbmQgc2VsZWN0IDxzdHJvbmc+QnJvd3Npbmc8L3N0cm9uZz4gdG8gb3BlbiB0aGUgQnJvd3NpbmcgUGVyc3BlY3RpdmUuPC9wPgotPHA+PGltZyBzcmM9ImJyb3dzZXBlcnNwLkpQRyIgYWx0PSIiIC8+PC9wPgotPHA+VGhlIEJyb3dzaW5nIHBlcnNwZWN0aXZlIGNvbnRhaW5zIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LCB3aGljaCBzaG93cyB0aGUgY29udGVudCBpbiB0aGUgY3VycmVudGx5Ci1zZWxlY3RlZCBjb25maWd1cmF0aW9uLiBDbGljayBhbnkgZWxlbWVudCBpbiB0aGUgQ29uZmlndXJhdGlvbgotVmlldyB0byBwcmV2aWV3IHRoZSBlbGVtZW50IGluIHRoZSBDb250ZW50IFZpZXcgYXMgaXQgd2lsbCBhcHBlYXIgaW4gYSBwdWJsaXNoZWQKLVdlYiBzaXRlLiBUaGUgQ29udGVudCBWaWV3IHByb3ZpZGVzIGJyb3dzZXItbGlrZSBuYXZpZ2F0aW9uIGZlYXR1cmVzLiBDbGljawotYW55IGxpbmsgaW4gdGhlIGRpc3BsYXllZCBwYWdlIHRvIGdvIHRvIHRoYXQgcGFnZS4gVXNlIHRoZSBidXR0b25zIGluIHRoZQotQ29udGVudCBWaWV3IHRvb2xiYXIgdG8gcGVyZm9ybSBmYW1pbGlhciBicm93c2VyIGFjdGlvbnMgc3VjaCBhcyBiYWNrIG9yIHJlZnJlc2guPC9wPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTxkaXYgY2xhc3M9InByZXZpb3VzbGluayI+PHN0cm9uZz5QcmV2aW91cyB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0ibmV4dGxpbmsiPjxzdHJvbmc+TmV4dCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NhcGFiaWxpdHlwYXR0ZXJuLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NhcGFiaWxpdHlwYXR0ZXJuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlmZTU2YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jYXBhYmlsaXR5cGF0dGVybi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ2FwYWJpbGl0eSBQYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJhcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sI2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJhY3Rpdml0eS5odG1sI2FjdGl2aXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkaXNjaXBsaW5lLmh0bWwjZGlzY2lwbGluZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGVsaXZlcnlwcm9jZXNzLmh0bWwjZGVsaXZlcnlwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNhcGFiaWxpdHkgUGF0dGVybjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2FwYWJpbGl0eXBhdHRlcm4iPjxhIG5hbWU9ImNhcGFiaWxpdHlwYXR0ZXJuIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9oMT4KLTxkaXY+PHA+QSBDYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBzcGVjaWFsIHByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyCi1vZiBhY3Rpdml0aWVzIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiBDYXBhYmlsaXR5IHBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlCi1wcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgZGlzY2lwbGluZSBhbmQgY2FuCi1iZSBkaXJlY3RseSB1c2VkIGJ5IGEgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuIENhcGFiaWxpdHkgcGF0dGVybnMKLWFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IHByb2Nlc3NlcyBvciBsYXJnZXIKLWNhcGFiaWxpdHkgcGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMKLXRoZXkgZXhwcmVzcy48L3A+Ci08cD5FeGFtcGxlcyBvZiBhIGNhcGFiaWxpdHkgcGF0dGVybiBjb3VsZCBiZSAidXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzCi1tYW5hZ2VtZW50IiwgInVzZSBjYXNlIGFuYWx5c2lzIiwgb3IgInVuaXQgdGVzdGluZyIuIFR5cGljYWxseSwgYnV0IG5vdCBuZWNlc3NhcmlseSwKLWNhcGFiaWxpdHkgcGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duCi1vZiByZXVzYWJsZSBjb21wbGV4IGFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIHJvbGVzIHdoaWNoIHBlcmZvcm0gdGFza3MKLXdpdGhpbiB0aGVzZSBhY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kCi1wcm9kdWNlZC4gQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYwotcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuIEluCi1vdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUKLWluIGEgZGVsaXZlcnkgcHJvY2Vzcy4gdGhlcmVieSBlbmFibGluZyBpdHMgYWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZAotdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgZGVsaXZlcnkgcHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZwotYXBwbGllZC48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJhY3Rpdml0eS5odG1sI2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZGlzY2lwbGluZS5odG1sI2Rpc2NpcGxpbmUiPkRpc2NpcGxpbmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2RlbGl2ZXJ5cHJvY2VzcyI+RGVsaXZlcnkgUHJvY2VzczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJhcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sI2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuIj5BcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NoZWNrbGlzdC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jaGVja2xpc3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA3OGFkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NoZWNrbGlzdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ2hlY2tsaXN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNoZWNrbGlzdCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DaGVja2xpc3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNoZWNrbGlzdCI+PGEgbmFtZT0iY2hlY2tsaXN0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q2hlY2tsaXN0PC9oMT4KLTxkaXY+PHA+QSBDaGVja2xpc3QgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZgotaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpZmllZC4gQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbgotcmV2aWV3cyBzdWNoIGFzIGEgd2Fsay10aHJvdWdocyBvciBpbnNwZWN0aW9ucy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NsZWFyY29udGVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NsZWFyY29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVhMzVmNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jbGVhcmNvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb2xsYXBzZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb2xsYXBzZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZTg3NzU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29sbGFwc2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uY2VwdC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25jZXB0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxOTgyYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25jZXB0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q29uY2VwdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY29uY2VwdCI+PGEgbmFtZT0iY29uY2VwdCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNvbmNlcHQ8L2gxPgotPGRpdj48cD5BIENvbmNlcHQgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQKLXdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MKLW1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBndWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXZlcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IKLXRhc2tzIG9yIGFjdGl2aXRpZXMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25mLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlNWU2YjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25mLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnNhbmRwdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnNhbmRwdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2ZlMTFkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb25zYW5kcHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDb25maWd1cmF0aW9ucyBhbmQgUHVibGlzaGluZyBPdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJQdXQgeW91ciBzaG9ydCBkZXNjcmlwdGlvbiBoZXJlOyB1c2VkIGZvciBmaXJzdCBwYXJhZ3JhcGggYW5kIGFic3RyYWN0LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJQdXQgeW91ciBzaG9ydCBkZXNjcmlwdGlvbiBoZXJlOyB1c2VkIGZvciBmaXJzdCBwYXJhZ3JhcGggYW5kIGFic3RyYWN0LiIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjb25maWd1cmF0aW9uc2FuZHB1Ymxpc2hpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Db25maWd1cmF0aW9ucyBhbmQgUHVibGlzaGluZyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY29uZmlndXJhdGlvbnNhbmRwdWJsaXNoaW5nb3ZlcnZpZXciPgotPGgzPk1ldGhvZCBDb25maWd1cmF0aW9ucyBPdmVydmlldzwvaDM+Ci08cD5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIHNoaXBzIHdpdGggYSBsb3Qgb2YgY29udGVudCBvdXQgb2YgdGhlIGJveC4gSXQgaW5jbHVkZXMKLSAgdGhlIE9wZW5VUCBmcmFtZXdvcmsgYW5kIHZhcmlvdXMgcGx1Zy1pbnMgZXh0ZW5kaW5nCi0gIE9wZW5VUC9CYXNpYyB3aXRoIGRvbWFpbi1zcGVjaWZpYyBhZGRpdGlvbnMuIE5vIG9yZ2FuaXphdGlvbiBvciBwcm9qZWN0IHJlcXVpcmVzIGFsbCBvZiB0aGlzCi0gIGRvY3VtZW50YXRpb24gYWxsIGF0IG9uY2UsIGJ1dCB3b3VsZCB3b3JrIHdpdGggYSBzZWxlY3Rpb24gb2Ygc3BlY2lmaWMgc3Vic2V0cy48L3A+Ci08cD4gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciAoRVBGIENvbXBvc2VyKSBtYW5hZ2VzIGZvciB0aGF0IHB1cnBvc2Ugc28tY2FsbGVkIG1ldGhvZAotICBjb25maWd1cmF0aW9ucywgd2hpY2ggYWxsb3cgeW91IHRvIHNwZWNpZnkgd29ya2luZyBzZXRzIG9mIGNvbnRlbnQgYW5kIHByb2Nlc3NlcwotICBmb3IgYSBzcGVjaWZpYyBjb250ZXh0LCBzdWNoIGFzIGEgc3BlY2lmaWMgdmFyaWFudCBvZiB0aGUgT3BlblVQIGZyYW1ld29yayB0aGF0Ci0gIHlvdSB3YW50IHRvIHB1Ymxpc2ggYW5kIGRlcGxveSBmb3IgYSBnaXZlbiBzb2Z0d2FyZSBwcm9qZWN0IG9yIGFzIGEgZm91bmRhdGlvbgotICBmb3IgYSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24uIEFsbCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyIGFyZSBvcmdhbml6ZWQKLSAgaW4gbWV0aG9kIHBsdWctaW5zLCB3aGljaCBhcmUgb3JnYW5pemVkIGludG8gbWV0aG9kIHBhY2thZ2VzLiBBIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gIGlzIHNpbXBseSBhIHNlbGVjdGlvbiBvZiB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcy48L3A+Ci08cD48aW1nIHNyYz0iY29uZi5naWYiIHdpZHRoPSI2NjUiPjwvcD4KLTxwPllvdSBjcmVhdGUgYW5kIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvciBkZXBpY3RlZAotICBpbiB0aGUgZmlndXJlIGFib3ZlLiBZb3UgY291bGQgc3RhcnQgY3JlYXRpbmcgeW91ciBvd24gbWV0aG9kIGNvbmZpZ3VyYXRpb24KLSAgYnkgY29weWluZyBvbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgc2hpcCB3aXRoIEVQRiBDb21wb3NlciBhbmQgbW9kaWZ5IGl0IHRvIGZpdAotICB5b3VyIHNwZWNpZmljIG5lZWRzLiBZb3UgY2FuIGFkZCBvciByZW1vdmUgd2hvbGUgbWV0aG9kIHBsdWctaW5zIGFzIHdlbGwgYXMKLSAgbWFrZSBzZWxlY3Rpb24gd2l0aCBlYWNoIHBsdWctaW4gYnkgY2hlY2tpbmcgb3IgdW4tY2hlY2tpbmcgcGFja2FnZXMuIDwvcD4KLTxwPiBZb3UgY2FuIHVzZSB0aGUgcmVzdWx0aW5nIGNvbmZpZ3VyYXRpb24gYXMgeW91ciB3b3JraW5nIHNldCBmb3IgeW91ciBFUEYgQ29tcG9zZXIKLSAgd29yay4gVGhlIGFjdHVhbCBjb250ZW50IG9mIHRoZSBjb25maWd1cmF0aW9uLCBpLmUuIHRoZSBpbmNsdWRlZCBtZXRob2QgY29udGVudAotICBhbmQgcHJvY2VzcyBlbGVtZW50cyBhcmUgYWx3YXlzIGFjY2Vzc2libGUgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4gVXNlIHRoZQotICBjb21ibyBib3ggaW4gdGhlIHRvb2xiYXIgdG8gc2VsZWN0IHRoZSBjdXJyZW50bHkgdXNlZCBtZXRob2QgY29uZmlndXJhdGlvbi48L3A+Ci08aDM+UHVibGlzaGluZyBPdmVydmlldzwvaDM+Ci08cD5NZXRob2QgY29uZmlndXJhdGlvbnMgYXJlIHRoZSBiYXNpcyBmb3IgcHVibGlzaGluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLgotICBBIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGlzIGFuIGh0bWwgV2ViIHNpdGUgdGhhdCBwcmVzZW50cyBhbGwgdGhlIG1ldGhvZAotICBjb250ZW50IGFuZCBwcm9jZXNzZXMgb2YgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIGEgbmF2aWdhYmxlIGFuZCBzZWFyY2hhYmxlCi0gIHdheS4gSXQgdXNlcyB0aGUgcmVsYXRpb25zaGlwcyBlc3RhYmxpc2hlZCBkdXJpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3MKLSAgYXV0aG9yaW5nIHRvIGdlbmVyYXRlIGh5cGVybGlua3MgYmV0d2VlbiBlbGVtZW50cyBhcyB3ZWxsIGFzIHByb3ZpZGVzIHRyZWUKLSAgYnJvd3NlcnMgYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBhbmQgdXNlci1kZWZpbmVkIGNhdGVnb3JpemF0aW9ucyBvZgotICB0aGUgY29udGVudC4gVGhlIGZpZ3VyZSBiZWxvdyBzaG93cyBhbiBleGFtcGxlIG9mIHRoZSBwdWJsaXNoZWQgJ0NsYXNzaWMgUlVQJwotICBtZXRob2QgY29uZmlndXJhdGlvbi48L3A+Ci08cD48aW1nIHNyYz0icHViLmdpZiIgd2lkdGg9IjU1MCI+PC9wPgotPHA+Rm9yIHB1Ymxpc2hpbmcgc2ltcGx5IGNyZWF0ZSBhbmQgc2VsZWN0IGEgY29uZmlndXJhdGlvbi4gVGhlIHB1YmxpY2F0aW9uIHdpemFyZAotICB3aWxsIGRvIHRoZSByZXN0IGZvciB5b3UgYW5kIG9ubHkgcHVibGlzaCBjb250ZW50IHRoYXQgaXMgcGFydCBvZiB0aGUgbWV0aG9kCi0gIGNvbmZpZ3VyYXRpb24uIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IGFkb3B0IGNvbnRlbnQgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLSAgc3VjaCBhcyByZW1vdmluZwotICByZWZlcmVuY2VzIG9mIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIHRvIGVsZW1lbnRzIG91dHNpZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLSAgb3IgcmVtb3ZpbmcgYWN0aXZpdGllcyBmcm9tIHlvdXIgcHJvY2Vzc2VzIHRoYXQgb25seSBjb250YWluIHdvcmsgZGVmaW5lZCBvdXRzaWRlCi0gIG9mIHRoZSBjb25maWd1cmF0aW9uIHNldC4gSGVuY2UsIHB1Ymxpc2hpbmcgd2lsbCBvbmx5IGluY2x1ZGUgdGhlIGNvbnRlbnQgdGhhdAotICB5b3UgcmVhbGx5IG5lZWQuIFlvdSBjYW4gYWx3YXlzIHByZXZpZXcgYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiB1c2luZyBFUEYgQ29tcG9zZXIncwotYnJvd3NpbmcgcGVyc3BlY3RpdmUuPC9wPgotPHA+Jm5ic3A7PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9udmlldy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9udmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMjYxOTJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNvbmZpZ3VyYXRpb24gVmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJsaWJyYXJ5dmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNvbmZpZ3VyYXRpb252aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNvbmZpZ3VyYXRpb24gVmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY29uZmlndXJhdGlvbnZpZXciPjxhIG5hbWU9ImNvbmZpZ3VyYXRpb252aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q29uZmlndXJhdGlvbiBWaWV3PC9oMT4KLTxkaXY+PHA+VGhlIENvbmZpZ3VyYXRpb24gdmlldyBzaG93cyB0aGUgY29udGVudCBlbGVtZW50cyBpbiBhIGxpYnJhcnkgZmlsdGVyZWQKLWJ5IGEgY29uZmlndXJhdGlvbi4gPC9wPgotPHA+QSBjb25maWd1cmF0aW9uIGlzIGEgc3Vic2V0IG9mIHRoZSA8YSBocmVmPSJzdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldy5odG1sI3N0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Ij5tZXRob2QgbGlicmFyeTwvYT4gY29udGVudC4gT25jZSBhIGNvbmZpZ3VyYXRpb24gaXMgc2VsZWN0ZWQKLWluIHRoZSBDb25maWd1cmF0aW9uIHNlbGVjdGlvbiBib3gsIHRoZSBDb25maWd1cmF0aW9uIHZpZXcgaXMgcmVmcmVzaGVkIHdpdGgKLXRoZSBjb250ZW50IGZyb20gdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uIFRoZSBjb250ZW50IGluIHRoZSBDb25maWd1cmF0aW9uCi12aWV3IGlzIGFsd2F5cyBwcmVzZW50ZWQgaW4gdGhlIHNhbWUgd2F5IGluIHN0YW5kYXJkIGNhdGVnb3JpZXMsIHByb2Nlc3NlcywKLWN1c3RvbSBjYXRlZ29yaWVzLCBhbmQgZ3VpZGFuY2UuIFRoZSBDb25maWd1cmF0aW9uIHZpZXcgZG9lcyBub3Qgc2hvdyBhbnkKLXBoeXNpY2FsIGZvbGRlcnMuIEZvbGRlcnMgYXJlIG9ubHkgc2hvd24gaW4gdGhlIExpYnJhcnkgdmlldy48L3A+Ci08cD48L3A+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0icHJldmlvdXNsaW5rIj48c3Ryb25nPlByZXZpb3VzIHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0ibmV4dGxpbmsiPjxzdHJvbmc+TmV4dCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCI+TGlicmFyeSBWaWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb250cmlidXRlcy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb250cmlidXRlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YzQxYmI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29udHJpYnV0ZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNvbnRyaWJ1dGVzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJleHRlbmRzLmh0bWwjZXh0ZW5kcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icmVwbGFjZS5odG1sI3JlcGxhY2VzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNvbnRyaWJ1dGVzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNvbnRyaWJ1dGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjb250cmlidXRlcyI+PGEgbmFtZT0iY29udHJpYnV0ZXMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Db250cmlidXRlczwvaDE+Ci08ZGl2PjxwPkEgY29udHJpYnV0aW5nIGVsZW1lbnQgYWRkcyB0byB0aGUgYmFzZSBlbGVtZW50LiBDb250cmlidXRlcyBwcm92aWRlcyBhCi13YXkgZm9yIGVsZW1lbnRzIHRvIGNvbnRyaWJ1dGUgdGhlaXIgcHJvcGVydGllcyBpbnRvIHRoZWlyIGJhc2UgZWxlbWVudCB3aXRob3V0Ci1kaXJlY3RseSBjaGFuZ2luZyBhbnkgb2YgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMsIHN1Y2ggYXMgaW4gYW4gYWRkaXRpdmUgZmFzaGlvbi4KLVRoZSBlZmZlY3QsIGFmdGVyIGNvbnRyaWJ1dGlvbiwgaXMgdGhhdCB0aGUgYmFzZSBlbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZAotd2l0aCBhbiBlbGVtZW50IHRoYXQgY29tYmluZXMgdGhlIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9ucyBvZiB0aGUgY29udHJpYnV0aW5nCi1lbGVtZW50IHdpdGggdGhlIGJhc2UgZWxlbWVudC48L3A+Ci08cD5Vc2UgdGhlIENvbnRlbnQgVmFyaWFiaWxpdHkgc2VjdGlvbiBvbiB0aGUgRGVzY3JpcHRpb24gdGFiIHRvIG1ha2UgYW4gZWxlbWVudAotY29udHJpYnV0ZSB0byBhbm90aGVyIGVsZW1lbnQuIFNlbGVjdCA8c3Ryb25nPkNvbnRyaWJ1dGVzPC9zdHJvbmc+IGFzIHRoZSBWYXJpYWJpbGl0eQotdHlwZSBhbmQgdGhlbiBzZWxlY3QgdGhlIGJhc2UgZWxlbWVudCB0byB3aGljaCB0aGlzIGVsZW1lbnQgd2lsbCBjb250cmlidXRlLgotVGhlIGJhc2UgZWxlbWVudCBtdXN0IGJlIHRoZSBzYW1lIHR5cGUgb2YgZWxlbWVudCBhcyB0aGUgY29udHJpYnV0aW5nIGVsZW1lbnQuPC9wPgotPHA+QW55IGluZm9ybWF0aW9uIHlvdSBlbnRlciBpbiB0aGUgY29udHJpYnV0aW5nIGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhlIGJhc2UKLWVsZW1lbnQuIFRleHQgZmllbGRzIGluIHRoZSBjb250cmlidXRpbmcgZWxlbWVudCBhcmUgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUKLXJlc3BlY3RpdmUgdGV4dCBmaWVsZHMgaW4gdGhlIGJhc2UgZWxlbWVudC48L3A+Ci08cD5Db250cmlidXRpb24gb25seSBhZGRzIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9ucyB0byB0aGUgYmFzZS4gSXQgbmV2ZXIKLW92ZXJyaWRlcyBvciByZXBsYWNlcyBhbnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFzZS4gSW4gb3RoZXIgd29yZHMsIGlmIHRoZQotYmFzZSBpcyBhbGxvd2VkIGFuIGFzc29jaWF0aW9uIHRvIGV4YWN0bHkgb25lIG90aGVyIGVsZW1lbnQgYW5kIGhhcyB0aGlzIG9uZQotYWxyZWFkeSBkZWZpbmVkLCBpdCBpcyBub3QgYmVpbmcgcmVwbGFjZWQgYnkgYSBjb250cmlidXRvcidzIGFzc29jaWF0aW9uLjwvcD4KLTxkaXYgY2xhc3M9InAiPjxzdHJvbmc+Q29udHJpYnV0aW9uIHJ1bGVzOjwvc3Ryb25nPjx1bD48bGk+QXR0cmlidXRlcyBhcmUgYXBwZW5kZWQgZXhjZXB0IGZvciBpZGVudGlmeWluZy9uYW1pbmcgYXR0cmlidXRlcyBhbmQgbm9uLXN0cmluZwotYXR0cmlidXRlcyBzdWNoIGFzIGJvb2xlYW4sIGRhdGUsIGV0Yy48L2xpPgotPGxpPk91dGdvaW5nIHRvLW9uZSBhc3NvY2lhdGlvbnMgb2YgdGhlIGNvbnRyaWJ1dG9yIGFyZSBpZ25vcmVkIGlmIHRoZSBiYXNlCi1hbHJlYWR5IGhhcyBzdWNoIGFuIGFzc29jaWF0aW9uIG9yIGlmIHRoZSBiYXNlIGVsZW1lbnQgaGFzIG1vcmUgdGhhbiBvbmUgY29udHJpYnV0aW5nCi1lbGVtZW50IChpLmUuIGl0IGNhbm5vdCBiZSBkZWNpZGVkIHdoaWNoIGNvbnRyaWJ1dGlvbiBzaG91bGQgYmUgY2hvc2UsIHRoZW4KLW5vbmUgd2lsbCBiZSBjaG9zZW4pLjwvbGk+Ci08bGk+T3V0Z29pbmcgdG8tbWFueSBhc3NvY2lhdGlvbnMgYXJlIGFkZGVkIHRvIHRoZSBiYXNlIGVsZW1lbnRzIG9mIGEgY29udHJpYnV0aW9uLjwvbGk+Ci08bGk+SW5jb21pbmcgYXNzb2NpYXRpb25zIHRvIHRoZSBjb250cmlidXRpbmcgZWxlbWVudCB3aXRoIGEgdG8tb25lIGNvbnN0cmFpbnQKLW9uIHRoZSBvdGhlciBhc3NvY2lhdGlvbiBlbmQgYXJlIGlnbm9yZWQgaWYgdGhlIGJhc2UgYWxyZWFkeSBoYXMgc3VjaCBhbiBpbmNvbWluZwotYXNzb2NpYXRpb24gb3IgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBjb250cmlidXRpb24gdG8gY29uc2lkZXIgZm9yIHRoZQotYmFzZSBlbGVtZW50LjwvbGk+Ci08bGk+T3RoZXIgaW5jb21pbmcgYXNzb2NpYXRpb25zIHRvIHRoZSBjb250cmlidXRpbmcgZWxlbWVudCBhcmUgYWRkZWQgdG8gdGhlCi1iYXNlIGVsZW1lbnRzIG9mIGEgY29udHJpYnV0aW9uLjwvbGk+Ci08bGk+QSBiYXNlIGVsZW1lbnQgb2YgYSBjb250cmlidXRpb24gY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBjb250cmlidXRvcjwvbGk+Ci08bGk+Q29udHJpYnV0aW9uIHdvcmtzIHRyYW5zaXRpdmVseSwgaS5lLiBhIGNvbnRyaWJ1dGlvbiBlbGVtZW50IGNvbnRyaWJ1dGVzCi1pdHMgb3duIGNvbnRyaWJ1dG9ycy48L2xpPgotPC91bD4KLVNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sI3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIj5WYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnM8L2E+IHRvIGZpbmQgdGhlIGFzc29jaWF0aW9ucyBmb3IgZWFjaCBlbGVtZW50Ci10eXBlLjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImV4dGVuZHMuaHRtbCNleHRlbmRzIj5FeHRlbmRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiPlJlcGxhY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29weS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvcHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYzZkZmUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29weS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFjb250ZW50cGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhY29udGVudHBhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWY1OGI4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFjb250ZW50cGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgQ29udGVudCBQYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sI2NyZWF0ZWFtZXRob2RwbHVnaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgQ29udGVudCBQYWNrYWdlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVjb250ZW50cGFja2FnZSI+PGEgbmFtZT0iY3JlYXRlY29udGVudHBhY2thZ2UiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBDb250ZW50IFBhY2thZ2U8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5NZXRob2QgY29udGVudCBpcyBvcmdhbml6ZWQgaW50byBjb250ZW50IHBhY2thZ2VzIHdoaWNoLCBpbiB0dXJuLAotYXJlIGNvbnRhaW5lZCBpbiBtZXRob2QgcGx1Zy1pbnMuPC9wPgotQmVmb3JlIGNyZWF0aW5nIGEgY29udGVudCBwYWNrYWdlLCB5b3UKLXNob3VsZCBjcmVhdGUgYSBtZXRob2QgcGx1Zy1pbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiI+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L2E+LjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+WW91IHNob3VsZCBhbHdheXMgY3JlYXRlIGEgbmV3IDxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+IGFuZCA8YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT4gaW4gYSA8YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPk1ldGhvZCBQbHVnLWluPC9hPiB0aGF0Ci15b3UgcHJvZHVjZS4gVGhpcyBzZXBhcmF0ZXMgeW91ciBjb250ZW50IGZyb20gb3JpZ2luYWwgY29udGVudCBzaGlwcGVkIHdpdGgKLXRoZSB0b29sIGFuZCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB5b3VyIG93biBsaWJyYXJ5IHdpdGggbmV3IGxpYnJhcnkgcmVsZWFzZXMKLXdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjb250ZW50IHRoYXQgeW91IGhhdmUgY3JlYXRlZCBpbiB5b3VyIG93biBwbHVnLWlucy4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdQotY2Fubm90IGNyZWF0ZSBhIG5ldyBjb250ZW50IHBhY2thZ2Ugb3IgYW55IG90aGVyIGVsZW1lbnQgaW4gYSBsb2NrZWQgcGx1Zy1pbi48L2Rpdj4KLTxwPlRvCi1jcmVhdGUgYSBjb250ZW50IHBhY2thZ2U6PC9wPgotPC9kaXY+Ci08b2w+PGxpPjxzcGFuPkZpbmQgeW91ciBtZXRob2QgcGx1Zy1pbiBpbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5EcmlsbCBpbnRvIHRoZSBwbHVnLWluIHRvIGxvY2F0ZSB0aGUgcGFja2FnZSBjYWxsZWQgPHN0cm9uZz5Db250ZW50Ci1QYWNrYWdlczwvc3Ryb25nPi4gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGFsbCBwYWNrYWdlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGNvbnRhaW4KLW1ldGhvZCBlbGVtZW50cy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5SaWdodCBjbGljayB0aGUgY29udGVudCBwYWNrYWdlIGFuZCB0aGVuIHNlbGVjdCA8c3Ryb25nPk5ldyAmZ3Q7IENvbnRlbnQKLVBhY2thZ2U8L3N0cm9uZz4uIFRoZSBjb250ZW50IHBhY2thZ2UgZWRpdG9yIGFwcGVhcnMuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+VW5kZXIgR2VuZXJhbCBJbmZvcm1hdGlvbiwgZ2l2ZSB0aGUgbmV3IGNvbnRlbnQgcGFja2FnZSBhIHVuaXF1ZQotbmFtZSBhbmQgcHJvdmlkZSBhIGJyaWVmIGRlc2NyaXB0aW9uLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlNhdmUgdGhlIG5ldyBjb250ZW50IHBhY2thZ2UgaW4gb25lIG9mIHRocmVlIHdheXM6PC9zcGFuPjxvbCB0eXBlPSJhIj48bGk+PHNwYW4+Q2xpY2sgdGhlIGRpc2sgaWNvbiBpbiB0aGUgdG9vbGJhci48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5TZWxlY3QgPHN0cm9uZz5GaWxlICZndDsgU2F2ZTwvc3Ryb25nPi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5TaW1wbHkgY2xvc2UgdGhlIGNvbnRlbnQgZWRpdG9yLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoZSB0b29sIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBub2RlcyBmb3IgPGEgaHJlZj0idGFzay5odG1sI3Rhc2siPlRhc2s8L2E+LCA8YSBocmVmPSJyb2xlLmh0bWwjcm9sZSI+Um9sZTwvYT4sIDxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdDwvYT4sIGFuZCA8YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT4gdW5kZXIgdGhlIG5ldyBjb250ZW50IHBhY2thZ2UuPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sIj5NZXRob2QgQ29udGVudCBQYWNrYWdlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sI2NyZWF0ZWFtZXRob2RwbHVnaW4iPkNyZWF0ZSBhIE1ldGhvZCBQbHVnLWluPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjZGVmMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHJvY2Vzcy5odG1sI3Byb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyI+PGEgbmFtZT0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBhIERlbGl2ZXJ5IFByb2Nlc3M8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5BIERlbGl2ZXJ5IFByb2Nlc3MgZGVzY3JpYmVzIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2gKLWZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgdHlwZSBvZiBwcm9qZWN0LiBBIERlbGl2ZXJ5IFByb2Nlc3MgZGVzY3JpYmVzIHdoYXQKLWlzIHByb2R1Y2VkLCBob3cgaXQgaXMgcHJvZHVjZWQgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBmb3IgdGhlIGVudGlyZSBwcm9qZWN0Ci1saWZlY3ljbGUuPC9wPgotQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGNyZWF0ZWQgZm9yIGEgcGFydGljdWxhciB0eXBlIG9mIHByb2plY3QKLXRvIHJlZmxlY3QgdGhlIHNwZWNpZmljIHBsYW5uaW5nIGFuZCBwcm9qZWN0IG1hbmFnZW1lbnQgbmVlZHMuIDxwPkJlZm9yZQotY3JlYXRpbmcgYSBkZWxpdmVyeSBwcm9jZXNzOjwvcD4KLTx1bD48bGk+U2VsZWN0IGEgbWV0aG9kIHBsdWctaW4gdG8gaG9sZCB5b3VyIHByb2Nlc3MuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwjbWV0aG9kcGx1Z2luIj5NZXRob2QgUGx1Zy1pbjwvYT4uPC9saT4KLTxsaT5GaW5kIG9yIGNyZWF0ZSBhIHByb2Nlc3MgcGFja2FnZS48L2xpPgotPC91bD4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBwb3B1bGF0ZSBhIHByb2Nlc3Mgd2l0aCBtZXRob2QgZWxlbWVudHM6PHVsPjxsaT5CeSBpbmNvcnBvcmF0aW5nIGluZGl2aWR1YWwgbWV0aG9kIGVsZW1lbnRzIGJ5IGRyYWdnaW5nIHRoZSBlbGVtZW50cyBvbnRvCi1hbiBhY3Rpdml0eSBpbiB0aGUgcHJvY2Vzcy48L2xpPgotPGxpPkJ5IGluY2x1ZGluZyBhbHJlYWR5IGRlZmluZWQgY2FwYWJpbGl0eSBwYXR0ZXJucy48L2xpPgotPGxpPkJ5IGluY2x1ZGluZyBwYXJ0cyBvZiBhbHJlYWR5IGRlZmluZWQgY2FwYWJpbGl0eSBwYXR0ZXJucy48L2xpPgotPGxpPkJ5IGNyZWF0aW5nIGRlc2NyaXB0b3JzIGRpcmVjdGx5IGluIHRoZSBwcm9jZXNzLCB3aGljaCBhcmUgZWl0aGVyIHVucmVsYXRlZAotdG8gYW55IG1ldGhvZCBjb250ZW50IG9yIHJlbGF0ZWQgdG8gbWV0aG9kIGNvbnRlbnQgYXQgYSBsYXRlciBwb2ludCBpbiB0aW1lLjwvbGk+Ci08L3VsPgotVG8gY3JlYXRlIGEgRGVsaXZlcnkgUHJvY2Vzczo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uY2UgeW91IGhhdmUgc2VsZWN0ZWQgb3IgY3JlYXRlZCBhIHByb2Nlc3MgcGFja2FnZSwgcmlnaHQgY2xpY2sKLXRoZSBwcm9jZXNzIHBhY2thZ2UuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+TmV3ICZndDsgRGVsaXZlcnkgUHJvY2Vzczwvc3Ryb25nPi4gVGhlIE5ldyBQcm9jZXNzIENvbXBvbmVudAotZGlhbG9nIGFwcGVhcnMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBuYW1lIGZvciB0aGUgZGVsaXZlcnkgcHJvY2VzcyBpbnRvIHRoZSA8c3Ryb25nPk5hbWU8L3N0cm9uZz4gZmllbGQKLWFuZCB0aGVuIHNlbGVjdCBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBkcm9wIGRvd24gbGlzdC4gWW91ciBwcm9jZXNzCi1jYW4gY29udGFpbiBjb250ZW50IGZyb20gbWFueSBkaWZmZXJlbnQgbWV0aG9kIHBsdWctaW5zLiBmb3IgdGhpcyByZWFzb24geW91Ci1uZWVkIHRvIGRlZmluZSBhIGNvbmZpZ3VyYXRpb24gdGhhdCBkZWZpbmVzIHRoZSB2aXNpYmxlIHNldCBvZiBlbGVtZW50cyBhbmQKLXJlbGF0aW9uc2hpcHMgd2hlbiB0aGUgcHJvY2VzcyBpcyBhdXRob3JlZC4gVGhpcyBwcm9jZXNzIGF1dGhvcmluZyBjb25maWd1cmF0aW9uCi1pcyByZWZlcnJlZCB0byBhcyB0aGUgRGVmYXVsdCBDb25maWd1cmF0aW9uIGZvciB0aGUgcHJvY2VzcyBhbmQgc2hvdWxkIGRlZmluZQotdGhlIGxhcmdlc3QgcmVhc29uYWJsZSBzZXQgb2YgbWV0aG9kIHBsdWctaW5zLCBjb250ZW50IHBhY2thZ2VzLCBhbmQgb3RoZXIKLXByb2Nlc3NlcyBmcm9tIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IHdpbGwgYmUgcmVmZXJyZWQgdG8gYnkgdGhlIHByb2Nlc3MKLWF0IHNvbWUgcG9pbnQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSBwcm9jZXNzIGlzIGNyZWF0ZWQgYW5kIHRoZSBwcm9jZXNzIGVkaXRvcgotaXMgb3BlbmVkLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IElmIHRoZSBQcm9wZXJ0aWVzIHdpbmRvdyBvcGVucyB0byB0aGUgcmlnaHQgb2YKLXRoZSBwcm9jZXNzIGVkaXRvciwgY2xpY2sgdGhlIDxzdHJvbmc+eDwvc3Ryb25nPiB0byBjbG9zZSBpdC48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBwcm9jZXNzIGVkaXRvciwgdW5kZXIgdGhlIERlc2NyaXB0aW9uIHRhYiwgZG9jdW1lbnQgeW91cgotcHJvY2VzcyB1c2luZyB0aGUgYXZhaWxhYmxlIHRleHQgZmllbGRzLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdSBjYW4gdXNlIHRoZQotUmljaCBUZXh0IEVkaXRvciB0byBlZGl0IG9yIGVudGVyIHRoZSB0ZXh0IGZvciBhbnkgZmllbGQgdGhhdCBoYXMgYSB0d2lzdHkKLXN5bWJvbCA8aW1nIHNyYz0iY29sbGFwc2VkLmdpZiIgYWx0PSIiIC8+LiBTaW1wbHkgY2xpY2sgdGhlIHN5bWJvbAotdG8gYWNjZXNzIHRoZSBSaWNoIFRleHQgRWRpdG9yLiBDbGljayB0aGUgc3ltYm9sIGFnYWluIHRvIGNsb3NlIHRoZSBSaWNoIFRleHQKLUVkaXRvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiPlJpY2ggVGV4dCBFZGl0b3I8L2E+PC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5EZWNpZGUgb24geW91ciBwcmltYXJ5IHByb2Nlc3MgYXV0aG9yaW5nIHZpZXcuIFlvdSBkZXZlbG9wIGEgcHJvY2VzcwotdXNpbmcgdGhyZWUgZGlmZmVyZW50IHZpZXdzOjwvc3Bhbj48dWw+PGxpPjxzdHJvbmc+V29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9zdHJvbmc+OiBEZWZpbmUgYSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUKLWluIHlvdXIgcHJvY2Vzcy4gQ3JlYXRlIGl0ZXJhdGlvbnMgYW5kIGFjdGl2aXRpZXMgZmlyc3QsIGFuZCB0aGVuIHBvcHVsYXRlCi15b3VyIGFjdGl2aXRpZXMgYnkgYXBwbHlpbmcgdGFza3MgZnJvbSB5b3VyIE1ldGhvZCBDb250ZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbgotc2VlIDxhIGhyZWY9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sIj5EZXZlbG9wIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9hPi48L2xpPgotPGxpPjxzdHJvbmc+VGVhbSBBbGxvY2F0aW9uPC9zdHJvbmc+OiBEZWZpbmUgd2hpY2ggdGVhbXMgYW5kIHJvbGVzIHNoYWxsIHBhcnRpY2lwYXRlCi1pbiBhY3Rpdml0aWVzIGFuZCB0aGVuIGZpbmQgcmVzcG9uc2libGUgd29yayBwcm9kdWN0cyBhbmQgdGFza3MgZnJvbSB0aGVyZS4KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0iZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sI2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiPkRldmVsb3AgYSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlPC9hPi48L2xpPgotPGxpPjxzdHJvbmc+V29yayBQcm9kdWN0IFVzYWdlPC9zdHJvbmc+OiBEZWZpbmUgd2hpY2ggd29yayBwcm9kdWN0cyBzaG91bGQgYmUgY3JlYXRlZAotaW4gYWN0aXZpdGllcyBhbmQgZmluZCB0YXNrcyBhbmQgcm9sZXMgZnJvbSB0aGVyZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSI+RGV2ZWxvcCBhIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmU8L2E+LjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+PGEgaHJlZj0iYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNhcHBseWFjYXBhYmlsaXR5cGF0dGVybiI+QXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm48L2E+IG9yIGNhcGFiaWxpdHkgcGF0dGVybiBwYXJ0cyB0byB0aGUgZGVsaXZlcnkgcHJvY2Vzcy48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJkZWxpdmVyeXByb2Nlc3MuaHRtbCI+RGVsaXZlcnkgUHJvY2VzczwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJwcm9jZXNzLmh0bWwjcHJvY2VzcyI+UHJvY2VzczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24uaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTJiYTQ2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwjbWV0aG9kY29uZmlndXJhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZHBsdWdpbi5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgTWV0aG9kIENvbmZpZ3VyYXRpb248L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uIj48YSBuYW1lPSJjcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBhIE1ldGhvZCBDb25maWd1cmF0aW9uPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+QSBtZXRob2QgY29uZmlndXJhdGlvbiBhbGxvd3MgeW91IHRvIHNlbGVjdCBhbmQgZGVzZWxlY3QgZnJvbSB0aGUKLWNvbnRlbnQgcGFja2FnZXMgYW5kIHByb2Nlc3MgYXZhaWxhYmxlIGluIHRoZSBtZXRob2QgbGlicmFyeSdzIHNldCBvZiBwbHVnLWlucy4KLVRoZSBzZWxlY3Rpb25zIHlvdSBtYWtlIGhlbHAgeW91IG5hcnJvdyBkb3duIHRoZSBjb250ZW50IHlvdSBhcmUgcmVhbGx5IGludGVyZXN0ZWQKLWluIHdvcmtpbmcgd2l0aCwgYXMgd2VsbCBhcyBkZXRlcm1pbmUgdGhlIGNvbnRlbnQgb2YgdGhlIFdlYiBzaXRlIHlvdSB1bHRpbWF0ZWx5Ci1wdWJsaXNoIHRvIGRlcGxveSB5b3VyIHByb2Nlc3MuIEEgY29uZmlndXJhdGlvbiBpcyBnaXZlbiBhIG5hbWUgYW5kIHRoZW4gc2F2ZWQKLXNvIGl0IGNhbiBiZSBjaGFuZ2VkIGFuZCB0aGVuIHJlLXB1Ymxpc2hlZCBhdCBhIGxhdGVyIGRhdGUuPC9wPgotQmVmb3JlIGNyZWF0aW5nCi1hIG1ldGhvZCBjb25maWd1cmF0aW9uLCBhc3Nlc3MgeW91ciBuZWVkcyBhbmQgZ29hbHMgZm9yIHRoZSBjb25maWd1cmF0aW9uLjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGhlcmUgYXJlIHR3byB3YXlzIHRvIGNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uOjxhIG5hbWU9ImNyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uX19jcmVhdGUiPjwhLS0gLS0+PC9hPjx1bCBpZD0iY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb25fX2NyZWF0ZSI+PGxpPkNyZWF0ZSBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbiBmcm9tIHNjcmF0Y2guPC9saT4KLTxsaT5DcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiBieSBjb3B5aW5nIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uPC9saT4KLTwvdWw+Ci08c3Ryb25nPlRvIGNyZWF0ZSBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbiBmcm9tIHNjcmF0Y2g6PC9zdHJvbmc+PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5NYWtlIHN1cmUgeW91IGFyZSB3b3JraW5nIGluIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTGlicmFyeSB2aWV3LCByaWdodCBjbGljayB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9uczwvc3Ryb25nPiBmb2xkZXIKLWFuZCB0aGVuIHNlbGVjdCA8c3Ryb25nPk5ldyAmZ3Q7IE1ldGhvZCBDb25maWd1cmF0aW9uPC9zdHJvbmc+LiBZb3VyIG5ldyBjb25maWd1cmF0aW9uCi1pcyBjcmVhdGVkIGFuZCB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IgaXMgb3BlbmVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3Igd2luZG93LCB0eXBlIGEgbmFtZSBmb3IgeW91ciBjb25maWd1cmF0aW9uCi1pbiB0aGUgPHN0cm9uZz5OYW1lPC9zdHJvbmc+IGZpZWxkLiBJZiB5b3UgY2xpY2sgYW55d2hlcmUgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gb3IgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPiwgeW91Ci13aWxsIGJlIGFibGUgdG8gc2VlIHlvdXIgbmV3IGNvbmZpZ3VyYXRpb24gbmFtZSBpbiB0aGUgQ29uZmlndXJhdGlvbnMgZm9sZGVyCi1pbiB0aGUgTGlicmFyeSB2aWV3IHRyZWUuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBkZXNjcmlwdGlvbiBmb3IgeW91ciBjb25maWd1cmF0aW9uIGluIHRoZSBEZXNjcmlwdGlvbiBmaWVsZCwKLWFuZCB0aGVuIHNlbGVjdCA8c3Ryb25nPkZpbGUgJmd0OyBTYXZlIEFsbDwvc3Ryb25nPiB0byBzYXZlIHlvdXIgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BdCB0aGUgYm90dG9tIG9mIHRoZSBlZGl0b3Igd2luZG93LCBjbGljayB0aGUgPHN0cm9uZz5QbHVnLWluIGFuZCBQYWNrYWdlCi1TZWxlY3Rpb248L3N0cm9uZz4gdGFiLiA8L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIHNlbGVjdGlvbiBzZWN0aW9uIGRpc3BsYXlzIGEgbGlzdCBvZiBhbGwKLW1ldGhvZCBwbHVnLWlucyB0aGVpciBjb250ZW50IHBhY2thZ2VzIGFuZCBwcm9jZXNzZXMuIFVzZSB0aGUgY2hlY2sgYm94ZXMKLXRvIGFkZCBvciByZW1vdmUgcGx1Zy1pbnMsIHBhY2thZ2VzLCBhbmQgcHJvY2Vzc2VzIHRvIG9yIGZyb20geW91ciBjb25maWd1cmF0aW9uLgotRXhwYW5kIGVhY2ggcGx1Zy1pbiB0byBzZWxlY3QgYW5kIGRlc2VsZWN0IGluZGl2aWR1YWwgcGFja2FnZXMgYW5kIHByb2Nlc3Nlcy48L3NwYW4+IDxwPkFzIHlvdSBtYWtlIHlvdXIgc2VsZWN0aW9ucywgd2FybmluZyBzaWducyBtYXkgYXBwZWFyIGFnYWluc3QKLXNvbWUgb2YgdGhlIHBsdWctaW4gYW5kIHBhY2thZ2UgbmFtZXMsIGFuZCB0aGUgQ29uZmlndXJhdGlvbiBXYXJuaW5nIExvZyB2aWV3Ci1tYXkgYmUgZGlzcGxheWVkLiBUaGVzZSB3YXJuaW5ncyBhcmUgaW50ZW5kZWQgdG8gaGVscCBlbnN1cmUgdGhhdCB5b3UgY3JlYXRlCi1hIGNvbmZpZ3VyYXRpb24gdGhhdCAibWFrZXMgc2Vuc2UiLjwvcD4KLTxwPklmIHlvdSByZWZlcmVuY2UgYW4gZWxlbWVudCBpbiBhCi1wYWNrYWdlIHRoYXQgaXMgZnJvbSBhbm90aGVyIHBhY2thZ2UsIHlvdSBjYW4gb25seSBzZWUgdGhlIGZ1bGwgZGV0YWlscyBmb3IKLXRoYXQgZWxlbWVudCBpbiBhIHB1Ymxpc2hlZCBXZWIgc2l0ZSBpZiB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBlbGVtZW50Ci1pcyBpbiB0aGUgY29uZmlndXJhdGlvbi4gSWYgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlCi1jb25maWd1cmF0aW9uLCB0aGUgIm9mZmVuZGluZyIgcGFja2FnZSBpcyBtYXJrZWQgd2l0aCBhIHdhcm5pbmcgc2lnbi4gWW91Ci1tYXkgY2hvb3NlIG5vdCB0byBpbmNsdWRlIHRoZSBmdWxsIGRldGFpbHMgb2YgYSByZWZlcmVuY2VkIGVsZW1lbnQuIENsaWNrCi10aGUgPHN0cm9uZz5BZGQgTWlzc2luZyBSZWZlcmVuY2VzPC9zdHJvbmc+IGJ1dHRvbiB0byBhdXRvbWF0aWNhbGx5IGFuZCByZWN1cnNpdmVseQotYWRkIHBhY2thZ2VzIGNvbnRhaW5pbmcgYW55IGVsZW1lbnRzIHRoYXQgYXJlIHJlZmVyZW5jZWQgaW4gYWxyZWFkeSBzZWxlY3RlZAotcGFja2FnZXMuIFNpbmNlIHRoaXMgaXMgcmVjdXJzaXZlLCBhIGxhcmdlIG51bWJlciBvZiBwYWNrYWdlcyBtYXkgYmUgYWRkZWQsCi1wZXJoYXBzIG1ha2luZyB5b3VyIGNvbmZpZ3VyYXRpb24gbGFyZ2VyIHRoYW4geW91IHdhbnQgaXQgdG8gYmUuPC9wPgotPHA+SWYKLXlvdSBoYXZlIGVsZW1lbnRzIGluIGEgcGFja2FnZSB0aGF0IGNvbnRyaWJ1dGUgdG8sIGV4dGVuZCwgb3IgcmVwbGFjZSBlbGVtZW50cwotaW4gYW5vdGhlciBwYWNrYWdlLCBpdCBpcyBhbiBlcnJvciBpZiB0aGUgYmFzZSBwYWNrYWdlIGlzIG5vdCBpbmNsdWRlZCBpbgotdGhlIGNvbmZpZ3VyYXRpb24uIEVycm9ycyBhcmUgbWFya2VkIHdpdGggYSByZWQgY3Jvc3MuIElmIHlvdSBkcmlsbCBkb3duIGludG8KLWEgcGx1Zy1pbiBvciBwYWNrYWdlIG1hcmtlZCB3aXRoIGEgY3Jvc3MgeW91IHdpbGwgZGlzY292ZXIgdGhlICJvZmZlbmRpbmciCi1wYWNrYWdlIGFuZCB0aGVuIHlvdSBjYW4gZmluZCB0aGUgcGFja2FnZXMgeW91IG5lZWQgdG8gaW5jbHVkZSB0byByZXNvbHZlCi10aGUgZXJyb3IuIEFsdGVybmF0aXZlbHkgeW91IGNhbiBjbGljayB0aGUgPHN0cm9uZz5NYWtlIGNsb3N1cmUgYnkgZml4aW5nIGVycm9yczwvc3Ryb25nPiBidXR0b24KLXRvIGF1dG9tYXRpY2FsbHkgZml4IHRoZSBlcnJvcnMgYnkgYWRkaW5nIHRoZSBtaXNzaW5nIGJhc2UgcGFja2FnZXMuPC9wPgotPHA+VGhlCi1Db25maWd1cmF0aW9uIFdhcm5pbmcgTG9nIGxpc3RzIGFuZCBleHBsYWlucyBhbGwgZXJyb3JzIGFuZCB3YXJuaW5ncyBpbiB0aGUKLWNvbmZpZ3VyYXRpb24uPC9wPgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzdHJvbmc+RmlsZSAmZ3Q7IFNhdmUgQWxsPC9zdHJvbmc+PC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkRlZmluZSB0aGUgdmlld3MgZm9yIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbi4gQSB2aWV3IGlzIGEgbmF2aWdhdGlvbgotdHJlZSBicm93c2VyIGluIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uIEV2ZXJ5IHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGNhbgotaGF2ZSBzZXZlcmFsIHZpZXdzIHRoYXQgYXJlIGRpc3BsYXllZCBhcyBzdGFja2VkIHRyZWUgYnJvd3NlciB0YWJzLiBUaGUgc3RydWN0dXJlCi1vZiB0aGUgdmlldyBpcyBkZWZpbmVkIGFzIGEgQ3VzdG9tIENhdGVnb3J5Ljwvc3Bhbj48b2wgdHlwZT0iYSI+PGxpPjxzcGFuPkluIHRoZSBDb25maWd1cmF0aW9uIEVkaXRvciwgY2xpY2sgdGhlIDxzdHJvbmc+Vmlld3M8L3N0cm9uZz4gdGFiLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPkFkZCBWaWV3PC9zdHJvbmc+IGJ1dHRvbi4gVGhlIFNlbGVjdCBDYXRlZ29yaWVzIGRpYWxvZwotYXBwZWFycy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5JZiBuZWVkZWQsIGNsaWNrIHRoZSAoKykgc2lnbiB0byBleHBhbmQgdGhlIEN1c3RvbSBDYXRlZ29yaWVzCi1mb2xkZXIgYW5kIHRoZW4gc2VsZWN0IHRoZSBjYXRlZ29yeSB5b3Ugd2FudCB0byB1c2UgYXMgeW91ciB2aWV3LiBDbGljayB0aGUKLSgrKSBzaWduIHRvIGV4cGFuZCB5b3VyIGNob3NlbiBjYXRlZ29yeSBhbmQgdmlldyBpdCdzIGNvbnRlbnRzLiBQcmVzcyBhbmQKLWhvbGQgdGhlIENUUkwga2V5IHRvIHNlbGVjdCBtdWx0aXBsZSB2aWV3cy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5DbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUaGUgZGlhbG9nIHdpbmRvdyBkaXNhcHBlYXJzIGFuZCB0aGUgdmlld3MKLXlvdSBzZWxlY3RlZCBhcmUgYWRkZWQgdG8gdGhlIENvbmZpZ3VyYXRpb24uPC9zcGFuPjwvbGk+Ci08L29sPgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSB2aWV3IHlvdSB3YW50IHRvIGRpc3BsYXkgYXMgeW91ciBjb25maWd1cmF0aW9uJ3Mgc3RhcnQtdXAKLXZpZXcgYW5kIHRoZW4gY2xpY2sgdGhlIDxzdHJvbmc+TWFrZSBEZWZhdWx0PC9zdHJvbmc+IGJ1dHRvbi4gVGhlIHN0YXJ0LXVwIHZpZXcgaXMgdGhlCi1maXJzdCB2aWV3IHNob3duIHdoZW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBpcyBkaXNwbGF5ZWQgZm9yIHRoZSBmaXJzdAotdGltZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5GaWxlICZndDsgU2F2ZSBhbGw8L3N0cm9uZz4gdG8gc2F2ZSB5b3VyIGNvbmZpZ3VyYXRpb24uPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHN0cm9uZz5UbyBjcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiBieSBjb3B5aW5nIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb248L3N0cm9uZz46PG9sPjxsaT5NYWtlIHN1cmUgeW91IGFyZSB3b3JraW5nIGluIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+LjxwPjwvcD4KLTwvbGk+Ci08bGk+SW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4sCi1leHBhbmQgdGhlIENvbmZpZ3VyYXRpb25zIGZvbGRlci48cD48L3A+Ci08L2xpPgotPGxpPiBSaWdodCBjbGljayB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24geW91IHdhbnQgdG8gY29weSBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkNvcHk8L3N0cm9uZz4uPHA+PC9wPgotPC9saT4KLTxsaT5SaWdodCBjbGljayB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9uczwvc3Ryb25nPiBmb2xkZXIgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5QYXN0ZTwvc3Ryb25nPi4KLVR5cGUgYSBuYW1lIGZvciB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gaW4gdGhlIHBvcC11cCB3aW5kb3cuIFRoZSBjb3BpZWQgbWV0aG9kCi1jb25maWd1cmF0aW9uIGlzIHBhc3RlZCBpbnRvIHRoZSBDb25maWd1cmF0aW9ucyBmb2xkZXIuPHA+PC9wPgotPC9saT4KLTxsaT5Eb3VibGUgY2xpY2sgdGhlIG5ld2x5IHBhc3RlZCBtZXRob2QgY29uZmlndXJhdGlvbiB0byBvcGVuIGl0cyBjb25maWd1cmF0aW9uCi1lZGl0b3IuPHA+PC9wPgotPC9saT4KLTxsaT5Gb2xsb3cgc3RlcHMgMyB0aHJvdWdoIDEwIGluIDxzdHJvbmc+VG8gQ3JlYXRlIGEgTmV3IE1ldGhvZCBDb25maWd1cmF0aW9uIGZyb20KLVNjcmF0Y2g8L3N0cm9uZz4gYWJvdmUgdG8gY29udGludWUuPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJtZXRob2Rjb25maWd1cmF0aW9ucy5odG1sIj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb25maWd1cmF0aW9ucy5odG1sI21ldGhvZGNvbmZpZ3VyYXRpb25zIj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwiPk1ldGhvZCBQbHVnLWluPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIj5NZXRob2QgQ29udGVudCBQYWNrYWdlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCI+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDhkNjIzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBhIE1ldGhvZCBQbHVnLWluIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFjb250ZW50cGFja2FnZS5odG1sI2NyZWF0ZWNvbnRlbnRwYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2RwbHVnaW4uaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kcGx1Z2luIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBhIE1ldGhvZCBQbHVnLWluPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhbWV0aG9kcGx1Z2luIj48YSBuYW1lPSJjcmVhdGVhbWV0aG9kcGx1Z2luIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5NZXRob2QgUGx1Zy1pbnMgYWxsb3cgdGhlIGV4dGVuc2lvbiBvciBjdXN0b21pemF0aW9uIG9mIGJhc2UgbGlicmFyeQotY29udGVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIHRoYXQgYmFzZSBjb250ZW50IGJ5IGRlZmluaW5nIHRoZSBkaWZmZXJlbmNlcwotdG8gdGhlIGNvbnRlbnQuIFlvdSBzaG91bGQgYWx3YXlzIGNyZWF0ZSBuZXcgY29udGVudCBpbiBhIG1ldGhvZCBwbHVnLWluIHRoYXQKLXlvdSBwcm9kdWNlIHRvIHNlcGFyYXRlIHlvdXIgY29udGVudCBmcm9tIHRoZSBvcmlnaW5hbCBPcGVuVVAvQmFzaWMgY29udGVudC4gVGhpcwotYWxzbyBhbGxvd3MgeW91IHRvIHVwZGF0ZSB5b3VyIG93biBsaWJyYXJ5IHdpdGggbmV3IHJlbGVhc2VzIG9mIHRoZSBPcGVuVVAvQmFzaWMgTWV0aG9kCi1MaWJyYXJ5IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjb250ZW50IHRoYXQgeW91IGhhdmUgY3JlYXRlZCBpbiB5b3VyIG93biBwbHVnLWlucy48L3A+Ci08ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gUGx1Zy1pbnMKLXRoYXQgYXJlIHNoaXBwZWQgd2l0aCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGFyZSBsb2NrZWQgYW5kIHJlYWQtb25seS4KLVRoZXNlIHBsdWctaW5zIGFyZSBncmF5ZWQgb3V0IGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+LCBpbmRpY2F0aW5nIHRoYXQgdGhleSBhcmUgbG9ja2VkLjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYSBuZXcgTWV0aG9kIFBsdWctaW46PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5NYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBiZWdpbiB0aGUgbWV0aG9kIHBsdWctaW4gY3JlYXRpb24gcHJvY2VzcyBpbiBvbmUgb2YgdHdvCi13YXlzOjwvc3Bhbj48dWw+PGxpPkNsaWNrIDxzdHJvbmc+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE1ldGhvZCBQbHVnLWluPC9zdHJvbmc+LiBPciw8L2xpPgotPGxpPkluIHRoZSBMaWJyYXJ5IHZpZXcsIHJpZ2h0IGNsaWNrIGFuIGV4aXN0aW5nIHBsdWctaW4gYW5kIHNlbGVjdCA8c3Ryb25nPk5ldwotTWV0aG9kIFBsdWctaW48L3N0cm9uZz4uPC9saT4KLTwvdWw+Ci0gVGhlIE5ldyBNZXRob2QgUGx1Zy1pbiB3aXphcmQgb3BlbnMuPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG5hbWUgZm9yIHlvdXIgbmV3IHBsdWctaW4gaW4gdGhlIDxzdHJvbmc+TmFtZTwvc3Ryb25nPiBmaWVsZCBhbmQgdGhlbgotc2VsZWN0IGEgcGx1Z2luIGluIHRoZSA8c3Ryb25nPlJlZmVyZW5jZWQgUGx1Zy1pbnM8L3N0cm9uZz4gZmllbGQuIFRoZSBwbHVnLWluIHlvdSBjcmVhdGUKLWV4dGVuZHMgdGhlIHBsdWctaW4geW91IHNlbGVjdCBmcm9tIHRoZSBsaXN0IGFuZCBhbGxvd3MgeW91IHRvIHVzZSBjb250ZW50Ci1mcm9tIHRoZSBzZWxlY3RlZCBwbHVnLWluIGFzIHlvdSBjcmVhdGUgeW91ciBvd24gcGx1Zy1pbiBjb250ZW50Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Qcm92aWRlIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIHBsdWctaW4gYW5kIGxpc3QgaXRzIGF1dGhvcnMKLXRvIGhlbHAgeW91IGFuZCBvdGhlcnMga2VlcCB0cmFjayBvZiB0aGUgcGx1Zy1pbnMgaW4gdGhlIGxpYnJhcnkuIFlvdSBjYW4KLXJldHVybiB0byBlZGl0IHRoaXMgaW5mb3JtYXRpb24gYXQgYW55IHRpbWUuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+RmluaXNoPC9zdHJvbmc+LiBZb3VyIG5ldyBwbHVnLWluIG5vdyBhcHBlYXJzIGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+IHdpdGggdGhlIG90aGVyCi1NZXRob2QgUGx1Zy1pbnMuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sIj5NZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPk1ldGhvZCBQbHVnLWluPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIj5NZXRob2QgQ29udGVudCBQYWNrYWdlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFjb250ZW50cGFja2FnZS5odG1sI2NyZWF0ZWNvbnRlbnRwYWNrYWdlIj5DcmVhdGUgYSBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTBlZGE1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBhIE1ldGhvZCBWaWV3IHdpdGggQ3VzdG9tIENhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InB1Ymxpc2hpbmdvdmVydmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgTWV0aG9kIFZpZXcgd2l0aCBDdXN0b20gQ2F0ZWdvcmllczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcyI+PGEgbmFtZT0iY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBhIE1ldGhvZCBWaWV3IHdpdGggQ3VzdG9tIENhdGVnb3JpZXM8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIj5DdXN0b20gY2F0ZWdvcmllcyBhbGxvdyB5b3UgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGFjY29yZGluZyB0byBhbnkKLXNjaGVtZSB5b3Ugd2FudC4gQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIHRoZW4gYmUgdXNlZCB0byBjb21wb3NlIHB1Ymxpc2hhYmxlCi12aWV3cywgcHJvdmlkaW5nIGEgbWVhbnMgdG8gb3JnYW5pemUgbWV0aG9kIGNvbnRlbnQgcHJpb3IgdG8gcHVibGlzaGluZy48cD5UbwotY3JlYXRlIGEgbmV3IGN1c3RvbSBjYXRlZ29yeTo8L3A+Ci08L2Rpdj4KLTxvbD48bGk+PHNwYW4+U3dpdGNoIHRvIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPk9wZW4gdGhlIDxzdHJvbmc+TWV0aG9kIENvbnRlbnQ8L3N0cm9uZz4gZm9sZGVyIGluIHRoZSBtZXRob2QgcGx1Zy1pbiB3aGVyZQoteW91IHdhbnQgdG8gY3JlYXRlIHRoZSBjdXN0b20gY2F0ZWdvcnkuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+UmlnaHQgY2xpY2sgdGhlIEN1c3RvbSBDYXRlZ29yaWVzIGZvbGRlciBhbmQgc2VsZWN0IDxzdHJvbmc+TmV3ICZndDsgQ3VzdG9tCi1DYXRlZ29yeTwvc3Ryb25nPi4gVGhlIGVkaXRvciB3aW5kb3cgb3BlbnMuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+UHJvdmlkZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VzdG9tIGNhdGVnb3J5IGluIHRoZQotZmllbGRzIGF2YWlsYWJsZSB1bmRlciB0aGUgPHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPiB0YWIuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+VW5kZXIgdGhlIDxzdHJvbmc+QXNzaWduPC9zdHJvbmc+IHRhYiwgeW91IGNhbiBzZWxlY3QgdGhlIHRoaW5ncyB5b3Ugd2FudAotdG8gaW5jbHVkZSBpbiB0aGUgY3VzdG9tIGNhdGVnb3J5LiBTZWxlY3QgaW5kaXZpZHVhbCBtZXRob2QgZWxlbWVudHMsIHByb2Nlc3NlcywKLXN0YW5kYXJkIGNhdGVnb3JpZXMgb3IgY3VzdG9tIGNhdGVnb3JpZXMuIFRoZSBjdXN0b20gY2F0ZWdvcnkKLWlzIGFsc28gYXZhaWxhYmxlIHRvIGFkZCB0byBpbmRpdmlkdWFsIGVsZW1lbnRzIG9uIHRoZSA8c3Ryb25nPkNhdGVnb3JpZXM8L3N0cm9uZz4gdGFiCi1pbiB0aGUgYXBwcm9wcmlhdGUgZWRpdG9yLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPk9uY2UgeW91IGFzc2lnbiBjb250ZW50IHRvIHRoZSBjdXN0b20gY2F0ZWdvcnksIHlvdSBjYW4gbW9kaWZ5Ci10aGUgc2VxdWVuY2Ugb2YgdGhlIGl0ZW1zIGluIHRoZSBjYXRlZ29yeS4gVGhpcyBhZmZlY3RzIHRoZSBzZXF1ZW5jZSBvZiB0aGUKLWl0ZW1zIGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+IGFuZCA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LCBhcwotd2VsbCBhcyBpbiBhIHB1Ymxpc2hlZCBXZWIgc2l0ZSBpZiB0aGUgY3VzdG9tIGNhdGVnb3J5IGlzIGluY2x1ZGVkIGFzIGEgdmlldwotaW4gYSBjb25maWd1cmF0aW9uLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlRvIHNhdmUgeW91ciBuZXcgY3VzdG9tIGNhdGVnb3J5LCBjbGljayA8c3Ryb25nPkZpbGUgJmd0OyBTYXZlPC9zdHJvbmc+IG9yIGNsb3NlCi10aGUgZWRpdG9yIGFuZCBjbGljayA8c3Ryb25nPlllczwvc3Ryb25nPiB3aGVuIHByb21wdGVkIHRvIHNhdmUgdGhlIGNoYW5nZXMuPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+WW91IGNhbiBub3cgdXNlIHRoZSBjdXN0b20gY2F0ZWdvcnkgYXMgYSB2aWV3IGluIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uPG9sPjxsaT5Td2l0Y2ggdG8gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4uPC9saT4KLTxsaT5JbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiwKLWRvdWJsZSBjbGljayB0aGUgY29uZmlndXJhdGlvbiB0byB3aGljaCB5b3Ugd2FudCB0byBhZGQgYSB2aWV3LiBUaGUgY29uZmlndXJhdGlvbgotZWRpdG9yIG9wZW5zLjwvbGk+Ci08bGk+Q2xpY2sgdGhlIDxzdHJvbmc+Vmlld3M8L3N0cm9uZz4gdGFiIGFuZCB0aGVuIGNsaWNrIHRoZSA8c3Ryb25nPkFkZCBWaWV3PC9zdHJvbmc+IGJ1dHRvbi4KLVRoZSBTZWxlY3QgQ2F0ZWdvcmllcyBkaWFsb2cgYXBwZWFycy4gVGhlIFNlbGVjdCBDYXRlZ29yaWVzIGRpYWxvZyBkaXNwbGF5cwotYWxsIHRoZSBzdGFuZGFyZCBhbmQgY3VzdG9tIGNhdGVnb3JpZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uPC9saT4KLTxsaT5TZWxlY3Qgb25lIG9yIG1vcmUgY2F0ZWdvcmllcyB0byBpbmNsdWRlIGFzIGEgdmlldyBpbiB5b3VyIGNvbmZpZ3VyYXRpb24KLWFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSB2aWV3IGRpc3BsYXkgcHJvdmlkZXMgYSBwcmV2aWV3IG9mIGhvdyB0aGUgdmlldwotd2lsbCBhcHBlYXIgbiB0aGUgcHVibGlzaGVkIHRyZWUgYnJvd3Nlci48L2xpPgotPGxpPlNlbGVjdCBhIHZpZXcgdG8gZGlzcGxheSBhcyB0aGUgZGVmYXVsdCBzdGFydC11cCB2aWV3IGluIHRoZSBwdWJsaXNoZWQKLVdlYiBzaXRlLCBhbmQgdGhlbiBjbGljayB0aGUgPHN0cm9uZz5NYWtlIERlZmF1bHQ8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08bGk+VG8gc2F2ZSB0aGUgY29uZmlndXJhdGlvbiwgY2xpY2sgPHN0cm9uZz5GaWxlICZndDsgU2F2ZTwvc3Ryb25nPiBvciBjbG9zZSB0aGUgY29uZmlndXJhdGlvbgotZWRpdG9yIGFuZCBjbGljayA8c3Ryb25nPlllczwvc3Ryb25nPiB3aGVuIHByb21wdGVkIHRvIHNhdmUgdGhlIGNoYW5nZXMuPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiPk1ldGhvZCBDb250ZW50IENhdGVnb3JpZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InB1Ymxpc2hpbmdvdmVydmlldy5odG1sIj5QdWJsaXNoaW5nIE92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTM5ZDM2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgUmV1c2FibGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwcm9jZXNzLmh0bWwjcHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwjcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBSZXVzYWJsZSBDYXBhYmlsaXR5IFBhdHRlcm48L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIj48YSBuYW1lPSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBhIFJldXNhYmxlIENhcGFiaWxpdHkgUGF0dGVybjwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPkEgQ2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGEgc3BlY2lhbCBwcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUKLWNsdXN0ZXIgb2YgYWN0aXZpdGllcyBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50Ci1kZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuIENhcGFiaWxpdHkgcGF0dGVybnMgY2FuIGJlIHVzZWQgYXMKLWJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBkZWxpdmVyeSBwcm9jZXNzZXMgb3IgbGFyZ2VyIGNhcGFiaWxpdHkgcGF0dGVybnMuIDwvcD4KLUJlZm9yZQotY3JlYXRpbmcgYSBjYXBhYmlsaXR5IHBhdHRlcm46PHVsPjxsaT5TZWxlY3QgYSBtZXRob2QgcGx1Zy1pbiB0byBob2xkIHlvdXIgcHJvY2Vzcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPk1ldGhvZCBQbHVnLWluPC9hPi48L2xpPgotPGxpPkZpbmQgb3IgY3JlYXRlIGEgcHJvY2VzcyBwYWNrYWdlLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5BIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbgotb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gSW4gb3RoZXIgd29yZHMsIGEgY2FwYWJpbGl0eQotcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgc28gdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEKLWRlbGl2ZXJ5IHByb2Nlc3MuIFRoaXMgZW5hYmxlcyB0aGUgcGF0dGVybidzIGFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQKLXRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIGRlbGl2ZXJ5IHByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcKLWFwcGxpZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+LjxkaXYgY2xhc3M9InAiPllvdSBkbyBub3QgbmVlZCB0byBkZXZlbG9wIHlvdXIgcHJvY2VzcyBmcm9tIHNjcmF0Y2g7Ci15b3UgY2FuIHJldXNlIGV4aXN0aW5nIGNhcGFiaWxpdHkgcGF0dGVybnMgb3IgZXZlbiBjYXBhYmlsaXR5IHBhdHRlcm4gcGFydHMuCi1UaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIHBvcHVsYXRlIGEgcHJvY2VzcyB3aXRoIG1ldGhvZCBlbGVtZW50czo8dWw+PGxpPkJ5IGluY29ycG9yYXRpbmcgaW5kaXZpZHVhbCBtZXRob2QgZWxlbWVudHMgYnkgZHJhZ2dpbmcgdGhlIGVsZW1lbnRzIG9udG8KLWFuIGFjdGl2aXR5IGluIHRoZSBwcm9jZXNzLjwvbGk+Ci08bGk+QnkgaW5jbHVkaW5nIGFscmVhZHkgZGVmaW5lZCBjYXBhYmlsaXR5IHBhdHRlcm5zLjwvbGk+Ci08bGk+QnkgaW5jbHVkaW5nIHBhcnRzIG9mIGFscmVhZHkgZGVmaW5lZCBjYXBhYmlsaXR5IHBhdHRlcm5zLjwvbGk+Ci08bGk+QnkgY3JlYXRpbmcgZGVzY3JpcHRvcnMgZGlyZWN0bHkgaW4gdGhlIHByb2Nlc3MsIHdoaWNoIGFyZSBlaXRoZXIgdW5yZWxhdGVkCi10byBhbnkgbWV0aG9kIGNvbnRlbnQgb3IgcmVsYXRlZCB0byBtZXRob2QgY29udGVudCBhdCBhIGxhdGVyIHBvaW50IGluIHRpbWUuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxwPiBUbyBjcmVhdGUgYSBjYXBhYmlsaXR5IHBhdHRlcm46PC9wPgotPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PbmNlIHlvdSBoYXZlIHNlbGVjdGVkIG9yIGNyZWF0ZWQgYSBwcm9jZXNzIHBhY2thZ2UsIHJpZ2h0IGNsaWNrCi10aGUgPHN0cm9uZz5Qcm9jZXNzIFBhY2thZ2U8L3N0cm9uZz4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+TmV3IOKAkyZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9zdHJvbmc+LiBUaGUgTmV3IFByb2Nlc3MgQ29tcG9uZW50Ci1kaWFsb2cgYm94IGFwcGVhcnMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBuYW1lIGZvciB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGludG8gdGhlIDxzdHJvbmc+TmFtZTwvc3Ryb25nPiBmaWVsZAotYW5kIHRoZW4gc2VsZWN0IGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZyb20gdGhlIGRyb3AgZG93biBsaXN0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUaGUgcHJvY2VzcyBpcyBjcmVhdGVkIGFuZCB0aGUgcHJvY2VzcyBlZGl0b3IKLWlzIG9wZW5lZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIHByb2Nlc3MgZWRpdG9yLCB1bmRlciB0aGUgRGVzY3JpcHRpb24gdGFiLCBkb2N1bWVudCB5b3VyCi1wcm9jZXNzIHVzaW5nIHRoZSBhdmFpbGFibGUgdGV4dCBmaWVsZHMuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiB1c2UgdGhlCi1SaWNoIFRleHQgRWRpdG9yIHRvIGVkaXQgb3IgZW50ZXIgdGhlIHRleHQgZm9yIGFueSBmaWVsZCB0aGF0IGhhcyBhIHR3aXN0eQotc3ltYm9sIDxpbWcgc3JjPSJ0d2lzdHkgc3ltYm9sMS5KUEciIGFsdD0iIiAvPi4gU2ltcGx5IGNsaWNrCi10aGUgc3ltYm9sIHRvIGFjY2VzcyB0aGUgUmljaCBUZXh0IEVkaXRvci4gQ2xpY2sgdGhlIHN5bWJvbCBhZ2FpbiB0byBjbG9zZQotdGhlIFJpY2ggVGV4dCBFZGl0b3IuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIj5SaWNoIFRleHQgRWRpdG9yPC9hPjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RGVjaWRlIG9uIHlvdXIgcHJpbWFyeSBwcm9jZXNzIGF1dGhvcmluZyB2aWV3LiBZb3UgZGV2ZWxvcCBhIHByb2Nlc3MKLXVzaW5nIHRocmVlIGRpZmZlcmVudCB2aWV3czogPC9zcGFuPjx1bD48bGk+PHN0cm9uZz5Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L3N0cm9uZz46IERlZmluZSBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZQotaW4geW91ciBwcm9jZXNzLiBDcmVhdGUgaXRlcmF0aW9ucyBhbmQgYWN0aXZpdGllcyBmaXJzdCwgYW5kIHRoZW4gcG9wdWxhdGUKLXlvdXIgYWN0aXZpdGllcyBieSBhcHBseWluZyB0YXNrcyBmcm9tIHlvdXIgbWV0aG9kIGNvbnRlbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uCi1zZWUgPGEgaHJlZj0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9hPi48L2xpPgotPGxpPjxzdHJvbmc+VGVhbSBBbGxvY2F0aW9uPC9zdHJvbmc+OiBEZWZpbmUgd2hpY2ggdGVhbXMgYW5kIHJvbGVzIHNoYWxsIHBhcnRpY2lwYXRlCi1pbiBhY3Rpdml0aWVzIGFuZCB0aGVuIGZpbmQgcmVzcG9uc2libGUgd29yayBwcm9kdWN0cyBhbmQgdGFza3MgZnJvbSB0aGVyZS4KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0iZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sIj5EZXZlbG9wIGEgVGVhbSBBbGxvY2F0aW9uIFN0cnVjdHVyZTwvYT4uPC9saT4KLTxsaT48c3Ryb25nPldvcmsgUHJvZHVjdCBVc2FnZTwvc3Ryb25nPjogRGVmaW5lIHdoaWNoIHdvcmsgcHJvZHVjdHMgc2hvdWxkIGJlIGNyZWF0ZWQKLWluIGFjdGl2aXRpZXMgYW5kIGZpbmQgdGFza3MgYW5kIHJvbGVzIGZyb20gdGhlcmUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUiPkRldmVsb3AgYSBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlPC9hPi48L2xpPgotPC91bD4KLSA8cD5PbmNlIHlvdSBoYXZlIGNyZWF0ZWQgeW91ciBjYXBhYmlsaXR5IHBhdHRlcm4sIHlvdSBuZWVkIHRvIGFwcGx5Ci1pdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgPGEgaHJlZj0iYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNhcHBseWFjYXBhYmlsaXR5cGF0dGVybiI+QXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm48L2E+LjwvcD4KLTwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPHVsIGNsYXNzPSJ1bGxpbmtzIj4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3MuaHRtbCNwcm9jZXNzIj5Qcm9jZXNzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCNwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCNjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIj5DcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJvbGUuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJvbGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmVhNjkwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFyb2xlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgUm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXRhc2suaHRtbCNjcmVhdGVhdGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYXJvbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgUm9sZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYXJvbGUiPjxhIG5hbWU9ImNyZWF0ZWFyb2xlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgUm9sZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPkEgPHNwYW4gY2xhc3M9ImtleXdvcmQiPlJvbGU8L3NwYW4+IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywKLWFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgaW5kaXZpZHVhbHMuPC9wPgotWW91IHNob3VsZCBhbHdheXMKLWNyZWF0ZSBuZXcgbWV0aG9kIGNvbnRlbnQgaW4gYSA8YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPk1ldGhvZCBQbHVnLWluPC9hPiB0aGF0IHlvdSBwcm9kdWNlLjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gY3JlYXRlIGEgcm9sZTo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkV4cGFuZCB0aGUgY29udGVudCBwYWNrYWdlIGluIHdoaWNoIHlvdSB3YW50IHRvIGNyZWF0ZSB0aGUgcm9sZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgPHN0cm9uZz5Sb2xlczwvc3Ryb25nPiwgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+TmV3ICZndDsgUm9sZTwvc3Ryb25nPi4gVGhlCi1yb2xlIGVkaXRvciBhcHBlYXJzIHdpdGggdGhlIERlc2NyaXB0aW9uIHRhYiBzZXQgYXMgdGhlIGRlZmF1bHQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBOYW1lIGZpZWxkLCB0eXBlIGEgdW5pcXVlIG5hbWUgZm9yIHlvdXIgcm9sZS4gVGhlIHJvbGUgbmFtZQotaXMgdGhlIGZpbGUgbmFtZSB0aGF0IGFwcGVhcnMgaW4gdGhlIExpYnJhcnkgdmlldy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByZXNlbnRhdGlvbiBuYW1lIGZpZWxkLCB0eXBlIGEgcHJlc2VudGF0aW9uIG5hbWUuIFRoZSBwcmVzZW50YXRpb24KLW5hbWUgaXMgdGhlIG5hbWUgdGhhdCBhcHBlYXJzIGluIHlvdXIgcHVibGlzaGVkIGNvbnRlbnQgYW5kIGluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LiBZb3UgY2FuIGFsc28gbWFrZSB0aGlzIG5hbWUgYXBwZWFyIGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+IGJ5IHRvZ2dsaW5nIHRoZSA8c3Ryb25nPlNob3cgUHJlc2VudGF0aW9uIE5hbWVzPC9zdHJvbmc+IGJ1dHRvbgotaW4gdGhlIExpYnJhcnkgVmlldyB0b29sYmFyLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmllbGQsIHR5cGUgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUKLW5ldyBSb2xlLiA8L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIG5ldyBSb2xlIGluIHRoZSBNYWluIERlc2NyaXB0aW9uCi1maWVsZC4gVGhlIG1haW4gZGVzY3JpcHRpb24gaXMgYSBtb3JlIGRldGFpbGVkIHZlcnNpb24gb2YgdGhlIGRlc2NyaXB0aW9uCi15b3UgdHlwZWQgaW50byB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmllbGQuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHlvdSBjYW4gY3JlYXRlCi10ZXh0IGZvciB0aGUgZGVzY3JpcHRpb246PC9zcGFuPiA8dWw+PGxpPkRpcmVjdGx5LCBieSB0eXBpbmcgaXQgbWFudWFsbHkgaW4gdGhlIGVkaXRvci48L2xpPgotPGxpPkNvcHkgZnJvbSBhbm90aGVyIHNpbWlsYXIgcm9sZSBhbmQgdGhlbiBtb2RpZnkgYnkgdXNpbmcgdGhlIGVkaXRvci48L2xpPgotPGxpPkNvcHkgZnJvbSBhbiBIVE1MIHNvdXJjZSBzdWNoIGFzIGEgcHVibGlzaGVkIE9wZW5VUC9CYXNpYyBXZWIgc2l0ZS48L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2FuIHVzZSB0aGUgUmljaCBUZXh0IEVkaXRvciB0byBlZGl0IG9yIGVudGVyIHRoZSB0ZXh0IGZvcgotYW55IGZpZWxkIHRoYXQgaGFzIGEgdHdpc3R5IHN5bWJvbCA8aW1nIHNyYz0iY29sbGFwc2VkLmdpZiIgYWx0PSIiIC8+LiBTaW1wbHkgY2xpY2sgdGhlIHN5bWJvbCB0byBhY2Nlc3MgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIENsaWNrIHRoZQotc3ltYm9sIGFnYWluIHRvIGNsb3NlIHRoZSBSaWNoIFRleHQgRWRpdG9yLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0icmljaHRleHRlZGl0b3IuaHRtbCNyaWNodGV4dGVkaXRvciI+UmljaCBUZXh0IEVkaXRvcjwvYT4uPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5VbmRlciBWZXJzaW9uIEluZm9ybWF0aW9uLCBwcm92aWRlIGFueSBwZXJ0aW5lbnQgdmVyc2lvbiBpbmZvcm1hdGlvbgotYWJvdXQgdGhlIHJvbGUuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPldvcmsgUHJvZHVjdHM8L3N0cm9uZz4gdGFiIGFuZCB0aGVuIGNsaWNrIHRoZSA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24KLXRvIHRoZSByaWdodCBvZiB0aGUgIlJvbGUgaXMgcmVzcG9uc2libGUgZm9yOiIgZmllbGQuIFRoZSBTZWxlY3QgRGlhbG9nIGZvcgotV29yayBQcm9kdWN0cyBkaWFsb2cgb3BlbnMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIGZyb20gdGhlIGxpc3QuIEEgZGVzY3JpcHRpb24gb2YKLXRoZSB3b3JrIHByb2R1Y3QgeW91IHNlbGVjdCBhcHBlYXJzIGluIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmaWVsZCBhdCB0aGUKLWJvdHRvbSBvZiB0aGUgZGlhbG9nIGJveC48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUaGUgbGlzdCBvZiB3b3JrIHByb2R1Y3RzIGluIHRoZQotIldvcmsgcHJvZHVjdHMgdGhhdCBhcmUgb3V0cHV0IG9mIHRhc2tzIHRoYXQgdGhpcyByb2xlIHBlcmZvcm1zIiBmaWVsZCBpcwotY2FsY3VsYXRlZCBhbmQgY2Fubm90IGJlIGNoYW5nZWQgd2l0aCB0aGUgcm9sZSBlZGl0b3IuIEEgd29yayBwcm9kdWN0IGFwcGVhcnMKLWhlcmUgaWYgaXQgaXMgYW4gb3V0cHV0IG9mIGEgdGFzayB0aGF0IHRoZSByb2xlIHBlcmZvcm1zLjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVGhlIGRpYWxvZyBib3ggY2xvc2VzIGFuZCB0aGUgIlJvbGUgaXMgcmVzcG9uc2libGUKLWZvcjoiIGZpZWxkIGlzIHBvcHVsYXRlZC48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBTZWxlY3RlZCBlbGVtZW50cyBpbiBhbiBBZGQvUmVtb3ZlCi1zZWN0aW9uIGRpc3BsYXkgYm90aCB0aGUgZWxlbWVudCBuYW1lIChwbHVnLWluIG5hbWUpIGFuZCB0aGUgInBhdGgiIChwYWNrYWdlCi1uYW1lKSB0byB0aGF0IGVsZW1lbnQuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5HdWlkYW5jZTwvc3Ryb25nPiB0YWIuIFRoaXMgcGFydCBvZiB0aGUgZWRpdG9yIGFsbG93cyB5b3UKLXRvIGFkZCBhbmQgcmVtb3ZlIGd1aWRhbmNlIGZvciB0aGUgcm9sZS4gVG8gYWRkIGd1aWRhbmNlLCBjbGljayB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLAotc2VsZWN0IHRoZSBndWlkYW5jZSB5b3Ugd2FudCB0byBhZGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRvIHJlbW92ZSBndWlkYW5jZSwKLXNlbGVjdCBpdCBpbiB0aGUgR3VpZGFuY2UgZmllbGQgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4uIFdoZW4geW91IHNlbGVjdAotYSBndWlkYW5jZSBlbGVtZW50LCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGd1aWRhbmNlIGlzIGRpc3BsYXllZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+Q2F0ZWdvcmllczwvc3Ryb25nPiB0YWIuIEEgcm9sZSBjYW4gYmUgaW5jbHVkZWQgaW4gb25lCi1vciBtb3JlIHJvbGVzZXRzIGFuZCBhbnkgbnVtYmVyIG9mIGN1c3RvbSBjYXRlZ29yaWVzLiBPcGVuIHRoZSBhcHByb3ByaWF0ZQotU2VsZWN0IGRpYWxvZyBieSBjbGlja2luZyB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uIG5leHQgdG8gdGhlIGNhdGVnb3J5IGxpc3RzLgotWW91IGNhbiByZW1vdmUgYSByb2xlIGZyb20gYSBjYXRlZ29yeSBieSBzZWxlY3RpbmcgaXQgYW5kIHRoZW4gY2xpY2tpbmcgdGhlIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+IGJ1dHRvbi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+UHJldmlldzwvc3Ryb25nPiB0YWIgdG8gdmlldyB0aGUgbmV3bHkgY3JlYXRlZAotcm9sZSBhbmQgdGhlbiBzYXZlIGJ5IGNsb3NpbmcgdGhlIHRhYi48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIj5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGlua2xpc3QiPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXRhc2suaHRtbCNjcmVhdGVhdGFzayI+Q3JlYXRlIGEgVGFzazwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0Ij5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiPkNyZWF0ZSBHdWlkYW5jZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+PC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXRhc2suaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXRhc2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzEyZTIwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWF0YXNrLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgVGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYXRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgVGFzazwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYXRhc2siPjxhIG5hbWU9ImNyZWF0ZWF0YXNrIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgVGFzazwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPkEgdGFzayBpcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gRXZlcnkgdGFzayBpcyBhc3NpZ25lZCB0bwotYSBzcGVjaWZpYyByb2xlLiBUaGUgZ3JhbnVsYXJpdHkgb2YgYSB0YXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldwotZGF5cyBhbmQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgdW1iZXIgb2Ygd29yayBwcm9kdWN0cy48L3A+Ci1Zb3UKLXNob3VsZCBhbHdheXMgY3JlYXRlIG5ldyBtZXRob2QgY29udGVudCBpbiBhIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+IHRoYXQgeW91IHByb2R1Y2UuIDwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gY3JlYXRlIGEgdGFzazo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkV4cGFuZCB0aGUgY29udGVudCBwYWNrYWdlIGluIHdoaWNoIHlvdSB3YW50IHRvIGNyZWF0ZSB0aGUgdGFzay48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgPHN0cm9uZz5UYXNrczwvc3Ryb25nPiwgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+TmV3ICZndDsgVGFzazwvc3Ryb25nPi4gVGhlCi10YXNrIGVkaXRvciBhcHBlYXJzIHdpdGggdGhlIDxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz4gdGFiIHNldCBhcyB0aGUgZGVmYXVsdC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE5hbWUgZmllbGQsIHR5cGUgYSB1bmlxdWUgbmFtZSBmb3IgeW91ciB0YXNrLiB0aGUgdGFzayBuYW1lCi1pcyB0aGUgZmlsZSBuYW1lIHRoYXQgYXBwZWFycyBpbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByZXNlbnRhdGlvbiBuYW1lIGZpZWxkLCB0eXBlIGEgcHJlc2VudGF0aW9uIG5hbWUuIFRoZSBwcmVzZW50YXRpb24KLW5hbWUgaXMgdGhlIG5hbWUgdGhhdCBhcHBlYXJzIGluIHlvdXIgcHVibGlzaGVkIGNvbnRlbnQgYW5kIGluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+LgotWW91IGNhbiBhbHNvIG1ha2UgdGhpcyBuYW1lIGFwcGVhciBpbiB0aGUgTGlicmFyeSB2aWV3IGJ5IHRvZ2dsaW5nIHRoZSA8c3Ryb25nPlNob3cKLVByZXNlbnRhdGlvbiBOYW1lczwvc3Ryb25nPiBidXR0b24gaW4gdGhlIExpYnJhcnkgdmlldyB0b29sYmFyLjwvc3Bhbj4gPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIEJyaWVmIERlc2NyaXB0aW9uIGZpZWxkLCB0eXBlIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlCi1uZXcgdGFzay48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIG5ldyB0YXNrIGluIHRoZSBNYWluIERlc2NyaXB0aW9uCi1maWVsZC4gVGhlIG1haW4gZGVzY3JpcHRpb24gaXMgYSBtb3JlIGRldGFpbGVkIHZlcnNpb24gb2YgdGhlIGRlc2NyaXB0aW9uCi15b3UgdHlwZWQgaW50byB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmllbGQuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHlvdSBjYW4gY3JlYXRlCi10ZXh0IGZvciB0aGUgZGVzY3JpcHRpb246PC9zcGFuPiA8dWw+PGxpPkRpcmVjdGx5LCBieSB0eXBpbmcgaXQgbWFudWFsbHkgaW4gdGhlIGVkaXRvci48L2xpPgotPGxpPkNvcHkgZnJvbSBhbm90aGVyIHNpbWlsYXIgcm9sZSBhbmQgdGhlbiBtb2RpZnkgYnkgdXNpbmcgdGhlIGVkaXRvci48L2xpPgotPGxpPkNvcHkgZnJvbSBhbiBIVE1MIHNvdXJjZSBzdWNoIGFzIGEgcHVibGlzaGVkIE9wZW5VUC9CYXNpYyBXZWIgc2l0ZS48L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2FuIHVzZSB0aGUgUmljaCBUZXh0IEVkaXRvciB0byBlZGl0IG9yIGVudGVyIHRoZSB0ZXh0IGZvcgotYW55IGZpZWxkIHRoYXQgaGFzIGEgdHdpc3R5IHN5bWJvbCA8aW1nIHNyYz0iY29sbGFwc2VkLmdpZiIgYWx0PSIiIC8+LiBTaW1wbHkgY2xpY2sgdGhlIHN5bWJvbCB0byBhY2Nlc3MgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIENsaWNrIHRoZQotc3ltYm9sIGFnYWluIHRvIGNsb3NlIHRoZSBSaWNoIFRleHQgRWRpdG9yLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0icmljaHRleHRlZGl0b3IuaHRtbCNyaWNodGV4dGVkaXRvciI+UmljaCBUZXh0IEVkaXRvcjwvYT4uPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Db21wbGV0ZSB0aGUgb3RoZXIgdGFzayBzcGVjaWZpYyBmaWVsZHMgaW4gRGV0YWlsIEluZm9ybWF0aW9uIGFzCi1uZWVkZWQuIFNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5Ij5WYXJpYWJpbGl0eTwvYT4gZm9yCi1pbmZvcm1hdGlvbiBvbiBjcmVhdGluZyB2YXJpYWJpbGl0eS4gPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPlN0ZXBzPC9zdHJvbmc+IHRhYi4gVGhlIFN0ZXBzIEVkaXRvciBhcHBlYXJzLjwvc3Bhbj4gPGRpdiBjbGFzcz0icCI+QQotdGFzayBjYW4gaGF2ZSBhIHNlcmllcyBvZiBzdGVwcyB0aGF0IGRldGFpbCBob3cgdG8gcGVyZm9ybSB0aGF0IHRhc2suIFRoZQotU3RlcCBFZGl0b3IgYWxsb3dzIHlvdSB0bzo8dWw+PGxpPkNyZWF0ZSBhIG5ldyBzdGVwPHVsPjxsaT5DbGljayB0aGUgPHN0cm9uZz5OZXc8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08bGk+R2l2ZSB0aGUgVGFzayBhIG5hbWUgaW4gdGhlIDxzdHJvbmc+TmFtZTwvc3Ryb25nPiBmaWVsZC48L2xpPgotPGxpPkRlc2NyaWJlIHRoZSBUYXNrIGluIHRoZSA8c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+IGZpZWxkLjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5SZW1vdmUgYSBzdGVwPHVsPjxsaT5TZWxlY3QgdGhlIHN0ZXAgdG8gcmVtb3ZlIGluIHRoZSA8c3Ryb25nPlN0ZXBzPC9zdHJvbmc+IGZpZWxkLjwvbGk+Ci08bGk+Q2xpY2sgdGhlIDxzdHJvbmc+RGVsZXRlPC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+TW92ZSBhIHN0ZXAgdXAgdGhlIGxpc3Q8dWw+PGxpPlNlbGVjdCB0aGUgc3RlcCB5b3Ugd2FudCB0byBtb3ZlIHVwLjwvbGk+Ci08bGk+Q2xpY2sgdGhlIDxzdHJvbmc+TW92ZSBVcDwvc3Ryb25nPiBidXR0b24uPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPk1vdmUgYSBzdGVwIGRvd24gdGhlIGxpc3Q8dWw+PGxpPlNlbGVjdCB0aGUgc3RlcCB5b3Ugd2FudCB0byBtb3ZlIGRvd24uPC9saT4KLTxsaT5DbGljayB0aGUgPHN0cm9uZz5Nb3ZlIERvd248L3N0cm9uZz4gYnV0dG9uPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+Um9sZXM8L3N0cm9uZz4gdGFiLiBUaGlzIHBhcnQgb2YgdGhlIGVkaXRvciBhbGxvd3MgeW91Ci10byBkZWZpbmUgdGhlIHJvbGVzIHRoYXQgcGVyZm9ybSB0aGUgdGFzay4gWW91IHNob3VsZCBzZWxlY3QgYSByb2xlIGFzIHRoZQotUGVyZm9ybWluZyBSb2xlIGZvciB0aGlzIHRhc2suIFlvdSBjYW4gYWxzbyBhZGQgb25lIG9yIG1vcmUgcm9sZXMgYXMgQWRkaXRpb25hbAotUGVyZm9ybWVycy4gVG8gYWRkIGEgcm9sZSwgY2xpY2sgdGhlIDxzdHJvbmc+U2VsZWN0PC9zdHJvbmc+IG9yIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbiBhcwotYXBwcm9wcmlhdGUsIHNlbGVjdCB0aGUgcm9sZSB5b3Ugd2FudCB0byBhZGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRvCi1yZW1vdmUgYSByb2xlLCBzZWxlY3QgaXQgaW4gdGhlIEd1aWRhbmNlIGJveCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5DbGVhcjwvc3Ryb25nPiBvciA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiBhcwotYXBwcm9wcmlhdGUuIFdoZW4geW91IHNlbGVjdCBhIHJvbGUgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoYXQgcm9sZSBpcwotZGlzcGxheWVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzPC9zdHJvbmc+IHRhYi4gVGhpcyBwYXJ0IG9mIHRoZSBlZGl0b3IgYWxsb3dzCi15b3UgdG8gZGVmaW5lIHRoZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgdGhpcyB0YXNrLgotWW91IGNhbiBzZWxlY3QgYW55IG51bWJlciBvZiB3b3JrIHByb2R1Y3RzIGFzIE1hbmRhdG9yeSBJbnB1dHMsIE9wdGlvbmFsIElucHV0cywKLWFuZCBPdXRwdXRzLiBUbyBhZGQgYSB3b3JrIHByb2R1Y3QsIGNsaWNrIHRoZSBhcHByb3ByaWF0ZSA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24sCi1zZWxlY3QgdGhlIHdvcmsgcHJvZHVjdHMgeW91IHdhbnQgdG8gYWRkLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUbyByZW1vdmUKLWEgd29yayBwcm9kdWN0LCBzZWxlY3QgaXQgaW4gdGhlIGFwcHJvcHJpYXRlIGJveCBhbmQgdGhlbiBjbGljayB0aGUgY29ycmVzcG9uZGluZyA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiBidXR0b24uCi1XaGVuIHlvdSBzZWxlY3QgYSB3b3JrIHByb2R1Y3QgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSB3b3JrIHByb2R1Y3QgaXMKLWRpc3BsYXllZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+R3VpZGFuY2U8L3N0cm9uZz4gdGFiLiBUaGlzIHBhcnQgb2YgdGhlIGVkaXRvciBhbGxvd3MgeW91Ci10byBhZGQgYW5kIHJlbW92ZSBndWlkYW5jZSBmb3IgdGhlIHRhc2suIFRvIGFkZCBndWlkYW5jZSwgY2xpY2sgdGhlIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbiwKLXNlbGVjdCB0aGUgZ3VpZGFuY2UgeW91IHdhbnQgdG8gYWRkLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUbyByZW1vdmUgZ3VpZGFuY2UsCi1zZWxlY3QgaXQgaW4gdGhlIEd1aWRhbmNlIGJveCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPi4gV2hlbiB5b3Ugc2VsZWN0Ci1hIGd1aWRhbmNlIGVsZW1lbnQgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBndWlkYW5jZSBpcyBkaXNwbGF5ZWQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPkNhdGVnb3JpZXM8L3N0cm9uZz4gdGFiLiBBIHRhc2sgY2FuIGJlIGluY2x1ZGVkIGluIG9uZQotZGlzY2lwbGluZSBhbmQgYW55IG51bWJlciBvZiBjdXN0b20gY2F0ZWdvcmllcy4gT3BlbiB0aGUgU2VsZWN0IGRpYWxvZyBieQotY2xpY2tpbmcgdGhlIGFwcHJvcHJpYXRlIDxzdHJvbmc+U2VsZWN0PC9zdHJvbmc+IG9yIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbiBuZXh0IHRvIHRoZSBjYXRlZ29yeQotbGlzdHMuIFNlbGVjdCBhIHNpbmdsZSBkaXNjaXBsaW5lIG9yIGFueSBudW1iZXIgb2YgY3VzdG9tIGNhdGVnb3JpZXMsIGFuZAotdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBZb3UgY2FuIHJlbW92ZSBhIHRhc2sgZnJvbSBhIGNhdGVnb3J5IGJ5IHNlbGVjdGluZyBpdAotYW5kIHRoZW4gY2xpY2tpbmcgdGhlIGFwcHJvcHJpYXRlIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+IGJ1dHRvbi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+UHJldmlldzwvc3Ryb25nPiB0YWIgdG8gdmlldyB0aGUgbmV3bHkgY3JlYXRlZCB0YXNrIGFzCi1pdCB3aWxsIGFwcGVhciBpbiBhIHB1Ymxpc2hlZCBXZWIgcGFnZSwgYW5kIHRoZW4gc2F2ZSBieSBjbG9zaW5nIHRoZSB0YWIuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIj5DcmVhdGUgYSBSb2xlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSI+Q3JlYXRlIEd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWF3b3JrcHJvZHVjdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1Zjc0ZjkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgV29yayBQcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXRhc2suaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWF3b3JrcHJvZHVjdCI+PGEgbmFtZT0iY3JlYXRlYXdvcmtwcm9kdWN0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PGRpdiBjbGFzcz0icCI+V29yayBwcm9kdWN0IGlzIGEgZ2VuZXJhbCB0ZXJtIGZvciB0YXNrIGlucHV0cyBhbmQgb3V0cHV0cy4gVGhlcmUKLWFyZSB0aHJlZSB0eXBlcyBvZiB3b3JrIHByb2R1Y3Q6PHVsPjxsaT48YSBocmVmPSJhcnRpZmFjdC5odG1sI2FydGlmYWN0Ij5BcnRpZmFjdDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im91dGNvbWUuaHRtbCNvdXRjb21lIj5PdXRjb21lPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iZGVsaXZlcmFibGUuaHRtbCNkZWxpdmVyYWJsZSI+RGVsaXZlcmFibGU8L2E+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLVlvdSBzaG91bGQgYWx3YXlzIGNyZWF0ZSBuZXcgbWV0aG9kIGNvbnRlbnQgaW4gYSA8YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPk1ldGhvZCBQbHVnLWluPC9hPiB0aGF0IHlvdSBwcm9kdWNlLjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gY3JlYXRlIGEgd29yayBwcm9kdWN0OjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RXhwYW5kIHRoZSBDb250ZW50IFBhY2thZ2UgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIHRoZSB3b3JrCi1wcm9kdWN0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayA8c3Ryb25nPldvcmsgUHJvZHVjdHM8L3N0cm9uZz4sIGFuZCB0aGVuIHNlbGVjdCBvbmUgb2YgdGhlIGZvbGxvd2luZzo8L3NwYW4+IDx1bD48bGk+PHN0cm9uZz5OZXcgJmd0OyBBcnRpZmFjdDwvc3Ryb25nPjwvbGk+Ci08bGk+PHN0cm9uZz5OZXcgJmd0OyBPdXRjb21lPC9zdHJvbmc+PC9saT4KLTxsaT48c3Ryb25nPk5ldyAmZ3Q7IERlbGl2ZXJhYmxlPC9zdHJvbmc+PC9saT4KLTwvdWw+Ci1UaGUgV29yayBQcm9kdWN0IGVkaXRvciBmb3IgdGhlIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IHlvdSBhcmUKLWNyZWF0aW5nIGFwcGVhcnMgd2l0aCB0aGUgRGVzY3JpcHRpb24gdGFiIHNldCBhcyB0aGUgZGVmYXVsdC48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTmFtZSBmaWVsZCwgdHlwZSBhIHVuaXF1ZSBuYW1lIGZvciB5b3VyIHdvcmsgcHJvZHVjdC4gVGhlCi13b3JrIHByb2R1Y3QgbmFtZSBpcyB0aGUgZmlsZSBuYW1lIHRoYXQgYXBwZWFycyBpbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPi4gPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcmVzZW50YXRpb24gbmFtZSBmaWVsZCwgdHlwZSBhIHByZXNlbnRhdGlvbiBuYW1lLiB0aGUgcHJlc2VudGF0aW9uCi1uYW1lIGlzIHRoZSBuYW1lIHRoYXQgYXBwZWFycyBpbiB5b3VyIHB1Ymxpc2hlZCBjb250ZW50IGFuZCBpbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPi4gWW91IGNhbiBhbHNvIG1ha2UgdGhpcyBuYW1lIGFwcGVhciBpbiB0aGUgbGlicmFyeQotdmlldyBieSB0b2dnbGluZyB0aGUgPHN0cm9uZz5TaG93IFByZXNlbnRhdGlvbiBOYW1lczwvc3Ryb25nPiBidXR0b24gaW4gdGhlIGxpYnJhcnkKLXZpZXcgdG9vbGJhci48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIEJyaWVmIERlc2NyaXB0aW9uIGZpZWxkLCB0eXBlIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlCi1uZXcgd29yayBwcm9kdWN0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgbmV3IHdvcmsgcHJvZHVjdCBpbiB0aGUKLU1haW4gRGVzY3JpcHRpb24gZmllbGQuIFRoZSBtYWluIGRlc2NyaXB0aW9uIGlzIGEgbW9yZSBkZXRhaWxlZCB2ZXJzaW9uIG9mCi10aGUgZGVzY3JpcHRpb24geW91IHR5cGVkIGludG8gdGhlIEJyaWVmIERlc2NyaXB0aW9uIGZpZWxkLiBUaGVyZSBhcmUgdGhyZWUKLXdheXMgdG8gY3JlYXRlIHRleHQgZm9yIHRoZSBkZXNjcmlwdGlvbjo8L3NwYW4+IDx1bD48bGk+RGlyZWN0bHksIGJ5IHR5cGluZyBpdCBtYW51YWxseSBpbiB0aGUgZWRpdG9yLjwvbGk+Ci08bGk+Q29weSBmcm9tIGFub3RoZXIgc2ltaWxhciB3b3JrIHByb2R1Y3QgYW5kIHRoZW4gbW9kaWZ5IHVzaW5nIHRoZSBlZGl0b3IuPC9saT4KLTxsaT5Db3B5IGZyb20gYW4gSFRNTCBzb3VyY2UsIHN1Y2ggYXMgYSBwdWJsaXNoZWQgT3BlblVQL0Jhc2ljIFdlYiBzaXRlLjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdSBjYW4gdXNlIHRoZSBSaWNoIFRleHQgRWRpdG9yIHRvIGVkaXQgb3IgZW50ZXIgdGhlIHRleHQgZm9yCi1hbnkgZmllbGQgdGhhdCBoYXMgYSB0d2lzdHkgc3ltYm9sIDxpbWcgc3JjPSJjb2xsYXBzZWQuZ2lmIiBhbHQ9IiIgLz4uIFNpbXBseSBjbGljayB0aGUgc3ltYm9sIHRvIGFjY2VzcyB0aGUgUmljaCBUZXh0IEVkaXRvci4gQ2xpY2sgdGhlCi1zeW1ib2wgYWdhaW4gdG8gY2xvc2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIj5SaWNoIFRleHQgRWRpdG9yPC9hPi48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVuZGVyIDxzdHJvbmc+Tm90YXRpb248L3N0cm9uZz4sIHByb3ZpZGUgYW55IG5vdGF0aW9ucyBhYm91dCB0aGUgV29yayBQcm9kdWN0Ljwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEFydGlmYWN0cyBhbmQgRGVsaXZlcmFibGVzIGNvbnRhaW4gdGhlIE5vdGF0aW9uIGZpZWxkcywgd2hpbGUKLU91dGNvbWVzIGRvIG5vdC48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVuZGVyIDxzdHJvbmc+SWNvbjwvc3Ryb25nPiB5b3UgY2FuIHNlbGVjdCBhIG5vZGUgaWNvbiB0byBhcHBlYXIgd2l0aCB0aGUKLXdvcmsgcHJvZHVjdCBpbiB0aGUgTGlicmFyeSBhbmQgQ29uZmlndXJhdGlvbiB2aWV3cyBhbmQgaW4gdGhlIHRyZWUgYnJvd3NlcgotaW4gYSBwdWJsaXNoZWQgV2ViIHNpdGUuIFRoZSBub2RlIGljb24gc2hvdWxkIGJlIDE2IHggMTYgcGl4ZWxzLiBZb3UgY2FuIGFsc28KLXNlbGVjdCBhIFNoYXBlIGljb24gdG8gYXBwZWFyIGF0IHRoZSB0b3Agb2YgdGhlIHB1Ymxpc2hlZCBXZWIgcGFnZSBmb3IgdGhlCi13b3JrIHByb2R1Y3QuIHRoZSBTaGFwZSBpY29uIHNob3VsZCBiZSAzMiB4IDMyIHBpeGVscy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q29tcGxldGUgdGhlIG90aGVyIHdvcmsgcHJvZHVjdCBzcGVjaWZpYyBmaWVsZHMgYXMgbmVlZGVkLiBTZWUgPGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSI+VmFyaWFiaWxpdHk8L2E+IGZvciBpbmZvcm1hdGlvbgotb24gYWRkaW5nIHZhcmlhYmlsaXR5IHRvIHlvdXIgd29yayBwcm9kdWN0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzdHJvbmc+R3VpZGFuY2U8L3N0cm9uZz4gdGFiLiBUaGlzIHBhcnQgb2YgdGhlIGVkaXRvciBhbGxvd3MKLXlvdSB0byBhZGQgYW5kIHJlbW92ZSBndWlkYW5jZSBmb3IgdGhlIHdvcmsgcHJvZHVjdC4gVG8gYWRkIGd1aWRhbmNlLCBjbGljawotdGhlIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbiwgc2VsZWN0IHRoZSBndWlkYW5jZSB5b3Ugd2FudCB0byBhZGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uCi1UbyByZW1vdmUgZ3VpZGFuY2UsIHNlbGVjdCBpdCBpbiB0aGUgR3VpZGFuY2UgZmllbGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+LgotV2hlbiB5b3Ugc2VsZWN0IGEgZ3VpZGFuY2UgZWxlbWVudCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGd1aWRhbmNlIGlzCi1kaXNwbGF5ZWQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHN0cm9uZz5DYXRlZ29yaWVzPC9zdHJvbmc+IHRhYi4gQSB3b3JrIHByb2R1Y3QgY2FuIGJlIGluY2x1ZGVkCi1pbiBvbmUgZG9tYWluLCBhbnkgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdCB0eXBlcywgYW5kIGFueSBudW1iZXIgb2YgY3VzdG9tCi1jYXRlZ29yaWVzLiBPcGVuIHRoZSBhcHByb3ByaWF0ZSBTZWxlY3QgZGlhbG9nIGJ5IGNsaWNraW5nIHRoZSA8c3Ryb25nPlNlbGVjdDwvc3Ryb25nPiBvciA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24KLW5leHQgdG8gdGhlIGNhdGVnb3J5IGxpc3RzLiBTZWxlY3QgYSBzaW5nbGUgZG9tYWluIG9yIGFueSBudW1iZXIgb2Ygd29yayBwcm9kdWN0Ci1raW5kcyBvciBjdXN0b20gY2F0ZWdvcmllcyBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBZb3UgY2FuIHJlbW92ZSBhIHdvcmsKLXByb2R1Y3QgZnJvbSBhIGNhdGVnb3J5IGJ5IHNlbGVjdGluZyBpdCBhbmQgdGhlbiBjbGlja2luZyB0aGUgYXBwcm9wcmlhdGUgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gYnV0dG9uLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB0aGUgd29yayBwcm9kdWN0IGlzIGEgZGVsaXZlcmFibGUsIHlvdSBjYW4gZGVmaW5lIHdoYXQgdGhlIGRlbGl2ZXJhYmxlCi1jb25zaXN0cyBvZiBvbiB0aGUgRGVsaXZlcmFibGUgUGFydHMgdGFiLiBDbGljayB0aGUgPHN0cm9uZz5EZWxpdmVyYWJsZSBQYXJ0czwvc3Ryb25nPiB0YWIuCi1UaGlzIHBhcnQgb2YgdGhlIGVkaXRvciBvbmx5IGFwcGVhcnMgZm9yIGRlbGl2ZXJhYmxlcyBhbmQgaXQgYWxsb3dzIHlvdSB0bwotYWRkIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgcGFydCBvZiB0aGUgZGVsaXZlcmFibGUuIFRvIGFkZCB3b3JrIHByb2R1Y3RzLAotY2xpY2sgdGhlIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbiwgc2VsZWN0IHRoZSB3b3JrIHByb2R1Y3RzIHlvdSB3YW50IHRvIGFkZCwgYW5kCi10aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRvIHJlbW92ZSBhIHdvcmsgcHJvZHVjdCwgc2VsZWN0IGl0IGluIHRoZSB3b3JrIHByb2R1Y3RzCi1hcyBkZWxpdmVyYWJsZSBwYXJ0czogZmllbGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+LiBXaGVuIHlvdSBzZWxlY3QKLWEgd29yayBwcm9kdWN0IHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgd29yayBwcm9kdWN0IGlzIGRpc3BsYXllZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3Ryb25nPlByZXZpZXc8L3N0cm9uZz4gdGFiIHRvIHZpZXcgdGhlIG5ld2x5IGNyZWF0ZWQgd29yayBwcm9kdWN0LAotYW5kIHRoZW4gc2F2ZSBieSBjbG9zaW5nIHRoZSB0YWIuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIHRpdGxlPSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iPlZhcmlhYmlsaXR5PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50Ij5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiPkNyZWF0ZSBhIFJvbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF0YXNrLmh0bWwiPkNyZWF0ZSBhIFRhc2s8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiPkNyZWF0ZSBHdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWd1aWRhbmNlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWd1aWRhbmNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5ZjMzMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVndWlkYW5jZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBHdWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyb2xlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF0YXNrLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBHdWlkYW5jZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlZ3VpZGFuY2UiPjxhIG5hbWU9ImNyZWF0ZWd1aWRhbmNlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIEd1aWRhbmNlPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+R3VpZGFuY2UgaXMgYSBnZW5lcmFsIHRlcm0gZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byA8YSBocmVmPSJyb2xlLmh0bWwjcm9sZSI+Um9sZTwvYT4sIDxhIGhyZWY9InRhc2suaHRtbCN0YXNrIj5UYXNrPC9hPiwgYW5kIDxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwiPldvcmsgUHJvZHVjdDwvYT4uIEd1aWRhbmNlCi1wcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBob3cgdG8gcGVyZm9ybSB5b3VyIHJvbGUsIGhvdyB0byBjcmVhdGUgYSB3b3JrIHByb2R1Y3QsCi1ob3cgdG8gcGVyZm9ybSB5b3VyIHRhc2ssIGFuZCBzbyBvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPi48L3A+Ci08cD5Zb3Ugc2hvdWxkIGFsd2F5cyBjcmVhdGUgbmV3IDxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPiBpbiBhIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+IHRoYXQKLXlvdSBwcm9kdWNlLjwvcD4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gY3JlYXRlPHN0cm9uZz5HdWlkYW5jZTwvc3Ryb25nPjo8L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkV4cGFuZCB0aGUgQ29udGVudCBQYWNrYWdlIGluIHdoaWNoIHlvdSB3YW50IHRvIGNyZWF0ZSBHdWlkYW5jZQotdW50aWwgeW91IHNlZSB0aGUgTWV0aG9kIEVsZW1lbnRzIChSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMsIEd1aWRhbmNlKS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgPHN0cm9uZz5HdWlkYW5jZTwvc3Ryb25nPiBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk5ldyAmZ3Q7ICJndWlkYW5jZSB0eXBlIjwvc3Ryb25nPi4KLVRoZSBndWlkYW5jZSBlZGl0b3IgZm9yIHRoYXQgcGFydGljdWxhciBndWlkYW5jZSB0eXBlIG9wZW5zLiA8L3NwYW4+IDxkaXYgY2xhc3M9InAiPlRoZQotZm9sbG93aW5nIGd1aWRhbmNlIHR5cGVzIGhhdmUgdGhlIHNhbWUgZWRpdG9yIHdoaWNoIGluY2x1ZGVzIGEgRGVzY3JpcHRpb24KLXRhYiBhbmQgYSBQcmV2aWV3IHRhYjo8dWw+PGxpPjxhIGhyZWY9ImNvbmNlcHQuaHRtbCNjb25jZXB0Ij5Db25jZXB0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iZXhhbXBsZS5odG1sI2V4YW1wbGUiPkV4YW1wbGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJndWlkZWxpbmUuaHRtbCNndWlkZWxpbmUiPkd1aWRlbGluZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9InJlcG9ydC5odG1sI3JlcG9ydCI+UmVwb3J0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icmV1c2FibGVhc3NldC5odG1sI3JldXNhYmxlYXNzZXQiPlJldXNhYmxlIEFzc2V0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icm9hZG1hcC5odG1sI3JvYWRtYXAiPlJvYWRtYXA8L2E+PC9saT4KLTxsaT48YSBocmVmPSJzdXBwb3J0aW5nbWF0ZXJpYWwuaHRtbCI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYT48L2xpPgotPGxpPjxhIGhyZWY9InRlcm1kZWZpbml0aW9uLmh0bWwjdGVybWRlZmluaXRpb24iPlRlcm0gRGVmaW5pdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9InRvb2xtZW50b3IuaHRtbCN0b29sbWVudG9yIj5Ub29sIE1lbnRvcjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IndoaXRlcGFwZXIuaHRtbCN3aGl0ZXBhcGVyIj5XaGl0ZXBhcGVyPC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Vc2UgdGhlIGZpZWxkcyBpbiB0aGUgY29udGVudCBlbGVtZW50IGVkaXRvciB0byBzcGVjaWZ5IHRoZSBndWlkYW5jZQotZGV0YWlscy4gU3RhcnQgYnkgYXNzaWduaW5nIGEgdW5pcXVlIG5hbWUgdG8gdGhlIGd1aWRhbmNlIGVsZW1lbnQgYWxvbmcgd2l0aAotYSBwcmVzZW50YXRpb24gbmFtZSB0aGF0IGlzIHVzZWQgYXMgdGhlIGV4dGVybmFsIHZpc2libGUgbmFtZSB3aGVuIG90aGVyIGVsZW1lbnRzCi1yZWZlciB0byB0aGlzIGVsZW1lbnQsIG9yIHdoZW4gdGhlIGVsZW1lbnQgaXMgcHVibGlzaGVkLiBFdmVyeSBndWlkYW5jZSB0eXBlCi1oYXMgc3BlY2lmaWMgY29udGVudCBmaWVsZHMgaW4gdGhlIGNvbnRlbnQgZWRpdG9yIHRoYXQgYXJlIGRpc3RyaWJ1dGVkIG92ZXIKLXR3byBvciBtb3JlIHN0YWNrZWQgdGFicy4gVXNlIHRoZSBjb250ZW50IGZpZWxkcyB0byBkZXNjcmliZSB5b3VyIGd1aWRhbmNlCi10eXBlLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdSBjYW4gdXNlIHRoZSBSaWNoIFRleHQgRWRpdG9yIHRvIGVkaXQgb3IgZW50ZXIKLXRoZSB0ZXh0IGZvciBhbnkgZmllbGQgdGhhdCBoYXMgYSB0d2lzdHkgc3ltYm9sIDxpbWcgc3JjPSJjb2xsYXBzZWQuZ2lmIiBhbHQ9IiIgLz4uIFNpbXBseSBjbGljayB0aGUgc3ltYm9sIHRvIGFjY2VzcyB0aGUgUmljaCBUZXh0IEVkaXRvci4KLUNsaWNrIHRoZSBzeW1ib2wgYWdhaW4gdG8gY2xvc2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIEZvciBtb3JlIGluZm9ybWF0aW9uCi1zZWUgPGEgaHJlZj0icmljaHRleHRlZGl0b3IuaHRtbCNyaWNodGV4dGVkaXRvciI+UmljaCBUZXh0IEVkaXRvcjwvYT4uPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgSWNvbiBzZWN0aW9uLCBzZWxlY3QgYSBOb2RlIGljb24gdG8gYXBwZWFyIHdpdGggdGhlIHdvcmsKLXByb2R1Y3QgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gYW5kIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4gYW5kCi1pbiB0aGUgdHJlZSBicm93c2VyIGluIGEgcHVibGlzaGVkIFdlYiBzaXRlLiBUaGUgbm9kZSBpY29uIHNob3VsZCBiZSAxNiB4Ci0xNiBwaXhlbHMuIFlvdSBjYW4gYWxzbyBzZWxlY3QgYSBTaGFwZSBpY29uIHRvIGFwcGVhciBhdCB0aGUgdG9wIG9mIHRoZSBwdWJsaXNoZWQKLXBhZ2UgZm9yIHRoZSB3b3JrIHByb2R1Y3QuIFRoZSBzaGFwZSBpY29uIHNob3VsZCBiZSAzMiB4IDMyIHBpeGVscy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3Ryb25nPlByZXZpZXc8L3N0cm9uZz4gdGFiIHRvIHZpZXcgdGhlIG5ld2x5IGNyZWF0ZWQgd29yayBwcm9kdWN0Ci1hbmQgdGhlbiBzYXZlIGJ5IGNsb3NpbmcgdGhlIHRhYi48L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5JdCBpcyBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIHR5cGVzIG9mIHNvbWUgdHlwZXMgb2YgZ3VpZGFuY2UgdG8gYQotbGltaXRlZCBudW1iZXIgb2Ygb3RoZXIgZ3VpZGFuY2UgdHlwZXMuIFRvIGNoYW5nZSBhIGd1aWRhbmNlIHR5cGUsIGNsaWNrIHRoZSA8c3Ryb25nPkNoYW5nZQotVHlwZTwvc3Ryb25nPiBidXR0b24gYW5kIHNlbGVjdCBhbiBhdmFpbGFibGUgbmV3IHR5cGUuPHA+SWYgdGhlIHR5cGUgb2YgZ3VpZGFuY2UKLWlzIGEgPGEgaHJlZj0icHJhY3RpY2UuaHRtbCNwcmFjdGljZSI+UHJhY3RpY2U8L2E+LCB5b3UgY2FuIGFkZAotcmVmZXJlbmNlcyB0byBvdGhlciBlbGVtZW50cy4gSWYgdGhlIGd1aWRhbmNlIGlzIGEgPGEgaHJlZj0idGVtcGxhdGUuaHRtbCI+VGVtcGxhdGU8L2E+LAoteW91IGNhbiBhdHRhY2ggYSBmaWxlIHRvIHRoZSBndWlkYW5jZS48L3A+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhcm9sZS5odG1sIj5DcmVhdGUgYSBSb2xlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhdGFzay5odG1sIj5DcmVhdGUgYSBUYXNrPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlbWV0aG9kY29udGVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMWYyNmZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlbWV0aG9kY29udGVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIE1ldGhvZCBDb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhdGFzay5odG1sI2NyZWF0ZWF0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJvbGUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXRhc2suaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWd1aWRhbmNlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQiPjxhIG5hbWU9ImNyZWF0ZW1ldGhvZGNvbnRlbnQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5NZXRob2QgY29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLAotZGVzY3JpYmluZyBob3cgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZQotcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gUHJvY2Vzc2VzIHRha2UgdGhlCi1tZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkCi10byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy48L3A+Ci08cD5NZXRob2QgY29udGVudCBlbGVtZW50cyBhcmU6PC9wPgotPHVsPjxsaT48YSBocmVmPSJ0YXNrLmh0bWwjdGFzayI+VGFzazwvYT48L2xpPgotPGxpPjxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5Sb2xlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCI+R3VpZGFuY2U8L2E+PC9saT4KLTwvdWw+Ci1DbGljayBoZXJlIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IDxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPi48L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGNyZWF0ZSBtZXRob2QgY29udGVudDo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+LAotZXhwYW5kIHRoZSBjb250ZW50IHBhY2thZ2UgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIG5ldyBtZXRob2QgY29udGVudC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgdGhlIGZvbGRlciBjb250YWluaW5nIHRoZSB0eXBlIG9mIG1ldGhvZCBlbGVtZW50IHlvdQotd2FudCB0byBjcmVhdGUsIGNsaWNrIDxzdHJvbmc+TmV3PC9zdHJvbmc+IGFuZCB0aGVuIHNlbGVjdCB0aGUgZWxlbWVudCB0aGF0IGFwcGVhcnMuCi1UaGUgbmV3IGVsZW1lbnQgaXMgY3JlYXRlZCBhbmQgaXRzIHJlc3BlY3RpdmUgZWRpdG9yIG9wZW5zLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEZvcgotV29yayBQcm9kdWN0cywgY2hvb3NlIGJldHdlZW4gQXJ0aWZhY3QsIE91dGNvbWUsIG9yIERlbGl2ZXJhYmxlLiBGb3IgR3VpZGFuY2UsCi1jaG9vc2UgZnJvbSB0aGUgbGlzdCBvZiBndWlkYW5jZSB0eXBlcy48L2Rpdj4KLTwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPHVsIGNsYXNzPSJ1bGxpbmtzIj4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iY3JlYXRlYXJvbGUuaHRtbCI+Q3JlYXRlIGEgUm9sZTwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9ImNyZWF0ZWF0YXNrLmh0bWwiPkNyZWF0ZSBhIFRhc2s8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iY3JlYXRlZ3VpZGFuY2UuaHRtbCI+Q3JlYXRlIEd1aWRhbmNlPC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCI+VmFyaWFiaWxpdHk8L2E+PC9zdHJvbmc+PGJyIC8+Ci1WYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2UKLW9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nCi10aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcKLXRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC48L2xpPgotPC91bD4KLQotPGRpdiBjbGFzcz0ibGlua2xpc3QiPgotPGRpdj48YSBocmVmPSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIj5DcmVhdGUgYSBSb2xlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhdGFzay5odG1sI2NyZWF0ZWF0YXNrIj5DcmVhdGUgYSBUYXNrPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIj5DcmVhdGUgR3VpZGFuY2U8L2E+PC9kaXY+PC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3V0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGNmMTFkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2N1dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RlbGl2ZXJhYmxlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RlbGl2ZXJhYmxlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzYjI2NmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZWxpdmVyYWJsZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGVsaXZlcmFibGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXJ0aWZhY3QuaHRtbCNhcnRpZmFjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ib3V0Y29tZS5odG1sI291dGNvbWUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGVsaXZlcmFibGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RGVsaXZlcmFibGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImRlbGl2ZXJhYmxlIj48YSBuYW1lPSJkZWxpdmVyYWJsZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRlbGl2ZXJhYmxlPC9oMT4KLTxkaXY+PHA+QSBkZWxpdmVyYWJsZSBpcyBhIGNvbGxlY3Rpb24gb2Ygd29yayBwcm9kdWN0cywgdXN1YWxseSBhcnRpZmFjdHMuIEEgZGVsaXZlcmFibGUKLWlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb2Ygd29yayBwcm9kdWN0cwotcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEKLXByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyLCBvciBvdGhlcgotc3Rha2Vob2xkZXIuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJhcnRpZmFjdC5odG1sI2FydGlmYWN0Ij5BcnRpZmFjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0ib3V0Y29tZS5odG1sI291dGNvbWUiPk91dGNvbWU8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0Ij5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZWxpdmVyeXByb2Nlc3MuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGVsaXZlcnlwcm9jZXNzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkNWU5YmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZWxpdmVyeXByb2Nlc3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRlbGl2ZXJ5IFByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCNjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGVsaXZlcnlwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkRlbGl2ZXJ5IFByb2Nlc3M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImRlbGl2ZXJ5cHJvY2VzcyI+PGEgbmFtZT0iZGVsaXZlcnlwcm9jZXNzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGVsaXZlcnkgUHJvY2VzczwvaDE+Ci08ZGl2PjxwPkEgRGVsaXZlcnkgUHJvY2VzcyBpcyB0aGUgcHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZQotZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiBBIERlbGl2ZXJ5IFByb2Nlc3MgY2FuIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcKLWFuZCBydW5uaW5nIGEgcHJvamVjdC4gSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkCi1waGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzLjwvcD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwiPkNyZWF0ZSBhIERlbGl2ZXJ5IFByb2Nlc3M8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiPkNyZWF0ZSBhIERlbGl2ZXJ5IFByb2Nlc3M8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzEyM2E5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRldmVsb3AgYSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkRldmVsb3AgYSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlIj48YSBuYW1lPSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmU8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5JbiB0aGUgVGVhbSBBbGxvY2F0aW9uIHZpZXcsIHlvdSBjYW4gY3JlYXRlIGEgcHJvY2VzcyBieSBkZWZpbmluZwotd2hpY2ggcm9sZXMgcGFydGljaXBhdGUgaW4gYWN0aXZpdGllcyBhbmQgZmluZCByZXNwb25zaWJsZSB3b3JrIHByb2R1Y3RzIGFuZAotdGFza3MgZnJvbSB0aGVyZS4gWW91IGNhbiBhbHNvIHJldmlldyB0aGUgcm9sZXMgaW4gYSBwcm9jZXNzIHRoYXQgaGFzIGJlZW4KLWNyZWF0ZWQgYnkgYWRkaW5nIHRhc2tzIG9yIHdvcmsgcHJvZHVjdHMgdG8gdGhlIHByb2Nlc3MuIEJlZm9yZSB5b3UgY3JlYXRlCi1hIHRlYW0gYWxsb2NhdGlvbiBzdHJ1Y3R1cmUsIGVuc3VyZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3RlZCBpbiB0aGUgdG9vbAotYmFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25maWd1cmF0aW9uIHlvdSBzZWxlY3RlZCBhcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi1mb3IgeW91ciBwcm9jZXNzLjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gZGV2ZWxvcCBhIHRlYW0gYWxsb2NhdGlvbiBzdHJ1Y3R1cmU6PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBhY2Nlc3MgdGhlIHRlYW0gYWxsb2NhdGlvbiBlZGl0b3IsIHNlbGVjdCB0aGUgPHN0cm9uZz5UZWFtIEFsbG9jYXRpb248L3N0cm9uZz4gdGFiCi1pbiB0aGUgcHJvY2VzcyBlZGl0b3IuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIHRvcGljLCB0aGUKLWJyZWFrZG93biBlbGVtZW50IGV4YW1wbGUgdXNlZCBpcyA8YSBocmVmPSJhY3Rpdml0eS5odG1sI2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT4uCi1PdGhlciBicmVha2Rvd24gZWxlbWVudHMgaW5jbHVkZSAoYnV0IGFyZSBub3QgbGltaXRlZCB0bykgPGEgaHJlZj0icGhhc2UuaHRtbCNwaGFzZSI+UGhhc2U8L2E+IGFuZCA8YSBocmVmPSJpdGVyYXRpb24uaHRtbCNpdGVyYXRpb24iPkl0ZXJhdGlvbjwvYT4uCi1UaGUgZWxlbWVudCB5b3UgdXNlIGRlcGVuZHMgb24gdGhlIHNjb3BlIG9mIHRoZSBwcm9jZXNzIHlvdSBjcmVhdGUuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayB0aGUgZWxlbWVudCAoZWl0aGVyIGEgPGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPiBvciA8YSBocmVmPSJkZWxpdmVyeXByb2Nlc3MuaHRtbCNkZWxpdmVyeXByb2Nlc3MiPkRlbGl2ZXJ5IFByb2Nlc3M8L2E+KSB0byB3aGljaCB5b3Ugd2FudCB0byBhZGQgc3RydWN0dXJlLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk5ldwotQ2hpbGQgJmd0OyBBY3Rpdml0eTwvc3Ryb25nPiB0byBjcmVhdGUgYSBuZXcgYWN0aXZpdHkuIElmIG5lZWRlZCwgY3JlYXRlIG1vcmUgYWN0aXZpdGllcwotdG8gc2V0IHVwIHlvdXIgYnJlYWtkb3duIHN0cnVjdHVyZS4gQWN0aXZpdGllcyAoYXMgd2VsbCBhcyBwaGFzZXMgYW5kIGl0ZXJhdGlvbnMpCi1jYW4gYmUgbmVzdGVkIGluc2lkZSBlYWNoIG90aGVyIGFjY29yZGluZyB0byBob3cgZWFjaCByZWxhdGVzIGluIHRoZSBoaWVyYXJjaHkuCi1Zb3UgY2FuIGFkZCByb2xlcyBkaXJlY3RseSB0byB5b3VyIGFjdGl2aXRpZXMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcsIHJldmlldyB0aGUgbGlzdCBvZiByb2xlcy4gSW4gdGhpcyB2aWV3LAotdGFza3MgYXJlIHNvcnRlZCBieSByb2xlIHNldHMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkRyaWxsIGludG8gdGhlIHJvbGUgc2V0cyBoaWVyYXJjaHkgdG8gc2VlIHdoaWNoIHJvbGVzIGFyZSBhdmFpbGFibGUKLWluIHRoaXMgY29uZmlndXJhdGlvbi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGEgcm9sZSBhbmQgZHJhZyBpdCBvbiB0b3Agb2YgdGhlIGFwcHJvcHJpYXRlIGFjdGl2aXR5LiBUaGUKLXJvbGUgaXMgYWRkZWQgYXMgYSByb2xlIGRlc2NyaXB0b3IuIElmIHRoZSByb2xlIGlzIHJlc3BvbnNpYmxlIGZvciB3b3JrIHByb2R1Y3RzCi1pbiB0aGUgY29uZmlndXJhdGlvbidzIG1ldGhvZCBjb250ZW50LCBhIHdpemFyZCBhcHBlYXJzIHByb21wdGluZyB5b3UgdG8gYWRkCi13b3JrIHByb2R1Y3RzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3Qgb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBGb3IKLWVhY2ggc2VsZWN0ZWQgd29yayBwcm9kdWN0IHRoZSBuZXh0IHdpemFyZCB3aW5kb3cgcHJvbXB0cyB5b3UgdG8gc2VsZWN0IHRhc2tzCi10aGF0IHByb2R1Y2UgdGhlc2Ugd29yayBwcm9kdWN0cy4gQWdhaW4sIHNlbGVjdCBvbmUgb3IgbW9yZSB0YXNrcyBhbmQgdGhlbgotY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPiB0byBhZGQgdGhlc2UgZWxlbWVudHMgdG8geW91ciBwcm9jZXNzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SZXZpZXcgdGhlIHJvbGUgZGVzY3JpcHRvcidzIGRldGFpbHMgaW4gaXRzIHByb3BlcnRpZXMgdmlldy4gSWYKLXRoZSBwcm9wZXJ0aWVzIHZpZXcgaXMgbm90IGRpc3BsYXllZCwgaW4gdGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IsCi1yaWdodCBjbGljayB0aGUgcm9sZSBhbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5Qcm9wZXJ0aWVzPC9zdHJvbmc+LiBVc2UgdGhlIHRhYnMgb24gdGhlCi1zaWRlIG9mIHRoZSBwcm9wZXJ0aWVzIHZpZXcgdG8gcmV2aWV3IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZSByb2xlIGRlc2NyaXB0b3IuCi1JbiB0aGUgcHJvcGVydGllcyB2aWV3LCB5b3UgY2FuIGFsc28gcGVyZm9ybSBpbmRpdmlkdWFsIG1vZGlmaWNhdGlvbnMgb2YgdGhlCi1yb2xlIGRlc2NyaXB0b3IsIHN1Y2ggYXMgY2hhbmdlIHRoZSBwcmVzZW50YXRpb24gbmFtZSwgYWRkIHRleHR1YWwgZGVzY3JpcHRpb25zLAotY2hhbmdlIHdvcmsgcHJvZHVjdHMgdGhlIHJvbGUgaXMgcmVzcG9uc2libGUgZm9yLCBhbmQgbW9yZS4gV2hlbiBjaGFuZ2luZwotdGhlIHRhc2sgZGVzY3JpcHRvcidzIHJlbGF0aW9uc2hpcHMgdW5kZXIgdGhlIHJvbGVzIG9yIHdvcmsgcHJvZHVjdHMgdGFicywKLXlvdSBjYW4gYWRkIG5ldyBlbGVtZW50cyBmcm9tIHlvdXIgbWV0aG9kIGNvbnRlbnQgYnkgY2xpY2tpbmcgdGhlIDxzdHJvbmc+QWRkLi4uPC9zdHJvbmc+IGJ1dHRvbiwKLW9yIGNvbm5lY3QgeW91ciB0YXNrIGRlc2NyaXB0b3Igd2l0aCB0YXNrcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBhY3Rpdml0eS4KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0icHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldy5odG1sI3Byb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXciPlByb2Nlc3MgRWxlbWVudCBQcm9wZXJ0aWVzIFZpZXc8L2E+PC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNvbnRpbnVlIGFkZGluZyByb2xlcyB0byB5b3VyIGFjdGl2aXRpZXMuPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+WW91IGNhbiBwcmV2aWV3IHdoYXQgeW91ciBwcm9jZXNzIHdpbGwgbG9vayBsaWtlIGluIGEgcHVibGlzaGVkIFdlYgotc2l0ZSBhdCBhbnkgdGltZSBieSBzd2l0Y2hpbmcgdG8gdGhlIDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPiBhbmQgdGhlbiBzZWxlY3RpbmcgdGhlIHByb2Nlc3MsIG9yIGFuIGFjdGl2aXR5IGluIHRoZQotcHJvY2VzcywgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwiPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4uIFlvdSBjYW4gdXNlIHRoZQotbGlua3Mgb24gdGhlIHBhZ2UgdG8gbmF2aWdhdGUgdGhyb3VnaCB0aGUgcHJvY2Vzcy4gU3dpdGNoIGJhY2sgdG8gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4gdG8KLWNvbnRpbnVlIGVkaXRpbmcgeW91ciBwcm9jZXNzLjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUiPkRldmVsb3AgYSBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NzQ3ZWIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEZXZlbG9wIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5EZXZlbG9wIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiPjxhIG5hbWU9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5BIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSBpcyBhIGhpZXJhcmNoaWNhbCBicmVha2Rvd24gb2Ygd29yaywgc3VjaAotYXMgYWN0aXZpdGllcywgdGFza3MsIGFuZCBzdGVwcywgZGVmaW5pbmcgYSBwcm9jZXNzLiA8cD5CZWZvcmUgY3JlYXRpbmcgYQotd29yayBicmVha2Rvd24gc3RydWN0dXJlLCBiZSBzdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0ZWQgaW4gdGhlIHRvb2wKLWJhciBpcyB0aGUgc2FtZSBhcyB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3RlZCBhcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi1mb3IgeW91ciBwcm9jZXNzLjwvcD4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gZGV2ZWxvcCBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZTo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGFjY2VzcyB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgc2VsZWN0IHRoZSA8c3Ryb25nPldvcmsKLUJyZWFrZG93biBTdHJ1Y3R1cmU8L3N0cm9uZz4gdGFiIGluIGEgcHJvY2VzcyBlZGl0b3IuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gQSBicmVha2Rvd24KLXN0cnVjdHVyZSBpcyBjcmVhdGVkIHdpdGggYnJlYWtkb3duIGVsZW1lbnRzLiBFeGFtcGxlcyBvZiBicmVha2Rvd24gZWxlbWVudHMKLWFyZSA8YSBocmVmPSJwaGFzZS5odG1sI3BoYXNlIj5QaGFzZTwvYT4sIDxhIGhyZWY9Iml0ZXJhdGlvbi5odG1sI2l0ZXJhdGlvbiI+SXRlcmF0aW9uPC9hPiwgPGEgaHJlZj0iYWN0aXZpdHkuaHRtbCNhY3Rpdml0eSI+QWN0aXZpdHk8L2E+LAotb3IgdGFzayBkZXNjcmlwdG9yLiBUeXBpY2FsbHksIGEgcHJvY2VzcyBpcyBjcmVhdGVkIGJ5IGRlZmluaW5nCi1pdHMgcGhhc2VzIGFuZCBpdGVyYXRpb25zIHdpdGhpbiBvciBhY3Jvc3MgdGhlc2UgcGhhc2VzLiBQaGFzZXMgYW5kIGl0ZXJhdGlvbnMKLWFyZSB0aGVuIGZ1cnRoZXIgYnJva2VuIGRvd24gaW50byBsZXZlbHMgb2YgYWN0aXZpdGllcy4gRmluYWxseSwgeW91IGNhbiBwb3B1bGF0ZQotYSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUncyBhY3Rpdml0eSB3aXRoIHRhc2sgZGVzY3JpcHRvcnMuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayB0aGUgZWxlbWVudCAoZWl0aGVyIGEgPGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPiBvciA8YSBocmVmPSJkZWxpdmVyeXByb2Nlc3MuaHRtbCNkZWxpdmVyeXByb2Nlc3MiPkRlbGl2ZXJ5IFByb2Nlc3M8L2E+KSB0byB3aGljaCB5b3Ugd2FudCB0byBhZGQgc3RydWN0dXJlLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk5ldwotQ2hpbGQgJmd0OyBBY3Rpdml0eTwvc3Ryb25nPiB0byBjcmVhdGUgdGhlIG5ldyBhY3Rpdml0eS4gSWYgbmVlZGVkLCBjcmVhdGUgbW9yZSBhY3Rpdml0aWVzCi10byBzZXQgdXAgeW91ciBicmVha2Rvd24gc3RydWN0dXJlLiBBY3Rpdml0aWVzIChhcyB3ZWxsIGFzIHBoYXNlcyBhbmQgaXRlcmF0aW9ucykKLWNhbiBiZSBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXIgYWNjb3JkaW5nIHRvIGhvdyBlYWNoIHJlbGF0ZXMgaW4gdGhlIGhpZXJhcmNoeS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgdGhlIGFjdGl2aXR5IGFuZCB0aGVuIHNlbGVjdCA8c3Ryb25nPlByb3BlcnRpZXM8L3N0cm9uZz4gdG8gb3BlbgotdGhlIFByb3BlcnRpZXMgdmlldy4gQ29tcGxldGUgdGhlIGluZm9ybWF0aW9uIHVuZGVyIHRoZSBEb2N1bWVudGF0aW9uIHRhYgotZm9yIHRoZSBhY3Rpdml0eS4gVGhpcyBpbmZvcm1hdGlvbiBhcHBlYXJzIGluIHRoZSBwdWJsaXNoZWQgV2ViIHBhZ2UgZm9yIHRoZQotYWN0aXZpdHkuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJldmlldyB0aGUgbGlzdCBvZiB0YXNrcyBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3IHRvIHNlZSB3aGljaAotdGFza3MgYXJlIGF2YWlsYWJsZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGEgdGFzayB0byBhZGQgdG8gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRoZW4gZHJhZyBpdAotb24gdG9wIG9mIHRoZSBhY3Rpdml0eSB0byB3aGljaCB5b3Ugd2FudCBpdCB0byBiZWxvbmcuIFRoZSB0YXNrIGlzIGFkZGVkIGFzCi1hIHRhc2sgZGVzY3JpcHRvciB0byB0aGF0IGFjdGl2aXR5Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB0aGUgcHJvcGVydGllcyB2aWV3IGZvciB0aGUgYWN0aXZpdHkgaXMgbm90IGRpc3BsYXllZCwgc2VsZWN0Ci10aGUgdGFzayBpbiB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgcmlnaHQgY2xpY2ssIGFuZCB0aGVuIHNlbGVjdCA8c3Ryb25nPlByb3BlcnRpZXM8L3N0cm9uZz4uCi1DbGljayB0aGUgPHN0cm9uZz5Eb2N1bWVudGF0aW9uPC9zdHJvbmc+IHRhYiBhbmQgdGhlbiBjb21wbGV0ZSB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQKLXVuZGVyIHRoaXMgdGFiLiBUaGlzIGluZm9ybWF0aW9uIGFwcGVhcnMgaW4gdGhlIHB1Ymxpc2hlZCBXZWIgcGFnZSBmb3IgdGhlCi1hY3Rpdml0eS4gVXNlIHRoZSB0YWJzIG9uIHRoZSBzaWRlIG9mIHRoZSBwcm9wZXJ0aWVzIHZpZXcgdG8gcmV2aWV3IGRpZmZlcmVudAotYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdG9yLiBJbiB0aGUgcHJvcGVydGllcyB2aWV3LCB5b3UgY2FuIHBlcmZvcm0gaW5kaXZpZHVhbAotbW9kaWZpY2F0aW9ucyBvZiB0aGUgdGFzayBkZXNjcmlwdG9yLCBzdWNoIGFzIGNoYW5nZSB0aGUgcHJlc2VudGF0aW9uIG5hbWUsCi1hZGQgdGV4dHVhbCBkZXNjcmlwdGlvbnMsIGFuZCBjaGFuZ2UgcGVyZm9ybWluZyByb2xlcywgYW1vbmcgb3RoZXJzLiBXaGVuCi1jaGFuZ2luZyB0aGUgdGFzayBkZXNjcmlwdG9yJ3MgcmVsYXRpb25zaGlwcyB1bmRlciB0aGUgcm9sZXMgb3Igd29yayBwcm9kdWN0cwotdGFicywgeW91IGNhbiBhZGQgbmV3IGVsZW1lbnRzIGZyb20geW91ciBtZXRob2QgY29udGVudCBieSBjbGlja2luZyB0aGUgPHN0cm9uZz5BZGQuLi48L3N0cm9uZz4gYnV0dG9uLAotb3IgY29ubmVjdCB5b3VyIHRhc2sgZGVzY3JpcHRvciB3aXRoIHRhc2tzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIGFjdGl2aXR5LgotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Lmh0bWwjcHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldyI+UHJvY2VzcyBFbGVtZW50IFByb3BlcnRpZXMgVmlldzwvYT4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNvbnRpbnVlIGFkZGluZyB0YXNrcyB0byB0aGUgYWN0aXZpdHkgb3IgYWN0aXZpdGllcy48L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIHByZXZpZXcgd2hhdCB5b3VyIHByb2Nlc3Mgd2lsbCBsb29rIGxpa2UgaW4gYSBwdWJsaXNoZWQgV2ViCi1zaXRlIGF0IGFueSB0aW1lIGJ5IHN3aXRjaGluZyB0byB0aGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+IGFuZCB0aGVuIHNlbGVjdGluZyB0aGUgcHJvY2Vzcywgb3IgYW4gYWN0aXZpdHkgaW4gdGhlCi1wcm9jZXNzLCBpbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPi4gWW91IGNhbiB1c2UgdGhlCi1saW5rcyBvbiB0aGUgcGFnZSB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSBwcm9jZXNzLiBTd2l0Y2ggYmFjayB0byB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPiB0bwotY29udGludWUgZWRpdGluZyB5b3VyIHByb2Nlc3MuPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZSI+RGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSI+RGV2ZWxvcCBhIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0MGEwNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRldmVsb3AgYSBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5EZXZlbG9wIGEgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIj48YSBuYW1lPSJkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EZXZlbG9wIGEgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPkluIHRoZSBXb3JrIFByb2R1Y3QgVXNhZ2UgdmlldywgeW91IGNhbiBjcmVhdGUgYSBwcm9jZXNzIGJ5IGRlZmluaW5nCi13aGljaCB3b3JrIHByb2R1Y3RzIHdpbGwgYmUgY3JlYXRlZCBhbmQgdXNlZCBpbiB0aGUgcHJvY2VzcywgYW5kIHRoZW4gZmluZGluZwotcmVzcG9uc2libGUgcm9sZXMgYW5kIHRhc2tzIGZyb20gdGhlcmUuIFlvdSBjYW4gYWxzbyByZXZpZXcgdGhlIHdvcmsgcHJvZHVjdHMKLWluIGEgcHJvY2VzcyB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQgYnkgYWRkaW5nIHRhc2tzIG9yIHJvbGVzIHRvIHRoZSBwcm9jZXNzLjxwPkJlZm9yZQoteW91IGNyZWF0ZSBhIHdvcmsgcHJvZHVjdCB1c2FnZSBzdHJ1Y3R1cmUsIGVuc3VyZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3RlZAotaW4gdGhlIHRvb2wgYmFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25maWd1cmF0aW9uIHlvdSBzZWxlY3RlZCBhcyB0aGUgZGVmYXVsdAotY29uZmlndXJhdGlvbiBmb3IgeW91ciBwcm9jZXNzLjwvcD4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gZGV2ZWxvcCBhIHdvcmsgcHJvZHVjdCB1c2FnZSBzdHJ1Y3R1cmU6PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBhY2Nlc3MgdGhlIHdvcmsgcHJvZHVjdCB1c2FnZSBlZGl0b3IsIHNlbGVjdCB0aGUgPHN0cm9uZz5Xb3JrIFByb2R1Y3QKLVVzYWdlPC9zdHJvbmc+IHRhYiBpbiB0aGUgcHJvY2VzcyBlZGl0b3IuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gRm9yIHRoZSBwdXJwb3NlcyBvZgotdGhpcyB0b3BpYywgdGhlIGJyZWFrZG93biBlbGVtZW50IGV4YW1wbGUgdXNlZCBpcyA8YSBocmVmPSJhY3Rpdml0eS5odG1sI2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT4uIE90aGVyIGJyZWFrZG93biBlbGVtZW50cyBpbmNsdWRlIChidXQgYXJlIG5vdCBsaW1pdGVkCi10bykgPGEgaHJlZj0icGhhc2UuaHRtbCNwaGFzZSI+UGhhc2U8L2E+IGFuZCA8YSBocmVmPSJpdGVyYXRpb24uaHRtbCNpdGVyYXRpb24iPkl0ZXJhdGlvbjwvYT4uIFRoZSBlbGVtZW50IHlvdSB1c2UgZGVwZW5kcyBvbiB0aGUgc2NvcGUgb2YgdGhlIHByb2Nlc3MKLXlvdSBjcmVhdGUuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayB0aGUgZWxlbWVudCAoZWl0aGVyIGEgPGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPiBvciA8YSBocmVmPSJkZWxpdmVyeXByb2Nlc3MuaHRtbCNkZWxpdmVyeXByb2Nlc3MiPkRlbGl2ZXJ5IFByb2Nlc3M8L2E+KSB0byB3aGljaCB5b3Ugd2FudCB0byBhZGQgc3RydWN0dXJlLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk5ldwotQ2hpbGQgJmd0OyBBY3Rpdml0eTwvc3Ryb25nPiB0byBjcmVhdGUgYSBuZXcgYWN0aXZpdHkuIElmIG5lZWRlZCwgY3JlYXRlIG1vcmUgYWN0aXZpdGllcwotdG8gc2V0IHVwIHlvdXIgYnJlYWtkb3duIHN0cnVjdHVyZS4gQWN0aXZpdGllcyAoYXMgd2VsbCBhcyBwaGFzZXMgYW5kIGl0ZXJhdGlvbnMpCi1jYW4gYmUgbmVzdGVkIGluc2lkZSBlYWNoIG90aGVyIGFjY29yZGluZyB0byBob3cgZWFjaCByZWxhdGVzIGluIHRoZSBoaWVyYXJjaHkuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJldmlldyB0aGUgbGlzdCBvZiB3b3JrIHByb2R1Y3RzIGluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LiBJbiB0aGlzIHZpZXcsIHdvcmsgcHJvZHVjdHMgYXJlIHNvcnRlZCBieSBkb21haW4gYXMKLXdlbGwgYXMgd29yayBwcm9kdWN0IGtpbmRzLiBEcmlsbCBpbnRvIGVpdGhlciBvZiB0aGVzZSBoaWVyYXJjaGllcyB0byBzZWUKLXdoaWNoIHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBhIHdvcmsgcHJvZHVjdCB0byBhZGQgdG8gYWN0aXZpdHkgYW5kIHRoZW4gZHJhZyBpdCBvbiB0b3AKLW9mIHRoZSBhY3Rpdml0eSB3aGljaCB5b3Ugd2FudCBpdCB0byBiZWxvbmcuIFRoZSB3b3JrIHByb2R1Y3QgaXMgYWRkZWQgYXMKLWEgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gdGhhdCBhY3Rpdml0eS4gSWYgdGhlIHdvcmsgcHJvZHVjdCBpcyBhbiBvdXRwdXQKLXRvIG9uZSBvciBtb3JlIHRhc2tzIGluIHRoZSBjb25maWd1cmF0aW9uLCBhIHdpemFyZCBhcHBlYXJzIHByb21wdGluZyB5b3UKLXRvIGFkZCB0aGUgdGFzay4gPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSXQgaXMgbm90IHJlcXVpcmVkIHRvIGFkZCBhIHRhc2suIEEgdmFsaWQKLXByb2Nlc3MgY2FuIGNvbnRhaW4ganVzdCByb2xlcyBhbmQgd29yayBwcm9kdWN0cy48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNwZWNpZnkgdGhlIGVudHJ5IGFuZCBleGl0IHN0YXRlcyBvZiB0aGUgd29yayBwcm9kdWN0IGZvciB0aGUgYWN0aXZpdHkKLXRvIHdoaWNoIGl0IHdhcyBhZGRlZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmV2aWV3IHRoZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgZGV0YWlscyBpbiB0aGUgcHJvcGVydGllcwotdmlldy4gSWYgdGhlIHByb3BlcnRpZXMgdmlldyBpcyBub3QgZGlzcGxheWVkLCByaWdodCBjbGljayB0aGUgd29yayBwcm9kdWN0Ci1kZXNjcmlwdG9yIGluIHRoZSBwcm9jZXNzIGVkaXRvciwgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+UHJvcGVydGllczwvc3Ryb25nPi4gVXNlIHRoZQotdGFicyBvbiB0aGUgc2lkZSBvZiB0aGUgcHJvcGVydGllcyB2aWV3IHRvIHJldmlldyBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aGUKLXdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yLiBJbiB0aGUgUHJvcGVydGllcyB2aWV3LCB5b3UgY2FuIGFsc28gcGVyZm9ybSBpbmRpdmlkdWFsCi1tb2RpZmljYXRpb25zIG9mIHRoZSByb2xlIGRlc2NyaXB0b3IsIHN1Y2ggYXMgY2hhbmdlIHRoZSBwcmVzZW50YXRpb24gbmFtZSwKLWFkZCB0ZXh0dWFsIGRlc2NyaXB0aW9ucywgYWRkIGVudHJ5IGFuZCBleGl0IHN0YXRlcywgYW5kIG1vcmUuIFdoZW4gY2hhbmdpbmcKLXRoZSByb2xlIGRlc2NyaXB0b3IncyByZWxhdGlvbnNoaXBzIHVuZGVyIHRoZSBSb2xlcyBvciBXb3JrIFByb2R1Y3RzIHRhYnMsCi15b3UgY2FuIGFkZCBuZXcgZWxlbWVudHMgZnJvbSB5b3VyIG1ldGhvZCBjb250ZW50IGJ5IGNsaWNraW5nIHRoZSA8c3Ryb25nPkFkZC4uLjwvc3Ryb25nPiBidXR0b24sCi1vciBjb25uZWN0IHlvdXIgcm9sZSBkZXNjcmlwdG9yIHdpdGggdGFza3MgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgYWN0aXZpdHkuCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9InByb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXcuaHRtbCNwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Ij5Qcm9jZXNzIEVsZW1lbnQgUHJvcGVydGllcyBWaWV3PC9hPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q29udGludWUgYWRkaW5nIHdvcmsgcHJvZHVjdHMgdG8geW91ciBhY3Rpdml0aWVzLiA8L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5TZWUgYWxzbzo8L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSI+RGV2ZWxvcCBhIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sI2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiPkRldmVsb3AgYSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGlmZmVyZW5jZXNiZXR3ZWVuZXhpc3RpbmdhbmRtaWdyYXRlZGNvbnRlbnQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGlmZmVyZW5jZXNiZXR3ZWVuZXhpc3RpbmdhbmRtaWdyYXRlZGNvbnRlbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWUwYjFiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RpZmZlcmVuY2VzYmV0d2VlbmV4aXN0aW5nYW5kbWlncmF0ZWRjb250ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGlmZmVyZW5jZXMgQmV0d2VlbiBJQk0gUlVQIDIwMDMgYW5kIE1pZ3JhdGVkIENvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1pZ3JhdGlvbm92ZXJ2aWV3Lmh0bWwjbWlncmF0aW9ub3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1pZ3JhdGVhbnJwdzIwMDNwbHVnaW4uaHRtbCNtaWdyYXRlYW5ycHcyMDAzcGx1Z2luIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImRpZmZlcmVuY2VzYmV0d2VlbmV4aXN0aW5nYW5kbWlncmF0ZWRjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkRpZmZlcmVuY2VzIEJldHdlZW4gSUJNIFJVUCAyMDAzIGFuZCBNaWdyYXRlZCBDb250ZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkaWZmZXJlbmNlc2JldHdlZW5leGlzdGluZ2FuZG1pZ3JhdGVkY29udGVudCI+PGEgbmFtZT0iZGlmZmVyZW5jZXNiZXR3ZWVuZXhpc3RpbmdhbmRtaWdyYXRlZGNvbnRlbnQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EaWZmZXJlbmNlcyBCZXR3ZWVuIElCTSBSVVAgMjAwMyBhbmQgTWlncmF0ZWQgQ29udGVudDwvaDE+Ci08ZGl2PjxwPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgY29udGVudCBpcyBiYXNlZCBvbiBJQk0gVW5pZmllZAotTWV0aG9kIEFyY2hpdGVjdHVyZS48L3A+Ci08dWw+PGxpPjxzdHJvbmc+QWN0aXZpdGllcyBoYXZlIGJlZW4gcmVuYW1lZCB0byB0YXNrPC9zdHJvbmc+OiBUbyBwcm92aWRlIGEgdGlnaHRlciBsaW5rCi10byBwcm9jZXNzIGVuYWN0bWVudCBhbmQgcHJvamVjdCBtYW5hZ2VtZW50IHdlIHJlbmFtZWQgdGhlIGxvd2VzdCBhc3NpZ25hYmxlCi11bml0cyBvZiB3b3JrIHRvIFRhc2ssIGJlY2F1c2UgdGhpcyBpcyB0aGUgdGVybSBtb3N0IGNvbW1vbmx5IHVzZWQuPC9saT4KLTxsaT48c3Ryb25nPldvcmtmbG93IGRldGFpbHMgcmVuYW1lZCB0byBhY3Rpdml0eTwvc3Ryb25nPjogV29ya2Zsb3dzIGFyZSBjb21tb25seSBleHByZXNzZWQKLWluIGhpZXJhcmNoaWVzIG9mIGFjdGl2aXR5IGRpYWdyYW1zIChlLmcuIGFjdGl2aXR5IGRpYWdyYW1zIGRlZmluZWQgaW4gdGhlCi1VTUwgMi4wKS4gIEFsdGhvdWdoIFJVUCBvbmx5IHByb3ZpZGVkIG9uZSBsZXZlbCBvZiB3b3JrZmxvdyBicmVha2Rvd24sIFVNQQotaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBtdWx0aXBsZSBsZXZlbHMgb2Ygc3VjaCBhIGJyZWFrZG93bi4gQmVjYXVzZSB0aGUgd29yZAotQWN0aXZpdHkgd2FzIG1vcmUgY29tbW9ubHkgdXNlZCB0byBleHByZXNzIHRoZSBlbGVtZW50cyBvZiBhY3Rpdml0eSBkaWFncmFtcwotYXMgd2VsbCBhcyB0aGUgYWN0aXZpdHkgZGlhZ3JhbSBpdHNlbGYsIHdlIGRlY2lkZWQgdG8gcmVwbGFjZSB0aGUgbmFtZSBXb3JrZmxvdwotRGV0YWlsIHVzZWQgaW4gUlVQIHdpdGggdGhlIG5hbWUgQWN0aXZpdHkuICBXZSByZWFsaXplIHRoYXQgdGhlIHNoaWZ0IGluIHRoZQotdXNhZ2Ugb2YgdGhlIHdvcmQgQWN0aXZpdHkgbWlnaHQgY2F1c2UgY29uZnVzaW9uIHdpdGggZXhpc3RpbmcgUlVQIHVzZXJzLgotIEhvd2V2ZXIsIG9uZSBpbXBvcnRhbnQgZ29hbCBvZiB0aGUgVU1BIHdvcmsgd2FzIHRvIHVzZSB0ZXJtcyBpbiB0aGUgd2F5IHRoZXkKLWFyZSBtb3N0IGNvbW1vbmx5IHVzZWQgaW4gc3RhbmRhcmRzIGFuZCBpbmR1c3RyeS4gPC9saT4KLTxsaT48c3Ryb25nPlRhc2tzIChmb3JtZXIgUlVQIEFjdGl2aXRpZXMpIGNhbiBiZSBwZXJmb3JtZWQgYnkgbWFueSByb2xlczwvc3Ryb25nPjogCi1JbiBSVVAgMjAwMyBhbiBhY3Rpdml0eSB3YXMgbW9kZWxlZCBhcyBhbiBvcGVyYXRpb24gb2YgYSByb2xlLiAgQ3VzdG9tZXIgZmVlZGJhY2ssCi1hIGxvb2sgYXQgb3RoZXIgcHJvY2VzcyBtb2RlbGluZyBhcHByb2FjaGVzLCBhcyB3ZWxsIGFzIGNoYW5nZXMgaW50cm9kdWNlZAotaW4gVU1MIDIuMCBpbmRpY2F0ZWQgdGhhdCB0aGlzIHdhcyBhIHRvbyByZXN0cmljdGl2ZSB3YXkgb2YgbW9kZWxpbmcgaHVtYW4KLWJlaGF2aW9yLiAgVGhpcyBhcHByb2FjaCBkaWQgbm90IGFsbG93IGV4cHJlc3NpbmcgdGhhdCBzb21lIHdvcmsgd2FzIHBlcmZvcm1lZAotYXMgYSBjb2xsYWJvcmF0aW9uIG9mIGRpZmZlcmVudCByb2xlcy4gIFVNQSBhZGRyZXNzZXMgdGhpcyBpc3N1ZSBieSBtYWtpbmcKLVRhc2sgYW4gaW5kZXBlbmRlbnQgbW9kZWwgZWxlbWVudCB0byB3aGljaCBwZXJmb3JtaW5nIHJvbGVzIGNhbiBiZSBhc3NpZ25lZAotYXMgcmVzb3VyY2VzLiAgVU1BIHRoZXJlZm9yZSBub3cgYWxsb3dzIHNldmVyYWwgcm9sZXMgdG8gYmUgYXNzaWduZWQgdG8gYQotdGFzay4gIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBpdCBzdGlsbCBhbGxvd3MgYSBwcmltYXJ5IHBlcmZvcm1pbmcgcm9sZQotdG8gYmUgaWRlbnRpZmllZCAoYmVpbmcgcmVzcG9uc2libGUgZm9yIHRoZSB0YXNrKSBhcyB3ZWxsIGFzIHNldmVyYWwgYWRkaXRpb25hbAotcGVyZm9ybWVycy48L2xpPgotPGxpPjxzdHJvbmc+UmVmaW5lbWVudCBvZiB0aGUgYXJ0aWZhY3QgY29uY2VwdDwvc3Ryb25nPjogUlVQIG9ubHkgdXNlZCB0aGUgY29uY2VwdCBvZgotYXJ0aWZhY3QgdG8gZGVmaW5lIHRoaW5ncyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuCi0gVU1BIGRlZmluZXMgYW4gZXh0ZW5kZWQgdGF4b25vbXkgZm9yIHRoZXNlIGNvbmNlcHRzLiAgSXQgZGVmaW5lcyB0aGUgZ2VuZXJhbAotY29uY2VwdCBvZiB3b3JrIHByb2R1Y3QsIHdoaWNoIGhhcyB0aHJlZSBkaWZmZXJlbnQgc3BlY2lhbGl6YXRpb25zIChzcGVjaWZpYwotd29yayBwcm9kdWN0IHR5cGVzKTogQXJ0aWZhY3RzIChtYW5hZ2VkIHdvcmsgcHJvZHVjdHMpLCBEZWxpdmVyYWJsZXMgKHBhY2thZ2VkCi13b3JrIHByb2R1Y3RzIHRoYXQgd2lsbCBiZSBkZWxpdmVyZWQgdG8gYSBzdGFrZWhvbGRlciBmb3IgcmV2aWV3KSwgYW5kIE91dGNvbWUKLSh1bm1hbmFnZWQsIGludGFuZ2libGUgd29yayBwcm9kdWN0cykuPC9saT4KLTxsaT48c3Ryb25nPkRpZmZlcmVudCBjYXRlZ29yaXphdGlvbnMgZm9yIHdvcmsgcHJvZHVjdHMgYW5kIHJvbGVzPC9zdHJvbmc+OiBJbiBSVVAsCi1hcnRpZmFjdHMgYW5kIHJvbGVzIHdlcmUgYWxsIGNhdGVnb3JpemVkIGJ5IGRpc2NpcGxpbmUuIEhvd2V2ZXIsIHNvbWV0aW1lcwotYXJ0aWZhY3RzIHdlcmUgdXNlZCBhY3Jvc3MgZGlzY2lwbGluZXMgYW5kIGEgY2F0ZWdvcml6YXRpb24gdG8gb25seSBvbmUgZGlzY2lwbGluZQotY2F1c2VkIGNvbmZ1c2lvbi4gIEluIFVNQSBkaWZmZXJlbnQgY2F0ZWdvcmllcyBoYXZlIGJlZW4gZGVmaW5lZCBmb3Igd29yawotZGVmaW5pdGlvbnMgKGRpc2NpcGxpbmUgZm9yIHRhc2tzIGFuZCBhY3Rpdml0aWVzKSwgd29yayBwcm9kdWN0cyAoZG9tYWluIGFuZAotd29yayBwcm9kdWN0IGtpbmQpLCBhbmQgcm9sZXMgKHJvbGUgc2V0cykuPC9saT4KLTxsaT48c3Ryb25nPlByb2Nlc3MgQ29tcG9uZW50cyByZW5hbWVkIHRvIE1ldGhvZCBQYWNrYWdlPC9zdHJvbmc+OiAgVGhlIGNvbmNlcHQgb2YgY29tcG9uZW50Ci1pcyBjb21tb25seSB1c2VkIGluIG1hbnkgc3RhbmRhcmRzIGFuZCB0ZWNobm9sb2dpZXMuICBNb3N0IGFwcGxpY2F0aW9ucyBvZgotY29tcG9uZW50IGxpbmsgaXQgdG8gdGhlIGFic3RyYWN0aW9uIG9mIGVuY2Fwc3VsYXRpb24gZGVmaW5pbmcgYSBjb21wb25lbnQKLWFzIGEgYmxhY2sgYm94IHdoaWNoIGNhbiBiZSB1c2VkIHZpYSB3ZWxsLWRlZmluZWQgaW50ZXJmYWNlcy4gIFJVUCBjb21wb25lbnQKLWRpZCBub3QgZnVsZmlsbCB0aGlzIGJsYWNrIGJveCBjcml0ZXJpb24uICBBbHNvIHRoZSBTUEVNIHN0YW5kYXJkIGRlZmluZWQKLXBhY2thZ2VzIGFzIHdlbGwgYXMgY29tcG9uZW50cy4gVG8gYmUgY29tcGxpYW50IHRvIFNQRU0gYW5kIHRoZSBpbmR1c3RyeSB1c2FnZQotb2YgdGhlIHdvcmQgY29tcG9uZW50LCB3ZSByZW5hbWVkIFByb2Nlc3MgQ29tcG9uZW50IHRvIE1ldGhvZCBQYWNrYWdlICgnbWV0aG9kJwotYmVjYXVzZSBpdCBjYW4gY29udGFpbiBtZXRob2QgZWxlbWVudHMgb3IgcHJvY2VzcyBlbGVtZW50cyk8L2xpPgotPGxpPjxzdHJvbmc+U2VwYXJhdGlvbiBvZiBtZXRob2QgY29udGVudCBlbGVtZW50cyBmcm9tIHByb2Nlc3MgZWxlbWVudHM8L3N0cm9uZz46IEluCi1SVVAgMjAwMyB5b3UgY3JlYXRlZCBhIG5ldyBwcm9jZXNzIGJ5IGRlZmluaW5nIGEgbmV3IGNvbmZpZ3VyYXRpb24gYW5kIGRvY3VtZW50aW5nCi1tYW51YWxseSBpbiBhIGRldmVsb3BtZW50IGNhc2UgYXJ0aWZhY3QgY2hhbmdlcyB0byBzdGFuZGFyZCBSVVAuICBVTUEgcHJvdmlkZXMKLWV4dGVuZGVkIGNvbmNlcHRzIGluIGFkZGl0aW9uIHRvIHRoZSBjb25maWd1cmF0aW9uIGNvbmNlcHQgZm9yIHRhaWxvcmluZyBwcm9jZXNzZXMuCi0gSXQgYWxsb3dzIHlvdSB0byBtb2RlbCBjb25jcmV0ZWx5IGZvciBhIHByb2Nlc3Mgd2hhdCB3b3JrIGRlZmluZWQgaW4gdGhlCi1tZXRob2QgY29udGVudCB5b3Ugd2FudCB0byBhY3R1YWxseSBkbyBpbiBlYWNoIHBoYXNlLCBiZWNhdXNlIHlvdSBjYW4gZWFzaWx5Ci1hZGQsIHJlbW92ZSwgYW5kIHJlb3JkZXIgZWxlbWVudHMgaW4gdGhlIHByb2Nlc3Mgc3RydWN0dXJlLCByZXVzaW5nIG9yIG5vdAotcmV1c2luZyB3aGF0ZXZlciB5b3Ugd2FudCBmcm9tIHRoZSBtZXRob2QgY29udGVudC4gSXQgYWNoaWV2ZXMgdGhlc2UgZmVhdHVyZXMKLWJ5IGEgbW9yZSBjbGVhciBzZXBhcmF0aW9uIG9mIG1ldGhvZCBjb250ZW50IChlLmcuIHRhc2tzIGRlZmluZWQgZm9yIGRpc2NpcGxpbmVzKQotYW5kIHRoZSBhcHBsaWNhdGlvbiBvZiBtZXRob2QgY29udGVudCBpbiBwcm9jZXNzIChleHByZXNzZWQgd2l0aCBhY3Rpdml0eQotZGlhZ3JhbXMgYW5kL29yIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZXMpIGFzIHdlbGwgYXMgdGhlIG1vZGVsaW5nIG9mIHByb2Nlc3NlcwotKGkuZS4gY3JlYXRpbmcgbmV3IG9yIGFkYXB0ZWQgYWN0aXZpdHkgZGlhZ3JhbXMgb3IgbmV3IG9yIGFkYXB0ZWQgd29yayBicmVha2Rvd24KLXN0cnVjdHVyZXMpLiAgSXQgaW50cm9kdWNlcyBhIGZldyBuZXcgY29uY2VwdHMgc3VjaCBhcyBkZXNjcmlwdG9yIHRoYXQgc3VwcG9ydAotdGhpcyBzZXBhcmF0aW9uIGFuZCBhY2hpZXZlIG5ldyBjYXBhYmlsaXRpZXMgZm9yIG1haW50YWluaW5nIGFuZCByZXVzaW5nIG1hbnkKLWRpZmZlcmVudCBmYW1pbGllcyBvZiBhbHRlcm5hdGl2ZSBwcm9jZXNzZXMgYW5kIHByb2Nlc3MgcGFydHMgYWxsIHdpdGhpbiB0aGUKLXNhbWUgY29uZmlndXJhdGlvbi48L2xpPgotPC91bD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1pZ3JhdGlvbm92ZXJ2aWV3Lmh0bWwjbWlncmF0aW9ub3ZlcnZpZXciPk1pZ3JhdGlvbiBPdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtaWdyYXRlYW5ycHcyMDAzcGx1Z2luLmh0bWwjbWlncmF0ZWFucnB3MjAwM3BsdWdpbiI+TWlncmF0ZSBhbiBJQk0gUlVQIDIwMDMuMDYgUGx1Z2luPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGlzY2lwbGluZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kaXNjaXBsaW5lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmNWEyOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kaXNjaXBsaW5lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEaXNjaXBsaW5lIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImRpc2NpcGxpbmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RGlzY2lwbGluZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZGlzY2lwbGluZSI+PGEgbmFtZT0iZGlzY2lwbGluZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRpc2NpcGxpbmU8L2gxPgotPGRpdj48cD5BIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIDxhIGhyZWY9InRhc2suaHRtbCN0YXNrIj5UYXNrczwvYT4gdGhhdAotYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciBhcmVhIG9mIGNvbmNlcm4gd2l0aGluIHRoZSBvdmVyYWxsIElUIGVudmlyb25tZW50LgotRm9yIGV4YW1wbGUsIG9uIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgaXQgaXMgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbgotcmVxdWlyZW1lbnRzIHRhc2tzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gdGFza3MuIFNlcGFyYXRpbmcKLXRoZXNlIHRhc2tzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIHRhc2tzIGVhc2llciB0byBjb21wcmVoZW5kLgotRGlzY2lwbGluZXMgY2FuIGJlIG9yZ2FuaXplZCB1c2luZyBEaXNjaXBsaW5lIEdyb3VwaW5ncy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj5NZXRob2QgQ29udGVudCBDYXRlZ29yaWVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZG9tYWluLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RvbWFpbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTQyMzUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZG9tYWluLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEb21haW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZG9tYWluIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkRvbWFpbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZG9tYWluIj48YSBuYW1lPSJkb21haW4iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Eb21haW48L2gxPgotPGRpdj48cD5BIERvbWFpbiBpcyBhIHJlZmluZWFibGUsIGxvZ2ljYWwsIGhpZXJhcmNoeSBvZiByZWxhdGVkIDxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdHM8L2E+IGdyb3VwZWQgdG9nZXRoZXIgYmFzZWQgb24gdGltaW5nLCByZXNvdXJjZXMsCi1vciByZWxhdGlvbnNoaXAuIFdoaWxlIGEgRG9tYWluIGNhdGVnb3JpemVzIG1hbnkgd29yayBwcm9kdWN0cywgYSB3b3JrIHByb2R1Y3QKLWJlbG9uZ3MgdG8gb25seSBvbmUgRG9tYWluLiBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucy4gPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyI+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2V4YW1wbGUuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZXhhbXBsZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDFhNTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZXhhbXBsZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRXhhbXBsZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJleGFtcGxlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImV4YW1wbGUiPjxhIG5hbWU9ImV4YW1wbGUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FeGFtcGxlPC9oMT4KLTxkaXY+PHA+QW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhbiBleGFtcGxlIG9mIGEKLWNvbXBsZXRlZCB3b3JrIHByb2R1Y3QuIDwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZXh0ZW5kcy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9leHRlbmRzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdlMWZiNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9leHRlbmRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFeHRlbmRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNvbnRyaWJ1dGVzLmh0bWwjY29udHJpYnV0ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZXh0ZW5kcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5FeHRlbmRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJleHRlbmRzIj48YSBuYW1lPSJleHRlbmRzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RXh0ZW5kczwvaDE+Ci08ZGl2PjxwPkFuIGV4dGVuZGluZyBlbGVtZW50IGluaGVyaXRzIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgYmFzZSBlbGVtZW50LiBFeHRlbnNpb24KLWFsbG93cyBNZXRob2QgUGx1Zy1pbnMgdG8gZWFzaWx5IHJldXNlIGVsZW1lbnRzIGZyb20gYSBiYXNlIHBsdWctaW4gYnkgcHJvdmlkaW5nCi1hIGtpbmQgb2YgaW5oZXJpdGFuY2UgZm9yIHRoZSBleHRlbmRpbmcgZWxlbWVudC4gQXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24KLWluc3RhbmNlcyBhcmUgaW5oZXJpdGVkIGZyb20gdGhlICJiYXNlZC1vbiIgZWxlbWVudCB0byB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQuCi1UaGUgcmVzdWx0IGlzIHRoYXQgdGhlIGV4dGVuZGluZyBlbGVtZW50IGhhcyB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoZSAiYmFzZWQtb24iCi1lbGVtZW50LCBidXQgbWlnaHQgZGVmaW5lIGl0cyBvd24gYWRkaXRpb25zLiBFeHRlbmRzIGlzIG5vdCB1c2VkIHRvIG1vZGlmeQotY29udGVudCBvZiB0aGUgYmFzZSBwbHVnLWluLCBidXQgdG8gcHJvdmlkZSB0aGUgYWJpbGl0eSBmb3IgdGhlIGV4dGVuZGluZwotcGx1Zy1pbiB0byBkZWZpbmUgaXRzIG93biBjb250ZW50IHdoaWNoIGlzIGEgdmFyaWFudCBvZiBjb250ZW50IGFscmVhZHkgZGVmaW5lZC4KLUZvciBleGFtcGxlLCBhIHNwZWNpYWwgdmVyc2lvbiBvZiBhIGdlbmVyaWMgUmV2aWV3IFJlY29yZCBmb3IgYSBzcGVjaWZpYyB0eXBlCi1vZiByZXZpZXcuIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHRoZSBiYXNlIGVsZW1lbnQgYW5kIGFueSBudW1iZXIgb2YgZXh0ZW5kaW5nCi1lbGVtZW50cyBjYW4gYmUgdXNlZCBzaWRlIGJ5IHNpZGUsIGJ1dCByZWZlciB0byBlYWNoIG90aGVyIHRocm91Z2ggdGhlIGV4dGVuZHMKLXJlbGF0aW9uc2hpcC4gRXh0ZW5kcyBhbHNvIHByb3ZpZGVzIHRoZSBrZXkgbWVjaGFuaXNtIGZvciBiaW5kaW5nIGNhcGFiaWxpdHkKLXBhdHRlcm5zIHRvIHByb2Nlc3NlczogQSBwYXR0ZXJuIGlzIGFwcGxpZWQgYnkgZGVmaW5pbmcgYW4gZXh0ZW5kcyByZWxhdGlvbnNoaXAKLWZyb20gYW4gYWN0aXZpdHkgb2YgdGhlIGFwcGx5aW5nIHByb2Nlc3NlcyB0byB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuLiBUaGUKLWFjdGl2aXR5IGluaGVyaXRzIGFzc29jaWF0aW9uIGluc3RhbmNlcyBmcm9tIHRoZSBwYXR0ZXJuIGFuZCB0aGUgcGF0dGVybiBhcHBlYXJzCi10byBiZSBwYXJ0IG9mIHRoZSByZXN1bHRpbmcgcHJvY2VzcyBhZnRlciBpbnRlcnByZXRhdGlvbi48L3A+Ci08cD5Vc2UgdGhlIENvbnRlbnQgVmFyaWFiaWxpdHkgc2VjdGlvbiBvbiB0aGUgRGVzY3JpcHRpb24gdGFiIHRvIG1ha2UgYW4gZWxlbWVudAotZXh0ZW5kIGFub3RoZXIgZWxlbWVudC4gU2VsZWN0IDxzdHJvbmc+RXh0ZW5kczwvc3Ryb25nPiBhcyB0aGUgVmFyaWFiaWxpdHkgVHlwZSwgYW5kCi10aGVuIHNlbGVjdCB0aGUgYmFzZSBlbGVtZW50IHdoaWNoIHRoaXMgZWxlbWVudCBleHRlbmRzLiBUaGUgYmFzZSBlbGVtZW50Ci1tdXN0IGJlIHRoZSBzYW1lIHR5cGUgb2YgZWxlbWVudCBhcyB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQuPC9wPgotPHA+QW55IGluZm9ybWF0aW9uIHlvdSBlbnRlciBpbiB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhlIGJhc2UKLWVsZW1lbnQgaW4gY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBlbGVtZW50LiBUZXh0IGZpZWxkcyBpbiB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQKLWFyZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSByZXNwZWN0aXZlIHRleHQgZmllbGRzIGluIHRoZSBiYXNlIGVsZW1lbnQuPC9wPgotPHA+RXh0ZW5kcyBvbmx5IGRlZmluZXMgaW5oZXJpdGFuY2UgZm9yIHRoZSBleHRlbmRpbmcgZWxlbWVudC4gVGhlIGJhc2UgcmVtYWlucwotdW50b3VjaGVkLiBJZiB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQgaXMgYWxsb3dlZCBhbiBhc3NvY2lhdGlvbiB0byBvbmx5IG9uZQotb3RoZXIgZWxlbWVudCBhbmQgaGFzIHN1Y2ggYW4gZWxlbWVudCBkZWZpbmVkIGl0c2VsZiwgaW5oZXJpdGFuY2Ugd2lsbCBub3QKLW92ZXJyaWRlIHRoaXMgYXNzb2NpYXRpb24uPC9wPgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5FeHRlbmRzIHJ1bGVzOjwvc3Ryb25nPjx1bD48bGk+QXR0cmlidXRlIHZhbHVlcyBvZiB0aGUgYmFzZSBlbGVtZW50IGFyZSBpbmhlcml0ZWQgdG8gdGhlIGV4dGVuZGluZyBlbGVtZW50Ci1pZiB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQgaGFzIG5vdCBkZWZpbmVkIGl0cyBvd24gdmFsdWVzLjwvbGk+Ci08bGk+T3V0Z29pbmcgdG8tbWFueSBhc3NvY2lhdGlvbnMgb2YgdGhlIGJhc2UgZWxlbWVudCBhcmUgaW5oZXJpdGVkIHRvIHRoZQotZXh0ZW5kaW5nIGVsZW1lbnQuPC9saT4KLTxsaT5PdXRnb2luZyB0by1vbmUgYXNzb2NpYXRpb25zIGFyZSBvbmx5IGluaGVyaXRlZCBpZiB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQKLWRvZXMgbm90IGRlZmluZSBpdHMgb3duIHRvLW9uZSBhc3NvY2lhdGlvbi48L2xpPgotPGxpPkV4dGVuZHMgd29ya3MgdHJhbnNpdGl2ZWx5LCBpLmUuIGlmIGFuIGV4dGVuZGluZyBlbGVtZW50IGlzIGV4dGVuZGVkIGl0c2VsZiwKLXRoZSBzZWNvbmQgZXh0ZW5zaW9uIGluaGVyaXRzIGZyb20gaXRzIGRpcmVjdCBhbmQgaW5kaXJlY3QgYmFzZSBlbGVtZW50cy48L2xpPgotPGxpPkNvbnRyaWJ1dGlvbiBwcmVjZWRlcyBFeHRlbmRzLCBpLmUuIGNvbnRyaWJ1dGlvbiBpcyBldmFsdWF0ZWQgZmlyc3QgYW5kCi10aGVuIGV4dGVuZGluZyBlbGVtZW50cyBpbmhlcml0IGFmdGVyd2FyZHMgZnJvbSB0aGUgYmFzZSBlbGVtZW50IChpbmNsdWRpbmcKLWFsbCBvZiBpdHMgY29udHJpYnV0aW9uKS48L2xpPgotPGxpPlJlcGxhY2UgcHJlY2VkZXMgRXh0ZW5kcywgaS5lLiBpZiBhIGJhc2UgZWxlbWVudCBoYXMgYSByZXBsYWNlIGFuZCBleHRlbmRzCi1yZWxhdGlvbnNoaXAsIHRoZSBleHRlbmRpbmcgZWxlbWVudCBpbmhlcml0cyBmcm9tIHRoZSByZXBsYWNpbmcgZWxlbWVudC48L2xpPgotPC91bD4KLVNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sI3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIj5WYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnM8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBhc3NvY2lhdGlvbnMgZm9yIGVhY2ggZWxlbWVudAotdHlwZS48L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIHRpdGxlPSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iPlZhcmlhYmlsaXR5PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiPlJlcGxhY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjb250cmlidXRlcy5odG1sI2NvbnRyaWJ1dGVzIj5Db250cmlidXRlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2ZpbmRyZXBsYWNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZmluZHJlcGxhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzODM5NjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZmluZHJlcGxhY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ndWlkYW5jZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ndWlkYW5jZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNzcyYTRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZ3VpZGFuY2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJHdWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5HdWlkYW5jZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZ3VpZGFuY2UiPjxhIG5hbWU9Imd1aWRhbmNlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R3VpZGFuY2U8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5HdWlkYW5jZSBpcyBhIGdlbmVyYWwgdGVybSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIDxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5yb2xlczwvYT4sIDxhIGhyZWY9InRhc2suaHRtbCN0YXNrIj50YXNrczwvYT4sIGFuZCA8YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij53b3JrIHByb2R1Y3RzPC9hPi4gRXhhbXBsZXMgb2YgZ3VpZGFuY2UgYXJlOjx1bD48bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+R3VpZGVsaW5lPC9zcGFuPjwvc3Ryb25nPiAtIFByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdwotdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcywgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsCi1kZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuCi1BbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50Ci1hcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24KLW9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlCi10aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkCi1hY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgYW5kIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+VGVtcGxhdGU8L3NwYW4+PC9zdHJvbmc+IC0gQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQKLXByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywKLWFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zCi1hbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5Ci1iZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YQotc3RvcmVzLjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+Q2hlY2tsaXN0PC9zcGFuPjwvc3Ryb25nPiAtIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0Ci1pZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaWZpZWQuIENoZWNrbGlzdHMKLWFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5Ub29sIE1lbnRvcjwvc3Bhbj48L3N0cm9uZz4gLSBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdAotc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmssIGVpdGhlcgotaW4gdGhlIGNvbnRleHQgb2YsIG9yIGluZGVwZW5kZW50IGZyb20sIGEgdGFzayBvciBhY3Rpdml0eS48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L3NwYW4+PC9zdHJvbmc+IC0gVXNlZCBhcyBhIGNhdGNoIGFsbCBmb3IKLW90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkCi10byBhbGwga2luZHMgb2YgY29udGVudCBlbGVtZW50cywgaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+UmVwb3J0PC9zcGFuPjwvc3Ryb25nPiAtIEEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0Ci1pcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtCi1vZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LAotd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsCi1hbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uCi1pbnRvIGEgcmVwb3J0LjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+Q29uY2VwdDwvc3Bhbj48L3N0cm9uZz4gLSBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcwota2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4KLUNvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIGd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzCi1zZXZlcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3Mgb3IgYWN0aXZpdGllcy48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPlByYWN0aWNlPC9zcGFuPjwvc3Ryb25nPiAtIFJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5Ci1vZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdAotb3IgcHJvY2VzcyBxdWFsaXR5LiBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuCi1UaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1heSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3IKLXNwZWNpZmljIHByb2Nlc3MuIDxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+UmV1c2FibGUgQXNzZXQ8L3NwYW4+PC9zdHJvbmc+IC0gUHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0KLWZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uCi1pbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLgotVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZyBob3cgdGhlCi1hc3NldCBzaG91bGQgYmUgdXNlZC48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPlRlcm0gRGVmaW5pdGlvbjwvc3Bhbj48L3N0cm9uZz4gLSBEZWZpbmVzIGNvbmNlcHRzIGFuZCBpcyB1c2VkCi10byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIEEgdGVybSBkZWZpbml0aW9uIGlzIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIGNvbnRlbnQKLWVsZW1lbnRzLCBidXQgaXRzIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIHRlcm0gaXMgdXNlZCBpbiB0aGUKLWNvbnRlbnQgZWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPldoaXRlIFBhcGVyPC9zcGFuPjwvc3Ryb25nPiAtIEEgc3BlY2lhbCBjb25jZXB0IGd1aWRhbmNlIHRoYXQKLWhhcyBiZWVuIGV4dGVybmFsIHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4KLWlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPkV4YW1wbGU8L3NwYW4+PC9zdHJvbmc+IC0gQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMKLWFuIGV4YW1wbGUgb2YgYSBjb21wbGV0ZWQgd29yayBwcm9kdWN0LjwvbGk+Ci08L3VsPgotU2VlIGFsc286PC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIj5DcmVhdGUgR3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ndWlkZWxpbmUuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZ3VpZGVsaW5lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5ZTc4OGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ndWlkZWxpbmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ikd1aWRlbGluZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJndWlkZWxpbmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+R3VpZGVsaW5lPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJndWlkZWxpbmUiPjxhIG5hbWU9Imd1aWRlbGluZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkd1aWRlbGluZTwvaDE+Ci08ZGl2PjxwPkEgR3VpZGVsaW5lIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsCi1vbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcywgb3IgdGhhdCBwcm92aWRlcwotYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuCi1BbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50Ci1hcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24KLW9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlCi10aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkCi1hY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcywgYW5kIG1hdHVyaXR5LjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaWJtZGl0YS5jc3MgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2libWRpdGEuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZGEyNmM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaWJtZGl0YS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0udW5yZXNvbHZlZCB7IGJhY2tncm91bmQtY29sb3I6IHNreWJsdWU7IH0KLS5ub1RlbXBsYXRlIHsgYmFja2dyb3VuZC1jb2xvcjogeWVsbG93OyB9Ci0KLS5zaWRlYmFyIHtiYWNrZ3JvdW5kOiBzaWx2ZXIgfQotLnRvYyB7Zm9udC1zaXplOiBzbWFsbDsgfQotCi0uYmFzZSB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7IH0KLS5icmVhZGNydW1iIHsgZm9udC1zaXplIDogc21hbGxlcjt9Ci0ucHJlcmVxIHsgbWFyZ2luLWxlZnQgOiAyMHB4O30KLS5oaWVyYXJjaHkgeyBkaXNwbGF5OiBibG9jazsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItd2lkdGggOiAycHg7IHBhZGRpbmctcmlnaHQgOiAzcHg7IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0KLS5uZXN0ZWQwIHsgbWFyZ2luLXRvcCA6IDFlbTt9Ci0ubmVzdGVkMSB7IH0KLS5uZXN0ZWQyIHsgfQotCi0ucCB7bWFyZ2luLXRvcDogMWVtfQotCi0udGFibGVib3JkZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0udGFibGVub2JvcmRlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLWNhcHRpb24geyB0ZXh0LWFsaWduOiBsZWZ0OyBmb250LXN0eWxlOiBpdGFsaWMgfQotLnNpbXBsZXRhYmxlYm9yZGVyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnNpbXBsZXRhYmxlbm9ib3JkZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uY2hvaWNldGFibGVib3JkZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uY2hvaWNldGFibGVub2JvcmRlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLQotLmZpZ2NhcCB7IGZvbnQtc3R5bGU6IGl0YWxpYyB9Ci0uZmlnZGVzYyB7IGZvbnQtc3R5bGU6IG5vcm1hbCB9Ci0KLS5maWdub25lIHttYXJnaW4tdG9wOiAxZW19Ci0uZmlnYm9yZGVyIHsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItd2lkdGggOiAycHg7IHBhZGRpbmctcmlnaHQgOiAzcHg7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWdzaWRlcyB7IGJvcmRlci1sZWZ0IDogMnB4IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci1yaWdodCA6IDJweCBzb2xpZDsgcGFkZGluZy1yaWdodCA6IDNweDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3RvcCB7IGJvcmRlci10b3AgOiAycHggc29saWQ7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWdib3R0b20geyBib3JkZXItYm90dG9tIDogMnB4IHNvbGlkOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3RvcGJvdCB7IGJvcmRlci10b3AgOiAycHggc29saWQ7IGJvcmRlci1ib3R0b20gOiAycHggc29saWQ7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLQotLnN5bm5vbmUge21hcmdpbi10b3A6IDFlbX0KLS5zeW5ib3JkZXIgeyBib3JkZXItc3R5bGU6IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci13aWR0aCA6IDJweDsgcGFkZGluZy1yaWdodCA6IDNweDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLnN5bnNpZGVzIHsgYm9yZGVyLWxlZnQgOiAycHggc29saWQ7IHBhZGRpbmctbGVmdCA6IDNweDsgYm9yZGVyLXJpZ2h0IDogMnB4IHNvbGlkOyBwYWRkaW5nLXJpZ2h0IDogM3B4OyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uc3ludG9wIHsgYm9yZGVyLXRvcCA6IDJweCBzb2xpZDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLnN5bmJvdHRvbSB7IGJvcmRlci1ib3R0b20gOiAycHggc29saWQ7IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uc3ludG9wYm90IHsgYm9yZGVyLXRvcCA6IDJweCBzb2xpZDsgYm9yZGVyLWJvdHRvbSA6IDJweCBzb2xpZDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotCi0uc2tpcCB7IG1hcmdpbi10b3A6IDFlbSB9Ci0uc2tpcHNwYWNlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnVsbGlua3MgeyBsaXN0LXN0eWxlLXR5cGU6IG5vbmUgfQotLnVsY2hpbGRsaW5rIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLm9sY2hpbGRsaW5rIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmxpbmtsaXN0IHsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5saW5rbGlzdHdpdGhjaGlsZCB7IG1hcmdpbi1sZWZ0OiAxLjVlbTsgbWFyZ2luLWJvdHRvbTogMWVtICB9Ci0uc3VibGlua2xpc3QgeyBtYXJnaW4tbGVmdDogMS41ZW07IG1hcmdpbi1ib3R0b206IDFlbSAgfQotLnJlbGNvbmNlcHRzIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbHRhc2tzIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbHJlZiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5yZWxpbmZvIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotZGl2LmJyZWFkY3J1bWIge21hcmdpbi1ib3R0b206IDFlbSB9Ci0KLS50b3BpY3RpdGxlMSB7IG1hcmdpbi10b3A6IDBwYzsgbWFyZ2luLWJvdHRvbTogLjFlbTsgZm9udC1zaXplOiAxLjM0ZW07IH0KLS50b3BpY3RpdGxlMiB7IG1hcmdpbi10b3A6IDFwYzsgbWFyZ2luLWJvdHRvbTogLjQ1ZW07IGZvbnQtc2l6ZTogMS4xN2VtOyB9Ci0udG9waWN0aXRsZTMgeyBtYXJnaW4tdG9wOiAxcGM7IG1hcmdpbi1ib3R0b206IC4xN2VtOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNCB7IG1hcmdpbi10b3A6IC44M2VtOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNSB7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU2IHsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLnNlY3Rpb250aXRsZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMGVtOyBjb2xvcjogYmxhY2s7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDt9Ci0uc2VjdGlvbiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5leGFtcGxlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi0ubm90ZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0ubm90ZXRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLm5vdGVsaXN0dGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0udGlwIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS50aXB0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5mYXN0cGF0aCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uZmFzdHBhdGh0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5pbXBvcnRhbnQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLmltcG9ydGFudHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLnJlbWVtYmVyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5yZW1lbWJlcnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLnJlc3RyaWN0aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5yZXN0cmljdGlvbnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmF0dGVudGlvbiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uYXR0ZW50aW9udGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uZGFuZ2VydGl0bGUgeyBtYXJnaW4tdG9wOiAxZW07IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5kYW5nZXIgeyBwYWRkaW5nOiA1cHggNXB4IDVweCA1cHg7IGJvcmRlcjogc29saWQ7IGJvcmRlci13aWR0aDogdGhpbjsgZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi10b3A6IDJweDsgbWFyZ2luLWJvdHRvbSA6IDFlbTsgfQotLmNhdXRpb250aXRsZSB7IG1hcmdpbi10b3A6IDFlbTsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmNhdXRpb24geyBmb250LXdlaWdodDogYm9sZDsgbWFyZ2luLWJvdHRvbSA6IDFlbTsgfQotCi11bC5zaW1wbGUgeyBsaXN0LXN0eWxlLXR5cGU6IG5vbmUgfQotCi0uZmlyc3Rjb2wgeyBmb250LXdlaWdodCA6IGJvbGQ7fQotCi0uYm9sZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0uYm9sZEl0YWxpYyB7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLS5pdGFsaWMgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLS51bmRlcmxpbmVkIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLS51aWNvbnRyb2wgeyBmb250LXdlaWdodDogYm9sZDsgfQotLnBhcm1uYW1lIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5kZWZwYXJtbmFtZSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotLmt3ZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0uZGVma3dkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0udmFyIHsgZm9udC1zdHlsZSA6IGl0YWxpYzt9Ci0uc2hvcnRjdXQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotCi0ucHRvY0gxIHtmb250LXNpemU6IHgtc21hbGw7IH0KLS5wdG9jSDIge2ZvbnQtc2l6ZTogeC1zbWFsbDsgfQotCi0uc21hbGxDYXBzIHsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgZm9udC1zaXplOiBzbWFsbGVyOyB9Ci0uc3RpdGxlIHsgZm9udC1zdHlsZTogaXRhbGljOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotLm50ZSB7fQotCi0uZGx0ZXJtIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5kbHRlcm1leHBhbmQgeyBmb250LXdlaWdodDogYm9sZDsgbWFyZ2luLXRvcDogMWVtOyB9Ci0uZGVmTGlzdEhlYWQgeyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLS5wYXJtTGlzdEt3ZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0ucGFybUxpc3RWYXIgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLS5wayB7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotCi0qW2NvbXBhY3Q9InllcyJdPmxpIHsgbWFyZ2luLXRvcDogMGVtO30KLSpbY29tcGFjdD0ibm8iXT5saSB7IG1hcmdpbi10b3A6IC41M2VtO30JCi0ubGlleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc2xpZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmRsZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmRkZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnN0ZXBleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc3Vic3RlcGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLQotZGl2LmltYWdlbGVmdCB7IHRleHQtYWxpZ246IGxlZnQgfQotZGl2LmltYWdlY2VudGVyIHsgdGV4dC1hbGlnbjogY2VudGVyIH0KLWRpdi5pbWFnZXJpZ2h0IHsgdGV4dC1hbGlnbjogcmlnaHQgfQotZGl2LmltYWdlanVzdGlmeSB7IHRleHQtYWxpZ246IGp1c3RpZnkgfQotCi1wcmUuc2NyZWVuIHsgcGFkZGluZzogNXB4IDVweCA1cHggNXB4OyBib3JkZXI6IG91dHNldDsgYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsgbWFyZ2luLXRvcDogMnB4OyBtYXJnaW4tYm90dG9tIDogMnB4OyB3aGl0ZS1zcGFjZTogcHJlfQotCi1DSVRFIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci1FTSB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotU1RST05HIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLVZBUiB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBTdHlsZXMgYWRkZWQgdG8gc3VwcG9ydCAuTkVUIG91dHB1dC4gTm90IHVzZWQgYnkgc3RhbmRhcmQgcHJvY2Vzc2luZy4gCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1ib2R5LmRvdG5ldCAvKiBUaGlzIGJvZHkgdGFnIHJlcXVpcmVzIHRoZSB1c2Ugb2Ygb25lIG9mIHRoZSBzZXRzIG9mIGJhbm5lciBhbmQvb3IgdGV4dCBkaXYgaWRzICovCi0JewotCW1hcmdpbjogMHB4IDBweCAwcHggMHB4OwotCXBhZGRpbmc6IDBweCAwcHggMHB4IDBweDsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOyAKLQljb2xvcjogIzAwMDAwMDsKLQl3aWR0aDogMTAwJTsKLQl9Ci0KLWRpdi5uc3RleHQgLyogQ3JlYXRlcyB0aGUgc2Nyb2xsaW5nIHRleHQgYXJlYSBmb3IgTm9uc2Nyb2xsaW5nIHJlZ2lvbiB0b3BpYyAqLwotCXsKLQlwYWRkaW5nOiA1cHggMTBweCAwcHggMjJweDsgCi0JfQotCi1kaXYubnNiYW5uZXIgLyogQ3JlYXRlcyBOb25zY3JvbGxpbmcgYmFubmVyIHJlZ2lvbiAqLwotCXsKLQlwb3NpdGlvbjogcmVsYXRpdmU7Ci0JbGVmdDogMHB4OwotCXBhZGRpbmc6IDBweCAwcHggMHB4IDBweDsKLQlib3JkZXItYm90dG9tOiAxcHggc29saWQgIzk5OTk5OTsKLQl9Ci0KLWRpdi5iYW5uZXJyb3cxIC8qIHByb3ZpZGVzIGZ1bGwtd2lkdGggY29sb3IgdG8gdG9wIHJvdyBpbiBydW5uaW5nIGhlYWQgKi8KLQl7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5Y2NmZjsKLQl9Ci0KLS8qICAgICAgIFNUWUxFUyBGT1IgUlVOTklORyBIRUFEUyAgICAgICovCi0KLXRhYmxlLmJhbm5lcnBhcnRoZWFkLCB0YWJsZS5iYW5uZXJ0aXRsZSAvKiBHZW5lcmFsIHZhbHVlcyBmb3IgdGhlIFJ1bm5pbmcgSGVhZCB0YWJsZXMgKi8KLQl7Ci0JcG9zaXRpb246IHJlbGF0aXZlOwotCWxlZnQ6IDBweDsKLQl0b3A6IDBweDsKLQlwYWRkaW5nOiAwcHggMHB4IDBweCAwcHg7Ci0JbWFyZ2luOiAwcHggMHB4IDBweCAwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci0JaGVpZ2h0OiAyMXB4OyAKLQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwotCWJvcmRlci1zdHlsZTogc29saWQ7Ci0JYm9yZGVyLXdpZHRoOiAwcHg7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5Y2NmZjsgCi0JZm9udC1zaXplOiAxMDAlOwotCX0KLXRhYmxlLmJhbm5lcnBhcnRoZWFkIHRkIC8qIEdlbmVyYWwgVmFsdWVzIGZvciBjZWxscyBpbiB0aGUgdG9wIHJvdyBvZiBydW5uaW5nIGhlYWQgKi8KLQl7Ci0JbWFyZ2luOiAwcHggMHB4IDBweCAwcHg7Ci0JcGFkZGluZzogMnB4IDBweCAwcHggNHB4OwotCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ci0JLypib3JkZXItd2lkdGg6IDBweCAwcHggMXB4IDBweDsgKi8KLQlib3JkZXItd2lkdGg6IDBweAotCWJvcmRlci1zdHlsZTogc29saWQ7Ci0JYm9yZGVyLWNvbG9yOiAjOTk5OTk5OwotCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyAKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQl9Ci10YWJsZS5iYW5uZXJwYXJ0aGVhZCB0ZC5wcm9kdWN0IC8qIFZhbHVlcyBmb3IgdG9wIHJpZ2h0IGNlbGwgaW4gcnVubmluZyBoZWFkICovCi0JeyAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsb3dzIGZvciBhIHNlY29uZCB0ZXh0IGJsb2NrIGluIHRoZSBydW5uaW5nIGhlYWQgKi8KLQl0ZXh0LWFsaWduOiByaWdodDsKLQlwYWRkaW5nOiAycHggNXB4IDBweCA1cHg7Ci0JfQotCi1oMS5kdEgxIHsKLQltYXJnaW4tbGVmdDogLTE4cHg7Ci0JfQotZGl2LnRpdGxlcm93IC8qIHByb3ZpZGVzIG5vbi1zY3JvbGwgdG9waWMgdGl0bGUgYXJlYSAocmVxdWlyZXMgc2NyaXB0KSAqLwotCXsKLQl3aWR0aDogMTAwJTsgLyogRm9yY2VzIHRhYmxlcyB0byBoYXZlIGNvcnJlY3QgcmlnaHQgbWFyZ2luICovCi0JcGFkZGluZzogMHB4IDEwcHggMHB4IDIycHg7IAotCWJhY2tncm91bmQtY29sb3I6ICM5OWNjZmY7ICAgICAgICAKLQl9Ci1kaXYudGl0bGVyb3cgaDEKLQl7Ci0JbWFyZ2luLXRvcDogMGVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IC4yZW0KLQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2luZGVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2luZGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEyMWZiNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pbmRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pdGFsaWMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pdGFsaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZmUzZTBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaXRhbGljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaXRlcmF0aW9uLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2l0ZXJhdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NTRhMzZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaXRlcmF0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJJdGVyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iaXRlcmF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkl0ZXJhdGlvbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iaXRlcmF0aW9uIj48YSBuYW1lPSJpdGVyYXRpb24iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5JdGVyYXRpb248L2gxPgotPGRpdj48cD5JdGVyYXRpb24gaXMgYSBncm91cCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4KLUl0ZXJhdGlvbiByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4KLXJlcGV0aXRpdmUgY3ljbGVzLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbGlicmFyeXZpZXcuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbGlicmFyeXZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2YyN2U5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2xpYnJhcnl2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJMaWJyYXJ5IFZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ibGlicmFyeXZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TGlicmFyeSBWaWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJsaWJyYXJ5dmlldyI+PGEgbmFtZT0ibGlicmFyeXZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5MaWJyYXJ5IFZpZXc8L2gxPgotPGRpdj48cD5UaGUgTGlicmFyeSBWaWV3IGRpc3BsYXlzIHRoZSBNZXRob2QgUGx1Zy1pbnMgYW5kIENvbmZpZ3VyYXRpb25zIGNvbnRhaW5lZAotaW4gYSA8YSBocmVmPSJzdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldy5odG1sIj5NZXRob2QgTGlicmFyeTwvYT4uPC9wPgotPHA+VGhlIExpYnJhcnkgVmlldyBpcyBhdmFpbGFibGUgb25seSBpbiB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPiBhbmQsCi13aGVuIG9wZW4sIGVuYWJsZXMgdGhlIGNyZWF0aW9uLCBtb2RpZmljYXRpb24gYW5kIHZpZXdpbmcgb2YgYWxsIGVsZW1lbnQgdHlwZXMuPC9wPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTxkaXYgY2xhc3M9InByZXZpb3VzbGluayI+PHN0cm9uZz5QcmV2aW91cyB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPjwvZGl2PgotPGRpdiBjbGFzcz0ibmV4dGxpbmsiPjxzdHJvbmc+TmV4dCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCI+QnJvd3NlIGFuZCBQcmV2aWV3IE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21jLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTJjZWUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRoX3ZzX3Byb2MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRoX3ZzX3Byb2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMTQ1YWIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aF92c19wcm9jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTlkNTY3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJNZXRob2QgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJtZXRob2RhdXRob3JpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5NZXRob2QgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Im1ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Ij48YSBuYW1lPSJtZXRob2RhdXRob3JpbmdvdmVydmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvaDE+Ci08ZGl2PjxwPk1ldGhvZCBjb250ZW50IGlzIGRlc2NyaWJlZCBieSBkZWZpbmluZyB0YXNrcyB0aGF0IGhhdmUgd29yayBwcm9kdWN0cyBhcwotaW5wdXRzIGFuZCBvdXRwdXRzIGFuZCB0aGF0IGFyZSBwZXJmb3JtZWQgYnkgcm9sZXMuIFRoZSByb2xlcyBhbHNvIGRlZmluZQotcmVzcG9uc2liaWxpdHkgcmVsYXRpb25zaGlwcyB0byB0aGUgd29yayBwcm9kdWN0cy48L3A+Ci08cD48aW1nIHNyYz0ibWMuZ2lmIiBhbHQ9IiIgLz48L3A+Ci08cD5UaGUgZmlndXJlIGFib3ZlIGRlcGljdHMgdHlwaWNhbCBzb3VyY2VzIGZvciBtZXRob2QgY29udGVudCwgYXMgd2VsbCBhcwotaG93IHRoZSBtZXRob2QgY29udGVudCBpcyByZXByZXNlbnRlZC4gVG8gbGVhcm4gYWJvdXQgZGV2ZWxvcG1lbnQgbWV0aG9kcywKLXBlb3BsZSByZXNlYXJjaCBpbiBsaWJyYXJpZXMgb3IgcmVjZWl2ZSB0cmFpbmluZy4gRGV2ZWxvcG1lbnQgbWV0aG9kcyBhcmUKLXR5cGljYWxseSBkZXNjcmliZWQgaW4gcHVibGljYXRpb25zIHN1Y2ggYXMgYm9va3MsIGFydGljbGVzLCB0cmFpbmluZyBtYXRlcmlhbCwKLXN0YW5kYXJkcyBhbmQgcmVndWxhdGlvbnMsIG9yIGFueSBvdGhlciBmb3JtIG9mIGRvY3VtZW50YXRpb24uIFRoZXNlIHNvdXJjZXMKLXVzdWFsbHkgZG9jdW1lbnQgbWV0aG9kcyBieSBwcm92aWRpbmcgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyCi13YXkgb2YgYWNoaWV2aW5nIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbCB1bmRlciBnZW5lcmFsIGNpcmN1bXN0YW5jZXMuCi1Tb21lIGV4YW1wbGVzIGFyZTogdHJhbnNmb3JtaW5nIGEgcmVxdWlyZW1lbnRzIGRvY3VtZW50IGludG8gYW4gYW5hbHlzaXMgbW9kZWw7Ci1kZWZpbmluZyBhbiBhcmNoaXRlY3R1cmFsIG1lY2hhbmlzbSBiYXNlZCBvbiBmdW5jdGlvbmFsIGFuZCBub24tZnVuY3Rpb25hbAotcmVxdWlyZW1lbnRzOyBjcmVhdGluZyBhIHByb2plY3QgcGxhbiBmb3IgYSBkZXZlbG9wbWVudCBpdGVyYXRpb247IGRlZmluaW5nCi1hIHF1YWxpdHkgYXNzdXJhbmNlIHBsYW4gZm9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzOyByZWRlc2lnbmluZyBhIGJ1c2luZXNzCi1vcmdhbml6YXRpb24gYmFzZWQgb24gYSBuZXcgc3RyYXRlZ2ljIGRpcmVjdGlvbiwgYW5kIHNvIG9uLiA8L3A+Ci08cD5UaGlzIHRvb2wgdGFrZXMgY29udGVudCBzdWNoIGFzIHRoZSBjb250ZW50IGRlc2NyaWJlZCBhYm92ZSwgYW5kIHN0cnVjdHVyZXMKLWl0IGluIG9uZSBzcGVjaWZpYyB3YXkgdXNpbmcgYSBwcmVkZWZpbmVkIHNjaGVtYSBvZiBjb25jZXB0cy4gVGhpcyBzY2hlbWEKLXN1cHBvcnRzIHRoZSBvcmdhbml6YXRpb24gb2YgbGFyZ2UgYW1vdW50cyBvZiBkZXNjcmlwdGlvbnMgZm9yIGRldmVsb3BtZW50Ci1tZXRob2RzIGFuZCBwcm9jZXNzZXMuIFN1Y2ggbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBkbyBub3QgaGF2ZSB0byBiZQotbGltaXRlZCB0byBzb2Z0d2FyZSBlbmdpbmVlcmluZywgYnV0IGNhbiBhbHNvIGNvdmVyIG90aGVyIGRlc2lnbiBhbmQgZW5naW5lZXJpbmcKLWRpc2NpcGxpbmVzIHN1Y2ggYXMgbWVjaGFuaWNhbCBlbmdpbmVlcmluZywgYnVzaW5lc3MgdHJhbnNmb3JtYXRpb24sIHNhbGVzCi1jeWNsZXMsIGFuZCBzbyBvbi4gPC9wPgotPHA+VGhlIHNjaGVtYSBmb3IgbWV0aG9kIGNvbnRlbnQgaXMgcmVwcmVzZW50ZWQgdGhpcyB0b29sIGFzIGEgY29uc3RydWN0IG9mCi1yb2xlcyBkZWZpbmluZyBkZXZlbG9wbWVudCBza2lsbHMgYW5kIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHdvcmsgcHJvZHVjdHMuCi1UaGVzZSB3b3JrIHByb2R1Y3RzIGFyZSBwcm9kdWNlZCBieSB0YXNrcyB0aGF0IGFyZSBwZXJmb3JtZWQgYnkgdGhlIHJvbGVzCi1hbmQgaGF2ZSB0aGUgd29yayBwcm9kdWN0cyBhcyBpbnB1dHMgYW5kIG91dHB1dHMuIFRoZSBzY3JlZW4gY2FwdHVyZSBpbiB0aGUKLWZpZ3VyZSBhYm92ZSBzaG93cyBob3cgc3VjaCBtZXRob2QgY29udGVudCBlbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIHRyZWUKLWJyb3dzZXJzIG9uIHRoZSBsZWZ0LiBUaGVzZSB0cmVlIGJyb3dzZXJzLCBzaW1pbGFyIHRvIGEgbGlicmFyeSwgcHJvdmlkZSBkaWZmZXJlbnQKLWluZGV4ZXMgb2YgdGhlIGF2YWlsYWJsZSBlbGVtZW50cyBmb3IgcmFwaWQgYWNjZXNzLiBUaGUgc2NyZWVuIGNhcHR1cmUgc2hvd3MKLW9uIHRoZSByaWdodCBhbiBleGFtcGxlIG9mIGEgdGFzayBwcmVzZW50YXRpb24uIFRoaXMgdGFzayBwcmVzZW50YXRpb24gZGVmaW5lcwotdGhlIHRhc2sgaW4gdGVybXMgb2Ygc3RlcHMgdGhhdCBuZWVkIHRvIGJlIHBlcmZvcm1lZCB0byBhY2hpZXZlIHRoZSB0YXNrJ3MKLXB1cnBvc2UuIFlvdSBjYW4gc2VlIHRoYXQgdGhlIHRhc2sgaGFzIHZhcmlvdXMgcmVsYXRpb25zaGlwcywgc3VjaCBhcyByZWxhdGlvbnNoaXBzCi10byBwZXJmb3JtaW5nIHJvbGVzIGFzIHdlbGwgYXMgd29yayBwcm9kdWN0cyB0aGF0IHNlcnZlIGFzIGlucHV0cyBhbmQgb3V0cHV0cwotdG8gdGhlIHRhc2suIEZpbmQgbW9yZSBkZXRhaWxzIG9uIHRhc2tzLCByb2xlLCBhbmQgd29yayBwcm9kdWN0cyBpbiB0aGUgb25saW5lCi1oZWxwIGhlcmUuIEluIGFkZGl0aW9uIHRvIHJvbGVzLCB0YXNrcywgYW5kIHdvcmsgcHJvZHVjdHMsIHRoaXMgdG9vbCBzdXBwb3J0cwotdGhlIGFkZGl0aW9uIG9mIGd1aWRhbmNlIGVsZW1lbnRzLiBHdWlkYW5jZSBhcmUgc3VwcGxlbWVudGFyeSBmcmVlLWZvcm0gZG9jdW1lbnRhdGlvbgotc3VjaCBhcyB3aGl0ZSBwYXBlcnMsIGNvbmNlcHQgZGVzY3JpcHRpb25zLCBndWlkZWxpbmVzLCB0ZW1wbGF0ZXMsIGV4YW1wbGVzLAotYW5kIHNvIG9uLiA8L3A+Ci08cD5UaGlzIHRvb2wgcHJvdmlkZXMgdmFyaW91cyBmb3JtLWJhc2VkIGVkaXRvcnMgdG8gY3JlYXRlIG5ldyBtZXRob2QgY29udGVudAotZWxlbWVudHMuIERvY3VtZW50IHlvdXIgdGFzaywgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIGFuZCBndWlkYW5jZSBlbGVtZW50cwotdXNpbmcgaW50dWl0aXZlIHJpY2gtdGV4dCBlZGl0b3JzIHRoYXQgYWxsb3cgeW91IHRvIGNvcHkgYW5kIHBhc3RlIHRleHQgZnJvbQotb3RoZXIgc291cmNlcyBzdWNoIGFzIHdlYiBwYWdlcyBvciBkb2N1bWVudHMuIFVzZSBzaW1wbGUgZGlhbG9ncyB0byBlc3RhYmxpc2gKLXJlbGF0aW9uc2hpcHMgYmV0d2VlbiBjb250ZW50IGVsZW1lbnRzLiBGb3IgZXhhbXBsZSwgbWFrZSBhIHdvcmsgcHJvZHVjdCB0aGUKLWlucHV0IHRvIHlvdXIgdGFzayBzaW1wbHkgYnkgc2VsZWN0aW5nIGl0IGluIGEgZGlhbG9nLjwvcD4KLTxwPlVzaW5nIHRoaXMgdG9vbCwgeW91IGNhbiBvcmdhbml6ZSBjb250ZW50IGluIHBoeXNpY2FsIGNvbnRlbnQgcGFja2FnZXMKLXRoYXQgYWxsb3cgeW91IHRvIG1hbmFnZSB5b3VyIGNvbnRlbnQgaW4gY29uZmlndXJhYmxlIHVuaXRzLiBZb3UgY2FuIGFsc28KLWNhdGVnb3JpemUgeW91ciBjb250ZW50IGJhc2VkIG9uIGEgc2V0IG9mIHByZWRlZmluZWQgY2F0ZWdvcmllcyAoZm9yIGV4YW1wbGUsCi1jYXRlZ29yaXplIHlvdXIgdGFza3MgaW50byBkZXZlbG9wbWVudCBkaXNjaXBsaW5lcywgb3IgeW91ciB3b3JrIHByb2R1Y3RzCi1pbnRvIGRvbWFpbnMpIG9yIGNyZWF0ZSB5b3VyIG93biBjYXRlZ29yaXphdGlvbiBzY2hlbWVzIGZvciB5b3VyIGNvbnRlbnQgd2l0aAoteW91ciBvd24gdXNlci1kZWZpbmVkIGNhdGVnb3JpZXMgdGhhdCBhbGxvdyB5b3UgdG8gaW5kZXggY29udGVudCBpbiBhbnkgd2F5Ci15b3Ugd2FudC4gPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIj5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzAwZjJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik1ldGhvZCBDb25maWd1cmF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbi5odG1sI2NyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im1ldGhvZGNvbmZpZ3VyYXRpb25zIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPk1ldGhvZCBDb25maWd1cmF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJtZXRob2Rjb25maWd1cmF0aW9ucyI+PGEgbmFtZT0ibWV0aG9kY29uZmlndXJhdGlvbnMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5NZXRob2QgQ29uZmlndXJhdGlvbjwvaDE+Ci08ZGl2PjxwPk1ldGhvZCBjb25maWd1cmF0aW9ucyBhcmUgdXNlci1kZWZpbmVkIHN1YnNldHMgb2YgZWxlbWVudHMgY29udGFpbmVkIGluCi10aGUgTWV0aG9kIExpYnJhcnkuPC9wPgotPHA+QSBtZXRob2QgY29uZmlndXJhdGlvbiBkZWZpbmVzIGEgd29ya2luZyBzZXQgb2YgcGFja2FnZXMgd2l0aGluIHRoZSBtZXRob2QKLWxpYnJhcnkgdGhhdCBoZWxwcyB5b3UgbGltaXQgeW91ciB2aWV3IHRvIGEgc3Vic2V0IG9mIGVsZW1lbnRzLiBUaGUgZWxlbWVudHMKLXRoYXQgYXJlIHBhcnQgb2YgYSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4uIE1ldGhvZCBjb25maWd1cmF0aW9ucyBhcmUgdXNlZCBmb3IgY3JlYXRpbmcgcHJvY2Vzc2VzCi1hbmQgZm9yIHB1YmxpY2F0aW9uIGJ5IGRlZmluaW5nIHdoaWNoIGVsZW1lbnRzIGFyZSBwdWJsaXNoZWQgaW4gSFRNTCBhbmQgd2hpY2gKLWFyZSBub3QuPC9wPgotPHA+QSBtZXRob2QgY29uZmlndXJhdGlvbiBjb25zaXN0cyBvZiB0aHJlZSBzcGVjaWZ5aW5nIHBhcnRzOjwvcD4KLTx1bD48bGk+QSBkZXNjcmlwdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbi48L2xpPgotPGxpPkEgc2VsZWN0aW9uIGZyb20gdGhlIHNldCBvZiBwbHVnLWlucyBhbmQgcGFja2FnZXMuPC9saT4KLTxsaT5BIHNlbGVjdGlvbiBvZiB2aWV3cyB0byBiZSBwdWJsaXNoZWQgaW4gdGhlIFdlYiBzaXRlLjwvbGk+Ci08L3VsPgotPHA+SW4gYSBtZXRob2QgY29uZmlndXJhdGlvbiwgeW91IGFyZSBhYmxlIHRvIHNlbGVjdCBhbmQgZGVzZWxlY3QgZnJvbSB0aGUKLWNvbnRlbnQgcGFja2FnZXMgYW5kIHByb2Nlc3MgYXZhaWxhYmxlIGluIHRoZSBtZXRob2QgbGlicmFyeSdzCi1zZXQgb2YgcGx1Zy1pbnMuIFRoZSBzZWxlY3Rpb25zIHlvdSBtYWtlIGhlbHAgZGV0ZXJtaW5lIHRoZSBjb250ZW50IG9mIHlvdXIKLXB1Ymxpc2hlZCBXZWIgc2l0ZS4gQSBjb25maWd1cmF0aW9uIGlzIGdpdmVuIGEgbmFtZSBhbmQgdGhlbiBzYXZlZCBzbyBpdCBjYW4KLWJlIGNoYW5nZWQgYW5kIHRoZW4gcmUtcHVibGlzaGVkIGF0IGEgbGF0ZXIgZGF0ZS48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbi5odG1sI2NyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uIj5DcmVhdGUgYSBNZXRob2QgQ29uZmlndXJhdGlvbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkM2NiZGRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWV0aG9kIENvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TWV0aG9kIENvbnRlbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+PGEgbmFtZT0iY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWV0aG9kIENvbnRlbnQ8L2gxPgotPGRpdj48cD5NZXRob2QgY29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nCi1ob3cgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkLCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50Ci1vZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZAotZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvCi1zcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy48L3A+Ci08cD5NZXRob2QgY29udGVudCBlbGVtZW50cyBhcmU6PC9wPgotPHVsPjxsaT48YSBocmVmPSJ0YXNrLmh0bWwjdGFzayI+VGFzazwvYT48L2xpPgotPGxpPjxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5Sb2xlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCI+R3VpZGFuY2U8L2E+PC9saT4KLTwvdWw+Ci08cD5BIFByb2Nlc3MgRW5naW5lZXIgYXV0aG9ycyB0aGVzZSBlbGVtZW50cywgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuCi10aGVtLCBhbmQgdGhlbiBjYXRlZ29yaXplcyB0aGVtLiBNZXRob2QgY29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLAotZGVzY3JpYmluZyBob3cgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZQotcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gUHJvY2Vzc2VzIHRha2UgdGhlc2UKLW1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQKLXRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLjwvcD4KLTxwPkZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkZXZlbG9wcyBhbiBhcHBsaWNhdGlvbgotZnJvbSBzY3JhdGNoIHBlcmZvcm1zIGRldmVsb3BtZW50IHRhc2tzIHN1Y2ggYXMgIkRldmVsb3AgVmlzaW9uIiBvciAiVXNlIENhc2UKLURlc2lnbiIgc2ltaWxhciB0byBhIHByb2plY3QgdGhhdCBleHRlbmRzIGFuIGV4aXN0aW5nIHNvZnR3YXJlIHN5c3RlbS4gSG93ZXZlciwKLXRoZSB0d28gcHJvamVjdHMgd2lsbCBwZXJmb3JtIHRoZSB0YXNrcyBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgd2l0aCBhCi1kaWZmZXJlbnQgZW1waGFzaXMsIGkuZS4sIHRoZXkgcGVyZm9ybSB0aGUgc3RlcHMgb2YgdGhlc2UgdGFza3MgYXQgZGlmZmVyZW50Ci1wb2ludHMgb2YgdGltZSBhbmQgcGVyaGFwcyBhcHBseSBpbmRpdmlkdWFsIHZhcmlhdGlvbnMgYW5kIGFkZGl0aW9ucy4gPC9wPgotPHA+TWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgYXJlIGNvbnRhaW5lZCB3aXRoaW4gbWV0aG9kIGNvbnRlbnQgcGFja2FnZXMgd2hpY2gsCi1pbiB0dXJuLCBhcmUgY29udGFpbmVkIHdpdGhpbiBhIE1ldGhvZCBwbHVnLWluLiBJbiBvcmRlciB0byBzZXBhcmF0ZSB5b3VyCi1vd24gY29udGVudCBmcm9tIG9yaWdpbmFsIE9wZW5VUCBjb250ZW50LCB5b3Ugc2hvdWxkIGFsd2F5cyBjcmVhdGUgbmV3Ci1tZXRob2QgY29udGVudCBpbiBhIG1ldGhvZCBwbHVnLWluIHRoYXQgeW91IHByb2R1Y2UuIENyZWF0aW5nIG1ldGhvZCBjb250ZW50Ci1pbiBhIG1ldGhvZCBwbHVnLWluIG9mIHlvdXIgb3duIGFsc28gYWxsb3dzIHlvdSB0byB1cGRhdGUgeW91ciBvd24gbGlicmFyeQotd2l0aCBuZXcgcmVsZWFzZXMgb2YgdGhlIE9wZW5VUCBsaWJyYXJ5IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjb250ZW50Ci10aGF0IHlvdSBoYXZlIGNyZWF0ZWQgaW4geW91ciBvd24gcGx1Zy1pbnMuPC9wPgotPHA+U2VlIGFsc286PC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyI+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiI+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlM2E2NDk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik1ldGhvZCBDb250ZW50IENhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPk1ldGhvZCBDb250ZW50IENhdGVnb3JpZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj48YSBuYW1lPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk1ldGhvZCBDb250ZW50IENhdGVnb3JpZXM8L2gxPgotPGRpdj48cD5NZXRob2QgQ29udGVudCBlbGVtZW50cyBhcmUgb3JnYW5pemVkIGludG8gbG9naWNhbCBjYXRlZ29yaWVzLiBUaGUgY2F0ZWdvcmllcwotY2FuIGFwcGVhciBpbiB5b3VyIGZpbmFsLCBwdWJsaXNoZWQgV2ViIHNpdGUgYXMgdmlld3MuPC9wPgotPHA+VGhlcmUgYXJlIHR3byB0eXBlcyBvZiBjYXRlZ29yeTogU3RhbmRhcmQgYW5kIEN1c3RvbS48L3A+Ci08cD48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U3RhbmRhcmQgQ2F0ZWdvcmllczwvaDQ+PHA+U3RhbmRhcmQgQ2F0ZWdvcmllcyBwcm92aWRlCi1hIG1lYW5zIHRvIGNhdGVnb3JpemUgY29yZSBtZXRob2QgY29udGVudCBpbiBsaW5lIHdpdGggdGhlIGJlc3QgcHJhY3RpY2VzCi1mb3IgY3JlYXRpbmcgc3RydWN0dXJlZCBtZXRob2RzLiBTdGFuZGFyZCBDYXRlZ29yaWVzIGFyZSBsaW5rZWQgd2l0aCBhIHNwZWNpZmljCi1tZXRob2QgY29udGVudCB0eXBlLCBlLmcuIERpc2NpcGxpbmVzIGNvbnRhaW4gb25seSB0YXNrcy4gPC9wPgotPGRpdiBjbGFzcz0icCI+U3RhbmRhcmQKLUNhdGVnb3J5IHR5cGVzIGFyZTo8dWw+PGxpPjxzdHJvbmc+RGlzY2lwbGluZXM8L3N0cm9uZz4gLSBBIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIDxhIGhyZWY9InRhc2suaHRtbCN0YXNrIj5UYXNrczwvYT4gdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yIGFyZWEgb2YgY29uY2VybiB3aXRoaW4KLXRoZSBvdmVyYWxsIElUIGVudmlyb25tZW50LiBGb3IgZXhhbXBsZSwgb24gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0LAotaXQgaXMgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgdGFza3MgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGgKLWFuYWx5c2lzIGFuZCBkZXNpZ24gdGFza3MuIFNlcGFyYXRpbmcgdGhlc2UgdGFza3MgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcwotbWFrZXMgdGhlIHRhc2tzIGVhc2llciB0byBjb21wcmVoZW5kLiBEaXNjaXBsaW5lcyBjYW4gYmUgb3JnYW5pemVkIHVzaW5nIERpc2NpcGxpbmUKLUdyb3VwaW5ncy48L2xpPgotPGxpPjxzdHJvbmc+RG9tYWluczwvc3Ryb25nPiAtIEEgRG9tYWluIGlzIGEgcmVmaW5lYWJsZSwgbG9naWNhbCwgaGllcmFyY2h5IG9mIHJlbGF0ZWQgPGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0czwvYT4gZ3JvdXBlZAotdG9nZXRoZXIgYmFzZWQgb24gdGltaW5nLCByZXNvdXJjZXMsIG9yIHJlbGF0aW9uc2hpcC4gV2hpbGUgYSBEb21haW4gY2F0ZWdvcml6ZXMKLW1hbnkgd29yayBwcm9kdWN0cywgYSB3b3JrIHByb2R1Y3QgYmVsb25ncyB0byBvbmx5IG9uZSBEb21haW4uIERvbWFpbnMgY2FuCi1iZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucy4gPC9saT4KLTxsaT48c3Ryb25nPldvcmsgUHJvZHVjdCBLaW5kczwvc3Ryb25nPiAtIFdvcmsgUHJvZHVjdCBLaW5kIGlzIGFub3RoZXIgY2F0ZWdvcnkgZm9yCi1ncm91cGluZyA8YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3RzPC9hPi4KLUEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgd29yayBwcm9kdWN0IGtpbmRzLiBBcyBhbiBleGFtcGxlLCB5b3UgbWlnaHQKLXdhbnQgdG8gaGF2ZSBhIHNlcmllcyBvZiB3b3JrIHByb2R1Y3Qga2luZHMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBvdmVyYWxsCi1pbnRlbnQgb2Ygd29yayBwcm9kdWN0cywgc3VjaCBhcyBzcGVjaWZpY2F0aW9uLCBwbGFuLCBvciBtb2RlbC48L2xpPgotPGxpPjxzdHJvbmc+Um9sZSBTZXRzPC9zdHJvbmc+IC0gQSBSb2xlIFNldCBpcyB1c2VkIHRvIGdyb3VwIDxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5Sb2xlczwvYT4gd2l0aCBjZXJ0YWluIGNvbW1vbmFsaXRpZXMgdG9nZXRoZXIuIEZvciBleGFtcGxlLAotaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgYW4gQW5hbHlzdCByb2xlIHNldCBjb3VsZCBiZSB1c2VkIHRvCi1ncm91cCB0b2dldGhlciByb2xlcyBzdWNoIGFzIEJ1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCwgU3lzdGVtIEFuYWx5c3QgYW5kCi1SZXF1aXJlbWVudHMgU3BlY2lmaWVyLiBFYWNoIG9mIHRoZXNlIHJvbGVzIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kCi1oYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IG1heSBiZSByZXNwb25zaWJsZSBmb3IgcGVyZm9ybWluZyBjZXJ0YWluIHRhc2tzCi1hbmQgY3JlYXRpbmcgY2VydGFpbiB3b3JrIHByb2R1Y3RzLiBSb2xlIHNldHMgY2FuIGJlIG9yZ2FuaXplZCB1c2luZyBSb2xlCi1TZXQgR3JvdXBpbmdzLjwvbGk+Ci08bGk+PHN0cm9uZz5Ub29sczwvc3Ryb25nPiAtIFRvb2xzIGlzIGEgY29udGFpbmVyIGZvciA8YSBocmVmPSJ0b29sbWVudG9yLmh0bWwjdG9vbG1lbnRvciI+VG9vbCBNZW50b3JzPC9hPi4gVG9vbHMgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucwotb2YgYSB0b29sIGFuZCBpdCdzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5DdXN0b20gQ2F0ZWdvcmllczwvaDQ+PHA+Q3VzdG9tIENhdGVnb3JpZXMgYXJlIGhpZ2hseSBjdXN0b21pemFibGUKLWFuZCBjYW4gY29udGFpbiBhbnkgdHlwZSBvZiBlbGVtZW50LiBDdXN0b20gQ2F0ZWdvcmllcyBhbGxvdyB5b3UgdG8gY2F0ZWdvcml6ZQotY29udGVudCBhY2NvcmRpbmcgdG8gYW55IHNjaGVtZSB5b3Ugd2FudCBhbmQgY2FuIHRoZW4gYmUgdXNlZCB0byBjb21wb3NlIHB1Ymxpc2hhYmxlCi1WaWV3cywgcHJvdmlkaW5nIGEgbWVhbnMgdG8gb3JnYW5pemUgdGhlIG1ldGhvZCBjb250ZW50IHByaW9yIHRvIHB1Ymxpc2hpbmcuCi1Gb3IgZXhhbXBsZSwgeW91IGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0aGF0IGxvZ2ljYWxseSBvcmdhbml6ZXMgY29udGVudAotcmVsZXZhbnQgdG8geW91ciBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudCwgc3VjaCBhcyBhIFRlc3RpbmcgY2F0ZWdvcnkKLXRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50cwotcmVsZXZhbnQgdG8gdGVzdGluZy48L3A+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIj5NZXRob2QgQ29udGVudCBQYWNrYWdlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50Ij5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50cGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50cGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYTg1Zjk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudHBhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik1ldGhvZCBDb250ZW50IFBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFjb250ZW50cGFja2FnZS5odG1sI2NyZWF0ZWNvbnRlbnRwYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ibWV0aG9kY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TWV0aG9kIENvbnRlbnQgUGFja2FnZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ibWV0aG9kY29udGVudHBhY2thZ2UiPjxhIG5hbWU9Im1ldGhvZGNvbnRlbnRwYWNrYWdlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWV0aG9kIENvbnRlbnQgUGFja2FnZTwvaDE+Ci08ZGl2PjxwPkEgTWV0aG9kIHBhY2thZ2UgaXMgYSBjb250YWluZXIgZm9yIG1ldGhvZCBlbGVtZW50cy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZAotaW4gbWV0aG9kIHBhY2thZ2VzIHRvIHN0cnVjdHVyZSBhIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMKLWFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gTWV0aG9kIGVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UKLWNhbiByZXVzZSBlbGVtZW50cyBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgbGluayBiZXR3ZWVuIHRoZW0uIEZvcgotZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IKLXRhc2tzIGRlZmluZWQgaW4gYW5vdGhlciBwYWNrYWdlLCBlbnN1cmluZyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZgotdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiBBbHNvLCBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5Ci1pbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuPC9wPgotPHA+PC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlN0cnVjdHVyZSBvZiBhIE1ldGhvZCBQYWNrYWdlPC9oND48cD5BbHRob3VnaCBhIG1ldGhvZAotcGFja2FnZSBpcyBhIGNvbnRhaW5lciBmb3IgbWV0aG9kIGVsZW1lbnRzLCBpdHMgc3RydWN0dXJlIGlzIGJyb2tlbiBkb3duIGludG8KLXNtYWxsZXIgcGFja2FnZXMgdG8gYmV0dGVyIG9yZ2FuaXplIHRoZSBjb250ZW50LCBzdWNoIGFzIGNvbnRlbnQgcGFja2FnZXMsCi1zdGFuZGFyZCBjYXRlZ29yaWVzLCBhbmQgY3VzdG9tIGNhdGVnb3JpZXMuPC9wPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhY29udGVudHBhY2thZ2UuaHRtbCNjcmVhdGVjb250ZW50cGFja2FnZSI+Q3JlYXRlIGEgQ29udGVudCBQYWNrYWdlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiI+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50Ij5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RwbHVnaW4uaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kcGx1Z2luLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4MzkwNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RwbHVnaW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik1ldGhvZCBQbHVnLWluIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJtZXRob2RwbHVnaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TWV0aG9kIFBsdWctaW48L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Im1ldGhvZHBsdWdpbiI+PGEgbmFtZT0ibWV0aG9kcGx1Z2luIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWV0aG9kIFBsdWctaW48L2gxPgotPGRpdj48cD5BbGwgY29udGVudCBpcyBvcmdhbml6ZWQgaW4gbWV0aG9kIHBsdWctaW5zLiBBIG1ldGhvZCBwbHVnLWluIGlzIGEgY29udGFpbmVyCi1mb3IgbWV0aG9kIHBhY2thZ2VzIHdoaWNoLCBpbiB0dXJuLCBjb250YWluIHRoZSBtZXRob2QgYW5kIHByb2Nlc3MgY29udGVudC4KLU1ldGhvZCBwbHVnLWlucyBhbmQgbWV0aG9kIHBhY2thZ2VzIGFsbG93IHlvdSB0byBvcmdhbml6ZSB5b3VyIGNvbnRlbnQgYXQKLWEgbGV2ZWwgb2YgZ3JhbnVsYXJpdHkgdGhhdCBzdWl0cyB5b3VyIG5lZWRzIGZvciBhdXRob3JpbmcgYW5kIHJldXNpbmcgdGhlCi1jb250ZW50LiA8L3A+Ci08cD5XaGVuIHlvdSBjcmVhdGUgYSBtZXRob2QgcGx1Zy1pbiwgeW91IHdpbGwgdXN1YWxseSB3YW50IHRvIHJldXNlIGNvbnRlbnQKLWluIG90aGVyIHBsdWctaW5zLiBZb3UgbWF5IHdhbnQgdG8gbW9kaWZ5IG9yIGV4dGVuZCB0aGUgY29udGVudCBpbiB0aGVzZSBvdGhlcgotcGx1Zy1pbnMgb3IgYWRkIHlvdXIgb3duIGNvbnRlbnQuIFdoZW4geW91IGNyZWF0ZSBhIHBsdWctaW4geW91Ci1jYW4gcmVmZXJlbmNlIGFueSBudW1iZXIgb2Ygb3RoZXIgcGx1Zy1pbnMgdGhhdCB3YW50IHRvIHVzZSBpbiB0aGlzIHdheS4gQQotbWV0aG9kIHBsdWctaW4gY2FuIGFsc28gYmUgc3RhbmQtYWxvbmUgYW5kIG5vdCByZWZlcmVuY2Ugb3RoZXIgcGx1Zy1pbnMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSI+TWV0aG9kIENvbnRlbnQgUGFja2FnZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiI+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9taWxlc3RvbmUuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWlsZXN0b25lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5Y2M3NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9taWxlc3RvbmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik1pbGVzdG9uZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJtaWxlc3RvbmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TWlsZXN0b25lPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJtaWxlc3RvbmUiPjxhIG5hbWU9Im1pbGVzdG9uZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk1pbGVzdG9uZTwvaDE+Ci08ZGl2PjxwPkEgTWlsZXN0b25lIGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgcHJvamVjdCwgc3VjaAotYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeQotc3VjaCBhcyB0aGUgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vcGVucGVyc3AuSlBHIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vcGVucGVyc3AuSlBHCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTRhNjA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3BlbnBlcnNwLkpQRworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3V0Y29tZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdXRjb21lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkM2ZiZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdXRjb21lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJPdXRjb21lIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXJ0aWZhY3QuaHRtbCNhcnRpZmFjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGVsaXZlcmFibGUuaHRtbCNkZWxpdmVyYWJsZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJvdXRjb21lIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPk91dGNvbWU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Im91dGNvbWUiPjxhIG5hbWU9Im91dGNvbWUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5PdXRjb21lPC9oMT4KLTxkaXY+PHA+QW4gb3V0Y29tZSBpcyBhbiBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0aGF0IG1heSBiZSBhIHJlc3VsdCBvciBzdGF0ZS4KLU91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkKLWRlZmluZWQuIDwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iYXJ0aWZhY3QuaHRtbCNhcnRpZmFjdCI+QXJ0aWZhY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImRlbGl2ZXJhYmxlLmh0bWwjZGVsaXZlcmFibGUiPkRlbGl2ZXJhYmxlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIj5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdXRkZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3V0ZGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkNjQ2OTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdXRkZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGFzdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wYXN0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVkN2U2OTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wYXN0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3BlcnNwZWN0aXZlcy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wZXJzcGVjdGl2ZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYThjM2U1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3BlcnNwZWN0aXZlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUGVyc3BlY3RpdmVzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icGVyc3BlY3RpdmVzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlBlcnNwZWN0aXZlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icGVyc3BlY3RpdmVzIj48YSBuYW1lPSJwZXJzcGVjdGl2ZXMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5QZXJzcGVjdGl2ZXM8L2gxPgotPGRpdj48cD5BIFBlcnNwZWN0aXZlIGRlZmluZXMgYSBzZXQgb2Ygdmlld3MgYW5kIGZ1bmN0aW9ucyBhdmFpbGFibGUgZm9yIHNwZWNpZmljCi10YXNrcy4gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBjb250YWlucyB0d28gd29ya2luZyBwZXJzcGVjdGl2ZXM6IGFuCi1BdXRob3JpbmcgUGVyc3BlY3RpdmUgYW5kIGEgQnJvd3NpbmcgUGVyc3BlY3RpdmUuPC9wPgotPHA+VGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZwotUGVyc3BlY3RpdmU8L2E+IHByb3ZpZGVzIHZpZXdzIGFuZCBmdW5jdGlvbnMgdG8gbmF2aWdhdGUgYW5kIGF1dGhvciBtZXRob2QKLWNvbnRlbnQgYW5kIHByb2Nlc3Nlcywgd2hpbGUgdGhlIDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPiwgYXMgaXRzIG5hbWUgaW1wbGllcywgYWxsb3dzIHlvdQotdG8gcHJldmlldyBhbmQgbmF2aWdhdGUgdGhyb3VnaCBhIDxhIGhyZWY9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwjbWV0aG9kY29uZmlndXJhdGlvbnMiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9hPiB3aXRob3V0IG1ha2luZyBhbnkgY2hhbmdlcy48L3A+Ci08cD5UbyBzZWxlY3QgYSBwZXJzcGVjdGl2ZSwgY2xpY2sgdGhlIE9wZW4gUGVyc3BlY3RpdmUgYnV0dG9uIDxpbWcgc3JjPSJvcGVucGVyc3AuSlBHIiBhbHQ9IiIgLz4uPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3BoYXNlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3BoYXNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzMmZlYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9waGFzZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUGhhc2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icGhhc2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UGhhc2U8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InBoYXNlIj48YSBuYW1lPSJwaGFzZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlBoYXNlPC9oMT4KLTxkaXY+PHA+QSBQaGFzZSBpcyBhIHNwZWNpYWwgdHlwZSBvZiBhY3Rpdml0eSB0aGF0IHJlcHJlc2VudHMgYSBzaWduaWZpY2FudAotcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggYSBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZQotb3Igc2V0IG9mIGRlbGl2ZXJhYmxlcy48L3A+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ByYWN0aWNlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ByYWN0aWNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlNzRjYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcmFjdGljZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHJhY3RpY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icHJhY3RpY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UHJhY3RpY2U8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InByYWN0aWNlIj48YSBuYW1lPSJwcmFjdGljZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlByYWN0aWNlPC9oMT4KLTxkaXY+PHA+QSBwcmFjdGljZSByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUKLWEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiBQcmFjdGljZXMKLWFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzCi10aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuIEV4YW1wbGVzCi1mb3IgcHJhY3RpY2VzIHdvdWxkIGJlIG1hbmFnZSByaXNrcywgY29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5LCBhcmNoaXRlY3R1cmUKLWNlbnRyaWMsIGFuZCBjb21wb25lbnQgYmFzZWQgZGV2ZWxvcG1lbnQsIHRvIG5hbWUgYSBmZXcuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcmV2aWV3Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ByZXZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzdhNGY5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ByZXZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlByZXZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icHJldmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5QcmV2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwcmV2aWV3Ij48YSBuYW1lPSJwcmV2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHJldmlldzwvaDE+Ci08ZGl2PjxwPlByZXZpZXcgZGlzcGxheXMgeW91ciBjb250ZW50IGluIGJyb3dzZXIgZm9ybWF0IHNpbWlsYXIgdG8KLWhvdyBpdCB3aWxsIGFwcGVhciB0byBhbiBlbmQgdXNlciBicm93c2luZyBhIHB1Ymxpc2hlZCBXZWIgc2l0ZS48L3A+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2NhdXRoLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2F1dGguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYmY4ZTg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2F1dGguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTJmYzgyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sI3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Qcm9jZXNzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwcm9jZXNzIj48YSBuYW1lPSJwcm9jZXNzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHJvY2VzczwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkEgPHNwYW4gY2xhc3M9ImtleXdvcmQiPnByb2Nlc3M8L3NwYW4+IGRlc2NyaWJlcyBob3cgYSBwYXJ0aWN1bGFyIHBpZWNlCi1vZiB3b3JrIHNob3VsZCBiZSBkb25lLiBUaGUgd29yayBtYXkgaGF2ZSBhIHJlbGF0aXZlbHkgc21hbGwgc2NvcGUsIGluIHdoaWNoCi1jYXNlIGl0IGNhbiBiZSBkZXNjcmliZWQgYXMgYSBjYXBhYmlsaXR5IHBhdHRlcm4sIG9yIG1heSBhZGRyZXNzIGEgZnVsbCBwcm9qZWN0Ci1saWZlY3ljbGUsIGluIHdoaWNoIGNhc2UgaXQgY2FuIGJlIGRlc2NyaWJlZCBhcyBhIGRlbGl2ZXJ5IHByb2Nlc3MuIEEgcHJvY2VzcwotY2FuIHJldXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgY29tYmluZXMgdGhlbSBpbnRvIGEgc3RydWN0dXJlIGFuZCBzZXF1ZW5jZQotZm9yIGNhcnJ5aW5nIG91dCB3b3JrLjwvcD4KLTxwPlRoZXJlIGFyZSB0d28gbWFpbiB0eXBlcyBvZiBwcm9jZXNzLCBhIDxhIGhyZWY9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iPkNhcGFiaWxpdHkgUGF0dGVybjwvYT4gYW5kCi1hIDxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2RlbGl2ZXJ5cHJvY2VzcyI+RGVsaXZlcnkgUHJvY2VzczwvYT4uCi1BIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBhIHNwZWNpYWwgcHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIKLW9mIGFjdGl2aXRpZXMgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMsIHdoaWxlIGEgZGVsaXZlcnkgcHJvY2VzcyBkZXNjcmliZXMKLWEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyB0eXBlIG9mIHByb2plY3QuPC9wPgotPHA+RWFjaAotdGltZSBhIHRhc2sgaXMgaW5jbHVkZWQgaW4gYSBwcm9jZXNzLCBhIHJlZmVyZW5jZSBvYmplY3QgdG8gdGhhdCB0YXNrIGlzIGNyZWF0ZWQKLWluIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9jZXNzLiBUaGlzIGlzIGNhbGxlZCBhIHRhc2sgZGVzY3JpcHRvci4gVGhlIHNhbWUKLXRhc2sgY2FuIGJlIHJlZmVyZW5jZWQgYW55IG51bWJlciBvZiB0aW1lcyBpbiB0aGUgc2FtZSBwcm9jZXNzLiBJbiBvdGhlciB3b3JkcywKLW9uZSB0YXNrIGNhbiBoYXZlIG1hbnkgdGFzayBkZXNjcmlwdG9ycy4gQSB0YXNrIGRlc2NyaXB0b3IgY2FuIGFsc28gbW9kaWZ5Ci10aGUgYmFzZSB0YXNrIHdpdGhvdXQgYWN0dWFsbHkgY2hhbmdpbmcgdGhlIHRhc2suIEZvciBleGFtcGxlLCByb2xlcyBhbmQgd29yawotcHJvZHVjdHMgY2FuIGJlIGFkZGVkIG9yIHN1cHByZXNzZWQsIGFuZCBzdGVwcyBjYW4gYmUgc3VwcHJlc3NlZCBvciByZS1zZXF1ZW5jZWQuPC9wPgotPHA+Um9sZXMKLWFuZCB3b3JrIHByb2R1Y3RzIGNhbiBhbHNvIGJlIGluY2x1ZGVkIGluIHByb2Nlc3NlcyBhcyByb2xlIGRlc2NyaXB0b3JzIGFuZAotd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzLiBSb2xlcyBhbmQgd29yayBwcm9kdWN0cyBjYW4gYmUgY3VzdG9taXplZCB0byBmaXQKLXdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIHByb2Nlc3MgaW4gd2hpY2ggdGhleSBhcmUgdXNlZC48L3A+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sI3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldyI+UHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiPkNyZWF0ZSBhIERlbGl2ZXJ5IFByb2Nlc3M8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iPkNyZWF0ZSBhIFJldXNhYmxlIENhcGFiaWxpdHkgUGF0dGVybjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTVjY2I0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwcm9jZXNzLmh0bWwjcHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3MuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldyI+PGEgbmFtZT0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXc8L2gxPgotPGRpdj48cD5BIGRldmVsb3BtZW50IHByb2Nlc3MgZGVmaW5lcyBzZXF1ZW5jZXMgb2YgdGFza3MgcGVyZm9ybWVkIGJ5IHJvbGVzIGFuZAotd29yayBwcm9kdWN0cyBwcm9kdWNlZCBvdmVyIHRpbWUuIDwvcD4KLTxwPjxpbWcgc3JjPSJwcm9jYXV0aC5naWYiIGFsdD0iIiAvPjwvcD4KLTxwPlByb2Nlc3NlcyBhcmUgdHlwaWNhbGx5IGV4cHJlc3NlZCBhcyB3b3JrZmxvd3Mgb3IgYnJlYWtkb3duCi1zdHJ1Y3R1cmVzLiBEZWZpbmluZyBhIHN0cmljdCBzZXF1ZW5jZSBhcyBpbiBhIHdhdGVyZmFsbCBtb2RlbCBpcyBhcyBtdWNoCi1hIHByb2Nlc3MgYXMgZGVmaW5pbmcgc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyBpbiBpdGVyYXRpb25zIG9mIHBhcmFsbGVsIHdvcmsuCi1UaGV5IGp1c3QgcmVwcmVzZW50IGRpZmZlcmVudCBkZXZlbG9wbWVudCBhcHByb2FjaGVzLiBIZW5jZSwgZm9yIGRlZmluaW5nCi1hIHByb2Nlc3MsIG9uZSBjYW4gdGFrZSBtZXRob2QgY29udGVudCBhbmQgY29tYmluZSBpdCBpbnRvIHN0cnVjdHVyZXMgdGhhdAotc3BlY2lmeSBob3cgdGhlIHdvcmsgc2hhbGwgYmUgb3JnYW5pemVkIG92ZXIgdGltZSwgdG8gbWVldCB0aGUgbmVlZHMgb2YgYQotcGFydGljdWxhciB0eXBlIG9mIGRldmVsb3BtZW50IHByb2plY3QgKHN1Y2ggYXMgc29mdHdhcmUgZm9yIGEgb25saW5lIHN5c3RlbQotdmVyc3VzIHNvZnR3YXJlIGFuZCBoYXJkd2FyZSBmb3IgYW4gZW1iZWRkZWQgc3lzdGVtKS4gRVBGIENvbXBvc2VyIHN1cHBvcnRzIHByb2Nlc3NlcwotYmFzZWQgb24gZGlmZmVyZW50IGRldmVsb3BtZW50IGFwcHJvYWNoZXMgYWNyb3NzIG1hbnkgZGlmZmVyZW50IGxpZmVjeWNsZQotbW9kZWxzLCBpbmNsdWRpbmcgd2F0ZXJmYWxsLCBpbmNyZW1lbnRhbCwgYW5kIGl0ZXJhdGl2ZSBsaWZlY3ljbGVzLiBFUEYgQ29tcG9zZXIgYWxzbwotc3VwcG9ydHMgZGlmZmVyZW50IHByZXNlbnRhdGlvbnMgZm9yIHByb2Nlc3MsIHN1Y2ggYXMgd29yay1icmVha2Rvd24gc3RydWN0dXJlCi1vciB3b3JrZmxvdyBwcmVzZW50YXRpb25zLiBZb3UgY2FuIGFsc28gZGVmaW5lIHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIgdGhhdCB1c2UgYQotbWluaW1hbCBzZXQgb2YgbWV0aG9kIGNvbnRlbnQgdG8gZGVmaW5lIHByb2Nlc3NlcyBmb3IgYWdpbGUsIHNlbGYtb3JnYW5pemluZwotdGVhbXMuPC9wPgotPHA+VGhlIEVQRiBDb21wb3NlciBzY3JlZW4gY2FwdHVyZSBhYm92ZSBzaG93cyBhbiBleGFtcGxlIG9mIGEgcHJvY2VzcyBwcmVzZW50ZWQgYXMKLWEgYnJlYWtkb3duIHN0cnVjdHVyZSBvZiBuZXN0ZWQgYWN0aXZpdGllcyBhcyB3ZWxsIGFzIGEgd29ya2Zsb3cgb3IgYWN0aXZpdHkKLWRpYWdyYW0gZm9yIG9uZSBwYXJ0aWN1bGFyIGFjdGl2aXR5LCB0aGUgaW5jZXB0aW9uIHBoYXNlLiBJdCBhbHNvIGluZGljYXRlcwotd2l0aCB0aGUgdHdvIGJsdWUgYXJyb3dzIHRoYXQgdGhlIHBhcnRpY3VsYXIgbWV0aG9kIGNvbnRlbnQgdGFzayAiRGV0YWlsIGEKLVVzZSBDYXNlIiBoYXMgYmVlbiBhcHBsaWVkIGluIHRoZSBwcm9jZXNzIHR3aWNlOyBmaXJzdGx5IGluIHRoZSBpbmNlcHRpb24KLXBoYXNlIHVuZGVyIHRoZSBhY3Rpdml0eSAiRGVmaW5lIHRoZSBTeXN0ZW0sIiBhbmQgc2Vjb25kbHksIGluIHRoZSBlbGFib3JhdGlvbgotcGhhc2UgaW4gdGhlIGFjdGl2aXR5ICJSZWZpbmUgdGhlIHN5c3RlbSBkZWZpbml0aW9uIi4gWW91IHNlZSBiZWxvdyBlYWNoIG9mCi10aGVzZSB0YXNrIGFwcGxpY2F0aW9ucywgcmVmZXJyZWQgdG8gYXMgYSB0YXNrIGRlc2NyaXB0b3JzIGluIEVQRiBDb21wb3NlciwgbGlzdHMgb2YKLXRoZSBwZXJmb3JtaW5nIHJvbGVzIGFzIHdlbGwgYXMgdGhlIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gSWYgeW91Ci1sb29rIGNsb3NlbHksIHlvdSBzZWUgdGhhdCB0aGVzZSBsaXN0cyBhcmUgZGlmZmVyZW50IGZvciBlYWNoIG9mIHRoZXNlIHR3bwotdGFzayBkZXNjcmlwdG9ycywgZXhwcmVzc2luZyBkaWZmZXJlbmNlcyBpbiBwZXJmb3JtaW5nIHRoZSAiRGV0YWlsIGEgVXNlIENhc2UiCi1tZXRob2QgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlLiBZb3Ugc2VlIGRpZmZlcmVudCByb2xlcyBpbnZvbHZlZCBhbmQgY2hhbmdlcwotaW4gdGhlIGxpc3Qgb2YgaW5wdXRzIHRvIGJlIGNvbnNpZGVyZWQgYW5kIG91dHB1dHMgdG8gYmUgcHJvZHVjZWQgb3IgdXBkYXRlZC4KLVRoZXNlIGNoYW5nZXMgd2VyZSBkZWZpbmVkIGJ5IHRoZSBhdXRob3IgdGhhdCBjcmVhdGVkIHRoaXMgcHJvY2VzcyB0byBleHByZXNzCi10aGUgZXhhY3QgZm9jdXMgb2YgdGhlIHRhc2sgcGVyZm9ybWFuY2UgZm9yIGVhY2ggb2NjdXJyZW5jZS4gSW4gYWRkaXRpb24gdG8KLXVwZGF0aW5nIHRoZSByb2xlcywgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzIGZvciBhIHRhc2sgZGVzY3JpcHRvciwKLXlvdSBjYW4gYWxzbyBwcm92aWRlIGFkZGl0aW9uYWwgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXMgd2VsbCBhcyBkZWZpbmUgdGhlCi1leGFjdCBzdGVwcyBvZiB0aGUgdGFzayB0aGF0IHNob3VsZCBhbmQgc2hvdWxkIG5vdCBiZSBwZXJmb3JtZWQgZm9yIHRoaXMgcGFydGljdWxhcgotb2NjdXJyZW5jZSBvZiB0aGUgdGFzay4gPC9wPgotPHA+RVBGIENvbXBvc2VyIHByb3ZpZGVzIHlvdSB3aXRoIGEgcHJvY2VzcyBlZGl0b3IgdGhhdCBzdXBwb3J0cyBkaWZmZXJlbnQgYnJlYWtkb3duCi1zdHJ1Y3R1cmUgdmlld3MgYXMgd2VsbCBhcyBncmFwaGljYWwgcHJvY2VzcyBwcmVzZW50YXRpb25zLiBBcyBhIHByb2Nlc3MgYXV0aG9yLAoteW91IHR5cGljYWxseSBzdGFydCBieSBjcmVhdGluZyBhbiBhY3Rpdml0eSBicmVha2Rvd24sIGRpdmlkaW5nIGFuZCBicmVha2luZwoteW91ciBwcm9jZXNzIGRvd24gaW50byBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBoaWdoLWxldmVsIGFjdGl2aXRpZXMuIEluc3RlYWQKLW9mIGNyZWF0aW5nIHlvdXIgYWN0aXZpdGllcyBpbiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IsIHlvdSBjYW4gYWx0ZXJuYXRpdmVseQotd29yayBpbiBhIGdyYXBoaWNhbCBhY3Rpdml0eSBkaWFncmFtIGVkaXRvciB0aGF0IGFsbG93cyB5b3UgdG8gZ3JhcGhpY2FsbHkKLWNyZWF0ZSBhIHdvcmtmbG93IGZvciB5b3VyIGFjdGl2aXRpZXMuIFRvIGFzc2lnbiBtZXRob2QgY29udGVudCB0byB5b3VyIHByb2Nlc3MsCi15b3UgdGhlbiBoYXZlIHRoZSBjaG9pY2Ugb2Ygd29ya2luZyBpbiBkaWZmZXJlbnQgcHJvY2VzcyB2aWV3cyAod29yayBicmVha2Rvd24KLXN0cnVjdHVyZSwgd29yayBwcm9kdWN0IHVzYWdlLCBvciB0ZWFtIGFsbG9jYXRpb24gdmlldykuIEVhY2ggdmlldyBzdXBwb3J0cwotYSBkaWZmZXJlbnQgYXBwcm9hY2ggZm9yIGNyZWF0aW5nIGEgcHJvY2Vzcy4gWW91IGNhbiBkZWZpbmUgdGhlIHdvcmsgdG8gYmUKLWRvbmUsIGRlZmluZSB0aGUgcmVzdWx0cyB0byBiZSBwcm9kdWNlZCwgb3IgZGVmaW5lIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdXIKLXJvbGVzLiBJZiByZXF1ZXN0ZWQsIHRoZSBlZGl0b3IgdXBkYXRlcyB0aGUgb3RoZXIgcHJvY2VzcyB2aWV3cyBzZW1pLWF1dG9tYXRpY2FsbHkKLXVzaW5nIHdpemFyZHMgdGhhdCBwcm9tcHQgeW91IGZvciBkZWNpc2lvbnMgb24gc2VsZWN0aW5nIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzLiA8L3A+Ci08L2Rpdj4KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJwcm9jZXNzLmh0bWwiPlByb2Nlc3M8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0icHJvY2Vzcy5odG1sI3Byb2Nlc3MiPlByb2Nlc3M8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiI+Q3JlYXRlIGEgUmV1c2FibGUgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyI+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXcuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTE0MmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlByb2Nlc3MgRWxlbWVudCBQcm9wZXJ0aWVzIFZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Qcm9jZXNzIEVsZW1lbnQgUHJvcGVydGllcyBWaWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Ij48YSBuYW1lPSJwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHJvY2VzcyBFbGVtZW50IFByb3BlcnRpZXMgVmlldzwvaDE+Ci08ZGl2PjxwPldoZW4geW91IGFyZSBlZGl0aW5nIGEgcHJvY2VzcywgdGhlIHByb2Nlc3MgZWxlbWVudCBwcm9wZXJ0aWVzIHZpZXcgYWxsb3dzCi15b3UgdG8gZWRpdCBhbGwgdGhlIGRldGFpbHMgZm9yIGEgc2luZ2xlIGVsZW1lbnQgaW4gdGhlIHByb2Nlc3MuIElmIHlvdSBjbGljawotaW4gYW55IHJvdyBpbiBhIHByb2Nlc3MgZGlzcGxheSwgeW91IHdpbGwgc2VlIHRoZSBmdWxsIGRldGFpbHMgb2YgdGhlIHByb2Nlc3MKLWVsZW1lbnQgaW4gdGhlIHJvdyBpbiB0aGUgcHJvcGVydGllcyB2aWV3LjwvcD4KLTxwPklmIHRoZSBwcm9wZXJ0aWVzIHZpZXcgaXMgbm90IG9wZW4sIHJpZ2h0IGNsaWNrIGFueSByb3cgaW4gYSBwcm9jZXNzIGFuZAotc2VsZWN0IDxzdHJvbmc+U2hvdyBQcm9wZXJ0aWVzIFZpZXc8L3N0cm9uZz4uPC9wPgotPHA+VGhlIHByb3BlcnRpZXMgdmlldyBpcyB0aGUgZWRpdG9yIGZvciBhY3Rpdml0aWVzLCB0YXNrIGRlc2NyaXB0b3JzLCByb2xlcwotZGVzY3JpcHRvcnMsIGFuZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMuIFRoZSBpbmZvcm1hdGlvbiBmb3IKLWEgZGVzY3JpcHRvciBpcyBzaW1pbGFyIHRvIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBlbGVtZW50IGVkaXRvciwgYnV0IGl0Ci1hbHNvIGhhcyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBlbGVtZW50IGluIHRoZSBwcm9jZXNzLiBUaGUgcHJvY2VzcyBpbmZvcm1hdGlvbgotaXMgYWxzbyBkaXNwbGF5ZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcm93IGluIHRoZSBwcm9jZXNzIGRpc3BsYXkuPC9wPgotPHA+PHN0cm9uZz5HZW5lcmFsIEluZm9ybWF0aW9uIHRhYjo8L3N0cm9uZz48L3A+Ci08cD5UaGUgTmFtZSBhbmQgUHJlc2VudGF0aW9uIE5hbWUgZGVmYXVsdCB0byB0aGUgY29ycmVzcG9uZGluZyBuYW1lcyBpbiB0aGUKLWJhc2UgbWV0aG9kIGVsZW1lbnQuIFRoZXNlIG5hbWVzIGNhbiBiZSBjaGFuZ2VkIGluIGEgZGVzY3JpcHRvci48L3A+Ci08ZGl2IGNsYXNzPSJwIj5UaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHVzZWQgdG8gc3BlY2lmeSBjZXJ0YWluIGFzcGVjdHMgb2YgdGhlIGVsZW1lbnQKLWluIHRoZSBwcm9jZXNzIGFuZCBjYW4gYmUgc2V0IGZvciBhbGwgdHlwZXMgb2YgcHJvY2VzcyBlbGVtZW50czo8dWw+PGxpPjxzdHJvbmc+T3B0aW9uYWw8L3N0cm9uZz46IElmIHRoaXMgaXMgY2hlY2tlZCAodHJ1ZSksIGl0IGluZGljYXRlcyB0aGF0IHRoZSBlbGVtZW50Ci1pcyBjb25zaWRlcmVkIG9wdGlvbmFsIGluIHRoZSBwcm9jZXNzLiBUaGlzIG1lYW5zIHRoYXQgaXQgaXMgc2FmZSB0byByZW1vdmUKLXRoZSBlbGVtZW50LiBJZiB0aGlzIGlzIG5vdCBjaGVja2VkIChmYWxzZSksIHRoZSBlbGVtZW50IGlzIGNvbnNpZGVyZWQgbWFuZGF0b3J5Ci1hbmQgc2hvdWxkIG5vdCBiZSByZW1vdmVkIGZyb20gdGhlIHByb2Nlc3MuPC9saT4KLTxsaT48c3Ryb25nPk11bHRpcGxlIE9jY3VycmVuY2VzPC9zdHJvbmc+OiBJZiB0aGlzIGlzIGNoZWNrZWQgKHRydWUpLCBpdCBpbmRpY2F0ZXMgdGhhdAotd2hlbiB0aGUgcHJvY2VzcyBpcyBpbnN0YW50aWF0ZWQgYXMgYSBwcm9qZWN0IG9yIG90aGVyIHByb2Nlc3MsIGl0IGlzIGV4cGVjdGVkCi10aGF0IHRoZXJlIHdpbGwgYmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgdGhpcyBlbGVtZW50LiBJZiB0aGlzIGlzIG5vdCBjaGVja2VkCi0oZmFsc2UpLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBzaG91bGQgb25seSBiZSBhIHNpbmdsZSBvY2N1cnJlbmNlIG9mIHRoaXMKLWVsZW1lbnQgd2hlbiB0aGUgcHJvY2VzcyBpcyBpbnN0YW50aWF0ZWQuPC9saT4KLTxsaT48c3Ryb25nPlBsYW5uZWQ8L3N0cm9uZz46IElmIHRoaXMgaXMgY2hlY2tlZCAodHJ1ZSksIHRoZSBlbGVtZW50IHdpbGwgYmUgaW5jbHVkZWQKLWluIGFuIGV4cG9ydCB0byBhIHByb2plY3QgbWFuYWdlbWVudCB0b29sLiBJZiB0aGlzIGlzIG5vdCBjaGVja2VkIChmYWxzZSksCi1pdCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiBhbiBleHBvcnQuPC9saT4KLTxsaT48c3Ryb25nPlN1cHByZXNzZWQ8L3N0cm9uZz46IElmIHRoaXMgaXMgY2hlY2tlZCAodHJ1ZSksIHRoZSBlbGVtZW50IHdpbGwgbm90IGFwcGVhcgotaW4gYSBwdWJsaXNoZWQgcHJvY2Vzcy4gVGhpcyBpcyB1c3VhbGx5IHVzZWQgdG8gbW9kaWZ5IGEgY2FwYWJpbGl0eSBwYXR0ZXJuCi1pbmNsdWRlZCBpbiBhIHByb2Nlc3MuIFRoaXMgaXMgbm90IGNoZWNrZWQgKGZhbHNlKSBhcyBkZWZhdWx0LjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj5UaGUgZm9sbG93aW5nIGVsZW1lbnRzIGNhbiBiZSBzZXQgZm9yIHRhc2sgZGVzY3JpcHRvcnMgYW5kIGFjdGl2aXRpZXM6PHVsPjxsaT48c3Ryb25nPkV2ZW50IERyaXZlbjwvc3Ryb25nPjogSWYgdGhpcyBpcyBjaGVja2VkICh0cnVlKSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlCi10YXNrIG9yIGFjdGl2aXR5IHdpbGwgYmUgaW5pdGlhdGVkIHdoZW4gYSBwYXJ0aWN1bGFyIGV2ZW50IG9jY3Vycy4gSWYgdGhpcwotaXMgbm90IGNoZWNrZWQgKGZhbHNlKSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHRhc2sgb3IgYWN0aXZpdHkgd2lsbCBiZSBpbml0aWF0ZWQKLWJhc2VkIG9uIG90aGVyIHRhc2tzIGluIHRoZSBwcm9jZXNzLjwvbGk+Ci08bGk+PHN0cm9uZz5PbmdvaW5nPC9zdHJvbmc+OiBJZiB0aGlzIGlzIGNoZWNrZWQgKHRydWUpLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzawotb3IgYWN0aXZpdHkgaXMgY29udGludW91cy4gSWYgdGhpcyBpcyBub3QgY2hlY2tlZCAoZmFsc2UpLCBpdCBpbmRpY2F0ZXMgdGhhdAotdGhlIHRhc2sgb3IgYWN0aXZpdHkgaGFzIGEgY2xlYXIgc3RhcnQgYW5kIGZpbmlzaCBpbiB0aGUgcHJvY2Vzcy48L2xpPgotPGxpPjxzdHJvbmc+UmVwZWF0YWJsZTwvc3Ryb25nPjogSWYgdGhpcyBpcyBjaGVja2VkICh0cnVlKSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHRhc2sKLW9yIGFjdGl2aXR5IGNhbiBpdGVyYXRlIHdoZW4gdGhlIHByb2Nlc3MgaXMgaW5zdGFudGlhdGVkLiBJZiB0aGlzIGlzIG5vdCBjaGVja2VkCi0oZmFsc2UpLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBvciBhY3Rpdml0eSB3aWxsIG9ubHkgb2NjdXIgb25jZSBpbiB0aGUKLXByb2Nlc3MuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxwPkRlcGVuZGVuY3kgRmllbGQ6IFlvdSBjYW4gYWRkIG9uZSBvciBtb3JlIGRlcGVuZGVuY2llcyBmb3IgYSB0YXNrIG9yIGFjdGl2aXR5LgotQ2xpY2sgdGhlIDxzdHJvbmc+QWRkLi4uPC9zdHJvbmc+IGJ1dHRvbiBhbmQgZW50ZXIgdGhlIGluZGV4IG51bWJlciBmb3IgdGhlIHRhc2sgb3IKLWFjdGl2aXR5IG9uIHdoaWNoIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgZGVwZW5kZW50LiBUaGUgZGVwZW5kZW5jeSAodHlwZSkKLWRlZmF1bHRzIHRvIEZpbmlzaC10by1TdGFydC4gSWYgeW91IHdhbnQgdG8gc2V0IGFub3RoZXIgZGVwZW5kZW5jeSB0eXBlLCBjbGljawotdGhlIDxzdHJvbmc+RWRpdDwvc3Ryb25nPiBidXR0b24gYW5kIHNlbGVjdCB0aGUgcmVxdWlyZWQgZGVwZW5kZW5jeSB0eXBlIGluIHRoZSBkZXBlbmRlbmN5Ci1kcm9wIGRvd24gYm94LiBZb3UgY2FuIGVudGVyIGEgZGlmZmVyZW50IGluZGV4IG51bWJlciBvbiB0aGUgRWRpdCBkaWFsb2cuCi1Zb3UgY2FuIGFsc28gcmVtb3ZlIGEgZGVwZW5kZW5jeSBieSBzZWxlY3RpbmcgdGhlIGRlcGVuZGVuY3kgYW5kIGNsaWNraW5nCi10aGUgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gYnV0dG9uLjwvcD4KLTxwPlRoZSBiYXNlIG1ldGhvZCBlbGVtZW50IGZvciB0aGUgZGVzY3JpcHRvciBpcyBkaXNwbGF5ZWQgb24gdGhlIHBhZ2UuIFlvdQotY2FuIHNlbGVjdCBhIGRpZmZlcmVudCBlbGVtZW50IGJ5IGNsaWNraW5nIHRoZSA8c3Ryb25nPkxpbmsgTWV0aG9kIEVsZW1lbnQ8L3N0cm9uZz4gYnV0dG9uCi1hbmQgc2VsZWN0aW5nIHRoZSByZXF1aXJlZCBlbGVtZW50LjwvcD4KLTxwPjxzdHJvbmc+RG9jdW1lbnRhdGlvbiB0YWI6PC9zdHJvbmc+PC9wPgotPHA+VGhlIGRvY3VtZW50YXRpb24gdGFiIGNvbnRhaW5zIGRlc2NyaXB0aXZlIGF0dHJpYnV0ZXMgZm9yIHRoZSBkZXNjcmlwdG9yCi1vciBhY3Rpdml0eS48L3A+Ci08cD48c3Ryb25nPlJvbGwtVXAgdGFiczo8L3N0cm9uZz48L3A+Ci08cD5UaGUgcHJvcGVydGllcyB2aWV3IGZvciBhbiBhY3Rpdml0eSBpbmNsdWRlcyByb2xsLXVwIHRhYnMgdGhhdCBwcm92aWRlCi1saXN0cyBvZiB0YXNrcywgcm9sZXMsIG9yIHdvcmsgcHJvZHVjdHMgInJvbGxlZCB1cCIsIG9yIHN1bW1hcml6ZWQsIGZvciB0aGUKLWFjdGl2aXR5LjwvcD4KLTxwPjxzdHJvbmc+QXNzb2NpYXRpb24gdGFiczo8L3N0cm9uZz48L3A+Ci08cD5UaGUgcmVtYWluaW5nIHRhYnMgYXJlIHVzZWQgdG8gYWRkIG9yIHJlbW92ZSBhc3NvY2lhdGlvbnMgYmV0d2VlbiB0aGUgYWN0aXZpdHkKLW9yIGRlc2NyaXB0b3IgdG8gbWV0aG9kIGVsZW1lbnRzLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHViLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDcyNTQ3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3B1Yi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3B1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYi5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmYyOWE1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3B1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHVibGlzaGluZyBhIE1ldGhvZCBDb25maWd1cmF0aW9uIHRvIGEgTWV0aG9kIFdlYiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwjcHVibGlzaGluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJleHBvcnRhcHJvY2Vzc29ybWV0aG9kY29udGVudHRvYXBsYW5uaW5ndG9vbC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb25maWd1cmF0aW9ucy5odG1sI21ldGhvZGNvbmZpZ3VyYXRpb25zIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InB1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYiIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5QdWJsaXNoaW5nIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gdG8gYSBNZXRob2QgV2ViPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIiPjxhIG5hbWU9InB1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlB1Ymxpc2hpbmcgYSBNZXRob2QgQ29uZmlndXJhdGlvbiB0byBhIE1ldGhvZCBXZWI8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5Vc2luZyB0aGUgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQsIHlvdSBjYW4gc2VsZWN0IGZyb20KLWEgc2VyaWVzIG9mIHB1YmxpY2F0aW9uIG9wdGlvbnMgdG8gdHVybiBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGludG8gYSBwdWJsaXNoZWQKLW1ldGhvZCBXZWIuPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBwdWJsaXNoIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb246PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSB0b29sYmFyLCBzZWxlY3QgPHN0cm9uZz5Db25maWd1cmF0aW9uICZndDsgUHVibGlzaDwvc3Ryb25nPi4gVGhlIFB1Ymxpc2gKLU1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZCBhcHBlYXJzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PbiB0aGUgU2VsZWN0IENvbmZpZ3VyYXRpb24gcGFnZSwgc2VsZWN0IHRoZSBjb25maWd1cmF0aW9uIHlvdQotd2FudCB0byBwdWJsaXNoIGZyb20gdGhlIGxpc3Qgb2YgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGluIHRoZSBsaWJyYXJ5IGFuZAotdGhlbiBjbGljayA8c3Ryb25nPk5leHQ8L3N0cm9uZz4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uIHRoZSBTcGVjaWZ5IFB1Ymxpc2hpbmcgT3B0aW9ucyBwYWdlOjwvc3Bhbj48dWw+PGxpPlByb3ZpZGUgYSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZm9yIHRoZSBwdWJsaXNoZWQgV2ViIHNpdGUgaW4gdGhlCi1QdWJsaWNhdGlvbiBwYXRoIGZpZWxkLjwvbGk+Ci08bGk+UHJvdmlkZSBhIHRpdGxlIGZvciB0aGUgcHVibGlzaGVkIG1ldGhvZCB3ZWIuPC9saT4KLTxsaT5TZWxlY3QgYSBiYW5uZXIgaW1hZ2UgdG8gdXNlLjwvbGk+Ci08bGk+U2VsZWN0IGEgZmlsZSB0byB1c2UgZm9yIHRoZSAiYWJvdXQiIGluZm9ybWF0aW9uLjwvbGk+Ci08bGk+UHJvdmlkZSBhIGZlZWRiYWNrIFVSTDwvbGk+Ci08bGk+Q2hvb3NlIHRvIGluY2x1ZGUgYSBnbG9zc2FyeSwgaW5kZXgsIHNlYXJjaCBjYXBhYmlsaXR5IGFuZC9vciBwcm9jZXNzCi10cmVlIGN1c3RvbWl6YXRpb24uPC9saT4KLTxsaT5DaG9vc2UgdG8gY2hlY2sgdGhhdCBleHRlcm5hbCBoeXBlcmxpbmtzIGFyZSB2YWxpZC48L2xpPgotPGxpPkNob29zZSB0byBwdWJsaXNoIGFjdGl2aXR5IGRpYWdyYW1zIHRoYXQgaGF2ZSBub3QgYmVlbiBlZGl0ZWQsIHN1Y2gKLWFzIGFjdGl2aXR5IGRpYWdyYW1zIHRoYXQgaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSB0aGUgdG9vbCwgYnV0IG5vdCBtYW51YWxseQotZWRpdGVkLjwvbGk+Ci08L3VsPgotIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBDaG9vc2luZyB0byBpbmNsdWRlIGVpdGhlciB0aGUgc2VhcmNoIGNhcGFiaWxpdHkgb3IgdG8gc3VwcG9ydAotY3VzdG9taXphdGlvbiBvZiB0aGUgcHJvY2VzcyB2aWV3IHdpbGwgaW5jbHVkZSB0aGUgYnJvd3NlciBhcHBsZXQgaW4gdGhlIHB1Ymxpc2hlZAotV2ViIHNpdGUuIElmIHlvdSBjaG9vc2Ugbm90IHRvIHB1Ymxpc2ggd2l0aCB0aGUgbGFzdCB0d28gb3B0aW9ucywgdGhlIGJyb3dzZXIKLWFwcGxldCB3aWxsIG5vdCBiZSBpbmNsdWRlZC48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+RmluaXNoPC9zdHJvbmc+LiBQdWJsaXNoaW5nIGlzIGluaXRpYXRlZC48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJwdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCNwdWJsaXNoaW5nb3ZlcnZpZXciPlB1Ymxpc2hpbmcgT3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwjbWV0aG9kY29uZmlndXJhdGlvbnMiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3B1Ymxpc2hpbmdvdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Mzk4MGUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQdWJsaXNoaW5nIE92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzLmh0bWwjY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViLmh0bWwjcHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJleHBvcnRhcHJvY2Vzc29ybWV0aG9kY29udGVudHRvYXBsYW5uaW5ndG9vbC5odG1sI2V4cG9ydGFwcm9jZXNzb3JtZXRob2Rjb250ZW50dG9hcGxhbm5pbmd0b29sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InB1Ymxpc2hpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5QdWJsaXNoaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwdWJsaXNoaW5nb3ZlcnZpZXciPjxhIG5hbWU9InB1Ymxpc2hpbmdvdmVydmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlB1Ymxpc2hpbmcgT3ZlcnZpZXc8L2gxPgotPGRpdj48cD5UaGUgdWx0aW1hdGUgb3V0cHV0IG9mIEVQRiBDb21wb3NlciBpcyBhIHB1Ymxpc2hlZCBXZWIgc2l0ZSB3aXRoIG1ldGhvZAotZ3VpZGFuY2UgYW5kIHByb2Nlc3NlcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgcHJvamVjdCB0ZWFtLiBUaGUgaW5mb3JtYXRpb24KLWNvbnRhaW5lZCBpbiB0aGUgV2ViIHNpdGUgcHJvdmlkZXMgYSBwcm9qZWN0IHRlYW0gd2l0aCBhIGNvbnNpc3RlbnQgbWV0aG9kCi1mb3IgdGhlIGVudGlyZSB0ZWFtIHRvIGZvbGxvdyBhbmQgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgZW5kLXRvLWVuZAotd29yayBsaWZlY3ljbGUuIDwvcD4KLTxwPkl0IGlzIGVhc3kgdG8gY29uZmlndXJlIGEgcHJvY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUgb3Igc2l6ZSBvZiBwcm9qZWN0Ci1hbmQgdG8gcHVibGlzaCB0aGUgZ3VpZGFuY2UgdG8gYSBXZWIgc2l0ZS4gQSBNZXRob2QgQ29uZmlndXJhdGlvbiBpcyBhIHNlbGVjdGlvbgotb2YgQ29udGVudCBQYWNrYWdlcyBhY3Jvc3MgZGlmZmVyZW50IE1ldGhvZCBQbHVnLWlucyBjb250YWluaW5nIHRoZSBtZXRob2QKLWFuZCBwcm9jZXNzIGNvbnRlbnQgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBwdWJsaXNoZWQgV2ViIHNpdGUuIEF0IHB1Ymxpc2hpbmcKLXRpbWUsIHRoZSBjb25maWd1cmF0aW9uIGlzIGNvbWJpbmVkIHdpdGggZGlmZmVyZW50IE1ldGhvZCBWaWV3cyB3aGljaCBkZWZpbmUKLXRoZSBXZWIgc2l0ZSdzIG5hdmlnYXRpb24gc3RydWN0dXJlcyBhbmQgY29udGVudCBvcmdhbml6YXRpb24uPC9wPgotPHA+VGhlIEJyb3dzaW5nIFBlcnNwZWN0aXZlIHJlbmRlcnMgdGhlIE1ldGhvZCBDb25maWd1cmF0aW9uIGNvbnRlbnQgaW4gSFRNTAotZm9ybWF0IHdpdGhpbiB0aGUgdG9vbCwgcHJvdmlkaW5nIGEgbmF2aWdhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXRob2QKLW9yIHByb2Nlc3MgY29udGVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24uPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcy5odG1sI2NyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMiPkNyZWF0ZSBhIE1ldGhvZCBWaWV3IHdpdGggQ3VzdG9tIENhdGVnb3JpZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InB1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYi5odG1sI3B1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYiI+UHVibGlzaGluZyBhIE1ldGhvZCBDb25maWd1cmF0aW9uIHRvIGEgTWV0aG9kIFdlYjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JlcGxhY2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmVwbGFjZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjY2VlMmYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmVwbGFjZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUmVwbGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImV4dGVuZHMuaHRtbCNleHRlbmRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjb250cmlidXRlcy5odG1sI2NvbnRyaWJ1dGVzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJlcGxhY2VzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlJlcGxhY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyZXBsYWNlcyI+PGEgbmFtZT0icmVwbGFjZXMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5SZXBsYWNlczwvaDE+Ci08ZGl2PjxwPkEgcmVwbGFjaW5nIGVsZW1lbnQgcmVwbGFjZXMgcGFydHMgb2YgdGhlIGJhc2UgZWxlbWVudC4gUmVwbGFjZXMgcHJvdmlkZXMKLWEgd2F5IGZvciBhbiBlbGVtZW50IHRvIHJlcGxhY2UgYSBiYXNlIGVsZW1lbnQgd2l0aG91dCBkaXJlY3RseSBjaGFuZ2luZyBhbnkKLW9mIHRoZSBiYXNlIGVsZW1lbnQncyBleGlzdGluZyBwcm9wZXJ0aWVzLiBUaGlzIGlzLCBpbiBtb3N0IGNhc2VzLCB1c2VkIGZvcgotbWV0aG9kIHBsdWctaW5zIHRoYXQgYWltIHRvIHJlcGxhY2Ugc3BlY2lmaWMgY29udGVudCBlbGVtZW50cyBzdWNoIGFzIHJvbGVzLAotdGFza3MsIG9yIGFjdGl2aXRpZXMgd2l0aCBlaXRoZXIgYSBjb21wbGV0ZWx5IG5ldyB2YXJpYW50IG9yIHRvIGNoYW5nZSB0aGUKLWZ1bmRhbWVudGFsIHJlbGF0aW9uc2hpcHMgb2YgdGhlc2UgZWxlbWVudHMuIFRoZSBlZmZlY3Qgb2YgdGhpcywgaXMgdGhhdCB0aGUKLWJhc2UgY29udGVudCBlbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIHRoZSBuZXcgcmVwbGFjaW5nIGVsZW1lbnQKLXRvIHdoaWNoIGFsbCBpbmNvbWluZyBhc3NvY2lhdGlvbnMgc3RpbGwgcG9pbnQgYXMgYmVmb3JlLCBidXQgd2hpY2ggaGFzIHBvdGVudGlhbGx5Ci1uZXcgYXR0cmlidXRlIHZhbHVlcyBhbmQgb3V0Z29pbmcgYXNzb2NpYXRpb24gcHJvcGVydGllcy48L3A+Ci08cD5Vc2UgdGhlIENvbnRlbnQgVmFyaWFiaWxpdHkgc2VjdGlvbiBvbiB0aGUgRGVzY3JpcHRpb24gdGFiIHRvIG1ha2UgYW4gZWxlbWVudAotcmVwbGFjZSBhbm90aGVyIGVsZW1lbnQuIFNlbGVjdCA8c3Ryb25nPlJlcGxhY2VzPC9zdHJvbmc+IGFzIHRoZSB2YXJpYWJpbGl0eSB0eXBlIGFuZAotc2VsZWN0IHRoZSBiYXNlIGVsZW1lbnQgdGhhdCB0aGlzIGVsZW1lbnQgd2lsbCByZXBsYWNlLiBUaGUgYmFzZSBlbGVtZW50IG11c3QKLWJlIHRoZSBzYW1lIHR5cGUgb2YgZWxlbWVudCBhcyB0aGUgcmVwbGFjaW5nIGVsZW1lbnQuPC9wPgotPHA+V2hlbiB5b3UgcmVwbGFjZSBhbiBlbGVtZW50LCBhbGwgdGhlIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZXMgYXJlIHJlcGxhY2VkCi1ieSB0aGUgcmVwbGFjaW5nIGVsZW1lbnQuIElmIGEgZGVzY3JpcHRpb24gYXR0cmlidXRlIGluIHRoZSByZXBsYWNpbmcgZWxlbWVudAotaXMgYmxhbmssIGJ1dCB0aGUgYmFzZSBlbGVtZW50IGhhcyBjb250ZW50LCB0aGUgYXR0cmlidXRlIHdpbGwgYmUgYmxhbmsgaW4KLXRoZSByZXN1bHRpbmcgZWxlbWVudC48L3A+Ci08cD5SZXBsYWNlIGFsd2F5cyByZXBsYWNlcyBhdHRyaWJ1dGVzIGFuZCBhc3NvY2lhdGlvbnMgb2YgdGhlIGJhc2UgZWxlbWVudAotd2l0aCB0aGUgcmVwbGFjaW5nIGVsZW1lbnQncyBhdHRyaWJ1dGVzIGFuZCBhc3NvY2lhdGlvbnMsIGV4Y2VwdCBmb3IgaW5jb21pbmcKLWFzc29jaWF0aW9ucywgd2hpY2ggYXJlIG9ubHkgYWRkZWQgdG8gdGhlIGJhc2UsIGJ1dCBkbyBub3QgcmVwbGFjZSB0aGUgYmFzZSdzCi1pbmNvbWluZyBhc3NvY2lhdGlvbnMuPC9wPgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5SZXBsYWNlcyBydWxlczo8L3N0cm9uZz48dWw+PGxpPkF0dHJpYnV0ZXMgb2YgdGhlIGJhc2UgZWxlbWVudCBhcmUgcmVwbGFjZWQgd2l0aCBhdHRyaWJ1dGVzIG9mIHRoZSByZXBsYWNpbmcKLWVsZW1lbnQgaW5jbHVkaW5nIGlkZW50aWZpZXIgb2YgdGhlIGJhc2UgZWxlbWVudC48L2xpPgotPGxpPk91dGdvaW5nIHRvLW9uZSBhbmQgdG8tbWFueSBhc3NvY2lhdGlvbnMgb2YgdGhlIHJlcGxhY2luZyBlbGVtZW50IHJlcGxhY2UKLWFueSBvdXRnb2luZyBhc3NvY2lhdGlvbnMgb2YgdGhlIGJhc2UgZWxlbWVudC4gSWYgdGhlIGNvbnRyaWJ1dG9yIGRvZXMgbm90Ci1oYXZlIGFueSBvdXRnb2luZyBhc3NvY2lhdGlvbnMsIHRoZW4gbmVpdGhlciB3aWxsIHRoZSByZXN1bHRpbmcgZWxlbWVudC48L2xpPgotPGxpPkluY29taW5nIGFzc29jaWF0aW9ucyB3aXRoIGEgdG8tbWFueSBjb25zdHJhaW50IG9uIHRoZSBvdGhlciBhc3NvY2lhdGlvbgotZW5kIHRvIHRoZSByZXBsYWNlZCBlbGVtZW50IGFyZSBwcmVzZXJ2ZWQgYW5kIGF1Z21lbnRlZCB3aXRoIGluY29taW5nIGFzc29jaWF0aW9ucwotb2YgdGhlIHJlcGxhY2luZyBlbGVtZW50LjwvbGk+Ci08bGk+SW5jb21pbmcgYXNzb2NpYXRpb25zIHdpdGggYSB0by1vbmUgY29uc3RyYWludCBvbiB0aGUgb3RoZXIgYXNzb2NpYXRpb24KLWVuZCB0byB0aGUgcmVwbGFjZWQgZWxlbWVudCBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgcmVzcGVjdGl2ZSBpbmNvbWluZyBhc3NvY2lhdGlvbgotb2YgdGhlIHJlcGxhY2luZyBlbGVtZW50LiBJZiB0aGUgcmVwbGFjaW5nIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBzdWNoIGFuIGFzc29jaWF0aW9uCi10aGVuIHRoZSByZXN1bHRpbmcgZWxlbWVudCBrZWVwcyB0aGUgaW5jb21pbmcgYXNzb2NpYXRpb24gb2YgdGhlIGJhc2UgZWxlbWVudC48L2xpPgotPGxpPkEgYmFzZSBlbGVtZW50IG9mIGEgcmVwbGFjZW1lbnQgY2FuIGhhdmUgb25seSBvbmUgcmVwbGFjaW5nIGVsZW1lbnQgcGVyCi1jb25maWd1cmF0aW9uLiBJZiBtb3JlIHRoYW4gb25lIHJlcGxhY2luZyBlbGVtZW50IGlzIHByZXNlbnQsIG5vIHJlcGxhY2VtZW50Ci10YWtlcyBwbGFjZS48L2xpPgotPGxpPlJlcGxhY2VtZW50IHdvcmtzIHRyYW5zaXRpdmVseSwgaS5lLiBpZiBhIHJlcGxhY2luZyBlbGVtZW50IGlzIHJlcGxhY2VkCi1pdHNlbGYsIHRoZSBmaW5hbCByZXBsYWNlciBwcmV2YWlscy48L2xpPgotPGxpPkNvbnRyaWJ1dGlvbiBwcmVjZWRlcyBSZXBsYWNlbWVudCwgaS5lLiBjb250cmlidXRpb24gaXMgZXZhbHVhdGVkIGZpcnN0Ci1hbmQgdGhlbiByZXBsYWNlbWVudCBwZXJmb3JtZWQgYWZ0ZXJ3YXJkLiBUaGUgZXZhbHVhdGlvbiBvZiBjb250cmlidXRpb24gYW5kCi1yZXBsYWNlbWVudCBpcyBwZXJmb3JtZWQgdG9wLWRvd24gaW4gdGhlIHNwZWNpYWxpemF0aW9uIGhpZXJhcmNoeS48L2xpPgotPC91bD4KLVNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sI3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIj5WYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnM8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBhc3NvY2lhdGlvbnMgZm9yIGVhY2ggZWxlbWVudAotdHlwZS48L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIHRpdGxlPSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iPlZhcmlhYmlsaXR5PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJleHRlbmRzLmh0bWwjZXh0ZW5kcyI+RXh0ZW5kczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY29udHJpYnV0ZXMuaHRtbCNjb250cmlidXRlcyI+Q29udHJpYnV0ZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXBvcnQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmVwb3J0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyNTNhMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXBvcnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJlcG9ydCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJyZXBvcnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UmVwb3J0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyZXBvcnQiPjxhIG5hbWU9InJlcG9ydCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJlcG9ydDwvaDE+Ci08ZGl2PjxwPkEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUKLWJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4KLUZvciBleGFtcGxlLCBhIHJlcG9ydCBtYXkgY29tYmluZSBhIGdyYXBoaWNhbCBtb2RlbCBmcm9tIGEgZGVzaWduIHRvb2wgd2l0aAotdGV4dHVhbCBpbmZvcm1hdGlvbiBkb2N1bWVudHMgaW50byBhIHJlcG9ydC48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JldXNhYmxlYXNzZXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmV1c2FibGVhc3NldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZTAxMTRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmV1c2FibGVhc3NldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUmV1c2FibGUgQXNzZXQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icmV1c2FibGVhc3NldCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5SZXVzYWJsZSBBc3NldDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icmV1c2FibGVhc3NldCI+PGEgbmFtZT0icmV1c2FibGVhc3NldCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJldXNhYmxlIEFzc2V0PC9oMT4KLTxkaXY+PHA+QSByZXVzYWJsZSBhc3NldCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LgotVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZyBob3cgdGhlCi1hc3NldCBzaG91bGQgYmUgdXNlZC48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JpY2h0ZXh0ZWRpdG9yLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JpY2h0ZXh0ZWRpdG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1YzFhNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yaWNodGV4dGVkaXRvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUmljaCBUZXh0IEVkaXRvciIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJyaWNodGV4dGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5SaWNoIFRleHQgRWRpdG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyaWNodGV4dGVkaXRvciI+PGEgbmFtZT0icmljaHRleHRlZGl0b3IiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5SaWNoIFRleHQgRWRpdG9yPC9oMT4KLTxkaXY+PHA+VGhlIFJpY2ggVGV4dCBFZGl0b3IgcHJvdmlkZXMgc2ltcGxlIHRleHQgZm9ybWF0dGluZyBmdW5jdGlvbnMKLXRoYXQgYWxsb3cgYW4gYXV0aG9yIHRvIGNoYW5nZSBob3cgc2VjdGlvbnMgb2YgdGV4dCBhcHBlYXIgaW4gYSBwdWJsaXNoZWQKLVdlYiBzaXRlLiBUaGUgUmljaCBUZXh0IEVkaXRvciBhbGxvd3MgaW5kaXZpZHVhbCBjb21wb25lbnRzIG9mIHRleHQgdG8gYmUKLWNoYW5nZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBvdmVyYWxsIHN0eWxlIHNoZWV0KHMpIHRoYXQgZGV0ZXJtaW5lIHRoZQotc3R5bGUgYW5kIGZvcm1hdCBvZiBhIHB1Ymxpc2hlZCBXZWIgc2l0ZS48L3A+Ci08ZGl2IGNsYXNzPSJwIj5UaGUgUmljaCBUZXh0IEVkaXRvciBhbGxvd3MgeW91IHRvOjx1bD48bGk+Q29weSwgY3V0IGFuZCBwYXN0ZSB0ZXh0LiBTaW1wbHkgaGlnaGxpZ2h0IHRoZSB0ZXh0IHlvdSB3YW50IHRvIGN1dCBvcgotY29weSBhbmQgdGhlbiBjbGljayB0aGUgQ3V0IDxpbWcgc3JjPSJjdXQuZ2lmIiBhbHQ9IiIgLz4gb3IgQ29weSA8aW1nIHNyYz0iY29weS5naWYiIGFsdD0iIiAvPiBidXR0b25zLiBUbyBwYXN0ZSB0ZXh0LCBwbGFjZSB0aGUgY3Vyc29yCi13aGVyZSB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSB0ZXh0IGFuZCB0aGVuIGNsaWNrIHRoZSBQYXN0ZSBidXR0b24gPGltZyBzcmM9InBhc3RlLmdpZiIgYWx0PSIiIC8+LjwvbGk+Ci08bGk+UmVtb3ZlIGFsbCB0aGUgY29udGVudHMgaW4gdGhlIHRleHQgZWRpdG9yIHdpbmRvdyBhdCBvbmNlIGJ5IGNsaWNraW5nCi10aGUgQ2xlYXIgQ29udGVudCBidXR0b24gPGltZyBzcmM9ImNsZWFyY29udGVudC5naWYiIGFsdD0iIiAvPi48L2xpPgotPGxpPkNoYW5nZSB0aGUgYXBwZWFyYW5jZSBvZiB5b3VyIHRleHQgYnkgbWFraW5nIGl0IGJvbGQsIGl0YWxpY2l6ZWQsIG9yIHVuZGVybGluaW5nCi1pdC4gSGlnaGxpZ2h0IHRoZSB0ZXh0IHlvdSB3YW50IHRvIGNoYW5nZSBhbmQgdGhlbiBjbGljayB0aGUgQm9sZCA8aW1nIHNyYz0iYm9sZC5naWYiIGFsdD0iIiAvPiwgSXRhbGljcyA8aW1nIHNyYz0iaXRhbGljLmdpZiIgYWx0PSIiIC8+LAotb3IgVW5kZXJsaW5lIDxpbWcgc3JjPSJ1bmRlcmxpbmUuZ2lmIiBhbHQ9IiIgLz4gYnV0dG9uLjwvbGk+Ci08bGk+Q3JlYXRlIFN1cGVyIG9yIFN1YiBzY3JpcHQgYnkgY2xpY2tpbmcgdGhlIFN1cGVyc2NyaXB0IDxpbWcgc3JjPSJzdXBlcnNjcmlwdC5naWYiIGFsdD0iIiAvPiBvciBTdWJzY3JpcHQgPGltZyBzcmM9InN1YnNjcmlwdC5naWYiIGFsdD0iIiAvPiBidXR0b25zLjwvbGk+Ci08bGk+QWRkIG51bWJlcmVkIG9yIGJ1bGxldGVkIGxpc3RzIHVzaW5nIHRoZSBvcmRlcmVkIDxpbWcgc3JjPSJhZGRvcmRsaXN0X2NvLmdpZiIgYWx0PSIiIC8+IG9yIHVub3JkZXJlZCBsaXN0IDxpbWcgc3JjPSJhZGR1bm9yZGxpc3RfY28uZ2lmIiBhbHQ9IiIgLz4gYnV0dG9ucy48L2xpPgotPGxpPkluZGVudCBvciBPdXRkZW50IHRleHQgdXNpbmcgdGhlIEluZGVudCA8aW1nIHNyYz0iaW5kZW50LmdpZiIgYWx0PSIiIC8+IG9yIE91dGRlbnQgPGltZyBzcmM9Im91dGRlbnQuZ2lmIiBhbHQ9IiIgLz4gYnV0dG9ucy48L2xpPgotPGxpPkZpbmQgYW5kIHJlcGxhY2UgdGV4dC4gQ2xpY2sgdGhlIEZpbmQvUmVwbGFjZSBidXR0b24gPGltZyBzcmM9ImZpbmRyZXBsYWNlLmdpZiIgYWx0PSIiIC8+LiBUaGUgRmluZC9SZXBsYWNlIGRpYWxvZyBib3ggYXBwZWFycy4gVHlwZSB0aGUgdGV4dCB5b3UKLXdhbnQgdG8gZmluZCBpbiB0aGUgRmluZCBmaWVsZCBhbmQsIGlmIHlvdSBhcmUgcmVwbGFjaW5nIHRoYXQgdGV4dCwgdHlwZSB0aGUKLXJlcGxhY2VtZW50IHRleHQgaW4gdGhlIFJlcGxhY2Ugd2l0aCBmaWVsZC4gWW91IGNhbiBzZWFyY2ggZm9yd2FyZCBvciBiYWNrCi1hbmQgc3BlY2lmeSB3aGV0aGVyIHlvdSB3YW50IHlvdXIgc2VhcmNoIHRvIGJlIGNhc2Ugc2Vuc2l0aXZlIG9yIHNlYXJjaCBmb3IKLW9ubHkgcGFydHMgb2Ygd29yZHMuPC9saT4KLTxsaT5BZGQgb3IgY3JlYXRlIGh5cGVybGlua3MgdXNpbmcgdGhlIEFkZCBsaW5rIGJ1dHRvbiA8aW1nIHNyYz0iYWRkbGlua19jby5naWYiIGFsdD0iIiAvPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9ImFkZGFyZWZlcmVuY2Vvcmh5cGVybGluay5odG1sI2FkZGFyZWZlcmVuY2Vvcmh5cGVybGluayI+QWRkIGEgUmVmZXJlbmNlIG9yIEh5cGVybGluazwvYT4uPC9saT4KLTxsaT5BZGQgaW1hZ2VzLiBDbGljayB0aGUgQWRkIEltYWdlIGJ1dHRvbiA8aW1nIHNyYz0iYWRkaW1nX2NvLmdpZiIgYWx0PSIiIC8+LiBUaGUgQWRkIEltYWdlIGRpYWxvZyBib3ggYXBwZWFycy4gQnJvd3NlIGZvciB0aGUgaW1hZ2UgeW91J2QgbGlrZQotdG8gYWRkIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uPC9saT4KLTxsaT5BZGQgdGFibGVzLiBDbGljayB0aGUgQWRkIFRhYmxlIGJ1dHRvbiA8aW1nIHNyYz0iYWRkdGFibGVfY28uZ2lmIiBhbHQ9IiIgLz4uIFRoZSBBZGQgVGFibGUgZGlhbG9nIGJveCBhcHBlYXJzLiBTcGVjaWZ5IHRoZSB0YWJsZSBwYXJhbWV0ZXJzCi1hbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvYWRtYXAuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9hZG1hcC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYTk5YmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9hZG1hcC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUm9hZG1hcCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJyb2FkbWFwIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlJvYWRtYXA8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJvYWRtYXAiPjxhIG5hbWU9InJvYWRtYXAiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Sb2FkbWFwPC9oMT4KLTxkaXY+PHA+QSBSb2FkbWFwIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGRlc2NyaWJlcyBob3cgYSBwcm9jZXNzIGlzCi10eXBpY2FsbHkgcGVyZm9ybWVkLiBPZnRlbiBwcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZwotYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGUgcHJvY2Vzcy4KLUluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUKLXByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIHJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dAotaG93IGFjdGl2aXRpZXMgYW5kIHRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvbGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGFhYmQ5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvbGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJvbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Sb2xlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyb2xlIj48YSBuYW1lPSJyb2xlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Um9sZTwvaDE+Ci08ZGl2PjxwPkEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzCi1vZiBhbiBpbmRpdmlkdWFsIG9yIGluZGl2aWR1YWxzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiPkNyZWF0ZSBhIFJvbGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlc2V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvbGVzZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzliYmMxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvbGVzZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJvbGUgU2V0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJvbGVzZXQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Um9sZSBTZXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJvbGVzZXQiPjxhIG5hbWU9InJvbGVzZXQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Sb2xlIFNldDwvaDE+Ci08ZGl2PjxwPkEgUm9sZSBTZXQgaXMgdXNlZCB0byBncm91cCA8YSBocmVmPSJyb2xlLmh0bWwjcm9sZSI+Um9sZXM8L2E+IHdpdGgKLWNlcnRhaW4gY29tbW9uYWxpdGllcyB0b2dldGhlci4gRm9yIGV4YW1wbGUsIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsCi1hbiBBbmFseXN0IHJvbGUgc2V0IGNvdWxkIGJlIHVzZWQgdG8gZ3JvdXAgdG9nZXRoZXIgcm9sZXMgc3VjaCBhcyBCdXNpbmVzcwotUHJvY2VzcyBBbmFseXN0LCBTeXN0ZW0gQW5hbHlzdCBhbmQgUmVxdWlyZW1lbnRzIFNwZWNpZmllci4gRWFjaCBvZiB0aGVzZQotcm9sZXMgd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBtYXkgYmUKLXJlc3BvbnNpYmxlIGZvciBwZXJmb3JtaW5nIGNlcnRhaW4gdGFza3MgYW5kIGNyZWF0aW5nIGNlcnRhaW4gd29yayBwcm9kdWN0cy4KLVJvbGUgc2V0cyBjYW4gYmUgb3JnYW5pemVkIHVzaW5nIFJvbGUgU2V0IEdyb3VwaW5ncy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj5NZXRob2QgQ29udGVudCBDYXRlZ29yaWVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZXNldGdyb3VwaW5nLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvbGVzZXRncm91cGluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYzc1ZmIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZXNldGdyb3VwaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSb2xlIFNldCBHcm91cGluZyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icm9sZXNldC5odG1sI3JvbGVzZXQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InJvbGUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJyb2xlc2V0Z3JvdXBpbmciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Um9sZSBTZXQgR3JvdXBpbmc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJvbGVzZXRncm91cGluZyI+PGEgbmFtZT0icm9sZXNldGdyb3VwaW5nIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Um9sZSBTZXQgR3JvdXBpbmc8L2gxPgotPGRpdj48cD5Sb2xlIHNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gcm9sZSBzZXQgZ3JvdXBpbmdzLiBGb3IgZXhhbXBsZSwgZGlmZmVyZW50Ci1tZXRob2QgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzIHdoaWNoLCBob3dldmVyLCBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQKLWZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLAotZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBzZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQKLU9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJyb2xlc2V0Lmh0bWwjcm9sZXNldCI+Um9sZSBTZXQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJvbGUuaHRtbCI+Um9sZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIj5DcmVhdGUgYSBSb2xlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc2VhcmNoZm9ybWV0aGNvbnQuSlBHIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zZWFyY2hmb3JtZXRoY29udC5KUEcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5YzUwZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zZWFyY2hmb3JtZXRoY29udC5KUEcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3NlYXJjaGZvcm1ldGhvZGNvbnRlbnQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc2VhcmNoZm9ybWV0aG9kY29udGVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OGQyNTU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc2VhcmNoZm9ybWV0aG9kY29udGVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2VhcmNoIGZvciBNZXRob2QgQ29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ic2VhcmNoZm9ybWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5TZWFyY2ggZm9yIE1ldGhvZCBDb250ZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJzZWFyY2hmb3JtZXRob2Rjb250ZW50Ij48YSBuYW1lPSJzZWFyY2hmb3JtZXRob2Rjb250ZW50Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2VhcmNoIGZvciBNZXRob2QgQ29udGVudDwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIFNlYXJjaCBmb3IgTWV0aG9kIENvbnRlbnQ6PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGVyZSBhcmUgdGhyZWUgd2F5cyB0byBiZWdpbiB5b3VyIHNlYXJjaCBmb3IgbWV0aG9kIGNvbnRlbnQuPC9zcGFuPjx1bD48bGk+U2VsZWN0IDxzdHJvbmc+U2VhcmNoICZndDsgU2VhcmNoPC9zdHJvbmc+PC9saT4KLTxsaT48c3Ryb25nPlNlYXJjaCAmZ3Q7IEZpbGU8L3N0cm9uZz48L2xpPgotPGxpPkNsaWNrIHRoZSBTZWFyY2ggYnV0dG9uIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjxpbWcgc3JjPSJzZWFyY2hmb3JtZXRoY29udC5KUEciIGFsdD0iIiAvPjwvc3Bhbj4gaW4gdGhlIHRvb2wgYmFyLjwvbGk+Ci08L3VsPgotIFRoZSBTZWFyY2ggZGlhbG9nIHdpbmRvdyBvcGVucy48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayBlaXRoZXIgdGhlIDxzdHJvbmc+RmlsZSBTZWFyY2g8L3N0cm9uZz4gdGFiIG9yIHRoZSA8c3Ryb25nPk1ldGhvZCBTZWFyY2g8L3N0cm9uZz4gdGFiCi1hbmQgdGhlbiBzZXQgeW91ciBjcml0ZXJpYS4gVXNpbmcgdGhlIDxzdHJvbmc+RmlsZSBTZWFyY2g8L3N0cm9uZz4gdGFiLCB5b3UgY2FuIHNlYXJjaAotZm9yIGNvbnRlbnQgYnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgY29udGVudC4gVXNpbmcgdGhlIDxzdHJvbmc+TWV0aG9kIFNlYXJjaDwvc3Ryb25nPiB0YWIsCi15b3UgY2FuIHNlYXJjaCB0aGUgbWV0aG9kIGNvbnRlbnQgaXRzZWxmLjwvc3Bhbj48dWw+PGxpPjxzdHJvbmc+VXNpbmcgRmlsZSBTZWFyY2g8L3N0cm9uZz46IFR5cGUgYSB0ZXh0IHN0cmluZyB0byBzZWFyY2ggZm9yIHdpdGhpbgotdGhlIGZpbGVzIChvcHRpb25hbCksIG9yIHR5cGUgYSBmaWxlIG5hbWUgcGF0dGVybiB0byB1c2UgZm9yIG1hdGNoaW5nIGZpbGUKLW5hbWVzLiBZb3UgbXVzdCB1c2UgYSBwYXR0ZXJuLiBVc2UgKiBpZiB5b3Ugd2FudCB0byBzZWFyY2ggZm9yIHRoZSB0ZXh0IGluCi1hbGwgZmlsZXMuIExlYXZlIGFsbCBvdGhlciBvcHRpb25zIGFzIGRlZmF1bHQuPC9saT4KLTxsaT48c3Ryb25nPlVzaW5nIE1ldGhvZCBTZWFyY2g8L3N0cm9uZz46IFR5cGUgYSB0ZXh0IHN0cmluZyB0byBzZWFyY2ggZm9yIHdpdGhpbgotdGhlIGZpbGVzIChvcHRpb25hbCksIG9yIHR5cGUgYSBuYW1lIHBhdHRlcm4gZm9yIG1hdGNoaW5nIGVsZW1lbnQgbmFtZXMgYW5kCi1wcmVzZW50YXRpb24gbmFtZXMuIFlvdSBtdXN0IHVzZSBhIHBhdHRlcm4uIFVzZSAqIGlmIHlvdSB3YW50IHRvIHNlYXJjaCBmb3IKLXRleHQgaW4gYWxsIGZpbGVzLiBJbiB0aGUgU2NvcGUgc2VjdGlvbiwgeW91IGNhbiByZXN0cmljdCB5b3VyIHNlYXJjaCB0byBhCi1zdWJzZXQgb2YgZWxlbWVudCB0eXBlcy48L2xpPgotPC91bD4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+U2VhcmNoPC9zdHJvbmc+LiBUaGUgU2VhcmNoIFZpZXcgb3BlbnMgd2l0aCB5b3VyIHNlYXJjaCByZXN1bHRzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgU2VhcmNoIFZpZXcsIHlvdSBjYW4gZHJpbGwgZG93biBpbnRvIHRoZSBzZWFyY2ggcmVzdWx0cwotYW5kIGRvdWJsZS1jbGljayBhbiBlbGVtZW50IHRvIG9wZW4gdGhlIGVkaXRvciBmb3IgdGhlIHNlbGVjdGVkIGVsZW1lbnQuIElmCi15b3UgaGF2ZSBMaW5rIHdpdGggRWRpdG9yIHNlbGVjdGVkIGluIHRoZSBsaWJyYXJ5IHZpZXcsIHRoZSBsaWJyYXJ5IHZpZXcgZGlzcGxheQotY2hhbmdlcyB0byBzaG93IHlvdSB3aGVyZSB0aGUgc2VsZWN0ZWQgZWxlbWVudCBpcyBpbiB0aGUgbGlicmFyeS48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0icHJldmlvdXNsaW5rIj48c3Ryb25nPlByZXZpb3VzIHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIj5Ccm93c2UgYW5kIFByZXZpZXcgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOWJhZWFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlN0YW5kYXJkIE1ldGhvZCBMaWJyYXJ5IE92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIG1ldGhvZCBwbHVnLWlucyBhbmQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuIEFsbCBtZXRob2QgZWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIG1ldGhvZCBsaWJyYXJ5LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBtZXRob2QgcGx1Zy1pbnMgYW5kIG1ldGhvZCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiBBbGwgbWV0aG9kIGVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBtZXRob2QgbGlicmFyeS4iIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ic3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+U3RhbmRhcmQgTWV0aG9kIExpYnJhcnkgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InN0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Ij48YSBuYW1lPSJzdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlN0YW5kYXJkIE1ldGhvZCBMaWJyYXJ5IE92ZXJ2aWV3PC9oMT4KLTxkaXY+PHA+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgbWV0aG9kIHBsdWctaW5zIGFuZAotbWV0aG9kIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuIEFsbCBtZXRob2QgZWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIG1ldGhvZAotbGlicmFyeS48L3A+Ci08cD5NdWNoIGxpa2UgYSBsaWJyYXJ5IGhhcyBib29rcywgYSBtZXRob2QgbGlicmFyeSBoYXMgbWV0aG9kIHBsdWctaW5zLiBXaGVyZQotYSBsaWJyYXJ5IGJvb2sgaXMgbWFkZSB1cCBvZiBzZWN0aW9ucyBvciBjaGFwdGVycyBhbmQgY29udGVudCB3aXRoaW4gdGhvc2UKLWNoYXB0ZXJzLCA8YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPm1ldGhvZAotcGx1Zy1pbnM8L2E+IGFyZSBtYWRlIHVwIG9mIDxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPm1ldGhvZCBjb250ZW50PC9hPiBhbmQgcHJvY2Vzc2VzLiBNZXRob2QgY29udGVudCBjb250YWlucwotY29udGVudCBwYWNrYWdlcyBhbmQgYm90aCA8YSBocmVmPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj5zdGFuZGFyZCBhbmQgY3VzdG9tIGNhdGVnb3JpZXM8L2E+LCB3aGlsZSBwcm9jZXNzZXMgc3RydWN0dXJlCi10aGlzIGNvbnRlbnQgaW50byBwcm9jZXNzIGZyYWdtZW50cyBjYWxsZWQgPGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Y2FwYWJpbGl0eSBwYXR0ZXJuczwvYT4gYW5kIGZ1bGwgbGlmZWN5Y2xlIHByb2Nlc3NlcyBjYWxsZWQgPGEgaHJlZj0iZGVsaXZlcnlwcm9jZXNzLmh0bWwiPmRlbGl2ZXJ5IHByb2Nlc3NlczwvYT4uPC9wPgotPHA+QSBtZXRob2QgbGlicmFyeSBhbHNvIGhhcyBvbmUgb3IgbW9yZSA8YSBocmVmPSJtZXRob2Rjb25maWd1cmF0aW9ucy5odG1sI21ldGhvZGNvbmZpZ3VyYXRpb25zIj5tZXRob2QgY29uZmlndXJhdGlvbnM8L2E+IHRoYXQgZmlsdGVyIHRoZSBsaWJyYXJ5IGFuZCBwcm92aWRlCi1zbWFsbGVyIHdvcmtpbmcgc2V0cyBvZiBsaWJyYXJ5IGNvbnRlbnQgZm9yIHRoZSBlbmQgdXNlci48L3A+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N0ZXAuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3RlcC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMWVkMGFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3RlcC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU3RlcCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJzdGVwIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlN0ZXA8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InN0ZXAiPjxhIG5hbWU9InN0ZXAiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TdGVwPC9oMT4KLTxkaXY+PHA+QSBTdGVwIGlzIGEgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSB0YXNrLiBUaGUgY29sbGVjdGlvbgotb2Ygc3RlcHMgZGVmaW5lZCBmb3IgYSB0YXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8KLWFjaGlldmUgdGhlIG92ZXJhbGwgZ29hbCBvZiB0aGUgdGFzay4gTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkCi1lYWNoIHRpbWUgYSB0YXNrIGlzIGludm9rZWQgaW4gYSBwcm9jZXNzLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3Vic2NyaXB0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3Vic2NyaXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAzM2M4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1YnNjcmlwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1cGVyc2NyaXB0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3VwZXJzY3JpcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMzY3NWNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3VwZXJzY3JpcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdXBwb3J0aW5nbWF0ZXJpYWwuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3VwcG9ydGluZ21hdGVyaWFsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxYzZkMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdXBwb3J0aW5nbWF0ZXJpYWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlN1cHBvcnRpbmcgTWF0ZXJpYWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ic3VwcG9ydGluZ21hdGVyaWFsIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InN1cHBvcnRpbmdtYXRlcmlhbCI+PGEgbmFtZT0ic3VwcG9ydGluZ21hdGVyaWFsIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U3VwcG9ydGluZyBNYXRlcmlhbDwvaDE+Ci08ZGl2PjxwPlN1cHBvcnRpbmcgTWF0ZXJpYWwgaXMgYSBjYXRjaC1hbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlCi1ub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgY29udGVudAotZWxlbWVudHMsIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rhc2suaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdGFzay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYzU1Nzc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdGFzay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXRhc2suaHRtbCNjcmVhdGVhdGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VGFzazwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFzayI+PGEgbmFtZT0idGFzayI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlRhc2s8L2gxPgotPGRpdj48cD5BIFRhc2sgaXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gYSBzcGVjaWZpYwotUm9sZS4gVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cyBhbmQKLXVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIHVtYmVyIG9mIFdvcmsgUHJvZHVjdHMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXRhc2suaHRtbCNjcmVhdGVhdGFzayI+Q3JlYXRlIGEgVGFzazwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIj5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90ZW1wbGF0ZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90ZW1wbGF0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NTU3MTEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdGVtcGxhdGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlRlbXBsYXRlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InRlbXBsYXRlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlRlbXBsYXRlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZW1wbGF0ZSI+PGEgbmFtZT0idGVtcGxhdGUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5UZW1wbGF0ZTwvaDE+Ci08ZGl2PjxwPkEgVGVtcGxhdGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYSB3b3JrIHByb2R1Y3QKLXdpdGggYSBwcmVkZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywKLWEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgb2YgaG93IHRoZSBzZWN0aW9ucwotYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW4gYmUgcHJvdmlkZWQKLWZvciBkb2N1bWVudHMgYXMgd2VsbCBhcyBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rlcm1kZWZpbml0aW9uLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rlcm1kZWZpbml0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkNWEzNTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90ZXJtZGVmaW5pdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVGVybSBEZWZpbml0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InRlcm1kZWZpbml0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlRlcm0gRGVmaW5pdGlvbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVybWRlZmluaXRpb24iPjxhIG5hbWU9InRlcm1kZWZpbml0aW9uIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VGVybSBEZWZpbml0aW9uPC9oMT4KLTxkaXY+PHA+VGVybSBkZWZpbml0aW9ucyBkZWZpbmVzIGEgc3BlY2lmaWMgdGVybSwgY29uY2VwdCwgb3Igb3RoZXIgaWRlYSByZWxldmFudAotdG8gbWV0aG9kIGFuZCBwcm9jZXNzIGNvbnRlbnQuIEEgdGVybSBkZWZpbml0aW9uIGlzIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvCi1hbnkgY29udGVudCBlbGVtZW50cywgYnV0IHJlbGF0aW9uc2hpcHMgYXJlIGRlcml2ZWQgd2hlbiB0aGUgdGVybSBpcyB1c2VkCi1pbiB0aGUgZGVzY3JpcHRpb24gdGV4dCBpbiBhIGNvbnRlbnQgZWxlbWVudC48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rvb2xtZW50b3IuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdG9vbG1lbnRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTNlZjQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdG9vbG1lbnRvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVG9vbCBNZW50b3IiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idG9vbG1lbnRvciIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Ub29sIE1lbnRvcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idG9vbG1lbnRvciI+PGEgbmFtZT0idG9vbG1lbnRvciI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlRvb2wgTWVudG9yPC9oMT4KLTxkaXY+PHA+QSBUb29sIE1lbnRvciBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMKLXRvb2wgdG8gYWNjb21wbGlzaCBhIHBpZWNlIG9mIHdvcmsuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8xLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmOTMwYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8xLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAxOiBFeHBsb3JlIHRoZSBVc2VyIEludGVyZmFjZSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gYmVjb21lIGZhbWlsaWFyIHdpdGggdGhlIG1ham9yIHBhcnRzIG9mIHRoZSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIHVzZXIgaW50ZXJmYWNlLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggcGVyc3BlY3RpdmUuIFRoZSBjdXJyZW50IHBlcnNwZWN0aXZlIGlzIGRpc3BsYXllZCBuZWFyIHRoZSB0b3AgcmlnaHQgb2YgdGhlIHNjcmVlbi4gWW91IHdpbGwgc2VlIGVpdGhlciBBdXRob3Jpbmcgb3IgQnJvd3NpbmcuIENsaWNrIG9uIHRoZSA8c3Ryb25nPk9wZW4gUGVyc3BlY3RpdmU8L3N0cm9uZz4gaWNvbiwgYW5kIHNlbGVjdCB0aGUgb3RoZXIgcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkV4cGxvcmUgdGhlIDxzdHJvbmc+TGlicmFyeTwvc3Ryb25nPiA8c3Ryb25nPlZpZXc8L3N0cm9uZz4uIFRoZSBsaWJyYXJ5IHZpZXcgaXMgYXZhaWxhYmxlIGluIGF1dGhvcmluZyBwZXJzcGVjdGl2ZSCWIGl0IGlzIG5vdCBzaG93biBpbiB0aGUgYnJvd3NpbmcgcGVyc3BlY3RpdmUuIFRoZSBMaWJyYXJ5IFZpZXcgc2hvd3MgeW91IGFsbCB0aGUgY29udGVudCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5LiBUaGUgaGlnaGVzdCBsZXZlbCBjb250ZW50IHVuaXQgaXMgYSBwbHVnaW4uIENsaWNrIG9uIHNvbWUgPHN0cm9uZz4rPC9zdHJvbmc+IHNpZ25zIGFuZCBleHBsb3JlIHRoZSBjb250ZW50LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5EcmlsbCBkb3duIGludG8gYSBwbHVnaW4gYXMgZm9sbG93czogPHN0cm9uZz5NZXRob2QgQ29udGVudCAmZ3Q7IENvbnRlbnQgUGFja2FnZXMgJmd0OyBbYW55XSAmZ3Q7IFRhc2tzPC9zdHJvbmc+LiBEb3VibGUgY2xpY2sgb24gYSB0YXNrLiBUaGUgVGFzayBFZGl0b3IgaXMgZGlzcGxheWVkIG9uIHRoZSByaWdodCBvZiB0aGUgc2NyZWVuLiBUaGVyZSBhcmUgc2VwYXJhdGUgZWRpdG9ycyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBjb250ZW50IHRoYXQgeW91IGNhbiBjcmVhdGUgaW4gYSBsaWJyYXJ5LiBFYWNoIGVkaXRvciBoYXMgYSBzZXJpZXMgb2YgdGFicyBhbmQgYSBudW1iZXIgb2YgZm9ybSBlbGVtZW50cyBvbiBlYWNoIHRhYi4gWW91IGNhbiBmaW5kIG91dCBtb3JlIGFib3V0IHRoZXNlIGluIHRoZSA8dT5DcmVhdGUgTWV0aG9kIENvbnRlbnQgPC91PnR1dG9yaWFsLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIuIEEgcHJldmlldyBvZiBhbiBIVE1MIHBhZ2UgaXMgZGlzcGxheWVkLiBUaGlzIGlzIHdoYXQgdGhlIHNlbGVjdGVkIGVsZW1lbnQgd2lsbCBsb29rIGxpa2UgaW4gYSBwdWJsaXNoZWQgd2ViIHNpdGUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byB0aGUgPHN0cm9uZz5icm93c2luZyBwZXJzcGVjdGl2ZTwvc3Ryb25nPi4gVGhlIENvbmZpZ3VyYXRpb24gVmlldyBpcyBub3cgZGlzcGxheWVkLiBUaGUgY29uZmlndXJhdGlvbiB2aWV3IGFsd2F5cyBoYXMgdGhlIHNhbWUgc3RydWN0dXJlIGJ1dCB0aGUgY29udGVudCBjaGFuZ2VzIGJhc2VkIG9uIHdoaWNoIGNvbmZpZ3VyYXRpb24gaXMgY3VycmVudGx5IHNlbGVjdGVkLiBEcmlsbCBkb3duIGludG8gdGhlIERpc2NpcGxpbmVzIGZvbGRlciB1bnRpbCB5b3UgZ2V0IHRvIHRhc2tzIGFuZCBjbGljayBvbiBhIHRhc2suIFRoZSBIVE1MIHByZXZpZXcgb2YgdGhlIHNlbGVjdGVkIGl0ZW0gaXMgc2hvd24gb24gdGhlIHJpZ2h0IG9mIHRoZSBzY3JlZW4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCBjb25maWd1cmF0aW9ucy4gVGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBpcyBkaXNwbGF5ZWQgaW4gdGhlIHNlbGVjdGlvbiBib3ggYmVsb3cgdGhlIG1haW4gbWVudSBiYXIuIFNlbGVjdCBhIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZHJvcCBkb3duIGxpc3QuIFlvdSB3aWxsIHNlZSB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IHJlZnJlc2ggd2hlbiB5b3UgZG8gdGhpcy4gPC9wPgotICA8L2xpPgotICA8bGk+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPmF1dGhvcmluZzwvc3Ryb25nPiA8c3Ryb25nPnBlcnNwZWN0aXZlPC9zdHJvbmc+LiBEcmlsbCBkb3duIGludG8gYSBwbHVnaW4gYXMgZm9sbG93czogPHN0cm9uZz5Qcm9jZXNzZXMgJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm5zICZndDsgW2FueV0gJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm5zPC9zdHJvbmc+LiBOb3RlIHRoYXQgbm90IGFsbCBwbHVnaW5zIGhhdmUgY2FwYWJpbGl0eSBwYXR0ZXJucy4gRG91YmxlLWNsaWNrIG9uIGEgY2FwYWJpbGl0eSBwYXR0ZXJuLiBUaGUgcmlnaHQgc2lkZSBvZiB0aGUgc2NyZWVuIGlzIG5vdyBmaWxsZWQgd2l0aCB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIGVkaXRvciBhbmQgdGhlIFByb3BlcnRpZXMgVmlldy4gWW91IGNhbiBmaW5kIG91dCBtb3JlIGFib3V0IHRoZXNlIGluIHRoZSA8dT5Xb3JraW5nIHdpdGggUHJvY2Vzc2VzPC91PiB0dXRvcmlhbC48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMi5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDdhOTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMjogQnJvd3NlIE1ldGhvZCBDb250ZW50IHZpYSBCcm93c2luZyBQZXJzcGVjdGl2ZSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gYmVjb21lIGZhbWlsaWFyIHdpdGggYnJvd3NpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYSBsaWJyYXJ5IHVzaW5nIHRoZSBicm93c2luZyBwZXJzcGVjdGl2ZS4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U2VsZWN0IDxzdHJvbmc+UlVQIGZvciBTbWFsbCBQcm9qZWN0cyA8L3N0cm9uZz4gaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBkcm9wLWRvd24gbGlzdCBsb2NhdGVkIHVuZGVybmVhdGggdGhlIG1haW4gbWVudSBiYXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlNlbGVjdCA8c3Ryb25nPkJyb3dzaW5nIHBlcnNwZWN0aXZlPC9zdHJvbmc+LiBUaGUgQ29uZmlndXJhdGlvbiBWaWV3IGFwcGVhcnMgb24gdGhlIGxlZnQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlRvIHZpZXcgYSBUYXNrLCBjbGljayA8c3Ryb25nPkRpc2NpcGxpbmVzICZndDsgUlVQIERpc2NpcGxpbmVzICZndDsgQW5hbHlzaXMgJmFtcDsgRGVzaWduICZndDsgRGVzaWduIHRoZSBVc2VyIEludGVyZmFjZTwvc3Ryb25nPi4gQSBwcmV2aWV3IG9mIHRoZSBwdWJsaXNoZWQgV2ViIHBhZ2UgZm9yIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlzIGRpc3BsYXllZC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgdGhlIDxzdHJvbmc+UHJpbWFyeSBQZXJmb3JtZXIgPC9zdHJvbmc+bGluayBpbiB0aGUgcmVsYXRpb25zaGlwcyBzZWN0aW9uLiBUaGlzIHdpbGwgc2hvdyB0aGUgcHJldmlldyBwYWdlIGZvciB0aGUgVXNlci1JbnRlcmZhY2UgRGVzaWduZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPllvdSBjYW4gY2xpY2sgb24gYW55IGxpbmtzIGluIHRoZSBwcmV2aWV3IGFuZCB1c2UgdGhlIGJhY2sgaWNvbiBpbiB0aGUgcHJldmlldyB0b29sYmFyIHRvIHJldHVybiB0byBwcmV2aW91cyBwYWdlcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+VmlldyBvdGhlciBlbGVtZW50cyBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IHRyZWUgliBlLmcuIHVuZGVyIERvbWFpbnMsIFJvbGUgU2V0cywgZXRjLiA8L3A+Ci0gIDwvbGk+Ci08L29sPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzMuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8zLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWUxMWE4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDM6IEJyb3dzZSBQcm9jZXNzIENvbnRlbnQgdmlhIEJyb3dzaW5nIFBlcnNwZWN0aXZlIDwvYT48L2gyPgotPHA+IFRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gYmVjb21lIGZhbWlsaWFyIHdpdGggYnJvd3NpbmcgcHJvY2VzcyBjb250ZW50IGluIGEgbGlicmFyeSB1c2luZyB0aGUgYnJvd3NpbmcgcGVyc3BlY3RpdmUgPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+TWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIEJyb3dzaW5nIHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5UbyB2aWV3IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuLCBjbGljayA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnMgJmd0OyBDbGFzc2ljIFJVUCAmZ3Q7IERpc2NpcGxpbmUgV29ya2Zsb3dzICZndDsgQW5hbHlzaXMgYW5kIERlc2lnbjwvc3Ryb25nPi4gQSBwcmV2aWV3IG9mIHRoZSBwdWJsaXNoZWQgV2ViIHBhZ2UgZm9yIHRoZSBzZWxlY3RlZCBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgZGlzcGxheWVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5BIENhcGFiaWxpdHkgUGF0dGVybiBjb250YWlucyBhIGxhcmdlIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBhbmQgaXMgZGlzcGxheWVkIG92ZXIgZm91ciB0YWJzIJYgRGVzY3JpcHRpb24sIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IFVzYWdlIGFuZCBUZWFtIEFsbG9jYXRpb24uIEV4cGxvcmUgdGhlIGluZm9ybWF0aW9uIG9uIGVhY2ggdGFiLiAKLSAgICA8cD5Ob3RlIHRoYXQgd2hlbiB5b3UgY2xpY2sgb24gYSB0YXNrIGluIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUgdGFiIHlvdSBwcmV2aWV3IGEgkVRhc2sgRGVzY3JpcHRvcicuIEEgVGFzayBEZXNjcmlwdG9yIGlzIGEgdGFzayB3aXRoaW4gYSBwcm9jZXNzLiBUaGUgdGFzayBkZXNjcmlwdG9yIHBhZ2UgaGFzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXNrIGFzIGl0IGlzIHVzZWQgYXQgYSBzcGVjaWZpYyBwb2ludCBpbiBhIHByb2Nlc3MuIFRoZSB0YXNrIGRlc2NyaXB0b3IgaGFzIGEgbGluayB0byB0aGUgVGFzayBvbiB3aGljaCBpdCBpcyBiYXNlZC4gPC9wPgotICAgIDxwPkNsaWNraW5nIG9uIGEgcm9sZSBvciB3b3JrIHByb2R1Y3QgaW4gYSB0YXNrIGRlc2NyaXB0b3IgdGFrZXMgeW91IHRvIGEgUm9sZSBEZXNjcmlwdG9yIG9yIGEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IuIFRoZXNlIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJvbGUgb3Igd29yayBwcm9kdWN0IGF0IHRoZSBzYW1lIHBvaW50IGluIHRoZSBwcm9jZXNzIGFuZCBhbHNvIHByb3ZpZGUgbGlua3MgYmFjayB0byB0aGUgY29yZSBtZXRob2QgZWxlbWVudCBvbiB3aGljaCB0aGV5IGFyZSBiYXNlZC4gPC9wPgotICA8L2xpPgotICA8bGk+VG8gdmlldyBhIERlbGl2ZXJ5IFByb2Nlc3MsIGNsaWNrIDxzdHJvbmc+UHJvY2Vzc2VzICZndDsgRGVsaXZlcnkgUHJvY2Vzc2VzICZndDsgQ2xhc3NpYyBSVVAgTGlmZWN5Y2xlPC9zdHJvbmc+LiBUaGUgZGlzcGxheSBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIHNpbWlsYXIgdG8gYSBDYXBhYmlsaXR5IFBhdHRlcm4uIDwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzQuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF80Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWI2ZjQ1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDQ6IEJyb3dzZSBNZXRob2QgQ29udGVudCB2aWEgQXV0aG9yaW5nIFBlcnNwZWN0aXZlIDwvYT48L2gyPgotPHA+IFRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gYmVjb21lIGZhbWlsaWFyIHdpdGggYnJvd3NpbmcgbGlicmFyeSBjb250ZW50IHdoaWxlIGluIHRoZSBhdXRob3JpbmcgcGVyc3BlY3RpdmUuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byBBdXRob3JpbmcgcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkluIHRoZSBMaWJyYXJ5IFZpZXcsIG5hdmlnYXRlIHRvIDxzdHJvbmc+UlVQICZndDsgTWV0aG9kIENvbnRlbnQgJmd0OyBDb250ZW50IFBhY2thZ2VzICZndDsgRGVzaWduICZndDsgR1VJIERlc2lnbiAmZ3Q7IFJvbGU8L3N0cm9uZz5zLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5TZWxlY3QgYSByb2xlIChkb3VibGUgY2xpY2spIGFuZCB1c2UgdGhlIHByZXZpZXcgdGFiIGF0IHRoZSBib3R0b20gb2YgdGhlIHJvbGUgd2luZG93IHRvIHZpZXcgdGhlIGh0bWwgcmVwcmVzZW50YXRpb24gb2YgdGhhdCByb2xlIGFuZCBpdHMgcmVsYXRpb25zaGlwcyB0byBvdGhlciBtZXRob2QgZWxlbWVudHMuIFZpZXcgdGhlIG90aGVyIHRhYnMgdG8gc2VlIHRoZSBpbmZvcm1hdGlvbiBwcmVzZW50ZWQgd2hlbiBhdXRob3JpbmcgdGhlIG1ldGhvZCBjb250ZW50IGFuZCByZWxhdGlvbnNoaXBzIGZvciBhIHJvbGUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlJlcGVhdCBzdGVwIDMgdG8gcHJldmlldyBhIDxzdHJvbmc+dGFzazwvc3Ryb25nPiAsIDxzdHJvbmc+d29yayBwcm9kdWN0PC9zdHJvbmc+LCBhbmQgPHN0cm9uZz5ndWlkYW5jZSBlbGVtZW50PC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzUuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF81Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjE0NTFjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDU6IFNlYXJjaCBmb3IgTWV0aG9kIENvbnRlbnQgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGJlY29tZSBmYW1pbGlhciB3aXRoIHRoZSBzZWFyY2ggZnVuY3Rpb24gaW4gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3Nlci4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPnBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5PcGVuIHVwIHRoZSBTZWFyY2ggZGlhbG9nIGJ5IDogPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IENsaWNraW5nIG9uIHRoZSBGbGFzaGxpZ2h0IGljb24gaW4gdGhlIHRvb2xiYXIgPC9wPgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPGJsb2NrcXVvdGU+Ci0gICAgICAgIDxwPjxzdHJvbmc+T3IgPC9zdHJvbmc+PC9wPgotICAgICAgPC9ibG9ja3F1b3RlPgotICAgIDwvYmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgU2VsZWN0aW5nIDxzdHJvbmc+U2VhcmNoIC8gU2VhcmNoPC9zdHJvbmc+IGluIHRoZSBtYWluIG1lbnUuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgb24gdGhlIDxzdHJvbmc+TWV0aG9kIFNlYXJjaDwvc3Ryb25nPiB0YWIuIEVudGVyIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkRhdGFiYXNlPC9zcGFuPiBpbiB0aGUgdGV4dCBib3ggYW5kIGNsaWNrIG9uIDxzdHJvbmc+U2VhcmNoPC9zdHJvbmc+LiBJdCB3aWxsIHRha2UgYSBmZXcgc2Vjb25kcyB0byBmaW5kIGFsbCB0aGUgaGl0cy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+RHJpbGwgZG93biBpbiB0aGUgc2VhcmNoIHJlc3VsdHMgYW5kIGRvdWJsZS1jbGljayBvbiBhbiBlbGVtZW50LiBUaGUgZWRpdG9yIGZvciB0aGUgc2VsZWN0ZWQgaXRlbSBpcyBvcGVuZWQuIElmIHlvdSBoYXZlIDxzdHJvbmc+TGluayB3aXRoIEVkaXRvcjwvc3Ryb25nPiBzZWxlY3RlZCBpbiB0aGUgbGlicmFyeSB2aWV3LCB0aGUgbGlicmFyeSB2aWV3IGRpc3BsYXkgY2hhbmdlcyB0byBzaG93IHlvdSB3aGVyZSB0aGUgc2VsZWN0ZWQgaXRlbSBpcyBpbiB0aGUgbGlicmFyeS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+T3BlbiB0aGUgc2VhcmNoIGRpYWxvZyBhZ2FpbiBhbmQgcmVwZWF0IHRoZSBzYW1lIHNlYXJjaCBidXQgdGhpcyB0aW1lIHJlZHVjZSB0aGUgc2NvcGUgdG8ganVzdCBsb29rIGZvciB0YXNrcy4gVW5jaGVjayBhbGwgdGhlIG90aGVyIGNvbnRlbnQgdHlwZXMgaW4gdGhlIHNjb3BlIHBhbmVsLiBUaGUgc2VhcmNoIHNob3VsZCBiZSBxdWlja2VyIGFuZCByZXN1bHQgaW4gZmV3ZXIgaGl0cy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+T3BlbiB0aGUgc2VhcmNoIGRpYWxvZyBhZ2FpbiBhbmQgcmVwZWF0IHRoZSBzYW1lIHNlYXJjaCBidXQgdGhpcyB0aW1lIGFkZCA8c3Ryb25nPnJ1cF8qPC9zdHJvbmc+IGFzIGEgZmlsZSBuYW1lIHBhdHRlcm4uIE1ha2Ugc3VyZSB0aGUgc2NvcGUgaXMgc3RpbGwgc2V0IHRvIHRhc2tzLiBUaGUgc2VhcmNoIHNob3VsZCBiZSBldmVuIHF1aWNrZXIgYW5kIHJlc3VsdCBpbiBldmVuIGZld2VyIGhpdHMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkV4cGVyaW1lbnQgd2l0aCBvdGhlciBNZXRob2QgU2VhcmNoZXMuPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2ludHJvLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfaW50cm8uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NWEyZGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfaW50cm8uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPjxhPlR1dG9yaWFsOiAKLQotCi0gTmF2aWdhdGUgdGhlIFVzZXIgSW50ZXJmYWNlCi0KLTwvYT48L2gxPgotPGgyPjxhPkludHJvZHVjdGlvbiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgdHV0b3JpYWwgaXMgdG8gZ2V0IGZhbWlsaWFyIHdpdGggdXNlciBpbnRlcmZhY2UgYW5kIHRoZSB3YXkgbWV0aG9kIGFuZCBwcm9jZXNzIGNvbnRlbnQgaXMgc3RvcmVkIGFuZCB2aWV3ZWQuIDwvcD4KLTxwPkEgTWV0aG9kIExpYnJhcnkgY29uc2lzdHMgb2YgYSBzZXJpZXMgb2YgPHN0cm9uZz48ZW0+bWV0aG9kIHBsdWctaW5zLiA8L2VtPjwvc3Ryb25nPldpdGhpbiBhIHBsdWdpbiwgY29udGVudCBpcyBzZXBhcmF0ZWQgaW50byA8c3Ryb25nPjxlbT5NZXRob2QgQ29udGVudCA8L2VtPjwvc3Ryb25nPiAodGFza3MsIHJvbGVzLCB3b3JrIHByb2R1Y3RzIGFuZCBndWlkYW5jZSkgYW5kIDxzdHJvbmc+PGVtPlByb2Nlc3NlcyA8L2VtPjwvc3Ryb25nPiAoY2FwYWJpbGl0eSBwYXR0ZXJucyBhbmQgZGVsaXZlcnkgcHJvY2Vzc2VzKS4gVGhpcyBpcyBob3cgdGhlIExpYnJhcnkgVmlldywgd2hpY2ggc2hvd3MgYWxsIHRoZSBjb250ZW50IGluIHRoZSBsaWJyYXJ5IGlzIG9yZ2FuaXplZC4gPC9wPgotPHA+QSBjb25maWd1cmF0aW9uIGlzIGEgc3Vic2V0IG9mIHRoZSBtZXRob2QgbGlicmFyeSBjb250ZW50LiBUaGUgQ29uZmlndXJhdGlvbiBWaWV3IHNob3dzIHRoZSBjb250ZW50IGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4gT25jZSBhIGNvbmZpZ3VyYXRpb24gaXMgc2VsZWN0ZWQsIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgaXMgcmVmcmVzaGVkIHdpdGggdGhlIGNvbnRlbnQgZnJvbSB0aGUgY29uZmlndXJhdGlvbi4gVGhlIGNvbnRlbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBpcyBhbHdheXMgbGFpZCBvdXQgdXNpbmcgdGhlIHNhbWUgc2V0IG9mIGZvbGRlcnMgcmVnYXJkbGVzcyBvZiB3aGljaCBjb25maWd1cmF0aW9uIGlzIHNlbGVjdGVkLiA8L3A+Ci08cD5FUEYgQ29tcG9zZXIgaGFzIHR3byCRcGVyc3BlY3RpdmVzJy4gVGhlIEF1dGhvcmluZyBQZXJzcGVjdGl2ZSBwcm92aWRlcyBmdWxsIGJyb3dzaW5nIGFuZCBhdXRob3JpbmcgY2FwYWJpbGl0aWVzLiBUaGUgQnJvd3NpbmcgUGVyc3BlY3RpdmUgYWxsb3dzIGJyb3dzaW5nIGNvbnRlbnQgaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLiA8L3A+Ci08cD5Db250ZW50IGlzIGNyZWF0ZWQgYW5kIG1haW50YWluZWQgdXNpbmcgYSBzZXJpZXMgb2YgPHN0cm9uZz48ZW0+ZWRpdG9ycy4gPC9lbT48L3N0cm9uZz48L3A+Ci08aDI+Jm5ic3A7PC9oMj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMS5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZDQxYzgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPkV4ZXJjaXNlIDE6IENyZWF0ZSBvciBNb2RpZnkgYSBNZXRob2QgQ29udGVudCBQYWNrYWdlIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyB0YXNrIGlzIHRvIGNyZWF0ZSBhIG5ldyA8c3Ryb25nPkNvbnRlbnQgUGFja2FnZSA8L3N0cm9uZz4gd2l0aGluIGEgPHN0cm9uZz5NZXRob2QgUGx1Zy1pbjwvc3Ryb25nPi4gPC9wPgotPHA+VG8gY3JlYXRlIGEgbmV3IE1ldGhvZCBQbHVnLWluOiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gTWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Q2xpY2sgPHN0cm9uZz5GaWxlICZndDsgTmV3ICZndDsgTWV0aG9kIFBsdWctaW48L3N0cm9uZz4uIAotICAgIDxwPk9yIDwvcD4KLSAgICA8cD5SaWdodC1jbGljayBhbiBleGlzdGluZyBQbHVnLWluIGFuZCBzZWxlY3QgPHN0cm9uZz5OZXcgTWV0aG9kIFBsdWctaW48L3N0cm9uZz4uIDxicj4KLSAgVGhlIE5ldyBNZXRob2QgUGx1Zy1pbiB3aXphcmQgaXMgbGF1bmNoZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkluIHRoZSBOZXcgTWV0aG9kIFBsdWctaW4gd2l6YXJkLCBwcm92aWRlIGEgbmFtZSBmb3IgdGhlIG5ldyBwbHVnLWluLiBJbiB0aGlzIGluc3RhbmNlLCB3ZSdsbCBjYWxsIGl0IE15IFBsdWdpbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U2VsZWN0IDxzdHJvbmc+UlVQIDwvc3Ryb25nPiBpbiB0aGUgUmVmZXJlbmNlZCBQbHVnLWlucyBwYW5lbCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5GaW5pc2g8L3N0cm9uZz4uIFRoaXMgbWVhbnMgdGhhdCB5b3VyIHBsdWctaW4gd2lsbCBleHRlbmQgdGhlIFJVUCBwbHVnLWluIGFuZCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNlbGVjdCBjb250ZW50IGZyb20gdGhlIFJVUCBwbHVnLWluIGFzIHlvdSBjcmVhdGUgeW91ciBvd24gcGx1Zy1pbiBjb250ZW50LiA8YnI+Ci0gICAgICA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBQbHVnaW48L3NwYW4+IG5vdyBhcHBlYXJzIGluIHRoZSBMaWJyYXJ5IFZpZXcgb24gdGhlIGxlZnQgc2lkZSBvZiB5b3VyIHNjcmVlbi4gSXQgaXMgbm90IGdyYXllZCBvdXQgaW5kaWNhdGluZyB0aGF0IGl0IGlzIG5vdCBsb2NrZWQgYW5kIHRoYXQgeW91IGNhbiBlZGl0IGl0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5Eb3VibGUgY2xpY2sgb24gPHNwYW4gY2xhc3M9InN0eWxlMSI+TXkgUGx1Z2luPC9zcGFuPiB0byBvcGVuIHRoZSBQbHVnaW4gZWRpdG9yLiBBYm91dCBoYWxmd2F5IGRvd24gdGhlIHBhZ2UgeW91IHdpbGwgc2VlIHRoZSCRTG9jayBQbHVnaW4nIGNoZWNrYm94LiBUaGlzIHdpbGwgYmUgdW5jaGVja2VkIGZvciB5b3VyIG5ldyBwbHVnaW4uIElmIHlvdSBvcGVuIHRoZSBwbHVnaW4gZWRpdG9yIGZvciB0aGUgUlVQIHBsdWdpbiB0aGlzIGZpZWxkIHdpbGwgYmUgY2hlY2tlZC4gPC9saT4KLTwvb2w+Ci08cD5UbyBjcmVhdGUgYSBNZXRob2QgUGFja2FnZTogPC9wPgotPG9sIHN0YXJ0PSI2Ij4KLSAgPGxpPgotICAgIDxwPkluIHRoZSBMaWJyYXJ5IFZpZXcsIGNsaWNrIDxzdHJvbmc+TXkgUGx1Z2luICZndDsgTWV0aG9kIENvbnRlbnQgJmd0OyBDb250ZW50IFBhY2thZ2VzPC9zdHJvbmc+LiAgPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+UmlnaHQtY2xpY2sgPHN0cm9uZz5Db250ZW50IFBhY2thZ2VzPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSGlnaGxpZ2h0IDxzdHJvbmc+TmV3PC9zdHJvbmc+IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Q29udGVudCBQYWNrYWdlPC9zdHJvbmc+IHRvIGNyZWF0ZSBhIG5ldyBDb250ZW50IFBhY2thZ2UuIDxicj4KLSAgICAgIFRoZSBDb250ZW50IFBhY2thZ2UgZWRpdG9yIGlzIGRpc3BsYXllZCBhbmQgeW91IGNhbiBuYW1lIHRoZSBwYWNrYWdlIGFuZCBwcm92aWRlIGEgQnJpZWYgRGVzY3JpcHRpb24uIFdlJ2xsIGNhbGwgaXQgk015IENvbnRlbnQgUGFja2FnZZQuIDxicj4KLSAgICAgIDxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IFlvdSBjYW5ub3QgY3JlYXRlIGEgbmV3IENvbnRlbnQgUGFja2FnZSBvciBhbnkgb3RoZXIgZWxlbWVudCBpbiBhIGxvY2tlZCBwbHVnaW4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPlNhdmUgeW91ciBuZXcgY29udGVudC4gPC9saT4KLTwvb2w+Ci08cD48c3Ryb25nPk5vdGU6IDwvc3Ryb25nPiBXaGVuIHlvdSBjcmVhdGUgYSBuZXcgZWxlbWVudCBvciBtb2RpZnkgYW4gZXhpc3RpbmcgZWxlbWVudCwgYSCRKicgYXBwZWFycyBpbiB0aGUgdGFiIG5leHQgdG8gdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQsIGluZGljYXRpbmcgdGhhdCB0aGUgZWxlbWVudCBuZWVkcyB0byBiZSBzYXZlZC4gQW4gZWxlbWVudCBjYW4gYmUgc2F2ZWQgYnkgY2xvc2luZyB0aGUgZWRpdG9yLCBjbGlja2luZyB0aGUgZGlzayBpY29uIGluIHRoZSB0b29sYmFyLCBvciBjbGlja2luZyA8c3Ryb25nPkZpbGUgJmd0OyBTYXZlIDwvc3Ryb25nPi4gPC9wPgotPHA+PHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gRVBGIENvbXBvc2VyIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBub2RlcyBmb3IgdGFza3MsIHJvbGVzLCB3b3JrIHByb2R1Y3RzIGFuZCBndWlkYW5jZSB1bmRlciB0aGUgbmV3IGNvbnRlbnQgcGFja2FnZS4gPC9wPgotPGgxPiZuYnNwOzwvaDE+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8yLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5ZjQ1NTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8yLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+RXhlcmNpc2UgMjogQ3JlYXRlIFdvcmsgUHJvZHVjdDwvYT5zIDwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGNyZWF0ZSBuZXcgbWV0aG9kIGNvbnRlbnQuIFNwZWNpZmljYWxseSwgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzIDwvc3Ryb25nPm9mIHR5cGUgPHN0cm9uZz4gQXJ0aWZhY3QgPC9zdHJvbmc+LiBZb3UgY2FuIGNyZWF0ZSBhbnkgY29udGVudCBidXQgc29tZSBleGFtcGxlcyBhcmUgcHJvdmlkZWQgaWYgeW91IHdhbnQgdG8gdXNlIHRoZW0uIFRoZXNlIGV4YW1wbGVzIGFyZSByZWZlcnJlZCB0byBpbiBvdGhlciB0dXRvcmlhbHMuIDwvcD4KLTxwPk1ldGhvZCBhbmQgUHJvY2VzcyBlbGVtZW50cyBoYXZlIHR3byBuYW1lcyBpbiBFUEYgQ29tcG9zZXI6IE5hbWUgYW5kIFByZXNlbnRhdGlvbiBOYW1lLiA8L3A+Ci08cD5UaGUgTmFtZSBmaWVsZCBpcyB1c2VkIGFzIHRoZSBmaWxlIG5hbWUgZm9yIHRoZSBpdGVtLiBJbiBSVVAsIHdlIGFyZSBjYXJlZnVsIGhvdyB3ZSBuYW1lIHRoZSBmaWxlcyBhbmQgdXNlIGNvbnZlbnRpb25zIHN1Y2ggYXMgbG93ZXIgY2FzZSwgbm8gc3BhY2VzLCBhbmQgbm8gc3BlY2lhbCBjaGFyYWN0ZXJzLiBXZSBkbyB0aGlzIHNvIHRoYXQgdGhlIG5hbWUgaXMgYSB2YWxpZCBmaWxlIG5hbWUgb24gYWxsIG9wZXJhdGluZyBzeXN0ZW1zIGFuZCBmb3IgaW50ZWdyYXRpb24gd2l0aCBzb3VyY2UgY29udHJvbCBzb2Z0d2FyZSBpbiB0aGUgZnV0dXJlLiBUaGUgTmFtZSBpcyBzaG93biBpbiB0aGUgTGlicmFyeSBWaWV3LiA8L3A+Ci08cD5UaGUgUHJlc2VudGF0aW9uIE5hbWUgaXMgdGhlIG5hbWUgdGhhdCBpcyBzaG93biBvbiBwdWJsaXNoZWQgcGFnZXMgYW5kIGl0IGlzIGFsc28gc2hvd24gaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldy4gVGhpcyBuYW1lIGNhbiBjb250YWluIGFueSBjaGFyYWN0ZXJzLCBidXQgYnkgY29udmVudGlvbiBpbiBSVVAsIHdlIHVzZSB0aGUgc2FtZSB0ZXh0IGFzIHRoZSBOYW1lLCBqdXN0IHByZXR0aWVyLiA8L3A+Ci08cD5JbiB0aGUgTGlicmFyeSB2aWV3IHlvdSBjYW4gY2hvb3NlIHRvIGRpc3BsYXkgTmFtZXMgb3IgUHJlc2VudGF0aW9uIE5hbWVzLiBZb3UgY2FuIHN3aXRjaCB0aGUgbmFtZSBkaXNwbGF5IHVzaW5nIHRoZSCRU2hvdyBQcmVzZW50YXRpb24gTmFtZXMnIGJ1dHRvbiBpbiB0aGUgTGlicmFyeSB2aWV3IHRvb2xiYXIuIDwvcD4KLTxwPkluIGdlbmVyYWwsIHlvdSBjcmVhdGUgbmV3IGVsZW1lbnRzIGJ5IHJpZ2h0LWNsaWNraW5nIHRoZSBmb2xkZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIG5ldyBlbGVtZW50LiBGb3IgZXhhbXBsZSwgdG8gY3JlYXRlIGEgbmV3IHJvbGUgaW4gYSBjb250ZW50IHBhY2thZ2UsIHJpZ2h0LWNsaWNrIHRoZSA8c3Ryb25nPlJvbGVzIDwvc3Ryb25nPiBmb2xkZXIsIGhpZ2hsaWdodCA8c3Ryb25nPk5ldyA8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5Sb2xlPC9zdHJvbmc+LiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5NYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gV2l0aGluIDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IENvbnRlbnQgUGFja2FnZTwvc3Bhbj4gcmlnaHQtY2xpY2sgb24gdGhlIDxzdHJvbmc+V29yayBQcm9kdWN0czwvc3Ryb25nPiBmb2xkZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBIaWdobGlnaHQgPHN0cm9uZz5OZXc8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5BcnRpZmFjdDwvc3Ryb25nPi4gVGhlIGFydGlmYWN0IGVkaXRvciBpcyBkaXNwbGF5ZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiB0aGUgTmFtZSBmaWVsZCwgdHlwZSB0aGUgbmV3IEFydGlmYWN0IG5hbWUuIEluIHRoaXMgaW5zdGFuY2UsIHdlJ2xsIGNhbGwgaXQgPHN0cm9uZz5teV9ydXBfbmF2bWFwPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gSW4gdGhlIDxzdHJvbmc+UHJlc2VudGF0aW9uIE5hbWU8L3N0cm9uZz4gZmllbGQsIHR5cGU6IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPk15IFJVUCBOYXZpZ2F0aW9uIE1hcDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+SW4gdGhlIDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb248L3N0cm9uZz4gZmllbGQsIHR5cGU6Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD5UaGUgTmF2aWdhdGlvbiBNYXAgZXhwcmVzc2VzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHVzZXItaW50ZXJmYWNlIGVsZW1lbnRzIGluIHRoZSBzeXN0ZW0sIGFsb25nIHdpdGggdGhlaXIgcG90ZW50aWFsIG5hdmlnYXRpb24gcGF0aHdheXMuPC9wPgotICAgIDwvYmxvY2txdW90ZT4KLSAgPC9saT4KLSAgPGxpPiBJbiB0aGUgPHN0cm9uZz5QdXJwb3NlPC9zdHJvbmc+IGZpZWxkIHR5cGU6IAotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+VGhlcmUgaXMgb25lIE5hdmlnYXRpb24gTWFwIHBlciBzeXN0ZW0uIFRoZSBwdXJwb3NlIG9mIHRoZSBOYXZpZ2F0aW9uIE1hcCBpcyB0byBleHByZXNzIHRoZSBwcmluY2lwYWwgdXNlciBpbnRlcmZhY2UgcGF0aHMgdGhyb3VnaCB0aGUgc3lzdGVtLiBUaGVzZSBhcmUgdGhlIG1haW4gcGF0aHdheXMgdGhyb3VnaCB0aGUgc2NyZWVucyBvZiB0aGUgc3lzdGVtIGFuZCBub3QgbmVjZXNzYXJpbHkgYWxsIG9mIHRoZSBwb3NzaWJsZSBwYXRocy4gSXQgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSByb2FkIG1hcCBvZiB0aGUgc3lzdGVtJ3MgdXNlciBpbnRlcmZhY2UuIFRoZSBOYXZpZ2F0aW9uIE1hcCBtYWtlcyBpdCBlYXN5IHRvIHNlZSBob3cgbWFueSAmcXVvdDtjbGlja3MmcXVvdDsgaXQgd2lsbCB0YWtlIGEgdXNlciB0byBnZXQgdG8gYSBzcGVjaWZpYyBzY3JlZW4uIDwvcD4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgcHJldmlldyB0YWIgdG8gdmlldyB0aGUgbmV3IEFydGlmYWN0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2F2ZSB0aGUgQXJ0aWZhY3QuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiBSZXBlYXQgc3RlcHMgMiB0aHJvdWdoIDkgdXNpbmcgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjogCi0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5BcnRpZmFjdCBOYW1lPC9zdHJvbmc+OiBteV9ydXBfdXNlcl9pbnRlcmZhY2VfcHJvdG90eXBlIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlByZXNlbnRhdGlvbiBOYW1lPC9zdHJvbmc+OiBNeSBSVVAgVUkgUHJvdG90eXBlIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uPC9zdHJvbmc+OiBBIHVzZXItaW50ZXJmYWNlIHByb3RvdHlwZSBpcyBhbiBleGFtcGxlIG9mIHRoZSB1c2VyIGludGVyZmFjZSB0aGF0IGlzIGJ1aWx0IGluIG9yZGVyIHRvIGV4cGxvcmUgYW5kL29yIHZhbGlkYXRlIHRoZSB1c2VyLWludGVyZmFjZSBkZXNpZ24uIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlB1cnBvc2U6IDwvc3Ryb25nPiBUaGUgZm9sbG93aW5nIHJvbGVzIHVzZSB0aGUgdXNlci1pbnRlcmZhY2UgcHJvdG90eXBlOiA8L3A+Ci0gICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgPHA+LSA8c3Ryb25nPnVzZXItaW50ZXJmYWNlIGRlc2lnbmVyczwvc3Ryb25nPiAsIHRvIGV4cGxvcmUgYW5kL29yIHZhbGlkYXRlIHRoZSB1c2VyLWludGVyZmFjZSBkZXNpZ24gYmVmb3JlIHRvbyBtdWNoIGlzIGludmVzdGVkIGluIGl0IDwvcD4KLSAgICAgICAgPHA+LSA8c3Ryb25nPnJlcXVpcmVtZW50cyBzcGVjaWZpZXJzIDwvc3Ryb25nPiwgdG8gdW5kZXJzdGFuZCB0aGUgdXNlciBpbnRlcmZhY2UgZm9yIGEgVXNlIENhc2UgPC9wPgotICAgICAgICA8cD48c3Ryb25nPi0gc3lzdGVtIGFuYWx5c3RzIDwvc3Ryb25nPiwgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHVzZXIgaW50ZXJmYWNlIGltcGFjdHMgdGhlIGFuYWx5c2lzIG9mIHRoZSBzeXN0ZW0gPC9wPgotICAgICAgICA8cD4tIDxzdHJvbmc+ZGVzaWduZXJzIDwvc3Ryb25nPiwgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHVzZXIgaW50ZXJmYWNlIGltcGFjdHMgYW5kIHdoYXQgaXQgcmVxdWlyZXMgZnJvbSB0aGUgJnF1b3Q7aW5zaWRlJnF1b3Q7IG9mIHRoZSBzeXN0ZW0gPC9wPgotICAgICAgICA8cD4gLSA8c3Ryb25nPm1hbmFnZXJzIDwvc3Ryb25nPiwgdG8gcGxhbiBkZXZlbG9wbWVudCBhbmQgdGVzdGluZyBhY3Rpdml0aWVzIDwvcD4KLSAgICAgIDwvYmxvY2txdW90ZT4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gIDwvbGk+Ci08L29sPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMy5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOGQ2ZTg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPkV4ZXJjaXNlIDM6IENyZWF0ZSBSb2xlcyA8L2E+PC9oMj4KLTxwPlRvIGNyZWF0ZSBhIFJvbGUgaW4gTXkgQ29udGVudCBQYWNrYWdlOiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gTWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+V2l0aGluIE15IENvbnRlbnQgUGFja2FnZSByaWdodC1jbGljayBvbiB0aGUgPHN0cm9uZz5Sb2xlcyA8L3N0cm9uZz4gZm9sZGVyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5IaWdobGlnaHQgPHN0cm9uZz5OZXcgPC9zdHJvbmc+IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Um9sZTwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIDxzdHJvbmc+TmFtZSBmaWVsZCA8L3N0cm9uZz4gdHlwZTogbXlfcnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5JbiB0aGUgPHN0cm9uZz5QcmVzZW50YXRpb24gTmFtZTwvc3Ryb25nPiBmaWVsZCB0eXBlOiBNeSBVSSBEZXNpZ25lci4gPC9wPgotICA8L2xpPgotICA8bGk+SW4gdGhlIDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb24gPC9zdHJvbmc+IGZpZWxkIHR5cGU6IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPlRoZSB1c2VyLWludGVyZmFjZSBkZXNpZ25lciBjb29yZGluYXRlcyB0aGUgZGVzaWduIG9mIHRoZSB1c2VyIGludGVyZmFjZS4gVXNlci1pbnRlcmZhY2UgZGVzaWduZXJzIGFyZSBhbHNvIGludm9sdmVkIGluIGdhdGhlcmluZyB1c2FiaWxpdHkgcmVxdWlyZW1lbnRzIGFuZCBwcm90b3R5cGluZyBjYW5kaWRhdGUgdXNlci1pbnRlcmZhY2UgZGVzaWducyB0byBtZWV0IHRob3NlIHJlcXVpcmVtZW50cy4gPC9wPgotICAgIDxwPjxzdHJvbmc+VGlwIDwvc3Ryb25nPiAtIHRoZXJlIGFyZSBkaWZmZXJlbnQgd2F5cyB0aGF0IHlvdSBjYW4gY3JlYXRlIHRoZSB0ZXh0IGFib3ZlIGZvciB0aGUgbmV3IHJvbGU6IDwvcD4KLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyBEaXJlY3RseSwgYnkgdHlwaW5nIGl0IG1hbnVhbGx5IGluIHRoZSBFUEYgQ29tcG9zZXIgZWRpdG9yLiA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgQnkgY29weWluZyBmcm9tIGFub3RoZXIgc2ltaWxhciByb2xlIGFuZCB0aGVuIG1vZGlmeSB1c2luZyB0aGUgZWRpdG9ycyAoZS5nLiBydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXIpLiA8L3A+Ci0gICAgJiMxNDk7Jm5ic3A7QnkgY29weWluZyBmcm9tIGFuIGh0bWwgc291cmNlIHN1Y2ggYXMgdGhlIHR1dG9yaWFsIHlvdSBhcmUgcmVhZGluZy4gPC9ibG9ja3F1b3RlPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4gICAgVHJ5IHRoZSA8c3Ryb25nPlJpY2ggVGV4dCBFZGl0b3IgPC9zdHJvbmc+IGZvciBlZGl0aW5nIHRoZSA8c3Ryb25nPk1haW4gRGVzY3JpcHRpb24uIDwvc3Ryb25nPllvdSBjYW4gb3BlbiB0aGUgUmljaCBUZXh0IEVkaXRvciBmb3IgYW55IGl0ZW0gdGhhdCBoYXMgYSCRdHdpc3R5JyA8aW1nIHdpZHRoPSIxMyIgaGVpZ2h0PSIxMyIgc3JjPSJ0dXRvcmlhbF8yX2V4XzNfY2xpcF9pbWFnZTAwMi5naWYiPnN5bWJvbCAKLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyBUaGUgdXNlci1pbnRlcmZhY2UgZGVzaWduZXIgcm9sZSBpcyBub3QgcmVzcG9uc2libGUgZm9yIGltcGxlbWVudGluZyB0aGUgdXNlciBpbnRlcmZhY2UuIEluc3RlYWQsIHRoaXMgcm9sZSBmb2N1c2VzIG9uIHRoZSBkZXNpZ24gYW5kIHRoZSAmcXVvdDt2aXN1YWwgc2hhcGluZyZxdW90OyBvZiB0aGUgdXNlciBpbnRlcmZhY2UsIGJ5OiA8L3A+Ci0gICAgPC9ibG9ja3F1b3RlPgotICA8L2xpPgotICA8b2w+Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD4gLSBDYXB0dXJpbmcgcmVxdWlyZW1lbnRzIG9uIHRoZSB1c2VyIGludGVyZmFjZSwgaW5jbHVkaW5nIHVzYWJpbGl0eSByZXF1aXJlbWVudHMuIDwvcD4KLSAgICAgIDxwPi0gQnVpbGRpbmcgdXNlci1pbnRlcmZhY2UgcHJvdG90eXBlcy48L3A+Ci0gICAgICA8cD4tIEludm9sdmluZyBvdGhlciBzdGFrZWhvbGRlcnMgb2YgdGhlIHVzZXIgaW50ZXJmYWNlLCBzdWNoIGFzIGVuZC11c2VycywgaW4gdXNhYmlsaXR5IHJldmlld3MgYW5kIHVzZSB0ZXN0aW5nIHNlc3Npb25zLiA8L3A+Ci0gICAgICA8cD4tIFJldmlld2luZyBhbmQgcHJvdmlkaW5nIHRoZSBhcHByb3ByaWF0ZSBmZWVkYmFjayBvbiB0aGUgZmluYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHVzZXIgaW50ZXJmYWNlLCBhcyBjcmVhdGVkIGJ5IG90aGVyIGRldmVsb3BlcnM7IHRoYXQgaXMsIGRlc2lnbmVycyBhbmQgaW1wbGVtZW50ZXJzLiA8L3A+Ci0gICAgPC9ibG9ja3F1b3RlPgotICA8L29sPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz4gliBpZiB5b3UgY29weSB0ZXh0IGZyb20gYSBNaWNyb3NvZnQgV29yZCBkb2N1bWVudCB5b3Ugd2lsbCBnZXQgYSBsb3Qgb2YgZm9ybWF0dGluZyBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCBuZWVkZWQgaW4gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3Nlci4gWW91IGNhbiBzZWUgdGhpcyBpZiB5b3Ugb3BlbiB0aGUgSFRNTCBlZGl0b3IgaW4gdGhlIFJpY2ggVGV4dCBFZGl0b3IuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgdGhlIDxzdHJvbmc+V29ya1Byb2R1Y3RzIDwvc3Ryb25nPiB0YWI7IG1ha2UgdGhpcyBuZXcgcm9sZSByZXNwb25zaWJsZSBmb3IgdGhlIG15X3J1cF9uYXZtYXAgYW5kIG15X3J1cF91c2VyX2ludGVyZmFjZV9wcm90b3R5cGUgYXJ0aWZhY3RzIHRoYXQgeW91IHByZXZpb3VzbHkgY3JlYXRlZC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgdGhlIDxzdHJvbmc+QWRkIDwvc3Ryb25nPiBidXR0b24uIFRoaXMgZGlzcGxheXMgYSBzZWxlY3Rpb24gZGlhbG9nIHdoZXJlIHlvdSBjYW4gc2VsZWN0IHRoZSBXb3JrIFByb2R1Y3RzIHRvIGFkZC4gPC9wPgotICA8L2xpPgotICA8bGk+T25jZSB5b3UgaGF2ZSBzZWxlY3RlZCB0aGUgYXBwcm9wcmlhdGUgV29yayBQcm9kdWN0cywgY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVGhlIHdvcmsgcHJvZHVjdHMgeW91IHNlbGVjdGVkIGFwcGVhciBpbiB0aGUgPHN0cm9uZz5SZXNwb25zaWJsZSBmb3I6IDwvc3Ryb25nPiBwYW5lbC4gCi0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD5Ob3RlIHRoYXQgc2VsZWN0ZWQgZWxlbWVudHMgaW4gYW4gQWRkL1JlbW92ZSBzZWN0aW9uIGRpc3BsYXkgYm90aCB0aGUgZWxlbWVudCBuYW1lIGFuZCB0aGUgkXBhdGgnIHRvIHRoYXQgZWxlbWVudCCWIHRoZSBQbHVnaW4gbmFtZSBhbmQgcGFja2FnZSBuYW1lLiA8L3A+Ci0gICAgPC9ibG9ja3F1b3RlPgotICA8L2xpPgotICA8bGk+Q2xpY2sgdGhlIDxzdHJvbmc+UHJldmlldyA8L3N0cm9uZz4gdGFiIHRvIHZpZXcgdGhlIG5ld2x5IGNyZWF0ZWQgcm9sZSBhbmQgdGhlbiBzYXZlIGJ5IGNsb3NpbmcgdGhlIGVkaXRvci4gPC9saT4KLTwvb2w+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8zX2NsaXBfaW1hZ2UwMDIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8zX2NsaXBfaW1hZ2UwMDIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjJmYzgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfM19jbGlwX2ltYWdlMDAyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNC5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNWY5MjFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPjwvYT48YT5FeGVyY2lzZSA0OiBDcmVhdGUgVGFza3MgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGNyZWF0ZSBhIHRhc2sgYW5kIHRoZW4gcmVsYXRlIHRoYXQgdGFzayB0byB0aGUgb3RoZXIgZWxlbWVudHMgeW91IGhhdmUgY3JlYXRlZC4gPC9wPgotPHA+VG8gY3JlYXRlIGEgVGFzayBpbiBNeSBDb250ZW50IFBhY2thZ2U6IDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBXaXRoaW4gTXkgQ29udGVudCBQYWNrYWdlIHJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPlRhc2tzIDwvc3Ryb25nPiBmb2xkZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBIaWdobGlnaHQgPHN0cm9uZz5OZXcgPC9zdHJvbmc+IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+VGFzazwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+VXNlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gdG8gY3JlYXRlIHRoZSB0YXNrOiAgPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+VGFzazogPC9zdHJvbmc+IG15X2Rlc2lnbl91c2VyX2ludGVyZmFjZSA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+UHJlc2VudGF0aW9uIE5hbWUgPC9zdHJvbmc+OiBNeSBEZXNpZ24gVXNlciBJbnRlcmZhY2UgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uOiA8L3N0cm9uZz4gVG8gcHJvZHVjZSBhIGRlc2lnbiBvZiB0aGUgdXNlciBpbnRlcmZhY2UgdGhhdCBzdXBwb3J0cyB0aGUgcmVhc29uaW5nIGFib3V0LCBhbmQgdGhlIGVuaGFuY2VtZW50IG9mLCBpdHMgdXNhYmlsaXR5LiA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+U3RlcHMgPC9zdHJvbmc+KFVzZSBzdGVwcyB0YWIpOjwvcD4KLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPi0gRGVzY3JpYmUgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiByZWxhdGVkIHVzZXJzIDwvcD4KLSAgICAtIElkZW50aWZ5IHRoZSBwcmltYXJ5IHVzZXIgaW50ZXJmYWNlIGVsZW1lbnRzIDwvYmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5Sb2xlcyAoUHJpbWFyeSBQZXJmb3JtZXIpOiA8L3N0cm9uZz5teV9ydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXIgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPldvcmsgUHJvZHVjdHMgKE1hbmRhdG9yeSBJbnB1dCkgPC9zdHJvbmc+IHJ1cF9zb2Z0d2FyZV9yZXF1aXJlbWVudCAodW5kZXIgcmVxdWlyZW1lbnRzKSA8c3Ryb25nPjwvc3Ryb25nPjwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzIDwvc3Ryb25nPiAoT3V0cHV0cyk6IG15X3J1cF9uYXZtYXAgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkd1aWRhbmNlOiA8L3N0cm9uZz5yZXByZXNlbnRpbmdfZ3JhcGhpY2FsX3VzZXItaW50ZXJmYWNlcyAodW5kZXIgZ3VpX2Rlc2lnbikgPHN0cm9uZz48L3N0cm9uZz48L3A+Ci0gICYjMTQ5OyZuYnNwOyA8c3Ryb25nPkNhdGVnb3JpZXM6IDwvc3Ryb25nPnJ1cF9hbmFseXNpc19kZXNpZ25fZGlzY2lwbGluZSA8c3Ryb25nPjwvc3Ryb25nPjwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYiB0byB2aWV3IHRoZSBuZXdseSBjcmVhdGVkIHRhc2sgYW5kIHNhdmUgYnkgY2xvc2luZyB0aGUgZWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ3JlYXRlIGFub3RoZXIgdGFzayB1c2luZyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+VGFzazogPC9zdHJvbmc+IG15X3Byb3RvdHlwZV91c2VyX2ludGVyZmFjZSA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5QcmVzZW50YXRpb24gbmFtZSA8L3N0cm9uZz46IE15IFByb3RvdHlwZSBVc2VyIEludGVyZmFjZSA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbjogPC9zdHJvbmc+IFRvIHByb3RvdHlwZSB0aGUgc3lzdGVtJ3MgdXNlciBpbnRlcmZhY2UgaW4gYW4gYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgdXNlci1pbnRlcmZhY2UgZGVzaWduIGFnYWluc3QgdGhlIGZ1bmN0aW9uYWwgYW5kIHVzYWJpbGl0eSByZXF1aXJlbWVudHMuIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlN0ZXBzOiA8L3N0cm9uZz48L3A+Ci0gICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgPHA+LSZuYnNwOyBEZXNpZ24gdGhlIHVzZXIgaW50ZXJmYWNlIHByb3RvdHlwZSA8L3A+Ci0gICAgICAgIDxwPi0mbmJzcDsgSW1wbGVtZW50IHRoZSB1c2VyIGludGVyZmFjZSBwcm90b3R5cGUgPC9wPgotICAgICAgPC9ibG9ja3F1b3RlPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+Um9sZXMgKFByaW1hcnkgUGVyZm9ybWVyKTogPC9zdHJvbmc+bXlfcnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPldvcmsgUHJvZHVjdHMgKE1hbmRhdG9yeSBJbnB1dCkgPC9zdHJvbmc+IG15X3J1cF9uYXZtYXAgPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+V29yayBQcm9kdWN0cyAoT3V0cHV0cyk6IDwvc3Ryb25nPm15X3J1cF91c2VyX2ludGVyZmFjZV9wcm90b3R5cGUgPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+Q2F0ZWdvcmllczogPC9zdHJvbmc+cnVwX2FuYWx5c2lzX2Rlc2lnbl9kaXNjaXBsaW5lIDwvcD4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gIDwvbGk+Ci0gIDwvb2w+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF81Lmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjYWRlYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF81Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPkV4ZXJjaXNlIDU6IFdvcmtpbmcgd2l0aCBTdGVwcyA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gdW5kZXJzdGFuZCB0aGUgU3RlcCBFZGl0b3IgdGhhdCBpcyBwYXJ0IG9mIHRoZSBUYXNrIEVkaXRvci4gPC9wPgotPHA+V2hlbiB5b3UgY3JlYXRlIGEgdGFzaywgeW91IGNhbiBkZWZpbmUgYSBzZXJpZXMgb2Ygc3RlcHMgdGhhdCBkZXRhaWwgaG93IHRvIHBlcmZvcm0gdGhlIHRhc2suIFRoZSBTdGVwIEVkaXRvciBhbGxvd3MgeW91IHRvIGFkZCBuZXcgc3RlcHMsIGNoYW5nZSB0aGUgc2VxdWVuY2Ugb2Ygc3RlcHMgYW5kIHRvIGRlbGV0ZSBzdGVwcy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+T3BlbiB0aGUgbXlfZGVzaWduX3VzZXJfaW50ZXJmYWNlIHRhc2sgb3IgY3JlYXRlIGEgbmV3IHRhc2suIENsaWNrIG9uIHRoZSA8c3Ryb25nPlN0ZXBzPC9zdHJvbmc+IHRhYi4gPC9wPgotICA8L2xpPgotICA8bGk+Q3JlYXRlIGEgbmV3IHN0ZXA6ICA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsgRW50ZXIgYSBuYW1lIGZvciB0aGUgc3RlcCBpbiB0aGUgkVN0ZXBzJyBib3guIDwvcD4KLSAgICA8cD4mIzE0OTsgRW50ZXIgYSA8c3Ryb25nPkRlc2NyaXB0aW9uIDwvc3Ryb25nPiCWIHlvdSBjYW4gdXNlIHRoZSBSaWNoIFRleHQgRWRpdG9yIGZvciB0aGlzLiA8L3A+Ci0gICAgPHA+JiMxNDk7IENsaWNrIHRoZSA8c3Ryb25nPkFkZCA8L3N0cm9uZz4gYnV0dG9uLiA8L3A+Ci0gICAgPHA+JiMxNDk7IFNlZSB0aGUgcmVzdWx0cyBvbiB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+ICAgIFJlbW92ZSBhIHN0ZXAgOiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsgUmV0dXJuIHRvIHRoZSA8c3Ryb25nPlN0ZXBzPC9zdHJvbmc+IHRhYi4gPC9wPgotICAgIDxwPiYjMTQ5OyBDbGljayB0aGUgc3RlcCB0byByZW1vdmUgaW4gdGhlIFN0ZXBzIHBhbmVsLiA8L3A+Ci0gICAgPHA+JiMxNDk7IENsaWNrIHRoZSA8c3Ryb25nPkRlbGV0ZSA8L3N0cm9uZz4gYnV0dG9uLiA8L3A+Ci0gICAgPHA+JiMxNDk7IFNlZSB0aGUgcmVzdWx0cyBvbiB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+ICAgIE1vdmUgYSBzdGVwIHVwIHRoZSBsaXN0OiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgUmV0dXJuIHRvIHRoZSA8c3Ryb25nPlN0ZXBzPC9zdHJvbmc+IHRhYi4gPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBDbGljayB0aGUgc3RlcCB5b3Ugd2FudCB0byBtb3ZlIHVwLjwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgQ2xpY2sgdGhlIDxzdHJvbmc+VXAgPC9zdHJvbmc+IGJ1dHRvbi48L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFNlZSB0aGUgcmVzdWx0cyBvbiB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+TW92ZSBhIHN0ZXAgZG93biB0aGUgbGlzdCA6ICA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgUmV0dXJuIHRvIHRoZSA8c3Ryb25nPlN0ZXBzPC9zdHJvbmc+IHRhYi4gPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBDbGljayB0aGUgc3RlcCB5b3Ugd2FudCB0byBtb3ZlIGRvd24uPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBDbGljayB0aGUgPHN0cm9uZz5Eb3duIDwvc3Ryb25nPiBidXR0b24uPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBTZWUgdGhlIHJlc3VsdHMgb24gdGhlIDxzdHJvbmc+UHJldmlldyA8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLTwvb2w+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF82Lmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5MTJkZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF82Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPkV4ZXJjaXNlIDY6IENyZWF0ZSBHdWlkYW5jZSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gY3JlYXRlIG1ldGhvZCA8c3Ryb25nPkd1aWRhbmNlIDwvc3Ryb25nPiBlbGVtZW50cy4gVGhlcmUgaXMgYSByYW5nZSBvZiBkaWZmZXJlbnQgdHlwZXMgb2YgZ3VpZGFuY2UgdGhhdCBjYW4gYmUgY3JlYXRlZC4gRm9yIHRoaXMgdGFzayB3ZSB3aWxsIHNpbXBseSBjcmVhdGUgYSByZXByZXNlbnRhdGl2ZSBndWlkYW5jZSBlbGVtZW50LCBhIGNoZWNrbGlzdC4gT25jZSB5b3UgaGF2ZSBkb25lIHRoaXMsIHRyeSBhdXRob3JpbmcgYWRkaXRpb25hbCBHdWlkYW5jZSB0eXBlcy4gPC9wPgotPHA+SW4gYSBjaGVja2xpc3QsIENoZWNrIEl0ZW1zIGFyZSBjcmVhdGVkIGluIHRoZSBzYW1lIHdheSBhcyBTdGVwcyBpbiBhIHRhc2sgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlIDxzdHJvbmc+Q2hlY2sgSXRlbXMgPC9zdHJvbmc+IHRhYiBpbiB0aGUgPHN0cm9uZz5DaGVja2xpc3QgRWRpdG9yPC9zdHJvbmc+LiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5NYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5XaXRoaW4gPHNwYW4gY2xhc3M9InN0eWxlMSI+TXkgQ29udGVudCBQYWNrYWdlPC9zcGFuPiByaWdodC1jbGljayBvbiB0aGUgPHN0cm9uZz5HdWlkYW5jZSA8L3N0cm9uZz4gZm9sZGVyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5IaWdobGlnaHQgPHN0cm9uZz5OZXcgPC9zdHJvbmc+IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Q2hlY2tsaXN0PC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5OYW1lIHRoZSBndWlkYW5jZSwgbXlfY3JlYXRlX3BoeXNpY2FsX2FwcGVhcmFuY2VfY2hlY2tsaXN0LCBhbmQgcHJvdmlkZSB0aGUgcHJlc2VudGF0aW9uIG5hbWUsIE15IENyZWF0ZSBQaHlzaWNhbCBBcHBlYXJhbmNlIENoZWNrbGlzdC4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIEFkZCB0aGUgZm9sbG93aW5nIGNoZWNrIGl0ZW1zOiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgQ3JlYXRlIGJyYW5kaW5nIHNwZWNpZmljYXRpb25zIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgRGVmaW5lIHBoeXNpY2FsIHNwZWNpZmljYXRpb25zIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+QWRkIHRoZSBjaGVja2xpc3QgdG8gdGhlIDxzdHJvbmc+IG15X3Byb3RvdHlwZV91c2VyX2ludGVyZmFjZSA8L3N0cm9uZz50YXNrIGFuZCB0aGVuIGxvb2sgZm9yIGl0IG9uIHRoZSBwcmV2aWV3IHBhZ2UuIDwvbGk+Ci08L29sPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNy5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOWQ0NjBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+RXhlcmNpc2UgNzogTWFuYWdlIEd1aWRhbmNlIDwvYT48L2gyPgotPHA+R3VpZGFuY2UgY2FuIGJlIGF0dGFjaGVkIHRvIGFueSBDb3JlIE1ldGhvZCBDb250ZW50IG9yIFByb2Nlc3MgRWxlbWVudC4gR3VpZGFuY2UgY2FuIGV2ZW4gYmUgYXR0YWNoZWQgdG8gYSBHdWlkYW5jZSBlbGVtZW50LiA8L3A+Ci08cD5UaGUgZ29hbCBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGNhcnJ5IG91dCBzb21lIHNpbXBsZSBndWlkYW5jZSBtYW5hZ2VtZW50IHRhc2tzIChpLmUuLCBhZGRpbmcgYW5kIHJlbW92aW5nIGd1aWRhbmNlLik8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5OYXZpZ2F0ZSB0byB0aGUgYXJ0aWZhY3QgPHN0cm9uZz5teV9ydXBfbmF2bWFwIDwvc3Ryb25nPiB0aGF0IHlvdSBjcmVhdGVkIGluIGV4ZXJjaXNlIDIgaW4gdGhpcyB0dXRvcmlhbC4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIEFkZCB0aGUgQ29uY2VwdCBQYXBlciA8c3Ryb25nPnByb2Nlc3NfdmlldyA8L3N0cm9uZz4gZnJvbSB0aGUgUlVQIHBsdWctaW4uIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPlRoZSBsaXN0IG9mIGl0ZW1zIGluIHRoZSBTZWxlY3QgRGlhbG9nIGlzIHJlc3RyaWN0ZWQgdG8ganVzdCB0aG9zZSBpdGVtcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIGFkZGVkLiBUaGUgbGlzdCBjYW4gYmUgbG9uZyB0aG91Z2guIFlvdSBjYW4gZW50ZXIgYSBzZWFyY2ggc3RyaW5nLCBzdWNoIGFzIJFwcm8nIGluIHRoZSCRTmFtZSBwYXR0ZXJucycgYm94IHRvIGZpbHRlciB0aGUgaXRlbXMgdGhhdCBhcmUgZGlzcGxheWVkLiBOb3RlIHRoYXQgeW91IGNhbiB1c2UgdGhlIENvbGxhcHNlIEFsbCBhbmQgRXhwYW5kIEFsbCBidXR0b25zIG9uIHRoaXMgZGlhbG9nIHRvIGNoYW5nZSB0aGUgd2F5IHRoZSB0cmVlIGlzIGRpc3BsYXllZC4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD5BZGQgPHN0cm9uZz5teV9jcmVhdGVfcGh5c2ljYWxfYXBwZWFyYW5jZV9jaGVja2xpc3QgPC9zdHJvbmc+IENoZWNrbGlzdC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgdGhlIDxzdHJvbmc+UHJldmlldyA8L3N0cm9uZz4gdGFiIHRvIHZpZXcgeW91ciB3b3JrLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5SZW1vdmUgdGhlIENvbmNlcHQgUGFwZXIgcHJvY2Vzc192aWV3LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIgdG8gdmlldyB5b3VyIHdvcmsuIDwvbGk+Ci08L29sPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfOC5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZDIzNjk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+PC9hPjxhPjwvYT48YT5FeGVyY2lzZSA4OiBDcmVhdGUgTmV3IFN0YW5kYXJkIENhdGVnb3J5IDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byB1bmRlcnN0YW5kIGFuZCB1c2UgPHN0cm9uZz5TdGFuZGFyZCBDYXRlZ29yaWVzLiA8L3N0cm9uZz5JbiBwcmFjdGljZSwgdGhpcyB3aWxsIG5vdCBiZSBkb25lIHZlcnkgb2Z0ZW4sIGFzIFN0YW5kYXJkIENhdGVnb3JpZXMgdGVuZCB0byBiZSByZWxhdGl2ZWx5IHN0YWJsZS4gQWxzbywgaWYgeW91IGFyZSBjcmVhdGluZyBhIHBsdWctaW4gdGhhdCBleHRlbmRzIFJVUCwgeW91IHNob3VsZCBhdHRlbXB0IHRvIHVzZSB0aGUgUlVQIFN0YW5kYXJkIENhdGVnb3JpZXMgYmVmb3JlIGNyZWF0aW5nIG5ldyBvbmVzLiA8L3A+Ci08cD48c3Ryb25nPlN0YW5kYXJkIENhdGVnb3JpZXMgPC9zdHJvbmc+IHByb3ZpZGUgYSBtZWFucyB0byBjYXRlZ29yaXplIGNvcmUgbWV0aG9kIGNvbnRlbnQgaW4gbGluZSB3aXRoIGJlc3QgcHJhY3RpY2VzIGZvciBjcmVhdGluZyBzdHJ1Y3R1cmVkIG1ldGhvZHMuIEluIG9yZGVyIHRvIGVuY291cmFnZSBnb29kIG1ldGhvZCBzdHJ1Y3R1cmUgd2UgcHJvdmlkZSBzdGFuZGFyZCBjYXRlZ29yaWVzIGZvciBncm91cGluZyA8c3Ryb25nPlRhc2tzIDwvc3Ryb25nPmludG8gPHN0cm9uZz48ZW0+RGlzY2lwbGluZXMgPC9lbT48L3N0cm9uZz4sIDxzdHJvbmc+V29yayBQcm9kdWN0cyA8L3N0cm9uZz4gaW50byA8c3Ryb25nPjxlbT5Eb21haW5zIDwvZW0+PC9zdHJvbmc+LCA8c3Ryb25nPlJvbGVzIDwvc3Ryb25nPiBpbnRvIDxzdHJvbmc+PGVtPlJvbGUgU2V0cyA8L2VtPjwvc3Ryb25nPiwgYW5kIDxzdHJvbmc+VG9vbC1NZW50b3JzIDwvc3Ryb25nPiBpbnRvIDxzdHJvbmc+PGVtPlRvb2xzIDwvZW0+PC9zdHJvbmc+LiBVbmxpa2UgPHN0cm9uZz48ZW0+Q3VzdG9tIDwvZW0+IENhdGVnb3JpZXMgPC9zdHJvbmc+LCA8c3Ryb25nPlN0YW5kYXJkIENhdGVnb3JpZXMgPC9zdHJvbmc+IGJ5IGRlZmluaXRpb24gYXJlIGxpbmtlZCB3aXRoIGEgc3BlY2lmaWMgbWV0aG9kIGNvbnRlbnQgdHlwZSCWIGUuZy4gUm9sZSBTZXRzIHdpdGggUm9sZXMsIERpc2NpcGxpbmVzIHdpdGggVGFza3MsIGFuZCBEb21haW5zIHdpdGggV29yayBQcm9kdWN0cy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgPHN0cm9uZz5NeSBQbHVnaW4gJmd0OyBNZXRob2QgQ29udGVudCAmZ3Q7IFN0YW5kYXJkIENhdGVnb3JpZXM8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgPHN0cm9uZz5Sb2xlIFNldCA8L3N0cm9uZz5uYW1lZCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9kZXNpZ248L3NwYW4+IHdpdGggYSBwcmVzZW50YXRpb24gbmFtZSBvZiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBEZXNpZ248L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQWRkIHRoZSByb2xlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X3J1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lcjwvc3Bhbj4gdG8gdGhlPHNwYW4gY2xhc3M9InN0eWxlMSI+IG15X2Rlc2lnbjwvc3Bhbj4gPHN0cm9uZz5Sb2xlIFNldDwvc3Ryb25nPi4gPC9saT4KLTwvb2w+Ci08YmxvY2txdW90ZT4KLSAgPHA+VGhlcmUgYXJlIHR3byB3YXlzIHlvdSBjYW4gZG8gdGhpczogPC9wPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgSW4gdGhlIFN0YW5kYXJkIENhdGVnb3J5IGVkaXRvciBmb3IgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfZGVzaWduPC9zcGFuPiwgb3BlbiB0aGUgPHN0cm9uZz5Sb2xlczwvc3Ryb25nPiB0YWIsIGFuZCBhZGQgdGhlIHJvbGUgdG8gdGhlIHJvbGVzZXQuIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDtJbiB0aGUgUm9sZSBlZGl0b3IgZm9yIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X3J1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lcjwvc3Bhbj4sIG9wZW4gdGhlIDxzdHJvbmc+Q2F0ZWdvcmllczwvc3Ryb25nPiB0YWIgYW5kIGFkZCB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfZGVzaWduPC9zcGFuPiBjYXRlZ29yeSBhcyBhIFNlbGVjdGVkIFJvbGVzZXQuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotPC9ibG9ja3F1b3RlPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfOS5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZTc4OTMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfOS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+PC9hPjxhPjwvYT48YT5FeGVyY2lzZSA5OiA8L2E+QWRkaW5nIFlvdXIgUGx1Zy1pbiB0byB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IDwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGxlYXJuIGhvdyB0byBpbmNsdWRlIHlvdXIgcGx1Zy1pbiBpbiBhIGNvbmZpZ3VyYXRpb24uIDwvcD4KLTxwPkJlZm9yZSB5b3VyIG5ldyBlbGVtZW50cyBjYW4gYmUgc2VlbiBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3LCB5b3UgbmVlZCB0byBmaXJzdCBhZGQgeW91ciBuZXcgcGx1Zy1pbiB0byBhIGNvbmZpZ3VyYXRpb24uIFdlJ2xsIGFkZCB0aGUgbmV3IHBsdWctaW4gdG8gdGhlIENvbmZpZyBmb3IgUlVQIGNvbmZpZ3VyYXRpb24gYW5kIHNlZSB0aGUgcmVzdWx0cyBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3LiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gdGhlIDxzdHJvbmc+QnJvd3NpbmcgPC9zdHJvbmc+cGVyc3BlY3RpdmUgYW5kIGluIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldyA8L3N0cm9uZz50cnkgdG8gZmluZCB5b3VyIG5ldyBjb250ZW50LiBGb3IgZXhhbXBsZSBsb29rIGZvciBNeSBEZXNpZ24gUm9sZXNldC4gWW91IHNob3VsZG4ndCBzZWUgaXQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPnBlcnNwZWN0aXZlIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Q29uZmlndXJhdGlvbnMgPC9zdHJvbmc+IGF0IHRoZSBib3R0b20gb2YgdGhlIHRyZWUgZGlzcGxheS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IE1ha2UgYSBjb3B5IG9mIHRoZSA8c3Ryb25nPlJVUCBmb3IgU21hbGwgUHJvamVjdHMgPC9zdHJvbmc+IGNvbmZpZ3VyYXRpb24uIFJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPlJVUCBmb3IgU21hbGwgUHJvamVjdHMgPC9zdHJvbmc+IGNvbmZpZ3VyYXRpb24gYW5kIHNlbGVjdCA8c3Ryb25nPkNvcHkgPC9zdHJvbmc+LiBUaGVuIHJpZ2h0LWNsaWNrIG9uIHRoZSBDb25maWd1cmF0aW9ucyBmb2xkZXIgYW5kIGNsaWNrIDxzdHJvbmc+UGFzdGUgPC9zdHJvbmc+LiBOYW1lIHRoZSBuZXcgY29uZmlndXJhdGlvbiA8c3Ryb25nPk15IFJVUCBmb3IgU21hbGwgUHJvamVjdHMuIDwvc3Ryb25nPjwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBEb3VibGUtY2xpY2sgb24gdGhlIDxzdHJvbmc+TXkgUlVQIGZvciBTbWFsbCBQcm9qZWN0cyA8L3N0cm9uZz4gY29uZmlndXJhdGlvbiB0byBvcGVuIHRoZSBDb25maWd1cmF0aW9uIEVkaXRvci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENsaWNrIG9uIHRoZSA8c3Ryb25nPlBsdWctaW4gYW5kIFBhY2thZ2UgU2VsZWN0aW9uPC9zdHJvbmc+IHRhYi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCA8c3Ryb25nPk15IFBsdWdpbiA8L3N0cm9uZz4gdG8gdGhlIGNvbmZpZ3VyYXRpb24gYnkgY2hlY2tpbmcgdGhlIGJveCBuZXh0IHRvIGl0IGluIHRoZSBDb25maWd1cmF0aW9uIENvbXBvbmVudHMgZmllbGQuIElmIHlvdSBleHBhbmQgPHN0cm9uZz5NeSBQbHVnaW4gPC9zdHJvbmc+IHlvdSB3aWxsIHNlZSB0aGF0IHRoZSBmdWxsIGNvbnRlbnRzIG9mIHRoZSBwbHVnLWluIGhhdmUgYmVlbiBzZWxlY3RlZC4gCi0gICAgICBZb3UgbWF5IHNlZSBzb21lIGVycm9ycyBpbiB0aGUgTGlicmFyeSBFcnJvciBMb2cgdmlldy4gWW91IGNhbiBjbGljayB0aHJvdWdoIHRoZXNlIGVycm9ycyBvciBpZ25vcmUgdGhlbSBmb3Igbm93LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ2xvc2UgdGhlIGVkaXRvciBhbmQgc2F2ZSB0aGUgY2hhbmdlcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENoYW5nZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIDxzdHJvbmc+TXkgUlVQIGZvciBTbWFsbCBQcm9qZWN0cyA8L3N0cm9uZz5pbiB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gYm94IGluIHRoZSBFUEYgQ29tcG9zZXIgdG9vbGJhciwganVzdCBiZWxvdyB0aGUgbWFpbiBtZW51IGJhci4gPC9wPgotICA8L2xpPgotICA8bGk+IFN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUgYW5kIG5vdyBsb29rIGZvciB5b3VyIGNvbnRlbnQgaW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+LiBZb3Ugc2hvdWxkIG5vdyBzZWUgPHN0cm9uZz5NeSBEZXNpZ24gUm9sZXNldCA8L3N0cm9uZz4uIFlvdSBzaG91bGQgYWxzbyBzZWUgeW91ciBuZXcgV29yayBQcm9kdWN0cyBpbiB0aGUgVW5jYXRlZ29yaXplZCBmb2xkZXIgdW5kZXIgRG9tYWlucy4gPC9saT4KLTwvb2w+Ci08YmxvY2txdW90ZT4mbmJzcDs8L2Jsb2NrcXVvdGU+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9pbnRyby5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2ludHJvLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjNlY2E4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2ludHJvLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMT48YT5UdXRvcmlhbDogQ3JlYXRlIE1ldGhvZCBDb250ZW50IDwvYT48L2gxPgotPGgyPjxhPkludHJvZHVjdGlvbiA8L2E+PC9oMj4KLTxwPkVQRiBDb21wb3NlciBzZXBhcmF0ZXMgcmV1c2FibGUgPHN0cm9uZz5tZXRob2QgY29udGVudCA8L3N0cm9uZz4gZnJvbSBpdHMgYXBwbGljYXRpb24gaW4gPHN0cm9uZz5wcm9jZXNzZXMgPC9zdHJvbmc+LiBUaGUgcHJpbWFyeSBtZXRob2QgY29udGVudCBlbGVtZW50cyBhcmUgPHN0cm9uZz50YXNrcyA8L3N0cm9uZz4sIDxzdHJvbmc+cm9sZXMgPC9zdHJvbmc+LCA8c3Ryb25nPndvcmsgcHJvZHVjdHMgPC9zdHJvbmc+IGFuZCA8c3Ryb25nPmd1aWRhbmNlIDwvc3Ryb25nPi4gQSBQcm9jZXNzIEVuZ2luZWVyIHVzZXMgRVBGIENvbXBvc2VyIHRvIGF1dGhvciB0aGVzZSBlbGVtZW50cywgZGVmaW5lIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlbSwgYW5kIHRvIGNhdGVnb3JpemUgdGhlbS4gTWV0aG9kIGNvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiA8L3A+Ci08cD5FUEYgQ29tcG9zZXIgc3VwcG9ydHMgdGhlIGNvbmNlcHQgb2YgPHN0cm9uZz5NZXRob2QgUGx1Zy1pbnMgPC9zdHJvbmc+IHRoYXQgYWxsb3dzIHRoZSBleHRlbnNpb24gb3IgY3VzdG9taXphdGlvbiBvZiBiYXNlIGxpYnJhcnkgY29udGVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIHRoYXQgYmFzZSBjb250ZW50LiBXaGVuIHdlIHNoaXAgYSBsaWJyYXJ5IHdpdGggRVBGIENvbXBvc2VyIHRoZSBsaWJyYXJ5IGlzIHByb3RlY3RlZCBmcm9tIGRpcmVjdCBtb2RpZmljYXRpb24uIFRoZSBSVVAgcGx1Z2lucyBhcmUgZ3JheWVkIG91dCBpbiB0aGUgTGlicmFyeSB2aWV3IGluZGljYXRpbmcgdGhhdCB0aGV5IGFyZSBsb2NrZWQuIDwvcD4KLTxwPjxzdHJvbmc+WW91IHNob3VsZCBhbHdheXMgY3JlYXRlIG5ldyBjb250ZW50IGluIGEgTWV0aG9kIFBsdWctaW4gdGhhdCB5b3UgcHJvZHVjZS4gPC9zdHJvbmc+VGhpcyBzZXBhcmF0ZXMgeW91ciBjb250ZW50IGZyb20gdGhlIG9yaWdpbmFsIE9wZW5VUCBjb250ZW50IGFuZCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB5b3VyIG93biBsaWJyYXJ5IHdpdGggbmV3IHJlbGVhc2VzIG9mIHRoZSBPcGVuVVAgbGlicmFyeSB3aXRob3V0IGFmZmVjdGluZyB0aGUgY29udGVudCB0aGF0IHlvdSBoYXZlIGNyZWF0ZWQgaW4geW91ciBvd24gcGx1Zy1pbnMuIDwvcD4KLTxwPkluIHRoaXMgdHV0b3JpYWwgeW91IHdpbGwgdXNlIHNldmVyYWwgkWVkaXRvcnMnLiBFYWNoIGVkaXRvciBvcGVucyBpbiBpdHMgb3duIHRhYiBpbiB0aGUgY29udGVudCBkaXNwbGF5IHNlY3Rpb24gb2YgdGhlIHNjcmVlbi4gSXQgaXMgZ29vZCBwcmFjdGljZSB0byBjbG9zZSBhbiBlZGl0b3Igd2hlbiB5b3UgaGF2ZSBmaW5pc2hlZCB3aXRoIGl0LiBUaGlzIGVuc3VyZXMgdGhhdCB5b3Ugc2F2ZSBhbnkgY2hhbmdlcyB5b3UgbWFrZS4gPC9wPgotPHA+SWYgeW91IGRvIGhhdmUgc2V2ZXJhbCBlZGl0b3JzIG9wZW4sIHlvdSBtYXkgd2FudCB0byB0dXJuIG9uIHRoZSCRTGluayB3aXRoIEVkaXRvcicgZmVhdHVyZSBieSBjbGlja2luZyBvbiB0aGUgTGluayB3aXRoIEVkaXRvciBidXR0b24gaW4gdGhlIExpYnJhcnkgdmlldyB0b29sYmFyLiBJZiB0aGlzIGlzIHNlbGVjdGVkLCB3aGVuIHlvdSBzd2l0Y2ggYmV0d2VlbiBlZGl0b3JzLCB0aGUgZWxlbWVudCBpbiB0aGUgY3VycmVudCBlZGl0b3IgaXMgaGlnaGxpZ2h0ZWQgaW4gdGhlIExpYnJhcnkgdmlldy4gPC9wPgotPHA+VGhlIGZvbGxvd2luZyBleGVyY2lzZXMgdGFrZSB5b3UgdGhyb3VnaCB0aGUgY3JlYXRpb24gb2Ygk2NvcmUgbWV0aG9kIGNvbnRlbnSULiA8L3A+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF8xLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEyODliMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF8xLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAxOiBBZGRpbmcgdG8gYmFzZSBtZXRob2QgY29udGVudCBhc3NvY2lhdGVkIHdpdGggYSByb2xlIHVzaW5nIENvbnRyaWJ1dGlvbiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXh0ZW5kIGEgcm9sZSBpbiBSVVAgdXNpbmcgkWNvbnRyaWJ1dGlvbicuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5UaGlzIGV4ZXJjaXNlIGFkZHMgY29udGVudCB0byB0aGUgTXkgUGx1Z2luIHBsdWdpbi4gSWYgeW91IGhhdmUgbm90IGNhcnJpZWQgb3V0IHRoZSCRQ3JlYXRlIENvcmUgTWV0aG9kIENvbnRlbnQgdHV0b3JpYWwsIGNyZWF0ZSBpdCBub3cuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNyZWF0ZSBhIENvbnRlbnQgUGFja2FnZSBpbiB0aGUgTXkgUGx1Z2luIHBsdWctaW4gY2FsbGVkIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkNvbnRyaWJ1dGlvbjwvc3Bhbj4gVGVzdC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIG5ldyBDb250cmlidXRpb24gVGVzdCBjb250ZW50IHBhY2thZ2UsIGNyZWF0ZSBhIG5ldyBSb2xlOiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jb250cmlidXRpbmdfdWlfZGVzaWduZXI8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5QYWdlIGRvd24gdGhlIERlc2NyaXB0aW9uIHRhYiB0byB0aGUgQ29udGVudCBWYXJpYWJpbGl0eSBzZWN0aW9uIGFuZCB0aGVuLCBpbiB0aGUgPHN0cm9uZz5WYXJpYWJpbGl0eSBUeXBlIDwvc3Ryb25nPiwgc2VsZWN0IDxzdHJvbmc+Q29udHJpYnV0ZXMgPC9zdHJvbmc+IGFuZCBjaG9vc2UgdGhlIGJhc2Ugcm9sZTogPHN0cm9uZz5ydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXIgPC9zdHJvbmc+LiBZb3Ugd2lsbCBmaW5kIHRoaXMgaW4gPHN0cm9uZz5SVVAgJmd0OyBEZXNpZ24gJmd0OyBHVUkgRGVzaWduPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ29tcGxldGUgdGhlIGZvbGxvd2luZzogPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IEFkZCBCcmllZiBEZXNjcmlwdGlvbjogQ29udHJpYnV0aW5nIGJyaWVmIGRlc2NyaXB0aW9uIHRleHQgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBBZGQgTWFpbiBEZXNjcmlwdGlvbiA6IENvbnRyaWJ1dGluZyBtYWluIGRlc2NyaXB0aW9uIHRleHQgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBTYXZlIChieSBjbG9zaW5nIHRoZSByb2xlIGVkaXRvcikuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+Q3JlYXRlIGEgbmV3IENvbmZpZ3VyYXRpb24gYnkgc2VsZWN0aW5nIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb25zIDwvc3Ryb25nPiBmb2xkZXIgaW4gdGhlIExpYnJhcnkgVmlldyB0cmVlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5SaWdodCBjbGljayB0aGUgZm9sZGVyIHRvIGNyZWF0ZSBuZXcgY29uZmlndXJhdGlvbiBhbmQgdGhlbiBuYW1lIHRoZSBjb25maWd1cmF0aW9uIDxzcGFuIGNsYXNzPSJzdHlsZTEiPlZhcmlhYmlsaXR5IENvbmZpZ3VyYXRpb248L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IHRoZSBSVVAgYmFzZSBhbmQgeW91ciBwbHVnLWluIChNeSBQbHVnaW4pIGJ5IG1hcmtpbmcgdGhlIGNoZWNrYm94ZXMuIFNhdmUgdGhlIGNvbmZpZ3VyYXRpb24gKGNsb3NlIHRoZSBjb25maWd1cmF0aW9uIHRhYikuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlNldCCTY3VycmVudCBjb25maWd1cmF0aW9ulCCWIGxvY2F0ZWQgdW5kZXIgbWFpbiBtZW51IGJhciBhcyCTVmFyaWFiaWxpdHkgQ29uZmlndXJhIHRpb26ULiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gdGhlIDxzdHJvbmc+QnJvd3Npbmc8L3N0cm9uZz4gcGVyc3BlY3RpdmUgYW5kIHRoZW4gb3BlbiB0aGUgVXNlci1JbnRlcmZhY2UgRGVzaWduZXIgcm9sZS4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIFlvdSBzaG91bGQgc2VlIHRoZSB0ZXh0IHRoYXQgeW91IGluY2x1ZGVkIGluIHRoZSBDb250cmlidXRpbmcgcm9sZSBkaXNwbGF5ZWQgaW4gdGhlIFVzZXItSW50ZXJmYWNlIERlc2lnbmVyLiA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPgotICA8cD48c3Ryb25nPk5vdGU6IDwvc3Ryb25nPiBUaGUgQ29uZmlndXJhdGlvbiBWaWV3IHJlc29sdmVzIHRoZSB2YXJpYWJpbGl0eSByZWxhdGlvbnNoaXBzIGJldHdlZW4gcmVsYXRlZCBwbHVnLWlucyBpbiBhIGNvbmZpZ3VyYXRpb24gYW5kIHNob3dzIHRoZSByZXN1bHRzIGFzIHRoZXkgd2lsbCBiZSBwdWJsaXNoZWQgaW4gYSBwdWJsaXNoZWQgd2ViIHNpdGUuIDwvcD4KLTwvYmxvY2txdW90ZT4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzIuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF8yLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTM3OTczZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDI6IEFkZGluZyB0byBiYXNlIG1ldGhvZCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCBhIHdvcmsgcHJvZHVjdCB1c2luZyA8dT5Db250cmlidXRpb248L3U+IDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHRlbmQgYSA8c3Ryb25nPldvcmsgUHJvZHVjdCA8L3N0cm9uZz4gKDxzdHJvbmc+QXJ0aWZhY3Q8L3N0cm9uZz4pIGluIFJVUCB1c2luZyCRY29udHJpYnV0aW9uJy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBXaXRoaW4gdGhlIENvbnRyaWJ1dGlvbiBUZXN0IHBhY2thZ2UgY3JlYXRlIGEgbmV3IGFydGlmYWN0IGNhbGxlZCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jb250cmlidXRpbmdfbmF2bWFwPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCBhIDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb24sIE1haW4gRGVzY3JpcHRpb248L3N0cm9uZz4sIDxzdHJvbmc+UHVycG9zZTwvc3Ryb25nPiwgZXRjLiwgOiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5Db250cmlidXRpbmcgQnJpZWYgRGVzY3JpcHRpb24sIENvbnRyaWJ1dGluZyBNYWluIERlc2NyaXB0aW9uLCBhbmQgQ29udHJpYnV0aW5nIFB1cnBvc2U8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gPHN0cm9uZz5WYXJpYWJpbGl0eSBSZWxhdGlvbnNoaXAgPC9zdHJvbmc+IHNlbGVjdCA8c3Ryb25nPkNvbnRyaWJ1dGVzIDwvc3Ryb25nPiwgYW5kIGZvciA8c3Ryb25nPmJhc2UgYXJ0aWZhY3QgPC9zdHJvbmc+IHNlbGVjdCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5ydXBfbmF2bWFwPC9zcGFuPi4gU2F2ZSBieSBjbG9zaW5nIHRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIHRoZSBCcm93c2luZyBwZXJzcGVjdGl2ZSBhbmQgdmlldyB0aGUgTmF2aWdhdGlvbiBNYXAgYXJ0aWZhY3QgaW4gdGhlIDxzdHJvbmc+QW5hbHlzaXMgYW5kIERlc2lnbiBEb21haW4gPC9zdHJvbmc+IGZvbGRlciBpbiA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldy4gPC9zdHJvbmc+PC9wPgotICA8L2xpPgotICA8bGk+IFlvdSBzaG91bGQgc2VlIHRoZSB0ZXh0IHRoYXQgeW91IGluY2x1ZGVkIGluIHRoZSBDb250cmlidXRpbmcgcm9sZSBkaXNwbGF5ZWQgaW4gdGhlIFVzZXItSW50ZXJmYWNlIERlc2lnbmVyLiA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPiZuYnNwOzwvYmxvY2txdW90ZT4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzMuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF8zLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQ0ZDkwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDM6IEFkZGluZyBiYXNlIG1ldGhvZCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCBhIHRhc2sgdXNpbmcgPHU+Q29udHJpYnV0aW9uPC91PiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXh0ZW5kIGEgPHN0cm9uZz5UYXNrIDwvc3Ryb25nPiBpbiBSVVAgdXNpbmcgkWNvbnRyaWJ1dGlvbicuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5XaXRoaW4gdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkNvbnRyaWJ1dGlvbiBUZXN0IDwvc3Bhbj5wYWNrYWdlIGNyZWF0ZSBhIG5ldyA8c3Ryb25nPlRhc2s8L3N0cm9uZz46IDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2NvbnRyaWJ1dGluZ19kZXNpZ25fdXNlcl9pbnRlcmZhY2U8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIGEgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbiwgTWFpbiBkZXNjcmlwdGlvbiA8L3N0cm9uZz4sIDxzdHJvbmc+UHVycG9zZTwvc3Ryb25nPiwgZXRjLiw6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPkNvbnRyaWJ1dGluZyBCcmllZiBEZXNjcmlwdGlvbiB0ZXh0LCBDb250cmlidXRpbmcgTWFpbiBEZXNjcmlwdGlvbiB0ZXh0LCBhbmQgQ29udHJpYnV0aW5nIFB1cnBvc2UgdGV4dC4gPC9zcGFuPjwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgdHdvIG5ldyBzdGVwczogPHNwYW4gY2xhc3M9InN0eWxlMSI+Q29udHJpYnV0aW5nIFN0ZXAgMSA8L3NwYW4+YW5kPHNwYW4gY2xhc3M9InN0eWxlMSI+IENvbnRyaWJ1dGluZyBTdGVwIDI8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gPHN0cm9uZz5WYXJpYWJpbGl0eSBSZWxhdGlvbnNoaXAgPC9zdHJvbmc+IHNlbGVjdCA8c3Ryb25nPkNvbnRyaWJ1dGVzPC9zdHJvbmc+LCBhbmQgZm9yIGJhc2UgPHN0cm9uZz50YXNrIDwvc3Ryb25nPiBzZWxlY3QsIDxzcGFuIGNsYXNzPSJzdHlsZTEiPmRlc2lnbl91c2VyX2ludGVyZmFjZTwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBHbyBiYWNrIHRvIHRoZSA8c3Ryb25nPlN0ZXBzIDwvc3Ryb25nPiB0YWIgYW5kIGNsaWNrIHRoZSA8c3Ryb25nPk9yZGVyIDwvc3Ryb25nPiBidXR0b24uIFlvdSBjYW4gbm93IGluc2VydCB5b3VyIG5ldyBzdGVwcyBpbnRvIHRoZSBvcmlnaW5hbCBzdGVwcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U2F2ZSB0aGUgbmV3IHRhc2sgYnkgY2xvc2luZyB0aGUgdGFzayBlZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIEJyb3dzaW5nIHBlcnNwZWN0aXZlIGFuZCB2aWV3IHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5EZXNpZ24gdGhlIFVzZXIgSW50ZXJmYWNlPC9zcGFuPiB0YXNrIGluIHRoZSA8c3Ryb25nPkRpc2NpcGxpbmVzIDwvc3Ryb25nPiBmb2xkZXIgaW4gPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXcgPC9zdHJvbmc+LiBZb3Ugd2lsbCBmaW5kIGl0IHVuZGVyIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5BbmFseXNpc18mYW1wOyBEZXNpZ248L3NwYW4+IGRpc2NpcGxpbmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBMb29rIGF0IHRoZSBkZXNjcmlwdGlvbnMgYW5kIHRoZSBzdGVwcyB0byBzZWUgaG93IHlvdXIgbmV3IG1hdGVyaWFsIHdhcyBjb250cmlidXRlZC4gWW91IHNob3VsZCBzZWUgdGhlIHRleHQgdGhhdCB5b3UgaW5jbHVkZWQgaW4gdGhlIENvbnRyaWJ1dGluZyByb2xlIGRpc3BsYXllZCBpbiB0aGUgVXNlciBJbnRlcmZhY2UgdGFzay4gPC9wPgotICA8L2xpPgotICA8bGk+IFlvdSBjYW4gYWxzbyB0cnkgc3BlY2lmeWluZyBhZGRpdGlvbmFsIDxzdHJvbmc+YXJ0aWZhY3RzIDwvc3Ryb25nPiwgPHN0cm9uZz5ndWlkYW5jZSA8L3N0cm9uZz4sIDxzdHJvbmc+YWRkaXRpb25hbCBwZXJmb3JtZXIgcm9sZXM8L3N0cm9uZz4sIGV0Yy4sIGluIHRoZSBjb250cmlidXRpbmcgdGFzayAoaW4gQXV0aG9yaW5nIHBlcnNwZWN0aXZlKSBhbmQgdGhlbiB2aWV3IHRoZSByZXN1bHQgaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldyB0byBzZWUgdGhlIGJlaGF2aW9yLiA8L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNC5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NDVjZTQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNDogRXh0ZW5kaW5nIGJhc2UgbWV0aG9kIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIGEgcm9sZSB1c2luZyA8dT5FeHRlbmRzPC91PiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXh0ZW5kIGJhc2UgbWV0aG9kIGNvbnRlbnQgdmlhIGV4dGVuZHMgdmFyaWFiaWxpdHkuIEV4dGVuZHMgdmFyaWFiaWxpdHkgd29ya3MgZGlmZmVyZW50bHkgdGhhbiBDb250cmlidXRlcyB2YXJpYWJpbGl0eSBpbiB0aGF0IHRoZSBtZXRob2QgY29udGVudCBlbGVtZW50IHRoYXQgZXh0ZW5kcyB0aGUgYmFzZSBtZXRob2QgZWxlbWVudCBpbmhlcml0cyB0aGUgYXR0cmlidXRlcyBvZiB0aGUgZXh0ZW5kZWQgYmFzZSBlbGVtZW50LiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgPHN0cm9uZz5Db250ZW50IFBhY2thZ2UgPC9zdHJvbmc+IGluIHRoZSBNeSBQbHVnaW4gUGx1Zy1pbiBjYWxsZWQgRXh0ZW5kcyBUZXN0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IDxzdHJvbmc+Um9sZSA8L3N0cm9uZz46IDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2V4dGVuZHNfdWlfZGVzaWduZXIsPC9zcGFuPiB3aXRoIHRoZSBwcmVzZW50YXRpb24gbmFtZSwgPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kcyBSVVAgVUkgRGVzaWduZXI8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gdGhlIFZhcmlhYmlsaXR5IFR5cGUgc2VsZWN0IDxzdHJvbmc+RXh0ZW5kcyA8L3N0cm9uZz4gYW5kIGNob29zZSB0aGUgYmFzZSByb2xlOiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5ydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXI8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIGEgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbjwvc3Ryb25nPjogRXh0ZW5kcyBSb2xlIEJyaWVmIERlc2NyaXB0aW9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIGEgPHN0cm9uZz5NYWluIERlc2NyaXB0aW9uIDwvc3Ryb25nPjogRXh0ZW5kcyBSb2xlIE1haW4gRGVzY3JpcHRpb24uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTYXZlIHRoZSBuZXcgcm9sZSBieSBjbG9zaW5nIHRoZSByb2xlIGVkaXRvci4gPC9wPgotICA8L2xpPgotICA8bGk+IFVwZGF0ZSB0aGUgVmFyaWFiaWxpdHkgQ29uZmlndXJhdGlvbiB0byBpbmNsdWRlIHRoZSBuZXcgY29udGVudCBwYWNrYWdlLiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4gJiMxNDk7Jm5ic3A7T3BlbiB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+VmFyaWFiaWxpdHkgQ29uZmlndXJhdGlvbjwvc3Bhbj4gYW5kIGV4cGFuZCA8c3Ryb25nPk15IFBsdWdpbiAmZ3Q7IE1ldGhvZCBDb250ZW50ICZndDsgQ29udGVudCBQYWNrYWdlcy4gPC9zdHJvbmc+IDwvcD4KLSAgICA8cD4mIzE0OTsgVW5jaGVjayBDb250cmlidXRpb24gVGVzdC4gPC9wPgotICAgIDxwPiYjMTQ5OyBNYWtlIHN1cmUgPHN0cm9uZz5FeHRlbmRzIFRlc3QgPC9zdHJvbmc+aXMgY2hlY2tlZC4gVGhpcyBpcyBkb25lIHNvIHRoZXJlIHRoYXQgYXJlIG5vIGNvbmZsaWN0aW5nIGV4dGVuc2lvbnMgdG8gdGhlIHNhbWUgbWV0aG9kIGVsZW1lbnQuIDwvcD4KLSAgICA8cD4mIzE0OTsgQ2xvc2UgYW5kIHNhdmUgdGhlIGNoYW5nZXMgdG8gdGhlIGNvbmZpZ3VyYXRpb24uIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byA8c3Ryb25nPkJyb3dzaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+IEluIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldzwvc3Ryb25nPiwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5FeHRlbmRzIFJVUCBVSSBEZXNpZ25lciByb2xlPC9zcGFuPiBpbiB0aGUgVW5jYXRlZ29yaXplZCBSb2xlcyBmb2xkZXIgdW5kZXIgdGhlIJM8c3Ryb25nPlJvbGUgU2V0czwvc3Ryb25nPpQgZm9sZGVyLiBZb3Ugd2lsbCBzZWUgaW4gdGhlIGh0bWwgcGFnZSB0aGF0IGNvbnRlbnQgZW50ZXJlZCBpbiB0aGUgZXh0ZW5kaW5nIHJvbGUgaGFzIGJlZW4gcmVwbGFjZWQsIHdoZXJlYXMgY29udGVudCBub3QgcHJvdmlkZWQgaGFzIGJlZW4gaW5oZXJpdGVkIGZyb20gdGhlIGJhc2UgYXJ0aWZhY3QuIE5vdGUgdGhhdCB0aGUgZXh0ZW5kZWQgcm9sZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5Vc2VyLUludGVyZmFjZSBEZXNpZ25lcjwvc3Bhbj4gcmVtYWlucyB1bmNoYW5nZWQuIDwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF81Lmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0Yjg1MWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF81Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSA1OiBFeHRlbmRpbmcgYmFzZSBtZXRob2QgY29udGVudCBhc3NvY2lhdGVkIHdpdGggYSBXb3JrIFByb2R1Y3QgdXNpbmcgPHU+RXh0ZW5kczwvdT4gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGV4dGVuZCBhIGJhc2UgbWV0aG9kIHdvcmsgcHJvZHVjdCB1c2luZyBleHRlbmRzIHZhcmlhYmlsaXR5LiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgPHN0cm9uZz5Xb3JrIFByb2R1Y3QgPC9zdHJvbmc+IGluIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5FeHRlbmRzIFRlc3Q8L3NwYW4+IENvbnRlbnQgUGFja2FnZSBjYWxsZWQgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfZXh0ZW5kc19ydXBfbmF2bWFwPC9zcGFuPiB3aXRoIHRoZSBwcmVzZW50YXRpb24gbmFtZSwgPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kcyBSVVAgTmF2bWFwPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIHRoZSA8c3Ryb25nPlZhcmlhYmlsaXR5IFR5cGUgPC9zdHJvbmc+IHNlbGVjdCA8c3Ryb25nPmV4dGVuZHMgPC9zdHJvbmc+IGFuZCBjaG9vc2UgdGhlIGJhc2UgPHN0cm9uZz5Xb3JrIFByb2R1Y3QgPC9zdHJvbmc+PHNwYW4gY2xhc3M9InN0eWxlMSI+cnVwX25hdm1hcDwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uIDwvc3Ryb25nPjogRXh0ZW5kcyBOYXZtYXAgQnJpZWYgRGVzY3JpcHRpb24uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTYXZlIGFuZCB0aGVuIHN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkluIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldzwvc3Ryb25nPiwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5FeHRlbmRzIFJVUCBOYXZtYXA8L3NwYW4+IHdvcmsgcHJvZHVjdCBpbiB0aGUgPHN0cm9uZz5VbmNhdGVnb3JpemVkIEZvbGRlciA8L3N0cm9uZz4gdW5kZXIgPHN0cm9uZz5Eb21haW5zIDwvc3Ryb25nPi4gWW91IHdpbGwgc2VlIGluIHRoZSBodG1sIHBhZ2UgdGhhdCBjb250ZW50IGVudGVyZWQgaW4gdGhlIGV4dGVuZGluZyBhcnRpZmFjdCBoYXMgYmVlbiByZXBsYWNlZCwgd2hlcmVhcyBjb250ZW50IG5vdCBwcm92aWRlZCBoYXMgYmVlbiBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZSBhcnRpZmFjdC4gTm90ZSB0aGF0IHRoZSBleHRlbmRlZCBhcnRpZmFjdCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5OYXZpZ2F0aW9uIE1hcDwvc3Bhbj4gcmVtYWlucyB1bmNoYW5nZWQuPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzYuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF82Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGRiNGM1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDY6IEV4dGVuZGluZyBiYXNlIG1ldGhvZCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCBhIFRhc2sgdXNpbmcgPHU+RXh0ZW5kczwvdT4gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGV4dGVuZCBhIGJhc2UgbWV0aG9kIHRhc2sgdXNpbmcgZXh0ZW5kcyB2YXJpYWJpbGl0eS4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyA8c3Ryb25nPnRhc2sgPC9zdHJvbmc+IGluIHRoZSBFeHRlbmRzIFRlc3QgY29udGVudCBwYWNrYWdlIGNhbGxlZCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9leHRlbmRzX2Rlc2lnbl91c2VyX2ludGVyZmFjZTwvc3Bhbj4sIHdpdGggcHJlc2VudGF0aW9uIG5hbWUsIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgRGVzaWduIFVzZXIgSW50ZXJmYWNlLiA8L3NwYW4+PC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIHRoZSA8c3Ryb25nPlZhcmlhYmlsaXR5IFR5cGUsIDwvc3Ryb25nPiBzZWxlY3QgPHN0cm9uZz5leHRlbmRzIDwvc3Ryb25nPiBhbmQgY2hvb3NlIHRoZSBiYXNlIHRhc2sgZGVzaWduX3VzZXJfaW50ZXJmYWNlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIGEgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbiA8L3N0cm9uZz46IDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgVGFzayBCcmllZiBEZXNjcmlwdGlvbjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgPHN0cm9uZz5TdGVwcyA8L3N0cm9uZz46IDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZCBTdGVwIDEsIEV4dGVuZCBTdGVwIDIgPC9zcGFuPjwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgdGhlIDxzdHJvbmc+Um9sZSA8L3N0cm9uZz4gY3JlYXRlZCBpbiBleGVyY2lzZSA0OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9leHRlbmRzX3VpX2Rlc2lnbmVyPC9zcGFuPiwgYXMgUHJpbWFyeSBQZXJmb3JtZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgdGhlIFdvcmsgUHJvZHVjdCBjcmVhdGVkIGluIGV4ZXJjaXNlIDU6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2V4dGVuZHNfcnVwX25hdm1hcDwvc3Bhbj4sIGFzIGFuIE91dHB1dC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCA8c3Ryb25nPkd1aWRhbmNlIDwvc3Ryb25nPihjaG9vc2UgYW55IGd1aWRhbmNlKSA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIHRoZSA8c3Ryb25nPnRhc2sgPC9zdHJvbmc+IHRvIHRoZSBhcHByb3ByaWF0ZSBTdGFuZGFyZCBDYXRlZ29yeTogPHNwYW4gY2xhc3M9InN0eWxlMSI+cnVwX2FuYWx5c2lzX2Rlc2lnbl9kaXNjaXBsaW5lPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNhdmUgYW5kIHRoZW4gc3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+SW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgRGVzaWduIFVzZXIgSW50ZXJmYWNlPC9zcGFuPiB0YXNrIHVuZGVyIHRoZSA8c3Ryb25nPkRpc2NpcGxpbmVzIDwvc3Ryb25nPiBmb2xkZXIgaW4gdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkFuYWx5c2lzICZhbXA7IERlc2lnbjwvc3Bhbj4gZGlzY2lwbGluZS4gWW91IHdpbGwgc2VlIGluIHRoZSBodG1sIHBhZ2UgdGhhdCBtZXRob2QgY29udGVudCBhbmQgcmVsYXRpb25zaGlwcyBoYXZlIGJlZW4gaW5oZXJpdGVkIGZyb20gdGhlIGJhc2UgdGFzayBhbmQgZXh0ZW5kZWQgYnkgdGhlIHBsdWctaW4gZXh0ZW5kaW5nIGNvbnRlbnQgYW5kIHJlbGF0aW9uc2hpcHMuIE5vdGUgdGhhdCB0aGUgZXh0ZW5kZWQgdGFzayByZW1haW5zIHVuY2hhbmdlZC48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNy5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMTE1ZDQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNzogRXh0ZW5kaW5nIGJhc2UgbWV0aG9kIGNvbnRlbnQgdXNpbmcgPHU+UmVwbGFjZTwvdT4gdmFyaWFiaWxpdHkgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGV4dGVuZCBiYXNlIG1ldGhvZCBjb250ZW50IHVzaW5nIHJlcGxhY2UgdmFyaWFiaWxpdHkuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IDxzdHJvbmc+Y29udGVudCBwYWNrYWdlIDwvc3Ryb25nPiBuYW1lZCwgPHNwYW4gY2xhc3M9InN0eWxlMSI+UmVwbGFjZSBUZXN0PC9zcGFuPiwgaW4gdGhlIE15IFBsdWdpbiBwbHVnLWluLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IDxzdHJvbmc+cm9sZSA8L3N0cm9uZz46IDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X3JlcGxhY2VfdWlfZGVzaWduZXIgcm9sZTwvc3Bhbj4gd2l0aCBwcmVzZW50YXRpb24gbmFtZSwgPHNwYW4gY2xhc3M9InN0eWxlMSI+TXkgUmVwbGFjZSBVSSBEZXNpZ25lcjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiB0aGUgPHN0cm9uZz5WYXJpYWJpbGl0eSBUeXBlIDwvc3Ryb25nPiBzZWxlY3QgPHN0cm9uZz5yZXBsYWNlcyA8L3N0cm9uZz4gYW5kIHRoZW4gY2hvb3NlIHRoZSA8c3Ryb25nPmJhc2Ugcm9sZSA8L3N0cm9uZz46IDxzcGFuIGNsYXNzPSJzdHlsZTEiPnJ1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lcjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+UmVwbGFjZSBCcmllZiBEZXNjcmlwdGlvbi48L3NwYW4+IDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPk1haW4gRGVzY3JpcHRpb24gPC9zdHJvbmc+OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5SZXBsYWNlIE1haW4gRGVzY3JpcHRpb248L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2F2ZSB0aGUgcm9sZSBieSBjbG9zaW5nIHRoZSByb2xlIGVkaXRvci4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIFVwZGF0ZSB0aGUgVmFyaWFiaWxpdHkgVGVzdCBDb25maWd1cmF0aW9uOiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4gJiMxNDk7Jm5ic3A7T3BlbiB0aGUgVmFyaWFiaWxpdHkgQ29uZmlndXJhdGlvbiBhbmQgZXhwYW5kIDxzdHJvbmc+TXkgUGx1Z2luICZndDsgTWV0aG9kIENvbnRlbnQgJmd0OyBDb250ZW50IFBhY2thZ2VzPC9zdHJvbmc+LiA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7VW5jaGVjayA8c3Ryb25nPkV4dGVuZHMgVGVzdDwvc3Ryb25nPi4gPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwO0NoZWNrIDxzdHJvbmc+UmVwbGFjZSBUZXN0PC9zdHJvbmc+LiBUaGlzIGlzIGRvbmUgc28gdGhlcmUgYXJlIG5vIGNvbmZsaWN0aW5nIGV4dGVuc2lvbnMgaW4gdGhlIHNhbWUgbWV0aG9kIGVsZW1lbnQuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkluIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldzwvc3Ryb25nPiwgeW91IHdpbGwgc2VlIHRoYXQgdGhlcmUgaXMgbm8gbG9uZ2VyIGEgKFJVUCkgPHNwYW4gY2xhc3M9InN0eWxlMSI+VXNlci1JbnRlcmZhY2UgRGVzaWduZXI8L3NwYW4+IHJvbGUgaW4gdGhlIDxzdHJvbmc+Um9sZSBTZXRzIDwvc3Ryb25nPiBmb2xkZXIuIEl0IHdhcyByZXBsYWNlZCBieSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBSZXBsYWNlIFVJIERlc2lnbmVyPC9zcGFuPiByb2xlLiBNb3Jlb3Zlciwgb3RoZXIgY29udGVudCBlbGVtZW50cyBpbiB0aGUgYmFzZSBwbHVnLWluIHRoYXQgcmVmZXJlbmNlZCB0aGUgKFJVUCkgPHNwYW4gY2xhc3M9InN0eWxlMSI+VXNlci1JbnRlcmZhY2UgRGVzaWduZXI8L3NwYW4+IHJvbGUgbm93IHJlZmVyZW5jZSB0aGUgcmVwbGFjaW5nIHJvbGUgaW5zdGVhZCAoZS5nLiwgaWYgeW91IG9wZW4gdGhlIGRpc2NpcGxpbmVzIGZvbGRlciBhbmQgdmlldyB0aGUgdGFzayA8c3BhbiBjbGFzcz0ic3R5bGUxIj5EZXNpZ24gVGhlIFVzZXIgSW50ZXJmYWNlPC9zcGFuPiB5b3Ugd2lsbCBzZWUgdGhhdCB0aGUgPHN0cm9uZz5QZXJmb3JtaW5nIFJvbGUgPC9zdHJvbmc+IGlzIG5vdyA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBSZXBsYWNlIFVJIERlc2lnbmVyPC9zcGFuPi4pIDxzdHJvbmc+UmVwbGFjZSA8L3N0cm9uZz4gd29ya3MgaW4gYSBzaW1pbGFyIHdheSBmb3IgPHN0cm9uZz50YXNrczwvc3Ryb25nPiwgPHN0cm9uZz5hcnRpZmFjdHMgPC9zdHJvbmc+LCA8c3Ryb25nPmd1aWRhbmNlIDwvc3Ryb25nPiBhbmQgPHN0cm9uZz5jYXRlZ29yaWVzIDwvc3Ryb25nPiAoZmVlbCBmcmVlIHRvIHRyeSBpdCBvdXQpLiA8L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfaW50cm8uaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19pbnRyby5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxYTc4Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19pbnRyby5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+PC9hPjxhPjwvYT48L2gyPgotPGgxPjxhPjwvYT48YT5UdXRvcmlhbDogQ3JlYXRlIFJldXNhYmxlIE1ldGhvZCBDb250ZW50IDwvYT48L2gxPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyB0dXRvcmlhbCBpcyB0byB1bmRlcnN0YW5kIHRoZSB2YXJpZXR5IG9mIHdheXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaW4gYSBiYXNlIHBsdWctaW4gY2FuIGJlIGV4dGVuZGVkIGFuZCBtb2RpZmllZCBieSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiA8L3A+Ci08cD5UaGUgkUNyZWF0ZSBDb3JlIE1ldGhvZCBDb250ZW50JyB0dXRvcmlhbCBzaG93cyBob3cgdG8gY3JlYXRlIG5ldyBjb250ZW50IGluIGEgcGx1Zy1pbi4gSW4gdGhpcyB0dXRvcmlhbCB3ZSB3aWxsIHNlZSBob3cgdG8gZXh0ZW5kIGV4aXN0aW5nIGNvbnRlbnQgaW4gYSBwbHVnLWluLiA8L3A+Ci08cD48c3Ryb25nPk5vdGU6IDwvc3Ryb25nPkluIHRoZSBmb2xsb3dpbmcgZXhlcmNpc2VzIHdlIGNyZWF0ZSBzZXBhcmF0ZSBDb250ZW50IFBhY2thZ2VzIHRvIGRlbW9uc3RyYXRlIGVhY2ggb2YgdGhlIHdheXMgdGhhdCBhIG1ldGhvZCBwbHVnLWluIGNhbiBtb2RpZnkgY29udGVudCBpbiBhbm90aGVyIHBsdWctaW4gKGkuZS4gZXh0ZW5kcywgcmVwbGFjZXMsIGFuZC9vciBjb250cmlidXRlcykuIFRoaXMgaXMgZm9yIGVhc3kgaWxsdXN0cmF0aW9uIG9mIHRoZSBlZmZlY3Qgb2YgYXBwbHlpbmcgZWFjaCB0eXBlIG9mIG1ldGhvZCBlbGVtZW50IHZhcmlhYmlsaXR5LiA8L3A+Ci1NYW5hZ2luZyBjb250ZW50IHZpYSB0aGUgTWV0aG9kIFBsdWctaW4gbWVjaGFuaXNtIGlzIGEga2V5IGFuZCB2ZXJ5IHBvd2VyZnVsIGZlYXR1cmUgb2YgRVBGIENvbXBvc2VyLiBUaGlzIHR1dG9yaWFsIGV4cGxvcmVzIHRoZSBlZmZlY3RzIG9mIHRoZSBkaWZmZXJlbnQgdmFyaWFiaWxpdHkgdHlwZXMgaW4gdGhlIGZvbGxvd2luZyBleGVyY2lzZXMuCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzEuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8xLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQ2MzMzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDE6IFB1Ymxpc2hpbmcgYSBwcmUtZGVmaW5lZCBjb25maWd1cmF0aW9uIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBwdWJsaXNoIGEgPHN0cm9uZz5Db25maWd1cmF0aW9uIDwvc3Ryb25nPnRoYXQgaXMgaW5jbHVkZWQgaW4gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3Nlci4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+IFNlbGVjdCB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgSW4gdGhlIDxzdHJvbmc+TGlicmFyeSBWaWV3PC9zdHJvbmc+LCBvcGVuIHRoZSBDb25maWd1cmF0aW9ucyBmb2xkZXIgYW5kIHNlbGVjdCB0aGUgY29uZmlndXJhdGlvbjogTXkgUlVQIGZvciBTbWFsbCBQcm9qZWN0cy4gVGhpcyBvcGVucyB0aGUgQ29uZmlndXJhdGlvbiBFZGl0b3IuIAotICAgIDxwPlRoZSBQbHVnIGluIGFuZCBQYWNrYWdlIFNlbGVjdGlvbiB0YWIgc2hvd3MgdGhlIHBsdWctaW5zIGFuZCBwYWNrYWdlcyB3aXRoaW4gZWFjaCBwbHVnLWluIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBDb25maWd1cmF0aW9uLiBUaGUgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIGluIHRoZSBDb25maWd1cmF0aW9uIGNhbiBiZSBhZGp1c3RlZCBieSBzZWxlY3RpbmcgYW5kIGRlc2VsZWN0aW5nIHRoZW0gaW4gdGhlIHRyZWUgZGlzcGxheS4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIFJldmlldyA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gPC9zdHJvbmc+PHN0cm9uZz5WaWV3cyA8L3N0cm9uZz46IChpLmUuIGhvdyB0aGUgcHVibGlzaGVkIHNpdGUgd2lsbCBiZSBsYWlkIG91dCkuIAotICAgIDxwPlNlbGVjdCB0aGUgPHN0cm9uZz5WaWV3cyA8L3N0cm9uZz4gdGFiIGluIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvci4gQSBWaWV3IGlzIGEgQ3VzdG9tIENhdGVnb3J5IHRoYXQgaXMgZGVzaWduZWQgZm9yIHB1YmxpY2F0aW9uLiBSZXF1aXJlZCBwYWNrYWdlcyBhbmQgY29udGVudCBlbGVtZW50cyBhcmUgYXNzaWduZWQgdG8gYSBDdXN0b20gQ2F0ZWdvcnkuIFRoZSBDdXN0b20gQ2F0ZWdvcnkgY2FuIHRoZW4gYmUgYWRkZWQgYXMgYSBWaWV3IHRvIGEgQ29uZmlndXJhdGlvbi4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIFNlbGVjdCA8c3Ryb25nPkRlZmF1bHQ8L3N0cm9uZz4gVmlldy4KLSAgICA8cD5PbmUgb2YgdGhlIHZpZXdzIGNhbiBiZSBzZWxlY3RlZCBhcyB0aGUgRGVmYXVsdCBWaWV3IGJ5IHNlbGVjdGluZyB0aGUgVmlldyBhbmQgY2xpY2tpbmcgdGhlIJFNYWtlIERlZmF1bHQnIGJ1dHRvbi4gV2hlbiB0aGUgY29uZmlndXJhdGlvbiBpcyBwdWJsaXNoZWQsIHRoZSBEZWZhdWx0IFZpZXcgd2lsbCBiZSBzZWxlY3RlZCB3aGVuIHRoZSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBpcyBvcGVuZWQgaW4gdGhlIEVQRiBDb21wb3NlciBCcm93c2VyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ2xvc2UgdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IDxzdHJvbmc+TXkgUlVQIGZvciBTbWFsbCBQcm9qZWN0czwvc3Ryb25nPiBpbiB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gYm94IGluIHRoZSBFUEYgQ29tcG9zZXIgdG9vbGJhci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNlbGVjdCA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gJmd0OyBQdWJsaXNoIDwvc3Ryb25nPiBmcm9tIHRoZSBtYWluIG1lbnUgYmFyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgU3RlcCB0aHJvdWdoIFB1Ymxpc2ggd2l6YXJkLCBhY2NlcHRpbmcgdGhlIGRlZmF1bHRzLCBhbmQgcHVibGlzaCB0aGUgY29uZmlndXJhdGlvbi4gSXQgd2lsbCB0YWtlIGEgZmV3IG1pbnV0ZXMgdG8gZ2VuZXJhdGUgdGhlIHdlYiBzaXRlLiBBc3N1bWluZyB0aGF0IHlvdSBoYXZlIHRoZSByaWdodCBqYXZhIGVudmlyb25tZW50LCB0aGUgRVBGIENvbXBvc2VyIEJyb3dzZXIgYXBwbGV0IHNob3VsZCBsYXVuY2ggYWxsb3dpbmcgeW91IHRvIHZpZXcgdGhlIHJlc3VsdGluZyBwdWJsaXNoZWQgd2ViIHNpdGUgKGFjY2VwdCB0aGUgc2VjdXJpdHkgd2FybmluZ3Mgd2hlbiB0aGUgYXBwbGV0IGZpcmVzIHVwKS4gPC9saT4KLTwvb2w+Ci08YmxvY2txdW90ZT4KLSAgPHA+PHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gVGhlIHB1Ymxpc2hlZCB3ZWIgc2l0ZSBoYXMgYSByaWNoZXIgb3JnYW5pemF0aW9uIGFuZCBsYXktb3V0IGFzIGRlZmluZWQgYnkgdGhlIENvbmZpZ3VyYXRpb24gVmlldywgYXMgY29tcGFyZWQgdG8gdGhlIG1vcmUgc2ltcGxlIHZpZXcgb2YgdGhlIGNvbmZpZ3VyYXRpb24gY29udGVudCBhdmFpbGFibGUgd2l0aGluIHRoZSBFUEYgQ29tcG9zZXIgPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXc8L3N0cm9uZz4uIDwvcD4KLTwvYmxvY2txdW90ZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMi5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhY2M4ZTM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMjogQ3JlYXRlIE5ldyBDdXN0b20gQ2F0ZWdvcnkgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIHVuZGVyc3RhbmQgYW5kIHVzZSA8c3Ryb25nPkN1c3RvbSBDYXRlZ29yaWVzIDwvc3Ryb25nPi4gPC9wPgotPHA+PHN0cm9uZz5DdXN0b20gQ2F0ZWdvcmllcyA8L3N0cm9uZz4gYWxsb3cgeW91IHRvIGNhdGVnb3JpemUgY29udGVudCBhY2NvcmRpbmcgdG8gYW55IHNjaGVtZSB5b3Ugd2FudC4gQ3VzdG9tIENhdGVnb3JpZXMgY2FuIHRoZW4gYmUgdXNlZCB0byBjb21wb3NlIHB1Ymxpc2hhYmxlIDxzdHJvbmc+Vmlld3MgPC9zdHJvbmc+IHByb3ZpZGluZyBhIG1lYW5zIHRvIG9yZ2FuaXplIG1ldGhvZCBjb250ZW50IHByaW9yIHRvIHB1Ymxpc2hpbmcuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBOYXZpZ2F0ZSB0byA8c3Ryb25nPk15IFBsdWctaW4gJmd0OyBNZXRob2QgQ29udGVudCAmZ3Q7IEN1c3RvbSBDYXRlZ29yaWVzPC9zdHJvbmc+LiBJZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSBjcmVhdGVkIHRoaXMgcGx1Z2luLCBjcmVhdGUgaXQgbm93LCBvciBnbyB0aHJvdWdoIHRoZSA8dT5DcmVhdGUgQ29yZSBNZXRob2QgQ29udGVudDwvdT4gdHV0b3JpYWwuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgY3VzdG9tIGNhdGVnb3J5IG5hbWVkLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jdXN0b21fY2F0ZWdvcnk8L3NwYW4+LiBSaWdodC1jbGljayBvbiB0aGUgPHN0cm9uZz5DdXN0b20gQ2F0ZWdvcmllczwvc3Ryb25nPiBmb2xkZXIsIGhpZ2hsaWdodCA8c3Ryb25nPk5ldywgPC9zdHJvbmc+IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Q3VzdG9tIENhdGVnb3J5IDwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIE9wZW4gdGhlIDxzdHJvbmc+QXNzaWduIDwvc3Ryb25nPiB0YWIuIElmIHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jb250ZW50X3BhY2thZzwvc3Bhbj5lLCBhZGQgdGhlIDxzdHJvbmc+cm9sZXMgPC9zdHJvbmc+LCA8c3Ryb25nPmFydGlmYWN0czwvc3Ryb25nPiwgPHN0cm9uZz50YXNrcywgPC9zdHJvbmc+IGFuZCA8c3Ryb25nPmd1aWRhbmNlIDwvc3Ryb25nPiBmcm9tIGl0IGludG8gdGhlIGN1c3RvbSBjYXRlZ29yeS4gSWYgeW91IGRvIG5vdCBoYXZlIHRoaXMgcGFja2FnZSwgYWRkIGNvbnRlbnQgZnJvbSBhbm90aGVyIGFyZWEgaW4gdGhlIGxpYnJhcnkuIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IFlvdSBjYW4gZG8gbXVsdGlwbGUgc2VsZWN0IHVzaW5nIHNoaWZ0IG9yIGNvbnRyb2wga2V5IC4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5ydXBfYW5hbHlzaXNfZGVzaWduX2Rpc2NpcGxpbmU8L3NwYW4+LiBZb3Ugd2lsbCBmaW5kIHRoaXMgdW5kZXIgPHN0cm9uZz5SVVAgJmd0OyBEaXNjaXBsaW5lcyAmZ3Q7IHJ1cF9kaXNjaXBsaW5lcy4gPC9zdHJvbmc+PC9wPgotICA8L2xpPgotICA8bGk+IE9wZW4gb25lIG9mIHRoZSBlbGVtZW50cyB5b3UgYXNzaWduZWQgdG8gdGhlIG5ldyBjdXN0b20gY2F0ZWdvcnkuIE9ic2VydmUgaG93IHRoZSBjdXN0b20gY2F0ZWdvcnkgaXMgbm93IHJlZmxlY3RlZCBpbiB0aGUgPHN0cm9uZz5DYXRlZ29yaWVzIDwvc3Ryb25nPiB0YWIuIDwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8zLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY0ZDEzOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8zLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAzOiBDcmVhdGUgYSBjdXN0b21pemVkIGNvbmZpZ3VyYXRpb24gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGNyZWF0ZSB5b3VyIG93biBjdXN0b21pemVkIGNvbmZpZ3VyYXRpb24uIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIDxzdHJvbmc+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IENvbmZpZ3VyYXRpb248L3N0cm9uZz4uIE9yLCB5b3UgY2FuIHJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb25zPC9zdHJvbmc+IGZvbGRlciBpbiB0aGUgTGlicmFyeSBWaWV3IGFuZCBzZWxlY3QgPHN0cm9uZz5OZXcgQ29uZmlndXJhdGlvbi4gPC9zdHJvbmc+VGhlIENvbmZpZ3VyYXRpb24gRWRpdG9yIGlzIGxhdW5jaGVkLjwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBOYW1lIHRoZSBjb25maWd1cmF0aW9uLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jb25maWd1cmF0aW9uPC9zcGFuPi48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+UGx1Zy1pbiBhbmQgUGFja2FnZSBTZWxlY3Rpb24gPC9zdHJvbmc+IHRhYi4gSW4gdGhlIGxpc3Qgb2YgUGx1Z2lucywgY2hlY2sgTXkgUGx1Z2luIHRoYXQgeW91IGNyZWF0ZWQgaW4gdGhlIDx1PkNyZWF0ZSBDb3JlIE1ldGhvZCBDb250ZW50PC91PiB0dXRvcmlhbC4gVGhpcyBwbHVnaW4gaGFzIFJVUCBhcyBhIGJhc2UgYW5kIHJlZmVyZW5jZXMgcGFydHMgb2YgdGhlIFJVUCBjb250ZW50LCBhbmQgYWxzbyBoYXMgZWxlbWVudHMgdGhhdCBleHRlbmQsIGNvbnRyaWJ1dGUgdG8sIGFuZCByZXBsYWNlIGJhc2UgUlVQIGNvbnRlbnQuIDxicj4KLSAgICAgIElmIHlvdSBkbyBub3QgaGF2ZSB0aGlzIHBsdWdpbiwgY29uc2lkZXIgY29tcGxldGluZyB0aGUgPHU+Q3JlYXRlIENvcmUgTWV0aG9kIENvbnRlbnQ8L3U+IHR1dG9yaWFsIGJlZm9yZSBjb250aW51aW5nIHdpdGggdGhpcyB0dXRvcmlhbC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFRoZSBkaXNwbGF5IHdpbGwgZ2l2ZSB5b3UgYSBzZXJpZXMgb2Ygd2FybmluZ3MgYW5kIHRoZSBMaWJyYXJ5IEVycm9yIExvZyB2aWV3IHdpbGwgYmUgZGlzcGxheWVkLiA8YnI+Ci0gICAgICBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGdpdmVzIHRoZXNlIHdhcm5pbmdzIHRvIGhlbHAgZW5zdXJlIHRoYXQgeW91IGNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gdGhhdCCRbWFrZXMgc2Vuc2UnLiBJZiB5b3UgcmVmZXJlbmNlIGFuIGVsZW1lbnQsIHlvdSB3aWxsIG9ubHkgYmUgYWJsZSB0byBzZWUgdGhlIGZ1bGwgZGV0YWlscyBmb3IgdGhhdCBlbGVtZW50IGluIGEgcHVibGlzaGVkIHdlYiBzaXRlIGlmIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIElmIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQgaXMgbm90IGluIHRoZSBjb25maWd1cmF0aW9uLCB0aGUgkW9mZmVuZGluZycgcGFja2FnZSBpcyBtYXJrZWQgYXMgYSB3YXJuaW5nIJYgeW91IG1heSBjaG9vc2Ugbm90IHRvIGluY2x1ZGUgdGhlIGZ1bGwgZGV0YWlscyBvZiB0aGUgcmVmZXJlbmNlZCBlbGVtZW50LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ2hlY2sgdGhlIDxzdHJvbmc+QWRkIE1pc3NpbmcgUmVmZXJlbmNlczwvc3Ryb25nPiBidXR0b24uIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGFuZCByZWN1cnNpdmVseSBhZGQgcGFja2FnZXMgY29udGFpbmluZyBhbnkgZWxlbWVudHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBpbiBhbHJlYWR5IHNlbGVjdGVkIHBhY2thZ2VzLiBFeHBsb3JlIHdoYXQgcGFja2FnZXMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBjb25maWd1cmF0aW9uLiBZb3Ugd2lsbCBwcm9iYWJseSBub3cgc2VlIGFsbCBvZiBSVVAgc2VsZWN0ZWQuIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgaW50ZXItY29ubmVjdGVkIG5hdHVyZSBvZiBSVVAuIFVuY2hlY2sgUlVQIHRvIHJlc3RvcmUgdGhlIHdhcm5pbmdzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gRHJpbGwgZG93biBpbnRvIHRoZSBjb250ZW50IHBhY2thZ2VzIGluIHRoZSBNeSBQbHVnaW4sIHBsdWdpbiBwYWNrYWdlICAgYnkgY2xpY2tpbmcgb24gdGhlIDxzdHJvbmc+Kzwvc3Ryb25nPiBzaWducy4gVW5jaGVjayB0aGU8c3Ryb25nPiBFeHRlbmRzIFRlc3QgPC9zdHJvbmc+YW5kIDxzdHJvbmc+UmVwbGFjZSBUZXN0IDwvc3Ryb25nPmNvbnRlbnQgcGFja2FnZXMuIFVuY2hlY2tpbmcgdGhlc2UgYXZvaWRzIGNvbmZsaWN0cyB0aGF0IG1heSBvY2N1ciBiZWNhdXNlIHRoZSBzYW1lIGJhc2UgZWxlbWVudCBpcyBhZmZlY3RlZCBieSB0aGUgcGx1Z2lucy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFRoZXJlIHNob3VsZCBiZSBhIDxzdHJvbmc+Kzwvc3Ryb25nPiBieSB0aGUgPHN0cm9uZz5Db250cmlidXRpb24gVGVzdDwvc3Ryb25nPiBwYWNrYWdlLiBDbGljayB0aGUgPHN0cm9uZz5NYWtlIENsb3N1cmUgYnkgRml4aW5nIEVycm9yczwvc3Ryb25nPiBidXR0b24uIFRoaXMgYXV0b21hdGljYWxseSBtYWtlcyB5b3VyIGNvbmZpZ3VyYXRpb24gY29tcGxldGUgYmFzZWQgb24gd2hhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBEcmlsbCBkb3duIGludG8gdGhlIFJVUCBwbHVnaW4sIGFuZCBzZWUgd2hhdCBwYWNrYWdlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuIFRoZXNlIHdpbGwgYmUgdGhlIHBhY2thZ2VzIHRoYXQgY29udGFpbiB0aGUgZWxlbWVudHMgdXNlZCBhcyBiYXNlIGVsZW1lbnRzIGluIHRoZSBDb25maWd1cmF0aW9uIFRlc3QgY29udGVudCBwYWNrYWdlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ2xpY2sgb24gdGhlIDxzdHJvbmc+Vmlld3M8L3N0cm9uZz4gdGFiLiAKLSAgICA8cD5BbnkgY3VzdG9tIGNhdGVnb3J5IGNhbiBiZSBhZGRlZCBhcyBhIHZpZXcgdG8gYSBjb25maWd1cmF0aW9uLiBZb3UgY2FuIGNyZWF0ZWQgYW55IG51bWJlciBvZiBjdXN0b20gY2F0ZWdvcmllcyBhbmQgdGhleSBhcmUgdmVyeSBmbGV4aWJsZSBpbiB0ZXJtcyBvZiB0aGUgY29udGVudCB0aGF0IHlvdSBjYW4gYWRkIHRvIGEgY3VzdG9tIGNhdGVnb3J5IGFuZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGNvbnRlbnQgYXBwZWFycy4gPC9wPgotICAgIDxwPkFkZCB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY3VzdG9tX2NhdGVnb3J5PC9zcGFuPiBjdXN0b20gY2F0ZWdvcnkgYXMgYSB2aWV3IGluIHRoZSBjb25maWd1cmF0aW9uLiA8L3A+Ci0gICAgPHA+RXhwZXJpbWVudCB3aXRoIGFkZGluZyBvdGhlciBjdXN0b20gY2F0ZWdvcmllcyBhcyB2aWV3cy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IE1ha2UgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY3VzdG9tX2NhdGVnb3J5PC9zcGFuPiB0aGUgZGVmYXVsdCB2aWV3IGJ5IHNlbGVjdGluZyB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY3VzdG9tX2NhdGVnb3J5PC9zcGFuPiB0YWIgYW5kIGNsaWNraW5nIHRoZSA8c3Ryb25nPk1ha2UgRGVmYXVsdDwvc3Ryb25nPiBidXR0b24uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTYXZlIHRoZSBjb25maWd1cmF0aW9uIGJ5IGNsb3NpbmcgdGhlIENvbmZpZ3VyYXRpb24gRWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2NvbmZpZ3VyYXRpb248L3NwYW4+IGluIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGlvbiBib3ggYXQgdGhlIHRvcCBvZiB0aGUgc2NyZWVuLiBZb3Ugd2lsbCBzZWUgdGhlIGl0ZW1zIGRpc3BsYXllZCBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IGNoYW5nZS4gPC9wPgotICA8L2xpPgotICA8bGk+IFN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZzwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gRXhwbG9yZSB0aGUgY29udGVudCBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBZb3Ugc2hvdWxkIHNlZSB0aGUgY29udGVudCB5b3UgY3JlYXRlZCBpbiB5b3VyIHBsdWdpbnMgYW5kIHNvbWUgUlVQIGNvbnRlbnQuIDwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF80Lmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdkOGJlMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF80Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSA0OiBQdWJsaXNoaW5nIGEgY3VzdG9tIGNvbmZpZ3VyYXRpb24gPC9hPjwvaDI+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IDxzdHJvbmc+Q29uZmlndXJhdGlvbiAmZ3Q7IFB1Ymxpc2ggPC9zdHJvbmc+IGZyb20gdGhlIG1haW4gbWVudSBiYXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgbXktY29uZmlndXJhdGlvbiBpbiB0aGUgbGlzdCBvZiBjb25maWd1cmF0aW9ucy4gPC9wPgotICA8L2xpPgotICA8bGk+IFN0ZXAgdGhyb3VnaCBQdWJsaXNoIHdpemFyZCwgYWNjZXB0aW5nIHRoZSBkZWZhdWx0cywgYW5kIHB1Ymxpc2ggdGhlIGNvbmZpZ3VyYXRpb24uIEl0IHdpbGwgdGFrZSBhIGZldyBtaW51dGVzIHRvIGdlbmVyYXRlIHRoZSB3ZWIgc2l0ZS4gQXNzdW1pbmcgdGhhdCB5b3UgaGF2ZSB0aGUgcmlnaHQgamF2YSBlbnZpcm9ubWVudCwgdGhlIEVQRiBDb21wb3NlciBCcm93c2VyIGFwcGxldCBzaG91bGQgbGF1bmNoIGFsbG93aW5nIHlvdSB0byB2aWV3IHRoZSByZXN1bHRpbmcgcHVibGlzaGVkIHdlYiBzaXRlIChhY2NlcHQgdGhlIHNlY3VyaXR5IHdhcm5pbmdzIHdoZW4gdGhlIGFwcGxldCBmaXJlcyB1cCkuIDwvbGk+Ci08L29sPgotPGJsb2NrcXVvdGU+Ci0gIDxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IFRoZSBwdWJsaXNoZWQgd2ViIHNpdGUgaGFzIGEgcmljaGVyIG9yZ2FuaXphdGlvbiBhbmQgbGF5LW91dCBhcyBkZWZpbmVkIGJ5IHRoZSBDb25maWd1cmF0aW9uIFZpZXcsIGFzIGNvbXBhcmVkIHRvIHRoZSBtb3JlIHNpbXBsZSB2aWV3IG9mIHRoZSBjb25maWd1cmF0aW9uIGNvbnRlbnQgYXZhaWxhYmxlIHdpdGhpbiB0aGUgRVBGIENvbXBvc2VyIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3IDwvc3Ryb25nPi4gPC9wPgotPC9ibG9ja3F1b3RlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9pbnRyby5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2ludHJvLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDIxZGI3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2ludHJvLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMT48YT5UdXRvcmlhbDogUHVibGlzaGluZyBhbmQgRXhwb3J0aW5nIDwvYT48L2gxPgotPHA+RVBGIENvbXBvc2VyIGlzIGVzc2VudGlhbGx5IGEgY29udGVudCBtYW5hZ2VtZW50IGFwcGxpY2F0aW9uLiBUaGUgdWx0aW1hdGUgb3V0cHV0IG9mIEVQRiBDb21wb3NlciBpcyBhIFdlYiBzaXRlIHdpdGggcHVibGlzaGVkIG1ldGhvZCBndWlkYW5jZSBhbmQgcHJvY2Vzc2VzIHRoYXQgY2FuIGJlIHZpZXdlZCBieSBhIHByb2plY3QgdGVhbS4gPC9wPgotPHA+RVBGIENvbXBvc2VyIG1ha2VzIGl0IGVhc3kgdG8gY29uZmlndXJlIGEgcHJvY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUgb3Igc2l6ZSBvZiBwcm9qZWN0IGFuZCB0byBwdWJsaXNoIHRoZSBndWlkYW5jZSB0byBhIFdlYiBzaXRlLiBBIE1ldGhvZCA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gPC9zdHJvbmc+IGlzIGEgc2VsZWN0aW9uIG9mIDxzdHJvbmc+Q29udGVudCBQYWNrYWdlcyA8L3N0cm9uZz4gYWNyb3NzIGRpZmZlcmVudCA8c3Ryb25nPk1ldGhvZCBQbHVnLWlucyA8L3N0cm9uZz4gY29udGFpbmluZyB0aGUgbWV0aG9kIGFuZCBwcm9jZXNzIGNvbnRlbnQgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBwdWJsaXNoZWQgd2ViIHNpdGUuIEF0IHB1Ymxpc2hpbmcgdGltZSwgdGhlIGNvbmZpZ3VyYXRpb24gaXMgY29tYmluZWQgd2l0aCBkaWZmZXJlbnQgTWV0aG9kIDxzdHJvbmc+Vmlld3MgPC9zdHJvbmc+IHdoaWNoIGRlZmluZSB0aGUgd2Vic2l0ZSdzIG5hdmlnYXRpb24gc3RydWN0dXJlcyBhbmQgY29udGVudCBvcmdhbml6YXRpb24uIDwvcD4KLTxwPlRoZSBFUEYgQ29tcG9zZXIgPHN0cm9uZz5Ccm93c2luZyBQZXJzcGVjdGl2ZSA8L3N0cm9uZz4gcmVuZGVycyB0aGUgTWV0aG9kIDxzdHJvbmc+Q29uZmlndXJhdGlvbiA8L3N0cm9uZz4gY29udGVudCBpbiBodG1sIGZvcm1hdCB3aXRoaW4gRVBGIENvbXBvc2VyLCBwcm92aWRpbmcgYSBuYXZpZ2FibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZC9wcm9jZXNzIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIHRoYXQgQ29uZmlndXJhdGlvbi4gPC9wPgotPHA+VGhpcyB0dXRvcmlhbCB1c2VzIGNvbnRlbnQgdGhhdCBpcyBjcmVhdGVkIGluIHRoZSCRQ3JlYXRlIENvcmUgTWV0aG9kIENvbnRlbnQnIGFuZCCRRXh0ZW5kaW5nIGJhc2UgbWV0aG9kIGNvbnRlbnQgdXNpbmcgVmFyaWFiaWxpdHknIHR1dG9yaWFscy4gPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8xLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiMmI4MWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8xLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAxOiBCcm93c2UgUHJvY2VzcyBDb250ZW50IHVzaW5nIEJyb3dzaW5nIFBlcnNwZWN0aXZlIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBnZXQgYSBiYXNpYyB1bmRlcnN0YW5kaW5nIG9mIHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIuIDwvcD4KLTxwPihOb3RlIHRoYXQgdGhpcyBpcyBhIHJlcGVhdCBvZiBleGVyY2lzZSAyIGluIHRoZSA8dT5Ccm93c2UgdGhlIExpYnJhcnk8L3U+IHR1dG9yaWFsLikgPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+TWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QnJvd3Npbmc8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgdGhlIDxzdHJvbmc+TXkgUlVQIGZvciBTbWFsbCBQcm9qZWN0czwvc3Ryb25nPiBjb25maWd1cmF0aW9uLiBJZiB5b3UgaGF2ZSBub3QgY3JlYXRlZCB0aGlzIGNvbmZpZ3VyYXRpb24sIHNlbGVjdCB0aGUgPHN0cm9uZz5SVVAgZm9yIFNtYWxsIFByb2plY3RzPC9zdHJvbmc+IGNvbmZpZ3VyYXRpb24uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBUbyB2aWV3IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuLCBjbGljayA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnMgJmd0OyBDbGFzc2ljIFJVUCAmZ3Q7IERpc2NpcGxpbmUgV29ya2Zsb3dzICZndDsgQW5hbHlzaXMgYW5kIERlc2lnbjwvc3Ryb25nPi4gQSBwcmV2aWV3IG9mIHRoZSBwdWJsaXNoZWQgV2ViIHBhZ2UgZm9yIHRoZSBzZWxlY3RlZCBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgZGlzcGxheWVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQSBDYXBhYmlsaXR5IFBhdHRlcm4gY29udGFpbnMgYSBsYXJnZSBhbW91bnQgb2YgaW5mb3JtYXRpb24gYW5kIGlzIGRpc3BsYXllZCBvdmVyIGZvdXIgdGFicyCWIDxzdHJvbmc+RGVzY3JpcHRpb24sIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IFVzYWdlLCA8L3N0cm9uZz5hbmQ8c3Ryb25nPiBUZWFtIEFsbG9jYXRpb248L3N0cm9uZz4uIEV4cGxvcmUgdGhlIGluZm9ybWF0aW9uIG9uIGVhY2ggdGFiLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5UbyB2aWV3IGEgRGVsaXZlcnkgUHJvY2VzcywgY2xpY2sgPHN0cm9uZz5Qcm9jZXNzZXMgJmd0OyBEZWxpdmVyeSBQcm9jZXNzZXMgJmd0OyBDbGFzc2ljIFJVUCBMaWZlY3ljbGU8L3N0cm9uZz4uIFRoZSBkaXNwbGF5IGZvciBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgc2ltaWxhciB0byBhIENhcGFiaWxpdHkgUGF0dGVybi4gPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzIuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8yLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTE4ZWZhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT5FeGVyY2lzZSAyOiBFeHBsb3JlIGEgUHJvY2VzcyB1c2luZyBBdXRob3JpbmcgcGVyc3BlY3RpdmUgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIHR1dG9yaWFsIGlzIHRvIGV4cGxvcmUgdGhlIGluZm9ybWF0aW9uIGFuZCBlZGl0b3JzIGZvciBwcm9jZXNzZXMuIEEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIHVzZWQgYXMgYW4gZXhhbXBsZSBidXQgdGhlIHNhbWUgYXBwbGllcyB0byBEZWxpdmVyeSBQcm9jZXNzZXMuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkluIHRoZSBMaWJyYXJ5IFZpZXcsIGNsaWNrIDxzdHJvbmc+UlVQICZndDsgUHJvY2Vzc2VzICZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJucyAmZ3Q7IENsYXNzaWMgUlVQICZndDsgRGlzY2lwbGluZSBXb3JrZmxvd3M8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkRvdWJsZSBjbGljayB0aGUgPHN0cm9uZz5BbmFseXNpcyBhbmQgRGVzaWduIENhcGFiaWxpdHkgUGF0dGVybjwvc3Ryb25nPiBhbmQgZXhhbWluZSB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5UaGUgPHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPiB0YWIgcHJvdmlkZXMgYSBudW1iZXIgb2Ygc2VjdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBmdWxseSBkZXNjcmliZSB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuLiAKLSAgICA8cD5BIENhcGFiaWxpdHkgUGF0dGVybiBvciBEZWxpdmVyeSBQcm9jZXNzIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGF0IGxlYXN0IG9uZSBjb25maWd1cmF0aW9uIGJ1dCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG1hbnkuIFRoZSBjb25maWd1cmF0aW9uIHNldHMgdGhlIHNjb3BlIGZvciBjb3JlIG1ldGhvZCBjb250ZW50IGFuZCBvdGhlciBwcm9jZXNzIGVsZW1lbnRzIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIGEgcHJvY2Vzcy4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIENsaWNrIHRoZSA8c3Ryb25nPldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZTwvc3Ryb25nPiB0YWIuIAotICAgIDxwPlRoaXMgc2hvd3MgdGhlIEFjdGl2aXRpZXMgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBhbmQgdGhlIChjb3JlIG1ldGhvZCBjb250ZW50KSB0YXNrcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiBlYWNoIEFjdGl2aXR5LiA8L3A+Ci0gICAgPHA+V2hlbiBhIHRhc2sgaXMgYWRkZWQgdG8gYSBwcm9jZXNzLCB0aGUgcm9sZXMgYW5kIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrIGFyZSBhbHNvIHB1bGxlZCBpbnRvIHRoZSBwcm9jZXNzLiA8L3A+Ci0gICAgPHA+RWFjaCB0YXNrLCByb2xlLCBhbmQgd29yayBwcm9kdWN0IHNob3duIGluIHRoZSBhY3Rpdml0eSBpcyBhY3R1YWxseSBhbiBpbnN0YW5jZSBvZiB0aGUgZWxlbWVudCBhcyBpdCBpcyB1c2VkIGF0IHRoZSBwYXJ0aWN1bGFyIHBvaW50IGluIHRoZSBwcm9jZXNzLiBTbyB3aGF0IHlvdSBzZWUgaW4gdGhlIHByb2Nlc3MgYXJlIGFjdHVhbGx5IFRhc2sgRGVzY3JpcHRvcnMsIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIENsaWNrIHRoZSA8c3Ryb25nPlRlYW0gQWxsb2NhdGlvbjwvc3Ryb25nPiB0YWIuIAotICAgIDxwPlRoaXMgc2hvd3MgdGhlIGFjdGl2aXRpZXMgaW4gdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBhbmQgdGhlIHJvbGVzIHRoYXQgYXJlIHRoZSBwZXJmb3JtZXJzIG9mIHRoZSB0YXNrcyBpbiB0aGUgYWN0aXZpdGllcy4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIENsaWNrIHRoZSA8c3Ryb25nPldvcmsgUHJvZHVjdCBVc2FnZTwvc3Ryb25nPiB0YWIuIAotICAgIDxwPlRoaXMgc2hvd3MgdGhlIGFjdGl2aXRpZXMgaW4gdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBhbmQgdGhlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgaW5wdXQgYW5kIG91dHB1dHMgb2YgdGhlIHRhc2tzIGluIHRoZSBhY3Rpdml0aWVzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ2xpY2sgb24gdGhlIDxzdHJvbmc+Q29uc29saWRhdGVkIFZpZXc8L3N0cm9uZz4gdGFiLiAKLSAgICA8cD5UaGlzIHNob3dzIHRoZSBmdWxsIHNldCBvZiBpbmZvcm1hdGlvbiBmb3IgZWFjaCBhY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuLiBJdCBzaG93cyB0aGUgdGFza3MsIHdvcmsgcHJvZHVjdHMgYW5kIHJvbGVzIHdpdGhpbiBlYWNoIGFjdGl2aXR5LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgUmlnaHQgY2xpY2sgYW55IDxzdHJvbmc+dGFzayA8L3N0cm9uZz4gaW4gdGhlIDxzdHJvbmc+V29yayBCcmVha2Rvd24gU3RydWN0dXJlIHZpZXcsIDwvc3Ryb25nPiBhbmQgY2xpY2sgb24gPHN0cm9uZz5TaG93IFByb3BlcnRpZXMgVmlldzwvc3Ryb25nPi4gCi0gICAgPHA+VGhpcyBkaXNwbGF5cyBhIG5ldyB2aWV3IHRoYXQgc2hvd3MgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFzayAodGFzayBkZXNjcmlwdG9yKSBhcyBpdCBpcyB1c2VkIGluIHRoZSBwcm9jZXNzIGFuZCBhbGxvd3MgeW91IHRvIGN1c3RvbWl6ZSB0aGUgdGFzayBhcyBpdCBpcyB1c2VkIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHByb2Nlc3MuIDwvcD4KLSAgICA8cD5UaGUgUHJvcGVydGllcyBWaWV3IGhhcyBhIG51bWJlciBvZiB0YWJzIHRoYXQgb3JnYW5pemUgdGhlIHRhc2sgZGVzY3JpcHRvciBpbmZvcm1hdGlvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgb24gdGhlIDxzdHJvbmc+RG9jdW1lbnRhdGlvbjwvc3Ryb25nPiB0YWIuIFRoaXMgYWxsb3dzIHlvdSB0byBlbnRlciBpbmZvcm1hdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIHRoaXMgVGFzayBEZXNjcmlwdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayBvbiB0aGUgPHN0cm9uZz5Sb2xlczwvc3Ryb25nPiB0YWIuIFRoaXMgYWxsb3dzIHlvdSB0byByZXBsYWNlLCByZW1vdmUgb3IgYWRkIHRvIHRoZSByb2xlcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcmUgbWV0aG9kIHRhc2sgZm9yIHRoaXMgc3BlY2lmaWMgaW5zdGFuY2Ugb2YgdGhlIHRhc2sgaW4gdGhlIHByb2Nlc3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIG9uIHRoZSA8c3Ryb25nPldvcmsgUHJvZHVjdHM8L3N0cm9uZz4gdGFiLiBUaGlzIGFsbG93cyB5b3UgdG8gcmVwbGFjZSwgcmVtb3ZlIG9yIGFkZCB0byB0aGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcmUgbWV0aG9kIHRhc2sgZm9yIHRoaXMgc3BlY2lmaWMgaW5zdGFuY2Ugb2YgdGhlIHRhc2sgaW4gdGhlIHByb2Nlc3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIG9uIHRoZSA8c3Ryb25nPlN0ZXBzPC9zdHJvbmc+IHRhYi4gVGhpcyBhbGxvd3MgeW91IHRvIGFkanVzdCB0aGUgdGFzayBzdGVwcyBhcyB0aGV5IGFyZSBhcHBsaWVkIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHByb2Nlc3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPldoZW4gYSByb2xlIGlzIHNlbGVjdGVkIGluIHRoZSBUZWFtIEFsbG9jYXRpb24gdmlldywgb3IgYSB3b3JrIHByb2R1Y3QgaXMgc2VsZWN0ZWQgaW4gdGhlIFdvcmsgUHJvZHVjdCBVc2FnZSB2aWV3LCB0aGUgUHJvcGVydGllcyBWaWV3IGFsbG93cyB5b3UgdG8gZWRpdCB0aGVzZSBlbGVtZW50cyBpbiB0aGUgY29udGV4dCBvZiB0aGUgcHJvY2Vzcy4gPC9wPgotICA8L2xpPgotICA8bGk+Q2xpY2sgb24gYW4gPHN0cm9uZz5BY3Rpdml0eTwvc3Ryb25nPiBpbiB0aGUgcHJvY2Vzcy4gPGJyPgotICAgIFRoZSBwcm9wZXJ0aWVzIHZpZXcgYWxsb3dzIHlvdSB0byBzZWUgcm9sbC11cHMgb2YgdGhlIHRhc2tzLCByb2xlcywgYW5kIHdvcmsgcHJvZHVjdHMgaW4gdGhlIGFjdGl2aXR5LiBSb2xsLXVwcyBjYW4gYWxzbyBiZSBkaXNwbGF5ZWQgaW4gdGhlIG1haW4gY29udGVudCB3aW5kb3cgYnkgc2VsZWN0aW5nIHRoZSA8c3Ryb25nPlJvbGwtVXA8L3N0cm9uZz4gb3B0aW9uIGluIHRoZSBjb250ZXh0IHNlbnNpdGl2ZSBtZW51LiBUaGUgUm9sbC1VcCB2aWV3IGNhbiBiZSB0dXJuZWQgb2ZmIGJ5IHNlbGVjdGluZywgPHN0cm9uZz5Sb2xsLURvd248L3N0cm9uZz4uIDwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8zLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0MzVhZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8zLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+RXhlcmNpc2UgMzogQ3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzcyA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gbGVhcm4gaG93IHRvIGNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MgdXNpbmcgY29yZSBtZXRob2QgY29udGVudCBkaXJlY3RseS4gPC9wPgotPHA+SW4gPHN0cm9uZz5Qcm9jZXNzIEF1dGhvcmluZyA8L3N0cm9uZz4gd2UgZG8gbm90IGRpcmVjdGx5IGluY2x1ZGUgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBjb3JlIG1ldGhvZCBlbGVtZW50cyBpbiB0aGUgV0JTIGJ1dCByYXRoZXIgY3JlYXRlIGxvY2FsIHJlZmVyZW5jZXMgdGVybWVkIDxzdHJvbmc+ZGVzY3JpcHRvcnMgPC9zdHJvbmc+IHRoYXQgcmVmZXIgYmFjayB0byB0aGUgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IGJ1dCBhbHNvIGNvbnRhaW4gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IGlzIG9ubHkgcmVsZXZhbnQgdG8gdGhlIGxvY2FsIHByb2Nlc3MuIDwvcD4KLTxwPkRlc2NyaXB0b3JzIGFsc28gcHJvdmlkZSBhIG1lY2hhbmlzbSB3aGVyZWJ5IHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBpbiBjb3JlIG1ldGhvZCBhdXRob3JpbmcgKGUuZy4gcm9sZXMgYXNzb2NpYXRlZCB3aXRoIGEgdGFzaywgaW5wdXQgYW5kIG91dHB1dCwgd29yayBwcm9kdWN0cywgZXRjLiksIGNhbiBiZSBkZWZpbmVkIG9yIGNoYW5nZWQgbG9jYWxseSB3aXRoaW4gdGhlIHByb2Nlc3MuIDwvcD4KLTxvbD4KLSAgPGxpPiAgICBDcmVhdGUgYSBuZXcgRGVsaXZlcnkgUHJvY2VzcyBpbiB0aGUgTXkgUGx1Z2luLCBwbHVnLWluIGNhbGxlZCwgTXkgUlVQLiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD5XaGVuIHlvdSBjcmVhdGUgYSBwcm9jZXNzIHlvdSBhcmUgYXNrZWQgdG8gaWRlbnRpZnkgdGhlIGRlZmF1bHQgQ29uZmlndXJhdGlvbiB0byBiZSB1c2VkIHdpdGggdGhlIHByb2Nlc3MuIFNlbGVjdCB0aGUgTXkgUlVQIGZvciBTbWFsbCBQcm9qZWN0cyBjb25maWd1cmF0aW9uLiBJZiB5b3UgbmF2ZSBub3QgY3JlYXRlZCB0aGlzIGNvbmZpZ3VyYXRpb24sIHNlbGVjdCBSVVAgZm9yIFNtYWxsIFByb2plY3RzLiA8L3A+Ci0gICAgPHA+QSBwcm9jZXNzIGhhcyBhIGhpZXJhcmNoeSBvZiBhY3Rpdml0aWVzIGFuZCBjYW4gaW5jbHVkZSB0aGUgc3BlY2lhbCB0eXBlcyBvZiBhY3Rpdml0eSCWIFBoYXNlcyBhbmQgSXRlcmF0aW9ucy4gVGhlc2Ugc3RydWN0dXJlcyBjYW4gYWxzbyBiZSBjcmVhdGVkIGluIENhcGFiaWxpdHkgUGF0dGVybnMuIEZpcnN0IG9mIGFsbCwgd2UnbGwgY3JlYXRlIHNvbWUgYWN0aXZpdGllcyBkaXJlY3RseSBhbmQgcmV1c2Ugc29tZSBjYXBhYmlsaXR5IHBhdHRlcm5zIGxhdGVyLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPiBUbyBjcmVhdGUgdGhlIEluY2VwdGlvbiBQaGFzZSwgaW4gdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSB2aWV3LCByaWdodCBjbGljayB0aGUgPHN0cm9uZz5NeSBSVVAgPC9zdHJvbmc+UHJvY2VzcywgYW5kIHRoZW4gc2VsZWN0LCA8c3Ryb25nPk5ldyBDaGlsZCAmZ3Q7IFBoYXNlIDwvc3Ryb25nPi4gQ2FsbCB0aGUgUGhhc2UsIDxzdHJvbmc+SW5jZXB0aW9uPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgCi0gICAgPHA+VG8gY3JlYXRlIHRoZSBSZXF1aXJlbWVudHMgRGlzY2lwbGluZSBpbiBJbmNlcHRpb24sIGluIHRoZSA8c3Ryb25nPldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSA8L3N0cm9uZz4gdmlldywgcmlnaHQgY2xpY2sgPHN0cm9uZz5JbmNlcHRpb24sIDwvc3Ryb25nPiBhbmQgc2VsZWN0IDxzdHJvbmc+TmV3IDwvc3Ryb25nPjxzdHJvbmc+Q2hpbGQgJmd0OyBBY3Rpdml0eSA8L3N0cm9uZz4uIENhbGwgdGhpcyA8c3Ryb25nPlJlcXVpcmVtZW50czwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+VG8gYWRkIFRhc2tzIHRvIHRoZSBSZXF1aXJlbWVudHMgYWN0aXZpdHksIGluIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gPC9zdHJvbmc+IHZpZXcsIG9wZW4gdGhlIFJlcXVpcmVtZW50cyBEaXNjaXBsaW5lIGFuZCB0aGVuIGRyYWcgYW5kIGRyb3AgdGhlIGZvbGxvd2luZyB0YXNrcyBvbnRvIHRoZSBSZXF1aXJlbWVudHMgQWN0aXZpdHkgeW91IGhhdmUganVzdCBjcmVhdGVkOiAgPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IERldmVsb3AgVmlzaW9uIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgRGV0YWlsIHRoZSBTb2Z0d2FyZSBSZXF1aXJlbWVudHMgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBGaW5kIEFjdG9ycyBhbmQgdXNlIENhc2VzIDwvcD4KLSAgICA8cD5XaGVuIHlvdSBpbmNsdWRlIHRoZXNlIHRhc2tzIGluIHlvdXIgcHJvY2VzcywgdGhlIGFzc29jaWF0ZWQgcm9sZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIGFsc28gaW5jbHVkZWQgaW4gdGhlIHByb2Nlc3MuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+IFlvdSBjYW4gcmV2aWV3IHRoZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBtZXRob2QgZWxlbWVudCBpbiB0aGUgPHN0cm9uZz5Qcm9wZXJ0aWVzIDwvc3Ryb25nPiB2aWV3LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ3VzdG9taXplIHRoZSBzdGVwcyBmcm9tIHRoZSBGaW5kIEFjdG9ycyBhbmQgVXNlIENhc2VzIHRhc2sgZm9yIHRoZSBJbmNlcHRpb24gcGhhc2UuIENsaWNrIG9uIHRoZSA8c3Ryb25nPkZpbmQgQWN0b3JzIGFuZCBVc2UgQ2FzZXM8L3N0cm9uZz4gdGFzayBkZXNjcmlwdG9yLCBhbmQgb3BlbiB0aGUgPHN0cm9uZz5Qcm9wZXJ0aWVzPC9zdHJvbmc+IHZpZXcuIENsaWNrIG9uIHRoZSA8c3Ryb25nPlN0ZXBzPC9zdHJvbmc+IHRhYi4gUmVtb3ZlIHRoZSBsYXN0IGZvdXIgc3RlcHMgYW5kIGNsb3NlIHRoZSBwcm9wZXJ0aWVzIHZpZXcuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QnJvd3Npbmc8L3N0cm9uZz4gcGVyc3BlY3RpdmUgYW5kIHNlbGVjdCA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IERlbGl2ZXJ5IFByb2Nlc3NlcyAmZ3Q7IE15IFJVUDwvc3Ryb25nPi4gVGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSB0YWIgaXMgZGlzcGxheWVkLiBDbGljayBvbiA8c3Ryb25nPkZpbmQgQWN0b3JzIGFuZCBVc2UgQ2FzZXM8L3N0cm9uZz4uIE9ubHkgdGhlIGZpcnN0IHRocmVlIHN0ZXBzIGZyb20gdGhlIGNvcmUgbWV0aG9kIHRhc2sgYXJlIGluY2x1ZGVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5NYWtlIG90aGVyIGNoYW5nZXMgdG8gdGhlIHRhc2tzIGluIHRoZSBkZWxpdmVyeSBwcm9jZXNzIHlvdSBoYXZlIGp1c3QgY3JlYXRlZCBhbmQgc2VlIGhvdyB0aGV5IGFyZSByZWZsZWN0ZWQgd2hlbiB5b3UgdmlldyB0aGUgcHJvY2VzcyBpbiB0aGUgQnJvd3NpbmcgcGVyc3BlY3RpdmUuPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzQuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF80Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzI2MGQyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDQ6IENyZWF0ZSBhIG5ldyBkZWxpdmVyeSBQcm9jZXNzIHVzaW5nIGNhcGFiaWxpdHkgcGF0dGVybnMuIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBsZWFybiBob3cgdG8gY3JlYXRlIGEgZGVsaXZlcnkgcHJvY2VzcyB1c2luZyA8c3Ryb25nPkNhcGFiaWxpdHkgUGF0dGVybnMgPC9zdHJvbmc+LiA8L3A+Ci08cD5BIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHByb2Nlc3MgkWZyYWdtZW50Jy4gSXQgcmVwcmVzZW50cyBhIHByb2Nlc3MgdGhhdCBjYW4gYmUgcmV1c2VkIG1hbnkgdGltZXMgaW4gdGhlIHNhbWUgcHJvY2VzcyBhbmQgLyBvciBpbiBkaWZmZXJlbnQgcHJvY2Vzc2VzLiBPcmdhbml6aW5nIGNvcmUgbWV0aG9kIGNvbnRlbnQgaW50byBjYXBhYmlsaXR5IHBhdHRlcm5zIGFuZCB0aGVuIHVzaW5nIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm5zIHRvIGNvbnN0cnVjdCBmdWxsIGxpZmUtY3ljbGUgZGVsaXZlcnkgcHJvY2Vzc2VzIGlzIGEga2V5IGZlYXR1cmUgb2YgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3Nlci4gPC9wPgotPHA+QSBjYXBhYmlsaXR5IHBhdHRlcm4gY2FuIGJlIGluY2x1ZGVkIGluIGFub3RoZXIgcHJvY2VzcyAoYW5vdGhlciBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgYSBkZWxpdmVyeSBwcm9jZXNzKSBpbiB0d28gd2F5czogPC9wPgotPGJsb2NrcXVvdGU+Ci0gIDxwPiYjMTQ5OyZuYnNwOyBDb3B5IJYgdGhpcyBjcmVhdGVzIGEgZnVsbCBjb3B5IG9mIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gaW4gdGhlIHRhcmdldCBwcm9jZXNzIGJ1dCBkb2VzIG5vdCByZXRhaW4gYW55IGxpbmtzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNhcGFiaWxpdHkgcGF0dGVybi4gVGhlIGNhcGFiaWxpdHkgcGF0dGVybiBjYW4gYmUgY3VzdG9taXplZCBpbiB0aGUgbmV3IHByb2Nlc3MuIEFueSBjaGFuZ2VzIHRoYXQgYXJlIHN1YnNlcXVlbnRseSBtYWRlIHRvIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gYXJlIG5vdCByZWZsZWN0ZWQgaW4gdGhlIHByb2Nlc3MgaW50byB3aGljaCBpdCB3YXMgY29waWVkLiA8L3A+Ci0gIDxwPiYjMTQ5OyZuYnNwOyBFeHRlbmRzIJYgdGhpcyBleHRlbmRzIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gaW50byB0aGUgcHJvY2Vzcy4gVGhlIHByb2Nlc3MgcmV0YWlucyBsaW5rcyB0byB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGFuZCBhbnkgc3Vic2VxdWVudCBjaGFuZ2VzIHRvIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gYXJlIHJlZmxlY3RlZCBpbiB0aGUgcHJvY2VzcyBpbnRvIHdoaWNoIGl0IGlzIGV4dGVuZGVkLiBUaGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSBjdXN0b21pemVkIGJ5IHN1cHByZXNzaW5nIHRhc2tzLCByb2xlcywgYW5kIHdvcmsgcHJvZHVjdHMuIE90aGVyIGNoYW5nZXMgY2Fubm90IGJlIG1hZGUuIDwvcD4KLTwvYmxvY2txdW90ZT4KLTxwPldlIHdpbGwgYWRkIHNvbWUgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0byB0aGUgRGVsaXZlcnkgUHJvY2VzcyB5b3UgY3JlYXRlZCBpbiBFeGVyY2lzZSAzLiA8L3A+Ci08cD5UbyBhZGQgYSBDYXBhYmlsaXR5IFBhdHRlcm4gdXNpbmcgQ29weTogPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byB0aGUgYXV0aG9yaW5nIHBlcnNwZWN0aXZlIGFuZCBvcGVuIHRoZSBNeSBSVVAgZGVsaXZlcnkgcHJvY2VzcyB5b3UgY3JlYXRlZCBpbiBFeGVyY2lzZSAzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gdGhlIENvbmZpZ3VyYXRpb25zIFZpZXcgY2xpY2sgPHN0cm9uZz5Qcm9jZXNzZXMgJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm5zICZndDsgQ2xhc3NpYyBSVVAgJmd0OyBEaXNjaXBsaW5lIFdvcmtmbG93cyAmZ3Q7IFByb2plY3QgTWFuYWdlbWVudC4gPC9zdHJvbmc+PC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IERyYWcgYW5kIGRyb3AgdGhlIDxzdHJvbmc+UHJvamVjdCBNYW5hZ2VtZW50IDwvc3Ryb25nPiBDYXBhYmlsaXR5IFBhdHRlcm4gb250byB0aGUgSW5jZXB0aW9uIHBoYXNlIGluIE15IFJVUCBkZWxpdmVyeSBwcm9jZXNzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IDxzdHJvbmc+Q29weSA8L3N0cm9uZz4gaW4gdGhlIHBvcC11cCBib3guIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgIEV4cGFuZCBvbmUgb2YgdGhlIGFjdGl2aXRpZXMgaW4gdGhlIFByb2plY3QgTWFuYWdlbWVudCBjYXBhYmlsaXR5IHBhdHRlcm4gdG8gdGhlIFRhc2sgbGV2ZWwuIE5vdGUgdGhhdCB0aGUgdGFzayBuYW1lIGlzIGRpc3BsYXllZCBpbiBibGFjay4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBpcyBhdmFpbGFibGUgZm9yIHlvdSB0byBlZGl0LiBBbnkgY2hhbmdlcyBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHdpbGwgbm90IGJlIHJlZmxlY3RlZCBpbiB5b3VyIHByb2Nlc3MuIFlvdSBjYW4gZWRpdCB0aGUgdGFzayBpbiB0aGUgUHJvcGVydGllcyB2aWV3LiA8L2xpPgotPC9vbD4KLTxwPlRvIGFkZCBhIENhcGFiaWxpdHkgUGF0dGVybiB1c2luZyBFeHRlbmRzOiAgPC9wPgotPG9sIHN0YXJ0PSI2Ij4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgUGhhc2UgaW4gdGhlIE15IFJVUCBkZWxpdmVyeSBwcm9jZXNzLiBSaWdodC1jbGljayBvbiB0aGUgZmlyc3Qgcm93IGFuZCBzZWxlY3QgPHN0cm9uZz5OZXcgQ2hpbGQgJmd0OyBQaGFzZSA8L3N0cm9uZz4uIENhbGwgdGhlIHBoYXNlLCBFbGFib3JhdGlvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyBJdGVyYXRpb24gaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlLiBSaWdodC1jbGljayBvbiB0aGUgRWxhYm9yYXRpb24gcGhhc2UgYW5kIHNlbGVjdCA8c3Ryb25nPk5ldyBDaGlsZCAmZ3Q7IEl0ZXJhdGlvbiA8L3N0cm9uZz4uIENhbGwgdGhlIGl0ZXJhdGlvbiwgRWxhYm9yYXRpb24gSXRlcmF0aW9uIDEuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiB0aGUgQ29uZmlndXJhdGlvbnMgVmlldywgY2xpY2sgPHN0cm9uZz5Qcm9jZXNzZXMgJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm5zICZndDsgQ2xhc3NpYyBSVVAgJmd0OyBEaXNjaXBsaW5lIFdvcmtmbG93cyAmZ3Q7IFByb2plY3QgTWFuYWdlbWVudC4gPC9zdHJvbmc+PC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IERyYWcgYW5kIGRyb3AgdGhlIDxzdHJvbmc+UHJvamVjdCBNYW5hZ2VtZW50IDwvc3Ryb25nPiBDYXBhYmlsaXR5IFBhdHRlcm4gb250byB0aGUgRWxhYm9yYXRpb24gSXRlcmF0aW9uIDEgaXRlcmF0aW9uIGluIE15IFJVUCBQcm9jZXNzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IDxzdHJvbmc+RXh0ZW5kIDwvc3Ryb25nPiBpbiB0aGUgcG9wLXVwIGJveC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEV4cGFuZCBvbmUgb2YgdGhlIGFjdGl2aXRpZXMgaW4gdGhlIFByb2plY3QgTWFuYWdlbWVudCBjYXBhYmlsaXR5IHBhdHRlcm4geW91IGhhdmUganVzdCBhZGRlZCB0byB0aGUgVGFzayBsZXZlbC4gTm90ZSB0aGF0IHRoZSB0YXNrIG5hbWUgaXMgZGlzcGxheWVkIGluIGdyZWVuIGl0YWxpY3MuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHRhc2sgaXMgaW4gYSBwYXJ0IG9mIGEgcHJvY2VzcyBkZWZpbmVkIGVsc2V3aGVyZSCWIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuLiBBbnkgY2hhbmdlcyB0byB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHdpbGwgYmUgcmVmbGVjdGVkIGluIHlvdXIgcHJvY2Vzcy4gQWxzbywgdGhlIFByb3BlcnRpZXMgdmlldyBzaG93cyB0aGUgdGFzayBkZXRhaWxzLCBidXQgdGhleSBjYW5ub3QgYmUgZWRpdGVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5SaWdodCBjbGljayBvbiBhIHRhc2sgaW4gdGhlIGV4dGVuZGVkIGNhcGFiaWxpdHkgcGF0dGVybiBhbmQgc2VsZWN0IDxzdHJvbmc+U3VwcHJlc3MgPC9zdHJvbmc+LiBUaGUgdGFzayBpcyBncmF5ZWQgb3V0LiBUaGUgdGFzayB3aWxsIG5vdCBhcHBlYXIgaW4gdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mIHRoZSBkZWxpdmVyeSBwcm9jZXNzLCBub3Igd2lsbCBpdCBiZSBpbmNsdWRlZCBpbiBhbiBleHBvcnQgb2YgdGhlIHByb2Nlc3MuPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzUuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF81Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGRiZjgyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT5FeGVyY2lzZSA1OiBDcmVhdGUgUHJvY2VzcyBEaWFncmFtcyA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXhwbG9yZSB0aGUgZGlhZ3JhbSBmZWF0dXJlcyBvZiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLiA8L3A+Ci08cD5FUEYgQ29tcG9zZXIgc3VwcG9ydHMgdGhyZWUgdHlwZXMgb2YgcHJvY2VzcyBkaWFncmFtLiBUaGVzZSBhcmU6IDwvcD4KLTxibG9ja3F1b3RlPgotICAgICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5BY3Rpdml0eSBEaWFncmFtPC9zdHJvbmc+IDwvcD4KLSAgICAgICAgPGJsb2NrcXVvdGU+Ci0gICAgICAgICAgPHA+ICAgICAgICAgICAgVGhpcyBzaG93cyB0aGUgKHN1YikgYWN0aXZpdGllcyBpbiBhIGhpZ2hlciBsZXZlbCBhY3Rpdml0eS4gSXQgc2hvd3MgdGhlIHNlcXVlbmNlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgYWN0aXZpdGllcy4gPC9wPgotICAgICAgICA8L2Jsb2NrcXVvdGU+Ci0gIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkFjdGl2aXR5IERldGFpbDwvc3Ryb25nPiCWIHNpbWlsYXIgdG8gUlVQIFdvcmtmbG93IERldGFpbCA8L3A+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiAgICAgIFRoaXMgc2hvd3MgdGhlIHRhc2tzIGluIGFuIGFjdGl2aXR5IHdpdGggdGhlaXIgcGVyZm9ybWluZyByb2xlcyBhbmQgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvc3Ryb25nPiA8L3A+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPlRoaXMgZGlhZ3JhbSBjYW4gYmUgdXNlZCB0byBzaG93IGhvdyBhIHdvcmsgcHJvZHVjdCBpcyBkZXBlbmRlbnQgb24gb3RoZXIgd29yayBwcm9kdWN0cy4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5UaGVzZSBkaWFncmFtcyBjYW4gdGhlbiBiZSBpbmNsdWRlZCBpbiB0aGUgcHVibGlzaGVkIHdlYiBzaXRlLiBUaGUgZGlhZ3JhbXMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkICh0byBhIGRlZ3JlZSkgYW5kIGluaGVyZW50bHkgc3luY2hyb25pemVkIHdpdGggdGhlIFdCUy4gQ2hhbmdlcyB0byB0aGUgcHJvY2VzcyBzdHJ1Y3R1cmUgdXNpbmcgdGhlIGRpYWdyYW0gZWRpdG9yIGFyZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiB0aGUgV0JTLCBhbmQgdmljZSB2ZXJzYS4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U2VsZWN0IHRoZSBNeSBSVVAgZGVsaXZlcnkgcHJvY2VzcyB0aGF0IHlvdSBoYXZlIGJlZW4gd29ya2luZyBvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SGlnaGxpZ2h0IHRoZSBkZWxpdmVyeSBwcm9jZXNzIGluIHRoZSBXQlMgYW5kIHRoZW4gcmlnaHQtY2xpY2suIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIDxzdHJvbmc+RGlhZ3JhbXMgJmd0OyBPcGVuIEFjdGl2aXR5IERpYWdyYW08L3N0cm9uZz4uIFRoZSBkaWFncmFtIGVkaXRvciBzaG91bGQgb3Blbiwgc2hvd2luZyB0aGUgdG9wIGxldmVsIGFjdGl2aXRpZXMgLSBwaGFzZXMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkV4cGFuZCB0aGUgPHN0cm9uZz5QYWxldHRlIDwvc3Ryb25nPiBvbiB0aGUgcmlnaHQgb2YgdGhlIGRpYWdyYW0gdmlldy4gQWxsIHRoZSBlbGVtZW50cyByZXF1aXJlZCB0byBjcmVhdGUgYW4gPHN0cm9uZz5BY3Rpdml0eSBEaWFncmFtIDwvc3Ryb25nPiBhcmUgYXZhaWxhYmxlIG9uIHRoZSBwYWxldHRlLiBBZGQgYSBuZXcgcGhhc2UgdG8gdGhlIGRpYWdyYW0gliBjYWxsIGl0LCBDb25zdHJ1Y3Rpb24uIENyZWF0ZSBsaW5rcyBiZXR3ZWVuIHRoZSBwaGFzZXMgdG8gc2hvdyB0aGUgc2VxdWVuY2Ugb2YgdGhlIHBoYXNlcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIGJhY2sgdG8gdGhlIDxzdHJvbmc+V29yayBCcmVha2Rvd24gU3RydWN0dXJlIDwvc3Ryb25nPnZpZXcgYW5kIG5vdGljZSB0aGUgbmV3IHBoYXNlLiBBbHNvIG5vdGljZSB0aGF0IHRoZSBsaW5rcyB5b3UgYWRkZWQgb24gdGhlIGRpYWdyYW0gYXJlIHJlZmxlY3RlZCBpbiB0aGUgUHJlZGVjZXNzb3JzIGNvbHVtbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+RG91YmxlIGNsaWNrIHRoZSA8c3Ryb25nPkluY2VwdGlvbiBQaGFzZTwvc3Ryb25nPiBpbiB0aGUgZGlhZ3JhbSCWIGl0IHdpbGwgZHJpbGwgZG93biB0byBzaG93IHRoZSBjb250YWluZWQgQWN0aXZpdGllcyAodGhlIHJ1bGUgaXMgdGhhdCB0aGUgZWRpdG9yIHdpbGwgZGlzcGxheSB0aGUgcHJvY2VzcyBlbGVtZW50cyBhdCB0aGUgbGV2ZWwgYmVsb3cgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgZWxlbWVudCkuIFN1Y2Nlc3NpdmUgZHJpbGwgZG93biB0aHJvdWdoIHRoZSBsZXZlbHMgaXMgcG9zc2libGUgYnkgY2xpY2tpbmcgb24gdGhlIGRpYWdyYW0gZWxlbWVudHMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsb3NlIHRoZSBkaWFncmFtcyB5b3UgaGF2ZSBvcGVuZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkluIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIHJpZ2h0LWNsaWNrIG9uIHRoZSBSZXF1aXJlbWVudHMgYWN0aXZpdHkgYW5kIHNlbGVjdCwgPHN0cm9uZz5EaWFncmFtcyAmZ3Q7IE9wZW4gQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0uIDwvc3Ryb25nPlRoZSBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gSXQgc2hvd3M6ICA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgVGhlIFJvbGVzIHRoYXQgcGVyZm9ybSB0YXNrcyBpbiB0aGUgYWN0aXZpdHkgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBUaGUgVGFza3MgdGhhdCB0aGUgcm9sZXMgcGVyZm9ybSA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFRoZSBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMgZm9yIGVhY2ggdGFzayA8L3A+Ci0gICAgPHA+WW91IGNhbiBjaGFuZ2UgdGhlIGxheW91dCBvZiB0aGUgZGlhZ3JhbSBidXQgeW91IGNhbm5vdCBhZGQgb3IgcmVtb3ZlIGFueSBlbGVtZW50cyBmcm9tIHRoZSBkaWFncmFtLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPkNsb3NlIHRoZSBkaWFncmFtcyB5b3UgaGF2ZSBvcGVuZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBJbiB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCByaWdodC1jbGljayBvbiB0aGUgUmVxdWlyZW1lbnRzIGFjdGl2aXR5IGFuZCBzZWxlY3QsIDxzdHJvbmc+RGlhZ3JhbXMgJmd0OyBPcGVuIFdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0uIDwvc3Ryb25nPlRoZSB3b3JrIHByb2R1Y3RzIHVzZWQgaW4gdGhlIGFjdGl2aXR5IGFyZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBkaWFncmFtLiAgPC9saT4KLTwvb2w+Ci08YmxvY2txdW90ZT4KLSAgPHA+QWRkIGEgKGRlcGVuZGVuY3kpIGxpbmsgYmV0d2VlbiB0d28gd29yayBwcm9kdWN0cy4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgd29yayBwcm9kdWN0IGF0IHRoZSBhcnJvdyBlbmQgb2YgdGhlIGxpbmsgaXMgZGVwZW5kZW50IG9uIHRoZSBvdGhlciB3b3JrIHByb2R1Y3QsIGkuZS4sIHRoZSBvdGhlciB3b3JrIHByb2R1Y3QgbmVlZHMgdG8gYmUgY3JlYXRlZCBpbiBvcmRlciB0byBjcmVhdGUgdGhlIHNlY29uZCB3b3JrIHByb2R1Y3QuCi0gIDwvcD4KLSAgPHA+QWRkIGEgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gdGhlIGRpYWdyYW0uIDwvcD4KLTwvYmxvY2txdW90ZT4KLTxvbCBzdGFydD0iMTIiPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIGJhY2sgdG8gdGhlIGRlbGl2ZXJ5IHByb2Nlc3MgYW5kIG9wZW4gdGhlIDxzdHJvbmc+V29yayBQcm9kdWN0IFVzYWdlPC9zdHJvbmc+IHZpZXcuIE5vdGljZSB0aGUgbmV3IHdvcmsgcHJvZHVjdCBpbiB0aGUgUmVxdWlyZW1lbnRzIGFjdGl2aXR5LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5PbmNlIHlvdSBoYXZlIGVkaXRlZCBhIGRpYWdyYW0sIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgaXQgb3IgZXhjbHVkZSBpdCB3aGVuIHB1Ymxpc2hpbmcgdGhlIHByb2Nlc3MgaW4gYSBjb25maWd1cmF0aW9uLiBJbiB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCByaWdodC1jbGljayBvbiB0aGUgPHN0cm9uZz5SZXF1aXJlbWVudHM8L3N0cm9uZz4gYWN0aXZpdHkgYW5kIHNlbGVjdCA8c3Ryb25nPkRpYWdyYW1zICZndDsgUHVibGlzaGluZyBPcHRpb25zLiA8L3N0cm9uZz5DaGVjayBvciB1bmNoZWNrIHRoZSB0eXBlcyBvZiBkaWFncmFtIGxpc3RlZC4gSWYgYSBkaWFncmFtIHR5cGUgaXMgbm90IGxpc3RlZCwgaXQgbWVhbnMgdGhhdCB5b3UgaGF2ZSBub3QgZWRpdGVkIHRoYXQgZGlhZ3JhbSB0eXBlIGZvciB0aGUgYWN0aXZpdHkgeWV0LiA8L3A+Ci0gIDwvbGk+Ci0gIDwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2ludHJvLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfaW50cm8uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZWEzNTEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfaW50cm8uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPjxhPjwvYT48YT5UdXRvcmlhbDogV29ya2luZyB3aXRoIFByb2Nlc3NlcyA8L2E+PC9oMT4KLTxwPjxzdHJvbmc+PGVtPlByb2Nlc3MgQXV0aG9yaW5nIDwvZW0+PC9zdHJvbmc+IGFsbG93cyBhIFByb2Nlc3MgRW5naW5lZXIgdG8gaW5jb3Jwb3JhdGUgPHN0cm9uZz48ZW0+TWV0aG9kIEVsZW1lbnRzIDwvZW0+PC9zdHJvbmc+IGludG8gcHJvY2VzcyBzdHJ1Y3R1cmVzLiBGb3IgZXhhbXBsZSwgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUgZm9ybWF0IGZhbWlsaWFyIHRvIFByb2plY3QgTWFuYWdlcnMuIFRoZSBwcm9jZXNzZXMgY2FuIGJlIGluY2x1ZGVkIGluIGEgY29uZmlndXJhdGlvbiB0byBiZSBwdWJsaXNoZWQgYXMgcGFydCBvZiB0aGUgcHVibGlzaGVkIHdlYiBzaXRlLiA8L3A+Ci08cD5JbiA8c3Ryb25nPjxlbT5NZXRob2QgPC9lbT4gQXV0aG9yaW5nIDwvc3Ryb25nPiB0aGUgUHJvY2VzcyBFbmdpbmVlciBkZWZpbmVzIHJvbGVzLCB0YXNrcywgd29yayBwcm9kdWN0cyBhbmQgZ3VpZGFuY2UgYW5kIGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGVzZSBlbGVtZW50cy4gPC9wPgotPHA+SW4gPHN0cm9uZz48ZW0+UHJvY2VzcyA8L2VtPiBBdXRob3JpbmcgPC9zdHJvbmc+IHRoZSBwcm9jZXNzIGVuZ2luZWVyIGRlZmluZXMgYWRkaXRpb25hbCBsaWZlY3ljbGUgZWxlbWVudHMgc3VjaCBhcyA8c3Ryb25nPkFjdGl2aXRpZXMgPC9zdHJvbmc+IChzdW1tYXJ5IHRhc2tzKSwgPHN0cm9uZz5QaGFzZXMgPC9zdHJvbmc+LCA8c3Ryb25nPkl0ZXJhdGlvbnMgPC9zdHJvbmc+IGFuZCA8c3Ryb25nPk1pbGVzdG9uZXMgPC9zdHJvbmc+LCB0aGF0IGNhbiB0aGVuIGJlIHVzZWQgdG8gY29tcG9zZSB0aGUgY29yZSBlbGVtZW50cyBpbnRvIHByb2Nlc3Nlcy4gQSBjb21wbGV0ZSBwcm9jZXNzIGNvcnJlc3BvbmRpbmcgdG8gYSBwcm9qZWN0IHBsYW4gb3IgYSBwaGFzZSB3ZSBjYWxsIGEgPHN0cm9uZz48ZW0+RGVsaXZlcnkgUHJvY2VzcyA8L2VtPjwvc3Ryb25nPjxlbT4oY29ycmVzcG9uZGluZyB0byBTbWFsbCBSVVAsIGZvciBleGFtcGxlKSA8L2VtPi4gV2UgY2FuIGFsc28gY3JlYXRlIHNtYWxsZXIgbW9yZSBncmFudWxhciBzZWN0aW9ucyBvZiBwcm9jZXNzLCB0ZXJtZWQgPHN0cm9uZz48ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJucyA8L2VtPjwvc3Ryb25nPiB0aGF0IGNhbiBiZSB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBtb3JlIGVhc2lseSBjb21wb3NlIGRlbGl2ZXJ5IHByb2Nlc3Nlcy4gPC9wPgotPHA+RWFjaCB0aW1lIGEgdGFzayBpcyBpbmNsdWRlZCBpbiBhIHByb2Nlc3MsIGEgY29weSBvZiB0aGF0IHRhc2sgaXMgY3JlYXRlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcHJvY2Vzcy4gV2UgY2FsbCB0aGlzIGEgVGFzayBEZXNjcmlwdG9yLiBUaGUgc2FtZSB0YXNrIGNhbiBiZSBpbmNsdWRlZCBhbnkgbnVtYmVyIG9mIHRpbWVzIGluIHRoZSBzYW1lIHByb2Nlc3MuIFRoaXMgYWxsb3dzLCBmb3IgZXhhbXBsZSwgdGhlIHNhbWUgUlVQIHRhc2sgdG8gYmUgaW5jbHVkZWQgaW4gZWFjaCBJdGVyYXRpb24gaW4gZWFjaCBSVVAgUGhhc2UuIEEgVGFzayBEZXNjcmlwdG9yIGNhbiBhbHNvIG1vZGlmeSB0aGUgYmFzZSB0YXNrIHdpdGhvdXQgYWN0dWFsbHkgY2hhbmdpbmcgdGhlIHRhc2suIEZvciBleGFtcGxlLCByb2xlcyBhbmQgd29yayBwcm9kdWN0cyBjYW4gYmUgYWRkZWQgb3Igc3VwcHJlc3NlZCwgc3RlcHMgY2FuIGJlIHN1cHByZXNzZWQgb3IgcmUtc2VxdWVuY2VkLiA8L3A+Ci08cD5vbGVzIGFuZCBXb3JrIFByb2R1Y3RzIGFyZSBhbHNvIGluY2x1ZGVkIGluIHByb2Nlc3NlcyBhcyBSb2xlIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuIFNvIHJvbGVzIGFuZCB3b3JrIHByb2R1Y3RzIGNhbiBhbHNvIGJlIGN1c3RvbWl6ZWQgdG8gZml0IHdpdGggdGhlIGNvbnRleHQgb2YgdGhlIHByb2Nlc3MgaW4gd2hpY2ggdGhleSBhcmUgdXNlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R3aXN0eSBzeW1ib2wxLkpQRyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHdpc3R5IHN5bWJvbDEuSlBHCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyM2IxMWIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHdpc3R5IHN5bWJvbDEuSlBHCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91bWFfaHVtcC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VtYV9odW1wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZmNDU0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VtYV9odW1wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdW5kZXJsaW5lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdW5kZXJsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI3NjhjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VuZGVybGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJpbnRlcmZhY2UuSlBHIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2VyaW50ZXJmYWNlLkpQRwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGIzNjhhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJpbnRlcmZhY2UuSlBHCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhMjgzOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlRvb2wgSW50ZXJmYWNlIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibGlicmFyeXZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ic2VhcmNoZm9ybWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Ub29sIEludGVyZmFjZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Ij48YSBuYW1lPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Ub29sIEludGVyZmFjZTwvaDE+Ci08ZGl2PjxwPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZAotRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZTo8L3A+Ci08cD48aW1nIHNyYz0idXNlcmludGVyZmFjZS5KUEciIGFsdD0iIiAvPjwvcD4KLTxkaXYgY2xhc3M9InAiPjx1bD48bGk+PHN0cm9uZz5Db25maWd1cmF0aW9uIGRyb3AtZG93biBzZWxlY3Rpb24gYm94PC9zdHJvbmc+IC0gVGhlIGNvbmZpZ3VyYXRpb24gZHJvcC1kb3duCi1zZWxlY3Rpb24gYm94IGFsbG93cyB5b3UgdG8gc2VsZWN0IGEgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Y29uZmlndXJhdGlvbjwvYT4gaW4gd2hpY2ggdG8gd29yay4gPC9saT4KLTxsaT48c3Ryb25nPk9wZW4gUGVyc3BlY3RpdmUgYnV0dG9uPC9zdHJvbmc+IC0gQ2xpY2sgdGhlIE9wZW4gUGVyc3BlY3RpdmUgYnV0dG9uCi10byBzZWxlY3QgYSA8YSBocmVmPSJwZXJzcGVjdGl2ZXMuaHRtbCNwZXJzcGVjdGl2ZXMiPnBlcnNwZWN0aXZlPC9hPi4KLVRoZXJlIGFyZSB0d28gcGVyc3BlY3RpdmVzIHRvIHNlbGVjdCBmcm9tOiBUaGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+IGFuZCB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPi4gPC9saT4KLTxsaT48c3Ryb25nPkxpYnJhcnkgVmlldzwvc3Ryb25nPiAtIFRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5Ci1WaWV3PC9hPiBkaXNwbGF5cyB0aGUgTWV0aG9kIFBsdWctaW5zIGFuZCBDb25maWd1cmF0aW9ucyBjb250YWluZWQgaW4gYQotTWV0aG9kIExpYnJhcnkuPC9saT4KLTxsaT48c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldzwvc3Ryb25nPiAtIFRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+IHNob3dzIHRoZSBjb250ZW50IGVsZW1lbnRzIGluIGEgbGlicmFyeQotZmlsdGVyZWQgYnkgYSBjb25maWd1cmF0aW9uLjwvbGk+Ci08bGk+PHN0cm9uZz5Db250ZW50IEVkaXRvcnMgYW5kIFByZXZpZXc8L3N0cm9uZz4gLSBXaGVuIHlvdSBhcmUgd29ya2luZyBpbiB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nCi1QZXJzcGVjdGl2ZTwvYT4sIHRoZSB3aW5kb3cgb24gdGhlIHJpZ2h0IHNpZGUgb2YgeW91ciBzY3JlZW4gY29udGFpbnMgY29udGVudAotZWRpdG9ycywgd2hpY2ggYWxsb3cgeW91IHRvIGNyZWF0ZSBvciBtb2RpZnkgZWxlbWVudCB0eXBlcy4gV2hlbiB0aGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcKLVBlcnNwZWN0aXZlPC9hPiBpcyBvcGVuLCB0aGUgd2luZG93IG9uIHRoZSByaWdodCBjb250YWlucyBhIHByZXZpZXcgb2YKLXlvdXIgY29udGVudCBhcyBpdCB3aWxsIGFwcGVhciBpbiBhIHB1Ymxpc2hlZCBXZWIgc2l0ZS48L2xpPgotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPG9sPgotPGxpIGNsYXNzPSJvbGNoaWxkbGluayI+PGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0ib2xjaGlsZGxpbmsiPjxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJvbGNoaWxkbGluayI+PGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0ib2xjaGlsZGxpbmsiPjxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwiPkxpYnJhcnkgVmlldzwvYT48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9Im9sY2hpbGRsaW5rIj48YSBocmVmPSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIj5Ccm93c2UgYW5kIFByZXZpZXcgTWV0aG9kIENvbnRlbnQ8L2E+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJvbGNoaWxkbGluayI+PGEgaHJlZj0ic2VhcmNoZm9ybWV0aG9kY29udGVudC5odG1sIj5TZWFyY2ggZm9yIE1ldGhvZCBDb250ZW50PC9hPjxiciAvPgotPC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2Vycm9sZXNhbmRyb2xlc3BlY2lmaWN0YXNrcy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2Vycm9sZXNhbmRyb2xlc3BlY2lmaWN0YXNrcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZGYxNjQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcnJvbGVzYW5kcm9sZXNwZWNpZmljdGFza3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0b3BpYyIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJVc2VyIFJvbGVzIGFuZCBSb2xlIFNwZWNpZmljIFRhc2tzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InVzZXJyb2xlc2FuZHJvbGVzcGVjaWZpY3Rhc2tzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlVzZXIgUm9sZXMgYW5kIFJvbGUgU3BlY2lmaWMgVGFza3M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InVzZXJyb2xlc2FuZHJvbGVzcGVjaWZpY3Rhc2tzIj48YSBuYW1lPSJ1c2Vycm9sZXNhbmRyb2xlc3BlY2lmaWN0YXNrcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlVzZXIgUm9sZXMgYW5kIFJvbGUgU3BlY2lmaWMgVGFza3M8L2gxPgotPGRpdj48cD5UaGVyZSBhcmUgZm91ciBwcmltYXJ5IHJvbGVzIHBsYXllZCBieSB0aGUgdXNlcnMgb2YgdGhpcyB0b29sOjwvcD4KLTx1bD48bGk+TWV0aG9kIEF1dGhvcjwvbGk+Ci08bGk+UHJvY2VzcyBBdXRob3I8L2xpPgotPGxpPlByb2Nlc3MgQ29uZmlndXJhdG9yPC9saT4KLTxsaT5QcmFjdGl0aW9uZXI8L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9InAiPjxzdHJvbmc+TWV0aG9kIEF1dGhvcjwvc3Ryb25nPiAtIFRoZSBNZXRob2QgQXV0aG9yIHVzZXMgdGhlIHRvb2wgb24gYSByZWd1bGFyIGJhc2lzCi10byBwcm92aWRlIHN0YW5kYXJkIHByb2Nlc3NlcyBmb3IgdXNlIGluIGFuIG9yZ2FuaXphdGlvbi4gVGhlIE1ldGhvZCBBdXRob3IKLXVzZXMgdGhlIGZ1bGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgdG9vbCB0bzo8dWw+PGxpPkNyZWF0ZSBwbHVnLWlucy48L2xpPgotPGxpPkNyZWF0ZSBuZXcgbWV0aG9kIGVsZW1lbnRzLjwvbGk+Ci08bGk+RXh0ZW5kIGV4aXN0aW5nIG1ldGhvZCBlbGVtZW50cy48L2xpPgotPGxpPkNyZWF0ZSByZXVzYWJsZSBjYXBhYmlsaXR5IHBhdHRlcm5zIGJ5IHJldXNpbmcgbWV0aG9kIGVsZW1lbnRzLjwvbGk+Ci08bGk+Q3JlYXRlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBieSByZXVzaW5nIGNhcGFiaWxpdHkgcGF0dGVybnMgYW5kIG1ldGhvZCBlbGVtZW50cy48L2xpPgotPGxpPkNyZWF0ZSBjdXN0b20gY2F0ZWdvcmllcyBmb3IgdXNlIGFzIHZpZXdzIGluIGEgY29uZmlndXJhdGlvbi48L2xpPgotPGxpPkNyZWF0ZSBhbmQgbW9kaWZ5IGNvbmZpZ3VyYXRpb25zLjwvbGk+Ci08bGk+UHVibGlzaCBjb25maWd1cmF0aW9ucyBvciBwcm9jZXNzZXMuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPjxzdHJvbmc+UHJvY2VzcyBBdXRob3I8L3N0cm9uZz4gLSBUaGUgUHJvY2VzcyBBdXRob3IncyBnb2FsIGlzIHRvIHByb2R1Y2UgYSBkZWxpdmVyeQotcHJvY2VzcyBmb3IgdGhlaXIgcHJvamVjdChzKSBieSByZXVzaW5nIG1ldGhvZCBlbGVtZW50cy4gVGhlIFByb2Nlc3MgQXV0aG9yCi11c2VzIHRoZSB0b29sIG9jY2FzaW9uYWxseSwgYXMgcHJvamVjdCBuZWVkcyBkaWN0YXRlLCB0eXBpY2FsbHkgc3VwcG9ydGluZwotb25lIG9yLCBtb3JlIGxpa2VseSwgc2V2ZXJhbCBwcm9qZWN0cyBieSBzcGVjaWZ5aW5nIHRoZSBwcm9jZXNzZXMgdG8gYmUgZm9sbG93ZWQuCi1UaGUgUHJvY2VzcyBBdXRob3IgdXNlcyB0aGUgcHJvY2VzcyBhdXRob3JpbmcgYW5kIGNvbmZpZ3VyYXRpb24gcHVibGlzaGluZwotZnVuY3Rpb25hbGl0eSBvZiB0aGlzIHRvb2wgdG86PHVsPjxsaT5DcmVhdGUgcGx1Zy1pbnMuPC9saT4KLTxsaT5DcmVhdGUgcmV1c2FibGUgY2FwYWJpbGl0eSBwYXR0ZXJucyBieSByZXVzaW5nIG1ldGhvZCBlbGVtZW50cy48L2xpPgotPGxpPkNyZWF0ZSBkZWxpdmVyeSBwcm9jZXNzZXMgYnkgcmV1c2luZyBjYXBhYmlsaXR5IHBhdHRlcm5zIGFuZCBtZXRob2QgZWxlbWVudHMuPC9saT4KLTxsaT5DcmVhdGUgY3VzdG9tIGNhdGVnb3JpZXMgZm9yIHVzZSBhcyB2aWV3cyBpbiBhIGNvbmZpZ3VyYXRpb24uIDwvbGk+Ci08bGk+Q3JlYXRlIGFuZCBtb2RpZnkgY29uZmlndXJhdGlvbnMuPC9saT4KLTxsaT5QdWJsaXNoIGNvbmZpZ3VyYXRpb25zIG9yIHByb2Nlc3Nlcy48L2xpPgotPC91bD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5Qcm9jZXNzIENvbmZpZ3VyYXRvcjwvc3Ryb25nPiAtIFRoZSBQcm9jZXNzIENvbmZpZ3VyYXRvcidzIGdvYWwgaXMgdG8gcHJvZHVjZQotYSBkZWxpdmVyeSBwcm9jZXNzIGZvciB0aGVpciBwcm9qZWN0KHMpIGJ5IHJhcGlkbHkgbGV2ZXJhZ2luZyByZWFkeS1tYWRlIHBsdWctaW5zLgotVGhlIFByb2Nlc3MgQ29uZmlndXJhdG9yIHVzZXMgdGhpcyB0b29sIG9jY2FzaW9uYWwsIGFzIHByb2plY3QgbmVlZHMgZGljdGF0ZSwKLXR5cGljYWxseSBzdXBwb3J0aW5nIG9uZSBvciBzZXZlcmFsIHByb2plY3RzIGJ5IHNwZWNpZnlpbmcgdGhlIHByb2Nlc3MgZm9yCi10aGUgcHJvamVjdHMuIFRoZSBQcm9jZXNzIENvbmZpZ3VyYXRvciB1c2VzIHRoZSBjb25maWd1cmF0aW9uCi1wdWJsaXNoaW5nIGZ1bmN0aW9uYWxpdHkgaW4gdGhpcyB0b29sIHRvOjx1bD48bGk+Q3JlYXRlIGFuZCBtb2RpZnkgY29uZmlndXJhdGlvbnMuPC9saT4KLTxsaT5QdWJsaXNoIGNvbmZpZ3VyYXRpb25zIG9yIHByb2Nlc3Nlcy48L2xpPgotPC91bD4KLTwvZGl2PgotPHA+PHN0cm9uZz5QcmFjdGl0aW9uZXI8L3N0cm9uZz4gLSBBIFByYWN0aXRpb25lcidzIGdvYWwgaXMgdG8gY29ycmVjdGx5IHVzZSB0aGUgb3JnYW5pemF0aW9uJ3MKLXByb2Nlc3NlcyBhbmQgYmVzdCBwcmFjdGljZXMgZWZmZWN0aXZlbHkuIEEgUHJhY3RpdGlvbmVyIHVzZXMgYSBwdWJsaXNoZWQKLWNvbmZpZ3VyYXRpb24gb24gYSByZWd1bGFyIGJhc2lzIGRyaXZlbiBieSB0aGUgd29yayBiZWluZyBwZXJmb3JtZWQgdG8gdmlldwotcHJvY2Vzc2VzIGFuZCBtZXRob2RzLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHkuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjRhYTliNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ZhcmlhYmlsaXR5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbCN2YXJpYWJpbGl0eWFzc29jaWF0aW9ucyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY29udHJpYnV0ZXMuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icmVwbGFjZS5odG1sI3JlcGxhY2VzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJleHRlbmRzLmh0bWwjZXh0ZW5kcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ2YXJpYWJpbGl0eSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5WYXJpYWJpbGl0eTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idmFyaWFiaWxpdHkiPjxhIG5hbWU9InZhcmlhYmlsaXR5Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VmFyaWFiaWxpdHk8L2gxPgotPGRpdj48cD5WYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2UKLW9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nCi10aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcKLXRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC48L3A+Ci08cD5WYXJpYWJpbGl0eSBhbGxvd3MgeW91IHRvIGZhY3RvciB5b3VyIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gaW50ZXJyZWxhdGVkCi11bml0cyBhbmQgdG8gYXJjaGl0ZWN0IG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gbGF5ZXJzIHRoYXQgZXh0ZW5kCi1lYWNoIG90aGVyIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gVmFyaWFiaWxpdHkgYWxzbyBhbGxvd3MgeW91IHRvIGV4dGVuZCBhbmQKLXRhaWxvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHlvdSBkbyBub3Qgb3duIGFuZCBjYW5ub3QgZGlyZWN0bHkgbW9kaWZ5LAotYW5kIHRvIGVhc2lseSB1cGdyYWRlIHRvIG5ld2VyIHZlcnNpb25zIGJ5IHNpbXBseSByZWFwcGx5aW5nIHlvdXIgcGVyc29uYWwKLWNoYW5nZXMgdG8gdGhlIHVwZ3JhZGVzLjwvcD4KLTxwPlRoZSB1c2Ugb2YgdmFyaWFiaWxpdHkgYWZmZWN0cyB0d28gY2hhcmFjdGVyaXN0aWNzIG9mIGEgbWV0aG9kIGVsZW1lbnQ6Ci1pdHMgYXR0cmlidXRlcyBhbmQgaXRzIHJlbGF0aW9uc2hpcHMgd2l0aCBvdGhlciBjb250ZW50IGVsZW1lbnRzLiBJZiBhbiBlbGVtZW50Ci1hbGxvd3MgdmFyaWFiaWxpdHksIHRoZSBzcGVjaWZpY2F0aW9uIGlzIHNob3duIGF0IHRoZSBib3R0b20gb2YgdGhlIGVsZW1lbnQncwotZGVzY3JpcHRpb24gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJwIj5Gb3IgdGhlIHB1cnBvc2VzIG9mIHZhcmlhYmlsaXR5LCB0aGVyZSBhcmUgdGhyZWUgZ3JvdXBzIG9mIGluZm9ybWF0aW9uCi1mb3IgYW55IGVsZW1lbnQgdG8gYmUgY29uc2lkZXJlZDo8dWw+PGxpPjxzdHJvbmc+QXR0cmlidXRlczwvc3Ryb25nPiAtIHBpZWNlcyBvZiBkYXRhIGFib3V0IGFuIGVsZW1lbnQgc3VjaCBhcyBNYWluIERlc2NyaXB0aW9uLjwvbGk+Ci08bGk+PHN0cm9uZz5JbmNvbWluZyBBc3NvY2lhdGlvbnM8L3N0cm9uZz4gLSBhc3NvY2lhdGlvbnMgdG8gb3RoZXIgZWxlbWVudHMgd2hlcmUgdGhlCi1hc3NvY2lhdGlvbiByZWZlcmVuY2UgaXMgaGVsZCBpbiB0aGUgb3RoZXIgZWxlbWVudC4gSW4gb3RoZXIgd29yZHMsIHRoZSBvdGhlcgotZWxlbWVudCBoYXMgcmVmZXJlbmNlcyB0byB0aGUgc3ViamVjdCBlbGVtZW50LjwvbGk+Ci08bGk+PHN0cm9uZz5PdXRnb2luZyBBc3NvY2lhdGlvbnM8L3N0cm9uZz4gLSBhc3NvY2lhdGlvbnMgdG8gb3RoZXIgZWxlbWVudHMgd2hlcmUgdGhlCi1hc3NvY2lhdGlvbiByZWZlcmVuY2UgaXMgaGVsZCBpbiB0aGUgc3ViamVjdCBlbGVtZW50LiBJbiBvdGhlciB3b3JkcywgdGhlCi1zdWJqZWN0IGVsZW1lbnQgaGFzIHJlZmVyZW5jZXMgdG8gdGhlIG90aGVyIGVsZW1lbnQuPC9saT4KLTwvdWw+Ci1JbiBhZGRpdGlvbiwgYXNzb2NpYXRpb25zIGNhbiBiZSBvbmUtdG8tb25lIG9yIG9uZS10by1tYW55LiBTZWUgPGEgaHJlZj0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbCN2YXJpYWJpbGl0eWFzc29jaWF0aW9ucyI+VmFyaWFiaWxpdHkgQXNzb2NpYXRpb25zPC9hPiBmb3IKLWEgZnVsbCBsaXN0IG9mIHRoZSBhc3NvY2lhdGlvbnMgZm9yIGVhY2ggdHlwZSBvZiBlbGVtZW50LjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlZhcmlhYmlsaXR5IFR5cGU8L2g0PjxkaXYgY2xhc3M9InAiPlZhcmlhYmlsaXR5Ci10eXBlIGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgb25lIGVsZW1lbnQgYWZmZWN0cyBhbm90aGVyIGVsZW1lbnQgdXNpbmcgdmFyaWFiaWxpdHkuCi1UaGUgdmFyaWFiaWxpdHkgdHlwZXMgYXJlOjx1bD48bGk+PHN0cm9uZz5Ob3QgQXBwbGljYWJsZTwvc3Ryb25nPiAtIFRoZSBlbGVtZW50IGlzIGEgYmFzZSBlbGVtZW50IGFuZCBkb2VzIG5vdCBhZmZlY3QKLWFub3RoZXIgZWxlbWVudCB0aHJvdWdoIHZhcmlhYmlsaXR5LiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFuIGVsZW1lbnQncwotdmFyaWFiaWxpdHkgdHlwZS48L2xpPgotPC91bD4KLTx1bD48bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+Q29udHJpYnV0ZXM8L3NwYW4+PC9zdHJvbmc+IC0KLUEgY29udHJpYnV0aW5nIGVsZW1lbnQgYWRkcyB0byB0aGUgYmFzZSBlbGVtZW50LiBDb250cmlidXRlcyBwcm92aWRlcyBhIHdheQotZm9yIGVsZW1lbnRzIHRvIGNvbnRyaWJ1dGUgdGhlaXIgcHJvcGVydGllcyBpbnRvIHRoZWlyIGJhc2UgZWxlbWVudCB3aXRob3V0Ci1kaXJlY3RseSBjaGFuZ2luZyBhbnkgb2YgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMsIHN1Y2ggYXMgaW4gYW4gYWRkaXRpdmUgZmFzaGlvbi4KLVRoZSBlZmZlY3QsIGFmdGVyIGNvbnRyaWJ1dGlvbiwgaXMgdGhhdCB0aGUgYmFzZSBlbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZAotd2l0aCBhbiBlbGVtZW50IHRoYXQgY29tYmluZXMgdGhlIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9ucyBvZiB0aGUgY29udHJpYnV0aW5nCi1lbGVtZW50IHdpdGggdGhlIGJhc2UgZWxlbWVudC48L2xpPgotPC91bD4KLTx1bD48bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+UmVwbGFjZXM8L3NwYW4+PC9zdHJvbmc+IC0KLUEgcmVwbGFjaW5nIGVsZW1lbnQgcmVwbGFjZXMgcGFydHMgb2YgdGhlIGJhc2UgZWxlbWVudC4gUmVwbGFjZXMgcHJvdmlkZXMKLWEgd2F5IGZvciBhbiBlbGVtZW50IHRvIHJlcGxhY2UgYSBiYXNlIGVsZW1lbnQgd2l0aG91dCBkaXJlY3RseSBjaGFuZ2luZyBhbnkKLW9mIHRoZSBiYXNlIGVsZW1lbnQncyBleGlzdGluZyBwcm9wZXJ0aWVzLiBUaGlzIGlzLCBpbiBtb3N0IGNhc2VzLCB1c2VkIGZvcgotbWV0aG9kIHBsdWctaW5zIHRoYXQgYWltIHRvIHJlcGxhY2Ugc3BlY2lmaWMgY29udGVudCBlbGVtZW50cyBzdWNoIGFzIHJvbGVzLAotdGFza3MsIG9yIGFjdGl2aXRpZXMgd2l0aCBlaXRoZXIgYSBjb21wbGV0ZWx5IG5ldyB2YXJpYW50IG9yIHRvIGNoYW5nZSB0aGUKLWZ1bmRhbWVudGFsIHJlbGF0aW9uc2hpcHMgb2YgdGhlc2UgZWxlbWVudHMuIFRoZSBlZmZlY3Qgb2YgdGhpcywgaXMgdGhhdCB0aGUKLWJhc2UgY29udGVudCBlbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIHRoZSBuZXcgcmVwbGFjaW5nIGVsZW1lbnQKLXRvIHdoaWNoIGFsbCBpbmNvbWluZyBhc3NvY2lhdGlvbnMgc3RpbGwgcG9pbnQgYXMgYmVmb3JlLCBidXQgd2hpY2ggaGFzIHBvdGVudGlhbGx5Ci1uZXcgYXR0cmlidXRlIHZhbHVlcyBhbmQgb3V0Z29pbmcgYXNzb2NpYXRpb24gcHJvcGVydGllcy48L2xpPgotPC91bD4KLTx1bD48bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+RXh0ZW5kczwvc3Bhbj48L3N0cm9uZz4gLQotQW4gZXh0ZW5kaW5nIGVsZW1lbnQgaW5oZXJpdHMgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBiYXNlIGVsZW1lbnQuIEV4dGVuc2lvbgotYWxsb3dzIE1ldGhvZCBQbHVnLWlucyB0byBlYXNpbHkgcmV1c2UgZWxlbWVudHMgZnJvbSBhIGJhc2UgcGx1Zy1pbiBieSBwcm92aWRpbmcKLWEga2luZCBvZiBpbmhlcml0YW5jZSBmb3IgdGhlIGV4dGVuZGluZyBlbGVtZW50LiBBdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbgotaW5zdGFuY2VzIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgImJhc2VkLW9uIiBlbGVtZW50IHRvIHRoZSBleHRlbmRpbmcgZWxlbWVudC4KLVRoZSByZXN1bHQgaXMgdGhhdCB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgdGhlICJiYXNlZC1vbiIKLWVsZW1lbnQsIGJ1dCBtaWdodCBkZWZpbmUgaXRzIG93biBhZGRpdGlvbnMuIEV4dGVuZHMgaXMgbm90IHVzZWQgdG8gbW9kaWZ5Ci1jb250ZW50IG9mIHRoZSBiYXNlIHBsdWctaW4sIGJ1dCB0byBwcm92aWRlIHRoZSBhYmlsaXR5IGZvciB0aGUgZXh0ZW5kaW5nCi1wbHVnLWluIHRvIGRlZmluZSBpdHMgb3duIGNvbnRlbnQgd2hpY2ggaXMgYSB2YXJpYW50IG9mIGNvbnRlbnQgYWxyZWFkeSBkZWZpbmVkLgotRm9yIGV4YW1wbGUsIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIGEgZ2VuZXJpYyBSZXZpZXcgUmVjb3JkIGZvciBhIHNwZWNpZmljIHR5cGUKLW9mIHJldmlldy4gVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgZWxlbWVudCBhbmQgYW55IG51bWJlciBvZiBleHRlbmRpbmcKLWVsZW1lbnRzIGNhbiBiZSB1c2VkIHNpZGUgYnkgc2lkZSwgYnV0IHJlZmVyIHRvIGVhY2ggb3RoZXIgdGhyb3VnaCB0aGUgZXh0ZW5kcwotcmVsYXRpb25zaGlwLiBFeHRlbmRzIGFsc28gcHJvdmlkZXMgdGhlIGtleSBtZWNoYW5pc20gZm9yIGJpbmRpbmcgY2FwYWJpbGl0eQotcGF0dGVybnMgdG8gcHJvY2Vzc2VzOiBBIHBhdHRlcm4gaXMgYXBwbGllZCBieSBkZWZpbmluZyBhbiBleHRlbmRzIHJlbGF0aW9uc2hpcAotZnJvbSBhbiBhY3Rpdml0eSBvZiB0aGUgYXBwbHlpbmcgcHJvY2Vzc2VzIHRvIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4uIFRoZQotYWN0aXZpdHkgaW5oZXJpdHMgYXNzb2NpYXRpb24gaW5zdGFuY2VzIGZyb20gdGhlIHBhdHRlcm4gYW5kIHRoZSBwYXR0ZXJuIGFwcGVhcnMKLXRvIGJlIHBhcnQgb2YgdGhlIHJlc3VsdGluZyBwcm9jZXNzIGFmdGVyIGludGVycHJldGF0aW9uLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwjdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPlZhcmlhYmlsaXR5IEFzc29jaWF0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY29udHJpYnV0ZXMuaHRtbCI+Q29udHJpYnV0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyI+UmVwbGFjZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImV4dGVuZHMuaHRtbCNleHRlbmRzIj5FeHRlbmRzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDlhM2QyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVmFyaWFiaWxpdHkgQXNzb2NpYXRpb25zIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlZhcmlhYmlsaXR5IEFzc29jaWF0aW9uczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPjxhIG5hbWU9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VmFyaWFiaWxpdHkgQXNzb2NpYXRpb25zPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+VGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyB0aGUgaW5jb21pbmcgYW5kIG91dGdvaW5nIGFzc29jaWF0aW9ucyBmb3IgZWFjaAotZWxlbWVudCB0eXBlIGZvciB3aGljaCB2YXJpYWJpbGl0eSBjYW4gYmUgdXNlZC4gQXNzb2NpYXRpb25zIGFsc28gaGF2ZSBhIGNhcmRpbmFsaXR5Ci1vZiB0by1tYW55IG9yIHRvLW9uZS4KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiIHN1bW1hcnk9IiIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj48dGhlYWQgYWxpZ249ImxlZnQiPjx0ciB2YWxpZ249ImJvdHRvbSI+PHRoIHZhbGlnbj0iYm90dG9tIiBpZD0iZDBlMTYiPkVsZW1lbnQgVHlwZTwvdGg+Ci08dGggdmFsaWduPSJib3R0b20iIGlkPSJkMGUxOCI+QXNzb2NpYXRlZCBFbGVtZW50IFR5cGU8L3RoPgotPHRoIHZhbGlnbj0iYm90dG9tIiBpZD0iZDBlMjAiPkFzc29jaWF0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5Pjx0cj48dGQgcm93c3Bhbj0iOCIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+V29yayBQcm9kdWN0PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jb250YWluZWQgYXJ0aWZhY3RzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5kZWxpdmVyYWJsZSBwYXJ0czwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Z3VpZGFuY2U8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNvbnRhaW5lciBhcnRpZmFjdDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmRlbGl2ZXJhYmxlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+cmVzcG9uc2libGUgcm9sZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmlucHV0IGFuZCBvdXRwdXQgdG8gdGFza3M8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSI0IiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5Sb2xlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5yZXNwb25zaWJsZSBmb3Igd29yayBwcm9kdWN0PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5ndWlkYW5jZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+cGVyZm9ybWVyIGluIHRhc2s8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSI3IiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5UYXNrPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5wcmltYXJ5IHBlcmZvcm1lciByb2xlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmFkZGl0aW9uYWwgcGVyZm9ybWVyIHJvbGVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5pbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmd1aWRhbmNlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5zdGVwczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5kaXNjaXBsaW5lPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgY29sc3Bhbj0iMyIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2IGQwZTE4IGQwZTIwICI+Q2F0ZWdvcmllczwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSIyIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5DdXN0b20gQ2F0ZWdvcnk8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNhdGVnb3JpemVkIGVsZW1lbnRzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5vdGhlciBjdXN0b20gY2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSI0IiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5EaXNjaXBsaW5lPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaXplZCB0YXNrczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+cmVmZXJlbmNlZCB3b3JrZmxvdyBhY3Rpdml0eTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5kaXNjaXBsaW5lIGdyb3VwaW5nPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y3VzdG9tIGNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgcm93c3Bhbj0iMiIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+RGlzY2lwbGluZSBHcm91cGluZzwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcml6ZWQgZGlzY2lwbGluZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmN1c3RvbSBjYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjQiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPkRvbWFpbjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcml6ZWQgd29yayBwcm9kdWN0czwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+c3ViLWRvbWFpbnM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnN1cGVyLWRvbWFpbnM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jdXN0b20gY2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSIyIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5Xb3JrIFByb2R1Y3QgVHlwZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcml6ZWQgd29yayBwcm9kdWN0czwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y3VzdG9tIGNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgcm93c3Bhbj0iMyIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+Um9sZSBTZXQ8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNhdGVnb3JpemVkIHJvbGVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5yb2xlIHNldCBncm91cGluZzwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmN1c3RvbSBjYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjIiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPlJvbGUgU2V0IEdyb3VwaW5nPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaXplZCByb2xlIHNldHM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmN1c3RvbSBjYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIGNvbHNwYW49IjMiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiBkMGUxOCBkMGUyMCAiPkd1aWRhbmNlPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPlByYWN0aWNlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jb250ZW50IGVsZW1lbnQ8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPk90aGVyIEd1aWRhbmNlIFR5cGVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5zZWN0aW9ucyB2aWEgY29udGVudCBkZXNjcmlwdGlvbnM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL2NvbmYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL2NvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZTVlNmI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9jb25mLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDM0MmMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWNfdnNfcC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWNfdnNfcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkZjFiMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21jX3ZzX3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21ldGhvZGF1dGhvcmluZy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21ldGhvZGF1dGhvcmluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MzhkZDA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tZXRob2RhdXRob3JpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxoZWFkPgotPHRpdGxlPk1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMz5NZXRob2QgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXc8L2gzPgotPHA+TWV0aG9kIGNvbnRlbnQgZGVzY3JpYmVzIHJvbGVzLCB0aGUgdGFza3MgdGhhdCB0aGV5IHBlcmZvcm0sIHRoZSB3b3JrIHByb2R1Y3RzCi0gIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkIGJ5IHRob3NlIHRhc2tzLCBhbmQgc3VwcG9ydGluZyBndWlkYW5jZS48L3A+Ci08cD48aW1nIHNyYz0ibWMuZ2lmIj48L3A+Ci08cD5UaGUgZmlndXJlIGFib3ZlIGRlcGljdHMgdHlwaWNhbCBzb3VyY2VzIGZvciBtZXRob2QgY29udGVudCwgYXMgd2VsbCBhcyBob3cKLSAgdGhlIG1ldGhvZCBjb250ZW50IGlzIHJlcHJlc2VudGVkIGluIEVQRiBDb21wb3Nlci4gTWFueSBkZXZlbG9wbWVudCBtZXRob2RzIGFyZSBkZXNjcmliZWQKLSAgaW4gcHVibGljYXRpb25zIHN1Y2ggYXMgYm9va3MsIGFydGljbGVzLCB0cmFpbmluZyBtYXRlcmlhbCwgc3RhbmRhcmRzIGFuZCByZWd1bGF0aW9ucywKLSAgYW5kIG90aGVyIGZvcm1zIG9mIGRvY3VtZW50YXRpb24uIFRoZXNlIHNvdXJjZXMgdXN1YWxseSBkb2N1bWVudCBtZXRob2RzIGJ5Ci0gIHByb3ZpZGluZyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgd2F5IG9mIGFjaGlldmluZyBhIHNwZWNpZmljCi0gIGRldmVsb3BtZW50IGdvYWwgdW5kZXIgZ2VuZXJhbCBjaXJjdW1zdGFuY2VzLiBTb21lIGV4YW1wbGVzIGFyZTogdHJhbnNmb3JtaW5nCi0gIGEgcmVxdWlyZW1lbnRzIGRvY3VtZW50IGludG8gYW4gYW5hbHlzaXMgbW9kZWw7IGRlZmluaW5nIGFuIGFyY2hpdGVjdHVyYWwgbWVjaGFuaXNtCi0gIGJhc2VkIG9uIGZ1bmN0aW9uYWwgYW5kIG5vbi1mdW5jdGlvbmFsIHJlcXVpcmVtZW50czsgY3JlYXRpbmcgYSBwcm9qZWN0IHBsYW4KLSAgZm9yIGEgZGV2ZWxvcG1lbnQgaXRlcmF0aW9uOyBkZWZpbmluZyBhIHF1YWxpdHkgYXNzdXJhbmNlIHBsYW4gZm9yIGZ1bmN0aW9uYWwKLSAgcmVxdWlyZW1lbnRzOyByZWRlc2lnbmluZyBhIGJ1c2luZXNzIG9yZ2FuaXphdGlvbiBiYXNlZCBvbiBhIG5ldyBzdHJhdGVnaWMgZGlyZWN0aW9uLAotICBhbmQgc28gb24uPC9wPgotPHA+RVBGIENvbXBvc2VyIHRha2VzIGNvbnRlbnQgc3VjaCBhcyB0aGF0IGRlc2NyaWJlZCBhYm92ZSwgYW5kIHN0cnVjdHVyZXMgaXQgaW4gYSBzcGVjaWZpYwotICBzY2hlbWEgb2Ygcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UuIFRoaXMgc2NoZW1hIHN1cHBvcnRzIHRoZQotICBvcmdhbml6YXRpb24gb2YgbGFyZ2UgYW1vdW50cyBvZiBkZXNjcmlwdGlvbnMgZm9yIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4KLSAgU3VjaCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGRvIG5vdCBoYXZlIHRvIGJlIGxpbWl0ZWQgdG8gc29mdHdhcmUgZW5naW5lZXJpbmcsCi0gIGJ1dCBjYW4gYWxzbyBjb3ZlciBvdGhlciBkZXNpZ24gYW5kIGVuZ2luZWVyaW5nIGRpc2NpcGxpbmVzIHN1Y2ggYXMgbWVjaGFuaWNhbAotICBlbmdpbmVlcmluZywgYnVzaW5lc3MgdHJhbnNmb3JtYXRpb24sIHNhbGVzIGN5Y2xlcywgYW5kIHNvIG9uLjwvcD4KLTxwPiBUaGUgRVBGIENvbXBvc2VyIHNjcmVlbiBjYXB0dXJlIGluIHRoZSBmaWd1cmUgYWJvdmUgc2hvd3MgaG93IHN1Y2ggbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMKLSAgYXJlIG9yZ2FuaXplZCBpbiB0cmVlIGJyb3dzZXJzIG9uIHRoZSBsZWZ0LiBUaGVzZSB0cmVlIGJyb3dzZXJzLCBzaW1pbGFyIHRvCi0gIGEgbGlicmFyeSwgcHJvdmlkZSBkaWZmZXJlbnQgaW5kZXhlcyBvZiB0aGUgYXZhaWxhYmxlIGVsZW1lbnRzIGZvciByYXBpZCBhY2Nlc3MuCi0gIFRoZSBzY3JlZW4gY2FwdHVyZSBzaG93cyBvbiB0aGUgcmlnaHQgYW4gZXhhbXBsZSBvZiBhIHRhc2sgcHJlc2VudGF0aW9uLiBUaGlzCi0gIHRhc2sgcHJlc2VudGF0aW9uIGRlZmluZXMgdGhlIHRhc2sgaW4gdGVybXMgb2Ygc3RlcHMgdGhhdCBuZWVkIHRvIGJlIHBlcmZvcm1lZAotICB0byBhY2hpZXZlIHRoZSB0YXNrJ3MgcHVycG9zZS4gWW91IGNhbiBzZWUgdGhhdCB0aGUgdGFzayBoYXMgdmFyaW91cyByZWxhdGlvbnNoaXBzLAotICBzdWNoIGFzIHJlbGF0aW9uc2hpcHMgdG8gcGVyZm9ybWluZyByb2xlcyBhcyB3ZWxsIGFzIHdvcmsgcHJvZHVjdHMgdGhhdCBzZXJ2ZQotICBhcyBpbnB1dHMgYW5kIG91dHB1dHMgdG8gdGhlIHRhc2suIEZpbmQgb3V0IG1vcmUgZGV0YWlscyBvbiB0YXNrcywgcm9sZSwgYW5kCi0gIHdvcmsgcHJvZHVjdHMgaW4gdGhlIG9ubGluZSBoZWxwIDxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sIj5oZXJlPC9hPi4KLSAgSW4gYWRkaXRpb24gdG8gcm9sZXMsIHRhc2tzLCBhbmQgd29yayBwcm9kdWN0cywgRVBGIENvbXBvc2VyIHN1cHBvcnRzIHRoZSBhZGRpdGlvbiBvZgotICBndWlkYW5jZSBlbGVtZW50cy4gR3VpZGFuY2UgYXJlIHN1cHBsZW1lbnRhcnkgZnJlZS1mb3JtIGRvY3VtZW50YXRpb24gc3VjaCBhcwotICB3aGl0ZXBhcGVycywgY29uY2VwdCBkZXNjcmlwdGlvbnMsIGd1aWRlbGluZXMsIHRlbXBsYXRlcywgZXhhbXBsZXMsIGFuZCBzbyBvbi48L3A+Ci08cD5FUEYgQ29tcG9zZXIgcHJvdmlkZXMgdmFyaW91cyBmb3JtLWJhc2VkIGVkaXRvcnMgdG8gY3JlYXRlIG5ldyBtZXRob2QgY29udGVudCBlbGVtZW50cy4KLSAgRG9jdW1lbnQgeW91ciB0YXNrLCByb2xlcywgd29yayBwcm9kdWN0cywgYW5kIGd1aWRhbmNlIGVsZW1lbnRzIHVzaW5nIGludHVpdGl2ZQotICByaWNoLXRleHQgZWRpdG9ycyB0aGF0IGFsbG93IHlvdSB0byBjb3B5IGFuZCBwYXN0ZSB0ZXh0IGZyb20gb3RoZXIgc291cmNlcyBzdWNoCi0gIGFzIHdlYiBwYWdlcyBvciBkb2N1bWVudHMuIFVzZSBzaW1wbGUgZGlhbG9ncyB0byBlc3RhYmxpc2ggcmVsYXRpb25zaGlwcyBiZXR3ZWVuCi0gIGNvbnRlbnQgZWxlbWVudHMuPC9wPgotPHA+RVBGIENvbXBvc2VyIG9yZ2FuaXplcyBjb250ZW50IGluIHBoeXNpY2FsIGNvbnRlbnQgcGFja2FnZXMgdGhhdCBhbGxvdyB5b3UgdG8gbWFuYWdlCi0gIHlvdXIgY29udGVudCBpbiBjb25maWd1cmFibGUgdW5pdHMuIEVQRiBDb21wb3NlciBhbHNvIGFsbG93cyB5b3UgdG8gY2F0ZWdvcml6ZSB5b3VyIGNvbnRlbnQKLSAgYmFzZWQgb24gYSBzZXQgb2YgcHJlZGVmaW5lZCBjYXRlZ29yaWVzIChmb3IgZXhhbXBsZSwgY2F0ZWdvcml6ZSB5b3VyIHRhc2tzCi0gIGludG8gZGV2ZWxvcG1lbnQgZGlzY2lwbGluZXMsIG9yIHlvdXIgd29yayBwcm9kdWN0cyBpbnRvIGRvbWFpbnMpIG9yIGNyZWF0ZQotICB5b3VyIG93biBjYXRlZ29yaXphdGlvbiBzY2hlbWVzIGZvciB5b3VyIGNvbnRlbnQgd2l0aCB5b3VyIG93biB1c2VyLWRlZmluZWQKLSAgY2F0ZWdvcmllcyB0aGF0IGFsbG93IHlvdSB0byBpbmRleCBjb250ZW50IGluIGFueSB3YXkgeW91IHdhbnQuPC9wPgotPHA+Rm9yIG1vcmUgZGV0YWlscyBvbiBtZXRob2QgY29udGVudCBhdXRob3Jpbmcgc2VlIHRoZSBvbmxpbmUgaGVscDo8L3A+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sIj5NZXRob2QKLSAgICAgIEF1dGhvcmluZyBPdmVydmlldzwvYT48L2xpPgotPC91bD4KLTwvZGl2PgotPHA+Jm5ic3A7PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL292ZXJ2aWV3Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDNmOTE0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi08aHRtbD4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aGVhZD4KLTx0aXRsZT5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPkludHJvZHVjdGlvbiB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIChFUEYgQ29tcG9zZXIpPC9oMz4KLTxwPldlbGNvbWUgdG8gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciAoRVBGIENvbXBvc2VyKS4gRVBGIENvbXBvc2VyIGlzIGEgdG9vbCBwbGF0Zm9ybSB0aGF0IGVuYWJsZXMKLSAgcHJvY2VzcyBlbmdpbmVlcnMgYW5kIG1hbmFnZXJzIHRvIGltcGxlbWVudCwgZGVwbG95LCBhbmQgbWFpbnRhaW4gcHJvY2Vzc2VzCi0gIGZvciBvcmdhbml6YXRpb25zIG9yIGluZGl2aWR1YWwgcHJvamVjdHMuIFR5cGljYWxseSwgdHdvIGtleSBwcm9ibGVtcyBuZWVkIHRvCi0gIGJlIGFkZHJlc3NlZCB0byBzdWNjZXNzZnVsbHkgZGVwbG95IG5ldyBwcm9jZXNzZXMuPC9wPgotPHA+IEZpcnN0LCBkZXZlbG9wbWVudCB0ZWFtcyBuZWVkIHRvIGJlIGVkdWNhdGVkIG9uIHRoZSBtZXRob2RzIGFwcGxpY2FibGUgdG8KLSAgdGhlIHJvbGVzIHRoYXQgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiBTb2Z0d2FyZSBkZXZlbG9wZXJzIHR5cGljYWxseSBuZWVkCi0gIHRvCi0gIGxlYXJuCi0gIGhvdwotICB0bwotICBkbyBhbmFseXNpcyBhbmQgZGVzaWduLCB0ZXN0ZXJzIG5lZWQgdG8gbGVhcm4gaG93IHRvIHRlc3QgaW1wbGVtZW50YXRpb25zIGFnYWluc3QKLSAgIHJlcXVpcmVtZW50cywgbWFuYWdlcnMgbmVlZCB0byBsZWFybiBob3cgdG8gbWFuYWdlIHRoZSBwcm9qZWN0IHNjb3BlIGFuZCBjaGFuZ2UsCi0KLSAgYW5kIHNvIG9uLiBTb21lIG9yZ2FuaXphdGlvbnMgYXNzdW1lIHRoYXQgZGV2ZWxvcGVycyBpbXBsaWNpdGx5IGtub3cgaG93IHRvCi0gICBkbyBzdWNoIHdvcmsgd2l0aG91dCBkb2N1bWVudGluZyB0aGVpciBtZXRob2RzLCBidXQgbWFueSBvcmdhbml6YXRpb25zIHdhbnQKLQotICB0byBlc3RhYmxpc2ggY29tbW9uIGFuZCByZWd1bGF0ZWQgcHJhY3RpY2VzLCB0byBkcml2ZSBzcGVjaWZpYyBpbXByb3ZlbWVudAotICBvYmplY3RpdmVzLCAgYW5kIHRvIG1lZXQgY29tcGxpYW5jZSBzdGFuZGFyZHMuPC9wPgotPHA+IFNlY29uZCwgZGV2ZWxvcG1lbnQgdGVhbXMgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0byBhcHBseSB0aGVzZSBtZXRob2RzIHRocm91Z2hvdXQKLSAgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFRoYXQgaXMsIHRoZXkgbmVlZCB0byBkZWZpbmUgb3Igc2VsZWN0IGEgZGV2ZWxvcG1lbnQKLSAgcHJvY2Vzcy4gRm9yCi0KLSAgZXhhbXBsZSwgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQgbWV0aG9kcyBoYXZlIHRvIGJlIGFwcGxpZWQgZGlmZmVyZW50bHkgaW4KLSAgZWFybHkgIHBoYXNlcyBvZiBhIHByb2plY3Qgd2hlcmUgdGhlIGZvY3VzIGlzIG9uIGVsaWNpdGF0aW9uIG9mIHN0YWtlaG9sZGVyCi0gIG5lZWRzIGFuZAotICByZXF1aXJlbWVudHMgYW5kIHNjb3BpbmcgYSB2aXNpb24sIHRoYW4gaW4gbGF0ZXIgcGhhc2VzIHdoZXJlIHRoZSBmb2N1cyBpcwotICBvbiAgbWFuYWdpbmcgcmVxdWlyZW1lbnRzIHVwZGF0ZXMgYW5kIGNoYW5nZXMgYW5kIHBlcmZvcm1pbmcgaW1wYWN0IGFuYWx5c2lzCi0gIG9mCi0gIHRoZXNlIHJlcXVpcmVtZW50cyBjaGFuZ2VzLiBUZWFtcyBhbHNvIG5lZWQgY2xlYXIgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlCi0gIGRpZmZlcmVudCAgdGFza3Mgb2YgdGhlIG1ldGhvZHMgcmVsYXRlIHRvIGVhY2ggb3RoZXIsIGZvciBleGFtcGxlLCBob3cgdGhlCi0gIGNoYW5nZSBtYW5hZ2VtZW50Ci0gIG1ldGhvZCBpbXBhY3RzIHRoZSByZXF1aXJlbWVudHMgbWFuYWdlbWVudCBtZXRob2QgYXMgd2VsbCBhcyByZWdyZXNzaW9uIHRlc3RpbmcKLSAgIG1ldGhvZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUuIEV2ZW4gc2VsZi1vcmdhbml6aW5nIHRlYW1zIG5lZWQgdG8gZGVmaW5lCi0gIGEKLSAgcHJvY2VzcyB0aGF0IGdpdmVzIGF0IG1pbmltdW0gc29tZSBndWlkYW5jZSBvbiBob3cgdGhlIGRldmVsb3BtZW50IHdpbGwgYmUKLSAgc2NvcGVkICB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUsIHdoZW4gbWlsZXN0b25lcyB3aWxsIGJlIGFjaGlldmVkIGFuZCB2ZXJpZmllZCwKLSAgYW5kCi0gIHNvIG9uLiA8L3A+Ci08cD5UbyB0aGF0IGVuZCwgRVBGIENvbXBvc2VyIGhhcyB0d28gbWFpbiBwdXJwb3NlczogPC9wPgotPGRpdiBhbGlnbj0ibGVmdCI+PHVsPgotICA8bGk+VG8gcHJvdmlkZSBhIGtub3dsZWRnZSBiYXNlIG9mIGludGVsbGVjdHVhbCBjYXBpdGFsIHdoaWNoIHlvdSBjYW4gYnJvd3NlLAotICAgIG1hbmFnZSBhbmQgZGVwbG95LiBUaGlzIGNvbnRlbnQgY2FuIGluY2x1ZGUgZXh0ZXJuYWxseSBkZXZlbG9wZWQgY29udGVudCwKLSAgICBhbmQsIG1vcmUgaW1wb3J0YW50bHksIGNhbiBpbmNsdWRlIHlvdXIgb3duIGNvbnRlbnQgaW5jbHVkaW5nIG9mIHdoaXRlcGFwZXJzLAotICAgIGd1aWRlbGluZXMsIHRlbXBsYXRlcywgcHJpbmNpcGxlcywgYmVzdCBwcmFjdGljZXMsIGludGVybmFsIHByb2NlZHVyZXMgYW5kCi0gICAgcmVndWxhdGlvbnMsIHRyYWluaW5nIG1hdGVyaWFsLCBhbmQgYW55IG90aGVyIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHlvdXIKLSAgICBtZXRob2RzLiBUaGlzIGtub3dsZWRnZSBiYXNlIGNhbiB1c2VkIGZvciByZWZlcmVuY2UgYW5kIGVkdWNhdGlvbi4gSXQgYWxzbwotICAgIGZvcm1zIHRoZSBiYXNpcyBmb3IgZGV2ZWxvcGluZyBwcm9jZXNzZXMgKHRoZSBzZWNvbmQgcHVycG9zZSkuIEVQRiBDb21wb3NlciBpcyBkZXNpZ25lZAotICAgIHRvIGJlIGEgY29udGVudCBtYW5hZ2VtZW50IHN5c3RlbSB0aGF0IHByb3ZpZGVzIGEgY29tbW9uIG1hbmFnZW1lbnQgc3RydWN0dXJlCi0gICAgYW5kIGxvb2sgYW5kIGZlZWwgZm9yIGFsbCBvZiB5b3VyIGNvbnRlbnQsIHJhdGhlciB0aGFuIGJlaW5nIGEgZG9jdW1lbnQgbWFuYWdlbWVudAotICAgIHN5c3RlbSBpbiB3aGljaCB5b3Ugd291bGQgc3RvcmUgYW5kIGFjY2VzcyBoYXJkIHRvIG1haW50YWluIGxlZ2FjeSBkb2N1bWVudHMKLSAgICBhbGwgaW4gdGhlaXIgb3duIHNoYXBlcyBhbmQgZm9ybWF0cy4gQWxsIGNvbnRlbnQgbWFuYWdlZCBpbiBFUEYgQ29tcG9zZXIgY2FuIGJlIHB1Ymxpc2hlZAotICAgIHRvIGh0bWwgYW5kIGRlcGxveWVkIHRvIFdlYiBzZXJ2ZXJzIGZvciBkaXN0cmlidXRlZCB1c2FnZS48YnI+Ci0gIDwvbGk+Ci0gIDxsaT5UbyBwcm92aWRlIHByb2Nlc3MgZW5naW5lZXJpbmcgY2FwYWJpbGl0aWVzIGJ5IHN1cHBvcnRpbmcgcHJvY2VzcyBlbmdpbmVlcnMKLSAgICBhbmQgcHJvamVjdCBtYW5hZ2VycyBpbiBzZWxlY3RpbmcsIHRhaWxvcmluZywgYW5kIHJhcGlkbHkgYXNzZW1ibGluZyBwcm9jZXNzZXMKLSAgICBmb3IgdGhlaXIgY29uY3JldGUgZGV2ZWxvcG1lbnQgcHJvamVjdHMuIEVQRiBDb21wb3NlciBwcm92aWRlcyBjYXRhbG9ncyBvZiBwcmUtZGVmaW5lZAotICAgIHByb2Nlc3NlcyBmb3IgdHlwaWNhbCBwcm9qZWN0IHNpdHVhdGlvbnMgdGhhdCBjYW4gYmUgYWRhcHRlZCB0byBpbmRpdmlkdWFsCi0gICAgbmVlZHMuIEl0IGFsc28gcHJvdmlkZXMgcHJvY2VzcyBidWlsZGluZyBibG9ja3MsIGNhbGxlZCBjYXBhYmlsaXR5IHBhdHRlcm5zLAotICAgIHRoYXQgcmVwcmVzZW50IGJlc3QgZGV2ZWxvcG1lbnQgcHJhY3RpY2VzIGZvciBzcGVjaWZpYyBkaXNjaXBsaW5lcywgdGVjaG5vbG9naWVzLAotICAgIG9yIG1hbmFnZW1lbnQgc3R5bGVzLiBUaGVzZSBidWlsZGluZyBibG9ja3MgZm9ybSBhIHRvb2xraXQgZm9yIHF1aWNrIGFzc2VtYmx5Ci0gICAgb2YgcHJvY2Vzc2VzIGJhc2VkIG9uIHByb2plY3Qtc3BlY2lmaWMgbmVlZHMuIEVQRiBDb21wb3NlciBhbHNvIGFsbG93cyB5b3UgdG8gc2V0IHVwCi0gICAgeW91ciBvd24gb3JnYW5pemF0aW9uLXNwZWNpZmljIGNhcGFiaWxpdHkgcGF0dGVybiBsaWJyYXJpZXMuIEZpbmFsbHksIHRoZQotICAgIHByb2Nlc3NlcyBjcmVhdGVkIHdpdGggRVBGIENvbXBvc2VyIGNhbiBiZSBwdWJsaXNoZWQgYW5kIGRlcGxveWVkIGFzIFdlYiBzaXRlcy48L2xpPgotPC91bD4KLTwvZGl2PgotPGgzPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIncyBLZXkgQ2FwYWJpbGl0aWVzPC9oMz4KLTxwPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBuZXcga2V5IGNhcGFiaWxpdGllczo8L3A+Ci0gIDxkaXYgYWxpZ249ImxlZnQiPgotPHVsPgotICA8bGk+IFByb3ZpZGVzIGNvbXBsZXRlbHkgcmVkZXNpZ25lZCB0b29scyBmb3IgYXV0aG9yaW5nLCBjb25maWd1cmluZywgdmlld2luZywKLSAgICBhbmQgcHVibGlzaGluZyBkZXZlbG9wbWVudCBwcm9jZXNzZXMuPC9saT4KLSAgPGxpPiBQcm92aWRlcyBqdXN0LWluLXRpbWUgZ2VuZXJhdGlvbiBvZiBwdWJsaWNhdGlvbiBwcmV2aWV3cyBpbiBkZWRpY2F0ZWQgYnJvd3NpbmcKLSAgICBwZXJzcGVjdGl2ZSB0aGF0IGFsbG93cyByYXBpZCBjb25maWd1cmF0aW9uIHN3aXRjaGluZy48L2xpPgotICA8bGk+IE1hbmFnZXMgbWV0aG9kIGNvbnRlbnQgdXNpbmcgc2ltcGxlIGZvcm0tYmFzZWQgdXNlciBpbnRlcmZhY2VzLiBUaGVyZWZvcmUsCi0gICAgVU1MIG1vZGVsaW5nIHNraWxscyBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkLjwvbGk+Ci0gIDxsaT4gUHJvdmlkZXMgaW50dWl0aXZlIHJpY2ggdGV4dCBlZGl0b3JzIGZvciBjcmVhdGluZyBpbGx1c3RyYXRpdmUgY29udGVudAotICAgIGRlc2NyaXB0aW9ucy4gRWRpdG9ycyBhbGxvdyB1c2Ugb2Ygc3R5bGVzLCBpbWFnZXMsIHRhYmxlcywgaHlwZXJsaW5rcywgYW5kCi0gICAgZGlyZWN0IGh0bWwgZWRpdGluZy48L2xpPgotICA8bGk+QWxsb3dzIGNyZWF0aW5nIHByb2Nlc3NlcyB3aXRoIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9ycyBhbmQgd29ya2Zsb3cKLSAgICBkaWFncmFtcyB0aHJvdWdoIHVzZSBvZiBtdWx0aS1wcmVzZW50YXRpb24gcHJvY2VzcyBlZGl0b3JzLiBCcmVha2Rvd24gc3RydWN0dXJlCi0gICAgZWRpdG9yIHN1cHBvcnRzIGRpZmZlcmVudCBwcm9jZXNzIHZpZXdzOiB3b3JrLWJyZWFrZG93biB2aWV3LCB3b3JrIHByb2R1Y3QKLSAgICB1c2FnZSB2aWV3LCBhbmQgdGVhbSBhbGxvY2F0aW9uIHZpZXcuIEVQRiBDb21wb3NlciBhdXRvbWF0aWNhbGx5IHN5bmNocm9uaXplcyBhbGwgcHJlc2VudGF0aW9ucwotICAgIHdpdGggcHJvY2VzcyBjaGFuZ2VzLiA8L2xpPgotICA8bGk+UHJvdmlkZXMgc3VwcG9ydCBmb3IgbWFueSBhbHRlcm5hdGl2ZSBsaWZlY3ljbGUKLSAgICBtb2RlbHMuIEZvciBleGFtcGxlLCB3YXRlcmZhbGwsIGluY3JlbWVudGFsLCBvciBpdGVyYXRpdmUgbW9kZWxzIGNhbiBiZSBjcmVhdGVkCi0gICAgd2l0aCB0aGUgc2FtZSBvdmVybGFwcGluZyBtZXRob2QgY29udGVudC48L2xpPgotICA8bGk+SW1wcm92ZWQgcmV1c2UgYW5kIGV4dGVuc2liaWxpdHkgY2FwYWJpbGl0aWVzLiBUaGUgcGx1Zy1pbiBtZWNoYW5pc21zIGZyb20KLSAgICBwYXN0IHZlcnNpb25zIGhhdmUgYmVlbiBleHRlbmRlZCB0byBzdXBwb3J0IGV4dGVuc2lvbnMgZm9yIGJyZWFrZG93biBzdHJ1Y3R1cmVzLjwvbGk+Ci0gIDxsaT5TdXBwb3J0cyByZXVzYWJsZSBkeW5hbWljYWxseS1saW5rZWQgcHJvY2VzcyBwYXR0ZXJucyBvZiBiZXN0IHByYWN0aWNlcwotICAgIGZvciByYXBpZCBwcm9jZXNzIGFzc2VtYmx5IHZpYSBkcmFnLWFuZC1kcm9wLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08aDM+S2V5IFRlcm1pbm9sb2d5IGFuZCBDb25jZXB0czwvaDM+Ci08cD5UbyBlZmZlY3RpdmVseSB3b3JrIHdpdGggRVBGIENvbXBvc2VyLCB5b3UgbmVlZCB0byB1bmRlcnN0YW5kIGEgZmV3IGNvbmNlcHRzCi0gIHRoYXQgYXJlIHVzZWQgdG8gb3JnYW5pemUgdGhlIGNvbnRlbnQuIFRoZSBwYWdlcyA8YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+TWV0aG9kCi0gIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sIj5Qcm9jZXNzCi0gIEF1dGhvcmluZyBPdmVydmlldzwvYT4gY29udGFpbiBtb3JlIGRldGFpbCBhbmQgY29uY3JldGUgZXhhbXBsZXMgb2YgaG93IHRvIHdvcmsKLSAgaW4gdGhlIHRvb2wuIFRoaXMgcGFnZSBwcm92aWRlcyB5b3Ugd2l0aCBhIGdlbmVyYWwgb3ZlcnZpZXcgb2YgdGhlc2UgY29uY2VwdHMuPC9wPgotPHA+VGhlIG1vc3QgZnVuZGFtZW50YWwgcHJpbmNpcGxlIGluIEVQRiBDb21wb3NlciBpcyB0aGUgc2VwYXJhdGlvbiBvZiByZXVzYWJsZSBjb3JlIG1ldGhvZAotICBjb250ZW50IGZyb20gaXRzIGFwcGxpY2F0aW9uIGluIHByb2Nlc3Nlcy4gVGhpcyBkaXJlY3RseSByZWxhdGVzIGJhY2sgdG8gdGhlCi0gIHR3byBwdXJwb3NlcyBvZiBFUEYgQ29tcG9zZXIgZGVzY3JpYmVkIGluIHRoZSBmaXJzdCBzZWN0aW9uLiBBbG1vc3QgYWxsIG9mIEVQRiBDb21wb3NlcidzIGNvbmNlcHRzCi0gIGFyZSBjYXRlZ29yaXplZCBhbG9uZyB0aGlzIHNlcGFyYXRpb24uIE1ldGhvZCBjb250ZW50IGRlc2NyaWJlcyB3aGF0IGlzIHRvIGJlCi0gIHByb2R1Y2VkLCB0aGUgbmVjZXNzYXJ5IHNraWxscyByZXF1aXJlZCBhbmQgdGhlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgZGVzY3JpYmluZwotICBob3cgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkLiBUaGVzZSBtZXRob2QgY29udGVudCBkZXNjcmlwdGlvbnMKLSAgYXJlIGluZGVwZW5kZW50IG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgZGVzY3JpYmUgdGhlIGRldmVsb3BtZW50Ci0gIGxpZmVjeWNsZS4gUHJvY2Vzc2VzIHRha2UgdGhlIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZAotICBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy48L3A+Ci08cD48aW1nIHNyYz0idW1hX2h1bXAuZ2lmIj48L3A+Ci08cD5UaGUgZmlndXJlIGFib3ZlIHNob3dzIGhvdyB0aGlzIHNlcGFyYXRpb24gaXMgZGVwaWN0ZWQgaW4gQmFzaWMgVW5pZmllZAotICBQcm9jZXNzLiBNZXRob2QgY29udGVudCwgZGVzY3JpYmluZyBob3cgZGV2ZWxvcG1lbnQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQsCi0gIGlzIGNhdGVnb3JpemVkIGJ5IGRpc2NpcGxpbmVzIGFsb25nIHRoZSB5LWF4aXMgb2YgdGhlIGRpYWdyYW0uIFRoZSB3b3JrIGRlc2NyaWJlZAotICBpbiBhIHByb2Nlc3MgaXMgc2VlbiBhbG9uZyB0aGUgeC1heGlzIHJlcHJlc2VudGluZyB0aGUgdGltZWxpbmUuIFRoaXMgaXMgdGhlCi0gIGxpZmVjeWNsZSBvZiBhIGRldmVsb3BtZW50IHByb2plY3QuIEl0IGV4cHJlc3NlcyB3aGVuIHdoYXQgd29yayB3aWxsIGJlIHBlcmZvcm1lZC4KLSAgVGhlIGdyYXBoIGluIHRoZSBpbGx1c3RyYXRpb24gcmVwcmVzZW50cyBhbiBlc3RpbWF0ZWQgd29ya2xvYWQgZm9yIGVhY2ggZGlzY2lwbGluZS4KLSAgQXMgeW91IHNlZSwgZm9yIGV4YW1wbGUsIG9uZSBuZXZlciBzdG9wcyB3b3JraW5nIG9uIHJlcXVpcmVtZW50cyBpbiBSVVAsIGJ1dAotICB0aGVyZSBhcmUgY2VydGFpbmx5IHBlYWsgdGltZXMgaW4gd2hpY2ggbW9zdCBvZiB0aGUgcmVxdWlyZW1lbnRzIGVsaWNpdGF0aW9uCi0gIGFuZCBkZXNjcmlwdGlvbiB3b3JrIGlzIHBlcmZvcm1lZC4gVGhlcmUgYXJlIGFsc28gdGltZXMgYXQgd2hpY2ggYSBkb3dud2FyZAotICB0cmVuZCBuZWVkcyB0byBiZSBvYnNlcnZlZCB3aGVyZSBmZXdlciBhbmQgZmV3ZXIgcmVxdWlyZW1lbnRzIGNoYW5nZXMgaGF2ZSB0bwotICBiZSBwcm9jZXNzZWQgdG8gYnJpbmcgdGhlIHByb2plY3QgdG8gYSBjbG9zZS4gVGhpcyBhdm9pZHMgd2hhdCBpcyByZWZlcnJlZCB0bwotICBhcyBmZWF0dXJlIGNyZWVwIGluIHdoaWNoIHJlcXVpcmVtZW50cyB3b3JrIHJlbWFpbnMgY29uc3RhbnQgb3IgZXZlbiBpbmNyZWFzZXMuCi0gIEhlbmNlLCBhIGxpZmVjeWNsZSAocHJvY2VzcykgZXhwcmVzc2VzIHRoZSB2YXJpYW5jZXMgb2Ygd29yayBwZXJmb3JtZWQgaW4gdGhlCi0gIHZhcmlvdXMgZGlzY2lwbGluZXMgKG1ldGhvZCBjb250ZW50KS48L3A+Ci08cD48aW1nIHNyYz0ibWNfdnNfcC5naWYiPjwvcD4KLTxwPlRoZSBwaWN0dXJlIGFib3ZlIHByb3ZpZGVzIGEgc3VtbWFyeSBvZiB0aGUga2V5IGVsZW1lbnRzIHVzZWQgaW4gRVBGIENvbXBvc2VyIGFuZCBob3cKLSAgdGhleSByZWxhdGUgdG8gbWV0aG9kIGNvbnRlbnQgb3IgcHJvY2Vzcy4gQXMgeW91IHNlZSwgbWV0aG9kIGNvbnRlbnQgaXMgcHJpbWFyaWx5Ci0gIGV4cHJlc3NlZCB1c2luZyB3b3JrIHByb2R1Y3RzLCByb2xlcywgdGFza3MsIGFuZCBndWlkYW5jZS4gR3VpZGFuY2UsIHN1Y2ggYXMKLSAgY2hlY2tsaXN0cywgZXhhbXBsZXMsIG9yIHJvYWRtYXBzLCBjYW4gYWxzbyBiZSBkZWZpbmVkIHRvIHByb3ZpZGUgZXhlbXBsYXJ5Ci0gIHdhbGt0aHJvdWdocyBvZiBhIHByb2Nlc3MuIE9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIGRpYWdyYW0sIHlvdSBzZWUgdGhlCi0gIGVsZW1lbnRzIHVzZWQgdG8gcmVwcmVzZW50IHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIuIFRoZSBtYWluIGVsZW1lbnQgaXMgdGhlIGFjdGl2aXR5Ci0gIHRoYXQgY2FuIGJlIG5lc3RlZCB0byBkZWZpbmUgYnJlYWtkb3duIHN0cnVjdHVyZXMgYXMgd2VsbCBhcyByZWxhdGVkIHRvIGVhY2gKLSAgb3RoZXIgdG8gZGVmaW5lIGEgZmxvdyBvZiB3b3JrLiBBY3Rpdml0aWVzIGFsc28gY29udGFpbiBkZXNjcmlwdG9ycyB0aGF0IHJlZmVyZW5jZQotICBtZXRob2QgY29udGVudC4gQWN0aXZpdGllcyBhcmUgdXNlZCB0byBkZWZpbmUgcHJvY2Vzc2VzIG9mIHdoaWNoIEVQRiBDb21wb3NlciBzdXBwb3J0Ci0gIHR3byBtYWluIGtpbmRzOiBkZWxpdmVyeSBwcm9jZXNzZXMgYW5kIGNhcGFiaWxpdHkgcGF0dGVybnMuIERlbGl2ZXJ5IHByb2Nlc3NlcwotICByZXByZXNlbnQgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBwcm9jZXNzIHRlbXBsYXRlIGZvciBwZXJmb3JtaW5nIG9uZSBzcGVjaWZpYwotICB0eXBlIG9mIHByb2plY3QuIFRoZXkgZGVzY3JpYmUgYSBjb21wbGV0ZSBlbmQtdG8tZW5kIHByb2plY3QgbGlmZWN5Y2xlIGFuZCBhcmUKLSAgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzLiBDYXBhYmlsaXR5Ci0gIHBhdHRlcm5zIGFyZSBwcm9jZXNzZXMgdGhhdCBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYQotICBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgZGlzY2lwbGluZSBvciBhIGJlc3QgcHJhY3RpY2UuIFRoZXkgYXJlIGFsc28KLSAgdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgZGVsaXZlcnkgcHJvY2Vzc2VzIG9yIGxhcmdlciBjYXBhYmlsaXR5Ci0gIHBhdHRlcm5zLiBUaGlzIGVuc3VyZXMgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlaXIga2V5IGJlc3QgcHJhY3RpY2VzCi0gIGluIHByb2Nlc3MgYXV0aG9yaW5nIGFjdGl2aXRpZXMgaW4gRVBGIENvbXBvc2VyLiA8L3A+Ci0KLTxwPkZvciBtb3JlIGRldGFpbHMgb24gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3Nlciwgc2VlIHRoZSBvbmxpbmUgaGVscDo8L3A+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hYm91dGVwZmNvbXBvc2VyLmh0bWwiPk92ZXJ2aWV3PC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXcuaHRtbCI+R2V0dGluZwotICAgICAgU3RhcnRlZDwvYT48L2xpPgotPC91bD4KLTwvZGl2PgotPHA+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3AuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYjg2ODg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wcm9jZXNzYXV0aG9yaW5nLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHJvY2Vzc2F1dGhvcmluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Mzg0MjJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wcm9jZXNzYXV0aG9yaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08aHRtbD4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aGVhZD4KLTx0aXRsZT5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMz5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvaDM+Ci08cD5BIGRldmVsb3BtZW50IHByb2Nlc3MgZGVmaW5lcyBzZXF1ZW5jZXMgb2YgdGFza3MgcGVyZm9ybWVkIGJ5IHJvbGVzIGFuZCB3b3JrCi0gIHByb2R1Y3RzIHByb2R1Y2VkIG92ZXIgdGltZS48L3A+Ci08cD48aW1nIHNyYz0icC5naWYiPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgc2hvd3MgdGhhdCBwcm9jZXNzZXMgYXJlIHR5cGljYWxseSBleHByZXNzZWQgYXMgd29ya2Zsb3dzCi0gIG9yIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiBEZWZpbmluZyBhIHN0cmljdCBzZXF1ZW5jZSBhcyBpbiBhIHdhdGVyZmFsbCBtb2RlbAotICBpcyBhcyBtdWNoIGEgcHJvY2VzcyBhcyBkZWZpbmluZyBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIGluIGl0ZXJhdGlvbnMgb2YgcGFyYWxsZWwKLSAgd29yay4gVGhleSBqdXN0IHJlcHJlc2VudCBkaWZmZXJlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2hlcy4gSGVuY2UsIGZvciBkZWZpbmluZwotICBhIHByb2Nlc3MsIG9uZSBjYW4gdGFrZSBtZXRob2QgY29udGVudCBhbmQgY29tYmluZSBpdCBpbnRvIHN0cnVjdHVyZXMgdGhhdCBzcGVjaWZ5Ci0gIGhvdyB0aGUgd29yayBzaGFsbCBiZSBvcmdhbml6ZWQgb3ZlciB0aW1lLCB0byBtZWV0IHRoZSBuZWVkcyBvZiBhIHBhcnRpY3VsYXIKLSAgdHlwZSBvZiBkZXZlbG9wbWVudCBwcm9qZWN0IChzdWNoIGFzIHNvZnR3YXJlIGZvciBhIG9ubGluZSBzeXN0ZW0gdmVyc3VzIHNvZnR3YXJlCi0gIGFuZCBoYXJkd2FyZSBmb3IgYW4gZW1iZWRkZWQgc3lzdGVtKS4gRVBGIENvbXBvc2VyIHN1cHBvcnRzIHByb2Nlc3NlcyBiYXNlZCBvbiBkaWZmZXJlbnQKLSAgZGV2ZWxvcG1lbnQgYXBwcm9hY2hlcyBhY3Jvc3MgbWFueSBkaWZmZXJlbnQgbGlmZWN5Y2xlIG1vZGVscywgaW5jbHVkaW5nIHdhdGVyZmFsbCwKLSAgaW5jcmVtZW50YWwsIGFuZCBpdGVyYXRpdmUgbGlmZWN5Y2xlcy4gRVBGIENvbXBvc2VyIGFsc28gc3VwcG9ydHMgZGlmZmVyZW50IHByZXNlbnRhdGlvbnMKLSAgZm9yIHByb2Nlc3MsIHN1Y2ggYXMgd29yay1icmVha2Rvd24gc3RydWN0dXJlIG9yIHdvcmtmbG93IHByZXNlbnRhdGlvbnMuIFlvdQotICBjYW4gYWxzbyBkZWZpbmUgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3NlciB0aGF0IHVzZSBhIG1pbmltYWwgc2V0IG9mIG1ldGhvZCBjb250ZW50IHRvCi0gIGRlZmluZSBwcm9jZXNzZXMgZm9yIGFnaWxlLCBzZWxmLW9yZ2FuaXppbmcgdGVhbXMuPC9wPgotPHA+IFRoZSBFUEYgQ29tcG9zZXIgc2NyZWVuIGNhcHR1cmUgYWJvdmUgc2hvd3MgYW4gZXhhbXBsZSBvZiBhIHByb2Nlc3MgcHJlc2VudGVkIGFzIGEKLSAgYnJlYWtkb3duIHN0cnVjdHVyZSBvZiBuZXN0ZWQgYWN0aXZpdGllcyBhcyB3ZWxsIGFzIGEgd29ya2Zsb3cgb3IgYWN0aXZpdHkgZGlhZ3JhbQotICBmb3Igb25lIHBhcnRpY3VsYXIgYWN0aXZpdHksIHRoZSBpbmNlcHRpb24gcGhhc2UuIEl0IGFsc28gaW5kaWNhdGVzIHdpdGggdGhlCi0gIHR3byBibHVlIGFycm93cyB0aGF0IHRoZSBwYXJ0aWN1bGFyIG1ldGhvZCBjb250ZW50IHRhc2sgJnF1b3Q7RGV0YWlsIGEgVXNlIENhc2UmcXVvdDsKLSAgaGFzIGJlZW4gYXBwbGllZCBpbiB0aGUgcHJvY2VzcyB0d2ljZTsgZmlyc3RseSBpbiB0aGUgaW5jZXB0aW9uIHBoYXNlIHVuZGVyCi0gIHRoZSBhY3Rpdml0eSAmcXVvdDtEZWZpbmUgdGhlIFN5c3RlbSwmcXVvdDsgYW5kIHNlY29uZGx5LCBpbiB0aGUgZWxhYm9yYXRpb24KLSAgcGhhc2UgaW4gdGhlIGFjdGl2aXR5ICZxdW90O1JlZmluZSB0aGUgc3lzdGVtIGRlZmluaXRpb24mcXVvdDsuIFlvdSBzZWUgYmVsb3cKLSAgZWFjaCBvZiB0aGVzZSB0YXNrIGFwcGxpY2F0aW9ucywgcmVmZXJyZWQgdG8gYXMgYSB0YXNrIGRlc2NyaXB0b3JzIGluIEVQRiBDb21wb3NlciwgbGlzdHMKLSAgb2YgdGhlIHBlcmZvcm1pbmcgcm9sZXMgYXMgd2VsbCBhcyB0aGUgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiBJZiB5b3UKLSAgbG9vayBjbG9zZWx5LCB5b3Ugc2VlIHRoYXQgdGhlc2UgbGlzdHMgYXJlIGRpZmZlcmVudCBmb3IgZWFjaCBvZiB0aGVzZSB0d28gdGFzawotICBkZXNjcmlwdG9ycywgZXhwcmVzc2luZyBkaWZmZXJlbmNlcyBpbiBwZXJmb3JtaW5nIHRoZSAmcXVvdDtEZXRhaWwgYSBVc2UgQ2FzZSZxdW90OwotICBtZXRob2QgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlLiBZb3Ugc2VlIGRpZmZlcmVudCByb2xlcyBpbnZvbHZlZCBhbmQgY2hhbmdlcwotICBpbiB0aGUgbGlzdCBvZiBpbnB1dHMgdG8gYmUgY29uc2lkZXJlZCBhbmQgb3V0cHV0cyB0byBiZSBwcm9kdWNlZCBvciB1cGRhdGVkLgotICBUaGVzZSBjaGFuZ2VzIHdlcmUgZGVmaW5lZCBieSB0aGUgYXV0aG9yIHRoYXQgY3JlYXRlZCB0aGlzIHByb2Nlc3MgdG8gZXhwcmVzcwotICB0aGUgZXhhY3QgZm9jdXMgb2YgdGhlIHRhc2sgcGVyZm9ybWFuY2UgZm9yIGVhY2ggb2NjdXJyZW5jZS4gSW4gYWRkaXRpb24gdG8KLSAgdXBkYXRpbmcgdGhlIHJvbGVzLCBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMgZm9yIGEgdGFzayBkZXNjcmlwdG9yLCB5b3UKLSAgY2FuIGFsc28gcHJvdmlkZSBhZGRpdGlvbmFsIHRleHR1YWwgZGVzY3JpcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIHRoZSBleGFjdAotICBzdGVwcyBvZiB0aGUgdGFzayB0aGF0IHNob3VsZCBhbmQgc2hvdWxkIG5vdCBiZSBwZXJmb3JtZWQgZm9yIHRoaXMgcGFydGljdWxhcgotICBvY2N1cnJlbmNlIG9mIHRoZSB0YXNrLjwvcD4KLTxwPkVQRiBDb21wb3NlciBwcm92aWRlcyB5b3Ugd2l0aCBhIHByb2Nlc3MgZWRpdG9yIHRoYXQgc3VwcG9ydHMgZGlmZmVyZW50IGJyZWFrZG93biBzdHJ1Y3R1cmUKLSAgdmlld3MgYXMgd2VsbCBhcyBncmFwaGljYWwgcHJvY2VzcyBwcmVzZW50YXRpb25zLiBBcyBhIHByb2Nlc3MgYXV0aG9yLCB5b3UgdHlwaWNhbGx5Ci0gIHN0YXJ0IGJ5IGNyZWF0aW5nIGFuIGFjdGl2aXR5IGJyZWFrZG93biwgZGl2aWRpbmcgYW5kIGJyZWFraW5nIHlvdXIgcHJvY2VzcwotICBkb3duIGludG8gcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgaGlnaC1sZXZlbCBhY3Rpdml0aWVzLiBJbnN0ZWFkIG9mIGNyZWF0aW5nCi0gIHlvdXIgYWN0aXZpdGllcyBpbiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IsIHlvdSBjYW4gYWx0ZXJuYXRpdmVseSB3b3JrCi0gIGluIGEgZ3JhcGhpY2FsIGFjdGl2aXR5IGRpYWdyYW0gZWRpdG9yIHRoYXQgYWxsb3dzIHlvdSB0byBncmFwaGljYWxseSBjcmVhdGUKLSAgYSB3b3JrZmxvdyBmb3IgeW91ciBhY3Rpdml0aWVzLiBUbyBhc3NpZ24gbWV0aG9kIGNvbnRlbnQgdG8geW91ciBwcm9jZXNzLCB5b3UKLSAgdGhlbiBoYXZlIHRoZSBjaG9pY2Ugb2Ygd29ya2luZyBpbiBkaWZmZXJlbnQgcHJvY2VzcyB2aWV3cyAod29yayBicmVha2Rvd24gc3RydWN0dXJlLAotICB3b3JrIHByb2R1Y3QgdXNhZ2UsIG9yIHRlYW0gYWxsb2NhdGlvbiB2aWV3KS4gRWFjaCB2aWV3IHN1cHBvcnRzIGEgZGlmZmVyZW50Ci0gIGFwcHJvYWNoIGZvciBjcmVhdGluZyBhIHByb2Nlc3MuIFlvdSBjYW4gZGVmaW5lIHRoZSB3b3JrIHRvIGJlIGRvbmUsIGRlZmluZQotICB0aGUgcmVzdWx0cyB0byBiZSBwcm9kdWNlZCwgb3IgZGVmaW5lIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdXIgcm9sZXMuIElmIHJlcXVlc3RlZCwKLSAgdGhlIGVkaXRvciB1cGRhdGVzIHRoZSBvdGhlciBwcm9jZXNzIHZpZXdzIHNlbWktYXV0b21hdGljYWxseSB1c2luZyB3aXphcmRzCi0gIHRoYXQgcHJvbXB0IHlvdSBmb3IgZGVjaXNpb25zIG9uIHNlbGVjdGluZyBtZXRob2QgY29udGVudCBlbGVtZW50cy48L3A+Ci08cD5Gb3IgbW9yZSBkZXRhaWxzIG9uIHByb2Nlc3MgYXV0aG9yaW5nIHNlZSB0aGUgb25saW5lIGhlbHA6PC9wPgotPGRpdiBhbGlnbj0ibGVmdCI+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPlByb2Nlc3MKLSAgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD4mbmJzcDs8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHViLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wdWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNzI1NDc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wdWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3B1Ymxpc2hpbmcuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wdWJsaXNoaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgwYjhjMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3B1Ymxpc2hpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxoZWFkPgotPHRpdGxlPkNvbmZpZ3VyYXRpb24gYW5kIFB1Ymxpc2hpbmc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDM+TWV0aG9kIENvbmZpZ3VyYXRpb25zIE92ZXJ2aWV3PC9oMz4KLTxwPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgc2hpcHMgd2l0aCBhIGxvdCBvZiBjb250ZW50IG91dCBvZiB0aGUgYm94LiBJdCBpbmNsdWRlcwotICB0aGUgT3BlbiBVbmlmaWVkIFByb2Nlc3MgKE9wZW5VUCkgZnJhbWV3b3JrIGFuZCB2YXJpb3VzIHBsdWctaW5zIGV4dGVuZGluZwotICBPcGVuVVAvQmFzaWMgd2l0aCBkb21haW4tc3BlY2lmaWMgYWRkaXRpb25zLiBObyBvcmdhbml6YXRpb24gb3IgcHJvamVjdCByZXF1aXJlcyBhbGwgb2YgdGhpcwotICBkb2N1bWVudGF0aW9uIGFsbCBhdCBvbmNlLCBidXQgd291bGQgd29yayB3aXRoIGEgc2VsZWN0aW9uIG9mIHNwZWNpZmljIHN1YnNldHMuPC9wPgotPHA+IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgKEVQRiBDb21wb3NlcikgbWFuYWdlcyBmb3IgdGhhdCBwdXJwb3NlIHNvLWNhbGxlZCBtZXRob2QKLSAgY29uZmlndXJhdGlvbnMsIHdoaWNoIGFsbG93IHlvdSB0byBzcGVjaWZ5IHdvcmtpbmcgc2V0cyBvZiBjb250ZW50IGFuZCBwcm9jZXNzZXMKLSAgZm9yIGEgc3BlY2lmaWMgY29udGV4dCwgc3VjaCBhcyBhIHNwZWNpZmljIHZhcmlhbnQgb2YgdGhlIFJVUCBmcmFtZXdvcmsgdGhhdAotICB5b3Ugd2FudCB0byBwdWJsaXNoIGFuZCBkZXBsb3kgZm9yIGEgZ2l2ZW4gc29mdHdhcmUgcHJvamVjdCBvciBhcyBhIGZvdW5kYXRpb24KLSAgZm9yIGEgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uLiBBbGwgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3NlciBhcmUgb3JnYW5pemVkCi0gIGluIG1ldGhvZCBwbHVnLWlucywgd2hpY2ggYXJlIG9yZ2FuaXplZCBpbnRvIG1ldGhvZCBwYWNrYWdlcy4gQSBtZXRob2QgY29uZmlndXJhdGlvbgotICBpcyBzaW1wbHkgYSBzZWxlY3Rpb24gb2YgdGhlIG1ldGhvZCBwbHVnLWlucyBhbmQgcGFja2FnZXMuPC9wPgotPHA+PGltZyBzcmM9ImNvbmYuZ2lmIj48L3A+Ci08cD5Zb3UgY3JlYXRlIGFuZCBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB1c2luZyB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IgZGVwaWN0ZWQKLSAgaW4gdGhlIGZpZ3VyZSBhYm92ZS4gWW91IGNvdWxkIHN0YXJ0IGNyZWF0aW5nIHlvdXIgb3duIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gIGJ5IGNvcHlpbmcgb25lIG9mIHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IHNoaXAgd2l0aCBFUEYgQ29tcG9zZXIgYW5kIG1vZGlmeSBpdCB0byBmaXQKLSAgeW91ciBzcGVjaWZpYyBuZWVkcy4gWW91IGNhbiBhZGQgb3IgcmVtb3ZlIHdob2xlIG1ldGhvZCBwbHVnLWlucyBhcyB3ZWxsIGFzCi0gIG1ha2Ugc2VsZWN0aW9uIHdpdGggZWFjaCBwbHVnLWluIGJ5IGNoZWNraW5nIG9yIHVuLWNoZWNraW5nIHBhY2thZ2VzLiA8L3A+Ci08cD4gWW91IGNhbiB1c2UgdGhlIHJlc3VsdGluZyBjb25maWd1cmF0aW9uIGFzIHlvdXIgd29ya2luZyBzZXQgZm9yIHlvdXIgRVBGIENvbXBvc2VyCi0gIHdvcmsuIFRoZSBhY3R1YWwgY29udGVudCBvZiB0aGUgY29uZmlndXJhdGlvbiwgaS5lLiB0aGUgaW5jbHVkZWQgbWV0aG9kIGNvbnRlbnQKLSAgYW5kIHByb2Nlc3MgZWxlbWVudHMgYXJlIGFsd2F5cyBhY2Nlc3NpYmxlIGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuIFVzZSB0aGUKLSAgY29tYm8gYm94IGluIHRoZSB0b29sYmFyIHRvIHNlbGVjdCB0aGUgY3VycmVudGx5IHVzZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uPC9wPgotPGgzPlB1Ymxpc2hpbmcgT3ZlcnZpZXc8L2gzPgotPHA+TWV0aG9kIGNvbmZpZ3VyYXRpb25zIGFyZSB0aGUgYmFzaXMgZm9yIHB1Ymxpc2hpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4KLSAgQSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBpcyBhbiBodG1sIFdlYiBzaXRlIHRoYXQgcHJlc2VudHMgYWxsIHRoZSBtZXRob2QKLSAgY29udGVudCBhbmQgcHJvY2Vzc2VzIG9mIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiBhIG5hdmlnYWJsZSBhbmQgc2VhcmNoYWJsZQotICB3YXkuIEl0IHVzZXMgdGhlIHJlbGF0aW9uc2hpcHMgZXN0YWJsaXNoZWQgZHVyaW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzCi0gIGF1dGhvcmluZyB0byBnZW5lcmF0ZSBoeXBlcmxpbmtzIGJldHdlZW4gZWxlbWVudHMgYXMgd2VsbCBhcyBwcm92aWRlcyB0cmVlCi0gIGJyb3dzZXJzIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgYW5kIHVzZXItZGVmaW5lZCBjYXRlZ29yaXphdGlvbnMgb2YKLSAgdGhlIGNvbnRlbnQuIFRoZSBmaWd1cmUgYmVsb3cgc2hvd3MgYW4gZXhhbXBsZSBvZiB0aGUgcHVibGlzaGVkICdDbGFzc2ljIFJVUCcKLSAgbWV0aG9kIGNvbmZpZ3VyYXRpb24uPC9wPgotPHA+PGltZyBzcmM9InB1Yi5naWYiPjwvcD4KLTxwPkZvciBwdWJsaXNoaW5nIHNpbXBseSBjcmVhdGUgYW5kIHNlbGVjdCBhIGNvbmZpZ3VyYXRpb24uIFRoZSBwdWJsaWNhdGlvbiB3aXphcmQKLSAgd2lsbCBkbyB0aGUgcmVzdCBmb3IgeW91IGFuZCBvbmx5IHB1Ymxpc2ggY29udGVudCB0aGF0IGlzIHBhcnQgb2YgdGhlIG1ldGhvZAotICBjb25maWd1cmF0aW9uLiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSBhZG9wdCBjb250ZW50IHRvIHRoZSBjb25maWd1cmF0aW9uCi0gIHN1Y2ggYXMgcmVtb3ZpbmcKLSAgcmVmZXJlbmNlcyBvZiBtZXRob2QgY29udGVudCBlbGVtZW50cyB0byBlbGVtZW50cyBvdXRzaWRlIG9mIHRoZSBjb25maWd1cmF0aW9uCi0gIG9yIHJlbW92aW5nIGFjdGl2aXRpZXMgZnJvbSB5b3VyIHByb2Nlc3NlcyB0aGF0IG9ubHkgY29udGFpbiB3b3JrIGRlZmluZWQgb3V0c2lkZQotICBvZiB0aGUgY29uZmlndXJhdGlvbiBzZXQuIEhlbmNlLCBwdWJsaXNoaW5nIHdpbGwgb25seSBpbmNsdWRlIHRoZSBjb250ZW50IHRoYXQKLSAgeW91IHJlYWxseSBuZWVkLiBZb3UgY2FuIGFsd2F5cyBwcmV2aWV3IGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gdXNpbmcgRVBGIENvbXBvc2VyJ3MKLWJyb3dzaW5nIHBlcnNwZWN0aXZlLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS91bWFfaHVtcC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvdW1hX2h1bXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZTk4ZjI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS91bWFfaHVtcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3doaXRlcGFwZXIuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2hpdGVwYXBlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZWNlMzNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2hpdGVwYXBlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV2hpdGVwYXBlciIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ3aGl0ZXBhcGVyIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPldoaXRlcGFwZXI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9IndoaXRlcGFwZXIiPjxhIG5hbWU9IndoaXRlcGFwZXIiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5XaGl0ZXBhcGVyPC9oMT4KLTxkaXY+PHA+QSBXaGl0ZXBhcGVyIGlzIGEgc3BlY2lhbCB0eXBlIG9mIGNvbmNlcHQgZ3VpZGFuY2UgdGhhdCBpcyBleHRlcm5hbGx5IHJldmlld2VkCi1vciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50Ci1lbGVtZW50cyBhbmQgZ3VpZGFuY2UuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OGEyYzEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IldvcmsgUHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Indvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPldvcmsgUHJvZHVjdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0id29ya3Byb2R1Y3QiPjxhIG5hbWU9Indvcmtwcm9kdWN0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29yayBQcm9kdWN0PC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+V29yayBwcm9kdWN0IGlzIGEgZ2VuZXJhbCB0ZXJtIGZvciB0YXNrIGlucHV0cyBhbmQgb3V0cHV0cywKLWRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLAotb3IgbW9kaWZpZWQgYnkgYSB0YXNrLiBUaGUgdGhyZWUgdHlwZXMgb2Ygd29yayBwcm9kdWN0IGFyZTo8dWw+PGxpPjxhIGhyZWY9ImFydGlmYWN0Lmh0bWwjYXJ0aWZhY3QiPkFydGlmYWN0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ib3V0Y29tZS5odG1sI291dGNvbWUiPk91dGNvbWU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJkZWxpdmVyYWJsZS5odG1sI2RlbGl2ZXJhYmxlIj5EZWxpdmVyYWJsZTwvYT48L2xpPgotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0Ij5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdGRlc2NyaXB0b3JzLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzRmY2E5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IldvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0id29ya3Byb2R1Y3RkZXNjcmlwdG9ycyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Indvcmtwcm9kdWN0ZGVzY3JpcHRvcnMiPjxhIG5hbWU9Indvcmtwcm9kdWN0ZGVzY3JpcHRvcnMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnM8L2gxPgotPGRpdj48cD5BIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGlzIGEgd29yayBwcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYwotYWN0aXZpdHkuIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZgotd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIG9mIHRhc2sgZGVzY3JpcHRvcnMgYW5kIHJvbGUgZGVzY3JpcHRvcnMuIE9uZSB3b3JrCi1wcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycywgZWFjaCB3aXRoaW4gdGhlCi1jb250ZXh0IG9mIGFuIGFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0a2luZC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdGtpbmQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODdkZGIyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0a2luZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29yayBQcm9kdWN0IEtpbmQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0id29ya3Byb2R1Y3RraW5kIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPldvcmsgUHJvZHVjdCBLaW5kPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ3b3JrcHJvZHVjdGtpbmQiPjxhIG5hbWU9Indvcmtwcm9kdWN0a2luZCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldvcmsgUHJvZHVjdCBLaW5kPC9oMT4KLTxkaXY+PHA+V29yayBQcm9kdWN0IEtpbmQgaXMgYW5vdGhlciBjYXRlZ29yeSBmb3IgZ3JvdXBpbmcgPGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0czwvYT4uIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgd29yayBwcm9kdWN0Ci1raW5kcy4gQXMgYW4gZXhhbXBsZSwgeW91IG1pZ2h0IHdhbnQgdG8gaGF2ZSBhIHNlcmllcyBvZiB3b3JrIHByb2R1Y3Qga2luZHMKLXRoYXQgY29ycmVzcG9uZCB0byB0aGUgb3ZlcmFsbCBpbnRlbnQgb2Ygd29yayBwcm9kdWN0cywgc3VjaCBhcyBzcGVjaWZpY2F0aW9uLAotcGxhbiwgb3IgbW9kZWwuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyI+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9tYWluLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL21haW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMGQ0OGFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL21haW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJBYm91dCBFUEYgQ29tcG9zZXIiID4KLSAgCi08IS0tIEdldHRpbmcgU3RhcnRlZCAtLT4KLTx0b3BpYyBsYWJlbD0iR2V0dGluZyBzdGFydGVkIj4KLQk8YW5jaG9yIGlkPSJnZXR0aW5nc3RhcnRlZF9pZCIvPgotPC90b3BpYz4KLQotPCEtLSBDb25jZXB0cyAtLT4KLTx0b3BpYyBsYWJlbD0iQ29uY2VwdHMiPgotCTxhbmNob3IgaWQ9ImNvbmNlcHRzX2lkIi8+Ci08L3RvcGljPgotCi08IS0tIENyZWF0aW5nIFJldXNhYmxlIE1ldGhvZCBDb250ZW50IC0tPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyByZXVzYWJsZSBtZXRob2QgY29udGVudCI+Ci0JPGFuY2hvciBpZD0iY3JlYXRpbmdfbWV0aG9kX2NvbnRlbnRfaWQiLz4KLTwvdG9waWM+Ci0KLTwhLS0gQ2F0ZWdvcml6aW5nIE1ldGhvZCBDb250ZW50IC0tPgotPHRvcGljIGxhYmVsPSJDYXRlZ29yaXppbmcgcmV1c2FibGUgbWV0aG9kIGNvbnRlbnQiPgotCTxhbmNob3IgaWQ9ImNhdGVnb3JpemluZ19tZXRob2RfY29udGVudF9pZCIvPgotPC90b3BpYz4KLQotPCEtLSBDcmVhdGluZyBQcm9jZXNzZXMgLS0+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIHByb2Nlc3NlcyI+Ci0JPGFuY2hvciBpZD0iY3JlYXRpbmdfcHJvY2Vzc2VzX2lkIi8+Ci08L3RvcGljPgotCi08IS0tIFB1Ymxpc2hpbmcgYW5kIEV4cG9ydGluZyBNZXRob2QgQ29udGVudCAtLT4KLTx0b3BpYyBsYWJlbD0iUHVibGlzaGluZyBhbmQgZXhwb3J0aW5nIG1ldGhvZCBjb250ZW50Ij4KLQk8YW5jaG9yIGlkPSJwdWJsaXNoaW5nX2V4cG9ydGluZ19pZCIvPgotPC90b3BpYz4KLQotPCEtLSBTdXBwb3J0IGZvciBDb2RlIE1hbmFnZW1lbnQgU3lzdGVtcyAtLT4KLTx0b3BpYyBsYWJlbD0iU3VwcG9ydCBmb3IgQ29kZSBNYW5hZ2VtZW50IFN5c3RlbXMiIGhyZWY9Imh0bWwvaGVscC9jbV9vdmVydmlldy5odG1sIj4KLQk8YW5jaG9yIGlkPSJjb2RlX21hbmFnZW1lbnRfaWQiLz4KLTwvdG9waWM+Ci0KLTwhLS0gQWNjZXNzaWJpbGl0eSAtLT4KLTx0b3BpYyBsYWJlbD0iQWNjZXNzaWJpbGl0eSIgaHJlZj0iaHRtbC9oZWxwL2FjX21haW4uaHRtbCI+Ci0JPGFuY2hvciBpZD0iYWNjZXNzaWJpbGl0eV9pZCIvPgotPC90b3BpYz4KLQotCi08IS0tR2xvc3NhcnkgLS0+Ci08dG9waWMgbGFiZWw9Ikdsb3NzYXJ5Ij4KLQk8YW5jaG9yIGlkPSJnbG9zc2FyeV9pZCIvPgotPC90b3BpYz4KLSAgCi0KLTwhLS1UdXRvcmlhbHMgLS0+Ci08dG9waWMgbGFiZWw9IlR1dG9yaWFscyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxzX3N0YXJ0cGFnZS5odG0iPgotCTxhbmNob3IgaWQ9InR1dG9yaWFsc19pZCIvPgotPC90b3BpYz4KLQotPC90b2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9vdmVydmlldy54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9vdmVydmlldy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3MDhlZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvb3ZlcnZpZXcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJPdmVydmlldyIgbGlua190bz0ibWFpbi54bWwjb3ZlcnZpZXdfaWQiPgotICAgPHRvcGljIGxhYmVsPSJBYm91dCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIiBocmVmPSJodG1sL2hlbHAvYWJvdXRjb21wb3Nlci5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGF1dGhvcmluZyBvdmVydmlldyIgaHJlZj0iaHRtbC9oZWxwL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyBhdXRob3Jpbmcgb3ZlcnZpZXciIGhyZWY9Imh0bWwvaGVscC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29uZmlndXJhdGlvbnMgb3ZlcnZpZXciIGhyZWY9Imh0bWwvaGVscC9jb25maWd1cmF0aW9uc2FuZHB1Ymxpc2hpbmdvdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlVzZXIgcm9sZXMgYW5kIHJvbGUgc3BlY2lmaWMgdGFza3MiIGhyZWY9Imh0bWwvaGVscC91c2Vycm9sZXNhbmRyb2xlc3BlY2lmaWN0YXNrcy5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlYzgwMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIERvY3VtZW50YXRpb24KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0KLSMgQ2hlYXQgU2hlZXRzCi1tZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWU9TWV0aG9kIEF1dGhvcmluZyBDaGVhdCBTaGVldHMKLUNoZWF0c2hlZXRHZXRzdGFydGVkQ2F0ZWdvcnlUZXh0PUdldHRpbmcgU3RhcnRlZAotQ2hlYXRzaGVldFJldXNhYmxlQ29udGVudENhdGVnb3J5VGV4dD1DcmVhdGUgUmV1c2FibGUgTWV0aG9kIENvbnRlbnQKLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9V3JpdGUgTWV0aG9kIENvbnRlbnQKLUNoZWF0c2hlZXRQcm9jZXNzZXNDYXRlZ29yeVRleHQ9V29yayB3aXRoIFByb2Nlc3NlcwotQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudD1OYXZpZ2F0ZSBNZXRob2QgQ29udGVudAotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249Q3JlYXRlIHlvdXIgb3duIE1ldGhvZCBDb25maWd1cmF0aW9uCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kUGx1Z2luPUNyZWF0ZSB5b3VyIG93biBNZXRob2QgUGx1Zy1pbgotQ2hlYXRzaGVldEFkZE1ldGhvZENvbnRlbnQ9QWRkIG5ldyBNZXRob2QgQ29udGVudCBzdWNoIGFzIFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cywgb3IgR3VpZGFuY2UKLUNoZWF0c2hlZXRUYWlsb3JNZXRob2RFbGVtZW50cz1UYWlsb3IgZXhpc3RpbmcgTWV0aG9kIEVsZW1lbnRzIChSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMgb3IgR3VpZGFuY2UpIFVzaW5nIENvbnRyaWJ1dGlvbgotQ2hlYXRzaGVldFJlcGxhY2VNZWh0b2RFbGVtZW50cz1SZXBsYWNlIGV4aXN0aW5nIE1ldGhvZCBFbGVtZW50cyAoUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzIG9yIEd1aWRhbmNlKQotQ2hlYXRzaGVldEFkZE1ldGhvZFJlZk9ySHlwZXJsaW5rPUFkZCBhIE1ldGhvZCBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rIChVUkwpCi1DaGVhdHNoZWV0QXBwbHlDYXBhYmlsaXR5UGF0dGVybj1BcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybgotQ2hlYXRzaGVldENyZWF0ZVByb2Nlc3M9Q3JlYXRlIGEgUHJvY2VzcyAoQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIERlbGl2ZXJ5IFByb2Nlc3MpCi0KLQotCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTVjMTM4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIAk8dG9jCi0gICAgICAgICAgICBmaWxlPSJtYWluLnhtbCIKLSAgICAgICAgICAgIHByaW1hcnk9InRydWUiPgotICAgICAgCTwvdG9jPgotICAgICAgCTx0b2MKLQkJZmlsZT0iZ2V0dGluZ3N0YXJ0ZWQueG1sIj4KLSAgICAgIAk8L3RvYz4KLSAgICAgIAk8dG9jCi0JCWZpbGU9ImNvbmNlcHRzLnhtbCI+Ci0gICAgICAJPC90b2M+Ci0KLSAgICAgIAk8dG9jCi0JCWZpbGU9ImNyZWF0aW5nX21ldGhvZF9jb250ZW50LnhtbCI+Ci0gICAgICAJPC90b2M+Ci0KLSAgICAgIAk8dG9jCi0JCWZpbGU9ImNhdGVnb3JpemluZ19tZXRob2RfY29udGVudC54bWwiPgotICAgICAgCTwvdG9jPgotCi0gICAgICAJPHRvYwotCQlmaWxlPSJjcmVhdGluZ19wcm9jZXNzZXMueG1sIj4KLSAgICAgIAk8L3RvYz4KLQotICAgICAgCTx0b2MKLQkJZmlsZT0icHVibGlzaGluZ19leHBvcnRpbmcueG1sIj4KLSAgICAgIAk8L3RvYz4KLQotCTx0b2MKLQkJZmlsZT0iY29kZV9tYW5hZ2VtZW50LnhtbCI+Ci0JPC90b2M+Ci0JPHRvYwotCQlmaWxlPSJhY2Nlc3NpYmlsaXR5LnhtbCI+Ci0JPC90b2M+Ci0JPHRvYwotCQlmaWxlPSJnbG9zc2FyeS54bWwiPgotCTwvdG9jPgotCTx0b2MKLQkJZmlsZT0idHV0b3JpYWxzLnhtbCI+Ci0JPC90b2M+Ci0gICA8L2V4dGVuc2lvbj4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRjEgY29udGV4dCBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI+IAotCQk8Y29udGV4dHMgZmlsZT0iJG5sJC9jb250ZXh0c19hdXRob3JpbmdfdWkueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiLz4gCi0JPC9leHRlbnNpb24+Ci0KLSAJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI+IAotICAgICAgPGNvbnRleHRzIGZpbGU9IiRubCQvY29udGV4dHNfU2VhcmNoLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS5zZWFyY2giLz4gCi0gICAJPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiAKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5jaGVhdFNoZWV0Q29udGVudCIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMiCi0gICAgICAgICBuYW1lPSIlbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5nZXRzdGFydGVkIiAKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0R2V0c3RhcnRlZENhdGVnb3J5VGV4dCIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMubmF2aWdhdGVtZXRob2Rjb250ZW50IgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5nZXRzdGFydGVkIgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvbmF2aWdhdGVtZXRob2Rjb250ZW50LnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0TmF2aWdhdGVNZXRob2RDb250ZW50Ii8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5jcmVhdGVtZXRob2Rjb25maWd1cmF0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5nZXRzdGFydGVkIgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvY3JlYXRlbWV0aG9kY29uZmlndXJhdGlvbi54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmNyZWF0ZW1ldGhvZHBsdWdpbiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuZ2V0c3RhcnRlZCIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZHBsdWdpbi54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldENyZWF0ZU1ldGhvZFBsdWdpbiIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5jaGVhdFNoZWV0Q29udGVudCIgCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzIiAKLSAgICAgICAgIG5hbWU9IiVtZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWUiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnJlc3VhYmxlLmNvbnRlbnQiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldFJldXNhYmxlQ29udGVudENhdGVnb3J5VGV4dCIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuYWRkbmV3bWV0aG9kY29udGVudCIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMucmVzdWFibGUuY29udGVudCIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2FkZG5ld21ldGhvZGNvbnRlbnQueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRBZGRNZXRob2RDb250ZW50Ii8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy50YWlsb3JleGlzdGluZ21ldGhvZGVsZW1lbnRzIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5yZXN1YWJsZS5jb250ZW50IgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvdGFpbG9yZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldFRhaWxvck1ldGhvZEVsZW1lbnRzIi8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5yZXBsYWNlZXhpc3RpbmdtZXRob2RlbGVtZW50cyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMucmVzdWFibGUuY29udGVudCIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL3JlcGxhY2VleGlzdGluZ21ldGhvZGVsZW1lbnRzLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0UmVwbGFjZU1laHRvZEVsZW1lbnRzIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmNoZWF0U2hlZXRDb250ZW50IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cyIKLSAgICAgICAgIG5hbWU9IiVtZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWUiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLndyaXRlLmNvbnRlbnQiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldFdyaXRlQ29udGVudENhdGVnb3J5VGV4dCIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuYWRkbWV0aG9kcmVmX29yX2h5cGVybGluayIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMud3JpdGUuY29udGVudCIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2FkZG1ldGhvZHJlZl9vcl9oeXBlcmxpbmsueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRBZGRNZXRob2RSZWZPckh5cGVybGluayIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5jaGVhdFNoZWV0Q29udGVudCIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMiCi0gICAgICAgICBuYW1lPSIlbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5wcm9jZXNzZXMiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldFByb2Nlc3Nlc0NhdGVnb3J5VGV4dCIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuYXBwbHljYXBhYmlsaXR5cGF0dGVybiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMucHJvY2Vzc2VzIgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvYXBwbHljYXBhYmlsaXR5cGF0dGVybi54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldEFwcGx5Q2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmNyZWF0ZWFwcm9jZXNzIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5wcm9jZXNzZXMiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9jcmVhdGVhcHJvY2Vzcy54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldENyZWF0ZVByb2Nlc3MiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wdWJsaXNoYW5kZXhwb3J0LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3B1Ymxpc2hhbmRleHBvcnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MTJlYzMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3B1Ymxpc2hhbmRleHBvcnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJQdWJsaXNoaW5nIGFuZCBleHBvcnRpbmciIGxpbmtfdG89Im1haW4ueG1sI3B1Ymxpc2hhbmRleHBvcnRfaWQiPgotICAgPHRvcGljIGxhYmVsPSJQdWJsaXNoaW5nIG92ZXJ2aWV3IiBocmVmPSJodG1sL2hlbHAvcHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUHVibGlzaGluZyBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvIGEgbWV0aG9kIHdlYiIgaHJlZj0iaHRtbC9oZWxwL3B1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYi5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3B1Ymxpc2hpbmdfZXhwb3J0aW5nLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3B1Ymxpc2hpbmdfZXhwb3J0aW5nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTQ3MGYwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wdWJsaXNoaW5nX2V4cG9ydGluZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHRvYyBsYWJlbD0iUHVibGlzaGluZyBhbmQgZXhwb3J0aW5nIG1ldGhvZCBjb250ZW50IiBsaW5rX3RvPSJtYWluLnhtbCNwdWJsaXNoaW5nX2V4cG9ydGluZ19pZCI+ICAKLQk8dG9waWMgbGFiZWw9IlB1Ymxpc2hpbmcgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0byBhIG1ldGhvZCB3ZWIiIGhyZWY9Imh0bWwvaGVscC9wdWJsaXNoaW5nLmh0bWwiLz4KLQk8dG9waWMgbGFiZWw9IkV4cG9ydGluZyB0byBNaWNyb3NvZnQgUHJvamVjdCIgaHJlZj0iaHRtbC9oZWxwL2V4cG9ydF90b19tc3Byb2plY3QuaHRtbCIvPgotCTx0b3BpYyBsYWJlbD0iWE1MIEltcG9ydC9FeHBvcnQiIGhyZWY9Imh0bWwvaGVscC9leHBvcnRfdG9feG1sLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcmVmZXJlbmNlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3JlZmVyZW5jZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3YTZiYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcmVmZXJlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iUmVmZXJlbmNlIiBsaW5rX3RvPSJtYWluLnhtbCNyZWZlcmVuY2VfaWQiPgotICAgPHRvcGljIGxhYmVsPSJTdXBvcnQgZm9yIGNvZGUgbWFuYWdlbWVudCBzeXN0ZW1zIiBocmVmPSJodG1sL2hlbHAvY21fb3ZlcnZpZXcuaHRtbCI+Ci0gICA8dG9waWMgbGFiZWw9IlN1cHBvcnQgZm9yIENWUyIgaHJlZj0iaHRtbC9oZWxwL2NtX2N2cy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlN1cG9ydCBmb3IgUmF0aW9uYWwgQ2xlYXJDYXNlIiBocmVmPSJodG1sL2hlbHAvY21fcmF0aW9uYWxjYy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlN1cHBvcnQgZm9yIFJhdGlvbmFsIENDUkMiIGhyZWY9Imh0bWwvaGVscC9jbV9jY3JjLmh0bWwiLz4KLTwvdG9waWM+Ci0KLSAgIDx0b3BpYyBsYWJlbD0iQWNjZXNzaWJpbGl0eSIgaHJlZj0iaHRtbC9oZWxwL2FjX21haW4uaHRtbCI+Ci0gICA8dG9waWMgbGFiZWw9IktleWJvYXJkIG5hdmlnYXRpb24iIGhyZWY9Imh0bWwvaGVscC9hY19uYXZpZ2F0aW9uLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRm9udHMgYW5kIGNvbG9ycyIgaHJlZj0iaHRtbC9oZWxwL2FjX2ZvbnRzYW5kY29sb3JzLmh0bWwiLz4KLTwvdG9waWM+Ci0gICAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvc3JjL29yZy9lY2xpcHNlL2VwZi9oZWxwL2RvYy9Eb2NQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3NyYy9vcmcvZWNsaXBzZS9lcGYvaGVscC9kb2MvRG9jUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzZGE5M2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvc3JjL29yZy9lY2xpcHNlL2VwZi9oZWxwL2RvYy9Eb2NQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgRG9jUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIERvY1BsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIERvY1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotLy8JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotLy8JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IERvY1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLS8vCQl0cnkgewotLy8JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLS8vCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotLy8JCQlyZXR1cm4ga2V5OwotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLS8vCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLS8vCQl0cnkgewotLy8JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLS8vCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuRG9jUGx1Z2luUmVzb3VyY2VzIik7Ci0vLwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLS8vCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotLy8JCX0KLS8vCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotLy8JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0vLwkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jIiwgcGF0aCk7Ci0vLwl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9zcmMvb3JnL2VjbGlwc2UvZXBmL2hlbHAvZG9jL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3NyYy9vcmcvZWNsaXBzZS9lcGYvaGVscC9kb2MvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYmRiODZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3NyYy9vcmcvZWNsaXBzZS9lcGYvaGVscC9kb2MvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIERvY3VtZW50YXRpb24gcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdGFza3MueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdGFza3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDQ2MTY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3Rhc2tzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iVGFza3MiIGxpbmtfdG89Im1haW4ueG1sI3Rhc2tzX2lkIj4gIAotCi0gIDwhLS0gQ3JlYXRpbmcgcmV1c2FibGUgbWV0aG9kIGNvbnRlbnQgLS0+Ci0gIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgcmV1c2FibGUgbWV0aG9kIGNvbnRlbnQiPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIiBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIHZpZXcgd2l0aCBjdXN0b20gY2F0ZWdvcmllcyIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jdXN0b21fY2F0ZWdvcmllcy5odG1sIi8+IAotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX2NvbnRlbnQuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHJvbGUiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfcm9sZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHRhc2siIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfdGFzay5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHdvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV93b3JrcHJvZHVjdC5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBndWlkYW5jZSIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9ndWlkYW5jZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBDb250ZW50IFZhcmlhYmlsaXR5IiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHkuaHRtbCI+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkNvbnRyaWJ1dGVzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfY29udHJpYnV0ZXMuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJFeHRlbmRzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfZXh0ZW5kcy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IlJlcGxhY2VzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfcmVwbGFjZS5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkFzc29jaWF0aW9ucyBpbXBhY3RlZCBieSB2YXJpYWJpbGl0eSIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2Fzc29jaWF0aW9ucy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkJyb3dzaW5nIHZhcmlhYmlsaXR5IGFzc29jaWF0aW9ucyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2Jyb3dzaW5nLmh0bWwiLz4KLSAgICAgIDwvdG9waWM+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJCcm93c2UgYW5kIHByZXZpZXcgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9icm93c2VfY29udGVudC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGluZGV4IGVudHJpZXMiIGhyZWY9Imh0bWwvaGVscC9pbmRleGluZy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGdsb3NzYXJ5IGVudHJpZXMiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeV9lbnRyaWVzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ2hhbmdpbmcgY29weXJpZ2h0IG5vdGljZXMiIGhyZWY9Imh0bWwvaGVscC9jaGFuZ2luZ19jb3B5cmlnaHQuaHRtbCIvPgotPC90b3BpYz4KLQotICA8IS0tIENhdGVnb3JpemluZyBtZXRob2QgY29udGVudCAtLT4KLSAgPHRvcGljIGxhYmVsPSJDYXRlZ29yaXppbmcgbWV0aG9kIGNvbnRlbnQiPgotICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIG1ldGhvZCB2aWV3IHdpdGggY3VzdG9tIGNhdGVnb3JpZXMiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfY3VzdG9tX2NhdGVnb3JpZXMuaHRtbCIvPjwvdG9waWM+Ci0KLSAgPCEtLSBDcmVhdGluZyBwcm9jZXNzZXMgLS0+Ci0gIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgcHJvY2Vzc2VzIj4KLSAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSByZXVzYWJsZSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfY2FwYWJpbGl0eV9wYXR0ZXJuLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBkZWxpdmVyeSBwcm9jZXNzIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2RlbGl2ZXJ5X3Byb2Nlc3MuaHRtbCI+Ci0gIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3Bfd2JzLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJEZXZlbG9wIGEgdGVhbSBhbGxvY2F0aW9uIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3BfdGVhbV9zdHJ1Y3R1cmUuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB3b3JrIHByb2R1Y3QgdXNhZ2Ugc3RydWN0dXJlIiBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF93b3JrcHJvZHVjdF9zdHJ1Y3R1cmUuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkFwcGx5IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL2hlbHAvYXBwbHlfY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IlByb2Nlc3MgZWxlbWVudCBwcm9wZXJ0aWVzIFZpZXciIGhyZWY9Imh0bWwvaGVscC9wcm9wZXJ0aWVzX3ZpZXcuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IlVzaW5nIGRlZXAgY29weSIgaHJlZj0iaHRtbC9oZWxwL3VzaW5nX2RlZXBfY29weS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iVXNpbmcgYWN0aXZpdHkgdmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvaGVscC91c2luZ19hY3Rpdml0eV92YXJpYWJpbGl0eS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIHByb2Nlc3MgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9wcm9jZXNzX2RpYWdyYW1zLmh0bWwiPgotICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBhY3Rpdml0eSBkaWFncmFtcyIgaHJlZj0iaHRtbC9oZWxwL2FjdGl2aXR5X2RpYWdyYW1zLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIiBocmVmPSJodG1sL2hlbHAvYWN0aXZpdHlfZGV0YWlsX2RpYWdyYW1zLmh0bWwiLz4KLQotICA8L3RvcGljPgotCi0gIDwhLS0gUHVibGlzaGluZyBNZXRob2QgQ29udGVudCAtLT4KLSAgPHRvcGljIGxhYmVsPSJQdWJsaXNoaW5nIGFuZCBleHBvcnRpbmcgbWV0aG9kIGNvbnRlbnQiPgotICAgPHRvcGljIGxhYmVsPSJQdWJsaXNoaW5nIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8gYSBtZXRob2Qgd2ViIiBocmVmPSJodG1sL2hlbHAvcHVibGlzaGluZy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkV4cG9ydGluZyB0byBNaWNyb3NvZnQgUHJvamVjdCIgaHJlZj0iaHRtbC9oZWxwL2V4cG9ydF90b19tc3Byb2plY3QuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJYTUwgSW1wb3J0L0V4cG9ydCIgaHJlZj0iaHRtbC9oZWxwL2V4cG9ydF90b194bWwuaHRtbCIvPgotIDwvdG9waWM+Ci0KLSAgPCEtLSBXb3JraW5nIHdpdGggVGV4dHVhbCBEZXNjcmlwdGlvbnMgLS0+Ci0gPHRvcGljIGxhYmVsPSJSaWNoIHRleHQgZWRpdG9yIiBocmVmPSJodG1sL2hlbHAvcmljaHRleHRlZGl0b3IuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJBZGQgYSByZWZlcmVuY2Ugb3IgaHlwZXJsaW5rIiBocmVmPSJodG1sL2hlbHAvYWRkX2h5cGVybGluay5odG1sIi8+Ci0gIDwvdG9waWM+Ci0gIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvYy54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwODU5NmM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciIgdG9waWM9Imh0bWwvdG9jLmh0bWwiPgotICAgPHRvcGljIGxhYmVsPSJHZXR0aW5nIFN0YXJ0ZWQiPgotICAgICAgPGFuY2hvciBpZD0iZ2V0dGluZ3N0YXJ0ZWQiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkNvbmNlcHRzIj4KLSAgICAgIDxhbmNob3IgaWQ9ImNvbmNlcHRzIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJUYXNrcyI+Ci0gICAgICA8YW5jaG9yIGlkPSJ0YXNrcyIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iUmVmZXJlbmNlIj4KLSAgICAgIDxhbmNob3IgaWQ9InJlZmVyZW5jZSIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iU2FtcGxlcyI+Ci0gICAgICA8YW5jaG9yIGlkPSJzYW1wbGVzIi8+Ci0gICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2Njb25jZXB0cy54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2Njb25jZXB0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ2MDllMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jY29uY2VwdHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkNvbmNlcHRzIiBsaW5rX3RvPSJ0b2MueG1sI2NvbmNlcHRzIj4gCi0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIiAgaHJlZj0iaHRtbC9jb25jZXB0cy9tYWludG9waWMuaHRtbCI+IAotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyIgaHJlZj0iaHRtbC9jb25jZXB0cy9zdWJ0b3BpYy5odG1sIiAvPiAKLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyAyIj4KLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMgMiIgaHJlZj0iaHRtbC9jb25jZXB0cy9zdWJ0b3BpYzIuaHRtbCIgLz4gCi0JPC90b3BpYz4gCi08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY2dldHRpbmdzdGFydGVkLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY2dldHRpbmdzdGFydGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWZhYjMxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NnZXR0aW5nc3RhcnRlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iR2V0dGluZyBTdGFydGVkIiBsaW5rX3RvPSJ0b2MueG1sI2dldHRpbmdzdGFydGVkIj4gCi0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIiAgaHJlZj0iaHRtbC9nZXR0aW5nc3RhcnRlZC9tYWludG9waWMuaHRtbCI+IAotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyIgaHJlZj0iaHRtbC9nZXR0aW5nc3RhcnRlZC9zdWJ0b3BpYy5odG1sIiAvPiAKLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyAyIj4KLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMgMiIgaHJlZj0iaHRtbC9nZXR0aW5nc3RhcnRlZC9zdWJ0b3BpYzIuaHRtbCIgLz4KLQk8L3RvcGljPiAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jcmVmZXJlbmNlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY3JlZmVyZW5jZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1NWM1YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jcmVmZXJlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJSZWZlcmVuY2UiIGxpbmtfdG89InRvYy54bWwjcmVmZXJlbmNlIj4gCi0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIiAgaHJlZj0iaHRtbC9yZWZlcmVuY2UvbWFpbnRvcGljLmh0bWwiPiAKLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMiIGhyZWY9Imh0bWwvcmVmZXJlbmNlL3N1YnRvcGljLmh0bWwiIC8+IAotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIDIiPgotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyAyIiBocmVmPSJodG1sL3JlZmVyZW5jZS9zdWJ0b3BpYzIuaHRtbCIgLz4gCi0JPC90b3BpYz4gCi08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY3NhbXBsZXMueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jc2FtcGxlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5N2VmYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jc2FtcGxlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iU2FtcGxlcyIgbGlua190bz0idG9jLnhtbCNzYW1wbGVzIj4gCi0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIiAgaHJlZj0iaHRtbC9zYW1wbGVzL21haW50b3BpYy5odG1sIj4gCi0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIiBocmVmPSJodG1sL3NhbXBsZXMvc3VidG9waWMuaHRtbCIgLz4gCi0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMgMiI+Ci0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIDIiIGhyZWY9Imh0bWwvc2FtcGxlcy9zdWJ0b3BpYzIuaHRtbCIgLz4gCi0JPC90b3BpYz4gCi08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY3Rhc2tzLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY3Rhc2tzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzIxNDU0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2N0YXNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iVGFza3MiIGxpbmtfdG89InRvYy54bWwjdGFza3MiPiAKLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMiICBocmVmPSJodG1sL3Rhc2tzL21haW50b3BpYy5odG1sIj4gCi0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIiBocmVmPSJodG1sL3Rhc2tzL3N1YnRvcGljLmh0bWwiIC8+IAotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIDIiPgotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyAyIiBocmVmPSJodG1sL3Rhc2tzL3N1YnRvcGljMi5odG1sIiAvPiAKLQk8L3RvcGljPiAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdHV0b3JpYWxzLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3R1dG9yaWFscy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjYTg2OGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdHV0b3JpYWxzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iVHV0b3JpYWxzIiBsaW5rX3RvPSJtYWluLnhtbCN0dXRvcmlhbHNfaWQiPgotICAgPHRvcGljIGxhYmVsPSJFeHBsb3JlIHRoZSB1c2VyIGludGVyZmFjZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9pbnRyby5odG0iPgotCTx0b3BpYyBsYWJlbD0iQ29uY2VwdHMiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDFfY29uY2VwdHMuaHRtIiAvPiAKLSAgIAk8dG9waWMgbGFiZWw9IkJhc2ljIG5hdmlnYXRpb24iIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDFfZXgxLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkJyb3dzZSBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9leDIuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQnJvd3NlIHByb2Nlc3MgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9leDMuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQnJvd3NlIHdoaWxlIGF1dGhvcmluZyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9leDQuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iU2VhcmNoIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQxX2V4NS5odG0iIC8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfaW50cm8uaHRtIj4KLQk8dG9waWMgbGFiZWw9IkNvbmNlcHRzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2NvbmNlcHRzLmh0bSIgLz4gCi0JPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBjb250ZW50IHBhY2thZ2UiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfZXgxLmh0bSIgLz4KLQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHdvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDIuaHRtIiAvPgotCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgcm9sZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDMuaHRtIiAvPgotCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgdGFzayIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDQuaHRtIiAvPgotCTx0b3BpYyBsYWJlbD0iV29yayB3aXRoIHN0ZXBzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4NS5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBndWlkYW5jZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDYuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iTWFuYWdlIGd1aWRhbmNlIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4Ny5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBzdGFuZGFyZCBjYXRlZ29yeSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDguaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQWRkIGEgcGx1Zy1pbiIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDkuaHRtIiAvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iUmV1c2UgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfaW50cm8uaHRtIj4KLSAgIAk8dG9waWMgbGFiZWw9IkNvbmNlcHRzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQzX2NvbmNlcHRzLmh0bSIgLz4gCi0gICAJPHRvcGljIGxhYmVsPSJDb250cmlidXRlIHRvIGEgcm9sZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDEuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQ29udHJpYnV0ZSB0byBhIHdvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDIuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQ29udHJpYnV0ZSB0byBhIHRhc2siIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfZXgzLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkV4dGVuZCBhIHJvbGUiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfZXg0Lmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkV4dGVuZCBhIHdvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDUuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iRXh0ZW5kIGEgdGFzayIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDYuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iUmVwbGFjZSBhIHJvbGUiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfZXg3Lmh0bSIgLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBwcm9jZXNzZXMiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDVfaW50cm8uaHRtIj4KLSAgICAgICAJPHRvcGljIGxhYmVsPSJDb25jZXB0cyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NV9jb25jZXB0cy5odG0iIC8+IAotICAgCTx0b3BpYyBsYWJlbD0iQnJvd3NlIHByb2Nlc3MgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NV9leDEuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iRXhwbG9yZSBwcm9jZXNzIGNvbnRlbnQiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDVfZXgyLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDVfZXgzLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IlVzZSBjYXBhYmlsaXR5IHBhdHRlcm5zIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ1X2V4NC5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBwcm9jZXNzIGRpYWdyYW0iIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDVfZXg1Lmh0bSIgLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IlB1Ymxpc2hpbmcgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDRfaW50cm8uaHRtIj4KLSAgICAgICAJPHRvcGljIGxhYmVsPSJDb25jZXB0cyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NF9jb25jZXB0cy5odG0iIC8+IAotICAgCTx0b3BpYyBsYWJlbD0iUHVibGlzaCBhIGNvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDRfZXgxLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NF9leDIuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgY3VzdG9tIGNvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDRfZXgzLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IlB1Ymxpc2ggYSBjdXN0b20gY29uZmlndXJhdGlvbiIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NF9leDQuaHRtIiAvPgotICAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvd29ya3dpdGh0ZXh0ZGVzYy54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy93b3Jrd2l0aHRleHRkZXNjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDI4NzZmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy93b3Jrd2l0aHRleHRkZXNjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iV29ya2luZyB3aXRoIFRleHR1YWwgRGVzY3JpcHRpb25zIiBsaW5rX3RvPSJtYWluLnhtbCN3b3Jrd2l0aHRleHRkZXNjX2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iUmljaCBUZXh0IEVkaXRvciIgaHJlZj0iaHRtbC9oZWxwL3JpY2h0ZXh0ZWRpdG9yLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQWRkIGEgUmVmZXJlbmNlIG9yIEh5cGVybGluayIgaHJlZj0iaHRtbC9oZWxwL2FkZF9oeXBlcmxpbmsuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzOWQxZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgeG1sIGltcG9ydCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjI3NTk5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWw8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0OTYzY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwsCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwucHJlZmVyZW5jZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuc2VydmljZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwud2l6YXJkcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OGJjYzJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2ljb25zL2Z1bGwvb2JqMTYvWE1MRmlsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2ljb25zL2Z1bGwvb2JqMTYvWE1MRmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzYjQ0YmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9pY29ucy9mdWxsL29iajE2L1hNTEZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9pY29ucy9mdWxsL3dpemJhbi9JbXBvcnRYTUwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9pY29ucy9mdWxsL3dpemJhbi9JbXBvcnRYTUwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjQ5ODMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvaWNvbnMvZnVsbC93aXpiYW4vSW1wb3J0WE1MLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDEwNTgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgSW1wb3J0IFhNTCBQbHVnLWluCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyBJbXBvcnQgWE1MIFdpemFyZAotaW1wb3J0WE1MV2l6YXJkTmFtZT1YTUwKLWltcG9ydFhNTFdpemFyZERlc2NyaXB0aW9uPUltcG9ydCBtZXRob2QgbGlicmFyeSBjb250ZW50IHN0b3JlZCBpbiBhIFhNTCBmaWxlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZmJhYWVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwud2l6YXJkcy5JbXBvcnRYTUxXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L1hNTEZpbGUuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLndpemFyZHMuSW1wb3J0WE1MV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJWltcG9ydFhNTFdpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJWltcG9ydFhNTFdpemFyZERlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLndpemFyZHMuSW1wb3J0WE1MV2l6YXJkIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9JbXBvcnRYTUxQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL0ltcG9ydFhNTFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OTRjNGM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL0ltcG9ydFhNTFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRYTUxQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgSW1wb3J0WE1MUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEltcG9ydFhNTFBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJCi0JCS8vIHNldCB0aGlzIHRvIGFsbG93IHBhcnNlIGxhcmdlIHhtbCBmaWxlCi0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiZW50aXR5RXhwYW5zaW9uTGltaXQiLCAiMTAwMDAwMDAwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1wb3J0WE1MUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9JbXBvcnRYTUxSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL0ltcG9ydFhNTFJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYWRjOGE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL0ltcG9ydFhNTFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgWE1MIG1lc3NhZ2UgcmVzb3VyY2UgYnVuZGxlIGFjY2Vzc29yIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEltcG9ydFhNTFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBJbXBvcnRYTUxSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbXBvcnRYTUxSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFhNTFdpemFyZF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcHRpb25Hcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3ZlcndyaXRlUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1lcmdlUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydGluZ1hNTF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2aWV3X2xvZ19maWxlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFhNTEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFhNTEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRYTUxGaWxlX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X25vdF9oYW5kbGVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRYTUxTZXJ2aWNlX2ltcG9ydF9mYWlsZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MU2VydmljZV9lcnJvcl9taXNzaW5nX3BsdWdpbnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X2Vycm9yX25vX2VjbGFzczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfbm9fcGFja2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X29iamVjdF9zdHJpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlXzI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSW1wb3J0WE1MUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDhiMDVmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6Ci0jCi0KLSMgSW1wb3J0IFhNTCBXaXphcmQKLWltcG9ydFhNTFdpemFyZF90aXRsZT1JbXBvcnQgWE1MCi0KLSMgU2VsZWN0IEltcG9ydCBYTUwgRmlsZSBXaXphcmQgUGFnZQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9U3BlY2lmeSBpbXBvcnQgZmlsZQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1TcGVjaWZ5IHRoZSBYTUwgZmlsZSBjb250YWluaW5nIHRoZSBtZXRob2QgbGlicmFyeSBjb250ZW50IHRvIGltcG9ydCwgYW5kIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgaW1wb3J0IG9wZXJhdGlvbiB0byBwZXJmb3JtLgotZmlsZUxhYmVsX3RleHQ9WE1MIEZpbGU6Ci1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLW9wdGlvbkdyb3VwX3RleHQ9SW1wb3J0IG9wdGlvbgotb3ZlcndyaXRlUmFkaW9CdXR0b25fdGV4dD1PdmVycmlkZSBleGlzdGluZyBtZXRob2QgbGlicmFyeSBjb250ZW50IHdpdGggdGhlIGltcG9ydGVkIGNvbnRlbnQKLW1lcmdlUmFkaW9CdXR0b25fdGV4dD1NZXJnZSBpbXBvcnRlZCBjb250ZW50IGludG8gdGhlIGV4aXN0aW5nIG1ldGhvZCBsaWJyYXJ5Ci0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMKLWltcG9ydGluZ1hNTF90ZXh0PUltcG9ydGluZyBYTUwgbGlicmFyeSBjb250ZW50IGludG8gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuLi4KLQotIyBJbXBvcnQgWE1MIEVycm9yIERpYWxvZwotcmV2aWV3X2xvZ19maWxlcz1UaGUgaW1wb3J0IG9wZXJhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuIFJldmlldyB0aGUgbG9nIGZpbGVzIGluIHRoZSBcbicnezB9JycgZm9sZGVyIGZvciBhbnkgZXJyb3JzLgotaW1wb3J0WE1MRXJyb3JfbXNnPUlVUE0wMDAwRTogVGhlIGltcG9ydCBvcGVyYXRpb24gY2Fubm90IHByb2NlZWQuCi1pbXBvcnRYTUxFcnJvcl9yZWFzb249SVVQTTAwMDlFOiBUaGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBpcyByZWFkLW9ubHkuXG5cbk1ha2Ugc3VyZSB0aGF0ICcnezB9JycgaXMgd3JpdGFibGUgb3IgY3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5IGFuZCB0cnkgYWdhaW4uCi0KLSMgRXJyb3IgTWVzc2FnZXMKLWludmFsaWRYTUxGaWxlX2Vycm9yPVRoZSBzcGVjaWZpZWQgWE1MIGZpbGUgaXMgbm90IHZhbGlkLgotdmVyc2lvbk1pc21hdGNoX29sZERhdGE9SVVQTTAwMTBFOiBUaGUgc3BlY2lmaWVkIFhNTCBmaWxlIHdhcyBleHBvcnRlZCBieSBhIHByZXZpb3VzIHZlcnNpb24gKHswfSkgb2YgezF9LiBUaGUgZmlsZXMgbXVzdCBiZSBleHBvcnRlZCB1c2luZyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHsxfS4KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQTTAwMTFFOiBUaGUgc3BlY2lmaWVkIFhNTCBmaWxlIHdhcyBleHBvcnRlZCBieSBhIHByZXZpb3VzIHZlcnNpb24gb2YgezB9LiBUaGUgZmlsZXMgbXVzdCBiZSBleHBvcnRlZCB1c2luZyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHswfS4KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUE0wMDEyRTogVGhlIHNwZWNpZmllZCBYTUwgZmlsZSB3YXMgZXhwb3J0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uICh7MH0pIG9mIHsxfS4gWW91IG11c3QgdXBncmFkZSB7MX0gaW4gb3JkZXIgdG8gaW1wb3J0IHRoZSBmaWxlLiAgCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUE0wMDEzRTogVGhlIHNwZWNpZmllZCBYTUwgZmlsZSBjYW5ub3QgYmUgb3BlbmVkLiBZb3UgbXVzdCB1cGdyYWRlIHswfSBpbiBvcmRlciB0byBpbXBvcnQgdGhlIGZpbGUuICAKLQotaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X25vdF9oYW5kbGVkPUVsZW1lbnQgbm90IGhhbmRsZWQ6IHswfQotaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQ9RWxlbWVudCB3aXRob3V0IElEOiB7MH0KLWltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZD1JbXBvcnQgZmFpbGVkOiB7MH0KLWltcG9ydFhNTFNlcnZpY2VfbWlzc2luZ19wbHVnaW49TWlzc2luZyByZXF1aXJlZCBwbHVnaW4gezB9Ci1pbXBvcnRYTUxTZXJ2aWNlX2Vycm9yX21pc3NpbmdfcGx1Z2lucz1NaXNzaW5nIHJlcXVpcmVkIHBsdWdpbihzKS4gUGxlYXNlIGNoZWNrIHRoZSBsb2cgZmlsZXMgZm9yIGRldGFpbAotCi1saWJyYXJ5X2Vycm9yX25vX2VjbGFzcz1FcnJvciBjcmVhdGluZyBDb250ZW50Q2F0ZWdvcnk6IFVuYWJsZSB0byBnZXQgRUNsYXNzIGZvciB7MH0KLWxpYnJhcnlfbm9fcGFja2FnZT1VbmFibGUgdG8gZmluZCBvd25pbmcgcGFja2FnZSBmb3Igb2JqZWN0IHswfQotbGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudD1FcnJvciBjcmVhdGluZyBlbGVtZW50OiB7MH0KLWxpYnJhcnlfb2JqZWN0X3N0cmluZz1vYmplY3QgezB9LCBmZWF0dXJlIHsxfQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzI9RXJyb3Igc2V0dGluZyBhdHRyaWJ1dGU6IEludmFsaWQgYXR0cmlidXRlIGZlYXR1cmUgdmFsdWUgezB9Ci1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGU9RXJyb3Igc2V0dGluZyBhdHRyaWJ1dGUgZm9yIG9iamVjdCB7MH0sIGZlYXR1cmUgezF9LCBhbmQgdmFsdWUgezJ9Ci1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMz1Eb24nJ3Qga25vdyBob3cgdG8gc2V0dGluZyBhdHRyaWJ1dGUgZm9yIG9iamVjdCB7MH0sIGZlYXR1cmUgezF9LCBhbmQgdmFsdWUgezJ9Ci1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9RXJyb3Igc2V0dGluZyByZWZlcmVuY2UgZm9yIGZlYXR1cmUgezB9OiBubyBlbGVtZW50IHdpdGggaWQgezF9Ci1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMj1FcnJvciBzZXR0aW5nIHJlZmVyZW5jZSBmb3Igb2JqZWN0IHswfSwgZmVhdHVyZSB7MX0sIGFuZCB2YWx1ZSB7Mn0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MWE3MjM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBhY3RpdmF0b3IgZm9yIG1hbmFnaW5nIHRoZSBJbXBvcnQgWE1MIHBsdWctaW4ncyBsaWZlIGN5Y2xlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3ByZWZlcmVuY2VzL0ltcG9ydFhNTFByZWZlcmVuY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wcmVmZXJlbmNlcy9JbXBvcnRYTUxQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkODU1NzkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3ByZWZlcmVuY2VzL0ltcG9ydFhNTFByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBYTUwgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0WE1MUHJlZmVyZW5jZXMgewotCi0JLyoqCi0JICogVGhlIGltcG9ydCBYTUwgZmlsZSBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRklMRSA9ICJ4bWxGaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIG1lcmdlIG9wdGlvbiBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVJHRV9PUFRJT04gPSAibWVyZ2VPcHRpb24iOyAvLyROT04tTkxTLTEkCQotCi0Jc3RhdGljIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoWE1MX0ZJTEUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KE1FUkdFX09QVElPTiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgWE1MIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbXBvcnQgWE1MIGZpbGUgcHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFhNTEZpbGUoKSB7Ci0JCXJldHVybiBJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQlYTUxfRklMRSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1wb3J0IFhNTCBmaWxlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgWE1MIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0WE1MRmlsZShTdHJpbmcgcGF0aCkgewotCQlJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTF9GSUxFLAotCQkJCXBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lcmdlIG9wdGlvbiBmaWxlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgbWVyZ2Ugb3B0aW9uIGZpbGUgcHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRNZXJnZU9wdGlvbigpIHsKLQkJcmV0dXJuIEltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlNRVJHRV9PUFRJT04pOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1lcmdlIG9wdGlvbiBmaWxlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIG1lcmdlT3B0aW9uCi0JICogICAgICAgICAgICB0aGUgdXNlciBzcGVjaWZpZWQgbWVyZ2Ugb3B0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldE1lcmdlT3B0aW9uKGJvb2xlYW4gbWVyZ2VPcHRpb24pIHsKLQkJSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlNRVJHRV9PUFRJT04sIG1lcmdlT3B0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWIxNjRmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSBJbXBvcnQgWE1MIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0UmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9JbXBvcnRSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDkyMTA4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9JbXBvcnRSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5CYXNlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5VcmxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogcmVzb3VyY2UgaGFuZGxlciBmb3IgY29udGVudCBpbiB0aGUgaW1wb3J0ZWQgbGlicmFyeQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFJlc291cmNlSGFuZGxlciBleHRlbmRzIEJhc2VSZXNvdXJjZUhhbmRsZXIgewotCi0JCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBzb3VyY2VMaWJSb290Ci0JICogQHBhcmFtIHRhcmdldExpYlJvb3QKLQkgKi8KLQlwdWJsaWMgSW1wb3J0UmVzb3VyY2VIYW5kbGVyKEZpbGUgc291cmNlTGliUm9vdCwgRmlsZSB0YXJnZXRMaWJSb290KSB7Ci0JCXN1cGVyKHNvdXJjZUxpYlJvb3QsIHRhcmdldExpYlJvb3QpOwotCX0KLQkKLQkvKioKLQkgKiByZXNvbHZlIHRoZSB1cmwuIHB1dCB0aGUgcmVzb3VyY2VzIGludG8gdGhlIGxvY2F0aW9uIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IHJlc291cmNlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgotCSAqLwotCXB1YmxpYyBVcmxJbmZvIHJlc29sdmVGaWxlVXJsKE9iamVjdCBvd25lciwgU3RyaW5nIHNyY1VybCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVXJsSW5mbyBpbmZvID0gbmV3IFVybEluZm8oKTsKLQotCQlpbmZvLnNvdXJjZVVybCA9IHNyY1VybDsKLQkJaW5mby5zb3VyY2VGaWxlID0gbmV3IEZpbGUoc291cmNlTGliUm9vdCwgc3JjVXJsKS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCWluZm8udGFyZ2V0VXJsID0gc3JjVXJsOyAKLQkJaW5mby50YXJnZXRGaWxlID0gbnVsbDsKLQotCQlpZiAoaW5mby5zb3VyY2VGaWxlID09IG51bGwgfHwgIWluZm8uc291cmNlRmlsZS5leGlzdHMoKSApIHsKLQkJCXJldHVybiBpbmZvOwotCQl9Ci0JCQotCQlpZiAoIG93bmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCS8vIGZpeCB0aGUgdGFyZ2V0IHVybCBhbmQgCi0JCQlpbmZvLnRhcmdldFVybCA9IGZpeFVybChzcmNVcmwpOwotCQkJCi0JCQkvL1N0cmluZyBlbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRSZXNvdXJjZVBhdGgob3duZXIpOwotCQkJU3RyaW5nIGVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoIChNZXRob2RFbGVtZW50KW93bmVyKTsJCi0JCQlpbmZvLnRhcmdldEZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZSh0YXJnZXRMaWJSb290LCBlbGVtZW50UGF0aCksIGluZm8udGFyZ2V0VXJsKTsJCi0JCX0gZWxzZSB7Ci0JCQlpbmZvLnRhcmdldFVybCA9IHNyY1VybDsgCi0JCQlpbmZvLnNvdXJjZUZpbGUgPSBuZXcgRmlsZShzb3VyY2VMaWJSb290LCBzcmNVcmwpOwotCQl9Ci0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZml4VXJsKFN0cmluZyB1cmwpIHsKLQkJdXJsID0gdXJsLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOyAgLy8kTk9OLU5MUy0xJAotCQlpbnQgaW5keCA9IHVybC5sYXN0SW5kZXhPZihSZXNvdXJjZUhlbHBlci5SRVNPVVJDRV9GT0xERVIgKyAiLyIpOyAgLy8kTk9OLU5MUy0xJAotCQlpZiAoIGluZHggPj0wICkgewotCQkJcmV0dXJuIHVybC5zdWJzdHJpbmcoaW5keCk7Ci0JCX0KLQkJCi0JCS8vIHB1dCB0aGUgcmVzb3VyY2UgaW50byB0aGUgcmVzb3VyY2VzIGZvbGRlcgotCQlyZXR1cm4gbmV3IEZpbGUoUmVzb3VyY2VIZWxwZXIuUkVTT1VSQ0VfRk9MREVSLCB1cmwpCi0JCQkudG9TdHJpbmcoKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLS8vCS8qKgotLy8JICogdGhlIHJlc291cmNlIHBhdGggd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbGliYXJ5IHJvb3QuIHVybHMgbmVlZHMgdG8gYmUgZml4ZWQKLS8vCSAqIAotLy8JICogQHBhcmFtIG93bmVyIHRoZSBvd25lciBvYmplY3QgaW4gdGhlIHRhcmdldCBsaWJyYXJ5Ci0vLwkgKiBAcGFyYW0gc3JjVXJsIHRoZSB1cmwgcmVmZXJlbmNlZCBpbiB0aGUgc291cmNlIGNvbnRlbnQKLS8vCSAqIEByZXR1cm4KLS8vCSAqLwotLy8JcHJpdmF0ZSBVcmxJbmZvIGxvYWRVcmxJbmZvV2l0aEZpeGVkUGF0aChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHsKLS8vCQlVcmxJbmZvIGluZm8gPSBuZXcgVXJsSW5mbygpOwotLy8JCWluZm8uc291cmNlVXJsID0gc3JjVXJsOwotLy8JCWluZm8udGFyZ2V0VXJsID0gc3JjVXJsOwotLy8JCWluZm8uc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZUxpYlJvb3QsIHNyY1VybCk7Ci0vLwkJaW5mby50YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgc3JjVXJsKTsKLS8vCi0vLwkJaWYgKCBvd25lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpICB7Ci0vLwkJCVN0cmluZyBiYWNrUGF0aCA9IFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKCAoTWV0aG9kRWxlbWVudClvd25lcik7Ci0vLwkJCWluZm8udGFyZ2V0VXJsID0gYmFja1BhdGggKyBzcmNVcmw7Ci0vLwkJfQotLy8JCXJldHVybiBpbmZvOwkKLS8vCX0KLS8vCQotLy8JLyoqCi0vLwkgKiB0aGUgcmVzb3VyY2UgcGF0aCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBvd25lciBlbGVtZW50LiAKLS8vCSAqIHVybHMgd2lsbCBub3QgYmUgY2hhbmdlZCBidXQgcmVzb3VyY2UgZmlsZXMgaXMgcmVsaWNhdGVkLgotLy8JICogQHBhcmFtIG93bmVyIG93bmVyIHRoZSBvd25lciBvYmplY3QgaW4gdGhlIHRhcmdldCBsaWJyYXJ5Ci0vLwkgKiBAcGFyYW0gc3JjVXJsCi0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXByaXZhdGUgVXJsSW5mbyBsb2FkVXJsSW5mb1dpdGhSZWxhdGl2ZVBhdGgoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB7Ci0vLwkJVXJsSW5mbyBpbmZvID0gbmV3IFVybEluZm8oKTsKLS8vCQlpbmZvLnNvdXJjZVVybCA9IHNyY1VybDsKLS8vCQlpbmZvLnRhcmdldFVybCA9IGluZm8uc291cmNlVXJsOyAvLyBubyB1cmwgY2hhbmdlCi0vLwkJaW5mby5zb3VyY2VGaWxlID0gbmV3IEZpbGUoc291cmNlTGliUm9vdCwgc3JjVXJsKTsKLS8vCQkKLS8vCQlpZiAoIG93bmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgIHsKLS8vCQkJLy9TdHJpbmcgZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UmVzb3VyY2VQYXRoKG93bmVyKTsKLS8vCQkJU3RyaW5nIGVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFJlc291cmNlUGF0aCgoTWV0aG9kRWxlbWVudClvd25lcik7Ci0vLwkJCWluZm8udGFyZ2V0RmlsZSA9IG5ldyBGaWxlKG5ldyBGaWxlKHRhcmdldExpYlJvb3QsIGVsZW1lbnRQYXRoKSwgc3JjVXJsKTsJCQkKLS8vCQl9Ci0vLwotLy8JCXJldHVybiBpbmZvOwotLy8JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0WE1MU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0WE1MU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZWJiMWVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFhNTFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FRGF0YU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5Db250ZW50UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5JUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuRGlhZ3JhbUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXMuRmVhdHVyZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXMuWE1MTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuRmlsZU1vZGlmeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5MaWJyYXJ5SW1wb3J0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHMuUGx1Z2luTW9kaWZ5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBYbWwgaW1wb3J0IHNlcnZpY2UgY2xhc3MgdG8gcHJvY2VzcyB0aGUgaW1wb3J0aW5nIHRhc2sKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFhNTFNlcnZpY2UgewotCi0JcHJpdmF0ZSBib29sZWFuIGVycm9yID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBNYXAgcmVuYW1lRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG92ZXJ3cml0ZSA9IGZhbHNlOwotCQotCXByaXZhdGUgSVN0YXR1cyBmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgeG1sUGF0aDsKLQotCXByaXZhdGUgWE1MTGlicmFyeSB4bWxMaWI7Ci0KLQlwcml2YXRlIFVtYUxpYnJhcnkgdW1hTGliOwotCi0JcHJpdmF0ZSBJbXBvcnRYTUxvZ2dlciBsb2dnZXIgPSBuZXcgSW1wb3J0WE1Mb2dnZXIoKTsKLQotCXByaXZhdGUgTGlzdCBkaXNjYXJkZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgRGlhZ3JhbUhhbmRsZXIgZGlhZ3JhbUhhbmRsZXI7Ci0JCi0JLy8gbWFwIHhtbCBXb3JrT3JkZXIgdG8gdW1hIFdvcmtPcmRlcgotCU1hcCB3b3JrT3JkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEltcG9ydFhNTFNlcnZpY2UoKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgeG1sIGZpbGUuCi0JICogQHBhcmFtIHhtbFBhdGgKLQkgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2VlZHMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbG9hZFhtbChmaW5hbCBTdHJpbmcgeG1sUGF0aCkgewotCQlTdHJpbmcgdmVyc2lvbkVycm9yID0gdmVyc2lvbkNoZWNrKHhtbFBhdGgsCUltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxXaXphcmRfdGl0bGUpOwkJCi0JCWlmICh2ZXJzaW9uRXJyb3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQkJCi0JCXRoaXMueG1sUGF0aCA9IHhtbFBhdGg7Ci0KLQkJbG9nZ2VyLmxvZ01lc3NhZ2UoIkxvYWRpbmcgeG1sIGxpYnJhcnkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy54bWxMaWIgPSBuZXcgWE1MTGlicmFyeShudWxsLCBsb2dnZXIsIHhtbFBhdGgpOwotCQl0aGlzLnhtbExpYi5sb2FkKCk7Ci0JCQotCQlyZXR1cm4gY2hlY2tPbGRQbHVnaW5zKCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjaGVja09sZFBsdWdpbnMoKSB7Ci0JCUxpc3QgcGx1Z2lucyA9ICgoTWV0aG9kTGlicmFyeSkgeG1sTGliLmdldFJvb3QoKSkuZ2V0TWV0aG9kUGx1Z2luKCk7Ci0JCUxpc3QgZ3VpZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxwbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW0gPSAoTWV0aG9kRWxlbWVudCkgcGx1Z2lucy5nZXQoaSk7Ci0JCQlndWlkcy5hZGQoZWxlbS5nZXRJZCgpKTsKLQkJfQkJCQkKLQkJCi0JCWZpbmFsIFBsdWdpbk1vZGlmeUluZm8gbW9kaWZ5SW5mbyA9IFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UKLQkJCQkJCQkJCQkuY2hlY2tNb2RpZnkoZ3VpZHMsIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSwgZmFsc2UpOwkJCi0KLQkJLy8gYWxsb3cgdXNlciB0byBwcm9jZWVkIHdpdGggbG9ja2VkIHBsdWdpbnMKLQkJaWYgKCBtb2RpZnlJbmZvLmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCApIHsKLQkJCWZpbmFsIGJvb2xlYW4gcmV0W10gPSBuZXcgYm9vbGVhblsxXTsKLQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVN0cmluZyBXSVpBUkRfVElUTEUgPSBJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlOyAKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBtb2RpZnlJbmZvLmdldExvY2tlZE1lc3NhZ2UoKS50b1N0cmluZygpICsKLQkJCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZTsgCi0JCQkJCXJldFswXSA9IEltcG9ydFhNTFBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUNvbmZpcm1hdGlvbihXSVpBUkRfVElUTEUsIG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0pOwkJCi0JCQlyZXR1cm4gcmV0WzBdOwotCQl9IAkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgbG9nIGZpbGUuCi0JICovCi0JcHVibGljIEZpbGUgZ2V0TG9nUGF0aCgpIHsKLQkJcmV0dXJuIGxvZ2dlci5nZXRMb2dQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQkJZGlzY2FyZGVkRWxlbWVudHMuY2xlYXIoKTsKLQkJd29ya09yZGVyTWFwLmNsZWFyKCk7Ci0JCWxvZ2dlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBYTUwgZXhwb3J0LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0ltcG9ydChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIHJlZnJlc2ggPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIGRpc2FibGUgcmVzb3VyY2UgcmVmcmVzaGluZyBkdXJpbmcgaW1wb3J0Ci0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQkKLQkJCWhhbmRsZVR5cGVDaGFuZ2VzKCk7Ci0JCQkKLQkJCUlSZXNvdXJjZUhhbmRsZXIgaGFuZGxlciA9IG5ldyBJbXBvcnRSZXNvdXJjZUhhbmRsZXIobmV3IEZpbGUoCi0JCQkJCXhtbFBhdGgpLmdldFBhcmVudEZpbGUoKSwgbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpKTsKLQotCQkJQ29udGVudFByb2Nlc3NvciBjb250ZW50UHJvYyA9IG5ldyBDb250ZW50UHJvY2Vzc29yKGhhbmRsZXIsCi0JCQkJCXRoaXMubG9nZ2VyKTsKLQkJCQotCQkJZGlhZ3JhbUhhbmRsZXIgPSBuZXcgRGlhZ3JhbUhhbmRsZXIobmV3IEZpbGUoCi0JCQkJCXhtbFBhdGgpLmdldFBhcmVudEZpbGUoKSwgbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSkpOwotCi0JCQl0aGlzLnhtbExpYi5maXhMaWJyYXJ5Rm9ySW1wb3J0KCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBhbGwgdGhlIGRlcGVuZGVudCBwbHVnaW5zIGFyZSB0aGVyZQotCQkJTGlzdCByZWZlcmVuY2VkUGx1Z2lucyA9IHhtbExpYi5nZXRSZWZlcmVuY2VkUGx1Z2lucygpOwotCQkJaWYgKHJlZmVyZW5jZWRQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkgbGlicmFyeSA9IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlCi0JCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCQkJTGlzdCBwbHVnaW5zID0gbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCVN0cmluZyBpZCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4pIGl0Ci0JCQkJCQkJCS5uZXh0KCkpLmdldEd1aWQoKTsKLQkJCQkJCXJlZmVyZW5jZWRQbHVnaW5zLnJlbW92ZShpZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZWZlcmVuY2VkUGx1Z2lucy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZmVyZW5jZWRQbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJU3RyaW5nIGlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCQlsb2dnZXIubG9nRXJyb3IoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfbWlzc2luZ19wbHVnaW4sIGlkKSwKLQkJCQkJCQludWxsKTsKLQkJCQl9Ci0KLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAotCQkJCQkJSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zKTsKLQkJCX0KLQotCQkJdGhpcy51bWFMaWIgPSBuZXcgVW1hTGlicmFyeShjb250ZW50UHJvYywgbG9nZ2VyLCBvdmVyd3JpdGUpOwotCi0JCQlFRGF0YU9iamVjdCB4bWxSb290ID0gdGhpcy54bWxMaWIuZ2V0Um9vdCgpOwotCQkJRURhdGFPYmplY3QgdW1hUm9vdCA9IHRoaXMudW1hTGliLmdldFJvb3QoKTsKLQkJCQotCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoImNyZWF0ZSB0YXJnZXQgbGlicmFyeSBlbGVtZW50cyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRFRGF0YU9iamVjdFRyZWUoeG1sUm9vdCwgdW1hUm9vdCk7Ci0KLQkJCWxvZ2dlcgotCQkJCQkubG9nTWVzc2FnZSgiY29weWluZyBhbGwgZmVhdHVyZSB2YWx1ZXMgZm9yIHRhcmdldCBsaWJyYXJ5IGVsZW1lbnRzIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQlpdGVyYXRFRGF0YU9iamVjdCgoTWV0aG9kRWxlbWVudCkgeG1sUm9vdCk7Ci0KLQkJCWxvZ2dlci5sb2dNZXNzYWdlKCJmaXggdGhlIHRhcmdldCBsaWJyYXJ5IC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQl1bWFMaWIuZml4TGlicmFyeSgpOwotCi0JCQlMaWJyYXJ5SW1wb3J0TWFuYWdlci5oYW5kbGVOYW1lUmVwbGFjZShyZW5hbWVFbGVtZW50TWFwKTsKLQkJCQotCQkJZGlhZ3JhbUhhbmRsZXIucG9zdFJlZ2lzdGVyRWxlbWVudHMoKTsKLQkJCQotCQkJLy8gZGVsZXRlIHRoZSB1bi1uZWVkZWQgZWxlbWVudHMKLQkJCWxvZ2dlci5sb2dNZXNzYWdlKCJkZWxldGUgdW5uZWVkZWQgZWxlbWVudHMgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCXVtYUxpYi5kZWxldGVFbGVtZW50cygpOwotCQkJCi0JCQlmaW5hbCBMaXN0IG1vZGlmaWVkRmlsZXMgPSBGaWxlTW9kaWZ5Q2hlY2tlci5nZXRNb2RpZmllZEZpbGVzKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuCi0JCQkJCQkJCQkJZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCW1vZGlmaWVkRmlsZXMuYWRkQWxsKGRpYWdyYW1IYW5kbGVyLmdldE1vZGlmaWVkRmlsZXMoKSk7Ci0JCQlmaW5hbCBJU3RhdHVzIGZpbGVDaGVja2VkT3V0U3RhdHVzID0gRmlsZU1vZGlmeUNoZWNrZXIuc3luY0V4ZWNDaGVja01vZGlmeShtb2RpZmllZEZpbGVzKTsKLQkJCQotCQkJaWYgKGZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKSkgewotCQkJCi0JCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoInNhdmluZyB0YXJnZXQgbGlicmFyeSAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQotCQkJCUxpc3QgY29uZmlncyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJCQlpbnQgY29uZmlnU3ogPSBjb25maWdzID09IG51bGwgPyAwIDogY29uZmlncy5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPGNvbmZpZ1N6OyBpKyspIHsKLQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IAotCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiApIGNvbmZpZ3MuZ2V0KGkpOwotCQkJCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gZG9uJ3QgcmVmcmVzaCB0aGUgd29ya3NwYWNlCi0JCQkJTGlicmFyeVV0aWwuc2F2ZUxpYnJhcnkoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGZhbHNlLCBmYWxzZSk7Ci0JCQkJZGlhZ3JhbUhhbmRsZXIuZXhlY3V0ZSgpOwkJCQkKLQkKLQkJCQlsb2dnZXIubG9nTWVzc2FnZSgicmUtb3BlbiB0YXJnZXQgbGlicmFyeSAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkKLQkJCQlsb2dnZXIubG9nTWVzc2FnZSgiaW1wb3J0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlTdHJpbmcgdGl0bGUgPSBJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlOyAKLQkJCQkJCVN0cmluZyBtc2cgPSBJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkOyAKLQkJCQkJCW5ldyBNc2dEaWFsb2coSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKSkKLQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIGZpbGVDaGVja2VkT3V0U3RhdHVzKTsKLQkJCQkJCX0KLQkJCQl9KTsKLQkJCX0JCi0JCQkJCQkKLQkJCS8vUmVzb3VyY2VVdGlsLnJlZnJlc2hSZXNvdXJjZXMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJLy8JCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBtb25pdG9yKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxTZXJ2aWNlX2ltcG9ydF9mYWlsZWQsIGUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0KLQkJCXRocm93IGU7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZWZyZXNoKSB7Ci0JCQkJLy8gcmUtZW5hYmxlIHJlc291cmNlIHJlZnJlc2hpbmcKLQkJCQkvLwotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0RURhdGFPYmplY3RUcmVlKEVEYXRhT2JqZWN0IHhtbE9iaiwgRURhdGFPYmplY3QgdW1hT2JqKSB7Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHhtbE9iai5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFRGF0YU9iamVjdCBjaGlsZCA9IChFRGF0YU9iamVjdCkgaXQubmV4dCgpOwotCQkJY3JlYXRlUm1jT2JqZWN0KGNoaWxkLCB1bWFPYmopOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJtY09iamVjdChFRGF0YU9iamVjdCB4bWxFbGVtZW50LAotCQkJRURhdGFPYmplY3QgdGFyZ2V0Q29udGFpbmVyKSB7Ci0KLQkJLy8gZ2V0IHRoZSB0YXJnZXRDb250YWluZXIncyBjb250YWluaW5nIGZlYXR1cmUKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSB4bWxFbGVtZW50LmVDb250YWlubWVudEZlYXR1cmUoKTsKLQkJY3JlYXRlUm1jT2JqZWN0KHhtbEVsZW1lbnQsIHRhcmdldENvbnRhaW5lciwgZmVhdHVyZS5nZXROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVSbWNPYmplY3QoRURhdGFPYmplY3QgeG1sRWxlbWVudCwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldENvbnRhaW5lciwgU3RyaW5nIGNvbnRhaW5tZW50WG1sRmVhdHVyZSkgewotCi0JCXRyeSB7Ci0JCQlpZiAoeG1sRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlFRGF0YU9iamVjdCB1bWFFbGVtZW50ID0gbnVsbDsKLQotCQkJLy8gZG9uJ3QgY3JlYXRlIGNvbnRlbnQgY2F0ZWdvcnkgcGFja2FnZSBzaW5jZSBpbiB1bWEsIGl0J3MKLQkJCS8vIHNlcGVyYXRlZCBiYXNlZCBvbiB0eXBlCi0JCQlpZiAoeG1sRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSB4bWxFbGVtZW50OwotCQkJCXVtYUVsZW1lbnQgPSB1bWFMaWIuY3JlYXRlTWV0aG9kUGx1Z2luKHBsdWdpbi5nZXRJZCgpLCBwbHVnaW4KLQkJCQkJCS5nZXROYW1lKCkpOwotCQkJfSBlbHNlIGlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5UGFja2FnZSkgewotCQkJCS8vIGRvbid0IGNyZWF0ZSwgZG8gbm90aGluZwotCQkJCS8vIG1hcmsgYXMgZGlzY2FyZGVkIHNvIHdlIGRvbid0IG5lZWQgdG8gY29weSBpdCdzIGF0dHJpYnV0ZXMKLQkJCQlzZXREaXNjYXJkZWQoKChDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKSB4bWxFbGVtZW50KS5nZXRJZCgpKTsKLQotCQkJfSBlbHNlIGlmICgoeG1sRWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkKLQkJCQkJJiYgISh4bWxFbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERvbWFpbiAKLQkJCQkJCQl8fCB4bWxFbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpCi0JCQkJCXx8ICh4bWxFbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UpKSB7Ci0JCQkJLy8gY3JlYXRlIHRoZSBjb250ZW50IGNhdGVnb3JpZXMgZm9yIHJvb3QgY29udGVudCBjYXRlZ29yaWVzLAotCQkJCS8vIG5vdCBmb3Igc3ViLWRvbWFpbiBhbmQgc3ViLWRpc2NpcGxpbmUKLQkJCQkvLyAxNTQxNDMgLSBpbXBvcnQgeG1sIGRpZCBub3QgcmVzZXJ2ZSB0aGUgc3ViLWRpc2NpcGxpbmUgc3RydWN0dXJlCi0JCQkJU3RyaW5nIHBsdWdpbklkID0gZ2V0UGx1Z2luKHhtbEVsZW1lbnQpLmdldElkKCk7Ci0JCQkJdW1hRWxlbWVudCA9IHVtYUxpYi5jcmVhdGVDb250ZW50Q2F0ZWdvcnkocGx1Z2luSWQsIHhtbEVsZW1lbnQKLQkJCQkJCS5lQ2xhc3MoKS5nZXROYW1lKCksIHhtbEVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSwKLQkJCQkJCXhtbExpYi5nZXRFbGVtZW50SWQoeG1sRWxlbWVudCkpOwotCQkJfSBlbHNlIHsKLQotCQkJCS8vIGlmIHRoaXMgaXMgcm9vdCBsZXZlbCBwYWNrYWdlLCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nCi0JCQkJLy8gY29udGFpbmVyIGZvciB0aGUgVU1BIG9iamVjdAotCQkJCWlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCQkJJiYgeG1sRWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJaWYgKHhtbEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQkJdGFyZ2V0Q29udGFpbmVyID0gdW1hTGliCi0JCQkJCQkJCS5nZXRDb250ZW50Um9vdFBhY2thZ2UodGFyZ2V0Q29udGFpbmVyKTsKLQkJCQkJfSBlbHNlIGlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJT2JqZWN0IHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIHhtbEVsZW1lbnQpCi0JCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCQkJdGFyZ2V0Q29udGFpbmVyID0gdW1hTGliCi0JCQkJCQkJCQkuZ2V0Q2FwYWJpbGl0eVBhdHRlcm5Sb290UGFja2FnZSh0YXJnZXRDb250YWluZXIpOwotCQkJCQkJfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQkJdGFyZ2V0Q29udGFpbmVyID0gdW1hTGliCi0JCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzUm9vdFBhY2thZ2UodGFyZ2V0Q29udGFpbmVyKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJCUxpc3QgcHJvY3MgPSB4bWxMaWIKLQkJCQkJCQkJLmdldEFsbFByb2Nlc3NlcygoTWV0aG9kUGFja2FnZSkgeG1sRWxlbWVudCk7Ci0JCQkJCQlpZiAocHJvY3MgIT0gbnVsbCAmJiBwcm9jcy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJT2JqZWN0IHByb2MgPSBwcm9jcy5nZXQoMCk7Ci0JCQkJCQkJaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQkJCQl0YXJnZXRDb250YWluZXIgPSB1bWFMaWIKLQkJCQkJCQkJCQkuZ2V0Q2FwYWJpbGl0eVBhdHRlcm5Sb290UGFja2FnZSh0YXJnZXRDb250YWluZXIpOwotCQkJCQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQkJCQl0YXJnZXRDb250YWluZXIgPSB1bWFMaWIKLQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzUm9vdFBhY2thZ2UodGFyZ2V0Q29udGFpbmVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gZ2V0IHRoZSBjb250YWlubWVudCBmZWF0dXJlIHNvIHdlIGNhbiBjcmVhdGUgdGhlIG9iamVjdCBvZgotCQkJCS8vIHRoZSBzYW1lIHR5cGUKLQkJCQl1bWFFbGVtZW50ID0gdW1hTGliLmNyZWF0ZUVsZW1lbnQodGFyZ2V0Q29udGFpbmVyLAotCQkJCQkJY29udGFpbm1lbnRYbWxGZWF0dXJlLCB4bWxFbGVtZW50LmVDbGFzcygpLmdldE5hbWUoKSwKLQkJCQkJCXhtbEVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSwgeG1sTGliCi0JCQkJCQkJCS5nZXRFbGVtZW50SWQoeG1sRWxlbWVudCkpOwotCi0JCQkJLy8geG1sIFdvcmtPcmRlciBkb2VzIG5vdCBoYXZlIGFuIGlkLCBuZWVkIHRvIG1hcCB0aGUgdW1hIE9iamVjdAotCQkJCWlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQkJCXdvcmtPcmRlck1hcC5wdXQoeG1sRWxlbWVudCwgdW1hRWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZWN1cnNpdmUsCi0JCQkvLyBub3RlLCB1bWEgZWxlbWVudCBtaWdodCBiZSBudWxsIHNpbmNlIHdlIGNhbid0IGRldGVybWluZSB0aGUKLQkJCS8vIG93bmVyIG9mIHRoZSBlbGVtZW50IHlldAotCQkJY3JlYXRFRGF0YU9iamVjdFRyZWUoeG1sRWxlbWVudCwgdW1hRWxlbWVudCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyB0aGUgZXJyb3IgYW5kIGNvbnRpbnVlPz8/Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gZ2V0UGx1Z2luKEVPYmplY3QgZWxlbWVudCkgewotCQl3aGlsZSAoKGVsZW1lbnQgIT0gbnVsbCkgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJZWxlbWVudCA9IGVsZW1lbnQuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJcmV0dXJuIChNZXRob2RQbHVnaW4pIGVsZW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBFRGF0YU9iamVjdCBnZXRSbWNPYmplY3QoTWV0aG9kRWxlbWVudCB4bWxPYmopIHsKLQkJaWYgKHhtbE9iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCXJldHVybiB1bWFMaWIuZ2V0Um9vdCgpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIGlkID0geG1sT2JqLmdldElkKCk7Ci0JCQlyZXR1cm4gdGhpcy51bWFMaWIuZ2V0RWxlbWVudChpZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaXRlcmF0RURhdGFPYmplY3QoTWV0aG9kRWxlbWVudCBzcmNPYmopIHsKLQkJaXRlcmF0RURhdGFPYmplY3RfKHNyY09iaik7Ci0JCUVEYXRhT2JqZWN0IHRhcmdldE9iaiA9IGdldFJtY09iamVjdChzcmNPYmopOwotCQlpZiAodGFyZ2V0T2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KSB7Ci0JCQlkaWFncmFtSGFuZGxlci5yZWdpc3RlckVsZW1lbnQoKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkgdGFyZ2V0T2JqKTsgCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdEVEYXRhT2JqZWN0XyhNZXRob2RFbGVtZW50IHNyY09iaikgewotCi0JCWxvZ2dlcgotCQkJCS5sb2dNZXNzYWdlKCIgPT09IHByb2Nlc3NpbmcgZWxlbWVudCAiICsgc3JjT2JqLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiAiICsgc3JjT2JqLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWlmIChpc1Byb2Nlc3NlZChzcmNPYmouZ2V0SWQoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzZXRQcm9jZXNzZWQoc3JjT2JqLmdldElkKCkpOwotCi0JCS8vIGlmIG9iamVjdCBpcyBub3QgY3JlYXRlZCwgaXQncyB4bWwgd3JhcHBlciBwYWNrYWdlCi0JCWlmIChzcmNPYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKSB7Ci0KLQkJCS8vIGl0ZXJhdGUgdGhlIGNoaWxkIHBhY2thZ2VzCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gKChDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKSBzcmNPYmopCi0JCQkJCS5nZXRDb250ZW50Q2F0ZWdvcnkoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJaXRlcmF0RURhdGFPYmplY3QoKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFRGF0YU9iamVjdCB0YXJnZXRPYmogPSBnZXRSbWNPYmplY3Qoc3JjT2JqKTsKLQkJRUNsYXNzIGVDbGFzcyA9IHNyY09iai5lQ2xhc3MoKTsKLQotCQlFTGlzdCBmZWF0dXJlcyA9IGVDbGFzcy5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCWJvb2xlYW4gaXNOZXdFbGVtZW50ID0gdW1hTGliLmlzTmV3RWxlbWVudChzcmNPYmouZ2V0SWQoKSkgfHwgc3JjT2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeTsKLQkJYm9vbGVhbiBpc09sZFBsdWdpbiA9ICFpc05ld0VsZW1lbnQgJiYgKHNyY09iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbik7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdC5uZXh0KCk7Ci0JCQkJCQkKLQkJCWlmIChGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5pc1VubmVlZGVkWG1sRmVhdHVyZShmZWF0dXJlLmdldE5hbWUoKSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChpc09sZFBsdWdpbiAmJiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSA9PSBmZWF0dXJlKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCU9iamVjdCB2YWx1ZSA9IHNyY09iai5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXR2ID0gKChMaXN0KSB2YWx1ZSkuaXRlcmF0b3IoKTsgaXR2Ci0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBzcmNfdmFsdWUgPSBpdHYubmV4dCgpOwotCi0JCQkJCQlpZiAoc3JjX3ZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0KLQkJCQkJCQkvLyBpdCdzIGFuIGlkIHJlZmVyZW5jZQotCQkJCQkJCXVtYUxpYi5zZXRSZWZlcmVuY2VWYWx1ZSh0YXJnZXRPYmosIGZlYXR1cmUKLQkJCQkJCQkJCS5nZXROYW1lKCksIChTdHJpbmcpIHNyY192YWx1ZSk7Ci0JCQkJCQl9IGVsc2UgaWYgKHNyY192YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCQkvLyBzZXQgdGhlIHJlZmVyZW5jZQotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBzcmNfdmFsdWU7Ci0JCQkJCQkJU3RyaW5nIGd1aWQgPSBlLmdldElkKCk7Ci0KLQkJCQkJCQkvLyBkb24ndCBzZXQgdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUgdmFsdWUgc2luY2UKLQkJCQkJCQkvLyBpdCdzIGFscmVhZHkgaGFuZGxlZAotCQkJCQkJCS8vIHdoZW4gY3JlYXRpbmcgdGhlIGxpYnJhcnkgc3RydWN0dXJlCi0JCQkJCQkJaWYgKCFpc0Rpc2NhcmRlZChndWlkKSAmJiBlLmVDb250YWluZXIoKSAhPSBzcmNPYmopIHsKLQkJCQkJCQkJdW1hTGliLnNldFJlZmVyZW5jZVZhbHVlKHRhcmdldE9iaiwgZmVhdHVyZQotCQkJCQkJCQkJCS5nZXROYW1lKCksIGd1aWQpOwotCQkJCQkJCX0KLQotCQkJCQkJCWl0ZXJhdEVEYXRhT2JqZWN0KChNZXRob2RFbGVtZW50KSBzcmNfdmFsdWUpOwotCQkJCQkJfSBlbHNlIGlmIChzcmNfdmFsdWUgaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkJCQkvLyBXb3JrT3JkZXIgaXMgbm90IG1ldGhvZCBlbGVtZW50IGFuZCBkb2VzIG5vdCBoYXZlCi0JCQkJCQkJLy8gYW4gaWQsIG5lZWQgc3BlY2lhbCBoYW5kbGluZwotCQkJCQkJCS8vIHNldCB0aGUgcHJlZGUKLQkJCQkJCQlXb3JrT3JkZXIgd3IgPSAoV29ya09yZGVyKSBzcmNfdmFsdWU7Ci0JCQkJCQkJT2JqZWN0IHVtYVdyID0gd29ya09yZGVyTWFwLmdldCh3cik7Ci0JCQkJCQkJdW1hTGliLnNldFdvcmtPcmRlcih1bWFXciwgd3IuZ2V0VmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWxvZ2dlcgotCQkJCQkJCQkJLmxvZ01lc3NhZ2UoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZCwgc3JjX3ZhbHVlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7Ci0KLQkJCQkJLy8gZ2V0IHRoZSB4bWwgb2JqZWN0IGFuZCBpdGVyYXRlIGFnYWluCi0JCQkJCU9iamVjdCBzcmNfdmFsdWUgPSB2YWx1ZTsKLQotCQkJCQlpZiAoc3JjX3ZhbHVlIGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQkJCQlsb2dnZXIubG9nTWVzc2FnZSgid29ya29yZGVyIHZhbHVlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIGlmIChzcmNfdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcKLQkJCQkJCQkmJiAhaXNEaXNjYXJkZWQoKFN0cmluZykgc3JjX3ZhbHVlKSkgewotCQkJCQkJLy8gaXQncyBhbiBpZCByZWZlcmVuY2UKLQkJCQkJCXVtYUxpYi5zZXRSZWZlcmVuY2VWYWx1ZSh0YXJnZXRPYmosIGZlYXR1cmUuZ2V0TmFtZSgpLAotCQkJCQkJCQkoU3RyaW5nKSBzcmNfdmFsdWUpOwotCQkJCQl9IGVsc2UgaWYgKHNyY192YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCS8vIHNldCB0aGUgcmVmZXJlbmNlCi0JCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudCkgc3JjX3ZhbHVlKS5nZXRJZCgpOwotCQkJCQkJaWYgKGd1aWQgPT0gbnVsbCkgewotCQkJCQkJCWxvZ2dlcgotCQkJCQkJCQkJLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF93aXRob3V0X2lkLCAoKE1ldGhvZEVsZW1lbnQpIHNyY192YWx1ZSkKLQkJCQkJCQkJCS5nZXROYW1lKCkpKTsKLQkJCQkJCX0KLQkJCQkJCWlmICghaXNEaXNjYXJkZWQoZ3VpZCkpIHsKLQkJCQkJCQl1bWFMaWIuc2V0UmVmZXJlbmNlVmFsdWUodGFyZ2V0T2JqLCBmZWF0dXJlCi0JCQkJCQkJCQkuZ2V0TmFtZSgpLCBndWlkKTsKLQkJCQkJCX0KLQkJCQkJCWl0ZXJhdEVEYXRhT2JqZWN0KChNZXRob2RFbGVtZW50KSBzcmNfdmFsdWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbG9nZ2VyCi0JCQkJCQkJCS5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQsIHNyY192YWx1ZSkpOwotCQkJCQl9Ci0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAodGFyZ2V0T2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5UGFja2FnZSkgewotCQkJCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoImhycmUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgV29ya09yZGVyVHlwZSkgewotCQkJCQkJdmFsdWUgPSAoKFdvcmtPcmRlclR5cGUpIHZhbHVlKS5nZXROYW1lKCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWJvb2xlYW4gcmVuYW1lID0gZmFsc2U7Ci0JCQkJCWlmICghaXNOZXdFbGVtZW50ICYmIGZlYXR1cmUgPT0gb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSkgewotCQkJCQkJU3RyaW5nIG9sZE5hbWUgPSAoU3RyaW5nKXRhcmdldE9iai5lR2V0KG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQkJCQlTdHJpbmcgbmV3TmFtZSA9IChTdHJpbmcpc3JjT2JqLmVHZXQoZmVhdHVyZSk7CQkJCQotCQkJCQkJaWYgKCFuZXdOYW1lLmVxdWFscyhvbGROYW1lKSkgewotCQkJCQkJCUxpYnJhcnlJbXBvcnRNYW5hZ2VyLmVuc3VyZVVuaXF1ZU5hbWVGb3JFeGlzdGluZ0VsZW1lbnQKLQkJCQkJCQkJKChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpIHRhcmdldE9iaiwgb2xkTmFtZSwgbmV3TmFtZSwgcmVuYW1lRWxlbWVudE1hcCk7Ci0JCQkJCQkJcmVuYW1lID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIXJlbmFtZSkgewotCQkJCQkJdW1hTGliLnNldEF0cmlidXRlRmVhdHVyZVZhbHVlKHRhcmdldE9iaiwKLQkJCQkJCQkJZmVhdHVyZS5nZXROYW1lKCksIHZhbHVlKTsKLQkJCQkJfQotCQkJCQlpZiAoaXNOZXdFbGVtZW50ICYmIGZlYXR1cmUgPT0gb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSkgewotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50IGVsZW0gPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KSB0YXJnZXRPYmo7Ci0JCQkJCQlFT2JqZWN0IGNlb2JqID0gZWxlbS5lQ29udGFpbmVyKCk7CQkJCQkJCi0JCQkJCQlpZiAoY2VvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgJiYgCi0JCQkJCQkJCSEgdW1hTGliLmlzTmV3RWxlbWVudCgoKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkgY2VvYmopLmdldEd1aWQoKSkpIHsKLQkJCQkJCQlMaWJyYXJ5SW1wb3J0TWFuYWdlci5lbnN1cmVVbmlxdWVOYW1lKGNlb2JqLCBlbGVtLCByZW5hbWVFbGVtZW50TWFwKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBsb2cgdGhlIGVycm9yIGFuZCBjb250aW51ZT8/PwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0KLQkJfQotCi0JfQotCi0JLy8gZ29pZCBvZiBwcm9jZXNzZWQgZWxlbWVudAotCXByaXZhdGUgTGlzdCBwcm9jZXNzZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1Byb2Nlc3NlZChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gcHJvY2Vzc2VkRWxlbWVudHMuY29udGFpbnMoZ3VpZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFByb2Nlc3NlZChTdHJpbmcgZ3VpZCkgewotCQlpZiAoIXByb2Nlc3NlZEVsZW1lbnRzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQlwcm9jZXNzZWRFbGVtZW50cy5hZGQoZ3VpZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEaXNjYXJkZWQoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBkaXNjYXJkZWRFbGVtZW50cy5jb250YWlucyhpZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERpc2NhcmRlZChTdHJpbmcgaWQpIHsKLQkJZGlzY2FyZGVkRWxlbWVudHMuYWRkKGlkKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyBvdmVyd3JpdGUgYXR0cmlidXRlLgotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlKGJvb2xlYW4gYikgewotCQlvdmVyd3JpdGUgPSBiOwotCX0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHZlcnNpb25DaGVjayhmaW5hbCBTdHJpbmcgeG1sUGF0aCwgZmluYWwgU3RyaW5nIHRpdGxlKSB7Ci0JCWZpbmFsIFN0cmluZ1tdIHJldCA9IG5ldyBTdHJpbmdbMV07Ci0JCXJldFswXSA9IG51bGw7Ci0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsJCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7CQkJCQotCQkJCVZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbyA9IFZlcnNpb25VdGlsLmNoZWNrWE1MVmVyc2lvbihuZXcgRmlsZSh4bWxQYXRoKSk7Ci0JCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93biwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQlQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7CQkJCQkKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoaW5mby5yZXN1bHQgPCAwKSB7Ci0JCQkJCQlpZiAoaW5mby50b29sSUQuZXF1YWxzKFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSkpIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZERhdGEsIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQlpbmZvLnRvb2xWZXJzaW9uLCBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQkJUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoaW5mby5yZXN1bHQgPiAwKSB7Ci0JCQkJCQlpZiAoaW5mby50b29sSUQuZXF1YWxzKFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSkpIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZFRvb2wsIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCWluZm8udG9vbFZlcnNpb24sIFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd24sIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQlQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7Ci0JCQkJCQl9Ci0JCQkJCX0gCi0JCQkJfQotCQkJCWlmIChyZXRbMF0gIT0gbnVsbCkgewotCQkJCQlJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgcmV0WzBdKTsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfSk7CQkKLQkJcmV0dXJuIHJldFswXTsKLQl9Ci0JCi0JIHB1YmxpYyB2b2lkIGhhbmRsZVR5cGVDaGFuZ2VzKCkgewotCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkgYmFzZUxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlIYXNoTWFwIGJhc2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5jb2xsZWN0UG90ZW50aWFsVHlwZUNoYW5nZWQoYmFzZUxpYiwgYmFzZU1hcCk7Ci0JCQotCQlIYXNoTWFwIGVDbGFzc09iak1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUhhc2hNYXAgaW1wb3J0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHhtbExpYi5nZXRSb290KCkuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UgfHwKLQkJCQlvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCU1ldGhvZEVsZW1lbnQgeG1sRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJU3RyaW5nIGVDbGFzc05hbWUgPSB4bWxFbGVtZW50LmVDbGFzcygpLmdldE5hbWUoKTsKLQkJCQlPYmplY3QgZUNsYXNzT2JqID0gZUNsYXNzT2JqTWFwLmdldChlQ2xhc3NOYW1lKTsKLQkJCQlpZiAoZUNsYXNzT2JqID09IG51bGwpIHsKLQkJCQkJRUNsYXNzIG9iakVDbGFzcyA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFJtY0VDbGFzcyhlQ2xhc3NOYW1lKTsKLQkJCQkJaWYgKG9iakVDbGFzcyAhPSBudWxsKSB7Ci0JCQkJCQllQ2xhc3NPYmogPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUob2JqRUNsYXNzKTsKLQkJCQkJCWVDbGFzc09iak1hcC5wdXQoZUNsYXNzTmFtZSwgZUNsYXNzT2JqKTsJCi0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVDbGFzc09iaiAhPSBudWxsKSB7Ci0JCQkJCWltcG9ydE1hcC5wdXQoeG1sRWxlbWVudC5nZXRJZCgpLCBlQ2xhc3NPYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UuaGFuZGxlVHlwZUNoYW5nZXMoYmFzZU1hcCwgaW1wb3J0TWFwKTsJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0WE1Mb2dnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFhNTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlY2UyYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0WE1Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLkZpbGVMb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci0KLS8qKgotICogTG9nZ2VyIGNsYXNzIGZvciB4bWwgaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRYTUxvZ2dlciBleHRlbmRzIEZpbGVMb2dnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HU19GT0xERVIgPSAibG9ncy9pbXBvcnQveG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEltcG9ydFhNTG9nZ2VyKCkgewotCQlzdXBlcihuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpLCBMT0dTX0ZPTERFUikpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvVW1hTGlicmFyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvVW1hTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZWEwOGY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL1VtYUxpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuQ29udGVudFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuSUxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5GZWF0dXJlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLQotLyoqCi0gKiBVbWFMaWJyYXJ5IHJlcHJlc2VudHMgYSBtZXRob2QgbGlicmFyeSBhbmQgcHJvdmlkZSBtZXRob2RzIHRvIGNyZWF0ZSBlbGVtZW50cwotICogYW5kIHNldCBhdHRyaWJ1dGVzIGFuZCBmZWF0dXJlIHZhbHVlcwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW1hTGlicmFyeSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gb3ZlcndyaXRlID0gZmFsc2U7CQotCQotCXByaXZhdGUgSUxvZ2dlciBsb2dnZXI7Ci0KLQlwcml2YXRlIENvbnRlbnRQcm9jZXNzb3IgY29udGVudFByb2MgPSBudWxsOwotCQotCXByaXZhdGUgTWFwIG5ld0VsZW1lbnRzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIG1hcCBvZiBjcmVhdGVkIGVsZW1lbnRzLCBndWlkIC0gRURhdGFPYmplY3QKLQlNYXAgZWxlbWVudHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8ga2VlcCB0aGUgc291cmNlIGVsZW1lbnQgaWRzIHNvIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBpbiB0aGUgeG1sIHNvdXJjZSBsaWJyYXJ5Ci0JLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGRlbGV0aW5nIHVuLW5lZWRlZCBlbGVtZW50cwotCS8vIDE1NDE0OSAtIGFsbG93IHBhY2thZ2UgbGV2ZWwgbWVyZ2luZyBmb3IgeG1sIGltcG9ydAotCUhhc2hTZXQgc291cmNlRWxlbWVudElEcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqIEBwYXJhbSBjb250ZW50UHJvYwotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKiBAcGFyYW0gb3ZlcndyaXRlCi0JICovCi0JcHVibGljIFVtYUxpYnJhcnkoQ29udGVudFByb2Nlc3NvciBjb250ZW50UHJvYywgSUxvZ2dlciBsb2dnZXIsIGJvb2xlYW4gb3ZlcndyaXRlKSB7Ci0JCXRoaXMubG9nZ2VyID0gbG9nZ2VyOwotCQl0aGlzLmNvbnRlbnRQcm9jID0gY29udGVudFByb2M7Ci0JCXRoaXMub3ZlcndyaXRlID0gb3ZlcndyaXRlOwotCi0JCWJ1aWxkRWxlbWVudHNNYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGxpYnJhcnkgYXMgdGhlIHJvb3Qgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldFJvb3QoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRWxlbWVudHNNYXAoKSB7Ci0JCS8vIGJ1aWxkIHRoZSBlbGVtZW50cyBtYXAgZm9yIGVhc3kgb3BlcmF0aW9uCi0KLQkJZWxlbWVudHNNYXAuY2xlYXIoKTsKLQkJZWxlbWVudHNNYXAucHV0KGdldFJvb3QoKS5nZXRHdWlkKCksIGdldFJvb3QoKSk7Ci0JCVRyZWVJdGVyYXRvciBpdCA9IGdldFJvb3QoKS5lQWxsQ29udGVudHMoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IGUgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQllbGVtZW50c01hcC5wdXQoKChNZXRob2RFbGVtZW50KSBlKS5nZXRHdWlkKCksIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbnRlbnQgY2F0ZXJnb3J5LgotCSAqIEBwYXJhbSBwbHVnaW5JZAotCSAqIEBwYXJhbSB4bWxFQ2xhc3NOYW1lCi0JICogQHBhcmFtIHhtbEVsZW1lbnRUeXBlCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBjcmVhdGVDb250ZW50Q2F0ZWdvcnkoU3RyaW5nIHBsdWdpbklkLAotCQkJU3RyaW5nIHhtbEVDbGFzc05hbWUsIFN0cmluZyB4bWxFbGVtZW50VHlwZSwgU3RyaW5nIGlkKSB7Ci0KLQkJc2V0U291cmNlSWQoaWQpOwotCQkKLQkJLy8gbWFrZSBzdXJlIHRoZSBzYW1lIG9iamVjdCBjcmVhdGVkIG9ubHkgb25jZQotCQlFRGF0YU9iamVjdCBvYmogPSBnZXRFbGVtZW50KGlkKTsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gb2JqOwotCQl9Ci0KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGdldEVsZW1lbnQocGx1Z2luSWQpOwotCi0JCUVDbGFzcyBvYmpDbGFzcyA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFJtY0VDbGFzcyh4bWxFQ2xhc3NOYW1lKTsKLQkJaWYgKG9iakNsYXNzID09IG51bGwpIHsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX25vX2VjbGFzcywgeG1sRUNsYXNzTmFtZSkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlvYmogPSAoRURhdGFPYmplY3QpIEVjb3JlVXRpbC5jcmVhdGUob2JqQ2xhc3MpOwotCQlzZXRFbGVtZW50KGlkLCBvYmopOwotCi0JCUNvbnRlbnRQYWNrYWdlIHJvb3RQa2cgPSAoQ29udGVudFBhY2thZ2UpIGdldFJvb3RQYWNrYWdlKHBsdWdpbiwgb2JqKTsKLQkJcm9vdFBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQob2JqKTsKLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByb290IHBhY2thZ2UKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFja2FnZSBnZXRSb290UGFja2FnZShNZXRob2RQbHVnaW4gcGx1Z2luLCBPYmplY3Qgb2JqKSB7Ci0KLQkJU3RyaW5nW10gcGF0aCA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJcGF0aCA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUKLQkJCQl8fCBvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCXBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCXBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGg7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCB8fCBvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCXBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2wpIHsKLQkJCXBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkgewotCQkJcGF0aCA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aDsKLQkJfQotCi0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCXJldHVybiBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwgcGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9ub19wYWNrYWdlLCBvYmopKTsgCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbWV0aG9kIHBsdWdpbi4KLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBjcmVhdGVNZXRob2RQbHVnaW4oU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkKLQkJLy8gbWFrZSBzdXJlIHRoZSBzYW1lIG9iamVjdCBjcmVhdGVkIG9ubHkgb25jZQotCQlFRGF0YU9iamVjdCBvYmogPSBnZXRFbGVtZW50KGlkKTsKLQkJYm9vbGVhbiBpc09sZCA9IG9iaiAhPSBudWxsOwotCQlpZiAob2JqID09IG51bGwpIHsKLQkJCW9iaiA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpbihuYW1lLCBpZCk7Ci0KLQkJCXNldEVsZW1lbnQoaWQsIG9iaik7Ci0JCX0KLQotCQkvLyBtYWtlIHN1cmUgdGhlIHN5c3RlbSBwYWNrYWdlcyBhcmUgaW5jbHVkZWQKLQkJc2V0U291cmNlSWQoaWQpOwotCQlMaXN0IHBrZ3MgPSBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKChNZXRob2RQbHVnaW4pb2JqKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gKE1ldGhvZFBhY2thZ2UpaXQubmV4dCgpOwotCQkJc2V0U291cmNlSWQocGtnLmdldEd1aWQoKSk7Ci0JCQlpZiAoIWlzT2xkKSB7Ci0JCQkJbmV3RWxlbWVudHNNYXAucHV0KHBrZy5nZXRHdWlkKCksIHBrZyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBvYmo7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBjb250ZW50J3Mgcm9vdCBwYWNrYWdlLgotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGdldENvbnRlbnRSb290UGFja2FnZShFRGF0YU9iamVjdCBwbHVnaW4pIHsKLQkJaWYgKCEocGx1Z2luIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoKE1ldGhvZFBsdWdpbikgcGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGNhcGFiaWxpdHkgcGF0dGVybicgcm9vdCBwYWNrYWdlLgotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGdldENhcGFiaWxpdHlQYXR0ZXJuUm9vdFBhY2thZ2UoRURhdGFPYmplY3QgcGx1Z2luKSB7Ci0JCWlmICghKHBsdWdpbiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKChNZXRob2RQbHVnaW4pIHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBkZWxpdmVyeSBwcm9jZXNzJyByb290IHBhY2thZ2UuCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0RGVsaXZlcnlQcm9jZXNzUm9vdFBhY2thZ2UoRURhdGFPYmplY3QgcGx1Z2luKSB7Ci0JCWlmICghKHBsdWdpbiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKChNZXRob2RQbHVnaW4pIHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGgpOwotCX0KLQotLy8JcHVibGljIEVEYXRhT2JqZWN0IGdldFByb2Nlc3NDb250cmlidXRpb25Sb290UGFja2FnZShFRGF0YU9iamVjdCBwbHVnaW4pIHsKLS8vCQlpZiAoIShwbHVnaW4gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLS8vCQlyZXR1cm4gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgoTWV0aG9kUGx1Z2luKSBwbHVnaW4sCi0vLwkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoKTsKLS8vCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWxlbWVudC4KLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICogQHBhcmFtIHhtbEZlYXR1cmVOYW1lCi0JICogQHBhcmFtIHhtbEVDbGFzc05hbWUKLQkgKiBAcGFyYW0geG1sRWxlbWVudFR5cGUKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGNyZWF0ZUVsZW1lbnQoRURhdGFPYmplY3QgY29udGFpbmVyLAotCQkJU3RyaW5nIHhtbEZlYXR1cmVOYW1lLCBTdHJpbmcgeG1sRUNsYXNzTmFtZSwgU3RyaW5nIHhtbEVsZW1lbnRUeXBlLAotCQkJU3RyaW5nIGlkKSB7Ci0KLQkJc2V0U291cmNlSWQoaWQpOwotCi0JCS8vIG1ha2Ugc3VyZSB0aGUgc2FtZSBvYmplY3QgY3JlYXRlZCBvbmx5IG9uY2UKLQkJRURhdGFPYmplY3Qgb2JqID0gZ2V0RWxlbWVudChpZCk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJRU9iamVjdCBlb2JqID0gb2JqLmVDb250YWluZXIoKTsKLQkJCQlpZiAoZW9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCVByb2Nlc3NQYWNrYWdlIHAgPSAoUHJvY2Vzc1BhY2thZ2UpIGVvYmo7Ci0JCQkJCXNldFNvdXJjZUlkKHAuZ2V0R3VpZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gb2JqOwotCQl9Ci0KLQkJLy8gaWYgKCBvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gKSB7Ci0JCS8vIHJldHVybiBnZXRFbGVtZW50KGlkKTsKLQkJLy8gfQotCi0JCS8vIC8vIHRoaXMgaXMgYW4gZWFzaWVyIHdheSwgdGVzdCBpdCwKLQkJLy8gLy8gZG9lcyBub3Qgd29yayBzaW5jZSBmZWF0dXJlLmdldEVUeXBlKCkgcmV0dXJucyB0aGUgYmFzZSBlbGVtZW50Ci0JCS8vIHR5cGUsIG5vdCB0aGUgZXh0ZW5kZWQgb25lCi0JCS8vIC8vIGZvciBleGFtcGxlLCBpdCByZXR1cm5zIE1ldGhvZFBhY2thZ2UgaW5zdGVhZCBvZiBQcm9jZXNzUGFja2FnZSBvcgotCQkvLyBDb250ZW50UGFja2FnZQotCQkvLyAvLyBzbyB3ZSBuZWVkIHRvIG1ha2Ugb3VyIG93biBtYXAKLQkJLy8gRUNsYXNzaWZpZXIgYyA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQotCQlFQ2xhc3Mgb2JqQ2xhc3MgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRSbWNFQ2xhc3MoeG1sRUNsYXNzTmFtZSk7Ci0JCWlmIChvYmpDbGFzcyA9PSBudWxsKSB7Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9ub19lY2xhc3MsIHhtbEVDbGFzc05hbWUpKTsgCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCW9iaiA9IChFRGF0YU9iamVjdCkgRWNvcmVVdGlsLmNyZWF0ZShvYmpDbGFzcyk7CQotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCS8vIFdvcmtPcmRlciBpcyBub3QgYSBtZXRob2QgZWxlbWVudCBpbiB4bWwgdW1hLCBuZWVkIHRvIGNyZWF0ZSBpdAotCQkJLy8gd2l0aCBhIGd1aWQKLQkJCS8vaWQgPSBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCk7Ci0KLQkJCS8vIGFsc28gbmVlZCB0byBhZGQgdGhlIGVsZW1lbnQgaW50byB0aGUgY29udGFpbmVyIG9mIHRoZSBvd25lcgotCQkJKChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyLmVDb250YWluZXIoKSkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKAotCQkJCQlvYmopOwotCQl9Ci0KLQkJc2V0RWxlbWVudChpZCwgb2JqKTsKLQotCQl0cnkgewotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBjb250YWluZXI7Ci0JCQkJLy8gbmVlZCBzcGVjaWFsIGhhbmRsaW5nIGZvciBuZXcgcGx1Z2luCi0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCS8vIGNvbnRlbnQgcGFja2FnZSBhbmQgb3duZXIgaXMgUGx1Z2luLCBnb3RvIHRoZSByb290Ci0JCQkJCS8vIGNvbnRlbnQgcGFja2FnZQotCQkJCQlNZXRob2RQYWNrYWdlIHBrZ19jb3JlX2NvbnRlbnQgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKAotCQkJCQkJCXBsdWdpbiwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQkJCQlwa2dfY29yZV9jb250ZW50LmdldENoaWxkUGFja2FnZXMoKS5hZGQob2JqKTsKLQkJCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJTWV0aG9kUGFja2FnZSBwa2dfY3AgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0JCQkJCXBrZ19jcC5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKG9iaik7Ci0KLQkJCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCS8vIHRoaXMgaXMgYSByb290IHByb2Nlc3MgcGFja2FnZQotCQkJCQkvLyBwdXQgaW50byB0aGUgcm9vdCBkZWxpdmVyeSBwcm9jZXNzZXMgcGFja2FnZQotCQkJCQlNZXRob2RQYWNrYWdlIHBrZ19kcCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0JCQkJCXBrZ19kcC5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKG9iaik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UKLQkJCQkJCS5nZXRSbWNGZWF0dXJlKGNvbnRhaW5lci5lQ2xhc3MoKSwgeG1sRmVhdHVyZU5hbWUpOwotCQkJCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJaWYgKChjb250YWluZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQkJCSYmIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJCSYmIG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQotCQkJCQkvLyB0aGUgY29udGFpbmVyIG5lZWRzIHRvIGJlIGEgcHJvY2VzcyBwYWNrYWdlCi0JCQkJCUVPYmplY3QgcGtnID0gY29udGFpbmVyOwotCQkJCQl3aGlsZSAoKHBrZyAhPSBudWxsKSAmJiAhKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSkgewotCQkJCQkJcGtnID0gcGtnLmVDb250YWluZXIoKTsKLQkJCQkJfQotCi0JCQkJCS8vIGlmIHRoZSBvYmplY3QgaXMgYW4gYWN0aXZpdHksIGNyZWF0ZSBhIHBhY2thZ2UgZm9yIGl0IGFuZAotCQkJCQkvLyBhbGwgaXQncyBicmVha2Rvd24gZWxlbWVudHMKLQkJCQkJaWYgKChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQkJCUxpc3QgY2hpbGRQa2dzID0gKChQcm9jZXNzUGFja2FnZSkgcGtnKQotCQkJCQkJCQkuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkJCQkJUHJvY2Vzc1BhY2thZ2UgcHAgPSBudWxsOwotCQkJCQkJaWYgKHRydWUgfHwgY2hpbGRQa2dzLnNpemUoKSA9PSAwKSB7CS8vMTU4MzYzOiBhbHdheXMgY3JlYXRlIGEgcGFja2FnZSBmb3IgYWN0Ci0JCQkJCQkJcHAgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJCQkJCXBwLnNldE5hbWUoKChNZXRob2RFbGVtZW50KSBjb250YWluZXIpLmdldE5hbWUoKSk7Ci0JCQkJCQkJc2V0RWxlbWVudChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCksIHBwKTsKLQkJCQkJCQlzZXRTb3VyY2VJZChwcC5nZXRHdWlkKCkpOwotCQkJCQkJCWNoaWxkUGtncy5hZGQocHApOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwcCA9IChQcm9jZXNzUGFja2FnZSkgY2hpbGRQa2dzLmdldCgwKTsKLQkJCQkJCX0KLQotCQkJCQkJcGtnID0gcHA7Ci0JCQkJCX0KLQotCQkJCQkoKFByb2Nlc3NQYWNrYWdlKSBwa2cpLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChvYmopOwotCQkJCX0KLQotCQkJCS8vIG5vdGU6IGFsbCBlbGVtZW50IHJlZmVyZW5jZXMgYXJlIHN0cmluZyB0eXBlIChpZCkKLQkJCQkvLyBwYWNrYWdlIHJlZmVyZW5jZXMgYXJlIG9iamVjdCByZWZlcmVuY2VzCi0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJTGlzdCB2YWx1ZXMgPSAoTGlzdCkgY29udGFpbmVyLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCXZhbHVlcy5hZGQob2JqKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb250YWluZXIuZVNldChmZWF0dXJlLCBvYmopOwotCQkJCX0KLQkJCX0JCQkJCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQsIGUuZ2V0TWVzc2FnZSgpKSk7Ci0JCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RWxlbWVudChTdHJpbmcgZ3VpZCwgRURhdGFPYmplY3Qgb2JqKSB7Ci0JCS8vIGFkZEVsZW1lbnRUb0NvbnRhaW5lcihjb250YWluZXIsIG9iaik7Ci0JCQkJCi0JCWlmICghZWxlbWVudHNNYXAuY29udGFpbnNLZXkoZ3VpZCkpIHsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnQpIG9iaikuc2V0R3VpZChndWlkKTsKLQkJCX0KLQotCQkJZWxlbWVudHNNYXAucHV0KGd1aWQsIG9iaik7Ci0JCQkJCQotCQkJc2V0RGlydHkob2JqKTsKLQkJCW5ld0VsZW1lbnRzTWFwLnB1dChndWlkLCBvYmopOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNvdXJjZUlkKFN0cmluZyBpZCkgewotCQkvLyAxNTQxNDkgLSBhbGxvdyBwYWNrYWdlIGxldmVsIG1lcmdpbmcgZm9yIHhtbCBpbXBvcnQKLQkJaWYgKCAhc291cmNlRWxlbWVudElEcy5jb250YWlucyhpZCkgKSB7Ci0JCQlzb3VyY2VFbGVtZW50SURzLmFkZChpZCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldERpcnR5KEVPYmplY3Qgb2JqKSB7Ci0JCS8vIG1hcmsgdGhlIHJlc291cmNlIGFzIGRpcnR5Ci0JCVJlc291cmNlIHJlcyA9IG9iai5lUmVzb3VyY2UoKTsKLQkJaWYgKCByZXMgIT0gbnVsbCAmJiAhcmVzLmlzTW9kaWZpZWQoKSApIHsKLQkJCXJlcy5zZXRNb2RpZmllZCh0cnVlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGVsZW1lbnQgZ2l2ZW4gdGhlIGd1aWQuCi0JICogQHBhcmFtIGd1aWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGdldEVsZW1lbnQoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIChFRGF0YU9iamVjdCkgZWxlbWVudHNNYXAuZ2V0KGd1aWQpOwotCX0KLQotCXByaXZhdGUgRGF0ZSBjcmVhdGVEYXRlKFN0cmluZyBkYXRlU3RyKSB7Ci0JCWRhdGVTdHIgPSBkYXRlU3RyLnJlcGxhY2UoJ1QnLCAnICcpOwotCQlTaW1wbGVEYXRlRm9ybWF0IGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCBoaDptbTpzcyIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmLnBhcnNlKGRhdGVTdHIsIG5ldyBQYXJzZVBvc2l0aW9uKDApKTsKLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0cmluZyhPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBzdHIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJc3RyID0gTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCX0gZWxzZSBpZiAob2JqICE9IG51bGwpIHsKLQkJCXN0ciA9IG9iai50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlLgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0cmlidXRlRmVhdHVyZVZhbHVlKEVEYXRhT2JqZWN0IG9iaiwgU3RyaW5nIGZlYXR1cmVOYW1lLAotCQkJT2JqZWN0IHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG9iaiA9PSBudWxsIHx8IGZlYXR1cmVOYW1lID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0IHx8IHZhbHVlIGluc3RhbmNlb2YgRURhdGFPYmplY3QpIHsKLQkJCXRocm93IG5ldyBFeGNlcHRpb24oTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8yLCB2YWx1ZSkpOyAKLQkJfQotCi0JCS8vIGZpbmQgdGhlIGZlYXR1cmUgYW5kIHNldCB0aGUgdmFsdWUKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRSbWNGZWF0dXJlKG9iagotCQkJCS5lQ2xhc3MoKSwgZmVhdHVyZU5hbWUpOwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGdldFN0cmluZyhvYmopLCBmZWF0dXJlTmFtZSwgdmFsdWUgfTsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGUsIHBhcmFzKSArIG9iaik7IAotCQkJcmV0dXJuOwotCQl9IAotCQkKLQkJc2V0RGlydHkob2JqKTsKLQotCQkvLyAxNTg2ODggLSBNaXNzaW5nIHRlbXBsYXRlIGZpbGVzIGluIGV4cG9ydGVkIHhtbCBsaWJyYXJ5Ci0JCS8vIHByb2Nlc3MgdGhlIGF0dGFjaG1lbnQgdXJsCi0JCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCkgKSB7Ci0JCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7Ci0JCQkJdmFsdWUgPSBjb250ZW50UHJvYy5yZXNvbHZlQXR0YWNobWVudFJlc291cmNlcyhvYmosIHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpKTsKLQkJCX0KLQkJCW9iai5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJfQotCQkKLQkJZWxzZSBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCS8vIGlmIHRoZSB1bWEgZmVhdHVyZSBpcyBhIHJlZmVyZW5jZSBmZWF0dXJlCi0JCQkvLyBidXQgdGhlIHhtbCBmZWF0dXJlIGlzIGFuIGF0dHJpYnV0ZQotCQkJLy8gdGhlIGF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIGEgZ3VpZAotCQkJT2JqZWN0IGUgPSBnZXRFbGVtZW50KChTdHJpbmcpIHZhbHVlKTsKLQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkoKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpKS5hZGQoZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb2JqLmVTZXQoZmVhdHVyZSwgZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGdldFN0cmluZyhvYmopLAotCQkJCQkJZmVhdHVyZS5nZXROYW1lKCksIHZhbHVlIH07Ci0JCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGUsIHBhcmFzKTsgCi0JCQkJbG9nZ2VyLmxvZ1dhcm5pbmcobXNnKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJ2YXJpYWJpbGl0eVR5cGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXZhbHVlID0gVmFyaWFiaWxpdHlUeXBlLmdldCh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygibGlua1R5cGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXZhbHVlID0gV29ya09yZGVyVHlwZS5nZXQodmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJfSBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCkpIHsKLQkJCQkJLy8gY29udmVydCBqYXZhLnV0aWwuRGF0ZSB0byB4bWwgRGF0ZQotCQkJCQl2YWx1ZSA9IGNyZWF0ZURhdGUodmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJfSBlbHNlIGlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoIm5vZGVpY29uIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJfHwgZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJzaGFwZWljb24iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXZhbHVlID0gbmV3IGphdmEubmV0LlVSSSh2YWx1ZS50b1N0cmluZygpKTsKLQotCQkJCQkvLyBuZWVkIHRvIGNvcHkgdGhlIHJlc291cmNlIGZpbGUgdG8gdGhlIHRhcmdldCBsaWJyYXJ5Ci0JCQkJCWNvbnRlbnRQcm9jLmNvcHlSZXNvdXJjZSgoKGphdmEubmV0LlVSSSkgdmFsdWUpLmdldFBhdGgoKSk7Ci0JCQkJfSBlbHNlIGlmICgoY29udGVudFByb2MgIT0gbnVsbCkKLQkJCQkJCSYmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQkJCQkJJiYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCQl2YWx1ZSA9IGNvbnRlbnRQcm9jLnJlc29sdmVSZXNvdXJjZUZpbGVzKAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBvYmosIChTdHJpbmcpIHZhbHVlKTsKLQkJCQl9Ci0JCQkJb2JqLmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBnZXRTdHJpbmcob2JqKSwgZmVhdHVyZU5hbWUsCi0JCQkJCQl2YWx1ZSB9OwotCQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlLCBwYXJhcyksIGUpOyAKLQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBnZXRTdHJpbmcob2JqKSwgZmVhdHVyZU5hbWUsIHZhbHVlIH07Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzMsIHBhcmFzKSk7IAotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGZlYXR1cmVOYW1lCi0JICogQHBhcmFtIGlkCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VWYWx1ZShFRGF0YU9iamVjdCBvYmosIFN0cmluZyBmZWF0dXJlTmFtZSwgU3RyaW5nIGlkKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChvYmogPT0gbnVsbCB8fCBmZWF0dXJlTmFtZSA9PSBudWxsIHx8IGlkID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJRU9iamVjdCB2YWx1ZSA9IGdldEVsZW1lbnQoaWQpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZSwgZmVhdHVyZU5hbWUsIGlkKSk7Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGZpbmQgdGhlIGZlYXR1cmUgYW5kIHNldCB0aGUgdmFsdWUKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRSbWNGZWF0dXJlKG9iagotCQkJCS5lQ2xhc3MoKSwgZmVhdHVyZU5hbWUpOwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGdldFN0cmluZyhvYmopLCBmZWF0dXJlTmFtZSwgaWQgfTsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMiwgcGFyYXMpKTsgCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBkb24ndCBpdGVyYXRlIHRoZSBjb250YWlubWVudCBmZWF0dXJlCi0JCWlmICh2YWx1ZS5lQ29udGFpbmVyKCkgPT0gb2JqKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBTdHJpbmcgc3RyID0gZmVhdHVyZS5nZXRFVHlwZSgpLmdldE5hbWUoKTsKLQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCXRyeSB7Ci0JCQkJTGlzdCBpdGVtcyA9IChMaXN0KSBvYmouZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoIWl0ZW1zLmNvbnRhaW5zKHZhbHVlKSkgewotCQkJCQlpdGVtcy5hZGQodmFsdWUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZ2V0U3RyaW5nKG9iaiksIGZlYXR1cmVOYW1lLCBpZCB9OwotCQkJCWxvZ2dlcgotCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQlOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlXzIsIHBhcmFzKSwgZSk7IAotCQkJfQotCQl9IGVsc2UgewotCQkJb2JqLmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQl9Ci0JCQotCQlzZXREaXJ0eShvYmopOwotCX0KLQotCS8qKgotCSAqIFNldHMgd29yayBvcmRlci4KLQkgKiBAcGFyYW0gdW1hV29ya09yZGVyCi0JICogQHBhcmFtIHByZWRJZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtPcmRlcihPYmplY3QgdW1hV29ya09yZGVyLCBTdHJpbmcgcHJlZElkKSB7Ci0JCWlmICh1bWFXb3JrT3JkZXIgaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQocHJlZElkKTsKLQkJCSgoV29ya09yZGVyKSB1bWFXb3JrT3JkZXIpLnNldFByZWQoZSk7Ci0JCQkKLQkJCXNldERpcnR5KChFT2JqZWN0KXVtYVdvcmtPcmRlcik7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZpeGVzIGxpYnJhcnkuCi0JICovCi0JcHVibGljIHZvaWQgZml4TGlicmFyeSgpIHsKLQkJTWV0aG9kTGlicmFyeSByb290T2JqZWN0ID0gZ2V0Um9vdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gKChNZXRob2RMaWJyYXJ5KSByb290T2JqZWN0KS5nZXRNZXRob2RQbHVnaW5zKCkKLQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJZml4UGx1Z2luKChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE1ldGhvZFBhY2thZ2UgY3BSb290ID0gbnVsbDsKLQotCXByaXZhdGUgTWV0aG9kUGFja2FnZSBkcFJvb3QgPSBudWxsOwotCi0vLwlwcml2YXRlIE1ldGhvZFBhY2thZ2UgcGNSb290ID0gbnVsbDsKLQotCXByaXZhdGUgdm9pZCBmaXhQbHVnaW4oTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCi0JCS8vIGZpeCB0aGUgcm9vdCBjdXN0b20gY2F0ZWdvcmllcwotCQlmaXhDdXN0b21DYXRlZ29yaWVzKHBsdWdpbik7Ci0KLQkJTGlzdCBjcFBrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZHBQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCUxpc3QgcGNQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWNwUm9vdCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQkJZHBSb290ID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoKTsKLS8vCQlwY1Jvb3QgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLS8vCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgpOwotCQlnZXRBbGxQYWNrYWdlcyhjcFJvb3QsIGNwUGtncyk7Ci0JCWdldEFsbFBhY2thZ2VzKGRwUm9vdCwgZHBQa2dzKTsKLQkJCi0vLwkJaWYgKCBwY1BrZ3MgIT0gbnVsbCApIHsKLS8vCQkJZ2V0QWxsUGFja2FnZXMocGNSb290LCBwY1BrZ3MpOwotLy8JCX0KLQkJCQotCQlMaXN0IHByb2NzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2luLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdClpdC5uZXh0KCk7Ci0JCQlib29sZWFuIG9sZE5vdGlmeSA9IG8uZURlbGl2ZXIoKTsKLQkJCXRyeQl7Ci0JCQkJLy8gdHVybiBvZmYgbm90aWZpY2F0aW9ucyB0byBhdm9pZCBwb3NzaWJsZSBkZWFkbG9jayBvciB0aHJlYWQgaXNzdWUKLQkJCQkvLyAxNTQxNDIgLSBpbXBvcnQgeG1sIGNhdXNlZCB0aHJlYWQgYWNjZXNzIGVycm9yCi0JCQkJby5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJCi0JCQkJaWYgKG8gaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCXByb2NzLmFkZChvKTsKLQkJCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQkJU3RyaW5nIHBOYW1lID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIG8pLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQkJaWYgKHBOYW1lID09IG51bGwgfHwgcE5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJKChEZXNjcmliYWJsZUVsZW1lbnQpIG8pCi0JCQkJCQkJCS5zZXRQcmVzZW50YXRpb25OYW1lKCgoRGVzY3JpYmFibGVFbGVtZW50KSBvKQotCQkJCQkJCQkJCS5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQotCQkJCS8vIGZpeCB0aGUgbmFtZSBzdHJpbmcKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgIShvIGluc3RhbmNlb2YgU2VjdGlvbikpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSAoKE1ldGhvZEVsZW1lbnQpIG8pLmdldE5hbWUoKTsKLQkJCQkJU3RyaW5nIG5ld19uYW1lID0gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShuYW1lKTsKLQkJCQkJaWYgKCAhbmV3X25hbWUuZXF1YWxzKG5hbWUpICkgewotCQkJCQkJKChNZXRob2RFbGVtZW50KSBvKS5zZXROYW1lKG5ld19uYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJby5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb2NzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwcm9jcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KSBpdC5uZXh0KCk7Ci0JCQkJT2JqZWN0IHByb2MgPSBwYy5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJaWYgKCFkcFBrZ3MuY29udGFpbnMocGMpKSB7Ci0JCQkJCQltb3ZlUHJvY2Vzc0NvbXBvbmVudChwYywgZHBSb290KTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCWlmICghY3BQa2dzLmNvbnRhaW5zKHBjKSkgewotCQkJCQkJbW92ZVByb2Nlc3NDb21wb25lbnQocGMsIGNwUm9vdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0QWxsUGFja2FnZXMoTWV0aG9kUGFja2FnZSBwa2csIExpc3QgcGtncykgewotCQlwa2dzLmFkZChwa2cpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlnZXRBbGxQYWNrYWdlcygoTWV0aG9kUGFja2FnZSkgaXQubmV4dCgpLCBwa2dzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIG1vdmUgdGhlIHByb2Nlc3MgcGFja2FnZSB0byB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciwgaWYgdGhlIHBhY2thZ2UgaXMKLQkgKiB0aGUgb25seSBjaGlsZCBvZiBpdCdzIHBhcmVudCwgbW92ZSBpdCdzIHBhcmVudAotCSAqIAotCSAqIEBwYXJhbSBwa2cKLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1vdmVQcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NQYWNrYWdlIHBrZywKLQkJCU1ldGhvZFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCS8vIG1ha2Ugc3VyZSBDYXBhYmlsaXR5IHBhdHRlcm5zIGFyZSBpbiB0aGUgQ2FwYWJpbGl0eSBwYWNrYWdlcwotCQlPYmplY3QgbyA9IHBrZy5lQ29udGFpbmVyKCk7Ci0JCWlmICgobyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKQotCQkJCSYmICgoKFByb2Nlc3NQYWNrYWdlKSBvKS5nZXRDaGlsZFBhY2thZ2VzKCkuc2l6ZSgpID09IDEpCi0JCQkJJiYgbyAhPSBjcFJvb3QgJiYgbyAhPSBkcFJvb3QgKSB7Ci0JCQltb3ZlUHJvY2Vzc0NvbXBvbmVudCgoUHJvY2Vzc1BhY2thZ2UpIG8sIGNvbnRhaW5lcik7Ci0JCX0gZWxzZSB7Ci0JCQljb250YWluZXIuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChwa2cpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZmluZCB0aGUgcm9vdCBjdXN0b20gY2FnZWdvcnkgYW5kIHB1dCB0byB0aGUgcm9vdCBwYWNrYWdlCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgTWV0aG9kUGx1Z2luCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpeEN1c3RvbUNhdGVnb3JpZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdChwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkpOwotCi0JCUxpc3Qgcm9vdEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJQ3VzdG9tQ2F0ZWdvcnkgY2MgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZW1zLnJlbW92ZSgwKTsKLQkJCXJvb3RJdGVtcy5hZGQoY2MpOwotCQkJCi0JCQkvLyAxNTg2OTFDdXN0b20gQ2F0ZWdvcnkgaXMgZGlmZmVyZW50IGluIGV4cG9ydGVkIGxpYnJhcnkKLQkJCS8vIG5lZWQgdG8gcmVtb3ZlIHN1Yi1jYXRlZ29yaWVzIHJlY3Vyc2l2ZWx5Ci0JCQlmaXhDdXN0b21DYXRlZ29yaWVzKGNjLCBpdGVtcywgcm9vdEl0ZW1zKTsKLQkJfQotCi0JCVRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KHBsdWdpbikuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmFkZEFsbCgKLQkJCQlyb290SXRlbXMpOwotCi0JfQotCQotCS8qKgotCSAqIGZpbmQgdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3JpZXMgYnkgcmVtb3ZpbmcgdGhlIHN1Yi1jYXRlZ29yaWVzIHJlY3Vyc2l2ZWx5Ci0JICogCi0JICogQHBhcmFtIGNjCi0JICogQHBhcmFtIGl0ZW1zCi0JICogQHBhcmFtIHJvb3RJdGVtcwotCSAqLwotCXByaXZhdGUgdm9pZCBmaXhDdXN0b21DYXRlZ29yaWVzKEN1c3RvbUNhdGVnb3J5IGNjLCBMaXN0IGl0ZW1zLCBMaXN0IHJvb3RJdGVtcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2MuZ2V0U3ViQ2F0ZWdvcmllcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotCQkJaXRlbXMucmVtb3ZlKGl0ZW0pOwotCQkJcm9vdEl0ZW1zLnJlbW92ZShpdGVtKTsKLQkJCWZpeEN1c3RvbUNhdGVnb3JpZXMoKEN1c3RvbUNhdGVnb3J5KWl0ZW0sIGl0ZW1zLCByb290SXRlbXMpOwotCQl9Ci0JCQotCQkvLyBhbHNvIGl0ZXJhdGUgdGhlIGNvbnRhaW5lZCBlbGVtZW50cwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2MuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWl0ZW1zLnJlbW92ZShpdGVtKTsKLQkJCQlyb290SXRlbXMucmVtb3ZlKGl0ZW0pOwotCQkJCWZpeEN1c3RvbUNhdGVnb3JpZXMoKEN1c3RvbUNhdGVnb3J5KWl0ZW0sIGl0ZW1zLCByb290SXRlbXMpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIGRlbGV0ZSB0aGUgdW4tbmVlZGVkIGVsZW1lbnRzIGFyZSBjbGVhciByZXNvdXJjZXMgCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlRWxlbWVudHMoKSB7Ci0JCQotCQlJRmlsZU1hbmFnZXIgZmlsZU1nciA9IFNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKCk7Ci0KLQkJTGlzdCBkZWxldGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgaWQgPSAoU3RyaW5nKWVudHJ5LmdldEtleSgpOwotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWlmICggc291cmNlRWxlbWVudElEcy5jb250YWlucyhpZCkgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKG92ZXJ3cml0ZSkgewotCQkJCWJvb2xlYW4gdG9EZWxldGUgPSAhKGUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5IHx8IGUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4KLQkJCQkJCQkJCXx8IGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCQlpZiAodG9EZWxldGUpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJCQkJdG9EZWxldGUgPSBwbHVnaW4gIT0gbnVsbCAmJiAhaXNOZXdFbGVtZW50KHBsdWdpbi5nZXRHdWlkKCkpCi0JCQkJCSYmIHNvdXJjZUVsZW1lbnRJRHMuY29udGFpbnMocGx1Z2luLmdldEd1aWQoKSk7Ci0JCQkJfQotCQkJCWlmICh0b0RlbGV0ZSkgewotCQkJCQlkZWxldGVkRWxlbWVudHMuYWRkKGUpOwotCQkJCQloYW5kbGVBY3Rpdml0eVJlbW92YWwoZSk7Ci0JCQkJCS8vRWNvcmVVdGlsLnJlbW92ZShlKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoIChlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpICYmIFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoIChDdXN0b21DYXRlZ29yeSllICkgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQloYW5kbGVBY3Rpdml0eVJlbW92YWwoZSk7CQotCQkJCi0JCQkvLyBkZWxldGUgdGhlIGVsZW1lbnQgaWYgdGhlIGNvbnRhaW5nIHBhY2thZ2UgaXMgaW4gdGhlIHNvdXJjZSBsaWJyYXJ5Ci0JCQkvLyBkb24ndCBkZWxldGUgaWYgdGhlIHBhY2thZ2UgaXMgbm90IGluIHRoZSB4bWwgbGlicmFyeQotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSBUbmdVdGlsLmdldE1ldGhvZFBhY2thZ2UoZSk7Ci0JCQkKLQkJCWlmICggcGtnICE9IG51bGwgKSB7IAotCQkJCVN0cmluZyBwaWQgPSBwa2cuZ2V0R3VpZCgpOwotCQkJCWlmICggc291cmNlRWxlbWVudElEcy5jb250YWlucyhwaWQpICkgewotCQkJCQlkZWxldGVkRWxlbWVudHMuYWRkKGUpOwotCQkJCQkKLQkJCQkJLy8gZGVsZXRlIHRoZSBlbGVtZW50IGZyb20gdGhlIGxpYnJhcnkKLQkJCQkJLy9FY29yZVV0aWwucmVtb3ZlKGUpOwkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGRlbGV0ZSB0aGUgcmVzb3VyY2VzCi0JCWRlbGV0ZVJlc29ydWNlcyhkZWxldGVkRWxlbWVudHMpOwotCX0KLQotCS8vCTE2NDU4MQotCXByaXZhdGUgdm9pZCBoYW5kbGVBY3Rpdml0eVJlbW92YWwoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmICghKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlBY3Rpdml0eSBlYWN0ID0gKEFjdGl2aXR5KSBlOwotCQlBY3Rpdml0eSBzYWN0ID0gZWFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJaWYgKHNhY3QgIT0gbnVsbCkgewotCQkJc2FjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZShlYWN0KTsKLQkJfQotCX0KLQkKLQkvLyBjbGVhciByZXNvdXJjZXMgZm9yIGRlbGV0ZWQgZWxlbWVudHMKLQlwcml2YXRlIHZvaWQgZGVsZXRlUmVzb3J1Y2VzKExpc3QgZGVsZXRlZEVsZW1lbnRzKSB7Ci0JCWlmICggZGVsZXRlZEVsZW1lbnRzLnNpemUoKSA9PSAwICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJRmlsZU1hbmFnZXIgZmlsZU1nciA9IFNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGRlbGV0ZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotCQkJCi0JCQlFT2JqZWN0IG9iaiA9IG51bGw7Ci0JCQlpZiAoIGUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQgKSB7Ci0JCQkJb2JqID0gKChEZXNjcmliYWJsZUVsZW1lbnQpZSkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQl9IGVsc2UgaWYgKCBlIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uIHx8Ci0JCQkJCW92ZXJ3cml0ZSAmJiBlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCW9iaiA9IGU7Ci0JCQl9Ci0JCQlpZiAoIG9iaiAhPSBudWxsICkgewotCQkJCU1ldGhvZEVsZW1lbnQgcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCQkJUmVzb3VyY2UgcGx1Z2luUmVzID0gcGx1Z2luID09IG51bGwgPyBudWxsIDogcGx1Z2luLmVSZXNvdXJjZSgpOwotCQkJCQotCQkJCVJlc291cmNlIHJlcyA9IG9iai5lUmVzb3VyY2UoKTsKLQkJCQlpZiAoIHJlcyAhPSBudWxsICYmIHJlcyAhPSBwbHVnaW5SZXMpIHsJCS8vUHJvdGVjdGVkIGZyb20gYnVncyBsaWtlIDE3NzA0MgotCQkJCQlTdHJpbmcgZmlsZSA9IHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGVsZXRpbmcgcmVzb3VyY2U6ICIgKyBmaWxlKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKCAhZmlsZU1nci5kZWxldGUoZmlsZSkgKSB7Ci0JCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hYmxlIHRvIGRlbGV0ZSBmaWxlOiAiICsgZmlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCUVPYmplY3QgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlcyk7Ci0JCQkJCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShyZXNNZ3IpOwotCQkJCQl9Ci0JCQkJCUVPYmplY3QgcmVzRGVzID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKHJlcyk7Ci0JCQkJCWlmIChyZXNEZXMgIT0gbnVsbCkgewotCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShyZXNEZXMpOwotCQkJCQl9Ci0JCQkJCWlmIChvdmVyd3JpdGUpIHsJCQkJCQkKLQkJCQkJCUZpbGUgZm9sZGVyID0gbmV3IEZpbGUoZmlsZSkuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQkJRmlsZSBmaWxlc1tdID0gZm9sZGVyLmxpc3RGaWxlcygpOwotCQkJCQkJaWYgKGZpbGVzID09IG51bGwgfHwgZmlsZXMubGVuZ3RoID09IDAgKSB7Ci0JCQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWxldGluZyBmb2xkZXIgcmVzb3VyY2U6ICIgKyBmb2xkZXIpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoICFmaWxlTWdyLmRlbGV0ZShmb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpICkgewotCQkJCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmFibGUgdG8gZGVsZXRlIGZvbGRlciBmaWxlOiAiICsgZm9sZGVyKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0JCQkJCQkJCQotCQkJfQotCQkJCi0JCQlFY29yZVV0aWwucmVtb3ZlKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBndWlkCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IGdpdmVuIGJ5IGd1aWQgaXMgbmV3LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmV3RWxlbWVudChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gbmV3RWxlbWVudHNNYXAuY29udGFpbnNLZXkoZ3VpZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODc5YjE2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBJbXBvcnQgWE1MIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9JbXBvcnRYTUxXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvSW1wb3J0WE1MV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1ZDU0ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9JbXBvcnRYTUxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuU2F2ZUFsbEVkaXRvcnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnByZWZlcmVuY2VzLkltcG9ydFhNTFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnNlcnZpY2VzLkltcG9ydFhNTFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5MaWJyYXJ5QmFja3VwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBUaGUgSW1wb3J0IFhNTCB3aXphcmQuCi0gKiA8cD4KLSAqIFRoaXMgd2l6YXJkIGlzIHVzZWQgdG8gaW1wb3J0IG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgc3RvcmVkIGluIGEgWE1MIGZpbGUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFhNTFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQgewotCi0JSW1wb3J0WE1MU2VydmljZSBzZXJ2aWNlID0gbmV3IEltcG9ydFhNTFNlcnZpY2UoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBzdWNjZWVkID0gdHJ1ZTsKLQkKLQlwcml2YXRlIFNlbGVjdFhNTEZpbGVQYWdlIGZpbGVQYWdlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEltcG9ydFhNTFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0V2luZG93VGl0bGUoSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFdpemFyZF90aXRsZSk7Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQkvLyBjaGVjayBvdXQgdGhlIGxpYnJhcnkgZmlyc3QKLQkJSUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSBTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcigpOwotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpICE9IG51bGwpIHsKLQkJCWZpbGVNZ3IuY2hlY2tNb2RpZnkoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSwKLQkJCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKTsKLQkJfQotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCAmJiBtYW5hZ2VyLmlzTWV0aG9kTGlicmFyeVJlYWRPbmx5KCkpIHsKLQkJCUZpbGUgbGlicmFyeUZpbGUgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSwKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FKTsKLQkJCUltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlLAotCQkJCQlJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MRXJyb3JfbXNnLAotCQkJCQlOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MRXJyb3JfcmVhc29uLAotCQkJCQkJCWxpYnJhcnlGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIHRydWUsIG51bGwsIG51bGwsIEltcG9ydFhNTFBsdWdpbgotCQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvd2l6YmFuL0ltcG9ydFhNTC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWZpbGVQYWdlID0gbmV3IFNlbGVjdFhNTEZpbGVQYWdlKCk7Ci0JCWFkZFBhZ2UoZmlsZVBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvWE1MRmlsZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcmVmcmVzaCA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5pc0VuYWJsZWQoKTsKLQkJaWYgKHJlZnJlc2gpIHsKLQkJCS8vTmVlZGVkOiBiZWNhdXNlIExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIGFkZHMgZXZlbnRzIHRvIFJlZnJlc2hKb2IgYXQgdGhlCi0JCQkvL2VuZCBvZiAicnVuIiBjYWxsIQotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9CQkKLQkJZmluYWwgYm9vbGVhbiByZXRbXSA9IG5ldyBib29sZWFuWzFdOwkJCi0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXJldFswXSA9IHBlcmZvcm1GaW5pc2hfKCk7Ci0JCQl9CQkJCi0JCX0pOwotCQlpZiAocmVmcmVzaCkgewkJCi0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCQkKLQkJCi0JCXJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMucmV2aWV3X2xvZ19maWxlcywKLQkJCQkJCXNlcnZpY2UuZ2V0TG9nUGF0aCgpKTsKLQkJCQkJTXNnQm94LnByb21wdChtc2csIFNXVC5PSyk7Ci0JCQl9CQkJCi0JCX0pOwkJCi0JCQotCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJcmV0dXJuIHJldFswXTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcGVyZm9ybUZpbmlzaF8oKSB7Ci0JCUxpYnJhcnlCYWNrdXBVdGlsLnByb21wdEJhY2t1cExpYnJhcnkobnVsbCwgbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSkpOwotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydGluZ1hNTF90ZXh0LAotCQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0KLQkJCQkJU3RyaW5nIHhtbEZpbGUgPSBmaWxlUGFnZS5nZXRQYXRoKCk7Ci0JCQkJCWJvb2xlYW4gbWVyZ2VPcHRpb24gPSBmaWxlUGFnZS5nZXRNZXJnZU9wdGlvbigpOwotCQkJCQlzZXJ2aWNlLnNldE92ZXJ3cml0ZSghbWVyZ2VPcHRpb24pOwotCQkJCQlzdWNjZWVkID0gc2VydmljZS5sb2FkWG1sKHhtbEZpbGUpOwotCQkJCQlpZiAoISBzdWNjZWVkKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0JCQkJCQotCQkJCQlzZXJ2aWNlLmRvSW1wb3J0KG1vbml0b3IpOwotCQkJCQlJbXBvcnRYTUxQcmVmZXJlbmNlcy5zZXRYTUxGaWxlKHhtbEZpbGUpOwotCQkJCQlJbXBvcnRYTUxQcmVmZXJlbmNlcy5zZXRNZXJnZU9wdGlvbihtZXJnZU9wdGlvbik7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCi0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgZmFsc2UsIG9wKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVRocm93YWJsZSByZWFsRXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCUltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlLAotCQkJCQlyZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgcmVhbEV4Y2VwdGlvbik7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoIXN1Y2NlZWQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvL1N0cmluZyBtc2cgPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMucmV2aWV3X2xvZ19maWxlcywKLQkJLy8Jc2VydmljZS5nZXRMb2dQYXRoKCkpOwotCQkvL01zZ0JveC5wcm9tcHQobXNnLCBTV1QuT0spOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgd2l6YXJkIGFuZCBmcmVlcyBhbGwgU1dUIHJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzZXJ2aWNlLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL1NlbGVjdFhNTEZpbGVQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL1NlbGVjdFhNTEZpbGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyNTFiZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9TZWxlY3RYTUxGaWxlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnByZWZlcmVuY2VzLkltcG9ydFhNTFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIFhNTCBmaWxlIHRvIGltcG9ydC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0WE1MRmlsZVBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RYTUxGaWxlUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFRleHQgcGF0aFRleHQ7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXRoOwotCi0JcHJpdmF0ZSBib29sZWFuIG1lcmdlT3B0aW9uID0gdHJ1ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFhNTEZpbGVQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShJbXBvcnRYTUxSZXNvdXJjZXMuc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihJbXBvcnRYTUxSZXNvdXJjZXMuc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vSW1wb3J0WE1MLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGZpbGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZmlsZUxhYmVsLnNldFRleHQoSW1wb3J0WE1MUmVzb3VyY2VzLmZpbGVMYWJlbF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JCXBhdGhUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJcGF0aFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXBhdGhUZXh0LnNldFRleHQoSW1wb3J0WE1MUHJlZmVyZW5jZXMuZ2V0WE1MRmlsZSgpKTsJCQotCQlwYXRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoaXNWYWxpZFBhdGgocGF0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKSkpIHsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKEltcG9ydFhNTFJlc291cmNlcy5pbnZhbGlkWE1MRmlsZV9lcnJvcik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCkpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChJbXBvcnRYTUxSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJRmlsZURpYWxvZyBmZCA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCWZkLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgIioueG1sIiwgIiouKiIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN0cmluZyBwYXRoID0gZmQub3BlbigpOwotCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKLQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCXBhdGhUZXh0LnNldFRleHQocGF0aCk7Ci0JCQkJCW9rID0gaXNWYWxpZFBhdGgocGF0aCk7Ci0JCQkJfQotCQkJCXNldFBhZ2VDb21wbGV0ZShvayk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIG9wdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlvcHRpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlvcHRpb25Hcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJb3B0aW9uR3JvdXAuc2V0VGV4dChJbXBvcnRYTUxSZXNvdXJjZXMub3B0aW9uR3JvdXBfdGV4dCk7Ci0KLQkJbWVyZ2VPcHRpb24gPSBJbXBvcnRYTUxQcmVmZXJlbmNlcy5nZXRNZXJnZU9wdGlvbigpOwotCQkJCi0JCUJ1dHRvbiBvdmVyd3JpdGVSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKG9wdGlvbkdyb3VwLAotCQkJCUltcG9ydFhNTFJlc291cmNlcy5vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0LCAxLCAhbWVyZ2VPcHRpb24pOwotCQlvdmVyd3JpdGVSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQltZXJnZU9wdGlvbiA9IGZhbHNlOwotCQkJfQotCQl9KTsKLQkJCi0JCUJ1dHRvbiBtZXJnZVJhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24ob3B0aW9uR3JvdXAsCi0JCQkJSW1wb3J0WE1MUmVzb3VyY2VzLm1lcmdlUmFkaW9CdXR0b25fdGV4dCwgMSwgbWVyZ2VPcHRpb24pOwotCQltZXJnZVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1lcmdlT3B0aW9uID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JCXNldFBhZ2VDb21wbGV0ZShpc1ZhbGlkUGF0aChwYXRoVGV4dC5nZXRUZXh0KCkudHJpbSgpKSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIHVzZXIgc3BlY2lmaWMgcGF0aCBpcyB2YWxpZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHVzZXIgc3BlY2lmaWMgcGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgc3BlY2lmaWVkIHBhdGggaXMgdmFsaWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQlpZiAoZmlsZS5leGlzdHMoKSAmJiBmaWxlLmlzRmlsZSgpKSB7Ci0JCQl0aGlzLnBhdGggPSBwYXRoOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIFhNTCBmaWxlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgWE1MIGZpbGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGltcG9ydCBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBzZWxlY3RlZCB0aGUgbWVyZ2Ugb3B0aW9uLAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSB1c2VyIHNlbGVjdGVkIHRoZSBvdmVyd3JpdGUgb3B0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0TWVyZ2VPcHRpb24oKSB7Ci0JCXJldHVybiBtZXJnZU9wdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9CQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjhlZTYyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpemFyZHMgZm9yIGltcG9ydGluZyBtZXRob2QgbGlicmFyeSBjb250ZW50IHN0b3JlZCBpbiBYTUwuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjNlY2Q5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIEltcG9ydCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWY0NDE1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuaW1wb3J0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTUxMjdiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmltcG9ydDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcsCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcywKLSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLmFudCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSwKLSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmM3ODBjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvQXV0aG9yaW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9BdXRob3JpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzFiYWYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9BdXRob3JpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL0ltcG9ydGluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvSW1wb3J0aW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTk2Mzk0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvSW1wb3J0aW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9NZXRob2RQbHVnaW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL01ldGhvZFBsdWdpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiODJjMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL01ldGhvZFBsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvY29uZmlndXJhdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvY29uZmlndXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlODk2MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2NvbmZpZ3VyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2Z1bGwvd2l6YmFuL0ltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9mdWxsL3dpemJhbi9JbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyNDk4MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2Z1bGwvd2l6YmFuL0ltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9mdWxsL3dpemJhbi9JbXBvcnRNZXRob2RQbHVnaW5zLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9mdWxsL3dpemJhbi9JbXBvcnRNZXRob2RQbHVnaW5zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI0OTgzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZnVsbC93aXpiYW4vSW1wb3J0TWV0aG9kUGx1Z2lucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwNGVlZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBJbXBvcnQKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIEltcG9ydCBXaXphcmQgQ2F0ZWdvcnkKLWltcG9ydENhdGVnb3J5TmFtZT1NZXRob2QKLQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZAotaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPUxpYnJhcnkgQ29uZmlndXJhdGlvbgotaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmRUZXh0PUltcG9ydCBhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLQotIyBJbXBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZAotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9TWV0aG9kIFBsdWctaW5zCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkVGV4dD1JbXBvcnQgb25lIG9yIG1vcmUgbWV0aG9kIHBsdWctaW5zLgotCi0KLQotICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDg2MWViYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQiCi0gICAgICAgICAgICBpY29uPSIvaWNvbnMvY29uZmlndXJhdGlvbi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4gCi0gICAgICAgICAgICAgICAlaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmRUZXh0Ci0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLkltcG9ydFBsdWdpbldpemFyZCIKLSAgICAgICAgICAgIGljb249Ii9pY29ucy9NZXRob2RQbHVnaW4uZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkcy5JbXBvcnRQbHVnaW5XaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmRUZXh0Ci0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkcy5JbXBvcnRQbHVnaW5XaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9JbXBvcnRQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9JbXBvcnRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzliMmI1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvSW1wb3J0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUaGUgSW1wb3J0IHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEltcG9ydFBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBJbXBvcnRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1wb3J0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvSW1wb3J0UmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvSW1wb3J0UmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhODZmYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL0ltcG9ydFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEltcG9ydFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSW1wb3J0UmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydENvbmZpZ1dpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0czOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX0VSUl9JbXBvcnRfY29uZmlndXJhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRDb25maWdSZXBvcnRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRQbHVnaW5XaXphcmRfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRQbHVnaW5XaXphcmRfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0UGx1Z2luV2l6YXJkX3dhcm5fZXhpc3RpbmdfcGx1Z2luczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9jaXJjdWxhcl9wbHVnaW5zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ3NUb0ltcG9ydF9sYWJlbDE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfdGl0bGUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub3RfdXNlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fcGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fZGlyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9hdXRob3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9yZWFkb25seTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c2OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpZmZSZXBvcnRWaWV3ZXJfY29udGVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWZmUmVwb3J0Vmlld2VyX2luX2ltcG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpZmZSZXBvcnRWaWV3ZXJfaW5fbGliOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpZmZSZXBvcnRWaWV3ZXJfc3RhdHVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luTm90RXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNOb1NlbGVjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fcGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luTm9TZWxlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19kaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fcmVhZG9ubHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fbG9ja2VkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfZXJyb3Jfbm90X3VwZGF0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luRGF0YUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpZmZSZXBvcnRWaWV3ZXJfdHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY05vdEV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGRUb29sOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd247Ci0JCi0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBJbXBvcnRSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlNzgyMWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMKLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAyMDBFIC0gSVVQRTAyOTlFCi0jCi0KLSMgSW1wb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQKLWltcG9ydENvbmZpZ1dpemFyZF90aXRsZT1JbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RpdGxlPVNwZWNpZnkgaW1wb3J0IGRpcmVjdG9yeQotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90ZXh0PVNwZWNpZnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gdG8gaW1wb3J0LgotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGl0bGU9UmV2aWV3IGxpYnJhcnkgY2hhbmdlcwotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dD1SZXZpZXcgdGhlIGNoYW5nZXMgdGhhdCB3aWxsIGJlIG1hZGUgdG8gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGU9U2VsZWN0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMKLXNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90ZXh0PVNlbGVjdCBvbmUgb3IgbW9yZSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zIHRvIGltcG9ydC4KLQotIyBJbXBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZAotaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZT1JbXBvcnQgTWV0aG9kIFBsdWctaW5zCi1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90aXRsZT1TcGVjaWZ5IGltcG9ydCBkaXJlY3RvcnkKLXNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RleHQ9U3BlY2lmeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIG1ldGhvZCBwbHVnLWlucyB0byBpbXBvcnQuCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgbWV0aG9kIHBsdWctaW5zCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0PVNlbGVjdCBvbmUgb3IgbW9yZSBtZXRob2QgcGx1Zy1pbnMgdG8gaW1wb3J0LiBJZiBhIHNlbGVjdGVkIHBsdWctbiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeSwgdmVyaWZ5IHRoZSB2ZXJzaW9uIGRpZmZlcmVuY2VzLgotaW1wb3J0UGx1Z2luc1dpemFyZF9FUlJfSW1wb3J0X3BsdWdpbj1JbXBvcnQgcGx1Z2luIGZhaWxlZAotCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cwPVZhbGlkYXRpbmcgc2VsZWN0ZWQgbGlicmFyeSBjb25maWd1cmF0aW9uLi4uCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cxPVRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBjb25maWd1cmF0aW9uLgotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMz1JbXBvcnRpbmcgbWV0aG9kIGNvbmZpZ3VyYXRpb24uLi4KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzI9Q2Fubm90IGltcG9ydCB0aGUgY3VycmVudGx5IG9wZW5lZCBsaWJyYXJ5IGludG8gaXRzZWxmLgotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9NU0cxPUltcG9ydGluZyBtZXRob2QgY29uZmlndXJhdGlvbi4uLgotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9FUlJfSW1wb3J0X2NvbmZpZ3VyYXRpb249SW1wb3J0IGNvbmZpZ3VyYXRpb24gZmFpbGVkCi0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF90aXRsZT1DaGVja291dCBmYWlsZWQKLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c9U29tZSBmaWxlcyBhcmUgbm90IGNoZWNrZWQgb3V0LCBkbyB5b3Ugd2FudCB0byB0cnkgYWdhaW4/Ci0KLUltcG9ydENvbmZpZ1JlcG9ydFBhZ2VfdGl0bGU9SW1wb3J0aW5nIENvbmZpZ3VyYXRpb24gUmVwb3J0Ci1JbXBvcnRQbHVnaW5XaXphcmRfcmVhZG9ubHk9SVVQRTAyMDFFOiBMaWJyYXJ5IGlzIHJlYWQtb25seS4KLUltcG9ydFBsdWdpbldpemFyZF9NU0cxPUltcG9ydGluZyBtZXRob2QgcGx1Zy1pbi4uLgotSW1wb3J0UGx1Z2luV2l6YXJkX2Vycm9yPUVycm9yCi1JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zPUlVUEUwMjAwRTogVGhlIGZvbGxvd2luZyBzZWxlY3RlZCBwbHVnaW4ocykgYWxyZWFkeSBleGlzdCBhbmQgcmUtaW1wb3J0aW5nIHRoZSBzYW1lIHBsdWdpbihzKSB3aWxsIG92ZXJ3cml0ZSB0aGUgZXhpc3Rpbmcgb25lKHMpOlxuXG4gezB9IFxuXG5BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/Ci1JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZT1cblxuQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotSW1wb3J0UGx1Z2luV2l6YXJkX3dhcm5fY2lyY3VsYXJfcGx1Z2lucz1DaXJjdWxhciByZWZlcmVuY2VzIGRldGVjdGVkIGFtb25nIHRoZSBmb2xsb3dpbmcgcGx1Z2lucwotCi1TZWxlY3RDb25maWdzVG9JbXBvcnRfbGFiZWwxPVRoZSBmb2xsb3dpbmcgZWxlbWVudHMgd2lsbCBiZSBpbXBvcnRlZDoKLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfZXJyb3I9RXJyb3IKLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfTVNHMT1BbmFseXppbmcKLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX3RpdGxlMj1TZWxlY3QgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucyB0byBpbXBvcnQKLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub3RfdXNlZD1ub3RfdXNlZAotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX3BhdGg9VGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fZGlyPU5vIGRpcmVjdG9yeSBzcGVjaWZpZWQKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zPUF2YWlsYWJsZSBwbHVnLWlucyBpbiB0aGUgaW1wb3J0IGRpcmVjdG9yeToKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9hdXRob3I9QXV0aG9yOgotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb249VmVyc2lvbjoKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9kZXNjPUJyaWVmIGRlc2NyaXB0aW9uOgotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IExpYnJhcnkgaXMgcmVhZC1vbmx5LgotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cwPVZhbGlkYXRpbmcgc2VsZWN0ZWQgcGx1Zy1pbnMuLi4KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMT1UaGUgc3BlY2lmaWVkIHBhdGggZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIG1ldGhvZCBwbHVnLWluLgotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0czPUltcG9ydGluZyBtZXRob2QgcGx1Zy1pbi4uLgotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c1PVRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Zy1pbiBjYW5ub3QgYmUgaW1wb3J0ZWQuIEl0cyBkZXBlbmRlbnQgcGx1Zy1pbiAnJ3swfScnIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNj1UaGUgc2VsZWN0ZWQgbWV0aG9kIHBsdWctaW4gY2Fubm90IGJlIGltcG9ydGVkLiBBIGRlcGVuZGVudCBwbHVnLWluIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLURpZmZSZXBvcnRWaWV3ZXJfY29udGVudD1Db250ZW50Ci1EaWZmUmVwb3J0Vmlld2VyX2luX2ltcG9ydD1JbiBJbXBvcnQKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9NU0cxPUFuYWx5emluZyBmaWxlcy4uLgotRGlmZlJlcG9ydExhYmVsUHJvdmlkZXJfeWVzPVllcwotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2Vycm9yPUVycm9yCi1EaWZmUmVwb3J0Vmlld2VyX2luX2xpYj1JbiBMaWJyYXJ5Ci1EaWZmUmVwb3J0Vmlld2VyX3N0YXR1cz1TdGF0dXMKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzPVNlbGVjdGVkIHBsdWctaW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5Ob3RFeGlzdHM9U2VsZWN0ZWQgcGx1Zy1pbiBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHM9Q29uZmlndXJhdGlvbiBmb3VuZCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5Ci1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjTm9TZWxlY3Rpb249Tm8gY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIHNlbGVjdGVkLgotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY0RhdGFMYWJlbD1TZWxlY3RlZCBjb25maWd1cmF0aW9uIGluIHRoZSBpbXBvcnQgZGlyZWN0b3J5Ci1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9jb25maWdzPUF2YWlsYWJsZSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zIGluIHRoZSBpbXBvcnQgZGlyZWN0b3J5OgotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZD1ub3RfdXNlZAotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfZGVzYz1CcmllZiBkZXNjcmlwdGlvbjoKLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fcGF0aD1UaGUgc3BlY2lmaWVkIHBhdGggZG9lcyBub3QgZXhpc3QuCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luTm9TZWxlY3Rpb249Tm8gcGx1Zy1pbiBzZWxlY3RlZC4KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fZGlyPU5vIGRpcmVjdG9yeSBzcGVjaWZpZWQKLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX3JlYWRvbmx5PVBsdWdpbiB7MH0gaXMgcmVhZG9ubHlcbgotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fbG9ja2VkPUlVUEUwMjAzRTogUGx1Z2luIHswfSBpcyBsb2NrZWRcbgotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlPVNvbWUgb2YgdGhlIHBsdWdpbihzKSBpbiB0aGUgbGlicmFyeSBhcmUgZWl0aGVyIGxvY2tlZCBvciByZWFkb25seS5cbiBQbGVhc2UgdW5sb2NrIHRoZSBwbHVnaW5zIGFuZCBtYWtlIHN1cmUgdGhlIGZpbGVzIGFyZSB1cGRhdGFibGUuCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luRGF0YUxhYmVsPVNlbGVjdGVkIHBsdWctaW4gaW4gdGhlIGltcG9ydCBkaXJlY3RvcnkKLURpZmZSZXBvcnRWaWV3ZXJfdHlwZT1Db250ZW50IFR5cGUKLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzPVNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IGxpYnJhcnkuCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBFMDIwNEU6IFRoZSBzcGVjaWZpZWQgZmlsZXMgd2VyZSBleHBvcnRlZCBieSBhIHByZXZpb3VzIHZlcnNpb24gKHswfSkgb2YgezF9LiBUaGUgZmlsZXMgbXVzdCBiZSBleHBvcnRlZCB1c2luZyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHsxfS4KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQRTAyMDVFOiBUaGUgc3BlY2lmaWVkIGZpbGVzIHdlcmUgZXhwb3J0ZWQgYnkgYSBwcmV2aW91cyB2ZXJzaW9uIG9mIHswfS4gVGhlIGZpbGVzIG11c3QgYmUgZXhwb3J0ZWQgdXNpbmcgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB7MH0uCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBFMDIwNkU6IFRoZSBzcGVjaWZpZWQgZmlsZXMgd2VyZSBleHBvcnRlZCBieSBhIG5ld2VyIHZlcnNpb24gKHswfSkgb2YgezF9LiBZb3UgbXVzdCB1cGdyYWRlIHsxfSBpbiBvcmRlciB0byBpbXBvcnQgdGhlIGZpbGVzLiAgCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUEUwMjA3RTogVGhlIHNwZWNpZmllZCBmaWxlcyBjYW5ub3QgYmUgb3BlbmVkLiBZb3UgbXVzdCB1cGdyYWRlIHswfSBpbiBvcmRlciB0byBpbXBvcnQgdGhlIGZpbGVzLiAgCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDZiOTAzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIEltcG9ydCBwbHVnLWluJ3MgbGlmZSBjeWNsZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlnU3BlY3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWdTcGVjcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyODk2OTcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWdTcGVjcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uU3BlYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLQotLyoqCi0gKiBNb2RlbHMgYSBsaXN0IG9mIGxpYnJhcnkgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ1NwZWNzIHsKLQotCS8vIEEgbGlzdCBvZiBjb25maWd1cmF0aW9uIGVudHJpZXMuCi0JcHVibGljIExpc3QgY29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ1NwZWNzKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgZW50cnkuCi0JICovCi0JcHVibGljIEVudHJ5IG5ld0VudHJ5KCkgewotCQlFbnRyeSBlID0gbmV3IEVudHJ5KCk7Ci0JCWNvbmZpZ3MuYWRkKGUpOwotCi0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBpdGVyYXRvciBmb3IgdGhlIGNvbmZpZyBzcGVjcy4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBjb25maWdzLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGNsYXNzIEVudHJ5IHsKLQotCQlwdWJsaWMgQ29uZmlndXJhdGlvblNwZWMgY29uZmlnU3BlYyA9IG51bGw7Ci0KLQkJcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZXhpc3RpbmdDb25maWcgPSBudWxsOwotCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdGVkID0gdHJ1ZTsKLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJaWYgKGNvbmZpZ1NwZWMgIT0gbnVsbCkKLQkJCQlpZiAoY29uZmlnU3BlYy5uYW1lICE9IG51bGwpCi0JCQkJCXJldHVybiBjb25maWdTcGVjLm5hbWU7Ci0JCQlyZXR1cm4gInVua25vd24gY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWdTcGVjc0ltcG9ydE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWdTcGVjc0ltcG9ydE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQwNjliMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25TcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuTGlicmFyeURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBpbXBvcnQgb2YgbGlicmFyeSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbmZpZyBzcGVjcyBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIENvbmZpZ1NwZWNzIGdldENvbmZpZ1NwZWNzKGZpbmFsIExpYnJhcnlEb2N1bWVudCBkb2N1bWVudCkgewotCQlmaW5hbCBDb25maWdTcGVjcyBjb25maWdTcGVjcyA9IG5ldyBDb25maWdTcGVjcygpOwotCi0JCS8vIFJlbW92ZSB0aGUgdW5uZWVkZWQgY29uZmlndXJhdGlvbnMuCi0JCUZpbGUgY29uZmlnRGlyID0gbmV3IEZpbGUoZG9jdW1lbnQuZ2V0RmlsZSgpLmdldFBhcmVudCgpLCBNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSk7CQkJCi0JCUxpYnJhcnlEb2N1bWVudC5Db25maWdEb2NWaXNpdG9yIHZpc2l0b3IgPSBuZXcgTGlicmFyeURvY3VtZW50LkNvbmZpZ0RvY1Zpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2aXNpdChGaWxlIGZpbGUsIEVsZW1lbnQgbm9kZSkgewotCQkJCUNvbmZpZ1NwZWNzLkVudHJ5IGVudHJ5ID0gY29uZmlnU3BlY3MubmV3RW50cnkoKTsKLQkJCQllbnRyeS5jb25maWdTcGVjID0gZG9jdW1lbnQuZ2V0Q29uZmlndXJhdGlvblNwZWMobm9kZSk7Ci0JCQkJZW50cnkuZXhpc3RpbmdDb25maWcgPSBnZXRFeGlzdGluZ0NvbmZpZyhlbnRyeS5jb25maWdTcGVjLmd1aWQpOwotCQkJfQotCQl9OwkJCQotCQlMaWJyYXJ5RG9jdW1lbnQudmlzaXRDb25maWdGaWxlcyhjb25maWdEaXIsIHZpc2l0b3IpOwkJCQotCQlyZXR1cm4gY29uZmlnU3BlY3M7Ci0JfQotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGdldEV4aXN0aW5nQ29uZmlnKFN0cmluZyBndWlkKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWdzW2ldOwotCQkJaWYgKGNvbmZpZy5nZXRHdWlkKCkuZXF1YWxzKGd1aWQpKSB7Ci0JCQkJcmV0dXJuIGNvbmZpZzsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEltcG9ydHMgdGhlIHNlbGVjdGVkIGxpYnJhcnkgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gc3BlY3MKLQkgKiAgICAgICAgICAgIEEgbGlicmFyeSBjb25maWd1cmF0aW9uIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0ltcG9ydChDb25maWdTcGVjcyBzcGVjcykgewotCQl0cnkgewotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQlMaWJyYXJ5VXRpbC5sb2FkQWxsKGxpYik7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzcGVjcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29uZmlnU3BlY3MuRW50cnkgZW50cnkgPSAoQ29uZmlnU3BlY3MuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQlpZiAoZW50cnkuc2VsZWN0ZWQpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBjcmVhdGVDb25maWcoZW50cnkuY29uZmlnU3BlYyk7Ci0KLQkJCQkJaWYgKGVudHJ5LmV4aXN0aW5nQ29uZmlnICE9IG51bGwpIHsKLQkJCQkJCS8vIE1lcmdlIHRoZSBuZXcgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIGludG8gdGhlIGV4aXN0aW5nCi0JCQkJCQkvLyBvbmUsCi0JCQkJCQkvLyBhbnl0aGluZyBpbiB0aGUgY3VycmVudCBjb25maWd1YXRpb24gc2hvdWxkIGJlIGtlcHQuCi0JCQkJCQkvLyBFY29yZVV0aWwucmVwbGFjZShlbnRyeS5leGlzdGluZ0NvbmZpZywgY29uZmlnKTsKLQkJCQkJCUxpc3QgcGx1Z2lucyA9IGVudHJ5LmV4aXN0aW5nQ29uZmlnCi0JCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJCQkJCUxpc3QgcGtncyA9IGVudHJ5LmV4aXN0aW5nQ29uZmlnCi0JCQkJCQkJCS5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQkJCQlMaXN0IHZpZXdzID0gZW50cnkuZXhpc3RpbmdDb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCk7Ci0KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRwID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlID0gaXRwLm5leHQoKTsKLQkJCQkJCQlpZiAoIXBsdWdpbnMuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJcGx1Z2lucy5hZGQoZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0cCA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGUgPSBpdHAubmV4dCgpOwotCQkJCQkJCWlmICghcGtncy5jb250YWlucyhlKSkgewotCQkJCQkJCQlwa2dzLmFkZChlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRwID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpLml0ZXJhdG9yKCk7IGl0cAotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlID0gaXRwLm5leHQoKTsKLQkJCQkJCQlpZiAoIXBrZ3MuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJdmlld3MuYWRkKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIEFkZCB0aGUgY29uZmlndXJhdGlvbi4KLQkJCQkJCWxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5hZGQoY29uZmlnKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJTGlicmFyeVV0aWwuc2F2ZUxpYnJhcnkobGliLCBmYWxzZSwgZmFsc2UpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlnKENvbmZpZ3VyYXRpb25TcGVjIHNwZWMpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkJLy8gU2V0IHRoZSBhdHRyaWJ1dGVzLgotCQljb25maWcuc2V0TmFtZShzcGVjLm5hbWUpOwotCQljb25maWcuc2V0QnJpZWZEZXNjcmlwdGlvbihzcGVjLmJyaWVmX2Rlc2MpOwotCQljb25maWcuc2V0R3VpZChzcGVjLmd1aWQpOwotCi0JCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJTGlzdCBwa2dzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJTGlzdCB2aWV3cyA9IGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKTsKLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzcGVjLnBsdWdpbklkcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiAhcGx1Z2lucy5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQlwbHVnaW5zLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzcGVjLnBhY2thZ2VJZHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgIXBrZ3MuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQkJcGtncy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc3BlYy52aWV3SWRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmICF2aWV3cy5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQl2aWV3cy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWd1cmF0aW9uSW1wb3J0RGF0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25JbXBvcnREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1NGNlNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25JbXBvcnREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTGlicmFyeUxvY2F0aW9uRGF0YTsKLQotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgaW5wdXQgZGF0YSByZXF1aXJlZCB0byBpbXBvcnQgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSB7Ci0KLQlwdWJsaWMgTGlicmFyeUxvY2F0aW9uRGF0YSBsbERhdGEgPSBuZXcgTGlicmFyeUxvY2F0aW9uRGF0YSgpOwotCi0JcHJpdmF0ZSBFcnJvckluZm8gZXJyb3IgPSBuZXcgRXJyb3JJbmZvKCk7Ci0KLQkvLyBJZiBzcGVjcyAhPSBudWxsLCBpdCdzIGEgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIG9ubHkuCi0JcHVibGljIENvbmZpZ1NwZWNzIHNwZWNzID0gbnVsbDsKLQotCXB1YmxpYyBMaXN0IGltcG9ydExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBJbmRpY2F0ZSBpZiB5b3Ugd2FudCB0byByZXBsYWNlIGV4aXN0aW5nIG1ldGhvZCBwYWNrYWdlcy4KLQlwdWJsaWMgYm9vbGVhbiByZXBsYWNlRXhpc3RpbmcgPSB0cnVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkltcG9ydERhdGEoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBpZiBhbnkuCi0JICovCi0JcHVibGljIEVycm9ySW5mbyBnZXRFcnJvckluZm8oKSB7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgRXJyb3JJbmZvIHsKLQotCQlwcml2YXRlIFN0cmluZ0J1ZmZlciBlcnJvck1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJcHVibGljIEVycm9ySW5mbygpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKG1lc3NhZ2UpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRFcnJvcigpIHsKLQkJCXJldHVybiBlcnJvck1lc3NhZ2UudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJZXJyb3JNZXNzYWdlLnNldExlbmd0aCgwKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzk4NjU3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuTGlicmFyeURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuT3BlbkxpYnJhcnlXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db252ZXJ0R3VpZGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5UeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVXBncmFkZUNhbGxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0KLS8qKgotICogSW1wb3J0cyBhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlIHsKLQotCXByaXZhdGUgVXBncmFkZUNhbGxlckluZm8gdXBHcmFkZUluZm87Ci0JCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhOwotCi0JTGlicmFyeURvY3VtZW50IGltcG9ydGluZ0xpYkRvYyA9IG51bGw7Ci0KLQlMaWJyYXJ5RGlmZk1hbmFnZXIgZGlmZk1nciA9IG51bGw7Ci0KLQlDb25maWdTcGVjc0ltcG9ydE1hbmFnZXIgc3BlY3NNZ3IgPSBudWxsOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlKENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGEpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBBbmFseXplcyB0aGUgaW1wb3J0ZWQgbGlicmFyeSB3aXRoIHJlc3BlY3QgdG8gdGhlIGJhc2UgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhbmFseXplKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iuc2V0VGFza05hbWUoSW1wb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzApOwotCQkJfQotCi0JCQlkYXRhLmdldEVycm9ySW5mbygpLmNsZWFyKCk7Ci0KLQkJCS8vIFByZXBhcmUgdGhlIGxpYnJhcnkgZmlsZXMuCi0JCQlTdHJpbmcgcGF0aCA9IGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpOwotCQkJaWYgKHBhdGguaW5kZXhPZihGaWxlLnNlcGFyYXRvciArIExpYnJhcnlEb2N1bWVudC5saWJyYXJ5RmlsZSkgPCAwKSB7Ci0JCQkJcGF0aCArPSBGaWxlLnNlcGFyYXRvciArIExpYnJhcnlEb2N1bWVudC5saWJyYXJ5RmlsZTsKLQkJCX0KLQkJCUZpbGUgaW1wb3J0aW5nTGliUGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotCQkJCi0JCQlib29sZWFuIGlzTGlicmFyeUZpbGUgPSB0cnVlOwotCQkJaWYgKCFpbXBvcnRpbmdMaWJQYXRoLmV4aXN0cygpKSB7Ci0JCQkJaW1wb3J0aW5nTGliUGF0aCA9IG5ldyBGaWxlKGltcG9ydGluZ0xpYlBhdGguZ2V0UGFyZW50RmlsZSgpLAotCQkJCQkJTGlicmFyeURvY3VtZW50LmV4cG9ydEZpbGUpOwotCQkJCWlzTGlicmFyeUZpbGUgPSBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKCFpbXBvcnRpbmdMaWJQYXRoLmV4aXN0cygpKSB7Ci0JCQkJZGF0YQotCQkJCQkJLmdldEVycm9ySW5mbygpCi0JCQkJCQkuYWRkRXJyb3IoCi0JCQkJCQkJCU5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cxLCBpbXBvcnRpbmdMaWJQYXRoLmdldFBhcmVudCgpKSk7IAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJYm9vbGVhbiBoYW5kbGVWZXJzaW9uID0gaXNMaWJyYXJ5RmlsZTsKLQkJCWlmIChoYW5kbGVWZXJzaW9uKSB7Ci0JCQkJdXBHcmFkZUluZm8gPSBuZXcgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UuVXBncmFkZUluZm8oVXBncmFkZUNhbGxlckluZm8udXBncmFkZUltcG9ydENvbmZpZywgaW1wb3J0aW5nTGliUGF0aCk7Ci0JCQkJaWYgKCEgaGFuZGxlVG9vbFZlcnNpb24oaW1wb3J0aW5nTGliUGF0aCwgdXBHcmFkZUluZm8pKSB7Ci0JCQkJCWRhdGEKLQkJCQkJLmdldEVycm9ySW5mbygpCi0JCQkJCS5hZGRFcnJvcigKLQkJCQkJCQlOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9FUlJfSW1wb3J0X2NvbmZpZ3VyYXRpb24sIGltcG9ydGluZ0xpYlBhdGguZ2V0UGFyZW50KCkpKTsgCi0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAodXBHcmFkZUluZm8uZ2V0Q29waWVkTGliRmlsZSgpICE9IG51bGwpIHsKLQkJCQkJaW1wb3J0aW5nTGliUGF0aCA9IHVwR3JhZGVJbmZvLmdldENvcGllZExpYkZpbGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkJCQkKLQkJCWltcG9ydGluZ0xpYkRvYyA9IG5ldyBMaWJyYXJ5RG9jdW1lbnQoaW1wb3J0aW5nTGliUGF0aCk7Ci0JCQkKLQkJCWlmICghIGhhbmRsZVZlcnNpb24pIHsKLQkJCQlTdHJpbmcgdmVyc2lvbkVycm9yID0gdmVyc2lvbkNoZWNrKGltcG9ydGluZ0xpYlBhdGguZ2V0QWJzb2x1dGVQYXRoKCksIAotCQkJCQkJCQkJCUltcG9ydFJlc291cmNlcy5pbXBvcnRDb25maWdXaXphcmRfdGl0bGUpOwotCQkJCWlmICh2ZXJzaW9uRXJyb3IgIT0gbnVsbCkgewotCQkJCQlkYXRhLmdldEVycm9ySW5mbygpLmFkZEVycm9yKHZlcnNpb25FcnJvcik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWJvb2xlYW4gaXNDb25maWdTcGVjcyA9IGltcG9ydGluZ0xpYkRvYy5pc0NvbmZpZ1NwZWNzT25seSgpOwotCi0JCQlpZiAoaXNDb25maWdTcGVjcykgewotCi0JCQkJc3BlY3NNZ3IgPSBuZXcgQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyKCk7Ci0KLQkJCQkvLyBTY2FuIHRoZSBsaWJyYXJ5IGZpbGUgZm9yIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0JCQkJZGF0YS5zcGVjcyA9IHNwZWNzTWdyLmdldENvbmZpZ1NwZWNzKGltcG9ydGluZ0xpYkRvYyk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFpc0xpYnJhcnlGaWxlKSB7Ci0JCQkJCWRhdGEKLQkJCQkJLmdldEVycm9ySW5mbygpCi0JCQkJCS5hZGRFcnJvcigKLQkJCQkJCQlOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMSwgaW1wb3J0aW5nTGliUGF0aC5nZXRQYXJlbnQoKSkpOyAKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlkYXRhLnNwZWNzID0gbnVsbDsKLQotCQkJCS8vIE9wZW4gdGhlIGxpYnJhcnkgYW5kIGNvbXBhcmUgdGhlIGRpZmZlcmVuY2UuCi0JCQkJCi0JCQkJLy8gbmVlZCB0byBvcGVuIGFuZCBjbG9zZSB0aGUgbGlicmFyeSB0byBoYXZlIHRoZSBwcm9qZWN0IHJlc291cmNlcyBpbml0aWFsaXplZCBwcm9wZXJseQotCQkJCVN0cmluZyBsaWJEaXIgPSBpbXBvcnRpbmdMaWJQYXRoLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9ICJDb25maWd1cmF0aW9uIEltcG9ydCBQcm9qZWN0ICgiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgSW50ZWdlci50b0hleFN0cmluZyhsaWJEaXIuaGFzaENvZGUoKSkgKyAiKSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdC5vcGVuUHJvamVjdChsaWJEaXIsIHByb2plY3ROYW1lLCBtb25pdG9yKTsKLQkJCQl0cnkgewotCQkJCQlNZXRob2RMaWJyYXJ5IGltcG9ydExpYnJhdHkgPSBMaWJyYXJ5VXRpbAotCQkJCQkJCS5sb2FkTGlicmFyeShpbXBvcnRpbmdMaWJQYXRoLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJTWV0aG9kTGlicmFyeSBiYXNlTGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJCi0JCQkJCWhhbmRsZVR5cGVDaGFuZ2VzKGJhc2VMaWJyYXJ5LCBpbXBvcnRMaWJyYXR5KTsKLQkJCQkJCi0JCQkJCVN0cmluZyBiYXNlTGliRGlyID0gbnVsbDsKLQkJCQkJdHJ5IHsJLy9Ob3QgbmVjY2Vzc2FyeSwgYnV0IHByZXZlbnQgaW50cm9kdWNpbmcgYW55IHBvdGVudGlhbCByZWdyZXNzaW9uIGR1ZSB0byB0aGlzIGNoYW5nZQotCQkJCQkJRmlsZSBiRmlsZSA9IG5ldyBGaWxlKGJhc2VMaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7OwotCQkJCQkJYmFzZUxpYkRpciA9IGJGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewkJCQkJCQotCQkJCQl9Ci0JCQkJCWlmIChsaWJEaXIuZXF1YWxzSWdub3JlQ2FzZShiYXNlTGliRGlyKSkgewotCQkJCQkJZGF0YQotCQkJCQkJCQkuZ2V0RXJyb3JJbmZvKCkKLQkJCQkJCQkJLmFkZEVycm9yKAotCQkJCQkJCQkJCU5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cyLCBpbXBvcnRpbmdMaWJQYXRoLmdldFBhcmVudCgpKSk7IAotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlmaXhJbXBvcnRMaWJyYXJ5U3lzdGVtUGFja2FnZUdVSURzKGJhc2VMaWJyYXJ5LCBpbXBvcnRMaWJyYXR5KTsKLQkJCQkJCi0JCQkJCWRpZmZNZ3IgPSBuZXcgTGlicmFyeURpZmZNYW5hZ2VyKGJhc2VMaWJyYXJ5LCBpbXBvcnRMaWJyYXR5KTsKLQkJCQkJZGlmZk1nci5idWlsZERpZmZUcmVlKCk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJTWV0aG9kTGlicmFyeVByb2plY3QuY2xvc2VQcm9qZWN0KGxpYkRpciwgbW9uaXRvcik7Ci0JCQkJCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltcG9ydCBkYXRhLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBnZXRJbXBvcnREYXRhKCkgewotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHNwZWMgb25seSBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjc09ubHkoKSB7Ci0JCXJldHVybiAoZGF0YS5zcGVjcyAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaWZmIHRyZWUuCi0JICovCi0JcHVibGljIEVsZW1lbnREaWZmVHJlZSBnZXREaWZmVHJlZSgpIHsKLQkJcmV0dXJuIGRpZmZNZ3IuZ2V0RGlmZlRyZWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRJbXBvcnRpbmdMaWJyYXJ5KCkgewotCQlyZXR1cm4gZGlmZk1nci5nZXRJbXBvcnRpbmdMaWJyYXJ5KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGltcG9ydC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtSW1wb3J0KGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkKLQkJLy8gbmVlZCB0byBkaXNhYmxlIHRoZSB3b3Jrc3BhY2UgcmVmcmVzaGluZwotCQlib29sZWFuIHJlZnJlc2ggPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCWlmKHJlZnJlc2gpIHsKLQkJCS8vIGRpc2FibGUgcmVzb3VyY2UgcmVmcmVzaGluZyBkdXJpbmcgaW1wb3J0Ci0JCQkvLwotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iuc2V0VGFza05hbWUoSW1wb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzMpOwotCQkJfQotCi0JCQlpZiAoaXNTcGVjc09ubHkoKSkgewotCQkJCXNwZWNzTWdyLmRvSW1wb3J0KGRhdGEuc3BlY3MpOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5SW1wb3J0TWFuYWdlciBpbXBvcnRpbmdNZ3IgPSBuZXcgTGlicmFyeUltcG9ydE1hbmFnZXIoZGlmZk1nciwgZGF0YS5pbXBvcnRMaXN0KTsJCQkKLQkJCQlpbXBvcnRpbmdNZ3IuZG9NZXJnZShkYXRhLnJlcGxhY2VFeGlzdGluZywgbW9uaXRvcik7Ci0JCQl9Ci0JCQkKLQkJCS8vIHJlZnJlc2ggbGlicmFyeSBmaWxlcyBpbiB3b3Jrc3BhY2UKLQkJCS8vCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCVJlc291cmNlVXRpbC5yZWZyZXNoUmVzb3VyY2VzKGxpYiwgbW9uaXRvcik7Ci0JCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZihyZWZyZXNoKSB7Ci0JCQkJLy8gcmUtZW5hYmxlIHJlc291cmNlIHJlZnJlc2hpbmcgCi0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJCWlmICh1cEdyYWRlSW5mbyAhPSBudWxsKSB7Ci0JCQkJdXBHcmFkZUluZm8ucmVtb3ZlQ29waWVkTGlicmFyeSgpOwotCQkJCXVwR3JhZGVJbmZvID0gbnVsbDsKLQkJCX0KLQkJfQkKLQkJCi0JCXRyeSB7Ci0JCQkvLyBSZW9wZW4gdGhlIGxpYnJhcnkuCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7CQkKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhlIHRvb2wgdmVyc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uQ2hlY2soZmluYWwgU3RyaW5nIHhtbFBhdGgsIGZpbmFsIFN0cmluZyB0aXRsZSkgewotCQlmaW5hbCBTdHJpbmdbXSByZXQgPSBuZXcgU3RyaW5nWzFdOwotCQlyZXRbMF0gPSBudWxsOwotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CQotCQkJcHVibGljIHZvaWQgcnVuKCkgewkJCQkKLQkJCQlWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8gPSBWZXJzaW9uVXRpbC5jaGVja0xpYnJhcnlWZXJzaW9uKG5ldyBGaWxlKHhtbFBhdGgpKTsKLQkJCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsJCQkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChpbmZvLnJlc3VsdCA8IDApIHsKLQkJCQkJCWlmIChpbmZvLnRvb2xJRC5lcXVhbHMoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKSkgewotCQkJCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YSwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCWluZm8udG9vbFZlcnNpb24sIFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd24sIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQlQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7CQkJCQkKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChpbmZvLnJlc3VsdCA+IDApIHsKLQkJCQkJCWlmIChpbmZvLnRvb2xJRC5lcXVhbHMoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKSkgewotCQkJCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbCwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCWluZm8udG9vbFZlcnNpb24sIFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd24sIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQlQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7Ci0JCQkJCQl9Ci0JCQkJCX0gCi0JCQkJfQotCQkJCWlmIChyZXRbMF0gIT0gbnVsbCkgewotCQkJCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgcmV0WzBdKTsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfSk7CQkKLQkJcmV0dXJuIHJldFswXTsKLQl9Ci0JCi0JLyoqCi0JICogRml4ZXMgdGhlIGltcG9ydGVkIGxpYnJhcnkncyBzeXN0ZW0gcGFja2FnZSBndWlkcyB3aXRoIHRob3NlIGJhc2Uncy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZml4SW1wb3J0TGlicmFyeVN5c3RlbVBhY2thZ2VHVUlEcyhNZXRob2RMaWJyYXJ5IGJhc2VMaWJyYXJ5LCBNZXRob2RMaWJyYXJ5IGltcG9ydExpYnJhdHkpIHsKLQkJSGFzaE1hcCBwbHVnaW5zTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTGlzdCBwbHVnaW5zID0gYmFzZUxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKGludCBpPTA7IGkgPCBwbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgcGx1Z2lucy5nZXQoaSk7Ci0JCQlwbHVnaW5zTWFwLnB1dChwbHVnaW4uZ2V0R3VpZCgpLCBwbHVnaW4pOwotCQl9Ci0JCWlmIChwbHVnaW5zTWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlMaXN0IGltcG9ydFBsdWdpbnNUb0ZpeCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpbXBvcnRQbHVnaW5zID0gaW1wb3J0TGlicmF0eS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGk9MDsgaSA8IGltcG9ydFBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpbXBvcnRQbHVnaW5zLmdldChpKTsKLQkJCWlmIChwbHVnaW5zTWFwLmNvbnRhaW5zS2V5KHBsdWdpbi5nZXRHdWlkKCkpKSB7Ci0JCQkJaW1wb3J0UGx1Z2luc1RvRml4LmFkZChwbHVnaW4pOwotCQkJfQotCQl9Ci0JCQotCQlmb3IgKGludCBpPTA7IGkgPCBpbXBvcnRQbHVnaW5zVG9GaXguc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBpbXBvcnRQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpbXBvcnRQbHVnaW5zVG9GaXguZ2V0KGkpOwotCQkJTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBwbHVnaW5zTWFwLmdldChpbXBvcnRQbHVnaW4uZ2V0R3VpZCgpKTsKLQkJCWlmIChiYXNlUGx1Z2luID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUxpc3QgaW1wb3J0UGFja2FnZXMgPSBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKGltcG9ydFBsdWdpbik7Ci0JCQlIYXNoTWFwIGltcG9ydFBhY2thZ2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChpbnQgaj0wOyBqIDwgaW1wb3J0UGFja2FnZXMuc2l6ZSgpOyBqKyspIHsKLQkJCQlNZXRob2RFbGVtZW50IGltcG9ydFBhY2thZ2UgPSAoTWV0aG9kRWxlbWVudCkgaW1wb3J0UGFja2FnZXMuZ2V0KGopOwotCQkJCWltcG9ydFBhY2thZ2VNYXAucHV0KGltcG9ydFBhY2thZ2UuZ2V0TmFtZSgpLCBpbXBvcnRQYWNrYWdlKTsKLQkJCX0KLQkJCQotCQkJTGlzdCBiYXNlUGFja2FnZXMgPSBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKGJhc2VQbHVnaW4pOwkJCQotCQkJZm9yIChpbnQgaj0wOyBqIDwgYmFzZVBhY2thZ2VzLnNpemUoKTsgaisrKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBiYXNlUGFja2FnZSA9IChNZXRob2RFbGVtZW50KSBiYXNlUGFja2FnZXMuZ2V0KGopOwotCQkJCU1ldGhvZEVsZW1lbnQgaW1wb3J0UGFja2FnZSA9IChNZXRob2RFbGVtZW50KSBpbXBvcnRQYWNrYWdlTWFwLmdldChiYXNlUGFja2FnZS5nZXROYW1lKCkpOwotCQkJCWlmIChpbXBvcnRQYWNrYWdlID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVN0cmluZyBndWlkID0gYmFzZVBhY2thZ2UuZ2V0R3VpZCgpOwotCQkJCWlmICghIGltcG9ydFBhY2thZ2UuZ2V0R3VpZCgpLmVxdWFscyhndWlkKSkgewotCQkJCQlpbXBvcnRQYWNrYWdlLnNldEd1aWQoZ3VpZCk7Ci0JCQkJfQotCQkJfQotCQl9CQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVUeXBlQ2hhbmdlcyhNZXRob2RMaWJyYXJ5IGJhc2VMaWIsIE1ldGhvZExpYnJhcnkgaW1wb3J0TGliKSB7Ci0JCUhhc2hNYXAgYmFzZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWNvbGxlY3RQb3RlbnRpYWxUeXBlQ2hhbmdlZChiYXNlTGliLCBiYXNlTWFwKTsKLQkJSGFzaE1hcCBpbXBvcnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQljb2xsZWN0UG90ZW50aWFsVHlwZUNoYW5nZWQoaW1wb3J0TGliLCBpbXBvcnRNYXApOwotCQloYW5kbGVUeXBlQ2hhbmdlcyhiYXNlTWFwLCBpbXBvcnRNYXApOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgTWV0aG9kRWxlbWVudCB0eXBlIGNoYW5nZXMuIE5vdGU6IGZvciBNZXRob2RFbGVtZW50IG9iamVjdHMgaW4gaW1wb3J0TWFwCi0JICogb25seSBlQ2xhc3MgdHlwZSBpcyB1c2VkIGluIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVUeXBlQ2hhbmdlcyhIYXNoTWFwIGJhc2VNYXAsIEhhc2hNYXAgaW1wb3J0TWFwKSB7Ci0JCUFycmF5TGlzdCB0b0NoYW5nZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBpbXBvcnRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3QgZ3VpZCA9IGVudHJ5LmdldEtleSgpOwotCQkJTWV0aG9kRWxlbWVudCBiYXNlRWxlbSA9IChNZXRob2RFbGVtZW50KSBiYXNlTWFwLmdldChndWlkKTsKLQkJCWlmIChiYXNlRWxlbSAhPSBudWxsKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gKE1ldGhvZEVsZW1lbnQpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJaWYgKCEgZWxlbS5lQ2xhc3MoKS5lcXVhbHMoYmFzZUVsZW0uZUNsYXNzKCkpKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbVBhaXJbXSA9IG5ldyBNZXRob2RFbGVtZW50W10ge2Jhc2VFbGVtLCBlbGVtfTsKLQkJCQkJdG9DaGFuZ2VMaXN0LmFkZChlbGVtUGFpcik7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCWZvciAoaW50IGk9MDsgaTx0b0NoYW5nZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbVBhaXJbXSA9IChNZXRob2RFbGVtZW50W10pIHRvQ2hhbmdlTGlzdC5nZXQoaSk7Ci0JCQlmaW5hbCBNZXRob2RFbGVtZW50IGJhc2VFbGVtID0gZWxlbVBhaXJbMF07Ci0JCQlmaW5hbCBNZXRob2RFbGVtZW50IGltcG9ydEVsZW0gPSBlbGVtUGFpclsxXTsKLQkJCWlmIChiYXNlRWxlbSBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlDb252ZXJ0R3VpZGFuY2VUeXBlLmNvbnZlcnRHdWlkYW5jZSgoR3VpZGFuY2UpIGJhc2VFbGVtLCBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCksIG51bGwsIGltcG9ydEVsZW0uZUNsYXNzKCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9IGVsc2UgaWYgKGJhc2VFbGVtIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlUeXBlQ29udmVydGVyLmNvbnZlcnRBY3Rpdml0eSgoQWN0aXZpdHkpIGJhc2VFbGVtLCBpbXBvcnRFbGVtLmVDbGFzcygpKTsgCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb2xsZWN0cyBlbGVtZW50cyBpbiBsaWIgdGhhdCBtYXkgaGF2ZSB0eXBlIGNoYW5nZXMgCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbGxlY3RQb3RlbnRpYWxUeXBlQ2hhbmdlZChNZXRob2RMaWJyYXJ5IGxpYiwgSGFzaE1hcCBtYXApIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSB8fAotCQkJCW9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQltYXAucHV0KGVsZW0uZ2V0R3VpZCgpLCBlbGVtKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFuZGxlVG9vbFZlcnNpb24oRmlsZSBsaWJGaWxlLCBmaW5hbCBVcGdyYWRlQ2FsbGVySW5mbyBpbmZvKSB7Ci0JCWZpbmFsIFN0cmluZyBsaWJGb2xkZXJQYXRoID0gbGliRmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCWZpbmFsIGJvb2xlYW4gcmV0W10gPSBuZXcgYm9vbGVhblsxXTsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewkKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyZXRbMF0gPSBPcGVuTGlicmFyeVdpemFyZC5oYW5kbGVUb29sVmVyc2lvbihsaWJGb2xkZXJQYXRoLCBpbmZvKTsKLQkJCX0KLQkJfSk7CQkJCQkJCQkKLQkJcmV0dXJuIHJldFswXTsKLQl9CQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBVcGdyYWRlSW5mbyBleHRlbmRzIFVwZ3JhZGVDYWxsZXJJbmZvIHsKLQkJCi0JCXB1YmxpYyBVcGdyYWRlSW5mbyhpbnQgY2FsbGVyVHlwZSwgRmlsZSBsaWJGaWxlKSB7Ci0JCQlzdXBlcihjYWxsZXJUeXBlLCBsaWJGaWxlKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY29weUxpYnJhcnkoKSB7Ci0JCQlTdHJpbmcgdXNlckhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZGVzTGliRm9sZGVyUGF0aCA9IHVzZXJIb21lICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyAiRVBGIiArIEZpbGUuc2VwYXJhdG9yICsgIkV4cG9ydCIgKyBGaWxlLnNlcGFyYXRvciAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJKyBMb25nLnRvSGV4U3RyaW5nKENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZUluTWlsbGlzKCkpICsgRmlsZS5zZXBhcmF0b3I7CQkKLQkJCUZpbGUgZGVzTGliRm9sZGVyID0gbmV3IEZpbGUoZGVzTGliRm9sZGVyUGF0aCk7Ci0JCQlpZiAoIWRlc0xpYkZvbGRlci5leGlzdHMoKSkgewotCQkJCWRlc0xpYkZvbGRlci5ta2RpcnMoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRmlsZVV0aWwuZGVsZXRlQWxsRmlsZXMoZGVzTGliRm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCX0KLQkJCQotCQkJUGx1Z2luRXhwb3J0U2VydmljZS5jb3B5RGlyKGdldExpYkZpbGUoKS5nZXRQYXJlbnRGaWxlKCksIGRlc0xpYkZvbGRlcik7Ci0JCQlzZXRDb3BpZWRMaWJGaWxlKG5ldyBGaWxlKGRlc0xpYkZvbGRlclBhdGggKyBnZXRMaWJGaWxlKCkuZ2V0TmFtZSgpKSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUNvcGllZExpYnJhcnkoKSB7Ci0JCQlpZiAoZ2V0Q29waWVkTGliRmlsZSgpID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlGaWxlVXRpbC5kZWxldGVBbGxGaWxlcyhnZXRDb3BpZWRMaWJGaWxlKCkuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCWdldENvcGllZExpYkZpbGUoKS5nZXRQYXJlbnRGaWxlKCkuZGVsZXRlKCk7Ci0JCQlzZXRDb3BpZWRMaWJGaWxlKG51bGwpOwotCQl9Ci0JfTsJCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0RpckNvcHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9EaXJDb3B5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0N2UyMzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0RpckNvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci0KLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGNvcHkgZmlsZXMgZnJvbSBvbmUgZGlyIHRvIGFub3RoZXIsIGFuZCBkZWxldGUgdGhlIHVuLW5lZWRlZCBmaWxlcyBmcm9tIHNvdXJjZSBkaXIuCi0gKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpckNvcHkgewotCi0JLy9wcml2YXRlIElTdGF0dXMgZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBudWxsOwotCQotCUZpbGUgc3JjRGlyOwotCUZpbGUgdGFyZ2V0RGlyOwotCQotCS8vIG5ldyBmaWxlcyB0byBiZSBhZGRlZCB0byB0aGUgdGFyZ2V0Ci0JTGlzdCBuZXdGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvLyBmaWxlcyBleGlzdHMgaW4gYm90aCBzcmMgYW5kIHRhcmdldCBkaXIKLQlMaXN0IG9sZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8vIGZpbGVzIG9ubHkgaW4gdGFyZ2V0IGRpciwgdGhlc2UgZmlsZXMgYXJlIHRyZWF0ZWQgYXMgZGVsZXRlZCBpbiB0aGUgc3JjIGZvbGRlci4KLQlMaXN0IGRlbGV0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXJDb3B5KEZpbGUgc3JjRGlyLCBGaWxlIHRhcmdldERpcikgewotCQl0aGlzLnNyY0RpciA9IHNyY0RpcjsKLQkJdGhpcy50YXJnZXREaXIgPSB0YXJnZXREaXI7Ci0JCQotCQlwcmVwYXJlKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBDUF9GT0RMRVIgPSBNdWx0aUZpbGVTYXZlVXRpbC5DQVBBQklMSVRZX1BBVFRFUk5fUEFUSCArICIvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBEUF9GT0RMRVIgPSBNdWx0aUZpbGVTYXZlVXRpbC5ERUxJVkVSWV9QUk9DRVNTX1BBVEggKyAiLyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBjaGVjayBvdXQgdGhlIGV4aXN0aW5nIGZpbGVzLCBkZWxldGUgdGhlIGZpbGVzIGZyb20gY20sIGFuZCBhZGQgbmV3IGZpbGVzLCBjb3B5IHRoZSBmaWxlcyBvdmVyCi0JICoKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCkgewotCQkJCi0JCS8vIGNoZWNrIG91dCBmaWxlcwotCQlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IG9sZEZpbGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpaXQubmV4dCgpOwkJCQkJCQotCQkJaWYgKG5lZWRDb3B5KG5ldyBGaWxlKHNyY0RpciwgcGF0aCksIG5ldyBGaWxlKHRhcmdldERpciwgcGF0aCkpKSB7CS8vMTU0MzIxCi0JCQkJZmlsZXMuYWRkKG5ldyBGaWxlKHRhcmdldERpciwgcGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQl9Ci0JCQotCQlJU3RhdHVzIGZpbGVDaGVja2VkT3V0U3RhdHVzID0gRmlsZU1vZGlmeUNoZWNrZXIuY2hlY2tNb2RpZnkoZmlsZXMpOwotCQkKLQkJaWYgKCAhZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpICkgewotCQkJcmV0dXJuIGZpbGVDaGVja2VkT3V0U3RhdHVzOwotCQl9Ci0JCQkKLQkJLy8gZGVsZXRlIGZpbGVzCi0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBkZWxldGVkRmlsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZylpdC5uZXh0KCk7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZSh0YXJnZXREaXIsIHBhdGgpOwotCQkJZmlsZU1nci5kZWxldGUoZi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkKLQkJCS8vIGRlbGV0ZSB0aGUgZW1wdHkgQ1AgYW5kIERQIGZvbGRlcgotCQkJcGF0aCA9IHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICggcGF0aC5zdGFydHNXaXRoKENQX0ZPRExFUikgfHwgcGF0aC5zdGFydHNXaXRoKERQX0ZPRExFUikgKSB7Ci0JCQkJRmlsZSBmb2xkZXIgPSBmLmdldFBhcmVudEZpbGUoKTsKLQkJCQlTdHJpbmdbXSBpdGVtcyA9IGZvbGRlci5saXN0KCk7Ci0JCQkJaWYgKCBpdGVtcyA9PSBudWxsIHx8IGl0ZW1zLmxlbmd0aCA9PSAwICkgewotCQkJCQlmaWxlTWdyLmRlbGV0ZShmb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JCQotCQkvLyBjb3B5IG9sZCBmaWxlcwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IG9sZEZpbGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpaXQubmV4dCgpOwotCQkJUmVzb3VyY2VIZWxwZXIuY29weUZpbGUobmV3IEZpbGUoc3JjRGlyLCBwYXRoKSwgbmV3IEZpbGUodGFyZ2V0RGlyLCBwYXRoKSk7Ci0JCX0KLQkJCi0JCS8vIGNvcHkgbmV3IGZpbGVzCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gbmV3RmlsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZylpdC5uZXh0KCk7Ci0JCQlSZXNvdXJjZUhlbHBlci5jb3B5RmlsZShuZXcgRmlsZShzcmNEaXIsIHBhdGgpLCBuZXcgRmlsZSh0YXJnZXREaXIsIHBhdGgpKTsKLQkJfQotCQkKLQkJcmV0dXJuIGZpbGVDaGVja2VkT3V0U3RhdHVzOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgcHJlcGFyZSgpIHsKLQkJTGlzdCBhbGxTcmNGaWxlcyA9IGdldEFsbEZpbGVzKHNyY0Rpcik7Ci0JCUxpc3QgYWxsVGFyZ2V0RmlsZXMgPSBnZXRBbGxGaWxlcyh0YXJnZXREaXIpOwotCi0JCXdoaWxlICggYWxsVGFyZ2V0RmlsZXMuc2l6ZSgpID4gMCApIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZylhbGxUYXJnZXRGaWxlcy5yZW1vdmUoMCk7Ci0JCQlpZiAoIGFsbFNyY0ZpbGVzLmNvbnRhaW5zKHBhdGgpICkgewotCQkJCW9sZEZpbGVzLmFkZChwYXRoKTsKLQkJCQlhbGxTcmNGaWxlcy5yZW1vdmUocGF0aCk7Ci0JCQl9IGVsc2UgewotCQkJCWRlbGV0ZWRGaWxlcy5hZGQocGF0aCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHRoZSByZW1haW5pbmcgZmlsZXMgaW4gdGhlIHRhcmdldCBsaXN0IGlzIHRoZSBuZXcgZmlsZXMKLQkJbmV3RmlsZXMuYWRkQWxsKGFsbFNyY0ZpbGVzKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGFsbCB0aGUgZmlsZXMgd2l0aCByZWxhdGl2ZSBwYXRoIHRvIHRoZSByb290Ci0JICogQHBhcmFtIGRpciB0aGUgcm9vdCBkaXIKLQkgKiBAcmV0dXJuIExpc3QgYWxsIGZpbGVzIGluIHRoZSBkaXIsIHdpdGggcmVsYXRpdmUgcGF0aCB0byB0aGUgcm9vdAotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRBbGxGaWxlcyhGaWxlIGRpcikgewotCQlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlGaWxlVXRpbC5nZXRBbGxGaWxlcyhkaXIsIGZpbGVzLCB0cnVlKTsKLQotCQkvLyBjb252ZXJ0IHRvIGxpc3Qgb2YgcGF0aCwgbm90IEZpbGUKLQkJVVJJIGJhc2VVcmwgPSBkaXIudG9VUkkoKTsKLQkJCi0JCWludCBpID0gMDsKLQkJd2hpbGUgKCBpIDwgZmlsZXMuc2l6ZSgpICkgewotCQkJRmlsZSBmID0gKEZpbGUpZmlsZXMuZ2V0KGkpOwotCQkJaWYgKCBjYW5JZ25vcmUoZi5nZXRBYnNvbHV0ZVBhdGgoKSkgfHwgY2FuSWdub3JlKGYpKSB7Ci0JCQkJZmlsZXMucmVtb3ZlKGkpOwotCQkJfSBlbHNlIHsKLQkJCQlVUkkgcmVsID0gYmFzZVVybC5yZWxhdGl2aXplKGYudG9VUkkoKSk7Ci0JCQkJZmlsZXMuc2V0KGksIHJlbC5nZXRQYXRoKCkpOwkKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfRk9MREVSID0gRmlsZS5zZXBhcmF0b3IgKyAiQ1ZTIiArIEZpbGUuc2VwYXJhdG9yOwotCXByaXZhdGUgYm9vbGVhbiBjYW5JZ25vcmUoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKCBwYXRoLmluZGV4T2YoQ1ZTX0ZPTERFUikgPj0wICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gaWdub3JlRmlsZXMgPSB7Ci0JCQkJCQkJCQkiLmNvcHlhcmVhLmRhdCIsCi0JCQkJCQkJCQkiLmNvcHlhcmVhLmRiIgotCQkJCQkJCQkJfTsJCQkvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQlwcml2YXRlIGJvb2xlYW4gY2FuSWdub3JlKEZpbGUgZmlsZSkgewotCQlTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQlmb3IgKGludCBpPTA7IGk8aWdub3JlRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChuYW1lLmVxdWFscyhpZ25vcmVGaWxlc1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGNvcHkgYWN0aW9uIGlzIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmVlZENvcHkoRmlsZSBzb3VyY2UsIEZpbGUgZGVzdCkgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCWlmIChkZXN0LmV4aXN0cygpKSB7Ci0JCQlyZXQgPSAoZGVzdC5sYXN0TW9kaWZpZWQoKSAhPSBzb3VyY2UubGFzdE1vZGlmaWVkKCkpCi0JCQkJCXx8IChkZXN0Lmxlbmd0aCgpICE9IHNvdXJjZS5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0VsZW1lbnREaWZmVHJlZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0VsZW1lbnREaWZmVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzM2M3NTA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9FbGVtZW50RGlmZlRyZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgZWxlbWVudCBkaWZmZXJlbmNlcyBpbiBhIHRyZWUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50RGlmZlRyZWUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElGRl9TVEFURV9TQU1FID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJRkZfU1RBVEVfTkVXID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJRkZfU1RBVEVfQ0hBTkdFRCA9IDQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUZGX1NUQVRFX09MRF9PTkxZID0gNTsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlMTsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlMjsKLQotCS8vIFRoZSBwYXJlbnQgaW4gdGhlIGJhc2UgbGlicmFyeSBpZiBlMiBpcyBhIG5ldyBlbGVtZW50LgotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlMV9wYXJlbnQ7Ci0KLQlwcml2YXRlIEVsZW1lbnREaWZmVHJlZSBwYXJlbnQgPSBudWxsOwotCi0JLy8gRGVmaW5lIHRoZSBkaWZmIHN0YXRlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBjb21wYXJlZCB0byB0aGUgZmlyc3Qgb25lLgotCXByaXZhdGUgaW50IGRpZmZTdGF0ZSA9IERJRkZfU1RBVEVfU0FNRTsKLQotCXByaXZhdGUgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNEaXJ0eUNoaWxkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGlmZlRyZWUoTWV0aG9kRWxlbWVudCBlMSwgTWV0aG9kRWxlbWVudCBlMikgewotCQl0aGlzKGUxLCBlMiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlKE1ldGhvZEVsZW1lbnQgZTEsIE1ldGhvZEVsZW1lbnQgZTIsCi0JCQlNZXRob2RFbGVtZW50IGUxX3BhcmVudCkgewotCQl0aGlzLmUxX3BhcmVudCA9IGUxX3BhcmVudDsKLQkJdGhpcy5lMSA9IGUxOwotCQl0aGlzLmUyID0gZTI7Ci0KLQkJcmVzb2x2ZURpZmZTdGF0ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEJhc2VFbGVtZW50KCkgewotCQlyZXR1cm4gZTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBtZXRob2QgZWxlbWVudCdzIHBhcmVudC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRCYXNlUGFyZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGUxX3BhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgbWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0SW1wb3J0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGUyOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIG5ldyB0byB0aGUgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ldygpIHsKLQkJcmV0dXJuIChlMSA9PSBudWxsKSAmJiAoZTIgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGVsZW1lbnQgZXhpc3RzIG9ubHkgaW4gdGhlIGxpYnJhcnkgYW5kIG5vdCBpbiB0aGUKLQkgKiBjb25maWd1cmF0aW9uIHRvIGJlIGltcG9ydGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT2xkT25seSgpIHsKLQkJcmV0dXJuIChlMSAhPSBudWxsKSAmJiAoZTIgPT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGJvdGggYmFzZSBhbmQgaW1wb3J0IGVsZW1lbnRzIGFyZSBub3QgbnVsbCwgCi0JICogb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCb3RoKCkgewotCQlyZXR1cm4gKGUxICE9IG51bGwpICYmIChlMiAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgY2hpbGQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChFbGVtZW50RGlmZlRyZWUgY2hpbGQpIHsKLQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIGhhc0RpcnR5Q2hpbGQgYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0RpcnR5Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0RpcnR5Q2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBoYXNEaXJ0eUNoaWxkIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXJ0eUNoaWxkKGJvb2xlYW4gZmxhZykgewotCQloYXNEaXJ0eUNoaWxkID0gaGFzRGlydHlDaGlsZCB8fCBmbGFnOwotCQlpZiAoaGFzRGlydHlDaGlsZCAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LnNldERpcnR5Q2hpbGQoaGFzRGlydHlDaGlsZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UGFyZW50KEVsZW1lbnREaWZmVHJlZSBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCWlmIChkaWZmU3RhdGUgIT0gRElGRl9TVEFURV9TQU1FICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuc2V0RGlydHlDaGlsZCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudC4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50OwotCX0KLQotCS8qKgotCSAqIGhhc0NoaWxkcmVuIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIChjaGlsZHJlbiAhPSBudWxsKSAmJiAoY2hpbGRyZW4uc2l6ZSgpID4gMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpZmYgc3RhdGUgb2YgdGhlIHNlY29uZCBlbGVtZW50IGNvbXBhcmluZyB0byB0aGUgZmlyc3Qgb25lLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGlmZlN0YXRlKCkgewotCQlyZXR1cm4gZGlmZlN0YXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtZXNzYWdlIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpZmZNZXNzYWdlKCkgewotCQlyZXR1cm4gIlsiICsgZ2V0VmVyc2lvbihlMSkgKyAiXSA6IFsiICsgZ2V0VmVyc2lvbihlMikgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc29sdmVEaWZmU3RhdGUoKSB7Ci0JCS8vIGhvdyB0byBmaWRkIHR3byBlbGVtZW50cz8KLQkJLy8gMS4gYXR0cmlidXRlcwotCQkvLyAyLiB2ZXJzaW9uIG51bWJlcgotCQkvLyAzLiBjaGlsZHJlbgotCQkvLyA0LiByZWZlcmVuY2VzCi0JCS8vIDUuIC4uLgotCQlpZiAoZTEgPT0gbnVsbCkgewotCQkJZGlmZlN0YXRlID0gRElGRl9TVEFURV9ORVc7Ci0JCX0gZWxzZSBpZiAoZTIgPT0gbnVsbCkgewotCQkJZGlmZlN0YXRlID0gRElGRl9TVEFURV9PTERfT05MWTsKLQkJfSBlbHNlIHsKLQkJCWlmIChlMSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlkaWZmU3RhdGUgPSBESUZGX1NUQVRFX1NBTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRpZmZTdGF0ZSA9IERJRkZfU1RBVEVfQ0hBTkdFRDsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFZlcnNpb24oTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGdldFBhY2thZ2UoZWxlbWVudCkuZ2V0VmVyc2lvbigpOwotCX0KLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0IGdldFBhY2thZ2UoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0KSB7Ci0JCQlyZXR1cm4gKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCkgZWxlbWVudDsKLQkJfQotCi0JCXJldHVybiBnZXRQYWNrYWdlKChNZXRob2RFbGVtZW50KSBlbGVtZW50LmVDb250YWluZXIoKSk7Ci0JfQotCi0JLy8gVXRpbGl0eSBtZXRob2QgdG8gZ2V0IHRoZSBlbGVtZW50IGluZm9ybWF0aW9uLgotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoZTEgIT0gbnVsbCkgewotCQkJcmV0dXJuIGUxLmdldE5hbWUoKTsKLQkJfQotCQlpZiAoZTIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGUyLmdldE5hbWUoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCB0eXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IGUxOwotCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQllID0gZTI7Ci0JCX0KLQotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZS5nZXRUeXBlKCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRmlsZU1vZGlmeUNoZWNrZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9GaWxlTW9kaWZ5Q2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZWU0MGFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9GaWxlTW9kaWZ5Q2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci0KLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGNoZWNrIGZpbGVzIGZvciBtb2RpZmljYXRpb25zCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRmlsZU1vZGlmeUNoZWNrZXIgewotCi0JLyoqCi0JICogQ2hlY2tzIG1vZGlmaWNhdGlvbiBzdGF0dXMgb2YgdGhlIGdpdmVuIGxpc3Qgb2YgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KExpc3QgbW9kaWZpZWRGaWxlcykgewotCQkKLQkJdHJ5IHsKLQkJCVN0cmluZ1tdIHBhdGhzID0gbmV3IFN0cmluZ1ttb2RpZmllZEZpbGVzLnNpemUoKV07Ci0JCQltb2RpZmllZEZpbGVzLnRvQXJyYXkocGF0aHMpOwotCQkJCi0JCQlJRmlsZU1hbmFnZXIgZmlsZU1nciA9IFNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKCk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGZpbGVNZ3IuY2hlY2tNb2RpZnkocGF0aHMsIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBhbGwgdGhlIGZpbGVzIGFyZSB1cGRhdGFibGUJCQkKLQkJCUxpc3QgcmVhZG9ubHlGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKysgKSB7Ci0JCQkJRmlsZSBmID0gbmV3IEZpbGUocGF0aHNbaV0pOwotCQkJCWlmICggZi5leGlzdHMoKSAmJiAhZi5jYW5Xcml0ZSgpICkgewotCQkJCQlyZWFkb25seUZpbGVzLmFkZChwYXRoc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoIHJlYWRvbmx5RmlsZXMuc2l6ZSgpID4gMCApIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBJbXBvcnRSZXNvdXJjZXMuRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX3RpdGxlOyAKLQkJCQlTdHJpbmcgbXNnID0gSW1wb3J0UmVzb3VyY2VzLkZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c7IAotCQkJCWlmICggbmV3IE1zZ0RpYWxvZyhJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpKS5kaXNwbGF5UHJvbXB0KHRpdGxlLCBtc2cpICkgewotCQkJCQlyZXR1cm4gY2hlY2tNb2RpZnkocmVhZG9ubHlGaWxlcyk7Ci0JCQkJfQotCQkJfQkJCi0JCQlyZXR1cm4gc3RhdHVzOwotCQkJCi0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/ICIiIDogZS5nZXRNZXNzYWdlKCksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIG1vZGlmaWNhdGlvbiBzdGF0dXMgb2YgdGhlIGdpdmVuIGxpc3Qgb2YgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN5bmNFeGVjQ2hlY2tNb2RpZnkoZmluYWwgTGlzdCBtb2RpZmllZEZpbGVzKSB7Ci0JCWZpbmFsIElTdGF0dXNbXSByZXQgPSBuZXcgSVN0YXR1c1sxXTsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJldFswXSA9IEZpbGVNb2RpZnlDaGVja2VyLmNoZWNrTW9kaWZ5KG1vZGlmaWVkRmlsZXMpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHJldFswXTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0cnVucyB0aGUgbW9kaWZpZWQgZmlsZSBsaXN0IG9mIHRoZSBnaXZlbiByZXNvdXJjZSBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE1vZGlmaWVkRmlsZXMoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJTGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuaXNNb2RpZmllZCgpKSB7Ci0JCQkJcmV0LmFkZChyZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9MaWJyYXJ5RGlmZk1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9MaWJyYXJ5RGlmZk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzg5Y2Q3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvTGlicmFyeURpZmZNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci0KLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIG1ldGhvZCBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5IGFuZAotICogdGhvc2UgdGhhdCB3aWxsIGJlIGltcG9ydGVkLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeURpZmZNYW5hZ2VyIHsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBiYXNlTGlicmFyeTsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBpbXBvcnRMaWJyYXR5OwotCi0JLy8gTWFwIG9mIHVpZCB0byBFbGVtZW50RGlmZlRyZWUsIHRoZSByb290IG9mIHRoZSBFbGVtZW50RGlmZlRyZWUgaXMgdGhlCi0JLy8gbGlicmFyeS4KLQlwcml2YXRlIE1hcCBkaWZmRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBNYXAgb2YgdWlkIHRvIGVsZW1lbnQgZm9yIGltcG9ydCBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uCi0JcHJpdmF0ZSBNYXAgaW1wb3J0RWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBpZCB0byBlbGVtZW50IG1hcCBvZiB0aGUgY3VycmVudCBsaWJyYXJ5LgotCXByaXZhdGUgTWFwIGN1cnJlbnRFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIFRoZSBkaWZmIHRyZWUuCi0JRWxlbWVudERpZmZUcmVlIHJvb3REaWZmVHJlZSA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5RGlmZk1hbmFnZXIoTWV0aG9kTGlicmFyeSBiYXNlTGlicmFyeSwKLQkJCU1ldGhvZExpYnJhcnkgaW1wb3J0TGlicmF0eSkgewotCQl0aGlzLmJhc2VMaWJyYXJ5ID0gYmFzZUxpYnJhcnk7Ci0JCXRoaXMuaW1wb3J0TGlicmF0eSA9IGltcG9ydExpYnJhdHk7Ci0KLQkJcm9vdERpZmZUcmVlID0gbmV3IEVsZW1lbnREaWZmVHJlZShiYXNlTGlicmFyeSwgaW1wb3J0TGlicmF0eSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1wb3J0IGxpYnJhcnkuCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0SW1wb3J0aW5nTGlicmFyeSgpIHsKLQkJcmV0dXJuIHRoaXMuaW1wb3J0TGlicmF0eTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZHMgdGhlIGRpZmZlcmVuY2UgdHJlZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlIGJ1aWxkRGlmZlRyZWUoKSB7Ci0JCS8vIEJ1aWxkIHRoZSB1aWQgdG8gZWxlbWVudCBtYXAgZm9yIHRoZSBpbXBvcnQgbGlicmFyeS4KLQkJYnVpbGRVSURNYXAoaW1wb3J0TGlicmF0eS5lQ29udGVudHMoKSwgaW1wb3J0RWxlbWVudE1hcCwgdHJ1ZSwgZmFsc2UpOwotCi0JCWJ1aWxkVUlETWFwKGJhc2VMaWJyYXJ5LmVDb250ZW50cygpLCBjdXJyZW50RWxlbWVudE1hcCwgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJLy8gR2V0IGFsbCB0aGUgc3lzdGVtIHBhY2thZ2VzIGluIGVhY2ggcGx1Zy1pbiBzbyB3ZSBjYW4gZmlsdGVyIG91dAotCQkvLyB0aG9zZSBwYWNrYWdlcyB3aGVuIGNvbXBhcmluZyB0aGUgbGlicmFyaWVzLgotCi0JCS8vIEl0ZXJhdGUgdGhlIGVsZW1lbnQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeSwgYW5kIGJ1aWxkIGEgZGlmZiB0cmVlIGJ5Ci0JCS8vIGNvbXBhcmluZyB0byB0aGUgaW1wb3J0IGxpYnJhcnkuCi0JCUxpc3QgcGx1Z2lucyA9IGJhc2VMaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCUxpc3Qgc3lzdGVtUGFja2FnZXMgPSBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHBsdWdpbik7Ci0JCQkKLQkJCS8vIGNvbnRlbnQgY2F0ZWdvcnkgcGFja2FnZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGludG8gdGhlIGRpZmYgdHJlZSAKLQkJCS8vIG90aGVyd2lzZSB0aGUgY2F0ZWdvcnkgaW5mb3JtYXRpb24gd2lsbCBiZSBsb3N0Ci0JCQlMaXN0IGNhdGVnb3J5TGlzdCA9IFRuZ1V0aWwuZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZXMocGx1Z2luKTsKLQkJCWZvciAoIEl0ZXJhdG9yIGl0YyA9IGNhdGVnb3J5TGlzdC5pdGVyYXRvcigpOyBpdGMuaGFzTmV4dCgpOyApIHsKLQkJCQlPYmplY3QgbyA9IGl0Yy5uZXh0KCk7Ci0JCQkJaWYgKCBzeXN0ZW1QYWNrYWdlcy5jb250YWlucyhvKSApIHsKLQkJCQkJc3lzdGVtUGFja2FnZXMucmVtb3ZlKG8pOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gdGhlIHJvb3QgY3VzdG9tY2F0ZWdvdHkgcGFja2FnZSBuZWVkcyB0byBiZSBpbmNsdWRlZCBpbnRvIHRoZSBkaWZmIHRyZWUKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgc3lzdGVtUGFja2FnZXMuc2l6ZSgpICkgewotCQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gKE1ldGhvZFBhY2thZ2Upc3lzdGVtUGFja2FnZXMuZ2V0KGkpOwotCQkJCWlmICggVG5nVXRpbC5pc1Jvb3RDdXRvbUNhdGVnb3J5UGFja2FnZShwa2cpICkgewotCQkJCQlzeXN0ZW1QYWNrYWdlcy5yZW1vdmUocGtnKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gQnVpbGQgdGhlIGRpZmYgdHJlZSBieSBpdGVyYXRpbmcgdGhlIGN1cnJlbnQgbGlicmFyeS4KLQkJCWl0ZXJhdGVFbGVtZW50KHBsdWdpbiwgcm9vdERpZmZUcmVlLCBzeXN0ZW1QYWNrYWdlcyk7Ci0JCX0KLQotCQlMaXN0IGNvbmZpZ3MgPSBiYXNlTGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXQubmV4dCgpOwotCi0JCQkvLyBCdWlsZCB0aGUgZGlmZiB0cmVlIGJ5IGl0ZXJhdGluZyB0aGUgY3VycmVudCBsaWJyYXJ5LgotCQkJaXRlcmF0ZUVsZW1lbnQoY29uZmlnLCByb290RGlmZlRyZWUsIG5ldyBBcnJheUxpc3QoKSk7Ci0JCX0KLQotCQkvLyBQcm9jZXNzIHRoZSBuZXcgZWxlbWVudHMgaW4gdGhlIGltcG9ydCBsaWJyYXJ5IGFuZCBhZGQgdGhlbSB0byB0aGUKLQkJLy8gZGlmZiB0cmVlLgotCQloYW5kbGVOZXdFbGVtZW50cyhpbXBvcnRMaWJyYXR5KTsKLQotCQlyZXR1cm4gcm9vdERpZmZUcmVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpZmZlcm5lY2UgdHJlZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlIGdldERpZmZUcmVlKCkgewotCQlyZXR1cm4gcm9vdERpZmZUcmVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpZmZlcm5lY2UgbWFwLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0RGlmZlRyZWVNYXAoKSB7Ci0JCXJldHVybiBkaWZmRWxlbWVudE1hcDsKLQl9Ci0KLQkvKioKLQkgKiBJdGVyYXRlcyB0aGUgZWxlbWVudCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5IGFuZCBidWlsZCBhIGRpZmYgdHJlZSBieQotCSAqIGNvbXBhcmluZyB0byB0aGUgaW1wb3J0IGxpYnJhcnkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdGVFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVsZW1lbnREaWZmVHJlZSBkaWZmVHJlZSwgTGlzdCBzeXN0ZW1QYWNrYWdlcykgewotCQlpZiAoIXNlbGVjdGFibGUoZWxlbWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFVwZGF0ZSB0aGUgZGlmZmVsZW1lbnQgVUlEIG1hcC4KLQkJaWYgKCFzeXN0ZW1QYWNrYWdlcy5jb250YWlucyhlbGVtZW50KQotCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpKSB7Ci0JCQlTdHJpbmcgdWlkID0gZWxlbWVudC5nZXRHdWlkKCk7Ci0JCQlFbGVtZW50RGlmZlRyZWUgZGlmZkNoaWxkID0gbmV3IEVsZW1lbnREaWZmVHJlZShlbGVtZW50LAotCQkJCQkoTWV0aG9kRWxlbWVudCkgaW1wb3J0RWxlbWVudE1hcC5nZXQodWlkKSk7Ci0JCQlkaWZmRWxlbWVudE1hcC5wdXQodWlkLCBkaWZmQ2hpbGQpOwotCQkJZGlmZlRyZWUuYWRkQ2hpbGQoZGlmZkNoaWxkKTsKLQkJCWRpZmZUcmVlID0gZGlmZkNoaWxkOwotCQl9Ci0KLQkJLy8gQ2hlY2sgd2l0aCB0aGUgaW1wb3J0aW5nIGVsZW1lbnQgYW5kIGNyZWF0ZSBhbiBFbGVtZW50RGlmZkluZm8gb2JqZWN0Ci0JCUVMaXN0IGNoaWxkcmVuID0gZWxlbWVudC5lQ29udGVudHMoKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgY2hpbGQgPSAoTWV0aG9kRWxlbWVudCkgZTsKLQkJCQkJaWYgKHNlbGVjdGFibGUoY2hpbGQpKSB7Ci0JCQkJCQlpdGVyYXRlRWxlbWVudChjaGlsZCwgZGlmZlRyZWUsIHN5c3RlbVBhY2thZ2VzKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChkZWJ1ZyApIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkVycm9yISAiICsgZSArICIgaXMgbm90IGEgTWV0aG9kRWxlbWVudCBvYmplY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGVyZSBhcmUgbmV3bHkgYWRkZWQgZWxlbWVudHMgaW4gdGhlIGltcG9ydGluZyBsaWJyYXJ5LCBhZGQgdGhlIG5ldwotCSAqIGVsZW1lbnRzIGludG8gdGhlIHBhcmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVOZXdFbGVtZW50cyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFzZWxlY3RhYmxlKGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoaXNOZXdFbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQkvLyBUaGlzIGlzIGEgbmV3IGVsZW1lbnQsIGZpbmQgdGhlIHBhcmVudCBpbiB0aGUgYmFzZSBsaWJyYXJ5LgotCQkJTWV0aG9kRWxlbWVudCBwYXJlbnQgPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCQl3aGlsZSAoaXNOZXdFbGVtZW50KHBhcmVudCkpIHsKLQkJCQllbGVtZW50ID0gcGFyZW50OwotCQkJCXBhcmVudCA9IChNZXRob2RFbGVtZW50KSBwYXJlbnQuZUNvbnRhaW5lcigpOwotCQkJfQotCi0JCQkvLyBBbHdheXMgbWVyZ2UgbGlicmF5IHBsdWdpbnMgZXZlbiBpdCdzIGZyb20gYSBkaWZmZXJlbnQgbGlicmFyeS4KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJcGFyZW50ID0gYmFzZUxpYnJhcnk7Ci0JCQl9Ci0KLQkJCS8vIE5lZWQgdG8gZmluZCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeSBzbyB0aGF0IHdlCi0JCQkvLyBrbm93IHdoZXJlIHRvIGFkZCB0aGUgbmV3IGVsZW1lbnQuCi0JCQlNZXRob2RFbGVtZW50IGxpYl9wYXJlbnQgPSAoTWV0aG9kRWxlbWVudCkgY3VycmVudEVsZW1lbnRNYXAKLQkJCQkJLmdldChwYXJlbnQuZ2V0R3VpZCgpKTsKLQkJCWlmIChsaWJfcGFyZW50ID09IG51bGwpIHsKLQkJCQlsaWJfcGFyZW50ID0gYmFzZUxpYnJhcnk7Ci0JCQl9Ci0JCQlFbGVtZW50RGlmZlRyZWUgZWxlbWVudERpZmZUcmVlID0gbmV3IEVsZW1lbnREaWZmVHJlZShudWxsLAotCQkJCQllbGVtZW50LCBsaWJfcGFyZW50KTsKLQotCQkJLy8gRmluZCB0aGUgcGFyZW50IGRpZmYgdHJlZS4KLQkJCUVsZW1lbnREaWZmVHJlZSBwYXJlbnREaWZmVHJlZSA9IG51bGw7Ci0JCQl3aGlsZSAoKHBhcmVudERpZmZUcmVlID09IG51bGwpICYmIChwYXJlbnQgIT0gbnVsbCkpIHsKLQkJCQlwYXJlbnREaWZmVHJlZSA9IChFbGVtZW50RGlmZlRyZWUpIGRpZmZFbGVtZW50TWFwLmdldChwYXJlbnQKLQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCXBhcmVudCA9IChNZXRob2RFbGVtZW50KSBwYXJlbnQuZUNvbnRhaW5lcigpOwotCQkJfQotCi0JCQlpZiAocGFyZW50RGlmZlRyZWUgPT0gbnVsbCkgewotCQkJCXBhcmVudERpZmZUcmVlID0gcm9vdERpZmZUcmVlOwotCQkJfQotCi0JCQlwYXJlbnREaWZmVHJlZS5hZGRDaGlsZChlbGVtZW50RGlmZlRyZWUpOwotCQl9IGVsc2UgewotCQkJLy8gSXRlcmF0ZSB0aGUgY2hpbGRyZW4uCi0JCQlMaXN0IGNoaWxkcmVuID0gZWxlbWVudC5lQ29udGVudHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRjID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRjLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXRjLm5leHQoKTsKLQkJCQloYW5kbGVOZXdFbGVtZW50cyhlKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTmV3RWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiAhY3VycmVudEVsZW1lbnRNYXAuY29udGFpbnNLZXkoZWxlbWVudC5nZXRHdWlkKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVJRE1hcChMaXN0IGVsZW1lbnRzLCBNYXAgZWxlbWVudFVJRE1hcCwgYm9vbGVhbiByZWN1cnNpdmUsIGJvb2xlYW4gZnVsbCkgewotCQlNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0Lm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgZTsKLQkJCQlpZiAoc2VsZWN0YWJsZShlbGVtZW50KSB8fCBmdWxsKSB7Ci0JCQkJCVN0cmluZyB1aWQgPSBlbGVtZW50LmdldEd1aWQoKTsKLQkJCQkJZWxlbWVudFVJRE1hcC5wdXQodWlkLCBlbGVtZW50KTsKLQotCQkJCQlpZiAocmVjdXJzaXZlKSB7Ci0JCQkJCQlidWlsZFVJRE1hcChlbGVtZW50LmVDb250ZW50cygpLCBlbGVtZW50VUlETWFwLAotCQkJCQkJCQlyZWN1cnNpdmUsIGZ1bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmICggIShlIGluc3RhbmNlb2YgUG9pbnQgfHwgZSBpbnN0YW5jZW9mIERpbWVuc2lvbikgKXsKLQkJCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCSJJbXBvcnQgZXJyb3IuICIgKyBlICsgIiBpcyBub3QgYSBNZXRob2RFbGVtZW50IG9iamVjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBtZXRob2QgZWxlbWVudCBpcyBzZWxlY3RhYmxlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNlbGVjdGFibGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luCi0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhpc3RpbmcgbWV0aG9kIGVsZW1lbnQgZ2l2ZW4gYnkgdGhlIGd1aWQuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RXhpc3RpbmdFbGVtZW50KFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiAoTWV0aG9kRWxlbWVudCljdXJyZW50RWxlbWVudE1hcC5nZXQoZ3VpZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvTGlicmFyeUltcG9ydE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9MaWJyYXJ5SW1wb3J0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMGE4NmE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9MaWJyYXJ5SW1wb3J0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkRpYWdyYW1IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBpbXBvcnRpbmcgb2YgYSBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUltcG9ydE1hbmFnZXIgewotCi0JcHJpdmF0ZSBNYXAgcmVuYW1lRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBNYXAgc2V0RWxlbWVudE1hcCA9IG51bGw7Ci0KLQlwcml2YXRlIExpYnJhcnlEaWZmTWFuYWdlciBkaWZmTWdyOwotCXByaXZhdGUgRWxlbWVudERpZmZUcmVlIHJvb3RUcmVlOwotCi0JLy9wcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBudWxsOwotCi0JLy9wcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWZjcCA9IG51bGw7Ci0KLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgYmFzZUxpYnJhcnkgPSBudWxsOwotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBpbXBvcnRpbmdMaWJyYXJ5ID0gbnVsbDsKLQotCS8vIGd1aWQgb2YgcmVwbGFjZWQgZWxlbWVudCBpZCB0byB0aGUgZWxlbWVudCBpbiB0aGUgYmFzZSBsaWJyYXJ5Ci0JLy8gd2UgbmVlZCB0aGlzIHRvIHJlZGlyZWN0IHRoZSByZWZlcmVuY2Ugb2YgbmV3IGVsZW1lbnRzIGZyb20gdGhlIGltcG9ydGluZwotCS8vIGxpYnJhdHkgdG8gdGhlIGJhc2UgbGlicmFyeQotCXByaXZhdGUgTWFwIHJlcGxhY2VkRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBrZWVwIHRoZSBuZXcgZWxlbWVudHMsIHdlIG5lZWQgdG8gaXRlcmF0ZSB0aGVpciBmZWF0dXJlIHZhbHVlIGFuZAotCS8vIHJlZGlyZWN0IHRoZSB2YWxldSBlbGVtZW50Ci0JLy8gZnJvbSB0aGUgaW1wb3J0aW5nIGxpYnJhcnkgdG8gdGhlIGJhc2UgbGlicmFyeQotCXByaXZhdGUgTGlzdCBuZXdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JLy8gZGVsZXRlZCBlbGVtZW50cywKLQlwcml2YXRlIExpc3QgZGVsZXRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQkKLQkvLyBsaXN0IG9mIHVzZXIgc2VsZWN0ZWQgaXRlbXMgdG8gYmUgaW1wb3J0ZWQKLQlMaXN0IGNoZWNrZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8vIGZsYWcgdG8gaW5kaWNhdGUgdGhlIGZpbGUgY2hlb3V0IHN0YXR1cwotCUlTdGF0dXMgZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBudWxsOwotCQotCS8vIHJlc291cmNlIGZpbGUgcGF0aCBmb3IgbmV3IHJlc29ydWNlcwotCUxpc3QgbmV3UmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCVJlc291cmNlU2Nhbm5lciByZXNTY2FubmVyOwotCQotCXByaXZhdGUgRGlhZ3JhbUhhbmRsZXIgZGlhZ3JhbUhhbmRsZXI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeUltcG9ydE1hbmFnZXIoTGlicmFyeURpZmZNYW5hZ2VyIGRpZmZNZ3IsCi0JCQlMaXN0IGNoZWNrZWRJdGVtcykgewotCQl0aGlzLmRpZmZNZ3IgPSBkaWZmTWdyOwotCQl0aGlzLnJvb3RUcmVlID0gZGlmZk1nci5nZXREaWZmVHJlZSgpOwotCQkKLQkJaWYgKCBjaGVja2VkSXRlbXMgIT0gbnVsbCApIHsKLQkJCS8vIGNoZWNrZWRMaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBFbGVtZW50RGlmZlRyZWUgb2JqZWN0cwotCQkJLy8gZ2V0IHRoZSBwYWNrYWdlcyBhcyB3ZWxsCi0JCQl0aGlzLmNoZWNrZWRMaXN0LmFkZEFsbChjaGVja2VkSXRlbXMpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoZWNrZWRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCUVsZW1lbnREaWZmVHJlZSBkaWZmVHJlZSA9IChFbGVtZW50RGlmZlRyZWUpIGl0Lm5leHQoKTsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSBkaWZmVHJlZS5nZXRCYXNlRWxlbWVudCgpOwotCQkJCWlmICggZSAhPSBudWxsICkgewotCQkJCQljaGVja2VkTGlzdC5hZGQoZSk7Ci0JCQkJfQotCQkJCQkJCQkKLQkJCQlpZiAoIGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICkgewotCQkJCQlMaWJyYXJ5VXRpbC5nZXRBbGxDaGlsZFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKWUsIGNoZWNrZWRMaXN0KTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gYWxzbyBpbmNsZHVlIHRoZSBoaWRkZW4gcm9vdCBjdXN0b20gcGFja2FnZSBpZiB0aGUgcGFja2FnZSBpcyB0aGUgQ3VzdG9tQ2F0ZWdvcmllcyBwYWNrYWdlCi0JCQkJLy8gMTUwODk1IC0gSW1wb3J0IENvbmZpZzogQ3VzdG9tQ2F0ZWdvcnkgZGlkIG5vdCBzeW5jIHVwIGJ5IGltcG9ydAotCQkJCWlmICggZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UgKSB7Ci0JCQkJCUxpc3QgY2hpbGRyZW4gPSAoKE1ldGhvZFBhY2thZ2UpZSkuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkJCQlpZiAoIGNoaWxkcmVuLnNpemUoKSA9PSAxICkgewotCQkJCQkJTWV0aG9kUGFja2FnZSBwa2cgID0gKE1ldGhvZFBhY2thZ2UpY2hpbGRyZW4uZ2V0KDApOwotCQkJCQkJaWYgKCBUbmdVdGlsLmlzUm9vdEN1dG9tQ2F0ZWdvcnlQYWNrYWdlKHBrZykgKSB7Ci0JCQkJCQkJY2hlY2tlZExpc3QuYWRkKHBrZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJZSA9IGRpZmZUcmVlLmdldEltcG9ydEVsZW1lbnQoKTsKLQkJCQlpZiAoIGUgIT0gbnVsbCApIHsKLQkJCQkJY2hlY2tlZExpc3QuYWRkKGUpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoIGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICkgewotCQkJCQlMaWJyYXJ5VXRpbC5nZXRBbGxDaGlsZFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKWUsIGNoZWNrZWRMaXN0KTsKLQkJCQl9Ci0KLQkJCQkKLQkJCQkvLyBmb3IgbmV3IGl0ZW0sIGFkZCBhbGwgdGhlIHN1YiBwYWNrYWdlcwotCQkJCWlmICggZGlmZlRyZWUuaXNOZXcoKSApIHsKLQkJCQkJaWYgKCBlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luICkgewotCQkJCQkJY2hlY2tlZExpc3QuYWRkQWxsKExpYnJhcnlVdGlsLmdldEFsbFBhY2thZ2VzKChNZXRob2RQbHVnaW4pZSkpOwotCQkJCQl9IGVsc2UgaWYgKCBlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSApIHsKLQkJCQkJCUxpYnJhcnlVdGlsLmdldEFsbENoaWxkUGFja2FnZXMoKE1ldGhvZFBhY2thZ2UpZSwgY2hlY2tlZExpc3QpOwotCQkJCQl9IAotCQkJCX0KLQkJCX0KLQkJCQotCQl9IGVsc2UgewotCQkJY2hlY2tlZExpc3QgPSBudWxsOwotCQl9Ci0JCQotCQkKLQkJaW5pdCgpOwotCi0JCS8vIEdldCB0aGUgY3VycmVudCBsaWJyYXJ5LgotCQliYXNlTGlicmFyeSA9IChNZXRob2RMaWJyYXJ5KSB0aGlzLnJvb3RUcmVlLmdldEJhc2VFbGVtZW50KCk7Ci0JCWltcG9ydGluZ0xpYnJhcnkgPSAoTWV0aG9kTGlicmFyeSkgdGhpcy5yb290VHJlZQotCQkJCS5nZXRJbXBvcnRFbGVtZW50KCk7Ci0KLQkJLy8gY3JlYXRlIHRoZSByZXNvdXJjZSBzY2FubmVyCi0JCXJlc1NjYW5uZXIgPSBuZXcgUmVzb3VyY2VTY2FubmVyKAotCQkJCUxpYnJhcnlVdGlsLmdldExpYnJhcnlSb290UGF0aChpbXBvcnRpbmdMaWJyYXJ5KSwgCi0JCQkJTGlicmFyeVV0aWwuZ2V0TGlicmFyeVJvb3RQYXRoKGJhc2VMaWJyYXJ5KSk7Ci0JCQkKLQkJZGlhZ3JhbUhhbmRsZXIgPSBuZXcgRGlhZ3JhbUhhbmRsZXIoCi0JCQkJTGlicmFyeVV0aWwuZ2V0TGlicmFyeVJvb3RQYXRoKGltcG9ydGluZ0xpYnJhcnkpLCAKLQkJCQlMaWJyYXJ5VXRpbC5nZXRMaWJyYXJ5Um9vdFBhdGgoYmFzZUxpYnJhcnkpKTsKLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotLy8JCS8vIFNldCB0aGUgdHJlZSBjb250ZW50LgotLy8JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCWZhY3Rvcmllcy5hZGQobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0vLwkJZmFjdG9yaWVzLmFkZChuZXcgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0vLwkJZmFjdG9yaWVzLmFkZChuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotLy8KLS8vCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoCi0vLwkJCQlmYWN0b3JpZXMpOwotLy8JCWFmY3AgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpOwotLy8KLS8vCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKLS8vCi0vLwkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgotLy8JCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKGFkYXB0ZXJGYWN0b3J5LAotLy8JCQkJY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcCgpKTsKLS8vCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU2VsZWN0ZWQoRWxlbWVudERpZmZUcmVlIGRpZmZUcmVlKSB7Ci0JCWlmICggY2hlY2tlZExpc3QgPT0gbnVsbCB8fCBjaGVja2VkTGlzdC5jb250YWlucyhkaWZmVHJlZSkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJTWV0aG9kRWxlbWVudCBlID0gZGlmZlRyZWUuZ2V0QmFzZUVsZW1lbnQoKTsJCQotCQlpZiAoIGUgPT0gbnVsbCApIHsKLQkJCWUgPSBkaWZmVHJlZS5nZXRJbXBvcnRFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCXJldHVybiBpc1NlbGVjdGVkKGUpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNTZWxlY3RlZChNZXRob2RFbGVtZW50IGUpIHsKLQkJCi0JCWlmICggY2hlY2tlZExpc3QgPT0gbnVsbCB8fCAKLQkJCQllIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uIHx8IAotCQkJCWUuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uIHx8IAotCQkJCWUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5ICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmICggY2hlY2tlZExpc3Quc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICggZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gKSB7Ci0JCQlyZXR1cm4gY2hlY2tlZExpc3QuY29udGFpbnMoZSk7Ci0JCX0KLQkJCi0JCU1ldGhvZEVsZW1lbnQgbyA9IChNZXRob2RFbGVtZW50KUxpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUoZSk7Ci0JCWlmICggbyA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IAotCQkKLQkJaWYgKCBvIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gY2hlY2tlZExpc3QuY29udGFpbnMobyk7Ci0JfQotCQotCS8qKgotCSAqIERvZXMgbWVyZ2UgZnJvbSB0aGUgaW1wb3J0IGxpYnJhcnkgaW50byB0aGUgYmFzZSBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGRvTWVyZ2UoYm9vbGVhbiByZXBsYWNlRXhpc3RpbmcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWVyZ2luZyBjb25maWd1cmF0aW9uIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCQotCQkvLyBTYXZlIHRoZSBsaWJyYXJ5IHBhdGggYmVmb3JlIGRldGFjaGluZyB0aGUgcmVzb3VyY2UuCi0KLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibG9hZGluZyBsaWJyYXJ5IC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlMaWJyYXJ5VXRpbC5sb2FkQWxsKGJhc2VMaWJyYXJ5KTsKLQkJTGlicmFyeVV0aWwubG9hZEFsbChpbXBvcnRpbmdMaWJyYXJ5KTsKLQotCQkvLyBEZXRhY2ggdGhlIG5ldyBsaWJyYXJ5IGZyb20gdGhlIGN1cnJlbnQgcmVzb3VyY2Ugc28gaXQgY2FuIGJlCi0JCS8vIGFkZGVkIHRvIGEgbmV3IExpYnJhcnkgUHJvY2Vzc29yIGluc3RhbmNlLgotCQlMaWJyYXJ5VXRpbC5kZXRhY2hGcm9tUmVzb3VyY2UoaW1wb3J0aW5nTGlicmFyeSk7Ci0KLQkJLy8gZm9yIHRlc3QKLQkJaW1wb3J0aW5nTGlicmFyeS5zZXROYW1lKCJJbXBvcnRpbmdMaWI6ICIgKyBpbXBvcnRpbmdMaWJyYXJ5LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3MgY29uZmlndXJhdGlvbiBkaWZmIHRyZWUgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIGJlZm9yZSBwcm9jZXNzaW5nLCBzYXZlIHRoZSBvcmlnaW5hbCByZXNvdXJjZXMgCi0JCS8vIHNvIHRoYXQgd2UgY2FuIGZpbmQgdGhlIG5ld2x5IGFkZGVkIHJlc291cmNlcwotCQlMaXN0IG9sZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoCi0JCQkJYmFzZUxpYnJhcnkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSk7Ci0JCQotCQkvLyBJdGVyYXRlIGVhY2ggZWxlbWVudCBhbmQgdGhlIG5lY2Vzc2FyeSBtZXJnZXMuCi0JCXByb2Nlc3NEaWZmVHJlZShyb290VHJlZSwgcmVwbGFjZUV4aXN0aW5nKTsKLQotCQloYW5kbGVTZXRFbGVtZW50cygpOwotCQkKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicGVyZm9ybSBpbnRlZ3JpdHkgY2hlY2tpbmcgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIHBlcmZvcm0gYW4gaW50ZWdyaXR5IGNoZWNrIG9mIHRoZSBsaWJyYXJ5Ci0JCS8vIGZpeCBhbnkgZGFuZmxpbmcgZWxlbWVudHMgZHVlIHRvIHBhY2thZ2UvZWxlbWVudCByZXBsYWNlbWVudAotCQlkb0ludGVncml0eUNoZWNrKCk7Ci0KLQkJLy8gbm93IHByb2Nlc3MgdGhlIG5ldyByZXNvdXJjZXMgYW5kIG1hcmsgdGhlbSBkaXJzdCBzbyB0aGF0IAotCQkvLyB0aGUgZGF0YSB3aWxsIGJlIHNhdmVkIGFnYWluLiAKLQkJLy8gVGhpcyBzdGVwIGlzIGNyaXRpY2FsIHNpbmNlIHRoZSBmaXJzdCByb3VuZCBvbmx5IGNyZWF0ZWQgdGhlIGRhdGEgc3RydWN0dXJlCi0JCS8vIHNvbWUgb2YgdGhlIGNyb3NzLXJlZmVyZW5jZWQgZWxlbWVudHMgbWlnaHQgYmUgbG9zdCBvbiB0aGUgZmlyc3Qgc2F2aW5nCi0JCS8vIGZvciBleGFtcGxlLCB3aGVuIGNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHdpdGggcmVmZXJlbmNlcyB0byBhIG5ldyBwbHVnaW4sCi0JCS8vIHdoaWNoIGFyZSBub3Qgc2F2ZWQgeWV0LCB0aG9zZSByZWZlcmVuY2VzIHdpbGwgYmUgbG9zdC4KLQkJLy8gMTQ1ODkxIC0gSW1wb3J0IENvbmZpZ3VyYXRpb246IGRlZmF1bHQgY29uZmlnIGlzIGxvc3MgYWZ0ZXIgaW1wb3J0Ci0JCWhhbmRsZU5ld1Jlc291cmNlcyhvbGRSZXNvdXJjZXMpOwotCQkKLQkJaGFuZGxlTmFtZVJlcGxhY2UocmVuYW1lRWxlbWVudE1hcCk7Ci0JCQotCQlkaWFncmFtSGFuZGxlci5wb3N0UmVnaXN0ZXJFbGVtZW50cygpOwotCQkKLQkJLy8gZ2V0IGFsbCB0aGUgbW9kaWZpZWQgcmVzb3VyY2VzIGFuZCByZXNvdXJjZSBmaWxlcwotCQkvLyBjaGVjayBDTSBmb3IgZmlsZSBjaGVjay1vdXQKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hlY2sgb3V0IGZpbGVzIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCS8vIGNsZWFyIHJlc291cmNlcyBmb3IgZGVsZXRlZCBlbGVtZW50cwotCQlkZWxldGVSZXNvcnVjZXMoKTsKLQkKLQkJY2hlY2tNb2RpZmllZEZpbGVzKCk7Ci0JCQkJCi0JCWlmICggZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpICkgewotCQkgCi0JCQlpZiAoIGRlYnVnICkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY29weWluZyByZXNvdXJjZSBmaWxlcyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmVzU2Nhbm5lci5leGVjdXRlKCk7Ci0JCQlkaWFncmFtSGFuZGxlci5leGVjdXRlKCk7Ci0KLQkJCWlmICggZGVidWcgKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzYXZpbmcgbGlicmFyeSAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlMaWJyYXJ5VXRpbC5zYXZlTGlicmFyeShiYXNlTGlicmFyeSwgZmFsc2UsIGZhbHNlKTsKLQkJfSAKLQkJZWxzZSB7Ci0JCQlmaWxlQ2hlY2tPdXRFcnJvcigpOwotCQl9CQotLy8gaWYgKCBkZWJ1ZyApIHsKLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29weWluZyByZXNvdXJjZSBmaWxlcyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotLy8gfQotLy8KLS8vIC8vIENvcHkgdGhlIHJlc291cmNlIGZpbGVzIGluIHRoZSBjdXJyZW50IGxpYnJhcnkgdG8gdGhlIG5ldyBsaWJyYXJ5LgotLy8gLy8gRm9yIHNpbXBsaWNpdHkgc2FrZSwgY29weSBhbGwgcmVzb3VyY2UgZmlsZXMgaWYgdGhlIGZpbGVzIGRvIG5vdAotLy8gLy8gZXhpc3QgaW4gdGhlIHRhcmdldCBsaWJyYXJ5IG9yIGlmIHRoZSBmaWxlcyBhcmUgbmV3ZXIuCi0vLyBTdHJpbmcgaW5jbHVkZXMgPSAicmVzb3VyY2VzLyoqLCAqKi9yZXNvdXJjZXMvKioiOyAvLyROT04tTkxTLTEkCi0vLwotLy8gTGF5b3V0UmVzb3VyY2VzLmNvcHlEaXIoc3JjRGlyLCBkZXN0RGlyLCBpbmNsdWRlcywgbnVsbCk7Ci0KLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWVyZ2luZyBjb25maWd1cmF0aW9uIGRvbmUuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbGVDaGVja091dEVycm9yKCkgewotCQkvLyBsb2cgZXJyb3IKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVN0cmluZyB0aXRsZSA9IEltcG9ydFJlc291cmNlcy5pbXBvcnRDb25maWdXaXphcmRfdGl0bGU7IAotCQkJCVN0cmluZyBtc2cgPSBJbXBvcnRSZXNvdXJjZXMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9FUlJfSW1wb3J0X2NvbmZpZ3VyYXRpb247IAotCQkJCW5ldyBNc2dEaWFsb2coSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKSkKLQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCBmaWxlQ2hlY2tlZE91dFN0YXR1cyk7Ci0JCQkJfQotCQl9KTsKLQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDaGVja291dCBmaWxlcyBmYWlsZWQgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU5ld1Jlc291cmNlcyhMaXN0IG9sZFJlc291cmNlcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYmFzZUxpYnJhcnkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKQotCQkJCS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKWl0Lm5leHQoKTsKLQkJCWlmICggIW9sZFJlc291cmNlcy5jb250YWlucyhyZXMpICkgewotCQkJCWxvZ05ld1Jlc291cmNlKHJlcyk7Ci0JCQl9Ci0JCX0JCi0JfQotCQotCQotCS8qKgotCSAqIFByb2Nlc3NlcyB0aGUgZGlmZiB0cmVlLiBPbmx5IG5lZWQgdG8gZG8gdGhlIGZpcnN0IGxldmVsIHNpbmNlIHRoZQotCSAqIHJlcGxhY2Ugb3IgYWRkIGlzIGRvbmUgYXQgdGhlIG1ldGhvZCBwYWNrYWdlIGxldmVsLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzRGlmZlRyZWUoRWxlbWVudERpZmZUcmVlIGRpZmZUcmVlLAotCQkJYm9vbGVhbiByZXBsYWNlRXhpc3RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZGlmZlRyZWUgPT0gbnVsbCB8fCAhaXNTZWxlY3RlZChkaWZmVHJlZSkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUaGVyZSBpcyBhIGNoYW5nZS4KLQkJaW50IHN0YXRlID0gZGlmZlRyZWUuZ2V0RGlmZlN0YXRlKCk7Ci0JCU1ldGhvZEVsZW1lbnQgYmFzZSA9IGRpZmZUcmVlLmdldEJhc2VFbGVtZW50KCk7Ci0JCU1ldGhvZEVsZW1lbnQgaW1wID0gZGlmZlRyZWUuZ2V0SW1wb3J0RWxlbWVudCgpOwotCQlpZiAocmVwbGFjZUV4aXN0aW5nICYmIChzdGF0ZSA9PSBFbGVtZW50RGlmZlRyZWUuRElGRl9TVEFURV9DSEFOR0VEKSApIHsKLQotCQkJaWYgKCAoYmFzZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGUgY29uZmlndXJhdGlvbiBieSBhZGRpbmcgdGhlIG5ldyBwYWNrYWdlcyBpbnRvIHRoZQotCQkJCS8vIGNvbmZpZ3VyYXRpb24KLQkJCQlkb1JlcGxhY2VDb25maWd1cmF0aW9uKChNZXRob2RDb25maWd1cmF0aW9uKSBiYXNlLCAoTWV0aG9kQ29uZmlndXJhdGlvbikgaW1wKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCAoYmFzZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCQkvLyBSZXBsYWNlIHRoZSBwbHVnaW4gd2l0aCB0aGUgbm9uLXBhY2thZ2UgZmVhdHVyZXMuCi0JCQkJZG9SZXBsYWNlUGx1Z2luKChNZXRob2RQbHVnaW4pIGJhc2UsIChNZXRob2RQbHVnaW4pIGltcCk7Ci0JCQl9Ci0JCQllbHNlIGlmICggKGJhc2UgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSkgewotCQkJCS8vIFJlcGxhY2UgdGhlIHBhY2thZ2UuCi0JCQkJZG9SZXBsYWNlUGFja2FnZSgoTWV0aG9kUGFja2FnZSkgYmFzZSwgKE1ldGhvZFBhY2thZ2UpIGltcCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKGRlYnVnICkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldoYXQgaXMgdGhpczogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGJhc2UpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChzdGF0ZSA9PSBFbGVtZW50RGlmZlRyZWUuRElGRl9TVEFURV9ORVcpIHsKLQkJCS8vIEFkZCB0aGUgbmV3IHBhY2thZ2UgZnJvbSBpbXBvcnQgbGlicmFyeS4KLQkJCWRvQWRkKGRpZmZUcmVlLmdldEJhc2VQYXJlbnRFbGVtZW50KCksIGRpZmZUcmVlLmdldEltcG9ydEVsZW1lbnQoKSk7IAotCQl9Ci0KLQkJLy8gUHJvY2VzcyB0aGUgY2hpbGRyZW4gcmVjdXJzaXZlbHkgaWYgaXQncyBub3QgYSBuZXcgb25lLgotCQlpZiAoc3RhdGUgIT0gRWxlbWVudERpZmZUcmVlLkRJRkZfU1RBVEVfTkVXKSB7Ci0JCQlMaXN0IGNoaWxkcmVuID0gZGlmZlRyZWUuZ2V0Q2hpbGRyZW4oKTsKLQkJCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlwcm9jZXNzRGlmZlRyZWUoKEVsZW1lbnREaWZmVHJlZSkgaXQubmV4dCgpLAotCQkJCQkJCXJlcGxhY2VFeGlzdGluZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIGJ5IHJlcGxhY2luZyB0aGUgbm9uLXBhY2thZ2UgZmVhdHVyZXMsIGFuZAotCSAqIGFkZGluZyB0aGUgbmV3IHBhY2thZ2VzIGludG8gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gb2xkT2JqCi0JICogICAgICAgICAgICBNZXRob2RDb25maWd1cmF0aW9uCi0JICogQHBhcmFtIG5ld09iagotCSAqICAgICAgICAgICAgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBkb1JlcGxhY2VDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gb2xkT2JqLCBNZXRob2RDb25maWd1cmF0aW9uIG5ld09iaikKLQl7Ci0JCWlmICggaXNSZXBsYWNlZChvbGRPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNldFJlcGxhY2VkKG9sZE9iaik7Ci0JCQotCQlMaXN0IHByb3BlcnRpZXMgPSBvbGRPYmouZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQkJLy8gZG9uJ3QgZGVsZXRlIG9sZCBmZWF0dXJlIHZhbHVlcwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCQkJCXNldEZlYXR1cmVWYWx1ZShvbGRPYmosIGZlYXR1cmUsIG5ld1ZhbHVlLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLS8vIHByaXZhdGUgdm9pZCBtZXJnZUVsZW1lbnRMaXN0KExpc3Qgc291cmNlLCBMaXN0IHRhcmdldCkKLS8vIHsKLS8vIExpc3QgaWRzID0gbmV3IEFycmF5TGlzdCgpOwotLy8gZm9yICggSXRlcmF0b3IgaXQgPSB0YXJnZXQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0vLyB7Ci0vLyBNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0vLyBpZHMuYWRkKGUuZ2V0R3VpZCgpKTsKLS8vIH0KLS8vCi0vLyBmb3IgKCBJdGVyYXRvciBpdCA9IHNvdXJjZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLS8vIHsKLS8vIE1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLS8vIGlmICggIWlkcy5jb250YWlucyhlLmdldEd1aWQoKSkgKQotLy8gewotLy8gdGFyZ2V0LmFkZChlKTsKLS8vIH0KLS8vIH0KLS8vIH0KLQotCS8qKgotCSAqIHJlcGxhY2UgdGhlIHBsdWdpbiBmZWF0dXJlcywgYnV0IG5vdCB0aGUgcGx1Z2luIG9iamVjdCBhbmQgaXQncyBwYWNrYWdlcwotCSAqIAotCSAqIEBwYXJhbSBvbGRPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqIEBwYXJhbSBuZXdPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqLwotCXByaXZhdGUgdm9pZCBkb1JlcGxhY2VQbHVnaW4oTWV0aG9kUGx1Z2luIG9sZE9iaiwgTWV0aG9kUGx1Z2luIG5ld09iaikgewotCQlpZiAoIGlzUmVwbGFjZWQob2xkT2JqKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQlzZXRSZXBsYWNlZChvbGRPYmopOwotCQkKLQkJTGlzdCBwcm9wZXJ0aWVzID0gb2xkT2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnRpZXMuZ2V0KGkpOwotCQkJCWlmICggZmVhdHVyZSAhPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZXMoKSApCi0JCQkJewotCQkJCQlPYmplY3QgbmV3VmFsdWUgPSBuZXdPYmouZUdldChmZWF0dXJlKTsKLQkJCQkJc2V0RmVhdHVyZVZhbHVlKG9sZE9iaiwgZmVhdHVyZSwgbmV3VmFsdWUsIHRydWUpOwotCQkJCX0KLQkJCQkvKiBObywgZG9uJ3QgZG8gdGhpcywgZml4IHRoZSBkaWZmIG1hbmFnZXIgdG8gaW5jbHVkZSB0aGUgcm9vdCBwYWNrYWdlIGluc3RlYWQKLQkJCQkgKiAxNTA4OTUgLSBJbXBvcnQgQ29uZmlnOiBDdXN0b21DYXRlZ29yeSBkaWQgbm90IHN5bmMgdXAgYnkgaW1wb3J0Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGN1c3RvbSBjYXRlZ29yaWVzIHBhY2thZ2UgbmVlZHMgc3BlY2lhbCBoYW5kaW5nCi0JCQkJCS8vIHdlIG5lZWQgdG8gc3RhcnQgd2l0aCB0aGUgcm9vdCBjdXN0b20gY2F0ZWdvcnkgb3RoZXJ3aXNlCi0JCQkJCS8vIGFsbCBjaGlsZCBjYXRlZ29yaWVzIHdpbGwgYmUgbG9zdAotCQkJCQlNZXRob2RQYWNrYWdlIG9sZFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKG9sZE9iaiwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVF9DVVNUT01fQ0FURUdPUllfUEFUSCk7Ci0vLyBDb250ZW50UGFja2FnZSBuZXdQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShuZXdPYmosCi0vLyBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULkRFRkFVTFRfQ1VTVE9NX0NBVEVHT1JZX1BBVEgpOwotCQkJCQlzZXRSZXBsYWNlZChvbGRQa2cpOwotCQkJCQkKLQkJCQkJLy8gZmluZCB0aGUgcm9vdCBjdXN0b20gY2F0ZWdvcnkgYW5kIHN0YXJ0IGZyb20gdGhlcmUKLQkJCQkJQ3VzdG9tQ2F0ZWdvcnkgb2xkQ0MgPSBUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShvbGRPYmopOwotCQkJCQlDdXN0b21DYXRlZ29yeSBuZXdDQyA9IFRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KG5ld09iaik7Ci0JCQkJCW9sZFBrZyA9IChNZXRob2RQYWNrYWdlKW9sZENDLmVDb250YWluZXIoKTsKLQkJCQkJc2V0UmVwbGFjZWQob2xkUGtnKTsKLQkJCQkJZG9SZXBsYWNlRWxlbWVudChvbGRDQywgbmV3Q0MpOwotCQkJCX0KLQkJCQkqLwotCQkJfQotCQl9Ci0KLQl9Ci0KLQotCi0JLyoqCi0JICogUmVwbGFjZXMgdGhlIGF0cnJpYnV0ZXMgYW5kIGNvbnRhaW5lZCBlbGVtZW50cywgYnV0IG5vdCB0aGUgY2hpbGQKLQkgKiBwYWNrYWdlcwotCSAqLwotCXByaXZhdGUgdm9pZCBkb1JlcGxhY2VQYWNrYWdlKE1ldGhvZFBhY2thZ2Ugb2xkT2JqLCBNZXRob2RQYWNrYWdlIG5ld09iaikgewotCQlpZiAoIGlzUmVwbGFjZWQob2xkT2JqKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQlzZXRSZXBsYWNlZChvbGRPYmopOwotCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlcGxhY2luZyBwYWNrYWdlICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShvbGRPYmopKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlMaXN0IHByb3BlcnRpZXMgPSBvbGRPYmouZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpICkKLQkJCQl7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCQkJCXNldEZlYXR1cmVWYWx1ZShvbGRPYmosIGZlYXR1cmUsIG5ld1ZhbHVlLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0vLyBwcml2YXRlIE1ldGhvZEVsZW1lbnQgb2JqT2xkID0gbnVsbDsKLS8vIHByaXZhdGUgTWV0aG9kRWxlbWVudCBvYmpOZXcgPSBudWxsOwotLy8gcHJpdmF0ZSB2b2lkIHRlc3RJdCgpIHsKLS8vIGlmICggb2JqT2xkICE9IG51bGwgKSB7Ci0vLyBTeXN0ZW0ub3V0LnByaW50bG4oIk9sZCBjb250YWluZXIgPSIgKyBvYmpPbGQuZUNvbnRhaW5lcigpKTsKLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTmV3IGNvbnRhaW5lciA9IiArIG9iak5ldy5lQ29udGFpbmVyKCkpOwotLy8gaWYgKCBvYmpPbGQuZUNvbnRhaW5lcigpID09IG51bGwgKSB7Ci0vLyBTeXN0ZW0ub3V0LnByaW50bG4oIm9sZCBpcyBnb25lISIpOwotLy8gfQotLy8gaWYgKCBvYmpOZXcuZUNvbnRhaW5lcigpID09IG51bGwgKSB7Ci0vLyBTeXN0ZW0ub3V0LnByaW50bG4oIm5ldyBpcyBnb25lISIpOwotLy8gfQotLy8gfQotLy8gfQotCQotCS8qKgotCSAqIHJlcGxhY2UgdGhlIGVsZW1lbnQgYnkgcmVwbGFjaW5nIHRoZSBmZWF0dXJlIHZhbHVlcywgYnV0IGRvbid0IHJlcGxhY2UKLQkgKiB0aGUgb2JqZWN0IGlmIGl0IGlzIG1hcmtlZCBhcyBub3QgcmVwbGFjZWFibGUuIHJlY3Vyc2l2ZSB0aGUgZmVhdHVyZQotCSAqIHZhbHVlIGFuZCByZXBsYWNlIGl0Ci0JICogCi0JICogQHBhcmFtIG9sZE9iagotCSAqICAgICAgICAgICAgTWV0aG9kUGx1Z2luCi0JICogQHBhcmFtIG5ld09iagotCSAqICAgICAgICAgICAgTWV0aG9kUGx1Z2luCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVwbGFjZUVsZW1lbnQoTWV0aG9kRWxlbWVudCBvbGRPYmosIE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB7Ci0JCQotCQkvLyBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IHJlcGxhY2VkIG9yIG5vdAotCQlpZiAoIGlzUmVwbGFjZWQob2xkT2JqKSApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICggZGlmZk1nci5zZWxlY3RhYmxlKG9sZE9iaikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoICFpc1NlbGVjdGVkKG9sZE9iaikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIGlmIGNvbnRlbnQgZGVzY3JpcHRpb24sIGNoZWNrIGlmIGl0J3MgY2hhbmdlZCBvciBub3QKLQkJaWYgKCAob2xkT2JqIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSAmJiAobmV3T2JqIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSApIHsKLQkJCWlmICggTGlicmFyeVV0aWwuaXNJZGVudGljYWwoKENvbnRlbnREZXNjcmlwdGlvbilvbGRPYmosIChDb250ZW50RGVzY3JpcHRpb24pbmV3T2JqKSApIHsKLQkJCQlpZiAoZGVidWcgKSB7Ci0JCQkJCVJlc291cmNlIHJlcyA9IG9sZE9iai5lUmVzb3VyY2UoKTsKLQkJCQkJaWYgKCByZXMgIT0gbnVsbCApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSWRlbnRpY2FsIGVsZW1lbnQgbm90IHJlcGxhY2VkOiAiICsgcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpICk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLy8gZXZlbiB0aG91Z2ggdGhlIGNvbnRlbnQgaXMgdGhlIHNhbWUsIHdlIHN0aWxsIG5lZWQgdG8gY29weSB0aGUgcmVzb3VyY2VzCi0JCQkJc2NhblJlc291cmNlcyhvbGRPYmosIHRydWUpOwotCQkJCXJldHVybjsKLQkJCX0gCi0JCX0KLQkJCi0JCS8vIHNldCByZXBhbGNlZCBmaXJzdCB0byBhdm9pZCBjYWxsaW5nIGludG8gdGhlIHNhbWUgb2JqZWN0IHJlY3Vyc2l2ZWx5Ci0JCXNldFJlcGxhY2VkKG9sZE9iaik7Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXBsYWNpbmcgZWxlbWVudCAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUob2xkT2JqKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUxpc3QgcHJvcGVydGllcyA9IG9sZE9iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0aWVzLmdldChpKTsKLQotCQkJCS8vIHBhY2thZ2Ugc3RydWN0dXJlIGlzIGhhbmRsZWQgYnkgdGhlIGRpZmYgdHJlZQotCQkJCS8vIHNvIHdlIGRvbid0IHByb2Nlc3MgdGhlIHJlbGF0ZWQgZmVhdHVyZQotCQkJCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZXMoKQotCQkJCQkJfHwgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSAKLQkJCQkJCXx8IGZlYXR1cmUuaXNEZXJpdmVkKCkgKQotCQkJCXsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gbmV3T2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJc2V0RmVhdHVyZVZhbHVlKG9sZE9iaiwgZmVhdHVyZSwgbmV3VmFsdWUsIHRydWUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIG5ldyB2YWx1ZSBmcm9tIHRoZSBpbXBvcnRpbmcgbGlicmFyeSB0byB0aGUgb2xkIG9iamVjdCBpbiB0aGUKLQkgKiBiYXNlIGxpYnJhcnkuIGlmIHRoZSB2YWx1ZSBvciBvbmxlIG9mIHZhbHVlcyBhcmUgbm90IHJlcGxhY2VhYmxlLCBzdWFjaAotCSAqIGFzIE1ldGhvZExpYnJhcnksIE1ldGhvZFBsdWdpbiwgTWV0aG9kUGFja2FnZSwgZXRjLCB0aG9zZSB2YWx1ZXMgc2hvdWxkCi0JICogYmUgc3Vic3RpdHVlZCB3aXRoIHRoZSBvbmUgaW4gdGhlIG9sZCBsaWJyYXJ5Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCQotCi0Jc3RhdGljIE1ldGhvZEVsZW1lbnQgbmV3Q29udCA9IG51bGw7Ci0Jc3RhdGljIE1ldGhvZEVsZW1lbnQgbmV3RWxlbSA9IG51bGw7Ci0JcHJpdmF0ZSB2b2lkIHNldEZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUsIGJvb2xlYW4gZG9EZWxldGUpCi0JewkJCi0JCWlmICggY2FuSWdub3JlKGZlYXR1cmUpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlib29sZWFuIG9sZE5vdGlmeSA9IGVsZW1lbnQuZURlbGl2ZXIoKTsKLQkJdHJ5Ci0JCXsKLQkJCS8vIHR1cm4gb2ZmIG5vdGlmaWNhdGlvbnMgdG8gYXZvaWQgcG9zc2libGUgZGVhZGxvY2sgb3IgdGhyZWFkIGlzc3VlCi0JCQllbGVtZW50LmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQotCQkJaWYgKCBjYW5SZXNldChmZWF0dXJlKSApIHsKLQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotCQkJfQotCQkJZWxzZSBpZiAoIGZlYXR1cmUuaXNNYW55KCkgJiYgbmV3VmFsdWUgaW5zdGFuY2VvZiBMaXN0KQotCQkJewotCQkJCUxpc3Qgb2xkVmFsdWUgPSAoTGlzdCllbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQkJRWxlbWVudExpc3REaWZmIGRpZmYgPSBuZXcgRWxlbWVudExpc3REaWZmKG9sZFZhbHVlLCAoTGlzdCluZXdWYWx1ZSk7Ci0JCQkJaWYgKCBkb0RlbGV0ZSAmJiBkaWZmLmRlbGV0ZWRJdGVtcy5zaXplKCkgPiAwICkgewotCQkJCQlvbGRWYWx1ZS5yZW1vdmVBbGwoZGlmZi5kZWxldGVkSXRlbXMpOwotCQkJCQlsb2dSZW1vdmVkRWxlbWVudHMoZGlmZi5kZWxldGVkSXRlbXMpOwotCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIERlbGV0aW5nIGZlYXR1cmUgdmFsdWUsIGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldE5hbWUoKSArICIsICBlbGVtZW50OiAiICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSArICIsIHZhbHVlczogIiArICBkaWZmLmRlbGV0ZWRJdGVtcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICggZGlmZi5uZXdJdGVtcy5zaXplKCkgPiAwICkgewkJCQkJCi0JCQkJCS8vIHNhdmUgdGhlIG5ldyBlbGVtZW50cyBhbmQgZml4IHRoZSByZWZlcmVuY2VzIGxhdGVyCi0JCQkJCS8vIG5vdGU6IHRoZSBuZXdseSBhZGRlZCBmZWF0dXJlIHZhbHVlcyBtaWdodCBub3QgYmUgUkVBTExZCi0JCQkJCS8vIG5ldyBlbGVtZW50IHRvIHRoZSBiYXNlIGxpYnJhcnkKLQkJCQkJLy8gaXQgbWlnaHQgYmUganVzdCBhIG5ld2x5IGFkZGVkIHJlZmVyZW5jZSwgc28gY2hlY2sgYW5kCi0JCQkJCS8vIG1ha2Ugc3VyZQotCQkJCQkvLyBpZiBpdCdzIG9sZCBlbGVtZW50LCBkbyByZXBsYWNlIGFnYWluCi0JCQkJCWZvciAoIEl0ZXJhdG9yIGl0biA9IGRpZmYubmV3SXRlbXMuaXRlcmF0b3IoKTsgaXRuLmhhc05leHQoKTsgKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG5ld09iaiA9IChNZXRob2RFbGVtZW50KWl0bi5uZXh0KCk7Ci0JCQkJCQkKLQkJCQkJCS8vIG9ubHkgcHJvY2VzcyB0aGUgbmV3IG9iamVjdCBpZiBpdCdzIHNlbGVjdGVkCi0JCQkJCQlpZiAoIGlzU2VsZWN0ZWQobmV3T2JqKSApIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50IG9sZE9iaiA9IGRpZmZNZ3IuZ2V0RXhpc3RpbmdFbGVtZW50KG5ld09iai5nZXRHdWlkKCkpOwotCQkJCQkJCWlmICggb2xkT2JqID09IG51bGwgKSB7Ci0JCQkJCQkJCW9sZFZhbHVlLmFkZChuZXdPYmopOwotCQkJCQkJCQlsb2dOZXdFbGVtZW50KG5ld09iaik7CQkJCQkJCQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCW9sZFZhbHVlLmFkZChvbGRPYmopOwotCQkJCQkJCQlkb1JlcGxhY2VFbGVtZW50KG9sZE9iaiwgbmV3T2JqKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgQWRkaW5nIGZlYXR1cmUgdmFsdWUsIGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldE5hbWUoKSArICIsICBlbGVtZW50OiAiICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSArICIsIHZhbHVlczogIiArICBkaWZmLm5ld0l0ZW1zKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQotCQkJCWlmICggZGlmZi5vbGROZXdNYXAuc2l6ZSgpID4gMCApIHsKLQkJCQkJZm9yICggSXRlcmF0b3IgaXQgPSBkaWZmLm9sZE5ld01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG9sZE9iaiA9IChNZXRob2RFbGVtZW50KWVudHJ5LmdldEtleSgpOwotCQkJCQkJCi0JCQkJCQkvLyBvbmx5IHByb2Nlc3MgdGhlIG5ldyBvYmplY3QgaWYgaXQncyBzZWxlY3RlZAotCQkJCQkJaWYgKCAhaXNTZWxlY3RlZChvbGRPYmopICkgewotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlNZXRob2RFbGVtZW50IG5ld09iaiA9IChNZXRob2RFbGVtZW50KWVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCQlpZiAoIGNhblJlc2V0KG9sZE9iaikgKSB7Ci0JCQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIFJlc2V0dGluZyBmZWF0dXJlIHZhbHVlLCBmZWF0dXJlOiAiICsgZmVhdHVyZS5nZXROYW1lKCkgKyAiLCAgZWxlbWVudDogIiAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSArICIsIHZhbHVlOiAiICsgIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG9sZE9iaikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCi0JCQkJCQkJRWNvcmVVdGlsLnJlcGxhY2UoZWxlbWVudCwgZmVhdHVyZSwgb2xkT2JqLCBuZXdPYmopOwotCQkJCQkJCWxvZ1Jlc2V0RWxlbWVudChuZXdPYmopOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlkb1JlcGxhY2VFbGVtZW50KG9sZE9iaiwgbmV3T2JqKTsgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQl7Ci0JCQkJLy8gaWYgdGhlIG9sZCBhbmQgbmV3IGVsZW1lbnQgYXJlIHRoZSBzYW1lLAotCQkJCS8vIG9ubHkgcmVwbGFjZSB0aGUgZmVhdHVyZSB2YWx1ZQotCQkJCU1ldGhvZEVsZW1lbnQgbyA9IChNZXRob2RFbGVtZW50KWVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCQlNZXRob2RFbGVtZW50IG4gPSAoTWV0aG9kRWxlbWVudCluZXdWYWx1ZTsKLQkJCQkKLQkJCQkvLyBvbmx5IHByb2Nlc3MgdGhlIG5ldyBvYmplY3QgaWYgaXQncyBzZWxlY3RlZAotCQkJCWlmICggKG8gPT0gbnVsbCB8fCBpc1NlbGVjdGVkKG8pKSAmJiBpc1NlbGVjdGVkKG4pICkgewotCi0JCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgUmVwbGFjaW5naW5nIGZlYXR1cmUgdmFsdWUsIGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldE5hbWUoKSArICIsICBlbGVtZW50OiAiICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSArICIsIHZhbHVlOiAiICsgIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG8pKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCi0JCQkJCWlmICggbmV3VmFsdWUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gKSB7Ci0JCQkJCQkvLyBhbHdheXMgcmVwbGFjZSBjb250ZW50IGRlc2NyaXB0aW9uIChub3QgcmVzZXQpIHRvCi0JCQkJCQkvLyByZXNlcnZlIHRoZSBleGlzdGluZyByZXNvdXJjZSAoeG1pIGZpbGUpCi0JCQkJCQkvLyBzaW5jZSB0aGUgY29udGVudERlc2NyaXB0aW9uIGlzIHVuaXF1ZSB0aGUgYSBtZXRob2QKLQkJCQkJCS8vIGVsZW1lbnQsIHNvIHdlIGRvbid0IG5lZWQgdG8gY29tcGFyZSB0aGUgZ3VpZAotCQkJCQkJCQkJCQkJCi0JCQkJCQkvLyBpZiBib3RoIG9iamVjdCBoYXMgbm8gY29udGFpbmVyLCB0aGVyZSBpcyBubyBzdWNoCi0JCQkJCQkvLyBkZXNjcmlwdGlvbiwgaWdub3JlIGl0Ci0JCQkJCQlpZiAoIG8uZUNvbnRhaW5lcigpICE9IG51bGwgfHwgbi5lQ29udGFpbmVyKCkgIT0gbnVsbCApIHsKLQkJCQkJCQlpZiAoIG8uZUNvbnRhaW5lcigpID09IG51bGwgKSB7Ci0JCQkJCQkJCWVsZW1lbnQuZVNldChmZWF0dXJlLCBvKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZG9SZXBsYWNlRWxlbWVudChvLCBuKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBpZiB0aGUgZWxlbWVudCBjYW4gYmUgcmVwbGFjZWQsIHN1Y2ggYXMgZm9yCi0JCQkJCS8vIENvbnRlbnREZXNjcmlwdGlvbiBlbGVtZW50Ci0JCQkJCS8vIHNldCB0aGUgdmFsdWUgZGlyZWN0bHkKLQkJCQkJZWxzZSBpZiAoIGNhblJlc2V0KG4pICkgewotCQkJCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQkJCWxvZ05ld0VsZW1lbnQobik7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlpZiAoIG8gIT0gbnVsbCAmJiBuICE9IG51bGwgJiYgby5nZXRHdWlkKCkuZXF1YWxzKG4uZ2V0R3VpZCgpKSApIHsKLQkJCQkJCQkgZG9SZXBsYWNlRWxlbWVudChvLCBuKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewkJCQkJCQkJCQkJCQkKLQkJCQkJCQlyZWdpc3RlclNldEVsZW1lbnQoZWxlbWVudCwgZmVhdHVyZSwgbmV3VmFsdWUpOwotCQkJCQkJCQotCQkJCQkJCWVsZW1lbnQuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JCQkJCQkJbG9nTmV3RWxlbWVudChuKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkgKSB7Ci0JCQkJLy8gY2hlY2sgZGlmZmVyZW5jZSBuYW1lLCBpZiByZXBsYWNlLCBuZWVkIHRvIHJlbmFtZSByZXNvdXJjZXMgaWYgaWYgaGFzIGl0J3Mgb3duIHJlc291cmNlCi0JCQkJLy8gbGlrZSBjb250ZW50IGVsZW1lbnRzLCBwbHVnaW5zLCBjb25maWd1aXJhdGlvbnMsIGFuZCBwcm9jZXNzIGNvbXBvbmVudHMJCQkJCQotCQkJCWlmICghIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKLQkJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCVN0cmluZyBvbGROYW1lID0gKFN0cmluZyllbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkTmFtZSkpIHsJCQkJCQotCQkJCQllbnN1cmVVbmlxdWVOYW1lRm9yRXhpc3RpbmdFbGVtZW50KGVsZW1lbnQsIG9sZE5hbWUsIChTdHJpbmcpIG5ld1ZhbHVlLCByZW5hbWVFbGVtZW50TWFwKTsJCQkJCQkJCQkJCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotCQkJCQotCQkJCS8vIHNjYW4gYW5kIGNvcHkgdGhlIHJlc291cmNlcwotCQkJCXNjYW5SZXNvdXJjZXMoZWxlbWVudCwgZmVhdHVyZSwgbmV3VmFsdWUpOwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQllbGVtZW50LmVTZXREZWxpdmVyKG9sZE5vdGlmeSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2NhblJlc291cmNlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gcmVjdXJzaXZlKSB7Ci0KLQkJaWYgKCBlbGVtZW50ID09IG51bGwgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQkJaWYgKCAhKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJCXNjYW5SZXNvdXJjZXMoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoICFyZWN1cnNpdmUgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdClpdC5uZXh0KCk7Ci0JCQkKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5Ci0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiAKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSAKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZiAoIG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0JCQkJc2NhblJlc291cmNlcygoTWV0aG9kRWxlbWVudClvYmosIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2NhblJlc291cmNlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJZGlhZ3JhbUhhbmRsZXIucmVnaXN0ZXJFbGVtZW50KGVsZW1lbnQpOwotCQkKLQkJLy8gc2NhbiB0aGUgcmVzb3VyY2VzCi0JCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCkgKSB7Ci0JCQkvLyBwcm9jZXNzIHRoZSBhdHRhY2htZW50cwotCQkJU3RyaW5nIHVybHMgPSAoU3RyaW5nKW5ld1ZhbHVlOwotCQkJaWYgKCAodXJscyAhPSBudWxsKSAmJiB1cmxzLmxlbmd0aCgpICE9IDAgKSB7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih1cmxzLCAifCIpOyAvLyB0aGlzIGlzIGhhcmRjb2RlZCBzb21laG93Ci0JCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSApIHsKLQkJCQkJU3RyaW5nIHVybCA9IHN0Lm5leHRUb2tlbigpOwotCQkJCQlyZXNTY2FubmVyLmNvcHlSZXNvdXJjZSAoZWxlbWVudCwgdXJsKTsKLQkJCQl9CQkJCQkJCi0JCQl9Ci0JCX0gZWxzZSBpZiAoIG5ld1ZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICkgewotCQkJcmVzU2Nhbm5lci5zY2FuKGVsZW1lbnQsIG5ld1ZhbHVlLnRvU3RyaW5nKCkpOwotCQl9IGVsc2UgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgVVJJICkgewotCQkJcmVzU2Nhbm5lci5jb3B5UmVzb3VyY2UgKCAoKFVSSSluZXdWYWx1ZSkuZ2V0UGF0aCgpKTsKLQkJfQotCi0JfQotCQotCXByaXZhdGUgdm9pZCBkb0FkZChFT2JqZWN0IG93bmVyLCBNZXRob2RFbGVtZW50IG5ld09iaikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBlbGVtZW50ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZSgoTWV0aG9kRWxlbWVudCluZXdPYmopKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gdGhlIG93bmVyIGNhbiBvbmx5IGJlIGxpYnJhcnkgYW5kIHBhY2thZ2UKLQkJaWYgKG93bmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZW5zdXJlVW5pcXVlTmFtZShvd25lciwgbmV3T2JqLCByZW5hbWVFbGVtZW50TWFwKTsKLQkJCi0JCWJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLQkJCi0JCWlmIChvd25lciBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsJCQkKLQkJCS8vIGNhbiBiZSBjb25maWd1cmF0aW9uIG9yIHBsdWdpbgotCQkJaWYgKG5ld09iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKW5ld09iajsJCQkJCi0JCQkJCi0JCQkJY2hlY2tNb2RpZmllZEZpbGVzKCk7CQkJCQotCQkJCWVycm9yID0gISBmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCk7CQkJCQotCQkJCQkJCQkKLQkJCQkvLyBkb24ndCBpbnRpdGlhbGl6ZSB0aGUgc3RvcmFnZSBzaW5jZSB0aGlzIHdpbGwgcmVjcmVhdGUgdGhlIGdsb2JhbCBwYWNrYWdlcwotCQkJCS8vIGFuZCBzdWNoIGNhdXNpbmcgdHdvIHNldCBvZiBnbG9iYWwgcGFja2FnZXMKLQkJCQkvLyAxNDU4NTAgLSBJbXBvcnQgQ29uZmlndXJhdGlvbjogQ1AvRFBzIGRpZCBub3Qgc2hvd24gaW4gYXV0aGVyaW5nCi0JCQkJLy8gTW9kZWxTdG9yYWdlLmluaXRpYWxpemUocGx1Z2luKTsKLQkJCQkvLyBOTywgc2luY2UgdGhlIGdsb2JhbCBwYWNrYWdlcyBhcmUgYWxyZWFkeSBjcmVhdGVkCi0JCQkJaWYgKCFlcnJvcikgewotCQkJCQkoKE1ldGhvZExpYnJhcnkpb3duZXIpLmdldE1ldGhvZFBsdWdpbnMoKS5hZGQocGx1Z2luKTsKLQkJCQkJTGlicmFyeVV0aWwuc2F2ZUxpYnJhcnkoKE1ldGhvZExpYnJhcnkpb3duZXIsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJfQotCQkJCQkJCQkKLQkJCX0gZWxzZSBpZiAobmV3T2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiApIHsKLQkJCQljaGVja01vZGlmaWVkRmlsZXMoKTsJCQkJCi0JCQkJZXJyb3IgPSAhIGZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKTsKLQkJCQlpZiAoIWVycm9yKSB7Ci0JCQkJCSgoTWV0aG9kTGlicmFyeSlvd25lcikuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuYWRkKG5ld09iaik7Ci0JCQkJCUxpYnJhcnlVdGlsLnNhdmVMaWJyYXJ5KChNZXRob2RMaWJyYXJ5KW93bmVyLCBmYWxzZSwgZmFsc2UpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZXJyb3IgPSB0cnVlOwkJCQotCQkJfQotCQl9IGVsc2UgaWYgKCAob3duZXIgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSAKLQkJCQkmJiAob3duZXIuZUNvbnRhaW5lcigpICE9IG51bGwpIAotCQkJCSYmIChuZXdPYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSApIHsKLQkJCSgoTWV0aG9kUGFja2FnZSlvd25lcikuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChuZXdPYmopOwotCQl9IGVsc2UgewotCQkJZXJyb3IgPSB0cnVlOwotCQl9Ci0JCQkKLQkJaWYgKCBlcnJvciApIHsKLQkJCVN0cmluZyBtc2cgPSAiY2FuJ3QgYWRkICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShuZXdPYmopIC8vJE5PTi1OTFMtMSQKLQkJCSsgIiB0byAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoKE1ldGhvZFBhY2thZ2Upb3duZXIpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobXNnKTsgCi0JCQlpZiAoIGRlYnVnICkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJfQotCQl9IGVsc2UgewotCQkJbG9nTmV3RWxlbWVudChuZXdPYmopOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrTW9kaWZpZWRDb25maWdzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdCBjb25maWdMaXN0ID0gTGlicmFyeVV0aWwuZ2V0QXNzb2NpYXRlZENvbmZpZ3VyYXRpb25zKHBsdWdpbik7Ci0JCUxpc3QgYmFzZUNvbmZpZ3MgPSBiYXNlTGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJTWFwIGJhc2VDb25maWdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGk8YmFzZUNvbmZpZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGJhc2VDb25maWdzLmdldChpKTsKLQkJCWJhc2VDb25maWdNYXAucHV0KGNvbmZpZy5nZXRHdWlkKCksIGNvbmZpZyk7Ci0JCX0KLQkJZmluYWwgTGlzdCBtb2RpZmllZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPTA7IGk8Y29uZmlnTGlzdC5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlnTGlzdC5nZXQoaSk7Ci0JCQljb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgYmFzZUNvbmZpZ01hcC5nZXQoY29uZmlnLmdldEd1aWQoKSk7Ci0JCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQlSZXNvdXJjZSByZXMgPSBjb25maWcuZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJCW1vZGlmaWVkRmlsZXMuYWRkKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IEZpbGVNb2RpZnlDaGVja2VyLmNoZWNrTW9kaWZ5KG1vZGlmaWVkRmlsZXMpOwotCQkJfQotCQl9KTsKLQkJZmlsZUNoZWNrT3V0RXJyb3IoKTsKLQkJCi0JCXJldHVybiBmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvSW50ZWdyaXR5Q2hlY2soKQotCXsJCQotCQkvLyBub3cgdGhlIG5ld2x5IGFkZGVkIGVsZW1lbnRzIG1heSBoYXZlIGZlYXR1cmUgdmFsdWUgZWxlbWVudCB0aGF0Ci0JCS8vIHN0aWxsIHBvaW50aW5nIHRvIHRoZSBpbXBvcnRpbmcgbGlicmFyeQotCQkvLyB3ZSBuZWVkIHRvIHJlcGxhY2UgdGhvc2Ugd2l0aCB0aGUgb25lIGluIHRoZSBiYXNlIGxpYnJhcnkKLQkJd2hpbGUgKG5ld0VsZW1lbnRzLnNpemUoKSA+IDApIHsKLQkJCU1ldGhvZEVsZW1lbnQgbmV3T2JqID0gKE1ldGhvZEVsZW1lbnQpbmV3RWxlbWVudHMucmVtb3ZlKDApOwotCQkJdHJ5IHsKLQkJCQlpZiAoIG5ld09iaiBpbnN0YW5jZW9mIERpYWdyYW1FbGVtZW50ICkgewotCQkJCQlmaXhEaWFncmFtKChEaWFncmFtRWxlbWVudCluZXdPYmopOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpeE5ld0VsZW1lbnRSZWZlcmVuY2VzKG5ld09iaik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gd2hpbGUgZml4aW5nIG5ldyBlbGVtZW50ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShuZXdPYmopKTsKLQkJCQl9Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gdGhlIGNvbmZpZ3VyYXRpb25zIG5lZWRzIHRvIGJlIGZpeGVkCi0JCUxpc3QgY29uZmlncyA9IGJhc2VMaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0JCXsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24paXQubmV4dCgpOwotCQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgcHJvY2Vzc2VkTmV3RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCi0JCi0JLyoqCi0JICogaXRlcmF0ZSBhbGwgZmVhdHVyZXMsIGlmIHRoZSBmZWF0dXJlIHZhbHVlIHJlZmVyZW5jZXMgYW4gZWxlbWVudCB3aGljaCBpcwotCSAqIGFuIG9sZCBlbGVtZW50LCByZXBsYWNlIGl0IHdpdGggdGhlIG9sZCBlbGVtZW50LiBpZiB0aGUgZWxlbWVudCBpcyBuZXcsCi0JICogaXRlcmF0ZSBpdCdzIGNvbnRhaW5tZW50IGVsZW1lbnRzCi0JICogCi0JICogQHBhcmFtIG5ld09iagotCSAqLwotCXByaXZhdGUgdm9pZCBmaXhOZXdFbGVtZW50UmVmZXJlbmNlcyhNZXRob2RFbGVtZW50IG5ld09iaikgewotCQlpZiAoIHByb2Nlc3NlZE5ld0VsZW1lbnRzLmNvbnRhaW5zKG5ld09iaikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXByb2Nlc3NlZE5ld0VsZW1lbnRzLmFkZChuZXdPYmopOwotCQkKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRml4aW5nIGVsZW1lbnQgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG5ld09iaikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCUxpc3QgcHJvcGVydGllcyA9IG5ld09iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0aWVzLmdldChpKTsKLQkJCQlPYmplY3QgdmFsdWUgPSBuZXdPYmouZUdldChmZWF0dXJlKTsKLQotCQkJCWlmICggdmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCQotCQkJCQkvLyBmaXhpbmcgdGhlIGZlYXR1cmUgdmFsdWUgbWF5IGNhdXNlIHRoZSBsaXN0IHRvIGNoYW5nZQotCQkJCQkvLyBpdGVyYXRlIG9uIGEgbmV3IGNvcHkgdG8gYXZvaWQKLQkJCQkJLy8gQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0PSBuZXcgQXJyYXlMaXN0KCgoTGlzdCl2YWx1ZSkpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCQkJCWZpeE5ld0VsZW1lbnRGZWF0dXJlVmFsdWUobmV3T2JqLCBmZWF0dXJlLCBvKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpeE5ld0VsZW1lbnRGZWF0dXJlVmFsdWUobmV3T2JqLCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9CQotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgZml4RGlhZ3JhbShEaWFncmFtRWxlbWVudCBuZXdPYmopIHsJCQotCi0JCWlmICggcHJvY2Vzc2VkTmV3RWxlbWVudHMuY29udGFpbnMobmV3T2JqKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJcHJvY2Vzc2VkTmV3RWxlbWVudHMuYWRkKG5ld09iaik7Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaXhpbmcgZGlhZ3JhbSBlbGVtZW50ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShuZXdPYmopKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlMaXN0IHByb3BlcnRpZXMgPSBuZXdPYmouZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQkJT2JqZWN0IHZhbHVlID0gbmV3T2JqLmVHZXQoZmVhdHVyZSk7Ci0KLQkJCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQkKLQkJCQkJLy8gZml4aW5nIHRoZSBmZWF0dXJlIHZhbHVlIG1heSBjYXVzZSB0aGUgbGlzdCB0byBjaGFuZ2UKLQkJCQkJLy8gaXRlcmF0ZSBvbiBhIG5ldyBjb3B5IHRvIGF2b2lkCi0JCQkJCS8vIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLQkJCQkJZm9yIChJdGVyYXRvciBpdD0gbmV3IEFycmF5TGlzdCgoKExpc3QpdmFsdWUpKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAoIG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJCQkJCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKSApIHsKLQkJCQkJCQkJZml4TmV3RWxlbWVudEZlYXR1cmVWYWx1ZShuZXdPYmosIGZlYXR1cmUsIG8pOwotCQkJCQkJCX0gZWxzZSBpZiAoIChvIGluc3RhbmNlb2YgRGlhZ3JhbUVsZW1lbnQpICkgewotCQkJCQkJCQlmaXhEaWFncmFtKChEaWFncmFtRWxlbWVudClvKTsKLQkJCQkJCQl9IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCkgKSB7Ci0JCQkJCQlmaXhOZXdFbGVtZW50RmVhdHVyZVZhbHVlKG5ld09iaiwgZmVhdHVyZSwgdmFsdWUpOwotCQkJCQl9IGVsc2UgaWYgKCAodmFsdWUgaW5zdGFuY2VvZiBEaWFncmFtRWxlbWVudCkgKSB7Ci0JCQkJCQlmaXhEaWFncmFtKChEaWFncmFtRWxlbWVudCl2YWx1ZSk7Ci0JCQkJCX0gCi0JCQkJfQotCQkJfQotCQl9CQotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgdmFsdWUgaXMgYW4gb2xkIGVsZW1lbnQgaW4gdGhlIGJhc2UsIGlmIHllcywgcmVwbGFjZSBpdCB3aXRoCi0JICogdGhlIG9sZCBvbmUgaWYgaXQncyBuZXcsIGl0ZXJhdGUgaXQncyBmZWF0dXJlIHZhbHVlCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gb2JqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpeE5ld0VsZW1lbnRGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG9iaikgewotCQlpZiAoICEob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImZpeGluZyBlbGVtZW50IGZlYXR1cmUgdmFsdWUgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIiwgZmVhdHVyZT0iICsgZmVhdHVyZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlib29sZWFuIG9sZE5vdGlmeSA9IGVsZW1lbnQuZURlbGl2ZXIoKTsKLQkJdHJ5Ci0JCXsKLQkJCWVsZW1lbnQuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCi0JCQlNZXRob2RFbGVtZW50IG5ld09iaiA9IChNZXRob2RFbGVtZW50KW9iajsKLQkJCU1ldGhvZEVsZW1lbnQgb2xkT2JqID0gZ2V0UmVwbGFjZWQobmV3T2JqLmdldEd1aWQoKSk7Ci0JCQlpZiAoIG9sZE9iaiA9PSBudWxsICkgewotCQkJCS8vIGdldCBleGlzdGluZyBlbGVtZW50LCBmb3IgZXhhbXBsZSwgdGhlIGdsb2JhbCBwYWNrYWdlcyBpbiB0aGUKLQkJCQkvLyBjb25maWd1cmF0aW9uIGZlYXR1cmUKLQkJCQlvbGRPYmogPSBkaWZmTWdyLmdldEV4aXN0aW5nRWxlbWVudChuZXdPYmouZ2V0R3VpZCgpKTsKLQkJCX0KLQkJCQotCQkJaWYgKCBvbGRPYmogPT0gbnVsbCApIHsKLQkJCQkvLyBpdCdzIGEgbmV3IG9uZQotCQkJCWZpeE5ld0VsZW1lbnRSZWZlcmVuY2VzKG5ld09iaik7Ci0JCQl9IGVsc2UgewotCQkJCQotCQkJCXRyeSB7Ci0JCQkJCS8vIHJlcGxhY2UgdGhlIG5ld09iaiB3aXRoIHRoZSBvbGRPYmoKLQkJCQkJRWNvcmVVdGlsLnJlcGxhY2UoZWxlbWVudCwgZmVhdHVyZSwgbmV3T2JqLCBvbGRPYmopOyAKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBpZiByZXBsYWNlIGZhaWxlZCwgcmVtb3ZlIHRoZSBmZWF0dXJlCi0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoZWxlbWVudCwgZmVhdHVyZSwgbmV3T2JqKTsgCi0JCQkJCWlmIChkZWJ1ZyApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVwbGFjZWluZyBmZWF0dXJlIHZhbHVlIGZhaWxlZCBmb3IgZWxlbWVudCBbIiAKLQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSArICJdLCBmZWF0dXJlIFsiIAotCQkJCQkJCQkrIGZlYXR1cmUuZ2V0TmFtZSgpICsgIl0sIHZhbHVlPSIgCi0JCQkJCQkJCSsgbmV3T2JqICsgIi4gVGhlIGZlYXR1cmUgdmFsdWUgaXMgcmVtb3ZlZC4gIik7Ci0JCQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0JCi0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQllbGVtZW50LmVTZXREZWxpdmVyKG9sZE5vdGlmeSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNhblJlc2V0KE1ldGhvZEVsZW1lbnQgZSkgewotCQlib29sZWFuIHJlc2V0ID0gZmFsc2U7Ci0JCQotCQkvLyBhbiBlbGVtZW50IGNhbiBiZSByZXNldCBpZiB5b3UgYXJlIHN1cmUgdGhhdCBubyBvdGhlciBlbGVtZW50KHMpCi0JCS8vIHJlZmVyZW5jZSB0byBpdAotCQkvLyByZXNldCBlbGVtZW50cyBtYXkgaGF2ZSByZWZlcmVuY2VzIHRvIG90aGVyIGVsZW1lbnRzIGluIHRoZSBpbXBvcnRpbmcKLQkJLy8gbGlicmFyeSwgdGhhdCBuZWVkcyB0byBiZSBmaXhlZCBsYXRlcgotCQkKLQkJLy8gZm9yIGFueXRoaW5nIGNvbnRhaW5lZCBieSBDb250ZW50RGVzY3JpcHRpb24sIHJlc2V0IGl0Ci0JCWlmICggZSA9PSBudWxsIC8qIHx8IGUuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uICovCi0JCQkJfHwgZSBpbnN0YW5jZW9mIERpYWdyYW1FbGVtZW50KSB7Ci0JCQlyZXNldCA9IHRydWU7Ci0JCX0KLQkJCQkKLQkJcmV0dXJuIHJlc2V0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5SZXNldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQkvLyBmb3IgYW55dGhpbmcgY29udGFpbmVkIGJ5IENvbnRlbnREZXNjcmlwdGlvbiwgcmVzZXQgaXQKLQkJLy8gbm8gZG9uJ3QgcmVzZXQgdGhlIHNlY3Rpb25zIHNpbmNlIGl0IHdpbGwgY2F1c2UgdGhlIG9uZSBpbiB0aGUKLQkJLy8gaW1wb3J0aW5nIGxpYnJhcnkgcmVtb3ZlZAotCQkvLyB3aGljaCBjYXVzZWQgcHJvYmxlbSBmb3IgVGFza0Rlc2NyaXB0aW9uIHdoZXJlIHRoZSBzYW1lIGZlYXR1cmUKLQkJLy8gKFN0ZXBzKSBjYW4ndCBmaW5kIHRoZSBzdGVwcyBmcm9tIHRoZSBpbXBvcnRpbmcgbGlicmFyeQotCQkvLyB3aGljaCB0aGVuIHdpbGwgdHJlYXQgdGhlIHN0ZXBzIGluIHRoZSBiYXNlIGxpYnJhcnkgYmVpbmcgZGV0ZXRlZAotLy8gaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpKSB7Ci0vLyByZXR1cm4gdHJ1ZTsKLS8vIH0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5JZ25vcmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJLy8gZG9uJ3QgcmVzZXQgdGhlIHBsdWdpbiBsb2NrIHN0YXR1cwotCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gMTQ2MTQ0IC0gSW1wb3J0IENvbmZpZ3VyYXRpb246IHNvbWUgdW5jaGFuZ2UgZWxlbWVudHMgZGlzYXBwZWFyIGluIGF1dGhvcmluZyBhZnRlciBpbXBvcnQKLQkJLy8gdGhpcyBpcyBjYXVzZWQgYnkgYSBidWcgaW4gQXJ0aWZhY3RJbXBsLCB3aGVuIHNldENvbnRhaW5lckFydGlmYWN0IHRvIG51bGwsIAotCQkvLyAgaXQgc2V0IHRoZSBlQ29udGFpbmVyIHRvIG51bGwsIGlmIHRoZSBlQ29udGFpbmVyIGlzIGEgY29udGVudCBwYWNrYWdlLCAKLQkJLy8gdGhlIGFydGlmYWN0IGlzIHJlbW92ZWQgZnJvbSB0aGUgcGFja2FnZQotCQkvLyAgdGhpcyBidWcgd2lsbCBiZSBmaXhlZCBpbiBNNC4gCi0JCS8vIGZvciBub3csIGlnbm9yZSB0aGlzIGZlYXR1cmUgc2luY2UgdGhpcyBpcyBhbiBvcHBvc2l0ZSBmZWF0dXJlLCB3ZSBkb24ndCBuZWVkIHRvIGhhbmRsZSBpdAkKLQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lckFydGlmYWN0KCkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1JlcGxhY2VkKE1ldGhvZEVsZW1lbnQgb2xkT2JqKSB7Ci0JCXJldHVybiByZXBsYWNlZEVsZW1lbnRNYXAuY29udGFpbnNLZXkob2xkT2JqLmdldEd1aWQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFJlcGxhY2VkKE1ldGhvZEVsZW1lbnQgb2xkT2JqKSB7Ci0JCVN0cmluZyBndWlkID0gb2xkT2JqLmdldEd1aWQoKTsKLQkJaWYgKCAhcmVwbGFjZWRFbGVtZW50TWFwLmNvbnRhaW5zS2V5KGd1aWQpICkgewotCQkJcmVwbGFjZWRFbGVtZW50TWFwLnB1dChndWlkLCBvbGRPYmopOwotCQkJc2V0TW9kaWZpZWQob2xkT2JqKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIG9sZCBlbGVtZW50IGJlZW4gcmVwbGFjZWQKLQkgKiAKLQkgKiBAcGFyYW0gb2xkT2JqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBnZXRSZXBsYWNlZChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpcmVwbGFjZWRFbGVtZW50TWFwLmdldChndWlkKTsKLQl9Ci0JCi0JLyoqCi0JICogd2hlbiBuZXcgZWxlbWVudHMgYXJlIGFkZGVkIGludG8gdGhlIGxpYnJhcnksIHRoZSBhc3NvY2lhdGVkIHJlc291cmNlCi0JICogZmlsZXMgbXVzdCBiZSBjb3BpZWQgb3ZlciBhcyB3ZWxsCi0JICogCi0JICogQHBhcmFtIG5ld09iagotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBjb3B5TmV3RWxlbWVudFJlc291cmNlcyhNZXRob2RFbGVtZW50IG5ld09iaikgewotCQkKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBuZXdPYmouZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0vLwkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcy5nZXQoaSk7Ci0vLwkJCQlPYmplY3QgdmFsdWUgPSBuZXdPYmouZUdldChmZWF0dXJlKTsKLS8vCQkJCWlmICggdmFsdWUgaW5zdGFuY2VvZiBVUkkgKSB7Ci0vLwkJCQkJcmVzU2Nhbm5lci5jb3B5UmVzb3VyY2UoKChVUkkpdmFsdWUpLmdldFBhdGgoKSk7Ci0vLwkJCQl9IGVsc2UgaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyApIHsKLS8vCQkJCQlyZXNTY2FubmVyLnNjYW4obmV3T2JqLCAoU3RyaW5nKXZhbHVlKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQlmb3IgKCBJdGVyYXRvciBpdCA9IG5ld09iai5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLS8vCQkJaWYgKCBvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLS8vCQkJCWNvcHlOZXdFbGVtZW50UmVzb3VyY2VzKChNZXRob2RFbGVtZW50KW8pOwotLy8JCQl9Ci0vLwkJfQotCQkKLQkJc2NhblJlc291cmNlcyhuZXdPYmosIHRydWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9nTmV3RWxlbWVudChNZXRob2RFbGVtZW50IG5ld09iaikgewotCQkKLQkJLy8gbWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIG5vdCBpbiB0aGUgb3JpZ2luYWwgbGlicmFyeQotCQkvLyBzaW5jZSB3ZSBoYXZlIHRoZSBndWlkLWVsZW1lbnQgbWFwIGJ1aWxkIHVwIGluIHRoZSBkaWZmIG1hbmFnZXIsCi0JCS8vIGNoZWNrIHRoZXJlCi0JCWlmICggIW5ld0VsZW1lbnRzLmNvbnRhaW5zKG5ld09iaikgJiYgZGlmZk1nci5nZXRFeGlzdGluZ0VsZW1lbnQobmV3T2JqLmdldEd1aWQoKSkgPT0gbnVsbCkgewotCQkJbmV3RWxlbWVudHMuYWRkKG5ld09iaik7Ci0JCQljb3B5TmV3RWxlbWVudFJlc291cmNlcyhuZXdPYmopOwotCQkJc2V0TW9kaWZpZWQobmV3T2JqKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9nUmVzZXRFbGVtZW50KE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB7Ci0JCWlmICggIW5ld0VsZW1lbnRzLmNvbnRhaW5zKG5ld09iaikgKSB7Ci0JCQluZXdFbGVtZW50cy5hZGQobmV3T2JqKTsKLQkJCXNldE1vZGlmaWVkKG5ld09iaik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9nTmV3UmVzb3VyY2UoUmVzb3VyY2UgcmVzICkgewotCQlpZiAoIHJlcyAhPSBudWxsICkgewotCQkJCi0JCQkvLyBtYXJrIHRoZSByZXNvdXJjZSBhcyBkaXJ0eSBzbyB0aGF0IHdlIGNhbiBzYXZlIGl0IGFnYWluCi0JCQkvLyB0aGUgZmlyc3Qgc2F2ZSBtYXkgbG9zZSBjcm9zcyByZWZlcmVuY2VzIAotCQkJcmVzLnNldE1vZGlmaWVkKHRydWUpOwotCQkJU3RyaW5nIGZpbGUgPSByZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQlpZiAoICFuZXdSZXNvdXJjZXMuY29udGFpbnMoZmlsZSkgKSB7Ci0JCQkJbmV3UmVzb3VyY2VzLmFkZChmaWxlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9nUmVtb3ZlZEVsZW1lbnRzKExpc3QgaXRlbXMpIHsKLQkJCi0JCWlmICggaXRlbXMgPT0gbnVsbCB8fCBpdGVtcy5zaXplKCkgPT0gMCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gcmVtb3ZlZCBlbGVtZW50cyBjYW4gYmUgcmVtb3ZlZCBmcm9tIGFueSBmZWF0dXJlCi0JCS8vIGNoZWNrIGlmIHRoZSBlbGVtZW50J3MgY29udGFpbmVyIGlzIG51bGwKLQkJLy8gaWYgaXMsIHRoZW4gdGhlIGVsZW1lbnQgaXMgZGVsZXRlZCBhbmQgdGhlIHJlc291cmNlIHNob3VsZCBiZSBkZWxldGVkCi0JCS8vIGFzIHdlbGwKLQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQlpZiAoIChlLmVDb250YWluZXIoKSA9PSBudWxsKSAmJiAhZGVsZXRlZEVsZW1lbnRzLmNvbnRhaW5zKGUpICkgewkJCQotCQkJCWRlbGV0ZWRFbGVtZW50cy5hZGQoZSk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldE1vZGlmaWVkKEVPYmplY3Qgb2JqKSB7Ci0JCWlmICggb2JqICE9IG51bGwgKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSBvYmouZVJlc291cmNlKCk7Ci0JCQlpZiAoIHJlcyAhPSBudWxsICkgewotCQkJCWlmICggIXJlcy5pc01vZGlmaWVkKCkgKSB7Ci0JCQkJCXJlcy5zZXRNb2RpZmllZCh0cnVlKTsJCQkJCi0JCQkJfQotLy8gfSBlbHNlIHsKLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTm8gcmVzb3VyY2UgZm9yICIgKyBvYmopOwotCQkJCQotCQkJCWlmIChkZWJ1ZyAmJiByZXMuaXNNb2RpZmllZCgpICkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vZGlmaWVkOiAiICsgcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRNb2RpZmllZFJlc291cmNlcyhNZXRob2RMaWJyYXJ5IGxpYikgewotCQkKLQkJLy8gYXZvaWQgdGhlIG5ld2x5IGFkZGVkIGVsZW1lbnQgcmVzb3VyY2VzCi0JCUxpc3QgbW9kaWZpZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlSZXNvdXJjZSByZXMgPSBsaWIuZVJlc291cmNlKCk7Ci0JCWlmICggcmVzICE9IG51bGwgKSB7Ci0JCQlSZXNvdXJjZVNldCByZXNTZXQgPSByZXMuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWZvciAoIEl0ZXJhdG9yIGl0ID0gcmVzU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJcmVzID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCByZXMgIT0gbnVsbCAmJiByZXMuaXNNb2RpZmllZCgpICkgewotCQkJCQlTdHJpbmcgZmlsZSA9IHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJaWYgKCBuZXdSZXNvdXJjZXMuY29udGFpbnMoZmlsZSkgKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgbW9kaWZpZWQ6ICIgKyBmaWxlKTsKLQkJCQkJfQkJCi0JCQkJCW1vZGlmaWVkTGlzdC5hZGQoZmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZExpc3Q7Ci0JfQotCi0JLy8gY2xlYXIgcmVzb3VyY2VzIGZvciBkZWxldGVkIGVsZW1lbnRzCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZVJlc29ydWNlcygpIHsKLQkJaWYgKCBkZWxldGVkRWxlbWVudHMuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGVsZXRlZEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkKLQkJCUVPYmplY3Qgb2JqID0gbnVsbDsKLQkJCWlmICggZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCApIHsKLQkJCQlvYmogPSAoKERlc2NyaWJhYmxlRWxlbWVudCllKS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCX0gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gKSB7Ci0JCQkJb2JqID0gZTsKLQkJCX0KLQkJCWlmICggb2JqICE9IG51bGwgKSB7Ci0JCQkJUmVzb3VyY2UgcmVzID0gb2JqLmVSZXNvdXJjZSgpOwotCQkJCWlmICggcmVzICE9IG51bGwgKSB7Ci0JCQkJCVN0cmluZyBmaWxlID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWxldGluZyByZXNvdXJjZTogIiArIGZpbGUpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoICFmaWxlTWdyLmRlbGV0ZShmaWxlKSApIHsKLQkJCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmFibGUgdG8gZGVsZXRlIGZpbGU6ICIgKyBmaWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0JCQkJCQkJCQotCQkJfQotCQl9Ci0JfQotCi0JCi0JcHVibGljIGNsYXNzIEVsZW1lbnRMaXN0RGlmZiB7Ci0KLQkJTGlzdCBuZXdJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBkZWxldGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvLyB1c2UgTGlua2VkSGFzaE1hcCB0byByZXNlcnZlIHRoZSBvcmRlciBvZiB0aGUgdmFsdWVzCi0JCU1hcCBvbGROZXdNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCi0JCS8vIHdpdGggdGhlIG9sZCBhbmQgbmV3IGxpc3Qgb2YgTWV0aG9kRWxlbWVudHMsCi0JCS8vIGZpbmQgdGhlIGNvbW1vbiBvbmVzLCB0aGUgZGVsZXRlZCBvbmVzLCBhbmQgdGhlIG5ldyBvbmVzCi0JCXB1YmxpYyBFbGVtZW50TGlzdERpZmYoTGlzdCBvbGRMaXN0LCBMaXN0IG5ld0xpc3QpIHsKLQkJCS8vIE1hcCBvbGRMaXN0R3VpZE1hcCA9IGdldEd1aWRNYXAob2xkTGlzdCk7Ci0JCQlNYXAgbmV3TGlzdEd1aWRNYXAgPSBnZXRHdWlkTWFwKG5ld0xpc3QpOwotCi0JCQluZXdJdGVtcy5hZGRBbGwobmV3TGlzdCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBvbGRMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBvbGRPYmogPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBvbGRPYmouZ2V0R3VpZCgpOwotCQkJCU9iamVjdCBuZXdPYmogPSBuZXdMaXN0R3VpZE1hcC5nZXQoZ3VpZCk7Ci0JCQkJaWYgKCBuZXdPYmogIT0gbnVsbCApIHsKLQkJCQkJb2xkTmV3TWFwLnB1dChvbGRPYmosIG5ld09iaik7Ci0JCQkJCW5ld0l0ZW1zLnJlbW92ZShuZXdPYmopOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBpdCdzIGJlZW4gZGVsZXRlZAotCQkJCQlkZWxldGVkSXRlbXMuYWRkKG9sZE9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBNYXAgZ2V0R3VpZE1hcChMaXN0IGl0ZW1zKSB7Ci0JCQlNYXAgbSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0PSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLQkJCQltLnB1dChlLmdldEd1aWQoKSwgZSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBtOwotCQl9Ci0JfQkKLQkKLQkvKioKLQkgKiBIYW5kbGVzIG5hbWUgcmVwbGFjZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZU5hbWVSZXBsYWNlKE1hcCByZW5hbWVFbGVtZW50TWFwKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gcmVuYW1lRWxlbWVudE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU9iamVjdFtdIHZhbCA9IChPYmplY3RbXSllbnRyeS5nZXRWYWx1ZSgpOwotCQkJCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgdmFsWzBdOwotCQkJU3RyaW5nIG5ld05hbWUgPSB2YWwubGVuZ3RoID09IDQgPyBlbGVtZW50LmdldEd1aWQoKSA6IChTdHJpbmcpIHZhbFsxXTsKLQkJCXJlbmFtZShlbGVtZW50LCBuZXdOYW1lKTsKLQkJCWlmICh2YWwubGVuZ3RoID09IDQpIHsKLQkJCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHZhbFsyXTsKLQkJCQluZXdOYW1lID0gKFN0cmluZykgdmFsWzNdOwotCQkJCXJlbmFtZShlbGVtZW50LCBuZXdOYW1lKTsKLQkJCQkKLQkJCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHZhbFswXTsKLQkJCQluZXdOYW1lID0gKFN0cmluZykgdmFsWzFdOwotCQkJCXJlbmFtZShlbGVtZW50LCBuZXdOYW1lKTsKLQkJCX0KLQkJfQotCQkKLQkJLy9NYWtlIHJlc291Y2VzIGRpcnR5IGFnYWluLCBhcyByZW5hbWUgcHJvY2VzcyB3b3VsZCBtYXJrIHJlc291Y2UgdW4tbW9kaWZpZWQKLQkJaXQgPSByZW5hbWVFbGVtZW50TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJT2JqZWN0W10gdmFsID0gKE9iamVjdFtdKWVudHJ5LmdldFZhbHVlKCk7CQkJCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgdmFsWzBdOwotCQkJZWxlbWVudC5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChuZXdOYW1lLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiB8fCBlbGVtZW50LmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCWVsZW1lbnQuc2V0TmFtZShuZXdOYW1lKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkKLQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJcHJvYy5zZXROYW1lKG5ld05hbWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJTGlicmFyeVZpZXcucnVuUmVuYW1lKGVsZW1lbnQsIG5ld05hbWUpOwotCQl9Ci0JfQotCQkKLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJTZXRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlTdHJpbmcgZ3VpZDAgPSAoKE1ldGhvZEVsZW1lbnQpbmV3VmFsdWUpLmdldEd1aWQoKTsKLQkJU3RyaW5nIGd1aWQxID0gZWxlbWVudC5nZXRHdWlkKCk7Ci0JCU9iamVjdFtdIHZhbCA9IG5ldyBPYmplY3RbM107Ci0JCXZhbFswXSA9IGZlYXR1cmU7Ci0JCXZhbFsxXSA9IG5ld1ZhbHVlOwotCQl2YWxbMl0gPSBlbGVtZW50OwotCQlpZiAoc2V0RWxlbWVudE1hcCA9PSBudWxsKSB7Ci0JCQlzZXRFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlzZXRFbGVtZW50TWFwLnB1dChlbGVtZW50LmdldE5hbWUoKSArIGd1aWQwICsgZ3VpZDEsIHZhbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZXRFbGVtZW50cygpIHsKLQkJaWYgKHNldEVsZW1lbnRNYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBzZXRFbGVtZW50TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJT2JqZWN0W10gdmFsID0gKE9iamVjdFtdKWVudHJ5LmdldFZhbHVlKCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHZhbFswXTsKLQkJCU1ldGhvZEVsZW1lbnQgbmV3VmFsdWUgPSAoTWV0aG9kRWxlbWVudCkgdmFsWzFdOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHZhbFsyXTsKLQkJCVN0cmluZyBndWlkID0gbmV3VmFsdWUuZ2V0R3VpZCgpOwotCQkJTWV0aG9kRWxlbWVudCBtZXJnZWRWYWx1ZSA9IChNZXRob2RFbGVtZW50KSByZXBsYWNlZEVsZW1lbnRNYXAuZ2V0KGd1aWQpOwotCQkJaWYgKG1lcmdlZFZhbHVlICE9IG51bGwgJiYgbWVyZ2VkVmFsdWUgIT0gbmV3VmFsdWUpIHsKLQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbWVyZ2VkVmFsdWUpOwotCQkJfQkJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyB1bmlxdWUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlVW5pcXVlTmFtZShFT2JqZWN0IG93bmVyLCBNZXRob2RFbGVtZW50IG5ld09iaiwgTWFwIHJlbmFtZUVsZW1lbnRNYXApIHsKLQkJaWYgKG93bmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlDbGFzcyBjbHMgPSBuZXdPYmouZ2V0Q2xhc3MoKTsKLQkJTWFwIG5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGkgPCBvd25lci5lQ29udGVudHMoKS5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9sZE9iaiA9IG93bmVyLmVDb250ZW50cygpLmdldChpKTsKLQkJCWlmIChvbGRPYmouZ2V0Q2xhc3MoKSA9PSBjbHMgJiYgb2xkT2JqICE9IG5ld09iaikgewotCQkJCU1ldGhvZEVsZW1lbnQgb2xkRWxlbSA9IChNZXRob2RFbGVtZW50KSBvbGRPYmo7Ci0JCQkJbmFtZU1hcC5wdXQob2xkRWxlbS5nZXROYW1lKCksIG9sZEVsZW0pOwotCQkJfQotCQl9Ci0JCVN0cmluZyBuYW1lID0gbmV3T2JqLmdldE5hbWUoKTsKLQkJU3RyaW5nIHJlbmFtZWQgPSBuYW1lOwotCQl3aGlsZSAobmFtZU1hcC5jb250YWluc0tleShyZW5hbWVkKSkgewotCQkJcmVuYW1lZCArPSAiX3JlbmFtZWQiOwotCQl9Ci0JCWlmIChyZW5hbWVkICE9IG5hbWUpIHsKLQkJCW5ld09iai5zZXROYW1lKHJlbmFtZWQpOwotCQkJCi0JCQlPYmplY3RbXSBlbnRyeVZhbCA9IG5ldyBPYmplY3RbNF07Ci0JCQllbnRyeVZhbFswXSA9IG5ld09iajsKLQkJCWVudHJ5VmFsWzFdID0gbmFtZTsKLQkJCWVudHJ5VmFsWzJdID0gbmFtZU1hcC5nZXQobmFtZSk7Ci0JCQllbnRyeVZhbFszXSA9IHJlbmFtZWQ7Ci0JCQlyZW5hbWVFbGVtZW50TWFwLnB1dChuZXdPYmouZ2V0R3VpZCgpLCBlbnRyeVZhbCk7CQkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlcyB1bmlxdWUgbmFtZSBmb3IgZXhpc3RpbmcgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlVW5pcXVlTmFtZUZvckV4aXN0aW5nRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSwgTWFwIHJlbmFtZUVsZW1lbnRNYXApIHsKLQkJRU9iamVjdCBlbGVtZW50T3duZXIgPSBlbGVtZW50LmVDb250YWluZXIoKTsJCQkJCQotCQlpZiAoZWxlbWVudE93bmVyICE9IG51bGwpIHsKLQkJCWVsZW1lbnQuc2V0TmFtZShuZXdOYW1lKTsKLQkJCWVuc3VyZVVuaXF1ZU5hbWUoZWxlbWVudE93bmVyLCBlbGVtZW50LCByZW5hbWVFbGVtZW50TWFwKTsKLQkJCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKG5ld05hbWUpKSB7CS8vaWYgaGFuZGxlZCB0aGVuIHJldHVybgotCQkJCXJldHVybjsKLQkJCX0JCQkKLQkJCWVsZW1lbnQuc2V0TmFtZShvbGROYW1lKTsKLQkJfQkJCQotCQlPYmplY3RbXSBlbnRyeVZhbCA9IG5ldyBPYmplY3RbMl07Ci0JCWVudHJ5VmFsWzBdID0gZWxlbWVudDsKLQkJZW50cnlWYWxbMV0gPSBuZXdOYW1lOwotCQlyZW5hbWVFbGVtZW50TWFwLnB1dChlbGVtZW50LmdldEd1aWQoKSwgZW50cnlWYWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja01vZGlmaWVkRmlsZXMoKSB7Ci0JCWZpbmFsIExpc3QgbW9kaWZpZWRGaWxlcyA9IGdldE1vZGlmaWVkUmVzb3VyY2VzKGJhc2VMaWJyYXJ5KTsKLQkJbW9kaWZpZWRGaWxlcy5hZGRBbGwocmVzU2Nhbm5lci5nZXRGaWxlc1RvYmVSZXBsYWNlZCgpKTsKLQkJbW9kaWZpZWRGaWxlcy5hZGRBbGwoZGlhZ3JhbUhhbmRsZXIuZ2V0TW9kaWZpZWRGaWxlcygpKTsKLQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlci5jaGVja01vZGlmeShtb2RpZmllZEZpbGVzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1BsdWdpbkltcG9ydERhdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9QbHVnaW5JbXBvcnREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0OWUyYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1BsdWdpbkltcG9ydERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTGlicmFyeUxvY2F0aW9uRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgdGhlIGlucHV0IGRhdGEgcmVxdWlyZWQgdG8gaW1wb3J0IGEgbWV0aG9kIHBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5JbXBvcnREYXRhIHsKLQotCS8vIHRoZXNlIGFyZSBzZXQgYnkgdGhlIHdpemFyZAotCXB1YmxpYyBMaWJyYXJ5TG9jYXRpb25EYXRhIGxsRGF0YSA9IG5ldyBMaWJyYXJ5TG9jYXRpb25EYXRhKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBkZWxldGVFeGlzdGluZ1BsdWdpbnM7Ci0KLQkvLyB0aGVzZSBhcmUgZmlsbGVkIGluIGJ5IHRoZSBpbXBvcnRpbmcgc2VydmljZQotCXB1YmxpYyBTdHJpbmcgbGlicmFyeVZlcnNpb247Ci0KLQlwcml2YXRlIExpc3QgcGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgTGlzdCBjb25maWdzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBFcnJvckluZm8gZXJyb3IgPSBuZXcgRXJyb3JJbmZvKCk7Ci0KLQkvLyBhcCB0aGUgZ3VpZCB0byB1cmwgZm9yIGJhc2UgcGx1Z2luLCB0aGlzIGlzIHRoZSBvbmx5IGZvcm1hdGlvbiBhdmFpbGFibGUKLQlwdWJsaWMgTWFwIGJhc2VQbHVnaW5VcmxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luSW1wb3J0RGF0YSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGNvbnRlbnRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlwbHVnaW5zLmNsZWFyKCk7Ci0JCWNvbmZpZ3MuY2xlYXIoKTsKLQkJZXJyb3IuZXJyb3JNZXNzYWdlLnNldExlbmd0aCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIHBsdWdpbnMuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVQbHVnaW5zKCkgewotCQlQbHVnaW5JbmZvIGluZm87Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBwbHVnaW5zLnNpemUoKSkgewotCQkJaW5mbyA9IChQbHVnaW5JbmZvKSBwbHVnaW5zLmdldChpKTsKLQkJCWlmIChpbmZvLnVybCA9PSBudWxsKSB7Ci0JCQkJcGx1Z2lucy5yZW1vdmUoaSk7Ci0JCQl9IGVsc2UgewotCQkJCWkrKzsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBQbHVnaW5JbmZvIG9iamVjdCBnaXZlbiB0aGUgZ3VpZC4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luSW5mbyBnZXRQbHVnaW5JbmZvKFN0cmluZyBndWlkKSB7Ci0JCVBsdWdpbkluZm8gaW5mbzsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJaW5mbyA9IChQbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoaW5mby5ndWlkLmVxdWFscyhndWlkKSkgewotCQkJCXJldHVybiBpbmZvOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIFBsdWdpbkluZm8gb2JqZWN0IGdpdmVuIHRoZSBndWlkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBsdWdpbkluZm8oU3RyaW5nIGd1aWQpIHsKLQkJUGx1Z2luSW5mbyBpbmZvOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlpbmZvID0gKFBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChpbmZvLmd1aWQuZXF1YWxzKGd1aWQpKSB7Ci0JCQkJcGx1Z2lucy5yZW1vdmUoaW5mbyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBDb25maWd1YXJhdGlvbkluZm8gb2JqZWN0IGdpdmVuIHRoZSBndWlkLgotCSAqLwotCXB1YmxpYyBDb25maWd1YXJhdGlvbkluZm8gZ2V0Q29uZmlnSW5mbyhTdHJpbmcgZ3VpZCkgewotCi0JCWlmICggZ3VpZCA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gY2luZm87Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBnZXRDb25maWdzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJY2luZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChndWlkLmVxdWFscyhjaW5mby5ndWlkKSApIHsKLQkJCQlyZXR1cm4gY2luZm87Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvKioKLQkgKiByZXR1cm4gYSBsaXN0IG9mIFBsdWdpbkluZm8gb2JqZWN0Ci0JICogCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBQbHVnaW5JbmZvIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQbHVnaW5zKCkgewotCQlyZXR1cm4gcGx1Z2luczsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gYSBsaXN0IG9mIENvbmZpZ0luZm8gb2JqZWN0cwotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldENvbmZpZ3MoKSB7Ci0JCXJldHVybiBjb25maWdzOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZSBpZiBhbnkKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBFcnJvckluZm8gZ2V0RXJyb3JJbmZvKCkgewotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JcHVibGljIGNsYXNzIFBsdWdpbkluZm8gewotCi0JCS8vIElmIG5vdCBudWxsLCB0aGlzIGlzIGEgdmFsaWQgcGx1Zy1pbi4KLQkJcHVibGljIFN0cmluZyB1cmwgPSBudWxsOwotCi0JCXB1YmxpYyBTdHJpbmcgbmFtZTsKLQotCQlwdWJsaWMgU3RyaW5nIGd1aWQ7Ci0KLQkJcHVibGljIFN0cmluZyB2ZXJzaW9uOwotCi0JCXB1YmxpYyBTdHJpbmcgYnJpZWZfZGVzYzsKLQotCQlwdWJsaWMgU3RyaW5nIGF1dGhvcnM7Ci0KLQkJcHVibGljIFN0cmluZyBjaGFuZ2VEYXRlOwotCi0JCXB1YmxpYyBMaXN0IHVzZWRQbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIElmIG51bGwsIHRoaXMgcGx1Zy1pbiBkb2VzIG5vdCBleGlzdHMgaW4gdGhlIGN1cnJlbnQgbGlicmFyeS4KLQkJcHVibGljIE1ldGhvZFBsdWdpbiBleGlzdGluZ1BsdWdpbiA9IG51bGw7Ci0KLQkJLy8gSWYgdHJ1ZSwgcmVwbGFjZSB0aGUgY3VycmVudCBwbHVnLWluIHdpdGggdGhlIG9uZSBpbiB0aGUgaW1wb3J0Ci0JCS8vIGxpYnJhcnkuIElmIGZhbHNlLCBkb24ndCBpbXBvcnQgdGhlIHBsdWctaW4uCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdGVkID0gZmFsc2U7Ci0KLQkJcHVibGljIFBsdWdpbkluZm8oKSB7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQ29uZmlndWFyYXRpb25JbmZvIHsKLQotCQlwdWJsaWMgU3RyaW5nIG5hbWU7Ci0KLQkJcHVibGljIFN0cmluZyBndWlkOwotCi0JCXB1YmxpYyBTdHJpbmcgdmVyc2lvbjsKLQotCQkvLyBUaGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotCQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBleGlzdGluZ0NvbmZpZyA9IG51bGw7Ci0KLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0ZWQgPSB0cnVlOwotCi0JCXB1YmxpYyBDb25maWd1YXJhdGlvbkluZm8oKSB7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBjbGFzcyBFcnJvckluZm8gewotCi0JCXByaXZhdGUgU3RyaW5nQnVmZmVyIGVycm9yTWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlwdWJsaWMgRXJyb3JJbmZvKCkgewotCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCQkJZXJyb3JNZXNzYWdlLmFwcGVuZChtZXNzYWdlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3IoKSB7Ci0JCQlyZXR1cm4gZXJyb3JNZXNzYWdlLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCWVycm9yTWVzc2FnZS5zZXRMZW5ndGgoMCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUGx1Z2luSW1wb3J0aW5nU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMGY4YzFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuTGlicmFyeURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVwZ3JhZGVDYWxsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogSW1wb3J0cyBhIG1ldGhvZCBwbHVnLWluIGludG8gdGhlIGN1cnJlbnQgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIHsKLQotCXByaXZhdGUgVXBncmFkZUNhbGxlckluZm8gdXBHcmFkZUluZm87Ci0JCi0JLy9UZW1wIGZsYWcgaW5kaWNhdGluZyB1c2Ugb2YgdGhlIG5ldyBtZXJnZSBzY2hlbWUKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG5ld01lcmdlU2NoZW1lID0gdHJ1ZTsgCi0JCi0JcHJpdmF0ZSBQbHVnaW5JbXBvcnREYXRhIGRhdGE7Ci0KLQlMaWJyYXJ5RG9jdW1lbnQgaW1wb3J0aW5nTGliRG9jOwotCUxpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2M7Ci0KLQkvLyBGbGFnIHRvIGluZGljYXRlIHRoZSBmaWxlIGNoZWNrb3V0IHN0YXR1cy4KLQlJU3RhdHVzIGZpbGVDaGVja2VkT3V0U3RhdHVzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBsdWdpbkltcG9ydGluZ1NlcnZpY2UoUGx1Z2luSW1wb3J0RGF0YSBkYXRhKSB7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBwbHVnLWluIGFnYWluc3QgdGhlIGN1cnJlbnQgbGlicmFyeSwgY29sbGVjdHMgYWxsIHRoZQotCSAqIGluZm9ybWF0aW9ucyBpbmNsdWRpbmcgcGx1Zy1pbiBpbmZvLCBjb25maWd1YXRpb24gaW5mbyBhbmQgZXJyb3IgaW5mby4KLQkgKiBDYWxsIHRoaXMgbWV0aG9kLCB0aGVuIGNhbGwgZ2V0RXJyb3IoKSwgZ2V0UGx1Z2lucygpLCBnZXRDb25maWdzKCkuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5zZXRUYXNrTmFtZShJbXBvcnRSZXNvdXJjZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cwKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAodGhpcy5kYXRhID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXRoaXMuZGF0YS5jbGVhcigpOwotCi0JCQkvLyBQcmVwYXJlIHRoZSBsaWIgZmlsZXMuCi0JCQlGaWxlIGltcG9ydGluZ0xpYlBhdGggPSBuZXcgRmlsZShkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKQotCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgTGlicmFyeURvY3VtZW50LmV4cG9ydEZpbGUpOwotCQkJaWYgKCFpbXBvcnRpbmdMaWJQYXRoLmV4aXN0cygpKSB7Ci0JCQkJZGF0YQotCQkJCQkJLmdldEVycm9ySW5mbygpCi0JCQkJCQkuYWRkRXJyb3IoCi0JCQkJCQkJCU5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzEsIGltcG9ydGluZ0xpYlBhdGgudG9TdHJpbmcoKSkpOyAKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWJvb2xlYW4gaGFuZGxlVmVyc2lvbiA9IHRydWU7Ci0JCQlpZiAoaGFuZGxlVmVyc2lvbikgewotCQkJCXVwR3JhZGVJbmZvID0gbmV3IENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLlVwZ3JhZGVJbmZvKFVwZ3JhZGVDYWxsZXJJbmZvLnVwZ3JhZGVJbXBvcnRQbHVnaW4sIGltcG9ydGluZ0xpYlBhdGgpOwotCQkJCWlmICghIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLmhhbmRsZVRvb2xWZXJzaW9uKGltcG9ydGluZ0xpYlBhdGgsIHVwR3JhZGVJbmZvKSkgewotCQkJCQlkYXRhCi0JCQkJCS5nZXRFcnJvckluZm8oKQotCQkJCQkuYWRkRXJyb3IoCi0JCQkJCQkJTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW4sIGltcG9ydGluZ0xpYlBhdGgudG9TdHJpbmcoKSkpOyAKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAodXBHcmFkZUluZm8uZ2V0Q29waWVkTGliRmlsZSgpICE9IG51bGwpIHsKLQkJCQkJaW1wb3J0aW5nTGliUGF0aCA9IHVwR3JhZGVJbmZvLmdldENvcGllZExpYkZpbGUoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyB2ZXJzaW9uRXJyb3IgPSBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS52ZXJzaW9uQ2hlY2soaW1wb3J0aW5nTGliUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSwgCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZSk7Ci0JCQkJaWYgKHZlcnNpb25FcnJvciAhPSBudWxsKSB7Ci0JCQkJCWRhdGEuZ2V0RXJyb3JJbmZvKCkuYWRkRXJyb3IodmVyc2lvbkVycm9yKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJaW1wb3J0aW5nTGliRG9jID0gbmV3IExpYnJhcnlEb2N1bWVudChpbXBvcnRpbmdMaWJQYXRoKTsKLQkJCQotCQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkudG9GaWxlU3RyaW5nKCkpOwotCQkJdGFyZ2V0TGliRG9jID0gbmV3IExpYnJhcnlEb2N1bWVudChsaWJGaWxlKTsKLQotCQkJc2NhbkxpYnJhcnlGaWxlKGltcG9ydGluZ0xpYkRvYyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIGltcG9ydC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtSW1wb3J0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gbmVlZCB0byBkaXNhYmxlIHRoZSB3b3Jrc3BhY2UgcmVmcmVzaGluZwotCQlib29sZWFuIHJlZnJlc2ggPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIGRpc2FibGUgcmVzb3VyY2UgcmVmcmVzaGluZyBkdXJpbmcgaW1wb3J0Ci0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCV9fZG9JbXBvcnQobW9uaXRvcik7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZWZyZXNoKSB7Ci0JCQkJLy8gcmUtZW5hYmxlIHJlc291cmNlIHJlZnJlc2hpbmcKLQkJCQkvLwotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQkJaWYgKHVwR3JhZGVJbmZvICE9IG51bGwpIHsKLQkJCQl1cEdyYWRlSW5mby5yZW1vdmVDb3BpZWRMaWJyYXJ5KCk7Ci0JCQkJdXBHcmFkZUluZm8gPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9fZG9JbXBvcnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5zZXRUYXNrTmFtZShJbXBvcnRSZXNvdXJjZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0czKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlMaXN0IHVubG9ja2VkUGx1Z2lucyA9IHVubG9ja1BsdWdpbnMoKTsKLQotCQkJLy8gVG8gaW1wb3J0IHRoZSBwbHVnLWlucywgd2UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nOgotCQkJLy8gMS4gRGVsZXRlIHRoZSBwbHVnLWlucyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5IGlmIHVzZXIgc3BlY2lmeQotCQkJLy8gcmVtb3ZlCi0JCQkvLyAyLiBDb3B5IHRoZSBzZWxlY3RlZCBwbHVnaW4gZmlsZXMgdG8gdGhlIGRlc3RpbmF0aW9uCi0JCQkvLyAzLiBVcGRhdGUgdGhlIGxpYnJhcnkueG1pCi0JCQkvLyA0LiBSZWxvYWQgdGhlIGxpYnJhcnkKLQkJCQotCQkJRmlsZSBsaWJGaWxlID0gdGFyZ2V0TGliRG9jLmdldEZpbGUoKTsKLQkJCQotCQkJaWYgKG5ld01lcmdlU2NoZW1lKSB7CQkJCi0JCQkJbWVyZ2UodGFyZ2V0TGliRG9jKTsKLQkJCQlpZiAodW5sb2NrZWRQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCQkJbG9ja1VubG9ja2VkUGx1Z2lucyh1bmxvY2tlZFBsdWdpbnMpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJfQotCQkJCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCVJlc291cmNlVXRpbC5yZWZyZXNoUmVzb3VyY2VzKGxpYiwgbW9uaXRvcik7Ci0JCQkJcmV0dXJuOwotCQkJfQkJCQotCi0JCQkvLyAvLyBSZW1vdmUgZXhpc3RpbmcgZW50cmllcy4KLQkJCS8vIHJlbW92ZUV4aXN0aW5nRW50cmllcyh0YXJnZXRMaWJEb2MpOwotCi0JCQkvLyBJbXBvcnQgZW50cmllcyBhbmQgY29weSBmaWxlcy4KLQkJCWlmIChpbXBvcnRFbnRyaWVzKHRhcmdldExpYkRvYykpIHsKLQkJCQkvLyBTYXZlIHRoZSB1cGRhdGVkIGxpYnJhcnkgZmlsZS4KLQkJCQl0YXJnZXRMaWJEb2Muc2F2ZSgpOwotCi0JCQkJLy8gUmVwbGFjZSB0aGUgZ3VpZCBvZiB0aGUgb2xkIE1ldGhvZExpYnJhcnkgd2l0aCB0aGUgbmV3IG9uZS4KLQkJCQlmaXhMaWJyYXJ5R3VpZChsaWJGaWxlLmdldFBhcmVudEZpbGUoKSwgaW1wb3J0aW5nTGliRG9jCi0JCQkJCQkuZ2V0TGlicmFyeUd1aWQoKSwgdGFyZ2V0TGliRG9jLmdldExpYnJhcnlHdWlkKCkpOwotCi0JCQkJLy8gUmVvcGVuIHRoZSBsaWJyYXJ5LgotCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQotCQkJCS8vIEZpbmFsbHksIHJlLWxvY2sgdGhlIHVubG9ja2VkIHBsdWdpbnMgYW5kIHNhdmUgdGhlIGxpYnJhcnkKLQkJCQkvLyBhZ2Fpbi4KLQkJCQlpZiAodW5sb2NrZWRQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCQkJbG9ja1VubG9ja2VkUGx1Z2lucyh1bmxvY2tlZFBsdWdpbnMpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmUtb3BlbiBsaWJyYXJ5IGFuZCBmcmVzaCB0aGUgd29ya3NwYWNlLgotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQkvLyByZWZyZXNoIGxpYnJhcnkgZmlsZXMgaW4gd29ya3NwYWNlCi0JCQkvLwotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhsaWIsIG1vbml0b3IpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IHVubG9ja1BsdWdpbnMoKSB7Ci0KLQkJTGlzdCBwbHVnaW5JZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm87Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKChpbmZvLmV4aXN0aW5nUGx1Z2luICE9IG51bGwpICYmIGluZm8uc2VsZWN0ZWQpIHsKLQkJCQlpZiAoaW5mby5leGlzdGluZ1BsdWdpbi5nZXRVc2VyQ2hhbmdlYWJsZSgpLmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSB7Ci0JCQkJCWluZm8uZXhpc3RpbmdQbHVnaW4uc2V0VXNlckNoYW5nZWFibGUobmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkJCQlwbHVnaW5JZHMuYWRkKGluZm8uZXhpc3RpbmdQbHVnaW4uZ2V0R3VpZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGx1Z2luSWRzOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2NrVW5sb2NrZWRQbHVnaW5zKExpc3QgdW5sb2NrZWRQbHVnaW5zKSB7Ci0JCUxpc3QgcGx1Z2lucyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKQotCQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlpZiAodW5sb2NrZWRQbHVnaW5zLmNvbnRhaW5zKHBsdWdpbi5nZXRHdWlkKCkpKSB7Ci0JCQkJcGx1Z2luLnNldFVzZXJDaGFuZ2VhYmxlKG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW1wb3J0RW50cmllcyhMaWJyYXJ5RG9jdW1lbnQgdGFyZ2V0TGliRG9jKSB7Ci0JCS8vIDEuIEZpbmQgdGhlIGVudHJpZXMgdG8gYmUgcmVtb3ZlZC4KLQkJTGlzdCBpbXBvcnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJaWYgKGluZm8uZXhpc3RpbmdQbHVnaW4gPT0gbnVsbCkgewotCQkJCQluZXdMaXN0LmFkZChpbmZvLmd1aWQpOwotCQkJCX0KLQotCQkJCWltcG9ydExpc3QuYWRkKGluZm8uZ3VpZCk7Ci0JCQl9Ci0JCX0KLQotCQlQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbyBjaW5mbzsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0Q29uZmlncygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWNpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoY2luZm8uc2VsZWN0ZWQpIHsKLQkJCQlpZiAoY2luZm8uZXhpc3RpbmdDb25maWcgPT0gbnVsbCkgewotCQkJCQluZXdMaXN0LmFkZChjaW5mby5ndWlkKTsKLQkJCQl9Ci0KLQkJCQlpbXBvcnRMaXN0LmFkZChjaW5mby5ndWlkKTsKLQotCQkJfQotCQl9Ci0KLQkJLy8gMi4gSXRlcmF0ZSB0aGUgZG9jdWVtbnQgYW5kIGFkZCB0aGUgbmV3IGVudHJpZXMuCi0JCWlmICghbmV3TWVyZ2VTY2hlbWUpIHsKLQkJCWltcG9ydExpYkVudHJpZXModGFyZ2V0TGliRG9jLCBuZXdMaXN0KTsKLQkJfSBlbHNlIHsKLQkJCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJZW5zdXJlVW5pcXVlTmFtZXMobGliLmdldE1ldGhvZFBsdWdpbnMoKSk7Ci0JCQllbnN1cmVVbmlxdWVOYW1lcyhsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjb3B5RmlsZXModGFyZ2V0TGliRG9jLCBpbXBvcnRMaXN0LCBuZXdMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW1wb3J0TGliRW50cmllcyhMaWJyYXJ5RG9jdW1lbnQgdGFyZ2V0TGliRG9jLCBMaXN0IG5ld0xpc3QpIHsKLQotCQlpZiAobmV3TGlzdCA9PSBudWxsIHx8IG5ld0xpc3Quc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEFkZCBwbHVnLWlucy4KLQkJTm9kZUxpc3Qgbm9kZXMgPSBpbXBvcnRpbmdMaWJEb2MuZ2V0UGx1Z2lucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBMaWJyYXJ5RG9jdW1lbnQuZ2V0R3VpZChub2RlKTsKLQkJCWlmIChuZXdMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJdGFyZ2V0TGliRG9jLmFkZFBsdWdpbihub2RlKTsKLQkJCX0KLQkJfQotCi0JCS8vIEFkZCBjb25maWd1cmF0aW9ucy4KLQkJbm9kZXMgPSBpbXBvcnRpbmdMaWJEb2MuZ2V0Q29uZmlndXJhdGlvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gTGlicmFyeURvY3VtZW50LmdldEd1aWQobm9kZSk7Ci0JCQlpZiAobmV3TGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCXRhcmdldExpYkRvYy5hZGRDb25maWd1cmF0aW9uKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIHJlc291cmNlIGVudHJpZXMKLQkJbm9kZXMgPSBpbXBvcnRpbmdMaWJEb2MuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9pZCk7Ci0JCQlpZiAobmV3TGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCXRhcmdldExpYkRvYy5hZGRSZXNvdXJjZShub2RlKTsKLQkJCX0KLQkJfQotCi0JCS8vIEFkZCB0aGUgcmVzb3VyY2Ugc3ViIG1hbmFnZXJzLgotCQlub2RlcyA9IGltcG9ydGluZ0xpYkRvYy5nZXRSZXNvdXJjZVN1Yk1hbmFnZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IExpYnJhcnlEb2N1bWVudC5nZXRTdWJNYW5hZ2VyQmFzZUd1aWQobm9kZQotCQkJCQkuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2hyZWYpKTsKLQkJCWlmIChuZXdMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJdGFyZ2V0TGliRG9jLmFkZFJlc291cmNlKG5vZGUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29weUZpbGVzKExpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2MsIExpc3QgaW1wb3J0TGlzdCwKLQkJCUxpc3QgbmV3TGlzdCkgewotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBpbXBvcnRMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJU3RyaW5nIHNyY191cmkgPSBpbXBvcnRpbmdMaWJEb2MuZ2V0UmVzb3VyY2VVcmkoZ3VpZCk7Ci0JCQlTdHJpbmcgdGFyZ2V0X3VyaTsKLQkJCWlmIChzcmNfdXJpID09IG51bGwgfHwgc3JjX3VyaS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXRhcmdldF91cmkgPSBzcmNfdXJpOwotCQkJLyoKLQkJCWlmIChuZXdMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJdGFyZ2V0X3VyaSA9IHNyY191cmk7Ci0JCQl9IGVsc2UgewotCQkJCXRhcmdldF91cmkgPSB0YXJnZXRMaWJEb2MuZ2V0UmVzb3VyY2VVcmkoZ3VpZCk7IC8vIHRoZSByZXNvdXJjZQotCQkJCS8vIG1pZ2h0IGJlCi0JCQkJLy8gcmVuYW1lZAotCQkJfQotCQkJKi8KLQotCQkJLy8gQ2hlY2sgdGhlIHBsdWdpbi54bWkgZmlsZS4gSWYgaXQgZXhpc3RzLCBjb3B5IHRoZSBmb2xkZXIgdG8KLQkJCS8vIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0JCQlmaW5hbCBGaWxlIHNyY19maWxlID0gaW1wb3J0aW5nTGliRG9jLmdldEZpbGVGcm9tVXJpKHNyY191cmkpOwotCQkJaWYgKHNyY19maWxlLmV4aXN0cygpKSB7Ci0JCQkJZmluYWwgRmlsZSB0YXJnZXRfZmlsZSA9IHRhcmdldExpYkRvYwotCQkJCQkJLmdldEZpbGVGcm9tVXJpKHRhcmdldF91cmkpOwotCi0JCQkJLy8gaWYgaXQncyBhIGNvbmZpZ3VyYXRpb24sIG9ubHkgY29weSB0aGUgZmlsZSwKLQkJCQkvLyBpZiBpdCdzIGEgcGx1Z2luLCBjb3B5IHRoZSB3aG9sZSBkaXJlY3RvcnkKLQotCQkJCWlmIChkYXRhLmdldFBsdWdpbkluZm8oZ3VpZCkgIT0gbnVsbCkgewotCQkJCQlpZiAodGFyZ2V0X2ZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCURpckNvcHkgY29weSA9IG5ldyBEaXJDb3B5KHNyY19maWxlCi0JCQkJCQkJCQkJLmdldFBhcmVudEZpbGUoKSwgdGFyZ2V0X2ZpbGUKLQkJCQkJCQkJCQkuZ2V0UGFyZW50RmlsZSgpKTsKLQkJCQkJCQkJZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBjb3B5LmV4ZWN1dGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvcHlEaXIoc3JjX2ZpbGUuZ2V0UGFyZW50RmlsZSgpLCB0YXJnZXRfZmlsZQotCQkJCQkJCQkuZ2V0UGFyZW50RmlsZSgpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZGF0YS5nZXRDb25maWdJbmZvKGd1aWQpICE9IG51bGwgJiYgRGlyQ29weS5uZWVkQ29weShzcmNfZmlsZSwgdGFyZ2V0X2ZpbGUpKSB7Ci0JCQkJCWZpbmFsIExpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmICh0YXJnZXRfZmlsZS5leGlzdHMoKSkgewotCQkJCQkJZmlsZXMuYWRkKHRhcmdldF9maWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCWZpbGVDaGVja2VkT3V0U3RhdHVzID0gRmlsZU1vZGlmeUNoZWNrZXIKLQkJCQkJCQkJCQkuY2hlY2tNb2RpZnkoZmlsZXMpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGZpbGVDaGVja2VkT3V0U3RhdHVzID09IG51bGwKLQkJCQkJCQl8fCBmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCVJlc291cmNlSGVscGVyLmNvcHlGaWxlKHNyY19maWxlLCB0YXJnZXRfZmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoKGZpbGVDaGVja2VkT3V0U3RhdHVzICE9IG51bGwpCi0JCQkJCQkmJiAhZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpKSB7Ci0JCQkJCS8vIGxvZyBlcnJvcgotCQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJU3RyaW5nIHRpdGxlID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgbXNnID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW47IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQluZXcgTXNnRGlhbG9nKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csCi0JCQkJCQkJCQkJCWZpbGVDaGVja2VkT3V0U3RhdHVzKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBkaXJlY3RvcmllcyBmcm9tICJmcm9tRGlyIiB0byAidG9EaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyKEZpbGUgZnJvbURpciwgRmlsZSB0b0RpcikgewotCQlDb3B5IGNwID0gbmV3IENvcHkoKTsKLQkJY3Auc2V0T3ZlcndyaXRlKHRydWUpOwotCQlGaWxlU2V0IHNldCA9IG5ldyBGaWxlU2V0KCk7Ci0JCXNldC5zZXRFeGNsdWRlcyhDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZS5leGNsdWRlcyk7Ci0JCXNldC5zZXREaXIoZnJvbURpcik7Ci0JCWNwLmFkZEZpbGVzZXQoc2V0KTsKLQkJY3Auc2V0VG9kaXIodG9EaXIpOwotCQljcC5zZXRQcm9qZWN0KG5ldyBQcm9qZWN0KCkpOwotCQljcC5leGVjdXRlKCk7Ci0KLQl9Ci0KLQkvLyAvKioKLQkvLyAqIHJlbW92ZSB0aGUgcGx1Z2luIGVudHJ5IGZyb20gdGhlIGxpYnJhcnkgZG9jdW1lbnQKLQkvLyAqCi0JLy8gKiBAcGFyYW0gZG9jdW1lbnQKLQkvLyAqIExpYnJhcnlEb2N1bWVudAotCS8vICogQHBhcmFtIGd1aWQKLQkvLyAqIFN0cmluZyBndWlkIG9mIHRoZSBwbHVnaW4KLQkvLyAqLwotCS8vIHByaXZhdGUgdm9pZCByZW1vdmVFeGlzdGluZ0VudHJpZXMoTGlicmFyeURvY3VtZW50IGRvY3VtZW50KSB7Ci0JLy8gLy8gMS4gRmluZCB0aGUgZW50cmllcyB0byBiZSByZW1vdmVkLgotCS8vIExpc3QgcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbzsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCS8vIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JLy8gaWYgKChpbmZvLmV4aXN0aW5nUGx1Z2luICE9IG51bGwpICYmIGluZm8uc2VsZWN0ZWQpIHsKLQkvLyByZW1vdmVMaXN0LmFkZChpbmZvLmd1aWQpOwotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLyBQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbyBjaW5mbzsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRDb25maWdzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCS8vIGNpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvKSBpdC5uZXh0KCk7Ci0JLy8gaWYgKChjaW5mby5leGlzdGluZ0NvbmZpZyAhPSBudWxsKSAmJiBjaW5mby5zZWxlY3RlZCkgewotCS8vIHJlbW92ZUxpc3QuYWRkKGNpbmZvLmd1aWQpOwotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLyAvLyAyLiBJdGVyYXRlIHRoZSBkb2N1ZW1udCBhbmQgcmVtb3ZlIHRoZSBlbnRyaWVzLgotCS8vIGRvY3VtZW50LnJlbW92ZVBsdWdpbnMocmVtb3ZlTGlzdCk7Ci0JLy8gZG9jdW1lbnQucmVtb3ZlQ29uZmlndXJhdGlvbnMocmVtb3ZlTGlzdCk7Ci0JLy8gZG9jdW1lbnQucmVtb3ZlUmVzb3VyY2VFbnRyaWVzKHJlbW92ZUxpc3QpOwotCS8vIH0KLQotCSAvKiogCi0JICAqIFZhbGlkYXRlcyBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB2YWxpZGF0ZVNlbGVjdGlvbigpIHsKLQkJZGF0YS5nZXRFcnJvckluZm8oKS5jbGVhcigpOwotCi0JCS8vIEl0ZXJhdGUgdGhlIG5ldyBwbHVnaW5zLCBtYWtlIHN1cmUgdGhlIGJhc2UgaXMgaW5jbHVkZWQKLQkJLy8gZWl0aGVyIGFzIGFuIGltcG9ydGluZyBwbHVnaW4sIG9yIGlzIGluIHRoZSBjdXJyZW50IGxpYnJhcnkKLQkJLy8gZ2V0IHRoZSBtZXRob2QgcGx1Z2lucyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5LgotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCUxpc3QgcGx1Z2lucyA9IChsaWJyYXJ5ID09IG51bGwpID8gbmV3IEFycmF5TGlzdCgpIDogbGlicmFyeQotCQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCU1hcCBwbHVnaW5pZHMgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJcGx1Z2luaWRzLnB1dChwbHVnaW4uZ2V0R3VpZCgpLCBwbHVnaW4pOwotCQl9Ci0KLQkJLy8gVGhlIGJhc2UgcGx1Zy1pbnMgTVVTVCBiZSBlaXRoZXIgYSBzZWxlY3RlZCBvbmUgb3IgYW4gZXhpc3Rpbmcgb25lCi0JCS8vIG90aGVyd2lzZSwgY2FuJ3QgaW1wb3J0Ci0JCVNldCBiYXNlUGx1Z2lucyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJU2V0IG5ld1BsdWdpbnMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdAotCQkJCQkubmV4dCgpOwotCQkJaWYgKGluZm8uc2VsZWN0ZWQgJiYgKGluZm8uZXhpc3RpbmdQbHVnaW4gPT0gbnVsbCkpIHsKLQkJCQluZXdQbHVnaW5zLmFkZChpbmZvLmd1aWQpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRiID0gaW5mby51c2VkUGx1Z2lucy5pdGVyYXRvcigpOyBpdGIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgYmFzZSA9IGl0Yi5uZXh0KCk7Ci0JCQkJCWlmICghYmFzZVBsdWdpbnMuY29udGFpbnMoYmFzZSkpIHsKLQkJCQkJCWJhc2VQbHVnaW5zLmFkZChiYXNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChuZXdQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBiYXNlUGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIHVyaSA9IChTdHJpbmcpIGRhdGEuYmFzZVBsdWdpblVybE1hcC5nZXQoZ3VpZCk7Ci0JCQkJaWYgKCFuZXdQbHVnaW5zLmNvbnRhaW5zKGd1aWQpICYmICFwbHVnaW5pZHMuY29udGFpbnNLZXkoZ3VpZCkpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2U7Ci0JCQkJCWlmICh1cmkgIT0gbnVsbCAmJiB1cmkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQltZXNzYWdlID0gTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNSwgdXJpKTsgCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGd1aWRUb1BsdWdOYW1lTWFwID0gaW1wb3J0aW5nTGliRG9jLmdldEd1aWRUb1BsdWdOYW1lTWFwKCk7Ci0JCQkJCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGd1aWRUb1BsdWdOYW1lTWFwID09IG51bGwgPyBudWxsIDogZ3VpZFRvUGx1Z05hbWVNYXAuZ2V0KGd1aWQpOwotCQkJCQkJaWYgKHBsdWdpbk5hbWUgPT0gbnVsbCB8fCBwbHVnaW5OYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQltZXNzYWdlID0gSW1wb3J0UmVzb3VyY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNjsgCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCW1lc3NhZ2UgPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c1LCAKLQkJCQkJCQkJCXBsdWdpbk5hbWUgKyAiLCAiICsgZ3VpZCk7IAkJLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWRhdGEuZ2V0RXJyb3JJbmZvKCkuYWRkRXJyb3IobWVzc2FnZSk7Ci0KLQkJCQkJaWYgKHVyaSA9PSBudWxsIHx8IHVyaS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBkYXRhLmdldEVycm9ySW5mbygpLmdldEVycm9yKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNjYW5MaWJyYXJ5RmlsZShMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdmlzaXRMaWJUYWcoZG9jdW1lbnQpOwotCQl2aXNpdFJlc291cmNlVGFnKGRvY3VtZW50KTsKLQkJZGF0YS52YWxpZGF0ZVBsdWdpbnMoKTsKLQotCQkvLyBDaGVjayBiYXNlIHBsdWctaW4gZGVwZW5kZW5jaWVzLgotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdAotCQkJCQkubmV4dCgpOwotCQkJaWYgKGluZm8uZXhpc3RpbmdQbHVnaW4gPT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRiYXNlID0gaW5mby51c2VkUGx1Z2lucy5pdGVyYXRvcigpOyBpdGJhc2UKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgaXRiYXNlLm5leHQoKTsKLQkJCQkJaWYgKCFkYXRhLmJhc2VQbHVnaW5VcmxNYXAuY29udGFpbnNLZXkoZ3VpZCkpIHsKLQkJCQkJCWRhdGEuYmFzZVBsdWdpblVybE1hcC5wdXQoZ3VpZCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmlzaXRMaWJUYWcoTGlicmFyeURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIFJlbG9hZCB0aGUgZWxlbWVudCBtYXBwaW5nLgotCQlOb2RlTGlzdCBub2RlcyA9IGRvY3VtZW50LmdldFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBwaSA9IGRhdGEubmV3IFBsdWdpbkluZm8oKTsKLQkJCXBpLmd1aWQgPSBMaWJyYXJ5RG9jdW1lbnQuZ2V0R3VpZChub2RlKTsKLQkJCWRhdGEuZ2V0UGx1Z2lucygpLmFkZChwaSk7Ci0KLQkJCS8vIENoZWNrIHdpdGggdGhlIGN1cnJlbnQgbGlicmFyeSwgZ2V0IHRoZSByZWxhdGVkIGluZm9ybWF0aW9uLgotCQkJbG9hZEV4aXN0aW5nUGx1Z2luSW5mbyhwaSk7Ci0JCX0KLQotCQkvLyBSZW1vdmUgdGhlIHVubmVlZGVkIGNvbmZpZ3VyYXRpb25zLgotCQlidWlsZENvbmZpZ0luZm9Gcm9tRmlsZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmlzaXRSZXNvdXJjZVRhZyhMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJTm9kZUxpc3Qgbm9kZXMgPSBkb2N1bWVudC5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2lkKTsKLQkJCVN0cmluZyB1cmkgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl91cmkpOwotCi0JCQkvLyBMb2FkIHRoZSBwbHVnaW4ueG1pIGZpbGUgZm9yIGRldGFpbCBpbmZvcm1hdGlvbi4KLQkJCUZpbGUgZmlsZSA9IGRvY3VtZW50LmdldEZpbGVGcm9tVXJpKHVyaSk7Ci0KLQkJCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBwaSA9IGRhdGEuZ2V0UGx1Z2luSW5mbyhndWlkKTsKLQkJCWlmIChwaSAhPSBudWxsKSB7Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJbG9hZFBsdWdpbkluZm8oZmlsZSwgcGkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFJlbW92ZSB0aGUgcGx1Zy1pbiBpbmZvIGVudHJ5IHNpbmNlIHRoaWFzIGlzIG5vdAotCQkJCQkvLyBhIHZhbGlkIHBsdWctaW4gdG8gaW1wb3J0LgotCQkJCQlkYXRhLnJlbW92ZVBsdWdpbkluZm8oZ3VpZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBpZiBub3QgcGx1Z2luLCBtaWdodCBiZSBhIGNvbmZpZ3VyYXRpb24KLQkJCQlQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbyBjaSA9IGRhdGEKLQkJCQkJCS5nZXRDb25maWdJbmZvKGd1aWQpOwotCQkJCWlmIChjaSAhPSBudWxsKSB7Ci0JCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlsb2FkQ29uZmlnSW5mbyhmaWxlLCBjaSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29uZmlnSW5mbyhGaWxlIHNvdXJjZSwKLQkJCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGluZm8pIHsKLQkJdHJ5IHsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gWE1MVXRpbC5sb2FkWG1sKHNvdXJjZSk7Ci0JCQlFbGVtZW50IHJvb3QgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotCQkJRWxlbWVudCBjb25maWdUYWcgPSBudWxsOwotCQkJaWYgKHJvb3QuZ2V0VGFnTmFtZSgpLmVxdWFscygKLQkJCQkJIm9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJY29uZmlnVGFnID0gcm9vdDsKLQkJCX0gZWxzZSB7Ci0JCQkJTm9kZUxpc3Qgbm9kZXMgPSByb290Ci0JCQkJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKG5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCQljb25maWdUYWcgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjb25maWdUYWcgIT0gbnVsbCkgewotCQkJCWluZm8ubmFtZSA9IGNvbmZpZ1RhZy5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRQbHVnaW5JbmZvKEZpbGUgc291cmNlLCBQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbykgewotCQl0cnkgewotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBYTUxVdGlsLmxvYWRYbWwoc291cmNlKTsKLQkJCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCi0JCQlFbGVtZW50IHBsdWdpblRhZyA9IG51bGw7Ci0JCQlpZiAocm9vdC5nZXRUYWdOYW1lKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJcGx1Z2luVGFnID0gcm9vdDsKLQkJCX0gZWxzZSB7Ci0JCQkJTm9kZUxpc3Qgbm9kZXMgPSByb290Ci0JCQkJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXBsdWdpblRhZyA9IChFbGVtZW50KSBub2Rlcy5pdGVtKDApOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHBsdWdpblRhZyAhPSBudWxsKSB7Ci0JCQkJaW5mby5uYW1lID0gcGx1Z2luVGFnLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5mby52ZXJzaW9uID0gTGlicmFyeURvY3VtZW50LmdldENoaWxkVmFsdWUocGx1Z2luVGFnLAotCQkJCQkJInZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZm8uYnJpZWZfZGVzYyA9IExpYnJhcnlEb2N1bWVudC5nZXRDaGlsZFZhbHVlKHBsdWdpblRhZywKLQkJCQkJCSJicmllZkRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmZvLmF1dGhvcnMgPSBMaWJyYXJ5RG9jdW1lbnQuZ2V0Q2hpbGRWYWx1ZShwbHVnaW5UYWcsCi0JCQkJCQkiYXV0aG9ycyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5mby5jaGFuZ2VEYXRlID0gTGlicmFyeURvY3VtZW50LmdldENoaWxkVmFsdWUocGx1Z2luVGFnLAotCQkJCQkJImNoYW5nZURhdGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZm8udXJsID0gc291cmNlLnRvU3RyaW5nKCk7Ci0KLQkJCQkvLyBHZXQgdGhlIGJhc2UgcGx1Zy1pbnMuCi0JCQkJTm9kZUxpc3Qgbm9kZXMgPSBwbHVnaW5UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJhc2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJCVN0cmluZyBndWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaHJlZik7Ci0KLQkJCQkJaW50IGluZHggPSBndWlkLmluZGV4T2YoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaW5keCA+IDApIHsKLQkJCQkJCWd1aWQgPSBndWlkLnN1YnN0cmluZyhpbmR4ICsgMSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpbmR4ID0gZ3VpZC5pbmRleE9mKCJ1bWE6Ly8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKGluZHggPj0gMCkgewotCQkJCQkJCWd1aWQgPSBndWlkLnN1YnN0cmluZyhpbmR4ICsgNik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaW5mby51c2VkUGx1Z2lucy5hZGQoZ3VpZCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkRXhpc3RpbmdQbHVnaW5JbmZvKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJTGlzdCBwbHVnaW5zID0gKGxpYnJhcnkgPT0gbnVsbCkgPyBuZXcgQXJyYXlMaXN0KCkgOiBsaWJyYXJ5Ci0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCWlmIChwbHVnaW4uZ2V0R3VpZCgpLmVxdWFscyhpbmZvLmd1aWQpKSB7Ci0JCQkJaW5mby5leGlzdGluZ1BsdWdpbiA9IHBsdWdpbjsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkRXhpc3RpbmdDb25maWdJbmZvKFBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGluZm8pIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbnMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQlpZiAoY29uZmlncyA9PSBudWxsIHx8IGNvbmZpZ3MubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWdzW2ldOwotCQkJaWYgKGNvbmZpZy5nZXRHdWlkKCkuZXF1YWxzKGluZm8uZ3VpZCkpIHsKLQkJCQlpbmZvLmV4aXN0aW5nQ29uZmlnID0gY29uZmlnOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgdGhlIGd1aWQgb2YgdGhlIG9sZCBtZXRob2QgbGlicmFyeSB3aXRoIHRoZSBuZXcgb25lLgotCSAqIDxwPgotCSAqIFNlYXJjaCBmb3IgdGhlIGZvbGxvd2luZyBmaWxlczogbGlicmFyeS54bWksIHBsdWdpbi54bWksIG1vZGVsLnhtaS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZml4TGlicmFyeUd1aWQoRmlsZSBwYXRoLCBTdHJpbmcgb2xkR3VpZCwgU3RyaW5nIG5ld0d1aWQpIHsKLQkJaWYgKCFwYXRoLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUZpbGVbXSBmaWxlcyA9IHBhdGgubGlzdEZpbGVzKG5ldyBGaWxlRmlsdGVyKCkgewotCi0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7Ci0KLQkJCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJCVN0cmluZyBuYW1lID0gZi5nZXROYW1lKCk7Ci0JCQkJcmV0dXJuIG5hbWUuZXF1YWxzKCJsaWJyYXJ5LnhtaSIpIHx8IG5hbWUuZXF1YWxzKCJwbHVnaW4ueG1pIikgfHwgbmFtZS5lcXVhbHMoIm1vZGVsLnhtaSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQl9KTsKLQotCQlpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlmaXhMaWJyYXJ5R3VpZChmaWxlc1tpXSwgb2xkR3VpZCwgbmV3R3VpZCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFJlYWQgaW4gdGhlIGZpbGUsIHVwZGF0ZSBpdCBhbmQgc2F2ZSB0aGUgZmlsZS4KLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgc291cmNlID0gRmlsZVV0aWwucmVhZEZpbGUoZmlsZXNbaV0sCi0JCQkJCQkJRmlsZVV0aWwuRU5DT0RJTkdfVVRGXzgpLnRvU3RyaW5nKCk7Ci0JCQkJCWlmIChzb3VyY2UuaW5kZXhPZihvbGRHdWlkKSA+PSAwKSB7Ci0JCQkJCQkvLyBUT0RPOiBUaGlzIGlzIGEgcmVnZXhwIHJlcGFsY2VtZW50LCBpcyBpdCBzYWZlPwotCQkJCQkJc291cmNlID0gc291cmNlLnJlcGxhY2VBbGwob2xkR3VpZCwgbmV3R3VpZCk7Ci0KLQkJCQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCksCi0JCQkJCQkJCXNvdXJjZSk7Ci0JCQkJCX0KLQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG1lcmdlKExpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2MpIHRocm93cyBFeGNlcHRpb24gewotCQkvL0NvcHkgZmlsZXMgb25seSBhcyBuZXdNZXJnZVNjaGVtZSA9IHRydWUKLQkJaW1wb3J0RW50cmllcyh0YXJnZXRMaWJEb2MpOwotCQkKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCVJlc291cmNlIHJlczAgPSBsaWIuZVJlc291cmNlKCk7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IwID0gKFJlc291cmNlTWFuYWdlcikgTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlczApOwotCQlSZXNvdXJjZVNldCByZXNTZXQgPSByZXMwLmdldFJlc291cmNlU2V0KCk7Ci0JCQotCQltZXJnZVBsdWdpbnModGFyZ2V0TGliRG9jLCBsaWIsIHJlc01ncjAsIHJlc1NldCk7CQkKLQkJbWVyZ2VDb25maWdzKHRhcmdldExpYkRvYywgbGliLCByZXNNZ3IwLCByZXNTZXQpOwotCQkKLQkJbGliLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkKLQkJLy9MaWJyYXJ5VXRpbC5zYXZlTGlicmFyeShsaWIsIGZhbHNlLCBmYWxzZSk7Ci0JCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCXRyeSB7Ci0JCQlwZXJzaXN0ZXIuc2F2ZShsaWIuZVJlc291cmNlKCkpOwotCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9CQotCQkKLQkJLy9maXhMaWJyYXJ5R3VpZCh0YXJnZXRMaWJEb2MuZ2V0RmlsZSgpLmdldFBhcmVudEZpbGUoKSwgaW1wb3J0aW5nTGliRG9jCi0JCS8vCQkuZ2V0TGlicmFyeUd1aWQoKSwgdGFyZ2V0TGliRG9jLmdldExpYnJhcnlHdWlkKCkpOwotCQkKLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBtZXJnZVBsdWdpbnMoTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYywgTWV0aG9kTGlicmFyeSBsaWIsIFJlc291cmNlTWFuYWdlciByZXNNZ3IwLCBSZXNvdXJjZVNldCByZXNTZXQpIHsKLQkJTGlzdCBleGlzdGluZ1BsdWdpbkd1aWRzID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uc2VsZWN0ZWQgJiYgaW5mby5leGlzdGluZ1BsdWdpbiAhPSBudWxsKSB7Ci0JCQkJaWYgKGV4aXN0aW5nUGx1Z2luR3VpZHMgPT0gbnVsbCkgewotCQkJCQlleGlzdGluZ1BsdWdpbkd1aWRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCX0KLQkJCQlleGlzdGluZ1BsdWdpbkd1aWRzLmFkZChpbmZvLmd1aWQpOwotCQkJfQotCQl9Ci0JCQotCQlNYXAgcGdUb1JnTWFwID0gaW1wb3J0aW5nTGliRG9jLmJ1aWxkUGx1Z2luR3VpZFRvUmVzTWdyR3VpZE1hcChleGlzdGluZ1BsdWdpbkd1aWRzKTsJCQkJCi0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoaW5mby5zZWxlY3RlZCAmJiBpbmZvLmV4aXN0aW5nUGx1Z2luID09IG51bGwpIHsKLQkJCQltZXJnZUVsZW1lbnQoaW5mby5ndWlkLCB0YXJnZXRMaWJEb2MsIGxpYiwgcmVzTWdyMCwgcmVzU2V0LCBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJCX0gZWxzZSBpZiAoaW5mby5zZWxlY3RlZCAmJiBwZ1RvUmdNYXAgIT0gbnVsbCkgewkvLzE1MTc4NgotCQkJCVJlc291cmNlIHJlcyA9IGluZm8uZXhpc3RpbmdQbHVnaW4uZVJlc291cmNlKCk7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIE11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlTWFuYWdlcihyZXMpOwotCQkJCVN0cmluZyBleGlzdGluZ0d1aWQgPSByZXNNZ3IuZ2V0R3VpZCgpOwotCQkJCVN0cmluZyBpbXBvcnRlZEd1aWQgPSAoU3RyaW5nKSBwZ1RvUmdNYXAuZ2V0KGluZm8uZ3VpZCk7Ci0JCQkJaWYgKGltcG9ydGVkR3VpZCAhPSBudWxsICYmICFpbXBvcnRlZEd1aWQuZXF1YWxzKGV4aXN0aW5nR3VpZCkpIHsKLQkJCQkJcmVzTWdyLnNldEd1aWQoaW1wb3J0ZWRHdWlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG1lcmdlQ29uZmlncyhMaWJyYXJ5RG9jdW1lbnQgdGFyZ2V0TGliRG9jLCBNZXRob2RMaWJyYXJ5IGxpYiwgUmVzb3VyY2VNYW5hZ2VyIHJlc01ncjAsIFJlc291cmNlU2V0IHJlc1NldCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRDb25maWdzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uc2VsZWN0ZWQgJiYgaW5mby5leGlzdGluZ0NvbmZpZyA9PSBudWxsKSB7Ci0JCQkJbWVyZ2VFbGVtZW50KGluZm8uZ3VpZCwgdGFyZ2V0TGliRG9jLCBsaWIsIHJlc01ncjAsIHJlc1NldCwgbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKTsKLQkJCX0JCQkJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtZXJnZUVsZW1lbnQoU3RyaW5nIGd1aWQsIExpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2MsIAotCQkJTWV0aG9kTGlicmFyeSBsaWIsIFJlc291cmNlTWFuYWdlciByZXNNZ3IwLCBSZXNvdXJjZVNldCByZXNTZXQsIExpc3QgZWxlbWVudHMpewotCQlTdHJpbmcgc3JjX3VyaSA9IGltcG9ydGluZ0xpYkRvYy5nZXRSZXNvdXJjZVVyaShndWlkKTsKLQkJaWYgKHNyY191cmkgPT0gbnVsbCB8fCBzcmNfdXJpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlGaWxlIHRhcmdldF9maWxlID0gdGFyZ2V0TGliRG9jLmdldEZpbGVGcm9tVXJpKHNyY191cmkpOwotCQlTdHJpbmcgcGF0aCA9IHRhcmdldF9maWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHBhdGgpOwotCQlSZXNvdXJjZSByZXMgPSByZXNTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzKTsKLQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwkJCi0JCQotCQlNdWx0aUZpbGVTYXZlVXRpbC5yZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIocmVzTWdyMCwgZWxlbWVudCwgdXJpKTsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIE11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlTWFuYWdlcihyZXMpOwotCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCXJlc01ncjAuZ2V0U3ViTWFuYWdlcnMoKS5hZGQocmVzTWdyKTsKLQkJfQotCX0JCQotCQotCXByaXZhdGUgdm9pZCBidWlsZENvbmZpZ0luZm9Gcm9tRmlsZXMoKSB7CQotCQlGaWxlIGNvcGllZExpYlBhdGggPSB1cEdyYWRlSW5mbyA9PSBudWxsID8gbnVsbCA6IHVwR3JhZGVJbmZvLmdldENvcGllZExpYkZpbGUoKTsKLQkJRmlsZSBpbXBvcnRpbmdMaWJQYXRoID0gY29waWVkTGliUGF0aCA9PSBudWxsID8gbmV3IEZpbGUoZGF0YS5sbERhdGEuZ2V0UGFyZW50Rm9sZGVyKCkKLQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgTGlicmFyeURvY3VtZW50LmV4cG9ydEZpbGUpIDogY29waWVkTGliUGF0aDsKLQkJRmlsZSBjb25maWdEaXIgPSBuZXcgRmlsZShpbXBvcnRpbmdMaWJQYXRoLmdldFBhcmVudCgpLCBNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSk7Ci0JCQotCQlMaWJyYXJ5RG9jdW1lbnQuQ29uZmlnRG9jVmlzaXRvciB2aXNpdG9yID0gbmV3IExpYnJhcnlEb2N1bWVudC5Db25maWdEb2NWaXNpdG9yKCkgewotCQkJcHVibGljIHZvaWQgdmlzaXQoRmlsZSBmaWxlLCBFbGVtZW50IG5vZGUpIHsKLQkJCQlQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbyBjaSA9IGRhdGEubmV3IENvbmZpZ3VhcmF0aW9uSW5mbygpOwotCQkJCWNpLmd1aWQgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9ndWlkKTsKLQkJCQljaS5uYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSArIEZpbGUuc2VwYXJhdG9yICsgZmlsZS5nZXROYW1lKCk7Ci0JCQkJaW1wb3J0aW5nTGliRG9jLmFkZFRvR3VpZFRvVXJpTWFwKGNpLmd1aWQsIHVyaSk7Ci0JCQkJZGF0YS5nZXRDb25maWdzKCkuYWRkKGNpKTsKLQkJCQkvLyBDaGVjayB3aXRoIHRoZSBjdXJyZW50IGxpYnJhcnksIGdldCB0aGUgcmVsYXRlZCBpbmZvcm1hdGlvbi4KLQkJCQlsb2FkRXhpc3RpbmdDb25maWdJbmZvKGNpKTsKLQkJCQlpZiAoY2kuZXhpc3RpbmdDb25maWcgIT0gbnVsbCkgewotCQkJCQlVUkkgcmVzVXJpID0gY2kuZXhpc3RpbmdDb25maWcuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJCXVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FICsgRmlsZS5zZXBhcmF0b3IgKyByZXNVcmkubGFzdFNlZ21lbnQoKTsKLQkJCQkJdXJpID0gdGFyZ2V0TGliRG9jLmRlY29kZVVyaSh1cmkpOwotCQkJCQl0YXJnZXRMaWJEb2MuYWRkVG9HdWlkVG9VcmlNYXAoY2kuZ3VpZCwgdXJpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQlMaWJyYXJ5RG9jdW1lbnQudmlzaXRDb25maWdGaWxlcyhjb25maWdEaXIsIHZpc2l0b3IpOwkJCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZVVuaXF1ZU5hbWVzKExpc3QgZWxlbWVudHMpIHsKLQkJaWYgKGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1hcCBuYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50cy5nZXQoaSk7Ci0JCQluYW1lTWFwLnB1dChlbGVtLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpLCBlbGVtKTsKLQkJfQotCQkKLQkJTGlzdCBpbXBvcnRlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaW1wb3J0ZWRFeGlzdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChlbGVtZW50cy5nZXQoMCkgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGluZm8uc2VsZWN0ZWQpIHsKLQkJCQkJaWYgKGluZm8uZXhpc3RpbmdQbHVnaW4gPT0gbnVsbCB8fCAKLQkJCQkJCQkhaW5mby5leGlzdGluZ1BsdWdpbi5nZXROYW1lKCkuZXF1YWxzKGluZm8ubmFtZSkpIHsKLQkJCQkJCWltcG9ydGVkTGlzdC5hZGQoaW5mby5uYW1lKTsKLQkJCQkJCWlmIChpbmZvLmV4aXN0aW5nUGx1Z2luICE9IG51bGwpIHsKLQkJCQkJCQlpbXBvcnRlZEV4aXN0TGlzdC5hZGQoaW5mbyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRDb25maWdzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAoaW5mby5zZWxlY3RlZCkgewotCQkJCQlpZiAoaW5mby5leGlzdGluZ0NvbmZpZyA9PSBudWxsIHx8IAotCQkJCQkJCSFpbmZvLmV4aXN0aW5nQ29uZmlnLmdldE5hbWUoKS5lcXVhbHMoaW5mby5uYW1lKSkgewotCQkJCQkJaW1wb3J0ZWRMaXN0LmFkZChpbmZvLm5hbWUpOwotCQkJCQkJaWYgKGluZm8uZXhpc3RpbmdDb25maWcgIT0gbnVsbCkgewotCQkJCQkJCWltcG9ydGVkRXhpc3RMaXN0LmFkZChpbmZvKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0JCQkJCi0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPGltcG9ydGVkTGlzdC5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpbXBvcnRlZExpc3QuZ2V0KGkpOwotCQkJU3RyaW5nIHJlbmFtZWQgPSBuYW1lOwotCQkJd2hpbGUgKG5hbWVNYXAuY29udGFpbnNLZXkocmVuYW1lZC50b1VwcGVyQ2FzZSgpKSkgewotCQkJCXJlbmFtZWQgKz0gIl9yZW5hbWVkIjsKLQkJCX0KLQkJCWlmIChyZW5hbWVkICE9IG5hbWUpIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW0gPSAoTWV0aG9kRWxlbWVudCkgbmFtZU1hcC5nZXQobmFtZS50b1VwcGVyQ2FzZSgpKTsKLQkJCQlMaWJyYXJ5Vmlldy5ydW5SZW5hbWUoZWxlbSwgcmVuYW1lZCk7Ci0JCQl9CQkJCi0JCX0JCQkJCi0JCWZvciAoaW50IGk9MDsgaTxpbXBvcnRlZEV4aXN0TGlzdC5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IGluZm8gPSBpbXBvcnRlZEV4aXN0TGlzdC5nZXQoaSk7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW0gPSBpbmZvIGluc3RhbmNlb2YgUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvID8gCi0JCQkJCShNZXRob2RFbGVtZW50KSgoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpbmZvKS5leGlzdGluZ1BsdWdpbiA6Ci0JCQkJCShNZXRob2RFbGVtZW50KSgoUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8pIGluZm8pLmV4aXN0aW5nQ29uZmlnOwotCQkJU3RyaW5nIG5ld05hbWUgPSBpbmZvIGluc3RhbmNlb2YgUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvID8gCi0JCQkJCShTdHJpbmcpKChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGluZm8pLm5hbWUgOgotCQkJCQkoU3RyaW5nKSgoUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8pIGluZm8pLm5hbWU7CQkJCQkJCQkKLQkJCUxpYnJhcnlWaWV3LnJ1blJlbmFtZShlbGVtLCBuZXdOYW1lKTsJCQotCQl9CQotCQkKLQkJCi0JCQotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUmVzb3VyY2VTY2FubmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUmVzb3VyY2VTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0OWJlNDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1Jlc291cmNlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIHNjYW4gYW5kIGNvcHkgcmVzb3VyY2VzIGZyb20gdGhlIHNvdXJjZSBsaWJyYXJ5IHRvIHRoZSB0YXJnZXQgbGlicmFyeQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVNjYW5uZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfc3JjX3JlZiA9IFBhdHRlcm4uY29tcGlsZSgic3JjXFxzKj1cXHMqXCIoLio/KVwiIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0vLwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9saW5rX3JlZiA9IFBhdHRlcm4uY29tcGlsZSgiPGFcXHMrPyhbXj5dKik+KC4qPyk8L2E+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaHJlZl9yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoImhyZWZcXHMqPVxccypcIiguKj8pXCIiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCUZpbGUgc3JjTGliUm9vdDsKLQlGaWxlIHRhcmdldExpYlJvb3Q7Ci0JCi0JcHJpdmF0ZSBNYXAgbmV3RmlsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBNYXAgZXhpc3RpbmdGaWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwkKLQlwdWJsaWMgUmVzb3VyY2VTY2FubmVyKEZpbGUgc3JjTGliUm9vdCwgRmlsZSB0YXJnZXRMaWJSb290KSB7Ci0JCXRoaXMuc3JjTGliUm9vdCA9IHNyY0xpYlJvb3Q7Ci0JCXRoaXMudGFyZ2V0TGliUm9vdCA9IHRhcmdldExpYlJvb3Q7Ci0JfQotCQotCS8qKgotCSAqIHNjYW4gdGggZXRleHQgYW5kIGNvcHkgdGhlIHJlc291cmNlcwotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHNvdXJjZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzY2FuKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBzb3VyY2UpIHsKLQkJCi0JCXRyeQotCQl7Ci0JCQkvLyBwcm9jZXNzIGltYWdlcyBhbmQgb3RoZXIgc3JjIHJlc291cmNlcwotCQkJTWF0Y2hlciBtID0gcF9zcmNfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJCXdoaWxlICggbS5maW5kKCkgKQotCQkJewotCQkJCVN0cmluZyB1cmwgPSBtLmdyb3VwKDEpOwotCQkJCXByb2Nlc3NVcmwob3duZXIsIHVybCk7Ci0JCQl9Ci0KLQkJCS8vIHByb2Nlc3MgaHJlZnMKLQkJCW0gPSBwX2hyZWZfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJCQotCQkJd2hpbGUgKCBtLmZpbmQoKSApCi0JCQl7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQkJcHJvY2Vzc1VybChvd25lciwgdXJsKTsKLQkJCX0JCQkKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KQotCQl7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBwcm9jZXNzIHRoZSB1cmwgYW5kIGNvcHkgdGhlIHJlc291cmNlCi0JICogaWYgdGhlIG93bmVyIGVsZW1lbnQgaXMgc3BlY2lmaWVkLCB0aGUgdXJsIGlzIHJlbGF0aXZlIHRvIHRoZSBvd25lciBlbGVtZW50LCAKLQkgKm90aGVyd2lzZSBpdCdzIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5Ci0JICoKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gdXJsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NVcmwoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIHVybCkgewotCQkKLQkJaWYgKCB1cmwgPT0gbnVsbCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaW50IGluZGV4ID0gdXJsLmluZGV4T2YoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIGluZGV4ID49IDAgKQotCQl7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCQkKLQkJaW5kZXggPSB1cmwuaW5kZXhPZigiPyIpOyAvLyROT04tTkxTLTEkCi0JCWlmICggaW5kZXggPj0gMCApCi0JCXsKLQkJCXVybCA9IHVybC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9Ci0JCQotCQlpZiAodXJsLnRyaW0oKS5sZW5ndGgoKSA9PSAwICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyB0aGUgdXJsIGlzIHJlbGF0aXZlIHRvIHRoZSBvd25lciBlbGVtZW50Ci0JCS8vIG5lZWQgdG8gY29udmVydCB0byB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSByb290Ci0JCUZpbGUgc3JjRmlsZSA9IG51bGw7Ci0JCUZpbGUgdGFyZ2V0RmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoIG93bmVyICE9IG51bGwgKSB7Ci0JCQkJU3RyaW5nIGVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgob3duZXIpOwotCQkJCXNyY0ZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZShzcmNMaWJSb290LCBlbGVtZW50UGF0aCksIHVybCk7CQkKLQkJCQl0YXJnZXRGaWxlID0gbmV3IEZpbGUobmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgZWxlbWVudFBhdGgpLCB1cmwpOwkKLQkJCX0gZWxzZSB7Ci0JCQkJc3JjRmlsZSA9IG5ldyBGaWxlKHNyY0xpYlJvb3QsIHVybCk7CQkKLQkJCQl0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgdXJsKTsJCQkJCi0JCQl9Ci0JCQkKLQkJCWlmICggc3JjRmlsZS5pc0ZpbGUoKSAmJiBzcmNGaWxlLmV4aXN0cygpICkgewotCi0JCQkJc3JjRmlsZSA9IHNyY0ZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQkJCXRhcmdldEZpbGUgPSB0YXJnZXRGaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJCQkKLQkJCQlpZiAoIHRhcmdldEZpbGUuZXhpc3RzKCkgKSB7Ci0JCQkJCWlmICggIWV4aXN0aW5nRmlsZU1hcC5jb250YWluc0tleShzcmNGaWxlKSApIHsKLQkJCQkJCWlmICggc3JjRmlsZS5sZW5ndGgoKSAhPSB0YXJnZXRGaWxlLmxlbmd0aCgpIAotCQkJCQkJCQl8fCBzcmNGaWxlLmxhc3RNb2RpZmllZCgpICE9IHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkgKQotCQkJCQkJewotCQkJCQkJCWV4aXN0aW5nRmlsZU1hcC5wdXQoc3JjRmlsZSwgdGFyZ2V0RmlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoICFuZXdGaWxlTWFwLmNvbnRhaW5zS2V5KHNyY0ZpbGUpICkgewotCQkJCQkJbmV3RmlsZU1hcC5wdXQoc3JjRmlsZSwgdGFyZ2V0RmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIExvZyB0aGUgZXJyb3IgYW5kIHByb2NlZWQuIFRPRE8KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQkKLQkvKioKLQkgKiBDb3BpZXMgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHZvaWQgY29weVJlc291cmNlKFN0cmluZyB1cmwpIHsKLQkJcHJvY2Vzc1VybChudWxsLCB1cmwpOwotCX0KLQkKLQkvKioKLQkgKiBDb3BpZXMgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHZvaWQgY29weVJlc291cmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyB1cmwpIHsKLQkJcHJvY2Vzc1VybChvd25lciwgdXJsKTsKLQl9Ci0JCi0JLyoqCi0JICogcmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIGZpbGVzIHRvIGJlIHJlcGxhY2VkCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBmaWxlIHBhdGggc3RyaW5nCi0JICovCi0JcHVibGljIExpc3QgZ2V0RmlsZXNUb2JlUmVwbGFjZWQoKSB7Ci0JCUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICggZXhpc3RpbmdGaWxlTWFwLnNpemUoKSA+IDAgKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZXhpc3RpbmdGaWxlTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJRmlsZSBmID0gKEZpbGUpaXQubmV4dCgpOwotCQkJCWlmIChmICE9IG51bGwgKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJaWYgKCAhZmlsZXMuY29udGFpbnMocGF0aCkgKSB7Ci0JCQkJCQlmaWxlcy5hZGQocGF0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmaWxlczsKLQl9Ci0JCi0JLyoqCi0JICogY29weSBhbGwgdGhlIGZpbGVzIHRvIHRoZSBkZXN0aW5hdGlvbgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBuZXdGaWxlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXQubmV4dCgpOwotCQkJRmlsZSBzcmNGaWxlID0gKEZpbGUpIGVudHJ5LmdldEtleSgpOwotCQkJRmlsZSB0YXJnZXRGaWxlID0gKEZpbGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlSZXNvdXJjZUhlbHBlci5jb3B5RmlsZShzcmNGaWxlLCB0YXJnZXRGaWxlKTsKLQkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIGNvcGllZDogIiArIHNyY0ZpbGUpOwotCQl9CQotCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IGV4aXN0aW5nRmlsZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKLQkJCUZpbGUgc3JjRmlsZSA9IChGaWxlKSBlbnRyeS5nZXRLZXkoKTsKLQkJCUZpbGUgdGFyZ2V0RmlsZSA9IChGaWxlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJUmVzb3VyY2VIZWxwZXIuY29weUZpbGUoc3JjRmlsZSwgdGFyZ2V0RmlsZSk7Ci0JCQkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBjb3BpZWQ6ICIgKyBzcmNGaWxlKTsKLQkJfQkKLQl9Ci0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmZiMTExNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbWV0aG9kIHBsdWctaW4gYW5kIGNvbmZpZ3VyYXRpb24gaW1wb3J0IHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjFmNzY0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkVsZW1lbnREaWZmVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgZGlmZiByZXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWZmUmVwb3J0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlmZlJlcG9ydENvbnRlbnRQcm92aWRlcigpIHsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50RGlmZlRyZWUpIHsKLQkJCQotCQkJTWV0aG9kRWxlbWVudCBlID0gKChFbGVtZW50RGlmZlRyZWUpaW5wdXRFbGVtZW50KS5nZXRCYXNlRWxlbWVudCgpOwotCQkJCi0JCQkvLyBkb24ndCBzaG93IHN1Yi1wYWNrYWdlcyB1bmRlciBwcm9jZXNzIGNvbXBvbmVudCwgaGlkZSB0aGUgcHJvY2VzcyBkZXRpYWwKLQkJCWlmICggKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSApIHsKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotCQkJfQotCi0JCQlMaXN0IGl0ZW1zID0gKChFbGVtZW50RGlmZlRyZWUpIGlucHV0RWxlbWVudCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQkJTGlzdCBkaXJ0eUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVsZW1lbnREaWZmVHJlZSBpdGVtID0gKEVsZW1lbnREaWZmVHJlZSkgaXQubmV4dCgpOwotCQkJCQlpZiAoaXRlbS5pc09sZE9ubHkoKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIDE1MDg5NUltcG9ydCBDb25maWc6IEN1c3RvbUNhdGVnb3J5IGRpZCBub3Qgc3luYyB1cCBieSBpbXBvcnQKLQkJCQkJLy8gdG8gZml4IHRoaXMgcHJvYmxlbSwgd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBIaWRkZW4gcm9vdCBjdXN0b21DYXRlZ29yeSBwYWNrYWdlIAotCQkJCQkvLyBidXQgbmVlZCB0byBoaWRlIGhlcmUKLQkJCQkJTWV0aG9kRWxlbWVudCBiYXNlID0gaXRlbS5nZXRCYXNlRWxlbWVudCgpOwotCQkJCQlpZiAoIChiYXNlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgCi0JCQkJCQkJJiYgVG5nVXRpbC5pc1Jvb3RDdXRvbUNhdGVnb3J5UGFja2FnZSgoTWV0aG9kUGFja2FnZSliYXNlKSApIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlkaXJ0eUl0ZW1zLmFkZChpdGVtKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gZGlydHlJdGVtcy50b0FycmF5KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRzKHBhcmVudEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnREaWZmVHJlZSkgewotCQkJcmV0dXJuICgoRWxlbWVudERpZmZUcmVlKSBlbGVtZW50KS5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnREaWZmVHJlZSkgewotCQkJcmV0dXJuICgoRWxlbWVudERpZmZUcmVlKSBlbGVtZW50KS5oYXNDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YWM2Y2ZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuRWxlbWVudERpZmZUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBUaGUgbGFiZWwgcHJvdmlkZXIgZm9yIHRoZSBkaWZmIHJlcG9ydC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpZmZSZXBvcnRMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIsCi0JCUlUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlmZlJlcG9ydExhYmVsUHJvdmlkZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlRnJvbU9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudERpZmZUcmVlKSB7Ci0JCQlFbGVtZW50RGlmZlRyZWUgZGlmZlRyZWUgPSAoRWxlbWVudERpZmZUcmVlKSBvYmplY3Q7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCXJldHVybiBkaWZmVHJlZS5nZXROYW1lKCk7Ci0KLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJCXJldHVybiBkaWZmVHJlZS5nZXRDb250ZW50VHlwZSgpOwotCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKSB7Ci0JCQkJcmV0dXJuIChkaWZmVHJlZS5nZXRJbXBvcnRFbGVtZW50KCkgPT0gbnVsbCkgPyAiIiA6IEltcG9ydFJlc291cmNlcy5EaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM7IAotCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAzKSB7Ci0JCQkJcmV0dXJuIChkaWZmVHJlZS5nZXRCYXNlRWxlbWVudCgpID09IG51bGwpID8gIiIgOiBJbXBvcnRSZXNvdXJjZXMuRGlmZlJlcG9ydExhYmVsUHJvdmlkZXJfeWVzOyAKLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gNCkgewotCQkJCXJldHVybiBkaWZmVHJlZS5nZXREaWZmTWVzc2FnZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5UZXh0KG9iamVjdCwgMCk7Ci0JfQotCi0JLyoqCi0JICogU2luY2Ugd2Ugd29uJ3QgZXZlciBnZW5lcmF0ZSB0aGVzZSBub3RpZmljYXRpb25zLCB3ZSBjYW4ganVzdCBpZ25vcmUKLQkgKiB0aGlzLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSB3ZSB3b24ndCBldmVyIGFkZCBsaXN0ZW5lcnMsIHdlIGNhbiBqdXN0IGlnbm9yZSB0aGlzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBBbHdheXMgcmV0dXJucyB0cnVlIGZvciBub3cuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBpZCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvRGlmZlJlcG9ydFZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvRGlmZlJlcG9ydFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NDZmMjM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgYmVmb3JlIGFuZCBhZnRlciBtZXRob2QgbGlicmFyeSBkaWZmZXJlbmNlcyBmb3IgYW4gaW1wb3J0Ci0gKiBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpZmZSZXBvcnRWaWV3ZXIgewotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlwcm90ZWN0ZWQgQ2hlY2tib3hUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JRGlmZlJlcG9ydFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLmRhdGEgPSBkYXRhOwotCQkKLQkJdHJlZVZpZXdlciA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXIocGFyZW50KTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkKLQkJCQkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBEaWZmUmVwb3J0Q29udGVudFByb3ZpZGVyKCkpOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IERpZmZSZXBvcnRMYWJlbFByb3ZpZGVyKCkpOwotCQljcmVhdGVUYWJsZUNvbHVtbnMoKTsKLQkJCi0JCWFkZExpc3RlbmVycygpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWJsZSBjb2x1bW5zLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZUNvbHVtbnMoKSB7Ci0JCVRyZWUgdHJlZSA9IHRyZWVWaWV3ZXIuZ2V0VHJlZSgpOwotCQl0cmVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUsIDApOwotCQljb2x1bW4uc2V0VGV4dChJbXBvcnRSZXNvdXJjZXMuRGlmZlJlcG9ydFZpZXdlcl9jb250ZW50KTsgLy8kTk9OLU5MUy0xJAotCQljb2x1bW4uc2V0V2lkdGgoMjAwKTsKLQotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSwgMSk7Ci0JCWNvbHVtbi5zZXRUZXh0KEltcG9ydFJlc291cmNlcy5EaWZmUmVwb3J0Vmlld2VyX3R5cGUpOyAvLyROT04tTkxTLTEkCi0JCWNvbHVtbi5zZXRXaWR0aCgxNTApOwotCi0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FLCAyKTsKLQkJY29sdW1uLnNldFRleHQoSW1wb3J0UmVzb3VyY2VzLkRpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0KTsgLy8kTk9OLU5MUy0xJAotCQljb2x1bW4uc2V0V2lkdGgoNzUpOwotCi0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FLCAzKTsKLQkJY29sdW1uLnNldFRleHQoSW1wb3J0UmVzb3VyY2VzLkRpZmZSZXBvcnRWaWV3ZXJfaW5fbGliKTsgLy8kTk9OLU5MUy0xJAotCQljb2x1bW4uc2V0V2lkdGgoNzUpOwotCi0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FLCA0KTsKLQkJY29sdW1uLnNldFRleHQoSW1wb3J0UmVzb3VyY2VzLkRpZmZSZXBvcnRWaWV3ZXJfc3RhdHVzKTsgLy8kTk9OLU5MUy0xJAotCQljb2x1bW4uc2V0V2lkdGgoMTAwKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgcmV2aXcuCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1JlcG9ydChPYmplY3QgaW5wdXQpIHsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQlzZXRDaGVja1N0YXRlcygpOwotCQl0cmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCS8vIGFkZCBhIGNoZWNrIHN0YXRlIGNoYW5nZSBsaXN0ZW5lcgotCQl0cmVlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlib29sZWFuIGNoZWNrZWQgPSBldmVudC5nZXRDaGVja2VkKCk7Ci0JCQkJdXBkYXRlQ2hlY2tTdGF0ZXMoZXZlbnQuZ2V0RWxlbWVudCgpLCBjaGVja2VkKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVDaGVja1N0YXRlcyhPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBjaGVja2VkKSB7Ci0KLQkJLy8gT2JqZWN0IGVsZW1lbnQgPSBldmVudC5nZXRFbGVtZW50KCk7Ci0KLQkJaWYgKGNoZWNrZWQgPT0gdHJ1ZSkgewotCQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHRyZWVWaWV3ZXIKLQkJCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJY2hlY2tQYXJlbnQoY3AsIGVsZW1lbnQpOwotCQkJLy8gdHJlZVZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIHRydWUpOwotCQl9Ci0JCWVsc2UKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCBmYWxzZSk7Ci0JCQkKLQkJc2VsZWN0aW9uQ2hpbGRyZW4oZWxlbWVudCwgY2hlY2tlZCk7Ci0KLQkJc2V0RGF0YSh0cmVlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpKTsKLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNoZWNrZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGlsZHJlbihPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBjaGVja2VkKSB7Ci0JCUlUcmVlQ29udGVudFByb3ZpZGVyIGNwID0gKElUcmVlQ29udGVudFByb3ZpZGVyKSB0cmVlVmlld2VyCi0JCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlPYmplY3RbXSBjaGlsZHMgPSBjcC5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChjaGlsZHNbaV0sIGNoZWNrZWQpOwotCQkJc2VsZWN0aW9uQ2hpbGRyZW4oY2hpbGRzW2ldLCBjaGVja2VkKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUGFyZW50KElUcmVlQ29udGVudFByb3ZpZGVyIGNwLCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5IC8qCi0JCQkJCQkJCQkJCQkJCQkJICogfHwgZWxlbWVudCA9PQotCQkJCQkJCQkJCQkJCQkJCSAqIGN1cnJlbnRSb290Tm9kZQotCQkJCQkJCQkJCQkJCQkJCSAqLykgewotCQkJcmV0dXJuOwotCQl9Ci0JCU9iamVjdCBwYXJlbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAoY3AuZ2V0UGFyZW50KGVsZW1lbnQpKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQl0cmVlVmlld2VyLnNldENoZWNrZWQocGFyZW50LCB0cnVlKTsKLQkJCS8vIGNvbmZpZ0ZhY3RvcnkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5hZGQoKEVPYmplY3QpcGFyZW50LAotCQkJLy8gZmFsc2UpOwotCQkJY2hlY2tQYXJlbnQoY3AsIHBhcmVudCk7Ci0JCX0KLQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0Q2hlY2tTdGF0ZXMoKSB7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUoZmFsc2UpOwotCQl0cnkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSB0cmVlVmlld2VyLmdldElucHV0KCk7Ci0JCQlzZWxlY3Rpb25DaGlsZHJlbihlbGVtZW50LCB0cnVlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQotCQlzZXREYXRhKHRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0RGF0YShPYmplY3RbXSBzZWxzKSB7Ci0JCWlmICggc2VscyA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlkYXRhLmltcG9ydExpc3QuY2xlYXIoKTsKLQkJZm9yICggaW50IGkgPSAwOyBpIDwgc2Vscy5sZW5ndGg7IGkrKyApIHsKLQkJCWRhdGEuaW1wb3J0TGlzdC5hZGQoc2Vsc1tpXSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRDb25maWdSZXBvcnRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRDb25maWdSZXBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg2Y2FkNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0Q29uZmlnUmVwb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyB0aGUgcmVzdWx0IG9mIGFuIGltcG9ydCBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRDb25maWdSZXBvcnRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBpbXBvcnRpbmdTZXJ2aWNlOwotCi0JRGlmZlJlcG9ydFZpZXdlciB2aWV3ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbXBvcnRDb25maWdSZXBvcnRQYWdlKENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlIGltcG9ydGluZ1NlcnZpY2UpIHsKLQkJc3VwZXIoSW1wb3J0UmVzb3VyY2VzLkltcG9ydENvbmZpZ1JlcG9ydFBhZ2VfdGl0bGUpOyAKLQkJdGhpcy5pbXBvcnRpbmdTZXJ2aWNlID0gaW1wb3J0aW5nU2VydmljZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USAotCQkJCXwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RICi0JCQkJfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0KLQkJdmlld2VyID0gbmV3IERpZmZSZXBvcnRWaWV3ZXIoY29udGFpbmVyLCBpbXBvcnRpbmdTZXJ2aWNlLmdldEltcG9ydERhdGEoKSk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCi0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogU2hvdyByZXN1bHQuCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1Jlc3VsdCgpIHsKLQkJLy8gQW5hbGl6ZSB0aGUgaW1wb3J0aW5nIGNvbmZpZ3VyYXRpb24gYW5kIHJlcG9ydCByZXN1bHQuCi0JCWltcG9ydGluZ1NlcnZpY2UuYW5hbHl6ZShudWxsKTsKLQotCQl2aWV3ZXIuc2hvd1JlcG9ydChpbXBvcnRpbmdTZXJ2aWNlLmdldERpZmZUcmVlKCkpOwotCi0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDFkOTMxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuU2F2ZUFsbEVkaXRvcnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTGlicmFyeUJhY2t1cFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGltcG9ydHMgZXhwb3J0ZWQgbGlicmFyeSBjb25maWd1cmF0aW9ucyBpbnRvIHRoZSBjdXJyZW50IG1ldGhvZAotICogbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJSW1wb3J0V2l6YXJkIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfVElUTEUgPSBJbXBvcnRSZXNvdXJjZXMuaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgYm9vbGVhbiBva1RvQ29tcGxldGUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlIHBhZ2UxOwotCi0JcHJvdGVjdGVkIFNlbGVjdENvbmZpZ3NUb0ltcG9ydCBjb25maWdQYWdlOwotCi0JcHJvdGVjdGVkIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlIHNwZWNzUGFnZTsKLQotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhID0gbmV3IENvbmZpZ3VyYXRpb25JbXBvcnREYXRhKCk7Ci0KLQlwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2Ugc2VydmljZSA9IG5ldyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSgKLQkJCWRhdGEpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoV0laQVJEX1RJVExFKTsKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsKSB7Ci0JCQlmaWxlTWdyLmNoZWNrTW9kaWZ5KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCksCi0JCQkJCU1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0JCX0KLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwgJiYgbWFuYWdlci5pc01ldGhvZExpYnJhcnlSZWFkT25seSgpKSB7Ci0JCQlJbXBvcnRQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlXSVpBUkRfVElUTEUsCi0JCQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfcmVhZG9ubHkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIHRydWUsIG51bGwsIG51bGwsIEltcG9ydFBsdWdpbgotCQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvd2l6YmFuL0ltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXBhZ2UxID0gbmV3IFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UoZGF0YSwgc2VydmljZSk7Ci0JCWFkZFBhZ2UocGFnZTEpOwotCi0JCWNvbmZpZ1BhZ2UgPSBuZXcgU2VsZWN0Q29uZmlnc1RvSW1wb3J0KHNlcnZpY2UpOwotCQlhZGRQYWdlKGNvbmZpZ1BhZ2UpOwotCi0JCXNwZWNzUGFnZSA9IG5ldyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZShkYXRhKTsKLQkJYWRkUGFnZShzcGVjc1BhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9DT05GSUdVUkFUT04pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCXJldHVybiBva1RvQ29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQkvLyBQcm9tcHQgdGhlIHVzZXIgdG8gYmFjayB1cCBsaWJyYXJ5LgotCQlMaWJyYXJ5QmFja3VwVXRpbC5wcm9tcHRCYWNrdXBMaWJyYXJ5KG51bGwsIG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpKTsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQkvLyBTdGFydCB0aGUgaW1wb3J0LgotCQkJCQltb25pdG9yCi0JCQkJCQkJLmJlZ2luVGFzaygKLQkJCQkJCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX01TRzEsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQJCQkJCQotCQkJCQlzZXJ2aWNlLnBlcmZvcm1JbXBvcnQobW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgZmFsc2UsIG9wKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVRocm93YWJsZSByZWFsRXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCUltcG9ydFBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmVhbEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkvL3JlY29yZCB0aGUgb3BlbmVkIGRpciBpbnRvIHByZWZlcmVuY2Ugc3RvcmUKLQkJSW1wb3J0VUlQcmVmZXJlbmNlcy5hZGRSZWNlbnRseUltcG9ydENvbmZpZ0RpcihkYXRhLmxsRGF0YQotCQkJCS5nZXRQYXJlbnRGb2xkZXIoKSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRQbHVnaW5XaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydFBsdWdpbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNjE0NmRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydFBsdWdpbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TYXZlQWxsRWRpdG9yc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlBsdWdpbkRlcEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLkxpYnJhcnlCYWNrdXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGltcG9ydHMgYW4gZXhwb3J0ZWQgbWV0aG9kIHBsdWctaW5zIGludG8gdGhlIGN1cnJyZW50IG1ldGhvZAotICogbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFBsdWdpbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9USVRMRSA9IEltcG9ydFJlc291cmNlcy5pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlIHBhZ2UxOwotCi0JcHJvdGVjdGVkIFNlbGVjdFBsdWdpbnNUb0ltcG9ydCBwYWdlMjsKLQotCXByb3RlY3RlZCBQbHVnaW5JbXBvcnREYXRhIGRhdGEgPSBuZXcgUGx1Z2luSW1wb3J0RGF0YSgpOwotCi0JcHJvdGVjdGVkIFBsdWdpbkltcG9ydGluZ1NlcnZpY2Ugc2VydmljZSA9IG5ldyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlKGRhdGEpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0UGx1Z2luV2l6YXJkKCkgewotCQlzZXRXaW5kb3dUaXRsZShXSVpBUkRfVElUTEUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJLy8gY2hlY2sgb3V0IHRoZSBsaWJyYXJ5IGZpcnN0Ci0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsKSB7Ci0JCQlmaWxlTWdyLmNoZWNrTW9kaWZ5KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCksCi0JCQkJCU1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0JCX0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsICYmIG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5UmVhZE9ubHkoKSkgewotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCVdJWkFSRF9USVRMRSwKLQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCVNhdmVBbGxFZGl0b3JzUGFnZS5hZGRQYWdlSWZOZWVkZWQodGhpcywgdHJ1ZSwgbnVsbCwgbnVsbCwgSW1wb3J0UGx1Z2luCi0JCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vSW1wb3J0TWV0aG9kUGx1Z2lucy5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlwYWdlMSA9IG5ldyBTZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UoZGF0YSwgc2VydmljZSk7Ci0JCWFkZFBhZ2UocGFnZTEpOwotCi0JCXBhZ2UyID0gbmV3IFNlbGVjdFBsdWdpbnNUb0ltcG9ydChkYXRhLCBzZXJ2aWNlKTsKLQkJYWRkUGFnZShwYWdlMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSAhPSBwYWdlMikKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHBhZ2UyLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQkvLyBDaGVjayBpZiB0aGUgc2VsZWN0ZWQgcGx1Zy1pbnMgYXJlIHVwZGF0YWJsZSBvciBub3QuCi0JCVBsdWdpbk1vZGlmeUluZm8gbW9kaWZ5SW5mbyA9IGNoZWNrTW9kaWZ5KCk7Ci0KLQkJLy8gaWYgb25seSBsb2NrZWQsIHdlIGNhbiBhdXRvLXVubG9jayBhbmQgcmVsb2NrIHRoZSBwbHVnaW5zCi0JCS8vIGlmIHRoZSBwbHVpbiBpcyByZWFkb25seSwgdXNlciBuZWVkIHRvIG1hbnVhbGx5IG1ha2UgaXQgdXBkYXRhYmxlCi0JCS8vIGN1c3RvbWVycyBuZWVkIHRvIG1hbnVhbGx5IHVubG9jayBhbmQgbG9jayBwbHVnaW5zCi0JCS8vIGR1cmluZyBjb250ZW50IGxpYnJhcnkgdXBncmFkZQotCi0JCWlmIChtb2RpZnlJbmZvLnJlYWRvbmx5UGx1Z2lucy5zaXplKCkgPiAwKSB7Ci0JCQkvLyBEaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UuCi0JCQlTdHJpbmcgZXJyb3IgPSBtb2RpZnlJbmZvLmdldFJlYWRvbmx5TWVzc2FnZSgpLnRvU3RyaW5nKCk7Ci0JCQlJbXBvcnRQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvciwgZXJyb3IpOyAvLyROT04tTkxTLTEkCi0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmICgoaW5mby5leGlzdGluZ1BsdWdpbiAhPSBudWxsKSAmJiBpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKCJcdCIpLmFwcGVuZChpbmZvLm5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgewotCQkJYm9vbGVhbiB5ZXMgPSBJbXBvcnRQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJV0laQVJEX1RJVExFLAotCQkJCQkJCU5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zLCBidWZmZXIudG9TdHJpbmcoKSkpOwotCi0JCQlpZiAoIXllcykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vIGFsbG93IHVzZXIgdG8gcHJvY2VlZCB3aXRoIGxvY2tlZCBwbHVnaW5zCi0JCWlmIChtb2RpZnlJbmZvLmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBtb2RpZnlJbmZvLmdldExvY2tlZE1lc3NhZ2UoKS50b1N0cmluZygpCi0JCQkJCSsgSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF9jb25maXJtX2NvbnRpbnVlOyAvLyROT04tTkxTLTEkCi0JCQlib29sZWFuIHllcyA9IEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oV0laQVJEX1RJVExFLCBtZXNzYWdlKTsKLQkJCWlmICgheWVzKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLy8gUHJvbXB0IHVzZXIgdG8gYmFjayB1cCBsaWJyYXJ5LgotCQlMaWJyYXJ5QmFja3VwVXRpbC5wcm9tcHRCYWNrdXBMaWJyYXJ5KG51bGwsIG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpKTsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yCi0JCQkJCQkJLmJlZ2luVGFzaygKLQkJCQkJCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRQbHVnaW5XaXphcmRfTVNHMSwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCS8vIFN0YXJ0IHRoZSBpbXBvcnQuCi0JCQkJCXNlcnZpY2UucGVyZm9ybUltcG9ydChtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRQbHVnaW5XaXphcmRfZXJyb3IsIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmVhbEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWNoZWNrUGx1Z2luQ2lyY3VsYXJEZXBlbmRlbmN5KCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotLy8JCXJlY29yZCB0aGUgb3BlbmVkIGRpciBpbnRvIHByZWZlcmVuY2Ugc3RvcmUKLQkJSW1wb3J0VUlQcmVmZXJlbmNlcy5hZGRSZWNlbnRseUltcG9ydFBsdWdpbkRpcihkYXRhLmxsRGF0YQotCQkJCS5nZXRQYXJlbnRGb2xkZXIoKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBQbHVnaW5Nb2RpZnlJbmZvIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luTW9kaWZ5SW5mbyBjaGVja01vZGlmeSgpIHsKLQkJLy8gU3RyaW5nQnVmZmVyIGVycm9yID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlQbHVnaW5Nb2RpZnlJbmZvIG1vZGlmeUluZm8gPSBuZXcgUGx1Z2luTW9kaWZ5SW5mbygpOwotCi0JCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBpbmZvLmV4aXN0aW5nUGx1Z2luOwotCQkJaWYgKChwbHVnaW4gIT0gbnVsbCkgJiYgaW5mby5zZWxlY3RlZCkgewotCQkJCWlmIChwbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkgewotCQkJCQkvLyBUaGUgcGx1Zy1pbiBpcyBsb2NrZWQKLQkJCQkJLy8gU3RyaW5nIG1zZyA9IEltcG9ydFJlc291cmNlcwotCQkJCQkvLyAuZ2V0U3RyaW5nKAotCQkJCQkvLyAiSW1wb3J0LlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UucGx1Z2luX2xvY2tlZCIsCi0JCQkJCS8vIHBsdWdpbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIGVycm9yLmFwcGVuZChtc2cpOwotCQkJCQltb2RpZnlJbmZvLmxvY2tlZFBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gVGhlIHBsdWctaW4gZXhpc3RzIGluIHRoZSBjdXJyZW50IGxpYnJhcnksIG1ha2Ugc3VyZSB0aGUKLQkJCQkJLy8gcGx1Zy1pbiBpcyB1cGRhdGFibGUuCi0JCQkJCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQocGx1Z2luLCBnZXRTaGVsbCgpKTsKLQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkvLyBTdHJpbmcgbXNnID0gSW1wb3J0UmVzb3VyY2VzCi0JCQkJCQkvLyAuZ2V0U3RyaW5nKAotCQkJCQkJLy8gIkltcG9ydC5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlLnBsdWdpbl9yZWFkb25seSIsCi0JCQkJCQkvLyBwbHVnaW4uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gZXJyb3IuYXBwZW5kKG1zZyk7Ci0JCQkJCQltb2RpZnlJbmZvLnJlYWRvbmx5UGx1Z2lucy5hZGQocGx1Z2luKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIG1vZGlmeUluZm8ubWVzc2FnZSA9IGVycm9yLnRvU3RyaW5nKCk7Ci0KLQkJcmV0dXJuIG1vZGlmeUluZm87Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjaGVja1BsdWdpbkNpcmN1bGFyRGVwZW5kZW5jeSgpIHsKLQkJUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IgbWdyID0gbmV3IFBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCVBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyLkNoZWNrUmVzdWx0IHJlc3VsdCA9IG1nci5jaGVja0NpcmN1bGFyRGVwZW5kbmVjeShudWxsLCBmYWxzZSk7Ci0JCWlmIChyZXN1bHQuY2lyY3VsYXJMaXN0ICE9IG51bGwgJiYgIXJlc3VsdC5jaXJjdWxhckxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGNpclBsdWdpbnMgPSAoTGlzdCkgcmVzdWx0LmNpcmN1bGFyTGlzdC5nZXQoMCk7Ci0JCQlTdHJpbmcgbXNnID0gIiI7CS8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGk9MDsgaTxjaXJQbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQkJUGx1Z2luRGVwSW5mbyBwaW5mbyA9IChQbHVnaW5EZXBJbmZvKSBjaXJQbHVnaW5zLmdldChpKTsKLQkJCQlpZiAoaSAhPSAwKSB7Ci0JCQkJCW1zZyArPSAiLCAiOyAJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCW1zZyArPSBwaW5mby5nZXRQbHVnaW4oKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlXYXJuaW5nKAotCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0UGx1Z2luV2l6YXJkX3dhcm5fY2lyY3VsYXJfcGx1Z2lucywgCi0JCQkJCW1zZyk7CQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0VUlQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0VUlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkN2ZiODI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydFVJUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotKiBNYW5hZ2VzIHRoZSBQdWJsaXNoaW5nIFVJIHByZWZlcmVuY2VzLgotKiAKLSogQGF1dGhvciBCaW5neHVlIFh1Ci0qIEBzaW5jZSAxLjAKLSovCi1wdWJsaWMgY2xhc3MgSW1wb3J0VUlQcmVmZXJlbmNlcyB7Ci0KLQkvKioKLQkgKiBUaGUgUHVibGlzaGluZyBVSSBwcmVmZXJlbmNlIGtleXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9JTVBPUlRfUExVR0lOX1BBVEggPSAibGFzdEltcG9ydFBsdWdpblBhdGgiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogbGFzdCBpbXBvcnQgY29uZmlnIHByZWZlcmVuY2Uga2V5Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9JTVBPUlRfQ09ORklHX1BBVEggPSAibGFzdEltcG9ydENvbmZpZ1BhdGgiOyAKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFzdCBpbXBvcnQgcGx1Z2luIHBhdGggdGhhdCB3YXMgc2F2ZWQgaW4gYSBwcmV2aW91cyBzZXNzaW9uLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHNhdmVkIGxhc3QgaW1wb3J0IHBsdWdpbiBwYXRoIGFzIDxjb2RlPkxpc3Q8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRMYXN0SW1wb3J0UGx1Z2luUGF0aHMoKSB7Ci0JCUxpc3QgZGlycyA9IGdldFByb3BlcnR5TGlzdChMQVNUX0lNUE9SVF9QTFVHSU5fUEFUSCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGlycy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGlycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGRpciA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlyZXN1bHQuYWRkKGRpcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFzdCBpbXBvcnQgcGx1Z2luIHBhdGggdGhhdCB3YXMgc2F2ZWQgaW4gYSBwcmV2aW91cyBzZXNzaW9uLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHNhdmVkIGxhc3QgaW1wb3J0IHBsdWdpbiBwYXRoIGFzIDxjb2RlPkxpc3Q8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRMYXN0SW1wb3J0Q29uZmlnUGF0aHMoKSB7Ci0JCUxpc3QgZGlycyA9IGdldFByb3BlcnR5TGlzdChMQVNUX0lNUE9SVF9DT05GSUdfUEFUSCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGlycy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGlycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGRpciA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlyZXN1bHQuYWRkKGRpcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHJlY2VudGx5IG9wZW5lZCBtZXRob2QgcGx1Z2luIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGRpciAgIGltcG9ydCBwbHVnaW4gZGlyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlY2VudGx5SW1wb3J0UGx1Z2luRGlyKFN0cmluZyBkaXIpIHsKLQkJaWYgKGRpciA9PSBudWxsIHx8IGRpci5sZW5ndGgoKT09MCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBkaXJzID0gZ2V0TGFzdEltcG9ydFBsdWdpblBhdGhzKCk7Ci0KLQkJYWRkUHJvcGVydHkoZGlycywgZGlyLCBMQVNUX0lNUE9SVF9QTFVHSU5fUEFUSCk7Ci0JfQotCQotCS8qKgotCSAqIEFkZCB0aGUgcmVjZW50bHkgb3BlbmVkIGltcG9ydCBjb25maWcgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyICAgaW1wb3J0IGNvbmZpZyBkaXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUmVjZW50bHlJbXBvcnRDb25maWdEaXIoU3RyaW5nIGRpcikgewotCQlpZiAoZGlyID09IG51bGwgfHwgZGlyLmxlbmd0aCgpPT0wKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IGRpcnMgPSBnZXRMYXN0SW1wb3J0Q29uZmlnUGF0aHMoKTsKLQotCQlhZGRQcm9wZXJ0eShkaXJzLCBkaXIsIExBU1RfSU1QT1JUX0NPTkZJR19QQVRIKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIHRoZSBwcm9wZXJ0eSB0byB0aGUgZmlyc3QgcG9zaXRpb24uCi0JICogCi0JICogQHBhcmFtIG9sZFByb3BlcnR5TGlzdCAgIG9sZCBwcm9wZXJ0eSBsaXN0Ci0JICogQHBhcmFtIG5ld1Byb3BlcnR5ICAgICAgIG5ldyBwcm9wZXJ0eSB2YWx1ZSAKLQkgKiBAcGFyYW0gcHJvcGVydHlLZXkgICAgICAgdGFyZ2V0IHByb3BlcnR5IGtleQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkUHJvcGVydHkoTGlzdCBvbGRQcm9wZXJ0eUxpc3QsIFN0cmluZyBuZXdQcm9wZXJ0eSwgU3RyaW5nIHByb3BlcnR5S2V5KXsKLQkJTGlzdCBkaXJzUmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJaWYob2xkUHJvcGVydHlMaXN0LmNvbnRhaW5zKG5ld1Byb3BlcnR5KSkKLQkJCW9sZFByb3BlcnR5TGlzdC5yZW1vdmUobmV3UHJvcGVydHkpOwotCQkKLQkJZGlyc1Jlc3VsdC5hZGQoMCwgbmV3UHJvcGVydHkpOwotCQkKLQkJZm9yIChpbnQgaT0wOyBpPG9sZFByb3BlcnR5TGlzdC5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBvbGRQcm9wZXJ0eUxpc3QuZ2V0KGkpOwotCQkJZGlyc1Jlc3VsdC5hZGQoaSsxLCBwYXRoKTsKLQkJfQotCQkJCi0JCWlmKGRpcnNSZXN1bHQuc2l6ZSgpPkV4cG9ydFVJUHJlZmVyZW5jZXMuZ2V0TGlzdExlbmd0aCgpKQotCQkJZGlyc1Jlc3VsdCA9IGRpcnNSZXN1bHQuc3ViTGlzdCgwLCBFeHBvcnRVSVByZWZlcmVuY2VzLmdldExpc3RMZW5ndGgoKSk7Ci0JCQkKLQkJc2V0UHJvcGVydHlMaXN0KHByb3BlcnR5S2V5LCBTdHJVdGlsLmNvbnZlcnRMaXN0VG9TdHJBcnJheShkaXJzUmVzdWx0KSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lZCBwcmVmZXJlbmNlIGFzIGEKLQkgKiA8b2NkZT5MaXN0PC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldFByb3BlcnR5TGlzdChTdHJpbmcgbmFtZSkgewotCQlMaXN0IGxpc3QgPSBjb252ZXJ0VG9MaXN0KEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkuZ2V0U3RyaW5nKG5hbWUpKTsKLQkJaW50IGxlbmd0aCA9IEV4cG9ydFVJUHJlZmVyZW5jZXMuZ2V0TGlzdExlbmd0aCgpOwotCQlpZihsaXN0LnNpemUoKT5sZW5ndGgpewotCQkJbGlzdCA9IGxpc3Quc3ViTGlzdCgwLCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQkvKioKLQkgKiBTYXZlcyB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVkIHByZWZlcmVuY2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eUxpc3QoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoaXRlbXNbaV0pOwotCQkJYnVmZmVyLmFwcGVuZChFeHBvcnRVSVByZWZlcmVuY2VzLlBSRUZFUkVOQ0VfREVMSU1JVEVSKTsKLQkJfQotCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKG5hbWUsCi0JCQkJYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0cyB0aGUgc3VwcGxpZWQgUFJFRkVSRU5DRV9ERUxJTUlURVIgZGVsaW1pdGVkIHN0cmluZyBpbnRvIGEKLQkgKiA8Y29kZT5MaXN0PC9jb2RlPiBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbnZlcnRUb0xpc3QoU3RyaW5nIHByZWZlcmVuY2VWYWx1ZSkgewotCQlBcnJheUxpc3QgdG9waWNzID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcmVmZXJlbmNlVmFsdWUsCi0JCQkJRXhwb3J0VUlQcmVmZXJlbmNlcy5QUkVGRVJFTkNFX0RFTElNSVRFUik7Ci0JCWludCB0b2tlbkNvdW50ID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5Db3VudDsgaSsrKSB7Ci0JCQl0b3BpY3MuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCX0KLQkJcmV0dXJuIHRvcGljczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1BsdWdpbk1vZGlmeUluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1BsdWdpbk1vZGlmeUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOThmMjlhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9QbHVnaW5Nb2RpZnlJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGNvbnN0cnVjdCBhIG1lc3NhZ2UgdGhhdCBsaXN0cyBhbGwgdGhlIGxvY2tlZCBvciByZWFkLW9ubHkKLSAqIG1ldGhvZCBwbHVnLWlucyBpbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luTW9kaWZ5SW5mbyB7Ci0KLQlwdWJsaWMgTGlzdDxNZXRob2RQbHVnaW4+IGxvY2tlZFBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQotCXB1YmxpYyBMaXN0PE1ldGhvZFBsdWdpbj4gcmVhZG9ubHlQbHVnaW5zID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQbHVnaW5Nb2RpZnlJbmZvKCkgewotCX0KLQotCS8qKgotCSAqIEdldHMgYSBtZXNzYWdlIHRoYXQgbGlzdHMgYWxsIHRoZSBsb2NrZWQgbWV0aG9kIHBsdWctaW5zLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmdCdWZmZXI8Y29kZT4gY29udGFpbmluZyB0aGUgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0TG9ja2VkTWVzc2FnZSgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGxvY2tlZFBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBtc2cgPSBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX2xvY2tlZCwKLQkJCQkJCQlwbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQobXNnKTsKLQkJfQotCi0JCXJldHVybiBidWZmZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIG1lc3NhZ2UgdGhhdCBsaXN0cyBhbGwgdGhlIHJlYWQtb25seSBtZXRob2QgcGx1Zy1pbnMuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlN0cmluZ0J1ZmZlcjxjb2RlPiBjb250YWluaW5nIHRoZSBtZXNzYWdlCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBnZXRSZWFkb25seU1lc3NhZ2UoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWFkb25seVBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBtc2cgPSBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX3JlYWRvbmx5LAotCQkJCQkJCXBsdWdpbi5nZXROYW1lKCkpOwotCQkJYnVmZmVyLmFwcGVuZChtc2cpOwotCQl9Ci0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMWZmMDA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWdTcGVjczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgdGhlIGNvbmZpZ3VyYXRpb24KLSAqIHNwZWNpZmljYWl0b25zIHRvIGltcG9ydC4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBJQ2hlY2tTdGF0ZUxpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGxpYnJhcnlDb25maWdTcGVjRXhpc3RzID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjRXhpc3RzOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHMgPSBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHM7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBjb25maWdTcGVjTm9TZWxlY3Rpb24gPSBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY05vU2VsZWN0aW9uOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29uZmlnU3BlY0RhdGFMYWJlbCA9IEltcG9ydFJlc291cmNlcy5TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgY3RybF9jaGtib3hUYWJsZVZpZXdlcjsKLQotCS8vIDIgY29udHJvbHMgZm9yIGRpc3BsYXlpbmcgY29uZmlnc3BlYyBpbmZvIGZvciBwbHVnaW5zIGluIGltcG9ydCBkaXJlY3RvcnkKLQlwcml2YXRlIFRleHQgY3RybF9icmllZkRlc2NJbXBvcnQ7Ci0KLQlwcml2YXRlIExhYmVsIGltcG9ydENvbmZpZ1NwZWNMYWJlbDsKLQotCS8vIDIgY29udHJvbHMgZm9yIGRpc3BsYXlpbmcgY29uZmlnc3BlYyBpbmZvIGZvciBwbHVnaW5zIGluIHRoZSBsaWJyYXJ5Ci0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZEZXNjTGlicmFyeTsKLQotCXByaXZhdGUgTGFiZWwgbGlicmFyeUNvbmZpZ1NwZWNMYWJlbDsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRhaW5lcjsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlKENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoSW1wb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oSW1wb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL0ltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0KLQkJQ29tcG9zaXRlIHRhYmxlQ29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjb250YWluZXIsIFNXVC5OT05FKTsKLQkJdGFibGVDb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRhYmxlQ29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWNyZWF0ZUxhYmVsKAotCQkJCXRhYmxlQ29udGFpbmVyLAotCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9jb25maWdzLCAyKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyID0gY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcih0YWJsZUNvbnRhaW5lciwgMSk7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX0NPTkZJR1VSQVRPTjsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0KLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJQ29tcG9zaXRlIGltcG9ydENvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWltcG9ydENvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWltcG9ydENvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljcmVhdGVJbXBvcnRDb25maWdTcGVjSW5mbyhpbXBvcnRDb250YWluZXIpOwotCi0JCUNvbXBvc2l0ZSBsaWJyYXJ5Q29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjb250YWluZXIsIFNXVC5OT05FKTsKLQkJbGlicmFyeUNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWxpYnJhcnlDb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3JlYXRlTGlicmFyeUNvbmZpZ1NwZWNJbmZvKGxpYnJhcnlDb250YWluZXIpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSW1wb3J0Q29uZmlnU3BlY0luZm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbXBvcnRDb25maWdTcGVjTGFiZWwgPSBjcmVhdGVMYWJlbChjb250YWluZXIsIGNvbmZpZ1NwZWNOb1NlbGVjdGlvbiwgMSk7Ci0JCWNyZWF0ZUxpbmUoY29udGFpbmVyLCAxKTsKLQotCQljcmVhdGVMYWJlbCgKLQkJCQljb250YWluZXIsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2Rlc2MsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYnJpZWZEZXNjSW1wb3J0ID0gY3JlYXRlVGV4dE11bHRpKGNvbnRhaW5lciwgIiIsIDI3NSwgMTAwLCAxKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaWJyYXJ5Q29uZmlnU3BlY0luZm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlsaWJyYXJ5Q29uZmlnU3BlY0xhYmVsID0gY3JlYXRlTGFiZWwoY29udGFpbmVyLCBjb25maWdTcGVjTm9TZWxlY3Rpb24sCi0JCQkJMSk7Ci0JCWNyZWF0ZUxpbmUoY29udGFpbmVyLCAxKTsKLQotCQljcmVhdGVMYWJlbCgKLQkJCQljb250YWluZXIsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2Rlc2MsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYnJpZWZEZXNjTGlicmFyeSA9IGNyZWF0ZVRleHRNdWx0aShjb250YWluZXIsICIiLCAyNzUsIDEwMCwgMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXIjY2hlY2tTdGF0ZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBjb25maWdzID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCXNldERpc3BsYXlBdHRyaWJ1dGVzKChDb25maWdTcGVjcy5FbnRyeSkgY29uZmlnc1swXSk7Ci0JCX0gZWxzZSB7Ci0JCQljbGVhckRpc3BsYXlBdHRyaWJ1dGVzKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGxheUF0dHJpYnV0ZXMoQ29uZmlnU3BlY3MuRW50cnkgc3BlYykgewotCQljdHJsX2JyaWVmRGVzY0ltcG9ydAotCQkJCS5zZXRUZXh0KHNwZWMuY29uZmlnU3BlYy5icmllZl9kZXNjID09IG51bGwgPyAiIiA6IHNwZWMuY29uZmlnU3BlYy5icmllZl9kZXNjKTsgLy8kTk9OLU5MUy0xJAotCQlpbXBvcnRDb25maWdTcGVjTGFiZWwuc2V0VGV4dChjb25maWdTcGVjRGF0YUxhYmVsKTsKLQotCQlpZiAoc3BlYy5leGlzdGluZ0NvbmZpZyAhPSBudWxsKSB7Ci0JCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkuc2V0VGV4dChzcGVjLmV4aXN0aW5nQ29uZmlnCi0JCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQkJbGlicmFyeUNvbmZpZ1NwZWNMYWJlbC5zZXRUZXh0KGxpYnJhcnlDb25maWdTcGVjRXhpc3RzKTsKLQkJfSBlbHNlIHsKLQkJCWxpYnJhcnlDb25maWdTcGVjTGFiZWwuc2V0VGV4dChsaWJyYXJ5Q29uZmlnU3BlY05vdEV4aXN0cyk7Ci0JCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckRpc3BsYXlBdHRyaWJ1dGVzKCkgewotCQljdHJsX2JyaWVmRGVzY0ltcG9ydC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJbGlicmFyeUNvbmZpZ1NwZWNMYWJlbC5zZXRUZXh0KGNvbmZpZ1NwZWNOb1NlbGVjdGlvbik7Ci0JCWltcG9ydENvbmZpZ1NwZWNMYWJlbC5zZXRUZXh0KGNvbmZpZ1NwZWNOb1NlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChjdHJsX2Noa2JveFRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpLmxlbmd0aCA+IDApIHsKLQkJCS8vIFNldCBkYXRhLnNwZWNzLmNvbmZpZ3MgbGlzdCwgZml4IHRoZSBzZWxlY3RlZCBmaWVsZCBvZiBlYWNoCi0JCQkvLyBlbnRyeS4KLQkJCUl0ZXJhdG9yIGl0ZXIgPSBkYXRhLnNwZWNzLmNvbmZpZ3MuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUNvbmZpZ1NwZWNzLkVudHJ5IGUgPSAoQ29uZmlnU3BlY3MuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChjdHJsX2Noa2JveFRhYmxlVmlld2VyLmdldENoZWNrZWQoZSkpCi0JCQkJCWUuc2VsZWN0ZWQgPSB0cnVlOwotCQkJCWVsc2UKLQkJCQkJZS5zZWxlY3RlZCA9IGZhbHNlOwotCQkJfQotCQkJKChJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkub2tUb0NvbXBsZXRlID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCSgoSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLm9rVG9Db21wbGV0ZSA9IGZhbHNlOwotCQl9Ci0KLQkJLy8gQWx3YXlzIHJldHVybiBmYWxzZSBzbyB0aGF0IHRoZSAiTmV4dCIgYnV0dG9uIGlzIG5ldmVyIGVuYWJsZWQuCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2NhbkZsaXBUb05leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldElucHV0KGRhdGEuc3BlY3MuY29uZmlncyk7Ci0JCWlmIChkYXRhLnNwZWNzLmNvbmZpZ3Muc2l6ZSgpID4gMCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCWRhdGEuc3BlY3MuY29uZmlncy5nZXQoMCkpOwotCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0Q29uZmlnc1RvSW1wb3J0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RDb25maWdzVG9JbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2QwZDFkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RDb25maWdzVG9JbXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGRpc3BsYXlzIHRoZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgdGhhdCB3aWxsIGJlCi0gKiBpbXBvcnRlZC4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdENvbmZpZ3NUb0ltcG9ydCBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdENvbmZpZ3NUb0ltcG9ydC5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2Ugc2VydmljZTsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRhaW5lcjsKLQotCXByaXZhdGUgRGlmZlJlcG9ydFZpZXdlciBkaWZmOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0Q29uZmlnc1RvSW1wb3J0KENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoSW1wb3J0UmVzb3VyY2VzLnJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihJbXBvcnRSZXNvdXJjZXMucmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9JbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCQl0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0Q29uZmlnc1RvSW1wb3J0X2xhYmVsMSwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJZGlmZiA9IG5ldyBEaWZmUmVwb3J0Vmlld2VyKGNvbnRhaW5lciwgc2VydmljZS5nZXRJbXBvcnREYXRhKCkpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJKChJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkub2tUb0NvbXBsZXRlID0gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJZGlmZi5zaG93UmVwb3J0KHNlcnZpY2UuZ2V0RGlmZlRyZWUoKSk7Ci0JCSgoSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLm9rVG9Db21wbGV0ZSA9IHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI2YzU5NGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlCi0gKiBjb25maWd1cmF0aW9ucyB0byBpbXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlIGV4dGVuZHMgRGVzdGluYXRpb25Db21tb25QYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdGF0dXMgb2tTdGF0dXMgPSBuZXcgU3RhdHVzKAotCQkJSVN0YXR1cy5PSywKLQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkLCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhOwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBzZXJ2aWNlOwotCi0JcHJpdmF0ZSBTdGF0dXMgc3RhdHVzID0gb2tTdGF0dXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlKENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGEsCi0JCQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBzZXJ2aWNlKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSwgZGF0YS5sbERhdGEpOwotCQlzZXRUaXRsZShJbXBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oSW1wb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9JbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCQl0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRGVzdGluYXRpb25Db21tb25QYWdlI2luaXRDb21ib0l0ZW1zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29tYm9JdGVtcygpIHsKLQkJTGlzdCBkaXJMaXN0ID0gSW1wb3J0VUlQcmVmZXJlbmNlcy5nZXRMYXN0SW1wb3J0Q29uZmlnUGF0aHMoKTsKLQkJCi0JCWlmKGRpckxpc3QhPW51bGwgJiYgIWRpckxpc3QuaXNFbXB0eSgpKXsKLQkJCVN0cmluZ1tdIGRpcnMgPSBuZXcgU3RyaW5nW2Rpckxpc3Quc2l6ZSgpXTsKLQkJCWZvcihpbnQgaT0wOyBpPGRpckxpc3Quc2l6ZSgpOyBpKyspewotCQkJCWRpcnNbaV0gPSBkaXJMaXN0LmdldChpKS50b1N0cmluZygpOwotCQkJfQotCQkJY3RybF9leHBvcnRQYXRoLnNldEl0ZW1zKGRpcnMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKExpYnJhcnlVSVJlc291cmNlcy5ub09wZW5MaWJyYXJ5V2FybmluZ19tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWJvb2xlYW4gcmV0dXJuVmFsdWUgPSBmYWxzZTsKLQkJc3RhdHVzID0gb2tTdGF0dXM7Ci0JCWlmIChjdHJsX2V4cG9ydFBhdGguZ2V0VGV4dCgpLmxlbmd0aCgpPjApIHsKLQkJCXNhdmVUb0RhdGFNb2RlbCgpOwotCQkJRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShjdHJsX2V4cG9ydFBhdGguZ2V0VGV4dCgpKTsKLQkJCWlmICghbGliRGlyLmV4aXN0cygpKSB7Ci0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cygKLQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZCwgMCwgSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fcGF0aCwgbnVsbCk7IAotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm5WYWx1ZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXBwbHlUb1N0YXR1c0xpbmUoKTsKLQkJcmV0dXJuIHJldHVyblZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZVRvRGF0YU1vZGVsKCk7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQltb25pdG9yCi0JCQkJCQkuYmVnaW5UYXNrKAotCQkJCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9NU0cxLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJc2VydmljZS5hbmFseXplKG1vbml0b3IpOwotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJLy8gVGhpcyBydW5zIHRoZSBvcHRpb25zLCBhbmQgc2hvd3MgcHJvZ3Jlc3MuCi0JCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0LgotCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJU3RyaW5nIGVycm9yID0gZGF0YS5nZXRFcnJvckluZm8oKS5nZXRFcnJvcigpOwotCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5sZW5ndGgoKSA+IDApIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkLCAwLCBlcnJvciwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgCi0JCQlhcHBseVRvU3RhdHVzTGluZSgpOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJQmFzZVdpemFyZFBhZ2UgcGFnZSA9IG51bGw7Ci0JCWlmIChkYXRhLnNwZWNzICE9IG51bGwpCi0JCQlwYWdlID0gKChJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuc3BlY3NQYWdlOwotCQllbHNlIHsKLQkJCVBsdWdpbk1vZGlmeUluZm8gbW9kaWZ5SW5mbyA9IGNoZWNrTW9kaWZ5KCk7Ci0JCQkKLQkJCS8vIGlmIG9ubHkgbG9ja2VkLCB3ZSBjYW4gYXV0by11bmxvY2sgYW5kIHJlbG9jayB0aGUgcGx1Z2lucwotCQkJLy8gaWYgdGhlIHBsdWluIGlzIHJlYWRvbmx5LCB1c2VyIG5lZWQgdG8gbWFudWFsbHkgbWFrZSBpdCB1cGRhdGFibGUKLQkJCS8vIGN1c3RvbWVycyBuZWVkIHRvIG1hbnVhbGx5IHVubG9jayBhbmQgbG9jayBwbHVnaW5zIGR1cmluZyBjb250ZW50IGxpYnJhcnkgdXBncmFkZQotCQkJCi0JCQlpZiAoIG1vZGlmeUluZm8ucmVhZG9ubHlQbHVnaW5zLnNpemUoKSA+IDAgKSB7Ci0KLQkJCQllcnJvciA9IG1vZGlmeUluZm8uZ2V0UmVhZG9ubHlNZXNzYWdlKCkudG9TdHJpbmcoKTsKLQkJCQkKLQkJCQkvLyBzaG93IGVycm9yIG1lc3NhZ2UgYm94Ci0JCQkJSW1wb3J0UGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yLCBlcnJvcik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCTAsCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQludWxsKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQlhcHBseVRvU3RhdHVzTGluZSgpOwotCQkJCXJldHVybiB0aGlzOwotCQkJfQotCi0JCQkvLyBhbGxvdyB1c2VyIHRvIHByb2NlZWQgd2l0aCBsb2NrZWQgcGx1Z2lucwotCQkJaWYgKCBtb2RpZnlJbmZvLmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCApIHsKLQkJCQlTdHJpbmcgV0laQVJEX1RJVExFID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydENvbmZpZ1dpemFyZF90aXRsZTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBtZXNzYWdlID0gbW9kaWZ5SW5mby5nZXRMb2NrZWRNZXNzYWdlKCkudG9TdHJpbmcoKSArIAotCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU7IAotCQkJCWJvb2xlYW4geWVzID0gSW1wb3J0UGx1Z2luCi0JCQkJLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5Q29uZmlybWF0aW9uKFdJWkFSRF9USVRMRSwgbWVzc2FnZSk7Ci0JCQkJaWYgKCF5ZXMpIHsKLQkJCQkJc3RhdHVzID0gbmV3IFN0YXR1cygKLQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJMCwKLQkJCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJbnVsbCk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCWFwcGx5VG9TdGF0dXNMaW5lKCk7Ci0JCQkJCXJldHVybiB0aGlzOwotCQkJCX0KLQkJCX0gCQkJCi0JCQlwYWdlID0gKChJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuY29uZmlnUGFnZTsKLQkJfQotCQlwYWdlLm9uRW50ZXJQYWdlKG51bGwpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIFBsdWdpbk1vZGlmeUluZm8gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBQbHVnaW5Nb2RpZnlJbmZvIGNoZWNrTW9kaWZ5KCkgewotCQlyZXR1cm4gY2hlY2tNb2RpZnkoTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luR3VpZHMoc2VydmljZS5nZXRJbXBvcnRpbmdMaWJyYXJ5KCkpLCAKLQkJCQlnZXRTaGVsbCgpLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgUGx1Z2luTW9kaWZ5SW5mbyBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBQbHVnaW5Nb2RpZnlJbmZvIGNoZWNrTW9kaWZ5KExpc3QgZ3VpZHMsIFNoZWxsIHNoZWxsLCBib29sZWFuIGNoZWNrRWRpdCkgewotCQlQbHVnaW5Nb2RpZnlJbmZvIG1vZGlmeUluZm8gPSBuZXcgUGx1Z2luTW9kaWZ5SW5mbygpOwotCQkvL1N0cmluZ0J1ZmZlciBlcnJvciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJLy9MaXN0IGd1aWRzID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luR3VpZHMoc2VydmljZQotCQkvLwkJLmdldEltcG9ydGluZ0xpYnJhcnkoKSk7Ci0KLQkJTGlzdCBwbHVnaW5zID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCWlmIChndWlkcy5jb250YWlucyhwbHVnaW4uZ2V0R3VpZCgpKSkgewotCQkJCWlmIChwbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkgewotCQkJCQkvLyBwbHVnaW4gaXMgbG9ja2VkCi0vLwkJCQkJU3RyaW5nIG1zZyA9IEltcG9ydFJlc291cmNlcwotLy8JCQkJCQkJLmdldFN0cmluZygKLS8vCQkJCQkJCQkJIkltcG9ydC5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlLnBsdWdpbl9sb2NrZWQiLCBwbHVnaW4uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCWVycm9yLmFwcGVuZChtc2cpOwotCQkJCQltb2RpZnlJbmZvLmxvY2tlZFBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCQkJfSBlbHNlIGlmIChjaGVja0VkaXQpewotCQkJCQkvLyBwbHVnaW4gZXhpc3RzIGluIHRoZSBjdXJyZW50IGxpYnJhcnksIG1ha2Ugc3VyZSB0aGUKLQkJCQkJLy8gcGx1Z2luIGlzIHVwZGF0YWJsZQotCQkJCQkvL0lTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQocGx1Z2luLCBnZXRTaGVsbCgpKTsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChwbHVnaW4sIHNoZWxsKTsKLQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCQkJCVN0cmluZyBtc2cgPSBJbXBvcnRSZXNvdXJjZXMKLS8vCQkJCQkJCQkuZ2V0U3RyaW5nKAotLy8JCQkJCQkJCQkJIkltcG9ydC5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlLnBsdWdpbl9yZWFkb25seSIsIHBsdWdpbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCWVycm9yLmFwcGVuZChtc2cpOwotCQkJCQkJbW9kaWZ5SW5mby5yZWFkb25seVBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbW9kaWZ5SW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2NhbkZsaXBUb05leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFwcGx5VG9TdGF0dXNMaW5lKCkgewotCQlpZiAoc3RhdHVzICE9IG9rU3RhdHVzKQotCQkJc2V0RXJyb3JNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQllbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjRjYmFhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5EZXN0aW5hdGlvbkNvbW1vblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZQotICogbWV0aG9kIHBsdWctaW5zIHRvIGltcG9ydC4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZSBleHRlbmRzIERlc3RpbmF0aW9uQ29tbW9uUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdGF0dXMgT0tfU1RBVFVTID0gbmV3IFN0YXR1cygKLQkJCUlTdGF0dXMuT0ssCi0JCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vdF91c2VkLCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBQbHVnaW5JbXBvcnREYXRhIGRhdGE7Ci0KLQlwcml2YXRlIFBsdWdpbkltcG9ydGluZ1NlcnZpY2Ugc2VydmljZTsKLQotCXByaXZhdGUgU3RhdHVzIHN0YXR1cyA9IE9LX1NUQVRVUzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZShQbHVnaW5JbXBvcnREYXRhIGRhdGEsCi0JCQlQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJc3VwZXIoUEFHRV9OQU1FLCBkYXRhLmxsRGF0YSk7Ci0JCXNldFRpdGxlKEltcG9ydFJlc291cmNlcy5zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oSW1wb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RleHQpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vSW1wb3J0TWV0aG9kUGx1Z2lucy5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZSNpbml0Q29tYm9JdGVtcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbWJvSXRlbXMoKSB7Ci0JCUxpc3QgZGlyTGlzdCA9IEltcG9ydFVJUHJlZmVyZW5jZXMuZ2V0TGFzdEltcG9ydFBsdWdpblBhdGhzKCk7Ci0JCQotCQlpZihkaXJMaXN0IT1udWxsICYmICFkaXJMaXN0LmlzRW1wdHkoKSl7Ci0JCQlTdHJpbmdbXSBkaXJzID0gbmV3IFN0cmluZ1tkaXJMaXN0LnNpemUoKV07Ci0JCQlmb3IoaW50IGk9MDsgaTxkaXJMaXN0LnNpemUoKTsgaSsrKXsKLQkJCQlkaXJzW2ldID0gZGlyTGlzdC5nZXQoaSkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWN0cmxfZXhwb3J0UGF0aC5zZXRJdGVtcyhkaXJzKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJYm9vbGVhbiByZXR1cm5WYWx1ZSA9IGZhbHNlOwotCQlzdGF0dXMgPSBPS19TVEFUVVM7Ci0JCWlmIChjdHJsX2V4cG9ydFBhdGguZ2V0VGV4dCgpLmxlbmd0aCgpPjApIHsKLQkJCXNhdmVUb0RhdGFNb2RlbCgpOwotCQkJRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShjdHJsX2V4cG9ydFBhdGguZ2V0VGV4dCgpKTsKLQkJCWlmICghbGliRGlyLmV4aXN0cygpKSB7Ci0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cygKLQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vdF91c2VkLCAwLCBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX3BhdGgsIG51bGwpOyAKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuVmFsdWUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFwcGx5VG9TdGF0dXNMaW5lKCk7Ci0JCXJldHVybiByZXR1cm5WYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXNhdmVUb0RhdGFNb2RlbCgpOwotCi0JCS8vIFZhbGlkYXRlIGZpcnN0IGJlZm9yZSBnb2luZyB0byB0aGUgbmV4dCBwYWdlLgotCQlzZXJ2aWNlLnZhbGlkYXRlKG51bGwpOwotCQlTdHJpbmcgZXJyb3IgPSBkYXRhLmdldEVycm9ySW5mbygpLmdldEVycm9yKCk7Ci0JCWlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLmxlbmd0aCgpID4gMCkgewotCQkJc3VwZXIuc2V0RXJyb3JNZXNzYWdlKGVycm9yKTsKLQkJCXJldHVybiB0aGlzOwotCQl9IGVsc2UgewotCQkJU2VsZWN0UGx1Z2luc1RvSW1wb3J0IHBhZ2UgPSAoKEltcG9ydFBsdWdpbldpemFyZCkgZ2V0V2l6YXJkKCkpLnBhZ2UyOwotCQkJcGFnZS5vbkVudGVyUGFnZShudWxsKTsKLQkJCXJldHVybiBwYWdlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNjYW5GbGlwVG9OZXh0UGFnZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmxpcFRvTmV4dFBhZ2UoKSB7Ci0JCXJldHVybiBpc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBseVRvU3RhdHVzTGluZSgpIHsKLQkJaWYgKHN0YXR1cyAhPSBPS19TVEFUVVMpCi0JCQlzZXRFcnJvck1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCWVsc2UgewotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RQbHVnaW5zVG9JbXBvcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdFBsdWdpbnNUb0ltcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTRkMWE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdFBsdWdpbnNUb0ltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gdGhlIG1ldGhvZCBwbHVnLWlucyB0byBpbXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RQbHVnaW5zVG9JbXBvcnQgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElDaGVja1N0YXRlTGlzdGVuZXIsIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdFBsdWdpbnNUb0ltcG9ydC5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsaWJyYXJ5UGx1Z2luRXhpc3RzID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGlicmFyeVBsdWdpbk5vdEV4aXN0cyA9IEltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbk5vdEV4aXN0czsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHBsdWdpbk5vU2VsZWN0aW9uID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHBsdWdpbkRhdGFMYWJlbCA9IEltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luRGF0YUxhYmVsOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgY3RybF9jaGtib3hUYWJsZVZpZXdlcjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2F1dGhvckltcG9ydDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX3ZlcnNpb25JbXBvcnQ7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZkRlc2NJbXBvcnQ7Ci0KLQlwcml2YXRlIExhYmVsIGltcG9ydFBsdWdpbkxhYmVsOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYXV0aG9yTGlicmFyeTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX3ZlcnNpb25MaWJyYXJ5OwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZEZXNjTGlicmFyeTsKLQotCXByaXZhdGUgTGFiZWwgbGlicmFyeVBsdWdpbkxhYmVsOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29udGFpbmVyOwotCi0JcHJpdmF0ZSBpbnQgY2hlY2tlZENvdW50ID0gMDsKLQotCXByaXZhdGUgTGlzdCBjaGVja2VkUGx1Z2luTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgUGx1Z2luSW1wb3J0RGF0YSBkYXRhOwotCi0JcHJpdmF0ZSBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIHNlcnZpY2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQbHVnaW5zVG9JbXBvcnQoUGx1Z2luSW1wb3J0RGF0YSBkYXRhLAotCQkJUGx1Z2luSW1wb3J0aW5nU2VydmljZSBzZXJ2aWNlKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEltcG9ydFJlc291cmNlcy5zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oSW1wb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RleHQpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vSW1wb3J0TWV0aG9kUGx1Z2lucy5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCQl0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0KLQkJQ29tcG9zaXRlIHRhYmxlQ29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjb250YWluZXIsIFNXVC5OT05FKTsKLQkJdGFibGVDb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRhYmxlQ29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWNyZWF0ZUxhYmVsKHRhYmxlQ29udGFpbmVyLCBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3BsdWdpbnMsIDIpOyAvLyROT04tTkxTLTEkCi0KLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlciA9IGNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIodGFibGVDb250YWluZXIsIDIpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9QTFVHSU47Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZFBsdWdpbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQotCQlDb21wb3NpdGUgaW1wb3J0Q29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjb250YWluZXIsIFNXVC5OT05FKTsKLQkJaW1wb3J0Q29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljcmVhdGVJbXBvcnRQbHVnaW5JbmZvKGltcG9ydENvbnRhaW5lcik7Ci0KLQkJQ29tcG9zaXRlIGxpYnJhcnlDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlsaWJyYXJ5Q29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljcmVhdGVMaWJyYXJ5UGx1Z2luSW5mbyhsaWJyYXJ5Q29udGFpbmVyKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUltcG9ydFBsdWdpbkluZm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbXBvcnRQbHVnaW5MYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgcGx1Z2luTm9TZWxlY3Rpb24sIDEpOwotCQljcmVhdGVMaW5lKGNvbnRhaW5lciwgMSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvciwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9hdXRob3JJbXBvcnQgPSBjcmVhdGVUZXh0TXVsdGkoY29udGFpbmVyLCAiIiwgMjc1LCA0MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF92ZXJzaW9uSW1wb3J0ID0gY3JlYXRlVGV4dChjb250YWluZXIsICIiLCAyNzUsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2Rlc2MsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYnJpZWZEZXNjSW1wb3J0ID0gY3JlYXRlVGV4dE11bHRpKGNvbnRhaW5lciwgIiIsIDI3NSwgMTAwLCAxKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaWJyYXJ5UGx1Z2luSW5mbyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWxpYnJhcnlQbHVnaW5MYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgcGx1Z2luTm9TZWxlY3Rpb24sIDEpOwotCQljcmVhdGVMaW5lKGNvbnRhaW5lciwgMSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvciwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9hdXRob3JMaWJyYXJ5ID0gY3JlYXRlVGV4dE11bHRpKGNvbnRhaW5lciwgIiIsIDI3NSwgNDAsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb24sIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdmVyc2lvbkxpYnJhcnkgPSBjcmVhdGVUZXh0KGNvbnRhaW5lciwgIiIsIDI3NSwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfZGVzYywgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9icmllZkRlc2NMaWJyYXJ5ID0gY3JlYXRlVGV4dE11bHRpKGNvbnRhaW5lciwgIiIsIDI3NSwgMTAwLCAxKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lciNjaGVja1N0YXRlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCi0JCS8vIFNldCB0aGUgZmxhZyB0byBpbXBvcnQgdGhlIHNlbGVjdGVkIHBsdWctaW5zLgotCQlpZiAob2JqIGluc3RhbmNlb2YgUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSB7Ci0JCQkoKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgb2JqKS5zZWxlY3RlZCA9IGV2ZW50LmdldENoZWNrZWQoKTsKLQkJfQotCQlTdHJpbmcgbWVzc2FnZSA9IHNlcnZpY2UudmFsaWRhdGVTZWxlY3Rpb24oKTsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmxlbmd0aCgpID4gMCkgewotCQkJc3VwZXIuc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQl9Ci0KLQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJY2hlY2tlZENvdW50Kys7Ci0JCQljaGVja2VkUGx1Z2luTGlzdC5hZGQob2JqKTsKLQkJfSBlbHNlIHsKLQkJCWNoZWNrZWRDb3VudC0tOwotCQkJY2hlY2tlZFBsdWdpbkxpc3QucmVtb3ZlKG9iaik7Ci0JCX0KLQotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIHBsdWdpbiA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQlzZXREaXNwbGF5QXR0cmlidXRlcygoUGx1Z2luSW5mbykgcGx1Z2luWzBdKTsKLQkJfSBlbHNlIHsKLQkJCWNsZWFyRGlzcGxheUF0dHJpYnV0ZXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERpc3BsYXlBdHRyaWJ1dGVzKFBsdWdpbkluZm8gcGx1Z2luKSB7Ci0JCWN0cmxfYXV0aG9ySW1wb3J0LnNldFRleHQocGx1Z2luLmF1dGhvcnMgPT0gbnVsbCA/ICIiIDogcGx1Z2luLmF1dGhvcnMpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdmVyc2lvbkltcG9ydAotCQkJCS5zZXRUZXh0KHBsdWdpbi52ZXJzaW9uID09IG51bGwgPyAiIiA6IHBsdWdpbi52ZXJzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmRGVzY0ltcG9ydAotCQkJCS5zZXRUZXh0KHBsdWdpbi5icmllZl9kZXNjID09IG51bGwgPyAiIiA6IHBsdWdpbi5icmllZl9kZXNjKTsgLy8kTk9OLU5MUy0xJAotCQlpbXBvcnRQbHVnaW5MYWJlbC5zZXRUZXh0KHBsdWdpbkRhdGFMYWJlbCk7Ci0KLQkJaWYgKHBsdWdpbi5leGlzdGluZ1BsdWdpbiAhPSBudWxsKSB7Ci0JCQlsaWJyYXJ5UGx1Z2luTGFiZWwuc2V0VGV4dChsaWJyYXJ5UGx1Z2luRXhpc3RzKTsKLQkJCWN0cmxfYXV0aG9yTGlicmFyeS5zZXRUZXh0KHBsdWdpbi5leGlzdGluZ1BsdWdpbi5nZXRBdXRob3JzKCkpOwotCQkJY3RybF92ZXJzaW9uTGlicmFyeS5zZXRUZXh0KHBsdWdpbi5leGlzdGluZ1BsdWdpbi5nZXRWZXJzaW9uKCkpOwotCQkJY3RybF9icmllZkRlc2NMaWJyYXJ5LnNldFRleHQocGx1Z2luLmV4aXN0aW5nUGx1Z2luCi0JCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQl9IGVsc2UgewotCQkJbGlicmFyeVBsdWdpbkxhYmVsLnNldFRleHQobGlicmFyeVBsdWdpbk5vdEV4aXN0cyk7Ci0JCQljdHJsX2F1dGhvckxpYnJhcnkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWN0cmxfdmVyc2lvbkxpYnJhcnkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWN0cmxfYnJpZWZEZXNjTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRGlzcGxheUF0dHJpYnV0ZXMoKSB7Ci0JCWltcG9ydFBsdWdpbkxhYmVsLnNldFRleHQocGx1Z2luTm9TZWxlY3Rpb24pOwotCQljdHJsX2F1dGhvckltcG9ydC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3ZlcnNpb25JbXBvcnQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9icmllZkRlc2NJbXBvcnQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlsaWJyYXJ5UGx1Z2luTGFiZWwuc2V0VGV4dChwbHVnaW5Ob1NlbGVjdGlvbik7Ci0JCWN0cmxfYXV0aG9yTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3ZlcnNpb25MaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYnJpZWZEZXNjTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChjaGVja2VkQ291bnQgPiAwKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCUxpc3QgcGx1Z2lucyA9IGRhdGEuZ2V0UGx1Z2lucygpOwotCQlpZiAocGx1Z2lucyAhPSBudWxsKSB7Ci0JCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldElucHV0KHBsdWdpbnMudG9BcnJheSgpKTsKLQkJCWlmICghcGx1Z2lucy5pc0VtcHR5KCkpIHsKLQkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHBsdWdpbnMKLQkJCQkJCS5nZXQoMCkpOwotCQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2U2MTA3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB3aXphcmRzIGZvciBpbXBvcnRpbmcgbWV0aG9kIHBsdWctaW5zIGFuZCBjb25maWd1cmF0aW9ucy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNGFiMTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlCi1vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGM3MGZiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWRiMTMwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiBsaWJlZGl0LmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWksCi0gb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzO3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmludGVybmFsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmludGVybmFsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NmVmOTU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotc291cmNlLmxpYmVkaXQuamFyID0gc3JjLwotb3V0cHV0LmxpYmVkaXQuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gbGliZWRpdC5qYXIsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2NoZWNrZWRfYm94LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9jaGVja2VkX2JveC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljYWNiOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2NoZWNrZWRfYm94LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfQWN0aXZpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBY3Rpdml0eV9icmVha2Rvd25FbGVtZW50c19BY3Rpdml0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBY3Rpdml0eV9icmVha2Rvd25FbGVtZW50c19BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX0NvbmNlcHQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19Db25jZXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWRmODRkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX0NvbmNlcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX0N1c3RvbUNhdGVnb3J5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19DdXN0b21DYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmNDc5ODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX0N1c3RvbUNhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19DdXN0b21DYXRlZ29yeS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19DdXN0b21DYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpc2NpcGxpbmVHcm91cGluZ19kaXNjaXBsaW5lc19EaXNjaXBsaW5lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nX2Rpc2NpcGxpbmVzX0Rpc2NpcGxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNWJkNDc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nX2Rpc2NpcGxpbmVzX0Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZV9QcmFjdGljZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlX1ByYWN0aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlX1ByYWN0aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX1JvbGVTZXQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfUm9sZVNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfUm9sZVNldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtQcm9kdWN0X2VzdGltYXRlX0VzdGltYXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya1Byb2R1Y3RfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMzY0M2RhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya1Byb2R1Y3RfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNzE0NzY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DaGVja2xpc3RzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NoZWNrbGlzdHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OGY2ZDhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NoZWNrbGlzdHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uY2VwdHMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uY2VwdHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZGY4NGRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmNlcHRzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmZpZ3VyYXRpb25zLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmZpZ3VyYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmEyNGZkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25maWd1cmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcmllcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yaWVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjNhNWQ3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yaWVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2ExMDU2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3Nlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3Nlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmMjRhOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NTUzYzFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0RvbWFpbnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRG9tYWlucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRG9tYWlucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGZjODRlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYjk0NGZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0V4YW1wbGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0ZvbGRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Gb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjQxOWQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0ZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZUZvbGRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZUZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjYjE0MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2VGb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYzM4Y2U4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBhY2thZ2VzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L091dGNvbWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT3V0Y29tZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU3MDM1MTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT3V0Y29tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QbGFubmluZ1RlbXBsYXRlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QbGFubmluZ1RlbXBsYXRlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJlYjZlZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGxhbm5pbmdUZW1wbGF0ZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2VzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1ByYWN0aWNlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2VzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udHJpYnV0aW9ucy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udHJpYnV0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4ZDhjMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRyaWJ1dGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlsaWVzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NGYW1pbGllcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmMWJhNmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlsaWVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3Nlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOGQ4YzJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3Nlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXBvcnRzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlcG9ydHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NWYzZTBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlcG9ydHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmV1c2FibGVBc3NldHMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmV1c2FibGVBc3NldHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNTJjZmZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JldXNhYmxlQXNzZXRzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvYWRtYXBzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvYWRtYXBzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjExYmM1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2FkbWFwcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0YTNmNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRDYXRlZ29yaWVzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YW5kYXJkQ2F0ZWdvcmllcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU2OTgzODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRDYXRlZ29yaWVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbHMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFscy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA1YTIxZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzOGJkODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza3NfY2Z2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tzX2Nmdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1NTNjMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza3NfY2Z2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlY2huaXF1ZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVjaG5pcXVlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2ODY2ZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVjaG5pcXVlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzc2MzI1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVybURlZmluaXRpb25zLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rlcm1EZWZpbml0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyMWJmZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVybURlZmluaXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xNZW50b3JzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xNZW50b3JzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGYxYjg1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sTWVudG9ycy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29scy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29scy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyNGY4ZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV2hpdGVwYXBlcnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV2hpdGVwYXBlcnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNWI0ODAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1doaXRlcGFwZXJzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0R3VpZGVsaW5lcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdEd1aWRlbGluZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTdmYTY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0R3VpZGVsaW5lcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGVzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjI4OTI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L2VtcHR5X3BhY2tfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L2VtcHR5X3BhY2tfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzg4Mjg0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9lbXB0eV9wYWNrX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzMWMyOGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvcGFja2FnZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvcHJvY2ZvbGRfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L3Byb2Nmb2xkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0OGUyNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvcHJvY2ZvbGRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L3Rvb2xzZXQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvdG9vbHNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyNGY4ZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvdG9vbHNldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvdW5jaGVja2VkX2JveC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvdW5jaGVja2VkX2JveC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2YjlmOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL3VuY2hlY2tlZF9ib3guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMjczZWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgTGlicmFyeSBFZGl0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotX1VJX0NvbnRlbnRfZ3JvdXA9TWV0aG9kIENvbnRlbnQKLQotX1VJX0Rpc2NpcGxpbmVzX2dyb3VwPURpc2NpcGxpbmVzCi1fVUlfRG9tYWluc19ncm91cD1Eb21haW5zCi1fVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cD1Xb3JrIFByb2R1Y3QgS2luZHMKLV9VSV9Sb2xlX1NldHNfZ3JvdXA9Um9sZSBTZXRzCi1fVUlfVG9vbHNfZ3JvdXA9VG9vbHMKLV9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwPVN0YW5kYXJkIENhdGVnb3JpZXMKLV9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cD1DdXN0b20gQ2F0ZWdvcmllcwotX1VJX01ldGhvZENvbnRlbnRfZ3JvdXA9Q29udGVudCBQYWNrYWdlcwotCi1fVUlfUHJvY2Vzc2VzX2dyb3VwPVByb2Nlc3NlcwotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPVBsYW5uaW5nIFRlbXBsYXRlcwotCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5zX3RleHQ9Q2FwYWJpbGl0eSBQYXR0ZXJucwotX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ9RGVsaXZlcnkgUHJvY2Vzc2VzCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbnNfdGV4dD1EaWZmZXJlbnRpYWwgUHJvY2Vzc2VzCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dD1QbGFubmluZyBUZW1wbGF0ZXMKLQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9Q2FwYWJpbGl0eSBQYXR0ZXJuCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQ9RGVsaXZlcnkgUHJvY2VzcwotX1VJX1Byb2Nlc3NDb250cmlidXRpb25fdGV4dD1EaWZmZXJlbnRpYWwgUHJvY2VzcwotCi1fVUlfQ29uZmlndXJhdGlvbnNfdGV4dD1Db25maWd1cmF0aW9ucwotCi1fVUlfUHJvY2Vzc0ZhbWlsaWVzX3RleHQ9UHJvY2VzcyBGYW1pbGllcwotCi1fVUlfVW5jYXRlZ29yaXplZF90ZXh0PVVuY2F0ZWdvcml6ZWQKLV9VSV9VbmNhdGVnb3JpemVkX1Rhc2tzX3RleHQ9VW5jYXRlZ29yaXplZCBUYXNrcwotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1VbmNhdGVnb3JpemVkIFJvbGVzCi0KLV9VSV9HdWlkYW5jZXNfZ3JvdXA9R3VpZGFuY2UKLV9VSV9HdWlkYW5jZXNfQ2hlY2tsaXN0cz1DaGVja2xpc3RzCi1fVUlfR3VpZGFuY2VzX0NvbmNlcHRzPUNvbmNlcHRzCi1fVUlfR3VpZGFuY2VzX0V4YW1wbGVzPUV4YW1wbGVzCi1fVUlfR3VpZGFuY2VzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucz1Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1fVUlfR3VpZGFuY2VzX1ByYWN0aWNlcz1QcmFjdGljZXMKLV9VSV9HdWlkYW5jZXNfUmVwb3J0cz1SZXBvcnRzCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPVJldXNhYmxlIEFzc2V0cwotX1VJX0d1aWRhbmNlc19Sb2FkbWFwPVJvYWRtYXAKLV9VSV9HdWlkYW5jZXNfU3VwcG9ydGluZ01hdGVyaWFscz1TdXBwb3J0aW5nIE1hdGVyaWFscwotX1VJX0d1aWRhbmNlc19UZWNobmlxdWVzPVRlY2huaXF1ZXMKLV9VSV9HdWlkYW5jZXNfVGVtcGxhdGVzPVRlbXBsYXRlcwotX1VJX0d1aWRhbmNlc19UZXJtRGVmaW5pdGlvbnM9VGVybSBEZWZpbml0aW9ucwotX1VJX0d1aWRhbmNlc19Ub29sTWVudG9ycz1Ub29sIE1lbnRvcnMKLV9VSV9HdWlkYW5jZXNfV2hpdGVwYXBlcnM9V2hpdGVwYXBlcnMKLV9VSV9HdWlkYW5jZXNfV29ya1Byb2R1Y3RHdWlkZWxpbmVzPUd1aWRlbGluZXMKLQotCi1fVUlfUm9sZXNfZ3JvdXA9Um9sZXMKLV9VSV9UYXNrc19ncm91cD1UYXNrcwotX1VJX1dvcmtQcm9kdWN0c19ncm91cD1Xb3JrIFByb2R1Y3RzCi0KLSMgQnJlYWtkb3duIHN0cnVjdHVyZSBjb2x1bW4gZGlzcGxheSBuYW1lcwotQlNfQ29sdW1uX25hbWU9TmFtZQotQlNfQ29sdW1uX3ByZWZpeD1QcmVmaXgKLUJTX0NvbHVtbl9pZD1JbmRleAotQlNfQ29sdW1uX3ByZWRlY2Vzc29ycz1QcmVkZWNlc3NvcnMKLUJTX0NvbHVtbl9pc19yZXBlYXRhYmxlPVJlcGVhdGFibGUKLUJTX0NvbHVtbl9pc19vbmdvaW5nPU9uZ29pbmcKLUJTX0NvbHVtbl9pc19ldmVudF9kcml2ZW49RXZlbnQtRHJpdmVuCi1CU19Db2x1bW5fZW50cnlfc3RhdGU9RW50cnkgU3RhdGUKLUJTX0NvbHVtbl9leGl0X3N0YXRlPUV4aXQgU3RhdGUKLUJTX0NvbHVtbl90ZWFtcz1UZWFtCi1CU19Db2x1bW5fdHlwZT1UeXBlCi1CU19Db2x1bW5fbW9kZWxfaW5mbz1Nb2RlbCBJbmZvCi1CU19Db2x1bW5fcHJlc2VudGF0aW9uX25hbWU9UHJlc2VudGF0aW9uIE5hbWUKLUJTX0NvbHVtbl9kZWxpdmVyYWJsZT1EZWxpdmVyYWJsZQotQlNfQ29sdW1uX2lzX29wdGlvbmFsPU9wdGlvbmFsCi1CU19Db2x1bW5faXNfcGxhbm5lZD1QbGFubmVkCi1CU19Db2x1bW5faGFzX211bHRpcGxlX29jY3VycmVuY2VzPU11bHRpcGxlIE9jY3VycmVuY2VzCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgxMDQ2MzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InRleHRSZWZlcmVuY2VSZXBsYWNlciIgbmFtZT0iVGV4dCBSZWZlcmVuY2UgUmVwbGFjZXIiIHNjaGVtYT0ic2NoZW1hL3RleHRSZWZlcmVuY2VSZXBsYWNlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkaWFncmFtTWFuYWdlciIgbmFtZT0iRGlhZ3JhbSBNYW5hZ2VyIiBzY2hlbWE9InNjaGVtYS9kaWFncmFtTWFuYWdlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjb21tYW5kTGlzdGVuZXJzIiBuYW1lPSJDb21tYW5kIExpc3RlbmVycyIgc2NoZW1hPSJzY2hlbWEvY29tbWFuZExpc3RlbmVycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJsaWJyYXJ5SW5zcGVjdG9yIiBuYW1lPSJMaWJyYXJ5IEluc3BlY3RvciIgc2NoZW1hPSJzY2hlbWEvbGlicmFyeUluc3BlY3Rvci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJuZXN0ZWRDb21tYW5kUHJvdmlkZXJzIiBuYW1lPSJOZXN0ZWQgQ29tbWFuZCBQcm92aWRlcnMiIHNjaGVtYT0ic2NoZW1hL25lc3RlZENvbW1hbmRQcm92aWRlcnMuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ib3Bwb3NpdGVGZWF0dXJlTG9hZGVycyIgbmFtZT0iT3Bwb3NpdGVGZWF0dXJlIExvYWRlcnMiIHNjaGVtYT0ic2NoZW1hL29wcG9zaXRlRmVhdHVyZUxvYWRlcnMuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idXNlckludGVyYWN0aW9uSGFuZGxlciIgbmFtZT0iVXNlciBJbnRlcmFjdGlvbiBIYW5kbGVyIiBzY2hlbWE9InNjaGVtYS91c2VySW50ZXJhY3Rpb25IYW5kbGVyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InZhbGlkYXRpb25TdXBwb3J0IiBuYW1lPSJWYWxpZGF0aW9uIFN1cHBvcnQiIHNjaGVtYT0ic2NoZW1hL3ZhbGlkYXRpb25TdXBwb3J0LmV4c2QiLz4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgIDxwYWNrYWdlIAotICAgICAgIHVyaSA9ICJodHRwOi8vL2NvbS9pYm0vdW1hL2VkaXQvdG5nL3V0aWwvbW9kZWwuZWNvcmUiIAotICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2UiIC8+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvY29tbWFuZExpc3RlbmVycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9jb21tYW5kTGlzdGVuZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhM2E3MDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9jb21tYW5kTGlzdGVuZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9ImNvbW1hbmRMaXN0ZW5lcnMiIG5hbWU9IkNvbW1hbmQgTGlzdGVuZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb21tYW5kTGlzdGVuZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29tbWFuZExpc3RlbmVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgbWlncmF0b3IuIFRoaXMgY2xhc3MgbXVzdCBiZSBhIHB1YmxpYyBpbXBsZW1lbnRhdGlvbiBvZiAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb21tYW5kTGlzdGVuZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2RpYWdyYW1NYW5hZ2VyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2RpYWdyYW1NYW5hZ2VyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzNzU3YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9kaWFncmFtTWFuYWdlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiIGlkPSJkaWFncmFtTWFuYWdlciIgbmFtZT0iRGlhZ3JhbSBNYW5hZ2VyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkaWFncmFtTWFuYWdlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRpYWdyYW1NYW5hZ2VyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2xpYnJhcnlJbnNwZWN0b3IuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvbGlicmFyeUluc3BlY3Rvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZDIxMWFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvbGlicmFyeUluc3BlY3Rvci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiIGlkPSJsaWJyYXJ5SW5zcGVjdG9yIiBuYW1lPSJMaWJyYXJ5IEluc3BlY3RvciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBJbnNwZWN0IGNvbnRlbnRzIG9mIGxpYmFyeSBmb3IgZGVidWcgb3IgdGVzdGluZyBwdXJwb3NlLiBUaGUgaW50ZW50aW9uIGlzIHRvIHByb3ZpZGUgYSBjb252ZWllbnQgcGxhY2UgdG8gaG9vayBhbnkgZXh0ZXJuYWwgZGVidWcgb3IgdGVzdGluZyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIG5vdCBwYXJ0IG9mIEVQRi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxpYnJhcnlJbnNwZWN0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJsaWJyYXJ5SW5zcGVjdG9yIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSUxpYnJhcnlJbnNwZWN0b3IKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9uZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5ZDkzN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9uZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9Im5lc3RlZENvbW1hbmRQcm92aWRlcnMiIG5hbWU9Ik5lc3RlZCBDb21tYW5kIFByb3ZpZGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBQcm92aWRlcnMgb2YgbmVzdGVkIGNvbW1hbmRzIHRvIGV4ZWN1dGUgcmlnaHQgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWFpbiBjb21tYW5kLiBUaGUgZXh0ZW5zaW9uIG11c3QgaW1wbGVtZW50IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im5lc3RlZENvbW1hbmRQcm92aWRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJuZXN0ZWRDb21tYW5kUHJvdmlkZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL29wcG9zaXRlRmVhdHVyZUxvYWRlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvb3Bwb3NpdGVGZWF0dXJlTG9hZGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNWNhOWVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvb3Bwb3NpdGVGZWF0dXJlTG9hZGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiIGlkPSJvcHBvc2l0ZUZlYXR1cmVMb2FkZXJzIiBuYW1lPSJPcHBvc2l0ZUZlYXR1cmUgTG9hZGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvcHBvc2l0ZUZlYXR1cmVMb2FkZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ib3Bwb3NpdGVGZWF0dXJlTG9hZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3RleHRSZWZlcmVuY2VSZXBsYWNlci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS90ZXh0UmVmZXJlbmNlUmVwbGFjZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzMwOWQzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3RleHRSZWZlcmVuY2VSZXBsYWNlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiIGlkPSJ0ZXh0UmVmZXJlbmNlUmVwbGFjZXIiIG5hbWU9IlRleHQgUmVmZXJlbmNlIFJlcGxhY2VyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFJlcGxhY2VzIHRleHR1YWwgcmVmZXJlbmNlcyB0byB0aGUgb2xkIG9iamVjdHMgd2l0aCByZWZlcmVuY2VzIHRvIG5ldyBvYmplY3RzCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0ZXh0UmVmZXJlbmNlUmVwbGFjZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ0ZXh0UmVmZXJlbmNlUmVwbGFjZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBtaWdyYXRvci4gVGhpcyBjbGFzcyBtdXN0IGJlIGEgcHVibGljIGltcGxlbWVudGF0aW9uIG9mICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JVGV4dFJlZmVyZW5jZVJlcGxhY2VyJmx0Oy9jb2RlJmd0OyB3aXRoIGEgcHVibGljIDAtYXJndW1lbnQgY29uc3RydWN0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVRleHRSZWZlcmVuY2VSZXBsYWNlcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS91c2VySW50ZXJhY3Rpb25IYW5kbGVyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmUzMTY4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiBpZD0idXNlckludGVyYWN0aW9uSGFuZGxlciIgbmFtZT0iVXNlciBJbnRlcmFjdGlvbiBIYW5kbGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEV4dGVuc2lvbiBwb2ludCB0byBpbnRlcmFjdCB3aXRoIHVzZXIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InVzZXJJbnRlcmFjdGlvbkhhbmRsZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ1c2VySW50ZXJhY3Rpb25IYW5kbGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgcHVibGljIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuIFRoaXMgY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIGRlZmF1bHQgbm9uLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjEKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS92YWxpZGF0aW9uU3VwcG9ydC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS92YWxpZGF0aW9uU3VwcG9ydC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzlkZGE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdmFsaWRhdGlvblN1cHBvcnQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiBpZD0idmFsaWRhdGlvblN1cHBvcnQiIG5hbWU9IlZhbGlkYXRpb24gU3VwcG9ydCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBTdXBwb3J0cyBjb250cmlidXRpb24vcmVwbGFjZW1lbnQgb2YgdmFsaWRhdG9ycwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2YWxpZGF0aW9uRmFjdG9yeSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2YWxpZGF0aW9uRmFjdG9yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iY2xhc3MiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXBsYWNlIiB0eXBlPSJib29sZWFuIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJmYWxzZSI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaWYgc2V0IHRvICZsdDtjb2RlJmd0O3RydWUmbHQ7L2NvZGUmZ3Q7IHdpbGwgcmVwbGFjZSBhbnkgb3RoZXIgZXhpc3RpbmcgdmFsaWRhdGlvbiBmYWN0b3J5IGluIHRoZSBzeXN0ZW0uIEl0IGlzICZsdDtjb2RlJmd0O2ZhbHNlJmx0Oy9jb2RlJmd0OyBieSBkZWZhdWx0LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjEKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0ZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzNmZjNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0ZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBBIHN1YmNsYXNzIG9mIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyIHRoYXQga2VlcHMgYSByZWZlcmVuY2UgdG8gdGhlCi0gKiBjb250YWluaW5nIGZlYXR1cmUgb2YgdGhlIHdyYXBwZWQgdmFsdWUgYW5kIGltcGxlbWVudHMgQ29tcGFyYWJsZSB0byBzdXBwb3J0Ci0gKiBzb3J0aW5nLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCURlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0KLQlwdWJsaWMgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0JCQotCi0JcHVibGljIExpc3QgZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycygpIHsKLQkJaWYoY2hhbmdlTm90aWZpZXIgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgY2hhbmdlTm90aWZpZXIpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNjcmVhdGVXcmFwcGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCSAqLwotCXByb3RlY3RlZCBJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIobnVsbCwgdmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogRmlsbHMgdGhlIGdpdmVuIHdyYXBwZXJzIGJ5IGtlZXBpbmcgZXhpc3RpbmcsIHJlbW92aW5nL2Rpc3Bvc2Ugb2xkLCBhbmQKLQkgKiBhZGRpbmcgbmV3IG9uZXMuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXJzCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoQ29sbGVjdGlvbiB3cmFwcGVycywgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlDb2xsZWN0aW9uIHZhbHVlcywgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cmFwcGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVyCi0JCQkJCS5uZXh0KCk7Ci0JCQlpZiAoIXZhbHVlcy5yZW1vdmUod3JhcHBlci5nZXRWYWx1ZSgpKSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJd3JhcHBlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJd3JhcHBlcnMuYWRkKG5ldyBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKGZlYXR1cmUsIGl0ZXIKLQkJCQkJLm5leHQoKSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgewotCQlPYmplY3Qgb3RoZXJWYWx1ZSA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pLmdldFZhbHVlKCk7Ci0JCWlmICghKHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCQl8fCAhKG90aGVyVmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSB2YWx1ZSkuZ2V0TmFtZSgpLmNvbXBhcmVUbygKLQkJCQkoKE1ldGhvZEVsZW1lbnQpIG90aGVyVmFsdWUpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lBZGFwdGVyRmFjdG9yeVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmEzNTNmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWRhcHRlckZhY3RvcnlQcm92aWRlciB7Ci0JLyoqCi0JICogR2V0cyBhZGFwdGVyIGZhY3RvcnkgZm9yIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JQWRhcHRlckZhY3RvcnkgZ2V0V0JTQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgYWRhcHRlciBmYWN0b3J5IGZvciB0ZWFtIHVzYWdlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUFkYXB0ZXJGYWN0b3J5IGdldFRCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIGFkYXB0ZXIgZmFjdG9yeSBmb3Igd29yayBwcm9kdWN0IHVzYWdlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUFkYXB0ZXJGYWN0b3J5IGdldFdQQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyBhZGFwdGVyIGZhY3RvcnkgZm9yIGNvbnNvbGlkYXRlZCB2aWV3IG9mIHRoZSBwcm9jZXNzLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlBZGFwdGVyRmFjdG9yeSBnZXRDQlNBZGFwdGVyRmFjdG9yeSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMWVlZWYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBicmVhayBkb3duIGVsZW1lbnQgaXRlbSBwcm92aWRlcnMgdGhhdCB3YW50Ci0gKiB0byBtYW50YWluIGEgbGlzdCBjYWNoZWQgY2hpbGRyZW4uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNhY2hlZCBjaGlsZHJlbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBjYWNoZWQgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNhY2hlZCByb2xsdXAgY2hpbGRlbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBjYWNoZWQgcm9sbHVwIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29tbWFuZExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbW1hbmRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNDc2YTI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29tbWFuZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSBjb21tYW5kcyB0aGF0IHdhbnQgdG8gbm90aWZ5IHRoZWlyIGxpc3RlbmVycyBvZgotICogY2VydGFpbiBldmVudHMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbW1hbmRMaXN0ZW5lciB7Ci0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHByaW9yIHRvIHRoZSBleGVjdXRpb24gdGhlIGdpdmVuIGNvbW1hbmQKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqLwotCXB1YmxpYyB2b2lkIHByZUV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKTsKLQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiB0aGF0IGEgY29tbWFuZCBoYXMgYmVlbiBleGVjdXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgYSBjb21tYW5kCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5RXhlY3V0ZWQoQ29tbWFuZCBjb21tYW5kKTsKLQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiBwcmlvciB0byB0aGUgdW5kbyBvZiB0aGUgZ2l2ZW4gY29tbWFuZAotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICBhbiB1bmRvIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVVbmRvKENvbW1hbmQgY29tbWFuZCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb21tYW5kIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb21tYW5kIGNsYXNzLgotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRDb21tYW5kVHlwZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y4YjZkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGl0ZW0gcHJvdmlkZXJzIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZGlzcGxheSBhCi0gKiBmaWx0ZXJlZCBsaXN0IG9mIGNoaWxkcmVuIGFuZCBoYXZlIHRoZWlyIGRlZmF1bHQgbGFiZWwgb3ZlcndyaXR0ZW4gYXQKLSAqIHJ1bnRpbWUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYWJsZSB7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaWx0ZXIgdGhhdCBpcyB1c2VkIHRvIGZpbHRlciB0aGlzIG9iamVjdCdzIGNoaWxkcmVuLgotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiAgICAgICAgICAgIGFuIDxjb2RlPklGaWx0ZXI8L2NvZGU+IG9iamVjdAotCSAqIEBzZWUgSUZpbHRlcgotCSAqLwotCXZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsIGZvciB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYQotCSAqICAgICAgICAgICAgc3RyaW5nIGxhYmVsCi0JICovCi0Jdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMTk2ODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0aW9uQXBwbGljYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSB0byBvYnRhaW4gYW5kIHJlc29sdmUgbWV0aG9kIGVsZW1lbnQgYXR0cmlidXRlcyBhbmQKLSAqIHJlZmVyZW5jZXMgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvZiBhIHZhcmlhYmlsaXR5IGVsZW1lbnQgaW4gYSBtZXRob2QKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB2ZQotCSAqICAgICAgICAgICAgYSB2YXJpYWJpbGl0eSBlbGVtZW50Ci0JICogQHBhcmFtIGF0dHIKLQkgKiAgICAgICAgICAgIGFuIGF0dHJpYnV0ZSByZXByZXNlbnRhdGlvbgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGRlcml2ZWQgZnJvbSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgIGNsb3N1cmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIEVBdHRyaWJ1dGUgYXR0ciwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHJlZmVyZW5jZSB2YWx1ZSBvZiBhIHZhcmlhYmlsaXR5IGVsZW1lbnQgaW4gYSBtZXRob2QKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB2ZQotCSAqICAgICAgICAgICAgYSB2YXJpYWJpbGl0eSBlbGVtZW50Ci0JICogQHBhcmFtIHJlZgotCSAqICAgICAgICAgICAgYSByZWZlcmVuY2UgcmVwcmVzZW50YXRpb24KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBkZXJpdmVkIGZyb20gdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogICAgICAgICBjbG9zdXJlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWZlcmVuY2UoVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBFUmVmZXJlbmNlIHJlZiwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHJlZmVyZW5jZSB2YWx1ZSBvZiBhIGNvbnRlbnQgZGVzY3JpcHRpb24gaW4gYSBtZXRob2QKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjCi0JICogICAgICAgICAgICBhIGNvbnRlbnQgZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gcmVmCi0JICogICAgICAgICAgICBhIHJlZmVyZW5jZSByZXByZXNlbnRhdGlvbgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIGRlcml2ZWQgZnJvbSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgIGNsb3N1cmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZShDb250ZW50RGVzY3JpcHRpb24gZGVzYywgTWV0aG9kRWxlbWVudCBvd25lciwKLQkJCUVSZWZlcmVuY2UgcmVmLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWZlcmVuY2UgdmFsdWUgb2YgYSBtZXRob2QgZWxlbWVudCBvcHBvc2l0ZSBmZWF0dXJlIGluIGEgbWV0aG9kCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhbiBvcHBvc2l0ZSBmZWF0dXJlCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2UgZGVyaXZlZCBmcm9tIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgY2xvc3VyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQkvKioKLQkgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIG1ldGhvZCBlbGVtZW50IGRlcml2ZWQgZnJvbSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgIGNsb3N1cmUKLQkgKi8KLQlPYmplY3QgcmVzb2x2ZShPYmplY3Qgb2JqZWN0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDI2Yzk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGl0ZW0gcHJvdmlkZXJzIGFuZCBjb21tYW5kcyB0aGF0IHdhbnQgdG8gZmlsdGVyCi0gKiBkb3duIHJlbGF0ZWQgbWV0aG9kIGVsZW1lbnRzIGluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmF0b3IgZXh0ZW5kcyBJRmlsdGVyLCBBZGFwdGVyIHsKLQotCU1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0Jdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCS8qKgotCSAqIElmIHRoaXMgbWV0aG9kIHJldHVybiBhIG5vbi1OVUxMLCB0aGUgaXRlbSBwcm92aWRlciB3aWxsIHVzZSB0aGUgcmV0dXJuZWQKLQkgKiBjb2xsZWN0aW9uIGFzIGNoaWxkcmVuIGluIHBsYWNlIG9mIGl0cyBkZWZhdWx0IGNoaWxyZW4uCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBjaGlsZEZlYXR1cmUKLQkgKiBAcmV0dXJuCi0JICovCi0JQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlKTsKLQotCS8qKgotCSAqIFJlc29sdmVzIHRoaXMgb2JqZWN0IGFjY29yZGluZyB0byB2YXJpYWJpbGl0eSBydWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiByZXNvbHZlZCBvYmplY3QgdGhhdCBpcyBlaXRoZXIgdGhlIG9iamVjdCBpdHNlbGYsIG9yIGl0cyByZXBsYWNlcgotCSAqICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSB2YXJpYWJpbGl0eSBvZiB0aGlzIG9iamVjdCBpbiB0aGUgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlPYmplY3QgcmVzb2x2ZShPYmplY3Qgb2JqZWN0KTsKLQotCS8qKgotCSAqIEdldHMgdmFyaWFiaWxpdHkgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBWYXJpYWJpbGl0eUVsZW1lbnQgY2FsY3VsYXRlZAotCSAqIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgY29uZmlndXJhdG9yIGFuZCBhY2NvcmRpbmcgdG8gdGhlCi0JICogdmFyaWFiaWxpdHkgcnVsZXMuCi0JICogCi0JICogQHBhcmFtIHZlCi0JICogQHJldHVybgotCSAqIEBzZWUgVmFyaWFiaWxpdHlJbmZvCi0JICovCi0JVmFyaWFiaWxpdHlJbmZvIGdldFZhcmlhYmlsaXR5SW5mbyhWYXJpYWJpbGl0eUVsZW1lbnQgdmUpOwotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHVuY2F0ZWdvcml6ZWQgdGFza3MKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRVbmNhdGVnb3JpemVkVGFza0ZpbHRlcigpOwotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHdvcmtwcm9kdWN0cyB3aXRob3V0IGEgZG9tYWluCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0RG9tYWluVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyKCk7Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3Igd29ya3Byb2R1Y3RzIHdpdGhvdXQgYSBXUCBUeXBlCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0V3BUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyKCk7Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgdW5jYXRlZ29yaXplZCByb2xlcwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFVuY2F0ZWdvcml6ZWRSb2xlRmlsdGVyKCk7Ci0KLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB1bmNhdGVnb3JpemVkIHRvb2wgbWVudG9ycwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyKCk7Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgZGlzY2lwbGluZXMgYW5kIGRpc3BsaW5lIGdyb3VwaW5ncwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldERpc2NpcGxpbmVzRmlsdGVyKCk7Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3Igcm9sZXNldHMgYW5kIHJvbGVzZXQgZ3JvdXBpbmdzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0Um9sZVNldHNGaWx0ZXIoKTsKLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYXRvckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYmNiOThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIGNvbmZpZ3VyYXRpb24gZmlsdGVyIGZhY3RvcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRvckZhY3RvcnkgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbmZpZ3VyYXRpb24gZmlsdGVyLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgY29uZmlndXJhdGlvbiBmaWx0ZXIuCi0JICovCi0JSUNvbmZpZ3VyYXRvciBjcmVhdGVDb25maWd1cmF0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSURlZmF1bHROYW1lU2V0dGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSURlZmF1bHROYW1lU2V0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlZjBhN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lEZWZhdWx0TmFtZVNldHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGl0ZW0gcHJvdmlkZXJzIHRoYXQgd2FudCB0byBhc3NpZ24gYSBkZWZhdWx0IG5hbWUKLSAqIGZvciBlYWNoIG5ld2x5IGNyZWF0ZWQgbWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURlZmF1bHROYW1lU2V0dGVyIHsKLQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgbmFtZSBmb3IgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIElEIG9mIHRoZSBmZWF0dXJlIHRoYXQgY29udGFpbnMgbWV0aG9kIGVsZW1lbnRzIHdob3NlIGRlZmF1bHQKLQkgKiBuYW1lIHNldCB0aHJvdWdoIHRoaXMgaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElEIG9mIGEgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgb3duZXIgY2xhc3Mgb2YgdGhlIGZlYXR1cmUgdGhhdCBjb250YWlucyBtZXRob2QgZWxlbWVudHMgd2hvc2UKLQkgKiBkZWZhdWx0IG5hbWUgc2V0IHRocm91Z2ggdGhpcyBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgb3duZXIgY2xhc3Mgb2YgYSBmZWF0dXJlCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWY5MmEwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotLyoqCi0gKiBBIGdlbmVyaWMgZmlsdGVyIHRoYXQgdXNlcyB0aGUgdmlzaXRvciBkZXNpZ24gcGF0dGVybi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmlsdGVyIHsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gb2JqZWN0IGNhbiBiZSBhY2NlcHRlZCBieSB0aGlzIGZpbHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICB0aGUgdmlzaXRpbmcgb2JqZWN0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGFjY2VwdGVkLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUdyb3VwQ29udGFpbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUdyb3VwQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQwMjA1NDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lHcm91cENvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGl0ZW0gcHJvdmlkZXJzIHRoYXQgd2FudCB0byBsZXQgY2xpZW50cyBhY2Nlc3MgaXRzCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciA8ZW0+Z3JvdXAgaXRlbSBwcm92aWRlcnM8L2VtPn0KLSAqIGJ5IG5hbWUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUdyb3VwQ29udGFpbmVyIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIGdyb3VwIGl0ZW0gcHJvdmlkZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGdyb3VwIGl0ZW0gcHJvdmlkZXIKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI8Y29kZT4gb2JqZWN0Ci0JICovCi0JT2JqZWN0IGdldEdyb3VwSXRlbVByb3ZpZGVyKFN0cmluZyBuYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUxpYnJhcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmUyYTUzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUxpYnJhcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGl0ZW0gcHJvdmlkZXJzIHRoYXQgd2FudCB0byBpbmNsdWRlIFVJIGZvbGRlcnMKLSAqIGFuZCBmZWF0dXJlIGRlcml2ZWQgY2hpbGRyZW4uIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFNldHMgdGhlIHBhcmVudCBvZiB0aGlzIGl0ZW0gcHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgYSBwYXJlbnQgb2JqZWN0LCB0eXBpY2FsbHkgYSBtZXRob2QgZWxlbWVudAotCSAqLwotCXZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY2hpbGRyZW4gZmVhdHVyZXMuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGZlYXR1cmVzIGZvciByZXRyaWV2aW5nIHRoZSBjaGlsZCBlbGVtZW50cwotCSAqLwotCUNvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lSZWZlcmVuY2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVJlZmVyZW5jZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzJlOTQyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVJlZmVyZW5jZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSBhZGFwdGVyIGZhY3RvcmllcyBmb3IgY2xlYW5pbmcgdXAgcmVmZXJlbmNlcyB0bwotICogdW51c2VkIGl0ZW0gcHJvdmlkZXJzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWZlcmVuY2VyIHsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHJlZmVyZW5jZSB0byBhbiBpdGVtIHByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSByZWYKLQkgKiAgICAgICAgICAgIGEgcmVmZXJlbmNlIHRvIGFuIGl0ZW0gcHJvdmlkZXIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWZlcmVuY2UgaXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IHJlZik7Ci0KLQkvKioKLQkgKiBDbGVhbnMgdXAgYWxsIHVudXNlZCByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuVXAoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lTdGF0ZWZ1bEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lTdGF0ZWZ1bEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MjMyY2UzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JU3RhdGVmdWxJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBzdGF0ZWZ1bHQgaXRlbSBwcm92aWRlcnMgdGhhdCBuZWVkIHRvIGJlCi0gKiBkaXNwb3NlZCBhZnRlciB0aGV5IGFyZSBubyBsb25nZXIgdXNlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJRGlzcG9zYWJsZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JV3JhcHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2ZDY1OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXcmFwcGVyIHsKLQotCU9iamVjdCB3cmFwKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLAotCQkJaW50IGluZGV4KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYzNmZjFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIEZhY3RvcnkgdG8gY3JlYXRlIHtAbGluayBJV3JhcHBlckl0ZW1Qcm92aWRlcn0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgd3JhcHBlciBvZiBnaXZlbiB2YWx1ZSBmb3IgdGhlIGdpdmVuIG93bmVyCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCUlXcmFwcGVySXRlbVByb3ZpZGVyIGNyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIHZhbHVlIGlzIGxvY2F0ZWQuIElmIGZlYXR1cmUgaXMgbm9uLW51bGwsIHRoaXMgaW5kZXggaXMgd2l0aGluIHRoYXQgZmVhdHVyZS4KLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICovCi0JSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnlQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2M2RhNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIgewotCUlXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSBnZXRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0xpYnJhcnlFZGl0UGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvTGlicmFyeUVkaXRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjA3YmIwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvTGlicmFyeUVkaXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IEVkaXQgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5RWRpdFBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIExpYnJhcnlFZGl0UGx1Z2luIHBsdWdpbjsKLQotCXB1YmxpYyBzdGF0aWMgTGlicmFyeUVkaXRQbHVnaW4gSU5TVEFOQ0U7Ci0KLQkvLyBUaGUgc2hhcmVkIGltYWdlIGhhc2ggbWFwLgotCXByaXZhdGUgc3RhdGljIE1hcCBzaGFyZWRJbWFnZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeUVkaXRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5RWRpdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeUVkaXRQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN5bWJvbGljIG5hbWUgb2YgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHN5bWJvbGljIG5hbWUgb2YgdGhpcyBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3ltYm9saWNOYW1lKCkgewotCQlyZXR1cm4gZ2V0SWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luI2dldEltYWdlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0U2hhcmVkSW1hZ2UocmVsYXRpdmVQYXRoICsgIi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jZ2V0U2hhcmVkSW1hZ2UoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRTaGFyZWRJbWFnZShTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRTaGFyZWRJbWFnZShyZWxhdGl2ZVBhdGggKyAiLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBnaXZlbiB0aGUgVVJJLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZVVSSQotCSAqICAgICAgICAgICAgVGhlIGltYWdlJ3MgVVJJLgotCSAqIEByZXR1cm4gVGhlIGltYWdlIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoVVJJIGltYWdlVVJJKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkkudG9VUkwoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbWFnZSBnaXZlbiB0aGUgVVJJLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZVVSSQotCSAqICAgICAgICAgICAgVGhlIGltYWdlJ3MgVVJJLgotCSAqIEByZXR1cm4gVGhlIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRTaGFyZWRJbWFnZShVUkkgaW1hZ2VVUkkpIHsKLQkJaWYgKGltYWdlVVJJID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUltYWdlIGltYWdlID0gKEltYWdlKSBzaGFyZWRJbWFnZXMuZ2V0KGltYWdlVVJJKTsKLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCXJldHVybiBpbWFnZTsKLQkJfQotCi0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VVUkkpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWltYWdlID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKGZhbHNlKTsKLQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJc2hhcmVkSW1hZ2VzLnB1dChpbWFnZVVSSSwgaW1hZ2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGdpdmVuIG9iamVjdCBvciBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhPYmplY3QgbG9nRW50cnkpIHsKLQkJaWYgKGxvZ0VudHJ5IGluc3RhbmNlb2YgVGhyb3dhYmxlKSB7Ci0JCQkoKFRocm93YWJsZSkgbG9nRW50cnkpLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihsb2dFbnRyeSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvTGlicmFyeUVkaXRSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9MaWJyYXJ5RWRpdFJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MmEzMDc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9MaWJyYXJ5RWRpdFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IEVkaXQgbWVzc2FnZSByZXNvdXJjZSBidW5kbGUgYWNjZXNzb3IgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlicmFyeUVkaXRSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5ub3RfY29weV9vcl9leHRlbmRfZGVsaXZlcnlfcHJvY2VzczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YXJpYWJpbGl0eV9lcnJvcl9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2lyY3VsYXJfZGVwZW5kZW5jeV9lcnJvcl9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFyaWFiaWxpdHlfZWxlbWVudF9jaXJjdWxhcl9sb29wX2Vycm9yX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyAgcmVwbGFjaW5nX2FuY2VzdG9yX2Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBseV9wYXR0ZXJuX2Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cGxpY2F0ZUZlYXR1cmVWYWx1ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlc2NyaXB0b3JzVG9EZWxldGVfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlpbmdBY3Rpdml0aWVzX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVlcENvcHlfcHJvbXB0TXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVlcENvcHlfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRpYWxvZ19jYW5ub3RSZW5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5hbWVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdENvbmZpZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlUHJvY2Vzc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEFzc29jaWF0aW9uTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RUZWFtc0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFRlYW1zRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrU2VsZWN0aW9uRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGl0bGVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVtcHR5RWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2cyOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRFbGVtZW50TmFtZUVycm9yMV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkRWxlbWVudE5hbWVFcnJvcjJfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEVsZW1lbnROYW1lRXJyb3IzX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkRWxlbWVudE5hbWVFcnJvcjRfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9Db25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub0RlbGl2ZXJ5UHJvY2Vzc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vRGVmYXVsdENvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vQmFzZVByb2Nlc3NFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVQcm9jZXNzRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlRWxlbWVudEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUVsZW1lbnRFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3Jfc2ltcGxlX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZG9Db21tYW5kRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBkYXRlX291dG9mc3luY2hfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBkYXRlX291dG9mc3luY2hfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfbXNnV2l0aERldGFpbHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdXBwcmVzc2lvbl9uYW1lRHVwbGljYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdXBwcmVzc2lvbl9wcmVzZW50YXRpb25OYW1lRHVwbGljYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlUHJvY2Vzc0Vycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlRmlsZUVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURyb3BDb21tYW5kX2RlZXBDb3B5X3Byb21wdENvbmZpZ3VyYXRpb25Nc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGluZ1Byb2Nlc3NDb21wb25lbnRUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzaW5nUmVmZXJlbmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2luZ1JlZmVyZW5jZXNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tBZmZlY3RlZFJlc291cmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmluZ1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmluZ0ZpbGVzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weWluZ1Jlc291cmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ0ZpbGVUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVQcm9jZXNzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250cmlidXRlc1RvX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhbENvbnRyaWJ1dGVzVG9fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuZHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhbFJlcGxhY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50VHlwZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250cmlidXRlVG9BY3Rpdml0eV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEcm9wQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VBY3Rpdml0eV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlyZWN0b3J5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnJlc29sdmVkX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhc3Npc3RzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmtub3duX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21tYW5kX2RvbmU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eXdpdGhwbHVnaW5faW5mbzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5X2luZm87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9yZWZfZGVsZXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfcmVmX2RlbGV0ZTI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9yZWZlcmVuY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfd29ya3Byb2R1Y3RfZGVzY3JpcHRvcl9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vcHRpb25zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX291dHB1dGxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX2RlbGV0ZV90YXNrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2RlZmF1bHRjb25maWdjaGVjazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9nZW5lcmljRXJyX21lc3NhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fbm9EZXNjcmlwdG9yVG9TeW5jaDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl91bmhhbmRsZWRfZXhjZXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9icmVha2Rvd25fZWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93cGxpc3RkbGdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dvcmtwcm9kdWN0czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfc3ViX2VsZW1lbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2Vycl93cm9uZ19lbGVtZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9lcnJfY2hpbGRfZWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX2Fzc29jaWF0aW9uX3Rhc2tfc2VsZWN0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9jaGlsZGFkYXB0ZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2Vycl9zZXRwYXJlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX3RuZ3V0aWxfY2Fubm90X2VkaXRfcmVzb3VyY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2NvbnRyaWJ1dGVzdG87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NfZXh0ZW5kczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NfcmVwbGFjZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzX2xvY2FsUmVwbGFjZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lZ3JvdXBpbmdzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfd2hpdGVwYXBlcnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c190b29sbWVudG9yc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcm9sZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c190YXNrc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3JldXNhYmxlYXNzZXRzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfYWxsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcHJvY2Vzc2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcHJhY3RpY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2d1aWRlbGluZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2d1aWRhbmNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRwYWNrYWdlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c190YXNrZGVzY3JpcHRvcnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19jb250ZW50ZWxlbWVudHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdGRlc2NyaXB0b3JzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19jdXN0b21jYXRlZ29yaWVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3R0eXBlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19tZXRob2RwbHVnaW5zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VySW50ZXJhY3Rpb25IZWxwZXJfbG9ja2VkUGx1Z2luOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19yb2FkbWFwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbnVhbFN5bmNocm9uaXplQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfc3VjZXNzZnVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bmNocm9uaXplQ29tcGxldGVEaWFsb2dfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0VsZW1lbnRfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZF9NZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydFR5cGVfTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0VHlwZV9NYW51YWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0VHlwZV9BbHBoYWJldGljOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRUeXBlX1JldmVyc2VBbHBoYWJldGljOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRUeXBlX01ldGhvZFR5cGU7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9QbHVnaW5VSVBhY2thZ2VDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZTgxZjQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9QbHVnaW5VSVBhY2thZ2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi0vKioKLSAqIFN0b3JlcyAoaW4gbWVtb3J5IG9ubHkpIHRoZSBGbGF0L0hpZXJhcmNoaWNhbCBwbHVnaW4tcGFja2FnZSBsYXlvdXQKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblVJUGFja2FnZUNvbnRleHQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGx1Z2luVUlQYWNrYWdlQ29udGV4dCBJTlNUQU5DRSA9IG5ldyBQbHVnaW5VSVBhY2thZ2VDb250ZXh0KCk7IAotCi0JcHJpdmF0ZSBib29sZWFuIGlzRmxhdExheW91dCA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElFUkFSQ0hJQ0FMX0xBWU9VVD0gImhpZXJhcmNoaWNhbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFUX0xBWU9VVD0gImZsYXQiOyAvLyROT04tTkxTLTEkCi0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZsYXRMYXlvdXQoKSB7Ci0JCXJldHVybiBpc0ZsYXRMYXlvdXQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRvZ2dsZUxheW91dCgpIHsKLQkJaXNGbGF0TGF5b3V0ID0gIWlzRmxhdExheW91dDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYXlvdXRBc1N0cmluZygpIHsKLQkJaWYgKGlzRmxhdExheW91dCgpKSB7Ci0JCQlyZXR1cm4gRkxBVF9MQVlPVVQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gSElFUkFSQ0hJQ0FMX0xBWU9VVDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXRIaWVyYXJjaGljYWwoKSB7Ci0JCWlzRmxhdExheW91dCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExheW91dEZsYXQoKSB7Ci0JCWlzRmxhdExheW91dCA9IHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1ByZXNlbnRhdGlvbkNvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9QcmVzZW50YXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyM2Y5YjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1ByZXNlbnRhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzLlR5cGVDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDcsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVzZW50YXRpb25Db250ZXh0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByZXNlbnRhdGlvbkNvbnRleHQgSU5TVEFOQ0UgPSBuZXcgUHJlc2VudGF0aW9uQ29udGV4dCgpOyAKLQotCXByaXZhdGUgYm9vbGVhbiBzaG93UHJlc2VudGF0aW9uTmFtZXMgPSBmYWxzZTsKLQlwcml2YXRlIENvbXBhcmF0b3IgY29tcGFyYXRvciA9IENvbXBhcmF0b3JzLkRFRkFVTFRfQ09NUEFSQVRPUjsKLQlwcml2YXRlIENvbXBhcmF0b3IgcmV2ZXJzZUNvbXBhcmF0b3IgPSBDb21wYXJhdG9ycy5SRVZFUlNFX0RFRkFVTFRfQ09NUEFSQVRPUjsKLQlwcml2YXRlIENvbXBhcmF0b3IgbWV0aG9kRWxlbWVudFR5cGVDb21wYXJhdG9yID0gQ29tcGFyYXRvcnMuTUVUSE9EX1RZUEVfQ09NUEFSQVRPUjsKLQkKLQkKLQlwcml2YXRlIENvbXBhcmF0b3IgZ3VpZGFuY2VUeXBlQ29tcGFyYXRvciA9IG5ldyBUeXBlQ29tcGFyYXRvcigpIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9ycy5UeXBlQ29tcGFyYXRvciNnZXREZWZhdWx0Q29tcGFyYXRvcigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvciBnZXREZWZhdWx0Q29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBjb21wYXJhdG9yOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGludCBnZXRPcmRlcklkKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCWludCBpZCA9ICgoR3VpZGFuY2UpIG9iaikuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCk7Ci0JCQkJaWYgKGlkID09IFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OKSB7Ci0JCQkJCWlkID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQkJfQotCQkJCXJldHVybiBpZDsKLQkJCX0KLQkJCXJldHVybiAtMTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIENvbXBhcmF0b3IgcHJvY2Vzc1BhY2thZ2VDb21wYXJhdG9yID0gbmV3IFR5cGVDb21wYXJhdG9yKCkgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzLlR5cGVDb21wYXJhdG9yI2dldERlZmF1bHRDb21wYXJhdG9yKCkKLQkJICovCi0JCXByb3RlY3RlZCBDb21wYXJhdG9yIGdldERlZmF1bHRDb21wYXJhdG9yKCkgewotCQkJcmV0dXJuIGNvbXBhcmF0b3I7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBpbnQgZ2V0T3JkZXJJZChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCXJldHVybiAtMTsKLQkJfQotCX07Ci0KLQotCQotCXByaXZhdGUgUHJlc2VudGF0aW9uQ29udGV4dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dQcmVzZW50YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIHNob3dQcmVzZW50YXRpb25OYW1lczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaG93UHJlc2VudGF0aW9uTmFtZXMoYm9vbGVhbiBzaG93UHJlc2VudGF0aW9uTmFtZXMpIHsKLQkJdGhpcy5zaG93UHJlc2VudGF0aW9uTmFtZXMgPSBzaG93UHJlc2VudGF0aW9uTmFtZXM7Ci0JCWNvbXBhcmF0b3IgPSBzaG93UHJlc2VudGF0aW9uTmFtZXMgPyBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SIDogQ29tcGFyYXRvcnMuREVGQVVMVF9DT01QQVJBVE9SOwotCQlyZXZlcnNlQ29tcGFyYXRvciA9IHNob3dQcmVzZW50YXRpb25OYW1lcyA/IENvbXBhcmF0b3JzLlJFVkVSU0VfUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUiA6IENvbXBhcmF0b3JzLlJFVkVSU0VfREVGQVVMVF9DT01QQVJBVE9SOwotCQltZXRob2RFbGVtZW50VHlwZUNvbXBhcmF0b3IgPSBzaG93UHJlc2VudGF0aW9uTmFtZXMgPyBDb21wYXJhdG9ycy5NRVRIT0RfVFlQRV9QUkVTX05BTUVfQ09NUEFSQVRPUiA6IENvbXBhcmF0b3JzLk1FVEhPRF9UWVBFX0NPTVBBUkFUT1I7Ci0JfQotCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0Q29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIGNvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0UmV2ZXJzZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiByZXZlcnNlQ29tcGFyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRHdWlkYW5jZVR5cGVDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gZ3VpZGFuY2VUeXBlQ29tcGFyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRQcm9jZXNzUGFja2FnZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBwcm9jZXNzUGFja2FnZUNvbXBhcmF0b3I7Ci0JfQotCQotCXB1YmxpYyBDb21wYXJhdG9yIGdldE1ldGhvZEVsZW1lbnRUeXBlQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRUeXBlQ29tcGFyYXRvcjsKLQl9Ci0JCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0UHJlc05hbWVDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUjsKLQl9Ci0KLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRQcmVzTmFtZVJldmVyc2VDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gQ29tcGFyYXRvcnMuUkVWRVJTRV9QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SOwotCX0KLQkKLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRQcmVzTmFtZU1ldGhvZEVsZW1lbnRUeXBlQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIENvbXBhcmF0b3JzLk1FVEhPRF9UWVBFX1BSRVNfTkFNRV9DT01QQVJBVE9SOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Byb3ZpZGVycy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Byb3ZpZGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOTMwMDY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9Qcm92aWRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb3ZpZGVycyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBJQ29uZmlndXJhdG9yRmFjdG9yeSBjb25maWd1cmF0b3JGYWN0b3J5OwotCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmU7Ci0KLQlwcml2YXRlIHN0YXRpYyBBYnN0cmFjdFBsdWdpbiBhdXRob3JpbmdQbHVnaW47Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgY29tbWFuZFR5cGVUb0xpc3RlbmVyc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIFByb3ZpZGVycygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDb25maWd1cmF0b3JGYWN0b3J5IGdldENvbmZpZ3VyYXRvckZhY3RvcnkoKSB7Ci0JCXJldHVybiBjb25maWd1cmF0b3JGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb25maWd1cmF0b3JGYWN0b3J5KAotCQkJSUNvbmZpZ3VyYXRvckZhY3RvcnkgY29uZmlndXJhdG9yRmFjdG9yeSkgewotCQlQcm92aWRlcnMuY29uZmlndXJhdG9yRmFjdG9yeSA9IGNvbmZpZ3VyYXRvckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKSB7Ci0JCXJldHVybiBjb25maWd1cmF0aW9uQXBwbGljYXRvcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoCi0JCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlndXJhdGlvbkFwcGxpY2F0b3IpIHsKLQkJUHJvdmlkZXJzLmNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yID0gY29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIHByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJlZmVyZW5jZVN0b3JlKElQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlKSB7Ci0JCVByb3ZpZGVycy5wcmVmZXJlbmNlU3RvcmUgPSBwcmVmZXJlbmNlU3RvcmU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBYnN0cmFjdFBsdWdpbiBnZXRBdXRob3JpbmdQbHVnaW4oKSB7Ci0JCXJldHVybiBhdXRob3JpbmdQbHVnaW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEF1dGhvcmluZ1BsdWdpbihBYnN0cmFjdFBsdWdpbiBwbHVnaW4pIHsKLQkJYXV0aG9yaW5nUGx1Z2luID0gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckNvbW1hbmRMaXN0ZW5lcihJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCUxpc3QgbGlzdGVuZXJzID0gKExpc3QpIGNvbW1hbmRUeXBlVG9MaXN0ZW5lcnNNYXAuZ2V0KGxpc3RlbmVyCi0JCQkJLmdldENvbW1hbmRUeXBlKCkpOwotCQlpZiAobGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNvbW1hbmRUeXBlVG9MaXN0ZW5lcnNNYXAucHV0KGxpc3RlbmVyLmdldENvbW1hbmRUeXBlKCksIGxpc3RlbmVycyk7Ci0JCX0gZWxzZSBpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVDb21tYW5kTGlzdGVuZXIoSUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlMaXN0IGxpc3RlbmVycyA9IChMaXN0KSBjb21tYW5kVHlwZVRvTGlzdGVuZXJzTWFwLmdldChsaXN0ZW5lcgotCQkJCS5nZXRDb21tYW5kVHlwZSgpKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCWlmIChsaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQkJY29tbWFuZFR5cGVUb0xpc3RlbmVyc01hcC5yZW1vdmUobGlzdGVuZXIuZ2V0Q29tbWFuZFR5cGUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q29tbWFuZExpc3RlbmVycyhDbGFzcyBjb21tYW5kVHlwZSkgewotCQlyZXR1cm4gKExpc3QpIGNvbW1hbmRUeXBlVG9MaXN0ZW5lcnNNYXAuZ2V0KGNvbW1hbmRUeXBlKTsKLQl9Ci0KLQlzdGF0aWMgewotCQkvLyByZWdpc3RlciBjb21tYW5kIGxpc3RlbmVycyB0aGF0IGhhdmUgYmVlbiBjb250cmlidXRlZCB2aWEgZXh0ZW5zaW9uIHBvaW50IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZExpc3RlbmVycwotCQkvLwotCQl0cnkgewotCQkJU3RyaW5nIG5hbWVzcGFjZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpOwotCQkJU3RyaW5nIGV4dGVuc2lvblBvaW50TmFtZSA9ICJjb21tYW5kTGlzdGVuZXJzIjsgLy8kTk9OLU5MUy0xJAotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KG5hbWVzcGFjZSwgZXh0ZW5zaW9uUG9pbnROYW1lKTsKLQkJCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJT2JqZWN0IGV4dCA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCQlpZihleHQgaW5zdGFuY2VvZiBJQ29tbWFuZExpc3RlbmVyKSB7Ci0JCQkJCQkJCQlyZWdpc3RlckNvbW1hbmRMaXN0ZW5lcigoSUNvbW1hbmRMaXN0ZW5lcikgZXh0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmI5YjI2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBHZW5lcmljIERpYWxvZyBUaXRsZXMKLW1vdmVEaWFsb2dfdGl0bGU9TW92ZQotZGVsZXRlRGlhbG9nX3RpdGxlPURlbGV0ZSBFbGVtZW50Ci1lcnJvckRpYWxvZ190aXRsZT1FcnJvcgotZXJyb3JEaWFsb2dfY2Fubm90UmVuYW1lPUNhbm5vdCByZW5hbWUgezB9ICcnezF9JycgdG8gJyd7Mn0nJy4gUmVzb2x2ZSB0aGUgaXNzdWUgc2hvd24gaW4gRGV0YWlscyBhbmQgY2xpY2sgT0sgdG8gY29udGludWUgb3IgQ2FuY2VsIHRvIGFib3J0IHRoaXMgb3BlcmF0aW9uLgotCi0jIENvbmZpcm0gUmVmZXJlbmNlcyBSZW1vdmFsIERpYWxvZwotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190aXRsZT1Db25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbAotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190ZXh0PVRoZSBlbGVtZW50KHMpIHlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIGFyZSBzdGlsbCBiZWluZyByZWZlcmVuY2VkIGJ5IG90aGVyIGVsZW1lbnRzIGluIHRoZSBtZXRob2QgbGlicmFyeS4gRGVsZXRpbmcgdGhlc2UgZWxlbWVudHMgd2lsbCByZW1vdmUgcmVmZXJlbmNlcyB0byB0aGVtLCB0aGVyZWZvcmUsIHdpbGwgdXBkYXRlIHRoZSByZWZlcnJpbmcgZWxlbWVudHMgYXMgd2VsbC4gIE1ha2Ugc3VyZSB5b3UgaGF2ZSBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgcmVmZXJyaW5nIGVsZW1lbnRzIGJlZm9yZSBjbGlja2luZyBPSy4gIENsaWNrIERldGFpbHMgdG8gcmV2aWV3IHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlIHRoZSBlbGVtZW50KHMpIHRoYXQgeW91IGFyZSBhYm91dCB0byBkZWxldGUuCi0KLSMgUmVzb2x2ZSBOYW1lIENvbmZsaWN0IERpYWxvZwotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZT1SZXNvbHZlIEVsZW1lbnQgTmFtZSBDb25mbGljdAotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0PUVudGVyIGEgbmV3IHswfSBmb3IgJyd7MX0nJzoKLQotIyBTZWxlY3QgRGVsaXZlcmFibGVzIERpYWxvZwotc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RpdGxlPVNlbGVjdCBEZWxpdmVyYWJsZXMKLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190ZXh0PVNlbGVjdCBhIGRlbGl2ZXJhYmxlIHdoZXJlIHlvdSB3YW50IHdvcmsgcHJvZHVjdCAnJ3swfScnIHRvIGJlIGFzc2lnbmVkLgotCi0jIE5ldyBQcm9jZXNzIENvbXBvbmVudCBEaWFsb2cKLW5ld1Byb2Nlc3NDb21wb25lbnREaWFsb2dfdGl0bGU9TmV3IFByb2Nlc3MgQ29tcG9uZW50Ci1uYW1lTGFiZWxfdGV4dD1OYW1lOgotZGVmYXVsdENvbmZpZ0xhYmVsX3RleHQ9RGVmYXVsdCBDb25maWd1cmF0aW9uOgotYmFzZVByb2Nlc3NMYWJlbF90ZXh0PUJhc2UgUHJvY2VzczoKLWJhc2VkT25Qcm9jZXNzZXNMYWJlbF90ZXh0PUJhc2VkIG9uIFByb2Nlc3NlczoKLQotIyBSb2xlIEFzc29jaWF0aW9uIERpYWxvZwotc2VsZWN0QXNzb2NpYXRpb25MYWJlbF90ZXh0PVNlbGVjdCBhc3NvY2lhdGlvbiBmb3IgdGhlIHRhc2sgJyd7MH0nJwotCi0jIFJlbW92ZSBBc3NvY2lhdGlvbiBkaWFsb2cKLXJlbW92ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ9UmVtb3ZlIEFzc29jaWF0aW9uCi0KLSMgU2VsZWN0IFRlYW1zIERpYWxvZwotc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGU9U2VsZWN0IFRlYW1zCi1zZWxlY3RUZWFtc0RpYWxvZ190ZXh0PVNlbGVjdCBhIHRlYW0gd2hlcmUgeW91IHdhbnQgYSByb2xlICcnezB9JycgdG8gYmUgYXNzaWduZWQuCi0KLSMgVGFzbCBTZWxlY3Rpb24gRGlhbG9nCi10YXNrU2VsZWN0aW9uRGlhbG9nX3RpdGxlPVRhc2sgU2VsZWN0aW9uCi10aXRsZUxhYmVsX3RleHQ9U2VsZWN0IHRhc2tzLi4KLQotIyBFcnJvciBNZXNzYWdlcwotZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMEU6IFRoZSB7MH0gbmFtZSBpcyBtaXNzaW5nLlxuXG5BbGwgbWV0aG9kIGFuZCBwcm9jZXNzIGVsZW1lbnRzIG11c3QgaGF2ZSBhIG5hbWUuXG5cbkVudGVyIGEgdmFsaWQgbmFtZSBhbmQgdHJ5IGFnYWluLgotZW1wdHlFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9VGhlIG5hbWUgY2Fubm90IGJlIGVtcHR5LiBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG5hbWUuCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMUU6IFRoZSBuYW1lICcnezB9JycgYWxyZWFkeSBleGlzdHMuIFxuXG5BIG1ldGhvZCBlbGVtZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLlxuXG5FbnRlciBhIGRpZmZlcmVudCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZzI9RW50ZXIgYSBkaWZmZXJlbnQgbmFtZSBhbmQgdHJ5IGFnYWluLgotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPVRoZSBzYW1lIGVsZW1lbnQgbmFtZSBhbHJlYWR5IGV4aXRzLiBQbGVhc2Ugc3BlY2lmeSBhbm90aGVyIG5hbWUuCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjFfbXNnPUlVUEwwMTAyRTogVGhlIG5hbWUgJyd7MH0nJyBpcyBpbnZhbGlkLlxuXG5BIG1ldGhvZCBlbGVtZW50IG5hbWUgY2Fubm90IHN0YXJ0IHdpdGggYSBzcGFjZS5cblxuRW50ZXIgYSB2YWxpZCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjJfbXNnPUlVUEwwMTAzRTogVGhlIG5hbWUgJyd7MH0nJyBpcyBpbnZhbGlkLlxuXG5BIG1ldGhvZCBlbGVtZW50IG5hbWUgY2Fubm90IGVuZCB3aXRoIGEgcGVyaW9kLlxuXG5FbnRlciBhIHZhbGlkIG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2c9SVVQTDAxMDRFOiBUaGUgbmFtZSAnJ3swfScnIGlzIGludmFsaWQuXG5cbkEgbWV0aG9kIGVsZW1lbnQgbmFtZSBjYW5ub3QgY29udGFpbiB0aGVzZSBjaGFyYWN0ZXJzOiBcXCAvIDogKiA/ICIgPCA+IDsgfFxuXG5FbnRlciBhIHZhbGlkIG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWludmFsaWRFbGVtZW50TmFtZUVycm9yNF9tc2c9SVVQTDAxMDVFOiBUaGUgbmFtZSAnJ3swfScnIGlzIGludmFsaWQuXG5cbkEgbWV0aG9kIGVsZW1lbnQgbmFtZSBjYW5ub3QgY29udGFpbiB0aGUgY2hhcmFjdGVyOiAmICYgXG5cbkVudGVyIGEgdmFsaWQgbmFtZSBhbmQgdHJ5IGFnYWluLgotbm9Db25maWdFcnJvcl9tc2c9SVVQTDAxMDVFOiBUaGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBkb2VzIG5vdCBjb250YWluIGFueSBtZXRob2QgY29uZmlndXJhdGlvbi5cblxuQSBtZXRob2QgY29uZmlndXJhdGlvbiBpcyBuZWVkZWQgdG8gY3JlYXRlIGEgbmV3IHByb2Nlc3MuXG5cbkNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGFuZCB0cnkgYWdhaW4uCi1ub0RlbGl2ZXJ5UHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwNkU6IFRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGRvZXMgbm90IGNvbnRhaW4gYW55IGRlbGl2ZXJ5IHByb2Nlc3MuXG5cbkEgYmFzZSBkZWxpdmVyeSBwcm9jZXNzIGlzIG5lZWRlZCB0byBjcmVhdGUgYSBuZXcgcHJvY2VzcyBjb250cmlidXRpb24uXG5cbkNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MgYW5kIHRyeSBhZ2Fpbi4KLW5vRGVmYXVsdENvbmZpZ0Vycm9yX21zZz1JVVBMMDEwN0U6IE5vIG1ldGhvZCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHNlbGVjdGVkLlxuXG5BIGRlZmF1bHQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBhc3NpZ25lZCB0byB0aGUgbmV3IHByb2Nlc3MuXG5cblNlbGVjdCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGFuZCB0cnkgYWdhaW4uCi1ub0Jhc2VQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA4RTogTm8gZGVsaXZlcnkgcHJvY2VzcyBoYXMgYmVlbiBzZWxlY3RlZC5cblxuQSBwcm9jZXNzIGNvbnRyaWJ1dGlvbiByZXF1aXJlcyBhIGJhc2UgZGVsaXZlcnkgcHJvY2Vzcy5cblxuU2VsZWN0IGEgZGVsaXZlcnkgcHJvY2VzcyBhbmQgdHJ5IGFnYWluLgotY3JlYXRlUHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwOUU6IFRoZSBwcm9jZXNzIGNhbm5vdCBiZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KLWNyZWF0ZUVsZW1lbnRFcnJvcl9tc2c9SVVQTDAxMTBFOiBUaGUgZWxlbWVudCBjYW5ub3QgYmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCi1kZWxldGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTExRTogVGhlIGVsZW1lbnQgY2Fubm90IGJlIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LgotZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9tc2c9SVVQTDAxMTJFOiBUaGUgY29udGVudCBmaWxlIGZvciB0aGUgZWxlbWVudCBjYW5ub3QgYmUgY3JlYXRlZCBvciByZW5hbWVkIHRvIG1hdGNoIHRoZSBlbGVtZW50IG5hbWUuXG5cbkEgZmlsZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzLlxuXG5FbnRlciBhIGRpZmZlcmVudCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c9QSBjb250ZW50IGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGV4aXRzLiBQbGVhc2Ugc3BlY2lmeSBhbm90aGVyIG5hbWUuCi11bmRvQ29tbWFuZEVycm9yX21zZz1JVVBMMDExM0U6IFRoZSB1bmRvIGNvbW1hbmQgJyd7MH0nJyBjYW5ub3QgYmUgY29tcGxldGVkLlxuXG5BbiBlcnJvciBoYXMgb2NjdXJyZWQ6IHsxfQotaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnPUlVUEwwMTE0RTogVGhlIHNwZWNpZmllZCBwcmVkZWNlc3NvciBpbmRleCBpcyBpbnZhbGlkLlxuXG5BIHByZWRlY2Vzc29yIGluZGV4IG11c3QgYmUgYW4gaW50ZWdlciB2YWx1ZSBmcm9tIHRoZSAnSW5kZXgnIGNvbHVtbi5cblxuU3BlY2lmeSBhIHZhbGlkIHZhbHVlIGFuZCB0cnkgYWdhaW4uCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzPUlVUEwwMTAwVzogJyd7MH0nJyBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgdG8gJyd7MX0nJy4gIE9ubHkgb25lIGFzc29jaWF0aW9uIG9mIHRoaXMga2luZCBpcyBhbGxvd2VkLiAgVG8gYXNzaWduICcnezB9JycgdG8gJyd7Mn0nJyB5b3UgbmVlZCB0byBmaXJzdCByZW1vdmUgaXQgZnJvbSAnJ3sxfScnLgotZXJyb3JfbXNnV2l0aERldGFpbHM9SVVQTDAxMTZFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQuIENsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1lcnJvcl9tc2c9SVVQTDAxMTdFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQuIFNlZSBlcnJvciBsb2cgZm9yIG1vcmUgZGV0YWlscy4KLVN1cHByZXNzaW9uX25hbWVEdXBsaWNhdGlvbj1JVVBMMDExOEU6IE5hbWUgY29uZmxpY3Qgd2lsbCBvY2N1ciBhZnRlciB0aGlzIG9wZXJhdGlvbi4gQ2hlY2sgZWxlbWVudCdzIG5hbWUgZm9yIGR1cGxpY2F0aW9uIGFuZCB0cnkgYWdhaW4KLVN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbj1JVVBMMDExOUU6IE5hbWUgY29uZmxpY3Qgd2lsbCBvY2N1ciBhZnRlciB0aGlzIG9wZXJhdGlvbi4gQ2hlY2sgZWxlbWVudCdzIHByZXNlbnRhdGlvbiBuYW1lIGZvciBkdXBsaWNhdGlvbiBhbmQgdHJ5IGFnYWluCi0KLSMgRXJyb3IgUmVhc29ucwotZXJyb3JfcmVhc29uPUFuIGVycm9yIGhhcyBvY2N1cnJlZC4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLXNhdmVQcm9jZXNzRXJyb3JfcmVhc29uPUFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgdGhlIHByb2Nlc3MgJyd7MH0nJy4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb249QW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIHJlbW92aW5nIHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudC4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLXNhdmVGaWxlRXJyb3JfcmVhc29uPUFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgdGhlIGZpbGUgJyd7MH0nJy4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uPURldGVjdGVkIG1ldGhvZCBlbGVtZW50cyB3aXRoIGludmFsaWQgcmVmZXJlbmNlcyBhcyBhIHJlc3VsdCBvZiBjcm9zcy1wbHVnaW4gY29weS5cblRoZXNlIHJlZmVyZW5jZXMgd2lsbCBiZSByZW1vdmVkLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLXVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb249Q2Fubm90IG1vZGlmeSBhbiB1bnJlc29sdmVkIG9iamVjdDogezB9KFVSSSA9IHsxfSl7Mn0KLQotIyBXYXJuaW5nIG1lc3NhZ2VzCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMThXOiBDb3VsZCBub3QgZmluZCBvbmUgb3IgbW9yZSBzb3VyY2UgZWxlbWVudHMuIEFzc29jaWF0ZWQgZmlsZXMgaW4gdGhlIHJlc291cmNlcyBmb2xkZXIgd2lsbCBub3QgYmUgY29waWVkLgotQWN0aXZpdHlBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZz1JVVBMMDExOVc6IENvdWxkIG5vdCBmaW5kIG9uZSBvciBtb3JlIHNvdXJjZSBlbGVtZW50cy4gQXNzb2NpYXRlZCBQcm9jZXNzIFBhY2thZ2VzIHdpbGwgbm90IGJlIGNvcGllZC4KLUFjdGl2aXR5RHJvcENvbW1hbmRfZGVlcENvcHlfcHJvbXB0Q29uZmlndXJhdGlvbk1zZz1EbyB5b3Ugd2FudCB0byBjb3B5IGFsbCBkZXNjcmlwdG9ycz9cblxuQ2xpY2tpbmcgb24gTm8gd2lsbCBjb3B5IG9ubHkgdGhlIGRlc2NyaXB0b3JzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLWRlZXBDb3B5X3Byb21wdE1zZz1Zb3Ugd2lsbCBnZXQgYSBjb3B5IG9mIGFsbCBkeW5hbWljYWxseSBsaW5rZWQgZWxlbWVudHMgdGhhdCB5b3UgbmVlZCB0byBtYWludGFpbiBzZXBhcmF0ZWx5IGZyb20gbm93IG9uLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLWRlZXBDb3B5X3RpdGxlPURlZXAgQ29weQotCi0jIFByb2dyZXNzIG1lc3NhZ2VzCi1jcmVhdGluZ1Byb2Nlc3NDb21wb25lbnRUYXNrX25hbWU9Q3JlYXRpbmcgcHJvY2VzcyBjb21wb25lbnQgJyd7MH0nJy4uLgotcHJvY2Vzc2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9UHJvY2Vzc2luZyByZWZlcmVuY2VzLi4uCi1kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lPURlbGV0aW5nIGVsZW1lbnRzIGFuZCBhc3NvY2lhdGVkIGZpbGVzLi4uCi1jaGVja2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9Q2hlY2tpbmcgZm9yIHJlZmVyZW5jZXMuLi4KLXJlbW92aW5nUmVmZXJlbmNlc3Rhc2tfbmFtZT1SZW1vdmluZyByZWZlcmVuY2VzLi4uCi1zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lPVNhdmluZyBtb2RpZmllZCBmaWxlKHMpLi4uCi1jaGVja0FmZmVjdGVkUmVzb3VyY2VzVGFza19uYW1lPUNoZWNraW5nIGFmZmVjdGVkIHJlc291cmNlcy4uLgotbW92aW5nVGFza19uYW1lPU1vdmluZy4uLgotbW92aW5nRmlsZXNUYXNrX25hbWU9TW92aW5nIGZpbGVzLi4uCi1jb3B5aW5nUmVzb3VyY2VzVGFza19uYW1lPUNvcHlpbmcgcmVzb3VyY2VzLi4uCi1jb3B5aW5nQWN0aXZpdGllc19tc2c9Q29weWluZyBhY3Rpdml0eSAnJ3swfScnCi1zYXZpbmdGaWxlVGFza19uYW1lPVNhdmluZyBmaWxlICcnezB9JycuLi4KLQotIyBVSSBUZXh0Ci1lbGVtZW50X3RleHQ9ZWxlbWVudAotY3JlYXRlRWxlbWVudF90ZXh0PUNyZWF0ZSBFbGVtZW50Ci1jcmVhdGVQcm9jZXNzX3RleHQ9Q3JlYXRlIFByb2Nlc3MKLWNvbnRyaWJ1dGVzVG9fdGV4dD1Db250cmlidXRlcyB0bwotbG9jYWxDb250cmlidXRlc1RvX3RleHQ9TG9jYWxseSBDb250cmlidXRlcyB0bwotZXh0ZW5kc190ZXh0PUV4dGVuZHMKLXJlcGxhY2VzX3RleHQ9UmVwbGFjZXMKLWxvY2FsUmVwbGFjZXNfdGV4dD1Mb2NhbGx5IFJlcGxhY2VzCi1sb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHlfdGV4dD1Mb2NhbCBSZXBsYWNlbWVudCBhbmQgRGVlcCBDb3AmeQotZWxlbWVudFR5cGVfdGV4dD17MH06IHsxfQotZGVsaXZlcmFibGVzX3RleHQ9RGVsaXZlcmFibGVzCi1jb250cmlidXRlVG9BY3Rpdml0eV90ZXh0PUNvbnRyaWJ1dGUgVG8gQWN0aXZpdHkKLUFjdGl2aXR5RHJvcENvbW1hbmRfbGFiZWw9RHJvcCBBY3Rpdml0eQotcmVwbGFjZUFjdGl2aXR5X3RleHQ9UmVwbGFjZSBBY3Rpdml0eQotZmlsZV90ZXh0PWZpbGUKLWRpcmVjdG9yeV90ZXh0PWRpcmVjdG9yeQotdW5yZXNvbHZlZF90ZXh0PSh1bnJlc29sdmVkICcnezB9JycpCi1hc3Npc3RzX3RleHQ9QXNzaXN0cwotdW5rbm93bl90ZXh0PVVua25vd24KLWNvbW1hbmRfZG9uZT1Eb25lCi0KLSMgVGhlIGZvbGxvd2luZyBVSSB0ZXh0IHNob3VsZCBiZSByZXZpZXdlZC4KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5d2l0aHBsdWdpbl9pbmZvPXswfSAoezF9ICcnezJ9JycgaW4gJyd7M30nJykKLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5X2luZm89ezB9ICh7MX0gJyd7Mn0nJykKLXVpX3JlZl9kZWxldGU9VGhlIGRlc2NyaXB0b3IgJyd7MH0nJyBoYXMgdGhlIGZvbGxvd2luZyByZWZlcmVuY2VzIHdoaWNoIGFyZSBub3QgdXNlZCBhbnl3aGVyZS5cblNlbGVjdCB0aGUgb25lcyB3aGljaCB5b3Ugd291bGQgbGlrZSB0byBkZWxldGU6Ci11aV9yZWZfZGVsZXRlMj1UaGVzZSBmb2xsb3dpbmcgcmVmZXJlbmNlcyBhcmUgbm90IGJlaW5nIHVzZWQgYW55d2hlcmUuXG5TZWxlY3QgdGhlIG9uZXMgd2hpY2ggeW91IHdvdWxkIGxpa2UgdG8gZGVsZXRlOgotdWlfcmVmZXJlbmNlcz1SZWZlcmVuY2VzCi11aV93b3JrcHJvZHVjdF9kZXNjcmlwdG9yX2Rlc2NyaXB0aW9uPVdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yICcnezB9JycgaXMgYXNzb2NpYXRlZCAoT3V0cHV0IEZyb20pIHdpdGggdGFzayBkZXNjcmlwdG9yICcnezF9JycKLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vcHRpb25zPU9wdGlvbnMKLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbD1SZW1vdmUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgb3V0cHV0IG9mIHRoZSB0YXNrIGRlc2NyaXB0b3IKLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9kZWxldGVfdGFzaz1EZWxldGUgdGFzayBkZXNjcmlwdG9yIGZyb20gdGhlIGFjdGl2aXR5Ci11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZGVmYXVsdGNvbmZpZ2NoZWNrPVRoZSBzZWxlY3RlZCBlbGVtZW50ICcnezB9JycgaXMgbm90IGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgeW91ciBwcm9jZXNzLlxuRG8geW91IHdhbnQgdG8gYWRkIGl0IGFuZCBpdHMgZGVwZW5kZW5jaWVzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24/Ci11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZ2VuZXJpY0Vycl9tZXNzYWdlX3RleHQ9RXJyb3JzIG9jY3VyZWQgaW4gdGhlIG9wZXJhdGlvbi4gQ2xpY2sgb24gZGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbgotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoPU5vIGRlc2NyaXB0b3Igd2l0aCBsaW5rZWQgbWV0aG9kIGVsZW1lbnQgZm91bmQgdG8gc3luY2hyb25pemUKLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXI9RXJyb3IgcmVmcmVzaGluZyB2aWV3ZXIKLWNvbmZpcm1fcmVtb3ZlX3JlZmVyZW5jZXNfdGV4dD1FbGVtZW50KHMpIGxpc3RlZCBpbiBEZXRhaWxzIG1pZ2h0IGhhdmUgaWxsZWdhbCByZWZlcmVuY2UgdG8gdGhpcyBndWlkYW5jZSBhZnRlciBjb252ZXJzaW9uLiBDbGljayBPSyB0byByZW1vdmUgdGhlbSBhbmQgY29udGludWUuCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl91bmhhbmRsZWRfZXhjZXB0aW9uPVVuaGFuZGxlZCBleGNlcHRpb24KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfYnJlYWtkb3duX2VsZW1lbnQ9Q2Fubm90IGhhdmUgdGhlIHNhbWUgYnJlYWtkb3duIGVsZW1lbnQgYXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvcgotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dwbGlzdGRsZ19tc2c9VGhlIHdvcmsgcHJvZHVjdCAnJ3swfScnIGlzIGFuIG91dHB1dCB0byB0aGUgZm9sbG93aW5nIHRhc2tzLlxuU2VsZWN0IHRoZSB0YXNrcyBmb3Igd2hpY2ggeW91IHdvdWxkIGxpa2UgdG8gY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIGRlc2NyaXB0b3JzLgotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZz1UaGUgcm9sZSAnJ3swfScnIGhhcyB0aGUgZm9sbG93aW5nIHJlc3BvbnNpYmxlIHdvcmsgcHJvZHVjdHMuXG5TZWxlY3QgdGhlIHdvcmsgcHJvZHVjdHMgZm9yIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBkZXNjcmlwdG9ycy4KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyPUZhdGFsIGVycm9yCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd29ya3Byb2R1Y3RzPVdvcmsgUHJvZHVjdHMKLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfc3ViX2VsZW1lbnQ9Q2Fubm90IGxpbmsgYSBicmVha2Rvd24gZWxlbWVudCB0byBvbmUgb2YgaXRzIHN1YmVsZW1lbnQKLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3dyb25nX2VsZW1lbnQ9Q2Fubm90IGxpbmsgdG8gZWxlbWVudCBvdGhlciB0aGFuIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQuCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9jaGlsZF9lbGVtZW50PUNhbm5vdCBsaW5rIGEgYnJlYWtkb3duIGVsZW1lbnQgdG8gb25lIG9mIGl0cyBjaGlsZHJlbi4KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrcz1UYXNrcwotdWlfYXNzb2NpYXRpb25fdGFza19zZWxlY3Rpb249VGFzayBTZWxlY3Rpb24uLi4KLXV0aWxfUHJvY2Vzc1V0aWxfY2hpbGRhZGFwdGVyPVwgXCBjaGlsZCdzIGFkYXB0ZXI6Ci0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NldHBhcmVudD1Db3VsZCBub3Qgc2V0IHBhcmVudCBmb3IgY2hpbGQKLXV0aWxfdG5ndXRpbF9jYW5ub3RfZWRpdF9yZXNvdXJjZT1DYW5ub3QgZWRpdCByZXNvdXJjZS4KLXV0aWxfUHJvY2Vzc1V0aWxfY29udHJpYnV0ZXN0bz1jb250cmlidXRlcyB0byAnJ3swfScnCi11dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bz1sb2NhbGx5IGNvbnRyaWJ1dGVzIHRvICcnezB9JycKLXByb2Nlc3NfZXh0ZW5kcz1leHRlbmRzICcnezB9JycKLXByb2Nlc3NfcmVwbGFjZXM9cmVwbGFjZXMgJyd7MH0nJwotcHJvY2Vzc19sb2NhbFJlcGxhY2VzPWxvY2FsbHkgcmVwbGFjZXMgJyd7MH0nJwotIyBGaWx0ZXIgY29uc3RhbnRzIGV4dGVybmFsaXplZCBzdHJpbmdzLgotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVzX3RleHQ9RGlzY2lwbGluZXMKLUZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lZ3JvdXBpbmdzX3RleHQ9RGlzY2lwbGluZSBHcm91cGluZ3MKLUZpbHRlckNvbnN0YW50c193aGl0ZXBhcGVyc190ZXh0PVdoaXRlcGFwZXJzCi1GaWx0ZXJDb25zdGFudHNfdG9vbG1lbnRvcnNfdGV4dD1Ub29sIE1lbnRvcnMKLUZpbHRlckNvbnN0YW50c190b29sc190ZXh0PVRvb2xzCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNfdGV4dD1Sb2xlcwotRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ9VGFza3MKLUZpbHRlckNvbnN0YW50c19yZXVzYWJsZWFzc2V0c190ZXh0PVJldXNhYmxlIEFzc2V0cwotRmlsdGVyQ29uc3RhbnRzX2FsbF90ZXh0PUFsbAotRmlsdGVyQ29uc3RhbnRzX3Byb2Nlc3Nlc190ZXh0PVByb2Nlc3NlcwotRmlsdGVyQ29uc3RhbnRzX3ByYWN0aWNlc190ZXh0PVByYWN0aWNlcwotRmlsdGVyQ29uc3RhbnRzX3RlbXBsYXRlc190ZXh0PVRlbXBsYXRlcwotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0c190ZXh0PVdvcmsgUHJvZHVjdHMKLUZpbHRlckNvbnN0YW50c19jaGVja2xpc3RzX3RleHQ9Q2hlY2tsaXN0cwotRmlsdGVyQ29uc3RhbnRzX2d1aWRlbGluZXNfdGV4dD1HdWlkZWxpbmVzCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNldHNfdGV4dD1Sb2xlIFNldHMKLUZpbHRlckNvbnN0YW50c19ndWlkYW5jZV90ZXh0PUd1aWRhbmNlCi1GaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dD1Db25jZXB0cwotRmlsdGVyQ29uc3RhbnRzX2V4YW1wbGVzX3RleHQ9RXhhbXBsZXMKLUZpbHRlckNvbnN0YW50c19jb250ZW50cGFja2FnZXNfdGV4dD1Db250ZW50IFBhY2thZ2VzCi1GaWx0ZXJDb25zdGFudHNfcm9sZWRlc2NyaXB0b3JzX3RleHQ9Um9sZSBEZXNjcmlwdG9ycwotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dD1Sb2xlIFNldCBHcm91cGluZ3MKLUZpbHRlckNvbnN0YW50c190YXNrZGVzY3JpcHRvcnNfdGV4dD1UYXNrIERlc2NyaXB0b3JzCi1GaWx0ZXJDb25zdGFudHNfY29udGVudGVsZW1lbnRzX3RleHQ9Q29udGVudCBFbGVtZW50cwotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9wcmVwYXJlPVByZXBhcmluZyBzeW5jaHJvbml6YXRpb24uLi4KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdGRlc2NyaXB0b3JzX3RleHQ9V29yayBQcm9kdWN0IERlc2NyaXB0b3JzCi1GaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ9QWxsIENvbnRlbnQgRWxlbWVudHMKLUZpbHRlckNvbnN0YW50c19zdXBwb3J0aW5nbWF0ZXJpYWxzX3RleHQ9U3VwcG9ydGluZyBNYXRlcmlhbHMKLU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX2Vycm9yU2F2aW5nRmlsZXM9RXJyb3Igc2F2aW5nIGZpbGUocykKLUZpbHRlckNvbnN0YW50c19jdXN0b21jYXRlZ29yaWVzX3RleHQ9Q3VzdG9tIENhdGVnb3JpZXMKLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHR5cGVzX3RleHQ9V29yayBQcm9kdWN0IEtpbmRzCi1EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZF93YXJuaW5nTXNnPURlbGV0aW9uIGNvbXBsZXRlZCB3aXRoIHdhcm5pbmcKLUZpbHRlckNvbnN0YW50c19tZXRob2RwbHVnaW5zX3RleHQ9TWV0aG9kIFBsdWctaW5zCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfbG9ja2VkUGx1Z2luPUlVUEwwMTIwRTogVGhlIHBsdWdpbiAnJ3swfScnIGlzIGxvY2tlZC4KLUZpbHRlckNvbnN0YW50c19kb21haW5zX3RleHQ9RG9tYWlucwotRmlsdGVyQ29uc3RhbnRzX3JvYWRtYXBfdGV4dD1Sb2FkbWFwcwotRmlsdGVyQ29uc3RhbnRzX3JlcG9ydHNfdGV4dD1SZXBvcnRzCi1BdXRvU3luY2hyb25pemVDb21tYW5kX2xhYmVsPURlZmF1bHQgUyZ5bmNocm9uaXphdGlvbiBmcm9tIE1ldGhvZCBDb250ZW50Ci1NYW51YWxTeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9Q3VzdG9tIFN5bmNocm9uaSZ6YXRpb24uLi4KLVN5bmNocm9uaXplQ29tcGxldGVEaWFsb2dfVGl0bGU9U3luY2hyb25pemF0aW9uIENvbXBsZXRlCi1BdXRvU3luY2hyb25pemVDb21tYW5kX3N1Y2Vzc2Z1bD1TeW5jaHJvbml6YXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KLXNlbGVjdERlc2NyaXB0b3JzVG9EZWxldGVfbXNnPVRoZSBmb2xsb3dpbmcgZGVzY3JpcHRvcnMgYXJlIG5vdCB1c2VkIGFueXdoZXJlIGFmdGVyIGRlbGV0aW9uIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50cy5cblNlbGVjdCBkZXNjcmlwdG9ycyB5b3Ugd2FudCB0byBkZWxldGUuCi0KLUNyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kX01lc3NhZ2U9U3BlY2lmeSBuYW1lIGFuZCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB7MH0gdG8gYmUgY3JlYXRlZC4KLSMgVXNlckludGVyYWN0aW9uSGVscGVyCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZT1OYW1lOgotCi0jIE1ldGhvZENyZWF0ZUNoaWxkQ29tbWFuZAotbmV3RWxlbWVudF90ZXh0PU5ldyB7MH0KLXVwZGF0ZV9vdXRvZnN5bmNoX3RpdGxlPVVwZGF0ZSBjb25mbGljdAotdXBkYXRlX291dG9mc3luY2hfbXNnPVRoZSBmaWxlKHMpIGhhcyBiZWVuIGNoYW5nZWQgb24gdGhlIGZpbGUgc3lzdGVtLiBEbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhlIGNoYW5nZXM/Ci1kdXBsaWNhdGVGZWF0dXJlVmFsdWU9Q2Fubm90IGhhdmUgMiBlbGVtZW50cyB1bmRlciAnJ3swfScnIHdpdGggdGhlIHNhbWUgdmFsdWUgZm9yICcnezF9JycKLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPUNhbm5vdCBhcHBseSBhY3Rpdml0eSAnJ3swfScnIHRvIHRoZSBwcm9jZXNzICcnezF9Jycgc2luY2UgaXQgd2lsbCByZXN1bHQgaW4gY2lyY3VsYXIgZGVwZW5kZW5jeS4KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnMT1DYW5ub3QgYXBwbHkgYWN0aXZpdHkgJyd7MH0nJyB0byB0aGUgcHJvY2VzcyAnJ3sxfScnIHNpbmNlICcnezB9JycgYWxyZWFkeSBoYXMgb25lIG9yIG1vcmUgY29udHJpYnV0ZWQvcmVwbGFjZWQgYWN0aXZpdGllcyBhcyBpdHMgY2hpbGRyZW4uCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxPUFjdGl2aXR5ICcnezB9JycgY2Fubm90IHNldCB2YXJpYWJpbGl0eSB3aXRoIG9uZSBvZiBpdHMgZGlyZWN0IHBhcmVudC4KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzI9QWN0aXZpdHkgJyd7MH0nJyBjYW5ub3Qgc2V0IHZhcmlhYmlsaXR5IHdpdGggJyd7MX0nJyBzaW5jZSBpdCB3aWxsIHJlc3VsdCBpbiBjaXJjdWxhciBkZXBlbmRlbmN5LgotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMz1DYW5ub3QgcmVwbGFjZXMgYSB0b3AgcHJvY2VzcyB3aXRoIGFuIGFjdGl2aXR5LgotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnPUFjdGl2aXR5ICcnezB9JycgY2Fubm90IHNldCB2YXJpYWJpbGl0eSB3aXRoICcnezF9Jycgc2luY2UgJyd7MX0nJyBhbHJlYWR5IGhhcyBvbmUgb3IgbW9yZSBjb250cmlidXRlZC9yZXBsYWNlZCBhY3Rpdml0aWVzIGFzIGl0cyBjaGlsZHJlbi4KLXZhcmlhYmlsaXR5X2Vycm9yX21zZz1WYXJpYWJpbGl0eSBlbGVtZW50ICcnezB9JycgY2Fubm90IHNldCB2YXJpYWJpbGl0eSB3aXRoICcnezF9Jycgc2luY2UgaXQgd2lsbCByZXN1bHQgaW4gY2lyY3VsYXIgZGVwZW5kZW5jeS4KLWNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfbXNnPUNhbm5vdCBwZXJmb3JtIHRoZSBvcGVyYXRpb24gc2luY2UgaXQgd2lsbCByZXN1bHQgaW4gY2lyY3VsYXIgZGVwZW5kZW5jeS4KLQotIyBWYWxpZGF0aW9uIG1lc3NhZ2VzCi12YXJpYWJpbGl0eV9lbGVtZW50X2NpcmN1bGFyX2xvb3BfZXJyb3JfbXNnPUNpcmN1bGFyIGRlcGVuZGVuY3kgbG9vcCBkZXRlY3RlZCAuLi4gCi1yZXBsYWNpbmdfYW5jZXN0b3JfZXJyb3JfbXNnPVJlcGxhY2luZyBhbiBhbmNlc3RvciBlcnJvciBpcyBkZXRlY3RlZC4KLWNhbm5vdF9jb3B5X29yX2V4dGVuZF9kZWxpdmVyeV9wcm9jZXNzPUNhbm5vdCBjb3B5IG9yIGV4dGVuZCBhIGRlbGl2ZXJ5IHByb2Nlc3Mgb3IgYW55IG9mIGl0cyBhY3Rpdml0aWVzLgotCi0jIFNvcnQgb3B0aW9ucwotU29ydFR5cGVfTGFiZWw9U29ydCBUeXBlOgotU29ydFR5cGVfTWFudWFsPU1hbnVhbAotU29ydFR5cGVfQWxwaGFiZXRpYz1BbHBoYWJldGljCi1Tb3J0VHlwZV9SZXZlcnNlQWxwaGFiZXRpYz1SZXZlcnNlIEFscGhhYmV0aWMKLVNvcnRUeXBlX01ldGhvZFR5cGU9TWV0aG9kIFR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9TdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvU3RydWN0dXJlZE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTJmMDA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9TdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBzdHJ1Y3R1cmVkIG1ldGhvZCBwbHVnLWluLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElHcm91cENvbnRhaW5lciwKLQkJSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQlwcml2YXRlIE1vZGVsU3RydWN0dXJlIG1vZGVsU3RydWN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kZWxTdHJ1Y3R1cmUoTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3QpIHsKLQkJdGhpcy5tb2RlbFN0cnVjdCA9IG1vZGVsU3RydWN0OwotCX0KLQotCXB1YmxpYyBNb2RlbFN0cnVjdHVyZSBnZXRNb2RlbFN0cnVjdHVyZSgpIHsKLQkJcmV0dXJuIG1vZGVsU3RydWN0OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGdyb3VwSXRlbVByb3ZpZGVyTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGx1Z2luX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGdyb3VwSXRlbVByb3ZpZGVyTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdyb3VwSXRlbVByb3ZpZGVyTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJCQkJKChJRGlzcG9zYWJsZSkgYWRhcHRlcikuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLmNsZWFyKCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG51bGw7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvVG5nQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9UbmdBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTJmZmFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9UbmdBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaW50ZXJuYWwuVG5nQWRhcHRlckZhY3RvcnlJbXBsOwotCi0vKioKLSAqIFRoZSBmYWN0b3J5IGZvciBhbGwgdGhlIGFkYXB0ZXIgZmFjdG9yaWVzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRuZ0FkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVG5nQWRhcHRlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgVG5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBMaWJyYXJ5IHZpZXcuCi0JICogCi0JICogQHJldHVybiB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgTGlicmFyeSB2aWV3Ci0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0JICogCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudCBmaWx0ZXIKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBDb25maWd1cmF0aW9uIHZpZXcKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0Q29uZmlndXJhdGlvblZpZXdfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUuIENsaWVudCBpcwotCSAqIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmtwbGFpbiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKX0KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVdCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlLiBDbGllbnQgaXMKLQkgKiByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0IGFmdGVyIHVzZSBieSBjYWxsaW5nCi0JICoge0BsaW5rcGxhaW4gQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCl9Ci0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZmFjdG9yeSBmb3IgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUuCi0JICogQ2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmtwbGFpbiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKX0KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlV1BCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uc29saWRhdGVkIEJyZWFrZG93biBTdHJ1Y3R1cmUuCi0JICogQ2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmtwbGFpbiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKX0KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbnNvbGlkYXRlZCBCcmVha2Rvd24gU3RydWN0dXJlCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgcHVibGlzaGVkIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZS4KLQkgKiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgcHVibGlzaGVkIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdXQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHB1Ymxpc2hlZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUuCi0JICogQ2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmtwbGFpbiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKX0KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIHB1Ymxpc2hlZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQdWJsaXNoaW5nVEJTQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciBwdWJsaXNoZWQgV29yayBQcm9kdWN0IEJyZWFrZG93bgotCSAqIFN0cnVjdHVyZS4gQ2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmtwbGFpbiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKX0KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIHB1Ymxpc2hlZCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duCi0JICogICAgICAgICBTdHJ1Y3R1cmUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQdWJsaXNoaW5nV1BCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIHB1Ymxpc2hlZCBDb25zb2xpZGF0ZWQgQnJlYWtkb3duCi0JICogU3RydWN0dXJlLiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgcHVibGlzaGVkIENvbnNvbGlkYXRlZCBCcmVha2Rvd24KLQkgKiAgICAgICAgIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdDQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdAotCSAqIEJyZWFrZG93biBTdHJ1Y3R1cmUgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlCi0JICogICAgICAgICBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duCi0JICogU3RydWN0dXJlIGVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgZWRpdG9yCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNpbmdsZXRvbiBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgZm9yIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24KLQkgKiBTdHJ1Y3R1cmUgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlCi0JICogICAgICAgICBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbnNvbGlkYXRlZAotCSAqIEJyZWFrZG93biBTdHJ1Y3R1cmUgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbnNvbGlkYXRlZCBCcmVha2Rvd24gU3RydWN0dXJlCi0JICogICAgICAgICBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBDb25maWd1cmF0aW9uIHZpZXcKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRDb25maWd1cmF0aW9uVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIGFkYXB0ZXIgZmFjdG9yeSBmb3IgSXRlbXNGaWx0ZXIgcGFja2FnZS4gRWl0aGVyCi0JICogZ2V0RmlsdGVyVmlld19BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcikgb3IKLQkgKiBnZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcikgc2hvdWxkIGJlIHVzZWQuIEJvdGggY2FuIGJlCi0JICogdXNlZCBhdCB0aGUgc2FtZSB0aW1lIGRlcGVuZHMgb24gcHVycG9zZS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpOwotCi0JLyoqCi0JICogR2V0cyBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgZmlsdGVyLgotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQgZmlsdGVyCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgZmlsdGVyCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldE9CU0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcik7Ci0KLQkvKioKLQkgKiBHZXRzIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlIGZpbHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50IGZpbHRlcgotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKiAgICAgICAgIGZpbHRlcgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRQQlNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duCi0JICogU3RydWN0dXJlIGZpbHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgZmlsdGVyCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0T0JTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNpbmdsZXRvbiBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBXb3JrIFByb2R1Y3QKLQkgKiBCcmVha2Rvd24gU3RydWN0dXJlIGZpbHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqICAgICAgICAgZmlsdGVyCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0UEJTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNpbmdsZXRvbiBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBpdGVtIGZpbHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBpdGVtIGZpbHRlcgotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldEl0ZW1zRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIFJlc2V0cyB0aGUgYWRhcHRlciBmYWN0b3JpZXMuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKTsKLQotCS8qKgotCSAqIFJlbGVhc2VzIHVudXNlZCBvYmplY3RzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuVXAoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1RyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTNhZTExNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LklFbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLQotLyoqCi0gKiBJdGVtIHByb3ZpZGVyIGZvciBVSSB0cmFuc2llbnQgb2JqZWN0cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGdyb3VwL29yZ2FuaXplCi0gKiBtb2RlbCBvYmplY3RzIGluIGEgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJRWxlbWVudEl0ZW1Qcm92aWRlciwgSUNvbmZpZ3VyYWJsZSwgSURlZmF1bHROYW1lU2V0dGVyLAotCQlJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGNoaWxkRmlsdGVyOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTm90aWZpZXIgcGFyZW50KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJcGFyZW50LmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJcGFyZW50LmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKGNoaWxkRmlsdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBjaGlsZEZpbHRlci5hY2NlcHQob2JqKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50OwotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBzdXBlci5nZXROZXdDaGlsZERlc2NyaXB0b3JzKHRhcmdldCwgZWRpdGluZ0RvbWFpbiwgc2libGluZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFJlc291cmNlTG9jYXRvcigpCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCwKLQkgKiAgICAgIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlDb21tYW5kIGNtZCA9IHN1cGVyLmNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChkb21haW4sIChFT2JqZWN0KSB0YXJnZXQsCi0JCQkJZmVhdHVyZSwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQ6Ci0JCS8vIGNhbiBleGVjdXRlOiAiICsgY21kLmNhbkV4ZWN1dGUoKSk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUFkZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEudXRpbC5Db2xsZWN0aW9uLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWNjZXB0QXNDaGlsZChlbGVtZW50KSkgewotCQkJCXNlbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChkb21haW4sCi0JCQkJKEVPYmplY3QpIHRhcmdldCwgZmVhdHVyZSwgc2VsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVSZW1vdmVDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVSZW1vdmVDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlDb21tYW5kIGNtZCA9IHN1cGVyLmNyZWF0ZVJlbW92ZUNvbW1hbmQoZG9tYWluLCAoRU9iamVjdCkgdGFyZ2V0LAotCQkJCWZlYXR1cmUsIGNvbGxlY3Rpb24pOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZVJlbW92ZUNvbW1hbmQ6IGNhbgotCQkvLyBleGVjdXRlOiAiICsgY21kLmNhbkV4ZWN1dGUoKSk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZU1vdmVDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTW92ZUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJQ29tbWFuZCBjbWQgPSBzdXBlci5jcmVhdGVNb3ZlQ29tbWFuZChkb21haW4sIChFT2JqZWN0KSB0YXJnZXQsCi0JCQkJZmVhdHVyZSwgdmFsdWUsIGluZGV4KTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjcmVhdGVNb3ZlQ29tbWFuZDogY2FuCi0JCS8vIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpKTsKLQkJcmV0dXJuIGNtZDsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLkNsYXNzLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IG9iamVjdCwgRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlDbGFzcyBjb21tYW5kQ2xhc3MsIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCQlpZiAoY29tbWFuZENsYXNzID09IFJlbW92ZUNvbW1hbmQuY2xhc3MpIHsKLQkJCWNvbW1hbmRQYXJhbWV0ZXIuc2V0T3duZXIodGFyZ2V0KTsKLQkJfQotCQlDb21tYW5kIGNtZCA9IHN1cGVyLmNyZWF0ZUNvbW1hbmQob2JqZWN0LCBkb21haW4sIGNvbW1hbmRDbGFzcywKLQkJCQljb21tYW5kUGFyYW1ldGVyKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjcmVhdGVDb21tYW5kOiAiICsKLQkJLy8gY29tbWFuZENsYXNzICsgIiwgY2FuIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpICsgIiwgb3duZXI6ICIgKwotCQkvLyBjb21tYW5kUGFyYW1ldGVyLmdldE93bmVyKCkgKyAiLCBjb2xsZWN0aW9uOiAiICsKLQkJLy8gY29tbWFuZFBhcmFtZXRlci5nZXRDb2xsZWN0aW9uKCkpOwotCQlyZXR1cm4gY21kOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ2hpbGRyZW5TdG9yZSBzdG9yZSA9IGdldENoaWxkcmVuU3RvcmUodGFyZ2V0KTsKLQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLQkJCXJldHVybiBzdG9yZS5nZXRDaGlsZHJlbigpOwotCQl9Ci0KLQkJc3RvcmUgPSBjcmVhdGVDaGlsZHJlblN0b3JlKHRhcmdldCk7Ci0JCUxpc3QgcmVzdWx0ID0gc3RvcmUgIT0gbnVsbCA/IG51bGwgOiBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSB0YXJnZXQ7Ci0KLQkJaWYgKHRhcmdldCA9PSBudWxsKSByZXR1cm4gcmVzdWx0OwotCQkKLQkJZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW5GZWF0dXJlcyh0YXJnZXQpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpLm5leHQoKTsKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQlmb3IgKEl0ZXJhdG9yIGNpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgY2kuaGFzTmV4dCgpOyBpbmRleCsrKSB7Ci0JCQkJCU9iamVjdCBjaGlsZCA9IGNpLm5leHQoKTsKLQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoY2hpbGQpKSB7Ci0JCQkJCQljaGlsZCA9IHdyYXAoZU9iamVjdCwgZmVhdHVyZSwgY2hpbGQsIGluZGV4KTsKLQkJCQkJCWlmIChzdG9yZSAhPSBudWxsKSB7Ci0JCQkJCQkJc3RvcmUuZ2V0TGlzdChmZWF0dXJlKS5hZGQoY2hpbGQpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXN1bHQuYWRkKGNoaWxkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChhY2NlcHRBc0NoaWxkKGNoaWxkKSkgewotCQkJCQljaGlsZCA9IHdyYXAoZU9iamVjdCwgZmVhdHVyZSwgY2hpbGQsCi0JCQkJCQkJQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCk7Ci0JCQkJCWlmIChzdG9yZSAhPSBudWxsKSB7Ci0JCQkJCQlzdG9yZS5zZXRWYWx1ZShmZWF0dXJlLCBjaGlsZCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXN1bHQuYWRkKGNoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlMaXN0IGNoaWxkcmVuID0gc3RvcmUgIT0gbnVsbCA/IHN0b3JlLmdldENoaWxkcmVuKCkgOiByZXN1bHQ7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoY2hpbGRyZW4sIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpKTsKLQkJCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgZmxvYXQsIGludCwgaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlPYmplY3Qgb3duZXIsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlib29sZWFuIGNhbkV4ZWMgPSB0cnVlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKCFhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCWNhbkV4ZWMgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlDb21tYW5kIGNtZDsKLQkJaWYgKGNhbkV4ZWMpIHsKLQkJCWNtZCA9IHN1cGVyLmNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwKLQkJCQkJb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCWNtZCA9IFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjcmVhdGVNb3ZlQ29tbWFuZDogY2FuCi0JCS8vIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpKTsKLQkJcmV0dXJuIGNtZDsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSh0aGlzLCBtc2cpOwotCi0JCS8vIGlmKG1zZy5nZXROb3RpZmllcigpID09IHRhcmdldCkgewotCQkvLyBpZihmZWF0dXJlSWQgPT0gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMpIHsKLQkJLy8gYm9vbGVhbiBub3RpZnkgPSBmYWxzZTsKLQkJLy8gc3dpdGNoKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCS8vIE9iamVjdCBvYmogPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJLy8gbm90aWZ5ID0gYWNjZXB0QXNDaGlsZChvYmopOwotCQkvLyBicmVhazsKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkvLyBvYmogPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJLy8gbm90aWZ5ID0gYWNjZXB0QXNDaGlsZChvYmopOwotCQkvLyBicmVhazsKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCS8vIENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJLy8gZm9yX2NoZWNrOgotCQkvLyBmb3IoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIGlmKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCS8vIG5vdGlmeSA9IHRydWU7Ci0JCS8vIGJyZWFrIGZvcl9jaGVjazsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJLy8gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJLy8gZm9yX2NoZWNrOgotCQkvLyBmb3IoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIGlmKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCS8vIG5vdGlmeSA9IHRydWU7Ci0JCS8vIGJyZWFrIGZvcl9jaGVjazsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIGJyZWFrOwotCQkvLwotCQkvLyB9Ci0JCS8vIGlmKG5vdGlmeSkgewotCQkvLyBmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG1zZywgdGhpcywgdHJ1ZSwgZmFsc2UpKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRDb25maWd1cmF0aW9uKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5jaGlsZEZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0ZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1ZhcmlhYmlsaXR5SW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1ZhcmlhYmlsaXR5SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MDBlNzQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9WYXJpYWJpbGl0eUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIHN0b3JpbmcgdmFyaWFiaWxpdHkgaW5mb3JtYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJpbGl0eUluZm8gewotCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eUVsZW1lbnQgb3duZXI7Ci0KLQlwcml2YXRlIExpc3QgaW5oZXJpdGFuY2VMaXN0OwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgY29udHJpYnV0b3JzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIGEgdmFyaWFiaWxpdHkgZWxlbWVudAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUluZm8oVmFyaWFiaWxpdHlFbGVtZW50IG93bmVyKSB7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvd25lciBvZiB0aGlzIFZhcmlhYmlsaXR5SW5mbyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgb3duZXIgb2YgdGhpcyBWYXJpYWJpbGl0eUluZm8gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBmaW5hbCBWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWFsaXplZCBpbmhlcml0YW5jZSBsaXN0IGluIHRoZSBvcmRlciBmcm9tIHRoZSByZXNvbHZlZCBvYmplY3QKLQkgKiBvZiB0aGUgb3duZXIgdG8gdGhlIGl0cyB0b3AgYmFzZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW5oZXJpdGFuY2VMaXN0KCkgewotCQlpZiAoaW5oZXJpdGFuY2VMaXN0ID09IG51bGwpIHsKLQkJCWluaGVyaXRhbmNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gaW5oZXJpdGFuY2VMaXN0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgYWxsIGNvbnRyaWJ1dG9yIHRvCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldENvbnRyaWJ1dG9ycygpIHsKLQkJaWYgKGNvbnRyaWJ1dG9ycyA9PSBudWxsKSB7Ci0JCQljb250cmlidXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRyaWJ1dG9yczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9icmVha2Rvd25lbGVtZW50L0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvYnJlYWtkb3duZWxlbWVudC9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjY2Q1OWI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9icmVha2Rvd25lbGVtZW50L0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuYnJlYWtkb3duZWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHVibGljIEFjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX0FjdGl2aXR5X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBpbWcgPSBUbmdVdGlsLmdldEltYWdlKG9iamVjdCk7Ci0JCXJldHVybiBpbWcgIT0gbnVsbCA/IGltZyA6IHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2JyZWFrZG93bmVsZW1lbnQvTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvYnJlYWtkb3duZWxlbWVudC9NaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjA3ZTVjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvYnJlYWtkb3duZWxlbWVudC9NaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5icmVha2Rvd25lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBza2Fubm9vcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1pbGVzdG9uZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWlsZXN0b25lSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfTWlsZXN0b25lX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0N1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzM0Yjc1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkN1c3RvbSBDYXRlZ29yaWVzIiBmb2xkZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIHRhcmdldCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRhcmdldCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWNjZXB0KG9iaik7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlMaXN0IG15Q2F0ZWdvcmllcyA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCS5nZXRDdXN0b21DYXRlZ29yaWVzKChDdXN0b21DYXRlZ29yeSkgb2JqKTsKLQkJCWlmIChteUNhdGVnb3JpZXMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChteUNhdGVnb3JpZXMuc2l6ZSgpID09IDEpIHsKLQkJCQkvLyByb290IGN1c3RvbSBjYXRlZ29yeSBpcyB1bmRlIHRoZSBoaWRkZW4gcGFja2FnZSBhbmQgd2lsbCBub3QKLQkJCQkvLyBiZSBwcm9jZXNzZWQuCi0JCQkJLy8gbmVlZCB0byBzaG93IHN1YiBjYXRlZ29yaWVzIHVuZGVyIGl0Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgYyA9IChDdXN0b21DYXRlZ29yeSkgbXlDYXRlZ29yaWVzLmdldCgwKTsKLQkJCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeShjKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yaWVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBDdXN0b21DYXRlZ29yeS5jbGFzcyksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19DVVNUT01fQ0FURUdPUlkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YmQzNzkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5FTUZFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBjdXN0b20gY2F0ZWdvcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlEZWZhdWx0TmFtZVNldHRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCS8vIHRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJLy8gQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdDsKLQkJLy8gaWYoY2F0ZWdvcnkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJLy8gcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQkvLyB9Ci0JCS8vCQkKLQkJLy8gaWYocGFyZW50ICE9IG51bGwpIHsKLQkJLy8gcmV0dXJuIHBhcmVudDsKLQkJLy8gfQotCQkvLwkJCi0JCS8vIGlmKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJLy8gTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkvLyAvL2lmKHBsdWdpbiA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJLy8JCQkKLQkJLy8gaWYocGx1Z2luICE9IG51bGwpIHsKLQkJLy8gU3RyaW5nW10gcGF0aCA9IHsKLQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpCi0JCS8vICxMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cCIpCi0JCS8vIH07Ci0JCS8vIHJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyB9Ci0KLQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmplY3QpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSk7Ci0JCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9Qcm9jZXNzRWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSAmJiBjaGlsZCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVSZWZlcmVuY2UgcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0JCQlFQ2xhc3MgcGFyZW50Q2xhc3MgPSByZWZlcmVuY2UuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQkJRUNsYXNzIGNoaWxkQ2xhc3MgPSAoKEVPYmplY3QpIGNoaWxkKS5lQ2xhc3MoKTsKLQkJCVN0cmluZyBuYW1lID0gImZ1bGwvY3Rvb2wxNi9DcmVhdGUiICsgcGFyZW50Q2xhc3MuZ2V0TmFtZSgpICsgIl8iICsgcmVmZXJlbmNlLmdldE5hbWUoKSArICJfIiArIGNoaWxkQ2xhc3MuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UobmFtZSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gRU1GRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9jdG9vbDE2L0NyZWF0ZUNoaWxkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZVJlbW92ZWQoQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJaWYgKEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoY2F0ZWdvcnkpLmlzRW1wdHkoKSkgewotCQkJLy8gcmVtb3ZlIGFsbCBzdWJjYXRlZ29yaWVzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2F0ZWdvcnkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUVjb3JlVXRpbC5yZW1vdmUoY2F0ZWdvcnkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzZXREZWZhdWx0TmFtZShub3RpZmljYXRpb24pOwotCi0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJQ29udGVudFBhY2thZ2UgcGtnOwotCQkvLyBib29sZWFuIHJlZnJlc2hDdXN0b21DYXRlZ29yeVJvb3QgPSBmYWxzZTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEN1c3RvbUNhdGVnb3J5LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hDb250cmlidXRvcnModGhpcywgbm90aWZpY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkvL2ZvciBlcGYgZGVmZWN0OjE3NDA0MwotCQkJaWYoIVRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSl7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IE1ldGhvZEVsZW1lbnRVdGlsLmdldE1ldGhvZE1vZGVsKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLQkJCQlpZihwbHVnaW4gIT1udWxsKXsKLQkJCQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdCA9IFRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KHBsdWdpbik7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCByb290LCB0cnVlLCBmYWxzZSkpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJYnJlYWs7Ci0JCS8vIGNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SSUVTOgotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUzoKLQkJCXBrZyA9IChDb250ZW50UGFja2FnZSkgKChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkKLQkJCQkJLmVDb250YWluZXIoKTsKLQkJCWlmICgocGtnICE9IG51bGwpCi0JCQkJCSYmIChNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FCi0JCQkJCQkJLmVxdWFscyhwa2cuZ2V0TmFtZSgpKSkpIHsKLQkJCQkvLyBub3RpZmllciBpcyB0aGUgcm9vdCBjdXN0b20gY2F0ZWdvcnkKLQkJCQkvLwotCQkJCXBrZyA9IChDb250ZW50UGFja2FnZSkgcGtnLmVDb250YWluZXIoKTsKLQkJCX0KLQkJCU9iamVjdCBvYmo7Ci0JCQlDdXN0b21DYXRlZ29yeSBjYXRlZ29yeTsKLQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJb2JqID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCWNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBvYmo7Ci0JCQkJCWlmIChjYXRlZ29yeS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJcGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChjYXRlZ29yeSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyByZWZyZXNoQ3VzdG9tQ2F0ZWdvcnlSb290ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCW9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJCWNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBvYmo7Ci0JCQkJCQlpZiAoY2F0ZWdvcnkuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGNhdGVnb3J5KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gcmVmcmVzaEN1c3RvbUNhdGVnb3J5Um9vdCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQkJLy8gcmVtb3Zpbmcgc3ViY2F0ZWdvcmllcyBpcyBoYW5kbGVkIGJ5IHRoZSByZW1vdmUgY29tbWFuZAotCQkJCS8vCi0vLwkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLS8vCQkJCW9iaiA9IG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpOwotLy8JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0vLwkJCQkJaGFuZGxlUmVtb3ZlZCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaik7Ci0vLwkJCQl9Ci0vLwkJCQlicmVhazsKLS8vCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0vLwkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKQotLy8JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJb2JqID0gaXRlci5uZXh0KCk7Ci0vLwkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0vLwkJCQkJCWhhbmRsZVJlbW92ZWQoKEN1c3RvbUNhdGVnb3J5KSBvYmopOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCi0JCQkvLyAvLyByZWZyZXNoIHdyYXBwZXJzCi0JCQkvLyAvLwotCQkJLy8gaWYod3JhcHBlcnMgIT0gbnVsbCkgewotCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdCh3cmFwcGVycykuaXRlcmF0b3IoKTsKLQkJCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkJLy8gZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkvLyBpdGVyLm5leHQoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vCQkJCi0JCQkvLyBpZihyZWZyZXNoQ3VzdG9tQ2F0ZWdvcnlSb290KSB7Ci0JCQkvLyAvLyBzdWIgY2F0ZWdvcnkgaGFzIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBjdXN0b20KLQkJCS8vIGNhdGVnb3J5Ci0JCQkvLyAvLyBuZWVkIHRvIHJlZnJlc2ggdGhlIGZvbGRlciBmb3IgYWxsIGN1c3RvbSBjYXRlZ29yaWVzCi0JCQkvLyAvLwotCQkJLy8gTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSB0YXJnZXQpOwotCQkJLy8JCQkJCi0JCQkvLyBpZihwbHVnaW4gIT0gbnVsbCkgewotCQkJLy8gU3RyaW5nW10gcGF0aCA9IHsKLQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKQotCQkJLy8gLExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwIikKLQkJCS8vIH07Ci0JCQkvLyBmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCS8vIFRuZ1V0aWwuZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpLCB0cnVlLCBmYWxzZSkpOwotCQkJLy8gfQotCQkJLy8gfQotCi0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNpc1dyYXBwaW5nTmVlZGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoIWlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KSkKLQkJCXJldHVybiB2YWx1ZTsKLQkJcmV0dXJuIFRuZ1V0aWwuY3JlYXRlV3JhcHBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdDsKLQkJcmV0dXJuICFjYXRlZ29yeS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaXNFbXB0eSgpCi0JCS8vIHx8ICFjYXRlZ29yeS5nZXRTdWJDYXRlZ29yaWVzKCkuaXNFbXB0eSgpCi0JCTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCUlEZWZhdWx0TmFtZVNldHRlciBkZWZhdWx0TmFtZVNldHRlciA9IHRoaXM7Ci0JCWlmIChkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSAhPSBudWxsKSB7Ci0JCQlpbnQgZmVhdHVyZUlkID0gbXNnLmdldEZlYXR1cmVJRChkZWZhdWx0TmFtZVNldHRlcgotCQkJCQkuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJc2V0RGVmYXVsdE5hbWUobXNnLmdldE5ld1ZhbHVlKCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJc2V0RGVmYXVsdE5hbWUoaXRlci5uZXh0KCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaiwgT2JqZWN0IHBhcmVudCkgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0NVU1RPTV9DQVRFR09SWTsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKEN1c3RvbUNhdGVnb3J5KSBwYXJlbnQpCi0JCQkJCS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCksIChNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBDdXN0b21DYXRlZ29yeS5jbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCS8vIGNoZWNrIGN1c3RvbSBjYXRlZ29yeSBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeQotCQkJCS8vCi0JCQkJaWYgKCEob3duZXIgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQgJiYgVG5nVXRpbAotCQkJCQkJLmlzQW5jZXNzb3JPZigoQ3VzdG9tQ2F0ZWdvcnkpIGVsZW1lbnQsCi0JCQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG93bmVyKSkpIHsKLQkJCQkJc2VsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVSZW1vdmVDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVSZW1vdmVDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlUmVtb3ZlQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmplY3QpKQotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yaWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSB7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJaWYgKCgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkgIT0gbnVsbCkgewotCQkJCQlVUkkgaW1nVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKAotCQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCQkoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpKTsKLQkJCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gaW1hZ2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCS8vIGRvIG5vdGhpbmcsIGFscmVhZHkgaGFuZGxlZCBieSBzZXREZWZhdWx0TmFtZShOb3RpZmljYXRpb24pCi0JfQotCi0JcHVibGljIExpc3QgZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycygpIHsKLQkJaWYoY2hhbmdlTm90aWZpZXIgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgY2hhbmdlTm90aWZpZXIpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZihUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSlvYmplY3QpKXsKLQkJCUxpc3Qgc29ydExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzb3J0TGlzdC5hZGRBbGwoY29sKTsKLQkJCUNvbGxlY3Rpb25zLnNvcnQoc29ydExpc3QsIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpKTsKLQkJCXJldHVybiBzb3J0TGlzdDsKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlMaXN0IHNvcnRMaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKChNZXRob2RFbGVtZW50KW9iamVjdCwgY29sLnRvQXJyYXkoKSk7Ci0JCQlyZXR1cm4gc29ydExpc3Q7Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0JCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9EaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkY2I3ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkRpc2NpcGxpbmVzIiBmb2xkZXIuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIERpc2NpcGxpbmVzSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0YXJnZXQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyI2lzSW5oZXJpdGVkKG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5oZXJpdGVkKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlyZXR1cm4gKGNhdGVnb3J5IGluc3RhbmNlb2YgRGlzY2lwbGluZSB8fCBjYXRlZ29yeSBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykKLQkJCQkmJiBjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZURpc2NpcGxpbmUoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSAmJiBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldERpc2NpcGxpbmVHcm91cHMoKERpc2NpcGxpbmUpIG9iaikuaXNFbXB0eSgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBhY2NlcHQob2JqKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0Rpc2NpcGxpbmVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQlEaXNjaXBsaW5lIGNoaWxkID0gKERpc2NpcGxpbmUpIGVsZW1lbnQ7Ci0JCQkJRGlzY2lwbGluZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoRGlzY2lwbGluZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCQkJLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkuYWRhcHQoY2hpbGQsCi0JCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaXRlbVByb3ZpZGVyLnNldFBhcmVudChvYmplY3QpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBEaXNjaXBsaW5lLmNsYXNzKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0RJU0NJUExJTkUpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIERpc2NpcGxpbmVHcm91cGluZy5jbGFzcyksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ESVNDSVBMSU5FX0dST1VQSU5HKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDc3NjhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9EaXNjaXBsaW5lQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LkVNRkVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBkaXNjaXBsaW5lIGdyb3VwaW5nLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlEZWZhdWx0TmFtZVNldHRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lQ2F0ZWdvcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRGlzY2lwbGluZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0JCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBwYXRoID0gewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQl9OwotCi0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpOwotCQkJfQotCQl9Ci0KLQkJLy8gTWV0aG9kUGx1Z2luIG1vZGVsID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKE1ldGhvZEVsZW1lbnQpIG9iamVjdCk7Ci0JCS8vIGlmKG1vZGVsID09IG51bGwpIHJldHVybiBudWxsOwotCQkvLyBJR3JvdXBDb250YWluZXIgZ3JvdXBDb250YWluZXIgPSAoSUdyb3VwQ29udGFpbmVyKQotCQkvLyBUbmdVdGlsLmdldEFkYXB0ZXIoKEVPYmplY3QpbW9kZWwsIElHcm91cENvbnRhaW5lci5jbGFzcyk7Ci0JCS8vIGlmKGdyb3VwQ29udGFpbmVyICE9IG51bGwpIHsKLQkJLy8gZ3JvdXBDb250YWluZXIgPSAoSUdyb3VwQ29udGFpbmVyKQotCQkvLyBncm91cENvbnRhaW5lci5nZXRHcm91cEl0ZW1Qcm92aWRlcihMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikpOwotCQkvLyByZXR1cm4KLQkJLy8gZ3JvdXBDb250YWluZXIuZ2V0R3JvdXBJdGVtUHJvdmlkZXIoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSk7Ci0JCS8vIH0KLQkJLy8gLy8gTWV0aG9kTW9kZWxJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKE1ldGhvZE1vZGVsSXRlbVByb3ZpZGVyKQotCQkvLyBUbmdVdGlsLmdldEFkYXB0ZXIoKEVPYmplY3QpbW9kZWwsIE1ldGhvZE1vZGVsSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gLy8gaWYoaXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJLy8gLy8gcmV0dXJuIGl0ZW1Qcm92aWRlci5nZXREaXNjaXBsaW5lQ2F0ZWdvcmllcygpOwotCQkvLyAvLyB9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWlmIChjaGlsZHJlbiBpbnN0YW5jZW9mIExpc3QpCi0JCQlDb2xsZWN0aW9ucy5zb3J0KChMaXN0KSBjaGlsZHJlbiwgUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRQotCQkJCQkuZ2V0Q29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQuSGVscGVyI2dldENyZWF0ZUNoaWxkSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlQ2hpbGRJbWFnZShPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UgJiYgY2hpbGQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBmZWF0dXJlOwotCQkJRUNsYXNzIHBhcmVudENsYXNzID0gcmVmZXJlbmNlLmdldEVDb250YWluaW5nQ2xhc3MoKTsKLQkJCUVDbGFzcyBjaGlsZENsYXNzID0gKChFT2JqZWN0KSBjaGlsZCkuZUNsYXNzKCk7Ci0JCQlTdHJpbmcgbmFtZSA9ICJmdWxsL2N0b29sMTYvQ3JlYXRlIiArIHBhcmVudENsYXNzLmdldE5hbWUoKSArICJfIiArIHJlZmVyZW5jZS5nZXROYW1lKCkgKyAiXyIgKyBjaGlsZENsYXNzLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKG5hbWUpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIEVNRkVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvY3Rvb2wxNi9DcmVhdGVDaGlsZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkvLyBTdHJpbmcgbGFiZWwgPSBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwKLQkJLy8gZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUiKSk7Ci0JCS8vIENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSA9IChDb250ZW50Q2F0ZWdvcnkpIG9iamVjdDsKLQkJLy8gaWYoY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJLy8gTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPQotCQkvLyBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkvLyBpZihiYXNlUGx1Z2luICE9IG51bGwpIHsKLQkJLy8gbGFiZWwgPSBsYWJlbCArICIgKGluaGVyaXRlZCBmcm9tICIgKyBiYXNlUGx1Z2luLmdldE5hbWUoKSArICcpJzsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHJldHVybiBsYWJlbDsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8gY29tbWVudGluZyBiZWxvdywgdXNlZnVsIGZvciBzdGF0ZWZ1bCBpdGVtcHJvdmlkZXIuCi0JCS8vVG5nVXRpbC5zZXREZWZhdWx0TmFtZSh0aGlzLCBub3RpZmljYXRpb24pOwotCQkKLQkJLy8gRm9yIHN0YXRlbGVzcyBpdGVtcHJvdmlkZXIsIG5lZWQgdGhpcy4KLQkJc2V0RGVmYXVsdE5hbWUobm90aWZpY2F0aW9uKTsKLQkJCi0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZzsKLQkJRGlzY2lwbGluZSBkaXNjaXBsaW5lOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCi0JCQlib29sZWFuIHJlZnJlc2hQYXJlbnQgPSBmYWxzZTsKLQkJCXBrZyA9IChDb250ZW50UGFja2FnZSkgKChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkKLQkJCQkJLmVDb250YWluZXIoKTsKLQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQlpZiAoZGlzY2lwbGluZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGRpc2NpcGxpbmUpOwotCQkJCX0gZWxzZSBpZiAoZGlzY2lwbGluZS5lQ29udGFpbmVyKCkgPT0gcGtnKSB7Ci0JCQkJCXJlZnJlc2hQYXJlbnQgPSB0cnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChkaXNjaXBsaW5lLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGRpc2NpcGxpbmUpOwotCQkJCQl9IGVsc2UgaWYgKGRpc2NpcGxpbmUuZUNvbnRhaW5lcigpID09IHBrZykgewotCQkJCQkJcmVmcmVzaFBhcmVudCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQlyZWZyZXNoUGFyZW50ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChyZWZyZXNoUGFyZW50KSB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQlnZXRQYXJlbnQodGFyZ2V0KSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmICghaXNXcmFwcGluZ05lZWRlZChvYmplY3QpKQotCQkJcmV0dXJuIHZhbHVlOwotCQlyZXR1cm4gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4KTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCS8vIENvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIERpc2NpcGxpbmUgY2hpbGQgPSAoRGlzY2lwbGluZSkgaXRlci5uZXh0KCk7Ci0JLy8gRGlzY2lwbGluZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoRGlzY2lwbGluZUl0ZW1Qcm92aWRlcikKLQkvLyBhZGFwdGVyRmFjdG9yeS5hZGFwdChjaGlsZCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkvLyBpdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JLy8gfQotCS8vIHJldHVybiBjaGlsZHJlbjsKLQkvLyB9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCUlEZWZhdWx0TmFtZVNldHRlciBkZWZhdWx0TmFtZVNldHRlciA9IHRoaXM7Ci0JCWlmIChkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSAhPSBudWxsKSB7Ci0JCQlpbnQgZmVhdHVyZUlkID0gbXNnLmdldEZlYXR1cmVJRChkZWZhdWx0TmFtZVNldHRlcgotCQkJCQkuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJc2V0RGVmYXVsdE5hbWUobXNnLmdldE5ld1ZhbHVlKCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJc2V0RGVmYXVsdE5hbWUoaXRlci5uZXh0KCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaiwgT2JqZWN0IHBhcmVudCkgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRElTQ0lQTElORTsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJLy8gTWFraW5nIHBsdWdpbiBsZXZlbCB1bmlxdWVuZXNzIG9mIGRpc2NpcGxpbmUsIG9uIHJlbW92aW5nIGRpc2NpcGxpbmUgcmVmZXJlbmNlIAotCQkJLy8gZnJvbSBkaXNjaXBsaW5lIGdyb3VwaW5nLCBkaXNjaXBsaW5lIGdvZXMgYmFjayB0byB0b3BsZXZlbCBjYXVzaW5nIGR1cGxpY2F0ZS4gCi0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgKLQkJCQkJKChDb250ZW50UGFja2FnZSkgKCgoRGlzY2lwbGluZUdyb3VwaW5nKSBwYXJlbnQpCi0JCQkJCQkJLmVDb250YWluZXIoKSkpLmdldENvbnRlbnRFbGVtZW50cygpLAotCQkJCQlEaXNjaXBsaW5lLmNsYXNzKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0RJU0NJUExJTkUpOwotCQl9Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRElTQ0lQTElORTsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKERpc2NpcGxpbmVHcm91cGluZykgdGFyZ2V0KQotCQkJCQkuZ2V0RGlzY2lwbGluZXMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3NjQ1OGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZGlzY2lwbGluZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGlzY2lwbGluZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIsIElEZWZhdWx0TmFtZVNldHRlciB7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotLy8JCWlmIChwYXJlbnQgIT0gbnVsbCkKLS8vCQkJcmV0dXJuIHBhcmVudDsKLS8vCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCURpc2NpcGxpbmUgZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKW9iamVjdDsKLQkJaWYoZGlzY2lwbGluZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKXsKLQkJCXBhcmVudCA9ICBzdXBlci5nZXRQYXJlbnQoZGlzY2lwbGluZSk7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JCQotCQlNZXRob2RQbHVnaW4gbW9kZWwgPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihkaXNjaXBsaW5lKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmdbXSBwYXRoID0gewotCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJLAotCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQksIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQl9OwotCi0JCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIobW9kZWwsIHBhdGgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJLy9yZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJaWYoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKXsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKHRoaXMsIG5vdGlmaWNhdGlvbik7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc2NpcGxpbmUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19OQU1FOgotCQkJVG5nVXRpbC5yZWZyZXNoQ29udHJpYnV0b3JzKHRoaXMsIG5vdGlmaWNhdGlvbiwgZmFsc2UsIHRydWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19UQVNLUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0KLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1M6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJLy8gcmVmcmVzaCB1bmNhdGVnb3JpemVkIHRhc2tzIGZvbGRlcgotCQkJLy8gVG5nVXRpbC5yZWZyZXNoQWRhcHRlcihMaWJyYXJ5RWRpdENvbnN0YW50cy5VTkNBVEVHT1JJWkVEX1RBU0tTX1BBVEgsCi0JCQkvLyBub3RpZmljYXRpb24pOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47CQkKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCQkKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lX3R5cGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmICghaXNXcmFwcGluZ05lZWRlZChvYmplY3QpKQotCQkJcmV0dXJuIHZhbHVlOwotCQlyZXR1cm4gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4KTsKLQl9Ci0JCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIENoYW5nZSBDYXRlZ29yaWVzIGRpc3BsYXkgaW4gTGlicmFyeSBOYXZpZ2F0b3IKLQkJLy8gKGNvbW1lbnRlZCBmb3IgdGhpcyBkZWZlY3QpCi0JCS8vIHJldHVybiAhKChEaXNjaXBsaW5lKSBvYmplY3QpLmdldFRhc2tzKCkuaXNFbXB0eSgpOwotCQkvL3JldHVybiBmYWxzZTsKLQkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCS8vIHJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpCi0JCS8vIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQkJLy9yZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJc2VsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkU7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gRGlzY2lwbGluZS5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0RJU0NJUExJTkU7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChEaXNjaXBsaW5lKSB0YXJnZXQpLmdldFN1YmRpc2NpcGxpbmUoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkvL3JldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCkKLQkJCUNvbGxlY3Rpb25zLnNvcnQoKExpc3QpIGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlNzk5MTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRvbWFpbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Eb21haW5JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGVmYXVsdE5hbWVTZXR0ZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldERvbWFpbl9TdWJkb21haW5zKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURvbWFpbigpKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1N1YmRvbWFpbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJRG9tYWluIGRvbWFpbiA9IChEb21haW4pIG9iamVjdDsKLQkJaWYgKGRvbWFpbi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlNZXRob2RQbHVnaW4gbW9kZWwgPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihkb21haW4pOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ1tdIHBhdGggPSB7Ci0JCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQksCi0JCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJfTsKLQotCQlyZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKG1vZGVsLCBwYXRoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9Eb21haW5fdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvL1RuZ1V0aWwuc2V0RGVmYXVsdE5hbWUodGhpcywgbm90aWZpY2F0aW9uKTsKLQkJc2V0RGVmYXVsdE5hbWUobm90aWZpY2F0aW9uKTsKLQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERvbWFpbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJVG5nVXRpbC5yZWZyZXNoQ29udHJpYnV0b3JzKHRoaXMsIG5vdGlmaWNhdGlvbiwgZmFsc2UsIHRydWUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCkKLQkJCUNvbGxlY3Rpb25zLnNvcnQoKExpc3QpIGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFCi0JCQkJCS5nZXRDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoIWlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KSkKLQkJCXJldHVybiB2YWx1ZTsKLQkJcmV0dXJuIFRuZ1V0aWwuY3JlYXRlV3JhcHBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gY3JlYXRlV3JhcHBlcnMoQ29sbGVjdGlvbiBvYmplY3RzKSB7Ci0JCWlmICh3cmFwcGVycyA9PSBudWxsKSB7Ci0JCQl3cmFwcGVycyA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JCX0KLQkJRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlci5maWxsKHdyYXBwZXJzLCBudWxsLCBvYmplY3RzLCB0aGlzLAotCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHdyYXBwZXJzKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoTm90aWZpY2F0aW9uIG1zZykgewotCQlJRGVmYXVsdE5hbWVTZXR0ZXIgZGVmYXVsdE5hbWVTZXR0ZXIgPSB0aGlzOwotCQlpZiAoZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgIT0gbnVsbCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoZGVmYXVsdE5hbWVTZXR0ZXIKLQkJCQkJLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCXNldERlZmF1bHROYW1lKG1zZy5nZXROZXdWYWx1ZSgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCXNldERlZmF1bHROYW1lKGl0ZXIubmV4dCgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmosIE9iamVjdCBwYXJlbnQpIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRE9NQUlOOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoRG9tYWluKSBwYXJlbnQpCi0JCQkJCS5nZXRTdWJkb21haW5zKCksIChNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRE9NQUlOOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoRG9tYWluKSB0YXJnZXQpLmdldFN1YmRvbWFpbnMoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gRG9tYWluLmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJCXNlbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSU1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Eb21haW5zSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRG9tYWluc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Mzk4M2Q3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Eb21haW5zSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiRG9tYWlucyIgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5zSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbnNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0YXJnZXQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRG9tYWluKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBEb21haW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0RvbWFpbnMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBEb21haW4uY2xhc3MpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRE9NQUlOKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1JvbGVTZXRDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1JvbGVTZXRDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OTMwNjI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LkVNRkVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSByb2xlIHNldCBncm91cGluZy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGVmYXVsdE5hbWVTZXR0ZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBEaXNwb3NhYmxlIGNoaWxkcmVuOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJvbGVTZXQoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0JCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBwYXRoID0gewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJfTsKLQotCQkJCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJCX0KLQkJfQotCi0JCS8vIE1ldGhvZE1vZGVsSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChNZXRob2RNb2RlbEl0ZW1Qcm92aWRlcikKLQkJLy8gVG5nVXRpbC5nZXRBZGFwdGVyKChFT2JqZWN0KW1vZGVsLCBNZXRob2RNb2RlbEl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCS8vIGlmKGl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCS8vIHJldHVybiBpdGVtUHJvdmlkZXIuZ2V0Um9sZVNldHMoKTsKLQkJLy8gfQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSAmJiBjaGlsZCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVSZWZlcmVuY2UgcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0JCQlFQ2xhc3MgcGFyZW50Q2xhc3MgPSByZWZlcmVuY2UuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQkJRUNsYXNzIGNoaWxkQ2xhc3MgPSAoKEVPYmplY3QpIGNoaWxkKS5lQ2xhc3MoKTsKLQkJCVN0cmluZyBuYW1lID0gImZ1bGwvY3Rvb2wxNi9DcmVhdGUiICsgcGFyZW50Q2xhc3MuZ2V0TmFtZSgpICsgIl8iICsgcmVmZXJlbmNlLmdldE5hbWUoKSArICJfIiArIGNoaWxkQ2xhc3MuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UobmFtZSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gRU1GRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9jdG9vbDE2L0NyZWF0ZUNoaWxkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJLy8gU3RyaW5nIGxhYmVsID0gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsCi0JCS8vIGdldFN0cmluZygiX1VJX1JvbGVTZXRHcm91cGluZ190eXBlIikpOwotCQkvLyBDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSBvYmplY3Q7Ci0JCS8vIGlmKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCS8vIE1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0KLQkJLy8gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJLy8gaWYoYmFzZVBsdWdpbiAhPSBudWxsKSB7Ci0JCS8vIGxhYmVsID0gbGFiZWwgKyAiIChpbmhlcml0ZWQgZnJvbSAiICsgYmFzZVBsdWdpbi5nZXROYW1lKCkgKyAnKSc7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyByZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JLy8gcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2hpbGRyZW4oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCS8vIEVPYmplY3Qgb2JqZWN0ID0gKEVPYmplY3Qpbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JLy8gQ2hpbGRyZW5TdG9yZSBjaGlsZHJlblN0b3JlID0gZ2V0Q2hpbGRyZW5TdG9yZShvYmplY3QpOwotCS8vCQkKLQkvLyBpZiAoY2hpbGRyZW5TdG9yZSAhPSBudWxsKQotCS8vIHsKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9Ci0JLy8gKEVTdHJ1Y3R1cmFsRmVhdHVyZSlub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCS8vIEVMaXN0IGNoaWxkcmVuID0gY2hpbGRyZW5TdG9yZS5nZXRMaXN0KGZlYXR1cmUpOwotCS8vIGlmIChjaGlsZHJlbiAhPSBudWxsKQotCS8vIHsKLQkvLyBpbnQgaW5kZXggPSBub3RpZmljYXRpb24uZ2V0UG9zaXRpb24oKTsKLQkvLwkJCQkKLQkvLyBzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkKLQkvLyB7Ci0JLy8gY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCS8vIHsKLQkvLyBFTGlzdCB2YWx1ZXMgPSAoRUxpc3Qpb2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JLy8JCQkJCQkKLQkvLyBpZiAodmFsdWVzLnNpemUoKSA9PSAwKQotCS8vIHsKLQkvLyBkaXNwb3NlV3JhcHBlcnMoY2hpbGRyZW4pOwotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8gYnJlYWs7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vCQkKLQkvLyBzdXBlci51cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vVG5nVXRpbC5zZXREZWZhdWx0TmFtZSh0aGlzLCBub3RpZmljYXRpb24pOwotCQlzZXREZWZhdWx0TmFtZShub3RpZmljYXRpb24pOwotCQkKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlDb250ZW50UGFja2FnZSBwa2c7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSb2xlU2V0R3JvdXBpbmcuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTOgotCi0JCQlwa2cgPSAoQ29udGVudFBhY2thZ2UpICgoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpCi0JCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQlSb2xlU2V0IHJvbGVTZXQ7Ci0JCQlib29sZWFuIHJlZnJlc2hQYXJlbnQgPSBmYWxzZTsKLQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJcm9sZVNldCA9IChSb2xlU2V0KSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQlpZiAocm9sZVNldC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKHJvbGVTZXQpOwotCQkJCX0gZWxzZSBpZiAocm9sZVNldC5lQ29udGFpbmVyKCkgPT0gcGtnKSB7Ci0JCQkJCXJlZnJlc2hQYXJlbnQgPSB0cnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCXJvbGVTZXQgPSAoUm9sZVNldCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChyb2xlU2V0LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKHJvbGVTZXQpOwotCQkJCQl9IGVsc2UgaWYgKHJvbGVTZXQuZUNvbnRhaW5lcigpID09IHBrZykgewotCQkJCQkJcmVmcmVzaFBhcmVudCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQlyZWZyZXNoUGFyZW50ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlpZiAocmVmcmVzaFBhcmVudCkgewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJZ2V0UGFyZW50KHRhcmdldCksIHRydWUsIGZhbHNlKSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIFJvbGVTZXQgY2hpbGQgPSAoUm9sZVNldCkgaXRlci5uZXh0KCk7Ci0JCS8vIFJvbGVTZXRJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKFJvbGVTZXRJdGVtUHJvdmlkZXIpCi0JCS8vIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGNoaWxkLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBpdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCS8vIH0KLQkJaWYgKGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCkKLQkJCUNvbGxlY3Rpb25zLnNvcnQoKExpc3QpIGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQotCQkvLyByZXR1cm4gY3JlYXRlV3JhcHBlcnMoY2hpbGRyZW4pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQotCS8vIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gT2JqZWN0IHdyYXBwZXIgPSBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIChFT2JqZWN0KSB0YXJnZXQsCi0JLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksIG9iamVjdCwgLTEpOwotCS8vIGlmKHdyYXBwZXJzID09IG51bGwpIHsKLQkvLyB3cmFwcGVycyA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JLy8gfQotCS8vIHdyYXBwZXJzLmFkZCh3cmFwcGVyKTsKLQkvLyByZXR1cm4gd3JhcHBlcjsKLQkvLyB9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVXcmFwcGVycyhDb2xsZWN0aW9uIG9iamVjdHMpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJfQotCQlGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyLmZpbGwoY2hpbGRyZW4sIG51bGwsIG9iamVjdHMsIHRhcmdldCwKLQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJSURlZmF1bHROYW1lU2V0dGVyIGRlZmF1bHROYW1lU2V0dGVyID0gdGhpczsKLQkJaWYgKGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpICE9IG51bGwpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKGRlZmF1bHROYW1lU2V0dGVyCi0JCQkJCS5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlzZXREZWZhdWx0TmFtZShtc2cuZ2V0TmV3VmFsdWUoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlzZXREZWZhdWx0TmFtZShpdGVyLm5leHQoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqLCBPYmplY3QgcGFyZW50KSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0xFX1NFVDsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJLy8gTWFraW5nIHBsdWdpbiBsZXZlbCB1bmlxdWVuZXNzIG9mIHJvbGVzZXQsIG9uIHJlbW92aW5nIHJvbGVzZXQgcmVmZXJlbmNlIAotCQkJLy8gZnJvbSByb2xlc2V0IGdyb3VwaW5nLCByb2xlc2V0IGdvZXMgYmFjayB0byB0b3BsZXZlbCBjYXVzaW5nIGR1cGxpY2F0ZS4gCi0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgKLQkJCQkJKChDb250ZW50UGFja2FnZSkgKCgoUm9sZVNldEdyb3VwaW5nKSBwYXJlbnQpCi0JCQkJCQkJLmVDb250YWluZXIoKSkpLmdldENvbnRlbnRFbGVtZW50cygpLAotCQkJCQkJCVJvbGVTZXQuY2xhc3MpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUk9MRV9TRVQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0xFX1NFVDsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKFJvbGVTZXRHcm91cGluZykgdGFyZ2V0KS5nZXRSb2xlU2V0cygpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gUm9sZVNldEdyb3VwaW5nLmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlciNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxY2NiZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcm9sZSBzZXQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlJvbGVTZXRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVTZXRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlU2V0SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0JCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBwYXRoID0gewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJfTsKLQotCQkJCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQkvLyBpZihjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJLy8gY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJvbGVTZXQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJCVRuZ1V0aWwucmVmcmVzaENvbnRyaWJ1dG9ycyh0aGlzLCBub3RpZmljYXRpb24sIGZhbHNlLCB0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEVTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkJLy8gcmVmcmVzaCB3cmFwcGVycwotCQkJLy8KLQkJCWlmICh3cmFwcGVycyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdCh3cmFwcGVycykuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIGl0ZXIKLQkJCQkJCQkubmV4dCgpLCB0cnVlLCBmYWxzZSkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmVmcmVzaCB1bmNhdGVnb3JpemVkIHJvbGVzCi0JCQkvLwotCQkJLy8gVG5nVXRpbC5yZWZyZXNoQWRhcHRlcihMaWJyYXJ5RWRpdENvbnN0YW50cy5VTkNBVEVHT1JJWkVEX1JPTEVTX1BBVEgsCi0JCQkvLyBub3RpZmljYXRpb24pOwotCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZVNldF90eXBlIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoIWlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KSkKLQkJCXJldHVybiB2YWx1ZTsKLQkJcmV0dXJuIFRuZ1V0aWwuY3JlYXRlV3JhcHBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCk7Ci0JfQotCi0JLy8gQ2hhbmdlIENhdGVnb3JpZXMgZGlzcGxheSBpbiBMaWJyYXJ5IE5hdmlnYXRvcgotCS8vIEFkZCBiZWxvdyBtZXRob2QgdG8gYXZvaWQgY2hpbGRyZW4gZm9yIHRoaXMgSXRlbVByb3ZpZGVyLiArCi0JLy8gc2lnbiB0b28uCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyBMaXN0IG5ld0NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIFJvbGVTZXQgcm9sZVNldCA9IChSb2xlU2V0KSBvYmplY3Q7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcm9sZVNldC5nZXRSb2xlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIFJvbGUgcm9sZSA9IChSb2xlKSBpdGVyLm5leHQoKTsKLQkvLyAvLyBsb29rIGlmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIE9iamVjdExpbmtJdGVtUHJvdmlkZXIgZm9yIHRoaXMgdGFzayBpbgotCS8vIHRoZSBjdXJyZW50IGNoaWxkcmVuIGxpc3QgZmlyc3QKLQkvLyAvLwotCS8vIE9iamVjdExpbmtJdGVtUHJvdmlkZXIgY2hpbGQgPSBmaW5kRXhpc3RpbmdPYmplY3RMaW5rSXRlbVByb3ZpZGVyKHJvbGUpOwotCS8vIGlmKGNoaWxkID09IG51bGwpIHsKLQkvLyBjaGlsZCA9IG5ldyBPYmplY3RMaW5rSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIHJvbGUpOwotCS8vIH0KLQkvLyBlbHNlIHsKLQkvLyBjaGlsZHJlbi5yZW1vdmUoY2hpbGQpOwotCS8vIH0KLQkvLyBuZXdDaGlsZHJlbi5hZGQoY2hpbGQpOwotCS8vIH0KLQkvLyAvLyBkaXNwb3NlIHRoZSBvbGQgY2hpbGRyZW4KLQkvLyAvLwotCS8vIGlmKGNoaWxkcmVuICE9IG51bGwpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBPYmplY3RMaW5rSXRlbVByb3ZpZGVyIGNoaWxkID0gKE9iamVjdExpbmtJdGVtUHJvdmlkZXIpIGl0ZXIubmV4dCgpOwotCS8vIGNoaWxkLmRpc3Bvc2UoKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGNoaWxkcmVuID0gbmV3Q2hpbGRyZW47Ci0JLy8gcmV0dXJuIGNoaWxkcmVuOwotCS8vIH0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQkvLyByZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKQotCQkvLyBzdXBlci5jcmVhdGVBZGRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1JvbGVTZXRzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldHNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTFlZDJkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldHNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlJvbGUgU2V0cyIgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0c0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlU2V0c0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIHRhcmdldCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRhcmdldCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5UcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIjaXNJbmhlcml0ZWQob3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmhlcml0ZWQoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCXJldHVybiAoY2F0ZWdvcnkgaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcgfHwgY2F0ZWdvcnkgaW5zdGFuY2VvZiBSb2xlU2V0KQotCQkJCSYmIGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUm9sZVNldEdyb3VwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUm9sZVNldCgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWNjZXB0KG9iaik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgUm9sZVNldCAmJiBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpIG9iaikuaXNFbXB0eSgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAgc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgUm9sZVNldEdyb3VwaW5nLmNsYXNzKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JPTEVfU0VUX0dST1VQSU5HKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgUm9sZVNldC5jbGFzcyksIChNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0xFX1NFVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9TdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9TdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWVmZjUzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlN0YW5kYXJkIENhdGVnb3JpZXMiIGZvbGRlci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJR3JvdXBDb250YWluZXIgewotCi0JcHJpdmF0ZSBBcnJheUxpc3QgY2hpbGRyZW47Ci0KLQlwcml2YXRlIE1hcCBncm91cEl0ZW1Qcm92aWRlck1hcDsKLQotCXB1YmxpYyBTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1N0YW5kYXJkQ2F0ZWdvcmllcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gdGFyZ2V0KSB7Ci0JCQlpbnQgZmVhdHVyZUlkID0gbXNnLmdldEZlYXR1cmVJRChDb250ZW50UGFja2FnZS5jbGFzcyk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUykgewotCQkJCWJvb2xlYW4gbm90aWZ5ID0gZmFsc2U7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCW5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZm9yX2NoZWNrOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQkJbm90aWZ5ID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmb3JfY2hlY2s7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJfQotCQkJCWlmIChub3RpZnkpIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIHRoaXMsIHRydWUsCi0JCQkJCQkJZmFsc2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCS8vIGlmKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCS8vIFRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChDb250ZW50UGFja2FnZSl0YXJnZXQpLmdldENoaWxkUGFja2FnZXMoKSwKLQkJLy8gKE1ldGhvZEVsZW1lbnQpIG9iaiwgIk5ldyBDb250ZW50IFBhY2thZ2UiKTsKLQkJLy8gfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gQ29udGVudFBhY2thZ2UuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJU3RyaW5nIG5hbWU7Ci0JCQlJTGlicmFyeUl0ZW1Qcm92aWRlciBjaGlsZDsKLQotCQkJLy8gY3JlYXRlIHRoZSBkaXNjaXBsaW5lcyBjYXRlZ29yaWVzIGZvbGRlcgotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwKLQkJCQkJLmdldE1ldGhvZFBsdWdpbigoRWxlbWVudCkgKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldFRhcmdldCgpKTsKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2hpbGQgPSBuZXcgRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCQljb250ZW50UGtnLCBuYW1lKTsKLQkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQl9Ci0KLQkJCS8vIGNyZWF0ZSBkb21haW4gY2F0ZWdvcmllcyBmb2xkZXIKLQkJCWNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCk7Ci0JCQlpZiAoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2hpbGQgPSBuZXcgRG9tYWluc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZywKLQkJCQkJCW5hbWUpOwotCQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQl9Ci0KLQkJCS8vIGNyZWF0ZSB3b3JrIHByb2R1Y3QgdHlwZXMgZm9sZGVyCi0JCQljb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpOwotCQkJaWYgKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNoaWxkID0gbmV3IFdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCQljb250ZW50UGtnLCBuYW1lKTsKLQkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJfQotCi0JCQkvLyBjcmVhdGUgcm9sZSBzZXQgZm9sZGVyCi0JCQljb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNoaWxkID0gbmV3IFJvbGVTZXRzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnLAotCQkJCQkJbmFtZSk7Ci0JCQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCX0KLQotCQkJLy8gY3JlYXRlIHRvb2wgZm9sZGVyCi0JCQljb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKTsKLQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNoaWxkID0gbmV3IFRvb2xzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnLCBuYW1lKTsKLQkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyI2dldEdyb3VwSXRlbVByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ3JvdXBJdGVtUHJvdmlkZXJNYXAuZ2V0KG5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1Rvb2xJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Ub29sSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhNTk2YjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1Rvb2xJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgYSB0b29sLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sSXRlbVByb3ZpZGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Ub29sSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUb29sSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gcGF0aCA9IHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Ub29sc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQl9OwotCi0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc2NpcGxpbmUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJCVRuZ1V0aWwucmVmcmVzaENvbnRyaWJ1dG9ycyh0aGlzLCBub3RpZmljYXRpb24sIGZhbHNlLCB0cnVlKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX1Rvb2xfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Ub29sc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1Rvb2xzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAyNjM0ODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1Rvb2xzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlRvb2xzIiBmb2xkZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRvb2xzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRvb2xzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29udGVudFBhY2thZ2UgdGFyZ2V0LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGFyZ2V0LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRvb2woKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFRvb2w7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Ub29scyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBUb29sIGNoaWxkID0gKFRvb2wpIGl0ZXIubmV4dCgpOwotCQkvLyBUb29sSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChUb29sSXRlbVByb3ZpZGVyKQotCQkvLyBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkuYWRhcHQoY2hpbGQsCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIGl0ZW1Qcm92aWRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkJLy8gfQotCi0JCS8vIENoYW5nZSBDYXRlZ29yaWVzIGRpc3BsYXkgaW4gTGlicmFyeSBOYXZpZ2F0b3IKLQkJLy8gKGNvbW1lbnRlZCBmb3IgdGhpcyBkZWZlY3QpCi0JCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRWxlbWVudCkKLQkJLy8gKChJdGVtUHJvdmlkZXJBZGFwdGVyKW9iamVjdCkuZ2V0VGFyZ2V0KCkpOwotCQkvLyBDb250ZW50UGFja2FnZSBjb3JlQ29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJLy8gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQkvLyBVbmNhdGVnb3JpemVkVG9vbE1lbnRvcnNJdGVtUHJvdmlkZXIgdW5jYXRlZ29yaXplZCA9IG5ldwotCQkvLyBVbmNhdGVnb3JpemVkVG9vbE1lbnRvcnNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvcmVDb250ZW50UGtnKTsKLQkJLy8gY2hpbGRyZW4uYWRkKHVuY2F0ZWdvcml6ZWQpOwotCQkvLyBpZihncm91cEl0ZW1Qcm92aWRlck1hcCA9PSBudWxsKSB7Ci0JCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJLy8gfQotCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQodW5jYXRlZ29yaXplZC5nZXRUZXh0KG51bGwpLCB1bmNhdGVnb3JpemVkKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBUb29sKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgVG9vbC5jbGFzcyksIChNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19UT09MKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1RyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1RyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNzcyODlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9UcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlIGNhdGVnb3J5IGZvbGRlcnMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElHcm91cENvbnRhaW5lciB7Ci0KLQlwcm90ZWN0ZWQgTWFwIGdyb3VwSXRlbVByb3ZpZGVyTWFwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTm90aWZpZXIgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCU9iamVjdCB1bmNhdGVnb3JpemVkID0gY3JlYXRlVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcigpOwotCQlpZiAodW5jYXRlZ29yaXplZCAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5hZGQodW5jYXRlZ29yaXplZCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gdGFyZ2V0KSB7Ci0JCQlpbnQgZmVhdHVyZUlkID0gbXNnLmdldEZlYXR1cmVJRChDb250ZW50UGFja2FnZS5jbGFzcyk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTKSB7Ci0JCQkJYm9vbGVhbiBub3RpZnkgPSBmYWxzZTsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgotCQkJCQlPYmplY3Qgb2JqID0gbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCW5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlvYmogPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJbm90aWZ5ID0gYWNjZXB0QXNDaGlsZChvYmopOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlmb3JfY2hlY2s6IGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJCQkJCQlub3RpZnkgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZvcl9jaGVjazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJZm9yX2NoZWNrOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQkJbm90aWZ5ID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmb3JfY2hlY2s7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChub3RpZnkpIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIHRoaXMsIHRydWUsCi0JCQkJCQkJZmFsc2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW5oZXJpdGVkKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlyZXR1cm4gYWNjZXB0QXNDaGlsZChjYXRlZ29yeSkKLQkJCQkmJiBjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIENvbnRlbnRQYWNrYWdlLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyI2dldEdyb3VwSXRlbVByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSkgewotCQlpZiAoZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ3JvdXBJdGVtUHJvdmlkZXJNYXAuZ2V0KG5hbWUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Xb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Xb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDYwZWNhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGVpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgd29yayBwcm9kdWN0IGtpbmQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIFdvcmtQcm9kdWN0S2luZEl0ZW1Qcm92aWRlciBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElXcmFwcGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gcGF0aCA9IHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQl9OwotCi0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaXNjaXBsaW5lLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hDb250cmlidXRvcnModGhpcywgbm90aWZpY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlyZXR1cm4gbmV3IEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIoZmVhdHVyZSwgdmFsdWUsIG9iamVjdCwKLQkJCQkJYWRhcHRlckZhY3RvcnkpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gQ2hhbmdlIENhdGVnb3JpZXMgZGlzcGxheSBpbiBMaWJyYXJ5IE5hdmlnYXRvcgotCQkvLyByZXR1cm4gISgoV29ya1Byb2R1Y3RUeXBlKSBvYmplY3QpLmdldFdvcmtQcm9kdWN0cygpLmlzRW1wdHkoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjd3JhcChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHdyYXAoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHN1cGVyLndyYXAob2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwgaW5kZXgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1dvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Xb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjMGRlMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1dvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJXb3JrIFByb2R1Y3QgS2luZHMiIGZvbGRlci4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgV29ya1Byb2R1Y3RLaW5kc0l0ZW1Qcm92aWRlciBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIHRhcmdldCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRhcmdldCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0cyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0KLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIFdvcmtQcm9kdWN0VHlwZSBjaGlsZCA9IChXb3JrUHJvZHVjdFR5cGUpIGl0ZXIubmV4dCgpOwotCQkvLyBXb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0KLQkJLy8gKFdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcikKLQkJLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KGNoaWxkLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBpdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCS8vIH0KLQotCQkvLyBDaGFuZ2UgQ2F0ZWdvcmllcyBkaXNwbGF5IGluIExpYnJhcnkgTmF2aWdhdG9yCi0JCS8vIChjb21tZW50ZWQgZm9yIHRoaXMgZGVmZWN0KQotCQkvLyBNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVsZW1lbnQpCi0JCS8vICgoSXRlbVByb3ZpZGVyQWRhcHRlcilvYmplY3QpLmdldFRhcmdldCgpKTsKLQkJLy8gQ29udGVudFBhY2thZ2UgY29yZUNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJLy8gV29ya1Byb2R1Y3RUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIHVuY2F0ZWdvcml6ZWQgPQotCQkvLyBuZXcKLQkJLy8gV29ya1Byb2R1Y3RUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkvLyBjb3JlQ29udGVudFBrZyk7Ci0JCS8vIGNoaWxkcmVuLmFkZCh1bmNhdGVnb3JpemVkKTsKLQkJLy8gaWYoZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPT0gbnVsbCkgewotCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8vIH0KLQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KHVuY2F0ZWdvcml6ZWQuZ2V0VGV4dChudWxsKSwgdW5jYXRlZ29yaXplZCk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgV29ya1Byb2R1Y3RUeXBlLmNsYXNzKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1dPUktfUFJPRFVDVF9UWVBFKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzNzZiMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRpc3BsYXkgYW5kIGVkaXRpbmcgc3VwcG9ydCBmb3Igc3RhbmRhcmQgYW5kIGN1c3RvbSBjYXRlZ29yaWVzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FjdGlvbk1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjBhMzc5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9BY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGV4ZWN1dGlvbiBvZiBlZGl0aW5nIGNvbW1hbmRzIHdpdGggZnVsbCBzdXBwb3J0IGZvciBkaXJ0eSBmbGFnLAotICogdW5kbyBhbmQgcmVkby4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJQWN0aW9uTWFuYWdlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1hcCBSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCi0JcHJpdmF0ZSBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrOwotCi0JcHVibGljIEFjdGlvbk1hbmFnZXIoKSB7Ci0JCWNvbW1hbmRTdGFjayA9IGNyZWF0ZUNvbW1hbmRTdGFjaygpOwotCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCWNvbW1hbmRTdGFjayk7Ci0JfQotCi0JcHJvdGVjdGVkIEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayBjcmVhdGVDb21tYW5kU3RhY2soKSB7Ci0JCXJldHVybiBuZXcgRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQXNNb2RpZmllck9mKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gb2JqZWN0LmVSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJcmVnaXN0ZXJBc01vZGlmaWVyT2YocmVzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQXNNb2RpZmllck9mKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN5bmNocm9uaXplZCAoUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUCkgewotCQkJU2V0IG1vZHMgPSAoU2V0KSBSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQLmdldChyZXNvdXJjZSk7Ci0JCQlpZiAobW9kcyA9PSBudWxsKSB7Ci0JCQkJbW9kcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUC5wdXQocmVzb3VyY2UsIG1vZHMpOwotCQkJfQotCQkJbW9kcy5hZGQodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1bnJlZ2lzdGVyQXNNb2RpZmllcigpIHsKLQkJc3luY2hyb25pemVkIChSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRNb2RpZmllZFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJU2V0IG1vZHMgPSAoU2V0KSBSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQLmdldChyZXNvdXJjZSk7Ci0JCQkJaWYgKG1vZHMgIT0gbnVsbCkgewotCQkJCQltb2RzLnJlbW92ZSh0aGlzKTsKLQkJCQkJaWYgKG1vZHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkvLyBzYXZlIHRoZSByZXNvdXJjZSBiZWZvcmUgaXQgcmVtb3ZlZCBmcm9tCi0JCQkJCQkvLyBSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQCi0JCQkJCQkvLyAKLQkJCQkJCXNhdmUocmVzb3VyY2UpOwotCQkJCQkJUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUC5yZW1vdmUocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZG9BY3Rpb24oaW50IGFjdGlvblR5cGUsIEVPYmplY3Qgb2JqZWN0LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCUNvbW1hbmQgY21kID0gbnVsbDsKLQkJT2JqZWN0IG9sZFZhbHVlID0gbnVsbDsKLQkJc3dpdGNoIChhY3Rpb25UeXBlKSB7Ci0JCWNhc2UgQUREOiB7Ci0JCQlpZiAoaW5kZXggPj0gMCkgewotCQkJCWNtZCA9IG5ldyBBZGRDb21tYW5kKGVkaXRpbmdEb21haW4sIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJCQlpbmRleCk7Ci0JCQl9IGVsc2UgewotCQkJCWNtZCA9IG5ldyBBZGRDb21tYW5kKGVkaXRpbmdEb21haW4sIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBBRERfTUFOWTogewotCQkJaWYgKGluZGV4ID49IDApIHsKLQkJCQljbWQgPSBuZXcgQWRkQ29tbWFuZChlZGl0aW5nRG9tYWluLCBvYmplY3QsIGZlYXR1cmUsCi0JCQkJCQkoQ29sbGVjdGlvbikgdmFsdWUsIGluZGV4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJY21kID0gbmV3IEFkZENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb2JqZWN0LCBmZWF0dXJlLAotCQkJCQkJKENvbGxlY3Rpb24pIHZhbHVlKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUkVNT1ZFOiB7Ci0JCQljbWQgPSBuZXcgUmVtb3ZlQ29tbWFuZChlZGl0aW5nRG9tYWluLCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUkVNT1ZFX01BTlk6IHsKLQkJCWNtZCA9IG5ldyBSZW1vdmVDb21tYW5kKGVkaXRpbmdEb21haW4sIG9iamVjdCwgZmVhdHVyZSwKLQkJCQkJKENvbGxlY3Rpb24pIHZhbHVlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgU0VUOiB7Ci0JCQlvbGRWYWx1ZSA9IG9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKChvbGRWYWx1ZSAhPSBudWxsICYmICFvbGRWYWx1ZS5lcXVhbHModmFsdWUpKQotCQkJCQl8fCAob2xkVmFsdWUgPT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSkgewotCQkJCWNtZCA9IG5ldyBTZXRDb21tYW5kKGVkaXRpbmdEb21haW4sIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJfQotCQlpZiAoY21kICE9IG51bGwpIHsKLQkJCXJldHVybiBjb21tYW5kU3RhY2suZG9FeGVjdXRlKGNtZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWNvbW1hbmRTdGFjay51bmRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJY29tbWFuZFN0YWNrLnJlZG8oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1bmRvQWxsKCkgewotCQlib29sZWFuIGIgPSBjb21tYW5kU3RhY2sudW5kb0FsbCgpOwotCQl1bnJlZ2lzdGVyQXNNb2RpZmllcigpOwotCQkvLyBmaXJlTm90aWZ5Q2hhbmdlZChudWxsKTsKLQkJcmV0dXJuIGI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZUlzRG9uZSgpIHsKLQkJY29tbWFuZFN0YWNrLnNhdmVJc0RvbmUoKTsKLQkJdW5yZWdpc3RlckFzTW9kaWZpZXIoKTsKLQkJLy8gZmlyZU5vdGlmeUNoYW5nZWQobnVsbCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlTmVlZGVkKCkgewotCQlib29sZWFuIHJldCA9IGNvbW1hbmRTdGFjay5pc1NhdmVOZWVkZWQoKTsKLQkJaWYgKCFyZXQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXRNb2RpZmllZFJlc291cmNlcygpLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljb21tYW5kU3RhY2suZmx1c2goKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJc3luY2hyb25pemVkIChSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQKSB7Ci0JCQlDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IFJFU09VUkNFX1RPX01PRElGSUVSU19NQVAuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJU2V0IG1vZHMgPSAoU2V0KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmIChtb2RzLmNvbnRhaW5zKHRoaXMpKSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCQl9Ci0JfQotCi0JLy8gcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCS8vIGNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JLy8gfQotCS8vCi0JLy8gcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkvLyBjaGFuZ2VOb3RpZmllci5hZGQobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQkvLyB9Ci0JLy8KLQkvLyBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikKLQkvLyB7Ci0JLy8gY2hhbmdlTm90aWZpZXIucmVtb3ZlKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JLy8gfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nIGhlcmUsIHN1YmNsYXNzIHNob3VsZCBpbXBsZW1lbnQgdG8gcHJvdmlkZSBzYXZpbmcgdGhlCi0JICogcmVzb3VyY2UgYmVmb3JlIGl0IGdvdCByZW1vdmVkIGZyb20gUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUAotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpIHsKLQkJcmV0dXJuIGNvbW1hbmRTdGFjazsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQpIHsKLQkJaWYgKGNtZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29tbWFuZFN0YWNrLmRvRXhlY3V0ZShjbWQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FkZFRvQ2F0ZWdvcnlDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9BZGRUb0NhdGVnb3J5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNzVmZDI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FkZFRvQ2F0ZWdvcnlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBhc3NpZ24gYSBtZXRob2QgZWxlbWVudCB0byBhIGNhdGVnb3J5LiBJZiB0aGUgY2F0ZWdvcnkKLSAqIGlzIGluIGEgYmFzZSBtZXRob2QgcGx1Zy1pbiBvZiB0aGUgZWxlbWVudCwgdGhpcyBjb21tYW5kIHdpbGwgYXV0b21hdGljYWxseQotICogY3JlYXRlIGEgY29udHJpYnV0b3IgdG8gdGhlIGJhc2UgY2F0ZWdvcnkgYW5kIGFzc2lnbiB0aGUgZWxlbWVudCB0byB0aGUKLSAqIGNvbnRyaWJ1dGluZyBjYXRlZ29yeS4gVGhpcyBpcyBhdm9pZHMgbW9kaWZ5aW5nIHRoZSBiYXNlIG1ldGhvZCBwbHVnLWluLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkVG9DYXRlZ29yeUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnk7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGNhdGVnb3J5UGtnUGF0aDsKLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0ZvckV4aXN0aW5nQ29udHJpYnV0b3I7Ci0KLQlwcml2YXRlIENvbnRlbnRDYXRlZ29yeSB1c2VkQ2F0ZWdvcnkgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGNyZWF0ZU5ld0NvbnRyaWJ1dG9yID0gZmFsc2U7Ci0KLQlwcml2YXRlIENvbnRlbnRQYWNrYWdlIGNhdGVnb3J5UGtnOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBPYmplY3Qgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWU7Ci0KLQlwdWJsaWMgQWRkVG9DYXRlZ29yeUNvbW1hbmQoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5LAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCVN0cmluZ1tdIGNhdGVnb3J5UGtnUGF0aCwgYm9vbGVhbiBjaGVja0ZvckV4aXN0aW5nQ29udHJpYnV0b3IpIHsKLQkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLmNhdGVnb3J5UGtnUGF0aCA9IGNhdGVnb3J5UGtnUGF0aDsKLQkJdGhpcy5jaGVja0ZvckV4aXN0aW5nQ29udHJpYnV0b3IgPSBjaGVja0ZvckV4aXN0aW5nQ29udHJpYnV0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJLy8gY2hlY2sgaWYgdGhpcyBvcGVyYXRpb24gd2lsbCBtb2RpZnkgdGhlIGVsZW1lbnQgaW4gb3Bwb3NpdGUgZmVhdHVyZQotCQkvLyB2YWx1ZQotCQkvLwotCQlyZXR1cm4gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5T3Bwb3NpdGUoY2F0ZWdvcnksIGZlYXR1cmUsCi0JCQkJZWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gIkFkZCBUbyBDYXRlZ29yeSI7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gY3JlYXRlIGNvbnRyaWJ1dG9yIGZvciBjYXRlZ29yeSBpZiBpdCBpcyBub3QgaW4gdGhlIHNhbWUgcGx1Z2luIHdpdGgKLQkJLy8gdGhlIGVsZW1lbnQKLQkJLy8KLQkJTWV0aG9kUGx1Z2luIGVsZW1lbnRQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJTWV0aG9kUGx1Z2luIGNhdGVnb3J5UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkpOwotCQlpZiAoY2F0ZWdvcnlQbHVnaW4gIT0gZWxlbWVudFBsdWdpbgotCQkJCSYmIE1pc2MuaXNCYXNlT2YoY2F0ZWdvcnlQbHVnaW4sIGVsZW1lbnRQbHVnaW4pKSB7Ci0JCQlpZiAoY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIkNvdWxkIG5vdCBhZGQgZWxlbWVudCB0byBhbiBleHRlbmRlZCBjYXRlZ29yeSB0aGF0IGlzIGluIGEgZGlmZmVyZW50IHBsdWctaW46ICIgKyBjYXRlZ29yeSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICghZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJY2F0ZWdvcnlQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShlbGVtZW50UGx1Z2luLAotCQkJCQljYXRlZ29yeVBrZ1BhdGgpOwotCQkJQ29udGVudENhdGVnb3J5IGNvbnRyaWIgPSBudWxsOwotCQkJaWYgKGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvcikgewotCQkJCS8vIGxvb2sgZm9yIHRoZSBleGlzdGluZyBjb250cmlidXRvciBmb3IgdGhlIGNhdGVnb3J5Ci0JCQkJLy8KLQkJCQljb250cmliID0gVG5nVXRpbC5maW5kQ29udHJpYnV0b3IoY2F0ZWdvcnlQa2csIGNhdGVnb3J5KTsKLQkJCX0KLQotCQkJaWYgKGNvbnRyaWIgPT0gbnVsbCkgewotCQkJCWNyZWF0ZU5ld0NvbnRyaWJ1dG9yID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXNlZENhdGVnb3J5ID0gY29udHJpYjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXVzZWRDYXRlZ29yeSA9IGNhdGVnb3J5OwotCQl9Ci0KLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JCXJlZG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAoY3JlYXRlTmV3Q29udHJpYnV0b3IpIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjb250cmliID0gKENvbnRlbnRDYXRlZ29yeSkgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZShjYXRlZ29yeS5lQ2xhc3MoKSk7Ci0JCQljb250cmliLnNldE5hbWUoY2F0ZWdvcnkuZ2V0TmFtZSgpKTsKLQkJCWNvbnRyaWIuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChjYXRlZ29yeSk7Ci0JCQljb250cmliLnNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCk7Ci0JCQljYXRlZ29yeVBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoY29udHJpYik7Ci0JCQl1c2VkQ2F0ZWdvcnkgPSBjb250cmliOwotCQkJaWYgKHVzZWRDYXRlZ29yeSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdCA9IFRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KFVtYVV0aWwKLQkJCQkJCS5nZXRNZXRob2RQbHVnaW4odXNlZENhdGVnb3J5KSk7Ci0JCQkJTGlzdCBsaXN0ID0gcm9vdC5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCQkJbGlzdC5hZGQodXNlZENhdGVnb3J5KTsKLQkJCX0KLQkJfQotCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZShmZWF0dXJlKTsKLQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXJFT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50OwotCQlvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSA9IG1yRU9iai5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5nZXQoCi0JCQkJb3Bwb3NpdGVGZWF0dXJlKTsKLQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSB1c2VkQ2F0ZWdvcnkuZUdldChmZWF0dXJlKTsKLQkJCWlmIChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSBudWxsICYmICFvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlpZiAob2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgIT0gdXNlZENhdGVnb3J5KSB7Ci0JCQkJCUVPYmplY3Qgb2xkT3BwVmFsID0gKEVPYmplY3QpIG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlOwotCQkJCQkoKENvbGxlY3Rpb24pIG9sZE9wcFZhbC5lR2V0KGZlYXR1cmUpKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCWlmIChvbGRPcHBWYWwuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKG9sZE9wcFZhbC5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQotCQkJCQljb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWNvbGxlY3Rpb24uY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQljb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSBudWxsICYmICFvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlpZiAob2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgIT0gdXNlZENhdGVnb3J5KSB7Ci0JCQkJCUVPYmplY3Qgb2xkT3BwVmFsID0gKEVPYmplY3QpIG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlOwotCQkJCQlvbGRPcHBWYWwuZVNldChmZWF0dXJlLCBudWxsKTsKLQkJCQkJaWYgKG9sZE9wcFZhbC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQob2xkT3BwVmFsLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICh1c2VkQ2F0ZWdvcnkgIT0gb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUpIHsKLQkJCQl1c2VkQ2F0ZWdvcnkuZVNldChmZWF0dXJlLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCWlmICh1c2VkQ2F0ZWdvcnkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHVzZWRDYXRlZ29yeS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZShmZWF0dXJlKTsKLQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSB1c2VkQ2F0ZWdvcnkuZUdldChmZWF0dXJlKTsKLQkJCWNvbGxlY3Rpb24ucmVtb3ZlKGVsZW1lbnQpOwotCQl9IGVsc2UgewotCQkJdXNlZENhdGVnb3J5LmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCX0KLQotCQkvLyByZXN0b3JlIG9sZCB2YWx1ZSBvZiB0aGUgc2luZ2xlLXZhbHVlIG9wcG9zaXRlIGZlYXR1cmUKLQkJLy8KLQkJaWYgKCFvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkgJiYgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgIT0gbnVsbAotCQkJCSYmIG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlICE9IHVzZWRDYXRlZ29yeSkgewotCQkJRU9iamVjdCBvbGRPcHBWYWwgPSAoRU9iamVjdCkgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWU7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCSgoQ29sbGVjdGlvbikgb2xkT3BwVmFsLmVHZXQoZmVhdHVyZSkpLmFkZChlbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJb2xkT3BwVmFsLmVTZXQoZmVhdHVyZSwgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY3JlYXRlTmV3Q29udHJpYnV0b3IpIHsKLQkJCWlmIChUbmdVdGlsLmlzRW1wdHkodXNlZENhdGVnb3J5KSkgewotCQkJCUVjb3JlVXRpbC5yZW1vdmUodXNlZENhdGVnb3J5KTsKLQkJCQl1c2VkQ2F0ZWdvcnkgPSBudWxsOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHVzZWRDYXRlZ29yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ2NjYyCi0JCS8vIEJlbG93IGFkZGluZyBjYXRlZ29yeSdzIHJlc291cmNlIHRvIG1vZGlmaWVkUmVzb3VyY2VzIGlzIG5lZWRlZCwgCi0JCS8vIGJlY2F1c2UgYmVmb3JlIGV4ZWN1dGluZyBjb21tYW5kLCBuZWVkIHRvIHZlcmlmeSBpZiByZXNvdXJjZSBpcyBtdXRhYmxlIG9yIG5vdAotCQkvLyBnZXRNb2RpZmllZFJlc291cmNlcygpIGNhbGxlZCBiZWZvcmUgZXhlY3V0aW5nIGFjdHVhbCBleGVjdXRlKCkgaW4gZmV3IGNhc2VzLgotCQkvLyBVc2VmdWwgaW4gc3BlY2lhbCBjYXNlcyBsaWtlIGlmIHJlc291cmNlIGlzIGluIHZlcnNpb24gY29udHJvbC4KLQkJLy8KLQkJaWYoY2F0ZWdvcnkgIT0gbnVsbCAmJiBjYXRlZ29yeS5lUmVzb3VyY2UoKSAhPSBudWxsCi0JCQkJJiYgbW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCl7Ci0JCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoY2F0ZWdvcnkuZVJlc291cmNlKCkpOwotCQl9Ci0JCQotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FkZFRvU2VjdGlvbkxpc3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUwNWU1MjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBhZGQgYSBuZXcgc2VjdGlvbiB0byB0aGUgc2VjdGlvbiBsaXN0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgU2VjdGlvbkxpc3Qgc2VjdGlvbkxpc3Q7Ci0KLQlwcml2YXRlIFNlY3Rpb24gc2VjdGlvbjsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgYm9vbGVhbiBhZGRlZDsKLQotCXB1YmxpYyBBZGRUb1NlY3Rpb25MaXN0Q29tbWFuZChDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCwKLQkJCVNlY3Rpb24gc2VjdGlvbiwgU2VjdGlvbkxpc3Qgc2VjdGlvbkxpc3QpIHsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQl0aGlzLnNlY3Rpb25MaXN0ID0gc2VjdGlvbkxpc3Q7Ci0JCXRoaXMuc2VjdGlvbiA9IHNlY3Rpb247Ci0KLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpKTsKLQkJfWVsc2V7Ci0JCQkvLyBUaGlzIGNoZWNrIGlzIGRvbmUgdG8gYnlwYXNzIGFkZGl0aW9uIG9mIHNlY3Rpb24gdG8gbWV0aG9kIGVsZW1lbnQKLQkJCS8vIGZvciBmaXJzdCB0aW1lLCBpZiBwbHVnaW4ueG1pIGZpbGUgY2hlY2tlZC1vdXQgd2l0aCB2ZXJzaW9uIGNvbnRyb2wuIAotCQkJaWYoY29udGVudEVsZW1lbnQuZVJlc291cmNlKCkgIT0gbnVsbCl7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnRFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJaWYgKGNvbnRlbnRFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXNlY3Rpb25MaXN0LmFkZChzZWN0aW9uKTsKLQkJYWRkZWQgPSB0cnVlOwotCQlzZWN0aW9uTGlzdC5hcHBseSgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGFkZGVkKSB7Ci0JCQlzZWN0aW9uTGlzdC5yZW1vdmUoc2VjdGlvbik7Ci0JCQlzZWN0aW9uTGlzdC5hcHBseSgpOwotCQkJYWRkZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY29udGVudEVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQmF0Y2hDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9CYXRjaENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTFmMTY4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9CYXRjaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgZmVhdHVyZXMgb2YgbXVsdGlwbGUgb2JqZWN0cyBpbgotICogYSBzaW5nbGUgYmF0Y2guCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmF0Y2hDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIE1hcCBvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXA7Ci0JcHJpdmF0ZSBNYXAgb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwOwotCXByaXZhdGUgYm9vbGVhbiBjbGVhcjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gY2xlYXIgaWYgdHJ1ZSB3aWxsIGNsZWFyIHRoZSBtYW55LXZhbHVlZCBmZWF0dXJlIGJlZm9yZSBhZGRpbmcgbmV3IHZhbHVlcyAKLQkgKi8KLQlwdWJsaWMgQmF0Y2hDb21tYW5kKGJvb2xlYW4gY2xlYXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jbGVhciA9IGNsZWFyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjY2FuRXhlY3V0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCAhPSBudWxsICYmICFvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuaXNFbXB0eSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmKG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCA9PSBudWxsIHx8IG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYob2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwID09IG51bGwpIHsKLQkJCW9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuZW50cnlTZXQoKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIGVudHJ5LmdldEtleSgpOwotCQkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZW50cnkKLQkJCQkJCS5nZXRLZXkoKTsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlpZihjbGVhcikgewotCQkJCQkJZU9iai5lU2V0KGZlYXR1cmUsIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJKChMaXN0KSBlT2JqLmVHZXQoZmVhdHVyZSkpLmFkZEFsbCgoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlPYmplY3Qgb2xkVmFsdWUgPSBlT2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWlmIChvbGRWYWx1ZSAhPSBlbnRyeS5nZXRWYWx1ZSgpKSB7Ci0JCQkJCQlzYXZlT2xkRmVhdHVyZVZhbHVlKGVPYmosIGZlYXR1cmUpOwotCQkJCQkJZU9iai5lU2V0KGZlYXR1cmUsIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAgIT0gbnVsbCAmJiAhb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwLmVudHJ5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZW50cnkKLQkJCQkJCQkuZ2V0S2V5KCk7Ci0JCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkoKExpc3QpIGVPYmouZUdldChmZWF0dXJlKSkKLQkJCQkJCQkJLnJlbW92ZUFsbCgoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQotCQkvLyByZXN0b3JlIG9sZCB2YWx1ZQotCQkvLwotCQlpZiAob2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwICE9IG51bGwgJiYgIW9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcC5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBmZWF0dXJlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGVudHJ5Ci0JCQkJCQkJLmdldEtleSgpOwotCQkJCQllT2JqLmVTZXQoZmVhdHVyZSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZVZhbHVlKEVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWFkZEZlYXR1cmVWYWx1ZShnZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKSwgb2JqLCBmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdmFsdWVzIHRvIGEgJ21hbnknIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBmZWF0dXJlIHRoZSBmZWF0dXJlIHdpdGggbWFueSB2YWx1ZXMKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICovCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZVZhbHVlcyhFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gdmFsdWVzKSB7Ci0JCWFkZEZlYXR1cmVWYWx1ZXMoZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCksIG9iaiwgZmVhdHVyZSwgdmFsdWVzKTsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpIHsKLQkJaWYob2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwID09IG51bGwpIHsKLQkJCW9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZU9sZEZlYXR1cmVWYWx1ZShFT2JqZWN0IGVPYmosCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlPYmplY3QgdmFsdWUgPSBlT2JqLmVHZXQoZmVhdHVyZSk7Ci0JCWlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCXZhbHVlID0gbmV3IEFycmF5TGlzdCgoTGlzdCl2YWx1ZSk7Ci0JCX0KLQkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAuZ2V0KGVPYmopOwotCQlpZiAoZmVhdHVyZU1hcCA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCW9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcC5wdXQoZU9iaiwgZmVhdHVyZU1hcCk7Ci0JCX0KLQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgdmFsdWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYob2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwICE9IG51bGwpIHsKLQkJCW9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcC5jbGVhcigpOwotCQkJb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwID0gbnVsbDsKLQkJfQotCQkKLQkJaWYob2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwICE9IG51bGwpIHsKLQkJCW9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcC5jbGVhcigpOwotCQkJb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGZWF0dXJlVmFsdWUoTWFwIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAsCi0JCQlFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuZ2V0KG9iamVjdCk7Ci0JCWlmIChmZWF0dXJlTWFwID09IG51bGwpIHsKLQkJCWZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcC5wdXQob2JqZWN0LCBmZWF0dXJlTWFwKTsKLQkJfQotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJTGlzdCBsaXN0ID0gKExpc3QpIGZlYXR1cmVNYXAuZ2V0KGZlYXR1cmUpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgbGlzdCk7Ci0JCQl9Ci0JCQlsaXN0LmFkZCh2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmVhdHVyZVZhbHVlcyhNYXAgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwKLQkJCUVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLmdldChvYmplY3QpOwotCQlpZiAoZmVhdHVyZU1hcCA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAucHV0KG9iamVjdCwgZmVhdHVyZU1hcCk7Ci0JCX0KLQkJTGlzdCBsaXN0ID0gKExpc3QpIGZlYXR1cmVNYXAuZ2V0KGZlYXR1cmUpOwotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgbGlzdCk7Ci0JCX0KLQkJbGlzdC5hZGRBbGwodmFsdWVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Db21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0NvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZTIxNzczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0NvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi0vKioKLSAqIExpc3RlbnMgdG8gY2hhbmdlcyB0byBhIGNvbW1lbmQgc3RhY2suCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0FWRUQgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhFQ1VURUQgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ETyA9IDQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRPX0FMTCA9IDg7Ci0KLQlwcml2YXRlIGludCB0eXBlOwotCi0JcHVibGljIENvbW1hbmRTdGFja0NoYW5nZWRFdmVudChPYmplY3Qgc291cmNlLCBpbnQgdHlwZSkgewotCQlzdXBlcihzb3VyY2UpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NjcyNzI5NDYwNDI5MjkxNkw7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Db21tYW5kU3RhdHVzQ2hlY2tlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQ29tbWFuZFN0YXR1c0NoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWI0ZWY2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Db21tYW5kU3RhdHVzQ2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogQ2hlY2tzIHRoZSBzdGF0dXMgb2YgYW4gZXhlY3V0ZWQgY29tbWFuZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMjEsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbW1hbmRTdGF0dXNDaGVja2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBoYXNSb2xsYmFja0Vycm9yKElTdGF0dXMgc3RhdHVzKSB7Ci0JCXJldHVybiBoYXNFcnJvcihzdGF0dXMsIFNhdmVTdGF0dXMuUk9MTEJBQ0tfRVJST1IpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBoYXNTYXZlRXJyb3IoSVN0YXR1cyBzdGF0dXMpIHsKLQkJcmV0dXJuIGhhc0Vycm9yKHN0YXR1cywgU2F2ZVN0YXR1cy5TQVZFX0VSUk9SKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaGFzRXJyb3IoSVN0YXR1cyBzdGF0dXMsIGludCBlcnJDb2RlKSB7Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJU3RhdHVzW10gc3RhdHVzZXMgPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXNlcy5sZW5ndGg7IGkrKykgewotCQkJSVN0YXR1cyBjaGlsZFN0YXR1cyA9IHN0YXR1c2VzW2ldOwotCQkJaWYgKGNoaWxkU3RhdHVzIGluc3RhbmNlb2YgU2F2ZVN0YXR1cwotCQkJCQkmJiAoY2hpbGRTdGF0dXMuZ2V0Q29kZSgpICYgZXJyQ29kZSkgPT0gZXJyQ29kZSkgewotCQkJCXJldCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODhlOGMwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVJlZmVyZW5jZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBkZWxldGUgYSBtZXRob2QgZWxlbWVudCBwZXJtYW5lbnRseS4gVGhpcyBpbnZvbHZlcwotICogZGVsZXRpbmcgdGhlIHN0b3JhZ2UgY29udGVudCBhbmQgcmVtb3ZpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhpcyBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kV3JhcHBlciB7Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBlbGVtZW50czsKLQotCXByaXZhdGUgYm9vbGVhbiByZWZSZW1vdmVkOwotCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBjb21tYW5kTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBlbGVtZW50c1RvRGVsZXRlQ29udGVudDsKLQotCXByb3RlY3RlZCBTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JLy8gTWFwIG9mIGVsZW1lbnQgdG8gTWFwIG9mIGl0cyByZWZlcmVuY2VyIHRvIGZlYXR1cmVzIGxpc3QKLQkvLwotCXByb3RlY3RlZCBIYXNoTWFwIGVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwOwotCi0JcHJpdmF0ZSBCYXRjaENvbW1hbmQgYmF0Y2hDb21tYW5kID0gbmV3IEJhdGNoQ29tbWFuZCh0cnVlKTsKLQotCS8qKgotCSAqIExpc3Qgb2YgUmVmZXJlbmNlIG9iamVjdHMKLQkgKiAKLQkgKiBAc2VlIFJlZmVyZW5jZQotCSAqLwotCXByb3RlY3RlZCBBcnJheUxpc3QgcmVtb3ZlZFJlZmVyZW5jZXM7Ci0KLQlwdWJsaWMgYm9vbGVhbiBmYWlsZWQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29uZmlybVJlbW92ZVJlZmVyZW5jZXM7Ci0JCi0JcHJpdmF0ZSBBcnJheUxpc3QgbmVzdGVkQ29tbWFuZHM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudCBvYmplY3RzIHRvIGJlIHBlcm1hbmVudGx5IGRlbGV0ZWQuCi0JICovCi0JcHVibGljIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKENvbW1hbmQgY29tbWFuZCwgQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQl0aGlzKGNvbW1hbmQsIGVsZW1lbnRzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQoQ29tbWFuZCBjb21tYW5kLCBDb2xsZWN0aW9uIGVsZW1lbnRzLAotCQkJYm9vbGVhbiBjb25maXJtUmVtb3ZlUmVmcykgewotCQlzdXBlcihjb21tYW5kKTsKLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzID09IG51bGwgPyBudWxsIDogbmV3IEFycmF5TGlzdChlbGVtZW50cyk7Ci0JCWNvbW1hbmRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNvbmZpcm1SZW1vdmVSZWZlcmVuY2VzID0gY29uZmlybVJlbW92ZVJlZnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJYmF0Y2hDb21tYW5kLmRpc3Bvc2UoKTsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJY29tbWFuZExpc3RlbmVycy5jbGVhcigpOwotCQl9Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQllbGVtZW50cy5jbGVhcigpOwotCQl9Ci0JCWlmIChlbGVtZW50c1RvRGVsZXRlQ29udGVudCAhPSBudWxsKSB7Ci0JCQllbGVtZW50c1RvRGVsZXRlQ29udGVudC5jbGVhcigpOwotCQl9Ci0JCWlmIChlbGVtZW50VG9SZW1vdmVkUmVmc01hcCAhPSBudWxsKSB7Ci0JCQllbGVtZW50VG9SZW1vdmVkUmVmc01hcC5jbGVhcigpOwotCQl9Ci0JCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5jbGVhcigpOwotCQl9Ci0JCWlmIChyZW1vdmVkUmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQlyZW1vdmVkUmVmZXJlbmNlcy5jbGVhcigpOwotCQl9Ci0JCS8vIERpc3Bvc2UgbmVzdGVkIGNvbW1hbmRzLgotCQlpZihuZXN0ZWRDb21tYW5kcyAhPSBudWxsKXsKLQkJCWlmKCFuZXN0ZWRDb21tYW5kcy5pc0VtcHR5KCkpewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5lc3RlZENvbW1hbmRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlDb21tYW5kIGNvbW1hbmQgPSAoQ29tbWFuZCkgaXRlci5uZXh0KCk7Ci0JCQkJCWNvbW1hbmQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN1cGVyRXhlY3V0ZSgpIHsKLQkJc3VwZXIuZXhlY3V0ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlQcmVFeGVjdXRlKCkgewotCQlMaXN0IGNvbW1hbmRMaXN0ZW5lcnMgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29tbWFuZExpc3RlbmVycyhEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5jbGFzcyk7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXJzICE9IG51bGwgJiYgIWNvbW1hbmRMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlDb21tYW5kTGlzdGVuZXIgY21kTGlzdGVuZXIgPSAoSUNvbW1hbmRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJY21kTGlzdGVuZXIucHJlRXhlY3V0ZSh0aGlzKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVByZVVuZG8oKSB7Ci0JCUxpc3QgY29tbWFuZExpc3RlbmVycyA9IFByb3ZpZGVycwotCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmNsYXNzKTsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhY29tbWFuZExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBjbWRMaXN0ZW5lciA9IChJQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQljbWRMaXN0ZW5lci5wcmVVbmRvKHRoaXMpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlRWxlbWVudHMoKSB7Ci0JCUFycmF5TGlzdCBuZXdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCVJlbW92ZUNvbW1hbmQgY21kID0gZ2V0UmVtb3ZlQ29tbWFuZChlbGVtZW50KTsKLQkJCQlpZiAoY21kLmdldEZlYXR1cmUoKSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UKLQkJCQkJCSYmICgoRVJlZmVyZW5jZSkgY21kLmdldEZlYXR1cmUoKSkuaXNDb250YWlubWVudCgpCi0JCQkJCQkmJiBjbWQuZ2V0T3duZXJMaXN0KCkuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQkJLy8gY3VzdG9tIGNhdGVnb3J5IHdpbGwgYmUgZGVsZXRlZCBwZXJtYW5lbnRseQotCQkJCQkvLyBmaW5kIGFsbCBzdWJjYXRlZ29yeSB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBieSBhbnkgb3RoZXIKLQkJCQkJLy8gY3VzdG9tIGNhdGVnb3J5Ci0JCQkJCS8vIGluIHRoZSBzYW1lIHBsdWdpbiB0byBkZWxldGUgdGhlbSBhcyB3ZWxsCi0JCQkJCS8vCi0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IFRuZ1V0aWwKLQkJCQkJCQkuZ2V0RXhjbHVzaXZlU3ViQ3VzdG9tQ2F0ZWdvcmllcygoQ3VzdG9tQ2F0ZWdvcnkpIGVsZW1lbnQpOwotCQkJCQlpZiAoIWNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBzdWJDYXQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKCFlbGVtZW50cy5jb250YWlucyhzdWJDYXQpCi0JCQkJCQkJCQkmJiAhbmV3RWxlbWVudHMuY29udGFpbnMoc3ViQ2F0KSkgewotCQkJCQkJCQljbWQuZ2V0Q29sbGVjdGlvbigpLmFkZChzdWJDYXQpOwotCQkJCQkJCQluZXdFbGVtZW50cy5hZGQoc3ViQ2F0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudHMuYWRkQWxsKG5ld0VsZW1lbnRzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBSZW1vdmVDb21tYW5kIGZvciB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBSZW1vdmVDb21tYW5kIGdldFJlbW92ZUNvbW1hbmQoT2JqZWN0IGUpIHsKLQkJaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBSZW1vdmVDb21tYW5kKSB7Ci0JCQlpZiAoKChSZW1vdmVDb21tYW5kKSBjb21tYW5kKS5nZXRDb2xsZWN0aW9uKCkuY29udGFpbnMoZSkpIHsKLQkJCQlyZXR1cm4gKFJlbW92ZUNvbW1hbmQpIGNvbW1hbmQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvbXBvdW5kQ29tbWFuZCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb21wb3VuZENvbW1hbmQpIGNvbW1hbmQpLmdldENvbW1hbmRMaXN0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjbWQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY21kIGluc3RhbmNlb2YgUmVtb3ZlQ29tbWFuZCkgewotCQkJCQlSZW1vdmVDb21tYW5kIHJlbW92ZUNvbW1hbmQgPSAoUmVtb3ZlQ29tbWFuZCkgY21kOwotCQkJCQlpZiAocmVtb3ZlQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuY29udGFpbnMoZSkpIHsKLQkJCQkJCXJldHVybiByZW1vdmVDb21tYW5kOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXByZXBhcmVFbGVtZW50cygpOwotCi0JCW5vdGlmeVByZUV4ZWN1dGUoKTsKLQotCQllbGVtZW50c1RvRGVsZXRlQ29udGVudCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJY29sbGVjdE9iamVjdHNUb0RlbGV0ZUNvbnRlbnQoZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQsCi0JCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXByZXBhcmVSZW1vdmluZ1JlZmVyZW5jZXMoKTsKLQkJCX0KLQotCQl9OwotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLAotCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnByb2Nlc3NpbmdSZWZlcmVuY2VzVGFza19uYW1lKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmICghZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAuaXNFbXB0eSgpKSB7Ci0JCQkvLyBjb2xsZWN0IHNldCBvZiByZWZlcmVuY2VycwotCQkJSGFzaFNldCByZWZlcmVuY2VycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50VG9SZW1vdmVkUmVmc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwIHJlZmVyZW5jZXJUb0ZlYXR1cmVzTWFwID0gKE1hcCkgaXRlci5uZXh0KCk7Ci0JCQkJLy8gY29sbGVjdCBvbmx5IHJlZmVyZW5jZXIgd2l0aCBhbiB1bmlkaXJlY3Rpb25hbCBvciBjb250YWlubWVudAotCQkJCS8vIHJlbGF0aW9uc2hpcAotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlZmVyZW5jZXJUb0ZlYXR1cmVzTWFwLmVudHJ5U2V0KCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9IChDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQlib29sZWFuIGNhbkNvbGxlY3QgPSBmYWxzZTsKLQkJCQkJY2hlY2tfcmVmOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZiA9IGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJCQlpZiAoZiBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCQkJCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSBmOwotCQkJCQkJCWlmIChyZWYuaXNDb250YWlubWVudCgpCi0JCQkJCQkJCQl8fCByZWYuZ2V0RU9wcG9zaXRlKCkgPT0gbnVsbCkgewotCQkJCQkJCQljYW5Db2xsZWN0ID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWsgY2hlY2tfcmVmOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoY2FuQ29sbGVjdCkgewotCQkJCQkJcmVmZXJlbmNlcnMuYWRkKGVudHJ5LmdldEtleSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gY29uZmlybSB3aXRoIHVzZXIgYmVmb3JlIHJlbW92aW5nIGlsbGVnYWwgcmVmZXJlbmNlcwotCQkJLy8KLQkJCWlmIChjb25maXJtUmVtb3ZlUmVmZXJlbmNlcykgewotCQkJCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIDAsCi0JCQkJCQkiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2Vycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkvLyBkb24ndCBzaG93IHByZWRlZmluZWQgZWxlbWVudAotCQkJCQkvLwotCQkJCQlpZiAoIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKGUpKSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVsZW1lbnRUeXBlX3RleHQsIGUKLQkJCQkJCQkJCQkuZUNsYXNzKCkuZ2V0TmFtZSgpLCBUbmdVdGlsCi0JCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgoZSkpOwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywKLQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJCTAsIG1zZywgbnVsbCk7Ci0JCQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobXVsdGlTdGF0dXMuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwKSB7Ci0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIKLQkJCQkJCQkuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJCQkJaWYgKHVpSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAodWlIYW5kbGVyCi0JCQkJCQkJCS5zZWxlY3RPbmUoCi0JCQkJCQkJCQkJbmV3IGludFtdIHsKLQkJCQkJCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9PSywKLQkJCQkJCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUwgfSwKLQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGV4dCwgbnVsbCkgPT0gSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTCkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gY2hlY2sgaWYgdGhlIHJlZmVyZW5jZXJzIGNhbiBiZSBjaGFuZ2VkCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoCi0JCQkJCQkoRU9iamVjdCkgaXRlci5uZXh0KCksIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0JCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCU1lc3Nlbmdlci5JTlNUQU5DRQotCQkJCQkJCS5zaG93RXJyb3IoCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVFbGVtZW50RXJyb3JfbXNnLAotCQkJCQkJCQkJc3RhdHVzKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCVNldCB1bm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQotCQkvLyBnZXQgdGhlIG93bmVyIHJlc291cmNlcyBiZWZvcmUgdGhlIGVsZW1lbnRzIGdvdCByZW1vdmVkIGZyb20KLQkJLy8gY29udGFpbmVyIGluIHN1cGVyRXhlY3V0ZSgpCi0JCS8vCi0JCWNvbGxlY3RPd25lclJlc291cmNlcyhtb2RpZmllZFJlc291cmNlcywgdW5tb2RpZmllZFJlc291cmNlcyk7Ci0KLQkJc3VwZXJFeGVjdXRlKCk7Ci0JCQotCQlleGVjdXRlTmVzdGVkQ29tbWFuZHMoKTsKLQkJCi0JCS8vIENvbGxlY3QgdGhlIG5lc3RlZCBjb21tYW5kIG1vZGlmaWVkIHJlc291cmNlcyBmb3Igc2F2aW5nLiAKLQkJY29sbGVjdE5lc3RlZENvbW1hbmRSZXNvdXJjZXMobW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCS8vIGdldCByZXNvdXJjZXMgb2YgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gYWZmZWN0ZWQgYnkgdGhpcyBjb21tYW5kCi0JCS8vIHVudGlsIG5vdwotCQkvLwotCQljb2xsZWN0UmVzb3VyY2VzKG1vZGlmaWVkUmVzb3VyY2VzLCBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKSk7Ci0KLQkJbW9kaWZpZWRSZXNvdXJjZXMucmVtb3ZlQWxsKHVubW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCWZpbmFsIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnMgPSBuZXcgRXhjZXB0aW9uWzFdOwotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVtb3ZlUmVmZXJlbmNlcygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWV4Y2VwdGlvbnNbMF0gPSBlOwotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQotCQlpZiAoZXhjZXB0aW9uc1swXSAhPSBudWxsKSB7Ci0JCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0Vycm9yKAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVEaWFsb2dfdGl0bGUsCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZUVsZW1lbnRFcnJvcl9tc2csCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb24sCi0JCQkJCWV4Y2VwdGlvbnNbMF0pOwotCQkJCQotCQkJdW5kbygpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkQWxsKGdldFJlZmVyZW5jaW5nUmVzb3VyY2VzKCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9EZWxldGVDb250ZW50Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0KLQkJZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCi0JCUhhc2hTZXQ8UmVzb3VyY2U+IGRlbGV0ZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlVbWFVdGlsLmdldFJlc291cmNlcyhlLCBkZWxldGVkUmVzb3VyY2VzKTsKLQkJfQotCQkKLQkJLy8gZXhjbHVkZSBkZWxldGVkIHJlc291cmNlcyBmcm9tIHRoZSBzZXQgb2YgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCS8vCi0JCW1vZGlmaWVkUmVzb3VyY2VzLnJlbW92ZUFsbChkZWxldGVkUmVzb3VyY2VzKTsKLQkJCi0JCS8vIGNoZWNrIGFmZmVjdGVkIHJlc291cmNlcyBmb3IgdW5tb2RpZmlhYmxlCi0JCS8vCi0JCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KG1vZGlmaWVkUmVzb3VyY2VzLAotCQkJCU1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcigKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlRGlhbG9nX3RpdGxlLAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVFbGVtZW50RXJyb3JfbXNnLCBzdGF0dXMpOwotCi0JCQl1bmRvKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMyk7Ci0JCQkJZ2V0UGVyc2lzdGVyKCk7Ci0KLQkJCQkvLyBzYXZlIHJlc291cmNlcyB0aGF0IGhhZCBiZWVuIGNoYW5nZWQgYWZ0ZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkJCQkvLyBkZWxldGVkIGVsZW1lbnRzCi0JCQkJLy8gaGFkIGJlZW4gcmVtb3ZlZAotCQkJCS8vCi0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvcgotCQkJCQkJCS5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWUpOwotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJZGVsZXRlQ29udGVudCgpOwotCi0JCQkJCS8vIHNhdmUgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCQkJCS8vCi0JCQkJCW1vbml0b3Iuc3ViVGFzaygiU2F2aW5nIHJlc291cmNlcyIpOwotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQotCQkJCQlleGVjdXRlZCA9IHRydWU7Ci0KLQkJCQkJcmVtb3ZlQWRhcHRlcnMoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQlmYWlsZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotCQkJCQkJdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCS8vIGlmICghVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwKLQkJLy8gTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRpbmdFbGVtZW50c1Rhc2tfbmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkvLyBpZiAoZmFpbGVkKSB7Ci0JCS8vIG5vdGlmeUZhaWx1cmUoKTsKLQkJLy8gfSBlbHNlIHsKLQkJLy8gdW5kbygpOwotCQkvLyB9Ci0JCS8vIHJldHVybjsKLQkJLy8gfQotCi0vLwkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bkluVUkocnVubmFibGUsIChTaGVsbCkgbnVsbCk7Ci0JCQotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lKTsKLQotCQlpZiAoZXhlY3V0ZWQpIHsKLQkJCW5vdGlmeUV4ZWN1dGVkKCk7Ci0JCQlMaXN0IHdhcm5pbmdzID0gcGVyc2lzdGVyLmdldFdhcm5pbmdzKCk7Ci0JCQlpZiAoIXdhcm5pbmdzLmlzRW1wdHkoKSkgewotCQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZTsKLQkJCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZzsKLQkJCQlTdHJpbmdCdWZmZXIgcmVhc29uID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdhcm5pbmdzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlFeGNlcHRpb24gZSA9IChFeGNlcHRpb24pIGl0ZXIubmV4dCgpOwotCQkJCQlTdHJpbmcgc3RyID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJCWlmICghU3RyVXRpbC5pc0JsYW5rKHN0cikpIHsKLQkJCQkJCXJlYXNvbi5hcHBlbmQoc3RyKS5hcHBlbmQoJ1xuJyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd1dhcm5pbmcodGl0bGUsIG1zZywgcmVhc29uLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGZhaWxlZCkgewotCQkJCW5vdGlmeUZhaWx1cmUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdW5kbygpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgYWxsIHN0YXRlZnVsIGFkYXB0ZXJzLCB0aGVuIHJlbW92ZXMgYWxsIGFkYXB0ZXJzIHRoYXQgYXJlCi0JICogYXR0YWNoZWQgdG8gdGhlIGdpdmVuIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFkYXB0ZXJzKEVPYmplY3QgZWxlbWVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFycmF5TGlzdChlbGVtZW50LmVBZGFwdGVycygpKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSVN0YXRlZnVsSXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJU3RhdGVmdWxJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLmRpc3Bvc2UoKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXIpCi0JCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElSZWZlcmVuY2VyKSB7Ci0JCQkJCQkoKElSZWZlcmVuY2VyKSBhZGFwdGVyRmFjdG9yeSkucmVtb3ZlKGFkYXB0ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsZW1lbnQuZUFkYXB0ZXJzKCkuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBhbGwgc3RhdGVmdWwgYWRhcHRlcnMsIHRoZW4gcmVtb3ZlcyBhbGwgYWRhcHRlcnMgdGhhdCBhcmUKLQkgKiBhdHRhY2hlZCB0byB0aGUgZGVsZXRlZCBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFkYXB0ZXJzKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBvYmo7Ci0JCQkJaWYgKGVsZW1lbnQuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlyZW1vdmVBZGFwdGVycyhlKTsKLQkJCQkJfQotCQkJCQlyZW1vdmVBZGFwdGVycyhlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5RmFpbHVyZSgpIHsKLQkJRXZlbnRPYmplY3QgZXZlbnRPYmplY3QgPSBuZXcgRXZlbnRPYmplY3QodGhpcyk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lciA9IChDb21tYW5kTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJbGlzdGVuZXIubm90aWZ5RmFpbHVyZShldmVudE9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBnZXRQZXJzaXN0ZXIoKSB7Ci0JCWlmIChwZXJzaXN0ZXIgPT0gbnVsbCkgewotCQkJcGVyc2lzdGVyID0gU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKQotCQkJCQkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVyOwotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlFeGVjdXRlZCgpIHsKLQkJRXZlbnRPYmplY3QgZXZlbnRPYmplY3QgPSBuZXcgRXZlbnRPYmplY3QodGhpcyk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5jb21tYW5kTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyID0gKENvbW1hbmRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5ub3RpZnlFeGVjdXRlZChldmVudE9iamVjdCk7Ci0JCX0KLQotCQlMaXN0IGNvbW1hbmRMaXN0ZW5lcnMgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29tbWFuZExpc3RlbmVycyhEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5jbGFzcyk7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXJzICE9IG51bGwgJiYgIWNvbW1hbmRMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlDb21tYW5kTGlzdGVuZXIgY21kTGlzdGVuZXIgPSAoSUNvbW1hbmRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJY21kTGlzdGVuZXIubm90aWZ5RXhlY3V0ZWQodGhpcyk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRSZWZlcmVuY2luZ1Jlc291cmNlcygpIHsKLQkJSGFzaFNldCByZWZlcnJlcnMgPSBuZXcgSGFzaFNldCgpOwotCi0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZWRSZWZlcmVuY2VzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBNYXAgcmVmZXJyZXJUb0ZlYXR1cmVzTWFwID0gKE1hcCkgaXRlci5uZXh0KCk7Ci0JCS8vIHJlZmVycmVycy5hZGRBbGwocmVmZXJyZXJUb0ZlYXR1cmVzTWFwLmtleVNldCgpKTsKLQkJLy8gfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZWRSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIGl0ZXIubmV4dCgpOwotCQkJcmVmZXJyZXJzLmFkZChyZWYub3duZXIpOwotCQl9Ci0KLQkJSGFzaFNldCByZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcnJlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VzLmFkZChlbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIENvbGxlY3RzIG93bmVyIHJlc291cmNlcyBvZiB0aGUgZWxlbWVudHMgdG8gYmUgZGVsZXRlZCB0byBzYXZlIGxhdGVyLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29sbGVjdE93bmVyUmVzb3VyY2VzKFNldCByZXNvdXJjZXMsIFNldCB1bm1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IFNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZUNvbnRhaW5lcigpOwotCQkJCVJlc291cmNlIHJlc291cmNlID0gY29udGFpbmVyLmVSZXNvdXJjZSgpOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChwZXJzaXN0ZXIuaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoZWxlbWVudCkpIHsKLQkJCQkJCXVubW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdFJlc291cmNlcyhTZXQgcmVzb3VyY2VzLCBDb2xsZWN0aW9uIG9iamVjdHMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRU9iamVjdCBlT2JqID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJaWYgKGVPYmouZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZXMuYWRkKGVPYmouZVJlc291cmNlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJc3VwZXIucmVkbygpOwotCQlyZW1vdmVSZWZlcmVuY2VzKCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVDb250ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9EZWxldGVDb250ZW50Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudDsKLQkJCQlpZiAoZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQlwZXJzaXN0ZXIuZGVsZXRlKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzKCkgewotCQlDb2xsZWN0aW9uIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkJJiYgd2lsbFJlbW92ZUVsZW1lbnRGcm9tQ29udGFpbmVyKChFT2JqZWN0KSBlbGVtZW50KSkgewotCQkJCWxpc3QuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhblJlbW92ZVJlZmVyZW5jZXMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCS8vIGlmIGUgaXMgb25lIG9mIHRoZSBkZWxldGVkIGVsZW1lbnRzLCBtYWtlIHN1cmUgdGhhdCBpdCBhY3R1YWxseSBnb3QKLQkJLy8gZGVsZXRlZCBieSBjaGVja2luZyBpdHMgY29udGFpbmVyCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChlID09IG9iaikgewotCQkJCXJldHVybiBlLmVDb250YWluZXIoKSA9PSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGFsbCBvcHBvc2l0ZSBmZWF0dXJlcyBvZiB0aGUgZWxlbWVudHMgdG8gYmUgZGVsZXRlZAotCSAqIAotCSAqIEByZXR1cm4gbGlzdCBvZiBlbGVtZW50cyB3aG9zZSBvcHBvc2l0ZSBmZWF0dXJlcyBhcmUgbG9hZGVkCi0JICovCi0JcHVibGljIExpc3QgbG9hZE9wcG9zaXRlRmVhdHVyZXMoKSB7Ci0JCUhhc2hTZXQgb3Bwb3NpdGVGZWF0dXJlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUhhc2hTZXQgZGVsZXRlZEdVSURzID0gbmV3IEhhc2hTZXQoKTsKLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGUuZUFsbENvbnRlbnRzKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJTWFwIG9wcG9zaXRlRmVhdHVyZU1hcCA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQpCi0JCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKTsKLQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmVNYXAgIT0gbnVsbAotCQkJCQkJCQkmJiAhb3Bwb3NpdGVGZWF0dXJlTWFwLmlzRW1wdHkoKSkgewotCQkJCQkJCW9wcG9zaXRlRmVhdHVyZXMKLQkJCQkJCQkJCS5hZGRBbGwob3Bwb3NpdGVGZWF0dXJlTWFwLmtleVNldCgpKTsKLQkJCQkJCQlkZWxldGVkR1VJRHMuYWRkKCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkKLQkJCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsZW1lbnRzLmFkZChlKTsKLQkJCQlNYXAgb3Bwb3NpdGVGZWF0dXJlTWFwID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgZSkKLQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKTsKLQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlTWFwICE9IG51bGwgJiYgIW9wcG9zaXRlRmVhdHVyZU1hcC5pc0VtcHR5KCkpIHsKLQkJCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGRBbGwob3Bwb3NpdGVGZWF0dXJlTWFwLmtleVNldCgpKTsKLQkJCQkJZGVsZXRlZEdVSURzLmFkZCgoKE1ldGhvZEVsZW1lbnQpIGUpLmdldEd1aWQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJbG9hZE9wcG9zaXRlRmVhdHVyZXMobmV3IEFycmF5TGlzdChvcHBvc2l0ZUZlYXR1cmVzKSwgZGVsZXRlZEdVSURzKTsKLQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29udGFpbmVkQnlEZWxldGVkRWxlbWVudChFT2JqZWN0IGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZGVsZXRlZCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChkZWxldGVkIGluc3RhbmNlb2YgRU9iamVjdCAmJiBVbWFVdGlsLmlzQ29udGFpbmVkQnkoZSwgZGVsZXRlZCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ29sbGVjdHMgb2JqZWN0cyB0aGF0IHNob3VsZCBiZSByZW1vdmVkIGlmIDxjb2RlPmVsZW1lbnRUb0RlbGV0ZTwvY29kZT4KLQkgKiB3aWxsIGJlIHJlbW92ZWQgZnJvbSA8Y29kZT5yZWZlcmVuY2VzPC9jb2RlPiBvZiA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0c1RvUmVtb3ZlCi0JICogICAgICAgICAgICBvdXRwdXQKLQkgKiBAcGFyYW0gcmVmZXJlbmNlcgotCSAqICAgICAgICAgICAgZWxlbWVudCB0aGF0IHJlZmVyZW5jZXMgdG8gZWxlbWVudFRvRGVsZXRlCi0JICogQHBhcmFtIHJlZmVyZW5jZXMKLQkgKiAgICAgICAgICAgIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEVSZWZlcmVuY2V9IHRoYXQgY29udGFpbnMgZWxlbWVudFRvRGVsZXRlCi0JICogQHJldHVybiB0cnVlIGlmIG9uZSBvZiB0aGUgY29sbGVjdGVkIG9iamVjdHMgaXMgdGhlCi0JICogICAgICAgICA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPiBvciB0aGUgY29udGFpbmVyIG9mCi0JICogICAgICAgICA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbGxlY3RPYmplY3RzVG9SZW1vdmUoQ29sbGVjdGlvbiBvYmplY3RzVG9SZW1vdmUsCi0JCQlFT2JqZWN0IGVsZW1lbnRUb0RlbGV0ZSwgRU9iamVjdCByZWZlcmVuY2VyLCBDb2xsZWN0aW9uIHJlZmVyZW5jZXMpIHsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJTGlzdCBjb21tYW5kTGlzdGVuZXJzID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbW1hbmRMaXN0ZW5lcnMoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQuY2xhc3MpOwotCQlpZiAoY29tbWFuZExpc3RlbmVycyAhPSBudWxsICYmICFjb21tYW5kTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY21kTGlzdGVuZXIgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY21kTGlzdGVuZXIgaW5zdGFuY2VvZiBJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRMaXN0ZW5lcikgewotCQkJCQl0cnkgewotCQkJCQkJYm9vbGVhbiBiID0gKChJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRMaXN0ZW5lcikgY21kTGlzdGVuZXIpCi0JCQkJCQkJCS5jb2xsZWN0T2JqZWN0c1RvUmVtb3ZlKG9iamVjdHNUb1JlbW92ZSwKLQkJCQkJCQkJCQllbGVtZW50VG9EZWxldGUsIHJlZmVyZW5jZXIsIHJlZmVyZW5jZXMpOwotCQkJCQkJaWYgKGIpIHsKLQkJCQkJCQlyZXQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB3aWxsUmVtb3ZlRWxlbWVudEZyb21Db250YWluZXIoRU9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICh3aWxsUmVtb3ZlRWxlbWVudEZyb21Db250YWluZXIoY29tbWFuZCwgZWxlbWVudCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3VuZENvbW1hbmQpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29tcG91bmRDb21tYW5kKSBjb21tYW5kKS5nZXRDb21tYW5kTGlzdCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAod2lsbFJlbW92ZUVsZW1lbnRGcm9tQ29udGFpbmVyKGNtZCwgZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHdpbGxSZW1vdmVFbGVtZW50RnJvbUNvbnRhaW5lcihDb21tYW5kIGNtZCwKLQkJCUVPYmplY3QgZWxlbWVudCkgewotCQlpZiAoY21kIGluc3RhbmNlb2YgUmVtb3ZlQ29tbWFuZCkgewotCQkJUmVtb3ZlQ29tbWFuZCByZW1vdmVDb21tYW5kID0gKChSZW1vdmVDb21tYW5kKSBjbWQpOwotCQkJcmV0dXJuIHJlbW92ZUNvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLmNvbnRhaW5zKGVsZW1lbnQpCi0JCQkJCSYmIHJlbW92ZUNvbW1hbmQuZ2V0T3duZXIoKSA9PSBlbGVtZW50LmVDb250YWluZXIoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVJlbW92aW5nUmVmZXJlbmNlcygpIHsKLQkJTGlzdCBlbGVtZW50cyA9IGxvYWRPcHBvc2l0ZUZlYXR1cmVzKCk7Ci0KLQkJZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlIYXNoU2V0IG9iamVjdHNUb1JlbW92ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJTWFwIHJlZk1hcCA9IEFzc29jaWF0aW9uSGVscGVyLmdldFJlZmVyZW5jZU1hcChlbGVtZW50KTsKLQkJCWlmICghcmVmTWFwLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZWZNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUVPYmplY3QgcmVmZXJlbmNlciA9IChFT2JqZWN0KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJQ29sbGVjdGlvbiByZWZlcmVuY2VzID0gKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCWJvb2xlYW4gYiA9IGNvbGxlY3RPYmplY3RzVG9SZW1vdmUob2JqZWN0c1RvUmVtb3ZlLAotCQkJCQkJCWVsZW1lbnQsIHJlZmVyZW5jZXIsIHJlZmVyZW5jZXMpOwotCQkJCQlpZiAoYiB8fCBlbGVtZW50cy5jb250YWlucyhyZWZlcmVuY2VyKQotCQkJCQkJCXx8IGlzQ29udGFpbmVkQnlEZWxldGVkRWxlbWVudChyZWZlcmVuY2VyKSkgewotCQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFyZWZNYXAuaXNFbXB0eSgpKQotCQkJCQllbGVtZW50VG9SZW1vdmVkUmVmc01hcC5wdXQoZWxlbWVudCwgcmVmTWFwKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBlbnRyaWVzIGZvciBvYmplY3RzVG9SZW1vdmUgdG8gZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0c1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlNYXAgbWFwID0gKE1hcCkgZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAuZ2V0KG9iaik7Ci0JCQlpZiAobWFwID09IG51bGwpIHsKLQkJCQltYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLnB1dChvYmosIG1hcCk7Ci0JCQl9Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9IG9iai5lQ29udGFpbmVyKCk7Ci0JCQlFUmVmZXJlbmNlIGNvbnRhaW5tZW50RmVhdHVyZSA9IG9iai5lQ29udGFpbm1lbnRGZWF0dXJlKCk7Ci0JCQlDb2xsZWN0aW9uIHJlZnMgPSAoQ29sbGVjdGlvbikgbWFwLmdldChjb250YWluZXIpOwotCQkJaWYgKHJlZnMgPT0gbnVsbCkgewotCQkJCXJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcmVmcy5hZGQoY29udGFpbm1lbnRGZWF0dXJlKTsKLQkJCQltYXAucHV0KGNvbnRhaW5lciwgcmVmcyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghcmVmcy5jb250YWlucyhjb250YWlubWVudEZlYXR1cmUpKSB7Ci0JCQkJCXJlZnMuYWRkKGNvbnRhaW5tZW50RmVhdHVyZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcmVtb3ZlIGFsbCBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBlbGVtZW50OwotCQkJCU1hcCBvYmpUb1JlZnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWZvciAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yIGZlYXR1cmVJdGVyYXRvciA9IChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IpIGVPYmplY3QKLQkJCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgZmVhdHVyZUl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgZmVhdHVyZUl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJRVJlZmVyZW5jZSBlUmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGZlYXR1cmVJdGVyYXRvcgotCQkJCQkJCS5mZWF0dXJlKCk7Ci0JCQkJCWlmIChlUmVmZXJlbmNlLmdldEVPcHBvc2l0ZSgpICE9IG51bGwpIHsKLQkJCQkJCUxpc3QgcmVmcyA9IChMaXN0KSBvYmpUb1JlZnNNYXAuZ2V0KGVPYmopOwotCQkJCQkJaWYgKHJlZnMgPT0gbnVsbCkgewotCQkJCQkJCXJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJb2JqVG9SZWZzTWFwLnB1dChlT2JqLCByZWZzKTsKLQkJCQkJCX0KLQkJCQkJCXJlZnMuYWRkKGVSZWZlcmVuY2UuZ2V0RU9wcG9zaXRlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCU1hcCBtYXAgPSAoTWFwKSBlbGVtZW50VG9SZW1vdmVkUmVmc01hcC5nZXQoZU9iamVjdCk7Ci0JCQkJaWYgKG1hcCA9PSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLnB1dChlT2JqZWN0LCBvYmpUb1JlZnNNYXApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIG1lcmdlIG9ialRvUmVmc01hcCB0byBtYXAKLQkJCQkJLy8KLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG9ialRvUmVmc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCU9iamVjdCBvYmogPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJCUNvbGxlY3Rpb24gcmVmcyA9IChDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQkJQ29sbGVjdGlvbiBleGlzdGluZ1JlZnMgPSAoQ29sbGVjdGlvbikgbWFwLmdldChvYmopOwotCQkJCQkJaWYgKGV4aXN0aW5nUmVmcyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcmVmcy5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3QgcmVmID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmICghZXhpc3RpbmdSZWZzLmNvbnRhaW5zKHJlZikpIHsKLQkJCQkJCQkJCWV4aXN0aW5nUmVmcy5hZGQocmVmKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJbWFwLnB1dChvYmosIHJlZnMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29sbGVjdGVkT2JqZWN0cwotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudCB0aGF0IHdpbGwgYmUgZGVsZXRlZCBieSB0aGlzIGNvbW1hbmQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0T2JqZWN0c1RvRGVsZXRlQ29udGVudChDb2xsZWN0aW9uIGNvbGxlY3RlZE9iamVjdHMsCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJLy8gdGhpcyBzcGVjaWFsIGhhbmRsaW5nIGlzIG5vIGxvbmdlciBuZWVkZWQgc2luY2UgYWZmZWN0ZWQKLQkJLy8gc3ViY2F0ZWdvcmllcyBhcmUgYWRkZWQKLQkJLy8gdG8gdGhlIGxpc3Qgb2YgZWxlbWVudHMgdG8gYmUgZGVsZXRlZAotCQkvLwotCQkvLyBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCS8vIC8vIGhhdmUgdG8gaGFuZGxlIEN1c3RvbUNhdGVnb3J5IHNwZWNpYWxseSBzaW5jZSBkZWxldGluZyBhCi0JCS8vIC8vIEN1c3RvbUNhdGVnb3J5IG1pZ2h0IHRyaWdlciBkZWxldGluZwotCQkvLyAvLyBpdHMgc3ViY2F0ZWdvcmllcyBldmVuIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhIEN1c3RvbUNhdGVnb3J5Ci0JCS8vIGFuZAotCQkvLyAvLyBpdHMgc3ViY2F0ZWdvcmllcyBpcwotCQkvLyAvLyBub24tY29udGFpbm1lbnQgcmVmZXJlbmNlCi0JCS8vIC8vCi0JCS8vIEl0ZXJhdG9yIGl0ZXIxID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGVsZW1lbnQsIGZhbHNlKSB7Ci0JCS8vCi0JCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02Mjg1OTY5OTIzMTM4NzgxNDM3TDsKLQkJLy8gcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBDb2xsZWN0aW9uIGNhdEVsZW1lbnRzID0gKChDdXN0b21DYXRlZ29yeSkgb2JqZWN0KQotCQkvLyAuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY2F0RWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJLy8gLmhhc05leHQoKTspIHsKLQkJLy8gT2JqZWN0IGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCS8vIGlmIChlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJLy8gY2hpbGRyZW4uYWRkKGUpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gfTsKLQkJLy8gd2hpbGUgKGl0ZXIxLmhhc05leHQoKSkgewotCQkvLyBjb2xsZWN0ZWRPYmplY3RzLmFkZChpdGVyMS5uZXh0KCkpOwotCQkvLyB9Ci0JCS8vIH0KLQotCQlMaXN0IGNvbW1hbmRMaXN0ZW5lcnMgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29tbWFuZExpc3RlbmVycyhEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5jbGFzcyk7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXJzICE9IG51bGwgJiYgIWNvbW1hbmRMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjbWRMaXN0ZW5lciA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChjbWRMaXN0ZW5lciBpbnN0YW5jZW9mIElEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkoKElEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyKSBjbWRMaXN0ZW5lcikKLQkJCQkJCQkJLmNvbGxlY3RPYmplY3RzVG9EZWxldGVDb250ZW50KAotCQkJCQkJCQkJCWNvbGxlY3RlZE9iamVjdHMsIGVsZW1lbnQpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVmZXJlbmNlcygpIHsKLQkJaWYgKHJlZlJlbW92ZWQpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHJlbW92ZWRSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXJlbW92ZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlZFJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50VG9SZW1vdmVkUmVmc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlNZXRob2RFbGVtZW50IHJlZmVyZW5jZWQgPSAoTWV0aG9kRWxlbWVudCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQlpZiAoY2FuUmVtb3ZlUmVmZXJlbmNlcyhyZWZlcmVuY2VkKSkgewotCQkJCU1hcCByZW1vdmVkUmVmTWFwID0gKE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVtb3ZlZFJlZk1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlFT2JqZWN0IHJlZmVyZW5jZXIgPSAoRU9iamVjdCkgZW50LmdldEtleSgpOwotCQkJCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gKENvbGxlY3Rpb24pIGVudC5nZXRWYWx1ZSgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXRlcjEuaGFzTmV4dCgpOykgewotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyMQotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQlMaXN0IGxpc3QgPSAoKExpc3QpIHJlZmVyZW5jZXIuZUdldChmZWF0dXJlKSk7Ci0KLQkJCQkJCQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2YocmVmZXJlbmNlZCk7Ci0JCQkJCQkJLy8gbGlzdC5yZW1vdmUoaW5kZXgpOwotCQkJCQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCQkJCQlsaXN0LnJlbW92ZShpbmRleCk7Ci0JCQkJCQkJCXJlbW92ZWRSZWZlcmVuY2VzLmFkZChuZXcgUmVmZXJlbmNlKHJlZmVyZW5jZXIsCi0JCQkJCQkJCQkJZmVhdHVyZSwgcmVmZXJlbmNlZCwgaW5kZXgpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCQkucHJpbnRsbigiRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQucmVtb3ZlUmVmZXJlbmNlcygpOiBpbmRleD0iICsgaW5kZXggKyAiLCBzaXplPSIgKyBsaXN0LnNpemUoKSArICIsIHJlZmVyZW5jZXI9IiArIHJlZmVyZW5jZXIgKyAiLCByZWZlcmVuY2VkPSIgKyByZWZlcmVuY2VkICsgIiwgZmVhdHVyZT0iICsgZmVhdHVyZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQkJCQl9Ci0JCQkJCQkJCS8vIHdvcmstYXJvdW5kOiB0cnkgdG8gZmluZCB0aGUgcHJveHkgYW5kIHJlbW92ZQotCQkJCQkJCQkvLyBpdC4KLQkJCQkJCQkJLy8gVE9ETzoga2luZCBvZiBoYWNrLCBuZWVkcyByZXZpc2l0Ci0JCQkJCQkJCS8vCi0JCQkJCQkJCVN0cmluZyBndWlkID0gKChNZXRob2RFbGVtZW50KSByZWZlcmVuY2VkKQotCQkJCQkJCQkJCS5nZXRHdWlkKCk7Ci0JCQkJCQkJCWZpbmRfcHJveHk6IGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCQkJCQkJSW50ZXJuYWxFT2JqZWN0IHJlZiA9IChJbnRlcm5hbEVPYmplY3QpIGxpc3QKLQkJCQkJCQkJCQkJLmdldChpKTsKLQkJCQkJCQkJCVVSSSB1cmkgPSByZWYuZVByb3h5VVJJKCk7Ci0JCQkJCQkJCQlpZiAodXJpICE9IG51bGwKLQkJCQkJCQkJCQkJJiYgZ3VpZC5lcXVhbHModXJpLmZyYWdtZW50KCkpKSB7Ci0JCQkJCQkJCQkJbGlzdC5yZW1vdmUoaSk7Ci0JCQkJCQkJCQkJcmVtb3ZlZFJlZmVyZW5jZXMuYWRkKG5ldyBSZWZlcmVuY2UoCi0JCQkJCQkJCQkJCQlyZWZlcmVuY2VyLCBmZWF0dXJlLAotCQkJCQkJCQkJCQkJcmVmZXJlbmNlZCwgaSkpOwotCQkJCQkJCQkJCWJyZWFrIGZpbmRfcHJveHk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJlZmVyZW5jZXIuZVNldChmZWF0dXJlLCBudWxsKTsKLQkJCQkJCQlyZW1vdmVkUmVmZXJlbmNlcy5hZGQobmV3IFJlZmVyZW5jZShyZWZlcmVuY2VyLAotCQkJCQkJCQkJZmVhdHVyZSwgcmVmZXJlbmNlZCwgLTEpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChUbmdVdGlsLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJyZW1vdmVkUmVmZXJlbmNlczogc2l6ZT0iICsgcmVtb3ZlZFJlZmVyZW5jZXMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJYmF0Y2hDb21tYW5kLmdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpLmNsZWFyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZWRSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZi5nZXRGZWF0dXJlKCkgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKSB7Ci0JCQkJYmF0Y2hDb21tYW5kCi0JCQkJCQkuYWRkRmVhdHVyZVZhbHVlKAotCQkJCQkJCQlyZWYuZ2V0T3duZXIoKSwKLQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFLAotCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUKLQkJCQkJCQkJCQkuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkJCWlmIChyZWYuZ2V0T3duZXIoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCS8vIEZpbGwgYmxhbmsgcHJlc2VudGF0aW9uIG5hbWUgb2YgZXh0ZW5kZWQvbG9jYWxseQotCQkJCQkvLyBjb250cmlidXRpbmcgYWN0aXZpdHkgd2l0aCBwcmVzZW50YXRpb24gbmFtZQotCQkJCQkvLyBmcm9tIGJhc2UgYWN0aXZpdHkgd2hlbiBiYXNlIGlzIGRlbGV0ZWQKLQkJCQkJLy8KLQkJCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSByZWYuZ2V0T3duZXIoKTsKLQkJCQkJVmFyaWFiaWxpdHlUeXBlIHZUeXBlID0gYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCQlpZiAoKHZUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwgfHwgdlR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMKQotCQkJCQkJCSYmIFN0clV0aWwuaXNOdWxsKGFjdC5nZXRQcmVzZW50YXRpb25OYW1lKCkpKSB7Ci0JCQkJCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSByZWYuZ2V0VmFsdWUoKTsKLQkJCQkJCWJhdGNoQ29tbWFuZAotCQkJCQkJCQkuYWRkRmVhdHVyZVZhbHVlKAotCQkJCQkJCQkJCWFjdCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJCQkJCQkJCVByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoYmFzZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChiYXRjaENvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQliYXRjaENvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0KLQkJcmVmUmVtb3ZlZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJlc29sdmUgYWxsIHRhcmdldCBmZWF0dXJlcyBzbwotCSAqIG9wcG9zaXRlIGZlYXR1cmVzIG9mIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50IGFyZSBmdWxseSBsb2FkZWQuCi0JICogCi0JICogQHBhcmFtIGRlbGV0ZWRHVUlEcwotCSAqIAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoTGlzdCBvcHBvc2l0ZUZlYXR1cmVzLCBTZXQgZGVsZXRlZEdVSURzKSB7Ci0JCS8vCi0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlc3RvcmVSZWZlcmVuY2VzKExpc3QgcmVtb3ZlZFJlZmVyZW5jZXMpIHsKLQkJZm9yIChpbnQgaSA9IHJlbW92ZWRSZWZlcmVuY2VzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgcmVtb3ZlZFJlZmVyZW5jZXMuZ2V0KGkpOwotCQkJaWYgKHJlZi5mZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJTGlzdCBsaXN0ID0gKExpc3QpIHJlZi5vd25lci5lR2V0KHJlZi5mZWF0dXJlKTsKLQkJCQlpZiAocmVmLmluZGV4ICE9IC0xKSB7Ci0JCQkJCS8vIFRPRE86IG5lZWQgcmV2aXNpdHMKLQkJCQkJLy8KLQkJCQkJaWYgKCFsaXN0LmNvbnRhaW5zKHJlZi52YWx1ZSkpIHsKLQkJCQkJCWlmIChyZWYuaW5kZXggPCBsaXN0LnNpemUoKSkgewotCQkJCQkJCWxpc3QuYWRkKHJlZi5pbmRleCwgcmVmLnZhbHVlKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCS5wcmludGxuKCJEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5yZW1vdmVSZWZlcmVuY2VzKCk6IGluZGV4PSIgKyByZWYuaW5kZXggKyAiLCBzaXplPSIgKyBsaXN0LnNpemUoKSArICIsIHJlZmVyZW5jZXI9IiArIHJlZi5vd25lciArICIsIHJlZmVyZW5jZWQ9IiArIHJlZi52YWx1ZSArICIsIGZlYXR1cmU9IiArIHJlZi5mZWF0dXJlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQkJCQkJfQotCQkJCQkJCWxpc3QuYWRkKHJlZi52YWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5yZW1vdmVSZWZlcmVuY2VzKCk6IHJlZmVyZW5jZSBhbHJlYWR5IGV4aXN0czogcmVmZXJlbmNlcj0iICsgcmVmLm93bmVyICsgIiwgcmVmZXJlbmNlZD0iICsgcmVmLnZhbHVlICsgIiwgZmVhdHVyZT0iICsgcmVmLmZlYXR1cmUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlsaXN0LmFkZChyZWYudmFsdWUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmVmLm93bmVyLmVTZXQocmVmLmZlYXR1cmUsIHJlZi52YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlUmVmZXJlbmNlcygpIHsKLQkJaWYgKCFyZWZSZW1vdmVkKQotCQkJcmV0dXJuOwotCi0JCWJhdGNoQ29tbWFuZC51bmRvKCk7Ci0JCXJlc3RvcmVSZWZlcmVuY2VzKHJlbW92ZWRSZWZlcmVuY2VzKTsKLQotCQlyZWZSZW1vdmVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJbm90aWZ5UHJlVW5kbygpOwotCQl0cnkgewotCQkJc3VwZXIudW5kbygpOwotCQkJcmVzdG9yZVJlZmVyZW5jZXMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCW5vdGlmeUZhaWx1cmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYgKGV4ZWN1dGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbW1hbmRMaXN0ZW5lcihDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKCFjb21tYW5kTGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJY29tbWFuZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29tbWFuZExpc3RlbmVyKENvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQljb21tYW5kTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ29tbWFuZExpc3RlbmVyIHsKLQkJdm9pZCBub3RpZnlFeGVjdXRlZChFdmVudE9iamVjdCBldmVudE9iamVjdCk7Ci0KLQkJdm9pZCBub3RpZnlGYWlsdXJlKEV2ZW50T2JqZWN0IGV2ZW50T2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlTmVzdGVkQ29tbWFuZHMoKSB7Ci0JCUxpc3QgbmVzdGVkQ29tbWFuZFByb3ZpZGVycyA9IEV4dGVuc2lvbk1hbmFnZXIKLQkJCQkuZ2V0TmVzdGVkQ29tbWFuZFByb3ZpZGVycygpOwotCQlpZiAoIW5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCW5lc3RlZENvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJSU5lc3RlZENvbW1hbmRQcm92aWRlciBjbWRQcm92aWRlciA9IChJTmVzdGVkQ29tbWFuZFByb3ZpZGVyKSBpdGVyCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNvbW1hbmQgY21kID0gY21kUHJvdmlkZXIucmVtb3ZlUmVsYXRlZE9iamVjdHMoZWxlbWVudHMsCi0JCQkJCQkJCXRoaXMpOwotCQkJCQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJCQkJCW5lc3RlZENvbW1hbmRzLmFkZChjbWQpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBtb2RpZmllZFJlc291cmNlczIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29sbGVjdE5lc3RlZENvbW1hbmRSZXNvdXJjZXMoU2V0PFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlcykgewotCQkKLQkJaWYgKG5lc3RlZENvbW1hbmRzICE9IG51bGwgJiYgIW5lc3RlZENvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IG5lc3RlZENvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgbmVzdGVkQ29tbWFuZHMuZ2V0KGkpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChjbWQgaW5zdGFuY2VvZiBJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIHsKLQkJCQkJCUNvbGxlY3Rpb24gcmVzb3VyY2VzID0gKChJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIGNtZCkKLQkJCQkJCQkJLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkJCQlpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwocmVzb3VyY2VzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0Z1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2OGQzNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBBIGNvbW1hbmQgc3RhY2sgdGhhdCB0cmllcyBpdHMgYmVzdCB0byBmdWxseSByZXZlcnQgdG8gaXRzIGluaXRpYWwgc3RhdGUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2sgZXh0ZW5kcyBCYXNpY0NvbW1hbmRTdGFjayB7Ci0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBJRXJyb3JSZXBvcnRlciB7Ci0JCXZvaWQgc2hvd0Vycm9yKFN0cmluZyBtc2cpOwotCX0KLQotCXByaXZhdGUgSUVycm9yUmVwb3J0ZXIgZXJyUmVwb3J0ZXI7Ci0KLQlwcml2YXRlIEFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHVibGljIEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayhBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQl0aGlzLmFjdGlvbk1nciA9IGFjdGlvbk1ncjsKLQl9Ci0KLQlwdWJsaWMgRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrKEFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLAotCQkJSUVycm9yUmVwb3J0ZXIgZXJyUmVwb3J0ZXIpIHsKLQkJdGhpcyhhY3Rpb25NZ3IpOwotCQl0aGlzLmVyclJlcG9ydGVyID0gZXJyUmVwb3J0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JSZXBvcnRlcihJRXJyb3JSZXBvcnRlciBlcnJSZXBvcnRlcikgewotCQl0aGlzLmVyclJlcG9ydGVyID0gZXJyUmVwb3J0ZXI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZG9FeGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQlpZiAoIWNvbW1hbmQuY2FuVW5kbygpKQotCQkJcmV0dXJuIGZhbHNlOyAvLyB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QKLQkJLy8gZXhlY3V0ZSBjb21tYW5kIHRoYXQgY2Fubm90IGRlIHVuZG9uZSIpOwotCQlzdXBlci5leGVjdXRlKGNvbW1hbmQpOwotCQkKLQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgQWN0aXZpdHlEcm9wQ29tbWFuZAotCQkvLwotCQkvLyBUT0RPOiBhbGwgY29tbWFuZHMgbXVzdCByZXR1cm4gYSBjb3JyZWN0IHZhbHVlIGluIGdldEFmZmVjdGVkT2JqZWN0KCkKLQkJLy8gaWYgZ2V0QWZmZWN0ZWRPYmplY3QoKSByZXR1cm4gYW4gZW1wdHkgY29sbGVjdGlvbiwgdGhlIGFjdGlvbiBtYW5hZ2VyCi0JCS8vIHdpbGwgbm90IHJlZ2lzdGVyIGl0IGFzIGEgbW9kaWZpZXIgb2YgdGhlIHJlc291cmNlcyByZXR1cm5lZCBieSBnZXRNb2RpZmllZFJlc291cmNlcygpCi0JCS8vIGFuZCB0aGUgZWRpdG9yIG1pZ2h0IG5vdCBiZSBtYXJrZWQgZGlydHkgYXMgdGhlIHJlc3VsdC4KLQkJLy8KLQkJaWYoY29tbWFuZCBpbnN0YW5jZW9mIEJTRHJhZ0FuZERyb3BDb21tYW5kICYmIGNvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkuaXNFbXB0eSgpKSB7Ci0JCQlpZih0b3AgIT0gLTEpIHsKLQkJCQljb21tYW5kTGlzdC5yZW1vdmUodG9wLS0pOwotCQkJCWlmKHRvcCAhPSAtMSkgewotCQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kTGlzdC5nZXQodG9wKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW1vc3RSZWNlbnRDb21tYW5kID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWJvb2xlYW4gcmV0ID0gZ2V0TW9zdFJlY2VudENvbW1hbmQoKSAhPSBudWxsOwotCQlpZiAocmV0ICYmIGFjdGlvbk1nciAhPSBudWxsKSB7Ci0JCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoSVJlc291cmNlQXdhcmVDb21tYW5kKSBjb21tYW5kKQotCQkJCQkJLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJYWN0aW9uTWdyLnJlZ2lzdGVyQXNNb2RpZmllck9mKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUVPYmplY3QgbW9kaWZpZWQgPSBUbmdVdGlsLmdldE93bmVyKGNvbW1hbmQpOwotCQkJCWlmIChtb2RpZmllZCAhPSBudWxsKSB7Ci0JCQkJCWFjdGlvbk1nci5yZWdpc3RlckFzTW9kaWZpZXJPZihtb2RpZmllZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCW5vdGlmeUxpc3RlbmVycyhuZXcgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KHRoaXMsCi0JCQkJQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50LkVYRUNVVEVEKSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJZG9FeGVjdXRlKGNvbW1hbmQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCXN1cGVyLnJlZG8oKTsKLQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQodGhpcywKLQkJCQlDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuRVhFQ1VURUQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoY2FuVW5kbygpKSB7Ci0JCQlDb21tYW5kIGNvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZExpc3QuZ2V0KHRvcC0tKTsKLQkJCXRyeSB7Ci0JCQkJY29tbWFuZC51bmRvKCk7Ci0JCQkJbW9zdFJlY2VudENvbW1hbmQgPSBjb21tYW5kOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5sb2cobmV3IFdyYXBwZWRFeGNlcHRpb24oCi0JCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9JZ25vcmVFeGNlcHRpb25fZXhjZXB0aW9uIiksIGV4Y2VwdGlvbikuZmlsbEluU3RhY2tUcmFjZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJbW9zdFJlY2VudENvbW1hbmQgPSBudWxsOwotCQkJCXRvcCsrOwotCi0JCQkJaWYgKGVyclJlcG9ydGVyICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0W10gb2JqZWN0ID0gbmV3IE9iamVjdFsxXTsKLQkJCQkJb2JqZWN0WzBdID0gY29tbWFuZDsKLQkJCQkJb2JqZWN0WzFdID0gZXhjZXB0aW9uOwotCQkJCQllcnJSZXBvcnRlci5zaG93RXJyb3IoTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMudW5kb0NvbW1hbmRFcnJvcl9tc2csIG9iamVjdCkpOyAKLQkJCQl9Ci0JCQl9Ci0JCQlub3RpZnlMaXN0ZW5lcnMobmV3IENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCh0aGlzLAotCQkJCQlDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuVU5ETykpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdW5kb0FsbCgpIHsKLQkJdHJ5IHsKLQkJCXdoaWxlIChjYW5VbmRvKCkpIHsKLQkJCQlDb21tYW5kIGNvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZExpc3QuZ2V0KHRvcC0tKTsKLQkJCQl0cnkgewotCQkJCQljb21tYW5kLnVuZG8oKTsKLQkJCQkJbW9zdFJlY2VudENvbW1hbmQgPSBjb21tYW5kOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5sb2cobmV3IFdyYXBwZWRFeGNlcHRpb24oCi0JCQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0lnbm9yZUV4Y2VwdGlvbl9leGNlcHRpb24iKSwgZXhjZXB0aW9uKS5maWxsSW5TdGFja1RyYWNlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJbW9zdFJlY2VudENvbW1hbmQgPSBudWxsOwotCQkJCQl0b3ArKzsKLQotCQkJCQlpZiAoZXJyUmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJCQkJLy8gZXJyUmVwb3J0ZXIuc2hvd0Vycm9yKCJDYW5ub3QgdW5kbyBjb21tYW5kOiAnIiArCi0JCQkJCQkvLyBjb21tYW5kICsgIicsIGV4Y2VwdGlvbjogIiArIGV4Y2VwdGlvbik7Ci0JCQkJCQlPYmplY3RbXSBvYmplY3QgPSBuZXcgT2JqZWN0WzFdOwotCQkJCQkJb2JqZWN0WzBdID0gY29tbWFuZDsKLQkJCQkJCW9iamVjdFsxXSA9IGV4Y2VwdGlvbjsKLQkJCQkJCWVyclJlcG9ydGVyCi0JCQkJCQkJCS5zaG93RXJyb3IoTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMudW5kb0NvbW1hbmRFcnJvcl9tc2csIG9iamVjdCkpOyAKLQkJCQkJfQotCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlub3RpZnlMaXN0ZW5lcnMobmV3IENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCh0aGlzLAotCQkJCQlDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuVU5ET19BTEwpKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhFdmVudE9iamVjdCBldmVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkoKENvbW1hbmRTdGFja0xpc3RlbmVyKSBpLm5leHQoKSkuY29tbWFuZFN0YWNrQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoKSB7Ci0JCS8vCi0JfQotCi0JcHVibGljIHZvaWQgc2F2ZUlzRG9uZSgpIHsKLQkJc3VwZXIuc2F2ZUlzRG9uZSgpOwotCQlub3RpZnlMaXN0ZW5lcnMobmV3IENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCh0aGlzLAotCQkJCUNvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5TQVZFRCkpOwotCQljb21tYW5kTGlzdC5jbGVhcigpOwotCQl0b3AgPSAtMTsKLQkJc2F2ZUluZGV4ID0gLTE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2sjaXNTYXZlTmVlZGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1NhdmVOZWVkZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lBY3Rpb25NYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JQWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOWYwN2ZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lBY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNsYXNzIGlzIHVzZWQgdG8gc3VwcG9ydCB1bmRvIG9wZXJhdGlvbnMgaW4gdGhlCi0gKiBmb3JtIGVkaXRvcnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvbk1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VUID0gTm90aWZpY2F0aW9uLlNFVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERCA9IE5vdGlmaWNhdGlvbi5BREQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSBOb3RpZmljYXRpb24uUkVNT1ZFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX01BTlkgPSBOb3RpZmljYXRpb24uQUREX01BTlk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVfTUFOWSA9IE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWTsKLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBhY3Rpb24gYXMgZGVzY3JpYmVkIGluIHBhcmFtZXRlcnMKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uVHlwZQotCSAqICAgICAgICAgICAgb25lIG9mIHRoZSBhYm92ZSBkZWZpbmVkIGFjdGlvbiBjb25zdGFudHMKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHBlcmZvcm0gYWN0aW9uIHVwb24KLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgdGhlIGZlYXR1cmUgdG8gYmUgbW9kaWZpZWQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBmZWF0dXJlIHZhbHVlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBzcGVjaWZ5IC0xIGlmIG5vIGluZGV4Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWNjZXNzZnVsbCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UKLQkgKi8KLQlib29sZWFuIGRvQWN0aW9uKGludCBhY3Rpb25UeXBlLCBFT2JqZWN0IG9iamVjdCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gY29tbWFuZAotCSAqIAotCSAqIEBwYXJhbSBjbWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN1Y2Nlc3NmdWxsLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gZXhlY3V0ZShJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kKTsKLQotCXZvaWQgdW5kbygpOwotCi0Jdm9pZCByZWRvKCk7Ci0KLQlib29sZWFuIHVuZG9BbGwoKTsKLQotCXZvaWQgc2F2ZUlzRG9uZSgpOwotCi0JYm9vbGVhbiBpc1NhdmVOZWVkZWQoKTsKLQotCS8qKgotCSAqIEdldHMgcmVzb3VyY2VzIGZpcnN0IG1vZGlmaWVkIGJ5IHRoaXMgYWN0aW9uIG1hbmFnZXIKLQkgKi8KLQlDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0KLQl2b2lkIGRpc3Bvc2UoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZjA3MTJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgMTcsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIgZXh0ZW5kcyBJQ29tbWFuZExpc3RlbmVyIHsKLQkvKioKLQkgKiBDb2xsZWN0cyBvYmplY3RzIHdob3NlIGNvbnRlbnQgbXVzdCBiZSBkZWxldGVkIGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIGRlbGV0ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbGxlY3RlZE9iamVjdHMKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0aGF0IHdpbGwgYmUgZGVsZXRlZC4KLQkgKi8KLQl2b2lkIGNvbGxlY3RPYmplY3RzVG9EZWxldGVDb250ZW50KENvbGxlY3Rpb24gY29sbGVjdGVkT2JqZWN0cywgTWV0aG9kRWxlbWVudCBlbGVtZW50KTsJCi0KLQkvKioKLQkgKiBDb2xsZWN0cyBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQgaWYgPGNvZGU+ZWxlbWVudFRvRGVsZXRlPC9jb2RlPiB3aWxsIGJlIHJlbW92ZWQgZnJvbSAKLQkgKiA8Y29kZT5yZWZlcmVuY2VzPC9jb2RlPiBvZiA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0c1RvUmVtb3ZlIG91dHB1dCAKLQkgKiBAcGFyYW0gcmVmZXJlbmNlciBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0byBlbGVtZW50VG9EZWxldGUKLQkgKiBAcGFyYW0gcmVmZXJlbmNlcyBjb2xsZWN0aW9uIG9mIHtAbGluayBFUmVmZXJlbmNlfSB0aGF0IGNvbnRhaW5zIGVsZW1lbnRUb0RlbGV0ZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBvbmUgb2YgdGhlIGNvbGxlY3RlZCBvYmplY3RzIGlzIHRoZSA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPiBvciBjb250YWluZXIgb2YgPGNvZGU+cmVmZXJlbmNlcjwvY29kZT4KLQkgKi8KLQlib29sZWFuIGNvbGxlY3RPYmplY3RzVG9SZW1vdmUoQ29sbGVjdGlvbiBvYmplY3RzVG9SZW1vdmUsIEVPYmplY3QgZWxlbWVudFRvRGVsZXRlLCBFT2JqZWN0IHJlZmVyZW5jZXIsIENvbGxlY3Rpb24gcmVmZXJlbmNlcyk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lJbnRlcmFjdGl2ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSUludGVyYWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjYjFjMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSUludGVyYWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSW50ZXJhY3RpdmUgewotCXZvaWQgc2V0VXNlckludGVyYWN0aW9uSGFuZGxlcihJVXNlckludGVyYWN0aW9uSGFuZGxlciBoYW5kbGVyKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lNb2RpZnlDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JTW9kaWZ5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmI0NDkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lNb2RpZnlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kaWZ5Q29tbWFuZCB7Ci0JCi0JQ29sbGVjdGlvbiBnZXRNb2RpZmllZE9iamVjdHMoKTsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lOZXN0ZWRDb21tYW5kUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lOZXN0ZWRDb21tYW5kUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODQ1OGUxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotCi0vKioKLSAqIFByb3ZpZGVzIG5lc3RlZCBjb21tYW5kcyB0byBleGVjdXRlIHJpZ2h0IGFmdGVyIHRoZSBleGVjdXRpb24gb2YgdGhlIG1haW4gY29tbWFuZAotICogIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgMTcsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5lc3RlZENvbW1hbmRQcm92aWRlciB7Ci0JQ29tbWFuZCBjcmVhdGVSZWxhdGVkT2JqZWN0cyhDb2xsZWN0aW9uIGNyZWF0ZWRFbGVtZW50cywgQ29tbWFuZCBjcmVhdGVDb21tYW5kKTsKLQlDb21tYW5kIHJlbW92ZVJlbGF0ZWRPYmplY3RzKENvbGxlY3Rpb24gZGVsZXRlZEVsZW1lbnRzLCBDb21tYW5kIGRlbGV0ZUNvbW1hbmQpOwotCUNvbW1hbmQgY3JlYXRlTmVzdGVkQ29tbWFuZChDb21tYW5kIGNvbW1hbmQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSVJlc291cmNlQXdhcmVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JUmVzb3VyY2VBd2FyZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTFlNTExMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JUmVzb3VyY2VBd2FyZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSByZXNvdXJjZSBhd2FyZSBjb21tYW5kLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZXNvdXJjZUF3YXJlQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JVXNlckludGVyYWN0aW9uSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWVjOTUwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JVXNlckludGVyYWN0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gaGFuZGxlIHVzZXIgaW50ZXJhY3Rpb25zIGR1cmluZyBjb21tYW5kIGV4ZWN1dGlvbgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAzLCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgewotCS8qKgotCSAqIERlbGl2ZXJzIG1lc3NhZ2VzIHRvIHVzZXJzCi0JICogCi0JICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMjYsIDIwMDYKLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSU1lc3NlbmdlciB7Ci0JCS8qKgotCQkgKiBTaG93cyBpbmZvcm1hdGlvbiBtZXNzYWdlCi0JCSAqIAotCQkgKiBAcGFyYW0gdGl0bGUKLQkJICogQHBhcmFtIG1zZwotCQkgKi8KLQkJdm9pZCBzaG93SW5mbyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpOwotCi0JCS8qKgotCQkgKiBTaG93cyB3YXJuaW5nIG1lc3NhZ2UKLQkJICogCi0JCSAqIEBwYXJhbSB0aXRsZQotCQkgKiBAcGFyYW0gbXNnCi0JCSAqLwotCQl2b2lkIHNob3dXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZyk7Ci0KLQkJLyoqCi0JCSAqIFNob3dzIHdhcm5pbmcgbWVzc2FnZSB3aXRoIHJlYXNvbgotCQkgKiAKLQkJICogQHBhcmFtIHRpdGxlCi0JCSAqIEBwYXJhbSBtc2cKLQkJICogQHBhcmFtIHN0cmluZwotCQkgKi8KLQkJdm9pZCBzaG93V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24pOwotCi0JCS8qKgotCQkgKiBTaG93cyBlcnJvciBtZXNzYWdlCi0JCSAqIAotCQkgKiBAcGFyYW0gdGl0bGUKLQkJICogQHBhcmFtIG1zZwotCQkgKi8KLQkJdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKTsKLQotCQkvKioKLQkJICogU2hvd3MgZXJyb3IgbWVzc2FnZSB3aXRoIHN0YXR1cwotCQkgKiAKLQkJICogQHBhcmFtIHRpdGxlCi0JCSAqIEBwYXJhbSBtc2cKLQkJICogQHBhcmFtIHN0YXR1cwotCQkgKi8KLQkJdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBJU3RhdHVzIHN0YXR1cyk7Ci0KLQkJLyoqCi0JCSAqIFNob3dzIGVycm9yIG1lc3NhZ2Ugd2l0aCByZWFzb24gYW5kIGV4Y2VwdGlvbgotCQkgKiAKLQkJICogQHBhcmFtIHRpdGxlCi0JCSAqIEBwYXJhbSBtc2cKLQkJICogQHBhcmFtIHJlYXNvbgotCQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JCSAqLwotCQl2b2lkIHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQkJRXhjZXB0aW9uIGV4Y2VwdGlvbik7Ci0KLQkJdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZGV0YWlscywKLQkJCQlFeGNlcHRpb24gZXhjZXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBY3Rpb24gY29uc3RhbnQgZm9yIHVzZXIgYWNjZXB0YW5jZQotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX09LID0gMDsKLQotCS8qKgotCSAqIEFjdGlvbiBjb25zdGFudCBmb3IgdXNlciBjYW5jZWxsYXRpb24KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IEFDVElPTl9DQU5DRUwgPSAxOwotCi0JLyoqCi0JICogQWN0aW9uIGNvbnN0YW50IGZvciByZXRyeQotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1JFVFJZID0gMjsKLQotCS8qKgotCSAqIEFjdGlvbiBjb25zdGFudCBmb3IgYWJvcnQKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IEFDVElPTl9BQk9SVCA9IDM7Ci0JCi0Jc3RhdGljIGZpbmFsIGludCBBQ1RJT05fWUVTID0gNDsKLQkKLQlzdGF0aWMgZmluYWwgaW50IEFDVElPTl9OTyA9IDU7Ci0KLQkvKioKLQkgKiBTZWxlY3RzIG9iamVjdHMgZnJvbSB0aGUgc3BlY2lmaWVkIGxpc3QgPGNvZGU+b2JqZWN0c1RvU2VsZWN0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0c1RvU2VsZWN0Ci0JICogICAgICAgICAgICBvYmplY3RzIGZvciB1c2VyIHRvIHNlbGVjdAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyCi0JICogICAgICAgICAgICBsYWJlbCBwcm92aWRlciB1c2VkIHRvIGRpc3BsYXkgdGhlIGdpdmVuIG9iamVjdHMgdG8gdXNlcgotCSAqIEBwYXJhbSBtdWx0aXBsZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gd2lsbCBhbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24sIHNpbmdsZQotCSAqICAgICAgICAgICAgc2VsZWN0aW9uIGlmIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIHRpdGxlIG9mIHRoaXMgc2VsZWN0aW9uIGFjdGlvbiB0byBkaXNwbGF5IHRvIHVzZXIKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBkaXNwbGF5IHRvIHVzZXIKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGVsZW1lbnRzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgdGhlIHNlbGVjdGlvbiB3YXMgY2FuY2VsZWQuCi0JICovCi0JTGlzdCBzZWxlY3QoTGlzdCBvYmplY3RzVG9TZWxlY3QsIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JCQlib29sZWFuIG11bHRpcGxlLCBMaXN0IGludGl0aWFsU2VsZWN0aW9uLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpOwotCi0JLyoqCi0JICogU2VsZWN0cyBvbmx5IG9uZSBhY3Rpb24gZnJvbSB0aGUgZ2l2ZW4gYXJyYXkgb2YgYWN0aW9ucy4gVGhlIGFjdGlvbnMgbXVzdAotCSAqIGJlIHRoZSBjb25zdGFudHMge0BsaW5rICNBQ1RJT05fQUJPUlR9LCB7QGxpbmsgI0FDVElPTl9DQU5DRUx9LAotCSAqIHtAbGluayAjQUNUSU9OX09LfSwge0BsaW5rICNBQ1RJT05fUkVUUll9LCBBQ1RJT05fWFhYCi0JICogCi0JICogQHBhcmFtIGFjdGlvbnMKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIHN0YXR1cwotCSAqIEByZXR1cm4KLQkgKi8KLQlpbnQgc2VsZWN0T25lKGludFtdIGFjdGlvbnMsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpOwotCi0JLyoqCi0JICogUmVxdWVzdHMgdXNlciBpbnB1dHMuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogQHBhcmFtIG1zZwotCSAqIEBwYXJhbSB1c2VySW5wdXRzCi0JICogICAgICAgICAgICBsaXN0IG9mIHtAbGluayBVc2VySW5wdXQgdXNlciBpbnB1dHN9IHRoYXQgaGF2ZSBpbmZvcm1hdGlvbgotCSAqICAgICAgICAgICAgYWJvdXQgaW5wdXQgcmVxdWVzdHMgYW5kIHJlZmVyZW5jZSB0byB0aGUgaW5wdXQuIFRoZSBpbnB1dAotCSAqICAgICAgICAgICAgcmVmZXJlbmNlIHNob3VsZCBiZSBzZXQgdG8gdGhlIG9iamVjdCB0aGF0IHVzZXIgc3BlY2lmaWVkIG9yCi0JICogICAgICAgICAgICBzZWxlY3RlZC4KLQkgKiBAcmV0dXJuIGZhbHNlIGlmIHVzZXIgY2FuY2VsbGVkIHRoaXMgcmVxdWVzdAotCSAqLwotCWJvb2xlYW4gcmVxdWVzdElucHV0KFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgTGlzdCB1c2VySW5wdXRzKTsKLQotCS8qKgotCSAqIEdldHMgVUkgY29udGV4dAotCSAqIAotCSAqIEByZXR1cm4gdGhlIFVJIGNvbnRleHQKLQkgKi8KLQlPYmplY3QgZ2V0VUlDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBydW5uYWJsZSBjb250ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJ1bm5hYmxlIGNvbnRleHQKLQkgKi8KLQlJUnVubmFibGVDb250ZXh0IGdldFJ1bm5hYmxlQ29udGV4dCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgbWVzc2VuZ2VyCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUlNZXNzZW5nZXIgZ2V0TWVzc2VuZ2VyKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50QWRkQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudEFkZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmIzODVlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50QWRkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JVGV4dFJlZmVyZW5jZVJlcGxhY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1pc2M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5Db250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLlVuaXF1ZW5lc3NWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSUlucHV0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSW5wdXREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uTW9kYWxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gYWRkIGEgbWV0aG9kIGVsZW1lbnQgdG8gYSBjb250YWluaW5nIG1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZFdyYXBwZXIgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPEVDbGFzcywgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+PiB0eXBlVG9FeGNsdWRlZEZlYXR1cmVzRnJvbUNoZWNrID0gbmV3IEhhc2hNYXA8RUNsYXNzLCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4+KCk7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGV4Y2x1ZGVGcm9tQ2hlY2soRUNsYXNzIHR5cGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUNvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBmZWF0dXJlcyA9IHR5cGVUb0V4Y2x1ZGVkRmVhdHVyZXNGcm9tQ2hlY2suZ2V0KHR5cGUpOwotCQlpZihmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlcyA9IG5ldyBIYXNoU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsKLQkJfQotCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuVW5kbyA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgQWRkQ29tbWFuZCBhZGRDb21tYW5kOwotCi0JLy8gcHJvdGVjdGVkIE1hcCBlbGVtZW50VG9OZXdOYW1lTWFwOwotCXByb3RlY3RlZCBNYXAgZWxlbWVudFRvT2xkUGx1Z2luTWFwOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlWFJlZlJlcXVpcmVkOwotCi0JcHJvdGVjdGVkIE1ldGhvZFBsdWdpbiBvd25lclBsdWdpbjsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgYWRkTGlzdDsKLQotCXByb3RlY3RlZCBNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5PSywgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3M7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZmVhdHVyZXNUb0NoZWNrOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgbmVzdGVkQ29tbWFuZHM7Ci0KLQlwcml2YXRlIEhhc2hTZXQgbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMoY29tbWFuZCwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKENvbW1hbmQgY29tbWFuZCwgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MpIHsKLQkJc3VwZXIoY29tbWFuZCk7Ci0JCWFkZENvbW1hbmQgPSAoQWRkQ29tbWFuZCkgVG5nVXRpbC51bndyYXAoY29tbWFuZCk7Ci0JCXNldFJ1bldpdGhQcm9ncmVzcyhydW5XaXRoUHJvZ3Jlc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJ1bldpdGhQcm9ncmVzcyhib29sZWFuIHJ1bldpdGhQcm9ncmVzcykgewotCQl0aGlzLnJ1bldpdGhQcm9ncmVzcyA9IHJ1bldpdGhQcm9ncmVzczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gY2FuVW5kbzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNnZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXJyb3IoSVN0YXR1cyBlcnJvclN0YXR1cykgewotCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0Vycm9yKGdldExhYmVsKCksIExpYnJhcnlFZGl0UmVzb3VyY2VzLmNyZWF0ZUVsZW1lbnRFcnJvcl9tc2csIGVycm9yU3RhdHVzKTsKLQkJc3RhdHVzLmFkZChlcnJvclN0YXR1cyk7Ci0JCXN0YXR1cy5hZGRBbGwoZXJyb3JTdGF0dXMpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CQotCQkvLyBkaXNwb3NlIHRoZSBuZXN0ZWQgY29tbWFuZHMKLQkJaWYgKG5lc3RlZENvbW1hbmRzICE9IG51bGwgJiYgIW5lc3RlZENvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IG5lc3RlZENvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgbmVzdGVkQ29tbWFuZHMuZ2V0KGkpOwotCQkJCXRyeSB7Ci0JCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlTaGVsbCBzaGVsbCA9IE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKTsKLQkJLy8gQ2hlY2sgd2hldGhlciB0aGUgb3duZXIgcmVzb3VyY2UgY2FuIGJlIG1vZGlmaWVkLgotCQkvLwotCQlDb2xsZWN0aW9uIHJlc291cmNlc1RvQ2hhbmdlID0gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJSVN0YXR1cyBleGVjU3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KAotCQkJCXJlc291cmNlc1RvQ2hhbmdlLCBzaGVsbCk7Ci0JCWlmICghZXhlY1N0YXR1cy5pc09LKCkpIHsKLQkJCWhhbmRsZUVycm9yKGV4ZWNTdGF0dXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWV4ZWNTdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tDb25maWd1cmF0aW9uc1RvVXBkYXRlKAotCQkJCWFkZENvbW1hbmQsIHNoZWxsKTsKLQkJaWYgKCFleGVjU3RhdHVzLmlzT0soKSkgewotCQkJaGFuZGxlRXJyb3IoZXhlY1N0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHdpbGxTYXZlTW9kaWZpZWRSZXNvdXJjZXMoKQotCQkJCSYmICFVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tPdXRPZlN5bmNoKHJlc291cmNlc1RvQ2hhbmdlKSkgewotCQkJc3RhdHVzLmFkZChTdGF0dXMuQ0FOQ0VMX1NUQVRVUyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpZighY2hlY2tGb2xkZXIoc2hlbGwpKSB7Ci0JCS8vIHJldHVybjsKLQkJLy8gfQotCi0JCWRvQWRkKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJdW5kb05lc3RlZENvbW1hbmRzKCk7Ci0JCXN1cGVyLnVuZG8oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgdW5kb05lc3RlZENvbW1hbmRzKCkgewotCQlpZiAobmVzdGVkQ29tbWFuZHMgIT0gbnVsbCAmJiAhbmVzdGVkQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gbmVzdGVkQ29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBuZXN0ZWRDb21tYW5kcy5nZXQoaSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGNtZC5jYW5VbmRvKCkpIHsKLQkJCQkJCWNtZC51bmRvKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrRm9sZGVyKFNoZWxsIHNoZWxsKSB7Ci0JCS8vIGlmIGFueSBvZiB0aGUgZWxlbWVudHMgdG8gYmUgYWRkZWQgd2lsbCBiZSBzYXZlZCBpbiBpdHMgb3duIGZpbGUKLQkJLy8gY2hlY2sgaWYgdGhlIGZvbGRlciB0byBzYXZlIHRoZSBmaWxlIHRvIGNhbiBiZSBtb2RpZmllZAotCQkvLwotCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSAoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpIFNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpOwotCQlBcnJheUxpc3QgZm9sZGVyc1RvQ2hlY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgcGVyc2lzdGVyLmhhc093blJlc291cmNlKGVsZW1lbnQpKSB7Ci0JCQkJU3RyaW5nIGZvbGRlciA9IHBlcnNpc3Rlci5nZXRGb2xkZXJSZWxhdGl2ZVBhdGgoCi0JCQkJCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oYWRkQ29tbWFuZAotCQkJCQkJLmdldE93bmVyKCkpOwotCQkJCVN0cmluZyBiYXNlRm9sZGVyID0gbnVsbDsKLQkJCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoYWRkQ29tbWFuZAotCQkJCQkJCS5nZXRPd25lcigpKTsKLQkJCQkJYmFzZUZvbGRlciA9IG5ldyBGaWxlKGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYmFzZUZvbGRlciA9IG5ldyBGaWxlKHBsdWdpbi5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCk7Ci0JCQkJfQotCQkJCWZvbGRlcnNUb0NoZWNrLmFkZChiYXNlRm9sZGVyICsgRmlsZS5zZXBhcmF0b3IgKyBmb2xkZXIpOwotCQkJfQotCQl9Ci0JCWlmICghZm9sZGVyc1RvQ2hlY2suaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmdbXSBmb2xkZXJzID0gbmV3IFN0cmluZ1tmb2xkZXJzVG9DaGVjay5zaXplKCldOwotCQkJZm9sZGVyc1RvQ2hlY2sudG9BcnJheShmb2xkZXJzKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKQotCQkJCQkuY2hlY2tNb2RpZnkoZm9sZGVycywgc2hlbGwpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJaGFuZGxlRXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc01vdmUoKSB7Ci0JCUNvbW1hbmQgY21kID0gVG5nVXRpbC51bndyYXAoY29tbWFuZCk7Ci0JCWlmIChjbWQgaW5zdGFuY2VvZiBBZGRDb21tYW5kKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKEFkZENvbW1hbmQpIGNtZCkuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG93bmVyUGx1Z2luCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIExpc3Qgb2YgUmVmZXJlbmNlIG9iamVjdHMgdGhhdCBrZWVwcyB0aGUgaW5mbyBvZiBpbGxlZ2FsIG91dGdvaW5nCi0JICogICAgICAgICByZWZlcmVuY2VzCi0JICogQHNlZSBSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0SWxsZWdhbE91dGdvaW5nUmVmZXJlbmNlcygKLQkJCU1ldGhvZFBsdWdpbiBvd25lclBsdWdpbiwgRU9iamVjdCBlLCBDb2xsZWN0aW9uIGlsbGVnYWxSZWZlcmVuY2VzKSB7Ci0JCWlmIChpbGxlZ2FsUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlpbGxlZ2FsUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yKSBlCi0JCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBmZWF0dXJlSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZU9iamVjdCk7Ci0JCQlpZiAocGx1Z2luICE9IG51bGwgJiYgcGx1Z2luICE9IG93bmVyUGx1Z2luCi0JCQkJCSYmICFNaXNjLmlzQmFzZU9mKHBsdWdpbiwgb3duZXJQbHVnaW4pKSB7Ci0JCQkJLy8gaWxsZWdhbCByZWZlcmVuY2UgdG8gYmUgcmVtb3ZlZAotCQkJCS8vCi0JCQkJaWxsZWdhbFJlZmVyZW5jZXMuYWRkKG5ldyBSZWZlcmVuY2UoZSwgZmVhdHVyZUl0ZXJhdG9yCi0JCQkJCQkuZmVhdHVyZSgpLCBlT2JqZWN0LCAtMSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbGxlZ2FsUmVmZXJlbmNlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZXMoQ29sbGVjdGlvbiByZWZlcmVuY2VzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVmLmZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlMaXN0IGxpc3QgPSAoKExpc3QpIHJlZi5vd25lci5lR2V0KHJlZi5mZWF0dXJlKSk7Ci0JCQkJbGlzdC5yZW1vdmUocmVmLnZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVmLm93bmVyLmVTZXQocmVmLmZlYXR1cmUsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIExpc3Qgb2YgUmVmZXJlbmNlIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gcmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXMoTWV0aG9kUGx1Z2luIG93bmVyUGx1Z2luLAotCQkJRU9iamVjdCBlKSB7Ci0JCUNvbGxlY3Rpb24gcmVtb3ZlUmVmcyA9IGdldElsbGVnYWxPdXRnb2luZ1JlZmVyZW5jZXMob3duZXJQbHVnaW4sIGUsCi0JCQkJbnVsbCk7Ci0KLQkJLy8gcmVtb3ZlIGlsbGVnYWwgcmVmZXJlbmNlcwotCQkvLwotCQlyZW1vdmVSZWZlcmVuY2VzKHJlbW92ZVJlZnMpOwotCi0JCXJldHVybiByZW1vdmVSZWZzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJbGxlZ2FsUmVmZXJlbmNlc1JlY3Vyc2l2ZWx5KAotCQkJTWV0aG9kUGx1Z2luIG93bmVyUGx1Z2luLCBFT2JqZWN0IGUpIHsKLQkJcmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXMob3duZXJQbHVnaW4sIGUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZS5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJcmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXMob3duZXJQbHVnaW4sIGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNOZXh0KEl0ZXJhdG9yIGl0ZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpdGVyLmhhc05leHQoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgZXg7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSWxsZWdhbFJlZmVyZW5jZShNZXRob2RQbHVnaW4gb3duZXJQbHVnaW4sCi0JCQlFT2JqZWN0IGUsIENvbGxlY3Rpb24gbW92ZUxpc3QpIHsKLQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IgZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcikgZQotCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaGFzTmV4dChmZWF0dXJlSXRlcmF0b3IpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0KLQkJCS8vIGNoZWNrIGlmIHRoZSB4LXJlZiBvYmplY3QgaXMgaW4gdGhlIG1vdmUgbGlzdAotCQkJLy8KLQkJCWlmICghbW92ZUxpc3QuY29udGFpbnMoZU9iamVjdCkpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZU9iamVjdCk7Ci0JCQkJaWYgKHBsdWdpbiAhPSBudWxsICYmIHBsdWdpbiAhPSBvd25lclBsdWdpbgotCQkJCQkJJiYgIU1pc2MuaXNCYXNlT2YocGx1Z2luLCBvd25lclBsdWdpbikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgaXMgcmVmZXJlbmNlZCBpbGxlZ2FsbHkgYWZ0ZXIgdGhlIG1vdmUuCi0JICogCi0JICogQHBhcmFtIG93bmVyUGx1Z2luCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gbW92ZUxpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVmZXJlbmNlZElsbGVnYWxseShNZXRob2RQbHVnaW4gb3duZXJQbHVnaW4sCi0JCQlNZXRob2RFbGVtZW50IGUsIENvbGxlY3Rpb24gbW92ZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZWZlcmVuY2VzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVmZXJlbmNlcyhlKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQotCQkJaWYgKGlzRXhjbHVkZWRGcm9tT3V0Z29pbmdSZWZlcmVuY2VDaGVjayhlbGVtZW50KSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoIW1vdmVMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJCWlmIChwbHVnaW4gIT0gbnVsbCAmJiBwbHVnaW4gIT0gb3duZXJQbHVnaW4KLQkJCQkJCSYmICFNaXNjLmlzQmFzZU9mKG93bmVyUGx1Z2luLCBwbHVnaW4pKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja01vZGlmeShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChlbGVtZW50LCBudWxsKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQl0aHJvdyBuZXcgTWVzc2FnZUV4Y2VwdGlvbihUbmdVdGlsLmdldE1lc3NhZ2Uoc3RhdHVzKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gcmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXNUbygKLQkJCU1ldGhvZFBsdWdpbiBvd25lclBsdWdpbiwgTWV0aG9kRWxlbWVudCBlLCBDb2xsZWN0aW9uIG1vdmVMaXN0KSB7Ci0JCUFycmF5TGlzdCBhZmZlY3RlZFJlZmVyZW5jZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb2xsZWN0aW9uIHJlZmVyZW5jZXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZWZlcmVuY2VzKGUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFtb3ZlTGlzdC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJCQlpZiAocGx1Z2luICE9IG51bGwgJiYgcGx1Z2luICE9IG93bmVyUGx1Z2luCi0JCQkJCQkmJiAhTWlzYy5pc0Jhc2VPZihvd25lclBsdWdpbiwgcGx1Z2luKSkgewotCQkJCQljaGVja01vZGlmeShlbGVtZW50KTsKLQkJCQkJcmVtb3ZlUmVmZXJlbmNlcyhlbGVtZW50LCBlKTsKLQkJCQkJYWZmZWN0ZWRSZWZlcmVuY2Vycy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZmZlY3RlZFJlZmVyZW5jZXJzOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGNyb3NzIHJlZmVyZW5jZXMgb2YgPGNvZGU+cmVmZXJlbmNlcjwvY29kZT4gdG8KLQkgKiA8Y29kZT5yZWZlcmVuY2VkPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSByZWZlcmVuY2VyCi0JICogQHBhcmFtIHJlZmVyZW5jZWQKLQkgKiBAcGFyYW0geFJlZmVyZW5jZXMKLQkgKiAgICAgICAgICAgIG91dHB1dCBjb2xsZWN0aW9uIG9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3RzCi0JICogQHJldHVybiBjb2xsZWN0aW9uIG9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3RzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBnZXRYUmVmZXJlbmNlcyhFT2JqZWN0IHJlZmVyZW5jZXIsCi0JCQlFT2JqZWN0IHJlZmVyZW5jZWQsIENvbGxlY3Rpb24geFJlZmVyZW5jZXMpIHsKLQkJaWYgKHhSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXhSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZvciAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yIGZlYXR1cmVJdGVyYXRvciA9IChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IpIHJlZmVyZW5jZXIKLQkJCQkuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGZlYXR1cmVJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgZmVhdHVyZUl0ZXJhdG9yLm5leHQoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZUl0ZXJhdG9yLmZlYXR1cmUoKTsKLQkJCS8vIGlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCS8vIGlmKCgoTGlzdClyZWZlcmVuY2VyLmVHZXQoZmVhdHVyZSkpLmNvbnRhaW5zKHJlZmVyZW5jZWQpKSB7Ci0JCQkvLyB4UmVmZXJlbmNlcy5hZGQoZmVhdHVyZSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyBlbHNlCi0JCQlpZiAoZU9iamVjdCA9PSByZWZlcmVuY2VkKSB7Ci0JCQkJeFJlZmVyZW5jZXMuYWRkKGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB4UmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gPGNvZGU+cmVmZXJlbmNlZDwvY29kZT4gZnJvbQotCSAqIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHJlZmVyZW5jZXIKLQkgKiBAcGFyYW0gcmVmZXJlbmNlZAotCSAqIEByZXR1cm4gQ29sbGVjdGlvbiBvZiByZWZlcmVuY2VzIHRvIHRoZSA8Y29kZT5yZWZlcmVuY2VkPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiByZW1vdmVSZWZlcmVuY2VzKEVPYmplY3QgcmVmZXJlbmNlciwKLQkJCUVPYmplY3QgcmVmZXJlbmNlZCkgewotCQlDb2xsZWN0aW9uIHJlbW92ZVJlZnMgPSBnZXRYUmVmZXJlbmNlcyhyZWZlcmVuY2VyLCByZWZlcmVuY2VkLCBudWxsKTsKLQotCQkvLyByZW1vdmUgaWxsZWdhbCByZWZlcmVuY2VzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZVJlZnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGYuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIHJlZmVyZW5jZXIuZUdldChmKSkucmVtb3ZlKHJlZmVyZW5jZWQpOwotCQkJfSBlbHNlIHsKLQkJCQlyZWZlcmVuY2VyLmVTZXQoZiwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVtb3ZlUmVmczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSWxsZWdhbFJlZmVyZW5jZUluY2x1ZGluZ0FsbENoaWxkcmVuKAotCQkJTWV0aG9kUGx1Z2luIG93bmVyUGx1Z2luLCBNZXRob2RFbGVtZW50IGUsIENvbGxlY3Rpb24gbW92ZUxpc3QpIHsKLQkJaWYgKG93bmVyUGx1Z2luID09IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpKSB7Ci0JCQkvLyBtb3ZlIHdpdGhpbiB0aGUgc2FtZSBwbHVnaW4sIG5vIGZ1cnRoZXIgY2hlY2sKLQkJCS8vCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGhhc0lsbGVnYWxSZWZlcmVuY2Uob3duZXJQbHVnaW4sIGUsIG1vdmVMaXN0KSkKLQkJCXJldHVybiB0cnVlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZS5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJaWYgKGhhc0lsbGVnYWxSZWZlcmVuY2Uob3duZXJQbHVnaW4sIChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCksCi0JCQkJCW1vdmVMaXN0KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3VwZXJFeGVjdXRlKCkgewotCQlzdXBlci5leGVjdXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0RmVhdHVyZXNUb0NoZWNrKCkgewotCQlpZiAoZmVhdHVyZXNUb0NoZWNrID09IG51bGwpIHsKLQkJCWZlYXR1cmVzVG9DaGVjayA9IG5ldyBBcnJheUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPigpOwotCQkJZmVhdHVyZXNUb0NoZWNrLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCQotCQl9Ci0JCXJldHVybiBmZWF0dXJlc1RvQ2hlY2s7Ci0JfQotCi0JcHJvdGVjdGVkIElWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKEVPYmplY3QgZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCi0JCWlmKGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgRVJlZmVyZW5jZSl7Ci0JCQl2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVWYWxpZGF0b3IoYWRkQ29tbWFuZC5nZXRPd25lcigpLCAoRVJlZmVyZW5jZSkgYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCksIChFQ2xhc3MpbnVsbCwgZSwgZmVhdHVyZSk7Ci0JCX0KLQotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIG9iamVjdHNUb0NoZWNrTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBnZXRPZmZTdHJpbmdUb0NoZWNrTmFtZShPYmplY3QgZSwgQ29sbGVjdGlvbiBvYmplY3RzVG9DaGVja05hbWUpIHsKLQkJLy8gaWYoYWRkQ29tbWFuZC5nZXRPd25lcigpIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgJiYKLQkJLy8gYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCkgPT0KLQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkKLQkJLy8gJiYgZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29udGVudFBhY2thZ2UpZSkuZUFsbENvbnRlbnRzKCk7Ci0JCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJLy8gb2JqZWN0c1RvQ2hlY2tOYW1lLmFkZChlbGVtZW50KTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gZWxzZQotCQlpZiAoYWRkQ29tbWFuZC5nZXRPd25lcigpIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UKLQkJCQkmJiBhZGRDb21tYW5kLmdldEZlYXR1cmUoKSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpCi0JCQkJJiYgZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlCi0JCQkJJiYgIShlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkpIHsKLQkJCWdldFByb2Nlc3NDb21wb25lbnRzKChQcm9jZXNzUGFja2FnZSkgZSwgb2JqZWN0c1RvQ2hlY2tOYW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIG9iamVjdHNUb0NoZWNrTmFtZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0UHJvY2Vzc0NvbXBvbmVudHMoUHJvY2Vzc1BhY2thZ2UgcGtnLAotCQkJQ29sbGVjdGlvbiBvYmplY3RzVG9DaGVja05hbWUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZFBrZyA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCW9iamVjdHNUb0NoZWNrTmFtZS5hZGQoY2hpbGRQa2cpOwotCQkJfSBlbHNlIGlmIChjaGlsZFBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0UHJvY2Vzc0NvbXBvbmVudHMoKFByb2Nlc3NQYWNrYWdlKSBjaGlsZFBrZywKLQkJCQkJCW9iamVjdHNUb0NoZWNrTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tTdHJpbmdWYWx1ZShOYW1lZEVsZW1lbnQgZSwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIG9iamVjdHNUb0FkZCkgewotCQlDb2xsZWN0aW9uIGV4Y2x1ZGVkRmVhdHVyZXNUb0NoZWNrID0gdHlwZVRvRXhjbHVkZWRGZWF0dXJlc0Zyb21DaGVjay5nZXQoZS5lQ2xhc3MoKSk7IAotCQlpZihleGNsdWRlZEZlYXR1cmVzVG9DaGVjayAhPSBudWxsICYmIGV4Y2x1ZGVkRmVhdHVyZXNUb0NoZWNrLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBjcmVhdGVWYWxpZGF0b3IoZSwgZmVhdHVyZSk7Ci0JCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5ld05hbWUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQluZXdOYW1lID0gY2hlY2tTdHJpbmdWYWx1ZShlLCBmZWF0dXJlLCB2YWxpZGF0b3IsIG9iamVjdHNUb0FkZCk7Ci0JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCQluZXdOYW1lID0gbmV3TmFtZS50cmltKCk7Ci0JCQkJZS5lU2V0KGZlYXR1cmUsIG5ld05hbWUpOwotCQkJCWZlYXR1cmVDaGFuZ2VkKGUsIGZlYXR1cmUsIG5ld05hbWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrU3RyaW5nVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJQXJyYXlMaXN0IG9iamVjdHNUb0NoZWNrTmFtZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29sbGVjdGlvbiBvYmplY3RzVG9BZGQgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKTsKLQotCQkvLyBmZWF0dXJlIHZhbHVlIGNoZWNrCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdHNUb0FkZC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWNoZWNrU3RyaW5nVmFsdWUoZSwgZmVhdHVyZSwgb2JqZWN0c1RvQWRkKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJZ2V0T2ZmU3RyaW5nVG9DaGVja05hbWUoZSwgb2JqZWN0c1RvQ2hlY2tOYW1lKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdHNUb0NoZWNrTmFtZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCk7Ci0JCQlpZiAoIWNoZWNrU3RyaW5nVmFsdWUoZSwgZiwgb2JqZWN0c1RvQ2hlY2tOYW1lKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBkZWFsIHdpdGggZWxlbWVudCBjaGFuZ2UgZHVyaW5nIGFkZAotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmVhdHVyZUNoYW5nZWQoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IG5ld1ZhbHVlKSB7Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzVG9DaGVja05hbWUoQWRkQ29tbWFuZCBhZGRDb21tYW5kKSB7Ci0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJLy8gbmVlZCB0byBnZXQgYWxsIHByb2Nlc3MgY29tcG9uZW50cyBpbiB0aGlzIHBhY2thZ2UgdG8gY2hlY2sKLQkJCQkvLyBuYW1lCi0JCQkJLy8KLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihlbGVtZW50LCBmYWxzZSkgewotCi0JCQkJCS8qKgotCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkgKi8KLQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJCQlyZXR1cm4gKChQcm9jZXNzUGFja2FnZSkgb2JqZWN0KS5nZXRDaGlsZFBhY2thZ2VzKCkKLQkJCQkJCQkJCS5pdGVyYXRvcigpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9OwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IHBrZyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCWVsZW1lbnRzLmFkZChwa2cpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdGhlIG5hbWUgb2YgYWxsIGVsZW1lbnRzIHRvIGJlIGFkZGVkLgotCSAqIAotCSAqIEBwYXJhbSBhZGRDb21tYW5kCi0JICogQHJldHVybiBhIGVsZW1lbnQgdG8gbmV3IGZlYXR1cmUgbmFtZSBtYXAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdXNlcgotCSAqICAgICAgICAgY2FuY2VsZWQgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBjaGVja05hbWUoQWRkQ29tbWFuZCBhZGRDb21tYW5kKSB7Ci0JCUNvbGxlY3Rpb24gZWxlbWVudHNUb0NoZWNrID0gZ2V0RWxlbWVudHNUb0NoZWNrTmFtZShhZGRDb21tYW5kKTsKLQkJSGFzaE1hcCBlbGVtZW50VG9OZXdOYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvLyBmZWF0dXJlIHZhbHVlIGNoZWNrCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9DaGVjay5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQkJCWlmIChlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQl2YWxpZGF0b3IgPSBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKGFkZENvbW1hbmQKLQkJCQkJCS5nZXRPd25lcigpLCBhZGRDb21tYW5kLmdldEZlYXR1cmUoKSwKLQkJCQkJCShDb250ZW50RWxlbWVudCkgZSwgbmV3IFZhbGlkYXRvckZhY3RvcnkuVHlwZUZpbHRlcihlKSk7Ci0JCQl9IGVsc2UgewotCQkJCXZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZU5hbWVWYWxpZGF0b3IoCi0JCQkJCQlhZGRDb21tYW5kLmdldE93bmVyKCksIGUpOwotCQkJfQotCi0JCQlTdHJpbmcgbmV3TmFtZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW5ld05hbWUgPSBjaGVja1N0cmluZ1ZhbHVlKGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgdmFsaWRhdG9yLCBlbGVtZW50c1RvQ2hlY2spOwotCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCQkvLyBuZXcgbmFtZSByZXF1aXJlZCwgY2hlY2sgaWYgdGhlIGVsZW1lbnQgY2FuIGJlIG1vZGlmaWVkCi0JCQkJLy8KLQkJCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShlLCBNc2dCb3gKLQkJCQkJCS5nZXREZWZhdWx0U2hlbGwoKSk7Ci0JCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ19jYW5ub3RSZW5hbWUsCi0JCQkJCQluZXcgT2JqZWN0W10geyBUbmdVdGlsLmdldFR5cGVUZXh0KGUpLCBlLmdldE5hbWUoKSwKLQkJCQkJCQkJbmV3TmFtZSB9KTsKLQkJCQl3aGlsZSAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQkJCQlpZiAodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJCWlmICh1aUhhbmRsZXIuc2VsZWN0T25lKG5ldyBpbnRbXSB7Ci0JCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9PSywKLQkJCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTCB9LCB0aXRsZSwKLQkJCQkJCQkJbXNnLCBudWxsKSA9PSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMKSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBjYW5jZWwgdGhlIG9wZXJhdGlvbiBpZiB0aGVyZSBpcyBubyB1c2VyIGludGVyYWN0aW9uIGhhbmRsZXIKLQkJCQkJCS8vCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbGVtZW50VG9OZXdOYW1lTWFwLnB1dChlLCBuZXdOYW1lKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50VG9OZXdOYW1lTWFwOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmZWF0dXJlIHZhbHVlCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiBAcGFyYW0gb2JqZWN0c1RvQWRkCi0JICogQHJldHVybiBuZXcgZmVhdHVyZSB2YWx1ZSB0aGF0IHVzZXIgaGFzIGNob29zZW4gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgIHRoZSBmZWF0dXJlIHZhbHVlIGlzIHZhbGlkCi0JICogQHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrU3RyaW5nVmFsdWUoTmFtZWRFbGVtZW50IGUsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgSVZhbGlkYXRvciB2YWxpZGF0b3IsCi0JCQlDb2xsZWN0aW9uIG9iamVjdHNUb0FkZCkgdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gVE9ETzogVGhlIHZhbGlkYXRvciBpcyBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgdGhhdCBpcyB0b28gbG9uZyBmb3IKLQkJLy8gdGhlIGRpYWxvZy4KLQkJLy8gZmVhdHVyZSB2YWx1ZSBjaGVjawotCQlmaW5hbCBTdHJpbmdWYWxpZGF0b3Igc3RyVmFsaWRhdG9yID0gZ2V0U3RyaW5nVmFsaWRhdG9yKCk7Ci0JCXN0clZhbGlkYXRvci5zZXRFbGVtZW50cyhvYmplY3RzVG9BZGQpOwotCQlzdHJWYWxpZGF0b3Iuc2V0RmVhdHVyZShmZWF0dXJlKTsKLQkJc3RyVmFsaWRhdG9yLnNldFZhbGlkYXRvcih2YWxpZGF0b3IpOwotCi0JCVN0cmluZyBzdHIgPSAoU3RyaW5nKSBlLmVHZXQoZmVhdHVyZSk7Ci0JCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgbXNnID0gc3RyVmFsaWRhdG9yLmlzVmFsaWQoc3RyKTsKLQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCVN0cmluZyBmZWF0dXJlVHh0ID0gVG5nVXRpbC5nZXRGZWF0dXJlVGV4dChmZWF0dXJlKTsKLQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlOyAvLyROT04tTkxTLTEkCQkJCi0JCQkJU3RyaW5nIGRsZ01zZyA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0LAotCQkJCQkJU3RyVXRpbC50b0xvd2VyKGZlYXR1cmVUeHQpLCBlLmdldE5hbWUoKSk7Ci0JCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IChTdHJpbmcpIGUuZUdldChmZWF0dXJlKTsKLQotCQkJCUlJbnB1dFZhbGlkYXRvciBpbnB1dFZhbGlkYXRvciA9IG5ldyBJSW5wdXRWYWxpZGF0b3IoKSB7Ci0JCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCQkJaWYgKHN0clZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuIFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJCQkJLmdldFNpbXBsZUVycm9yTWVzc2FnZShzdHJWYWxpZGF0b3IKLQkJCQkJCQkJCQkJLmlzVmFsaWQobmV3VGV4dCkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCS8vIFRPRE86IHJlcGxhY2Ugd2l0aCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIucmVxdWVzdElucHV0KFN0cmluZywgU3RyaW5nLCBMaXN0KQotCQkJCUlucHV0RGlhbG9nIGlucHV0RGxnID0gbmV3IElucHV0RGlhbG9nKAotCQkJCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLCB0aXRsZSwgZGxnTXNnLCBjdXJyZW50VmFsdWUsCi0JCQkJCQlpbnB1dFZhbGlkYXRvcik7Ci0JCQkJaWYgKGlucHV0RGxnLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlyZXR1cm4gaW5wdXREbGcuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlDb2xsZWN0aW9uIGFmZmVjdGVkT2JqZWN0cyA9IHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCQlpZiAoYWZmZWN0ZWRPYmplY3RzID09IG51bGwpIHsKLQkJCUVPYmplY3Qgb3duZXIgPSBhZGRDb21tYW5kLmdldE93bmVyKCk7Ci0JCQlhZmZlY3RlZE9iamVjdHMgPSBvd25lciA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUCi0JCQkJCTogQ29sbGVjdGlvbnMuc2luZ2xldG9uKG93bmVyKTsKLQkJfQotCQlyZXR1cm4gYWZmZWN0ZWRPYmplY3RzOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldEVsZW1lbnRzVG9DaGVja0ZvcklsbGVnYWxSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVkRnJvbU91dGdvaW5nUmVmZXJlbmNlQ2hlY2soT2JqZWN0IGUpIHsKLQkJLy8gZG9uJ3QgY2hlY2sgb24gUHJvY2Vzc1BhY2thZ2UsIFByb2Nlc3NFbGVtZW50IGZvciBpbGxlZ2FsIHJlZmVyZW5jZXMKLQkJLy8gYi9jIHByb2Nlc3MgdmFsaWRhdGlvbiBpcyBiYXNlZCBvbiBjb25maWd1cmF0aW9uLCBub3QgcGx1Z2luCi0JCS8vIHZpc2liaWxpdHkKLQkJLy8KLQkJcmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSB8fCBlIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjaGVja0ZvcklsbGVnYWxSZWZlcmVuY2VzKCkgewotCQlDb2xsZWN0aW9uIGVsZW1lbnRzID0gZ2V0RWxlbWVudHNUb0NoZWNrRm9ySWxsZWdhbFJlZmVyZW5jZXMoKTsKLQkJYWRkTGlzdCA9IG5ldyBBcnJheUxpc3QoZWxlbWVudHMpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCS8vIFN0cmluZyBuZXdOYW1lID0gKFN0cmluZykgZWxlbWVudFRvTmV3TmFtZU1hcC5nZXQoZWxlbWVudCk7Ci0JCQkvLyBpZihuZXdOYW1lICE9IG51bGwpIHsKLQkJCS8vIGVsZW1lbnQuc2V0TmFtZShuZXdOYW1lKTsKLQkJCS8vIH0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJYWRkTGlzdC5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGlmIHRoZXJlIGlzIGFueSBpbGxlZ2FsIHJlZmVyZW5jZSBpbiB0aGUgbW92ZWQgb2JqZWN0cwotCQkvLwkJCi0JCW93bmVyUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oYWRkQ29tbWFuZC5nZXRPd25lcigpKTsKLQkJcmVtb3ZlWFJlZlJlcXVpcmVkID0gZmFsc2U7Ci0JCWZpbmRfeFBsdWdpblJlZjogZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkKLQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCi0JCQlpZiAoaXNFeGNsdWRlZEZyb21PdXRnb2luZ1JlZmVyZW5jZUNoZWNrKGVsZW1lbnQpKSB7Ci0JCQkJY29udGludWUgZmluZF94UGx1Z2luUmVmOwotCQkJfQotCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlpZiAoaGFzSWxsZWdhbFJlZmVyZW5jZUluY2x1ZGluZ0FsbENoaWxkcmVuKG93bmVyUGx1Z2luLAotCQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQsIGFkZExpc3QpKSB7Ci0JCQkJCXJlbW92ZVhSZWZSZXF1aXJlZCA9IHRydWU7Ci0JCQkJCWJyZWFrIGZpbmRfeFBsdWdpblJlZjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmVtb3ZlWFJlZlJlcXVpcmVkKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZFJlZmVyZW5jZXNFcnJvcl9yZWFzb247IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJfQotCQlpZiAoYWRkRmVhdHVyZUlzQ29udGFpbm1lbnQoKSkgewotCQkJSUxpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKTsKLQkJCWJvb2xlYW4gc2F2ZU93bmVyUmVzb3VyY2UgPSBmYWxzZTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmICghcGVyc2lzdGVyLmhhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKGUpKSB7Ci0JCQkJCXNhdmVPd25lclJlc291cmNlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc2F2ZU93bmVyUmVzb3VyY2UpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWRkQ29tbWFuZC5nZXRPd25lcigpLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhZGRDb21tYW5kLmdldE93bmVyKCkuZVJlc291cmNlKCkpOwotCQl9Ci0KLQkJaWYgKG5lc3RlZENvbW1hbmRzICE9IG51bGwgJiYgIW5lc3RlZENvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IG5lc3RlZENvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgbmVzdGVkQ29tbWFuZHMuZ2V0KGkpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChjbWQgaW5zdGFuY2VvZiBJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIHsKLQkJCQkJCUNvbGxlY3Rpb24gcmVzb3VyY2VzID0gKChJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIGNtZCkKLQkJCQkJCQkJLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkJCQlpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwocmVzb3VyY2VzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gd2lsbFNhdmVNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMKLQkJCQkuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQl0cnkgewotCi0JCQkvLyBzYXZlIHRoZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRNb2RpZmllZFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQljYW5VbmRvID0gZmFsc2U7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2ZUZpbGVFcnJvcl9yZWFzb24sIAotCQkJCQkJCXJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpID8gcmVzb3VyY2UKLQkJCQkJCQkJCS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSA6IHJlc291cmNlLnRvU3RyaW5nKCkpOwotCQkJCQlzdGF0dXMuYWRkKG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2csIGUpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEFmZmVjdGVkT2JqZWN0cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWVsZW1lbnRzVG9Db3B5UmVmQ29udGVudHMuYWRkKFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKSk7Ci0JCQkJfQotCi0JCQkJQ29sbGVjdGlvbiBtb2RpZmllZCA9IHJlc01nci5jb3B5UmVmZXJlbmNlZENvbnRlbnRzKAotCQkJCQkJZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cywgZWxlbWVudFRvT2xkUGx1Z2luTWFwKTsKLQkJCQltb2RpZmllZAotCQkJCQkJLmFkZEFsbChyZXBsYWNlVGV4dFJlZmVyZW5jZXMoZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cykpOwotCQkJCWlmIChtb2RpZmllZCAhPSBudWxsICYmICFtb2RpZmllZC5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKAotCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2ZUZpbGVFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQlyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJCQkJc3RhdHVzLmFkZChuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2csIGUpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmdXcml0ZXIgbXNnID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKG1zZykpOwotCQkJSVN0YXR1cyBuZXdTdGF0dXMgPSBuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2cudG9TdHJpbmcoKSwgZSk7Ci0JCQlzdGF0dXMuYWRkKG5ld1N0YXR1cyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJU3RyaW5nV3JpdGVyIG1zZyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKG1zZykpOwotCQkJCQlJU3RhdHVzIG5ld1N0YXR1cyA9IG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJU2F2ZVN0YXR1cy5ST0xMQkFDS19FUlJPUiwgbXNnLnRvU3RyaW5nKCksIGUpOwotCQkJCQlzdGF0dXMuYWRkKG5ld1N0YXR1cyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgdGV4dHVhbCBkZXNjcmlwdGlvbnMgaW4gdGhlIGNvcGllZCBlbGVtZW50cyBjb250YWluIHJlZmVyZW5jZXMgKFVSTHMpCi0JICogdG8gb3RoZXIgZWxlbWVudHMgd2l0aGluIHRoZSBzYW1lIGNvcGllZCBwcm9jZXNzIHRoZW4gcmVwbGFjZSB0aGVzZQotCSAqIHJlZmVyZW5jZXMgd2l0aCByZWZlcmVuY2VzIHRoYXQgcG9pbnQgdG8gdGhlIG5ldyBlbGVtZW50cyBpbiB0aGUgY29waWVkCi0JICogc3RydWN0dXJlcy4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gcmVwbGFjZVRleHRSZWZlcmVuY2VzKAotCQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzKSB7Ci0JCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlJVGV4dFJlZmVyZW5jZVJlcGxhY2VyIHR4dFJlZlJlcGxhY2VyID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCS5nZXRUZXh0UmVmZXJlbmNlUmVwbGFjZXIoKTsKLQkJaWYgKHR4dFJlZlJlcGxhY2VyID09IG51bGwpCi0JCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkJLy8gZ2V0IG1hcAotCQlFZGl0aW5nRG9tYWluIGVkID0gYWRkQ29tbWFuZC5nZXREb21haW4oKTsKLQkJaWYgKGVkIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQlNYXAgY29weVRvT3JpZ2luYWxNYXAgPSAoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZWQpCi0JCQkJCS5nZXRDb3B5VG9PcmlnaW5hbE1hcCgpOwotCQkJLy8gdGhlIFRleHRSZWZlcmVuY2VSZXBsYWNlciBleHBlY3RzIGEgbWFwIG9mIG9sZC10by1uZXcuIHdlCi0JCQkvLyBoYXZlIGEgbWFwIG9mIG5ldy10by1vbGQsIHNvIGNvbnZlcnQgaXQKLQkJCU1hcCBvbGRUb05ld09iamVjdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb3B5VG9PcmlnaW5hbE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3Qga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJT2JqZWN0IHZhbCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJaWYgKGtleSAhPSBudWxsICYmIHZhbCAhPSBudWxsKQotCQkJCQlvbGRUb05ld09iamVjdE1hcC5wdXQodmFsLCBrZXkpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWZvciAoSXRlcmF0b3IgY2hpbGRJdGVyID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgY2hpbGRJdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIGNoaWxkSXRlci5uZXh0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgYXR0cmlidXRlcyA9IGNoaWxkLmVDbGFzcygpCi0JCQkJCQkJLmdldEVBbGxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgYXR0cmlidXRlcwotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlKCkKLQkJCQkJCQkJJiYgIWF0dHJpYnV0ZS5pc0Rlcml2ZWQoKQotCQkJCQkJCQkmJiAoYXR0cmlidXRlLmlzTWFueSgpIHx8IGNoaWxkCi0JCQkJCQkJCQkJLmVJc1NldChhdHRyaWJ1dGUpKQotCQkJCQkJCQkmJiBhdHRyaWJ1dGUuZ2V0RUF0dHJpYnV0ZVR5cGUoKQotCQkJCQkJCQkJCS5nZXRJbnN0YW5jZUNsYXNzKCkgPT0gTGl0ZXJhbHMuU1RSSU5HCi0JCQkJCQkJCQkJLmdldEluc3RhbmNlQ2xhc3MoKSkgewotCQkJCQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZykgY2hpbGQuZUdldChhdHRyaWJ1dGUpOwotCQkJCQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCQkJCQkJU3RyaW5nIG5ld3RleHQgPSB0eHRSZWZSZXBsYWNlci5yZXBsYWNlKHRleHQsCi0JCQkJCQkJCQkJY2hpbGQsIG9sZFRvTmV3T2JqZWN0TWFwKTsKLQkJCQkJCQkJaWYgKCFuZXd0ZXh0LmVxdWFscyh0ZXh0KSkgewotCQkJCQkJCQkJY2hpbGQuZVNldChhdHRyaWJ1dGUsIG5ld3RleHQpOwotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNoaWxkLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9BZGQoKSB7Ci0JCXRyeSB7Ci0JCQkvLyBjaGVjayBmZWF0dXJlIHZhbHVlcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEZlYXR1cmVzVG9DaGVjaygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJCWlmICghY2hlY2tTdHJpbmdWYWx1ZShmZWF0dXJlKSkgewotCQkJCQkvLyB1c2VyIGNhbmNlbGVkIHRoZSBvcGVyYWlvbgotCQkJCQkvLwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQlib29sZWFuIHNob3dXYXJuaW5nID0gZmFsc2U7Ci0JCQlFZGl0aW5nRG9tYWluIGVkID0gYWRkQ29tbWFuZC5nZXREb21haW4oKTsKLQkJCWlmIChlZCBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJCU1hcCBjb3B5VG9PcmlnaW5hbE1hcCA9ICgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBlZCkKLQkJCQkJCS5nZXRDb3B5VG9PcmlnaW5hbE1hcCgpOwotCi0JCQkJLy8gY2hlY2sgZmlyc3QgZWxlbWVudCBvZiBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKQotCQkJCS8vIGlmIGl0J3MgYSBrZXkgaW4gdGhlIENvcHlUb09yaWdpbmFsTWFwLCB3ZSBhcmUgcGFzdGluZyBhbmQKLQkJCQkvLyBtYXkgbmVlZCB0byB3YXJuIHRoZSB1c2VyCi0JCQkJLy8gaWYgaXQncyBub3QgYSBrZXkgaW4gdGhlIENvcHlUb09yaWdpbmFsTWFwLCB0aGVuIHdlIGFyZQotCQkJCS8vIHByb2JhYmx5IGFkZGluZyBhIG5ldyBlbGVtZW50Ci0JCQkJaWYgKGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpICE9IG51bGwKLQkJCQkJCSYmIGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLnNpemUoKSA+IDAKLQkJCQkJCSYmIGNvcHlUb09yaWdpbmFsTWFwLmNvbnRhaW5zS2V5KGFkZENvbW1hbmQKLQkJCQkJCQkJLmdldENvbGxlY3Rpb24oKS50b0FycmF5KClbMF0pKSB7Ci0JCQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSBjb3B5VG9PcmlnaW5hbE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCQkmJiAhKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSkgewotCQkJCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsCi0JCQkJCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChNZXRob2RFbGVtZW50KSBlbnRyeQotCQkJCQkJCQkJCQkuZ2V0VmFsdWUoKSk7Ci0JCQkJCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcC5wdXQoZW50cnkuZ2V0S2V5KCksCi0JCQkJCQkJCQkJcGx1Z2luKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBwbHVnaW4gPT0gbnVsbCwgb3JpZ2luYWwgZWxlbWVudCB3YXMgcHJvYmFibHkKLQkJCQkJCQkJLy8gZGVsZXRlZAotCQkJCQkJCQlzaG93V2FybmluZyA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoc2hvd1dhcm5pbmcpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFCi0JCQkJCQkuc2hvd1dhcm5pbmcoCi0JCQkJCQkJCWdldExhYmVsKCksCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZyk7Ci0JCQl9Ci0KLQkJCWZpbmFsIFN0cmluZ0J1ZmZlciBtc2dCdWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBjaGVja0ZvcklsbGVnYWxSZWZlcmVuY2VzKCk7Ci0JCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQkJbXNnQnVmZi5hcHBlbmQobXNnKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfTsKLQotCQkJSVByb2dyZXNzTW9uaXRvciBkZWZhdWx0TW9uaXRvciA9IG51bGw7Ci0JCQlpZiAoIXJ1bldpdGhQcm9ncmVzcykgewotCQkJCWRlZmF1bHRNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCX0KLQotCQkJaWYgKHJ1bldpdGhQcm9ncmVzcykgewotCQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3Mob3BlcmF0aW9uLAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQl0cnkgewotCQkJCQlvcGVyYXRpb24ucnVuKGRlZmF1bHRNb25pdG9yKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl0aHJvdyBlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobXNnQnVmZi5sZW5ndGgoKSA+IDAKLQkJCQkJJiYgTXNnQm94LnByb21wdChEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJCW1zZ0J1ZmYudG9TdHJpbmcoKSwgU1dULllFUyB8IFNXVC5OTykgPT0gU1dULk5PKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQlJU3RhdHVzLk9LLAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzLAotCQkJCQludWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJb3BlcmF0aW9uID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJaWYgKHJlbW92ZVhSZWZSZXF1aXJlZCkgewotCQkJCQkJbW9uaXRvci5zdWJUYXNrKCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCQkJcmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXMob3duZXJQbHVnaW4sIGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIGFkZCB0aGUgZWxlbWVudHMKLQkJCQkJLy8KLQkJCQkJc3VwZXJFeGVjdXRlKCk7Ci0KLQkJCQkJZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCk7Ci0KLQkJCQkJaWYgKHdpbGxTYXZlTW9kaWZpZWRSZXNvdXJjZXMoKSkgewotCQkJCQkJSVN0YXR1cyByZXN1bHQgPSBzYXZlTmV3RWxlbWVudHNXaXRoT3duUmVzb3VyY2UoKTsKLQkJCQkJCWlmIChyZXN1bHQuaXNPSygpKSB7Ci0JCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkJLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2aW5nTW9kaWZpZWRGaWxlc1Rhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQJCQkJCQotCQkJCQkJCXNhdmVNb2RpZmllZFJlc291cmNlcygpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzdGF0dXMuYWRkKHJlc3VsdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCS8vIEZJWE1FOiB0aGlzIGNhdXNlcyBkZWFkLWxvY2sgYXQKLQkJCQkJCS8vIExpYnJhcnlQcm9jZXNzb3Iubm90aWZ5TGlzdGVuZXJzKCkuIFRoZSBtZXRob2QKLQkJCQkJCS8vIGlzIHN5bmNocm9uaXplZCwgdGhpcyBtaWdodCBiZSB0aGUgY2F1c2Ugb2YgdGhlCi0JCQkJCQkvLyBkZWFkLWxvY2sKLQkJCQkJCS8vCi0JCQkJCQl1bmRvKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX07Ci0JCQlpZiAocnVuV2l0aFByb2dyZXNzKSB7Ci0JCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhvcGVyYXRpb24sICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQl0cnkgewotCQkJCQlvcGVyYXRpb24ucnVuKGRlZmF1bHRNb25pdG9yKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl0aHJvdyBlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoZ2V0TGFiZWwoKSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JfbXNnV2l0aERldGFpbHMsIHN0YXR1cyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoZ2V0TGFiZWwoKSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JfbXNnLCBudWxsLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGRGZWF0dXJlSXNDb250YWlubWVudCgpIHsKLQkJcmV0dXJuIGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgRVJlZmVyZW5jZQotCQkJCSYmICgoRVJlZmVyZW5jZSkgYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCkpLmlzQ29udGFpbm1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBhZGRlZCBlbGVtZW50cyB0aGF0IGFyZSBuZXcgdG8gdGhlIGxpYnJhcnkgYW5kIGNhbiBoYXZlIG93bgotCSAqIHJlc291cmNlIHRoYXQgbm8gb3RoZXIgcmVzb3VyY2UgcmVmZXJzIHRvIChsaWtlIE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICogCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBzYXZlTmV3RWxlbWVudHNXaXRoT3duUmVzb3VyY2UoKSB7Ci0JCWlmIChhZGRGZWF0dXJlSXNDb250YWlubWVudCgpKSB7Ci0JCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJCWlmIChwZXJzaXN0ZXIuaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIobWUpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKG1lKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQkJCWlmIChTdHJVdGlsLmlzQmxhbmsobXNnKSkgewotCQkJCQkJCQltc2cgPSBlLnRvU3RyaW5nKCk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2csIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCkgewotCQlMaXN0IG5lc3RlZENvbW1hbmRQcm92aWRlcnMgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJLmdldE5lc3RlZENvbW1hbmRQcm92aWRlcnMoKTsKLQkJaWYgKCFuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJaWYgKCFhZGRMaXN0LmlzRW1wdHkoKSkgewotCQkJCW5lc3RlZENvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJSU5lc3RlZENvbW1hbmRQcm92aWRlciBjbWRQcm92aWRlciA9IChJTmVzdGVkQ29tbWFuZFByb3ZpZGVyKSBpdGVyCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNvbW1hbmQgY21kID0gY21kUHJvdmlkZXIuY3JlYXRlUmVsYXRlZE9iamVjdHMoYWRkTGlzdCwKLQkJCQkJCQkJdGhpcyk7Ci0JCQkJCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJCQkJbmVzdGVkQ29tbWFuZHMuYWRkKGNtZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRhaW5tZW50SW5mbyB7Ci0JCUVPYmplY3QgY29udGFpbmVyOwotCi0JCWludCBpbmRleDsKLQotCQlDb250YWlubWVudEluZm8oRU9iamVjdCBjb250YWluZXIsIGludCBpbmRleCkgewotCQkJdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlciB7Ci0JCXByaXZhdGUgTWV0aG9kUGx1Z2luIHRhcmdldFBsdWdpbjsKLQotCQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHNUb01vdmU7Ci0KLQkJLyoqCi0JCSAqIGxpc3Qgb2YgUmVmZXJlbmNlIG9iamVjdHMKLQkJICogCi0JCSAqIEBzZWUgUmVmZXJlbmNlCi0JCSAqLwotCQlwcml2YXRlIExpc3QgaWxsZWdhbFJlZmVyZW5jZXM7Ci0KLQkJcHJpdmF0ZSBTZXQgYWZmZWN0ZWRSZXNvdXJjZXM7Ci0KLQkJcHJpdmF0ZSBBcnJheUxpc3QgcmVtb3ZlZFJlZmVyZW5jZXM7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHNlYXJjaE91dGdvaW5nUmVmczsKLQotCQlwcml2YXRlIGJvb2xlYW4gc2VhcmNoSW5jb21pbmdSZWZzOwotCi0JCXB1YmxpYyBJbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlcihNZXRob2RQbHVnaW4gdGFyZ2V0UGx1Z2luLAotCQkJCUNvbGxlY3Rpb24gZWxlbWVudHNUb01vdmUsIGJvb2xlYW4gc2VhcmNoT3V0Z29pbmdSZWZzLAotCQkJCWJvb2xlYW4gc2VhcmNoSW5jb21pbmdSZWZzKSB7Ci0JCQl0aGlzLnRhcmdldFBsdWdpbiA9IHRhcmdldFBsdWdpbjsKLQkJCXRoaXMuZWxlbWVudHNUb01vdmUgPSBlbGVtZW50c1RvTW92ZTsKLQkJCXRoaXMuc2VhcmNoT3V0Z29pbmdSZWZzID0gc2VhcmNoT3V0Z29pbmdSZWZzOwotCQkJdGhpcy5zZWFyY2hJbmNvbWluZ1JlZnMgPSBzZWFyY2hJbmNvbWluZ1JlZnM7Ci0JCX0KLQotCQlwdWJsaWMgU2V0IGdldEFmZmVjdGVkUmVzb3VyY2VzKCkgewotCQkJaWYgKGFmZmVjdGVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCQlpbGxlZ2FsUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudHNUb01vdmUuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0KLQkJCQkJCS8vIGdldCBvdXRnb2luZyByZWZlcmVuY2VzCi0JCQkJCQkvLwotCQkJCQkJaWYgKHNlYXJjaE91dGdvaW5nUmVmcwotCQkJCQkJCQkmJiAhaXNFeGNsdWRlZEZyb21PdXRnb2luZ1JlZmVyZW5jZUNoZWNrKG9iaikpIHsKLQkJCQkJCQlnZXRJbGxlZ2FsT3V0Z29pbmdSZWZlcmVuY2VzKHRhcmdldFBsdWdpbiwgZSwKLQkJCQkJCQkJCWlsbGVnYWxSZWZlcmVuY2VzKTsKLQkJCQkJCX0KLQotCQkJCQkJLy8gZ2V0IGluY29taW5nIHJlZmVyZW5jZXMKLQkJCQkJCS8vCi0JCQkJCQlpZiAoc2VhcmNoSW5jb21pbmdSZWZzKSB7Ci0JCQkJCQkJQ29sbGVjdGlvbiByZWZlcmVuY2VzID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkJCS5nZXRSZWZlcmVuY2VzKGUpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIKLQkJCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCQlpZiAoIWVsZW1lbnRzVG9Nb3ZlLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbAotCQkJCQkJCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJCQkJCQkJaWYgKHBsdWdpbiAhPSBudWxsCi0JCQkJCQkJCQkJCSYmIHBsdWdpbiAhPSB0YXJnZXRQbHVnaW4KLQkJCQkJCQkJCQkJJiYgIU1pc2MuaXNCYXNlT2YodGFyZ2V0UGx1Z2luLAotCQkJCQkJCQkJCQkJCXBsdWdpbikpIHsKLQkJCQkJCQkJCQlDb2xsZWN0aW9uIHhSZWZzID0gZ2V0WFJlZmVyZW5jZXMoCi0JCQkJCQkJCQkJCQllbGVtZW50LCBlLCBudWxsKTsKLQkJCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0geFJlZnMuaXRlcmF0b3IoKTsgaXRlcjEKLQkJCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcjEKLQkJCQkJCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCQkJCQlpbGxlZ2FsUmVmZXJlbmNlcwotCQkJCQkJCQkJCQkJCS5hZGQobmV3IFJlZmVyZW5jZShlbGVtZW50LAotCQkJCQkJCQkJCQkJCQkJZiwgZSkpOwotCQkJCQkJCQkJCX0KLQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYWZmZWN0ZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGlsbGVnYWxSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKHJlZi5vd25lci5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZmZlY3RlZFJlc291cmNlcy5hZGQocmVmLm93bmVyLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBhZmZlY3RlZFJlc291cmNlczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUlsbGVnYWxSZWZlcmVuY2VzKCkgewotCQkJcmVtb3ZlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbGxlZ2FsUmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHJlZi5mZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCUxpc3QgbGlzdCA9ICgoTGlzdCkgcmVmLm93bmVyLmVHZXQocmVmLmZlYXR1cmUpKTsKLQkJCQkJLy8gVE9ETzogbmVlZHMgcmV2aXNpdAotCQkJCQkvLyBUaGlzIGNvZGUgdGhyb3dzCi0JCQkJCS8vIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0JEJhc2ljSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotCQkJCQkvLyBzb21ldGltZXMKLQkJCQkJLy8KLQkJCQkJLy8gaWYocmVmLmluZGV4ICE9IC0xKSB7Ci0JCQkJCS8vIGxpc3QucmVtb3ZlKHJlZi5pbmRleCk7Ci0JCQkJCS8vIH0KLQkJCQkJLy8gZWxzZSB7Ci0JCQkJCS8vIGxpc3QucmVtb3ZlKHJlZi52YWx1ZSk7Ci0JCQkJCS8vIH0KLQotCQkJCQlsaXN0LnJlbW92ZShyZWYudmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlZi5vd25lci5lU2V0KHJlZi5mZWF0dXJlLCBudWxsKTsKLQkJCQl9Ci0JCQkJcmVtb3ZlZFJlZmVyZW5jZXMuYWRkKHJlZik7Ci0JCQl9Ci0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc3RvcmVSZW1vdmVkUmVmZXJlbmNlcygpIHsKLQkJCWlmIChyZW1vdmVkUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IHJlbW92ZWRSZWZlcmVuY2VzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIHJlbW92ZWRSZWZlcmVuY2VzLmdldChpKTsKLQkJCQlpZiAocmVmLmZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJTGlzdCBsaXN0ID0gKChMaXN0KSByZWYub3duZXIuZUdldChyZWYuZmVhdHVyZSkpOwotCQkJCQlpZiAocmVmLmluZGV4ICE9IC0xKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIFRPRE86IG5lZWQgcmV2aXNpdHMKLQkJCQkJCQkvLwotCQkJCQkJCWlmICghbGlzdC5jb250YWlucyhyZWYudmFsdWUpKSB7Ci0JCQkJCQkJCWlmIChyZWYuaW5kZXggPCBsaXN0LnNpemUoKSkgewotCQkJCQkJCQkJbGlzdC5hZGQocmVmLmluZGV4LCByZWYudmFsdWUpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJbGlzdC5hZGQocmVmLnZhbHVlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93IGU7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsaXN0LmFkZChyZWYudmFsdWUpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVmLm93bmVyLmVTZXQocmVmLmZlYXR1cmUsIHJlZi52YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBNb3ZlT3BlcmF0aW9uIHsKLQkJLyoqIENvbnN0YW50cyBmb3Igc3RhdGUgb2YgdGhlIG1vdmUgb3BlcmF0aW9uICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9TVEFSVCA9IDA7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NBVkVEX0ZJTEVTID0gODA7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX01PVkVEX0ZJTEVTID0gNzA7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPUElFRF9SRVNPVVJDRVMgPSA5MDsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRU5EID0gMTAwOwotCi0JCS8vIHByaXZhdGUgQ29tbWFuZCBjb21tYW5kOwotCQlwcml2YXRlIEFkZENvbW1hbmQgYWRkQ29tbWFuZDsKLQotCQlwcml2YXRlIENvbGxlY3Rpb24gbW92ZUxpc3Q7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHJlbW92ZVhSZWZSZXF1aXJlZCA9IGZhbHNlOwotCi0JCXByaXZhdGUgYm9vbGVhbiBpc1JlZmVucmVjZWRJbGxlZ2FsbHkgPSBmYWxzZTsKLQotCQlwcml2YXRlIE1ldGhvZFBsdWdpbiBvd25lclBsdWdpbjsKLQotCQlwcml2YXRlIE1hcCBlbGVtZW50VG9PbGRQbHVnaW5NYXA7Ci0KLQkJcHJpdmF0ZSBNYXAgZWxlbWVudFRvTmV3TmFtZU1hcDsKLQotCQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQotCQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0JCXByaXZhdGUgSGFzaFNldCBtb3ZlZFJlc291cmNlczsKLQotCQlwcml2YXRlIE11bHRpU3RhdHVzIHN0YXR1czsKLQotCQkvKioKLQkJICogQ3VycmVudCBzdGF0ZSBvZiB0aGUgbW92ZSBvcGVyYXRpb24sIGl0IGNhbiBiZSBvbmUgb2YgdGhlIHN0YXRlCi0JCSAqIGNvbnN0YW50cwotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgc3RhdGU7Ci0KLQkJcHJvdGVjdGVkIFNldCBtb2RpZmllZFJlc291cmNlczsKLQotCQlwcml2YXRlIElsbGVnYWxSZWZlcmVuY2VSZW1vdmVyIGlsbGVnYWxSZWZlcmVuY2VSZW1vdmVyOwotCi0JCXByaXZhdGUgSGFzaE1hcCBlbGVtZW50VG9PbGRDb250YWluZXJNYXA7Ci0KLQkJcHVibGljIE1vdmVPcGVyYXRpb24oQ29tbWFuZCBjb21tYW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQkJU2hlbGwgc2hlbGwpIHsKLQkJCS8vIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JCQlhZGRDb21tYW5kID0gKEFkZENvbW1hbmQpIFRuZ1V0aWwudW53cmFwKGNvbW1hbmQpOwotCQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQkJCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YXR1cy4KLQkJICovCi0JCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQkvKioKLQkJICogQ2hlY2tzIGlmIHJlbG9hZGluZyBsaWJyYXJ5IGlzIG5lZWRlZCBpbiBjYXNlIG9mIG1vdmUgZmFpbHVyZQotCQkgKiAKLQkJICogQHJldHVybgotCQkgKiBAc2VlICNnZXRTdGF0dXMoKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gcmVsb2FkTmVlZGVkKCkgewotCQkJcmV0dXJuIHN0YXR1cyAhPSBudWxsCi0JCQkJCSYmIENvbW1hbmRTdGF0dXNDaGVja2VyLmhhc1JvbGxiYWNrRXJyb3Ioc3RhdHVzKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB1bmRvKCkgewotCQkJLy8gdW5kbyBuYW1lIGNoYW5nZQotCQkJLy8KLQkJCWlmIChlbGVtZW50VG9OZXdOYW1lTWFwICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50VG9OZXdOYW1lTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCWUuc2V0TmFtZSgoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChlbGVtZW50VG9PbGRDb250YWluZXJNYXAgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRUb09sZENvbnRhaW5lck1hcC5lbnRyeVNldCgpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCUNvbnRhaW5tZW50SW5mbyBjb250YWlubWVudEluZm8gPSAoQ29udGFpbm1lbnRJbmZvKSBlbnRyeQotCQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpOwotCQkJCQlpZiAoZi5pc01hbnkoKSkgewotCQkJCQkJKChMaXN0KSBjb250YWlubWVudEluZm8uY29udGFpbmVyLmVHZXQoZikpLmFkZCgKLQkJCQkJCQkJY29udGFpbm1lbnRJbmZvLmluZGV4LCBlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvbnRhaW5tZW50SW5mby5jb250YWluZXIuZVNldChmLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGlsbGVnYWxSZWZlcmVuY2VSZW1vdmVyICE9IG51bGwpIHsKLQkJCQlpbGxlZ2FsUmVmZXJlbmNlUmVtb3Zlci5yZXN0b3JlUmVtb3ZlZFJlZmVyZW5jZXMoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXN0YXRlID0gU1RBVEVfU1RBUlQ7Ci0KLQkJCXN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGNoZWNrTmFtZSgpKSB7Ci0JCQkJLy8gY2hlY2sgaWYgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIHRoaXMKLQkJCQkvLyBjb21tYW5kIGNhbiBiZSBtb2RpZmllZAotCQkJCS8vCi0JCQkJSVN0YXR1cyBleGVjU3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkuY2hlY2tDb25maWd1cmF0aW9uc1RvVXBkYXRlKGFkZENvbW1hbmQsIHNoZWxsKTsKLQkJCQlpZiAoIWV4ZWNTdGF0dXMuaXNPSygpKSB7Ci0JCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoTGlicmFyeUVkaXRSZXNvdXJjZXMubW92ZURpYWxvZ190aXRsZSwgbnVsbCwgZXhlY1N0YXR1cyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlmaW5hbCBTdHJpbmdCdWZmZXIgbXNnQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLmNoZWNraW5nUmVmZXJlbmNlc1Rhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyBtc2cgPSBjaGVja0ZvcklsbGVnYWxSZWZlcmVuY2VzKCk7Ci0JCQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJCQltc2dCdWZmZXIuYXBwZW5kKG1zZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX07Ci0KLQkJCQl0cnkgewotCQkJCQlNb2RhbENvbnRleHQucnVuKHJ1bm5hYmxlLCB0cnVlLCBtb25pdG9yLCBzaGVsbAotCQkJCQkJCS5nZXREaXNwbGF5KCkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJVGhyb3dhYmxlIGV4OwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQkJCWV4ID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKQotCQkJCQkJCQkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlleCA9IGU7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG1zZyA9IFRuZ1V0aWwudG9TdGFja1RyYWNlU3RyaW5nKGV4KTsKLQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIDAsCi0JCQkJCQkJbXNnLCBleCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKG1zZ0J1ZmZlci5sZW5ndGgoKSA+IDAKLQkJCQkJCSYmIE1zZ0JveC5wcm9tcHQoc2hlbGwsIG1zZ0J1ZmZlci50b1N0cmluZygpLCBTV1QuWUVTCi0JCQkJCQkJCXwgU1dULk5PKSA9PSBTV1QuTk8pIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIHNhdmUgcmVmZXJlbmNlIHRvIG9sZCByZXNvdXJjZSBvZiBhbGwgZWxlbWVudHMgaW4gdGhlCi0JCQkJLy8gbW92ZUxpc3QKLQkJCQkvLwotCQkJCWZpbmFsIE1hcCBlbGVtZW50VG9PbGRSZXNvdXJjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW92ZUxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQkvLyBzYXZlIHRoZSByZWZlcmVuY2UgdG8gb2xkIHJlc291cmNlCi0JCQkJCQkvLwotCQkJCQkJZWxlbWVudFRvT2xkUmVzb3VyY2VNYXAucHV0KGVsZW1lbnQsIGVsZW1lbnQKLQkJCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChyZW1vdmVYUmVmUmVxdWlyZWQgfHwgaXNSZWZlbnJlY2VkSWxsZWdhbGx5KSB7Ci0JCQkJCS8vIGdldCBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgd2lsbCBiZSBtb2RpZmllZCBkdXJpbmcgdGhpcwotCQkJCQkvLyBtb3ZlCi0JCQkJCS8vCi0JCQkJCWlsbGVnYWxSZWZlcmVuY2VSZW1vdmVyID0gbmV3IElsbGVnYWxSZWZlcmVuY2VSZW1vdmVyKAotCQkJCQkJCW93bmVyUGx1Z2luLCBtb3ZlTGlzdCwgcmVtb3ZlWFJlZlJlcXVpcmVkLAotCQkJCQkJCWlzUmVmZW5yZWNlZElsbGVnYWxseSk7Ci0JCQkJCXJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCQltb25pdG9yCi0JCQkJCQkJCQkuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5jaGVja0FmZmVjdGVkUmVzb3VyY2VzVGFza19uYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gaWxsZWdhbFJlZmVyZW5jZVJlbW92ZXIKLQkJCQkJCQkJCS5nZXRBZmZlY3RlZFJlc291cmNlcygpOwotCQkJCQkJfQotCi0JCQkJCX07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlNb2RhbENvbnRleHQucnVuKHJ1bm5hYmxlLCB0cnVlLCBtb25pdG9yLCBzaGVsbAotCQkJCQkJCQkuZ2V0RGlzcGxheSgpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCVRocm93YWJsZSBleDsKLQkJCQkJCWlmIChlIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJCQkJCWV4ID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKQotCQkJCQkJCQkJLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlleCA9IGU7Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbXNnID0gVG5nVXRpbC50b1N0YWNrVHJhY2VTdHJpbmcoZXgpOwotCQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCQkwLCBtc2csIGV4KSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQkvLyBjaGVjayBhZmZlY3RlZCByZXNvdXJjZXMgZm9yIHVubW9kaWZpYWJsZQotCQkJCQlleGVjU3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KAotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLCBzaGVsbCk7Ci0JCQkJCWlmICghZXhlY1N0YXR1cy5pc09LKCkpIHsKLQkJCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoTGlicmFyeUVkaXRSZXNvdXJjZXMubW92ZURpYWxvZ190aXRsZSwgbnVsbCwgZXhlY1N0YXR1cyk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQl0cnkgewotCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpbGxlZ2FsUmVmZXJlbmNlUmVtb3Zlci5yZW1vdmVJbGxlZ2FsUmVmZXJlbmNlcygpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJdW5kbygpOwotCQkJCQkJU3RyaW5nIG1zZyA9IFRuZ1V0aWwudG9TdGFja1RyYWNlU3RyaW5nKGUpOwotCQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCQkwLCBtc2csIGUpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQkJbW9uaXRvci5zdWJUYXNrKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCS8vIHNldCBuZXcgbmFtZSBpZiB0aGVyZSBpcyBhbnkKLQkJCQkvLwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRUb05ld05hbWVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJTmFtZWRFbGVtZW50IGVsZW1lbnQgPSAoTmFtZWRFbGVtZW50KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJZWxlbWVudC5zZXROYW1lKChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kVW5pdCkgewotCQkJCQkJbW92ZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQkJCUNvbnRlbnRFbGVtZW50IGUgPSAoQ29udGVudEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJCQkJaWYgKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKGUpKSB7Ci0JCQkJCQkJCW1vdmVkUmVzb3VyY2VzLmFkZChlLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBtb3ZlIGVsZW1lbnRzCi0JCQkJLy8KLQkJCQlydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zZXRUYXNrTmFtZShMaWJyYXJ5RWRpdFJlc291cmNlcy5tb3ZpbmdUYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlkb01vdmUobW9uaXRvciwgZWxlbWVudFRvT2xkUmVzb3VyY2VNYXAsCi0JCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQkJfQotCi0JCQkJfTsKLQkJCQl0cnkgewotCQkJCQlNb2RhbENvbnRleHQucnVuKHJ1bm5hYmxlLCB0cnVlLCBtb25pdG9yLCBzaGVsbAotCQkJCQkJCS5nZXREaXNwbGF5KCkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXVuZG8oKTsKLQkJCQkJVGhyb3dhYmxlIGV4OwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQkJCWV4ID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKQotCQkJCQkJCQkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlleCA9IGU7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG1zZyA9IFRuZ1V0aWwudG9TdGFja1RyYWNlU3RyaW5nKGV4KTsKLQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIDAsCi0JCQkJCQkJbXNnLCBleCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gY2hlY2sgbW92ZWQgcmVzb3VyY2VzIHRoYXQgYXJlIG5vdCBpbiBtb2RpZmlhYmxlIHJlc291cmNlcwotCQkJCS8vIGZvciB1bm1vZGlmaWFibGUKLQkJCQkvLwotCQkJCUxpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdChtb3ZlZFJlc291cmNlcyk7Ci0JCQkJcmVzb3VyY2VzLnJlbW92ZUFsbChtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJZXhlY1N0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJLmNoZWNrTW9kaWZ5KHJlc291cmNlcywgc2hlbGwpOwotCQkJCWlmICghZXhlY1N0YXR1cy5pc09LKCkpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcihMaWJyYXJ5RWRpdFJlc291cmNlcy5tb3ZlRGlhbG9nX3RpdGxlLCBudWxsLCBleGVjU3RhdHVzKTsKLQotCQkJCQl1bmRvKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQkvLyBzYXZlIHJlc291cmNlcwotCQkJCS8vCi0JCQkJcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlJU3RhdHVzIHNhdmVTdGF0dXMgPSBzYXZlKG1vbml0b3IpOwotCQkJCQkJCWlmICghc2F2ZVN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJc3RhdHVzLmFkZChzYXZlU3RhdHVzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQkJdGhyb3cgZTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfTsKLQkJCQl0cnkgewotCQkJCQlNb2RhbENvbnRleHQucnVuKHJ1bm5hYmxlLCB0cnVlLCBtb25pdG9yLCBzaGVsbAotCQkJCQkJCS5nZXREaXNwbGF5KCkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRocm93YWJsZSBleDsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQkJCQlleCA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZSkKLQkJCQkJCQkJLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZXggPSBlOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBtc2cgPSBUbmdVdGlsLnRvU3RhY2tUcmFjZVN0cmluZyhleCk7Ci0JCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLCAwLAotCQkJCQkJCW1zZywgZXgpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJfQotCi0JCQlzdGF0ZSA9IFNUQVRFX0VORDsKLQkJfQotCi0JCS8qKgotCQkgKiBpbnRlcmFjdHMgd2l0aCB1c2VyCi0JCSAqIAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gY2hlY2tOYW1lKCkgewotCQkJZWxlbWVudFRvTmV3TmFtZU1hcCA9IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kLmNoZWNrTmFtZShhZGRDb21tYW5kKTsKLQkJCXJldHVybiBlbGVtZW50VG9OZXdOYW1lTWFwICE9IG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogTG9uZyBydW5uaW5nIG1ldGhvZAotCQkgKiAKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgY2hlY2tGb3JJbGxlZ2FsUmVmZXJlbmNlcygpIHsKLQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJCW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdChhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKSk7Ci0JCQltb3ZlZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0KLQkJCQkvLyAvLyBzZXQgbmV3IG5hbWUgaWYgdGhlcmUgaXMgYW55Ci0JCQkJLy8gLy8KLQkJCQkvLyBTdHJpbmcgbmV3TmFtZSA9IChTdHJpbmcpIGVsZW1lbnRUb05ld05hbWVNYXAuZ2V0KGVsZW1lbnQpOwotCQkJCS8vIGlmKG5ld05hbWUgIT0gbnVsbCkgewotCQkJCS8vICgoTmFtZWRFbGVtZW50KWVsZW1lbnQpLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFVuaXQpIHsKLQkJCQkvLyBtb3ZlZFJlc291cmNlcy5hZGQoZWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJLy8gQ29udGVudEVsZW1lbnQgZSA9IChDb250ZW50RWxlbWVudCkgZWxlbWVudDsKLQkJCQkvLyBpZihDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlKSkgewotCQkJCS8vIG1vdmVkUmVzb3VyY2VzLmFkZChlLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJZWxlbWVudFRvT2xkUGx1Z2luTWFwLnB1dChlbGVtZW50LCBVbWFVdGlsCi0JCQkJCQkJLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KSk7Ci0JCQkJfQotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJbW92ZUxpc3QuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjaGVjayBpZiB0aGVyZSBpcyBhbnkgaWxsZWdhbCByZWZlcmVuY2UgaW4gdGhlIG1vdmVkIG9iamVjdHMKLQkJCS8vCQkJCi0JCQlvd25lclBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGFkZENvbW1hbmQuZ2V0T3duZXIoKSk7Ci0JCQlmaW5kX3hQbHVnaW5SZWY6IGZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCi0JCQkJaWYgKGlzRXhjbHVkZWRGcm9tT3V0Z29pbmdSZWZlcmVuY2VDaGVjayhlbGVtZW50KSkgewotCQkJCQljb250aW51ZSBmaW5kX3hQbHVnaW5SZWY7Ci0JCQkJfQotCi0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWlmIChoYXNJbGxlZ2FsUmVmZXJlbmNlSW5jbHVkaW5nQWxsQ2hpbGRyZW4ob3duZXJQbHVnaW4sCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQsIG1vdmVMaXN0KSkgewotCQkJCQkJcmVtb3ZlWFJlZlJlcXVpcmVkID0gdHJ1ZTsKLQkJCQkJCWJyZWFrIGZpbmRfeFBsdWdpblJlZjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJZmluZF9pbGxlZ2FsUmVmZXJlbmNlcjogZm9yIChJdGVyYXRvciBpdGVyID0gbW92ZUxpc3QuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWlmIChpc1JlZmVyZW5jZWRJbGxlZ2FsbHkob3duZXJQbHVnaW4sCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQsIG1vdmVMaXN0KSkgewotCQkJCQkJaXNSZWZlbnJlY2VkSWxsZWdhbGx5ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrIGZpbmRfaWxsZWdhbFJlZmVyZW5jZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVtb3ZlWFJlZlJlcXVpcmVkIHx8IGlzUmVmZW5yZWNlZElsbGVnYWxseSkgewotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkUmVmZXJlbmNlc0Vycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogTG9uZyBydW5uaW5nIG1ldGhvZAotCQkgKiAKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGRvTW92ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQkJTWFwIGVsZW1lbnRUb09sZFJlc291cmNlTWFwLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJCW1vbml0b3Iuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCUVPYmplY3QgY29udGFpbmVyID0gZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZWxlbWVudC5lQ29udGFpbmluZ0ZlYXR1cmUoKTsKLQkJCQkJaW50IGluZGV4OwotCQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJaW5kZXggPSAoKExpc3QpIGNvbnRhaW5lci5lR2V0KGZlYXR1cmUpKQotCQkJCQkJCQkuaW5kZXhPZihlbGVtZW50KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWluZGV4ID0gLTE7Ci0JCQkJCX0KLQkJCQkJZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwLnB1dChlbGVtZW50LCBuZXcgQ29udGFpbm1lbnRJbmZvKAotCQkJCQkJCWNvbnRhaW5lciwgaW5kZXgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG1vdmUgdGhlIGVsZW1lbnRzCi0JCQkvLwotCQkJYWRkQ29tbWFuZC5leGVjdXRlKCk7Ci0KLQkJCS8vIGNvbGxlY3QgcmVzb3VyY2VzIHRoYXQgaGFkIGJlZW4gbW9kaWZlZCBhcyByZXN1bHQgb2YgdGhpcyBtb3ZlCi0JCQkvLwotCQkJUmVzb3VyY2UgbmV3UmVzb3VyY2UgPSBhZGRDb21tYW5kLmdldE93bmVyKCkuZVJlc291cmNlKCk7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQobmV3UmVzb3VyY2UpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJRU9iamVjdCBvbGRDb250YWluZXIgPSAoKENvbnRhaW5tZW50SW5mbykgZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwCi0JCQkJCQkJLmdldChlbGVtZW50KSkuY29udGFpbmVyOwotCQkJCQlpZiAob2xkQ29udGFpbmVyLmVSZXNvdXJjZSgpICE9IG5ld1Jlc291cmNlCi0JCQkJCQkJJiYgIW9sZENvbnRhaW5lci5lUmVzb3VyY2UoKS5nZXRDb250ZW50cygpCi0JCQkJCQkJCQkuaXNFbXB0eSgpKSB7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQob2xkQ29udGFpbmVyLmVSZXNvdXJjZSgpKTsKLQkJCQkJCVJlc291cmNlIG9sZFJlc291cmNlID0gKFJlc291cmNlKSBlbGVtZW50VG9PbGRSZXNvdXJjZU1hcAotCQkJCQkJCQkuZ2V0KGVsZW1lbnQpOwotCQkJCQkJaWYgKG9sZENvbnRhaW5lci5lUmVzb3VyY2UoKSAhPSBvbGRSZXNvdXJjZSkgewotCQkJCQkJCW1vdmVkUmVzb3VyY2VzLmFkZChvbGRSZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlPYmplY3QgcGx1Z2luID0gZWxlbWVudFRvT2xkUGx1Z2luTWFwLmdldChlbGVtZW50KTsKLQkJCQkJaWYgKG93bmVyUGx1Z2luICE9IHBsdWdpbikgewotCQkJCQkJLy8gaXQncyBhIGNyb3NzLXBsdWdpbiBtb3ZlLCBhZGQgdGhlIHJlc291cmNlcyBvZiB0aG9zZQotCQkJCQkJLy8gY2hpbGRyZW4gdGhhdCBoYXZlIGRpcmVjdCByZXNvdXJjZQotCQkJCQkJLy8gdG8gdGhlIG1vdmVSZXNvdXJjZXMgbGlzdAotCQkJCQkJLy8JCQkJCQkKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKFVtYVV0aWwuaGFzRGlyZWN0UmVzb3VyY2UoZSkpIHsKLQkJCQkJCQkJbW92ZWRSZXNvdXJjZXMuYWRkKGUuZVJlc291cmNlKCkpOwotCQkJCQkJCQllbGVtZW50VG9PbGRQbHVnaW5NYXAucHV0KGUsIHBsdWdpbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50ICYmCi0JCQkJCQkvLyBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbigoRGVzY3JpYmFibGVFbGVtZW50KQotCQkJCQkJLy8gZWxlbWVudCkpIHsKLQkJCQkJCS8vIG1vdmVkUmVzb3VyY2VzLmFkZCgoKERlc2NyaWJhYmxlRWxlbWVudCllbGVtZW50KS5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkvLyBlbGVtZW50VG9PbGRQbHVnaW5NYXAucHV0KCgoRGVzY3JpYmFibGVFbGVtZW50KWVsZW1lbnQpLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJLy8gcGx1Z2luKTsKLQkJCQkJCS8vIH0KLQkJCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOwotCQkJCQkJLy8gaXRlcmF0b3IKLQkJCQkJCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkvLyBPYmplY3QgZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCS8vIGlmKGUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQgJiYKLQkJCQkJCS8vIENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKChEZXNjcmliYWJsZUVsZW1lbnQpCi0JCQkJCQkvLyBlKSkgewotCQkJCQkJLy8gbW92ZWRSZXNvdXJjZXMuYWRkKCgoRGVzY3JpYmFibGVFbGVtZW50KWUpLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpKTsKLQkJCQkJCS8vIGVsZW1lbnRUb09sZFBsdWdpbk1hcC5wdXQoKChEZXNjcmliYWJsZUVsZW1lbnQpZSkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkvLyBwbHVnaW4pOwotCQkJCQkJLy8gfQotCQkJCQkJLy8gfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBJU3RhdHVzIHNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQlJU3RhdHVzLk9LLAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzLAotCQkJCQludWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCQltb25pdG9yLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2aW5nTW9kaWZpZWRGaWxlc1Rhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcwotCQkJCQkuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJc2F2ZTogZG8gewotCQkJCXRyeSB7Ci0KLQkJCQkJaWYgKCFtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMubW92aW5nRmlsZXNUYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCS8vIG1vdmUgdGhlIG1vdmVkIHJlc291cmNlcwotCQkJCQkJLy8KLQkJCQkJCXBlcnNpc3Rlci5hZGp1c3RMb2NhdGlvbihtb3ZlZFJlc291cmNlcyk7Ci0JCQkJCX0KLQkJCQkJc3RhdGUgPSBTVEFURV9NT1ZFRF9GSUxFUzsKLQotCQkJCQkvLyBzYXZlIHRoZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCQkJLy8KLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIG1vbml0b3Iuc3ViVGFzayhNZXNzYWdlRm9ybWF0LmZvcm1hdCgiU2F2aW5nCi0JCQkJCQkJLy8gJyd7MH0nJyIsIHBhdGhBcmdzKSk7Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCi0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmVGaWxlRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkgPyByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSA6IHJlc291cmNlLnRvU3RyaW5nKCkpOwotCQkJCQkJCXN0YXR1cy5hZGQobmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJCVNhdmVTdGF0dXMuU0FWRV9FUlJPUiwgbXNnLCBlKSk7Ci0JCQkJCQkJYnJlYWsgc2F2ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCXN0YXRlID0gU1RBVEVfU0FWRURfRklMRVM7Ci0KLQkJCQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLmNvcHlpbmdSZXNvdXJjZXNUYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCUNvbGxlY3Rpb24gZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vdmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cy5hZGRBbGwocmVzb3VyY2UKLQkJCQkJCQkJCS5nZXRDb250ZW50cygpKTsKLQkJCQkJCX0KLQotCQkJCQkJZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cy5hZGRBbGwoYWRkQ29tbWFuZAotCQkJCQkJCQkuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCi0JCQkJCQlDb2xsZWN0aW9uIG1vZGlmaWVkID0gcmVzTWdyLmNvcHlSZWZlcmVuY2VkQ29udGVudHMoCi0JCQkJCQkJCWVsZW1lbnRzVG9Db3B5UmVmQ29udGVudHMsCi0JCQkJCQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcCk7Ci0JCQkJCQlpZiAobW9kaWZpZWQgIT0gbnVsbCAmJiAhbW9kaWZpZWQuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWQuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJCQlPYmplY3RbXSBwYXRoQXJncyA9IHsgcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkgPyByZXNvdXJjZS5nZXRVUkkoKQotCQkJCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSA6IHJlc291cmNlLnRvU3RyaW5nKCl9OwotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkJCQkuc3ViVGFzayhNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmluZ0ZpbGVUYXNrX25hbWUsCi0JCQkJCQkJCQkJCQkJCQlwYXRoQXJncykpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotCQkJCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmVGaWxlRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJCQkJCXBhdGhBcmdzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJc3RhdHVzLmFkZChuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2csIGUpKTsKLQkJCQkJCQkJCWJyZWFrIHNhdmU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQlzdGF0ZSA9IFNUQVRFX0NPUElFRF9SRVNPVVJDRVM7Ci0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nV3JpdGVyIG1zZyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKG1zZykpOwotCQkJCQlJU3RhdHVzIG5ld1N0YXR1cyA9IG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2cudG9TdHJpbmcoKSwgZSk7Ci0JCQkJCXN0YXR1cy5hZGQobmV3U3RhdHVzKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJCVN0cmluZ1dyaXRlciBtc2cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKG1zZykpOwotCQkJCQkJCUlTdGF0dXMgbmV3U3RhdHVzID0gbmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJCVNhdmVTdGF0dXMuUk9MTEJBQ0tfRVJST1IsIG1zZy50b1N0cmluZygpLAotCQkJCQkJCQkJZSk7Ci0JCQkJCQkJc3RhdHVzLmFkZChuZXdTdGF0dXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSB3aGlsZSAoZmFsc2UpOwotCi0JCQltb25pdG9yLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuY29tbWFuZF9kb25lKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFJlc291cmNlTWFuYWdlciB7Ci0KLQkJLyoqCi0JCSAqIENvcGllcyB0aGUgY29udGVudCByZXNvdXJjZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSB0aGUgY29udGVudCBvZgotCQkgKiB0aGUgZ2l2ZW4gZWxlbWVudHMgdGhhdCBoYXZlIGJlZW4gbW92ZWQvY29waWVkIHRvIG5ldyBsb2NhdGlvbi4KLQkJICogCi0JCSAqIEBwYXJhbSBlbGVtZW50cwotCQkgKiAgICAgICAgICAgIEVsZW1lbnRzIHRoYXQgYXJlIG1vdmVkIG9yIGNvcGllZC4KLQkJICogQHJldHVybiBjb2xsZWN0aW9uIG9mIG1vZGlmaWVkIHJlc291cmNlcyBhcyB0aGUgcmVzdWx0IG9mIHRoaXMgY2FsbC4KLQkJICovCi0JCUNvbGxlY3Rpb24gY29weVJlZmVyZW5jZWRDb250ZW50cyhDb2xsZWN0aW9uIGVsZW1lbnRzLAotCQkJCU1hcCBlbGVtZW50VG9PbGRQbHVnaW5NYXApOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQmFzaWNSZXNvdXJjZU1hbmFnZXIgaW1wbGVtZW50cyBSZXNvdXJjZU1hbmFnZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZC5SZXNvdXJjZU1hbmFnZXIjY29weVJlZmVyZW5jZWRDb250ZW50cyhqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGNvcHlSZWZlcmVuY2VkQ29udGVudHMoQ29sbGVjdGlvbiBlbGVtZW50cywKLQkJCQlNYXAgZWxlbWVudFRvT2xkUGx1Z2luTWFwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJlc291cmNlTWFuYWdlcihSZXNvdXJjZU1hbmFnZXIgcmVzTWdyKSB7Ci0JCU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kLnJlc01nciA9IHJlc01ncjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdWYWxpZGF0b3IgZ2V0U3RyaW5nVmFsaWRhdG9yKCkgewotCQlpZiAoc3RyaW5nVmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXN0cmluZ1ZhbGlkYXRvciA9IG5ldyBTdHJpbmdWYWxpZGF0b3IoKTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nVmFsaWRhdG9yOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nVmFsaWRhdG9yIHN0cmluZ1ZhbGlkYXRvciA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJpbmdWYWxpZGF0b3IgaW1wbGVtZW50cyBJSW5wdXRWYWxpZGF0b3IgewotCi0JCXByaXZhdGUgQ29sbGVjdGlvbiBlbGVtZW50czsKLQotCQlwcml2YXRlIElWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmdWYWxpZGF0b3IoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGVsZW1lbnRzCi0JCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIHRvIGluY2x1ZGUgaW4gdGhlIGNoZWNrLgotCQkgKi8KLQkJcHVibGljIFN0cmluZ1ZhbGlkYXRvcihDb2xsZWN0aW9uIGVsZW1lbnRzLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBlbGVtZW50cyB0byBpbmNsdWRlIGluIHRoZSBjaGVjay4KLQkJICogCi0JCSAqIEBwYXJhbSBlbGVtZW50cwotCQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byBpbmNsdWRlIGluIHRoZSBjaGVjay4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRzKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCWlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBVbmlxdWVuZXNzVmFsaWRhdG9yKSB7Ci0JCQkJRU9iamVjdCBvYmogPSAoKFVuaXF1ZW5lc3NWYWxpZGF0b3IpIHZhbGlkYXRvcikuZ2V0RU9iamVjdCgpOwotCQkJCWludCBjbGFzc0lEID0gb2JqLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQkJCW5ld1RleHQgPSBuZXdUZXh0LnRyaW0oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlTdHJpbmcgc3RyID0gKFN0cmluZykgZS5lR2V0KGZlYXR1cmUpOwotCQkJCQlpZiAob2JqICE9IGUgJiYgY2xhc3NJRCA9PSBlLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpCi0JCQkJCQkJJiYgbmV3VGV4dC5lcXVhbHNJZ25vcmVDYXNlKHN0cikpIHsKLQkJCQkJCS8vIHJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksCi0JCQkJCQkvLyBkYXRhKTsKLQkJCQkJCXJldHVybiBOTFMKLQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csCi0JCQkJCQkJCQkJbmV3VGV4dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsaWRhdG9yLmlzVmFsaWQobmV3VGV4dCk7Ci0JCX0KLQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTFmNzA3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBjcmVhdGUgYSBjaGlsZCBtZXRob2QgZWxlbWVudCBhbmQgYWRkIGl0IHRvIHRoZQotICogY29udGFpbmluZyBtZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQgZXh0ZW5kcyBDcmVhdGVDaGlsZENvbW1hbmQgewotCi0JcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIElWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgY2hpbGQsIGludCBpbmRleCwKLQkJCUNvbGxlY3Rpb24gc2VsZWN0aW9uLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNoaWxkLCBpbmRleCwgc2VsZWN0aW9uLCBoZWxwZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdXBlckV4ZWN1dGUoKSB7Ci0JCXN1cGVyLmV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlpZih2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJdmFsaWRhdG9yID0gbmV3IEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yKCkgewotCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCQlpZiAobmV3VGV4dC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJU3RyaW5nIGVsZW1lbnRUZXh0ID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZWxlbWVudF90ZXh0OyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZywgZWxlbWVudFRleHQpOyAKLQkJCQkJfQotCQkJCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIG93bmVyLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJTmFtZWRFbGVtZW50IGNoaWxkID0gKE5hbWVkRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoY2hpbGQuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmV3VGV4dCkpIHsKLQkJCQkJCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQkJCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLCBuZXdUZXh0KTsgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLm5ld0VsZW1lbnRfdGV4dCwgaGVscGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbikpOyAKLQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXRWYWxpZGF0b3IoKTsKLS8vCQlmaW5hbCBTdHJpbmcgbmFtZSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5yZXF1ZXN0TmFtZShjaGlsZCwKLS8vCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIHRpdGxlLCB2YWxpZGF0b3IpOwotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCVVzZXJJbnB1dCB1c2VySW5wdXQgPSBuZXcgVXNlcklucHV0KExpYnJhcnlFZGl0UmVzb3VyY2VzLm5hbWVMYWJlbF90ZXh0LCBVc2VySW5wdXQuVEVYVCwgCi0JCQkJZmFsc2UsIG51bGwsIG51bGwsIHZhbGlkYXRvciwgdGhpcyk7CQkKLQkJaWYodWlIYW5kbGVyLnJlcXVlc3RJbnB1dCh0aXRsZSwgIlNwZWNpZnkgYSB2YWxpZCBuYW1lLiIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodXNlcklucHV0KSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSB1c2VySW5wdXQuZ2V0SW5wdXQoKTsKLQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkoKE5hbWVkRWxlbWVudCkgY2hpbGQpLnNldE5hbWUobmFtZSk7Ci0JCQkJc3VwZXJFeGVjdXRlKCk7Ci0JCQkJZXhlY3V0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZCNnZXRBZmZlY3RlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYgKGV4ZWN1dGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qob3duZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCWlmIChleGVjdXRlZCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFJlc3VsdCgpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldE93bmVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoKSB7Ci0JCXJldHVybiBjaGlsZDsKLQl9Ci0JCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5DYXRlZ29yeUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01vdmVJbkNhdGVnb3J5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTY1MGEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01vdmVJbkNhdGVnb3J5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1pc2M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcmVvcmRlciBhIG1ldGhvZCBlbGVtZW50IHdpdGhpbiBhIGNhdGVnb3J5LgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vdmVJbkNhdGVnb3J5Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeTsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQlwcml2YXRlIExpc3QgZWxlbWVudHNMaXN0OwotCQotCXByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3Qgb3JkZXJMaXN0OwotCi0JcHJpdmF0ZSBTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGg7Ci0KLQlwcml2YXRlIENvbnRlbnRDYXRlZ29yeSB1c2VkQ2F0ZWdvcnkgPSBudWxsOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IFVQID0gMTsKLQotCXByaXZhdGUgc3RhdGljIGludCBEb3duID0gMDsKLQotCXByaXZhdGUgaW50IGRpcmVjdGlvbiA9IC0xOwotCi0JcHJpdmF0ZSBib29sZWFuIG1vdmVkOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgTW92ZUluQ2F0ZWdvcnlDb21tYW5kKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBNb3ZlSW5DYXRlZ29yeUNvbW1hbmQoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5LCBMaXN0IGVsZW1lbnRzTGlzdCwKLQkJCUNvbnRlbnRFbGVtZW50T3JkZXJMaXN0IG9yZGVyTGlzdCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGgsCi0JCQlpbnQgZGlyZWN0aW9uKSB7Ci0JCXRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5lbGVtZW50c0xpc3QgPSBlbGVtZW50c0xpc3Q7Ci0JCXRoaXMub3JkZXJMaXN0ID0gb3JkZXJMaXN0OwotCQl0aGlzLmNhdGVnb3J5UGtnUGF0aCA9IGNhdGVnb3J5UGtnUGF0aDsKLQkJdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgTW92ZUluQ2F0ZWdvcnlDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIE1vdmVJbkNhdGVnb3J5Q29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQltb2RpZmllZFJlc291cmNlcy5hZGQoY2F0ZWdvcnkuZVJlc291cmNlKCkpOwotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlNZXRob2RQbHVnaW4gY2F0ZWdvcnlQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYXRlZ29yeSk7Ci0JCU1ldGhvZFBsdWdpbiBlbGVtZW50UGx1Z2luID0gVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRzTGlzdC5nZXQoMCkpOwotCi0JCWlmIChjYXRlZ29yeVBsdWdpbiAhPSBlbGVtZW50UGx1Z2luCi0JCQkJJiYgTWlzYy5pc0Jhc2VPZihjYXRlZ29yeVBsdWdpbiwgZWxlbWVudFBsdWdpbikpIHsKLQkJCXVzZWRDYXRlZ29yeSA9IFRuZ1V0aWwuZmluZENvbnRyaWJ1dG9yKFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKAotCQkJCQllbGVtZW50UGx1Z2luLCBjYXRlZ29yeVBrZ1BhdGgpLCBjYXRlZ29yeSk7Ci0JCX0gZWxzZSB7Ci0JCQl1c2VkQ2F0ZWdvcnkgPSBjYXRlZ29yeTsKLQkJfQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAodXNlZENhdGVnb3J5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50c0xpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJaW50IGluZGV4ID0gb3JkZXJMaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQlpZiAoZGlyZWN0aW9uID09IFVQKSB7Ci0JCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCQlvcmRlckxpc3QubW92ZShpbmRleCAtIDEsIG9iamVjdCk7Ci0JCQkJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRG93bikgewotCQkJCQlpZiAoaW5kZXggPCBvcmRlckxpc3Quc2l6ZSgpKQotCQkJCQkJb3JkZXJMaXN0Lm1vdmUoaW5kZXggKyBlbGVtZW50c0xpc3Quc2l6ZSgpLCBvYmplY3QpOwotCQkJCX0KLQkJCQltb3ZlZCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCXVzZWRDYXRlZ29yeS5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQkJfQotCQl9Ci0JCW9yZGVyTGlzdC5hcHBseSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChtb3ZlZCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlpbnQgaW5kZXggPSBvcmRlckxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCQlpZiAoZGlyZWN0aW9uID09IFVQKSB7Ci0JCQkJCWlmIChpbmRleCA8IG9yZGVyTGlzdC5zaXplKCkpCi0JCQkJCQlvcmRlckxpc3QubW92ZShpbmRleCArIGVsZW1lbnRzTGlzdC5zaXplKCksIG9iamVjdCk7Ci0JCQkJCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERvd24pIHsKLQkJCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCQkJb3JkZXJMaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCQkJCQl9Ci0JCQkJCW1vdmVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQl1c2VkQ2F0ZWdvcnkuZVNldChmZWF0dXJlLCBvYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJCW9yZGVyTGlzdC5hcHBseSgpOwotCQkJbW92ZWQgPSBmYWxzZTsKLQkJfQotCQlpZiAoVG5nVXRpbC5pc0VtcHR5KHVzZWRDYXRlZ29yeSkpIHsKLQkJCUVjb3JlVXRpbC5yZW1vdmUodXNlZENhdGVnb3J5KTsKLQkJCXVzZWRDYXRlZ29yeSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHVzZWRDYXRlZ29yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjlhODQ0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBtb3ZlIGEgdmlldyBpbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gKiBAYXV0aG9yIFhpYW5nIERvbmcgSHUKLSAqIEBzaW5jZSAxLjIKLSAqIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MzgyNwotICovCi1wdWJsaWMgY2xhc3MgTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JcHJpdmF0ZSBMaXN0IGVsZW1lbnRzTGlzdDsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgVVAgPSAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IERvd24gPSAwOwotCi0JcHJpdmF0ZSBpbnQgZGlyZWN0aW9uID0gLTE7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbW92ZWQ7Ci0JCi0JcHVibGljIE1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBMaXN0IGVsZW1lbnRzTGlzdCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgZGlyZWN0aW9uKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLmVsZW1lbnRzTGlzdCA9IGVsZW1lbnRzTGlzdDsKLQkJdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlyZWRvKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50c0xpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJRUxpc3QgbGlzdCA9IChFTGlzdCkgY29uZmlnLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJaWYgKGRpcmVjdGlvbiA9PSBVUCkgewotCQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQkJbGlzdC5tb3ZlKGluZGV4IC0gMSwgb2JqZWN0KTsKLQkJCQl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBEb3duKSB7Ci0JCQkJCWlmIChpbmRleCA8IGxpc3Quc2l6ZSgpKQotCQkJCQkJbGlzdC5tb3ZlKGluZGV4ICsgZWxlbWVudHNMaXN0LnNpemUoKSwgb2JqZWN0KTsKLQkJCQl9Ci0JCQkJbW92ZWQgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQljb25maWcuZVNldChmZWF0dXJlLCBudWxsKTsKLQkJCX0KLQkJfQotCQlpZiAoY29uZmlnLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjb25maWcuZVJlc291cmNlKCkpOwotCQl9Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKG1vdmVkKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHNMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCUVMaXN0IGxpc3QgPSAoRUxpc3QpIGNvbmZpZy5lR2V0KGZlYXR1cmUpOwotCQkJCQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQkJaWYgKGRpcmVjdGlvbiA9PSBVUCkgewotCQkJCQkJaWYgKGluZGV4IDwgbGlzdC5zaXplKCkpCi0JCQkJCQkJbGlzdC5tb3ZlKGluZGV4ICsgZWxlbWVudHNMaXN0LnNpemUoKSwgb2JqZWN0KTsKLQkJCQkJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRG93bikgewotCQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCQlsaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCQkJCQl9Ci0JCQkJCW1vdmVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQljb25maWcuZVNldChmZWF0dXJlLCBvYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJCW1vdmVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjb25maWcpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWIwODRlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU2VjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcmVvcmRlciBhIHNlY3Rpb24gd2l0aGluIGEgc2VjdGlvbiBsaXN0LgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBTZWN0aW9uTGlzdCBzZWN0aW9uTGlzdDsKLQotCXByaXZhdGUgTGlzdCBlbGVtZW50c0xpc3Q7Ci0KLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IHVzZWRDb250ZW50RWxlbWVudCA9IG51bGw7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgVVAgPSAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IERvd24gPSAwOwotCi0JcHJpdmF0ZSBpbnQgZGlyZWN0aW9uID0gLTE7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbW92ZWQ7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZChDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCwKLQkJCUxpc3QgZWxlbWVudHNMaXN0LCBTZWN0aW9uTGlzdCBzZWN0aW9uTGlzdCwgaW50IGRpcmVjdGlvbikgewotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCXRoaXMuc2VjdGlvbkxpc3QgPSBzZWN0aW9uTGlzdDsKLQkJdGhpcy5lbGVtZW50c0xpc3QgPSBlbGVtZW50c0xpc3Q7Ci0JCXRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCi0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29udGVudEVsZW1lbnQuZVJlc291cmNlKCkpOwotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlNZXRob2RQbHVnaW4gdGFza1BsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNvbnRlbnRFbGVtZW50KTsKLQkJTWV0aG9kUGx1Z2luIGVsZW1lbnRQbHVnaW4gPSBVbWFVdGlsCi0JCQkJLmdldE1ldGhvZFBsdWdpbigoTWV0aG9kRWxlbWVudCkgZWxlbWVudHNMaXN0LmdldCgwKSk7Ci0KLQkJaWYgKHRhc2tQbHVnaW4gIT0gZWxlbWVudFBsdWdpbgotCQkJCSYmIE1pc2MuaXNCYXNlT2YodGFza1BsdWdpbiwgZWxlbWVudFBsdWdpbikpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0Q29udHJpYnV0b3JzKGNvbnRlbnRFbGVtZW50KTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmICh2ZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50Ci0JCQkJCQkmJiBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbih2ZSkgPT0gZWxlbWVudFBsdWdpbikgewotCQkJCQl1c2VkQ29udGVudEVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIHZlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHVzZWRDb250ZW50RWxlbWVudCA9PSBudWxsKSB7Ci0JCQl1c2VkQ29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmICh1c2VkQ29udGVudEVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotCQkJaW50IGluZGV4ID0gc2VjdGlvbkxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJaWYgKGRpcmVjdGlvbiA9PSBVUCkgewotCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCXNlY3Rpb25MaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCQkJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRG93bikgewotCQkJCWlmIChpbmRleCA8IHNlY3Rpb25MaXN0LnNpemUoKSkKLQkJCQkJc2VjdGlvbkxpc3QubW92ZShpbmRleCArIGVsZW1lbnRzTGlzdC5zaXplKCksIG9iamVjdCk7Ci0JCQl9Ci0JCQltb3ZlZCA9IHRydWU7Ci0JCX0KLQkJc2VjdGlvbkxpc3QuYXBwbHkoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChtb3ZlZCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLQkJCQlpbnQgaW5kZXggPSBzZWN0aW9uTGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJaWYgKGRpcmVjdGlvbiA9PSBVUCkgewotCQkJCQlpZiAoaW5kZXggPCBzZWN0aW9uTGlzdC5zaXplKCkpCi0JCQkJCQlzZWN0aW9uTGlzdC5tb3ZlKGluZGV4ICsgZWxlbWVudHNMaXN0LnNpemUoKSwgb2JqZWN0KTsKLQkJCQl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBEb3duKSB7Ci0JCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCQlzZWN0aW9uTGlzdC5tb3ZlKGluZGV4IC0gMSwgb2JqZWN0KTsKLQkJCQl9Ci0JCQkJbW92ZWQgPSB0cnVlOwotCQkJfQotCQkJc2VjdGlvbkxpc3QuYXBwbHkoKTsKLQkJCW1vdmVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHVzZWRDb250ZW50RWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZWZlcmVuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNGY4ZDhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2UgewotCQotCUVPYmplY3Qgb3duZXI7Ci0KLQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCU9iamVjdCB2YWx1ZTsKLQotCWludCBpbmRleCA9IC0xOwotCi0JcHVibGljIFJlZmVyZW5jZShFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJTGlzdCBsaXN0ID0gKExpc3QpIG93bmVyLmVHZXQoZmVhdHVyZSk7Ci0JCQlpbmRleCA9IGxpc3QuaW5kZXhPZih2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlSZWZlcmVuY2UoRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JfQotCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21DYXRlZ29yeUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21DYXRlZ29yeUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTE0Yzg4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZW1vdmVGcm9tQ2F0ZWdvcnlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcmVtb3ZlIGEgbWV0aG9kIGVsZW1lbnQgZnJvbSBhIGNhdGVnb3J5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlRnJvbUNhdGVnb3J5Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeTsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCXByaXZhdGUgU3RyaW5nW10gY29udGVudFBrZ1BhdGg7Ci0KLQlwcml2YXRlIENvbnRlbnRDYXRlZ29yeSB1c2VkQ2F0ZWdvcnk7Ci0KLQlwcml2YXRlIGludCByZW1vdmVkRWxlbWVudEluZGV4ID0gLTE7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlZCA9IGZhbHNlOwotCi0JcHVibGljIFJlbW92ZUZyb21DYXRlZ29yeUNvbW1hbmQoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5LAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCVN0cmluZ1tdIGNvbnRlbnRQa2dQYXRoKSB7Ci0JCXRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5jb250ZW50UGtnUGF0aCA9IGNvbnRlbnRQa2dQYXRoOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAodXNlZENhdGVnb3J5ICE9IG51bGwgJiYgdXNlZENhdGVnb3J5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHVzZWRDYXRlZ29yeS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlNZXRob2RQbHVnaW4gY2F0ZWdvcnlQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYXRlZ29yeSk7Ci0JCU1ldGhvZFBsdWdpbiBlbGVtZW50UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0KLQkJaWYgKGNhdGVnb3J5UGx1Z2luICE9IGVsZW1lbnRQbHVnaW4KLQkJCQkmJiBNaXNjLmlzQmFzZU9mKGNhdGVnb3J5UGx1Z2luLCBlbGVtZW50UGx1Z2luKSkgewotCQkJdXNlZENhdGVnb3J5ID0gVG5nVXRpbC5maW5kQ29udHJpYnV0b3IoVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoCi0JCQkJCWVsZW1lbnRQbHVnaW4sIGNvbnRlbnRQa2dQYXRoKSwgY2F0ZWdvcnkpOwotCQl9IGVsc2UgewotCQkJdXNlZENhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKHVzZWRDYXRlZ29yeSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgdXNlZENhdGVnb3J5LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIEVMaXN0KSB7Ci0JCQkJcmVtb3ZlZEVsZW1lbnRJbmRleCA9ICgoRUxpc3QpIGNvbGxlY3Rpb24pLmluZGV4T2YoZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZW1vdmVkID0gY29sbGVjdGlvbi5yZW1vdmUoZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl1c2VkQ2F0ZWdvcnkuZVNldChmZWF0dXJlLCBudWxsKTsKLQkJCXJlbW92ZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChyZW1vdmVkKSB7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSB1c2VkQ2F0ZWdvcnkuZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIEVMaXN0ICYmIHJlbW92ZWRFbGVtZW50SW5kZXggIT0gLTEpIHsKLQkJCQkJKChFTGlzdCkgY29sbGVjdGlvbikuYWRkKHJlbW92ZWRFbGVtZW50SW5kZXgsIGVsZW1lbnQpOwotCQkJCX0gZWxzZQotCQkJCQljb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXNlZENhdGVnb3J5LmVTZXQoZmVhdHVyZSwgZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZW1vdmVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCWlmIChyZW1vdmVkKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21TZWN0aW9uTGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlRnJvbVNlY3Rpb25MaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEyNGFkZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlRnJvbVNlY3Rpb25MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU2VjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcmVtb3ZlIGEgc2VjdGlvbiBmcm9tIGEgc2VjdGlvbiBsaXN0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlRnJvbVNlY3Rpb25MaXN0IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIFNlY3Rpb25MaXN0IHNlY3Rpb25MaXN0OwotCi0JcHJpdmF0ZSBTZWN0aW9uIHNlY3Rpb247Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlZDsKLQotCXByaXZhdGUgaW50IHJlbW92ZWRPYmplY3RJbmRleCA9IC0xOwotCi0JcHVibGljIFJlbW92ZUZyb21TZWN0aW9uTGlzdChDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCwKLQkJCVNlY3Rpb24gc2VjdGlvbiwgU2VjdGlvbkxpc3Qgc2VjdGlvbkxpc3QpIHsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQl0aGlzLnNlY3Rpb25MaXN0ID0gc2VjdGlvbkxpc3Q7Ci0JCXRoaXMuc2VjdGlvbiA9IHNlY3Rpb247Ci0KLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlyZW1vdmVkT2JqZWN0SW5kZXggPSBzZWN0aW9uTGlzdC5pbmRleE9mKHNlY3Rpb24pOwotCQlzZWN0aW9uTGlzdC5yZW1vdmUoc2VjdGlvbik7Ci0JCXJlbW92ZWQgPSB0cnVlOwotCQlzZWN0aW9uTGlzdC5hcHBseSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChyZW1vdmVkKSB7Ci0JCQlpZiAocmVtb3ZlZE9iamVjdEluZGV4ICE9IC0xKSB7Ci0JCQkJc2VjdGlvbkxpc3QuYWRkKHJlbW92ZWRPYmplY3RJbmRleCwgc2VjdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCXNlY3Rpb25MaXN0LmFkZChzZWN0aW9uKTsKLQkJCX0KLQkJCXNlY3Rpb25MaXN0LmFwcGx5KCk7Ci0JCQlyZW1vdmVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZVJlZmVyZW5jZXNDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZW1vdmVSZWZlcmVuY2VzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyN2ViZTU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZVJlZmVyZW5jZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcmVtb3ZlIG1ldGhvZCBlbGVtZW50IHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVSZWZlcmVuY2VzQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBwbHVnaW47Ci0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBiYXNlOwotCi0JcHJpdmF0ZSBNYXAgZmVhdHVyZVZhbHVlUGFpclRvT2JqZWN0TWFwOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIGNvbW1hbmQgdG8gcmVtb3ZlIGFsbCByZWZlcmVuY2VzIGluIDxjb2RlPnBsdWdpbjwvY29kZT4KLQkgKiB0aGF0IGFyZSBlbGVtZW50cyBvZiA8Y29kZT5iYXNlPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcGFyYW0gYmFzZQotCSAqLwotCXB1YmxpYyBSZW1vdmVSZWZlcmVuY2VzQ29tbWFuZChNZXRob2RQbHVnaW4gcGx1Z2luLCBNZXRob2RQbHVnaW4gYmFzZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQkJdGhpcy5iYXNlID0gYmFzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQotCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yKSBwbHVnaW4KLQkJCQkuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGZlYXR1cmVJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IHJlZiA9IChFT2JqZWN0KSBmZWF0dXJlSXRlcmF0b3IubmV4dCgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBmZWF0dXJlSXRlcmF0b3IuZmVhdHVyZSgpOwotCQkJaWYgKGYgIT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCkKLQkJCQkJJiYgVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocmVmKSA9PSBiYXNlKSB7Ci0JCQkJZmVhdHVyZVZhbHVlUGFpclRvT2JqZWN0TWFwLnB1dChuZXcgRmVhdHVyZVZhbHVlUGFpcihmLCByZWYpLAotCQkJCQkJcGx1Z2luKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBsdWdpbi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0KLQkJCS8vIGlnbm9yZSBQcm9jZXNzRWxlbWVudCBiL2MgaXQgY2FuIHJlZmVyZW5jZXMgYW55dGhpbmcKLQkJCS8vCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yIGZlYXR1cmVJdGVyYXRvciA9IChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IpIGVsZW1lbnQKLQkJCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBmZWF0dXJlSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgcmVmID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0KLQkJCQlpZiAoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocmVmKSA9PSBiYXNlKSB7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gZmVhdHVyZUl0ZXJhdG9yLmZlYXR1cmUoKTsKLQkJCQkJZmVhdHVyZVZhbHVlUGFpclRvT2JqZWN0TWFwLnB1dCgKLQkJCQkJCQluZXcgRmVhdHVyZVZhbHVlUGFpcihmLCByZWYpLCBlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlVmFsdWVQYWlyVG9PYmplY3RNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJRmVhdHVyZVZhbHVlUGFpciBmdlBhaXIgPSAoRmVhdHVyZVZhbHVlUGFpcikgZW50cnkuZ2V0S2V5KCk7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWlmIChmdlBhaXIuZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCSgoQ29sbGVjdGlvbikgZWxlbWVudC5lR2V0KGZ2UGFpci5mZWF0dXJlKSkKLQkJCQkJCS5yZW1vdmUoZnZQYWlyLnZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZWxlbWVudC5lU2V0KGZ2UGFpci5mZWF0dXJlLCBudWxsKTsKLQkJCX0KLQkJCWlmIChlbGVtZW50LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZVZhbHVlUGFpclRvT2JqZWN0TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCUZlYXR1cmVWYWx1ZVBhaXIgZnZQYWlyID0gKEZlYXR1cmVWYWx1ZVBhaXIpIGVudHJ5LmdldEtleSgpOwotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAoZnZQYWlyLmZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIGVsZW1lbnQuZUdldChmdlBhaXIuZmVhdHVyZSkpLmFkZChmdlBhaXIudmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50LmVTZXQoZnZQYWlyLmZlYXR1cmUsIGZ2UGFpci52YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGZWF0dXJlVmFsdWVQYWlyIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQkJT2JqZWN0IHZhbHVlOwotCi0JCUZlYXR1cmVWYWx1ZVBhaXIoRVN0cnVjdHVyYWxGZWF0dXJlIGYsIE9iamVjdCB2KSB7Ci0JCQlmZWF0dXJlID0gZjsKLQkJCXZhbHVlID0gdjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1Jlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1Jlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDRkYTNlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLQotLyoqCi0gKiBBIGNvbXBvdW5kIGNvbW1hbmQgdGhhdCBpcyByZXNvdXJjZSBhd2FyZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQgZXh0ZW5kcyBDb21wb3VuZENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKExpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIoY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKFN0cmluZyBsYWJlbCwgTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihsYWJlbCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQkJTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24sIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwsCi0JCQlTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4LCBMaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwsCi0JCQlMaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLAotCQkJU3RyaW5nIGRlc2NyaXB0aW9uLCBMaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCwgZGVzY3JpcHRpb24sIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNtZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbCgoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY21kKQotCQkJCQkJLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1Jlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMzlkMzE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1Jlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kIGV4dGVuZHMKLQkJUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCBpbXBsZW1lbnRzIElSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gb3B0aW1pemUKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsIGludCBpbmRleCwgYm9vbGVhbiBvcHRpbWl6ZSkgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgb3B0aW1pemUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBpbmRleAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwgaW50IGluZGV4KSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGluZGV4KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmKG93bmVyIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEVPYmplY3Qpb3duZXIpLmVSZXNvdXJjZSgpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZC5nZXRDb21tYW5kTGlzdCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNtZCA9IGl0ZXIubmV4dCgpOwotCQkJd2hpbGUoIShjbWQgaW5zdGFuY2VvZiBJUmVzb3VyY2VBd2FyZUNvbW1hbmQpICYmIGNtZCBpbnN0YW5jZW9mIENvbW1hbmRXcmFwcGVyKSB7Ci0JCQkJY21kID0gKChDb21tYW5kV3JhcHBlciljbWQpLmdldENvbW1hbmQoKTsKLQkJCX0KLQkJCWlmIChjbWQgaW5zdGFuY2VvZiBJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwoKChJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIGNtZCkKLQkJCQkJCS5nZXRNb2RpZmllZFJlc291cmNlcygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9TYXZlU3RhdHVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9TYXZlU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3ZjUwOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvU2F2ZVN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotLyoqCi0gKiBUaGUgc3RhdHVzIG9mIGEgc2F2ZSBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlU3RhdHVzIGV4dGVuZHMgU3RhdHVzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNBVkVfRVJST1IgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9MTEJBQ0tfRVJST1IgPSAyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkgKiBAcGFyYW0gcGx1Z2luSWQKLQkgKiBAcGFyYW0gY29kZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTYXZlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIHBsdWdpbklkLCBpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UsCi0JCQlUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXN1cGVyKHNldmVyaXR5LCBwbHVnaW5JZCwgY29kZSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1NldE9wcG9zaXRlRmVhdHVyZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1NldE9wcG9zaXRlRmVhdHVyZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzY0YzY4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9TZXRPcHBvc2l0ZUZlYXR1cmVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IGFuIG9wcG9zaXRlIGZlYXR1cmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRPcHBvc2l0ZUZlYXR1cmVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JcHJpdmF0ZSBPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlOwotCi0JcHJpdmF0ZSBFT2JqZWN0IHZhbHVlOwotCi0JcHJpdmF0ZSBFT2JqZWN0IG9sZFZhbHVlOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2V0T3Bwb3NpdGVGZWF0dXJlQ29tbWFuZChNZXRob2RFbGVtZW50IGUsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlLCBFT2JqZWN0IHZhbHVlKSB7Ci0JCXRoaXMuZWxlbWVudCA9IGU7Ci0JCXRoaXMub3Bwb3NpdGVGZWF0dXJlID0gb3Bwb3NpdGVGZWF0dXJlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3ByZXBhcmUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnlPcHBvc2l0ZSgKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIHZhbHVlLCBvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpLAotCQkJCQllbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRWYWx1ZSA9IChFT2JqZWN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50KQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpOwotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJcmVkbygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmIChvbGRWYWx1ZSAhPSBudWxsICYmIHZhbHVlID09IG51bGwpIHsKLQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpLmlzTWFueSgpKSB7Ci0JCQkJKChDb2xsZWN0aW9uKSBvbGRWYWx1ZS5lR2V0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCkpKQotCQkJCQkJLnJlbW92ZShlbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJb2xkVmFsdWUuZVNldChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpLCBudWxsKTsKLQkJCX0KLQkJCWlmIChvbGRWYWx1ZS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKG9sZFZhbHVlLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCi0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKS5pc01hbnkoKSkgewotCQkJCSgoQ29sbGVjdGlvbikgdmFsdWUuZUdldChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpKSkKLQkJCQkJCS5hZGQoZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCXZhbHVlLmVTZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSwgZWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAodmFsdWUuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZCh2YWx1ZS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpLmlzTWFueSgpKSB7Ci0JCQkJKChDb2xsZWN0aW9uKSB2YWx1ZS5lR2V0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCkpKQotCQkJCQkJLnJlbW92ZShlbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmFsdWUuZVNldChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpLCBudWxsKTsKLQkJCX0KLQkJfQotCi0JCWlmIChvbGRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKS5pc01hbnkoKSkgewotCQkJCSgoQ29sbGVjdGlvbikgb2xkVmFsdWUuZUdldChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpKSkKLQkJCQkJCS5hZGQoZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCW9sZFZhbHVlLmVTZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSwgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1VzZXJJbnB1dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvVXNlcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkZjExMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvVXNlcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIENsYXNzIHRoYXQga2VlcHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnB1dCByZXF1ZXN0IGFuZCByZWZlcmVuY2UgdG8gdGhlCi0gKiBpbnB1dCB1c2VyIHNwZWNpZmllZCBvciBzZWxlY3RlZAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXNlcklucHV0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTiA9IDE7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgaW50IHR5cGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbXVsdGlwbGU7Ci0KLQlwcml2YXRlIExpc3QgY2hvaWNlczsKLQotCXByaXZhdGUgT2JqZWN0IGlucHV0OwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBPYmplY3QgY29udGV4dDsKLQotCXByaXZhdGUgSVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQlwdWJsaWMgVXNlcklucHV0KFN0cmluZyBsYWJlbCwgaW50IHR5cGUsIGJvb2xlYW4gbXVsdGlwbGUsIExpc3QgY2hvaWNlcywKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIE9iamVjdCBjb250ZXh0KSB7Ci0JCXRoaXMobGFiZWwsIHR5cGUsIG11bHRpcGxlLCBjaG9pY2VzLCBsYWJlbFByb3ZpZGVyLCBudWxsLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBtdWx0aXBsZQotCSAqIEBwYXJhbSBjaG9pY2VzCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIKLQkgKiAgICAgICAgICAgIHRoZSBsYWJlbCBwcm92aWRlciB0byByZXByZXNlbnQgdGhlIGVsZW1lbnQgaW4gdGhlCi0JICogICAgICAgICAgICA8Y29kZT5jaG9pY2VzPC9jb2RlPiBsaXN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICAgICAgICAgICA8Y29kZT5jaG9pY2VzPC9jb2RlPiBsaXN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqICAgICAgICAgICAgdGhlIHZhbGlkYXRvciB0byB2YWxpZGF0ZSB0aGUgaW5wdXQKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgb2YgdGhlIHVzZXIgaW5wdXQgdGhhdCBpcyBjb21tYW5kLXNwZWNpZmljIGFuZCBjYW4KLQkgKiAgICAgICAgICAgIGNvbnRhaW4gYWRkaW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIgaW5wdXQuCi0JICovCi0JcHVibGljIFVzZXJJbnB1dChTdHJpbmcgbGFiZWwsIGludCB0eXBlLCBib29sZWFuIG11bHRpcGxlLCBMaXN0IGNob2ljZXMsCi0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IGNvbnRleHQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLm11bHRpcGxlID0gbXVsdGlwbGU7Ci0JCXRoaXMuY2hvaWNlcyA9IGNob2ljZXM7Ci0JCXRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKSB7Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENob2ljZXMoKSB7Ci0JCXJldHVybiBjaG9pY2VzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpcGxlKCkgewotCQlyZXR1cm4gbXVsdGlwbGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYWJlbCBwcm92aWRlcgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxhYmVsIHByb3ZpZGVyCi0JICovCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBsYWJlbFByb3ZpZGVyOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB2YWxpZGF0b3IKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGV4dCBvZiB0aGlzIHVzZXIgaW5wdXQKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250ZXh0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY1ZDdjZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgY29tbWFuZHMgZm9yIGVkaXRpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzYjJiOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYW4gYWN0aXZpdHkgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCWlmIChwcm9jZXNzID09IG51bGwpIHsKLQkJCU9iamVjdCB0b3AgPSBnZXRUb3BJdGVtKCk7Ci0JCQlpZiAodG9wIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCXByb2Nlc3MgPSAoUHJvY2VzcykgdG9wOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBjaGlsZCkgewotCQlyZXR1cm4gY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCSYmICFUbmdVdGlsLmlzQ29udHJpYnV0b3JPclJlcGxhY2VyKChWYXJpYWJpbGl0eUVsZW1lbnQpIGNoaWxkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQkvLyByZW1vdmUgYW55IHN1cHByZXNzZWQgY2hpbGQKLQkJLy8KLQkJUHJvY2VzcyBwcm9jID0gZ2V0UHJvY2VzcygpOwotCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkvLyBnZXRQcm9jZXNzKCkgbWlnaHQgcmV0dXJuIG51bGwgaWYgZ2V0Q2hpbGRyZW4oT2JqZWN0KSBpcyBjYWxsZWQKLQkJCS8vIG9uIGJhc2UgYWN0aXZpdHkgdG8KLQkJCS8vIHJldHJpZXZlIGl0cyBjaGlsZHJlbgotCQkJLy8KLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYyk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoc3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKGNoaWxkKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykgPT0gVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQUFJFU1NFRCkgewotCQkJLy8gcmVmcmVzaCBwYXJlbnQgY29udGVudAotCQkJLy8KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQlnZXRQYXJlbnQobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0NhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0NhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjk3ZmQ2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGJhc2UgaXRlbSBwcm92aWRlciBhZGFwdGVyIGNsYXNzIGZvciB0aGUgc3RhbmRhcmQgY2F0ZWdvcmllcyBpbgotICogYSBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJQ29uZmlndXJhYmxlLCBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjaGlsZHJlbjsKLQotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNhdGVnb3J5UGtnUGF0aDsKLQotCXByb3RlY3RlZCBJRmlsdGVyIGZpbHRlcjsKLQotCXByaXZhdGUgT2JqZWN0IGltYWdlOwotCi0JcHJvdGVjdGVkIElGaWx0ZXIgdW5jYXRlZ29yaXplZEZpbHRlcjsKLQotCXByb3RlY3RlZCBTdHJpbmcgdW5jYXRlZ29yaXplZExhYmVsOwotCi0JcHJvdGVjdGVkIElGaWx0ZXIgY2F0ZWdvcml6ZWRGaWx0ZXI7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHVuY2F0ZWdvcml6ZWRJbWFnZTsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCXByaXZhdGUgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciB1bmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGltYWdlLAotCQkJU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJLy8gbWV0aG9kQ29uZmlnLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JCWxhYmVsID0gbmFtZTsKLQkJdGhpcy5jYXRlZ29yeVBrZ1BhdGggPSBjYXRlZ29yeVBrZ1BhdGg7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciBjcmVhdGVVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKCkgewotCQlpZiAodW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl1bmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyID0gbmV3IFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsIHVuY2F0ZWdvcml6ZWRGaWx0ZXIsCi0JCQkJCXVuY2F0ZWdvcml6ZWRMYWJlbCwgdW5jYXRlZ29yaXplZEltYWdlKTsKLQkJfQotCQlyZXR1cm4gdW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfSBlbHNlIHsKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCX0KLQkJLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgdGFyZ2V0OwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCWNhdGVnb3J5UGtnUGF0aCk7Ci0JCQlpZiAocGtnICE9IG51bGwgLyoKLQkJCQkJCQkgKiAmJgotCQkJCQkJCSAqIG1ldGhvZENvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY29udGFpbnMocGtnKQotCQkJCQkJCSAqLykgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUNvbnRlbnRDYXRlZ29yeSBlbGVtZW50ID0gKENvbnRlbnRDYXRlZ29yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoY2F0ZWdvcml6ZWRGaWx0ZXIuYWNjZXB0KGVsZW1lbnQpCi0JCQkJCQkJJiYgKGZpbHRlciAhPSBudWxsID8gZmlsdGVyLmFjY2VwdChlbGVtZW50KSA6IHRydWUpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXQgcGFyZW50Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoCi0JCQkJCQkJaXRlci5uZXh0KCksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkvLyBPYmplY3QgYWRhcHRlciA9Ci0JCQkvLyAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikuYWRhcHQoaXRlci5uZXh0KCksCi0JCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCX0KLQkJCS8vIFRoaXMgaXMgbmVlZCBmb3JjaW5nIHRvIHNldCB0aGUgSUNvbmZpZ3VyYXRvciB0byBDaGlsZHJlbnMKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkgewotCQkJCSgoSUNvbmZpZ3VyYWJsZSkgYWRhcHRlcikuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodW5jYXRlZ29yaXplZEZpbHRlciAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5hZGQoY3JlYXRlVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcigpKTsKLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQkvLyByZXR1cm4gc3VwZXIuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyh0YXJnZXQsIGVkaXRpbmdEb21haW4sIHNpYmxpbmcpOwotCQlyZXR1cm4gc3VwZXIuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhtZXRob2RDb25maWcsIGVkaXRpbmdEb21haW4sCi0JCQkJc2libGluZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcmV0dXJuIHBhcmVudDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlyZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yaXplZEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQljYXRlZ29yaXplZEZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmNhdGVnb3JpemVkRmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXVuY2F0ZWdvcml6ZWRGaWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5jYXRlZ29yaXplZExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl1bmNhdGVnb3JpemVkTGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmNhdGVnb3JpemVkSW1hZ2UoT2JqZWN0IGltZykgewotCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBpbWc7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJdW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0NhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYjdhNmUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0NhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ2FwYWJpbGl0eSBQYXR0ZXJucyIgYW5kICJEZWxpdmVyeQotICogUHJvY2Vzc2VzIiBmb2xkZXJzIGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJQ29uZmlndXJhYmxlLCBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQlMaXN0IGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIHBrZ1BhdGg7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBPYmplY3QgaW1hZ2U7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgU3RyaW5nIG5hbWUsIE9iamVjdCBpbWFnZSwKLQkJCVN0cmluZ1tdIHBrZ1BhdGgpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQkJbGFiZWwgPSBuYW1lOwotCQl0aGlzLnBrZ1BhdGggPSBwa2dQYXRoOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZHJlbi5jbGVhcigpOwotCQl9Ci0JCUFycmF5TGlzdCBwcm9jUGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwgcGtnUGF0aCk7Ci0JCQlpZiAocGtnICE9IG51bGwKLQkJCQkJJiYgbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhwa2cpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5jb2xsZWN0Q2hpbGRyZW4oY2hpbGRyZW4sCi0JCQkJCQkJZWxlbWVudCwgZmlsdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIXByb2NQa2dzLmlzRW1wdHkoKSkgewotCQkJY2hpbGRyZW4uYWRkQWxsKDAsIHByb2NQa2dzKTsKLQotCQkJLy8gVE9ETzogc29ydCBhbHBoYWJldGljYWxseSwgcHJvY2VzcyBwYWNrYWdlcyBiZWZvcmUgcHJvY2Vzc2VzCi0JCX0KLQotCQkvLyBzZXQgcGFyZW50Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlQcm9jZXNzVXRpbC5zZXRQYXJlbnQoY2hpbGQsIG9iamVjdCwgYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBzdXBlci5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG1ldGhvZENvbmZpZywgZWRpdGluZ0RvbWFpbiwKLQkJCQlzaWJsaW5nKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50OwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCXJldHVybiBsYWJlbDsKLQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5NmFmMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJDdXN0b20gQ2F0ZWdvcmllcyIgZm9sZGVyIGluIHRoZQotICogQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGltYWdlLAotCQkJU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsIG5hbWUsIGltYWdlLCBjYXRlZ29yeVBrZ1BhdGgpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQl9IGVsc2UgewotCQkJY2hpbGRyZW4uY2xlYXIoKTsKLQkJfQotCQkvLyBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSB0YXJnZXQ7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGhvZENvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJY2F0ZWdvcnlQa2dQYXRoKTsKLQkJCUN1c3RvbUNhdGVnb3J5IHJvb3QgPSBUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShwbHVnaW4pOwotCQkJaWYgKHJvb3QgIT0gbnVsbCAmJiBwa2cgIT0gbnVsbAotCQkJCQkmJiBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKHBrZykpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcm9vdC5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZmlsdGVyICE9IG51bGwgPyBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpIDogdHJ1ZSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gc2V0IHBhcmVudAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFKQotCQkJCQkuZ2V0Q29uZmlndXJhdGlvblZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KAotCQkJCQkJCWl0ZXIubmV4dCgpLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxOTdkMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRpc2NpcGxpbmUgZ3JvdXBpbmcgaW4gdGhlIENvbmZpZ3VyYXRpb24KLSAqIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCURpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5EaXNjaXBsaW5lQ2F0ZWdvcnlJdGVtUHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCi0JCS8vIFRPRE86IGNvbW1lbnRlZCBvdXQgdW50aWwgSmluaHVhIGZpeGVkIGJ1Z3MgaW4gQ29uZmlndXJhdGlvbkZpbHRlcgotCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gY29uZmlndXJhdG9yLmdldENoaWxkcmVuKG9iamVjdCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpKTsKLQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIkRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbigpOiByZXR1cm5lZCBmcm9tIGNvbmZpZ3VyYXRvcjogIiArIGNoaWxkcmVuKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCX0KLQkJfQotCi0JCWNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJRGlzY2lwbGluZUdyb3VwaW5nIGdyb3VwaW5nID0gKERpc2NpcGxpbmVHcm91cGluZykgb2JqZWN0OwotCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmYgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgKChDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSBnZXRQYXJlbnQob2JqZWN0KSkKLQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCVRuZ1V0aWwuYWRkRXh0ZW5kZWRDaGlsZHJlbihncm91cGluZywgbWV0aG9kQ29uZiwgY2hpbGRyZW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCi0JCS8vIHNldCBwYXJlbnQKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSkKLQkJCQkJLmdldENvbmZpZ3VyYXRpb25WaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdCgKLQkJCQkJCQlpdGVyLm5leHQoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJY29uZmlndXJhdG9yID0gKElDb25maWd1cmF0b3IpIGZpbHRlcjsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOWYwOThjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBkaXNjaXBsaW5lIGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5EaXNjaXBsaW5lSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGlzY2lwbGluZV9TdWJkaXNjaXBsaW5lKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Eb21haW5JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNmYyNmJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRvbWFpbiBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRvbWFpbkl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEb21haW5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1N1YmRvbWFpbnMoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0d1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0d1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTIzZWQwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5JRWxlbWVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlIGd1aWRhbmNlIGZvbGRlcnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlFbGVtZW50SXRlbVByb3ZpZGVyLCBJR3JvdXBDb250YWluZXIsIElDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBBIG1hcCBvZiBFQ2xhc3MgLyBJdGVtUHJvdmlkZXJBZGFwdGVyIGZvciBlYWNoIHR5cGUgb2YgZ3VpZGFuY2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIGNoZWNrTGlzdEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIENoZWNrbGlzdDsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIGNvbmNlcHRGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiAoKG9iaiBpbnN0YW5jZW9mIENvbmNlcHQpICYmICghKG9iaiBpbnN0YW5jZW9mIFdoaXRlcGFwZXIpKSk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBleGFtcGxlRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgRXhhbXBsZTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHByYWN0aWNlRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUHJhY3RpY2U7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciByZXBvcnRGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBSZXBvcnQ7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciByZXVzYWJsZUFzc2V0RmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldDsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHJvYWRtYXBGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBSb2FkbWFwOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgc3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgZ3VpZGVsaW5lRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgR3VpZGVsaW5lOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgdGVtcGxhdGVGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUZW1wbGF0ZTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHRlcm1EZWZpbml0aW9uRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgVGVybURlZmluaXRpb247Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciB0b29sTWVudG9yRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvcjsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHdoaXRlUGFwZXJGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBXaGl0ZXBhcGVyOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMubWV0aG9kQ29uZmlnID0gbWV0aG9kQ29uZmlnOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJCS8vIGNoZWNrbGlzdAotCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L0NoZWNrbGlzdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJR3VpZGFuY2VJdGVtUHJvdmlkZXIgY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsIG5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKGNoZWNrTGlzdEZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gY29uY2VwdAotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvQ29uY2VwdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfQ29uY2VwdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIoY29uY2VwdEZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gZXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucwotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIGV4YW1wbGUKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L0V4YW1wbGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX0V4YW1wbGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKGV4YW1wbGVGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIHByYWN0aWNlCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9QcmFjdGljZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUHJhY3RpY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHByYWN0aWNlRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBSZXBvcnQKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1JlcG9ydHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUmVwb3J0cyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihyZXBvcnRGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFJldXNhYmxlIEFzc2V0Ci0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0cyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19SZXVzYWJsZUFzc2V0cyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihyZXVzYWJsZUFzc2V0RmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBSZXVzYWJsZSBBc3NldAotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvUm9hZG1hcHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUm9hZG1hcCIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihyb2FkbWFwRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBTdXBwb3J0aW5nIE1hdGVyaWFsCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWxzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIoc3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyAvLyBUZWNobmlxdWUKLQkJCS8vIGltYWdlID0KLQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJmdWxsL29iajE2L1RlY2huaXF1ZXMiKTsKLQkJCS8vIG5hbWUgPQotCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1RlY2huaXF1ZXMiKTsKLQkJCS8vIGNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkvLyBuYW1lLCBpbWFnZSk7Ci0JCQkvLyBjaGlsZC5zZXRHdWlkYW5jZUZpbHRlcih0ZWNobmlxdWVGaWx0ZXIpOwotCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFRlbXBsYXRlCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9UZW1wbGF0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVGVtcGxhdGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHRlbXBsYXRlRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBUZXJtIERlZmluaXRpb24KLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1Rlcm1EZWZpbml0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19UZXJtRGVmaW5pdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIodGVybURlZmluaXRpb25GaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFRvb2wgTWVudG9yCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9Ub29sTWVudG9ycyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19Ub29sTWVudG9ycyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcih0b29sTWVudG9yRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBXaGl0ZXBhcGVyCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9XaGl0ZXBhcGVycyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19XaGl0ZXBhcGVycyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcih3aGl0ZVBhcGVyRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBHdWlkZWxpbmVzCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdEd1aWRlbGluZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfV29ya1Byb2R1Y3RHdWlkZWxpbmVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKGd1aWRlbGluZUZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJfQotCQkKLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkvLyBTaG91bGQgZmlsdGVyIG9ubHkgY29weSBvbmx5LCBub3Qgb3JnaW5hbCBjYWNoZWQgY2hpbGRyZW4gbGlzdC4KLQkJCUxpc3QgY29weSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNvcHkuYWRkQWxsKGNoaWxkcmVuKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb3B5Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZUl0ZW1Qcm92aWRlciBvYmogPSAoR3VpZGFuY2VJdGVtUHJvdmlkZXIpIGl0ZXJhdG9yCi0JCQkJCQkubmV4dCgpOwotCQkJCW9iai5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCQlpZiAob2JqLmdldENoaWxkcmVuKG9iaikuaXNFbXB0eSgpKSB7Ci0JCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjb3B5OwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQkJCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9HdWlkYW5jZUZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXIjZ2V0R3JvdXBJdGVtUHJvdmlkZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEdyb3VwSXRlbVByb3ZpZGVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBncm91cEl0ZW1Qcm92aWRlck1hcC5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbWV0aG9kQ29uZmlnOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzhjOThmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZ3VpZGFuY2Ugc3BlY2lmaWMgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSUNvbmZpZ3VyYWJsZSwgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCUxpc3QgY2hpbGRyZW47Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBpbWFnZTsKLQotCXByaXZhdGUgSUZpbHRlciBndWlkYW5jZUZpbHRlcjsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWc7Ci0KLQlwdWJsaWMgY2xhc3MgQ29tcGFyZUJ5TmFtZSBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLQkJCVN0cmluZyBuYW1lMSA9ICgoTWV0aG9kRWxlbWVudCkgb2JqMSkuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIG5hbWUyID0gKChNZXRob2RFbGVtZW50KSBvYmoyKS5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gbmFtZTEuY29tcGFyZVRvSWdub3JlQ2FzZShuYW1lMik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGltYWdlKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJLy8gbWV0aG9kQ29uZmlnLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJbGFiZWwgPSBuYW1lOwotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgdGFyZ2V0OwotCi0JCUFycmF5TGlzdCBmaWx0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZ3VpZGFuY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJZmlsdGVyTGlzdC5hZGQoZ3VpZGFuY2VGaWx0ZXIpOwotCQl9Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJZmlsdGVyTGlzdC5hZGQoZmlsdGVyKTsKLQkJfQotCQlNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QgZWxlbWVudExpc3QgPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KAotCQkJCW1ldGhvZENvbmZpZywgZmlsdGVyTGlzdCk7Ci0JCUxpc3QgZWxlbWVudHMgPSBlbGVtZW50TGlzdC5nZXRMaXN0KCk7Ci0KLQkJLy8gc29ydCBieSBuYW1lCi0JCUNvbGxlY3Rpb25zLnNvcnQoZWxlbWVudHMsIG5ldyBDb21wYXJlQnlOYW1lKCkpOwotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobWV0aG9kQ29uZmlnLCBlZGl0aW5nRG9tYWluLAotCQkJCXNpYmxpbmcpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R3VpZGFuY2VGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJZ3VpZGFuY2VGaWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQ1YWViNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5icmVha2Rvd25lbGVtZW50Lk1pbGVzdG9uZUl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLk1ldGhvZHBsdWdpbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKQotCSAqLwotCS8qCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGx1Z2luQWRhcHRlcigpIHsKLQkJTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSBuZXcgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlhZGFwdGVyLnNldE1vZGVsU3RydWN0dXJlKE1vZGVsU3RydWN0dXJlLkRFRkFVTFQpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0JKi8KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLk1ldGhvZHBsdWdpbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEaXNjaXBsaW5lQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb21haW5BZGFwdGVyKCkgewotCQlpZiAoZG9tYWluSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRvbWFpbkl0ZW1Qcm92aWRlciA9IG5ldyBEb21haW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZG9tYWluSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJvbGVTZXRBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0QWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IFJvbGVTZXRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE1pbGVzdG9uZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9NZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL01ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmODkzNGUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL01ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogS2VlcHMgdHJhY2sgb2YgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cyBpbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QgewotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCXByaXZhdGUgTGlzdCBmaWx0ZXJMaXN0OwotCi0JcHJvdGVjdGVkIGNsYXNzIEVsZW1lbnRJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHsKLQotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMjkxNDM4OTcwMTIzOTg1OTA2TDsKLQotCQlwcm90ZWN0ZWQgRWxlbWVudEl0ZXJhdG9yKENvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cpIHsKLQkJCXN1cGVyKGNvbnRlbnRQa2csIGZhbHNlKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW5MaXN0KE9iamVjdCBvYmplY3QpIHsKLQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJQ29udGVudFBhY2thZ2UgcGtnID0gKENvbnRlbnRQYWNrYWdlKSBvYmplY3Q7Ci0JCQkJTGlzdCBwYWNrYWdlcyA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCQkJaW50IHNpemUgPSBwYWNrYWdlcy5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IHBhY2thZ2VzLmdldChpKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJCQkJJiYgbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhvYmopKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQob2JqKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihjaGVja0FjY2VwdGFuY2UoKSkgewotCQkJCQlMaXN0IGVsZW1lbnRzID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpOwotCQkJCQlzaXplID0gZWxlbWVudHMuc2l6ZSgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLQkJCQkJCWlmIChhY2NlcHQob2JqKSkgewotCQkJCQkJCWNoaWxkcmVuLmFkZChvYmopOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljaGlsZHJlbi5hZGRBbGwocGtnLmdldENvbnRlbnRFbGVtZW50cygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGdldENoaWxkcmVuTGlzdChvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCX0KLQkJCi0JfTsKLQkKLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLAotCQkJTGlzdCBmaWx0ZXJMaXN0KSB7Ci0JCXRoaXMubWV0aG9kQ29uZmlnID0gbWV0aG9kQ29uZmlnOwotCQl0aGlzLmZpbHRlckxpc3QgPSBmaWx0ZXJMaXN0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrQWNjZXB0YW5jZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqZWN0KSB7Ci0JCWludCBzaXplID0gZmlsdGVyTGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJRmlsdGVyIGZpbHRlciA9IChJRmlsdGVyKSBmaWx0ZXJMaXN0LmdldChpKTsKLQkJCWlmICghZmlsdGVyLmFjY2VwdChvYmplY3QpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIG5ld0l0ZXJhdG9yKENvbnRlbnRQYWNrYWdlIHBrZykgewotCQlyZXR1cm4gbmV3IEVsZW1lbnRJdGVyYXRvcihwa2cpOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRBbGxFbGVtZW50cyhDb250ZW50UGFja2FnZSBwa2csIExpc3QgbGlzdCkgewotCQlmb3IoSXRlcmF0b3IgaXRlciA9IG5ld0l0ZXJhdG9yKHBrZyk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmKCEoZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJCWxpc3QuYWRkKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TGlzdCgpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCWdldEFsbEVsZW1lbnRzKHBrZywgbGlzdCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjlmOGU0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuUm9sZVNldHNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gdGhlIENvbmZpZ3VyYXRpb24KLSAqIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlHcm91cENvbnRhaW5lciwgSUNvbmZpZ3VyYWJsZSwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgTWFwIGdyb3VwSXRlbVByb3ZpZGVyTWFwOwotCi0JLy8gY2hhbmdlZCB0byBwcm90ZWN0ZWQsIGV4dGVuZGVkIGNsYXNzIGNhbiBwbGF5IHdpdGggY2hpbGRyZW4gdmFyaWFibGUuCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBjaGlsZHJlbjsKLQotCXByaXZhdGUgSUZpbHRlciBkaXNjaXBsaW5lc0ZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgZWxlbWVudCA9IChDb250ZW50Q2F0ZWdvcnkpIG9iajsKLQkJCS8vIEJyb3dzaW5nOiBXaXRoIGNhdGVnb3JpZXMsIHJlcGxhY2UgZ2VuZXJhbGl6YXRpb24KLQkJCS8vIGNhdXNlcyBib3RoIHJlcGxhY2VtZW50IGFuZCBiYXNlIHRvIGJlY29tZSBpbnZpc2libGUgdG8gYnJvd3NpbmcKLQkJCXJldHVybiBEaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5hY2NlcHQoZWxlbWVudCkgLyoKLQkJCQkJCQkJCQkJCQkJCQkJICogJiYKLQkJCQkJCQkJCQkJCQkJCQkJICogZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0KLQkJCQkJCQkJCQkJCQkJCQkJICogbnVsbAotCQkJCQkJCQkJCQkJCQkJCQkgKi87Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBkb21haW5GaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJLy8gQnJvd3Npbmc6IFdpdGggY2F0ZWdvcmllcywgcmVwbGFjZSBnZW5lcmFsaXphdGlvbgotCQkJLy8gY2F1c2VzIGJvdGggcmVwbGFjZW1lbnQgYW5kIGJhc2UgdG8gYmVjb21lIGludmlzaWJsZSB0byBicm93c2luZwotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIERvbWFpbiAvKgotCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkgKiAoKERvbWFpbilvYmopLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PQotCQkJCQkJCQkJCQkgKiBudWxsCi0JCQkJCQkJCQkJCSAqLzsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgd29ya1Byb2R1Y3RUeXBlc0ZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkvLyBCcm93c2luZzogV2l0aCBjYXRlZ29yaWVzLCByZXBsYWNlIGdlbmVyYWxpemF0aW9uCi0JCQkvLyBjYXVzZXMgYm90aCByZXBsYWNlbWVudCBhbmQgYmFzZSB0byBiZWNvbWUgaW52aXNpYmxlIHRvIGJyb3dzaW5nCi0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlIC8qCi0JCQkJCQkJCQkJCQkJICogJiYKLQkJCQkJCQkJCQkJCQkgKiAoKFdvcmtQcm9kdWN0VHlwZSlvYmopLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PQotCQkJCQkJCQkJCQkJCSAqIG51bGwKLQkJCQkJCQkJCQkJCQkgKi87Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElGaWx0ZXIgcm9sZVNldHNGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJLy8gQnJvd3Npbmc6IFdpdGggY2F0ZWdvcmllcywgcmVwbGFjZSBnZW5lcmFsaXphdGlvbgotCQkJLy8gY2F1c2VzIGJvdGggcmVwbGFjZW1lbnQgYW5kIGJhc2UgdG8gYmVjb21lIGludmlzaWJsZSB0byBicm93c2luZwotCQkJcmV0dXJuIFJvbGVTZXRzSXRlbVByb3ZpZGVyLmFjY2VwdChvYmopIC8qCi0JCQkJCQkJCQkJCQkJICogJiYKLQkJCQkJCQkJCQkJCQkgKiAoKFZhcmlhYmlsaXR5RWxlbWVudClvYmopLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PQotCQkJCQkJCQkJCQkJCSAqIG51bGwKLQkJCQkJCQkJCQkJCQkgKi87Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciB0b29sc0ZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkvLyBCcm93c2luZzogV2l0aCBjYXRlZ29yaWVzLCByZXBsYWNlIGdlbmVyYWxpemF0aW9uCi0JCQkvLyBjYXVzZXMgYm90aCByZXBsYWNlbWVudCBhbmQgYmFzZSB0byBiZWNvbWUgaW52aXNpYmxlIHRvIGJyb3dzaW5nCi0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgVG9vbCAvKgotCQkJCQkJCQkJCSAqICYmCi0JCQkJCQkJCQkJICogKChUb29sKW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09Ci0JCQkJCQkJCQkJICogbnVsbAotCQkJCQkJCQkJCSAqLzsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgY3VzdG9tQ2F0ZWdvcmllc0ZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkvLyBCcm93c2luZzogV2l0aCBjYXRlZ29yaWVzLCByZXBsYWNlIGdlbmVyYWxpemF0aW9uCi0JCQkvLyBjYXVzZXMgYm90aCByZXBsYWNlbWVudCBhbmQgYmFzZSB0byBiZWNvbWUgaW52aXNpYmxlIHRvIGJyb3dzaW5nCi0JCQlyZXR1cm4gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5DdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyCi0JCQkJCS5hY2NlcHQob2JqKSAvKgotCQkJCQkJCQkJICogJiYKLQkJCQkJCQkJCSAqICgoVmFyaWFiaWxpdHlFbGVtZW50KW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09Ci0JCQkJCQkJCQkgKiBudWxsCi0JCQkJCQkJCQkgKi87Ci0JCX0KLQotCX07Ci0JCi0JLy8gdXBjYXRlZ29yaXplZCBmaWx0ZXJzIGNhbiBiZSByZXNldCBiYXNlZCBvbiBjb25maWd1cmF0b3IuCi0JcHJpdmF0ZSBJRmlsdGVyIHVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUYXNrCi0JCQkJCSYmIEFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVzKChUYXNrKSBvYmopLmlzRW1wdHkoKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUZpbHRlciBkb21haW5VbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Ci0JCQkJCSYmICFBc3NvY2lhdGlvbkhlbHBlci5nZXREb21haW5zKChXb3JrUHJvZHVjdCkgb2JqKS5pc0VtcHR5KCk7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElGaWx0ZXIgd3BUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdAotCQkJCQkmJiBBc3NvY2lhdGlvbkhlbHBlci5nZXRXb3JrUHJvZHVjdFR5cGVzKChXb3JrUHJvZHVjdCkgb2JqKQotCQkJCQkJCS5pc0VtcHR5KCk7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElGaWx0ZXIgdW5jYXRlZ29yaXplZFJvbGVGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJvbGUKLQkJCQkJJiYgQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldHMoKFJvbGUpIG9iaikuaXNFbXB0eSgpOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBJRmlsdGVyIHVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvcgotCQkJCQkmJiBBc3NvY2lhdGlvbkhlbHBlci5nZXRUb29sKChUb29sTWVudG9yKSBvYmopID09IG51bGw7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZ3JvdXBJdGVtUHJvdmlkZXJNYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ3JvdXBJdGVtUHJvdmlkZXJNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBhZGFwdGVyID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkJCQkoKElEaXNwb3NhYmxlKSBhZGFwdGVyKS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAuY2xlYXIoKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbnVsbDsKLQkJfQotCi0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5jbGVhcigpOwotCQkJY2hpbGRyZW4gPSBudWxsOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkvLyByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKG5ldwotCQkvLyBPYmplY3RMaW5rSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIChOb3RpZmllcikgb2JqZWN0KSk7Ci0JCS8vIH0KLQkJLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBjb25mID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JCS8vICgoT2JqZWN0TGlua0l0ZW1Qcm92aWRlcikgb2JqZWN0KS5nZXRMaW5rZWRPYmplY3QoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25mID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iamVjdDsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJU3RyaW5nIG5hbWU7Ci0JCQlPYmplY3QgdW5jYXRlZ29yaXplZEltYWdlOwotCQkJQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBjaGlsZDsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKAotCQkJCQlhZGFwdGVyRmFjdG9yeSwKLQkJCQkJY29uZiwKLQkJCQkJbmFtZSwKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVGFza3NfY2Z2IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCQkJY2hpbGQuc2V0UGFyZW50KGNvbmYpOwotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEZpbHRlcih1bmNhdGVnb3JpemVkVGFza0ZpbHRlcik7Ci0JCQljaGlsZC5zZXRDYXRlZ29yaXplZEZpbHRlcihkaXNjaXBsaW5lc0ZpbHRlcik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkTGFiZWwoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1VuY2F0ZWdvcml6ZWRfVGFza3NfdGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJdW5jYXRlZ29yaXplZEltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1Rhc2tzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRJbWFnZSh1bmNhdGVnb3JpemVkSW1hZ2UpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbmYsIG5hbWUsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0RvbWFpbnMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpOwotCQkJY2hpbGQuc2V0UGFyZW50KGNvbmYpOwotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEZpbHRlcihkb21haW5VbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIpOwotCQkJdW5jYXRlZ29yaXplZEltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0cyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkSW1hZ2UodW5jYXRlZ29yaXplZEltYWdlKTsKLQkJCWNoaWxkLnNldENhdGVnb3JpemVkRmlsdGVyKGRvbWFpbkZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IFdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbmYsCi0JCQkJCW5hbWUsIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0cyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKHdwVHlwZVVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlcik7Ci0JCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRJbWFnZSh1bmNhdGVnb3JpemVkSW1hZ2UpOwotCQkJY2hpbGQuc2V0Q2F0ZWdvcml6ZWRGaWx0ZXIod29ya1Byb2R1Y3RUeXBlc0ZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb25mLCBuYW1lLAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlcyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCQkJY2hpbGQuc2V0UGFyZW50KGNvbmYpOwotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEZpbHRlcih1bmNhdGVnb3JpemVkUm9sZUZpbHRlcik7Ci0JCQljaGlsZC5zZXRDYXRlZ29yaXplZEZpbHRlcihyb2xlU2V0c0ZpbHRlcik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkTGFiZWwoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJdW5jYXRlZ29yaXplZEltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRJbWFnZSh1bmNhdGVnb3JpemVkSW1hZ2UpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Ub29sc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb25mLCBuYW1lLAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Ub29scyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpOwotCQkJY2hpbGQuc2V0UGFyZW50KGNvbmYpOwotCQkJY2hpbGQuc2V0Q2F0ZWdvcml6ZWRGaWx0ZXIodG9vbHNGaWx0ZXIpOwotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEZpbHRlcih1bmNhdGVnb3JpemVkVG9vbE1lbnRvckZpbHRlcik7Ci0JCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVG9vbHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEltYWdlKHVuY2F0ZWdvcml6ZWRJbWFnZSk7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Byb2Nlc3Nlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQlPYmplY3Qgb3RoZXJDaGlsZCA9IG5ldyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbmYsCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQpOwotCQkJY2hpbGRyZW4uYWRkKG90aGVyQ2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIG90aGVyQ2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbmYsIG5hbWUsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L01ldGhvZFBhY2thZ2VzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCQkJY2hpbGQuc2V0UGFyZW50KGNvbmYpOwotCQkJY2hpbGQuc2V0Q2F0ZWdvcml6ZWRGaWx0ZXIoY3VzdG9tQ2F0ZWdvcmllc0ZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQlHdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyIGNoaWxkMSA9IG5ldyBHdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyKAotCQkJCQlhZGFwdGVyRmFjdG9yeSwgY29uZik7Ci0JCQljaGlsZDEuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQxKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZDEpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihvYmplY3QpOwotCS8vIH0KLQkvLyAgICAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5oYXNDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lciNnZXRHcm91cEl0ZW1Qcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJCi0JCWlmICggKGZpbHRlciAhPSBjb25maWd1cmF0b3IpICYmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSApIHsKLQkJCWNvbmZpZ3VyYXRvciA9IChJQ29uZmlndXJhdG9yKSBmaWx0ZXI7Ci0JCQlpZiAoIGNvbmZpZ3VyYXRvciAhPSBudWxsICkgewkJCQotCQkJCS8vIGNyZWF0ZSB0aGUgdW5jYXRlZ29yaXplZCBmaWx0ZXJzLiBJZiBJQ29uZmlndXJhdG9yIGlzIHNldCwgZ2V0IHRoZSBmaWxkZXJzIGZyb20gdGhlcmUuCi0JCQkJLy8gb3RoZXJ3aXplLCB1c2UgdGhlIGRlZmF1bHQgb25lLgotCQkJCS8vIFRoaXMgaXMgbmVlZGVkIHRvIGFsbG93IGV4dHJhIHVuY2F0ZWdvcml6ZWQgZWxlbWVudHMgZHVlIHRvIHJlYWxpemF0aW9uIAotCQkJCS8vIHRvIHNob3cgdXAgaW4gdGhlIHVuLWNhdGVnb3JpemVkIGZvbGRlci4KLQkJCQkvLyBGb3IgZXhhbXBsZSwgaWYgYSBkaXNjaXBsZSBpcyByZXBsYWNlZCBieSBhbm90aGVyLCB0aGUgdGFza3MgaW4gdGhlIHJlcGxhY2VkIGRpc2NpcGxpZQotCQkJCS8vIHNob3VsZCBzaG93IHVwIGluIHRoZSB1bi1jYXRlZ29yaXplZCB0YXNrcyBmb2xkZXIKLQkJCQkvLyAxNTY0MzggLSBWYXJpYWJpbGl0eSBvZiBkaXNjaXBsaW5lcyBpcyBub3Qgd29ya2luZyBjb3JyZWN0bHkKLQkJCQkKLQkJCQl1bmNhdGVnb3JpemVkVGFza0ZpbHRlciA9IGNvbmZpZ3VyYXRvci5nZXRVbmNhdGVnb3JpemVkVGFza0ZpbHRlcigpOwotCQkJCWRvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlciA9IGNvbmZpZ3VyYXRvci5nZXREb21haW5VbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQkJCQl3cFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIgPSBjb25maWd1cmF0b3IuZ2V0V3BUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyKCk7Ci0JCQkJdW5jYXRlZ29yaXplZFJvbGVGaWx0ZXIgPSBjb25maWd1cmF0b3IuZ2V0VW5jYXRlZ29yaXplZFJvbGVGaWx0ZXIoKTsKLQkJCQl1bmNhdGVnb3JpemVkVG9vbE1lbnRvckZpbHRlciA9IGNvbmZpZ3VyYXRvci5nZXRVbmNhdGVnb3JpemVkVG9vbE1lbnRvckZpbHRlcigpOwotCQkJCQotCQkJCS8vIFtCdWcgMTYyNjAzXSBOZXc6IFJlcGxhY2luZyBkaXNjaXBsaW5lcyBkbyBhcHBlYXIgaW5zaWRlIHRoZWlyIHJlcGxhY2VkIGVsZW1lbnRzIGRpc2NpcGxpbmUgZ3JvdXBpbmdzIGFzIHdlbGwgYXMgb3V0c2lkZSBvZiB0aGUgZGlzY2lwbGluZSBncm91cGluZwotCQkJCS8vIG5lZWQgdG8gY3VzdG9taXplIHRoZSBmaWx0ZXJzIGZvciBkaXNjaXBsaW5lcyBhbmQgcm9sZXNldHMKLQkJCQlkaXNjaXBsaW5lc0ZpbHRlciA9IGNvbmZpZ3VyYXRvci5nZXREaXNjaXBsaW5lc0ZpbHRlcigpOwotCQkJCXJvbGVTZXRzRmlsdGVyID0gY29uZmlndXJhdG9yLmdldFJvbGVTZXRzRmlsdGVyKCk7Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotCS8vIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkvLyByZXR1cm4gcGx1Z2luOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT046Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCQljb25maWd1cmF0b3Iubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzY2M2MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb2Nlc3NDb21wb25lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fTkFNRToKLQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAocGMuZ2V0UHJvY2VzcygpICE9IG51bGwpIHsKLQkJCQlib29sZWFuIG9sZCA9IHBjLmdldFByb2Nlc3MoKS5lRGVsaXZlcigpOwotCQkJCXRyeSB7Ci0JCQkJCXBjLmdldFByb2Nlc3MoKS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJCXBjLmdldFByb2Nlc3MoKS5zZXROYW1lKHBjLmdldE5hbWUoKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLmVTZXREZWxpdmVyKG9sZCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMjQ4MDc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcHJvY2VzcyBwYWNrYWdlIGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChQcm9jZXNzIHByb2Nlc3MpIHsKLQkJcmV0dXJuICFUbmdVdGlsLmlzQ29udHJpYnV0b3JPclJlcGxhY2VyKHByb2Nlc3MpCi0JCQkJJiYgIXByb2Nlc3MuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb2xsZWN0Q2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgT2JqZWN0IGVsZW1lbnQsCi0JCQlJRmlsdGVyIGZpbHRlcikgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3MgcHJvY2VzcyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSB7Ci0JCQkJCU9iamVjdCBjaGlsZCA9ICgoSUNvbmZpZ3VyYXRvcikgZmlsdGVyKS5yZXNvbHZlKHByb2Nlc3MpOwotCQkJCQlpZiAoIWNoaWxkcmVuLmNvbnRhaW5zKGNoaWxkKSAmJiBmaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KHByb2Nlc3MpKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChwcm9jZXNzKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQoZWxlbWVudCkpIHsKLQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb2xsZWN0Q2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGNvbGxlY3RDaGlsZHJlbihjaGlsZHJlbiwgZWxlbWVudCwgZmlsdGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCWNvbGxlY3RDaGlsZHJlbihjaGlsZHJlbiwgaXRlci5uZXh0KCkpOwotCQl9Ci0KLQkJLy8gc2V0IHBhcmVudCBmb3IgdGhlIGNvbGxlY3RlZCBjaGlsZHJlbgotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJUHJvY2Vzc1V0aWwuc2V0UGFyZW50KGNoaWxkLCBvYmplY3QsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCWlmIChjb2xsZWN0Q2hpbGRyZW4oY2hpbGRyZW4sIGl0ZXIubmV4dCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCSgoSUNvbmZpZ3VyYXRvcikgZmlsdGVyKS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzM2NhOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJQcm9jZXNzZXMiIGZvbGRlciBpbiB0aGUgQ29uZmlndXJhdGlvbgotICogdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG1vZGVsU3RydWN0KTsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWlmIChncm91cEl0ZW1Qcm92aWRlck1hcCA9PSBudWxsKSB7Ci0JCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJfQotCi0JCQlmaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50OwotCQkJCX0KLQotCQkJfTsKLQotCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dCIpOyAvLyROT04tTkxTLTEkCi0JCQlDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBjaGlsZCA9IG5ldyBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcigKLQkJCQkJYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywgbmFtZSwgaW1hZ2UsCi0JCQkJCW1vZGVsU3RydWN0LmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0JCQljaGlsZC5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3NlcyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCW1ldGhvZENvbmZpZywgbmFtZSwgaW1hZ2UsIG1vZGVsU3RydWN0LmRlbGl2ZXJ5UHJvY2Vzc1BhdGgpOwotCQkJY2hpbGQuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbWV0aG9kQ29uZmlnOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjZGJkNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHJvbGUgc2V0IGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlJvbGVTZXRJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Sb2xlU2V0SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwOWY5YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlIHVuY2F0ZWdvcml6ZWQgZm9sZGVycyBhbmQgZWxlbWVudHMgaW4gdGhlCi0gKiBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlDb25maWd1cmFibGUgewotCi0JcHJvdGVjdGVkIExpc3QgY2hpbGRyZW47Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWc7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIElGaWx0ZXIgdW5jYXRlZ29yaXplZEZpbHRlcjsKLQotCXByaXZhdGUgT2JqZWN0IGltYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBJRmlsdGVyIGZpbHRlciwgU3RyaW5nIGxhYmVsLAotCQkJT2JqZWN0IGltYWdlKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JCXRoaXMudW5jYXRlZ29yaXplZEZpbHRlciA9IGZpbHRlcjsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QoCi0JCQlMaXN0IGZpbHRlckxpc3QpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QobWV0aG9kQ29uZmlnLCBmaWx0ZXJMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVGaWx0ZXJMaXN0KCkgewotCQlBcnJheUxpc3QgZmlsdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHVuY2F0ZWdvcml6ZWRGaWx0ZXIgIT0gbnVsbCkgewotCQkJZmlsdGVyTGlzdC5hZGQodW5jYXRlZ29yaXplZEZpbHRlcik7Ci0JCX0KLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlmaWx0ZXJMaXN0LmFkZChmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJMaXN0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdChjcmVhdGVGaWx0ZXJMaXN0KCkpCi0JCQkJLmdldExpc3QoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIEFsd2F5cyByZXR1cm4gdHJ1ZSB0byBhdm9pZCBleHBlbnNpdmUgY2FsbCB0byBnZXRDaGlsZHJlbigpIHRoYXQgd2FsawotCQkvLyB0aHJ1IHRoZQotCQkvLyB3aG9sZSBsaWJyYXJ5IHRvIGZpbmQgYWxsIHRoZSB0YXNrcyB0aGF0IGlzIG5vdCBhc3NpZ25lZCB0byBhbnkKLQkJLy8gZGlzY2lwbGluZS4KLQkJLy8KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCXJldHVybiBsYWJlbDsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpbWFnZSAhPSBudWxsKQotCQkJcmV0dXJuIGltYWdlOwotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1Y2MwMjQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1dvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLldyYXBwZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJXb3JrIFByb2R1Y3QgS2luZHMiIGZvbGRlciBpbiB0aGUKLSAqIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlciBleHRlbmRzIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGltYWdlLAotCQkJU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsIG5hbWUsIGltYWdlLCBjYXRlZ29yeVBrZ1BhdGgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXIjY3JlYXRlVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcigpCi0JICovCi0JcHJvdGVjdGVkIFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIgY3JlYXRlVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJdGhpcy51bmNhdGVnb3JpemVkRmlsdGVyLCB0aGlzLnVuY2F0ZWdvcml6ZWRMYWJlbCwKLQkJCQl0aGlzLnVuY2F0ZWdvcml6ZWRJbWFnZSkgewotCQkJZmluYWwgY2xhc3MgRWxlbWVudExpc3QgZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QgewotCi0JCQkJLyoqCi0JCQkJICogQHBhcmFtIG1ldGhvZENvbmZpZwotCQkJCSAqIEBwYXJhbSBmaWx0ZXJMaXN0Ci0JCQkJICovCi0JCQkJcHVibGljIEVsZW1lbnRMaXN0KE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLAotCQkJCQkJTGlzdCBmaWx0ZXJMaXN0KSB7Ci0JCQkJCXN1cGVyKG1ldGhvZENvbmZpZywgZmlsdGVyTGlzdCk7Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0I25ld0l0ZXJhdG9yKG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UpCi0JCQkJICovCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIG5ld0l0ZXJhdG9yKENvbnRlbnRQYWNrYWdlIHBrZykgewotCQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRJdGVyYXRvcihwa2cpIHsKLQkJCQkJCS8qKgotCQkJCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkJCSAqLwotCQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjMwNzEzNjMwNzY1NzM1OTI4Mkw7Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCQkgKiAKLQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLk1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdC5FbGVtZW50SXRlcmF0b3IjZ2V0Q2hpbGRyZW5MaXN0KGphdmEubGFuZy5PYmplY3QpCi0JCQkJCQkgKi8KLQkJCQkJCXByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuTGlzdChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJTGlzdCBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuTGlzdChvYmplY3QpOwotCQkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQkJCQljaGlsZHJlbi5hZGRBbGwoKChBcnRpZmFjdCkgb2JqZWN0KQotCQkJCQkJCQkJCS5nZXRDb250YWluZWRBcnRpZmFjdHMoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5NZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QjY2hlY2tBY2NlcHRhbmNlKCkKLQkJCQkgKi8KLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0FjY2VwdGFuY2UoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBzdXBlckFjY2VwdChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBzdXBlci5hY2NlcHQob2JqZWN0KTsKLQkJCQl9Ci0JCQl9OwotCi0JCQkvLyBrZWVwcyB3cmFwcGVycyBvZiBhcnRpZmFjdHMgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSB3b3JrCi0JCQkvLyBwcm9kdWN0IHR5cGUKLQkJCS8vCi0JCQlwcml2YXRlIFdyYXBwZXJNYW5hZ2VyIHdyYXBwZXJNYW5hZ2VyID0gbmV3IFdyYXBwZXJNYW5hZ2VyKAotCQkJCQlhZGFwdGVyRmFjdG9yeSkgewotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLldyYXBwZXJNYW5hZ2VyI2NyZWF0ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdCwKLQkJCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsCi0JCQkJICogICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkJCQkgKi8KLQkJCQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsCi0JCQkJCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJCXJldHVybiBuZXcgRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIodmFsdWUsIG93bmVyLAotCQkJCQkJCW51bGwsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgsIGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJCQkvKgotCQkJCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCQkJICogCi0JCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCQkJCQkgKi8KLQkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQkvLyBTdWItYXJ0aWZhY3QgY2FuIGhhdmUgYSBkaWZmZXJlbnQgc2V0IG9mIHdvcmsKLQkJCQkJCQkvLyBwcm9kdWN0IHR5cGVzIHRoYW4gdGhlIGNvbnRhaW5pbmcgYXJ0aWZhY3QuCi0JCQkJCQkJLy8gRG8gbm90IHNob3cgdGhlIGNvbXBvc2l0aW9uIGhpZXJhcmNoaWVzIGluIHRoZQotCQkJCQkJCS8vIFdvcmsgUHJvZHVjdCBUeXBlIHRyZWUgYnJvd3NlcnMgaW4gTGliLiBOYXYuCi0JCQkJCQkJLy8gYW5kIENvbmZpZy4gRXhwbG9yZXIuIFNob3cgdGhlbSBpbiBmbGF0IGxpc3RzCi0JCQkJCQkJLy8gYWNjb3JkaW5nIHRvIHRoZWlyIGNhdGVnb3JpemF0aW9ucyBpbnN0ZWFkLgotCQkJCQkJCS8vCi0JCQkJCQkJLy8gVGhpcyBpcyBub3QgdHJ1ZSBmb3IgRG9tYWlucywgd2hpY2ggc2hvdWxkIHNob3cKLQkJCQkJCQkvLyB0aGUgYXJ0aWZhY3QgbmVzdGluZyEKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCQkJCX0KLQotCQkJCQkJLyoKLQkJCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJCSAqIAotCQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkJCQkJICovCi0JCQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQkJCX07Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIjY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KGphdmEudXRpbC5MaXN0KQotCQkJICovCi0JCQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0IGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCgKLQkJCQkJTGlzdCBmaWx0ZXJMaXN0KSB7Ci0JCQkJcmV0dXJuIG5ldyBFbGVtZW50TGlzdChtZXRob2RDb25maWcsIGZpbHRlckxpc3QpOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlFbGVtZW50TGlzdCBlbGVtZW50TGlzdCA9IChFbGVtZW50TGlzdCkgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KGNyZWF0ZUZpbHRlckxpc3QoKSk7Ci0JCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGVsZW1lbnRMaXN0LmdldExpc3QoKTsKLQkJCQlBcnJheUxpc3QgYXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudExpc3Quc3VwZXJBY2NlcHQoZWxlbWVudCkpIHsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJCQlhcnRpZmFjdHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXdyYXBwZXJNYW5hZ2VyLnVwZGF0ZShhcnRpZmFjdHMpOwotCQkJCWNoaWxkcmVuLmFkZEFsbCh3cmFwcGVyTWFuYWdlci5nZXRXcmFwcGVycygpKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW47Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQl3cmFwcGVyTWFuYWdlci5kaXNwb3NlKCk7Ci0JCQkJc3VwZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNzdkZmFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRpc3BsYXkgYW5kIGVkaXRpbmcgc3VwcG9ydCBmb3IgbWV0aG9kIGNvbmZpZ3VyYXRpb25zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9BcnRpZmFjdEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZjkzZjdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGFuIGFydGlmYWN0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQXJ0aWZhY3RJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGVmYXVsdE5hbWVTZXR0ZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBcnRpZmFjdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgb2JqZWN0OwotCQlpZiAoYXJ0aWZhY3QgIT0gbnVsbCAmJiBhcnRpZmFjdC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCXJldHVybiBUbmdVdGlsLmdldE5hdmlnYXRvclBhcmVudEl0ZW1Qcm92aWRlcihhcnRpZmFjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBcnRpZmFjdCgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCi0JCS8vVG5nVXRpbC5zZXREZWZhdWx0TmFtZSh0aGlzLCBub3RpZmljYXRpb24pOwotCQlzZXREZWZhdWx0TmFtZShub3RpZmljYXRpb24pOwotCQkKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaXNjaXBsaW5lLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hDb250cmlidXRvcnModGhpcywgbm90aWZpY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCVRuZ1V0aWwucmVmcmVzaFdvcmtQcm9kdWN0VHlwZVVuY2F0ZWdvcml6ZWQoVW1hVXRpbAotCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSB0YXJnZXQpLCBub3RpZmljYXRpb24pOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgdG8gc2V0RGVmYXVsdE5hbWUuIElEZWZhdWx0TmFtZVNldHRlciBjYW5ub3QgYmUgdXNlZCAKLQkgKiBpbiBjYXNlIG9mIFN0YXRlbGVzcyBJdGVtUHJvdmlkZXIuCi0JICogVGhpcyBpcyB3b3JrLWFyb3VuZCBmb3Igbm93LiBJRGVmYXVsdE5hbWVTZXR0ZXIgd2lsbCBiZSBtb2RpZmllZCBsYXRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCUlEZWZhdWx0TmFtZVNldHRlciBkZWZhdWx0TmFtZVNldHRlciA9IHRoaXM7Ci0JCWlmIChkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSAhPSBudWxsKSB7Ci0JCQlpbnQgZmVhdHVyZUlkID0gbXNnLmdldEZlYXR1cmVJRChkZWZhdWx0TmFtZVNldHRlcgotCQkJCQkuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJc2V0RGVmYXVsdE5hbWUobXNnLmdldE5ld1ZhbHVlKCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJc2V0RGVmYXVsdE5hbWUoaXRlci5uZXh0KCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaiwgT2JqZWN0IHBhcmVudCkgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0FSVElGQUNUOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQXJ0aWZhY3QpIHBhcmVudCkKLQkJCQkJLmdldENvbnRhaW5lZEFydGlmYWN0cygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKiBub3QgaW4gdXNlIChmb3Igc3RhdGVsZXNzIGl0ZW1wcm92aWRlcikgc2VlIGFib3ZlIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmosIE9iamVjdCBwYXJlbnQpLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19BUlRJRkFDVDsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKEFydGlmYWN0KSB0YXJnZXQpLmdldENvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIEFydGlmYWN0LmNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfQXJ0aWZhY3RfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSAhPSBudWxsKSB7Ci0JCQkJVVJJIGltZ1VyaSA9IFRuZ1V0aWwuZ2V0RnVsbFBhdGhvZk5vZGVvclNoYXBlSWNvblVSSSgKLQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkpOwotCQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlciNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIHJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gY29sLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0b3IubmV4dCgpOwotCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpIHsKLQkJCQkJaXRvci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gaXNQYXJlbnRzQWNjZXB0ZWQoT2JqZWN0IGNoaWxkKSB7Ci0JLy8gTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGdldEhpZXJhcmNoeUxpc3QobGlzdCwgY2hpbGQpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCS8vIGlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCS8vIGlmIChmaWx0ZXIuYWNjZXB0KG9iaikpCi0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vCi0JLy8gcHJpdmF0ZSBib29sZWFuIGNoZWNrQ2hpbGRyZW5zQWNjZXB0ZWQoT2JqZWN0IG9iamVjdCkgewotCS8vIEFydGlmYWN0IHBhcmVudGFydGlmYWN0ID0gKChBcnRpZmFjdCkgb2JqZWN0KS5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCS8vIGlmIChwYXJlbnRhcnRpZmFjdCAhPSBudWxsKSB7Ci0JLy8gaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JLy8gaWYgKGZpbHRlci5hY2NlcHQocGFyZW50YXJ0aWZhY3QpKQotCS8vIHJldHVybiB0cnVlOwotCS8vIGVsc2UgewotCS8vIHJldHVybiBjaGVja0NoaWxkcmVuc0FjY2VwdGVkKHBhcmVudGFydGlmYWN0KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vCi0JLy8gcHJpdmF0ZSB2b2lkIGdldEhpZXJhcmNoeUxpc3QoTGlzdCBsaXN0LCBPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gQXJ0aWZhY3QgcGFyZW50ID0gKChBcnRpZmFjdCkgb2JqZWN0KS5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCS8vIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCS8vIGxpc3QuYWRkKHBhcmVudCk7Ci0JLy8gZ2V0SGllcmFyY2h5TGlzdChsaXN0LCBwYXJlbnQpOwotCS8vIH0KLQkvLyB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0NvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxMDBhODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGNvbnRlbnQgZGVzY3JpcHRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEEgbWFwIG9mIEVDbGFzcyAvIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZm9yIGVhY2ggdHlwZSBvZiBDb250ZW50RGVzY3JpcHRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgaXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCQotCXB1YmxpYyBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpdGVtUHJvdmlkZXJNYXAuY2xlYXIoKTsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gZ2V0QWRhcHRlcigoRU9iamVjdCkgb2JqZWN0KS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9yKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCwKLQkJCU9iamVjdCBwcm9wZXJ0eUlkKSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsCi0JCQkJcHJvcGVydHlJZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEVkaXRhYmxlVmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0QWRhcHRlcigoRU9iamVjdCkgb2JqZWN0KS5nZXRFZGl0YWJsZVZhbHVlKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkd1aWRhbmNlSXRlbVByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gZ2V0QWRhcHRlcigoRU9iamVjdCkgb2JqZWN0KS5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5HdWlkYW5jZUl0ZW1Qcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZ2V0QWRhcHRlcihFT2JqZWN0IGVPYmopIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGl0ZW1Qcm92aWRlck1hcAotCQkJCS5nZXQoZU9iai5lQ2xhc3MoKSk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpIHsKLQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkuY3JlYXRlQWRhcHRlcihlT2JqKTsKLQkJCWl0ZW1Qcm92aWRlck1hcC5wdXQoZU9iai5lQ2xhc3MoKSwgYWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0NvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNzAyNzZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0NvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJDb250ZW50IFBhY2thZ2VzIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkKLSAqIHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIENvbnRlbnRQYWNrYWdlc0l0ZW1Qcm92aWRlciBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFbGVtZW50SXRlbVByb3ZpZGVyLCBJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgUm9sZXNJdGVtUHJvdmlkZXIgcm9sZXM7Ci0KLQlwcml2YXRlIFRhc2tzSXRlbVByb3ZpZGVyIHRhc2tzOwotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXIgd29ya1Byb2R1Y3RzOwotCi0JcHJpdmF0ZSBHdWlkYW5jZXNJdGVtUHJvdmlkZXIgZ3VpZGFuY2VzOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByb2xlcy4KLQkgKi8KLQlwdWJsaWMgUm9sZXNJdGVtUHJvdmlkZXIgZ2V0Um9sZXMoKSB7Ci0JCXJldHVybiByb2xlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRhc2tzLgotCSAqLwotCXB1YmxpYyBUYXNrc0l0ZW1Qcm92aWRlciBnZXRUYXNrcygpIHsKLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd29ya1Byb2R1Y3RzLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXIgZ2V0V29ya1Byb2R1Y3RzKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCS8vIGNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkpOwotCS8vIH0KLQkvLyByZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQkvLyB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGFsbENoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlDaGlsZHJlblN0b3JlIHN0b3JlID0gZ2V0Q2hpbGRyZW5TdG9yZShvYmplY3QpOwotCQlMaXN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChzdG9yZSA9PSBudWxsKSB7Ci0JCQlzdG9yZSA9IGNyZWF0ZUNoaWxkcmVuU3RvcmUob2JqZWN0KTsKLQkJCXJlc3VsdCA9IHN0b3JlICE9IG51bGwgPyBudWxsIDogbmV3IEFycmF5TGlzdCgpOwotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKLQotCQkJZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpLml0ZXJhdG9yKCk7IGkKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGkubmV4dCgpOwotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCUxpc3QgY2hpbGRyZW4gPSAoTGlzdCkgZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJCQlMaXN0IGNvbnRlbnRQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGNpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgY2kuaGFzTmV4dCgpOyBpbmRleCsrKSB7Ci0JCQkJCQlPYmplY3QgY2hpbGQgPSBjaS5uZXh0KCk7Ci0JCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQkJCWNoaWxkID0gd3JhcChlT2JqZWN0LCBmZWF0dXJlLCBjaGlsZCwgaW5kZXgpOwotCQkJCQkJCS8vIGlmIChzdG9yZSAhPSBudWxsKQotCQkJCQkJCS8vIHsKLQkJCQkJCQkvLyBzdG9yZS5nZXRMaXN0KGZlYXR1cmUpLmFkZChjaGlsZCk7Ci0JCQkJCQkJLy8gfQotCQkJCQkJCS8vIGVsc2UKLQkJCQkJCQkvLyB7Ci0JCQkJCQkJLy8gcmVzdWx0LmFkZChjaGlsZCk7Ci0JCQkJCQkJLy8gfQotCQkJCQkJCWNvbnRlbnRQa2dzLmFkZChjaGlsZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIGNsZWFyIHBhcmVudCBmb3IgY2hpbGRyZW4KLQkJCQkJLy8KLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoY2hpbGQsCi0JCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KG51bGwpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gc29ydGluZyB0aGUgY29udGVudCBwYWNrYWdlcwotCQkJCQkvLwotCQkJCQlDb2xsZWN0aW9ucy5zb3J0KGNvbnRlbnRQa2dzLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFCi0JCQkJCQkJLmdldENvbXBhcmF0b3IoKSk7Ci0KLQkJCQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLQkJCQkJCXN0b3JlLmdldExpc3QoZmVhdHVyZSkuYWRkQWxsKGNvbnRlbnRQa2dzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc3VsdC5hZGRBbGwoY29udGVudFBrZ3MpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQkJY2hpbGQgPSB3cmFwKGVPYmplY3QsIGZlYXR1cmUsIGNoaWxkLAotCQkJCQkJCQlDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYKTsKLQkJCQkJCWlmIChzdG9yZSAhPSBudWxsKSB7Ci0JCQkJCQkJc3RvcmUuc2V0VmFsdWUoZmVhdHVyZSwgY2hpbGQpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXN1bHQuYWRkKGNoaWxkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlhbGxDaGlsZHJlbi5hZGRBbGwoc3RvcmUgIT0gbnVsbCA/IHN0b3JlLmdldENoaWxkcmVuKCkgOiByZXN1bHQpOwotCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnID0gKENvbnRlbnRQYWNrYWdlKSBvYmplY3Q7Ci0KLQkJLy8gcmVtb3ZlIG9sZCBhZGFwdGVycyAocm9sZXMsIHRhc2tzLCB3b3JrcHJvZHVjdHMpIGZyb20gdGhlIHRoZQotCQkvLyBjb250ZW50UGtnCi0JCS8vCi0JCS8vIEVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCWlmIChyb2xlcyA9PSBudWxsKSB7Ci0JCQkvLyBlT2JqLmVBZGFwdGVycygpLnJlbW92ZShyb2xlcyk7Ci0JCQlyb2xlcyA9IG5ldyBSb2xlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZyk7Ci0JCX0KLQkJaWYgKHRhc2tzID09IG51bGwpIHsKLQkJCS8vIGVPYmouZUFkYXB0ZXJzKCkucmVtb3ZlKHRhc2tzKTsKLQkJCXRhc2tzID0gbmV3IFRhc2tzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQkJfQotCQlpZiAod29ya1Byb2R1Y3RzID09IG51bGwpIHsKLQkJCS8vIGVPYmouZUFkYXB0ZXJzKCkucmVtb3ZlKHdvcmtQcm9kdWN0cyk7Ci0JCQl3b3JrUHJvZHVjdHMgPSBuZXcgV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQljb250ZW50UGtnKTsKLQkJfQotCQlpZiAoZ3VpZGFuY2VzID09IG51bGwpIHsKLQkJCS8vIGVPYmouZUFkYXB0ZXJzKCkucmVtb3ZlKGd1aWRhbmNlcyk7Ci0JCQlndWlkYW5jZXMgPSBuZXcgR3VpZGFuY2VzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQkJfQotCi0JCWFsbENoaWxkcmVuLmFkZChyb2xlcyk7Ci0JCWFsbENoaWxkcmVuLmFkZCh0YXNrcyk7Ci0JCWFsbENoaWxkcmVuLmFkZCh3b3JrUHJvZHVjdHMpOwotCQlhbGxDaGlsZHJlbi5hZGQoZ3VpZGFuY2VzKTsKLQkJcmV0dXJuIGFsbENoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQ29udGVudFBhY2thZ2UoKSkpOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLkNsYXNzLAotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcikKLQkvLyAqLwotCS8vIHB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IG9iamVjdCwgRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JLy8gQ2xhc3MgY29tbWFuZENsYXNzLCBDb21tYW5kUGFyYW1ldGVyIGNvbW1hbmRQYXJhbWV0ZXIpIHsKLQkvLyAvLyBjb21tYW5kUGFyYW1ldGVyLnNldE93bmVyKCgoRU9iamVjdClvYmplY3QpLmVDb250YWluZXIoKSk7Ci0JLy8gQ29tbWFuZCBjbWQgPSBzdXBlci5jcmVhdGVDb21tYW5kKG9iamVjdCwgZG9tYWluLCBjb21tYW5kQ2xhc3MsCi0JLy8gY29tbWFuZFBhcmFtZXRlcik7Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjcmVhdGVDb21tYW5kOiAiICsKLQkvLyBjb21tYW5kQ2xhc3MgKyAiLCBjYW4gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkgKyAiLCBvd25lcjogIiArCi0JLy8gY29tbWFuZFBhcmFtZXRlci5nZXRPd25lcigpICsgIiwgY29sbGVjdGlvbjogIiArCi0JLy8gY29tbWFuZFBhcmFtZXRlci5nZXRDb2xsZWN0aW9uKCkpOwotCS8vIHJldHVybiBjbWQ7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgdHh0OwotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJdHh0ID0gbGFiZWw7Ci0JCX0gZWxzZSB7Ci0JCQl0eHQgPSBUbmdVdGlsCi0JCQkJCS5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX0NvbnRlbnRQYWNrYWdlX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBjaGVjayBpZiB0aGUgb2JqZWN0IGhhcyBpdHMgb3duIHJlc291cmNlIGFuZCBpdCBpcyBtb2RpZmllZCB0byBhZGQKLQkJLy8gdGhlIGRpcnR5IGZsYWcKLQkJLy8KLQkJUmVzb3VyY2UgcmVzID0gKChFT2JqZWN0KSBvYmplY3QpLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApID09IG9iamVjdAotCQkJCSYmIHJlcy5pc01vZGlmaWVkKCkpIHsKLQkJCXR4dCA9IHR4dCArICIqIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0eHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2UgPSAoQ29udGVudFBhY2thZ2UpIHRhcmdldDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKGNvbnRlbnRQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgImNvbnRlbnRfcGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKGNvbnRlbnRQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgIm1ldGhvZF9wYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChtc2csIHRoaXMpOwotCi0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChDb250ZW50UGFja2FnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzoKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM6Ci0JCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCXNldERlZmF1bHROYW1lKG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCXNldERlZmF1bHROYW1lKGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZXNJdGVtUHJvdmlkZXIgZ2V0R3VpZGFuY2VzKCkgewotCQlyZXR1cm4gZ3VpZGFuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50OwotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLy8gcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gcmV0dXJuIFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMiKTsKLQkvLyB9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJQXJyYXlMaXN0IHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSB0aGF0IHlvdSBjYW5ub3QgYWRkIE1ldGhvZFBhY2thZ2UgdGhhdCBpcyBub3QgYQotCQkJLy8gQ29udGVudFBhY2thZ2UKLQkJCS8vCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXNlbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIHNlbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGd1aWRhbmNlcyAhPSBudWxsKSB7Ci0JCQlndWlkYW5jZXMuZGlzcG9zZSgpOwotCQkJZ3VpZGFuY2VzID0gbnVsbDsKLQkJfQotCQlpZiAocm9sZXMgIT0gbnVsbCkgewotCQkJcm9sZXMuZGlzcG9zZSgpOwotCQkJcm9sZXMgPSBudWxsOwotCQl9Ci0JCWlmICh0YXNrcyAhPSBudWxsKSB7Ci0JCQl0YXNrcy5kaXNwb3NlKCk7Ci0JCQl0YXNrcyA9IG51bGw7Ci0JCX0KLQkJaWYgKHdvcmtQcm9kdWN0cyAhPSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdHMuZGlzcG9zZSgpOwotCQkJd29ya1Byb2R1Y3RzID0gbnVsbDsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmIzYWU5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGd1aWRhbmNlIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5HdWlkYW5jZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBBIG1hcCBvZiBFQ2xhc3MgLyBJdGVtUHJvdmlkZXJBZGFwdGVyIGZvciBlYWNoIHR5cGUgb2YgZ3VpZGFuY2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgaXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEd1aWRhbmNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaXRlbVByb3ZpZGVyTWFwLmNsZWFyKCk7Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5HdWlkYW5jZUl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkd1aWRhbmNlSXRlbVByb3ZpZGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0LAotCQkJT2JqZWN0IHByb3BlcnR5SWQpIHsKLQkJcmV0dXJuIGdldEFkYXB0ZXIoKEVPYmplY3QpIG9iamVjdCkuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwKLQkJCQlwcm9wZXJ0eUlkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0RWRpdGFibGVWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldEVkaXRhYmxlVmFsdWUob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJaWYgKCgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkgIT0gbnVsbCkgewotCQkJCVVSSSBpbWdVcmkgPSBUbmdVdGlsLmdldEZ1bGxQYXRob2ZOb2Rlb3JTaGFwZUljb25VUkkoCi0JCQkJCQkoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QsCi0JCQkJCQkoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpKTsKLQkJCQlPYmplY3QgaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFNoYXJlZEltYWdlKGltZ1VyaSk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQkJCXJldHVybiBpbWFnZTsKLQkJCX0KLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuIGdldEFkYXB0ZXIoKEVPYmplY3QpIG9iamVjdCkuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZ2V0QWRhcHRlcihFT2JqZWN0IGVPYmopIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGl0ZW1Qcm92aWRlck1hcAotCQkJCS5nZXQoZU9iai5lQ2xhc3MoKSk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpIHsKLQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkuY3JlYXRlQWRhcHRlcihlT2JqKTsKLQkJCWl0ZW1Qcm92aWRlck1hcC5wdXQoZU9iai5lQ2xhc3MoKSwgYWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkd1aWRhbmNlSXRlbVByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKGVPYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihlT2JqLCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCWlmIChpdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGl0ZW1Qcm92aWRlci5nZXRHdWlkYW5jZXMoKTsKLQkJfQotCQlyZXR1cm4gZU9iajsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0d1aWRhbmNlc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvR3VpZGFuY2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhMGQ4MzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvR3VpZGFuY2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJHdWlkYW5jZSIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIEd1aWRhbmNlRm9sZGVySXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBHdWlkYW5jZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9HdWlkYW5jZUZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUF0dGFjaG1lbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVDaGVja2xpc3QoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVDb25jZXB0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRXhhbXBsZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUd1aWRlbGluZSgpKSk7Ci0KLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJLy8gLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkvLyAuY3JlYXRlRXN0aW1hdGUoKSkpOwotCQkvLwotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkpKTsKLQotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkvLyAuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCS8vIC5jcmVhdGVFc3RpbWF0aW5nTWV0cmljKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHJhY3RpY2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVSZXBvcnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVSZXVzYWJsZUFzc2V0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUm9hZG1hcCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpKSk7Ci0KLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJLy8gLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkvLyAuY3JlYXRlVGVjaG5pcXVlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVGVtcGxhdGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVUZXJtRGVmaW5pdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRvb2xNZW50b3IoKSkpOwotCi0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRyYWluaW5nQ2xhc3MoKSkpOwotCQkvLwotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUcmFpbmluZ01vZHVsZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdoaXRlcGFwZXIoKSkpOwotCi0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCS8vIC5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJLy8gLmNyZWF0ZVdvcmtQcm9kdWN0R3VpZGVsaW5lKCkpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQkvLyBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCS8vIGlmKGVPYmogPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JLy8gQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKQotCS8vIFRuZ1V0aWwuZ2V0QWRhcHRlcihlT2JqLCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JLy8gaWYoaXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkvLyByZXR1cm4gaXRlbVByb3ZpZGVyLmdldEd1aWRhbmNlcygpOwotCS8vIH0KLQkvLyByZXR1cm4gZU9iajsKLQkvLyB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQ0hFQ0tMSVNUOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdoaXRlcGFwZXIpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1dISVRFUEFQRVI7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQ09OQ0VQVDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0VTVElNQVRJT05fQ09OU0lERVJBVElPTjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19FWEFNUExFOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19QUkFDVElDRTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSZXBvcnQpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JFUE9SVDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2FkbWFwKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0FETUFQOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JFVVNBQkxFX0FTU0VUOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfU1VQUE9SVElOR19NQVRFUklBTDsKLQkJCS8vIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGVjaG5pcXVlKSB7Ci0JCQkvLyBiYXNlTmFtZSA9ICJuZXdfVGVjaG5pcXVlIjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUZW1wbGF0ZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfVEVNUExBVEU7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGVybURlZmluaXRpb24pIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1RFUk1fREVGSU5JVElPTjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19UT09MX01FTlRPUjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0dVSURFTElORTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfR1VJREFOQ0U7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIChNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuZWxlbWVudC5UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciNuZXdDaGlsZEFkZGVkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGlsZHJlbkNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlib29sZWFuIHJlZnJlc2ggPSBmYWxzZTsKLQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJaWYgKG1zZy5nZXROZXdWYWx1ZSgpIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCXJlZnJlc2ggPSB0cnVlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCWlmIChtc2cuZ2V0T2xkVmFsdWUoKSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQlyZWZyZXNoID0gdHJ1ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCWNoZWNrX2FkZDogZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWlmIChpdGVyLm5leHQoKSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQkJCWJyZWFrIGNoZWNrX2FkZDsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQljaGVja19yZW1vdmU6IGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlpZiAoaXRlci5uZXh0KCkgaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCXJlZnJlc2ggPSB0cnVlOwotCQkJCQlicmVhayBjaGVja19yZW1vdmU7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHJlZnJlc2gpCi0JCQlUbmdVdGlsLnJlZnJlc2hVbmNhdGVnb3JpemVkVG9vbE1lbnRvcnNJdGVtUHJvdmlkZXIoVW1hVXRpbAotCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSB0YXJnZXQpLCBtc2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBudWxsOwotCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCWNoaWxkcmVuID0gKExpc3QpIGNvbGxlY3Rpb247Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoY29sbGVjdGlvbik7Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwgUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRHdWlkYW5jZVR5cGVDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9JRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvSUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjNmNzc3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9JRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi0vKioKLSAqIFRoZSBiYXNlIGludGVyZmFjZSBmb3IgYSBtZXRob2QgZWxlbWVudCBpdGVtIHByb3ZpZGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVsZW1lbnRJdGVtUHJvdmlkZXIgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Sb2xlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Sb2xlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkYTNhYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvUm9sZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSByb2xlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlSXRlbVByb3ZpZGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgY29udGVudFBrZyA9IChFT2JqZWN0KSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKGNvbnRlbnRQa2cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihjb250ZW50UGtnLCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBpdGVtUHJvdmlkZXIgIT0gbnVsbCA/IGl0ZW1Qcm92aWRlci5nZXRSb2xlcygpIDogbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9Sb2xlX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUm9sZUl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlUbmdVdGlsLnJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKG5vdGlmaWNhdGlvbiwgdGhpcyk7Ci0JCQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvUm9sZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1JvbGVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0ZjUzZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvUm9sZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJSb2xlcyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJvbGUoKSkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJvbGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JPTEU7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIChNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuZWxlbWVudC5UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciNuZXdDaGlsZEFkZGVkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGlsZHJlbkNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlUbmdVdGlsLnJlZnJlc2hVbmNhdGVnb3JpemVkUm9sZXNJdGVtUHJvdmlkZXIoVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCksIG1zZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlzdXBlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1NlY3Rpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1NlY3Rpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGZhNGZkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9TZWN0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHNlY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlNlY3Rpb25JdGVtUHJvdmlkZXIgewotCi0JcHVibGljIFNlY3Rpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfU2VjdGlvbl90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyZGIyNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvVGFza0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB0YXNrLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrSXRlbVByb3ZpZGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5UYXNrSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgY29udGVudFBrZyA9IChFT2JqZWN0KSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKGNvbnRlbnRQa2cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihjb250ZW50UGtnLCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBpdGVtUHJvdmlkZXIgIT0gbnVsbCA/IGl0ZW1Qcm92aWRlci5nZXRUYXNrcygpIDogbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLkNsYXNzLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyKQotCSAqLwotCS8vIHB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IG9iamVjdCwgRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JLy8gQ2xhc3MgY29tbWFuZENsYXNzLCBDb21tYW5kUGFyYW1ldGVyIGNvbW1hbmRQYXJhbWV0ZXIpIHsKLQkvLyAvLyBpZihjb21tYW5kQ2xhc3MgPT0gUmVtb3ZlQ29tbWFuZC5jbGFzcykgewotCS8vIC8vIGNvbW1hbmRQYXJhbWV0ZXIuc2V0T3duZXIoKChFT2JqZWN0KW9iamVjdCkuZUNvbnRhaW5lcigpKTsKLQkvLyAvLyB9Ci0JLy8gQ29tbWFuZCBjbWQgPSBzdXBlci5jcmVhdGVDb21tYW5kKG9iamVjdCwgZG9tYWluLCBjb21tYW5kQ2xhc3MsCi0JLy8gY29tbWFuZFBhcmFtZXRlcik7Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjcmVhdGVDb21tYW5kOiAiICsKLQkvLyBjb21tYW5kQ2xhc3MgKyAiLCBjYW4gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkgKyAiLCBvd25lcjogIiArCi0JLy8gY29tbWFuZFBhcmFtZXRlci5nZXRPd25lcigpICsgIiwgY29sbGVjdGlvbjogIiArCi0JLy8gY29tbWFuZFBhcmFtZXRlci5nZXRDb2xsZWN0aW9uKCkpOwotCS8vIHJldHVybiBjbWQ7Ci0JLy8gfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9UYXNrX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5UYXNrSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0vLwkJc3dpdGNoKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotLy8JCWNhc2UgRXZlbnRUeXBlcy5NQUtFX1BST1hZOgotLy8JCQkvLyByZWZyZXNoIHBhcmVudAotLy8JCQkvLwotLy8JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgZ2V0UGFyZW50KG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSwgdHJ1ZSwgZmFsc2UpKTsKLS8vCQkJCi0vLwkJCS8vIHJlZnJlc2ggaXRzZWxmCi0vLwkJCS8vCi0vLwkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgdHJ1ZSkpOwotLy8JCQkKLS8vCQkJcmV0dXJuOwotLy8JCX0KLQkJCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvVGFza3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODUyMTA3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiVGFza3MiIGZvbGRlciBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9UYXNrc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9UYXNrcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRhc2soKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcuZWxlbWVudC5UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgVGFzazsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgVGFzaykgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfVEFTSzsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI25ld0NoaWxkQWRkZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoaWxkcmVuQ2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCS8vIHJlZnJlc2ggdGhlIHVuY2F0ZWdvcml6ZWQgdGFza3MgZ3JvdXAKLQkJLy8KLQkJVG5nVXRpbC5yZWZyZXNoVW5jYXRlZ29yaXplZFRhc2tzSXRlbVByb3ZpZGVyKFVtYVV0aWwKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSB0YXJnZXQpLCBtc2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzlkZGNlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkNvbnRlbnQgUGFja2FnZXMiIHN1YiBmb2xkZXJzIGluIHRoZQotICogTGlicmFyeSB2aWV3LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSA9PSB0YXJnZXQpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKENvbnRlbnRQYWNrYWdlLmNsYXNzKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMpIHsKLQkJCQlib29sZWFuIG5vdGlmeSA9IGZhbHNlOwotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQkJCU9iamVjdCBvYmogPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJbm90aWZ5ID0gYWNjZXB0QXNDaGlsZChvYmopOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCW9iaiA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlmb3JfY2hlY2s6IGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJCQkJCQlub3RpZnkgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZvcl9jaGVjazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCQkJCWlmKG1zZy5nZXROZXdWYWx1ZSgpICE9IG1zZy5nZXRPbGRWYWx1ZSgpKSB7Ci0JCQkJCQlub3RpZnkgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAobm90aWZ5KSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obXNnLCB0aGlzLCB0cnVlLAotCQkJCQkJCWZhbHNlKSk7Ci0JCQkJCWNoaWxkcmVuQ2hhbmdlZChtc2cpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIENvbnRlbnRQYWNrYWdlLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1dvcmtQcm9kdWN0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzYWRhYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB3b3JrIHByb2R1Y3QuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuZGVsZWdhdGVJdGVtUHJvdmlkZXIgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGRlbGVnYXRlSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZUl0ZW1Qcm92aWRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChlT2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIoZU9iaiwgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoaXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBpdGVtUHJvdmlkZXIuZ2V0V29ya1Byb2R1Y3RzKCk7Ci0JCX0KLQkJcmV0dXJuIGVPYmo7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdF90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE91dGNvbWUpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfT3V0Y29tZV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJaWYgKCgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkgIT0gbnVsbCkgewotCQkJCVVSSSBpbWdVcmkgPSBUbmdVdGlsLmdldEZ1bGxQYXRob2ZOb2Rlb3JTaGFwZUljb25VUkkoCi0JCQkJCQkoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QsCi0JCQkJCQkoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpKTsKLQkJCQlPYmplY3QgaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFNoYXJlZEltYWdlKGltZ1VyaSk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQkJCXJldHVybiBpbWFnZTsKLQkJCX0KLQkJfQotCQlpZiAoZGVsZWdhdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlSXRlbVByb3ZpZGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9BcnRpZmFjdCIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0RlbGl2ZXJhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBPdXRjb21lKSB7Ci0JCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9PdXRjb21lIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLldvcmtQcm9kdWN0SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Xb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1dvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNGE5MzQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1dvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiV29yayBQcm9kdWN0cyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0cyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBcnRpZmFjdCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZURlbGl2ZXJhYmxlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlT3V0Y29tZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0FSVElGQUNUOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ERUxJVkVSQUJMRTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBPdXRjb21lKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19PVVRDT01FOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19XT1JLUFJPRFVDVDsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI25ld0NoaWxkQWRkZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoaWxkcmVuQ2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCVRuZ1V0aWwucmVmcmVzaFVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXJzKFVtYVV0aWwKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSB0YXJnZXQpLCBtc2cpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MmZiZjk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRpc3BsYXkgYW5kIGVkaXRpbmcgc3VwcG9ydCBmb3IgY29yZSBtZXRob2QgZWxlbWVudHMgYW5kIGd1aWRhbmNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pbnRlcm5hbC9UbmdBZGFwdGVyRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pbnRlcm5hbC9UbmdBZGFwdGVyRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzAyNmE4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaW50ZXJuYWwvVG5nQWRhcHRlckZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4cG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgYWRhcHRlciBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVG5nQWRhcHRlckZhY3RvcnlJbXBsIGltcGxlbWVudHMgVG5nQWRhcHRlckZhY3RvcnkgewotCQotCXByaXZhdGUgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IHdic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQotCXByaXZhdGUgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IG9ic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQotCXByaXZhdGUgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IHBic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlbXSB3YnNBZGFwdGVyRmFjdG9yaWVzID0gbnVsbDsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlbXSBvYnNBZGFwdGVyRmFjdG9yaWVzID0gbnVsbDsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlbXSBwYnNBZGFwdGVyRmFjdG9yaWVzID0gbnVsbDsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlbXSBwcm9jQWRhcHRlckZhY3RvcmllcyA9IG51bGw7Ci0KLQlwcml2YXRlIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBuYXZpZ2F0b3JBZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGNvbmZpZ3VyYXRpb25BZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGNvbmZpZ1Byb2Nlc3NWaWV3QWRhcHRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3RvcnkgcGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3Rvcnkgb2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3RvcnkgcHJvY0FkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFRuZ0FkYXB0ZXJGYWN0b3J5SW1wbCgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLlRuZ0FkYXB0ZXJGYWN0b3J5I2dldFdCU19BZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmICh3YnNBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAod2JzQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQl3YnNBZGFwdGVyRmFjdG9yeSA9IG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJCQkJZ2V0V0JTX0FkYXB0ZXJGYWN0b3JpZXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB3YnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLlRuZ0FkYXB0ZXJGYWN0b3J5I2dldE9CU19BZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChvYnNBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAob2JzQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlvYnNBZGFwdGVyRmFjdG9yeSA9IG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJCQkJZ2V0T0JTX0FkYXB0ZXJGYWN0b3JpZXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBvYnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLlRuZ0FkYXB0ZXJGYWN0b3J5I2dldFBCU19BZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChwYnNBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAocGJzQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlwYnNBZGFwdGVyRmFjdG9yeSA9IG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJCQkJZ2V0UEJTX0FkYXB0ZXJGYWN0b3JpZXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBwYnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5W10gZ2V0V0JTX0FkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCWlmICh3YnNBZGFwdGVyRmFjdG9yaWVzID09IG51bGwpIHsKLQkJCVdCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJCXdic0FkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQlmYWN0b3J5LAotCQkJCQkvLyBuZXcgQlNQcm9jZXNzdHlwZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeShmYWN0b3J5KSwKLQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH07Ci0JCX0KLQkJcmV0dXJuIHdic0FkYXB0ZXJGYWN0b3JpZXM7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIGdldE9CU19BZGFwdGVyRmFjdG9yaWVzKCkgewotCQlpZiAob2JzQWRhcHRlckZhY3RvcmllcyA9PSBudWxsKSB7Ci0JCQlPQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlvYnNBZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJZmFjdG9yeSwKLQkJCQkJLy8gbmV3IEJTUHJvY2Vzc3R5cGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoZmFjdG9yeSksCi0JCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCQl9Ci0JCXJldHVybiBvYnNBZGFwdGVyRmFjdG9yaWVzOwotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlbXSBnZXRQQlNfQWRhcHRlckZhY3RvcmllcygpIHsKLQkJaWYgKHBic0FkYXB0ZXJGYWN0b3JpZXMgPT0gbnVsbCkgewotCQkJUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCQkJcGJzQWRhcHRlckZhY3RvcmllcyA9IG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCWZhY3RvcnksCi0JCQkJCS8vIG5ldyBCU1Byb2Nlc3N0eXBlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KGZhY3RvcnkpLAotCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfTsKLQkJfQotCQlyZXR1cm4gcGJzQWRhcHRlckZhY3RvcmllczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2dldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobmF2aWdhdG9yQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKG5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJbmF2aWdhdG9yQWRhcHRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQkvLyBwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRGaWx0ZXJWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JLy8gaWYoZmlsdGVyQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCS8vIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0JLy8gaWYoZmlsdGVyQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCS8vIGZpbHRlckFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoCi0JLy8gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JLy8gbmV3IGNvbS5pYm0ubGlicmFyeS5lZGl0LmZpbHRlci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCS8vIG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKQotCS8vIH0pOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBmaWx0ZXJBZGFwdGVyRmFjdG9yeTsKLQkvLyB9Ci0JLy8gICAgCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0Q29uZmlndXJhdGlvblZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKGNvbmZpZ3VyYXRpb25BZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAoY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQkJCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5OwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNnZXROYXZpZ2F0b3JWaWV3X0ZpbHRlckFkYXB0ZXJGYWN0b3J5KGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldENvbmZpZ3VyYXRpb25WaWV3X0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyQWRhcHRlckZhY3RvcnkoCi0JCQkJZ2V0Q29uZmlndXJhdGlvblZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBmaWx0ZXIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZpbHRlckl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIEFkYXB0ZXIsCi0JCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hTZXQgQ0xBU1NFU19FWENMVURFRF9GUk9NX1NPUlRJTkcgPSBuZXcgSGFzaFNldCgpOwotCi0JCXN0YXRpYyB7Ci0JCQlDTEFTU0VTX0VYQ0xVREVEX0ZST01fU09SVElORy5hZGQoQWN0aXZpdHkuY2xhc3MpOwotCQkJQ0xBU1NFU19FWENMVURFRF9GUk9NX1NPUlRJTkcuYWRkKEN1c3RvbUNhdGVnb3J5LmNsYXNzKTsKLQkJfQotCi0JCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyOwotCi0JCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzQWRhcHRlckNvbmZpZ3VyYWJsZTsKLQotCQlGaWx0ZXJJdGVtUHJvdmlkZXIoSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyLCBJRmlsdGVyIGZpbHRlcikgewotCQkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLQkJCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhYmxlKSB7Ci0JCQkJaXNBZGFwdGVyQ29uZmlndXJhYmxlID0gdHJ1ZTsKLQkJCQkoKElDb25maWd1cmFibGUpIGFkYXB0ZXIpLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJfQotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWFkYXB0ZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI2dldFRhcmdldCgpCi0JCSAqLwotCQlwdWJsaWMgTm90aWZpZXIgZ2V0VGFyZ2V0KCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjc2V0VGFyZ2V0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgewotCQkJYWRhcHRlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJTGlzdCBjaGlsZHJlbiA9IG51bGw7Ci0JCQlmYWtlX2xvb3A6IGRvIHsKLQkJCQkKLQkJCQkvLyBPcmRlciBpcyBub3QgaW1wb3J0YW50LCBJZiBhZGFwdGVyIGlzIElMaWJyYXJ5SXRlbVByb3ZpZGVyCi0JCQkJLy8gYW5kIHJlcGxhY2VDaGlsZHJlbiBpcyBmYWxzZSBhbmQgSUNvbmZpZ3VyYWJsZSwgaXQgc2hvdWxkICAKLQkJCQkvLyBnbyB0byBpc0FkYXB0ZXJDb25maWd1cmFibGUsIG5vdCB0byByZWd1bGFyIGl0ZXJhdGlvbi4KLQotCQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yCi0JCQkJCQkmJiBhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSAoSUNvbmZpZ3VyYXRvcikgZmlsdGVyOwotCQkJCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJYm9vbGVhbiByZXBsYWNlQ2hpbGRyZW4gPSBmYWxzZTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikKLQkJCQkJCQkuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlDb2xsZWN0aW9uIG90aGVyQ2hpbGRyZW4gPSBjb25maWd1cmF0b3IuZ2V0Q2hpbGRyZW4oCi0JCQkJCQkJCW9iamVjdCwgZmVhdHVyZSk7Ci0JCQkJCQlpZiAob3RoZXJDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJCQkJcmVwbGFjZUNoaWxkcmVuID0gdHJ1ZTsKLQkJCQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElXcmFwcGVyKSB7Ci0JCQkJCQkJCUlXcmFwcGVyIHdyYXBwZXIgPSAoSVdyYXBwZXIpIGFkYXB0ZXI7Ci0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBvdGhlckNoaWxkcmVuCi0JCQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJCWNoaWxkcmVuLmFkZCh3cmFwcGVyLndyYXAoKEVPYmplY3QpIG9iamVjdCwKLQkJCQkJCQkJCQkJZmVhdHVyZSwgY2hpbGQsCi0JCQkJCQkJCQkJCUNvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWNoaWxkcmVuLmFkZEFsbChvdGhlckNoaWxkcmVuKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHJlcGxhY2VDaGlsZHJlbikgewotCQkJCQkJYnJlYWsgZmFrZV9sb29wOwotCQkJCQl9Ci0JCQkJfSAKLQkJCQlpZiAoaXNBZGFwdGVyQ29uZmlndXJhYmxlKSB7Ci0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCQkJaWYgKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCQljaGlsZHJlbiA9IChMaXN0KSBjb2xsZWN0aW9uOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KGNvbGxlY3Rpb24pOwotCQkJCQl9Ci0JCQkJCWJyZWFrIGZha2VfbG9vcDsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gcmVndWxhciBhZGFwdGVyCi0JCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmICghZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gd2hpbGUgKGZhbHNlKTsKLQotCQkJLy8gYWxwaGFiZXRpY2FsbHkgc29ydCB0aGUgY2hpbGRyZW4KLQkJCS8vCi0JCQlpZiAoIVRuZ1V0aWwuaXNJbnN0YW5jZU9mKENMQVNTRVNfRVhDTFVERURfRlJPTV9TT1JUSU5HLCBUbmdVdGlsCi0JCQkJCS51bndyYXAob2JqZWN0KSkpIHsKLQkJCQlDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuLAotCQkJCQkJQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCQl9Ci0KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsdGVySXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKCkgcmV0dXJuZWQgIiArCi0JCQkvLyBjaGlsZHJlbik7Ci0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgZWRpdGluZ0RvbWFpbiwKLQkJCQkJc2libGluZyk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLkNsYXNzLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcikKLQkJICovCi0JCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IG9iamVjdCwKLQkJCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIENsYXNzIGNvbW1hbmRDbGFzcywKLQkJCQlDb21tYW5kUGFyYW1ldGVyIGNvbW1hbmRQYXJhbWV0ZXIpIHsKLQkJCXJldHVybiBhZGFwdGVyLmNyZWF0ZUNvbW1hbmQob2JqZWN0LCBlZGl0aW5nRG9tYWluLCBjb21tYW5kQ2xhc3MsCi0JCQkJCWNvbW1hbmRQYXJhbWV0ZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldEVsZW1lbnRzKG9iamVjdCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IKLQkJCQkJJiYgYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJLy8gYWx3YXlzIHJldHVybiB0cnVlIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKLQkJCQkvLwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpewotCQkJCXJldHVybiBhZGFwdGVyLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRUZXh0KG9iamVjdCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5RGVzY3JpcHRvcihqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QsCi0JCQkJT2JqZWN0IHByb3BlcnR5SUQpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5SUQpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlI2dldEVkaXRhYmxlVmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRFZGl0YWJsZVZhbHVlKG9iamVjdCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZpbHRlckFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQWRhcHRlckZhY3RvcnksCi0JCQlJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsKLQotCQlwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQkJcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgRmlsdGVyQWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCQlJRmlsdGVyIGZpbHRlcikgewotCQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQkJaWYoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCX0KLQkJCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gYWRhcHRlckZhY3RvcnkuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkjYWRhcHQoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmplY3QsIHR5cGUpOwotCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCB8fCBhZGFwdGVyIGluc3RhbmNlb2YgRmlsdGVySXRlbVByb3ZpZGVyCi0JCQkJCXx8ICEoYWRhcHRlciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IEZpbHRlckl0ZW1Qcm92aWRlcigoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlciwgZmlsdGVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkjYWRhcHQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIsCi0JCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHRhcmdldCwgdHlwZSk7Ci0JCQlpZiAoYWRhcHRlciA9PSBudWxsIHx8IGFkYXB0ZXIgaW5zdGFuY2VvZiBGaWx0ZXJJdGVtUHJvdmlkZXIKLQkJCQkJfHwgIShhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJCXJldHVybiBuZXcgRmlsdGVySXRlbVByb3ZpZGVyKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyLCBmaWx0ZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSNhZGFwdE5ldyhvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllciwKLQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5LmFkYXB0TmV3KHRhcmdldCwgdHlwZSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2FkYXB0QWxsTmV3KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRhcHRBbGxOZXcoTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0QWxsTmV3KG5vdGlmaWVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyI2ZpcmVOb3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5LmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5LnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWZpbHRlciA9IG51bGw7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY3JlYXRlV0JTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlV0JTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBXQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVQdWJsaXNoaW5nV0JTQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdXQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nLldCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkKLQkJCQl9Ci0JCSk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY3JlYXRlVEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlVEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBPQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVB1Ymxpc2hpbmdUQlNBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ1RCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmcuVEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKQotCQkJCX0KLQkJKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlV1BCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcyA9IG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQluZXcgUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfTsKLQkJcmV0dXJuIG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCQlBYnN0cmFjdFBsdWdpbiBhdXRob3JpbmdQbHVnaW4gPSBQcm92aWRlcnMuZ2V0QXV0aG9yaW5nUGx1Z2luKCk7Ci0JCWlmIChhdXRob3JpbmdQbHVnaW4gIT0gbnVsbCkgewotCQkJSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBhdXRob3JpbmdQbHVnaW4uZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQlhZGFwdGVyRmFjdG9yeS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChQcm9jZXNzVXRpbAotCQkJCQkudG9Db2x1bW5JbmRleFRvTmFtZU1hcChwcmVmU3RvcmUKLQkJCQkJCQkuZ2V0U3RyaW5nKExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpKSk7Ci0JCX0KLQkJQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCWFkYXB0ZXJGYWN0b3J5LCBuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfTsKLQotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQkvLyBTZWN0aW9uIGZvciBUTkcgRmlsdGVyIG1vZGlmaWNhdGlvbiBwcm9jZXNzLgotCS8vIGZpbHRlciBtb2RpZmljYXRpb24gY29kZS4gU2ltaWxhciB0byBnZXRGaWx0ZXJWaWV3X0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIKLQkvLyBmaWx0ZXIpCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyQWRhcHRlckZhY3RvcnkoCi0JCQkJZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBmaWx0ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKGl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKGl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQkJCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGl0ZW1zRmlsdGVyQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFBCU0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlckFkYXB0ZXJGYWN0b3J5KGdldFBCU0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJZmlsdGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRQQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKHBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAocGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJcGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQkJCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0T0JTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyQWRhcHRlckZhY3RvcnkoZ2V0T0JTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQlmaWx0ZXIpOwotCX0KLQotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldE9CU0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAob2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gb2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAocHJvY0FkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChwcm9jQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJQWJzdHJhY3RQbHVnaW4gYXV0aG9yaW5nUGx1Z2luID0gUHJvdmlkZXJzLmdldEF1dGhvcmluZ1BsdWdpbigpOwotCQkJCQlpZiAoYXV0aG9yaW5nUGx1Z2luICE9IG51bGwpIHsKLQkJCQkJCUlQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gYXV0aG9yaW5nUGx1Z2luCi0JCQkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChQcm9jZXNzVXRpbAotCQkJCQkJCQkJCS50b0NvbHVtbkluZGV4VG9OYW1lTWFwKHByZWZTdG9yZQotCQkJCQkJCQkJCQkJLmdldFN0cmluZyhMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSkpOwotCQkJCQkJcHJlZlN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBJbml0aWFsaXplICJhdXRvIGluaGVyaXQgc3VwcHJlc3Npb24gc3RhdGVzIiBmbGFnIGZvciBjYWxjdWxhdGluZyBzdXBwcmVzc2lvbgotCQkJCQkvLyBhbmQgYWRkIGxpc3RlbmVyIHRvIGl0cyBjaGFuZ2UKLQkJCQkJLy8KLQkJCQkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBhdXRob3JpbmdQbHVnaW4uZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQkJCVN1cHByZXNzaW9uLnNldEF1dG9Jbmhlcml0U3VwcHJlc3Npb25TdGF0ZXMocHJlZlN0b3JlLmdldEJvb2xlYW4oTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFKSk7Ci0JCQkJCXByZWZTdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJCWlmKExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkpIHsKLQkJCQkJCQkJU3VwcHJlc3Npb24uc2V0QXV0b0luaGVyaXRTdXBwcmVzc2lvblN0YXRlcyhwcmVmU3RvcmUuZ2V0Qm9vbGVhbihMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfSk7Ci0JCQkJCi0JCQkJCXByb2NBZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCWFkYXB0ZXJGYWN0b3J5LAotCQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCi0JCQkJCXByb2NBZGFwdGVyRmFjdG9yeSA9IG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJCQkJcHJvY0FkYXB0ZXJGYWN0b3JpZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBwcm9jQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCVN1cHByZXNzaW9uLmNsZWFyQ2FjaGVkU3VwcHJlc3Npb25zKCk7Ci0KLQkJVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0KLQkJaWYgKG5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCW5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmIChpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmIChvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJb2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCW9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmIChwYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCXBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQkJCi0JCQotCQlpZiAoY29uZmlnUHJvY2Vzc1ZpZXdBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQljb25maWdQcm9jZXNzVmlld0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmIChjb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmICh3YnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQl3YnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQl3YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQotCQlpZiAob2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJb2JzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJb2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl9Ci0KLQkJaWYgKHBic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCXBic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCi0JCWlmIChwcm9jQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJLy8gcmVtb3ZlIGFkYXB0ZXIgZmFjdG9yeSBhcyBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbQotCQkJLy8gcHJlZmVyZW5jZSBzdG9yZQotCQkJLy8KLQkJCUFic3RyYWN0UGx1Z2luIGF1dGhvcmluZ1BsdWdpbiA9IFByb3ZpZGVycy5nZXRBdXRob3JpbmdQbHVnaW4oKTsKLQkJCWlmIChhdXRob3JpbmdQbHVnaW4gIT0gbnVsbCkgewotCQkJCUlQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gYXV0aG9yaW5nUGx1Z2luCi0JCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jQWRhcHRlckZhY3Rvcmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlPYmplY3QgYWRhcHRlckZhY3RvcnkgPSBwcm9jQWRhcHRlckZhY3Rvcmllc1tpXTsKLQkJCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIHsKLQkJCQkJCXByZWZTdG9yZQotCQkJCQkJCQkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXByb2NBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQlwcm9jQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVQdWJsaXNoaW5nQ0JTQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdDQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nLkNCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkKLQkJCQl9Ci0JCSk7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVB1Ymxpc2hpbmdXUEJTQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdXUEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCW5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZy5XUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKQotCQkJCX0KLQkJKTsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY2xlYW5VcCgpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcCgpIHsKLQkJU3VwcHJlc3Npb24uY2xlYW5VcCgpOwotCi0JCWlmIChuYXZpZ2F0b3JBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQluYXZpZ2F0b3JBZGFwdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQotCQlpZiAoaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCQkKLQkJaWYgKG9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0JCQotCQlpZiAocGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQkJCi0JCQotCQlpZiAoY29uZmlnUHJvY2Vzc1ZpZXdBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQljb25maWdQcm9jZXNzVmlld0FkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCi0JCWlmIChjb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCi0JCWlmICh3YnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQl3YnNBZGFwdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQotCQlpZiAob2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJb2JzQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0KLQkJaWYgKHBic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBic0FkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCi0JCWlmIChwcm9jQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcHJvY0FkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2ludGVybmFsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyNGZlNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRpc3BsYXkgYW5kIGVkaXRpbmcgc3VwcG9ydCBmb3IgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTIwYTRiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGFuIGFjdGl2aXR5IGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24KLSAqIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBNaWxlc3RvbmUpcmV0dXJuIHRydWU7Ci0JCQotCQlyZXR1cm4gc3VwZXIuYWNjZXB0QXNDaGlsZChjaGlsZCk7Ci0JfQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCUZpbHRlclV0aWwKLQkJCQkuaXRlcmF0ZUNvbGxlY3Rpb24oY29sLCBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpKTsKLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MDQ2MWYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBhY3Rpdml0eSBpbiB0aGUKLSAqIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gYWRkSW5oZXJpdGVkKE9iamVjdCBvYmplY3QsIExpc3QgbXlDaGlsZHJlbikgewotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmFkZEluaGVyaXRlZChvYmplY3QsIG15Q2hpbGRyZW4pOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2wuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJc3VwZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWQxNzUxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ2FwYWJpbGl0eSBQYXR0ZXJucyIgYW5kICJEZWxpdmVyeQotICogUHJvY2Vzc2VzIiBmb2xkZXJzIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQkvLyBwcml2YXRlIFN0cmluZ1tdIHBrZ1BhdGg7Ci0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXByaXZhdGUgT2JqZWN0IGltYWdlOwotCi0JLy8gcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwotCXByaXZhdGUgTWV0aG9kUGFja2FnZSBwa2c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZFBhY2thZ2UgcGtnLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGltYWdlKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJbGFiZWwgPSBuYW1lOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JCXRoaXMucGtnID0gcGtnOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlPYmplY3QgY2hpbGQgPSBlbGVtZW50OwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJY2hpbGQgPSAoKFByb2Nlc3NDb21wb25lbnQpIGVsZW1lbnQpLmdldFByb2Nlc3MoKTsKLQkJCX0KLQkJCWlmIChmaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCWlmICghaXNFbXB0eVBhY2thZ2UoY2hpbGQpKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gY2hpbGRQYWNrYWdlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSAoKFByb2Nlc3NQYWNrYWdlKSBvYmplY3QpLmdldENoaWxkUGFja2FnZXMoKTsKLQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQluZXdMaXN0LmFkZEFsbChjaGlsZHJlbik7Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdMaXN0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW1wdHlQYWNrYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgfHwgb2JqZWN0IGluc3RhbmNlb2YgUHJvY2VzcykKLQkJCXJldHVybiBmYWxzZTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHRoaXMuY2hpbGRQYWNrYWdlcyhvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmICghaXNFbXB0eVBhY2thZ2UoaXRlci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBzdXBlci5nZXROZXdDaGlsZERlc2NyaXB0b3JzKHRhcmdldCwgZWRpdGluZ0RvbWFpbiwgc2libGluZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYmVkY2QxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgY29udGVudCBjYXRlZ29yeSBmb2xkZXJzIGluIHRoZSBtZXRob2QKLSAqIGVsZW1lbnQgc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElDb25maWd1cmFibGUgewotCi0JSUZpbHRlciBmaWx0ZXI7Ci0KLQlPYmplY3QgaW1hZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTm90aWZpZXIgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyByZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykgfHwgKG9iaiBpbnN0YW5jZW9mCi0JCS8vIERpc2NpcGxpbmUgJiYKLQkJLy8gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSlvYmopLmlzRW1wdHkoKSk7Ci0JCWlmICghdGhpcy5maWx0ZXIuYWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lCi0JCQkJJiYgIUFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVHcm91cHMoKERpc2NpcGxpbmUpIG9iaikKLQkJCQkJCS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0Ci0JCQkJJiYgIUFzc29jaWF0aW9uSGVscGVyLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpIG9iaikuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGFjY2VwdChvYmopOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBjb250ZW50QWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGNvbnRlbnRBZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBjb250ZW50QWRhcHRlcikuc2V0UGFyZW50KG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJdGhpcy5pbWFnZSA9IG9iamVjdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzY4OWU0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5UcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgY29udGVudCBjYXRlZ29yeSBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29uZmlndXJhYmxlIHsKLQotCUlGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTm90aWZpZXIgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGZpbHRlci5hY2NlcHQob2JqKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGNvbnRlbnRBZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoY29udGVudEFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGNvbnRlbnRBZGFwdGVyKS5zZXRQYXJlbnQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzdlMDkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgZm9sZGVycyBpbiB0aGUgbWV0aG9kCi0gKiBlbGVtZW50IHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQ29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTm90aWZpZXIgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuQ29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGNoaWxkcmVuQ29sLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIxLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElDb25maWd1cmFibGUpCi0JCQkJKChJQ29uZmlndXJhYmxlKSBjaGlsZCkuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCWl0ZXIxLnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkNvbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAxN2U2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgY29udGVudCBwYWNrYWdlIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbkluY2x1ZGluZ0VtcHR5T25lcyhvYmplY3QpOwotCi0JCS8vIHJlbW92ZSB0aGUgZW1wdHkgcGFja2FnZXMgZnJvbSB0aGUgY2hpbGRyZW4gbGlzdAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmIChpc0VtcHR5UGFja2FnZShpdGVyLm5leHQoKSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkluY2x1ZGluZ0VtcHR5T25lcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWlmICghZmlsdGVyLmFjY2VwdChpdGVyLm5leHQoKSkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eVBhY2thZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuSW5jbHVkaW5nRW1wdHlPbmVzKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKCFpc0VtcHR5UGFja2FnZShpdGVyLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0N1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIzYzkyNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0N1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBjdXN0b20gY2F0ZWdvcnkgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0KLQlJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gU2V0IHRoZSBjaGlsZHJlblN0b3JlTWFwIHRvIG51bGwsIHRvIGdldCB0aGUgdXBkYXRlZCBjdXN0b21jYXRlZ29yaWVzCi0JCWNoaWxkcmVuU3RvcmVNYXAgPSBudWxsOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKHRoaXMuZmlsdGVyICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIgb2JqID0gKEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZXIKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJaWYgKCF0aGlzLmZpbHRlci5hY2NlcHQob2JqLmdldFZhbHVlKCkpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNmY1ODMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRpc2NpcGxpbmUgZ3JvdXBpbmcgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUsIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkpOwotCQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW47Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQotCQkJLy8gVE9ETzogY29tbWVudGVkIG91dCB1bnRpbCBKaW5odWEgZml4ZWQgYnVncyBpbgotCQkJLy8gQ29uZmlndXJhdGlvbkZpbHRlcgotCQkJaWYgKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQkJY2hpbGRyZW4gPSBjb25maWd1cmF0b3IuZ2V0Q2hpbGRyZW4ob2JqZWN0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpKTsKLQkJCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIkRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbigpOiByZXR1cm5lZCBmcm9tIGNvbmZpZ3VyYXRvcjogIiArIGNoaWxkcmVuKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gY2hpbGRyZW47Ci0JCQkJfQotCQkJfQotCi0JCQljaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlEaXNjaXBsaW5lR3JvdXBpbmcgZ3JvdXBpbmcgPSAoRGlzY2lwbGluZUdyb3VwaW5nKSBvYmplY3Q7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmYgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgKChDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSBnZXRQYXJlbnQob2JqZWN0KSkKLQkJCQkJLmdldFRhcmdldCgpOwotCQkJVG5nVXRpbC5hZGRFeHRlbmRlZENoaWxkcmVuKGdyb3VwaW5nLCBtZXRob2RDb25mLCBjaGlsZHJlbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCi0JCQkvLyBzZXQgcGFyZW50Ci0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChpdGVyLm5leHQoKSwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0gZWxzZSB7Ci0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuQ29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuQ29sLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkKLQkJCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2hpbGRyZW5Db2w7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JCS8vIGlmKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJLy8gTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkvLyBpZihwbHVnaW4gIT0gbnVsbCkgewotCQkvLyBTdHJpbmdbXSBwYXRoID0gewotCQkvLyBUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCS8vICxUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKQotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vICxUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLyB9OwotCQkvLyBPYmplY3QgYWRhcHRlciA9Ci0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikuYWRhcHQocGx1Z2luLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyAvLyBJR3JvdXBDb250YWluZXIgZ3JvdXBzID0gKElHcm91cENvbnRhaW5lcikKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKS5hZGFwdChwbHVnaW4sCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIC8vIGludCBpOwotCQkvLyAvLyBmb3IoaSA9IDA7IGkgPCBwYXRoLmxlbmd0aCAtIDE7IGkrKykgewotCQkvLyAvLyBncm91cHMgPSAoSUdyb3VwQ29udGFpbmVyKSBncm91cHMuZ2V0R3JvdXBJdGVtUHJvdmlkZXIocGF0aFtpXSk7Ci0JCS8vIC8vIGlmKGdyb3VwcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJLy8gLy8gfQotCQkvLyAvLyByZXR1cm4gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGdyb3Vwcy5nZXRHcm91cEl0ZW1Qcm92aWRlcihwYXRoW2ldKTsKLQkJLy8gcmV0dXJuIFRuZ1V0aWwuZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpOwotCQkvLyAvL3JldHVybiBhZGFwdGVyOwotCQkvLyB9Ci0JCS8vIH0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzZiMjlkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRpc2NpcGxpbmUgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkRpc2NpcGxpbmVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0JT2JqZWN0IHBhcmVudDsKLQotCXB1YmxpYyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNvbDsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChvYmplY3QpOwotCQkKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQkKLQkJfSBlbHNlIHsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChvYmplY3QsCi0JCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWNvbCA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCUZpbHRlclV0aWwuaXRlcmF0ZUNvbGxlY3Rpb24oY29sLCBmaWx0ZXIpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgb2JqZWN0OwotCQlpZiAoZGlzY2lwbGluZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJTWV0aG9kUGx1Z2luIG1vZGVsID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZGlzY2lwbGluZSk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJc3VwZXIuc2V0UGFyZW50KHBhcmVudCk7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMmJmOGQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Eb21haW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRvbWFpbiBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERvbWFpbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5Eb21haW5JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlIHsKLQlPYmplY3QgcGFyZW50OwotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRG9tYWluSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCURvbWFpbiBkb21haW4gPSAoRG9tYWluKSBvYmplY3Q7Ci0JCWlmIChkb21haW4uZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJTWV0aG9kUGx1Z2luIG1vZGVsID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZG9tYWluKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQlzdXBlci5zZXRQYXJlbnQocGFyZW50KTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNvbDsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChvYmplY3QpOwotCQkKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQkKLQkJfSBlbHNlIHsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChvYmplY3QsCi0JCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWNvbCA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCQkvLyBJZiBmaWx0ZXIgbm90IG51bGwgaXRlcmF0ZSBjb2xsZWN0aW9uLgotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCUZpbHRlclV0aWwuaXRlcmF0ZUNvbGxlY3Rpb24oY29sLCBmaWx0ZXIpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVyQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmMmMyZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotCi0vKioKLSAqIERlZmluZXMgdGhlIGdsb2JhbCBjb25zdGFudHMgdXNlZCBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyQ29uc3RhbnRzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DQVRFR09SSUVTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2N1c3RvbWNhdGVnb3JpZXNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9fUExVR0lOUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19tZXRob2RwbHVnaW5zX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfUEFDS0FHRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfY29udGVudHBhY2thZ2VzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVTRVRTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NJUExJTkVTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktQUk9EVUNUVFlQRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3R0eXBlc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET01BSU5TID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfdG9vbHNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX0VMRU1FTlRTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2FsbF90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c190YXNrc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLUFJPRFVDVFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURBTkNFID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2d1aWRhbmNlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19wcm9jZXNzZXNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9ERVNDUklQVE9SUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19yb2xlZGVzY3JpcHRvcnNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19ERVNDUklQVE9SUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c190YXNrZGVzY3JpcHRvcnNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05MWV9DT05URU5UX0VMRU1FTlRTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRlbGVtZW50c190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfQ09OVEVOVF9FTEVNRU5UID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2FsbGNvbnRlbnRlbGVtZW50c190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0FETUFQID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JvYWRtYXBfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tMSVNUUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19jaGVja2xpc3RzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkNFUFRTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2NvbmNlcHRzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSQUNUSUNFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19wcmFjdGljZXNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1JUUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19yZXBvcnRzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVVNBQkxFX0FTU0VUUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19yZXVzYWJsZWFzc2V0c190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURV9QQVBFUlMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfd2hpdGVwYXBlcnNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3RlbXBsYXRlc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlERUxJTkVTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2d1aWRlbGluZXNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQUE9SVElOR19NQVRFUklBTFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX01FTlRPUlMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfdG9vbG1lbnRvcnNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhBTVBMRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfZXhhbXBsZXNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9TRVRfR1JPVVBJTkdTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0lQTElORV9HUk9VUElOR1MgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZWdyb3VwaW5nc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwotCi0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gR1VJREFOQ0VfVFlQRVMgPSBuZXcgU3RyaW5nW117Ci0JLy8gQ0hFQ0tMSVNUUywgQ09OQ0VQVFMsIEVYQU1QTEVTLCBQUkFDVElDRVMsIFJFUE9SVFMsIFJFVVNBQkxFX0FTU0VUUywKLQkvLyBTVVBQT1JUSU5HX01BVEVSSUFMUywgVEVNUExBVEVTLCBUT09MX01FTlRPUlMsIFdISVRFX1BBUEVSUywKLQkvLyBHVUlERUxJTkVTLFJPQURNQVB9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT05URU5UX0VMRU1FTlRTID0gbmV3IFN0cmluZ1tdIHsgUk9MRVMsCi0JCQlUQVNLUywgV09SS1BST0RVQ1RTLCBHVUlEQU5DRSwgU1VQUE9SVElOR19NQVRFUklBTFMsCi0JCQlPTkxZX0NPTlRFTlRfRUxFTUVOVFMsIFRPT0xfTUVOVE9SUyB9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT05URU5UX0NBVEVHT1JJRVMgPSBuZXcgU3RyaW5nW10geyBST0xFU0VUUywKLQkJCVdPUktQUk9EVUNUVFlQRVMsIERJU0NJUExJTkVTLCBUT09MUywgRE9NQUlOUyB9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBCUkVBS0RPV05fRUxFTUVOVFMgPSBuZXcgU3RyaW5nW10gewotCQkJV09SS19QUk9EVUNUX0RFU0NSSVBUT1JTLCBUQVNLX0RFU0NSSVBUT1JTLCBST0xFX0RFU0NSSVBUT1JTIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgY29udGVudEVsZW1lbnRTdHJzID0gQXJyYXlzCi0JCQkuYXNMaXN0KENPTlRFTlRfRUxFTUVOVFMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IGNhdGVnb3J5U3RycyA9IEFycmF5cy5hc0xpc3QoQ09OVEVOVF9DQVRFR09SSUVTKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBicmVha2Rvd25FbGVtZW50cyA9IEFycmF5cwotCQkJLmFzTGlzdChCUkVBS0RPV05fRUxFTUVOVFMpOwotCi0JcHVibGljIHN0YXRpYyBIYXNoTWFwIGhhc2hNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHNwYWNlID0gIi0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNUSU1BVEVfQ09OU0lERVJBVElPTlMgPSBMaWJyYXJ5RWRpdFBsdWdpbgotCQkJLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fREVGSU5JVElPTlMgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKQotCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19UZXJtRGVmaW5pdGlvbnMiKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTllfU1RSSU5HID0gIioiOyAgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTllfQ0hBUkFDVEVSID0gIj8iOyAgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDMxMzRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgbWFuYWdpbmcgZWxlbWVudCBmaWx0ZXJpbmcgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJIZWxwZXIgewotCi0JcHJpdmF0ZSBTdHJpbmcgcGF0dGVybjsKLQotCXByaXZhdGUgU3RyaW5nIHR5cGU7Ci0KLQlwcml2YXRlIFBhdHRlcm4gcmVnZXg7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWJTdHI7Ci0KLQlwcml2YXRlIE9iamVjdCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIHNob3dQcmVzZW50YXRpb25OYW1lID0gZmFsc2U7Ci0JCi0JLy8gVGhpcyBpcyBzZXBhcmF0ZSBoYW5kbGluZyBmb3IgQ29udGVudENvbnRlZ29yeSAKLQlwcml2YXRlIFN0cmluZyBjb250ZW50Q2F0ZWdvcnlUYWJTdHI7Ci0KLQlwdWJsaWMgRmlsdGVySGVscGVyKE9iamVjdCBjb250ZW50RWxlbWVudCwgU3RyaW5nIHRhYlN0ciwgU3RyaW5nIHBhdHRlcm4sCi0KLQlTdHJpbmcgZmlsdGVyVHlwZVN0ciwgTGlzdCBhbHJlYWR5U2VsZWN0ZWRMaXN0KSB7Ci0KLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCi0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCi0JCXRoaXMudHlwZSA9IGZpbHRlclR5cGVTdHI7Ci0KLQkJdGhpcy5leGlzdGluZ0VsZW1lbnRzID0gYWxyZWFkeVNlbGVjdGVkTGlzdDsKLQotCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwotCi0JCXNob3dQcmVzZW50YXRpb25OYW1lID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRQotCQkuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKTsKLQotCi0JfQotCS8qCi0JICogbWV0aG9kIHRvIHNldCBjb250ZW50Q2F0ZWdvcnlUYWJTdHIsIHRoaXMgCi0JICogc3BlY2lhbCBoYW5kbGUgZm9yIGNvbnRlbnQgY2F0ZWdvcnksIHRhYlN0ciBpbXBsZW1lbnRhdGlvbiAKLQkgKiBkb25vdCB3b3JrIGZvciB0aGlzLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50Q2F0ZWdvcnlUYWJTdHIoU3RyaW5nIGNvbnRlbnRDYXRlZ29yeVRhYlN0cil7Ci0JCXRoaXMuY29udGVudENhdGVnb3J5VGFiU3RyID0gY29udGVudENhdGVnb3J5VGFiU3RyOwotCX0KLQkvKgotCSAqIG1ldGhvZCB0byBzZXQgY29udGVudENhdGVnb3J5VGFiU3RyLCB0aGlzIAotCSAqIHNwZWNpYWwgaGFuZGxlIGZvciBjb250ZW50IGNhdGVnb3J5LCB0YWJTdHIgaW1wbGVtZW50YXRpb24gCi0JICogZG9ub3Qgd29yayBmb3IgdGhpcy4gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50Q2F0ZWdvcnlUYWJTdHIoKXsKLQkJcmV0dXJuIHRoaXMuY29udGVudENhdGVnb3J5VGFiU3RyOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFscmVhZHlTZWxlY3RlZExpc3QoKSB7Ci0KLQkJcmV0dXJuIGV4aXN0aW5nRWxlbWVudHM7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KExpc3QgYWxyZWFkeVNlbGVjdGVkTGlzdCkgewotCi0JCXRoaXMuZXhpc3RpbmdFbGVtZW50cyA9IGFscmVhZHlTZWxlY3RlZExpc3Q7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaFBhdHRlcm4oT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbWF0Y2gob2JqKTsKLQl9Ci0KLQkvKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFueSBDYXRlZ29yaXplZEVsZW1lbnRzICh0cmVlIHRyYXZlcnNhbCkgb2YKLQkgKiBDdXN0b21DYXRlZ29yeSBoYXMgYW55IG1hdGNoIHdpdGggbWF0Y2hlci4gQHBhcmFtIEN1c3RvbUNhdGVnb3J5Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoZWRDaGlsZEN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IHRvcENhdGVnb3J5KSB7Ci0JCUxpc3QgbGlzdCA9IHRvcENhdGVnb3J5LmdldENhdGVnb3JpemVkRWxlbWVudHMoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdDsKLQkJCQlpZiAobWF0Y2hlcihjYXRlZ29yeSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkQ2hpbGRDdXN0b21DYXRlZ29yeShjYXRlZ29yeSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFueSBzdWJBcnRpZmFjdHMgKHRyZWUgdHJhdmVyc2FsKSBvZiBBcnRpZmFjdAotCSAqIGhhcyBhbnkgbWF0Y2ggd2l0aCBtYXRjaGVyLiBAcGFyYW0gQ3VzdG9tQ2F0ZWdvcnkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZEFydGlmYWN0KEFydGlmYWN0IGFydGlmYWN0KSB7Ci0KLQkJTGlzdCBsaXN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQlBcnRpZmFjdCBzdWJhcnRpZmFjdCA9IChBcnRpZmFjdCkgb2JqZWN0OwotCQkJCWlmIChtYXRjaGVyKHN1YmFydGlmYWN0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGhhc01hdGNoZWRBcnRpZmFjdChzdWJhcnRpZmFjdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiBDb252ZW5pZW50IG1ldGhvZCB0byBjaGVjayBhbnkgc3ViQXJ0aWZhY3RzICh0cmVlIHRyYXZlcnNhbCkgb2YgQXJ0aWZhY3QKLQkgKiBoYXMgYW55IG1hdGNoIHdpdGggIGFscmVhZHlleGlzdGluZyBlbGVtZW50cy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZEFydGlmYWN0KEFydGlmYWN0IGFydGlmYWN0LCBMaXN0IGV4aXN0aW5nTGlzdCkgewotCi0JCUxpc3QgbGlzdCA9IGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJQXJ0aWZhY3Qgc3ViYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIG9iamVjdDsKLQkJCQlpZighZXhpc3RpbmdMaXN0LmNvbnRhaW5zKHN1YmFydGlmYWN0KSl7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gY2hlY2sgYW55IENoaWxkUGFja2FnZXMgKHRyZWUgdHJhdmVyc2FsKSBvZiBDb250ZW50Ci0JICogUGFja2FnZSBoYXMgYW55IG1hdGNoIHdpdGggbWF0Y2hlci4KLQkgKiAKLQkgKiBAcGFyYW0gQ3VzdG9tQ2F0ZWdvcnkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZENoaWxkKENvbnRlbnRQYWNrYWdlIHBrZykgewotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGRQa2cgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZFBrZyBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZyA9IChDb250ZW50UGFja2FnZSkgY2hpbGRQa2c7Ci0JCQkJaWYgKG1hdGNoZXIoY29udGVudFBrZykpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkQ2hpbGQoY29udGVudFBrZykpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFueSBzdWJEb21haW4gKHRyZWUgdHJhdmVyc2FsKSBvZiBEb21haW4gaGFzCi0JICogYW55IG1hdGNoIHdpdGggbWF0Y2hlciA8bGluaz5tYXRjaGVyKE9iamVjdCBvYmopPC9saW5rPgotCSAqIAotCSAqIEBwYXJhbSBDdXN0b21DYXRlZ29yeQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkU3ViRG9tYWlucyhEb21haW4gZG9tYWluKSB7Ci0JCUxpc3QgbGlzdCA9IGRvbWFpbi5nZXRTdWJkb21haW5zKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBzdWJkb21haW4gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobWF0Y2hlcihzdWJkb21haW4pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGhhc01hdGNoZWRTdWJEb21haW5zKChEb21haW4pIHN1YmRvbWFpbikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkU3ViRGlzY2lwbGluZShEaXNjaXBsaW5lIGRpc2NpcGxpbmUpewotCQlMaXN0IGxpc3QgPSBkaXNjaXBsaW5lLmdldFN1YmRpc2NpcGxpbmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHN1YmRpc2NpcGxpbmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobWF0Y2hlcihzdWJkaXNjaXBsaW5lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkU3ViRGlzY2lwbGluZSgoRGlzY2lwbGluZSkgc3ViZGlzY2lwbGluZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkRGlzY2lwbGluZXMoRGlzY2lwbGluZUdyb3VwaW5nIGdyb3VwaW5nKXsKLQkJTGlzdCBsaXN0ID0gZ3JvdXBpbmcuZ2V0RGlzY2lwbGluZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHN1YmRpc2NpcGxpbmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobWF0Y2hlcihzdWJkaXNjaXBsaW5lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkU3ViRGlzY2lwbGluZSgoRGlzY2lwbGluZSkgc3ViZGlzY2lwbGluZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWx0ZXJUeXBlU3RyKCkgewotCi0JCS8vIFRyaW0gIi0iKGh5cGhlbikgZnJvbSB0aGUgc3RyaW5ncyAodHlwZXMpLiAgT25seSBpbiBjYXNlIG1ldGhvZHBsdWdpbgotCQkvLyBkb24ndCB0cmltICItIiBiZWNhdXNlIG1ldGhvZHBsdWctaW4gY29udGFpbiAiLSIgKGh5cGhlbilhbmQgdXNlZnVsLgotCQl3aGlsZSAodHlwZSAhPSBudWxsICYmIHR5cGUuaW5kZXhPZihGaWx0ZXJDb25zdGFudHMuc3BhY2UpID4gLTEKLQkJCQkmJiAhdHlwZS5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlMpKSB7Ci0JCQl0eXBlID0gdHlwZS5zdWJzdHJpbmcodHlwZS5pbmRleE9mKEZpbHRlckNvbnN0YW50cy5zcGFjZSkgKyAxLCB0eXBlCi0JCQkJCS5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCkgewotCi0JCXJldHVybiBwYXR0ZXJuOwotCi0JfQotCi0JcHVibGljIFBhdHRlcm4gZ2V0UmVnZXhQYXR0ZXJuKCkgewotCi0JCXJldHVybiByZWdleDsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFiU3RyKCkgewotCi0JCXJldHVybiB0YWJTdHI7Ci0KLQl9Ci0KLQkvKgotCSAqIAotCSAqIE1ldGhvZCBjaGVja3Mgd2hldGhlciBhcmJpdHJhcnkgb2JqZWN0IHBhc3NlZCBpcwotCSAqIAotCSAqIGVxdWFsIHRvIGN1cnJlbnQgY29udGVudCBlbGVtZW50J3MgdmFyaWFiaWxpdHkgb3Igbm90LgotCSAqIAotCSAqIElmIHZhcmlhYmlsaXR5IG9mIENvbnRlbnRFbGVtZW50IG1hdGNoZXMgYXJiaXRyYXJ5IG9iamVjdCwKLQkgKiAKLQkgKiByZXR1cm5zIHRydWUuCi0JICogCi0JICogQHJldHVuIGJvb2xlYW4uCi0JICogCi0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1ZhcmlhYmlsaXR5KE9iamVjdCBvYmopIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQotCQkJT2JqZWN0IHZhcmlhYmlsaXR5T2JqZWN0ID0gKChDb250ZW50RWxlbWVudCkgY29udGVudEVsZW1lbnQpCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAodmFyaWFiaWxpdHlPYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmouZXF1YWxzKHZhcmlhYmlsaXR5T2JqZWN0KSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0KLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50OwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGVudEVsZW1lbnQoT2JqZWN0IGNvbnRlbnRFbGVtZW50KSB7Ci0KLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyVHlwZVN0cihTdHJpbmcgZmlsdGVyVHlwZVN0cikgewotCi0JCXRoaXMudHlwZSA9IGZpbHRlclR5cGVTdHI7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7Ci0KLQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZ2V4UGF0dGVybihQYXR0ZXJuIHJlZ2V4UGF0dGVybikgewotCi0JCXRoaXMucmVnZXggPSByZWdleFBhdHRlcm47Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWJTdHIoU3RyaW5nIHRhYlN0cikgewotCi0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCi0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFBhdGhCYXNlZE9uVGFiU3RyaW5nKFN0cmluZyB0YWJTdHIpIHsKLQotCQlpZiAoRmlsdGVyQ29uc3RhbnRzLmNvbnRlbnRFbGVtZW50U3Rycy5jb250YWlucyh0YWJTdHIpKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGg7Ci0JCX0gZWxzZSBpZiAodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFMpCi0JCQkJfHwgdGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9MRV9TRVRfR1JPVVBJTkdTKSkgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGg7Ci0JCX0gZWxzZSBpZiAodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVMpCi0JCQkJfHwgdGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORV9HUk9VUElOR1MpKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGg7Ci0JCX0gZWxzZSBpZiAodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVE9PTFMpKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aDsKLQkJfSBlbHNlIGlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTKSkgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aDsKLQkJfSBlbHNlIGlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ET01BSU5TKSkgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aDsKLQkJfSBlbHNlIGlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUykpIHsKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGg7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBUaGlzIGlzIGNvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFsbCB0aGUgY29uZGl0aW9uLCBsaWtlIG1hdGNoUGF0dGVybiwKLQkgKiBpZiBvYmplY3QgZXhpc3RzIGluIGFscmVhZHkgc2VsZWN0ZWQgbGlzdCwgY2hlY2sgdmFyaWFiaWxpdHkgbWF0Y2gsIGFuZAotCSAqIGlzIG9iamVjdCBpdHNlbGYgZG9ub3QgZGlzcGxheS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja09iamVjdEFjY2VwdGVkKE9iamVjdCBvYmopIHsKLQotCQlpZiAoIW1hdGNoKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIENoZWNrIGlmIGFscmVhZHkgZXhpc3RpbmcgKGFzc29jaWF0ZWQgZWxlbWVudHMpIGRvbid0IGRpc3BsYXkuCi0JCWlmIChnZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgIT0gbnVsbAotCQkJCSYmIGdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKXsKLQkJCS8vIHNwZWNpYWwgY2FzZSBoYW5kbGluZyBmb3IgQXJ0aWZhY3QgYW5kIHN1Yi1hcnRpZmFjdC4KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KXsKLQkJCQlpZighaGFzTWF0Y2hlZEFydGlmYWN0KChBcnRpZmFjdClvYmosZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfWVsc2V7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNoZWNrVmFyaWFiaWxpdHkob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBpZiBvYmplY3QgaXRzZWxmIGRvbid0IGRpc3BsYXkKLQkJLy8gRG8gZXF1YWwgY2hlY2sgb25seSBvbiBlbGVtZW50cyBvdGhlcnRoYW4gbWV0aG9kIHBsdWdpbiwgSW4gY2FzZSBvZgotCQkvLyBDb3B5cmlnaHQoc3VwcG9ydGluZyBtYXRlcmlhbCkgYXNzb2NpYXRpbmcgdG8gbWV0aG9kcGx1Z2luLCBpZgotCQkvLyBtZXRob2RwbHVnaW4gKGNvbnRlbnRFbGVtdG4pIGVxdWFscwotCQkvLyBvYmosIHRoZW4gcmVzdWx0cyBmYWxzZS5QbHVnaW4gd2lsbCBsb3N0IGZyb20gdHJlZSBpbiB0aGUgZmlsdGVyLiBJbgotCQkvLyB0dXJuIHN1cHBvcnRpbmcgbWF0ZXJpYWwgZm9yIHRoYXQgcGFydGljdWxhciBwbHVnaW4gd2lsbCBub3QgYmUKLQkJLy8gZGlzcGxheWVkLgotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCAmJiBvYmouZXF1YWxzKGNvbnRlbnRFbGVtZW50KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgY2hlY2tpbmcgTWV0aG9kUGx1Z2luIGFjY2VwdGVkIG9yIG5vdC4gTWV0aG9kIG5lZWRzCi0JICogdG8gaW52b2tlZCBvbmx5IGZvciBNZXRob2RQbHVnaW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdE1ldGhvZFBsdWdpbihPYmplY3Qgb2JqKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KS5jb250YWlucyhvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgZm9yIGNoZWNraW5nIENvbnRlbnQgUGFja2FnZSBhY2NlcHRlZCBvciBub3QuIE1ldGhvZAotCSAqIG5lZWRzIHRvIGludm9rZWQgb25seSBmb3IgQ29udGVudCBQYWNrYWdlIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0Q29udGVudFBhY2thZ2UoT2JqZWN0IG9iaikgewotCi0JCWlmICgoKENvbnRlbnRQYWNrYWdlKSBvYmopLmdldENoaWxkUGFja2FnZXMoKS5pc0VtcHR5KCkKLQkJCQkmJiAoKENvbnRlbnRQYWNrYWdlKSBvYmopLmdldENvbnRlbnRFbGVtZW50cygpLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPYmplY3RJblNlbGVjdGVkSXRlbXMoT2JqZWN0IG9iaikgewotCi0JCWlmIChnZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgIT0gbnVsbAotCQkJCSYmIGdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRyaWJ1dG9yKENvbnRlbnRFbGVtZW50IGVsZW1lbnQpIHsKLQkJLy8gSnVzdCByZXR1cm5pbmcgdHJ1ZSwgYmVjYXVzZSBjb250cmlidXRpb24gY2hlY2tlZCBpbiBvdGhlciBwbGFjZS4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hdGNoUGF0dGVybkJhc2VkT25UeXBlKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG1hdGNoKG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuT25QcmVzZW50YXRpb25OYW1lKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG1hdGNoKG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTaG93UHJlc2VudGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHNob3dQcmVzZW50YXRpb25OYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNob3dQcmVzZW50YXRpb25OYW1lKGJvb2xlYW4gc2hvd1ByZXNlbnRhdGlvbk5hbWUpIHsKLQkJdGhpcy5zaG93UHJlc2VudGF0aW9uTmFtZSA9IHNob3dQcmVzZW50YXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEdlbmVyaWMgbWV0aG9kIHRvIGNoZWNrIG1hdGNoIG9mIGFuIG9iamVjdCBiYXNlZCBvbiByZWd1bGFyIGV4cHJlc3Npb24KLQkgKiBhbHNvIGJhc2VkIG9uIHR5cGUgdGhhdCBzZWxlY3RlZCBpbiB0aGUgZGlhbG9nLgotCSAqLwotCi0JcHJpdmF0ZSBib29sZWFuIG1hdGNoKE9iamVjdCBvYmopIHsKLQotCQkvLyBEbyBub3QgZG8gUGF0dGVybiBtYXRjaCBpZiB0eXBlIG9yIHBhdHRlcm4gc3RyaW5nIGlzIG51bGwuCi0JCWlmICh0eXBlID09IG51bGwgfHwgcGF0dGVybiA9PSBudWxsIHx8IHBhdHRlcm4uZXF1YWxzSWdub3JlQ2FzZSgiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIENoZWNrIGlmIHR5cGUgaXMgb2YgQ29udGVudCBQYWNrYWdlCi0JCWlmICh0eXBlLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUykpIHsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0KLQkJCQlpZiAobWF0Y2hlcihvYmopIHx8IGhhc01hdGNoZWRDaGlsZCgoQ29udGVudFBhY2thZ2UpIG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQotCQkJCS8vIGVsc2UgZm9yIGFsbCBjb250ZW50IGVsZW1lbnRzLCBpZiB0aGVpciBjb250ZW50IHBha2NhZ2UKLQkJCQkvLyBtYXRjaGVzICwgcmV0dXJuIHRydWUuCi0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCU9iamVjdCBjb250YWluZXIgPSAoKENvbnRlbnRFbGVtZW50KSBvYmopLmdldENvbnRhaW5lcigpOwotCQkJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCWlmICghbWF0Y2hlcihjb250YWluZXIpKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TKSkgewotCQkJLy8gQ2hlY2sgaWYgdHlwZSBpcyBvZiBNZXRob2QgUGx1Z2lucwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCS8vIGlmIGlzIGEgTWV0aG9kUGx1Z2luLCByZXR1cm4gdHJ1ZSBpZiBtYXRjaGVzIHRoZSBwYXR0ZXJuCi0JCQkJcmV0dXJuIG1hdGNoZXIob2JqKTsKLQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQl9IGVsc2UgaWYgKHR5cGUgIT0gbnVsbCkgewotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0KLQkJCQlpZiAodHlwZS5pbmRleE9mKEZpbHRlckNvbnN0YW50cy5zcGFjZSkgPiAtMSkgewotCQkJCQl0eXBlID0gdHlwZS5zdWJzdHJpbmcodHlwZS5pbmRleE9mKEZpbHRlckNvbnN0YW50cy5zcGFjZSksIHR5cGUubGVuZ3RoKCkpOwotCQkJCX0KLQotCQkJCUNsYXNzIGNscyA9IEZpbHRlckluaXRpYWxpemVyLmdldEluc3RhbmNlKCkuZ2V0Q2xhc3NGb3JUeXBlKAotCQkJCQkJdHlwZSk7Ci0JCQkJaWYgKGNscyAhPSBudWxsICYmICFjbHMuaXNJbnN0YW5jZShvYmopKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJCWlmIChtYXRjaGVyKG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIHsKLQotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJCQlyZXR1cm4gaGFzTWF0Y2hlZENoaWxkQ3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmopOwotCi0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQkJcmV0dXJuIGhhc01hdGNoZWRBcnRpZmFjdCgoQXJ0aWZhY3QpIG9iaik7Ci0JCQkJCX0KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJCQkJcmV0dXJuIGhhc01hdGNoZWRTdWJEb21haW5zKChEb21haW4pIG9iaik7Ci0JCQkJCX0KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpewotCQkJCQkJcmV0dXJuIGhhc01hdGNoZWRTdWJEaXNjaXBsaW5lKChEaXNjaXBsaW5lKW9iaik7Ci0JCQkJCX0KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZyl7Ci0JCQkJCQlyZXR1cm4gaGFzTWF0Y2hlZERpc2NpcGxpbmVzKChEaXNjaXBsaW5lR3JvdXBpbmcpb2JqKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsgLy8gZWxzZSBmb3IgYWxsIG90aGVyIHR5cGVzIG9mIGVsZW1lbnRzCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJfSBlbHNlCi0JCQkvLyB0aGUgQWxsIGNhc2UKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHdoaWNoIGRvZXMgYWN0dWFsIG1hdGNoaW5nIG9mIGdpdmVuIG9iamVjdCB3aXRoIHJlZ3VsYXIKLQkgKiBleHByZXNzaW9uLiBDaGVja3MgdG8gZG8gcHJlc2VudGF0aW9ubmFtZSBvciBuYW1lLgotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoZXIoT2JqZWN0IG9iaikgewotCQlpZihyZWdleCAhPSBudWxsKXsKLQkJCU1hdGNoZXIgbSA9IHJlZ2V4Lm1hdGNoZXIoKChNZXRob2RFbGVtZW50KSBvYmopLmdldE5hbWUoKSk7Ci0JCQlpZiAoc2hvd1ByZXNlbnRhdGlvbk5hbWUpIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50Ci0JCQkJCQkmJiAoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqKS5nZXRQcmVzZW50YXRpb25OYW1lKCkgIT0gbnVsbCkKLQkJCQkJbSA9IHJlZ2V4Lm1hdGNoZXIoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iaikKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBtLm1hdGNoZXMoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVySW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZDZlZTE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3Igc2V0dGluZyB1cCB0aGUgbmVjZXNzYXJ5IG1hcHMgdXNlZCBmb3IgZWxlbWVudCBmaWx0ZXJpbmcKLSAqIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGaWx0ZXJJbml0aWFsaXplciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBGaWx0ZXJJbml0aWFsaXplciBpbml0aWFsaXplcjsKLQotCXByaXZhdGUgc3RhdGljIE1hcCBtYXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJJbml0aWFsaXplcigpIHsKLQkJc3VwZXIoKTsKLQkJbG9hZFR5cGVDbGFzcygpOwotCX0KLQotCS8qCi0JICogU2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsdGVySW5pdGlhbGl6ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbml0aWFsaXplciA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKEZpbHRlckluaXRpYWxpemVyLmNsYXNzKSB7Ci0JCQkJaWYgKGluaXRpYWxpemVyID09IG51bGwpIHsKLQkJCQkJaW5pdGlhbGl6ZXIgPSBuZXcgRmlsdGVySW5pdGlhbGl6ZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluaXRpYWxpemVyOwotCX0KLQotCS8qCi0JICogTG9hZCB0aGUgRmlsdGVyIFR5cGVzIGFuZCByZXNwZWN0aXZlIGNsYXNzZXMuIFRoaXMgbmVlZCBpbiBjYXNlIG9mIGkxMThuIC0KLQkgKiBDb25zdGFudHMgdmFsdWVzIGFyZSBkaWZmZXJlbnQuCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRUeXBlQ2xhc3MoKSB7Ci0JCW1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVMsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlMsIERvbWFpbi5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUywgV29ya1Byb2R1Y3QuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5ET01BSU5TLCBEb21haW4uY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMsIFdvcmtQcm9kdWN0LmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORV9HUk9VUElOR1MsIERpc2NpcGxpbmVHcm91cGluZy5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTLCBEaXNjaXBsaW5lLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuVEFTS1MsIFRhc2suY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5ST0xFX1NFVF9HUk9VUElOR1MsIFJvbGVTZXRHcm91cGluZy5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTLCBSb2xlU2V0LmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUk9MRVMsIFJvbGUuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5DSEVDS0xJU1RTLCBDaGVja2xpc3QuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5DT05DRVBUUywgQ29uY2VwdC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkVTVElNQVRFX0NPTlNJREVSQVRJT05TLAotCQkJCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkVYQU1QTEVTLCBFeGFtcGxlLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuR1VJREVMSU5FUywgR3VpZGVsaW5lLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUFJBQ1RJQ0VTLCBQcmFjdGljZS5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlJFUE9SVFMsIFJlcG9ydC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlJFVVNBQkxFX0FTU0VUUywgUmV1c2FibGVBc3NldC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlJPQURNQVAsIFJvYWRtYXAuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUywgU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuVEVNUExBVEVTLCBUZW1wbGF0ZS5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlRFUk1fREVGSU5JVElPTlMsIFRlcm1EZWZpbml0aW9uLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuVE9PTF9NRU5UT1JTLCBUb29sTWVudG9yLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuV0hJVEVfUEFQRVJTLCBXaGl0ZXBhcGVyLmNsYXNzKTsKLQkJLy8gbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UsIEd1aWRhbmNlLmNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIENsYXNzIGZvciBhIHR5cGUgZnJvbSB0aGUgbWFwLgotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRDbGFzc0ZvclR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJT2JqZWN0IG9iaiA9IG1hcC5nZXQodHlwZSk7Ci0JCXJldHVybiAoQ2xhc3MpIG9iajsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVyVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWQ3NjBjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5XcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogQSB1dGlsaXR5IGNsYXNzIGZvciBtYW5hZ2luZyBlbGVtZW50IGZpbHRlcmluZyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlclV0aWwgewotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpdGVyYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBJRmlsdGVyIGZpbHRlcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBmb3IgY29sbGVjdGluZyB0aGUgcGFyZW50cyBjaGFpbiAodXB3YXJkKSBvZiBhbiBicmVha2Rvd25lbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBBZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBCcmVha2Rvd25FbGVtZW50Ci0JICogQHBhcmFtIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UGFyZW50c0luU2NvcGUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQsIGphdmEudXRpbC5MaXN0IGFjdGl2aXR5TGlzdCkgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWFjdGl2aXR5TGlzdC5hZGQocGFyZW50KTsKLQkJCWdldFBhcmVudHNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50LAotCQkJCQlhY3Rpdml0eUxpc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBjaGlsZHJlbiBvZiB0aGUgYWN0aXZpdHkgcmVjdXJzaXZlbHkgZG93bndhcmRzLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gYWN0aXZpdHlMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldENoaWxkQWN0aXZpdGllc0luU2NvcGUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlBY3Rpdml0eSBwYXJlbnQsIExpc3QgYWN0aXZpdHlMaXN0KSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0KLQkJT2JqZWN0IG8gPSBhZGFwdGVyLmdldENoaWxkcmVuKHBhcmVudCk7Ci0JCWlmIChvIGluc3RhbmNlb2YgTGlzdCkgewotCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBvOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlhY3Rpdml0eUxpc3QuYWRkKG9iaik7Ci0JCQkJCWdldENoaWxkQWN0aXZpdGllc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgb2JqLAotCQkJCQkJCWFjdGl2aXR5TGlzdCk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IG8xID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmopLmdldFZhbHVlKCk7Ci0JCQkJCWFjdGl2aXR5TGlzdC5hZGQobzEpOwotCQkJCQlnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG8xLAotCQkJCQkJCWFjdGl2aXR5TGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgZm9yIHJldHJpdmluZyBhbGwgdGhlIGNvbnRyaWJ1dG9ycyBvZgotCSAqIHZhcmlhYmlsaXR5ZWxlbWVudCBpbiBhIGxpc3QuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldENvbnRyaWJ1dG9ycyhMaXN0IGxpc3QsIExpc3QgZ2VuZXJhbGl6ZXJzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlJdGVyYXRvciBpdGVyID0gVG5nVXRpbC5nZXRDb250cmlidXRvcnMoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCWdlbmVyYWxpemVycy5hZGQoaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIGZvciByZXRyaXZpbmcgYWxsIHRoZSBjb250cmlidXRvcnMgb2YKLQkgKiB2YXJpYWJpbGl0eWVsZW1lbnQgaW4gYSBsaXN0LgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRHZW5lcmFsaXplcnMoTGlzdCBsaXN0LCBMaXN0IGdlbmVyYWxpemVycykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlnZW5lcmFsaXplcnMuYWRkKGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgcmV0cml2aW5nIGFsbCB0aGUgdmFyaWFiaWxpdHkgYmFzZXMgb2YKLQkgKiB2YXJpYWJpbGl0eWVsZW1lbnQgaW4gYSBsaXN0LgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRWYXJpYWJpbGl0eUJhc2UoTGlzdCBsaXN0LCBMaXN0IHZhcmlhYmlsaXR5YmFzZXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iajsKLQkJCQlmb3IgKDsgZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsgdmFyaWFiaWxpdHliYXNlcwotCQkJCQkJLmFkZChlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZQotCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSkKLQkJCQkJOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBhY3Rpdml0eSBmb3IgYnJlYWtkb3duZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBickVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0UGFyZW50QWN0aXZpdHkoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlCcmVha2Rvd25FbGVtZW50IGJyRWxlbWVudCkgewotCQlpZiAoYnJFbGVtZW50ICE9IG51bGwpIHsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoYnJFbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCQlickVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50OwotCQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYnJFbGVtZW50LAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQkJfQotCi0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTdWJUcmVlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXIsIEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJTGlzdCB0cmVlTGlzdCkgewotCQlGaWx0ZXJVdGlsLmdldFBhcmVudHNJblNjb3BlKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGFjdGl2aXR5LCB0cmVlTGlzdCk7Ci0JCUZpbHRlclV0aWwuZ2V0Q2hpbGRBY3Rpdml0aWVzSW5TY29wZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBhY3Rpdml0eSwgdHJlZUxpc3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTdWJUcmVlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXIsIExpc3QgbGlzdCwKLQkJCUxpc3QgdHJlZUxpc3QpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWdldFN1YlRyZWUoYWRhcHRlciwgKEFjdGl2aXR5KSBvYmosIHRyZWVMaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0d1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzMWQ4MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0d1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgZ3VpZGFuY2UgZm9sZGVycyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIG1ldGhvZENvbmZpZwotCSAqLwotCXB1YmxpYyBHdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY29sLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KG9iaikpCi0JCQkJaXRvci5yZW1vdmUoKTsKLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lBbGxGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQWxsRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM4ZTZlNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lBbGxGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLS8qKgotICogQSBmaWx0ZXIgdGhhdCBkaXNwbGF5cyBhbGwgbWV0aG9kIGVsZW1lbnRzIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24KLSAqIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBbGxGaWx0ZXIgZXh0ZW5kcyBJRmlsdGVyIHsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ2F0ZWdvcnlGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ2F0ZWdvcnlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWU1ZDIyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUNhdGVnb3J5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi0vKioKLSAqIEEgZmlsdGVyIHRoYXQgZGlzcGxheXMgb25seSBjYXRlZ29yeSBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2F0ZWdvcnlGaWx0ZXIgZXh0ZW5kcyBJRmlsdGVyIHsKLQotCVN0cmluZ1tdIGdldENhdGVnb3J5UGFja2FnZVBhdGgoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lDb250ZW50RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUNvbnRlbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzlhZGVjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUNvbnRlbnRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLS8qKgotICogQSBmaWx0ZXIgdGhhdCBkaXNwbGF5cyBvbmx5IGNvbnRlbnQgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnRGaWx0ZXIgZXh0ZW5kcyBJRmlsdGVyIHsKLQotCVN0cmluZ1tdIGdldENvbnRlbnRQYWNrYWdlUGF0aCgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUN1c3RvbUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lDdXN0b21GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWI1NzExMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUN1c3RvbUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotLyoqCi0gKiBBIGZpbHRlciB0aGF0IGRpc3BsYXlzIG9ubHkgY3VzdG9tIGNhdGVnb3JpZXMgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUN1c3RvbUZpbHRlciBleHRlbmRzIElGaWx0ZXIgewotCi0JU3RyaW5nW10gZ2V0Q29udGVudFBhY2thZ2VQYXRoKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYThkNjljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi0vKioKLSAqIEEgZ2VuZXJpYyBmaWx0ZXIgZm9yIGZpbHRlcmluZyBvdXQgbWV0aG9kIGVsZW1lbnRzIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmlsdGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyIHsKLQotCS8qCi0JICogZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpOwotCi0JLyoKLQkgKiBzZXRIZWxwZXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhlbHBlcihGaWx0ZXJIZWxwZXIgaGVscGVyKTsKLQotCS8qKgotCSAqIEFkZGVkIGZvciBmdXRoZXIgZmlsdGVyaW5nLiBGb3IgZXhhbXBsZSwgd2UgbWF5IHNldCBhIGZpbGVyIHRvIHByZXZlbnQKLQkgKiBnZW5lcmFsaXplcnMgYXMgYmFzZSBlbGVtZW50IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKiAKLQkgKiBAcGFyYW0gYWRkaXRpb25hbEZpbHRlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsRmlsdGVycygKLQkJCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcltdIGFkZGl0aW9uYWxGaWx0ZXJzKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lQcm9jZXNzRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSVByb2Nlc3NGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWFjNmQzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSVByb2Nlc3NGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLS8qKgotICogQSBmaWx0ZXIgdGhhdCBkaXNwbGF5cyBvbmx5IHByb2Nlc3MgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2Nlc3NGaWx0ZXIgZXh0ZW5kcyBJRmlsdGVyIHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODFiMjFjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDdXN0b21DYXRlZ29yeUFkYXB0ZXIoKSB7Ci0JCWlmIChjdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciA9IG5ldyBDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVNZXRob2RMaWJyYXJ5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKSB7Ci0JCWlmIChtZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgPSBuZXcgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCkgewotCQlpZiAobWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciA9IG5ldyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50UGFja2FnZUFkYXB0ZXIoKSB7Ci0JCWlmIChjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciA9IG5ldyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gY29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudGNhdGVnb3JpZXNBZGFwdGVyRmFjdG9yeSNjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkgewotCQkvLyBpZihkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCl7Ci0JCS8vIGRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciA9IG5ldwotCQkvLyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLQkJcmV0dXJuIG5ldyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEdyb3VwaW5nQWRhcHRlcigpIHsKLQkJLy8gaWYocm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpewotCQkvLyByb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyB9Ci0JCS8vIHJldHVybiByb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci0JCXJldHVybiBuZXcgUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFJvbGVTZXRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotLy8JCWlmIChkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotLy8JCQlkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgPSBuZXcgRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMpOwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlcjsKLQkJCi0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRG9tYWluSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IERpc2NpcGxpbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTMzNDhjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlzdXBlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQljaGlsZHJlbiA9IG51bGw7Ci0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCUZpbHRlclV0aWwuaXRlcmF0ZUNvbGxlY3Rpb24oY29sLCBmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL01ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjlkNTI5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIG1ldGhvZCBsaWJyYXJ5IGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElDb25maWd1cmFibGUgewotCi0JQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQlDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gaXNBZGFwdGVyQ29uZmlndXJhYmxlOwotCS8vIHByaXZhdGUgQXJyYXlMaXN0IGNoaWxkcmVuOwotCS8vIHByaXZhdGUgTWV0aG9kUGx1Z2luIHBsdWdpbjsKLQkvLyBwcml2YXRlIE1vZGVsU3RydWN0dXJlIG1vZGVsU3RydWN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU9iamVjdCBjb250ZW50RWxlbWVudCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJRmlsdGVyIGZpbHRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDb25maWd1cmFibGUpIHsKLQkJCS8vIGlzQWRhcHRlckNvbmZpZ3VyYWJsZSA9IHRydWU7Ci0JCQkoKElDb25maWd1cmFibGUpIGFkYXB0ZXJGYWN0b3J5KS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8KLQkgKiBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbgotCSAqIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJLy8gc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIxLm5leHQoKTsKLQkJCWlmIChmaWx0ZXIuYWNjZXB0KGNoaWxkKSAmJiBjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBwID0gbmV3IE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcigKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQkJCQlwLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJCUNvbGxlY3Rpb24gY2hpbGRzID0gcC5nZXRDaGlsZHJlbihjaGlsZCk7Ci0JCQkJZm9yIChJdGVyYXRvciBjaGlsZEl0ZXIgPSBjaGlsZHMuaXRlcmF0b3IoKTsgY2hpbGRJdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgY2hpbGRPYmogPSBjaGlsZEl0ZXIubmV4dCgpOwotCQkJCQlpZiAoY2hpbGRPYmogaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCQkJCWlmICghY2hlY2tDaGlsZHJlbnMoY2hpbGRPYmopKQotCQkJCQkJCWNoaWxkSXRlci5yZW1vdmUoKTsKLQotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkT2JqKSkgewotCQkJCQkJCWNoaWxkSXRlci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY2hpbGRzLmlzRW1wdHkoKSkKLQkJCQkJaXRlcjEucmVtb3ZlKCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJCWl0ZXIxLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tDaGlsZHJlbnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJb2JqZWN0ID0gKChJV3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0KS5nZXRWYWx1ZSgpOwotCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KG9iamVjdCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlDb2xsZWN0aW9uIGNoaWxkT2JqQ2hpbGRzID0gKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGNoaWxkT2JqSXRlciA9IGNoaWxkT2JqQ2hpbGRzLml0ZXJhdG9yKCk7IGNoaWxkT2JqSXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZE9iakNoaWxkID0gY2hpbGRPYmpJdGVyLm5leHQoKTsKLQkJCQlpZiAoY2hpbGRPYmpDaGlsZCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCQlyZXR1cm4gY2hlY2tDaGlsZHJlbnMoY2hpbGRPYmpDaGlsZCk7Ci0JCQkJfQotCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZE9iakNoaWxkKSkgewotCQkJCQljaGlsZE9iakl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNoaWxkT2JqQ2hpbGRzLmlzRW1wdHkoKSkKLQkJCQkvLyBjaGlsZEl0ZXIucmVtb3ZlKCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4NTI4NDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgbWV0aG9kIHBsdWctaW4gaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUgewotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBjb2wgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDYXRlZ29yeUZpbHRlcikgewotCQkJY29sLmFkZEFsbChnZXRDYXRlZ29yeUl0ZW1Qcm92aWRlcihvYmplY3QpLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJcmV0dXJuIGNvbDsKLQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29udGVudEZpbHRlcikgewotCQkJcmV0dXJuIGdldENvbnRlbnQob2JqZWN0KTsKLQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQWxsRmlsdGVyKSB7Ci0JCQlyZXR1cm4gZ2V0QWxsQ29udGVudEVsZW1lbnRzKG9iamVjdCk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUN1c3RvbUZpbHRlcikgewotCQkJcmV0dXJuIGdldEN1c3RvbUNhdGVnb3JpZXMob2JqZWN0KTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJLy8gVE9ETzogZmlsdGVyCi0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldEN1c3RvbUNhdGVnb3JpZXMoT2JqZWN0IG9iamVjdCkgewotCQlDdXN0b21DYXRlZ29yeSByb290Q3VzdG9tQ2F0ZWdvcnkgPSBUbmdVdGlsCi0JCQkJLmdldFJvb3RDdXN0b21DYXRlZ29yeSgoTWV0aG9kUGx1Z2luKSBvYmplY3QpOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHJvb3RDdXN0b21DYXRlZ29yeSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJKChJQ29uZmlndXJhYmxlKSBhZGFwdGVyKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocm9vdEN1c3RvbUNhdGVnb3J5KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZ2V0Q2F0ZWdvcnlJdGVtUHJvdmlkZXIoT2JqZWN0IG9iamVjdCkgewotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgoTWV0aG9kUGx1Z2luKSBvYmplY3QsCi0JCQkJKChJQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikuZ2V0Q2F0ZWdvcnlQYWNrYWdlUGF0aCgpKTsKLQkJQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyIGNvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlciA9IG5ldyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnksIHBrZywgIiIpOyAvLyROT04tTkxTLTEkCi0JCWNvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJY29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLnNldFBhcmVudChvYmplY3QpOwotCQlyZXR1cm4gY29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRDb250ZW50KE9iamVjdCBvYmplY3QpIHsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoKE1ldGhvZFBsdWdpbikgb2JqZWN0LAotCQkJCSgoSUNvbnRlbnRGaWx0ZXIpIGZpbHRlcikuZ2V0Q29udGVudFBhY2thZ2VQYXRoKCkpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGtnLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkoKElDb25maWd1cmFibGUpIGFkYXB0ZXIpLnNldEZpbHRlcihmaWx0ZXIpOwotCQlyZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihwa2cpOwotCX0KLQotCS8vIHByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRDb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIoT2JqZWN0IG9iamVjdCkKLQkvLyB7Ci0JLy8gQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoKE1ldGhvZFBsdWdpbilvYmplY3QsCi0JLy8gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCS8vIENvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlciBjb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIgPSBuZXcKLQkvLyBDb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIHBrZyk7Ci0JLy8gY29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCS8vIHJldHVybiBjb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXI7Ci0JLy8gfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldEFsbENvbnRlbnRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlTdHJpbmdbXSBjb3JlQ29udGVudFBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aDsKLQkJQ29udGVudFBhY2thZ2UgY29yZVBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKAotCQkJCShNZXRob2RQbHVnaW4pIG9iamVjdCwgY29yZUNvbnRlbnRQYXRoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBjb250ZW50QWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChjb3JlUGtnLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkoKElDb25maWd1cmFibGUpIGNvbnRlbnRBZGFwdGVyKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJbGlzdC5hZGRBbGwoY29udGVudEFkYXB0ZXIuZ2V0Q2hpbGRyZW4oY29yZVBrZykpOwotCi0JCVN0cmluZ1tdW10gY2F0ZWdvcnlQYXRocyA9IG5ldyBTdHJpbmdbXVtdIHsKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCB9OwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcnlQYXRocy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gcGF0aCA9IGNhdGVnb3J5UGF0aHNbaV07Ci0JCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgKLQkJCQkJKE1ldGhvZFBsdWdpbikgb2JqZWN0LCBwYXRoKTsKLQkJCUNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIgY29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlciA9IG5ldyBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKAotCQkJCQlhZGFwdGVyRmFjdG9yeSwgcGtnLCBnZXROYW1lKHBhdGgpKTsKLQkJCWNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQljb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyLnNldEltYWdlKGdldEltYWdlKHBhdGgpKTsKLQkJCWNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCQlsaXN0LmFkZChjb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKTsKLQkJfQotCi0JCUN1c3RvbUNhdGVnb3J5IHJvb3RDdXN0b21DYXRlZ29yeSA9IFRuZ1V0aWwKLQkJCQkuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KChNZXRob2RQbHVnaW4pIG9iamVjdCk7Ci0JCWlmIChyb290Q3VzdG9tQ2F0ZWdvcnkgIT0gbnVsbCkgewotCQkJbGlzdC5hZGQocm9vdEN1c3RvbUNhdGVnb3J5KTsKLQkJfQotCi0JCS8vIFN0cmluZyBuYW1lID0KLQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc2VzX2dyb3VwIik7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIHByb2Nlc3NJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKAotCQkJCWFkYXB0ZXJGYWN0b3J5LCAoTWV0aG9kUGx1Z2luKSBvYmplY3QpOwotCQlwcm9jZXNzSXRlbVByb3ZpZGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQlwcm9jZXNzSXRlbVByb3ZpZGVyLnNldFBhcmVudChvYmplY3QpOwotCQlsaXN0LmFkZChwcm9jZXNzSXRlbVByb3ZpZGVyKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyMS5uZXh0KCk7Ci0JCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCWl0ZXIxLnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8vIHByaXZhdGUgQ29sbGVjdGlvbiBnZXRQcm9jZXNzZXMoT2JqZWN0IG9iamVjdCkgewotCS8vIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyAvLyBTdHJpbmcgbmFtZSA9Ci0JLy8gLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc2VzX2dyb3VwIik7Ci0JLy8gLy8gLy8kTk9OLU5MUy0xJAotCS8vIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBwcm9jZXNzSXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcigKLQkvLyBhZGFwdGVyRmFjdG9yeSwgKE1ldGhvZFBsdWdpbikgb2JqZWN0KTsKLQkvLyBwcm9jZXNzSXRlbVByb3ZpZGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCS8vIGxpc3QuYWRkKHByb2Nlc3NJdGVtUHJvdmlkZXIpOwotCS8vIHJldHVybiBsaXN0OwotCS8vIH0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldEltYWdlKFN0cmluZ1tdIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGlzY2lwbGluZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHBhdGggPT0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRG9tYWlucyIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHBhdGggPT0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Rvb2xzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5hbWUoU3RyaW5nW10gcGF0aCkgewotCQlpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQotCQl9IGVsc2UgaWYgKHBhdGggPT0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHBhdGggPT0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWNmZWMzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhY3Rpdml0aWVzIGluIHRoZSBUZWFtIEFsbG9jYXRpb24gcGFnZSBvZiBhCi0gKiBQcm9jZXNzIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldE9iamVjdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0RUNsYXNzZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3MjQwNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGJyZWFrIGRvd24gZWxlbWVudHMgaW4gdGhlIFRlYW0gQWxsb2NhdGlvbiBwYWdlCi0gKiBvZiBhIFByb2Nlc3MgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLk9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgc3VwZXIKLQkJCQkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgc3VwZXIKLQkJCQkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNzA2OWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgcHJvY2Vzc2VzIGluIHRoZSBUZWFtIEFsbG9jYXRpb24gcGFnZQotICogb2YgYSBQcm9jZXNzIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXB1YmxpYyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuZGVsZWdhdGVJdGVtUHJvdmlkZXIgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCQkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiNjQ2MmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhY3Rpdml0aWVzIGluIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUKLSAqIHBhZ2Ugb2YgYSBQcm9jZXNzIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8vIElGaWx0ZXIgZml0bGVyOwotCXB1YmxpYyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkvLyBUaGlzIGNhbGwgdG8gUEJTQWN0aWl2aXR5SXRlbVByb3ZpZGVyKHByb2Nlc3MgcGFja2FnZSkgaXMgZG9uZQotCQkvLyAtIGluIG9yZGVyIHJlbW92ZSBkdXBsaWNhdGUgc3ViYXJ0aWZhY3QuCi0JCWNvbCA9IFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjb2wsIGZhbHNlKTsKLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0UEJTRWNsYXNzZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4YTE5MWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGJyZWFrIGRvd24gZWxlbWVudHMgaW4gdGhlIFdvcmsgUHJvZHVjdCBVc2FnZQotICogcGFnZSBvZiBhIFByb2Nlc3MgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgc3VwZXIKLQkJCQkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgc3VwZXIKLQkJCQkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxY2JjYzBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHByb2Nlc3NlcyBpbiB0aGUgV29yayBQcm9kdWN0IFVzYWdlIHBhZ2UKLSAqIG9mIGEgUHJvY2VzcyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHVibGljIFBCU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JCQkJCS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2wuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJc3VwZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjhjOTZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHByb2Nlc3MgY29tcG9uZW50IGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJaXRlci5yZW1vdmUoKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZWIyYjA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBwcm9jZXNzIHBhY2thZ2UgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLy9wcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW5JbmNsdWRpbmdFbXB0eU9iamVjdHMob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoaXNFbXB0eVBhY2thZ2UoaXRlci5uZXh0KCkpKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldENoaWxkcmVuSW5jbHVkaW5nRW1wdHlPYmplY3RzKE9iamVjdCBvYmplY3QpIHsKLQkJQXJyYXlMaXN0IGNvbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3QgY2hpbGQgPSBlbGVtZW50OwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQljaGlsZCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQkJCX0KLQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29sLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eVBhY2thZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCXx8ICEob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbkluY2x1ZGluZ0VtcHR5T2JqZWN0cyhvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmICghaXNFbXB0eVBhY2thZ2UoaXRlci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vIHByaXZhdGUgYm9vbGVhbiBhbnlQcm9jZXNzQ29tcG9uZW50KE9iamVjdCBwYXJlbnRQcm9jZXNQYWNrYWdlKSB7Ci0JLy8gTGlzdCBsaXN0ID0gKChQcm9jZXNzUGFja2FnZSkgcGFyZW50UHJvY2VzUGFja2FnZSkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkvLyBPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JLy8gaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkvLyBpZiAoZmlsdGVyLmFjY2VwdChvYmopKQotCS8vIHJldHVybiB0cnVlOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQkvL3RoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzMyNGQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LklFbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlByb2Nlc3NlcyIgZm9sZGVyIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJRWxlbWVudEl0ZW1Qcm92aWRlciwgSUdyb3VwQ29udGFpbmVyLAotCQlJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgTWFwIGdyb3VwSXRlbVByb3ZpZGVyTWFwOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBjaGlsZHJlbjsKLQotCXByb3RlY3RlZCBNZXRob2RQbHVnaW4gcGx1Z2luOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBNZXRob2RQbHVnaW4KLQkgKiBAcGFyYW0gTW9kZWxTdHJ1Y3R1cmUKLQkgKiAKLQkgKiBQbHVnaW4gaXMgcmVxdWlyZWQgdG8gcGFzcywgdXNlZCBpbiBmaW5kaW5nIE1ldGhvZFBhY2thZ2UgZm9yIHBhcnRpY3VsYXIKLQkgKiBNb2RlbFN0cnVjdHVyZSwgTW9kZWxTdHJ1Y3R1cmUgaXMgb3B0aW9uYWwuCi0JICovCi0JcHVibGljIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tdIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ2FwYWJpbGl0eVBhdHRlcm5zX3RleHQiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3Nlc190ZXh0IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbnNfdGV4dCIpIH07IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdW10gcHJvY2Vzc1BhdGhzID0gbmV3IFN0cmluZ1tdW10gewotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoIH07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2Nlc3NQYXRocy5sZW5ndGg7IGkrKykgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBrZzEgPSAoUHJvY2Vzc1BhY2thZ2UpIFVtYVV0aWwKLQkJCQkJCS5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sIHByb2Nlc3NQYXRoc1tpXSk7Ci0JCQkJaWYgKHBrZzEgIT0gbnVsbCkgewotCQkJCQlPYmplY3QgaW1hZ2UgPSBVbWFFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkJCSJmdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSBuZXcgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIoCi0JCQkJCQkJYWRhcHRlckZhY3RvcnksIHBrZzEsIG5hbWVzW2ldLCBpbWFnZSk7Ci0JCQkJCWl0ZW1Qcm92aWRlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCQkJY2hpbGRyZW4uYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qcm9jZXNzZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXIjZ2V0R3JvdXBJdGVtUHJvdmlkZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEdyb3VwSXRlbVByb3ZpZGVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBncm91cEl0ZW1Qcm92aWRlck1hcC5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzkzOWMwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlJvbGUgU2V0cyIgZm9sZGVycyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSwgSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbjsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChvYmplY3QpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCi0JCQkvLyBUT0RPOiBjb21tZW50ZWQgb3V0IHVudGlsIEppbmh1YSBmaXhlZCBidWdzIGluCi0JCQkvLyBDb25maWd1cmF0aW9uRmlsdGVyCi0JCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCQljaGlsZHJlbiA9IGNvbmZpZ3VyYXRvci5nZXRDaGlsZHJlbihvYmplY3QsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKSk7Ci0JCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJSb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKTogcmV0dXJuZWQgZnJvbSBjb25maWd1cmF0b3I6ICIgKyBjaGlsZHJlbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIGNoaWxkcmVuOwotCQkJCX0KLQkJCX0KLQotCQkJY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJUm9sZVNldEdyb3VwaW5nIGdyb3VwaW5nID0gKFJvbGVTZXRHcm91cGluZykgb2JqZWN0OwotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25mID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pICgoQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgZ2V0UGFyZW50KG9iamVjdCkpCi0JCQkJCS5nZXRUYXJnZXQoKTsKLQkJCVRuZ1V0aWwuYWRkRXh0ZW5kZWRDaGlsZHJlbihncm91cGluZywgbWV0aG9kQ29uZiwgY2hpbGRyZW4sCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCi0JCQkvLyBzZXQgcGFyZW50Ci0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChpdGVyLm5leHQoKSwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0gZWxzZSB7Ci0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuQ29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuQ29sLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgY29udGVudEFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCS5hZGFwdChjaGlsZCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoY29udGVudEFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBjb250ZW50QWRhcHRlcikuc2V0UGFyZW50KG9iamVjdCk7Ci0JCQkJfQotCQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkKLQkJCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2hpbGRyZW5Db2w7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCQkvLyBpZihvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb2JqZWN0KTsKLQkJLy8gaWYocGx1Z2luICE9IG51bGwpIHsKLQkJLy8gU3RyaW5nW10gcGF0aCA9IHsKLQkJLy8gVG5nRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkvLyAsVG5nRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLyAsVG5nRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKQotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vIH07Ci0JCS8vIE9iamVjdCBhZGFwdGVyID0KLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKS5hZGFwdChwbHVnaW4sCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIC8vIElHcm91cENvbnRhaW5lciBncm91cHMgPSAoSUdyb3VwQ29udGFpbmVyKQotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpLmFkYXB0KHBsdWdpbiwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gLy8gaW50IGk7Ci0JCS8vIC8vIGZvcihpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCS8vIC8vIGdyb3VwcyA9IChJR3JvdXBDb250YWluZXIpIGdyb3Vwcy5nZXRHcm91cEl0ZW1Qcm92aWRlcihwYXRoW2ldKTsKLQkJLy8gLy8gaWYoZ3JvdXBzID09IG51bGwpIHJldHVybiBudWxsOwotCQkvLyAvLyB9Ci0JCS8vIC8vIHJldHVybiAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZ3JvdXBzLmdldEdyb3VwSXRlbVByb3ZpZGVyKHBhdGhbaV0pOwotCQkvLyByZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCk7Ci0JCS8vIC8vcmV0dXJuIGFkYXB0ZXI7Ci0JCS8vIH0KLQkJLy8gfQotCi0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYjFlMzhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcm9sZSBzZXQgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlJvbGVTZXRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlLCBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUm9sZVNldEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNvbCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQoZ2V0UGFyZW50KG9iamVjdCkpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJCUZpbHRlclV0aWwuaXRlcmF0ZUNvbGxlY3Rpb24oY29sLCBmaWx0ZXIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQWxsRmlsdGVyCi0JCQkJCXx8IGZpbHRlciBpbnN0YW5jZW9mIElDYXRlZ29yeUZpbHRlcikgewotCQkJCXJldHVybiBjb2w7Ci0JCQl9Ci0JCQkvLyBJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPQotCQkJLy8gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFKS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCQkJLy8gLmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCS8vIGNvbCA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJc3VwZXIuc2V0UGFyZW50KHBhcmVudCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gcGFyZW50OwotCQkvLyByZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1ZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiNzIyOTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1ZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgc2VsZWN0aW9uLiBUaGUgZmlsdGVyIHdpbGwKLSAqIGNoZWNrIGlmIG9iamVjdCBjYW4gYmUgYWNjZXB0ZWQgYXMgdGhlIGJhc2UgZWxlbWVudCBvZiB0aGUgZmlsdGVyIG93bmVyLgotICogCi0gKiBGaWx0ZXIgcnVsZXM6Ci0gKiAKLSAqIDEuIFRoZSBlbGVtZW50IGl0c2VsZiBhbmQgaXQncyBnZW5lcmFsaXplcnMgKGNvbnRyaWJ1dG9yLCByZXBsYWNlciwgb3IKLSAqIGV4dGVuZGVyKSBzaG91bGQgYmUgZmlsdGVyZWQgb3V0Ci0gKiAyLiBBbnkgZWxlbWVudHMgaW4gdGhlIGNvbnRhaW5tZW50IGNoYWluIG9mIHRoZSBhYm92ZSwgc2hvdWxkIGJlIGZpbHRlcmVkCi0gKiBvdXQKLSAqIDMuIGlmIGFueSBvZiB0aGUgYmFzZSBlbGVtZW50cyBjYW4ndCBiZSBzZWxlY3RlZCwgdGhlbiB0aGlzIGVsZW1lbnQgY2FuJ3QKLSAqIGJlIHNlbGVjdGVkLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlciBpbXBsZW1lbnRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciB7Ci0KLQlwcml2YXRlIFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50OwotCi0JcHJpdmF0ZSBMaXN0IGJhZGd1eXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcihWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCi0JCS8vIGZpcnN0IG9mIGFsbCwgeW91IGNhbid0IHZhcnkgeW91cnNlbGYKLQkJYmFkZ3V5cy5hZGQoZWxlbWVudCk7Ci0KLQkJLy8gZ2V0IGFsbCBteSBnZW5lcmFsaXplcnMKLQkJSXRlcmF0b3IgaXQgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhlbGVtZW50KTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJYmFkZ3V5cy5hZGQodmUpOwotCi0JCQkvLyB0aGUgY29udGFpbm1lbnQgY2hhaW4gb24gbXkgZ2VuZXJhbGl6ZXJzIGNhbid0IGJlIG15IGJhc2UKLQkJCWhhbmRsZUNvbnRhaW5tZW50Q2hhaW4odmUpOwotCQl9Ci0KLQkJLy8gZWxlbWVudCdzIGluIG15IGNoYWluIGNhbid0IGJlIG15IGJhc2UKLQkJaGFuZGxlQ29udGFpbm1lbnRDaGFpbihlbGVtZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ29udGFpbm1lbnRDaGFpbihWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlpZiAoIWhhc0NvbnRhaW5tZW50RmVhdHVyZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlMaXN0IHJvb3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbG9hZFJvb3RDdXN0b21DYXRlZ29yaWVzKChDdXN0b21DYXRlZ29yeSkgZSwgcm9vdHMpOwotCQkJYmFkZ3V5cy5hZGRBbGwocm9vdHMpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJTGlzdCByb290cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWRlbGl2ZXJhYmxlUGFydHMoKERlbGl2ZXJhYmxlKSBlLCByb290cyk7Ci0JCQliYWRndXlzLmFkZEFsbChyb290cyk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiB0aGUgZWxlbWVudCBoYXMgY29udGFpbm1lbnQgZmVhdHVyZSwKLQkJCS8vIHlvdSBjYW4ndCBzZWxlY3QgdGhlIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5tZW50IGNoYWluCi0JCQlFT2JqZWN0IHJvb3QgPSBnZXRDaGFpblJvb3QoZSk7Ci0JCQlpZiAoIWJhZGd1eXMuY29udGFpbnMocm9vdCkpIHsKLQkJCQliYWRndXlzLmFkZChyb290KTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIGhvbGQgb2ZmIGZvciBub3cgLy8gYWxzbyBvbmx5IG9uZSBlbGVtZW50IGluIGEgY2hhaW4gY2FuIGJlCi0JCQkgKiBzZWxlY3RlZCBhcyBiYXNlIC8vIHNvIGdldCBhbGwgdGhlIGJhc2UgZWxlbWVudHMgaW4gdGhlIGVsZW1lbnQKLQkJCSAqIGNoYWluLCBhbmQgYmxvY2sgdGhlIGVsZW1lbnQgY2hhaW4gb2YgdGhlIGJhc2UgZWxlbWVudHMKLQkJCSAqIGZpbHRlclVzZWRCYXNlQ2hhaW4oKFZhcmlhYmlsaXR5RWxlbWVudClyb290KTsgZm9yIChJdGVyYXRvciBpdCA9Ci0JCQkgKiByb290LmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7ICkgeyBPYmplY3QgbyA9IGl0Lm5leHQoKTsgaWYgKAotCQkJICogby5nZXRDbGFzcygpLmlzSW5zdGFuY2UoZWxlbWVudCkgKSB7Ci0JCQkgKiBmaWx0ZXJVc2VkQmFzZUNoYWluKChWYXJpYWJpbGl0eUVsZW1lbnQpbyk7IH0gfQotCQkJICovCi0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxpdmVyYWJsZVBhcnRzKERlbGl2ZXJhYmxlIGUsIExpc3Qgcm9vdHMpIHsKLQkJTGlzdCBsaXN0ID0gKChEZWxpdmVyYWJsZSkgZSkuZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0JCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJcm9vdHMuYWRkKG9iaik7Ci0JCQkJCWRlbGl2ZXJhYmxlUGFydHMoKERlbGl2ZXJhYmxlKSBvYmosIHJvb3RzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZFJvb3RDdXN0b21DYXRlZ29yaWVzKEN1c3RvbUNhdGVnb3J5IGUsIExpc3Qgcm9vdHMpIHsKLQkJTGlzdCBjcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoZSk7Ci0JCWlmIChjcyAhPSBudWxsICYmIGNzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY2MgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlpZiAoIVRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoY2MpKSB7Ci0JCQkJCWxvYWRSb290Q3VzdG9tQ2F0ZWdvcmllcyhjYywgcm9vdHMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICghcm9vdHMuY29udGFpbnMoZSkpIHsKLQkJCQkJCXJvb3RzLmFkZChlKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoIXJvb3RzLmNvbnRhaW5zKGUpKSB7Ci0JCQlyb290cy5hZGQoZSk7Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIHZvaWQgZmlsdGVyVXNlZEJhc2VDaGFpbihWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCS8vIFZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JLy8gaWYgKGJhc2UgIT0gbnVsbCkgewotCS8vIC8vIGlmIHRoZSBlbGVtZW50IGNoYWluIGlzIHNlbGVjdGVkIGFzIGJhc2UgaW4gdGhlIGN1cnJlbnQgY2hhaW4sCi0JLy8gLy8gbm8gZWxlbWVudCBpbiB0aGF0IGNoYWluIGNhbiBiZSBmdXRoZXIgc2VsZWN0ZWQKLQkvLyBPYmplY3Qgcm9vdCA9IGdldENoYWluUm9vdChiYXNlKTsKLQkvLyBpZiAoIWJhZGd1eXMuY29udGFpbnMocm9vdCkpIHsKLQkvLyBiYWRndXlzLmFkZChyb290KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNDb250YWlubWVudEZlYXR1cmUoKSB7Ci0JCXJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgRG9tYWluIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeQotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBBcnRpZmFjdCB8fCBlbGVtZW50IGluc3RhbmNlb2YgUHJhY3RpY2UKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcmFibGU7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGdldENoYWluUm9vdChNZXRob2RFbGVtZW50IGUpIHsKLQkJRU9iamVjdCByb290ID0gZTsKLQkJT2JqZWN0IHR5cGUgPSBlbGVtZW50LmdldFR5cGUoKTsKLQkJRU9iamVjdCBwYXJlbnQgPSBlOwotCQl3aGlsZSAoKHBhcmVudCA9IHBhcmVudC5lQ29udGFpbmVyKCkpICE9IG51bGwKLQkJCQkmJiAoKE1ldGhvZEVsZW1lbnQpIHBhcmVudCkuZ2V0VHlwZSgpID09IHR5cGUpIHsKLQkJCXJvb3QgPSBwYXJlbnQ7Ci0JCX0KLQotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCi0JCS8vIGFsd2F5cyBhY2NlcHQgcGFja2FnZXMKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkgfHwgb2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luCi0JCQkJfHwgb2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCXx8IG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gbXVzdCBiZSB2YXJpYWJpbGl0eSBlbGVtZW50IGFuZCBjYW4ndCBiZSBpdHNlbGYKLQkJaWYgKG9iaiA9PSBlbGVtZW50IHx8ICEob2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gbXVzdCBiZSB0aGUgc2FtZSB0eXBlCi0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iajsKLQkJaWYgKHZlLmdldFR5cGUoKSAhPSBlbGVtZW50LmdldFR5cGUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY2FuJ3QgYmUgbXkgYW55IG9mIG15IGdlbmVyYWxpemVycwotCQlpZiAoYmFkZ3V5cy5jb250YWlucyhvYmopKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBpZiB0aGlzIGVsZW1lbnQncyBiYXNlIGNoYWluIGlzIGEgYmFkZ3V5LCBjYW4ndCBhY2NlcHQsIG90aGVyd2lzZSwgYQotCQkvLyBjaXJjdWxhciBsb2NrCi0JCXdoaWxlICgodmUgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpICE9IG51bGwpIHsKLQkJCWlmIChiYWRndXlzLmNvbnRhaW5zKHZlKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkvLyBhbnl0aGluZyBlbHNlID8KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTMzMDRjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaXRlbSBwcm92aWRlcnMgZm9yIGRpc3BsYXlpbmcgYW5kIGZpbHRlcmluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0Fic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0Fic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiMTk3ZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9BYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5JRWxlbWVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgaXRlbSBwcm92aWRlciBhZGFwdGVyIGNsYXNzIGZvciB0aGUgIlByb2Nlc3NlcyIgZm9sZGVyIGluCi0gKiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSUVsZW1lbnRJdGVtUHJvdmlkZXIsIElHcm91cENvbnRhaW5lciB7Ci0JcHJvdGVjdGVkIE1hcCBncm91cEl0ZW1Qcm92aWRlck1hcDsKLQotCXByb3RlY3RlZCBNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdDsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgY2hpbGRyZW47Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc0NvbnRyaWJ1dGlvbkVuYWJsZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJlZlN0b3JlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMubW9kZWxTdHJ1Y3QgPSBtb2RlbFN0cnVjdDsKLQotCQkvLyBmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IFByb3ZpZGVycy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJLy8gaWYgKHByZWZTdG9yZSAhPSBudWxsKSB7Ci0JCS8vIHByb2Nlc3NDb250cmlidXRpb25FbmFibGVkID0gcHJlZlN0b3JlCi0JCS8vIC5nZXRCb29sZWFuKExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfRU5BQkxFX1BST0NFU1NfQ09OVFJJQlVUSU9OKTsKLQkJLy8gcHJlZlN0b3JlTGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8vCi0JCS8vIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gaWYgKGV2ZW50LmdldFByb3BlcnR5KCkgPT0KLQkJLy8gTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9FTkFCTEVfUFJPQ0VTU19DT05UUklCVVRJT04pIHsKLQkJLy8gYm9vbGVhbiBuZXdWYWx1ZSA9IHByZWZTdG9yZS5nZXRCb29sZWFuKGV2ZW50Ci0JCS8vIC5nZXRQcm9wZXJ0eSgpKTsKLQkJLy8gaWYgKHByb2Nlc3NDb250cmlidXRpb25FbmFibGVkICE9IG5ld1ZhbHVlKSB7Ci0JCS8vIHByb2Nlc3NDb250cmlidXRpb25FbmFibGVkID0gbmV3VmFsdWU7Ci0JCS8vIGZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCS8vIG5ldyBOb3RpZmljYXRpb25JbXBsKC0xLCAtMSwgLTEpLAotCQkvLyBBYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci50aGlzLCB0cnVlLAotCQkvLyBmYWxzZSkpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwotCQkvLyB9OwotCQkvLyBwcmVmU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmU3RvcmVMaXN0ZW5lcik7Ci0JCS8vIH0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IFByb3ZpZGVycy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJaWYgKHByZWZTdG9yZSAhPSBudWxsICYmIHByZWZTdG9yZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCXByZWZTdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZTdG9yZUxpc3RlbmVyKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXIjZ2V0R3JvdXBJdGVtUHJvdmlkZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEdyb3VwSXRlbVByb3ZpZGVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBncm91cEl0ZW1Qcm92aWRlck1hcC5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qcm9jZXNzZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9DYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9DYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YWRjYjY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBjYXBhYmlsaXR5IHBhdHRlcm4gaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkNhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwKLQkJCQkuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDM5OWVkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkNvbmZpZ3VyYXRpb25zIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkKLSAqIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIgewotCi0JLy8gcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IG1ldGhvZExpYnJhcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZExpYnJhcnkgbGliLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgbGliLCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gIShvYmogaW5zdGFuY2VvZiBQcm9jZXNzRmFtaWx5KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0NvbmZpZ3VyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChNZXRob2RMaWJyYXJ5KSB0YXJnZXQpCi0JCQkJCS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0NPTkZJR1VSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5LmNsYXNzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZChkb21haW4sIChFT2JqZWN0KSB0YXJnZXQsCi0JCQkJZmVhdHVyZSwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uLCB0aGlzKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kI2dldFZhbGlkYXRvcigpCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZU5hbWVWYWxpZGF0b3Iob3duZXIsIChNZXRob2RDb25maWd1cmF0aW9uKWNoaWxkKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkYXRvcigpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ29udGVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Db250ZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmOGNmMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Db250ZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5TdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LklFbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJNZXRob2QgQ29udGVudCIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5Ci0gKiB2aWV3LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyAiTWV0aG9kQ29udGVudEl0ZW1Qcm92aWRlciIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJRWxlbWVudEl0ZW1Qcm92aWRlciwgSUdyb3VwQ29udGFpbmVyIHsKLQotCXByaXZhdGUgTWV0aG9kUGx1Z2luIHBsdWdpbjsKLQotCXByaXZhdGUgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3Q7Ci0KLQlwcml2YXRlIE1hcCBncm91cEl0ZW1Qcm92aWRlck1hcDsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBDb250ZW50UGFja2FnZSBjb3JlQ29udGVudFBrZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luLCBNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMucGx1Z2luID0gcGx1Z2luOwotCQl0aGlzLm1vZGVsU3RydWN0ID0gbW9kZWxTdHJ1Y3Q7Ci0JfQotCQotCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiBjb3JlQ29udGVudFBrZzsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCVN0cmluZyBuYW1lOwotCQkJSUxpYnJhcnlJdGVtUHJvdmlkZXIgY2hpbGQ7Ci0KLQkJCS8vIGZpbmQgY29yZSBjb250ZW50IHBhY2thZ2UKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCW1vZGVsU3RydWN0LmNvcmVDb250ZW50UGF0aCk7Ci0JCQljb3JlQ29udGVudFBrZyA9IGNvbnRlbnRQa2c7Ci0JCQlpZiAoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29udGVudF9ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2hpbGQgPSBuZXcgTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCQljb250ZW50UGtnLCBuYW1lKTsKLQkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkJLy8gY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkvLyBtb2RlbFN0cnVjdC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCQkJCS8vIGlmKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCS8vIG5hbWUgPQotCQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIik7Ci0JCQkJLy8gY2hpbGQgPSBuZXcgRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJLy8gY29udGVudFBrZywgbmFtZSk7Ci0JCQkJLy8gY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCS8vIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCQkvLyB9Ci0JCQkJLy8JICAgICAgICAKLQkJCQkvLyBjb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCS8vIG1vZGVsU3RydWN0LmRvbWFpblBhdGgpOwotCQkJCS8vIGlmKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCS8vIG5hbWUgPQotCQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKTsKLQkJCQkvLyBjaGlsZCA9IG5ldyBEb21haW5zSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnLAotCQkJCS8vIG5hbWUpOwotCQkJCS8vIGNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQkvLyBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQkJLy8gfQotCQkJCS8vCQotCQkJCS8vIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJLy8gbW9kZWxTdHJ1Y3Qud29ya1Byb2R1Y3RUeXBlUGF0aCk7Ci0JCQkJLy8gaWYoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZSA9Ci0JCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cCIpOwotCQkJCS8vIGNoaWxkID0gbmV3IFdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJLy8gY29udGVudFBrZywgbmFtZSk7Ci0JCQkJLy8gY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCS8vIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCQkvLyB9Ci0JCQkJLy8JICAgICAgICAKLQkJCQkvLyBjb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCS8vIG1vZGVsU3RydWN0LnJvbGVTZXRQYXRoKTsKLQkJCQkvLyBpZihjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQkvLyBuYW1lID0KLQkJCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKTsKLQkJCQkvLyBjaGlsZCA9IG5ldyBSb2xlU2V0c0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZywKLQkJCQkvLyBuYW1lKTsKLQkJCQkvLyBjaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJCS8vIH0KLQkJCQkvLwkgICAgICAgIAotCQkJCS8vIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJLy8gbW9kZWxTdHJ1Y3QudG9vbFBhdGgpOwotCQkJCS8vIGlmKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCS8vIG5hbWUgPQotCQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIik7Ci0JCQkJLy8gY2hpbGQgPSBuZXcgVG9vbHNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2csCi0JCQkJLy8gbmFtZSk7Ci0JCQkJLy8gY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCS8vIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCQkvLyB9Ci0KLQkJCQkvLyBjcmVhdGUgdGhlIHN0YW5kYXJkIGNhdGVnb3JpZXMgZm9sZGVyCi0JCQkJY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJCW1vZGVsU3RydWN0LnN0YW5kYXJkQ2F0ZWdvcnlQYXRoKTsKLQkJCQlpZiAoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY2hpbGQgPSBuZXcgU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkJCWNvbnRlbnRQa2csIG5hbWUpOwotCQkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQkJfQotCi0JCQkJLy8gY3JlYXRlIHRoZSBjdXN0b21lIGNhdGVnb3JpZXMgZm9sZGVyCi0JCQkJLy8gY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkvLyBtb2RlbFN0cnVjdC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCQkJCS8vIGlmKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCS8vIG5hbWUgPQotCQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwIik7Ci0JCQkJLy8gY2hpbGQgPSBuZXcgQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkvLyBjb250ZW50UGtnLCBuYW1lKTsKLQkJCQkvLyBjaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJCS8vIH0KLQotCQkJCUN1c3RvbUNhdGVnb3J5IHJvb3RDdXN0b21DYXRlZ29yeSA9IFRuZ1V0aWwKLQkJCQkJCS5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkocGx1Z2luKTsKLQkJCQlpZiAocm9vdEN1c3RvbUNhdGVnb3J5ICE9IG51bGwpIHsKLQkJCQkJYm9vbGVhbiBub3RpZnkgPSByb290Q3VzdG9tQ2F0ZWdvcnkuZURlbGl2ZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJvb3RDdXN0b21DYXRlZ29yeS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJCQlyb290Q3VzdG9tQ2F0ZWdvcnkuc2V0TmFtZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXJvb3RDdXN0b21DYXRlZ29yeS5lU2V0RGVsaXZlcihub3RpZnkpOwotCQkJCQl9Ci0JCQkJCWNoaWxkcmVuLmFkZChyb290Q3VzdG9tQ2F0ZWdvcnkpOwotCQkJCX0KLQotCQkJCS8vIElDb25maWd1cmFibGUgYWRhcHRlciA9IChJQ29uZmlndXJhYmxlKQotCQkJCS8vIFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KS5hZGFwdChjb250ZW50UGtnLAotCQkJCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJLy8gYWRhcHRlci5zZXRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9NZXRob2RDb250ZW50X2dyb3VwIikpOwotCQkJCS8vIGNoaWxkcmVuLmFkZChjb250ZW50UGtnKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0NvbnRlbnQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lciNnZXRHcm91cEl0ZW1Qcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwICE9IG51bGwgPyBncm91cEl0ZW1Qcm92aWRlck1hcC5nZXQobmFtZSkKLQkJCQk6IG51bGw7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChncm91cEl0ZW1Qcm92aWRlck1hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncm91cEl0ZW1Qcm92aWRlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCQkJCSgoSURpc3Bvc2FibGUpIGFkYXB0ZXIpLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5jbGVhcigpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBudWxsOwotCQl9Ci0JCWlmKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCX0KLQkJcGx1Z2luID0gbnVsbDsKLQkJY29yZUNvbnRlbnRQa2cgPSBudWxsOwotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0RlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MjljZmE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZGVsaXZlcnkgcHJvY2VzcyBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzQ0NGU4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVJlZmVyZW5jZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5icmVha2Rvd25lbGVtZW50LkFjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuYnJlYWtkb3duZWxlbWVudC5NaWxlc3RvbmVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Eb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Sb2xlU2V0Q2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Sb2xlU2V0SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuVG9vbEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LldvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuQXJ0aWZhY3RJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LkNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50Lkd1aWRhbmNlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5Sb2xlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5TZWN0aW9uSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5UYXNrSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJaW1wbGVtZW50cyBJUmVmZXJlbmNlciB7Ci0KLQlwcml2YXRlIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyOwotCi0JcHJpdmF0ZSBBcnRpZmFjdEl0ZW1Qcm92aWRlciBteUFydGlmYWN0SXRlbVByb3ZpZGVyOwotCi0JcHJpdmF0ZSBHdWlkYW5jZUl0ZW1Qcm92aWRlciBndWlkYW5jZUl0ZW1Qcm92aWRlcjsKLQotCXByaXZhdGUgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgbXlPdXRjb21lSXRlbVByb3ZpZGVyOwotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciBteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogUmVmZXJlbmNlcyB0byBzdGF0ZWZ1bCBhZGFwdGVycyBjcmVhdGVkIGJ5IHRoaXMgYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHJpdmF0ZSBTZXQgZGlzcG9zYWJsZUFkYXB0ZXJzID0gbmV3IEhhc2hTZXQoKTsKLQotCS8vIHByb3RlY3RlZCBDb2xsZWN0aW9uIGFkYXB0ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2FkYXB0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gc3VwZXIuYWRhcHQobm90aWZpZXIsIHR5cGUpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlcgotCQkJCSYmIG5vdGlmaWVyIGluc3RhbmNlb2YgRU9iamVjdAotCQkJCSYmICgoRU9iamVjdCkgbm90aWZpZXIpLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlkaXNwb3NhYmxlQWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvcmVjb250ZW50QWRhcHRlckZhY3RvcnkjY3JlYXRlUm9sZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVBZGFwdGVyKCkgewotCQlpZiAocm9sZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyb2xlSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29yZWNvbnRlbnRBZGFwdGVyRmFjdG9yeSNjcmVhdGVUYXNrQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0FkYXB0ZXIoKSB7Ci0JCWlmICh0YXNrSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRhc2tJdGVtUHJvdmlkZXIgPSBuZXcgVGFza0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0YXNrSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLldvcmtwcm9kdWN0c0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFydGlmYWN0QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCkgewotCQlpZiAobXlBcnRpZmFjdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlteUFydGlmYWN0SXRlbVByb3ZpZGVyID0gbmV3IEFydGlmYWN0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG15QXJ0aWZhY3RJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RBZGFwdGVyKCkgewotCQlpZiAod29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLldvcmtwcm9kdWN0c0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZURlbGl2ZXJhYmxlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcmFibGVBZGFwdGVyKCkgewotCQlpZiAobXlEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyID0gbmV3IFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlci5jcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKSk7Ci0JCX0KLQotCQlyZXR1cm4gbXlEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Xb3JrcHJvZHVjdHNBZGFwdGVyRmFjdG9yeSNjcmVhdGVPdXRjb21lQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0Y29tZUFkYXB0ZXIoKSB7Ci0JCWlmIChteU91dGNvbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbXlPdXRjb21lSXRlbVByb3ZpZGVyID0gbmV3IFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlci5jcmVhdGVPdXRjb21lQWRhcHRlcigpKTsKLQkJfQotCi0JCXJldHVybiBteU91dGNvbWVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uQWRhcHRlcigpIHsKLQkJaWYgKG1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVNZXRob2RMaWJyYXJ5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzRmFtaWx5QWRhcHRlcigpCi0JICovCi0JLyoKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzRmFtaWx5QWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXI7Ci0JfQotCSovCi0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50UGFja2FnZUFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCkgewotCQlNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgYWRhcHRlciA9IG5ldyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCWFkYXB0ZXIuc2V0TW9kZWxTdHJ1Y3R1cmUoTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVCk7Ci0JCS8vIGFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWV0aG9kbW9kZWxzQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWV0aG9kbW9kZWxzQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50Y2F0ZWdvcmllc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyID0gbmV3IERpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50Y2F0ZWdvcmllc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZURvbWFpbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKSB7Ci0JCWlmIChkb21haW5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZG9tYWluSXRlbVByb3ZpZGVyID0gbmV3IERvbWFpbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkb21haW5JdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEdyb3VwaW5nQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IFJvbGVTZXRDYXRlZ29yeUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50Y2F0ZWdvcmllc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lQWRhcHRlcigpIHsKLQkJLy8gaWYgKGRpc2NpcGxpbmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkvLyBkaXNjaXBsaW5lSXRlbVByb3ZpZGVyID0gbmV3IERpc2NpcGxpbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gcmV0dXJuIGRpc2NpcGxpbmVJdGVtUHJvdmlkZXI7Ci0KLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IERpc2NpcGxpbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIGFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudGNhdGVnb3JpZXNBZGFwdGVyRmFjdG9yeSNjcmVhdGVSb2xlU2V0QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEFkYXB0ZXIoKSB7Ci0JCS8vIGlmIChyb2xlU2V0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJLy8gcm9sZVNldEl0ZW1Qcm92aWRlciA9IG5ldyBSb2xlU2V0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIHJldHVybiByb2xlU2V0SXRlbVByb3ZpZGVyOwotCi0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBSb2xlU2V0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Db250ZW50Y2F0ZWdvcmllc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRvb2xBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUb29sQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IFRvb2xJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIGFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkNvbnRlbnRjYXRlZ29yaWVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlV29ya1Byb2R1Y3RUeXBlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RUeXBlQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IFdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFBZGFwdGVyRmFjdG9yeSNjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpIHsKLQkJaWYgKGd1aWRhbmNlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWd1aWRhbmNlSXRlbVByb3ZpZGVyID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBndWlkYW5jZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQ2hlY2tsaXN0QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hlY2tsaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDb25jZXB0QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uY2VwdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRXN0aW1hdGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFc3RpbWF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zCi0JICogICAgICBBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUVzdGltYXRpbmdNZXRyaWNBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFc3RpbWF0aW5nTWV0cmljQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVFeGFtcGxlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhhbXBsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmFjdGljZUFkYXB0ZXIoKSB7Ci0JCWlmIChwcmFjdGljZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcmFjdGljZUl0ZW1Qcm92aWRlciA9IG5ldyBQcmFjdGljZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gcHJhY3RpY2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJlcG9ydEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlcG9ydEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUm9hZG1hcEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvYWRtYXBBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXVzYWJsZUFzc2V0QWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWxBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWxBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRlY2huaXF1ZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlY2huaXF1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVGVtcGxhdGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZW1wbGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVGVybURlZmluaXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xNZW50b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdvcmtQcm9kdWN0R3VpZGVsaW5lQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RHdWlkZWxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChzZWN0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlY3Rpb25JdGVtUHJvdmlkZXIgPSBuZXcgU2VjdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZWN0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDdXN0b21DYXRlZ29yeUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpIHsKLQkJaWYgKGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyID0gbmV3IEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdoaXRlcGFwZXJBZGFwdGVyKCkgewotCQkvLyBpZiAod2hpdGVwYXBlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCS8vIHdoaXRlcGFwZXJJdGVtUHJvdmlkZXIgPSBuZXcgV2hpdGVwYXBlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gfQotCQkvLwotCQkvLyByZXR1cm4gd2hpdGVwYXBlckl0ZW1Qcm92aWRlcjsKLQotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlpZiAoY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgPSBuZXcgQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCWlmIChkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyID0gbmV3IERlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUd1aWRlbGluZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRlbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoY29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVSb2xlRGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUYXNrRGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkgewotCQlpZiAobWlsZXN0b25lSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1pbGVzdG9uZUl0ZW1Qcm92aWRlciA9IG5ldyBNaWxlc3RvbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIG1pbGVzdG9uZUl0ZW1Qcm92aWRlcjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChndWlkYW5jZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlndWlkYW5jZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCQlndWlkYW5jZUl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCX0KLQkJaWYgKG15QXJ0aWZhY3RJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbXlBcnRpZmFjdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCQlteUFydGlmYWN0SXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJfQotCQlpZiAobXlEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCW15RGVsaXZlcmFibGVJdGVtUHJvdmlkZXIgPSBudWxsOwotCQl9Ci0JCWlmIChteU91dGNvbWVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbXlPdXRjb21lSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCW15T3V0Y29tZUl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCX0KLQkJaWYgKHdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCXdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJfQotCi0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QoYWRhcHRlcnMpLml0ZXJhdG9yKCk7Ci0JCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBPYmplY3QgYWRhcHRlciA9IGl0ZXIubmV4dCgpOwotCQkvLyBpZihhZGFwdGVyIGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJLy8gKChJRGlzcG9zYWJsZSlhZGFwdGVyKS5kaXNwb3NlKCk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBhZGFwdGVycy5jbGVhcigpOwotCi0JCWlmICghZGlzcG9zYWJsZUFkYXB0ZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlzcG9zYWJsZUFkYXB0ZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlEaXNwb3NhYmxlIGFkYXB0ZXIgPSAoSURpc3Bvc2FibGUpIGl0ZXIubmV4dCgpOwotCQkJCWFkYXB0ZXIuZGlzcG9zZSgpOwotCQkJfQotCQkJZGlzcG9zYWJsZUFkYXB0ZXJzLmNsZWFyKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlciNyZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IHJlZikgewotCQlyZXR1cm4gZGlzcG9zYWJsZUFkYXB0ZXJzLnJlbW92ZShyZWYpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlciNjbGVhblVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhblVwKCkgewotCQlBcnJheUxpc3QgYWRhcHRlcnNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChkaXNwb3NhYmxlQWRhcHRlcnMpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3RhdGVmdWxJdGVtUHJvdmlkZXIKLQkJCQkJJiYgYWRhcHRlci5nZXRUYXJnZXQoKSA9PSBudWxsKSB7Ci0JCQkJYWRhcHRlcnNUb1JlbW92ZS5hZGQoYWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTogbnVtYmVyIG9mIGFkYXB0ZXJzIHRvIHJlbW92ZTogIgotCQkJCQkJCSsgYWRhcHRlcnNUb1JlbW92ZS5zaXplKCkpOwotCQl9Ci0JCWRpc3Bvc2FibGVBZGFwdGVycy5yZW1vdmVBbGwoYWRhcHRlcnNUb1JlbW92ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYWQ5NzhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVPYmplY3QgbGliID0gKEVPYmplY3QpIHBhcmVudDsKLQkJCWlmIChsaWIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCU1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkJLmdldEFkYXB0ZXIobGliLCBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJCXJldHVybiBpdGVtUHJvdmlkZXIgIT0gbnVsbCA/IGl0ZW1Qcm92aWRlci5nZXRDb25maWd1cmF0aW9ucygpCi0JCQkJCTogbnVsbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjg0NDNkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUGx1Z2luVUlQYWNrYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUGx1Z2luVUlQYWNrYWdlc01hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIgY29uZmlndXJhdGlvbnM7Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyPiBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXI+KCk7Ci0JCi0KLQkvL3ByaXZhdGUgUHJvY2Vzc0ZhbWlsaWVzSXRlbVByb3ZpZGVyIHByb2NGYW1pbGllczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlTWV0aG9kUGx1Z2luKCkpKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgY2hpbGRyZW47Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5ICYmICFQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLmlzRmxhdExheW91dCgpKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zID0gZ2V0TWV0aG9kUGx1Z2lucygoTWV0aG9kTGlicmFyeSlvYmplY3QpOwotCQkJYWRkQ2hpbGRyZW4oY2hpbGRyZW4sIHBsdWdpbnMsIG9iamVjdCk7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuLCBDb21wYXJhdG9ycy5QTFVHSU5QQUNLQUdFX0NPTVBBUkFUT1IpOwotCQl9IGVsc2UgeyAKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlpZiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQljaGlsZHJlbiA9IChMaXN0KSBjb2xsZWN0aW9uOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoY29sbGVjdGlvbik7Ci0JCQl9Ci0JCQkvLyBzZXQgcGFyZW50cwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChpdGVyLm5leHQoKSwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuLCBDb21wYXJhdG9ycy5QTFVHSU5QQUNLQUdFX0NPTVBBUkFUT1IpOwotCQl9Ci0JCWlmIChjb25maWd1cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQljb25maWd1cmF0aW9ucyA9IG5ldyBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJKE1ldGhvZExpYnJhcnkpIG9iamVjdCwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ29uZmlndXJhdGlvbnNfdGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNoaWxkcmVuLmFkZChjb25maWd1cmF0aW9ucyk7Ci0KLQkJLy8gUmVtb3ZlICdQcm9jZXNzIEZhbWlsaWVzJyB1bnRpbCBpdCBpcyBmdWxseSBpbXBsZW1lbnRlZAotCQkvLwotCQkvLyBpZihwcm9jRmFtaWxpZXMgPT0gbnVsbCkgewotCQkvLyBwcm9jRmFtaWxpZXMgPSBuZXcgUHJvY2Vzc0ZhbWlsaWVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkvLyAoTWV0aG9kTGlicmFyeSkgb2JqZWN0LAotCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRmFtaWxpZXNfdGV4dCIpKTsKLQkJLy8gfQotCQkvLyBjaGlsZHJlbi5hZGQocHJvY0ZhbWlsaWVzKTsKLQkJCi0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgTGlzdDxNZXRob2RQbHVnaW4+IHBsdWdpbnMsIE9iamVjdCBwYXJlbnQpIHsKLQkJUGx1Z2luVUlQYWNrYWdlc01hcCBtYXAgPSBuZXcgUGx1Z2luVUlQYWNrYWdlc01hcCgpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaXRlciA9IHBsdWdpbnMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBwbHVnaW5OYW1lID0gcGx1Z2luLmdldE5hbWUoKTsKLQkJCWludCBkb3RJZHggPSBwbHVnaW5OYW1lLmluZGV4T2YoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci5QQUNLQUdFX1NFUEFSQVRPUik7Ci0JCQlpZiAoZG90SWR4ICE9IC0xKSB7Ci0JCQkJbWFwLmFkZChwbHVnaW5OYW1lLnN1YnN0cmluZygwLCBkb3RJZHgpLCBwbHVnaW4pOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZHJlbi5hZGQocGx1Z2luKTsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBsdWdpbiwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBleGlzdGluZ05hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFNldDxNZXRob2RQbHVnaW4+Pj4gaXRlciA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnk8U3RyaW5nLCBTZXQ8TWV0aG9kUGx1Z2luPj4gZW50cnkgPSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlTZXQ8TWV0aG9kUGx1Z2luPiBwbHVnU2V0ID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCVBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAuZ2V0KG5hbWUpOwotCQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCQlwcm92aWRlciA9IG5ldyBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBuYW1lLCBwbHVnU2V0KTsKLQkJCQlwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAucHV0KG5hbWUsIHByb3ZpZGVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvdmlkZXIuc2V0UGx1Z2lucyhwbHVnU2V0KTsKLQkJCX0KLQkJCWV4aXN0aW5nTmFtZXMuYWRkKG5hbWUpOwotCQkJcHJvdmlkZXIuc2V0UGFyZW50KHBhcmVudCk7Ci0JCQljaGlsZHJlbi5hZGQocHJvdmlkZXIpOwotCQl9Ci0JCXJldGFpblBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVycyhleGlzdGluZ05hbWVzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJldGFpblBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVycyhDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXMpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBrZXlOYW1lID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIW5hbWVzLmNvbnRhaW5zKGtleU5hbWUpKSB7Ci0JCQkJUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5nZXQoa2V5TmFtZSk7Ci0JCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJcHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldE1ldGhvZFBsdWdpbnMoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPigpOwotCQlFTGlzdCBlbGVtZW50cyA9IGxpYnJhcnkuZUNvbnRlbnRzKCk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJaXRlbXMuYWRkKChNZXRob2RQbHVnaW4pZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQotCXB1YmxpYyBPYmplY3QgZ2V0Q29uZmlndXJhdGlvbnMoKSB7Ci0JCXJldHVybiBjb25maWd1cmF0aW9uczsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb2Nlc3NGYW1pbGllcygpIHsKLQkJLy9yZXR1cm4gcHJvY0ZhbWlsaWVzOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUFkZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgaW50KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChjb25maWd1cmF0aW9ucyAhPSBudWxsKSB7Ci0JCQljb25maWd1cmF0aW9ucy5kaXNwb3NlKCk7Ci0JCQljb25maWd1cmF0aW9ucyA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmIChwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAgIT0gbnVsbCkgewotCQkJcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmNsZWFyKCk7Ci0JCQlwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAgPSBudWxsOwotCQl9Ci0JCQotCQkvKgotCQlpZiAocHJvY0ZhbWlsaWVzICE9IG51bGwpIHsKLQkJCXByb2NGYW1pbGllcy5kaXNwb3NlKCk7Ci0JCQlwcm9jRmFtaWxpZXMgPSBudWxsOwotCQl9Ci0JCSovCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE4YjFjMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ29udGVudCBQYWNrYWdlcyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5Ci0gKiB2aWV3LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyAiQ29udGVudFBhY2thZ2VzSXRlbVByb3ZpZGVyIiBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQ29udGVudFBhY2thZ2UoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gdGFyZ2V0KSB7Ci0JCQlpbnQgZmVhdHVyZUlkID0gbXNnLmdldEZlYXR1cmVJRChDb250ZW50UGFja2FnZS5jbGFzcyk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUykgewotCQkJCWJvb2xlYW4gbm90aWZ5ID0gZmFsc2U7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCW5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZm9yX2NoZWNrOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQkJbm90aWZ5ID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmb3JfY2hlY2s7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJfQotCQkJCWlmIChub3RpZnkpIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIHRoaXMsIHRydWUsCi0JCQkJCQkJZmFsc2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgKLQkJCQkJKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KS5nZXRDaGlsZFBhY2thZ2VzKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19DT05URU5UX1BBQ0tBR0UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIENvbnRlbnRQYWNrYWdlLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSAoTGlzdCkgc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQkvLyBzb3J0aW5nIHRoZSBjb250ZW50IHBhY2thZ2VzCi0JCS8vCi0JCUNvbGxlY3Rpb25zLnNvcnQoY2hpbGRyZW4sIENvbXBhcmF0b3JzLkRFRkFVTFRfQ09NUEFSQVRPUik7Ci0KLQkJLy8gc2V0IHBhcmVudCBmb3IgY2hpbGRyZW4KLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoY2hpbGQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzg2YjA2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlBsdWdpblVJUGFja2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5TdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBtZXRob2QgcGx1Zy1pbiBpbiB0aGUgTGlicmFyeQotICogdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIGV4dGVuZHMgU3RydWN0dXJlZE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBvZiB0aGlzIEl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgb2JqZWN0OwotCi0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQkJU3RyaW5nIG5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQlPYmplY3QgY2hpbGQgPSBuZXcgQ29udGVudEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgcGx1Z2luLAotCQkJCQlnZXRNb2RlbFN0cnVjdHVyZSgpKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgcGx1Z2luLAotCQkJCQlnZXRNb2RlbFN0cnVjdHVyZSgpKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCQljaGlsZHJlbiA9IG51bGw7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoKE1ldGhvZFBsdWdpbikgb2JqZWN0KS5nZXRVc2VyQ2hhbmdlYWJsZSgpLmJvb2xlYW5WYWx1ZSgpKSA/IFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGx1Z2luIikgOiAvLyROT04tTkxTLTEkCi0JCQkJVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RQbHVnaW5fZ3JleSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kUGx1Z2luLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19OQU1FOgotCQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgdHJ1ZSkpOwotCQkJVG5nVXRpbC5yZWZyZXNoUGx1Z2luRXh0ZW5kZXJzKHRoaXMsIG5vdGlmaWNhdGlvbiwgdHJ1ZSwgdHJ1ZSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIG5hbWUgPSBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JCQotCQlpZiAoKGdldFBhcmVudCgpIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgJiYgIVBsdWdpblVJUGFja2FnZUNvbnRleHQuSU5TVEFOQ0UuaXNGbGF0TGF5b3V0KCkpIHsKLQkJCVN0cmluZyBkZWx0YU5hbWUgPSBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyLmdldE5hbWVEZWx0YSgoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcilnZXRQYXJlbnQoKSwgb2JqZWN0KTsKLQkJCXJldHVybiBkZWx0YU5hbWU7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1BsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjN2MzYjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUGx1Z2luVUlQYWNrYWdlc01hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogSXRlbSBQcm92aWRlciBBZGFwdGVyIHRoYXQgcmVwcmVzZW50cyBhIHBsdWdpbi1wYWNrYWdlLiAgVGhpcyBpcyBhIFVJIGZvbGRlciBvbmx5Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX1NFUEFSQVRPUiA9ICIuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gcGx1Z2luczsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcj4gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyPigpOwotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgcGFja2FnZU5hbWUsIENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBwbHVnaW5zKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5uYW1lID0gcGFja2FnZU5hbWU7Ci0JCXRoaXMucGx1Z2lucyA9IHBsdWdpbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBvZiB0aGlzIEl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBuYW1lOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9wYWNrYWdlX29iaiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZURlbHRhKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgdG9wT2JqZWN0LCBPYmplY3QgYm90dG9tT2JqZWN0KSB7Ci0JCQotCQlTdHJpbmcgdG9wTmFtZT0gdG9wT2JqZWN0LmdldEZ1bGxOYW1lKCk7Ci0JCVN0cmluZyBib3R0b21OYW1lID0gbnVsbDsKLQkJaWYgKGJvdHRvbU9iamVjdCBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWJvdHRvbU5hbWUgPSAoKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpYm90dG9tT2JqZWN0KS5nZXRGdWxsTmFtZSgpOwotCQkJCi0JCX0gZWxzZSBpZiAoYm90dG9tT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlib3R0b21OYW1lID0gKChNZXRob2RQbHVnaW4pYm90dG9tT2JqZWN0KS5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCWlmKGJvdHRvbU5hbWUgPT0gbnVsbCB8fCB0b3BOYW1lLmVxdWFscyhib3R0b21OYW1lKSkKLQkJCXJldHVybiB0b3BOYW1lOwotCQl0cnkgewotCQkJU3RyaW5nIGRlbHRhbmFtZT0gYm90dG9tTmFtZS5zdWJzdHJpbmcodG9wTmFtZS5sZW5ndGgoKSsxKTsKLQkJCXJldHVybiBkZWx0YW5hbWU7Ci0JCX0gY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGJvdHRvbU5hbWU7Ci0JCX0KLQl9Ci0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxPYmplY3Q+IGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCXJldHVybiBhZGRDaGlsZHJlbihwbHVnaW5zKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPE9iamVjdD4gYWRkQ2hpbGRyZW4oQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJUGx1Z2luVUlQYWNrYWdlc01hcCBtYXAgPSBuZXcgUGx1Z2luVUlQYWNrYWdlc01hcCgpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaXRlciA9IHBsdWdpbnMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBkZWx0YU5hbWUgPSBnZXROYW1lRGVsdGEodGhpcywgcGx1Z2luKTsKLQkJCWludCBkb3RJZHggPSBkZWx0YU5hbWUuaW5kZXhPZihQQUNLQUdFX1NFUEFSQVRPUik7Ci0JCQlpZiAoZG90SWR4ICE9IC0xKSB7Ci0JCQkJbWFwLmFkZChkZWx0YU5hbWUuc3Vic3RyaW5nKDAsIGRvdElkeCksIHBsdWdpbik7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkcmVuLmFkZChwbHVnaW4pOwotCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQocGx1Z2luLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU2V0PE1ldGhvZFBsdWdpbj4+PiBpdGVyID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeTxTdHJpbmcsIFNldDxNZXRob2RQbHVnaW4+PiBlbnRyeSA9IGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCVNldDxNZXRob2RQbHVnaW4+IHBsdWdTZXQgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5nZXQoZ2V0RnVsbE5hbWUoKSArIFBBQ0tBR0VfU0VQQVJBVE9SICsgbmFtZSk7Ci0JCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCXByb3ZpZGVyID0gbmV3IFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG5hbWUsIHBsdWdTZXQpOwotCQkJCXBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5wdXQoZ2V0RnVsbE5hbWUoKSArIFBBQ0tBR0VfU0VQQVJBVE9SICsgbmFtZSwgcHJvdmlkZXIpOwotCQkJfSBlbHNlIHsKLQkJCQlwcm92aWRlci5zZXRQbHVnaW5zKHBsdWdTZXQpOwotCQkJfQotCQkJZXhpc3RpbmdOYW1lcy5hZGQoZ2V0RnVsbE5hbWUoKSArIFBBQ0tBR0VfU0VQQVJBVE9SICsgbmFtZSk7Ci0JCQlwcm92aWRlci5zZXRQYXJlbnQodGhpcyk7Ci0JCQljaGlsZHJlbi5hZGQocHJvdmlkZXIpOwotCQl9Ci0JCXJldGFpblBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVycyhleGlzdGluZ05hbWVzKTsKLQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwgQ29tcGFyYXRvcnMuUExVR0lOUEFDS0FHRV9DT01QQVJBVE9SKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgewotCQlTdHJpbmcgZnVsbE5hbWUgPSBnZXROYW1lKCk7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLQkJd2hpbGUgKHBhcmVudCBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWZ1bGxOYW1lID0gKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKXBhcmVudCkuZ2V0TmFtZSgpICsgUEFDS0FHRV9TRVBBUkFUT1IgKyBmdWxsTmFtZTsKLQkJCXBhcmVudCA9ICgoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcilwYXJlbnQpLmdldFBhcmVudCgpOwotCQl9Ci0JCXJldHVybiBmdWxsTmFtZTsKLQkJCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50OwotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kUGx1Z2luLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTkFNRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIHRydWUpKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIHJlbW92ZSB0aGlzIGZyb20gdGhlIHBsdWdpbnMnIGFkYXB0ZXIgbGlzdAotCQlpZiAocGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwICE9IG51bGwpIHsKLQkJCXBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5jbGVhcigpOwotCQkJcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwID0gbnVsbDsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZXRhaW5QbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnMoQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcga2V5TmFtZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFuYW1lcy5jb250YWlucyhrZXlOYW1lKSkgewotCQkJCVBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAuZ2V0KGtleU5hbWUpOwotCQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCXByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IGdldFBsdWdpbnMoKSB7Ci0JCXJldHVybiBwbHVnaW5zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBsdWdpbnMoQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMpIHsKLQkJdGhpcy5wbHVnaW5zID0gcGx1Z2luczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJhY3RpY2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJhY3RpY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWEwZTIyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1ByYWN0aWNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcHJhY3RpY2UuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5QcmFjdGljZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElEZWZhdWx0TmFtZVNldHRlciB7Ci0KLQlwdWJsaWMgUHJhY3RpY2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5QcmFjdGljZUl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZV9TdWJQcmFjdGljZXMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHJhY3RpY2UoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByYWN0aWNlSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRQcmFjdGljZV9TdWJQcmFjdGljZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJT2JqZWN0IHBhcmVudCA9IFRuZ1V0aWwKLQkJCQkuZ2V0TmF2aWdhdG9yUGFyZW50SXRlbVByb3ZpZGVyKChHdWlkYW5jZSkgb2JqZWN0KTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfUHJhY3RpY2VfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSAhPSBudWxsKSB7Ci0JCQkJVVJJIGltZ1VyaSA9IFRuZ1V0aWwuZ2V0RnVsbFBhdGhvZk5vZGVvclNoYXBlSWNvblVSSSgKLQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkpOwotCQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSh0aGlzLCBtc2cpOwotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVByYWN0aWNlIHByYWN0aWNlID0gKFByYWN0aWNlKSBnZXRQYXJlbnQob2JqKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKHByYWN0aWNlLmdldFN1YlByYWN0aWNlcygpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUFJBQ1RJQ0UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBQcmFjdGljZS5jbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEyM2Y0NWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudCBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIGlmKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkvLyBjaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKSk7Ci0JCS8vIC8vCi0JCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlX0JyZWFrZG93bkVsZW1lbnRzKCkpOwotCQkvLyAvLwotCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZV9XQlMoKSk7Ci0JCS8vIC8vCi0JCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlX09CUygpKTsKLQkJLy8gLy8KLQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2VfUEJTKCkpOwotCQkvLyB9Ci0JCS8vIHJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCi0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkuZ2V0UHJvY2VzcygpOwotCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm4iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQcm9jZXNzQ29tcG9uZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX05BTUU6Ci0JCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gKFByb2Nlc3NDb21wb25lbnQpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJaWYgKHBjLmdldFByb2Nlc3MoKSAhPSBudWxsKSB7Ci0JCQkJYm9vbGVhbiBvbGQgPSBwYy5nZXRQcm9jZXNzKCkuZURlbGl2ZXIoKTsKLQkJCQl0cnkgewotCQkJCQlwYy5nZXRQcm9jZXNzKCkuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCQlwYy5nZXRQcm9jZXNzKCkuc2V0TmFtZShwYy5nZXROYW1lKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXBjLmdldFByb2Nlc3MoKS5lU2V0RGVsaXZlcihvbGQpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzRmFtaWxpZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0ZhbWlsaWVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzYmRjNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzRmFtaWxpZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiUHJvY2VzcyBGYW1pbGllcyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5Ci0gKiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0ZhbWlsaWVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0ZhbWlsaWVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kTGlicmFyeSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NGYW1pbHkoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBQcm9jZXNzRmFtaWx5OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlsaWVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHkpCi0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoTWV0aG9kTGlicmFyeSkgdGFyZ2V0KQotCQkJCQkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCksIChNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19QUk9DRVNTX0ZBTUlMWSk7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKE1ldGhvZExpYnJhcnkpIHRhcmdldCkKLQkJCQkJLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQ09ORklHVVJBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnkuY2xhc3M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZGJkMzJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSBwcm9jZXNzIGZhbWlseSBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGxpYiA9IChFT2JqZWN0KSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKGxpYiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihsaWIsIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gaXRlbVByb3ZpZGVyICE9IG51bGwgPyBpdGVtUHJvdmlkZXIuZ2V0UHJvY2Vzc0ZhbWlsaWVzKCkgOiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZTRkMTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklQcm9jZXNzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkNyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBwcm9jZXNzIHBhY2thZ2UgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVByb2Nlc3NJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgRUNsYXNzIHByb2Nlc3NUeXBlOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzVHlwZSgpIHsKLQkJcmV0dXJuIHByb2Nlc3NUeXBlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50KCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KQotCQkJCQkmJiAoY2hpbGQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkpIHsKLQkJCQlQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpCi0JCQkJCQkuYWRhcHQoY2hpbGQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKHByb2Nlc3NUeXBlICE9IG51bGwpCi0JCQkJCWl0ZW1Qcm92aWRlci5zZXRQcm9jZXNzVHlwZShwcm9jZXNzVHlwZSk7Ci0JCQl9Ci0JCX0KLQotCQlDb2xsZWN0aW9ucy5zb3J0KChMaXN0KSBjaGlsZHJlbiwgUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGFja2FnZUNvbXBhcmF0b3IoKSk7Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlyZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCUVDbGFzcyBwcm9jVHlwZSA9IGdldFByb2Nlc3NUeXBlKCk7Ci0JCWlmIChwcm9jVHlwZSAhPSBudWxsKSB7Ci0JCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwKLQkJCQkJJiYgcGFyZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJaWYgKHByb2NUeXBlCi0JCQkJCQkuZXF1YWxzKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENhcGFiaWxpdHlQYXR0ZXJuKCkpKQotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm5zIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIGlmIChwcm9jVHlwZS5lcXVhbHMoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3MoKSkpCi0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3NlcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvY2Vzc1R5cGUoRUNsYXNzIHByb2Nlc3NUeXBlKSB7Ci0JCXRoaXMucHJvY2Vzc1R5cGUgPSBwcm9jZXNzVHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5jcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQoKSIpOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gbmV3IENyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsCi0JCQkJCXZhbHVlLCBpbmRleCwgY29sbGVjdGlvbiwgdGhpcyk7Ci0JCX0KLQkJLy8gcmV0dXJuIHN1cGVyLmNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCB2YWx1ZSwKLQkJLy8gaW5kZXgsIGNvbGxlY3Rpb24pOwotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwKLQkJCQl2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24sIHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCUVDbGFzcyBwcm9jZXNzVHlwZSA9IGdldFByb2Nlc3NUeXBlKCk7Ci0JCQlpZiAocHJvY2Vzc1R5cGUgIT0gbnVsbCkgewotCQkJCWlmIChwcm9jZXNzVHlwZS5lcXVhbHMoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDYXBhYmlsaXR5UGF0dGVybigpKSkgewotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmIChwcm9jZXNzVHlwZS5lcXVhbHMoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3MoKSkpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKHByb2Nlc3NUeXBlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSkgewotCQkJCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCUVDbGFzcyBwcm9jZXNzVHlwZSA9IGdldFByb2Nlc3NUeXBlKCk7Ci0JCQlpZiAocHJvY2Vzc1R5cGUgIT0gbnVsbCkgewotCQkJCWlmIChwcm9jZXNzVHlwZS5lcXVhbHMoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDYXBhYmlsaXR5UGF0dGVybigpKSkgewotCQkJCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmIChwcm9jZXNzVHlwZS5lcXVhbHMoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3MoKSkpIHsKLQkJCQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKHByb2Nlc3NUeXBlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSkgewotCQkJCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkSW1hZ2Uob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVBZGRDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgaW50KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCS8vIGNoZWNrIHRvIGV4Y2x1ZGUgYW55IHBhc3RlZC1pbiBwYWNrYWdlIHRoYXQgY29udGFpbnMKLQkJCQkvLyBwcm9jZXNzIG9mIGRpZmZlcmVudCB0eXBlIHRoYW4gdGhhdCBvZiB0aGlzIHBhY2thZ2UKLQkJCQkvLwotCQkJCWlmICghUHJvY2Vzc1V0aWwuaGFzUHJvY2Vzc05vdE9mVHlwZSgoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQsCi0JCQkJCQlwcm9jZXNzVHlwZSkpIHsKLQkJCQkJc2VsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0KLQkJLy8gcmV0dXJuIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwKLQkJLy8gaW5kZXgpOwotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIHNlbGVjdGlvbiwgaW5kZXgpKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBmZWF0dXJlQ2hhbmdlZChFT2JqZWN0IG9iamVjdCwKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQkmJiBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKSB7Ci0JCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqZWN0KS5nZXRQcm9jZXNzKCk7Ci0JCQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQkJCXByb2Muc2V0TmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXIpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50OwotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlYWQ4MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJQcm9jZXNzZXMiIGZvbGRlciBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU19DT05UUklCVVRJT05TX0xBQkVMID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uc190ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTWV0aG9kUGx1Z2luIHBsdWdpbjsKLQotCXByaXZhdGUgUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlOwotCXByaXZhdGUgUHJvY2Vzc1BhY2thZ2UgY2FwYWJpbGl0eVBhdHRlcm5QYWNrYWdlOwotCXByaXZhdGUgUHJvY2Vzc1BhY2thZ2UgZGVsaXZlcnlQcm9jZXNzUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIE1vZGVsU3RydWN0dXJlIG1vZGVsU3RydWN0KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBtb2RlbFN0cnVjdCk7Ci0JCXRoaXMucGx1Z2luID0gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSBwa2cgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSkgVW1hVXRpbAotCQkJCQkuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQkJCW1vZGVsU3RydWN0LmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0JCQljYXBhYmlsaXR5UGF0dGVyblBhY2thZ2UgPSBwa2c7Ci0JCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQlQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJCQkuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KS5hZGFwdChwa2csCi0JCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJYWRhcHRlci5zZXRQcm9jZXNzVHlwZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENhcGFiaWxpdHlQYXR0ZXJuKCkpOwotCQkJCWFkYXB0ZXIuc2V0TGFiZWwoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFkYXB0ZXIuc2V0UGFyZW50KHRoaXMpOwotCQkJCWNoaWxkcmVuLmFkZChwa2cpOwotCQkJfQotCQkJcGtnID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UpIFVtYVV0aWwKLQkJCQkJLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwgbW9kZWxTdHJ1Y3QuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0JCQlkZWxpdmVyeVByb2Nlc3NQYWNrYWdlID0gZGVsaXZlcnlQcm9jZXNzUGFja2FnZTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCVByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KHBrZywKLQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlhZGFwdGVyLnNldFByb2Nlc3NUeXBlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzKCkpOwotCQkJCWFkYXB0ZXIuc2V0TGFiZWwoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3Nlc190ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQkJYWRhcHRlci5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKHBrZyk7Ci0JCQl9Ci0KLQkJCWlmIChwcm9jZXNzQ29udHJpYnV0aW9uRW5hYmxlZCkgewotCQkJCWNoaWxkcmVuLmFkZChnZXRQcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2UoKSk7Ci0JCQl9Ci0KLQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCS8vIFN0cmluZyBuYW1lID0KLQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwIik7Ci0JCQkvLyBPYmplY3QgY2hpbGQgPSBuZXcgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkvLyBwbHVnaW4sIG5hbWUpOwotCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIGNvbW1lbnQgb3V0IHRoZSBwbGFubmluZyB0ZW1wbGF0ZXMgZm9yIFRORyByZWxlYXNlIG9uZSBhdAotCQkJLy8gMjAwNS0wNS0wOQotCQkJLy8gcGtnID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UpCi0JCQkvLyBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCS8vIG1vZGVsU3RydWN0LnByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGF0aCk7Ci0JCQkvLyBpZihwa2cgPT0gbnVsbCkgewotCQkJLy8gcGtnID0KLQkJCS8vIE1vZGVsU3RydWN0dXJlLmNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGFja2FnZShwbHVnaW4pOwotCQkJLy8gfQotCQkJLy8gYWRhcHRlciA9IChQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikKLQkJCS8vIFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KS5hZGFwdChwa2csCi0JCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJLy8gYWRhcHRlci5zZXRQcm9jZXNzVHlwZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKTsKLQkJCS8vIGFkYXB0ZXIuc2V0TGFiZWwoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dCIpKTsKLQkJCS8vIGNoaWxkcmVuLmFkZChwa2cpOwotCi0JCX0gZWxzZSB7Ci0JCQlpZiAocHJvY2Vzc0NvbnRyaWJ1dGlvbkVuYWJsZWQpIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBnZXRQcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2UoKTsKLQkJCQlpZiAoIWNoaWxkcmVuLmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKHBrZyk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBnZXRQcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2UoKTsKLQkJCQljaGlsZHJlbi5yZW1vdmUocGtnKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwcml2YXRlIFByb2Nlc3NQYWNrYWdlIGdldFByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSgpIHsKLQkJaWYgKHByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2UgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSkgVW1hVXRpbAotCQkJCQkuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQkJCW1vZGVsU3RydWN0LnByb2Nlc3NDb250cmlidXRpb25QYXRoKTsKLQkJCWlmIChwcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2UgPT0gbnVsbCkgewotCQkJCXByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSA9IE1vZGVsU3RydWN0dXJlCi0JCQkJCQkuY3JlYXRlUHJvY2Vzc0NvbnRyaWJ1dGlvblBhY2thZ2UocGx1Z2luKTsKLQkJCX0KLQkJCVByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpCi0JCQkJCS5hZGFwdChwcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2UsCi0JCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWFkYXB0ZXIuc2V0TGFiZWwoUFJPQ0VTU19DT05UUklCVVRJT05TX0xBQkVMKTsKLQkJCWFkYXB0ZXIuc2V0UGFyZW50KHRoaXMpOwotCQl9Ci0JCXJldHVybiBwcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBQcm9jZXNzUGFja2FnZSBnZXRDYXBhYmlsaXR5UGF0dGVyblBhY2thZ2UoKSB7Ci0JCXJldHVybiBjYXBhYmlsaXR5UGF0dGVyblBhY2thZ2U7Ci0JfQotCQotCXB1YmxpYyBQcm9jZXNzUGFja2FnZSBnZXREZWxpdmVyeVByb2Nlc3NQYWNrYWdlKCkgewotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzUGFja2FnZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNGFlMzU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaXRlbSBwcm92aWRlcnMgZm9yIGRpc3BsYXlpbmcgYW5kIGVkaXRpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMgaW4gdGhlIExpYnJhcnkgdmlldy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDI0NjhiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIGRpc3BsYXlpbmcgYW5kIGVkaXRpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyN2U0MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci0KLS8qKgotICogSXRlbSBwcm92aWRlciBmb3IgYWN0aXZpdHkgdXNlZCBieSBjb25maWd1cmF0aW9uIHZpZXcgYW5kIGZpbHRlciBkaWFsb2cuIFRoaXMgaXRlbSBwcm92aWRlciByZXR1cm4KLSAqIGNoaWxkcmVuIGxpc3QgdGhhdCBjb250YWluIG9ubHkgaXRzIG93biBhY3Rpdml0aWVzIGFmdGVyIHJlYWxpemF0aW9uIGFnYWluc3Qgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdW4gMzAsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRPYmplY3Qob3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0KERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldEVDbGFzc2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCXJldHVybiBjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNpc1JvbGxlZFVwKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGxlZFVwKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2Jhc2ljU2V0Um9sbGVkVXAoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBiYXNpY1NldFJvbGxlZFVwKGJvb2xlYW4gYikgewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNzZXRSb2xsZWRVcChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGxlZFVwKGJvb2xlYW4gYikgewotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0FjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhYjFmNTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIoQWN0aXZpdHkgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcihBY3Rpdml0eSBhY3Rpdml0eSwgT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWN0aXZpdHksIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5EZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAoZ2V0UmVmcmVzaEVsZW1lbnQobm90aWZpY2F0aW9uKSA9PSBnZXREZWxlZ2F0ZVZhbHVlKCkpIHsKLQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIGdldFRvcEl0ZW0oKTsKLQkJCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJLmFkYXB0KHByb2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWl0ZW1Qcm92aWRlci5zZXRSZWZyZXNoQWxsSURzUmVxdWlyZWQodHJ1ZSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSBudWxsOwotCQlib29sZWFuIG9sZFJvbGxlZFVwID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAoZGVsZWdhdGVJdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQlpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQkJCQlvbGRSb2xsZWRVcCA9IGl0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCk7Ci0JCQkJaWYoaXNSb2xsZWRVcCgpICE9IG9sZFJvbGxlZFVwKSB7Ci0JCQkJCWlmKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCSgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilpdGVtUHJvdmlkZXIpLmJhc2ljU2V0Um9sbGVkVXAoaXNSb2xsZWRVcCgpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWl0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChpc1JvbGxlZFVwKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpdGVtUHJvdmlkZXIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYoaXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkvLyByZXN0b3JlIHJvbGxlZC11cCBmbGFnCi0JCQkJLy8KLQkJCQlpZihpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilpdGVtUHJvdmlkZXIpLmJhc2ljU2V0Um9sbGVkVXAob2xkUm9sbGVkVXApOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKG9sZFJvbGxlZFVwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXREZWxlZ2F0aW5nSXRlbVByb3ZpZGVyKCl7Ci0JCXJldHVybiBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhNThjMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWN0aXZpdHlBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5HcmFwaGljYWxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFjdGl2aXR5J3MgaXRlbSBwcm92aWRlcnMgdXNlZCBieSB0aGUgUHJvY2VzcyBFZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQWN0aXZpdHlJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJUHJvY2Vzc0l0ZW1Qcm92aWRlciwgSUJTSXRlbVByb3ZpZGVyLAotCQlJVGFibGVJdGVtTGFiZWxQcm92aWRlciwgSUNvbmZpZ3VyYWJsZSwgSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCXByaXZhdGUgaW50IGlkOwotCi0JcHJvdGVjdGVkIE9iamVjdCB0b3BJdGVtID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiByb2xsZWRVcDsKLQotCXByaXZhdGUgR3JhcGhpY2FsRGF0YSBncmFwaGljYWxEYXRhOwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvckxpc3QgcHJlZGVjZXNzb3JzOwotCi0JcHJpdmF0ZSBCb29sZWFuIGV4cGFuZGVkOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgYmFzZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGNoaWxkRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVmcmVzaEFsbElEc1JlcXVpcmVkOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXByb3RlY3RlZCBMaXN0IGNhY2hlZENoaWxkcmVuOwotCi0JcHJvdGVjdGVkIExpc3QgY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JcHJpdmF0ZSBEaXNwb3NhYmxlIGNvbnRyaWJ1dGVkV3JhcHBlcnM7Ci0KLQlwcml2YXRlIFZhcmlhYmlsaXR5SW5mbyB2YXJpYWJpbGl0eUluZm87Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZVZhcmlhYmlsaXR5SW5mbyA9IHRydWU7Ci0KLQlwcml2YXRlIERpc3Bvc2FibGUgcm9sbGVkVXBXcmFwcGVyczsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoYmFzZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCUVPYmplY3QgY3VycmVudEJhc2UgPSAoRU9iamVjdCkgYmFzZUxpc3RlbmVyLmdldFRhcmdldCgpOwotCQkJaWYoY3VycmVudEJhc2UgIT0gbnVsbCkgewotCQkJCWN1cnJlbnRCYXNlLmVBZGFwdGVycygpLnJlbW92ZShiYXNlTGlzdGVuZXIpOwotCQkJfQotCQkJaWYgKGdldFRhcmdldCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldFRhcmdldCgpOwotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJCWJhc2UuZUFkYXB0ZXJzKCkucmVtb3ZlKGJhc2VMaXN0ZW5lcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHByZWRlY2Vzc29ycyAhPSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvcnMuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYoY2FjaGVkQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLQkJCWNhY2hlZENoaWxkcmVuID0gbnVsbDsKLQkJfQotCQkKLQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4uY2xlYXIoKTsKLQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbnVsbDsKLQkJfQotCQkKLQkJaWYoY29udHJpYnV0ZWRXcmFwcGVycyAhPSBudWxsKSB7Ci0JCQljb250cmlidXRlZFdyYXBwZXJzLmRpc3Bvc2UoKTsKLQkJCWNvbnRyaWJ1dGVkV3JhcHBlcnMgPSBudWxsOwotCQl9Ci0JCQotCQlpZihyb2xsZWRVcFdyYXBwZXJzICE9IG51bGwpIHsKLQkJCXJvbGxlZFVwV3JhcHBlcnMuZGlzcG9zZSgpOwotCQkJcm9sbGVkVXBXcmFwcGVycyA9IG51bGw7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBjYW4gYmUgYWNjZXB0ZWQgYXMgYSBjaGlsZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBjaGlsZCkgewotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBmaWx0ZXIuYWNjZXB0KGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBjYW4gYmUgYWNjZXB0ZWQgYXMgYSByb2xsZWQtdXAgY2hpbGQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNSb2xsZWRVcENoaWxkKE9iamVjdCBjaGlsZCkgewotCQljaGlsZCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJaWYgKGZpbHRlciAhPSBudWxsICYmICEoY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQkmJiAhKGNoaWxkIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpKSB7Ci0JCQlyZXR1cm4gZmlsdGVyLmFjY2VwdChjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRvciAoZS5nOiBhCi0JICogVGFza0Rlc2NyaXB0b3IgaXMgYXNzb2NpYXRlZCB3aXRoIGEgVGFzaykuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKTsKLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQkvLyBkaXNhbGxvdyBjcmVhdGluZyBuZXcgY2hpbGQgaWYgdGhpcyBpdGVtIHByb3ZpZGVyIGlzIHJvbGxlZCB1cAotCQkvLwotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIGVkaXRpbmdEb21haW4sIHNpYmxpbmcpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJLy8gaWYoaXNUb3BBY3Rpdml0eShvYmplY3QpKSB7Ci0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGhhc2UoKSkpOwotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUl0ZXJhdGlvbigpKSk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBQaGFzZSkgewotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUl0ZXJhdGlvbigpKSk7Ci0JCS8vIH0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzRXhwYW5kZWQoKQotCSAqLwotCXB1YmxpYyBCb29sZWFuIGlzRXhwYW5kZWQoKSB7Ci0JCXJldHVybiBleHBhbmRlZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEV4cGFuZGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kZWQoQm9vbGVhbiBiKSB7Ci0JCWV4cGFuZGVkID0gYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRUb3BJdGVtKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFRvcEl0ZW0oKSB7Ci0JCWlmICh0b3BJdGVtID09IG51bGwpIHsKLQkJCWlmKFByb2Nlc3NVdGlsLmlzVG9wUHJvY2Vzcyh0YXJnZXQpKSB7Ci0JCQkJcmV0dXJuIHRhcmdldDsKLQkJCX0KLQkJCWlmKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IGlwID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmKGlwIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgaXA7Ci0JCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCB0b3AgPSBhZGFwdGVyLmdldFRvcEl0ZW0oKTsKLQkJCQkJCWlmICh0b3AgPT0gbnVsbCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzCi0JCQkJCQkJCSYmICgoUHJvY2VzcykgcGFyZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCQkJdG9wID0gcGFyZW50OwotCQkJCQkJCWFkYXB0ZXIuc2V0VG9wSXRlbSh0b3ApOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHRvcDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdG9wSXRlbTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldElkKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChpbnQgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUb3BBY3Rpdml0eShPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCU9iamVjdCBwYXJlbnQgPSBlT2JqLmVDb250YWluZXIoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgcGFyZW50OwotCQkJcmV0dXJuIG9iamVjdCA9PSBwYy5nZXRQcm9jZXNzKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGhhc0NoaWxkRGVzY3JpcHRvcihBY3Rpdml0eSBhY3QpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGFyZW50Rm9yKE9iamVjdCBjaGlsZCwgT2JqZWN0IHBhcmVudCkgewotCQlQcm9jZXNzVXRpbC5zZXRQYXJlbnQoY2hpbGQsIHBhcmVudCwgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQotLy8JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldERpcmVjdENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLS8vCQlMaXN0IG15Q2hpbGRyZW47Ci0vLwkJQ2hpbGRyZW5TdG9yZSBzdG9yZSA9IGdldENoaWxkcmVuU3RvcmUob2JqZWN0KTsKLS8vCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotLy8JCQlteUNoaWxkcmVuID0gc3RvcmUuZ2V0Q2hpbGRyZW4oKTsKLS8vCQl9IGVsc2UgewotLy8JCQkvLyBzdG9yZSA9IGNyZWF0ZUNoaWxkcmVuU3RvcmUob2JqZWN0KTsKLS8vCQkJTGlzdCByZXN1bHQgPSBzdG9yZSAhPSBudWxsID8gbnVsbCA6IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKLS8vCi0vLwkJCWZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KS5pdGVyYXRvcigpOyBpCi0vLwkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaS5uZXh0KCk7Ci0vLwkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewkJCQkJCi0vLwkJCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0vLwkJCQkJCi0vLy8vCQkJCQkvL0NoYW5nZSBmb3IgQWN0aXZpdHkgVmFyaWFiaWxpdHkuIFRvIGRvIHJlYWxpemF0aW9uIGZvcgotLy8vLwkJCQkJLy9Ccm93c2luZyBhbmQgUHVibGlzaGluZy4KLS8vLy8JCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLy8vCQkJCQlpZihmaWx0ZXIgIT0gbnVsbCAmJiBmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKXsKLS8vLy8JCQkJCQljaGlsZHJlbi5hZGRBbGwoKChJQ29uZmlndXJhdG9yKWZpbHRlcikuZ2V0Q2hpbGRyZW4ob2JqZWN0LCBmZWF0dXJlKSk7Ci0vLy8vCQkJCQl9Ci0vLy8vCQkJCQllbHNlewotLy8vLwkJCQkJCWNoaWxkcmVuID0gKExpc3QpIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLS8vLy8JCQkJCX0KLS8vCQkJCQkKLS8vCQkJCQlpbnQgaW5kZXggPSAwOwotLy8JCQkJCWZvciAoSXRlcmF0b3IgY2kgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBjaS5oYXNOZXh0KCk7IGluZGV4KyspIHsKLS8vCQkJCQkJT2JqZWN0IGNoaWxkID0gY2kubmV4dCgpOwotLy8JCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChjaGlsZCkpIHsKLS8vCQkJCQkJCWNoaWxkID0gd3JhcChlT2JqZWN0LCBmZWF0dXJlLCBjaGlsZCwgaW5kZXgpOwotLy8JCQkJCQkJc2V0UGFyZW50Rm9yKGNoaWxkLCBvYmplY3QpOwotLy8JCQkJCQkJLy8gSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKQotLy8JCQkJCQkJLy8gZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoY2hpbGQsCi0vLwkJCQkJCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotLy8JCQkJCQkJLy8gYWRhcHRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0vLwkJCQkJCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotLy8JCQkJCQkJCXN0b3JlLmdldExpc3QoZmVhdHVyZSkuYWRkKGNoaWxkKTsKLS8vCQkJCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCQkJcmVzdWx0LmFkZChjaGlsZCk7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCU9iamVjdCBjaGlsZCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLS8vCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChjaGlsZCkpIHsKLS8vCQkJCQkJY2hpbGQgPSB3cmFwKGVPYmplY3QsIGZlYXR1cmUsIGNoaWxkLAotLy8JCQkJCQkJCUNvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgpOwotLy8JCQkJCQlzZXRQYXJlbnRGb3IoY2hpbGQsIG9iamVjdCk7Ci0vLwkJCQkJCS8vIElCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikKLS8vCQkJCQkJLy8gZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoY2hpbGQsCi0vLwkJCQkJCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0vLwkJCQkJCS8vIGFkYXB0ZXIuc2V0Um9sbGVkVXAoZmFsc2UpOwotLy8KLS8vCQkJCQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLS8vCQkJCQkJCXN0b3JlLnNldFZhbHVlKGZlYXR1cmUsIGNoaWxkKTsKLS8vCQkJCQkJfSBlbHNlIHsKLS8vCQkJCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCW15Q2hpbGRyZW4gPSBzdG9yZSAhPSBudWxsID8gc3RvcmUuZ2V0Q2hpbGRyZW4oKSA6IHJlc3VsdDsKLS8vCQl9Ci0vLwkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGFkZEluaGVyaXRlZChvYmplY3QsIG15Q2hpbGRyZW4pOwotLy8JCXJldHVybiBjaGlsZHJlbjsKLS8vCX0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0SW1tZWRpYXRlQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZihhY2NlcHRBc0NoaWxkKGNoaWxkKSkgewotCQkJCWlmKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQkJCWNoaWxkID0gY29uZmlndXJhdG9yLnJlc29sdmUoY2hpbGQpOwotCQkJCX0KLQkJCQlpZihjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXNldFBhcmVudEZvcihjaGlsZCwgb2JqZWN0KTsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2hpbGRyZW4gPSBhZGRJbmhlcml0ZWQob2JqZWN0LCAoTGlzdCkgY2hpbGRyZW4pOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRSb2xsZWRVcENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHJvbGxlZFVwV3JhcHBlcnMgIT0gbnVsbCkgewotCQkJcm9sbGVkVXBXcmFwcGVycy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlBYnN0cmFjdFRyZWVJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKG9iamVjdCwgZmFsc2UpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzE1OTUzNzYyOTYxOTczNzM2OEw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yOwotCQkJCQlib29sZWFuIGIgPSBhZGFwdGVyLmlzUm9sbGVkVXAoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWFkYXB0ZXIuYmFzaWNTZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQkJCQlpdGVyYXRvciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJYWRhcHRlci5iYXNpY1NldFJvbGxlZFVwKGIpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBpdGVyYXRvcjsKLQkJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJCQkmJiAhKG9iamVjdCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlcikpIHsKLQkJCQkJcmV0dXJuICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IG9ubHkgb25lIGRlc2NyaXB0b3IgZm9yIGVhY2ggY29udGVudCBlbGVtZW50IGluIHRoZSByb2xsLXVwIGxpc3QKLQkJLy8KLQkJTGlzdCBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChhY2NlcHRBc1JvbGxlZFVwQ2hpbGQoY2hpbGQpKSB7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQkJaWYoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkJT2JqZWN0IGRlc2MgPSBmaW5kRGVzY3JpcHRvcihkZXNjcmlwdG9ycywgZSk7Ci0JCQkJCWlmKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJaWYoaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChjaGlsZCkpIHsKLQkJCQkJCQljaGlsZCA9IGNyZWF0ZVJvbGx1cFdyYXBwZXIoY2hpbGQsIG9iamVjdCwgYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJfQotCQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJCWRlc2NyaXB0b3JzLmFkZChjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZihpc1dyYXBwaW5nUm9sbHVwTmVlZGVkKGNoaWxkKSkgewotCQkJCQkJCUNvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgY29tcG9zZWRXcmFwcGVyID0gUHJvY2Vzc1V0aWwuZ2V0Q29tcG9zZWRXcmFwcGVyKGRlc2MpOwotCQkJCQkJCWlmKGNvbXBvc2VkV3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJCQkJCWNvbXBvc2VkV3JhcHBlci5hZGRFbGVtZW50KGNoaWxkKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWRlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCWRlc2NyaXB0b3JzID0gbnVsbDsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgd3JhcHBpbmcgb2YgdGhlIHNwZWNpZmllZCByb2xsdXAgZWxlbWVudCBpcyBuZWVkZWQuIElmIGl0J3MKLQkgKiBuZWVkZWQsIHRoZSBjYWxsZXIgd2lsbCB1c2UKLQkgKiB7QGxpbmsgI2NyZWF0ZVJvbGx1cFdyYXBwZXIoT2JqZWN0LCBPYmplY3QsIEFkYXB0ZXJGYWN0b3J5KX0gdG8gY3JlYXRlCi0JICogd3JhcHBlciBmb3IgdGhlIHJvbGx1cCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlQ29tcG9zZWRXcmFwcGVyKE9iamVjdCBvYmplY3QsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKG9iamVjdCwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVSb2xsdXBXcmFwcGVyKE9iamVjdCBvYmplY3QsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsJCQotCQlDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSBjcmVhdGVDb21wb3NlZFdyYXBwZXIob2JqZWN0LCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQl3cmFwcGVyLnJlYWRPbmx5ID0gdHJ1ZTsKLQkJd3JhcHBlci5pc1JvbGx1cENoaWxkID0gdHJ1ZTsKLQkJCi0JCWlmKHJvbGxlZFVwV3JhcHBlcnMgPT0gbnVsbCkgewotCQkJcm9sbGVkVXBXcmFwcGVycyA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JCX0KLQkJcm9sbGVkVXBXcmFwcGVycy5hZGQod3JhcHBlcik7Ci0KLQkJcmV0dXJuIHdyYXBwZXI7IAkJCi0JfQkJCi0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGRvR2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCXJldHVybiBnZXRSb2xsZWRVcENoaWxkcmVuKG9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0SW1tZWRpYXRlQ2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIG9iamVjdDsKLQkJaWYoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCQotCQkJLy9UT0RPOiByZW1vdmUgdGhlIGVuYWJsZVZhcmlhYmlsaXR5SW5mb0ZsYWcgYW5kICAKLQkJCS8vIGNyZWF0ZSBhbiBpbnRlcmZhY2Ugb3IgZG8gZGlmZmVyZW50bHkKLQkJCWlmKGVuYWJsZVZhcmlhYmlsaXR5SW5mbykKLQkJCQl2YXJpYWJpbGl0eUluZm8gPSBjb25maWd1cmF0b3IuZ2V0VmFyaWFiaWxpdHlJbmZvKGFjdGl2aXR5KTsKLQkJCWVsc2UgCi0JCQkJdmFyaWFiaWxpdHlJbmZvID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXZhcmlhYmlsaXR5SW5mbyA9IG51bGw7Ci0JCX0KLQkJaWYodmFyaWFiaWxpdHlJbmZvICE9IG51bGwpIHsKLQkJCU9iamVjdCByZXNvbHZlZCA9IHZhcmlhYmlsaXR5SW5mby5nZXRJbmhlcml0YW5jZUxpc3QoKS5nZXQoMCk7Ci0JCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGlwID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHJlc29sdmVkLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwkJCQotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbjsKLQkJCWJvb2xlYW4gYiA9IGlwLmlzUm9sbGVkVXAoKTsKLQkJCXRyeSB7Ci0JCQkJaXAuYmFzaWNTZXRSb2xsZWRVcChpc1JvbGxlZFVwKCkpOwotCQkJCWNoaWxkcmVuID0gaXAuZG9HZXRDaGlsZHJlbihyZXNvbHZlZCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpcC5iYXNpY1NldFJvbGxlZFVwKGIpOwotCQkJfQotCQkJaWYoIXZhcmlhYmlsaXR5SW5mby5nZXRDb250cmlidXRvcnMoKS5pc0VtcHR5KCkpIHsKLQkJCQlBcnJheUxpc3QgY29udHJpYnV0ZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2YXJpYWJpbGl0eUluZm8uZ2V0Q29udHJpYnV0b3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCWlwID0gKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKWFkYXB0ZXIpOwotCQkJCQkJYiA9IGlwLmlzUm9sbGVkVXAoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaXAuYmFzaWNTZXRSb2xsZWRVcChpc1JvbGxlZFVwKCkpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpcC5nZXRJbW1lZGlhdGVDaGlsZHJlbihlKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCWUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWUgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5yZXNvbHZlKGUsIGNvbmZpZ3VyYXRvci5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCQkJCQlpZihlICE9IG51bGwgJiYgIVRuZ1V0aWwuY29udGFpbnMoY2hpbGRyZW4sIGUpKSB7Ci0JCQkJCQkJCQljb250cmlidXRlZENoaWxkcmVuLmFkZChlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCWlwLmJhc2ljU2V0Um9sbGVkVXAoYik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoIWNvbnRyaWJ1dGVkQ2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZEFsbCh3cmFwQ29udHJpYnV0ZWQoYWN0aXZpdHksIGNvbnRyaWJ1dGVkQ2hpbGRyZW4pKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0KLQkJcmV0dXJuIGRvR2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbikgewotLy8JCWlmKGlzUm9sbGVkVXAoKSkgewotLy8JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0vLwkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4pOwotLy8JCQl9Ci0vLwkJCWVsc2UgewotLy8JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4uY2xlYXIoKTsKLS8vCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuLmFkZEFsbChjaGlsZHJlbik7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLS8vCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0vLwkJCX0KLS8vCQkJZWxzZSB7Ci0vLwkJCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotLy8JCQkJY2FjaGVkQ2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuKTsKLS8vCQkJfQotLy8JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlnZXRDaGlsZHJlbih0YXJnZXQpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIjZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlib29sZWFuIG9sZFJvbGxlZFVwID0gcm9sbGVkVXA7Ci0JCQl0cnkgewotCQkJCXJvbGxlZFVwID0gdHJ1ZTsKLQkJCQlnZXRDaGlsZHJlbih0YXJnZXQpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJcm9sbGVkVXAgPSBvbGRSb2xsZWRVcDsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0JfQotCQotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZmluZFdyYXBwZXIoT2JqZWN0IG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJLy8gZmluZCBpZiBhIHdyYXBwZXIgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGdpdmVuIHZhbHVlIGFuZCBvd25lcgotCQkvLwotCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHZhbHVlLAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSBudWxsOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJTGlzdCBsaXN0ZW5lcnMgPSAoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlmaW5kX3dyYXBwZXJfbG9vcDogZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCXdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JCQkJCQlpZiAod3JhcHBlci5nZXRWYWx1ZSgpID09IHZhbHVlCi0JCQkJCQkJCSYmIHdyYXBwZXIuZ2V0UGFyZW50KHZhbHVlKSA9PSBvd25lcikgewotCQkJCQkJCWJyZWFrIGZpbmRfd3JhcHBlcl9sb29wOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl3cmFwcGVyID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gd3JhcHBlcjsKLQl9Ci0KLQlwcml2YXRlIExpc3Qgd3JhcEluaGVyaXRlZChBY3Rpdml0eSBvd25lciwgQ29sbGVjdGlvbiBicmVha2Rvd25FbGVtZW50cykgewotCQlpZiAod3JhcHBlcnMgPT0gbnVsbCkgewotCQkJd3JhcHBlcnMgPSBuZXcgRGlzcG9zYWJsZSgpOwotCQl9CQotCQlyZXR1cm4gd3JhcChvd25lciwgYnJlYWtkb3duRWxlbWVudHMsIHRydWUsIGZhbHNlLCB3cmFwcGVycyk7Ci0JfQotCQotCXByaXZhdGUgTGlzdCB3cmFwQ29udHJpYnV0ZWQoQWN0aXZpdHkgb3duZXIsIENvbGxlY3Rpb24gYnJlYWtkb3duRWxlbWVudHMpIHsKLQkJaWYoY29udHJpYnV0ZWRXcmFwcGVycyA9PSBudWxsKSB7Ci0JCQljb250cmlidXRlZFdyYXBwZXJzID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJfQotCQlyZXR1cm4gd3JhcChvd25lciwgYnJlYWtkb3duRWxlbWVudHMsIGZhbHNlLCB0cnVlLCBjb250cmlidXRlZFdyYXBwZXJzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgZ2V0V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkoKSB7Ci0JCUlXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJaWYoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnlQcm92aWRlcikgewotCQkJZmFjdG9yeSA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIpYWRhcHRlckZhY3RvcnkpLmdldFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5KCk7Ci0JCX0KLQkJaWYoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlmYWN0b3J5ID0gSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IHdyYXAoQWN0aXZpdHkgb3duZXIsIENvbGxlY3Rpb24gYnJlYWtkb3duRWxlbWVudHMsIGJvb2xlYW4gaW5oZXJpdGVkLCBib29sZWFuIGNvbnRyaWJ1dGVkLCBEaXNwb3NhYmxlIHdyYXBwZXJzKSB7Ci0JCUFycmF5TGlzdCB3cmFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IHdyYXBwZXJGYWN0b3J5ID0gZ2V0V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgdW5XcmFwcGVkID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJCWlmICh1bldyYXBwZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIHVuV3JhcHBlZDsKLQkJCQlpZiAoIVRuZ1V0aWwuaXNCYXNlKG93bmVyLmdldEJyZWFrZG93bkVsZW1lbnRzKCksIGUpKSB7Ci0JCQkJCU9iamVjdCBjaGlsZCA9IGdldFdyYXBwZXIob3duZXIsIGUsIHdyYXBwZXJzKTsKLQkJCQkJaWYoY2hpbGQgPT0gbnVsbCkgewotCQkJCQkJY2hpbGQgPSB3cmFwcGVyRmFjdG9yeS5jcmVhdGVXcmFwcGVyKGUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgYmVXcmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBjaGlsZDsKLQkJCQkJCQlpZihpbmhlcml0ZWQpIHsKLQkJCQkJCQkJYmVXcmFwcGVyLmlzSW5oZXJpdGVkID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZihjb250cmlidXRlZCkgewotCQkJCQkJCQliZVdyYXBwZXIuY29udHJpYnV0ZWQgPSB0cnVlOwotCQkJCQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkJCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpb2JqZWN0KS5pc0luaGVyaXRlZCgpKSB7Ci0JCQkJCQkJCQliZVdyYXBwZXIuaXNJbmhlcml0ZWQgPSB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJd3JhcHBlcnMucmVtb3ZlKGNoaWxkKTsKLQkJCQkJfQotCQkJCQl3cmFwcGVyTGlzdC5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl3cmFwcGVycy5kaXNwb3NlKCk7Ci0JCXdyYXBwZXJzLmFkZEFsbCh3cmFwcGVyTGlzdCk7Ci0JCXJldHVybiB3cmFwcGVyTGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFdyYXBwZXIoQWN0aXZpdHkgb3duZXIsIEJyZWFrZG93bkVsZW1lbnQgZSwgQ29sbGVjdGlvbiB3cmFwcGVycykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cmFwcGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYod3JhcHBlci5nZXRPd25lcigpID09IG93bmVyICYmIHdyYXBwZXIuZ2V0VmFsdWUoKSA9PSBlKSB7Ci0JCQkJcmV0dXJuIHdyYXBwZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBBZGFwdGVyIGNyZWF0ZUJhc2VMaXN0ZW5lcigpIHsKLQkJaWYgKGJhc2VMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQliYXNlTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoZmluYWwgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIudGhpcwotCQkJCQkJCS5nZXRUYXJnZXQoKTsKLQkJCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkJCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGFjdCkpIHsKLQkJCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQkJCQkJbm90aWZpY2F0aW9uLCBhY3QsIGZhbHNlLCB0cnVlKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQotCQkJCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX05BTUU6Ci0JCQkJCQlpZiAoYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJCQkJCQkJCW5vdGlmaWNhdGlvbiwgYWN0LCBmYWxzZSwgdHJ1ZSkpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19TVVBQUkVTU0VEOgotCQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQkJCWFjdCwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCQkJYWN0LCB0cnVlLCB0cnVlKSk7Ci0JCQkJCQlyZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCk7Ci0JCQkJCQlicmVhazsKLQotCQkJCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzogewotCQkJCQkJaWYoaGFuZGxlUmVwbGFjZUJyZWFrZG93bkVsZW1lbnQobm90aWZpY2F0aW9uKSkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJTGlzdCBsaXN0ID0gZ2V0QWZmZWN0ZWRDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQkJCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCWJvb2xlYW4gdXBkYXRlTGFiZWwgPSByZWZyZXNoQ2hpbGRyZW5EYXRhKAotCQkJCQkJCQkJbm90aWZpY2F0aW9uLCBsaXN0KTsKLQotCQkJCQkJCS8vIGZvcndhcmQgbm90aWZpY2F0aW9uCi0JCQkJCQkJLy8KLQkJCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQkJCQkJbm90aWZpY2F0aW9uLCBhY3QsIHRydWUsIHVwZGF0ZUxhYmVsKSk7Ci0KLQkJCQkJCQkvLyBQcm9jZXNzVXRpbC5yZWZyZXNoVmlld2VyKGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCS8vIChQcm9jZXNzKSBnZXRUb3BJdGVtKCkpOwotCQkJCQkJCXJlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKTsKLQkJCQkJCX0KLQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlyZXR1cm4gYmFzZUxpc3RlbmVyOwotCX0KLQotCXByb3RlY3RlZCBBY3Rpdml0eSBsaXN0ZW5Ub0Jhc2VBY3Rpdml0eSgpIHsKLQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSB0YXJnZXQ7Ci0JCWlmICghUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQWN0aXZpdHkgYmFzZUFjdDsKLQkJaWYodmFyaWFiaWxpdHlJbmZvICE9IG51bGwpIHsKLQkJCWlmKHZhcmlhYmlsaXR5SW5mby5nZXRJbmhlcml0YW5jZUxpc3QoKS5zaXplKCkgPiAxKSB7Ci0JCQkJYmFzZUFjdCA9IChBY3Rpdml0eSkgdmFyaWFiaWxpdHlJbmZvLmdldEluaGVyaXRhbmNlTGlzdCgpLmdldCgxKTsKLQkJCX0JCQkKLQkJCWVsc2UgewotCQkJCWJhc2VBY3QgPSAoQWN0aXZpdHkpIGNvbmZpZ3VyYXRvci5yZXNvbHZlKGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJYmFzZUFjdCA9IChBY3Rpdml0eSkgYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJfQotCQlpZiAoYmFzZUFjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJY3JlYXRlQmFzZUxpc3RlbmVyKCk7Ci0JCQotCQkvLyByZW1vdmUgYmFzZUxpc3RlbmVyIGZyb20gb2xkIGJhc2UsIGlmIHRoZXJlIGlzIGFueQotCQkvLwotCQlFT2JqZWN0IG9sZEJhc2UgPSAoRU9iamVjdCkgYmFzZUxpc3RlbmVyLmdldFRhcmdldCgpOwotCQlpZihvbGRCYXNlICE9IG51bGwpIHsKLQkJCW9sZEJhc2UuZUFkYXB0ZXJzKCkucmVtb3ZlKGJhc2VMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCWlmICghYmFzZUFjdC5lQWRhcHRlcnMoKS5jb250YWlucyhiYXNlTGlzdGVuZXIpKSB7Ci0JCQliYXNlQWN0LmVBZGFwdGVycygpLmFkZChiYXNlTGlzdGVuZXIpOwotCQl9Ci0KLQkJT2JqZWN0IGlwID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoYmFzZUFjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYoaXAgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgaXA7Ci0JCQlhZGFwdGVyLmxpc3RlblRvQmFzZUFjdGl2aXR5KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJfQotCQlyZXR1cm4gYmFzZUFjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBhZGRJbmhlcml0ZWQoT2JqZWN0IG9iamVjdCwgTGlzdCBteUNoaWxkcmVuKSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvYmplY3Q7Ci0JCQlBY3Rpdml0eSBiYXNlQWN0ID0gbGlzdGVuVG9CYXNlQWN0aXZpdHkoKTsKLQkJCWlmIChiYXNlQWN0ICE9IG51bGwpIHsKLQkJCQlWYXJpYWJpbGl0eVR5cGUgZXh0ZW5kVHlwZSA9IGFjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQlpZiAoZXh0ZW5kVHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlRfTElURVJBTCkgewotCQkJCQlyZXR1cm4gbXlDaGlsZHJlbjsKLQkJCQl9IGVsc2UgaWYgKGV4dGVuZFR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMCi0JCQkJCQl8fCBleHRlbmRUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpIHsKLQkJCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpCi0JCQkJCQkuYWRhcHQoYmFzZUFjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJTGlzdCBhbGxDaGlsZHJlbjsJCQkJCQotCQkJCQlib29sZWFuIG9sZFJvbGxlZFVwID0gYWRhcHRlci5pc1JvbGxlZFVwKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZihvbGRSb2xsZWRVcCkgewotCQkJCQkJCWFkYXB0ZXIuYmFzaWNTZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCQlhbGxDaGlsZHJlbiA9IHdyYXBJbmhlcml0ZWQoYWN0LCBhZGFwdGVyLmdldENoaWxkcmVuKGJhc2VBY3QpKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCWlmKG9sZFJvbGxlZFVwKSB7Ci0JCQkJCQkJYWRhcHRlci5iYXNpY1NldFJvbGxlZFVwKHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0vLwkJCQkJLy8gZ28gdGhydSBvd24gY2hpbGRyZW4gbGlzdCBhbmQgaW5zZXJ0IGl0IHRvIHRoZSBjb21iaW5lZAotLy8JCQkJCS8vIGNoaWxkIGxpc3QgYXQgdGhlIHJpZ2h0IHBsYWNlLgotLy8JCQkJCS8vCi0vLwkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbXlDaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIKLS8vCQkJCQkJCQkubmV4dCgpOwotLy8JCQkJCQlUbmdVdGlsLmFkZFRvKGFsbENoaWxkcmVuLCBlbGVtZW50LCBvYmplY3QsIFRuZ1V0aWwKLS8vCQkJCQkJCQkuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KSk7Ci0vLwkJCQkJfQotCQkJCQlpZihhbGxDaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCQkJCXJldHVybiBteUNoaWxkcmVuOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJVG5nVXRpbC5hZGRBbGxUbyhhbGxDaGlsZHJlbiwgbXlDaGlsZHJlbik7Ci0JCQkJCQlyZXR1cm4gYWxsQ2hpbGRyZW47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG15Q2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZXJlIGlzIG5vIGRlc2NyaXB0b3IgaW4gPGNvZGU+Y2hpbGRyZW48L2NvZGU+IHJlZmVycmluZyB0bwotCSAqIHRoZSBzYW1lIG9iamVjdCBhcyB0aGUgc3BlY2lmaWVkIGRlc2NyaXB0b3IgPGNvZGU+Y2hpbGQ8L2NvZGU+IGRvZXMuCi0JICogCi0JICogQHBhcmFtIGNoaWxkcmVuCi0JICogQHBhcmFtIGNoaWxkCi0JICogQHJldHVybiB0cnVlIGlmIG5vIGRlc2NyaXB0b3IgaXMgZm91bmQgaW4gdGhlIGNoaWxkcmVuIGxpc3QgdGhhdCByZWZlcnMKLQkgKiAgICAgICAgIHRvIHRoZSBzYW1lIG9iamVjdCBhcyB0aGUgc3BlY2lmaWVkIGNoaWxkIGRvZXMsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05ld0Rlc2NyaXB0b3IoTGlzdCBjaGlsZHJlbiwgT2JqZWN0IGNoaWxkKSB7Ci0JCXJldHVybiBmaW5kRGVzY3JpcHRvcihjaGlsZHJlbiwgY2hpbGQpID09IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgZmluZERlc2NyaXB0b3IoTGlzdCBjaGlsZHJlbiwgT2JqZWN0IGNoaWxkKSB7Ci0JCU9iamVjdCBvYmogPSBnZXRPYmplY3QoKERlc2NyaXB0b3IpIFRuZ1V0aWwudW53cmFwKGNoaWxkKSk7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlmb3IgKGludCBpID0gY2hpbGRyZW4uc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCU9iamVjdCBvID0gY2hpbGRyZW4uZ2V0KGkpOwotCQkJaWYgKG9iaiA9PSBnZXRPYmplY3QoKERlc2NyaXB0b3IpIFRuZ1V0aWwudW53cmFwKG8pKSkKLQkJCQlyZXR1cm4gbzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQuSGVscGVyI2dldENyZWF0ZUNoaWxkSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlQ2hpbGRJbWFnZShPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyByZXR1cm4KLQkJLy8gVG5nRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9jdG9vbDE2L0NyZWF0ZUFjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX0FjdGl2aXR5Iik7Ci0JCXJldHVybiBnZXRJbWFnZShjaGlsZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVJlbW92ZUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVJlbW92ZUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVSZW1vdmVDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0SXRlbVByb3ZpZGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJQlNJdGVtUHJvdmlkZXIgZ2V0SXRlbVByb3ZpZGVyKEVPYmplY3QgZU9iaikgewotCQlyZXR1cm4gKElCU0l0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGVPYmosIElCU0l0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcGFyZW50ID0gb2JqZWN0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBjaGlsZHJlbiB0aGF0IGhhZCBiZWVuIGFmZmVjdGVkIGFmdGVyIGEgYW4gQURELCBSRU1PVkUsCi0JICogb3IgTU9WRSBvcGVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0QWZmZWN0ZWRDaGlsZHJlbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRBZmZlY3RlZEVsZW1lbnRzKG5vdGlmaWNhdGlvbiwgY2hpbGRGaWx0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlZnJlc2hDaGlsZHJlbkRhdGEoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwKLQkJCUxpc3QgYWZmZWN0ZWRDaGlsZHJlbikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9SZWZyZXNoQ2hpbGRyZW4oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwKLQkJCUxpc3QgYWZmZWN0ZWRDaGlsZHJlbikgewotCQlyZWZyZXNoQ2hpbGRyZW5EYXRhKG5vdGlmaWNhdGlvbiwgYWZmZWN0ZWRDaGlsZHJlbik7Ci0KLQkJUHJvY2VzcyB0b3BBY3QgPSAoUHJvY2VzcykgZ2V0VG9wSXRlbSgpOwotCQlBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkJUHJvY2Vzc1V0aWwucmVmcmVzaFZpZXdlcihyb290QWRhcHRlckZhY3RvcnksIHRvcEFjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENoaWxkcmVuKGZpbmFsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sCi0JCQlmaW5hbCBMaXN0IG5ld09yT2xkQ2hpbGRyZW4pIHsKLQkJaWYgKCFuZXdPck9sZENoaWxkcmVuLmlzRW1wdHkoKSkgewotCi0JCQlEaXNwbGF5IGRpc3BsYXkgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vCi0JCQl9Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZG9SZWZyZXNoQ2hpbGRyZW4obm90aWZpY2F0aW9uLCBuZXdPck9sZENoaWxkcmVuKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQlpZiAoZGlzcGxheSAhPSBudWxsKSB7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMocnVubmFibGUpOwotCQkJfSBlbHNlIHsKLQkJCQlydW5uYWJsZS5ydW4oKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLwotCQl9Ci0JCWlmKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCi0JCQl9Ci0JCX0KLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkb1JlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKTsKLQkJCX0KLQotCQl9OwotCQlpZiAoZGlzcGxheSAhPSBudWxsKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlydW5uYWJsZS5ydW4oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvUmVmcmVzaEFmZmVjdGVkVmlld2VycygpIHsKLQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVQcmVkZWNlc3Nvckxpc3RDaGFuZ2UoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlyZXR1cm4gVG5nVXRpbC5oYW5kbGVQcmVkZWNlc3Nvckxpc3RDaGFuZ2UodGhpcywgbm90aWZpY2F0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlUmVwbGFjZUJyZWFrZG93bkVsZW1lbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZihub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCAmJiBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSAhPSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSkgewotCQkJaWYobm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCWlmKCFBc3NvY2lhdGlvbkhlbHBlci5nZXRMaW5rVG9TdWNjZXNzb3IoZSkuaXNFbXB0eSgpKSB7Ci0JCQkJCVByb2Nlc3NVdGlsLnJlZnJlc2hQcmVkZWNjZXNzb3JMaXN0cyhhZGFwdGVyRmFjdG9yeSwgKFByb2Nlc3MpIGdldFRvcEl0ZW0oKSk7Ci0JCQkJfQotCQkJfQotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCWdldFRhcmdldCgpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmVmcmVzaEFmZmVjdGVkVmlld2VycygpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKGhhbmRsZVByZWRlY2Vzc29yTGlzdENoYW5nZShub3RpZmljYXRpb24pKQotCQkJcmV0dXJuOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlpZihoYW5kbGVSZXBsYWNlQnJlYWtkb3duRWxlbWVudChub3RpZmljYXRpb24pKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJTGlzdCBuZXdPck9sZENoaWxkcmVuID0gZ2V0QWZmZWN0ZWRDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQkJaWYgKCFuZXdPck9sZENoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQljcmVhdGVPck1vdmVQYWNrYWdlRm9yKG5ld09yT2xkQ2hpbGRyZW4pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCi0JCQkJLy8gcmVmcmVzaENoaWxkcmVuKG5vdGlmaWNhdGlvbiwgbmV3T3JPbGRDaGlsZHJlbik7Ci0KLQkJCQlyZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQUFJFU1NFRDoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIHRydWUpKTsKLQotCQkJLy8gUHJvY2Vzc1V0aWwucmVmcmVzaFZpZXdlcihnZXRSb290QWRhcHRlckZhY3RvcnkoKSwgKFByb2Nlc3MpCi0JCQkvLyBnZXRUb3BJdGVtKCkpOwotCi0JCQlyZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCk7Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3T3JPbGRDaGlsZHJlbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU9yTW92ZVBhY2thZ2VGb3IoTGlzdCBuZXdDaGlsZHJlbikgewotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpICgoRU9iamVjdCkgdGFyZ2V0KS5lQ29udGFpbmVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0NoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0JCQkJaWYgKGFjdC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkvLyBjcmVhdGUgbmV3IFByb2Nlc3NQYWNrYWdlIGZvciB0aGUgYWN0aXZpdHkKLQkJCQkJLy8KLQkJCQkJUHJvY2Vzc1BhY2thZ2UgbmV3UGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCQkJbmV3UGtnLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCQkJCXBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKG5ld1BrZyk7Ci0JCQkJCW5ld1BrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoZWxlbWVudCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gQ2hlY2sgaWYgdGhlIGFjdGl2aXR5J3MgUHJvY2Vzc1BhY2thZ2UgaXMgYXQgdGhlIHJpZ2h0Ci0JCQkJCS8vIHBsYWNlLgotCQkJCQkvLyBJZiBub3QsIG1vdmUgaXQgdG8gdGhlIHJpZ2h0IFByb2Nlc3NDb21wb25lbnQuCi0JCQkJCS8vCi0JCQkJCVByb2Nlc3NQYWNrYWdlIG9sZFBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0LmVDb250YWluZXIoKTsKLQkJCQkJaWYgKG9sZFBrZy5lQ29udGFpbmVyKCkgIT0gcGtnKSB7Ci0JCQkJCQlwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChvbGRQa2cpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRBbGxCcmVha2Rvd25FbGVtZW50cyhTZXQgc2V0LCBCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJYm9vbGVhbiByZXQgPSBzZXQuYWRkKGUpOwotCQlpZiAocmV0ICYmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKEFjdGl2aXR5KSBlKS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJZ2V0QWxsQnJlYWtkb3duRWxlbWVudHMoc2V0LCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlZnJlc2ggdGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHByZWRlY2Vzc29yIElEcyBpbiB0aGUgdmlld2VyCi0JICogCi0JICogQHBhcmFtIGFmZmVjdGVkQnJlYWtkb3duRWxlbWVudHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVmcmVzaFByZWRlY2Vzc29ycyhOb3RpZmljYXRpb24gbXNnLAotCQkJTGlzdCBhZmZlY3RlZEJyZWFrZG93bkVsZW1lbnRzKSB7Ci0KLQkJU2V0IHJlZnJlc2hMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQkJU2V0IGFsbEJyZWFrZG93bkVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWZmZWN0ZWRCcmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WRQotCQkJCQl8fCBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKSB7Ci0JCQkJc2V0UGFyZW50Rm9yKGUsIG51bGwpOwotCQkJfQotCQkJZ2V0QWxsQnJlYWtkb3duRWxlbWVudHMoYWxsQnJlYWtkb3duRWxlbWVudHMsIGUpOwotCQl9Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5yZWZyZXNoUHJlZGVjZXNzb3JzKCk6Ci0JCS8vIGFsbEJyZWFrZG93bkVsZW1lbnRzPSIrYWxsQnJlYWtkb3duRWxlbWVudHMpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsQnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0TGlua1RvU3VjY2Vzc29yKAotCQkJCQllbGVtZW50KS5pdGVyYXRvcigpOyBpdGVyYXRvcjEuaGFzTmV4dCgpOykgewotCQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCUJyZWFrZG93bkVsZW1lbnQgc3VjYyA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkuZ2V0U3VjY2Vzc29yKHdvcmtPcmRlcik7Ci0JCQkJaWYgKCFhbGxCcmVha2Rvd25FbGVtZW50cy5jb250YWlucyhzdWNjKSkgewotCQkJCQlyZWZyZXNoTGlzdC5hZGQoc3VjYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLnJlZnJlc2hQcmVkZWNlc3NvcnMoKToKLQkJLy8gcmVmcmVzaExpc3Q9IiArIHJlZnJlc2hMaXN0KTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZyZXNoTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIGNoaWxkLCBmYWxzZSwgdHJ1ZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVBhY2thZ2VGb3IoQWN0aXZpdHkgYWN0aXZpdHksIEVPYmplY3QgcGFyZW50QWN0aXZpdHkpIHsKLQkJUHJvY2Vzc1BhY2thZ2UgcGFyZW50ID0gKFByb2Nlc3NQYWNrYWdlKSBwYXJlbnRBY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCVByb2Nlc3NQYWNrYWdlIG5ld1BrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCW5ld1BrZy5zZXROYW1lKGFjdGl2aXR5LmdldE5hbWUoKSk7Ci0JCXBhcmVudC5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKG5ld1BrZyk7Ci0JCUFycmF5TGlzdCBicmVha2Rvd25FbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYnJlYWtkb3duRWxlbWVudHMuYWRkKGFjdGl2aXR5KTsKLQkJYnJlYWtkb3duRWxlbWVudHMuYWRkQWxsKGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpOwotCQluZXdQa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKGJyZWFrZG93bkVsZW1lbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCQlpZiAocm9vdEFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSUNvbHVtbkF3YXJlKSB7Ci0JCQlNYXAgY29sdW1uSW5kZXhUb05hbWVNYXAgPSAoKElDb2x1bW5Bd2FyZSkgcm9vdEFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuZ2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoKTsKLQkJCWlmIChjb2x1bW5JbmRleFRvTmFtZU1hcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpIGNvbHVtbkluZGV4VG9OYW1lTWFwLmdldChuZXcgSW50ZWdlcigKLQkJCQkJCWNvbHVtbkluZGV4KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVN0cmluZyBjb2xOYW1lID0gZ2V0Q29sdW1uTmFtZShjb2x1bW5JbmRleCk7Ci0JCXJldHVybiBUbmdVdGlsLmdldENvbHVtbkltYWdlKG9iamVjdCwgY29sTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlTdHJpbmcgY29sTmFtZSA9IGdldENvbHVtbk5hbWUoY29sdW1uSW5kZXgpOwotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKG9iamVjdCwgY29sTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0VG9wSXRlbShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvcEl0ZW0oT2JqZWN0IHRvcCkgewotCQl0b3BJdGVtID0gdG9wOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNSb2xsZWRVcCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsZWRVcCgpIHsKLQkJcmV0dXJuIHJvbGxlZFVwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0Um9sbGVkVXAoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xsZWRVcChib29sZWFuIGIpIHsKLQkJcm9sbGVkVXAgPSBiOwotCQlpZiAoIXJvbGxlZFVwKSB7Ci0JCQkvLyB1c2VyIHJvbGwgZG93biB0aGlzIGFjdGl2aXR5LCBzZXQgcm9sbGVkVXAgZmxhZyBvZiBhbGwgaXRzCi0JCQkvLyBvZmZzdHJpbmcgdG8gZmFsc2UKLQkJCS8vCi0JCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHRhcmdldCwgZmFsc2UpIHsKLQotCQkJCS8qKgotCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJICovCi0JCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc4NDA2ODcyNjQ3NTM2NDAyNTBMOwotCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJCS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCXJldHVybiBhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGNoaWxkLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQkoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0Um9sbGVkVXAoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBHcmFwaGljYWxEYXRhIGdldEdyYXBoaWNhbERhdGEoKSB7Ci0JCXJldHVybiBncmFwaGljYWxEYXRhOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdyYXBoaWNhbERhdGEoR3JhcGhpY2FsRGF0YSBkYXRhKSB7Ci0JCWdyYXBoaWNhbERhdGEgPSBkYXRhOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHksIHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcCwgU3RyaW5nIHR4dCkgewotCQlBY3Rpdml0eSBlID0gKEFjdGl2aXR5KSBvYmplY3Q7Ci0JCVByb2Nlc3NVdGlsLnNldEF0dHJpYnV0ZShlLCBwcm9wLCB0eHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCwKLQkgKiAgICAgIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCSgoSXRlcmF0aW9uKSB2YWx1ZSkuc2V0SXNSZXBlYXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRMaXN0ZW5lcnMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldExpc3RlbmVycygpIHsKLQkJaWYgKGNoYW5nZU5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKExpc3QpIGNoYW5nZU5vdGlmaWVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldFByZWRlY2Vzc29ycygpCi0JICovCi0JcHVibGljIFByZWRlY2Vzc29yTGlzdCBnZXRQcmVkZWNlc3NvcnMoKSB7Ci0JCWlmIChwcmVkZWNlc3NvcnMgPT0gbnVsbCkgewotCQkJcHJlZGVjZXNzb3JzID0gbmV3IFByZWRlY2Vzc29yTGlzdChUbmdVdGlsCi0JCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLCB0YXJnZXQpOwotCQl9Ci0JCXJldHVybiBwcmVkZWNlc3NvcnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaXJzdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuaXNGaXJzdEVsZW1lbnQoZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIHRoaXMsIG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMYXN0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5pc0xhc3RFbGVtZW50KGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCB0aGlzLCBvYmopOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVVcChPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZVVwKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRG93bihPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZURvd24oKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3QgaW1nID0gVG5nVXRpbC5nZXRJbWFnZShvYmplY3QpOwotCQlyZXR1cm4gaW1nICE9IG51bGwgPyBpbWcgOiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCXB1YmxpYyBJRmlsdGVyIGdldENoaWxkRmlsdGVyKCkgewotCQlyZXR1cm4gY2hpbGRGaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVmcmVzaEFsbElEc1JlcXVpcmVkKGJvb2xlYW4gYikgewotCQlyZWZyZXNoQWxsSURzUmVxdWlyZWQgPSBiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmcmVzaEFsbElEc1JlcXVpcmVkKCkgewotCQlyZXR1cm4gcmVmcmVzaEFsbElEc1JlcXVpcmVkOwotCX0KLQotCXB1YmxpYyBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCWlmKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCWNvbmZpZ3VyYXRvciA9IChJQ29uZmlndXJhdG9yKWZpbHRlcjsKLQkJfQotCQllbHNlIHsKLQkJCWNvbmZpZ3VyYXRvciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlQXdhcmVDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwKLQkJCUxpc3QgZHJvcEVsZW1lbnRzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBiYXNpY1NldFJvbGxlZFVwKGJvb2xlYW4gYikgewotCQlyb2xsZWRVcCA9IGI7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGVuYWJsZVZhcmlhYmlsaXR5SW5mbwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlVmFyaWFiaWxpdHlJbmZvKCkgewotCQlyZXR1cm4gZW5hYmxlVmFyaWFiaWxpdHlJbmZvOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbmFibGVWYXJpYWJpbGl0eUluZm8gdGhlIGVuYWJsZVZhcmlhYmlsaXR5SW5mbyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVWYXJpYWJpbGl0eUluZm8oYm9vbGVhbiBlbmFibGVWYXJpYWJpbGl0eUluZm8pIHsKLQkJdGhpcy5lbmFibGVWYXJpYWJpbGl0eUluZm8gPSBlbmFibGVWYXJpYWJpbGl0eUluZm87Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDgyYmM1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkdlbmVyaWNEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJlZGVjZXNzb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLQotCi0vKioKLSAqIEJhc2UgaXRlbSBwcm92aWRlciBmb3IgYWxsIGJyZWFrZG93biBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlQcm9jZXNzSXRlbVByb3ZpZGVyLCBJQlNJdGVtUHJvdmlkZXIsIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyLCBJQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JcHJpdmF0ZSBpbnQgaWQ7Ci0KLQlwcml2YXRlIE9iamVjdCB0b3BJdGVtOwotCi0JcHJpdmF0ZSBib29sZWFuIHJvbGxlZFVwOwotCi0JcHJpdmF0ZSBCb29sZWFuIGV4cGFuZGVkOwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvckxpc3QgcHJlZGVjZXNzb3JzOwotCi0JcHJvdGVjdGVkIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JCi0JcHJvdGVjdGVkIExpc3QgY2FjaGVkQ2hpbGRyZW47Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmRlbGVnYXRlSXRlbVByb3ZpZGVyID0gZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChwcmVkZWNlc3NvcnMgIT0gbnVsbCkgewotCQkJcHJlZGVjZXNzb3JzLmRpc3Bvc2UoKTsKLQkJfQotCQlpZihjYWNoZWRDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotCQkJY2FjaGVkQ2hpbGRyZW4gPSBudWxsOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGRlbGVnYXRlSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZUl0ZW1Qcm92aWRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNFeHBhbmRlZCgpCi0JICovCi0JcHVibGljIEJvb2xlYW4gaXNFeHBhbmRlZCgpIHsKLQkJcmV0dXJuIGV4cGFuZGVkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0RXhwYW5kZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChCb29sZWFuIGIpIHsKLQkJZXhwYW5kZWQgPSBiOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBvYmopIHsKLQkJcGFyZW50ID0gb2JqOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChCcmVha2Rvd25FbGVtZW50KW9iamVjdCkuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRJZCgpCi0JICovCi0JcHVibGljIGludCBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0SWQoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKGludCBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRUb3BJdGVtKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFRvcEl0ZW0oKSB7Ci0JCWlmICh0b3BJdGVtID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlPYmplY3QgdG9wID0gYWRhcHRlci5nZXRUb3BJdGVtKCk7Ci0JCQkJaWYgKHRvcCA9PSBudWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3MKLQkJCQkJCSYmICgoUHJvY2VzcykgcGFyZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCXRvcCA9IHBhcmVudDsKLQkJCQkJYWRhcHRlci5zZXRUb3BJdGVtKHRvcCk7Ci0JCQkJfQotCQkJCXJldHVybiB0b3A7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRvcEl0ZW07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCkgewotCQlBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkJaWYgKHJvb3RBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDb2x1bW5Bd2FyZSkgewotCQkJTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwID0gKChJQ29sdW1uQXdhcmUpIHJvb3RBZGFwdGVyRmFjdG9yeSkKLQkJCQkJLmdldENvbHVtbkluZGV4VG9OYW1lTWFwKCk7Ci0JCQlpZiAoY29sdW1uSW5kZXhUb05hbWVNYXAgIT0gbnVsbCkgewotCQkJCXJldHVybiAoU3RyaW5nKSBjb2x1bW5JbmRleFRvTmFtZU1hcC5nZXQobmV3IEludGVnZXIoCi0JCQkJCQljb2x1bW5JbmRleCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkvLyBTdHJpbmcgY29sTmFtZSA9IChTdHJpbmcpIGNvbHVtbkluZGV4VG9OYW1lTWFwLmdldChuZXcKLQkJLy8gSW50ZWdlcihjb2x1bW5JbmRleCkpOwotCQlTdHJpbmcgY29sTmFtZSA9IGdldENvbHVtbk5hbWUoY29sdW1uSW5kZXgpOwotCQlyZXR1cm4gVG5nVXRpbC5nZXRDb2x1bW5JbWFnZShvYmplY3QsIGNvbE5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJLy8gU3RyaW5nIGNvbE5hbWUgPSAoU3RyaW5nKSBjb2x1bW5JbmRleFRvTmFtZU1hcC5nZXQobmV3Ci0JCS8vIEludGVnZXIoY29sdW1uSW5kZXgpKTsKLQkJU3RyaW5nIGNvbE5hbWUgPSBnZXRDb2x1bW5OYW1lKGNvbHVtbkluZGV4KTsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShvYmplY3QsIGNvbE5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFRvcEl0ZW0oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb3BJdGVtKE9iamVjdCB0b3ApIHsKLQkJdG9wSXRlbSA9IHRvcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzUm9sbGVkVXAoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9sbGVkVXAoKSB7Ci0JCXJldHVybiByb2xsZWRVcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFJvbGxlZFVwKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JCXJvbGxlZFVwID0gYjsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoamF2YS51dGlsLk1hcCkKLQkvLyAqLwotCS8vIHB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4VG9OYW1lTWFwKE1hcCBtYXApIHsKLQkvLyBpZiAobWFwICE9IG51bGwpCi0JLy8gewotCS8vIGNvbHVtbkluZGV4VG9OYW1lTWFwID0gbWFwOwotCS8vIH0KLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3AsIFN0cmluZyB0eHQpIHsKLQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0OwotCQlpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpIHsKLQkJCWUuc2V0TmFtZSh0eHQpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMpIHsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOKSB7Ci0JCQllLnNldElzRXZlbnREcml2ZW4oQm9vbGVhbi52YWx1ZU9mKHR4dCkpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HKSB7Ci0JCQllLnNldElzT25nb2luZyhCb29sZWFuLnZhbHVlT2YodHh0KSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUpIHsKLQkJCWUuc2V0SXNSZXBlYXRhYmxlKEJvb2xlYW4udmFsdWVPZih0eHQpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0TGlzdGVuZXJzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChjaGFuZ2VOb3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KChMaXN0KSBjaGFuZ2VOb3RpZmllcik7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldFByZWRlY2Vzc29ycygpCi0JICovCi0JcHVibGljIFByZWRlY2Vzc29yTGlzdCBnZXRQcmVkZWNlc3NvcnMoKSB7Ci0JCWlmIChwcmVkZWNlc3NvcnMgPT0gbnVsbCkgewotCQkJcHJlZGVjZXNzb3JzID0gbmV3IFByZWRlY2Vzc29yTGlzdChUbmdVdGlsCi0JCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLCB0YXJnZXQpOwotCQl9Ci0JCXJldHVybiBwcmVkZWNlc3NvcnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaXJzdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuaXNGaXJzdEVsZW1lbnQoZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIHRoaXMsIG9iaik7Ci0KLQkJLy8gT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCS8vIGlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JCS8vIHsKLQkJLy8gQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCS8vIExpc3QgZWxlbWVudHMgPSBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKGFjdGl2aXR5LCBvYmopOwotCQkvLwkJCQotCQkvLyAvLyBpZiBpdCdzIGZpcnN0IGVsZW1lbnQsIHJldHVybiB0cnVlCi0JCS8vIGlmIChlbGVtZW50cy5nZXQoMCkuZXF1YWxzKG9iaikpCi0JCS8vIHsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gZWxzZSByZXR1cm4gZmFsc2U7Ci0JCS8vIH0KLQkJLy8JCQotCQkvLyByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhc3RFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmlzTGFzdEVsZW1lbnQoZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIHRoaXMsIG9iaik7Ci0KLQkJLy8gT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCS8vIGlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JCS8vIHsKLQkJLy8gQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCS8vIExpc3QgZWxlbWVudHMgPSBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKGFjdGl2aXR5LCBvYmopOwotCQkvLwkJCQotCQkvLyAvLyBpZiBpdCdzIGxhc3QgZWxlbWVudCwgcmV0dXJuIHRydWUKLQkJLy8gaWYgKGVsZW1lbnRzLmdldChlbGVtZW50cy5zaXplKCkgLSAxKS5lcXVhbHMob2JqKSkKLQkJLy8gewotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyBlbHNlIHJldHVybiBmYWxzZTsKLQkJLy8gfQotCQkvLwkJCi0JCS8vIHJldHVybiB0cnVlOwotCi0JfQotCi0JcHVibGljIHZvaWQgbW92ZVVwKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlVXAoKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZURvd24oT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChvYmopOwotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlUbmdVdGlsLm1vdmVEb3duKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJLy8gaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EZXNjcmlwdG9ySXRlbVByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChkZWxlZ2F0ZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGVJdGVtUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGVzY3JpcHRvckl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKFRuZ1V0aWwuaGFuZGxlUHJlZGVjZXNzb3JMaXN0Q2hhbmdlKHRoaXMsIG5vdGlmaWNhdGlvbikpCi0JCQlyZXR1cm47Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hDaGlsZHJlbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJQ29sbGVjdGlvbiBuZXdPck9sZENoaWxkcmVuKSB7Ci0JCWlmICghbmV3T3JPbGRDaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCS8vIC8vIHJlY2FsY3VsYXRlIHRoZSBJRHMgb2YgYnJlYWtkb3duIGVsZW1lbnRzIGFuZCByZWZyZXNoIHRoZW0KLQkJCS8vIC8vCi0JCQkvLyBBY3Rpdml0eSB0b3BBY3QgPSAoQWN0aXZpdHkpIGdldFRvcEl0ZW0oKTsKLQkJCS8vIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkvLyBQcm9jZXNzVXRpbC51cGRhdGVJRHMoYWRhcHRlckZhY3RvcnksIG5ldwotCQkJLy8gQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoYWRhcHRlckZhY3RvcnksIHRvcEFjdCksIHRvcEFjdCk7Ci0KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyIGNyZWF0ZURyb3BBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlQXdhcmVDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwKLQkJCUxpc3QgZHJvcEVsZW1lbnRzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRnJvbUNhY2hlKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21DYWNoZSgpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJZ2V0Q2hpbGRyZW4odGFyZ2V0KTsKLQkJfQotCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyI2dldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTg0YWI2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJlZGVjZXNzb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCURlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBib29sZWFuIGlzUm9sbGVkVXA7Ci0KLQlwcml2YXRlIFByZWRlY2Vzc29yTGlzdCBwcmVkZWNlc3NvcnM7Ci0KLQlwcml2YXRlIEJvb2xlYW4gZXhwYW5kZWQ7Ci0JCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBudWxsLCBDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmKHZhbHVlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHZhbHVlOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlmZWF0dXJlID0gKChEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgdmFsdWUpLmdldEZlYXR1cmUoKTsKLQkJCX0KLQkJCXNldFJlYWRPbmx5KHdyYXBwZXIuaXNSZWFkT25seSgpKTsKLQkJCXNldFJvbGxlZFVwKHdyYXBwZXIuaXNSb2xsdXBDaGlsZCgpKTsKLQkJCWlzSW5oZXJpdGVkID0gd3JhcHBlci5pc0luaGVyaXRlZDsKLQkJCWNvbnRyaWJ1dGVkID0gd3JhcHBlci5jb250cmlidXRlZDsKLQkJfQkJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKEJyZWFrZG93bkVsZW1lbnQgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihCcmVha2Rvd25FbGVtZW50IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNFeHBhbmRlZCgpCi0JICovCi0JcHVibGljIEJvb2xlYW4gaXNFeHBhbmRlZCgpIHsKLQkJcmV0dXJuIGV4cGFuZGVkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0RXhwYW5kZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChCb29sZWFuIGIpIHsKLQkJZXhwYW5kZWQgPSBiOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNSb2xsZWRVcCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsZWRVcCgpIHsKLQkJcmV0dXJuIGlzUm9sbGVkVXA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRSb2xsZWRVcChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGxlZFVwKGJvb2xlYW4gYikgewotCQlpc1JvbGxlZFVwID0gYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdGV4dFZhbHVlKSB7Ci0JCVByb2Nlc3NVdGlsLnNldEF0dHJpYnV0ZSgoV29ya0JyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKG9iamVjdCksCi0JCQkJcHJvcGVydHksIHRleHRWYWx1ZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkRlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIjZG9DcmVhdGVXcmFwcGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCSAqLwotCXByb3RlY3RlZCBJV3JhcHBlckl0ZW1Qcm92aWRlciBkb0NyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXJldHVybiBJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVdyYXBwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChkZWxlZ2F0ZUl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChJVGFibGVJdGVtTGFiZWxQcm92aWRlcikgZGVsZWdhdGVJdGVtUHJvdmlkZXIpCi0JCQkJCS5nZXRDb2x1bW5JbWFnZShvYmplY3QsIGNvbHVtbkluZGV4KTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0UHJlZGVjZXNzb3JzKCkKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaXN0IGdldFByZWRlY2Vzc29ycygpIHsKLQkJaWYgKHByZWRlY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAodGhpcyk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlwcmVkZWNlc3NvcnMgPSBuZXcgUHJlZGVjZXNzb3JMaXN0KFRuZ1V0aWwKLQkJCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLCB0aGlzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJlZGVjZXNzb3JzID0gUHJlZGVjZXNzb3JMaXN0LkVNUFRZX0xJU1Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWRlY2Vzc29yczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuQ2xhc3MsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUNsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JCS8vIFN5c3RlbS5vdXQKLQkJLy8gLnByaW50bG4oIkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmNyZWF0ZUNvbW1hbmQoKToiKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgb2JqZWN0OiAiICsgb2JqZWN0KTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgY29tbWFuZENsYXNzOiAiICsgY29tbWFuZENsYXNzKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgY29tbWFuZFBhcmFtZXRlcjogIiArIGNvbW1hbmRQYXJhbWV0ZXIpOwotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29tbWFuZChvYmplY3QsIGRvbWFpbiwgY29tbWFuZENsYXNzLAotCQkJCWNvbW1hbmRQYXJhbWV0ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFzdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKE9iamVjdCBhY3Rpdml0eSwgT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlVXAoT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRG93bihPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChwcmVkZWNlc3NvcnMgIT0gbnVsbCkgewotCQkJcHJlZGVjZXNzb3JzLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwMzk2Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgewotCXByaXZhdGUgTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoT2JqZWN0IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJYWRkRWxlbWVudCh2YWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldFZhbHVlcygpIHsKLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbGVtZW50KE9iamVjdCBlKSB7Ci0JCWdldFZhbHVlcygpLmFkZChlKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVjaWRlcyBpZiB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eSBvZiBhbGwgZWxlbWVudHMgaW4gdGhpcyBjb21wb3NlZCB3cmFwcGVyIGNhbiBiZSBtZXJnZWQuCi0JICogQHBhcmFtIHByb3BlcnR5Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbk1lcmdlKFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYoIXZhbHVlcy5pc0VtcHR5KCkpIHsKLQkJCWlmKGNhbk1lcmdlKHByb3BlcnR5KSkgewotCQkJCVVuaXF1ZUVMaXN0IG1vZGVsSW5mb3MgPSBuZXcgVW5pcXVlRUxpc3QoKTsJCQkJCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJCQlTdHJpbmcgaW5mbzsKLQkJCQkJaWYobyBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQkJaW5mbyA9ICgoSUJTSXRlbVByb3ZpZGVyKW8pLmdldEF0dHJpYnV0ZShvLCBwcm9wZXJ0eSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlJQlNJdGVtUHJvdmlkZXIgaXAgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJaW5mbyA9IGlwLmdldEF0dHJpYnV0ZShvLCBwcm9wZXJ0eSk7Ci0JCQkJCX0KLQkJCQkJaWYoIVN0clV0aWwuaXNCbGFuayhpbmZvKSkgewotCQkJCQkJbW9kZWxJbmZvcy5hZGQoaW5mbyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoIW1vZGVsSW5mb3MuaXNFbXB0eSgpKSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBtb2RlbEluZm8gPSBuZXcgU3RyaW5nQnVmZmVyKChTdHJpbmcpbW9kZWxJbmZvcy5nZXQoMCkpOwotCQkJCQlpbnQgbWF4ID0gbW9kZWxJbmZvcy5zaXplKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbWF4OyBpKyspIHsKLQkJCQkJCW1vZGVsSW5mby5hcHBlbmQoJywnKS5hcHBlbmQobW9kZWxJbmZvcy5nZXQoaSkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBtb2RlbEluZm8udG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoKSB7Ci0JCWZvcihpbnQgaSA9IHZhbHVlcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IG8gPSB2YWx1ZXMuZ2V0KGkpOwotCQkJaWYoIShvIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgCi0JCQkJCXx8ICEoKERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbykuaXNJbmhlcml0ZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTM5MzYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEZlYiAyMywgMjAwNgotICogQHNpbmNlICA3LjAuMQotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIExpc3Qgbm90aWZpZXJzOwotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIENvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQlpZih2YWx1ZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil2YWx1ZSk7Ci0JCQlyZWFkT25seSA9IHdyYXBwZXIuaXNSZWFkT25seSgpOwotCQkJaXNJbmhlcml0ZWQgPSB3cmFwcGVyLmlzSW5oZXJpdGVkOwotCQl9Ci0JCWlzUm9sbHVwQ2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gdGhlIG5vdGlmaWVyIGxpc3Qgb2YgdGhpcyB3cmFwcGVyLiBUaGUgZ2l2ZW4gd29yayBwcm9kdWN0IGRlc2NyaXB0b3IKLQkgKiBtdXN0IGJlIGxpbmtlZCB0byB0aGUgc2FtZSB3b3JrIHByb2R1Y3QgYXMgdGhlIGRlbGVnYXRlIHZhbHVlIGlzIAotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIG9yIGl0cyB3cmFwcGVyCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWRkV29ya1Byb2R1Y3REZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJT2JqZWN0IGRlbGVnYXRlVmFsdWUgPSBnZXREZWxlZ2F0ZVZhbHVlKCk7Ci0JCWlmKGRlbGVnYXRlVmFsdWUgPT0gd3BkKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJT2JqZWN0IHdwID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpZGVsZWdhdGVWYWx1ZSk7Ci0JCWlmKHdwID09IG51bGwgfHwgd3AgPT0gd3BkLmdldFdvcmtQcm9kdWN0KCkpIHsKLQkJCU9iamVjdCBpdGVtUHJvdmlkZXIgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKS5hZGFwdCh3cGQsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSUNoYW5nZU5vdGlmaWVyKQotCQkJewotCQkJCSgoSUNoYW5nZU5vdGlmaWVyKWl0ZW1Qcm92aWRlcikuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkJaWYobm90aWZpZXJzID09IG51bGwpIHsKLQkJCQkJbm90aWZpZXJzID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0JCQkJfQotCQkJCW5vdGlmaWVycy5hZGQoaXRlbVByb3ZpZGVyKTsKLQkJCX0KLQkJfQkKLQkJCi0JCWlmKGlzSW5oZXJpdGVkICYmIG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmCi0JCQkJISgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpb2JqZWN0KS5pc0luaGVyaXRlZCkgewotCQkJdGhpcy5pc0luaGVyaXRlZCA9IGZhbHNlOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihub3RpZmllcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm90aWZpZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlDaGFuZ2VOb3RpZmllciBub3RpZmllciA9IChJQ2hhbmdlTm90aWZpZXIpIGl0ZXIubmV4dCgpOwotCQkJCW5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJfQotCQkJbm90aWZpZXJzLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYobm90aWZpZXJzICE9IG51bGwgJiYgbm90aWZpZXJzLmNvbnRhaW5zKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSkgewotCQkJc3dpdGNoKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZJTkdfQURBUFRFUjoKLQkJCQlpZihub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSA9PSB0aGlzKSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCB0aGlzLCBmYWxzZSwgdHJ1ZSkpOwkJCQkKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQlzd2l0Y2gobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKHdyYXBOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTyAmJiBnZXRWYWx1ZSgpIGluc3RhbmNlb2YgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJU3RyaW5nIGluZm8gPSAoKENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZ2V0VmFsdWUoKSkuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhpbmZvKSkgewotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluZm8sICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlIYXNoU2V0IGluZm9TZXQgPSBuZXcgSGFzaFNldCgpOwotCQkJCVN0cmluZ0J1ZmZlciBpbmZvcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCQkJaWYoaW5mb1NldC5hZGQodG9rZW4pKSB7Ci0JCQkJCQlpbmZvcy5hcHBlbmQodG9rZW4pLmFwcGVuZCgnLCcpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWluZm9zLmRlbGV0ZUNoYXJBdChpbmZvcy5sZW5ndGgoKSAtIDEpOwotCQkJCWluZm8gPSBpbmZvcy50b1N0cmluZygpOwotCQkJfQotCQkJcmV0dXJuIGluZm87Ci0JCX0KLQkJaWYobm90aWZpZXJzICE9IG51bGwgJiYgIW5vdGlmaWVycy5pc0VtcHR5KCkKLQkJCQkmJiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSB8fCBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJU3RyaW5nIHN0ciA9IHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsoc3RyKSkgewotCQkJCXN0cmJ1Zi5hcHBlbmQoc3RyKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vdGlmaWVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JCQkJc3RyID0gaXRlbVByb3ZpZGVyLmdldEF0dHJpYnV0ZShpdGVtUHJvdmlkZXIuZ2V0VGFyZ2V0KCksIHByb3BlcnR5KTsKLQkJCQlpZighU3RyVXRpbC5pc0JsYW5rKHN0cikpIHsKLQkJCQkJaWYoc3RyYnVmLmxlbmd0aCgpID4gMCkgewotCQkJCQkJc3RyYnVmLmFwcGVuZCgnLCcpOwotCQkJCQl9Ci0JCQkJCXN0cmJ1Zi5hcHBlbmQoc3RyKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyYnVmLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiYWZhOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5HZW5lcmljRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuT0JTRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkdlbmVyaWNEcm9wQ29tbWFuZC5FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyIGV4dGVuZHMgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBFbGVtZW50QWRhcHRlciBkcm9wQWRhcHRlcjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuRGVzY3JpcHRvckl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29tcG9zaXRlUm9sZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaXNXcmFwcGluZ05lZWRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlV3JhcHBlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gbmV3IERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoCi0JCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgdmFsdWUsIG9iamVjdCwgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkvLyB3cmFwcGVyLnNldENvbHVtbkluZGV4VG9OYW1lTWFwKGNvbHVtbkluZGV4VG9OYW1lTWFwKTsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCS8vIENvbXBvc2l0ZVJvbGUgY29tcG9zaXRlUm9sZSA9IChDb21wb3NpdGVSb2xlKSBvYmplY3Q7Ci0JLy8gQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkvLyBDb2xsZWN0aW9uIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbXBvc2l0ZVJvbGUuZ2V0QWdncmVnYXRlZFJvbGVzKCkuaXRlcmF0b3IoKTsKLQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBjaGlsZHJlbi5hZGQobmV3Ci0JLy8gRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcigoRGVzY3JpYmFibGVFbGVtZW50KSBpdGVyLm5leHQoKSwKLQkvLyB0aGlzLCBhZGFwdGVyRmFjdG9yeSkpOwotCS8vIH0KLQkvLyByZXR1cm4gY2hpbGRyZW47Ci0JLy8gfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBmbG9hdCwgaW50LCBpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgT0JTRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLAotCQkJCW9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIEdlbmVyaWNEcm9wQ29tbWFuZC5FbGVtZW50QWRhcHRlciBjcmVhdGVEcm9wQWRhcHRlcigpIHsKLQkJaWYgKGRyb3BBZGFwdGVyID09IG51bGwpIHsKLQkJCWRyb3BBZGFwdGVyID0gbmV3IEdlbmVyaWNEcm9wQ29tbWFuZC5FbGVtZW50QWRhcHRlcigpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IGRyb3BFbGVtZW50KSB7Ci0JCQkJCWlmIChkcm9wRWxlbWVudCBpbnN0YW5jZW9mIFJvbGUKLQkJCQkJCQkmJiAhKChDb21wb3NpdGVSb2xlKSBnZXRUYXJnZXQoKSkKLQkJCQkJCQkJCS5nZXRBZ2dyZWdhdGVkUm9sZXMoKS5jb250YWlucyhkcm9wRWxlbWVudCkpIHsKLQkJCQkJCXJldHVybiBkcm9wRWxlbWVudDsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGRyb3BBZGFwdGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1MDYyYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSByb2xlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXIoQ29tcG9zaXRlUm9sZSByb2xlLCBPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihyb2xlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0RlbGl2ZXJhYmxlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0RlbGl2ZXJhYmxlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTIyYjEyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZWxpdmVyYWJsZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHZhbHVlLCBPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliOTEyYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLQotLyoqCi0gKiBXcmFwcGVyIGl0ZW0gcHJvdmlkZXIgZm9yIERlc2NyaWJsZUVsZW1lbnQKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElCU0l0ZW1Qcm92aWRlciwKLQkJSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBpbnQgaWQ7Ci0KLQlwcml2YXRlIE9iamVjdCB0b3BJdGVtOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZE9ubHkgPSB0cnVlOwotCQotCXByb3RlY3RlZCBib29sZWFuIGlzSW5oZXJpdGVkID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udHJpYnV0ZWQgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JvbGx1cENoaWxkID0gZmFsc2U7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoRGVzY3JpYmFibGVFbGVtZW50IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzKHZhbHVlLCBvd25lciwgbnVsbCwgQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoRGVzY3JpYmFibGVFbGVtZW50IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQkKLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGlzIHdyYXBwZXIgaXMgcmVhZC1vbmx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcmVhZE9ubHkKLQkgKiAgICAgICAgICAgIFRoZSByZWFkT25seSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgewotCQl0aGlzLnJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JfQkKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGNvbnRyaWJ1dGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250cmlidXRlZCgpIHsKLQkJcmV0dXJuIGNvbnRyaWJ1dGVkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW5oZXJpdGVkKCkgewotCQlyZXR1cm4gaXNJbmhlcml0ZWQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUm9sbHVwQ2hpbGQoKSB7Ci0JCXJldHVybiBpc1JvbGx1cENoaWxkOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRJZChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoaW50IGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3Qgb2JqKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRUb3BJdGVtKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFRvcEl0ZW0oKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQobnVsbCk7Ci0JCWlmICh0b3BJdGVtID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlPYmplY3QgdG9wID0gYWRhcHRlci5nZXRUb3BJdGVtKCk7Ci0JCQkJaWYgKHRvcCA9PSBudWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3MKLQkJCQkJCSYmICgoUHJvY2VzcykgcGFyZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCXRvcCA9IHBhcmVudDsKLQkJCQkJYWRhcHRlci5zZXRUb3BJdGVtKHRvcCk7Ci0JCQkJfQotCQkJCXJldHVybiB0b3A7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRvcEl0ZW07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRUb3BJdGVtKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9wSXRlbShPYmplY3QgdG9wKSB7Ci0JCXRvcEl0ZW0gPSB0b3A7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc1JvbGxlZFVwKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGxlZFVwKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRSb2xsZWRVcChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGxlZFVwKGJvb2xlYW4gYikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNGaXJzdEVsZW1lbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzTGFzdEVsZW1lbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhc3RFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKE9iamVjdCBhY3Rpdml0eU9iaiwgT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI21vdmVVcChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlVXAoT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNtb3ZlRG93bihqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlRG93bihPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldEVDbGFzc2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCURlc2NyaWJhYmxlRWxlbWVudCBlID0gKERlc2NyaWJhYmxlRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSkgewotCQkJcmV0dXJuIGUuZ2V0TmFtZSgpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSUQpIHsKLQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihpZCk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSkgewotCQkJU3RyaW5nIG5hbWUgPSBlLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCWlmIChTdHJVdGlsLmlzQmxhbmsobmFtZSkpIHsKLQkJCQluYW1lID0gZS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdGV4dFZhbHVlKSB7Ci0KLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQ29sdW1uQXdhcmUjc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoamF2YS51dGlsLk1hcCkKLQkvLyAqLwotCS8vIHB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4VG9OYW1lTWFwKE1hcCBtYXApIHsKLQkvLyBpZiAobWFwICE9IG51bGwpCi0JLy8gewotCS8vIGNvbHVtbkluZGV4VG9OYW1lTWFwID0gbWFwOwotCS8vIGNvbHVtbkluZGV4VG9OYW1lTWFwQ2hhbmdlZCA9IHRydWU7Ci0JLy8gfQotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0UHJlZGVjZXNzb3JzKCkKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaXN0IGdldFByZWRlY2Vzc29ycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc0V4cGFuZGVkKCkKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBpc0V4cGFuZGVkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEV4cGFuZGVkKGphdmEubGFuZy5Cb29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGFuZGVkKEJvb2xlYW4gYikgewotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2NyZWF0ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCSAqLwotCXByb3RlY3RlZCBJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJSVdyYXBwZXJJdGVtUHJvdmlkZXIgd2lwID0gZG9DcmVhdGVXcmFwcGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQlpZih3aXAgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgd2lwOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQl3cmFwcGVyLmZlYXR1cmUgPSAoKERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSB2YWx1ZSkKLQkJCQkuZ2V0RmVhdHVyZSgpOwotCQkJfQotCQkJd3JhcHBlci5zZXRSZWFkT25seShyZWFkT25seSk7Ci0JCQl3cmFwcGVyLmlzUm9sbHVwQ2hpbGQgPSBpc1JvbGx1cENoaWxkOwotCQkJd3JhcHBlci5pc0luaGVyaXRlZCA9IGlzSW5oZXJpdGVkOwotCQkJd3JhcHBlci5jb250cmlidXRlZCA9IGlzQ29udHJpYnV0ZWQoKTsKLQkJfQkJCi0JCXJldHVybiB3aXA7Ci0JfQotCQotCXByb3RlY3RlZCBJV3JhcHBlckl0ZW1Qcm92aWRlciBkb0NyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKHZhbHVlKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IG5ldyBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCQkoRGVzY3JpYmFibGVFbGVtZW50KSBlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQkJcmV0dXJuIHdyYXBwZXI7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVdyYXBwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChkZWxlZ2F0ZUl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChJVGFibGVJdGVtTGFiZWxQcm92aWRlcikgZGVsZWdhdGVJdGVtUHJvdmlkZXIpCi0JCQkJCS5nZXRDb2x1bW5JbWFnZShvYmplY3QsIGNvbHVtbkluZGV4KTsKLQkJfQotCQlpZiAoY29sdW1uSW5kZXggPT0gMAotCQkJCSYmIGRlbGVnYXRlSXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSUl0ZW1MYWJlbFByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChJSXRlbUxhYmVsUHJvdmlkZXIpIGRlbGVnYXRlSXRlbVByb3ZpZGVyKS5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCkgewotCQlBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkJaWYgKHJvb3RBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDb2x1bW5Bd2FyZSkgewotCQkJTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwID0gKChJQ29sdW1uQXdhcmUpIHJvb3RBZGFwdGVyRmFjdG9yeSkKLQkJCQkJLmdldENvbHVtbkluZGV4VG9OYW1lTWFwKCk7Ci0JCQlpZiAoY29sdW1uSW5kZXhUb05hbWVNYXAgIT0gbnVsbCkgewotCQkJCXJldHVybiAoU3RyaW5nKSBjb2x1bW5JbmRleFRvTmFtZU1hcC5nZXQobmV3IEludGVnZXIoCi0JCQkJCQljb2x1bW5JbmRleCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJLy8gU3RyaW5nIGNvbE5hbWUgPSAoU3RyaW5nKSBjb2x1bW5JbmRleFRvTmFtZU1hcC5nZXQobmV3Ci0JCS8vIEludGVnZXIoY29sdW1uSW5kZXgpKTsKLQkJU3RyaW5nIGNvbE5hbWUgPSBnZXRDb2x1bW5OYW1lKGNvbHVtbkluZGV4KTsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShvYmplY3QsIGNvbE5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0TGlzdGVuZXJzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChjaGFuZ2VOb3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KChMaXN0KSBjaGFuZ2VOb3RpZmllcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLAotCQkJTGlzdCBkcm9wRWxlbWVudHMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllOWFhMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTykgewotCQkJU3RyaW5nQnVmZmVyIG1vZGVsSW5mbyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCU9iamVjdCBlID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIG9iamVjdCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGU7Ci0JCQkJT2JqZWN0IGJhc2UgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCQkvLyBsb29rIGZvciBleGlzdGluZyBkZXNjcmlwdG9yIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotCQkJCQkvLyBiYXNlIGluIHRoZSBhY3Rpdml0eQotCQkJCQkvLwotCQkJCQlPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJCQkJZm9yIChwYXJlbnQgPSBnZXRQYXJlbnQob2JqZWN0KTsgcGFyZW50ICE9IG51bGwKLQkJCQkJCQkmJiAhKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KTspIHsKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpCi0JCQkJCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlPYmplY3QgZGVzYyA9IG51bGw7Ci0JCQkJCQlmaW5kX2Rlc2NyaXB0b3JfbG9vcDogZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlcgotCQkJCQkJCQkuZ2V0Q2hpbGRyZW4ocGFyZW50KS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgRGVzY3JpcHRvcgotCQkJCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBjaGlsZCkgPT0gYmFzZSkgewotCQkJCQkJCQlkZXNjID0gY2hpbGQ7Ci0JCQkJCQkJCWJyZWFrIGZpbmRfZGVzY3JpcHRvcl9sb29wOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJCQkJCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkgewotCQkJCQkJCQlzdHIgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5wcm9jZXNzX2V4dGVuZHM7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9IGVsc2UgaWYgKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKSB7Ci0JCQkJCQkJCXN0ciA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnByb2Nlc3NfcmVwbGFjZXM7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJU3RyaW5nIG5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZGVzYykKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJCQkJaWYgKHN0ciAhPSBudWxsKQotCQkJCQkJCQltb2RlbEluZm8uYXBwZW5kKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHN0ciwKLQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBuYW1lIH0pKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCW1vZGVsSW5mby5hcHBlbmQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0vLwkJCQkJUHJvY2Vzc1V0aWwuZ2V0TW9kZWxJbmZvRm9yV29ya1Byb2R1Y3REZXNjcmlwdG9yKG1vZGVsSW5mbywKLS8vCQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdCk7Ci0JCQkJCVByb2Nlc3NVdGlsLmdldFdQRE1vZGVsSW5mbyhtb2RlbEluZm8sIG9iamVjdCwgdGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1vZGVsSW5mby50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQlNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lCU0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDZhMWYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lCU0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGJhc2UgaW50ZXJmYWNlIG9mIGFsbCBpdGVtIHByb3ZpZGVycyBmb3IgYnJlYWtkb3duIGVsZW1lbnQgdXNlZAotICogYnkgdGhlIFByb2Nlc3MgRWRpdG9yLiBJdCBkZWZpbmVzIHRoZSBjb25zdGFudHMgZm9yIGNvbHVtbiBuYW1lcyBhbmQgbWV0aG9kcwotICogdG8gc3VwcG9ydCByb3cgaW5kZXgsIHJvbGwtdXAgdmlldywgZ2V0dGluZy9zZXR0aW5nIGJyZWFrZG93biBlbGVtZW50J3MKLSAqIGF0dHJpYnV0ZXMsIHByZWRlY2Vzc29yIGxpc3QuLi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQlNJdGVtUHJvdmlkZXIgZXh0ZW5kcyAvL0lMaWJyYXJ5SXRlbVByb3ZpZGVyLAotCQlJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JLyoqIENvbHVtbiBJRCBjb25zdGFudHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX1BSRUZJWCA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfUFJFREVDRVNTT1JTID0gInByZWRlY2Vzc29ycyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9JU19SRVBFQVRBQkxFID0gImlzX3JlcGVhdGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSVNfT05HT0lORyA9ICJpc19vbmdvaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0lTX0VWRU5UX0RSSVZFTiA9ICJpc19ldmVudF9kcml2ZW4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfRU5UUllfU1RBVEUgPSAiZW50cnlfc3RhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfRVhJVF9TVEFURSA9ICJleGl0X3N0YXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX1RFQU1TID0gInRlYW1zIjsgLy8kTk9OLU5MUy0xJCAgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX01PREVMX0lORk8gPSAibW9kZWxfaW5mbyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9QUkVTRU5UQVRJT05fTkFNRSA9ICJwcmVzZW50YXRpb25fbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9ERUxJVkVSQUJMRSA9ICJkZWxpdmVyYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9JU19PUFRJT05BTCA9ICJpc19vcHRpb25hbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9JU19QTEFOTkVEID0gImlzX3BsYW5uZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gImhhc19tdWx0aXBsZV9vY2N1cnJlbmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09MVU1OUyA9IHsgQ09MX05BTUUsIENPTF9QUkVGSVgsIENPTF9JRCwKLQkJCUNPTF9QUkVERUNFU1NPUlMsIENPTF9JU19SRVBFQVRBQkxFLCBDT0xfSVNfT05HT0lORywKLQkJCUNPTF9JU19FVkVOVF9EUklWRU4sIENPTF9FTlRSWV9TVEFURSwgQ09MX0VYSVRfU1RBVEUsIENPTF9URUFNUywKLQkJCUNPTF9UWVBFLCBDT0xfTU9ERUxfSU5GTywgQ09MX1BSRVNFTlRBVElPTl9OQU1FLCBDT0xfREVMSVZFUkFCTEUgfTsKLQkKLQlpbnQgZ2V0SWQoKTsKLQotCXZvaWQgc2V0SWQoaW50IGlkKTsKLQotCS8vIElCU0l0ZW1Qcm92aWRlciBnZXRJdGVtUHJvdmlkZXIoRU9iamVjdCBlT2JqKTsKLQotCXZvaWQgc2V0UGFyZW50KE9iamVjdCBvYmopOwotCi0JT2JqZWN0IGdldFRvcEl0ZW0oKTsKLQotCXZvaWQgc2V0VG9wSXRlbShPYmplY3QgdG9wKTsKLQotCWJvb2xlYW4gaXNSb2xsZWRVcCgpOwotCi0Jdm9pZCBzZXRSb2xsZWRVcChib29sZWFuIGIpOwotCi0JYm9vbGVhbiBpc0ZpcnN0RWxlbWVudChPYmplY3Qgb2JqKTsKLQotCWJvb2xlYW4gaXNMYXN0RWxlbWVudChPYmplY3Qgb2JqKTsKLQotCS8vIExpc3QgZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhPYmplY3QgYWN0aXZpdHlPYmosIE9iamVjdCBvYmopOwotCi0Jdm9pZCBtb3ZlVXAoT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKTsKLQotCXZvaWQgbW92ZURvd24oT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKTsKLQotCUNvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKTsKLQotCS8vIEdyYXBoaWNhbERhdGEgZ2V0R3JhcGhpY2FsRGF0YSgpOwotCi0JLy8gdm9pZCBzZXRHcmFwaGljYWxEYXRhKEdyYXBoaWNhbERhdGEgZGF0YSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIG9iamVjdCBhcyBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIHByb3BlcnR5Ci0JICogICAgICAgICAgICBvbmUgb2YgdGhlIGNvbHVtbiBJRCBjb25zdGFudHMgQ09MX1hYWAotCSAqIEByZXR1cm4gU3RyaW5nIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgY29sdW1uIElEIGNvbnN0YW50cyBDT0xfWFhYCi0JICogQHBhcmFtIHRleHRWYWx1ZQotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nIHRleHRWYWx1ZSk7Ci0KLQlMaXN0IGdldExpc3RlbmVycygpOwotCi0JUHJlZGVjZXNzb3JMaXN0IGdldFByZWRlY2Vzc29ycygpOwotCi0JQm9vbGVhbiBpc0V4cGFuZGVkKCk7Ci0KLQl2b2lkIHNldEV4cGFuZGVkKEJvb2xlYW4gYik7Ci0KLQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLCBMaXN0IGRyb3BFbGVtZW50cyk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjYxNjJkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuaW50ZXJuYWwuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IGV4dGVuZHMgSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIElCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQ29sdW1uQXdhcmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lDb2x1bW5Bd2FyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYjM4MjBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lDb2x1bW5Bd2FyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCB0byBwYXNzIHRoZSBjb2x1bW4gaW5kZXggLyBuYW1lIG1hcCBmcm9tIHRoZSB1c2VyIGludGVyZmFjZSB0bwotICogdGhlIGFkYXB0ZXIgdGhhdCBpbXBsZW1lbnRzIGl0IHNvIHRoZSBhZGFwdGVyIGNhbiBwcm92aWRlIHRoZSBjb3JyZWN0IGRhdGEKLSAqIGZvciB0aGUgY29sdW1ucyBldmVuIHRoZWlyIGluZGV4IGhhdmUgY2hhbmdlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29sdW1uQXdhcmUgewotCi0JTWFwIGdldENvbHVtbkluZGV4VG9OYW1lTWFwKCk7Ci0KLQl2b2lkIHNldENvbHVtbkluZGV4VG9OYW1lTWFwKE1hcCBtYXApOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTRjODQ2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2Nlc3NJdGVtUHJvdmlkZXIgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDAwNTI1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgSUNvbHVtbkF3YXJlIHsKLQotCXByaXZhdGUgTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwOwotCi0JLyoqCi0JICogUmVmZXJlbmNlcyB0byBzdGF0ZWZ1bCBhZGFwdGVycyBjcmVhdGVkIGJ5IHRoaXMgYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHJpdmF0ZSBTZXQgZGlzcG9zYWJsZUFkYXB0ZXJzID0gbmV3IEhhc2hTZXQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gY3JlYXRlZEFkYXB0ZXJzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlci5jcmVhdGVCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5EZXNjcmlwdG9yc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkRlc2NyaXB0b3JzQWRhcHRlckZhY3RvcnkjY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkRlc2NyaXB0b3JzQWRhcHRlckZhY3RvcnkjY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkRlc2NyaXB0b3JzQWRhcHRlckZhY3RvcnkjY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklDb2x1bW5Bd2FyZSNzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4VG9OYW1lTWFwKE1hcCBtYXApIHsKLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQljb2x1bW5JbmRleFRvTmFtZU1hcCA9IG1hcDsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDb2x1bW5Bd2FyZSkgewotCQkJKChJQ29sdW1uQXdhcmUpIGFkYXB0ZXIpCi0JCQkJCS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChjb2x1bW5JbmRleFRvTmFtZU1hcCk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0eXBlKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29sdW1uQXdhcmUpIHsKLQkJCSgoSUNvbHVtbkF3YXJlKSBhZGFwdGVyKQotCQkJCQkuc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoY29sdW1uSW5kZXhUb05hbWVNYXApOwotCQl9Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSVN0YXRlZnVsSXRlbVByb3ZpZGVyCi0JCQkJJiYgbm90aWZpZXIgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJJiYgKChFT2JqZWN0KSBub3RpZmllcikuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCWRpc3Bvc2FibGVBZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuUHJvY2Vzc3R5cGVzQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKQotCSAqLwotCS8vIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCkgewotCS8vIHJldHVybiBuZXcgUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkvLyB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3N0eXBlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKQotCSAqLwotCS8vIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JLy8gcmV0dXJuIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCk7Ci0JLy8gfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Qcm9jZXNzdHlwZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKQotCSAqLwotCS8vIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkvLyByZXR1cm4gY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKTsKLQkvLyB9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJvbGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlQWRhcHRlcigpIHsKLQkJaWYgKHJvbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZUl0ZW1Qcm92aWRlciA9IG5ldyBSb2xlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiByb2xlSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtPcmRlckFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrT3JkZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd29ya09yZGVySXRlbVByb3ZpZGVyID0gbmV3IFdvcmtPcmRlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gd29ya09yZGVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQ29sdW1uQXdhcmUjZ2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoKQotCSAqLwotCXB1YmxpYyBNYXAgZ2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoKSB7Ci0JCXJldHVybiBjb2x1bW5JbmRleFRvTmFtZU1hcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKCFkaXNwb3NhYmxlQWRhcHRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaXNwb3NhYmxlQWRhcHRlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSURpc3Bvc2FibGUgYWRhcHRlciA9IChJRGlzcG9zYWJsZSkgaXRlci5uZXh0KCk7Ci0JCQkJYWRhcHRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlkaXNwb3NhYmxlQWRhcHRlcnMuY2xlYXIoKTsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL01pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL01pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTdjZTFmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9NaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlcihNaWxlc3RvbmUgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtaWxlc3RvbmUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyKE1pbGVzdG9uZSBtaWxlc3RvbmUsIE9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKG1pbGVzdG9uZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjgzZTQ5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuT0JTRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLk9CU0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIEl0ZW0gcHJvdmlkZXIgZm9yIFRlYW0gQWxsb2NhdGlvbiBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgRGlzcG9zYWJsZSByb2xsZWRVcFdyYXBwZXJzOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQkvLyBBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iamVjdDsKLQkJLy8gaWYoaGFzQ2hpbGREZXNjcmlwdG9yKGFjdCkpIHsKLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpKSk7Ci0JCS8vICAgIAkJCi0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVhbVByb2ZpbGUoKSkpOwotCQkvLwotCQkvLyB9Ci0JCS8vIGVsc2UgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQaGFzZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlSXRlcmF0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBY3Rpdml0eSgpKSk7Ci0KLQkJLy8gaWYoYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpKTsKLQotCQkvLyBDT01QT1NJVEUgUk9MRSBGRUFUVVJFIElTIE5PVCBBVkFJTEFCTEUgRk9SIEZJUlNUIFJFTEVBU0UuCi0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9zaXRlUm9sZSgpKSk7Ci0JCS8vCQkJCQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVUZWFtUHJvZmlsZSgpKSk7Ci0KLQkJLy8gfQotCQkvLyB9Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlTWlsZXN0b25lKCkpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBjaGlsZCkgewotCQljaGlsZCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBjaGlsZCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yCi0JCQkJfHwgY2hpbGQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSB8fCBjaGlsZCBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdEFzQ2hpbGQoY2hpbGQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRPYmplY3Qob3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0KERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQl0cnkgewotCQkJcmV0dXJuICgoUm9sZURlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFJvbGUoKTsKLQkJfQotCQljYXRjaChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlQXdhcmVDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwKLQkJCUxpc3QgZHJvcEVsZW1lbnRzKSB7Ci0JCXJldHVybiBuZXcgT0JTRHJvcENvbW1hbmQoKEFjdGl2aXR5KSBvd25lciwgZHJvcEVsZW1lbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlPYmplY3Qgb3duZXIsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQkvLyBTeXN0ZW0ub3V0Ci0JCS8vIC5wcmludGxuKCJFTlRFUjoKLQkJLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLAotCQkvLyBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbikiKTsKLQkJQ29tbWFuZCBjbWQgPSBuZXcgT0JTRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLAotCQkJCW9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgY2FuIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgb3duZXI6ICIgKyBvd25lcik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGNvbGxlY3Rpb246ICIgKyBjb2xsZWN0aW9uKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgbG9jYXRpb246ICIgKyBsb2NhdGlvbik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIG9wZXJhdGlvbnM6ICIgKyBvcGVyYXRpb25zKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgb3BlcmF0aW9uOiAiICsgb3BlcmF0aW9uKTsKLQkJLy8gICAgICAgIAotCQkvLyBTeXN0ZW0ub3V0Ci0JCS8vIC5wcmludGxuKCJFWElUOgotCQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChkb21haW4sCi0JCS8vIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKSIpOwotCQlyZXR1cm4gY21kOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjcmVmcmVzaENoaWxkcmVuKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiwKLQkvLyBqYXZhLnV0aWwuTGlzdCkKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hDaGlsZHJlbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBMaXN0Ci0JLy8gbmV3T3JPbGRDaGlsZHJlbikgewotCS8vIGlmKCFuZXdPck9sZENoaWxkcmVuLmlzRW1wdHkoKSkgewotCS8vIFByb2Nlc3MgdG9wQWN0ID0gKFByb2Nlc3MpIGdldFRvcEl0ZW0oKTsKLQkvLyBBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkvLwkJCQkJCQotCS8vIFByb2Nlc3NVdGlsLnJlZnJlc2hWaWV3ZXIocm9vdEFkYXB0ZXJGYWN0b3J5LCB0b3BBY3QpOwotCS8vCQkJCi0JLy8gcmV0dXJuOwotCS8vCi0JLy8gfQotCS8vIH0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNpc05ld0Rlc2NyaXB0b3IoamF2YS51dGlsLkxpc3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXdEZXNjcmlwdG9yKExpc3QgY2hpbGRyZW4sIE9iamVjdCBjaGlsZCkgewotCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkvLyBjb2xsZWN0IGFsbCByb2xlIGRlc2NyaXB0b3JzIG9yIHRoZWlyIHdyYXBwZXJzIGZpcnN0IGZvciBtYXRjaGluZyB3aXRoIHRlYW0gcHJvZmlsZXMKLQkJLy8gYW5kIGVsaW1pbmF0ZSB0aGUgZHVwbGljYXRlcyBsYXRlciBpbiBnZXRDaGlsZHJlbigpCi0JCS8vCi0JCWlmKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNOZXdEZXNjcmlwdG9yKGNoaWxkcmVuLCBvYmopOwotCX0JCQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChyb2xsZWRVcFdyYXBwZXJzICE9IG51bGwpIHsKLQkJCXJvbGxlZFVwV3JhcHBlcnMuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKGlzUm9sbGVkVXAoKSkgewotCQkJTGlzdCB0ZWFtUHJvZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlMaXN0IHJvbGVEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUhhc2hTZXQgcm9sZVRlYW1QYWlycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlIYXNoU2V0IHJvbGVEZXNjcmlwdG9yc1dpdGhvdXRMaW5rZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCQotCQkJLy8gY29sbGVjdCBhbGwgdGVhbSBwcm9maWxlcyB1bmRlciB0aGlzIGFjdGl2aXR5Ci0JCQkvLwotCQkJSGFzaFNldCB2YWxpZFRlYW1Qcm9maWxlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAobyk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCQlpZih2YWxpZFRlYW1Qcm9maWxlcy5hZGQoZSkpIHsKLQkJCQkJCXRlYW1Qcm9maWxlcy5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJUm9sZURlc2NyaXB0b3IgZGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZTsKLQkJCQkJTGlzdCBsaXN0OwotCQkJCQlMaXN0IGRlc2NyaXB0b3JzID0gbnVsbDsKLQkJCQkJQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBjb21wb3NlZFdyYXBwZXIgPSBudWxsOwkJCQkJCi0JCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlPYmplY3QgdmFsdWUgPSAoKFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciljaGlsZCkuZ2V0VmFsdWUoKTsKLQkJCQkJCWlmKHZhbHVlIGluc3RhbmNlb2YgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCWNvbXBvc2VkV3JhcHBlciA9IChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB2YWx1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZihjb21wb3NlZFdyYXBwZXIgIT0gbnVsbCkgewotCQkJCQkJbGlzdCA9IG5ldyBVbmlxdWVFTGlzdCgpOwotCQkJCQkJZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29tcG9zZWRXcmFwcGVyLmdldFZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IG8gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvKTsKLQkJCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJCQkJTGlzdCB0ZWFtcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFRlYW1Qcm9maWxlcygoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpOwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0ZWFtcy5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCU9iamVjdCB0ZWFtID0gaXRvci5uZXh0KCk7Ci0JCQkJCQkJCQlpZihsaXN0LmFkZCh0ZWFtKSkgewotCQkJCQkJCQkJCWRlc2NyaXB0b3JzLmFkZChvKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldFRlYW1Qcm9maWxlcyhkZXNjKTsKLQkJCQkJfQotCQkJCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOyAKLQkJCQkJaWYoc2l6ZSA+IDEpIHsKLQkJCQkJCWlmIChyb2xsZWRVcFdyYXBwZXJzID09IG51bGwpIHsKLQkJCQkJCQlyb2xsZWRVcFdyYXBwZXJzID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJYm9vbGVhbiByZWFkT25seSA9IGZhbHNlOwotCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlyZWFkT25seSA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGNoaWxkKQotCQkJCQkJCS5pc1JlYWRPbmx5KCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIHNob3cgb25lIGRlc2NyaXB0b3IgcGVyIHRlYW0KLQkJCQkJCS8vCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJCVRlYW1Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSBuZXcgVGVhbVJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKAotCQkJCQkJCQkJZGVzY3JpcHRvcnMuZ2V0KGkpLCBvYmplY3QsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJCQlpdGVtUHJvdmlkZXIucmVhZE9ubHkgPSByZWFkT25seTsKLQkJCQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBsaXN0LmdldChpKTsKLQkJCQkJCQkKLS8vCQkJCQkJCS8vIGFkZCB0ZWFtIHRvIHRoZSB0ZWFtIGxpc3Qgb25seSBpZiB0aGUgdGVhbSBpcyB1bmRlciB0aGlzIGFjdGl2aXR5Ci0vLwkJCQkJCQkvLwotLy8JCQkJCQkJaWYodmFsaWRUZWFtUHJvZmlsZXMuY29udGFpbnModGVhbSkpIHsKLS8vCQkJCQkJCQlhZGRUZWFtUHJvZmlsZXMob2JqZWN0LCB0ZWFtUHJvZmlsZXMsIHRlYW0pOwotLy8JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCWl0ZW1Qcm92aWRlci50ZWFtID0gdGVhbTsKLQkJCQkJCQlyb2xsZWRVcFdyYXBwZXJzLmFkZChpdGVtUHJvdmlkZXIpOwotCQkJCQkJCXJvbGVEZXNjcmlwdG9ycy5hZGQoaXRlbVByb3ZpZGVyKTsKLQkJCQkJCQlyb2xlVGVhbVBhaXJzLmFkZChuZXcgUm9sZVRlYW1QYWlyKChSb2xlKSBnZXRPYmplY3QoZGVzYyksIHRlYW0pKTsKLQkJCQkJCX0JCQkJCQkKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBnZXRPYmplY3QoZGVzYyk7Ci0JCQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSAoc2l6ZSA9PSAxID8gbGlzdC5nZXQoMCkgOiBudWxsKTsKLQkJCQkJCWlmKHJvbGUgPT0gbnVsbCkgewotCQkJCQkJCWlmKCFyb2xlRGVzY3JpcHRvcnNXaXRob3V0TGlua2VkRWxlbWVudHMuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChjaGlsZCk7Ci0JCQkJCQkJCQotLy8JCQkJCQkJCS8vIGFkZCB0ZWFtIHRvIHRoZSB0ZWFtIGxpc3Qgb25seSBpZiB0aGUgdGVhbSBpcyB1bmRlciB0aGlzIGFjdGl2aXR5Ci0vLwkJCQkJCQkJLy8KLS8vCQkJCQkJCQlpZih0ZWFtICE9IG51bGwgJiYgdmFsaWRUZWFtUHJvZmlsZXMuY29udGFpbnModGVhbSkpIHsKLS8vCQkJCQkJCQkJYWRkVGVhbVByb2ZpbGVzKG9iamVjdCwgdGVhbVByb2ZpbGVzLCB0ZWFtKTsKLS8vCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnNXaXRob3V0TGlua2VkRWxlbWVudHMuYWRkKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCVJvbGVUZWFtUGFpciByb2xlVGVhbVBhaXIgPSBuZXcgUm9sZVRlYW1QYWlyKHJvbGUsIHRlYW0pOwotCQkJCQkJCWlmKCFyb2xlVGVhbVBhaXJzLmNvbnRhaW5zKHJvbGVUZWFtUGFpcikpIHsKLQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChjaGlsZCk7Ci0JCQkJCQkJCQotLy8JCQkJCQkJCS8vIGFkZCB0ZWFtIHRvIHRoZSB0ZWFtIGxpc3Qgb25seSBpZiB0aGUgdGVhbSBpcyB1bmRlciB0aGlzIGFjdGl2aXR5Ci0vLwkJCQkJCQkJLy8KLS8vCQkJCQkJCQlpZih0ZWFtICE9IG51bGwgJiYgdmFsaWRUZWFtUHJvZmlsZXMuY29udGFpbnModGVhbSkpIHsKLS8vCQkJCQkJCQkJYWRkVGVhbVByb2ZpbGVzKG9iamVjdCwgdGVhbVByb2ZpbGVzLCB0ZWFtKTsKLS8vCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCQlyb2xlVGVhbVBhaXJzLmFkZChyb2xlVGVhbVBhaXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJvbGVUZWFtUGFpcnMuY2xlYXIoKTsKLQkJCXJvbGVUZWFtUGFpcnMgPSBudWxsOwotCQkJQ29sbGVjdGlvbnMuc29ydCh0ZWFtUHJvZmlsZXMsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQkJQ29sbGVjdGlvbnMuc29ydChyb2xlRGVzY3JpcHRvcnMsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHRlYW1Qcm9maWxlcyk7Ci0JCQljaGlsZHJlbi5hZGRBbGwocm9sZURlc2NyaXB0b3JzKTsKLQkJCQotCQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oY2hpbGRyZW4pOwotCQkJCi0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0KLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCXVwZGF0ZUNhY2hlZENoaWxkcmVuKGNoaWxkcmVuKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldE9CU0VjbGFzc2VzKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRUZWFtUHJvZmlsZXMoT2JqZWN0IG93bmVyLCBDb2xsZWN0aW9uIHRlYW1Qcm9maWxlcywgVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUpIHsKLQkJaWYgKCFUbmdVdGlsLmNoZWNrRXhpc3QodGVhbVByb2ZpbGVzLCB0ZWFtUHJvZmlsZSkpIHsKLQkJCVRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gbmV3IFRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCQkJdGVhbVByb2ZpbGUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSkgewotCQkJCS8qIChub24tSmF2YWRvYykKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCQkJICovCi0JCQkJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCQkJCi0vLwkJCQkJLy8gZG9uJ3Qgc2hvdyByb2xlIGRlc2NyaXB0b3JzCi0vLwkJCQkJLy8KLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQkJT2JqZWN0IGNoaWxkID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotLy8JCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0vLwkJCQkJCQlpdGVyLnJlbW92ZSgpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQkKLQkJCQkJCi0JCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCQl9Ci0JCQkJCi0JCQl9OwotCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQodGVhbVByb2ZpbGUsCi0JCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXdyYXBwZXIucmVhZE9ubHkgPSAoZ2V0VG9wSXRlbSgpICE9IGFkYXB0ZXIuZ2V0VG9wSXRlbSgpKTsKLQkJCXRlYW1Qcm9maWxlcy5hZGQod3JhcHBlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUZWFtUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQkJUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQkJCi0JCQotCQlwdWJsaWMgVGVhbVJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIHZhbHVlCi0JCSAqIEBwYXJhbSBvd25lcgotCQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBUZWFtUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIoUm9sZURlc2NyaXB0b3IgdmFsdWUsCi0JCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQlyZWFkT25seSA9IGZhbHNlOwotCQl9Ci0KLQkJcHJpdmF0ZSBUZWFtUHJvZmlsZSB0ZWFtOwotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUyAmJiB0ZWFtICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKHRlYW0pOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciNjcmVhdGVXcmFwcGVyKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpCi0JCSAqLwotCQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsCi0JCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgc3VwZXIKLQkJCQkJLmNyZWF0ZVdyYXBwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQl3cmFwcGVyLnJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JCQlyZXR1cm4gd3JhcHBlcjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJvbGVUZWFtUGFpciB7Ci0JCXByaXZhdGUgUm9sZSByb2xlOwotCQlwcml2YXRlIFRlYW1Qcm9maWxlIHRlYW07Ci0KLQkJUm9sZVRlYW1QYWlyKFJvbGUgcm9sZSwgVGVhbVByb2ZpbGUgdGVhbSkgewotCQkJdGhpcy5yb2xlID0gcm9sZTsKLQkJCXRoaXMudGVhbSA9IHRlYW07Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZihvYmogPT0gdGhpcykgcmV0dXJuIHRydWU7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBSb2xlVGVhbVBhaXIpIHsKLQkJCQlSb2xlVGVhbVBhaXIgb3RoZXIgPSAoUm9sZVRlYW1QYWlyKSBvYmo7Ci0JCQkJcmV0dXJuIHJvbGUgPT0gb3RoZXIucm9sZSAmJiAodGVhbSA9PSBvdGhlci50ZWFtIHx8ICh0ZWFtID09IG51bGwgJiYgb3RoZXIudGVhbSA9PSBudWxsKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlTdHJpbmcgc3RyID0gcm9sZS5nZXRHdWlkKCk7Ci0JCQlpZih0ZWFtICE9IG51bGwpIHsKLQkJCQlzdHIgPSBzdHIgKyB0ZWFtLmdldEd1aWQoKTsKLQkJCX0KLQkJCXJldHVybiBzdHIuaGFzaENvZGUoKTsJCQkKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nUm9sbHVwTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoVG5nVXRpbC51bndyYXAob2JqZWN0KSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChvYmplY3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlUm9sbHVwV3JhcHBlcihPYmplY3Qgb2JqZWN0LCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCU9iamVjdCB3cmFwcGVyID0gc3VwZXIuY3JlYXRlUm9sbHVwV3JhcHBlcihvYmplY3QsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCXJldHVybiBuZXcgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKHdyYXBwZXIsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5NDAwZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5jcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKSk7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKQotCS8vICovCi0JLy8gcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKSB7Ci0JLy8gcmV0dXJuIG5ldyBPQlNDb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyKHRoaXMpOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBPQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKQotCSAqLwotCS8vIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCkgewotCS8vIHJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQkvLyB9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODFhYTFmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciB7Ci0KLQkvLyBwcml2YXRlIENvbGxlY3Rpb24gZUNsYXNzZXMgPSBuZXcgSGFzaFNldCgpOwotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBPQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyByZXR1cm4gVG5nVXRpbC5nZXRBbGxDaGlsZHJlbigoUHJvY2Vzc0NvbnRyaWJ1dGlvbikgb2JqZWN0LAotCS8vIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCksCi0JLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpKTsKLQkvLyB9Ci0JLy8gICAgCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkvLyBDb2xsZWN0aW9uIGVsZW1lbnRzID0gc3VwZXIuZ2V0RWxlbWVudHMob2JqZWN0KTsKLQkvLyByZXR1cm4gZWxlbWVudHM7Ci0JLy8gfQotCi0JLy8gcHVibGljIExpc3QgZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhPYmplY3QgYWN0aXZpdHksIE9iamVjdCBvYmopCi0JLy8gewotCS8vIExpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gTGlzdCBicmVha2Rvd25FbGVtZW50cyA9ICgoQWN0aXZpdHkpYWN0aXZpdHkpLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdCA9IGJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JLy8gewotCS8vIE9iamVjdCBlbGVtZW50T2JqID0gaXQubmV4dCgpOwotCS8vIGlmICgoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB8fCAoZWxlbWVudE9iaiBpbnN0YW5jZW9mCi0JLy8gVGVhbVByb2ZpbGUpIHx8IChlbGVtZW50T2JqIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgfHwgKGVsZW1lbnRPYmoKLQkvLyBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgfHwgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JLy8gewotCS8vIGVsZW1lbnRzLmFkZChlbGVtZW50T2JqKTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBlbGVtZW50czsKLQkvLyB9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldE9CU0VjbGFzc2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczMzFlNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCi0JcHVibGljIE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JCQkJCS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5Mzc3M2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5QQlNEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUEJTRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgCi1pbXBsZW1lbnRzIElDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlcgotewotCi0JcHJpdmF0ZSBEaXNwb3NhYmxlIHJvbGxlZFVwV3JhcHBlcnM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIEFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqZWN0OwotCQkvLyBpZihoYXNDaGlsZERlc2NyaXB0b3IoYWN0KSkgewotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0JCS8vIH0KLQkJLy8gZWxzZSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVBoYXNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVJdGVyYXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5KCkpKTsKLQotCQkvLyBpZihhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pc0VtcHR5KCkpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpKTsKLQkJLy8gfQotCi0JCS8vIH0KLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVNaWxlc3RvbmUoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCWNoaWxkID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCi0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJfHwgY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkJCQl8fCBjaGlsZCBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdEFzQ2hpbGQoY2hpbGQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAocm9sbGVkVXBXcmFwcGVycyAhPSBudWxsKSB7Ci0JCQlyb2xsZWRVcFdyYXBwZXJzLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmIChpc1JvbGxlZFVwKCkpIHsKLQkJCU1hcCB3b3JrUHJvZHVjdFRvV3JhcHBlcnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGU7Ci0JCQkJCUxpc3QgbGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRvcnMoZGVzYyk7Ci0JCQkJCU9iamVjdCB3cmFwcGVyS2V5ID0gZGVzYy5nZXRXb3JrUHJvZHVjdCgpID09IG51bGwgPyAoT2JqZWN0KWRlc2MgOiBkZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCUxpc3Qgd3JhcHBlcnMgPSAoTGlzdCkgd29ya1Byb2R1Y3RUb1dyYXBwZXJzTWFwLmdldCh3cmFwcGVyS2V5KTsKLQkJCQkJaWYgKGxpc3Quc2l6ZSgpIDwgMSkgewotCQkJCQkJLy8gY2hlY2sgaWYgdGhlIGRlc2NyaXB0b3IgYWxyZWFkeSBleGlzdHMgaW4gdGhlCi0JCQkJCQkvLyByb2xsdXAgbGlzdAotCQkJCQkJLy8KLQkJCQkJCWlmKHdyYXBwZXJzID09IG51bGwpIHsKLQkJCQkJCQl3cmFwcGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQl3b3JrUHJvZHVjdFRvV3JhcHBlcnNNYXAucHV0KHdyYXBwZXJLZXksIHdyYXBwZXJzKTsKLQkJCQkJCQl3cmFwcGVycy5hZGQobmV3IENvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihjaGlsZCwgb2JqZWN0LCBhZGFwdGVyRmFjdG9yeSkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IHdyYXBwZXJzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJCQkJCSgoQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKXdyYXBwZXJzLmdldChpKSkuYWRkV29ya1Byb2R1Y3REZXNjcmlwdG9yKGNoaWxkKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYm9vbGVhbiBjaGVja0V4aXN0ID0gdHJ1ZTsJCQkJCQkJCi0JCQkJCQkJaWYod3JhcHBlcnMgPT0gbnVsbCkgewotCQkJCQkJCQl3cmFwcGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJd29ya1Byb2R1Y3RUb1dyYXBwZXJzTWFwLnB1dCh3cmFwcGVyS2V5LCB3cmFwcGVycyk7Ci0JCQkJCQkJCWNoZWNrRXhpc3QgPSBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYoY2hlY2tFeGlzdCkgewotCQkJCQkJCQkvLyByZW1vdmUgYW55IHdyYXBwZXIgdGhhdCBpcyBub3Qgb2YgdHlwZSBEZWxpdmVyYWJsZVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBmcm9tIHRoZSB3cmFwcGVyIGxpc3QKLQkJCQkJCQkJLy8KLQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCU9iamVjdCB3cmFwcGVyID0gKE9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJaWYoISh3cmFwcGVyIGluc3RhbmNlb2YgRGVsaXZlcmFibGVXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIpKSB7Ci0JCQkJCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJY2hlY2tFeGlzdCA9IHdyYXBwZXJzLnNpemUoKSA+IDA7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCS8vIHNob3cgb25lIGRlc2NyaXB0b3IgcGVyIGRlbGl2ZXJhYmxlCi0JCQkJCQkJLy8KLQkJCQkJCQlhZGRfZGVzY3JpcHRvcnM6Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3QgZGVsaXZlcmFibGVEZXNjcmlwdG9yID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZihjaGVja0V4aXN0KSB7Ci0JCQkJCQkJCQlmb3IgKGludCBpID0gd3JhcHBlcnMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCQkJCQlEZWxpdmVyYWJsZVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKERlbGl2ZXJhYmxlV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKSB3cmFwcGVycy5nZXQoaSk7Ci0JCQkJCQkJCQkJaWYod3JhcHBlci5kZWxpdmVyYWJsZURlc2NyaXB0b3IgPT0gZGVsaXZlcmFibGVEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJCQkJCXdyYXBwZXIuYWRkV29ya1Byb2R1Y3REZXNjcmlwdG9yKGNoaWxkKTsKLQkJCQkJCQkJCQkJY29udGludWUgYWRkX2Rlc2NyaXB0b3JzOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCi0JCQkJCQkJCURlbGl2ZXJhYmxlV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyYWJsZVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcigKLQkJCQkJCQkJCQlkZXNjLCBvYmplY3QsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJCQkJaXRlbVByb3ZpZGVyLmRlbGl2ZXJhYmxlRGVzY3JpcHRvciA9IGRlbGl2ZXJhYmxlRGVzY3JpcHRvcjsKLQkJCQkJCQkJd3JhcHBlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlMaXN0IHJvbGxlZFVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3b3JrUHJvZHVjdFRvV3JhcHBlcnNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJcm9sbGVkVXBDaGlsZHJlbi5hZGRBbGwoKENvbGxlY3Rpb24pIGl0ZXIubmV4dCgpKTsKLQkJCQkKLQkJCX0KLQkJCUxpc3QgcmVzdWx0ID0gcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKHJvbGxlZFVwQ2hpbGRyZW4sIHRydWUpOwotCQkJaWYocm9sbGVkVXBXcmFwcGVycyA9PSBudWxsKSB7Ci0JCQkJcm9sbGVkVXBXcmFwcGVycyA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JCQl9Ci0JCQlyb2xsZWRVcFdyYXBwZXJzLmFkZEFsbChyZXN1bHQpOwotCQkJCi0JCQkvLyBkaXNwb3NlIHdyYXBwZXJzIG9mIHN1YmFydGlmYWN0Ci0JCQkvLwotCQkJZm9yKGludCBpID0gcm9sbGVkVXBDaGlsZHJlbi5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCUlXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHJvbGxlZFVwQ2hpbGRyZW4uZ2V0KGkpOwotCQkJCWlmKCFyb2xsZWRVcFdyYXBwZXJzLmNvbnRhaW5zKHdyYXBwZXIpKSB7Ci0JCQkJCXdyYXBwZXIuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJQ29sbGVjdGlvbnMuc29ydChyZXN1bHQsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQkJCi0JCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihyZXN1bHQpOwotCQkJCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpLCBmYWxzZSk7Ci0JCQotCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihjaGlsZHJlbik7Ci0JCQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihyb2xsZWRVcFdyYXBwZXJzICE9IG51bGwpIHsKLQkJCXJvbGxlZFVwV3JhcHBlcnMuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2lzTmV3RGVzY3JpcHRvcihqYXZhLnV0aWwuTGlzdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05ld0Rlc2NyaXB0b3IoTGlzdCBjaGlsZHJlbiwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIHJldHVybiB0cnVlIHRvIGxldCBvdmVycmlkZW4gZ2V0Q2hpbGRyZW4oKSB0byBoYW5kbGUgdGhlIHVuaXF1ZW5lc3Mgb2YgdGhlIHJvbGx1cCBsaXN0Ci0JCS8vCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZU9yTW92ZVBhY2thZ2VGb3IoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3JNb3ZlUGFja2FnZUZvcihMaXN0IG5ld0NoaWxkcmVuKSB7Ci0JCXN1cGVyLmNyZWF0ZU9yTW92ZVBhY2thZ2VGb3IobmV3Q2hpbGRyZW4pOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0NoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJLy8gYWRkIGRlbGl2ZXJhYmxlIHBhcnRzIHRvIHRoZSBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd3BkLmdldERlbGl2ZXJhYmxlUGFydHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHBhcnQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyYXRvcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCVByb2Nlc3NVdGlsLmFkZFRvQ29udGFpbmVyKHBhcnQsIHRoaXMsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRPYmplY3Qob3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0KERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFdvcmtQcm9kdWN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJT2JqZWN0IG93bmVyLCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBQQlNEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsCi0JCQkJb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcm9wQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsCi0JCQlMaXN0IGRyb3BFbGVtZW50cykgewotCQlyZXR1cm4gbmV3IFBCU0Ryb3BDb21tYW5kKChBY3Rpdml0eSkgb3duZXIsIGRyb3BFbGVtZW50cyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNSb2xsZWRVcENoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNSb2xsZWRVcENoaWxkKE9iamVjdCBjaGlsZCkgewotCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgJiYgKChXb3JrUHJvZHVjdERlc2NyaXB0b3Ipb2JqKS5nZXRTdXBlckFjdGl2aXRpZXMoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc3VwZXIuYWNjZXB0QXNSb2xsZWRVcENoaWxkKG9iaik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0UEJTRWNsYXNzZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWxpdmVyYWJsZVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCQlDb21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgewotCi0JCXByaXZhdGUgT2JqZWN0IGRlbGl2ZXJhYmxlRGVzY3JpcHRvcjsKLQotCQkvKioKLQkJICogQHBhcmFtIHZhbHVlCi0JCSAqIEBwYXJhbSBvd25lcgotCQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBEZWxpdmVyYWJsZVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcigKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQlyZWFkT25seSA9IGZhbHNlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFKSB7Ci0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShkZWxpdmVyYWJsZURlc2NyaXB0b3IpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIExpc3QgcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIHVud3JhcCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKFRuZ1V0aWwudW53cmFwKG9iamVjdCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1dyYXBwaW5nUm9sbHVwTmVlZGVkKG9iamVjdCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFhYmZkMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUEJTTWlsZXN0b25lSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjMTg4ODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBCU01pbGVzdG9uZUl0ZW1Qcm92aWRlciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgewotCi0JLy8gcHJpdmF0ZSBDb2xsZWN0aW9uIGVDbGFzc2VzID0gbmV3IEhhc2hTZXQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBQQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyByZXR1cm4gVG5nVXRpbC5nZXRBbGxDaGlsZHJlbigoUHJvY2Vzc0NvbnRyaWJ1dGlvbikgb2JqZWN0LAotCS8vIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCksCi0JLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpKTsKLQkvLyB9Ci0JLy8gICAgCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkvLyBDb2xsZWN0aW9uIGVsZW1lbnRzID0gc3VwZXIuZ2V0RWxlbWVudHMob2JqZWN0KTsKLQkvLyByZXR1cm4gZWxlbWVudHM7Ci0JLy8gfQotCi0JLy8gcHVibGljIExpc3QgZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhPYmplY3QgYWN0aXZpdHksIE9iamVjdCBvYmopCi0JLy8gewotCS8vIExpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gTGlzdCBicmVha2Rvd25FbGVtZW50cyA9ICgoQWN0aXZpdHkpYWN0aXZpdHkpLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdCA9IGJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JLy8gewotCS8vIE9iamVjdCBlbGVtZW50T2JqID0gaXQubmV4dCgpOwotCS8vIGlmICgoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgfHwgKGVsZW1lbnRPYmoKLQkvLyBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgfHwgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JLy8gewotCS8vIGVsZW1lbnRzLmFkZChlbGVtZW50T2JqKTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBlbGVtZW50czsKLQkvLyB9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFBCU0VjbGFzc2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjZjFiMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQotCXB1YmxpYyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuZGVsZWdhdGVJdGVtUHJvdmlkZXIgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCQkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTNmM2JlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLQkvLyBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm9jZXNzTGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JLy8gcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlcjsKLQkvLyBwcml2YXRlIE9iamVjdCByZWZyZXNoT2JqOwotCS8vCi0JLy8gLyoqCi0JLy8gKgotCS8vICovCi0JLy8gcHVibGljIFByb2Nlc3NMaXN0ZW5lcihJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlciwgT2JqZWN0Ci0JLy8gcmVmcmVzaE9iaikgewotCS8vIHRoaXMuaXRlbVByb3ZpZGVyID0gaXRlbVByb3ZpZGVyOwotCS8vIHRoaXMucmVmcmVzaE9iaiA9IHJlZnJlc2hPYmo7Ci0JLy8gfQotCS8vICAgICAgICAKLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkvLyAqLwotCS8vIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCS8vIHN3aXRjaChtc2cuZ2V0RmVhdHVyZUlEKFByb2Nlc3MuY2xhc3MpKSB7Ci0JLy8gY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkvLyBpdGVtUHJvdmlkZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIHJlZnJlc2hPYmosCi0JLy8gdHJ1ZSwgZmFsc2UpKTsKLQkvLyByZXR1cm47Ci0JLy8gfQotCS8vIH0KLQkvLyB9OwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc0NvbXBvbmVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19OQU1FOgotCQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChwYy5nZXRQcm9jZXNzKCkgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gb2xkID0gcGMuZ2V0UHJvY2VzcygpLmVEZWxpdmVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLnNldE5hbWUocGMuZ2V0TmFtZSgpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlwYy5nZXRQcm9jZXNzKCkuZVNldERlbGl2ZXIob2xkKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJCQotCQkvLyBhdm9pZCByZWZyZXNoaW5nIHZpZXdlcnMgd2hlbiBuZXcgcHJvY2VzcyBlbGVtZW50IG9yIGRpYWdyYW0gaXMgYWRkZWQgdG8gdGhlIHByb2Nlc3MgY29tcG9uZW50Ci0JCS8vCi0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19ESUFHUkFNUzoKLQkJCXJldHVybjsKLQkJCQotCQl9CQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIFByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudClvYmplY3QpLmdldFByb2Nlc3MoKTsKLQkvLyBpZihwcm9jICE9IG51bGwpIHsKLQkvLyBpZihUbmdVdGlsLmdldEFkYXB0ZXIocHJvYywgUHJvY2Vzc0xpc3RlbmVyLmNsYXNzKSA9PSBudWxsKSB7Ci0JLy8gcHJvYy5lQWRhcHRlcnMoKS5hZGQobmV3IFByb2Nlc3NMaXN0ZW5lcih0aGlzLCBvYmplY3QpKTsKLQkvLyB9Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcHJvYy5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkvLyBjaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGNoaWxkcmVuOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCS8vIHB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCS8vIHJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCS8vIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JLy8gLy8gcmVtb3ZlIGFsbCBwcm9jZXNzIGxpc3RlbmVycyBmcm9tIGFsbCB0YXJnZXRzCi0JLy8gLy8KLQkvLyBpZiAodGFyZ2V0ICE9IG51bGwpCi0JLy8gewotCS8vIHRhcmdldC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JLy8gaWYgKHRhcmdldHMgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gZm9yIChJdGVyYXRvciBpID0gdGFyZ2V0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCS8vIHsKLQkvLyBOb3RpZmllciBvdGhlclRhcmdldCA9IChOb3RpZmllcilpLm5leHQoKTsKLQkvLyBvdGhlclRhcmdldC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLyBzdXBlci5kaXNwb3NlKCk7Ci0JLy8gfQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA0ZjM4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIFNlcCAzMCwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTU2NmFhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldE9CU0VjbGFzc2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjk4Mzg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQkKLQlwcm90ZWN0ZWQgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKFJvbGVEZXNjcmlwdG9yIHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoUm9sZURlc2NyaXB0b3IgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoKSB7Ci0JCWlmKGdldFZhbHVlKCkgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWdldFZhbHVlKCkpLmlzSW5oZXJpdGVkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzSW5oZXJpdGVkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNzQ1OWRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlJvbGVJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFJvbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ4ZWFiMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRXQlNFY2xhc3NlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODA4NGZkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB7CQotCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKFRhc2tEZXNjcmlwdG9yIHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZihnZXRWYWx1ZSgpIGluc3RhbmNlb2YgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuICgoQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilnZXRWYWx1ZSgpKS5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoKSB7Ci0JCWlmKGdldFZhbHVlKCkgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWdldFZhbHVlKCkpLmlzSW5oZXJpdGVkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzSW5oZXJpdGVkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1RlYW1Qcm9maWxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyYjY0ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5HZW5lcmljRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuT0JTRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIHsKLQotCS8vIHByaXZhdGUgQ29sbGVjdGlvbiBlQ2xhc3NlczsKLQkvLyBwcml2YXRlIENvbGxlY3Rpb24gdGVhbVJvbGVXcmFwcGVyczsKLQlwcml2YXRlIEdlbmVyaWNEcm9wQ29tbWFuZC5FbGVtZW50QWRhcHRlciBkcm9wQWRhcHRlcjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRlYW1Qcm9maWxlKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKSk7Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcm9wQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsCi0JCQlMaXN0IGRyb3BFbGVtZW50cykgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNEcm9wQ29tbWFuZCgoVGVhbVByb2ZpbGUpIG93bmVyLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwgZHJvcEVsZW1lbnRzLAotCQkJCWdldERyb3BBZGFwdGVyKG93bmVyKSk7Ci0JfQotCi0JcHJpdmF0ZSBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIgZ2V0RHJvcEFkYXB0ZXIoT2JqZWN0IG93bmVyKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChvd25lciwgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gYWRhcHRlci5jcmVhdGVEcm9wQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0KLQkJLy8gYWRkIHRlYW0gcm9sZXMKLQkJLy8KLQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQlib29sZWFuIG51bGxGaWx0ZXIgPSBmaWx0ZXIgPT0gbnVsbDsKLQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSAoVGVhbVByb2ZpbGUpIG9iamVjdDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGVhbVByb2ZpbGUuZ2V0VGVhbVJvbGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSb2xlRGVzY3JpcHRvciBkZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCWlmIChkZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwgJiYgKG51bGxGaWx0ZXIgfHwgZmlsdGVyLmFjY2VwdChkZXNjKSkpIHsKLQkJCQljaGlsZHJlbi5hZGQoZGVzYyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXQgcGFyZW50IGZvciB0aGUgY2hpbGRyZW4ncyBpdGVtIHByb3ZpZGVycwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVByb2Nlc3NVdGlsLnNldFBhcmVudChpdGVyLm5leHQoKSwgb2JqZWN0LCBnZXRSb290QWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCS8vIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gdGVhbVJvbGVXcmFwcGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBJV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKElXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVyLm5leHQoKTsKLQkvLyB3cmFwcGVyLmRpc3Bvc2UoKTsKLQkvLyB9Ci0JLy8gdGVhbVJvbGVXcmFwcGVycy5jbGVhcigpOwotCS8vCQkKLQkvLyBzdXBlci5kaXNwb3NlKCk7Ci0JLy8gfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUZWFtUHJvZmlsZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQlpbnQgZXZlbnRUeXBlID0gbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpOwotCQkJaWYgKGV2ZW50VHlwZSA9PSBOb3RpZmljYXRpb24uQURECi0JCQkJCXx8IGV2ZW50VHlwZSA9PSBOb3RpZmljYXRpb24uQUREX01BTlkpIHsKLQkJCQlMaXN0IHN1YlRlYW1zID0gUHJvY2Vzc1V0aWwuZ2V0QWZmZWN0ZWRFbGVtZW50cyhub3RpZmljYXRpb24sCi0JCQkJCQludWxsKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdWJUZWFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJVGVhbVByb2ZpbGUgc3ViVGVhbSA9IChUZWFtUHJvZmlsZSkgaXRlci5uZXh0KCk7Ci0JCQkJCVByb2Nlc3NVdGlsLmFkZFRvQ29udGFpbmVyKHN1YlRlYW0sIHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1RFQU1fUk9MRVM6Ci0JCQlMaXN0IGVsZW1lbnRzID0gUHJvY2Vzc1V0aWwuZ2V0QWZmZWN0ZWRFbGVtZW50cyhub3RpZmljYXRpb24sIG51bGwpOwotCQkJZXZlbnRUeXBlID0gbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpOwotCQkJYm9vbGVhbiByZWZyZXNoVGVhbSA9IGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChldmVudFR5cGUgPT0gTm90aWZpY2F0aW9uLkFERAotCQkJCQkJfHwgZXZlbnRUeXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSkgewotCQkJCQlQcm9jZXNzVXRpbC5hZGRUb0NvbnRhaW5lcihlLCB0aGlzLCBmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChlLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJcmVmcmVzaFRlYW0gPSB0cnVlOwkJCQkJCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgZSwKLQkJCQkJCWZhbHNlLCB0cnVlKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocmVmcmVzaFRlYW0pIHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJfQotCi0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSAoVGVhbVByb2ZpbGUpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIHRlYW1Qcm9maWxlLAotCQkJCQlmYWxzZSwgdHJ1ZSkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGVhbVByb2ZpbGUuZ2V0VGVhbVJvbGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCXJvbGVEZXNjcmlwdG9yLCBmYWxzZSwgdHJ1ZSkpOwotCQkJfQotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBSRVNTRUQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldE9CU0VjbGFzc2VzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGZsb2F0LCBpbnQsIGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJT2JqZWN0IG93bmVyLCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBPQlNEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsCi0JCQkJb3BlcmF0aW9uLCBjb2xsZWN0aW9uKQotCQkvLyB7Ci0JCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJLy8gQ29sbGVjdGlvbiB3cmFwcGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCkuaXRlcmF0b3IoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIFJvbGVEZXNjcmlwdG9yIGRlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkvLyB3cmFwcGVycy5hZGQoVG5nVXRpbC5nZXRXcmFwcGVyKHRlYW1Sb2xlV3JhcHBlcnMsIGRlc2MuZ2V0Um9sZSgpKSk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIHdyYXBwZXJzOwotCQkvLyB9Ci0JCS8vIH0KLQkJOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBkZXNjcmlwdG9yRXhpc3RzKE9iamVjdCByb2xlKSB7Ci0JCVRlYW1Qcm9maWxlIHRlYW1Qcm9maWxlID0gKFRlYW1Qcm9maWxlKSBnZXRUYXJnZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGVhbVByb2ZpbGUuZ2V0VGVhbVJvbGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSb2xlRGVzY3JpcHRvciBkZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCWlmIChkZXNjLmdldFJvbGUoKSA9PSByb2xlKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyIGNyZWF0ZURyb3BBZGFwdGVyKCkgewotCQlpZiAoZHJvcEFkYXB0ZXIgPT0gbnVsbCkgewotCQkJZHJvcEFkYXB0ZXIgPSBuZXcgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyKCkgewotCi0JCQkJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3QgZHJvcEVsZW1lbnQpIHsKLQkJCQkJaWYgKGRyb3BFbGVtZW50IGluc3RhbmNlb2YgUm9sZQotCQkJCQkJCSYmICFkZXNjcmlwdG9yRXhpc3RzKGRyb3BFbGVtZW50KQotCQkJCQkvLyAmJiBUbmdVdGlsLmdldFdyYXBwZXIodGVhbVJvbGVXcmFwcGVycywgZHJvcEVsZW1lbnQpID09Ci0JCQkJCS8vIG51bGwKLQkJCQkJKSB7Ci0JCQkJCQlyZXR1cm4gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKChSb2xlKSBkcm9wRWxlbWVudCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0JCXJldHVybiBkcm9wQWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TKSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKCgoVGVhbVByb2ZpbGUpIG9iamVjdCkKLQkJCQkJLmdldFN1cGVyVGVhbSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVVcChPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZVVwKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSkgewotCQkJVGVhbVByb2ZpbGUgdGVhbSA9ICgoVGVhbVByb2ZpbGUpIHBhcmVudCk7Ci0JCQlMaXN0IGxpc3QgPSB0ZWFtLmdldFN1YlRlYW0oKTsKLQkJCWludCBsb2NhdGlvbiA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAob2JqLmVxdWFscyhsaXN0LmdldChpKSkpIHsKLQkJCQkJbG9jYXRpb24gPSBpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCSgoRUxpc3QpIHRlYW0uZ2V0U3ViVGVhbSgpKS5tb3ZlKGxvY2F0aW9uLCBsb2NhdGlvbiAtIDEpOwotCi0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IHRoaXMuZ2V0QWN0aXZpdHkob2JqKTsKLQkJCVRuZ1V0aWwubW92ZVVwKGFjdGl2aXR5LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRG93bihPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZURvd24oKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpKSB7Ci0JCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBwYXJlbnQ7Ci0JCQlMaXN0IGxpc3QgPSB0ZWFtLmdldFN1YlRlYW0oKTsKLQkJCWludCBsb2NhdGlvbiA9IDA7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCWlmIChvYmouZXF1YWxzKGxpc3QuZ2V0KGkpKSkgewotCQkJCQlsb2NhdGlvbiA9IGk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJKChFTGlzdCkgdGVhbS5nZXRTdWJUZWFtKCkpLm1vdmUobG9jYXRpb24sIGxvY2F0aW9uICsgMSk7Ci0KLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gdGhpcy5nZXRBY3Rpdml0eShvYmopOwotCQkJVG5nVXRpbC5tb3ZlRG93bihhY3Rpdml0eSwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KE9iamVjdCBvYmplY3QpIHsKLQkJZm9yIChPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7IHBhcmVudCAhPSBudWxsOykgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCXJldHVybiAoQWN0aXZpdHkpIHBhcmVudDsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nVXRpbAotCQkJCQkuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQkJcGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1RlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZDdiN2JkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1RlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIoVGVhbVByb2ZpbGUgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlcihUZWFtUHJvZmlsZSB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TKSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKCgoVGVhbVByb2ZpbGUpIFRuZ1V0aWwKLQkJCQkJLnVud3JhcChvYmplY3QpKS5nZXRTdXBlclRlYW0oKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNGRjYTg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuV0JTRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLldCU0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUGhhc2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUl0ZXJhdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQWN0aXZpdHkoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVNaWxlc3RvbmUoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCWNoaWxkID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQlpZihjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IGNoaWxkIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IKLQkJCQl8fCBjaGlsZCBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdEFzQ2hpbGQoY2hpbGQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRPYmplY3Qob3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0KERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0VGFzaygpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRU5URVI6Ci0JCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwKLQkJLy8gb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pIik7Ci0JCUNvbW1hbmQgY21kID0gbmV3IFdCU0RyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwKLQkJCQlvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGNhbiBleGVjdXRlOiAiICsgY21kLmNhbkV4ZWN1dGUoKSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIG93bmVyOiAiICsgb3duZXIpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBjb2xsZWN0aW9uOiAiICsgY29sbGVjdGlvbik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGxvY2F0aW9uOiAiICsgbG9jYXRpb24pOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBvcGVyYXRpb25zOiAiICsgb3BlcmF0aW9ucyk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIG9wZXJhdGlvbjogIiArIG9wZXJhdGlvbik7Ci0JCS8vICAgICAgICAKLQkJLy8gU3lzdGVtLm91dAotCQkvLyAucHJpbnRsbigiRVhJVDoKLQkJLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLAotCQkvLyBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbikiKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcm9wQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsCi0JCQlMaXN0IGRyb3BFbGVtZW50cykgewotCQlyZXR1cm4gbmV3IFdCU0Ryb3BDb21tYW5kKChBY3Rpdml0eSkgb3duZXIsIGRyb3BFbGVtZW50cyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNSb2xsZWRVcENoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNSb2xsZWRVcENoaWxkKE9iamVjdCBjaGlsZCkgewotCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQlpZihvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdEFzUm9sbGVkVXBDaGlsZChvYmopOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JLy8gaW50KQotCS8vICovCi0JLy8gcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkvLyBCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudClvYmplY3Q7Ci0JLy8gU3RyaW5nIHByb3BlcnR5ID0gKFN0cmluZykgY29sdW1uSW5kZXhUb05hbWVNYXAuZ2V0KG5ldwotCS8vIEludGVnZXIoY29sdW1uSW5kZXgpKTsKLQkvLyBCb29sZWFuIGIgPSBudWxsOwotCS8vIGlmKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOKSB7Ci0JLy8gYiA9IGUuZ2V0SXNFdmVudERyaXZlbigpOwotCS8vIH0KLQkvLyBlbHNlIGlmKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORykgewotCS8vIGIgPSBlLmdldElzT25nb2luZygpOwotCS8vIH0KLQkvLyBlbHNlIGlmKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSkgewotCS8vIGIgPSBlLmdldElzUmVwZWF0YWJsZSgpOwotCS8vIH0KLQkvLyBpZihiICE9IG51bGwpIHsKLQkvLyBpZihiLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JLy8gcmV0dXJuIFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImNoZWNrZWRfYm94Iik7Ci0JLy8gfQotCS8vIGVsc2UgewotCS8vIHJldHVybiBUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJ1bmNoZWNrZWRfYm94Iik7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gc3VwZXIuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JLy8gfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRXQlNFY2xhc3NlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI3JlZnJlc2hDaGlsZHJlbkRhdGEob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVmcmVzaENoaWxkcmVuRGF0YShOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJTGlzdCBhZmZlY3RlZENoaWxkcmVuKSB7Ci0JCS8vIHJlY2FsY3VsYXRlIHRoZSBJRHMgb2YgYnJlYWtkb3duIGVsZW1lbnRzIGFuZCByZWZyZXNoIHRoZW0KLQkJLy8KLQkJUHJvY2VzcyB0b3BBY3QgPSAoUHJvY2VzcykgZ2V0VG9wSXRlbSgpOwotCQlBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQotCQlQcm9jZXNzVXRpbC51cGRhdGVJRHMocm9vdEFkYXB0ZXJGYWN0b3J5LCB0b3BBY3QpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2RvUmVmcmVzaEFmZmVjdGVkVmlld2VycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9SZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCkgewotCQlPYmplY3QgcHJvYyA9IGdldFRvcEl0ZW0oKTsKLQkJT2JqZWN0IGl0ZW1Qcm92aWRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHByb2MsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCSgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVyKQotCQkJCQkuc2V0UmVmcmVzaEFsbElEc1JlcXVpcmVkKHRydWUpOwotCQl9Ci0KLQkJUHJvY2Vzc1V0aWwKLQkJCQkucmVmcmVzaElEc0luVmlld2VycygoRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihjaGlsZHJlbik7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKFRuZ1V0aWwudW53cmFwKG9iamVjdCkgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzV3JhcHBpbmdSb2xsdXBOZWVkZWQob2JqZWN0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJvbGx1cFdyYXBwZXIoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlPYmplY3Qgd3JhcHBlciA9IHN1cGVyLmNyZWF0ZVJvbGx1cFdyYXBwZXIob2JqZWN0LCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQlyZXR1cm4gbmV3IFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcih3cmFwcGVyLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVDb21wb3NlZFdyYXBwZXIoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIob2JqZWN0LCBvd25lciwgYWRhcHRlckZhY3RvcnkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2FuTWVyZ2UoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSUQgfHwgcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMKLQkJCQkJfHwgcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPOwotCQkJfQotCQl9OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjUyMzMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQotCXB1YmxpYyBXQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpKSB7Ci0JCQlzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChQcm9jZXNzVXRpbAotCQkJCQkudG9Db2x1bW5JbmRleFRvTmFtZU1hcCgoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5ZjA5YWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIHsKLQotCS8vIHByaXZhdGUgQ29sbGVjdGlvbiBlQ2xhc3NlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdCU01pbGVzdG9uZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyByZXR1cm4gVG5nVXRpbC5nZXRBbGxDaGlsZHJlbigoUHJvY2Vzc0NvbnRyaWJ1dGlvbikgb2JqZWN0LAotCS8vIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCksCi0JLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpKTsKLQkvLyB9Ci0JLy8gICAgCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkvLyBDb2xsZWN0aW9uIGVsZW1lbnRzID0gc3VwZXIuZ2V0RWxlbWVudHMob2JqZWN0KTsKLQkvLyByZXR1cm4gZWxlbWVudHM7Ci0JLy8gfQotCi0JLy8gcHVibGljIExpc3QgZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhPYmplY3QgYWN0aXZpdHksIE9iamVjdCBvYmopCi0JLy8gewotCS8vIExpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gTGlzdCBicmVha2Rvd25FbGVtZW50cyA9ICgoQWN0aXZpdHkpYWN0aXZpdHkpLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdCA9IGJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JLy8gewotCS8vIE9iamVjdCBlbGVtZW50T2JqID0gaXQubmV4dCgpOwotCS8vIGlmICgoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB8fCAoZWxlbWVudE9iaiBpbnN0YW5jZW9mCi0JLy8gTWlsZXN0b25lKSB8fCAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkvLyB7Ci0JLy8gZWxlbWVudHMuYWRkKGVsZW1lbnRPYmopOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGVsZW1lbnRzOwotCS8vIH0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0V0JTRWNsYXNzZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzJmNTdkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdCU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0KLQlwdWJsaWMgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmRlbGVnYXRlSXRlbVByb3ZpZGVyID0gZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkJCQkJLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrT3JkZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtPcmRlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDM5Mjc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtPcmRlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtPcmRlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuV29ya09yZGVySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcikKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkvLyBFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JLy8gcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjVhYjc4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyCi1pbXBsZW1lbnRzIElDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlcgotewotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNhY2hlZENoaWxkcmVuOwotCQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KE9iamVjdCBvYmplY3QpIHsKLQkJZm9yIChPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7IHBhcmVudCAhPSBudWxsOykgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCXJldHVybiAoQWN0aXZpdHkpIHBhcmVudDsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJCXBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0RGVzY3JpcHRvcihBY3Rpdml0eSBhY3Rpdml0eSwgQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLQkJaWYgKGFjdGl2aXR5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBsaXN0ID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBsaXN0LmdldChpKTsKLQkJCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQkmJiAoYXJ0aWZhY3QgPT0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikKLQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKSkpIHsKLQkJCQlyZXR1cm4gb2JqOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQkvLyBpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKQotCQkvLyB7Ci0JCS8vIGNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCkpOwotCQkvLyB9Ci0JCS8vIHJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCi0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbikgewotLy8JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuKTsKLS8vCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCWNhY2hlZENoaWxkcmVuLmNsZWFyKCk7Ci0vLwkJCWNhY2hlZENoaWxkcmVuLmFkZEFsbChjaGlsZHJlbik7Ci0vLwkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250YWluZWRBcnRpZmFjdERlc2NyaXB0b3JzKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KHdwRGVzYyk7Ci0JCWlmKGFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSB3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCUxpc3QgbGlzdCA9IGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKGFjdGl2aXR5LCAoQXJ0aWZhY3QpIGxpc3QKLQkJCQkJCS5nZXQoaSkpOwotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGRlc2NyaXB0b3IpOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqZWN0OwotCQkKLQkJLy8gZG9uJ3Qgc2hvdyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vbi1kZWxpdmVyYWJsZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotCQkvLyB0aGF0IGlzIGRlbGl2ZXJhYmxlIHBhcnQgb2YgYSBkZWxpdmVyYWJsZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotCQkvLwotCQlpZighKHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpKSB7Ci0JCQlPYmplY3QgcGFyZW50ID0gVG5nVXRpbC51bndyYXAoZ2V0UGFyZW50KG9iamVjdCkpOwotCQkJaWYocGFyZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JCQkJCSYmICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKXBhcmVudCkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7CQkJCQotCQkJCXVwZGF0ZUNhY2hlZENoaWxkcmVuKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJfQotCQl9Ci0JCQotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQkvLyBhZGQgZGVsaXZlcmFibGUgcGFydHMKLQkJLy8KLQkJaWYoIXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChkZXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGdldCBkZXNjcmlwdG9ycyBvZiBjb250YWluZWQgYXJ0aWZhY3RzCi0JCS8vCQkKLQkJaWYgKHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWFkZENvbnRhaW5lZEFydGlmYWN0RGVzY3JpcHRvcnMod3BEZXNjLCBjaGlsZHJlbik7Ci0JCX0KLQotCQkvLyBzZXQgcGFyZW50Ci0JCS8vCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFGYWN0b3J5LmFkYXB0KGl0ZXIKLQkJCQkJLm5leHQoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWFkYXB0ZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJCi0JCXVwZGF0ZUNhY2hlZENoaWxkcmVuKGNoaWxkcmVuKTsKLQkJCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBjaGlsZHJlbiBmcm9tIGNhY2hlLCBmaWxsIHRoZSBjaGlsZHJlbiBjYWNoZSBpZiBpdCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Ci0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlnZXRDaGlsZHJlbih0YXJnZXQpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIjZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLQkJCWNhY2hlZENoaWxkcmVuID0gbnVsbDsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzKSkgewotLy8JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUX1RPOgotLy8JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE86Ci0vLwkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTzoKLS8vCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09VVFBVVF9GUk9NOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJTGlzdCBlbGVtZW50cyA9IFByb2Nlc3NVdGlsLmdldEFmZmVjdGVkRWxlbWVudHMobm90aWZpY2F0aW9uLCBudWxsKTsKLQkJCWludCBldmVudFR5cGUgPSBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCk7Ci0JCQlib29sZWFuIHJlZnJlc2ggPSBmYWxzZTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZXZlbnRUeXBlID09IE5vdGlmaWNhdGlvbi5BREQKLQkJCQkJCXx8IGV2ZW50VHlwZSA9PSBOb3RpZmljYXRpb24uQUREX01BTlkpIHsKLQkJCQkJUHJvY2Vzc1V0aWwuYWRkVG9Db250YWluZXIoZSwgdGhpcywgZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoZS5nZXRTdXBlckFjdGl2aXRpZXMoKSAhPSBudWxsKSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBlLAotCQkJCQkJCWZhbHNlLCB0cnVlKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocmVmcmVzaCkgewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQl9Ci0KLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKTsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCB3cGQsIGZhbHNlLAotCQkJCQl0cnVlKSk7Ci0JCQlpZiAod3BkLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwZC5nZXREZWxpdmVyYWJsZVBhcnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGRlc2NyaXB0b3IgPSBpdGVyLm5leHQoKTsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQkJZGVzY3JpcHRvciwgZmFsc2UsIHRydWUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDoKLQkJCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJV29ya1Byb2R1Y3Qgd3A7Ci0JCQlib29sZWFuIGNvbnRlbnRSZWZyZXNoID0gbm90aWZpZXIgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkJCQkmJiAoKHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3Ipbm90aWZpZXIpLmdldFdvcmtQcm9kdWN0KCkpIGluc3RhbmNlb2YgQXJ0aWZhY3QKLQkJCQkJCXx8IHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpOwotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgY29udGVudFJlZnJlc2gsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3AsIFN0cmluZyB0eHQpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdDsKLQotCQlpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFKSB7Ci0JCQl3cGQuc2V0QWN0aXZpdHlFbnRyeVN0YXRlKHR4dCk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUpIHsKLQkJCXdwZC5zZXRBY3Rpdml0eUV4aXRTdGF0ZSh0eHQpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcCwgdHh0KTsKLQkJfQotCX0KLQotCS8vIHByaXZhdGUgYm9vbGVhbiBpc1RvcExldmVsQXJ0aWZhY3RJbkFjdGl2aXR5KEFjdGl2aXR5IGFjdGl2aXR5LCBPYmplY3QKLQkvLyBvYmopCi0JLy8gewotCS8vIEFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCS8vICAgICAgICAKLQkvLyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikKLQkvLyBhRmFjdG9yeS5hZGFwdChhY3Rpdml0eSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkvLyBDb2xsZWN0aW9uIGNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbihhY3Rpdml0eSk7Ci0JLy8gaWYgKGNoaWxkcmVuLmNvbnRhaW5zKG9iaikpCi0JLy8gewotCS8vIC8vU3lzdGVtLm91dC5wcmludGxuKCJjaGlsZCAtICIgKyBvYmopOwotCS8vIHJldHVybiB0cnVlOwotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRQQlNFY2xhc3NlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVVcChPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZVVwKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikpIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHBhcmVudCkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIHdwOwotCQkJCUxpc3QgbGlzdCA9IGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQkJCVdvcmtQcm9kdWN0IG9ialdQID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCi0JCQkJaW50IGxvY2F0aW9uID0gMDsKLQkJCQkvLyBMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCWlmIChvYmpXUC5lcXVhbHMobGlzdC5nZXQoaSkpKSB7Ci0JCQkJCQlsb2NhdGlvbiA9IGk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJCSgoRUxpc3QpIGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpKS5tb3ZlKGxvY2F0aW9uLAotCQkJCQkJbG9jYXRpb24gLSAxKTsKLQkJCX0KLQotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSB0aGlzLmdldEFjdGl2aXR5KG9iaik7Ci0JCQlUbmdVdGlsLm1vdmVVcChhY3Rpdml0eSwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZURvd24oT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChvYmopOwotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlUbmdVdGlsLm1vdmVEb3duKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikpIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHBhcmVudCkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIHdwOwotCQkJCUxpc3QgbGlzdCA9IGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQkJCVdvcmtQcm9kdWN0IG9ialdQID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCi0JCQkJaW50IGxvY2F0aW9uID0gMDsKLQkJCQkvLyBMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCWlmIChvYmpXUC5lcXVhbHMobGlzdC5nZXQoaSkpKSB7Ci0JCQkJCQlsb2NhdGlvbiA9IGk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJCSgoRUxpc3QpIGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpKS5tb3ZlKGxvY2F0aW9uLAotCQkJCQkJbG9jYXRpb24gKyAxKTsKLQkJCX0KLQotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSB0aGlzLmdldEFjdGl2aXR5KG9iaik7Ci0JCQlUbmdVdGlsLm1vdmVEb3duKGFjdGl2aXR5LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXIpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2ZhY3RvclJlbW92ZUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBmYWN0b3JSZW1vdmVDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBDb21tYW5kUGFyYW1ldGVyIGNvbW1hbmRQYXJhbWV0ZXIpIHsKLQkJaWYoIShjb21tYW5kUGFyYW1ldGVyLmdldE93bmVyKCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IGdldEFjdGl2aXR5KHRhcmdldCk7Ci0JCQlpZihhY3QgIT0gbnVsbCkgewotCQkJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGFjdCwgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkJCWNvbW1hbmRQYXJhbWV0ZXIuc2V0T3duZXIoYWN0KTsKLQkJCQlyZXR1cm4gYWRhcHRlci5jcmVhdGVDb21tYW5kKGFjdCwgZG9tYWluLCBSZW1vdmVDb21tYW5kLmNsYXNzLCBjb21tYW5kUGFyYW1ldGVyKTsJCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmZhY3RvclJlbW92ZUNvbW1hbmQoZG9tYWluLCBjb21tYW5kUGFyYW1ldGVyKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCS8vIEVQRiBidWcjOiAxNDQ4MjAgU29tZSBuZXN0ZWQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIHNob3cgd3JvbmcgbW9kZWwgaW5mbyBpbiB3b3JrIHByb2R1Y3QgdXNhZ2UgdmlldwotCQkvLyBmb3IgZGVmZWN0LCBvdmVycmlkZSB0aGUgbWV0aG9kLCBwcmV2aW91c2x5IERlc2NyaXB0b3JJdGVtUHJvdmlkZS5nZXRBdHRyaWJ1dGUgdXNlIHRvIGhhdmUgdGhpcyBjb2RlLCBtb3ZlZCB0byBoZXJlLiAKLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTykgewotCQkJU3RyaW5nQnVmZmVyIG1vZGVsSW5mbyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0vLwkJCQkJUHJvY2Vzc1V0aWwuZ2V0TW9kZWxJbmZvRm9yV29ya1Byb2R1Y3REZXNjcmlwdG9yKG1vZGVsSW5mbywKLS8vCQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdCk7Ci0JCQkJCVByb2Nlc3NVdGlsLmdldFdQRE1vZGVsSW5mbyhtb2RlbEluZm8sIG9iamVjdCwgdGhpcyk7Ci0JCQkJfQotLy8JCQl9Ci0JCQlyZXR1cm4gbW9kZWxJbmZvLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MTEwM2RkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQkKLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHZhbHVlLCBPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5QWRkQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eUFkZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWNjMDYyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5QWRkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotCi0vKioKLSAqIEFkZENvbW1hbmQgZm9yIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gU2VwIDE2LCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKiBAc2VlIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlBZGRDb21tYW5kIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnRBZGRDb21tYW5kIHsKLQlwcml2YXRlIExpc3QgcHJvY1BhY2thZ2VzOwotCi0JLyoqCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlBZGRDb21tYW5kKENvbW1hbmQgY29tbWFuZCkgewotCQlzdXBlcihjb21tYW5kKTsKLQl9Ci0KLQlwcml2YXRlIE1hcCBnZXRDb3B5VG9PcmlnaW5hbE1hcCgpIHsKLQkJRWRpdGluZ0RvbWFpbiBlZCA9IGFkZENvbW1hbmQuZ2V0RG9tYWluKCk7Ci0JCWlmIChlZCBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJcmV0dXJuICgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBlZCkKLQkJCQkJLmdldENvcHlUb09yaWdpbmFsTWFwKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvcHlQcm9jZXNzUGFja2FnZXMoKSB7Ci0JCWlmIChwcm9jUGFja2FnZXMgPT0gbnVsbCkgewotCQkJTWFwIGNvcHlUb09yaWdpbmFsTWFwID0gZ2V0Q29weVRvT3JpZ2luYWxNYXAoKTsKLQkJCWlmIChjb3B5VG9PcmlnaW5hbE1hcCAhPSBudWxsKSB7Ci0JCQkJYm9vbGVhbiBzaG93V2FybmluZyA9IGZhbHNlOwotCQkJCXByb2NQYWNrYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCS8vIGNoZWNrIGZpcnN0IGVsZW1lbnQgb2YgYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkKLQkJCQkvLyBpZiBpdCdzIGEga2V5IGluIHRoZSBDb3B5VG9PcmlnaW5hbE1hcCwgd2UgYXJlIHBhc3RpbmcgYW5kCi0JCQkJLy8gbWF5IG5lZWQgdG8gd2FybiB0aGUgdXNlcgotCQkJCS8vIGlmIGl0J3Mgbm90IGEga2V5IGluIHRoZSBDb3B5VG9PcmlnaW5hbE1hcCwgdGhlbiB3ZSBhcmUKLQkJCQkvLyBwcm9iYWJseSBhZGRpbmcgYSBuZXcgZWxlbWVudAotCQkJCWlmIChhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKSAhPSBudWxsCi0JCQkJCQkmJiBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5zaXplKCkgPiAwCi0JCQkJCQkmJiBjb3B5VG9PcmlnaW5hbE1hcC5jb250YWluc0tleShhZGRDb21tYW5kCi0JCQkJCQkJCS5nZXRDb2xsZWN0aW9uKCkudG9BcnJheSgpWzBdKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJQWN0aXZpdHkgb3JpZyA9IChBY3Rpdml0eSkgY29weVRvT3JpZ2luYWxNYXAKLQkJCQkJCQkJCS5nZXQoZWxlbWVudCk7Ci0JCQkJCQkJaWYgKG9yaWcgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAob3JpZy5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCQkJCQkJcHJvY1BhY2thZ2VzLmFkZChvcmlnLmVDb250YWluZXIoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzaG93V2FybmluZyA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHNob3dXYXJuaW5nKSB7Ci0JCQkJCU1lc3Nlbmdlci5JTlNUQU5DRQotCQkJCQkJCS5zaG93V2FybmluZygKLQkJCQkJCQkJCWdldExhYmVsKCksCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5BY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnKTsKLQkJCQl9Ci0KLQkJCQlpZiAoIXByb2NQYWNrYWdlcy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gY29weSB0aGUgUHJvY2Vzc1BhY2thZ2Ugb2YgdGhlIG9yaWdpbmFsIEFjdGl2aXR5IHRvIGFkZAotCQkJCQkvLyBpdCB0byB0aGUgUHJvY2Vzc1BhY2thZ2UKLQkJCQkJLy8gb2YgdGhlIHRhcmdldCBBY3Rpdml0eS4KLQkJCQkJLy8KLQkJCQkJLy8gQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBuZXcKLQkJCQkJLy8gQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJLy8gLCBuZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCQkJCUNvbW1hbmQgY29tbWFuZCA9IENvcHlDb21tYW5kLmNyZWF0ZSgKLQkJCQkJCQlhZGRDb21tYW5kLmdldERvbWFpbigpLCBwcm9jUGFja2FnZXMpOwotCQkJCQl0cnkgewotCQkJCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0KLQkJCQkJCS8vIFJlZnJlc2ggdGhlIEFkZENvbW1hbmQuY29sbGVjdGlvbiB3aXRoIG5ldyBjb3BpZXMuCi0JCQkJCQkvLwotCQkJCQkJQ29sbGVjdGlvbiBhY3Rpdml0aWVzID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCk7Ci0JCQkJCQlhY3Rpdml0aWVzLmNsZWFyKCk7Ci0KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmQuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCVByb2Nlc3NQYWNrYWdlIGNvcHkgPSAoUHJvY2Vzc1BhY2thZ2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChjb3B5IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJCQlBY3Rpdml0eSBhY3RDb3B5ID0gKChQcm9jZXNzQ29tcG9uZW50KSBjb3B5KQotCQkJCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQkJCS8vIGNvcHkgZGF0YSBmcm9tIFByb2Nlc3NDb21wb25lbnQgdG8gYSBuZXcKLQkJCQkJCQkJLy8gUHJvY2Vzc1BhY2thZ2UKLQkJCQkJCQkJUHJvY2Vzc1BhY2thZ2UgcGtnQ29weSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQkJCQkJCXBrZ0NvcHkuc2V0TmFtZShhY3RDb3B5LmdldE5hbWUoKSk7Ci0JCQkJCQkJCXBrZ0NvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKGFjdENvcHkpOwotCQkJCQkJCQlwa2dDb3B5LmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCgKLQkJCQkJCQkJCQljb3B5LmdldFByb2Nlc3NFbGVtZW50cygpKTsKLQkJCQkJCQkJcGtnQ29weS5nZXREaWFncmFtcygpCi0JCQkJCQkJCQkJLmFkZEFsbChjb3B5LmdldERpYWdyYW1zKCkpOwotCQkJCQkJCQlwa2dDb3B5LmdldENoaWxkUGFja2FnZXMoKS5hZGRBbGwoCi0JCQkJCQkJCQkJY29weS5nZXRDaGlsZFBhY2thZ2VzKCkpOwotCi0JCQkJCQkJCWFjdGl2aXRpZXMuYWRkKGFjdENvcHkpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWZpbmRfYWN0aXZpdHk6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb3B5Ci0JCQkJCQkJCQkJLmdldFByb2Nlc3NFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQkJCWFjdGl2aXRpZXMuYWRkKChBY3Rpdml0eSkgZWxlbWVudCk7Ci0JCQkJCQkJCQkJYnJlYWsgZmluZF9hY3Rpdml0eTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWlmIChjb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQljb21tYW5kLmRpc3Bvc2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlwcmVwYXJlQWRkTGlzdCgpOwotCQljb3B5UHJvY2Vzc1BhY2thZ2VzKCk7Ci0JCXN1cGVyLmV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgZSBpcyBhIGNoaWxkLCBkaXJlY3Qgb3Igb2YgYWN0Ci0JICogCi0JICogQHBhcmFtIGFjdAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaGlsZE9mKE9iamVjdCBwYXJlbnQsIE9iamVjdCBlKSB7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGUgPT0gY2hpbGQpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWlmIChpc0NoaWxkT2YoY2hpbGQsIGUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBlbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkvLyBXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKXBhcmVudCkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJLy8gaWYod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkvLyBpZihlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCS8vIGlmKFVtYVV0aWwuaXNDb250YWluZWRCeSgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcillKS5nZXRXb3JrUHJvZHVjdCgpLAotCQkvLyB3cCkpIHsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaGlsZE9mKENvbGxlY3Rpb24gZWxlbWVudHMsIE9iamVjdCBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKGlzQ2hpbGRPZihpdGVyLm5leHQoKSwgZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVBZGRMaXN0KCkgewotCQkvLyBjbGVhbnVwIGVsZW1lbnQgbGlzdCBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBhY3Rpdml0eSB0byBhdm9pZCBhZGRpbmcKLQkJLy8gZWxlbWVudHMgbXVsdGlwbGUgdGltZXMKLQkJLy8KLQkJTWFwIGNvcHlUb09yaWdpbmFsTWFwID0gZ2V0Q29weVRvT3JpZ2luYWxNYXAoKTsKLQkJaWYgKGNvcHlUb09yaWdpbmFsTWFwICE9IG51bGwpIHsKLQkJCUFycmF5TGlzdCBvcmlnaW5hbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlNYXAgb3JpZ2luYWxUb0NvcHlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IG9yaWdpbmFsID0gY29weVRvT3JpZ2luYWxNYXAuZ2V0KGVsZW1lbnQpOwotCQkJCWlmIChvcmlnaW5hbCAhPSBudWxsKSB7Ci0JCQkJCW9yaWdpbmFscy5hZGQob3JpZ2luYWwpOwotCQkJCQlvcmlnaW5hbFRvQ29weU1hcC5wdXQob3JpZ2luYWwsIGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQotCQkJQXJyYXlMaXN0IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLyBBcnJheUxpc3QgYWRkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9yaWdpbmFscy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChpc0NoaWxkT2Yob3JpZ2luYWxzLCBlbGVtZW50KSkgewotCQkJCQlyZW1vdmVMaXN0LmFkZChvcmlnaW5hbFRvQ29weU1hcC5nZXQoZWxlbWVudCkpOwotCQkJCX0KLQkJCX0KLQkJCWFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLnJlbW92ZUFsbChyZW1vdmVMaXN0KTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQyOWU4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5RGVlcENvcHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZS5MaXRlcmFsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuSW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnN0cmFpbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklUZXh0UmVmZXJlbmNlUmVwbGFjZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBQaHlzaWNhbGx5IGNvcGllcyBhbiBhY3Rpdml0eSB3aXRoIGFsbCBvZiBpdHMgZGlyZWN0IG9yIGluaGVyaXRlZCBzdHJ1Y3R1cmFsIGZlYXR1cmVzIGFuZCByZWZlcmVuY2VzLgotICogICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSnVuIDIxLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgZXh0ZW5kcyBDb3B5Q29tbWFuZCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzID0gewotCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBkaWFncmFtVHlwZXMgPSB7Ci0JCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSwKLQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0sCi0JCUlEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNCi0JfTsKLQkKLQlwcml2YXRlIGNsYXNzIEVkaXRpbmdEb21haW4gZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gewotCi0JCS8qKgotCQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkJICogQHBhcmFtIGNvbW1hbmRTdGFjawotCQkgKi8KLQkJcHVibGljIEVkaXRpbmdEb21haW4oKSB7Ci0JCQlzdXBlcihUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBuZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7IAotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiNjcmVhdGVDb21tYW5kKGphdmEubGFuZy5DbGFzcywgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyKQotCQkgKi8KLQkJcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDbGFzcyBjb21tYW5kQ2xhc3MsIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCQkJaWYoY29tbWFuZENsYXNzID09IENyZWF0ZUNvcHlDb21tYW5kLmNsYXNzKSB7Ci0JCQkJcmV0dXJuIG5ldyBDcmVhdGVEZWVwQ29weUNvbW1hbmQodGhpcywgY29tbWFuZFBhcmFtZXRlci5nZXRFT3duZXIoKSwgKEhlbHBlcikgY29tbWFuZFBhcmFtZXRlci5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJCWlmKGNvbW1hbmRDbGFzcyA9PSBJbml0aWFsaXplQ29weUNvbW1hbmQuY2xhc3MpIHsKLQkJCQlyZXR1cm4gbmV3IEluaXRpYWxpemVEZWVwQ29weUNvbW1hbmQodGhpcywgY29tbWFuZFBhcmFtZXRlci5nZXRFT3duZXIoKSwgKEhlbHBlcikgY29tbWFuZFBhcmFtZXRlci5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKGNvbW1hbmRDbGFzcywgY29tbWFuZFBhcmFtZXRlcik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlRGVlcENvcHlDb21tYW5kIGV4dGVuZHMgQ3JlYXRlQ29weUNvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gZG9tYWluCi0JCSAqIEBwYXJhbSBvd25lcgotCQkgKiBAcGFyYW0gY29weUhlbHBlcgotCQkgKi8KLQkJcHVibGljIENyZWF0ZURlZXBDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJCXN1cGVyKGRvbWFpbiwgb3duZXIsIGNvcHlIZWxwZXIpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDb3B5Q29tbWFuZCNkb0dldENoaWxkcmVuVG9Db3B5KCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGRvR2V0Q2hpbGRyZW5Ub0NvcHkoKSB7Ci0JCQkvLyBDcmVhdGUgY29tbWFuZHMgdG8gY3JlYXRlIGNvcGllcyBvZiB0aGUgY2hpbGRyZW4uCi0JCQkvLwotCQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBvd25lci5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQkJewotCQkJCU9iamVjdCBvID0gaS5uZXh0KCk7Ci0JCQkJaWYobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCS8vIG1ha2Ugc3VyZSB0aGF0IEFjdGl2aXR5IHdpbGwgYmUgY29waWVkIGZpcnN0Ci0JCQkJCS8vIHNvIHJlZmVyZW5jZXMgdG8gaXRzIGluaGVyaXRlZCBlbGVtZW50cyBjYW4gYmUgcmVzb2x2ZWQgcHJvcGVybHkKLQkJCQkJLy8KLQkJCQkJcmVzdWx0LmFkZCgwLCBvKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdC5hZGQobyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIEluaXRpYWxpemVEZWVwQ29weUNvbW1hbmQgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kIHsKLQotCQkvKioKLQkJICogQHBhcmFtIGRvbWFpbgotCQkgKiBAcGFyYW0gb3duZXIKLQkJICogQHBhcmFtIGNvcHlIZWxwZXIKLQkJICovCi0JCXB1YmxpYyBJbml0aWFsaXplRGVlcENvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLCBIZWxwZXIgY29weUhlbHBlcikgewotCQkJc3VwZXIoZG9tYWluLCBvd25lciwgY29weUhlbHBlcik7Ci0JCQljb3B5ID0gKEVPYmplY3QpIGNvcHlIZWxwZXIuZ2V0KG93bmVyKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQjY29weVJlZmVyZW5jZXMoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgY29weVJlZmVyZW5jZXMoKSB7Ci0JCQlBY3Rpdml0eSBiYXNlID0gbnVsbDsKLQkJCUFjdGl2aXR5IGJhc2VDb3B5ID0gbnVsbDsKLQkJCUNvbGxlY3Rpb24gY2hpbGRCYXNlQ29waWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWlmKG93bmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgb3duZXI7Ci0JCQkJaWYoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0aXZpdHkpKSB7Ci0JCQkJCS8vIGNvcHkgaW5oZXJpdGVkIGVsZW1lbnRzIGJ5IGRlZXAtY29weWluZyBiYXNlIGFjdGl2aXR5Ci0JCQkJCS8vCi0JCQkJCS8vIGRlZXAgY29weSBvZiBiYXNlIGFjdGl2aXR5IGF0IHRoaXMgcG9pbnQgaXMgZXNzZW50aWFsIHNvIHJlZmVyZW5jZXMgdG8gcHJlZGVjZXNzb3JzCi0JCQkJCS8vIHdpbGwgYmUgY29waWVkIGNvcnJlY3RseQotCQkJCQkvLwotCQkJCQliYXNlID0gKEFjdGl2aXR5KSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCUNvcHlIZWxwZXIgaGVscGVyID0gKENvcHlIZWxwZXIpY29weUhlbHBlcjsKLQkJCQkJQWN0aXZpdHkgb2xkQmFzZUNvcHkgPSAoQWN0aXZpdHkpIGhlbHBlci5nZXQoYmFzZSk7Ci0JCQkJCS8vIHRoaXMgd2lsbCByZWRpcmVjdCBhbnkgcmVmZXJlbmNlIHRvIGNvcHkgb2YgYmFzZSBpbiBkaWFncmFtIHRvIHRoZSBjb3B5IG9mIHRoZSBhY3Rpdml0eQotCQkJCQkvLwotCQkJCQloZWxwZXIucHV0VmFyaWFiaWxpdHlFbGVtZW50KGJhc2UsIGFjdGl2aXR5KTsKLQkJCQkJQXJyYXlMaXN0IGNoaWxkQmFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGU7Ci0JCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2VFbGVtZW50ID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJCWlmKGJhc2VFbGVtZW50ICE9IG51bGwgJiYKLQkJCQkJCQkJCSh2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUwgfHwgdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UX0xJVEVSQUwpKQotCQkJCQkJCXsKLQkJCQkJCQkJaGVscGVyLnB1dFZhcmlhYmlsaXR5RWxlbWVudChiYXNlRWxlbWVudCwgdmUpOwotCQkJCQkJCQljaGlsZEJhc2VzLmFkZChiYXNlRWxlbWVudCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlBY3Rpdml0eURlZXBDb3B5Q29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQoYmFzZSwgaGVscGVyLCBjb25maWcsIHRhcmdldFByb2Nlc3MsIG1vbml0b3IpOwotCQkJCQl0cnkgewotCQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQkJCQotCQkJCQkJYmFzZUNvcHkgPSAoQWN0aXZpdHkpIGhlbHBlci5nZXQoYmFzZSk7Ci0JCQkJCQlpZihhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKSB7Ci0JCQkJCQkJLy8ga2VlcCBhY3Rpdml0eSBvbmx5IGFzIGJhY2t1cCBjb3B5IG9mIGJhc2UKLQkJCQkJCQkvLwotCQkJCQkJCWhlbHBlci5yZW1vdmVWYXJpYWJpbGl0eUVsZW1lbnQoYmFzZSk7Ci0JCQkJCQkJaGVscGVyLnB1dEJhY2t1cENvcHkoYmFzZSwgYWN0aXZpdHkpOwotCQkJCQkJCQotCQkJCQkJCS8vIHB1dCBiYWNrIG9sZEJhc2VDb3B5Ci0JCQkJCQkJaWYob2xkQmFzZUNvcHkgIT0gbnVsbCkgewotCQkJCQkJCQloZWxwZXIuYmFzaWNQdXQoYmFzZSwgb2xkQmFzZUNvcHkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy8gcmVtb3ZlIHRoZSBjb3BpZXMgb2YgYWxsIGJhc2Ugc2luY2UgYmFzZSBjb3BpZXMgYXJlIG5vdCBhZGRlZCB0byB0aGUgcHJvY2VzcwotCQkJCQkJLy8KLQkJCQkJCWhlbHBlci5yZW1vdmUoYmFzZSk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZEJhc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCUVPYmplY3QgY2hpbGRCYXNlQ29weSA9IChFT2JqZWN0KSBoZWxwZXIucmVtb3ZlKGl0ZXIubmV4dCgpKTsKLQkJCQkJCQljaGlsZEJhc2VDb3BpZXMuYWRkKGNoaWxkQmFzZUNvcHkpOwotCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoY2hpbGRCYXNlQ29weS5lQ29udGFpbmVyKCkpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlBY3Rpdml0eSBhY3Rpdml0eUNvcHkgPSAoQWN0aXZpdHkpIGNvcHk7Ci0JCQkJCQkKLQkJCQkJCS8vIHJlbW92ZSB0aGUgY29waWVzIG9mIGJhc2UgZGlhZ3JhbSBpZiB0aGUgYWN0aXZpdHkgYWxyZWFkeSBoYXZlIGRpYWdyYW0gb2YgdGhlIHNhbWUgdHlwZQotCQkJCQkJLy8KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlhZ3JhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaW50IHR5cGUgPSBkaWFncmFtVHlwZXNbaV07Ci0JCQkJCQkJaWYoZGlhZ3JhbU1nci5nZXREaWFncmFtKGFjdGl2aXR5LCB0eXBlKSAhPSBudWxsKSB7Ci0JCQkJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IGRpYWdyYW1NZ3IuZ2V0RGlhZ3JhbShhY3Rpdml0eUNvcHksIHR5cGUpOwotCQkJCQkJCQlpZihkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoZGlhZ3JhbSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIG1vdmUgY29udGVudCBvZiBiYXNlIHBhY2thZ2Ugb3ZlciB0byB0aGUgYWN0aXZpdHkncyBwYWNrYWdlCi0JCQkJCQkvLwotCQkJCQkJbW92ZUNvbnRlbnQoY21kLnBrZ0NvcHksIGFjdGl2aXR5Q29weSk7CQkJCQkJCQotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJY21kLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJc3VwZXIuY29weVJlZmVyZW5jZXMoKTsKLQkJCQotCQkJaWYoYmFzZSAhPSBudWxsKSB7Ci0JCQkJLy8gY29weSBpbmhlcml0ZWQgYnJlYWtkb3duIGVsZW1lbnRzIGZyb20gdGhlIGJhc2UgYWN0aXZpdHkgaW4gdGhlIHJpZ2h0IG9yZGVyCi0JCQkJLy8KLQkJCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG51bGw7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gbnVsbDsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IFByb2Nlc3NVdGlsLmdldEZpbHRlcigoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCWlmKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCQkJY29uZmlndXJhdG9yID0gKElDb25maWd1cmF0b3IpIGZpbHRlcjsKLQkJCQkJY3VycmVudENvbmZpZyA9IGNvbmZpZ3VyYXRvci5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQkJCWNvbmZpZ3VyYXRvci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBvd25lcjsKLQkJCQkJQWN0aXZpdHkgYWN0aXZpdHlDb3B5ID0gKChBY3Rpdml0eSkgY29weSk7CQkJCQkKLQkJCQkJCi0JCQkJCS8vIEFkZCBicmVha2Rvd24gZWxlbWVudHMgZnJvbSBiYXNlIGNvcHkgdG8gdGhlIGFjdGl2aXR5IGNvcHkuIAotCQkJCQkvLyBEb24ndCBhZGQgY29weSBvZiBiYXNlIGVsZW1lbnQgb2YgdGhlIGV4aXN0aW5nIGNoaWxkcmVuCi0JCQkJCS8vCi0JCQkJCUxpc3QgYnJlYWtkb3duRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGJhc2VDb3B5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYoIWNoaWxkQmFzZUNvcGllcy5jb250YWlucyhlKSkgewotCQkJCQkJCWJyZWFrZG93bkVsZW1lbnRzLmFkZChlKTsKLQkJCQkJCX0JCQkJCQkKLQkJCQkJfQotCQkJCQlhY3Rpdml0eUNvcHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwoMCwgYnJlYWtkb3duRWxlbWVudHMpOwotCQkJCQlFY29yZVV0aWwucmVtb3ZlKGJhc2VDb3B5KTsKLQkJCQkJCi0JCQkJCS8vIGNvcHkgb3RoZXIgc3RyaW5nIGF0dHJpYnV0ZXMgYXMgd2VsbCBhZnRlciByZWFsaXplIHRoZW0KLQkJCQkJLy8KLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0QXR0cmlidXRlc1RvQ29weSgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJRUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoRUF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlPYmplY3QgdmFsdWUgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRBdHRyaWJ1dGUoYWN0aXZpdHksIGF0dHJpYnV0ZSwgY29uZmlnKTsKLQkJCQkJCWFjdGl2aXR5Q29weS5lU2V0KGF0dHJpYnV0ZSwgdmFsdWUpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBjb3B5IHByZXNlbnRhdGlvbiBuYW1lCi0JCQkJCS8vCi0JCQkJCWFjdGl2aXR5Q29weS5zZXRQcmVzZW50YXRpb25OYW1lKFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoYWN0aXZpdHkpKTsJCQkJCQotCi0JCQkJCS8vIGNsZWFyIHRoZSB2YXJpYWJpbGl0eSBkYXRhCi0JCQkJCS8vCi0JCQkJCWFjdGl2aXR5Q29weS5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KG51bGwpOwotCQkJCQlhY3Rpdml0eUNvcHkuc2V0VmFyaWFiaWxpdHlUeXBlKG51bGwpOwotCi0JCQkJCS8vIGNsZWFyIHN1cHByZXNzaW9uIGRhdGEKLQkJCQkJLy8KLQkJCQkJQ29uc3RyYWludCBydWxlID0gQ29uc3RyYWludE1hbmFnZXIuZ2V0Q29uc3RyYWludChhY3Rpdml0eUNvcHksIENvbnN0cmFpbnRNYW5hZ2VyLlBST0NFU1NfU1VQUFJFU1NJT04sIGZhbHNlKTsKLQkJCQkJaWYocnVsZSAhPSBudWxsKSB7Ci0JCQkJCQlFY29yZVV0aWwucmVtb3ZlKHJ1bGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZihjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJCQkJLy8gcmVzdG9yZSBjdXJyZW50IGNvbmZpZ3J1YXRpb24KLQkJCQkJCS8vCi0JCQkJCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQkJCi0JfQotCi0JcHJvdGVjdGVkIFByb2Nlc3NQYWNrYWdlIHBrZ0NvcHk7Ci0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByb3RlY3RlZCBJRGlhZ3JhbU1hbmFnZXIgZGlhZ3JhbU1ncjsKLQotCXByb3RlY3RlZCBQcm9jZXNzIHRhcmdldFByb2Nlc3M7Ci0KLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCi0JcHJvdGVjdGVkIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHVibGljIEFjdGl2aXR5RGVlcENvcHlDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBDb3B5SGVscGVyIGNvcHlIZWxwZXIsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9jZXNzIHRhcmdldFByb2Nlc3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzdXBlcihudWxsLCBhY3Rpdml0eS5lQ29udGFpbmVyKCksIGNvcHlIZWxwZXIpOwotCQlBc3NlcnQuaXNUcnVlKGFjdGl2aXR5LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlLCAiQWN0aXZpdHkncyBjb250YWluZXIgbXVzdCBiZSBhIFByb2Nlc3NQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJZG9tYWluID0gbmV3IEVkaXRpbmdEb21haW4oKTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMudGFyZ2V0UHJvY2VzcyA9IHRhcmdldFByb2Nlc3M7Ci0JCWRpYWdyYW1NZ3IgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERpYWdyYW1NYW5hZ2VyKCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZGlhZ3JhbU1nciwgIkNvdWxkIG5vdCBsb2FkIGRpYWdyYW0gbWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuY29weWluZ0FjdGl2aXRpZXNfbXNnLCBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGFjdGl2aXR5KSkpOwotCQlzdXBlci5leGVjdXRlKCk7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JCWlmKCFyZXN1bHQuaXNFbXB0eSgpKSB7Ci0JCQlwa2dDb3B5ID0gKFByb2Nlc3NQYWNrYWdlKSByZXN1bHQuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQlmaXhQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCQlyZXBsYWNlVGV4dFJlZmVyZW5jZXMoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBmaXggdGhlIHByb2Nlc3MgY29tcG9uZW50IHRvIG1ha2UgaXQgYSBwcm9jZXNzIHBhY2thZ2UuCi0JICogVGhpcyBtZXRob2QgbWlnaHQgYmUgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzIHRvIGFjaGl2ZSBkaWZmZXJlbmNlIHJlc3VsdC4KLQkgKiBGb3IgZXhhbXBsZSwgCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlByb2Nlc3NEZWVwQ29weUNvbW1hbmQjZml4UHJvY2Vzc0NvbXBvbmVudCgpCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXhQcm9jZXNzQ29tcG9uZW50KCkgewotCQlpZihwa2dDb3B5IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJLy8gcmVwbGFjZSB0aGUgUHJvY2Vzc0NvbXBvbmVudCB3aXRoIGEgZXF1aXZhbGVudCBQcm9jZXNzUGFja2FnZQotCQkJLy8KLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdChwa2dDb3B5LmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKSk7Ci0JCQlmZWF0dXJlcy5yZXRhaW5BbGwocGtnLmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCB2YWx1ZSA9IHBrZ0NvcHkuZUdldChmZWF0dXJlKTsKLQkJCQlwa2cuZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpcGtnQ29weSkuZ2V0UHJvY2VzcygpOwotCQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZCgwLCBwcm9jKTsKLQkJCX0KLQkJCXBrZ0NvcHkgPSBwa2c7Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBJZiB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBpbiB0aGUgY29waWVkIGVsZW1lbnRzIGNvbnRhaW4gcmVmZXJlbmNlcyAoVVJMcykgdG8gb3RoZXIgZWxlbWVudHMgCi0JICogd2l0aGluIHRoZSBzYW1lIGNvcGllZCBwcm9jZXNzIHRoZW4gcmVwbGFjZSB0aGVzZSByZWZlcmVuY2VzIHdpdGggcmVmZXJlbmNlcyB0aGF0IHBvaW50IHRvIAotCSAqIHRoZSBuZXcgZWxlbWVudHMgaW4gdGhlIGNvcGllZCBzdHJ1Y3R1cmVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VUZXh0UmVmZXJlbmNlcygpIHsKLQkJSVRleHRSZWZlcmVuY2VSZXBsYWNlciB0eHRSZWZSZXBsYWNlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0VGV4dFJlZmVyZW5jZVJlcGxhY2VyKCk7Ci0JCWlmKHR4dFJlZlJlcGxhY2VyID09IG51bGwpIHJldHVybjsKLQotCQlNYXAgb2xkVG9OZXdPYmplY3RNYXAgPSAoKENvcHlIZWxwZXIpIGNvcHlIZWxwZXIpLmdldE9iamVjdFRvQ29weU1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2dDb3B5LmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgYXR0cmlidXRlcyA9IGVsZW1lbnQuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOyBhdHRyaWJ1dGVzLmhhc05leHQoKTsgKQotCQkJewotCQkJCUVBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMubmV4dCgpOwotCQkJCWlmIChhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlKCkgJiYgIWF0dHJpYnV0ZS5pc0Rlcml2ZWQoKSAmJiAoYXR0cmlidXRlLmlzTWFueSgpIHx8IGVsZW1lbnQuZUlzU2V0KGF0dHJpYnV0ZSkpCi0JCQkJCQkmJiBhdHRyaWJ1dGUuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkgPT0gTGl0ZXJhbHMuU1RSSU5HLmdldEluc3RhbmNlQ2xhc3MoKSkKLQkJCQl7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZykgZWxlbWVudC5lR2V0KGF0dHJpYnV0ZSk7Ci0JCQkJCWlmKHRleHQgIT0gbnVsbCkgewotCQkJCQkJdGV4dCA9IHR4dFJlZlJlcGxhY2VyLnJlcGxhY2UodGV4dCwgdGFyZ2V0UHJvY2Vzcywgb2xkVG9OZXdPYmplY3RNYXApOwotCQkJCQkJZWxlbWVudC5lU2V0KGF0dHJpYnV0ZSwgdGV4dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCNnZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJaWYocGtnQ29weSAhPSBudWxsKSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSBQcm9jZXNzVXRpbC5maW5kQWN0aXZpdHkocGtnQ29weSk7Ci0JCQlpZihhY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGFjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCS8qKgotCSAqIE1vdmVzIGNvbnRlbnQgb2Ygc291cmNlIG9iamVjdCA8Y29kZT5zcmM8L2NvZGU+IG92ZXIgdG8gdGhlIHRhcmdldCBvYmplYyA8Y29kZT50YXJnZXQ8L2NvZGU+Ci0JICogQHBhcmFtIHNyYwotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIG1vdmVDb250ZW50KFByb2Nlc3NQYWNrYWdlIHNyYywgQWN0aXZpdHkgYWN0KSB7Ci0JCVByb2Nlc3NQYWNrYWdlIHRhcmdldCA9IChQcm9jZXNzUGFja2FnZSkgYWN0LmVDb250YWluZXIoKTsKLQkJLy8gbW92ZSBjb250ZW50IG9mIGJhc2UgcGFja2FnZSBvdmVyIHRvIHRoZSBhY3Rpdml0eSdzIHBhY2thZ2UJCQkJCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KHNyYy5lQ29udGVudHMoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IGUuZUNvbnRhaW5pbmdGZWF0dXJlKCk7CQkJCQkJCi0JCQlpZihmLmlzTWFueSgpKSB7Ci0JCQkJKChMaXN0KXRhcmdldC5lR2V0KGYpKS5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQkJaWYoc3JjIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUHJvY2VzcyBiYXNlQ29weSA9ICgoUHJvY2Vzc0NvbXBvbmVudClzcmMpLmdldFByb2Nlc3MoKTsKLQkJCXRhcmdldC5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoYmFzZUNvcHkpOwotCQl9Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgY29weVN1cHByZXNzaW9uU3RhdGVzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXJGYWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcmllc1tpXTsKLQkJCUFjdGl2aXR5IGFjdCA9IFByb2Nlc3NVdGlsLmZpbmRBY3Rpdml0eSgoUHJvY2Vzc1BhY2thZ2UpIG93bmVyKTsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpcCA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGFjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBic0lwID0gKElCU0l0ZW1Qcm92aWRlcikgaXA7Ci0JCQlPYmplY3QgdG9wID0gYnNJcC5nZXRUb3BJdGVtKCk7Ci0JCQlpZighKHRvcCBpbnN0YW5jZW9mIFByb2Nlc3MpIHx8ICEoKChFT2JqZWN0KXRvcCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkpIHsKLQkJCQkvLyBpdGVtIHByb3ZpZGVyIHRyZWUgb2YgdGhlIG93bmVyJ3MgcHJvY2VzcyBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Ci0JCQkJLy8KLQkJCQlQcm9jZXNzVXRpbC5pbml0aWFsaXplSXRlbVByb3ZpZGVyUGF0aChhY3QsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCX0KLQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpOwotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoYWRhcHRlckZhY3RvcnksIHByb2MpOwotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpcC5nZXRDaGlsZHJlbihvd25lcikuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJCU1ldGhvZEVsZW1lbnQgY29weSA9IChNZXRob2RFbGVtZW50KSBjb3B5SGVscGVyLmdldChlKTsKLQotCQkJCS8vIGNvcHkgc3VwcHJlc3Npb24gc3RhdGUsIGNvbnNpZGVyIGN1cnJlbnQgcHJvY2VzcyB0aGF0IGluaGVyaXRzIHRoaXMgZWxlbWVudAotCQkJCS8vCi0JCQkJaWYoY29weSAhPSBudWxsICYmIHN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZChjaGlsZCkpIHsKLQkJCQkJY29weS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4uVFJVRSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlEcm9wQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eURyb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0OTk1OTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eURyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5BY3Rpdml0eUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0KLS8qKgotICogRHJvcCBjb21tYW5kIGZvciBhY3Rpdml0eSB0aGF0IHN1cHBvcnRzIGV4dGVuZCwgY29weSwgYW5kIGRlZXAgY29weS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RHJvcENvbW1hbmQgZXh0ZW5kcyBCU0Ryb3BDb21tYW5kIHsKLQotCXByaXZhdGUgVmlld2VyIHZpZXdlcjsKLQotCXByaXZhdGUgTGlzdCBvbGRQYXR0ZXJuczsKLQotCXByaXZhdGUgTGlzdCBwYXR0ZXJuczsKLQotCXByaXZhdGUgUHJvY2VzcyB0YXJnZXRQcm9jZXNzOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVsaXZlcnlQcm9jZXNzOwotCi0JcHJpdmF0ZSBpbnQgdHlwZTsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb24gYXBwbGllZEFjdGl2aXRpZXM7Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBBY3Rpdml0eUhhbmRsZXIgYWN0aXZpdHlIYW5kbGVyOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY3V0ZWQ7Ci0KLQlwcm90ZWN0ZWQgSGFzaFNldCBhZGRlZE9iamVjdHM7Ci0KLQlwdWJsaWMgQWN0aXZpdHlEcm9wQ29tbWFuZChBY3Rpdml0eSB0YXJnZXQsIExpc3QgYWN0aXZpdGllcywgVmlld2VyIHZpZXdlciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodGFyZ2V0LCBhY3Rpdml0aWVzKTsKLQkJc2V0TGFiZWwoTGlicmFyeUVkaXRSZXNvdXJjZXMuQWN0aXZpdHlEcm9wQ29tbWFuZF9sYWJlbCk7IAotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQl0YXJnZXRQcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRhcmdldCk7Ci0JCQotCQlpc0RlbGl2ZXJ5UHJvY2VzcyA9IHRhcmdldFByb2Nlc3MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3M7Ci0JCWlmIChpc0RlbGl2ZXJ5UHJvY2VzcykgewotCQkJb2xkUGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0KCgoRGVsaXZlcnlQcm9jZXNzKSB0YXJnZXRQcm9jZXNzKQotCQkJCQkuZ2V0SW5jbHVkZXNQYXR0ZXJucygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJaWYodHlwZSA9PSBJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWSkgewotCQkJcnVuQXNKb2IgPSB0cnVlOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGNoZWNrQ29weSgpIHsKLQkJLy9UT0RPOiBtdXN0IHJlZmluZSBtb3JlIHRoYW4ganVzdCBjaGVja0V4dGVuZCgpCi0JCS8vIEUuZy46IHN0aWxsIGFsbG93IGNvcHlpbmcgZGVsaXZlcnkgcHJvY2VzcyB0aGF0IGRvZXMgbm90IGhhdmUgYW55IGFjdGl2aXR5IHZhcmlhYmlsaXR5LiAKLQkJcmV0dXJuIGNoZWNrRXh0ZW5kKCk7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGNoZWNrRXh0ZW5kKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLS8vCQkJCi0vLwkJCWlmICgoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKChBY3Rpdml0eSkgZWxlbWVudCkpKXsKLS8vCQkJCWNhbkV4dGVuZCA9IGZhbHNlOwotLy8JCQkJYnJlYWs7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlbGVtZW50KTsKLS8vCQkJaWYgKHRhcmdldFByb2Nlc3MuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IHByb2MpIHsKLS8vCQkJCWNhbkV4dGVuZCA9IGZhbHNlOwotLy8JCQkJYnJlYWs7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4gJiYgcHJvYyAhPSB0YXJnZXRQcm9jZXNzKSB7Ci0vLwkJCQljYW5FeHRlbmQgPSB0cnVlOwotLy8JCQkJYnJlYWs7Ci0vLwkJCX0KLQkJCQotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBpdGVyLm5leHQoKTsKLQkJCVByb2Nlc3Mgc3JjUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpOwotCQkJaWYoc3JjUHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCS8vIGNhbm5vdCBleHRlbmQgYSBkZWxpdmVyeSBwcm9jZXNzIG9yIGFueSBvZiBpdHMgYWN0aXZpdGllcwotCQkJCS8vCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY2Fubm90X2NvcHlfb3JfZXh0ZW5kX2RlbGl2ZXJ5X3Byb2Nlc3MsCi0JCQkJCQludWxsKTsKLQkJCX0KLQkJCWJvb2xlYW4gY2FuRXh0ZW5kOwotCQkJaWYgKERlcGVuZGVuY3lDaGVja2VyLm5ld0NoZWNrQWN0KSB7Ci0JCQkJY2FuRXh0ZW5kID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudAotCQkJCQkJCQkoYWN0aXZpdHksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYWN0KSwgdHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkV4dGVuZCA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgYWN0aXZpdHkpLmlzT0soKTsKLQkJCX0KLQkJCWlmKCFjYW5FeHRlbmQpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jaXJjdWxhcl9kZXBlbmRlbmN5X2Vycm9yX21zZywKLQkJCQkJCW51bGwpOwotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJSUFjdGlvblR5cGVQcm92aWRlciBhY3Rpb25UeXBlUHJvdmlkZXIgPSAoSUFjdGlvblR5cGVQcm92aWRlcikgdmlld2VyOwotCQlpZiAoIHZpZXdlciAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIgPSBudWxsOwotCQkJLy8gZGVsZWdhdGUgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNvbW1hbmQKLQkJCS8vCi0JCQlhY3Rpb25UeXBlUHJvdmlkZXIuZXhlY3V0ZSh0aGlzLCBjaGVja0V4dGVuZCgpLmlzT0soKSk7Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCWFjdGl2aXR5SGFuZGxlciA9IG5ldyBBY3Rpdml0eUhhbmRsZXIoKTsKLQkJCi0JCWlmKHR5cGUgPT0gSUFjdGlvblR5cGVQcm92aWRlci5ERUVQX0NPUFkpIHsKLQkJCWRvRGVlcENvcHkoKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1cGVyLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBkb0RlZXBDb3B5KCkgewotCQlpZighVXNlckludGVyYWN0aW9uSGVscGVyLmNvbmZpcm1EZWVwQ29weShkcm9wRWxlbWVudHMpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWVwQ29weUNvbmZpZyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkZWVwQ29weUNvbmZpZyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaG9vc2VEZWVwQ29weUNvbmZpZ3VyYXRpb24odGFyZ2V0UHJvY2VzcywgYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0JCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlhY3Rpdml0eUhhbmRsZXIuc2V0RGVlcENvcHlDb25maWcoZGVlcENvcHlDb25maWcpOwotCQlhY3Rpdml0eUhhbmRsZXIuc2V0VGFyZ2V0UHJvY2Vzcyh0YXJnZXRQcm9jZXNzKTsKLQkJCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJYWN0aXZpdHlIYW5kbGVyLnNldE1vbml0b3IobW9uaXRvcik7Ci0JCQkJcHJlRXhlY3V0ZWQgPSBwcmVFeGVjdXRlKCk7Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgZ2V0TGFiZWwoKSk7CQkJCi0JCWlmIChwcmVFeGVjdXRlZCkgewotCQkJcmVkbygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNwcmVFeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjdXRlKCkgewotCQlpZiAoIXN1cGVyLnByZUV4ZWN1dGUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBwcm9jZXNzIHRoZSBzZWxlY3RlZCBhY3Rpdml0aWVzIGFuZCBkZWVwLWNvcHkgdGhlIHZhbGlkIG9uZXMKLQkJLy8KLQkJaWYgKGlzRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHJvcEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJLy8gJiYgZWxlbWVudCAhPSB0YXJnZXQKLQkJCSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZWxlbWVudDsKLQkJCQkKLS8vCQkJCWlmKHR5cGUgPT0gSUFjdGlvblR5cGVQcm92aWRlci5ERUVQX0NPUFkpIHsKLS8vCQkJCQlhY3Rpdml0eUhhbmRsZXIuZGVlcENvcHkoYWN0KTsKLS8vCQkJCX0KLS8vCQkJCWVsc2UgewotLy8JCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpOwotLy8JCQkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4gJiYgcHJvYyAhPSB0YXJnZXRQcm9jZXNzKSB7Ci0vLwkJCQkJCWlmICh0eXBlID09IElBY3Rpb25UeXBlUHJvdmlkZXIuRVhURU5EKSB7Ci0vLwkJCQkJCQlhY3Rpdml0eUhhbmRsZXIuZXh0ZW5kKGFjdCk7Ci0vLwkJCQkJCQlpZiAocGF0dGVybnMgIT0gbnVsbCkKLS8vCQkJCQkJCQlwYXR0ZXJucy5hZGQocHJvYyk7Ci0vLwkJCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCQlhY3Rpdml0eUhhbmRsZXIuY29weShhY3QpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfSBlbHNlIHsKLS8vCQkJCQkJYWN0aXZpdHlIYW5kbGVyLmNvcHkoYWN0KTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJCi0JCQkJc3dpdGNoKHR5cGUpIHsKLQkJCQljYXNlIElBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZOgotCQkJCQlhY3Rpdml0eUhhbmRsZXIuZGVlcENvcHkoYWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQWN0aW9uVHlwZVByb3ZpZGVyLkVYVEVORDoKLQkJCQkJYWN0aXZpdHlIYW5kbGVyLmV4dGVuZChhY3QpOwotCQkJCQlpZiAocGF0dGVybnMgIT0gbnVsbCkgewotCQkJCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCk7Ci0JCQkJCQlpZihwcm9jICE9IG51bGwpIHsKLQkJCQkJCQlwYXR0ZXJucy5hZGQocHJvYyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFk6Ci0JCQkJCWFjdGl2aXR5SGFuZGxlci5jb3B5KGFjdCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWFwcGxpZWRBY3Rpdml0aWVzID0gYWN0aXZpdHlIYW5kbGVyLmdldEFjdGl2aXRpZXMoKTsKLQotCQlyZXR1cm4gIWFwcGxpZWRBY3Rpdml0aWVzLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2RvRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQlJdGVyYXRvciBpdG9yID0gYXBwbGllZEFjdGl2aXRpZXMuaXRlcmF0b3IoKTsKLQotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJd2hpbGUgKGl0b3IuaGFzTmV4dCgpKSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGl0b3IubmV4dCgpOwotCi0JCQlpZiAoYWN0LmVDb250YWluZXIoKSAhPSBudWxsCi0JCQkJCSYmIGFjdC5lQ29udGFpbmVyKCkuZUNvbnRhaW5lcigpICE9IHBrZykgewotCQkJCXBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKGFjdC5lQ29udGFpbmVyKCkpOwotCQkJfQotCi0JCQlpZiAocGF0dGVybnMgIT0gbnVsbCAmJiAhcGF0dGVybnMuaXNFbXB0eSgpKSB7Ci0JCQkJRGVsaXZlcnlQcm9jZXNzIHByb2MgPSAoRGVsaXZlcnlQcm9jZXNzKSB0YXJnZXRQcm9jZXNzOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhdHRlcm5zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgcGF0dGVybiA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoIXByb2MuZ2V0SW5jbHVkZXNQYXR0ZXJucygpLmNvbnRhaW5zKHBhdHRlcm4pKSB7Ci0JCQkJCQlwcm9jLmdldEluY2x1ZGVzUGF0dGVybnMoKS5hZGQocGF0dGVybik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChhcHBsaWVkQWN0aXZpdGllcyk7Ci0JCQotCQlpZighYWN0aXZpdHlIYW5kbGVyLmdldERlZXBDb3BpZXMoKS5pc0VtcHR5KCkpIHsKLQkJCXBvc3REZWVwQ29weSgpOwotCQl9Ci0KLQkJLy8gSGFjayB0byByZWZyZXNoIHByb3ZpZGVycyBmb3JjZWZ1bGx5IGJlZm9yZSBjYWxsaW5nIGZpeER1cGxpY2F0ZU5hbWVzCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYWN0aXZpdHksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYWN0aXZpdHkpOwotCQkKLQkJLy8gZml4IGR1cGxpY2F0ZSBuYW1lcyBvZiBuZXdseSBhZGRlZCBlbGVtZW50cwotCQlmaXhEdXBsaWNhdGVOYW1lcygpOwotCQkKLQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBwb3N0RGVlcENvcHkoKSB7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGF0aW9uIG9mIHRoZSB0YXJnZXQgcHJvY2VzcyBhbnkgbWlzc2luZyBjb250ZW50Ci0JCQkJLy8KLQkJCQlpZihhZGRlZE9iamVjdHMgPT0gbnVsbCkgewotCQkJCQlhZGRlZE9iamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYWRkZWRPYmplY3RzLmNsZWFyKCk7Ci0JCQkJfQotCQkJCWJvb2xlYW4gZGVmYXVsdENvbmZpZ0NoYW5nZWQgPSBmYWxzZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0eUhhbmRsZXIuZ2V0RGVlcENvcGllcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihpdGVyLm5leHQoKSkgewotCi0JCQkJCQkvKioKLQkJCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCQkgKi8KLQkJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJCXJldHVybiAoKEFjdGl2aXR5KW9iamVjdCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQkJfQotCi0JCQkJCX07Ci0JCQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJT2JqZWN0IGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZihlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgZSk7Ci0JCQkJCQkJaW50IHNpemUgPSBhZGRlZE9iamVjdHMuc2l6ZSgpOwotCQkJCQkJCVByb2Nlc3NVdGlsLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24odGFyZ2V0UHJvY2VzcywgbWUsIGFkZGVkT2JqZWN0cyk7Ci0JCQkJCQkJaWYoIWRlZmF1bHRDb25maWdDaGFuZ2VkICYmIChzaXplICE9IGFkZGVkT2JqZWN0cy5zaXplKCkpKSB7Ci0JCQkJCQkJCWdldE1vZGlmaWVkUmVzb3VyY2VzKCkuYWRkKHRhcmdldFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJCWRlZmF1bHRDb25maWdDaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJCi0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5JblVJKHJ1bm5hYmxlLCBnZXRMYWJlbCgpKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gZGVlcENvcHlDb25maWcgPSBhY3Rpdml0eUhhbmRsZXIuZ2V0RGVlcENvcHlDb25maWcoKTsJCQkKLQotCQlpZihkZWVwQ29weUNvbmZpZyAhPSBudWxsKSB7Ci0JCQkvLyBzeW5jaHJvbml6ZSB0aGUgZGVlcCBjb3BpZXMgd2l0aCBkZWVwIGNvcHkgY29uZmlndXJhdGlvbgkJCQkKLQkJCS8vCi0JCQlmaW5hbCBTeW5jaHJvbml6ZUNvbW1hbmQgc3luY2hDbWQgPSBuZXcgU3luY2hyb25pemVDb21tYW5kKGFjdGl2aXR5SGFuZGxlci5nZXREZWVwQ29waWVzKCksIGRlZXBDb3B5Q29uZmlnLCBudWxsLCBmYWxzZSk7Ci0JCQl0cnkgewotCQkJCXJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXN5bmNoQ21kLmluaXRpbGl6ZSgpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX07Ci0JCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9wcmVwYXJlKTsKLQkJCQlpZihzeW5jaENtZC5pc0ludGlhbGl6ZWQoKSkgewotCQkJCQlzeW5jaENtZC5leGVjdXRlKCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJc3luY2hDbWQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRml4ZXMgZHVwbGljYXRlIG5hbWVzIG9mIG5ld2x5IGFkZGVkIGVsZW1lbnRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpeER1cGxpY2F0ZU5hbWVzKCkgewotCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHRhcmdldFByb2Nlc3MpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhcHBsaWVkQWN0aXZpdGllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgaXRlci5uZXh0KCk7Ci0JCQlmaXhEdXBsaWNhdGVOYW1lcyhhY3QsIHN1cHByZXNzaW9uKTsKLQkJCWZpeFRlYW1Qcm9maWxlRHVwbGljYXRlTmFtZXMoYWN0LCBzdXBwcmVzc2lvbik7Ci0JCX0JCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpeER1cGxpY2F0ZU5hbWVzKEJyZWFrZG93bkVsZW1lbnQgZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJZml4RHVwbGljYXRlTmFtZXMoZSwgc3VwcHJlc3Npb24sIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaXhEdXBsaWNhdGVOYW1lcyhCcmVha2Rvd25FbGVtZW50IGUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBlLmdldE5hbWUoKTsKLQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQnJlYWtkb3duRWxlbWVudE5hbWUoYWRhcHRlckZhY3RvcnksIGUsIGJhc2VOYW1lLCBzdXBwcmVzc2lvbikgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDE7IHRydWU7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gYmFzZU5hbWUgKyAnXycgKyBpOwotCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0JyZWFrZG93bkVsZW1lbnROYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBuYW1lLCBzdXBwcmVzc2lvbikgPT0gbnVsbCkgewotCQkJCQllLnNldE5hbWUobmFtZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQliYXNlTmFtZSA9IFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZSk7Ci0JCWlmIChQcm9jZXNzVXRpbC5jaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBiYXNlTmFtZSwgc3VwcHJlc3Npb24pICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAxOyB0cnVlOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGJhc2VOYW1lICsgJ18nICsgaTsKLQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZShhZGFwdGVyRmFjdG9yeSwgZSwgbmFtZSwgc3VwcHJlc3Npb24pID09IG51bGwpIHsKLQkJCQkJZS5zZXRQcmVzZW50YXRpb25OYW1lKG5hbWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CQkKLQkKLQlwcml2YXRlIHZvaWQgZml4VGVhbVByb2ZpbGVEdXBsaWNhdGVOYW1lcyhBY3Rpdml0eSBhY3QsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCWZvciAoaW50IGkgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQoaSk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlmaXhEdXBsaWNhdGVOYW1lcygoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCwgc3VwcHJlc3Npb24sIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJfQotCQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlmaXhUZWFtUHJvZmlsZUR1cGxpY2F0ZU5hbWVzKChBY3Rpdml0eSkgZWxlbWVudCwgc3VwcHJlc3Npb24pOwotCQkJfQotCQl9Ci0JfQotCQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9VbmRvKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VuZG8oKSB7Ci0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKGFwcGxpZWRBY3Rpdml0aWVzKTsKLQkJaWYgKGlzRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlEZWxpdmVyeVByb2Nlc3MgcHJvYyA9IChEZWxpdmVyeVByb2Nlc3MpIHRhcmdldFByb2Nlc3M7Ci0JCQlwcm9jLmdldEluY2x1ZGVzUGF0dGVybnMoKS5jbGVhcigpOwotCQkJcHJvYy5nZXRJbmNsdWRlc1BhdHRlcm5zKCkuYWRkQWxsKG9sZFBhdHRlcm5zKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXROYW1lKExpc3Qgc2libGluZ3MsIEFjdGl2aXR5IGUpIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gZS5nZXROYW1lKCk7Ci0JCWlmICghaXNOYW1lVGFrZW4oc2libGluZ3MsIGUsIGJhc2VOYW1lKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAxOyB0cnVlOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gYmFzZU5hbWUgKyAnXycgKyBpOwotCQkJaWYgKCFpc05hbWVUYWtlbihzaWJsaW5ncywgZSwgbmFtZSkpIHsKLQkJCQllLnNldE5hbWUobmFtZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRQcmVzZW50YXRpb25OYW1lKExpc3Qgc2libGluZ3MsIEFjdGl2aXR5IGUpIHsKLQkJLy8gaWYoZS5nZXRQcmVzZW50YXRpb25OYW1lKCkgIT0gbnVsbCAmJgotCQkvLyBlLmdldFByZXNlbnRhdGlvbk5hbWUoKS50cmltKCkubGVuZ3RoKCkgPiAwKSByZXR1cm47Ci0KLQkJU3RyaW5nIGJhc2VQcmVzZW50YXRpb25OYW1lID0gUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlKTsKLQkJaWYgKCFpc1ByZXNlbnRhdGlvbk5hbWVUYWtlbihzaWJsaW5ncywgZSwgYmFzZVByZXNlbnRhdGlvbk5hbWUpKSB7Ci0JCQkvLyBlLnNldFByZXNlbnRhdGlvbk5hbWUoYmFzZVByZXNlbnRhdGlvbk5hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAxOyB0cnVlOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gYmFzZVByZXNlbnRhdGlvbk5hbWUgKyAnXycgKyBpOwotCQkJaWYgKCFpc1ByZXNlbnRhdGlvbk5hbWVUYWtlbihzaWJsaW5ncywgZSwgbmFtZSkpIHsKLQkJCQllLnNldFByZXNlbnRhdGlvbk5hbWUobmFtZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05hbWVUYWtlbihMaXN0IHNpYmxpbmdzLCBEZXNjcmliYWJsZUVsZW1lbnQgZSwKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSBzaWJsaW5ncy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJQnJlYWtkb3duRWxlbWVudCBzaWJsaW5nID0gKEJyZWFrZG93bkVsZW1lbnQpIHNpYmxpbmdzLmdldChpKTsKLQkJCS8vIGlmKHNpYmxpbmcgIT0gZSAmJiBuYW1lLmVxdWFscyhzaWJsaW5nLmdldFByZXNlbnRhdGlvbk5hbWUoKSkpIHsKLQkJCWlmIChzaWJsaW5nICE9IGUgJiYgbmFtZS5lcXVhbHMoc2libGluZy5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQcmVzZW50YXRpb25OYW1lVGFrZW4oTGlzdCBzaWJsaW5ncywKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBlLCBTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gc2libGluZ3Muc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgc2libGluZyA9IChCcmVha2Rvd25FbGVtZW50KSBzaWJsaW5ncy5nZXQoaSk7Ci0JCQkvLyBpZihzaWJsaW5nICE9IGUgJiYgbmFtZS5lcXVhbHMoc2libGluZy5nZXRQcmVzZW50YXRpb25OYW1lKCkpKSB7Ci0JCQlpZiAoc2libGluZyAhPSBlCi0JCQkJCSYmIG5hbWUuZXF1YWxzKFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoc2libGluZykpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmKGV4ZWN1dGVkKSB7Ci0JCQlyZXR1cm4gYXBwbGllZEFjdGl2aXRpZXM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldFJlc3VsdCgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5SGFuZGxlciBnZXRBY3Rpdml0eUhhbmRsZXIoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUhhbmRsZXI7Ci0JfQotCXB1YmxpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpewotCQlyZXR1cm4gYWN0aXZpdHk7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0JCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5VmFyaWFiaWxpdHlDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5VmFyaWFiaWxpdHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0NDg2MTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eVZhcmlhYmlsaXR5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0vKioKLSAqIENvbW1hbmQgdG8gc2V0IHZhcmlhYmlsaXR5IG9uIHRoZSBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQgZXh0ZW5kcyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eUVsZW1lbnQgdmU7Ci0KLQlwcml2YXRlIFZhcmlhYmlsaXR5VHlwZSB0eXBlOwotCi0JcHJpdmF0ZSBMaXN0IGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXB1YmxpYyBBY3Rpdml0eVZhcmlhYmlsaXR5Q29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgVmFyaWFiaWxpdHlFbGVtZW50IHZlLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUsIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0KLQkJc3VwZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KSk7Ci0KLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQl0aGlzLnZlID0gdmU7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMuY29uZmlndXJhdG9yID0gY29uZmlndXJhdG9yOwotCi0JCWVsZW1lbnRzID0gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10geyB2ZSB9KTsKLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oZWxlbWVudHMsIGNvbmZpZ3VyYXRvcikpCi0JCQlyZXR1cm47Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlhY3Rpdml0eS5zZXRWYXJpYWJpbGl0eVR5cGUodHlwZSk7Ci0JCWFjdGl2aXR5LnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQodmUpOwotCi0JCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCS8vIGJhc2ljYWxseSByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFueXRoaW5nIHdhcyBhZGRlZAotCQkJc3VwZXIudW5kbygpOwotCQkJYWN0aXZpdHkuc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKTsKLQkJCWFjdGl2aXR5LnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkR3VpZGFuY2VUb0FjdGl2aXR5Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRHdWlkYW5jZVRvQWN0aXZpdHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyMDA1OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRHdWlkYW5jZVRvQWN0aXZpdHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gYWRkIGd1aWRhbmNlIHRvIGFjdGl2aXR5Ci0gKiAgCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkR3VpZGFuY2VUb0FjdGl2aXR5Q29tbWFuZCBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdCBndWlkYW5jZXM7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHVibGljIEFkZEd1aWRhbmNlVG9BY3Rpdml0eUNvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3QgZ3VpZGFuY2VzKSB7Ci0KLQkJc3VwZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KSk7Ci0KLQkJdGhpcy5ndWlkYW5jZXMgPSBndWlkYW5jZXM7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oZ3VpZGFuY2VzKSkKLQkJCXJldHVybjsKLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCWlmICghZ3VpZGFuY2VzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGd1aWRhbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgb2JqOwotCi0JCQkJCS8vIGd1aWRhbmNlcyBmb3IgY29udGVudCBlbGVtZW50Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRDaGVja2xpc3RzKCkuYWRkKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRDb25jZXB0cygpLmFkZChpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQkJYWN0aXZpdHkuZ2V0RXhhbXBsZXMoKS5hZGQoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmFkZChpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRHdWlkZWxpbmVzKCkuYWRkKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRSZXVzYWJsZUFzc2V0cygpLmFkZChpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUm9hZG1hcCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0Um9hZG1hcHMoKS5hZGQoaXRlbSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKCJDYW50IHNldCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKCFndWlkYW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBiYXNpY2FsbHkgcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJCXN1cGVyLnVuZG8oKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IGd1aWRhbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgb2JqOwotCi0JCQkJCS8vIGd1aWRhbmNlcyBmb3IgY29udGVudCBlbGVtZW50Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRDaGVja2xpc3RzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRDb25jZXB0cygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQkJYWN0aXZpdHkuZ2V0RXhhbXBsZXMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRHdWlkZWxpbmVzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRSZXVzYWJsZUFzc2V0cygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUm9hZG1hcCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0Um9hZG1hcHMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKCJDYW50IHNldCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAoIWd1aWRhbmNlcy5pc0VtcHR5KCkgKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYgKGFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCXJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IGFjdGl2aXR5IH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZE1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZE1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiYzZhY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLQotLyoqCi0gKiBCYXNlIENvbW1hbmQgZm9yIGFkZCBtZXRob2QgZWxlbWVudHMgdG8gZGVzY3JpcHRvci4gCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnOwotCi0JcHJpdmF0ZSBIYXNoU2V0IGFkZGVkT2JqZWN0czsKLQotCXByaXZhdGUgUHJvY2VzcyBwcm9jZXNzOwotCi0JcHVibGljIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kKFByb2Nlc3MgcHJvY2VzcykgewotCQlzdXBlcigpOwotCi0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGFuZCBhZGRzIGVsZW1lbnRzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIHVzZXIgY2FuY2VsZWQgdGhlIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oTGlzdCBlbGVtZW50cykKLQl7Ci0JCXJldHVybiBhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKGVsZW1lbnRzLCBudWxsKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQ2hlY2tzIGFuZCBhZGRzIGVsZW1lbnRzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIHVzZXIgY2FuY2VsZWQgdGhlIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oTGlzdCBlbGVtZW50cywgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsKLQkJaWYgKGVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcgPT0gbnVsbCkgewotCQkJZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCi0JCQkJc3dpdGNoIChVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tBZ2FpbnN0RGVmYXVsdENvbmZpZ3VyYXRpb24oCi0JCQkJCQlwcm9jZXNzLCBlbGVtZW50LCBjb25maWd1cmF0b3IpKSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCWVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcuYWRkKGVsZW1lbnQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIC0xOgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnLmlzRW1wdHkoKSkgewotCQkJCWFkZGVkT2JqZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCVByb2Nlc3NVdGlsLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvY2VzcywgZWxlbWVudCwKLQkJCQkJCQlhZGRlZE9iamVjdHMpOwotCQkJCX0KLQkJCQlpZiAoIWFkZGVkT2JqZWN0cy5pc0VtcHR5KCkpIHsKLQkJCQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQoCi0JCQkJCQkJcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpLmVSZXNvdXJjZSgpKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChhZGRlZE9iamVjdHMgIT0gbnVsbCAmJiAhYWRkZWRPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkZWRPYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJZGVmYXVsdENvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQlkZWZhdWx0Q29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkUm9sZVRvVGVhbUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkUm9sZVRvVGVhbUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmU0ZDZiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZFJvbGVUb1RlYW1Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gYWRkIHJvbGUgdG8gdGVhbSBwcm9maWxlCi0gKiAgCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkUm9sZVRvVGVhbUNvbW1hbmQgZXh0ZW5kcyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0KLQlwcml2YXRlIExpc3Qgcm9sZXM7Ci0KLQlwcml2YXRlIExpc3Qgcm9sZURlc2NMaXN0OwotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgVGVhbVByb2ZpbGUgdGVhbTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgTGlzdCBleGlzdGluZ1JvbGVEZXNjTGlzdDsKLQotCXB1YmxpYyBBZGRSb2xlVG9UZWFtQ29tbWFuZChUZWFtUHJvZmlsZSB0ZWFtLCBMaXN0IHJvbGVzKSB7Ci0KLQkJc3VwZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRlYW0pKTsKLQotCQl0aGlzLnJvbGVzID0gcm9sZXM7Ci0JCXRoaXMudGVhbSA9IHRlYW07Ci0KLQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgUHJvY2Vzc1V0aWwuZ2V0UGFyZW50QWN0aXZpdHlPZlRlYW0odGVhbSk7Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHJvbGVzKSkKLQkJCXJldHVybjsKLQotCQlyb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHJvbGVzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSBQcm9jZXNzVXRpbAotCQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3IoKFJvbGUpIGl0b3IubmV4dCgpKTsKLQkJCXJvbGVEZXNjTGlzdC5hZGQocm9sZURlc2MpOwotCQl9Ci0KLQkJLy8gYXV0b21hdGljIGFzc2lnbm1lbnQKLQkJZXhpc3RpbmdSb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVByb2Nlc3NVdGlsLmdldFJvbGVEZXNjcmlwdG9yKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGFjdGl2aXR5LAotCQkJCWV4aXN0aW5nUm9sZURlc2NMaXN0LCByb2xlcyk7Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlpZiAoIXJvbGVEZXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQl0ZWFtLmdldFRlYW1Sb2xlcygpLmFkZCgoUm9sZURlc2NyaXB0b3IpIGl0b3IubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCWlmICghZXhpc3RpbmdSb2xlRGVzY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBleGlzdGluZ1JvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5hZGQoKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKCFyb2xlRGVzY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQkvLyBiYXNpY2FsbHkgcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJCXN1cGVyLnVuZG8oKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQl0ZWFtLmdldFRlYW1Sb2xlcygpLnJlbW92ZSgoUm9sZURlc2NyaXB0b3IpIGl0b3IubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlpZiAoIWV4aXN0aW5nUm9sZURlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gZXhpc3RpbmdSb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0KLQkJaWYgKHJvbGVzICE9IG51bGwgJiYgIXJvbGVzLmlzRW1wdHkoKSkgewotCQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQkJfQotCQkJaWYgKHRlYW0uZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZCh0ZWFtLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZiAocm9sZURlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXJldHVybiByb2xlRGVzY0xpc3Q7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduUHJpbWFyeVBlcmZvcm1lclRvVGFza0Rlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduUHJpbWFyeVBlcmZvcm1lclRvVGFza0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWQ3ZjQ4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnblByaW1hcnlQZXJmb3JtZXJUb1Rhc2tEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotCi0KLS8qKgotICogCi0gKiBDb21tYW5kIHRvIGFzc2lnbiBwcmltYXJ5IHBlcmZvcm1lciB0byB0YXNrIGRlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFzc2lnblByaW1hcnlQZXJmb3JtZXJUb1Rhc2tEZXNjcmlwdG9yIGV4dGVuZHMKLQkJQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCXByaXZhdGUgUm9sZURlc2NyaXB0b3IgbmV3Um9sZURlc2MgPSBudWxsOwotCi0JcHJpdmF0ZSBSb2xlRGVzY3JpcHRvciBvbGRSb2xlRGVzYyA9IG51bGw7Ci0KLQlwcml2YXRlIFJvbGUgcm9sZTsKLQotCXByaXZhdGUgTGlzdCByb2xlczsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGRlc2NFeGlzdHMgPSBmYWxzZTsKLQotCXByaXZhdGUgVGVhbVByb2ZpbGUgdGVhbTsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXdSb2xlRGVzY3JpcHRvciA9IGZhbHNlOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFzc2lnblByaW1hcnlQZXJmb3JtZXJUb1Rhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjLAotCQkJUm9sZSByb2xlLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGFza0Rlc2MpKTsKLQotCQl0aGlzLnJvbGUgPSByb2xlOwotCQl0aGlzLnRhc2tEZXNjID0gdGFza0Rlc2M7Ci0JCXRoaXMub2xkUm9sZURlc2MgPSB0YXNrRGVzYy5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQotCQlyb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcm9sZXMuYWRkKHJvbGUpOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCXRhc2tEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQodGFza0Rlc2MpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOyAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHJvbGVzKSkKLQkJCXJldHVybjsKLQotCQlpZiAoIXJvbGVzLmlzRW1wdHkoKSkgewotCQkJaXNOZXdSb2xlRGVzY3JpcHRvciA9IGZhbHNlOwotCQkJLy8gY2hlY2sgZm9yIGxvY2FsIGRlc2NyaXB0b3IKLQkJCW5ld1JvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcigKLQkJCQkJcm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQlpZiAobmV3Um9sZURlc2MgPT0gbnVsbCkgewotCQkJCS8vIGNoZWNrIGZvciBpbmhlcml0ZWQgZGVzY3JpcHRvcgotCQkJCW5ld1JvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJCS5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKHJvbGUsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCWlmIChuZXdSb2xlRGVzYyA9PSBudWxsKSB7Ci0KLQkJCQkJbmV3Um9sZURlc2MgPSBQcm9jZXNzVXRpbC5jcmVhdGVSb2xlRGVzY3JpcHRvcihyb2xlKTsKLQkJCQkJaXNOZXdSb2xlRGVzY3JpcHRvciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBnZXQgdGVhbQotCQkJdGVhbSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRUZWFtKGFjdGl2aXR5LCByb2xlKTsKLQotCQkJcmVkbygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCXRhc2tEZXNjLnNldFBlcmZvcm1lZFByaW1hcmlseUJ5KG5ld1JvbGVEZXNjKTsKLQotCQlpZiAoaXNOZXdSb2xlRGVzY3JpcHRvcikgewotCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQobmV3Um9sZURlc2MpOwotCQl9Ci0KLQkJaWYgKHRlYW0gIT0gbnVsbCkgewotCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5hZGQobmV3Um9sZURlc2MpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCQlpZiAoIXJvbGVzLmlzRW1wdHkoKSkgewotCQkJLy8gcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhZGRlZAotCQkJc3VwZXIudW5kbygpOwotCi0JCQl0YXNrRGVzYy5zZXRQZXJmb3JtZWRQcmltYXJpbHlCeShvbGRSb2xlRGVzYyk7Ci0KLQkJCWlmIChpc05ld1JvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmUobmV3Um9sZURlc2MpOwotCQkJfQotCQkJaWYgKHRlYW0gIT0gbnVsbCkgewotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKG5ld1JvbGVEZXNjKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJCWlmICh0YXNrRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHRhc2tEZXNjLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNGQ2YjVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci0KLQotLyoqCi0gKiBDb21tYW5kIGZvciBhc3NpZ24gcm9sZXMgdG8gdGFzayBkZXNjcmlwdG9yLiBJdCB3aWxsIGFzc2lnbiBhZGRpdGlvbmFsCi0gKiBwZXJmb3JtZXJzIGFuZCBhc3Npc3RlZCBieSB0byBhIHRhc2sgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IgZXh0ZW5kcyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0KLQlwcml2YXRlIExpc3Qgcm9sZXM7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBUYXNrRGVzY3JpcHRvciB0YXNrRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgaW50IGFjdGlvbjsKLQotCUxpc3QgZXhpc3RpbmdSb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlMaXN0IG5ld1JvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByaXZhdGUgYm9vbGVhbiBpc05ld1JvbGVEZXNjcmlwdG9yID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBBc3NpZ24gcm9sZSB0byB0YXNrIGRlc2NyaXB0b3IgVXNlZCBmb3IgYm90aCBhZGRpdGlvbmFsbHkgcGVyZm9ybWVkIGJ5Ci0JICogYW5kIGFzc2lzdGVkIGJ5Ci0JICovCi0JcHVibGljIEFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjLCBMaXN0IHJvbGVzLAotCQkJaW50IGFjdGlvbiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGFza0Rlc2MpKTsKLQotCQl0aGlzLnJvbGVzID0gcm9sZXM7Ci0JCXRoaXMudGFza0Rlc2MgPSB0YXNrRGVzYzsKLQkJdGhpcy5hY3Rpb24gPSBhY3Rpb247Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCXRhc2tEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQodGFza0Rlc2MpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCi0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHJvbGVzKSkKLQkJCXJldHVybjsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm9sZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJLy8gYm9vbGVhbiBkZXNjRXhpc3RzID0gZmFsc2U7Ci0JCQlSb2xlIHJvbGUgPSAoUm9sZSkgaXQubmV4dCgpOwotCi0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IG51bGw7Ci0JCQlpc05ld1JvbGVEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCQkvLyBjaGVjayBmb3IgbG9jYWwgZGVzY3JpcHRvcgotCQkJcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKHJvbGUsCi0JCQkJCWFjdGl2aXR5LCBjb25maWcpOwotCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkvLyBjaGVjayBmb3IgaW5oZXJpdGVkIGRlc2NyaXB0b3IKLQkJCQlyb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCQkuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcihyb2xlLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCQlyb2xlRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGUpOwotCQkJCQlpc05ld1JvbGVEZXNjcmlwdG9yID0gdHJ1ZTsKLQotCQkJCX0KLQkJCX0KLQkJCWlmIChpc05ld1JvbGVEZXNjcmlwdG9yKQotCQkJCW5ld1JvbGVEZXNjTGlzdC5hZGQocm9sZURlc2MpOwotCQkJZWxzZQotCQkJCWV4aXN0aW5nUm9sZURlc2NMaXN0LmFkZChyb2xlRGVzYyk7Ci0KLQkJCS8vIGdldCB0ZWFtCi0JCQlUZWFtUHJvZmlsZSB0ZWFtID0gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFRlYW0oYWN0aXZpdHksIHJvbGUpOwotCQkJaWYgKHRlYW0gIT0gbnVsbCkgewotCQkJCW1hcC5wdXQocm9sZURlc2MsIHRlYW0pOwotCQkJfQotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9BRERJVElPTkFMX1BFUkZPUk1FUikgewotCQkJdGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGRBbGwoZXhpc3RpbmdSb2xlRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGRBbGwobmV3Um9sZURlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FTU0lTVEVEX0JZKSB7Ci0JCQl0YXNrRGVzYy5nZXRBc3Npc3RlZEJ5KCkuYWRkQWxsKGV4aXN0aW5nUm9sZURlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldEFzc2lzdGVkQnkoKS5hZGRBbGwobmV3Um9sZURlc2NMaXN0KTsKLQkJfQotCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKG5ld1JvbGVEZXNjTGlzdCk7Ci0KLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQlTZXQga2V5c2V0ID0gbWFwLmtleVNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0ga2V5c2V0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBrZXkgPSBpdG9yLm5leHQoKTsKLQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBtYXAuZ2V0KGtleSk7Ci0KLQkJCQkvLyBhZGQgdG8gdGVhbQotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkuYWRkKChSb2xlRGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCi0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJLy8gYmFzaWNhbGx5IHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCXN1cGVyLnVuZG8oKTsKLQotCQlpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9BRERJVElPTkFMX1BFUkZPUk1FUikgewotCQkJdGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5yZW1vdmVBbGwoCi0JCQkJCWV4aXN0aW5nUm9sZURlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkucmVtb3ZlQWxsKG5ld1JvbGVEZXNjTGlzdCk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9BU1NJU1RFRF9CWSkgewotCQkJdGFza0Rlc2MuZ2V0QXNzaXN0ZWRCeSgpLnJlbW92ZUFsbChleGlzdGluZ1JvbGVEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRBc3Npc3RlZEJ5KCkucmVtb3ZlQWxsKG5ld1JvbGVEZXNjTGlzdCk7Ci0JCX0KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwobmV3Um9sZURlc2NMaXN0KTsKLQotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCVNldCBrZXlzZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBrZXlzZXQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGtleSA9IGl0b3IubmV4dCgpOwotCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIG1hcC5nZXQoa2V5KTsKLQotCQkJCS8vIHJlbW92ZSBpdCBmcm9tIHRlYW0KLQkJCQl0ZWFtLmdldFRlYW1Sb2xlcygpLnJlbW92ZSgoUm9sZURlc2NyaXB0b3IpIGtleSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQotCQlpZiAocm9sZXMgIT0gbnVsbCAmJiAhcm9sZXMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlpZiAodGFza0Rlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZCh0YXNrRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvRGVsaXZlcmFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb0RlbGl2ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2ZTY0NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvRGVsaXZlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIAotICogQ29tbWFuZCB0byBhc3NpZ24gZGVsaXZlcmFibGUgcGFydHMgdG8gd29yayBwcm9kdWN0IGRlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFzc2lnbldQVG9EZWxpdmVyYWJsZSBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdCB3b3JrUHJvZHVjdHM7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlMaXN0IGV4aXN0aW5nV1BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCUxpc3QgbmV3V1BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBc3NpZ25XUFRvRGVsaXZlcmFibGUoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYywgTGlzdCB3b3JrUHJvZHVjdHMpIHsKLQkJc3VwZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHdwRGVzYykpOwotCi0JCXRoaXMud29ya1Byb2R1Y3RzID0gd29ya1Byb2R1Y3RzOwotCQl0aGlzLndwRGVzYyA9IHdwRGVzYzsKLQotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50QWN0aXZpdHkod3BEZXNjKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCX0KLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgYWN0aXZpdHkgZm9yIGJyZWFrZG93bmVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gYnJFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFBhcmVudEFjdGl2aXR5KEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYnJFbGVtZW50LAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCUxpc3QgYnJlYWtkb3duRWxlbWVudHMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCi0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHdvcmtQcm9kdWN0cykpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHdvcmtQcm9kdWN0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlib29sZWFuIGRlc2NFeGlzdHMgPSBmYWxzZTsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBpdC5uZXh0KCk7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmV3V3BEZXNjID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnJlYWtkb3duRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgYnJlYWtkb3duRWxlbWVudHMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJbmV3V3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQkJV29ya1Byb2R1Y3QgZWxlbWVudFdQID0gbmV3V3BEZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCWlmICh3cC5lcXVhbHMoZWxlbWVudFdQKSkgewotCQkJCQkJLy8gaWYgZm91bmQgdW5kZXIgdGhlIHBhcmVudCBhY3Rpdml0eSwgcmV0dXJuIHRoYXQKLQkJCQkJCS8vIHdwZGVzY3JpcHRvcgotCQkJCQkJZGVzY0V4aXN0cyA9IHRydWU7Ci0KLQkJCQkJCWV4aXN0aW5nV1BEZXNjTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCi0JCQlpZiAoIWRlc2NFeGlzdHMpIHsKLQkJCQluZXdXUERlc2NMaXN0LmFkZChQcm9jZXNzVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3Iod3ApKTsKLQkJCX0KLQotCQkJLy8gZ2V0IGRlbGl2ZXJhYmxlCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJLmdldERlbGl2ZXJhYmxlKGFjdGl2aXR5LCB3cCk7Ci0JCQlpZiAoZGVsaXZlcmFibGUgIT0gbnVsbCkgewotCQkJCW1hcC5wdXQobmV3V3BEZXNjLCBkZWxpdmVyYWJsZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCS8vIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJLy8gYmFzaWNhbGx5IHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCXN1cGVyLnVuZG8oKTsKLQotCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLnJlbW92ZUFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLnJlbW92ZUFsbChuZXdXUERlc2NMaXN0KTsKLQotCQkvLyBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChuZXdXUERlc2NMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKHdvcmtQcm9kdWN0cyAhPSBudWxsICYmICAhd29ya1Byb2R1Y3RzLmlzRW1wdHkoKSkgewotCQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQkJfQotCQkJaWYgKHdwRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHdwRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb1JvbGVEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9Sb2xlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NGQ1NjQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb1JvbGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBhc3NpZ24gd29yayBwcm9kdWN0cyB0byByb2xlIGRlc2NyaXB0b3JzLiBJdCB3aWxsIHNldCByZXBvbnNpYmxlCi0gKiByb2xlIGZlYXR1cmUuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25XUFRvUm9sZURlc2NyaXB0b3IgZXh0ZW5kcyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0KLQlwcml2YXRlIExpc3Qgd29ya1Byb2R1Y3RzOwotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgUm9sZURlc2NyaXB0b3Igcm9sZURlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgaW50IGFjdGlvbjsKLQotCUxpc3QgZXhpc3RpbmdXUERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JTGlzdCBuZXdXUERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBc3NpZ25XUFRvUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3Igcm9sZURlc2MsIExpc3Qgd29ya1Byb2R1Y3RzLAotCQkJaW50IGFjdGlvbiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Mocm9sZURlc2MpKTsKLQotCQl0aGlzLndvcmtQcm9kdWN0cyA9IHdvcmtQcm9kdWN0czsKLQkJdGhpcy5yb2xlRGVzYyA9IHJvbGVEZXNjOwotCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJcm9sZURlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChyb2xlRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24od29ya1Byb2R1Y3RzKSkKLQkJCXJldHVybjsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd29ya1Byb2R1Y3RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBpdC5uZXh0KCk7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmV3V3BEZXNjID0gbnVsbDsKLQotCQkJYm9vbGVhbiBpc05ld0Rlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCS8vIGNoZWNrIGZvciBsb2NhbCBkZXNjcmlwdG9yCi0JCQluZXdXcERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJLmdldERlc2NyaXB0b3Iod3AsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJaWYgKG5ld1dwRGVzYyA9PSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGluaGVyaXRlZCBkZXNjcmlwdG9yCi0JCQkJbmV3V3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCQkuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcih3cCwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJaWYgKG5ld1dwRGVzYyA9PSBudWxsKSB7Ci0JCQkJCW5ld1dwRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCk7Ci0JCQkJCWlzTmV3RGVzY3JpcHRvciA9IHRydWU7Ci0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNOZXdEZXNjcmlwdG9yKQotCQkJCW5ld1dQRGVzY0xpc3QuYWRkKG5ld1dwRGVzYyk7Ci0JCQllbHNlCi0JCQkJZXhpc3RpbmdXUERlc2NMaXN0LmFkZChuZXdXcERlc2MpOwotCi0JCQkvLyBnZXQgZGVsaXZlcmFibGUKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkuZ2V0RGVsaXZlcmFibGUoYWN0aXZpdHksIHdwKTsKLQkJCWlmIChkZWxpdmVyYWJsZSAhPSBudWxsKSB7Ci0JCQkJbWFwLnB1dChuZXdXcERlc2MsIGRlbGl2ZXJhYmxlKTsKLQkJCX0KLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfUkVTUE9OU0lCTEVfRk9SKSB7Ci0JCQlyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpLmFkZEFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJcm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0KLQotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCVNldCBrZXlzZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBrZXlzZXQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGtleSA9IGl0b3IubmV4dCgpOwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBtYXAKLQkJCQkJCS5nZXQoa2V5KTsKLQotCQkJCS8vIGFkZCB0byBkZWxpdmVyYWJsZQotCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGtleSk7Ci0JCQl9Ci0JCX0KLQotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JCS8vIHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCXN1cGVyLnVuZG8oKTsKLQotCQlpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9SRVNQT05TSUJMRV9GT1IpIHsKLQkJCXJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkucmVtb3ZlQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQlyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpLnJlbW92ZUFsbChuZXdXUERlc2NMaXN0KTsKLQkJfQotCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJU2V0IGtleXNldCA9IG1hcC5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGtleXNldC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qga2V5ID0gaXRvci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG1hcAotCQkJCQkJLmdldChrZXkpOwotCi0JCQkJLy8gcmVtb3ZlIGl0IGZyb20gZGVsaXZlcmFibGUKLQkJCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpCi0JCQkJCQkucmVtb3ZlKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGtleSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKHdvcmtQcm9kdWN0cyAhPSBudWxsICYmICAhd29ya1Byb2R1Y3RzLmlzRW1wdHkoKSkgewotCQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQkJfQotCQkJaWYgKHJvbGVEZXNjLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocm9sZURlc2MuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9UYXNrRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWYzODlkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9UYXNrRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gYXNzaWduIHdvcmsgcHJvZHVjdHMgdG8gdGFzayBkZXNjcmlwdG9yLiBJdCB3aWxsIHNldCBleHRlcm5hbAotICogaW5wdXRzLCBtYW5kYXRvcnkgaW5wdXRzLCBvcHRpb25hbCBpbnB1dHMgYW5kIG91dHB1dHMuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IgZXh0ZW5kcyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0KLQlwcml2YXRlIExpc3Qgd29ya1Byb2R1Y3RzOwotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIGludCBhY3Rpb247Ci0KLQlwcml2YXRlIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCUxpc3QgZXhpc3RpbmdXUERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JTGlzdCBuZXdXUERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MsIExpc3Qgd29ya1Byb2R1Y3RzLAotCQkJaW50IGFjdGlvbiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRhc2tEZXNjKSk7Ci0KLQkJdGhpcy53b3JrUHJvZHVjdHMgPSB3b3JrUHJvZHVjdHM7Ci0JCXRoaXMudGFza0Rlc2MgPSB0YXNrRGVzYzsKLQkJdGhpcy5hY3Rpb24gPSBhY3Rpb247Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCXRhc2tEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQodGFza0Rlc2MpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHdvcmtQcm9kdWN0cykpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHdvcmtQcm9kdWN0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgaXQubmV4dCgpOwotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIG5ld1dwRGVzYyA9IG51bGw7Ci0KLQkJCWJvb2xlYW4gaXNOZXdEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCQkvLyBjaGVjayBmb3IgbG9jYWwgZGVzY3JpcHRvcgotCQkJbmV3V3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCS5nZXREZXNjcmlwdG9yKHdwLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCWlmIChuZXdXcERlc2MgPT0gbnVsbCkgewotCQkJCS8vIGNoZWNrIGZvciBpbmhlcml0ZWQgZGVzY3JpcHRvcgotCQkJCW5ld1dwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkJLmdldEluaGVyaXRlZERlc2NyaXB0b3Iod3AsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCWlmIChuZXdXcERlc2MgPT0gbnVsbCkgewotCQkJCQluZXdXcERlc2MgPSBQcm9jZXNzVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3Iod3ApOwotCQkJCQlpc05ld0Rlc2NyaXB0b3IgPSB0cnVlOwotCi0JCQkJfQotCQkJfQotCQkJaWYgKGlzTmV3RGVzY3JpcHRvcikKLQkJCQluZXdXUERlc2NMaXN0LmFkZChuZXdXcERlc2MpOwotCQkJZWxzZQotCQkJCWV4aXN0aW5nV1BEZXNjTGlzdC5hZGQobmV3V3BEZXNjKTsKLQotCQkJLy8gZ2V0IGRlbGl2ZXJhYmxlCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJLmdldERlbGl2ZXJhYmxlKGFjdGl2aXR5LCB3cCk7Ci0JCQlpZiAoZGVsaXZlcmFibGUgIT0gbnVsbCkgewotCQkJCW1hcC5wdXQobmV3V3BEZXNjLCBkZWxpdmVyYWJsZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCWlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0VYVEVSTkFMX0lOUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkuYWRkQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfTUFOREFUT1JZX0lOUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZEFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9PUFRJT05BTF9JTlBVVCkgewotCQkJdGFza0Rlc2MuZ2V0T3B0aW9uYWxJbnB1dCgpLmFkZEFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0T3B0aW9uYWxJbnB1dCgpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX09VVFBVVCkgewotCQkJdGFza0Rlc2MuZ2V0T3V0cHV0KCkuYWRkQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRPdXRwdXQoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0KLQotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCVNldCBrZXlzZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBrZXlzZXQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGtleSA9IGl0b3IubmV4dCgpOwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBtYXAKLQkJCQkJCS5nZXQoa2V5KTsKLQotCQkJCS8vIGFkZCB0byBkZWxpdmVyYWJsZQotCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGtleSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JCS8vIHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCXN1cGVyLnVuZG8oKTsKLQotCQlpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9FWFRFUk5BTF9JTlBVVCkgewotCQkJdGFza0Rlc2MuZ2V0RXh0ZXJuYWxJbnB1dCgpLnJlbW92ZUFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0RXh0ZXJuYWxJbnB1dCgpLnJlbW92ZUFsbChuZXdXUERlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX01BTkRBVE9SWV9JTlBVVCkgewotCQkJdGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKS5yZW1vdmVBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldE1hbmRhdG9yeUlucHV0KCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfT1BUSU9OQUxfSU5QVVQpIHsKLQkJCXRhc2tEZXNjLmdldE9wdGlvbmFsSW5wdXQoKS5yZW1vdmVBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldE9wdGlvbmFsSW5wdXQoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9PVVRQVVQpIHsKLQkJCXRhc2tEZXNjLmdldE91dHB1dCgpLnJlbW92ZUFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0T3V0cHV0KCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9Ci0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJU2V0IGtleXNldCA9IG1hcC5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGtleXNldC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qga2V5ID0gaXRvci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG1hcAotCQkJCQkJLmdldChrZXkpOwotCi0JCQkJLy8gcmVtb3ZlIGl0IGZyb20gZGVsaXZlcmFibGUKLQkJCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpCi0JCQkJCQkucmVtb3ZlKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGtleSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKHdvcmtQcm9kdWN0cyAhPSBudWxsICYmICAhd29ya1Byb2R1Y3RzLmlzRW1wdHkoKSkgewotCQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQkJfQotCQkJaWYgKHRhc2tEZXNjLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQodGFza0Rlc2MuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk5ZThjMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuSWRlbnRpdHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4cG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotCi0vKioKLSAqIEFic3RyYWN0IGRyYWcgYW5kIGRyb3AgY29tbWFuZCBmb3IgcHJvY2VzcyBhdXRob3JpbmcKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCU0RyYWdBbmREcm9wQ29tbWFuZCBleHRlbmRzIERyYWdBbmREcm9wQ29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIG9wZXJhdGlvbnMKLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQlNEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIE9iamVjdCBvd25lciwKLQkJCWZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmVEcm9wQ29weU9uKCkgewotCQlyZXR1cm4gcHJlcGFyZURyb3BMaW5rT24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlRHJvcExpbmtPbigpIHsKLQkJZHJhZ0NvbW1hbmQgPSBJZGVudGl0eUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCWRyb3BDb21tYW5kID0gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXJyYXlMaXN0IGFjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlvYmogPSBUbmdVdGlsLnVud3JhcChvYmopOwotCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoKEVPYmplY3QpIG93bmVyKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoYWNjZXB0KG9iaikpIHsKLQkJCQlsaXN0LmFkZChvYmopOwotCQkJfQotCQkJLy8gZWxzZSBpZihvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkvLyAvLyBkaXNhbGxvdyBkcm9wIGEgcHJvY2VzcyBhcyBhbiBhY3Rpdml0eQotCQkJLy8gfQotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkgJiYgb3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IHRhcmdldCA9IChBY3Rpdml0eSkgb3duZXI7Ci0JCQkJaWYgKERlcGVuZGVuY3lDaGVja2VyLm5ld0NoZWNrQWN0KSB7Ci0JCQkJCWlmICghIERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQKLQkJCQkJCQkodGFyZ2V0LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG9iaiksIHRydWUpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0JCQkJCQotCQkJCX0gZWxzZSBpZiAoIURlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KChBY3Rpdml0eSkgb2JqLCB0YXJnZXQpLmlzT0soKSl7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0vLwkJCQlQcm9jZXNzIHNyY1Byb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIG9iaik7Ci0vLwkJCQlQcm9jZXNzIHRhcmdldFByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGFyZ2V0KTsKLS8vCi0vLwkJCQlpZiAoIShzcmNQcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzICYmIHRhcmdldFByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikpIHsKLS8vCQkJCQlhY3RMaXN0LmFkZChvYmopOwotLy8JCQkJfQotCQkJCQotCQkJCS8vIG5vIG1vcmUgY2hlY2sgdG8gcHJldmVudCBhcHBseWluZyBhbiBhY3Rpdml0eSBvZiBhIGRlbGl2ZXJ5IHByb2Nlc3Mgb250byBhIGNhcGFiaWxpdHkgcGF0dGVyCi0JCQkJLy8gc2luY2UgaW50cm9kdWN0aW9uIG9mIGRlZXAtY29weS4gRGVlcCBjb3B5IGNhbiBhbHdheXMgYmUgYXBwbGllZCByZWdhcmRsZXNzIG9mIHNvdXJjZSBhbmQgdGFyZ2V0Ci0JCQkJLy8gcHJvY2Vzc2VzLgotCQkJCS8vCi0JCQkJYWN0TGlzdC5hZGQob2JqKTsKLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gcmVzdWx0OwotCQlpZiAobGlzdC5pc0VtcHR5KCkgJiYgYWN0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9IGVsc2UgewotCQkJQ29tcG91bmRDb21tYW5kIGNtZCA9IG5ldyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKCk7Ci0JCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJY21kLmFwcGVuZChjcmVhdGVEcm9wQ29tbWFuZChvd25lciwgbGlzdCkpOwotCQkJfQotCQkJaWYgKCFhY3RMaXN0LmlzRW1wdHkoKSkgewotCQkJCWlmIChvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCQljbWQuYXBwZW5kKG5ldyBBY3Rpdml0eURyb3BDb21tYW5kKChBY3Rpdml0eSkgb3duZXIsIGFjdExpc3QsCi0JCQkJCQlnZXRUYXJnZXRWaWV3ZXIoKSwgKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pZG9tYWluKS5nZXRBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCQl9Ci0JCQlkcm9wQ29tbWFuZCA9IGNtZDsKLQkJCXJlc3VsdCA9IGRyb3BDb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgVmlld2VyIGdldFRhcmdldFZpZXdlcigpIHsKLQkJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBvd25lcik7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9ICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pCi0JCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgKLQkJCQkJCSgoRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldENoYW5nZUxpc3RlbmVycygpKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNvbnRlbnRQcm92aWRlciAmJiBsaXN0ZW5lciBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewkJCQkJCi0JCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpIGxpc3RlbmVyKS5nZXRWaWV3ZXIoKTsKLQkJCQkJCWlmICh2aWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJCQkJJiYgKChQcm9jZXNzQ29tcG9uZW50KSB2aWV3ZXIuZ2V0SW5wdXQoKSkKLQkJCQkJCQkJCQkuZ2V0UHJvY2VzcygpID09IHByb2MpCi0JCQkJCQkJcmV0dXJuIHZpZXdlcjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKGRyb3BDb21tYW5kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSB7Ci0JCQlyZXR1cm4gKChJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIGRyb3BDb21tYW5kKS5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRyYWdBbmREcm9wQ29tbWFuZCNnZXRBZmZlY3RlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIGRyb3BDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpOwkJCi0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLCBMaXN0IGRyb3BTcmMpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0JTRHJvcENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQlNEcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NGZjZDE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQlNEcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQmF0Y2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBEcm9wQ29tbWFuZCBjbGFzcyBmb3IgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJTRHJvcENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2V0IERFRkFVTFRfU1lOQ0hfRkVBVFVSRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdCgKLQkJCW5ldyBFU3RydWN0dXJhbEZlYXR1cmVbXSB7Ci0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1N0ZXBzKCksCQkJCQotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkKLQkJCX0KLQkpKSk7Ci0JCi0JLyoqCi0JICogTWFwIG9mIGxpbmtlZCBlbGVtZW50J3MgZmVhdHVyZSB0byBkZXNjcmlwdG9yJ3MgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwIEZFQVRVUkVfTUFQID0gbmV3IEhhc2hNYXAoKTsKLQlzdGF0aWMgewotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCkpOwotLy8JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0ZWRNZXRob2RFbGVtZW50X0VzdGltYXRlKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVzdGltYXRlZE1ldGhvZEVsZW1lbnRfRXN0aW1hdGUoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCX0KLQotCXByb3RlY3RlZCBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByb3RlY3RlZCBMaXN0IGRyb3BFbGVtZW50czsKLQotCXByaXZhdGUgU2V0IG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJvdGVjdGVkIExpc3QgZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZzsKLQotCXByb3RlY3RlZCBTZXQgYWRkZWRPYmplY3RzOwotCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWRkZWRUb0RlZmF1bHRDb25maWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHN5bmNocm9uaXplID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IHRhc2tEZXNjTGlzdDsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgdGFza0Rlc2NyaXB0b3JzVG9VcGRhdGU7Ci0KLS8vCXByb3RlY3RlZCBTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2g7Ci0KLQkvKioKLQkgKiBNYXAgb2YgZGVzY3JpcHRvciB0byBvbGQgcmVmcmVzaGFibGUgZmVhdHVyZSBtYXAKLQkgKi8KLQlwcml2YXRlIE1hcCBkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwOwotCi0JLyoqCi0JICogTWFwIG9mIGRlc2NyaXB0b3IgdG8gbWFwIG9mIGZlYXR1cmUgdG8gbmV3IHZhbHVlcwotCSAqLwotLy8JcHJvdGVjdGVkIE1hcCBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwOwotLy8JcHJpdmF0ZSBIYXNoTWFwIGRlc2NyaXB0b3JUb09sZEZlYXR1cmVWYWx1ZXNNYXA7CQotCXByb3RlY3RlZCBEZXNjcmlwdG9yVXBkYXRlQmF0Y2hDb21tYW5kIGJhdGNoQ29tbWFuZDsKLQotLy8JcHJpdmF0ZSBIYXNoTWFwIHdwZFRvT2xkUmVzcG9uc2libGVSb2xlTWFwOwotCi0JLyoqCi0JICogTWFwIG9mIFRhc2tEZXNjcmlwdG9yIHRvIGxpc3Qgb2YgbmV3bHkgYWRkZWQgc3RlcHMKLQkgKi8KLQlwcml2YXRlIE1hcCB0YXNrRGVzY1RvTmV3U3RlcHNNYXA7Ci0KLQlwcml2YXRlIE1hcCB0YXNrRGVzY1RvT2xkRXN0aW1hdGVNYXA7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuY2VsZWQ7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJvdGVjdGVkIFNldCBzeW5jaEZlYXR1cmVzID0gREVGQVVMVF9TWU5DSF9GRUFUVVJFUzsKLQotCXByaXZhdGUgQmF0Y2hDb21tYW5kIHJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlZDsKLQotLy8JcHJvdGVjdGVkIE9iamVjdCBVSUNvbnRleHQ7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcnVuQXNKb2I7Ci0JCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0KLQlwcml2YXRlIGludCB3b3JrZWRVbml0czsKLQotCXByaXZhdGUgQXJyYXlMaXN0IG5lc3RlZENvbW1hbmRzOwotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogICAgICAgICAgICB0aGUgYWN0aXZpdHkgdGhhdCB0aGUgZ2l2ZW4gZWxlbWVudHMgYXJlIGRyb3BwZWQgb24KLQkgKiBAcGFyYW0gZHJvcEVsZW1lbnRzCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gZHJvcCBvbiB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKi8KLQlwdWJsaWMgQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBkcm9wRWxlbWVudHMpIHsKLQkJdGhpcyhhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBudWxsLCBudWxsLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN5bmNoCi0JICogICAgICAgICAgICBpZiB0cnVlLCB0aGUgY29tbWFuZCB3aWxsIGNsZWFuIHRoZSBjb250ZW50IGFuZCByZWxhdGlvbnNoaXBzCi0JICogICAgICAgICAgICBvZiBleGlzdGluZyBkZXNjcmlwdG9ycyBhbmQgcmVmcmVzaCB0aGVtIHdpdGggdGhlIGxpbmtlZAotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IGRyb3BFbGVtZW50cywgYm9vbGVhbiBzeW5jaCkgewotCQl0aGlzKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIG51bGwsIG51bGwsIHN5bmNoKTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgZ2l2ZW4gY29udGVudCBlbGVtZW50cyB0byBpdHMgVGFza0Rlc2NyaXB0b3JzIGluIHRoZQotCSAqIGdpdmVuIGFjdGl2aXR5IHVzaW5nIHRoZSBnaXZlbiBNZXRob2RDb25maWd1cmF0aW9uIGFuZCBsaXN0IG9mCi0JICogc3luY2hyb25pemFibGUgZmVhdHVyZXMuCi0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGRyb3BFbGVtZW50cwotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIHRvIHN5bmNocm9uaXplCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSBzeW5jaEZlYXR1cmVzCi0JICogICAgICAgICAgICB0aGUgc3luY2hyb25pemFibGUgZmVhdHVyZXMsIGlmIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBERUZBVUxUX1NZTkNIX0ZFQVRVUkVTIHdpbGwgYmUgdXNlZC4KLQkgKi8KLQlwdWJsaWMgQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBkcm9wRWxlbWVudHMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMpIHsKLQkJdGhpcyhhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBjb25maWcsIHN5bmNoRmVhdHVyZXMsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBkcm9wRWxlbWVudHMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMsIGJvb2xlYW4gc3luY2gpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQlwcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KTsKLQkJdGhpcy5zeW5jaHJvbml6ZSA9IHN5bmNoOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJaWYgKHN5bmNoRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJdGhpcy5zeW5jaEZlYXR1cmVzID0gREVGQVVMVF9TWU5DSF9GRUFUVVJFUzsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuc3luY2hGZWF0dXJlcyA9IHN5bmNoRmVhdHVyZXM7Ci0JCX0KLQkJCi0JCXRoaXMuZHJvcEVsZW1lbnRzID0gZHJvcEVsZW1lbnRzOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCWlmKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIG1vbml0b3I7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVEcm9wRWxlbWVudHMoKSB7Ci0JCQotCQlBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHJvcEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQllbGVtZW50ID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkucmVzb2x2ZShlbGVtZW50LCBjb25maWcpOwotCQkJaWYgKCFlbGVtZW50cy5jb250YWlucyhlbGVtZW50KQotCQkJCQkmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0ICYmICgoRU9iamVjdCkgZWxlbWVudCkKLQkJCQkJCQkuZUlzUHJveHkoKSkpIHsJCQkJCi0JCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWRyb3BFbGVtZW50cyA9IGVsZW1lbnRzOwotCX0KLQkKLS8vCS8qKgotLy8JICogU2V0cyBVSSBjb250ZXh0IGZvciB0aGlzIGNvbW1hbmQsIHRoaXMgY2FuIGJlIGEgU2hlbGwgb2JqZWN0Ci0vLwkgKiBAcGFyYW0gVUlDb250ZXh0Ci0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIHNldFVJQ29udGV4dChPYmplY3QgVUlDb250ZXh0KSB7Ci0vLwkJdGhpcy5VSUNvbnRleHQgPSBVSUNvbnRleHQ7Ci0vLwl9Ci0KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlpZihjb25maWcgPT0gbnVsbCkgewotCQkJY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQl9Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChkcm9wRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZHJvcEVsZW1lbnRzLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcgIT0gbnVsbCkgewotCQkJZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZy5jbGVhcigpOwotCQl9Ci0JCWlmIChhZGRlZE9iamVjdHMgIT0gbnVsbCkgewotCQkJYWRkZWRPYmplY3RzLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcC5jbGVhcigpOwotCQl9Ci0JCWlmICh0YXNrRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJdGFza0Rlc2NMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHRhc2tEZXNjVG9OZXdTdGVwc01hcCAhPSBudWxsKSB7Ci0JCQl0YXNrRGVzY1RvTmV3U3RlcHNNYXAuY2xlYXIoKTsKLQkJfQotCQlpZiAodGFza0Rlc2NUb09sZEVzdGltYXRlTWFwICE9IG51bGwpIHsKLQkJCXRhc2tEZXNjVG9PbGRFc3RpbWF0ZU1hcC5jbGVhcigpOwotCQl9Ci0JCWlmIChyZWZyZXNoUmVzcG9uc2libGVGb3JDb21tYW5kICE9IG51bGwpIHsKLQkJCXJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQuZGlzcG9zZSgpOwotCQl9Ci0JCWlmICh0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZSAhPSBudWxsKSB7Ci0JCQl0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZS5jbGVhcigpOwotCQl9Ci0JCWlmKGJhdGNoQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQliYXRjaENvbW1hbmQuZGlzcG9zZSgpOwotCQl9Ci0JCWFjdGl2aXR5ID0gcHJvY2VzcyA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYobmVzdGVkQ29tbWFuZHMgIT0gbnVsbCAmJiAhbmVzdGVkQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IoaW50IGkgPSBuZXN0ZWRDb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIG5lc3RlZENvbW1hbmRzLmdldChpKTsKLQkJCQlpZihjbWQgaW5zdGFuY2VvZiBJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNvbGxlY3Rpb24gcmVzb3VyY2VzID0gKChJUmVzb3VyY2VBd2FyZUNvbW1hbmQpY21kKS5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCQkJCQkJaWYocmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwocmVzb3VyY2VzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIGFsbCB0aGUgcmVmcmVzaGFibGUgZmVhdHVyZXMgb2YgdGhlIGdpdmVuIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjbGVhckRlc2NyaXB0b3IoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCVNldCBleGNsdWRlU3luY2hGZWF0dXJlcyA9IG5ldyBIYXNoU2V0KERFRkFVTFRfU1lOQ0hfRkVBVFVSRVMpOwotCQlleGNsdWRlU3luY2hGZWF0dXJlcy5yZW1vdmVBbGwoc3luY2hGZWF0dXJlcyk7Ci0JCVNldCBleGNsdWRlRmVhdHVyZXM7Ci0JCWlmIChleGNsdWRlU3luY2hGZWF0dXJlcy5pc0VtcHR5KCkpIHsKLQkJCWV4Y2x1ZGVGZWF0dXJlcyA9IGV4Y2x1ZGVTeW5jaEZlYXR1cmVzOwotCQl9Ci0JCWVsc2UgewotCQkJZXhjbHVkZUZlYXR1cmVzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGV4Y2x1ZGVTeW5jaEZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RGVzY3JpcHRvckZlYXR1cmUoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCkpOwotCQkJCWlmKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJCQlleGNsdWRlRmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlib29sZWFuIHJldCA9IFByb2Nlc3NDb21tYW5kVXRpbC5jbGVhckRlc2NyaXB0b3IoZGVzY3JpcHRvciwKLQkJCQlkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwLCBleGNsdWRlRmVhdHVyZXMpOwotCQlpZiAocmV0ICYmIGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJaWYgKHRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlID09IG51bGwpIHsKLQkJCQl0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCX0KLQkJCXRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlLmFkZChkZXNjcmlwdG9yKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXREZXNjcmlwdG9yRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgbGlua2VkRWxlbWVudEZlYXR1cmUpIHsKLQkJcmV0dXJuIChFU3RydWN0dXJhbEZlYXR1cmUpIEZFQVRVUkVfTUFQLmdldChsaW5rZWRFbGVtZW50RmVhdHVyZSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHByZUV4ZWN1dGUoKSB7Ci0JCXByZXBhcmVEcm9wRWxlbWVudHMoKTsKLQkJCi0JCWJvb2xlYW4gYiA9ICFkcm9wRWxlbWVudHMuaXNFbXB0eSgpOwotCQlpZiAoYikgewotLy8JCQlkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWJhdGNoQ29tbWFuZCA9IG5ldyBEZXNjcmlwdG9yVXBkYXRlQmF0Y2hDb21tYW5kKGZhbHNlLCBzeW5jaEZlYXR1cmVzLCBjb25maWcpOyAvL1RPRE86IHdoeSBjbGVhciBtdXN0IGJlIGZhbHNlID8/PwotCi0vLwkJCWlmIChzeW5jaHJvbml6ZSkgewotLy8JCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2ggPSBuZXcgSGFzaFNldCgpOwotLy8JCQl9Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGNvbGxlY3RFbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnKCkgewotCQlpZiAoZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZyA9PSBudWxsKSB7Ci0JCQllbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHJvcEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJc3dpdGNoIChVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tBZ2FpbnN0RGVmYXVsdENvbmZpZ3VyYXRpb24oCi0JCQkJCQlwcm9jZXNzLCBlbGVtZW50KSkgewotCQkJCWNhc2UgMDoKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQllbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnLmFkZChlbGVtZW50KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAtMToKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGVsZW1lbnRzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgZGVmYXVsdCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIG1vZGlmaWVkLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbigpIHsKLQkJaWYgKCFhZGRlZFRvRGVmYXVsdENvbmZpZyAmJiBlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnICE9IG51bGwgJiYgIWVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcuaXNFbXB0eSgpKSB7Ci0JCQlpZihhZGRlZE9iamVjdHMgPT0gbnVsbCkgewotCQkJCWFkZGVkT2JqZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGRlZE9iamVjdHMuY2xlYXIoKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcuaXRlcmF0b3IoKTsgaXRlcgotCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJUHJvY2Vzc1V0aWwuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jZXNzLCBlbGVtZW50LAotCQkJCQkJYWRkZWRPYmplY3RzKTsKLQkJCX0KLQkJCWlmICghYWRkZWRPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJCWdldE1vZGlmaWVkUmVzb3VyY2VzKCkuYWRkKAotCQkJCQkJcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpLmVSZXNvdXJjZSgpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWFkZGVkVG9EZWZhdWx0Q29uZmlnID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZ2V0VG90YWxXb3JrKCkgewotCQlyZXR1cm4gMjA7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHdvcmtlZChpbnQgdW5pdHNPZldvcmspIHsKLQkJbW9uaXRvci53b3JrZWQodW5pdHNPZldvcmspOwotCQl3b3JrZWRVbml0cyA9IHdvcmtlZFVuaXRzICsgdW5pdHNPZldvcms7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZ2V0UmVtYWluaW5nV29yaygpIHsKLQkJaW50IHJlbWFpbmluZyA9IGdldFRvdGFsV29yaygpIC0gd29ya2VkVW5pdHM7Ci0JCWlmKHJlbWFpbmluZyA8IDApIHsKLQkJCXJlbWFpbmluZyA9IDA7Ci0JCX0KLQkJcmV0dXJuIHJlbWFpbmluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVEZWZhdWx0Q29uZmlndXJhdGlvbk5lZWRlZCgpIHsKLQkJcmV0dXJuICFzeW5jaHJvbml6ZTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewkJCi0JCS8vIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCS8vCQkJCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gY2FuY2VsZWQgPSAhYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbigpOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIH0pOwotCQkvLwkJCi0JCS8vIC8vVE9ETzogVGhpcyBjYXVzZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gb3IgVGhyZWFkQWNjZXNzRXJyb3Igd2hlbgotCQkvLyBzaG93aW5nIHNlbGVjdGlvbiBkaWFsb2cgaXMgbmVlZGVkCi0JCS8vIC8vCi0JCS8vIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCS8vCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cwotCQkvLyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCS8vIGNhbmNlbGVkID0gIXByZUV4ZWN1dGUoKTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyB9OwotCQkvLyBVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBudWxsKTsKLQkJLy8JCQotCQkvLyBpZighY2FuY2VsZWQpIHsKLQkJLy8gQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJLy8JCQkJCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gcmVkbygpOwotCQkvLyB9Ci0JCS8vCQkJCQotCQkvLyB9KTsKLQkJLy8gfQotCi0vLwkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKLS8vCi0vLwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vCQkJCWlmICgoIXN5bmNocm9uaXplICYmIGFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oKSkgJiYgcHJlRXhlY3V0ZSgpKSB7Ci0vLwkJCQkJcmVkbygpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCX0pOwotCQkKLQkJaWYodXBkYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25OZWVkZWQoKSkgewotCQkJaWYoIWNvbGxlY3RFbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCWZpbmFsIFN0cmluZyB0YXNrTmFtZSA9IChsYWJlbCA9PSBudWxsID8gIiIgOiBsYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLmJlZ2luVGFzayh0YXNrTmFtZSwgZ2V0VG90YWxXb3JrKCkpOwotCQkJCQlCU0Ryb3BDb21tYW5kLnRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCQkJCXdvcmtlZChnZXRSZW1haW5pbmdXb3JrKCkgLyAzKTsKLQkJCQkJCi0JCQkJCS8vIHRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHByZUV4ZWN1dGUoKSB0byBhZGQgcmVxdWlyZWQgZWxlbWVudHMgdG8gY29uZmlndXJhdGlvbgotCQkJCQkvLyBzbyB0aGUgY29tbWFuZCBjYW4gcmVhbGl6ZSBkYXRhIGNvcnJlY3RseQotCQkJCQkvLwotCQkJCQlhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKCk7Ci0JCQkJCXdvcmtlZChnZXRSZW1haW5pbmdXb3JrKCkgLyAzKTsKLQkJCQkJCi0JCQkJCWlmIChwcmVFeGVjdXRlKCkpIHsKLQkJCQkJCXdvcmtlZChnZXRSZW1haW5pbmdXb3JrKCkgLyAzKTsKLQkJCQkJCXJlZG8oKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX07Ci0JCWlmKHJ1bkFzSm9iKSB7Ci0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuQXNKb2IocnVubmFibGUsIHRhc2tOYW1lKTsKLQkJfQotCQllbHNlIHsKLS8vCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bkluVUkocnVubmFibGUsIChTaGVsbCludWxsKTsKLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldE5lc3RlZENvbW1hbmRzKCkgewotCQlpZihuZXN0ZWRDb21tYW5kcyA9PSBudWxsKSB7Ci0JCQluZXN0ZWRDb21tYW5kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gbmVzdGVkQ29tbWFuZHM7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpIHsKLQkJTGlzdCBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzID0gRXh0ZW5zaW9uTWFuYWdlci5nZXROZXN0ZWRDb21tYW5kUHJvdmlkZXJzKCk7Ci0JCWlmKCFuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5pdGVyYXRvcigpOyBpdGVyCi0JCQkuaGFzTmV4dCgpOykgewotCQkJCUlOZXN0ZWRDb21tYW5kUHJvdmlkZXIgY21kUHJvdmlkZXIgPSAoSU5lc3RlZENvbW1hbmRQcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJQ29tbWFuZCBjbWQgPSBjbWRQcm92aWRlci5jcmVhdGVOZXN0ZWRDb21tYW5kKHRoaXMpOwotCQkJCQlpZihjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7CQkJCQkJCQotCQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQkJCWdldE5lc3RlZENvbW1hbmRzKCkuYWRkKGNtZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdW5kb05lc3RlZENvbW1hbmRzKCkgewotCQlpZihuZXN0ZWRDb21tYW5kcyAhPSBudWxsICYmICFuZXN0ZWRDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvcihpbnQgaSA9IG5lc3RlZENvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgbmVzdGVkQ29tbWFuZHMuZ2V0KGkpOwotCQkJCXRyeSB7Ci0JCQkJCWlmKGNtZC5jYW5VbmRvKCkpIHsKLQkJCQkJCWNtZC51bmRvKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJdHJ5IHsgY21kLmRpc3Bvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJCQl9Ci0JCQl9Ci0JCQluZXN0ZWRDb21tYW5kcy5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQl0cnkgewotCQkJLy8gYWRkIGVsZW1lbnRzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbmVlZGVkCi0JCQkvLwotCQkJYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbigpOwotCQkJCi0JCQlkb0V4ZWN1dGUoKTsKLQkJCXVwZGF0ZURlc2NyaXB0b3JzKCk7Ci0JCQkKLQkJCWV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpOwotCQkJCi0JCQlleGVjdXRlZCA9IHRydWU7Ci0JCX0KLQkJY2F0Y2goUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgZGVzY3JpcHRvcnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZXNjcmlwdG9ycygpIHsKLQkJaWYgKHN5bmNocm9uaXplKSB7Ci0JCQljbGVhckRlc2NyaXB0b3JzKCk7Ci0JCX0KLQotCQkvLyB1cGRhdGUgbmV3IHZhbHVlczsKLQkJLy8KLQkJYmF0Y2hDb21tYW5kLmV4ZWN1dGUoKTsKLQkJCi0JCXVwZGF0ZVRhc2tEZXNjcmlwdG9ycygpOwotCi0JCXNldFJlc3BvbnNpYmxlUm9sZXMoKTsKLQl9Ci0KLS8vCS8qKgotLy8JICogQHBhcmFtIGRlc2MKLS8vCSAqIEBwYXJhbSBmZWF0dXJlCi0vLwkgKiBAcGFyYW0gdmFsdWUKLS8vCSAqLwotLy8JcHJvdGVjdGVkIHZvaWQgc2F2ZU9sZEZlYXR1cmVWYWx1ZShEZXNjcmlwdG9yIGRlc2MsCi0vLwkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLwkJaWYgKGRlc2NyaXB0b3JUb09sZEZlYXR1cmVWYWx1ZXNNYXAgPT0gbnVsbCkgewotLy8JCQlkZXNjcmlwdG9yVG9PbGRGZWF0dXJlVmFsdWVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLS8vCQl9Ci0vLwkJT2JqZWN0IHZhbHVlID0gZGVzYy5lR2V0KGZlYXR1cmUpOwotLy8JCWlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLS8vCQkJdmFsdWUgPSBuZXcgQXJyYXlMaXN0KChMaXN0KXZhbHVlKTsKLS8vCQl9Ci0vLwkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBkZXNjcmlwdG9yVG9PbGRGZWF0dXJlVmFsdWVzTWFwLmdldChkZXNjKTsKLS8vCQlpZiAoZmVhdHVyZU1hcCA9PSBudWxsKSB7Ci0vLwkJCWZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotLy8JCQlkZXNjcmlwdG9yVG9PbGRGZWF0dXJlVmFsdWVzTWFwLnB1dChkZXNjLCBmZWF0dXJlTWFwKTsKLS8vCQl9Ci0vLwkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgdmFsdWUpOwotLy8JfQotCi0JcHJvdGVjdGVkIHZvaWQgdW5kb1VwZGF0ZURlc2NyaXB0b3JzKCkgewotCQl1bmRvU2V0UmVzcG9uc2libGVSb2xlKCk7Ci0KLQkJdW5kb1VwZGF0ZVRhc2tEZXNjcmlwdG9ycygpOwotCi0JCS8vIHJlc3RvcmUgb2xkIHZhbHVlcwotCQkvLwotCQliYXRjaENvbW1hbmQudW5kbygpOwotCi0JCS8vIHJlc3RvcmUgdmFsdWUgZm9yIHJlZnJlc2hhYmxlIGZlYXR1cmVzIHRoYXQgaGFkIGJlZW4gY2xlYXJlZAotCQkvLwotCQlpZiAoc3luY2hyb25pemUpIHsKLQkJCXVuZG9DbGVhckRlc2NyaXB0b3JzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJEZXNjcmlwdG9ycygpIHsKLQkJaWYgKGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlpZiAoIWJhdGNoQ29tbWFuZC5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGJhdGNoQ29tbWFuZC5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWNsZWFyRGVzY3JpcHRvcigoRGVzY3JpcHRvcikgaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCQkvLyBkZXNjcmlwdG9yc1RvUmVmcmVzaC5jbGVhcigpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBhZmZlY3RlZCB0YXNrIGRlc2NyaXB0b3JzIHdpdGggbmV3IGRhdGEgZnJvbSBtZXRob2QgY29udGVudAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVUYXNrRGVzY3JpcHRvcnMoKSB7Ci0JCWlmICh0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZSAhPSBudWxsKSB7Ci0JCQkvLyByZWZyZXNoIHN0ZXBzIGZyb20gdGhlIGFzc29jaWF0ZWQgdGFzawotCQkJLy8KLQkJCWlmKHN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpKSkgewotCQkJCWlmICh0YXNrRGVzY1RvTmV3U3RlcHNNYXAgPT0gbnVsbCkgewotCQkJCQl0YXNrRGVzY1RvTmV3U3RlcHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCX0KLQkJCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycwotCQkJCS5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJCVRhc2sgdGFzayA9IHRhc2tEZXNjLmdldFRhc2soKTsKLQkJCQkJaWYgKHRhc2sgIT0gbnVsbCAmJiAhKChFT2JqZWN0KSB0YXNrKS5lSXNQcm94eSgpKSB7Ci0JCQkJCQlMaXN0IHN0ZXBzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKHRhc2sKLQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCB0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCksIGNvbmZpZyk7Ci0JCQkJCQkKLQkJCQkJCS8vIGFkZCB0aG9zZSBzdGVwcyB0byBUYXNrRGVzY3JpcHRvciBpZiB0aGV5IGFyZSBub3QgdGhlcmUKLQkJCQkJCS8vIHlldC4KLQkJCQkJCS8vCi0JCQkJCQlBcnJheUxpc3QgbmV3U3RlcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQl0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkucmV0YWluQWxsKHN0ZXBzKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBzdGVwcy5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IHN0ZXAgPSBpdGVyMS5uZXh0KCk7Ci0JCQkJCQkJaWYgKCF0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuY29udGFpbnMoc3RlcCkpIHsKLQkJCQkJCQkJbmV3U3RlcHMuYWRkKHN0ZXApOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICghbmV3U3RlcHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLmFkZEFsbChuZXdTdGVwcyk7Ci0JCQkJCQkJdGFza0Rlc2NUb05ld1N0ZXBzTWFwLnB1dCh0YXNrRGVzYywgbmV3U3RlcHMpOwotLy8JCQkJCQkJU3lzdGVtLm91dAotLy8JCQkJCQkJLnByaW50bG4oIkJTRHJvcENvbW1hbmQudXBkYXRlVGFza0Rlc2NyaXB0b3JzKCk6IGNoYW5nZWQiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuZG9VcGRhdGVUYXNrRGVzY3JpcHRvcnMoKSB7Ci0JCWlmICh0YXNrRGVzY1RvTmV3U3RlcHNNYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFza0Rlc2NUb05ld1N0ZXBzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQl0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkucmVtb3ZlQWxsKAotCQkJCQkJKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR28gdGhydSBhbGwgdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBvZiB0aGlzIGFjdGl2aXR5IGFuZCBzZXQgdGhlCi0JICogcmVzcG9uc2libGUgcm9sZSBmb3IgdGhlbSBpZiB0aGVyZSBpcyBhbnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0UmVzcG9uc2libGVSb2xlcygpIHsKLQkJaWYoIXN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZihyZWZyZXNoUmVzcG9uc2libGVGb3JDb21tYW5kICE9IG51bGwpIHsKLQkJCXJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQuZGlzcG9zZSgpOwotCQl9Ci0JCXJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQgPSBuZXcgQmF0Y2hDb21tYW5kKHRydWUpOwotIAotCQlMaXN0IGJyRWxlbWVudHMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlMaXN0IHdwRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgcm9sZURlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBickVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCXdwRGVzY0xpc3QuYWRkKG9iaik7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJcm9sZURlc2NyaXB0b3JzLmFkZChvYmopOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm9sZURlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0b3IubmV4dCgpOwotCQkJUm9sZSByb2xlID0gcm9sZURlc2MuZ2V0Um9sZSgpOwotCQkJaWYgKHJvbGUgIT0gbnVsbCkgewkJCQkKLQkJCQlMaXN0IHJlc3BvbnNpYmxlV29ya1Byb2R1Y3RzID0gKExpc3QpIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldFJlZmVyZW5jZShyb2xlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIGNvbmZpZyk7Ci0JCQkJTGlzdCByZXNwb25zaWJsZVdQRExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaiA9IHdwRGVzY0xpc3Quc2l6ZSgpIC0gMTsgaiA+IC0xOyBqLS0pIHsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHdwRGVzY0xpc3QKLQkJCQkJCQkuZ2V0KGopOwotLy8JCQkJCVJvbGVEZXNjcmlwdG9yIHJlc3BvbnNpYmxlUm9sZURlc2MgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9yKHdwRGVzYyk7Ci0vLwkJCQkJaWYgKHJlc3BvbnNpYmxlV29ya1Byb2R1Y3RzLmNvbnRhaW5zKHdwRGVzYwotLy8JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCkpCi0vLwkJCQkJCQkmJiAgcmVzcG9uc2libGVSb2xlRGVzYyAhPSByb2xlRGVzYykgewotLy8JCQkJCQl3cGRUb09sZFJlc3BvbnNpYmxlUm9sZU1hcC5wdXQod3BEZXNjLCByZXNwb25zaWJsZVJvbGVEZXNjKTsKLS8vLy8JCQkJCQl3cERlc2Muc2V0UmVzcG9uc2libGVSb2xlKHJvbGVEZXNjKTsKLS8vCQkJCQkJcm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQod3BEZXNjKTsKLS8vCQkJCQl9Ci0JCQkJCQotCQkJCQlpZihyZXNwb25zaWJsZVdvcmtQcm9kdWN0cy5jb250YWlucyh3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKSkpIHsKLQkJCQkJCXJlc3BvbnNpYmxlV1BETGlzdC5hZGQod3BEZXNjKTsKLQkJCQkJfQotCQkJCX0JCQkJCi0JCQkJaWYoIXJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkuZXF1YWxzKHJlc3BvbnNpYmxlV1BETGlzdCkpIHsKLQkJCQkJcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZC5hZGRGZWF0dXJlVmFsdWVzKHJvbGVEZXNjLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpLCByZXNwb25zaWJsZVdQRExpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZC5leGVjdXRlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXVuZG9OZXN0ZWRDb21tYW5kcygpOwotCQkKLQkJLy8gcmVtb3ZlIGFueSBvYmplY3QgdGhhdCBoYWQgYmVlbiBhZGRlZCB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JCS8vCi0JCWlmIChhZGRlZE9iamVjdHMgIT0gbnVsbCAmJiAhYWRkZWRPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRlZE9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkucmVtb3ZlKGVsZW1lbnQpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJYWRkZWRUb0RlZmF1bHRDb25maWcgPSBmYWxzZTsKLQkJfQotCi0JCXVuZG9VcGRhdGVEZXNjcmlwdG9ycygpOwotCi0JCWRvVW5kbygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB1bmRvQ2xlYXJEZXNjcmlwdG9ycygpIHsKLQkJaWYoZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwLmVudHJ5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlkZXNjCi0JCQkJCS5lU2V0KChFU3RydWN0dXJhbEZlYXR1cmUpIGVudHJ5LmdldEtleSgpLCBlbnRyeQotCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVbmRvZXMgdGhlIGNoYW5nZSBtYWRlIGJ5Ci0JICoge0BsaW5rICNzZXRSZXNwb25zaWJsZVJvbGVzKCkgc2V0UmVzcG9uc2libGVSb2xlcygpIH0KLQkgKi8KLQlwcml2YXRlIHZvaWQgdW5kb1NldFJlc3BvbnNpYmxlUm9sZSgpIHsKLS8vCQlpZih3cGRUb09sZFJlc3BvbnNpYmxlUm9sZU1hcCAhPSBudWxsICYmICF3cGRUb09sZFJlc3BvbnNpYmxlUm9sZU1hcC5pc0VtcHR5KCkpIHsKLS8vCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9PbGRSZXNwb25zaWJsZVJvbGVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0vLwkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLS8vCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeS5nZXRLZXkoKTsKLS8vCQkJCSgoUm9sZURlc2NyaXB0b3IpIGVudHJ5LmdldFZhbHVlKCkpLmdldFJlc3BvbnNpYmxlRm9yKCkucmVtb3ZlKHdwZCk7Ci0vLwkJCX0KLS8vCQl9Ci0JCWlmKHJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQgIT0gbnVsbCkgewotCQkJcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZC51bmRvKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9FeGVjdXRlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1VuZG8oKTsKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIElFeGVjdXRvciB7Ci0JCWJvb2xlYW4gcHJlRXhlY3V0ZSgpOwotCi0JCXZvaWQgZG9FeGNlY3V0ZSgpOwotCi0JCXZvaWQgZG9VbmRvKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQmFzaWNTeW5jaHJvbml6ZURlc2NyaXB0b3JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhYjViZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgNy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQKLQkJaW1wbGVtZW50cyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2V0IE5PTkVNUFRZX0FUVFJJQlVURVMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KAotCQkJbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHsKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKQotCQkJfQotCSkpOwotCQotCi0JcHJvdGVjdGVkIERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQlwcm90ZWN0ZWQgU2V0IHN5bmNoRmVhdHVyZXM7Ci0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByaXZhdGUgSGFzaE1hcCBmZWF0dXJlTWFwOwotCi0JcHVibGljIEJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZChEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldCBzeW5jaEZlYXR1cmVzLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCQlpZiAoc3luY2hGZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBCU0Ryb3BDb21tYW5kLkRFRkFVTFRfU1lOQ0hfRkVBVFVSRVM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBzeW5jaEZlYXR1cmVzOwotCQl9Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYoZGVzY3JpcHRvci5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChkZXNjcmlwdG9yLmVSZXNvdXJjZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmVPbGRGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmVNYXAgPT0gbnVsbCkgewotCQkJZmVhdHVyZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgZGVzY3JpcHRvci5lR2V0KGZlYXR1cmUpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbGlua2VkIGVsZW1lbnQgaWYgcmVxdWlyZWQKLQkJLy8KLQkJTWV0aG9kRWxlbWVudCBlID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCU9iamVjdCByZXNvbHZlZCA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLnJlc29sdmUoZSwgY29uZmlnKTsKLQkJaWYocmVzb2x2ZWQgIT0gZSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0JCQlpZihkZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpOwkJCQkJCi0JCQl9Ci0JCQllbHNlIGlmKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCk7CQkJCQkKLQkJCX0KLQkJCWVsc2UgaWYoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKTsJCQkJCQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZmVhdHVyZSA9IG51bGw7Ci0JCQl9Ci0JCQlzYXZlT2xkRmVhdHVyZVZhbHVlKGZlYXR1cmUpOwotCQkJZSA9IChNZXRob2RFbGVtZW50KSByZXNvbHZlZDsKLQkJCWRlc2NyaXB0b3IuZVNldChmZWF0dXJlLCBlKTsKLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3luY2hGZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBmID0gaXRlci5uZXh0KCk7Ci0JCQlpZihmIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgewotCQkJCUVBdHRyaWJ1dGUgYXR0cmliID0gKEVBdHRyaWJ1dGUpIGY7IAotCQkJCUVBdHRyaWJ1dGUgZGVzY0F0dHJpYiA9IChFQXR0cmlidXRlKSBCU0Ryb3BDb21tYW5kLkZFQVRVUkVfTUFQLmdldChhdHRyaWIpOwotCQkJCWlmKGRlc2NBdHRyaWIgIT0gbnVsbCkgewotCQkJCQlpZihOT05FTVBUWV9BVFRSSUJVVEVTLmNvbnRhaW5zKGF0dHJpYikpIHsKLQkJCQkJCS8vIHJlZnJlc2ggYXR0cmlidXRlIHRoYXQgY2FuIG5vdCBiZSBlbXB0eQotCQkJCQkJLy8KLQkJCQkJCU9iamVjdCB2YWx1ZSA9ICBlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ID8gCi0JCQkJCQkJCShTdHJpbmcpIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldEF0dHJpYnV0ZSgoVmFyaWFiaWxpdHlFbGVtZW50KSBlLCBhdHRyaWIsIGNvbmZpZykgCi0JCQkJCQkJCTogZS5lR2V0KGF0dHJpYik7Ci0JCQkJCQkvLyBpZiBhdHRyaXVidXRlIGlzIHByZXNlbnRhdGlvbiBuYW1lIGFuZCBuZXcgdmFsdWUgaXMgYmxhbmssIGNvcHkgbmFtZSBvdmVyCi0JCQkJCQlpZiAoKGRlc2NBdHRyaWIuZXF1YWxzKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpKSAmJiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5lcXVhbHMoIiIpKSkKLQkJCQkJCQl2YWx1ZSA9IGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgPyAKLQkJCQkJCQkJCShTdHJpbmcpIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldEF0dHJpYnV0ZSgoVmFyaWFiaWxpdHlFbGVtZW50KSBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBjb25maWcpIAotCQkJCQkJCQkJOiBlLmVHZXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQkJCQlPYmplY3QgZGVzY1ZhbHVlID0gZGVzY3JpcHRvci5lR2V0KGRlc2NBdHRyaWIpOwotCQkJCQkKLQkJCQkJCWlmKCh2YWx1ZSA9PSBudWxsICYmIGRlc2NWYWx1ZSAhPSBudWxsKSB8fCAodmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuZXF1YWxzKGRlc2NWYWx1ZSkpKSB7Ci0JCQkJCQkJc2F2ZU9sZEZlYXR1cmVWYWx1ZShkZXNjQXR0cmliKTsKLQkJCQkJCQlkZXNjcmlwdG9yLmVTZXQoZGVzY0F0dHJpYiwgdmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gcmVzZXQgYXR0cmlidXRlIHRvIGl0cyBkZWZhdWx0IHZhbHVlCi0JCQkJCQkvLwotCQkJCQkJc2F2ZU9sZEZlYXR1cmVWYWx1ZShkZXNjQXR0cmliKTsKLQkJCQkJCWRlc2NyaXB0b3IuZVNldChkZXNjQXR0cmliLCBkZXNjQXR0cmliLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmKGZlYXR1cmVNYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBlbnRyeQotCQkJCS5nZXRLZXkoKTsKLQkJCQl0cnkgewotCQkJCQlkZXNjcmlwdG9yLmVTZXQoZmVhdHVyZSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJCWNhdGNoKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0JCi0JCQlmZWF0dXJlTWFwLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihmZWF0dXJlTWFwICE9IG51bGwpIHsKLQkJCWZlYXR1cmVNYXAuY2xlYXIoKTsKLQkJCWZlYXR1cmVNYXAgPSBudWxsOwotCQl9CQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ29udHJpYnV0ZVRvQWN0aXZpdHlDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0NvbnRyaWJ1dGVUb0FjdGl2aXR5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYjg1MmE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ29udHJpYnV0ZVRvQWN0aXZpdHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDEwLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cmlidXRlVG9BY3Rpdml0eUNvbW1hbmQgZXh0ZW5kcyBWYXJ5QWN0aXZpdHlDb21tYW5kIHsKLQotCS8qKgotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICovCi0JcHVibGljIENvbnRyaWJ1dGVUb0FjdGl2aXR5Q29tbWFuZCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJc3VwZXIod3JhcHBlcik7Ci0JCXNldExhYmVsKExpYnJhcnlFZGl0UmVzb3VyY2VzLmNvbnRyaWJ1dGVUb0FjdGl2aXR5X3RleHQpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuVmFyeUFjdGl2aXR5Q29tbWFuZCNkb1ZhcnkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVmFyeSgpIHsKLQkJUHJvY2Vzc1V0aWwuY29udHJpYnV0ZVRvQWN0aXZpdHkod3JhcHBlciwgY3JlYXRlZEFjdGl2aXRpZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Db3B5SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0NvcHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODc2NmVmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0NvcHlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotcHVibGljIGNsYXNzIENvcHlIZWxwZXIgZXh0ZW5kcyBDb3B5Q29tbWFuZC5IZWxwZXIgewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTI2NDM4OTM5Mzk1NTYzOTAwNEw7Ci0KLQlwcml2YXRlIE1hcCBjb3B5VG9PcmlnaW5hbE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBNYXAgYmFzZVRvVmFyaWFiaWxpdHlFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIE1hcCBiYXNlVG9CYWNrdXBWYXJpYWJpbGl0eUVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEudXRpbC5IYXNoTWFwI2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsJCQotCQlzdXBlci5jbGVhcigpOwotCQljb3B5VG9PcmlnaW5hbE1hcC5jbGVhcigpOwotCQliYXNlVG9CYWNrdXBWYXJpYWJpbGl0eUVsZW1lbnRNYXAuY2xlYXIoKTsKLQkJYmFzZVRvVmFyaWFiaWxpdHlFbGVtZW50TWFwLmNsZWFyKCk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0T3JpZ2luYWwoT2JqZWN0IGNvcHkpIHsKLQkJcmV0dXJuIGNvcHlUb09yaWdpbmFsTWFwLmdldChjb3B5KTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBwdXRWYXJpYWJpbGl0eUVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UsIFZhcmlhYmlsaXR5RWxlbWVudCB2ZSkgewotCQlyZXR1cm4gYmFzZVRvVmFyaWFiaWxpdHlFbGVtZW50TWFwLnB1dChiYXNlLCB2ZSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgcmVtb3ZlVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCBiYXNlKSB7Ci0JCXJldHVybiBiYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAucmVtb3ZlKGJhc2UpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IHB1dEJhY2t1cENvcHkoVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UsIFZhcmlhYmlsaXR5RWxlbWVudCBiYWNrdXApIHsKLQkJcmV0dXJuIGJhc2VUb0JhY2t1cFZhcmlhYmlsaXR5RWxlbWVudE1hcC5wdXQoYmFzZSwgYmFja3VwKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlciNwdXQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJY29weVRvT3JpZ2luYWxNYXAucHV0KHZhbHVlLCBrZXkpOwotCQlyZXR1cm4gc3VwZXIucHV0KGtleSwgdmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGJhc2ljUHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlPYmplY3Qgb2xkID0gc3VwZXIucHV0KGtleSwgdmFsdWUpOwotCQlpbml0aWFsaXphdGlvbkxpc3QucmVtb3ZlKGtleSk7Ci0JCXJldHVybiBvbGQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyI2dldENvcHkob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0Q29weShFT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCU9iamVjdCB2ZSA9IGdldFZhcmlhYmlsaXR5RWxlbWVudChiYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAsIG9iamVjdCk7Ci0JCQlpZih2ZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldENvcHkoKEVPYmplY3QpIHZlKTsKLQkJCX0KLQkJfQotCQlFT2JqZWN0IGNvcHkgPSBzdXBlci5nZXRDb3B5KG9iamVjdCk7Ci0JCWlmKGNvcHkgPT0gbnVsbCkgewotCQkJLy8gZ2V0IGJhY2t1cCBjb3B5Ci0JCQkvLwotCQkJT2JqZWN0IHZlID0gZ2V0VmFyaWFiaWxpdHlFbGVtZW50KGJhc2VUb0JhY2t1cFZhcmlhYmlsaXR5RWxlbWVudE1hcCwgb2JqZWN0KTsKLQkJCWlmKHZlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0Q29weSgoRU9iamVjdCkgdmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb3B5OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0VmFyaWFiaWxpdHlFbGVtZW50KE1hcCBiYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAsIE9iamVjdCBiYXNlKSB7Ci0JCU9iamVjdCB2ZSA9IG51bGw7CQkKLQkJZG8gewotCQkJYmFzZSA9IGJhc2VUb1ZhcmlhYmlsaXR5RWxlbWVudE1hcC5nZXQoYmFzZSk7Ci0JCQlpZihiYXNlICE9IG51bGwpIHsKLQkJCQl2ZSA9IGJhc2U7Ci0JCQl9Ci0JCX0gd2hpbGUgKGJhc2UgIT0gbnVsbCk7Ci0JCXJldHVybiB2ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXIjZ2V0Q29weVRhcmdldChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRDb3B5VGFyZ2V0KEVPYmplY3QgdGFyZ2V0LCBib29sZWFuIGNvcHlSZXF1aXJlZCkgewotCQlpZihjb3B5UmVxdWlyZWQpIHsKLQkJCXJldHVybiBzdXBlci5nZXRDb3B5KHRhcmdldCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFT2JqZWN0IGNvcGllZCA9IGdldENvcHkodGFyZ2V0KTsKLQkJCWlmIChjb3BpZWQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXR1cm4gdGFyZ2V0OwotCQkJfQotCQkJcmV0dXJuIGNvcGllZDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTWFwIGdldE9iamVjdFRvQ29weU1hcCgpIHsKLQkJSGFzaFNldCBvYmplY3RzID0gbmV3IEhhc2hTZXQoYmFzZVRvQmFja3VwVmFyaWFiaWxpdHlFbGVtZW50TWFwLmtleVNldCgpKTsKLQkJb2JqZWN0cy5hZGRBbGwoYmFzZVRvVmFyaWFiaWxpdHlFbGVtZW50TWFwLmtleVNldCgpKTsKLQkJb2JqZWN0cy5hZGRBbGwoa2V5U2V0KCkpOwkJCi0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJbWFwLnB1dChvYmplY3QsIGdldENvcHkoKEVPYmplY3QpIG9iamVjdCkpOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmRhZjJmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0NyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlVzZXJJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBFeGVjdXRlcyB0aGUgQ3JlYXRlIFByb2Nlc3MgQ29tcG9uZW50IGNvbW1hbmQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZCBleHRlbmRzIENyZWF0ZUNoaWxkQ29tbWFuZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEVDTEFTU0VTID0gbmV3IEhhc2hTZXQoKTsKLQotCXByaXZhdGUgUHJvY2VzcyBwcm9jZXNzOwotCi0JcHJpdmF0ZSBJU3RhdHVzIHN0YXR1czsKLQotCXN0YXRpYyB7Ci0JCUVDTEFTU0VTLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCkpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBDb21wYXJlQnlOYW1lIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgewotCQkJU3RyaW5nIG5hbWUxID0gKChNZXRob2RFbGVtZW50KSBvYmoxKS5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgbmFtZTIgPSAoKE1ldGhvZEVsZW1lbnQpIG9iajIpLmdldE5hbWUoKTsKLQkJCXJldHVybiBuYW1lMS5jb21wYXJlVG9JZ25vcmVDYXNlKG5hbWUyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBDb25maWdWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLQotCQlwdWJsaWMgSVN0YXR1cyBpc1ZhbGlkKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogPT0gbnVsbCkgewotCQkJCVN0cmluZyBtc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5ub0RlZmF1bHRDb25maWdFcnJvcl9tc2c7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0SWQoKSwgMCwgbXNnLCBudWxsKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgY2hpbGQsIGludCBpbmRleCwKLQkJCUNvbGxlY3Rpb24gc2VsZWN0aW9uLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNoaWxkLCBpbmRleCwgc2VsZWN0aW9uLCBoZWxwZXIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShvd25lcik7Ci0JCQotCQlTaGVsbCBzaGVsbCA9IE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKTsKLQkJCi0JCS8vIFRoZSBvd25lciBtdXN0IGJlIHVwZGF0YWJsZS4KLQkJLy8KLQkJc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KG93bmVyLCBzaGVsbCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBjb25maWdzID0gbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQlMaXN0IG1ldGhvZENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHkpKSB7Ci0JCQkJbWV0aG9kQ29uZmlncy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobWV0aG9kQ29uZmlncy5pc0VtcHR5KCkpIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkJCTAsIExpYnJhcnlFZGl0UmVzb3VyY2VzLm5vQ29uZmlnRXJyb3JfbXNnLCBudWxsKTsKLQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNyZWF0ZVByb2Nlc3NfdGV4dCwKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMubm9Db25maWdFcnJvcl9tc2cpOwkJCQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikgaGVscGVyOwotCi0JCUxpc3QgcHJvY0NsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChhZGFwdGVyLmdldFByb2Nlc3NUeXBlKCkgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSkgewotCQkJcHJvY0NsYXNzZXMuYWRkKERlbGl2ZXJ5UHJvY2Vzcy5jbGFzcyk7Ci0JCQlwcm9jQ2xhc3Nlcy5hZGQoQ2FwYWJpbGl0eVBhdHRlcm4uY2xhc3MpOwotCQl9Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRWxlbWVudCkgb3duZXIpOwkJCi0JCUxpc3QgYmFzZVByb2NMaXN0ID0gVG5nVXRpbC5nZXRBdmFpbGFibGVCYXNlUHJvY2Vzc2VzKHBsdWdpbiwKLQkJCQlwcm9jQ2xhc3Nlcyk7Ci0KLQkJLy8gc29ydCBieSBuYW1lCi0JCUNvbGxlY3Rpb25zLnNvcnQobWV0aG9kQ29uZmlncywgbmV3IENvbXBhcmVCeU5hbWUoKSk7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIHByb2NDdHhzID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25bbWV0aG9kQ29uZmlncwotCQkJCS5zaXplKCldOwotCQltZXRob2RDb25maWdzLnRvQXJyYXkocHJvY0N0eHMpOwotCi0JCVByb2Nlc3NbXSBiYXNlUHJvY2Vzc2VzID0gbmV3IFByb2Nlc3NbYmFzZVByb2NMaXN0LnNpemUoKV07Ci0JCWJhc2VQcm9jTGlzdC50b0FycmF5KGJhc2VQcm9jZXNzZXMpOwotCi0JCWZpbmFsIFByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgY2hpbGQ7Ci0JCUVDbGFzcyBwcm9jVHlwZSA9IGFkYXB0ZXIuZ2V0UHJvY2Vzc1R5cGUoKTsKLQkJcHJvY0NvbXAuc2V0UHJvY2VzcygoUHJvY2VzcykgVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKHByb2NUeXBlKSk7Ci0JCQotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCUxpc3QgdXNlcklucHV0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZhbGlkYXRvciBuYW1lVmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlTmFtZVZhbGlkYXRvcigKLQkJCQlvd25lciwgcHJvY0NvbXApOwotCQkvLyBuYW1lCi0JCVVzZXJJbnB1dCBuYW1lSW5wdXQgPSBuZXcgVXNlcklucHV0KExpYnJhcnlFZGl0UmVzb3VyY2VzLm5hbWVMYWJlbF90ZXh0LCBVc2VySW5wdXQuVEVYVCwKLQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbmFtZVZhbGlkYXRvciwgbnVsbCk7Ci0JCXVzZXJJbnB1dHMuYWRkKG5hbWVJbnB1dCk7Ci0JCQotCQkvLyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkJLy8KLQkJVXNlcklucHV0IGRlZmF1bHRDb25maWdJbnB1dCA9IG5ldyBVc2VySW5wdXQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVmYXVsdENvbmZpZ0xhYmVsX3RleHQsIFVzZXJJbnB1dC5TRUxFQ1RJT04sCi0JCQkJZmFsc2UsIG1ldGhvZENvbmZpZ3MsIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfSwgbmV3IENvbmZpZ1ZhbGlkYXRvcigpLCBudWxsKTsKLQkJdXNlcklucHV0cy5hZGQoZGVmYXVsdENvbmZpZ0lucHV0KTsKLQkJLy8gYmFzZSBwcm9jZXNzCi0JCVVzZXJJbnB1dCBiYXNlUHJvY0lucHV0ID0gbnVsbDsKLQkJCi0JCWlmKHByb2NDb21wLmdldFByb2Nlc3MoKSBpbnN0YW5jZW9mIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKSB7Ci0JCQliYXNlUHJvY0lucHV0ID0gbmV3IFVzZXJJbnB1dChMaWJyYXJ5RWRpdFJlc291cmNlcy5iYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dCwgVXNlcklucHV0LlNFTEVDVElPTiwKLQkJCQkJdHJ1ZSwgYmFzZVByb2NMaXN0LCBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSwgIG51bGwpOwotCQkJdXNlcklucHV0cy5hZGQoYmFzZVByb2NJbnB1dCk7Ci0JCX0KLQkJCi0JCWJvb2xlYW4gY2FuRXhlY3V0ZSA9IGZhbHNlOwotCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmRfTWVzc2FnZSwgCi0JCQkJVG5nVXRpbC5nZXRUeXBlVGV4dChwcm9jVHlwZS5nZXROYW1lKCkpLnRvTG93ZXJDYXNlKCkpOwotCQkKLQkJLy8gcmVxdWVzdCBpbnB1dAotCQlpZiAodWlIYW5kbGVyLnJlcXVlc3RJbnB1dChMaWJyYXJ5RWRpdFJlc291cmNlcy5uZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nX3RpdGxlLCAKLQkJCQltc2csIHVzZXJJbnB1dHMpKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVJbnB1dC5nZXRJbnB1dCgpOwotCQkJcHJvY0NvbXAuc2V0TmFtZShuYW1lKTsKLQkJCXByb2Nlc3MgPSBwcm9jQ29tcC5nZXRQcm9jZXNzKCk7Ci0JCQlwcm9jZXNzLnNldE5hbWUobmFtZSk7Ci0JCQlwcm9jZXNzLnNldFByZXNlbnRhdGlvbk5hbWUobmFtZSk7Ci0JCQlwcm9jZXNzLnNldERlZmF1bHRDb250ZXh0KChNZXRob2RDb25maWd1cmF0aW9uKSBkZWZhdWx0Q29uZmlnSW5wdXQuZ2V0SW5wdXQoKSk7Ci0JCQlpZihiYXNlUHJvY0lucHV0ICE9IG51bGwpIHsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgYmFzZVByb2NJbnB1dC5nZXRJbnB1dCgpOwotCQkJCWlmKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkoKFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKXByb2NDb21wKS5nZXRCYXNlZE9uUHJvY2Vzc2VzKCkuYWRkQWxsKGxpc3QpOwotCQkJCX0KLQkJCX0KLQkJCWNhbkV4ZWN1dGUgPSB0cnVlOwotCQl9Ci0KLS8vCQlib29sZWFuIGNhbkV4ZWN1dGUgPSB0cnVlOwotLy8JCU5ld1Byb2Nlc3NDb21wb25lbnREaWFsb2cgZGlhbG9nID0gbmV3IE5ld1Byb2Nlc3NDb21wb25lbnREaWFsb2coCi0vLwkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBwcm9jQ3R4cywgcHJvY0NvbXAsCi0vLwkJCQliYXNlUHJvY2Vzc2VzLCBwbHVnaW4sIChQcm9jZXNzUGFja2FnZSkgb3duZXIpOwkJCQkJCQotLy8JCXdoaWxlICh0cnVlKSB7Ci0vLwkJCWludCByZXQgPSBkaWFsb2cub3BlbigpOwotLy8JCQlpZiAocmV0ID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKSB7Ci0vLwkJCQljYW5FeGVjdXRlID0gZmFsc2U7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotLy8KLS8vCQkJaWYgKHByb2NDb21wLmdldFByb2Nlc3MoKS5nZXREZWZhdWx0Q29udGV4dCgpID09IG51bGwpIHsKLS8vCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoCi0vLwkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNyZWF0ZVByb2Nlc3NfdGV4dCwKLS8vCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMubm9EZWZhdWx0Q29uZmlnRXJyb3JfbXNnKTsKLS8vCQkJfSBlbHNlIHsKLS8vCQkJCVN0cmluZyBtc2cgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVOYW1lVmFsaWRhdG9yKAotLy8JCQkJCQlvd25lciwgcHJvY0NvbXApLmlzVmFsaWQocHJvY0NvbXAuZ2V0TmFtZSgpKTsKLS8vCQkJCWlmIChtc2cgPT0gbnVsbCkgewotLy8JCQkJCXByb2Nlc3MgPSBwcm9jQ29tcC5nZXRQcm9jZXNzKCk7Ci0vLwkJCQkJYnJlYWs7Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoCi0vLwkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jcmVhdGVQcm9jZXNzX3RleHQsCi0vLwkJCQkJCQltc2cpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotCi0JCWlmIChjYW5FeGVjdXRlKSB7Ci0JCQkvLyBjcmVhdGUgcHJvY2VzcyBjb21wb25lbnQgbmVlZCB0byB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdAotCQkJLy8gaGFzIGJlZW4gc2VsZWN0ZWQgYXMKLQkJCS8vIGRlZmF1bHQgY29udGV4dCBvZiBpdHMgcHJvY2Vzcy4gQ2hlY2sgaWYgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQotCQkJLy8gaXMgdXBkYXRhYmxlCi0JCQkvLwotCQkJc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KHByb2NDb21wLmdldFByb2Nlc3MoKQotCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKSwgc2hlbGwpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlzdXBlci5leGVjdXRlKCk7Ci0KLQkJCUNvbW1hbmQgY21kID0gZ2V0Q29tbWFuZCgpOwotCQkJaWYgKGNtZCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSAoKE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKSBjbWQpLmdldFN0YXR1cygpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgewotCQkJCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJZmluYWwgTWV0aG9kQ29uZmlndXJhdGlvbiBwcm9jQ3R4ID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCi0JCQkvLyBuZWVkIHRvIGFkZCB0aGUgcGFyZW50IHBhY2thZ2VzIGFuZCBwbHVnaW4gaW50byB0aGUgY29uZmlndXJhdGlvbgotCQkJLy8gYXMgd2VsbAotCQkJLy8gTmV3IHByb2Nlc3MgaW4gbmV3IHBsdWctaW4gbm90IGF1dG9tYXRpY2FsbHkgdmlzaWJsZSBpbgotCQkJLy8gY29uZmlndXJhdGlvbiB2aWV3Ci0JCQlMaXN0IHBrZ3MgPSBwcm9jQ3R4LmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCWZvciAoRU9iamVjdCBvYmogPSBwcm9jQ29tcDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQlwa2dzLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJCXByb2NDdHguZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCQkKLQkJCXByb2Nlc3MuZ2V0VmFsaWRDb250ZXh0KCkuYWRkKHByb2NDdHgpOwotCQkJcHJvY2Vzcy5zZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkuY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKHByb2Nlc3MpKTsKLQotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkvLyBzYXZlIHRoZSByZXNvdXJjZSBvZiBwYXJlbnQgUHJvY2Vzc1BhY2thZ2UKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEVPYmplY3QpIG93bmVyKS5lUmVzb3VyY2UoKTsKLQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpCi0JCQkJCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBzYXZlIHRoZSByZXNvdXJjZSBvZiBuZXdseSBjcmVhdGVkCi0JCQkJCQkJLy8gUHJvY2Vzc0NvbXBvbmVudCBhZ2FpbiBhZnRlciBjcmVhdGluZyBwcm9jZXNzJ3MKLQkJCQkJCQkvLyBwcmVzZW50YXRpb24KLQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShwcm9jQ29tcC5lUmVzb3VyY2UoKSk7Ci0KLQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0KLQkJCQkJCQkvLyBzYXZlIHRoZSByZXNvdXJjZSBvZiB0aGUgcHJvY2VzcydzIGRlZmF1bHQKLQkJCQkJCQkvLyBjb250ZXh0Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocHJvY0N0eC5lUmVzb3VyY2UoKSk7Ci0KLQkJCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCQkJCi0JCQkJCQkJLy8gY3JlYXRlIG5ldyBkaWFncmFtIGZpbGUKLQkJCQkJCQkvLwotCQkJCQkJCQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4KTsKLQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlzdGF0dXMgPSBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJCQl0aHJvdyBuZXcgTWVzc2FnZUV4Y2VwdGlvbigKLQkJCQkJCQkJCU5MUwotCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5zYXZlUHJvY2Vzc0Vycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQlwcm9jQ29tcC5nZXROYW1lKCkpLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0KLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkucnVuV2l0aFByb2dyZXNzKAotCQkJCQkJCXJ1bm5hYmxlLAotCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNyZWF0aW5nUHJvY2Vzc0NvbXBvbmVudFRhc2tfbmFtZSwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgcHJvY0NvbXAuZ2V0TmFtZSgpIH0pKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJc3VwZXIucmVkbygpOwotCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gKFByb2Nlc3NDb21wb25lbnQpIGNoaWxkOwotCQlNZXRob2RDb25maWd1cmF0aW9uIHByb2NDdHggPSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCWlmIChwcm9jQ3R4IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJKChNZXRob2RDb25maWd1cmF0aW9uKSBwcm9jQ3R4KS5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKAotCQkJCQlwcm9jQ29tcCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gcHJvY0N0eCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKHByb2NDdHggaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkoKE1ldGhvZENvbmZpZ3VyYXRpb24pIHByb2NDdHgpLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5yZW1vdmUoCi0JCQkJCWNoaWxkKTsKLQkJfQotCQlzdXBlci51bmRvKCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlUm9sZURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlUm9sZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGIwYzg3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVJvbGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5SZWZlcmVuY2VTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi07Ci0KLS8qKgotICogRGVsZXRlIHJvbGUgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVSb2xlRGVzY3JpcHRvciBleHRlbmRzIFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgUm9sZURlc2NyaXB0b3Igcm9sZURlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIExpc3Qgbm90VXNlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlbGV0ZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5yb2xlRGVzYyA9IHJvbGVEZXNjOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCXJvbGVEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocm9sZURlc2MpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJfQotCQlpZiAocm9sZURlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJvbGVEZXNjLmVSZXNvdXJjZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBEZWxldGVSb2xlRGVzY3JpcHRvcihSb2xlRGVzY3JpcHRvciByb2xlRGVzYywKLQkJCWJvb2xlYW4gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzKSB7Ci0JCXRoaXMocm9sZURlc2MpOwotCQl0aGlzLmZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcyA9IGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCVNldCByZWZMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQotCQkvLyBnZXQgUm9sZURlc2NyaXB0b3IgcmVsYXRpb25zaGlwcyByZWZlcmVuY2VzCi0JCUxpc3QgYXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYyk7Ci0JCUxpc3QgYWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldEFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpOwotCQlMaXN0IHByaW1hcnlUYXNrRGVzY3JpcHRvcnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKTsKLQkJcmVmTGlzdC5hZGRBbGwoYXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMpOwotCQlyZWZMaXN0LmFkZEFsbChhZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzKTsKLQkJcmVmTGlzdC5hZGRBbGwocHJpbWFyeVRhc2tEZXNjcmlwdG9ycyk7Ci0JCXJlZkxpc3QuYWRkQWxsKHJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHJlZkxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKCFQcm9jZXNzVXRpbC5jaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKHJvbGVEZXNjLAotCQkJCQkJKERlc2NyaXB0b3IpIG9iamVjdCkpIHsKLQkJCQkJaWYgKGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuY29udGFpbnMob2JqZWN0KSkgLy8gY2hlY2sKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmb3IKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsb2NhbAotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGRlc2NyaXB0b3IKLQkJCQkJCW5vdFVzZWRSZWZlcmVuY2VzLmFkZChvYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghKG5vdFVzZWRSZWZlcmVuY2VzLmlzRW1wdHkoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0W10gcmVmVG9CZURlbGV0ZWQgPSBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXMgPyBub3RVc2VkUmVmZXJlbmNlcwotCQkJCQkJLnRvQXJyYXkoKQotCQkJCQkJOiBSZWZlcmVuY2VTZWxlY3Rpb24uZ2V0UmVmZXJlbmNlcyhub3RVc2VkUmVmZXJlbmNlcywKLQkJCQkJCQkJcm9sZURlc2MpOwotCQkJCQkJCi0JCQkJCQlkZWxldGUocmVmVG9CZURlbGV0ZWQpOwotCQkJfQotCQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCWFib3J0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gY2xlYXIgcmVsYXRpb25zaGlwcwotLy8JCWNsZWFyKHJvbGVEZXNjLmdldEFzc2lzdHNJbigpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQl0ZC5nZXRBc3Npc3RlZEJ5KCkucmVtb3ZlKHJvbGVEZXNjKTsKLQkJfQotLy8JCWNsZWFyKHJvbGVEZXNjLmdldFBlcmZvcm1zQWRkaXRpb25hbGx5KCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJdGQuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5yZW1vdmUocm9sZURlc2MpOwotCQl9Ci0vLwkJY2xlYXIocm9sZURlc2MuZ2V0UGVyZm9ybXNBc093bmVyKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcmltYXJ5VGFza0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJdGQuc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkobnVsbCk7Ci0JCX0KLQkJY2xlYXIocm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKSk7Ci0KLQkJLy8gaWYgcm9sZSBpcyBwYXJ0IG9mIGFueSB0ZWFtLCBwbGVhc2UgcmVtb3ZlIGl0IGZyb20gdGVhbSBhcyB3ZWxsCi0JCUxpc3QgdGVhbXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRUZWFtUHJvZmlsZXMocm9sZURlc2MpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0ZWFtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGl0b3IubmV4dCgpOwotCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5yZW1vdmUocm9sZURlc2MpOwotCi0JCQkvLyBmaW5kIG1hdGNoaW5nIHJvbGVEZXNjcmlwdG9yIGluIHRlYW0gcm9sZXMKLQkJCU9iamVjdCB0ZWFtUm9sZURlc2MgPSBQcm9jZXNzVXRpbAotCQkJCQkuZmluZFJvbGVEZXNjcmlwdG9yKHRlYW0sIHJvbGVEZXNjKTsKLQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKHRlYW1Sb2xlRGVzYyk7Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyKExpc3QgbGlzdCkgewotCQl0cnkgewotCQkJaWYgKChsaXN0ICE9IG51bGwpICYmIChsaXN0LnNpemUoKSA+IDApKSB7Ci0KLQkJCQlsaXN0LmNsZWFyKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVRhc2tEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVRhc2tEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgwM2NlNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVUYXNrRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuUmVmZXJlbmNlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotCi0KLS8qKgotICogRGVsZXRlIFRhc2sgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlVGFza0Rlc2NyaXB0b3IgZXh0ZW5kcyBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgewotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBMaXN0IG5vdFVzZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlczsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEZWxldGVUYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciB0YXNrRGVzYykgewotCQlzdXBlcigpOwotCi0JCXRoaXMudGFza0Rlc2MgPSB0YXNrRGVzYzsKLQotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQl0YXNrRGVzYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHRhc2tEZXNjKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCX0KLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJaWYgKHRhc2tEZXNjLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZCh0YXNrRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRGVsZXRlVGFza0Rlc2NyaXB0b3IoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MsCi0JCQlib29sZWFuIGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcykgewotCQl0aGlzKHRhc2tEZXNjKTsKLQkJdGhpcy5mb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXMgPSBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlTZXQgcmVmTGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJLy8gZ2V0IFRhc2tEZXNjcmlwdG9yIHJlbGF0aW9uc2hpcHMgcmVmZXJlbmNlcwotCQlyZWZMaXN0LmFkZEFsbCh0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJcmVmTGlzdC5hZGRBbGwodGFza0Rlc2MuZ2V0QXNzaXN0ZWRCeSgpKTsKLQkJcmVmTGlzdC5hZGQodGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0JCXJlZkxpc3QuYWRkQWxsKHRhc2tEZXNjLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQlyZWZMaXN0LmFkZEFsbCh0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkpOwotCQlyZWZMaXN0LmFkZEFsbCh0YXNrRGVzYy5nZXRPcHRpb25hbElucHV0KCkpOwotCQlyZWZMaXN0LmFkZEFsbCh0YXNrRGVzYy5nZXRPdXRwdXQoKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcmVmTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdG9yLm5leHQoKTsKLQotCQkJLy8gY2hlY2sgYWxsIGl0J3MgcmVmZXJlbmNlcwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoIVByb2Nlc3NVdGlsLmNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXModGFza0Rlc2MsCi0JCQkJCQkoRGVzY3JpcHRvcikgb2JqZWN0KSkgewotCQkJCQlpZiAoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhvYmplY3QpKSAvLyBjaGVjawotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxvY2FsCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZGVzY3JpcHRvcgotCQkJCQkJbm90VXNlZFJlZmVyZW5jZXMuYWRkKG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCEobm90VXNlZFJlZmVyZW5jZXMuaXNFbXB0eSgpKSkgewotCQkJdHJ5IHsKLQkJCQlPYmplY3RbXSByZWZUb0JlRGVsZXRlZCA9IGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcyA/IG5vdFVzZWRSZWZlcmVuY2VzCi0JCQkJCQkudG9BcnJheSgpCi0JCQkJCQk6IFJlZmVyZW5jZVNlbGVjdGlvbi5nZXRSZWZlcmVuY2VzKG5vdFVzZWRSZWZlcmVuY2VzLAotCQkJCQkJCQl0YXNrRGVzYyk7Ci0JCQkJCQkKLQkJCQkJCWRlbGV0ZShyZWZUb0JlRGVsZXRlZCk7Ci0JCQl9Ci0JCQljYXRjaChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJYWJvcnRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjbGVhciBvdXQgYWxsIHRhc2tkZXNjcmlwdG9yIHJlbGF0aW9uc2hpcAotCQljbGVhcih0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJY2xlYXIodGFza0Rlc2MuZ2V0QXNzaXN0ZWRCeSgpKTsKLQkJY2xlYXIodGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCWNsZWFyKHRhc2tEZXNjLmdldEV4dGVybmFsSW5wdXQoKSk7Ci0JCWNsZWFyKHRhc2tEZXNjLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCWNsZWFyKHRhc2tEZXNjLmdldE91dHB1dCgpKTsKLQotCQl0YXNrRGVzYy5zZXRQZXJmb3JtZWRQcmltYXJpbHlCeShudWxsKTsKLQotCQlyZWRvKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyKExpc3QgbGlzdCkgewotCQl0cnkgewotCQkJaWYgKChsaXN0ICE9IG51bGwpICYmIChsaXN0LnNpemUoKSA+IDApKSB7Ci0JCQkJbGlzdC5jbGVhcigpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVUZWFtUHJvZmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVUZWFtUHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NzM4YTE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlVGVhbVByb2ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLQotCi0vKioKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVUZWFtUHJvZmlsZSBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgVGVhbVByb2ZpbGUgdGVhbTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEZWxldGVUZWFtUHJvZmlsZShUZWFtUHJvZmlsZSB0ZWFtKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy50ZWFtID0gdGVhbTsKLQotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50QWN0aXZpdHkodGVhbSk7Ci0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCX0KLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJaWYgKHRlYW0uZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHRlYW0uZVJlc291cmNlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyBnZXQgYWxsIHN1YnRlYW0gcmVjdXJzaXZlbHkKLQkJTGlzdCB0ZWFtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0U3ViVGVhbXModGVhbSwgdGVhbUxpc3QpOwotCi0JCXRlYW1MaXN0LmFkZCh0ZWFtKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRlYW1MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlUZWFtUHJvZmlsZSB0dCA9IChUZWFtUHJvZmlsZSkgdGVhbUxpc3QuZ2V0KGkpOwotCQkJLy8gY2xlYXIgdGVhbSdzIHJvbGVkZXNjcmlwdG9yCi0JCQl0dC5nZXRUZWFtUm9sZXMoKS5jbGVhcigpOwotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRTdWJUZWFtcyhUZWFtUHJvZmlsZSB0ZWFtLCBMaXN0IHRlYW1MaXN0KSB7Ci0JCUxpc3QgbGlzdCA9IHRlYW0uZ2V0U3ViVGVhbSgpOwotCQlpZiAobGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCVRlYW1Qcm9maWxlIHR0ID0gKFRlYW1Qcm9maWxlKSBpdG9yLm5leHQoKTsKLQkJCQl0ZWFtTGlzdC5hZGQodHQpOwotCQkJCWdldFN1YlRlYW1zKHR0LCB0ZWFtTGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50IGFjdGl2aXR5IGZvciBicmVha2Rvd25lbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGJyRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRQYXJlbnRBY3Rpdml0eShCcmVha2Rvd25FbGVtZW50IGJyRWxlbWVudCkgewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCWJyRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQ7Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGJyRWxlbWVudCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1MTMzZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JSW50ZXJhY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci0KLQotLyoqCi0gKiBDb21tYW5kIGZvciBjbGVhbi11cCB1bnVzZWQgZGVzY3JpcHRvcnMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCBleHRlbmRzIENvbXBvdW5kQ29tbWFuZCAKLWltcGxlbWVudHMgSUludGVyYWN0aXZlCi17Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCXByaXZhdGUgTGlzdCBkZXNjcmlwdG9yc1RvRGVsZXRlOwotCXByaXZhdGUgYm9vbGVhbiBpbmNsdWRlQ2hpbGRyZW47Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGRlbGV0ZWREZXNjcmlwdG9yczsKLQlwcml2YXRlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudHMgbGlzdCBvZiBlbGVtZW50cyB0byBjaGVjayBmb3IgdW51c2VkIGRlc2NyaXB0b3JzIHRvIGRlbGV0ZSAKLQkgKiBAcGFyYW0gaW5jbHVkZUNoaWxkcmVuIGlmIDxjb2RlPnRydWU8L2NvZGU+IHdpbGwgY2hlY2sgdGhlIG9mZnN0cmluZyBvZiBhY3Rpdml0aWVzIGluIHRoZSBnaXZlbiBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBEZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoQ29sbGVjdGlvbiBlbGVtZW50cywgYm9vbGVhbiBpbmNsdWRlQ2hpbGRyZW4sIENvbGxlY3Rpb24gZGVsZXRlZERlc2NyaXB0b3JzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJdGhpcy5pbmNsdWRlQ2hpbGRyZW4gPSBpbmNsdWRlQ2hpbGRyZW47Ci0JCXRoaXMuZGVsZXRlZERlc2NyaXB0b3JzID0gZGVsZXRlZERlc2NyaXB0b3JzOwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGVzIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMuIFN1YmNsYXNzcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEByZXR1cm4gdGhlIGV4ZWN1dGVkIGNvbW1hbmQgdGhhdCBkZWxldGVkIHRoZSBnaXZlbiBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBDb21tYW5kIGRlbGV0ZShMaXN0IGVsZW1lbnRzKTsKLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyBmaW5kIGFsbCByb2xlIGFuZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgdGhhdCBhcmUgbm90IHVzZWQKLQkJLy8gaW4gYW55IHJlbGF0aW9uc2hpcAotCQkvLyBhbmQgZGVsZXRlIHRoZW0KLQkJLy8KLQkJaWYgKGRlc2NyaXB0b3JzVG9EZWxldGUgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRvcnNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUl0ZXJhdG9yIGl0ZXI7Ci0JCQlpZihpbmNsdWRlQ2hpbGRyZW4pIHsKLQkJCQlpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGVsZW1lbnRzLCBmYWxzZSkgewotCQkJCQkKLQkJCQkJCi0JCQkJCS8qKgotCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkgKi8KLQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDcxODg4OTQwOTQwMzE0MTcwN0w7Ci0JCQkJCQotCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJaWYgKG9iamVjdCA9PSBlbGVtZW50cykgewotCQkJCQkJCXJldHVybiBlbGVtZW50cy5pdGVyYXRvcigpOwotCQkJCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCXJldHVybiAoKEFjdGl2aXR5KSBvYmplY3QpCi0JCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQlBcnJheUxpc3QgY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZihkZWxldGVkRGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJCS8vIGFkZCBkZWxldGVkIGRlc2NyaXB0b3JzIHRvIHRoZSBsaXN0IGJlZm9yZSBjaGVja2luZyBmb3IgdW51c2VkIGRlc2NyaXB0b3JzCi0JCQkJLy8gdGhvc2UgZGVsZXRlZCBkZXNjcmlwdG9ycyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBhZnRlciB0aGUgY2hlY2sKLQkJCQkvLwotCQkJCWN1cnJlbnREZXNjcmlwdG9yc1RvRGVsZXRlLmFkZEFsbChkZWxldGVkRGVzY3JpcHRvcnMpOwotCQkJfQotCQkJZm9yICg7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvciB8fCBlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCQlpZiAoIVByb2Nlc3NVdGlsLmNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoCi0JCQkJCQkJY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUsIChEZXNjcmlwdG9yKSBlbGVtZW50KSkgewotCQkJCQkJY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUuYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUucmVtb3ZlQWxsKGRlbGV0ZWREZXNjcmlwdG9ycyk7Ci0JCQlpZiAoIWN1cnJlbnREZXNjcmlwdG9yc1RvRGVsZXRlLmlzRW1wdHkoKSkgewotCQkJCXNlbGVjdERlc2NyaXB0b3JzVG9EZWxldGUoY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUpOwotCQkJCWlmKCFjdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZS5pc0VtcHR5KCkpIHsKLQkJCQkJQ29tbWFuZCBjbWQgPSBkZWxldGUoY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUpOwotCQkJCQlpZiAoY21kICE9IG51bGwpIHsKLQkJCQkJCWNvbW1hbmRMaXN0LmFkZChjbWQpOwotCQkJCQkJZGVzY3JpcHRvcnNUb0RlbGV0ZS5hZGRBbGwoY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYoIWRlc2NyaXB0b3JzVG9EZWxldGUuaXNFbXB0eSgpKSB7Ci0JCQkJY29tbWFuZExpc3QuY2xlYXIoKTsKLQkJCQlhcHBlbmQoZGVsZXRlKGRlc2NyaXB0b3JzVG9EZWxldGUpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZShMaXN0IGRlc2NyaXB0b3JzVG9EZWxldGUpIHsKLQkJaWYodXNlckludGVyYWN0aW9uSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX3JlZmVyZW5jZXM7Ci0JCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZV9tc2c7CQkJCi0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGRlc2NyaXB0b3JzVG9EZWxldGUpOwotCQkJdHJ5IHsKLQkJCQlDb2xsZWN0aW9uIHNlbGVjdGVkID0gdXNlckludGVyYWN0aW9uSGFuZGxlci5zZWxlY3QobGlzdCwgbGFiZWxQcm92aWRlciwgdHJ1ZSwgbGlzdCwgdGl0bGUsIG1zZyk7Ci0JCQkJaWYoc2VsZWN0ZWQgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJZGVzY3JpcHRvcnNUb0RlbGV0ZS5yZXRhaW5BbGwoc2VsZWN0ZWQpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUludGVyYWN0aXZlI3NldFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgaGFuZGxlcikgewotCQl1c2VySW50ZXJhY3Rpb25IYW5kbGVyID0gaGFuZGxlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWEzMmEzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5SZWZlcmVuY2VTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIERlbGV0ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yIGV4dGVuZHMgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kIHsKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBMaXN0IG5vdFVzZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlczsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYykgewotCQlzdXBlcigpOwotCi0JCXRoaXMud3BEZXNjID0gd3BEZXNjOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCXdwRGVzYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHdwRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQl9Ci0JCWlmICh3cERlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHdwRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MsCi0JCQlib29sZWFuIGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcykgewotCQl0aGlzKHdwRGVzYyk7Ci0JCXRoaXMuZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzID0gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJU2V0IHJlZkxpc3QgPSBuZXcgSGFzaFNldCgpOwotCi0JCUxpc3QgbWFuZGF0b3J5SW5wdXRUbyA9IEFzc29jaWF0aW9uSGVscGVyLmdldE1hbmRhdG9yeUlucHV0VG8od3BEZXNjKTsKLQkJTGlzdCBleHRlcm5hbElucHV0VG8gPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRFeHRlcm5hbElucHV0VG8od3BEZXNjKTsKLQkJTGlzdCBvcHRpb25hbElucHV0VG8gPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRPcHRpb25hbElucHV0VG8od3BEZXNjKTsKLQkJTGlzdCBvdXRwdXRGcm9tID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3V0cHV0RnJvbSh3cERlc2MpOwotCQlMaXN0IHJlc3BvbnNpYmxlUm9sZURlc2NMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMod3BEZXNjKTsKLQkJLy8gZ2V0IFdvcmtQcm9kdWN0RGVzY3JpcHRvciByZWxhdGlvbnNoaXBzIHJlZmVyZW5jZXMKLQkJcmVmTGlzdC5hZGRBbGwod3BEZXNjLmdldEltcGFjdGVkQnkoKSk7Ci0JCXJlZkxpc3QuYWRkQWxsKHdwRGVzYy5nZXRJbXBhY3RzKCkpOwotCQlyZWZMaXN0LmFkZEFsbChtYW5kYXRvcnlJbnB1dFRvKTsKLQkJcmVmTGlzdC5hZGRBbGwoZXh0ZXJuYWxJbnB1dFRvKTsKLQkJcmVmTGlzdC5hZGRBbGwob3B0aW9uYWxJbnB1dFRvKTsKLQkJcmVmTGlzdC5hZGRBbGwob3V0cHV0RnJvbSk7Ci0JCXJlZkxpc3QuYWRkKHJlc3BvbnNpYmxlUm9sZURlc2NMaXN0KTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByZWZMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0b3IubmV4dCgpOwotCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCWlmICghUHJvY2Vzc1V0aWwuY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcyh3cERlc2MsCi0JCQkJCQkoRGVzY3JpcHRvcikgb2JqZWN0KSkgewotCQkJCQlpZiAoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhvYmplY3QpKSAvLyBjaGVjawotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxvY2FsCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZGVzY3JpcHRvcgotCQkJCQkJbm90VXNlZFJlZmVyZW5jZXMuYWRkKG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCEobm90VXNlZFJlZmVyZW5jZXMuaXNFbXB0eSgpKSkgewotCQkJdHJ5IHsKLQkJCQlPYmplY3RbXSByZWZUb0JlRGVsZXRlZCA9IGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcyA/IG5vdFVzZWRSZWZlcmVuY2VzCi0JCQkJCQkudG9BcnJheSgpCi0JCQkJCQk6IFJlZmVyZW5jZVNlbGVjdGlvbi5nZXRSZWZlcmVuY2VzKG5vdFVzZWRSZWZlcmVuY2VzLAotCQkJCQkJCQl3cERlc2MpOwotCQkJCQkJZGVsZXRlKHJlZlRvQmVEZWxldGVkKTsKLQkJCX0KLQkJCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlhYm9ydGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIHdoZXRoZXIgd3BkZXNjIGFydGlmYWN0IGhhcyBhbnkgc3ViLWFydGlmYWN0cwotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAod3BEZXNjLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCQkJTGlzdCBsaXN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3QgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3Iod3BEZXNjLCAoQXJ0aWZhY3QpIGxpc3QKLQkJCQkJCS5nZXQoaSkpOwotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGRlc2NyaXB0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUxpc3Qgb2JqZWN0c1RvQ2xlYXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJb2JqZWN0c1RvQ2xlYXJlZC5hZGQod3BEZXNjKTsKLQkJb2JqZWN0c1RvQ2xlYXJlZC5hZGRBbGwoY2hpbGRyZW4pOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IG9iamVjdHNUb0NsZWFyZWQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzY09iaiA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iajsKLQotCQkJCS8vIHdwRGVzY09iai5nZXRJbXBhY3RlZEJ5KCkuY2xlYXIoKTsKLQkJCQkvLyB3cERlc2NPYmouZ2V0SW1wYWN0cygpLmNsZWFyKCk7Ci0JCQkJLy8gd3BEZXNjT2JqLmdldE1hbmRhdG9yeUlucHV0VG8oKS5jbGVhcigpOwotCQkJCS8vIHdwRGVzY09iai5nZXRFeHRlcm5hbElucHV0VG8oKS5jbGVhcigpOwotCQkJCS8vIHdwRGVzY09iai5nZXRPcHRpb25hbElucHV0VG8oKS5jbGVhcigpOwotCQkJCS8vIHdwRGVzY09iai5nZXRPdXRwdXRGcm9tKCkuY2xlYXIoKTsKLQkJCQkvLyB3cERlc2NPYmouZ2V0V29ya2VkT25CeSgpLmNsZWFyKCk7Ci0JCQkJY2xlYXIod3BEZXNjT2JqLmdldEltcGFjdGVkQnkoKSk7Ci0JCQkJY2xlYXIod3BEZXNjT2JqLmdldEltcGFjdHMoKSk7Ci0vLwkJCQljbGVhcih3cERlc2NPYmouZ2V0RXh0ZXJuYWxJbnB1dFRvKCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGV4dGVybmFsSW5wdXRUby5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJCXRkLmdldEV4dGVybmFsSW5wdXQoKS5yZW1vdmUod3BEZXNjT2JqKTsKLQkJCQl9Ci0vLwkJCQljbGVhcih3cERlc2NPYmouZ2V0TWFuZGF0b3J5SW5wdXRUbygpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYW5kYXRvcnlJbnB1dFRvLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJdGQuZ2V0TWFuZGF0b3J5SW5wdXQoKS5yZW1vdmUod3BEZXNjT2JqKTsKLQkJCQl9Ci0vLwkJCQljbGVhcih3cERlc2NPYmouZ2V0T3B0aW9uYWxJbnB1dFRvKCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9wdGlvbmFsSW5wdXRUby5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJCXRkLmdldE9wdGlvbmFsSW5wdXQoKS5yZW1vdmUod3BEZXNjT2JqKTsKLQkJCQl9Ci0vLwkJCQljbGVhcih3cERlc2NPYmouZ2V0T3V0cHV0RnJvbSgpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvdXRwdXRGcm9tLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJdGQuZ2V0T3V0cHV0KCkucmVtb3ZlKHdwRGVzY09iaik7Ci0JCQkJfQotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc3BvbnNpYmxlUm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJcm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKS5yZW1vdmUod3BEZXNjT2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyB0aGlzLmFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlKHdwRGVzYyk7Ci0KLQkJcmVkbygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhcihMaXN0IGxpc3QpIHsKLQkJdHJ5IHsKLQkJCWlmICgobGlzdCAhPSBudWxsKSAmJiAobGlzdC5zaXplKCkgPiAwKSkKLQkJCQlsaXN0LmNsZWFyKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldERlc2NyaXB0b3IoT2JqZWN0IHBhcmVudERlc2NyaXB0b3IsIEFydGlmYWN0IGFydGlmYWN0KSB7Ci0JCS8vIEFjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkocGFyZW50RGVzY3JpcHRvcik7Ci0JCWlmIChhY3Rpdml0eSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgbGlzdCA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikKLQkJCQkJJiYgKGFydGlmYWN0ID09ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCkpKSB7Ci0JCQkJcmV0dXJuIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVzY3JpcHRvclN5bmNocm9uaXplQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZXNjcmlwdG9yU3luY2hyb25pemVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4NTA5NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZXNjcmlwdG9yU3luY2hyb25pemVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci0KLS8qKgotICogQ29tbWFuZCB0byBzeW5jaHJvbml6ZSBkZXNjcmlwdG9yJ3MgYXR0cmlidXRlcyBhbmQgb3duIHJlZmVyZW5jZXMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBGZWIgMSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9yU3luY2hyb25pemVDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9yU3luY2hyb25pemVDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZXNjcmlwdG9yVXBkYXRlQmF0Y2hDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Rlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDg0ZWNjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Rlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQmF0Y2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEZlYiA5LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZCBleHRlbmRzIEJhdGNoQ29tbWFuZCB7Ci0JcHJpdmF0ZSBTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2g7Ci0JcHJpdmF0ZSBDb21wb3VuZENvbW1hbmQgcmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZDsKLQlwcml2YXRlIFNldCBzeW5jaEZlYXR1cmVzOwotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGNsZWFyCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQoYm9vbGVhbiBjbGVhciwgU2V0IHN5bmNoRmVhdHVyZXMsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKGNsZWFyKTsKLQkJdGhpcy5zeW5jaEZlYXR1cmVzID0gc3luY2hGZWF0dXJlczsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCi0JcHVibGljIFNldCBnZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpIHsKLQkJaWYoZGVzY3JpcHRvcnNUb1JlZnJlc2ggPT0gbnVsbCkgewotCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2ggPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yc1RvUmVmcmVzaDsKLQl9Ci0JCi0Jdm9pZCBzZXREZXNjcmlwdG9yc1RvUmVmcmVzaChTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gpIHsKLQkJdGhpcy5kZXNjcmlwdG9yc1RvUmVmcmVzaCA9IGRlc2NyaXB0b3JzVG9SZWZyZXNoOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCkgewotCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2guY2xlYXIoKTsKLQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoID0gbnVsbDsKLQkJfQotCQkKLQkJaWYocmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQmF0Y2hDb21tYW5kI2NhbkV4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCkgfHwgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgIWRlc2NyaXB0b3JzVG9SZWZyZXNoLmlzRW1wdHkoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkKLQkJLy8gY3JlYXRlIHJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQKLQkJLy8KLQkJaWYoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCAmJiAhZGVzY3JpcHRvcnNUb1JlZnJlc2guaXNFbXB0eSgpCi0JCQkJJiYgcmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZCA9PSBudWxsKSB7Ci0JCQlyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVzY3JpcHRvcnNUb1JlZnJlc2guaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRGVzY3JpcHRvciBkZXNjID0gKERlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCXJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQuYXBwZW5kKG5ldyBCYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQoZGVzYywgc3luY2hGZWF0dXJlcywgY29uZmlnKSk7CQkJCQotCQkJfQotCQl9Ci0KLQkJLy8gcmVmcmVzaCBkZXNjcmlwdG9ycwotCQkvLwotCQlpZihyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kICE9IG51bGwpIHsKLQkJCXJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYocmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kLnVuZG8oKTsKLQkJfQotCQkKLQkJc3VwZXIudW5kbygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvR2VuZXJpY0Ryb3BDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0dlbmVyaWNEcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MTY5OGYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvR2VuZXJpY0Ryb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0KLS8qKgotICogRHJvcCBjb21tYW5kIHRvIGRyb3AgYW55IG9iamVjdCBvbiBhIHRhcmdldCB0aGF0IHN1cHBvcnRzIGFkYXB0aW5nIGRyb3AKLSAqIG9iamVjdCB0byBpdHMgb3duIG9iamVjdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNEcm9wQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZHJvcEVsZW1lbnRzOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZmVhdHVyZUVsZW1lbnRzOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBFT2JqZWN0IHRhcmdldDsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQlwcml2YXRlIEVsZW1lbnRBZGFwdGVyIGRyb3BBZGFwdGVyOwotCi0JcHVibGljIEdlbmVyaWNEcm9wQ29tbWFuZChFT2JqZWN0IHRhcmdldCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlDb2xsZWN0aW9uIGRyb3BFbGVtZW50cywgRWxlbWVudEFkYXB0ZXIgZHJvcEFkYXB0ZXIpIHsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMuZHJvcEVsZW1lbnRzID0gZHJvcEVsZW1lbnRzOwotCQl0aGlzLmRyb3BBZGFwdGVyID0gZHJvcEFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3ByZXBhcmUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGNvbXBpbGUgdGhlIGZlYXR1cmVFbGVtZW50cyBsaXN0Ci0JCS8vCi0JCWZlYXR1cmVFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHJvcEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQllbGVtZW50ID0gZHJvcEFkYXB0ZXIuYWRhcHQoZWxlbWVudCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJZmVhdHVyZUVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkvLyBpZihjcmVhdGVEZXNjcmlwdG9yKSB7Ci0JCQkvLyBmZWF0dXJlRWxlbWVudHMuYWRkKFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKChSb2xlKQotCQkJLy8gZWxlbWVudCkpOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyBmZWF0dXJlRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKCFmZWF0dXJlRWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkoKExpc3QpIHRhcmdldC5lR2V0KGZlYXR1cmUpKS5hZGRBbGwoZmVhdHVyZUVsZW1lbnRzKTsKLQkJCWlmICh0YXJnZXQuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCWdldE1vZGlmaWVkUmVzb3VyY2VzKCkuYWRkKHRhcmdldC5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJKChMaXN0KSB0YXJnZXQuZUdldChmZWF0dXJlKSkucmVtb3ZlQWxsKGZlYXR1cmVFbGVtZW50cyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gZmVhdHVyZUVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVsZW1lbnRBZGFwdGVyIHsKLQkJLyoqCi0JCSAqIEFkYXB0cyB0aGUgZHJvcCBlbGVtZW50IHRvIHRoZSByaWdodCBlbGVtZW50IGZvciB0aGUgZHJvcCB0YXJnZXQuCi0JCSAqIAotCQkgKiBAcGFyYW0gZHJvcEVsZW1lbnQKLQkJICogQHJldHVybgotCQkgKi8KLQkJT2JqZWN0IGFkYXB0KE9iamVjdCBkcm9wRWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0lBY3Rpb25UeXBlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0lBY3Rpb25UeXBlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlNThhMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9JQWN0aW9uVHlwZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLXB1YmxpYyBjbGFzcyBJQWN0aW9uVHlwZUNvbnN0YW50cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfUFJJTUFSWV9QRVJGT1JNRVIgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX0FERElUSU9OQUxfUEVSRk9STUVSID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9BU1NJU1RFRF9CWSA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfRVhURVJOQUxfSU5QVVQgPSAzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX01BTkRBVE9SWV9JTlBVVCA9IDQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfT1BUSU9OQUxfSU5QVVQgPSA1OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX09VVFBVVCA9IDY7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfUkVTUE9OU0lCTEVfRk9SID0gNzsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTGlua01ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0xpbmtNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNDQ0ZGUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTGlua01ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQ29tbWFuZCBmb3IgbGlua2luZyBtZXRob2QgZWxlbWVudCB0byBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLQotcHVibGljIGNsYXNzIExpbmtNZXRob2RFbGVtZW50Q29tbWFuZCBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgRGVzY3JpcHRvciBkZXNjOwotCi0JcHJpdmF0ZSBPYmplY3Qgb2JqOwotCi0JcHJpdmF0ZSBMaXN0IG9iamVjdHM7Ci0KLQlwcml2YXRlIGludCBmZWF0dXJlSUQ7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiBBc3NpZ24gcm9sZSB0byB0YXNrIGRlc2NyaXB0b3IgVXNlZCBmb3IgYm90aCBhZGRpdGlvbmFsbHkgcGVyZm9ybWVkIGJ5Ci0JICogYW5kIGFzc2lzdGVkIGJ5Ci0JICovCi0JcHVibGljIExpbmtNZXRob2RFbGVtZW50Q29tbWFuZChEZXNjcmlwdG9yIGRlc2MsIE9iamVjdCBvYmosIGludCBmZWF0dXJlSUQpIHsKLQotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZGVzYykpOwotCi0JCXRoaXMuZGVzYyA9IGRlc2M7Ci0JCXRoaXMub2JqID0gb2JqOwotCQl0aGlzLmZlYXR1cmVJRCA9IGZlYXR1cmVJRDsKLQotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCW9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlvYmplY3RzLmFkZChvYmopOwotCQl9Ci0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQlpZiAoZGVzYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKG9iamVjdHMpKQotCQkJcmV0dXJuOwotCi0JCWlmICghb2JqZWN0cy5pc0VtcHR5KCkpCi0JCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuc2V0VGFzaygoVGFzaykgb2JqKTsKLQkJCWJyZWFrOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJKChSb2xlRGVzY3JpcHRvcikgZGVzYykuc2V0Um9sZSgoUm9sZSkgb2JqKTsKLQkJCWJyZWFrOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCSgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZXNjKS5zZXRXb3JrUHJvZHVjdCgoV29ya1Byb2R1Y3QpIG9iaik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICghb2JqZWN0cy5pc0VtcHR5KCkpIHsKLQkJCS8vIGJhc2ljYWxseSByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFueXRoaW5nIHdhcyBhZGRlZAotCQkJc3VwZXIudW5kbygpOwotCi0JCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5zZXRUYXNrKG51bGwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCQkoKFJvbGVEZXNjcmlwdG9yKSBkZXNjKS5zZXRSb2xlKG51bGwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQkJKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2MpLnNldFdvcmtQcm9kdWN0KG51bGwpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChkZXNjLmVSZXNvdXJjZSgpICE9IG51bGwgJiYgIW9iamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoZGVzYy5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTG9jYWxseVJlcGxhY2VBbmREZWVwQ29weUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTG9jYWxseVJlcGxhY2VBbmREZWVwQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWFlMGUxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0xvY2FsbHlSZXBsYWNlQW5kRGVlcENvcHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQWN0aXZpdHlIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdWwgNiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIExvY2FsbHlSZXBsYWNlQW5kRGVlcENvcHlDb21tYW5kIGV4dGVuZHMgUmVwbGFjZUFjdGl2aXR5Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqLwotCXB1YmxpYyBMb2NhbGx5UmVwbGFjZUFuZERlZXBDb3B5Q29tbWFuZChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXN1cGVyKHdyYXBwZXIpOwkJCi0JCXNldExhYmVsKExpYnJhcnlFZGl0UmVzb3VyY2VzLmxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weV90ZXh0KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUmVwbGFjZUFjdGl2aXR5Q29tbWFuZCNkb1ZhcnkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVmFyeSgpIHsKLQkJLy8gZGVlcCBjb3B5IHRoZSBhY3Rpdml0eQotCQkvLwotCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmKCFVc2VySW50ZXJhY3Rpb25IZWxwZXIuY29uZmlybURlZXBDb3B5KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYWN0aXZpdHkpKSkgewotCQkJcmV0dXJuOwotCQl9CQkKLQkJUHJvY2VzcyB0YXJnZXRQcm9jZXNzID0gKFByb2Nlc3MpIHdyYXBwZXIuZ2V0VG9wSXRlbSgpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRlZXBDb3B5Q29uZmlnID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNob29zZURlZXBDb3B5Q29uZmlndXJhdGlvbih0YXJnZXRQcm9jZXNzLCB3cmFwcGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0JCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlBY3Rpdml0eUhhbmRsZXIgYWN0aXZpdHlIYW5kbGVyID0gbmV3IEFjdGl2aXR5SGFuZGxlcigpOwotCQlhY3Rpdml0eUhhbmRsZXIuc2V0RGVlcENvcHlDb25maWcoZGVlcENvcHlDb25maWcpOwotCQlhY3Rpdml0eUhhbmRsZXIuc2V0VGFyZ2V0UHJvY2Vzcyh0YXJnZXRQcm9jZXNzKTsKLQkJYWN0aXZpdHlIYW5kbGVyLmRlZXBDb3B5KGFjdGl2aXR5KTsKLQkJQWN0aXZpdHkgY29weSA9IChBY3Rpdml0eSkgYWN0aXZpdHlIYW5kbGVyLmdldEFjdGl2aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlzdXBlci5kb1ZhcnkoKTsKLQkJCi0JCS8vIHJlcGxhY2UgdGhlIGxvY2FsIHJlcGxhY2VtZW50IHdpdGggZGVlcCBjb3B5Ci0JCS8vCi0JCWludCBwb3MgPSBjcmVhdGVkQWN0aXZpdGllcy5zaXplKCkgLSAxOwotCQlBY3Rpdml0eSBsb2NhbFJlcGxhY2VtZW50ID0gKEFjdGl2aXR5KSBjcmVhdGVkQWN0aXZpdGllcy5nZXQocG9zKTsJCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsb2NhbFJlcGxhY2VtZW50LmdldE9wcG9zaXRlRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSAoT3Bwb3NpdGVGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCB2YWx1ZSA9IGxvY2FsUmVwbGFjZW1lbnQuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKTsKLQkJCWlmKHZhbHVlICE9IG51bGwpIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCk7Ci0JCQkJaWYob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQXJyYXlMaXN0KCgoQ29sbGVjdGlvbil2YWx1ZSkpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7CQkKLQkJCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIG8uZUdldChmZWF0dXJlKTsKLQkJCQkJCQlsaXN0LnJlbW92ZShsb2NhbFJlcGxhY2VtZW50KTsKLQkJCQkJCQlsaXN0LmFkZChjb3B5KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCW8uZVNldChmZWF0dXJlLCBjb3B5KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIHZhbHVlOwotCQkJCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgby5lR2V0KGZlYXR1cmUpOwotCQkJCQkJbGlzdC5yZW1vdmUobG9jYWxSZXBsYWNlbWVudCk7Ci0JCQkJCQlsaXN0LmFkZChjb3B5KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW8uZVNldChmZWF0dXJlLCBjb3B5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljcmVhdGVkQWN0aXZpdGllcy5zZXQocG9zLCBjb3B5KTsKLQkJY29weS5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KGxvY2FsUmVwbGFjZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJY29weS5zZXRWYXJpYWJpbGl0eVR5cGUobG9jYWxSZXBsYWNlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSk7Ci0JCWNvcHkuc2V0UHJlc2VudGVkQWZ0ZXIobG9jYWxSZXBsYWNlbWVudC5nZXRQcmVzZW50ZWRBZnRlcigpKTsKLQkJY29weS5zZXRQcmVzZW50ZWRCZWZvcmUobG9jYWxSZXBsYWNlbWVudC5nZXRQcmVzZW50ZWRCZWZvcmUoKSk7Ci0JCUFjdGl2aXR5IHN1cGVyQWN0ID0gbG9jYWxSZXBsYWNlbWVudC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJaW50IGlkID0gc3VwZXJBY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pbmRleE9mKGxvY2FsUmVwbGFjZW1lbnQpOwotCQlzdXBlckFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLnNldChpZCwgY29weSk7Ci0JCQotCQkvLyBhZGQgY29weSBwYWNrYWdlIHRvIHRoZSBwYWNrYWdlIG9mIHN1cGVyIGFjdGl2aXR5Ci0JCS8vCi0JCSgoUHJvY2Vzc1BhY2thZ2Upc3VwZXJBY3QuZUNvbnRhaW5lcigpKS5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKGNvcHkuZUNvbnRhaW5lcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL01vdmVEb3duQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Nb3ZlRG93bkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDQ4ZDJhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL01vdmVEb3duQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotCi0KLS8qKgotICogQ29tbWFuZCB0byBtb3ZlIGRvd24gZWxlbWVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlRG93bkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIGludCBlbGVtZW50TG9jYXRpb24gPSAwOwotCi0JcHJpdmF0ZSBpbnQgdHJhbnNmZXJMb2NhdGlvbiA9IDA7Ci0KLQlwcml2YXRlIE9iamVjdCBlbGVtZW50T2JqOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVDbGFzc2VzOwotCQotCXByaXZhdGUgYm9vbGVhbiBhZGphY2VudCA9IGZhbHNlOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE1vdmVEb3duQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgT2JqZWN0IGVsZW1lbnRPYmosCi0JCQlDb2xsZWN0aW9uIGVDbGFzc2VzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJdGhpcy5lbGVtZW50T2JqID0gZWxlbWVudE9iajsKLQkJdGhpcy5lQ2xhc3NlcyA9IGVDbGFzc2VzOwotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlMaXN0IGFsbEVsZW1lbnRzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gYWxsRWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKG9iai5lcXVhbHMoZWxlbWVudE9iaikpIHsKLQkJCQllbGVtZW50TG9jYXRpb24gPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IGVsZW1lbnRMb2NhdGlvbiArIDE7IGkgPD0gYWxsRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBhbGxFbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAoVG5nVXRpbC5pc0VDbGFzc0luc3RhbmNlT2YoZUNsYXNzZXMsIG9iaikpIHsKLQkJCQl0cmFuc2ZlckxvY2F0aW9uID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCUJyZWFrZG93bkVsZW1lbnQgbmV4dCA9ICAoQnJlYWtkb3duRWxlbWVudCkgYWxsRWxlbWVudHMuZ2V0KHRyYW5zZmVyTG9jYXRpb24pOwotCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudE9iajsKLQkJaWYoZS5nZXRQcmVzZW50ZWRBZnRlcigpID09IG5leHQpIHsKLQkJCWFkamFjZW50ID0gdHJ1ZTsKLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmKGFkamFjZW50KSB7Ci0JCQkvLyBzd2FwICJwcmVuc2VudGVkLWFmdGVyIiBlbGVtZW50Ci0JCQkvLwotCQkJQnJlYWtkb3duRWxlbWVudCBuZXh0ID0gIChCcmVha2Rvd25FbGVtZW50KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmdldCh0cmFuc2ZlckxvY2F0aW9uKTsKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50T2JqOwotCQkJZS5zZXRQcmVzZW50ZWRBZnRlcihuZXh0LmdldFByZXNlbnRlZEFmdGVyKCkpOwotCQkJbmV4dC5zZXRQcmVzZW50ZWRBZnRlcihlKTsKLQkJfQotCQkoKEVMaXN0KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKS5tb3ZlKHRyYW5zZmVyTG9jYXRpb24sCi0JCQkJZWxlbWVudExvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkoKEVMaXN0KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKS5tb3ZlKGVsZW1lbnRMb2NhdGlvbiwKLQkJCQl0cmFuc2ZlckxvY2F0aW9uKTsKLQkJaWYoYWRqYWNlbnQpIHsKLQkJCS8vIHJlc3RvcmUgInByZW5zZW50ZWQtYWZ0ZXIiIGVsZW1lbnQKLQkJCS8vCi0JCQlCcmVha2Rvd25FbGVtZW50IG5leHQgPSAgKEJyZWFrZG93bkVsZW1lbnQpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuZ2V0KHRyYW5zZmVyTG9jYXRpb24pOwotCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnRPYmo7Ci0JCQluZXh0LnNldFByZXNlbnRlZEFmdGVyKGUuZ2V0UHJlc2VudGVkQWZ0ZXIoKSk7Ci0JCQllLnNldFByZXNlbnRlZEFmdGVyKG5leHQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL01vdmVVcENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTW92ZVVwQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTI5ZGQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTW92ZVVwQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotCi0KLS8qKgotICogQ29tbWFuZCB0byBtb3ZlIHVwIHRoZSBlbGVtZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmUKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vdmVVcENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIGludCBlbGVtZW50TG9jYXRpb24gPSAwOwotCi0JcHJpdmF0ZSBpbnQgdHJhbnNmZXJMb2NhdGlvbiA9IDA7Ci0KLQlwcml2YXRlIE9iamVjdCBlbGVtZW50T2JqOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVDbGFzc2VzOwotCQotCXByaXZhdGUgYm9vbGVhbiBhZGphY2VudCA9IGZhbHNlOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE1vdmVVcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIE9iamVjdCBlbGVtZW50T2JqLAotCQkJQ29sbGVjdGlvbiBlQ2xhc3NlcykgewotCQlzdXBlcigpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXRoaXMuZWxlbWVudE9iaiA9IGVsZW1lbnRPYmo7Ci0JCXRoaXMuZUNsYXNzZXMgPSBlQ2xhc3NlczsKLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJTGlzdCBhbGxFbGVtZW50cyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGFsbEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChvYmouZXF1YWxzKGVsZW1lbnRPYmopKSB7Ci0JCQkJZWxlbWVudExvY2F0aW9uID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gZWxlbWVudExvY2F0aW9uIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCU9iamVjdCBvYmogPSBhbGxFbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAoVG5nVXRpbC5pc0VDbGFzc0luc3RhbmNlT2YoZUNsYXNzZXMsIG9iaikpIHsKLQkJCQl0cmFuc2ZlckxvY2F0aW9uID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJQnJlYWtkb3duRWxlbWVudCBwcmV2ID0gIChCcmVha2Rvd25FbGVtZW50KSBhbGxFbGVtZW50cy5nZXQodHJhbnNmZXJMb2NhdGlvbik7CQkKLQkJaWYocHJldi5nZXRQcmVzZW50ZWRBZnRlcigpID09IGVsZW1lbnRPYmopIHsKLQkJCWFkamFjZW50ID0gdHJ1ZTsKLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmKGFkamFjZW50KSB7Ci0JCQkvLyBzd2FwICJwcmVzZW50ZWQtYWZ0ZXIiIGVsZW1lbnQKLQkJCS8vCi0JCQlCcmVha2Rvd25FbGVtZW50IHByZXYgPSAgKEJyZWFrZG93bkVsZW1lbnQpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuZ2V0KHRyYW5zZmVyTG9jYXRpb24pOwkJCi0JCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudE9iajsKLQkJCXByZXYuc2V0UHJlc2VudGVkQWZ0ZXIoZS5nZXRQcmVzZW50ZWRBZnRlcigpKTsKLQkJCWUuc2V0UHJlc2VudGVkQWZ0ZXIocHJldik7Ci0JCX0KLQkJKChFTGlzdCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSkubW92ZSh0cmFuc2ZlckxvY2F0aW9uLAotCQkJCWVsZW1lbnRMb2NhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJKChFTGlzdCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSkubW92ZShlbGVtZW50TG9jYXRpb24sCi0JCQkJdHJhbnNmZXJMb2NhdGlvbik7Ci0JCWlmKGFkamFjZW50KSB7Ci0JCQkvLyByZXN0b3JlICJwcmVzZW50ZWQtYWZ0ZXIiIGVsZW1lbnQKLQkJCS8vCi0JCQlCcmVha2Rvd25FbGVtZW50IHByZXYgPSAgKEJyZWFrZG93bkVsZW1lbnQpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuZ2V0KHRyYW5zZmVyTG9jYXRpb24pOwkJCi0JCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudE9iajsKLQkJCWUuc2V0UHJlc2VudGVkQWZ0ZXIocHJldi5nZXRQcmVzZW50ZWRBZnRlcigpKTsKLQkJCXByZXYuc2V0UHJlc2VudGVkQWZ0ZXIoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvT0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL09CU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZWM4NDA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvT0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIERyYWcgYW5kIGRyb3AgY29tbWFuZCBmb3IgZHJhZ2dpbmcgcm9sZSBpbnRvIFRlYW0gQWxsb2NhdGlvbgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9CU0RyYWdBbmREcm9wQ29tbWFuZCBleHRlbmRzIEJTRHJhZ0FuZERyb3BDb21tYW5kIHsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gb3BlcmF0aW9ucwotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gY29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBPQlNEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIE9iamVjdCBvd25lciwKLQkJCWZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQlpZiAob3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0VmFsaWREZXNjcmlwdG9yKG9iaiwKLQkJCQkJCShBY3Rpdml0eSkgb3duZXIsCi0JCQkJCQkoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZG9tYWluKQotCQkJCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSkgPT0gbnVsbDsKLQkJCX0gZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCWlmIChQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoCi0JCQkJCQkoKFRlYW1Qcm9maWxlKSBvd25lcikuZ2V0VGVhbVJvbGVzKCkpLmNvbnRhaW5zKG9iaikpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwgTGlzdCBkcm9wU3JjKSB7Ci0JCWlmIChvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlyZXR1cm4gbmV3IE9CU0Ryb3BDb21tYW5kKChBY3Rpdml0eSkgb3duZXIsIGRyb3BTcmMpOwotCQl9IGVsc2UgaWYgKG93bmVyIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCS8vIHJldHVybiBuZXcgR2VuZXJpY0Ryb3BDb21tYW5kKChUZWFtUHJvZmlsZSkgb3duZXIsCi0JCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwgZHJvcFNyYywKLQkJCS8vIGdldERyb3BBZGFwdGVyKG93bmVyKSk7Ci0JCQlyZXR1cm4gbmV3IEFkZFJvbGVUb1RlYW1Db21tYW5kKChUZWFtUHJvZmlsZSkgb3duZXIsIGRyb3BTcmMpOwotCQl9IGVsc2UgaWYgKG93bmVyIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJcmV0dXJuIG5ldyBHZW5lcmljRHJvcENvbW1hbmQoKENvbXBvc2l0ZVJvbGUpIG93bmVyLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpLAotCQkJCQlkcm9wU3JjLCBnZXREcm9wQWRhcHRlcihvd25lcikpOwotCQl9Ci0KLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JcHJpdmF0ZSBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIgZ2V0RHJvcEFkYXB0ZXIoT2JqZWN0IG93bmVyKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KG93bmVyLCBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBhZGFwdGVyLmNyZWF0ZURyb3BBZGFwdGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9PQlNEcm9wQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9PQlNEcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MTg5ZDI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvT0JTRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uVW5pcXVlTmFtZVBOYW1lSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogQ29tbWFuZCB0byBkcmFwIGFuZCBkcm9wIHJvbGVzIHRvIFRlYW0gQWxsb2NhdGlvbiBicmVha2Rvd24gc3RydWN0dXJlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT0JTRHJvcENvbW1hbmQgZXh0ZW5kcyBCU0Ryb3BDb21tYW5kIHsKLQlwcml2YXRlIEFycmF5TGlzdCB3cERlc2NMaXN0OwotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgcm9sZURlc2NMaXN0OwotCi0JcHJpdmF0ZSBNYXAgcm9sZURlc2NUZWFtUHJvZmlsZU1hcDsKLQotCXByaXZhdGUgTWFwIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0czsKLQotCXByaXZhdGUgSGFzaE1hcCB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcDsKLQotCXByaXZhdGUgSGFzaE1hcCB3cGRUb1Rhc2tGZWF0dXJlc01hcDsgLy8gbWFwIG9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciB0bwotCi0JLy8gbWFwIG9mIHRhc2sgb3QgZmVhdHVyZSBsaXN0Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlncmF0b3I7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbmV3RHVwbGljYXRlc1JlbW92ZWQ7Ci0JCi0JcHVibGljIE9CU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdCwgTGlzdCByb2xlcykgewotCQlzdXBlcihhY3QsIHJvbGVzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHJvcEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlKSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZHJvcEVsZW1lbnRzCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSBzeW5jaEZlYXR1cmVzCi0JICovCi0JcHVibGljIE9CU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IGRyb3BFbGVtZW50cywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTZXQgc3luY2hGZWF0dXJlcywKLQkJCUlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0JCXN1cGVyKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIGNvbmZpZywgc3luY2hGZWF0dXJlcyk7Ci0JCXRoaXMuY29uZmlncmF0b3IgPSBjb25maWd1cmF0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNwcmVFeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjdXRlKCkgewotCQlpZiAoIXN1cGVyLnByZUV4ZWN1dGUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRhc2tEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd3BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzID0gbmV3IEhhc2hNYXAoKTsKLQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2ggPSBzeW5jaHJvbml6ZSA/IGJhdGNoQ29tbWFuZAotCQkJCS5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpIDogbnVsbDsKLQotCQlMaXN0IGJlcyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCVVuaXF1ZU5hbWVQTmFtZUhhbmRsZXIgdW5pcXVlTmFtZXNIYW5kbGVyID0gbmV3IFVuaXF1ZU5hbWVQTmFtZUhhbmRsZXIoYmVzLCBiZXMpOwotCQkJCQotCQlpbnQgc2l6ZSA9IGRyb3BFbGVtZW50cy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlSb2xlIHJvbGUgPSAoUm9sZSkgZHJvcEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3Iocm9sZSkpIHsKLQkJCQlyb2xlID0gKFJvbGUpIFRuZ1V0aWwuZ2V0QmFzZShyb2xlKTsKLQkJCX0KLQotCQkJLy8gY2hlY2sgaWYgdGhlIHJvbGUgZGVzY3JpcHRvciBvZiB0aGUgcm9sZSBleGlzdHMgdW5kZXIgdGhpcwotCQkJLy8gYWN0aXZpdHkKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJLmdldERlc2NyaXB0b3Iocm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0KLQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIHJvbGUgZGVzY3JpcHRvciBvYmplY3QKLQkJCQlyb2xlRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGUpOwotCQkJCXVuaXF1ZU5hbWVzSGFuZGxlci5lbnN1cmVVbmlxdWUocm9sZURlc2MpOwotCQkJCXJvbGVEZXNjTGlzdC5hZGQocm9sZURlc2MpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBuZWVkIHRvIGNsZWFyIGFsbCB0aGUgcmVmcmVzaGFibGUgZmVhdHVyZXMgb2YgdGhlIGV4aXN0aW5nCi0JCQkJLy8gZGVzY3JpcHRvcgotCQkJCS8vCi0JCQkJaWYgKHN5bmNocm9uaXplCi0JCQkJCQkmJiByb2xlRGVzYy5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJYmF0Y2hDb21tYW5kLmdldERlc2NyaXB0b3JzVG9SZWZyZXNoKCkuYWRkKHJvbGVEZXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiBub3QgYSBzeW5jaHJvbml6YXRpb24sIGdldCBhbGwgd29ya3Byb2R1Y3RzIHdoaWNoIGhhdmUgcm9sZSBhcwotCQkvLyByZXNwb25zaWJsZSByb2xlIGZvcgotCQkvLyB3aGljaCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBuZWVkcyB0byBiZSBjcmVhdGVkCi0JCS8vCi0JCWlmICghc3luY2hyb25pemUpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJUm9sZSByb2xlID0gKFJvbGUpIGRyb3BFbGVtZW50cy5nZXQoaSk7Ci0JCQkJTGlzdCB3b3JrUHJvZHVjdHMgPSBQcm9jZXNzVXRpbC5nZXRXb3JrUHJvZHVjdHNGb3JSb2xlKHJvbGUsCi0JCQkJCQljb25maWcpOwotCQkJCWlmICgod29ya1Byb2R1Y3RzICE9IG51bGwpICYmICghKHdvcmtQcm9kdWN0cy5pc0VtcHR5KCkpKSkgewotCQkJCQlIYXNoTWFwIHdwVG9FeGlzdGluZ0Rlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChhY3Rpdml0eQotCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKHdwRGVzY0xpc3QpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3b3JrUHJvZHVjdHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgaXRlci5uZXh0KCk7CQkJCQkJCi0JCQkJCQlPYmplY3Qgd3BkID0gUHJvY2Vzc1V0aWwuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwRGVzY0xpc3QsIHdwKTsKLQkJCQkJCWlmKHdwZCA9PSBudWxsKSB7Ci0JCQkJCQkJd3BkID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3Iod3AsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQkJfQotCQkJCQkJaWYgKHdwZCAhPSBudWxsKSB7Ci0JCQkJCQkJd3BUb0V4aXN0aW5nRGVzY3JpcHRvck1hcC5wdXQod3AsIHdwZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJTGlzdCBzZWxlY3RlZFdvcmtQcm9kdWN0cyA9IG5ldyBBcnJheUxpc3QoCi0JCQkJCQkJd3BUb0V4aXN0aW5nRGVzY3JpcHRvck1hcC5rZXlTZXQoKSk7Ci0JCQkJCXdvcmtQcm9kdWN0cy5yZW1vdmVBbGwoc2VsZWN0ZWRXb3JrUHJvZHVjdHMpOwotCQkJCQkKLQkJCQkJZmluYWwgTGlzdCBmaW5hbFNlbGVjdGVkV3BzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpZiAoIXdvcmtQcm9kdWN0cy5pc0VtcHR5KCkpIHsKLQkJCQkJCWZpbmFsIExpc3QgZmluYWxXcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmaW5hbFdwcy5hZGRBbGwod29ya1Byb2R1Y3RzKTsKLQkJCQkJCWZpbmFsIFJvbGUgZmluYWxSb2xlID0gcm9sZTsKLQkJCQkJCQotCQkJCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bkluVUlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJTGlzdCBzZWxlY3RlZCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJCQkJCS5zZWxlY3RXb3JrUHJvZHVjdHMoZmluYWxXcHMsIGZpbmFsUm9sZSk7Ci0JCQkJCQkJCWlmIChzZWxlY3RlZCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlmaW5hbFNlbGVjdGVkV3BzLmFkZEFsbChzZWxlY3RlZCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCi0JCQkJCXNlbGVjdGVkV29ya1Byb2R1Y3RzLmFkZEFsbChmaW5hbFNlbGVjdGVkV3BzKTsKLQkJCQkJaWYgKCFzZWxlY3RlZFdvcmtQcm9kdWN0cy5pc0VtcHR5KCkpIHsKLQkJCQkJCUhhc2hTZXQgYWxsU2VsZWN0ZWRUYXNrcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2VsZWN0ZWRXb3JrUHJvZHVjdHMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgc2VsZWN0ZWRXb3JrUHJvZHVjdHMKLQkJCQkJCQkJCS5nZXQoaik7Ci0KLQkJCQkJCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHdwKSkgewotCQkJCQkJCQl3cCA9IChXb3JrUHJvZHVjdCkgVG5nVXRpbC5nZXRCYXNlKHdwKTsKLQkJCQkJCQl9Ci0JCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHdwVG9FeGlzdGluZ0Rlc2NyaXB0b3JNYXAuZ2V0KHdwKTsKLQkJCQkJCQlpZiAod3BEZXNjID09IG51bGwpIHsKLQkJCQkJCQkJd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCQkJCQkJLmdldERlc2NyaXB0b3Iod3AsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAod3BEZXNjID09IG51bGwpIHsKLQkJCQkJCQkJd3BEZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCwKLQkJCQkJCQkJCQkJCWNvbmZpZywKLQkJCQkJCQkJCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyk7Ci0JCQkJCQkJCXdwRGVzY0xpc3QuYWRkKHdwRGVzYyk7Ci0KLQkJCQkJCQkJLy8gYXV0b21hdGljIGFkZGluZyB0byB0aGUgZXhpc3RpbmcgZGVsaXZlcmFibGUKLQkJCQkJCQkJLy8gZGVzY3JpcHRvciBpbiB0aGUgYWN0aXZpdHkncyBzY29wZSBpZiB0aGVyZQotCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkvLyBhbnkKLQkJCQkJCQkJLy8gdmFsaWQgb25lLgotCQkJCQkJCQkvLwotCQkJCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJCQkJCS5nZXREZWxpdmVyYWJsZShhY3Rpdml0eSwgd3ApOwotCQkJCQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5wdXQod3BEZXNjLAotCQkJCQkJCQkJCQlkZXNjcmlwdG9yKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwKLQkJCQkJCQkJCQkmJiB3cERlc2MuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkJCQkJCQkJCQkJCS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2guYWRkKHdwRGVzYyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUKLQkJCQkJCQkJCQkmJiBzeW5jaEZlYXR1cmVzCi0JCQkJCQkJCQkJCQkuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpKSkgewotCQkJCQkJCQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZURlbGl2ZXJhYmxlUGFydHMoCi0JCQkJCQkJCQkJCXdwRGVzYywgKERlbGl2ZXJhYmxlKSB3cCwgY29uZmlnLAotCQkJCQkJCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsCi0JCQkJCQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQotCQkJCQkJCS8vIGdldCBhbGwgcG9zc2libGUgdGFza3MgZm9yIHRoaXMgd29ya3Byb2R1Y3QgZm9yCi0JCQkJCQkJLy8gd2hpY2ggdGFzayBkZXNjcmlwdG9yIG5lZWRzIHRvIGJlIGNyZWF0ZWQKLQkJCQkJCQlMaXN0IHRhc2tzID0gUHJvY2Vzc1V0aWwuZ2V0VGFza3NGb3JXb3JrUHJvZHVjdCh3cCwKLQkJCQkJCQkJCWNvbmZpZyk7Ci0KLQkJCQkJCQlpZiAoKHRhc2tzICE9IG51bGwpICYmICh0YXNrcy5zaXplKCkgPiAwKSkgewotCQkJCQkJCQkvLyBleGNsdWRlIGFueSB0YXNrIHRoYXQgaXMgYWxyZWFkeSBzZWxlY3RlZCBvciBhbHJlYWR5IGV4aXN0cyBpbiBhY3Rpdml0eQotCQkJCQkJCQkvLwotCQkJCQkJCQl0YXNrcy5yZW1vdmVBbGwoYWxsU2VsZWN0ZWRUYXNrcyk7Ci0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhc2tzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJVGFzayB0YXNrID0gKFRhc2spIGl0ZXIubmV4dCgpOwotCQkJCQkJCQkJT2JqZWN0IHRkID0gUHJvY2Vzc1V0aWwuZ2V0VGFza0Rlc2NyaXB0b3IodGFza0Rlc2NMaXN0LCB0YXNrKTsgCi0JCQkJCQkJCQlpZih0ZCA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJdGQgPSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcih0YXNrLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmKHRkICE9IG51bGwpIHsKLQkJCQkJCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJaWYgKCF0YXNrcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCWZpbmFsIExpc3QgZmluYWxUYXNrcyA9IHRhc2tzOwotCQkJCQkJCQkJZmluYWwgV29ya1Byb2R1Y3QgZmluYWxXcCA9IHdwOwotCQkJCQkJCQkJZmluYWwgTGlzdCBmaW5hbFNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQkJTGlzdCBzZWxlY3RlZFRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQkJLy8gc2hvdyB0YXNrIHNlbGVjdGlvbnMgZGlhbG9nCi0JCQkJCQkJCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuSW5VSVRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCQlMaXN0IHNlbGVjdGVkID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkJCQkJCS5zZWxlY3RUYXNrcyhmaW5hbFRhc2tzLCBmaW5hbFdwKTsKLQkJCQkJCQkJCQkJZmluYWxTZWxlY3RlZC5hZGRBbGwoc2VsZWN0ZWQpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0pOwotCQkJCQkJCQkJc2VsZWN0ZWRUYXNrcy5hZGRBbGwoZmluYWxTZWxlY3RlZCk7Ci0JCQkJCQkJCQlpZiAoKHNlbGVjdGVkVGFza3MgIT0gbnVsbCkKLQkJCQkJCQkJCQkJJiYgKCghc2VsZWN0ZWRUYXNrcy5pc0VtcHR5KCkpKSkgewotCQkJCQkJCQkJCWFsbFNlbGVjdGVkVGFza3MuYWRkQWxsKHNlbGVjdGVkVGFza3MpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkvLyBJZiBubyB0YXNrcyBhcmUgc2VsZWN0ZWQsIGFkZAotCQkJCQkJCQkJCS8vIFJlc3BvbnNpYmxlIHJvbGUgdG8gd3AKLQkJCQkJCQkJCQlQQlNEcm9wQ29tbWFuZC5hZGRSZXNwb25zaWJsZVJvbGUoCi0JCQkJCQkJCQkJCQl3cERlc2MsIGFjdGl2aXR5LCByb2xlRGVzY0xpc3QsCi0JCQkJCQkJCQkJCQludWxsLCBjb25maWcpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gSWYgdGhlcmUgYXJlIG5vIHRhc2tzIHRvIHNob3csIGFkZAotCQkJCQkJCQkvLyBSZXNwb25zaWJsZSByb2xlIHRvIHdwCi0JCQkJCQkJCVBCU0Ryb3BDb21tYW5kLmFkZFJlc3BvbnNpYmxlUm9sZSh3cERlc2MsCi0JCQkJCQkJCQkJYWN0aXZpdHksIHJvbGVEZXNjTGlzdCwgbnVsbCwgY29uZmlnKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIGNyZWF0ZSB0YXNrIGRlc2NyaXB0b3JzIGZvciB0aGlzIHdvcmtwcm9kdWN0Ci0JCQkJCQlpZiAoKGFsbFNlbGVjdGVkVGFza3MgIT0gbnVsbCkKLQkJCQkJCQkJJiYgKCEoYWxsU2VsZWN0ZWRUYXNrcy5pc0VtcHR5KCkpKSkgewotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGFsbFNlbGVjdGVkVGFza3MuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQotCQkJCQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXRvci5uZXh0KCk7Ci0KLQkJCQkJCQkJLy8gY2FsbCB0aGlzIG1ldGhvZCBldmVuIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUKLQkJCQkJCQkJLy8gZ2l2ZW4gdGFzayBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIGFjdGl2aXR5Ci0JCQkJCQkJCS8vIHRvIGFkZCBhbnkgYWRkaXRpb25hbCByZWxhdGlvbnNoaXBzIGluIGNhc2UKLQkJCQkJCQkJLy8gb2YKLQkJCQkJCQkJLy8gcmVjZW50IGNoYW5nZSBpbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JCQkJCQkJCS8vIG9mIHRoZSBwcm9jZXNzLgotCQkJCQkJCQlQQlNEcm9wQ29tbWFuZAotCQkJCQkJCQkJCS5hZGRUb0Rlc2NyaXB0b3JMaXN0cygKLQkJCQkJCQkJCQkJCXRhc2ssCi0JCQkJCQkJCQkJCQlhY3Rpdml0eSwKLQkJCQkJCQkJCQkJCXRhc2tEZXNjTGlzdCwKLQkJCQkJCQkJCQkJCXJvbGVEZXNjTGlzdCwKLQkJCQkJCQkJCQkJCXdwRGVzY0xpc3QsCi0JCQkJCQkJCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsCi0JCQkJCQkJCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaCwKLQkJCQkJCQkJCQkJCWJhdGNoQ29tbWFuZAotCQkJCQkJCQkJCQkJCQkuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCksCi0JCQkJCQkJCQkJCQljb25maWcsIHN5bmNoRmVhdHVyZXMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiAoIXJvbGVEZXNjTGlzdC5pc0VtcHR5KCkgLy8gfHwgIXJvbGVBc3NvY2lhdGlvbkxpc3QuaXNFbXB0eSgpCi0JCQkJfHwgIXRhc2tEZXNjTGlzdC5pc0VtcHR5KCkKLQkJCQl8fCAhd3BEZXNjTGlzdC5pc0VtcHR5KCkKLQkJCQl8fCAod3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzICE9IG51bGwgJiYgIXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cwotCQkJCQkJLmlzRW1wdHkoKSkgfHwgIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKSkKLQkJCQl8fCAoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCAmJiAhZGVzY3JpcHRvcnNUb1JlZnJlc2gKLQkJCQkJCS5pc0VtcHR5KCkpIHx8IGJhdGNoQ29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkb0V4ZWN1dGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJcmVtb3ZlTmV3RHVwbGljYXRlcygpOwotCi0JCS8vIGFkZCByb2xlIGRlc2NyaXB0b3JzIHRvIGFjdGl2aXR5Ci0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKHJvbGVEZXNjTGlzdCk7Ci0KLQkJaWYgKHJvbGVEZXNjVGVhbVByb2ZpbGVNYXAgPT0gbnVsbCkgewotCQkJLy8gcHJlcGFyZSBmb3IgYXV0b21hdGljIGFzc2lnbm1lbnQgb2Ygcm9sZSBkZXNjcmlwdG9yIHRvIHRlYW0KLQkJCS8vIHByb2ZpbGUKLQkJCS8vCi0JCQlyb2xlRGVzY1RlYW1Qcm9maWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VGVhbSgKLQkJCQkJCWFjdGl2aXR5LCByb2xlRGVzYy5nZXRSb2xlKCkpOwotCQkJCWlmICh0ZWFtUHJvZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXJvbGVEZXNjVGVhbVByb2ZpbGVNYXAucHV0KHJvbGVEZXNjLCB0ZWFtUHJvZmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIHJvbGUgZGVzY3JpcHRvcnMgdG8gdGVhbSBwcm9maWxlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY1RlYW1Qcm9maWxlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQl0ZWFtLmdldFRlYW1Sb2xlcygpLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0JCX0KLQotCQkvLyBhdXRvbWF0aWNhbGx5IGFkZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byBkZWxpdmVyYWJsZSBwYXJ0Ci0JCS8vCi0JCWlmICghd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJZGVsaXZlcmFibGUuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKHdwRGVzY0xpc3QpOwotCi0JCS8vIGFkZCB0YXNrIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKHRhc2tEZXNjTGlzdCk7Ci0KLQkJLy8gYWRkIGRlbGl2ZXJhYmxlIHBhcnRzIHRvIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJaWYgKCF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkuZ2V0S2V5KCk7Ci0JCQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGRBbGwoCi0JCQkJCQkoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgbmV3IGRlc2NyaXB0b3JzIHRvIGFjdGl2aXR5J3MgcGFja2FnZQotCQkvLwotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHRhc2tEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHdwRGVzY0xpc3QpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgbmV3IGVsZW1lbnRzIHRoYXQgYXJlIGR1cGxpY2F0ZSBiL2MgdGhleSBhcmUgY3JlYXRlZCBieSB0aGUKLQkgKiBwcmV2aW91cyBXQlNEcm9wQ29tbWFuZAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVOZXdEdXBsaWNhdGVzKCkgewotCQlpZiAoc3luY2hyb25pemUpIHsKLQkJCWlmICghbmV3RHVwbGljYXRlc1JlbW92ZWQpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCU9iamVjdCBkZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3Iod3BkCi0JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCksIGFjdGl2aXR5LAotCQkJCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQlpZiAod3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzICE9IG51bGwpIHsKLQkJCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMucmVtb3ZlKHdwZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJCQkJCXdwZFRvVGFza0ZlYXR1cmVzTWFwLnJlbW92ZSh3cGQpOwotCQkJCQkJfQotCQkJCQkJaWYgKHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwICE9IG51bGwpIHsKLQkJCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5yZW1vdmUod3BkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQluZXdEdXBsaWNhdGVzUmVtb3ZlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2RvVW5kbygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VbmRvKCkgewotCQkvLyByZW1vdmUgcm9sZSBkZXNjcmlwdG9ycyBmcm9tIGFjdGl2aXR5Ci0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHJvbGVEZXNjTGlzdCk7Ci0KLQkJLy8gcmVtb3ZlIHJvbGUgZGVzY3JpcHRvcnMgZnJvbSB0ZWFtIHByb2ZpbGVzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVEZXNjVGVhbVByb2ZpbGVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKLQkJfQotCi0JCS8vIHJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwod3BEZXNjTGlzdCk7Ci0KLQkJLy8gcmVtb3ZlIHRhc2sgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwodGFza0Rlc2NMaXN0KTsKLQotCQkvLyAvLyBkaXNhc3NvY2lhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyB3aXRoIHRhc2sgZGVzY3JpcHRvcnMKLQkJLy8gLy8KLQkJLy8gaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb1Rhc2tGZWF0dXJlc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJLy8gTWFwIHRhc2tGZWF0dXJlcyA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0YXNrRmVhdHVyZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkvLyAuaGFzTmV4dCgpOykgewotCQkvLyBNYXAuRW50cnkgZW50ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkvLyBUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikKLQkJLy8gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3IoZW50LmdldEtleSgpLCBhY3Rpdml0eSwKLQkJLy8gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSAoKENvbGxlY3Rpb24pZW50LmdldFZhbHVlKCkpLml0ZXJhdG9yKCk7Ci0JCS8vIGl0ZXJhdG9yMQotCQkvLyAuaGFzTmV4dCgpOykgewotCQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBkZXNjRmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpCi0JCS8vIEZFQVRVUkVfTUFQLmdldChmKTsKLQkJLy8gaWYoZGVzY0ZlYXR1cmUuaXNNYW55KCkpIHsKLQkJLy8gKChMaXN0KXRhc2tEZXNjLmVHZXQoZGVzY0ZlYXR1cmUpKS5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwotCQkvLyB9Ci0JCS8vIGVsc2UgewotCQkvLyB0YXNrRGVzYy5lU2V0KGRlc2NGZWF0dXJlLCBudWxsKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0KLQkJLy8gcmVtb3ZlIGRlbGl2ZXJhYmxlIHBhcnRzIHRvIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJaWYgKCF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkuZ2V0S2V5KCk7Ci0JCQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5yZW1vdmVBbGwoCi0JCQkJCQkoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZW1vdmUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgZnJvbSBkZWxpdmVyYWJsZSBwYXJ0Ci0JCS8vCi0JCWlmICghd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJZGVsaXZlcmFibGUuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZW1vdmUgcm9sZSBkZXNjcmlwdG9ycyBmcm9tIGFjdGl2aXR5J3MgcGFja2FnZQotCQkvLwotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHRhc2tEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHdwRGVzY0xpc3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyAvKioKLQkvLyAqIEdldCB0YXNrIGRlc2NyaXB0b3JzIG1hcCBmb3IgYW4gYWN0aXZpdHkKLQkvLyAqIEBwYXJhbSBhY3Rpdml0eQotCS8vICogQHJldHVybgotCS8vICovCi0JLy8gcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBnZXRUYXNrc01hcEZvckFjdGl2aXR5KEFjdGl2aXR5IGFjdGl2aXR5KQotCS8vIHsKLQkvLyBMaXN0IGVsZW1lbnRzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkvLyBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JLy8gZm9yIChpbnQgaT0wOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspCi0JLy8gewotCS8vIE9iamVjdCBvYmogPSBlbGVtZW50cy5nZXQoaSk7Ci0JLy8gaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKQotCS8vIHsKLQkvLyBUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgb2JqOwotCS8vIFRhc2sgdGFzayA9IHRhc2tEZXNjLmdldFRhc2soKTsKLQkvLyBpZiAodGFzayAhPSBudWxsKQotCS8vIHsKLQkvLyBtYXAucHV0KHRhc2ssIHRhc2tEZXNjKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gbWFwOwotCS8vIH0KLQkvLwkKLQkvLwkKLQkvLyAvKioKLQkvLyAqIFNob3cgUm9sZUFzc29jaWF0aW9uIERpYWxvZwotCS8vICogQHBhcmFtIHRhc2tzCi0JLy8gKi8KLQkvLyBwcml2YXRlIHN0YXRpYyBpbnQgc2hvd1JvbGVBc3NvY2lhdGlvbkRpYWxvZyhUYXNrIHRhc2spCi0JLy8gewotCS8vCQkKLQkvLyBSb2xlQXNzb2NpYXRpb25EaWFsb2cgcm9sZUFzc29jID0gbmV3Ci0JLy8gUm9sZUFzc29jaWF0aW9uRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHRhc2spOwotCS8vIHJvbGVBc3NvYy5vcGVuKCk7Ci0JLy8JCQotCS8vIC8vIHNlbGVjdGVkIHRhc2tzOwotCS8vIHJldHVybiByb2xlQXNzb2MuZ2V0Um9sZUFzc29jaWF0aW9uKCk7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZiAocm9sZURlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXJldHVybiByb2xlRGVzY0xpc3Q7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChyb2xlRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJcm9sZURlc2NMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHJvbGVEZXNjVGVhbVByb2ZpbGVNYXAgIT0gbnVsbCkgewotCQkJcm9sZURlc2NUZWFtUHJvZmlsZU1hcC5jbGVhcigpOwotCQl9Ci0JCWlmICh3cERlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXdwRGVzY0xpc3QuY2xlYXIoKTsKLQkJfQotCQlpZiAod3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzICE9IG51bGwpIHsKLQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5jbGVhcigpOwotCQl9Ci0JCWlmICh3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCAhPSBudWxsKSB7Ci0JCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5jbGVhcigpOwotCQl9Ci0JCWlmICh3cGRUb1Rhc2tGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQl3cGRUb1Rhc2tGZWF0dXJlc01hcC5jbGVhcigpOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNleGVjdXRlTmVzdGVkQ29tbWFuZHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpIHsKLQkJTGlzdCBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCS5nZXROZXN0ZWRDb21tYW5kUHJvdmlkZXJzKCk7Ci0JCWlmICghbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5pc0VtcHR5KCkpIHsKLQkJCWlmICghdGFza0Rlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJSU5lc3RlZENvbW1hbmRQcm92aWRlciBjbWRQcm92aWRlciA9IChJTmVzdGVkQ29tbWFuZFByb3ZpZGVyKSBpdGVyCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNvbW1hbmQgY21kID0gY21kUHJvdmlkZXIuY3JlYXRlUmVsYXRlZE9iamVjdHMoCi0JCQkJCQkJCXRhc2tEZXNjTGlzdCwgT0JTRHJvcENvbW1hbmQudGhpcyk7Ci0JCQkJCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJCQkJZ2V0TmVzdGVkQ29tbWFuZHMoKS5hZGQoY21kKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN1cGVyLmV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUEJTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1BCU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZmYyZWMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUEJTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogRHJhZyBhbmQgZHJvcCBjb21tYW5kIGZvciBkcm9wcGluZyB3b3JrIHByb2R1Y3RzIGludG8gV1AgVXNhZ2Ugc3RydWN0dXJlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgQlNEcmFnQW5kRHJvcENvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBvcGVyYXRpb25zCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICovCi0JcHVibGljIFBCU0RyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLAotCQkJZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcmFnQW5kRHJvcENvbW1hbmQjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJb2JqID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQotCQlpZihvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJaWYob3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0VmFsaWREZXNjcmlwdG9yKG9iaiwgKEFjdGl2aXR5KSBvd25lciwKLQkJCQkJCSgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKWRvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKSkgPT0gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcmFnQW5kRHJvcENvbW1hbmQjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwgTGlzdCBkcm9wU3JjKSB7Ci0JCXJldHVybiBuZXcgUEJTRHJvcENvbW1hbmQoKEFjdGl2aXR5KSBvd25lciwgZHJvcFNyYyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1BCU0Ryb3BDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1BCU0Ryb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjYWIzMDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9QQlNEcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5VbmlxdWVOYW1lUE5hbWVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIGRyYWcgYW5kIGRyb3Agd29yayBwcm9kdWN0cyB0byBXb3JrIFByb2R1Y3QgVXNhZ2UgYnJlYWtkb3duCi0gKiBzdHJ1Y3R1cmUKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQQlNEcm9wQ29tbWFuZCBleHRlbmRzIEJTRHJvcENvbW1hbmQgewotCXByaXZhdGUgQXJyYXlMaXN0IHdwRGVzY0xpc3Q7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCByb2xlRGVzY0xpc3Q7Ci0KLQlwcml2YXRlIE1hcCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHM7Ci0KLQlwcml2YXRlIEhhc2hNYXAgd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXA7Ci0KLQlwcml2YXRlIEJhdGNoQ29tbWFuZCB1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kOwotCi0JcHJpdmF0ZSBib29sZWFuIG5ld0R1cGxpY2F0ZXNSZW1vdmVkOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGxpbmtlZFRhc2tzOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdwZFRvVGFza0ZlYXR1cmVzTWFwOwotCi0JcHVibGljIFBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IHdvcmtQcm9kdWN0cykgewotCQlzdXBlcihhY3Rpdml0eSwgd29ya1Byb2R1Y3RzKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZHJvcEVsZW1lbnRzCi0JICogQHBhcmFtIHN5bmNoCi0JICovCi0JcHVibGljIFBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IGRyb3BFbGVtZW50cywgYm9vbGVhbiBzeW5jaCkgewotCQlzdXBlcihhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBzeW5jaCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGRyb3BFbGVtZW50cwotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcwotCSAqLwotCXB1YmxpYyBQQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBkcm9wRWxlbWVudHMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMsIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0JCXN1cGVyKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIGNvbmZpZywgc3luY2hGZWF0dXJlcyk7Ci0JCXRoaXMuY29uZmlndXJhdG9yID0gY29uZmlndXJhdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjcHJlRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY3V0ZSgpIHsKLQkJaWYgKCFzdXBlci5wcmVFeGVjdXRlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJd3BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGFza0Rlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlpZighc3luY2hyb25pemUgfHwgKHN5bmNocm9uaXplICYmIHN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkpKSkgewotCQkJLy8gYWRkIHN1YmFydGlmYWN0cyB0byBkcm9wRWxlbWVudHMgbGlzdCBpZiB0aGVyZSBpcyBhbnkKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGRyb3BFbGVtZW50cykuaXRlcmF0b3IoKTsgaXRlcgotCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZWxlbWVudCwgZmFsc2UpIHsKLQkJCQkJCQotCQkJCQkJLyoqCi0JCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkJICovCi0JCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDgyMDQ3Nzg4NzQyNjA4NzI2Mkw7Ci0JCQkJCQkKLQkJCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJT2JqZWN0IHN1YkFydGlmYWN0cyA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldFJlZmVyZW5jZSgKLQkJCQkJCQkJCShWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCQkJCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCQkJCQlyZXR1cm4gKChDb2xsZWN0aW9uKXN1YkFydGlmYWN0cykuaXRlcmF0b3IoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9OwotCQkJCQkKLQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJQXJ0aWZhY3Qgc3ViQXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmICghZHJvcEVsZW1lbnRzLmNvbnRhaW5zKHN1YkFydGlmYWN0KSAmJiBwcmVwYXJlQWRkKChXb3JrUHJvZHVjdCkgc3ViQXJ0aWZhY3QpKSAKLQkJCQkJCXsKLQkJCQkJCQlkcm9wRWxlbWVudHMuYWRkKHN1YkFydGlmYWN0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2ggPSBzeW5jaHJvbml6ZSA/IGJhdGNoQ29tbWFuZC5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpIDogbnVsbDsKLQkJCi0JCUxpc3QgYmVzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJVW5pcXVlTmFtZVBOYW1lSGFuZGxlciB1bmlxdWVOYW1lc0hhbmRsZXIgPSBuZXcgVW5pcXVlTmFtZVBOYW1lSGFuZGxlcihiZXMsIGJlcyk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGRyb3BFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGRyb3BFbGVtZW50cy5nZXQoaSk7CQkJCi0JCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHdwKSkgewotCQkJCXdwID0gKFdvcmtQcm9kdWN0KSBUbmdVdGlsLmdldEJhc2Uod3ApOwotCQkJfQotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkuZ2V0RGVzY3JpcHRvcih3cCwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQlpZiAod3BEZXNjID09IG51bGwpIHsKLQkJCQl3cERlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwLCBjb25maWcsCi0JCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMpOwotCQkJCXVuaXF1ZU5hbWVzSGFuZGxlci5lbnN1cmVVbmlxdWUod3BEZXNjKTsKLQkJCQl3cERlc2NMaXN0LmFkZCh3cERlc2MpOwotCi0JCQkJLy8gYXV0b21hdGljIGFkZGluZyB0byB0aGUgZXhpc3RpbmcgZGVsaXZlcmFibGUgZGVzY3JpcHRvciBpbgotCQkJCS8vIHRoZSBhY3Rpdml0eSdzIHNjb3BlIGlmIHRoZXJlIGlzIGFueQotCQkJCS8vIHZhbGlkIG9uZS4KLQkJCQkvLwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkuZ2V0RGVsaXZlcmFibGUoYWN0aXZpdHksIHdwKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLnB1dCh3cERlc2MsIGRlc2NyaXB0b3IpOwotCQkJCX0KLQkJCQkKLQkJCQlpZih3cGRUb1Rhc2tGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQkJCS8vIHJlcGxhY2Ugd29yayBwcm9kdWN0IHdpdGggaXRzIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGluIHdwZFRvVGFza0ZlYXR1cmVzTWFwCi0JCQkJCS8vCi0JCQkJCU1hcCBmZWF0dXJlc01hcCA9IChNYXApIHdwZFRvVGFza0ZlYXR1cmVzTWFwLmdldCh3cCk7Ci0JCQkJCWlmKGZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCQkJCXdwZFRvVGFza0ZlYXR1cmVzTWFwLnJlbW92ZSh3cCk7Ci0JCQkJCQl3cGRUb1Rhc2tGZWF0dXJlc01hcC5wdXQod3BEZXNjLCBmZWF0dXJlc01hcCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgd3BEZXNjLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZCh3cERlc2MpOwotCQkJCX0KLQkJCQlpZiAod3AgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSAmJiBzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpKSkgewotCQkJCQlQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlRGVsaXZlcmFibGVQYXJ0cyh3cERlc2MsCi0JCQkJCQkJKERlbGl2ZXJhYmxlKSB3cCwgY29uZmlnLCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsIGRlc2NyaXB0b3JzVG9SZWZyZXNoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJCQl3cGRUb1Rhc2tGZWF0dXJlc01hcC5yZW1vdmUod3ApOwotCQkJCX0KLQkJCX0KLQotCQkKLQkJCWlmICghc3luY2hyb25pemUpIHsKLQkJCQkvLyBnZXQgYWxsIHBvc3NpYmxlIHRhc2tzIGZvciB0aGlzIHdvcmtwcm9kdWN0IGZvcgotCQkJCS8vIHdoaWNoIHRhc2sgZGVzY3JpcHRvciBuZWVkcyB0byBiZSBjcmVhdGVkCi0JCQkJTGlzdCB0YXNrcyA9IFByb2Nlc3NVdGlsLmdldFRhc2tzRm9yV29ya1Byb2R1Y3Qod3AsIGNvbmZpZyk7Ci0KLQkJCQlpZiAoKHRhc2tzICE9IG51bGwpICYmICh0YXNrcy5zaXplKCkgPiAwKSkgewotCQkJCQkvLyBzaG93IHRhc2sgc2VsZWN0aW9ucyBkaWFsb2cJCQotCQkJCQlmaW5hbCBMaXN0IGZpbmFsVGFza3MgPSB0YXNrczsKLQkJCQkJZmluYWwgV29ya1Byb2R1Y3QgZmluYWxXcCA9IHdwOwotCQkJCQlmaW5hbCBMaXN0IGZpbmFsU2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCUxpc3Qgc2VsZWN0ZWRUYXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJLy8gc2hvdyB0YXNrIHNlbGVjdGlvbnMgZGlhbG9nCi0JCQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5JblVJVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlMaXN0IHNlbGVjdGVkID0gVXNlckludGVyYWN0aW9uSGVscGVyLnNlbGVjdFRhc2tzKAotCQkJCQkJCQkJZmluYWxUYXNrcywgZmluYWxXcCk7CQkJCQkJCi0JCQkJCQkJZmluYWxTZWxlY3RlZC5hZGRBbGwoc2VsZWN0ZWQpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkJc2VsZWN0ZWRUYXNrcy5hZGRBbGwoZmluYWxTZWxlY3RlZCk7Ci0JCQkJCQotCQkJCQkvLyBjcmVhdGUgdGFzayBkZXNjcmlwdG9ycyBmb3IgdGhpcyB3b3JrcHJvZHVjdAotCQkJCQlpZiAoKHNlbGVjdGVkVGFza3MgIT0gbnVsbCkgJiYgKCEoc2VsZWN0ZWRUYXNrcy5pc0VtcHR5KCkpKSkgewotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzZWxlY3RlZFRhc2tzLnNpemUoKTsgaisrKSB7Ci0JCQkJCQkJVGFzayB0YXNrID0gKFRhc2spIHNlbGVjdGVkVGFza3MuZ2V0KGopOwotCi0JCQkJCQkJLy8gY2FsbCB0aGlzIG1ldGhvZCBldmVuIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUKLQkJCQkJCQkvLyBnaXZlbiB0YXNrIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgYWN0aXZpdHkKLQkJCQkJCQkvLyB0byBhZGQgYW55IGFkZGl0aW9uYWwgcmVsYXRpb25zaGlwcyBpbiBjYXNlIG9mCi0JCQkJCQkJLy8gcmVjZW50IGNoYW5nZSBpbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JCQkJCQkJLy8gb2YgdGhlIHByb2Nlc3MuCi0JCQkJCQkJUEJTRHJvcENvbW1hbmQuYWRkVG9EZXNjcmlwdG9yTGlzdHModGFzaywgYWN0aXZpdHksCi0JCQkJCQkJCQl0YXNrRGVzY0xpc3QsIHJvbGVEZXNjTGlzdCwgd3BEZXNjTGlzdCwKLQkJCQkJCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cywKLQkJCQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLAotCQkJCQkJCQkJYmF0Y2hDb21tYW5kLmdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpLCAKLQkJCQkJCQkJCWNvbmZpZywgc3luY2hGZWF0dXJlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBJZiBubyB0YXNrcyBhcmUgc2VsZWN0ZWQsIGFkZCBSZXNwb25zaWJsZSByb2xlIHRvIHdwCi0JCQkJCQlQQlNEcm9wQ29tbWFuZC5hZGRSZXNwb25zaWJsZVJvbGUod3BEZXNjLCBhY3Rpdml0eSwKLQkJCQkJCQkJcm9sZURlc2NMaXN0LCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwgY29uZmlnKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8JSWYgdGhlcmUgYXJlIG5vIHRhc2tzIHRvIHNob3csIGFkZCBSZXNwb25zaWJsZSByb2xlIHRvIHdwCi0JCQkJCVBCU0Ryb3BDb21tYW5kLmFkZFJlc3BvbnNpYmxlUm9sZSh3cERlc2MsIGFjdGl2aXR5LAlyb2xlRGVzY0xpc3QsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBjb25maWcpOwotCQkJCX0KLQkJCX0KLS8vCQkJZWxzZSB7Ci0vLwkJCQkvLwlpbiBjYXNlIG9mIHN5bmNocm9uaXphdGlvbiwgYWRkIFJlc3BvbnNpYmxlIHJvbGUgdG8gd3AKLS8vCQkJCWlmIChzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSkpCi0vLwkJCQkJUEJTRHJvcENvbW1hbmQuYWRkUmVzcG9uc2libGVSb2xlKHdwRGVzYywgYWN0aXZpdHksCXJvbGVEZXNjTGlzdCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIGNvbmZpZyk7Ci0vLwkJCX0JCQkJCi0JCX0KLQotCQlpZighd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmlzRW1wdHkoKSkgewotCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZCA9IG5ldyBCYXRjaENvbW1hbmQodHJ1ZSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCB3cERlc2MgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLmdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpLnB1dCh3cERlc2MsIAotCQkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCksIGVudHJ5LmdldFZhbHVlKCkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIXRhc2tEZXNjTGlzdC5pc0VtcHR5KCkKLQkJCQl8fCAhcm9sZURlc2NMaXN0LmlzRW1wdHkoKQotCQkJCXx8ICF3cERlc2NMaXN0LmlzRW1wdHkoKQotCQkJCXx8ICh1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kICE9IG51bGwgJiYgdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC5jYW5FeGVjdXRlKCkpCi0JCQkJfHwgIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKQotCQkJCXx8IChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmICFkZXNjcmlwdG9yc1RvUmVmcmVzaAotCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQl8fCBiYXRjaENvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc3ViQXJ0aWZhY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHByZXBhcmVBZGQoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJaWYgKHN5bmNocm9uaXplKSB7CQotCQkJLy8gZ2V0IGxpbmtlZCB0YXNrcyBvZiB0aGUgdGFzayBkZXNjcmlwdG9ycyBpbiB0aGUgYWN0aXZpdHkgZm9yIHRoZSBjb25maWd1cmF0aW9uCi0JCQkvLwotCQkJTGlzdCB0YXNrcyA9IGdldExpbmtlZFRhc2tzKCk7Ci0JCQkKLQkJCWlmKCF0YXNrcy5pc0VtcHR5KCkpIHsKLQkJCQkvLyBzZWxlY3Qgb25seSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGlucHV0IG9yIG91dHB1dCBvZiBhbiBleGlzdGluZyB0YXNrIGluIHRoZSBhY3Rpdml0eQotCQkJCS8vCQotCQkJCU1hcCBmZWF0dXJlc01hcCA9IFByb2Nlc3NDb21tYW5kVXRpbC5nZXRGZWF0dXJlc01hcCh0YXNrcywgd3AsIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJaWYoIWZlYXR1cmVzTWFwLmlzRW1wdHkoKSkgewotCQkJCQkvLyB1c2UgdGhlIHdwIHRvIHRoZSBrZXkgaW4gdGhlIG1hcCByaWdodCBub3cgYW5kIHJlcGxhY2UgaXQgd2l0aAotCQkJCQkvLyBpdHMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgbGF0ZXIKLQkJCQkJLy8KLQkJCQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgPT0gbnVsbCkgewotCQkJCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQl9Ci0JCQkJCXdwZFRvVGFza0ZlYXR1cmVzTWFwLnB1dCh3cCwgZmVhdHVyZXNNYXApOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRMaW5rZWRUYXNrcygpIHsKLQkJaWYobGlua2VkVGFza3MgPT0gbnVsbCkgewotCQkJbGlua2VkVGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCVRhc2sgdGFzayA9ICgoVGFza0Rlc2NyaXB0b3IpZWxlbWVudCkuZ2V0VGFzaygpOwotCQkJCQlpZih0YXNrICE9IG51bGwgJiYgY29uZmlndXJhdG9yLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQkJbGlua2VkVGFza3MuYWRkKHRhc2spOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaW5rZWRUYXNrczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIG5ldyBlbGVtZW50cyB0aGF0IGFyZSBkdXBsaWNhdGUgYi9jIHRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlIHByZXZpb3VzIFdCU0Ryb3BDb21tYW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5ld0R1cGxpY2F0ZXMoKSB7Ci0JCWlmKHN5bmNocm9uaXplKSB7Ci0JCQlpZighbmV3RHVwbGljYXRlc1JlbW92ZWQpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJT2JqZWN0IGRlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcihyb2xlRGVzYy5nZXRSb2xlKCksIGFjdGl2aXR5LCBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCQlpZihkZXNjICE9IG51bGwpIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbmV3RHVwbGljYXRlc1JlbW92ZWQgPSB0cnVlOwkJCQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkb0V4ZWN1dGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJcmVtb3ZlTmV3RHVwbGljYXRlcygpOwotCQkKLQkJLy8gYXV0b21hdGljYWxseSBhZGQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gZGVsaXZlcmFibGUgcGFydAotCQkvLwotCQlpZiAoIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCWRlbGl2ZXJhYmxlLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCh3cERlc2NMaXN0KTsKLQotCQkvLyBhZGQgdGFzayBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCh0YXNrRGVzY0xpc3QpOwotCi0JCS8vIGFkZCByb2xlIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQotCQkvLyBhc3NvY2lhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyB3aXRoIHRhc2sgZGVzY3JpcHRvcnMKLQkJLy8KLQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9UYXNrRmVhdHVyZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlNYXAgdGFza0ZlYXR1cmVzID0gKE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFza0ZlYXR1cmVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3IoZW50LmdldEtleSgpLCBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLCBnZXRNZXRob2RDb25maWd1cmF0aW9uKCksIGZhbHNlKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSAoKENvbGxlY3Rpb24pZW50LmdldFZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGRlc2NGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgRkVBVFVSRV9NQVAuZ2V0KGYpOwotCQkJCQkJaWYoZGVzY0ZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkoKExpc3QpdGFza0Rlc2MuZUdldChkZXNjRmVhdHVyZSkpLmFkZChlbnRyeS5nZXRLZXkoKSk7CQkJCQkJCQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gVE9ETzogbmVlZCB0byBiYWNrIHVwIG9sZCB2YWx1ZSBoZXJlCi0JCQkJCQkJLy8KLQkJCQkJCQl0YXNrRGVzYy5lU2V0KGRlc2NGZWF0dXJlLCBlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgbmV3IGRlc2NyaXB0b3JzIHRvIGFjdGl2aXR5J3MgcGFja2FnZQotCQkvLwotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHRhc2tEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHdwRGVzY0xpc3QpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0vLwkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI3VwZGF0ZURlc2NyaXB0b3JzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZXNjcmlwdG9ycygpIHsKLQkJc3VwZXIudXBkYXRlRGVzY3JpcHRvcnMoKTsKLQkJCi0JCS8vIGFkZCBkZWxpdmVyYWJsZSBwYXJ0cyB0byB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCWlmKHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgIT0gbnVsbCkgewotCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCN1bmRvVXBkYXRlRGVzY3JpcHRvcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVuZG9VcGRhdGVEZXNjcmlwdG9ycygpIHsKLQkJLy8gcmVtb3ZlIGRlbGl2ZXJhYmxlIHBhcnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJaWYodXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZCAhPSBudWxsKSB7Ci0JCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLnVuZG8oKTsKLQkJfQotCi0JCXN1cGVyLnVuZG9VcGRhdGVEZXNjcmlwdG9ycygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9VbmRvKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VuZG8oKSB7Ci0JCS8vIHJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwod3BEZXNjTGlzdCk7Ci0KLQkJLy8gcmVtb3ZlIHJvbGUgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwocm9sZURlc2NMaXN0KTsKLQotCQkvLyByZW1vdmUgdGFzayBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbCh0YXNrRGVzY0xpc3QpOwotCi0JCS8vIHJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmcm9tIGRlbGl2ZXJhYmxlIHBhcnQKLQkJLy8KLQkJaWYgKCF3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmVudHJ5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQlkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSBkZXNjcmlwdG9ycyBmcm9tIGFjdGl2aXR5J3MgcGFja2FnZQotCQkvLwotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHRhc2tEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHdwRGVzY0xpc3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGRpc2Fzc29jaWF0ZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIHdpdGggdGFzayBkZXNjcmlwdG9ycwotCQkvLwotCQlpZih3cGRUb1Rhc2tGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb1Rhc2tGZWF0dXJlc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCU1hcCB0YXNrRmVhdHVyZXMgPSAoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0YXNrRmVhdHVyZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudCA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKGVudC5nZXRLZXkoKSwgYWN0aXZpdHksIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gKChDb2xsZWN0aW9uKWVudC5nZXRWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGRlc2NGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgRkVBVFVSRV9NQVAuZ2V0KGYpOwotCQkJCQkJaWYoZGVzY0ZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkoKExpc3QpdGFza0Rlc2MuZUdldChkZXNjRmVhdHVyZSkpLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7CQkJCQkJCQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJdGFza0Rlc2MuZVNldChkZXNjRmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmICh3cERlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXJldHVybiB3cERlc2NMaXN0OwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0YXNrCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIHRhc2tEZXNjTGlzdAotCSAqIEBwYXJhbSByb2xlRGVzY0xpc3QKLQkgKiBAcGFyYW0gd3BEZXNjTGlzdAotCSAqIEBwYXJhbSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcnNUb1JlZnJlc2gKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbmV3IFRhc2tEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgZm9yIHRoZQotCSAqICAgICAgICAgZ2l2ZW4gdGFzaywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXN0YXRpYyBib29sZWFuIGFkZFRvRGVzY3JpcHRvckxpc3RzKFRhc2sgdGFzaywgQWN0aXZpdHkgYWN0aXZpdHksCi0JCQlMaXN0IHRhc2tEZXNjTGlzdCwgTGlzdCByb2xlRGVzY0xpc3QsIExpc3Qgd3BEZXNjTGlzdCwKLQkJCU1hcCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsIFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwKLQkJCU1hcCBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMpIHsKLQkJVGFza0Rlc2NyaXB0b3IgZGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVUYXNrRGVzY3JpcHRvcih0YXNrLCBhY3Rpdml0eSwKLQkJCQlyb2xlRGVzY0xpc3QsIHdwRGVzY0xpc3QsIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cywgbnVsbCwKLQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaCwgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwgCi0JCQkJY29uZmlnLCBzeW5jaEZlYXR1cmVzKTsKLQkJaWYgKChkZXNjICE9IG51bGwpICYmICh0YXNrRGVzY0xpc3QgIT0gbnVsbCkKLQkJCQkmJiAhdGFza0Rlc2NMaXN0LmNvbnRhaW5zKGRlc2MpKSB7Ci0JCQl0YXNrRGVzY0xpc3QuYWRkKGRlc2MpOwotCQl9Ci0JCXJldHVybiBkZXNjICE9IG51bGw7Ci0JfQotCi0Jc3RhdGljIHZvaWQgYWRkUmVzcG9uc2libGVSb2xlKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MsCi0JCQlBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCByb2xlRGVzY0xpc3QsIFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlUm9sZURlc2NyaXB0b3Iod3BEZXNjLAotCQkJCWFjdGl2aXR5LCByb2xlRGVzY0xpc3QsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBjb25maWcpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYocm9sZURlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXJvbGVEZXNjTGlzdC5jbGVhcigpOwotCQl9Ci0JCWlmKHdwRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJd3BEZXNjTGlzdC5jbGVhcigpOwotCQl9Ci0JCWlmKHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyAhPSBudWxsKSB7Ci0JCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuY2xlYXIoKTsKLQkJfQotCQlpZih3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCAhPSBudWxsKSB7Ci0JCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5jbGVhcigpOwotCQl9Ci0JCWlmKHdwZFRvVGFza0ZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCXdwZFRvVGFza0ZlYXR1cmVzTWFwLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNleGVjdXRlTmVzdGVkQ29tbWFuZHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpIHsKLQkJTGlzdCBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzID0gRXh0ZW5zaW9uTWFuYWdlci5nZXROZXN0ZWRDb21tYW5kUHJvdmlkZXJzKCk7Ci0JCWlmKCFuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJaWYoIXRhc2tEZXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlOZXN0ZWRDb21tYW5kUHJvdmlkZXIgY21kUHJvdmlkZXIgPSAoSU5lc3RlZENvbW1hbmRQcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDb21tYW5kIGNtZCA9IGNtZFByb3ZpZGVyLmNyZWF0ZVJlbGF0ZWRPYmplY3RzKHRhc2tEZXNjTGlzdCwgUEJTRHJvcENvbW1hbmQudGhpcyk7Ci0JCQkJCQlpZihjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7CQkJCQkJCQotCQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJCQkJZ2V0TmVzdGVkQ29tbWFuZHMoKS5hZGQoY21kKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIuZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzQ29tbWFuZFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0NvbW1hbmRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmYjdhZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzQ29tbWFuZFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0aW9uQXBwbGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQmF0Y2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBOb3YgMjMsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb2Nlc3NDb21tYW5kVXRpbCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmVbXSBERVNDUklQVE9SX1JFRlJFU0hBQkxFX0ZFQVRVUkVTID0gewotCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSAKLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmVbXSBUQVNLX0RFU0NSSVBUT1JfUkVGUkVTSEFCTEVfRkVBVFVSRVMgPSB7Ci0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSAKLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmVbXSBST0xFX0RFU0NSSVBUT1JfUkVGUkVTSEFCTEVfRkVBVFVSRVMgPSB7IAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpIAotCX07Ci0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlW10gV09SS19QUk9EVUNUX1JFRlJFU0hBQkxFX0ZFQVRVUkVTID0gewotLy8KLS8vCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVmcmVzaGFibGUgZmVhdHVyZSBtYXAgZm9yIHRoZSBnaXZlbiBkZXNjcmlwdG9yLiBBIGRlc2NyaXB0b3IKLQkgKiBmZWF0dXJlIGlzIGNvbnNpZGVyZWQgcmVmcmVzaGFibGUgaWYgdGhlcmUgaXMgYSBzaW1pbGlhciBmZWF0dXJlIGluIGl0cwotCSAqIGxpbmtlZCBNZXRob2RFbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIHRoZSByZWZyZXNoYWJsZSBmZWF0dXJlIG1hcCBmb3IgdGhlIGdpdmVuIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBjcmVhdGVSZWZyZXNoYWJsZUZlYXR1cmVNYXAoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTZXQgZXhjbHVkZUZlYXR1cmVzKSB7Ci0JCU1hcCBmZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJYWRkVG9GZWF0dXJlTWFwKGRlc2NyaXB0b3IsIERFU0NSSVBUT1JfUkVGUkVTSEFCTEVfRkVBVFVSRVMsIGZlYXR1cmVNYXAsIGV4Y2x1ZGVGZWF0dXJlcyk7Ci0JCWlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWFkZFRvRmVhdHVyZU1hcChkZXNjcmlwdG9yLCBUQVNLX0RFU0NSSVBUT1JfUkVGUkVTSEFCTEVfRkVBVFVSRVMsCi0JCQkJCWZlYXR1cmVNYXAsIGV4Y2x1ZGVGZWF0dXJlcyk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlhZGRUb0ZlYXR1cmVNYXAoZGVzY3JpcHRvciwgUk9MRV9ERVNDUklQVE9SX1JFRlJFU0hBQkxFX0ZFQVRVUkVTLAotCQkJCQlmZWF0dXJlTWFwLCBleGNsdWRlRmVhdHVyZXMpOwotCQl9IGVsc2UgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCk7Ci0JCQlpZiAod3BkLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSAmJiAhZXhjbHVkZUZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgd3BkLmdldERlbGl2ZXJhYmxlUGFydHMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVNYXA7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUb0ZlYXR1cmVNYXAoRU9iamVjdCBlT2JqZWN0LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlW10gZmVhdHVyZXMsIE1hcCBmZWF0dXJlTWFwLCBTZXQgZXhjbHVkZUZlYXR1cmVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZXNbaV07Ci0JCQlpZiAoIWV4Y2x1ZGVGZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSkgewotCQkJCU9iamVjdCB2YWx1ZSA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQl2YWx1ZSA9IG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIHZhbHVlKTsKLQkJCQl9Ci0JCQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUmVmZXJlbmNlKEVPYmplY3QgZSkgewotCS8vIGlmIChlLmVJc1Byb3h5KCkpIHsKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vIGlmIChlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCS8vIE1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IFByb2Nlc3NVdGlsCi0JLy8gLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBlKTsKLQkvLyBpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQuZUlzUHJveHkoKSkgewotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiB0cnVlOwotCS8vIH0KLQotCS8qKgotCSAqIENsZWFycyBhbGwgYXR0cmlidXRlcy4gRm9yIHJlZmVyZW5jZXMsIHJlbW92ZSBvbmx5IHRob3NlIHRoYXQgYXJlCi0JICogZGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gYW55IGNvbnRlbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBjbGVhclJlZnJlc2hhYmxlRmVhdHVyZXMoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTZXQgZXhjbHVkZUZlYXR1cmVzKSB7Ci0JCU1hcCBmZWF0dXJlTWFwID0gY3JlYXRlUmVmcmVzaGFibGVGZWF0dXJlTWFwKGRlc2NyaXB0b3IsIGV4Y2x1ZGVGZWF0dXJlcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQkJZGVzY3JpcHRvci5lU2V0KGZlYXR1cmUsIGZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkvLyB3b3JrIGFyb3VuZCB0byBhdm9pZCBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLQkJCQkJLy8KLQkJCQkJTGlzdCBsaXN0ID0gKChMaXN0KSBkZXNjcmlwdG9yLmVHZXQoZmVhdHVyZSkpOwotCQkJCQlzd2l0Y2ggKGxpc3Quc2l6ZSgpKSB7Ci0JCQkJCWNhc2UgMDoKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDE6Ci0JCQkJCQlsaXN0LnJlbW92ZSgwKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJbGlzdC5jbGVhcigpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGVzY3JpcHRvci5lU2V0KGZlYXR1cmUsIGZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkJCX0KLQkJCQkvLyBpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJLy8gTGlzdCBsaXN0ID0gKChMaXN0KWRlc2NyaXB0b3IuZUdldChmZWF0dXJlKSk7Ci0JCQkJLy8gTGlzdCBlbGVtZW50c1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLy8gLmhhc05leHQoKTspIHsKLQkJCQkvLyBFT2JqZWN0IGUgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCS8vIGlmKCFpc1ZhbGlkUmVmZXJlbmNlKGUpKSB7Ci0JCQkJLy8gZWxlbWVudHNUb1JlbW92ZS5hZGQoZSk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyBpZighZWxlbWVudHNUb1JlbW92ZS5pc0VtcHR5KCkpIHsKLQkJCQkvLyBsaXN0LnJlbW92ZUFsbChlbGVtZW50c1RvUmVtb3ZlKTsKLQkJCQkvLyBTeXN0ZW0ub3V0Ci0JCQkJLy8gLnByaW50bG4oIlByb2Nlc3NDb21tYW5kVXRpbC5jbGVhclJlZnJlc2hhYmxlRmVhdHVyZXMoKToKLQkJCQkvLyBjaGFuZ2VkIik7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyBlbHNlIHsKLQkJCQkvLyBFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBkZXNjcmlwdG9yLmVHZXQoZmVhdHVyZSk7Ci0JCQkJLy8gaWYob2JqICE9IG51bGwgJiYgb2JqICE9IGZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCkgJiYKLQkJCQkvLyAhaXNWYWxpZFJlZmVyZW5jZShvYmopKSB7Ci0JCQkJLy8gZGVzY3JpcHRvci5lU2V0KGZlYXR1cmUsIGZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkJCS8vIFN5c3RlbS5vdXQKLQkJCQkvLyAucHJpbnRsbigiUHJvY2Vzc0NvbW1hbmRVdGlsLmNsZWFyUmVmcmVzaGFibGVGZWF0dXJlcygpOgotCQkJCS8vIGNoYW5nZWQiKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZlYXR1cmVNYXA7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIGFsbCB0aGUgcmVmcmVzaGFibGUgZmVhdHVyZXMgb2YgdGhlIGdpdmVuIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwCi0JICogQHBhcmFtIGV4Y2x1ZGVGZWF0dXJlcyBmZWF0dXJlcyB0byBleGNsdWRlIGZyb20gcmVmcmVzaGluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGVhckRlc2NyaXB0b3IoRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotCQkJTWFwIGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAsCi0JCQlTZXQgZXhjbHVkZUZlYXR1cmVzKSB7Ci0JCWlmIChkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCS8vIG5lZWQgdG8gY2xlYXIgYWxsIHRoZSByZWZyZXNoYWJsZSBmZWF0dXJlcyBvZiB0aGUgZXhpc3RpbmcKLQkJCS8vIGRlc2NyaXB0b3IKLQkJCS8vCi0JCQlpZiAoIWRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAuY29udGFpbnNLZXkoZGVzY3JpcHRvcikpIHsKLQkJCQlkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwCi0JCQkJCQkucHV0KGRlc2NyaXB0b3IsIGNsZWFyUmVmcmVzaGFibGVGZWF0dXJlcyhkZXNjcmlwdG9yLCBleGNsdWRlRmVhdHVyZXMpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZERlc2NyaXB0b3JPZihPYmplY3QgZWxlbWVudCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIE9iamVjdCBkZXNjcmlwdG9yLCBib29sZWFuIGV4Y2x1ZGVTdXBwcmVzc2VkKSB7CQkKLQkJaWYoZGVzY3JpcHRvciBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCURlc2NyaXB0b3IgZGVzYyA9ICAoKERlc2NyaXB0b3IpZGVzY3JpcHRvcik7Ci0JCQlpZihleGNsdWRlU3VwcHJlc3NlZCAmJiBkZXNjLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCU9iamVjdCBlbGVtZW50T2JqID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoZGVzYyk7Ci0JCQllbGVtZW50T2JqID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkucmVzb2x2ZShlbGVtZW50T2JqLCBjb25maWcpOwotCQkJcmV0dXJuIGVsZW1lbnQgPT0gZWxlbWVudE9iajsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPiBpcyBhIHZhbGlkIGRlc2NyaXB0b3Igb3IgZGVzY3JpcHRvciB3cmFwcGVyIG9mIHRoZSBnaXZlbiA8Y29kZT5lbGVtZW50PC9jb2RlPgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRGVzY3JpcHRvck9yRGVzY3JpcHRvcldyYXBwZXJPZihPYmplY3QgZWxlbWVudCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlpZihzdXBwcmVzc2lvbi5pc0luU3VwcHJlc3NlZExpc3QoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3QpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIGlzVmFsaWREZXNjcmlwdG9yT2YoZWxlbWVudCwgY29uZmlnLCBUbmdVdGlsLnVud3JhcChvYmplY3QpLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzVmFsaWREZXNjcmlwdG9yT2YoZWxlbWVudCwgY29uZmlnLCBvYmplY3QsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVuc3VwcHJlc3NlZCBkZXNjcmlwdG9yIGZyb20gYSBkZXNjcmlwdG9yIGxpc3QuIFRoZSBkZXNjcmlwdG9yIGxpc3QgaXMgdXN1YWxseQotCSAqIHRoZSBicmVha2Rvd24gZWxlbWVudHMgb2YgYW4gYWN0aXZpdHkuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBkZXNjcmlwdG9yTGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXREZXNjcmlwdG9yKE9iamVjdCBvYmosIExpc3QgZGVzY3JpcHRvckxpc3QsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXJldHVybiBnZXREZXNjcmlwdG9yKG9iaiwgZGVzY3JpcHRvckxpc3QsIGNvbmZpZywgdHJ1ZSk7Ci0JfQotCQotCXN0YXRpYyBPYmplY3QgZ2V0RGVzY3JpcHRvcihPYmplY3Qgb2JqLCBMaXN0IGRlc2NyaXB0b3JMaXN0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBleGNsdWRlU3VwcHJlc3NlZCkgewotCQlpbnQgc2l6ZSA9IGRlc2NyaXB0b3JMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLQkJCS8vIGl0ZXJhdGUgdGhydSBsaXN0IHRvIHNlZSB3aGV0aGVyIGEgdmFsaWQgZGVzY3JpcHRvciBsaW5rZWQgd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0Ci0JCQkvLyBhbHJlYWR5IGV4aXN0cwotCQkJLy8KLQkJCU9iamVjdCBvYmplY3QgPSBkZXNjcmlwdG9yTGlzdC5nZXQoaik7Ci0JCQlpZihpc1ZhbGlkRGVzY3JpcHRvck9mKG9iaiwgY29uZmlnLCBvYmplY3QsIGV4Y2x1ZGVTdXBwcmVzc2VkKSkgewotCQkJCXJldHVybiBvYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHZhbGlkIGRlc2NyaXB0b3IsIGVpdGhlciBsb2NhbCBvciBpbmhlcml0ZWQsIG9mIHRoZSBnaXZlbiBvYmplY3QgdW5kZXIgdGhlIGdpdmVuIGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlc2NyaXB0b3IgZ2V0VmFsaWREZXNjcmlwdG9yKE9iamVjdCBvYmosIEFjdGl2aXR5IGFjdGl2aXR5LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChhY3Rpdml0eSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihhY3Rpdml0eSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGlzVmFsaWREZXNjcmlwdG9yT3JEZXNjcmlwdG9yV3JhcHBlck9mKG9iaiwgY29uZmlnLCBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKSwgY2hpbGQpKSB7Ci0JCQkJcmV0dXJuIChEZXNjcmlwdG9yKSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCi0JLyoqCi0JICogR2V0cyB0aGUgbG9jYWwgdW5zdXBwcmVzc2VkIGRlc2NyaXB0b3Igb2YgdGhlIGdpdmVuIHJvbGUsIHRhc2ssIG9yIHdvcmtQcm9kdWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBvYmplY3QsIG9yIG51bGwgaWYgbm90IGV4aXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldERlc2NyaXB0b3IoT2JqZWN0IG9iaiwgQWN0aXZpdHkgYWN0aXZpdHksIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXJldHVybiBnZXREZXNjcmlwdG9yKG9iaiwgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSwgY29uZmlnKTsKLQl9Ci0KLS8vCS8qKgotLy8JICogUmV0dXJuIHRydWUgaWYgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGdpdmVuIG9iamVjdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUKLS8vCSAqIGJyZWFrZG93biBlbGVtZW50IGxpc3Qgb2YgdGhlIGdpdmVuIGFjdGl2aXR5Ci0vLwkgKiAKLS8vCSAqIEBwYXJhbSBvYmoKLS8vCSAqIEBwYXJhbSBhY3Rpdml0eQotLy8JICogQHJldHVybgotLy8JICovCi0vLwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVzY3JpcHRvckV4aXN0cyhPYmplY3Qgb2JqLCBBY3Rpdml0eSBhY3Rpdml0eSkgewotLy8JCXJldHVybiAoZ2V0RGVzY3JpcHRvcihvYmosIGFjdGl2aXR5KSAhPSBudWxsKTsKLS8vCX0KLQotCS8qKgotCSAqIENyZWF0ZSBSb2xlIGRlc2NyaXB0b3IgZm9yIHRoZSByZXNwb25zaWJsZSByb2xlIG9mIHRoZSBnaXZlbiB3b3JrIHByb2R1Y3QKLQkgKiBkZXNjcmlwdG9yCi0JICogCi0JICogQHBhcmFtIHdwRGVzYwotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSByb2xlRGVzY3JpcHRvcnMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBSb2xlRGVzY3JpcHRvciBjcmVhdGVSb2xlRGVzY3JpcHRvcigKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MsIEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJTGlzdCByb2xlRGVzY3JpcHRvcnMsIFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKHdwRGVzYyAhPSBudWxsKSB7Ci0JCQlXb3JrUHJvZHVjdCB3cCA9IHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCQkJaWYgKHdwICE9IG51bGwpIHsKLQkJCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHdwKSkgewotCQkJCQl3cCA9IChXb3JrUHJvZHVjdCkgVG5nVXRpbC5nZXRCYXNlKHdwKTsKLQkJCQl9Ci0JCQkJLy8gZ2V0IHJlc3BvbnNpYmxlIHJvbGUgZm9yIHdvcmsgcHJvZHVjdAotCQkJCVJvbGUgcm9sZSA9IG51bGw7IC8vQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlKHdwKTsKLQkJCQlMaXN0IHJvbGVzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlcyh3cCk7Ci0JCQkJLy9GSVhNRTogd2hhdCBpZiB0aGUgd29yayBwcm9kdWN0IGhhdmUgbWFueSByZXNwb25zaWJsZSByb2xlcyA/Pz8KLQkJCQlpZighcm9sZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCXJvbGUgPSAoUm9sZSkgcm9sZXMuZ2V0KDApOwotCQkJCX0KLQkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3Iocm9sZSkpIHsKLQkJCQkJCXJvbGUgPSAoUm9sZSkgVG5nVXRpbC5nZXRCYXNlKHJvbGUpOwotCQkJCQl9Ci0JCQkJCWJvb2xlYW4gaXNOZXdEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCQkJCS8vIGNoZWNrIGZvciByb2xlZGVzY3JpcHRvciB3aGV0aGVyIGl0J3MgcHJlc2VudCBpbiBhY3Rpdml0eQotCQkJCQkvLyBicmVha2Rvd24gZWxlbWVudHMKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3IoCi0JCQkJCQkJcm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkvLyBjaGVjayBmb3Igcm9sZWRlc2NyaXB0b3Igd2hldGhlciBpdCdzIHByZXNlbnQgaW4gYmFzZQotCQkJCQkJLy8gYWN0aXZpdHkuCi0JCQkJCQlyb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsLmdldEluaGVyaXRlZERlc2NyaXB0b3IoCi0JCQkJCQkJCXJvbGUsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCQkvLyBjaGVjayBmb3Igcm9sZWRlc2NyaXB0b3Igd2hldGhlciBpdCdzIHByZXNlbnQgaW4KLQkJCQkJCQkvLyBsaXN0IG9mIHJvbGVkZXNjcmlwdG9ycyBwYXNzZWQgaW4KLQkJCQkJCQlyb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcihyb2xlLAotCQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLCBjb25maWcpOwotCQkJCQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCXJvbGVEZXNjID0gUHJvY2Vzc1V0aWwuY3JlYXRlUm9sZURlc2NyaXB0b3Iocm9sZSk7Ci0JCQkJCQkJCXJvbGVEZXNjcmlwdG9ycy5hZGQocm9sZURlc2MpOwotCQkJCQkJCQlpc05ld0Rlc2NyaXB0b3IgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWlzTmV3RGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsIAotCQkJCQkJCSYmIHJvbGVEZXNjLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQocm9sZURlc2MpOwotCQkJCQl9Ci0JCi0JCQkJCS8vIHRoaXMgaXMgdGFrZW4gY2FyZWQgb2YgYnkKLQkJCQkJLy8gQlNEcm9wQ29tbWFuZCNzZXRSZXNwb25zaWJsZVJvbGUoKQotCQkJCQkvLwotCQkJCQkvLyB3cERlc2Muc2V0UmVzcG9uc2libGVSb2xlKHJvbGVEZXNjKTsKLQkKLQkJCQkJaWYoaXNOZXdEZXNjcmlwdG9yKSB7Ci0JCQkJCQlyZXR1cm4gcm9sZURlc2M7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29sbGVjdHMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIGZvciB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT50YXNrRGVzY3JpcHRvckZlYXR1cmU8L2NvZGU+IGJhc2VkIG9uIHRoZSBjb3JyZXNwb25kaW5nIGZlYXR1cmUKLQkgKiBpbiB0aGUgbGlua2VkIHRhc2sgb2YgdGhlIGdpdmVuIDxjb2RlPnRhc2tEZXNjcmlwdG9yPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSB0YXNrIHRoZSB0YXNrIHRoYXQgdGhlIHRhc2sgZGVzY3JpcHRvciBpcyBsaW5rZWQgdG8KLQkgKiBAcGFyYW0gdGFza0Rlc2NyaXB0b3IgdGhlIHRhc2sgZGVzY3JpcHRvciB3aG9zZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgaW4gdGhlIGdpdmVuIDxjb2RlPnRhc2tEZXNjcmlwdG9yRmVhdHVyZTwvY29kZT4KLQkgKiAgICAgICAgd2lsbCBiZSBjb2xsZWN0ZWQKLQkgKiBAcGFyYW0gdGFza0ZlYXR1cmUgdGhlIHRhc2sgZmVhdHVyZSB0aGF0IGlzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhc2sgZGVzY3JpcHRvciBmZWF0dXJlCi0JICogQHBhcmFtIHRhc2tEZXNjcmlwdG9yRmVhdHVyZSB0aGUgZmVhdHVyZSBvZiB0YXNrIGRlc2NyaXB0b3IgdGhhdCBob2xkcyByZWZlcmVuY2VzIHRvIAotCSAqICAgICAgICB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gY29sbGVjdAotCSAqIEBwYXJhbSBhY3Rpdml0eSB0aGUgYWN0aXZpdHkgb2YgZGVzY3JpcHRvcnMKLQkgKiBAcGFyYW0gY29uZmlnIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHdwRGVzY3JpcHRvcnMKLQkgKiBAcGFyYW0gd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwCi0JICogQHBhcmFtIHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwCi0JICogQHBhcmFtIGRlc2NyaXB0b3JzVG9SZWZyZXNoCi0JICogICAgICAgICAgICBvdXB1dCB0aGF0IGtlZXBzIHRoZSBkZXNjcmlwdG9yIGZlYXR1cmVzIHRoYXQgbmVlZCB0byBiZQotCSAqICAgICAgICAgICAgcmVmcmVzaGVkCi0JICogQHBhcmFtIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAKLQkgKiAgICAgICAgICAgIG91dHB1dCB0aGF0IGtlZXBzIHRoZSBjb2xsZWN0ZWQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb2xsZWN0V29ya1Byb2R1Y3REZXNjcnRpcHRvcnMoCi0JCQlUYXNrIHRhc2ssCi0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciwgRVJlZmVyZW5jZSB0YXNrRmVhdHVyZSwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSB0YXNrRGVzY3JpcHRvckZlYXR1cmUsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQWN0aXZpdHkgYWN0aXZpdHksIExpc3Qgd3BEZXNjcmlwdG9ycywKLQkJCU1hcCB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAsIE1hcCB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCwKLQkJCVNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwgTWFwIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXApIHsKLQkJTGlzdCB3b3JrUHJvZHVjdHMgPSAoTGlzdCkgUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkKLQkJCQkuZ2V0UmVmZXJlbmNlKHRhc2ssIHRhc2tGZWF0dXJlLCBjb25maWcpOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JzKHdvcmtQcm9kdWN0cywgbGlzdCwgYWN0aXZpdHksCi0JCQkJd3BEZXNjcmlwdG9ycywgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLAotCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwgY29uZmlnKTsKLQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJQmF0Y2hDb21tYW5kLmFkZEZlYXR1cmVWYWx1ZXMoZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwgdGFza0Rlc2NyaXB0b3IsCi0JCQkJCXRhc2tEZXNjcmlwdG9yRmVhdHVyZSwgbGlzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBmcm9tIHRoZSBnaXZlbiB3b3JrIHByb2R1Y3RzIGZvciB0aGUKLQkgKiBnaXZlbiBhY3Rpdml0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIHRoZW0gYWxyZWFkeQotCSAqIAotCSAqIEBwYXJhbSB3b3JrUHJvZHVjdHMKLQkgKiAgICAgICAgICAgIFdvcmtQcm9kdWN0IGxpc3QKLQkgKiBAcGFyYW0gZmVhdHVyZVZhbHVlCi0JICogICAgICAgICAgICB0YXJnZXQgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGxpc3QgZm9yIHRoZSBnaXZlbiBXb3JrUHJvZHVjdAotCSAqICAgICAgICAgICAgbGlzdAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSB3cERlc2NyaXB0b3JzCi0JICogICAgICAgICAgICBuZXdseSBjcmVhdGVkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIChvdXRwdXQpCi0JICovCi0Jc3RhdGljIHZvaWQgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9ycyhMaXN0IHdvcmtQcm9kdWN0cywKLQkJCUxpc3QgZmVhdHVyZVZhbHVlLCBBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCB3cERlc2NyaXB0b3JzLAotCQkJTWFwIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCwgTWFwIHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLAotCQkJU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAod29ya1Byb2R1Y3RzICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gd2FzRW1wdHkgPSBmZWF0dXJlVmFsdWUuaXNFbXB0eSgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCB3b3JrUHJvZHVjdHMuc2l6ZSgpOyBqKyspIHsKLQkJCQlXb3JrUHJvZHVjdCB3cE9iaiA9IChXb3JrUHJvZHVjdCkgd29ya1Byb2R1Y3RzLmdldChqKTsKLQkJCQlpZiAod3BPYmogIT0gbnVsbCkgewotCQkJCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHdwT2JqKSkgewotCQkJCQkJd3BPYmogPSAoV29ya1Byb2R1Y3QpIFRuZ1V0aWwuZ2V0QmFzZSh3cE9iaik7Ci0JCQkJCX0KLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGdldERlc2NyaXB0b3Iod3BPYmosIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQlpZiAod3BEZXNjID09IG51bGwpIHsKLQkKLQkJCQkJCS8vIGdldCBpbmhlcml0ZWQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCQkJCQl3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJCQkJLmdldEluaGVyaXRlZERlc2NyaXB0b3Iod3BPYmosIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQkJaWYgKHdwRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcih3cE9iaiwgd3BEZXNjcmlwdG9ycywgY29uZmlnKTsKLQkJCQkJCQlpZiAod3BEZXNjID09IG51bGwpIHsKLQkJCQkJCQkJd3BEZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cE9iaiwKLQkJCQkJCQkJCQljb25maWcsIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCk7Ci0JCQkJCQkJCXdwRGVzY3JpcHRvcnMuYWRkKHdwRGVzYyk7Ci0JCi0JCQkJCQkJCS8vIGF1dG9tYXRpYyBhZGRpbmcgdG8gdGhlIGV4aXN0aW5nIGRlbGl2ZXJhYmxlCi0JCQkJCQkJCS8vIGRlc2NyaXB0b3IgaW4gdGhlIGFjdGl2aXR5J3Mgc2NvcGUgaWYgdGhlcmUKLQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJLy8gYW55Ci0JCQkJCQkJCS8vIHZhbGlkIG9uZS4KLQkJCQkJCQkJLy8KLQkJCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGUoYWN0aXZpdHksIHdwT2JqKTsKLQkJCQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAucHV0KHdwRGVzYywKLQkJCQkJCQkJCQkJZGVzY3JpcHRvcik7Ci0JCQkJCQkJCX0KLQkKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCkgewotCQkJCQkJCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2guYWRkKHdwRGVzYyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKHdwT2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUKLQkJCQkJCQkJCQkmJiB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAgIT0gbnVsbCkgewotCQkJCQkJCQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZURlbGl2ZXJhYmxlUGFydHMod3BEZXNjLAotCQkJCQkJCQkJCQkoRGVsaXZlcmFibGUpIHdwT2JqLCBjb25maWcsCi0JCQkJCQkJCQkJCXdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh3YXNFbXB0eSB8fCAhZmVhdHVyZVZhbHVlLmNvbnRhaW5zKHdwRGVzYykpIHsKLQkJCQkJCWZlYXR1cmVWYWx1ZS5hZGQod3BEZXNjKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0YXNrIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiB0YXNrIHdpdGhpbiB0aGUgYWN0aXZpdHkgaWYgaXQKLQkgKiBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LCBhbmQgdXBkYXRlIHRoZSByb2xlRGVzY3JpcHRvcnMgYW5kIHdwRGVzY3JpcHRvcnMgbGlzdHMKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBUYXNrIGRlc2NyaXB0b3IuIENhbGxlciBzaG91bGQgYWRkIHRoZSBuZXcgdGFzawotCSAqIGRlc2NyaXB0b3IgYW5kIHRoZSBvdGhlckRlc2NyaXB0b3JzIGludG8gdGhlIGFjdGl2aXR5J3MgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSB0YXNrCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIHJvbGVEZXNjcmlwdG9ycwotCSAqICAgICAgICAgICAgTGlzdCB0byBob2xkIHRoZSBjcmVhdGVkIHJvbGUgZGVzY3JpcHRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLQkgKiAgICAgICAgICAgIG5ldyB0YXNrIGRlc2NyaXB0b3IsIG5vIHJvbGUgZGVzY3JpcHRvciB3aWxsIGJlIGNyZWF0ZWQgaWYKLQkgKiAgICAgICAgICAgIHJvbGVEZXNjcmlwdG9ycyBpcyBudWxsCi0JICogCi0JICogQHBhcmFtIHdwRGVzY3JpcHRvcnMKLQkgKiAgICAgICAgICAgIExpc3QgdG8gaG9sZCB0aGUgY3JlYXRlZCB3b3JrcHJvZHVjdCBkZXNjcmlwdG9ycyBhc3NvY2lhdGVkCi0JICogICAgICAgICAgICB3aXRoIHRoaXMgbmV3IHRhc2sgZGVzY3JpcHRvciwgbm8gd29ya3Byb2R1Y3QgZGVzY3JpcHRvciB3aWxsCi0JICogICAgICAgICAgICBiZSBjcmVhdGVkIGlmIHdwRGVzY3JpcHRvcnMgaXMgbnVsbAotCSAqIAotCSAqIEBwYXJhbSB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCAKLQkgKiAgICAgICAgICAgIE1hcCB0byBob2xkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGFuZCBkZWxpdmVyYWJsZSBkZXNjcmlwdG9yIHRvIGFzc2lnbgotCSAqICAgICAgICAgICAgdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRvCi0JICogICAgICAgICAgICAgCi0JICogQHJldHVybiBUYXNrRGVzY3JpcHRvciBvciBudWxsIGlmIHRoZSB0YXNrIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiB0YXNrCi0JICogICAgICAgICBhbHJlYWR5IGV4aXN0cywgYW5kIHVwZGF0ZWQgdGhlIHJvbGVEZXNjcmlwdG9ycyBhbmQgd3BEZXNjcmlwdG9ycwotCSAqICAgICAgICAgbGlzdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRhc2tEZXNjcmlwdG9yIGNyZWF0ZVRhc2tEZXNjcmlwdG9yKFRhc2sgdGFzaywKLQkJCUFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IHJvbGVEZXNjcmlwdG9ycywgTGlzdCB3cERlc2NyaXB0b3JzLAotCQkJTWFwIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCwgTWFwIHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLAotCQkJU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBNYXAgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTZXQgc3luY2hGZWF0dXJlcykgewotCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHRhc2spKSB7Ci0JCQl0YXNrID0gKFRhc2spIFRuZ1V0aWwuZ2V0QmFzZSh0YXNrKTsKLQkJfQotCQotCQkvLyBjcmVhdGUgdGFzayBkZXNjcmlwdG9yIG9iamVjdAotCQkvLwotCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcigKLQkJCQl0YXNrLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJYm9vbGVhbiBpc05ld1Rhc2tEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCi0JCS8vIGlmICggdGFza0Rlc2MgIT0gbnVsbCApCi0JCS8vIHsKLQkJLy8gcmV0dXJuIHRhc2tEZXNjOwotCQkvLyB9Ci0JCS8vIHRhc2tEZXNjID0gY3JlYXRlVGFza0Rlc2NyaXB0b3IodGFzayk7Ci0JCi0JCWlmICh0YXNrRGVzYyA9PSBudWxsKSB7Ci0JCQl0YXNrRGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVUYXNrRGVzY3JpcHRvcih0YXNrKTsKLQkJCWlzTmV3VGFza0Rlc2NyaXB0b3IgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJaWYgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgdGFza0Rlc2MuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQodGFza0Rlc2MpOwotCQkJfQotCQl9Ci0JCi0JCUlDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWdBcHBsaWNhdG9yID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCk7Ci0JCi0JCWlmIChpc05ld1Rhc2tEZXNjcmlwdG9yKSB7Ci0JCQkvLyBhZGQgYWxsIHRhc2sgc3RlcHMgdG8gVGFza0Rlc2NyaXB0b3Igc3RlcCBzZWxlY3Rpb24KLQkJCS8vCi0JCQlMaXN0IHN0ZXBzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKHRhc2sKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCB0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCksIGNvbmZpZyk7Ci0JCQl0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuYWRkQWxsKHN0ZXBzKTsKLQkJCQotCQl9Ci0JCi0JCS8vIG1vdmVkIHRoaXMgY29kZSB0byBCU0Ryb3BDb21tYW5kI2V4ZWN1dGUoKSB0byBzdXBwb3J0IHVuZG8gYW5kCi0JCS8vIHByb2dyZXNzIG1vbml0b3IKLQkJLy8KLQkJLy8gZWxzZSB7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHN0ZXBzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBPYmplY3Qgc3RlcCA9IGl0ZXIubmV4dCgpOwotCQkvLyBpZiAoIXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5jb250YWlucyhzdGVwKSkgewotCQkvLyB0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuYWRkKHN0ZXApOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQotCQlpZiAocm9sZURlc2NyaXB0b3JzICE9IG51bGwpIHsKLQkJCS8vIGdldC9jcmVhdGUgcm9sZSBkZXNjcmlwdG9yIGZvciBwcmltYXJ5IHBlcmZvcm1lcgotCQkJLy8KLQkJCUVSZWZlcmVuY2UgcmVmID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpOwotCQkJUm9sZSByb2xlID0gc3luY2hGZWF0dXJlcy5jb250YWlucyhyZWYpID8gKFJvbGUpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKHRhc2ssCi0JCQkJCXJlZiwgY29uZmlnKSA6IG51bGw7Ci0JCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJLy8gaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcihyb2xlKSkgewotCQkJCS8vIHJvbGUgPSAoUm9sZSkgVG5nVXRpbC5nZXRCYXNlKHJvbGUpOwotCQkJCS8vIH0KLQkKLQkJCQkvLyBjaGVjayBmb3IgbG9jYWwgZGVzY3JpcHRvcgotCQkJCVJvbGVEZXNjcmlwdG9yIHByaW1hcnlSb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcigKLQkJCQkJCXJvbGUsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCWJvb2xlYW4gaXNOZXdSb2xlRGVzY3JpcHRvciA9IGZhbHNlOwotCQkJCWlmIChwcmltYXJ5Um9sZURlc2MgPT0gbnVsbCkgewotCQkJCQkvLyBjaGVjayBmb3IgaW5oZXJpdGVkIGRlc2NyaXB0b3IKLQkJCQkJcHJpbWFyeVJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcigKLQkJCQkJCQlyb2xlLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJaWYgKHByaW1hcnlSb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkvLyBjaGVjayBmb3IgZGVzY3JpcHRvciBpbiBwYXNzZWQgaW4gZGVzY3JpcHRvciBsaXN0Ci0JCQkJCQlwcmltYXJ5Um9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3Iocm9sZSwKLQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLCBjb25maWcpOwotCQkJCQkJaWYgKHByaW1hcnlSb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJcHJpbWFyeVJvbGVEZXNjID0gUHJvY2Vzc1V0aWwuY3JlYXRlUm9sZURlc2NyaXB0b3Iocm9sZSk7Ci0JCQkJCQkJaXNOZXdSb2xlRGVzY3JpcHRvciA9IHRydWU7Ci0JCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChwcmltYXJ5Um9sZURlc2MpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmICFpc05ld1JvbGVEZXNjcmlwdG9yCi0JCQkJCQkmJiBwcmltYXJ5Um9sZURlc2MuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2guYWRkKHByaW1hcnlSb2xlRGVzYyk7Ci0JCQkJfQotCQkJCWlmIChpc05ld1Rhc2tEZXNjcmlwdG9yICYmIGlzTmV3Um9sZURlc2NyaXB0b3IpIHsKLQkJCQkJdGFza0Rlc2Muc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkocHJpbWFyeVJvbGVEZXNjKTsKLQkJCQl9IGVsc2UgewotCQkJCQlCYXRjaENvbW1hbmQuYWRkRmVhdHVyZVZhbHVlKGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAsIHRhc2tEZXNjLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwKLQkJCQkJCQlwcmltYXJ5Um9sZURlc2MpOwotCQkJCX0KLQkJCX0KLQkKLQkJCS8vIGdldC9jcmVhdGUgcm9sZSBkZXNjcmlwdG9ycyBmb3IgYWRkaXRpb25hbCBwZXJmb3JtaW5nIHJvbGVzCi0JCQkvLwotCQkJcmVmID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwkJCQotCQkJTGlzdCBhZGRpdGlvbmFsUGVyZm9ybWVycyA9IHN5bmNoRmVhdHVyZXMuY29udGFpbnMocmVmKSA/IChMaXN0KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZSgKLQkJCQkJdGFzaywgcmVmLCBjb25maWcpIDogbnVsbDsKLQkJCWlmIChhZGRpdGlvbmFsUGVyZm9ybWVycyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhZGRpdGlvbmFsUGVyZm9ybWVycy5zaXplKCk7IGorKykgewotCQkJCQlSb2xlIHJvbGVPYmogPSAoUm9sZSkgYWRkaXRpb25hbFBlcmZvcm1lcnMuZ2V0KGopOwotCQkJCQkvLyBjaGVjayBmb3IgbG9jYWwgZGVzY3JpcHRvcgotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcigKLQkJCQkJCQlyb2xlT2JqLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJYm9vbGVhbiBpc05ld1JvbGVEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkvLyBjaGVjayBmb3IgaW5oZXJpdGVkIGRlc2NyaXB0b3IKLQkJCQkJCXJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcigKLQkJCQkJCQkJcm9sZU9iaiwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCQkJCXJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKHJvbGVPYmosCi0JCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMsIGNvbmZpZyk7Ci0JCQkJCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCQkJcm9sZURlc2MgPSBQcm9jZXNzVXRpbC5jcmVhdGVSb2xlRGVzY3JpcHRvcihyb2xlT2JqKTsKLQkJCQkJCQkJaXNOZXdSb2xlRGVzY3JpcHRvciA9IHRydWU7Ci0JCQkJCQkJCXJvbGVEZXNjcmlwdG9ycy5hZGQocm9sZURlc2MpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCAmJiAhaXNOZXdSb2xlRGVzY3JpcHRvcgotCQkJCQkJCSYmIHJvbGVEZXNjLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQocm9sZURlc2MpOwotCQkJCQl9Ci0JCQkJCWlmIChpc05ld1Rhc2tEZXNjcmlwdG9yICYmIGlzTmV3Um9sZURlc2NyaXB0b3IpIHsKLQkJCQkJCXRhc2tEZXNjLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuYWRkKHJvbGVEZXNjKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUJhdGNoQ29tbWFuZC5hZGRGZWF0dXJlVmFsdWUoCi0JCQkJCQkJCWRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAsCi0JCQkJCQkJCXRhc2tEZXNjLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCQkJCQlyb2xlRGVzYyk7Ci0JCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkJaWYgKHdwRGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJaWYgKCFpc05ld1Rhc2tEZXNjcmlwdG9yICYmICFzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpKSkgewotCQkJCXdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCA9IG51bGw7Ci0JCQl9Ci0JCQkKLQkJCS8vIGNyZWF0ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmb3IgaW5wdXQgd29ya3Byb2R1Y3RzCi0JCQkvLwotCQkJaWYgKGlzTmV3VGFza0Rlc2NyaXB0b3IgfHwgc3luY2hGZWF0dXJlcy5jb250YWlucyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCkpKSB7Ci0JCQkJY29sbGVjdFdvcmtQcm9kdWN0RGVzY3J0aXB0b3JzKHRhc2ssIHRhc2tEZXNjLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLCBjb25maWcsIGFjdGl2aXR5LAotCQkJCQkJd3BEZXNjcmlwdG9ycywgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLAotCQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLAotCQkJCQkJZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCk7Ci0JCQl9Ci0JCQlpZiAoaXNOZXdUYXNrRGVzY3JpcHRvciB8fCBzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpKSkgewotCQkJCWNvbGxlY3RXb3JrUHJvZHVjdERlc2NydGlwdG9ycyh0YXNrLCB0YXNrRGVzYywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCksIGNvbmZpZywgYWN0aXZpdHksCi0JCQkJCQl3cERlc2NyaXB0b3JzLCB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAsCi0JCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gsCi0JCQkJCQlkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwKTsKLQkJCX0KLQkKLQkJCS8vIGNyZWF0ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmb3Igb3V0cHV0IHdvcmtwcm9kdWN0cwotCQkJLy8KLQkJCWlmIChpc05ld1Rhc2tEZXNjcmlwdG9yIHx8IHN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSkpIHsKLQkJCQljb2xsZWN0V29ya1Byb2R1Y3REZXNjcnRpcHRvcnModGFzaywgdGFza0Rlc2MsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0VGFza19PdXRwdXQoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgY29uZmlnLCBhY3Rpdml0eSwKLQkJCQkJCXdwRGVzY3JpcHRvcnMsIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCwKLQkJCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwKLQkJCQkJCWRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXApOwotCQkJfQotCQl9Ci0JCi0JCWlmIChpc05ld1Rhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gdGFza0Rlc2M7Ci0JCX0KLQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVGFza0Rlc2NyaXB0b3IgY3JlYXRlVGFza0Rlc2NyaXB0b3IoVGFzayB0YXNrKSB7Ci0JCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0b3IoKTsKLQkJdGFza0Rlc2Muc2V0VGFzayh0YXNrKTsKLQkJdGFza0Rlc2Muc2V0TmFtZSh0YXNrLmdldE5hbWUoKSk7Ci0JCXRhc2tEZXNjLnNldFByZXNlbnRhdGlvbk5hbWUoU3RyVXRpbAotCQkJCS5pc0JsYW5rKHRhc2suZ2V0UHJlc2VudGF0aW9uTmFtZSgpKSA/IHRhc2suZ2V0TmFtZSgpIDogdGFzawotCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkvLyB0YXNrRGVzYy5zZXRCcmllZkRlc2NyaXB0aW9uKHRhc2suZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJcmV0dXJuIHRhc2tEZXNjOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZGVsaXZlcmFibGUgcGFydHMgZm9yIHRoZSBnaXZlbiB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmcm9tIHRoZQotCSAqIGRlbGl2ZXJhYmxlIHdvcmsgcHJvZHVjdHMgb2YgdGhlIGdpdmVuIGRlbGl2ZXJhYmxlIGFkZCBwdXQgdGhlbSBpbgotCSAqIDxjb2RlPndwRGVzY1RvRGVsaXZlcmFibGVQYXJ0czwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogQHBhcmFtIGRlbGl2ZXJhYmxlCi0JICogQHBhcmFtIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cwotCSAqICAgICAgICAgICAgKG91dHB1dCkgbWFwIG9mIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRvIGl0cyBuZXdseSBjcmVhdGVkCi0JICogICAgICAgICAgICBkZWxpdmVyYWJsZSBwYXJ0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVEZWxpdmVyYWJsZVBhcnRzKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQsCi0JCQlEZWxpdmVyYWJsZSBkZWxpdmVyYWJsZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlNYXAgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gpIHsKLQkJSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ0FwcGxpY2F0b3IgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKTsKLQkKLQkJTGlzdCBkZWxpdmVyZWRXUHMgPSAoTGlzdCkgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2UoZGVsaXZlcmFibGUsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCksCi0JCQkJY29uZmlnKTsKLQkJTGlzdCBwYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHdwZC5nZXREZWxpdmVyYWJsZVBhcnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWxpdmVyZWRXUHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJcGFydHMuYWRkKFByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoCi0JCQkJCQkoV29ya1Byb2R1Y3QpIGl0ZXIubmV4dCgpLCBjb25maWcsCi0JCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlbGl2ZXJlZFdQcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKHdvcmtQcm9kdWN0LCB3cGQuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLCBjb25maWcpOwotCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJZGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoCi0JCQkJCQkJd29ya1Byb2R1Y3QsIGNvbmZpZywgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZihkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsKSB7Ci0JCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQoZGVzYyk7Ci0JCQkJCX0KLQkJCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJCWNyZWF0ZURlbGl2ZXJhYmxlUGFydHMoZGVzYywgKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCwKLQkJCQkJCQkJY29uZmlnLCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsIGRlc2NyaXB0b3JzVG9SZWZyZXNoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlwYXJ0cy5hZGQoZGVzYyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFwYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5wdXQod3BkLCBwYXJ0cyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gd29yayBwcm9kdWN0Ci0JICogCi0JICogQHBhcmFtIHdwCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMKLQkgKiAgICAgICAgICAgIChvdXRwdXQpIG1hcCBvZiB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byBpdHMgbmV3bHkgY3JlYXRlZAotCSAqICAgICAgICAgICAgZGVsaXZlcmFibGUgcGFydHMKLQkgKiBAcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gd29yayBwcm9kdWN0IGFscmVhZHkgZXhpc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3IgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKAotCQkJV29ya1Byb2R1Y3Qgd3AsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJTWFwIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cykgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gUHJvY2Vzc1V0aWwuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwKTsKLQkJaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUgJiYgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzICE9IG51bGwpIHsKLQkJCWNyZWF0ZURlbGl2ZXJhYmxlUGFydHMod3BkLCAoRGVsaXZlcmFibGUpIHdwLCBjb25maWcsCi0JCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cywgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIHdwZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgaW5oZXJ0aWVkIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiByb2xlLCB0YXNrIG9yIHdvcmtQcm9kdWN0LiBVbmxpa2UgbG9jYWwgZGVzY3JpcHRvciwgYW4gaW5oZXJpdGVkIAotCSAqIGRlc2NyaXB0b3IgdGhhdCBpcyBleHRlcm5hbGx5IHN1cHByZXNzZWQgaXMgY29uc2lkZXJlZCB2YWxpZC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybiBkZXNjcmlwdG9yIG9mIHRoZSBvYmplY3QsIG51bGwgaWYgbm90IGV4aXN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEluaGVyaXRlZERlc2NyaXB0b3IoT2JqZWN0IG9iaiwgQWN0aXZpdHkgYWN0aXZpdHksIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWZvciAoVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJdmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwgfHwgdmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTDsKLQkJCXZhcmlhYmlsaXR5VHlwZSA9IGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBiYXNlQWN0aXZpdHkgPSAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0JCQkJT2JqZWN0IGRlc2MgPSBnZXREZXNjcmlwdG9yKG9iaiwgYmFzZUFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCksIGNvbmZpZywgZmFsc2UpOwotCQkJCWlmKGRlc2MgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZGVzYzsKLQkJCQl9Ci0JCQkJYWN0aXZpdHkgPSBiYXNlQWN0aXZpdHk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtYXAgb2YgdGFzayB0byBmZWF0dXJlcyB0aGF0IGNvbnRhaW4gdGhlIHdvcmsgcHJvZHVjdCAKLQkgKiAoaW5wdXQgb3Igb3V0cHV0IG9mIHRoZSB0YXNrKQotCSAqIAotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSB3cAotCSAqIEByZXR1cm4gTWFwIG9mIHRhc2sgdG8gZmVhdHVyZXMgdGhhdCBjb250YWluIHRoZSB3b3JrIHByb2R1Y3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRGZWF0dXJlc01hcChMaXN0IHRhc2tzLCBXb3JrUHJvZHVjdCB3cCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTWFwIGZlYXR1cmVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJRVJlZmVyZW5jZVtdIHRhc2tGZWF0dXJlcyA9IHsKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKQotCQl9OwotCQlmb3IgKGludCBpID0gdGFza3Muc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCVRhc2sgdGFzayA9IChUYXNrKSB0YXNrcy5nZXQoaSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHRhc2tGZWF0dXJlcy5sZW5ndGg7IGorKykgewotCQkJCUVSZWZlcmVuY2UgZmVhdHVyZSA9IHRhc2tGZWF0dXJlc1tqXTsKLQkJCQlPYmplY3QgdmFsdWUgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRSZWZlcmVuY2UodGFzaywgZmVhdHVyZSwgY29uZmlnKTsKLQkJCQlpZigoZmVhdHVyZS5pc01hbnkoKSAmJiAoKExpc3QpdmFsdWUpLmNvbnRhaW5zKHdwKSkgfHwKLQkJCQkJCXZhbHVlID09IHdwKSAKLQkJCQl7Ci0JCQkJCUNvbGxlY3Rpb24gZmVhdHVyZXMgPSAoQ29sbGVjdGlvbikgZmVhdHVyZXNNYXAuZ2V0KHRhc2spOwotCQkJCQlpZihmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkJCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsJCi0JCQkJCQlmZWF0dXJlc01hcC5wdXQodGFzaywgZmVhdHVyZXMpOwotCQkJCQl9Ci0JCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVzTWFwOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRGVlcENvcHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyYTZiZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRGVlcENvcHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0vKioKLSAqIFBoeXNpY2FsbHkgY29waWVzIGEgcHJvY2VzcyB3aXRoIGFsbCBvZiBpdHMgZGlyZWN0IG9yIGluaGVyaXRlZCBzdHJ1Y3R1cmFsIGZlYXR1cmVzIGFuZCByZWZlcmVuY2VzLgotICogQWRkIHRoZSBuZXdseSBjcmVhdGVkIHByb2Nlc3MgdG8gdGhlIHNwZWNpZmllZCBwcm9jZXNzIHBhY2thZ2UuCi0gKiAgICAKLSAqIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgdG8gcmV1c2UgbW9zdCBvZiBpdCdzIGZ1bmN0aW9uYWxpdHkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZCBleHRlbmRzIEFjdGl2aXR5RGVlcENvcHlDb21tYW5kIHsKLQotCXByaXZhdGUgUHJvY2Vzc1BhY2thZ2UgdGFyZ2V0UGFja2FnZTsKLQlwcml2YXRlIFByb2Nlc3NDb21wb25lbnQgdGVtcFBjOwotCXByaXZhdGUgU3RyaW5nIG5ld1Byb2Nlc3NOYW1lOwotCQotCXB1YmxpYyBQcm9jZXNzRGVlcENvcHlDb21tYW5kKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jZXNzLCBTdHJpbmcgbmV3UHJvY2Vzc05hbWUsIENvcHlIZWxwZXIgY29weUhlbHBlciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFByb2Nlc3NQYWNrYWdlIHRhcmdldFBhY2thZ2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCXN1cGVyKHByb2Nlc3MsIGNvcHlIZWxwZXIsIGNvbmZpZywgbnVsbCwgbW9uaXRvcik7Ci0KLQkJdGhpcy5uZXdQcm9jZXNzTmFtZSA9IG5ld1Byb2Nlc3NOYW1lOwkJCi0JCXRoaXMudGFyZ2V0UGFja2FnZSA9IHRhcmdldFBhY2thZ2U7Ci0JCWNyZWF0ZXRhcmdldFByb2Nlc3MoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZXRhcmdldFByb2Nlc3MoKSB7Ci0JCS8vIGNyZWF0ZSBhIHBsYWNlaG9sZGVyIGZvciB0aGUgbmV3IHByb2Nlc3MKLQkJLy8gc2luY2UgdGhlIGNvbnRlbnQgcHJvY2Vzc29yIG5lZWRzIHRvIGtub3cgdGhlIHRhcmV0IHByb2Nlc3MgaW4gb3JkZXIgdG8gZml4IHRoZSB1cmxzCi0JCQotCQl0ZW1wUGMgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCXRhcmdldFBhY2thZ2UuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCh0ZW1wUGMpOwotCQkKLQkJaWYgKCBzdXBlci5hY3Rpdml0eSBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcyApIHsKLQkJCXRhcmdldFByb2Nlc3MgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyeVByb2Nlc3MoKTsKLQkJfSBlbHNlIHsKLQkJCXRhcmdldFByb2Nlc3MgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpOwkJCQotCQl9Ci0JCXRhcmdldFByb2Nlc3Muc2V0TmFtZShuZXdQcm9jZXNzTmFtZSk7Ci0JCXRhcmdldFByb2Nlc3Muc2V0UHJlc2VudGF0aW9uTmFtZShuZXdQcm9jZXNzTmFtZSk7Ci0JCXRlbXBQYy5zZXROYW1lKG5ld1Byb2Nlc3NOYW1lKTsKLQotCQl0ZW1wUGMuc2V0UHJvY2Vzcyh0YXJnZXRQcm9jZXNzKTsJCQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CQkJCQotCQlzdXBlci5leGVjdXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZpeFByb2Nlc3NDb21wb25lbnQoKSB7Ci0JCS8vIHJlcGxhY2UgdGhlIHBsYWNlIGhvbGRlciB3aXRoIHRoZSBhY3R1YWwgY29waWVkIHByb2Nlc3MKLQkJaWYgKHBrZ0NvcHkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICkgewotCQkJcGtnQ29weS5zZXROYW1lKG5ld1Byb2Nlc3NOYW1lKTsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KXBrZ0NvcHkpLmdldFByb2Nlc3MoKTsKLQkJCXByb2Muc2V0TmFtZShuZXdQcm9jZXNzTmFtZSk7Ci0JCQlwcm9jLnNldFByZXNlbnRhdGlvbk5hbWUobmV3UHJvY2Vzc05hbWUpOwotCQkJCi0JCQlFY29yZVV0aWwucmVwbGFjZSh0ZW1wUGMsIHBrZ0NvcHkpOwotCQl9Ci0JfQotCQotCS8qIAotCSAqIHJldHVybnMgYSBDb2xsZWN0aW9uIGNvbnRhaW5pbmcgdGhlIG5ldyBwcm9jZXNzCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI2dldFJlc3VsdCgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlpZihwa2dDb3B5ICE9IG51bGwgJiYgcGtnQ29weSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCAoKFByb2Nlc3NDb21wb25lbnQpcGtnQ29weSkuZ2V0UHJvY2VzcygpKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRWxlbWVudEFkZENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0VsZW1lbnRBZGRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjOThlZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRWxlbWVudEFkZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIFNlcCAxNiwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0VsZW1lbnRBZGRDb21tYW5kIGV4dGVuZHMgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQgCi1pbXBsZW1lbnRzIElSZXNvdXJjZUF3YXJlQ29tbWFuZAotewotCi0JcHVibGljIFByb2Nlc3NFbGVtZW50QWRkQ29tbWFuZChDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gZGlzYWJsZSBydW4gd2l0aCBwcm9ncmVzcyBiYXIgd2hlbiBhZGRpbmcgaW4gcHJvY2VzcyBlZGl0b3IKLQkJLy8KLQkJc3VwZXIoY29tbWFuZCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBQcm9jZXNzRWxlbWVudEFkZENvbW1hbmQoQ29tbWFuZCBjb21tYW5kLCBib29sZWFuIHJ1bldpdGhQcm9ncmVzcykgewotCQlzdXBlcihjb21tYW5kLCBydW5XaXRoUHJvZ3Jlc3MpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZCNnZXRGZWF0dXJlc1RvQ2hlY2soKQotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldEZlYXR1cmVzVG9DaGVjaygpIHsKLQkJaWYgKGZlYXR1cmVzVG9DaGVjayA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRGZWF0dXJlc1RvQ2hlY2soKS5hZGQoCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQl9Ci0JCXJldHVybiBmZWF0dXJlc1RvQ2hlY2s7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZCN3aWxsU2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB3aWxsU2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQkvLyBkb24ndCBzYXZlIHRoZSByZXNvdXJjZXMgYWZ0ZXIgZWFjaCBhZGQKLQkJLy8KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZCNzYXZlTW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVNb2RpZmllZFJlc291cmNlcygpIHsKLQkJLy8gZG9uJ3Qgc2F2ZSB0aGUgcmVzb3VyY2VzIGFmdGVyIGVhY2ggYWRkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kI2NyZWF0ZVZhbGlkYXRvcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwcm90ZWN0ZWQgSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoRU9iamVjdCBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGFkZENvbW1hbmQuZ2V0RG9tYWluKCk7Ci0JCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudAotCQkJCSYmIGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgRVJlZmVyZW5jZQotCQkJCSYmIGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJcmV0dXJuIElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVZhbGlkYXRvcihhZGRDb21tYW5kLmdldE93bmVyKCksIG51bGwsIGUsCi0JCQkJCWZlYXR1cmUsICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVWYWxpZGF0b3IoZSwgZmVhdHVyZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0VsZW1lbnREZWxldGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmNjg2NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKYW4gMjYsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQgZXh0ZW5kcwotCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0JcHJpdmF0ZSBTZXQgY29udGVudHNUb1JlbW92ZTsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzOwotCi0JcHJpdmF0ZSBib29sZWFuIG93bmVkRWxlbWVudHNJbmNsdWRlZDsKLQotCS8qKgotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHVibGljIFByb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZChDb21tYW5kIGNvbW1hbmQsIENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJc3VwZXIoY29tbWFuZCwgZWxlbWVudHMpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEBwYXJhbSBjb25maXJtUmVtb3ZlUmVmcwotCSAqLwotCXB1YmxpYyBQcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQoQ29tbWFuZCBjb21tYW5kLCBDb2xsZWN0aW9uIGVsZW1lbnRzLCBib29sZWFuIGNvbmZpcm1SZW1vdmVSZWZzKSB7Ci0JCXN1cGVyKGNvbW1hbmQsIGVsZW1lbnRzLCBjb25maXJtUmVtb3ZlUmVmcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmKCFvd25lZEVsZW1lbnRzSW5jbHVkZWQpIHsKLQkJCUNvbGxlY3Rpb24gb3duZWRFbGVtZW50cyA9IGdldE93bmVkRWxlbWVudHMoZWxlbWVudHMpOwotCQkJaWYoIW93bmVkRWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJaW5jbHVkZUVsZW1lbnRzKG93bmVkRWxlbWVudHMpOwotCQkJfQotCQkJb3duZWRFbGVtZW50c0luY2x1ZGVkID0gdHJ1ZTsKLQkJfQotCQkKLQkJc3VwZXIuZXhlY3V0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRPd25lZEVsZW1lbnRzKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJQXJyYXlMaXN0IG93bmVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZWxlbWVudCk7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQlpZih3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXIxID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHdwLCBmYWxzZSkgewotCi0JCQkJCQkvKioKLQkJCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCQkgKi8KLQkJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQyMjE4MTc4MjI2ODg3ODI4OUw7Ci0KLQkJCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJcmV0dXJuICgoQXJ0aWZhY3Qpb2JqZWN0KS5nZXRDb250YWluZWRBcnRpZmFjdHMoKS5pdGVyYXRvcigpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX07Ci0JCQkJCUhhc2hTZXQgd29ya1Byb2R1Y3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQkJd2hpbGUoaXRlcjEuaGFzTmV4dCgpKSB7Ci0JCQkJCQl3b3JrUHJvZHVjdHMuYWRkKGl0ZXIxLm5leHQoKSk7Ci0JCQkJCX0KLQkJCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KHdwZCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBiZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmIChiZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkJCQkJCQkmJiB3b3JrUHJvZHVjdHMuY29udGFpbnMoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGJlKQotCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpKSkgewotCQkJCQkJCW93bmVkRWxlbWVudHMuYWRkKGJlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG93bmVkRWxlbWVudHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhjbHVkZUVsZW1lbnRzKENvbGxlY3Rpb24gZXhjbHVkZWRFbGVtZW50cykgewotCQllbGVtZW50cy5yZW1vdmVBbGwoZXhjbHVkZWRFbGVtZW50cyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGV4Y2x1ZGVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJUmVtb3ZlQ29tbWFuZCBjbWQgPSBnZXRSZW1vdmVDb21tYW5kKGVsZW1lbnQpOwotCQkJaWYoY21kICE9IG51bGwpIHsKLQkJCQljbWQuZ2V0Q29sbGVjdGlvbigpLnJlbW92ZShlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbmNsdWRlRWxlbWVudHMoQ29sbGVjdGlvbiBpbmNsdWRlZEVsZW1lbnRzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGluY2x1ZGVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYoIWVsZW1lbnRzLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCVJlbW92ZUNvbW1hbmQgY21kID0gZ2V0UmVtb3ZlQ29tbWFuZChlbGVtZW50KTsKLQkJCQlpZihjbWQgIT0gbnVsbCkgewotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBjbWQuZ2V0Q29sbGVjdGlvbigpOwotCQkJCQlpZighY29sbGVjdGlvbi5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQkJY29sbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlcygpIHsKLQkJaWYgKGVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUVPYmplY3QgcGtnID0gKChBY3Rpdml0eSkgZWxlbWVudCkuZUNvbnRhaW5lcigpOwotCQkJCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQkJCWVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzLmFkZChwa2cpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMuYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVtb3ZlUmVmZXJlbmNlcyhvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZWZlcmVuY2VzKCkgewotCQljb250ZW50c1RvUmVtb3ZlID0gbmV3IEhhc2hTZXQoKTsKLQkJLy8gaGF2ZSB0byByZW1vdmUgdGhlIGRlbGV0ZWQgcHJvY2VzcyBlbGVtZW50cyBmcm9tIGl0cyBjb250YWluZXIKLQkJLy8gYW5kL29yIHJlc291cmNlCi0JCS8vIHNvIHN1cGVyLnJlbW92ZVJlZmVyZW5jZXMoKSBjYW4gcmVtb3ZlIHRoZWlyIHJlZmVyZW5jZXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBvYmo7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqOwotCi0JCQkJCS8vIHJlbW92ZSBjb250ZW50IG9mIHRoZSBhY3Rpdml0eSBmcm9tIGl0cyByZXNvdXJjZQotCQkJCQkvLwotCQkJCQkvLyByZW1vdmVDb250ZW50RnJvbVJlc291cmNlKGFjdCwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oYWN0KSkgewotCQkJCQkJY29udGVudHNUb1JlbW92ZS5hZGQoYWN0LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJfQotCi0JCQkJCS8vIHJlbW92ZSB0aGUgcHJvY2VzcyBwYWNrYWdlIG9mIHRoaXMgYWN0aXZpdHkKLQkJCQkJLy8KLQkJCQkJRU9iamVjdCBjb250YWluZXIgPSBlT2JqLmVDb250YWluZXIoKTsKLQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQlFY29yZVV0aWwucmVtb3ZlKGNvbnRhaW5lcik7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udGFpbmVyLmVBbGxDb250ZW50cygpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQkJYWN0ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotCi0JCQkJCQkJCS8vIHJlbW92ZSBjb250ZW50IG9mIHRoZSBhY3Rpdml0eSBmcm9tIGl0cwotCQkJCQkJCQkvLyByZXNvdXJjZQotCQkJCQkJCQkvLwotCQkJCQkJCQkvLyByZW1vdmVDb250ZW50RnJvbVJlc291cmNlKGFjdCwKLQkJCQkJCQkJLy8gbW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJCQkJCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkJCQkJCS5oYXNQcmVzZW50YXRpb24oYWN0KSkgewotCQkJCQkJCQkJY29udGVudHNUb1JlbW92ZS5hZGQoYWN0Ci0JCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlFY29yZVV0aWwucmVtb3ZlKChFT2JqZWN0KSBvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN1cGVyLnJlbW92ZVJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCNkZWxldGVDb250ZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVDb250ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRlbnRzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFY29yZVV0aWwucmVtb3ZlKChFT2JqZWN0KSBpdGVyLm5leHQoKSk7Ci0JCX0KLQkJZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQuYWRkQWxsKGNvbnRlbnRzVG9SZW1vdmUpOwotCQlzdXBlci5kZWxldGVDb250ZW50KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kI2NvbGxlY3RPYmplY3RzVG9SZW1vdmUoamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29sbGVjdE9iamVjdHNUb1JlbW92ZShDb2xsZWN0aW9uIG9iamVjdHNUb1JlbW92ZSwgRU9iamVjdCBlbGVtZW50VG9EZWxldGUsIEVPYmplY3QgcmVmZXJlbmNlciwgQ29sbGVjdGlvbiByZWZlcmVuY2VzKSB7Ci0JCWJvb2xlYW4gcmV0ID0gc3VwZXIuY29sbGVjdE9iamVjdHNUb1JlbW92ZShvYmplY3RzVG9SZW1vdmUsIGVsZW1lbnRUb0RlbGV0ZSwKLQkJCQlyZWZlcmVuY2VyLCByZWZlcmVuY2VzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVSZWZlcmVuY2UgcmVmID0gKEVSZWZlcmVuY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYocmVmID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpKSB7Ci0JCQkJRU9iamVjdCBjb250YWluZXIgPSByZWZlcmVuY2VyLmVDb250YWluZXIoKTsKLQkJCQlpZihjb250YWluZXIgIT0gbnVsbCAmJiBjb250YWluZXIuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQkJb2JqZWN0c1RvUmVtb3ZlLmFkZChjb250YWluZXIpOwotCQkJCQlyZXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoY29udGVudHNUb1JlbW92ZSAhPSBudWxsKSB7Ci0JCQljb250ZW50c1RvUmVtb3ZlLmNsZWFyKCk7Ci0JCX0KLQkJaWYoZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZmQ2YzczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBOb3YgMzAsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdFtdIFRBU0tfREVTQ1JJUFRPUl9fUkVMQVRJT05TSElQUyA9IHsKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwJCQotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKQotCX07Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBST0xFX0RFU0NSSVBUT1JfX1JFTEFUSU9OU0hJUFMgPSB7Ci0JCUFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX0Fzc2lzdHNJbl9UYXNrRGVzY3JpcHRvcnMsCi0JCUFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX0FkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMsCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkKLQl9OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFTEFUSU9OU0hJUFMgPSB7Ci0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCksCi0JCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycywKLQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMsCi0JCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzLAotCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMsCi0JCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycwotCX07Ci0JCi0JcHJpdmF0ZSBIYXNoU2V0IHJlbW92ZWREZXNjcmlwdG9yczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhYm9ydGVkOyAKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBYm9ydGVkKCkgewotCQlyZXR1cm4gYWJvcnRlZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRQYXJlbnQoRGVzY3JpcHRvciBvYmopIHsKLQkJLy8gQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCS8vIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkvLyBmYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJLy8gLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCS8vIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJLy8gZmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCS8vIC5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkvLyB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkvLyBmYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJLy8gLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBwcm92aWRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKQotCQkvLyBmYWN0b3J5LmFkYXB0KG9iaiwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gT2JqZWN0IGFjdCA9IHByb3ZpZGVyLmdldFBhcmVudChvYmopOwotCQkvLwotCQkvLyByZXR1cm4gYWN0OwotCi0JCXJldHVybiBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KG9iaik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlKE9iamVjdFtdIHJlZlRvYmVEZWxldGVkKSB7Ci0JCWlmIChyZWZUb2JlRGVsZXRlZCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZlRvYmVEZWxldGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRGVzY3JpcHRvciBvYmogPSAoRGVzY3JpcHRvcikgcmVmVG9iZURlbGV0ZWRbaV07Ci0JCQkJLy8gZ2V0IHBhcmVudCBhbmQgcmVtb3ZlIHJlZiBvYmplY3QKLQkJCQlPYmplY3QgYWN0ID0gZ2V0UGFyZW50KG9iaik7Ci0JCQkJaWYgKGFjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWlmICgoKEFjdGl2aXR5KSBhY3QpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlKG9iaikpIHsKLQkJCQkJCWdldFJlbW92ZWREZXNjcmlwdG9ycygpLmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVtb3ZlZERlc2NyaXB0b3JzKCkgewotCQlpZiAocmVtb3ZlZERlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXJlbW92ZWREZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlbW92ZWREZXNjcmlwdG9yczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUmVwbGFjZUFjdGl2aXR5Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9SZXBsYWNlQWN0aXZpdHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3MzQwYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9SZXBsYWNlQWN0aXZpdHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDEwLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBsYWNlQWN0aXZpdHlDb21tYW5kIGV4dGVuZHMgVmFyeUFjdGl2aXR5Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqLwotCXB1YmxpYyBSZXBsYWNlQWN0aXZpdHlDb21tYW5kKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJc3VwZXIod3JhcHBlcik7Ci0JCXNldExhYmVsKExpYnJhcnlFZGl0UmVzb3VyY2VzLmxvY2FsUmVwbGFjZXNfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5WYXJ5QWN0aXZpdHlDb21tYW5kI2RvVmFyeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9WYXJ5KCkgewotCQlQcm9jZXNzVXRpbC5yZXBsYWNlQWN0aXZpdHlMb2NhbGx5KHdyYXBwZXIsIGNyZWF0ZWRBY3Rpdml0aWVzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JvbGVBc3NvY2lhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Sb2xlQXNzb2NpYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmQ4NmE3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JvbGVBc3NvY2lhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVBc3NvY2lhdGlvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklNQVJZID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERElUSU9OQUwgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNTSVNURUQgPSAyOwotCi0JcHJpdmF0ZSBpbnQgdHlwZTsKLQotCXByaXZhdGUgUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3I7Ci0KLQlwcml2YXRlIFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yOwotCi0JcHJpdmF0ZSBSb2xlRGVzY3JpcHRvciBvbGRSb2xlRGVzY3JpcHRvcjsKLQotCXB1YmxpYyBSb2xlQXNzb2NpYXRpb24oaW50IHR5cGUsIFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yLAotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy5yb2xlRGVzY3JpcHRvciA9IHJvbGVEZXNjcmlwdG9yOwotCQl0aGlzLnRhc2tEZXNjcmlwdG9yID0gdGFza0Rlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGdldE9sZFJvbGVEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gb2xkUm9sZURlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2xkUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3Igb2xkUm9sZURlc2NyaXB0b3IpIHsKLQkJdGhpcy5vbGRSb2xlRGVzY3JpcHRvciA9IG9sZFJvbGVEZXNjcmlwdG9yOwotCX0KLQotCXB1YmxpYyBSb2xlRGVzY3JpcHRvciBnZXRSb2xlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdG9yOwotCX0KLQotCXB1YmxpYyBUYXNrRGVzY3JpcHRvciBnZXRUYXNrRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdG9yOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JvbGVUZWFtUHJvZmlsZUFzc29jaWF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JvbGVUZWFtUHJvZmlsZUFzc29jaWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5OTI4ZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Sb2xlVGVhbVByb2ZpbGVBc3NvY2lhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdWwgMjksIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUZWFtUHJvZmlsZUFzc29jaWF0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9TeW5jaHJvbml6ZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvU3luY2hyb25pemVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4Mjc1MjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9TeW5jaHJvbml6ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi0vKioKLSAqIENvbW1hbmQgZm9yIG9uZS13YXkgc3luY2hyb25pemF0aW9uIGZyb20gbWV0aG9kIHRvIHByb2Nlc3MuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTm92IDIyLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZUNvbW1hbmQgZXh0ZW5kcyBDb21wb3VuZENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXByb3RlY3RlZCBib29sZWFuIGFib3J0ZWQ7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBkZWxldGVMaXN0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY1N1Y2Nlc3NmdWw7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBkZWxldGVDb21tYW5kTGlzdDsKLQotCXByb3RlY3RlZCBib29sZWFuIHN1Y2Nlc3NmdWw7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBTZXQgc3luY2hGZWF0dXJlczsKLQotCXByaXZhdGUgRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kIGRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZDsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb24gYWN0aXZpdGllczsKLQotCXByaXZhdGUgYm9vbGVhbiBzaG93U3VjY2Vzc2Z1bE1zZyA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW50aWFsaXplZDsKLQotLy8JcHJpdmF0ZSBPYmplY3QgVUlDb250ZXh0OwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFN5bmNocm9uaXplQ29tbWFuZCB0aGF0IHVzZSB0aGUgcHJvY2VzcyBkZWZhdWx0Ci0JICogY29uZmlndXJhdGlvbiB0byBzeW5jaHJvbml6ZSBhbGwgdGhlIHN5bmNocm9uaXphYmxlIGZlYXR1cmVzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogICAgICAgICAgICBhIGxpc3Qgb2YgQnJlYWtkb3duRWxlbWVudCBvYmplY3RzCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplQ29tbWFuZChTdHJpbmcgbGFiZWwsIENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJc3VwZXIobGFiZWwpOwotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBTeW5jaHJvbml6ZUNvbW1hbmQgdGhhdCB1c2UgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gCi0JICogYW5kIGxpc3Qgb2Ygc3luY2hyb25pemFibGUgZmVhdHVyZXMgdG8gc3luY2hyb25pemUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcGFyYW0gY29uZmlnIHRoZSBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHN5bmNoRmVhdHVyZXMgdGhlIHN5bmNocm9uaXphYmxlIGZlYXR1cmVzCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplQ29tbWFuZChDb2xsZWN0aW9uIGVsZW1lbnRzLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMsIGJvb2xlYW4gc2hvd1N1Y2Nlc3NmdWxNc2cpIHsKLQkJc3VwZXIoTGlicmFyeUVkaXRSZXNvdXJjZXMuQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbCk7IAotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBzeW5jaEZlYXR1cmVzOwotCQl0aGlzLnNob3dTdWNjZXNzZnVsTXNnID0gc2hvd1N1Y2Nlc3NmdWxNc2c7IAotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQlpZihjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJY29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6YXRpb25GZWF0dXJlcyhTZXQgc3luY2hGZWF0dXJlcykgewotCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBzeW5jaEZlYXR1cmVzOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZG9Jbml0aWFsaXplKCkgewotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWRlbGV0ZUNvbW1hbmRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZWxldGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlhZGRUb0RlbGV0ZUxpc3QoZWxlbWVudCwgZGVsZXRlTGlzdCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhY3Rpdml0aWVzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQllbGVtZW50cy5yZW1vdmVBbGwoZGVsZXRlTGlzdCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChEZXNjcmlwdG9yKSBvYmplY3Q7Ci0JCQkJaWYgKGRlc2NyaXB0b3IuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkKLQkJCQkJCSYmICFkZWxldGVMaXN0LmNvbnRhaW5zKGRlc2NyaXB0b3IpKSB7Ci0JCQkJCWlmKGRlc2NyaXB0b3IuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewkJCQkJCQotCQkJCQkJLy8gZGVzY3JpcHRvciBpcyB1c2VkIGJ5IFRlYW1Qcm9maWxlIHRvIHJlcHJlc2VudCBhIHJvbGUgb3IgdXNlZCBieSBhIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3IgdG8KLQkJCQkJCS8vIHJlcHJlc2VudCBhIGRlbGl2ZXJhYmxlIHBhcnQKLQkJCQkJCS8vCi0JCQkJCQlpZihkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yICYmICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWRlc2NyaXB0b3IpLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQkJCWFwcGVuZChuZXcgU3luY2hyb25pemVEZWxpdmVyYWJsZURlc2NyaXB0b3JDb21tYW5kKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3IsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZykpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJYXBwZW5kKG5ldyBCYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQoZGVzY3JpcHRvciwgc3luY2hGZWF0dXJlcywgY29uZmlnKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlBY3Rpdml0eSBhY3QgPSBkZXNjcmlwdG9yLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJVGFzayB0YXNrID0gKChUYXNrRGVzY3JpcHRvcikgb2JqZWN0KS5nZXRUYXNrKCk7Ci0JCQkJCQkJaWYgKHRhc2sgIT0gbnVsbCkgewotCQkJCQkJCQlhcHBlbmQobmV3IFdCU0Ryb3BDb21tYW5kKGFjdCwgQ29sbGVjdGlvbnMKLQkJCQkJCQkJCQkuc2luZ2xldG9uTGlzdCh0YXNrKSwgY29uZmlnLCBzeW5jaEZlYXR1cmVzKSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIG9iamVjdCkuZ2V0Um9sZSgpOwotCQkJCQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQkJCQkJYXBwZW5kKG5ldyBPQlNEcm9wQ29tbWFuZChhY3QsIENvbGxlY3Rpb25zCi0JCQkJCQkJCQkJLnNpbmdsZXRvbkxpc3Qocm9sZSksIGNvbmZpZywgc3luY2hGZWF0dXJlcywgY29uZmlndXJhdG9yKSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCQlXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmplY3QpCi0JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCQkJaWYgKHdwICE9IG51bGwpIHsKLQkJCQkJCQkJYXBwZW5kKG5ldyBQQlNEcm9wQ29tbWFuZChhY3QsIENvbGxlY3Rpb25zCi0JCQkJCQkJCQkJLnNpbmdsZXRvbkxpc3Qod3ApLCBjb25maWcsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZ3VyYXRvcikpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhcHBlbmRDb21tYW5kcygoQWN0aXZpdHkpIG9iamVjdCk7Ci0JCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJYXBwZW5kQ29tbWFuZHMoKFRlYW1Qcm9maWxlKW9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICFkZWxldGVMaXN0LmlzRW1wdHkoKSB8fCAhY29tbWFuZExpc3QuaXNFbXB0eSgpIHx8ICFhY3Rpdml0aWVzLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpbml0aWxpemUoKSB7Ci0JCXJldHVybiBpbnRpYWxpemVkID0gZG9Jbml0aWFsaXplKCk7CQkKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW50aWFsaXplZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50aWFsaXplZCgpIHsKLQkJcmV0dXJuIGludGlhbGl6ZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZENvbW1hbmRzKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCUxpc3QgdGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgcm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgd29ya1Byb2R1Y3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKCgoRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKQotCQkJCQkJJiYgIWRlbGV0ZUxpc3QuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJVGFzayB0YXNrID0gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0VGFzaygpOwotCQkJCQkJaWYgKHRhc2sgIT0gbnVsbCkgewotCQkJCQkJCXRhc2tzLmFkZCh0YXNrKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFJvbGUoKTsKLQkJCQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQkJCQlyb2xlcy5hZGQocm9sZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCQkJCXdvcmtQcm9kdWN0cy5hZGQod3ApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhY3Rpdml0aWVzLmFkZChlbGVtZW50KTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJYXBwZW5kQ29tbWFuZHMoKFRlYW1Qcm9maWxlKWVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmICghdGFza3MuaXNFbXB0eSgpKSB7Ci0JCQlhcHBlbmQobmV3IFdCU0Ryb3BDb21tYW5kKGFjdGl2aXR5LCB0YXNrcywgY29uZmlnLCBzeW5jaEZlYXR1cmVzKSk7Ci0JCX0KLQkJaWYgKCFyb2xlcy5pc0VtcHR5KCkpIHsKLQkJCWFwcGVuZChuZXcgT0JTRHJvcENvbW1hbmQoYWN0aXZpdHksIHJvbGVzLCBjb25maWcsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZ3VyYXRvcikpOwotCQl9Ci0JCWlmICghd29ya1Byb2R1Y3RzLmlzRW1wdHkoKSkgewotCQkJYXBwZW5kKG5ldyBQQlNEcm9wQ29tbWFuZChhY3Rpdml0eSwgd29ya1Byb2R1Y3RzLCBjb25maWcsCi0JCQkJCXN5bmNoRmVhdHVyZXMsIGNvbmZpZ3VyYXRvcikpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXRpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlhcHBlbmRDb21tYW5kcygoQWN0aXZpdHkpIGl0ZXIubmV4dCgpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYXBwZW5kQ29tbWFuZHMoVGVhbVByb2ZpbGUgdGVhbSkgewotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHRlYW0sIGZhbHNlKSB7Ci0KLQkJCS8qKgotCQkJICogCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoKFRlYW1Qcm9maWxlKW9iamVjdCk7Ci0JCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHRlYW0uZ2V0U3ViVGVhbSgpKTsKLQkJCQkJY2hpbGRyZW4uYWRkQWxsKHRlYW0uZ2V0VGVhbVJvbGVzKCkpOwotCQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX07Ci0JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkKLQkJCS8vIHN5bmNoIG9ubHkgb3duIHJvbGUgZGVzY3JpcHRvciBvZiB0ZWFtIHByb2ZpbGUKLQkJCS8vCi0JCQlpZihvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvciAmJiAoKFJvbGVEZXNjcmlwdG9yKW9iaikuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCWFwcGVuZChuZXcgQmFzaWNTeW5jaHJvbml6ZURlc2NyaXB0b3JDb21tYW5kKChEZXNjcmlwdG9yKSBvYmosIHN5bmNoRmVhdHVyZXMsIGNvbmZpZykpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlIYXNoU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kID0gKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgaXRlci5uZXh0KCk7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwoY21kLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkpOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0JCi0vLwlwdWJsaWMgdm9pZCBzZXRVSUNvbnRleHQoT2JqZWN0IFVJQ29udGV4dCkgewotLy8JCXRoaXMuVUlDb250ZXh0ID0gVUlDb250ZXh0OwotLy8JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGRlbGV0ZSBhbGwgZGVzY3JpcHRvcnMgd2hvc2UgbGlua2VkIGVsZW1lbnQgYXJlIG5vIGxvbmdlciBpbiB0aGUKLQkJLy8gY29uZmlndXJhdGlvbgotCQkvLwotCQlpZiAoIWRlbGV0ZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlDb21tYW5kIGNtZCA9IGRlbGV0ZShkZWxldGVMaXN0KTsKLQkJCWlmIChjbWQgIT0gbnVsbCkgewotCQkJCWRlbGV0ZUNvbW1hbmRMaXN0LmFkZChjbWQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFhYm9ydGVkKSB7Ci0vLwkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0vLwotLy8JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLS8vCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLS8vCQkJCQlwcmVFeGVjU3VjY2Vzc2Z1bCA9IHByZUV4ZWN1dGUoKTsKLS8vCQkJCX0KLS8vCi0vLwkJCX07Ci0vLwkJCQkJCQotLy8JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBmYWxzZSwgbnVsbCk7Ci0vLwotLy8JCQlpZiAocHJlRXhlY1N1Y2Nlc3NmdWwpIHsKLS8vCQkJCXRyeSB7Ci0vLwkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKLS8vCQkJCQkJCi0vLwkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vCQkJCQkJCXN1cGVyUmVkbygpOwotLy8JCQkJCQkJc3VjY2Vzc2Z1bCA9IHRydWU7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJCi0vLwkJCQkJfSk7Ci0vLwkJCQl9Ci0vLwkJCQljYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKGdldExhYmVsKCksIGUudG9TdHJpbmcoKSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCQotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXByZUV4ZWNTdWNjZXNzZnVsID0gcHJlRXhlY3V0ZSgpOwotCQkJCQlpZihwcmVFeGVjdXRlKCkpIHsKLQkJCQkJCXN1cGVyUmVkbygpOwotCQkJCQkJc3VjY2Vzc2Z1bCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX07Ci0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuSW5VSShydW5uYWJsZSwgZ2V0TGFiZWwoKSk7Ci0JCQkKLQkJCWlmIChzdWNjZXNzZnVsKSB7CQkJCQotCQkJCWlmKCFhY3Rpdml0aWVzLmlzRW1wdHkoKSkgewotCQkJCQlpZihkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgPT0gbnVsbCkgewotCQkJCQkJZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kID0gbmV3IERlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZChlbGVtZW50cywgdHJ1ZSwgZGVsZXRlTGlzdCkgewotCQkJCQkJCQotCQkJCQkJCXByb3RlY3RlZCBDb21tYW5kIGRlbGV0ZShMaXN0IGVsZW1lbnRzKSB7Ci0JCQkJCQkJCXJldHVybiBTeW5jaHJvbml6ZUNvbW1hbmQudGhpcy5kZWxldGUoZWxlbWVudHMpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX07Ci0JCQkJCQlkZWxldGVDb21tYW5kTGlzdC5hZGQoZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKTsKLQkJCQkJfQotCQkJCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuZXhlY3V0ZSgpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoc2hvd1N1Y2Nlc3NmdWxNc2cpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dJbmZvKAotCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuU3luY2hyb25pemVDb21wbGV0ZURpYWxvZ19UaXRsZSwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLkF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfc3VjZXNzZnVsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3VwZXJSZWRvKCkgewotCQlzdXBlci5yZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Vzc2Z1bCgpIHsKLQkJcmV0dXJuIHN1Y2Nlc3NmdWw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY3V0ZSgpIHsKLQkJZm9yIChMaXN0SXRlcmF0b3IgY29tbWFuZHMgPSBjb21tYW5kTGlzdC5saXN0SXRlcmF0b3IoKTsgY29tbWFuZHMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNvbW1hbmQgPSBjb21tYW5kcy5uZXh0KCk7Ci0JCQlpZihjb21tYW5kIGluc3RhbmNlb2YgQlNEcm9wQ29tbWFuZCAmJiAhKChCU0Ryb3BDb21tYW5kKWNvbW1hbmQpLnByZUV4ZWN1dGUoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJLy8gYmUgcG9saXRlIHRvIG90aGVyIHRocmVhZHMgKG5vIGVmZmVjdCBvbiBzb21lIHBsYXRmb3JtcykKLQkJCS8vCi0JCQlUaHJlYWQueWllbGQoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcmV0dXJuIHRoZSBleGVjdXRlZCBjb21tYW5kIHRoYXQgZGVsZXRlZCB0aGUgZ2l2ZW4gZWxlbWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBkZWxldGUoTGlzdCBlbGVtZW50cykgewotCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCUNvbW1hbmQgY21kID0gbmV3IFByb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZChSZW1vdmVDb21tYW5kLmNyZWF0ZShkb21haW4sCi0JCQkJZWxlbWVudHMpLCBlbGVtZW50cyk7Ci0JCWNtZC5leGVjdXRlKCk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGdldENvbmZpZ3VyYXRvcigpIHsKLQkJaWYgKGNvbmZpZ3VyYXRvciA9PSBudWxsKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHRoaXMuY29uZmlnOwotCQkJaWYoY29uZmlnID09IG51bGwpIHsKLQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnRzCi0JCQkJCQkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJCWNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCX0KLQkJCWNvbmZpZ3VyYXRvciA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0b3JGYWN0b3J5KCkKLQkJCQkJLmNyZWF0ZUNvbmZpZ3VyYXRvcihjb25maWcpOwotCQl9Ci0JCXJldHVybiBjb25maWd1cmF0b3I7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZGVsZXRlTGlzdAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUb0RlbGV0ZUxpc3QoT2JqZWN0IGVsZW1lbnQsIExpc3QgZGVsZXRlTGlzdCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCWlmICghZ2V0Q29uZmlndXJhdG9yKCkuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJZGVsZXRlTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKEFjdGl2aXR5KSBlbGVtZW50KS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlhZGRUb0RlbGV0ZUxpc3QoaXRlci5uZXh0KCksIGRlbGV0ZUxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN1cGVyVW5kbygpIHsKLQkJc3VwZXIudW5kbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKCFkZWxldGVDb21tYW5kTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChMaXN0SXRlcmF0b3IgY29tbWFuZHMgPSBkZWxldGVDb21tYW5kTGlzdAotCQkJCQkJCS5saXN0SXRlcmF0b3IoZGVsZXRlQ29tbWFuZExpc3Quc2l6ZSgpKTsgY29tbWFuZHMKLQkJCQkJCQkuaGFzUHJldmlvdXMoKTspIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJQ29tbWFuZCBjb21tYW5kID0gKENvbW1hbmQpIGNvbW1hbmRzLnByZXZpb3VzKCk7Ci0JCQkJCQkJY29tbWFuZC51bmRvKCk7Ci0JCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQkJCS8vIFNraXAgb3ZlciB0aGUgY29tbWFuZCB0aGF0IHRocmV3IHRoZSBleGNlcHRpb24uCi0JCQkJCQkJLy8KLQkJCQkJCQljb21tYW5kcy5uZXh0KCk7Ci0KLQkJCQkJCQl0cnkgewotCQkJCQkJCQkvLyBJdGVyYXRlIGZvcndhcmQgb3ZlciB0aGUgdW5kb25lIGNvbW1hbmRzIHRvCi0JCQkJCQkJCS8vIHJlZG8gdGhlbS4KLQkJCQkJCQkJLy8KLQkJCQkJCQkJd2hpbGUgKGNvbW1hbmRzLmhhc05leHQoKSkgewotCQkJCQkJCQkJQ29tbWFuZCBjb21tYW5kID0gKENvbW1hbmQpIGNvbW1hbmRzLm5leHQoKTsKLQkJCQkJCQkJCWNvbW1hbmQucmVkbygpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBuZXN0ZWRFeGNlcHRpb24pIHsKLQkJCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJLmxvZyhuZXcgV3JhcHBlZEV4Y2VwdGlvbigKLQkJCQkJCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfSWdub3JlRXhjZXB0aW9uX2V4Y2VwdGlvbiIpLCBuZXN0ZWRFeGNlcHRpb24pLmZpbGxJblN0YWNrVHJhY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0KLQkJCQkJCQl0aHJvdyBleGNlcHRpb247Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlzdXBlclVuZG8oKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoYWN0aXZpdGllcyAhPSBudWxsKSB7Ci0JCQlhY3Rpdml0aWVzLmNsZWFyKCk7Ci0JCX0KLQkJaWYoZGVsZXRlQ29tbWFuZExpc3QgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVsZXRlQ29tbWFuZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgaXRlci5uZXh0KCk7Ci0JCQkJY21kLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlpZihkZWxldGVMaXN0ICE9IG51bGwpIHsKLQkJCWRlbGV0ZUxpc3QuY2xlYXIoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvU3luY2hyb25pemVEZWxpdmVyYWJsZURlc2NyaXB0b3JDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1N5bmNocm9uaXplRGVsaXZlcmFibGVEZXNjcmlwdG9yQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Nzc1ZTdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvU3luY2hyb25pemVEZWxpdmVyYWJsZURlc2NyaXB0b3JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gc3luY2hyb25pemUgYXR0cmlidXRlcyBhbmQgZGVsaXZlcmFibGUgcGFydHMgb2YgYSBkZWxpdmVyYWJsZSBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gRmViIDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZURlbGl2ZXJhYmxlRGVzY3JpcHRvckNvbW1hbmQgZXh0ZW5kcwotCQlCYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQgewotCQotCXByaXZhdGUgU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoOwotCXByaXZhdGUgTWFwIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0czsKLQlwcml2YXRlIERlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQgIHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQ7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcwotCSAqIEBwYXJhbSBjb25maWcKLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVEZWxpdmVyYWJsZURlc2NyaXB0b3JDb21tYW5kKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yLAotCQkJU2V0IHN5bmNoRmVhdHVyZXMsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKGRlc2NyaXB0b3IsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQmFzaWNTeW5jaHJvbml6ZURlc2NyaXB0b3JDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIHVwZGF0ZSBsaW5rZWQgZWxlbWVudCBpZiBuZWVkZWQKLQkJLy8gc3luY2hyb25pemUgYXR0cmlidXRlcwotCQkvLwotCQlzdXBlci5leGVjdXRlKCk7Ci0JCQotCQlpZihkZXNjcmlwdG9yc1RvUmVmcmVzaCA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yc1RvUmVmcmVzaCA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5jbGVhcigpOwotCQl9Ci0JCWlmKHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyA9PSBudWxsKSB7Ci0JCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCWVsc2UgewotCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmNsZWFyKCk7Ci0JCX0KLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3I7Ci0JCVByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVEZWxpdmVyYWJsZVBhcnRzKHdwZCwgKERlbGl2ZXJhYmxlKXdwZC5nZXRXb3JrUHJvZHVjdCgpLCBjb25maWcsCi0JCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCk7Ci0JCQotCQlpZighd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmlzRW1wdHkoKSB8fCAhZGVzY3JpcHRvcnNUb1JlZnJlc2guaXNFbXB0eSgpKSB7Ci0JCQlpZih1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kID09IG51bGwpIHsKLQkJCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kID0gbmV3IERlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQodHJ1ZSwgc3luY2hGZWF0dXJlcywgY29uZmlnKTsKLQkJCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLnNldERlc2NyaXB0b3JzVG9SZWZyZXNoKGRlc2NyaXB0b3JzVG9SZWZyZXNoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCkuY2xlYXIoKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IHdwRGVzYyA9IGVudHJ5LmdldEtleSgpOwotCQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCkucHV0KHdwRGVzYywgCi0JCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwgZW50cnkuZ2V0VmFsdWUoKSkpOwotCQkJfQotCQkJCi0JCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLmV4ZWN1dGUoKTsKLQkJfQkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZih1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kICE9IG51bGwpIHsKLQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQudW5kbygpOwotCQl9Ci0JCQotCQlzdXBlci51bmRvKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsJCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQotCQlpZih1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kICE9IG51bGwpIHsKLQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTc4MzUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEZlYiAxMCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCXByaXZhdGUgSGFzaFNldCBpbmhlcml0ZWRFbGVtZW50czsKLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgQ29sbGVjdGlvbiBhZmZlY3RlZE9iamVjdHM7Ci0JcHJpdmF0ZSBIYXNoTWFwIG9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBVcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBDb2xsZWN0aW9uIGVsZW1lbnRzLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJc3VwZXIobGFiZWwpOwotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJdGhpcy5zdXBwcmVzc2lvbiA9IHN1cHByZXNzaW9uOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGFmZmVjdGVkT2JqZWN0cyAhPSBudWxsKSB7Ci0JCQlhZmZlY3RlZE9iamVjdHMuY2xlYXIoKTsKLQkJCWFmZmVjdGVkT2JqZWN0cyA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmKGluaGVyaXRlZEVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWluaGVyaXRlZEVsZW1lbnRzLmNsZWFyKCk7Ci0JCQlpbmhlcml0ZWRFbGVtZW50cyA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmKG9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcCAhPSBudWxsKSB7Ci0JCQlvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAuY2xlYXIoKTsKLQkJCW9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcCA9IG51bGw7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBzdXBwcmVzc2lvbi5nZXRQcm9jZXNzKCkuZVJlc291cmNlKCk7Ci0JCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmKGFmZmVjdGVkT2JqZWN0cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gYWZmZWN0ZWRPYmplY3RzOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYoYWZmZWN0ZWRPYmplY3RzID09IG51bGwpIHsKLQkJCWFmZmVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQllbHNlIHsKLQkJCWFmZmVjdGVkT2JqZWN0cy5jbGVhcigpOwotCQl9Ci0JCQotCQlpZihvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAgPT0gbnVsbCkgewotCQkJb2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQllbHNlIHsKLQkJCW9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcC5jbGVhcigpOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRJbmhlcml0ZWRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JCQlib29sZWFuIHdhc1N1cHByZXNzZWQgPSBzdXBwcmVzc2lvbi5pc0luU3VwcHJlc3NlZExpc3Qod3JhcHBlcik7Ci0JCQlpZihzdXBwcmVzc2lvbi51cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlKHdyYXBwZXIpKSB7Ci0JCQkJYWZmZWN0ZWRPYmplY3RzLmFkZCh3cmFwcGVyKTsKLQkJCQlvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAucHV0KHdyYXBwZXIsIEJvb2xlYW4udmFsdWVPZih3YXNTdXBwcmVzc2VkKSk7Ci0JCQl9CQkJCQkJCQkJCQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsJCQotCQlleGVjdXRlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYob2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwICE9IG51bGwgJiYgIW9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCUJvb2xlYW4gc3VwcHJlc3NlZCA9IChCb29sZWFuKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmKHN1cHByZXNzZWQuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJc3VwcHJlc3Npb24uc3VwcHJlc3MoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChlbnRyeS5nZXRLZXkoKSkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3VwcHJlc3Npb24ucmV2ZWFsKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZW50cnkuZ2V0S2V5KCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhZmZlY3RlZE9iamVjdHMuY2xlYXIoKTsKLQkJCWFmZmVjdGVkT2JqZWN0cy5hZGRBbGwoZWxlbWVudHMpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldEluaGVyaXRlZEVsZW1lbnRzKCkgewotCQlpZihpbmhlcml0ZWRFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlpbmhlcml0ZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWZvciAoSXRlcmF0b3IgdHJlZUl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoYWRhcHRlckZhY3RvcnksIGVsZW1lbnQpOyB0cmVlSXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlID0gdHJlZUl0ZXIubmV4dCgpOwotCQkJCQlpZihQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChlKSkgewotCQkJCQkJaW5oZXJpdGVkRWxlbWVudHMuYWRkKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbmhlcml0ZWRFbGVtZW50czsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9WYXJ5QWN0aXZpdHlDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1ZhcnlBY3Rpdml0eUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGU0NTlkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1ZhcnlBY3Rpdml0eUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAxMCwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFyeUFjdGl2aXR5Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcjsKLQotCXByaXZhdGUgUHJvY2VzcyBwcm9jOwotCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlZEFjdGl2aXRpZXM7Ci0KLQlwdWJsaWMgVmFyeUFjdGl2aXR5Q29tbWFuZChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXRoaXMud3JhcHBlciA9IHdyYXBwZXI7Ci0JCXByb2MgPSAoUHJvY2Vzcykgd3JhcHBlci5nZXRUb3BJdGVtKCk7Ci0JfQotCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGdldFdyYXBwZXIoKSB7Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAocHJvYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChwcm9jLmVSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlpZiAoY3JlYXRlZEFjdGl2aXRpZXMgPT0gbnVsbCkgewotCQkJY3JlYXRlZEFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSB7Ci0JCQljcmVhdGVkQWN0aXZpdGllcy5jbGVhcigpOwotCQl9Ci0KLQkJZG9WYXJ5KCk7Ci0KLQkJTGlzdCBsaXN0ZW5lcnMgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29tbWFuZExpc3RlbmVycyhWYXJ5QWN0aXZpdHlDb21tYW5kLmNsYXNzKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lciA9IChJQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCQlsaXN0ZW5lci5ub3RpZnlFeGVjdXRlZCh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvVmFyeSgpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkvLyBmaW5kIHRoZSBuZXcgd3JhcHBlcgotCQkvLwotCQlPYmplY3Qgb3duZXIgPSB3cmFwcGVyLmdldE93bmVyKCk7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpcCA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHdyYXBwZXIuZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChvd25lciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaXAuZ2V0Q2hpbGRyZW4ob3duZXIpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7CQkKLQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYKLQkJCQkJKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciljaGlsZCkuZ2V0VmFsdWUoKSA9PSB3cmFwcGVyLmdldFZhbHVlKCkpIHsKLQkJCQl3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBjaGlsZDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlMaXN0IGxpc3RlbmVycyA9IFByb3ZpZGVycwotCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKFZhcnlBY3Rpdml0eUNvbW1hbmQuY2xhc3MpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyID0gKElDb21tYW5kTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJCWxpc3RlbmVyLnByZVVuZG8odGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWNyZWF0ZWRBY3Rpdml0aWVzLmlzRW1wdHkoKSkgewotCQkJcmVzdG9yZU9yZGVyKCk7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGNyZWF0ZWRBY3Rpdml0aWVzLmdldCgwKTsKLQkJCWFjdC5zZXRTdXBlckFjdGl2aXRpZXMobnVsbCk7Ci0JCQljcmVhdGVkQWN0aXZpdGllcy5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIG9yZGVyIG9mIHRoZSBzaWJsaW5ncyBvZiB0aGUgd3JhcHBlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVPcmRlcigpIHsKLQkJQWN0aXZpdHkgdmFyaWVkQWN0ID0gKEFjdGl2aXR5KSBjcmVhdGVkQWN0aXZpdGllcy5nZXQoY3JlYXRlZEFjdGl2aXRpZXMuc2l6ZSgpIC0gMSk7Ci0JCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCUJyZWFrZG93bkVsZW1lbnQgcHJldiA9IHZhcmllZEFjdC5nZXRQcmVzZW50ZWRCZWZvcmUoKTsKLQkJaWYocHJldiAhPSBudWxsICYmIHByb2MgPT0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHByZXYpKSB7Ci0JCQlwcmV2LnNldFByZXNlbnRlZEFmdGVyKGJlKTsKLQkJfQotCQlCcmVha2Rvd25FbGVtZW50IG5leHQgPSB2YXJpZWRBY3QuZ2V0UHJlc2VudGVkQWZ0ZXIoKTsKLQkJaWYobmV4dCAhPSBudWxsICYmIHByb2MgPT0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKG5leHQpKSB7Ci0JCQluZXh0LnNldFByZXNlbnRlZEJlZm9yZShiZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBjcmVhdGVkQWN0aXZpdGllczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dCU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9XQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzFjMWQ1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dCU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci0KLS8qKgotICogRHJhZyBhbmQgZHJvcCBjb21tYW5kIHRvIGRyb3AgdGFza3MgaW4gV0JTIHN0cnVjdHVyZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgV0JTRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgQlNEcmFnQW5kRHJvcENvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBvcGVyYXRpb25zCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICovCi0JcHVibGljIFdCU0RyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLAotCQkJZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcmFnQW5kRHJvcENvbW1hbmQjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJXQlNEcmFnQW5kRHJvcENvbW1hbmQuYWNjZXB0KCk6IG9iaj0iK29iaik7Ci0KLQkJaWYob2JqIGluc3RhbmNlb2YgVGFzaykgewotCQkJaWYob3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0VmFsaWREZXNjcmlwdG9yKG9iaiwgKEFjdGl2aXR5KSBvd25lciwKLQkJCQkJCSgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKWRvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKSkgPT0gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcmFnQW5kRHJvcENvbW1hbmQjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwgTGlzdCBkcm9wU3JjKSB7Ci0JCXJldHVybiBuZXcgV0JTRHJvcENvbW1hbmQoKEFjdGl2aXR5KSBvd25lciwgZHJvcFNyYyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dCU0Ryb3BDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dCU0Ryb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE2ZjA2M2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9XQlNEcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSU5lc3RlZENvbW1hbmRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uVW5pcXVlTmFtZVBOYW1lSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gZHJhcCBhbmQgZHJvcCB0YXNrcyBvbnRvIGFuIGFjdGl2aXR5IGluIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNEcm9wQ29tbWFuZCBleHRlbmRzIEJTRHJvcENvbW1hbmQgewotCXByaXZhdGUgQXJyYXlMaXN0IHJvbGVEZXNjTGlzdDsKLQotCXByaXZhdGUgQXJyYXlMaXN0IHdwRGVzY0xpc3Q7Ci0KLQlwcml2YXRlIEhhc2hNYXAgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHJvbGVEZXNjVGVhbVByb2ZpbGVNYXA7Ci0JCi0JcHJpdmF0ZSBJRXhlY3V0b3IgZXhlY3V0b3I7Ci0KLQlwcml2YXRlIGNsYXNzIEV4ZWN1dG9yIGltcGxlbWVudHMgSUV4ZWN1dG9yIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBwcmVFeGVjdXRlKCkgewotCQkJdGFza0Rlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJcm9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd3BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2ggPSBzeW5jaHJvbml6ZSA/IGJhdGNoQ29tbWFuZC5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpIDogbnVsbDsKLQotCQkJTGlzdCBiZXMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJVW5pcXVlTmFtZVBOYW1lSGFuZGxlciB1bmlxdWVOYW1lc0hhbmRsZXIgPSBuZXcgVW5pcXVlTmFtZVBOYW1lSGFuZGxlcihiZXMsIGJlcyk7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZHJvcEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGRyb3BFbGVtZW50cy5nZXQoaSk7Ci0JCQkJVGFza0Rlc2NyaXB0b3IgZGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVUYXNrRGVzY3JpcHRvcih0YXNrLAotCQkJCQkJYWN0aXZpdHksIHJvbGVEZXNjTGlzdCwgd3BEZXNjTGlzdCwKLQkJCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cywKLQkJCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwKLQkJCQkJCWJhdGNoQ29tbWFuZC5nZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKSwgCi0JCQkJCQlXQlNEcm9wQ29tbWFuZC50aGlzLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwKLQkJCQkJCXN5bmNoRmVhdHVyZXMpOwotCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJdW5pcXVlTmFtZXNIYW5kbGVyLmVuc3VyZVVuaXF1ZShkZXNjKTsKLQkJCQkJdGFza0Rlc2NMaXN0LmFkZChkZXNjKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiAhdGFza0Rlc2NMaXN0LmlzRW1wdHkoKQotCQkJCQl8fCAhcm9sZURlc2NMaXN0LmlzRW1wdHkoKQotCQkJCQl8fCAhd3BEZXNjTGlzdC5pc0VtcHR5KCkKLQkJCQkJfHwgIXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCkKLQkJCQkJfHwgIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKQotCQkJCQl8fCBiYXRjaENvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9FeGNlY3V0ZSgpIHsKLQkJCS8vIGF1dG9tYXRpY2FsbHkgYWRkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRvIGRlbGl2ZXJhYmxlIHBhcnQKLQkJCS8vCi0JCQlpZiAoIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmVudHJ5U2V0KCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJCWlmICghZGVsaXZlcmFibGUuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmNvbnRhaW5zKAotCQkJCQkJCWVudHJ5LmdldEtleSgpKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkKAotCQkJCQkJCQkJZW50cnkuZ2V0S2V5KCkpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJLmxvZygiV0JTRHJvcENvbW1hbmQ6OmRvRXhlY3V0ZSAtIEFkZGluZyBkZWxpdmVyYWJsZSBwYXJ0IHRvIGRlbGl2ZXJhYmxlIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGFkZCB0YXNrIGRlc2NyaXB0b3JzCi0JCQkvLwotCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwodGFza0Rlc2NMaXN0KTsKLQotCQkJLy8gYWRkIHJvbGUgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChyb2xlRGVzY0xpc3QpOwotCi0JCQkvLyBhZGQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCQkvLwotCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwod3BEZXNjTGlzdCk7Ci0KLQkJCS8vIGFkZCBkZWxpdmVyYWJsZSBwYXJ0cyB0byB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCQkvLwotCQkJaWYgKCF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmVudHJ5U2V0KCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJCS5nZXRLZXkoKTsKLQkJCQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGRBbGwoCi0JCQkJCQkJKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYocm9sZURlc2NUZWFtUHJvZmlsZU1hcCA9PSBudWxsKSB7Ci0JCQkJcm9sZURlc2NUZWFtUHJvZmlsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJCVRlYW1Qcm9maWxlIHRlYW1Qcm9maWxlID0gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFRlYW0oCi0JCQkJCQkJYWN0aXZpdHksIHJvbGVEZXNjLmdldFJvbGUoKSk7Ci0JCQkJCWlmICh0ZWFtUHJvZmlsZSAhPSBudWxsKSB7Ci0JCQkJCQlyb2xlRGVzY1RlYW1Qcm9maWxlTWFwLnB1dChyb2xlRGVzYywgdGVhbVByb2ZpbGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gYWRkIHJvbGUgZGVzY3JpcHRvcnMgdG8gdGVhbSBwcm9maWxlcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVEZXNjVGVhbVByb2ZpbGVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl0ZWFtLmdldFRlYW1Sb2xlcygpLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0JCQl9Ci0KLQkJCS8vIGFkZCBuZXcgZGVzY3JpcHRvcnMgdG8gYWN0aXZpdHkncyBwYWNrYWdlCi0JCQkvLwotCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHRhc2tEZXNjTGlzdCk7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbChyb2xlRGVzY0xpc3QpOwotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwod3BEZXNjTGlzdCk7Ci0JCQl9Ci0JCQkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvVW5kbygpIHsKLQkJCQotCQkJLy8gcmVtb3ZlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkJLy8KLQkJCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHdwRGVzY0xpc3QpOwotCi0JCQkvLyByZW1vdmUgcm9sZSBkZXNjcmlwdG9ycwotCQkJLy8KLQkJCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHJvbGVEZXNjTGlzdCk7Ci0KLQkJCS8vIHJlbW92ZSB0YXNrIGRlc2NyaXB0b3JzCi0JCQkvLwotCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwodGFza0Rlc2NMaXN0KTsKLQotCQkJLy8gcmVtb3ZlIGRlbGl2ZXJhYmxlIHBhcnRzIHRvIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlpZiAoIXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuZW50cnlTZXQoKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkJLmdldEtleSgpOwotCQkJCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLnJlbW92ZUFsbCgKLQkJCQkJCQkoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZW1vdmUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgZnJvbSBkZWxpdmVyYWJsZSBwYXJ0Ci0JCQkvLwotCQkJaWYgKCF3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5lbnRyeVNldCgpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCQlkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSByb2xlIGRlc2NyaXB0b3JzIGZyb20gdGVhbSBwcm9maWxlcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVEZXNjVGVhbVByb2ZpbGVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl0ZWFtLmdldFRlYW1Sb2xlcygpLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSBkZXNjcmlwdG9ycyBmcm9tIGFjdGl2aXR5J3MgcGFja2FnZQotCQkJLy8KLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0aXZpdHkuZUNvbnRhaW5lcigpOwotCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbCh0YXNrRGVzY0xpc3QpOwotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwocm9sZURlc2NMaXN0KTsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHdwRGVzY0xpc3QpOwotCQkJfQotCQl9Ci0KLQl9OwotCi0JLyoqCi0JICogQHBhcmFtIGFjdAotCSAqICAgICAgICAgICAgdGhlIGFjdGl2aXR5IHRoYXQgdGhlIGdpdmVuIHRhc2tzIGFyZSBkcm9wcGVkIG9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogICAgICAgICAgICB0aGUgdGFza3MgdG8gZHJvcCBvbiB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKi8KLQlwdWJsaWMgV0JTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0LCBMaXN0IHRhc2tzKSB7Ci0JCXN1cGVyKGFjdCwgdGFza3MpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2spKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBkcm9wRWxlbWVudHMKLQkgKiBAcGFyYW0gc3luY2gKLQkgKi8KLQlwdWJsaWMgV0JTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3QgZHJvcEVsZW1lbnRzLCBib29sZWFuIHN5bmNoKSB7Ci0JCXN1cGVyKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIHN5bmNoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZHJvcEVsZW1lbnRzCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSBzeW5jaEZlYXR1cmVzCi0JICovCi0JcHVibGljIFdCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IGRyb3BFbGVtZW50cywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTZXQgc3luY2hGZWF0dXJlcykgewotCQlzdXBlcihhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBjb25maWcsIHN5bmNoRmVhdHVyZXMpOwotCX0KLQotCXB1YmxpYyBJRXhlY3V0b3IgZ2V0RXhlY3V0b3IoKSB7Ci0JCWlmIChleGVjdXRvciA9PSBudWxsKSB7Ci0JCQlleGVjdXRvciA9IG5ldyBFeGVjdXRvcigpOwotCQl9Ci0JCXJldHVybiBleGVjdXRvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI3ByZUV4ZWN1dGUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZUV4ZWN1dGUoKSB7Ci0JCWlmICghc3VwZXIucHJlRXhlY3V0ZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBnZXRFeGVjdXRvcigpLnByZUV4ZWN1dGUoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNleGVjdXRlTmVzdGVkQ29tbWFuZHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpIHsKLQkJTGlzdCBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzID0gRXh0ZW5zaW9uTWFuYWdlci5nZXROZXN0ZWRDb21tYW5kUHJvdmlkZXJzKCk7Ci0JCWlmKCFuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJaWYoIXRhc2tEZXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlOZXN0ZWRDb21tYW5kUHJvdmlkZXIgY21kUHJvdmlkZXIgPSAoSU5lc3RlZENvbW1hbmRQcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDb21tYW5kIGNtZCA9IGNtZFByb3ZpZGVyLmNyZWF0ZVJlbGF0ZWRPYmplY3RzKHRhc2tEZXNjTGlzdCwgV0JTRHJvcENvbW1hbmQudGhpcyk7Ci0JCQkJCQlpZihjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7CQkJCQkJCQotCQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJCQkJZ2V0TmVzdGVkQ29tbWFuZHMoKS5hZGQoY21kKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIuZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkb0V4ZWN1dGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJZXhlY3V0b3IuZG9FeGNlY3V0ZSgpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmICh0YXNrRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRhc2tEZXNjTGlzdDsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2RvVW5kbygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VbmRvKCkgewotCQlleGVjdXRvci5kb1VuZG8oKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChyb2xlRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJcm9sZURlc2NMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHJvbGVEZXNjVGVhbVByb2ZpbGVNYXAgIT0gbnVsbCkgewotCQkJcm9sZURlc2NUZWFtUHJvZmlsZU1hcC5jbGVhcigpOwotCQl9Ci0JCWlmICh3cERlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXdwRGVzY0xpc3QuY2xlYXIoKTsKLQkJfQotCQlpZiAod3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzICE9IG51bGwpIHsKLQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5jbGVhcigpOwotCQl9Ci0JCWlmICh3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCAhPSBudWxsKSB7Ci0JCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5jbGVhcigpOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmIzY2ZiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dvcmtQcm9kdWN0RGVzY3JpcHRvckNyZWF0ZUNvcHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDEyLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JDcmVhdGVDb3B5Q29tbWFuZCBleHRlbmRzCi0JCU1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGNvcHlIZWxwZXIKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgY29weUhlbHBlcikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBjb3B5SGVscGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZCNkb0V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJc3VwZXIuZG9FeGVjdXRlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNvcHlDb21tYW5kI2RvR2V0Q2hpbGRyZW5Ub0NvcHkoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGRvR2V0Q2hpbGRyZW5Ub0NvcHkoKSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5kb0dldENoaWxkcmVuVG9Db3B5KCk7Ci0KLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG93bmVyOwotCQlXb3JrUHJvZHVjdCB3cCA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQlpZiAod3AgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkLmdldERlbGl2ZXJhYmxlUGFydHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHBhcnQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyCi0JCQkJCQkubmV4dCgpOwotCQkJCWlmIChwYXJ0LmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwgJiYgcGFydCAhPSB3cGQpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKHBhcnQpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlpZiAoZG9tYWluIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZG9tYWluKQotCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuYWRhcHQob3duZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gaXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKG93bmVyKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQljaGlsZHJlbi5hZGQoVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQjZG9HZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGRvR2V0UmVzdWx0KCkgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkKGNvcHkpOwotCi0JCS8vIENoaWxkcmVuIHRoYXQgYXJlIHNob3duIGluIEJTIGR1ZSB0byBjaGlsZCByZWxhdGlvbnNoaXAgb2YgaXRzIGxpbmtlZAotCQkvLyBDb250ZW50RWxlbWVudAotCQkvLyBidXQgdGhleSBhcmUgbm90IGRpcmVjdGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3duZXIuIFdlIG5lZWQgdG8gYWRkCi0JCS8vIHRoZWlyIGNvcGllcyB0byB0aGUgcmVzdWx0Ci0JCS8vIHNvIHRoZXkgd2lsbCBiZSBhZGRlZCB0byBjbGlwYm9hcmQgZm9yIGxhdGVyIHBhc3RlCi0JCS8vCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvd25lcjsKLQkJV29ya1Byb2R1Y3Qgd3AgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWlmIChkb21haW4gaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9ICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pCi0JCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoCi0JCQkJCQlhZGFwdGVyRmFjdG9yeSwgd3BkLCBmYWxzZSk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgY2hpbGRDb3B5ID0gY29weUhlbHBlci5nZXQoVG5nVXRpbC51bndyYXAoaXRlcgotCQkJCQkJCS5uZXh0KCkpKTsKLQkJCQkJaWYgKGNoaWxkQ29weSAhPSBudWxsKSB7Ci0JCQkJCQlyZXN1bHQuYWRkKGNoaWxkQ29weSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZG9tYWluIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKQotCQkJKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikuYWRkQ29weUluZm8ocmVzdWx0LAotCQkJCQljb3B5SGVscGVyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFhNDk4NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tYW5kcyBmb3IgZWRpdGluZyBicmVha2Rvd24gZWxlbWVudHMgaW4gYSBQcm9jZXNzIGVkaXRvci4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMjY2OWZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogQWN0aXZpdHkgaXRlbSBwcm92aWRlciBmb3IgY29uc29saWRhdGVkIHZpZXcKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRPYmplY3Qob3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0KERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0VGFzaygpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNkb1JlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvUmVmcmVzaEFmZmVjdGVkVmlld2VycygpIHsKLQkJT2JqZWN0IHByb2MgPSBnZXRUb3BJdGVtKCk7Ci0JCU9iamVjdCBpdGVtUHJvdmlkZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwcm9jLAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGl0ZW1Qcm92aWRlcikKLQkJCQkJLnNldFJlZnJlc2hBbGxJRHNSZXF1aXJlZCh0cnVlKTsKLQkJfQotCi0JCVByb2Nlc3NVdGlsCi0JCQkJLnJlZnJlc2hJRHNJblZpZXdlcnMoKEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgdW53cmFwKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqKSB7Ci0JCUxpc3QgbmV3Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmopOwotCQljaGlsZHJlbiA9IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgZmFsc2UpOwotCQlMaXN0IHJvbGVEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB3cERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdG9yLm5leHQoKTsKLQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJCQotCQkJLy8gZG9uJ3QgcmV0dXJuIHJvbGVkZXNjcmlwdG9yIHdoaWNoIGFyZSBsaW5rZWQgdG8gdGFza2Rlc2NyaXB0b3IKLQkJCS8vIAotCQkJaWYgKGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBlOwotCQkJCWlmKEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpLmlzRW1wdHkoKSAmJgotCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuZ2V0QWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykuaXNFbXB0eSgpICYmCi0JCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5nZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykuaXNFbXB0eSgpKSAKLQkJCQl7Ci0JCQkJCXJvbGVEZXNjcmlwdG9ycy5hZGQob2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBkb24ndCByZXR1cm4gd3BkZXNjcmlwdG9yIHdoaWNoIGFyZSBsaW5rZWQgdG8gZWl0aGVyCi0JCQkvLyB0YXNrZGVzY3JpcHRvciBvciByb2xlZGVzY3JpcHRvcgotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlOwotCQkJCWlmKEFzc29jaWF0aW9uSGVscGVyLmdldEV4dGVybmFsSW5wdXRUbyh3cERlc2MpLmlzRW1wdHkoKSAmJgotCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuZ2V0TWFuZGF0b3J5SW5wdXRUbyh3cERlc2MpLmlzRW1wdHkoKSAmJgotCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3B0aW9uYWxJbnB1dFRvKHdwRGVzYykuaXNFbXB0eSgpICYmCi0JCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5nZXRPdXRwdXRGcm9tKHdwRGVzYykuaXNFbXB0eSgpICYmCi0JCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycyh3cERlc2MpLmlzRW1wdHkoKSkKLQkJCQl7Ci0JCQkJCXdwRGVzY3JpcHRvcnMuYWRkKG9iamVjdCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQluZXdDaGlsZHJlbi5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQotCQluZXdDaGlsZHJlbi5hZGRBbGwocm9sZURlc2NyaXB0b3JzKTsKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKHdwRGVzY3JpcHRvcnMpOwotCQkKLQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4obmV3Q2hpbGRyZW4pOwotCQkKLQkJcmV0dXJuIG5ld0NoaWxkcmVuOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNpc1JvbGxlZFVwKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGxlZFVwKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZjQyOThjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFdCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Qcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YTBhOWU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Qcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogUHJvY2VzcyBpdGVtIHByb3ZpZGVyIGZvciBjb25zb2xpZGF0ZWQgdmlldwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQotCXB1YmxpYyBQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuZGVsZWdhdGVJdGVtUHJvdmlkZXIgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCQkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQcm9jZXNzQ29tcG9uZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkvLyBuZWVkIHRvIHVwZGF0ZSB0aGUgbGlicmFyeSB2aWV3Ci0JCQkvLyBidXQgUHJvY2Vzc0NvbXBvbmVudHMgZG9uJ3QgaGF2ZSBhIFByZXNlbnRhdGlvbiBOYW1lLCBzbwotCQkJLy8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBwcm9jQ29tcCB0byBpdHNlbGYKLQkJCS8vIHRoaXMgd2lsbCBjYXVzZSBhIHJlZnJlc2gKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcykgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAocHJvYy5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gb2xkID0gcHJvYy5lQ29udGFpbmVyKCkuZURlbGl2ZXIoKTsKLQkJCQl0cnkgewotCQkJCQlwcm9jLmVDb250YWluZXIoKS5lU2V0RGVsaXZlcih0cnVlKTsKLQkJCQkJaWYgKHByb2MuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkKLQkJCQkJCSgoUHJvY2Vzc0NvbXBvbmVudClwcm9jLmVDb250YWluZXIoKSkuc2V0TmFtZSgoKFByb2Nlc3NDb21wb25lbnQpcHJvYy5lQ29udGFpbmVyKCkpLmdldE5hbWUoKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcHJvYy5lQ29udGFpbmVyKCkuZVNldERlbGl2ZXIob2xkKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjY3ZGE2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBSb2xlRGVzY3JpcHRvciBJdGVtIHByb3ZpZGVyIGZvciBjb25zb2xpZGF0ZWQgdmlldwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKG5ldyBDb21tYW5kUGFyYW1ldGVyKHRhcmdldCwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2lzV3JhcHBpbmdOZWVkZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENyZWF0ZUNoaWxkVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGdldEZlYXR1cmVUZXh0KGZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDcmVhdGVDaGlsZEltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGltZyA9IFRuZ1V0aWwuZ2V0SW1hZ2UoY2hpbGQpOwotCQlyZXR1cm4gaW1nICE9IG51bGwgPyBpbWcgOiBzdXBlci5nZXRDcmVhdGVDaGlsZEltYWdlKG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlV3JhcHBlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXcmFwcGVyKHZhbHVlLCBvYmplY3QsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCXdyYXBwZXIuc2V0UmVhZE9ubHkoZmFsc2UpOwotCQlyZXR1cm4gd3JhcHBlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUm9sZURlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCXJlZnJlc2hDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVmcmVzaENoaWxkcmVuKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKFByb2Nlc3NVdGlsLmlzUmVmcmVzaFJlcXVpcmVkKG5vdGlmaWNhdGlvbiwgbnVsbCkpIHsKLQkJCVByb2Nlc3MgdG9wQWN0ID0gKFByb2Nlc3MpIGdldFRvcEl0ZW0oKTsKLQkJCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCi0JCQlQcm9jZXNzVXRpbC5yZWZyZXNoVmlld2VyKHJvb3RBZGFwdGVyRmFjdG9yeSwgdG9wQWN0KTsKLQkJfQotCQkKLQkJLy8gcmVmcmVzaCBjaGlsZHJlbiBvZiB0aGlzIGl0ZW0gcHJvdmlkZXIsIGl0cyBwYXJlbnQgYWN0aXZpdHkgYW5kCi0JCS8vIGFsbCBleHRlbmRlcnMsIGxvY2FsIGNvbnRyaWJ1dG9ycyBvZiB0aGUgcGFyZW50IGFjdGl2aXR5Ci0JCS8vCi0JCVRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLnJlZnJlc2hDaGlsZHJlbih0aGlzLCBub3RpZmljYXRpb24pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbikgewotLy8JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuKTsKLS8vCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCWNhY2hlZENoaWxkcmVuLmNsZWFyKCk7Ci0vLwkJCWNhY2hlZENoaWxkcmVuLmFkZEFsbChjaGlsZHJlbik7Ci0vLwkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmopIHsKLQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIG9iajsKLQkJTGlzdCBuZXdDaGlsZHJlbjsKLQkKLQkJLy8gSWYgcm9sZXMgaGFzIGFueSBvZiB0YXNrZGVzY3JpcHRvciBsaW5rZWQgdGhlbiBkb24ndCBzaG93IGFueQotCQkvLyBjaGlsZHJlbiBvdGhlcndpc2Ugc2hvdyBpdCdzIGxpbmtlZCB3b3JrcHJvZHVjdCBkZXNjcmlwdG9yCi0JCWlmKCFBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKS5pc0VtcHR5KCkgfHwKLQkJCQkhQXNzb2NpYXRpb25IZWxwZXIuZ2V0QWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykuaXNFbXB0eSgpIHx8Ci0JCQkJIUFzc29jaWF0aW9uSGVscGVyLmdldEFzc2lzdGVkVGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKS5pc0VtcHR5KCkpCi0JCXsKLQkJCW5ld0NoaWxkcmVuID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGdldCBjaGlsZHJlbgotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iaik7Ci0JCQluZXdDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0RmlsdGVyKG9iaik7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCU9iamVjdCBjaGlsZCA9ICgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKChmaWx0ZXIgIT0gbnVsbCkgJiYgKGZpbHRlci5hY2NlcHQoY2hpbGQpKSkgewotCQkJCQkJbmV3Q2hpbGRyZW4uYWRkKG8pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLwkJIHNvcnQgdGhlIGNoaWxkcmVuCi0JCUNvbGxlY3Rpb25zLnNvcnQobmV3Q2hpbGRyZW4sIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQkKLQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4obmV3Q2hpbGRyZW4pOwotCQlyZXR1cm4gbmV3Q2hpbGRyZW47Ci0JfQotCi0JcHJpdmF0ZSBJRmlsdGVyIGdldEZpbHRlcihPYmplY3Qgb2JqKSB7Ci0JCUlGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChvYmopOwotCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpCi0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJZmlsdGVyID0gKChBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuZ2V0RmlsdGVyKCk7Ci0JCX0KLQotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGMxYjYxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5XcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VJdGVtUHJvdmlkZXIuQ29tcGFyZUJ5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9zIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gY2FjaGVkQ2hpbGRyZW47Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQobmV3IENvbW1hbmRQYXJhbWV0ZXIodGFyZ2V0LAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZURlc2NyaXB0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZURlc2NyaXB0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCQkKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCQkKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNpc1dyYXBwaW5nTmVlZGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDcmVhdGVDaGlsZFRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBnZXRGZWF0dXJlVGV4dChmZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBpbWcgPSBUbmdVdGlsLmdldEltYWdlKGNoaWxkKTsKLQkJcmV0dXJuIGltZyAhPSBudWxsID8gaW1nIDogc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRJbWFnZShvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVdyYXBwZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIElCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV3JhcHBlcih2YWx1ZSwgb2JqZWN0LCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl3cmFwcGVyLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFRhc2tEZXNjcmlwdG9yLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCXJlZnJlc2hDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQkKLQlzdGF0aWMgdm9pZCByZWZyZXNoQ2hpbGRyZW4oSXRlbVByb3ZpZGVyQWRhcHRlciBpcGEsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsJCQotCQlpZiAoUHJvY2Vzc1V0aWwuaXNSZWZyZXNoUmVxdWlyZWQobm90aWZpY2F0aW9uLCBudWxsKSkgewotCQkJaXBhLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0KLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gaXBhLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkKLQkJCWlmKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCS8vIG5lZWQgdG8gcmVmcmVzaCBjaGlsZHJlbiBvZiBwYXJlbnQgYWN0aXZpdHkKLQkJCQkvLwotCQkJCUFjdGl2aXR5IHBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudClub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwYXJlbnQsCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQkoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXIpCi0JCQkJCS5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCQlwYXJlbnQsIHRydWUsIGZhbHNlKSk7Ci0JCQkJfQotCi0JCQkJLy8gcmVmcmVzaCBleHRlbmRlcnMgYW5kIGxvY2FsIGNvbnRyaWJ1dG9ycyBvZiB0aGUgcGFyZW50Ci0JCQkJLy8KLQkJCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMocGFyZW50KTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwKLQkJCQkJCQkJfHwgdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMKSB7Ci0JCQkJCQkJYWRhcHRlciA9IFRuZ1V0aWwuZ2V0QWRhcHRlckJ5VHlwZSh2ZSwgYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQkJCQkoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXIpCi0JCQkJCQkJCS5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCQkJCQl2ZSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hDaGlsZHJlbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXJlZnJlc2hDaGlsZHJlbih0aGlzLCBub3RpZmljYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVDYWNoZWRDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0vLwkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotLy8JCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4pOwotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuKTsKLS8vCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaikgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJTGlzdCBuZXdDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBwcmltYXJ5UGVyZm9ybWVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBhZGRpdGlvbmFsUGVyZm9ybWVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBhc3NpdGVkQnkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbWFuZGF0b3J5SW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZXh0ZXJuYWxJbnB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBvcHRpb25hbElucHV0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG91dHB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcihvYmopOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCU9iamVjdCBjaGlsZCA9ICgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0VmFsdWUoKTsKLQkJCQkKLQkJCQkKLQkJCQlpZiAoKGZpbHRlciAhPSBudWxsKSAmJiAoZmlsdGVyLmFjY2VwdChjaGlsZCkpKSB7Ci0JCQkJCWlmICgoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pLmdldEZlYXR1cmUoKS5lcXVhbHMoCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpKSkgewotCQkJCQkJcHJpbWFyeVBlcmZvcm1lcnMuYWRkKG8pOwotCQkJCQl9IGVsc2UgaWYgKCgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykKLQkJCQkJCQkuZ2V0RmVhdHVyZSgpCi0JCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKSkgewotCQkJCQkJYWRkaXRpb25hbFBlcmZvcm1lcnMuYWRkKG8pOwotCQkJCQl9IGVsc2UgaWYgKCgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0RmVhdHVyZSgpCi0JCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCkpKSB7Ci0JCQkJCQlhc3NpdGVkQnkuYWRkKG8pOwotCQkJCQl9IGVsc2UgaWYgKCgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0RmVhdHVyZSgpLmVxdWFscygKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCkpKSB7Ci0JCQkJCQltYW5kYXRvcnlJbnB1dC5hZGQobyk7Ci0JCQkJCX0gZWxzZSBpZiAoKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRGZWF0dXJlKCkuZXF1YWxzKAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpKSkgewotCQkJCQkJZXh0ZXJuYWxJbnB1dC5hZGQobyk7Ci0JCQkJCX0gZWxzZSBpZiAoKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRGZWF0dXJlKCkuZXF1YWxzKAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpKSkgewotCQkJCQkJb3B0aW9uYWxJbnB1dC5hZGQobyk7Ci0JCQkJCX0gZWxzZSBpZiAoKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRGZWF0dXJlKCkuZXF1YWxzKAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpKSkgewotCQkJCQkJb3V0cHV0LmFkZChvKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHNvcnQgZm9yIGFsbCBjaGlsZHJlbgotCQlDb2xsZWN0aW9ucy5zb3J0KHByaW1hcnlQZXJmb3JtZXJzLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJQ29sbGVjdGlvbnMuc29ydChhZGRpdGlvbmFsUGVyZm9ybWVycywgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoYXNzaXRlZEJ5LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJQ29sbGVjdGlvbnMuc29ydChleHRlcm5hbElucHV0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJQ29sbGVjdGlvbnMuc29ydChtYW5kYXRvcnlJbnB1dCwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCUNvbGxlY3Rpb25zLnNvcnQob3B0aW9uYWxJbnB1dCwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCUNvbGxlY3Rpb25zLnNvcnQob3V0cHV0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJCi0JCW5ld0NoaWxkcmVuLmFkZEFsbChwcmltYXJ5UGVyZm9ybWVycyk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbChhZGRpdGlvbmFsUGVyZm9ybWVycyk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbChhc3NpdGVkQnkpOwotCQluZXdDaGlsZHJlbi5hZGRBbGwoZXh0ZXJuYWxJbnB1dCk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbChtYW5kYXRvcnlJbnB1dCk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbChvcHRpb25hbElucHV0KTsKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKG91dHB1dCk7Ci0JCQotCQluZXdDaGlsZHJlbiA9IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihuZXdDaGlsZHJlbiwgdHJ1ZSk7Ci0JCXVwZGF0ZUNhY2hlZENoaWxkcmVuKG5ld0NoaWxkcmVuKTsKLQkJcmV0dXJuIG5ld0NoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgdW53cmFwKTsKLQl9Ci0KLQlwcml2YXRlIElGaWx0ZXIgZ2V0RmlsdGVyKE9iamVjdCBvYmopIHsKLQkJSUZpbHRlciBmaWx0ZXIgPSBudWxsOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iaik7Ci0JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEFjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQlmaWx0ZXIgPSAoKEFjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5nZXRGaWx0ZXIoKTsKLQkJfQotCi0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlnZXRDaGlsZHJlbih0YXJnZXQpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciNnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7IAotCQlpZihjYWNoZWRDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotCQkJY2FjaGVkQ2hpbGRyZW4gPSBudWxsOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhOTk1ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotCi0vKioKLSAqIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBJdGVtIHByb3ZpZGVyIGZvciBjb25zb2xpZGF0ZWQgdmlldwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNpc1dyYXBwaW5nTmVlZGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDcmVhdGVDaGlsZFRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBnZXRGZWF0dXJlVGV4dChmZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBpbWcgPSBUbmdVdGlsLmdldEltYWdlKGNoaWxkKTsKLQkJcmV0dXJuIGltZyAhPSBudWxsID8gaW1nIDogc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRJbWFnZShvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVdyYXBwZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIElCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV3JhcHBlcih2YWx1ZSwgb2JqZWN0LCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl3cmFwcGVyLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJLy8gc3dpdGNoKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUm9sZURlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCS8vIGNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJLy8gcmVmcmVzaENoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCS8vIH0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkRlc2NyaXB0b3JJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqKSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmopOwotCQlMaXN0IG5ld0NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQluZXdDaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW4pOwotCQkvLyBzb3J0IHRoZSBjaGlsZHJlbgotCQlDb2xsZWN0aW9ucy5zb3J0KG5ld0NoaWxkcmVuLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQotCQlyZXR1cm4gbmV3Q2hpbGRyZW47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmMmE3N2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGl0ZW0gcHJvdmlkZXJzIGZvciBkaXNwbGF5aW5nIGFuZCBlZGl0aW5nIGJyZWFrZG93biBlbGVtZW50cyBpbiBhIFByb2Nlc3MgZWRpdG9yJ3MgQ29uc29saWRhdGVkIFZpZXcgcGFnZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9pbnRlcm5hbC9CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2ludGVybmFsL0JyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOWQwNWFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2ludGVybmFsL0JyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Db21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuRGVsaXZlcmFibGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgaW1wbGVtZW50cwotCQlJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5I2NyZWF0ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJcmV0dXJuIGNyZWF0ZVdyYXBwZXIodmFsdWUsIG93bmVyLCBudWxsLCBDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYLAotCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSNjcmVhdGVXcmFwcGVyKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQl2YWx1ZSA9IFRuZ1V0aWwudW53cmFwKHZhbHVlKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiBuZXcgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKChBY3Rpdml0eSkgdmFsdWUsIG93bmVyLAotCQkJCQlmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlyZXR1cm4gbmV3IE1pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIoKE1pbGVzdG9uZSkgdmFsdWUsIG93bmVyLAotCQkJCQlmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlcigoQ29tcG9zaXRlUm9sZSkgdmFsdWUsCi0JCQkJCW93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBuZXcgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCQkoUm9sZURlc2NyaXB0b3IpIHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gbmV3IFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCQkJKFRhc2tEZXNjcmlwdG9yKSB2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LAotCQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJcmV0dXJuIG5ldyBUZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIoKFRlYW1Qcm9maWxlKSB2YWx1ZSwKLQkJCQkJb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB2YWx1ZTsKLQkJCWlmICh3cGQuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJcmV0dXJuIG5ldyBEZWxpdmVyYWJsZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKHdwZCwgb3duZXIsCi0JCQkJCQlmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKHdwZCwgb3duZXIsCi0JCQkJCWZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlyZXR1cm4gbmV3IEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgdmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwKLQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvaW50ZXJuYWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvaW50ZXJuYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOThlYTg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIGRpc3BsYXlpbmcgYW5kIGVkaXRpbmcgYSBwcm9jZXNzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmZmYzU2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhbmQgZWRpdGluZyBicmVha2Rvd24gZWxlbWVudHMgaW4gYSBQcm9jZXNzIGVkaXRvci4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkOTA5ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5BY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBDQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuQWN0aXZpdHlJdGVtUHJvdmlkZXIjcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGphdmEudXRpbC5Db2xsZWN0aW9uLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCB1bndyYXAsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjcyNDRhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgQ0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0JCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENCU1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENCU1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhNTBhYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuUHJvY2Vzc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgUHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQ0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5BY3Rpdml0eUl0ZW1Qcm92aWRlciNyZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oamF2YS51dGlsLkNvbGxlY3Rpb24sIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIHVud3JhcCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMWNhYmEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIENCU1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIENCU1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDZiYThhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ0JTVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQ0JTVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCB1bndyYXAsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGU0MDQyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLldvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIENCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQ0JTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvVEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvVEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2FmNDc2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvVEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvVEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNmZGYwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCi0JCU9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBUQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvVEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MGJkMTNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvVEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRCU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBUQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDVjMjc3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzdiNzdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIFdCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0JCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4ODAwOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNQcm9jZXNzSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBXQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlNjNhMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIHVud3JhcCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA1NzZkNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCi0JCVBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBXUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV1BCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0JCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjJmM2UyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlBCU1Byb2Nlc3NJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBXUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgdW53cmFwLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDM3MTdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdQQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBXUEJTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJfQotCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIjYWRkQ29udGFpbmVkQXJ0aWZhY3REZXNjcmlwdG9ycyhvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udGFpbmVkQXJ0aWZhY3REZXNjcmlwdG9ycyhXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjLCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCUFjdGl2aXR5IGFjdGl2aXR5ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eSh3cERlc2MpOwotCQlpZihhY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQkvLyBjb2xsZWN0IGFsbCBhcnRpZmFjdCBkZXNjcmlwdG9ycyBvciB0aGVpciB3cmFwcGVycyB1bmRlciB0aGUgc2FtZSBhY3Rpdml0eQotCQkJLy8KLQkJCUxpc3QgYXJ0aWZhY3REZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUNvbGxlY3Rpb24gc2libGluZ3MgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2libGluZ3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yIAotCQkJCQkJJiYgKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZSkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIEFydGlmYWN0Ci0JCQkJCQkmJiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlKSkpIHsKLQkJCQkJYXJ0aWZhY3REZXNjTGlzdC5hZGQoZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQljaGlsZHJlbi5hZGRBbGwoUHJvY2Vzc1V0aWwuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzRGVzY3JpcHRvcnMod3BEZXNjLCBhcnRpZmFjdERlc2NMaXN0KSk7CQkJCi0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY1ZDhjODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhIHByb2Nlc3MgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvRGVsaXZlcmFibGVTZWxlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9EZWxpdmVyYWJsZVNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZWIyODM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9EZWxpdmVyYWJsZVNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7Ci0KLQotLyoqCi0gKiBVSSBEaWFsb2cgY2xhc3Mgd2hpY2ggd2lsbCBhc2sgdXNlciB0byBhc3NpZ24gYSB3cCB0byBkZWxpdmVyYWJsZQotICogYXV0b21hdGljYWxseQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcmFibGVTZWxlY3Rpb24gewotCi0JLyoqCi0JICogSXQgc2hvd3MgZGlhbG9nIGJveCBhbGwgZGVsaXZlcmFibGUuIFJldHVybnMgZGVsaXZlcmFibGUgdXNlciBzZWxlY3RlZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotLy8JcHVibGljIHN0YXRpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3IgZ2V0U2VsZWN0ZWREZWxpdmVyYWJsZSgKLS8vCQkJTGlzdCBkZWxpdmVyYWJsZUxpc3QsIFdvcmtQcm9kdWN0IHdwKSB7Ci0vLwkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0vLwkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0vLwkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0vLwkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0vLwkJCQkJcmV0dXJuICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmopLmdldE5hbWUoKTsKLS8vCQkJCX0KLS8vCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotLy8JCQl9Ci0vLwkJfTsKLS8vCi0vLwkJRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nKG51bGwsCi0vLwkJCQlsYWJlbFByb3ZpZGVyKTsKLS8vCi0vLwkJZGxnLnNldFRpdGxlKExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGl2ZXJhYmxlc190ZXh0KTsgLy8kTk9OLU5MUy0xJAotLy8JCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLS8vCQlkbGcuc2V0RWxlbWVudHMoZGVsaXZlcmFibGVMaXN0LnRvQXJyYXkoKSk7Ci0vLwkJZGxnLnNldE11bHRpcGxlU2VsZWN0aW9uKGZhbHNlKTsKLS8vCQlkbGcuc2V0TWVzc2FnZShOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGV4dCwgd3AuZ2V0TmFtZSgpKSk7IAotLy8JCWRsZy5zZXRUaXRsZShMaWJyYXJ5RWRpdFJlc291cmNlcy5zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGl0bGUpOyAvLyROT04tTkxTLTEkCi0vLwkJZGxnLnNldEZpbHRlcihudWxsKTsKLS8vCQlkbGcub3BlbigpOwotLy8KLS8vCQlPYmplY3Qgb2JqID0gZGxnLmdldEZpcnN0UmVzdWx0KCk7Ci0vLwotLy8JCS8vIGRpc3Bvc2UKLS8vCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLS8vCQlyZXR1cm4gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqOwotLy8JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvSUFjdGlvblR5cGVQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0lBY3Rpb25UeXBlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjQ3NDQ3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvSUFjdGlvblR5cGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvblR5cGVQcm92aWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1BZID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVEVORCA9IDI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVFUF9DT1BZID0gMzsKLQotCXZvaWQgc2V0SW5wdXREYXRhKE9iamVjdCBvYmplY3QpOwotCi0Jdm9pZCBzZXRBY3Rpb25NYW5hZ2VyKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncik7Ci0KLQl2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjbWQsIGJvb2xlYW4gY2FuRXh0ZW5kKTsKLQotLy8JaW50IGdldEFjdGlvblR5cGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL05ld1Byb2Nlc3NDb21wb25lbnREaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9OZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5MWM4YTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL05ld1Byb2Nlc3NDb21wb25lbnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgTmV3IFByb2Nlc3MgZGlhbG9nLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGFyZWE7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9uYW1lOwotCi0JcHJpdmF0ZSBDb21ib1ZpZXdlciBjb25maWdDb21ib1ZpZXdlcjsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbltdIGF2YWlsYWJsZUNvbmZpZ3VyYXRpb25zOwotCi0JcHJpdmF0ZSBQcm9jZXNzQ29tcG9uZW50IG5ld1Byb2NDb21wOwotCi0JcHJpdmF0ZSBQcm9jZXNzW10gYXZhaWxhYmxlQmFzZVByb2Nlc3NlczsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBwcm9jZXNzVGFibGVWaWV3ZXI7Ci0KLQkvLyBwcml2YXRlIFByb2Nlc3NQYWNrYWdlIG93bmVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBFQ0xBU1MgPSBuZXcgSGFzaFNldCgpOwotCi0JcHJpdmF0ZSBJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCXN0YXRpYyB7Ci0JCUVDTEFTUy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nKFNoZWxsIHBhcmVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBhdmFpbGFibGVDb25maWd1cmF0aW9ucywKLQkJCVByb2Nlc3NDb21wb25lbnQgbmV3Q29tcCwgUHJvY2Vzc1tdIGF2YWlsYWJsZUJhc2VQcm9jZXNzZXMsCi0JCQlNZXRob2RQbHVnaW4gY3VycmVudFBsdWdpbiwgUHJvY2Vzc1BhY2thZ2Ugb3duZXIpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5hdmFpbGFibGVDb25maWd1cmF0aW9ucyA9IGF2YWlsYWJsZUNvbmZpZ3VyYXRpb25zOwotCQl0aGlzLm5ld1Byb2NDb21wID0gbmV3Q29tcDsKLQkJdGhpcy5hdmFpbGFibGVCYXNlUHJvY2Vzc2VzID0gYXZhaWxhYmxlQmFzZVByb2Nlc3NlczsKLQkJLy8gdGhpcy5vd25lciA9IG93bmVyOwotCQl2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVOYW1lVmFsaWRhdG9yKG93bmVyLAotCQkJCW5ld1Byb2NDb21wKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJZmluYWwgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJYXJlYS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCUdyaWREYXRhIGFyZWFHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotLy8JCWFyZWFHcmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWFyZWEuc2V0TGF5b3V0RGF0YShhcmVhR3JpZERhdGEpOwkJCi0JCQotCQkvLyBOYW1lCi0JCUxhYmVsIG5hbWVMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCW5hbWVMYWJlbC5zZXRUZXh0KExpYnJhcnlFZGl0UmVzb3VyY2VzLm5hbWVMYWJlbF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9uYW1lID0gbmV3IFRleHQoYXJlYSwgU1dULkJPUkRFUik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCQl8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0JCQljdHJsX25hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBSZWYuIE1vZGVscwotCQlMYWJlbCByZWZNb2RlbExhYmVsID0gbmV3IExhYmVsKGFyZWEsIFNXVC5OT05FKTsKLQkJcmVmTW9kZWxMYWJlbC5zZXRUZXh0KExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlZmF1bHRDb25maWdMYWJlbF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJcmVmTW9kZWxMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShhcmVhLCBTV1QuTk9ORSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCQl8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQljb21wLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJfQotCi0JCWNvbmZpZ0NvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDIwMDsKLQkJCWNvbmZpZ0NvbWJvVmlld2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJCi0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQkvLyBjb25maWdMaXN0Vmlld2VyID0gbmV3IExpc3RWaWV3ZXIoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotCQkvLyBjb25maWdMaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCS8vIGNvbmZpZ0xpc3RWaWV3ZXIuYWRkKGF2YWlsYWJsZUNvbmZpZ3VyYXRpb25zKTsKLQkJLy8gaWYobmV3UHJvY0NvbXAuZ2V0UHJvY2VzcygpLmdldERlZmF1bHRDb250ZXh0KCkgIT0gbnVsbCkgewotCQkvLyBjb25maWdMaXN0Vmlld2VyLnNldFNlbGVjdGlvbihuZXcKLQkJLy8gU3RydWN0dXJlZFNlbGVjdGlvbihuZXdQcm9jQ29tcC5nZXRQcm9jZXNzKCkuZ2V0RGVmYXVsdENvbnRleHQoKSkpOwotCQkvLyB9Ci0KLQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJY29uZmlnQ29tYm9WaWV3ZXIuYWRkKGF2YWlsYWJsZUNvbmZpZ3VyYXRpb25zKTsKLQkJaWYgKG5ld1Byb2NDb21wLmdldFByb2Nlc3MoKS5nZXREZWZhdWx0Q29udGV4dCgpICE9IG51bGwpIHsKLQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdQcm9jQ29tcAotCQkJCQkuZ2V0UHJvY2VzcygpLmdldERlZmF1bHRDb250ZXh0KCkpKTsKLQkJfQotCQkvLyBjb25maWdDb21ib1ZpZXdlci5nZXRDb250cm9sKCkuc2V0U2l6ZSgxMDAsCi0JCS8vIGNvbmZpZ0NvbWJvVmlld2VyLmdldENvbnRyb2woKS5nZXRTaXplKCkueSk7Ci0KLQkJaWYgKG5ld1Byb2NDb21wLmdldFByb2Nlc3MoKSBpbnN0YW5jZW9mIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKSB7Ci0JCQkvLyBiYXNlZCBvbiBwcm9jZXNzZXMKLQkJCS8vCi0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KExpYnJhcnlFZGl0UmVzb3VyY2VzLmJhc2VkT25Qcm9jZXNzZXNMYWJlbF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQl9Ci0KLQkJCWNvbXAgPSBuZXcgQ29tcG9zaXRlKGFyZWEsIFNXVC5OT05FKTsKLQkJCXsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQkJY29tcC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQkJfQotCi0JCQlwcm9jZXNzVGFibGVWaWV3ZXIgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChjb21wLAotCQkJCQlTV1QuQk9SREVSKTsKLQkJCXByb2Nlc3NUYWJsZVZpZXdlci5nZXRUYWJsZSgpCi0JCQkJCS5zZXRMYXlvdXREYXRhKAotCQkJCQkJCW5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQkJCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCXByb2Nlc3NUYWJsZVZpZXdlcgotCQkJCQkuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQkJcHJvY2Vzc1RhYmxlVmlld2VyCi0JCQkJCS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJCXByb2Nlc3NUYWJsZVZpZXdlci5hZGQoYXZhaWxhYmxlQmFzZVByb2Nlc3Nlcyk7Ci0JCX0KLQotCQlpZiAobmV3UHJvY0NvbXAuZ2V0TmFtZSgpICE9IG51bGwpCi0JCQljdHJsX25hbWUuc2V0VGV4dChuZXdQcm9jQ29tcC5nZXROYW1lKCkpOwotCi0JCXN1cGVyCi0JCQkJLmdldFNoZWxsKCkKLQkJCQkuc2V0VGV4dCgKLQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLm5ld1Byb2Nlc3NDb21wb25lbnREaWFsb2dfdGl0bGUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gYWRkTGlzdGVuZXJzKCk7Ci0KLQkJcmV0dXJuIGFyZWE7Ci0JfQotCi0JLy8gcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCS8vIC8vIERPTidUIHVzZSBGb2N1c0xvc3QgbGlzdGVuZXIgYmVjYXVzZSBvdGhlcndpc2UgaXQgZ29lcyBpbmZpbml0ZSBsb29wCi0JLy8gLy8gYW5kIHVzZXIgY2Fubm90IGNhbmNlbCBvdXQgb2YgaXQuCi0JLy8gY3RybF9uYW1lLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JLy8gcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCS8vIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQgfHwgZS5kZXRhaWwgPT0KLQkvLyBTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTKSB7Ci0JLy8gU3RyaW5nIG5hbWUgPSBjdHJsX25hbWUuZ2V0VGV4dCgpOwotCS8vIFN0cmluZyBtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChuYW1lKTsKLQkvLyBpZiAobXNnICE9IG51bGwpIHsKLQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCS8vIExpYnJhcnlFZGl0UmVzb3VyY2VzLmdldFN0cmluZygiTGlicmFyeUVkaXQuY3JlYXRlUHJvY2Vzcy50ZXh0IiksCi0JLy8gLy8kTk9OLU5MUy0xJAotCS8vIG1zZyk7Ci0JLy8JCQkJCQkKLQkvLyBjdHJsX25hbWUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JLy8gcHVibGljIHZvaWQgcnVuICgpIHsKLQkvLyBjdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkvLyB9Ci0JLy8gfSk7Ci0JLy8gY3RybF9uYW1lLnNlbGVjdEFsbCgpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0pOwotCS8vIH0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRpYWxvZyBidXR0b25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIE9LIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQotCQkvLyBDcmVhdGUgdGhlIENhbmNlbCBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIE9LIGJ1dHRvbi4KLQkJc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCi0JCS8vIFNldCBoZWxwIGNvbnRleHQgZm9yIHRoZSBDYW5jZWwgYnV0dG9uLgotCQlzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQkvLyBOZWVkIHRvIGRvIHZhbGlkYXRpb24gYWdhaW4gc2luY2UgVHJhdmVyc2VMaXN0ZW5lciBvbmx5IGxpc3RlbnMgdG8KLQkJLy8gdGFiIG91dCBvZiBmaWVsZAotCQkvLyBhbmQgZG9lc24ndCB0YWtlIGNhcmUgb2YgbW91c2UgY2xpY2tzCi0JCVN0cmluZyBuYW1lID0gY3RybF9uYW1lLmdldFRleHQoKS50cmltKCk7Ci0JCW5hbWUgPSBTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKG5hbWUpOwotCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQobmFtZSk7Ci0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY3JlYXRlUHJvY2Vzc190ZXh0LCAvLyROT04tTkxTLTEkCi0JCQkJCW1zZyk7Ci0JCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCWN0cmxfbmFtZS5zZWxlY3RBbGwoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25maWdDb21ib1ZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGVkLmlzRW1wdHkoKSkgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY3JlYXRlUHJvY2Vzc190ZXh0LCAvLyROT04tTkxTLTEkCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLm5vRGVmYXVsdENvbmZpZ0Vycm9yX21zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCW5ld1Byb2NDb21wLnNldE5hbWUobmFtZSk7Ci0JCW5ld1Byb2NDb21wLmdldFByb2Nlc3MoKS5zZXROYW1lKG5hbWUpOwotCQluZXdQcm9jQ29tcC5nZXRQcm9jZXNzKCkuc2V0UHJlc2VudGF0aW9uTmFtZShuYW1lKTsKLQkJbmV3UHJvY0NvbXAuZ2V0UHJvY2VzcygpLnNldERlZmF1bHRDb250ZXh0KAotCQkJCShNZXRob2RDb25maWd1cmF0aW9uKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25maWdDb21ib1ZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCWlmIChuZXdQcm9jQ29tcC5nZXRQcm9jZXNzKCkgaW5zdGFuY2VvZiBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSkgewotCQkJUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgcHJvY1BsYW5uaW5nVGVtcGwgPSAoUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpIG5ld1Byb2NDb21wCi0JCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQlwcm9jUGxhbm5pbmdUZW1wbC5nZXRCYXNlZE9uUHJvY2Vzc2VzKCkuYWRkQWxsKAotCQkJCQlBcnJheXMuYXNMaXN0KHByb2Nlc3NUYWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSkpOwotCQl9Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1Byb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjc5ZTBlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogVGhpcyBqYXZhIGZpbGUgZXh0ZW5kcyBqZmFjZSBMaXN0U2VsZWN0aW9uRGlhbG9nIGFuZCByZW1vdmUgY2FuY2VsIGJ1dHRvbgotICogZnJvbSBkaWFsb2cKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIExpc3RTZWxlY3Rpb25EaWFsb2cgewotCi0JcHVibGljIFByb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3QgaW5wdXQsCi0gICAgICAgICAgICBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0gICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBTdHJpbmcgbWVzc2FnZSkKLQl7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBpbnB1dCwgY29udGVudFByb3ZpZGVyLCBsYWJlbFByb3ZpZGVyLCBtZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1JlZmVyZW5jZVNlbGVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1JlZmVyZW5jZVNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhODJlNmI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9SZWZlcmVuY2VTZWxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBVSSBEaWFsb2cgY2xhc3Mgd2hpY2ggd2lsbCBnaXZlIHVzZXIgdG8gc2VsZWN0IHJlZmVyZW5jZXMgdG8gYmUgZGVsZXRlZAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlU2VsZWN0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gZ2V0UmVmZXJlbmNlcyhMaXN0IHJlZiwgRGVzY3JpcHRvciBkZXNjKSB7Ci0JCXJldHVybiBnZXRSZWZlcmVuY2VzKHJlZiwgTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfcmVmX2RlbGV0ZSwKLQkJCQlkZXNjLmdldE5hbWUoKSkpOwotCX0KLQotCS8qKgotCSAqIFNob3dzIGRpYWxvZyBib3ggZm9yIGFsbCByZWZlcmVuY2VzIHRvIGJlIGRlbGV0ZWQgZm9yIHRoZSBnaXZlbgotCSAqIGRlc2NyaXB0b3IuIFRoZXNlIHJlZmVyZW5jZXMgYXJlIG5vdCBiZWluZyB1c2VkIGFueXdoZXJlIGVsc2UuCi0JICogCi0JICogQHBhcmFtIHJlZgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGdldFJlZmVyZW5jZXMoTGlzdCByZWYpIHsKLQotCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX3JlZl9kZWxldGUyOwotCQl0cnkgewotCQkJcmV0dXJuIGdldFJlZmVyZW5jZXMocmVmLCBtZXNzYWdlKTsKLQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJdCBzaG93cyBzZWxlY3Rpb24gZGlhbG9nIGJveCB3aXRoIGxpc3Qgb2YgcmVmZXJlbmNlICg8Y29kZT5yZWY8L2NvZGU+KQotCSAqIGZvciB1c2VyIHRvIHNlbGVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmCi0JICogQHJldHVybgotCSAqIEBleGNlcHRpb24gT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB1c2VyIGNhbmNlbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRSZWZlcmVuY2VzKExpc3QgcmVmLCBTdHJpbmcgbXNnKQotCQkJdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3Ci0JCS8vIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkvLyAuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJLy8gcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gcmV0dXJuICgoTGlzdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCS8vIH0KLQkJLy8gfTsKLQkJLy8gSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCS8vIC5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCS8vCi0JCS8vIHRyeSB7Ci0JCS8vIFByb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldwotCQkvLyBQcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZyhQbGF0Zm9ybVVJCi0JCS8vIC5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCByZWYsCi0JCS8vIGNvbnRlbnRQcm92aWRlciwgbGFiZWxQcm92aWRlciwgbXNnKTsKLQkJLy8KLQkJLy8gZGxnLnNldFRpdGxlKExpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX3JlZmVyZW5jZXMpOyAvLyROT04tTkxTLTEkCi0JCS8vIGRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJLy8gaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkgewotCQkvLyB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJLy8gfQotCQkvLyBPYmplY3Qgb2Jqc1tdID0gZGxnLmdldFJlc3VsdCgpOwotCQkvLyByZXR1cm4gb2JqczsKLQkJLy8gfSBmaW5hbGx5IHsKLQkJLy8gY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJLy8gbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCS8vIH0KLQotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCWlmICh1aUhhbmRsZXIgIT0gbnVsbCkgewotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX3JlZmVyZW5jZXM7Ci0JCQl0cnkgewotCQkJCUxpc3Qgc2VsZWN0ZWQgPSB1aUhhbmRsZXIuc2VsZWN0KHJlZiwgbGFiZWxQcm92aWRlciwgdHJ1ZSwgcmVmLAotCQkJCQkJdGl0bGUsIG1zZyk7Ci0JCQkJaWYgKHNlbGVjdGVkID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCXJldHVybiBzZWxlY3RlZC50b0FycmF5KCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJLy8gbm8gdXNlciBpbnRlcmFjdGlvbiBoYW5kbGVyIGF2YWlsYWJsZQotCQkvLyByZXR1cm4gdGhlIGVudGlyZSByZWZlcmVuY2UgbGlzdAotCQkvLwotCQlyZXR1cm4gcmVmLnRvQXJyYXkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvVGVhbVNlbGVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1RlYW1TZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjJiOTAzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvVGVhbVNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBVSSBEaWFsb2cgY2xhc3Mgd2hpY2ggd2lsbCBhc2sgdXNlciB0byBhc3NpZ24gYSByb2xlIHRvIHRlYW0gYXV0b21hdGljYWxseS4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRlYW1TZWxlY3Rpb24gewotCi0JLyoqCi0JICogSXQgc2hvd3MgZGlhbG9nIGJveCBhbGwgdGVhbXMuIFJldHVybnMgdGVhbSB1c2VyIHNlbGVjdGVkCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZWFtUHJvZmlsZSBnZXRTZWxlY3RlZFRlYW0oTGlzdCB0ZWFtTGlzdCwgUm9sZSByb2xlLCBTaGVsbCBzaGVsbCkgewotLy8JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotLy8JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotLy8JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotLy8JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0vLwkJCQkJcmV0dXJuICgoVGVhbVByb2ZpbGUpIG9iaikuZ2V0TmFtZSgpOwotLy8JCQkJfQotLy8JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0vLwkJCX0KLS8vCQl9OwotLy8JCWlmKHNoZWxsID09IG51bGwpIHsKLS8vCQkJdHJ5IHsKLS8vCQkJCXNoZWxsID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOyAvL01zZ0JveC5nZXREZWZhdWx0U2hlbGwoKTsKLS8vCQkJfQotLy8JCQljYXRjaChFeGNlcHRpb24gZSkgewotLy8JCQkJCi0vLwkJCX0KLS8vCQl9Ci0vLwkJRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nKHNoZWxsLCBsYWJlbFByb3ZpZGVyKTsKLS8vCi0vLwkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotLy8JCWRsZy5zZXRFbGVtZW50cyh0ZWFtTGlzdC50b0FycmF5KCkpOwotLy8JCWRsZy5zZXRNdWx0aXBsZVNlbGVjdGlvbihmYWxzZSk7Ci0vLwkJZGxnCi0vLwkJCQkuc2V0TWVzc2FnZShOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5zZWxlY3RUZWFtc0RpYWxvZ190ZXh0LCAobmV3IE9iamVjdFtdIHsgcm9sZS5nZXROYW1lKCkgfSkpKTsgCi0vLwkJZGxnLnNldFRpdGxlKExpYnJhcnlFZGl0UmVzb3VyY2VzLnNlbGVjdFRlYW1zRGlhbG9nX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotLy8JCWRsZy5zZXRGaWx0ZXIobnVsbCk7Ci0vLwkJZGxnLm9wZW4oKTsKLS8vCQlPYmplY3Qgb2JqID0gZGxnLmdldEZpcnN0UmVzdWx0KCk7Ci0vLwkJLy8gZGlzcG9zZQotLy8JCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotLy8JCXJldHVybiAoVGVhbVByb2ZpbGUpIG9iajsKLQkJCi0JCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIKLQkJCQkuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJaWYgKHVpSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5zZWxlY3RUZWFtc0RpYWxvZ190aXRsZTsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5zZWxlY3RUZWFtc0RpYWxvZ190ZXh0LCAobmV3IE9iamVjdFtdIHsgcm9sZS5nZXROYW1lKCkgfSkpOwotCQkJdHJ5IHsKLQkJCQlMaXN0IHNlbGVjdGVkID0gdWlIYW5kbGVyLnNlbGVjdCh0ZWFtTGlzdCwgbGFiZWxQcm92aWRlciwgZmFsc2UsCi0JCQkJCQl0ZWFtTGlzdCwgdGl0bGUsIG1zZyk7Ci0JCQkJaWYgKHNlbGVjdGVkID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCWlmKHNlbGVjdGVkLmlzRW1wdHkoKSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIChUZWFtUHJvZmlsZSkgc2VsZWN0ZWQuZ2V0KDApOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBubyB1c2VyIGludGVyYWN0aW9uIGhhbmRsZXIgYXZhaWxhYmxlCi0JCS8vIHJldHVybiBudWxsCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1VzZXJJbnRlcmFjdGlvbkhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1VzZXJJbnRlcmFjdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MDRmNDM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9Vc2VySW50ZXJhY3Rpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSUlucHV0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSW5wdXREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLldvcmtiZW5jaEpvYjsKLQotLyoqCi0gKiBEZWZpbmVzIHN0YXRpYyBtZXRob2RzIHRoYXQgaW50ZXJhY3Qgd2l0aCB1c2VyIHZpYSBkaWFsb2cgYm94ZXMgdG8gcmV0cmlldmUKLSAqIG1vcmUgaW5mb3JtYXRpb24gb3IgY29uZmlybWF0aW9uIGZyb20gdGhlIHVzZXJzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVzZXJJbnRlcmFjdGlvbkhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBjYW5JbnRlcmFjdCA9IHRydWU7Ci0KLQlwcml2YXRlIFVzZXJJbnRlcmFjdGlvbkhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuSW50ZXJhY3QoKSB7Ci0JCXJldHVybiBjYW5JbnRlcmFjdDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgYWdhaW5zdCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIGdpdmVuIHByb2Nlc3Mgd2hldGhlciB0aGUKLQkgKiBnaXZlbiAobWV0aG9kKSBvYmplY3QgY2FuIGJlIHVzZWQgaW4gdGhlIHByb2Nlc3MuIFRoaXMgbWV0aG9kIHdpbGwgcHJvbXB0Ci0JICogdXNlciB0byBhZGQgdGhlIG9iamVjdCBhbmQgdGhvc2UgZWxlbWVudHMgdGhhdCBpdCBpcyBhc3NvY2lhdGVkIHdpdGggdG8KLQkgKiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgaGF2ZSB0aGVtCi0JICogeWV0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9jCi0JICogICAgICAgICAgICB0aGUgcHJvY2VzcwotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2Qgb2JqZWN0Ci0JICogQHJldHVybgotCSAqICAgICAgICAgICAgPGxpPjEgaWYgdGhlIHByb2Nlc3MnZXMgZGVmYXVsdCBjb25maWd1cmF0aW9uIGFscmVhZHkgaGFzIHRoZQotCSAqICAgICAgICAgICAgb2JqZWN0Ci0JICogICAgICAgICAgICA8bGk+MiBpZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbiwgYnV0IHVzZXIKLQkgKiAgICAgICAgICAgIHdhbnRzIHRvIGFkZCBpdCBub3cKLQkgKiAgICAgICAgICAgIDxsaT4wIGlmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZSBjb25maWd1cmF0aW9uIGFuZCB1c2VyCi0JICogICAgICAgICAgICBkb24ndCB3YW50IHRvIGFkZCBpdAotCSAqICAgICAgICAgICAgPGxpPi0xIGlmIHVzZXIgY2FuY2VsIHRoZSBwcm9tcHQgdG8gYWRkIHRoZSBvYmplY3RzIGFuZAotCSAqICAgICAgICAgICAgYXNzb2NpYXRlZCBkZXBlbmRlbmNpZXMgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNoZWNrQWdhaW5zdERlZmF1bHRDb25maWd1cmF0aW9uKFByb2Nlc3MgcHJvYywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGNoZWNrQWdhaW5zdERlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIG9iamVjdCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGFnYWluc3QgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSBnaXZlbiBwcm9jZXNzIHdoZXRoZXIgdGhlCi0JICogZ2l2ZW4gKG1ldGhvZCkgb2JqZWN0IGNhbiBiZSB1c2VkIGluIHRoZSBwcm9jZXNzLiBUaGlzIG1ldGhvZCB3aWxsIHByb21wdAotCSAqIHVzZXIgdG8gYWRkIHRoZSBvYmplY3QgYW5kIHRob3NlIGVsZW1lbnRzIHRoYXQgaXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRvCi0JICogdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGRvZXMgbm90IGhhdmUgdGhlbQotCSAqIHlldC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYwotCSAqICAgICAgICAgICAgdGhlIHByb2Nlc3MKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgbWV0aG9kIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKiAgICAgICAgICAgIDxsaT4xIGlmIHRoZSBwcm9jZXNzJ2VzIGRlZmF1bHQgY29uZmlndXJhdGlvbiBhbHJlYWR5IGhhcyB0aGUKLQkgKiAgICAgICAgICAgIG9iamVjdAotCSAqICAgICAgICAgICAgPGxpPjIgaWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGJ1dCB1c2VyCi0JICogICAgICAgICAgICB3YW50cyB0byBhZGQgaXQgbm93Ci0JICogICAgICAgICAgICA8bGk+MCBpZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgdXNlcgotCSAqICAgICAgICAgICAgZG9uJ3Qgd2FudCB0byBhZGQgaXQKLQkgKiAgICAgICAgICAgIDxsaT4tMSBpZiB1c2VyIGNhbmNlbCB0aGUgcHJvbXB0IHRvIGFkZCB0aGUgb2JqZWN0cyBhbmQKLQkgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgZGVwZW5kZW5jaWVzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjaGVja0FnYWluc3REZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsCi0JCQlPYmplY3Qgb2JqZWN0LCBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCWlmICghKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkKLQkJCXJldHVybiAwOwotCi0JCWlmIChjb25maWd1cmF0b3IgPT0gbnVsbCkKLQkJCWNvbmZpZ3VyYXRvciA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0b3JGYWN0b3J5KCkKLQkJCQkJLmNyZWF0ZUNvbmZpZ3VyYXRvcihwcm9jLmdldERlZmF1bHRDb250ZXh0KCkpOwotCQlpZiAoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJLy8gY2hlY2sgYWxsIHRoZSBiYXNlIGVsZW1lbnRzIGlmIHRoZXJlIGlzIGFueQotCQkJLy8KLQkJCWJvb2xlYW4gYWxsSW4gPSB0cnVlOwotCQkJZm9yIChWYXJpYWJpbGl0eUVsZW1lbnQgYyA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QpOyBjICE9IG51bGw7IGMgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBjCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQlpZiAoIWNvbmZpZ3VyYXRvci5hY2NlcHQoYykpIHsKLQkJCQkJYWxsSW4gPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFsbEluKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbmZpZ3VyYXRvci5hY2NlcHQoZSkpCi0JCQlyZXR1cm4gMTsKLQotCQkvLyBvYmplY3QgaXMgbm90IGluIHRoZSBjb25maWd1cmF0aW9uCi0JCS8vIGFzayB1c2VyIGlmIGhlL3NoZSB3YW50IHRvIGFkZCBpdCB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JCS8vCi0JCVN0cmluZyBtc2cgPSBOTFMKLQkJCQkuYmluZCgKLQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2ssCi0JCQkJCQkoKE1ldGhvZEVsZW1lbnQpIGUpLmdldE5hbWUoKSk7Ci0KLQkJaW50IHJldCA9IE1zZ0JveC5wcm9tcHQobXNnKTsKLQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIlVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja0FnYWluc3REZWZhdWx0Q29uZmlndXJhdGlvbigpOiBlbGVtZW50PSIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgZSArICIsIHBhdGg9IiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzd2l0Y2ggKHJldCkgewotCQljYXNlIFNXVC5ZRVM6Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKSwgbnVsbCk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCXJldHVybiAyOwotCQljYXNlIFNXVC5OTzoKLQkJCXJldHVybiAwOwotCQljYXNlIFNXVC5DQU5DRUw6Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQkvLyBXcmFwcGVkTWVzc2FnZURpYWxvZyBtc2dCb3ggPSBuZXcKLQkJLy8gV3JhcHBlZE1lc3NhZ2VEaWFsb2coTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLCBudWxsLCBudWxsLCBtc2csCi0JCS8vIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sCi0JCS8vIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLAotCQkvLyBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9LAotCQkvLyAwKTsKLQkJLy8gc3dpdGNoIChtc2dCb3gub3BlbigpKSB7Ci0JCS8vIGNhc2UgSURpYWxvZ0NvbnN0YW50cy5PS19JRDoKLQkJLy8gSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChwcm9jLmdldERlZmF1bHRDb250ZXh0KCksIG51bGwpOwotCQkvLyBpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJLy8gcmV0dXJuIDA7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIDI7Ci0JCS8vIGNhc2UgSURpYWxvZ0NvbnN0YW50cy5OT19JRDoKLQkJLy8gcmV0dXJuIDA7Ci0JCS8vIGNhc2UgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQ6Ci0JCS8vIHJldHVybiAtMTsKLQkJLy8gfTsKLQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgdGFza3Mgd2hpY2ggaGFzIGdpdmVuIHdvcmtwcm9kdWN0IGFzIG91dHB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFza0xpc3QKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IHNlbGVjdFRhc2tzKExpc3QgdGFza0xpc3QsIFdvcmtQcm9kdWN0IHdwKSB7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqLCBpbnQgY29sdW1uKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShvYmopOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOwotCQkJfQotCQl9OwotCi0JCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKExpc3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlQcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwKLQkJCQkJdGFza0xpc3QsCi0JCQkJCWNvbnRlbnRQcm92aWRlciwKLQkJCQkJbGFiZWxQcm92aWRlciwKLQkJCQkJTkxTCi0JCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd3BsaXN0ZGxnX21zZywKLQkJCQkJCQkJCXdwLmdldE5hbWUoKSkpOwotCi0JCQlkbGcuc2V0VGl0bGUoTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfVXNlckludGVyYWN0aW9uSGVscGVyX3Rhc2tzKTsKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5vcGVuKCk7Ci0JCQlPYmplY3RbXSBvYmpzID0gZGxnLmdldFJlc3VsdCgpOwotCi0JCQlMaXN0IHNlbGVjdGVkVGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoKG9ianMgIT0gbnVsbCkgJiYgKG9ianMubGVuZ3RoID4gMCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHsKLQkJCQkJc2VsZWN0ZWRUYXNrcy5hZGQob2Jqc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHNlbGVjdGVkVGFza3M7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBkaXNwb3NlCi0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgcmVzcG9uc2libGUgd29yayBwcm9kdWN0cyBmb3IgdGhlIGdpdmVuIHJvbGUKLQkgKiAKLQkgKiBAcGFyYW0gd3BMaXN0Ci0JICogQHBhcmFtIHJvbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IHNlbGVjdFdvcmtQcm9kdWN0cyhMaXN0IHdwTGlzdCwgUm9sZSByb2xlKSB7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqLCBpbnQgY29sdW1uKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShvYmopOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOwotCQkJfQotCQl9OwotCi0JCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKExpc3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlQcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwKLQkJCQkJLy8gTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLAotCQkJCQl3cExpc3QsCi0JCQkJCWNvbnRlbnRQcm92aWRlciwKLQkJCQkJbGFiZWxQcm92aWRlciwKLQkJCQkJTkxTCi0JCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfcm9sZWxpc3RkbGdfbXNnLAotCQkJCQkJCQkJcm9sZS5nZXROYW1lKCkpKTsKLQotCQkJZGxnCi0JCQkJCS5zZXRUaXRsZShMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd29ya3Byb2R1Y3RzKTsgLy8kTk9OLU5MUy0xJAotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLm9wZW4oKTsKLQkJCU9iamVjdFtdIG9ianMgPSBkbGcuZ2V0UmVzdWx0KCk7Ci0KLQkJCUxpc3Qgc2VsZWN0ZWRXcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoKG9ianMgIT0gbnVsbCkgJiYgKG9ianMubGVuZ3RoID4gMCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHsKLQkJCQkJc2VsZWN0ZWRXcHMuYWRkKG9ianNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzZWxlY3RlZFdwczsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIGRpc3Bvc2UKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcXVlc3RzIG5hbWUgZnJvbSB1c2VyCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBuYW1lRmVhdHVyZQotCSAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBuYW1lIG9mIG51bGwgaWYgdXNlciBjYW5jZWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcXVlc3ROYW1lKE9iamVjdCBjaGlsZCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBuYW1lRmVhdHVyZSwgU3RyaW5nIHRpdGxlLAotCQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJSUlucHV0VmFsaWRhdG9yIGlucHV0VmFsaWRhdG9yID0gbmV3IElJbnB1dFZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBnZXRTaW1wbGVFcnJvck1lc3NhZ2UodmFsaWRhdG9yLmlzVmFsaWQobmV3VGV4dCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQl9OwotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBjaGlsZDsKLQkJCVN0cmluZyBzdHIgPSAoU3RyaW5nKSBlLmVHZXQobmFtZUZlYXR1cmUpOwotCQkJaWYgKHN0ciAhPSBudWxsKSB7Ci0JCQkJbmFtZSA9IHN0cjsKLQkJCX0KLQkJfQotCQlJbnB1dERpYWxvZyBpbnB1dERpYWxvZyA9IG5ldyBJbnB1dERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCB0aXRsZSwKLQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZSwKLQkJCQluYW1lLCBpbnB1dFZhbGlkYXRvcik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlucHV0RGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiBpbnB1dERpYWxvZy5nZXRWYWx1ZSgpLnRyaW0oKTsJCQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNpbXBsZUVycm9yTWVzc2FnZShTdHJpbmcgbXNnKSB7Ci0JCWlmIChtc2cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBzID0gbXNnLmluZGV4T2YoJzonKTsKLQotCQlTdHJpbmcgcHJlZml4ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHMgPj0gMCkgewotCQkJcHJlZml4ID0gbXNnLnN1YnN0cmluZygwLCBzKTsKLQotCQkJU3RyaW5nIGVtcHR5RWxlbWVudE5hbWVFcnJvck1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBkdXBDb250ZW50RmlsZUVycm9yTXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBkdXBFbGVtZW50TmFtZUVycm9yTXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGVtcHR5RWxlbWVudE5hbWVFcnJvck1zZyAhPSBudWxsCi0JCQkJCSYmIGVtcHR5RWxlbWVudE5hbWVFcnJvck1zZy5zdGFydHNXaXRoKHByZWZpeCkpCi0JCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLmVtcHR5RWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnOyAvLyROT04tTkxTLTEkCi0JCQllbHNlIGlmIChkdXBDb250ZW50RmlsZUVycm9yTXNnICE9IG51bGwKLQkJCQkJJiYgZHVwQ29udGVudEZpbGVFcnJvck1zZy5zdGFydHNXaXRoKHByZWZpeCkpCi0JCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3Jfc2ltcGxlX21zZzsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoZHVwRWxlbWVudE5hbWVFcnJvck1zZyAhPSBudWxsCi0JCQkJCSYmIGR1cEVsZW1lbnROYW1lRXJyb3JNc2cuc3RhcnRzV2l0aChwcmVmaXgpKQotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChzIDwgMCkKLQkJCXMgPSAwOwotCQllbHNlCi0JCQlzKys7Ci0JCWludCB0ID0gbXNnLmluZGV4T2YoJ1xuJyk7Ci0JCWlmICh0IDwgMCkKLQkJCXQgPSBtc2cubGVuZ3RoKCk7Ci0KLQkJcmV0dXJuIG1zZy5zdWJzdHJpbmcocywgdCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0ZWFtIGluIHdoaWNoIHVzZXIgd291bGQgYXV0b21hdGljYWxseSBhc3NpZ24gYSByb2xlIGludG8KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gcm9sZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlYW1Qcm9maWxlIGdldFRlYW0oQWN0aXZpdHkgYWN0aXZpdHksIFJvbGUgcm9sZSkgewotCQlyZXR1cm4gZ2V0VGVhbShhY3Rpdml0eSwgcm9sZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZWFtUHJvZmlsZSBnZXRUZWFtKEFjdGl2aXR5IGFjdGl2aXR5LCBSb2xlIHJvbGUsCi0JCQlPYmplY3QgVUlDb250ZXh0KSB7Ci0JCUxpc3QgdGVhbUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJLy8gZmluZCBvdXQgYWxsIHRlYW0gaW4gdmlzaWJsZSBzY29wZQotCQlnZXRUZWFtc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIGFjdGl2aXR5LCByb2xlLCB0ZWFtTGlzdCk7Ci0JCWlmICh0ZWFtTGlzdC5zaXplKCkgPT0gMSkgewotCQkJcmV0dXJuIChUZWFtUHJvZmlsZSkgdGVhbUxpc3QuZ2V0KDApOwotCQl9Ci0JCWlmICh0ZWFtTGlzdC5zaXplKCkgPiAxKSB7Ci0JCQlyZXR1cm4gVGVhbVNlbGVjdGlvbi5nZXRTZWxlY3RlZFRlYW0odGVhbUxpc3QsIHJvbGUsCi0JCQkJCVVJQ29udGV4dCBpbnN0YW5jZW9mIFNoZWxsID8gKFNoZWxsKSBVSUNvbnRleHQgOiBudWxsKTsKLQkJfQotCQkvLyB0aGVyZSBhcmUgbm8gdGVhbXMgdG8gYXNzaWduCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0ZWFtcyBpbiBzY29wZQotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIHJvbGUKLQkgKiBAcGFyYW0gdGVhbUxpc3QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldFRlYW1zSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSwgUm9sZSByb2xlLCBMaXN0IHRlYW1MaXN0KSB7Ci0JCS8vIGdldCBjaGlsZHJlbiBmb3IgYWN0aXZpdHkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGUsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBpdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oZSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgb2JqOwotCQkJCUxpc3QgYWxsVGVhbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJLy8gZ2V0IGFsbCBzdWIgdGVhbXMgYXMgd2VsbAotCQkJCVByb2Nlc3NVdGlsLmdldEFsbFN1YlRlYW1zKHRlYW0sIGFsbFRlYW1zKTsKLQotCQkJCWZvciAoSXRlcmF0b3IgdGVhbUl0b3IgPSBhbGxUZWFtcy5pdGVyYXRvcigpOyB0ZWFtSXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG8gPSB0ZWFtSXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQkJCS8vIGdldCByb2xlcyBmcm9tIHRlYW1zCi0JCQkJCQlMaXN0IHJvbGVzID0gUHJvY2Vzc1V0aWwuZ2V0Um9sZXMoKChUZWFtUHJvZmlsZSkgbykKLQkJCQkJCQkJLmdldFRlYW1Sb2xlcygpKTsKLQkJCQkJCWlmIChyb2xlcy5jb250YWlucyhyb2xlKSkgewotCQkJCQkJCXRlYW1MaXN0LmFkZChvKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGdldCBwYXJlbnQKLQkJT2JqZWN0IGN1cnJlbnRQYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KGUpOwotCQlpZiAoY3VycmVudFBhcmVudCAhPSBudWxsKSB7Ci0JCQkvLyBnbyB1cAotCQkJZ2V0VGVhbXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQnJlYWtkb3duRWxlbWVudCkgY3VycmVudFBhcmVudCwKLQkJCQkJcm9sZSwgdGVhbUxpc3QpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVJ1bm5hYmxlQ29udGV4dCBnZXRSdW5uYWJsZUNvbnRleHQoKSB7Ci0JCXJldHVybiBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCkKLQkJCQkuZ2V0UnVubmFibGVDb250ZXh0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHJ1bldpdGhQcm9ncmVzcyhmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSwKLQkJCWZpbmFsIFN0cmluZyBtc2cpIHsKLQkJZmluYWwgTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLk9LLAotCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhtc2csIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlTdHJpbmcgbXNnOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1lc3NhZ2VFeGNlcHRpb24pIHsKLQkJCQkJCW1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nV3JpdGVyIHN0cldyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdHJXcml0ZXIpKTsKLQkJCQkJCW1zZyA9IHN0cldyaXRlci50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLCAwLAotCQkJCQkJCW1zZywgZSkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCXRyeSB7Ci0JCQkvLyBUaGlzIHJ1bnMgdGhlIG9wZXJhdGlvbiwgYW5kIHNob3dzIHByb2dyZXNzLgotCQkJLy8KLQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlnZXRSdW5uYWJsZUNvbnRleHQoKS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQl9IGVsc2UgewotCQkJCWdldFJ1bm5hYmxlQ29udGV4dCgpLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsKLQkJCX0KLQotCQkJCi0KLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JfbXNnV2l0aERldGFpbHMsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXN0YXR1cyk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZyB0aGF0IHNob3VsZG4ndC4KLQkJCS8vCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXhjZXB0aW9uKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzKAotCQkJZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLCBmaW5hbCBTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIGZhbHNlLCBtc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MoCi0JCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIGZpbmFsIGJvb2xlYW4gY2FuQ2FuY2VsLAotCQkJZmluYWwgU3RyaW5nIG1zZykgewotCQlyZXR1cm4gcnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBnZXRSdW5uYWJsZUNvbnRleHQoKSwgY2FuQ2FuY2VsLCBtc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVN0YXR1cyBydW5Bc0pvYihJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlTdHJpbmcgdGFza05hbWUpIHsKLQkJU2hlbGwgc2hlbGwgPSBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCk7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJ1bm5hYmxlLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkKLQkJCQkJCS5nZXRJZCgpLCAwLCBlLnRvU3RyaW5nKCksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIHJ1bkFzSm9iKHJ1bm5hYmxlLCB0YXNrTmFtZSwgc2hlbGwpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJU3RhdHVzIHJ1bkFzSm9iKGZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwKLQkJCWZpbmFsIFN0cmluZyB0YXNrTmFtZSwgU2hlbGwgc2hlbGwpIHsKLQkJSm9iIGpvYiA9IG5ldyBXb3Jrc3BhY2VKb2IodGFza05hbWUpIHsKLQotCQkJcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gbW9uaXRvci5iZWdpblRhc2sodGFza05hbWUsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0JCQkJCXJ1bm5hYmxlLnJ1bihtb25pdG9yKTsKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRocm93YWJsZSBleDsKLQkJCQkJaWYgKGUuZ2V0Q2F1c2UoKSAhPSBudWxsKSB7Ci0JCQkJCQlleCA9IGUuZ2V0Q2F1c2UoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWV4ID0gZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbgotCQkJCQkJCS5nZXRQbHVnaW4oKS5nZXRJZCgpLCAwLCBleC50b1N0cmluZygpLCBleCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbgotCQkJCQkJCS5nZXRQbHVnaW4oKS5nZXRJZCgpLCAwLCBlLnRvU3RyaW5nKCksIGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnNob3dJbkRpYWxvZyhzaGVsbCwgam9iKTsKLQkJam9iLnNjaGVkdWxlKCk7Ci0JCXJldHVybiBqb2IuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bkluVUkoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLAotCQkJZmluYWwgU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCVNoZWxsIHNoZWxsID0gTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlydW5uYWJsZS5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJSm9iIGpvYiA9IG5ldyBXb3JrYmVuY2hKb2IodGFza05hbWUpIHsKLQotCQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCXJ1bm5hYmxlLnJ1bihtb25pdG9yKTsKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRocm93YWJsZSBleDsKLQkJCQkJaWYgKGUuZ2V0Q2F1c2UoKSAhPSBudWxsKSB7Ci0JCQkJCQlleCA9IGUuZ2V0Q2F1c2UoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWV4ID0gZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbgotCQkJCQkJCS5nZXRQbHVnaW4oKS5nZXRJZCgpLCAwLCBleC50b1N0cmluZygpLCBleCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbgotCQkJCQkJCS5nZXRQbHVnaW4oKS5nZXRJZCgpLCAwLCBlLnRvU3RyaW5nKCksIGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnNob3dJbkRpYWxvZyhzaGVsbCwgam9iKTsKLQkJam9iLnNjaGVkdWxlKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBydW5JblVJVGhyZWFkKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCXJ1bkluVUlUaHJlYWQocnVubmFibGUsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHJ1bkluVUlUaHJlYWQoUnVubmFibGUgcnVubmFibGUsIGJvb2xlYW4gYXN5bmMpIHsKLQkJaWYoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkvLwotCQkJRGlzcGxheSBkaXNwbGF5ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkKLQkJCX0KLQkJCWlmKGRpc3BsYXkgIT0gbnVsbCkgewotCQkJCWlmKGFzeW5jKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRpc3BsYXkuc3luY0V4ZWMocnVubmFibGUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJcnVubmFibGUucnVuKCk7Ci0JCX0KLQkJCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHJ1bkluVUkoZmluYWwgUnVubmFibGUgcnVubmFibGUsCi0JCQlmaW5hbCBTdHJpbmcgdGFza05hbWUpIHsKLQkJcmV0dXJuIHJ1bkluVUkocnVubmFibGUsIHRhc2tOYW1lLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcnVuSW5VSShmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSwKLQkJCWZpbmFsIFN0cmluZyB0YXNrTmFtZSwgSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJU2hlbGwgc2hlbGwgPSBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCk7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQlydW5uYWJsZS5ydW4oKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5lciA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1vbml0b3IuYmVnaW5UYXNrKHRhc2tOYW1lLCAyKTsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJcnVubmFibGUucnVuKCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfTsKLQkJCXJldHVybiBydW5JblVJKHJ1bm5lciwgcnVsZSwgc2hlbGwpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHJ1bkluVUkoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLAotCQkJU2hlbGwgc2hlbGwpIHsKLQkJcmV0dXJuIHJ1bkluVUkocnVubmFibGUsIG51bGwsIHNoZWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcnVuSW5VSShJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSwgU2hlbGwgc2hlbGwpIHsKLQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCXNoZWxsID0gTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCQl9Ci0JCUlSdW5uYWJsZUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpOwotCQl0cnkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW5JblVJKGNvbnRleHQsCi0JCQkJCXJ1bm5hYmxlLCBydWxlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGU7Ci0JCQlFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCkuZ2V0TWVzc2VuZ2VyKCkKLQkJCQkuc2hvd0Vycm9yKHRpdGxlLCBlLnRvU3RyaW5nKCksIG51bGwsIGUpOwotLy8JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLAotLy8JCQkJCWUudG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MoCi0JCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlmaW5hbCBJUnVubmFibGVDb250ZXh0IHJ1bm5hYmxlQ29udGV4dCwgZmluYWwgYm9vbGVhbiBjYW5DYW5jZWwsCi0JCQlmaW5hbCBTdHJpbmcgbXNnKSB7Ci0JCWZpbmFsIE11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5PSywKLQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvcl9yZWFzb24sIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2sobXNnLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCQkJCW1vbml0b3Iuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQlydW5uYWJsZS5ydW4obW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN0cmluZyBtc2c7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgTWVzc2FnZUV4Y2VwdGlvbikgewotCQkJCQkJbXNnID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmdXcml0ZXIgc3RyV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN0cldyaXRlcikpOwotCQkJCQkJbXNnID0gc3RyV3JpdGVyLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIDAsCi0JCQkJCQkJbXNnLCBlKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0KLQkJdHJ5IHsKLQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlydW5uYWJsZUNvbnRleHQucnVuKHRydWUsIGNhbkNhbmNlbCwgb3BlcmF0aW9uKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJcnVubmFibGVDb250ZXh0LnJ1bih0cnVlLCBjYW5DYW5jZWwsIG9wZXJhdGlvbik7Ci0JCQl9Ci0KLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCUV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKQotCQkJCQkJLmdldE1lc3NlbmdlcigpLnNob3dFcnJvcigKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yX21zZ1dpdGhEZXRhaWxzLAotCQkJCQkJCQlzdGF0dXMpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgdGhhdCBzaG91bGRuJ3QuCi0JCQkvLwotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4Y2VwdGlvbik7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIERlbGl2ZXJhYmxlIGluIHdoaWNoIHVzZXIgd291bGQgYXV0b21hdGljYWxseSBhc3NpZ24gYSB3cCBpbnRvCi0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIHdwCi0JICogQHJldHVybgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGdldERlbGl2ZXJhYmxlKEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJV29ya1Byb2R1Y3Qgd3ApIHsKLQotCQkvLyBQTEVBRSBET04nVCBDTEVBTiBVUAotCQkvLyBjb21tZW50ZWQgb3V0IGZvciBub3cgc2luY2Ugd2Ugc2h1dC1vZmYgYXV0b21hdGljIGFzc2lnbm1lbnQKLQkJLy8gb2YgZGVsaXZlcmFibGUgZm9yIG5vdwotCQkvLyBMaXN0IGRlbGl2ZXJhYmxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkvLyAuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJLy8gLy8gZmluZCBvdXQgYWxsIGRlbGl2ZXJhYmxlcyBpbiB2aXNpYmxlIHNjb3BlCi0JCS8vIGdldERlbGl2ZXJhYmxlc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIGFjdGl2aXR5LCB3cCwKLQkJLy8gZGVsaXZlcmFibGVMaXN0KTsKLQkJLy8gaWYgKGRlbGl2ZXJhYmxlTGlzdC5zaXplKCkgPT0gMSkgewotCQkvLyByZXR1cm4gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVsaXZlcmFibGVMaXN0LmdldCgwKTsKLQkJLy8gfQotCQkvLyBpZiAoZGVsaXZlcmFibGVMaXN0LnNpemUoKSA+IDEpIHsKLQkJLy8gcmV0dXJuIERlbGl2ZXJhYmxlU2VsZWN0aW9uLmdldFNlbGVjdGVkRGVsaXZlcmFibGUoZGVsaXZlcmFibGVMaXN0LAotCQkvLyB3cCk7Ci0JCS8vIH0KLQkJLy8gdGhlcmUgYXJlIG5vIGRlbGl2ZXJhYmxlIHRvIGFzc2lnbgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBQTEVBU0UgRE9OJ1QgQ0xFQU4gVVAuIFRoaXMgbWV0aG9kIGlzIGN1cnJlbnRseSBub3QgdXNlZCBzaW5jZSB3ZQotCSAqIHNodXQtb2ZmIGF1dG9tYXRpYyBhc3NpZ25tZW50IG9mIGRlbGl2ZXJhYmxlLiBHZXQgZGVsaXZlcmFibGUgaW4gc2NvcGUKLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAcGFyYW0gZGVsaXZlcmFibGVMaXN0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXREZWxpdmVyYWJsZXNJblNjb3BlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQnJlYWtkb3duRWxlbWVudCBlLCBXb3JrUHJvZHVjdCB3cCwgTGlzdCBkZWxpdmVyYWJsZUxpc3QpIHsKLQkJLy8gZ2V0IGNoaWxkcmVuIGZvciBhY3Rpdml0eQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihlKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikKLQkJCQkJJiYgKFByb2Nlc3NVdGlsCi0JCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqOwotCi0JCQkJLy8gZ2V0IGRlbGl2ZXJhYmxlIHBhcnRzIGZyb20gZGVsaXZlcmFibGUKLQkJCQlMaXN0IHBhcnRzID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnRMaXN0KHdwRGVzYwotCQkJCQkJLmdldERlbGl2ZXJhYmxlUGFydHMoKSk7Ci0JCQkJaWYgKHBhcnRzLmNvbnRhaW5zKHdwKSkgewotCQkJCQlkZWxpdmVyYWJsZUxpc3QuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gZ2V0IHBhcmVudAotCQlPYmplY3QgY3VycmVudFBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQoZSk7Ci0JCWlmIChjdXJyZW50UGFyZW50ICE9IG51bGwpIHsKLQkJCS8vIGdvIHVwCi0JCQlnZXREZWxpdmVyYWJsZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgY3VycmVudFBhcmVudCwgd3AsIGRlbGl2ZXJhYmxlTGlzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGVsZW1lbnQgY2FuIGJlIG1vZGlmaWVkLiBUaGlzIGluY2x1ZGVzIGxvY2sgY2hlY2sgYW5kCi0JICogZWRpdCBjaGVjay4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBzaGVsbAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tNb2RpZnkoRU9iamVjdCBlbGVtZW50LCBTaGVsbCBzaGVsbCkgewotCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChlbGVtZW50KSkgewotCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQKLQkJCQkJLmZvcm1hdCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5Vc2VySW50ZXJhY3Rpb25IZWxwZXJfbG9ja2VkUGx1Z2luLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpCi0JCQkJCQkJCQkuZ2V0TmFtZSgpIH0pOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJZCgpLCAwLCBtc2csIG51bGwpOwotCQl9Ci0JCXJldHVybiBUbmdVdGlsLmNoZWNrRWRpdCgoRU9iamVjdCkgZWxlbWVudCwgc2hlbGwpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmb3IgdW5tb2RpZmlhYmxlIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZWRSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIEEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMuCi0JICogQHBhcmFtIHNoZWxsCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IHNoZWxsLgotCSAqIEByZXR1cm4gQW4gPGNvZGU+SVN0YXR1czwvY29kZT4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVja01vZGlmeShDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzLCBTaGVsbCBzaGVsbCkgewotCQlJQWNjZXNzQ29udHJvbGxlciBhYyA9IFNlcnZpY2VzLmdldEFjY2Vzc0NvbnRyb2xsZXIoKTsKLQkJaWYgKGFjID09IG51bGwpIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCVJlc291cmNlW10gcmVzb3VyY2VzID0gbmV3IFJlc291cmNlW21vZGlmaWVkUmVzb3VyY2VzLnNpemUoKV07Ci0JCW1vZGlmaWVkUmVzb3VyY2VzLnRvQXJyYXkocmVzb3VyY2VzKTsKLQkJcmV0dXJuIGFjLmNoZWNrTW9kaWZ5KHJlc291cmNlcywgc2hlbGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGdldFdvcmtzcGFjZVJlc291cmNlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmICghcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQlyZXR1cm4gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrT3V0T2ZTeW5jaChDb2xsZWN0aW9uIHJlc291cmNlcykgewotCQlBcnJheUxpc3Qgb3V0T2ZTeW5jaFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJSVJlc291cmNlIHdzUmVzb3VyY2UgPSBnZXRXb3Jrc3BhY2VSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCQlpZiAod3NSZXNvdXJjZSAhPSBudWxsCi0JCQkJCSYmICF3c1Jlc291cmNlLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKSkgewotCQkJCW91dE9mU3luY2hSZXNvdXJjZXMuYWRkKHdzUmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWlmIChvdXRPZlN5bmNoUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cygKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssCi0JCQkJCSIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb3V0T2ZTeW5jaFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJUmVzb3VyY2Ugd3NSZXNvdXJjZSA9IChJUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCUlTdGF0dXMuT0ssIHdzUmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCksIG51bGwpOwotCQkJCW11bHRpU3RhdHVzLmFkZChzdGF0dXMpOwotCQkJfQotCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXBkYXRlX291dG9mc3luY2hfdGl0bGU7Ci0JCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXBkYXRlX291dG9mc3luY2hfbXNnOwotCi0JCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCQlyZXR1cm4gdWlIYW5kbGVyLnNlbGVjdE9uZShuZXcgaW50W10ge0lVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9PSywKLQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTH0sIHRpdGxlLCBtc2csIG11bHRpU3RhdHVzKSAhPSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgY2hhbmdlIHRvIHRoZSBnaXZlbiBmZWF0dXJlIG9mIHRoZSBnaXZlbiBmZWF0dXJlT3duZXIgd2lsbAotCSAqIG1vZGlmeSB0aGUgZWxlbWVudCBpbiBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmVPd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrTW9kaWZ5T3Bwb3NpdGUoTWV0aG9kRWxlbWVudCBmZWF0dXJlT3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSBPcHBvc2l0ZUZlYXR1cmUKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlKGZlYXR1cmUpOwotCQlNdWx0aVJlc291cmNlRU9iamVjdCBtckVPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQ7Ci0JCWlmIChvcHBvc2l0ZUZlYXR1cmUgIT0gbnVsbCAmJiAhb3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlOYW1lZEVsZW1lbnQgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgPSAoTmFtZWRFbGVtZW50KSBtckVPYmoKLQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmdldChvcHBvc2l0ZUZlYXR1cmUpOwotCQkJaWYgKG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlICE9IG51bGwKLQkJCQkJLy8gbWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIHN0aWxsIGluIHRoZSBsaWJyYXJ5IGFuZCBub3QKLQkJCQkJLy8gZGVsZXRlZCB5ZXQuCi0JCQkJCS8vCi0JCQkJCSYmIChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkgfHwgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUKLQkJCQkJCQkuZUNvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCSYmIG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkvLyBzaW1wbGUgcmVqZWN0IGZvciA3LjAuMCByZWxlYXNlCi0JCQkJLy8KLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuVXNlckludGVyYWN0aW9uSGVscGVyX2VyclJlbGF0aW9uc2hpcEV4aXN0cywKLQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQllbGVtZW50LmdldE5hbWUoKSwKLQkJCQkJCQkJCQlUbmdVdGlsCi0JCQkJCQkJCQkJCQkuZ2V0TGFiZWxXaXRoUGF0aChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSksCi0JCQkJCQkJCQkJZmVhdHVyZU93bmVyLmdldE5hbWUoKSB9KTsKLQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd1dhcm5pbmcoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgbXNnKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCQkvLyBUT0RPOiB1bmNvbW1lbnQgdG8gdXNlIHRoaXMgY29kZSBmb3IgNy4wLjEgcmVsZWFzZQotCQkJCS8vCi0JCQkJLy8gU3RyaW5nIHRpdGxlID0gIlVwZGF0ZSBSZWxhdGlvbnNoaXAiOwotCQkJCS8vIFN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgiQWRkaW5nICcnezB9JycgdG8gJyd7MX0nJwotCQkJCS8vIHdpbGwgcmVtb3ZlICcnezB9JycgZnJvbSAnJ3syfScnLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8iCi0JCQkJLy8gLCBuZXcgT2JqZWN0W10geyBlbGVtZW50LmdldE5hbWUoKSwgZmVhdHVyZU93bmVyLmdldE5hbWUoKSwKLQkJCQkvLyBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZS5nZXROYW1lKCkgfSk7Ci0JCQkJLy8gaWYoIUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlDb25maXJtYXRpb24odGl0bGUsCi0JCQkJLy8gbXNnKSkgewotCQkJCS8vIHJldHVybiBmYWxzZTsKLQkJCQkvLyB9Ci0JCQkJLy8JCQkJCi0JCQkJLy8gSVN0YXR1cyBzdGF0dXMgPQotCQkJCS8vIFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSwKLQkJCQkvLyBudWxsKTsKLQkJCQkvLyBpZighc3RhdHVzLmlzT0soKSkgewotCQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwKLQkJCQkvLyAiQ2Fubm90IHVwZGF0ZSByZWxhdGlvbnNoaXAiLCBzdGF0dXMpOwotCQkJCS8vIHJldHVybiBmYWxzZTsKLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrQ29uZmlndXJhdGlvbnNUb1VwZGF0ZShBZGRDb21tYW5kIGFkZENvbW1hbmQsCi0JCQlTaGVsbCBzaGVsbCkgewotCQlFT2JqZWN0IHBhcmVudCA9IGFkZENvbW1hbmQuZ2V0T3duZXIoKTsKLQkJaWYgKCEocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkpIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCk7Ci0JCWlmICghKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKQotCQkJCXx8ICEoKEVSZWZlcmVuY2UpIGZlYXR1cmUpLmlzQ29udGFpbm1lbnQoKSkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQkvLyBjaGVjayBpZiB0aGUgY29uZmlndXJhdGlvbnMgdGhhdCB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgdGhpcyBjb21tYW5kCi0JCS8vIGNhbiBiZSBtb2RpZmllZAotCQkvLwotCQlBcnJheUxpc3QgY29uZmlnc1RvVXBkYXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQlNZXRob2RQYWNrYWdlIHBhcmVudFBrZyA9IChNZXRob2RQYWNrYWdlKSBwYXJlbnQ7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCVRuZ1V0aWwuZ2V0Q29uZmlndXJhdGlvbnNUb1VwZGF0ZShwYXJlbnRQa2csCi0JCQkJCQkoTWV0aG9kUGFja2FnZSkgZWxlbWVudCwgY29uZmlnc1RvVXBkYXRlKTsKLQkJCX0KLQkJfQotCQlpZiAoIWNvbmZpZ3NUb1VwZGF0ZS5pc0VtcHR5KCkpIHsKLQkJCUNvbGxlY3Rpb24gcmVzb3VyY2VzVG9DaGVjayA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb25maWdzVG9VcGRhdGUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBjb25maWcgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb25maWcuZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VzVG9DaGVjay5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNoZWNrIGFmZmVjdGVkIHJlc291cmNlcyBmb3IgdW5tb2RpZmlhYmxlCi0JCQlyZXR1cm4gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KHJlc291cmNlc1RvQ2hlY2ssIHNoZWxsKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29uZmlybURlZXBDb3B5KENvbGxlY3Rpb24gYWN0aXZpdGllcykgewotCQlpZiAoVXNlckludGVyYWN0aW9uSGVscGVyLmNhbkludGVyYWN0KCkpIHsKLQkJCS8vIGNoZWNrcyBpZiB0aGUgcGF0dGVybiBvciBhY3Rpdml0eSBjb250YWlucyBhbnkgZXh0ZW5kaW5nIGVsZW1lbnRzCi0JCQkvLyBhbmQgcHJvbXB0cyB0aGUgdXNlciBpZiBoZSByZWFsbHkKLQkJCS8vIHdhbnRzIHRvIGRlZXAgY29weSBkeW5hbWljYWxseSBsaW5rZWQgYWN0aXZpdGllcyB3YXJuaW5nIHRoZQotCQkJLy8gcHJvY2VzcyBhdXRob3IgdGhhdCBoZSB3aWxsIGdldCBhIGNvcHkKLQkJCS8vIG9mIGFsbCBkeW5hbWljYWxseSBsaW5rZWQgZWxlbWVudHMgdGhhdCBoZSBuZWVkcyB0byBtYWludGFpbgotCQkJLy8gc2VwYXJhdGVseSBmcm9tIG5vdyBvbgotCQkJYm9vbGVhbiBwcm9tcHROZWVkZWQgPSBmYWxzZTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXRpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkmJiBQcm9jZXNzVXRpbC5oYXNJbmhlcml0ZWQoKEFjdGl2aXR5KSBlKSkgewotCQkJCQlwcm9tcHROZWVkZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocHJvbXB0TmVlZGVkKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVlcENvcHlfdGl0bGU7Ci0JCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlZXBDb3B5X3Byb21wdE1zZzsKLQkJCQlpbnQgcmV0ID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpCi0JCQkJCS5zZWxlY3RPbmUobmV3IGludFtdIHsKLQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fWUVTLAotCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTwotCQkJCQl9LCB0aXRsZSwgbXNnLCBudWxsKTsKLQkJCQlpZiAocmV0ID09IElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTykgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFByb21wdHMgdXNlciB0byBjaG9vc2UgY29uZmlndXJhdGlvbiBmb3IgZGVlcCBjb3B5Ci0JICogCi0JICogQHBhcmFtIHRhcmdldFByb2Nlc3MKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICogQGV4Y2VwdGlvbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHVzZXIgY2FuY2VsbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RDb25maWd1cmF0aW9uIGNob29zZURlZXBDb3B5Q29uZmlndXJhdGlvbigKLQkJCVByb2Nlc3MgdGFyZ2V0UHJvY2VzcywgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnID0gbnVsbDsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9ICgoSUNvbmZpZ3VyYXRvcikgZmlsdGVyKQotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJaWYgKGN1cnJlbnRDb25maWcgIT0gbnVsbAotCQkJCQkmJiBjdXJyZW50Q29uZmlnICE9IHRhcmdldFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKSkgewotCQkJCWlmIChVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2FuSW50ZXJhY3QoKSkgewotCQkJCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuQWN0aXZpdHlEcm9wQ29tbWFuZF9kZWVwQ29weV9wcm9tcHRDb25maWd1cmF0aW9uTXNnOwotCQkJCQlzd2l0Y2ggKE1zZ0JveC5wcm9tcHQobXNnKSkgewotCQkJCQljYXNlIFNXVC5ZRVM6Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTV1QuTk86Ci0JCQkJCQlkZWVwQ29weUNvbmZpZyA9IGN1cnJlbnRDb25maWc7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZXBDb3B5Q29uZmlnOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmMzNzNkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgc3VwcG9ydGluZyBkaWFsb2dzIGZvciBzZWxlY3RpbmcgYW5kIGVkaXRpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWN0aXZpdHlIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9BY3Rpdml0eUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGExZjA1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9BY3Rpdml0eUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFjdGl2aXR5RGVlcENvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkNvcHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogVXNlZCB0byBleHRlbmQvY29weSBhY3Rpdml0aWVzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUhhbmRsZXIgewotCi0JcHJpdmF0ZSBBcnJheUxpc3QgcHJvY1BhY2thZ2VzOwotCQotCXByaXZhdGUgQXJyYXlMaXN0IGFjdGl2aXRpZXNUb0RlZXBDb3B5OwkKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGVlcENvcHlDb25maWc7CQotCXByaXZhdGUgTGlzdCBkZWVwQ29waWVzOwotCXByaXZhdGUgTWFwIGRlZXBDb3B5VG9PcmlnaW5hbE1hcDsKLQlwcml2YXRlIEFycmF5TGlzdCBhY3Rpdml0aWVzOwotCi0JcHJpdmF0ZSBNYXAgY29weVRvT3JpZ2luYWw7Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQkKLQlwcml2YXRlIEhlbHBlciBjb3B5SGVscGVyOwotCi0JcHJpdmF0ZSBQcm9jZXNzIHRhcmdldFByb2Nlc3M7Ci0JCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEFjdGl2aXR5SGFuZGxlcgotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUhhbmRsZXIoKSB7Ci0JCWFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFjdGl2aXRpZXNUb0RlZXBDb3B5ID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZWVwQ29waWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZWVwQ29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQljb3B5VG9PcmlnaW5hbCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXByb2NQYWNrYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsJCi0JCWNvcHlIZWxwZXIgPSBuZXcgSGVscGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWFjdGl2aXRpZXMuY2xlYXIoKTsKLQkJYWN0aXZpdGllc1RvRGVlcENvcHkuY2xlYXIoKTsKLQkJZGVlcENvcGllcy5jbGVhcigpOwotCQljb3B5VG9PcmlnaW5hbC5jbGVhcigpOwotCQlwcm9jUGFja2FnZXMuY2xlYXIoKTsKLQkJY29weUhlbHBlci5jbGVhcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjb3B5KEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCXByb2NQYWNrYWdlcy5hZGQoYWN0aXZpdHkuZUNvbnRhaW5lcigpKTsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0RGVlcENvcHlDb25maWcoKSB7Ci0JCXJldHVybiBkZWVwQ29weUNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWVwQ29weUNvbmZpZyhNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnKSB7Ci0JCXRoaXMuZGVlcENvcHlDb25maWcgPSBkZWVwQ29weUNvbmZpZzsKLQl9Ci0JCi0JcHVibGljIFByb2Nlc3MgZ2V0VGFyZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHRhcmdldFByb2Nlc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYykgewotCQl0YXJnZXRQcm9jZXNzID0gcHJvYzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXREZWVwQ29waWVzKCkgewotCQlyZXR1cm4gZGVlcENvcGllczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWVwQ29weShBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlpZihhY3Rpdml0eS5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJYWN0aXZpdGllc1RvRGVlcENvcHkuYWRkKGFjdGl2aXR5KTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBleHRlbmQoQWN0aXZpdHkgYWN0KSB7Ci0JCUFjdGl2aXR5IGV4dGVuZGVkQWN0ID0gUHJvY2Vzc1V0aWwuZ2VuZXJhbGl6ZShhY3QsCi0JCQkJVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCk7Ci0JCWFjdGl2aXRpZXMuYWRkKGV4dGVuZGVkQWN0KTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBY3Rpdml0aWVzKCkgewotCQlpZiAoIXByb2NQYWNrYWdlcy5pc0VtcHR5KCkgfHwgIWFjdGl2aXRpZXNUb0RlZXBDb3B5LmlzRW1wdHkoKSkgewotCQkJZWRpdGluZ0RvbWFpbiA9IG5ldyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCWlmKCFwcm9jUGFja2FnZXMuaXNFbXB0eSgpKSB7Ci0JCQkJYWN0aXZpdGllcy5hZGRBbGwoY29weShwcm9jUGFja2FnZXMpKTsKLQkJCX0KLQkJCWlmKCFhY3Rpdml0aWVzVG9EZWVwQ29weS5pc0VtcHR5KCkpIHsKLQkJCQlDb3B5SGVscGVyIGhlbHBlciA9IG5ldyBDb3B5SGVscGVyKCk7CQotCQkJCXRyeSB7Ci0JCQkJCWlmKG1vbml0b3IgPT0gbnVsbCkgewotCQkJCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQkJCX0KLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdGllc1RvRGVlcENvcHkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGl0ZXIubmV4dCgpOwotCQkJCQkJQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgY21kID0gbmV3IEFjdGl2aXR5RGVlcENvcHlDb21tYW5kKGFjdCwgaGVscGVyLCBkZWVwQ29weUNvbmZpZywgdGFyZ2V0UHJvY2VzcywgbW9uaXRvcik7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJCQkJQ29sbGVjdGlvbiByZXN1bHQgPSBjbWQuZ2V0UmVzdWx0KCk7Ci0JCQkJCQkJaWYoIXJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJY21kLmNvcHlTdXBwcmVzc2lvblN0YXRlcygpOwotCQkJCQkJCQlkZWVwQ29waWVzLmFkZEFsbChyZXN1bHQpOwotCQkJCQkJCQlkZWVwQ29weVRvT3JpZ2luYWxNYXAucHV0KHJlc3VsdC5pdGVyYXRvcigpLm5leHQoKSwgYWN0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQloZWxwZXIuY2xlYXIoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gZml4IGJyZWFrZG93biBlbGVtZW50IG9yZGVyIG9mIGFsbCBhY3Rpdml0aWVzCi0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWVwQ29waWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlQcm9jZXNzVXRpbC5maXhCcmVha2RvbndFbGVtZW50T3JkZXJSZWN1cnNpdmVseSgoQWN0aXZpdHkpIGl0ZXIubmV4dCgpKTsJCQkJCQotCQkJCX0KLQkJCQkKLQkJCQlhY3Rpdml0aWVzLmFkZEFsbChkZWVwQ29waWVzKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhY3Rpdml0aWVzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlUHJlZGVjZXNzb3JzKExpc3Qgd29ya0JyZWFrZG93bkVsZW1lbnRzKSB7Ci0JCS8vIGdldCB0aGUgcHJlZGVzc29yIGxpc3RzIG9mIG9yaWdpbmFsIHdvcmsgYnJlYWtkb3duIGVsZW1lbnRzCi0JCS8vCi0JCUxpc3QgcHJlZGVjZXNzb3JMaXN0cyA9IG5ldyBBcnJheUxpc3QoKTsJCQotCQlPYmplY3Qgb3JpZ2luYWwgPSBjb3B5VG9PcmlnaW5hbC5nZXQod29ya0JyZWFrZG93bkVsZW1lbnRzLmdldCgwKSk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZWRpdGluZ0RvbWFpbi5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvcmlnaW5hbCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaW50IGZpcnN0SUQgPSBic0l0ZW1Qcm92aWRlci5nZXRJZCgpOyAKLQkJcHJlZGVjZXNzb3JMaXN0cy5hZGQoYnNJdGVtUHJvdmlkZXIuZ2V0UHJlZGVjZXNzb3JzKCkpOwotCQkvLyBJdGVtIHByb3ZpZGVyIG9mIGxhc3Qgd29yayBicmVha2Rvd24gZWxlbWVudCBpbiB0aGUgc3VidHJlZSB3aG9zZSByb290IGlzIG9yaWdpbmFsIGFjdGl2aXR5Ci0JCUlCU0l0ZW1Qcm92aWRlciBsYXN0V0JJcCA9IG51bGw7Ci0JCWZvcihJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LCBvcmlnaW5hbCwgZmFsc2UpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUlCU0l0ZW1Qcm92aWRlciBic0lwID0gbnVsbDsKLQkJCQlpZihvYmogaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJYnNJcCA9ICgoSUJTSXRlbVByb3ZpZGVyKW9iaik7Ci0JCQkJCXByZWRlY2Vzc29yTGlzdHMuYWRkKGJzSXAuZ2V0UHJlZGVjZXNzb3JzKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJT2JqZWN0IGlwID0gYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQlpZihpcCBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQkJYnNJcCA9ICgoSUJTSXRlbVByb3ZpZGVyKWlwKTsKLQkJCQkJCXByZWRlY2Vzc29yTGlzdHMuYWRkKGJzSXAuZ2V0UHJlZGVjZXNzb3JzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKGJzSXAgIT0gbnVsbCkgewotCQkJCQlsYXN0V0JJcCA9IGJzSXA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBsYXN0SUQgPSBsYXN0V0JJcCAhPSBudWxsID8gbGFzdFdCSXAuZ2V0SWQoKSA6IGZpcnN0SUQ7Ci0JCQotCQkvLyB1cGRhdGUgcHJlZGVjZXNzb3JzCi0JCS8vCi0JCWludCBzaXplID0gd29ya0JyZWFrZG93bkVsZW1lbnRzLnNpemUoKTsKLQkJQXNzZXJ0LmlzVHJ1ZShzaXplID09IHByZWRlY2Vzc29yTGlzdHMuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHdvcmtCcmVha2Rvd25FbGVtZW50cy5nZXQoaSk7Ci0JCQllLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuY2xlYXIoKTsKLQkJCVByZWRlY2Vzc29yTGlzdCBwcmVkTGlzdCA9IChQcmVkZWNlc3Nvckxpc3QpIHByZWRlY2Vzc29yTGlzdHMuZ2V0KGkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByZWRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpbnQgaWQgPSBic0l0ZW1Qcm92aWRlci5nZXRJZCgpOwotCQkJCWlmKGlkID49IGZpcnN0SUQgJiYgaWQgPD0gbGFzdElEKSB7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHdvcmtCcmVha2Rvd25FbGVtZW50cy5nZXQoaWQgLSBmaXJzdElEKTsKLQkJCQkJZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLmFkZChVbWFVdGlsLmNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoZSwgcHJlZCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gcHJlZGVjZXNzb3IgaXMgb3V0c2lkZSBvZiB0aGUgc3VidHJlZSwgZG9uJ3Qgc2VsZWN0IGl0IGZvciBub3cKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNvcHlQcm9jZXNzUGFja2FnZXMoQ29sbGVjdGlvbiBwcm9jUGFja2FnZXMpIHsKLQkJQ29tbWFuZCBjb21tYW5kID0gY3JlYXRlQ29weUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwgcHJvY1BhY2thZ2VzKTsKLQkJaWYoY29tbWFuZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJCXJldHVybiBjb21tYW5kLmdldFJlc3VsdCgpOwotCQkJfSBmaW5hbGx5IHsJCQkKLQkJCQljb21tYW5kLmRpc3Bvc2UoKTsJCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhIGNvbW1hbmQgdGhhdCBjb3BpZXMgdGhlIGdpdmVuIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cy4gSWYgdGhlIGNvbGxlY3Rpb24gY29udGFpbnMgbW9yZSB0aGFuIG9uZSBvYmplY3QsCi0JICogdGhlbiBhIGNvbXBvdW5kIGNvbW1hbmQgd2lsbCBiZSBjcmVhdGVkIGNvbnRhaW5pbmcgaW5kaXZpZHVhbCBjb3B5IGNvbW1hbmRzIGZvciBlYWNoIG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIENvbW1hbmQgY3JlYXRlQ29weUNvbW1hbmQoZmluYWwgRWRpdGluZ0RvbWFpbiBkb21haW4sIGZpbmFsIENvbGxlY3Rpb24gY29sbGVjdGlvbikKLQl7Ci0JCWlmIChjb2xsZWN0aW9uID09IG51bGwgfHwgY29sbGVjdGlvbi5pc0VtcHR5KCkpIAotCQl7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCi0JCUNvbXBvdW5kQ29tbWFuZCBjb3B5Q29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoQ29tcG91bmRDb21tYW5kLk1FUkdFX0NPTU1BTkRfQUxMKTsKLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTsgKQotCQl7Ci0JCQljb3B5Q29tbWFuZC5hcHBlbmQoZG9tYWluLmNyZWF0ZUNvbW1hbmQoQ29weUNvbW1hbmQuY2xhc3MsIG5ldyBDb21tYW5kUGFyYW1ldGVyKG9iamVjdHMubmV4dCgpLCBudWxsLCBjb3B5SGVscGVyKSkpOwotCQl9Ci0KLQkJcmV0dXJuIGNvcHlDb21tYW5kLnVud3JhcCgpOwotCX0KLQotCQotCS8qKgotCSAqIENvcGllcyB0aGUgZ2l2ZW4gcHJvY2VzcyBwYWNrYWdlcwotCSAqIAotCSAqIEBwYXJhbSBlZGl0aW5nRG9tYWluCi0JICogQHBhcmFtIHByb2NQYWNrYWdlcwotCSAqIEByZXR1cm4gYWN0aXZpdGllcyBvZiB0aGUgY29waWVzCi0JICovCi0JcHJpdmF0ZSBMaXN0IGNvcHkoTGlzdCBwcm9jUGFja2FnZXMpIHsKLQkJQ29sbGVjdGlvbiBjb3B5UGFja2FnZXMgPSBjb3B5UHJvY2Vzc1BhY2thZ2VzKHByb2NQYWNrYWdlcyk7Ci0JCUFycmF5TGlzdCBhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb3B5UGFja2FnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBjb3B5ID0gKFByb2Nlc3NQYWNrYWdlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChjb3B5IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCUFjdGl2aXR5IGFjdENvcHkgPSAoKFByb2Nlc3NDb21wb25lbnQpIGNvcHkpCi0JCQkJLmdldFByb2Nlc3MoKTsKLQkJCQkvLyBjb3B5IGRhdGEgZnJvbSBQcm9jZXNzQ29tcG9uZW50IHRvIGEgbmV3Ci0JCQkJLy8gUHJvY2Vzc1BhY2thZ2UKLQkJCQlQcm9jZXNzUGFja2FnZSBwa2dDb3B5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCQlwa2dDb3B5LnNldE5hbWUoYWN0Q29weS5nZXROYW1lKCkpOwotCQkJCXBrZ0NvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKGFjdENvcHkpOwotCQkJCXBrZ0NvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKAotCQkJCQkJY29weS5nZXRQcm9jZXNzRWxlbWVudHMoKSk7Ci0JCQkJcGtnQ29weS5nZXREaWFncmFtcygpLmFkZEFsbChjb3B5LmdldERpYWdyYW1zKCkpOwotCQkJCXBrZ0NvcHkuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZEFsbCgKLQkJCQkJCWNvcHkuZ2V0Q2hpbGRQYWNrYWdlcygpKTsKLQkJCQkKLQkJCQlhY3Rpdml0aWVzLmFkZChhY3RDb3B5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWN0aXZpdGllcy5hZGQoUHJvY2Vzc1V0aWwuZmluZEFjdGl2aXR5KGNvcHkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWN0aXZpdGllczsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldERlZXBDb3B5VG9PcmlnaW5hbE1hcCgpIHsKLQkJcmV0dXJuIGRlZXBDb3B5VG9PcmlnaW5hbE1hcDsKLQl9Ci0JCi0JcHVibGljIEhlbHBlciBnZXRDb3B5SGVscGVyKCl7Ci0JCXJldHVybiBjb3B5SGVscGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0FjdGl2aXR5VHJlZUl0ZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9BY3Rpdml0eVRyZWVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwM2Q5MWMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0FjdGl2aXR5VHJlZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci0KLS8qKgotICogSW50ZXJhdG9yIHVzZWQgdG8gaXRlcmF0ZSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgdHJlZSBvZiBhbiBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlUcmVlSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVyYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NDAyMDE3NzY4MjA1NjQyMDY4TDsKLQotCXB1YmxpYyBBY3Rpdml0eVRyZWVJdGVyYXRvcihBY3Rpdml0eSBhY3QpIHsKLQkJc3VwZXIoYWN0LCBmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiAoKEFjdGl2aXR5KSBvYmplY3QpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ2F0ZWdvcnlTb3J0SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9DYXRlZ29yeVNvcnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGMzZWYyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9DYXRlZ29yeVNvcnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBzb3J0aW5nIG9mIENhdGVnb3J5IGVsZW1lbnRzCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeVNvcnRIZWxwZXIgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFID0gIkNhdGVnb3J5RWxlbWVudHNTb3J0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfQUxQSEEgPSAiQWxwaGFiZXRpYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfUkVWRVJTRV9BTFBIQSA9ICJSZXZlcnNlQWxwaGFiZXRpYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUVUSE9EX1RZUEUgPSAiTWV0aG9kVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUFOVUFMID0gIk1hbnVhbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgTWV0aG9kRWxlbWVudFByb3BlcnR5IHRvIHN0b3JlIHRoZSBDYXRlZ29yeSBzb3J0IHR5cGUKLQkgKiBAcGFyYW0gc29ydFR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50UHJvcGVydHkgY3JlYXRlTmV3U29ydFByb3BlcnR5KFN0cmluZyBzb3J0VHlwZSkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQlwcm9wLnNldE5hbWUoS0VZX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEUpOwotCQlpZiAoc29ydFR5cGUgIT0gbnVsbCkgewotCQkJcHJvcC5zZXRWYWx1ZShzb3J0VHlwZSk7Ci0JCX0KLQkJcmV0dXJuIHByb3A7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBjYXRlZ29yeSBzb3J0IHByb3BlcnR5IGZvciBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJIHByb3BlcnR5IGlmIGZvdW5kLCBlbHNlIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBnZXRDYXRlZ29yeVNvcnRQcm9wZXJ0eShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCBwcm9wcyA9IGVsZW1lbnQuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwcm9wcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIGl0Lm5leHQoKTsKLQkJCWlmIChLRVlfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRS5lcXVhbHMocHJvcC5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHByb3A7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIHJldHVybiB0cnVlIGlmZiB0aGUgY2F0ZWdvcnkgc29ydC10eXBlIGlzIHNldCB0byBtYW51YWwKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiAJCSBwcm9wZXJ0eSBpZiBmb3VuZCwgZWxzZSBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFudWFsQ2F0ZWdvcnlTb3J0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgc29ydFR5cGUgPSBnZXRDYXRlZ29yeVNvcnRWYWx1ZShlbGVtZW50KTsKLQkJaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NQU5VQUwuZXF1YWxzKHNvcnRUeXBlKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc29ydC10eXBlIGZvciB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudC4KLQkgKiBJZiBub25lIGlzIHNldCwgd2lsbCByZXR1cm4gQWxwaGFiZXRpYyBzb3J0IChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfQUxQSEEpIGFzIGEgZGVmYXVsdAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENhdGVnb3J5U29ydFZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IGdldENhdGVnb3J5U29ydFByb3BlcnR5KGVsZW1lbnQpOwotCQlpZiAocHJvcCA9PSBudWxsKQotCQkJcmV0dXJuIFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9BTFBIQTsKLQkJcmV0dXJuIHByb3AuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRDYXRlZ29yeVNvcnRUeXBlcygpIHsKLQkJTGlzdDxTdHJpbmc+IHJldHVybkxpc3QgPSBBcnJheXMuPFN0cmluZz5hc0xpc3QoCi0JCQkJVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01BTlVBTCwKLQkJCQlWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfQUxQSEEsCi0JCQkJVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX1JFVkVSU0VfQUxQSEEsCi0JCQkJVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01FVEhPRF9UWVBFKTsKLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U29ydFR5cGVEaXNwbGF5TmFtZShTdHJpbmcgc29ydFR5cGUpIHsKLQkJaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9BTFBIQS5lcXVhbHMoc29ydFR5cGUpKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuU29ydFR5cGVfQWxwaGFiZXRpYzsKLQkJfQotCQlpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX1JFVkVSU0VfQUxQSEEuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX1JldmVyc2VBbHBoYWJldGljOwotCQl9Ci0JCWlmIChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUVUSE9EX1RZUEUuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX01ldGhvZFR5cGU7Ci0JCX0KLQkJaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NQU5VQUwuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX01hbnVhbDsKLQkJfQotCQlyZXR1cm4gIiI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzb3J0ZWQgY2F0ZWdvcnkgZWxlbWVudCBsaXN0IGJhc2VkIG9uIHRoZSBjYXRlZ29yeSdzIHNvcnQgdHlwZQotCSAqIFJlc3BlY3RzIHRoZSBOYW1lL1ByZXNOYW1lIHRvZ2dsZQotCSAqIEBwYXJhbSBlbGVtZW50IAotCSAqIEBwYXJhbSBlbGVtZW50cyBhcnJheSB0byBzb3J0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3Q+IHNvcnRDYXRlZ29yeUVsZW1lbnRzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJcmV0dXJuIHNvcnRDYXRlZ29yeUVsZW1lbnRzKGVsZW1lbnQsIGVsZW1lbnRzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHNvcnRlZCBjYXRlZ29yeSBlbGVtZW50IGxpc3QgYmFzZWQgb24gdGhlIGNhdGVnb3J5J3Mgc29ydCB0eXBlCi0JICogQHBhcmFtIGVsZW1lbnQgCi0JICogQHBhcmFtIGVsZW1lbnRzIGFycmF5IHRvIHNvcnQKLQkgKiBAcGFyYW0gZm9yY2VQcmVzTmFtZVNvcnQgdHJ1ZSB0byBhbHdheXMgc29ydCBieSBwcmVzTmFtZS4gZmFsc2Ugd2lsbCByZXNwZWN0IHRoZSB0b2dnbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdD4gc29ydENhdGVnb3J5RWxlbWVudHMoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPYmplY3RbXSBlbGVtZW50cywgYm9vbGVhbiBmb3JjZVByZXNOYW1lU29ydCkgewotCQkvKgotCQkgKiBUT0RPOiBjYW4ndCB1c2UgZ2VuZXJpY3MgaGVyZSBiZWNhdXNlIEVNRiBkb2Vzbid0IHVzZSB0aGVtIHlldCAtIHRoZSBlbGVtZW50cyBwYXJhbQotCQkgKiB1c3VhbGx5IGNvbWVzIGZyb20gQ29udGVudEVsZW1lbnRzT3JkZXJMaXN0IGNsYXNzIHdoaWNoIGV4dGVuZHMgRU1GJ3MgQmFzaWNFTGlzdCBhbmQgc28KLQkJICogdGhlIHRvQXJyYXkoKSBtZXRob2Qgd2lsbCBvbmx5IHJldHVybiBPYmplY3RbXQotCQkgKi8KLQkJTGlzdDxPYmplY3Q+IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oQXJyYXlzLjxPYmplY3Q+YXNMaXN0KGVsZW1lbnRzKSk7Ci0JCVN0cmluZyBzb3J0VHlwZSA9IGdldENhdGVnb3J5U29ydFZhbHVlKGVsZW1lbnQpOwotCQlpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01BTlVBTC5lcXVhbHMoc29ydFR5cGUpKSB7Ci0JCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQkJfSBlbHNlIGlmIChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfQUxQSEEuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRDb21wYXJhdG9yKCk7Ci0JCQlpZiAoZm9yY2VQcmVzTmFtZVNvcnQpCi0JCQkJY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0UHJlc05hbWVDb21wYXJhdG9yKCk7Ci0JCQlDb2xsZWN0aW9ucy48T2JqZWN0PnNvcnQocmV0dXJuTGlzdCwgY29tcGFyYXRvcik7Ci0JCX0gZWxzZSBpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX1JFVkVSU0VfQUxQSEEuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRSZXZlcnNlQ29tcGFyYXRvcigpOwotCQkJaWYgKGZvcmNlUHJlc05hbWVTb3J0KQotCQkJCWNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldFByZXNOYW1lUmV2ZXJzZUNvbXBhcmF0b3IoKTsKLQkJCUNvbGxlY3Rpb25zLjxPYmplY3Q+c29ydChyZXR1cm5MaXN0LCBjb21wYXJhdG9yKTsKLQkJfSBlbHNlIGlmIChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUVUSE9EX1RZUEUuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50VHlwZUNvbXBhcmF0b3IoKTsKLQkJCWlmIChmb3JjZVByZXNOYW1lU29ydCkKLQkJCQljb21wYXJhdG9yID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRQcmVzTmFtZU1ldGhvZEVsZW1lbnRUeXBlQ29tcGFyYXRvcigpOwotCQkJQ29sbGVjdGlvbnMuPE9iamVjdD5zb3J0KHJldHVybkxpc3QsIGNvbXBhcmF0b3IpOwotCQl9Ci0JCXJldHVybiByZXR1cm5MaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbXBhcmF0b3JzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db21wYXJhdG9ycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZmEwZDk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbXBhcmF0b3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIGNvbXBhcmF0b3JzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21wYXJhdG9ycyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8T2JqZWN0PiBERUZBVUxUX0NPTVBBUkFUT1IgPSBuZXcgQ29tcGFyYXRvcjxPYmplY3Q+KCkgewotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaWYgKG8xID09IG8yKQotCQkJCXJldHVybiAwOwotCQkJQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQkJaWYgKG8xIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBvMiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZSgoKE1ldGhvZEVsZW1lbnQpIG8xKS5nZXROYW1lKCksICgoTWV0aG9kRWxlbWVudCkgbzIpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlPYmplY3QgbzF1bndyYXAgPSBUbmdVdGlsLnVud3JhcChvMSk7Ci0JCQlPYmplY3QgbzJ1bndyYXAgPSBUbmdVdGlsLnVud3JhcChvMik7Ci0JCQlpZiAobzF1bndyYXAgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmIG8ydW53cmFwIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXJldHVybiBjb2xsYXRvci5jb21wYXJlKCgoTWV0aG9kRWxlbWVudCkgbzF1bndyYXApLmdldE5hbWUoKSwgKChNZXRob2RFbGVtZW50KSBvMnVud3JhcCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0KLQl9OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxPYmplY3Q+IFJFVkVSU0VfREVGQVVMVF9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3I8T2JqZWN0PigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmIChvMSA9PSBvMikKLQkJCQlyZXR1cm4gMDsKLQkJCUNvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJCWlmIChvMSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgbzIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIG9wcG9zaXRlVmFsdWUoY29sbGF0b3IuY29tcGFyZSgoKE1ldGhvZEVsZW1lbnQpIG8xKS5nZXROYW1lKCksICgoTWV0aG9kRWxlbWVudCkgbzIpLmdldE5hbWUoKSkpOwotCQkJfQotCQkJT2JqZWN0IG8xdW53cmFwID0gVG5nVXRpbC51bndyYXAobzEpOwotCQkJT2JqZWN0IG8ydW53cmFwID0gVG5nVXRpbC51bndyYXAobzIpOwotCQkJaWYgKG8xdW53cmFwIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkmJiBvMnVud3JhcCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gb3Bwb3NpdGVWYWx1ZShjb2xsYXRvci5jb21wYXJlKCgoTWV0aG9kRWxlbWVudCkgbzF1bndyYXApLmdldE5hbWUoKSwgKChNZXRob2RFbGVtZW50KSBvMnVud3JhcCkuZ2V0TmFtZSgpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBpbnQgb3Bwb3NpdGVWYWx1ZShpbnQgdmFsKSB7Ci0JCWlmICh2YWwgIT0gMCkgewotCQkJdmFsID0gMCAtIHZhbDsKLQkJfQotCQlyZXR1cm4gdmFsOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBUeXBlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxPYmplY3Q+IGdldERlZmF1bHRDb21wYXJhdG9yKCkgewotCQkJcmV0dXJuIERFRkFVTFRfQ09NUEFSQVRPUjsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRPcmRlcklkKE9iamVjdCBvYmopOwotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJbzEgPSBUbmdVdGlsLnVud3JhcChvMSk7Ci0JCQlvMiA9IFRuZ1V0aWwudW53cmFwKG8yKTsKLQkJCWlmIChvMSA9PSBvMikKLQkJCQlyZXR1cm4gMDsKLQkJCWludCByZXQgPSAwOwotCQkJcmV0ID0gZ2V0T3JkZXJJZCgoRU9iamVjdCkgbzEpIC0gZ2V0T3JkZXJJZCgoRU9iamVjdCkgbzIpOwotCQkJaWYgKHJldCA9PSAwKSB7Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRDb21wYXJhdG9yKCkuY29tcGFyZShvMSwgbzIpOwotCQkJfQotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXBhcmVQcmVzZW50YXRpb25OYW1lKERlc2NyaWJhYmxlRWxlbWVudCBlMSwgRGVzY3JpYmFibGVFbGVtZW50IGUyKSB7Ci0JCUNvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nIG5hbWUxID0gZTEgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ID8gUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCllMSkKLQkJCQk6IGUxLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJaWYgKG5hbWUxLmxlbmd0aCgpIDwgMSkgbmFtZTEgPSBlMS5nZXROYW1lKCk7Ci0JCVN0cmluZyBuYW1lMiA9IGUyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCA/IFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpZTIpCi0JCQkJOiBlMi5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWlmIChuYW1lMi5sZW5ndGgoKSA8IDEpIG5hbWUyID0gZTIuZ2V0TmFtZSgpOwotCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZShuYW1lMSwgbmFtZTIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBQUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmIChvMSA9PSBvMikKLQkJCQlyZXR1cm4gMDsKLQkJCWlmKCEobzEgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpKSB7Ci0JCQkJbzEgPSBUbmdVdGlsLnVud3JhcChvMSk7Ci0JCQkJaWYoIShvMSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfQotCQkJaWYoIShvMiBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkpIHsKLQkJCQlvMiA9IFRuZ1V0aWwudW53cmFwKG8yKTsKLQkJCQlpZighKG8yIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSkgewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY29tcGFyZVByZXNlbnRhdGlvbk5hbWUoKERlc2NyaWJhYmxlRWxlbWVudCkgbzEsIChEZXNjcmliYWJsZUVsZW1lbnQpIG8yKTsKLQkJfQotCi0JfTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgUkVWRVJTRV9QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmIChvMSA9PSBvMikKLQkJCQlyZXR1cm4gMDsKLQkJCWlmKCEobzEgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpKSB7Ci0JCQkJbzEgPSBUbmdVdGlsLnVud3JhcChvMSk7Ci0JCQkJaWYoIShvMSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfQotCQkJaWYoIShvMiBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkpIHsKLQkJCQlvMiA9IFRuZ1V0aWwudW53cmFwKG8yKTsKLQkJCQlpZighKG8yIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSkgewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gb3Bwb3NpdGVWYWx1ZShjb21wYXJlUHJlc2VudGF0aW9uTmFtZSgoRGVzY3JpYmFibGVFbGVtZW50KSBvMSwgKERlc2NyaWJhYmxlRWxlbWVudCkgbzIpKTsKLQkJfQotCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBNRVRIT0RfVFlQRV9DT01QQVJBVE9SID0gbmV3IFR5cGVDb21wYXJhdG9yKCkgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzLlR5cGVDb21wYXJhdG9yI2dldERlZmF1bHRDb21wYXJhdG9yKCkKLQkJICovCi0JCXByb3RlY3RlZCBDb21wYXJhdG9yIGdldERlZmF1bHRDb21wYXJhdG9yKCkgewotCQkJcmV0dXJuIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGludCBnZXRPcmRlcklkKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJaW50IGlkID0gKChNZXRob2RFbGVtZW50KSBvYmopLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQkJCWlmIChpZCA9PSBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTikgewotCQkJCQlpZCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQkJCX0KLQkJCQlyZXR1cm4gaWQ7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9OwotCQotCS8qKgotCSAqIEFsd2F5cyBzb3J0IGJ5IHByZXNlbnRhdGlvbiBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIE1FVEhPRF9UWVBFX1BSRVNfTkFNRV9DT01QQVJBVE9SID0gbmV3IFR5cGVDb21wYXJhdG9yKCkgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzLlR5cGVDb21wYXJhdG9yI2dldERlZmF1bHRDb21wYXJhdG9yKCkKLQkJICovCi0JCXByb3RlY3RlZCBDb21wYXJhdG9yIGdldERlZmF1bHRDb21wYXJhdG9yKCkgewotCQkJcmV0dXJuIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0UHJlc05hbWVDb21wYXJhdG9yKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgaW50IGdldE9yZGVySWQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlpbnQgaWQgPSAoKE1ldGhvZEVsZW1lbnQpIG9iaikuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCk7Ci0JCQkJaWYgKGlkID09IFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OKSB7Ci0JCQkJCWlkID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQkJfQotCQkJCXJldHVybiBpZDsKLQkJCX0KLQkJCXJldHVybiAtMTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgUExVR0lOUEFDS0FHRV9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaWYgKG8xID09IG8yKQotCQkJCXJldHVybiAwOwotCQkJbzEgPSBUbmdVdGlsLnVud3JhcChvMSk7Ci0JCQlvMiA9IFRuZ1V0aWwudW53cmFwKG8yKTsKLQkJCQotCQkJCi0JCQlpZiAobzEgaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyICYmIG8yIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJaWYgKG8xIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luICYmIG8yIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiAxOwotCQkJfQotCQotCQkJYm9vbGVhbiB1c2VQcmVzTmFtZSA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKTsKLQkJCVN0cmluZyBzMSA9IG51bGw7Ci0JCQlTdHJpbmcgczIgPSBudWxsOwotCQkJaWYgKHVzZVByZXNOYW1lICYmIG8xIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJczEgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgbzEpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCX0gZWxzZSBpZiAobzEgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJczEgPSAoKE1ldGhvZEVsZW1lbnQpIG8xKS5nZXROYW1lKCk7Ci0JCQl9IGVsc2UgaWYgKG8xIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJCXMxID0gKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSBvMSkuZ2V0RnVsbE5hbWUoKTsKLQkJCX0gZWxzZSBpZiAobzEgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlzMSA9IChTdHJpbmcpIG8xOwotCQkJfSAKLQkJCQotCQkJaWYgKHVzZVByZXNOYW1lICYmIG8yIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJczIgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgbzIpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCX0gZWxzZSBpZiAobzIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJczIgPSAoKE1ldGhvZEVsZW1lbnQpIG8yKS5nZXROYW1lKCk7Ci0JCQl9IGVsc2UgaWYgKG8yIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJCXMyID0gKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSBvMikuZ2V0RnVsbE5hbWUoKTsKLQkJCX0gZWxzZSBpZiAobzIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlzMiA9IChTdHJpbmcpIG8yOwotCQkJfQotCQkJCi0JCQlpZiAoczEgPT0gbnVsbCB8fCBzMiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBzMS5jb21wYXJlVG9JZ25vcmVDYXNlKHMyKTsKLQkJfQotCX07Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWY0YWViYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotCi0KLS8qKgotICogSW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBjYW4gYmUgY29uZmlndXJlZCB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbHRlcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1bCAyNywgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBleHRlbmRzIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8vIHByaXZhdGUgU2V0IGRpc3Bvc2FibGVBZGFwdGVyczsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQkvLyBwcml2YXRlIFNldCBnZXREaXNwb3NhYmxlQWRhcHRlcnMoKSB7Ci0JLy8gaWYoZGlzcG9zYWJsZUFkYXB0ZXJzID09IG51bGwpIHsKLQkvLyBkaXNwb3NhYmxlQWRhcHRlcnMgPSBuZXcgSGFzaFNldCgpOwotCS8vIH0KLQkvLyByZXR1cm4gZGlzcG9zYWJsZUFkYXB0ZXJzOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkjYWRhcHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkgewotCQkJKChJQ29uZmlndXJhYmxlKSBhZGFwdGVyKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJfQotCQkvLyBpZihhZGFwdGVyIGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJLy8gZ2V0RGlzcG9zYWJsZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQkvLyB9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkjYWRhcHQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gc3VwZXIuYWRhcHQodGFyZ2V0LCB0eXBlKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhYmxlKSB7Ci0JCQkoKElDb25maWd1cmFibGUpIGFkYXB0ZXIpLnNldEZpbHRlcihmaWx0ZXIpOwotCQl9Ci0JCS8vIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkvLyBnZXREaXNwb3NhYmxlQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCS8vIH0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKQotCS8vICovCi0JLy8gcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkvLyBpZihkaXNwb3NhYmxlQWRhcHRlcnMgIT0gbnVsbCAmJiAhZGlzcG9zYWJsZUFkYXB0ZXJzLmlzRW1wdHkoKSkgewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGRpc3Bvc2FibGVBZGFwdGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBJRGlzcG9zYWJsZSBhZGFwdGVyID0gKElEaXNwb3NhYmxlKSBpdGVyLm5leHQoKTsKLQkvLyBhZGFwdGVyLmRpc3Bvc2UoKTsKLQkvLyB9Ci0JLy8gfQotCS8vIHN1cGVyLmRpc3Bvc2UoKTsKLQkvLyB9Ci0KLQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNmaXJlTm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl0cnkgewotCQkJc3VwZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAobm90aWZpY2F0aW9uIGluc3RhbmNlb2YgVmlld2VyTm90aWZpY2F0aW9uKSB7Ci0JCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCi0JCQkJU3RyaW5nV3JpdGVyIHN0cldyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3RyV3JpdGVyKSk7Ci0JCQkJTWVzc2VuZ2VyLklOU1RBTkNFCi0JCQkJCQkuc2hvd0Vycm9yKAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9mYXRhbGVyciwKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfcmVmZXJzaGluZ3ZpZXdlciwKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfdW5oYW5kbGVkX2V4Y2VwdGlvbiwKLQkJCQkJCQkJc3RyV3JpdGVyLnRvU3RyaW5nKCksIGUpOyAKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnN0cmFpbnRNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25zdHJhaW50TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZmM2MjAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnN0cmFpbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0aGF0IG1hbmFnZXMgdGhlIHVzZSBvZiBDb250cmFpbnQgaW4gbGlicmFyeSB0byBzdG9yZQotICogaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgZGF0YQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIERlYyAxLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb25zdHJhaW50TWFuYWdlciB7Ci0JLyoqIENvbnN0YW50cyBmb3IgY29udHJhaW4gbmFtZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDSVRJVllfRElBR1JBTSA9ICJkaWFncmFtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU19TVVBQUkVTU0lPTiA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0cmFpbnQgZ2V0Q29uc3RyYWludChNZXRob2RFbGVtZW50IGUsCi0JCQlTdHJpbmcgY29uc3RyYWludE5hbWUsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCWlmIChjb25zdHJhaW50TmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDb25zdHJhaW50IGNvbnN0cmFpbnQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlLmdldE93bmVkUnVsZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNvbnN0cmFpbnQgYyA9IChDb25zdHJhaW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChjLmdldE5hbWUoKS5lcXVhbHMoY29uc3RyYWludE5hbWUpKSB7Ci0JCQkJY29uc3RyYWludCA9IGM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbnN0cmFpbnQgPT0gbnVsbCAmJiBjcmVhdGUpIHsKLQkJCWNvbnN0cmFpbnQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCk7Ci0JCQljb25zdHJhaW50LnNldE5hbWUoY29uc3RyYWludE5hbWUpOwotCQkJZS5nZXRPd25lZFJ1bGVzKCkuYWRkKGNvbnN0cmFpbnQpOwotCQl9Ci0JCXJldHVybiBjb25zdHJhaW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50SW5oZXJpdGFuY2VIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50SW5oZXJpdGFuY2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODc0ZDM5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudEluaGVyaXRhbmNlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyBzdGF0aWMgaGVscGVyIG1ldGhvZHMgdGhhdCBhcmUgcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnQKLSAqIGluaGVyaXRhbmNlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudEVsZW1lbnRJbmhlcml0YW5jZUhlbHBlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBkZXNjZW5kaW5nU29ydEJ5Q3JlYXRpb25UaW1lKExpc3QgdGFza3MpIHsKLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCS8vIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkU3RlcHMoTGlzdCBzdGVwcywgVGFzayBiYXNlKSB7Ci0JLy8gT2JqZWN0IGZpcnN0ID0gbnVsbDsKLQkvLyBpZighc3RlcHMuaXNFbXB0eSgpKSB7Ci0JLy8gZmlyc3QgPSBzdGVwcy5nZXQoMCk7Ci0JLy8gfQotCS8vIExpc3QgdGFza3MgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoYmFzZSk7Ci0JLy8gaW50IHNpemUgPSB0YXNrcy5zaXplKCk7Ci0JLy8gZm9yKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCS8vIFRhc2sgdGFzayA9IChUYXNrKSB0YXNrcy5nZXQoaSk7Ci0JLy8gTGlzdCBzZWN0aW9ucyA9IHRhc2suZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKTsKLQkvLyBpbnQgbnVtT2ZTZWN0aW9ucyA9IHNlY3Rpb25zLnNpemUoKTsKLQkvLyBTZWN0aW9uIHByZXYgPSBudWxsOwotCS8vIGZvciAoaW50IGogPSAwOyBqIDwgbnVtT2ZTZWN0aW9uczsgaisrKSB7Ci0JLy8gU2VjdGlvbiBzZWN0aW9uID0gKFNlY3Rpb24pIHNlY3Rpb25zLmdldChqKTsKLQkvLyBTZWN0aW9uIHByZWQgPSBzZWN0aW9uLmdldFByZWRlY2Vzc29yKCk7Ci0JLy8gaWYocHJlZCA9PSBudWxsKSB7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0JLyoqCi0JICogR2V0cyBhbGwgc3RlcHMgaW4gdGhlIHRhc2sgdHJlZSB0aGF0IHRoZSBnaXZlbiB0YXNrIGJlbG9uZ3MgdG8KLQkgKiAKLQkgKiBAcGFyYW0gdGFzawotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsVGFza1N0ZXBzKFRhc2sgdGFzaykgewotCQlUYXNrIGJhc2UgPSAoVGFzaykgVG5nVXRpbC5nZXRCYXNlKHRhc2spOwotCQlMaXN0IHN0ZXBzID0gbmV3IEFycmF5TGlzdChiYXNlLmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkpOwotCQlJdGVyYXRvciB0YXNrcyA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihiYXNlLCBmYWxzZSkgewotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoCi0JCQkJCQkoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJVGFzayBjdXJyZW50QmFzZSA9IGJhc2U7Ci0JCXdoaWxlICh0YXNrcy5oYXNOZXh0KCkpIHsKLQkJCVRhc2sgdCA9IChUYXNrKSB0YXNrcy5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudEJhc2UgIT0gdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQkvLyBuZXcgaW5oZXJpdGFuY2UgbGV2ZWwKLQkJCQkvLwotCQkJCWN1cnJlbnRCYXNlID0gKFRhc2spIHQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVNlY3Rpb24gcyA9IChTZWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQlTZWN0aW9uIHByZWQgPSBzLmdldFByZWRlY2Vzc29yKCk7Ci0JCQkJaWYgKHByZWQgIT0gbnVsbCkgewotCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdGVwczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50TGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29udGVudEVsZW1lbnRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ0ZjQwOGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29udGVudEVsZW1lbnRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50RWxlbWVudExpc3QgewotCi0JcHJpdmF0ZSBDb250ZW50UGFja2FnZSBjb250ZW50UGtnOwotCi0JcHJvdGVjdGVkIGNsYXNzIEVsZW1lbnRJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHsKLQotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMjkxNDM4OTcwMTIzOTg1OTA2TDsKLQotCQlwcm90ZWN0ZWQgRWxlbWVudEl0ZXJhdG9yKCkgewotCQkJc3VwZXIoY29udGVudFBrZywgZmFsc2UpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbkxpc3QoT2JqZWN0IG9iamVjdCkgewotCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpIG9iamVjdDsKLQkJCQljaGlsZHJlbi5hZGRBbGwocGtnLmdldENoaWxkUGFja2FnZXMoKSk7Ci0JCQkJTGlzdCBlbGVtZW50cyA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBvYmogPSBlbGVtZW50cy5nZXQoaSk7Ci0JCQkJCWlmIChhY2NlcHQob2JqKSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKG9iaik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGdldENoaWxkcmVuTGlzdChvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCX0KLQkJCi0JfTsKLQkKLQlwdWJsaWMgQ29udGVudEVsZW1lbnRMaXN0KENvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cpIHsKLQkJdGhpcy5jb250ZW50UGtnID0gY29udGVudFBrZzsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaik7Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZWxlbWVudEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVsZW1lbnRJdGVyYXRvcigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ2V0QWxsRWxlbWVudHMoQ29udGVudFBhY2thZ2UgcGtnLCBMaXN0IGxpc3QpIHsKLS8vCQlMaXN0IGVsZW1lbnRzID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLS8vCQkJaWYgKGFjY2VwdChvYmopKSB7Ci0vLwkJCQlsaXN0LmFkZChvYmopOwotLy8JCQl9Ci0vLwkJfQotLy8JCUxpc3QgcGFja2FnZXMgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZXMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJT2JqZWN0IG9iaiA9IHBhY2thZ2VzLmdldChpKTsKLS8vCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0vLwkJCQlnZXRBbGxFbGVtZW50cygoQ29udGVudFBhY2thZ2UpIG9iaiwgbGlzdCk7Ci0vLwkJCX0KLS8vCQl9Ci0JCQotCQlmb3IoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRJdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQlpZighKGUgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpIHsKLQkJCQlsaXN0LmFkZChlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBMaXN0IGdldExpc3QoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0QWxsRWxlbWVudHMoY29udGVudFBrZywgbGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29udGVudEVsZW1lbnRPcmRlckxpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50T3JkZXJMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExMGIxMjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29udGVudEVsZW1lbnRPcmRlckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLnV0aWwuU3RyaW5nUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgYWxsIHRoZSBsb2dpY3MgdXNlZCB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBhbGwKLSAqIGNvbnRyaWJ1dGVkL2luaGVyaXRlZCBzZWN0aW9ucyBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBhcyB3ZWxsIGFzIGFsbG93cwotICogbWFuaXB1bGF0ZSB0aGlzIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBleHRlbmRzIEJhc2ljRUxpc3QgewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NzU3Mjc5NzQ4NzA2OTIzM0w7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVJfSU5GT19OQU1FID0gImNvbnRlbnQgZWxlbWVudHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgREVGQVVMVF9TQVZFX09QVElPTlMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfT05MWSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUyA9IDI7Ci0KLQlzdGF0aWMgewotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiQVNDSUkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgQ29udGVudEVsZW1lbnQgZWRpdEVsZW1lbnQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbWl4ZWQgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb250cmlidXRvcihWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKGUpOwotCX0KLQotCXB1YmxpYyBDb250ZW50RWxlbWVudE9yZGVyTGlzdChDb250ZW50RWxlbWVudCBlLCBpbnQgc2NvcGUpIHsKLQkJZWRpdEVsZW1lbnQgPSBlOwotCQlpZiAoc2NvcGUgPT0gQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfT05MWSkgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfSBlbHNlIGlmIChzY29wZSA9PSBDT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUykgewotCQkJY2FsY3VsYXRlUGFyZW50c09ubHkoZSk7Ci0JCX0gZWxzZSB7Ci0JCQltaXhlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVBhcmVudHNPbmx5KENvbnRlbnRFbGVtZW50IGUpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG51bGw7Ci0JCWlmIChpc0NvbnRyaWJ1dG9yKGUpIHx8IGlzRXh0ZW5kZWQoZSkpIHsKLQkJCUxpc3Qgc3VwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJVW1hVXRpbC5nZXRBbGxTdXBlcnNCb3RoKHN1cGVycywgZSwKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwsCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpOwotCQkJc3VwZXJzLmFkZChlKTsKLQkJCWl0ZXIgPSBzdXBlcnMuaXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCW1peGVkID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAobWl4ZWQpIHsKLQkJCS8vIGNyZWF0ZSBhIG1hcCBvZiBHVUlEIC8gY29udHJpYnV0b3IKLQkJCS8vCi0JCQlPcmRlckluZm8gbGF0ZXN0SW5mbyA9IG51bGw7Ci0JCQlNYXAgZ3VpZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlTZXQgZWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJQ29udGVudEVsZW1lbnQgZWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChDdXN0b21DYXRlZ29yeSllbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJRGVzY3JpYmFibGVFbGVtZW50IGNhdGVnb3JpemVkRWxlbWVudCA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWd1aWRNYXAucHV0KGNhdGVnb3JpemVkRWxlbWVudC5nZXRHdWlkKCksIGNhdGVnb3JpemVkRWxlbWVudCk7Ci0JCQkJCQllbGVtZW50cy5hZGQoY2F0ZWdvcml6ZWRFbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSBUbmdVdGlsLmdldE9yZGVySW5mbyhlbGVtZW50LAotCQkJCQkJT1JERVJfSU5GT19OQU1FKTsKLQkJCQlpZiAob3JkZXJJbmZvICE9IG51bGwpIHsKLQkJCQkJaWYgKGxhdGVzdEluZm8gPT0gbnVsbAotCQkJCQkJCXx8IG9yZGVySW5mby5nZXRUaW1lc3RhbXAoKSA+IGxhdGVzdEluZm8KLQkJCQkJCQkJCS5nZXRUaW1lc3RhbXAoKSkgewotCQkJCQkJbGF0ZXN0SW5mbyA9IG9yZGVySW5mbzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGxhdGVzdEluZm8gIT0gbnVsbCkgewotCQkJCS8vIHJlb3JkZXIgdGhlIHNlY3Rpb25zIGJhc2VkIG9uIHRoZSBsYXRlc3Qgb3JkZXIgaW5mbwotCQkJCS8vCi0JCQkJaW50IHNpemUgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBndWlkID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLmdldChpKTsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBndWlkTWFwLmdldChndWlkKTsKLQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJc3VwZXIuYWRkKGVsZW1lbnQpOwotCQkJCQkJZWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3VwZXIuYWRkQWxsKGVsZW1lbnRzKTsKLQkJfQotCX0KLQotCS8vIGRlcHJlY2F0ZSB0aGUgZm9sbG93aW5nIGNvbnN0cnVjdG9yCi0JcHVibGljIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KENvbnRlbnRFbGVtZW50IGUpIHsKLQkJZWRpdEVsZW1lbnQgPSBlOwotCQlJdGVyYXRvciBpdGVyID0gbnVsbDsKLQkJaWYgKGlzQ29udHJpYnV0b3IoZSkgfHwgVG5nVXRpbC5oYXNDb250cmlidXRvcihlKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBUbmdVdGlsLmdldEJhc2UoZSk7Ci0JCQlpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGJhc2UpIHsKLQotCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0KQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlpZiAoZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCkgewotCQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0gZWxzZSBpZiAoaXNFeHRlbmRlZChlKSkgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiJCQkIGZvciAiICsgZS5nZXROYW1lKCkgKyAiID0gZXh0ZW5kZWQgaXMgdHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUxpc3Qgc3VwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJVW1hVXRpbC5nZXRBbGxTdXBlcnMoc3VwZXJzLCBlLCBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKTsKLQkJCXN1cGVycy5hZGQoZSk7Ci0JCQlpdGVyID0gc3VwZXJzLml0ZXJhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQltaXhlZCA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKG1peGVkKSB7Ci0JCQkvLyBjcmVhdGUgYSBtYXAgb2YgR1VJRCAvIGNvbnRyaWJ1dG9yCi0JCQkvLwotCQkJT3JkZXJJbmZvIGxhdGVzdEluZm8gPSBudWxsOwotCQkJTWFwIGd1aWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJTGlzdCBlbGVtZW50cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlDb250ZW50RWxlbWVudCBlbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlndWlkTWFwLnB1dChlbGVtZW50LmdldEd1aWQoKSwgZWxlbWVudCk7Ci0JCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCi0JCQkJT3JkZXJJbmZvIG9yZGVySW5mbyA9IFRuZ1V0aWwuZ2V0T3JkZXJJbmZvKGVsZW1lbnQsCi0JCQkJCQlPUkRFUl9JTkZPX05BTUUpOwotCQkJCWlmIChvcmRlckluZm8gIT0gbnVsbCkgewotCQkJCQlpZiAobGF0ZXN0SW5mbyA9PSBudWxsCi0JCQkJCQkJfHwgb3JkZXJJbmZvLmdldFRpbWVzdGFtcCgpID4gbGF0ZXN0SW5mbwotCQkJCQkJCQkJLmdldFRpbWVzdGFtcCgpKSB7Ci0JCQkJCQlsYXRlc3RJbmZvID0gb3JkZXJJbmZvOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobGF0ZXN0SW5mbyAhPSBudWxsKSB7Ci0JCQkJLy8gcmVvcmRlciB0aGUgc2VjdGlvbnMgYmFzZWQgb24gdGhlIGxhdGVzdCBvcmRlciBpbmZvCi0JCQkJLy8KLQkJCQlpbnQgc2l6ZSA9IGxhdGVzdEluZm8uZ2V0R1VJRHMoKS5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJT2JqZWN0IGd1aWQgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuZ2V0KGkpOwotCQkJCQlPYmplY3QgZWxlbWVudCA9IGd1aWRNYXAuZ2V0KGd1aWQpOwotCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlzdXBlci5hZGQoZWxlbWVudCk7Ci0JCQkJCQllbGVtZW50cy5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlzdXBlci5hZGRBbGwoZWxlbWVudHMpOwotCQl9Ci0JCS8vIGVsc2UgewotCQkvLyAvLyBhZGRBbGwoZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKSk7Ci0JCS8vIG1peGVkID0gZmFsc2U7Ci0JCS8vIH0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRXh0ZW5kZWQoQ29udGVudEVsZW1lbnQgZSkgewotCQlyZXR1cm4gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTDsKLQl9Ci0KLQkvKioKLQkgKiBBcHBsaWVzIHJlY2VudCBjaGFuZ2VzIGluIHRoZSBsaXN0Ci0JICogCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoKSB7Ci0JCWlmICghbWl4ZWQgfHwgIWNoYW5nZWQpCi0JCQlyZXR1cm47Ci0KLQkJLy8gc2F2ZSB0aGUgb3JkZXIgaW5mbyB0byB0aGUgb3JkZXJpbmdHdWlkZSBvZiB0aGUgZWRpdEVsZW1lbnQKLQkJLy8KLQkJU3RyaW5nIHN0ciA9IGVkaXRFbGVtZW50LmdldE9yZGVyaW5nR3VpZGUoKTsKLQkJT3JkZXJJbmZvQ29sbGVjdGlvbiBvcmRlckluZm9zID0gbnVsbDsKLQkJU3RyaW5nUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlvcmRlckluZm9zID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPcmRlckluZm9Db2xsZWN0aW9uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSBuZXcgU3RyaW5nUmVzb3VyY2Uoc3RyKTsKLQkJCXRyeSB7Ci0JCQkJcmVzLmxvYWQobnVsbCk7Ci0JCQkJaWYgKHJlcy5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCQlvcmRlckluZm9zID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVPcmRlckluZm9Db2xsZWN0aW9uKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3JkZXJJbmZvcyA9IChPcmRlckluZm9Db2xsZWN0aW9uKSByZXMuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBmaW5kIHRoZSBvcmRlciBpbmZvciBmb3Igc2VjdGlvbnMKLQkJLy8KLQkJT3JkZXJJbmZvIHNlY3RPcmRlckluZm8gPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcmRlckluZm9zLmdldE9yZGVySW5mb3MoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSAoT3JkZXJJbmZvKSBpdGVyLm5leHQoKTsKLQkJCWlmIChPUkRFUl9JTkZPX05BTUUuZXF1YWxzSWdub3JlQ2FzZShvcmRlckluZm8uZ2V0TmFtZSgpKSkgewotCQkJCXNlY3RPcmRlckluZm8gPSBvcmRlckluZm87Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc2VjdE9yZGVySW5mbyA9PSBudWxsKSB7Ci0JCQlzZWN0T3JkZXJJbmZvID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPcmRlckluZm8oKTsKLQkJCXNlY3RPcmRlckluZm8uc2V0TmFtZShPUkRFUl9JTkZPX05BTUUpOwotCQkJb3JkZXJJbmZvcy5nZXRPcmRlckluZm9zKCkuYWRkKHNlY3RPcmRlckluZm8pOwotCQl9IGVsc2UgewotCQkJc2VjdE9yZGVySW5mby5nZXRHVUlEcygpLmNsZWFyKCk7Ci0JCX0KLQotCQlpbnQgc2l6ZSA9IHNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBzZWN0ID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZ2V0KGkpOwotCQkJc2VjdE9yZGVySW5mby5nZXRHVUlEcygpLmFkZChzZWN0LmdldEd1aWQoKSk7Ci0JCX0KLQkJc2VjdE9yZGVySW5mby5zZXRUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlpZiAocmVzID09IG51bGwpIHsKLQkJCXJlcyA9IG5ldyBTdHJpbmdSZXNvdXJjZShudWxsKTsKLQkJCXJlcy5nZXRDb250ZW50cygpLmFkZChvcmRlckluZm9zKTsKLQkJfQotCQl0cnkgewotCQkJcmVzLnNhdmUoREVGQVVMVF9TQVZFX09QVElPTlMpOwotCQkJc3RyID0gcmVzLmdldFN0cmluZygpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTZWN0aW9uTGlzdC5hcHBseSgpOiBuZXcgb3JkZXJpbmcgZ3VpZGUiKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tIG9yZGVyaW5nR3VpZGUgc3RhcnQgLS0tLS0tIik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oc3RyKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tIG9yZGVyaW5nR3VpZGUgZW5kIC0tLS0tLSIpOwotCQkJZWRpdEVsZW1lbnQuc2V0T3JkZXJpbmdHdWlkZShzdHIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmUoQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQpIHsKLQkJaWYgKCgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuY29udGFpbnMoCi0JCQkJY29udGVudEVsZW1lbnQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlpZiAoIWNhblJlbW92ZSgoQ29udGVudEVsZW1lbnQpIGdldChpbmRleCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJT2JqZWN0IHJlbW92ZWQgPSBzdXBlci5yZW1vdmUoaW5kZXgpOwotCQkJKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5yZW1vdmUoCi0JCQkJCXJlbW92ZWQpOwotCQkJcmV0dXJuIHJlbW92ZWQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkucmVtb3ZlKGluZGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlpZiAoIWNhblJlbW92ZSgoQ29udGVudEVsZW1lbnQpIG8pKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobWl4ZWQpIHsKLQkJCWlmIChzdXBlci5yZW1vdmUobykpIHsKLQkJCQkoKEN1c3RvbUNhdGVnb3J5KSBlZGl0RWxlbWVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLnJlbW92ZSgKLQkJCQkJCW8pOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiAoKEN1c3RvbUNhdGVnb3J5KSBlZGl0RWxlbWVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJLnJlbW92ZShvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQkJSXRlcmF0b3IgZSA9IGl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbyA9IGUubmV4dCgpOwotCQkJCWlmIChjLmNvbnRhaW5zKG8pICYmIGNhblJlbW92ZSgoQ29udGVudEVsZW1lbnQpIG8pKSB7Ci0JCQkJCWUucmVtb3ZlKCk7Ci0JCQkJCSgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkJCQkucmVtb3ZlKG8pOwotCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1vZGlmaWVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkJLnJlbW92ZUFsbChjKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJc3VwZXIuYWRkKGluZGV4LCBlbGVtZW50KTsKLQkJCSgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkJLmFkZChlbGVtZW50KTsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5hZGQoaW5kZXgsCi0JCQkJCWVsZW1lbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKSB7Ci0JCWJvb2xlYW4gYiA9ICgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkuYWRkKG8pOwotCQlpZiAobWl4ZWQpIHsKLQkJCWIgPSBzdXBlci5hZGQobyk7Ci0JCQlpZiAoYikKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gYjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjKSB7Ci0JCWJvb2xlYW4gYiA9ICgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkuYWRkQWxsKGMpOwotCQk7Ci0JCWlmIChtaXhlZCkgewotCQkJYiA9IHN1cGVyLmFkZEFsbChjKTsKLQkJCWlmIChiKQotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb24gYykgewotCQlpZiAobWl4ZWQpIHsKLQkJCSgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuYWRkQWxsKGMpOwotCQkJOwotCQkJYm9vbGVhbiBiID0gc3VwZXIuYWRkQWxsKGluZGV4LCBjKTsKLQkJCWlmIChiKQotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiAoKEN1c3RvbUNhdGVnb3J5KSBlZGl0RWxlbWVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJLmFkZEFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHNldChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQlyZXR1cm4gKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5zZXQoCi0JCQkJaW5kZXgsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpZiAobWl4ZWQpCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmUoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJc3VwZXIubW92ZShpbmRleCwgb2JqZWN0KTsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJKChFTGlzdCkgKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKSkKLQkJCQkJLm1vdmUoaW5kZXgsIG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlPYmplY3QgbW92ZWQgPSBzdXBlci5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCXJldHVybiBtb3ZlZDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKEVMaXN0KSAoKEN1c3RvbUNhdGVnb3J5KSBlZGl0RWxlbWVudCkKLQkJCQkJLmdldENhdGVnb3JpemVkRWxlbWVudHMoKSkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLmdldChpbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5nZXQoCi0JCQkJCWluZGV4KTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLnNpemUoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKEN1c3RvbUNhdGVnb3J5KSBlZGl0RWxlbWVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLnNpemUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuaXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKEN1c3RvbUNhdGVnb3J5KSBlZGl0RWxlbWVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCS5pdGVyYXRvcigpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci5jb250YWlucyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiAoKEN1c3RvbUNhdGVnb3J5KSBlZGl0RWxlbWVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJLmNvbnRhaW5zKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci5jb250YWluc0FsbChjb2xsZWN0aW9uKTsKLQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkuY29udGFpbnNBbGwoY29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCS50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gYXJyYXkpIHsKLQkJaWYgKG1peGVkKQotCQkJcmV0dXJuIHN1cGVyLnRvQXJyYXkoYXJyYXkpOwotCQlyZXR1cm4gKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS50b0FycmF5KAotCQkJCWFycmF5KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIuaW5kZXhPZihvYmplY3QpOwotCQlyZXR1cm4gKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5pbmRleE9mKAotCQkJCW9iamVjdCk7Ci0JfQotCi0JcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci5sYXN0SW5kZXhPZihvYmplY3QpOwotCQlyZXR1cm4gKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCS5sYXN0SW5kZXhPZihvYmplY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWl4ZWQoKSB7Ci0JCXJldHVybiBtaXhlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9EaWFncmFtT3B0aW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRGlhZ3JhbU9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmI4YmEyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9EaWFncmFtT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtT3B0aW9ucyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRElBR1JBTV9QVUJMSVNIX05PTkUgPSAiZGlhZ3JhbV9wdWJsaXNoX25vbmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0RJQUdSQU1fUFVCTElTSF9BTEwgPSAiZGlhZ3JhbV9wdWJsaXNoX2FsbCI7Ci0JCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1B1Ymxpc2hOb25lKFByb2Nlc3MgcHJvY2VzcykgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eShwcm9jZXNzLCBQUk9QX0RJQUdSQU1fUFVCTElTSF9OT05FKTsKLQkJcmV0dXJuIHByb3AgIT0gbnVsbCA/IEJvb2xlYW4ucGFyc2VCb29sZWFuKHByb3AuZ2V0VmFsdWUoKSkgOiBmYWxzZTsgCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRQdWJsaXNoTm9uZShQcm9jZXNzIHByb2Nlc3MsIGJvb2xlYW4gYikgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuc2V0UHJvcGVydHkocHJvY2VzcywgUFJPUF9ESUFHUkFNX1BVQkxJU0hfTk9ORSwgYik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1B1Ymxpc2hBbGwoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5KHByb2Nlc3MsIFBST1BfRElBR1JBTV9QVUJMSVNIX0FMTCk7Ci0JCXJldHVybiBwcm9wICE9IG51bGwgPyBCb29sZWFuLnBhcnNlQm9vbGVhbihwcm9wLmdldFZhbHVlKCkpIDogZmFsc2U7IAkJCi0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2V0UHVibGlzaEFsbChQcm9jZXNzIHByb2Nlc3MsIGJvb2xlYW4gYikgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuc2V0UHJvcGVydHkocHJvY2VzcywgUFJPUF9ESUFHUkFNX1BVQkxJU0hfQUxMLCBiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzIyYTllNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLQotLyoqCi0gKiBBIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgdGhhdCBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluUHJvdmlkZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQlwdWJsaWMgRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQotCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVkaXRpbmdEb21haW4oRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCXRoaXMuZWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0JCWlmIChlZGl0aW5nRG9tYWluIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZWRpdGluZ0RvbWFpbikKLQkJCQkJLnNldEFkYXB0ZXJGYWN0b3J5KHRoaXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FeHBvc2VkQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0V4cG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NTYzOGYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0V4cG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklSZWZlcmVuY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQ29sdW1uQXdhcmU7Ci0KLQotLyoqCi0gKiBBbiBFZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB0aGF0IGV4cG9zZXMgaW50ZXJuYWwgZGF0YQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkKLQkJaW1wbGVtZW50cyBJQ29sdW1uQXdhcmUsIElSZWZlcmVuY2VyIHsKLQotCXByaXZhdGUgTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3JpZXMKLQkgKi8KLQlwdWJsaWMgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBjaGFuZ2VOb3RpZmllcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlI3NldENvbHVtbkluZGV4VG9OYW1lTWFwKGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoTWFwIG1hcCkgewotCQljb2x1bW5JbmRleFRvTmFtZU1hcCA9IG1hcDsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVyRmFjdG9yaWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGFkYXB0ZXJGYWN0b3J5ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ29sdW1uQXdhcmUpIHsKLQkJCQkoKElDb2x1bW5Bd2FyZSkgYWRhcHRlckZhY3RvcnkpLnNldENvbHVtbkluZGV4VG9OYW1lTWFwKG1hcCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlI2dldENvbHVtbkluZGV4VG9OYW1lTWFwKCkKLQkgKi8KLQlwdWJsaWMgTWFwIGdldENvbHVtbkluZGV4VG9OYW1lTWFwKCkgewotCQlyZXR1cm4gY29sdW1uSW5kZXhUb05hbWVNYXA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlciNjbGVhblVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhblVwKCkgewotCQlpbnQgc2l6ZSA9IGFkYXB0ZXJGYWN0b3JpZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IGFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcmllcy5nZXQoaSk7Ci0JCQlpZihhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElSZWZlcmVuY2VyKSB7Ci0JCQkJKChJUmVmZXJlbmNlcilhZGFwdGVyRmFjdG9yeSkuY2xlYW5VcCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlciNyZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IHJlZikgewotCQlib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKLQkJaW50IHNpemUgPSBhZGFwdGVyRmFjdG9yaWVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBhZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3JpZXMuZ2V0KGkpOwotCQkJaWYoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJUmVmZXJlbmNlcikgewotCQkJCSgoSVJlZmVyZW5jZXIpYWRhcHRlckZhY3RvcnkpLnJlbW92ZShyZWYpOwotCQkJCXJlbW92ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiByZW1vdmVkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRXh0ZW5zaW9uTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRXh0ZW5zaW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMzMwOWFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0V4dGVuc2lvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHdpdGggbWV0aG9kcyB0byByZXRyaWV2ZSBleHRlbnNpb25zCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSnVuIDI3LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRXh0ZW5zaW9uTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIElEVG9FeHRlbnNpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgc3RhdGljIExpc3QgbmVzdGVkQ29tbWFuZFByb3ZpZGVyczsKLQlwcml2YXRlIHN0YXRpYyBMaXN0IG9wcG9zaXRlRmVhdHVyZUxvYWRlcnM7Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEV4dGVuc2lvbnMoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGV4dGVuc2lvblBvaW50TmFtZSwgQ2xhc3MgdHlwZSkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQobmFtZXNwYWNlLCBleHRlbnNpb25Qb2ludE5hbWUpOwotCQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZihjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCQkJCQlPYmplY3QgZXh0ID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQkJCWlmKHR5cGUuaXNJbnN0YW5jZShleHQpKSB7Ci0JCQkJCQkJCQlsaXN0LmFkZChleHQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlpZihsaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEV4dGVuc2lvbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnROYW1lKSB7Ci0JCVN0cmluZyBJRCA9IG5hbWVzcGFjZSArICcuJyArIGV4dGVuc2lvblBvaW50TmFtZTsKLQkJT2JqZWN0IGV4dCA9IElEVG9FeHRlbnNpb25NYXAuZ2V0KElEKTsKLQkJaWYoZXh0ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoSURUb0V4dGVuc2lvbk1hcCkgewotCQkJCWV4dCA9IElEVG9FeHRlbnNpb25NYXAuZ2V0KElEKTsKLQkJCQlpZihleHQgPT0gbnVsbCkgewotCQkJCQkvLyBQcm9jZXNzIHRoZSBjb250cmlidXRvcnMuCi0JCQkJCS8vCi0JCQkJCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KG5hbWVzcGFjZSwgZXh0ZW5zaW9uUG9pbnROYW1lKTsKLQkJCQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJCQkJZXh0X3dhbGs6Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJaWYoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJCQlleHQgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCQkJCQkJCQlicmVhayBleHRfd2FsazsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZihleHQgIT0gbnVsbCkgewotCQkJCQkJSURUb0V4dGVuc2lvbk1hcC5wdXQoSUQsIGV4dCk7Ci0JCQkJCX0KLQkJCQl9IAotCQkJfQotCi0JCX0KLQkJcmV0dXJuIGV4dDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElUZXh0UmVmZXJlbmNlUmVwbGFjZXIgZ2V0VGV4dFJlZmVyZW5jZVJlcGxhY2VyKCkgewotCQlyZXR1cm4gKElUZXh0UmVmZXJlbmNlUmVwbGFjZXIpIGdldEV4dGVuc2lvbihMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgInRleHRSZWZlcmVuY2VSZXBsYWNlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TmVzdGVkQ29tbWFuZFByb3ZpZGVycygpIHsKLQkJaWYobmVzdGVkQ29tbWFuZFByb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQluZXN0ZWRDb21tYW5kUHJvdmlkZXJzID0gZ2V0RXh0ZW5zaW9ucyhMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgCi0JCQkJCSJuZXN0ZWRDb21tYW5kUHJvdmlkZXJzIiwgSU5lc3RlZENvbW1hbmRQcm92aWRlci5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbmVzdGVkQ29tbWFuZFByb3ZpZGVyczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElEaWFncmFtTWFuYWdlciBnZXREaWFncmFtTWFuYWdlcigpIHsKLQkJcmV0dXJuIChJRGlhZ3JhbU1hbmFnZXIpIGdldEV4dGVuc2lvbihMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgImRpYWdyYW1NYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3Bwb3NpdGVGZWF0dXJlTG9hZGVycygpIHsKLQkJaWYob3Bwb3NpdGVGZWF0dXJlTG9hZGVycyA9PSBudWxsKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVMb2FkZXJzID0gZ2V0RXh0ZW5zaW9ucyhMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgCi0JCQkJCSJvcHBvc2l0ZUZlYXR1cmVMb2FkZXJzIiwgSU5lc3RlZENvbW1hbmRQcm92aWRlci5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gb3Bwb3NpdGVGZWF0dXJlTG9hZGVyczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJVXNlckludGVyYWN0aW9uSGFuZGxlciBnZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpIHsKLQkJcmV0dXJuIChJVXNlckludGVyYWN0aW9uSGFuZGxlcikgZ2V0RXh0ZW5zaW9uKExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAidXNlckludGVyYWN0aW9uSGFuZGxlciIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0dyYXBoaWNhbERhdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0dyYXBoaWNhbERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2Y4ZDMwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9HcmFwaGljYWxEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247Ci1pbXBvcnQgamF2YS5hd3QuUG9pbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhpY2FsRGF0YSB7Ci0JcHJpdmF0ZSBQb2ludCBsb2NhdGlvbiA9IG5ldyBQb2ludCgwLCAwKTsKLQotCXByaXZhdGUgRGltZW5zaW9uIHNpemUgPSBuZXcgRGltZW5zaW9uKC0xLCAtMSk7Ci0KLQlwcml2YXRlIEdyYXBoTm9kZSBncmFwaE5vZGU7Ci0KLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbTsKLQotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oKSB7Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCXRoaXMuZGlhZ3JhbSA9IGRpYWdyYW07Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBnZXRHcmFwaE5vZGUoKSB7Ci0JCXJldHVybiBncmFwaE5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R3JhcGhOb2RlKEdyYXBoTm9kZSBncmFwaE5vZGUpIHsKLQkJdGhpcy5ncmFwaE5vZGUgPSBncmFwaE5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiAgICAgICAgICAgIFRoZSBsb2NhdGlvbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oUG9pbnQgbG9jYXRpb24pIHsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2l6ZS4KLQkgKi8KLQlwdWJsaWMgRGltZW5zaW9uIGdldFNpemUoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzaXplCi0JICogICAgICAgICAgICBUaGUgc2l6ZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2l6ZShEaW1lbnNpb24gc2l6ZSkgewotCQl0aGlzLnNpemUgPSBzaXplOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lCcmVha2Rvd25TdHJ1Y3R1cmVBZGFwdGVyRmFjdG9yaWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JQnJlYWtkb3duU3RydWN0dXJlQWRhcHRlckZhY3Rvcmllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOTY2MWI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lCcmVha2Rvd25TdHJ1Y3R1cmVBZGFwdGVyRmFjdG9yaWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gcHJvdmlkZXMgYSByZWxhdGVkIHNldCBvZiBhZGFwdGVyIGZhY3RvcmllcyBmb3IgYnJlYWtkb3duCi0gKiBzdHJ1Y3R1cmUgdmlld3MKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjAsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQnJlYWtkb3duU3RydWN0dXJlQWRhcHRlckZhY3RvcmllcyB7Ci0JQWRhcHRlckZhY3RvcnkgZ2V0V0JTQWRhcHRlckZhY3RvcnkoKTsKLQotCUFkYXB0ZXJGYWN0b3J5IGdldFRCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQlBZGFwdGVyRmFjdG9yeSBnZXRXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQotCUFkYXB0ZXJGYWN0b3J5IGdldENCU0FkYXB0ZXJGYWN0b3J5KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JRGlhZ3JhbU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lEaWFncmFtTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Mjg2OWM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lEaWFncmFtTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci0KLS8qKgotICogTWFuYWdlcyBkaWFncmFtcyBvZiBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1biAyNywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbU1hbmFnZXIgewotCS8qKiBEaWFncmFtIHR5cGUgY29uc3RhbnRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfRElBR1JBTSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNID0gMjsKLQotCS8qKgotCSAqIEdldHMgZGlhZ3JhbSBvZiBnaXZlbiB0eXBlIGZvciB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKiAKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIHR5cGUgY2FuIGJlIG9uZSBvZiB0aGUgY29uc3RhbnRzIHtAbGluayAjQUNUSVZJVFlfRElBR1JBTX0sIHtAbGluayAjQUNUSVZJVFlfREVUQUlMX0RJQUdSQU19LCBvciB7QGxpbmsgI1dPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU19Ci0JICogQHJldHVybgotCSAqLwotCURpYWdyYW0gZ2V0RGlhZ3JhbShBY3Rpdml0eSBhY3QsIGludCB0eXBlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lMaWJyYXJ5SW5zcGVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JTGlicmFyeUluc3BlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNDVkOTI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lMaWJyYXJ5SW5zcGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBkZWJ1ZyBwdXJwb3NlCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAtIEF1Z3VzdCAxMSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeUluc3BlY3RvciB7Ci0JLyoqCi0JICogU2hvdyBhbGwgY29udGVudHMgb2YgdGhlIGxpYnJhcnkKLQkgKi8KLQl2b2lkIHNob3dBbGxDb250ZW50cygpOwotCQotCS8qKgotCSAqIFNob3cgYWxsIGNvbnRlbnRzIG9mIHRoZSBsaWJyYXJ5Ci0JICovCi0Jdm9pZCBzaG93QWxsQ29udGVudHMoTWV0aG9kTGlicmFyeSBsaWIpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lPcHBvc2l0ZUZlYXR1cmVMb2FkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lPcHBvc2l0ZUZlYXR1cmVMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI3ODllZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBPcHBvc2l0ZSBmZWF0dXJlIGxvYWRlcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIFNlcCAxNCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJT3Bwb3NpdGVGZWF0dXJlTG9hZGVyIHsKLQkvKioKLQkgKiBMb2FkcyBvcHBvc2l0ZSBmZWF0dXJlcyBmb3IgdGhlIGdpdmVuIGVsZW1lbnRzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0Jdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcyhDb2xsZWN0aW9uIGVsZW1lbnRzKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lUZXh0UmVmZXJlbmNlUmVwbGFjZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lUZXh0UmVmZXJlbmNlUmVwbGFjZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmRkZjUxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JVGV4dFJlZmVyZW5jZVJlcGxhY2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogSW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBjYW4gc2NhbiB0ZXh0IGFuZCByZXBsYWNlcyB0ZXh0dWFsIHJlZmVyZW5jZXMgdG8gdGhlCi0gKiBvbGQgb2JqZWN0cyB3aXRoIHJlZmVyZW5jZXMgdG8gbmV3IG9iamVjdHMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdW4gMjIsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGV4dFJlZmVyZW5jZVJlcGxhY2VyIHsKLQkvKioKLQkgKiBSZXBsYWNlcyB0ZXh0dWFsIHJlZmVyZW5jZXMgdG8gdGhlIG9sZCBvYmplY3RzIHdpdGggcmVmZXJlbmNlcyB0byBuZXcKLQkgKiBvYmplY3RzIHByb3ZpZGVkIGluIHRoZSA8Y29kZT5vbGRUb05ld09iamVjdE1hcDwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgdGhlIG93bmVyIG9mIHRoZSB0ZXh0Ci0JICogQHBhcmFtIG9sZFRvTmV3T2JqZWN0TWFwCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyByZXBsYWNlKFN0cmluZyB0ZXh0LCBFT2JqZWN0IG93bmVyLCBNYXAgb2xkVG9OZXdPYmplY3RNYXApOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTGlicmFyeUVkaXRDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0xpYnJhcnlFZGl0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1MmEwNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTGlicmFyeUVkaXRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotCi0vKioKLSAqIENvbnN0YW50cyBmb3IgbGlicmFyeSBlZGl0IHBsdWdpbgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSBKdW4gMzAsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIExpYnJhcnlFZGl0Q29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFVOQ0FURUdPUklaRURfVEFTS1NfUEFUSCA9IHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1VuY2F0ZWdvcml6ZWRfVGFza3NfdGV4dCIpIC8vJE5PTi1OTFMtMSQKLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBVTkNBVEVHT1JJWkVEX0RPTUFJTl9XT1JLUFJPRFVDVFNfUEFUSCA9IHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF90ZXh0IikgLy8kTk9OLU5MUy0xJAkJCQkKLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBVTkNBVEVHT1JJWkVEX1dPUktQUk9EVUNUVFlQRV9XT1JLUFJPRFVDVFNfUEFUSCA9IHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dCIpIC8vJE5PTi1OTFMtMSQJCQkJCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVU5DQVRFR09SSVpFRF9ST0xFU19QQVRIID0gewotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dCIpIC8vJE5PTi1OTFMtMSQJCQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFVOQ0FURUdPUklaRURfVE9PTE1FTlRPUlNfUEFUSCA9IHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dCIpIC8vJE5PTi1OTFMtMSQJCQkJCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRU5BQkxFX1BST0NFU1NfQ09OVFJJQlVUSU9OID0gUFJFRl9QUkVGSVgKLQkJCSsgImVuYWJsZV9wcm9jZXNzX2NvbnRyaWJ1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRU5BQkxFX0hFQUxUSF9DSEVDSyA9IFBSRUZfUFJFRklYCi0JCQkrICJlbmFibGVfaGVhbHRoX2NoZWNrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFID0gUFJFRl9QUkVGSVgKLQkJCSsgImluaGVyaXRfc3VwcHJlc3Npb25fc3RhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1dCU19DT0xVTU5TID0gUFJFRl9QUkVGSVggKyAid2JzX2NvbHVtbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1RCU19DT0xVTU5TID0gUFJFRl9QUkVGSVggKyAidGJzX2NvbHVtbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1dQQlNfQ09MVU1OUyA9IFBSRUZfUFJFRklYICsgIndwYnNfY29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19DVVNUT01fQ0FURUdPUlkgPSAibmV3X2N1c3RvbV9jYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19ESVNDSVBMSU5FID0gIm5ld19kaXNjaXBsaW5lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0RJU0NJUExJTkVfR1JPVVBJTkcgPSAibmV3X2Rpc2NpcGxpbmVfZ3JvdXBpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRE9NQUlOID0gIm5ld19kb21haW4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUk9MRV9TRVQgPSAibmV3X3JvbGVfc2V0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1JPTEVfU0VUX0dST1VQSU5HID0gIm5ld19yb2xlX3NldF9ncm91cGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19UT09MID0gIm5ld190b29sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1dPUktfUFJPRFVDVF9UWVBFID0gIm5ld193b3JrX3Byb2R1Y3Rfa2luZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19ST0xFID0gIm5ld19yb2xlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1RBU0sgPSAibmV3X3Rhc2siOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfV09SS1BST0RVQ1QgPSAibmV3X3dvcmtwcm9kdWN0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0FSVElGQUNUID0gIm5ld19hcnRpZmFjdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19ERUxJVkVSQUJMRSA9ICJuZXdfZGVsaXZlcmFibGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfT1VUQ09NRSA9ICJuZXdfb3V0Y29tZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19DSEVDS0xJU1QgPSAibmV3X2NoZWNrbGlzdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19XSElURVBBUEVSID0gIm5ld193aGl0ZXBhcGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0NPTkNFUFQgPSAibmV3X2NvbmNlcHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRVNUSU1BVEUgPSAibmV3X2VzdGltYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VTVElNQVRJT05fQ09OU0lERVJBVElPTiA9ICJuZXdfZXN0aW1hdGlvbl9jb25zaWRlcmF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19FU1RJTUFUQVRJTkdfTUVUUklDID0gIm5ld19lc3RpbWF0aW5nX21ldHJpYyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19FWEFNUExFID0gIm5ld19leGFtcGxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1BSQUNUSUNFID0gIm5ld19wcmFjdGljZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19SRVBPUlQgPSAibmV3X3JlcG9ydCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19ST0FETUFQID0gIm5ld19yb2FkbWFwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1JFVVNBQkxFX0FTU0VUID0gIm5ld19yZXVzYWJsZV9hc3NldCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19TVVBQT1JUSU5HX01BVEVSSUFMID0gIm5ld19zdXBwb3J0aW5nX21hdGVyaWFsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1RFTVBMQVRFID0gIm5ld190ZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19URVJNX0RFRklOSVRJT04gPSAibmV3X3Rlcm1fZGVmaW5pdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19UT09MX01FTlRPUiA9ICJuZXdfdG9vbG1lbnRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19HVUlERUxJTkUgPSAibmV3X2d1aWRlbGluZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19HVUlEQU5DRSA9ICJuZXdfZ3VpZGFuY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQ09OVEVOVF9QQUNLQUdFID0gIm5ld19jb250ZW50X3BhY2thZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQ09ORklHVVJBVElPTiA9ICJuZXdfY29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19QUk9DRVNTX0ZBTUlMWSA9ICJuZXdfcHJvY2Vzc19mYW1pbHkiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXNzZW5nZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01lc3Nlbmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MTA1ZmU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01lc3Nlbmdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlcjsKLQotLyoqCi0gKiBEZWZhdWx0IG1lc3NlbmdlciB0aGF0IHdpbGwgZGVsaXZlciBtZXNzYWdlcyB1c2luZyB0aGUgbWVzc2VuZ2VyIG9mCi0gKiB7QGxpbmsgRXh0ZW5zaW9uTWFuYWdlciNnZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpIGRlZmF1bHQgdXNlcgotICogaW50ZXJhY3Rpb24gaGFuZGxlcn0gaWYgb25lIGV4aXN0cy4gT3RoZXJ3aXNlLCBpdCB3aWxsIGxvZyB0aGUgbWVzc2FnZXMgdXNpbmcKLSAqIHBsdWdpbidzIGxvZ2dlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMjUsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1lc3NlbmdlciBpbXBsZW1lbnRzIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2VuZ2VyIElOU1RBTkNFID0gbmV3IE1lc3NlbmdlcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19MSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KAotCQkJImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBJTWVzc2VuZ2VyIGRlbGVnYXRlOwotCi0JcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCi0JcHJpdmF0ZSBNZXNzZW5nZXIoKSB7Ci0JCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIKLQkJCQkuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJaWYgKHVpSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZSA9IHVpSGFuZGxlci5nZXRNZXNzZW5nZXIoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnNob3dFcnJvcih0aXRsZSwgbXNnKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKHRpdGxlKTsKLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsobXNnKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChtc2cpOwotCQkJfQotCQkJbG9nZ2VyLmxvZ0Vycm9yKHN0ckJ1Zi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBJU3RhdHVzIHN0YXR1cykgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuc2hvd0Vycm9yKHRpdGxlLCBtc2csIHN0YXR1cyk7Ci0JCX0gZWxzZSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dFcnJvcihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkV4Y2VwdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLAotCQkJRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuc2hvd0Vycm9yKHRpdGxlLCBtc2csIHJlYXNvbiwgZXhjZXB0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKHRpdGxlKTsKLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsobXNnKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChtc2cpOwotCQkJfQotCQkJbG9nZ2VyLmxvZ0Vycm9yKHN0ckJ1Zi50b1N0cmluZygpLCBleGNlcHRpb24pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93V2FybmluZyhqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnNob3dXYXJuaW5nKHRpdGxlLCBtc2cpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodGl0bGUpOwotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChORVdfTElORSkuYXBwZW5kKG1zZyk7Ci0JCQl9Ci0JCQlsb2dnZXIubG9nV2FybmluZyhzdHJCdWYudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbikgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuc2hvd1dhcm5pbmcodGl0bGUsIG1zZywgcmVhc29uKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKHRpdGxlKTsKLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsobXNnKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChtc2cpOwotCQkJfQotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhyZWFzb24pKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChORVdfTElORSkuYXBwZW5kKHJlYXNvbik7Ci0JCQl9Ci0JCQlsb2dnZXIubG9nV2FybmluZyhzdHJCdWYudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93SW5mbyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dJbmZvKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuc2hvd0luZm8odGl0bGUsIG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcih0aXRsZSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQobXNnKTsKLQkJCX0KLQkJCWxvZ2dlci5sb2dJbmZvKHN0ckJ1Zi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dFcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuRXhjZXB0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sIFN0cmluZyBkZXRhaWxzLCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5zaG93SW5mbyh0aXRsZSwgbXNnKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKHRpdGxlKTsKLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsobXNnKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChtc2cpOwotCQkJfQotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhyZWFzb24pKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChORVdfTElORSkuYXBwZW5kKHJlYXNvbik7Ci0JCQl9Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKGRldGFpbHMpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChORVdfTElORSkuYXBwZW5kKGRldGFpbHMpOwotCQkJfQotCQkJbG9nZ2VyLmxvZ0Vycm9yKHN0ckJ1Zi50b1N0cmluZygpLCBleGNlcHRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNzUwZjNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kRWxlbWVudFByb3BlcnR5IGdldFByb3BlcnR5KE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KSBpdGVyLm5leHQoKTsKLQkJCWlmKHByb3AuZ2V0TmFtZSgpLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJcmV0dXJuIHByb3A7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRQcm9wZXJ0eShNZXRob2RFbGVtZW50IGUsIFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IGdldFByb3BlcnR5KGUsIHByb3BOYW1lKTsKLQkJaWYocHJvcCA9PSBudWxsKSB7Ci0JCQlwcm9wID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCQlwcm9wLnNldE5hbWUocHJvcE5hbWUpOwotCQkJZS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5hZGQocHJvcCk7Ci0JCX0KLQkJcHJvcC5zZXRWYWx1ZShwcm9wVmFsdWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRQcm9wZXJ0eShNZXRob2RFbGVtZW50IGUsIFN0cmluZyBwcm9wTmFtZSwgYm9vbGVhbiBiKSB7Ci0JCXNldFByb3BlcnR5KGUsIHByb3BOYW1lLCBTdHJpbmcudmFsdWVPZihiKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWV0aG9kRWxlbWVudFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzdmNzYzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBDbGFzcyB3aXRoIHN0YXRpYyB1dGlsaXR5IG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIG1ldGhvZCBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFV0aWwgewotCi0JLyoqCi0JICogUmV0dXJuIG1ldGhvZCBtb2RlbCBvZiB0aGUgb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBsdWdpbiBnZXRNZXRob2RNb2RlbChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoTWV0aG9kRWxlbWVudCkgb2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGxpc3Qgb2YgbW9kZWxzIGFzIHNwZWNpZmllZC4uIDEuIE1ldGhvZCBtb2RlbCBvZiB0aGUgb2JqZWN0IDIuCi0JICogUmVmZXJlbmNlZCBtb2RlbHMgb2YgdGhlIG1ldGhvZCBtb2RlbCBvZiB0aGUgb2JqZWN0IChlLmcuIHJlZmVyZW5jZQotCSAqIHJlbGF0aW9uc2hpcCkKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxNb2RlbHMoT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGFsbE1vZGVscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBnZXQgbWV0aG9kIG1vZGVsIG9mIHRoZSBvYmplY3QKLQkJTWV0aG9kUGx1Z2luIG1vZGVsID0gZ2V0TWV0aG9kTW9kZWwob2JqZWN0KTsKLQotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCi0JCQkvLyBnZXQgYWxsIGJhc2UgbW9kZWxzCi0JCQkvLwotCQkJTWlzYy5nZXRBbGxCYXNlKG1vZGVsLCBhbGxNb2RlbHMpOwotCi0JCQlhbGxNb2RlbHMuYWRkKG1vZGVsKTsKLQotCQl9Ci0KLQkJcmV0dXJuIGFsbE1vZGVsczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHJlZmVyZW5jZXMgZ3VpZGFuY2VzIGZvciB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoRU9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBpdGVtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlMaXN0IHJlZmVyZW5jZXMgPSAoKEVPYmplY3QpIG9iamVjdCkuZUNyb3NzUmVmZXJlbmNlcygpOwotCQlpZiAocmVmZXJlbmNlcyAhPSBudWxsICYmIHJlZmVyZW5jZXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJCWl0ZW1MaXN0LmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWl0ZW1MaXN0Ci0JCQkJLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmFjdGljZXMoKENvbnRlbnRFbGVtZW50KSBvYmplY3QpKTsKLQotCQlyZXR1cm4gaXRlbUxpc3Q7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWlzYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWlzYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMmRhMTc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01pc2MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBNYW55IG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBoYWQgYmVlbiBtb3ZlZCB0byBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWlzYyB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0QWxsV29ya1Byb2R1Y3RzKENvbnRlbnRQYWNrYWdlIHBrZywgTGlzdCBsaXN0KSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBlbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQlsaXN0LmFkZChvYmopOwotCQkJfQotCQl9Ci0JCUxpc3QgcGFja2FnZXMgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gcGFja2FnZXMuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJZ2V0QWxsV29ya1Byb2R1Y3RzKChDb250ZW50UGFja2FnZSkgb2JqLCBsaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxXb3JrUHJvZHVjdHMoQ29udGVudFBhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0QWxsV29ya1Byb2R1Y3RzKHBrZywgbGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0QWxsVGFza3MoQ29udGVudFBhY2thZ2UgcGtnLCBMaXN0IGxpc3QpIHsKLQkJTGlzdCBlbGVtZW50cyA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQkJbGlzdC5hZGQob2JqKTsKLQkJCX0KLQkJfQotCQlMaXN0IHBhY2thZ2VzID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IHBhY2thZ2VzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCWdldEFsbFRhc2tzKChDb250ZW50UGFja2FnZSkgb2JqLCBsaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxUYXNrcyhDb250ZW50UGFja2FnZSBwa2cpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRBbGxUYXNrcyhwa2csIGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsVW5jYXRlZ29yaXplZFRhc2tzKENvbnRlbnRQYWNrYWdlIHBrZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldEFsbFVuY2F0ZWdvcml6ZWRUYXNrcyhwa2csIGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldEFsbFVuY2F0ZWdvcml6ZWRUYXNrcyhDb250ZW50UGFja2FnZSBwa2csIExpc3QgbGlzdCkgewotCQlMaXN0IGVsZW1lbnRzID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2sKLQkJCQkJJiYgQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZXMoKFRhc2spIG9iaikuaXNFbXB0eSgpKSB7Ci0JCQkJbGlzdC5hZGQob2JqKTsKLQkJCX0KLQkJfQotCQlMaXN0IHBhY2thZ2VzID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IHBhY2thZ2VzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCWdldEFsbFVuY2F0ZWdvcml6ZWRUYXNrcygoQ29udGVudFBhY2thZ2UpIG9iaiwgbGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFBhdGhSZWxhdGl2ZVRvUGx1Z2luKE5hbWVkRWxlbWVudCBlKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxpc3QuYWRkKFN0cmluZy52YWx1ZU9mKGUuZ2V0TmFtZSgpKSk7Ci0JCWZvciAoZSA9IChOYW1lZEVsZW1lbnQpICgoRU9iamVjdCkgZSkuZUNvbnRhaW5lcigpOyBlICE9IG51bGwKLQkJCQkmJiBlICE9IHBsdWdpbjsgZSA9IChOYW1lZEVsZW1lbnQpICgoRU9iamVjdCkgZSkuZUNvbnRhaW5lcigpKSB7Ci0JCQlsaXN0LmFkZCgwLCBTdHJpbmcudmFsdWVPZihlLmdldE5hbWUoKSkpOwotCQl9Ci0JCVN0cmluZ1tdIHBhdGggPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHBhdGgpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoUmVsYXRpdmVUb0xpYnJhcnkoTmFtZWRFbGVtZW50IGUpIHsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkKLQkJCXJldHVybiBlLmdldE5hbWUoKTsKLQkJU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGUuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nW10gYXJyID0gZ2V0UGF0aFJlbGF0aXZlVG9QbHVnaW4oZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXRoLmFwcGVuZCgnLycpLmFwcGVuZChhcnJbaV0pOwotCQl9Ci0JCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgYmFzZSBwbHVnaW5zIG9mIHRoZSBnaXZlbiBwbHVnaW4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxCYXNlKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRBbGxCYXNlKHBsdWdpbiwgbGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxCYXNlKE1ldGhvZFBsdWdpbiBwbHVnaW4sIExpc3QgbGlzdCkgewotCQlMaXN0IGJhc2UgPSBwbHVnaW4uZ2V0QmFzZXMoKTsKLQotCQkvLyBDaGVjayBpZiB0aGUgYmFzZXMgaW4gdGhlIGxpc3QgYWxyZWFkeS4KLQkJaWYgKCFsaXN0LmNvbnRhaW5zQWxsKGJhc2UpKSB7Ci0JCQlsaXN0LmFkZEFsbChiYXNlKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGJhc2Uuc2l6ZSgpOyBpKyspIHsKLQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGJhc2UuZ2V0KGkpOwotCQkJZ2V0QWxsQmFzZShwbHVnaW4sIGxpc3QpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmFzZU9mKE1ldGhvZFBsdWdpbiBiYXNlLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCX0KLQkJTGlzdCBiYXNlcyA9IHBsdWdpbi5nZXRCYXNlcygpOwotCQlpbnQgc2l6ZSA9IGJhc2VzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChiYXNlID09IGJhc2VzLmdldChpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGlzQmFzZU9mKGJhc2UsIChNZXRob2RQbHVnaW4pIGJhc2VzLmdldChpKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTW9kZWxTdHJ1Y3R1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01vZGVsU3RydWN0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzYTM1OTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTW9kZWxTdHJ1Y3R1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0KLS8qKgotICogRGVmaW5lcyBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgYSBtZXRob2QgcGx1Z2luIHdpdGggcHJlZGVmaW5lZCBwYWNrYWdlcwotICogIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsU3RydWN0dXJlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTW9kZWxTdHJ1Y3R1cmUgREVGQVVMVCA9IG5ldyBNb2RlbFN0cnVjdHVyZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElEREVOX1BBQ0tBR0VfTkFNRSA9ICJIaWRkZW4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QQUNLQUdFX05BTUUgPSAiQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JFX0NPTlRFTlRfUEFDQUtHRV9OQU1FID0gIkNvcmVDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SSUVTID0gIkNhdGVnb3JpZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9TRVRfUEFDS0FHRV9OQU1FID0gIlJvbGVTZXRzIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NJUExJTkVfUEFDS0FHRV9OQU1FID0gIkRpc2NpcGxpbmVzIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DQVRFR09SWV9QQUNLQUdFX05BTUUgPSAiQ3VzdG9tQ2F0ZWdvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfQ09SRV9DT05URU5UX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDT1JFX0NPTlRFTlRfUEFDQUtHRV9OQU1FIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1JPTEVfU0VUX1BBQ0tBR0VfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICBST0xFX1NFVF9QQUNLQUdFX05BTUV9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX0RJU0NJUExJTkVfREVGX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDQVRFR09SSUVTLCBESVNDSVBMSU5FX1BBQ0tBR0VfTkFNRSB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9UT09MX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDQVRFR09SSUVTLCAiVG9vbHMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfU1RBTkRBUkRfQ0FURUdPUllfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICJTdGFuZGFyZENhdGVnb3JpZXMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfREVMSVZFUllfUFJPQ0VTU19QQVRIID0geyAiRGVsaXZlcnlQcm9jZXNzZXMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfQ0FQQUJJTElUWV9QQVRURVJOX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCAiQ2FwYWJpbGl0eVBhdHRlcm5zIiB9OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfRE9NQUlOX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDQVRFR09SSUVTLCAiRG9tYWlucyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1dPUktfUFJPRFVDVF9UWVBFX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDQVRFR09SSUVTLCAiV1AgVHlwZXMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9DVVNUT01fQ0FURUdPUllfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICBDVVNUT01fQ0FURUdPUllfUEFDS0FHRV9OQU1FfTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfRVNUSU1BVElOR19NT0RFTFNfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICJFc3RpbWF0aW5nTW9kZWxzIiB9OyAvLyROT04tTkxTLTEkCi0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfUFJPQ0VTU19DT05UUklCVVRJT05fUEFUSCA9IHsgIlByb2Nlc3NDb250cmlidXRpb25zIiB9OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1BST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfUEFUSCA9IHsgIlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlcyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEFMTF9QUkVERUZJTkVEX1BBVEhTID0gbmV3IEhhc2hTZXQoKTsKLQotCXB1YmxpYyBTdHJpbmdbXSBjb3JlQ29udGVudFBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gcm9sZVNldFBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gZGlzY2lwbGluZURlZmluaXRpb25QYXRoOwotCi0JcHVibGljIFN0cmluZ1tdIGRvbWFpblBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gdG9vbFBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCi0JcHVibGljIFN0cmluZ1tdIGRlbGl2ZXJ5UHJvY2Vzc1BhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gd29ya1Byb2R1Y3RUeXBlUGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSBwcm9jZXNzQ29udHJpYnV0aW9uUGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSBjdXN0b21DYXRlZ29yeVBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gZXN0aW1hdGluZ01vZGVsUGF0aDsKLQkKLQlwdWJsaWMgU3RyaW5nW10gc3RhbmRhcmRDYXRlZ29yeVBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoOwotCi0JLyoqCi0JICogdGhpcyBpcyB0aGUgbWV0aG9kIHRvIHJldHVybiBhbGwgdGhlIHN5c3RlbSBkZWZpbmVkIHBhY2thZ2UgcGF0aCBQbGVhc2UKLQkgKiBhZGQgdGhpcyB0aGlzIGFycmF5IHdoZW4gZXZlciB5b3UgaGF2ZSBuZXcgc3lzdGVtIHBhY2thZ2VzIGRlZmluZWQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdW10gZ2V0QWxsU3lzdGVtUGF0aHMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW11bXSB7IGNvcmVDb250ZW50UGF0aCwgcm9sZVNldFBhdGgsCi0JCQkJZGlzY2lwbGluZURlZmluaXRpb25QYXRoLCBkb21haW5QYXRoLCB0b29sUGF0aCwKLQkJCQljYXBhYmlsaXR5UGF0dGVyblBhdGgsIGRlbGl2ZXJ5UHJvY2Vzc1BhdGgsCi0JCQkJd29ya1Byb2R1Y3RUeXBlUGF0aCwgcHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgsCi0JCQkJY3VzdG9tQ2F0ZWdvcnlQYXRoLCBzdGFuZGFyZENhdGVnb3J5UGF0aCwKLQkJCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZVBhdGgsIH07Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdW10gZ2V0Q2F0ZWdvcnlQYXRocygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXVtdIHsgcm9sZVNldFBhdGgsIGRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCwKLQkJCQlkb21haW5QYXRoLCB0b29sUGF0aCwgd29ya1Byb2R1Y3RUeXBlUGF0aCwKLQkJCQlzdGFuZGFyZENhdGVnb3J5UGF0aCwgY3VzdG9tQ2F0ZWdvcnlQYXRoLCB9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvTGluZXMoU3RyaW5nW10gcGF0aCkgewotCQlTdHJpbmdCdWZmZXIgbGluZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBtYXggPSBwYXRoLmxlbmd0aCAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCWxpbmVzLmFwcGVuZChwYXRoW2ldKS5hcHBlbmQoJ1xuJyk7Ci0JCX0KLQkJbGluZXMuYXBwZW5kKHBhdGhbbWF4XSk7Ci0JCXJldHVybiBsaW5lcy50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvRmlsZVBhdGgoU3RyaW5nW10gcGF0aCkgewotCQlTdHJpbmdCdWZmZXIgbGluZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBtYXggPSBwYXRoLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJbGluZXMuYXBwZW5kKHBhdGhbaV0pLmFwcGVuZCgnLycpOwotCQl9Ci0JCXJldHVybiBsaW5lcy50b1N0cmluZygpOwotCX0KLQotCXN0YXRpYyB7Ci0JCURFRkFVTFQuY29yZUNvbnRlbnRQYXRoID0gREVGQVVMVF9DT1JFX0NPTlRFTlRfUEFUSDsKLQkJREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGggPSBERUZBVUxUX0RJU0NJUExJTkVfREVGX1BBVEg7Ci0JCURFRkFVTFQucm9sZVNldFBhdGggPSBERUZBVUxUX1JPTEVfU0VUX1BBQ0tBR0VfUEFUSDsKLQkJREVGQVVMVC5kb21haW5QYXRoID0gREVGQVVMVF9ET01BSU5fUEFUSDsKLQkJREVGQVVMVC50b29sUGF0aCA9IERFRkFVTFRfVE9PTF9QQVRIOwotCQlERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCA9IERFRkFVTFRfQ0FQQUJJTElUWV9QQVRURVJOX1BBVEg7Ci0JCURFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCA9IERFRkFVTFRfREVMSVZFUllfUFJPQ0VTU19QQVRIOwotCQlERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGggPSBERUZBVUxUX1dPUktfUFJPRFVDVF9UWVBFX1BBVEg7Ci0JCURFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGggPSBERUZBVUxUX1BST0NFU1NfQ09OVFJJQlVUSU9OX1BBVEg7Ci0JCURFRkFVTFQuc3RhbmRhcmRDYXRlZ29yeVBhdGggPSBERUZBVUxUX1NUQU5EQVJEX0NBVEVHT1JZX1BBVEg7Ci0JCURFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoID0gREVGQVVMVF9DVVNUT01fQ0FURUdPUllfUEFUSDsKLQkJREVGQVVMVC5lc3RpbWF0aW5nTW9kZWxQYXRoID0gREVGQVVMVF9FU1RJTUFUSU5HX01PREVMU19QQVRIOwotCQlERUZBVUxULnByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGF0aCA9IERFRkFVTFRfUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9QQVRIOwotCi0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQuY29yZUNvbnRlbnRQYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQucm9sZVNldFBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5kb21haW5QYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQudG9vbFBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCkpOwotCQlBTExfUFJFREVGSU5FRF9QQVRIUy5hZGQodG9GaWxlUGF0aChERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQuc3RhbmRhcmRDYXRlZ29yeVBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5lc3RpbWF0aW5nTW9kZWxQYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTCi0JCQkJLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQucHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzQ29udHJpYnV0aW9uUGFja2FnZSgKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJLy8gYm9vbGVhbiBvbGQgPSBwbHVnaW4uZURlbGl2ZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIGNyZWF0ZSBQcm9jZXNzQ29udHJpYnV0aW9ucyBwcm9jZXNzIHBhY2thZ2UKLQkJCS8vCi0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJcGtnLnNldE5hbWUoTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5wcm9jZXNzQ29udHJpYnV0aW9uUGF0aFswXSk7Ci0KLQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uCi0JCQkvLwotCQkJcGx1Z2luLmVTZXREZWxpdmVyKGZhbHNlKTsKLQotCQkJcGx1Z2luLmdldE1ldGhvZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCQlyZXR1cm4gcGtnOwotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSBvcmlnaW5hbCBub3RpZmFjdGlvbiBzZXR0aW5nCi0JCQkvLwotCQkJcGx1Z2luLmVTZXREZWxpdmVyKHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZVBhY2thZ2UoCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCS8vIGJvb2xlYW4gb2xkID0gcGx1Z2luLmVEZWxpdmVyKCk7Ci0JCXRyeSB7Ci0JCQkvLyBjcmVhdGUgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVzIHByb2Nlc3MgcGFja2FnZQotCQkJLy8KLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQlwa2cuc2V0TmFtZShNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGF0aFswXSk7Ci0KLQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uCi0JCQkvLwotCQkJcGx1Z2luLmVTZXREZWxpdmVyKGZhbHNlKTsKLQotCQkJcGx1Z2luLmdldE1ldGhvZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCQlyZXR1cm4gcGtnOwotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSBvcmlnaW5hbCBub3RpZmFjdGlvbiBzZXR0aW5nCi0JCQkvLwotCQkJcGx1Z2luLmVTZXREZWxpdmVyKHRydWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9QbHVnaW5VSVBhY2thZ2VzTWFwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9QbHVnaW5VSVBhY2thZ2VzTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkMzg2YWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUGx1Z2luVUlQYWNrYWdlc01hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0vKioKLSAqIEhvbGRzIGEgbWFwIG9mIFBsdWdpbiBQYWNrYWdlIG5hbWVzIHRvIHRoZSBsaXN0IG9mIHBsdWdpbnMgY29udGFpbmVkIGJ5IHRoZW0KLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblVJUGFja2FnZXNNYXAgZXh0ZW5kcyBIYXNoTWFwPFN0cmluZywgU2V0PE1ldGhvZFBsdWdpbj4+IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MzIxMzc5MDE1ODcwMDkwMjU2TDsKLQotCXB1YmxpYyBQbHVnaW5VSVBhY2thZ2VzTWFwKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIHBhY2thZ2VOYW1lLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCVNldDxNZXRob2RQbHVnaW4+IHBsdWdpbnMgPSBnZXQocGFja2FnZU5hbWUpOwotCQlpZiAocGx1Z2lucyA9PSBudWxsKSB7Ci0JCQlwbHVnaW5zID0gbmV3IEhhc2hTZXQ8TWV0aG9kUGx1Z2luPigpOwotCQl9Ci0JCXBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCXB1dChwYWNrYWdlTmFtZSwgcGx1Z2lucyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUHJlZGVjZXNzb3JMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9QcmVkZWNlc3Nvckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzViZGQ3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9QcmVkZWNlc3Nvckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcHJlZGVjZXNzb3IgbGlzdCBvZiBhbiBpdGVtIHByb3ZpZGVyIGZvciBhIHdvcmsKLSAqIGJyZWFrZG93biBlbGVtZW50LiBJdCBjYWxjdWxhdGVzIHRoZSBwcmVkZWNlc3NvcnMgYmFzZWQgb24gdGhlIGN1cnJlbnRseQotICogc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBhbmQgYWNjb3JkaW5nIHRvIHZhcmlhYmlsaXR5IHJ1bGVzLiBJdCBjYW4gcmVmcmVzaAotICogaXRzZWxmIHVwb24gY2hhbmdlIGluIHByZWRlY2Vzc29yIGxpc3Qgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByZWRlY2Vzc29yTGlzdCBleHRlbmRzIEFycmF5TGlzdCB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNjE3ODUzMDkyNTcwNDEyMDgyTDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGVjZXNzb3JMaXN0IEVNUFRZX0xJU1QgPSBuZXcgUHJlZGVjZXNzb3JMaXN0KCkgewotCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzkwNDY3NjA5ODIxNzA5NzAxNkw7Ci0KLQkJcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKLQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbiBjKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIGphdmEudXRpbC5Db2xsZWN0aW9uIGMpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgT2JqZWN0IG9iamVjdDsKLQotCXByaXZhdGUgQWRhcHRlciBsaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJCXJlZnJlc2goKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvckxpc3QoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaXN0KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQllLmVBZGFwdGVycygpLmFkZCgwLCBsaXN0ZW5lcik7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCWlmIChlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJKChFT2JqZWN0KSBlKS5lQWRhcHRlcnMoKS5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0JCWNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmlnaHQgdG9wIGl0ZW0gaW4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdHJlZSB0byBzZWFyY2ggZm9yCi0JICogaXRlbSBwcm92aWRlcnMgb2YgcHJlZGVjZXNzb3JzCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFRvcEl0ZW0oKSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCQlpZiAoaXRlbVByb3ZpZGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCS8vIHRoaXMgcmVwcmVzZW50cyBhbiBpbmhlcml0ZWQgYnJlYWtkb3duIGVsZW1lbnQKLQkJCQkvLwotCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKTsKLQotCQkJCU9iamVjdCB0b3AgPSBpdGVtUHJvdmlkZXI7Ci0JCQkJZm9yIChPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChvYmplY3QpOyBwYXJlbnQgIT0gbnVsbDspIHsKLQkJCQkJdG9wID0gcGFyZW50OwotCQkJCQlCcmVha2Rvd25FbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbAotCQkJCQkJCS51bndyYXAocGFyZW50KTsKLQkJCQkJUHJvY2VzcyBwYXJlbnRQcm9jID0gVG5nVXRpbAotCQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKHBhcmVudEVsZW1lbnQpOwotCQkJCQlpZiAocGFyZW50UHJvYyAhPSBwcm9jKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJCQlwYXJlbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50KQotCQkJCQkJCQkuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChwYXJlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0b3A7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBpdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJb2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0VG9wSXRlbSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0KLQkJaWYgKFRuZ1V0aWwudW53cmFwKG9iamVjdCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbAotCQkJCQkudW53cmFwKG9iamVjdCk7Ci0JCQlMaXN0IHdvcmtPcmRlcnMgPSBlLmdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0JCQlpZiAod29ya09yZGVycy5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuOwotCQkJT2JqZWN0IHRvcCA9IGdldFRvcEl0ZW0oKTsKLQkJCUFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LCB0b3ApOwotCi0JCQkvLyBjb3B5IHRoZSB0cmVlIHRvIGEgbWFwIG9mIGJyZWFrZG93biBlbGVtZW50IC8gaXRlbSBwcm92aWRlciBmb3IKLQkJCS8vIHJldXNlCi0JCQkvLwotCQkJSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBiZSA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQkJT2JqZWN0IGlwID0gYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQltYXAucHV0KGJlLCBpcCk7Ci0JCQkJaWYgKGJlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGJlOwotCQkJCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCW1hcC5wdXQodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCBpcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXdvcmtPcmRlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJaW50IG4gPSB3b3JrT3JkZXJzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgd29ya09yZGVycy5nZXQoaSk7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnQgcHJlZCA9IHdvcmtPcmRlci5nZXRQcmVkKCk7Ci0KLQkJCQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgbWFwCi0JCQkJCQkJLmdldChwcmVkKTsKLQkJCQkJaWYgKGJzSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJCWFkZChic0l0ZW1Qcm92aWRlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKCkgewotCQljbGVhcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uI3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdG9VblN1cHByZXNzZWRTdHJpbmcobnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1VuU3VwcHJlc3NlZFN0cmluZyhTdXBwcmVzc2lvbiBzdXApIHsKLQkJLy8gcmVtb3ZlIHRoZSBpdGVtIHByb3ZpZGVycyBvZiB0aGUgZGVsZXRlZCBlbGVtZW50cwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJZSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJaWYgKGUgPT0gbnVsbCkgewotCQkJCQkvLyBvYmplY3QgZGVsZXRlZAotCQkJCQkvLwotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgZTsKLQkJCQlBY3Rpdml0eSBzdXBlckFjdCA9IGJlLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCWlmIChzdXBlckFjdCA9PSBudWxsICYmIFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiZSkgIT0gYmUpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaXNFbXB0eSgpKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG4gPSBzaXplKCkgLSAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0KGkpOwotCQkJaWYgKChzdXAgPT0gbnVsbCkgfHwgIXN1cC5pc1N1cHByZXNzZWQoYnNJdGVtUHJvdmlkZXIpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChic0l0ZW1Qcm92aWRlci5nZXRJZCgpKS5hcHBlbmQoJywnKTsKLQkJCX0KLQkJfQotCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXQobik7Ci0JCWlmICgoc3VwID09IG51bGwpIHx8ICFzdXAuaXNTdXBwcmVzc2VkKGJzSXRlbVByb3ZpZGVyKSkgewotCQkJc3RyQnVmLmFwcGVuZChic0l0ZW1Qcm92aWRlci5nZXRJZCgpKTsKLQkJfQotCi0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1Byb2Nlc3NVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Qcm9jZXNzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNzhjNDY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1Byb2Nlc3NVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Db21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5EZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUHJvY2Vzc0NvbW1hbmRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLldCU0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5OYW1lQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdGhhdCBkZWZpbmVzIHN0YXRpYyBtZXRob2RzIGZvciBwcm9jZXNzIGF1dGhvcmluZwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb2Nlc3NVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIE9CU0VjbGFzc2VzID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gV0JTRWNsYXNzZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBQQlNFY2xhc3NlcyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGdldEV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcygpIHsKLQkJaWYgKGV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcyA9PSBudWxsKSB7Ci0JCQlleHRlbmRBbmRMb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlleHRlbmRBbmRMb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5VHlwZXMKLQkJCQkJLmFkZChWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKTsKLQkJCWV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcwotCQkJCQkuYWRkKFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0JyZWFrZG93bkVsZW1lbnROYW1lKAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIEJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoYWRhcHRlckZhY3RvcnksIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tCcmVha2Rvd25FbGVtZW50TmFtZSgKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBuYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkKSB7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoYWRhcHRlckZhY3RvcnksIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIEJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCS8vIG1pZ2h0IGFsbG93IGVtcHR5IHByZXNlbnRhdGlvbiBuYW1lIGZvciBleHRlbmRlciBvciBjb250cmlidXRvci4gVGhlIGVsZW1lbnQgd2lsbCBpbmhlcml0Ci0JCS8vIHRoZSBwcmVzZW50YXRpb24gbmFtZSBmcm9tIHRoZSBiYXNlIGVsZW1lbnQuIENoZWNrIHdpbGwgYmUgcGVyZm9ybWVkIG9uIHRoZSBpbmhlcml0ZWQgbmFtZQotCQkvLwotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKGlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGUpKSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBiYXNlID0gKEJyZWFrZG93bkVsZW1lbnQpICgoVmFyaWFiaWxpdHlFbGVtZW50KSBlKQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQluYW1lID0gZ2V0UHJlc2VudGF0aW9uTmFtZShiYXNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCBuYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgQnJlYWtkb3duRWxlbWVudCBlLCBTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIGJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgewotCi0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoYWRhcHRlckZhY3RvcnksIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRSb290UHJvY2VzcyhBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciwgT2JqZWN0IG9iaikgewotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQob2JqKTsKLQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwYXJlbnQsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gb2JqOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldFJvb3RQcm9jZXNzKGFkYXB0ZXJGYWN0b3J5LCBhZGFwdGVyLCBwYXJlbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFdCU0VjbGFzc2VzKCkgewotCQlpZiAoV0JTRWNsYXNzZXMgPT0gbnVsbCkgewotCQkJV0JTRWNsYXNzZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJV0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCkpOwotCQkJV0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCkpOwotCQkJV0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpKTsKLQkJfQotCQlyZXR1cm4gV0JTRWNsYXNzZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldE9CU0VjbGFzc2VzKCkgewotCQlpZiAoT0JTRWNsYXNzZXMgPT0gbnVsbCkgewotCQkJT0JTRWNsYXNzZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJT0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCkpOwotCQkJT0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCkpOwotCQkJT0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpKTsKLQkJCU9CU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpKTsKLQkJCU9CU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlKCkpOwotCQl9Ci0KLQkJcmV0dXJuIE9CU0VjbGFzc2VzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRQQlNFY2xhc3NlcygpIHsKLQkJaWYgKFBCU0VjbGFzc2VzID09IG51bGwpIHsKLQkJCVBCU0VjbGFzc2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCVBCU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSk7Ci0JCQlQQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSk7Ci0JCQlQQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCkpOwotCQl9Ci0JCXJldHVybiBQQlNFY2xhc3NlczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGaXJzdEVsZW1lbnQoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlciwgT2JqZWN0IG9iaikgewotCQlPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChvYmopOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJTGlua2VkTGlzdCBzaWJsaW5ncyA9IGdldFNpYmxpbmdzKGFkYXB0ZXJGYWN0b3J5LCBpdGVtUHJvdmlkZXIsIG9iaik7Ci0JCWlmIChzaWJsaW5ncyAhPSBudWxsICYmICFzaWJsaW5ncy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBzaWJsaW5ncy5nZXRGaXJzdCgpID09IG9iajsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpbmtlZExpc3QgZ2V0U2libGluZ3MoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlciwgT2JqZWN0IG9iaikgewotCQlPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChvYmopOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHBhcmVudEl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKHBhcmVudEl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IExpbmtlZExpc3QocGFyZW50SXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xhc3RFbGVtZW50KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBpdGVtUHJvdmlkZXIsIE9iamVjdCBvYmopIHsKLQkJT2JqZWN0IHBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKQotCQkJcmV0dXJuIHRydWU7Ci0JCUxpbmtlZExpc3Qgc2libGluZ3MgPSBnZXRTaWJsaW5ncyhhZGFwdGVyRmFjdG9yeSwgaXRlbVByb3ZpZGVyLCBvYmopOwotCQlpZiAoc2libGluZ3MgIT0gbnVsbCAmJiAhc2libGluZ3MuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gc2libGluZ3MuZ2V0TGFzdCgpID09IG9iajsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGFmZmVjdGVkIGFmdGVyIHRoZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUKLQkgKiBnaXZlbiBub3RpZmljYXRpb24uCi0JICogCi0JICogQHBhcmFtIG5vdGlmaWNhdGlvbgotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFmZmVjdGVkRWxlbWVudHMoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwKLQkJCUlGaWx0ZXIgZmlsdGVyKSB7Ci0JCUxpc3QgYWZmZWN0ZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJT2JqZWN0IG9iaiA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQob2JqKSkgewotCQkJCWFmZmVjdGVkRWxlbWVudHMuYWRkKG9iaik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQlhZmZlY3RlZEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJb2JqID0gbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0JCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChvYmopKSB7Ci0JCQkJYWZmZWN0ZWRFbGVtZW50cy5hZGQob2JqKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCWFmZmVjdGVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQlvYmogPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBvYmopLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCQlhZmZlY3RlZEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQob2JqKSkgewotCQkJCQlhZmZlY3RlZEVsZW1lbnRzLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBhZmZlY3RlZEVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlZnJlc2hSZXF1aXJlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJSUZpbHRlciBmaWx0ZXIpIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQlPYmplY3Qgb2JqID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChvYmopKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJb2JqID0gbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0JCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChvYmopKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgotCQkJb2JqID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgb2JqKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRvQ29udGFpbmVyKEJyZWFrZG93bkVsZW1lbnQgZSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgaXRlbVByb3ZpZGVyKSB7Ci0JCWFkZFRvQ29udGFpbmVyKGUsIGl0ZW1Qcm92aWRlciwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gQnJlYWtkb3duRWxlbWVudCB0byBhIG5ldyBjb250YWluZXIgaWYgaXQgZG9lcyBub3QgaGF2ZQotCSAqIG9uZSBvciBtb3ZlcyBpdCB0byB0aGUgcmlnaHQgY29udGFpbmVyIGlmIHJlcXVlc3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBpdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVG9Db250YWluZXIoQnJlYWtkb3duRWxlbWVudCBlLAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBpdGVtUHJvdmlkZXIsIGJvb2xlYW4gbW92ZSkgewotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBudWxsOwotCQlPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChlKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVPYmplY3QgY29udGFpbmVyID0gKChFT2JqZWN0KSBwYXJlbnQpLmVDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXBrZyA9IChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyOwotCQkJfQotCQl9Ci0KLQkJaWYgKHBrZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGU7Ci0JCQlpZiAoYWN0LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIG5ldyBQcm9jZXNzUGFja2FnZSBmb3IgdGhlIGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlQcm9jZXNzUGFja2FnZSBuZXdQa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQkJbmV3UGtnLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCQkJcGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQobmV3UGtnKTsKLQkJCQluZXdQa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKGUpOwotCQkJfSBlbHNlIGlmIChtb3ZlKSB7Ci0JCQkJLy8gQ2hlY2sgaWYgdGhlIGFjdGl2aXR5J3MgUHJvY2Vzc1BhY2thZ2UgaXMgYXQgdGhlIHJpZ2h0IHBsYWNlLgotCQkJCS8vIElmIG5vdCwgbW92ZSBpdCB0byB0aGUgcmlnaHQgUHJvY2Vzc0NvbXBvbmVudC4KLQkJCQkvLwotCQkJCVByb2Nlc3NQYWNrYWdlIG9sZFBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0LmVDb250YWluZXIoKTsKLQkJCQlpZiAob2xkUGtnLmVDb250YWluZXIoKSAhPSBwa2cpIHsKLQkJCQkJcGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQob2xkUGtnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoZSk7Ci0JCQl9IGVsc2UgaWYgKG1vdmUgJiYgZS5lQ29udGFpbmVyKCkgIT0gcGtnKSB7Ci0JCQkJLy8gbW92ZSB0byBuZXcgUHJvY2Vzc1BhY2thZ2UKLQkJCQkvLwotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBjaGlsZCwgT2JqZWN0IHBhcmVudCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoY2hpbGQsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCSgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQocGFyZW50KTsKLQkJfSAKLS8vCQllbHNlIHsKLS8vCQkJU3lzdGVtLm91dAotLy8JCQkJCS5wcmludGxuKExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NldHBhcmVudCArIGNoaWxkKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJLnByaW50bG4oTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9jaGlsZGFkYXB0ZXIgKyBhZGFwdGVyKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IFJvbGVEZXNjcmlwdG9yIGZyb20gdGhlIGdpdmVuIHJvbGUuCi0JICogCi0JICogQHBhcmFtIHJvbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBSb2xlRGVzY3JpcHRvciBjcmVhdGVSb2xlRGVzY3JpcHRvcihSb2xlIHJvbGUpIHsKLQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpOwotCQlyb2xlRGVzYy5zZXRSb2xlKHJvbGUpOwotCQlTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IHJvbGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQlyb2xlRGVzYy5zZXROYW1lKHJvbGUuZ2V0TmFtZSgpKTsKLQkJcm9sZURlc2Muc2V0UHJlc2VudGF0aW9uTmFtZShTdHJVdGlsLmlzQmxhbmsocHJlc2VudGF0aW9uTmFtZSkgPyByb2xlCi0JCQkJLmdldE5hbWUoKSA6IHByZXNlbnRhdGlvbk5hbWUpOwotCQkvLyByb2xlRGVzYy5zZXRCcmllZkRlc2NyaXB0aW9uKHJvbGUuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJcmV0dXJuIHJvbGVEZXNjOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigKLQkJCVdvcmtQcm9kdWN0IHdwKSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQkJd3BEZXNjLnNldFdvcmtQcm9kdWN0KHdwKTsKLQkJd3BEZXNjLnNldE5hbWUod3AuZ2V0TmFtZSgpKTsKLQkJd3BEZXNjCi0JCQkJLnNldFByZXNlbnRhdGlvbk5hbWUoU3RyVXRpbC5pc0JsYW5rKHdwLmdldFByZXNlbnRhdGlvbk5hbWUoKSkgPyB3cAotCQkJCQkJLmdldE5hbWUoKQotCQkJCQkJOiB3cC5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkvLyB3cERlc2Muc2V0QnJpZWZEZXNjcmlwdGlvbih3cC5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQlyZXR1cm4gd3BEZXNjOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVmlld2VyIGdldFZpZXdlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgUHJvY2VzcyBwcm9jKSB7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgKLQkJCQkJKChFeHBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGxpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNvbnRlbnRQcm92aWRlciAmJiBsaXN0ZW5lciBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewkJCQkJCi0JCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcikgbGlzdGVuZXIpLmdldFZpZXdlcigpOwotCQkJCQlpZiAodmlld2VyLmdldElucHV0KCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQkJJiYgKChQcm9jZXNzQ29tcG9uZW50KSB2aWV3ZXIuZ2V0SW5wdXQoKSkKLQkJCQkJCQkJCS5nZXRQcm9jZXNzKCkgPT0gcHJvYykKLQkJCQkJCXJldHVybiB2aWV3ZXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZWZyZXNoTmVlZGVkKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIpIHsKLQkJUHJvY2VzcyBwcm9jZXNzID0gKFByb2Nlc3MpIGl0ZW1Qcm92aWRlci5nZXRUb3BJdGVtKCk7Ci0JCWlmIChwcm9jZXNzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIGdpdmVuIHByb2Nlc3MgaXMgY3VycmVudGx5IG9wZW5lZCBpbiBlZGl0b3IKLQkJLy8KLQkJVmlld2VyIHZpZXdlciA9IGdldFZpZXdlcihhZGFwdGVyRmFjdG9yeSwgcHJvY2Vzcyk7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwKLQkJCQkmJiAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gVG5nVXRpbC5nZXRDb250cmlidXRvcnMocHJvY2Vzcyk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChyZWZyZXNoTmVlZGVkKGFkYXB0ZXJGYWN0b3J5LCBhZGFwdGVyKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKHByb2Nlc3MsCi0JCQkJVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChyZWZyZXNoTmVlZGVkKGFkYXB0ZXJGYWN0b3J5LCBhZGFwdGVyKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQcmVkZWNjZXNzb3JMaXN0cyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MpIHsKLQkJT2JqZWN0IG9iajsKLQkJT2JqZWN0IGVsZW1lbnQ7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihmYWN0b3J5LCBwcm9jKTsgaXRlcgotCQkuaGFzTmV4dCgpOykgewotCQkJb2JqID0gaXRlci5uZXh0KCk7Ci0JCQllbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCU9iamVjdCBhZGFwdGVyID0gZmFjdG9yeS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsJCQkJCi0JCQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJCQlQcmVkZWNlc3Nvckxpc3QgcHJlZExpc3QgPSBpdGVtUHJvdmlkZXIuZ2V0UHJlZGVjZXNzb3JzKCk7Ci0JCQkJCWlmKHByZWRMaXN0ICE9IG51bGwpIHsKLQkJCQkJCXByZWRMaXN0LnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGVzIElEcyBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50cyBvZiB0aGUgdmlldyBvZiB0aGUgZ2l2ZW4gcHJvY2VzcwotCSAqIAotCSAqIEBwYXJhbSBmYWN0b3J5Ci0JICogICAgICAgICAgICBhZGFwdGVyIGZhY3Rvcnkgb2YgdGhlIGN1cnJlbnQgcHJvY2VzcyB2aWV3IChXQlMsIFRCUywgV1BCUywKLQkgKiAgICAgICAgICAgIENCUykKLQkgKiBAcGFyYW0gcHJvYwotCSAqICAgICAgICAgICAgbXVzdCBiZSByZWZyZXNoZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUlEcyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MpIHsKLQkJaW50IGlkID0gMDsKLQkJT2JqZWN0IG9iajsKLQkJLy8gTWFwIGNoYW5nZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihmYWN0b3J5LCBwcm9jKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlvYmogPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBhZGFwdGVyID0gZmFjdG9yeS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJCWlmIChpdGVtUHJvdmlkZXIgIT0gbnVsbAotCQkJCQkJJiYgVG5nVXRpbC51bndyYXAob2JqKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWl0ZW1Qcm92aWRlci5zZXRJZChpZCsrKTsKLQkJCQkJLy8gY2hhbmdlTWFwLnB1dChvYmosIGl0ZW1Qcm92aWRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcmVmcmVzaCB0aGUgbGFiZWwKLQkJLy8KLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNoYW5nZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCS8vIGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJLy8gTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkvLyBJQ2hhbmdlTm90aWZpZXIgYWRhcHRlciA9IChJQ2hhbmdlTm90aWZpZXIpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCS8vIG9iaiA9IGVudHJ5LmdldEtleSgpOwotCQkvLyBhZGFwdGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obmV3Ci0JCS8vIE5vdGlmaWNhdGlvbkltcGwoTm90aWZpY2F0aW9uLlNFVCwgb2JqLCBvYmopLCBvYmosIGZhbHNlLCB0cnVlKSk7Ci0JCS8vIH0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFZpZXdlcihBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MpIHsKLQkJZmluYWwgVmlld2VyIHZpZXdlciA9IGdldFZpZXdlcihmYWN0b3J5LCBwcm9jKTsKLQkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlci5nZXRDb250cm9sKCkgIT0gbnVsbAotCQkJCSYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bkluVUlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBlbGVtZW50IElEcyBpbiB0aG9zZSB2aWV3ZXJzIHRoYXQgcmVxdWlyZSB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoSURzSW5WaWV3ZXJzKGZpbmFsIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuSW5VSVRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KAotCQkJCQkJYWRhcHRlckZhY3RvcnkuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNvbnRlbnRQcm92aWRlciAmJiBsaXN0ZW5lciBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewkJCQkJCi0JCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpIGxpc3RlbmVyKS5nZXRWaWV3ZXIoKTsKLQkJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwKLQkJCQkJCQkJJiYgIXZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpCi0JCQkJCQkJCSYmIHZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgdmlld2VyLmdldElucHV0KCkpCi0JCQkJCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCQkuYWRhcHQocHJvYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCQlpZiAoaXRlbVByb3ZpZGVyLmlzUmVmcmVzaEFsbElEc1JlcXVpcmVkKCkpIHsKLQkJCQkJCQkJdXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBwcm9jKTsKLQkJCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQkJaXRlbVByb3ZpZGVyLnNldFJlZnJlc2hBbGxJRHNSZXF1aXJlZChmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoQWxsVmlld2VycyhmaW5hbCBFeHBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bkluVUlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5LmdldENoYW5nZUxpc3RlbmVycygpKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGxpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElDb250ZW50UHJvdmlkZXIgJiYgbGlzdGVuZXIgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsJCQkJCQotCQkJCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKSBsaXN0ZW5lcikuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsCi0JCQkJCQkJCSYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKQotCQkJCQkJCQkmJiB2aWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgdGhlIGJyZWFrZG93biBlbGVtZW50IHdob3NlIHByZWRlY2Vzc29yIGxpc3QgdG8gYmUgY2hlY2tlZC4KLQkgKiBAcGFyYW0gcHJlZElkTGlzdAotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIHByZWRlY2Vzc29yIElEcyAoSW50ZWdlcikgYXMgc2hvd24gaW4gdGhlIElEIGNvbHVtbgotCSAqICAgICAgICAgICAgb2YgdGhlIGVkaXRvcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogQHBhcmFtIHByZWRlY2Vzc29ycwotCSAqICAgICAgICAgICAgb3V0cHV0LCB0aGUgcHJlZGVjZXNzb3IgbGlzdAotCSAqIEByZXR1cm4gbnVsbCBpZiBwcmVkTGlzdCBpcyB2YWxpZCwgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1ByZWRlY2Vzc29yTGlzdChXb3JrQnJlYWtkb3duRWxlbWVudCBlLAotCQkJTGlzdCBwcmVkSWRMaXN0LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IHByb2Nlc3MsCi0JCQlMaXN0IHByZWRlY2Vzc29ycykgewotCQkvLyBnZXQgQnJlYWtkb3duRWxlbWVudCBsaXN0IGZyb20gSUQgbGlzdAotCQkvLwotCQlMaXN0IGJlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBhbGxFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LAotCQkJCXByb2Nlc3MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJSW50ZWdlciBpZCA9IG5ldyBJbnRlZ2VyKGl0ZW1Qcm92aWRlci5nZXRJZCgpKTsKLQkJCW9iaiA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQlhbGxFbGVtZW50cy5hZGQob2JqKTsKLQkJCWlmIChwcmVkSWRMaXN0LmNvbnRhaW5zKGlkKSkgewotCQkJCWJlTGlzdC5hZGQob2JqKTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGZvciBjaXJjdWxhciBkZXBlbmRlbmN5Ci0JCS8vCi0JCWludCBzaXplID0gYmVMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBiZUxpc3QuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgb2JqOwotCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0NpcmN1bGFyKGUsIHByZWQsIGFsbEVsZW1lbnRzKSkgewotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9icmVha2Rvd25fZWxlbWVudDsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoVG5nVXRpbC5pc1N1YmVsZW1lbnRPZihwcmVkLCBlLCBhZGFwdGVyRmFjdG9yeSkpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfc3ViX2VsZW1lbnQ7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKFRuZ1V0aWwuaXNTdXBlckVsZW1lbnRPZihwcmVkLCBlLCBhZGFwdGVyRmFjdG9yeSkpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHByZWRlY2Vzc29ycyAhPSBudWxsKQotCQkJcHJlZGVjZXNzb3JzLmFkZEFsbChiZUxpc3QpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKiAKLQkgKiBAcGFyYW0gc3VjY2Vzc29yCi0JICogQHBhcmFtIHByZWRlY2Vzc29yCi0JICogQHBhcmFtIGxpc3QKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGFsbCBicmVha2Rvd24gZWxlbWVudHMgaW4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUKLQkgKi8KLQkvLyBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tDaXJjdWxhcihXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjZXNzb3IsCi0JLy8gV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZGVjZXNzb3IsIExpc3QgbGlzdCkgewotCS8vIGlmKHN1Y2Nlc3NvciA9PSBwcmVkZWNlc3NvcikgewotCS8vIGlmKHByZWRlY2Vzc29yLmdldElzUmVwZWF0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyB9Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcHJlZGVjZXNzb3IuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOwotCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIFdvcmtPcmRlciBlbGVtZW50ID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JLy8gV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IGVsZW1lbnQuZ2V0UHJlZCgpOwotCS8vIGlmKHByZWQgIT0gcHJlZGVjZXNzb3IgJiYgbGlzdC5jb250YWlucyhwcmVkKSkgewotCS8vIGlmKGNoZWNrQ2lyY3VsYXIoc3VjY2Vzc29yLCBwcmVkLCBsaXN0KSkgcmV0dXJuIHRydWU7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0NpcmN1bGFyKFdvcmtCcmVha2Rvd25FbGVtZW50IHN1Y2Nlc3NvciwKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWRlY2Vzc29yLCBMaXN0IGxpc3QpIHsKLQkJLy8gaWYoc3VjY2Vzc29yID09IHByZWRlY2Vzc29yKSB7Ci0JCS8vIGlmKHByZWRlY2Vzc29yLmdldElzUmVwZWF0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCS8vIHJldHVybiBmYWxzZTsgLy8gaWYgb2sgcmV0dXJuIGZhbHNlIG1lYW5zIGFsbG93ZWQuCi0JCS8vIH0KLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gTGlzdCBwcmVkZWNlc3NvcnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBnZXRBbGxQcmVkZWNlc3Nvckxpc3QocHJlZGVjZXNzb3IsIGxpc3QsIHByZWRlY2Vzc29yc0xpc3QpOwotCQkvLyBpZighcHJlZGVjZXNzb3JzTGlzdC5pc0VtcHR5KCkpewotCQkvLyBmb3IoSXRlcmF0b3IgaXRvciA9IHByZWRlY2Vzc29yc0xpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KXsKLQkJLy8gT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkvLyBpZihzdWNjZXNzb3IgPT0gb2JqKXsKLQkJLy8gaWYoKChXb3JrQnJlYWtkb3duRWxlbWVudClvYmopLmdldElzUmVwZWF0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKQotCQkvLyB7Ci0JCS8vIHJldHVybiBmYWxzZTsKLQkJLy8gfQotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxQcmVkZWNlc3Nvckxpc3QoV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZGVjZXNzb3IsCi0JCQlMaXN0IGxpc3QsIExpc3QgcHJlZExpc3QpIHsKLQkJaWYgKCFwcmVkTGlzdC5jb250YWlucyhwcmVkZWNlc3NvcikpCi0JCQlwcmVkTGlzdC5hZGQocHJlZGVjZXNzb3IpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcmVkZWNlc3Nvci5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJV29ya09yZGVyIGVsZW1lbnQgPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQKLQkJCQkJLmdldFByZWQoKTsKLQkJCWlmIChwcmVkICE9IHByZWRlY2Vzc29yICYmIGxpc3QuY29udGFpbnMocHJlZCkpIHsKLQkJCQlpZiAoIXByZWRMaXN0LmNvbnRhaW5zKHByZWQpKSB7Ci0JCQkJCXByZWRMaXN0LmFkZChwcmVkKTsKLQkJCQkJZ2V0QWxsUHJlZGVjZXNzb3JMaXN0KHByZWQsIGxpc3QsIHByZWRMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgdGhlIGJyZWFrZG93biBlbGVtZW50IHdob3NlIHByZWRlY2Vzc29yIGxpc3QgdG8gYmUgY2hlY2tlZC4KLQkgKiBAcGFyYW0gcHJlZExpc3QKLQkgKiAgICAgICAgICAgIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJlZGVjZXNzb3IgSURzCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHRvcEFjdAotCSAqIEBwYXJhbSBwcmVkZWNlc3NvcnMKLQkgKiAgICAgICAgICAgIG91dHB1dCwgdGhlIHByZWRlY2Vzc29yIGxpc3QKLQkgKiBAcGFyYW0gYWxsRWxlbWVudHMKLQkgKiAgICAgICAgICAgIG91dHB1dCwgdGhlIHdob2xlIGJyZWFrZG93biBlbGVtZW50IGxpc3QgaXMgY29waWVkIGludG8gdGhpcwotCSAqICAgICAgICAgICAgbGlzdC4KLQkgKiBAcmV0dXJuIG51bGwgaWYgcHJlZExpc3QgaXMgdmFsaWQuIFRoZSBwcmVkZWNlc3NvciBsaXN0IGlzIHNhdmVkIGluCi0JICogICAgICAgICBwcmVkZWNlc3NvcnMgYW5kIHRoZSB3aG9sZSBicmVha2Rvd24gZWxlbWVudCBsaXN0IGlzIHNhdmVkIGluCi0JICogICAgICAgICBhbGxFbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1ByZWRlY2Vzc29yTGlzdChXb3JrQnJlYWtkb3duRWxlbWVudCBlLAotCQkJU3RyaW5nIHByZWRMaXN0LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IHRvcEFjdCwKLQkJCUxpc3QgcHJlZGVjZXNzb3JzKSB7Ci0JCUxpc3QgaWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByZWRMaXN0LCAiLCIpOyB0b2tlbnMuaGFzTW9yZVRva2VucygpOykgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwotCQkJSW50ZWdlciBpZDsKLQkJCXRyeSB7Ci0JCQkJaWQgPSBuZXcgSW50ZWdlcih0b2tlbik7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZExpc3QuYWRkKGlkKTsKLQkJfQotCi0JCXJldHVybiBjaGVja1ByZWRlY2Vzc29yTGlzdChlLCBpZExpc3QsIGFkYXB0ZXJGYWN0b3J5LCB0b3BBY3QsCi0JCQkJcHJlZGVjZXNzb3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBvYmplY3QncyBtZXRob2QgcGFja2FnZSBhbmQgcGx1Z2luIHRvIHRoZSBkZWZhdWx0Ci0JICogY29uZmlndXJhdGlvbiBvZiB0aGUgZ2l2ZW4gcHJvY2VzcyBpZiB0aGV5IGFyZSBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiB5ZXQuCi0JICogCi0JICogQHBhcmFtIHByb2MKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGFkZGVkT2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKFByb2Nlc3MgcHJvYywgRU9iamVjdCBlLAotCQkJU2V0IGFkZGVkT2JqZWN0cykgewotCQkvLyBhZGQgdGhlIGVsZW1lbnQncyBtZXRob2QgcGFja2FnZSB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JCS8vCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlpZiAoZSBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCWFkZFRhc2tUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIChUYXNrKSBlLCBhZGRlZE9iamVjdHMsIHRydWUpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGU7Ci0JCQlhZGRXUFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgd3AsIGFkZGVkT2JqZWN0cyk7Ci0JCQlMaXN0IHRhc2tzID0gZ2V0VGFza3NGb3JXb3JrUHJvZHVjdCh3cCwgY29uZmlnKTsKLQkJCWlmICh0YXNrcyAhPSBudWxsKQotCQkJewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhc2tzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlhZGRUYXNrVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCAoVGFzaykgaXRlci5uZXh0KCksCi0JCQkJCQkJYWRkZWRPYmplY3RzLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQlSb2xlIHJvbGUgPSAoUm9sZSkgZTsKLQkJCWFkZFJvbGVUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIHJvbGUsIGFkZGVkT2JqZWN0cyk7Ci0KLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWFkZEFjdGl2aXR5VG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCAoQWN0aXZpdHkpIGUsIGFkZGVkT2JqZWN0cyk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQlUbmdVdGlsLmFkZFRvQ29uZmlndXJhdGlvbihjb25maWcsIChHdWlkYW5jZSkgZSwgYWRkZWRPYmplY3RzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEFjdGl2aXR5VG9EZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsIEFjdGl2aXR5IGFjdGl2aXR5LCBTZXQgYWRkZWRPYmplY3RzKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlUbmdVdGlsLmFkZFRvKGNvbmZpZywgVW1hVXRpbC5nZXRQcm9jZXNzQ29tcG9uZW50KGFjdGl2aXR5KSwgYWRkZWRPYmplY3RzKTsKLQkJLy8gYWRkIGxpbmtlZCBlbGVtZW50IG9mIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlNZXRob2RFbGVtZW50IG8gPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgZSk7Ci0JCQkJaWYobyAhPSBudWxsKSB7Ci0JCQkJCWFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgbywgYWRkZWRPYmplY3RzKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCS8vIHRoaXMgaXMgbmVlZGVkIGZvciBhZGRpbmcgc3ViLWFjdGl2aXRpZXMgZGVzY3JpcHRvcnMgCi0JCQkJYWRkQWN0aXZpdHlUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIChBY3Rpdml0eSkgZSwgYWRkZWRPYmplY3RzKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBhbGwgdGhlIGJhc2UgZWxlbWVudHMgaWYgdGhlcmUgaXMgYW55Ci0JCWZvciAoQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOyBiYXNlICE9IG51bGw7IGJhc2UgPSAoQWN0aXZpdHkpIGJhc2UKLQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJYWRkQWN0aXZpdHlUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIGJhc2UsIGFkZGVkT2JqZWN0cyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRhc2tUb0RlZmF1bHRDb25maWd1cmF0aW9uKFByb2Nlc3MgcHJvYywgVGFzayB0YXNrLAotCQkJU2V0IGFkZGVkT2JqZWN0cywgYm9vbGVhbiBpbmNsdWRlV29ya1Byb2R1Y3RzKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCi0JCVRuZ1V0aWwuYWRkVG9Db25maWd1cmF0aW9uKGNvbmZpZywgdGFzaywgYWRkZWRPYmplY3RzKTsKLQotCQkvLyBhZGQgYWxsIG90aGVyIGRlcGVuZGVuY2llcwotCQkvLwotCi0JCS8vIGFkZCByb2xlcwotCQlBcnJheUxpc3QgZGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZXBlbmRlbmNpZXMuYWRkQWxsKHRhc2suZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCWRlcGVuZGVuY2llcy5hZGQodGFzay5nZXRQZXJmb3JtZWRCeSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVwZW5kZW5jaWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVG5nVXRpbC5hZGRUb0NvbmZpZ3VyYXRpb24oY29uZmlnLCAoRU9iamVjdCkgaXRlci5uZXh0KCksCi0JCQkJCWFkZGVkT2JqZWN0cyk7Ci0JCX0KLQotCQkvLyBhZGQgd29yayBwcm9kdWN0cwotCQlpZiAoaW5jbHVkZVdvcmtQcm9kdWN0cykgewotCQkJZGVwZW5kZW5jaWVzLmNsZWFyKCk7Ci0JCQlkZXBlbmRlbmNpZXMuYWRkQWxsKHRhc2suZ2V0T3B0aW9uYWxJbnB1dCgpKTsKLQkJCWRlcGVuZGVuY2llcy5hZGRBbGwodGFzay5nZXRPdXRwdXQoKSk7Ci0JCQlkZXBlbmRlbmNpZXMuYWRkQWxsKHRhc2suZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXBlbmRlbmNpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJYWRkV1BUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIChXb3JrUHJvZHVjdCkgaXRlci5uZXh0KCksCi0JCQkJCQlhZGRlZE9iamVjdHMpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFzay5nZXRTdGVwcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHN0ZXAgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCUVPYmplY3QgYmFzZSA9IHN0ZXAuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCVRuZ1V0aWwuYWRkVG9Db25maWd1cmF0aW9uKGNvbmZpZywgYmFzZSwgYWRkZWRPYmplY3RzKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRSb2xlVG9EZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsCi0JCQlSb2xlIHJvbGUsIFNldCBhZGRlZE9iamVjdHMpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBwcm9jLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCVRuZ1V0aWwuYWRkVG9Db25maWd1cmF0aW9uKGNvbmZpZywgcm9sZSwgYWRkZWRPYmplY3RzKTsKLQkJCi0JCS8vIGFkZCB3b3JrIHByb2R1Y3RzCi0JCUFycmF5TGlzdCBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCWRlcGVuZGVuY2llcy5hZGRBbGwocm9sZS5nZXRNb2RpZmllcygpKTsKLQkJZGVwZW5kZW5jaWVzLmFkZEFsbChyb2xlLmdldFJlc3BvbnNpYmxlRm9yKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXBlbmRlbmNpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlhZGRXUFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgKFdvcmtQcm9kdWN0KSBpdGVyLm5leHQoKSwKLQkJCQkJYWRkZWRPYmplY3RzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFdQVG9EZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsCi0JCQlXb3JrUHJvZHVjdCB3cCwgU2V0IGFkZGVkT2JqZWN0cykgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJVG5nVXRpbC5hZGRUb0NvbmZpZ3VyYXRpb24oY29uZmlnLCB3cCwgYWRkZWRPYmplY3RzKTsKLQkJaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoRGVsaXZlcmFibGUpIHdwKS5nZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJVG5nVXRpbC5hZGRUb0NvbmZpZ3VyYXRpb24oY29uZmlnLCAoRU9iamVjdCkgaXRlci5uZXh0KCksCi0JCQkJCQlhZGRlZE9iamVjdHMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVRhc2tEZXNjcmlwdG9yU3RlcHMoQWN0aXZpdHkgYWN0aXZpdHksCi0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYykgewotCQlpZiAodGFza0Rlc2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJVGFzayB0YXNrID0gdGFza0Rlc2MuZ2V0VGFzaygpOwotCi0JCUlDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWdBcHBsaWNhdG9yID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KQotCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlMaXN0IHN0ZXBzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKHRhc2ssCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpLCBjb25maWcpOwotCi0JCS8vIGFkZCB0aG9zZSBzdGVwcyB0byBUYXNrRGVzY3JpcHRvciBpZiB0aGV5IGFyZSBub3QgdGhlcmUgeWV0LgotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdGVwcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBzdGVwID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5jb250YWlucyhzdGVwKSkgewotCQkJCXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5hZGQoc3RlcCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBNZXRob2RFbGVtZW50IHRoYXQgdGhlIGdpdmVuIGRlc2NyaXB0b3IgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRBc3NvY2lhdGVkRWxlbWVudChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJcmV0dXJuICgoUm9sZURlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFJvbGUoKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRUYXNrKCk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJcmV0dXJuICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRXb3JrUHJvZHVjdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwb3NlV3JhcHBlcnMoQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCSgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgdGFza3MgdGhhdCBoYXZlIHRoZSBnaXZlbiB3b3JrcHJvZHVjdCBpbiB0aGVpciBvdXRwdXQKLQkgKiBpbiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFRhc2tzRm9yV29ya1Byb2R1Y3QoV29ya1Byb2R1Y3Qgd3AsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCi0JCUxpc3QgdGFza3MgPSAoTGlzdCkgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2Uod3AsIEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MsIGNvbmZpZyk7Ci0KLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgd29ya3Byb2R1Y3RzIHRoYXQgaGF2ZSB0aGUgcm9sZSBhcyByZXNwb25zaWJsZSByb2xlIGluIHRoZQotCSAqIGdpdmVuIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXb3JrUHJvZHVjdHNGb3JSb2xlKFJvbGUgcm9sZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUlDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWdBcHBsaWNhdG9yID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCk7Ci0JCUxpc3Qgd3BzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKHJvbGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgY29uZmlnKTsKLQkJcmV0dXJuIHdwczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB3b3JrcHJvZHVjdHMgd2hpY2ggYXJlLCBleGNlcHQgdGhlIGNvbnRyaWJ1dG9yLCBpbiB0aGUgZ2l2ZW4KLQkgKiBwbHVnaW4uCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsV29ya1Byb2R1Y3RzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQotCQlDb250ZW50UGFja2FnZSBjb3JlQ29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoY29yZUNvbnRlbnRQa2csIGZhbHNlKSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzgzMzc1MjA2NjMyNDgzNzkzN0w7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKQotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IChDb250ZW50UGFja2FnZSkgb2JqZWN0OwotCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpCi0JCQkJCQkJJiYgIVRuZ1V0aWwKLQkJCQkJCQkJCS5pc0NvbnRyaWJ1dG9yKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJTGlzdCBtZXRob2RFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCW1ldGhvZEVsZW1lbnRzLmFkZChlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGFzaywgZXhjZXB0IHRoZSBjb250cmlidXRvciwgaW4gdGhlIGdpdmVuIHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxUYXNrcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUNvbnRlbnRQYWNrYWdlIGNvcmVDb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihjb3JlQ29udGVudFBrZywgZmFsc2UpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzODMzNzUyMDY2MzI0ODM3OTM3TDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpCi0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJQ29udGVudFBhY2thZ2UgcGtnID0gKENvbnRlbnRQYWNrYWdlKSBvYmplY3Q7Ci0JCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrCi0JCQkJCQkJJiYgIVRuZ1V0aWwKLQkJCQkJCQkJCS5pc0NvbnRyaWJ1dG9yKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJTGlzdCB0YXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQkJdGFza3MuYWRkKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCXJldHVybiBUbmdVdGlsLmlzR2VuZXJhbGl6ZXIoZSwKLQkJCQlnZXRFeHRlbmRBbmRMb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5VHlwZXMoKSk7Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZShCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYgKGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpID09IG51bGwKLQkJCQl8fCBlLmdldFByZXNlbnRhdGlvbk5hbWUoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAoaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoZSkpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGJhc2UgPSAoQnJlYWtkb3duRWxlbWVudCkgKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUpCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCXJldHVybiBnZXRQcmVzZW50YXRpb25OYW1lKGJhc2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhYmVsV2l0aFBhdGgoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcihlLmdldE5hbWUoKSk7Ci0JCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKTsKLQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJcGF0aC5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwcm9jKTsKLQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCXBhdGguYXBwZW5kKHBsdWdpbi5nZXROYW1lKCkpOwotCQkJfQotCQkJaWYgKGUgIT0gcHJvYykgewotCQkJCXBhdGguYXBwZW5kKCcvJykuYXBwZW5kKHByb2MuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1vZGVsIGluZm8gb2YgdGhlIGdpdmVuIEJyZWFrZG93bkVsZW1lbnQgaW4gdGhlIGdpdmVuCi0JICogU3RyaW5nQnVmZmVyCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBtb2RlbEluZm8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0TW9kZWxJbmZvKEJyZWFrZG93bkVsZW1lbnQgZSwgT2JqZWN0IGFkYXB0ZXIsCi0JCQlTdHJpbmdCdWZmZXIgbW9kZWxJbmZvKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQlpZiAobW9kZWxJbmZvLmxlbmd0aCgpID4gMCkgewotCQkJCQltb2RlbEluZm8uYXBwZW5kKCI7ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCVN0cmluZyBwYXR0ZXJuID0gbnVsbDsKLQkJCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCkgewotCQkJCQlwYXR0ZXJuID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9jb250cmlidXRlc3RvOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCkgewotCQkJCQlwYXR0ZXJuID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9sb2NhbENvbnRyaWJ1dGVzdG87IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkgewotCQkJCQlwYXR0ZXJuID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucHJvY2Vzc19leHRlbmRzOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKSB7Ci0JCQkJCXBhdHRlcm4gPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5wcm9jZXNzX3JlcGxhY2VzOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMKSB7Ci0JCQkJCXBhdHRlcm4gPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5wcm9jZXNzX2xvY2FsUmVwbGFjZXM7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQkvLyBpZihhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCS8vIEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPQotCQkJCS8vICgoSXRlbVByb3ZpZGVyQWRhcHRlcilhZGFwdGVyKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCS8vIE9iamVjdCBpdGVtUHJvdmlkZXIgPSBmYWN0b3J5LmFkYXB0KGJhc2UsCi0JCQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkvLyBpZihpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkvLyBJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKQotCQkJCS8vIGl0ZW1Qcm92aWRlcjsKLQkJCQkvLyBQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgYnNJdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpOwotCQkJCS8vIGlmKHByb2MgIT0gbnVsbCkgewotCQkJCS8vIHN0cmJ1Zi5hcHBlbmQoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocHJvYykuZ2V0TmFtZSgpKS5hcHBlbmQoJzonKQotCQkJCS8vIC5hcHBlbmQocHJvYy5nZXROYW1lKCkpLmFwcGVuZCgnOicpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCi0JCQkJLy8gUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KQotCQkJCS8vIGJhc2UpOwotCQkJCS8vIGlmKHByb2MgIT0gbnVsbCkgewotCQkJCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwcm9jKTsKLQkJCQkvLyBpZihwbHVnaW4gIT0gbnVsbCkgewotCQkJCS8vIG1vZGVsSW5mby5hcHBlbmQoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocHJvYykuZ2V0TmFtZSgpKS5hcHBlbmQoJzonKTsKLQkJCQkvLyB9Ci0JCQkJLy8gbW9kZWxJbmZvLmFwcGVuZChwcm9jLmdldE5hbWUoKSk7Ci0JCQkJLy8gfQotCQkJCS8vCQkJCQotCQkJCS8vIGlmKGJhc2UgIT0gcHJvYykgewotCQkJCS8vIG1vZGVsSW5mby5hcHBlbmQoJzonKS5hcHBlbmQoYmFzZS5nZXROYW1lKCkpOwotCQkJCS8vIH0KLQkJCQkvLyBtb2RlbEluZm8uYXBwZW5kKCInIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGF0dGVybiAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gZ2V0TGFiZWxXaXRoUGF0aCgoQnJlYWtkb3duRWxlbWVudCkgYmFzZSk7Ci0JCQkJCW1vZGVsSW5mby5hcHBlbmQoTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBwYXRoIH0pKTsKLQotCQkJCQlnZXRNb2RlbEluZm8oKEJyZWFrZG93bkVsZW1lbnQpIGJhc2UsIGFkYXB0ZXIsIG1vZGVsSW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCXdyYXBwZXIuZ2V0T3duZXIoKTsKLQkJCWlmICh3cmFwcGVyLmdldEZlYXR1cmUoKSAhPSBudWxsKSB7Ci0JCQkJbW9kZWxJbmZvLmFwcGVuZChUbmdVdGlsLmdldEZlYXR1cmVUZXh0KHdyYXBwZXIuZ2V0RmVhdHVyZSgpKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3cmFwcGVyIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotLy8JCQkJCWdldE1vZGVsSW5mb0ZvcldvcmtQcm9kdWN0RGVzY3JpcHRvcihtb2RlbEluZm8sCi0vLwkJCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKSk7Ci0JCQkJCWdldFdQRE1vZGVsSW5mbyhtb2RlbEluZm8sIHdyYXBwZXIsIHdyYXBwZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JRC5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRDsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRTsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUzsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTi5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU47Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkc7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEU7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVguZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTy5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRS5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVM7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURS5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURTsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURTsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUw7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVELmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQ7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHksCi0JCQlPYmplY3QgYWRhcHRlcikgewotCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSUQpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQKLQkJCQkJJiYgYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZigoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuZ2V0SWQoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKSB7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElJdGVtTGFiZWxQcm92aWRlcikgewotCQkJCXJldHVybiAoKElJdGVtTGFiZWxQcm92aWRlcikgYWRhcHRlcikuZ2V0VGV4dChlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlyZXR1cm4gZ2V0UHJlc2VudGF0aW9uTmFtZShlKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUykgewotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLmdldFByZWRlY2Vzc29ycygpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoKChXb3JrQnJlYWtkb3duRWxlbWVudCkgZSkKLQkJCQkJCS5nZXRJc0V2ZW50RHJpdmVuKCkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORykgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXJldHVybiBTdHJpbmcKLQkJCQkJCS52YWx1ZU9mKCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIGUpLmdldElzT25nb2luZygpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoKChXb3JrQnJlYWtkb3duRWxlbWVudCkgZSkKLQkJCQkJCS5nZXRJc1JlcGVhdGFibGUoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgpIHsKLQkJCXJldHVybiBlLmdldFByZWZpeCgpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTykgewotCQkJU3RyaW5nQnVmZmVyIG1vZGVsSW5mbyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWdldE1vZGVsSW5mbyhlLCBhZGFwdGVyLCBtb2RlbEluZm8pOwotCQkJcmV0dXJuIG1vZGVsSW5mby50b1N0cmluZygpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRSkgewotCQkJU3RyaW5nIHR5cGVOYW1lID0gbnVsbDsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSkKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmICh3cCAhPSBudWxsKSB7Ci0JCQkJCXR5cGVOYW1lID0gd3AuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkRlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkICAKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodHlwZU5hbWUgPT0gbnVsbCAmJiBlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCXR5cGVOYW1lID0gKChFT2JqZWN0KSBlKS5lQ2xhc3MoKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlpZiAodHlwZU5hbWUgIT0gbnVsbCkgewotCQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVOYW1lICsgIl90eXBlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKCgoVGVhbVByb2ZpbGUpIGUpCi0JCQkJCQkuZ2V0U3VwZXJUZWFtKCkpOwotCQkJfQotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yICYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWFkYXB0ZXJGYWN0b3J5ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilhZGFwdGVyKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCX0KLQkJCQllbHNlIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCWFkYXB0ZXJGYWN0b3J5ID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKWFkYXB0ZXIpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJfQotCQkJCXJldHVybiBnZXRUZWFtTGlzdFN0cmluZyhnZXRUZWFtUHJvZmlsZXMob2JqZWN0LCAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKWFkYXB0ZXIsIGFkYXB0ZXJGYWN0b3J5KSk7Ci0gCQkJfQotCQl9Ci0JCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlOwotCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrTnVsbCh3cGQuZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURSkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZTsKLQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja051bGwod3BkLmdldEFjdGl2aXR5RXhpdFN0YXRlKCkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJTGlzdCBkZWxpdmVyYWJsZXMgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRvcnMoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSk7Ci0JCQkJaWYgKGRlbGl2ZXJhYmxlcy5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJaW50IG1heCA9IGRlbGl2ZXJhYmxlcy5zaXplKCkgLSAxOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCQkJc3RyQnVmLmFwcGVuZCgKLQkJCQkJCQlUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZGVsaXZlcmFibGVzLmdldChpKSkpCi0JCQkJCQkJLmFwcGVuZCgnLCcpOwotCQkJCX0KLQkJCQlzdHJCdWYuYXBwZW5kKFRuZ1V0aWwKLQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKGRlbGl2ZXJhYmxlcy5nZXQobWF4KSkpOwotCQkJCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMKSB7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZS5nZXRJc09wdGlvbmFsKCkpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRCkgewotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGUuZ2V0SXNQbGFubmVkKCkpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTKSB7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZS5nZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgYWN0aXZpdHkgZm9yIHRlYW0gcHJvZmlsZSBicmVha2Rvd24gZWxlbWVudAotCSAqIFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkgZG9lc24ndCB3b3JrIGNvcnJlY3RseSBmb3Igc3ViLXRlYW1zCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgYnJlYWtkb3duIGVsZW1lbnRzIHVuZGVyIHRlYW1hbGxvY2F0aW9uCi0JICogQHBhcmFtIHRlYW0KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0UGFyZW50QWN0aXZpdHlPZlRlYW0oQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQpCi0JewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCWJyRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQ7Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGJyRWxlbWVudCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50OwkKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHJvbGVkZXNjcmlwdG9ycyB1bmRlciBhY3Rpdml0eSB3aGljaCBjb3VsZCBwb3NzaWJsZSBtYXRjaCBmb3IKLQkgKiByb2xlcyB1bmRlciB0aGUgdGVhbXMuIEl0IHdpbGwgcmVjdXJzZSB0aHJ1IGFsbCBjaGlsZCBhY3Rpdml0aWVzIHRvIGZpbmQgCi0JICogcm9sZSBkZXNjcmlwdG9ycwotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gcm9sZURlc2NMaXN0Ci0JICogQHBhcmFtIHJvbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFJvbGVEZXNjcmlwdG9yKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQWN0aXZpdHkgcGFyZW50LCAgTGlzdCByb2xlRGVzY0xpc3QsIExpc3Qgcm9sZXMpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQotCQlPYmplY3QgbyA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIG87Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWdldFJvbGVEZXNjcmlwdG9yKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG9iaiwKLQkJCQkJCQlyb2xlRGVzY0xpc3QsIHJvbGVzKTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQkJCXsKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIG9iajsKLQkJCQkJaWYgKChyb2xlRGVzYy5nZXRSb2xlKCkhPSBudWxsKSAmJiAKLQkJCQkJCQkocm9sZXMuY29udGFpbnMocm9sZURlc2MuZ2V0Um9sZSgpKSkpCi0JCQkJCQlyb2xlRGVzY0xpc3QuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZWFtTGlzdFN0cmluZyhMaXN0IHRlYW1Qcm9maWxlcykgewotCQlpZiAodGVhbVByb2ZpbGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbWF4ID0gdGVhbVByb2ZpbGVzLnNpemUoKSAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKHRlYW1Qcm9maWxlcy5nZXQoaSkpKQotCQkJCQkuYXBwZW5kKCcsJyk7Ci0JCX0KLQkJc3RyQnVmLmFwcGVuZChUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUodGVhbVByb2ZpbGVzLmdldChtYXgpKSk7Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXR0cmlidXRlKFdvcmtCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBwcm9wLAotCQkJU3RyaW5nIHR4dCkgewotCQlpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpIHsKLQkJCWUuc2V0TmFtZSh0eHQpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgpIHsKLQkJCWUuc2V0UHJlZml4KHR4dCk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTikgewotCQkJZS5zZXRJc0V2ZW50RHJpdmVuKEJvb2xlYW4udmFsdWVPZih0eHQpKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORykgewotCQkJZS5zZXRJc09uZ29pbmcoQm9vbGVhbi52YWx1ZU9mKHR4dCkpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFKSB7Ci0JCQllLnNldElzUmVwZWF0YWJsZShCb29sZWFuLnZhbHVlT2YodHh0KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXR0cmlidXRlKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIHByb3AsIFN0cmluZyB0eHQpIHsKLQkJaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgdHh0LCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCksIHR4dCwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCksIEJvb2xlYW4KLQkJCQkJLnZhbHVlT2YodHh0KSwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCksIEJvb2xlYW4udmFsdWVPZih0eHQpLAotCQkJCQktMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSwgQm9vbGVhbgotCQkJCQkudmFsdWVPZih0eHQpLCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwgdHh0LCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMKSB7Ci0JCQlhY3Rpb25NZ3IKLQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCksIEJvb2xlYW4KLQkJCQkJCQkudmFsdWVPZih0eHQpLCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpLCBCb29sZWFuLnZhbHVlT2YodHh0KSwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwgQm9vbGVhbgotCQkJCQkudmFsdWVPZih0eHQpLCAtMSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSkgewotCQkJCWFjdGlvbk1ncgotCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKSwKLQkJCQkJCQkJdHh0LCAtMSk7Ci0JCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSwgdHh0LCAtMSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgZ2VuZXJhbGl6ZShBY3Rpdml0eSBiYXNlLCBWYXJpYWJpbGl0eVR5cGUgdHlwZSkgewotCQlBY3Rpdml0eSBhY3QgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eSgpOwotCQlhY3Quc2V0TmFtZShiYXNlLmdldE5hbWUoKSk7Ci0JCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMKSB7Ci0JCQlTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IGdldFByZXNlbnRhdGlvbk5hbWUoYmFzZSk7Ci0JCQlhY3Quc2V0UHJlc2VudGF0aW9uTmFtZShTdHJVdGlsLmlzQmxhbmsocHJlc2VudGF0aW9uTmFtZSkgPyBiYXNlCi0JCQkJCS5nZXROYW1lKCkgOiBwcmVzZW50YXRpb25OYW1lKTsKLQkJfQotCQlhY3Quc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChiYXNlKTsKLQkJYWN0LnNldFZhcmlhYmlsaXR5VHlwZSh0eXBlKTsKLQotCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKSB7Ci0JCQkvLyBpbmhlcml0IGJvb2xlYW4gYXR0cmlidXRlcyBmcm9tIGJhc2UKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBiYXNlLmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEVBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChhdHRyaWJ1dGUuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkgPT0gQm9vbGVhbi5jbGFzcykgewotCQkJCQlhY3QuZVNldChhdHRyaWJ1dGUsIGJhc2UuZUdldChhdHRyaWJ1dGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBjb3B5IHByZWRlY2Vzc29ycyBsaXN0Ci0JCS8vIFRPRE86IG5lZWQgdG8gY2hlY2sgd2l0aCB2YXJpYWJpbGl0eSBydWxlcy4KLQkJLy8KLQkJQXJyYXlMaXN0IHdvcmtPcmRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QoYmFzZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXdvcmtPcmRlcnMuYWRkKFRuZ1V0aWwuY29weSgoV29ya09yZGVyKSBpdGVyLm5leHQoKSkpOwotCQl9Ci0KLQkJYWN0LmdldExpbmtUb1ByZWRlY2Vzc29yKCkuYWRkQWxsKHdvcmtPcmRlcnMpOwotCQlyZXR1cm4gYWN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbGlzdCBvZiBlbGVtZW50cyBzcGVjaWZpZWQgaW4gY2xhc3MgInR5cGUiIGVnLihSb2xlRGVzY3JpcHRvciwKLQkgKiBXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHVudGlsIHRoZSByb290IGxldmVsLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gaXRlbXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEVsZW1lbnRzSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCwgQ2xhc3MgdHlwZSwgTGlzdCBpdGVtcykgewotCQkvLyBnZXQgY2hpbGRyZW4gZm9yIGFjdGl2aXR5Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gKChBY3Rpdml0eSkgZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAodHlwZS5pc0luc3RhbmNlKG9iaikpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJPYmogLSIgKyBvYmopOwotCQkJCQlpZiAoIShpdGVtcy5jb250YWlucyhvYmopKSkgewotCQkJCQkJaXRlbXMuYWRkKG9iaik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBnZXQgcGFyZW50Ci0JCU9iamVjdCBjdXJyZW50UGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChlbGVtZW50KTsKLQkJaWYgKGN1cnJlbnRQYXJlbnQgIT0gbnVsbCkgewotCQkJLy8gZ28gdXAKLQkJCWdldEVsZW1lbnRzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwKLQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIGN1cnJlbnRQYXJlbnQsIHR5cGUsIGl0ZW1zKTsKLQkJfQotCQlyZXR1cm4gaXRlbXM7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcm9sZXMgZnJvbSByb2xlZGVzY3JpcHRvciBsaXN0Ci0JICogCi0JICogQHBhcmFtIHJvbGVEZXNjTGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb2xlcyhMaXN0IHJvbGVEZXNjTGlzdCkgewotCQlMaXN0IHJvbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocm9sZURlc2NMaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIG9iaikuZ2V0Um9sZSgpOwotCQkJCQlyb2xlTGlzdC5hZGQocm9sZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByb2xlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYXNzb2NpYXRlZCBtZXRob2QgZWxlbWVudCBsaXN0Ci0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3JMaXN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoTGlzdCBkZXNjcmlwdG9yTGlzdCkgewotCQlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvckxpc3QgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gZGVzY3JpcHRvckxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBvYmopOwotCQkJCQllbGVtZW50TGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50TGlzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0VG9wQnJlYWtkb3duRWxlbWVudChQcm9jZXNzQ29tcG9uZW50IHBjKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnQgYmUgPSBwYy5nZXRQcm9jZXNzKCk7Ci0JCWlmIChiZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCBhZGFwdGVyID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChiZSwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpKQotCQkJcmV0dXJuIGJlOwotCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJaWYgKGl0ZW1Qcm92aWRlci5nZXRUb3BJdGVtKCkgPT0gbnVsbCkgewotCQkJaXRlbVByb3ZpZGVyLnNldFRvcEl0ZW0oYmUpOwotCQkJaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoYmUsCi0JCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRUb3BJdGVtKGJlKTsKLQkJCWl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGJlLAotCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpdGVtUHJvdmlkZXIuc2V0VG9wSXRlbShiZSk7Ci0JCQlpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChiZSwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaXRlbVByb3ZpZGVyLnNldFRvcEl0ZW0oYmUpOwotCQl9Ci0JCVByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhiZSwgYmUpOwotCQlyZXR1cm4gYmU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVJRHMoRU9iamVjdCB0b3BBY3QsIE9iamVjdCBuZXdPYmopIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQodG9wQWN0LAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXIKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCWJvb2xlYW4gdXBkYXRlV2hvbGVQcm9jZXNzID0gdG9wQWN0ID09IG5ld09iagotCQkJCSYmIHRvcEFjdCBpbnN0YW5jZW9mIFByb2Nlc3M7Ci0JCWlmICh1cGRhdGVXaG9sZVByb2Nlc3MpIHsKLQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSB0b3BBY3Q7Ci0JCQl1cGRhdGVJRHMoZmFjdG9yeSwgcHJvYyk7Ci0JCQlyZWZyZXNoVmlld2VyKGZhY3RvcnksIHByb2MpOwotCQl9IGVsc2UgewotCQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcigKLQkJCQkJZmFjdG9yeSwgdG9wQWN0KTsKLQkJCXVwZGF0ZUlEcyhmYWN0b3J5LCBpdGVyLCBuZXdPYmopOwotCQl9Ci0KLQkJLy8gTm8gbW9yZSBJRCBjb2x1bW4gaW4gVEJTIGFuZCBXUEJTCi0JCS8vCi0JCS8vIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdCh0b3BBY3QsCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIGZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkvLyBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGZhY3RvcnksIHRvcEFjdCk7Ci0JCS8vIFByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhmYWN0b3J5LCBpdGVyLCBuZXdPYmopOwotCQkvLyBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQodG9wQWN0LAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBmYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlci5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJLy8gaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihmYWN0b3J5LCB0b3BBY3QpOwotCQkvLyBQcm9jZXNzVXRpbC51cGRhdGVJRHMoZmFjdG9yeSwgaXRlciwgbmV3T2JqKTsKLQotCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQodG9wQWN0LAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJZmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCWlmICh1cGRhdGVXaG9sZVByb2Nlc3MpIHsKLQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSB0b3BBY3Q7Ci0JCQl1cGRhdGVJRHMoZmFjdG9yeSwgcHJvYyk7Ci0JCQlyZWZyZXNoVmlld2VyKGZhY3RvcnksIHByb2MpOwotCQl9IGVsc2UgewotCQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcigKLQkJCQkJZmFjdG9yeSwgdG9wQWN0KTsKLQkJCXVwZGF0ZUlEcyhmYWN0b3J5LCBpdGVyLCBuZXdPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGl0ZXIKLQkgKiBAcGFyYW0gbmV3T2JqCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUlEcyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LAotCQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IgaXRlciwgT2JqZWN0IG5ld09iaikgewotCQlpbnQgaWQgPSAwOwotCQlPYmplY3Qgb2JqOwotCQlNYXAgY2hhbmdlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlvYmogPSBpdGVyLm5leHQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBmYWN0b3J5LmFkYXB0KG9iaiwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRJZChpZCsrKTsKLQkJCWNoYW5nZU1hcC5wdXQob2JqLCBpdGVtUHJvdmlkZXIpOwotCQl9Ci0KLQkJLy8gcmVmcmVzaCB0aGUgbGFiZWwKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNoYW5nZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUlDaGFuZ2VOb3RpZmllciBhZGFwdGVyID0gKElDaGFuZ2VOb3RpZmllcikgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCW9iaiA9IGVudHJ5LmdldEtleSgpOwotCQkJYWRhcHRlci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQluZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uU0VULCBvYmosIG9iaiksIG9iaiwKLQkJCQkJZmFsc2UsIHRydWUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKiBAc2VlICNjaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKENvbGxlY3Rpb24sIERlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotCQkJRGVzY3JpcHRvciBvYmopIHsKLQkJQ29sbGVjdGlvbiBkZXNjcmlwdG9ycyA9IGRlc2NyaXB0b3IgIT0gbnVsbCA/IENvbGxlY3Rpb25zCi0JCQkJLnNpbmdsZXRvbihkZXNjcmlwdG9yKSA6IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJcmV0dXJuIGNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoZGVzY3JpcHRvcnMsIG9iaik7Ci0JfQotCi0JCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlZmVyZW5jZXMgb2YgdGhlIG9iamVjdCAib2JqIi4gSWYgcmVmZXJlbmNlcwotCSAqIGV4aXN0IGluIGFueSBkZXNjcmlwdG9yIGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwgaWdub3JlIGl0LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoQ29sbGVjdGlvbiBkZXNjcmlwdG9ycywKLQkJCURlc2NyaXB0b3Igb2JqKSB7Ci0JCWJvb2xlYW4gcmVmZXJlbmNlc0V4aXN0cyA9IGZhbHNlOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJUm9sZURlc2NyaXB0b3IgcmVmT2JqZWN0ID0gKFJvbGVEZXNjcmlwdG9yKSBvYmo7Ci0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlsaXN0LmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhyZWZPYmplY3QpKTsKLQkJCWxpc3QuYWRkQWxsKHJlZk9iamVjdC5nZXRSZXNwb25zaWJsZUZvcigpKTsKLQkJCWxpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldEFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMocmVmT2JqZWN0KSk7Ci0JCQlsaXN0LmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJlZk9iamVjdCkpOwotCQkJbGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0VGVhbVByb2ZpbGVzKHJlZk9iamVjdCkpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIHJlZkl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IHJlZkl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCByZWZJdG9yT2JqZWN0ID0gKE9iamVjdCkgcmVmSXRvci5uZXh0KCk7Ci0JCQkJaWYgKCgocmVmSXRvck9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpICYmICFkZXNjcmlwdG9ycwotCQkJCQkJLmNvbnRhaW5zKHJlZkl0b3JPYmplY3QpKQotCQkJCQkJfHwgKHJlZkl0b3JPYmplY3QgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkpIHsKLQkJCQkJcmVmZXJlbmNlc0V4aXN0cyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJfQotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewkJCi0JCQlyZXR1cm4gY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JSZWZlcmVuY2VzKGRlc2NyaXB0b3JzLCAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmosIGZhbHNlLCAtMSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCVRhc2tEZXNjcmlwdG9yIHJlZk9iamVjdCA9IChUYXNrRGVzY3JpcHRvcikgb2JqOwotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldEFzc2lzdGVkQnkoKSk7Ci0JCQlsaXN0LmFkZEFsbChyZWZPYmplY3QuZ2V0RXh0ZXJuYWxJbnB1dCgpKTsKLQkJCWxpc3QuYWRkQWxsKHJlZk9iamVjdC5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCWxpc3QuYWRkQWxsKHJlZk9iamVjdC5nZXRPcHRpb25hbElucHV0KCkpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldE91dHB1dCgpKTsKLQkJCWxpc3QuYWRkKHJlZk9iamVjdC5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQotCQkJZm9yIChJdGVyYXRvciByZWZJdG9yID0gbGlzdC5pdGVyYXRvcigpOyByZWZJdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgcmVmSXRvck9iamVjdCA9IChPYmplY3QpIHJlZkl0b3IubmV4dCgpOwotCQkJCWlmICgocmVmSXRvck9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpCi0JCQkJCQkmJiAhZGVzY3JpcHRvcnMuY29udGFpbnMocmVmSXRvck9iamVjdCkpIHsKLQkJCQkJcmVmZXJlbmNlc0V4aXN0cyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZWZlcmVuY2VzRXhpc3RzOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVmZXJlbmNlcyBvZiB0aGUgd29ya1Byb2R1Y3RkZXNjcmlwdG9yIG9iamVjdCAicmVmT2JqZWN0LiAKLQkgKiBJZiByZWZlcmVuY2VzIGV4aXN0IGluIGFueSBkZXNjcmlwdG9yIGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwgaWdub3JlIGl0LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSByZWZPYmplY3QKLQkgKiBAcGFyYW0gcmVtb3ZlUmVsYXRpb24gLSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgd2UncmUgcmVtb3ZpbmcgcmVsYXRpb24KLQkgKiAgICAgQnkgZGVmYXVsdCB0aGlzIHNob3VsZCBiZSBmYWxzZS4gCi0JICogICAgIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGlmIHlvdSBhcmUgY29taW5nIGZyb20gcHJvcGVydGllcyB2aWV3LiAKLQkgKiAgICAgZWcuIHJlbW92aW5nIHJlbGF0aW9uc2hpcCBvZiB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byB0YXNrIGRlc2NyaXB0b3IgCi0JICogQHBhcmFtIGZlYXR1cmVJRAotCSAqIAkJVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgaWYgInJlbW92ZVJlbGF0aW9uIiBpcyB0cnVlLiBZb3UgbmVlZCB0byBnaXZlIGZlYXR1cmVJRAotCSAqIAkJZm9yIHdoaWNoIHJlbGF0aW9uIHlvdSBhcmUgcmVtb3ZpbmcuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja1dvcmtQcm9kdWN0RGVzY3JpcHRvclJlZmVyZW5jZXMoCi0JCQlDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IgcmVmT2JqZWN0LCBib29sZWFuIHJlbW92ZVJlbGF0aW9uLCBpbnQgZmVhdHVyZUlEKSB7Ci0JCQotCQlMaXN0IGFsbE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFsbE9iamVjdHMuYWRkKHJlZk9iamVjdCk7Ci0KLQkJQWN0aXZpdHkgcGFyZW50QWN0aXZpdHkgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KHJlZk9iamVjdCk7Ci0JCS8vIGNoZWNrIHdoZXRoZXIgcmVmZXJlbmNlIG9iamVjdCBpbnN0YW5jZSBvZiBhcnRpZmFjdAotCQlpZiAocmVmT2JqZWN0LmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJTGlzdCBjb250YWluZWRBcnRpZmFjdHMgPSAoKEFydGlmYWN0KSByZWZPYmplY3QuZ2V0V29ya1Byb2R1Y3QoKSkKLQkJCQkJLmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCi0JCQlMaXN0IGNvbnRhaW5lZFdwRGVzY0xpc3QgPSBnZXRXcERlc2NGb3JBcnRpZmFjdHMoCi0JCQkJCWNvbnRhaW5lZEFydGlmYWN0cywgcGFyZW50QWN0aXZpdHkpOwotCi0JCQlMaXN0IGNvbnRhaW5lckFydGlmYWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKChBcnRpZmFjdCkgcmVmT2JqZWN0LmdldFdvcmtQcm9kdWN0KCkpCi0JCQkJCS5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQkJd2hpbGUgKGFydGlmYWN0ICE9IG51bGwpIHsKLQkJCQljb250YWluZXJBcnRpZmFjdHMuYWRkKGFydGlmYWN0KTsKLQkJCQlhcnRpZmFjdCA9ICgoQXJ0aWZhY3QpIGFydGlmYWN0KS5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQkJfQotCQkJTGlzdCBjb250YWluZXJXcERlc2NMaXN0ID0gZ2V0V3BEZXNjRm9yQXJ0aWZhY3RzKAotCQkJCQljb250YWluZXJBcnRpZmFjdHMsIHBhcmVudEFjdGl2aXR5KTsKLQotCQkJYWxsT2JqZWN0cy5hZGRBbGwoY29udGFpbmVkV3BEZXNjTGlzdCk7Ci0JCQlhbGxPYmplY3RzLmFkZEFsbChjb250YWluZXJXcERlc2NMaXN0KTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsT2JqZWN0cy5zaXplKCk7IGkrKykgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwT2JqID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgYWxsT2JqZWN0cwotCQkJCQkuZ2V0KGkpOwotCi0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlsaXN0LmFkZEFsbCh3cE9iai5nZXRJbXBhY3RlZEJ5KCkpOwotCQkJbGlzdC5hZGRBbGwod3BPYmouZ2V0SW1wYWN0cygpKTsKLQkJCWxpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKHdwT2JqKSk7Ci0JCQlsaXN0LmFkZEFsbCh3cE9iai5nZXREZWxpdmVyYWJsZVBhcnRzKCkpOwotCi0JCQlMaXN0IGlucHV0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlucHV0TGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0RXh0ZXJuYWxJbnB1dFRvKHdwT2JqKSk7Ci0JCQlpbnB1dExpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldE1hbmRhdG9yeUlucHV0VG8od3BPYmopKTsKLQkJCWlucHV0TGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3B0aW9uYWxJbnB1dFRvKHdwT2JqKSk7Ci0KLQkJCUxpc3Qgb3V0cHV0TGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dEZyb20od3BPYmopOwotCQkJaWYgKHJlbW92ZVJlbGF0aW9uKQotCQkJewotCQkJCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCQlpZiAob3V0cHV0TGlzdC5jb250YWluc0FsbChkZXNjcmlwdG9ycykpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUIDoJCQkJCi0JCQkJCWlmIChpbnB1dExpc3QuY29udGFpbnNBbGwoZGVzY3JpcHRvcnMpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlsaXN0LmFkZEFsbChpbnB1dExpc3QpOwotCQkJbGlzdC5hZGRBbGwob3V0cHV0TGlzdCk7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgcmVmSXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgcmVmSXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHJlZkl0b3JPYmplY3QgPSAoT2JqZWN0KSByZWZJdG9yLm5leHQoKTsKLQkJCQlpZiAoKHJlZkl0b3JPYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKQotCQkJCQkJJiYgIWRlc2NyaXB0b3JzLmNvbnRhaW5zKHJlZkl0b3JPYmplY3QpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JCi0JLyoqCi0JICogUmV0dXJuIGxpc3Qgb2YgY29ycmVzcG9uZGluZyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgZm9yIGFydGlmYWN0cwotCSAqIEBwYXJhbSBhcnRpZmFjdHMKLQkgKiBAcGFyYW0gcGFyZW50QWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFdwRGVzY0ZvckFydGlmYWN0cyhMaXN0IGFydGlmYWN0cywgQWN0aXZpdHkgcGFyZW50QWN0aXZpdHkpCi0JewotCQlMaXN0IHdwRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaSA8IGFydGlmYWN0cy5zaXplKCk7IGkrKykKLQkJewotCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGFydGlmYWN0cy5nZXQoaSk7Ci0JCQlMaXN0IGJyRWxlbWVudHMgPSBwYXJlbnRBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gYnJFbGVtZW50cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspCi0JCQl7Ci0JCQkJT2JqZWN0IGJyT2JqID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJaWYgKGJyT2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSAKLQkJCQl7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBick9iajsKLQkJCQkJaWYgKHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgQXJ0aWZhY3QpCi0JCQkJCXsKLQkJCQkJCWlmICh3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKS5lcXVhbHMoYXJ0aWZhY3QpKQotCQkJCQkJCXdwRGVzY0xpc3QuYWRkKHdwRGVzYyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdwRGVzY0xpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGVSb2xlIGNyZWF0ZUNvbXBvc2l0ZVJvbGUoQ29tcG9zaXRlUm9sZSBvYmopIHsKLQkJQ29tcG9zaXRlUm9sZSBjb21wUm9sZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBvc2l0ZVJvbGUoKTsKLQkJY29tcFJvbGUuZ2V0QWdncmVnYXRlZFJvbGVzKCkuYWRkQWxsKG9iai5nZXRBZ2dyZWdhdGVkUm9sZXMoKSk7Ci0KLQkJU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSBvYmouZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQljb21wUm9sZS5zZXROYW1lKG9iai5nZXROYW1lKCkpOwotCQljb21wUm9sZS5zZXRQcmVzZW50YXRpb25OYW1lKFN0clV0aWwuaXNCbGFuayhwcmVzZW50YXRpb25OYW1lKSA/IG9iagotCQkJCS5nZXROYW1lKCkgOiBwcmVzZW50YXRpb25OYW1lKTsKLQkJcmV0dXJuIGNvbXBSb2xlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUYXNrVG9BY3Rpdml0eShUYXNrIHRhc2ssIEFjdGl2aXR5IGFjdCkgewotCQlXQlNEcm9wQ29tbWFuZCBjbWQgPSBuZXcgV0JTRHJvcENvbW1hbmQoYWN0LCBDb2xsZWN0aW9ucwotCQkJCS5zaW5nbGV0b25MaXN0KHRhc2spKTsKLQkJQlNEcm9wQ29tbWFuZC5JRXhlY3V0b3IgZXhlY3V0b3IgPSBjbWQuZ2V0RXhlY3V0b3IoKTsKLQkJaWYgKGV4ZWN1dG9yLnByZUV4ZWN1dGUoKSkgewotCQkJZXhlY3V0b3IuZG9FeGNlY3V0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1Byb2Nlc3NOb3RPZlR5cGUoUHJvY2Vzc1BhY2thZ2UgcGtnLAotCQkJRUNsYXNzIHByb2Nlc3NUeXBlKSB7Ci0JCWlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIHBrZykuZ2V0UHJvY2VzcygpOwotCQkJaWYgKHByb2MgIT0gbnVsbCAmJiAhcHJvY2Vzc1R5cGUuaXNJbnN0YW5jZShwcm9jKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZFBrZyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChjaGlsZFBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGNoaWxkUGtnKS5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2MgIT0gbnVsbCAmJiAhcHJvY2Vzc1R5cGUuaXNJbnN0YW5jZShwcm9jKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAoaGFzUHJvY2Vzc05vdE9mVHlwZSgoUHJvY2Vzc1BhY2thZ2UpIGNoaWxkUGtnLCBwcm9jZXNzVHlwZSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIGNvcnJlc3BvZGluZyByb2xlRGVzY3JpcHRvciBpbiB0ZWFtIHNpbmNlIHdlIG1haW50YWluIHR3byByb2xlCi0JICogZGVzY3JpcHRvciBmb3IgdGhlIHNhbWUgcm9sZQotCSAqIAotCSAqIEBwYXJhbSB0ZWFtCi0JICogQHBhcmFtIHJvbGVEZXNjCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGZpbmRSb2xlRGVzY3JpcHRvcihUZWFtUHJvZmlsZSB0ZWFtLAotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MpIHsKLQkJTGlzdCB0ZWFtUm9sZXMgPSB0ZWFtLmdldFRlYW1Sb2xlcygpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHRlYW1Sb2xlcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdG9yT2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAocm9sZURlc2MgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJaWYgKGl0b3JPYmplY3QgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJCUxpc3QgZmlyc3RPYmplY3RBZ2dSb2xlcyA9ICgoQ29tcG9zaXRlUm9sZSkgcm9sZURlc2MpCi0JCQkJCQkJLmdldEFnZ3JlZ2F0ZWRSb2xlcygpOwotCQkJCQlMaXN0IHNlY29uZE9iamVjdEFnZ1JvbGVzID0gKChDb21wb3NpdGVSb2xlKSBpdG9yT2JqZWN0KQotCQkJCQkJCS5nZXRBZ2dyZWdhdGVkUm9sZXMoKTsKLQkJCQkJaWYgKGZpcnN0T2JqZWN0QWdnUm9sZXMuZXF1YWxzKHNlY29uZE9iamVjdEFnZ1JvbGVzKSkgewotCQkJCQkJcmV0dXJuIGl0b3JPYmplY3Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHJvbGVEZXNjIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQlpZiAoKGl0b3JPYmplY3QgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJCQkJCSYmICghKGl0b3JPYmplY3QgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSkpIHsKLQkJCQkJT2JqZWN0IG9ialJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSByb2xlRGVzYykuZ2V0Um9sZSgpOwotCQkJCQlPYmplY3QgaXRvck9ialJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSBpdG9yT2JqZWN0KQotCQkJCQkJCS5nZXRSb2xlKCk7Ci0JCQkJCWlmIChvYmpSb2xlLmVxdWFscyhpdG9yT2JqUm9sZSkpIHsKLQkJCQkJCXJldHVybiBpdG9yT2JqZWN0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbHVtbkluZGV4VG9OYW1lTWFwIGZyb20gdGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNvbHVtbgotCSAqIG5hbWVzCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIHRvQ29sdW1uSW5kZXhUb05hbWVNYXAoU3RyaW5nIGNvbE5hbWVzKSB7Ci0JCU1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbE5hbWVzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCWludCBpZCA9IDA7Ci0JCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0JCQljb2x1bW5JbmRleFRvTmFtZU1hcC5wdXQobmV3IEludGVnZXIoaWQpLCBnZXRDb2x1bW5JRCh0b2tlbikpOwotCQkJaWQrKzsKLQkJfQotCQlyZXR1cm4gY29sdW1uSW5kZXhUb05hbWVNYXA7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDb2x1bW5JRChTdHJpbmcgY29sTmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IElCU0l0ZW1Qcm92aWRlci5DT0xVTU5TLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgY29sID0gSUJTSXRlbVByb3ZpZGVyLkNPTFVNTlNbaV07Ci0JCQlpZiAoY29sLmVxdWFscyhjb2xOYW1lKSkgewotCQkJCXJldHVybiBjb2w7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIGFuIG5ldyBkZXNjcmlwdG9yIGNhbiBiZSBjcmVhdGVkIGZvciBhIGdpdmVuIG1ldGhvZCBlbGVtZW50Ci0JLy8gdW5kZXIgdGhlIGdpdmVuIGFjdGl2aXR5LCBjb25zaWRlcmluZyBhbGwgaW5oZXJpdGVkIGRlc2NyaXB0b3JzIG9mIHRoZSBhY3Rpdml0eS4KLQkvLyBJdCBpcyBOT1QgRUZGSUNJRU5UIHRvIGNvbGxlY3QgYWxsIGxpbmtlZCBlbGVtZW50cyBvZiB0aGUgaW5oZXJpdGVkIGRlc2NyaXB0b3JzIGludG8gYSBsaXN0IGFuZCB0aGVuIGNoZWNrIGlmCi0JLy8gd2hldGhlciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgaXMgaW4gdGhlIGxpc3QuCi0JLy8KLQkvLyBVc2UgUHJvY2Vzc0NvbW1hbmRVdGlsI2dldFZhbGlkRGVzY3JpcHRvcihPYmplY3Qgb2JqLCBBY3Rpdml0eSBhY3Rpdml0eSkgaW5zdGVhZAotCS8vCi0vLwlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VmFyaWFiaWxpdHlFbGVtZW50KE9iamVjdCBvd25lcikgewotLy8JCUxpc3QgYmFzZUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCWlmIChvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBvd25lcjsKLS8vCQkJd2hpbGUgKCFhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKS5lcXVhbHMoCi0vLwkJCQkJVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUwpKSB7Ci0vLwkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IGFjdGl2aXR5Ci0vLwkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0vLwotLy8JCQkJaWYgKChlbGVtZW50ICE9IG51bGwpICYmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0vLwkJCQkJQWN0aXZpdHkgYmFzZUFjdGl2aXR5ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotLy8KLS8vCQkJCQlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gYmFzZUFjdGl2aXR5Ci0vLwkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBicmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdG9yCi0vLwkJCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0vLwkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0vLwkJCQkJCQlPYmplY3QgYmFzZU9iaiA9IGdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBvYmplY3QpOwotLy8JCQkJCQkJaWYgKGJhc2VPYmogIT0gbnVsbCkgewotLy8JCQkJCQkJCWJhc2VFbGVtZW50cy5hZGQoYmFzZU9iaik7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwotLy8JCQkJCWFjdGl2aXR5ID0gYmFzZUFjdGl2aXR5OwotLy8JCQkJfQotLy8JCQkJZWxzZSB7Ci0vLwkJCQkJYnJlYWs7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCXJldHVybiBiYXNlRWxlbWVudHM7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgcHJlZGVjZXNzb3IgbGlzdCBvZiBhbGwgaXRlbSBwcm92aWRlcnMgb2YgdGhlIGdpdmVuIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqIEBwYXJhbSBwcm9jCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVByZWRlY2Vzc29ycyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MsCi0JCQlMaXN0IHJlbW92ZWRFbGVtZW50cykgewotCQlIYXNoU2V0IGVsZW1lbnRzID0gbmV3IEhhc2hTZXQocmVtb3ZlZEVsZW1lbnRzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGZhY3RvcnksIHByb2MpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBmYWN0b3J5LmFkYXB0KG9iaiwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChpdGVtUHJvdmlkZXIgIT0gbnVsbAotCQkJCQkmJiBUbmdVdGlsLnVud3JhcChvYmopIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gaXRlbVByb3ZpZGVyLmdldFByZWRlY2Vzc29ycygpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQkJZSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUb0FjdGl2aXR5KEFjdGl2aXR5IGFjdCwgQnJlYWtkb3duRWxlbWVudCBiZSwgT2JqZWN0W10gcHJldkFuZE5leHQpIHsKLQkJT2JqZWN0IG5leHQgPSBwcmV2QW5kTmV4dFsxXTsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlpZihuZXh0ICE9IG51bGwpIHsKLQkJCWludCBpZCA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2YobmV4dCk7Ci0JCQlpZihpZCAhPSAtMSkgeyAKLQkJCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoaWQsIGJlKTsKLQkJCQlhZGRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYoIWFkZGVkKSB7Ci0JCQlPYmplY3QgcHJldiA9IHByZXZBbmROZXh0WzBdOwotCQkJaWYocHJldiAhPSBudWxsKSB7CQkJCQotCQkJCWludCBpZCA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2YocHJldik7Ci0JCQkJaWYoaWQgIT0gLTEpIHsKLQkJCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGlkICsgMSwgYmUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGJlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoYmUpOwotCQkJfQotCQl9Ci0KLQl9Ci0JCi0JLyoqCi0JICogTG9jYWxseSBjb250cmlidXRlcyB0byB0aGUgaW5oZXJpdGVkIGFjdGl2aXR5IHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBhZGFwdGVyCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gY3JlYXRlZEFjdGl2aXRpZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBjb250cmlidXRlVG9BY3Rpdml0eSgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGFkYXB0ZXIsIExpc3QgY3JlYXRlZEFjdGl2aXRpZXMpIHsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KG51bGwpOwotCQlPYmplY3RbXSBwcmV2QW5kTmV4dCA9IFByb2Nlc3NVdGlsCi0JCQkJLmdldFByZXZpb3VzQW5kTmV4dChhZGFwdGVyKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlwYXJlbnQgPSBjb250cmlidXRlVG9BY3Rpdml0eSgKLQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBwYXJlbnQsCi0JCQkJCWNyZWF0ZWRBY3Rpdml0aWVzKTsKLQkJfQotCQlBY3Rpdml0eSBhY3QgPSBQcm9jZXNzVXRpbC5nZW5lcmlhbGl6ZShhZGFwdGVyLAotCQkJCVZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCwgcHJldkFuZE5leHQpOwotCQlBY3Rpdml0eSBwYXJlbnRBY3QgPSAoKEFjdGl2aXR5KSBwYXJlbnQpOwotCQlhZGRUb0FjdGl2aXR5KHBhcmVudEFjdCwgYWN0LCBwcmV2QW5kTmV4dCk7Ci0JCWNyZWF0ZWRBY3Rpdml0aWVzLmFkZChhY3QpOwotCQlyZXR1cm4gYWN0OwotCX0KLQotCS8qKgotCSAqIExvY2FsbHkgcmVwbGFjZXMgdGhlIGluaGVyaXRlZCBhY3Rpdml0eSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gYWRhcHRlcgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIGNyZWF0ZWRBY3Rpdml0aWVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VBY3Rpdml0eUxvY2FsbHkoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBhZGFwdGVyLCBMaXN0IGNyZWF0ZWRBY3Rpdml0aWVzKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChudWxsKTsKLQkJT2JqZWN0W10gcHJldkFuZE5leHQgPSBQcm9jZXNzVXRpbAotCQkJCS5nZXRQcmV2aW91c0FuZE5leHQoYWRhcHRlcik7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJcGFyZW50ID0gY29udHJpYnV0ZVRvQWN0aXZpdHkoCi0JCQkJCShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgcGFyZW50LAotCQkJCQljcmVhdGVkQWN0aXZpdGllcyk7Ci0JCX0KLQkJQWN0aXZpdHkgYWN0ID0gUHJvY2Vzc1V0aWwuZ2VuZXJpYWxpemUoYWRhcHRlciwKLQkJCQlWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlRfTElURVJBTCwgcHJldkFuZE5leHQpOwotCQlBY3Rpdml0eSBwYXJlbnRBY3QgPSAoKEFjdGl2aXR5KSBwYXJlbnQpOwotCQlhZGRUb0FjdGl2aXR5KHBhcmVudEFjdCwgYWN0LCBwcmV2QW5kTmV4dCk7Ci0JCWNyZWF0ZWRBY3Rpdml0aWVzLmFkZChhY3QpOwotCX0KLQotCXN0YXRpYyBPYmplY3RbXSBnZXRQcmV2aW91c0FuZE5leHQoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBhZGFwdGVyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChudWxsKTsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIGl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQlpbnQgaWQgPSBjaGlsZHJlbi5pbmRleE9mKGFkYXB0ZXIpICsgMTsKLQkJT2JqZWN0IG5leHQgPSBudWxsOwotCQlpZiAoaWQgPCBjaGlsZHJlbi5zaXplKCkpIHsKLQkJCW5leHQgPSBjaGlsZHJlbi5nZXQoaWQpOwotCQl9Ci0JCU9iamVjdCBwcmV2ID0gbnVsbDsKLQkJaWQgLT0gMjsKLQkJaWYgKGlkID4gLTEpIHsKLQkJCXByZXYgPSBjaGlsZHJlbi5nZXQoaWQpOwotCQl9Ci0KLQkJT2JqZWN0W10gcHJldkFuZE5leHQgPSB7IHByZXYsIG5leHQgfTsKLQkJcmV0dXJuIHByZXZBbmROZXh0OwotCX0KLQotCXN0YXRpYyBBY3Rpdml0eSBnZW5lcmlhbGl6ZShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBhZGFwdGVyLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUsIE9iamVjdFtdIHByZXZBbmROZXh0KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlcgotCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCQlBY3Rpdml0eSBhY3QgPSBnZW5lcmFsaXplKChBY3Rpdml0eSkgYWRhcHRlci5nZXRWYWx1ZSgpLCB0eXBlKTsKLQkJT2JqZWN0IG5leHQgPSBwcmV2QW5kTmV4dFsxXTsKLQkJaWYobmV4dCAhPSBudWxsKSB7Ci0JCQlhY3Quc2V0UHJlc2VudGVkQWZ0ZXIoKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKG5leHQpKTsKLQkJCWlmKG5leHQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJKChCcmVha2Rvd25FbGVtZW50KW5leHQpLnNldFByZXNlbnRlZEJlZm9yZShhY3QpOwotCQkJfQotCQl9Ci0JCU9iamVjdCBwcmV2ID0gcHJldkFuZE5leHRbMF07Ci0JCWlmKHByZXYgIT0gbnVsbCkgewotCQkJYWN0LnNldFByZXNlbnRlZEJlZm9yZSgoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAocHJldikpOwotCQkJaWYgKHByZXYgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJKChCcmVha2Rvd25FbGVtZW50KXByZXYpLnNldFByZXNlbnRlZEFmdGVyKGFjdCk7Ci0JCQl9Ci0JCX0KLQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoYWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlic0l0ZW1Qcm92aWRlci5zZXRFeHBhbmRlZChhZGFwdGVyLmlzRXhwYW5kZWQoKSk7Ci0JCXJldHVybiBhY3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW1tZWRpYXRlIGJhc2UgcHJvY2VzcyBvZiB0aGUgZ2l2ZW4KLQkgKiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB0aGF0IHJlcHJlc2VudHMgYW4gaW5oZXJpdGVkCi0JICogYnJlYWtkb3duIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGl0ZW1Qcm92aWRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3MgZ2V0SW1tZWRpYXRlQmFzZVByb2Nlc3MoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIpIHsKLQkJQWN0aXZpdHkgaW5oZXJpdG9yID0gZ2V0SW5oZXJpdG9yKGl0ZW1Qcm92aWRlcik7Ci0JCWlmIChpbmhlcml0b3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgaW5oZXJpdG9yCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFjdGl2aXR5IGluIHRoZSBwcm9jZXNzIG9mIHRoZSBnaXZlbiBpdGVtIHByb3ZpZGVyIHRoYXQgaW5oZXJpdHMKLQkgKiB0aGUgZWxlbWVudCByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gaXRlbSBwcm92aWRlcgotCSAqIAotCSAqIEBwYXJhbSBpdGVtUHJvdmlkZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBnZXRJbmhlcml0b3IoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIpIHsKLQkJaWYgKGl0ZW1Qcm92aWRlci5pc1JlYWRPbmx5KCkpIHsKLQkJCS8vIHRoaXMgcmVwcmVzZW50cyBhbiBpbmhlcml0ZWQgYnJlYWtkb3duIGVsZW1lbnQKLQkJCS8vCi0JCQlmb3IgKE9iamVjdCBwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KGl0ZW1Qcm92aWRlcik7IHBhcmVudCAhPSBudWxsOykgewotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlwYXJlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBwYXJlbnQpCi0JCQkJCQkJLmdldFBhcmVudChwYXJlbnQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiAoQWN0aXZpdHkpIHBhcmVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBwYXJlbnQgbGlzdCBvZiA8Y29kZT53cmFwcGVyPC9jb2RlPiBmcm9tIDxjb2RlPmZyb208L2NvZGU+LAotCSAqIGV4Y2x1ZGVkIDxjb2RlPmZyb208L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGZyb20KLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEByZXR1cm4gbGlzdCBvZiB1bndyYXBwZWQgcGFyZW50IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0UGFyZW50TGlzdChPYmplY3QgZnJvbSwKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJcmV0dXJuIGdldFBhcmVudExpc3Qod3JhcHBlciwgZnJvbSwgd3JhcHBlci5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBwYXJlbnQgbGlzdCBvZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGZyb20gPGNvZGU+ZnJvbTwvY29kZT4sCi0JICogZXhjbHVkZWQgPGNvZGU+ZnJvbTwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGZyb20KLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgdW53cmFwcGVkIHBhcmVudCBvYmplY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFBhcmVudExpc3QoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGZyb20sIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUFycmF5TGlzdCBwYXJlbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlmb3IgKE9iamVjdCBwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KG9iamVjdCk7IHBhcmVudCAhPSBmcm9tCi0JCQkJJiYgcGFyZW50ICE9IG51bGw7KSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAocGFyZW50KTsKLQkJCU1ldGhvZEVsZW1lbnQgZTsJCQkKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXI7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJCQlwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJfQotCQkJCWlmKFByb2Nlc3NVdGlsLmlzVG9wUHJvY2VzcyhlKSkgewotCQkJCQlwYXJlbnQgPSBudWxsOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIG11c3QgYmUgYSBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JCQkJLy8KLQkJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIG9iaik7Ci0JCQkJZSA9IChNZXRob2RFbGVtZW50KSBhZGFwdGVyLmdldFRhcmdldCgpOwotCQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQl9Ci0JCQlwYXJlbnRMaXN0LmFkZCgwLCBlKTsKLQkJfQotCQlyZXR1cm4gcGFyZW50TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3cmFwcGVycyBvZiBhbGwgYnJlYWtkb3duIHN0cnVjdHVyZSAoQlMpIHZpZXdzIGluIHRoZSBmb2xsb3dpbmcKLQkgKiBvcmRlcjogV0JTLCBUQlMsIFdQQlMKLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqICAgICAgICAgICAgdGhlIHdyYXBwZXIgb2YgYSBCUyB2aWV3Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXcmFwcGVycyhCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyLCBBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMpIHsKLQkJQXJyYXlMaXN0IHJvbGxlZFVwSXRlbVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KHdyYXBwZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlPYmplY3QgcHJvYyA9IHdyYXBwZXIuZ2V0VG9wSXRlbSgpOwkJCQkJCQotCQkJQXJyYXlMaXN0IG9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KFByb2Nlc3NVdGlsLmdldFBhcmVudExpc3QocHJvYywKLQkJCQkJd3JhcHBlcikpOwotCQkJQXJyYXlMaXN0IHdyYXBwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yaWVzW2ldOwotCQkJCWlmIChhZGFwdGVyRmFjdG9yeSA9PSByb290QWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJd3JhcHBlcnMuYWRkKHdyYXBwZXIpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJCQlvYmplY3RzLmFkZChlKTsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gcHJvYzsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcjEubmV4dCgpOwotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQotCQkJCQkvLyBtYWtlIHN1cmUgdGhlIGFjdGl2aXR5IGlzIHJvbGxlZCBkb3duIGJlZm9yZSBsb29raW5nIGludG8gaXRzIGNoaWxkcmVuCi0JCQkJCS8vCi0JCQkJCU9iamVjdCBiZSA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7CQkJCQkJCQkKLQkJCQkJaWYoYmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJCQkJCWlmKGl0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCkpIHsKLQkJCQkJCQkJaXRlbVByb3ZpZGVyLmJhc2ljU2V0Um9sbGVkVXAoZmFsc2UpOwotCQkJCQkJCQlyb2xsZWRVcEl0ZW1Qcm92aWRlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSBpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQkJCQkJaWYoaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKSkgewotCQkJCQkJCQlpdGVtUHJvdmlkZXIuc2V0Um9sbGVkVXAoZmFsc2UpOwotCQkJCQkJCQlyb2xsZWRVcEl0ZW1Qcm92aWRlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlmaW5kX2NoaWxkOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWRhcHRlcgotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmIChlbGVtZW50ID09IFRuZ1V0aWwudW53cmFwKGNoaWxkKSkgewotCQkJCQkJCW9iamVjdCA9IGNoaWxkOwotCQkJCQkJCWJyZWFrIGZpbmRfY2hpbGQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCXdyYXBwZXJzLmFkZChvYmplY3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotCQkJCQkJCSJDb3VsZCBub3QgZmluZCB3cmFwcGVyIGZvciAiICsgZSArICIgdXNpbmcgYWRhcHRlciBmYWN0b3J5ICIgKyBhZGFwdGVyRmFjdG9yeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB3cmFwcGVyczsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKCFyb2xsZWRVcEl0ZW1Qcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gcmVzdG9yZSB0aGUgcm9sbGVkVXAgZmxhZwotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sbGVkVXBJdGVtUHJvdmlkZXJzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGl0ZXIubmV4dCgpKS5iYXNpY1NldFJvbGxlZFVwKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBzcGVjaWZpYyBtb2RlbCBpbmZvIAotCSAqIEBwYXJhbSBtb2RlbEluZm8KLQkgKiBAcGFyYW0gb2JqZWN0IFdvcmtQcm9kdWN0RGVzY3JpcHRvciBvciBpdHMgd3JhcHBlcgotCSAqIEBwYXJhbSBpdGVtUHJvdmlkZXIgaXRlbSBwcm92aWRlciBvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3Igb3IgaXRzIHdyYXBwZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0V1BETW9kZWxJbmZvKFN0cmluZ0J1ZmZlciBtb2RlbEluZm8sIE9iamVjdCBvYmplY3QsIE9iamVjdCBpdGVtUHJvdmlkZXIpIHsKLQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7CQotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZWxlbWVudDsKLQkJCWlmKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCS8vIGNoZWNrIGlmIHRoaXMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaXMgc2hvd24gdW5kZXIgYSB0YXNrIGRlc2NyaXB0b3Igb3Igcm9sZSBkZXNjcmlwdG9yCi0JCQkJLy8KLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQkJaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQlhZGFwdGVyRmFjdG9yeSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcilpdGVtUHJvdmlkZXIpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJYWRhcHRlckZhY3RvcnkgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWl0ZW1Qcm92aWRlcikuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQl9Ci0JCQkJaWYoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQlPYmplY3QgcGFyZW50RGVzY3JpcHRvciA9IG51bGw7Ci0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcilpdGVtUHJvdmlkZXI7Ci0JCQkJCWZpbmRQYXJlbnREZXNjcmlwdG9yOgotCQkJCQkJZm9yKE9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChvYmplY3QpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KSkgewotCQkJCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAocGFyZW50KTsKLQkJCQkJCQlpZihlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQkJcGFyZW50RGVzY3JpcHRvciA9IGU7Ci0JCQkJCQkJCWJyZWFrIGZpbmRQYXJlbnREZXNjcmlwdG9yOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQlicmVhayBmaW5kUGFyZW50RGVzY3JpcHRvcjsKLQkJCQkJCQl9Ci0JCQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCX0KLQkJCQkJaWYocGFyZW50RGVzY3JpcHRvciAhPSBudWxsKSB7CQotCQkJCQkJLy8gd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaXMgc2hvd24gdW5kZXIgYSB0YXNrIGRlc2NyaXB0b3IKLQkJCQkJCS8vIHNob3cgb25seSBtb2RlbCBpbmZvIHJlbGF0ZWQgdG8gdGhpcyB0YXNrIGRlc2NyaXB0b3IKLQkJCQkJCS8vCi0JCQkJCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlpZihBc3NvY2lhdGlvbkhlbHBlci5nZXRNYW5kYXRvcnlJbnB1dFRvKHdwZCkuY29udGFpbnMocGFyZW50RGVzY3JpcHRvcikpIHsKLQkJCQkJCQlmZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZihBc3NvY2lhdGlvbkhlbHBlci5nZXRPcHRpb25hbElucHV0VG8od3BkKS5jb250YWlucyhwYXJlbnREZXNjcmlwdG9yKSkgewotCQkJCQkJCWZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkpOwkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWlmKEFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dEZyb20od3BkKS5jb250YWlucyhwYXJlbnREZXNjcmlwdG9yKSkgewotCQkJCQkJCWZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZighZmVhdHVyZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJaWYgKG1vZGVsSW5mby50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQltb2RlbEluZm8uYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCQkJCQkJbW9kZWxJbmZvLmFwcGVuZChUbmdVdGlsLmdldEZlYXR1cmVUZXh0KGZlYXR1cmUpKTsKLQkJCQkJCQkJaWYoaSA8IGZlYXR1cmVzLnNpemUoKSAtMSl7Ci0JCQkJCQkJCQltb2RlbEluZm8uYXBwZW5kKCIsIik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlnZXRNb2RlbEluZm9Gb3JXb3JrUHJvZHVjdERlc2NyaXB0b3IobW9kZWxJbmZvLCB3cGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBNb2RlbEluZm9ybWF0aW9uIHNwZWNpZmljIHRvIFdvcmtQcm9kdWN0RGVzY3JpcHRvci4gTW9kZWwKLQkgKiBJbmZvcm1hdGlvbiBpcyBmb3IgUEJTIChXb3JrUHJvZHVjdERlc2NyaXB0b3JzLCBpbmNsdWRpbmcgRXh0ZW5kZWQKLQkgKiBBY3Rpdml0eSdzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcnMpLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0TW9kZWxJbmZvRm9yV29ya1Byb2R1Y3REZXNjcmlwdG9yKAotCQkJU3RyaW5nQnVmZmVyIG1vZGVsSW5mbywgV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9iamVjdCkgewotCQlTdHJpbmcgY29tbWEgPSAiLCI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFBc3NvY2lhdGlvbkhlbHBlci5nZXRNYW5kYXRvcnlJbnB1dFRvKG9iamVjdCkuaXNFbXB0eSgpKSB7Ci0JCQlpZiAobW9kZWxJbmZvLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJbW9kZWxJbmZvLmFwcGVuZChjb21tYSk7Ci0JCQl9Ci0JCQltb2RlbEluZm8uYXBwZW5kKFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoIUFzc29jaWF0aW9uSGVscGVyLmdldE9wdGlvbmFsSW5wdXRUbyhvYmplY3QpLmlzRW1wdHkoKSkgewotCQkJaWYgKG1vZGVsSW5mby50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJCW1vZGVsSW5mby5hcHBlbmQoY29tbWEpOwotCQkJfQotCQkJbW9kZWxJbmZvLmFwcGVuZChVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoIUFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dEZyb20ob2JqZWN0KS5pc0VtcHR5KCkpIHsKLQkJCWlmIChtb2RlbEluZm8udG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQltb2RlbEluZm8uYXBwZW5kKGNvbW1hKTsKLQkJCX0KLQkJCW1vZGVsSW5mby5hcHBlbmQoVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXREdXBsaWNhdGVEZXNjcmlwdG9yc0FmdGVyUmV2ZWFsKENvbGxlY3Rpb24gZWxlbWVudHNUb1JldmVhbCkgewotCQlDb2xsZWN0aW9uIGR1cGxpY2F0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9SZXZlYWwuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudChkZXNjKTsKLQkJCQlpZihlICE9IG51bGwpIHsKLQkJCQkJQWN0aXZpdHkgYWN0ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShkZXNjKTsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCQllID0gKE1ldGhvZEVsZW1lbnQpIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLnJlc29sdmUoZSwgY29uZmlnKTsKLQkJCQkJT2JqZWN0IGR1cGxpY2F0ZSA9IFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKGUsIGFjdCwgY29uZmlnKTsKLQkJCQkJaWYoZHVwbGljYXRlICE9IG51bGwgJiYgIWR1cGxpY2F0ZXMuY29udGFpbnMoZHVwbGljYXRlKSkgewkJCQkJCi0JCQkJCQlkdXBsaWNhdGVzLmFkZChkdXBsaWNhdGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZHVwbGljYXRlczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldER1cGxpY2F0ZURlc2NyaXB0b3JzQWZ0ZXJTdXBwcmVzcyhDb2xsZWN0aW9uIGVsZW1lbnRzVG9TdXBwcmVzcykgewotCQlDb2xsZWN0aW9uIGR1cGxpY2F0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9TdXBwcmVzcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdGVtID0gaXRlci5uZXh0KCk7Ci0JCQlpZihpdGVtIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKSBpdGVtOwotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KGRlc2MpOwotCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQlBY3Rpdml0eSBhY3QgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGRlc2MpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKGVsZW1lbnQgIT0gZSAmJiBlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvciAmJiBlbGVtZW50LmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnQgbGlua2VkRWxlbWVudCA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBlbGVtZW50KTsKLQkJCQkJCQlpZihsaW5rZWRFbGVtZW50ID09IGUpIHsKLQkJCQkJCQkJZHVwbGljYXRlcy5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZHVwbGljYXRlczsKLQkJCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgcmVwcmVzZW50aW5nIGEgaW5oZXJpdGVkIGVsZW1lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIHRyZWUgb2YgcHJvY2VzcyBlZGl0b3IKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luaGVyaXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCSYmICgoRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilvYmplY3QpLmlzSW5oZXJpdGVkKCk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYWN0aXZpdHkgaGFzIGluaGVyaXRlZCBhbnkgYnJlYWtkb3duIGVsZW1lbnQgdmlhIGV4dGVuc2lvbiBvZiBsb2NhbCBjb250cmlidXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0luaGVyaXRlZChBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGFjdGl2aXR5KSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMEw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJcmV0dXJuICgoQWN0aXZpdHkpb2JqZWN0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQlpZihvIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG87Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZih2ZSAhPSBudWxsKSB7Ci0JCQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCQlpZih0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwgfHwgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUwpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udHJpYnV0ZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilvYmplY3QpLmlzQ29udHJpYnV0ZWQoKTsKLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxTdWJUZWFtcyhUZWFtUHJvZmlsZSB0ZWFtLCBMaXN0IHRlYW1zKSB7Ci0JCXRlYW1zLmFkZCh0ZWFtKTsKLQkJTGlzdCBzdWJUZWFtcyA9IHRlYW0uZ2V0U3ViVGVhbSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBzdWJUZWFtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVRlYW1Qcm9maWxlIHN1YlRlYW0gPSAoVGVhbVByb2ZpbGUpIGl0b3IubmV4dCgpOwotCi0JCQlnZXRBbGxTdWJUZWFtcyhzdWJUZWFtLCB0ZWFtcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRUZWFtUHJvZmlsZXMoT2JqZWN0IG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlMaXN0IHRlYW1zID0gbmV3IEFycmF5TGlzdChBc3NvY2lhdGlvbkhlbHBlci5nZXRUZWFtUHJvZmlsZXMocm9sZURlc2MpKTsKLQkJCi0JCS8vIGdldCBhbGwgdGhlIHRlYW0gcHJvZmlsZXMgdGhhdCBhcmUgaW4gc2NvcGUgb2YgdGhlIHdyYXBwZXIKLQkJLy8KLQkJSGFzaFNldCB2aXNpYmxlVGVhbXMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKE9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChvYmplY3QpOyBwYXJlbnQgIT0gbnVsbDspIHsKLQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CQkKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCUxpc3QgYWN0aXZpdHlUZWFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZ2V0QWxsU3ViVGVhbXMoKFRlYW1Qcm9maWxlKSBlLCBhY3Rpdml0eVRlYW1zKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gYWN0aXZpdHlUZWFtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspCXsKLQkJCQkJCU9iamVjdCBvID0gaXRvci5uZXh0KCk7Ci0JCQkJCQlpZihvIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUgJiYgKChUZWFtUHJvZmlsZSlvKS5nZXRUZWFtUm9sZXMoKS5jb250YWlucyhyb2xlRGVzYykpIHsKLQkJCQkJCQl2aXNpYmxlVGVhbXMuYWRkKG8pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJT2JqZWN0IG5ld1BhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQlpZihuZXdQYXJlbnQgPT0gbnVsbCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCW5ld1BhcmVudCA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkoKEFjdGl2aXR5KXBhcmVudCk7Ci0JCQl9Ci0JCQlwYXJlbnQgPSBuZXdQYXJlbnQ7Ci0JCX0KLQkJCi0JCS8vIHJlbW92ZSBhbnkgdGVhbSBwcm9maWxlIHRoYXQgaXMgbm90IGluIHRoZSBzY29wZSBvZiB0aGUgd3JhcHBlcgotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0ZWFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCB0ZWFtID0gaXRlci5uZXh0KCk7Ci0JCQlpZighdmlzaWJsZVRlYW1zLmNvbnRhaW5zKHRlYW0pKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHRlYW1zOwotCi0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgdmlzaWJsZSB0ZWFtIHByb2ZpbGVzIGZvciB0aGUgcm9sZSBkZXNjcmlwdG9yIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiB3cmFwcGVyCi0JICogCi0JICogQHBhcmFtIHJvbGVEZXNjV3JhcHBlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VGVhbVByb2ZpbGVzKFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciByb2xlRGVzY1dyYXBwZXIpIHsKLQkJcmV0dXJuIGdldFRlYW1Qcm9maWxlcyhyb2xlRGVzY1dyYXBwZXIsIHJvbGVEZXNjV3JhcHBlciwgcm9sZURlc2NXcmFwcGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VGVhbVByb2ZpbGVzKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHJvbGVEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gZ2V0VGVhbVByb2ZpbGVzKHJvbGVEZXNjLCBhZGFwdGVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRDaGlsZEVsZW1lbnRzKEFjdGl2aXR5IGFjdCwgQ2xhc3MgdHlwZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWZvciAoaW50IGkgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQoaSk7Ci0JCQlpZih0eXBlLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQljb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJZ2V0Q2hpbGRFbGVtZW50cygoQWN0aXZpdHkpIGVsZW1lbnQsIHR5cGUsIGNvbGxlY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUZpbHRlciBnZXRGaWx0ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJQWRhcHRlckZhY3Rvcnkgcm9vdEFkYXB0ZXJGYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCQlpZihyb290QWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlyZXR1cm4gKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KXJvb3RBZGFwdGVyRmFjdG9yeSkuZ2V0RmlsdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGNhbGN1bGF0ZWQgbGlzdCBvZiBhcnRpZmFjdCBjb250YWluZWQgYnkgdGhlIGdpdmVuIGFydGlmYWN0IGJhc2VkIG9uIHRoZQotCSAqIGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBhZGFwdGVyIGZhY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGFydGlmYWN0Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDb250YWluZWRBcnRpZmFjdHMoQXJ0aWZhY3QgYXJ0aWZhY3QsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQlpZihmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSB7Ci0JCQljb25maWcgPSAoKElDb25maWd1cmF0b3IpZmlsdGVyKS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCX0KLQkJCi0JCWlmKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gKExpc3QpIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldFJlZmVyZW5jZSgKLQkJCQkJYXJ0aWZhY3QsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCQljb25maWcpOwotCQl9CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldENvbnRhaW5lZEFydGlmYWN0c0Rlc2NyaXB0b3JzKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBhcnRpZmFjdERlc2MsIExpc3QgYXJ0aWZhY3REZXNjcmlwdG9ycykgewotCQlpZihhcnRpZmFjdERlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGFydGlmYWN0RGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCQkKLQkJLy8gY29sbGVjdCBvd24gYW5kIGNvbnRyaWJ1dGluZyBzdWJhcnRpZmFjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlBcnJheUxpc3QgY29udGFpbmVkRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihpbnQgaSA9IGFydGlmYWN0RGVzY3JpcHRvcnMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcilhcnRpZmFjdERlc2NyaXB0b3JzLmdldChpKSk7Ci0JCQlXb3JrUHJvZHVjdCBhID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlpZihhICE9IG51bGwpIHsKLQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IGEuZUNvbnRhaW5lcigpOwotCQkJCWlmKGNvbnRhaW5lciA9PSBhcnRpZmFjdCB8fCAKLQkJCQkJCShjb250YWluZXIgaW5zdGFuY2VvZiBBcnRpZmFjdCAmJiBUbmdVdGlsLmlzQ29udHJpYnV0b3JPZihhcnRpZmFjdCwgKEFydGlmYWN0KSBjb250YWluZXIpKSkgewotCQkJCQljb250YWluZWREZXNjcmlwdG9ycy5hZGQod3BkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lZERlc2NyaXB0b3JzOwotCX0KLQkKLS8vCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5lZEJ5KEFydGlmYWN0IHBhcmVudCwgQXJ0aWZhY3QgY2hpbGQsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0vLwkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotLy8JCUlGaWx0ZXIgZmlsdGVyID0gUHJvY2Vzc1V0aWwuZ2V0RmlsdGVyKGFkYXB0ZXJGYWN0b3J5KTsKLS8vCQlpZihmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSB7Ci0vLwkJCWNvbmZpZyA9ICgoSUNvbmZpZ3VyYXRvcilmaWx0ZXIpLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLS8vCQl9Ci0vLwkJCi0vLwkJaWYoY29uZmlnID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIFVtYVV0aWwuaXNDb250YWluZWRCeShjaGlsZCwgcGFyZW50KTsKLS8vCQl9Ci0vLwkJCi0vLwkJZmluYWwgTWV0aG9kQ29uZmlndXJhdGlvbiBjZmcgPSBjb25maWc7CQkKLS8vCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHBhcmVudCwgZmFsc2UpIHsKLS8vCi0vLwkJCS8qKgotLy8JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotLy8JCQkgKi8KLS8vCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0vLwotLy8JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotLy8JCQkJcmV0dXJuICgoQ29sbGVjdGlvbikgUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkuZ2V0UmVmZXJlbmNlKAotLy8JCQkJCQkoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsCi0vLwkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLAotLy8JCQkJCQljZmcpKS5pdGVyYXRvcigpOwotLy8JCQl9Ci0vLwkJCQotLy8JCX07Ci0vLwkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLS8vCQkJaWYoY2hpbGQgPT0gaXRlci5uZXh0KCkpIHsKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfQotLy8JCQotLy8JCXJldHVybiBmYWxzZTsKLS8vCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIFdvcmtQcm9kdWN0RGVzY3JpcHRvciA8Y29kZT5wYXJlbnQ8L2NvZGU+IGNhbiByZXByZXNlbnQgdGhlIHBhcmVudCBvZiB0aGUgV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JICogPGNvZGU+Y2hpbGQ8L2NvZGU+IGJhc2VkIG9uIHRoZSByZWxhdGlvbnNoaXAgb2YgdGhlaXIgbGlua2VkIGFydGlmYWN0IGFuZCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgYXJ0aWZhY3QgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWluZWRCeShXb3JrUHJvZHVjdERlc2NyaXB0b3IgcGFyZW50LCBXb3JrUHJvZHVjdERlc2NyaXB0b3IgY2hpbGQsIGZpbmFsIExpc3QgYXJ0aWZhY3REZXNjTGlzdCkgewotLy8JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IocGFyZW50LCBmYWxzZSkgewotLy8JCQkKLS8vCQkJLyoqCi0vLwkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0vLwkJCSAqLwotLy8JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLS8vCQkJCi0vLwkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0vLwkJCQlyZXR1cm4gZ2V0Q29udGFpbmVkQXJ0aWZhY3RzRGVzY3JpcHRvcnMoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqZWN0LCBhcnRpZmFjdERlc2NMaXN0KS5pdGVyYXRvcigpOwotLy8JCQl9Ci0vLwkJCQotLy8JCX07Ci0vLwkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLS8vCQkJaWYoY2hpbGQgPT0gaXRlci5uZXh0KCkpIHsKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfQotLy8JCQotLy8JCXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiBVbWFVdGlsLmlzQ29udGFpbmVkQnkoY2hpbGQuZ2V0V29ya1Byb2R1Y3QoKSwgcGFyZW50LmdldFdvcmtQcm9kdWN0KCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oZmluYWwgQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJTGlzdCBhcnRpZmFjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCS8vIGdldCB0aGUgYXJ0aWZhY3QgbGlzdAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYodW53cmFwKSB7Ci0JCQkJY2hpbGQgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQl9Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBjaGlsZCkKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCWFydGlmYWN0TGlzdC5hZGQod3ApOwotCQkJCX0KLQkJCX0KLQkJfQotCQotCQkvLyBwcm9jZXNzIHRoZSBhcnRpZmFjdCBsaXN0IHRvIGdldCB0aGUgdG9wLW1vc3Qgb25lcwotCQkvLwotCQlTZXQgdG9wTW9zdEFydGlmYWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUFydGlmYWN0IGNhbmRpZGF0ZSA9IG51bGw7Ci0JCi0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJd2hpbGUgKCFhcnRpZmFjdExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkKLQkJCWlmICghZm91bmQpCi0JCQl7Ci0JCQkJY2FuZGlkYXRlID0gKEFydGlmYWN0KSBhcnRpZmFjdExpc3QuZ2V0KDApOwotCQkJCWFydGlmYWN0TGlzdC5yZW1vdmUoMCk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhcnRpZmFjdExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0ZXIubmV4dCgpOwotCQkJCWZvdW5kID0gZmFsc2U7Ci0JCQkJLy8gaWYoY2FuZGlkYXRlLmdldENvbnRhaW5lZEFydGlmYWN0cygpLmNvbnRhaW5zKGFydGlmYWN0KSkgewotCQkJCWlmIChVbWFVdGlsLmlzQ29udGFpbmVkQnkoYXJ0aWZhY3QsIGNhbmRpZGF0ZSkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGNhbmRpZGF0ZSwgYXJ0aWZhY3QpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCWNhbmRpZGF0ZSA9IGFydGlmYWN0OwotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQgfHwgYXJ0aWZhY3RMaXN0LmlzRW1wdHkoKSkKLQkJCQl0b3BNb3N0QXJ0aWZhY3RzLmFkZChjYW5kaWRhdGUpOwotCQkJZWxzZSBpZiAoYXJ0aWZhY3RMaXN0LmlzRW1wdHkoKSkKLQkJCQkJdG9wTW9zdEFydGlmYWN0cy5hZGQoY2FuZGlkYXRlKTsJCQotCQl9Ci0JCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGNpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgY2kuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gY2kubmV4dCgpOwotCQkJT2JqZWN0IGUgPSB1bndyYXAgPyBUbmdVdGlsLnVud3JhcChjaGlsZCkgOiBjaGlsZDsKLQkJCWJvb2xlYW4gc2VsZWN0ZWQgPSBmYWxzZTsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlKTsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmICghKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpKSB7Ci0JCQkJCXNlbGVjdGVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKHRvcE1vc3RBcnRpZmFjdHMuY29udGFpbnMod3ApKSB7Ci0JCQkJCXNlbGVjdGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdGVkID0gdHJ1ZTsKLQkJCX0KLQkJCWlmIChzZWxlY3RlZCkgewotCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaGVscHMgYnVpbGQgdGhlIGFydGlmYWN0IGRlc2NyaXB0b3IgdHJlZSBjb3JyZWN0bHkKLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKiBAcGFyYW0gdW53cmFwCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oZmluYWwgQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXAsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUxpc3QgYXJ0aWZhY3REZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBnZXQgdGhlIGFydGlmYWN0IGxpc3QKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKHVud3JhcCkgewotCQkJCWNoaWxkID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJfQotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgY2hpbGQpCi0JCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQlpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQlhcnRpZmFjdERlc2NMaXN0LmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYoYXJ0aWZhY3REZXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWlmKGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCXJldHVybiAoTGlzdCkgY2hpbGRyZW47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHByb2Nlc3MgdGhlIGFydGlmYWN0IGxpc3QgdG8gZ2V0IHRoZSB0b3AtbW9zdCBvbmVzCi0JCS8vCi0JCVNldCB0b3BNb3N0QXJ0aWZhY3REZXNjTGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgYXJ0aWZhY3REZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoYXJ0aWZhY3REZXNjTGlzdCk7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBjYW5kaWRhdGUgPSBudWxsOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCXdoaWxlICghYXJ0aWZhY3REZXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQotCQkJaWYgKCFmb3VuZCkKLQkJCXsKLQkJCQljYW5kaWRhdGUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBhcnRpZmFjdERlc2NMaXN0LmdldCgwKTsKLQkJCQlhcnRpZmFjdERlc2NMaXN0LnJlbW92ZSgwKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFydGlmYWN0RGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGFydGlmYWN0RGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCWZvdW5kID0gZmFsc2U7Ci0JCQkJaWYgKFByb2Nlc3NVdGlsLmlzQ29udGFpbmVkQnkoY2FuZGlkYXRlLCBhcnRpZmFjdERlc2MsIGFydGlmYWN0RGVzY3JpcHRvcnMpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKFByb2Nlc3NVdGlsLmlzQ29udGFpbmVkQnkoYXJ0aWZhY3REZXNjLCBjYW5kaWRhdGUsIGFydGlmYWN0RGVzY3JpcHRvcnMpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCWNhbmRpZGF0ZSA9IGFydGlmYWN0RGVzYzsKLQotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQgfHwgYXJ0aWZhY3REZXNjTGlzdC5pc0VtcHR5KCkpCi0JCQkJdG9wTW9zdEFydGlmYWN0RGVzY0xpc3QuYWRkKGNhbmRpZGF0ZSk7Ci0JCQllbHNlIGlmIChhcnRpZmFjdERlc2NMaXN0LmlzRW1wdHkoKSkKLQkJCQkJdG9wTW9zdEFydGlmYWN0RGVzY0xpc3QuYWRkKGNhbmRpZGF0ZSk7CQkKLQkJfQotCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGNpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgY2kuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gY2kubmV4dCgpOwotCQkJT2JqZWN0IGUgPSB1bndyYXAgPyBUbmdVdGlsLnVud3JhcChjaGlsZCkgOiBjaGlsZDsKLQkJCWJvb2xlYW4gc2VsZWN0ZWQgPSBmYWxzZTsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlKTsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmICghKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpKSB7Ci0JCQkJCXNlbGVjdGVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKHRvcE1vc3RBcnRpZmFjdERlc2NMaXN0LmNvbnRhaW5zKHdwZCkpIHsKLQkJCQkJc2VsZWN0ZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0ZWQgPSB0cnVlOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQkJcmVzdWx0LmFkZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IGZpbmRBY3Rpdml0eShQcm9jZXNzUGFja2FnZSBwcm9jUGFja2FnZSkgewotCQlpZihwcm9jUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NDb21wb25lbnQpcHJvY1BhY2thZ2UpLmdldFByb2Nlc3MoKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvY1BhY2thZ2UKLQkJCQkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJcmV0dXJuICgoQWN0aXZpdHkpIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpeEJyZWFrZG9ud0VsZW1lbnRPcmRlclJlY3Vyc2l2ZWx5KEFjdGl2aXR5IGFjdCkgewotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGFjdCkgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMzNjgyNjE2ODU2NjMzNTQ0NzhMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCUFycmF5TGlzdCBhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKEFjdGl2aXR5KW9iamVjdCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJYWN0aXZpdGllcy5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGFjdGl2aXRpZXMuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCQotCQl9OwotCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJZml4QnJlYWtkb3duRWxlbWVudE9yZGVyKChBY3Rpdml0eSlpdGVyLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZml4QnJlYWtkb3duRWxlbWVudE9yZGVyKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCUVMaXN0IGxpc3QgPSAoRUxpc3QpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QobGlzdCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlCcmVha2Rvd25FbGVtZW50IHN1Y2MgPSBlLmdldFByZXNlbnRlZEFmdGVyKCk7Ci0JCQlpZihzdWNjICE9IG51bGwgJiYgc3VjYyAhPSBlKSB7Ci0JCQkJaW50IHN1Y2NJZCA9IGxpc3QuaW5kZXhPZihzdWNjKTsKLQkJCQlpZihzdWNjSWQgIT0gLTEpIHsKLQkJCQkJaW50IGlkID0gbGlzdC5pbmRleE9mKGUpOwotCQkJCQlpZihpZCAhPSBzdWNjSWQgLSAxKSB7Ci0JCQkJCQlpZihpZCA8IHN1Y2NJZCkgewotCQkJCQkJCWxpc3QubW92ZShzdWNjSWQgLSAxLCBpZCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlsaXN0Lm1vdmUoc3VjY0lkLCBpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZS5zZXRQcmVzZW50ZWRBZnRlcihudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBpdGVtIHByb3ZpZGVyIHBhdGggb2YgdGhlIGdpdmVuIGFjdGl2aXR5LCB0aGUgcGF0aCBmcm9tIHRvcCBwcm9jZXNzIHRvIHRoZSBhY3Rpdml0eQotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplSXRlbVByb3ZpZGVyUGF0aChBY3Rpdml0eSBhY3Rpdml0eSwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJLy8gZ2V0IHRoZSBhY3Rpdml0eSBwYXRoCi0JCS8vCi0JCUFycmF5TGlzdCBhY3RQYXRoID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IoYWN0aXZpdHkgPSBhY3Rpdml0eS5nZXRTdXBlckFjdGl2aXRpZXMoKTsgYWN0aXZpdHkgIT0gbnVsbDsgYWN0aXZpdHkgPSBhY3Rpdml0eS5nZXRTdXBlckFjdGl2aXRpZXMoKSkgewotCQkJYWN0UGF0aC5hZGQoMCwgYWN0aXZpdHkpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdFBhdGguaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXAgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChhY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpcC5nZXRDaGlsZHJlbihhY3QpOwotCQl9Ci0JfQkJCi0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gYWN0aXZpdHkgb3IgYW55IG9mIGl0cyBzdWJhY3Rpdml0aWVzIGlzIGEgY29udHJpYnV0b3Igb3IgcmVwbGFjZXIKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcihBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGFjdGl2aXR5KSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMEw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChBY3Rpdml0eSlvYmplY3QpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJfQotCQkJCi0JCX07Ci0JCQotCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCVZhcmlhYmlsaXR5VHlwZSB2VHlwZSA9IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJaWYoYmFzZSAhPSBudWxsICYmICh2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCB8fCB2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCkpIHsKLS8vCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgYmFzZSk7Ci0vLwkJCQlpZihwcm9jICE9IHByb2Nlc3MpIHsKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0JCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUb3BQcm9jZXNzKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIFByb2Nlc3MgJiYgKChQcm9jZXNzKXRhcmdldCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd3BEZXNjTGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoQ29sbGVjdGlvbiBlbGVtZW50cywgV29ya1Byb2R1Y3Qgd3ApIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcillKTsKLQkJCQlpZih3cGQuZ2V0V29ya1Byb2R1Y3QoKSA9PSB3cCkgewotCQkJCQlyZXR1cm4gd3BkOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXNrRGVzY0xpc3QKLQkgKiBAcGFyYW0gdGFzawotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRhc2tEZXNjcmlwdG9yIGdldFRhc2tEZXNjcmlwdG9yKENvbGxlY3Rpb24gZWxlbWVudHMsIFRhc2sgdGFzaykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZihlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgZTsKLQkJCQlpZih0ZC5nZXRUYXNrKCkgPT0gdGFzaykgewotCQkJCQlyZXR1cm4gdGQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG93bmluZyB3b3JrIGJyZWFrZG93biBlbGVtZW50IG9mIGEgd29yayBvcmRlci4KLQkgKiAKLQkgKiBAcGFyYW0gd29ya09yZGVyCi0JICogICAgICAgICAgICBhIHdvcmsgb3JkZXIKLQkgKiBAcmV0dXJuIGEgd29yayBicmVha2Rvd24gZWxlbWVudCB0aGF0IG93bnMgdGhlIHdvcmsgb3JkZXIgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrQnJlYWtkb3duRWxlbWVudCBnZXRPd25lcihXb3JrT3JkZXIgd29ya09yZGVyKSB7Ci0JCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRTdWNjZXNzb3Iod29ya09yZGVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0Q29tcG9zZWRXcmFwcGVyKE9iamVjdCBvYmplY3QpIHsKLQkJd2hpbGUoIShvYmplY3QgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKQotCQkJCSYmIG9iamVjdCBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlvYmplY3QgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCkuZ2V0VmFsdWUoKTsKLQkJfQotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzcGxheSBuYW1lIGZvciB0aGUgZ2l2ZW4gYnJlYWtkb3duIHN0cnVjdHVyZSBjb2x1bW4gSUQuIFRoZQotCSAqIGJyZWFrZG93biBzdHJ1Y3R1cmUgY29sdW1uIElEcyBhcmUgZGVmaW5lZCBhcyBjb25zdGFudHMgaW4KLQkgKiB7QGxpbmsgSUJTSXRlbVByb3ZpZGVyfSB0aGF0IHN0YXJ0IHdpdGggQ09MXwotCSAqIAotCSAqIEBwYXJhbSBjb2x1bW5OYW1lCi0JICogICAgICAgICAgICBvbmUgb2YgdGhlIGNvbHVtbnMgSUQgY29uc3RhbnRzIChDT0xfWFhYKSBkZWZpbmVkIGluCi0JICogICAgICAgICAgICB7QGxpbmsgSUJTSXRlbVByb3ZpZGVyfQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRDb2x1bW5EaXNwbGF5TmFtZShTdHJpbmcgY29sdW1uSWQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIkJTX0NvbHVtbl8iICsgY29sdW1uSWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gY29sdW1uSWQ7Ci0JfQotCQotCQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMgdW5kZXIgc2VsZWN0ZWQgYWN0aXZpdGllcwotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFRhc2tEZXNjcmlwdG9ycyhMaXN0IHNlbGVjdGlvbikgewotCQlMaXN0IHRhc2tEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0b3JPYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChpdG9yT2JqIGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJfHwgaXRvck9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWdldFRhc2tEZXNjcmlwdG9ycyhhZGFwdGVyRmFjdG9yeSwgaXRvck9iaiwgdGFza0Rlc2NyaXB0b3JzKTsKLQkJCX0KLQkJCWlmIChpdG9yT2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IKLQkJCQkJfHwgaXRvck9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWlmICghdGFza0Rlc2NyaXB0b3JzLmNvbnRhaW5zKGl0b3JPYmopKQotCQkJCQl0YXNrRGVzY3JpcHRvcnMuYWRkKGl0b3JPYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRvcnM7Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0VGFza0Rlc2NyaXB0b3JzKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3QgYWN0LAotCQkJTGlzdCB0YXNrRGVzY3JpcHRvcnMpIHsKLQkJT2JqZWN0IGxpc3QgPSBudWxsOwotCQlpZiAoYWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoYWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJLy8gZ2V0IGNoaWxkcmVuCi0JCQlsaXN0ID0gYWRhcHRlci5nZXRDaGlsZHJlbihhY3QpOwotCQl9IGVsc2UgaWYgKGFjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJbGlzdCA9ICgoV3JhcHBlckl0ZW1Qcm92aWRlcikgYWN0KS5nZXRDaGlsZHJlbihhY3QpOwotCQl9Ci0JCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdCBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCUxpc3QgY2hpbGRyZW4gPSAoTGlzdCkgbGlzdDsKLQkJCWZvciAoSXRlcmF0b3IgY2hpbGRJdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgY2hpbGRJdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gY2hpbGRJdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgb2JqIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWdldFRhc2tEZXNjcmlwdG9ycyhhZGFwdGVyRmFjdG9yeSwgb2JqLCB0YXNrRGVzY3JpcHRvcnMpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlpZiAoIXRhc2tEZXNjcmlwdG9ycy5jb250YWlucyhvYmopKQotCQkJCQkJdGFza0Rlc2NyaXB0b3JzLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TZWN0aW9uTGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU2VjdGlvbkxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjM1ZTljYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TZWN0aW9uTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwudXRpbC5TdHJpbmdSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIGFsbCB0aGUgbG9naWNzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgYWxsCi0gKiBjb250cmlidXRlZC9pbmhlcml0ZWQgc2VjdGlvbnMgb2YgdGhlIGdpdmVuIGVsZW1lbnQgYXMgd2VsbCBhcyBhbGxvd3MKLSAqIG1hbmlwdWxhdGUgdGhpcyBsaXN0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvbkxpc3QgZXh0ZW5kcyBCYXNpY0VMaXN0IHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTc1NzI3OTc0ODcwNjkyMzNMOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSX0lORk9fTkFNRSA9ICJzZWN0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBERUZBVUxUX1NBVkVfT1BUSU9OUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEVQU19GT1JfRUxFTUVOVF9PTkxZID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNURVBTX0ZPUl9FTEVNRU5UX0FORF9QQVJFTlRTID0gMjsKLQotCXN0YXRpYyB7Ci0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsICJBU0NJSSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudCBlZGl0RWxlbWVudDsKLQotCXByaXZhdGUgYm9vbGVhbiBtaXhlZCA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbnRyaWJ1dG9yKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCXJldHVybiBUbmdVdGlsLmlzQ29udHJpYnV0b3IoZSk7Ci0JfQotCi0JcHVibGljIFNlY3Rpb25MaXN0KENvbnRlbnRFbGVtZW50IGUsIGludCBzY29wZSkgewotCQllZGl0RWxlbWVudCA9IGU7Ci0JCWlmIChzY29wZSA9PSBTVEVQU19GT1JfRUxFTUVOVF9PTkxZKSB7Ci0JCQltaXhlZCA9IGZhbHNlOwotCQl9IGVsc2UgaWYgKHNjb3BlID09IFNURVBTX0ZPUl9FTEVNRU5UX0FORF9QQVJFTlRTKSB7Ci0JCQljYWxjdWxhdGVQYXJlbnRzT25seShlKTsKLQkJfSBlbHNlIHsKLQkJCW1peGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlUGFyZW50c09ubHkoQ29udGVudEVsZW1lbnQgZSkgewotCQlJdGVyYXRvciBpdGVyID0gbnVsbDsKLQkJLy8gaWYoaXNDb250cmlidXRvcihlKSkgewotCQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBmb3IgIiArIGUuZ2V0TmFtZSgpICsgIiA9IGNvbnRyaWJ1dGluZyBpcwotCQkvLyB0cnVlIik7Ci0JCS8vIExpc3Qgc3VwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBVbWFVdGlsLmdldEFsbFN1cGVycyhzdXBlcnMsIGUsIFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMKTsKLQkJLy8gc3VwZXJzLmFkZChlKTsKLQkJLy8gaXRlciA9IHN1cGVycy5pdGVyYXRvcigpOwotCQkvLyB9IGVsc2UgaWYoaXNFeHRlbmRlZChlKSkgewotCQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBmb3IgIiArIGUuZ2V0TmFtZSgpICsgIiA9IGV4dGVuZGluZyBpcwotCQkvLyB0cnVlIik7Ci0JCS8vIExpc3Qgc3VwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBVbWFVdGlsLmdldEFsbFN1cGVycyhzdXBlcnMsIGUsIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpOwotCQkvLyBzdXBlcnMuYWRkKGUpOwotCQkvLyBpdGVyID0gc3VwZXJzLml0ZXJhdG9yKCk7Ci0JCS8vIH0KLQkJaWYgKGlzQ29udHJpYnV0b3IoZSkgfHwgaXNFeHRlbmRlZChlKSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgZm9yICIgKyBlLmdldE5hbWUoKSArICIgPSBjb250cmlidXRpbmcgaXMKLQkJCS8vIHRydWUiKTsKLQkJCUxpc3Qgc3VwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJVW1hVXRpbC5nZXRBbGxTdXBlcnNCb3RoKHN1cGVycywgZSwKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwsCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpOwotCQkJc3VwZXJzLmFkZChlKTsKLQkJCWl0ZXIgPSBzdXBlcnMuaXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCW1peGVkID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAobWl4ZWQpIHsKLQkJCS8vIGNyZWF0ZSBhIG1hcCBvZiBHVUlEIC8gY29udHJpYnV0b3IKLQkJCS8vCi0JCQlPcmRlckluZm8gbGF0ZXN0SW5mbyA9IG51bGw7Ci0JCQlNYXAgZ3VpZFNlY3Rpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJU2V0IHNlY3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUNvbnRlbnRFbGVtZW50IGVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlbGVtZW50KSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJCS5nZXRTZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCVNlY3Rpb24gc2VjdCA9IChTZWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlndWlkU2VjdGlvbk1hcC5wdXQoc2VjdC5nZXRHdWlkKCksIHNlY3QpOwotCQkJCQkJc2VjdHMuYWRkKHNlY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSBUbmdVdGlsLmdldE9yZGVySW5mbyhlbGVtZW50LAotCQkJCQkJT1JERVJfSU5GT19OQU1FKTsKLQkJCQlpZiAob3JkZXJJbmZvICE9IG51bGwpIHsKLQkJCQkJaWYgKGxhdGVzdEluZm8gPT0gbnVsbAotCQkJCQkJCXx8IG9yZGVySW5mby5nZXRUaW1lc3RhbXAoKSA+IGxhdGVzdEluZm8KLQkJCQkJCQkJCS5nZXRUaW1lc3RhbXAoKSkgewotCQkJCQkJbGF0ZXN0SW5mbyA9IG9yZGVySW5mbzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGxhdGVzdEluZm8gIT0gbnVsbCkgewotCQkJCS8vIHJlb3JkZXIgdGhlIHNlY3Rpb25zIGJhc2VkIG9uIHRoZSBsYXRlc3Qgb3JkZXIgaW5mbwotCQkJCS8vCi0JCQkJaW50IHNpemUgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBndWlkID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLmdldChpKTsKLQkJCQkJT2JqZWN0IHNlY3QgPSBndWlkU2VjdGlvbk1hcC5nZXQoZ3VpZCk7Ci0JCQkJCWlmIChzZWN0ICE9IG51bGwpIHsKLQkJCQkJCXN1cGVyLmFkZChzZWN0KTsKLQkJCQkJCXNlY3RzLnJlbW92ZShzZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXN1cGVyLmFkZEFsbChzZWN0cyk7Ci0JCX0KLQl9Ci0KLQkvLyBkZXByZWNhdGUgdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvcgotCXB1YmxpYyBTZWN0aW9uTGlzdChDb250ZW50RWxlbWVudCBlKSB7Ci0JCWVkaXRFbGVtZW50ID0gZTsKLQkJSXRlcmF0b3IgaXRlciA9IG51bGw7Ci0JCWlmIChpc0NvbnRyaWJ1dG9yKGUpIHx8IFRuZ1V0aWwuaGFzQ29udHJpYnV0b3IoZSkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gVG5nVXRpbC5nZXRCYXNlKGUpOwotCQkJaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihiYXNlKSB7Ci0KLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyYXRvcgotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJaWYgKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwpIHsKLQkJCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJfQotCi0JCQl9OwotCQl9IGVsc2UgaWYgKGlzRXh0ZW5kZWQoZSkpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIiQkJCBmb3IgIiArIGUuZ2V0TmFtZSgpICsgIiA9IGV4dGVuZGVkIGlzIHRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlMaXN0IHN1cGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVVtYVV0aWwuZ2V0QWxsU3VwZXJzKHN1cGVycywgZSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCk7Ci0JCQlzdXBlcnMuYWRkKGUpOwotCQkJaXRlciA9IHN1cGVycy5pdGVyYXRvcigpOwotCQl9IGVsc2UgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChtaXhlZCkgewotCQkJLy8gY3JlYXRlIGEgbWFwIG9mIEdVSUQgLyBjb250cmlidXRvcgotCQkJLy8KLQkJCU9yZGVySW5mbyBsYXRlc3RJbmZvID0gbnVsbDsKLQkJCU1hcCBndWlkU2VjdGlvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlMaXN0IHNlY3RzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUNvbnRlbnRFbGVtZW50IGVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlbGVtZW50KSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJCS5nZXRTZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCVNlY3Rpb24gc2VjdCA9IChTZWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlndWlkU2VjdGlvbk1hcC5wdXQoc2VjdC5nZXRHdWlkKCksIHNlY3QpOwotCQkJCQkJc2VjdHMuYWRkKHNlY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSBUbmdVdGlsLmdldE9yZGVySW5mbyhlbGVtZW50LAotCQkJCQkJT1JERVJfSU5GT19OQU1FKTsKLQkJCQlpZiAob3JkZXJJbmZvICE9IG51bGwpIHsKLQkJCQkJaWYgKGxhdGVzdEluZm8gPT0gbnVsbAotCQkJCQkJCXx8IG9yZGVySW5mby5nZXRUaW1lc3RhbXAoKSA+IGxhdGVzdEluZm8KLQkJCQkJCQkJCS5nZXRUaW1lc3RhbXAoKSkgewotCQkJCQkJbGF0ZXN0SW5mbyA9IG9yZGVySW5mbzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGxhdGVzdEluZm8gIT0gbnVsbCkgewotCQkJCS8vIHJlb3JkZXIgdGhlIHNlY3Rpb25zIGJhc2VkIG9uIHRoZSBsYXRlc3Qgb3JkZXIgaW5mbwotCQkJCS8vCi0JCQkJaW50IHNpemUgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBndWlkID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLmdldChpKTsKLQkJCQkJT2JqZWN0IHNlY3QgPSBndWlkU2VjdGlvbk1hcC5nZXQoZ3VpZCk7Ci0JCQkJCWlmIChzZWN0ICE9IG51bGwpIHsKLQkJCQkJCXN1cGVyLmFkZChzZWN0KTsKLQkJCQkJCXNlY3RzLnJlbW92ZShzZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXN1cGVyLmFkZEFsbChzZWN0cyk7Ci0JCX0KLQkJLy8gZWxzZSB7Ci0JCS8vIC8vIGFkZEFsbChlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpKTsKLQkJLy8gbWl4ZWQgPSBmYWxzZTsKLQkJLy8gfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRlZChDb250ZW50RWxlbWVudCBlKSB7Ci0JCXJldHVybiBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMOwotCX0KLQotCS8qKgotCSAqIEFwcGxpZXMgcmVjZW50IGNoYW5nZXMgaW4gdGhlIGxpc3QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseSgpIHsKLQkJaWYgKCFtaXhlZCB8fCAhY2hhbmdlZCkKLQkJCXJldHVybjsKLQotCQkvLyBzYXZlIHRoZSBvcmRlciBpbmZvIHRvIHRoZSBvcmRlcmluZ0d1aWRlIG9mIHRoZSBlZGl0RWxlbWVudAotCQkvLwotCQlTdHJpbmcgc3RyID0gZWRpdEVsZW1lbnQuZ2V0T3JkZXJpbmdHdWlkZSgpOwotCQlPcmRlckluZm9Db2xsZWN0aW9uIG9yZGVySW5mb3MgPSBudWxsOwotCQlTdHJpbmdSZXNvdXJjZSByZXMgPSBudWxsOwotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApIHsKLQkJCW9yZGVySW5mb3MgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9IG5ldyBTdHJpbmdSZXNvdXJjZShzdHIpOwotCQkJdHJ5IHsKLQkJCQlyZXMubG9hZChudWxsKTsKLQkJCQlpZiAocmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCW9yZGVySW5mb3MgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvcmRlckluZm9zID0gKE9yZGVySW5mb0NvbGxlY3Rpb24pIHJlcy5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGZpbmQgdGhlIG9yZGVyIGluZm9yIGZvciBzZWN0aW9ucwotCQkvLwotCQlPcmRlckluZm8gc2VjdE9yZGVySW5mbyA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9yZGVySW5mb3MuZ2V0T3JkZXJJbmZvcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT3JkZXJJbmZvIG9yZGVySW5mbyA9IChPcmRlckluZm8pIGl0ZXIubmV4dCgpOwotCQkJaWYgKE9SREVSX0lORk9fTkFNRS5lcXVhbHNJZ25vcmVDYXNlKG9yZGVySW5mby5nZXROYW1lKCkpKSB7Ci0JCQkJc2VjdE9yZGVySW5mbyA9IG9yZGVySW5mbzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChzZWN0T3JkZXJJbmZvID09IG51bGwpIHsKLQkJCXNlY3RPcmRlckluZm8gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9yZGVySW5mbygpOwotCQkJc2VjdE9yZGVySW5mby5zZXROYW1lKE9SREVSX0lORk9fTkFNRSk7Ci0JCQlvcmRlckluZm9zLmdldE9yZGVySW5mb3MoKS5hZGQoc2VjdE9yZGVySW5mbyk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWN0T3JkZXJJbmZvLmdldEdVSURzKCkuY2xlYXIoKTsKLQkJfQotCi0JCWludCBzaXplID0gc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJU2VjdGlvbiBzZWN0ID0gKFNlY3Rpb24pIGdldChpKTsKLQkJCXNlY3RPcmRlckluZm8uZ2V0R1VJRHMoKS5hZGQoc2VjdC5nZXRHdWlkKCkpOwotCQl9Ci0JCXNlY3RPcmRlckluZm8uc2V0VGltZXN0YW1wKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJaWYgKHJlcyA9PSBudWxsKSB7Ci0JCQlyZXMgPSBuZXcgU3RyaW5nUmVzb3VyY2UobnVsbCk7Ci0JCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQob3JkZXJJbmZvcyk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJlcy5zYXZlKERFRkFVTFRfU0FWRV9PUFRJT05TKTsKLQkJCXN0ciA9IHJlcy5nZXRTdHJpbmcoKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdGlvbkxpc3QuYXBwbHkoKTogbmV3IG9yZGVyaW5nIGd1aWRlIik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLSBvcmRlcmluZ0d1aWRlIHN0YXJ0IC0tLS0tLSIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHN0cik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLSBvcmRlcmluZ0d1aWRlIGVuZCAtLS0tLS0iKTsKLQkJCWVkaXRFbGVtZW50LnNldE9yZGVyaW5nR3VpZGUoc3RyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlKFNlY3Rpb24gc2VjdGlvbikgewotCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oZWRpdEVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkgPT0gc2VjdGlvbi5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCWlmICghY2FuUmVtb3ZlKChTZWN0aW9uKSBnZXQoaW5kZXgpKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCU9iamVjdCByZW1vdmVkID0gc3VwZXIucmVtb3ZlKGluZGV4KTsKLQkJCWVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkucmVtb3ZlKHJlbW92ZWQpOwotCQkJcmV0dXJuIHJlbW92ZWQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5yZW1vdmUoaW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCWlmICghY2FuUmVtb3ZlKChTZWN0aW9uKSBvKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG1peGVkKSB7Ci0JCQlpZiAoc3VwZXIucmVtb3ZlKG8pKSB7Ci0JCQkJZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5yZW1vdmUobyk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkucmVtb3ZlKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGMpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCQlJdGVyYXRvciBlID0gaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvID0gZS5uZXh0KCk7Ci0JCQkJaWYgKGMuY29udGFpbnMobykgJiYgY2FuUmVtb3ZlKChTZWN0aW9uKSBvKSkgewotCQkJCQllLnJlbW92ZSgpOwotCQkJCQllZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnJlbW92ZShvKTsKLQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtb2RpZmllZDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnJlbW92ZUFsbChjKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJc3VwZXIuYWRkKGluZGV4LCBlbGVtZW50KTsKLQkJCWVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuYWRkKGVsZW1lbnQpOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQllZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pIHsKLQkJYm9vbGVhbiBiID0gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5hZGQobyk7Ci0JCWlmIChtaXhlZCkgewotCQkJYiA9IHN1cGVyLmFkZChvKTsKLQkJCWlmIChiKQotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGMpIHsKLQkJYm9vbGVhbiBiID0gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5hZGRBbGwoYyk7Ci0JCWlmIChtaXhlZCkgewotCQkJYiA9IHN1cGVyLmFkZEFsbChjKTsKLQkJCWlmIChiKQotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb24gYykgewotCQlpZiAobWl4ZWQpIHsKLQkJCWVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuYWRkQWxsKGMpOwotCQkJYm9vbGVhbiBiID0gc3VwZXIuYWRkQWxsKGluZGV4LCBjKTsKLQkJCWlmIChiKQotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmFkZEFsbChpbmRleCwgYyk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAobWl4ZWQpCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuc2V0KGluZGV4LCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKG1peGVkKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCWVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlKGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXN1cGVyLm1vdmUoaW5kZXgsIG9iamVjdCk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCSgoRUxpc3QpIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkpLm1vdmUoaW5kZXgsCi0JCQkJCW9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlPYmplY3QgbW92ZWQgPSBzdXBlci5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCXJldHVybiBtb3ZlZDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKEVMaXN0KSBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpKS5tb3ZlKAotCQkJCQl0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLmdldChpbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5nZXQoaW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci5zaXplKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5zaXplKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLml0ZXJhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5pdGVyYXRvcigpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci5jb250YWlucyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmNvbnRhaW5zKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci5jb250YWluc0FsbChjb2xsZWN0aW9uKTsKLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY29udGFpbnNBbGwoCi0JCQkJY29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gYXJyYXkpIHsKLQkJaWYgKG1peGVkKQotCQkJcmV0dXJuIHN1cGVyLnRvQXJyYXkoYXJyYXkpOwotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS50b0FycmF5KGFycmF5KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIuaW5kZXhPZihvYmplY3QpOwotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5pbmRleE9mKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci5sYXN0SW5kZXhPZihvYmplY3QpOwotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5sYXN0SW5kZXhPZihvYmplY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWl4ZWQoKSB7Ci0JCXJldHVybiBtaXhlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TdGVwTGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU3RlcExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDU1MGVhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TdGVwTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFJlb3JkZXIgc3RlcHMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0ZXBMaXN0IHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NzU2NzMyNTg0OTg1ODg3MUw7Ci0KLQlwcml2YXRlIHN0YXRpYyBEZXNjcmliYWJsZUVsZW1lbnQgZ2V0RGVzY3JpYmFibGVFbGVtZW50KFNlY3Rpb24gc3RlcCkgewotCQlyZXR1cm4gKERlc2NyaWJhYmxlRWxlbWVudCkgc3RlcC5lQ29udGFpbmVyKCkuZUNvbnRhaW5lcigpOwotCX0KLQotCXByaXZhdGUgVGFzayBjdXJyZW50VGFzazsKLQotCXByaXZhdGUgTGlua2VkTGlzdCBzdGVwTGlzdHM7Ci0KLQlwdWJsaWMgU3RlcExpc3QoVGFzayBjdXJyZW50VGFzaywgTGlzdCBzdGVwTGlzdHMpIHsKLQkJdGhpcy5jdXJyZW50VGFzayA9IGN1cnJlbnRUYXNrOwotCQl0aGlzLnN0ZXBMaXN0cyA9IG5ldyBMaW5rZWRMaXN0KHN0ZXBMaXN0cyk7Ci0JCXJlb3JkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVvcmRlcigpIHsKLQkJTWFwIG93bmVyU2VjdGlvbnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlpbnQgc2l6ZSA9IHN0ZXBMaXN0cy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlFY29yZUVMaXN0IGVMaXN0ID0gKEVjb3JlRUxpc3QpIHN0ZXBMaXN0cy5nZXQoaSk7Ci0JCQlvd25lclNlY3Rpb25zTWFwLnB1dChlTGlzdC5nZXROb3RpZmllcigpLCBlTGlzdCk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChzdGVwTGlzdHMpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGlzdCBzdGVwTGlzdCA9IChMaXN0KSBpdGVyLm5leHQoKTsKLQkJCWlmICghc3RlcExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJU2VjdGlvbiBzdGVwID0gKFNlY3Rpb24pIHN0ZXBMaXN0LmdldCgwKTsKLQkJCQlTZWN0aW9uIHByZWQgPSBzdGVwLmdldFByZWRlY2Vzc29yKCk7Ci0JCQkJaWYgKHByZWQgPT0gbnVsbCkgewotCQkJCQlMaXN0IG9sZEZpcnN0TGlzdCA9IChMaXN0KSBzdGVwTGlzdHMuZ2V0KDApOwotCi0JCQkJCS8vIHB1dCB0aGlzIHN0ZXAgbGlzdCBhdCBiZWdpbm5pbmcKLQkJCQkJLy8KLQkJCQkJc3RlcExpc3RzLnJlbW92ZShzdGVwTGlzdCk7Ci0JCQkJCXN0ZXBMaXN0cy5hZGQoMCwgc3RlcExpc3QpOwotCi0JCQkJCS8vIHNldCB0aGlzIHN0ZXAgbGlzdCB0byBiZSB0aGUgcHJlZGVjZXNzb3Igb2YgdGhlIHByZXZpb3VzCi0JCQkJCS8vIGZpcnN0IGxpc3QKLQkJCQkJLy8KLQkJCQkJaWYgKCFvbGRGaXJzdExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQlTZWN0aW9uIG9sZEZpcnN0U3RlcCA9IChTZWN0aW9uKSBvbGRGaXJzdExpc3QuZ2V0KDApOwotCQkJCQkJaWYgKFRuZ1V0aWwuY2FuUmVmZXJlbmNlKAotCQkJCQkJCQlnZXREZXNjcmliYWJsZUVsZW1lbnQob2xkRmlyc3RTdGVwKSwKLQkJCQkJCQkJZ2V0RGVzY3JpYmFibGVFbGVtZW50KHN0ZXApKSkgewotCQkJCQkJCW9sZEZpcnN0U3RlcC5zZXRQcmVkZWNlc3NvcihzdGVwKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUxpc3QgcHJlZExpc3QgPSAoTGlzdCkgb3duZXJTZWN0aW9uc01hcC5nZXQocHJlZAotCQkJCQkJCS5lQ29udGFpbmVyKCkpOwotCQkJCQlzdGVwTGlzdHMucmVtb3ZlKHByZWRMaXN0KTsKLQkJCQkJaW50IGlkID0gc3RlcExpc3RzLmluZGV4T2Yoc3RlcExpc3QpOwotCQkJCQlzdGVwTGlzdHMuYWRkKGlkLCBwcmVkTGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSB2b2lkIHJlYXNzaWduUHJlZGVjZXNzb3JzKCkgewotCS8vCi0JLy8gfQotCi0JcHVibGljIExpc3QgZ2V0U3RlcHMoKSB7Ci0JCUxpc3QgYWxsU3RlcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWludCBzaXplID0gc3RlcExpc3RzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUxpc3Qgc3RlcHMgPSAoTGlzdCkgc3RlcExpc3RzLmdldChpKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHN0ZXBzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWFsbFN0ZXBzLmFkZChpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFsbFN0ZXBzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1vdmVVcChTZWN0aW9uIHN0ZXApIHsKLQkJTGlzdCBzdGVwcyA9IGN1cnJlbnRUYXNrLmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCk7Ci0JCWludCBpZCA9IHN0ZXBzLmluZGV4T2Yoc3RlcCk7Ci0JCWlmIChpZCA9PSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlkID4gMCkgewotCQkJaWYgKGlkID09IDEpIHsKLQotCQkJfQotCQkJLy8gbW92ZSB0aGUgc3RlcCB3aXRoaW4gaXRzIGxpc3QKLQkJCS8vCi0JCQlDb2xsZWN0aW9ucy5zd2FwKHN0ZXBzLCBpZCAtIDEsIGlkKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIG1vdmUgdGhlIHdob2xlIHN0ZXAgbGlzdCB1cAotCQkvLwotCQlpZCA9IHN0ZXBMaXN0cy5pbmRleE9mKHN0ZXBzKTsKLQkJaWYgKGlkID09IC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCQlMaXN0IHByZWRMaXN0ID0gbnVsbDsKLQkJaW50IHByZWRMaXN0SWQgPSBpZCAtIDE7Ci0JCS8vIGxvb2sgZm9yIG5vbi1lbXB0eSBwcmVkZWNlc3NvciBsaXN0Ci0JCS8vCi0JCWZpbmRfcHJlZExpc3Q6IGZvciAoOyBwcmVkTGlzdElkID4gLTE7IHByZWRMaXN0SWQtLSkgewotCQkJTGlzdCBsaXN0ID0gKExpc3QpIHN0ZXBMaXN0cy5nZXQocHJlZExpc3RJZCk7Ci0JCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJcHJlZExpc3QgPSBsaXN0OwotCQkJCWJyZWFrIGZpbmRfcHJlZExpc3Q7Ci0JCQl9Ci0JCX0KLQkJU2VjdGlvbiBvbGRQcmVkID0gKChTZWN0aW9uKSBzdGVwcy5nZXQoMCkpLmdldFByZWRlY2Vzc29yKCk7Ci0JCUxpc3Qgb2xkU3VjY2Vzc29ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFN1Y2Nlc3NvcnMoKFNlY3Rpb24pIHN0ZXBzCi0JCQkJLmdldChzdGVwcy5zaXplKCkgLSAxKSk7Ci0JCWlmIChwcmVkTGlzdCAhPSBudWxsKSB7Ci0JCQlzdGVwTGlzdHMucmVtb3ZlKHN0ZXBzKTsKLQkJCXN0ZXBMaXN0cy5hZGQocHJlZExpc3RJZCwgc3RlcHMpOwotCQkJU2VjdGlvbiBsYXN0ID0gKFNlY3Rpb24pIHByZWRMaXN0LmdldChwcmVkTGlzdC5zaXplKCkgLSAxKTsKLQkJCUxpc3Qgb2xkUHJlZFN1Y2Nlc3NvcnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRTdWNjZXNzb3JzKGxhc3QpOwotCQkJaWYgKFRuZ1V0aWwuY2FuUmVmZXJlbmNlKGN1cnJlbnRUYXNrLCBnZXREZXNjcmliYWJsZUVsZW1lbnQobGFzdCkpKSB7Ci0JCQkJc3RlcC5zZXRQcmVkZWNlc3NvcihsYXN0KTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbGRQcmVkU3VjY2Vzc29ycy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlTZWN0aW9uIHNlY3QgPSAoU2VjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJCXNlY3Quc2V0UHJlZGVjZXNzb3Ioc3RlcCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJc3RlcExpc3RzLmFkZCgwLCBzdGVwcyk7Ci0JCX0KLQkJRGVzY3JpYmFibGVFbGVtZW50IG9sZFByZWRUYXNrID0gZ2V0RGVzY3JpYmFibGVFbGVtZW50KG9sZFByZWQpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbGRTdWNjZXNzb3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU2VjdGlvbiBzZWN0ID0gKFNlY3Rpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKFRuZ1V0aWwuY2FuUmVmZXJlbmNlKGdldERlc2NyaWJhYmxlRWxlbWVudChzZWN0KSwgb2xkUHJlZFRhc2spKSB7Ci0JCQkJc2VjdC5zZXRQcmVkZWNlc3NvcihvbGRQcmVkKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1vdmVEb3duKFNlY3Rpb24gc3RlcCkgewotCQlMaXN0IHN0ZXBzID0gY3VycmVudFRhc2suZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKTsKLQkJaW50IGlkID0gc3RlcHMuaW5kZXhPZihzdGVwKTsKLQkJaWYgKGlkID09IC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaWQgPCBzdGVwcy5zaXplKCkgLSAxKSB7Ci0JCQkvLyBtb3ZlIHRoZSBzdGVwIHdpdGhpbiBpdHMgbGlzdAotCQkJLy8KLQkJCUNvbGxlY3Rpb25zLnN3YXAoc3RlcHMsIGlkICsgMSwgaWQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gbW92ZSB0aGUgd2hvbGUgc3RlcCBsaXN0IHVwCi0JCS8vCi0JCWlkID0gc3RlcExpc3RzLmluZGV4T2Yoc3RlcHMpOwotCQlpZiAoaWQgPT0gLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUxpc3Qgc3VjY0xpc3QgPSBudWxsOwotCQlpbnQgc3VjY0xpc3RJZCA9IGlkICsgMTsKLQkJaW50IHNpemUgPSBzdGVwTGlzdHMuc2l6ZSgpOwotCi0JCS8vIGxvb2sgZm9yIG5vbi1lbXB0eSBzdWNjZXNzb3IgbGlzdAotCQkvLwotCQlmaW5kX0xpc3Q6IGZvciAoOyBzdWNjTGlzdElkIDwgc2l6ZTsgc3VjY0xpc3RJZCsrKSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgc3RlcExpc3RzLmdldChzdWNjTGlzdElkKTsKLQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlzdWNjTGlzdCA9IGxpc3Q7Ci0JCQkJYnJlYWsgZmluZF9MaXN0OwotCQkJfQotCQl9Ci0JCWlmIChzdWNjTGlzdCAhPSBudWxsKSB7Ci0JCQlzdGVwTGlzdHMucmVtb3ZlKHN1Y2NMaXN0KTsKLQkJCXN0ZXBMaXN0cy5hZGQoaWQsIHN1Y2NMaXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN0ZXBMaXN0cy5hZGQoc3RlcHMpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1N1cHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TdXBwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNDRjNTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1N1cHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5XcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Db21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjYWxjdWxhdGVzIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZSwgYm90aCBkaXJlY3QgYW5kIGluZGlyZWN0LCBvZiBhbnkKLSAqIGJyZWFrZG93biBlbGVtZW50IG9yIGl0cyB3cmFwcGVyIGluIHRoZSBzcGVjaWZpZWQgcHJvY2Vzcy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgOSwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3VwcHJlc3Npb24gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0JTID0gIndicyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQlMgPSAidGJzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdQQlMgPSAid3BicyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQlMgPSAiY2JzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIHByb2NUb1N1cHByZXNzaW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYXV0b0luaGVyaXRJbnRlcm1lZGlhdGVTdXBwcmVzc2lvblN0YXRlID0gdHJ1ZTsKLQotCXByaXZhdGUgUHJvY2VzcyBwcm9jZXNzOwotCi0JcHJpdmF0ZSBTZXQgc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzOwotCi0JcHJpdmF0ZSBib29sZWFuIG1vZGlmaWVkOwotCi0JcHJpdmF0ZSBTZXQgaW50ZXJuYWxVbnN1cHByZXNzZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgY2xlYXJDYWNoZWRTdXBwcmVzc2lvbnMoKSB7Ci0JCXByb2NUb1N1cHByZXNzaW9uTWFwLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBzdXBwcmVzc2lvbnMgb2YgaW52YWxpZCBwcm9jZXNzZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgY2xlYW5VcCgpIHsKLQkJQXJyYXlMaXN0IGxpc3RUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChwcm9jVG9TdXBwcmVzc2lvbk1hcC5rZXlTZXQoKSkKLQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgaXRlci5uZXh0KCk7Ci0JCQlpZiAocHJvYy5lSXNQcm94eSgpKSB7Ci0JCQkJbGlzdFRvUmVtb3ZlLmFkZChwcm9jKTsKLQkJCX0KLQkJfQotCQlpbnQgc2l6ZSA9IGxpc3RUb1JlbW92ZS5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlwcm9jVG9TdXBwcmVzc2lvbk1hcC5yZW1vdmUobGlzdFRvUmVtb3ZlLmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2V0QXV0b0luaGVyaXRTdXBwcmVzc2lvblN0YXRlcyhib29sZWFuIGIpIHsKLQkJYXV0b0luaGVyaXRJbnRlcm1lZGlhdGVTdXBwcmVzc2lvblN0YXRlID0gYjsKLQl9Ci0KLQlwdWJsaWMgU3VwcHJlc3Npb24oUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyA9IGxvYWRTdXBwcmVzc2VkRWxlbWVudFBhdGhzKCk7Ci0JfQotCi0JcHVibGljIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JcHJpdmF0ZSBTZXQgbG9hZFN1cHByZXNzZWRFbGVtZW50UGF0aHMoKSB7Ci0JCUNvbnN0cmFpbnQgcnVsZSA9IENvbnN0cmFpbnRNYW5hZ2VyLmdldENvbnN0cmFpbnQocHJvY2VzcywKLQkJCQlDb25zdHJhaW50TWFuYWdlci5QUk9DRVNTX1NVUFBSRVNTSU9OLCBmYWxzZSk7IC8vIChDb25zdHJhaW50KQotCQkvLyBwcm9jZXNzLmdldE93bmVkUnVsZXMoKS5nZXQoMCk7Ci0JCWlmIChydWxlICE9IG51bGwgJiYgcnVsZS5nZXRCb2R5KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTZXQgcGF0aHMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihydWxlLmdldEJvZHkoKSk7IHRva2VucwotCQkJCQkuaGFzTW9yZVRva2VucygpOykgewotCQkJCXBhdGhzLmFkZCh0b2tlbnMubmV4dFRva2VuKCkpOwotCQkJfQotCQkJcmV0dXJuIHBhdGhzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgU2V0IGdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpIHsKLQkJaWYgKHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyA9PSBudWxsKSB7Ci0JCQlzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMgPSBsb2FkU3VwcHJlc3NlZEVsZW1lbnRQYXRocygpOwotCQkJaWYgKHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyA9PSBudWxsKSB7Ci0JCQkJc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzID0gbmV3IEhhc2hTZXQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTdXBwcmVzc2VkKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJaWYgKGlzU3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlpZiAoaXNTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhhcyBhbnkgZWxlbWVudCB0aGF0IGlzIG5vdCBzdXBwcmVzc2VkIHlldAotCSAqIGluIHRoaXMgc3VwcHJlc3Npb24ncyBwcm9jZXNzCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdXBwcmVzcyhDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gY2FuRG8oc2VsZWN0aW9uLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHNlbGVjdGlvbiBoYXMgYW55IGVsZW1lbnQgdGhhdCBpcyBzdXBwcmVzc2VkIGluIHRoaXMKLQkgKiBzdXBwcmVzc2lvbidzIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJldmVhbChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gY2FuRG8oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0cmFjdHMgaXRlbXMgZnJvbSB0aGUgZ2l2ZW4gc2VsZWN0aW9uIHRoYXQgY2FuIGJlIHN1cHByZXNzZWQvcmV2ZWFsZWQKLQkgKiAoZGVwZW5kaW5nIG9uIHRoZSA8Y29kZT5zdXBwcmVzc2VkPC9jb2RlPiBwYXJhbWV0ZXIpCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBzdXBwcmVzc2VkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRBcHBsaWNhYmxlSXRlbXMoQ29sbGVjdGlvbiBzZWxlY3Rpb24sCi0JCQlib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJQXJyYXlMaXN0IGFwcGxpY2FibGVJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJCWlmICh3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCQlpZiAoaXNJblN1cHByZXNzZWRMaXN0KHdyYXBwZXIpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJCWFwcGxpY2FibGVJdGVtcy5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJCQkmJiAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldFN1cHByZXNzZWQoKQotCQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJCWFwcGxpY2FibGVJdGVtcy5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJYXBwbGljYWJsZUl0ZW1zLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFwcGxpY2FibGVJdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgdmFsaWQgdG8gc3VwcHJlc3MvcmV2ZWFsIHVwb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChPYmplY3QgZWxlbWVudCkgewotCQkvLyBkb24ndCBzaG93IHN1cHByZXNzL3JldmVhbCBmb3Igcm9sZWRlc2NyaXB0b3IgdW5kZXIgdGVhbSwgd29yawotCQkvLyBwcm9kdWN0IGRlc2NyaXB0b3IgdW5kZXIgZGVsaXZlcmFibGUgd29yayBwcm9kdWN0LAotCQkvLyBhbmQgcm9sbGVkLXVwIGl0ZW0KLQkJLy8KLQkJQnJlYWtkb3duRWxlbWVudCBvYmogPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJaWYgKHdyYXBwZXIuaXNSb2xsdXBDaGlsZCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJb2JqID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KQotCQkJb2JqID0gKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQ7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcgotCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJaWYgKG9iai5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsCi0JCQkJCXx8IG9iai5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBzZWxlY3Rpb24gaGFzIGFueSBpdGVtIHRoYXQgY2FuIGJlCi0JICogc3VwcHJlc3NlZC9yZXZlYWxlZCAoZGVwZW5kaW5nIG9uIHRoZSA8Y29kZT5zdXBwcmVzc2VkPC9jb2RlPgotCSAqIHBhcmFtZXRlcikKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHBhcmFtIHN1cHByZXNzZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhbkRvKENvbGxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChpc1ZhbGlkKGVsZW1lbnQpKSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJCQlpZiAod3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCWlmIChpc0luU3VwcHJlc3NlZExpc3Qod3JhcHBlcikgIT0gc3VwcHJlc3NlZCkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCQkmJiAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldFN1cHByZXNzZWQoKQotCQkJCQkJCQkJCS5ib29sZWFuVmFsdWUoKSAhPSBzdXBwcmVzc2VkKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmdldFN1cHByZXNzZWQoKQotCQkJCQkJCS5ib29sZWFuVmFsdWUoKSAhPSBzdXBwcmVzc2VkKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQSBicmVha2Rvd24gZWxlbWVudCBpcyBzdXBwcmVzc2VkIGlmIGl0c2VsZiBvciBhbnkgb2YgaXRzIHBhcmVudCBhY3Rpdml0eQotCSAqIGlzIHN1cHByZXNzZWQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gX19pc1N1cHByZXNzZWQoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRTdXBwcmVzc2VkKGUsIHRydWUsIG51bGwpICE9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RpcmVjdGx5U3VwcHJlc3NlZChNZXRob2RFbGVtZW50IGUpIHsKLQkJQm9vbGVhbiBiID0gZS5nZXRTdXBwcmVzc2VkKCk7Ci0JCWlmIChiICE9IG51bGwgJiYgYi5ib29sZWFuVmFsdWUoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGU7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlpZiAodmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwKLQkJCQkJfHwgdmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMKSB7Ci0JCQkJaWYgKHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBpc0RpcmVjdGx5U3VwcHJlc3NlZCh2ZQotCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdXBwcmVzc2VkIGJyZWFrZG93biBlbGVtZW50IHRoYXQgbWFkZSB0aGUgZ2l2ZW4gYnJlYWtkb3duCi0JICogZWxlbWVudCBiZWNvbWUgc3VwcHJlc3NlZC4gVGhpcyBtZXRob2Qgd2lsbCBjaGVjayB0aGUgc3VwcHJlc3Npb24gc3RhdGUKLQkgKiBvZiB0aGUgcGFyZW50IHVwdG8gdGhlIHNwZWNpZmllZCA8Y29kZT50b3A8L2NvZGU+IG9ubHkgaWYKLQkgKiA8Y29kZT5jaGVja1BhcmVudDwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIEl0IHdpbGwgbm90IGNoZWNrIHRoZQotCSAqIHN1cHByZXNzaW9uIHN0YXRlIG9mIDxjb2RlPnRvcDwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBCcmVha2Rvd25FbGVtZW50IGdldFN1cHByZXNzZWQoQnJlYWtkb3duRWxlbWVudCBlLAotCQkJYm9vbGVhbiBjaGVja1BhcmVudCwgT2JqZWN0IHRvcCkgewotCQlpZiAoZS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCXJldHVybiBlOwotCQl9Ci0KLQkJaWYgKGNoZWNrUGFyZW50KSB7Ci0JCQlmb3IgKEJyZWFrZG93bkVsZW1lbnQgYmUgPSBlOyBiZSAhPSB0b3AKLQkJCQkJJiYgYmUuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgIT0gbnVsbDspIHsKLQkJCQliZSA9IGJlLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCWlmIChiZS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJcmV0dXJuIGJlOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgbmVzdGVkIGFydGlmYWN0IGRlc2NyaXB0b3JzIGFuZCBkZWxpdmVyYWJsZQotCQkJLy8gcGFydHMKLQkJCS8vCi0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSk7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSB3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQlpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQkvLyBsb29rIGZvciBwYXJlbnQgYXJ0aWZhY3QgZGVzY3JpcHRvciBpbiB0aGUgc2FtZSBhY3Rpdml0eQotCQkJCQkvLyBhbmQgY2hlY2sgdGhlaXIgc3VwcHJlc3Npb24gc3RhdGUKLQkJCQkJLy8KLQkJCQkJQWN0aXZpdHkgYWN0ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShlKTsKLQkJCQkJaWYgKGFjdCAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAoZWxlbWVudCAhPSBlCi0JCQkJCQkJCQkmJiBlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCk7Ci0JCQkJCQkJCVdvcmtQcm9kdWN0IG90aGVyV3AgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJCQkJaWYgKG90aGVyV3AgaW5zdGFuY2VvZiBBcnRpZmFjdAotCQkJCQkJCQkJCSYmIFVtYVV0aWwuaXNDb250YWluZWRCeSh3cCwgb3RoZXJXcCkKLQkJCQkJCQkJCQkmJiB3cGQuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJCQlyZXR1cm4gd3BkOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh3cERlc2MgIT0gdG9wICYmIHdwRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCUxpc3QgbGlzdCA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRvcnMod3BEZXNjKTsKLQkJCQkJaWYgKGxpc3Quc2l6ZSgpID09IDEpIHsKLQkJCQkJCS8vIHRoaXMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaXMgYSBkZWxpdmVyYWJsZSBwYXJ0IG9mCi0JCQkJCQkvLyBhIGRlbGl2ZXJhYmxlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0JCQkJCQkvLyBjaGVjayB0aGUgc3VwcHJlc3Npb24gc3RhdGUgb2YgdGhlIGRlbGl2ZXJhYmxlIHdvcmsKLQkJCQkJCS8vIHByb2R1Y3QgZGVzY3JpcHRvcgotCQkJCQkJLy8KLQkJCQkJCXJldHVybiBnZXRTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50KSBsaXN0LmdldCgwKSwKLQkJCQkJCQkJY2hlY2tQYXJlbnQsIHRvcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciB0ZWFtIHByb2ZpbGUgb3duIHJvbGUgZGVzY3JpcHRvcgotCQkJLy8KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCWlmIChlLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0VGVhbVByb2ZpbGVzKChSb2xlRGVzY3JpcHRvcikgZSk7Ci0JCQkJCWlmIChsaXN0LnNpemUoKSA9PSAxKSB7Ci0JCQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBsaXN0LmdldCgwKTsKLQkJCQkJCWlmICh0ZWFtICE9IHRvcCAmJiB0ZWFtICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gZ2V0U3VwcHJlc3NlZCh0ZWFtLCBjaGVja1BhcmVudCwgdG9wKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHN1YiB0ZWFtIHByb2ZpbGUKLQkJCS8vCi0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlpZiAoZS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCVRlYW1Qcm9maWxlIHN1cGVyVGVhbSA9ICgoVGVhbVByb2ZpbGUpIGUpLmdldFN1cGVyVGVhbSgpOwotCQkJCQlpZiAoc3VwZXJUZWFtICE9IHRvcCAmJiBzdXBlclRlYW0gIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGdldFN1cHByZXNzZWQoc3VwZXJUZWFtLCBjaGVja1BhcmVudCwgdG9wKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW5TdXBwcmVzc2VkTGlzdCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJaWYgKHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjaGVjayBpZiB3cmFwcGVyJ3MgcGF0aCBpcyBpbiBzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMgc2V0Ci0JCS8vCi0JCVN0cmluZyBwYXRoID0gZ2V0UGF0aCh3cmFwcGVyKTsKLQkJcmV0dXJuIHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocy5jb250YWlucyhwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdXBwcmVzc2VkIGJyZWFrZG93biBlbGVtZW50IHRoYXQgbWFkZSB0aGUgZ2l2ZW4gd3JhcHBlciBiZWNvbWUKLQkgKiBzdXBwcmVzc2VkCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50IGdldFN1cHByZXNzZWQoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXJldHVybiBnZXRTdXBwcmVzc2VkKHdyYXBwZXIsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1cHByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnQgdGhhdCBtYWRlIHRoZSBnaXZlbiB3cmFwcGVyIGJlY29tZQotCSAqIHN1cHByZXNzZWQKLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZ2V0U3VwcHJlc3NlZCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIsIGJvb2xlYW4gY2hlY2tCYXNlKSB7Ci0JCXJldHVybiBnZXRTdXBwcmVzc2VkKHdyYXBwZXIsIGNoZWNrQmFzZSwgdHJ1ZSwKLQkJCQlhdXRvSW5oZXJpdEludGVybWVkaWF0ZVN1cHByZXNzaW9uU3RhdGUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1cHByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnQgdGhhdCBtYWRlIHRoZSBnaXZlbiB3cmFwcGVyIGJlY29tZQotCSAqIHN1cHByZXNzZWQKLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZ2V0U3VwcHJlc3NlZCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIsIGJvb2xlYW4gY2hlY2tCYXNlLAotCQkJYm9vbGVhbiBjaGVja0xvY2FsLCBib29sZWFuIGluaGVyaXRTdXBwcmVzc2lvblN0YXRlKSB7Ci0JCXJldHVybiBnZXRTdXBwcmVzc2VkKHdyYXBwZXIsIGNoZWNrQmFzZSwgY2hlY2tMb2NhbCwKLQkJCQlpbmhlcml0U3VwcHJlc3Npb25TdGF0ZSwgdHJ1ZSwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50IGdldFN1cHByZXNzZWQoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyLCBib29sZWFuIGNoZWNrQmFzZSwKLQkJCWJvb2xlYW4gY2hlY2tMb2NhbCwgYm9vbGVhbiBpbmhlcml0U3VwcHJlc3Npb25TdGF0ZSwKLQkJCWJvb2xlYW4gY2hlY2tQYXJlbnQsIE9iamVjdCB0b3ApIHsKLQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZiAoIXdyYXBwZXIuaXNSZWFkT25seSgpKSB7Ci0JCQkvLyB0aGlzIGlzIGEgd3JhcHBlciBvZiBsb2NhbCBlbGVtZW50Ci0JCQkvLwotCQkJcmV0dXJuIGdldFN1cHByZXNzZWQoZSwgY2hlY2tQYXJlbnQsIHRvcCk7Ci0JCX0KLQotCQkvLyBjaGVjayBpZiB0aGUgYmFzZSBicmVha2Rvd24gZWxlbWVudCBpcyBzdXBwcmVzc2VkLCBkaXJlY3RseSBvcgotCQkvLyBpbmRpcmVjdGx5LCBpbiBpdHMgb3duIHByb2Nlc3MKLQkJLy8KLQkJaWYgKGNoZWNrQmFzZSkgewotCQkJQnJlYWtkb3duRWxlbWVudCBzdXBwcmVzc2VkID0gZ2V0U3VwcHJlc3NlZChlLCBjaGVja1BhcmVudCwgdG9wKTsKLQkJCWlmIChzdXBwcmVzc2VkICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gc3VwcHJlc3NlZDsKLQkJCX0KLQkJfQotCi0JCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQlpZiAoY2hlY2tMb2NhbCkgewotCQkJLy8gY2hlY2sgaWYgdGhlIHdyYXBwZXIgaXMgc3VwcHJlc3NlZCBpbiB0aGlzIHByb2Nlc3MKLQkJCS8vCi0JCQlpZiAoaXNJblN1cHByZXNzZWRMaXN0KHdyYXBwZXIpKSB7Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGlmIHRoZSBhbnkgbG9jYWwgcGFyZW50IGlzIHN1cHByZXNzZWQKLQkJCS8vCi0JCQlpZiAoY2hlY2tQYXJlbnQpIHsKLQkJCQlwYXJlbnQgPSB3cmFwcGVyLmdldFBhcmVudCh3cmFwcGVyKTsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCAmJiBwYXJlbnQgIT0gdG9wKSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnQgc3VwcHJlc3NlZCA9IGdldFN1cHByZXNzZWQoCi0JCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudCwgY2hlY2tQYXJlbnQsIHRvcCk7Ci0JCQkJCWlmIChzdXBwcmVzc2VkICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBzdXBwcmVzc2VkOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIHN1cHByZXNzZWQgaW4gb25lIG9mIHRoZSBpbW1lZGlhdGUKLQkJLy8gYmFzZSBwcm9jZXNzCi0JCS8vCi0JCWlmIChpbmhlcml0U3VwcHJlc3Npb25TdGF0ZSkgewotCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGUpOwotCQkJQWN0aXZpdHkgaW5oZXJpdG9yID0gUHJvY2Vzc1V0aWwuZ2V0SW5oZXJpdG9yKHdyYXBwZXIpOwotCQkJQnJlYWtkb3duRWxlbWVudCBiYXNlID0gKEJyZWFrZG93bkVsZW1lbnQpIGluaGVyaXRvcgotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCVByb2Nlc3MgaW1tZWRpYXRlQmFzZVByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYmFzZSk7Ci0JCQkJaWYgKHByb2MgIT0gaW1tZWRpYXRlQmFzZVByb2MpIHsKLQkJCQkJLy8gZmluZCB0aGUgb2JqZWN0IGluIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIG9mIHRoZQotCQkJCQkvLyBpbW1lZGlhdGUKLQkJCQkJLy8gYmFzZSBwcm9jZXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgc2FtZSBicmVha2Rvd24gZWxlbWVudAotCQkJCQkvLwotCQkJCQlPYmplY3Qgb2JqZWN0ID0gaW5oZXJpdG9yLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJQXJyYXlMaXN0IG9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KFByb2Nlc3NVdGlsCi0JCQkJCQkJLmdldFBhcmVudExpc3QoaW5oZXJpdG9yLCB3cmFwcGVyKSk7Ci0JCQkJCW9iamVjdHMuYWRkKGUpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgd3JhcHBlcgotCQkJCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChvYmplY3QsCi0JCQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCWZpbmRfY2hpbGQ6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhZGFwdGVyCi0JCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGNoaWxkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50ID09IFRuZ1V0aWwudW53cmFwKGNoaWxkKSkgewotCQkJCQkJCQlvYmplY3QgPSBjaGlsZDsKLQkJCQkJCQkJYnJlYWsgZmluZF9jaGlsZDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IGdldFN1cHByZXNzaW9uKGltbWVkaWF0ZUJhc2VQcm9jKTsKLQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IHN1cHByZXNzaW9uLmdldFN1cHByZXNzZWQoCi0JCQkJCQkJCShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0LAotCQkJCQkJCQlmYWxzZSwgdHJ1ZSwgaW5oZXJpdFN1cHByZXNzaW9uU3RhdGUsCi0JCQkJCQkJCWNoZWNrUGFyZW50LCBUbmdVdGlsLnVud3JhcChvYmplY3QpKTsKLQkJCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGlmIHRoZSBhbnkgaW5oZXJpdGVkIHBhcmVudCBpcyBzdXBwcmVzc2VkCi0JCS8vCi0JCWlmIChjaGVja1BhcmVudCkgewotCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJcGFyZW50ID0gd3JhcHBlci5nZXRQYXJlbnQod3JhcHBlcik7Ci0JCQl9Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJJiYgVG5nVXRpbC51bndyYXAocGFyZW50KSAhPSB0b3ApIHsKLQkJCQlyZXR1cm4gZ2V0U3VwcHJlc3NlZCgKLQkJCQkJCShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgcGFyZW50LAotCQkJCQkJY2hlY2tCYXNlLCB0cnVlLCBpbmhlcml0U3VwcHJlc3Npb25TdGF0ZSwgY2hlY2tQYXJlbnQsCi0JCQkJCQl0b3ApOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY2FjaGVkIHN1cHByZXNzaW9uIGZvciB0aGUgZ2l2ZW4gcHJvY2VzcyBpZiBvbmUgZXhpc3RzIG9yCi0JICogY3JlYXRlcyBuZXcgb25lCi0JICogCi0JICogQHBhcmFtIGltbWVkaWF0ZUJhc2VQcm9jCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oUHJvY2VzcyBwcm9jKSB7Ci0JCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gKFN1cHByZXNzaW9uKSBwcm9jVG9TdXBwcmVzc2lvbk1hcC5nZXQocHJvYyk7Ci0JCWlmIChzdXBwcmVzc2lvbiA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHByb2NUb1N1cHByZXNzaW9uTWFwKSB7Ci0JCQkJc3VwcHJlc3Npb24gPSAoU3VwcHJlc3Npb24pIHByb2NUb1N1cHByZXNzaW9uTWFwLmdldChwcm9jKTsKLQkJCQlpZiAoc3VwcHJlc3Npb24gPT0gbnVsbCkgewotCQkJCQlzdXBwcmVzc2lvbiA9IG5ldyBTdXBwcmVzc2lvbihwcm9jKTsKLQkJCQkJcHJvY1RvU3VwcHJlc3Npb25NYXAucHV0KHByb2MsIHN1cHByZXNzaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cHByZXNzaW9uOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBfX2lzU3VwcHJlc3NlZChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXJldHVybiBnZXRTdXBwcmVzc2VkKHdyYXBwZXIpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVRvTW9kZWwoKSB7Ci0JCWlmIChzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIHBhdGhzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGlzVmFsaWQocGF0aCkpIHsKLQkJCQlwYXRocy5hcHBlbmQocGF0aCkuYXBwZW5kKCcgJyk7Ci0JCQl9Ci0JCX0KLQotCQlDb25zdHJhaW50IHJ1bGUgPSBDb25zdHJhaW50TWFuYWdlci5nZXRDb25zdHJhaW50KHByb2Nlc3MsCi0JCQkJQ29uc3RyYWludE1hbmFnZXIuUFJPQ0VTU19TVVBQUkVTU0lPTiwgdHJ1ZSk7Ci0JCS8vIGlmKHByb2Nlc3MuZ2V0T3duZWRSdWxlcygpLmlzRW1wdHkoKSkgewotCQkvLyBydWxlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpOwotCQkvLyBwcm9jZXNzLmdldE93bmVkUnVsZXMoKS5hZGQocnVsZSk7Ci0JCS8vIH0KLQkJLy8gZWxzZSB7Ci0JCS8vIHJ1bGUgPSAoQ29uc3RyYWludCkgcHJvY2Vzcy5nZXRPd25lZFJ1bGVzKCkuZ2V0KDApOwotCQkvLyB9Ci0JCS8vCQkKLQkJcnVsZS5zZXRCb2R5KHBhdGhzLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyB2YWxpZCBpbiBwcm9jZXNzCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHBhdGgpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkocGF0aCk7Ci0JCVN0cmluZyB0eXBlID0gdXJpLnNjaGVtZSgpOwotCQlDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJaWYgKFdCUy5lcXVhbHModHlwZSkpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgaWYgKFRCUy5lcXVhbHModHlwZSkpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgaWYgKFdQQlMuZXF1YWxzKHR5cGUpKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfSBlbHNlIGlmIChDQlMuZXF1YWxzKHR5cGUpKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIHVzZSBwcm9jZXNzJ3MgZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIHZhbGlkYXRlCi0JCS8vCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IG51bGw7Ci0JCUlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbnVsbDsKLQkJSUZpbHRlciBmaWx0ZXIgPSBhZGFwdGVyRmFjdG9yeS5nZXRGaWx0ZXIoKTsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCWNvbmZpZ3VyYXRvciA9IChJQ29uZmlndXJhdG9yKSBhZGFwdGVyRmFjdG9yeS5nZXRGaWx0ZXIoKTsKLQkJCWN1cnJlbnRDb25maWcgPSBjb25maWd1cmF0b3IuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJY29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24ocHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKTsKLQkJfQotCQl0cnkgewotCQkJU3RyaW5nIGd1aWQgPSB1cmkuYXV0aG9yaXR5KCk7Ci0JCQlpZiAoIXByb2Nlc3MuZ2V0R3VpZCgpLmVxdWFscyhndWlkKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCU9iamVjdCBvYmplY3QgPSBwcm9jZXNzOwotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmkuc2VnbWVudENvdW50KCk7IGkrKykgewotCQkJCWd1aWQgPSB1cmkuc2VnbWVudChpKTsKLQkJCQlJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCQkJYWRhcHRlciA9IG51bGw7Ci0JCQkJZmluZF9hZGFwdGVyOiB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJCW9iamVjdCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCWlmIChndWlkLmVxdWFscygoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCkuZ2V0R3VpZCgpKSkgewotCQkJCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgY2hpbGQ7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCQkJLmFkYXB0KGNoaWxkLAotCQkJCQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWsgZmluZF9hZGFwdGVyOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gbXVzdCBiZSBhbiBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JCQkJCQkvLwotCQkJCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBpdGVtUHJvdmlkZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgb2JqZWN0OwotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0ZW1Qcm92aWRlcgotCQkJCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCQlpZiAoZ3VpZC5lcXVhbHMoZS5nZXRHdWlkKCkpKSB7Ci0JCQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGl0ZW1Qcm92aWRlcjsKLQkJCQkJCQlicmVhayBmaW5kX2FkYXB0ZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIGNvbmZpZ3VyYXRpb24KLQkJCS8vCi0JCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIHByaXZhdGUgYm9vbGVhbiByZXZlYWwoTGlzdCBzZWxlY3Rpb24sIENvbGxlY3Rpb24gcmV2ZWFsZWREZXNjcmlwdG9ycykgewotCS8vIGJvb2xlYW4gcmVhZE9ubHlFbGVtZW50QWZmZWN0ZWQgPSBmYWxzZTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkvLyBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JLy8gQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9Ci0JLy8gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCS8vIE1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkvLyBpZiAoIXdyYXBwZXIuaXNSZWFkT25seSgpKSB7IC8vIHdyYXBwZXIgb2YgbG9jYWwgZWxlbWVudAotCS8vIGUuc2V0U3VwcHJlc3NlZChCb29sZWFuLkZBTFNFKTsKLQkvLyBpZihlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCS8vIHJldmVhbGVkRGVzY3JpcHRvcnMuYWRkKGUpOwotCS8vIH0KLQkvLyB9IGVsc2UgeyAvLyB3YXMgc3VwcHJlc3NlZCBieSB0aGlzIHByb2Nlc3MKLQkvLwotCS8vIC8vIHJlbW92ZSB0aGUgcGF0aCBvZiBzdXBwcmVzc2VkIGVsZW1lbnQgZnJvbSB0aGUgbGlzdAotCS8vIC8vCi0JLy8gU3RyaW5nIHBhdGggPSBnZXRQYXRoKHdyYXBwZXIpOwotCS8vIGdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpLnJlbW92ZShwYXRoKTsKLQkvLyByZWFkT25seUVsZW1lbnRBZmZlY3RlZCA9IHRydWU7Ci0JLy8gfQotCS8vIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkvLyAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLnNldFN1cHByZXNzZWQoQm9vbGVhbi5GQUxTRSk7Ci0JLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkvLyByZXZlYWxlZERlc2NyaXB0b3JzLmFkZChlbGVtZW50KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyBtb2RpZmllZCA9IHRydWU7Ci0JLy8gcmV0dXJuIHJlYWRPbmx5RWxlbWVudEFmZmVjdGVkOwotCS8vIH0KLQotCS8vIC8qKgotCS8vICogQHBhcmFtIHNlbGVjdGlvbgotCS8vICogQHJldHVybiB0cnVlIGlmIHRoaXMgY2FsbCByZXZlYWxlZCBhbnkgcmVhZC1vbmx5IGVsZW1lbnQKLQkvLyAqLwotCS8vIHB1YmxpYyBib29sZWFuIHJldmVhbChMaXN0IHNlbGVjdGlvbikgewotCS8vIEFycmF5TGlzdCByZXZlYWxlZERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGJvb2xlYW4gcmV0ID0gcmV2ZWFsKHNlbGVjdGlvbiwgcmV2ZWFsZWREZXNjcmlwdG9ycyk7Ci0JLy8gTGlzdCBkZXNjcmlwdG9yc1RvUmV2ZWFsID0gZ2V0T3duUmVsYXRlZEVsZW1lbnRzKHJldmVhbGVkRGVzY3JpcHRvcnMsCi0JLy8gZmFsc2UpOwotCS8vIGlmKGRlc2NyaXB0b3JzVG9SZXZlYWwgIT0gbnVsbCkgewotCS8vIGJvb2xlYW4gcmV0MiA9IHJldmVhbChkZXNjcmlwdG9yc1RvUmV2ZWFsLCByZXZlYWxlZERlc2NyaXB0b3JzKTsKLQkvLyByZXR1cm4gcmV0IHx8IHJldDI7Ci0JLy8gfQotCS8vIHJldHVybiByZXQ7Ci0JLy8gfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgbmVlZCB0byB1c2Uge0BsaW5rIFN1cHByZXNzaW9uQ29tbWFuZH0gaW5zdGVhZAotCSAqLwotCXB1YmxpYyB2b2lkIHJldmVhbChMaXN0IHNlbGVjdGlvbikgewotCQlkb1NldFN1cHByZXNzZWQoc2VsZWN0aW9uLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFZpZXdUeXBlKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQkvLyBubyBuZWVkIHRvIHN0b3JlIHNlcGFyYXRlIHBhdGggZm9yIENCUywgcmV1c2UgV0JTL1RCUy9XUEJTIHBhdGhzCi0JCS8vCQkKLQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuIFdCUzsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUgfHwgZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gVEJTOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBXUEJTOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwcm9jZXNzIEdVSUQgaW4gdGhlIGdpdmVuIEdVSUQgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBndWlkUGF0aAotCSAqIEByZXR1cm4KLQkgKiBAc2VlICNnZXRQYXRoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb2Nlc3NHVUlEKFN0cmluZyBndWlkUGF0aCkgewotCQlpbnQgaWQgPSBndWlkUGF0aC5pbmRleE9mKCI6Ly8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaWQgIT0gLTEpIHsKLQkJCWludCBiZWdpbkluZGV4ID0gaWQgKyAzOwotCQkJaWYgKGJlZ2luSW5kZXggPCBndWlkUGF0aC5sZW5ndGgoKSkgewotCQkJCWludCBlbmRJbmRleCA9IGd1aWRQYXRoLmluZGV4T2YoJy8nLCBiZWdpbkluZGV4KTsKLQkJCQlpZiAoZW5kSW5kZXggIT0gLTEpIHsKLQkJCQkJcmV0dXJuIGd1aWRQYXRoLnN1YnN0cmluZyhiZWdpbkluZGV4LCBlbmRJbmRleCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhdGgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlTdHJpbmdCdWZmZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IHBhcmVudExpc3QgPSBQcm9jZXNzVXRpbC5nZXRQYXJlbnRMaXN0KG51bGwsIHdyYXBwZXIpOwotCQlpZiAoIXBhcmVudExpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYXJlbnRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkvLyBleGNsdWRlIFRhc2tEZXNjcmlwdG9yIGFuZCBSb2xlRGVzY3JpcHRvciBmcm9tIHRoZSBwYXJlbnQKLQkJCQkvLyBwYXRoIGIvYyB0aG9zZSBkZXNjcmlwdG9ycyBjYW4gYmUKLQkJCQkvLyBwYXJlbnQgb25seSBpbiBDQlMgdmlldwotCQkJCWlmICghKGUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvciB8fCBlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpKSB7Ci0JCQkJCXBhdGguYXBwZW5kKCcvJykuYXBwZW5kKGUuZ2V0R3VpZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlwYXRoLmFwcGVuZCgnLycpLmFwcGVuZChlLmdldEd1aWQoKSk7Ci0JCVN0cmluZyB2aWV3VHlwZSA9IGdldFZpZXdUeXBlKHdyYXBwZXIpOwotCQlwYXRoLmluc2VydCgwLCAiOi8iKS5pbnNlcnQoMCwgdmlld1R5cGUpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRPd25SZWxhdGVkRWxlbWVudHMoQ29sbGVjdGlvbiBjaGFuZ2VkRGVzY3JpcHRvcnMsCi0JCQlib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJaWYgKCFjaGFuZ2VkRGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7Ci0JCQlBcnJheUxpc3QgZGVzY3JpcHRvcnNUb0NoYW5nZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QoY2hhbmdlZERlc2NyaXB0b3JzKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRGVzY3JpcHRvciBkZXNjID0gKERlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdFtdIHJlbGF0aW9uc2hpcHMgPSBudWxsOwotCQkJCWlmIChkZXNjIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJcmVsYXRpb25zaGlwcyA9IFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5UQVNLX0RFU0NSSVBUT1JfX1JFTEFUSU9OU0hJUFM7Ci0JCQkJfSBlbHNlIGlmIChkZXNjIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJcmVsYXRpb25zaGlwcyA9IFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5ST0xFX0RFU0NSSVBUT1JfX1JFTEFUSU9OU0hJUFM7Ci0JCQkJfSBlbHNlIGlmIChkZXNjIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCXJlbGF0aW9uc2hpcHMgPSBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFTEFUSU9OU0hJUFM7Ci0JCQkJfQotCQkJCWlmIChyZWxhdGlvbnNoaXBzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWxhdGlvbnNoaXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlPYmplY3QgZmVhdHVyZSA9IHJlbGF0aW9uc2hpcHNbaV07Ci0JCQkJCQlib29sZWFuIGlzTWFueTsKLQkJCQkJCU9iamVjdCB2YWx1ZTsKLQkJCQkJCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgT3Bwb3NpdGVGZWF0dXJlKSB7Ci0JCQkJCQkJT3Bwb3NpdGVGZWF0dXJlIGYgPSAoT3Bwb3NpdGVGZWF0dXJlKSBmZWF0dXJlOwotCQkJCQkJCWlzTWFueSA9IGYuaXNNYW55KCk7Ci0JCQkJCQkJdmFsdWUgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBkZXNjKQotCQkJCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKGYpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmU7Ci0JCQkJCQkJaXNNYW55ID0gZi5pc01hbnkoKTsKLQkJCQkJCQl2YWx1ZSA9IGRlc2MuZUdldChmKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChpc01hbnkpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChDb2xsZWN0aW9uKSB2YWx1ZSkKLQkJCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCURlc2NyaXB0b3IgcmVmID0gKERlc2NyaXB0b3IpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKHJlZi5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkgIT0gc3VwcHJlc3NlZAotCQkJCQkJCQkJCSYmICFQcm9jZXNzVXRpbAotCQkJCQkJCQkJCQkJLmNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoCi0JCQkJCQkJCQkJCQkJCWNoYW5nZWREZXNjcmlwdG9ycywgcmVmKSkgewotCQkJCQkJCQkJZGVzY3JpcHRvcnNUb0NoYW5nZS5hZGQocmVmKTsKLQkJCQkJCQkJCWNoYW5nZWREZXNjcmlwdG9ycy5hZGQocmVmKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJRGVzY3JpcHRvciByZWYgPSAoRGVzY3JpcHRvcikgdmFsdWU7Ci0JCQkJCQkJaWYgKHJlZiAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmIChyZWYuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQKLQkJCQkJCQkJCQkmJiAhUHJvY2Vzc1V0aWwuY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcygKLQkJCQkJCQkJCQkJCWNoYW5nZWREZXNjcmlwdG9ycywgcmVmKSkgewotCQkJCQkJCQkJZGVzY3JpcHRvcnNUb0NoYW5nZS5hZGQocmVmKTsKLQkJCQkJCQkJCWNoYW5nZWREZXNjcmlwdG9ycy5hZGQocmVmKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBkZXNjcmlwdG9yc1RvQ2hhbmdlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFN1cHByZXNzZXMgb3IgcmV2ZWFscyB0aGUgZ2l2ZW4gc2VsZWN0aW9uCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBzdXBwcmVzc2VkCi0JICogQHJldHVybiB7QGxpbmsgUmVzdWx0fSBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoaXMgY2FsbAotCSAqLwotCXByaXZhdGUgUmVzdWx0IHNldFN1cHByZXNzZWQoTGlzdCBzZWxlY3Rpb24sIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlSZXN1bHQgcmVzdWx0ID0gZG9TZXRTdXBwcmVzc2VkKHNlbGVjdGlvbiwgc3VwcHJlc3NlZCk7Ci0KLQkJLy8gaWYgZGVzY3JpcHRvcnMgaGFkIGJlZW4gc3VwcHJlc3NlZCwgcmVsYXRlZCBlbGVtZW50cyB0aGF0IGFyZSBub3QKLQkJLy8gdXNlZCBhbnl3aGVyZSBlbHNlIGFsc28gbmVlZCB0byBiZSBzdXBwcmVzc2VkIChqdXN0IGxpa2UgZGVsZXRlKQotCQkvLwkKLQkJaWYgKCFyZXN1bHQuZGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGRlc2NyaXB0b3JzVG9TdXBwcmVzcyA9IGdldE93blJlbGF0ZWRFbGVtZW50cygKLQkJCQkJcmVzdWx0LmRlc2NyaXB0b3JzLCBzdXBwcmVzc2VkKTsKLQkJCWlmIChkZXNjcmlwdG9yc1RvU3VwcHJlc3MgIT0gbnVsbCkgewotCQkJCVJlc3VsdCByZXN1bHQyID0gZG9TZXRTdXBwcmVzc2VkKGRlc2NyaXB0b3JzVG9TdXBwcmVzcywKLQkJCQkJCXN1cHByZXNzZWQpOwotCi0JCQkJLy8gbWVyZ2UgcmVzdWx0cwotCQkJCS8vCi0JCQkJcmVzdWx0LmVsZW1lbnRzLmFkZEFsbChyZXN1bHQyLmVsZW1lbnRzKTsKLQkJCQlyZXN1bHQuZGVzY3JpcHRvcnMuYWRkQWxsKHJlc3VsdDIuZGVzY3JpcHRvcnMpOwotCQkJCXJlc3VsdC5wYXRocy5hZGRBbGwocmVzdWx0Mi5wYXRocyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIG5lZWQgdG8gdXNlIHtAbGluayBTdXBwcmVzc2lvbkNvbW1hbmR9IGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdXBwcmVzcyhMaXN0IHNlbGVjdGlvbikgewotCQlkb1NldFN1cHByZXNzZWQoc2VsZWN0aW9uLCB0cnVlKTsKLQl9Ci0KLQkvLyBwdWJsaWMgYm9vbGVhbiBzdXBwcmVzcyhMaXN0IHNlbGVjdGlvbikgewotCS8vIEFycmF5TGlzdCBzdXBwcmVzc2VkRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gYm9vbGVhbiByZXQgPSBzdXBwcmVzcyhzZWxlY3Rpb24sIHN1cHByZXNzZWREZXNjcmlwdG9ycyk7Ci0JLy8JCQotCS8vIC8vIGlmIGRlc2NyaXB0b3JzIGhhZCBiZWVuIHN1cHByZXNzZWQsIHJlbGF0ZWQgZWxlbWVudHMgdGhhdCBhcmUgbm90IHVzZWQKLQkvLyBhbnl3aGVyZSBlbHNlIGFsc28gbmVlZCB0byBiZSBzdXBwcmVzc2VkIChqdXN0IGxpa2UgZGVsZXRlKQotCS8vIC8vCi0JLy8gTGlzdCBkZXNjcmlwdG9yc1RvU3VwcHJlc3MgPSBnZXRPd25SZWxhdGVkRWxlbWVudHMoc3VwcHJlc3NlZERlc2NyaXB0b3JzLAotCS8vIHRydWUpOwotCS8vIGlmKGRlc2NyaXB0b3JzVG9TdXBwcmVzcyAhPSBudWxsKSB7Ci0JLy8gQXJyYXlMaXN0IG91dCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBib29sZWFuIHJldDIgPSBzdXBwcmVzcyhkZXNjcmlwdG9yc1RvU3VwcHJlc3MsIG91dCk7Ci0JLy8gaWYob3V0LnNpemUoKSAhPSBkZXNjcmlwdG9yc1RvU3VwcHJlc3Muc2l6ZSgpKSB7Ci0JLy8gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJTdXBwcmVzc2lvbi5zdXBwcmVzcyhMaXN0KQotCS8vIGlzIGJ1Z2d5LiIpOyAvLyROT04tTkxTLTEkCi0JLy8gfQotCS8vIHJldHVybiByZXQgfHwgcmV0MjsKLQkvLyB9Ci0JLy8gcmV0dXJuIHJldDsKLQkvLyB9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXN1bHQgewotCQkvKiogRWxlbWVudHMgdGhhdCBoYXZlIGJlZW4gc3VwcHJlc3NlZCBvciByZXZlYWxlZCAqLwotCQlDb2xsZWN0aW9uIGVsZW1lbnRzOwotCi0JCS8qKiBEZXNjcmlwdG9ycyB0aGF0IGhhdmUgYmVlbiBzdXBwcmVzc2VkIG9yIHJldmVhbGVkICovCi0JCUNvbGxlY3Rpb24gZGVzY3JpcHRvcnM7Ci0KLQkJLyoqCi0JCSAqIFBhdGhzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbQotCQkgKiA8Y29kZT5zdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHM8L2NvZGU+Ci0JCSAqLwotCQlDb2xsZWN0aW9uIHBhdGhzOwotCi0JCVJlc3VsdCgpIHsKLQkJCWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlwYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCi0JCWJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCXJldHVybiBlbGVtZW50cy5pc0VtcHR5KCkgJiYgcGF0aHMuaXNFbXB0eSgpOwotCQl9Ci0KLQkJdm9pZCBjbGVhcigpIHsKLQkJCWVsZW1lbnRzLmNsZWFyKCk7Ci0JCQlkZXNjcmlwdG9ycy5jbGVhcigpOwotCQkJcGF0aHMuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1cHByZXNzZXMgb3IgcmV2ZWFscyB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YKLQkgKiA8Y29kZT5zdXBwcmVzc2VkPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gc3VwcHJlc3NlZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFJlc3VsdCBkb1NldFN1cHByZXNzZWQoTGlzdCBzZWxlY3Rpb24sIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JCQkJLy8gaWYgKCFpc1N1cHByZXNzZWQod3JhcHBlcikpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCQkJaWYgKCF3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCQkvLyB3cmFwcGVyIG9mIGxvY2FsIGVsZW1lbnQKLQkJCQkJLy8KLQkJCQkJaWYgKGUuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJCWUuc2V0U3VwcHJlc3NlZChCb29sZWFuLnZhbHVlT2Yoc3VwcHJlc3NlZCkpOwotCQkJCQkJcmVzdWx0LmVsZW1lbnRzLmFkZChlKTsKLQkJCQkJCWlmIChlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQkJCXJlc3VsdC5kZXNjcmlwdG9ycy5hZGQoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBhZGQgdGhlIHBhdGhzIG9mIHN1cHByZXNzZWQgZWxlbWVudCB0byB0aGUgbWFwCi0JCQkJCS8vCi0JCQkJCVN0cmluZyBwYXRoID0gZ2V0UGF0aCh3cmFwcGVyKTsKLQkJCQkJYm9vbGVhbiBiOwotCQkJCQlpZiAoc3VwcHJlc3NlZCkgewotCQkJCQkJYiA9IGdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpLmFkZChwYXRoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWIgPSBnZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKS5yZW1vdmUocGF0aCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGIpIHsKLQkJCQkJCXJlc3VsdC5wYXRocy5hZGQocGF0aCk7Ci0JCQkJCX0KLQkJCQkJLy8gfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJCWlmIChlLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSAhPSBzdXBwcmVzc2VkKSB7Ci0JCQkJCWUuc2V0U3VwcHJlc3NlZChCb29sZWFuLnZhbHVlT2Yoc3VwcHJlc3NlZCkpOwotCQkJCQlyZXN1bHQuZWxlbWVudHMuYWRkKGUpOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkJCXJlc3VsdC5kZXNjcmlwdG9ycy5hZGQoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbW9kaWZpZWQgPSAhcmVzdWx0LmlzRW1wdHkoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3MoTGlzdCBzZWxlY3Rpb24sIENvbGxlY3Rpb24KLQkvLyBzdXBwcmVzc2VkRGVzY3JpcHRvcnMpIHsKLQkvLyBib29sZWFuIHJlYWRPbmx5RWxlbWVudFN1cHByZXNzZWQgPSBmYWxzZTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkvLyBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JLy8gQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9Ci0JLy8gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCS8vIGlmICghaXNTdXBwcmVzc2VkKHdyYXBwZXIpKSB7Ci0JLy8gQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwKLQkvLyAudW53cmFwKHdyYXBwZXIpOwotCS8vIGlmICghd3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkvLyAvLyB3cmFwcGVyIG9mIGxvY2FsIGVsZW1lbnQKLQkvLyAvLwotCS8vIGUuc2V0U3VwcHJlc3NlZChCb29sZWFuLlRSVUUpOwotCS8vIGlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JLy8gc3VwcHJlc3NlZERlc2NyaXB0b3JzLmFkZChlKTsKLQkvLyB9Ci0JLy8gfSBlbHNlIHsKLQkvLyAvLyBhZGQgdGhlIHBhdGhzIG9mIHN1cHByZXNzZWQgZWxlbWVudCB0byB0aGUgbWFwCi0JLy8gLy8KLQkvLyBTdHJpbmcgcGF0aCA9IGdldFBhdGgod3JhcHBlcik7Ci0JLy8gZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkuYWRkKHBhdGgpOwotCS8vIHJlYWRPbmx5RWxlbWVudFN1cHByZXNzZWQgPSB0cnVlOwotCS8vIH0KLQkvLyB9Ci0JLy8gfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCS8vICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuc2V0U3VwcHJlc3NlZChCb29sZWFuLlRSVUUpOwotCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JLy8gc3VwcHJlc3NlZERlc2NyaXB0b3JzLmFkZChlbGVtZW50KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyBtb2RpZmllZCA9IHRydWU7Ci0JLy8gcmV0dXJuIHJlYWRPbmx5RWxlbWVudFN1cHByZXNzZWQ7Ci0JLy8gfQotCi0JLyoqCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNVbnN1cHByZXNzZWQoTGlzdCBzZWxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlpZiAoIWlzU3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlpZiAoIWlzU3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1vZGlmaWVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZU5lZWRlZCgpIHsKLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVJc0RvbmUoKSB7Ci0JCW1vZGlmaWVkID0gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBfX2lzU3VwcHJlc3NlZChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGNvbXBvc2VkV3JhcHBlcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21wb3NlZFdyYXBwZXIuZ2V0VmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYoIWlzU3VwcHJlc3NlZChlbGVtZW50KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCwgb3IgdGhlIGl0ZW0gcHJvdmlkZXIgb3IgYWRhcHRvciBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogZWxlbWVudCBpcyBzdXBwcmVzc2VkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IG9yIGFuIGFzc29jaWF0ZWQgd3JhcHBlciwgYWRhcHRvciwgb3IgaXRlbQotCSAqICAgICAgICAgICAgcHJvdmlkZXIsIGV0Yy4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHByZXNzZWQoT2JqZWN0IGUpIHsKLQkJLy8gbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCXRyeSB7Ci0KLQkJCWlmIChlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBjb21wb3NlZFdyYXBwZXIgPSBQcm9jZXNzVXRpbC5nZXRDb21wb3NlZFdyYXBwZXIoZSk7Ci0JCQlpZihjb21wb3NlZFdyYXBwZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiBfX2lzU3VwcHJlc3NlZChjb21wb3NlZFdyYXBwZXIpOwotCQkJfQotCi0JCQlpZiAoaW50ZXJuYWxVbnN1cHByZXNzZWRFbGVtZW50cy5jb250YWlucyhlKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBfX2lzU3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGUpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXJldHVybiBfX2lzU3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudCkgZSk7Ci0JCQl9IGVsc2UgewotCQkJCU9iamVjdCB0YXJnZXRPYmogPSBudWxsOwotCQkJCWlmIChlIGluc3RhbmNlb2YgV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQl0YXJnZXRPYmogPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIGUpLmdldFZhbHVlKCk7Ci0JCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQl0YXJnZXRPYmogPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGUpLmdldFRhcmdldCgpOwotCQkJCX0KLQotCQkJCWlmICh0YXJnZXRPYmogIT0gbnVsbCAmJiB0YXJnZXRPYmogIT0gZSkgewotCQkJCQlyZXR1cm4gaXNTdXBwcmVzc2VkKHRhcmdldE9iaik7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCS8vIGxvbmcgdGltZSA9IChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KTsKLQkJCS8vIGlmKHRpbWUgPiAxMDAwKSB7Ci0JCQkvLyBCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpVG5nVXRpbC51bndyYXAoZSk7Ci0JCQkvLyBTdHJpbmcgbXNnID0gIlN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZCgpOiB0aW1lIHRha2VuIChtcykgIiArCi0JCQkvLyB0aW1lICsKLQkJCS8vICJcbiBwcm9jZXNzOiAiICsgKGUgaW5zdGFuY2VvZgotCQkJLy8gQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgPwotCQkJLy8gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillKS5nZXRUb3BJdGVtKCkgOgotCQkJLy8gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJlKSkgKwotCQkJLy8gIlxuIGVsZW1lbnQ6ICIgKyBQcm9jZXNzVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGJlKTsKLQkJCS8vCQkJCQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nSW5mbyhtc2cpOwotCQkJLy8gfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgc3VwcHJlc3Npb24gc3RhdGUgb2YgdGhlIGdpdmVuIDxjb2RlPndyYXBwZXI8L2NvZGU+IGZyb20KLQkgKiBpdHMgYmFzZS4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjYWxsIG1vZGlmaWVkIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZQotCSAqICAgICAgICAgb2YgdGhlIGdpdmVuIHdyYXBwZXIsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlTdHJpbmcgcGF0aCA9IGdldFBhdGgod3JhcHBlcik7Ci0JCWJvb2xlYW4gcmV0OwotCQlCcmVha2Rvd25FbGVtZW50IGUgPSBnZXRTdXBwcmVzc2VkKHdyYXBwZXIsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwKLQkJCQludWxsKTsKLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJcmV0ID0gZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkuYWRkKHBhdGgpOwotCQl9IGVsc2UgewotCQkJcmV0ID0gZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkucmVtb3ZlKHBhdGgpOwotCQl9Ci0JCWlmIChyZXQpIHsKLQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEV4Y2x1ZGVzIHRoZSBkZXNjcmlwdG9ycyB3aXRoIHRoZSBzYW1lIGxpbmtlZCBlbGVtZW50IGZyb20gdGhlIGNoZWNrCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvblRvUmV2ZWFsCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgY2hlY2tEdXBsaWNhdGVOYW1lQWZ0ZXJSZXZlYWwoCi0JCQlDb2xsZWN0aW9uIHNlbGVjdGlvblRvUmV2ZWFsT3JTdXBwcmVzcywKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUNvbGxlY3Rpb24gZWxlbWVudHNUb1JldmVhbCA9IGdldEFwcGxpY2FibGVJdGVtcygKLQkJCQlzZWxlY3Rpb25Ub1JldmVhbE9yU3VwcHJlc3MsIGZhbHNlKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb1JldmVhbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJU3RyaW5nIG1zZyA9IFByb2Nlc3NVdGlsLmNoZWNrQnJlYWtkb3duRWxlbWVudE5hbWUoCi0JCQkJCQlhZGFwdGVyRmFjdG9yeSwgYmUsIGJlLmdldE5hbWUoKSwgdGhpcyk7Ci0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5TdXBwcmVzc2lvbl9uYW1lRHVwbGljYXRpb247IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJbXNnID0gUHJvY2Vzc1V0aWwuY2hlY2tCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZSgKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBiZSwgYmUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpLCB0aGlzKTsKLQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJT2JqZWN0IHVud3JhcHBlZCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJCWlmICh1bndyYXBwZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQlPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChlbGVtZW50KTsKLQkJCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCWl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlDb2xsZWN0aW9uIHNpYmxpbmdzID0gaXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudCk7Ci0JCQkJCQlPYmplY3QgbGlua2VkRWxlbWVudCA9IG51bGw7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkJCQlsaW5rZWRFbGVtZW50ID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCQl0cnkgewotCQkJCQkJCWludGVybmFsVW5zdXBwcmVzc2VkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCW5hbWVDaGVja0xvb3A6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzaWJsaW5ncwotCQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQkJT2JqZWN0IHNpYmxpbmcgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChzaWJsaW5nIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJCQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KSBzaWJsaW5nOwotCQkJCQkJCQkJLy8gc2tpcCBjaGVja2luZyBvbiBzdXBwcmVzc2VkIGVsZW1lbnQKLQkJCQkJCQkJCS8vCi0JCQkJCQkJCQlpZiAoYmUuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJCQkJY29udGludWUgbmFtZUNoZWNrTG9vcDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwKLQkJCQkJCQkJCQkJJiYgc2libGluZyBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkJCQkJCQkvLyBza2lwIGNoZWNraW5nIG9uIGRlc2NyaXB0b3JzIHdpdGggdGhlCi0JCQkJCQkJCQkJLy8gc2FtZSBsaW5rZWQgZWxlbWVudAotCQkJCQkJCQkJCS8vCi0JCQkJCQkJCQkJT2JqZWN0IG90aGVyTGlua2VkRWxlbWVudCA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGVsZW1lbnQpOwotCQkJCQkJCQkJCWlmIChvdGhlckxpbmtlZEVsZW1lbnQgPT0gbGlua2VkRWxlbWVudCkgewotCQkJCQkJCQkJCQljb250aW51ZSBuYW1lQ2hlY2tMb29wOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCVN0cmluZyBtc2cgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkJCQkuY2hlY2tCcmVha2Rvd25FbGVtZW50TmFtZSgKLQkJCQkJCQkJCQkJCQlhZGFwdGVyRmFjdG9yeSwgYmUsIGJlCi0JCQkJCQkJCQkJCQkJCQkuZ2V0TmFtZSgpLCB0aGlzKTsKLQkJCQkJCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQkJCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5TdXBwcmVzc2lvbl9uYW1lRHVwbGljYXRpb247IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCW1zZyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkJCS5jaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJCQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBiZSwKLQkJCQkJCQkJCQkJCQliZS5nZXRQcmVzZW50YXRpb25OYW1lKCksCi0JCQkJCQkJCQkJCQkJdGhpcyk7Ci0JCQkJCQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuU3VwcHJlc3Npb25fcHJlc2VudGF0aW9uTmFtZUR1cGxpY2F0aW9uOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCWludGVybmFsVW5zdXBwcmVzc2VkRWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0QnlQYXRoKFN0cmluZ1tdIGd1aWRQYXRoLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYgKGd1aWRQYXRoLmxlbmd0aCA9PSAwIHx8IGFkYXB0ZXJGYWN0b3J5ID09IG51bGwKLQkJCQl8fCAhZ3VpZFBhdGhbMF0uZXF1YWxzKHByb2Nlc3MuZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlPYmplY3Qgb2JqZWN0ID0gcHJvY2VzczsKLQkJaW50IGxlbiA9IGd1aWRQYXRoLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBsZW47IGkrKykgewotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCi0JCQkvLyBpZiBjdXJyZW50IG9iamVjdCBpcyBhbiBhY3Rpdml0eSwgbWFrZSBzdXJlIGl0IGlzIHJvbGxlZCBkb3duCi0JCQkvLyBiZWZvcmUgbG9va2luZyBpbnRvIGl0cyBjaGlsZHJlbgotCQkJLy8KLQkJCUlCU0l0ZW1Qcm92aWRlciByb2xsZWRVcEFkYXB0ZXIgPSBudWxsOwotCQkJSXRlcmF0b3IgaXRlciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlmIChUbmdVdGlsLnVud3JhcChvYmplY3QpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGFjdGl2aXR5SXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQkJCQlpZiAoYWN0aXZpdHlJdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpKSB7Ci0JCQkJCQkJYWN0aXZpdHlJdGVtUHJvdmlkZXIuYmFzaWNTZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQkJCQkJcm9sbGVkVXBBZGFwdGVyID0gYWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQkJCQlpZiAoaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKSkgewotCQkJCQkJCWl0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQkJCQkJcm9sbGVkVXBBZGFwdGVyID0gaXRlbVByb3ZpZGVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWl0ZXIgPSBhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHJvbGxlZFVwQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCXJvbGxlZFVwQWRhcHRlci5zZXRSb2xsZWRVcCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZpbmRfY2hpbGQ6IHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJJiYgKChNZXRob2RFbGVtZW50KSBlKS5nZXRHdWlkKCkuZXF1YWxzKGd1aWRQYXRoW2ldKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCW9iamVjdCA9IGNoaWxkOwotCQkJCQlicmVhayBmaW5kX2NoaWxkOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFmb3VuZCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBicmVha2Rvd24gZWxlbWVudCBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbgotCSAqIDxjb2RlPmd1aWRQYXRoPC9jb2RlPiBpcyBzdXBwcmVzc2VkIGluIHRoZSBwcm9jZXNzIG9mIHRoaXMgU3VwcHJlc3Npb24KLQkgKiBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gZ3VpZFBhdGgKLQkgKiBAcmV0dXJuCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHBhdGggY291bGQgbm90IGJlIGZvdW5kIHVzaW5nCi0JICogICAgICAgICAgICAgICAgdGhlIGdpdmVuIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VwcHJlc3NlZChTdHJpbmdbXSBndWlkUGF0aCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpCi0JCQl0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJT2JqZWN0IG9iamVjdCA9IGdldE9iamVjdEJ5UGF0aChndWlkUGF0aCwgYWRhcHRlckZhY3RvcnkpOwotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJDb3VsZCBub3QgZmluZCBvYmplY3Qgd2l0aCBwYXRoICciICsgZ3VpZFBhdGggKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gaXNTdXBwcmVzc2VkKG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2V0IG9mIHN1cHByZXNzZWQgaXRlbSBvZiB0aGUgZ2l2ZW4gcHJvY2Vzc2VzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3JpZXMKLQkgKiAgICAgICAgICAgIHRoZSBhZGFwdGVyIGZhY3RvcmllcyBmb3IgV0JTLCBUQlMsIFdQQlMsIGFuZCBDQlMgdmlld3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXQgZ2V0U3VwcHJlc3NlZEl0ZW1zKFByb2Nlc3MgcHJvYywKLQkJCUFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcykgewotCQlTZXQgc3VwcHJlc3NlZEl0ZW1zID0gbmV3IEhhc2hTZXQoKTsKLQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBuZXcgU3VwcHJlc3Npb24ocHJvYyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlckZhY3Rvcmllcy5sZW5ndGg7IGkrKykgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKAotCQkJCQlhZGFwdGVyRmFjdG9yaWVzW2ldLCBwcm9jKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGl0ZW0gPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoc3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKGl0ZW0pKSB7Ci0JCQkJCXN1cHByZXNzZWRJdGVtcy5hZGQoaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBwcmVzc2VkSXRlbXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTdXBwcmVzc2lvbkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JCXByaXZhdGUgTGlzdCBjb2xsZWN0aW9uOwotCi0JCXByaXZhdGUgUmVzdWx0IHJlc3VsdDsKLQotCQlwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3NlZDsKLQotCQlwcml2YXRlIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCi0JCXB1YmxpYyBTdXBwcmVzc2lvbkNvbW1hbmQoU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIExpc3Qgc2VsZWN0aW9uLAotCQkJCWJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQkJdGhpcy5zdXBwcmVzc2lvbiA9IHN1cHByZXNzaW9uOwotCQkJY29sbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJCXRoaXMuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQ7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzdXBwcmVzc2lvbgotCQkJCQkJLmdldFByb2Nlc3MoKS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXJlc3VsdCA9IHN1cHByZXNzaW9uLnNldFN1cHByZXNzZWQoY29sbGVjdGlvbiwgc3VwcHJlc3NlZCk7Ci0JCQlkaWRFeGVjdXRlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBkaWRFeGVjdXRlKCkgewotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVkbygpIHsKLQkJCWV4ZWN1dGUoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgIXJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCQlpZiAoIXJlc3VsdC5lbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzdWx0LmVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJZS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4udmFsdWVPZighc3VwcHJlc3NlZCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghcmVzdWx0LnBhdGhzLmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXN1bHQucGF0aHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgcGF0aCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKHN1cHByZXNzZWQpIHsKLQkJCQkJCQlzdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKQotCQkJCQkJCQkJLnJlbW92ZShwYXRoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc3VwcHJlc3Npb24uZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkKLQkJCQkJCQkJCS5hZGQocGF0aCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZGlkVW5kbygpOwotCQkJCXJlc3VsdC5jbGVhcigpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZGlkVW5kbygpIHsKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3ByZXBhcmUoKQotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldFJlc3VsdCgpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCQlpZiAoIXJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gY29sbGVjdGlvbjsKLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCQlyZXR1cm4gY29sbGVjdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHlFbGVtZW50QWZmZWN0ZWQoKSB7Ci0JCQlyZXR1cm4gIXJlc3VsdC5wYXRocy5pc0VtcHR5KCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvVG5nVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvVG5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNjQwM2Q1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1RuZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbC5Db3BpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5QYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQXR0cmlidXRlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRmVhdHVyZU1hcEVudHJ5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQ29weUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Nb3ZlRG93bkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTW92ZVVwQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Qcm9jZXNzRGVlcENvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLnV0aWwuU3RyaW5nUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5OYW1lQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIG1ldGhvZHMgZm9yIG1ldGhvZCBhdXRob3JpbmcKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUbmdVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgdW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgPSBuZXcgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpCi0JCQkuaXNEZWJ1Z2dpbmcoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SID0gInwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0VfRklMRVNUUklOR19TRVBBUkFUT1JfU1BMSVRURVIgPSAiXFx8IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ0FURUdPUllfUFJPUEVSVFkgPSAiUFVCTElTSF9DQVRFR09SWSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZW1vdmVzIGFsbCBhZGFwdGVycyB0aGF0IGFyZSBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MgZnJvbSB0aGUgZ2l2ZW4KLQkgKiBFT2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlT2JqCi0JICogQHBhcmFtIGNscwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBZGFwdGVycyhFT2JqZWN0IGVPYmosIENsYXNzIGNscykgewotCQlmb3IgKEl0ZXJhdG9yIGFkYXB0ZXJzID0gZU9iai5lQWRhcHRlcnMoKS5pdGVyYXRvcigpOyBhZGFwdGVycwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgYWRhcHRlcnMubmV4dCgpOwotCQkJaWYgKGNscy5pc0luc3RhbmNlKGFkYXB0ZXIpKSB7Ci0JCQkJYWRhcHRlcnMucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBZGFwdGVyKEVPYmplY3QgZU9iaiwgQ2xhc3MgY2xzKSB7Ci0JCWZvciAoSXRlcmF0b3IgYWRhcHRlcnMgPSBlT2JqLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGFkYXB0ZXJzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBhZGFwdGVycy5uZXh0KCk7Ci0JCQlpZiAoY2xzLmlzSW5zdGFuY2UoYWRhcHRlcikpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFkYXB0ZXIgYWRhcHQoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgTm90aWZpZXIgbm90aWZpZXIsCi0JCQlPYmplY3QgdHlwZSwgQ2xhc3Mgdmlld1R5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBhZGFwdGVycyA9IG5vdGlmaWVyLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGFkYXB0ZXJzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBhZGFwdGVycy5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpICYmIHZpZXdUeXBlLmlzSW5zdGFuY2UoYWRhcHRlcikpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFjdG9yeS5hZGFwdE5ldyhub3RpZmllciwgdHlwZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRGaWxlTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobmFtZS5pbmRleE9mKCcvJykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCdcXCcpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCc6JykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCcqJykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJz8nKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJyInKSAhPSAtMQotCQkJCXx8IG5hbWUuaW5kZXhPZignPCcpICE9IC0xIHx8IG5hbWUuaW5kZXhPZignPicpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCd8JykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCc7JykgIT0gLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiB2YWxpZGF0ZSB0aGUgc3RyaW5nIGZvciBhIHBsdWdpbiBuYW1lCi0JICogCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFBsdWdpbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGlzVmFsaWRGaWxlTmFtZShuYW1lKSA9PSBmYWxzZSApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJLy8gbmVlZCB0byByZW1vdmUgdGhlc2UgY2hhcmFjdGVycyBzaW5jZSB0aGV5IGNhdXNlZCBwcm9ibGVtIHdpdGggZWxlbWVudCB1cmwgZW5jb2RpbmcsIGJvb2ttYXJrIGlzc3VlLCAKLQkJLy8gYW5kIGphdmFzY3JpcHQgc3RyaW5nIGxpdGVybmFsIGVzY2FwaW5nIGlzc3VlCi0JCS8vIHNlZSAxNTY5NDYgLSBwbHVnaW4gbmFtZSBzaG91bGQgbm90IGFsbG93ICUsICMsIGFuZCAnCi0JCWlmIChuYW1lLmluZGV4T2YoJyUnKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJyMnKSAhPSAtMQotCQkJCXx8IG5hbWUuaW5kZXhPZignXCcnKSAhPSAtMSApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBmb3IgdGhlIGdpdmVuIEVPYmplY3QuCi0JICogCi0JICogQHBhcmFtIGVPYmoKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBlQ2xhc3NlcwotCSAqICAgICAgICAgICAgY29sbGVjdGlvbiBvZiBFQ2xhc3Mgb2JqZWN0cy4gVGhlIEVPYmplY3QgaW5zdGFuY2VzIG9mIHRoZXNlCi0JICogICAgICAgICAgICBFQ2xhc3Mgb2JqZWN0cyB3aWxsIGJlIHNhdmVkIGluIHRoZWlyIG93biBkaXJlY3RvcnkuCi0JICogQHJldHVybiBudWxsIGlmIHN1Y2Nlc3NmdWwsIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShOYW1lZEVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsCi0JCQlDb2xsZWN0aW9uIGVDbGFzc2VzKSB7Ci0JCXJldHVybiBjaGVja05hbWUoKChFT2JqZWN0KSBlKS5lQ29udGFpbmVyKCksIGUsIG5hbWUsIFRuZ1V0aWwKLQkJCQkuZ2V0VHlwZVRleHQoZSksIGVDbGFzc2VzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWUoRU9iamVjdCBwYXJlbnQsIE5hbWVkRWxlbWVudCBlLCBTdHJpbmcgbmFtZSwKLQkJCVN0cmluZyBlbGVtZW50VHlwZVRleHQsIENvbGxlY3Rpb24gZUNsYXNzZXMpIHsKLQkJU3RyaW5nIG1zZyA9IGNoZWNrRWxlbWVudE5hbWUobmFtZSwgZWxlbWVudFR5cGVUZXh0KTsKLQkJaWYgKG1zZyAhPSBudWxsKQotCQkJcmV0dXJuIG1zZzsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZUNvbnRlbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCU5hbWVkRWxlbWVudCBjaGlsZCA9IChOYW1lZEVsZW1lbnQpIGNoaWxkcmVuLmdldChpKTsKLQkJCWlmIChjaGlsZCAhPSBlICYmIGlzRUNsYXNzSW5zdGFuY2VPZihlQ2xhc3NlcywgY2hpbGQpCi0JCQkJCSYmIG5hbWUuZXF1YWxzSWdub3JlQ2FzZShjaGlsZC5nZXROYW1lKCkpKSB7Ci0JCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZywgbmFtZSk7IAotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShFT2JqZWN0IHBhcmVudCwgTmFtZWRFbGVtZW50IGUsIFN0cmluZyBuYW1lLAotCQkJU3RyaW5nIGVsZW1lbnRUeXBlVGV4dCwgSUZpbHRlciBjaGlsZEZpbHRlcikgewotCQlTdHJpbmcgbXNnID0gY2hlY2tFbGVtZW50TmFtZShuYW1lLCBlbGVtZW50VHlwZVRleHQpOwotCQlpZiAobXNnICE9IG51bGwpCi0JCQlyZXR1cm4gbXNnOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5lQ29udGVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJTmFtZWRFbGVtZW50IGNoaWxkID0gKE5hbWVkRWxlbWVudCkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJaWYgKGNoaWxkICE9IGUgJiYgY2hpbGRGaWx0ZXIuYWNjZXB0KGNoaWxkKQotCQkJCQkmJiBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoY2hpbGQuZ2V0TmFtZSgpKSkgewotCQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csIG5hbWUpOyAKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG5hbWUgY2FuIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LiBUaGUgbWV0aG9kCi0JICogYXNzdW1lIHRoYXQgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBiZSBzYXZlZCB1bmRlciB0aGUgZ2l2ZW4gZGlyZWN0b3J5Ci0JICogdXNpbmcgdGhlIGdpdmVuIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgRGlyZWN0b3J5IHdoZXJlIHRoZSBnaXZlbiBlbGVtZW50IHdpbGwgYmUgc2F2ZWQgaW4gYSBmaWxlIG9yIGEKLQkgKiAgICAgICAgICAgIGRpcmVjdG9yeSBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGlzRGlyCi0JICogQHBhcmFtIHNpYmxpbmdzCi0JICogICAgICAgICAgICBleGlzaXRpbmcgc2libGluZ3Mgb2YgdGhlIGdpdmVuIGVsZW1lbnQgPGNvZGU+ZTwvY29kZT4KLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgaXRzIG5hbWUgdG8gYmUgY2hlY2tlZC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHN1Z2dlc3RlZCBuZXcgbmFtZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgPGNvZGU+ZTwvY29kZT4KLQkgKiBAcGFyYW0gdHlwZUxhYmVsCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudCB0eXBlIGxhYmVsLgotCSAqIEBwYXJhbSBpc0RpcgotCSAqICAgICAgICAgICAgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBiZSBzYXZlZCBhCi0JICogICAgICAgICAgICBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuIG5hbWUgY2FuIGJlIHVzZWQsIGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIG5hbWUKLQkgKiAgICAgICAgIGlzIGFscmVhZHkgdGFrZW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEZpbGUgZGlyLCBDb2xsZWN0aW9uIHNpYmxpbmdzLAotCQkJTmFtZWRFbGVtZW50IGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgZWxlbWVudFR5cGVUZXh0LCBib29sZWFuIGlzRGlyKSB7Ci0JCVN0cmluZyBtc2cgPSBjaGVja0VsZW1lbnROYW1lKG5hbWUsIGVsZW1lbnRUeXBlVGV4dCk7Ci0JCWlmIChtc2cgIT0gbnVsbCkKLQkJCXJldHVybiBtc2c7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IG5hbWU7Ci0JCWlmICghaXNEaXIpIHsKLQkJCWZpbGVOYW1lID0gZmlsZU5hbWUgKyAoKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKVNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCkpLmdldEZpbGVFeHRlbnNpb24oZSk7Ci0JCX0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBmaWxlTmFtZSk7Ci0JCUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCQlpZiAoZSAhPSBudWxsICYmIGUuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJY3VycmVudEZpbGUgPSBuZXcgRmlsZShlLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCWlmIChpc0RpcikgewotCQkJCWN1cnJlbnRGaWxlID0gY3VycmVudEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJfQotCQl9Ci0JCWJvb2xlYW4gYiA9IGZpbGUuZXhpc3RzKCk7Ci0JCWlmIChiICYmICFmaWxlLmVxdWFscyhjdXJyZW50RmlsZSkpIHsKLQkJCW1zZyA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLCBuYW1lKTsgCi0JCQlPYmplY3RbXSBwYXJhbXMgPSBuZXcgT2JqZWN0WzJdOwotCQkJaWYgKGZpbGUuaXNGaWxlKCkpIHsKLQkJCQlwYXJhbXNbMF0gPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5maWxlX3RleHQ7IAotCQkJfSBlbHNlIHsKLQkJCQlwYXJhbXNbMF0gPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5kaXJlY3RvcnlfdGV4dDsgCi0JCQl9Ci0JCQlwYXJhbXNbMV0gPSBmaWxlOwotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1zZywgcGFyYW1zKS50b1N0cmluZygpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNpYmxpbmdzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTmFtZWRFbGVtZW50IGNoaWxkID0gKE5hbWVkRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgIT0gZSAmJiBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoY2hpbGQuZ2V0TmFtZSgpKSkgewotCQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csIG5hbWUpOyAKLQkJCX0KLQkJfQotCQkvLyAKLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0VsZW1lbnROYW1lKFN0cmluZyBuYW1lLCBTdHJpbmcgZWxlbWVudFR5cGVUZXh0KSB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnLCBTdHJVdGlsLnRvTG93ZXIoZWxlbWVudFR5cGVUZXh0KSk7IAotCQlpZiAobmFtZS5zdGFydHNXaXRoKCIgIikpIC8vJE5PTi1OTFMtMSQKLQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjFfbXNnLCBuYW1lKTsgCi0JCWlmIChuYW1lLmVuZHNXaXRoKCIuIikpIC8vJE5PTi1OTFMtMSQKLQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjJfbXNnLCBuYW1lKTsgCQkKLQkJaWYgKCFpc1ZhbGlkRmlsZU5hbWUobmFtZSkpCi0JCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3IzX21zZywgbmFtZSk7IAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1BsdWdpbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkKLQkJU3RyaW5nIGVycm9yID0gY2hlY2tFbGVtZW50TmFtZShuYW1lLCBUbmdVdGlsLmdldFR5cGVUZXh0KCJNZXRob2RQbHVnaW4iKSApOyAvLyROT04tTkxTLTEkCi0JCWlmICggZXJyb3IgIT0gbnVsbCApIHsKLQkJCXJldHVybiBlcnJvcjsKLQkJfQotCQkKLQkJLy8gMTU2OTQ2IC0gcGx1Z2luIG5hbWUgc2hvdWxkIG5vdCBhbGxvdyAlLCAjLCBhbmQgJwotCQlpZiAoIWlzVmFsaWRQbHVnaW5OYW1lKG5hbWUpICkgewotCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2csIG5hbWUpOyAKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0FjdGl2aXR5TmFtZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU9iamVjdCBvYmplY3QsIFN0cmluZyBuYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gaWYoIWlzVmFsaWRGaWxlTmFtZShuYW1lKSkgcmV0dXJuICJJbnZhbGlkIG5hbWU6ICciICsgbmFtZSArICInLiBUaGUKLQkJLy8gbmFtZSBjYW5ub3QgY29udGFpbiBmb2xsb3dpbmcgY2hhcmFjdGVyczogXFwgLyA6ICogPyBcIiA8ID4gfCI7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoYWRhcHRlckZhY3RvcnksIChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QsIEFjdGl2aXR5LmNsYXNzLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uKTsKLQl9Ci0KLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrV0JTQWN0aXZpdHlOYW1lKE9iamVjdCBhY3QsIFN0cmluZyBuYW1lKSB7Ci0vLwkJcmV0dXJuIGNoZWNrQWN0aXZpdHlOYW1lKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0vLwkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgYWN0LCBuYW1lKTsKLS8vCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrV0JTQWN0aXZpdHlQcmVzZW50YXRpb25OYW1lKE9iamVjdCBhY3QsCi0JCQlTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJaWYgKCEoYWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgKEJyZWFrZG93bkVsZW1lbnQpIGFjdCwgQWN0aXZpdHkuY2xhc3MsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQluYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tXb3JrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IGUsCi0JCQlTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJaWYgKCEoZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIChCcmVha2Rvd25FbGVtZW50KSBlLAotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1dvcmtQcm9kdWN0RGVzY3JpcHRvclByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IGUsCi0JCQlTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJaWYgKCEoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCAoQnJlYWtkb3duRWxlbWVudCkgZSwKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwgbmFtZSwgc3VwcHJlc3Npb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrUm9sZURlc2NyaXB0b3JQcmVzZW50YXRpb25OYW1lKE9iamVjdCBlLAotCQkJU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCWlmICghKGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCAoQnJlYWtkb3duRWxlbWVudCkgZSwgUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQluYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUNsYXNzSW5zdGFuY2VPZihDb2xsZWN0aW9uIGVDbGFzc2VzLCBPYmplY3Qgb2JqKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVDbGFzc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVDbGFzcy5pc0luc3RhbmNlKG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luc3RhbmNlT2YoQ29sbGVjdGlvbiBjbGFzc2VzLCBPYmplY3Qgb2JqKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNsYXNzZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDbGFzcyBjbGF6eiA9IChDbGFzcykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2xhenouaXNJbnN0YW5jZShvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFkYXB0ZXJGYWN0b3J5IGdldEJlc3RBZGFwdGVyRmFjdG9yeSgKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIHsKLQkJCXJldHVybiAoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMYWJlbChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRMYWJlbChvYmplY3QsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvYmplY3QsIFN0cmluZyBhbHRlcm5hdGl2ZUxhYmVsKSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgb2JqZWN0OwotCQkJaWYgKGVPYmouZUlzUHJveHkoKSkgewotCQkJCVN0cmluZyBwYXRoID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIHVyaSA9IGVPYmouZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKQotCQkJCQkJCS5ub3JtYWxpemUoKChJbnRlcm5hbEVPYmplY3QpIGVPYmopLmVQcm94eVVSSSgpKTsKLQkJCQkJcGF0aCA9IHVyaS5pc0ZpbGUoKSA/IHVyaS50b0ZpbGVTdHJpbmcoKSA6IHVyaS50b1N0cmluZygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vCi0JCQkJfQotCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJcGF0aCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCSIgJyd7MH0nJyIsIG5ldyBPYmplY3RbXSB7IHBhdGggfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlwYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy51bnJlc29sdmVkX3RleHQsIHBhdGgpOyAKLQkJCX0KLQkJfQotCQlTdHJpbmcgbGFiZWwgPSBudWxsOwotCQlib29sZWFuIHNob3dQcmVzZW50YXRpb25OYW1lcyA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKTsKLQkJaWYgKHNob3dQcmVzZW50YXRpb25OYW1lcyAmJiBvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpCi0JCQlsYWJlbCA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJZWxzZSBpZiAoc2hvd1ByZXNlbnRhdGlvbk5hbWVzICYmIG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpCi0JCQlsYWJlbCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqZWN0KS5nZXRQcm9jZXNzKCkKLQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJaWYgKGxhYmVsID09IG51bGwgfHwgbGFiZWwudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQlsYWJlbCA9ICgoTmFtZWRFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwudHJpbSgpLmxlbmd0aCgpID09IDAgPyBhbHRlcm5hdGl2ZUxhYmVsIDogbGFiZWw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGFiZWwoVmFyaWFiaWxpdHlFbGVtZW50IG9iamVjdCwKLQkJCVN0cmluZyBhbHRlcm5hdGl2ZUxhYmVsLCBib29sZWFuIHByZWZlckJhc2UpIHsKLQkJU3RyaW5nIGxhYmVsID0gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGFsdGVybmF0aXZlTGFiZWwpOwotCQlpZiAocHJlZmVyQmFzZSAmJiBvYmplY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gb2JqZWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJU3RyaW5nIHZhcmlhYmlsaXR5VHh0ID0gbnVsbDsKLQkJCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5jb250cmlidXRlc1RvX3RleHQ7IAotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCkgewotCQkJCQl2YXJpYWJpbGl0eVR4dCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmxvY2FsQ29udHJpYnV0ZXNUb190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5leHRlbmRzX3RleHQ7IAotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXBsYWNlc190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlRfTElURVJBTCkgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gTGlicmFyeUVkaXRSZXNvdXJjZXMubG9jYWxSZXBsYWNlc190ZXh0OyAKLQkJCX0KLQkJCWlmICh2YXJpYWJpbGl0eVR4dCAhPSBudWxsKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihvYmplY3QKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJCWlmIChiYXNlUGx1Z2luICE9IG51bGwpIHsKLQkJCQkJbGFiZWwgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eXdpdGhwbHVnaW5faW5mbywgKG5ldyBTdHJpbmdbXSB7Ci0JCQkJCWxhYmVsLAotCQkJCQl2YXJpYWJpbGl0eVR4dCwKLQkJCQkJVG5nVXRpbAotCQkJCQkJCS5nZXRMYWJlbCgKLQkJCQkJCQkJCW9iamVjdAotCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQkJCQkJYWx0ZXJuYXRpdmVMYWJlbCksCi0JCQkJCWJhc2VQbHVnaW4uZ2V0TmFtZSgpIH0pKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsYWJlbCA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLlV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5X2luZm8sIChuZXcgU3RyaW5nW10gewotCQkJCQlsYWJlbCwKLQkJCQkJdmFyaWFiaWxpdHlUeHQsCi0JCQkJCVRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0Ci0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQkJCQlhbHRlcm5hdGl2ZUxhYmVsKSB9KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBQcm9jZXNzQ29tcG9uZW50Ci0JICogCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplUHJvY2Vzc0NvbXBvbmVudChQcm9jZXNzQ29tcG9uZW50IGNvbXBvbmVudCwKLQkJCUVDbGFzcyB0eXBlKSB7Ci0JCS8vIGNyZWF0ZSBuZXcgcHJvY2VzcyBmb3IgdGhlIHByb2Nlc3MgY29tcG9uZW50Ci0JCS8vCi0JCVByb2Nlc3MgcHJvYyA9IGNvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCWlmIChwcm9jID09IG51bGwpIHsKLQkJCXByb2MgPSAoUHJvY2VzcykgVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKHR5cGUpOwotCQkJY29tcG9uZW50LnNldFByb2Nlc3MocHJvYyk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgdG9wIGFjdGl2aXR5Ci0JCS8vCi0JCS8vIGlmKHByb2MuZ2V0VG9wTGV2ZWxCcmVha2Rvd25FbGVtZW50KCkgPT0gbnVsbCkgewotCQkvLyBBY3Rpdml0eSBhY3QgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eSgpOwotCQkvLyBwcm9jLnNldFRvcExldmVsQnJlYWtkb3duRWxlbWVudChhY3QpOwotCQkvLyBjb21wb25lbnQuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoYWN0KTsKLQkJLy8gfQotCi0JCS8vIGNyZWF0ZSBXQlMsIE9CUywgYW5kIFBCUwotCQkvLwotCQkvLyBpZihjb21wb25lbnQuZ2V0V0JTKCkgPT0gbnVsbCkKLQkJLy8gY29tcG9uZW50LnNldFdCUyhVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXQlMoKSk7Ci0JCS8vIGlmKGNvbXBvbmVudC5nZXRUQlMoKSA9PSBudWxsKQotCQkvLyBjb21wb25lbnQuc2V0VEJTKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRCUygpKTsKLQkJLy8gaWYoY29tcG9uZW50LmdldFdQQlMoKSA9PSBudWxsKQotCQkvLyBjb21wb25lbnQuc2V0V1BCUyhVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXUEJTKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQnJlYWtkb3duRWxlbWVudCBnZXRQYXJlbnQoQnJlYWtkb3duRWxlbWVudCBiZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja051bGwoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gKHN0ciA9PSBudWxsID8gIiIgOiBzdHIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlc2NyaXB0b3JFeGlzdHMoUm9sZSByb2xlLCBMaXN0IHJvbGVEZXNjcmlwdG9yTGlzdCkgewotCQlmb3IgKGludCBpID0gcm9sZURlc2NyaXB0b3JMaXN0LnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgcm9sZURlc2NyaXB0b3JMaXN0Ci0JCQkJCS5nZXQoaSk7Ci0JCQlpZiAocm9sZURlc2MuZ2V0Um9sZSgpID09IHJvbGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBjb3B5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlDb3BpZXIgY29waWVyID0gbmV3IENvcGllcigpIHsKLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1Nzg0NjU3NjAzMzkwNDY5MUw7Ci0KLQkJCS8qKgotCQkJICogQ2FsbGVkIHRvIGhhbmRsZSB0aGUgY29weWluZyBvZiBhIGNyb3NzIHJlZmVyZW5jZTsgdGhpcyBhZGRzCi0JCQkgKiB2YWx1ZXMgb3Igc2V0cyBhIHNpbmdsZSB2YWx1ZSBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIG11bHRpcGxpY2l0eQotCQkJICogd2hpbGUgb21pdHRpbmcgYW55IGJpZGlyZWN0aW9uYWwgcmVmZXJlbmNlIG9yIHNpbmdsZSBvcHBvc2l0ZQotCQkJICogZmVhdHVyZSdzIHJlZmVyZW5jZSB0aGF0IGlzbid0IGluIHRoZSBjb3B5IG1hcC4KLQkJCSAqIAotCQkJICogQHBhcmFtIGVSZWZlcmVuY2UKLQkJCSAqICAgICAgICAgICAgdGhlIHJlZmVyZW5jZSB0byBjb3B5LgotCQkJICogQHBhcmFtIGVPYmplY3QKLQkJCSAqICAgICAgICAgICAgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkuCi0JCQkgKiBAcGFyYW0gY29weUVPYmplY3QKLQkJCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb3B5IHRvLgotCQkJICovCi0JCQlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVmZXJlbmNlKEVSZWZlcmVuY2UgZVJlZmVyZW5jZSwKLQkJCQkJRU9iamVjdCBlT2JqZWN0LCBFT2JqZWN0IGNvcHlFT2JqZWN0KSB7Ci0JCQkJaWYgKGVPYmplY3QuZUlzU2V0KGVSZWZlcmVuY2UpKSB7Ci0JCQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSBPcHBvc2l0ZUZlYXR1cmUuZ2V0T3Bwb3NpdGVGZWF0dXJlKGVSZWZlcmVuY2UpOwotCQkJCQkKLQkJCQkJLy8gIm1hbnkiIG9wcG9zaXRlIGZlYXR1cmUgZG9lcyBub3QgcmVxdWlyZSBjb3BpZWQgdGFyZ2V0LCBpdCBpcwotCQkJCQkvLyB0cmVhdGVkIGFzIGEgcmVndWxhciBub24tY29udGFpbm1lbnQgcmVmZXJlbmNlCi0JCQkJCS8vIFRPRE86IGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgY29waWVkIGluCi0JCQkJCS8vIEVNRiBpbXBsZW1lbnRhdGlvbgotCQkJCQkvLwotCQkJCQlib29sZWFuIGNvcGllZFRhcmdldFJlcXVpcmVkID0gZVJlZmVyZW5jZS5nZXRFT3Bwb3NpdGUoKSAhPSBudWxsCi0JCQkJCQkJfHwgKG9wcG9zaXRlRmVhdHVyZSAhPSBudWxsICYmICFvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpOwotCQkJCQkJCQkJCQotCQkJCQlpZiAoZVJlZmVyZW5jZS5pc01hbnkoKSkgewotCQkJCQkJTGlzdCBzb3VyY2UgPSAoTGlzdCkgZU9iamVjdC5lR2V0KGVSZWZlcmVuY2UpOwotCQkJCQkJSW50ZXJuYWxFTGlzdCB0YXJnZXQgPSAoSW50ZXJuYWxFTGlzdCkgY29weUVPYmplY3QKLQkJCQkJCQkJLmVHZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpKTsKLQkJCQkJCWlmIChzb3VyY2UuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJdGFyZ2V0LmNsZWFyKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBrID0gc291cmNlLml0ZXJhdG9yKCk7IGsuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3QgcmVmZXJlbmNlZEVPYmplY3QgPSBrLm5leHQoKTsKLQkJCQkJCQkJT2JqZWN0IGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9IGdldChyZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCWlmIChjb3B5UmVmZXJlbmNlZEVPYmplY3QgPT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKCFjb3BpZWRUYXJnZXRSZXF1aXJlZCkgewotCQkJCQkJCQkJCXRhcmdldC5hZGRVbmlxdWUoaW5kZXgsCi0JCQkJCQkJCQkJCQlyZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJKytpbmRleDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWlmIChjb3BpZWRUYXJnZXRSZXF1aXJlZCkgewotCQkJCQkJCQkJCWludCBwb3NpdGlvbiA9IHRhcmdldAotCQkJCQkJCQkJCQkJLmluZGV4T2YoY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCQlpZiAocG9zaXRpb24gPT0gLTEpIHsKLQkJCQkJCQkJCQkJdGFyZ2V0LmFkZFVuaXF1ZShpbmRleCwKLQkJCQkJCQkJCQkJCQljb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJCX0gZWxzZSBpZiAoaW5kZXggIT0gcG9zaXRpb24pIHsKLQkJCQkJCQkJCQkJdGFyZ2V0Lm1vdmUoaW5kZXgsCi0JCQkJCQkJCQkJCQkJY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCXRhcmdldC5hZGRVbmlxdWUoaW5kZXgsCi0JCQkJCQkJCQkJCQljb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJKytpbmRleDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCU9iamVjdCByZWZlcmVuY2VkRU9iamVjdCA9IGVPYmplY3QuZUdldChlUmVmZXJlbmNlKTsKLQkJCQkJCWlmIChyZWZlcmVuY2VkRU9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCQkJY29weUVPYmplY3QuZVNldChnZXRUYXJnZXQoZVJlZmVyZW5jZSksIG51bGwpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlPYmplY3QgY29weVJlZmVyZW5jZWRFT2JqZWN0ID0gZ2V0KHJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQlpZiAoY29weVJlZmVyZW5jZWRFT2JqZWN0ID09IG51bGwpIHsKLQkJCQkJCQkJaWYgKCFjb3BpZWRUYXJnZXRSZXF1aXJlZCkgewotCQkJCQkJCQkJY29weUVPYmplY3QuZVNldChnZXRUYXJnZXQoZVJlZmVyZW5jZSksCi0JCQkJCQkJCQkJCXJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWNvcHlFT2JqZWN0LmVTZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpLAotCQkJCQkJCQkJCWNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlNZXRob2RFbGVtZW50IGNvcHkgPSAoTWV0aG9kRWxlbWVudCkgY29waWVyLmNvcHkoZWxlbWVudCk7Ci0JCWNvcGllci5jb3B5UmVmZXJlbmNlcygpOwotCi0JCS8vIHVuc2V0IHRoZSBHVUlEIG9mIHRoZSBjb3B5IGFuZCBpdHMgb2Zmc3RyaW5nCi0JCS8vCi0JCWNvcHkuc2V0R3VpZChudWxsKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29weS5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50KSBlKS5zZXRHdWlkKG51bGwpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlFbGVtZW50IGdldEJhc2UoVmFyaWFiaWxpdHlFbGVtZW50IGMpIHsKLQkJZm9yICg7IGMuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGw7IGMgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBjCi0JCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkKLQkJCTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50Q2F0ZWdvcnkgZmluZEluaGVyaXRlZChDb2xsZWN0aW9uIGluaGVyaXRlZExpc3QsCi0JCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaW5oZXJpdGVkTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBlbGVtZW50ID0gKENvbnRlbnRDYXRlZ29yeSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkJCQkmJiAoZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gY2F0ZWdvcnkgfHwgZWxlbWVudAotCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gY2F0ZWdvcnkKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSkKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbnRlbnRDYXRlZ29yeSByZW1vdmVJbmhlcml0ZWQoTGlzdCBpbmhlcml0ZWRMaXN0LAotCQkJQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGluaGVyaXRlZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgZWxlbWVudCA9IChDb250ZW50Q2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IGNhdGVnb3J5KSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXREaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihNZXRob2RQbHVnaW4gbW9kZWwpIHsKLQkJSUdyb3VwQ29udGFpbmVyIGdyb3VwQ29udGFpbmVyID0gKElHcm91cENvbnRhaW5lcikgVG5nVXRpbC5nZXRBZGFwdGVyKAotCQkJCShFT2JqZWN0KSBtb2RlbCwgSUdyb3VwQ29udGFpbmVyLmNsYXNzKTsKLQkJaWYgKGdyb3VwQ29udGFpbmVyICE9IG51bGwpIHsKLQkJCWdyb3VwQ29udGFpbmVyID0gKElHcm91cENvbnRhaW5lcikgZ3JvdXBDb250YWluZXIKLQkJCQkJLmdldEdyb3VwSXRlbVByb3ZpZGVyKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBncm91cENvbnRhaW5lcgotCQkJCQkuZ2V0R3JvdXBJdGVtUHJvdmlkZXIoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoTGlzdCBzaWJsaW5ncywgTWV0aG9kRWxlbWVudCBlLAotCQkJU3RyaW5nIGJhc2VOYW1lKSB7Ci0JCWlmIChlLmdldE5hbWUoKSAhPSBudWxsICYmIGUuZ2V0TmFtZSgpLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc05hbWVUYWtlbihzaWJsaW5ncywgZSwgYmFzZU5hbWUpKSB7Ci0JCQllLnNldE5hbWUoYmFzZU5hbWUpOwotCQkJc2V0UHJlc2VudGF0aW9uTmFtZShlLCBiYXNlTmFtZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDI7IHRydWU7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBiYXNlTmFtZSArICdfJyArIGk7Ci0JCQlpZiAoIWlzTmFtZVRha2VuKHNpYmxpbmdzLCBlLCBuYW1lKSkgewotCQkJCWUuc2V0TmFtZShuYW1lKTsKLQkJCQlzZXRQcmVzZW50YXRpb25OYW1lKGUsIG5hbWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0UHJlc2VudGF0aW9uTmFtZShNZXRob2RFbGVtZW50IGUsIFN0cmluZyBiYXNlTmFtZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJRGVzY3JpYmFibGVFbGVtZW50IGRlID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZTsKLQotCQkJU3RyaW5nQnVmZmVyIHByZXNOYW1lQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihiYXNlTmFtZSwgIl8iKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBhV29yZCA9IHN0Lm5leHRUb2tlbigpOwotCQkJCXByZXNOYW1lQnVmLmFwcGVuZChhV29yZC5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKQotCQkJCQkJKyBhV29yZC5zdWJzdHJpbmcoMSkgKyAiICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWRlLnNldFByZXNlbnRhdGlvbk5hbWUocHJlc05hbWVCdWYudG9TdHJpbmcoKS50cmltKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05hbWVUYWtlbihMaXN0IHNpYmxpbmdzLCBNZXRob2RFbGVtZW50IGUsCi0JCQlTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gc2libGluZ3Muc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCU1ldGhvZEVsZW1lbnQgc2libGluZyA9IChNZXRob2RFbGVtZW50KSBzaWJsaW5ncy5nZXQoaSk7Ci0JCQlpZiAoc2libGluZyAhPSBlICYmIG5hbWUuZXF1YWxzKHNpYmxpbmcuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZXh0cmFjdChDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIENsYXNzIGNscykgewotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2xzLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQlsaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoSURlZmF1bHROYW1lU2V0dGVyIGRlZmF1bHROYW1lU2V0dGVyLAotCQkJTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAoZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgIT0gbnVsbCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoZGVmYXVsdE5hbWVTZXR0ZXIKLQkJCQkJLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCWRlZmF1bHROYW1lU2V0dGVyLnNldERlZmF1bHROYW1lKG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJZGVmYXVsdE5hbWVTZXR0ZXIuc2V0RGVmYXVsdE5hbWUoaXRlci5uZXh0KCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlQ2F0ZWdvcnkKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZgotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFeHRlbmRlZENoaWxkcmVuKENvbnRlbnRDYXRlZ29yeSBiYXNlQ2F0ZWdvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmYsIENvbGxlY3Rpb24gY2hpbGRyZW4sCi0JCQlTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGgpIHsKLQkJTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihiYXNlQ2F0ZWdvcnkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RDb25mLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJaWYgKE1pc2MuaXNCYXNlT2YoYmFzZVBsdWdpbiwgcGx1Z2luKSkgewotCQkJCUNvbnRlbnRQYWNrYWdlIGNhdGVnb3J5UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQkJY2F0ZWdvcnlQa2dQYXRoKTsKLQkJCQlpZiAoY2F0ZWdvcnlQa2cgIT0gbnVsbAotCQkJCQkJJiYgbWV0aG9kQ29uZi5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY29udGFpbnMoCi0JCQkJCQkJCWNhdGVnb3J5UGtnKSkgewotCQkJCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSBmaW5kSW5oZXJpdGVkKGNhdGVnb3J5UGtnCi0JCQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBiYXNlQ2F0ZWdvcnkpOwotCQkJCQlpZiAoY2F0ZWdvcnkgIT0gbnVsbCkgewotCQkJCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCQkJCQkJCQkuYWRhcHQoY2F0ZWdvcnksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJCQkJU3lzdGVtLmVycgotCQkJCQkJCQkJLnByaW50bG4oIkRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5hZGRFeHRlbmRlZENoaWxkcmVuKCk6IGNvdWxkIG5vdCBmaW5kIGFkYXB0ZXIgZm9yICIgKyBjYXRlZ29yeSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhZGFwdGVyLmdldENoaWxkcmVuKGNhdGVnb3J5KQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlDb250ZW50RWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQkJCQllbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBjaGlsZDsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbAotCQkJCQkJCQkJJiYgZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkgewotCQkJCQkJCQkvLyB0aGlzIGlzIGFuIG93biBjaGlsZCBvZiBhbiBleHRlbmRlZCBjYXRlZ29yeQotCQkJCQkJCQkvLyBpdCBtdXN0IGJlIGFkZGVkIHRvIHRoZSBjaGlsZCBsaXN0IG9mIHRoZQotCQkJCQkJCQkvLyBiYXNlIGNhdGVnb3J5IGluIHRoZSBjb25maWd1cmF0aW9uLgotCQkJCQkJCQkvLwotCQkJCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gY29sbGVjdCB0aGUgb3duIGNoaWxkcmVuIG9mIHRoZSBleHRlbmRlZCBjYXRlZ29yaWVzCi0JCQkJCQkvLyBvZiB0aGlzIGNhdGVnb3J5IGRvd24gdGhlIGluaGVyaXRhbmNlIHRyZWUKLQkJCQkJCS8vCi0JCQkJCQlhZGRFeHRlbmRlZENoaWxkcmVuKGNhdGVnb3J5LCBtZXRob2RDb25mLCBjaGlsZHJlbiwKLQkJCQkJCQkJY2F0ZWdvcnlQa2dQYXRoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQWxsVG8oTGlzdCBhbGxDaGlsZHJlbiwgTGlzdCBuZXdDaGlsZHJlbikgewotCQlpbnQgaWQ7Ci0JCUJyZWFrZG93bkVsZW1lbnQgY2hpbGQsIG5leHQsIGxhc3Q7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSghbmV3Q2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JCQljaGlsZCA9IChCcmVha2Rvd25FbGVtZW50KSBuZXdDaGlsZHJlbi5yZW1vdmUoMCk7Ci0JCQlsaXN0LmNsZWFyKCk7Ci0JCQlsaXN0LmFkZChjaGlsZCk7Ci0JCQlsYXN0ID0gbnVsbDsKLQkJCQotCQkJLy8gZmluZCB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiBpbiBuZXcgY2hpbGRyZW4gbGlzdAotCQkJLy8KLQkJCWZpbmRfbGFzdDoKLQkJCWZvcihuZXh0ID0gY2hpbGQuZ2V0UHJlc2VudGVkQWZ0ZXIoKTsgbmV4dCAhPSBudWxsOyBuZXh0ID0gbmV4dC5nZXRQcmVzZW50ZWRBZnRlcigpKSB7Ci0JCQkJbGFzdCA9IG5leHQ7Ci0JCQkJaWQgPSBpbmRleE9mTmV4dEVsZW1lbnQobmV3Q2hpbGRyZW4sIG5leHQpOwotCQkJCWlmKGlkID09IC0xKSB7Ci0JCQkJCWJyZWFrIGZpbmRfbGFzdDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWxpc3QuYWRkKG5ld0NoaWxkcmVuLnJlbW92ZShpZCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmKGxhc3QgIT0gbnVsbCkgewotCQkJCWlkID0gaW5kZXhPZk5leHRFbGVtZW50KGFsbENoaWxkcmVuLCBsYXN0KTsKLQkJCQlpZihpZCA9PSAtMSkgewotCQkJCQlhbGxDaGlsZHJlbi5hZGRBbGwobGlzdCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlhbGxDaGlsZHJlbi5hZGRBbGwoaWQsIGxpc3QpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWFsbENoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjaGlsZCB0byB0aGUgYWxsQ2hpbGRyZW4gbGlzdCBiYXNlZCBvbiB0aGUgcHJlc2VudGVkQmVmb3JlCi0JICogb2YgY2hpbGQuCi0JICogCi0JICogQHBhcmFtIGFsbENoaWxkcmVuCi0JICogQHBhcmFtIGNoaWxkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRvKExpc3QgYWxsQ2hpbGRyZW4sIEJyZWFrZG93bkVsZW1lbnQgY2hpbGQsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUJyZWFrZG93bkVsZW1lbnQgbmV4dCA9IGNoaWxkLmdldFByZXNlbnRlZEFmdGVyKCk7Ci0JCWludCBpZDsKLQkJaWYgKG5leHQgPT0gbnVsbCkgewotCQkJaWQgPSAtMTsKLQkJfSBlbHNlIHsKLQkJCWlkID0gaW5kZXhPZk5leHRFbGVtZW50KGFsbENoaWxkcmVuLCBuZXh0KTsKLQkJCS8vIGlmKGlkID09IC0xKSB7Ci0JCQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRuZ1V0aWwuYWRkVG8oKTogaW52YWxpZCBwcmVzZW50ZWRCZWZvcmUKLQkJCS8vIG9mICIgKyBjaGlsZCk7Ci0JCQkvLyBCcmVha2Rvd25FbGVtZW50IHByZXYgPSBjaGlsZC5nZXRQcmVzZW50ZWRCZWZvcmUoKTsKLQkJCS8vIGlmKHByZXYgPT0gbnVsbCkgewotCQkJLy8gaWQgPSAwOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyBpZCA9IGluZGV4T2YoYWxsQ2hpbGRyZW4sIHByZXYpOwotCQkJLy8gaWYoaWQgPiAtMSkgewotCQkJLy8gaWYoaWQgPCBhbGxDaGlsZHJlbi5zaXplKCkgLSAxKSB7Ci0JCQkvLyBpZCsrOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyBpZCA9IC0xOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0JCWlmIChpZCA9PSAtMSkgewotCQkJYWxsQ2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJfSBlbHNlIHsKLQkJCWFsbENoaWxkcmVuLmFkZChpZCwgY2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5kZXggb2YgbmV4dCBlbGVtZW50IG9mIHRoZSBicmVha2Rvd24gZWxlbWVudCB3aG9zZSBwcmVzZW50ZWQtYWZ0ZXIgZWxlbWVudCBpcyB0aGUgZ2l2ZW4gCi0JICogYnJlYWsgZG93biBlbGVtZW50Ci0JICogQHBhcmFtIG1peGVkTGlzdAotCSAqICAgICAgICAgICAgbWl4ZWQgbGlzdCBvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBhbmQKLQkgKiAgICAgICAgICAgIEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0cwotCSAqIEBwYXJhbSBwcmVzZW50ZWRBZnRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgaW5kZXhPZk5leHRFbGVtZW50KExpc3QgbWl4ZWRMaXN0LCBCcmVha2Rvd25FbGVtZW50IHByZXNlbnRlZEFmdGVyKSB7Ci0JCWludCBzaXplID0gbWl4ZWRMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvID0gdW53cmFwKG1peGVkTGlzdC5nZXQoaSkpOwotCQkJaWYgKG8gPT0gcHJlc2VudGVkQWZ0ZXIKLQkJCQkJfHwgKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgJiYgKChWYXJpYWJpbGl0eUVsZW1lbnQpbykuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IHByZXNlbnRlZEFmdGVyKSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEF2YWlsYWJsZUJhc2VQcm9jZXNzZXMoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCUxpc3QgcHJvY2Vzc0NsYXNzZXMpIHsKLQkJTGlzdCBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYWxsQmFzZVBsdWdpbnMgPSBNaXNjLmdldEFsbEJhc2UocGx1Z2luKTsKLQkJYWxsQmFzZVBsdWdpbnMuYWRkKDAsIHBsdWdpbik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbEJhc2VQbHVnaW5zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUNvbGxlY3Rpb24gcGFja2FnZXMgPSBnZXRSb290UHJvY2Vzc1BhY2thZ2VzKGJhc2VQbHVnaW4sCi0JCQkJCXByb2Nlc3NDbGFzc2VzKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwYWNrYWdlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGNoaWxkUGtnID0gKE9iamVjdCkgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBjaGlsZFBrZykKLQkJCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQkJCWlmIChpc0luc3RhbmNlT2YocHJvY2Vzc0NsYXNzZXMsIHByb2MpKSB7Ci0JCQkJCQkJcHJvY2Vzc2VzLmFkZChwcm9jKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvY2Vzc2VzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldFJvb3RQcm9jZXNzUGFja2FnZVBhdGgoQ2xhc3MgcHJvY0NsYXNzKSB7Ci0JCWlmIChwcm9jQ2xhc3MgPT0gRGVsaXZlcnlQcm9jZXNzLmNsYXNzKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoOwotCQl9IGVsc2UgaWYgKHByb2NDbGFzcyA9PSBDYXBhYmlsaXR5UGF0dGVybi5jbGFzcykgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQl9IGVsc2UgaWYgKHByb2NDbGFzcyA9PSBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5jbGFzcykgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBnZXRSb290UHJvY2Vzc1BhY2thZ2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4sCi0JCQlDb2xsZWN0aW9uIHByb2NDbGFzc2VzKSB7Ci0JCUxpc3QgcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb2NDbGFzc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ2xhc3MgY2xhenogPSAoQ2xhc3MpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nW10gcGF0aCA9IGdldFJvb3RQcm9jZXNzUGFja2FnZVBhdGgoY2xhenopOwotCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sIHBhdGgpOwotCQkJCWlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlwYWNrYWdlcy5hZGQocGtnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGFja2FnZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFByb2Nlc3NlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUxpc3QgcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2luLmdldE1ldGhvZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSkgaXQubmV4dCgpOwotCQkJX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKHBrZywgcHJvY2Vzc2VzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFByb2Nlc3NlcyhNZXRob2RQYWNrYWdlIHBrZykgewotCQlMaXN0IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCV9pdGVyYXRlUGFja2FnZUZvclByb2Nlc3Nlcyhwa2csIHByb2Nlc3Nlcyk7Ci0KLQkJcmV0dXJuIHByb2Nlc3NlczsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBfaXRlcmF0ZVBhY2thZ2VGb3JQcm9jZXNzZXMoTWV0aG9kUGFja2FnZSBwa2csCi0JCQlMaXN0IHByb2Nlc3NlcykgewotCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUHJvY2VzcyBwID0gKChQcm9jZXNzQ29tcG9uZW50KSBwa2cpLmdldFByb2Nlc3MoKTsKLQkJCWlmIChwICE9IG51bGwgJiYgIXByb2Nlc3Nlcy5jb250YWlucyhwKSkgewotCQkJCXByb2Nlc3Nlcy5hZGQocCk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlfaXRlcmF0ZVBhY2thZ2VGb3JQcm9jZXNzZXMoKE1ldGhvZFBhY2thZ2UpIGl0Lm5leHQoKSwgcHJvY2Vzc2VzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBlIGlzIGEgc3ViZWxlbWVudCBvZiBwYXJlbnQKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3ViZWxlbWVudE9mKE9iamVjdCBwYXJlbnQsIE9iamVjdCBlLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYgKHBhcmVudCA9PSBlKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihwYXJlbnQpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50ID09IGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoaXNTdWJlbGVtZW50T2YoZWxlbWVudCwgZSwgYWRhcHRlckZhY3RvcnkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNoaWxkCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3VwZXJFbGVtZW50T2YoT2JqZWN0IGNoaWxkLCBPYmplY3QgZSwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChjaGlsZCA9PSBlKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGUsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgPT0gY2hpbGQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoaXNTdXBlckVsZW1lbnRPZihjaGlsZCwgZWxlbWVudCwgYWRhcHRlckZhY3RvcnkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgdW53cmFwKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlkbyB7Ci0JCQkJb2JqID0gKChJV3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqKS5nZXRWYWx1ZSgpOwotCQkJfSB3aGlsZSAob2JqIGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENvbW1hbmRXcmFwcGVyKSB7Ci0JCQlkbyB7Ci0JCQkJb2JqID0gKChDb21tYW5kV3JhcHBlcikgb2JqKS5nZXRDb21tYW5kKCk7Ci0JCQl9IHdoaWxlIChvYmogaW5zdGFuY2VvZiBDb21tYW5kV3JhcHBlcik7Ci0JCX0KLQotCQlyZXR1cm4gb2JqOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGJvb2xlYW4gdmFsdWUgYmFzZWQgb24gd2hldGhlciBvYmplY3QgaXMgd3JhcHBlciBvYmplY3Qgb3Igbm90Ci0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXcmFwcGVkKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyIHx8IG9iaiBpbnN0YW5jZW9mIENvbW1hbmRXcmFwcGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21tYW5kIHVud3JhcChDb21tYW5kIGNtZCkgewotCQl3aGlsZSAoY21kIGluc3RhbmNlb2YgQ29tbWFuZFdyYXBwZXIpIHsKLQkJCWNtZCA9ICgoQ29tbWFuZFdyYXBwZXIpIGNtZCkuZ2V0Q29tbWFuZCgpOwotCQl9Ci0KLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIDxjb2RlPmJhc2U8L2NvZGU+IGlzIHRoZSBiYXNlIGVsZW1lbnQgb2YgYW55Ci0JICogZWxlbWVudCBpbiB0aGUgZ2l2ZW4gZWxlbWVudHMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcGFyYW0gYmFzZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCYXNlKExpc3QgZWxlbWVudHMsIE9iamVjdCBiYXNlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJaWYgKGJhc2UgPT0gKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZShPYmplY3QgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJZSA9ICgoQ29udGVudERlc2NyaXB0aW9uKSBlKS5lQ29udGFpbmVyKCk7Ci0JCX0KLQotCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJaWYgKGUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCW5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZSkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQl9Ci0KLQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIFN0clV0aWwuaXNCbGFuayhuYW1lKSkgewotCQkJbmFtZSA9ICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzIGdldE93bmluZ1Byb2Nlc3MoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyOwotCQlmb3IgKGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbAotCQkJCSYmICEoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCS5lQ29udGFpbmVyKCkpCi0JCQk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudCkgY29udGFpbmVyKS5nZXRQcm9jZXNzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUHJvY2VzcyBnZXRPd25pbmdQcm9jZXNzKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJT2JqZWN0IHRvcCA9IHdyYXBwZXIuZ2V0VG9wSXRlbSgpOwotCQlpZih0b3AgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgdG9wOwotCQkJaWYocHJvYy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJcmV0dXJuIHByb2M7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUHJvY2VzcyBnZXRPd25pbmdQcm9jZXNzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuIGdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpb2JqZWN0KTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpb2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgc291cmNlLAotCQkJTWV0aG9kRWxlbWVudCB0YXJnZXQpIHsKLQkJTWV0aG9kUGx1Z2luIHRhcmdldFBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHRhcmdldCk7Ci0JCU1ldGhvZFBsdWdpbiBzb3VyY2VQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihzb3VyY2UpOwotCQlpZiAoc291cmNlUGx1Z2luID09IHRhcmdldFBsdWdpbikKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gTWlzYy5pc0Jhc2VPZih0YXJnZXRQbHVnaW4sIHNvdXJjZVBsdWdpbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPcmRlckluZm8gZ2V0T3JkZXJJbmZvKE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIG9yZGVySW5mb05hbWUpIHsKLQkJU3RyaW5nIHN0ciA9IGUuZ2V0T3JkZXJpbmdHdWlkZSgpOwotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgcmVzID0gbmV3IFN0cmluZ1Jlc291cmNlKHN0cik7Ci0JCXRyeSB7Ci0JCQlyZXMubG9hZChudWxsKTsKLQkJCWlmIChyZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlPcmRlckluZm9Db2xsZWN0aW9uIG9yZGVySW5mb3MgPSAoT3JkZXJJbmZvQ29sbGVjdGlvbikgcmVzCi0JCQkJCS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9yZGVySW5mb3MuZ2V0T3JkZXJJbmZvcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPcmRlckluZm8gb3JkZXJJbmZvID0gKE9yZGVySW5mbykgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9yZGVySW5mb05hbWUuZXF1YWxzSWdub3JlQ2FzZShvcmRlckluZm8uZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gb3JkZXJJbmZvOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm92aWRlcgotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaENvbnRyaWJ1dG9ycyhJQ2hhbmdlTm90aWZpZXIgbm90aWZpZXIsCi0JCQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBib29sZWFuIGNvbnRlbnRSZWZyZXNoLAotCQkJYm9vbGVhbiBsYWJlbFVwZGF0ZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDb250cmlidXRvcnMoKFZhcmlhYmlsaXR5RWxlbWVudCkgbm90aWZpY2F0aW9uCi0JCQkJLmdldE5vdGlmaWVyKCkpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlub3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJZWxlbWVudCwgY29udGVudFJlZnJlc2gsIGxhYmVsVXBkYXRlKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVXNlZCB0byByZWZyZXNoIHBsdWdpbnMgdGhhdCBleHRlbmQgYW5vdGhlcgotCSAqIEBwYXJhbSBub3RpZmllcgotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKiBAcGFyYW0gY29udGVudFJlZnJlc2gKLQkgKiBAcGFyYW0gbGFiZWxVcGRhdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFBsdWdpbkV4dGVuZGVycyhJQ2hhbmdlTm90aWZpZXIgbm90aWZpZXIsCi0JCQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBib29sZWFuIGNvbnRlbnRSZWZyZXNoLAotCQkJYm9vbGVhbiBsYWJlbFVwZGF0ZSkgewotCQlPYmplY3Qgb2JqID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IEFzc29jaWF0aW9uSGVscGVyLmdldFBsdWdpbkRpcmVjdEV4dGVuc2lvbnMoCi0JCQkJCSgoTWV0aG9kUGx1Z2luKSBvYmopKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCW5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJZWxlbWVudCwgY29udGVudFJlZnJlc2gsIGxhYmVsVXBkYXRlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29udHJpYnV0b3IoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGhhc0dlbmVyYWxpemVyKGUsIENvbGxlY3Rpb25zCi0JCQkJLnNpbmdsZXRvbihWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNHZW5lcmFsaXplcihWYXJpYWJpbGl0eUVsZW1lbnQgZSwKLQkJCUNvbGxlY3Rpb24gdmFyaWFiaWxpdHlUeXBlcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGUpCi0JCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHZhcmlhYmlsaXR5VHlwZXMuY29udGFpbnMoZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBnZXRJbW1lZGlhdGVWYXJpZXRpZXMoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW0sIFZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7Ci0JCUxpc3Qgc2VsZWN0ZWRWZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYWxsVmVzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGVsZW0pOwotCQlmb3IgKGludCBpPTA7IGk8YWxsVmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBhbGxWZXMuZ2V0KGkpOwotCQkJaWYgKHR5cGUgPT0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpIHsKLQkJCQlzZWxlY3RlZFZlcy5hZGQodmUpOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiBzZWxlY3RlZFZlcy5pdGVyYXRvcigpOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBnZXRHZW5lcmFsaXplcnMoVmFyaWFiaWxpdHlFbGVtZW50IGUsCi0JCQlmaW5hbCBWYXJpYWJpbGl0eVR5cGUgdHlwZSkgewotCQlyZXR1cm4gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGUsIGZhbHNlKSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzk3ODE0NTQzOTQ0OTI5ODQ4M0w7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0KQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyYXRvcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCWlmICgodHlwZSA9PSBudWxsKSB8fCBlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IHR5cGUpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCX0KLQotCQl9OwotCX0KLQotCS8qKgotCSAqIGdldCBnZWVucmFsaXplcnMgb2YgYWxsIHR5cGVzLCByZWN1cnNpdmVseQotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgZ2V0R2VuZXJhbGl6ZXJzKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRHZW5lcmFsaXplcnMoZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBnZXRDb250cmlidXRvcnMoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldEdlbmVyYWxpemVycyhlLCBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldEFkYXB0ZXIoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCVN0cmluZ1tdIHBhdGgpIHsKLQkJSUdyb3VwQ29udGFpbmVyIGdyb3VwcyA9IChJR3JvdXBDb250YWluZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KHBsdWdpbiwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgcGF0aC5sZW5ndGggLSAxOyBpKyspIHsKLQkJCWdyb3VwcyA9IChJR3JvdXBDb250YWluZXIpIGdyb3Vwcy5nZXRHcm91cEl0ZW1Qcm92aWRlcihwYXRoW2ldKTsKLQkJCWlmIChncm91cHMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGdyb3Vwcy5nZXRHcm91cEl0ZW1Qcm92aWRlcihwYXRoW2ldKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlZnJlc2hBZGFwdGVyKE1ldGhvZFBsdWdpbiBwbHVnaW4sIFN0cmluZ1tdIHBhdGgsCi0JCQlOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJYWRhcHRlci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG1zZywgYWRhcHRlciwKLQkJCQkJdHJ1ZSwgZmFsc2UpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoQWRhcHRlcihTdHJpbmdbXSBwYXRoLCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCUVPYmplY3QgZU9iaiA9IG51bGw7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCWVPYmogPSAoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQllT2JqID0gKEVPYmplY3QpIG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0TmV3VmFsdWUoKSkuZ2V0KDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCWVPYmogPSAoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQllT2JqID0gKEVPYmplY3QpIG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0T2xkVmFsdWUoKSkuZ2V0KDApOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGVPYmogIT0gbnVsbCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVPYmopOwotCQkJVG5nVXRpbC5yZWZyZXNoQWRhcHRlcihwbHVnaW4sIHBhdGgsIG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFVuY2F0ZWdvcml6ZWRUYXNrc0l0ZW1Qcm92aWRlcigKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJLy8gcmVmcmVzaCB0aGUgdW5jYXRlZ29yaXplZCB0YXNrcyBncm91cAotCQkvLwotCi0JCXJlZnJlc2hBZGFwdGVyKHBsdWdpbiwgTGlicmFyeUVkaXRDb25zdGFudHMuVU5DQVRFR09SSVpFRF9UQVNLU19QQVRILAotCQkJCW1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hEb21haW5VbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyKAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiwgTm90aWZpY2F0aW9uIG1zZykgewotCQlyZWZyZXNoQWRhcHRlcihwbHVnaW4sCi0JCQkJTGlicmFyeUVkaXRDb25zdGFudHMuVU5DQVRFR09SSVpFRF9ET01BSU5fV09SS1BST0RVQ1RTX1BBVEgsCi0JCQkJbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFdvcmtQcm9kdWN0VHlwZVVuY2F0ZWdvcml6ZWQoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCU5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJcmVmcmVzaEFkYXB0ZXIoCi0JCQkJcGx1Z2luLAotCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLlVOQ0FURUdPUklaRURfV09SS1BST0RVQ1RUWVBFX1dPUktQUk9EVUNUU19QQVRILAotCQkJCW1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVycygKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJcmVmcmVzaERvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXIocGx1Z2luLCBtc2cpOwotCQlyZWZyZXNoV29ya1Byb2R1Y3RUeXBlVW5jYXRlZ29yaXplZChwbHVnaW4sIG1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hVbmNhdGVnb3JpemVkUm9sZXNJdGVtUHJvdmlkZXIoCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luLCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXJlZnJlc2hBZGFwdGVyKHBsdWdpbiwgTGlicmFyeUVkaXRDb25zdGFudHMuVU5DQVRFR09SSVpFRF9ST0xFU19QQVRILAotCQkJCW1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hVbmNhdGVnb3JpemVkVG9vbE1lbnRvcnNJdGVtUHJvdmlkZXIoCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luLCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXJlZnJlc2hBZGFwdGVyKHBsdWdpbiwKLQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5VTkNBVEVHT1JJWkVEX1RPT0xNRU5UT1JTX1BBVEgsIG1zZyk7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVXcmFwcGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoRmVhdHVyZU1hcFV0aWwuaXNGZWF0dXJlTWFwKGZlYXR1cmUpKSB7Ci0JCQl2YWx1ZSA9IG5ldyBGZWF0dXJlTWFwRW50cnlXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCQkoRmVhdHVyZU1hcC5FbnRyeSkgdmFsdWUsIG9iamVjdCwgKEVBdHRyaWJ1dGUpIGZlYXR1cmUsCi0JCQkJCWluZGV4LCBhZGFwdGVyRmFjdG9yeSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKLQkJCXZhbHVlID0gbmV3IEF0dHJpYnV0ZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcih2YWx1ZSwgb2JqZWN0LAotCQkJCQkoRUF0dHJpYnV0ZSkgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5LCBudWxsKTsKLQkJfSBlbHNlIGlmICghKChFUmVmZXJlbmNlKSBmZWF0dXJlKS5pc0NvbnRhaW5tZW50KCkpIHsKLQkJCXZhbHVlID0gbmV3IEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIoZmVhdHVyZSwgdmFsdWUsIG9iamVjdCwKLQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE5hdmlnYXRvclBhcmVudEl0ZW1Qcm92aWRlcihHdWlkYW5jZSBndWlkYW5jZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IGd1aWRhbmNlLmVDb250YWluZXIoKTsKLQkJaWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGNvbnRhaW5lciwgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gaXRlbVByb3ZpZGVyICE9IG51bGwgPyBpdGVtUHJvdmlkZXIuZ2V0R3VpZGFuY2VzKCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE5hdmlnYXRvclBhcmVudEl0ZW1Qcm92aWRlcihXb3JrUHJvZHVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBjb250ZW50UGtnID0gb2JqZWN0LmVDb250YWluZXIoKTsKLQkJaWYgKGNvbnRlbnRQa2cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihjb250ZW50UGtnLCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBpdGVtUHJvdmlkZXIgIT0gbnVsbCA/IGl0ZW1Qcm92aWRlci5nZXRXb3JrUHJvZHVjdHMoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBudWxsOwotCQl0cnkgewotCQkJYWRhcHRlciA9IHVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUl0ZW1MYWJlbFByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuICgoSUl0ZW1MYWJlbFByb3ZpZGVyKSBhZGFwdGVyKS5nZXRJbWFnZShvYmplY3QpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYoYWRhcHRlciAhPSBvYmplY3QgJiYgYWRhcHRlciBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCQkJKChJRGlzcG9zYWJsZSlhZGFwdGVyKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGNvbE5hbWUpIHsKLQkJLy8gaWYoY29sTmFtZSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUpCi0JCS8vIGlmKGNvbE5hbWUgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKQotCQlpZiAoY29sTmFtZSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlyZXR1cm4gZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGVsZW1lbnQgdXAgd2l0aGluZyB0aGUgcGFyZW50Ci0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGVsZW1lbnRPYmoKLQkgKiBAcGFyYW0gZUNsYXNzZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1vdmVVcChBY3Rpdml0eSBhY3Rpdml0eSwgT2JqZWN0IGVsZW1lbnRPYmosCi0JCQlDb2xsZWN0aW9uIGVDbGFzc2VzLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJTW92ZVVwQ29tbWFuZCBjbWQgPSBuZXcgTW92ZVVwQ29tbWFuZChhY3Rpdml0eSwgZWxlbWVudE9iaiwgZUNsYXNzZXMpOwotCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudCBkb3duIHdpdGhpbiB0aGUgcGFyZW50Ci0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGVsZW1lbnRPYmoKLQkgKiBAcGFyYW0gZUNsYXNzZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1vdmVEb3duKEFjdGl2aXR5IGFjdGl2aXR5LCBPYmplY3QgZWxlbWVudE9iaiwKLQkJCUNvbGxlY3Rpb24gZUNsYXNzZXMsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlNb3ZlRG93bkNvbW1hbmQgY21kID0gbmV3IE1vdmVEb3duQ29tbWFuZChhY3Rpdml0eSwgZWxlbWVudE9iaiwKLQkJCQllQ2xhc3Nlcyk7Ci0JCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDdXN0b21DYXRlZ29yeSBjcmVhdGVSb290Q3VzdG9tQ2F0ZWdvcnkoCi0JCQlDb250ZW50UGFja2FnZSBjdXN0b21DYXRlZ29yeVBrZykgewotCQkvLyBjcmVhdGUgcm9vdCBjdXN0b20gY2F0ZWdvcnkKLQkJLy8KLQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdEN1c3RvbUNhdGVnb3J5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKTsKLQkJcm9vdEN1c3RvbUNhdGVnb3J5LnNldE5hbWUoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJQ29udGVudFBhY2thZ2UgaGlkZGVuUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoY3VzdG9tQ2F0ZWdvcnlQa2cKLQkJCQkuZ2V0Q2hpbGRQYWNrYWdlcygpLCBNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FKTsKLQkJaWYgKGhpZGRlblBrZyA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgaGlkZGVuIHBhY2thZ2UgdG8gc3RvcmUgdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3J5Ci0JCQkvLwotCQkJaGlkZGVuUGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKTsKLQkJCWhpZGRlblBrZy5zZXROYW1lKE1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUpOwotCQkJY3VzdG9tQ2F0ZWdvcnlQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChoaWRkZW5Qa2cpOwotCQl9Ci0JCWhpZGRlblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQocm9vdEN1c3RvbUNhdGVnb3J5KTsKLQotCQlyZXR1cm4gcm9vdEN1c3RvbUNhdGVnb3J5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ3VzdG9tQ2F0ZWdvcnkgZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJQ29udGVudFBhY2thZ2UgY3VzdG9tQ2F0ZWdvcnlQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCQlpZiAoY3VzdG9tQ2F0ZWdvcnlQa2cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZSBoaWRkZW5Qa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShjdXN0b21DYXRlZ29yeVBrZwotCQkJCS5nZXRDaGlsZFBhY2thZ2VzKCksIE1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUpOwotCQlpZiAoaGlkZGVuUGtnICE9IG51bGwgJiYgIWhpZGRlblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiAoQ3VzdG9tQ2F0ZWdvcnkpIGhpZGRlblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5nZXQoMCk7Ci0JCX0KLQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdCA9IGNyZWF0ZVJvb3RDdXN0b21DYXRlZ29yeShjdXN0b21DYXRlZ29yeVBrZyk7Ci0JCS8vIGNvZGUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IGFkZCBhbGwgdGhlIGN1c3RvbSBjYXRlZ29yaWVzIHVuZGVyCi0JCS8vIGN1c3RvbUNhdGVnb3J5UGtnCi0JCS8vIHRvIHRoZSBjb250ZW50IGVsZW1lbnQgcmVmZXJlbmNlIGxpc3Qgb2YgdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3J5IHNvCi0JCS8vIHRoZXkgY2FuIGJlIHZpc2libGUKLQkJLy8gaW4gdGhlIG5ldyBVSQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjdXN0b21DYXRlZ29yeVBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJcm9vdC5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByb290OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Jvb3RDdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeSBjYXRlZ29yeSkgewotCQlFT2JqZWN0IHBrZyA9IGNhdGVnb3J5LmVDb250YWluZXIoKTsKLQkJaWYgKHBrZyBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJJiYgTW9kZWxTdHJ1Y3R1cmUuSElEREVOX1BBQ0tBR0VfTkFNRQotCQkJCQkJLmVxdWFscygoKENvbnRlbnRQYWNrYWdlKSBwa2cpLmdldE5hbWUoKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSb290Q3V0b21DYXRlZ29yeVBhY2thZ2UoTWV0aG9kUGFja2FnZSBwa2cpIHsKLQkJaWYgKCAhKHBrZyBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB8fAotCQkJCSFNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FCi0JCQkJCQkuZXF1YWxzKHBrZy5nZXROYW1lKCkpICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkvLyBjaGVjayB0aGUgcGx1Z2luIGFuZCBtYWtlIHN1cmUgaXQncyB0aGUgb2JqZWN0LCBUT0RPCi0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZXMgcmVzb3VyY2Ugb2YgdGhlIGdpdmVuIGVsZW1lbnQncyBjb250YWluZXIgaWYgdGhpcyBoYXMgYmVlbiBtb2RpZmllZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVDb250YWluZXJSZXNvdXJjZShFT2JqZWN0IGVsZW1lbnQsCi0JCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIpIHsKLQkJLy8gc2F2ZSBjb250YWluZXIncyByZXNvdXJjZQotCQlpZiAoZWxlbWVudC5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50LmVDb250YWluZXIoKS5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmlzTW9kaWZpZWQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50Q2F0ZWdvcnkgZmluZENvbnRyaWJ1dG9yKENvbnRlbnRQYWNrYWdlIGNhdGVnb3J5UGtnLAotCQkJQ29udGVudENhdGVnb3J5IGJhc2VDYXRlZ29yeSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjYXRlZ29yeVBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYXQgPSAoQ29udGVudENhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChjYXQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IGJhc2VDYXRlZ29yeSkgewotCQkJCXJldHVybiBjYXQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW1wdHkoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCWlmICghY2F0ZWdvcnkuZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKS5pc0VtcHR5KCkKLQkJCQl8fCAhY2F0ZWdvcnkuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoY2F0ZWdvcnkgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQlyZXR1cm4gKChEaXNjaXBsaW5lKSBjYXRlZ29yeSkuZ2V0VGFza3MoKS5pc0VtcHR5KCk7Ci0JCX0gZWxzZSBpZiAoY2F0ZWdvcnkgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCXJldHVybiAoKERvbWFpbikgY2F0ZWdvcnkpLmdldFdvcmtQcm9kdWN0cygpLmlzRW1wdHkoKTsKLQkJfSBlbHNlIGlmIChjYXRlZ29yeSBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCXJldHVybiAoKFJvbGVTZXQpIGNhdGVnb3J5KS5nZXRSb2xlcygpLmlzRW1wdHkoKTsKLQkJfSBlbHNlIGlmIChjYXRlZ29yeSBpbnN0YW5jZW9mIFRvb2wpIHsKLQkJCXJldHVybiAoKFRvb2wpIGNhdGVnb3J5KS5nZXRUb29sTWVudG9ycygpLmlzRW1wdHkoKTsKLQkJfSBlbHNlIGlmIChjYXRlZ29yeSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkgewotCQkJcmV0dXJuICgoV29ya1Byb2R1Y3RUeXBlKSBjYXRlZ29yeSkuZ2V0V29ya1Byb2R1Y3RzKCkuaXNFbXB0eSgpOwotCQl9IGVsc2UgaWYgKGNhdGVnb3J5IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCUN1c3RvbUNhdGVnb3J5IHVzZXJEZWZpbmVkQ2F0ZWdvcnkgPSAoKEN1c3RvbUNhdGVnb3J5KSBjYXRlZ29yeSk7Ci0JCQlyZXR1cm4gdXNlckRlZmluZWRDYXRlZ29yeS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaXNFbXB0eSgpCi0JCQkvLyAmJiB1c2VyRGVmaW5lZENhdGVnb3J5LmdldFN1YkNhdGVnb3JpZXMoKS5pc0VtcHR5KCkKLQkJCTsKLQkJfQotCi0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gY2F0ZWdvcnk6ICIgKyBjYXRlZ29yeSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb3JkZXIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRvUGFja2FnZShXb3JrT3JkZXIgb3JkZXIsIEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOwotCQlpZihjb250YWluZXIgIT0gbnVsbCkgewotCQkJKChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyKS5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQob3JkZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9yZGVyCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVGcm9tUGFja2FnZShXb3JrT3JkZXIgb3JkZXIsIEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQkoKFByb2Nlc3NQYWNrYWdlKSBlLmVDb250YWluZXIoKSkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlKG9yZGVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFuZGxlUHJlZGVjZXNzb3JMaXN0Q2hhbmdlKAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyLCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0xJTktfVE9fUFJFREVDRVNTT1I6Ci0JCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCWFkZFRvUGFja2FnZSgoV29ya09yZGVyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSwKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24KLQkJCQkJCQkuZ2V0TmV3VmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlhZGRUb1BhY2thZ2UoKFdvcmtPcmRlcikgaXRlci5uZXh0KCksCi0JCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlyZW1vdmVGcm9tUGFja2FnZSgoV29ya09yZGVyKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSwKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24KLQkJCQkJCQkuZ2V0T2xkVmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlyZW1vdmVGcm9tUGFja2FnZSgoV29ya09yZGVyKSBpdGVyLm5leHQoKSwKLQkJCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCX0KLQotCQkJCWFkYXB0ZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIGFsbCB0aGUgZ2xvYmFsIHBhY2thZ2VzIGZvciB0aGUgbWV0aG9kIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgZ2xvYmFsIHBhY2thZ2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEdsb2JhbFBhY2thZ2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJQXJyYXlMaXN0IHBhY2thZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdbXVtdIGNhdGVnb3J5UGF0aHMgPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmdldENhdGVnb3J5UGF0aHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yeVBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmdbXSBwYXRoID0gY2F0ZWdvcnlQYXRoc1tpXTsKLQkJCUNvbnRlbnRQYWNrYWdlIGNhdGVnb3J5UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQlwYXRoKTsKLQkJCWlmIChjYXRlZ29yeVBrZyAhPSBudWxsKSB7Ci0JCQkJcGFja2FnZXMuYWRkKGNhdGVnb3J5UGtnKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwYWNrYWdlczsKLQl9Ci0KLQkKLQkvKioKLQkgKiByZXR1cm4gYWxsIHRoZSBjb250ZW50IGNhdGVnb3J5IHBhY2thZ2VzIGZvciB0aGUgbWV0aG9kIHBsdWdpbi4gCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgTWV0aG9kUGx1Z2luCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBnbG9iYWwgcGFja2FnZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlyZXR1cm4gZ2V0R2xvYmFsUGFja2FnZXMocGx1Z2luKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogcmV0dXJuIGFsbCB0aGUgc3lzdGVtIGRlZmluZWQgcGFja2FnZXMgZm9yIHRoZSBtZXRob2QgcGx1Z2luCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgTWV0aG9kUGx1Z2luCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBhbGwgc3lzdGVtIHBhY2thZ2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFN5c3RlbVBhY2thZ2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJQXJyYXlMaXN0IHBhY2thZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdbXVtdIHBhdGhzID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5nZXRBbGxTeXN0ZW1QYXRocygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmdbXSBwYXRoID0gcGF0aHNbaV07Ci0JCQlNZXRob2RQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLCBwYXRoKTsKLQkJCWlmIChwa2cgIT0gbnVsbCAmJiAhcGFja2FnZXMuY29udGFpbnMocGtnKSkgewotCQkJCXBhY2thZ2VzLmFkZChwa2cpOwotCQkJCUVPYmplY3QgbyA9IHBrZy5lQ29udGFpbmVyKCk7Ci0JCQkJd2hpbGUgKChvIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgJiYgIXBhY2thZ2VzLmNvbnRhaW5zKG8pKSB7Ci0JCQkJCXBhY2thZ2VzLmFkZChvKTsKLQkJCQkJbyA9IG8uZUNvbnRhaW5lcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGFsc28gYWRkIHRoZSBoaWRkZW4gY29zdG9tIGNhdGVnb3J5IHBhY2thZ2UKLQkJQ29udGVudFBhY2thZ2UgY3VzdG9tQ2F0ZWdvcnlQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCQlpZiAoY3VzdG9tQ2F0ZWdvcnlQa2cgIT0gbnVsbCkgewotCQkJQ29udGVudFBhY2thZ2UgaGlkZGVuUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoCi0JCQkJCWN1c3RvbUNhdGVnb3J5UGtnLmdldENoaWxkUGFja2FnZXMoKSwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuSElEREVOX1BBQ0tBR0VfTkFNRSk7Ci0JCQlpZiAoaGlkZGVuUGtnICE9IG51bGwpIHsKLQkJCQlwYWNrYWdlcy5hZGQoaGlkZGVuUGtnKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwYWNrYWdlczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcmVkZWZpbmVkKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5Ci0JCQkJJiYgaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBlKSkKLQkJCXJldHVybiB0cnVlOwotCQlTdHJpbmcgcGF0aCA9IE1vZGVsU3RydWN0dXJlCi0JCQkJLnRvRmlsZVBhdGgoTWlzYy5nZXRQYXRoUmVsYXRpdmVUb1BsdWdpbihlKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IE1vZGVsU3RydWN0dXJlLkFMTF9QUkVERUZJTkVEX1BBVEhTLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHByZWRlZmluZVBhdGggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCWlmIChwcmVkZWZpbmVQYXRoLnN0YXJ0c1dpdGgocGF0aCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd3JhcHBlciBmb3IgdGhlIGdpdmVuIHZhbHVlIGluIHRoZSBnaXZlbiB3cmFwcGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcnMKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0V3JhcHBlcihDb2xsZWN0aW9uIHdyYXBwZXJzLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHdyYXBwZXJzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3JhcHBlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKElXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVyLm5leHQoKTsKLQkJCWlmICh3cmFwcGVyLmdldFZhbHVlKCkgPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gd3JhcHBlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBhY2thZ2UgZ2V0TWV0aG9kUGFja2FnZShFT2JqZWN0IGUpIHsKLQkJZm9yICg7ICEoZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpICYmIGUgIT0gbnVsbDsgZSA9IGUuZUNvbnRhaW5lcigpKQotCQkJOwotCQlyZXR1cm4gKE1ldGhvZFBhY2thZ2UpIGU7Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYnkgZm9yY2luZyB0byBzZWxlY3QgdGhlIGdsb2JhbCBwYWNrYWdlcyBvZgotCSAqIHRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Z2lucywgdGhpcyBpcyBuZWVkZWQgZm9yIGNvbmZpZ3VyYXRpb24gZXhwb3J0aW5nLgotCSAqIElmIGdsb2JhbCBwYWNrYWdlcyBhcmUgbWlzc2luZywgdGhlIGV4cG9ydGVkIGNvbmZpZ3VyYXRpb24gaXMgbm90IHZhbGlkCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCBwbHVnaW5zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQlMaXN0IHBrZ1NlbHMgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCi0JCS8vIG1ha2Ugc3VyZSBhbGwgcmVxdWlyZWQgcGFja2FnZXMgYXJlIHNlbGVjdGVkLgotCQkvLyBpZiBhIHBhY2thZ2UgaXMgc2VsZWN0ZWQsIGFsbCB0aGUgcGFyZW50IHBhY2thZ2VzIG11c3QgYmUgc2VsZWN0ZWQuCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gbmV3IEFycmF5TGlzdChwa2dTZWxzKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSlpdC5uZXh0KCk7Ci0JCQlFT2JqZWN0IGMgPSBwa2cuZUNvbnRhaW5lcigpOwotCQkJd2hpbGUgKCAoKGMgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB8fCAoYyBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIAotCQkJCQkmJiAhcGtnU2Vscy5jb250YWlucyhjKSAmJiAhcGx1Z2lucy5jb250YWlucyhjKSApIHsKLQkJCQlpZiAoYyBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlwbHVnaW5zLmFkZChjKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwa2dTZWxzLmFkZChjKTsKLQkJCQl9Ci0JCQkJCi0JCQkJYyA9IGMuZUNvbnRhaW5lcigpOwotCQkJfQkKLQkJfQotCQkKLQkJLy8gbWFrZSBzdXJlIGFsbCBzeXN0ZW0gcGFja2FnZXMgYXJlIHNlbGVjdGVkCi0JCWZvciAoSXRlcmF0b3IgaXRwID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0cC5uZXh0KCk7Ci0JCQlMaXN0IHBrZ3MgPSBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHBsdWdpbik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHBrZyA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoIXBrZ1NlbHMuY29udGFpbnMocGtnKSkgewotCQkJCQlwa2dTZWxzLmFkZChwa2cpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBvYmplY3QncyBtZXRob2QgcGFja2FnZSBhbmQgcGx1Z2luIHRvIHRoZSBnaXZlbgotCSAqIGNvbmZpZ3VyYXRpb24gaWYgdGhleSBhcmUgbm90IGluIHRoZSBjb25maWd1cmF0aW9uIHlldC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUbyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgRU9iamVjdCBvYmplY3QsCi0JCQlTZXQgYWRkZWRPYmplY3RzKSB7Ci0JCU1ldGhvZFBhY2thZ2UgcGtnID0gZ2V0TWV0aG9kUGFja2FnZShvYmplY3QpOwotCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCWlmICghY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhwa2cpKSB7Ci0JCQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJCQlhZGRlZE9iamVjdHMuYWRkKHBrZyk7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBrZyk7Ci0JCQkJCi0JCQkJLy8gMTUwNTUyIC0gUHJvY2Vzc2VzOiBJZiBjb25maWd1cmF0aW9uIGlzIHVwZGF0ZWQgYnkgaXRzZWxmIGR1ZSB0byBhY3Rpb25zIGxpa2UgQ1AgZXh0ZW5kaWluZyBvciBkZWVwIGNvcHksIAotCQkJCS8vIHRoZXJlIGlzIGEgcmVmcmVzaCBpc3N1ZS4KLQkJCQkvLyBtaXNzaW5nIHRoZSAiISIgaGVyZSEKLQkJCQlpZiAoIWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jb250YWlucyhwbHVnaW4pKSB7Ci0JCQkJCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJCQkJYWRkZWRPYmplY3RzLmFkZChwbHVnaW4pOwotCQkJCQotCQkJCQkvLyBuZWVkIHRvIHZhbGlkYXRlIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiB0byBtYWtlIHN1cmUgYWxsIHJlbGF0ZWQgc3lzdGVtIHBhY2thZ2VzIGFyZSBzZWxlY3RlZC4KLQkJCQkJLy8gb3RoZXJ3aXNlIHRoZSBjb25maWd1cmF0aW9uIGV4cGxvcmVyIHdpbGwgbm90IHdvcmsKLQkJCQkJLy8gMTUwNTUyIC0gUHJvY2Vzc2VzOiBJZiBjb25maWd1cmF0aW9uIGlzIHVwZGF0ZWQgYnkgaXRzZWxmIGR1ZSB0byBhY3Rpb25zIGxpa2UgQ1AgZXh0ZW5kaWluZyBvciBkZWVwIGNvcHksIHRoZXJlIGlzIGEgcmVmcmVzaCBpc3N1ZS4JCQotCQkJCQl2YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUb0NvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlFT2JqZWN0IG9iamVjdCwgU2V0IGFkZGVkT2JqZWN0cykgewotCQlpbnQgc2l6ZSA9IGFkZGVkT2JqZWN0cy5zaXplKCk7Ci0JCWFkZFRvKGNvbmZpZywgb2JqZWN0LCBhZGRlZE9iamVjdHMpOwotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCS8vIGFkZCBhbGwgdGhlIGJhc2UgZWxlbWVudHMgaWYgdGhlcmUgaXMgYW55Ci0JCQlmb3IgKFZhcmlhYmlsaXR5RWxlbWVudCBjID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCkKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsgYyAhPSBudWxsOyBjID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgYwotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQkJYWRkVG8oY29uZmlnLCBjLCBhZGRlZE9iamVjdHMpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGFkZGVkT2JqZWN0cy5zaXplKCkgPiBzaXplOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlT2JqCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDwvY29kZT4gdGhhdCBpcyB0byBiZQotCSAqICAgICAgICAgICAgdXNlZCB0byBwYXJlbnQgYW55IGRpYWxvZ3Mgd2l0aCB0aGUgdXNlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIFVJIGNvbnRleHQgKGRlY2xhcmVkIGFzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4KLQkgKiAgICAgICAgICAgIHRvIGF2b2lkIGFueSBkaXJlY3QgcmVmZXJlbmNlcyBvbiB0aGUgU1dUIGNvbXBvbmVudCkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrRWRpdChFT2JqZWN0IGVPYmosIE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmICgoKEludGVybmFsRU9iamVjdCkgZU9iaikuZVByb3h5VVJJKCkgIT0gbnVsbCkgewotCQkJLy8gdGhpcyBpcyBhIHVucmVzb2x2ZWQgcHJveHksIGRpc2FsbG93IGVkaXRpbmcgaXQKLQkJCS8vCi0JCQlFT2JqZWN0IHByb3h5ID0gZU9iajsKLQkJCVN0cmluZyB1cmkgPSAoKEludGVybmFsRU9iamVjdCkgcHJveHkpLmVQcm94eVVSSSgpLnRvU3RyaW5nKCk7Ci0JCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIGNvbnRhaW5lclVSSSA9IHByb3h5LmVDb250YWluZXIoKSAhPSBudWxsID8gcHJveHkKLQkJCQkJLmVDb250YWluZXIoKS5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQk6IG51bGw7Ci0JCQlTdHJpbmcgbG9jYXRpb247Ci0JCQlpZiAoY29udGFpbmVyVVJJICE9IG51bGwpIHsKLQkJCQlsb2NhdGlvbiA9IGNvbnRhaW5lclVSSSAhPSBudWxsICYmIGNvbnRhaW5lclVSSS5pc0ZpbGUoKSA/IGNvbnRhaW5lclVSSS50b0ZpbGVTdHJpbmcoKQotCQkJCQkJOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChsb2NhdGlvbi5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCWxvY2F0aW9uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJIiBpbiAnJ3swfScnIiwgbmV3IE9iamVjdFtdIHsgbG9jYXRpb24gfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWxvY2F0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChMaWJyYXJ5RWRpdFJlc291cmNlcy51bnJlc29sdmVkT2JqZWN0RXJyb3JfcmVhc29uCi0JCQkJCSwgbmV3IE9iamVjdFtdIHsgcHJveHkuZUNsYXNzKCkuZ2V0TmFtZSgpLCB1cmksIGxvY2F0aW9uIH0pOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLCAwLCBtc2csIG51bGwpOwotCQl9Ci0vLwkJaWYgKGVPYmouZVJlc291cmNlKCkgPT0gbnVsbCkgewotLy8JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotLy8JCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5PSywgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0vLwkJfQotLy8JCVN0cmluZyBwYXRoID0gZU9iai5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLS8vCQlyZXR1cm4gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5nZXRGaWxlTWFuYWdlcigpLmNoZWNrTW9kaWZ5KHBhdGgsCi0vLwkJCQljb250ZXh0KTsKLQkJCi0JCUlBY2Nlc3NDb250cm9sbGVyIGFjID0gU2VydmljZXMuZ2V0QWNjZXNzQ29udHJvbGxlcigpOwotCQlpZihhYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlyZXR1cm4gYWMuY2hlY2tNb2RpZnkoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChlT2JqKSwgY29udGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIHRoZSBnaXZlbiBlbGVtZW50IGZvciBtb2RpZmlhYmxlCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAdGhyb3dzIE1lc3NhZ2VFeGNlcHRpb24gaWYgdGhlIGVsZW1lbnQgY2Fubm90IGJlIG1vZGlmaWVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrTW9kaWZ5KEVPYmplY3QgZSkgewotCQlJQWNjZXNzQ29udHJvbGxlciBhYyA9IFNlcnZpY2VzLmdldEFjY2Vzc0NvbnRyb2xsZXIoKTsKLQkJaWYoYWMgIT0gbnVsbCkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBhYy5jaGVja01vZGlmeShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGUpLCBudWxsKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCVN0cmluZyBtc2cgPSBVbWFVdGlsLmdldE1lc3NhZ2Uoc3RhdHVzKTsKLQkJCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQkJT2JqZWN0IG9iajsKLQkJCQkJaWYoZS5lUmVzb3VyY2UoKS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJCQkJb2JqID0gZS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW9iaiA9IGU7IAotCQkJCQl9Ci0JCQkJCW1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFVtYVJlc291cmNlcy5lcnJfY2Fubm90TW9kaWZ5MCwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBvYmogfSk7Ci0JCQkJfQotCQkJCXRocm93IG5ldyBNZXNzYWdlRXhjZXB0aW9uKG1zZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKElTdGF0dXMgc3RhdHVzKSB7Ci0JCVN0cmluZyBtc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQlpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobXNnKTsKLQkJCUlTdGF0dXMgc3RhdHVzZXNbXSA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXNlcy5sZW5ndGg7IGkrKykgewotCQkJCXN0ckJ1Zi5hcHBlbmQoJ1xuJykuYXBwZW5kKHN0YXR1c2VzW2ldLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQltc2cgPSBzdHJCdWYudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAobXNnID09IG51bGwgfHwgbXNnLmxlbmd0aCgpID09IDApIHsKLQkJCW1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfdG5ndXRpbF9jYW5ub3RfZWRpdF9yZXNvdXJjZTsgCi0JCX0KLQkJcmV0dXJuIG1zZzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250cmlidXRvcihWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkmJiAoZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcihWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCXJldHVybiBiYXNlICE9IG51bGwgJiYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwgfHwgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzR2VuZXJhbGl6ZXIoT2JqZWN0IG9iaiwgQ29sbGVjdGlvbiB0eXBlcykgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmo7Ci0JCWlmICh2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHR5cGVzID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHR5cGVzLmNvbnRhaW5zKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlVGV4dChTdHJpbmcgdHlwZUtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVLZXkgKyAiX3R5cGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVW5rbm93bl90eXBlIik7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSB1c2VyIGZyaWVuZGx5IHR5cGUgbmFtZSBmb3IgYSBNZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlVGV4dChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldFR5cGVUZXh0KGVsZW1lbnQuZUNsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBMb29rcyB1cCB0aGUgdXNlci1mcmllbmRseSB0eXBlIG5hbWUgZm9yIGEgZ2l2ZW4gdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlVGV4dChFQ2xhc3MgdHlwZSkgewotCQlyZXR1cm4gZ2V0VHlwZVRleHQodHlwZS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbG9va3MgdXAgdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBmZWF0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZlYXR1cmVUZXh0KE9iamVjdCBmZWF0dXJlKSB7Ci0JCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCQlyZXR1cm4gZ2V0RmVhdHVyZVRleHQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIlVua25vd24iOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBsb2NrZWQuIEFuIG9iamVjdCBpcyBjb25zaWRlcmVkIGxvY2tlZCBpZgotCSAqIGl0cyBNZXRob2RQbHVnaW4gaGFzIHRoZSBhdHRyaWJ1dGUgdXNlckNoYW5nZWFibGUgc2V0IHRvIGZhbHNlLiBUaGUKLQkgKiAnbG9ja2VkJyBzdGF0dXMgb2YgYW4gb2JqZWN0IGlzIGluZGVwZW5kZW50IGZyb20gJ3JlYWQtb25seScgc3RhdHVzIG9mCi0JICogaXRzIHJlc291cmNlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NrZWQoRU9iamVjdCBvYmplY3QpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKG9iamVjdCk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICFwbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tFeGlzdChDb2xsZWN0aW9uIHdyYXBwZXJzLCBPYmplY3QgZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd3JhcHBlcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSB1bndyYXAoaXRlcmF0b3IubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50ID09IGUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGluZGV4IG9mIGVsZW1lbnQgb3IgaXRzIHdyYXBwZXIgaW4gdGhlIGdpdmVuIGxpc3QKLQkgKiBAcGFyYW0gbGlzdCBhIG1peGVkIGxpc3Qgb2YgZWxlbWVudCBhbmQgd3JhcHBlcgotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiAtMSBpZiB0aGUgZWxlbWVudCBvciBpdHMgd3JhcHBlciBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIGxpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRJbmRleE9mKExpc3QgbGlzdCwgT2JqZWN0IGUpIHsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gdW53cmFwKGxpc3QuZ2V0KGkpKTsKLQkJCWlmKGVsZW1lbnQgPT0gZSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDb250YWluaW5nRmVhdHVyZShPYmplY3Qgb2JqZWN0LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmICghKHBhcmVudCBpbnN0YW5jZW9mIEVPYmplY3QpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwYXJlbnQsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyKSB7Ci0JCQlFT2JqZWN0IHBhcmVudEVPYmogPSAoRU9iamVjdCkgcGFyZW50OwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyKSBhZGFwdGVyKQotCQkJCQkuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhwYXJlbnQpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGYuaXNNYW55KCkpIHsKLQkJCQkJaWYgKCgoQ29sbGVjdGlvbikgcGFyZW50RU9iai5lR2V0KGYpKS5jb250YWlucyhvYmplY3QpKSB7Ci0JCQkJCQlyZXR1cm4gZjsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChwYXJlbnRFT2JqLmVHZXQoZikgPT0gb2JqZWN0KSB7Ci0JCQkJCQlyZXR1cm4gZjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIHVzZXItZnJpZW5kbHkgbmFtZSBmb3IgYSBnaXZlbiBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZlYXR1cmVUZXh0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkgewotCQkvLyBjYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkvLyByZXR1cm4gIlByaW1hcnkgUGVyZm9ybWVyIjsKLQkJLy8gY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJLy8gcmV0dXJuICJTZWNvbmRhcnkgUGVyZm9ybWVyIjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuYXNzaXN0c190ZXh0OyAKLQkJfQotCi0JCVN0cmluZyBmZWF0dXJlS2V5OwotCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZTsKLQkJCWZlYXR1cmVLZXkgPSBlRmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIl8iICsgZUZlYXR1cmUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlmZWF0dXJlS2V5ID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudW5rbm93bl90ZXh0OyAKLQkJfQotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRTdHJpbmcoIl9VSV8iICsgZmVhdHVyZUtleSArICJfZmVhdHVyZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxpYnJhcnkgcm9vdCBwYXRoIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCwgYXNzdW1pbmcgdGhlIGVsZW1lbnQgYW5kCi0JICogaXQncyBwYXJlbnRzIGFyZSBsb2FkZWQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gRmlsZSB0aGUgcm9vdCBwYXRoIG9mIHRoZSBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldExpYnJhcnlSb290UGF0aChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJRU9iamVjdCBwYXJlbnQgPSBlbGVtZW50OwotCQl3aGlsZSAoKHBhcmVudCAhPSBudWxsKSAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpKSB7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIHVyaSA9IHBhcmVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJCVN0cmluZyBwYXRoID0gdXJpLnRvRmlsZVN0cmluZygpOwotCQkJRmlsZSBmID0gbmV3IEZpbGUocGF0aCk7Ci0JCQlyZXR1cm4gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBmdWxsIHBhdGggVVJJIGJ5IGFwcGVuZGluZyB0aGUgcmVsYXRpdmUgcGF0aCBVUkkgdG8gdGhlIG9iamVjdCdzCi0JICogbGlicmFyeSBwYXRoCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiAgICAgICAgICAgIEVPYmplY3QgdGhlIG9iamVjdCB0byBmaW5kIHRoZSBNZXRob2RMaWJyYXJ5LCBjYW4gYmUgYW55Ci0JICogICAgICAgICAgICBvYmplY3QgaW4gdGhlIGxpYnJhcnkKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgdXJpIHRvIGJlIGZpeGVkCi0JICogQHJldHVybiBVUkkgdGhlIGZ1bGwgcGF0aCB1cmkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRGdWxsUGF0aFVSSShFT2JqZWN0IG8sIFVSSSB1cmkpIHsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdXJpOwotCQl9Ci0KLQkJLy8gdHJ5IGlmIHRoaXMgaXMgYSB2YWxpZCBVUkwgb3Igbm90Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gdXJpLnRvVVJMKCk7Ci0JCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdXJpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCTsgLy8gbm90IGEgdmFsaWQgdXJsLCBtYXliZSBhIHJlbGF0aXZlIHBhdGgKLQkJfQotCi0JCS8vIG5lZWQgdG8gZ2V0IHRoZSBlbGVtZW50J3MgcmVzb3VyY2UgcGF0aAotCQlGaWxlIGYgPSBnZXRMaWJyYXJ5Um9vdFBhdGgobyk7Ci0JCWlmIChmICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgRmlsZShmLCBOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHVyaS50b1N0cmluZygpKSkudG9VUkkoKTsKLQkJfQotCi0JCXJldHVybiB1cmk7Ci0JfQotCi0JCi0JLyoqCi0JICogVG8gZ2V0IHRoZSBub2RlIGljb24vc2hhcGUgaWNvbiBmdWxsIHBhdGggVVJJIGJ5IGFwcGVuZGluZyB0aGUgcmVsYXRpdmUgcGF0aCBVUkkgdG8gdGhlIG9iamVjdCdzCi0JICogbGlicmFyeSBwYXRoCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiAgICAgICAgICAgIEVPYmplY3QgdGhlIG9iamVjdCB0byBmaW5kIHRoZSBNZXRob2RMaWJyYXJ5LCBjYW4gYmUgYW55Ci0JICogICAgICAgICAgICBvYmplY3QgaW4gdGhlIGxpYnJhcnkKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgdXJpIHRvIGJlIGZpeGVkCi0JICogQHJldHVybiBVUkkgdGhlIGZ1bGwgcGF0aCB1cmkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKEVPYmplY3QgbywgVVJJIHVyaSkgewotCQlpZiAodXJpID09IG51bGwpIHsKLQkJCXJldHVybiB1cmk7Ci0JCX0KLQotCQkvLyB0cnkgaWYgdGhpcyBpcyBhIHZhbGlkIFVSTCBvciBub3QKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSB1cmkudG9VUkwoKTsKLQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCXJldHVybiB1cmk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJOyAvLyBub3QgYSB2YWxpZCB1cmwsIG1heWJlIGEgcmVsYXRpdmUgcGF0aAotCQl9Ci0KLQkJLy8gbmVlZCB0byBnZXQgdGhlIGVsZW1lbnQncyByZXNvdXJjZSBwYXRoCi0JCUZpbGUgZiA9IGdldExpYnJhcnlSb290UGF0aChvKTsKLQkJU3RyaW5nIHBhdGggPSB1cmkuZ2V0UGF0aCgpOwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4obyk7Ci0JCWlmKHBsdWdpbiAhPSBudWxsICYmIHBhdGguaW5kZXhPZihwbHVnaW4uZ2V0TmFtZSgpKSA+IC0xKXsKLQkJCXJldHVybiBuZXcgRmlsZShmLCBOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHVyaS50b1N0cmluZygpKSkudG9VUkkoKTsKLQkJfWVsc2V7Ci0JCQlyZXR1cm4gbmV3IEZpbGUoZiwgcGx1Z2luLmdldE5hbWUoKSsgRmlsZS5zZXBhcmF0b3IrTmV0VXRpbC5kZWNvZGVkRmlsZVVybCh1cmkudG9TdHJpbmcoKSkpLnRvVVJJKCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdGFja1RyYWNlU3RyaW5nKFRocm93YWJsZSBlKSB7Ci0JCVN0cmluZ1dyaXRlciBzdHJXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdHJXcml0ZXIpKTsKLQkJcmV0dXJuIHN0cldyaXRlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhYmVsV2l0aFBhdGgoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldExhYmVsV2l0aFBhdGgoKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdCk7Ci0JCX0KLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQlyZXR1cm4gZ2V0TGFiZWxXaXRoUGF0aCgoKENvbnRlbnREZXNjcmlwdGlvbikgb2JqZWN0KS5lQ29udGFpbmVyKCkpOwotCQl9Ci0KLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBvYmplY3Q7Ci0JCQlTdHJpbmdbXSBzdHIgPSBNaXNjLmdldFBhdGhSZWxhdGl2ZVRvUGx1Z2luKG1lKTsKLQkJCVN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRMYWJlbChvYmplY3QsIG1lLmdldEd1aWQoKSkpOwotLy8JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCWlmIChNZXRob2RFbGVtZW50VXRpbC5nZXRNZXRob2RNb2RlbChvYmplY3QpICE9IG51bGwpIHsKLQkJCQlwYXRoCi0JCQkJLmFwcGVuZCgiLCAiKS5hcHBlbmQoTWV0aG9kRWxlbWVudFV0aWwuZ2V0TWV0aG9kTW9kZWwob2JqZWN0KS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHsKLQkJCQkJU3RyaW5nIHMgPSBzdHJbaV07Ci0KLQkJCQkJaWYgKE1vZGVsU3RydWN0dXJlLkNPUkVfQ09OVEVOVF9QQUNBS0dFX05BTUUuZXF1YWxzKHMpIHx8IE1vZGVsU3RydWN0dXJlLkNPTlRFTlRfUEFDS0FHRV9OQU1FLmVxdWFsc0lnbm9yZUNhc2UocykKLQkJCQkJCQl8fCAoKChOYW1lZEVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpLmVxdWFscyhzKSkpIHsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBhdGguYXBwZW5kKCcvJykuYXBwZW5kKHMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotLy8JCQl9Ci0JCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCBnZXRPd25lcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJY29tbWFuZCA9IFRuZ1V0aWwudW53cmFwKGNvbW1hbmQpOwotCQlFT2JqZWN0IG93bmVyID0gbnVsbDsKLQkJaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBBZGRDb21tYW5kKSB7Ci0JCQlvd25lciA9ICgoQWRkQ29tbWFuZCkgY29tbWFuZCkuZ2V0T3duZXIoKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgUmVtb3ZlQ29tbWFuZCkgewotCQkJb3duZXIgPSAoKFJlbW92ZUNvbW1hbmQpIGNvbW1hbmQpLmdldE93bmVyKCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFNldENvbW1hbmQpIHsKLQkJCW93bmVyID0gKChTZXRDb21tYW5kKSBjb21tYW5kKS5nZXRPd25lcigpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBNb3ZlQ29tbWFuZCkgewotCQkJb3duZXIgPSAoKE1vdmVDb21tYW5kKSBjb21tYW5kKS5nZXRPd25lcigpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKSB7Ci0JCQlPYmplY3QgbyA9ICgoUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgY29tbWFuZCkuZ2V0T3duZXIoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCW93bmVyID0gKEVPYmplY3QpIG87Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG93bmVyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBjb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvTGlzdChTdHJpbmcgYXR0YWNobWVudFN0cmluZykgewotCQlBcnJheUxpc3QgYXR0YWNobWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChhdHRhY2htZW50U3RyaW5nID09IG51bGwpCi0JCQlhdHRhY2htZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGZpbGVzW10gPSBhdHRhY2htZW50U3RyaW5nCi0JCQkJLnNwbGl0KEdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SX1NQTElUVEVSKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZpbGVzW2ldLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0JCQkJYXR0YWNobWVudHMuYWRkKGZpbGVzW2ldKTsKLQkJfQotCQlyZXR1cm4gYXR0YWNobWVudHM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEd1aWRhbmNlQXR0YWNobWVudHNUb1N0cmluZyhMaXN0IGF0dGFjaG1lbnRMaXN0KSB7Ci0JCVN0cmluZyBhdHRhY2htZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRhY2htZW50TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBhdHRhY2htZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoaSsrID4gMCkKLQkJCQlhdHRhY2htZW50U3RyaW5nID0gYXR0YWNobWVudFN0cmluZwotCQkJCQkJLmNvbmNhdChHVUlEQU5DRV9GSUxFU1RSSU5HX1NFUEFSQVRPUik7Ci0JCQlhdHRhY2htZW50U3RyaW5nID0gYXR0YWNobWVudFN0cmluZy5jb25jYXQoYXR0YWNobWVudCk7Ci0JCX0KLQkJcmV0dXJuIGF0dGFjaG1lbnRTdHJpbmc7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiB0cnVlIGlmZiB0aGUgTWV0aG9kRWxlbWVudCBpcyBhbGxvd2VkIGFuIGF0dGFjaG1lbnQuICBDdXJyZW50bHksIG9ubHkKLQkgKiBFeGFtcGxlLCBSZXN1YWJsZUFzc2V0LCBUZW1wbGF0ZSwgIFdoaXRlcGFwZXIgYXJlIGFsbG93ZWQgYXR0YWNobWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbGxvd2VkQXR0YWNobWVudHMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmIChlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoZSBpbnN0YW5jZW9mIEV4YW1wbGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChlIGluc3RhbmNlb2YgVGVtcGxhdGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBXaGl0ZXBhcGVyKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gPGNvZGU+ZWxlbWVudHM8L2NvZGU+IGNvbnRhaW5zIDxjb2RlPmU8L2NvZGU+IG9yIGhhcyBhIHdyYXBwZXIgb2YgPGNvZGU+ZTwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoQ29sbGVjdGlvbiBlbGVtZW50cywgT2JqZWN0IGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYoZWxlbWVudCA9PSBlIHx8IGUgPT0gdW53cmFwKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIEN1c3RvbUNhdGVnb3J5IGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBEZXNjaWJhYmxlRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBjYwotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIG1vdmVkIHRvIHtAbGluayBEZXBlbmRlbmN5Q2hlY2tlciNpc0FuY2Vzc29yT2YoQ3VzdG9tQ2F0ZWdvcnksIERlc2NyaWJhYmxlRWxlbWVudCl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQW5jZXNzb3JPZihDdXN0b21DYXRlZ29yeSBjYywgRGVzY3JpYmFibGVFbGVtZW50IGUpIHsKLQkJcmV0dXJuIERlcGVuZGVuY3lDaGVja2VyLmlzQW5jZXNzb3JPZihjYywgZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJaWYobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OQU1FOgotCQkJCWlmKFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJCWlmKCFQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE5hbWVkRWxlbWVudC5jbGFzcykgIT0gVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FICl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gbmFtZSBjaGFuZ2UgbWlnaHQgY2hhbmdlIHRoZSBlbGVtZW50J3Mgb3JkZXIgaW4gdGhlIHNvcnRlZCBsaXN0Ci0JCS8vIHJlZnJlc2ggdGhlIHBhcmVudCBjb250ZW50IHRvIHJlc29ydCB0aGUgZWxlbWVudCBsaXN0Ci0JCS8vCi0JCWFkYXB0ZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIGFkYXB0ZXIuZ2V0UGFyZW50KG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSwgdHJ1ZSwgZmFsc2UpKTsKLQl9CQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZWxlbWVudCA8Y29kZT5lPC9jb2RlPiBpcyBhIGNvbnRyaWJ1dG9yIG9mIHRoZSBnaXZlbiA8Y29kZT5iYXNlPC9jb2RlPgotCSAqIEBwYXJhbSBiYXNlCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udHJpYnV0b3JPZihPYmplY3QgYmFzZSwgVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJZm9yKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGU7Ci0JCXZlICE9IG51bGwgJiYgdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwgJiYgdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGw7Ci0JCXZlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQlpZih2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gYmFzZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLS8vCS8qKgotLy8JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBwYXJlbnQgY29udGFpbnMgdGhlIGdpdmVuIGNoaWxkLCBlaXRoZXIgdmlhIGNvbnRhaW5tZW50IG9yIGNvbnRyaWJ1dGlvbgotLy8JICogQHBhcmFtIHBhcmVudAotLy8JICogQHBhcmFtIGNoaWxkCi0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5lZEJ5KEFydGlmYWN0IHBhcmVudCwgQXJ0aWZhY3QgY2hpbGQpIHsKLS8vCQlFT2JqZWN0IGNvbnRhaW5lciA9IGNoaWxkLmVDb250YWluZXIoKTsKLS8vCQlpZihjb250YWluZXIgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotLy8JCQlBcnRpZmFjdCBjdXJyZW50UGFyZW50ID0gKEFydGlmYWN0KWNvbnRhaW5lcjsKLS8vCQkJaWYoY29udGFpbmVyID09IHBhcmVudCB8fCBpc0NvbnRyaWJ1dG9yT2YocGFyZW50LCBjdXJyZW50UGFyZW50KSkgewotLy8JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCX0KLS8vCQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihwYXJlbnQsIGZhbHNlKSB7Ci0vLwkJCQkKLS8vCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotLy8JCQkJCi0vLwkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotLy8JCQkJCXJldHVybiAoKEFydGlmYWN0KW9iamVjdCkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuaXRlcmF0b3IoKTsKLS8vCQkJCX0KLS8vCQkJCQotLy8JCQl9OwotLy8JCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotLy8JCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLS8vCQkJCWlmKG8gPT0gY3VycmVudFBhcmVudCB8fCBpc0NvbnRyaWJ1dG9yT2YobywgY3VycmVudFBhcmVudCkpIHsKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlyZXR1cm4gVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGNoaWxkLCBwYXJlbnQpOwotLy8JCX0KLS8vCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0Q29uZmlndXJhdGlvbnNUb1VwZGF0ZShNZXRob2RQYWNrYWdlIHBhcmVudCwgTWV0aG9kUGFja2FnZSBwa2csIENvbGxlY3Rpb24gY29uZmlnc1RvVXBkYXRlKSB7Ci0JCU9iamVjdCBjb25maWdzID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgcGFyZW50KQotCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoQXNzb2NpYXRpb25IZWxwZXIuTWV0aG9kUGFja2FnZV9NZXRob2RDb25maWd1cmF0aW9ucyk7Ci0JCWlmIChjb25maWdzIGluc3RhbmNlb2YgTGlzdCkgewotCQkJZm9yIChJdGVyYXRvciBpdGNvbmZpZyA9ICgoTGlzdCkgY29uZmlncykuaXRlcmF0b3IoKTsgaXRjb25maWcKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRjb25maWcKLQkJCQkubmV4dCgpOwotCQkJCUxpc3QgcGtncyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQkJaWYgKCFwa2dzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJY29uZmlnc1RvVXBkYXRlLmFkZChjb25maWcpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBjYW4gYmUgZXN0aW1hdGVkCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkVzdGltYXRlKE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgVGFzayB8fCBvIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWJ1Z1Nob3dBbGwoKSB7Ci0JCUlMaWJyYXJ5SW5zcGVjdG9yIGluc3BlY3RvciA9IGdldExpYnJhcnlJbnNwZWN0b3IoKTsKLQkJaWYgKGluc3BlY3RvciAhPSBudWxsKSB7Ci0JCQlpbnNwZWN0b3Iuc2hvd0FsbENvbnRlbnRzKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlYnVnU2hvd0FsbChNZXRob2RMaWJyYXJ5IGxpYikgewotCQlJTGlicmFyeUluc3BlY3RvciBpbnNwZWN0b3IgPSBnZXRMaWJyYXJ5SW5zcGVjdG9yKCk7Ci0JCWlmIChpbnNwZWN0b3IgIT0gbnVsbCkgewotCQkJaW5zcGVjdG9yLnNob3dBbGxDb250ZW50cyhsaWIpOwotCQl9Ci0JfQotCQotCS8vVXNlZCBmb3IgZGVidWcgb25seQotCXB1YmxpYyBzdGF0aWMgSUxpYnJhcnlJbnNwZWN0b3IgZ2V0TGlicmFyeUluc3BlY3RvcigpIHsKLQkJcmV0dXJuIChJTGlicmFyeUluc3BlY3RvcikgRXh0ZW5zaW9uTWFuYWdlci5nZXRFeHRlbnNpb24oIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiLCAibGlicmFyeUluc3BlY3RvciIpOyAJCQkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5QbHVnaW5XaXRoTGVzc1RoYW5PbmVTdXBlckN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IGNjLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWlmKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNjKSAhPSBwbHVnaW4pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGNjKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKSAmJiBjb3VudCA8IDI7KSB7Ci0JCQlDdXN0b21DYXRlZ29yeSBjYXQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJaWYoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0KSA9PSBwbHVnaW4pIHsKLQkJCQljb3VudCsrOwotCQkJfQkJCQkJCQotCQl9Ci0JCXJldHVybiBjb3VudCA8IDI7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIGdpdmVuIHdyYXBwZXIgaXMgdW5kZXIgYSBjdXN0b20gY2F0ZWdvcnkgdHJlZQotCSAqIAotCSAqIEBwYXJhbSBpdGVtCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VuZGVyQ3VzdG9tQ2F0ZWdvcnlUcmVlKElXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJZG8gewotCQkJT2JqZWN0IG93bmVyID0gd3JhcHBlci5nZXRPd25lcigpOwotCQkJaWYodW53cmFwKG93bmVyKSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQl3cmFwcGVyID0gb3duZXIgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlciA/IChJV3JhcHBlckl0ZW1Qcm92aWRlcikgb3duZXIgOiBudWxsOwotCQl9IHdoaWxlKHdyYXBwZXIgIT0gbnVsbCk7Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRFeGNsdXNpdmVTdWJDdXN0b21DYXRlZ29yaWVzKEN1c3RvbUNhdGVnb3J5IGNjKSB7Ci0JCUFycmF5TGlzdCBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQljb2xsZWN0RXhjbHVzaXZlU3ViQ3VzdG9tQ2F0ZWdvcmllcyhjb2xsZWN0aW9uLCBjYywgVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2MpKTsKLQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdEV4Y2x1c2l2ZVN1YkN1c3RvbUNhdGVnb3JpZXMoQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBDdXN0b21DYXRlZ29yeSBjYywgTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjYy5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgc3ViID0gKEN1c3RvbUNhdGVnb3J5KSBlOwotCQkJCWlmKGlzSW5QbHVnaW5XaXRoTGVzc1RoYW5PbmVTdXBlckN1c3RvbUNhdGVnb3J5KHN1YiwgcGx1Z2luKSkgewotCQkJCQljb2xsZWN0aW9uLmFkZChlKTsKLQkJCQkJY29sbGVjdEV4Y2x1c2l2ZVN1YkN1c3RvbUNhdGVnb3JpZXMoY29sbGVjdGlvbiwgc3ViLCBwbHVnaW4pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBjcmVhdGUgYSBkZWVwIGNvcHkgb2YgYSBwcm9jZXNzIHRvIHRoZSBzcGVjaWZpZWQgcHJvY2VzcyBwYWNrYWdlLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiBAcHJhcm0gbmV3UHJvY2Vzc05hbWUKLQkgKiBAcGFyYW0gZGVlcENvcHlDb25maWcKLQkgKiBAcGFyYW0gdGFyZ2V0UGFja2FnZQotCSAqIEByZXR1cm4gUHJvY2VzcyB0aGUgbmV3bHkgY3JlYXRlZCBwcm9jZXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgZGVlcENvcHkoCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIAotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MsIAotCQkJU3RyaW5nIG5ld1Byb2Nlc3NOYW1lLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWVwQ29weUNvbmZpZywgCi0JCQlQcm9jZXNzUGFja2FnZSB0YXJnZXRQYWNrYWdlKSB7Ci0JCQotCQkvLyBpZiB0aGUgdGFyZ2V0UGFja2FnZSBpcyBudWxsLCB1c2UgdGhlIHNhbWUgcGFja2FnZSBvZiB0aGUgc291cmNlIHByb2Nlc3MKLQkJaWYgKCB0YXJnZXRQYWNrYWdlID09IG51bGwgKSB7Ci0JCQl0YXJnZXRQYWNrYWdlID0gKFByb2Nlc3NQYWNrYWdlKXByb2Nlc3MuZUNvbnRhaW5lcigpLmVDb250YWluZXIoKTsKLQkJfQotCQkKLQkJLy8JCW5ldyBkZWVwLWNvcGllZCBwcm9jZXNzJ3MgcmVmZXJlbmNlCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBuZXdQcm9jZXNzID0gbnVsbDsKLQotCQlDb3B5SGVscGVyIGhlbHBlciA9IG5ldyBDb3B5SGVscGVyKCk7CQotCQl0cnkgewotCQkJaWYobW9uaXRvciA9PSBudWxsKSB7Ci0JCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQl9Ci0JCQkJCQotCQkJUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZCBjbWQgPSBuZXcgUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZChwcm9jZXNzLCBuZXdQcm9jZXNzTmFtZSwgaGVscGVyLCBkZWVwQ29weUNvbmZpZywgdGFyZ2V0UGFja2FnZSwgbW9uaXRvcik7Ci0JCQl0cnkgewotCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJQ29sbGVjdGlvbiByZXN1bHQgPSBjbWQuZ2V0UmVzdWx0KCk7Ci0JCQkJaWYoIXJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCQkJY21kLmNvcHlTdXBwcmVzc2lvblN0YXRlcygpOwotCQkJCQluZXdQcm9jZXNzID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgcmVzdWx0LnRvQXJyYXkoKVswXTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQljbWQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaGVscGVyLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCS8vIGZpeCBicmVha2Rvd24gZWxlbWVudCBvcmRlciBvZiBhbGwgYWN0aXZpdGllcwotCQkvLwotCQlpZiAoIG5ld1Byb2Nlc3MgIT0gbnVsbCApIHsKLQkJCVByb2Nlc3NVdGlsLmZpeEJyZWFrZG9ud0VsZW1lbnRPcmRlclJlY3Vyc2l2ZWx5KG5ld1Byb2Nlc3MpOwkKLQkJfQotCQlyZXR1cm4gbmV3UHJvY2VzczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QWRhcHRlckJ5VHlwZShOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm90aWZpZXIuZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgaXRlci5uZXh0KCk7Ci0JCQlpZihhZGFwdGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCByZWZlcmVuY2VzIHRvIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbWFwIGNvbnRhaW5pbmcgdGhlIHJlbW92ZWQgcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIHJlbW92ZVJlZmVyZW5jZXMoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBUbmdVdGlsLnJlbW92ZVJlZmVyZW5jZXMoZWxlbWVudCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIHJlZmVyZW5jZXMgdG8gYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBtYXAgb2YgbWV0aG9kIGVsZW1lbnRzIHdob3NlIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGVsZW1lbnQKLQkgKiAgICAgICAgIGFyZSBqdXN0IHJlbW92ZWQsIGFuZCB0aGVpciBmZWF0dXJlcyB0aGF0IGhvbGQgdGhlIHJlZmVyZW5jZXMgdG8KLQkgKiAgICAgICAgIHRoZSBnaXZlbiBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgcmVtb3ZlUmVmZXJlbmNlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlib29sZWFuIGNoZWNrTW9kaWZ5KSB7Ci0JCS8vIExpc3QgcmVmZXJlbmNlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1hcCBvYmplY3RGZWF0dXJlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCU11bHRpUmVzb3VyY2VFT2JqZWN0IGVPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQ7Ci0JCi0JCWlmIChlT2JqLmJhc2ljR2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkgPT0gbnVsbCkKLQkJCXJldHVybiBvYmplY3RGZWF0dXJlc01hcDsKLQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZU9iai5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gKChPcHBvc2l0ZUZlYXR1cmUpIGVudHJ5LmdldEtleSgpKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gb3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKTsKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgZU9iagotCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoY2hlY2tNb2RpZnkpIHsKLQkJCQkJCQljaGVja01vZGlmeShvYmopOwotCQkJCQkJfQotCQkJCQkJKChMaXN0KSBvYmouZUdldChmZWF0dXJlKSkucmVtb3ZlKGVsZW1lbnQpOwotCQkJCQkJTGlzdCBmZWF0dXJlcyA9IChMaXN0KSBvYmplY3RGZWF0dXJlc01hcC5nZXQob2JqKTsKLQkJCQkJCWlmIChmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkJCQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJb2JqZWN0RmVhdHVyZXNNYXAucHV0KG9iaiwgZmVhdHVyZXMpOwotCQkJCQkJfQotCQkJCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgZU9iagotCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCQkJCWlmIChjaGVja01vZGlmeSkgewotCQkJCQkJCWNoZWNrTW9kaWZ5KG9iaik7Ci0JCQkJCQl9Ci0JCQkJCQkoKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCQlMaXN0IGZlYXR1cmVzID0gKExpc3QpIG9iamVjdEZlYXR1cmVzTWFwLmdldChvYmopOwotCQkJCQkJaWYgKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCQkJCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlvYmplY3RGZWF0dXJlc01hcC5wdXQob2JqLCBmZWF0dXJlcyk7Ci0JCQkJCQl9Ci0JCQkJCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIGVPYmoKLQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKGNoZWNrTW9kaWZ5KSB7Ci0JCQkJCQkJY2hlY2tNb2RpZnkob2JqKTsKLQkJCQkJCX0KLQkJCQkJCW9iai5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQkJCQkJTGlzdCBmZWF0dXJlcyA9IChMaXN0KSBvYmplY3RGZWF0dXJlc01hcC5nZXQob2JqKTsKLQkJCQkJCWlmIChmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkJCQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJb2JqZWN0RmVhdHVyZXNNYXAucHV0KG9iaiwgZmVhdHVyZXMpOwotCQkJCQkJfQotCQkJCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgZU9iagotCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCQkJCWlmIChjaGVja01vZGlmeSkgewotCQkJCQkJCWNoZWNrTW9kaWZ5KG9iaik7Ci0JCQkJCQl9Ci0JCQkJCQlvYmouZVNldChmZWF0dXJlLCBudWxsKTsKLQkJCQkJCUxpc3QgZmVhdHVyZXMgPSAoTGlzdCkgb2JqZWN0RmVhdHVyZXNNYXAuZ2V0KG9iaik7Ci0JCQkJCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJCQkJCWZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCW9iamVjdEZlYXR1cmVzTWFwLnB1dChvYmosIGZlYXR1cmVzKTsKLQkJCQkJCX0KLQkJCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RGZWF0dXJlc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJLy8gcmVmZXJlbmNlcnMuYWRkKG5ldyBSZWZlcmVuY2VyKChFT2JqZWN0KWVudHJ5LmdldEtleSgpLAotCQkvLyAoTGlzdCllbnRyeS5nZXRWYWx1ZSgpKSk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIHJlZmVyZW5jZXJzOwotCQlyZXR1cm4gb2JqZWN0RmVhdHVyZXNNYXA7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBwdWJsaXNoaW5nIGNhdGVnb3J5IHByb3BlcnR5IGZvciBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJIHByb3BlcnR5IGlmIGZvdW5kLCBlbHNlIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBnZXRQdWJsaXNoQ2F0ZWdvcnlQcm9wZXJ0eShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCBwcm9wcyA9IGVsZW1lbnQuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCWlmIChwcm9wcyA9PSBudWxsIHx8IHByb3BzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBwcm9wcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIGl0Lm5leHQoKTsKLQkJCWlmIChQVUJMSVNIX0NBVEVHT1JZX1BST1BFUlRZLmVxdWFscyhwcm9wLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gcHJvcDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9XcmFwcGVyTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvV3JhcHBlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTIwMjViNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9XcmFwcGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogTWFuYWdlcyB3cmFwcGVycyBvZiBhbiBpdGVtIHByb3ZpZGVyCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gRmViIDE1LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV3JhcHBlck1hbmFnZXIgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7Ci0KLQlwcml2YXRlIEhhc2hNYXAgdmFsdWVUb1dyYXBwZXJNYXA7Ci0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBXcmFwcGVyTWFuYWdlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcigpOwotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0V3JhcHBlcihPYmplY3QgdmFsdWUpIHsKLQkJaWYodmFsdWVUb1dyYXBwZXJNYXAgIT0gbnVsbCkgewotCQkJcmV0dXJuIHZhbHVlVG9XcmFwcGVyTWFwLmdldCh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFdyYXBwZXJzKCkgewotCQlpZih2YWx1ZVRvV3JhcHBlck1hcCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdmFsdWVUb1dyYXBwZXJNYXAudmFsdWVzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgd3JhcHBlciBmb3IgdGhlIGdpdmVuIHZhbHVlLCBvd25lciwgYW5kIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcih2YWx1ZSwgb3duZXIsIG51bGwsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29sbGVjdGlvbiBkZWxlZ2F0ZVZhbHVlcykgewotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJU2V0IG9sZERlbGVnYXRlVmFsdWVzID0gZGVsZWdhdGVWYWx1ZXMgIT0gbnVsbCA/IG5ldyBIYXNoU2V0KGRlbGVnYXRlVmFsdWVzKSA6IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJCi0JCWlmICh2YWx1ZVRvV3JhcHBlck1hcCA9PSBudWxsICYmICFkZWxlZ2F0ZVZhbHVlcy5pc0VtcHR5KCkpCi0JCXsKLQkJCXZhbHVlVG9XcmFwcGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQkKLQkJLy8gV3JhcCBhbnkgbmV3IGNoaWxkcmVuIGFuZCBhZGQgdGhlbSB0byB0aGUgbWFwLiBSZW1vdmUgZWFjaCBjdXJyZW50IGNoaWxkIGZyb20gdGhlIHNldCBvZiBvbGQgY2hpbGRyZW4uCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaSA9IGRlbGVnYXRlVmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JCXsKLQkJCU9iamVjdCBjaGlsZCA9IGkubmV4dCgpOwotCQkJCi0JCQlpZiAoIXZhbHVlVG9XcmFwcGVyTWFwLmNvbnRhaW5zS2V5KGNoaWxkKSkKLQkJCXsKLQkJCQlJV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gY3JlYXRlV3JhcHBlcihjaGlsZCwgdGhpcywgYWRhcHRlckZhY3RvcnkpOwotCQkJCXZhbHVlVG9XcmFwcGVyTWFwLnB1dChjaGlsZCwgd3JhcHBlcik7Ci0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQl9Ci0JCQlvbGREZWxlZ2F0ZVZhbHVlcy5yZW1vdmUoY2hpbGQpOwotCQl9Ci0JCQotCQkvLyBSZW1vdmUgYW5kIGRpc3Bvc2UgYW55IHdyYXBwZXJzIGZvciByZW1haW5pbmcgb2xkIGNoaWxkcmVuLgotCQkvLwotCQlpZiAoIW9sZERlbGVnYXRlVmFsdWVzLmlzRW1wdHkoKSkKLQkJewotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaSA9IG9sZERlbGVnYXRlVmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JCQl7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaS5uZXh0KCk7Ci0JCQkJCi0JCQkJSVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChJV3JhcHBlckl0ZW1Qcm92aWRlcil2YWx1ZVRvV3JhcHBlck1hcC5yZW1vdmUoY2hpbGQpOwotCQkJCWlmICh3cmFwcGVyICE9IG51bGwpCi0JCQkJewotCQkJCQl3cmFwcGVyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIElmIGFueSBjaGlsZHJlbiB3ZXJlIGFkZGVkIG9yIHJlbW92ZWQsIHJlc2V0IHRoZSBpbmRpY2VzLgotCQlpZiAoY2hhbmdlZCkKLQkJewotCQkJaW50IGluZGV4ID0gMDsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGRlbGVnYXRlVmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBpbmRleCsrKQotCQkJewotCQkJCSgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpdmFsdWVUb1dyYXBwZXJNYXAuZ2V0KGkubmV4dCgpKSkuc2V0SW5kZXgoaW5kZXgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkgICAgaWYgKHZhbHVlVG9XcmFwcGVyTWFwICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB2YWx1ZVRvV3JhcHBlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JICAgICAgewotCSAgICAgICAgKChJRGlzcG9zYWJsZSlpLm5leHQoKSkuZGlzcG9zZSgpOwotCSAgICAgIH0KLQkgICAgICB2YWx1ZVRvV3JhcHBlck1hcC5jbGVhcigpOwotCSAgICAgIHZhbHVlVG9XcmFwcGVyTWFwID0gbnVsbDsKLQkgICAgfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvTW9kZWxGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9Nb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQ0ZmUyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9Nb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4gSXQgcHJvdmlkZXMgYQotICogY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZGVsRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuTW9kZWxGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcmRlciBJbmZvPC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3JkZXIgSW5mbzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3JkZXJJbmZvIGNyZWF0ZU9yZGVySW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9yZGVySW5mb0NvbGxlY3Rpb24gY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTW9kZWxQYWNrYWdlIGdldE1vZGVsUGFja2FnZSgpOwotCi19IC8vIE1vZGVsRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvTW9kZWxQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9Nb2RlbFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWJkYTVlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9Nb2RlbFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4gSXQgY29udGFpbnMKLSAqIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbEZhY3RvcnkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RlbFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJtb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL2NvbS9pYm0vdW1hL2VkaXQvdG5nL3V0aWwvbW9kZWwuZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC50bmcudXRpbC5tb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZGVsUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsCi0JCQkuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsIDxlbT5PcmRlciBJbmZvPC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsLk9yZGVySW5mb0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0T3JkZXJJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9SREVSX0lORk8gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R1VJIERzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19fR1VJX0RTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lc3RhbXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19fVElNRVNUQU1QID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3JkZXIgSW5mbzwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwgPGVtPk9yZGVyIEluZm8gQ29sbGVjdGlvbjwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9Db2xsZWN0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRPcmRlckluZm9Db2xsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9SREVSX0lORk9fQ09MTEVDVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgSW5mb3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPUkRFUl9JTkZPX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvIDxlbT5PcmRlciBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PcmRlciBJbmZvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0T3JkZXJJbmZvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRPcmRlckluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE9yZGVySW5mb19OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXRHVUlEcyA8ZW0+R1VJIERzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R1VJIERzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXRHVUlEcygpCi0JICogQHNlZSAjZ2V0T3JkZXJJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPcmRlckluZm9fR1VJRHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXRUaW1lc3RhbXAgPGVtPlRpbWVzdGFtcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UaW1lc3RhbXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvI2dldFRpbWVzdGFtcCgpCi0JICogQHNlZSAjZ2V0T3JkZXJJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPcmRlckluZm9fVGltZXN0YW1wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbiA8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uI2dldE9yZGVySW5mb3MgPGVtPk9yZGVyIEluZm9zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3JkZXIgSW5mb3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbiNnZXRPcmRlckluZm9zKCkKLQkgKiBAc2VlICNnZXRPcmRlckluZm9Db2xsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRPcmRlckluZm9Db2xsZWN0aW9uX09yZGVySW5mb3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNb2RlbEZhY3RvcnkgZ2V0TW9kZWxGYWN0b3J5KCk7Ci0KLX0gLy8gTW9kZWxQYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9PcmRlckluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL09yZGVySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZTJlNGNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL09yZGVySW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9yZGVySW5mbyBleHRlbmRzIEVPYmplY3QgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUFOVUFMID0gIm1hbnVhbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQG1vZGVsCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqLwotCUVMaXN0IGdldEdVSURzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lc3RhbXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRpbWVzdGFtcDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lc3RhbXA8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRpbWVzdGFtcChsb25nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZSNnZXRPcmRlckluZm9fVGltZXN0YW1wKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JbG9uZyBnZXRUaW1lc3RhbXAoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0VGltZXN0YW1wIDxlbT5UaW1lc3RhbXA8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGltZXN0YW1wPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUaW1lc3RhbXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRpbWVzdGFtcChsb25nIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvT3JkZXJJbmZvQ29sbGVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvT3JkZXJJbmZvQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZmU4ZGVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL09yZGVySW5mb0NvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIG9yZGVyIGluZm9ybWF0aW9uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBPcmRlckluZm9Db2xsZWN0aW9uIGV4dGVuZHMgRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQG1vZGVsIHR5cGU9ImNvbS5pYm0ubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvIgotCSAqICAgICAgICBjb250YWluZW1lbnQ9InRydWUiCi0JICovCi0JRUxpc3QgZ2V0T3JkZXJJbmZvcygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9lZGl0dXRpbC5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2VkaXR1dGlsLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOTg3NjNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2VkaXR1dGlsLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ibW9kZWwiCi0gICAgbnNVUkk9Imh0dHA6Ly8vY29tL2libS91bWEvZWRpdC90bmcvdXRpbC9tb2RlbC5lY29yZSIgbnNQcmVmaXg9ImNvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWwiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik9yZGVySW5mbyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibWFudWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdVSURzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0aW1lc3RhbXAiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VMb25nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik9yZGVySW5mb0NvbGxlY3Rpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcmRlckluZm9zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL09yZGVySW5mbyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvZWRpdHV0aWwuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9lZGl0dXRpbC5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDBjYTY0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9lZGl0dXRpbC5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL2NvbS5pYm0udW1hLmVkaXQudG5nL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvY29tLmlibS51bWEucmVzb3VyY2VtYW5hZ2VyLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9jb20uaWJtLnVtYS5yZXNvdXJjZW1hbmFnZXIuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJjb20uaWJtLnVtYS5lZGl0LnRuZyIgcnVudGltZUphcj0idHJ1ZSIgbW9kZWxOYW1lPSJlZGl0dXRpbCIgZWRpdFBsdWdpbkNsYXNzPSJjb20uaWJtLnVtYS5yZXNvdXJjZW1hbmFnZXIucHJvdmlkZXIuZWRpdHV0aWxFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJjb20uaWJtLnVtYS5yZXNvdXJjZW1hbmFnZXIucHJlc2VudGF0aW9uLmVkaXR1dGlsRWRpdG9yUGx1Z2luIgotICAgIHJ1bnRpbWVDb21wYXRpYmlsaXR5PSJmYWxzZSI+Ci0gIDxmb3JlaWduTW9kZWw+QG1vZGVsPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9Ik1vZGVsIiBiYXNlUGFja2FnZT0iY29tLmlibS51bWEuZWRpdC50bmcudXRpbCIgZWNvcmVQYWNrYWdlPSJlZGl0dXRpbC5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlZGl0dXRpbC5lY29yZSMvL09yZGVySW5mbyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWRpdHV0aWwuZWNvcmUjLy9PcmRlckluZm8vbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVkaXR1dGlsLmVjb3JlIy8vT3JkZXJJbmZvL2dVSURzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVkaXR1dGlsLmVjb3JlIy8vT3JkZXJJbmZvQ29sbGVjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWRpdHV0aWwuZWNvcmUjLy9PcmRlckluZm9Db2xsZWN0aW9uL29yZGVySW5mb3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9Nb2RlbEZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL01vZGVsRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmRiZjE0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL01vZGVsRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uIDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIE1vZGVsRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbmQgaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPOgotCQkJcmV0dXJuIGNyZWF0ZU9yZGVySW5mbygpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT046Ci0JCQlyZXR1cm4gY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPcmRlckluZm8gY3JlYXRlT3JkZXJJbmZvKCkgewotCQlPcmRlckluZm9JbXBsIG9yZGVySW5mbyA9IG5ldyBPcmRlckluZm9JbXBsKCk7Ci0JCXJldHVybiBvcmRlckluZm87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPcmRlckluZm9Db2xsZWN0aW9uIGNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKSB7Ci0JCU9yZGVySW5mb0NvbGxlY3Rpb25JbXBsIG9yZGVySW5mb0NvbGxlY3Rpb24gPSBuZXcgT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwoKTsKLQkJcmV0dXJuIG9yZGVySW5mb0NvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbFBhY2thZ2UgZ2V0TW9kZWxQYWNrYWdlKCkgewotCQlyZXR1cm4gKE1vZGVsUGFja2FnZSkgZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZGVsUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy8gTW9kZWxGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9Nb2RlbFBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL01vZGVsUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjg4M2U0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL01vZGVsUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgTW9kZWxQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3JkZXJJbmZvRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvcmRlckluZm9Db2xsZWN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUKLQkgKiBwYWNrYWdlIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPgotCSAqIE5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMgZmFjdG9yeQotCSAqIG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcyBpbml0aWFsaXphdGlvbiBvZiB0aGUKLQkgKiBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTW9kZWxQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwKLQkgKiBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiBTaW1wbGUgZGVwZW5kZW5jaWVzIGFyZQotCSAqIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbCBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nCi0JICogYW55dGhpbmcgZWxzZS4gVGhpcyBtZXRob2QgZHJpdmVzIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudAotCSAqIHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbCB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPgotCSAqIE9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2ggaGF2ZSBub3QKLQkgKiB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQgYW5kIHJlZ2lzdGVyZWQuCi0JICogVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczogbWV0YS1tb2RlbCBvYmplY3RzIGZvcgotCSAqIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueSBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZQotCSAqIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+Ci0JICogSW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZSBhbHJlYWR5Ci0JICogYmVlbiBpbml0aWFsaXplZC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kZWxQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkKLQkJCXJldHVybiAoTW9kZWxQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRQotCQkJCQkuZ2V0RVBhY2thZ2UoTW9kZWxQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJTW9kZWxQYWNrYWdlSW1wbCB0aGVNb2RlbFBhY2thZ2UgPSAoTW9kZWxQYWNrYWdlSW1wbCkgKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgTW9kZWxQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJLmdldEVQYWNrYWdlKGVOU19VUkkpCi0JCQkJOiBuZXcgTW9kZWxQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlTW9kZWxQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlTW9kZWxQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZU1vZGVsUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlTW9kZWxQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE9yZGVySW5mbygpIHsKLQkJcmV0dXJuIG9yZGVySW5mb0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3JkZXJJbmZvX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgb3JkZXJJbmZvRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE9yZGVySW5mb19HVUlEcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBvcmRlckluZm9FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3JkZXJJbmZvX1RpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBvcmRlckluZm9FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPcmRlckluZm9Db2xsZWN0aW9uKCkgewotCQlyZXR1cm4gb3JkZXJJbmZvQ29sbGVjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbl9PcmRlckluZm9zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG9yZGVySW5mb0NvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZGVsRmFjdG9yeSBnZXRNb2RlbEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoTW9kZWxGYWN0b3J5KSBnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuIFRoaXMgbWV0aG9kIGlzIGd1YXJkZWQgdG8KLQkgKiBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpCi0JCQlyZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCW9yZGVySW5mb0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhPUkRFUl9JTkZPKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShvcmRlckluZm9FQ2xhc3MsIE9SREVSX0lORk9fX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKG9yZGVySW5mb0VDbGFzcywgT1JERVJfSU5GT19fR1VJX0RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShvcmRlckluZm9FQ2xhc3MsIE9SREVSX0lORk9fX1RJTUVTVEFNUCk7Ci0KLQkJb3JkZXJJbmZvQ29sbGVjdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhPUkRFUl9JTkZPX0NPTExFQ1RJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKG9yZGVySW5mb0NvbGxlY3Rpb25FQ2xhc3MsCi0JCQkJT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpCi0JCQlyZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKAotCQkJCW9yZGVySW5mb0VDbGFzcywKLQkJCQlPcmRlckluZm8uY2xhc3MsCi0JCQkJIk9yZGVySW5mbyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRPcmRlckluZm9fTmFtZSgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksCi0JCQkJIm5hbWUiLCBudWxsLCAwLCAxLCBPcmRlckluZm8uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0T3JkZXJJbmZvX0dVSURzKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwKLQkJCQkiZ1VJRHMiLCBudWxsLCAwLCAtMSwgT3JkZXJJbmZvLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE9yZGVySW5mb19UaW1lc3RhbXAoKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwKLQkJCQkidGltZXN0YW1wIiwgbnVsbCwgMCwgMSwgT3JkZXJJbmZvLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlvcmRlckluZm9Db2xsZWN0aW9uRUNsYXNzLAotCQkJCU9yZGVySW5mb0NvbGxlY3Rpb24uY2xhc3MsCi0JCQkJIk9yZGVySW5mb0NvbGxlY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbl9PcmRlckluZm9zKCksCi0JCQkJdGhpcy5nZXRPcmRlckluZm8oKSwKLQkJCQludWxsLAotCQkJCSJvcmRlckluZm9zIiwgbnVsbCwgMCwgLTEsIE9yZGVySW5mb0NvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vIE1vZGVsUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2U4NTAxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL09yZGVySW5mb0NvbGxlY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcmRlciBJbmZvIENvbGxlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9Db2xsZWN0aW9uSW1wbCNnZXRPcmRlckluZm9zIDxlbT5PcmRlciBJbmZvczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPcmRlckluZm9Db2xsZWN0aW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMKLQkJT3JkZXJJbmZvQ29sbGVjdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJJbmZvcygpIDxlbT5PcmRlciBJbmZvczwvZW0+fScKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0T3JkZXJJbmZvcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG9yZGVySW5mb3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPcmRlckluZm9Db2xsZWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE9yZGVySW5mb3MoKSB7Ci0JCWlmIChvcmRlckluZm9zID09IG51bGwpIHsKLQkJCW9yZGVySW5mb3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoT3JkZXJJbmZvLmNsYXNzLCB0aGlzLAotCQkJCQlNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUyk7Ci0JCX0KLQkJcmV0dXJuIG9yZGVySW5mb3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fQ09MTEVDVElPTl9fT1JERVJfSU5GT1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0T3JkZXJJbmZvcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJCW1zZ3MpOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywKLQkJCQkJCW1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TOgotCQkJcmV0dXJuIGdldE9yZGVySW5mb3MoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TOgotCQkJZ2V0T3JkZXJJbmZvcygpLmNsZWFyKCk7Ci0JCQlnZXRPcmRlckluZm9zKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUzoKLQkJCWdldE9yZGVySW5mb3MoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TOgotCQkJcmV0dXJuIG9yZGVySW5mb3MgIT0gbnVsbCAmJiAhb3JkZXJJbmZvcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvLyBPcmRlckluZm9Db2xsZWN0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9PcmRlckluZm9JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL09yZGVySW5mb0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjJjZjI1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL09yZGVySW5mb0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9yZGVyIEluZm88L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsI2dldEdVSURzIDxlbT5HVUkgRHM8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsI2dldFRpbWVzdGFtcCA8ZW0+VGltZXN0YW1wPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE9yZGVySW5mb0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE9yZGVySW5mbyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdVSURzKCkgPGVtPkdVSSBEczwvZW0+fScgYXR0cmlidXRlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0R1VJRHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBnVUlEcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZXN0YW1wKCkgPGVtPlRpbWVzdGFtcDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFRpbWVzdGFtcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVTVEFNUF9FREVGQVVMVCA9IDBMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZXN0YW1wKCkgPGVtPlRpbWVzdGFtcDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFRpbWVzdGFtcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGxvbmcgdGltZXN0YW1wID0gVElNRVNUQU1QX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPcmRlckluZm9JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3JkZXJJbmZvKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEdVSURzKCkgewotCQlpZiAoZ1VJRHMgPT0gbnVsbCkgewotCQkJZ1VJRHMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLAotCQkJCQlNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fR1VJX0RTKTsKLQkJfQotCQlyZXR1cm4gZ1VJRHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIHRpbWVzdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKGxvbmcgbmV3VGltZXN0YW1wKSB7Ci0JCWxvbmcgb2xkVGltZXN0YW1wID0gdGltZXN0YW1wOwotCQl0aW1lc3RhbXAgPSBuZXdUaW1lc3RhbXA7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCU1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19USU1FU1RBTVAsIG9sZFRpbWVzdGFtcCwgdGltZXN0YW1wKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fTkFNRToKLQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX0dVSV9EUzoKLQkJCXJldHVybiBnZXRHVUlEcygpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19USU1FU1RBTVA6Ci0JCQlyZXR1cm4gbmV3IExvbmcoZ2V0VGltZXN0YW1wKCkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX05BTUU6Ci0JCQlzZXROYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fR1VJX0RTOgotCQkJZ2V0R1VJRHMoKS5jbGVhcigpOwotCQkJZ2V0R1VJRHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fVElNRVNUQU1QOgotCQkJc2V0VGltZXN0YW1wKCgoTG9uZykgbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19OQU1FOgotCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fR1VJX0RTOgotCQkJZ2V0R1VJRHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19USU1FU1RBTVA6Ci0JCQlzZXRUaW1lc3RhbXAoVElNRVNUQU1QX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fTkFNRToKLQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKG5hbWUpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19HVUlfRFM6Ci0JCQlyZXR1cm4gZ1VJRHMgIT0gbnVsbCAmJiAhZ1VJRHMuaXNFbXB0eSgpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19USU1FU1RBTVA6Ci0JCQlyZXR1cm4gdGltZXN0YW1wICE9IFRJTUVTVEFNUF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBnVUlEczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChnVUlEcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdGltZXN0YW1wOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHRpbWVzdGFtcCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBPcmRlckluZm9JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NDgyYWMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBvcmRlcmluZyBjb250ZW50IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2YyM2JiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3Igb3JkZXJpbmcgY29udGVudCBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL01vZGVsQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNWU5MTI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLiBJdAotICogcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUKLSAqIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1vZGVsUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IE1vZGVsUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YKLQkgKiB0aGUgbW9kZWwuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNb2RlbFN3aXRjaCBtb2RlbFN3aXRjaCA9IG5ldyBNb2RlbFN3aXRjaCgpIHsKLQkJcHVibGljIE9iamVjdCBjYXNlT3JkZXJJbmZvKE9yZGVySW5mbyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVPcmRlckluZm9BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VPcmRlckluZm9Db2xsZWN0aW9uKE9yZGVySW5mb0NvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKSBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8gPGVtPk9yZGVyIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdAotCSAqIHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2UKLQkgKiB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3JkZXJJbmZvQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbiA8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKLQkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCi0JICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPcmRlckluZm9Db2xsZWN0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzCi0JICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vIE1vZGVsQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvTW9kZWxTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvTW9kZWxTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmQ5MTZjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL01vZGVsU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlCi0gKiBoaWVyYXJjaHkuIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0IGFuZCBwcm9jZWVkaW5nIHVwIHRoZQotICogaW5oZXJpdGFuY2UgaGllcmFyY2h5IHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLCB3aGljaCBpcyB0aGUKLSAqIHJlc3VsdCBvZiB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1vZGVsUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZQotCSAqIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPgotCSAqICAgICAgICAgY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUKLQkgKiByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4KLQkgKiAgICAgICAgIGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0gZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4gZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8gZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOiBkb1N3aXRjaCgKLQkJCQkJKEVDbGFzcykgZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUKLQkgKiByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4KLQkgKiAgICAgICAgIGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk86IHsKLQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSAoT3JkZXJJbmZvKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VPcmRlckluZm8ob3JkZXJJbmZvKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OOiB7Ci0JCQlPcmRlckluZm9Db2xsZWN0aW9uIG9yZGVySW5mb0NvbGxlY3Rpb24gPSAoT3JkZXJJbmZvQ29sbGVjdGlvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3JkZXJJbmZvQ29sbGVjdGlvbihvcmRlckluZm9Db2xsZWN0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcmRlciBJbmZvPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQotCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9yZGVyIEluZm88L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU9yZGVySW5mbyhPcmRlckluZm8gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCi0JICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VPcmRlckluZm9Db2xsZWN0aW9uKE9yZGVySW5mb0NvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQotCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlCi0JICogYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vIE1vZGVsU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL1N0cmluZ1Jlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL1N0cmluZ1Jlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxNWRlNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9TdHJpbmdSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGw7Ci0KLS8qKgotICogUmVzb3VyY2UgdG8gc3RvcmUgc3RyaW5nCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nUmVzb3VyY2UgZXh0ZW5kcyBYTUlSZXNvdXJjZUltcGwgewotCXByaXZhdGUgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dDsKLQotCXByaXZhdGUgU3RyaW5nIHN0cjsKLQotCXB1YmxpYyBTdHJpbmdSZXNvdXJjZShTdHJpbmcgc3RyKSB7Ci0JCXRoaXMuc3RyID0gc3RyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJdHJ5IHsKLQkJCXNhdmUob3V0LCBvcHRpb25zKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW91dC5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCWlmIChvdXQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZW5jb2RpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG91dC50b1N0cmluZygpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gb3V0LnRvU3RyaW5nKGVuY29kaW5nKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICghaXNMb2FkZWQpIHsKLQkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKHN0cik7Ci0JCQl0cnkgewotCQkJCWxvYWQoaW5wdXRTdHJlYW0sIG9wdGlvbnMpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NzFhYWYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3Igb3JkZXJpbmcgY29udGVudCBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3OGI3NDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZWRpdGluZyBhbmQgcXVlcnlpbmcgc3VwcG9ydCBmb3IgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0Fic3RyYWN0U3RyaW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZmZjI2OGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlTdHJpbmcgbXNnID0gaXNWYWxpZCgoU3RyaW5nKXZhbHVlKTsKLQkJCWlmKG1zZyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLQkJCQkJCTAsIG1zZywgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YjY5OTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRvZXMgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVjawotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrIHsKLQkJCi0JcHJpdmF0ZSBEZXBlbmRlbmN5SW5mb01nciBkZXBJbmZvTWdyOwotCXByaXZhdGUgSURlcGVuZGVuY3lJbmZvIHZlSW5mbzsKLQlwcml2YXRlIGJvb2xlYW4gbW92ZSA9IGZhbHNlOwotCQotCXB1YmxpYyBDaXJjdWxhckRlcGVuZGVuY3lDaGVjayhEZXBlbmRlbmN5SW5mb01nciBtZ3IsIFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwKLQkJCQkJCQkJYm9vbGVhbiBmaWx0ZXIsIGJvb2xlYW4gbW92ZSkgewotCQlkZXBJbmZvTWdyID0gbWdyOwotCQl2ZUluZm8gPSBkZXBJbmZvTWdyLnJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KHZlLCBmaWx0ZXIsIGZhbHNlKTsKLQkJdGhpcy5tb3ZlID0gbW92ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERlcGVuZGVuY3lJbmZvTWdyIGdldERlcEluZm9NZ3IoKSB7Ci0JCXJldHVybiBkZXBJbmZvTWdyOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURlcGVuZGVuY3lJbmZvIGdldFZlSW5mbygpIHsKLQkJcmV0dXJuIHZlSW5mbzsKLQl9Ci0JCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0KLQkJaWYgKHJlYWNoYWJsZShvYmosIHRydWUsIHRydWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChtb3ZlKSB7Ci0JCQlpZighKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkpIHJldHVybiB0cnVlOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IG9ialZlQmFzZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmopLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChvYmpWZUJhc2UgIT0gbnVsbCkgewotCQkJCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gZGVwSW5mb01nci5yZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudChvYmpWZUJhc2UsIGZhbHNlLCBmYWxzZSk7CQotCQkJCWlmIChpbmZvLnJlYWNoYWJsZUJ5KHZlSW5mbykpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHJlYWNoYWJsZShPYmplY3Qgb2JqLCBib29sZWFuIGNoZWNrUmVhY2hhYmxlQnlPYmosIGJvb2xlYW4gY2hlY2tSZWFjaGFibGVUb09iaikgewotCQlpZiAoISAob2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSB2ZUluZm8uZ2V0RWxlbWVudCgpOwotCQlpZiAodmUgPT0gb2JqKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsJCQkKLQkJfQotCi0JCUlEZXBlbmRlbmN5SW5mbyBvYmpWZUluZm8gPSBkZXBJbmZvTWdyLnJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KCAoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmosIGZhbHNlLCBtb3ZlKTsJCQotCQkKLQkJaWYgKGNoZWNrUmVhY2hhYmxlQnlPYmogJiYgdmVJbmZvLnJlYWNoYWJsZUJ5KG9ialZlSW5mbykpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZiAoY2hlY2tSZWFjaGFibGVUb09iaiAmJiBvYmpWZUluZm8ucmVhY2hhYmxlQnkodmVJbmZvKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0JCQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0JCi0JcHVibGljIGJvb2xlYW4gcmVhY2hhYmxlQnkoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gcmVhY2hhYmxlKG9iaiwgdHJ1ZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWFjaGFibGVUbyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiByZWFjaGFibGUob2JqLCBmYWxzZSwgdHJ1ZSk7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYjc1M2FkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIGZpbHRlciBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVjawotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyIGV4dGVuZHMgQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgaW1wbGVtZW50cyBJRmlsdGVyIHsJCi0JCi0JcHJpdmF0ZSBNYXAgYW5jZXN0b3JNYXA7Ci0JCi0JCi0JcHVibGljIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyKERlcGVuZGVuY3lJbmZvTWdyIG1nciwgVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0JCXN1cGVyKG1nciwgdmUsIHRydWUsIGZhbHNlKTsKLQkJCi0JCQotCQkKLQl9CQkJCi0JCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmopOwotCX0KLQkKLS8qCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBWZVRvQ2hlY2soT2JqZWN0IG9iaikgewotCQlyZXR1cm4gCW9iaiBpbnN0YW5jZW9mIERvbWFpbiB8fCAJCQkJLy9nZXRTdWJkb21haW5zCi0JCQkJb2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkgfHwgCQkvL2dldFN1YkNhdGVnb3JpZXMKLQkJCQlvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCB8fCAJCQkJLy9nZXRDb250YWluZWRBcnRpZmFjdHMKLQkJCQlvYmogaW5zdGFuY2VvZiBQcmFjdGljZSB8fCAJCQkJLy9nZXRTdWJQcmFjdGljZXMKLQkJCQlvYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSB8fAkJCS8vZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzCi0JCQkJb2JqIGluc3RhbmNlb2YgQWN0aXZpdHk7CQkJCS8vZ2V0QnJlYWtkb3duRWxlbWVudHMKLQl9Ki8KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lDaGVja2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5Q2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZDM0YjQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaGFzIHN0YXRpYyBtZXRob2RzIHRoYXQgY2hlY2sgZm9yIGN5Y2xlcyBpbiB0aGUgZWxlbWVudCBkZXBlbmRlbmN5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZXBlbmRlbmN5Q2hlY2tlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVN0YXR1cyBFUlJPUl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG5ld0NoZWNrIAkJPSB0cnVlOwkJCS8vdGVtcCBmbGFnLCB3aWxsIGJlIHJlbW92ZWQhCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG5ld0NoZWNrQWN0IAk9IHRydWU7CQkJLy90ZW1wIGZsYWcsIHdpbGwgYmUgcmVtb3ZlZCEKLQotCS8qKgotCSAqIENoZWNrcyBmb3IgdGhlIGN5Y2xlcyBpbiB0aGUgZGVwZW5kZW5jeSBncmFwaCBvZiB0aGUgZ2l2ZW4gZmVhdHVyZSBpZiB0aGUKLQkgKiBnaXZlbiB2YWx1ZSBpcyBhZGRlZC9hc3NpZ25lZCB0byBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvd25lciBvZiB0aGUgZmVhdHVyZQotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgZmVhdHVyZSB0byBjaGVjayBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGFkZGVkL2Fzc2lnbmVkIHRvIHRoZSBmZWF0dXJlCi0JICogQHJldHVybiBjaGVjayBzdGF0dXMsIE9LIGlmIG5vIGN5Y2xlLCBFUlJPUiBpZiB0aGVyZSB3aWxsIGJlIGNpcmN1bGFyCi0JICogICAgICAgICBkZXBlbmRlbmN5Ci0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KEVPYmplY3Qgb3duZXIsCi0JCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUykgewotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgb3duZXI7Ci0JCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQlyZXR1cm4gY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYWN0aXZpdHksIChBY3Rpdml0eSkgdmFsdWUsIHR5cGUpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKSB7Ci0JCQlpZiAoaXNDaXJjdWxhckRlcGVuZGVuY3koKFZhcmlhYmlsaXR5RWxlbWVudCkgb3duZXIsCi0JCQkJCShWYXJpYWJpbGl0eUVsZW1lbnQpIHZhbHVlKSkgewotCQkJCXJldHVybiBFUlJPUl9TVEFUVVM7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUykgewotCQkJaWYgKCFjaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKChEZWxpdmVyYWJsZSl2YWx1ZSwgKERlbGl2ZXJhYmxlKW93bmVyKSkgewotCQkJCXJldHVybiBFUlJPUl9TVEFUVVM7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IodmFsdWUpIHsKLQotCQkJCQkvKioKLQkJCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkJICovCi0JCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDBMOwotCi0JCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQlpZiAoZmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpLmlzSW5zdGFuY2Uob2JqZWN0KSkgewotCQkJCQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQlpZiAoZmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpLmlzSW5zdGFuY2UoCi0JCQkJCQkJCQkJCWVsZW1lbnQpKSB7Ci0JCQkJCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCX0KLQotCQkJCX07Ci0KLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJaWYgKGl0ZXIubmV4dCgpID09IG93bmVyKSB7Ci0JCQkJCQlyZXR1cm4gRVJST1JfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCWlmIChmZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZSh2YWx1ZSkpIHsKLQkJCQkJRU9iamVjdCB2ID0gKEVPYmplY3QpIHZhbHVlOwotCQkJCQlkbyB7Ci0JCQkJCQlpZiAodiA9PSBvd25lcikgewotCQkJCQkJCXJldHVybiBFUlJPUl9TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCQlPYmplY3QgbyA9IHYuZUdldChmZWF0dXJlKTsKLQkJCQkJCWlmIChmZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZShvKSkgewotCQkJCQkJCXYgPSAoRU9iamVjdCkgbzsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdiA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0gd2hpbGUgKHYgIT0gbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGZvciBjaXJjdWxhciBkZXBlbmRlbmN5IGlmIHRoZSBnaXZlbiBhY3Rpdml0eSBpcyBhcHBsaWVkIHRvIHRoZQotCSAqIGdpdmVuIHRhcmdldCBhY3Rpdml0eSB2aWEgZXh0ZW5kIG9yIGNvcHkuCi0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5IGFjdGl2aXR5IHRvIGFwcGx5Ci0JICogQHBhcmFtIHRhcmdldCB0YXJnZXQgYWN0aXZpdHkgdG8gYWRkIGV4dGVuc2lvbiBvciBjb3B5IG9mIHRoZSBnaXZlbiBhY3Rpdml0eQotCSAqIEByZXR1cm4gc3RhdHVzIG9mIHRoaXMgY2hlY2sKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koQWN0aXZpdHkgYWN0aXZpdHksIEFjdGl2aXR5IHRhcmdldCkgewotCQlpZiAoaXNQYXJlbnQoYWN0aXZpdHksIHRhcmdldCkpIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7IHRhcmdldC5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzEsCi0JCQkJCQkJYXJncyk7Ci0KLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJUHJvY2VzcyBwcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRhcmdldCk7Ci0JCWlmKCFuZXdDaGVja0FjdCAmJiBoYXNDeWNsaWNEZXBlbmRlbmN5KGFjdGl2aXR5LCBwcm9jZXNzKSB8fAotCQkJCW5ld0NoZWNrQWN0ICYmIHNvdXJjZVJlYWNoYWJsZUJ5VGFyZ2V0KGFjdGl2aXR5LCB0YXJnZXQpKSB7Ci0JCQlPYmplY3RbXSBhcmdzID0geyBhY3Rpdml0eS5nZXROYW1lKCksIHByb2Nlc3MuZ2V0TmFtZSgpIH07Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKGFjdGl2aXR5KSkgewotCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0aXZpdHkuZ2V0TmFtZSgpLCBwcm9jZXNzLmdldE5hbWUoKSB9OwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuYXBwbHlfcGF0dGVybl9lcnJvcl9tc2cxLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCi0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzQ3ljbGljRGVwZW5kZW5jeShBY3Rpdml0eSBhY3Rpdml0eSwgUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYWN0aXZpdHkpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChBY3Rpdml0eSkgb2JqZWN0KQotCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgdlR5cGUgPSB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCWlmIChiYXNlICE9IG51bGwgJiYgKHZUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpKSB7Ci0JCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbAotCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGJhc2UpOwotCQkJCWlmIChwcm9jID09IHByb2Nlc3MpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcGFyZW50IGlzIGEgc3VwZXIgYWN0aXZpdHkgb2YgY2hpbGQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBjaGlsZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQYXJlbnQoQWN0aXZpdHkgcGFyZW50LCBCcmVha2Rvd25FbGVtZW50IGNoaWxkKSB7Ci0JCWZvciAoQWN0aXZpdHkgYWN0ID0gY2hpbGQuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7IGFjdCAhPSBudWxsOyBhY3QgPSBhY3QKLQkJCQkuZ2V0U3VwZXJBY3Rpdml0aWVzKCkpIHsKLQkJCWlmIChhY3QgPT0gcGFyZW50KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmb3IgY3ljbGVzIGluIGRlcGVuZGVuY3kgcGF0aCBvZiB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKiA8Y29kZT5hY3Q8L2NvZGU+IGlmIDxjb2RlPmJhc2U8L2NvZGU+IGlzIHRoZSBiYXNlIGFjdGl2aXR5IG9mCi0JICogPGNvZGU+YWN0PC9jb2RlPiBmb3IgZ2l2ZW4gdmFyaWFiaWxpdHkgdHlwZQotCSAqIAotCSAqIEBwYXJhbSBhY3QKLQkgKiBAcGFyYW0gYmFzZQotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVja0NpcmN1bGFyRGVwZW5kZW5jeShBY3Rpdml0eSBhY3QsIEFjdGl2aXR5IGJhc2UsCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSkgewotCQlyZXR1cm4gY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYWN0LCBiYXNlLCB0eXBlLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVja0NpcmN1bGFyRGVwZW5kZW5jeUFmdGVyRmlsdGVyU2VsZWN0aW9uKEFjdGl2aXR5IGFjdCwgQWN0aXZpdHkgYmFzZSwKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7Ci0JCXJldHVybiBjaGVja0NpcmN1bGFyRGVwZW5kZW5jeShhY3QsIGJhc2UsIHR5cGUsIHRydWUpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KEFjdGl2aXR5IGFjdCwgQWN0aXZpdHkgYmFzZSwKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlLCBib29sZWFuIGZpbHRlcmluZykgewotCQlpZigoYmFzZSBpbnN0YW5jZW9mIFByb2Nlc3MpCi0JCQkJJiYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpICYmICEoYWN0IGluc3RhbmNlb2YgUHJvY2VzcykpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMzsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNQYXJlbnQoYmFzZSwgYWN0KSkgewotCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0LmdldE5hbWUoKSB9OwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMSwKLQkJCQkJCQlhcmdzKTsKLQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJfSAKLQkJZWxzZSBpZiAobmV3Q2hlY2tBY3QgJiYgZmlsdGVyaW5nKSB7Ci0JCQlJRmlsdGVyIGZpbHRlciA9IGdldENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyKGFjdCk7Ci0JCQlpZiAoISBmaWx0ZXIuYWNjZXB0KGJhc2UpKSB7Ci0JCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0LmdldE5hbWUoKSwgYmFzZS5nZXROYW1lKCkgfTsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUwotCQkJCQkJLmJpbmQoCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzIsCi0JCQkJCQkJCWFyZ3MpOwotCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQllbHNlIGlmIChpc0NpcmN1bGFyRGVwZW5kZW5jeShhY3QsIGJhc2UpKSB7Ci0JCQlPYmplY3RbXSBhcmdzID0geyBhY3QuZ2V0TmFtZSgpLCBiYXNlLmdldE5hbWUoKSB9OwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMiwKLQkJCQkJCQlhcmdzKTsKLQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJfQotCQkvLyBibG9jayBmb3IgY2hpbGRyZW4KLQkJZWxzZSBpZiAoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKGJhc2UpCi0JCQkJJiYgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKSB7Ci0JCQlPYmplY3RbXSBhcmdzID0geyBhY3QuZ2V0TmFtZSgpLCBiYXNlLmdldE5hbWUoKSB9OwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCVByb2Nlc3MgcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpOwotCQlpZihwcm9jZXNzICE9IG51bGwgJiYgaGFzQ3ljbGljRGVwZW5kZW5jeShiYXNlLCBwcm9jZXNzKSkgewotCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0LmdldE5hbWUoKSwgYmFzZS5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzIsCi0JCQkJCQkJYXJncyk7Ci0KLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCi0JLyoqCi0JICogQ2hlY2sgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kgaWYgPGNvZGU+YmFzZTwvY29kZT4gaXMgdGhlIGJhc2UgZWxlbWVudAotCSAqIG9mIHRoZSBnaXZlbiA8Y29kZT5lbGVtZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZQotCSAqICAgICAgICAgICAgYmFzZSBlbGVtZW50Ci0JICogQHJldHVybiBzdGF0dXMgd2hpY2ggaW5kaWNhdGVzIGNpcmN1bGFyIGRlcGVuZWRlbmN5IGlzIGRldGVjdGVkIG9yIG5vdAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaXJjdWxhckRlcGVuZGVuY3koVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSkgewotCQkvLyBzdGFuZGFyZCBjaGVjawotCQkvLwotCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IGJhc2UuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCXdoaWxlICh0eXBlICE9IFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBiYXNlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICh2ZSAhPSBudWxsICYmIHZlID09IGVsZW1lbnQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQliYXNlID0gdmU7Ci0JCQl0eXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIGdpdmVuIGRlbGl2ZXJhYmxlcyBsZWFkcyB0byBjaXJjdWxhciBkZXBlbmRlbmN5Ci0JICogCi0JICogQHBhcmFtIHRvQmVQYXJ0Ci0JICogQHBhcmFtIGRlbGl2ZXJhYmxlCi0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gaW5kaWNhdGUgd2hldGhlciBjaXJjdWxhciBkZXBlbmRlbmN5IGlzCi0JICogICAgICAgICBkZXRlY3RlZCwgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgaXMgbm8gY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKERlbGl2ZXJhYmxlIHRvQmVQYXJ0LAotCQkJRGVsaXZlcmFibGUgZGVsaXZlcmFibGUpIHsKLQkJaWYgKG5ld0NoZWNrKSB7Ci0JCQlyZXR1cm4gISBzb3VyY2VSZWFjaGFibGVCeVRhcmdldCh0b0JlUGFydCwgZGVsaXZlcmFibGUpOwotCQl9Ci0JCQotCQlpZiAodG9CZVBhcnQgPT0gZGVsaXZlcmFibGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlqYXZhLnV0aWwuTGlzdCBkZWxpdmVyYWJsZXMgPSB0b0JlUGFydC5nZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKTsKLQkJaWYgKGRlbGl2ZXJhYmxlcyAhPSBudWxsICYmIGRlbGl2ZXJhYmxlcy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAoZGVsaXZlcmFibGVzLmNvbnRhaW5zKGRlbGl2ZXJhYmxlKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVsaXZlcmFibGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJcmV0dXJuIGNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoKERlbGl2ZXJhYmxlKSBvYmosCi0JCQkJCQkJZGVsaXZlcmFibGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIEN1c3RvbUNhdGVnb3J5IGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBnaXZlbgotCSAqIERlc2NpYmFibGVFbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGNjCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQW5jZXNzb3JPZihDdXN0b21DYXRlZ29yeSBjYywgRGVzY3JpYmFibGVFbGVtZW50IGUpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihjYywgZmFsc2UpIHsKLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQlyZXR1cm4gKChDdXN0b21DYXRlZ29yeSkgb2JqZWN0KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkJCQkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCX0KLQotCQl9OwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWlmIChpdGVyLm5leHQoKSA9PSBlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgY2lyY3VsYXIgZGVwZW5kZW5jeSB3aGVuIG1vdmluZyBhIGNvbGxlY3Rpb24gb2YgYXJ0aWZhY3Qgb2JqZWN0cwotCSAqIGluICJzb3VyY2VFbGVtZW50cyIgdW5kZXIgImRlc3RpbmF0aW9uIgotCSAqIAotCSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotCSAqIEBwYXJhbSBzb3VyY2VFbGVtZW50cwotCSAqIEByZXR1cm4gdHJ1ZSBpZiBubyBjaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkLCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tDaXJjdWxhckZvckFydGlmYWN0cyhBcnRpZmFjdCBkZXN0aW5hdGlvbiwKLQkJCUNvbGxlY3Rpb24gc291cmNlRWxlbWVudHMpIHsKLQkJSGFzaFNldCB2YXJpYW50U2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJY29sbGVjdFZhcmlhbnRTZXQoZGVzdGluYXRpb24sIHZhcmlhbnRTZXQsIFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKTsKLQkJY29sbGVjdFZhcmlhbnRTZXQoZGVzdGluYXRpb24sIHZhcmlhbnRTZXQsIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpOwotCQlpZiAoISBjaGVja0NpcmN1bGFyRm9yQXJ0aWZhY3RzMShkZXN0aW5hdGlvbiwgc291cmNlRWxlbWVudHMsIHZhcmlhbnRTZXQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMyKGRlc3RpbmF0aW9uLCBzb3VyY2VFbGVtZW50cyk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tDaXJjdWxhckZvckFydGlmYWN0czEoQXJ0aWZhY3QgZGVzdGluYXRpb24sCi0JCQlDb2xsZWN0aW9uIHNvdXJjZUVsZW1lbnRzLCBIYXNoU2V0IHZhcmlhbnRTZXQpIHsKLQkJaWYgKHNvdXJjZUVsZW1lbnRzID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNvdXJjZUVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJaWYob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpewotCQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBvYmo7Ci0JCQkJaWYgKHZhcmlhbnRTZXQuY29udGFpbnMoYXJ0aWZhY3QpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKCEgY2hlY2tDaXJjdWxhckZvckFydGlmYWN0czEoZGVzdGluYXRpb24sIGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpLCB2YXJpYW50U2V0KSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMyKEFydGlmYWN0IGRlc3RpbmF0aW9uLAotCQkJQ29sbGVjdGlvbiBzb3VyY2VFbGVtZW50cykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCAmJiBzb3VyY2VJc09yQWJvdmVNZSgoQXJ0aWZhY3QpIG9iaiwgZGVzdGluYXRpb24pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNvdXJjZUlzT3JBYm92ZU1lKEFydGlmYWN0IHNvdXJjZSwgQXJ0aWZhY3QgbWUpIHsKLQkJaWYgKHNvdXJjZSA9PSBtZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJT2JqZWN0IG9iaiA9IG1lLmdldENvbnRhaW5lckFydGlmYWN0KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCAmJiBzb3VyY2VJc09yQWJvdmVNZShzb3VyY2UsIChBcnRpZmFjdCkgb2JqKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJb2JqID0gbWUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QgJiYgc291cmNlSXNPckFib3ZlTWUoc291cmNlLCAoQXJ0aWZhY3QpIG9iaikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9CQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8vQ29sbGVjdCBhbGwgdmFyaWFudHMgb2YgImEiIGFuZCAiYSJzIGFuY2VzdHJvciBBcnRpZmFjdCBvYmplY3RzCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb2xsZWN0VmFyaWFudFNldChBcnRpZmFjdCBhLCBIYXNoU2V0IHZhcmlhbnRTZXQsIFZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7Ci0JCXdoaWxlIChhICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKGEsIHR5cGUpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQl2YXJpYW50U2V0LmFkZChpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCQlhID0gYS5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQl9Ci0JfQkJCQotCQotCXByaXZhdGUgc3RhdGljIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrIGdldENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgCi0JCQkJCWJvb2xlYW4gZmlsdGVyLCBib29sZWFuIG1vdmUsIGJvb2xlYW4gZG5kKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KHZlKTsJCQkJCQkKLQkJRGVwZW5kZW5jeUluZm9NZ3IgZGVwSW5mb01nciA9IG5ldyBEZXBlbmRlbmN5SW5mb01ncihsaWIpOwotCQlkZXBJbmZvTWdyLnNldERuZEJpdChkbmQpOwotCQlyZXR1cm4gbmV3IENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrKGRlcEluZm9NZ3IsIHZlLCBmaWx0ZXIsIG1vdmUgfHwgZG5kKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzb3VyY2VSZWFjaGFibGVCeVRhcmdldChWYXJpYWJpbGl0eUVsZW1lbnQgc291cmNlLCBWYXJpYWJpbGl0eUVsZW1lbnQgdGFyZ2V0KSB7Ci0JCXJldHVybiBnZXRDaXJjdWxhckRlcGVuZGVuY3lDaGVjayhzb3VyY2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLnJlYWNoYWJsZUJ5KHRhcmdldCk7Ci0JfQotCQotCS8qKgotCSAqIHJldHVybiBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2hlY2sgZmlsdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsdGVyIGdldENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSh2ZSk7CQkJCQkJCi0JCURlcGVuZGVuY3lJbmZvTWdyIGRlcEluZm9NZ3IgPSBuZXcgRGVwZW5kZW5jeUluZm9NZ3IobGliKTsKLQkJcmV0dXJuIG5ldyBDaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlcihkZXBJbmZvTWdyLCB2ZSk7Ci0JfQkKLQkKLQkvL1JldHVybiB0cnVlIGlmIG5vIGNpcmN1bGFyIGRldGVjdGVkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IGRlc3RpbmF0aW9uLAotCQkJQ29sbGVjdGlvbiBzb3VyY2VFbGVtZW50cykgewotCQlyZXR1cm4gY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudChkZXN0aW5hdGlvbiwgc291cmNlRWxlbWVudHMsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IGRlc3RpbmF0aW9uLAotCQkJQ29sbGVjdGlvbiBzb3VyY2VFbGVtZW50cywgYm9vbGVhbiBkbmQpIHsKLQkJaWYgKCEgRGVwZW5kZW5jeUluZm9NZ3IuVmVUb0NoZWNrKGRlc3RpbmF0aW9uKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUNpcmN1bGFyRGVwZW5kZW5jeUNoZWNrIGNoZWNrID0gZ2V0Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2soZGVzdGluYXRpb24sIGZhbHNlLCB0cnVlLCBkbmQpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc291cmNlRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJaWYgKCEgY2hlY2suYWNjZXB0KGl0Lm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbihWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIFZhcmlhYmlsaXR5RWxlbWVudCBiYXNlKSB7Ci0JCQlJRmlsdGVyIGZpbHRlciA9IGdldENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyKHZlKTsKLQkJCWlmICghIGZpbHRlci5hY2NlcHQoYmFzZSkpIHsKLQkJCQlPYmplY3RbXSBhcmdzID0geyB2ZS5nZXROYW1lKCksIGJhc2UuZ2V0TmFtZSgpIH07Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJCS5iaW5kKAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy52YXJpYWJpbGl0eV9lcnJvcl9tc2csCi0JCQkJCQkJCWFyZ3MpOwkJLy9Ob3QgcmlnaHQgbWVzc2FnZSwgbmVlZCB0byBhZGQgYSBuZXcgcmVzb3VjZSBzdHJpbmcgbGF0ZXIhCi0JCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vRGVwZW5kZW5jeUluZm9NZ3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lJbmZvTWdyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlNzhjYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vRGVwZW5kZW5jeUluZm9NZ3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlByb2ZpbGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBjaXJjdWxhciBkZXBlbmRlbmN5IGluZm8uCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeUluZm9NZ3IgewotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcHJvZmlsaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOwotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWI7Ci0JcHJpdmF0ZSBNYXAgcmVhY2hhYmxlSW5mb01hcDsJLy97Z3VpZCwgdXB3YXJkUmVhY2hhYmxlSW5mb30KLQlwcml2YXRlIE1hcCByZXBsYWNlck1hcDsKLQlwcml2YXRlIE1hcCBwcm9jZXNzZWQ7Ci0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGZpbHRlckVsZW1lbnQ7Ci0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1vdmVFbGVtZW50OwotCXByaXZhdGUgTGlzdCBjaXJjdWxhckxpc3Q7Ci0JcHJpdmF0ZSBib29sZWFuIGRuZEJpdCA9IGZhbHNlOwotCQotCXB1YmxpYyBEZXBlbmRlbmN5SW5mb01ncihNZXRob2RMaWJyYXJ5IGxpYikgewotCQl0aGlzLmxpYiA9IGxpYjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9nQ2lyY3VsYXJEZXBlbmRlbmN5KFN0YWNrIHRyYWNlKSB7Ci0JCWlmIChjaXJjdWxhckxpc3QgPT0gbnVsbCkgewotCQkJY2lyY3VsYXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWNpcmN1bGFyTGlzdC5hZGRBbGwodHJhY2UpOwotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0QW5kQ2xlYXJDaXJjdWxhckxpc3QoKSB7Ci0JCUxpc3QgcmV0ID0gY2lyY3VsYXJMaXN0OwotCQljaXJjdWxhckxpc3QgPSBudWxsOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlckVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCXJldHVybiBmaWx0ZXJFbGVtZW50ID09IGVsZW07Ci0JfQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01vdmVFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlyZXR1cm4gbW92ZUVsZW1lbnQgPT0gZWxlbTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0JCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhtc2cpOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeShWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB2ZTogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aCh2ZSkpOwkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gcmVnaXN0ZXJWYXJpYWJpbGl0eUVsZW1lbnQodmUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCUxpc3QgY2lyTGlzdCA9IGdldEFuZENsZWFyQ2lyY3VsYXJMaXN0KCk7Ci0JCWJvb2xlYW4gbG9vcCA9IGNpckxpc3QgIT0gbnVsbCAmJiAhY2lyTGlzdC5pc0VtcHR5KCk7Ci0JCWJvb2xlYW4gcmVwbGFjaW5nQW5jZXN0b3IgPSBpbmZvLmluaGVyaXRBbmNlc3RvcihWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCk7Ci0JCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKExpYnJhcnlFZGl0UGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWlmIChsb29wKSB7Ci0JCQlsb2coIkVycm9yPiBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkOiAiKTsJCS8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGk9MDsgaTxjaXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJSURlcGVuZGVuY3lJbmZvIGxvb3BJbmZvID0gKElEZXBlbmRlbmN5SW5mbykgY2lyTGlzdC5nZXQoaSk7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0RWxlbWVudCgpOwkJCQkJCQkKLQkJCQlsb2coIkVycm9yPiAiICsgaSArICI6ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSkpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJCi0JCQltdWx0aVN0YXR1cy5hZGQobmV3IFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgMCwgZ2VuRXJyb3JNc2coY2lyTGlzdCksIHZlLCBudWxsKSk7CQkJCi0JCX0KLQkJaWYgKHJlcGxhY2luZ0FuY2VzdG9yKSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW0gPSBpbmZvLmdldEVsZW1lbnQoKTsKLQkJCWxvZygiRXJyb3I+ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSkgKyAiIGlzIHJlcGxhY2luZyBhbiBhbmNlc3Rvci4iKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQotCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIExpYnJhcnlFZGl0UmVzb3VyY2VzLnJlcGxhY2luZ19hbmNlc3Rvcl9lcnJvcl9tc2csIHZlLCBudWxsKSk7CQkJCQkJCQotCQl9Ci0JCQotCQlyZXR1cm4gbXVsdGlTdGF0dXM7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdlbkVycm9yTXNnKExpc3QgY2lyTGlzdCkgewotCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudmFyaWFiaWxpdHlfZWxlbWVudF9jaXJjdWxhcl9sb29wX2Vycm9yX21zZzsKLQkJZm9yIChpbnQgaT0wOyBpPGNpckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUlEZXBlbmRlbmN5SW5mbyBsb29wSW5mbyA9IChJRGVwZW5kZW5jeUluZm8pIGNpckxpc3QuZ2V0KGkpOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0RWxlbWVudCgpOwkKLQkJCWlmIChpID4gMCkgewotCQkJCW1zZyArPSAiOiAiOyAvLyROT04tTkxTLTEkIAotCQkJfQotCQkJbXNnICs9IFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKTsJCi0JCX0KLQkJcmV0dXJuIG1zZzsKLQl9Ci0JCQkKLQlwdWJsaWMgSURlcGVuZGVuY3lJbmZvIHJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgCi0JCQlib29sZWFuCWlzRmlsdGVyRWxlbWVudCwgYm9vbGVhbiBpc01vdmVFbGVtZW50KSB7Ci0JCXJldHVybiByZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudCh2ZSwgaXNGaWx0ZXJFbGVtZW50LCBpc01vdmVFbGVtZW50LCBmYWxzZSk7Ci0JfQotCQotCXByaXZhdGUgSURlcGVuZGVuY3lJbmZvIHJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgCi0JCQlib29sZWFuCWlzRmlsdGVyRWxlbWVudCwgYm9vbGVhbiBpc01vdmVFbGVtZW50LCBib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJaWYgKGlzRmlsdGVyRWxlbWVudCkgewotCQkJZmlsdGVyRWxlbWVudCA9IHZlOwotCQl9Ci0JCWlmIChpc01vdmVFbGVtZW50KSB7Ci0JCQltb3ZlRWxlbWVudCA9IHZlOwotCQl9CQkKLQkJSURlcGVuZGVuY3lJbmZvIGluZm8gPSAgZ2V0UHJvY2Vzc2VkSW5mbyh2ZSk7Ci0JCWlmIChpbmZvID09IG51bGwpIHsJCQotCQkJaW5mbyA9IG5ld0RlcGVuZGVuY3lJbmZvKHRoaXMsIHZlKTsKLQkJfQotCQlpZiAoISBpbmZvLmlzQ29tcGxldGUoKSkgewotCQkJaW5mby5idWlsZChjaGVja0NpcmN1bGFyKTsKLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc2VkKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gcHJvY2Vzc2VkICE9IG51bGwgJiYgcHJvY2Vzc2VkLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEZXBlbmRlbmN5SW5mbyBnZXRQcm9jZXNzZWRJbmZvKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gcHJvY2Vzc2VkID09IG51bGwgPyBudWxsIDogKElEZXBlbmRlbmN5SW5mbykgcHJvY2Vzc2VkLmdldChlbGVtZW50LmdldEd1aWQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRvUHJvY2Vzc2VkKElEZXBlbmRlbmN5SW5mbyBpbmZvKSB7Ci0JCWlmIChwcm9jZXNzZWQgPT0gbnVsbCkgewotCQkJcHJvY2Vzc2VkID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlwcm9jZXNzZWQucHV0KGluZm8uZ2V0RWxlbWVudCgpLmdldEd1aWQoKSwgaW5mbyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRvUmVwbGFjZXJNYXAoSURlcGVuZGVuY3lJbmZvIHJlcGxhY2VySW5mbykgewotCQlpZiAocmVwbGFjZXJNYXAgPT0gbnVsbCkgewotCQkJcmVwbGFjZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJlcGxhY2VyTWFwLnB1dChyZXBsYWNlckluZm8uZ2V0RWxlbWVudCgpLmdldEd1aWQoKSwgcmVwbGFjZXJJbmZvKTsKLQl9CQotCQkKLQlwcml2YXRlIElEZXBlbmRlbmN5SW5mbyBhZGRUb1JlYWNoYWJsZUluZm9NYXAoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCWlmIChyZWFjaGFibGVJbmZvTWFwID09IG51bGwpIHsKLQkJCXJlYWNoYWJsZUluZm9NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gKElEZXBlbmRlbmN5SW5mbykgcmVhY2hhYmxlSW5mb01hcC5nZXQoZWxlbS5nZXRHdWlkKCkpOwotCQlpZiAoaW5mbyA9PSBudWxsKSB7CQkKLQkJCWluZm8gPSBuZXdEZXBlbmRlbmN5SW5mbyh0aGlzLCBlbGVtKTsKLQkJCXJlYWNoYWJsZUluZm9NYXAucHV0KGVsZW0uZ2V0R3VpZCgpLCBpbmZvKTsKLQkJfQkJCi0JCXJldHVybiBpbmZvOwotCX0KLQotCS8qCi0JICogRGV0ZWN0IGNpcmN1bGFyIGRlcGVuZGVuY3kgZm9yIHRoZSB3aG9sZSBsaWJyYXJ5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2lyY3VsYXJEZXBlbmRlbmN5KCkgIHsKLQkJYnVpbGRSZWFjaGFibGVJbmZvTWFwKCk7Ci0JCQotCQlib29sZWFuIHJlcGxhY2luZ0FjZXN0b3IgPSBmYWxzZTsKLQkJaWYgKHJlcGxhY2VyTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXBsYWNlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVXB3YXJkUmVhY2hhYmxlSW5mbyBpbmZvID0gKFVwd2FyZFJlYWNoYWJsZUluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAoaW5mby5pbmhlcml0QW5jZXN0b3IoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpKSB7Ci0JCQkJCXJlcGxhY2luZ0FjZXN0b3IgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZGVidWcgJiYgY2lyY3VsYXJMaXN0ICE9IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IENpcmN1bGFyIGxvb3BzIGRldGVjdGVkOiAiKTsJLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNpcmN1bGFyTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RhY2sgc3RhY2sgPSAoU3RhY2spIGl0Lm5leHQoKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8c3RhY2suc2l6ZSgpOyBpKyspIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gIiArIChpKSArICI6ICIgKyBzdGFjay5nZXQoaSkpOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZXBsYWNpbmdBY2VzdG9yIHx8IG51bUNpcmN1bGFyRGVwZW5kZW5jeSgpID4gMDsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgbnVtQ2lyY3VsYXJEZXBlbmRlbmN5KCkgewotCQlyZXR1cm4gY2lyY3VsYXJMaXN0ID09IG51bGwgPyAwIDogY2lyY3VsYXJMaXN0LnNpemUoKTsKLQl9Ci0JCi0JLy90byBiZSBzcGVjaWFsaXplZCBieSBzdWIgY2xhc3NlcwotCXByb3RlY3RlZCBJRGVwZW5kZW5jeUluZm8gbmV3RGVwZW5kZW5jeUluZm8oRGVwZW5kZW5jeUluZm9NZ3IgbWdyLCBNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJcmV0dXJuICBuZXcgVXB3YXJkUmVhY2hhYmxlSW5mbyh0aGlzLCBlbGVtKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVhY2hhYmxlSW5mb01hcCgpIHsKLQkJbG9uZyB1c2VkTWVtMCA9IDA7Ci0JCVJ1bnRpbWUgcnQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsgCi0JCWlmIChwcm9maWxpbmcpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlpdC5uZXh0KCk7Ci0JCQl9Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJdXNlZE1lbTAgPSBydC50b3RhbE1lbW9yeSgpIC0gcnQuZnJlZU1lbW9yeSgpOwotCQl9Ci0JCQotCQlidWlsZFJlYWNoYWJsZUluZm9NYXBfKCk7Ci0JCWlmIChwcm9maWxpbmcpIHsKLQkJCVByb2ZpbGluZ1V0aWwuZnVsbEdDKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1c2VkTWVtMDogIiArIHVzZWRNZW0wLzEwMDAgKyAiIGsgYnl0ZXMiKTsKLQkJCWxvbmcgdXNlZE1lbTEgPSBydC50b3RhbE1lbW9yeSgpIC0gcnQuZnJlZU1lbW9yeSgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTE6ICIgKyB1c2VkTWVtMS8xMDAwICsgIiBrIGJ5dGVzIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkaWZmTWVtOiAiICsgKHVzZWRNZW0xIC0gdXNlZE1lbTApLzEwMDAgKyAiIGsgYnl0ZXMiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFJlYWNoYWJsZUluZm9NYXBfKCkgewotCQlyZWFjaGFibGVJbmZvTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTGlzdCBwbHVnaW5zID0gbGliLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgcGx1Z2lucy5nZXQoaSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2luLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoVmVUb0NoZWNrKG9iaikpIHsKLQkJCQkJYWRkVG9SZWFjaGFibGVJbmZvTWFwKChNZXRob2RFbGVtZW50KSBvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlYWNoYWJsZUluZm9NYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSURlcGVuZGVuY3lJbmZvIGluZm8gPSAoSURlcGVuZGVuY3lJbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoISBwcm9jZXNzZWQoaW5mby5nZXRFbGVtZW50KCkpKSB7Ci0JCQkJaW5mby5idWlsZCh0cnVlKTsKLQkJCX0KLQkJfQkKLQotCX0JCi0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gVmVUb0NoZWNrKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIAlvYmogaW5zdGFuY2VvZiBEb21haW4gfHwgCi0JCQkJb2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkgfHwgCi0JCQkJb2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QgfHwgCi0JCQkJb2JqIGluc3RhbmNlb2YgUHJhY3RpY2UgfHwgCi0JCQkJb2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUgfHwKLQkJCQlvYmogaW5zdGFuY2VvZiBBY3Rpdml0eTsKLQl9Ci0JCi0JLyoKLQkgKiBDaGVjayBjaXJjdWxhciBkZXBlbmRlbmN5IGZvciB0aGUgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgQ2hlY2tSZXN1bHQgY2hlY2tDaXJjdWxhckRlcGVuZG5lY3koVHJhY2VyIHRyYWNlcikgewotCQlsb25nIHVzZWRNZW0wID0gMDsKLQkJUnVudGltZSBydCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOyAKLQkJaWYgKHByb2ZpbGluZykgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWl0Lm5leHQoKTsKLQkJCX0KLQkJCVByb2ZpbGluZ1V0aWwuZnVsbEdDKCk7Ci0JCQl1c2VkTWVtMCA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCX0KLQotCQlDaGVja1Jlc3VsdCByZXN1bHQgPSBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeV8odHJhY2VyKTsKLQkJCi0JCWlmIChwcm9maWxpbmcpIHsKLQkJCVByb2ZpbGluZ1V0aWwuZnVsbEdDKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1c2VkTWVtMDogIiArIHVzZWRNZW0wLzEwMDAgKyAiIGsgYnl0ZXMiKTsKLQkJCWxvbmcgdXNlZE1lbTEgPSBydC50b3RhbE1lbW9yeSgpIC0gcnQuZnJlZU1lbW9yeSgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTE6ICIgKyB1c2VkTWVtMS8xMDAwICsgIiBrIGJ5dGVzIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkaWZmTWVtOiAiICsgKHVzZWRNZW0xIC0gdXNlZE1lbTApLzEwMDAgKyAiIGsgYnl0ZXMiKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIENoZWNrUmVzdWx0IGNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5XyhUcmFjZXIgdHJhY2VyKSB7Ci0JCUNoZWNrUmVzdWx0IHJlc3VsdCA9IG5ldyBDaGVja1Jlc3VsdCgpOwotCQkKLQkJSGFzaFNldCBzZWVuID0gbmV3IEhhc2hTZXQoKTsKLQkJTGlzdCBwbHVnaW5zID0gbGliLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaWl0ID0gcGx1Z2luLmVBbGxDb250ZW50cygpOyBpaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpaXQubmV4dCgpOwotCQkJCWlmIChzZWVuLmNvbnRhaW5zKG9iaikpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXNlZW4uYWRkKG9iaik7CQkJCQotCQkJCWlmIChWZVRvQ2hlY2sob2JqKSkgewotCQkJCQlJRGVwZW5kZW5jeUluZm8gaW5mbyA9IHJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iaiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJCQkJTGlzdCBjaXJMaXN0ID0gZ2V0QW5kQ2xlYXJDaXJjdWxhckxpc3QoKTsKLQkJCQkJCi0JCQkJCWJvb2xlYW4gbG9vcCA9IGNpckxpc3QgIT0gbnVsbCAmJiAhY2lyTGlzdC5pc0VtcHR5KCk7Ci0JCQkJCWJvb2xlYW4gcmVwbGFjaW5nQW5jZXN0b3IgPSBpbmZvLmluaGVyaXRBbmNlc3RvcihWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCk7Ci0JCQkJCQotCQkJCQlpZiAobG9vcCkgewotCQkJCQkJdHJhY2VyLnRyYWNlKCJFcnJvcj4gQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZDogIik7CQkvLyROT04tTkxTLTEkCi0JCQkJCQlmb3IgKGludCBpPTA7IGk8Y2lyTGlzdC5zaXplKCk7IGkrKykgewotCQkJCQkJCUlEZXBlbmRlbmN5SW5mbyBsb29wSW5mbyA9IChJRGVwZW5kZW5jeUluZm8pIGNpckxpc3QuZ2V0KGkpOwotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGxvb3BJbmZvLmdldEVsZW1lbnQoKTsJCQkJCQkJCi0JCQkJCQkJdHJhY2VyLnRyYWNlKCJFcnJvcj4gIiArIGkgKyAiOiAiICsgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW0pKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJCXJlc3VsdC5jaXJjdWxhckxpc3QuYWRkKGNpckxpc3QpOwotCQkJCQl9Ci0JCQkJCWlmIChyZXBsYWNpbmdBbmNlc3RvcikgewotCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gaW5mby5nZXRFbGVtZW50KCk7Ci0JCQkJCQl0cmFjZXIudHJhY2UoIkVycm9yPiAiICsgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW0pICsgIiBpcyByZXBsYWNpbmcgYW4gYW5jZXN0b3IuIik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlyZXN1bHQucmVwbGFjaW5nQW5jZXN0b3JMaXN0LmFkZChpbmZvKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQkJCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDaGVja1Jlc3VsdCB7Ci0JCXB1YmxpYyBMaXN0IGNpcmN1bGFyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcHVibGljIExpc3QgcmVwbGFjaW5nQW5jZXN0b3JMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJcHVibGljIGludCBnZXRFcnJvckNvdW50KCkgewotCQkJcmV0dXJuIGNpcmN1bGFyTGlzdC5zaXplKCkgKyByZXBsYWNpbmdBbmNlc3Rvckxpc3Quc2l6ZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGdldENpcmN1bGFyRWxlbWVudENvdW50KCkgewotCQkJaW50IGNvdW50ID0gcmVwbGFjaW5nQW5jZXN0b3JMaXN0LnNpemUoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjaXJjdWxhckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgY2lyY3VsYXJMaXN0LmdldChpKTsKLQkJCQlpbnQgc3ogPSBsaXN0ID09IG51bGwgPyAwIDogbGlzdC5zaXplKCk7Ci0JCQkJY291bnQgKz0gc3o7Ci0JCQl9Ci0JCQlyZXR1cm4gY291bnQ7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEbmRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlyZXR1cm4gZG5kQml0ICYmIG1vdmVFbGVtZW50ID09IGVsZW07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERuZEJpdChib29sZWFuIGIpIHsKLQkJZG5kQml0ID0gYjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5VmFsaWRhdGlvbk1nci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vRGVwZW5kZW5jeVZhbGlkYXRpb25NZ3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY0MmNiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5VmFsaWRhdGlvbk1nci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBhbGwgZGVwZW5kZW5jeSBjaGVja3MgZm9yIHZhbGlkYXRpb24KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXBlbmRlbmN5VmFsaWRhdGlvbk1nciB7Ci0JCi0JcHJpdmF0ZSBEZXBlbmRlbmN5SW5mb01nciB2ZURlcEluZm9NZ3I7Ci0JcHJpdmF0ZSBQbHVnaW5EZXBlbmRlbmN5SW5mb01nciBwbHVnaW5EZXBJbmZvTWdyOwotCQotCXB1YmxpYyBEZXBlbmRlbmN5VmFsaWRhdGlvbk1ncihNZXRob2RMaWJyYXJ5IGxpYikgewotCQl2ZURlcEluZm9NZ3IgPSBuZXcgRGVwZW5kZW5jeUluZm9NZ3IobGliKTsKLQkJcGx1Z2luRGVwSW5mb01nciA9IG5ldyBQbHVnaW5EZXBlbmRlbmN5SW5mb01ncihsaWIpOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJcmV0dXJuIHZlRGVwSW5mb01nci5jaGVja0NpcmN1bGFyRGVwZW5kbmVjeSgoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KTsKLQkJfQotCQkKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiBwbHVnaW5EZXBJbmZvTWdyLmNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KChNZXRob2RQbHVnaW4pIGVsZW1lbnQpOwotCQl9CQkKLQkJCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjkwOTJmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgZGVwZW5kZW5jeSBpbmZvIHVzZWQgaW4gY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVja2luZwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVwZW5kZW5jeUluZm8gewotCQotCXZvaWQgYnVpbGQoYm9vbGVhbiBjaGVja0NpcmN1bGFyKTsKLQkKLQlib29sZWFuIGlzQ29tcGxldGUoKTsKLQkKLQlib29sZWFuIHJlYWNoYWJsZUJ5KElEZXBlbmRlbmN5SW5mbyBpbmZvKTsKLQkKLQlib29sZWFuIGluaGVyaXRBbmNlc3RvcihWYXJpYWJpbGl0eVR5cGUgdHlwZSk7Ci0JCi0JTWV0aG9kRWxlbWVudCBnZXRFbGVtZW50KCk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JTmFtZVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JTmFtZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwNDYyODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSU5hbWVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBwcm92aWRlIG5hbWUgZm9yIGEgc3BlY2lmaWVkIG9iamVjdAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEphbiAzMSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTmFtZVByb3ZpZGVyIHsKLQlTdHJpbmcgZ2V0TmFtZShPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzE0MmIyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHZhbGlkYXRvci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgMSwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0b3IgewotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gc3RyaW5nLiBSZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiB0aGUKLQkgKiBuZXcgdGV4dCBpcyBpbnZhbGlkLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGVycm9yLgotCSAqIE5vdGUgdGhhdCB0aGUgZW1wdHkgc3RyaW5nIGlzIG5vdCB0cmVhdGVkIHRoZSBzYW1lIGFzIDxjb2RlPm51bGw8L2NvZGU+OwotCSAqIGl0IGluZGljYXRlcyBhbiBlcnJvciBzdGF0ZSBidXQgd2l0aCBubyBtZXNzYWdlIHRvIGRpc3BsYXkuCi0JICogCi0JICogQHBhcmFtIG5ld1RleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRvIGNoZWNrIGZvciB2YWxpZGl0eQotCSAqIAotCSAqIEByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBlcnJvcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCk7Ci0JCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBnaXZlbiBvYmplY3QgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byB2YWxpZGF0ZQotCSAqIEByZXR1cm4gYSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JVmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSVZhbGlkYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2ZhZjBiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JVmFsaWRhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci0KLS8qKgotICogRmFjdG9yeSBpbnRlcmZhY2UgdG8gY3JlYXRlIHZhcmlvdXMgdmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBzdHJpbmcgdmFsdWUgb2YKLSAqIHNwZWNpZmllZCBvYmplY3QgZmVhdHVyZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsaWRhdG9yRmFjdG9yeSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJVmFsaWRhdG9yRmFjdG9yeSBJTlNUQU5DRSA9IFZhbGlkYXRvckZhY3RvcnkKLQkJCS5jcmVhdGVWYWxpZGF0b3JGYWN0b3J5KCk7Ci0KLQlJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoTmFtZWRFbGVtZW50IGUsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgbmFtZSB2YWxpZGF0b3IgZm9yIGEgY29udGVudCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JSVZhbGlkYXRvciBjcmVhdGVOYW1lVmFsaWRhdG9yKE9iamVjdCBwYXJlbnQsIENvbnRlbnRFbGVtZW50IGUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBuYW1lIHZhbGlkYXRvciBmb3IgYSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JSVZhbGlkYXRvciBjcmVhdGVOYW1lVmFsaWRhdG9yKE9iamVjdCBwYXJlbnQsIE5hbWVkRWxlbWVudCBlKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgbmFtZSB2YWxpZGF0b3IgZm9yIGFuIGVsZW1lbnQgb2YgbmV3VHlwZSB3aXRoIG5hbWUgb2YgZS5nZXROYW1lKCkKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgTmFtZWRFbGVtZW50IGUsIEVDbGFzcyBuZXdUeXBlKTsKLQotCUlWYWxpZGF0b3IgY3JlYXRlUHJlc2VudGF0aW9uTmFtZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LAotCQkJRGVzY3JpYmFibGVFbGVtZW50IGUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHZhbGlkYXRvciBmb3IgdGhlIGdpdmVuIGZlYXR1cmUgb2YgdGhlIGdpdmVuIG9iamVjdC4gVGhlIG9iamVjdAotCSAqIGlzIHJlZmVyZW5jZWQgYnkgdGhlIGdpdmVuIHBhcmVudCB2aWEgdGhlIHNwZWNpZmllZCByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSByZWZlcmVuY2UgCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgZmVhdHVyZSB0byB2YWxpZGF0ZSBpdHMgdmFsdWUKLQkgKiBAcGFyYW0gZUNsYXNzCi0JICogICAgICAgICAgICB0aGUgRUNsYXNzIG9mIHRoZSBvYmplY3QgdG8gdmFsaWRhdGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgICAgIG5vdCBhcHBsaWNhYmxlCi0JICogQHJldHVybgotCSAqLwotCUlWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKEVPYmplY3QgcGFyZW50LCBFUmVmZXJlbmNlIHJlZmVyZW5jZSwKLQkJCUVDbGFzcyBlQ2xhc3MsIEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSk7Ci0JCi0JSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoRU9iamVjdCBwYXJlbnQsIEVSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQkJSUZpbHRlciBjaGlsZEZpbHRlciwgRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKTsJCi0JCi0JSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgRUNsYXNzIGVDbGFzcywgRU9iamVjdCBvYmplY3QsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vTmFtZUNoZWNrZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL05hbWVDaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljNzEyNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vTmFtZUNoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRlZmluZXMgdmFyaW91cyBzdGF0aWMgbWV0aG9kcyB0byB2YWxpZGF0ZSBuYW1lIG9mIHNwZWNpZmllZAotICogb2JqZWN0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOYW1lQ2hlY2tlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9URVhUID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZWxlbWVudF90ZXh0OyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU5hbWVQcm92aWRlciBwcmVzZW50YXRpb25OYW1lUHJvdmlkZXIgPSBuZXcgSU5hbWVQcm92aWRlcigpIHsKLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IG9iamVjdCkgewotCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXJldHVybiBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QpOwotCQkJfQotCQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChEZXNjcmliYWJsZUVsZW1lbnQpb2JqZWN0KS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQl9OwotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlPYmplY3QgcGFyZW50LCBPYmplY3QgZSwgZmluYWwgQ2xhc3MgdHlwZSwKLQkJCUlOYW1lUHJvdmlkZXIgbmFtZVByb3ZpZGVyLCBTdHJpbmcgbmV3TmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc2lvbiwKLQkJCWJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgewotCQlJRmlsdGVyIGNoaWxkRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIHR5cGUuaXNJbnN0YW5jZShvYmopOwotCQkJfQotCi0JCX07Ci0KLQkJcmV0dXJuIGNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBlLCBjaGlsZEZpbHRlciwgbmFtZVByb3ZpZGVyLAotCQkJCW5ld05hbWUsIHN1cHByZXNpb24sIGlnbm9yZVN1cHByZXNzZWQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlPYmplY3QgcGFyZW50LCBPYmplY3QgZSwgSUZpbHRlciBjaGlsZEZpbHRlciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBuYW1lRmVhdHVyZSwgU3RyaW5nIG5ld05hbWUsCi0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkKSB7Ci0JCXJldHVybiBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgZSwgY2hpbGRGaWx0ZXIsCi0JCQkJY3JlYXRlTmFtZVByb3ZpZGVyKG5hbWVGZWF0dXJlKSwgbmV3TmFtZSwgc3VwcHJlc3Npb24sCi0JCQkJaWdub3JlU3VwcHJlc3NlZCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU9iamVjdCBwYXJlbnQsIE9iamVjdCBlLCBJRmlsdGVyIGNoaWxkRmlsdGVyLAotCQkJSU5hbWVQcm92aWRlciBuYW1lUHJvdmlkZXIsIFN0cmluZyBuZXdOYW1lLAotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIGJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgCi0JewotCQlpZiAoaWdub3JlU3VwcHJlc3NlZCkKLQkJCWlmIChzdXBwcmVzc2lvbiAhPSBudWxsICYmIHN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZChlKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCi0JCS8vIGdldCBjaGlsZHJlbiBvZiB0aGUgcm9sbGVkLWRvd24gZGFwdGVyCi0JCS8vCi0JCWJvb2xlYW4gd2FzUm9sbGVkVXAgPSBmYWxzZTsKLQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJYnNJdGVtUHJvdmlkZXIgPSAoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpOwotCQkJd2FzUm9sbGVkVXAgPSBic0l0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWlmICh3YXNSb2xsZWRVcCkgewotCQkJCWJzSXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJCX0KLQkJCWNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgZXg7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAod2FzUm9sbGVkVXApIHsKLQkJCQlic0l0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKHdhc1JvbGxlZFVwKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0ZW0gPSBpdGVyLm5leHQoKTsKLQotCQkJLy8gc2tpcCBjaGVja2luZyBvbiBzdXBwcmVzc2VkIGVsZW1lbnQKLQkJCS8vCi0vKjE3MDA1OAlpZiAoc3VwcHJlc3Npb24gIT0gbnVsbCAmJiBzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQoaXRlbSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0qLwotCi0JCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChpdGVtKTsKLQkJCWlmIChjaGlsZCAhPSBlICYmIGNoaWxkRmlsdGVyLmFjY2VwdChjaGlsZCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IG5hbWVQcm92aWRlci5nZXROYW1lKGNoaWxkKTsKLQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5ld05hbWUpKSB7Ci0JCQkJCS8vIHJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csCi0JCQkJCQkJbmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElOYW1lUHJvdmlkZXIgY3JlYXRlTmFtZVByb3ZpZGVyKAotCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIG5hbWVGZWF0dXJlKSB7Ci0JCWlmKG5hbWVGZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKSB7Ci0JCQlyZXR1cm4gcHJlc2VudGF0aW9uTmFtZVByb3ZpZGVyOyAKLQkJfQotCQkKLQkJcmV0dXJuIG5ldyBJTmFtZVByb3ZpZGVyKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IG9iamVjdCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCXJldHVybiAoU3RyaW5nKSAoKEVPYmplY3QpIG9iamVjdCkuZUdldChuYW1lRmVhdHVyZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJZmluYWwgQnJlYWtkb3duRWxlbWVudCBlLCBDbGFzcyB0eXBlLCBFU3RydWN0dXJhbEZlYXR1cmUgbmFtZUZlYXR1cmUsCi0JCQlTdHJpbmcgbmV3TmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIAotCXsKLQkJcmV0dXJuIGNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwgbnVsbCwgZSwgdHlwZSwgbmFtZUZlYXR1cmUsIG5ld05hbWUsCi0JCQkJc3VwcHJlc3Npb24sIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3QgcGFyZW50LAotCQkJZmluYWwgQnJlYWtkb3duRWxlbWVudCBlLCBDbGFzcyB0eXBlLCBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgbmFtZUZlYXR1cmUsCi0JCQlTdHJpbmcgbmV3TmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIGJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgCi0JewotCQlTdHJpbmcgbXNnID0gY2hlY2tFbXB0eShlLCBuZXdOYW1lKTsKLQkJaWYobXNnICE9IG51bGwpIHsKLQkJCXJldHVybiBtc2c7Ci0JCX0KLQotCQlpZih0eXBlID09IG51bGwpIHsKLQkJCXR5cGUgPSBjaG9vc2VUeXBlKGUpOwotCQl9Ci0JCQotCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChlKTsKLQkJCWlmKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvLyBiYXNpYyBjaGVjawotCQkvLwotCQltc2cgPSBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgZSwgdHlwZSwKLQkJCQljcmVhdGVOYW1lUHJvdmlkZXIobmFtZUZlYXR1cmUpLCBuZXdOYW1lLCBzdXBwcmVzc2lvbiwKLQkJCQlpZ25vcmVTdXBwcmVzc2VkKTsKLQotCQlpZiAobXNnICE9IG51bGwpCi0JCQlyZXR1cm4gbXNnOwotCQlJRmlsdGVyIGNoaWxkRmlsdGVyID0gbnVsbDsKLQkJaWYgKGUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJLy8gZG9uJ3QgYWxsb3cgdGVhbSB3aXRoIHRoZSBzYW1lIG5hbWUgd2l0aGluIHRoZSBzYW1lIHNjb3BlCi0JCQkvLwotCQkJY2hpbGRGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCQlyZXR1cm4gZSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvLyBQTEVBU0UgRE9OJ1QgQ0xFQU4gVVAuCi0JCS8vIENvbW1lbnRlZCBvdXQgZm9yIG5vdywgc2luY2Ugd2UgY2hhbmdlIHNjb3BlIG9mIERlbGl2ZXJhYmxlLgotCQkvLyBlbHNlIGlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JCS8vICYmICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlKS5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YKLQkJLy8gRGVsaXZlcmFibGUpIHsKLQkJLy8gY2hpbGRGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJLy8JCi0JCS8vIHB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCS8vIHJldHVybiBlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JCS8vICYmICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlKS5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YKLQkJLy8gRGVsaXZlcmFibGU7Ci0JCS8vIH0KLQkJLy8gfTsKLQkJLy8gfQotCi0JCWlmIChjaGlsZEZpbHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY2hlY2tOYW1lSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBlLCBuYW1lRmVhdHVyZSwgbmV3TmFtZSwKLQkJCQkJY2hpbGRGaWx0ZXIsIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2hlY2tFbXB0eShPYmplY3QgZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIGVsZW1lbnRUeXBlOwotCQlpZiAoZSBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJZWxlbWVudFR5cGUgPSBUbmdVdGlsLmdldFR5cGVUZXh0KChOYW1lZEVsZW1lbnQpIGUpOwotCQl9IGVsc2UgewotCQkJZWxlbWVudFR5cGUgPSBFTEVNRU5UX1RFWFQ7Ci0JCX0KLQkJaWYgKG5ld05hbWUgPT0gbnVsbCB8fCBuZXdOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7CQkJCi0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZywKLQkJCQkJU3RyVXRpbC50b0xvd2VyKGVsZW1lbnRUeXBlKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXNlZCBieQotCSAqIHtAbGluayAjY2hlY2tOYW1lKEFkYXB0ZXJGYWN0b3J5LCBCcmVha2Rvd25FbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUsIFN0cmluZywgU3VwcHJlc3Npb24sIGJvb2xlYW4pIGNoZWNrTmFtZSgpfQotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIENsYXNzIGNob29zZVR5cGUoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiBBY3Rpdml0eS5jbGFzczsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBUYXNrRGVzY3JpcHRvci5jbGFzczsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBSb2xlRGVzY3JpcHRvci5jbGFzczsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGUuZ2V0Q2xhc3MoKTsKLQkJfQotCQkvLyByZXR1cm4gQnJlYWtkb3duRWxlbWVudC5jbGFzczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU9iamVjdCBjdXJyZW50UGFyZW50LCBCcmVha2Rvd25FbGVtZW50IGUsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIG5hbWUsIElGaWx0ZXIgY2hpbGRGaWx0ZXIsCi0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkKSB7Ci0JCS8vIGNoZWNrIHVwCi0JCWZvciAoT2JqZWN0IHBhcmVudCA9IGN1cnJlbnRQYXJlbnQ7IHBhcmVudCAhPSBudWxsOykgewotCQkJU3RyaW5nIG1zZyA9IGNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBlLCBjaGlsZEZpbHRlciwKLQkJCQkJZmVhdHVyZSwgbmFtZSwgc3VwcHJlc3Npb24sIGlnbm9yZVN1cHByZXNzZWQpOwotCQkJaWYgKG1zZyAhPSBudWxsKQotCQkJCXJldHVybiBtc2c7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJfQotCi0JCS8vIGNoZWNrIGRvd24KLQkJaWYgKGN1cnJlbnRQYXJlbnQgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJY3VycmVudFBhcmVudCwgZmFsc2UpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCWlmIChjaGlsZCAhPSBlICYmIGNoaWxkRmlsdGVyLmFjY2VwdChjaGlsZCkpIHsKLQkJCQkJU3RyaW5nIGNoaWxkTmFtZSA9IChTdHJpbmcpICgoRU9iamVjdCkgY2hpbGQpLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoY2hpbGROYW1lKSkgewotCQkJCQkJLy8gcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwKLQkJCQkJCS8vIGRhdGEpOwotCQkJCQkJcmV0dXJuIE5MUwotCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZywKLQkJCQkJCQkJCQluYW1lKTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJZmluYWwgQnJlYWtkb3duRWxlbWVudCBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIG5hbWUsCi0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlyZXR1cm4gY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBmZWF0dXJlLCBuYW1lLCBzdXBwcmVzc2lvbiwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0aGUgbmFtZSBvciBwcmVzZW50YXRpb24gbmFtZSBvZiBhIGJyZWFrZG93biBlbGVtZW50IHRoYXQgaXMKLQkgKiBhbHJlYWR5IHBhcnQgb2YgYSBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBzdXBwcmVzc2lvbgotCSAqIEBwYXJhbSBpZ25vcmVTdXBwcmVzc2VkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCWZpbmFsIEJyZWFrZG93bkVsZW1lbnQgZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZyBuYW1lLAotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIGJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgCi0JewotCQlyZXR1cm4gY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCAoT2JqZWN0KW51bGwsIGUsIChDbGFzcyludWxsLCBmZWF0dXJlLCBuYW1lLCBzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5IYXZlRW1wdHlQcmVzZW50YXRpb25OYW1lKERlc2NyaWJhYmxlRWxlbWVudCBlKSB7Ci0JCWlmKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSB2VHlwZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KWUpLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJcmV0dXJuIHZUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwKLQkJCQl8fCB2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTAotCQkJCXx8IHZUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTDsJCQkKLQkJfQotCQlyZXR1cm4gZmFsc2U7CQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1BsdWdpbkRlcEluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1BsdWdpbkRlcEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTc3OWI0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaGFuZGxlcyBwbHVnaW4gZGVwZW5kZW5jeSBpbmZvIGZvciBjaXJjdWxhciBkZXBlbmRlbmN5IGNoZWNrCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luRGVwSW5mbyB7Ci0KLQlwcml2YXRlIFBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyIG1ncjsKLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBwbHVnaW47Ci0JcHJpdmF0ZSBIYXNoTWFwIHBhcmVudE1hcDsKLQlwcml2YXRlIGJvb2xlYW4gY29tcGxldGUgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgUGx1Z2luRGVwSW5mbyhQbHVnaW5EZXBlbmRlbmN5SW5mb01nciBtZ3IsIE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJdGhpcy5tZ3IgPSBtZ3I7Ci0JCXRoaXMucGx1Z2luID0gcGx1Z2luOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQlyZXR1cm4gY29tcGxldGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGJ1aWxkKGJvb2xlYW4gY2hlY2tDaXJjdWxhcikgewotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGJ1aWxkOiAiICsgdGhpcyk7CS8vJE5PTi1OTFMtMSQKLQkJfQotCQlidWlsZElubmVyKGNoZWNrQ2lyY3VsYXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRJbm5lcihib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJT2JqZWN0IGluZm8gPSBtZ3IuZ2V0UHJvY2Vzc2VkSW5mbyhnZXRQbHVnaW4oKSk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWlmIChpbmZvID09IHRoaXMgJiYgY29tcGxldGUpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IgaW4gYnVpbGRJbm5lcjogIiArIGluZm8pOwkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW1nci5hZGRUb1Byb2Nlc3NlZCh0aGlzKTsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBidWlsZElubmVyOiAiICsgdGhpcyk7CS8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7CQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQlidWlsZElubmVyXyhjaGVja0NpcmN1bGFyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSW5uZXJfKGJvb2xlYW4gY2hlY2tDaXJjdWxhcikgewotCQlMaXN0IHBhcmVudHMgPSBnZXRQbHVnaW4oKS5nZXRCYXNlcygpOwotCQlpbnQgc3ogPSBwYXJlbnRzID09IG51bGwgPyAwIDogcGFyZW50cy5zaXplKCk7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQljb21wbGV0ZSA9IHRydWU7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXBhcmVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgcHJvY2Vzc2VkUGFyZW50cyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpPCBzejsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGFyZW50RWxlbSA9IChNZXRob2RQbHVnaW4pIHBhcmVudHMuZ2V0KGkpOwotCQkJUGx1Z2luRGVwSW5mbyBwaW5mbyA9IChQbHVnaW5EZXBJbmZvKSBtZ3IuZ2V0UHJvY2Vzc2VkSW5mbyhwYXJlbnRFbGVtKTsKLQkJCWlmIChwaW5mbyA9PSBudWxsKXsKLQkJCQlwaW5mbyA9IG5ldyBQbHVnaW5EZXBJbmZvKG1nciwgcGFyZW50RWxlbSk7Ci0JCQkJcGFyZW50TWFwLnB1dChwYXJlbnRFbGVtLmdldEd1aWQoKSwgcGluZm8pOwotCQkJCXBpbmZvLmJ1aWxkSW5uZXIoY2hlY2tDaXJjdWxhcik7Ci0JCQl9IGVsc2UgewotCQkJCXBhcmVudE1hcC5wdXQocGFyZW50RWxlbS5nZXRHdWlkKCksIHBpbmZvKTsKLQkJCQlpZiAoY2hlY2tDaXJjdWxhcikgewotCQkJCQlpZiAocHJvY2Vzc2VkUGFyZW50cyA9PSBudWxsKSB7Ci0JCQkJCQlwcm9jZXNzZWRQYXJlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQl9Ci0JCQkJCXByb2Nlc3NlZFBhcmVudHMuYWRkKHBpbmZvKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY29tcGxldGUgPSB0cnVlOwotCQkJCi0JCWlmIChjaGVja0NpcmN1bGFyICYmIHByb2Nlc3NlZFBhcmVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0wOyBpPHByb2Nlc3NlZFBhcmVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZWFjaGFibGVCeSgoUGx1Z2luRGVwSW5mbykgcHJvY2Vzc2VkUGFyZW50cy5nZXQoaSkpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHJlYWNoYWJsZUJ5KFBsdWdpbkRlcEluZm8gaW5mbykgIHsKLQkJaWYgKCEgKGluZm8gaW5zdGFuY2VvZiBQbHVnaW5EZXBJbmZvKSkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBFbnRyeSByZWFjaGFibGVCeTogdGhpcyAtPiAiICsgdGhpcyk7CS8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IEVudHJ5IHJlYWNoYWJsZUJ5OiBpbmZvIC0+ICIgKyBpbmZvKTsJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsJCQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVhY2hhYmxlQnkoKFBsdWdpbkRlcEluZm8pIGluZm8sIG5ldyBTdGFjaygpLCBuZXcgSGFzaE1hcCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHJlYWNoYWJsZUJ5KFBsdWdpbkRlcEluZm8gaW5mbywgU3RhY2sgc3RhY2ssIE1hcCBzZWVuKSAgewotCQlzdGFjay5wdXNoKGluZm8pOwotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHJlYWNoYWJsZUJ5OiB0aGlzIC0+ICIgKyB0aGlzKTsJCS8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHJlYWNoYWJsZUJ5OiBpbmZvIC0+ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7CQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIHJldCA9ICByZWFjaGFibGVCeV8oaW5mbywgc3RhY2ssIHNlZW4pOwotCQlzdGFjay5wb3AoKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHJlYWNoYWJsZUJ5XyhQbHVnaW5EZXBJbmZvIGluZm8sIFN0YWNrIHN0YWNrLCBNYXAgc2VlbikgIHsKLQkJTWFwIHRlc3RNYXAgPSBpbmZvLnBhcmVudE1hcDsJCQotCQlpZiAodGVzdE1hcCA9PSBudWxsIHx8IHRlc3RNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICh0ZXN0TWFwLmNvbnRhaW5zS2V5KGdldFBsdWdpbigpLmdldEd1aWQoKSkpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IENvbnRhaW5lZCBpbiBwYXJlbnRNYXAgb2Y6ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzdGFjay5wdXNoKHRoaXMpOwotCQkJbWdyLmxvZ0NpcmN1bGFyRGVwZW5kZW5jeSgoU3RhY2spIHN0YWNrLmNsb25lKCkpOwotCQkJc3RhY2sucG9wKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKHNlZW4uY29udGFpbnNLZXkoaW5mby5nZXRQbHVnaW4oKS5nZXRHdWlkKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCQotCQlzZWVuLnB1dChpbmZvLmdldFBsdWdpbigpLmdldEd1aWQoKSwgaW5mbyk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGVzdE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5EZXBJbmZvIHBhcmVudEluZm8gPSAoUGx1Z2luRGVwSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKHBhcmVudEluZm8uY29udGFpbmVkSW4oc3RhY2spKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGNvbnRhaW5lZEluIHN0YWNrOiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlzdGFjay5wdXNoKHBhcmVudEluZm8pOwotCQkJCW1nci5sb2dDaXJjdWxhckRlcGVuZGVuY3koKFN0YWNrKSBzdGFjay5jbG9uZSgpKTsKLQkJCQlzdGFjay5wb3AoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmICAocmVhY2hhYmxlQnkocGFyZW50SW5mbywgc3RhY2ssIHNlZW4pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0JCi0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkJCQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKHBsdWdpbik7Ci0JfQotCQotCS8vVGhpcyB3b3VsZCBzY2FsZSB1cCBmb3IgcGVyZm9ybWFuY2Ugd2hlbiBpbmZvTGlzdCBnZXRzIGxhcmdlCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5lZEluKExpc3QgaW5mb0xpc3QpIHsKLQkJaW50IHN6ID0gaW5mb0xpc3QgPT0gbnVsbCA/IDAgOiBpbmZvTGlzdC5zaXplKCk7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGd1aWQgPSBnZXRQbHVnaW4oKS5nZXRHdWlkKCk7Ci0JCWlmIChzeiA9PSAxKSB7Ci0JCQlyZXR1cm4gZ3VpZC5lcXVhbHMoKChQbHVnaW5EZXBJbmZvKSBpbmZvTGlzdC5nZXQoMCkpLmdldFBsdWdpbigpLmdldEd1aWQoKSk7Ci0JCX0KLQkJTWFwIGxpc3RNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJUGx1Z2luRGVwSW5mbyBpbmZvID0gKFBsdWdpbkRlcEluZm8pIGluZm9MaXN0LmdldChpKTsKLQkJCWxpc3RNYXAucHV0KGluZm8uZ2V0UGx1Z2luKCkuZ2V0R3VpZCgpLCBpbmZvKTsKLQkJfQotCQkKLQkJcmV0dXJuIGxpc3RNYXAuY29udGFpbnNLZXkoZ3VpZCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1BsdWdpbkRlcGVuZGVuY3lJbmZvTWdyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY0MGY4MmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5Qcm9maWxpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBjaXJjdWxhciBkZXBlbmRlbmN5IGluZm8gZm9yIHBsdWdpbnMuCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IgewotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcHJvZmlsaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOwotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWI7Ci0JcHJpdmF0ZSBNYXAgcHJvY2Vzc2VkOwotCXByaXZhdGUgTGlzdCBjaXJjdWxhckxpc3Q7Ci0JCi0JcHVibGljIFBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyKE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCXRoaXMubGliID0gbGliOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBsb2dDaXJjdWxhckRlcGVuZGVuY3koU3RhY2sgdHJhY2UpIHsKLQkJaWYgKGNpcmN1bGFyTGlzdCA9PSBudWxsKSB7Ci0JCQljaXJjdWxhckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJY2lyY3VsYXJMaXN0LmFkZEFsbCh0cmFjZSk7Ci0JfQotCQotCXByaXZhdGUgTGlzdCBnZXRBbmRDbGVhckNpcmN1bGFyTGlzdCgpIHsKLQkJTGlzdCByZXQgPSBjaXJjdWxhckxpc3Q7Ci0JCWNpcmN1bGFyTGlzdCA9IG51bGw7Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1zZykgewotCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2cobXNnKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQbHVnaW5EZXBJbmZvIHJlZ2lzdGVyUGx1Z2luKE1ldGhvZFBsdWdpbiBwbHVnaW4sIGJvb2xlYW4gY2hlY2tDaXJjdWxhcikgewkJCi0JCVBsdWdpbkRlcEluZm8gaW5mbyA9ICBnZXRQcm9jZXNzZWRJbmZvKHBsdWdpbik7Ci0JCWlmIChpbmZvID09IG51bGwpIHsJCQotCQkJaW5mbyA9IG5ldyBQbHVnaW5EZXBJbmZvKHRoaXMsIHBsdWdpbik7Ci0JCX0KLQkJaWYgKCEgaW5mby5pc0NvbXBsZXRlKCkpIHsKLQkJCWluZm8uYnVpbGQoY2hlY2tDaXJjdWxhcik7Ci0JCX0KLQkJcmV0dXJuIGluZm87Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBwbHVnaW46ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgocGx1Z2luKSk7CQkvLyROT04tTkxTLTEkCi0JCX0KLQkJUGx1Z2luRGVwSW5mbyBpbmZvID0gcmVnaXN0ZXJQbHVnaW4ocGx1Z2luLCB0cnVlKTsKLQkJTGlzdCBjaXJMaXN0ID0gZ2V0QW5kQ2xlYXJDaXJjdWxhckxpc3QoKTsKLQkJYm9vbGVhbiBsb29wID0gY2lyTGlzdCAhPSBudWxsICYmICFjaXJMaXN0LmlzRW1wdHkoKTsKLQkJaWYgKGxvb3ApIHsKLQkJCWxvZygiRXJyb3I+IENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQ6ICIpOwkJLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaT0wOyBpPGNpckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlQbHVnaW5EZXBJbmZvIGxvb3BJbmZvID0gKFBsdWdpbkRlcEluZm8pIGNpckxpc3QuZ2V0KGkpOwotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGxvb3BJbmZvLmdldFBsdWdpbigpOwkJCQkJCQkKLQkJCQlsb2coIkVycm9yPiAiICsgaSArICI6ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSkpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJCWxvZygiIik7CQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgMCwgZ2VuRXJyb3JNc2coY2lyTGlzdCksIHBsdWdpbiwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdlbkVycm9yTXNnKExpc3QgY2lyTGlzdCkgewotCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudmFyaWFiaWxpdHlfZWxlbWVudF9jaXJjdWxhcl9sb29wX2Vycm9yX21zZzsKLQkJZm9yIChpbnQgaT0wOyBpPGNpckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCVBsdWdpbkRlcEluZm8gbG9vcEluZm8gPSAoUGx1Z2luRGVwSW5mbykgY2lyTGlzdC5nZXQoaSk7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW0gPSBsb29wSW5mby5nZXRQbHVnaW4oKTsJCi0JCQlpZiAoaSA+IDApIHsKLQkJCQltc2cgKz0gIjogIjsgLy8kTk9OLU5MUy0xJCAKLQkJCX0KLQkJCW1zZyArPSBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSk7CQotCQl9Ci0JCXJldHVybiBtc2c7Ci0JfQotCQkJCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc2VkKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJcmV0dXJuIHByb2Nlc3NlZCAhPSBudWxsICYmIHByb2Nlc3NlZC5jb250YWluc0tleShwbHVnaW4uZ2V0R3VpZCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBsdWdpbkRlcEluZm8gZ2V0UHJvY2Vzc2VkSW5mbyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXJldHVybiBwcm9jZXNzZWQgPT0gbnVsbCA/IG51bGwgOiAoUGx1Z2luRGVwSW5mbykgcHJvY2Vzc2VkLmdldChwbHVnaW4uZ2V0R3VpZCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9Qcm9jZXNzZWQoUGx1Z2luRGVwSW5mbyBpbmZvKSB7Ci0JCWlmIChwcm9jZXNzZWQgPT0gbnVsbCkgewotCQkJcHJvY2Vzc2VkID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlwcm9jZXNzZWQucHV0KGluZm8uZ2V0UGx1Z2luKCkuZ2V0R3VpZCgpLCBpbmZvKTsKLQl9Ci0JCi0JLyoKLQkgKiBDaGVjayBjaXJjdWxhciBkZXBlbmRlbmN5IGFtb25nIHRoZSBwbHVnaW5zIG9mIHRoZSBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBDaGVja1Jlc3VsdCBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeShUcmFjZXIgdHJhY2VyLCBib29sZWFuIGFjY3VtRXJyb3JzKSB7Ci0JCWlmICh0cmFjZXIgPT0gbnVsbCkgewotCQkJdHJhY2VyID0gbmV3IFRyYWNlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB0cmFjZShTdHJpbmcgbGluZSkge30KLQkJCX07Ci0JCX0KLQkJbG9uZyB1c2VkTWVtMCA9IDA7Ci0JCVJ1bnRpbWUgcnQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsgCi0JCWlmIChwcm9maWxpbmcpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlpdC5uZXh0KCk7Ci0JCQl9Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJdXNlZE1lbTAgPSBydC50b3RhbE1lbW9yeSgpIC0gcnQuZnJlZU1lbW9yeSgpOwotCQl9Ci0KLQkJQ2hlY2tSZXN1bHQgcmVzdWx0ID0gY2hlY2tDaXJjdWxhckRlcGVuZG5lY3lfKHRyYWNlciwgYWNjdW1FcnJvcnMpOwotCQkKLQkJaWYgKHByb2ZpbGluZykgewotCQkJUHJvZmlsaW5nVXRpbC5mdWxsR0MoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHVzZWRNZW0wOiAiICsgdXNlZE1lbTAvMTAwMCArICIgayBieXRlcyIpOwotCQkJbG9uZyB1c2VkTWVtMSA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1c2VkTWVtMTogIiArIHVzZWRNZW0xLzEwMDAgKyAiIGsgYnl0ZXMiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGRpZmZNZW06ICIgKyAodXNlZE1lbTEgLSB1c2VkTWVtMCkvMTAwMCArICIgayBieXRlcyIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgQ2hlY2tSZXN1bHQgY2hlY2tDaXJjdWxhckRlcGVuZG5lY3lfKFRyYWNlciB0cmFjZXIsIGJvb2xlYW4gYWNjdW1FcnJvcnMpIHsKLQkJQ2hlY2tSZXN1bHQgcmVzdWx0ID0gbmV3IENoZWNrUmVzdWx0KCk7Ci0JCQotCQlMaXN0IHBsdWdpbnMgPSBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJCi0JCQlQbHVnaW5EZXBJbmZvIGluZm8gPSByZWdpc3RlclBsdWdpbihwbHVnaW4sIHRydWUpOwotCQkJTGlzdCBjaXJMaXN0ID0gZ2V0QW5kQ2xlYXJDaXJjdWxhckxpc3QoKTsJCQkKLQkJCWJvb2xlYW4gbG9vcCA9IGNpckxpc3QgIT0gbnVsbCAmJiAhY2lyTGlzdC5pc0VtcHR5KCk7Ci0JCQlpZiAobG9vcCkgewotCQkJCXRyYWNlci50cmFjZSgiRXJyb3I+IENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQ6ICIpOwkJLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGk9MDsgaTxjaXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCVBsdWdpbkRlcEluZm8gbG9vcEluZm8gPSAoUGx1Z2luRGVwSW5mbykgY2lyTGlzdC5nZXQoaSk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGxvb3BJbmZvLmdldFBsdWdpbigpOwkJCQkJCQkKLQkJCQkJdHJhY2VyLnRyYWNlKCJFcnJvcj4gIiArIGkgKyAiOiAiICsgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW0pKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJcmVzdWx0LmNpcmN1bGFyTGlzdC5hZGQoY2lyTGlzdCk7Ci0JCQkJaWYgKCEgYWNjdW1FcnJvcnMpIHsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9Ci0JCX0JCQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hlY2tSZXN1bHQgewotCQlwdWJsaWMgTGlzdCBjaXJjdWxhckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlwdWJsaWMgaW50IGdldEVycm9yQ291bnQoKSB7Ci0JCQlyZXR1cm4gY2lyY3VsYXJMaXN0LnNpemUoKTsKLQkJfQkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVHJhY2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9UcmFjZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMThhNDEzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9UcmFjZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVHJhY2VyIHsKLQl2b2lkIHRyYWNlKFN0cmluZyBsaW5lKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1VuaXF1ZU5hbWVIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VbmlxdWVOYW1lSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MmE1NzNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1VuaXF1ZU5hbWVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIGhlbHBlciBjbGFzcyBmb3IgbWV0aG9kIGVsZW1lbnQgdW5pcXVlIG5hbWUgaGFuZGxpbmcKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmlxdWVOYW1lSGFuZGxlciB7Ci0JcHJpdmF0ZSBTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkKLQkvKioKLQkgKiBFbXB0eSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBVbmlxdWVOYW1lSGFuZGxlcigpIHsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJOYW1lcyhDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjxNZXRob2RFbGVtZW50PiBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCXJlZ2lzdGVyKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlclByZXNlbnRhdGlvbk5hbWVzKENvbGxlY3Rpb248RGVzY3JpYmFibGVFbGVtZW50PiBlbGVtZW50cykgewotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8RGVzY3JpYmFibGVFbGVtZW50PiBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJcmVnaXN0ZXIoZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXIoU3RyaW5nIG5hbWUpIHsKLQkJbmFtZXMuYWRkKG5hbWUpOwkJCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKFN0cmluZyBvbGROYW1lKSB7CQkKLQkJU3RyaW5nIG5hbWUgPSBvbGROYW1lOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlKG5hbWVzLmNvbnRhaW5zKG5hbWUpKSB7Ci0JCQlpKys7Ci0JCQluYW1lID0gb2xkTmFtZSArICJfIiArIGk7CQkvLyROT04tTkxTLTEkIAotCQl9CQkJCi0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkKLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1VuaXF1ZU5hbWVQTmFtZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1VuaXF1ZU5hbWVQTmFtZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQwYjIzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VbmlxdWVOYW1lUE5hbWVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBoZWxwZXIgY2xhc3MgZm9yIHVuaXF1ZSBuYW1lIGFuZCBwcmVzZW50YXRpb24gbmFtZSBoYW5kbGluZwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFVuaXF1ZU5hbWVQTmFtZUhhbmRsZXIgewotCXByaXZhdGUgVW5pcXVlTmFtZUhhbmRsZXIgbmFtZUhhbmRsZXIgPSBuZXcgVW5pcXVlTmFtZUhhbmRsZXIoKTsKLQlwcml2YXRlIFVuaXF1ZU5hbWVIYW5kbGVyIHBuYW1lSGFuZGxlciA9IG5ldyBVbmlxdWVOYW1lSGFuZGxlcigpOwotCQotCS8qKgotCSAqIEVtcHR5IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFVuaXF1ZU5hbWVQTmFtZUhhbmRsZXIoQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBuYW1lRWxlbWVudHMsIENvbGxlY3Rpb248RGVzY3JpYmFibGVFbGVtZW50PiBwbmFtZUVsZW1lbnRzKSB7Ci0JCW5hbWVIYW5kbGVyLnJlZ2lzdGVyTmFtZXMobmFtZUVsZW1lbnRzKTsKLQkJcG5hbWVIYW5kbGVyLnJlZ2lzdGVyUHJlc2VudGF0aW9uTmFtZXMocG5hbWVFbGVtZW50cyk7CQkKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbnN1cmVVbmlxdWUoRGVzY3JpYmFibGVFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIG5hbWUgPSBuYW1lSGFuZGxlci5nZXRVbmlxdWVOYW1lKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJaWYgKCEgbmFtZS5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCQluYW1lSGFuZGxlci5yZWdpc3RlcihuYW1lKTsKLQkJfQotCQkKLQkJU3RyaW5nIHBuYW1lID0gcG5hbWVIYW5kbGVyLmdldFVuaXF1ZU5hbWUoZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQlpZiAoISBwbmFtZS5lcXVhbHMoZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCkpKSB7Ci0JCQllbGVtZW50LnNldFByZXNlbnRhdGlvbk5hbWUocG5hbWUpOwotCQkJcG5hbWVIYW5kbGVyLnJlZ2lzdGVyKG5hbWUpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVXB3YXJkUmVhY2hhYmxlSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVXB3YXJkUmVhY2hhYmxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMjM5Y2Q1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1Vwd2FyZFJlYWNoYWJsZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBoYW5kbGVzIHVwd2FyZCByZWFjaGFibGUgaW5mbyBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVja2luZwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFVwd2FyZFJlYWNoYWJsZUluZm8gaW1wbGVtZW50cyBJRGVwZW5kZW5jeUluZm8gewotCi0JcHJpdmF0ZSBEZXBlbmRlbmN5SW5mb01nciBtZ3I7Ci0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBIYXNoTWFwIHBhcmVudE1hcDsKLQlwcml2YXRlIGJvb2xlYW4gY29tcGxldGUgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgVXB3YXJkUmVhY2hhYmxlSW5mbyhEZXBlbmRlbmN5SW5mb01nciBtZ3IsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLm1nciA9IG1ncjsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGNvbXBsZXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBidWlsZChib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBidWlsZDogIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVpbGRJbm5lcihjaGVja0NpcmN1bGFyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSW5uZXIoYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7Ci0JCU9iamVjdCBpbmZvID0gbWdyLmdldFByb2Nlc3NlZEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWlmIChpbmZvID09IHRoaXMgJiYgY29tcGxldGUpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IgaW4gYnVpbGRJbm5lcjogIiArIGluZm8pOwkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW1nci5hZGRUb1Byb2Nlc3NlZCh0aGlzKTsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBidWlsZElubmVyOiAiICsgdGhpcyk7CS8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7CQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQlidWlsZElubmVyXyhjaGVja0NpcmN1bGFyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSW5uZXJfKGJvb2xlYW4gY2hlY2tDaXJjdWxhcikgewotCQlMaXN0IHBhcmVudHMgPSBnZXRNaXhlZFBhcmVudExpc3QoKTsKLQkJaW50IHN6ID0gcGFyZW50cyA9PSBudWxsID8gMCA6IHBhcmVudHMuc2l6ZSgpOwotCQlpZiAoc3ogPT0gMCkgewotCQkJY29tcGxldGUgPSB0cnVlOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlwYXJlbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IHByb2Nlc3NlZFBhcmVudHMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaTwgc3o7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBwYXJlbnRFbGVtID0gKE1ldGhvZEVsZW1lbnQpIHBhcmVudHMuZ2V0KGkpOwotCQkJVXB3YXJkUmVhY2hhYmxlSW5mbyBwaW5mbyA9IChVcHdhcmRSZWFjaGFibGVJbmZvKSBtZ3IuZ2V0UHJvY2Vzc2VkSW5mbyhwYXJlbnRFbGVtKTsKLQkJCWlmIChwaW5mbyA9PSBudWxsKXsKLQkJCQlwaW5mbyA9IG5ldyBVcHdhcmRSZWFjaGFibGVJbmZvKG1nciwgcGFyZW50RWxlbSk7Ci0JCQkJcGFyZW50TWFwLnB1dChwYXJlbnRFbGVtLmdldEd1aWQoKSwgcGluZm8pOwotCQkJCXBpbmZvLmJ1aWxkSW5uZXIoY2hlY2tDaXJjdWxhcik7Ci0JCQl9IGVsc2UgewotCQkJCXBhcmVudE1hcC5wdXQocGFyZW50RWxlbS5nZXRHdWlkKCksIHBpbmZvKTsKLQkJCQlpZiAoY2hlY2tDaXJjdWxhcikgewotCQkJCQlpZiAocHJvY2Vzc2VkUGFyZW50cyA9PSBudWxsKSB7Ci0JCQkJCQlwcm9jZXNzZWRQYXJlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQl9Ci0JCQkJCXByb2Nlc3NlZFBhcmVudHMuYWRkKHBpbmZvKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY29tcGxldGUgPSB0cnVlOwotCQkJCi0JCWlmIChjaGVja0NpcmN1bGFyICYmIHByb2Nlc3NlZFBhcmVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0wOyBpPHByb2Nlc3NlZFBhcmVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZWFjaGFibGVCeSgoSURlcGVuZGVuY3lJbmZvKSBwcm9jZXNzZWRQYXJlbnRzLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVhY2hhYmxlQnkoSURlcGVuZGVuY3lJbmZvIGluZm8pICB7Ci0JCWlmICghIChpbmZvIGluc3RhbmNlb2YgVXB3YXJkUmVhY2hhYmxlSW5mbykpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gRW50cnkgcmVhY2hhYmxlQnk6IHRoaXMgLT4gIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBFbnRyeSByZWFjaGFibGVCeTogaW5mbyAtPiAiICsgaW5mbyk7CS8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7CQkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlYWNoYWJsZUJ5KChVcHdhcmRSZWFjaGFibGVJbmZvKSBpbmZvLCBuZXcgU3RhY2soKSwgbmV3IEhhc2hNYXAoKSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZWFjaGFibGVCeShVcHdhcmRSZWFjaGFibGVJbmZvIGluZm8sIFN0YWNrIHN0YWNrLCBNYXAgc2VlbikgIHsKLQkJc3RhY2sucHVzaChpbmZvKTsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZWFjaGFibGVCeTogdGhpcyAtPiAiICsgdGhpcyk7CQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZWFjaGFibGVCeTogaW5mbyAtPiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiByZXQgPSAgcmVhY2hhYmxlQnlfKGluZm8sIHN0YWNrLCBzZWVuKTsKLQkJc3RhY2sucG9wKCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZWFjaGFibGVCeV8oVXB3YXJkUmVhY2hhYmxlSW5mbyBpbmZvLCBTdGFjayBzdGFjaywgTWFwIHNlZW4pICB7Ci0JCU1hcCB0ZXN0TWFwID0gaW5mby5wYXJlbnRNYXA7CQkKLQkJaWYgKHRlc3RNYXAgPT0gbnVsbCB8fCB0ZXN0TWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAodGVzdE1hcC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSkpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IENvbnRhaW5lZCBpbiBwYXJlbnRNYXAgb2Y6ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzdGFjay5wdXNoKHRoaXMpOwotCQkJbWdyLmxvZ0NpcmN1bGFyRGVwZW5kZW5jeSgoU3RhY2spIHN0YWNrLmNsb25lKCkpOwotCQkJc3RhY2sucG9wKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKHNlZW4uY29udGFpbnNLZXkoaW5mby5nZXRFbGVtZW50KCkuZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkKLQkJc2Vlbi5wdXQoaW5mby5nZXRFbGVtZW50KCkuZ2V0R3VpZCgpLCBpbmZvKTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSB0ZXN0TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVVwd2FyZFJlYWNoYWJsZUluZm8gcGFyZW50SW5mbyA9IChVcHdhcmRSZWFjaGFibGVJbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAocGFyZW50SW5mby5jb250YWluZWRJbihzdGFjaykpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gY29udGFpbmVkSW4gc3RhY2s6ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXN0YWNrLnB1c2gocGFyZW50SW5mbyk7Ci0JCQkJbWdyLmxvZ0NpcmN1bGFyRGVwZW5kZW5jeSgoU3RhY2spIHN0YWNrLmNsb25lKCkpOwotCQkJCXN0YWNrLnBvcCgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgIChyZWFjaGFibGVCeShwYXJlbnRJbmZvLCBzdGFjaywgc2VlbikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQkKLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCQotCXByaXZhdGUgTGlzdCBnZXRNaXhlZFBhcmVudExpc3QoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY29sbGVjdFBhcmVudExpc3QoZWxlbWVudCwgbGlzdCk7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCWNvbGxlY3RQYXJlbnRMaXN0QnlWYXJpYW50UGF0aHModmUsIGxpc3QpOwotCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwgKSB7Ci0JCQltZ3IuYWRkVG9SZXBsYWNlck1hcCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RQYXJlbnRMaXN0KE1ldGhvZEVsZW1lbnQgZWxlbSwgTGlzdCBsaXN0KSB7Ci0JCUxpc3QgcGFyZW50TGlzdCA9IGdldFBhcmVudExpc3QoZWxlbSk7Ci0JCQotCQlpbnQgc3ogPSBwYXJlbnRMaXN0ID09IG51bGwgPyAwIDogcGFyZW50TGlzdC5zaXplKCk7Ci0JCWlmIChtZ3IuaXNNb3ZlRWxlbWVudChlbGVtKSkgewotCQkJaWYgKHN6ID4gMSkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwkKLQkJCX0KLQkJfSBlbHNlIGlmIChzeiA+IDApIHsKLQkJCWxpc3QuYWRkQWxsKHBhcmVudExpc3QpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0UGFyZW50TGlzdChNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJTGlzdCBwYXJlbnRMaXN0ID0gbnVsbDsKLQkJCi0JCWlmIChlbGVtIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCXBhcmVudExpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKChDdXN0b21DYXRlZ29yeSkgZWxlbSk7Ci0JCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQlwYXJlbnRMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGVsaXZlcmFibGVzKChEZWxpdmVyYWJsZSkgZWxlbSk7CQkJCi0JCX0gZWxzZSB7CQotCQkJT2JqZWN0IHBhcmVudCA9IGdldFNhbWVUeXBlUGFyZW50KGVsZW0pOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlwYXJlbnRMaXN0LmFkZChwYXJlbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJlbnRMaXN0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29sbGVjdFBhcmVudExpc3RCeVZhcmlhbnRQYXRocyhWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIExpc3QgbGlzdCkgewotCQlpZiAoISBtZ3IuaXNGaWx0ZXJFbGVtZW50KHZlKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHBhcmVudFZlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBwYXJlbnRWZSA9PSBudWxsID8gbnVsbCA6IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwgfHwgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCkgewotCQkJCWxpc3QuYWRkKHBhcmVudFZlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtZ3IuaXNEbmRFbGVtZW50KHZlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBUbmdVdGlsLmdldEltbWVkaWF0ZVZhcmlldGllcyh2ZSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkgOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZXh0ZW5kZXIgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQlpZiAoISBtZ3IuaXNGaWx0ZXJFbGVtZW50KGV4dGVuZGVyKSkgewotCQkJCWxpc3QuYWRkKGV4dGVuZGVyKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRTYW1lVHlwZVBhcmVudChNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuICgoQWN0aXZpdHkpIGVsZW0pLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQl9Ci0JCQkKLQkJTWV0aG9kRWxlbWVudCBwYXJlbnQgPSAoTWV0aG9kRWxlbWVudCkgZWxlbS5lQ29udGFpbmVyKCk7Ci0JCXJldHVybiBwYXJlbnQuZ2V0VHlwZSgpID09IGVsZW0uZ2V0VHlwZSgpID8gcGFyZW50IDogbnVsbDsKLQl9CQkKLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpbmhlcml0QW5jZXN0b3IoVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHBhcmVudFZlID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKHBhcmVudFZlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpLmdldFZhcmlhYmlsaXR5VHlwZSgpICE9IHR5cGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlBcnJheUxpc3QgbWl4UGFyZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsJCi0JCWNvbGxlY3RQYXJlbnRMaXN0KGVsZW1lbnQsIG1peFBhcmVudExpc3QpOwotCQlpZiAobWl4UGFyZW50TGlzdCAhPSBudWxsICYmIG1peFBhcmVudExpc3QuY29udGFpbnMocGFyZW50VmUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVVwd2FyZFJlYWNoYWJsZUluZm8gcGFyZW50VmVJbmZvID0gKFVwd2FyZFJlYWNoYWJsZUluZm8pIHBhcmVudE1hcC5nZXQocGFyZW50VmUuZ2V0R3VpZCgpKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmVudE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlVcHdhcmRSZWFjaGFibGVJbmZvIHBhcmVudEluZm8gPSAoVXB3YXJkUmVhY2hhYmxlSW5mbykgaXQubmV4dCgpOwotCQkJaWYgIChwYXJlbnRWZUluZm8gPT0gcGFyZW50SW5mbykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHBhcmVudFZlSW5mby5yZWFjaGFibGVCeShwYXJlbnRJbmZvKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLy9UaGlzIHdvdWxkIHNjYWxlIHVwIGZvciBwZXJmb3JtYW5jZSB3aGVuIGluZm9MaXN0IGdldHMgbGFyZ2UKLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbmVkSW4oTGlzdCBpbmZvTGlzdCkgewotCQlpbnQgc3ogPSBpbmZvTGlzdCA9PSBudWxsID8gMCA6IGluZm9MaXN0LnNpemUoKTsKLQkJaWYgKHN6ID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgZ3VpZCA9IGdldEVsZW1lbnQoKS5nZXRHdWlkKCk7Ci0JCWlmIChzeiA9PSAxKSB7Ci0JCQlyZXR1cm4gZ3VpZC5lcXVhbHMoKChJRGVwZW5kZW5jeUluZm8pIGluZm9MaXN0LmdldCgwKSkuZ2V0RWxlbWVudCgpLmdldEd1aWQoKSk7Ci0JCX0KLQkJTWFwIGxpc3RNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJSURlcGVuZGVuY3lJbmZvIGluZm8gPSAoSURlcGVuZGVuY3lJbmZvKSBpbmZvTGlzdC5nZXQoaSk7Ci0JCQlsaXN0TWFwLnB1dChpbmZvLmdldEVsZW1lbnQoKS5nZXRHdWlkKCksIGluZm8pOwotCQl9Ci0JCQotCQlyZXR1cm4gbGlzdE1hcC5jb250YWluc0tleShndWlkKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdHVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlOTYyZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25TdGF0dXMgZXh0ZW5kcyBTdGF0dXMgewotCi0JcHJpdmF0ZSBPYmplY3QgY2hlY2tlZE9iamVjdDsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JLyoqCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHBhcmFtIGNvZGUKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBjaGVja2VkT2JqZWN0Ci0JICovCi0JcHVibGljIFZhbGlkYXRpb25TdGF0dXMoaW50IHNldmVyaXR5LCBpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBjaGVja2VkT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlzdXBlcihzZXZlcml0eSwgTGlicmFyeUVkaXRQbHVnaW4uUExVR0lOX0lELCBjb2RlLCBtZXNzYWdlLCBudWxsKTsKLQkJdGhpcy5jaGVja2VkT2JqZWN0ID0gY2hlY2tlZE9iamVjdDsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRpb25TdGF0dXMoU3RyaW5nIHBsdWdpbklkLCBpbnQgc2V2ZXJpdHksIGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGNoZWNrZWRPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXN1cGVyKHNldmVyaXR5LCBwbHVnaW5JZCwgY29kZSwgbWVzc2FnZSwgbnVsbCk7Ci0JCXRoaXMuY2hlY2tlZE9iamVjdCA9IGNoZWNrZWRPYmplY3Q7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRDaGVja2VkT2JqZWN0KCkgewotCQlyZXR1cm4gY2hlY2tlZE9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0NvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcwNmEyNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLQotLyoqCi0gKiBOYW1lIHZhbGlkYXRvciBmb3IgQ29udGVudEVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvciBleHRlbmRzIFVuaXF1ZW5lc3NWYWxpZGF0b3IgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKEVPYmplY3QgY29udGFpbmVyLCBDb250ZW50RWxlbWVudCBlLAotCQkJSUZpbHRlciBjaGlsZEZpbHRlcikgewotCQlzdXBlcihjb250YWluZXIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBjaGlsZEZpbHRlciwgZSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IoRU9iamVjdCBwYXJlbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgY29udGFpbmluZ0ZlYXR1cmUsIENvbnRlbnRFbGVtZW50IGUsCi0JCQlJRmlsdGVyIGNoaWxkRmlsdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgY29udGFpbmluZ0ZlYXR1cmUsIGNoaWxkRmlsdGVyLCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5VbmlxdWVuZXNzVmFsaWRhdG9yI2lzVmFsaWQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQlDb250ZW50RWxlbWVudCBlID0gKENvbnRlbnRFbGVtZW50KSBvYmplY3Q7Ci0KLQkJLy8gMTU2OTQ1IC0gRWxlbWVudCBuYW1lIG5lZWQgdG8gYWxsb3cgbW9yZSBzcGVjaWFsIGNoYXJhY3RlcnMgc3VjaCBhcyA/IAotCQkvLyBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBnZW5lcmF0ZSBhIHJlc291cmNlIGZpbGUKLQkJaWYgKCBlIGluc3RhbmNlb2YgU2VjdGlvbiApIHsKLQkJCXJldHVybiBuZXdUZXh0OwotCQl9Ci0JCQotCQlTdHJpbmcgbXNnID0gVG5nVXRpbC5jaGVja0VsZW1lbnROYW1lKG5ld1RleHQsIFRuZ1V0aWwuZ2V0VHlwZVRleHQoZSkpOwotCQlpZiAobXNnICE9IG51bGwpCi0JCQlyZXR1cm4gbXNnOwotCi0JCS8vIENoZWNrIHdoZXRoZXIgYSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsICYmIENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKGUpKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY29udGFpbmVyKTsKLQkJCWlmKHBsdWdpbiA9PSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKSkgewotCQkJCVVSSSB1cmkgPSBwbHVnaW4uZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJaWYodXJpLmlzRmlsZSgpKSB7Ci0JCQkJCUZpbGUgcGx1Z2luRGlyID0gbmV3IEZpbGUodXJpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCUlGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9ICgoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpU2VydmljZXMuZ2V0TGlicmFyeVBlcnNpc3RlcihTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSkpOwkJCQotCQkJCQlTdHJpbmcgZm9sZGVyUGF0aCA9IHBlcnNpc3Rlci5nZXRGb2xkZXJSZWxhdGl2ZVBhdGgoZSk7Ci0JCQkJCVN0cmluZyBkaXIgPSBuZXcgU3RyaW5nQnVmZmVyKHBsdWdpbkRpci5nZXRBYnNvbHV0ZVBhdGgoKSkuYXBwZW5kKAotCQkJCQkJCUZpbGUuc2VwYXJhdG9yKS5hcHBlbmQoZm9sZGVyUGF0aCkudG9TdHJpbmcoKTsKLQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gbmV3VGV4dCArIHBlcnNpc3Rlci5nZXRGaWxlRXh0ZW5zaW9uKGUpOwotCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIGZpbGVOYW1lKTsKLQkJCQkJRmlsZSBjdXJyZW50RmlsZSA9IG51bGw7Ci0JCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gZS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCQkJaWYgKGNvbnRlbnQuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQkJY3VycmVudEZpbGUgPSBuZXcgRmlsZShjb250ZW50LmVSZXNvdXJjZSgpLmdldFVSSSgpCi0JCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljdXJyZW50RmlsZSA9IGZpbGU7Ci0JCQkJCX0KLQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgIW5ld1RleHQuZXF1YWxzKGUuZ2V0TmFtZSgpKSAmJiAhZmlsZS5lcXVhbHMoY3VycmVudEZpbGUpKSB7Ci0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9tc2csIGZpbGUpOyAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5pc1ZhbGlkKG5ld1RleHQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0N1c3RvbUNhdGVnb3J5TmFtZVZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ3VzdG9tQ2F0ZWdvcnlOYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwMTBmZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ3VzdG9tQ2F0ZWdvcnlOYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBOYW1lIHZhbGlkYXRvciBmb3IgQ3VzdG9tQ2F0ZWdvcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeU5hbWVWYWxpZGF0b3IgZXh0ZW5kcyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IgewotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGNoaWxkRmlsdGVyCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5TmFtZVZhbGlkYXRvcihDdXN0b21DYXRlZ29yeSBwYXJlbnQsIEN1c3RvbUNhdGVnb3J5IGUsCi0JCQlJRmlsdGVyIGNoaWxkRmlsdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTLCBlLCBjaGlsZEZpbHRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9Eb05vdGhpbmdWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0RvTm90aGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNTUyYmIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0RvTm90aGluZ1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBWYWxpZGF0b3IgdGhhdCB2YWxpZGF0ZXMgbm90aGluZy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgNCwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRG9Ob3RoaW5nVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEb05vdGhpbmdWYWxpZGF0b3IgSU5TVEFOQ0UgPSBuZXcgRG9Ob3RoaW5nVmFsaWRhdG9yKCk7Ci0KLQlwcml2YXRlIERvTm90aGluZ1ZhbGlkYXRvcigpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvTWV0aG9kQ29uZmlndXJhdGlvbk5hbWVWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL01ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2ZjU4MDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvTWV0aG9kQ29uZmlndXJhdGlvbk5hbWVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLQotLyoqCi0gKiBOYW1lIHZhbGlkYXRvciBmb3IgTWV0aG9kQ29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXkgMTIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uTmFtZVZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yIHsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbk5hbWVWYWxpZGF0b3IoTWV0aG9kTGlicmFyeSBsaWIsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWxpYnJhcnkgPSBsaWI7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCVN0cmluZyBjb25maWdGb2xkZXIgPSAoKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKVNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKSAKLQkJCS5nZXRGb2xkZXJSZWxhdGl2ZVBhdGgoY29uZmlnKTsKLQkJRmlsZSBkaXIgPSBuZXcgRmlsZShuZXcgRmlsZShsaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKQotCQkJCQkJLmdldFBhcmVudCgpLCBjb25maWdGb2xkZXIpOwotCQlyZXR1cm4gVG5nVXRpbC5jaGVja05hbWUoZGlyLCBsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLCBjb25maWcsCi0JCQkJbmV3VGV4dCwgVG5nVXRpbC5nZXRUeXBlVGV4dChjb25maWcpLCBmYWxzZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL01ldGhvZFBsdWdpbk5hbWVWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL01ldGhvZFBsdWdpbk5hbWVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTVkOGNkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9NZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMQotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGx1Z2luTmFtZVZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yIHsKLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGliOwotCXByaXZhdGUgTWV0aG9kUGx1Z2luIHBsdWdpbjsJCi0KLQkvKioKLQkgKiBAcGFyYW0gbGliCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbk5hbWVWYWxpZGF0b3IoTWV0aG9kTGlicmFyeSBsaWIsIE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saWIgPSBsaWI7Ci0JCXRoaXMucGx1Z2luID0gcGx1Z2luOwotCX0KLQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCVN0cmluZyBtc2cgPSBUbmdVdGlsLmNoZWNrUGx1Z2luTmFtZShuZXdUZXh0KTsKLQkJaWYobXNnICE9IG51bGwpIHsKLQkJCXJldHVybiBtc2c7Ci0JCX0KLQkJCi0JCUZpbGUgZGlyID0gbmV3IEZpbGUobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKQotCQkJCS5nZXRQYXJlbnRGaWxlKCk7Ci0JCVN0cmluZyBlbGVtZW50VHlwZVRleHQgPSAocGx1Z2luICE9IG51bGwpID8gVG5nVXRpbC5nZXRUeXBlVGV4dChwbHVnaW4pCi0JCQkJOiBUbmdVdGlsLmdldFR5cGVUZXh0KCJNZXRob2RQbHVnaW4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gVG5nVXRpbC5jaGVja05hbWUoZGlyLCBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLCBwbHVnaW4sIG5ld1RleHQsCi0JCQkJZWxlbWVudFR5cGVUZXh0LCB0cnVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL1Byb2Nlc3NDb21wb25lbnROYW1lVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9Qcm9jZXNzQ29tcG9uZW50TmFtZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYWMzMWM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL1Byb2Nlc3NDb21wb25lbnROYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLS8qKgotICogVmFsaWRhdGVzIHRoZSBuYW1lIG9mIGEgcHJvY2VzcyBjb21wb25lbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnROYW1lVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IgewotCi0JcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSBwYXJlbnQ7Ci0KLQlwcml2YXRlIFByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50TmFtZVZhbGlkYXRvcihQcm9jZXNzUGFja2FnZSBwYXJlbnQsCi0JCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLnByb2NDb21wID0gcHJvY0NvbXA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCVN0cmluZyByZWxhdGl2ZVBhdGggPSAoKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKVNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKQotCQkJLmdldEZvbGRlclJlbGF0aXZlUGF0aChwcm9jQ29tcCk7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwYXJlbnQpOwotCQlGaWxlIGRpciA9IG5ldyBGaWxlKAotCQkJCW5ldyBGaWxlKHBsdWdpbi5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkKLQkJCQkJCS5nZXRQYXJlbnQoKQotCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHJlbGF0aXZlUGF0aCk7Ci0JCWlmICghIG5ld1RleHQuZXF1YWxzKFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUobmV3VGV4dCkpKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3IzX21zZywgbmV3VGV4dCk7IAotCQl9Ci0JCXJldHVybiBUbmdVdGlsLmNoZWNrTmFtZShkaXIsIHBhcmVudC5nZXRDaGlsZFBhY2thZ2VzKCksIHByb2NDb21wLAotCQkJCW5ld1RleHQsIFRuZ1V0aWwuZ2V0VHlwZVRleHQocHJvY0NvbXApLCB0cnVlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9VbmlxdWVuZXNzVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9VbmlxdWVuZXNzVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMTE2NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVW5pcXVlbmVzc1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFZhbGlkYXRlcyB0aGUgdW5pcXVlbmVzcyBvZiBhbiBvYmplY3Qgd2l0aGluIGEgZ2l2ZW4gZmVhdHVyZSB0aGF0IGNvbnRhaW5zIGl0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW5pcXVlbmVzc1ZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCXByb3RlY3RlZCBFT2JqZWN0IG9iamVjdDsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQlwcml2YXRlIFN0cmluZyBmZWF0dXJlTmFtZTsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGNvbnRhaW5pbmdGZWF0dXJlOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGNoaWxkRmlsdGVyOwotCi0JcHJvdGVjdGVkIEVPYmplY3QgY29udGFpbmVyOwotCi0JcHVibGljIFVuaXF1ZW5lc3NWYWxpZGF0b3IoRU9iamVjdCBjb250YWluZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgY29udGFpbmluZ0ZlYXR1cmUsIElGaWx0ZXIgY2hpbGRGaWx0ZXIsCi0JCQlFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdGhpcyhjb250YWluZXIsIGNvbnRhaW5pbmdGZWF0dXJlLCBjaGlsZEZpbHRlciwgb2JqLCBmZWF0dXJlLCBTdHJVdGlsCi0JCQkJLnRvTG93ZXIoVG5nVXRpbC5nZXRGZWF0dXJlVGV4dChmZWF0dXJlKSkpOwotCX0KLQotCXB1YmxpYyBVbmlxdWVuZXNzVmFsaWRhdG9yKEVPYmplY3QgY29udGFpbmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGNvbnRhaW5pbmdGZWF0dXJlLCBJRmlsdGVyIGNoaWxkRmlsdGVyLAotCQkJRU9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7Ci0JCW9iamVjdCA9IG9iajsKLQkJdGhpcy5jb250YWluaW5nRmVhdHVyZSA9IGNvbnRhaW5pbmdGZWF0dXJlOwotCQl0aGlzLmNoaWxkRmlsdGVyID0gY2hpbGRGaWx0ZXI7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMuZmVhdHVyZU5hbWUgPSBmZWF0dXJlTmFtZTsKLQl9Ci0JCi0Jdm9pZCBzZXRDaGlsZEZpbHRlcihJRmlsdGVyIGNoaWxkRmlsdGVyKSB7Ci0JCXRoaXMuY2hpbGRGaWx0ZXIgPSBjaGlsZEZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCW5ld1RleHQgPSBuZXdUZXh0LnRyaW0oKTsKLQkJaWYgKFN0clV0aWwuaXNCbGFuayhuZXdUZXh0KSkgewotCQkJLy8gcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZywKLQkJCQkJZmVhdHVyZU5hbWUpOwotCQl9Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW47Ci0JCWlmIChjb250YWluaW5nRmVhdHVyZSA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IGNvbnRhaW5lci5lQ29udGVudHMoKTsKLQkJfSBlbHNlIHsKLQkJCWNoaWxkcmVuID0gKENvbGxlY3Rpb24pIGNvbnRhaW5lci5lR2V0KGNvbnRhaW5pbmdGZWF0dXJlKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkICE9IG9iamVjdCAmJiBjaGlsZEZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSAoKEVPYmplY3QpIGNoaWxkKS5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UobmV3VGV4dCkpIHsKLQkJCQkJLy8gcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZywKLQkJCQkJCQluZXdUZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSkgewotCQlpZiAoY29udGFpbmVyID09IG51bGwpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbjsKLQkJaWYgKGNvbnRhaW5pbmdGZWF0dXJlID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gY29udGFpbmVyLmVDb250ZW50cygpOwotCQl9IGVsc2UgewotCQkJY2hpbGRyZW4gPSAoQ29sbGVjdGlvbikgY29udGFpbmVyLmVHZXQoY29udGFpbmluZ0ZlYXR1cmUpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgIT0gb2JqZWN0ICYmIGNoaWxkRmlsdGVyLmFjY2VwdChjaGlsZCkpIHsKLQkJCQlTdHJpbmcgbyA9IChTdHJpbmcpICgoRU9iamVjdCkgY2hpbGQpLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKG8uZXF1YWxzKHZhbHVlKSkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cygKLQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLAotCQkJCQkJCTAsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRmVhdHVyZVZhbHVlLAotCQkJCQkJCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCQkJCVRuZ1V0aWwuZ2V0TGFiZWwoY29udGFpbmVyKSwKLQkJCQkJCQkJCQkJCQlmZWF0dXJlTmFtZQotCQkJCQkJCQkJCQl9KSwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoKSB7Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYjVkZjQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5OYW1lQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIElWYWxpZGF0b3JGYWN0b3J5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yRmFjdG9yeSBpbXBsZW1lbnRzIElWYWxpZGF0b3JGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGNvbnRyaWJ1dGVkVmFsaWRhdG9yRmFjdG9yaWVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVZhbGlkYXRvckZhY3RvcnkgaW5zdGFuY2U7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeSNjcmVhdGVOYW1lVmFsaWRhdG9yKG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQpCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LCBDb250ZW50RWxlbWVudCBlKSB7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSAmJiBlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCXJldHVybiBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKChFT2JqZWN0KSBwYXJlbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSwgZSwKLQkJCQkJbmV3IFR5cGVGaWx0ZXIoZSkpOwotCQl9Ci0JCUVPYmplY3QgY29udGFpbmVyID0gbnVsbDsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCWNvbnRhaW5lciA9IChFT2JqZWN0KSBwYXJlbnQ7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IoY29udGFpbmVyLCBlLCBuZXcgVHlwZUZpbHRlcihlKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3RvcnkjY3JlYXRlUHJlc2VudGF0aW9uTmFtZVZhbGlkYXRvcihvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50KQotCSAqICAgICAgQ2hhbmdlZCBmcm9tIENvbnRlbnRFbGVtZW50IHRvIERlc2NyaWJhYmxlRWxlbWVudCwgYmVjYXVzZQotCSAqICAgICAgUHJlc2VudGF0aW9uTmFtZSBhdHRyaWJ1dGUgaXMgYXZhaWxhYmxlIGluIERlc2NyaWJhYmxlRWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBjcmVhdGVQcmVzZW50YXRpb25OYW1lVmFsaWRhdG9yKE9iamVjdCBwYXJlbnQsCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZSkgewotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJT2JqZWN0W10gYXJyID0gZ2V0Q2hpbGRSZWZlcmVuY2VBbmRGaWx0ZXIocGFyZW50LCBlKTsKLQkJCUVSZWZlcmVuY2UgcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGFyclswXTsKLQkJCUlGaWx0ZXIgY2hpbGRGaWx0ZXIgPSAoSUZpbHRlcikgYXJyWzFdOwotCQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGNoaWxkRmlsdGVyID09IG51bGwpIHsKLQkJCQkJY2hpbGRGaWx0ZXIgPSBuZXcgVHlwZUZpbHRlcihlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBVbmlxdWVuZXNzVmFsaWRhdG9yKChFT2JqZWN0KSBwYXJlbnQsIHJlZmVyZW5jZSwKLQkJCQkJCWNoaWxkRmlsdGVyLCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJCQkvKgotCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCSAqIAotCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5VbmlxdWVuZXNzVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLlN0cmluZykKLQkJCQkJICovCi0JCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCQkJaWYgKFN0clV0aWwuaXNCbGFuayhuZXdUZXh0KQotCQkJCQkJCQkmJiBOYW1lQ2hlY2tlcgotCQkJCQkJCQkJCS5jYW5IYXZlRW1wdHlQcmVzZW50YXRpb25OYW1lKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBzdXBlci5pc1ZhbGlkKG5ld1RleHQpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBEb05vdGhpbmdWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlciB7Ci0JCXByaXZhdGUgaW50IGNsYXNzSUQ7Ci0KLQkJcHJpdmF0ZSBFQ2xhc3MgZUNsYXNzOwotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBUeXBlRmlsdGVyKEVPYmplY3Qgb2JqKSB7Ci0JCQljbGFzc0lEID0gb2JqLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQl9Ci0KLQkJcHVibGljIFR5cGVGaWx0ZXIoRUNsYXNzIGVDbGFzcykgewotCQkJdGhpcy5lQ2xhc3MgPSBlQ2xhc3M7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJaWYgKGVDbGFzcyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGVDbGFzcy5pc0luc3RhbmNlKG9iaik7Ci0JCQl9Ci0KLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCSYmIGNsYXNzSUQgPT0gKChFT2JqZWN0KSBvYmopLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElGaWx0ZXIgbm9uRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZ2V0Q2hpbGRSZWZlcmVuY2VBbmRGaWx0ZXIoT2JqZWN0IHBhcmVudCwKLQkJCU9iamVjdCBjaGlsZCkgewotCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG51bGw7Ci0JCUlGaWx0ZXIgY2hpbGRGaWx0ZXIgPSBudWxsOwotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5Ci0JCQkJCSYmIGNoaWxkIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM7Ci0JCQkJY2hpbGRGaWx0ZXIgPSBuZXcgVHlwZUZpbHRlcigKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZKTsKLQkJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzsKLQkJCX0KLQkJfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzsKLQkJCQljaGlsZEZpbHRlciA9IG5vbkZpbHRlcjsKLQkJCX0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJcmVmZXJlbmNlID0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzsKLQkJCQljaGlsZEZpbHRlciA9IG5vbkZpbHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgcmVmZXJlbmNlLCBjaGlsZEZpbHRlciB9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5I2NyZWF0ZU5hbWVWYWxpZGF0b3Iob3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQpCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LCBmaW5hbCBOYW1lZEVsZW1lbnQgZSkgewotCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRTsKLQkJT2JqZWN0W10gYXJyID0gZ2V0Q2hpbGRSZWZlcmVuY2VBbmRGaWx0ZXIocGFyZW50LCBlKTsKLQkJRVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgYXJyWzBdOwotCQlJRmlsdGVyIGNoaWxkRmlsdGVyID0gKElGaWx0ZXIpIGFyclsxXTsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY3JlYXRlVmFsaWRhdG9yKChFT2JqZWN0KSBwYXJlbnQsIHJlZmVyZW5jZSwgY2hpbGRGaWx0ZXIsIGUsCi0JCQkJCWZlYXR1cmUpOwotCQl9Ci0JCXJldHVybiBEb05vdGhpbmdWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LCBmaW5hbCBOYW1lZEVsZW1lbnQgZSwgRUNsYXNzIG5ld1R5cGUpIHsKLQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUU7Ci0JCU9iamVjdFtdIGFyciA9IGdldENoaWxkUmVmZXJlbmNlQW5kRmlsdGVyKHBhcmVudCwgZSk7Ci0JCUVSZWZlcmVuY2UgcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGFyclswXTsKLQkJSUZpbHRlciBjaGlsZEZpbHRlciA9IG5ldyBUeXBlRmlsdGVyKG5ld1R5cGUpOwotCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCXJldHVybiBjcmVhdGVWYWxpZGF0b3IoKEVPYmplY3QpIHBhcmVudCwgcmVmZXJlbmNlLCBjaGlsZEZpbHRlciwgZSwKLQkJCQkJZmVhdHVyZSk7Ci0JCX0KLQkJcmV0dXJuIERvTm90aGluZ1ZhbGlkYXRvci5JTlNUQU5DRTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeSNjcmVhdGVOYW1lVmFsaWRhdG9yKG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihOYW1lZEVsZW1lbnQgZSwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250YWluaW5nRmVhdHVyZSA9IFRuZ1V0aWwuZ2V0Q29udGFpbmluZ0ZlYXR1cmUoZSwKLQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmIChjb250YWluaW5nRmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlFT2JqZWN0IHBhcmVudCA9IChFT2JqZWN0KSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KGUsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcykpLmdldFBhcmVudChlKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gbmV3IENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcihwYXJlbnQsCi0JCQkJCQljb250YWluaW5nRmVhdHVyZSwgKENvbnRlbnRFbGVtZW50KSBlLAotCQkJCQkJbmV3IFR5cGVGaWx0ZXIoZSkpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXJldHVybiBuZXcgUHJvY2Vzc0NvbXBvbmVudE5hbWVWYWxpZGF0b3IoCi0JCQkJCQkoUHJvY2Vzc1BhY2thZ2UpIHBhcmVudCwgKFByb2Nlc3NDb21wb25lbnQpIGUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IocGFyZW50LCBjb250YWluaW5nRmVhdHVyZSwKLQkJCQkJCW5ldyBUeXBlRmlsdGVyKGUpLCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZU5hbWVWYWxpZGF0b3IoZS5lQ29udGFpbmVyKCksIGUpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeSNjcmVhdGVWYWxpZGF0b3Iob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZSwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoRU9iamVjdCBwYXJlbnQsIEVSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQkJRUNsYXNzIGVDbGFzcywgZmluYWwgRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUlGaWx0ZXIgY2hpbGRGaWx0ZXIgPSBlQ2xhc3MgIT0gbnVsbCA/IG5ldyBUeXBlRmlsdGVyKGVDbGFzcykgOiBudWxsOwotCQlyZXR1cm4gY3JlYXRlVmFsaWRhdG9yKHBhcmVudCwgcmVmZXJlbmNlLCBjaGlsZEZpbHRlciwgb2JqZWN0LCBmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElWYWxpZGF0b3JGYWN0b3J5IGNyZWF0ZVZhbGlkYXRvckZhY3RvcnkoKSB7Ci0JCWlmIChjb250cmlidXRlZFZhbGlkYXRvckZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQljb250cmlidXRlZFZhbGlkYXRvckZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtCi0JCQkJCS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkKLQkJCQkJLmdldEV4dGVuc2lvblBvaW50KExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLAotCQkJCQkJCSJ2YWxpZGF0aW9uU3VwcG9ydCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJT2JqZWN0IGV4dCA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKQotCQkJCQkJCQkJCS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCQlib29sZWFuIHJlcGxhY2UgPSBuZXcgQm9vbGVhbihjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgicmVwbGFjZSIpKS5ib29sZWFuVmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlpZiAocmVwbGFjZSkgewotCQkJCQkJCQkJY29udHJpYnV0ZWRWYWxpZGF0b3JGYWN0b3JpZXMuY2xlYXIoKTsKLQkJCQkJCQkJCWluc3RhbmNlID0gKElWYWxpZGF0b3JGYWN0b3J5KSBleHQ7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQkJCQkJY29udHJpYnV0ZWRWYWxpZGF0b3JGYWN0b3JpZXMuYWRkKGV4dCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBWYWxpZGF0b3JGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5I2NyZWF0ZVZhbGlkYXRvcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKGZpbmFsIE9iamVjdCBwYXJlbnQsIEVDbGFzcyBlQ2xhc3MsCi0JCQlmaW5hbCBFT2JqZWN0IG9iamVjdCwgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlmaW5hbCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FCi0JCQkJCXx8IGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSkgewotCQkJCWZpbmFsIEJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0OwotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhwYXJlbnQpOwotCQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQkJZmluYWwgU3VwcHJlc3Npb24gc3VwcCA9IFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpOwotCQkJCQlyZXR1cm4gbmV3IEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yKCkgewotCi0JCQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkJCQkJcGFyZW50LCBiZSwgbnVsbCwgZmVhdHVyZSwgbmV3VGV4dCwgc3VwcCwKLQkJCQkJCQkJCXRydWUpOwotCQkJCQkJfQotCi0JCQkJCX07Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIERvTm90aGluZ1ZhbGlkYXRvci5JTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJRmlsdGVyIGdldEZpbHRlcihJRmlsdGVyIGZpbHRlciwgRU9iamVjdCBlT2JqZWN0KSB7Ci0JCXJldHVybiBmaWx0ZXIgIT0gbnVsbCA/IGZpbHRlciA6IChlT2JqZWN0ICE9IG51bGwgPyBuZXcgVHlwZUZpbHRlcigKLQkJCQllT2JqZWN0KSA6IG5vbkZpbHRlcik7Ci0JfQotCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKEVPYmplY3QgcGFyZW50LCBFUmVmZXJlbmNlIHJlZmVyZW5jZSwKLQkJCUlGaWx0ZXIgY2hpbGRGaWx0ZXIsIGZpbmFsIEVPYmplY3Qgb2JqZWN0LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FKSB7Ci0JCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQlpZiAocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkKLQkJCQkJCXx8IChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTICYmIG9iamVjdCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSkgewotCQkJCQl2YWxpZGF0b3IgPSBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKHBhcmVudCwKLQkJCQkJCQlyZWZlcmVuY2UsIChDb250ZW50RWxlbWVudCkgb2JqZWN0LCBnZXRGaWx0ZXIoCi0JCQkJCQkJCQljaGlsZEZpbHRlciwgb2JqZWN0KSk7Ci0KLQkJCQl9IGVsc2UgaWYgKChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUykKLQkJCQkJCXx8IChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTKSkgewotCQkJCQkvLyBEaXNjaXBsaW5lIGFuZCBEaXNjaXBsaW5lR3JvdXBpbmcsIFJvbGVTZXQgYW5kCi0JCQkJCS8vIFJvbGVTZXRHcm91cGluZwotCQkJCQkvLyBoYW5kbGluZwotCQkJCQkvLyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gbWFpbnRhaW4gdW5pcXVlbmVzcyBhY3Jvc3MgcGx1Z2luLgotCQkJCQl2YWxpZGF0b3IgPSBuZXcgVW5pcXVlbmVzc1ZhbGlkYXRvcihwYXJlbnQuZUNvbnRhaW5lcigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksCi0JCQkJCQkJZ2V0RmlsdGVyKGNoaWxkRmlsdGVyLCBvYmplY3QpLCBvYmplY3QsIGZlYXR1cmUpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZQotCQkJCQkmJiByZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkpIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIHBhcmVudDsKLQkJCQlpZiAocGtnLmVSZXNvdXJjZSgpLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQkJCXJldHVybiBuZXcgUHJvY2Vzc0NvbXBvbmVudE5hbWVWYWxpZGF0b3IoCi0JCQkJCQkJKFByb2Nlc3NQYWNrYWdlKSBwYXJlbnQsIChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBuZXcgVW5pcXVlbmVzc1ZhbGlkYXRvcigoRU9iamVjdCkgcGFyZW50LCByZWZlcmVuY2UsCi0JCQkJCQkJZ2V0RmlsdGVyKGNoaWxkRmlsdGVyLCBvYmplY3QpLCBvYmplY3QsIGZlYXR1cmUpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCU1ldGhvZExpYnJhcnkgbGliID0gKE1ldGhvZExpYnJhcnkpIHBhcmVudDsKLQkJCQlpZiAocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TKSB7Ci0JCQkJCWlmIChsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCQkJCXJldHVybiBuZXcgTWV0aG9kUGx1Z2luTmFtZVZhbGlkYXRvcihsaWIsCi0JCQkJCQkJCShNZXRob2RQbHVnaW4pIG9iamVjdCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IoCi0JCQkJCQkJCWxpYiwKLQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMsCi0JCQkJCQkJCW5vbkZpbHRlciwgb2JqZWN0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMpIHsKLQkJCQkJaWYgKGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJCQkJcmV0dXJuIG5ldyBNZXRob2RDb25maWd1cmF0aW9uTmFtZVZhbGlkYXRvcihsaWIsCi0JCQkJCQkJCShNZXRob2RDb25maWd1cmF0aW9uKSBvYmplY3QpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIG5ldyBVbmlxdWVuZXNzVmFsaWRhdG9yKAotCQkJCQkJCQlsaWIsCi0JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMsCi0JCQkJCQkJCW5vbkZpbHRlciwgb2JqZWN0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdmFsaWRhdG9yID0gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IocGFyZW50LCByZWZlcmVuY2UsCi0JCQkJCQlnZXRGaWx0ZXIoY2hpbGRGaWx0ZXIsIG9iamVjdCksIG9iamVjdCwgZmVhdHVyZSk7Ci0JCQl9Ci0KLQkJCXJldHVybiB2YWxpZGF0b3I7Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJlc2VudGF0aW9uTmFtZVZhbGlkYXRvcihwYXJlbnQsCi0JCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCk7Ci0JCX0KLQotCQlyZXR1cm4gRG9Ob3RoaW5nVmFsaWRhdG9yLklOU1RBTkNFOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDdlMTgyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHZhbGlkYXRpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNmMzZDA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB2YWxpZGF0aW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGM0ZjIwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkM2I4ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgQ29tbW9uIHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmM2MxOGNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2ZmZjE4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb247dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW07dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyZWNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwKLSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS51dGlsLAotIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZSwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLAotIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLAotIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLmludGVybmFsLAotIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLAotIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIsCi0gb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLAotIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIudXRpbAotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGx1Z2luCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1Y2NhN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgbWlncmF0aW9uLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9taWdyYXRpb24vbWlncmF0b3JzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi9taWdyYXRvcnMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDA3OWU2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi9taWdyYXRvcnMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaHR0cFw6Ly8vY29tL2libS91bWEuZWNvcmU9b3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvcgotb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvcj1odHRwXDovL3d3dy5pYm0uY29tL3VtYS8xLjAuMi91bWEuZWNvcmUKLWh0dHBcOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZT1vcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsLk1pZ3JhdG9yMTAyCi1vcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsLk1pZ3JhdG9yMTAyPWh0dHBcOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL3VtYTEuMC4yXzEuMC4zLmVjb3JlMmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9taWdyYXRpb24vdW1hMS4wLjJfMS4wLjMuZWNvcmUyZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwMmU3NGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9taWdyYXRpb24vdW1hMS4wLjJfMS4wLjMuZWNvcmUyZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmUyZWNvcmU6RWNvcmUyRWNvcmVNYXBwaW5nUm9vdCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlMmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDA0L0Vjb3JlMkVjb3JlIiB0b3BUb0JvdHRvbT0idHJ1ZSI+Ci0gIDxpbnB1dHMgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZWNvcmUjLyIvPgotICA8b3V0cHV0cyBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3VtYS5lY29yZSMvIi8+Ci08L2Vjb3JlMmVjb3JlOkVjb3JlMkVjb3JlTWFwcGluZ1Jvb3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWNlMmNmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBMaWJyYXJ5IFBlcnNpc3RlbmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQ0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjRiMDg0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im1pZ3JhdG9ycyIgbmFtZT0iTWlncmF0b3JzIiBzY2hlbWE9InNjaGVtYS9taWdyYXRvcnMuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icmVzb3VyY2VTZXRGYWN0b3JpZXMiIG5hbWU9IkxpYnJhcnkgUmVzb3VyY2UgU2V0IEZhY3RvcmllcyIgc2NoZW1hPSJzY2hlbWEvcmVzb3VyY2VTZXRGYWN0b3JpZXMuZXhzZCIvPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgPHBhY2thZ2UgCi0gICAgICAgdXJpID0gImh0dHA6Ly8vY29tL2libS91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiAKLSAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UiIC8+Ci0gICAgPHBhY2thZ2UKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlIgotICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIvPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubWlncmF0b3JzIj4KLSAgICAgPG1pZ3JhdG9yCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsLk1pZ3JhdG9yIgotICAgICAgICAgICBsaWJOc1VSST0iaHR0cDovLy9jb20vaWJtL3VtYS5lY29yZSIvPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLnNlcnZpY2VQcm92aWRlcnMiPgotICAgICA8YWNjZXNzQ29udHJvbGxlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWwuQWNjZXNzQ29udHJvbGxlciIvPgotICAgICA8bGlicmFyeVBlcnNpc3RlcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlhNSUxpYnJhcnlQZXJzaXN0ZXIiCi0gICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICB0eXBlPSJ4bWkiLz4KLSAgICAgPGZpbGVNYW5hZ2VyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRGVsZWdhdGVGaWxlTWFuYWdlciIvPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UucmVzb3VyY2VTZXRGYWN0b3JpZXMiPgotICAgICA8cmVzb3VyY2VTZXRGYWN0b3J5Ci0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuWE1JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSIKLSAgICAgICAgICAgdHlwZT0ieG1pIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL21pZ3JhdG9ycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zY2hlbWEvbWlncmF0b3JzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI2MGEwZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zY2hlbWEvbWlncmF0b3JzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIiBpZD0ibWlncmF0b3JzIiBuYW1lPSJNaWdyYXRvcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgTWlncmF0b3IgbWlncmF0ZXMgbWV0aG9kIGxpYnJhcnkgZnJvbSBvbmUgdmVyc2lvbiB0byBhbm90aGVyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1pZ3JhdG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1pZ3JhdG9yIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgbWlncmF0b3IuIFRoaXMgY2xhc3MgbXVzdCBiZSBhIHB1YmxpYyBpbXBsZW1lbnRhdGlvbiBvZiAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuSU1pZ3JhdG9yJmx0Oy9jb2RlJmd0OyB3aXRoIGEgcHVibGljIDAtYXJndW1lbnQgY29uc3RydWN0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGliTnNVUkkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgc3BhY2UgVVJJIG9mIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IHRoaXMgbWlncmF0b3IgY2FuIG1pZ3JhdGVzCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICZsdDtleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubWlncmF0b3JzJnF1b3Q7Jmd0OwotICAgICAmbHQ7bWlncmF0b3IKLSAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvciZxdW90OwotICAgICAgICAgICBsaWJOc1VSST0mcXVvdDtodHRwOi8vL2NvbS9pYm0vdW1hLmVjb3JlJnF1b3Q7LyZndDsKLSAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuSU1pZ3JhdG9yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uaW50ZXJuYWwuTWlncmF0b3IKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zY2hlbWEvcmVzb3VyY2VTZXRGYWN0b3JpZXMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL3Jlc291cmNlU2V0RmFjdG9yaWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjZTU4ODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zY2hlbWEvcmVzb3VyY2VTZXRGYWN0b3JpZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UiIGlkPSJyZXNvdXJjZVNldEZhY3RvcmllcyIgbmFtZT0iTGlicmFyeSBSZXNvdXJjZSBTZXQgRmFjdG9yaWVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEV4dGVuc2lvbiBwb2ludCB0byBjb250cmlidXRlIGZhY3RvcmllcyBmb3IgY3JlYXRpb24gb2YgbGlicmFyeSByZXNvdXJjZSBzZXQuIFRoZSBmYWN0b3JpZXMgbXVzdCBpbXBsZW1lbnQgaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5IGFuZCBtdXN0IGhhdmUgYSBwdWJsaWMgbm9uLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZXNvdXJjZVNldEZhY3RvcnkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icmVzb3VyY2VTZXRGYWN0b3J5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJ0eXBlIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjEKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmEzYzU1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5UmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZSB7Ci0JbG9uZyBnZXRMb2FkU3RhbXAoKTsKLQlVUkkgZ2V0UHJveHlVUkkoRU9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZVNldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOTNjNGYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JVW1hUmVzb3VyY2VTZXQ7Ci0KLS8qKgotICogQSByZXNvdXJjZSBzZXQgdGhhdCBtYW5hZ2VzIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgUmVzb3VyY2V9Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlSZXNvdXJjZVNldCBleHRlbmRzIElVbWFSZXNvdXJjZVNldCB7Ci0JLyoqCi0JICogR2V0cyB0aGUgcGVyc2lzdGVuY2UgdHlwZSB0aGlzIHJlc291cmNlIHNldCBzdXBwb3J0cwotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHR5cGUKLQkgKiBAc2VlIFNlcnZpY2VzI2dldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVuY2VUeXBlKCkKLQkgKiBAc2VlIFNlcnZpY2VzI1hNSV9QRVJTSVNURU5DRV9UWVBFCi0JICovCi0JU3RyaW5nIGdldFBlcnNpc3RlbmNlVHlwZSgpOwotCi0JLyoqCi0JICogTG9hZHMgbWV0aG9kIGxpYnJhcmllcyBpbnRvIHRoaXMgcmVzb3VyY2Ugc2V0IGZyb20gdGhlIGdpdmVuIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyYW1ldGVycwotCSAqIEByZXR1cm4KLQkgKi8KLQl2b2lkIGxvYWRNZXRob2RMaWJyYXJpZXMoVVJJIHVyaSwgTWFwIHBhcmFtZXRlcnMpCi0JCQl0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBtZXRob2QgbGlicmFyaWVzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvIHRoaXMKLQkgKiByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUxpc3QgZ2V0TWV0aG9kTGlicmFyaWVzKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmaXJzdCBsb2FkZWQgbWV0aG9kIGxpYnJhcnkgb2YgdGhpcyByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHJldHVybiB0aGUgbWV0aG9kIGxpYnJhcnkgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgbm90IGxvYWRlZAotCSAqICAgICAgICAgeWV0LgotCSAqIEBzZWUgI2xvYWRMaWJyYXJ5KFVSSSwgTWFwKQotCSAqLwotCU1ldGhvZExpYnJhcnkgZ2V0Rmlyc3RNZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIEdVSUQgKEdsb2JhbGx5IFVuaXF1ZSBJZGVudGlmaWVyKQotCSAqIAotCSAqIEBwYXJhbSBndWlkCi0JICogQHJldHVybgotCSAqLwotCUVPYmplY3QgZ2V0RU9iamVjdChTdHJpbmcgZ3VpZCk7Ci0KLQlNYXAgZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgZ2l2ZW4gb3Bwb3NpdGUgZmVhdHVyZXMgb2YgYWxsIGxvYWRlZCBvYmplY3RzIGluIHRoaXMgcmVzb3VyY2UKLQkgKiBzZXQuCi0JICogCi0JICogQHBhcmFtIG9wcG9zaXRlRmVhdHVyZXMKLQkgKi8KLQl2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKExpc3Qgb3Bwb3NpdGVGZWF0dXJlcyk7Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgZ2l2ZW4gb3Bwb3NpdGUgZmVhdHVyZXMgb2YgdGhvc2Ugb2JqZWN0cyBpbiB0aGlzIHJlc291cmNlIHNldAotCSAqIHdob3NlIEdVSURzIGFyZSBzcGVjaWZpZWQgaW4gPGNvZGU+R1VJRHM8L2NvZGU+IHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gb3Bwb3NpdGVGZWF0dXJlcwotCSAqIEBwYXJhbSBHVUlEcwotCSAqLwotCXZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoTGlzdCBvcHBvc2l0ZUZlYXR1cmVzLCBTZXQgR1VJRHMpOwotCi0JLyoqCi0JICogU2F2ZXMgdGhpcyByZXNvdXJjZSBzZXQgd2l0aCB0aGUgZ2l2ZW4gc2F2ZSBvcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBvcHRpb25zCi0JICogICAgICAgICAgICBzYXZlIG9wdGlvbnMKLQkgKiBAdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbgotCSAqLwotCXZvaWQgc2F2ZShNYXAgb3B0aW9ucykgdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFVubG9hZHMgdGhlIGdpdmVuIG9iamVjdCBpbiB0aGlzIHJlc291cmNlIHNldAotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG9iamVjdCB3YXMgdW5sb2FkZWQKLQkgKiAgICAgICAgIHN1Y2Nlc3NmdWxseQotCSAqLwotCWJvb2xlYW4gdW5sb2FkKEVPYmplY3Qgb2JqZWN0KTsKLQotCS8qKgotCSAqIFVubG9hZHMgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBvZiB0aGlzIHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqLwotCXZvaWQgdW5sb2FkKFJlc291cmNlIHJlc291cmNlLCBNYXAgb3B0aW9ucyk7Ci0KLQkvKioKLQkgKiBSZWxvYWRzIHRoZSBnaXZlbiByZXNvdXJjZXMKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICogQHJldHVybiByZXNvdXJjZXMgdGhhdCBoYWQgYmVlbiByZWxvYWRlZAotCSAqLwotCUNvbGxlY3Rpb24gcmVsb2FkUmVzb3VyY2VzKENvbGxlY3Rpb24gcmVzb3VyY2VzKTsKLQotCS8qKgotCSAqIFJlbG9hZHMgdGhlIGdpdmVuIHBlcnNpc3RlZCBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3RzCi0JICogQHJldHVybiBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIHJlbG9hZGVkCi0JICovCi0JQ29sbGVjdGlvbiByZWxvYWRPYmplY3RzKENvbGxlY3Rpb24gb2JqZWN0cyk7Ci0KLQkvKioKLQkgKiBVbmxvYWRzIHRoaXMgcmVzb3VyY2Ugc2V0LiBUaGlzIHdpbGwgdW5sb2FkIGV2ZXJ5IHJlc291cmNlIGluIHRoaXMKLQkgKiByZXNvdXJjZSBzZXQgYW5kIHJlc2V0IHRoZSByZXNvdXJjZSBzZXQgdG8gdGhlIHN0YXRlIGJlZm9yZSBsb2FkaW5nIHRoZQotCSAqIGxpYnJhcnkuCi0JICogCi0JICovCi0Jdm9pZCB1bmxvYWQoKTsKLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGVyZSBpcyBhbnkgdW5yZXNvbHZlZCBwcm94eSBkZXRlY3RlZCBpbiB0aGUgbGlicmFyeQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGhhc1VucmVzb2x2ZWRQcm94eSgpOwotCi0JLyoqCi0JICogU3Vic2NyaWJlcyB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIHRvIGxpc3RlbiB0byByZWZyZXNoIGV2ZW50cyBicm9hZGNhc3RlZAotCSAqIHdoZW5ldmVyIHJlc291cmNlcyBvciBvYmplY3RzIG9mIHRoaXMgcmVzb3VyY2Ugc2V0IGlzIHJlZnJlc2hlZC9yZWxvYWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiBAc2VlICNyZWxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbikKLQkgKi8KLQl2b2lkIGFkZFJlZnJlc2hMaXN0ZW5lcihJUmVmcmVzaExpc3RlbmVyIGxpc3RlbmVyKTsKLQkKLQkvKioKLQkgKiBVbnN1YnNjcmliZXMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBmcm9tIGxpc3RlbmluZyB0byByZWZyZXNoIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQl2b2lkIHJlbW92ZVJlZnJlc2hMaXN0ZW50ZXIoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQlJTGlicmFyeVBlcnNpc3RlciBnZXRQZXJzaXN0ZXIoKTsKLQotCXZvaWQgY2hlY2tNb2RpZnkoUmVzb3VyY2VbXSByZXNvdXJjZXMsIE9iamVjdCBjb250ZXh0KQotCQkJdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbjsKLQotCUlTdGF0dXMgY2hlY2tNb2RpZnkoQ29sbGVjdGlvbjxFT2JqZWN0PiBlT2JqZWN0cywgT2JqZWN0IGNvbnRleHQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyOTczYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlOwotCi0vKioKLSAqIEZhY3RvcnkgdG8gY3JlYXRlIHtAbGluayBJTGlicmFyeVJlc291cmNlU2V0fSBpbnN0YW5jZSBvZiB0aGUgcGFydGljdWxhcgotICogcGVyc2lzdGVuY2UgdHlwZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAyNiwgMjAwNgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5IHsKLQotCS8qKgotCSAqIEdldHMgdGhlIHBlcnNpc3RlbmNlIHR5cGUgb2YgdGhlIHJlc291cmNlIHNldCBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeQotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHR5cGUKLQkgKi8KLQlTdHJpbmcgZ2V0UGVyc2lzdGVuY2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxpYnJhcnkgcmVzb3VyY2Ugc2V0Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBsaWJyYXJ5IHJlc291cmNlIHNldAotCSAqLwotCUlMaWJyYXJ5UmVzb3VyY2VTZXQgY3JlYXRlTGlicmFyeVJlc291cmNlU2V0KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JUmVmcmVzaEluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lSZWZyZXNoSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZWE3YjBjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JUmVmcmVzaEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVmcmVzaEluZm8gewotCS8qKgotCSAqIEdldHMgZXhpc3RpbmcgcmVzb3VyY2VzIHRoYXQgcmVhcHBlYXJzIGluIHdvcmtzcGFjZQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkZGVkUmVzb3VyY2VzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWRkZWRSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBHZXRzIG5ld2x5IGFkZGVkIHdvcmtzcGFjZSByZXNvdXJjZXMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNoYW5nZWRSZXNvdXJjZXMuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hhbmdlZFJlc291cmNlcygpOwotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlbW92ZWRSZXNvdXJjZXMuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVtb3ZlZFJlc291cmNlcygpOwotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgbWFuYWdlciB0aGF0IHRoZSBnaXZlbiByZXNvdXJjZSBqdXN0IGhhcyBiZWVuIHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlU2F2ZWQoUmVzb3VyY2UgcmVzb3VyY2UpOwkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0xpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvTGlicmFyeVJlc291cmNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0MGIwMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvTGlicmFyeVJlc291cmNlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODI3MjU4NzM0NDY3ODY3NjgyOEw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHVibGljIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBjYXVzZQotCSAqLwotCXB1YmxpYyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNhdXNlCi0JICovCi0JcHVibGljIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIoY2F1c2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTE2OTFjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDcsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlU2VydmljZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VTZXJ2aWNlIElOU1RBTkNFID0gbmV3IFBlcnNpc3RlbmNlU2VydmljZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCB0eXBlVG9GYWN0b3J5RGVmTWFwOwotCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVNlcnZpY2UoKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IFJlc291cmNlU2V0IGZvciB0aGUgZ2l2ZW4gcGVyc2lzdGVuY2UgdHlwZQotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJTGlicmFyeVJlc291cmNlU2V0IGNyZWF0ZVJlc291cmNlU2V0KFN0cmluZyB0eXBlKSB7Ci0JCUlMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KHR5cGUpOwotCQlpZihmYWN0b3J5ICE9IG51bGwpIHsKLQkJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUxpYnJhcnlSZXNvdXJjZVNldCgpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biB0eXBlOiAiICsgdHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZhY3RvcnlEZWYgewotCQlCdW5kbGUgYnVuZGxlOwotCi0JCVN0cmluZyB0eXBlOwotCi0JCVN0cmluZyBjbGFzc05hbWU7Ci0JCQotCQlJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSBpbnN0YW5jZTsKLQotCQkvKioKLQkJICogQHBhcmFtIGJ1bmRsZQotCQkgKiBAcGFyYW0gdHlwZQotCQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JCSAqIEBwYXJhbSBpbnN0YW5jZQotCQkgKi8KLQkJcHJpdmF0ZSBGYWN0b3J5RGVmKEJ1bmRsZSBidW5kbGUsIFN0cmluZyB0eXBlLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCX0KLQkJCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSBnZXRGYWN0b3J5KFN0cmluZyBwZXJzaXN0ZW5jZVR5cGUpIHsKLQkJaWYgKHR5cGVUb0ZhY3RvcnlEZWZNYXAgPT0gbnVsbCkgewotCQkJdHlwZVRvRmFjdG9yeURlZk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkvLyBQcm9jZXNzIHRoZSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubWlncmF0b3JzIgotCQkJLy8gZXh0ZW5zaW9uIHBvaW50Ci0JCQkvLyBjb250cmlidXRvcnMuCi0JCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybQotCQkJCQkuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5Ci0JCQkJCS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQkJCQkib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UiLCAicmVzb3VyY2VTZXRGYWN0b3JpZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgdHlwZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbAotCQkJCQkJCQkJJiYgY2xhc3NOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJCSYmIHR5cGUgIT0gbnVsbAotCQkJCQkJCQkJJiYgdHlwZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCXR5cGVUb0ZhY3RvcnlEZWZNYXAucHV0KHR5cGUsIG5ldyBGYWN0b3J5RGVmKGJ1bmRsZSwKLQkJCQkJCQkJCQl0eXBlLCBjbGFzc05hbWUpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJRmFjdG9yeURlZiBmYWN0b3J5ID0gKEZhY3RvcnlEZWYpIHR5cGVUb0ZhY3RvcnlEZWZNYXAuZ2V0KHBlcnNpc3RlbmNlVHlwZSk7Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCWlmIChmYWN0b3J5Lmluc3RhbmNlID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSByZXNvdXJjZVNldEZhY3RvcnkgPSAoSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkpIGZhY3RvcnkuYnVuZGxlLmxvYWRDbGFzcygKLQkJCQkJCQlmYWN0b3J5LmNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCQkJaWYocGVyc2lzdGVuY2VUeXBlLmVxdWFscyhyZXNvdXJjZVNldEZhY3RvcnkuZ2V0UGVyc2lzdGVuY2VUeXBlKCkpKSB7Ci0JCQkJCQlmYWN0b3J5Lmluc3RhbmNlID0gcmVzb3VyY2VTZXRGYWN0b3J5OwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGZhY3RvcnkuY2xhc3NOYW1lICsKLQkJCQkJCQkJIiBpcyByZWdpc3RlcmVkIHdpdGggdGhlIHdyb25nIHBlcnNpc3RlbmNlIHR5cGUgJyIgKyBwZXJzaXN0ZW5jZVR5cGUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSInLiBUaGUgY29ycmVjdCB0eXBlIG11c3QgYmUgJyIgKyByZXNvdXJjZVNldEZhY3RvcnkuZ2V0UGVyc2lzdGVuY2VUeXBlKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFjdG9yeS5pbnN0YW5jZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL2ludGVybmFsL0FjY2Vzc0NvbnRyb2xsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL2ludGVybmFsL0FjY2Vzc0NvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzZmNmU3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9pbnRlcm5hbC9BY2Nlc3NDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JQWNjZXNzQ29udHJvbGxlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCA5LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWNjZXNzQ29udHJvbGxlciBpbXBsZW1lbnRzIElBY2Nlc3NDb250cm9sbGVyIHsKLQotCXB1YmxpYyBBY2Nlc3NDb250cm9sbGVyKCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JQWNjZXNzQ29udHJvbGxlciNjaGVja01vZGlmeShqYXZhLnV0aWwuQ29sbGVjdGlvbiwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShDb2xsZWN0aW9uIGVPYmplY3RzLCBPYmplY3QgY29udGV4dCkgewotCQlpZihlT2JqZWN0cy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gby5lUmVzb3VyY2UoKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQpIHsKLQkJCQlyZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCWlmKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXNvdXJjZVNldC5jaGVja01vZGlmeShlT2JqZWN0cywgY29udGV4dCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklBY2Nlc3NDb250cm9sbGVyI2NoZWNrTW9kaWZ5KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVtdLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KFJlc291cmNlW10gcmVzb3VyY2VzLCBPYmplY3QgY29udGV4dCkgewotCQlpZihyZXNvdXJjZXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCUFycmF5TGlzdDxTdHJpbmc+IHBhdGhzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLQkJCWlmKHJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQkJcGF0aHMuYWRkKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCX0KLQkJfQotCQlpZighcGF0aHMuaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmdbXSBhcnIgPSBuZXcgU3RyaW5nW3BhdGhzLnNpemUoKV07Ci0JCQlwYXRocy50b0FycmF5KGFycik7Ci0JCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jaGVja01vZGlmeShhcnIsIGNvbnRleHQpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwkKLQkJCi0vLwkJTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0vLwkJCQlJU3RhdHVzLk9LLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5tb2RpZnlGaWxlc0Vycm9yX21zZywKLS8vCQkJCW51bGwpOwotLy8KLS8vCQlIYXNoTWFwPElMaWJyYXJ5UmVzb3VyY2VTZXQsIFNldDxSZXNvdXJjZT4+IHJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAgPSBuZXcgSGFzaE1hcDxJTGlicmFyeVJlc291cmNlU2V0LCBTZXQ8UmVzb3VyY2U+PigpOwotLy8JCVNldDxSZXNvdXJjZT4gcmVzb3VyY2VzV2l0aG91dExpYnJhcnlSZXNvdXJjZVNldCA9IG51bGw7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0vLwkJCWlmKHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0KSB7Ci0vLwkJCQlTZXQgc2V0ID0gcmVzb3VyY2VTZXRUb1Jlc291cmNlc01hcC5nZXQocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0vLwkJCQlpZihzZXQgPT0gbnVsbCkgewotLy8JCQkJCXNldCA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotLy8JCQkJCXJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAucHV0KChJTGlicmFyeVJlc291cmNlU2V0KSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpLCBzZXQpOwotLy8JCQkJfQotLy8JCQkJc2V0LmFkZChyZXNvdXJjZSk7CQkJCQotLy8JCQl9Ci0vLwkJCWVsc2UgewotLy8JCQkJaWYocmVzb3VyY2VzV2l0aG91dExpYnJhcnlSZXNvdXJjZVNldCA9PSBudWxsKSB7Ci0vLwkJCQkJcmVzb3VyY2VzV2l0aG91dExpYnJhcnlSZXNvdXJjZVNldCA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotLy8JCQkJfQotLy8JCQkJcmVzb3VyY2VzV2l0aG91dExpYnJhcnlSZXNvdXJjZVNldC5hZGQocmVzb3VyY2UpOwotLy8JCQl9Ci0vLwkJfQotLy8JCWlmKCFyZXNvdXJjZVNldFRvUmVzb3VyY2VzTWFwLmlzRW1wdHkoKSkgewotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZVNldFRvUmVzb3VyY2VzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlNYXAuRW50cnk8SUxpYnJhcnlSZXNvdXJjZVNldCwgU2V0PFJlc291cmNlPj4gZW50cnkgPSAoRW50cnk8SUxpYnJhcnlSZXNvdXJjZVNldCwgU2V0PFJlc291cmNlPj4pIGl0ZXIubmV4dCgpOwotLy8JCQkJUmVzb3VyY2VbXSBhcnIgPSBuZXcgUmVzb3VyY2VbZW50cnkuZ2V0VmFsdWUoKS5zaXplKCldOwotLy8JCQkJZW50cnkuZ2V0VmFsdWUoKS50b0FycmF5KGFycik7Ci0vLwkJCQllbnRyeS5nZXRLZXkoKS5jaGVja01vZGlmeShhcnIsIGNvbnRleHQpOwotLy8JCQl9Ci0vLwkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvaW50ZXJuYWwvSUZhaWxTYWZlU2F2YWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvaW50ZXJuYWwvSUZhaWxTYWZlU2F2YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOTcxY2EwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL2ludGVybmFsL0lGYWlsU2FmZVNhdmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLmludGVybmFsOwotCi0vKioKLSAqIEludGVyZmFjZSBhIHJlc291cmNlIG11c3QgaW1wbGVtZW50IHRvIHN1cHBvcnQgZmFpbC1zYWZlIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGYWlsU2FmZVNhdmFibGUgewotCXZvaWQgY29tbWl0KCk7Ci0JCi0JYm9vbGVhbiByZXN0b3JlKCk7Ci0JCi0Jdm9pZCBzZXRUeElEKFN0cmluZyB0eElEKTsKLQkKLQlib29sZWFuIGhhc1RlbXBVUkkoKTsKLQkKLQl2b2lkIHR4RmluaXNoZWQoYm9vbGVhbiBzdWNjZXNzZnVsKTsKLQkKLQl2b2lkIGRlbGV0ZUJhY2t1cCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvdXRpbC9FeHRlbmRlZFJlc291cmNlU2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS91dGlsL0V4dGVuZGVkUmVzb3VyY2VTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDMxOTRiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS91dGlsL0V4dGVuZGVkUmVzb3VyY2VTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5Vbm5vcm1hbGl6ZWRVUklFeGNlcHRpb247Ci0KLS8qKgotICogQSBleHRlbmRlZCByZXNvdXJjZSBzZXQgd2hvc2Ugb2JqZWN0cyBjYW4gcmVmZXJlbmNlcyBvYmplY3RzIG9mIG90aGVyIHJlc291cmNlIHNldAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyA5LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRSZXNvdXJjZVNldCBleHRlbmRzIFJlc291cmNlU2V0SW1wbCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVJJX1RZUEVfVU5LTk9XTiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVJJX1RZUEVfTE9DQUwgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVSSV9UWVBFX0VYVEVSTkFMID0gMjsKLQkKLQlwcm90ZWN0ZWQgTGlzdDxSZXNvdXJjZVNldD4gcmVmZXJlbmNlZFJlc291cmNlU2V0cyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VTZXQ+KCk7Ci0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSBnaXZlbiBVUkkuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gb25lIG9mIFVSSSB0eXBlIGNvbnN0YW50czoge0BsaW5rICNVUklfVFlQRV9FWFRFUk5BTH0sIHtAbGluayAjVVJJX1RZUEVfTE9DQUx9LCB7QGxpbmsgI1VSSV9UWVBFX1VOS05PV059Ci0JICovCi0JcHJvdGVjdGVkIGludCBnZXRVUklUeXBlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIFVSSV9UWVBFX1VOS05PV047Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGFkZChSZXNvdXJjZVNldCByZWZlcmVuY2VkUmVzb3VyY2VTZXQpIHsKLQkJaWYoIXJlZmVyZW5jZWRSZXNvdXJjZVNldHMuY29udGFpbnMocmVmZXJlbmNlZFJlc291cmNlU2V0KSkgewotCQkJcmV0dXJuIHJlZmVyZW5jZWRSZXNvdXJjZVNldHMuYWRkKHJlZmVyZW5jZWRSZXNvdXJjZVNldCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCUVPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLQkJVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uIGV4ID0gbnVsbDsKLQkJaW50IHVyaVR5cGUgPSBnZXRVUklUeXBlKHVyaSk7Ci0JCWlmKHVyaVR5cGUgPT0gVVJJX1RZUEVfVU5LTk9XTiB8fCB1cmlUeXBlID09IFVSSV9UWVBFX0xPQ0FMKSB7Ci0JCQl0cnkgewotCQkJCW9iamVjdCA9IHN1cGVyLmdldEVPYmplY3QodXJpLCBsb2FkT25EZW1hbmQpOwotCQkJfSBjYXRjaCAoVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQlleCA9IGU7Ci0JCQl9Ci0JCQlpZihvYmplY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBvYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJaWYodXJpVHlwZSA9PSBVUklfVFlQRV9VTktOT1dOIHx8IHVyaVR5cGUgPT0gVVJJX1RZUEVfRVhURVJOQUwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZWRSZXNvdXJjZVNldHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoUmVzb3VyY2VTZXQpIGl0ZXIubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCW9iamVjdCA9IHJlc291cmNlU2V0LmdldEVPYmplY3QodXJpLCBsb2FkT25EZW1hbmQpOwotCQkJCQlpZihvYmplY3QgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIG9iamVjdDsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFVubm9ybWFsaXplZFVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWV4ID0gZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gCi0JCQotCQlpZihleCAhPSBudWxsKSB7Ci0JCQl0aHJvdyBleDsKLQkJfQotCQlyZXR1cm4gb2JqZWN0OwotCX0JCi0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQl0cnl7Ci0JCQkJcmVzb3VyY2UudW5sb2FkKCk7CQkJCi0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJcmVmZXJlbmNlZFJlc291cmNlU2V0cy5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9EZWxlZ2F0ZUZpbGVNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRGVsZWdhdGVGaWxlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1N2FiYmQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9EZWxlZ2F0ZUZpbGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDEwLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGVGaWxlTWFuYWdlciBpbXBsZW1lbnRzIElGaWxlTWFuYWdlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVNYW5hZ2VyI2NoZWNrTW9kaWZ5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2hlY2tNb2RpZnkoU3RyaW5nIHBhdGgsIE9iamVjdCBjb250ZXh0KSB7Ci0JCXJldHVybiBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNoZWNrTW9kaWZ5KHBhdGgsIGNvbnRleHQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZU1hbmFnZXIjY2hlY2tNb2RpZnkoamF2YS5sYW5nLlN0cmluZ1tdLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KFN0cmluZ1tdIHBhdGhzLCBPYmplY3QgY29udGV4dCkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jaGVja01vZGlmeShwYXRocywgY29udGV4dCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlTWFuYWdlciNkZWxldGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkZWxldGUoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZGVsZXRlKHBhdGgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZU1hbmFnZXIjbW92ZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIG1vdmUoU3RyaW5nIG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoKSB7Ci0JCXJldHVybiBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLm1vdmUob2xkUGF0aCwgbmV3UGF0aCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlTWFuYWdlciNyZW5hbWUoamF2YS5pby5GaWxlLCBqYXZhLmlvLkZpbGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVuYW1lKEZpbGUgb2xkRmlsZSwgRmlsZSBuZXdGaWxlKSB7Ci0JCXJldHVybiBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbmFtZShvbGRGaWxlLCBuZXdGaWxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9FeHRlbmRlZFJlc291cmNlU2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRXh0ZW5kZWRSZXNvdXJjZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OTc2MWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9FeHRlbmRlZFJlc291cmNlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEEgZXh0ZW5kZWQgcmVzb3VyY2Ugc2V0IHdob3NlIG9iamVjdHMgY2FuIHJlZmVyZW5jZXMgb2JqZWN0cyBvZiBvdGhlciByZXNvdXJjZSBzZXQKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgOSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkUmVzb3VyY2VTZXQgZXh0ZW5kcyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVSSV9UWVBFX1VOS05PV04gPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVSSV9UWVBFX0xPQ0FMID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9FWFRFUk5BTCA9IDI7Ci0JCi0JcHJvdGVjdGVkIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZWZlcmVuY2VkUmVzb3VyY2VTZXQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHtAbGluayBFeHRlbmRlZFJlc291cmNlU2V0fSB0aGF0IGNhbiBoYXZlIHJlZmVyZW5jZSB0byBvYmplY3RzIGluIHRoZSBnaXZlbiByZXNvdXJjZSBzZXQgCi0JICovCi0JcHVibGljIEV4dGVuZGVkUmVzb3VyY2VTZXQoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlZmVyZW5jZWRSZXNvdXJjZVNldCkgewotCQlzdXBlcigpOwotCQl0aGlzLnJlZmVyZW5jZWRSZXNvdXJjZVNldCA9IHJlZmVyZW5jZWRSZXNvdXJjZVNldDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gVVJJLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIG9uZSBvZiBVUkkgdHlwZSBjb25zdGFudHM6IHtAbGluayAjVVJJX1RZUEVfRVhURVJOQUx9LCB7QGxpbmsgI1VSSV9UWVBFX0xPQ0FMfSwge0BsaW5rICNVUklfVFlQRV9VTktOT1dOfQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0VVJJVHlwZShVUkkgdXJpKSB7Ci0JCXJldHVybiBVUklfVFlQRV9VTktOT1dOOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsI2dldEVPYmplY3Qob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIGJvb2xlYW4pCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChFT2JqZWN0IHJlc29sdmVyLCBVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlFT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0JCVVubm9ybWFsaXplZFVSSUV4Y2VwdGlvbiBleCA9IG51bGw7Ci0JCWludCB1cmlUeXBlID0gZ2V0VVJJVHlwZSh1cmkpOwotCQlpZih1cmlUeXBlID09IFVSSV9UWVBFX1VOS05PV04gfHwgdXJpVHlwZSA9PSBVUklfVFlQRV9MT0NBTCkgewotCQkJdHJ5IHsKLQkJCQlvYmplY3QgPSBzdXBlci5nZXRFT2JqZWN0KHJlc29sdmVyLCB1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCQl9IGNhdGNoIChVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZSkgewotCQkJCWV4ID0gZTsKLQkJCX0KLQkJCWlmKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG9iamVjdDsKLQkJCX0KLQkJfQotCQlpZih1cmlUeXBlID09IFVSSV9UWVBFX1VOS05PV04gfHwgdXJpVHlwZSA9PSBVUklfVFlQRV9FWFRFUk5BTCkgewotCQkJdHJ5IHsKLQkJCQlvYmplY3QgPSByZWZlcmVuY2VkUmVzb3VyY2VTZXQuZ2V0RU9iamVjdChyZXNvbHZlciwgdXJpLAotCQkJCQkJbG9hZE9uRGVtYW5kKTsKLQkJCX0gY2F0Y2ggKFVubm9ybWFsaXplZFVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZXggPSBlOwotCQkJfQotCQl9IAotCQkKLQkJaWYoZXggIT0gbnVsbCkgewotCQkJdGhyb3cgZXg7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmU3Y2Y4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlciB7Ci0JcHJpdmF0ZSBVUkkgZmluYWxVUkk7Ci0JcHJpdmF0ZSBVUkkgb2xkVVJJOwotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRUeElEOwotCXByaXZhdGUgUmVzb3VyY2UgcmVzb3VyY2U7Ci0JcHJpdmF0ZSBVUkkgdGVtcFVSSTsKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBiYWNrdXBGaWxlOwotCXByaXZhdGUgVVJJQ29udmVydGVyIGNvbnZlcnRlcjsKLQkKLQlwdWJsaWMgRmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlcihSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGlkKSB7Ci0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsgCi0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5jb252ZXJ0ZXIgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpICE9IG51bGwgPyByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0ZW1wb3JhcnkgVVJJIHRvIHNhdmUgdGhpcyByZXNvdXJjZSB0byBhbmQgaXQgd2lsbCBiZSByZW5hbWVkIHRvCi0JICogdGhlIG9yaWdpbmFsIFVSSSB3aGVuIHNhdmluZyBpcyBkb25lCi0JICovCi0JcHVibGljIFVSSSBzZXRUZW1wVVJJKFN0cmluZyB0eElEKSB7Ci0JCWlmIChmaW5hbFVSSSA9PSBudWxsKSB7Ci0JCQlmaW5hbFVSSSA9IG9sZFVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJY3VycmVudFR4SUQgPSB0eElEOwotCi0JCQl0ZW1wVVJJID0gY3JlYXRlVGVtcFVSSSgpOwotCQkJcmVzb3VyY2Uuc2V0VVJJKHRlbXBVUkkpOwotCQl9Ci0JCXJldHVybiB0ZW1wVVJJOwotCX0KLQkKLQlwcml2YXRlIFVSSSBjcmVhdGVUZW1wVVJJKCkgewotCQlyZXR1cm4gVVJJLmNyZWF0ZUZpbGVVUkkobmV3IFN0cmluZ0J1ZmZlcihNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwuZ2V0VGVtcERpcigpKS5hcHBlbmQoCi0JCQkJRmlsZS5zZXBhcmF0b3IpLmFwcGVuZChjdXJyZW50VHhJRCkKLQkJCQkuYXBwZW5kKCJuZXciKS5hcHBlbmQoaWQpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja3VwRmlsZVBhdGgoKSB7Ci0JCVN0cmluZyBiYWNrdXBGaWxlID0gbmV3IFN0cmluZ0J1ZmZlcihNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwuZ2V0VGVtcERpcigpKQotCQkJCS5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpCi0JCQkJLmFwcGVuZChjdXJyZW50VHhJRCkKLQkJCQkuYXBwZW5kKCJvbGQiKS5hcHBlbmQoaWQpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJhY2t1cEZpbGU7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIHRvRmlsZVN0cmluZyhVUkkgdXJpKSB7Ci0JCXJldHVybiBGaWxlTWFuYWdlci50b0ZpbGVTdHJpbmcodXJpLCBjb252ZXJ0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjb21taXQoKSB7Ci0JCWlmIChmaW5hbFVSSSAhPSBudWxsICYmICFyZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJRmlsZSBmaW5hbEZpbGUgPSBuZXcgRmlsZSh0b0ZpbGVTdHJpbmcoZmluYWxVUkkpKTsKLQkJCWJvb2xlYW4gd2FzTW92ZSA9ICFvbGRVUkkuZXF1YWxzKGZpbmFsVVJJKTsKLQkJCWlmICh3YXNNb3ZlKSB7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGJhY2sgdXAgdGhlIGZpbGUKLQkJCQkvLwotCQkJCVN0cmluZyBiYWNrdXAgPSBnZXRCYWNrdXBGaWxlUGF0aCgpOwotCQkJCUZpbGUgYmFrRmlsZSA9IG5ldyBGaWxlKGJhY2t1cCk7Ci0KLQkJCQkvLyB0cnlpbmcgdG8gZGVsZXRlIHRoZSBvbGQgYmFja3VwIGZpbGUgaWYgaXQgZXhpc3RzCi0JCQkJLy8KLQkJCQlpZiAoYmFrRmlsZS5leGlzdHMoKSkgewotCQkJCQliYWtGaWxlLmRlbGV0ZSgpOwotCQkJCX0KLQotCQkJCWlmIChmaW5hbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJLy8gc29tZSBDTSBwcm92aWRlciBsaWtlIENsZWFyQ2FzZSByZW5hbWVkIHRoZSB2ZXJzaW9uZWQKLQkJCQkJLy8gZmlsZSBpdCBpdHMgcmVwb3NpdG9yeSBhcyBzb29uIGFzIHVzZXIgcmVuYW1lZCB0aGUgZmlsZQotCQkJCQkvLyBpbiB0aGUgd29ya3NwYWNlLiBUbyBhdm9pZCB0aGlzLCB1c2Ugb25seSByZWd1bGFyIHJlbmFtZQotCQkJCQkvLyByb3V0aW5lIG9mIGphdmEuaW8uRmlsZSBpbnN0ZWFkIG9mIElSZXNvdXJjZSByb3V0aW5lCi0JCQkJCS8vCi0JCQkJCWlmIChGaWxlVXRpbC5tb3ZlRmlsZShmaW5hbEZpbGUsIGJha0ZpbGUpKSB7Ci0JCQkJCQliYWNrdXBGaWxlID0gYmFja3VwOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKAotCQkJCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5yZW5hbWVFcnJvcl9tc2csCi0JCQkJCQkJCWZpbmFsRmlsZSwgYmFja3VwKTsKLQkJCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihtc2cpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZW5hbWUgdGhlIHJlc291cmNlIGZpbGUgdG8gdGhlIG9yaWdpbmFsIG5hbWUKLQkJCS8vCi0JCQlGaWxlIGN1cnJlbnRGaWxlID0gbmV3IEZpbGUod2FzTW92ZSA/IHRvRmlsZVN0cmluZyhvbGRVUkkpCi0JCQkJCTogdG9GaWxlU3RyaW5nKHJlc291cmNlLmdldFVSSSgpKSk7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJCWlmICh3YXNNb3ZlKSB7Ci0JCQkJc3VjY2VzcyA9IE11bHRpRmlsZVNhdmVVdGlsLm1vdmUocmVzb3VyY2UsIGN1cnJlbnRGaWxlLCBmaW5hbEZpbGUpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBzb21lIENNIHByb3ZpZGVyIGxpa2UgQ2xlYXJDYXNlIHJlbmFtZWQgdGhlIHZlcnNpb25lZCBmaWxlIGl0Ci0JCQkJLy8gaXRzIHJlcG9zaXRvcnkgYXMgc29vbiBhcyB1c2VyIHJlbmFtZWQgdGhlIGZpbGUKLQkJCQkvLyBpbiB0aGUgd29ya3NwYWNlLiBUbyBhdm9pZCB0aGlzLCB1c2Ugb25seSByZWd1bGFyIHJlbmFtZQotCQkJCS8vIHJvdXRpbmUgb2YgamF2YS5pby5GaWxlIGluc3RlYWQgb2YgSVJlc291cmNlIHJvdXRpbmUKLQkJCQkvLwotCQkJCXN1Y2Nlc3MgPSBGaWxlVXRpbC5tb3ZlRmlsZShjdXJyZW50RmlsZSwgZmluYWxGaWxlKTsKLQkJCX0KLQkJCWlmICghc3VjY2VzcykgewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5yZW5hbWVFcnJvcl9tc2csCi0JCQkJCQljdXJyZW50RmlsZSwgZmluYWxGaWxlKTsKLQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24obXNnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHdhc01vdmUpIHsKLQkJCQkJZGlkTW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIHRvIG92ZXJyaWRlIHRvIGhhbmRsZSBwb3N0IG1vdmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaWRNb3ZlKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZUJhY2t1cCgpIHsKLQkJaWYgKGJhY2t1cEZpbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQkvLyBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRlbGV0ZShiYWNrdXBGaWxlKTsKLQkJCQluZXcgRmlsZShiYWNrdXBGaWxlKS5kZWxldGUoKTsKLQkJCQliYWNrdXBGaWxlID0gbnVsbDsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzVGVtcFVSSSgpIHsKLQkJaWYgKGN1cnJlbnRUeElEICE9IG51bGwpIHsKLQkJCXJldHVybiBjcmVhdGVUZW1wVVJJKCkuZXF1YWxzKHJlc291cmNlLmdldFVSSSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFVSSSBnZXRGaW5hbFVSSSgpIHsKLQkJaWYgKGZpbmFsVVJJICE9IG51bGwpIHsKLQkJCXJldHVybiBmaW5hbFVSSTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVzdG9yZSgpIHsKLQkJRmlsZSBzcmMgPSBudWxsLCBkZXN0ID0gbnVsbDsKLQkJYm9vbGVhbiBtb3ZlZCA9IGZhbHNlOwotCQlpZiAoYmFja3VwRmlsZSAhPSBudWxsKSB7Ci0JCQlzcmMgPSBuZXcgRmlsZShiYWNrdXBGaWxlKTsKLQkJCWRlc3QgPSBuZXcgRmlsZSh0b0ZpbGVTdHJpbmcoZ2V0RmluYWxVUkkoKSkpOwotCQl9IGVsc2UgewotCQkJbW92ZWQgPSBvbGRVUkkgIT0gbnVsbCAmJiAhb2xkVVJJLmVxdWFscyhmaW5hbFVSSSk7Ci0JCQlpZiAobW92ZWQpIHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh0b0ZpbGVTdHJpbmcoZ2V0RmluYWxVUkkoKSkpOwotCQkJCWRlc3QgPSBuZXcgRmlsZSh0b0ZpbGVTdHJpbmcob2xkVVJJKSk7Ci0JCQkJbW92ZWQgPSBmaWxlLmV4aXN0cygpICYmICFkZXN0LmV4aXN0cygpOwotCQkJCWlmIChtb3ZlZCkgewotCQkJCQlzcmMgPSBmaWxlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc3JjICE9IG51bGwpIHsKLQkJCWlmIChkZXN0LmV4aXN0cygpKSB7Ci0JCQkJRmlsZVV0aWwubW92ZUZpbGUoZGVzdCxuZXcgRmlsZSh0b0ZpbGVTdHJpbmcocmVzb3VyY2UuZ2V0VVJJKCkpKSk7Ci0JCQl9Ci0JCQlib29sZWFuIHN1Y2Nlc3M7Ci0JCQlpZiAobW92ZWQpIHsKLQkJCQlzdWNjZXNzID0gTXVsdGlGaWxlU2F2ZVV0aWwubW92ZShyZXNvdXJjZSwgc3JjLCBkZXN0KTsKLQkJCQkvLyBpZihzdWNjZXNzKSB7Ci0JCQkJLy8gTXVsdGlGaWxlU2F2ZVV0aWwudXBkYXRlVVJJTWFwcGluZ3ModGhpcywgbnVsbCk7Ci0JCQkJLy8gfQotCQkJfSBlbHNlIHsKLQkJCQlzdWNjZXNzID0gRmlsZVV0aWwubW92ZUZpbGUoc3JjLGRlc3QpOwotCQkJfQotCQkJaWYgKCFzdWNjZXNzKSB7Ci0JCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKE5MUy5iaW5kKAotCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVzdG9yZVJlc291cmNlRXJyb3JfbXNnLCB0aGlzKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdHhGaW5pc2hlZChib29sZWFuIHN1Y2Nlc3NmdWwpIHsKLS8vCQlib29sZWFuIHdhc01vdmUgPSAhb2xkVVJJLmVxdWFscyhmaW5hbFVSSSk7Ci0JCWlmIChzdWNjZXNzZnVsKSB7Ci0JCQlyZXNvdXJjZS5zZXRVUkkoZmluYWxVUkkpOwotCQkJcmVzb3VyY2Uuc2V0TW9kaWZpZWQoZmFsc2UpOwotLy8JCQl1cGRhdGVUaW1lU3RhbXBzKCk7Ci0vLwkJCUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaCh0aGlzKTsKLS8vCQkJaWYoIXdhc01vdmUpIHsKLS8vCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGdldFJlc291cmNlU2V0KCk7Ci0vLwkJCQlpZihyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0vLwkJCQkJcmVzb3VyY2VTZXQuZ2V0VW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcigpLnZhbGlkYXRlTWFya2Vycyh0aGlzKTsKLS8vCQkJCX0KLS8vCQkJfQotCQl9IGVsc2UgewotCQkJcmVzdG9yZVVSSSgpOwotLy8JCQlpZiAod2FzTW92ZSkgewotLy8JCQkJLy8gcmVzdG9yZSB1cmkgb2YgUmVzb3VyY2VEZXNjcmlwdG9yIG9mIHRoaXMgcmVzb3VyY2UKLS8vCQkJCS8vCi0vLwkJCQlNdWx0aUZpbGVTYXZlVXRpbC51cGRhdGVVUklNYXBwaW5ncyh0aGlzLCBvbGRVUkksIG51bGwsIHRydWUpOwotLy8JCQl9Ci0JCX0KLS8vCQlpZiAob2xkVVJJICE9IG51bGwpIHsKLS8vCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZ2V0UmVzb3VyY2VTZXQoKTsKLS8vCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLS8vCQkJCXJlc291cmNlU2V0LmdldFVSSVRvVGVtcFVSSU1hcCgpLnJlbW92ZShvbGRVUkkpOwotLy8JCQl9Ci0vLwkJCW9sZFVSSSA9IG51bGw7Ci0vLwkJfQotCQljdXJyZW50VHhJRCA9IG51bGw7Ci0JCWZpbmFsVVJJID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyB0aGUgcmVzb3VyY2UgVVJJIHRvIHRoZSBvcmlnaW5hbCBvbmUuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbAotCSAqIGFmdGVyIHNhdmluZyByZWdhcmxlc3Mgb2YgaXRzIHN1Y2Nlc3MuCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVVUkkoKSB7Ci0JCWlmIChvbGRVUkkgIT0gbnVsbCkgewotCQkJcmVzb3VyY2Uuc2V0VVJJKG9sZFVSSSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9GaWxlTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZpbGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg2YTlhNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZpbGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwudXRpbHMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgc3VuLnNlY3VyaXR5LmFjdGlvbi5HZXRQcm9wZXJ0eUFjdGlvbjsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgSUZpbGVNYW5hZ2VyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsZU1hbmFnZXIgaW1wbGVtZW50cyBJRmlsZU1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gRmlsZU1hbmFnZXIuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZU1hbmFnZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRtcGRpcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRlbXBEaXIoKSB7Ci0JCWlmICh0bXBkaXIgPT0gbnVsbCkgewotCQkJR2V0UHJvcGVydHlBY3Rpb24gYSA9IG5ldyBHZXRQcm9wZXJ0eUFjdGlvbigiamF2YS5pby50bXBkaXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJdG1wZGlyID0gKChTdHJpbmcpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGEpKTsKLQkJfQotCQlyZXR1cm4gdG1wZGlyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZUVkaXRJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoRmlsZU1hbmFnZXIuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBGaWxlTWFuYWdlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIEZpbGVNYW5hZ2VyKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGdldFJlc291cmNlRm9yTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGxvY2F0aW9uKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uKTsKLQkJSVJlc291cmNlIHJlc291cmNlOwotCQlpZiAoZmlsZS5pc0ZpbGUoKSkgewotCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHBhcmVudFJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihmaWxlCi0JCQkJCQkuZ2V0UGFyZW50KCkpOwotCQkJCWlmIChwYXJlbnRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwYXJlbnRSZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJfQotCQkJCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRDb250YWluZXJGb3JMb2NhdGlvbihwYXRoKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlZnJlc2goSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghcmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCUFycmF5TGlzdCBmb2xkZXJzVG9SZWZyZXNoID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSUNvbnRhaW5lciBjb250YWluZXI7Ci0JCQlmb3IgKGNvbnRhaW5lciA9IHJlc291cmNlLmdldFBhcmVudCgpOyAhY29udGFpbmVyLmV4aXN0cygpOyBjb250YWluZXIgPSBjb250YWluZXIKLQkJCQkJLmdldFBhcmVudCgpKSB7Ci0JCQkJZm9sZGVyc1RvUmVmcmVzaC5hZGQoMCwgY29udGFpbmVyKTsKLQkJCX0KLQkJCWlmIChjb250YWluZXIuZXhpc3RzKCkpIHsKLQkJCQljb250YWluZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG51bGwpOwotCQkJfQotCQkJaWYgKCFmb2xkZXJzVG9SZWZyZXNoLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGZvbGRlcnNUb1JlZnJlc2guaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcikgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQkJCWZvbGRlci5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmVzb3VyY2UucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG51bGwpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgZmlsZSBvciBkaXJlY3Rvcnkgd2l0aCBnaXZlbiBsb2NhbCBmaWxlIHN5c3RlbQotCSAqIDxjb2RlPnBhdGg8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGxvY2FsIGZpbGUgc3lzdGVtIHBhdGgKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiByZWZyZXNoKFN0cmluZyBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVmcmVzaChyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZnJlc2goUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZWZyZXNoKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbW92ZShTdHJpbmcgb2xkUGF0aCwgU3RyaW5nIG5ld1BhdGgpIHsKLQkJcmV0dXJuIG1vdmUob2xkUGF0aCwgbmV3UGF0aCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1vdmUoU3RyaW5nIG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoLAotCQkJYm9vbGVhbiBmb3JjZVJlbW92ZVNvdXJjZSkgewotCQl0cnkgewotCQkJcmVmcmVzaChvbGRQYXRoKTsKLQotCQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKLQkJCQkJLmdldFJvb3QoKTsKLQotCQkJLy8gY3JlYXRlIHRoZSBmb2xkZXJzIG9mIHRoZSBkZXN0aW5hdGlvbiBpZiB0aGV5IGRpZCBub3QgZXhpc3QKLQkJCUlQYXRoIGRlc3RQYXRoID0gbmV3IFBhdGgobmV3UGF0aCk7Ci0JCQlpZiAobmV3IEZpbGUob2xkUGF0aCkuaXNGaWxlKCkpIHsKLQkJCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKGRlc3RQYXRoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldENvbnRhaW5lckZvckxvY2F0aW9uKGRlc3RQYXRoKTsKLQkJCX0KLQkJCWlmIChyZXNvdXJjZS5leGlzdHMoKSkgewotCQkJCXJlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQkJaWYocmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKE5MUy5iaW5kKAotCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vdmVFcnJvcl9tc2csIG9sZFBhdGgsIG5ld1BhdGgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlBcnJheUxpc3QgZm9sZGVyc1RvQ3JlYXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSUNvbnRhaW5lciBjb250YWluZXI7Ci0JCQlmb3IgKGNvbnRhaW5lciA9IHJlc291cmNlLmdldFBhcmVudCgpOyAhY29udGFpbmVyLmV4aXN0cygpOyBjb250YWluZXIgPSBjb250YWluZXIKLQkJCQkJLmdldFBhcmVudCgpKSB7Ci0JCQkJZm9sZGVyc1RvQ3JlYXRlLmFkZCgwLCBjb250YWluZXIpOwotCQkJfQotCQkJaWYgKCFmb2xkZXJzVG9DcmVhdGUuaXNFbXB0eSgpKSB7Ci0JCQkJY29udGFpbmVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmb2xkZXJzVG9DcmVhdGUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWZvbGRlci5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlkZXN0UGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0KLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChvbGRQYXRoKTsKLQkJCUlGaWxlIGZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotCQkJCXJlc291cmNlID0gZmlsZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldENvbnRhaW5lckZvckxvY2F0aW9uKHBhdGgpOwotCQkJfQotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlyZXNvdXJjZS5tb3ZlKGRlc3RQYXRoLCB0cnVlLCBudWxsKTsKLQkJCQl9IGNhdGNoIChSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChmb3JjZVJlbW92ZVNvdXJjZSkgewotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCi0JCQkJCWJvb2xlYW4gZmFpbGVkID0gZmFsc2U7Ci0KLQkJCQkJLy8gaGFuZGxlIHNpdHVhdGlvbiB3aGVuIEVjbGlwc2UgbW92ZXMgZmlsZS9kaXJlY3RvcnkgYnkKLQkJCQkJLy8gY29weWluZyBpdCB0byBkZXN0aW5hdGlvbiB0aGVuIGRlbGV0aW5nIHRoZSBzb3VyY2UKLQkJCQkJLy8gYnV0IGRlbGV0aW9uIGZhaWxlZAotCQkJCQlJU3RhdHVzW10gc3RhdHVzZXMgPSBlLmdldFN0YXR1cygpLmdldENoaWxkcmVuKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gc3RhdHVzZXNbaV07Ci0JCQkJCQlpZiAoc3RhdHVzLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX0RFTEVURV9MT0NBTAotCQkJCQkJCQkmJiBzdGF0dXMuZ2V0TWVzc2FnZSgpID09IE1lc3NhZ2VzLmxvY2Fsc3RvcmVfZGVsZXRlUHJvYmxlbSkgewotCQkJCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkiV2FybmluZyB3aGlsZSBtb3ZpbmcgJyd7MH0nJyB0byAnJ3sxfScnOiB7Mn0iLCBuZXcgT2JqZWN0W10geyBvbGRQYXRoLCBuZXdQYXRoLCBzdGF0dXMuZ2V0TWVzc2FnZSgpIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhtc2cpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlmYWlsZWQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChmYWlsZWQgfHwgIW5ldyBGaWxlKG5ld1BhdGgpLmV4aXN0cygpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbmFtZShGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlyZXR1cm4gbW92ZShvbGRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBuZXdGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVSZXNvdXJjZShTdHJpbmcgcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBubyBuZWVkIHRvIHJlZnJlc2ggdGhlIHdob2xlIHRyZWUgZnJvbSBzcGVjaWZpZWQgcGF0aAotCQkvLyBnZXRSZXNvdXJjZUZvckxvY2F0aW9uKCkgcmVmcmVzaGVzIHJlc291cmNlIGluIGEgbW9yZSBlZmZpY2llbnQgd2F5Ci0JCS8vCi0JCS8vIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPQotCQkvLyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkvLyB0cnkgewotCQkvLyB3b3Jrc3BhY2VSb290LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOwotCQkvLyB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCS8vIGUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkvLyB9Ci0KLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihwYXRoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJlc291cmNlLmRlbGV0ZSh0cnVlLCBtb25pdG9yKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGRlbGV0ZShTdHJpbmcgcGF0aCkgewotCQl0cnkgewotCQkJZGVsZXRlUmVzb3VyY2UocGF0aCwgbnVsbCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmcm9tQ0MoSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gc3RhdHVzLmdldFBsdWdpbigpOwotCQlyZXR1cm4gcGx1Z2luSWQgIT0gbnVsbAotCQkJCSYmIHBsdWdpbklkLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiY2xlYXJjYXNlIikgIT0gLTE7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmdbXSBwYXRocywgT2JqZWN0IGNvbnRleHQpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVtwYXRocy5sZW5ndGhdOwotCQlBcnJheUxpc3Qgbm90Rm91bmRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHBhdGggPSBwYXRoc1tpXTsKLQkJCXRyeSB7Ci0JCQkJcmVmcmVzaChwYXRoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQl9Ci0JCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgocGF0aCkpOwotCQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJCW5vdEZvdW5kRmlsZXMuYWRkKHBhdGgpOwotCQkJfSBlbHNlIHsKLQkJCQlmaWxlc1tpXSA9IGZpbGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFub3RGb3VuZEZpbGVzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQTFVHSU5fSUQsIElTdGF0dXMuV0FSTklORywgTkxTCi0JCQkJCS5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmZpbGVOb3RGb3VuZEVycm9yX21zZywKLQkJCQkJCQlub3RGb3VuZEZpbGVzKSwgbnVsbCk7Ci0JCX0KLQotCQlpZiAoIXZhbGlkYXRlRWRpdEluaXRpYWxpemVkKSB7Ci0JCQlzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KGZpbGVzLCBjb250ZXh0KTsKLQkJCXZhbGlkYXRlRWRpdEluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkJLy8gZG91YmxlLWNoZWNrIGFmdGVyIGluaXRpYWxpemF0aW9uCi0JCQkJLy8KLQkJCQlzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KGZpbGVzLCBjb250ZXh0KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZUVkaXQoZmlsZXMsIGNvbnRleHQpOwotCQl9Ci0KLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCS8vIHNvbWUgdmVyc2lvbiBjb250cm9sIHByb3ZpZGVyIHN0aWxsIHJldHVybnMgT0sgc3RhdHVzIGV2ZW4gdGhvdWdoCi0JCQkvLyB1c2VyIGNhbmNlbGxlZCB0aGUgY2hlY2sgb3V0Ci0JCQkvLyBkb3VibGUtY2hlY2sgaGVyZSBhZ2FpbiB0byBtYWtlIHN1cmUgdGhlIGZpbGUgaXMgbm90IHJlYWQtb25seQotCQkJLy8JCQkKLQkJCUFycmF5TGlzdCByZWFkT25seUZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCUlGaWxlIGZpbGUgPSBmaWxlc1tpXTsKLQkJCQl0cnkgewotCQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJfQotCQkJCWlmIChmaWxlLmlzUmVhZE9ubHkoKSkgewotCQkJCQlyZWFkT25seUZpbGVzLmFkZChmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXJlYWRPbmx5RmlsZXMuaXNFbXB0eSgpKSB7Ci0JCQkJTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoUExVR0lOX0lELAotCQkJCQkJSVN0YXR1cy5PSywgUGVyc2lzdGVuY2VSZXNvdXJjZXMubW9kaWZ5RmlsZXNFcnJvcl9tc2csCi0JCQkJCQludWxsKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWFkT25seUZpbGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBpdGVyLm5leHQoKTsKLQkJCQkJU3RyaW5nIGxvY2FsUGF0aCA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5GaWxlTWFuYWdlcl9maWxlUmVhZE9ubHksCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgbG9jYWxQYXRoIH0pOwotCQkJCQltdWx0aVN0YXR1cy5hZGQobmV3IFJlc291cmNlU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIGZpbGUKLQkJCQkJCQkuZ2V0RnVsbFBhdGgoKSwgbXNnLCBudWxsKSk7Ci0JCQkJfQotCQkJCXN0YXR1cyA9IG11bHRpU3RhdHVzOwotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBoYWNrIGZvciBjbGVhcmNhc2UKLQkJCWlmIChmcm9tQ0Moc3RhdHVzKSkgewotCQkJCVN0cmluZyBtc2cgPSBQZXJzaXN0ZW5jZVJlc291cmNlcy5tb2RpZnlGaWxlc0Vycm9yX21zZzsKLQkJCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhQTFVHSU5fSUQsIHN0YXR1cwotCQkJCQkJLmdldENvZGUoKSwgbXNnLCBudWxsKTsKLQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCQlyZXR1cm4gbXVsdGlTdGF0dXM7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjb252ZXJ0IHdvcmtzcGFjZSBwYXRoIHRvIGxvY2FsIGZpbGUgc3lzdGVtIHBhdGgKLQkJaWYgKHN0YXR1cyBpbnN0YW5jZW9mIE11bHRpU3RhdHVzKSB7Ci0JCQlNdWx0aVN0YXR1cyBtcyA9IChNdWx0aVN0YXR1cykgc3RhdHVzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtcy5nZXRDaGlsZHJlbigpLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVN0YXR1cyBjaGlsZFN0YXR1cyA9IG1zLmdldENoaWxkcmVuKClbaV07Ci0JCQkJaWYgKGNoaWxkU3RhdHVzIGluc3RhbmNlb2YgSVJlc291cmNlU3RhdHVzCi0JCQkJCQkmJiBjaGlsZFN0YXR1cy5nZXRDb2RlKCkgPT0gSVJlc291cmNlU3RhdHVzLlJFQURfT05MWV9MT0NBTCkgewotCQkJCQlJUmVzb3VyY2VTdGF0dXMgcmVzb3VyY2VTdGF0dXMgPSAoKElSZXNvdXJjZVN0YXR1cykgY2hpbGRTdGF0dXMpOwotCQkJCQlJUGF0aCBwYXRoID0gcmVzb3VyY2VTdGF0dXMuZ2V0UGF0aCgpOwotCQkJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKQotCQkJCQkJCS5nZXRGaWxlKHBhdGgpOwotCQkJCQlTdHJpbmcgbG9jYWxQYXRoID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLkZpbGVNYW5hZ2VyX2ZpbGVSZWFkT25seSwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBsb2NhbFBhdGggfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbXMuZ2V0Q2hpbGRyZW4oKVtpXSA9IG5ldyBSZXNvdXJjZVN0YXR1cyhjaGlsZFN0YXR1cwotCQkJCQkJCS5nZXRTZXZlcml0eSgpLCBjaGlsZFN0YXR1cy5nZXRDb2RlKCksCi0JCQkJCQkJcmVzb3VyY2VTdGF0dXMuZ2V0UGF0aCgpLCBtc2csIGNoaWxkU3RhdHVzCi0JCQkJCQkJCQkuZ2V0RXhjZXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyI2NoZWNrTW9kaWZ5KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KFN0cmluZyBwYXRoLCBPYmplY3QgY29udGV4dCkgewotCQlyZXR1cm4gY2hlY2tNb2RpZnkobmV3IFN0cmluZ1tdIHsgcGF0aCB9LCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHBhdGggaXMgdGVhbS1wcml2YXRlIGZpbGUgb3IgZm9sZGVyCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUZWFtUHJpdmF0ZShTdHJpbmcgcGF0aCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZUZvckxvY2F0aW9uKHBhdGgpOwotCQlyZXR1cm4gcmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5pc1RlYW1Qcml2YXRlTWVtYmVyKCk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIFVSSSwgdXNpbmcgYSBVUkkgY29udmVydGVyCi0gICAgICogaWYgbmVjZXNzYXJ5IChhbmQgcHJvdmlkZWQpIHRvIG5vcm1hbGl6ZSBpdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpIGEgVVJJCi0gICAgICogQHBhcmFtIGNvbnZlcnRlciBhbiBvcHRpb25hbCBVUkkgY29udmVydGVyIChtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4pCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmlsZSwgaWYgYXZhaWxhYmxlIGluIHRoZSB3b3Jrc3BhY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElGaWxlIGdldEZpbGUoVVJJIHVyaSwgVVJJQ29udmVydGVyIGNvbnZlcnRlcikgewotICAgICAgICBJRmlsZSByZXN1bHQgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKCJwbGF0Zm9ybSIuZXF1YWxzKHVyaS5zY2hlbWUoKSkgJiYgKHVyaS5zZWdtZW50Q291bnQoKSA+IDIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmICgicmVzb3VyY2UiLmVxdWFscyh1cmkuc2VnbWVudCgwKSkpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChVUkkuZGVjb2RlKHVyaS5wYXRoKCkpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh1cmkuaXNGaWxlKCkgJiYgIXVyaS5pc1JlbGF0aXZlKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKAotICAgICAgICAgICAgICAgIG5ldyBQYXRoKHVyaS50b0ZpbGVTdHJpbmcoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbm9ybWFsaXplLCB0byBzZWUgd2hldGhlciBtYXkgd2UgY2FuIHJlc29sdmUgaXQgdGhpcyB0aW1lCi0gICAgICAgICAgICBpZiAoY29udmVydGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBVUkkgbm9ybWFsaXplZCA9IGNvbnZlcnRlci5ub3JtYWxpemUodXJpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoIXVyaS5lcXVhbHMobm9ybWFsaXplZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVjdXJzZSBvbiB0aGUgbmV3IFVSSQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBnZXRGaWxlKG5vcm1hbGl6ZWQsIGNvbnZlcnRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvRmlsZVN0cmluZyhVUkkgdXJpLCBVUklDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCWlmKHVyaS5pc0ZpbGUoKSkgewotCQkJcmV0dXJuIHVyaS50b0ZpbGVTdHJpbmcoKTsKLQkJfQotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZSh1cmksIGNvbnZlcnRlcik7Ci0JCXJldHVybiBmaWxlICE9IG51bGwgPyBmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvRmlsZVN0cmluZyhVUkkgdXJpKSB7Ci0JCXJldHVybiB0b0ZpbGVTdHJpbmcodXJpLCBudWxsKTsKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9GaWxlUGF0aFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRmlsZVBhdGhQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZmMyNmVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9GaWxlUGF0aFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBGaWxlLWJhc2VkIFVSSSBwcm92aWRlcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyA4LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1jbGFzcyBGaWxlUGF0aFByb3ZpZGVyIGltcGxlbWVudHMgSVVSSVByb3ZpZGVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5JVVJJUHJvdmlkZXIjZ2V0VVJJKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBVUkkgZ2V0VVJJKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiBNdWx0aUZpbGVTYXZlVXRpbC5jcmVhdGVGaWxlVVJJKChNZXRob2RFbGVtZW50KSBvYmplY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0lVUklQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0lVUklQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZmVjZjVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9JVVJJUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHByb3ZpZGUgVVJJIGZvciBhbiBFT2JqZWN0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyA4LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVUklQcm92aWRlciB7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgVVJJIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IGlmIHRoaXMgb2JqZWN0IGhhcyBvciBzaG91bGQgaGF2ZSBhIGRpcmVjdCByZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSBVUkkgb3IgbnVsbCBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGRvZXMvd2lsbCBub3QgaGF2ZSBhIGRpcmVjdCByZXNvdXJjZQotCSAqLwotCVVSSSBnZXRVUkkoRU9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL01ldGhvZExpYnJhcnlQZXJzaXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZmMDc1NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL01ldGhvZExpYnJhcnlQZXJzaXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLmludGVybmFsLklGYWlsU2FmZVNhdmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogRmlsZS1iYXNlZCBpbXBsZW1lbnRhdGlvbiBmb3IgSU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgaW1wbGVtZW50cyBJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGb2xkZXJJbmZvIHsKLQotCQlFQ2xhc3MgZUNsYXp6OwotCi0JCWJvb2xlYW4gc2hhcmVkOwotCi0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBjbGF6egotCQkgKiBAcGFyYW0gc2hhcmVkCi0JCSAqLwotCQlwdWJsaWMgRm9sZGVySW5mbyhFQ2xhc3MgY2xhenosIGJvb2xlYW4gc2hhcmVkKSB7Ci0JCQlzdXBlcigpOwotCQkJZUNsYXp6ID0gY2xheno7Ci0JCQl0aGlzLnNoYXJlZCA9IHNoYXJlZDsKLQkJCXRoaXMubmFtZSA9IGxvd2VyQW5kUGx1cmFsaXplKGNsYXp6LmdldE5hbWUoKSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kTGlicmFyeVBlcnNpc3RlciBJTlNUQU5DRSA9IG5ldyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyKCk7Ci0KLQkvLyBuZWVkIHRvIGV4cG9zZSB0aGlzLCBqeGkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9GT0xERVIgPSAicmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBmb2xkZXJJbmZvcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXN0YXRpYyB7Ci0JCWZvbGRlckluZm9zLmFkZChuZXcgRm9sZGVySW5mbyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZSgpLAotCQkJCWZhbHNlKSk7Ci0JCWZvbGRlckluZm9zLmFkZChuZXcgRm9sZGVySW5mbyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCXRydWUpKTsKLQkJZm9sZGVySW5mb3MKLQkJCQkuYWRkKG5ldyBGb2xkZXJJbmZvKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCksIHRydWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCB3YXJuaW5nczsKLQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvcnJlY3QgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHBsdWdpbikgb2YgdGhlIGZpbGUgb2YgdGhlCi0JICogZ2l2ZW4gY29udGVudCBkZXNjcmlwdGlvbiBvciBudWxsIGlmIHRoZSBnaXZlbiBjb250ZW50IGRvZXMgbm90IGJlIGxvbmcKLQkgKiB0byBhbnkgcGx1Z2luLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvcnJlY3RQYXRoKENvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50KSB7Ci0JCXJldHVybiBnZXRDb3JyZWN0UGF0aCgoRGVzY3JpYmFibGVFbGVtZW50KSBjb250ZW50LmVDb250YWluZXIoKSwKLQkJCQljb250ZW50KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q29ycmVjdFBhdGgoRGVzY3JpYmFibGVFbGVtZW50IGUsCi0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCkgewotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJaWYgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlSZXNvdXJjZSByZXNvdXJjZSA9IHBsdWdpbi5lUmVzb3VyY2UoKTsKLQkJVVJJIHVyaTsKLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQl1cmkgPSAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UpLmdldEZpbmFsVVJJKCk7Ci0JCX0gZWxzZSB7Ci0JCQl1cmkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJfQotCQlGaWxlIHBsdWdpbkRpciA9IG5ldyBGaWxlKHVyaS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQlTdHJpbmcgZm9sZGVyUGF0aCA9IHN0YXRpY0dldEZvbGRlclBhdGgoZS5lQ2xhc3MoKSk7Ci0JCVN0cmluZyBkaXIgPSBuZXcgU3RyaW5nQnVmZmVyKHBsdWdpbkRpci5nZXRBYnNvbHV0ZVBhdGgoKSkuYXBwZW5kKAotCQkJCUZpbGUuc2VwYXJhdG9yKS5hcHBlbmQoZm9sZGVyUGF0aCkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKQotCQkJCS50b1N0cmluZygpOwotCi0JCXJldHVybiBnZXROZXh0QXZhaWxhYmxlRmlsZU5hbWUoZGlyLCBlLCBjb250ZW50KTsKLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShTdHJpbmcgZGlyLCBTdHJpbmcgcmVxdWVzdGVkTmFtZSwKLQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IGUpIHsKLQkJU3RyaW5nIGN1cnJlbnRGaWxlbmFtZSA9IG51bGw7Ci0JCUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBlCi0JCQkJLmVEaXJlY3RSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJLy8ga2VlcCBleGlzdGluZyBmaWxlIG5hbWUgZHVyaW5nIG1vdmUgaWYgaXQgaXMgbm90IHRha2VuIHlldC4gRG9uJ3QKLQkJCS8vIHRyeSB0byBtYXRjaCB0aGUgZWxlbWVudCdzIG5hbWUKLQkJCS8vCi0JCQlTdHJpbmcgcGF0aCA9ICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBlLmVSZXNvdXJjZSgpKQotCQkJCQkuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCWN1cnJlbnRGaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQljdXJyZW50RmlsZW5hbWUgPSBjdXJyZW50RmlsZS5nZXROYW1lKCk7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIGN1cnJlbnRGaWxlbmFtZSk7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQkvLyB0aGUgZWxlbWVudCBpcyBiZWluZyBtb3ZlZAotCQkJCS8vCi0JCQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBlbGVtZW50IHdpdGhvdXQgYSByZXNvdXJjZSBvciBwYXRoIGlzIGFscmVhZHkgdGFrZW4KLQkJLy8KLQkJU3RyaW5nIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGRpcikuYXBwZW5kKHJlcXVlc3RlZE5hbWUpLmFwcGVuZCgKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OKS50b1N0cmluZygpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYoZmlsZS5lcXVhbHMoY3VycmVudEZpbGUpKSB7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCQlpZiAoKGN1cnJlbnRGaWxlbmFtZSAhPSBudWxsICYmIGN1cnJlbnRGaWxlbmFtZS5lcXVhbHMocmVxdWVzdGVkTmFtZSkpCi0JCQkJfHwgZmlsZS5leGlzdHMoKSkgewotCQkJZm9yIChpbnQgaSA9IDI7IHRydWU7IGkrKykgewotCQkJCXBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGRpcikuYXBwZW5kKHJlcXVlc3RlZE5hbWUpLmFwcGVuZCgnICcpCi0JCQkJCQkuYXBwZW5kKGkpLmFwcGVuZCgKLQkJCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTikKLQkJCQkJCS50b1N0cmluZygpOwotCQkJCWlmICghbmV3IEZpbGUocGF0aCkuZXhpc3RzKCkpIHsKLQkJCQkJcmV0dXJuIHBhdGg7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShTdHJpbmcgZGlyLAotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQpIHsKLQkJcmV0dXJuIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsIChEZXNjcmliYWJsZUVsZW1lbnQpIGNvbnRlbnQKLQkJCQkuZUNvbnRhaW5lcigpLCBjb250ZW50KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV4dEF2YWlsYWJsZUZpbGVOYW1lKFN0cmluZyBkaXIsCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZSwgQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQpIHsKLQkJcmV0dXJuIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsIGUuZ2V0TmFtZSgpLAotCQkJCShNdWx0aVJlc291cmNlRU9iamVjdCkgY29udGVudCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0YXRpY0dldEZvbGRlclBhdGgoRUNsYXNzIGVDbGF6eikgewotCQlpbnQgc2l6ZSA9IGZvbGRlckluZm9zLnNpemUoKTsKLQkJRm9sZGVySW5mbyBpbmZvID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUZvbGRlckluZm8gZm9sZGVySW5mbyA9IChGb2xkZXJJbmZvKSBmb2xkZXJJbmZvcy5nZXQoaSk7Ci0JCQlpZiAoZm9sZGVySW5mby5lQ2xhenouaXNTdXBlclR5cGVPZihlQ2xhenopKSB7Ci0JCQkJaW5mbyA9IGZvbGRlckluZm87Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKGluZm8uZUNsYXp6ID09IGVDbGF6eiB8fCBpbmZvLnNoYXJlZCkgewotCQkJCXJldHVybiBpbmZvLm5hbWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKGluZm8ubmFtZSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcikKLQkJCQkJCS5hcHBlbmQobG93ZXJBbmRQbHVyYWxpemUoZUNsYXp6LmdldE5hbWUoKSkpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbG93ZXJBbmRQbHVyYWxpemUoZUNsYXp6LmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb3dlckFuZFBsdXJhbGl6ZShTdHJpbmcgbmFtZSkgewotCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQlpZiAobmFtZS5lbmRzV2l0aCgiY2hpbGRyZW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZTsKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJjaGlsZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuYW1lICsgInJlbiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJkYXRhIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWU7Ci0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgiZGF0dW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDIpICsgImEiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgiYnkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZSArICJzIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG5hbWUuZW5kc1dpdGgoInkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDEpICsgImllcyI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJleCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMikgKyAiaWNlcyI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJ4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWUgKyAiZXMiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgidXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDIpICsgImkiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgic3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZSArICJlcyI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmFtZSArICJzIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSByb290IGRpcmVjdG9yeSB0byB0aGUgcmVzb3VyY2UKLQkgKiBmb2xkZXIgb2YgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlUGF0aChNZXRob2RFbGVtZW50IGUpIHsKLQkJU3RyaW5nIGZvbGRlclBhdGggPSBnZXRFbGVtZW50UGF0aChlKTsKLQkJaWYgKGZvbGRlclBhdGggPT0gbnVsbCB8fCBmb2xkZXJQYXRoLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJcmV0dXJuIFJFU09VUkNFX0ZPTERFUjsKLQkJfSBlbHNlIGlmIChmb2xkZXJQYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoZm9sZGVyUGF0aCkuYXBwZW5kKFJFU09VUkNFX0ZPTERFUikKLQkJCQkJLnRvU3RyaW5nKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcihmb2xkZXJQYXRoKS5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpLmFwcGVuZCgKLQkJCQkJUkVTT1VSQ0VfRk9MREVSKS50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJaWYgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQlpZiAoIShlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiB8fCBlIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCQkvLyBlcnJvcjogcGx1Z2luIGVsZW1lbnQgd2l0aG91dCBhIHZhbGlkIHBsdWdpbiBzZXQuIFRoaXMKLQkJCQkvLyBwcm9ibGVtIG5lZWRzIHRvIGJlIGZpeGVkLgotCQkJCS8vIHN0aWxsIHNlZSBpdCBmcm9tIHRpbWUgdG8gdGltZSwKLQkJCQkvLyBmb3IgZXhhbXBsZSwgd2hlbiBsaWNrIG9uIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGluCi0JCQkJLy8gQ09uZmlndXJhdGlvbiBFeHBsb3JlcgotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJlcnJvciBpbiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmdldEVsZW1lbnRQYXRoKCk6IHBsdWdpbiBlbGVtZW50IHdpdGhvdXQgYSB2YWxpZCBwbHVnaW4uIFRoaXMgcHJvYmxlbSBuZWVkcyB0byBiZSBmaXhlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAocGx1Z2luLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkvLyBlcnJvcjogcGx1Z2luIHdpdGhvdXQgbGlicmFyeSBzZXQuIFRoaXMgcHJvYmxlbSBuZWVkcyB0byBiZQotCQkJLy8gZml4ZWQuCi0JCQkvLyBzdGlsbCBzZWUgaXQgZnJvbSB0aW1lIHRvIHRpbWUKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oImVycm9yIGluIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0RWxlbWVudFBhdGgoKTogcGx1Z2luIHdpdGhvdXQgbGlicmFyeSBzZXQuIFRoaXMgcHJvYmxlbSBuZWVkcyB0byBiZSBmaXhlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmcgcmVsUGx1Z2luUGF0aDsKLQkJaWYgKHBsdWdpbi5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSBsaWJSZXMgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkocGx1Z2luKS5lUmVzb3VyY2UoKTsKLQkJCWlmIChsaWJSZXMgPT0gcGx1Z2luLmVSZXNvdXJjZSgpKSB7Ci0JCQkJLy8gdGhlIHBsdWdpbiBpcyBub3Qgc2F2ZWQgeWV0Ci0JCQkJcmVsUGx1Z2luUGF0aCA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCQl9IGVsc2UgewotCQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShwbHVnaW4uZVJlc291cmNlKCkpOwotCQkJCVVSSSByZWxVcmkgPSB1cmkuZGVyZXNvbHZlKE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkuZ2V0RmluYWxVUkkobGliUmVzKSk7Ci0JCQkJcmVsUGx1Z2luUGF0aCA9IHJlbFVyaS50cmltU2VnbWVudHMoMSkudG9GaWxlU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0aGUgbGlicmFyeSBpcyBub3Qgc2F2ZWQgeWV0Ci0JCQlyZWxQbHVnaW5QYXRoID0gcGx1Z2luLmdldE5hbWUoKTsKLQkJfQotCQlTdHJpbmcgZm9sZGVyUGF0aCA9IHN0YXRpY0dldEZvbGRlclJlbGF0aXZlUGF0aChlKTsKLQotCQlyZXR1cm4gKGZvbGRlclBhdGgubGVuZ3RoKCkgPT0gMCA/IHJlbFBsdWdpblBhdGggOiBuZXcgU3RyaW5nQnVmZmVyKAotCQkJCXJlbFBsdWdpblBhdGgpLmFwcGVuZChGaWxlLnNlcGFyYXRvckNoYXIpLmFwcGVuZChmb2xkZXJQYXRoKQotCQkJCS5hcHBlbmQoRmlsZS5zZXBhcmF0b3JDaGFyKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCUVDbGFzcyBlQ2xzID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGVDbHMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGp1c3RzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIHNhdmUgYWxsIHRoZSByZXNvdXJjZXMKLQkgKiB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIGFzIHRoZSByZXN1bHQgb2YgdGhpcyBhZGp1c3RtZW50Ci0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRqdXN0TG9jYXRpb24oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJTXVsdGlGaWxlU2F2ZVV0aWwuYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQkvLyBzYXZlIHRoZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlU2V0LnNhdmUoKFJlc291cmNlKSBpdGVyLm5leHQoKSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcmVzb3VyY2VTZXQuc2F2ZShyZXNvdXJjZSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmlsZXMoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgcGF0aCwKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCWlmIChuZXcgRmlsZShwYXRoKS5pc0RpcmVjdG9yeSgpICYmICFlLmVJc1Byb3h5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQkJCWlmIChtZSAhPSBudWxsICYmIFVtYVV0aWwuaXNDb250YWluZWRCeShtZSwgZSkpIHsKLQkJCQkJcmVzLnVubG9hZCgpOwotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRlbGV0ZVJlc291cmNlKHBhdGgsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGV4KTsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlKE1ldGhvZEVsZW1lbnQgZSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCWlmICghVW1hVXRpbC5oYXNEaXJlY3RSZXNvdXJjZShlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZQotCQkJCS5lUmVzb3VyY2UoKTsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQotCQkvLyBEb24ndCBkZWxldGUgdGhpcyByZXNvdXJjZSdzIGZpbGUgaWYgaXQgc3RpbGwgY29udGFpbnMgb3RoZXIKLQkJLy8gTWV0aG9kRWxlbWVudAotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBlbGVtZW50ICE9IGUpIHsKLQkJCQlyZXNvdXJjZVNldC5yZW1vdmVVUklNYXBwaW5ncyhlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoZSk7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgcGF0aDsKLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLmhhc093bkZvbGRlcihlKSkgewotCQkJLy8gcGF0aCBpcyB0aGUgZGlyZWN0b3J5IG9mIHRoZSBNZXRob2RQbHVnaW4vUHJvY2Vzc0NvbXBvbmVudAotCQkJLy8KLQkJCXBhdGggPSBuZXcgRmlsZShyZXNvdXJjZS5nZXRGaW5hbFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKTsKLQotCQkJLy8gdW5sb2FkL3JlbW92ZSBhbGwgcmVzb3VyY2VzIHVuZGVyIHRoZSBmb2xkZXIKLQkJCS8vCi0JCQlDb2xsZWN0aW9uIHVubG9hZGVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZG8gewotCQkJCXVubG9hZGVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQkJLy8gY29sbGVjdCBhbGwgcmVzb3VyY2VzIHdob3NlIHJvb3QgZWxlbWVudCBpcyBjb250YWluZWQgYnkgdGhlCi0JCQkJLy8gZ2l2ZW4gZWxlbWVudAotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKHJlcy5pc0xvYWRlZCgpKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG1lID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHJlcyk7Ci0JCQkJCQlpZiAobWUgIT0gbnVsbCAmJiBVbWFVdGlsLmlzQ29udGFpbmVkQnkobWUsIGUpKSB7Ci0JCQkJCQkJdW5sb2FkZWRSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdW5sb2FkZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJcmVzLnVubG9hZCgpOwotCQkJCX0KLQkJCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmVBbGwodW5sb2FkZWRSZXNvdXJjZXMpOwotCQkJfSB3aGlsZSAoIXVubG9hZGVkUmVzb3VyY2VzLmlzRW1wdHkoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXRoID0gcmVzb3VyY2UuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXNvdXJjZVNldC5jbGVhblVwKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlMSk7Ci0JCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCWRlbGV0ZUZpbGVzKGUsIHBhdGgsIHJlc291cmNlU2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBvYmplY3RzV2l0aERpcmVjdFJlc291cmNlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0T2JqZWN0c1dpdGhEaXJlY3RSZXNvdXJjZXMoRU9iamVjdCBlLAotCQkJQ29sbGVjdGlvbiBvYmplY3RzV2l0aERpcmVjdFJlc291cmNlcykgewotCQlpZiAoVW1hVXRpbC5oYXNEaXJlY3RSZXNvdXJjZShlKSkgewotCQkJb2JqZWN0c1dpdGhEaXJlY3RSZXNvdXJjZXMuYWRkKGUpOwotCQl9IGVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZS5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlnZXRPYmplY3RzV2l0aERpcmVjdFJlc291cmNlcygoRU9iamVjdCkgaXRlci5uZXh0KCksCi0JCQkJCQlvYmplY3RzV2l0aERpcmVjdFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNkZWxldGUob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShNZXRob2RFbGVtZW50IGUpIHsKLQkJLy8gY29sbGVjdCBhbGwgZWxlbWVudHMgd2l0aCBkaXJlY3QgcmVzb3VyY2VzIHRoYXQgYXJlIHRoZSBnaXZlbiBlbGVtZW50Ci0JCS8vIG9yIGl0cyBvZmZzdHJpbmcKLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRPYmplY3RzV2l0aERpcmVjdFJlc291cmNlcyhlLCBlbGVtZW50cyk7Ci0JCWlmICghZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJZGVsZXRlKChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKSwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJfQotCi0JCQkvLyBzYXZlIG1vZGlmaWVkIHJlc291cmNlcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQlzYXZlKHJlc291cmNlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZXgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIGZvbGRlciB0aGF0IGNhbiBzdG9yZSB0aGUgY29udGVudCBvZiB0aGUKLQkgKiBnaXZlbiBNZXRob2RFbGVtZW50LiBUaGUgcGF0aCBpcyByZWxhdGl2ZSB0byBpdHMgcGx1Z2luIGZvbGRlciBvciBsaWJyYXJ5Ci0JICogZm9sZGVyIGlmIHRoZSBlbGVtZW50IGNhbm5vdCBiZSBzdG9yZWQgaW4gYSBwbHVnaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0YXRpY0dldEZvbGRlclJlbGF0aXZlUGF0aChNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJcmV0dXJuIHN0YXRpY0dldEZvbGRlclBhdGgoZS5lQ2xhc3MoKSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXJldHVybiBNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRTsKLQkJfQotCi0JCU1ldGhvZFVuaXQgdW5pdCA9IFVtYVV0aWwuZ2V0TWV0aG9kVW5pdChlKTsKLQotCQlpZiAodW5pdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgdW5pdCkuZ2V0UHJvY2VzcygpOwotCQkJaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCXJldHVybiBNdWx0aUZpbGVTYXZlVXRpbC5DQVBBQklMSVRZX1BBVFRFUk5fUEFUSDsKLQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCXJldHVybiBNdWx0aUZpbGVTYXZlVXRpbC5ERUxJVkVSWV9QUk9DRVNTX1BBVEg7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodW5pdCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJcmV0dXJuIHN0YXRpY0dldEZvbGRlclJlbGF0aXZlUGF0aCgoTWV0aG9kRWxlbWVudCkgdW5pdAotCQkJCQkuZUNvbnRhaW5lcigpKTsKLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gc3RhdGljR2V0Rm9sZGVyUmVsYXRpdmVQYXRoKGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2dldFdhcm5pbmdzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXYXJuaW5ncygpIHsKLQkJaWYgKHdhcm5pbmdzID09IG51bGwpIHsKLQkJCXdhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiB3YXJuaW5nczsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgRmFpbFNhZmVQZXJzaXN0ZXIgZXh0ZW5kcyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGltcGxlbWVudHMKLQkJCUZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciB7Ci0KLQkJcHJpdmF0ZSBNYXAgc2F2ZU9wdGlvbnM7Ci0KLQkJcHJpdmF0ZSBUeFJlY29yZCB0eFJlY29yZCA9IG5ldyBUeFJlY29yZCgpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlR4UmVjb3JkI2NsZWFyKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQkJaWYgKHdhcm5pbmdzICE9IG51bGwgJiYgIXdhcm5pbmdzLmlzRW1wdHkoKSkgewotCQkJCQkvLyBjb3B5IHRoZSB3YXJuaW5nIHRvIHBlcnNpc3RlcgotCQkJCQkvLwotCQkJCQlGYWlsU2FmZVBlcnNpc3Rlci50aGlzLndhcm5pbmdzID0gQ29sbGVjdGlvbnMKLQkJCQkJCQkudW5tb2RpZmlhYmxlTGlzdCh3YXJuaW5ncyk7Ci0JCQkJfQotCQkJCXN1cGVyLmNsZWFyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBNYXAgZWxlbWVudFRvSW5mb01hcFRvRGVsZXRlRmlsZXM7Ci0KLQkJcHVibGljIEZhaWxTYWZlUGVyc2lzdGVyKCkgewotCQkJc2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcCgKLQkJCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLkRFRkFVTFRfU0FWRV9PUFRJT05TKTsKLQkJCXR4UmVjb3JkID0gbmV3IFR4UmVjb3JkKCk7Ci0JCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuVFhfUkVDT1JELCB0eFJlY29yZCk7Ci0JCQllbGVtZW50VG9JbmZvTWFwVG9EZWxldGVGaWxlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NZXRob2RMaWJyYXJ5UGVyc2lzdGVyI2dldFdhcm5pbmdzKCkKLQkJICovCi0JCXB1YmxpYyBMaXN0IGdldFdhcm5pbmdzKCkgewotCQkJaWYgKHR4UmVjb3JkLmdldFR4SUQoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFdhcm5pbmdzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHhSZWNvcmQuZ2V0V2FybmluZ3MoKTsKLQkJfQotCi0JCU1hcCBnZXRTYXZlT3B0aW9ucygpIHsKLQkJCXJldHVybiBzYXZlT3B0aW9uczsKLQkJfQotCi0JCXZvaWQgY2hlY2tNb3ZlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkvLyBkaXNhbGxvdyBuZXcgb3BlcmF0aW9uIG9uIHJlc291cmNlIHdoaWNoIGhhcyBzdGFydGVkIG9wZXJhdGlvbgotCQkJLy8gdGhhdCBpcyBub3QgY29tbWl0dGVkCi0JCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgbWZSZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlOwotCQkJaWYgKG1mUmVzb3VyY2UudHhTdGFydGVkKCkpIHsKLQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5tb3ZlUmVzb3VyY2VFcnJvcl9tc2csIHJlc291cmNlKSk7Ci0JCQl9CQkJCi0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjc2F2ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzYXZlKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCWlmKHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgJiYKLQkJCQkJcmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZQotCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCWlmIChyZXNvdXJjZVNldCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQkvLyB1cGRhdGUgdmVyc2lvbiBpbmZvIGluIGxpYnJhcnkgcmVzb3VyY2UgaWYgbmVlZGVkCi0JCQkJLy8KLQkJCQlSZXNvdXJjZSBsaWJSZXNvdXJjZVRvU2F2ZSA9IG51bGw7Ci0JCQkJTWV0aG9kRWxlbWVudCBtZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCQlpZihtZSAhPSBudWxsKSB7Ci0JCQkJCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KG1lKTsKLQkJCQkJaWYobGliICE9IG51bGwpIHsKLQkJCQkJCVJlc291cmNlIGxpYlJlc291cmNlID0gbGliLmVSZXNvdXJjZSgpOwotCQkJCQkJaWYobGliUmVzb3VyY2UgIT0gbnVsbCAKLQkJCQkJCQkJJiYgbGliUmVzb3VyY2UgIT0gcmVzb3VyY2UKLQkJCQkJCQkJJiYgUGVyc2lzdGVuY2VVdGlsLmNoZWNrVG9vbFZlcnNpb24obGliUmVzb3VyY2UpICE9IDApIHsKLQkJCQkJCQlsaWJSZXNvdXJjZVRvU2F2ZSA9IGxpYlJlc291cmNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKE11bHRpRmlsZVhNSVNhdmVJbXBsLmNoZWNrTW9kaWZ5UmVxdWlyZWQoc2F2ZU9wdGlvbnMpKSB7Ci0JCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlczsKLQkJCQkJaWYobGliUmVzb3VyY2VUb1NhdmUgIT0gbnVsbCkgewotCQkJCQkJcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJCQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJcmVzb3VyY2VzLmFkZChsaWJSZXNvdXJjZVRvU2F2ZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQlSZXNvdXJjZVtdIHJlc291cmNlQXJyYXkgPSBuZXcgUmVzb3VyY2VbcmVzb3VyY2VzLnNpemUoKV07Ci0JCQkJCXJlc291cmNlcy50b0FycmF5KHJlc291cmNlQXJyYXkpOwotCQkJCQlyZXNvdXJjZVNldC5jaGVja01vZGlmeShyZXNvdXJjZUFycmF5LCBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja091dE9mU3luY2gocmVzb3VyY2VzKTsKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuY2hlY2tGaWxlUGF0aExlbmd0aChyZXNvdXJjZXMpOwotCQkJCX0KLQotCQkJCXJlc291cmNlU2V0LnNhdmUocmVzb3VyY2UsIHNhdmVPcHRpb25zKTsKLQkJCQlpZihsaWJSZXNvdXJjZVRvU2F2ZSAhPSBudWxsKSB7Ci0JCQkJCXJlc291cmNlU2V0LnNhdmUobGliUmVzb3VyY2VUb1NhdmUsIHNhdmVPcHRpb25zKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKHJlc291cmNlIGluc3RhbmNlb2YgSUZhaWxTYWZlU2F2YWJsZSkgewotCQkJCUlGYWlsU2FmZVNhdmFibGUgZmFpbFNhZmVTYXZhYmxlID0gKElGYWlsU2FmZVNhdmFibGUpIHJlc291cmNlOwotCQkJCWZhaWxTYWZlU2F2YWJsZS5zZXRUeElEKHR4UmVjb3JkLmdldFR4SUQoKSk7Ci0JCQkJcmVzb3VyY2Uuc2F2ZShzYXZlT3B0aW9ucyk7Ci0JCQkJdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5hZGQocmVzb3VyY2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24oIlJlc291cmNlIG11c3QgaW1wbGVtZW50IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLmludGVybmFsLklGYWlsU2FmZVNhdmFibGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wZXJzaXN0ZW5jZS5NZXRob2RMaWJyYXJ5UGVyc2lzdGVyI2FkanVzdExvY2F0aW9uKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkanVzdExvY2F0aW9uKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQljaGVja01vdmUocmVzb3VyY2UpOwotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5wcmVwYXJlQWRqdXN0TG9jYXRpb24oCi0JCQkJCShNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcykpIHsKLQkJCQl0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmFkZChyZXNvdXJjZSk7Ci0JCQkJCi0JCQkJSGFzaFNldCByZXNvdXJjZXNUb0NoZWNrID0gbmV3IEhhc2hTZXQobW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJCXJlc291cmNlc1RvQ2hlY2suYWRkQWxsKHJlc291cmNlc1RvQ2hlY2spOwotCQkJCU11bHRpRmlsZVNhdmVVdGlsLmNoZWNrTW9kaWZ5KHJlc291cmNlc1RvQ2hlY2spOwotCQkJCQotCQkJCWlmICghbW9kaWZpZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7CQkJCQkKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuY2hlY2tPdXRPZlN5bmNoKG1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQkJCQkvLyBzYXZlIHRoZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXNhdmUoKFJlc291cmNlKSBpdGVyLm5leHQoKSk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljb21taXQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkanVzdExvY2F0aW9uKENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCQlpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWNoZWNrTW92ZSgoUmVzb3VyY2UpIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCUhhc2hTZXQgcmVzb3VyY2VzVG9DaGVjayA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgaXRlcgotCQkJCQkJLm5leHQoKTsKLQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwucHJlcGFyZUFkanVzdExvY2F0aW9uKAotCQkJCQkJKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKSkgewotCQkJCQl0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmFkZChyZXNvdXJjZSk7Ci0JCQkJCXJlc291cmNlc1RvQ2hlY2suYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJlc291cmNlc1RvQ2hlY2suYWRkQWxsKG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCWlmKCFyZXNvdXJjZXNUb0NoZWNrLmlzRW1wdHkoKSkgewotCQkJCU11bHRpRmlsZVNhdmVVdGlsLmNoZWNrTW9kaWZ5KHJlc291cmNlc1RvQ2hlY2spOwotCQkJfQkJCQotCQkJaWYgKCFtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja091dE9mU3luY2gobW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCQkJLy8gc2F2ZSB0aGUgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXNhdmUoKFJlc291cmNlKSBpdGVyLm5leHQoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljb21taXQoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlciNkZWxldGVGaWxlcyhvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmlsZXMoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgcGF0aCwKLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQkJLy8ga2VlcCB0aGUgaW5mbyB0byByZWFsbHkgZGVsZXRlIHRoZSBmaWxlcyBpbiBjb21taXQoKQotCQkJZWxlbWVudFRvSW5mb01hcFRvRGVsZXRlRmlsZXMucHV0KGUsIG5ldyBPYmplY3RbXSB7IHBhdGgsCi0JCQkJCXJlc291cmNlU2V0IH0pOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHN1cGVyRGVsZXRlRmlsZXMoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgcGF0aCwKLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQkJc3VwZXIuZGVsZXRlRmlsZXMoZSwgcGF0aCwgcmVzb3VyY2VTZXQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciNjb21taXQoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgY29tbWl0KCkgewotCQkJLy8gc2F2ZSBpcyBkb25lCi0JCQkvLyBjYWxsIHNhdmVJc0RvbmUoKSBvbiBldmVyeSBzYXZlZCBmaWxlIHRvIHJlbmFtZSBpdCB0byB0aGUgY29ycmVjdAotCQkJLy8gbmFtZQotCQkJaW50IHNpemUgPSB0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJKChJRmFpbFNhZmVTYXZhYmxlKSB0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpCi0JCQkJCQkuZ2V0KGkpKS5jb21taXQoKTsKLQkJCX0KLQotCQkJLy8gbm90aWZ5IGFsbCBjb21taXRlZCByZXNvdXJjZXMgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaXMgZG9uZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkoKElGYWlsU2FmZVNhdmFibGUpIHR4UmVjb3JkLmdldFJlc291cmNlc1RvQ29tbWl0KCkKLQkJCQkJCS5nZXQoaSkpLnR4RmluaXNoZWQodHJ1ZSk7Ci0JCQl9Ci0KLQkJCS8vIGRlbGV0ZSBiYWNrdXAKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJKChJRmFpbFNhZmVTYXZhYmxlKSB0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpCi0JCQkJCQkuZ2V0KGkpKS5kZWxldGVCYWNrdXAoKTsKLQkJCX0KLQotCQkJdHhSZWNvcmQuY2xlYXIoKTsKLQotCQkJLy8gZGVsZXRlIGZpbGVzIG9mIGRlbGV0ZWQgZWxlbWVudHMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50VG9JbmZvTWFwVG9EZWxldGVGaWxlcy5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3RbXSBpbmZvID0gKE9iamVjdFtdKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCVN0cmluZyBwYXRoID0gKFN0cmluZykgaW5mb1swXTsKLQkJCQl0cnkgewotCQkJCQlzdXBlckRlbGV0ZUZpbGVzKChNZXRob2RFbGVtZW50KSBlbnRyeS5nZXRLZXkoKSwgcGF0aCwKLQkJCQkJCQkoUmVzb3VyY2VTZXQpIGluZm9bMV0pOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgV3JhcHBlZEV4Y2VwdGlvbikgewotCQkJCQkJZSA9ICgoV3JhcHBlZEV4Y2VwdGlvbikgZSkuZXhjZXB0aW9uKCk7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG1zZyA9IFBlcnNpc3RlbmNlUmVzb3VyY2VzLkVyck1zZ19Db3VsZE5vdERlbGV0ZTsKLQkJCQkJU3RyaW5nIG90aGVyTXNnID0gbnVsbDsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbikgZSkuZ2V0U3RhdHVzKCk7Ci0JCQkJCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCQkJCQlvdGhlck1zZyA9IFVtYVV0aWwuZ2V0TWVzc2FnZShzdGF0dXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChvdGhlck1zZyA9PSBudWxsKSB7Ci0JCQkJCQlvdGhlck1zZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQobXNnLCBuZXcgT2JqZWN0W10geyBwYXRoLAotCQkJCQkJCW90aGVyTXNnIH0pOwotCQkJCQllID0gbmV3IEV4Y2VwdGlvbihtc2csIGUpOwotCQkJCQlnZXRXYXJuaW5ncygpLmFkZChlKTsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxlbWVudFRvSW5mb01hcFRvRGVsZXRlRmlsZXMuY2xlYXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjcm9sbGJhY2soKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcm9sbGJhY2soKSB7Ci0JCQlpZiAoIXR4UmVjb3JkLmdldFJlc291cmNlc1RvQ29tbWl0KCkuaXNFbXB0eSgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW50IG1heCA9IHR4UmVjb3JkLmdldFJlc291cmNlc1RvQ29tbWl0KCkuc2l6ZSgpIC0gMTsKLQkJCQkJQXJyYXlMaXN0IHJlc3RvcmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nLCByZXN0b3JlIGZyb20gYmFja3VwCi0JCQkJCWZvciAoaW50IGkgPSBtYXg7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJCQlJRmFpbFNhZmVTYXZhYmxlIHJlc291cmNlID0gKElGYWlsU2FmZVNhdmFibGUpIHR4UmVjb3JkCi0JCQkJCQkJCS5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmdldChpKTsKLQkJCQkJCWlmIChyZXNvdXJjZS5yZXN0b3JlKCkpIHsKLQkJCQkJCQlyZXN0b3JlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzdG9yZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlcgotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJcmVzb3VyY2Uuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQkJCX0KLQotCQkJCQkvLyBkZWxldGUgdGVtcCBmaWxlcwotCQkJCQlmb3IgKGludCBpID0gbWF4OyBpID4gLTE7IGktLSkgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHR4UmVjb3JkCi0JCQkJCQkJCS5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmdldChpKTsKLQkJCQkJCWlmICgoKElGYWlsU2FmZVNhdmFibGUpcmVzb3VyY2UpLmhhc1RlbXBVUkkoKSkgewotCQkJCQkJCS8vIHVyaSBrZWVwcyB0aGUgcGF0aCB0byB0ZW1wIGZpbGUKLQkJCQkJCQl0cnkgewotCQkJCQkJCQluZXcgRmlsZShyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkKLQkJCQkJCQkJCQkuZGVsZXRlKCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gbm90aWZ5IGFsbCBjb21taXRlZCByZXNvdXJjZXMgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaXMKLQkJCQkJLy8gZG9uZQotCQkJCQlmb3IgKGludCBpID0gbWF4OyBpID4gLTE7IGktLSkgewotCQkJCQkJKChJRmFpbFNhZmVTYXZhYmxlKSB0eFJlY29yZAotCQkJCQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5nZXQoaSkpCi0JCQkJCQkJCS50eEZpbmlzaGVkKGZhbHNlKTsKLQkJCQkJfQotCi0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0KLQkJCXR4UmVjb3JkLmNsZWFyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKQotCQkgKi8KLQkJcHVibGljIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBnZXRGYWlsU2FmZVBlcnNpc3RlcigpIHsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciNnZXRDdXJyZW50VHhJRCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRUeElEKCkgewotCQkJcmV0dXJuIHR4UmVjb3JkLmdldFR4SUQoKTsKLQkJfQotCi0JfQotCi0JRmFpbFNhZmVQZXJzaXN0ZXIgZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoTWFwIG9wdGlvbnMpIHsKLQkJRmFpbFNhZmVQZXJzaXN0ZXIgcGVyc2lzdGVyID0gbmV3IEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCXBlcnNpc3Rlci5zYXZlT3B0aW9ucy5wdXRBbGwob3B0aW9ucyk7Ci0KLQkJLy8gbWFrZSBzdXJlIHRoYXQgVFhfUkVDT1JEIHN0aWxsIGtlZXBzIHRoZSBjb3JyZWN0IHZhbHVlCi0JCXBlcnNpc3Rlci5zYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuVFhfUkVDT1JELAotCQkJCXBlcnNpc3Rlci50eFJlY29yZCk7Ci0KLQkJcmV0dXJuIHBlcnNpc3RlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNoYXNPd25Gb2xkZXIoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNPd25Gb2xkZXIoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIE11bHRpRmlsZVNhdmVVdGlsLmhhc093bkZvbGRlcihlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNoYXNPd25SZXNvdXJjZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc093blJlc291cmNlKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNdWx0aUZpbGVTYXZlVXRpbC5oYXNPd25SZXNvdXJjZShlLAotCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5ERUZBVUxUX1NBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2dldEZhaWxTYWZlUGVyc2lzdGVyKCkKLQkgKi8KLQlwdWJsaWMgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldEZhaWxTYWZlUGVyc2lzdGVyKCkgewotCQlyZXR1cm4gbmV3IEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBOb25GYWlsU2FmZVBlcnNpc3RlciBleHRlbmRzIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIKLQkJCWltcGxlbWVudHMgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHsKLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI2NvbW1pdCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjb21taXQoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI3JvbGxiYWNrKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJvbGxiYWNrKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciNnZXRDdXJyZW50VHhJRCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRUeElEKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI2FkanVzdExvY2F0aW9uKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRqdXN0TG9jYXRpb24oQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlhZGp1c3RMb2NhdGlvbigoUmVzb3VyY2UpIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIG5vbkZhaWxTYWZlUGVyc2lzdGVyID0gbmV3IE5vbkZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNnZXRGaWxlRXh0ZW5zaW9uKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNzYXZlKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmKCFoYXNPd25SZXNvdXJjZVdpdGhvdXRSZWZlcnJlcihlbGVtZW50KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShlbGVtZW50KS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlNYXAgb3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOyAKLQkJUmVzb3VyY2UgcmVzID0gKChJbnRlcm5hbEVPYmplY3QpZWxlbWVudCkuZURpcmVjdFJlc291cmNlKCk7Ci0JCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZTsKLQkJaWYocmVzIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQlyZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlczsKLQkJCXJlc291cmNlU2V0LnNhdmUocmVzb3VyY2UsIG9wdGlvbnMpOwotCQl9Ci0JCWVsc2UgewotCQkJVVJJIHVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLmNyZWF0ZUZpbGVVUkkoZWxlbWVudCk7Ci0JCQlyZXNvdXJjZSA9IE11bHRpRmlsZVNhdmVVdGlsLnNhdmUocmVzb3VyY2VTZXQsIGVsZW1lbnQsIHVyaSwgb3B0aW9ucywgZmFsc2UpOwotCQl9Ci0JCXJlc291cmNlLnVwZGF0ZVRpbWVTdGFtcHMoKTsKLQkJCi0JCVN0cmluZyBzdHIgPSAoU3RyaW5nKSBvcHRpb25zLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5SRUZSRVNIX05FV19SRVNPVVJDRSk7Ci0JCWlmIChzdHIgIT0gbnVsbCAmJiBCb29sZWFuLnZhbHVlT2Yoc3RyKS5ib29sZWFuVmFsdWUoKSkgewotCQkJLy8gbm90aWZ5IFJlZnJlc2hKb2IgdGhlIHRoaXMgcmVzb3VyY2UgaXMgc2F2ZWQgc28gaXQgd2lsbCBub3QgYmUKLQkJCS8vIHJlbG9hZGVkIGFmdGVyIHJlZnJlc2hpbmcgaXQKLQkJCS8vCi0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb3VyY2VTYXZlZChyZXNvdXJjZSk7Ci0KLQkJCS8vIHJlZnJlc2ggdGhlIG5ld2x5IGNyZWF0ZWQgcmVzb3VyY2Ugc28gaXQgaXMgaW4gc3luY2ggd2l0aCB0aGUKLQkJCS8vIHdvcmtzcGFjZQotCQkJLy8KLQkJCUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaChyZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNPd25SZXNvdXJjZVdpdGhvdXRSZWZlcnJlcihPYmplY3QgZSkgewotCQlyZXR1cm4gZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb247Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZUlPRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlSU9FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTNjMjc5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlSU9FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiBCYXNlIGV4Y2VwdGlvbiBmb3IgZmlsZS1iYXNlZCBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxlSU9FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTc4NTMxOTg3MjIzNDczMjFMOwotCi0JcHJpdmF0ZSBPYmplY3QgdHJvdWJsZU9iamVjdDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE11bHRpRmlsZUlPRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE11bHRpRmlsZUlPRXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihTdHJpbmcgbXNnLCBPYmplY3QgdHJvdWJsZU9iaikgewotCQlzdXBlcihtc2cpOwotCQl0cm91YmxlT2JqZWN0ID0gdHJvdWJsZU9iajsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRyb3VibGVPYmplY3QuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRUcm91YmxlT2JqZWN0KCkgewotCQlyZXR1cm4gdHJvdWJsZU9iamVjdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNlODJhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxJbmZvSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuTGlicmFyeVJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLmludGVybmFsLlJlZnJlc2hFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklQcm94eVJlc29sdXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklVbWFSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLlJlc29sdmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLkV2ZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5DYWxlbmRhcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIGV4dGVuZHMgUmVzb3VyY2VTZXRJbXBsIGltcGxlbWVudHMKLQkJSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyLCBJVW1hUmVzb3VyY2VTZXQsIElMaWJyYXJ5UmVzb3VyY2VTZXQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9ERUxJVkVSWV9QUk9DRVNTX1BBVEggPSB7ICJEZWxpdmVyeVByb2Nlc3NlcyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9DQVBBQklMSVRZX1BBVFRFUk5fUEFUSCA9IHsKLQkJCSJDb250ZW50IiwgIkNhcGFiaWxpdHlQYXR0ZXJucyIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1BST0NFU1NfQ09OVFJJQlVUSU9OX1BBVEggPSB7ICJQcm9jZXNzQ29udHJpYnV0aW9ucyIgfTsgLy8kTk9OLU5MUy0xJAkJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdW10gUFJPQ0VTU19QQUNLQUdFX1BBVEhTID0gewotCQkJREVGQVVMVF9ERUxJVkVSWV9QUk9DRVNTX1BBVEgsIERFRkFVTFRfQ0FQQUJJTElUWV9QQVRURVJOX1BBVEgsCi0JCQlERUZBVUxUX1BST0NFU1NfQ09OVFJJQlVUSU9OX1BBVEggfTsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBSRVBPUlRfRVJST1IgPSB0cnVlOwotCi0Jc3RhdGljIGZpbmFsIE1hcCBERUZBVUxUX1NBVkVfT1BUSU9OUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlzdGF0aWMgZmluYWwgU2V0IERFRkFVTFRfU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVCA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlzdGF0aWMgewotCQlERUZBVUxUX1NBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBsdWdpbigpKTsKLQkJREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VULmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50KCkpOwotCQlERUZBVUxUX1NBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJLy8gZUNsYXNzZXMuYWRkKFJlc291cmNlbWFuYWdlclBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlTWFuYWdlcigpKTsKLQkJREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VULmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCi0JCVhNTFJlc291cmNlLlhNTE1hcCB4bWxNYXAgPSBjcmVhdGVTYXZlWE1MTWFwKCk7Ci0KLQkJSGFzaFNldCBzYXZlVG9nZXRoZXIgPSBuZXcgSGFzaFNldCgpOwotCQlzYXZlVG9nZXRoZXIuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoCi0JCQkJTXVsdGlGaWxlWE1JU2F2ZUltcGwuU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVCwKLQkJCQlERUZBVUxUX1NBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQpOwotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuU0FWRV9BTEwsICJmYWxzZSIpOyAvLyROT04tTkxTLTEkCi0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5TQVZFX1RPR0VUSEVSX0NMQVNTX1NFVCwKLQkJCQlzYXZlVG9nZXRoZXIpOwotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuUkVGUkVTSF9ORVdfUkVTT1VSQ0UsCi0JCQkJInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuQ0hFQ0tfTU9ESUZZLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fUFJPQ0VTU19EQU5HTElOR19IUkVGLAotCQkJCVhNTFJlc291cmNlLk9QVElPTl9QUk9DRVNTX0RBTkdMSU5HX0hSRUZfRElTQ0FSRCk7Ci0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fWE1MX01BUCwgeG1sTWFwKTsKLQotCQlBc3NvY2lhdGlvbkhlbHBlci5pbml0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTTUdSX1hNSSA9ICJyZXNtZ3IueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBIYXNoTWFwIGRlZmF1bHRTYXZlT3B0aW9uczsKLQotCXByaXZhdGUgSGFzaE1hcCBndWlkVG9NZXRob2RFbGVtZW50TWFwOwotCi0JcHJpdmF0ZSBib29sZWFuIGxvYWRpbmc7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbG9hZGluZ1Jlc291cmNlTWFuYWdlclRyZWU7Ci0KLQlwcml2YXRlIE1hcCBVUklUb1RlbXBVUklNYXA7Ci0KLQlwcml2YXRlIFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIgbWFya2VyTWFuYW5nZXI7Ci0KLQlwcml2YXRlIFVuaXF1ZUVMaXN0IHJlZnJlc2hMaXN0ZW5lcnM7Ci0KLQlwcml2YXRlIElVUklQcm92aWRlciB1cmlQcm92aWRlcjsKLQotCXByaXZhdGUgUGF0aCBjb25maWdGb2xkZXJQYXRoOwotCi0JcHJpdmF0ZSBQYXRoIGxpYkZvbGRlclBhdGg7Ci0KLQlwcml2YXRlIHN0YXRpYyBYTUxSZXNvdXJjZS5YTUxNYXAgY3JlYXRlTG9hZFhNTE1hcCgpIHsKLQkJWE1MUmVzb3VyY2UuWE1MTWFwIHhtbE1hcCA9IG5ldyBYTUxNYXBJbXBsKCk7Ci0JCVNldCBleGNsdWRlZEF0dHJpYnV0ZXMgPSBuZXcgSGFzaFNldCgpOwotCQlleGNsdWRlZEF0dHJpYnV0ZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfR3VpZCgpKTsKLQkJZXhjbHVkZWRBdHRyaWJ1dGVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQ2xhc3NpZmllcnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyID0gKEVDbGFzc2lmaWVyKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlQ2xhc3NpZmllciBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBlQ2xhc3NpZmllcjsKLQotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoIWV4Y2x1ZGVkQXR0cmlidXRlcy5jb250YWlucyhhdHRyaWIpKSB7Ci0JCQkJCQlYTUxSZXNvdXJjZS5YTUxJbmZvIHhtbEluZm8gPSBuZXcgWE1MSW5mb0ltcGwoKTsKLQkJCQkJCXhtbEluZm8uc2V0TmFtZShhdHRyaWIuZ2V0TmFtZSgpKTsKLQkJCQkJCXhtbEluZm8KLQkJCQkJCQkJLnNldFhNTFJlcHJlc2VudGF0aW9uKFhNTFJlc291cmNlLlhNTEluZm8uRUxFTUVOVCk7Ci0JCQkJCQl4bWxNYXAuYWRkKGF0dHJpYiwgeG1sSW5mbyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4geG1sTWFwOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2F2ZUF0dHJpYnV0ZUFzRWxlbWVudChFQ2xhc3MgZUNsYXNzLAotCQkJQ29sbGVjdGlvbiBzZWxlY3RlZEVDbGFzc2VzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGVkRUNsYXNzZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFQ2xhc3MgYmFzZSA9IChFQ2xhc3MpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGJhc2UuaXNTdXBlclR5cGVPZihlQ2xhc3MpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFhNTFJlc291cmNlLlhNTE1hcCBjcmVhdGVTYXZlWE1MTWFwKCkgewotCQlYTUxSZXNvdXJjZS5YTUxNYXAgeG1sTWFwID0gbmV3IFhNTE1hcEltcGwoKTsKLQkJU2V0IGV4Y2x1ZGVkQXR0cmlidXRlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWV4Y2x1ZGVkQXR0cmlidXRlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkpOwotCQlleGNsdWRlZEF0dHJpYnV0ZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCi0JCS8vIHNlbGVjdCBvbmx5IENvbnRlbnREZXNjcmlwdGlvbiBhbmQgU2VjdGlvbgotCQlTZXQgc2VsZWN0ZWRFQ2xhc3NlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNlbGVjdGVkRUNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJc2VsZWN0ZWRFQ2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdGlvbigpKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQ2xhc3NpZmllcnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyID0gKEVDbGFzc2lmaWVyKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlQ2xhc3NpZmllciBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBlQ2xhc3NpZmllcjsKLQotCQkJCWlmIChzYXZlQXR0cmlidXRlQXNFbGVtZW50KGVDbGFzcywgc2VsZWN0ZWRFQ2xhc3NlcykpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVDbGFzcy5nZXRFQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCUVBdHRyaWJ1dGUgYXR0cmliID0gKEVBdHRyaWJ1dGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmICghZXhjbHVkZWRBdHRyaWJ1dGVzLmNvbnRhaW5zKGF0dHJpYikpIHsKLQkJCQkJCQlYTUxSZXNvdXJjZS5YTUxJbmZvIHhtbEluZm8gPSBuZXcgWE1MSW5mb0ltcGwoKTsKLQkJCQkJCQl4bWxJbmZvLnNldE5hbWUoYXR0cmliLmdldE5hbWUoKSk7Ci0JCQkJCQkJeG1sSW5mbwotCQkJCQkJCQkJLnNldFhNTFJlcHJlc2VudGF0aW9uKFhNTFJlc291cmNlLlhNTEluZm8uRUxFTUVOVCk7Ci0JCQkJCQkJeG1sTWFwLmFkZChhdHRyaWIsIHhtbEluZm8pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHhtbE1hcDsKLQl9Ci0KLQlwdWJsaWMgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKCkgewotCQlzdXBlcigpOwotCQltYXJrZXJNYW5hbmdlciA9IG5ldyBVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoYm9vbGVhbiByZXBvcnRFcnJvcikgewotCQl0aGlzKCk7Ci0JCW1hcmtlck1hbmFuZ2VyLnNldEVuYWJsZWQocmVwb3J0RXJyb3IpOwotCX0KLQotCXB1YmxpYyBVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyIGdldFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIoKSB7Ci0JCXJldHVybiBtYXJrZXJNYW5hbmdlcjsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgSVVSSVByb3ZpZGVyIGdldFVSSVByb3ZpZGVyKCkgewotCQlpZih1cmlQcm92aWRlciA9PSBudWxsKSB7Ci0JCQl1cmlQcm92aWRlciA9IG5ldyBGaWxlUGF0aFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHVyaVByb3ZpZGVyOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVzb3VyY2VDaGFuZ2UoSVJlc291cmNlIHdzUmVzKSB7Ci0JCVN5c3RlbS5vdXQKLQkJCQkucHJpbnRsbigiTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmhhbmRsZVJlc291cmNlQ2hhbmdlKCk6ICIgKyB3c1Jlcy50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCi0JCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGdldFJlc291cmNlKAotCQkJCVVSSS5jcmVhdGVGaWxlVVJJKHdzUmVzLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSksIGZhbHNlKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJQXJyYXlMaXN0IHByb3hpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcmVzb3VyY2UucmVsb2FkKHByb3hpZXMpOwotCi0JCQkJLy8gbm90aWZ5IE1BS0VfUFJPWFkgZXZlbnQgZm9yIGFsbCBwcm94aWVzCi0JCQkJLy8KLQkJCQlOb3RpZmljYXRpb24gbXNnID0gbmV3IE5vdGlmaWNhdGlvbkltcGwoRXZlbnRUeXBlcy5NQUtFX1BST1hZLAotCQkJCQkJZmFsc2UsIHRydWUpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb3hpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJby5lTm90aWZ5KG1zZyk7Ci0JCQkJfQotCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIE1hcCBnZXRMb2FkT3B0aW9ucygpIHsKLQkJTWFwIG9wdGlvbnMgPSBzdXBlci5nZXRMb2FkT3B0aW9ucygpOwotCQlvcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9YTUxfTUFQLCBjcmVhdGVMb2FkWE1MTWFwKCkpOwotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldERlZmF1bHRTYXZlT3B0aW9ucygpIHsKLQkJaWYgKGRlZmF1bHRTYXZlT3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0U2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJZGVmYXVsdFNhdmVPcHRpb25zLnB1dEFsbChERUZBVUxUX1NBVkVfT1BUSU9OUyk7Ci0JCX0KLQotCQlyZXR1cm4gZGVmYXVsdFNhdmVPcHRpb25zOwotCX0KLQotCXByaXZhdGUgUmVzb3VyY2UgZ2V0TWV0aG9kTGlicmFyeVJlc291cmNlKCkgewotCQlpZiAoZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoUmVzb3VyY2UpIGdldFJlc291cmNlcygpLmdldCgwKTsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpOwotCQlyZXR1cm4gcmVzb3VyY2UgPT0gbnVsbCA/IG51bGwgOiAoTWV0aG9kTGlicmFyeSkgUGVyc2lzdGVuY2VVdGlsCi0JCQkJLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZU1hbmFnZXIgZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRNZXRob2RMaWJyYXJ5UmVzb3VyY2UoKTsKLQkJcmV0dXJuIHJlc291cmNlID09IG51bGwgPyBudWxsIDogTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbCNnZXRVUklDb252ZXJ0ZXIoKQotCSAqLwotCXB1YmxpYyBVUklDb252ZXJ0ZXIgZ2V0VVJJQ29udmVydGVyKCkgewotCQlpZiAodXJpQ29udmVydGVyID09IG51bGwpIHsKLQkJCXVyaUNvbnZlcnRlciA9IG5ldyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHVyaUNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBudWxsIGlmIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBnaXZlbiBVUkkgY291bGQgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmkpIHsKLQkJaWYgKGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlcyA9IHN1cGVyLmdldFJlc291cmNlKHVyaSwgZmFsc2UpOwotCQkJaWYgKHJlcyA9PSBudWxsKSB7Ci0JCQkJTWFwIG1hcCA9IGdldFVSSVJlc291cmNlTWFwKCk7Ci0JCQkJcmVzID0gY3JlYXRlUmVzb3VyY2UodXJpKTsKLQotCQkJCXRyeSB7Ci0JCQkJCWRlbWFuZExvYWRIZWxwZXIocmVzKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gcmVtb3ZlIHRoZSByZXNvdXJjZSBmcm9tIHJlc291cmNlIHNldCBpZiBpdCBjb3VsZCBub3QgYmUKLQkJCQkJLy8gbG9hZGVkCi0JCQkJCS8vCi0JCQkJCWdldFJlc291cmNlcygpLnJlbW92ZShyZXMpOwotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQotCQkJCWlmIChtYXAgIT0gbnVsbCkgewotCQkJCQltYXAucHV0KHVyaSwgcmVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb24pIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXRocm93IGU7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2RlbWFuZExvYWQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlbWFuZExvYWQoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRlbWFuZExvYWQocmVzb3VyY2UpOwotCQkKLQkJLy8gcmVmcmVzaCB3b3Jrc3BhY2UgcmVzb3VyY2Ugb2YgdGhpcyByZXNvdXJjZSB0byBtYWtlIHRoZW0gc3luY2hyb25pemVkCi0JCS8vCi0JCWJvb2xlYW4gcmV0ID0gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWZyZXNoKHJlc291cmNlKTsKLQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCWlmKCFyZXQpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5kZW1hbmRMb2FkKCk6IGNvdWxkIG5vdCByZWZyZXNoIHJlc291cmNlICIgKyByZXNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2dldFJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlpZiAoZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQl0cnkgewotCQkJcmVzID0gc3VwZXIuZ2V0UmVzb3VyY2UodXJpLCBsb2FkT25EZW1hbmQpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBudWxsOwotCQkJaWYgKGUuZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0JCQkJbXNnID0gTkxTLmJpbmQoCi0JCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkUmVzb3VyY2VFcnJvcldpdGhSZWFzb25fbXNnLAotCQkJCQkJKG5ldyBPYmplY3RbXSB7IHVyaSwgZS5nZXRNZXNzYWdlKCkgfSkpOwotCQkJZWxzZQotCQkJCW1zZyA9IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRSZXNvdXJjZUVycm9yX21zZywgdXJpKTsKLQkJCWhhbmRsZUV4Y2VwdGlvbihtc2cpOwotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCXRocm93IGU7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWZyZXNoTGlzdGVuZXIoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmVmcmVzaExpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlyZWZyZXNoTGlzdGVuZXJzID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0JCX0KLQkJcmVmcmVzaExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZnJlc2hMaXN0ZW50ZXIoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmVmcmVzaExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlyZWZyZXNoTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWxvYWRzIHRoZSBnaXZlbiByZXNvdXJjZXMKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICogQHJldHVybiByZXNvdXJjZXMgdGhhdCBoYWQgYmVlbiByZWxvYWRlZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgQ29sbGVjdGlvbiByZWxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsJCQotCQkvLyBzYXZlIHRoZSBSZXNvdXJjZURlc2NyaXB0b3IgZm9yIHRoZSByZXNvdXJjZXMgdG8gY3JlYXRlIFVSSSBmb3IgdGhlaXIKLQkJLy8gcHJveGllcyBhZnRlciB1bmxvYWQKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgaXRlcgotCQkJCQkubmV4dCgpOwotCQkJCi0JCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwucmVsb2FkUmVzb3VyY2VzKCk6IHJlc291cmNlPSIgKyByZXNvdXJjZSArICIsIGVsZW1lbnQ9IiArIFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJCi0JCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCS5nZXRSZXNvdXJjZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJCXJlc291cmNlLnNldFJlc291cmNlRGVzY3JpcHRvcihyZXNEZXNjKTsKLQkJCX0KLQkJfQotCi0JCUFycmF5TGlzdCByZWxvYWRlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSGFzaFNldCBwcm94aWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJQXJyYXlMaXN0IHJlc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3QocmVzb3VyY2VzKTsKLQotCQlSZXNvdXJjZSBsaWJSZXNvdXJjZSA9IGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpOwotCQlib29sZWFuIHJlbG9hZEFsbENvbmZpZ3MgPSBmYWxzZTsKLQkJaWYgKHJlc291cmNlTGlzdC5yZW1vdmUobGliUmVzb3VyY2UpKSB7Ci0JCQkvLyBNZXRob2RMaWJyYXJ5IHJlc291cmNlIGlzIHRvIHJlbG9hZCwgaXQgbXVzdCBiZSByZWxvYWRlZCBmaXJzdAotCQkJLy8JCQkKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGxpYlJlc291cmNlOwotCi0JCQkvLyBjbGVhciBtYXJrZXJzIGZvciB0aGlzIHJlc291cmNlCi0JCQkvLwotCQkJbWFya2VyTWFuYW5nZXIuY2xlYXJNYXJrZXJzKHJlc291cmNlKTsKLQotCQkJdHJ5IHsKLQkJCQlpZiAocmVzb3VyY2UucmVsb2FkKHByb3hpZXMpKSB7Ci0JCQkJCXJlbG9hZGVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0KLQkJCQkJLy8gcmVzZXQgdGhlIHJlc291cmNlIG1hbmFnZXIgcmVmZXJlbmNlIGluIFVSSUNvbnZlcnRlciBvZgotCQkJCQkvLyB0aGlzIHJlc291cmNlIHNldAotCQkJCQkvLyBzaW5jZSB0aGUgcmVzb3VyY2UgbWFuYWdlciBpcyByZWxvYWRlZAotCQkJCQkvLwotCQkJCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQkJCXVyaUNvbnZlcnRlci5yZXNNZ3IgPSBudWxsOwotCQkJCQkKLQkJCQkJcmVsb2FkQWxsQ29uZmlncyA9IHRydWU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQl9Ci0KLQkJfQotCQkvLyByZWxvYWQgdGhlIHJlc291cmNlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZUxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBpdGVyCi0JCQkJCS5uZXh0KCk7Ci0KLQkJCS8vIGNsZWFyIG1hcmtlcnMgZm9yIHRoaXMgcmVzb3VyY2UKLQkJCS8vCi0JCQltYXJrZXJNYW5hbmdlci5jbGVhck1hcmtlcnMocmVzb3VyY2UpOwotCi0JCQl0cnkgewotCQkJCWlmIChyZXNvdXJjZS5yZWxvYWQocHJveGllcykpIHsKLQkJCQkJcmVsb2FkZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JCWlmICghcmVsb2FkZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyByZWluaXRpYWxpemUgdGhlIHJlc291cmNlIHNldAotCQkJLy8KLQkJCWluaXRpYWxpemUocmVsb2FkQWxsQ29uZmlncyk7Ci0KLQkJCS8vIG5vdGlmeSB0aGUgbGlzdGVuZXJzCi0JCQkvLwotCQkJaWYgKHJlZnJlc2hMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCUlSZWZyZXNoRXZlbnQgZXZlbnQgPSBuZXcgUmVmcmVzaEV2ZW50KHJlbG9hZGVkUmVzb3VyY2VzLAotCQkJCQkJcHJveGllcyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChyZWZyZXNoTGlzdGVuZXJzKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlJUmVmcmVzaExpc3RlbmVyIGxpc3RlbmVyID0gKElSZWZyZXNoTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlsaXN0ZW5lci5ub3RpZnlSZWZyZXNoZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZWxvYWRlZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKGJvb2xlYW4gbG9hZENvbmZpZ3VyYXRpb25zKSB7Ci0JCS8vIGxvYWQgdGhlIFJlc291cmNlTWFuYWdlciB0cmVlIGFuZCBvcHBvc2l0ZSBmZWF0dXJlcwotCQkvLwotCQlsb2FkUmVzb3VyY2VNYW5hZ2VyVHJlZSgpOwotCi0JCXNldENvbnRhaW5lcnNPZkxvYWRlZEVsZW1lbnRzKCk7Ci0JCQotCQlpZihsb2FkQ29uZmlndXJhdGlvbnMpIHsKLQkJCWxvYWRDb25maWd1cmF0aW9ucygpOwotCQl9Ci0KLQkJbG9hZE9wcG9zaXRlRmVhdHVyZXMoKTsKLQotCQkvLyByZXNldCB0aGUgcmVzb3VyY2UgbWFuYWdlciByZWZlcmVuY2UgaW4gVVJJQ29udmVydGVyIG9mIHRoaXMgcmVzb3VyY2UKLQkJLy8gc2V0Ci0JCS8vCi0JCU11bHRpRmlsZVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIgPSAoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkJdXJpQ29udmVydGVyLnJlc01nciA9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRDb250YWluZXJzT2ZMb2FkZWRFbGVtZW50cygpIHsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IocmVzTWdyLCBmYWxzZSkgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIxNzI2OTEwMTc5ODc3MDI1MDZMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSBvYmplY3Q7Ci0JCQkJQ29sbGVjdGlvbiBHVUlEcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJTGlzdCBzdWJNZ3JzID0gbmV3IEFycmF5TGlzdChyZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3ViTWdycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUludGVybmFsRU9iamVjdCBzdWJNZ3IgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlpZiAoc3ViTWdyICE9IG51bGwgJiYgIXN1Yk1nci5lSXNQcm94eSgpKSB7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChzdWJNZ3IuZVJlc291cmNlKCkpOwotCQkJCQkJCUdVSURzLmFkZChlLmdldEd1aWQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc01nci5lUmVzb3VyY2UoKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgcGFyZW50ID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCi0JCQkJCS8vIHJlc29sdmUgdGhlIHByb3h5IG9mIHRoaXMgZWxlbWVudCBpbiB0aGUgcGFyZW50Ci0JCQkJCS8vCi0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLnJlc29sdmVQcm94aWVzKEdVSURzLCBwYXJlbnQpOwotCQkJCX0KLQotCQkJCXJldHVybiByZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0JCWZvciAoOyBpdGVyYXRvci5oYXNOZXh0KCk7IGl0ZXJhdG9yLm5leHQoKSkKLQkJCTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHdvcmtzcGFjZSByZXNvdXJjZSByZXByZXNlbnRzIGEgbGlicmFyeSByZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSB3c1Jlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGlicmFyeVJlc291cmNlKElSZXNvdXJjZSB3c1Jlc291cmNlKSB7Ci0JCXJldHVybiBsaWJGb2xkZXJQYXRoICE9IG51bGwgJiYgbGliRm9sZGVyUGF0aC5pc1ByZWZpeE9mKHdzUmVzb3VyY2UuZ2V0TG9jYXRpb24oKSk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gd29ya3NwYWNlIHJlc291cmNlIGlzIGEgbmV3IHJlc291cmNlIHRoYXQgY2FuIGJlIGxvYWRlZCAKLQkgKiB1c2luZyB7QGxpbmsgI2xvYWROZXdSZXNvdXJjZXMoQ29sbGVjdGlvbil9Ci0JICogIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ld1Jlc291cmNlVG9Mb2FkKElSZXNvdXJjZSB3c1Jlc291cmNlKSB7Ci0JCUlQYXRoIGxvYyA9IHdzUmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJcmV0dXJuIChsb2MgIT0gbnVsbCAmJiBjb25maWdGb2xkZXJQYXRoICE9IG51bGwgCi0JCQkJJiYgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKCIuIiArIGxvYy5nZXRGaWxlRXh0ZW5zaW9uKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkmJiBjb25maWdGb2xkZXJQYXRoLmlzUHJlZml4T2YobG9jKQotCQkJCSYmICFGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmlzVGVhbVByaXZhdGUobG9jLnRvU3RyaW5nKCkpKTsKLQotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyBuZXcgcmVzb3VyY2VzIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBvZiB7QGxpbmsgSVJlc291cmNlIHdvcmsgc3BhY2UgcmVzb3VyY2VzfQotCSAqIGludG8gdGhpcyByZXNvdXJjZSBzZXQKLQkgKiBUT0RPOiBtZXJnZSB0aGlzIGNvZGUgdG8ge0BsaW5rICNnZXRSZXNvdXJjZShVUkksIGJvb2xlYW4pfQotCSAqIEBwYXJhbSB3c1Jlc291cmNlcyBjb2xsZWN0aW9uIG9mIHtAbGluayBJUmVzb3VyY2V9IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkTmV3UmVzb3VyY2VzKENvbGxlY3Rpb24gd3NSZXNvdXJjZXMpIHsKLQkJQXJyYXlMaXN0IG5ld0NvbmZpZ0ZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3c1Jlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCB3c1Jlc291cmNlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZih3c1Jlc291cmNlIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJSVJlc291cmNlIHdzUmVzID0gKElSZXNvdXJjZSkgd3NSZXNvdXJjZTsKLQkJCQlJUGF0aCBsb2MgPSB3c1Jlcy5nZXRMb2NhdGlvbigpOwotCQkJCVN0cmluZyBjb25maWdGaWxlOwotCQkJCWlmKGxvYyAhPSBudWxsICYmIGNvbmZpZ0ZvbGRlclBhdGggIT0gbnVsbCAKLQkJCQkJCSYmIE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfRklMRV9FWFRFTlNJT04uZXF1YWxzSWdub3JlQ2FzZSgiLiIgKyBsb2MuZ2V0RmlsZUV4dGVuc2lvbigpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkmJiBjb25maWdGb2xkZXJQYXRoLmlzUHJlZml4T2YobG9jKQotCQkJCQkJJiYgIUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNUZWFtUHJpdmF0ZShjb25maWdGaWxlID0gbG9jLnRvU3RyaW5nKCkpKSB7Ci0JCQkJCW5ld0NvbmZpZ0ZpbGVzLmFkZChjb25maWdGaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGxvYWQgbmV3IGNvbmZpZ3VyYXRpb25zCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0NvbmZpZ0ZpbGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGNvbmZpZ0ZpbGUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCWxvYWRDb25maWd1cmF0aW9uKG5ldyBGaWxlKGNvbmZpZ0ZpbGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNwZWNpYWwgaGFuZGxpbmcgZm9yIE1ldGhvZENvbmZpZ3VyYXRpb24gc2luY2UgTWV0aG9kTGlicmFyeSB3aWxsIG5vCi0JICogbG9uZ2VyIGtlZXBzIHRoZSByZWZlcmVuY2VzIHRvIE1ldGhvZENvbmZpZ3VyYXRpb25zIGFuZCB0aGVpciBmaWxlcy4gQW55Ci0JICogWE1JIGZpbGUgdW5kZXIgZm9sZGVyIC4vY29uZmlndXJhdGlvbnMgYW5kIGl0cyBzdWJmb2xkZXJzIHdpbGwgYmUgdHJlYXRlZAotCSAqIGFzIGEgY29uZmlndXJhdGlvbiBmaWxlLiBUaGV5IHdpbGwgYmUgbG9hZGVkIGFuZCBhZGRlZCB0byBNZXRob2RMaWJyYXJ5Ci0JICogYXMgaXRzIGNvbmZpZ3VyYXRpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWRDb25maWd1cmF0aW9ucygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCUZpbGUgY29uZmlnRGlyID0gbmV3IEZpbGUobmV3IEZpbGUobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpCi0JCQkJLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKSwKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSk7Ci0JCWxvYWRDb25maWd1cmF0aW9ucyhjb25maWdEaXIpOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyBtZXRob2QgY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnRGlyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENvbmZpZ3VyYXRpb25zKEZpbGUgY29uZmlnRGlyKSB7Ci0JCUl0ZXJhdG9yIGRpckl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoY29uZmlnRGlyLCBmYWxzZSkgewotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNzU4NDM2MTkzMDAwNjQwOTA3TDsKLQotCQkJRmlsZUZpbHRlciBmaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcigpIHsKLQotCQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhdGhuYW1lKSB7Ci0JCQkJCXJldHVybiAhRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc1RlYW1Qcml2YXRlKHBhdGhuYW1lLmdldEFic29sdXRlUGF0aCgpKSAmJgotCQkJCQkJCShwYXRobmFtZS5pc0RpcmVjdG9yeSgpCi0JCQkJCQkJfHwgcGF0aG5hbWUuZ2V0TmFtZSgpLmVuZHNXaXRoKAotCQkJCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTikpOwotCQkJCX0KLQotCQkJfTsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlGaWxlW10gZmlsZXMgPSAoKEZpbGUpIG9iamVjdCkubGlzdEZpbGVzKGZpbHRlcik7Ci0JCQkJaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChmaWxlcykuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCX0KLQotCQl9OwotCQlIYXNoU2V0PEZpbGU+IGNvbmZpZ0ZpbGVzID0gbmV3IEhhc2hTZXQ8RmlsZT4oKTsKLQkJd2hpbGUgKGRpckl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlGaWxlIGNvbmZpZ0ZpbGUgPSAoRmlsZSkgZGlySXRlci5uZXh0KCk7Ci0JCQlpZihjb25maWdGaWxlLmlzRmlsZSgpKSB7Ci0JCQkJY29uZmlnRmlsZXMuYWRkKGNvbmZpZ0ZpbGUpOwotCQkJfQotCQl9Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gZ2V0TWV0aG9kTGlicmFyeSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdGVyLm5leHQoKTsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGNvbmZpZy5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlpZiAoY29uZmlnRmlsZXMuY29udGFpbnMoZmlsZSkpIHsKLQkJCQljb25maWdGaWxlcy5yZW1vdmUoZmlsZSk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb25maWdGaWxlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZpbGUgZmlsZSA9IChGaWxlKSBpdGVyLm5leHQoKTsKLQkJCWxvYWRDb25maWd1cmF0aW9uKGZpbGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENvbmZpZ3VyYXRpb24oRmlsZSBjb25maWdGaWxlKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShjb25maWdGaWxlLmdldENhbm9uaWNhbFBhdGgoKSk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IHN1cGVyLmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbAotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQlsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuYWRkKGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFRPRE86IG11c3QgbG9nIGVycm9yIGludG8gcHJvYmxlbSB2aWV3Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETzogbXVzdCBsb2cgZXJyb3IgaW50byBwcm9ibGVtIHZpZXcKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKE9iamVjdCBlcnIpIHsKLQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlcnIpOwotCQlpZiAoZXJyIGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7Ci0JCQkoKEV4Y2VwdGlvbikgZXJyKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlcnIudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJaWYgKHVyaUNvbnZlcnRlciBpbnN0YW5jZW9mIE11bHRpRmlsZVVSSUNvbnZlcnRlcikgewotCQkJKChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIHVyaUNvbnZlcnRlcikuZGlzcG9zZSgpOwotCQl9Ci0JCXVyaUNvbnZlcnRlciA9IG51bGw7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gZURlbGl2ZXIoKTsKLQkJYm9vbGVhbiByZXBvcnRFcnJvciA9IFJFUE9SVF9FUlJPUjsKLQkJYm9vbGVhbiByZWZyZXNoID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmlzRW5hYmxlZCgpOwotCQl0cnkgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJUkVQT1JUX0VSUk9SID0gZmFsc2U7Ci0JCQltYXJrZXJNYW5hbmdlci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCW1hcmtlck1hbmFuZ2VyLmNsZWFyQWxsKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QoZ2V0UmVzb3VyY2VzKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciB1bmxvYWRpbmcgcmVzb3VyY2U6ICIgKwotCQkJCQkvLyByZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQljbGVhckVycm9ycygpOwotCQl9IGZpbmFsbHkgewotCQkJZVNldERlbGl2ZXIobm90aWZ5KTsKLQkJCVJFUE9SVF9FUlJPUiA9IHJlcG9ydEVycm9yOwotCQkJbWFya2VyTWFuYW5nZXIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKHJlZnJlc2gpOwotCQl9Ci0KLQkJaWYgKGd1aWRUb01ldGhvZEVsZW1lbnRNYXAgIT0gbnVsbCkgewotCQkJZ3VpZFRvTWV0aG9kRWxlbWVudE1hcC5jbGVhcigpOwotCQl9Ci0KLQkJZ2V0UmVzb3VyY2VzKCkuY2xlYXIoKTsKLQotCQlpZiAoVVJJVG9UZW1wVVJJTWFwICE9IG51bGwpIHsKLQkJCVVSSVRvVGVtcFVSSU1hcC5jbGVhcigpOwotCQl9Ci0KLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLmNsZWFyRGV0YWNoZWRFT2JqZWN0VG9JRE1hcCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckVycm9ycygpIHsKLQkJLy8gY2xlYXIgYWxsIG1hcmtlcnMKLQkJbWFya2VyTWFuYW5nZXIuY2xlYXJBbGwoKTsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBsb2FkTGlicmFyeShTdHJpbmcgcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxvbmcgYmVnaW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlyZXNldCgpOwotCi0JCWxvbmcgYWZ0ZXJSZXNldCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkKLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc2V0IHRpbWU6ICIgKyAoYWZ0ZXJSZXNldCAtIGJlZ2luKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCU1ldGhvZExpYnJhcnkgbGliID0gbG9hZExpYnJhcnlXaXRob3V0UmVzZXQocGF0aCk7Ci0KLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJMb2FkIHRpbWU6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWdpbikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCS8vIGNoZWNrIGlmIGFueSByZXNvdXJjZSBpcyBtYXJrZWQgYXMgbW9kaWZpZWQgYWZ0ZXIgbG9hZGluZwotCQkJLy8KLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTW9kaWZpZWQgcmVzb3VyY2VzIGFmdGVyIGxvYWRpbmc6Iik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHJlc291cmNlLmlzTW9kaWZpZWQoKSkgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAgIiArIHJlc291cmNlLmdldFVSSSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGliOwotCX0KLQkKLQlwcm90ZWN0ZWQgUmVzb3VyY2UgbG9hZExpYnJhcnlSZXNvdXJjZShTdHJpbmcgcGF0aCkgewotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aCk7Ci0JCVJlc291cmNlIHJlcyA9IHN1cGVyLmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JCWlmICghcmVzLmdldEVycm9ycygpLmlzRW1wdHkoKSkgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXN0ckJ1Zi5hcHBlbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZExpYnJhcnlFcnJvcl9tc2cpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzLmdldEVycm9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlLkRpYWdub3N0aWMgZXJyb3IgPSAoUmVzb3VyY2UuRGlhZ25vc3RpYykgaXRlcgotCQkJCQkJLm5leHQoKTsKLQkJCQlzdHJCdWYuYXBwZW5kKE5MUy5iaW5kKAotCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZExpYnJhcnlFcnJvcl9kZXRhaWxzLAotCQkJCQkJKG5ldyBPYmplY3RbXSB7IFN0cmluZy52YWx1ZU9mKGVycm9yLmdldExpbmUoKSksCi0JCQkJCQkJCVN0cmluZy52YWx1ZU9mKGVycm9yLmdldENvbHVtbigpKSwKLQkJCQkJCQkJZXJyb3IuZ2V0TWVzc2FnZSgpIH0pKSk7Ci0JCQl9Ci0JCQlTdHJpbmcgbXNnID0gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKG1zZyk7Ci0JCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihtc2cpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JcHVibGljIE1ldGhvZExpYnJhcnkgbG9hZExpYnJhcnlXaXRob3V0UmVzZXQoU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2FkaW5nID0gdHJ1ZTsKLQotCQkvLyBubyByZWZyZXNoIGR1cmluZyBsb2FkaW5nCi0JCS8vCi0JCWJvb2xlYW4gYiA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5pc0VuYWJsZWQoKTsKLQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzZXQoKTsKLQkJdHJ5IHsJCQotCQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQljb25maWdGb2xkZXJQYXRoID0gbmV3IFBhdGgobmV3IEZpbGUobGliRmlsZS5nZXRQYXJlbnRGaWxlKCksCi0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FKS5nZXRDYW5vbmljYWxQYXRoKCkpOwotCQkJbGliRm9sZGVyUGF0aCA9IG5ldyBQYXRoKGxpYkZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldENhbm9uaWNhbFBhdGgoKSk7Ci0JCQlSZXNvdXJjZSByZXMgPSBsb2FkTGlicmFyeVJlc291cmNlKGxpYkZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpKTsgCi0JCQl0cnkgewotCQkJCWluaXRpYWxpemUodHJ1ZSk7Ci0JCQkJCi0JCQkJLy8gU2V0IG1vZGlmaWVkIGZsYWcgb2YgbGlicmFyeSByZXNvdXJjZSB0byBmYWxzZSBpbiBjYXNlIGl0IGhhZCBiZWVuIG1vZGlmaWVkIGR1cmluZyBpbml0aWFsaXphdGlvbgotCQkJCS8vCi0JCQkJaWYocmVzICE9IG51bGwpIHsKLQkJCQkJcmVzLnNldE1vZGlmaWVkKGZhbHNlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGdldE1ldGhvZExpYnJhcnkoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKE5MUy5iaW5kKAotCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMuaW52YWxpZExpYnJhcnlGaWxlRXJyb3JfbXNnLCBwYXRoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChiKTsKLQotCQkJbG9hZGluZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgb3Bwb3NpdGUgZmVhdHVyZXMgZm9yIGFsbCBsb2FkZWQgb2JqZWN0cwotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcygpIHsKLQkJQXJyYXlMaXN0IG9wcG9zaXRlRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IEFzc29jaWF0aW9uSGVscGVyLmdldFByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzKCkKLQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gKE9wcG9zaXRlRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGQob3Bwb3NpdGVGZWF0dXJlKTsKLQkJCX0KLQkJfQotCQlsb2FkT3Bwb3NpdGVGZWF0dXJlcyhvcHBvc2l0ZUZlYXR1cmVzKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBSZXNvdXJjZU1hbmFnZXIgdHJlZSBvZiB0aGUgb3BlbiBsaWJyYXJ5IGFuZCBjb25uZWN0IGFueSBsb2FkZWQKLQkgKiBNZXRob2RVbml0IHRvIHRoZSBsaWJyYXJ5IHRyZWUgYXMgd2VsbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFJlc291cmNlTWFuYWdlclRyZWUoKSB7Ci0JCWxvbmcgYmVnaW4gPSAwOwotCQkKLQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCWJlZ2luID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQotCQkvLyBkaXNhYmxlIGxvZ2dpbmcgdW5yZXNvbHZlZCBwcm94aWVzIGR1cmluZyBsb2FkaW5nIHJlc291cmNlIG1hbmFnZXIKLQkJLy8gdHJlZQotCQkvLwotCQltYXJrZXJNYW5hbmdlci5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCk7Ci0JCXRyeSB7Ci0JCQkvLyB0aGlzIHByZXZlbnRzIHVyaUNvbnZlcnRlciBmcm9tIGxvYWRpbmcgcmVzb3VyY2VzIHdoaWxlCi0JCQkvLyBub3JtYWxpemluZyBVUkkKLQkJCS8vCi0JCQl1cmlDb252ZXJ0ZXIuc2V0UmVzb2x2ZVByb3h5KGZhbHNlKTsKLQotCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHJlc01nciwgZmFsc2UpIHsKLQotCQkJCS8qKgotCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJICovCi0JCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjE3MjY5MTAxNzk4NzcwMjUwNkw7Ci0KLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gKFJlc291cmNlTWFuYWdlcikgb2JqZWN0OwotCQkJCQlyZXR1cm4gcmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQlsb2FkaW5nUmVzb3VyY2VNYW5hZ2VyVHJlZSA9IHRydWU7Ci0JCQlmb3IgKDsgaXRlcmF0b3IuaGFzTmV4dCgpOyBpdGVyYXRvci5uZXh0KCkpCi0JCQkJOwotCQl9IGZpbmFsbHkgewotCQkJbWFya2VyTWFuYW5nZXIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXVyaUNvbnZlcnRlci5zZXRSZXNvbHZlUHJveHkodHJ1ZSk7Ci0JCQlsb2FkaW5nUmVzb3VyY2VNYW5hZ2VyVHJlZSA9IGZhbHNlOwotCi0JCQkvLyBSZXBvcnRpbmcgb2YgdW5ub3JtYWxpemVkIFVSSXMgd2FzIGRpc2FibGVkIHdoaWxlIGxvYWRpbmcKLQkJCS8vIHJlc291cmNlIG1hbmFnZXIgdHJlZS4gTm93IHdlIG5lZWQKLQkJCS8vIHRvIGdvIHRocnUgYWxsIHRoZSBsb2FkZWQgb2JqZWN0cyB0byBmaW5kIHByb3hpZXMgd2l0aAotCQkJLy8gdW5ub3JtYWxpemVkIFVSSXMgYW5kIHJlcG9ydCB0aGVtCi0JCQkvLwotCQkJdHJ5IHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS52YWx1ZXMoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSW50ZXJuYWxFT2JqZWN0IG8gPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKG8uZUlzUHJveHkoKSAmJiBvLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQlVUkkgdXJpID0gby5lUHJveHlVUkkoKTsKLQkJCQkJCVVSSSBub3JtYWxpemVkVVJJID0gZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0JCQkJCQlpZiAobm9ybWFsaXplZFVSSSA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gdGhpcyBjYWxsIHdpbGwgbG9nIGVycm9yIGFib3V0IHVucmVzb2x2ZWQgcHJveHkKLQkJCQkJCQkvLwotCQkJCQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBvLmVDb250YWluZXIoKSkuZVJlc29sdmVQcm94eShvKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQkJCi0JCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwubG9hZFJlc291cmNlTWFuYWdlclRyZWUoKTogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZ2luKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgewotCQlyZXR1cm4gKChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIGdldFVSSUNvbnZlcnRlcigpKS5nZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU9iamVjdCBmaW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBmaW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoZ2V0UmVzb3VyY2VNYW5hZ2VyKCksIGlkKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgZmluZEVPYmplY3RJblVubG9hZGVkUmVzb3VyY2VzKFJlc291cmNlTWFuYWdlciByZXNNZ3IsCi0JCQlTdHJpbmcgaWQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IHN1cGVyLmdldFJlc291cmNlKGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKSwgZmFsc2UpOwotCQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgIXJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQl0cnkgewotCQkJCQlyZXNvdXJjZSA9IHN1cGVyLmdldFJlc291cmNlKGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKSwgdHJ1ZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8KLQkJCQl9Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJRU9iamVjdCBlT2JqZWN0ID0gcmVzb3VyY2UuZ2V0RU9iamVjdChpZCk7Ci0JCQkJCWlmIChlT2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBlT2JqZWN0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc01nci5nZXRTdWJNYW5hZ2VycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gZmluZEVPYmplY3RJblVubG9hZGVkUmVzb3VyY2VzKAotCQkJCQkoUmVzb3VyY2VNYW5hZ2VyKSBpdGVyLm5leHQoKSwgaWQpOwotCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZU9iamVjdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBpZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoU3RyaW5nIGlkKSB7Ci0JCS8vIGZpcnN0LCB0cnkgdG8gZ2V0IHRoZSBvYmplY3QgZnJvbSB0aGUgY2FjaGUgZ3VpZFRvTWV0aG9kRWxlbWVudAotCQkvLwotCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLmdldChpZCk7Ci0JCWlmIChlT2JqZWN0ICE9IG51bGwpCi0JCQlyZXR1cm4gZU9iamVjdDsKLQotCQlVUkkgdXJpID0gTXVsdGlGaWxlVVJJQ29udmVydGVyLmNyZWF0ZVVSSShpZCkuYXBwZW5kRnJhZ21lbnQoaWQpOwotCQlVUkkgbm9ybWFsaXplZCA9IGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotCQlpZiAobm9ybWFsaXplZCA9PSBudWxsKSB7Ci0JCQkvLyB0aGUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGlkIG1pZ2h0IG5vdCBoYXZlIGRpcmVjdCByZXNvdXJjZSwKLQkJCS8vIGhlbmNlLCBpdCBkb2VzIG5vdCBoYXZlCi0JCQkvLyBpdHMgb3duIFJlc291cmNlRGVzY3JpcHRvciBpbiBSZXNvdXJjZU1hbmFnZXIgdHJlZS4KLQkJCS8vIGdvIHRocnUgYWxsIHVubG9hZGVkIHJlc291cmNlcywgbG9hZCB0aGVtLCBhbmQgdHJ5IHRvIGZpbmQgdGhlCi0JCQkvLyBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JCQkvLwotCQkJZU9iamVjdCA9IGZpbmRFT2JqZWN0SW5VbmxvYWRlZFJlc291cmNlcyhpZCk7Ci0JCQlpZiAoZU9iamVjdCA9PSBudWxsICYmIFJFUE9SVF9FUlJPUikgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihOTFMuYmluZCgKLQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLm9iak5vdEZvdW5kRXJyb3JfbXNnLCBpZCkpOwotCQkJfQotCQkJcmV0dXJuIGVPYmplY3Q7Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIGdldEVPYmplY3QodXJpLCB0cnVlKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0I2dldEVPYmplY3Qob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlyZXR1cm4gZ2V0RU9iamVjdChudWxsLCB1cmksIGxvYWRPbkRlbWFuZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXN1bHQgPSBkb0NyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCXJlc3VsdC5zZXRUcmFja2luZ01vZGlmaWNhdGlvbih0cnVlKTsKLQkJZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCBSZXNvdXJjZSBkb0NyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIG5ldyBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwodXJpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGJhY2t1cFJlcXVpcmVkKE1hcCBvcHRpb25zKSB7Ci0JCUJvb2xlYW4gYmFja3VwID0gKEJvb2xlYW4pIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkJBQ0tfVVBfQkVGT1JFX1NBVkUpOwotCQlyZXR1cm4gYmFja3VwICE9IG51bGwgJiYgYmFja3VwLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBiYWNrdXAoUmVzb3VyY2UgcmVzKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJCXJldHVybjsKLQkJCU9iamVjdCBvYmplY3QgPSByZXMuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5Ci0JCQkJCXx8IG9iamVjdCBpbnN0YW5jZW9mIFJlc291cmNlTWFuYWdlciB8fCBvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKQotCQkJCXJldHVybjsKLQotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gZ2V0TWV0aG9kTGlicmFyeSgpOwotCQkJU3RyaW5nIGJhY2t1cERpciA9IG5ldyBGaWxlKGxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkJLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKQotCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgIi5iYWsiOyAvLyROT04tTkxTLTEkCi0JCQlTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgKLQkJCQkJInl5TU1kZEhIbW1zcy5TIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChyZXMgPT0gbGlicmFyeS5lUmVzb3VyY2UoKSkgewotCQkJCURhdGVGb3JtYXQuZ2V0SW5zdGFuY2UoKS5mb3JtYXQoCi0JCQkJCQlDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWUoKSk7Ci0JCQkJRmlsZSBiYWNrdXBGaWxlID0gbmV3IEZpbGUoYmFja3VwRGlyLAotCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FCi0JCQkJCQkJCSsgJ18nCi0JCQkJCQkJCSsgZGF0ZUZvcm1hdHRlci5mb3JtYXQoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCS5nZXRUaW1lKCkpKTsKLQkJCQlpZiAoIWJhY2t1cEZpbGUuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCWJhY2t1cEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQkJCX0KLQkJCQlGaWxlVXRpbC5tb3ZlRmlsZShuZXcgRmlsZShyZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLCBiYWNrdXBGaWxlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHJlcy5nZXRVUkkoKS5kZXJlc29sdmUoCi0JCQkJCQlsaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQlGaWxlIGJhY2t1cEZpbGUgPSBuZXcgRmlsZShiYWNrdXBEaXIsIHJlbGF0aXZlUGF0aAotCQkJCQkJKyAnXycKLQkJCQkJCSsgZGF0ZUZvcm1hdHRlcgotCQkJCQkJCQkuZm9ybWF0KENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpKSk7Ci0JCQkJaWYgKCFiYWNrdXBGaWxlLmdldFBhcmVudEZpbGUoKS5leGlzdHMoKSkgewotCQkJCQliYWNrdXBGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCQl9Ci0JCQkJRmlsZVV0aWwubW92ZUZpbGUobmV3IEZpbGUocmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKSwgYmFja3VwRmlsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQloYW5kbGVFeGNlcHRpb24oTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMuYmFja3VwRXJyb3JfbXNnLCByZXMpKTsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlVVJJTWFwcGluZ3MoRU9iamVjdCBlT2JqLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IE11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlTWFuYWdlcihlT2JqCi0JCQkJLmVSZXNvdXJjZSgpKTsKLQkJaWYgKHJlc01nciAhPSBudWxsICYmIHJlc01nci5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJRWNvcmVVdGlsLnJlbW92ZShyZXNNZ3IpOwotCQl9Ci0JCXJlc01nciA9IGdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJaWYocmVzTWdyICE9IG51bGwpIHsKLQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gTXVsdGlGaWxlU2F2ZVV0aWwuZmluZFJlc291cmNlRGVzY3JpcHRvcigKLQkJCQkJcmVzTWdyLCBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKGVPYmopLAotCQkJCQludWxsLCB0cnVlKTsKLQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCAmJiBkZXNjLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGRlc2MuZVJlc291cmNlKCkpOwotCQkJCX0KLQkJCQlFY29yZVV0aWwucmVtb3ZlKGRlc2MpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW5VcChSZXNvdXJjZSByZW1vdmVkUmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNsZWFuVXAocmVtb3ZlZFJlc291cmNlLCBudWxsKTsKLQl9Ci0KLQkvLyBwcm90ZWN0ZWQgdm9pZCBjbGVhblVwKEVPYmplY3Qgb2JqLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkvLyB0cnkgewotCS8vIC8vIHJlbW92ZSBhbGwgdGhlIFVSSSBtYXBwaW5ncwotCS8vIC8vCi0JLy8gcmVtb3ZlVVJJTWFwcGluZ3Mob2JqLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JLy8gfQotCS8vIGZpbmFsbHkgewotCS8vIFJlc291cmNlIHJlc291cmNlID0gb2JqLmVSZXNvdXJjZSgpOwotCS8vIGlmKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5jb250YWlucyhvYmopKSB7Ci0JLy8gcmVzb3VyY2UudW5sb2FkKCk7Ci0JLy8gZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlc291cmNlKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQotCXZvaWQgY2xlYW5VcChSZXNvdXJjZSByZW1vdmVkUmVzb3VyY2UsIFNldCBtb2RpZmllZFJlc291cmNlcykKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLwotCQkJaWYgKHJlbW92ZWRSZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCXJlbW92ZWRSZXNvdXJjZS51bmxvYWQoKTsKLQkJCQl0cnkgewotCQkJCQlyZW1vdmVkUmVzb3VyY2UubG9hZChudWxsKTsKLQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkvLyB0aGUgZmlsZSBtaWdodCBhbHJlYWR5IGJlIGRlbGV0ZWQsIG1vdmVkIG9yIG5ldmVyCi0JCQkJCS8vIGNyZWFyZWQuCi0JCQkJCS8vCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUVPYmplY3Qgb2JqID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVtb3ZlZFJlc291cmNlKTsKLQotCQkJLy8gaWYob2JqID09IG51bGwpIHJldHVybjsKLQkJCS8vIGJvb2xlYW4gY2xlYW5Gb2xkZXI7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCS8vIGNsZWFuRm9sZGVyID0gdHJ1ZTsKLQkJCS8vIH0KLQkJCS8vIGVsc2UgewotCQkJLy8gY2xlYW5Gb2xkZXIgPSBmYWxzZTsKLQkJCS8vIH0KLQotCQkJLy8gTXVsdGlGaWxlVVJJQ29udmVydGVyIHVtYVVyaUNvbnZlcnRlciA9Ci0JCQkvLyAoKE11bHRpRmlsZVVSSUNvbnZlcnRlcilnZXRVUklDb252ZXJ0ZXIoKSk7Ci0JCQkvLyB1bWFVcmlDb252ZXJ0ZXIuZ2V0UmVzb3VyY2VNYW5hZ2VyKCkucmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKHJlbW92ZWRSZXNvdXJjZS5nZXRVUkkoKSwKLQkJCS8vIGNsZWFuRm9sZGVyKTsKLQotCQkJLy8gcmVtb3ZlIGFsbCB0aGUgVVJJIG1hcHBpbmdzCi0JCQkvLwotCQkJcmVtb3ZlVVJJTWFwcGluZ3Mob2JqLCBtb2RpZmllZFJlc291cmNlcyk7Ci0KLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkvLyBjbGVhblVwUmVzb3VyY2VEZXNjcmlwdG9ycygoUHJvY2Vzc1BhY2thZ2Upb2JqKTsKLQkJCS8vIH0KLQotCQkJcmVtb3ZlZFJlc291cmNlLnVubG9hZCgpOwotCQl9IGZpbmFsbHkgewotCQkJZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlbW92ZWRSZXNvdXJjZSk7Ci0JCQlVUkkgb2xkVVJJID0gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlbW92ZWRSZXNvdXJjZSkKLQkJCQkJLmdldE9sZFVSSSgpOwotCQkJaWYgKG9sZFVSSSAhPSBudWxsKSB7Ci0JCQkJZ2V0VVJJVG9UZW1wVVJJTWFwKCkucmVtb3ZlKG9sZFVSSSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYW5VcChQcm9jZXNzUGFja2FnZSBwcm9jUGtnKSB7Ci0JCS8vIHJlbW92ZSBDb250ZW50RGVzY3JpcHRpb24gb2YgYWxsIFByb2Nlc3NFbGVtZW50cyBpbiB0aGlzCi0JCS8vIFByb2Nlc3NQYWNrYWdlCi0JCS8vCi0JCXJlbW92ZUNvbnRlbnREZXNjcmlwdGlvbnMocHJvY1BrZyk7Ci0KLQkJRWNvcmVVdGlsLnJlbW92ZShwcm9jUGtnKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvY1BrZwotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVDb250ZW50RGVzY3JpcHRpb25zKFByb2Nlc3NQYWNrYWdlIHByb2NQa2cpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvY1BrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVByb2Nlc3NFbGVtZW50IGVsZW1lbnQgPSAoUHJvY2Vzc0VsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKGVsZW1lbnQpCi0JCQkJCSYmIGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXJlbW92ZVByZXNlbnRhdGlvbihlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb2NQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHBrZyA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJcmVtb3ZlQ29udGVudERlc2NyaXB0aW9ucygoUHJvY2Vzc1BhY2thZ2UpIHBrZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVQcmVzZW50YXRpb24oUHJvY2Vzc0VsZW1lbnQgZWxlbWVudCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCk7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkucmVtb3ZlKGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzYXZlKENvbGxlY3Rpb24gcmVzb3VyY2VzLCBNYXAgb3B0aW9ucywgYm9vbGVhbiBwcmVwYXJlU2F2ZSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlpZiAob3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvcHRpb25zID0gZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JCX0KLQotCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlvcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQsCi0JCQkJbW9kaWZpZWRSZXNvdXJjZXMpOwotCQl0cnkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJc2F2ZShyZXMsIG9wdGlvbnMsIHByZXBhcmVTYXZlKTsKLQkJCX0KLQkJCXNhdmVNb2RpZmllZFJlc291cmNlcyhvcHRpb25zKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGZpbmFsbHkgewotCQkJb3B0aW9ucy5yZW1vdmUoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VUKTsKLQkJfQotCX0KLQotCWJvb2xlYW4gc2F2ZShSZXNvdXJjZSByZXMsIE1hcCBvcHRpb25zLCBib29sZWFuIHByZXBhcmVTYXZlKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNldCBtb2RpZmllZFJlc291cmNlcyA9IChTZXQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCk7Ci0JCVR4UmVjb3JkIHR4UmVjb3JkID0gKFR4UmVjb3JkKSBvcHRpb25zCi0JCQkJLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5UWF9SRUNPUkQpOwotCQlMaXN0IHJlc291cmNlc1RvQ29tbWl0ID0gdHhSZWNvcmQgIT0gbnVsbCA/IHR4UmVjb3JkCi0JCQkJLmdldFJlc291cmNlc1RvQ29tbWl0KCkgOiBudWxsOwotCi0JCXRyeSB7Ci0JCQlNZXRob2RFbGVtZW50IGVPYmogPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQkJaWYgKGVPYmogIT0gbnVsbCkgewotCQkJCWlmIChwcmVwYXJlU2F2ZSkgewotCQkJCQlpZiAoZU9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgZU9iajsKLQkJCQkJCVJlc291cmNlIGNvbnRlbnQgPSBwcm9jQ29tcC5nZXRQcm9jZXNzKCkgIT0gbnVsbAotCQkJCQkJCQkmJiBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0JCQkJCQkJCQkJLmhhc1ByZXNlbnRhdGlvbihwcm9jQ29tcC5nZXRQcm9jZXNzKCkpID8gcHJvY0NvbXAKLQkJCQkJCQkJLmdldFByb2Nlc3MoKS5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKQotCQkJCQkJCQk6IG51bGw7Ci0JCQkJCQlib29sZWFuIGFscmVhZHlNb2RpZmllZCA9IGNvbnRlbnQgIT0gbnVsbAotCQkJCQkJCQkmJiBjb250ZW50LmlzTW9kaWZpZWQoKTsKLQkJCQkJCXByZXBhcmVTYXZlKHByb2NDb21wKTsKLQkJCQkJCWlmIChjb250ZW50ICE9IG51bGwgJiYgY29udGVudC5pc01vZGlmaWVkKCkKLQkJCQkJCQkJJiYgIWFscmVhZHlNb2RpZmllZCkgewotCQkJCQkJCS8vIGNvbnRlbnQgaXMgbW9kaWZpZWQgYXMgcmVzdWx0IG9mIHByZXBhcmVTYXZlKCksCi0JCQkJCQkJLy8gaXQgbmVlZHMgdG8gYmUgc2F2ZWQgYWZ0ZXIgbW9kZWwgaXMgc2F2ZWQKLQkJCQkJCQkvLwotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjb250ZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChlT2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5hZGRSZXNvdXJjZU1hbmFnZXIocmVzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmVzLmlzTW9kaWZpZWQoKSkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0+IFN0YXJ0IHNhdmluZyAiICsgcmVzKTsKLQkJCQkJYm9vbGVhbiBiYWNrdXBSZXF1aXJlZCA9IGJhY2t1cFJlcXVpcmVkKG9wdGlvbnMpOwotCQkJCQlpZiAoYmFja3VwUmVxdWlyZWQpIHsKLQkJCQkJCS8vIGJhY2sgdXAgcmVzb3VyY2UgYmVmb3JlIHNhdmluZwotCQkJCQkJLy8KLQkJCQkJCWJhY2t1cChyZXMpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHJlc291cmNlc1RvQ29tbWl0ICE9IG51bGwpIHsKLQkJCQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXMpLnNldFRlbXBVUkkodHhSZWNvcmQKLQkJCQkJCQkJLmdldFR4SUQoKSk7Ci0JCQkJCQlyZXNvdXJjZXNUb0NvbW1pdC5hZGQocmVzKTsKLQkJCQkJfQotCi0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLnNhdmUocmVzLCBvcHRpb25zKTsKLQotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIjwtLS0tIFNhdmVkIHJlc291cmNlOiAiICsgcmVzKTsKLQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJdGhyb3cgZXhjZXB0aW9uOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNhdmUgYSByZXNvdXJjZSBvZiB0aGlzIHJlc291cmNlIHNldCB3aXRoIHRoZSBnaXZlbiBzYXZlIG9wdGlvbnMKLQkgKiAKLQkgKiBAcGFyYW0gcmVzCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIGF0IGxlYXN0IGEgcmVzb3VyY2UgaGFzIGJlZW4gc2F2ZWQgaW4gdGhpcyBjYWxsCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYXZlKFJlc291cmNlIHJlcywgTWFwIG9wdGlvbnMpIHRocm93cyBFeGNlcHRpb24gewotLy8JCS8vIGNsZWFyIGFsbCBlcnJvciBtYXJrZXJzIGZvciB0aGlzIHJlc291cmNlCi0vLwkJLy8KLS8vCQltYXJrZXJNYW5hbmdlci5jbGVhck1hcmtlcnMocmVzKTsKLQotCQlpZiAocmVzID09IG51bGwgfHwgcmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChvcHRpb25zID09IG51bGwpIHsKLQkJCW9wdGlvbnMgPSBnZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQkJfQotCi0JCVNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCW9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCwKLQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCWJvb2xlYW4gbm90RmFpbFNhZmUgPSBvcHRpb25zLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5UWF9SRUNPUkQpID09IG51bGw7Ci0JCXRyeSB7Ci0JCQlDb2xsZWN0aW9uIHNhdmVkUmVzb3VyY2VzID0gbnVsbDsKLQkJCWlmKG5vdEZhaWxTYWZlKSB7Ci0JCQkJc2F2ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl9Ci0JCQlib29sZWFuIHJldCA9IHNhdmUocmVzLCBvcHRpb25zLCB0cnVlKTsKLQkJCWlmKHJldCAmJiBub3RGYWlsU2FmZSkgewotCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXMpOwotCQkJfQotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKG9wdGlvbnMpOwotCQkJaWYoIWNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJcmV0ID0gdHJ1ZTsKLQkJCQlpZihub3RGYWlsU2FmZSkgewotCQkJCQlzYXZlZFJlc291cmNlcy5hZGRBbGwoY29sbGVjdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZihub3RGYWlsU2FmZSAmJiByZXQpIHsKLQkJCQkvLyB1cGRhdGUgcmVzb3VyY2UgY2FjaGVkIHRpbWVzdGFtcHMKLQkJCQkvLwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNhdmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgcmVzb3VyY2UgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKXJlc291cmNlKS51cGRhdGVUaW1lU3RhbXBzKCk7Ci0JCQkJCX0KLQkJCQl9CQkJCQkJCQkKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHJldDsKLQkJfSBmaW5hbGx5IHsKLQkJCW9wdGlvbnMucmVtb3ZlKE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBvbmx5IHRoZSBtb2RpZmllZCByZXNvdXJjZXMgaW4gdGhpcyByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKE1hcCBvcHRpb25zKSB0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXNhdmUob3B0aW9ucywgZmFsc2UsIHRydWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoUnVudGltZUV4Y2VwdGlvbillOwotCQkJfQotCQkJdGhyb3cgbmV3IExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBvcHRpb25zCi0JICogQHJldHVybiByZXNvdXJjZXMgdGhhdCBoYWQgYmVlbiBzYXZlZCBieSB0aGlzIGNhbGwKLQkgKiBAdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbiAKLQkgKi8KLQlDb2xsZWN0aW9uIHNhdmVNb2RpZmllZFJlc291cmNlcyhNYXAgb3B0aW9ucykgdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCVNldCBtb2RpZmllZFJlc291cmNlcyA9IChTZXQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCk7Ci0JCVR4UmVjb3JkIHR4UmVjb3JkID0gKFR4UmVjb3JkKSBvcHRpb25zCi0JCQkJLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5UWF9SRUNPUkQpOwotCQlMaXN0IHJlc291cmNlc1RvQ29tbWl0ID0gdHhSZWNvcmQgIT0gbnVsbCA/IHR4UmVjb3JkCi0JCQkJLmdldFJlc291cmNlc1RvQ29tbWl0KCkgOiBudWxsOwotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlib29sZWFuIGJhY2t1cFJlcXVpcmVkID0gYmFja3VwUmVxdWlyZWQob3B0aW9ucyk7Ci0JCWJvb2xlYW4gY2hlY2tNb2RpZnkgPSBNdWx0aUZpbGVYTUlTYXZlSW1wbC5jaGVja01vZGlmeVJlcXVpcmVkKG9wdGlvbnMpOwotCQlDb2xsZWN0aW9uIHNhdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoIW1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJTGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzVG9TYXZlID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4obW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJCi0JCQltb2RpZmllZFJlc291cmNlcy5jbGVhcigpOwotCQkJaWYgKGNoZWNrTW9kaWZ5KSB7Ci0JCQkJY2hlY2tNb2RpZnkocmVzb3VyY2VzVG9TYXZlKTsKLQkJCQlpZihyZXNvdXJjZXNUb0NvbW1pdCAhPSBudWxsKSB7Ci0JCQkJCS8vIGNoZWNrIGZvciBvdXQtb2Ytc3luY2ggb25seSBpbiBmYWlsLXNhZmUgc2F2aW5nIGZvciBub3cKLQkJCQkJLy8KLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuY2hlY2tPdXRPZlN5bmNoKHJlc291cmNlc1RvU2F2ZSk7Ci0JCQkJfQotCQkJfQotCQkJZm9yKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXNUb1NhdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCS8vIGlmKHJlc291cmNlLmlzTW9kaWZpZWQoKSkgewotCQkJCWlmIChiYWNrdXBSZXF1aXJlZCkgewotCQkJCQkvLyBiYWNrIHVwIHJlc291cmNlIGJlZm9yZSBzYXZpbmcKLQkJCQkJLy8KLQkJCQkJYmFja3VwKHJlc291cmNlKTsKLQkJCQl9Ci0KLQkJCQlpZiAocmVzb3VyY2VzVG9Db21taXQgIT0gbnVsbCkgewotCQkJCQkoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UpLnNldFRlbXBVUkkodHhSZWNvcmQKLQkJCQkJCQkuZ2V0VHhJRCgpKTsKLQkJCQkJcmVzb3VyY2VzVG9Db21taXQuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0KLQkJCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKHJlc291cmNlLCBvcHRpb25zKSkgewotCQkJCQlzYXZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNhdmVkUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBvcHRpb25zCi0JICogQHBhcmFtIHNhdmVBbGwKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIGZvcmNlIHNhdmluZyBhbGwgdGhlIHJlc291cmNlcyBldmVuIGlmIHRoZXkgYXJlIG5vdAotCSAqICAgICAgICAgICAgbW9kaWZpZWQuCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKE1hcCBvcHRpb25zLCBib29sZWFuIHNhdmVBbGwpIHRocm93cyBFeGNlcHRpb24gewotCQlzYXZlKG9wdGlvbnMsIHNhdmVBbGwsIGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZShNYXAgb3B0aW9ucywgYm9vbGVhbiBzYXZlQWxsLCBib29sZWFuIGZhaWxTYWZlKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChvcHRpb25zID09IG51bGwpIHsKLQkJCW9wdGlvbnMgPSBuZXcgSGFzaE1hcChnZXREZWZhdWx0U2F2ZU9wdGlvbnMoKSk7Ci0JCX0KLQotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCU11bHRpRmlsZVNhdmVVdGlsLnNldEd1aWQobGlicmFyeSk7Ci0KLQkJcHJlcGFyZVNhdmUobGlicmFyeSk7Ci0KLQkJLy8gZG8gY2xlYW4tdXAgdGhpcyByZXNvdXJjZSBzZXQgYmVmb3JlIHNhdmluZwotCQkvLwotCQljbGVhblVwKCk7Ci0KLQkJTXVsdGlGaWxlVVJJQ29udmVydGVyIHVtYVVyaUNvbnZlcnRlciA9ICgoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKSk7Ci0JCXVtYVVyaUNvbnZlcnRlci5zZXRMaWJyYXJ5VVJJcyhsaWJyYXJ5KTsKLQotCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlvcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQsCi0JCQkJbW9kaWZpZWRSZXNvdXJjZXMpOwotCQlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlUGVyc2lzdGVyIHBlcnNpc3RlciA9IG51bGw7Ci0JCWlmIChmYWlsU2FmZSkgewotCQkJcGVyc2lzdGVyID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRQotCQkJCQkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIob3B0aW9ucyk7Ci0JCQlvcHRpb25zID0gcGVyc2lzdGVyLmdldFNhdmVPcHRpb25zKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCUxpc3QgbGlzdCA9IGdldFJlc291cmNlcygpOwotCQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnQgc2F2aW5nICIgKyBzaXplICsgIiBsb2FkZWQgcmVzb3VyY2VzOiAiCi0JCQkvLyArIGxpc3QpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlib29sZWFuIGJhY2t1cFJlcXVpcmVkID0gYmFja3VwUmVxdWlyZWQob3B0aW9ucyk7Ci0JCQlMaXN0IHNhdmVSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlMaXN0IG1vdmVSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgbGlzdC5nZXQoaSk7Ci0KLQkJCQkgaWYgKHJlcy5pc01vZGlmaWVkKCkgJiYgCi0JCQkJCQkgTXVsdGlGaWxlU2F2ZVV0aWwuYWRqdXN0TG9jYXRpb25SZXF1aXJlZCgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXMpKSB7Ci0JCQkJCSBtb3ZlUmVzb3VyY2VzLmFkZChyZXMpOwotCQkJCSB9Ci0KLQkJCQlNZXRob2RFbGVtZW50IGVPYmogPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQkJCWlmIChlT2JqICE9IG51bGwgJiYgZU9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJaWYgKHNhdmVBbGwgfHwgcmVzLmlzTW9kaWZpZWQoKSkgewotLy8JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0+IFN0YXJ0IHNhdmluZyAiICsgcmVzKTsKLS8vCQkJCQkJaWYgKGZhaWxTYWZlKSB7Ci0vLwkJCQkJCQlzYXZlUmVzb3VyY2VzLmFkZChyZXMpOwotLy8JCQkJCQl9IGVsc2UgewotLy8JCQkJCQkJaWYgKGJhY2t1cFJlcXVpcmVkKSB7Ci0vLwkJCQkJCQkJLy8gYmFjayB1cCByZXNvdXJjZSBiZWZvcmUgc2F2aW5nCi0vLwkJCQkJCQkJLy8KLS8vCQkJCQkJCQliYWNrdXAocmVzKTsKLS8vCQkJCQkJCX0KLS8vCi0vLwkJCQkJCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKHJlcywgb3B0aW9ucykpIHsKLS8vCQkJCQkJCQlzYXZlZFJlc291cmNlcy5hZGQocmVzKTsKLS8vCQkJCQkJCQlpZihyZXMgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLS8vCQkJCQkJCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzKS51cGRhdGVUaW1lU3RhbXBzKCk7Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiPC0tLS0gU2F2ZWQgcmVzb3VyY2U6ICIgKyByZXMpOwotCQkJCQkJCi0JCQkJCQlzYXZlUmVzb3VyY2VzLmFkZChyZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZighc2F2ZVJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQlSZXNvdXJjZSBsaWJSZXNvdXJjZSA9IGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpOwotCQkJCWlmKCFzYXZlUmVzb3VyY2VzLmNvbnRhaW5zKGxpYlJlc291cmNlKSAmJiBQZXJzaXN0ZW5jZVV0aWwuY2hlY2tUb29sVmVyc2lvbihsaWJSZXNvdXJjZSkgIT0gMCkgewotCQkJCQlzYXZlUmVzb3VyY2VzLmFkZChsaWJSZXNvdXJjZSk7Ci0JCQkJfQotCQkJCWlmKE11bHRpRmlsZVhNSVNhdmVJbXBsLmNoZWNrTW9kaWZ5UmVxdWlyZWQob3B0aW9ucykpIHsKLQkJCQkJY2hlY2tNb2RpZnkoc2F2ZVJlc291cmNlcyk7Ci0JCQkJfQotCQkJCWlmIChmYWlsU2FmZSkgewotCQkJCQl0cnkgewotCQkJCQkJc2F2ZShzYXZlUmVzb3VyY2VzLCBvcHRpb25zLCBmYWxzZSk7Ci0JCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCQlwZXJzaXN0ZXIuYWRqdXN0TG9jYXRpb24obW92ZVJlc291cmNlcyk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCXRocm93IGU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzYXZlUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuc2F2ZShyZXNvdXJjZSwgb3B0aW9ucykpIHsKLQkJCQkJCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJCQkJCQkoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkudXBkYXRlVGltZVN0YW1wcygpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb3ZlUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UsCi0JCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQkJfQotCQkJCQlDb2xsZWN0aW9uIHNhdmVkID0gc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKG9wdGlvbnMpOwotCQkJCQlpZiAoc2F2ZWQgIT0gbnVsbCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2F2ZWQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQkJCQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKXJlc291cmNlKS51cGRhdGVUaW1lU3RhbXBzKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCXRocm93IGV4Y2VwdGlvbjsKLQkJfSBmaW5hbGx5IHsKLQkJCW9wdGlvbnMucmVtb3ZlKE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgb3BlbiBsaWJyYXJ5IHVuZGVyIGEgbmV3IGxvY2F0aW9uCi0JICogCi0JICogQHBhcmFtIG5ld0xvY2F0aW9uCi0JICogICAgICAgICAgICBkaXJlY3RvcnkgdG8gc2F2ZSB0aGUgb3BlbiBsaWJyYXJ5IHRvCi0JICogQHBhcmFtIGlmCi0JICogICAgICAgICAgICB0cnVlLCByZWdlbmVyYXRlR1VJRCByZWdlbmVyYXRlIEdVSUQgZm9yIGFsbCBNZXRob2RFbGVtZW50cyBpbgotCSAqICAgICAgICAgICAgdGhlIG9wZW4gbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVBcyhTdHJpbmcgbmV3TG9jYXRpb24sIGJvb2xlYW4gcmVnZW5lcmF0ZUdVSUQsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGxvYWQgYWxsIHRoZSByZXNvdXJjZXMgaW4gbWVtb3J5Ci0JCS8vCi0JCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQltb25pdG9yLnNldFRhc2tOYW1lKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRSZXNvdXJjZXNUYXNrX25hbWUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2VuZXJhdGVHVUlEICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5zZXRHdWlkKFVtYVV0aWwuZ2VuZXJhdGVHVUlEKCkpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hhbmdlIFVSSSBvZiBhbGwgbG9hZGVkIHJlc291cmNlcyBmb3IgbmV3IGxvY2F0aW9uCi0JCS8vCi0JCVVSSSBvbGREaXIgPSBVUkkuY3JlYXRlRmlsZVVSSShuZXcgRmlsZShsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpCi0JCQkJKyBGaWxlLnNlcGFyYXRvcik7Ci0JCVVSSSBuZXdEaXIgPSBVUkkuY3JlYXRlRmlsZVVSSShuZXdMb2NhdGlvbiArIEZpbGUuc2VwYXJhdG9yKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlyZXNvdXJjZS5zZXRVUkkocmVzb3VyY2UuZ2V0VVJJKCkucmVwbGFjZVByZWZpeChvbGREaXIsIG5ld0RpcikpOwotCQl9Ci0KLQkJLy8gY2xlYXIgdGhlIFJlc291cmNlTWFuYWdlcgotCQkvLwotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gKChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIGdldFVSSUNvbnZlcnRlcigpKQotCQkJCS5nZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQlyZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLmNsZWFyKCk7Ci0JCX0KLQotCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShQZXJzaXN0ZW5jZVJlc291cmNlcy5zYXZlTGlicmFyeVRhc2tfbmFtZSk7Ci0JCXNhdmUobnVsbCwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVubG9hZFdpdGhvdXRSZW1vdmUoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJcmVzb3VyY2UudW5sb2FkV2l0aG91dFJlbW92ZSgpOwotCQlpZihlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlpZihsaWIgIT0gbnVsbCkgewotCQkJCWxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5yZW1vdmUoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFuVXAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCUxpc3QgcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlMaXN0IGxpc3QgPSBnZXRSZXNvdXJjZXMoKTsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgbGlzdC5nZXQoaSk7Ci0JCQlib29sZWFuIHJlbW92ZSA9IGZhbHNlOwotCQkJaWYgKHJlcy5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuY2xlYW5VcCgpOiBlbXB0eSByZXNvdXJjZTogIiArIHJlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlNZXRob2RFbGVtZW50IGVPYmogPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQkJCWlmIChlT2JqID09IG51bGwKLQkJCQkJCXx8IChlT2JqICE9IGxpYnJhcnkgJiYgZU9iai5lQ29udGFpbmVyKCkgPT0gbnVsbCkpIHsKLQkJCQkJaWYgKGVPYmogPT0gbnVsbCkgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmNsZWFuVXAoKTogcmVzb3VyY2Ugd2l0aG91dCBhbnkgTWV0aG9kRWxlbWVudDogIiArIHJlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJlbW92ZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJLy8gc29tZSByZXNvdXJjZXMgbWlnaHQgYmUgbG9hZGVkIGRpcmVjdGx5LCBub3QgdGhydSBpdHMKLQkJCQkJLy8gY29udGFpbmVyLiBUaGVyZWZvcmUsIHdlIGNhbm5vdCBhc3N1bWUKLQkJCQkJLy8gdGhhdCBhIG9iamVjdCB3aXRob3V0IGEgY29udGFpbmVyIGluIGEgbG9hZGVkIHJlc291cmNlIGlzCi0JCQkJCS8vIGEgcmVtb3ZlZCBvYmplY3QuCi0JCQkJCS8vCi0JCQkJCWVsc2UgaWYgKGVPYmogIT0gbGlicmFyeSAmJiBlT2JqLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuY2xlYW5VcCgpOiByZXNvdXJjZSB3aXRob3V0IGEgY29udGFpbmVyOiAiICsgcmVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlbW92ZSkgewotCQkJCS8vIFRoaXMgaXMgYSByZW1vdmVkIG9iamVjdC4gQWRkIGl0cyBwYXRoIHRvIHRoZSBsaXN0IGZvcgotCQkJCS8vIHJlbW92aW5nIGl0cyBmaWxlcyBsYXRlci4KLQkJCQkvLwotCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBkbyBjbGVhbi11cAotCQkvLwotCQlTeXN0ZW0ub3V0Ci0JCQkJLnByaW50bG4oIk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5jbGVhblVwKCk6IHJlbW92ZWQgcmVzb3VyY2VzOiAiICsgcmVtb3ZlZFJlc291cmNlcyk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQotCQkJdHJ5IHsKLQkJCQkvLyByZW1vdmUgUmVzb3VyY2VEZXNjcmlwdG9yIG9mIHRoZSByZW1vdmVkIHJlc291cmNlCi0JCQkJLy8KLQkJCQljbGVhblVwKHJlcyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdldFJlc291cmNlcygpLnJlbW92ZUFsbChyZW1vdmVkUmVzb3VyY2VzKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJlcGFyZXMgdGhlIGxpYnJhcnkgZm9yIHNhdmluZwotCSAqLwotCXByaXZhdGUgdm9pZCBwcmVwYXJlU2F2ZShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJLy8gY2hlY2sgaWYgdGhlIGxpYnJhcnkgYWxyZWFkeSBoYXMgYSBSZXNvdXJjZU1hbmFnZXIKLQkJLy8gaWYgbm90LCBjcmVhdGUgUmVzb3VyY2VNYW5hZ2VyIGZvciBpdAotCQkvLwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBsaWJyYXJ5Ci0JCQkJLmVSZXNvdXJjZSgpOwotCQlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwuYWRkUmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJaWYobGliUmVzTWdyICE9IG51bGwpIHsKLQkJCU11bHRpRmlsZVNhdmVVdGlsLnJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihsaWJSZXNNZ3IsIGxpYnJhcnksCi0JCQkJCXJlc291cmNlLmdldEZpbmFsVVJJKCkpOwotCQl9Ci0KLQkJTGlzdCBtb2RlbHMgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJaW50IHNpemUgPSBtb2RlbHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcHJlcGFyZVNhdmUoKE1ldGhvZFBsdWdpbikgbW9kZWxzLmdldChpKSk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY2xlYW5VcCgoTWV0aG9kUGx1Z2luKSBtb2RlbHMuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2xlYW5VcChNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgUFJPQ0VTU19QQUNLQUdFX1BBVEhTLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoCi0JCQkJCXBsdWdpbiwgUFJPQ0VTU19QQUNLQUdFX1BBVEhTW2ldKTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCWNsZWFuVXBQcm9jZXNzZXMocGtnKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVwYXJlU2F2ZShNZXRob2RQbHVnaW4gbW9kZWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBQUk9DRVNTX1BBQ0tBR0VfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgKLQkJCQkJbW9kZWwsIFBST0NFU1NfUEFDS0FHRV9QQVRIU1tpXSk7Ci0JCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQlwcmVwYXJlU2F2ZShwa2cpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBwcm9jZXNzIHBhY2thZ2VzIG9mIHVudXNlZCBhY3Rpdml0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBwa2cKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNsZWFuVXBQcm9jZXNzZXMoUHJvY2Vzc1BhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgb2JqOwotCQkJCUxpc3QgcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvY0NvbXAuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJCWdldFJlbW92ZWRQYWNrYWdlcygoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQsIHBhY2thZ2VzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFja2FnZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRSZW1vdmVkUGFja2FnZXMoUHJvY2Vzc1BhY2thZ2UgcGtnLAotCQkJTGlzdCByZW1vdmVkUGFja2FnZXMpIHsKLQkJLy8gZmluZCBhY3Rpdml0eQotCQkvLwotCQlBY3Rpdml0eSBhY3QgPSBnZXRBY3Rpdml0eShwa2cpOwotCi0JCWlmIChhY3QgPT0gbnVsbCB8fCBnZXRQYXJlbnQoYWN0KSA9PSBudWxsKSB7Ci0JCQkvLyBJbnZhbGlkIHByb2Nlc3MgcGFja2FnZS4gSXQgZG9lcyBub3QgY29udGFpbiBhbnkgYWN0aXZpdHkuCi0JCQkvLyBBZGQgaXQgdG8gdGhlIGxpc3Qgb2YgcGFja2FnZXMgdG8gYmUgcmVtb3ZlZC4KLQkJCS8vCi0JCQlyZW1vdmVkUGFja2FnZXMuYWRkKHBrZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJZ2V0UmVtb3ZlZFBhY2thZ2VzKChQcm9jZXNzUGFja2FnZSkgZWxlbWVudCwKLQkJCQkJCQlyZW1vdmVkUGFja2FnZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KFByb2Nlc3NQYWNrYWdlIHBrZykgewotCQkvLyBmaW5kIGFjdGl2aXR5Ci0JCS8vCi0JCUFjdGl2aXR5IGFjdCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYWN0ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFBhcmVudChCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JCS8vIFRuZ1V0aWwuZ2V0QWRhcHRlcihlLCBJQlNJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkvLyByZXR1cm4gYWRhcHRlciA9PSBudWxsID8gbnVsbCA6IGFkYXB0ZXIuZ2V0UGFyZW50KGUpOwotCi0JCXJldHVybiBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgcHJvY2VzcyBwYWNrYWdlIGZvciB0aG9zZSBhY3Rpdml0aWVzIHRoYXQgc3RpbGwgZG9uJ3QgYmVsb25nIHRvCi0JICogYW55IHByb2Nlc3MgcGFja2FnZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJlcGFyZVNhdmUoUHJvY2Vzc1BhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXByZXBhcmVTYXZlKChQcm9jZXNzQ29tcG9uZW50KSBvYmopOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVTYXZlKFByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXApIHsKLQkJUHJvY2VzcyBwcm9jID0gcHJvY0NvbXAuZ2V0UHJvY2VzcygpOwotCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkvLyBhc3NvY2lhdGVBbGxBZGFwdGVycyhwcm9jKTsKLQkJCXByZXBhcmVTYXZlKHByb2MpOwotCi0JCQljbGVhblVwRGFuZ2xpbmdEZXNjcmlwdG9ycyhwcm9jQ29tcCk7Ci0KLQkJCUxpc3QgZGFuZ2xpbmdQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChwcm9jQ29tcC5nZXRDaGlsZFBhY2thZ2VzKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBlbGVtZW50OwotCQkJCQlyZW9yZ2FuaXplKHBrZywgZGFuZ2xpbmdQa2dzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNsZWFuIHVwIGRhbmdsaW5nIFByb2Nlc3NQYWNrYWdlcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRhbmdsaW5nUGtncy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQljbGVhblVwKChQcm9jZXNzUGFja2FnZSkgaXRlci5uZXh0KCkpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQkvLyAvKioKLQkvLyAqIEBwYXJhbSBhY3Rpdml0eQotCS8vICovCi0JLy8gcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NvY2lhdGVBbGxBZGFwdGVycyhBY3Rpdml0eSBhY3Rpdml0eSkgewotCS8vIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0KLQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCS8vIEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKQotCS8vIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGFjdGl2aXR5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYWN0aXZpdHkpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkvLyBhc3NvY2lhdGVBbGxBZGFwdGVycygoQWN0aXZpdHkpIGVsZW1lbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmVwYXJlU2F2ZShBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJTGlzdCBlbGVtZW50cyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0KLQkJLy8gYWRkIG5ldyBkZXNjcmlwdG9ycyBhbmQgb3RoZXIgbm9uLWFjdGl2aXR5IGJyZWFrZG93biBlbGVtZW50cyBvZiB0aGUKLQkJLy8gYWN0aXZpdHkgdG8gaXRzIHByb2Nlc3MgcGFja2FnZQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgJiYgZWxlbWVudC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCXBhcmVudFBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgbmV3IFdvcmtPcmRlciBvYmplY3RzIG9yIHJlbW92ZSB1bnVzZWQgV29ya09yZGVyIG9iamVjdHMgb2YgdGhpcwotCQkvLyBhY3Rpdml0eQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0eS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHdvcmtPcmRlci5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCWlmICh3b3JrT3JkZXIuZ2V0UHJlZCgpICE9IG51bGwKLQkJCQkJCSYmIGdldFBhcmVudCh3b3JrT3JkZXIuZ2V0UHJlZCgpKSAhPSBudWxsKSB7Ci0JCQkJCXBhcmVudFBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQod29ya09yZGVyKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3b3JrT3JkZXIuZ2V0UHJlZCgpID09IG51bGwKLQkJCQkJCXx8IGdldFBhcmVudCh3b3JrT3JkZXIuZ2V0UHJlZCgpKSA9PSBudWxsKSB7Ci0JCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJJbnZhbGlkIFdvcmtPcmRlcjogIiArIHdvcmtPcmRlcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlwYXJlbnRQa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlKHdvcmtPcmRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcmVtb3ZlZCB1bnVzZWQgZGlhZ3JhbXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFyZW50UGtnLmdldERpYWdyYW1zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlci5uZXh0KCk7Ci0JCQlTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IGRpYWdyYW0uZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJaWYgKGJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGJyaWRnZSkKLQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpICYmIGdldFBhcmVudCgoQWN0aXZpdHkpIGVsZW1lbnQpID09IG51bGwpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaW50IHNpemUgPSBlbGVtZW50cy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3QgZSA9IGVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGU7Ci0JCQkJaWYgKGFjdC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJCQlwa2cuc2V0TmFtZShhY3QuZ2V0TmFtZSgpKTsKLQkJCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChhY3QpOwotCQkJCQlMaXN0IGRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuZ2V0KGopOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkJCQlkZXNjcmlwdG9ycy5hZGQob2JqKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKGRlc2NyaXB0b3JzKTsKLQotCQkJCQlwYXJlbnRQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChwa2cpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3MgcGFja2FnZSBjcmVhdGVkIGZvciBhY3Rpdml0eToKLQkJCQkJLy8gJyIgKyBhY3QuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQl9Ci0JCQkJcHJlcGFyZVNhdmUoYWN0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2xlYW5VcERhbmdsaW5nRGVzY3JpcHRvcnMoUHJvY2Vzc1BhY2thZ2UgcGtnKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQKLQkJCQkJJiYgKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJYm9vbGVhbiByZW1vdmUgPSBmYWxzZTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlci5nZXRUZWFtUHJvZmlsZXMoCi0JCQkJCQkJKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5pc0VtcHR5KCkpIHsKLQkJCQkJCXJlbW92ZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJaWYgKEFzc29jaWF0aW9uSGVscGVyLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRvcnMoCi0JCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQkJaWYgKCgoVGVhbVByb2ZpbGUpIGVsZW1lbnQpLmdldFN1cGVyVGVhbSgpID09IG51bGwpIHsKLQkJCQkJCXJlbW92ZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJCX0KLQotCQkJCWlmIChyZW1vdmUpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNb3ZlcyB0aGUgcHJvY2VzcyBwYWNrYWdlcyB0byB0aGUgcmlnaHQgbG9jYXRpb24gaW4gdGhlIHRyZWUgaWYgbmVlZGVkLgotCSAqIAotCSAqIEBwYXJhbSBwa2cKLQkgKiBAcGFyYW0gZGFuZ2xpbmdQa2dzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlb3JnYW5pemUoUHJvY2Vzc1BhY2thZ2UgcGtnLCBMaXN0IGRhbmdsaW5nUGtncykgewotCQlBY3Rpdml0eSBhY3QgPSBnZXRBY3Rpdml0eShwa2cpOwotCQlpZiAoYWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gbWFrZSBzdXJlIHRoZSBwYWNrYWdlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBhY3Rpdml0eSdzIG5hbWUKLQkJLy8KLQkJaWYgKCFwa2cuZ2V0TmFtZSgpLmVxdWFscyhhY3QuZ2V0TmFtZSgpKSkgewotCQkJcGtnLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCX0KLQotCQkvLyBjaGVjayBpZiB0aGUgY29udGFpbmVyIG9mIHBrZyBpcyBhY3R1YWxseSBob2xkaW5nIHRoZSBwYXJlbnQgYWN0aXZpdHkKLQkJLy8gb2YgYWN0Ci0JCS8vCi0JCUVPYmplY3QgcGFyZW50QWN0ID0gKEVPYmplY3QpIGdldFBhcmVudChhY3QpOwotCi0JCWlmIChwYXJlbnRBY3QgPT0gbnVsbCkgewotCQkJLy8gY2xlYW5VcFJlc291cmNlRGVzY3JpcHRvcnMocGtnKTsKLQkJCS8vIGNsZWFuVXAocGtnKTsKLQkJCS8vIHJldHVybjsKLQkJCWRhbmdsaW5nUGtncy5hZGQocGtnKTsKLQkJfSBlbHNlIGlmIChwYXJlbnRBY3QgIT0gZ2V0QWN0aXZpdHkoKFByb2Nlc3NQYWNrYWdlKSBwa2cuZUNvbnRhaW5lcigpKSkgewotCQkJLy8gbW92ZSB0aGUgcGFja2FnZSB0byB0aGUgcmlnaHQgbG9jYXRpb24sIHVuZGVyIHRoZSBwcm9jZXNzIHBhY2thZ2UKLQkJCS8vIG9mIHBhcmVudEFjdAotCQkJLy8KLQkJCVByb2Nlc3NQYWNrYWdlIHBhcmVudFBrZyA9IChQcm9jZXNzUGFja2FnZSkgcGFyZW50QWN0LmVDb250YWluZXIoKTsKLQkJCXBhcmVudFBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCX0KLQotCQlpZiAocGFyZW50QWN0ICE9IG51bGwpIHsKLQkJCWNsZWFuVXBEYW5nbGluZ0Rlc2NyaXB0b3JzKHBrZyk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZW9yZ2FuaXplKChQcm9jZXNzUGFja2FnZSkgZWxlbWVudCwgZGFuZ2xpbmdQa2dzKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBNYXAgZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpIHsKLQkJaWYgKGd1aWRUb01ldGhvZEVsZW1lbnRNYXAgPT0gbnVsbCkgewotCQkJZ3VpZFRvTWV0aG9kRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJcmV0dXJuIGd1aWRUb01ldGhvZEVsZW1lbnRNYXA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkJhc2ljTm90aWZpZXJJbXBsI2VOb3RpZnkob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVOb3RpZnkoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl0cnkgewotCQkJc3VwZXIuZU5vdGlmeShub3RpZmljYXRpb24pOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkubG9nKCJFUlJPUiBub3RpZnlpbmcgY2hhbmdlczogcmVzb3VyY2VTZXQ9IiArIHRoaXMgKyAiLCBub3RpZmljYXRpb249IiArIG5vdGlmaWNhdGlvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNYXJrZXIoRXhjZXB0aW9uIGUpIHsKLQkJdHJ5IHsKLQkJCS8vIGluc2VydCBwcm9ibGVtIG1hcmtlcgotCQkJLy8KLQkJCW1hcmtlck1hbmFuZ2VyLm5vdGlmeUV4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhleCk7Ci0JCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvYWRpbmcoYm9vbGVhbiBiKSB7Ci0JCWxvYWRpbmcgPSBiOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JRXhjZXB0aW9uQ29sbGVjdG9yI2NvbGxlY3QoamF2YS5sYW5nLkV4Y2VwdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJaWYgKGxvYWRpbmdSZXNvdXJjZU1hbmFnZXJUcmVlKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFJlc29sdmVFeGNlcHRpb24pIHsKLQkJCQlpZiAoKChSZXNvbHZlRXhjZXB0aW9uKSBlKS5leGNlcHRpb24oKSBpbnN0YW5jZW9mIE11bHRpRmlsZUlPRXhjZXB0aW9uKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCWFkZE1hcmtlcihlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklQcm94eVJlc29sdXRpb25MaXN0ZW5lciNwcm94eVJlc29sdmVkKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoT2JqZWN0IHByb3h5LCBPYmplY3QgcmVzb2x2ZWQpIHsKLQkJaWYocmVzb2x2ZWQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlTdHJpbmcgZ3VpZCA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQocmVzb2x2ZWQpOwotCQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJCWdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS5wdXQoZ3VpZCwgcmVzb2x2ZWQpOwotCQkJfQotCQl9Ci0JCW1hcmtlck1hbmFuZ2VyLnByb3h5UmVzb2x2ZWQocHJveHksIHJlc29sdmVkKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgZ2V0RU9iamVjdEJ5R1VJRChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gKEVPYmplY3QpIGdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS5nZXQoZ3VpZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklVbWFSZXNvdXJjZVNldCNnZXRFT2JqZWN0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KEVPYmplY3QgcmVzb2x2ZXIsIFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCS8vIGxvbmcgc3RhcnQ7Ci0JCS8vIGlmKE11bHRpRmlsZVNhdmVVdGlsLlBST0ZJTEUpIHsKLQkJLy8gc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJLy8gfQotCi0JCVVSSSBub3JtYWxpemVkID0gKChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIGdldFVSSUNvbnZlcnRlcigpKS5ub3JtYWxpemUoCi0JCQkJdXJpLCByZXNvbHZlcik7Ci0JCWlmIChub3JtYWxpemVkID09IG51bGwpIHsKLQkJCS8vIHdvcmstYXJvdW5kIHRvIGxvb2sgdXAgZm9yIG9iamVjdCBieSBpdHMgR1VJRCBpbiBjYXNlIGl0IGhhZCBiZWVuCi0JCQkvLyBtb3ZlZCB0byBvdGhlciByZXNvdXJjZQotCQkJLy8KLQkJCVN0cmluZyBndWlkID0gdXJpLmZyYWdtZW50KCk7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSBnZXRFT2JqZWN0QnlHVUlEKGd1aWQpOwotCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBlT2JqZWN0OwotCQkJfQotCi0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMubm9ybWFsaXplVVJJRXJyb3JfbXNnLAotCQkJCQl1cmkpOwotCQkJdGhyb3cgbmV3IFVubm9ybWFsaXplZFVSSUV4Y2VwdGlvbihtc2cpOwotCQl9Ci0JCVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2Uobm9ybWFsaXplZC50cmltRnJhZ21lbnQoKSwgbG9hZE9uRGVtYW5kKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmcmFnbWVudCA9IG5vcm1hbGl6ZWQuZnJhZ21lbnQoKTsKLQkJCWlmIChmcmFnbWVudCA9PSBudWxsIHx8IGZyYWdtZW50Lmxlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm4gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJfQotCQkJRU9iamVjdCBlT2JqZWN0ID0gcmVzb3VyY2UuZ2V0RU9iamVjdChmcmFnbWVudCk7Ci0JCQlpZiAoZU9iamVjdCA9PSBudWxsICYmICFmcmFnbWVudC5lcXVhbHModXJpLmF1dGhvcml0eSgpKSkgewotCQkJCS8vIHdvcmstYXJvdW5kIHRvIGxvb2sgdXAgZm9yIG9iamVjdCBieSBpdHMgR1VJRCBpbiBjYXNlIGl0IGhhZAotCQkJCS8vIGJlZW4gbW92ZWQKLQkJCQkvLwotCQkJCXJldHVybiBnZXRFT2JqZWN0QnlHVUlEKGZyYWdtZW50KTsKLQkJCX0KLQkJCXJldHVybiBlT2JqZWN0OwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBpZihNdWx0aUZpbGVTYXZlVXRpbC5QUk9GSUxFKSB7Ci0JCS8vCQkJCi0JCS8vIH0KLQl9Ci0KLQkvLyAvKioKLQkvLyAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXhjZXB0aW9ucy4KLQkvLyAqLwotCS8vIHB1YmxpYyBMaXN0IGdldEV4Y2VwdGlvbnMoKSB7Ci0JLy8gcmV0dXJuIGV4Y2VwdGlvbnM7Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoTGlzdCBvcHBvc2l0ZUZlYXR1cmVzKSB7Ci0JCWludCBtYXggPSBvcHBvc2l0ZUZlYXR1cmVzLnNpemUoKSAtIDE7Ci0JCWlmIChtYXggPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkudmFsdWVzKCkpOwotCQlIYXNoU2V0IGxvYWRlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJd2hpbGUgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCQkJCQlmb3IgKGludCBpID0gbWF4OyBpID4gLTE7IGktLSkgewotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlID0gKChPcHBvc2l0ZUZlYXR1cmUpIG9wcG9zaXRlRmVhdHVyZXMKLQkJCQkJCQkJLmdldChpKSkuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJCQkJaWYgKGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCQkJCWlmIChlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgZWxlbWVudAotCQkJCQkJCQkJCS5lR2V0KGVGZWF0dXJlKTsKLQkJCQkJCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQllbGVtZW50LmVHZXQoZUZlYXR1cmUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gZ2V0cyB0aGUgbmV3bHkgbG9hZGVkIGVsZW1lbnRzIHRvIGxvYWQgdGhlaXIgb3Bwb3NpdGUgZmVhdHVyZXMKLQkJCS8vCi0JCQlsb2FkZWRFbGVtZW50cy5hZGRBbGwoZWxlbWVudHMpOwotCQkJZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KGdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS52YWx1ZXMoKSk7Ci0JCQllbGVtZW50cy5yZW1vdmVBbGwobG9hZGVkRWxlbWVudHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoTGlzdCBvcHBvc2l0ZUZlYXR1cmVzLCBTZXQgZGVsZXRlZEdVSURzKSB7Ci0JCWludCBtYXggPSBvcHBvc2l0ZUZlYXR1cmVzLnNpemUoKSAtIDE7Ci0JCWlmIChtYXggPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkudmFsdWVzKCkpOwotCQlIYXNoU2V0IGxvYWRlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJd2hpbGUgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCQkJCQlmb3IgKGludCBpID0gbWF4OyBpID4gLTE7IGktLSkgewotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlID0gKChPcHBvc2l0ZUZlYXR1cmUpIG9wcG9zaXRlRmVhdHVyZXMKLQkJCQkJCQkJLmdldChpKSkuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJCQkJaWYgKGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCQkJCWlmIChlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgZWxlbWVudAotCQkJCQkJCQkJCS5lR2V0KGVGZWF0dXJlKTsKLQkJCQkJCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCQkJYm9vbGVhbiByZXNvbHZlID0gZmFsc2U7Ci0JCQkJCQkJCQljaGVja19yZXNvbHZlOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdAotCQkJCQkJCQkJCQkuYmFzaWNJdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCUludGVybmFsRU9iamVjdCBlID0gKEludGVybmFsRU9iamVjdCkgaXRlcmF0b3IKLQkJCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCQkJaWYgKGUuZUlzUHJveHkoKSkgewotCQkJCQkJCQkJCQlTdHJpbmcgZ3VpZCA9IGUuZVByb3h5VVJJKCkKLQkJCQkJCQkJCQkJCQkuZnJhZ21lbnQoKTsKLQkJCQkJCQkJCQkJaWYgKGRlbGV0ZWRHVUlEcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJCQkJCQkJcmVzb2x2ZSA9IHRydWU7Ci0JCQkJCQkJCQkJCQlicmVhayBjaGVja19yZXNvbHZlOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHJlc29sdmUpIHsKLQkJCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdAotCQkJCQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChlRmVhdHVyZSwgZmFsc2UpOwotCQkJCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCQkJCQkJCUludGVybmFsRU9iamVjdCBlID0gKEludGVybmFsRU9iamVjdCkgdmFsdWU7Ci0JCQkJCQkJCQlpZiAoZS5lSXNQcm94eSgpKSB7Ci0JCQkJCQkJCQkJU3RyaW5nIGd1aWQgPSBlLmVQcm94eVVSSSgpLmZyYWdtZW50KCk7Ci0JCQkJCQkJCQkJaWYgKGRlbGV0ZWRHVUlEcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJCQkJCQllbGVtZW50LmVHZXQoZUZlYXR1cmUpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGdldHMgdGhlIG5ld2x5IGxvYWRlZCBlbGVtZW50cyB0byBsb2FkIHRoZWlyIG9wcG9zaXRlIGZlYXR1cmVzCi0JCQkvLwotCQkJbG9hZGVkRWxlbWVudHMuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkudmFsdWVzKCkpOwotCQkJZWxlbWVudHMucmVtb3ZlQWxsKGxvYWRlZEVsZW1lbnRzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1VucmVzb2x2ZWRQcm94eSgpIHsKLQkJcmV0dXJuIG1hcmtlck1hbmFuZ2VyLmhhc1VucmVzb2x2ZWRQcm94eSgpOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0VVJJVG9UZW1wVVJJTWFwKCkgewotCQlpZiAoVVJJVG9UZW1wVVJJTWFwID09IG51bGwpIHsKLQkJCVVSSVRvVGVtcFVSSU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQlyZXR1cm4gVVJJVG9UZW1wVVJJTWFwOwotCX0KLQotCXB1YmxpYyBVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyIGdldE1hcmtlck1hbmFuZ2VyKCkgewotCQlyZXR1cm4gbWFya2VyTWFuYW5nZXI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjaGVja01vZGlmeShDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gewotCQlpZighcmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJUmVzb3VyY2VbXSByZXNvdXJjZUFycmF5ID0gbmV3IFJlc291cmNlW3Jlc291cmNlcy5zaXplKCldOwotCQkJcmVzb3VyY2VzLnRvQXJyYXkocmVzb3VyY2VBcnJheSk7Ci0JCQljaGVja01vZGlmeShyZXNvdXJjZUFycmF5LCBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNjaGVja01vZGlmeShvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlW10sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tNb2RpZnkoUmVzb3VyY2VbXSByZXNvdXJjZXMsIE9iamVjdCBjb250ZXh0KSB0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIHsJCQotCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja01vZGlmeShBcnJheXMuYXNMaXN0KHJlc291cmNlcykpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjY2hlY2tNb2RpZnkoamF2YS51dGlsLkNvbGxlY3Rpb248RU9iamVjdD4sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2hlY2tNb2RpZnkoQ29sbGVjdGlvbjxFT2JqZWN0PiBlT2JqZWN0cywgT2JqZWN0IGNvbnRleHQpIHsKLQkJSGFzaFNldCBwYXRoU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZU9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IG8uZVJlc291cmNlKCk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgPT0gdGhpcykgewotCQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCBtZlJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2U7Ci0JCQkJaWYoIW1mUmVzb3VyY2UuaGFzVGVtcFVSSSgpKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gbWZSZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJcGF0aFNldC5hZGQocGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKHBhdGhTZXQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlTdHJpbmdbXSBwYXRocyA9IG5ldyBTdHJpbmdbcGF0aFNldC5zaXplKCldOwotCQlwYXRoU2V0LnRvQXJyYXkocGF0aHMpOwotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jaGVja01vZGlmeShwYXRocywgY29udGV4dCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNnZXRQZXJzaXN0ZXIoKQotCSAqLwotCXB1YmxpYyBJTGlicmFyeVBlcnNpc3RlciBnZXRQZXJzaXN0ZXIoKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjdW5sb2FkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmxvYWQoUmVzb3VyY2UgcmVzb3VyY2UsIE1hcCBvcHRpb25zKSB7Ci0JCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQl1bmxvYWRXaXRob3V0UmVtb3ZlKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjdW5sb2FkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmxvYWQoKSB7Ci0JCXJlc2V0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNnZXRGaXJzdE1ldGhvZExpYnJhcnkoKQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldEZpcnN0TWV0aG9kTGlicmFyeSgpIHsKLQkJcmV0dXJuIGdldE1ldGhvZExpYnJhcnkoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I2dldE1ldGhvZExpYnJhcmllcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kTGlicmFyaWVzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJaWYobGliID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGxpYik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNsb2FkTWV0aG9kTGlicmFyaWVzKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgbG9hZE1ldGhvZExpYnJhcmllcyhVUkkgdXJpLCBNYXAgcGFyYW1ldGVycykgdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlsb2FkTGlicmFyeSh1cmkudG9GaWxlU3RyaW5nKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoUnVudGltZUV4Y2VwdGlvbillOwotCQkJfQotCQkJdGhyb3cgbmV3IExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbihlKTsKLQkJfQotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNnZXRQZXJzaXN0ZW5jZVR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGVyc2lzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCN1bmxvYWQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdW5sb2FkKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gb2JqZWN0LmVSZXNvdXJjZSgpOwotCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLnVubG9hZGVkKChJbnRlcm5hbEVPYmplY3QpIG9iamVjdCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I3JlbG9hZE9iamVjdHMoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gcmVsb2FkT2JqZWN0cyhDb2xsZWN0aW9uIG9iamVjdHMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlU2F2ZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVTYXZlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMWY2ZDgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVTYXZlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLkxpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIHN0YXRpYyByb3V0aW5lcyBmb3IgWE1JIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNdWx0aUZpbGVTYXZlVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX01PREVMX0ZJTEVOQU1FID0gIm1vZGVsLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09OVEVOVF9GSUxFTkFNRSA9ICJjb250ZW50LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTElCUkFSWV9NT0RFTF9GSUxFTkFNRSA9ICJsaWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BMVUdJTl9FWFBPUlRfRklMRU5BTUUgPSAiZXhwb3J0LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUExVR0lOX01PREVMX0ZJTEVOQU1FID0gInBsdWdpbi54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZJTEVfRVhURU5TSU9OID0gIi54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX0ZJTEVfRVhURU5TSU9OID0gInVtYSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfUEFUVEVSTl9QQVRIID0gImNhcGFiaWxpdHlwYXR0ZXJucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElWRVJZX1BST0NFU1NfUEFUSCA9ICJkZWxpdmVyeXByb2Nlc3NlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NfQ09OVFJJQlVUSU9OX1BBVEggPSAicHJvY2Vzc2NvbnRyaWJ1dGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSA9ICJjb25maWd1cmF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzRGVidWdnaW5nKCk7Ci0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBQUk9GSUxFID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgKLQkJCSJ5eU1NZGRISG1tc3MuUyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEZpbGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChuYW1lLmluZGV4T2YoJy8nKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJ1xcJykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJzonKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJyonKSAhPSAtMQotCQkJCXx8IG5hbWUuaW5kZXhPZignPycpICE9IC0xIHx8IG5hbWUuaW5kZXhPZignIicpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCc8JykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCc+JykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJ3wnKSAhPSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aChNZXRob2RFbGVtZW50IGUpIHsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKFN0cmluZy52YWx1ZU9mKGUuZ2V0TmFtZSgpKSk7Ci0JCWZvciAoZSA9IChNZXRob2RFbGVtZW50KSAoKEVPYmplY3QpIGUpLmVDb250YWluZXIoKTsgZSAhPSBudWxsOyBlID0gKE1ldGhvZEVsZW1lbnQpICgoRU9iamVjdCkgZSkKLQkJCQkuZUNvbnRhaW5lcigpKSB7Ci0JCQlzdHJCdWZmLmluc2VydCgwLCBTdHJpbmcudmFsdWVPZihlLmdldE5hbWUoKSkgKyAiID4gIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3RyQnVmZi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZURpck5hbWUoTWV0aG9kRWxlbWVudCBvYmopIHsKLQkJU3RyaW5nIG5hbWUgPSAoKE1ldGhvZEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQlpZiAoaXNWYWxpZEZpbGVOYW1lKG5hbWUpKQotCQkJcmV0dXJuIG5hbWU7Ci0JCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihOTFMuYmluZCgKLQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5pbnZhbGlkTmFtZUVycm9yX21zZywgbmFtZSksIG9iaik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IHJlc29sdmUoRU9iamVjdCBwcm94eSkgewotCQlpZiAoIShwcm94eSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkpCi0JCQlyZXR1cm4gcHJveHk7Ci0JCUludGVybmFsRU9iamVjdCBvYmogPSAoSW50ZXJuYWxFT2JqZWN0KSBwcm94eTsKLQkJaWYgKG9iai5lUHJveHlVUkkoKSA9PSBudWxsKQotCQkJcmV0dXJuIHByb3h5OwotCQlYTUlSZXNvdXJjZUltcGwgcmVzID0gbmV3IFhNSVJlc291cmNlSW1wbChvYmouZVByb3h5VVJJKCkpOwotCQl0cnkgewotCQkJcmVzLmxvYWQobnVsbCk7Ci0JCQlyZXR1cm4gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcHJveHk7Ci0JfQotCi0Jc3RhdGljIFJlc291cmNlIHNhdmUoRU9iamVjdCBvLCBVUkkgdXJpLCBNYXAgb3B0aW9ucykgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG8uZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gc2F2ZShyZXNvdXJjZVNldCwgbywgdXJpLCBvcHRpb25zKTsKLQotCQlpZiAob3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvcHRpb25zID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlU2V0KQotCQkJCQkuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JCX0KLQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlJFRlJFU0hfTkVXX1JFU09VUkNFKTsKLQkJaWYgKHN0ciAhPSBudWxsICYmIEJvb2xlYW4udmFsdWVPZihzdHIpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkvLyBub3RpZnkgUmVmcmVzaEpvYiB0aGUgdGhpcyByZXNvdXJjZSBpcyBzYXZlZCBzbyBpdCB3aWxsIG5vdCBiZQotCQkJLy8gcmVsb2FkZWQgYWZ0ZXIgcmVmcmVzaGluZyBpdAotCQkJLy8KLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvdXJjZVNhdmVkKHJlc291cmNlKTsKLQotCQkJLy8gcmVmcmVzaCB0aGUgbmV3bHkgY3JlYXRlZCByZXNvdXJjZSBzbyBpdCBpcyBpbiBzeW5jaCB3aXRoIHRoZQotCQkJLy8gd29ya3NwYWNlCi0JCQkvLwotCQkJRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWZyZXNoKHJlc291cmNlKTsKLQkJfQotCi0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuU2F2ZVRvZ2V0aGVyKE1hcCBvcHRpb25zLCBPYmplY3Qgb2JqKSB7Ci0JCVNldCBzYXZlVG9nZXRoZXJDbGFzc2VzID0gKFNldCkgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuU0FWRV9UT0dFVEhFUl9DTEFTU19TRVQpOwotCQlpZiAoc2F2ZVRvZ2V0aGVyQ2xhc3NlcyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzYXZlVG9nZXRoZXJDbGFzc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRUNsYXNzIGVDbHMgPSAoRUNsYXNzKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlQ2xzLmlzSW5zdGFuY2Uob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoZSBnaXZlbiByZXNvdXJjZSB3aGlsZSBzdGlsbCBwcmVzZXJ2aW5nCi0JICogb2JqZWN0J3MgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gbwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVG8oUmVzb3VyY2UgcmVzb3VyY2UsIE11bHRpUmVzb3VyY2VFT2JqZWN0IG8pIHsKLQkJQmFzaWNFTGlzdCBjb250ZW50cyA9ICgoQmFzaWNFTGlzdCkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKSk7Ci0JCWlmIChjb250ZW50cy5pc0VtcHR5KCkpIHsKLQkJCS8vIHRoaXMgd2lsbCBmbGFnIHJlc291cmNlIGFzIGxvYWRlZAotCQkJLy8KLQkJCWNvbnRlbnRzLmNsZWFyKCk7Ci0KLQkJCWNvbnRlbnRzLnNldERhdGEoMSwgbmV3IE9iamVjdFtdIHsgbyB9KTsKLQkJfSBlbHNlIHsKLQkJCU9iamVjdFtdIGRhdGEgPSBjb250ZW50cy50b0FycmF5KCk7Ci0JCQlPYmplY3RbXSBuZXdEYXRhID0gbmV3IE9iamVjdFtkYXRhLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBuZXdEYXRhLCAwLCBkYXRhLmxlbmd0aCk7Ci0JCQluZXdEYXRhW2RhdGEubGVuZ3RoXSA9IG87Ci0JCQljb250ZW50cy5zZXREYXRhKG5ld0RhdGEubGVuZ3RoLCBuZXdEYXRhKTsKLQkJfQotCQlvLmVTZXRSZXNvdXJjZSgoUmVzb3VyY2UuSW50ZXJuYWwpIHJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBhIG5ldyBjb250YWluZWQgRU9iamVjdCBpbiBpdHMgb3duIG5ldyByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gbwotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqLwotCXByaXZhdGUgc3RhdGljIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCBzYXZlKFJlc291cmNlU2V0IHJlc291cmNlU2V0LAotCQkJRU9iamVjdCBvLCBVUkkgdXJpLCBNYXAgb3B0aW9ucykgewotCQlyZXR1cm4gc2F2ZShyZXNvdXJjZVNldCwgbywgdXJpLCBvcHRpb25zLCB0cnVlKTsKLQl9Ci0JCi0Jc3RhdGljIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCBzYXZlKFJlc291cmNlU2V0IHJlc291cmNlU2V0LAotCQkJRU9iamVjdCBvLCBVUkkgdXJpLCBNYXAgb3B0aW9ucywgYm9vbGVhbiByZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIpIHsKLQkJLy8gRGV0YWNoIHRoZSBvYmplY3QgZnJvbSBjb250YWluZXIgcmVzb3VyY2UKLQkJLy8KLQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXJFT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBvOwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgY3VycmVudFJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgbwotCQkJCS5lUmVzb3VyY2UoKTsKLQotCQlpZiAoY3VycmVudFJlc291cmNlICE9IG51bGwpIHsKLQkJCWN1cnJlbnRSZXNvdXJjZS5kZXRhY2hlZChvKTsKLQkJfQotCi0JCUxpc3QgbmV3UmVzb3VyY2VEZXNjcmlwdG9ycyA9IG51bGw7Ci0JCVNldCBtb2RpZmllZFJlc291cmNlcyA9IChTZXQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCk7Ci0KLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlcyA9IG51bGw7Ci0JCWlmIChjYW5TYXZlVG9nZXRoZXIob3B0aW9ucywgbykpIHsKLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCBtZlJlc291cmNlU2V0ID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlU2V0KTsKLQotCQkJLy8gaWYgdGhlIHVyaSBoYXMgYSB0ZW1wb3JhcnkgVVJJLCB1c2UgaXQgaW5zdGVhZCB0byBsb2NhdGUgdGhlCi0JCQkvLyByZXNvdXJjZSB0aGF0IGlzIGluIHByb2Nlc3Mgb2Ygc2F2aW5nCi0JCQkvLwotCQkJVVJJIHRlbXBVUkkgPSAoVVJJKSBtZlJlc291cmNlU2V0LmdldFVSSVRvVGVtcFVSSU1hcCgpLmdldCh1cmkpOwotCQkJaWYgKHRlbXBVUkkgIT0gbnVsbCkgewotCQkJCXVyaSA9IHRlbXBVUkk7Ci0JCQl9Ci0KLQkJCXJlcyA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIG1mUmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpKTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCWlmICghcmVzLmdldENvbnRlbnRzKCkuY29udGFpbnMobykpIHsKLQkJCQkJaWYgKHJlcy5nZXRGaW5hbFVSSSgpID09IHJlcy5nZXRVUkkoKSkgewotCQkJCQkJaWYgKE11bHRpRmlsZVhNSVNhdmVJbXBsLmNoZWNrTW9kaWZ5UmVxdWlyZWQob3B0aW9ucykpIHsKLQkJCQkJCQkvLyBub3QgYSB0ZW1wIGZpbGUgb2YgZmFpbC1zYWZlIHBlcnNpc3RlbmNlCi0JCQkJCQkJLy8gdHJhbnNhY3Rpb24KLQkJCQkJCQkvLyBjaGVjayBmb3Igd3JpdGVhYmxlCi0JCQkJCQkJLy8KLQkJCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja01vZGlmeShyZXMpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJYWRkVG8ocmVzLCBtckVPYmopOwotCi0JCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmKHJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcikgewotCQkJCQkJCS8vIHJlZ2lzdGVyIHRoaXMgbmV3IG9iamVjdCB3aXRoIFJlc291cmNlTWFuYWdlcgotCQkJCQkJCS8vCi0JCQkJCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWFuYWdlckZvcihvLAotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJCQkJCWRlc2MgPSByZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIocmVzTWdyLCBvLCByZXMKLQkJCQkJCQkJCS5nZXRGaW5hbFVSSSgpKTsKLQkJCQkJCQlpZiAoZGVzYyAhPSBudWxsICYmIG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc01nci5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlyZXMuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQkJCQltZlJlc291cmNlU2V0LnNhdmUocmVzLCBvcHRpb25zLCBmYWxzZSk7Ci0KLQkJCQkJCXJlcy5hdHRhY2hlZEFsbChvKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIHJvbGxiYWNrCi0JCQkJCQkvLwotCi0JCQkJCQkvLyByZW1vdmUgdGhpcyBvYmplY3QgZnJvbSB0aGUgcmVzb3VyY2UKLQkJCQkJCXJlcy5nZXRDb250ZW50cygpLnJlbW92ZShtckVPYmopOwotCQkJCQkJbXJFT2JqLmVTZXRSZXNvdXJjZSgoUmVzb3VyY2UuSW50ZXJuYWwpIG51bGwpOwotCi0JCQkJCQkvLyByZW1vdmUgdGhlIGNyZWF0ZWQgUmVzb3VyY2VEZXNjcmlwdG9yCi0JCQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShkZXNjKTsKLQkJCQkJCX0KLQotCQkJCQkJLy8gcmUtYXR0YWNoIHRvIGNvbnRhaW5lciByZXNvdXJjZQotCQkJCQkJaWYgKGN1cnJlbnRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJY3VycmVudFJlc291cmNlLmF0dGFjaGVkKG8pOwotCQkJCQkJfQotCi0JCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiByZXM7Ci0JCQl9Ci0JCX0KLQotCQlyZXMgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlhZGRUbyhyZXMsIG1yRU9iaik7Ci0JCWlmKG1yRU9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJYWRkUmVzb3VyY2VNYW5hZ2VyKHJlcyk7Ci0JCX0KLQotCQlNYXAgb2JqVG9Db250YWluZXJNYXAgPSBudWxsOwotCQl0cnkgewotCQkJaWYocmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCQkJbmV3UmVzb3VyY2VEZXNjcmlwdG9ycyA9IHJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihyZXMsCi0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCX0KLQotCQkJLy8gYmFjayB1cCB0aGUgY29udGFpbmVyIHJlZmVyZW5jZXMgYW5kIHNldCBjb250ZW50IG9iamVjdCdzCi0JCQkvLyBjb250YWluZXIgdG8gbnVsbAotCQkJLy8KLQkJCW9ialRvQ29udGFpbmVyTWFwID0gcmVtb3ZlQ29udGFpbmVycyhyZXMpOwotCi0JCQlyZXMuc2F2ZShvcHRpb25zKTsKLQotCQkJcmVzLmF0dGFjaGVkQWxsKG8pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQotCQkJLy8gcm9sbGJhY2sKLQkJCS8vCi0KLQkJCS8vIHJlbW92ZSB0aGUgZmFpbGVkIHJlb3VzcmNlIGZyb20gdGhlIHJlc291cmNlIHNldAotCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlcyk7Ci0JCQltckVPYmouZVNldFJlc291cmNlKChSZXNvdXJjZS5JbnRlcm5hbCkgbnVsbCk7Ci0KLQkJCS8vIHJlbW92ZSB0aGUgY3JlYXRlZCBSZXNvdXJjZURlc2NyaXB0b3JzCi0JCQlpZihuZXdSZXNvdXJjZURlc2NyaXB0b3JzICE9IG51bGwgJiYgIW5ld1Jlc291cmNlRGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3UmVzb3VyY2VEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRWNvcmVVdGlsLnJlbW92ZSgoRU9iamVjdCkgaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmUtYXR0YWNoIHRvIGNvbnRhaW5lciByZXNvdXJjZQotCQkJaWYgKGN1cnJlbnRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJY3VycmVudFJlc291cmNlLmF0dGFjaGVkKG8pOwotCQkJfQotCi0JCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSB0aGUgY29udGFpbmVyIHJlZmVyZW5jZXMgZm9yIHRoZSBjb250ZW50IG9iamVjdHMKLQkJCS8vCi0JCQlyZXN0b3JlQ29udGFpbmVycyhyZXMsIG9ialRvQ29udGFpbmVyTWFwKTsKLQkJfQotCi0JCWlmKHJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcikgewotCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGFkZE5ld1Jlc291cmNlTWFuYWdlcihyZXMpOwotCQkJaWYgKHJlc01nciA9PSBudWxsKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJLy8gY3JlYXRlIG5ldyBSZXNvdXJjZU1hbmFnZXIgZm9yIG5ldyBNZXRob2RQbHVnaW4KLQkJCQkJLy8KLQkJCQkJcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyRm9yKG8sIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzTWdyLmVDb250YWluZXIoKS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXMudXBkYXRlVGltZVN0YW1wcygpOwotCi0JCXJldHVybiByZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIHJlbW92ZUNvbnRhaW5lcnMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaW50IHNpemUgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKTsKLQkJTWFwIG9ialRvQ29udGFpbmVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG11bHRpUmVzRU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb3VyY2UKLQkJCQkJLmdldENvbnRlbnRzKCkuZ2V0KGkpOwotCQkJSW50ZXJuYWxFT2JqZWN0IGNvbnRhaW5lciA9IChJbnRlcm5hbEVPYmplY3QpIG11bHRpUmVzRU9iagotCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJb2JqVG9Db250YWluZXJNYXAucHV0KG11bHRpUmVzRU9iaiwgY29udGFpbmVyKTsKLQkJCQltdWx0aVJlc0VPYmouZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIG11bHRpUmVzRU9iagotCQkJCQkJLmVDb250YWluZXJGZWF0dXJlSUQoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9ialRvQ29udGFpbmVyTWFwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRhaW5lcnMgb2Ygb2JqZWN0cyBpbiByZXNvdXJjZSdzIGNvbnRlbnRzCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBtYXAgb2Ygb2JqZWN0IHRvIGNvbnRhaW5lciBlbnRyaWVzCi0JICovCi0Jc3RhdGljIE1hcCBnZXRDb250YWluZXJzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWludCBzaXplID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zaXplKCk7Ci0JCU1hcCBvYmpUb0NvbnRhaW5lck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlNdWx0aVJlc291cmNlRU9iamVjdCBtdWx0aVJlc0VPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc291cmNlCi0JCQkJCS5nZXRDb250ZW50cygpLmdldChpKTsKLQkJCUludGVybmFsRU9iamVjdCBjb250YWluZXIgPSAoSW50ZXJuYWxFT2JqZWN0KSBtdWx0aVJlc0VPYmoKLQkJCQkJLmVDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCW9ialRvQ29udGFpbmVyTWFwLnB1dChtdWx0aVJlc0VPYmosIGNvbnRhaW5lcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9ialRvQ29udGFpbmVyTWFwOwotCi0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIGNvbnRhaW5lcnMgb2YgdGhlIG9iamVjdHMgaW4gcmVzb3VyY2UncyBjb250ZW50cyB0aGF0Ci0JICogcHJldmlvdXNseSBzYXZlZCBpbiBhIG1hcCByZXR1cm5lZCBmcm9tIGdldENvbnRhaW5lcnMoUmVzb3VyY2UgcmVzb3VyY2UpCi0JICogb3IgcmVtb3ZlQ29udGFpbmVycyhSZXNvdXJjZSByZXNvdXJjZSkKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gb2JqVG9Db250YWluZXJNYXAKLQkgKiBAc2VlICNnZXRDb250YWluZXJzKFJlc291cmNlKQotCSAqIEBzZWUgI3JlbW92ZUNvbnRhaW5lcnMoUmVzb3VyY2UpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXN0b3JlQ29udGFpbmVycyhSZXNvdXJjZSByZXNvdXJjZSwKLQkJCU1hcCBvYmpUb0NvbnRhaW5lck1hcCkgewotCQlpbnQgc2l6ZSA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXVsdGlSZXNFT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvdXJjZQotCQkJCQkuZ2V0Q29udGVudHMoKS5nZXQoaSk7Ci0JCQlJbnRlcm5hbEVPYmplY3QgY29udGFpbmVyID0gKEludGVybmFsRU9iamVjdCkgb2JqVG9Db250YWluZXJNYXAKLQkJCQkJLmdldChtdWx0aVJlc0VPYmopOwotCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJbXVsdGlSZXNFT2JqLmVCYXNpY1NldENvbnRhaW5lcihjb250YWluZXIsIG11bHRpUmVzRU9iagotCQkJCQkJLmVDb250YWluZXJGZWF0dXJlSUQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tNb2RpZnkoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJLy8gZG9uJ3QgY2hlY2sgaWYgdGhlIHJlc291cmNlIGlzIGN1cnJlbnRseSBiZWluZyBzYXZlZCB0byBhIHRlbXBvcmFyeQotCQkvLyBmaWxlCi0JCS8vCi0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbAotCQkJCSYmICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSkuaGFzVGVtcFVSSSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIHBhdGggPSByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNoZWNrTW9kaWZ5KHBhdGgsCi0JCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQlTdHJpbmcgbXNnID0gVW1hVXRpbC5nZXRNZXNzYWdlKHN0YXR1cyk7Ci0JCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQltc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5tb2RpZnlGaWxlRXJyb3JfbXNnLCBwYXRoKTsKLQkJCX0KLQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihtc2cpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrTW9kaWZ5KENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCUFycmF5TGlzdCBwYXRoTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgJiYgKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLmhhc1RlbXBVUkkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcGF0aExpc3QuYWRkKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJfQotCQlpZighcGF0aExpc3QuaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmdbXSBwYXRocyA9IG5ldyBTdHJpbmdbcGF0aExpc3Quc2l6ZSgpXTsKLQkJCXBhdGhMaXN0LnRvQXJyYXkocGF0aHMpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNoZWNrTW9kaWZ5KHBhdGhzLAotCQkJCQlNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IFVtYVV0aWwuZ2V0TWVzc2FnZShzdGF0dXMpOwotCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQltc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5tb2RpZnlGaWxlRXJyb3JfbXNnLCBBcnJheXMKLQkJCQkJCQkuYXNMaXN0KHBhdGhzKSk7Ci0JCQkJfQotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihtc2cpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrT3V0T2ZTeW5jaChDb2xsZWN0aW9uIHJlc291cmNlcykgewotCQkvLyBjaGVjayBmb3Igb3V0LW9mLXN5bmNoCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXMgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBpdGVyCi0JCQkJCS5uZXh0KCk7Ci0JCQlpZihyZXMuaXNMb2FkZWQoKSAmJiAhcmVzLmhhc1RlbXBVUkkoKSkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJaWYoZmlsZS5leGlzdHMoKSkgewotCQkJCQlsb25nIGxhc3RNb2RpZmllZCA9IGZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCQkJCWlmIChyZXMuZ2V0RmlsZUxhc3RNb2RpZmllZCgpICE9IGxhc3RNb2RpZmllZCAmJiAhc2FtZShsYXN0TW9kaWZpZWQsIHJlcy5nZXRGaWxlTGFzdE1vZGlmaWVkKCkpKSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlc291cmNlT3V0T2ZTeW5jaF9tc2csIHJlcwotCQkJCQkJCQkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZXhpc3Rpbmcgb3duIHJlc291cmNlIG9mIGEgY29udGFpbmVkIEVPYmplY3QuIEFkZHMgcmVzb3VyY2VzCi0JICogdGhhdCBoYXZlIGJlZW4gbW9kaWZlZCBhZnRlciB0aGlzIGNhbGwgdG8gdGhlIE1PRElGSUVEX1JFU09VUkNFX1NFVCBvZgotCSAqIHRoZSBzYXZlIG9wdGlvbnMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHJlc291cmNlIGhhcyBiZWVuIHNhdmVkIHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UsIE1hcCBvcHRpb25zKSB7Ci0JCWlmIChyZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSAoU2V0KSBvcHRpb25zCi0JCQkJLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQpOwotCi0JCS8vIHNob3VsZCBub3QgY2hhbmdlIHJlc291cmNlIGxvY2F0aW9uIGF1dG9tYXRpY2FsbHkgd2l0aG91dCBsZXR0aW5nCi0JCS8vIHVzZXIga25vdyBhYm91dCBpdAotCQkvLwotCQkvLyBhZGp1c3RMb2NhdGlvbihyZXNvdXJjZSwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCS8vIGJhY2sgdXAgdGhlIGNvbnRhaW5lciByZWZlcmVuY2VzIGFuZCBzZXQgY29udGVudCBvYmplY3QncyBjb250YWluZXIKLQkJLy8gdG8gbnVsbAotCQkvLwotCQlNYXAgb2JqVG9Db250YWluZXJNYXAgPSByZW1vdmVDb250YWluZXJzKHJlc291cmNlKTsKLQkJdHJ5IHsKLQkJCXJlc291cmNlLnNhdmUob3B0aW9ucyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSB0aGUgY29udGFpbmVyIHJlZmVyZW5jZXMgZm9yIHRoZSBjb250ZW50IG9iamVjdHMKLQkJCS8vCi0JCQlyZXN0b3JlQ29udGFpbmVycyhyZXNvdXJjZSwgb2JqVG9Db250YWluZXJNYXApOwotCQl9Ci0KLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGFkZE5ld1Jlc291cmNlTWFuYWdlcihyZXNvdXJjZSk7Ci0JCWlmIChyZXNNZ3IgIT0gbnVsbCAmJiBtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzTWdyLmVDb250YWluZXIoKS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gUmVzb3VyY2VNYW5hZ2VyIHRoYXQgaXMganVzdCBhZGRlZCB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciB0cmVlCi0JICogICAgICAgICBvciBudWxsLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFJlc291cmNlTWFuYWdlciBhZGROZXdSZXNvdXJjZU1hbmFnZXIoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWFuYWdlcihyZXNvdXJjZSk7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJRU9iamVjdCBjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsKLQkJaWYgKHJlc01nciAhPSBudWxsICYmIGNvbnRhaW5lciAhPSBudWxsICYmIHJlc01nci5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJLy8gbmV3IFJlc291cmNlTWFuYWdlciBpcyBhZGRlZCB0byB0aGUgcmVzb3VyY2UKLQkJCS8vCi0JCQlSZXNvdXJjZU1hbmFnZXIgcGFyZW50UmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKGNvbnRhaW5lcgotCQkJCQkuZVJlc291cmNlKCkpOwotCi0JCQkvLyBjaGVjayBpZiByZXNNZ3IgaXMgYWxyZWFkeSBhIHN1YiBtYW5hZ2VyIG9mIHBhcmVudFJlc01nciBiZWZvcmUKLQkJCS8vIGFkZGluZyBpdAotCQkJLy8KLQkJCWlmICghcGFyZW50UmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuY29udGFpbnMocmVzTWdyKSkgewotCQkJCXBhcmVudFJlc01nci5nZXRTdWJNYW5hZ2VycygpLmFkZChyZXNNZ3IpOwotCQkJCXJldHVybiByZXNNZ3I7Ci0JCQl9Ci0KLQkJCS8vIHJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihwYXJlbnRSZXNNZ3IsIHJlc01nciwKLQkJCS8vIHJlc01nci5lUmVzb3VyY2UoKS5nZXRVUkkoKS5hcHBlbmRGcmFnbWVudChyZXNNZ3IuZ2V0R3VpZCgpKSk7Ci0JCQkvLyByZXR1cm4gcmVzTWdyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b0ZpbGVTdHJpbmcoRU9iamVjdCBlT2JqKSB7Ci0JCXJldHVybiBlT2JqLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKAotCQkJCWVPYmouZVJlc291cmNlKCkuZ2V0VVJJKCkpLnRvRmlsZVN0cmluZygpOwotCX0KLQotCXN0YXRpYyBib29sZWFuIGhhc093bkZvbGRlcihPYmplY3QgZSkgewotCQlyZXR1cm4gZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudDsKLQl9Ci0KLQlzdGF0aWMgYm9vbGVhbiBoYXNPd25SZXNvdXJjZShPYmplY3Qgb2JqLCBDb2xsZWN0aW9uIHNhdmVTZXBhcmF0ZWx5Q2xhc3NTZXQpIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFVuaXQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHNhdmVTZXBhcmF0ZWx5Q2xhc3NTZXQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2F2ZVNlcGFyYXRlbHlDbGFzc1NldC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVDbGFzcyBlQ2xzID0gKEVDbGFzcykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZUNscy5pc0luc3RhbmNlKG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZUZpbGVVUkkoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmIChlLmVDb250YWluZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBlLmVSZXNvdXJjZSgpKS5nZXRGaW5hbFVSSSgpOwotCi0JCS8vIEhhbmRsZSBQcm9jZXNzQ29tcG9uZW50IHNwZWNpYWxseS4gUHJvY2Vzc0NvbXBvbmVudCBvYmplY3RzIGFyZQotCQkvLyBzdG9yZWQgYXMgZm9sbG93aW5nIGluIHRoZSBtZXRob2QgbGlicmFyeToKLQkJLy8gPE1ldGhvZCBMaWJyYXJ5PgotCQkvLyB8XyA8TWV0aG9kIFBsdWdpbj4KLQkJLy8gfF9wcm9jZXNzZXMKLQkJLy8gfF9jYXBhYmlsaXR5X3BhdHRlcm5zCi0JCS8vIHxfZGVsaXZlcnlfcHJvY2Vzc2VzCi0JCS8vIHxfcHJvY2Vzc19jb250cmlidXRpb25zCi0JCS8vCi0JCWlmIChlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSAoTWV0aG9kTGlicmFyeSkgcGx1Z2luLmVDb250YWluZXIoKTsKLQkJCVN0cmluZyBwbHVnaW5EaXI7Ci0JCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbGliRGlyID0gbmV3IEZpbGUoKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGxpYgotCQkJCQkJLmVSZXNvdXJjZSgpKS5nZXRGaW5hbFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKTsKLQkJCQlwbHVnaW5EaXIgPSBsaWJEaXIgKyBGaWxlLnNlcGFyYXRvciArIHBsdWdpbi5nZXROYW1lKCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwbHVnaW4uZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCQkvLyBwbHVnaW4gaXMgYWxyZWFkeSBkZWxldGVkCi0JCQkJCS8vCi0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlwbHVnaW5EaXIgPSBuZXcgRmlsZSgoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcGx1Z2luCi0JCQkJCQkuZVJlc291cmNlKCkpLmdldEZpbmFsVVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCQkJfQotCQkJU3RyaW5nIHJlbGF0aXZlRGlyOwotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGUpCi0JCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJcmVsYXRpdmVEaXIgPSBDQVBBQklMSVRZX1BBVFRFUk5fUEFUSDsKLQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCXJlbGF0aXZlRGlyID0gREVMSVZFUllfUFJPQ0VTU19QQVRIOwotCQkJfSBlbHNlIHsKLQkJCQlyZWxhdGl2ZURpciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCVN0cmluZyBwYXRoID0gcGx1Z2luRGlyICsgRmlsZS5zZXBhcmF0b3IgKyByZWxhdGl2ZURpcgotCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgZS5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIERFRkFVTFRfTU9ERUxfRklMRU5BTUU7Ci0JCQlyZXR1cm4gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aCk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgewotCQkJU3RyaW5nIGRpciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWRpciA9IG5ldyBGaWxlKCgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBVbWFVdGlsCi0JCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudChlKS5lUmVzb3VyY2UoKSkuZ2V0RmluYWxVUkkoKQotCQkJCQkJLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJCXJldHVybiBVUkkuY3JlYXRlRmlsZVVSSShkaXIgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIERFRkFVTFRfQ09OVEVOVF9GSUxFTkFNRSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJVVJJIHVyaTsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZTsKLQkJCVN0cmluZyBwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRDb3JyZWN0UGF0aChjb250ZW50KTsKLQkJCWlmIChwYXRoID09IG51bGwpIHsKLQkJCQlTdHJpbmcgZGlyID0gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGUuZVJlc291cmNlKCkpCi0JCQkJCQkuZ2V0RmluYWxVUkkoKS50cmltU2VnbWVudHMoMSkudG9GaWxlU3RyaW5nKCkKLQkJCQkJCSsgRmlsZS5zZXBhcmF0b3I7Ci0JCQkJcGF0aCA9IE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0TmV4dEF2YWlsYWJsZUZpbGVOYW1lKGRpciwKLQkJCQkJCWNvbnRlbnQpOwotCQkJfQotCQkJdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aCk7Ci0JCQlyZXR1cm4gdXJpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlTdHJpbmcgZGlyID0gbmV3IFN0cmluZ0J1ZmZlcigoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZQotCQkJCQkuZUNvbnRhaW5lcigpLmVSZXNvdXJjZSgpKS5nZXRGaW5hbFVSSSgpLnRyaW1TZWdtZW50cygxKQotCQkJCQkudG9GaWxlU3RyaW5nKCkpLmFwcGVuZChGaWxlLnNlcGFyYXRvcikuYXBwZW5kKAotCQkJCQlNRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKQotCQkJCQkudG9TdHJpbmcoKTsKLQkJCVN0cmluZyBwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXROZXh0QXZhaWxhYmxlRmlsZU5hbWUoZGlyLAotCQkJCQlTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKGUuZ2V0TmFtZSgpKSwKLQkJCQkJKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlKTsKLQkJCXJldHVybiBVUkkuY3JlYXRlRmlsZVVSSShwYXRoKTsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlFT2JqZWN0IGxhc3RDb250YWluZXIgPSBudWxsOwotCQlmb3IgKE1ldGhvZEVsZW1lbnQgb2JqID0gKE1ldGhvZEVsZW1lbnQpIGUuZUNvbnRhaW5lcigpOyBvYmogIT0gbnVsbDsgb2JqID0gKE1ldGhvZEVsZW1lbnQpIG9iagotCQkJCS5lQ29udGFpbmVyKCkpIHsKLQkJCWxhc3RDb250YWluZXIgPSBvYmo7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCXBhdGguaW5zZXJ0KDAsIG5ldyBGaWxlKCgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBvYmoKLQkJCQkJCS5lUmVzb3VyY2UoKSkuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKSkKLQkJCQkJCS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQlwYXRoLmluc2VydCgwLCBvYmouZ2V0TmFtZSgpKS5pbnNlcnQoMCwgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJCX0KLQkJfQotCQlpZiAobGFzdENvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZS5lUmVzb3VyY2UoKSAhPSBudWxsID8gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGUKLQkJCQkJLmVSZXNvdXJjZSgpKS5nZXRGaW5hbFVSSSgpIDogbnVsbDsKLQkJfQotCQlpZiAoIShsYXN0Q29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCXBhdGguaW5zZXJ0KDAsIG5ldyBGaWxlKHRvRmlsZVN0cmluZyhsYXN0Q29udGFpbmVyKSkKLQkJCQkJLmdldFBhcmVudEZpbGUoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0KLQkJU3RyaW5nIG1vZGVsRmlsZU5hbWU7Ci0JCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQltb2RlbEZpbGVOYW1lID0gREVGQVVMVF9QTFVHSU5fTU9ERUxfRklMRU5BTUU7Ci0JCX0gZWxzZSB7Ci0JCQltb2RlbEZpbGVOYW1lID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9NT0RFTF9GSUxFTkFNRTsKLQkJfQotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aC50b1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkrIE11bHRpRmlsZVNhdmVVdGlsLmNyZWF0ZURpck5hbWUoZSkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgbW9kZWxGaWxlTmFtZSk7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlIGZpbGUpIHsKLQkJRmlsZVtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlkZWxldGUoZmlsZXNbaV0pOwotCQkJfQotCQl9Ci0JCWZpbGUuZGVsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gdXJpCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvdXRwdXQgb2YgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYWZ0ZXIgdGhpcyBjYWxsLgotCSAqLwotCXN0YXRpYyB2b2lkIHNldFVSSU1hcHBpbmcoRU9iamVjdCBlLCBVUkkgdXJpLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJTXVsdGlGaWxlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIGUKLQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJdXJpQ29udmVydGVyLnNldFVSSU1hcHBpbmcoZSwgdXJpLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvdXRwdXQgb2YgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYWZ0ZXIgdGhpcyBjYWxsCi0JICovCi0Jc3RhdGljIHZvaWQgdXBkYXRlVVJJTWFwcGluZ3MoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlLAotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCXVwZGF0ZVVSSU1hcHBpbmdzKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiByZXNvdXJjZVNldCBoYXMgdGhlIGxvYWRlZCByZXNvdXJjZSB3aXRoIHRoZSBnaXZlbgotCSAqIHVyaQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZVNldAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaGFzTG9hZGVkUmVzb3VyY2UoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSAmJiByZXNvdXJjZS5nZXRVUkkoKS5lcXVhbHModXJpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIFVSSU1hcHBpbmdzIHdpdGggdGhlIGZpbmFsIFVSSSBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlzdGF0aWMgdm9pZCB1cGRhdGVVUklNYXBwaW5ncyhNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UsCi0JCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMsIGJvb2xlYW4gYWZ0ZXJNb3ZlKSB7Ci0JCXVwZGF0ZVVSSU1hcHBpbmdzKHJlc291cmNlLCByZXNvdXJjZS5nZXRGaW5hbFVSSSgpLCBtb2RpZmllZFJlc291cmNlcywKLQkJCQlhZnRlck1vdmUpOwotCX0KLQotCXN0YXRpYyB2b2lkIHVwZGF0ZVVSSU1hcHBpbmdzKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSwgVVJJIHVyaSwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcywgYm9vbGVhbiBhZnRlck1vdmUpIHsKLQkJLy8gdGhlIHJlc291cmNlIFVSSSBoYXMgYmVlbiBjaGFuZ2VkLCByZXNldCBhbGwgdGhlIGNhY2hlZCByZXNvbHZlZCBVUkkKLQkJLy8gaW4gYWxsIG9mZnN0cmluZyByZXNvdXJjZSBkZXNjcmlwdG9ycwotCQkvLyBvZiBpdHMgbWFuYWdlciwgaWYgaXQgaGFzIG9uZS4KLQkJLy8KLQkJSGFzaE1hcCBvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcCA9IG51bGw7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCW9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc01nci5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXNvdXJjZURlc2NyaXB0b3IpIHsKLQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoKFJlc291cmNlRGVzY3JpcHRvcikgb2JqKTsKLQkJCQkJb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAucHV0KGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKSwKLQkJCQkJCQlkZXNjKTsKLQkJCQkJaWYgKGFmdGVyTW92ZSkgewotCQkJCQkJZGVzYy5jbGVhclJlc29sdmVkVVJJKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIXJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQkvLyBzZXRVUklNYXBwaW5nKGVsZW1lbnQsIHJlc291cmNlLmdldEZpbmFsVVJJKCksCi0JCQkvLyBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgcmVzb3VyY2UKLQkJCQkJLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQl1cmlDb252ZXJ0ZXIuc2V0VVJJTWFwcGluZyhlbGVtZW50LCB1cmksIG1vZGlmaWVkUmVzb3VyY2VzLAotCQkJCQlhZnRlck1vdmUpOwotCQl9Ci0KLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkvLyBzZXRVUklNYXBwaW5nKGVsZW1lbnQsIHJlc291cmNlLmdldFVSSSgpLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCS8vIH0KLQotCQlpZiAob2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgIT0gbnVsbCkgewotCQkJLy8gZ28gdGhydSB0aGUgbGlzdCBvZiBsb2FkZWQgcmVzb3VyY2VzIGluIHJlc291cmNlIHNldCB0byB1cGRhdGUKLQkJCS8vIHRoZSBVUkkKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAKLQkJCQkJCS5nZXQocmVzLmdldFVSSSgpKTsKLQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCWlmIChhZnRlck1vdmUpIHsKLQkJCQkJCXJlcy5zZXRVUkkoZGVzYy5nZXRSZXNvbHZlZFVSSSgpKTsKLQkJCQkJfSBlbHNlIGlmIChyZXMuaXNMb2FkZWQoKSkgewotCQkJCQkJZGVzYy5jbGVhclJlc29sdmVkVVJJKCk7Ci0JCQkJCQlyZXMuc2V0VVJJKGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzTWdyCi0JICogQHBhcmFtIG8KLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JLy8gcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRVcmkoUmVzb3VyY2VNYW5hZ2VyIHJlc01nciwgTWV0aG9kRWxlbWVudCBlLCBVUkkKLQkvLyB1cmkpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkvLyBpZihyZXNEZXNjLmdldElkKCkuZXF1YWxzKGUuZ2V0R3VpZCgpKSkgewotCS8vIC8vIGNoYW5nZSBvdGhlciBVUklzIHRoYXQgYXJlIGNoYW5nZWQgYXMgcmVzdWx0IG9mIHRoaXMgVVJJIGNoYW5nZQotCS8vIC8vCi0JLy8gaWYodXJpLmZyYWdtZW50KCkgPT0gbnVsbCkgewotCS8vIFVSSSBvbGREaXIgPSBVUkkuY3JlYXRlRmlsZVVSSShuZXcKLQkvLyBGaWxlKHJlc0Rlc2MuZ2V0UmVzb2x2ZWRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCkgKwotCS8vIEZpbGUuc2VwYXJhdG9yKTsKLQkvLyBVUkkgbmV3RGlyID0gVVJJLmNyZWF0ZUZpbGVVUkkobmV3IEZpbGUodXJpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKSArCi0JLy8gRmlsZS5zZXBhcmF0b3IpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlcmF0b3IKLQkvLyAuaGFzTmV4dCgpOykgewotCS8vIFJlc291cmNlRGVzY3JpcHRvciBlbGVtZW50ID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlcmF0b3IubmV4dCgpOwotCS8vIFVSSSBjdXJyZW50VXJpID0gZWxlbWVudC5nZXRSZXNvbHZlZFVSSSgpOwotCS8vIFVSSSBuZXdVcmkgPSBjdXJyZW50VXJpLnJlcGxhY2VQcmVmaXgob2xkRGlyLCBuZXdEaXIpOwotCS8vIGlmKG5ld1VyaSAhPSBudWxsKSB7Ci0JLy8gZWxlbWVudC5zZXRSZXNvbHZlZFVSSShuZXdVcmkpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJlc0Rlc2Muc2V0UmVzb2x2ZWRVUkkodXJpKTsKLQkvLyByZXR1cm47Ci0JLy8gfQotCS8vIH0KLQkvLyBSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9Ci0JLy8gUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0JLy8gcmVzRGVzYy5zZXRJZChlLmdldEd1aWQoKSk7Ci0JLy8gcmVzRGVzYy5zZXRSZXNvbHZlZFVSSSh1cmkpOwotCS8vIHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuYWRkKHJlc0Rlc2MpOwotCS8vIH0KLQkvKioKLQkgKiBHZXRzIHRoZSByaWdodCBSZXNvdXJjZU1hbmFnZXIgZm9yIHRoZSBnaXZlbiBFT2JqZWN0LCBjcmVhdGVzIG5ldwotCSAqIFJlc291cmNlTWFuYWdlciBpZiBpdCBkb2VzIG5vdCBleGlzdCB5ZXQuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvdXRwdXQgb2YgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYWZ0ZXIgdGhpcyBjYWxsLgotCSAqLwotCXN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyRm9yKEVPYmplY3QgZU9iaiwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVPYmouZUNvbnRhaW5lcigpICE9IG51bGwgPyBlT2JqLmVDb250YWluZXIoKQotCQkJCS5lUmVzb3VyY2UoKSA6IGVPYmouZVJlc291cmNlKCk7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCQlpZiAocmVzTWdyID09IG51bGwpIHsKLQkJCXJlc01nciA9IFJlc291cmNlbWFuYWdlckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlTWFuYWdlcigpOwotCi0JCQkvLyBhZGQgdG8gYmVnaW5uaW5nIG9mIHRoZSByZXNvdXJjZSdzIGNvbnRlbnRzCi0JCQkvLwotCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoMCwgcmVzTWdyKTsKLQotCQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQkJRU9iamVjdCBjb250YWluZXIgPSBnZXRDb250YWluZXJXaXRoRGlyZWN0UmVzb3VyY2UoKEludGVybmFsRU9iamVjdCkgZU9iaik7Ci0JCQlpZiAoY29udGFpbmVyICE9IG51bGwgJiYgY29udGFpbmVyLmVSZXNvdXJjZSgpICE9IHJlc291cmNlKSB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHBhcmVudFJlc01nciA9IGdldFJlc291cmNlTWFuYWdlckZvcihjb250YWluZXIsCi0JCQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJaWYgKHBhcmVudFJlc01nciAhPSBudWxsKSB7Ci0JCQkJCXBhcmVudFJlc01nci5nZXRTdWJNYW5hZ2VycygpLmFkZChyZXNNZ3IpOwotCQkJCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHBhcmVudFJlc01nci5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzTWdyOwotCi0JfQotCi0Jc3RhdGljIExpc3QgcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyRm9yKAotCQkJCVBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKSwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCUxpc3QgcmVzb3VyY2VEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHJlc01nciwKLQkJCQkJCWVsZW1lbnQsIHJlc291cmNlLmdldEZpbmFsVVJJKCkpOwotCQkJCWlmIChyZXNEZXNjICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VEZXNjcmlwdG9ycy5hZGQocmVzRGVzYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghcmVzb3VyY2VEZXNjcmlwdG9ycy5pc0VtcHR5KCkgJiYgbW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc01nci5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRGVzY3JpcHRvcnM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZURlc2NyaXB0b3IgcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKAotCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciwgT2JqZWN0IGVsZW1lbnQsIFVSSSB1cmkpIHsKLQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkKGVsZW1lbnQpOwotCQlpZiAocmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcihndWlkKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKHJlc01nciwgZ3VpZCwgdXJpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBDcmVhdGVzIGEgbmV3IFJlc291cmNlRGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgYW5kIGFkZCBpdAotCS8vIHRvIHRoZSBnaXZlbiBSZXNvdXJjZU1hbmFnZXIKLQkvLyAqCi0JLy8gKiBAcGFyYW0gZQotCS8vICogQHJldHVybiBuZXdseSBhZGRlZCBSZXNvdXJjZURlc2NyaXB0b3IKLQkvLyAqLwotCS8vIHByaXZhdGUgc3RhdGljIFJlc291cmNlRGVzY3JpcHRvcgotCS8vIGNyZWF0ZVJlc291cmNlRGVzY3JpcHRvcihSZXNvdXJjZU1hbmFnZXIgcmVzTWdyLCBNZXRob2RFbGVtZW50IGUpIHsKLQkvLyByZXR1cm4gY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKHJlc01nciwgZS5nZXRHdWlkKCksIGNyZWF0ZUZpbGVVUkkoZSkpOwotCS8vIH0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgUmVzb3VyY2VEZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuIGlkIGFuZCByZXNvbHZlZFVSSSwgdGhlbgotCSAqIGFkZHMgaXQgdG8gdGhlIGdpdmVuIHJlc01ncgotCSAqIAotCSAqIEBwYXJhbSByZXNNZ3IKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gcmVzb2x2ZWRVUkkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VEZXNjcmlwdG9yIGNyZWF0ZVJlc291cmNlRGVzY3JpcHRvcigKLQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IsIFN0cmluZyBpZCwgVVJJIHJlc29sdmVkVVJJKSB7Ci0JCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0JCXJlc0Rlc2Muc2V0SWQoaWQpOwotCQlyZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLmFkZChyZXNEZXNjKTsKLQkJcmVzRGVzYy5zZXRSZXNvbHZlZFVSSShyZXNvbHZlZFVSSSk7Ci0JCXJldHVybiByZXNEZXNjOwotCX0KLQotCS8vIHN0YXRpYyB2b2lkIHNldFVyaShNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyLCBNZXRob2RFbGVtZW50IGUsCi0JLy8gVVJJIHVyaSkgewotCS8vIHNldFVyaSh1cmlDb252ZXJ0ZXIsIGUsIHVyaSwgZmFsc2UpOwotCS8vIH0KLQotCS8vIHN0YXRpYyB2b2lkIHNldFVyaShNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyLCBNZXRob2RFbGVtZW50IGUsCi0JLy8gVVJJIHVyaSwgYm9vbGVhbiBzYXZlTm93KSB7Ci0JLy8gUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IHVyaUNvbnZlcnRlci5nZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQkvLyBpZihyZXNNZ3IgPT0gbnVsbCkgewotCS8vIHJlc01nciA9IFJlc291cmNlbWFuYWdlckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlTWFuYWdlcigpOwotCS8vIHVyaUNvbnZlcnRlci5zZXRSZXNvdXJjZU1hbmFnZXIocmVzTWdyKTsKLQkvLyB9Ci0JLy8gc2V0VXJpKHJlc01nciwgZSwgdXJpKTsKLQkvLyByZXNNZ3IuZVJlc291cmNlKCk7Ci0JLy8gfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0R3VpZChNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUuZ2V0R3VpZCgpID09IG51bGwgfHwgZS5nZXRHdWlkKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWUuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgaW4gaXRzIG93biBmaWxlIHdoaWxlIHN0aWxsIHByZXNlcnZpbmcgdGhlCi0JICogZXhpc3RpbmcgY29udGFpbm1lbnQgYXNzb2NpYXRpb24gaWYgdGhlcmUgaXMgYW55Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZShNZXRob2RFbGVtZW50IGUsIE1hcCBvcHRpb25zKSB0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIHsKLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZQotCQkJCS5lUmVzb3VyY2UoKTsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQl9Ci0JCUVPYmplY3QgY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7Ci0KLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJb3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VULAotCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJdHJ5IHsKLQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5jcmVhdGVGaWxlVVJJKGUpOwotCQkJYm9vbGVhbiBjcmVhdGVSZXNvdXJjZSA9IHJlc291cmNlID09IG51bGwKLQkJCQkJfHwgKGNvbnRhaW5lciAhPSBudWxsICYmIHJlc291cmNlID09IGNvbnRhaW5lci5lUmVzb3VyY2UoKSk7Ci0JCQlpZiAoY3JlYXRlUmVzb3VyY2UpIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKGUsIHVyaSwgb3B0aW9ucyk7Ci0JCQl9IGVsc2UgewotCQkJCVVSSSBvbGRVcmkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCQlpZiAoIW9sZFVyaS5lcXVhbHModXJpKSkgewotCi0JCQkJCS8vIHJlc291cmNlJ3MgbG9jYXRpb24gaXMgY2hhbmdlZC4KLQkJCQkJLy8gbW92ZSB0aGUgcmVzb3VyY2UsIHRoZW4gY2hhbmdlIGl0cyBVUkkgaWYgdGhlIHJlc291cmNlCi0JCQkJCS8vIG1vdmUgaXMgc3VjY2Vzc2Z1bC4KLQkJCQkJLy8gICAKLQkJCQkJaWYgKEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkubW92ZShvbGRVcmkudG9GaWxlU3RyaW5nKCksCi0JCQkJCQkJdXJpLnRvRmlsZVN0cmluZygpKSkgewotCQkJCQkJLy8gTXVsdGlGaWxlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9Ci0JCQkJCQkvLyAoTXVsdGlGaWxlVVJJQ29udmVydGVyKQotCQkJCQkJLy8gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQkJCS8vIE11bHRpRmlsZVNhdmVVdGlsLnNldFVyaSh1cmlDb252ZXJ0ZXIsIGUsIHVyaSk7Ci0JCQkJCQlyZXNvdXJjZS5zZXRVUkkodXJpKTsKLQkJCQkJCXVwZGF0ZVVSSU1hcHBpbmdzKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAocmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLnNhdmUocmVzb3VyY2UsIG9wdGlvbnMpOwotCQkJCX0KLQkJCX0KLQotCQkJcmVzb3VyY2VTZXQuc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKG9wdGlvbnMpOwotCQl9IGZpbmFsbHkgewotCi0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlKFJlc291cmNlU2V0IHJlc291cmNlU2V0LCBNZXRob2RFbGVtZW50IGUsCi0JCQlNYXAgb3B0aW9ucykgewotCQlVUkkgdXJpID0gY3JlYXRlRmlsZVVSSShlKTsKLQkJc2F2ZShyZXNvdXJjZVNldCwgZSwgdXJpLCBvcHRpb25zKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBhZGp1c3RMb2NhdGlvbihSZXNvdXJjZSByZXNvdXJjZSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVVJJIG5ld0ZpbGUgPSBjcmVhdGVGaWxlVVJJKGUpOwotCQlpZiAobmV3RmlsZSAhPSBudWxsICYmIGFkanVzdExvY2F0aW9uKHJlc291cmNlLCBuZXdGaWxlKSkgewotCQkJcmVzb3VyY2Uuc2V0VVJJKG5ld0ZpbGUpOwotCQkJdXBkYXRlVVJJTWFwcGluZ3MoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UsCi0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJfQotCX0KLQotCXN0YXRpYyBVUkkgZ2V0TmV3VVJJKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSkgewotCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCWlmIChlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVVSSSBuZXdGaWxlID0gY3JlYXRlRmlsZVVSSShlKTsKLQkJaWYgKG5ld0ZpbGUgIT0gbnVsbCAmJiBhZGp1c3RMb2NhdGlvblJlcXVpcmVkKHJlc291cmNlLCBuZXdGaWxlKSkgewotCQkJcmV0dXJuIG5ld0ZpbGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gcHJlcGFyZUFkanVzdExvY2F0aW9uKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlVUkkgbmV3RmlsZSA9IGdldE5ld1VSSShyZXNvdXJjZSk7Ci0JCWlmIChuZXdGaWxlICE9IG51bGwpIHsKLQkJCXJlc291cmNlLmJhY2tVcFVSSSgpOwotCQkJcmVzb3VyY2Uuc2V0RmluYWxVUkkobmV3RmlsZSk7Ci0JCQl1cGRhdGVVUklNYXBwaW5ncygoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSwKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMsIGZhbHNlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHdWlkKE9iamVjdCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0R3VpZCgpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBSZXNvdXJjZU1hbmFnZXIpIHsKLQkJCXJldHVybiAoKFJlc291cmNlTWFuYWdlcikgZSkuZ2V0R3VpZCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXN0YXRpYyBib29sZWFuIGFkanVzdExvY2F0aW9uUmVxdWlyZWQoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlLAotCQkJVVJJIG5ld1VSSSkgewotCQlGaWxlIG9sZEZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZS5nZXRGaW5hbFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUobmV3VVJJLnRvRmlsZVN0cmluZygpKTsKLQkJcmV0dXJuICFvbGRGaWxlLmVxdWFscyhuZXdGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHJlc291cmNlJ3MgVVJJIGhhcyBiZWVuIGNoYW5nZWQgYW5kIGFkanVzdCB0aGUgcmVzb3VyY2UncwotCSAqIGxvY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBvbGRVcmkKLQkgKiBAcGFyYW0gbmV3VXJpCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gYWRqdXN0TG9jYXRpb24oUmVzb3VyY2UgcmVzb3VyY2UsIFVSSSBuZXdVcmkpIHsKLQkJRmlsZSBvbGRGaWxlID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQlGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShuZXdVcmkudG9GaWxlU3RyaW5nKCkpOwotCQlpZiAob2xkRmlsZS5lcXVhbHMobmV3RmlsZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gbW92ZShyZXNvdXJjZSwgb2xkRmlsZSwgbmV3RmlsZSk7Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gbW92ZShSZXNvdXJjZSByZXNvdXJjZSwgRmlsZSBvbGRGaWxlLCBGaWxlIG5ld0ZpbGUpIHsKLQkJYm9vbGVhbiByZXQgPSB0cnVlOwotCQlpZiAob2xkRmlsZS5lcXVhbHMobmV3RmlsZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlPYmplY3Qgb2JqID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlpZiAoaGFzT3duRm9sZGVyKG9iaikpIHsKLQkJCVN0cmluZyBvbGREaXIgPSBvbGRGaWxlLmdldFBhcmVudEZpbGUoKS50b1N0cmluZygpOwotCQkJaWYgKCFvbGRGaWxlLmdldFBhcmVudEZpbGUoKS5lcXVhbHMobmV3RmlsZS5nZXRQYXJlbnRGaWxlKCkpKSB7Ci0JCQkJaWYgKEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVuYW1lKG9sZEZpbGUuZ2V0UGFyZW50RmlsZSgpLAotCQkJCQkJbmV3RmlsZS5nZXRQYXJlbnRGaWxlKCkpKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiRGlyZWN0b3J5ICciICsgb2xkRGlyICsgIicgaXMgc3VjY2Vzc2Z1bGx5IG1vdmVkIHRvICciICsgbmV3RmlsZS5nZXRQYXJlbnRGaWxlKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0ID0gZmFsc2U7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiQ291bGQgbm90IG1vdmUgZGlyZWN0b3J5ICciICsgb2xkRGlyICsgIicgdG8gJyIgKyBuZXdGaWxlLmdldFBhcmVudEZpbGUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW9sZEZpbGUuZ2V0TmFtZSgpLmVxdWFscyhuZXdGaWxlLmdldE5hbWUoKSkpIHsKLQkJCQlvbGRGaWxlID0gbmV3IEZpbGUobmV3RmlsZS5nZXRQYXJlbnRGaWxlKCksIG9sZEZpbGUuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW5hbWUob2xkRmlsZSwgbmV3RmlsZSkpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJGaWxlICciICsgb2xkRmlsZSArICInIGlzIHN1Y2Nlc3NmdWxseSBtb3ZlZCB0byAnIiArIG5ld0ZpbGUgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0ID0gZmFsc2U7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiQ291bGQgbm90IG1vdmUgZmlsZSAnIiArIG9sZEZpbGUgKyAiJyB0byAnIiArIG5ld0ZpbGUgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJldDsKLQkJfSBlbHNlIGlmIChvbGRGaWxlLmV4aXN0cygpKSAvKiBpZihvbGRGaWxlLmdldFBhcmVudEZpbGUoKS5lcXVhbHMobmV3RmlsZS5nZXRQYXJlbnRGaWxlKCkpKSAqL3sKLQkJCVN0cmluZyBvbGRGaWxlU3RyID0gb2xkRmlsZS50b1N0cmluZygpOwotCQkJaWYgKEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVuYW1lKG9sZEZpbGUsIG5ld0ZpbGUpKSB7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiRmlsZSAnIiArIG9sZEZpbGVTdHIgKyAiJyBpcyBzdWNjZXNzZnVsbHkgbW92ZWQgdG8gJyIgKyBuZXdGaWxlICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIkNvdWxkIG5vdCBtb3ZlIGZpbGUgJyIgKyBvbGRGaWxlU3RyICsgIicgdG8gJyIgKyBuZXdGaWxlICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXNNZ3IKLQkgKiBAcGFyYW0gZ3VpZAotCSAqIEBwYXJhbSBleGNsdWRlZFJlc01hbmFnZXJzCi0JICogICAgICAgICAgICBSZXNvdXJjZU1hbmFnZXIgdGhhdCBhcmUgZXhjbHVkZWQgZnJvbSB0aGlzIHNlYXJjaAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlRGVzY3JpcHRvciBmaW5kUmVzb3VyY2VEZXNjcmlwdG9yKAotCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciwgU3RyaW5nIGd1aWQsCi0JCQlDb2xsZWN0aW9uIGV4Y2x1ZGVkUmVzTWFuYWdlcnMsIGJvb2xlYW4gcmVzb2x2ZVByb3h5KSB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3IoZ3VpZCk7Ci0JCQlpZiAoZGVzYyAhPSBudWxsKQotCQkJCXJldHVybiBkZXNjOwotCQkJLy8gVE9ETzogKFBob25nKSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBuZWVkZWQgdG8gYXZvaWQgbG9hZGluZwotCQkJLy8gcmVzb3VyY2VzIGV4Y2Vzc2l2ZWx5Ci0JCQkvLwotCQkJSXRlcmF0b3IgaXRlcjsKLQkJCWlmIChyZXNvbHZlUHJveHkpIHsKLQkJCQlpdGVyID0gbmV3IEFycmF5TGlzdChyZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKSkuaXRlcmF0b3IoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaXRlciA9ICgoSW50ZXJuYWxFTGlzdCkgcmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkpCi0JCQkJCQkuYmFzaWNJdGVyYXRvcigpOwotCQkJfQotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIG1nciA9IChSZXNvdXJjZU1hbmFnZXIpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChtZ3IgIT0gbnVsbAotCQkJCQkJJiYgIW1nci5lSXNQcm94eSgpCi0JCQkJCQkmJiAoZXhjbHVkZWRSZXNNYW5hZ2VycyA9PSBudWxsIHx8ICFleGNsdWRlZFJlc01hbmFnZXJzCi0JCQkJCQkJCS5jb250YWlucyhtZ3IpKSkgewotCQkJCQlkZXNjID0gZmluZFJlc291cmNlRGVzY3JpcHRvcihtZ3IsIGd1aWQsCi0JCQkJCQkJZXhjbHVkZWRSZXNNYW5hZ2VycywgcmVzb2x2ZVByb3h5KTsKLQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBkZXNjOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVzTWdyCi0JICogQHJldHVybiBob3cgbWFueSBSZXNvdXJjZURlc2NyaXB0b3JzIGFyZSBpbiB0aGUgcmVzTWdyIGFuZCBpdHMKLQkgKiAgICAgICAgIFN1Yk1hbmFnZXJzCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Q291bnRSZXNvdXJjZURlc2NyaXB0b3JzKFJlc291cmNlTWFuYWdlciByZXNNZ3IpIHsKLQkJaW50IGNvdW50ID0gcmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5zaXplKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc01nci5nZXRTdWJNYW5hZ2VycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2VNYW5hZ2VyIG1nciA9IChSZXNvdXJjZU1hbmFnZXIpIGl0ZXIubmV4dCgpOwotCQkJY291bnQgKz0gZ2V0Q291bnRSZXNvdXJjZURlc2NyaXB0b3JzKG1ncik7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlc291cmNlIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiByZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlRGVzY3JpcHRvciBnZXRSZXNvdXJjZURlc2NyaXB0b3IoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJUmVzb3VyY2VNYW5hZ2VyIGNvbnRhaW5lclJlc01nciA9IG51bGw7Ci0JCU1ldGhvZEVsZW1lbnQgbWUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCQkJCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IHJlc01ncgotCQkJCQkJCS5nZXRSZXNvdXJjZURlc2NyaXB0b3IoKChNZXRob2RFbGVtZW50KSBlbGVtZW50KQotCQkJCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJCS8vIGhhY2sgdG8gYWRkIG1pc3NpbmcgUmVzb3VyY2VEZXNjcmlwdG9yIGZvciBsaWJyYXJ5J3MKLQkJCQkJLy8gcmVzb3VyY2UKLQkJCQkJLy8KLQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJZGVzYyA9IHJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihyZXNNZ3IsIGVsZW1lbnQsCi0JCQkJCQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSkKLQkJCQkJCQkJCQkuZ2V0RmluYWxVUkkoKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGRlc2M7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1lID09IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQltZSA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50OwotCQkJfQotCQkJaWYgKGNvbnRhaW5lclJlc01nciA9PSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lcldpdGhEaXJlY3RSZXNvdXJjZSgoSW50ZXJuYWxFT2JqZWN0KSBlbGVtZW50KTsKLQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJY29udGFpbmVyUmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKGNvbnRhaW5lci5lUmVzb3VyY2UoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1lICE9IG51bGwgJiYgY29udGFpbmVyUmVzTWdyICE9IG51bGwpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmKG1lICE9IG51bGwpIHsKLQkJCWlmIChjb250YWluZXJSZXNNZ3IgIT0gbnVsbCkgewotCQkJCXJldHVybiBjb250YWluZXJSZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCgoTWV0aG9kRWxlbWVudCkgbWUpCi0JCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYobWUuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkvLyB0aGlzIGVsZW1lbnQgaGFzIGJlZW4gbG9hZGVkIGJlZm9yZSBpdHMgY29udGFpbmVyCi0JCQkJLy8gdHJ5IHRvIGZpbmQgaXRzIHJlc291cmNlIGRlc2NyaXB0b3IgdXNpbmcgcm9vdCByZXNvdXJjZSBtYW5hZ2VyCi0JCQkJLy8KLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCQkJUmVzb3VyY2VNYW5hZ2VyIHJvb3RSZXNNZ3IgPSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbClyZXNvdXJjZVNldCkuZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpOwotCQkJCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHJvb3RSZXNNZ3IpIHsKLQotCQkJCQkJLyoqCi0JCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkJICovCi0JCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBSZXNvdXJjZU1hbmFnZXIpIHsKLQkJCQkJCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gKFJlc291cmNlTWFuYWdlcilvYmplY3Q7IAotCQkJCQkJCQljaGlsZHJlbi5hZGRBbGwocmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcnMoKSk7Ci0JCQkJCQkJCWNoaWxkcmVuLmFkZEFsbChyZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKSk7Ci0JCQkJCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX07Ci0JCQkJCVVSSSB1cmkgPSBnZXRGaW5hbFVSSShyZXNvdXJjZSk7Ci0JCQkJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYobyBpbnN0YW5jZW9mIFJlc291cmNlRGVzY3JpcHRvcikgewotCQkJCQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgbzsKLQkJCQkJCQlpZih1cmkuZXF1YWxzKHJlc0Rlc2MuZ2V0UmVzb2x2ZWRVUkkoKSkpIHsKLQkJCQkJCQkJcmV0dXJuIHJlc0Rlc2M7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VEZXNjcmlwdG9yIGZpbmRSZXNvdXJjZURlc2NyaXB0b3IoTWV0aG9kRWxlbWVudCBlKQotCS8vIHsKLQkvLyBSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gbnVsbDsKLQkvLyBpZihlLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkvLyByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIoZS5lUmVzb3VyY2UoKSk7Ci0JLy8gfQotCS8vIFJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gbnVsbDsKLQkvLyBDb2xsZWN0aW9uIGV4Y2x1ZGVkUmVzTWdycyA9IG51bGw7Ci0JLy8gaWYocmVzTWdyICE9IG51bGwpIHsKLQkvLyBkZXNjID0gZmluZFJlc291cmNlRGVzY3JpcHRvcihyZXNNZ3IsIGUuZ2V0R3VpZCgpKTsKLQkvLyBpZihkZXNjICE9IG51bGwpIHJldHVybiBkZXNjOwotCS8vIGV4Y2x1ZGVkUmVzTWdycyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVzTWdyKTsKLQkvLyB9Ci0JLy8JCQotCS8vIE1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KGUpOwotCS8vIHJlc01nciA9IGdldFJlc291cmNlTWFuYWdlcihsaWIuZVJlc291cmNlKCkpOwotCS8vCQkKLQkvLyByZXR1cm4gZmluZFJlc291cmNlRGVzY3JpcHRvcihyZXNNZ3IsIGUuZ2V0R3VpZCgpLCBleGNsdWRlZFJlc01ncnMpOwotCS8vIH0KLQotCS8qKgotCSAqIEdldHMgdGhlIFJlc291cmNlTWFuYWdlciBpbiB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIHJlc291cmNlCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlcihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlc291cmNlTWFuYWdlcikgewotCQkJCXJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIGVsZW1lbnQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzTWdyOwotCX0KLQotCXN0YXRpYyBJbnRlcm5hbEVPYmplY3QgZ2V0Q29udGFpbmVyV2l0aERpcmVjdFJlc291cmNlKEludGVybmFsRU9iamVjdCBvYmopIHsKLQkJaWYgKG9iai5lQ29udGFpbmVyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJbnRlcm5hbEVPYmplY3QgY29udGFpbmVyID0gKEludGVybmFsRU9iamVjdCkgKChJbnRlcm5hbEVPYmplY3QpIG9iagotCQkJCS5lQ29udGFpbmVyKCkpOwotCQlpZiAoY29udGFpbmVyLmVEaXJlY3RSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250YWluZXI7Ci0JCX0KLQkJcmV0dXJuIGdldENvbnRhaW5lcldpdGhEaXJlY3RSZXNvdXJjZShjb250YWluZXIpOwotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0SFJFRihSZXNvdXJjZSByZXNvdXJjZSwgT2JqZWN0IG9iaikgewotCQlNZXRob2RFbGVtZW50IG93bmVyID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlyZXR1cm4gTXVsdGlGaWxlVVJJQ29udmVydGVyLmNyZWF0ZVVSSShvd25lci5nZXRHdWlkKCkpLmFwcGVuZEZyYWdtZW50KAotCQkJCWdldEd1aWQob2JqKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYWNrdXBGaWxlU3VmZml4KCkgewotCQlyZXR1cm4gIl8iICsgZGF0ZUZvcm1hdHRlci5mb3JtYXQoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgcHJveHkgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gPGNvZGU+Z3VpZDwvY29kZT4gd2l0aG91dAotCSAqIGxvYWRpbmcgYWxsIG90aGVyIHByb3hpZXMgaW4gPGNvZGU+cGFyZW50PC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBndWlkCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZVByb3hpZXMoQ29sbGVjdGlvbiBHVUlEcywgRU9iamVjdCBwYXJlbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBhcmVudC5lQ2xhc3MoKS5nZXRFQWxsQ29udGFpbm1lbnRzKCkKLQkJCQkuaXRlcmF0b3IoKTsgIUdVSURzLmlzRW1wdHkoKSAmJiBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJSW50ZXJuYWxFTGlzdCBsaXN0ID0gKEludGVybmFsRUxpc3QpIHBhcmVudC5lR2V0KGZlYXR1cmUpOwotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGxpc3QuYmFzaWNJdGVyYXRvcigpOyAhR1VJRHMuaXNFbXB0eSgpCi0JCQkJCQkmJiBpdGVyMS5oYXNOZXh0KCk7IGluZGV4KyspIHsKLQkJCQkJSW50ZXJuYWxFT2JqZWN0IGNoaWxkID0gKEludGVybmFsRU9iamVjdCkgaXRlcjEubmV4dCgpOwotCQkJCQlpZiAoY2hpbGQuZUlzUHJveHkoKSkgewotCQkJCQkJU3RyaW5nIGd1aWQgPSBjaGlsZC5lUHJveHlVUkkoKS5mcmFnbWVudCgpOwotCQkJCQkJaWYgKEdVSURzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJCQkJLy8gdGhpcyB3aWxsIHJlc29sdmUgdGhlIG9iamVjdCB3aXRoIGd1aWQKLQkJCQkJCQkvLwotCQkJCQkJCWxpc3QuZ2V0KGluZGV4KTsKLQkJCQkJCQlHVUlEcy5yZW1vdmUoZ3VpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXNvbHZlUHJveGllcyhHVUlEcywgY2hpbGQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgY2hpbGQgPSAoSW50ZXJuYWxFT2JqZWN0KSBwYXJlbnQuZUdldChmZWF0dXJlLAotCQkJCQkJZmFsc2UpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCWlmIChjaGlsZC5lSXNQcm94eSgpKSB7Ci0JCQkJCQlTdHJpbmcgZ3VpZCA9IGNoaWxkLmVQcm94eVVSSSgpLmZyYWdtZW50KCk7Ci0JCQkJCQlpZiAoR1VJRHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQkJCQkvLyB0aGlzIHdpbGwgcmVzb2x2ZSB0aGUgb2JqZWN0IHdpdGggZ3VpZAotCQkJCQkJCS8vCi0JCQkJCQkJcGFyZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQkJCQkJR1VJRHMucmVtb3ZlKGd1aWQpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzb2x2ZVByb3hpZXMoR1VJRHMsIGNoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIGdldEZpbmFsVVJJKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiByZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCA/ICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSkKLQkJCQkuZ2V0RmluYWxVUkkoKQotCQkJCTogcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGltcGwKLQkgKiBAcmV0dXJuCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gYWRqdXN0TG9jYXRpb25SZXF1aXJlZChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwkJCi0JCWlmKGUgIT0gbnVsbCAmJiBoYXNPd25Gb2xkZXIoZSkpIHsKLQkJCVVSSSBuZXdVUkkgPSBjcmVhdGVGaWxlVVJJKGUpOwotCQkJaWYoYWRqdXN0TG9jYXRpb25SZXF1aXJlZChyZXNvdXJjZSwgbmV3VVJJKSAmJiAhbmV3IEZpbGUobmV3VVJJLnRvRmlsZVN0cmluZygpKS5leGlzdHMoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBpcyBjdXJyZW50bHkgc3luY2hyb25pemVkIHdpdGggaXRzIGRhdGEgc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIDxsaT4gLTEgZG9uJ3Qga25vdwotCSAqICAgICAgICAgPGxpPiAwIG5vCi0JICogICAgICAgICA8bGk+IDEgeWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY2hlY2tTeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCXJldHVybiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkuY2hlY2tTeW5jaHJvbml6ZWQoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogU29tZSB0ZWFtIHByb3ZpZGVycyBjaGFuZ2VkIHRoZSB0aW1lc3RhbXAgb2YgbGFzdCBmaWxlIG1vZGlmaWNhdGlvbiBieSByZW1vdmluZyBzZWNvbmQgZnJhY3Rpb24KLQkgKiBldmVuIHRoZSBmaWxlIHdhcyBub3QgY2hhbmdlZC4gVGhpcyBtZXRob2QgY2hlY2sgdGhlIGN1cnJlbnQgYW5kIG9sZCB0aW1lIHN0YW1wcyBmb3IgdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gY3VycmVudFRpbWVTdGFtcAotCSAqIEBwYXJhbSBsYXN0VGltZVN0YW1wCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYW1lKGxvbmcgY3VycmVudFRpbWVTdGFtcCwgbG9uZyBsYXN0VGltZVN0YW1wKSB7Ci0JCXJldHVybiBjdXJyZW50VGltZVN0YW1wIDwgbGFzdFRpbWVTdGFtcCAmJiAoY3VycmVudFRpbWVTdGFtcCAmIDcpID09IDAgJiYgKGxhc3RUaW1lU3RhbXAgLSBjdXJyZW50VGltZVN0YW1wKSA8IDEwMDA7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhbiBlbXB0eSByZXNvdXJjZSBtYW5hZ2VyIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UgaWYgaXQgZG9lcyBub3QgaGF2ZSBvbmUuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiB0cnVlIGlmIGEgbmV3IHJlc291cmNlIG1hbmFnZXIgaXMgYWRkZWQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgYWRkUmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCQlpZiAocmVzTWdyID09IG51bGwpIHsKLQkJCXJlc01nciA9IFJlc291cmNlbWFuYWdlckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlTWFuYWdlcigpOwotCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoMCwgcmVzTWdyKTsKLQkJCXJldHVybiByZXNNZ3I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXN0YXRpYyB2b2lkIGNoZWNrRmlsZVBhdGhMZW5ndGgoQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJTGlzdDxTdHJpbmc+IHBhdGhMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsICYmICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKXJlc291cmNlKS5oYXNUZW1wVVJJKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXBhdGhMaXN0LmFkZChyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0KLQkJCi0JCWlmKCFwYXRoTGlzdC5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZ1tdIHBhdGhzID0gbmV3IFN0cmluZ1twYXRoTGlzdC5zaXplKCldOwotCQkJcGF0aExpc3QudG9BcnJheShwYXRocyk7Ci0KLQkJCWZvciAoaW50IGk9MDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHBhdGggPSBwYXRoc1tpXTsKLQkJCQlpZiAocGF0aHNbaV0ubGVuZ3RoKCkgPiAyNTUpIHsKLQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmZpbGVQYXRoTmFtZVRvb0xvbmdfbXNnLCBBcnJheXMKLQkJCQkJCQkJLmFzTGlzdChwYXRocykpOwotCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24obXNnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVVSSUNvbnZlcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVVSSUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZWY0MjkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVVUklDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVVJJIGNvbnZlcnRlciB0aGF0IGNvbnZlcnRzIGEgZmlsZS1iYXNlZCBVUkkgdG8gYSBVTUEtYmFzZWQgVVJJIGFuZCB2aWNlCi0gKiB2ZXJzYSB1c2luZyB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gUmVzb3VyY2VEZXNjcmlwdG9ycyBvZgotICogUmVzb3VyY2VNYW5hZ2VyLiBBIFVNQS1iYXNlZCBVUkkgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotICogdW1hOi8vR1VJRDEjR1VJRDIgd2hlcmUgR1VJRDEgaXMgdGhlIEdVSUQgb2YgdGhlIGZpbGUgYW5kIEdVSUQyIGlzIHRoZQotICogb2JqZWN0J3MgR1VJRC4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIgZXh0ZW5kcyBVUklDb252ZXJ0ZXJJbXBsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRSA9ICJ1bWEiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0IGxvY2tlZEdVSURzID0gbmV3IEhhc2hTZXQoKTsKLQotCXByb3RlY3RlZCBSZXNvdXJjZU1hbmFnZXIgcmVzTWdyOwotCi0JcHJpdmF0ZSBVUkkgbGlicmFyeVVSSTsKLQotCXByaXZhdGUgVVJJIGxpYnJhcnlVbWFVUkk7Ci0KLQlwcml2YXRlIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldDsKLQotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlUHJveHk7Ci0KLQlwdWJsaWMgTXVsdGlGaWxlVVJJQ29udmVydGVyKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCkgewotCQl0aGlzLnJlc291cmNlU2V0ID0gcmVzb3VyY2VTZXQ7Ci0JfQotCi0Jdm9pZCBzZXRSZXNvbHZlUHJveHkoYm9vbGVhbiByZXNvbHZlUHJveHkpIHsKLQkJdGhpcy5yZXNvbHZlUHJveHkgPSByZXNvbHZlUHJveHk7Ci0JfQotCi0Jdm9pZCBzZXRMaWJyYXJ5VVJJcyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJbGlicmFyeVVSSSA9IGxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCWxpYnJhcnlVbWFVUkkgPSBVUkkuY3JlYXRlVVJJKG5ldyBTdHJpbmdCdWZmZXIoU0NIRU1FKQotCQkJCS5hcHBlbmQoIjovLyIpLmFwcGVuZChsaWJyYXJ5LmdldEd1aWQoKSkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvY2tHVUlEKFN0cmluZyBndWlkKSB7Ci0JCXN5bmNocm9uaXplZCAobG9ja2VkR1VJRHMpIHsKLQkJCWxvY2tlZEdVSURzLmFkZChndWlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMb2NrZWRHVUlEKFN0cmluZyBndWlkKSB7Ci0JCXN5bmNocm9uaXplZCAobG9ja2VkR1VJRHMpIHsKLQkJCXJldHVybiBsb2NrZWRHVUlEcy5jb250YWlucyhndWlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdW5sb2NrR1VJRChTdHJpbmcgZ3VpZCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2tlZEdVSURzKSB7Ci0JCQlyZXR1cm4gbG9ja2VkR1VJRHMucmVtb3ZlKGd1aWQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsI25vcm1hbGl6ZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBVUkkgbm9ybWFsaXplKFVSSSB1cmkpIHsKLQkJcmV0dXJuIG5vcm1hbGl6ZSh1cmksIG51bGwpOwotCX0KLQotCXB1YmxpYyBVUkkgbm9ybWFsaXplKFVSSSB1cmksIEVPYmplY3QgcmVzb2x2ZXIpIHsKLQkJaWYgKFNDSEVNRS5lcXVhbHNJZ25vcmVDYXNlKHVyaS5zY2hlbWUoKSkpIHsKLQkJCVN0cmluZyBndWlkID0gdXJpLmF1dGhvcml0eSgpOwotCQkJaWYgKGlzTG9ja2VkR1VJRChndWlkKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlsb2NrR1VJRChndWlkKTsKLQotCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gbnVsbDsKLQkJCQlIYXNoU2V0IGV4Y2x1ZGVkUmVzTWFuYWdlcnMgPSBudWxsOwotCQkJCWlmIChyZXNvbHZlciAhPSBudWxsICYmIHJlc29sdmVyLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJLmdldFJlc291cmNlTWFuYWdlcihyZXNvbHZlci5lUmVzb3VyY2UoKSk7Ci0JCQkJCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJCQkJZGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsLmZpbmRSZXNvdXJjZURlc2NyaXB0b3IocmVzTWdyLAotCQkJCQkJCQlndWlkLCBudWxsLCByZXNvbHZlUHJveHkpOwotCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCS8vIGFkZCB0aGlzIFJlc291cmNlTWFuYWdlciBhbmQgaXRzIHN1Ym1hbmFnZXJzIHRvCi0JCQkJCQkJLy8gZXhjbHVkZWRSZXNNYW5hZ2VycwotCQkJCQkJCS8vIHNvIHRoZSBuZXh0IHNlYXJjaCBmb3IgUmVzb3VyY2VEZXNjcmlwdG9yIHdpbGwKLQkJCQkJCQkvLyBpZ25vcmUgdGhlbQotCQkJCQkJCS8vCi0JCQkJCQkJZXhjbHVkZWRSZXNNYW5hZ2VycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJCQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihyZXNNZ3IpIHsKLQotCQkJCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJCQkJcmV0dXJuICgoUmVzb3VyY2VNYW5hZ2VyKSBvYmplY3QpCi0JCQkJCQkJCQkJCS5nZXRTdWJNYW5hZ2VycygpLml0ZXJhdG9yKCk7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCX07Ci0JCQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCWV4Y2x1ZGVkUmVzTWFuYWdlcnMuYWRkKGl0ZXIubmV4dCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRlc2MgPT0gbnVsbCAmJiBnZXRSZXNvdXJjZU1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQkJCWRlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbC5maW5kUmVzb3VyY2VEZXNjcmlwdG9yKAotCQkJCQkJCWdldFJlc291cmNlTWFuYWdlcigpLCBndWlkLCBleGNsdWRlZFJlc01hbmFnZXJzLAotCQkJCQkJCXJlc29sdmVQcm94eSk7Ci0JCQkJfQotCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJVVJJIG5vcm1hbGl6ZWQgPSBkZXNjLmdldFJlc29sdmVkVVJJKCk7Ci0KLQkJCQkJLy8gY2hlY2sgaWYgdGhlIHJlc291cmNlIHdpdGggdGhpcyBub3JtYWxpemVkIFVSSSBoYXMKLQkJCQkJLy8gdGVtcG9yYXJ5IFVSSQotCQkJCQkvLwotCQkJCQlVUkkgdGVtcFVSSSA9IChVUkkpIHJlc291cmNlU2V0LmdldFVSSVRvVGVtcFVSSU1hcCgpLmdldCgKLQkJCQkJCQlub3JtYWxpemVkKTsKLQkJCQkJaWYgKHRlbXBVUkkgIT0gbnVsbCkgewotCQkJCQkJbm9ybWFsaXplZCA9IHRlbXBVUkk7Ci0JCQkJCX0KLQotCQkJCQlpZiAodXJpLmhhc0ZyYWdtZW50KCkpIHsKLQkJCQkJCW5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLmFwcGVuZEZyYWdtZW50KHVyaS5mcmFnbWVudCgpKTsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBub3JtYWxpemVkOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdW5sb2NrR1VJRChndWlkKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5ub3JtYWxpemUodXJpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGwjY3JlYXRlSW5wdXRTdHJlYW0ob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW0oVVJJIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHVyaSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVJbnB1dFN0cmVhbSh1cmkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVVSSShTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShuZXcgU3RyaW5nQnVmZmVyKFNDSEVNRSkKLQkJCQkuYXBwZW5kKCI6Ly8iKS5hcHBlbmQoZ3VpZCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUkkoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKGNyZWF0ZVVyaVN0cmluZyhlKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlVXJpU3RyaW5nKE9iamVjdCBlKSB7Ci0JCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgZTsKLQotCQlVUkkgb2JqZWN0VVJJID0gby5lUHJveHlVUkkoKTsKLQkJaWYgKG9iamVjdFVSSSAhPSBudWxsICYmIFNDSEVNRS5lcXVhbHMob2JqZWN0VVJJLnNjaGVtZSgpKSkgewotCQkJcmV0dXJuIG9iamVjdFVSSS50b1N0cmluZygpOwotCQl9Ci0KLQkJU3RyaW5nIGd1aWQgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKGUpOwotCQlpZiAoZ3VpZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcihTQ0hFTUUpLmFwcGVuZCgiOi8vIikuYXBwZW5kKGd1aWQpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBwdWJsaWMgVVJJIHRvVW1hVXJpKFVSSSB1cmkpIHsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpRmlsZVVSSUNvbnZlcnRlci50b1VtYVVyaSgpOiB1cmk9Iit1cmkpOwotCS8vIGlmKHVyaS5zY2hlbWUoKS5lcXVhbHMoInVtYSIpIHx8IHVyaURlc2NNYXAgPT0gbnVsbCkgcmV0dXJuIHVyaTsKLQkvLyBpZihsaWJyYXJ5VVJJLmVxdWFscyh1cmkpKSByZXR1cm4gbGlicmFyeVVtYVVSSTsKLQkvLyBSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpCi0JLy8gdXJpRGVzY01hcC5nZXQodXJpLnRyaW1GcmFnbWVudCgpLnRvU3RyaW5nKCkpOwotCS8vIHJldHVybiBkZXNjID09IG51bGwgPyB1cmkgOiBVUkkuY3JlYXRlVVJJKCJ1bWE6Ly8iICsKLQkvLyBkZXNjLmdldElkKCkpLmFwcGVuZEZyYWdtZW50KHVyaS5mcmFnbWVudCgpKTsKLQkvLyB9Ci0KLQkvLyBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU1hbmFnZXIoUmVzb3VyY2VNYW5hZ2VyIHJlc01ncikgewotCS8vIHRoaXMucmVzTWdyID0gcmVzTWdyOwotCS8vIH0KLQotCXB1YmxpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgewotCQlpZiAocmVzTWdyID09IG51bGwpIHsKLQkJCXJlc01nciA9IHJlc291cmNlU2V0LmdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gcmVzTWdyOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIFJlc291cmNlRGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIEdVSUQgZnJvbSByb290IFJlc291cmNlTWFuYWdlcgotCSAqIAotCSAqIEBwYXJhbSBndWlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZURlc2NyaXB0b3IgZmluZFJlc291cmNlRGVzY3JpcHRvcihTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuZmluZFJlc291cmNlRGVzY3JpcHRvcihnZXRSZXNvdXJjZU1hbmFnZXIoKSwKLQkJCQlndWlkLCBudWxsLCByZXNvbHZlUHJveHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJcmVzTWdyLmRpc3Bvc2UoKTsKLQkJCXJlc01nciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcGFyYW0gbW9kaWZpZWRSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIG91dHB1dCBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBhZnRlciB0aGlzIGNhbGwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VVJJTWFwcGluZyhFT2JqZWN0IGUsIFVSSSB1cmksIFNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlzZXRVUklNYXBwaW5nKGUsIHVyaSwgbW9kaWZpZWRSZXNvdXJjZXMsIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVSSU1hcHBpbmcoRU9iamVjdCBlLCBVUkkgdXJpLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMsCi0JCQlib29sZWFuIGFmdGVyTW92ZSkgewotCQlTdHJpbmcgZ3VpZCA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQoZSk7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXJGb3IoZSwKLQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gcmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcihndWlkKTsKLQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJaWYgKGFmdGVyTW92ZSkgewotCQkJCXJlc0Rlc2Muc2V0UmVzb2x2ZWRVUkkodXJpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gcHJlc2VydmUgdGhlIGN1cnJlbnQgcmVzb2x2ZWQgVVJJCi0JCQkJcmVzRGVzYy5nZXRSZXNvbHZlZFVSSSgpOwotCQkJCS8vIHNldCBuZXcgVVJJIHN0cmluZyBmb3IgdGhlIHVwY29taW5nIG1vdmUKLQkJCQlyZXNEZXNjLnNldFVyaSh1cmkuZGVyZXNvbHZlKAotCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkocmVzRGVzYy5lUmVzb3VyY2UoKSkpCi0JCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBmaW5kIHRoZSBSZXNvdXJjZURlc2NyaXB0b3IgaW4gb3RoZXIgUmVzb3VyY2VNYW5hZ2VycwotCQkJLy8KLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGUKLQkJCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gcmVzb3VyY2VTZXQuZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpOwotCQkJcmVzRGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsLmZpbmRSZXNvdXJjZURlc2NyaXB0b3IobGliUmVzTWdyLCBndWlkLAotCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJlc01nciksIHJlc29sdmVQcm94eSk7Ci0JCQlpZiAocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJLy8gUmVzb3VyY2VEZXNjcmlwdG9yIGFscmVhZHkgZXhpc3RzCi0JCQkJLy8gY2hhbmdlIGl0cyB1cmksIG1vdmUgaXQgYW5kIGl0cyBzdWIgbWFuYWdlciwgaWYgdGhlcmUgaXMgYW55LAotCQkJCS8vIHRvIG5ldyBSZXNvdXJjZU1hbmFnZXIKLQkJCQkvLwotCi0JCQkJLy8gZmluZCBzdWIgbWFuYWdlcgotCQkJCVJlc291cmNlTWFuYWdlciBjdXJyZW50UmVzTWdyID0gKFJlc291cmNlTWFuYWdlcikgcmVzRGVzYwotCQkJCQkJLmVDb250YWluZXIoKTsKLQkJCQlSZXNvdXJjZU1hbmFnZXIgc3ViTWdyID0gbnVsbDsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjdXJyZW50UmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2VNYW5hZ2VyIG1nciA9IChSZXNvdXJjZU1hbmFnZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlVUkkgbWdyVVJJID0gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIG1nci5lUmVzb3VyY2UoKSkKLQkJCQkJCQkuZ2V0RmluYWxVUkkoKTsKLQkJCQkJaWYgKG1nclVSSS5lcXVhbHModXJpKSkgewotCQkJCQkJc3ViTWdyID0gbWdyOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBtb3ZlIFJlc291cmNlRGVzY3JpcHRvcgotCQkJCXJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuYWRkKHJlc0Rlc2MpOwotCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjdXJyZW50UmVzTWdyLmVSZXNvdXJjZSgpKTsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc01nci5lUmVzb3VyY2UoKSk7Ci0JCQkJfQotCi0JCQkJLy8gbW92ZSBzdWIgUmVzb3VyY2VNYW5hZ2VyCi0JCQkJaWYgKHN1Yk1nciAhPSBudWxsKSB7Ci0JCQkJCXJlc01nci5nZXRTdWJNYW5hZ2VycygpLmFkZChzdWJNZ3IpOwotCQkJCX0KLQotCQkJCS8vIHNldCBuZXcgVVJJCi0JCQkJaWYgKGFmdGVyTW92ZSkgewotCQkJCQlyZXNEZXNjLnNldFJlc29sdmVkVVJJKHVyaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gcHJlc2VydmUgdGhlIGN1cnJlbnQgcmVzb2x2ZWQgVVJJCi0JCQkJCXJlc0Rlc2MuZ2V0UmVzb2x2ZWRVUkkoKTsKLQkJCQkJLy8gc2V0IG5ldyBVUkkgc3RyaW5nIGZvciB0aGUgdXBjb21pbmcgbW92ZQotCQkJCQlyZXNEZXNjLnNldFVyaSh1cmkuZGVyZXNvbHZlKHJlc0Rlc2MuZVJlc291cmNlKCkuZ2V0VVJJKCkpCi0JCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc0Rlc2MuZVJlc291cmNlKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5yZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIocmVzTWdyLCBlLCB1cmkpOwotCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKQotCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzTWdyLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVVJJIHVyaSA9IFVSSQotCQkJCS5jcmVhdGVVUkkoInVtYTovL19MUHpkQUdaN0VkbUFtX3hTWDJFZFVBIy8vQGJyZWFrZG93bkVsZW1lbnRzLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odXJpKTsKLQkJU3lzdGVtLm91dAotCQkJCS5wcmludGxuKCJkZXJlc29sdmVkIFVSSTogIiArIHVyaS5kZXJlc29sdmUoVVJJLmNyZWF0ZVVSSSgidW1hOi8vX0xQemRBR1o3RWRtQW1feFNYMkVkVUEiKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JSGVscGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSUhlbHBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU4NWNiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JSGVscGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotCi0vKioKLSAqIFhNTEhlbHBlciBpbXBsZW1lbnRhdGlvbiBmb3IgbGlicmFyeSBYTUkgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE11bHRpRmlsZVhNSUhlbHBlckltcGwgZXh0ZW5kcyBYTUlIZWxwZXJJbXBsIHsKLQotCS8qKgotCSAqIFBsYXRmb3JtLXNwZWNpZmljIGxpbmUgc2VwYXJhdG9yLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbG9nRXJyb3IgPSB0cnVlOwotCi0JcHJvdGVjdGVkIExpc3Qgc2FtZURvY1JlZmVyZW5jZXM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlzY2FyZFVucmVzb2x2ZWRSZWY7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNdWx0aUZpbGVYTUlIZWxwZXJJbXBsKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCB4bWlSZXMpIHsKLQkJc3VwZXIoeG1pUmVzKTsKLQkJc2FtZURvY1JlZmVyZW5jZXMgPSBuZXcgVW5pcXVlRUxpc3QoKTsKLQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB4bWlSZXMKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKSkuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkuZ2V0KAotCQkJCU11bHRpRmlsZVhNSVNhdmVJbXBsLkRJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTKTsKLQkJZGlzY2FyZFVucmVzb2x2ZWRSZWYgPSBiICE9IG51bGwgPyBiLmJvb2xlYW5WYWx1ZSgpIDogZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsI3NldFJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2UpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2UoWE1MUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3VwZXIuc2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJcmVzb3VyY2VVUkkgPSAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkuZ2V0RmluYWxVUkkoKTsKLQkJCWRlcmVzb2x2ZSA9IHJlc291cmNlVVJJICE9IG51bGwgJiYgIXJlc291cmNlVVJJLmlzUmVsYXRpdmUoKSAmJiByZXNvdXJjZVVSSS5pc0hpZXJhcmNoaWNhbCgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGVscGVySW1wbCNnZXRIUkVGKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SFJFRihFT2JqZWN0IG9iaikgewotCQlpZiAoZGlzY2FyZFVucmVzb2x2ZWRSZWYpIHsKLQkJCS8vIHJlbW92ZSB1bnJlc29sdmVkIHJlZmVyZW5jZXMKLQkJCS8vCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTXVsdGlSZXNvdXJjZUVPYmplY3QKLQkJCQkJJiYgISgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG9iaikuaXNWYWxpZCgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTXVsdGlSZXNvdXJjZUVPYmplY3QpIHsKLQkJCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgb2JqOwotCi0JCQlVUkkgb2JqZWN0VVJJID0gby5lUHJveHlVUkkoKTsKLQkJCWlmIChvYmplY3RVUkkgPT0gbnVsbCkgewotCQkJCVJlc291cmNlIG90aGVyUmVzb3VyY2UgPSBvYmouZVJlc291cmNlKCk7Ci0JCQkJaWYgKG90aGVyUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCQlvYmplY3RVUkkgPSBoYW5kbGVEYW5nbGluZ0hSRUYob2JqKTsKLQkJCQkJaWYgKG9iamVjdFVSSSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAocmVzb3VyY2UgPT0gb3RoZXJSZXNvdXJjZSkgewotCQkJCQlyZXR1cm4gIiMiICsgcmVzb3VyY2UuZ2V0VVJJRnJhZ21lbnQob2JqKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCQkvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBNZXRob2RDb25maWd1cmF0aW9uLgotCQkJCQkJLy8gU2VlCi0JCQkJCQkvLyBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmxvYWRDb25maWd1cmF0aW9ucygpCi0JCQkJCQkvLwotCQkJCQkJRU9iamVjdCBsaWIgPSBvYmouZUNvbnRhaW5lcigpOwotCQkJCQkJaWYgKGxpYiAhPSBudWxsKSB7Ci0JCQkJCQkJb3RoZXJSZXNvdXJjZSA9IGxpYi5lUmVzb3VyY2UoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKG90aGVyUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBvdGhlclJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCAKLQkJCQkJCQkJJiYgKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLmdldFJlc291cmNlTWFuYWdlcigpID09IG51bGwpIHsKLQkJCQkJCQlvYmplY3RVUkkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShvdGhlclJlc291cmNlKS5hcHBlbmRGcmFnbWVudChnZXRVUklGcmFnbWVudChvdGhlclJlc291cmNlLCBvYmopKTsKLQkJCQkJCQlyZXR1cm4gZGVyZXNvbHZlKG9iamVjdFVSSSkudG9TdHJpbmcoKTsKLQkJCQkJCX0KLQkJCQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCQkJLmdldFJlc291cmNlRGVzY3JpcHRvcihvdGhlclJlc291cmNlKTsKLQkJCQkJCWlmIChyZXNEZXNjICE9IG51bGwpIHsKLQkJCQkJCQlvYmplY3RVUkkgPSBNdWx0aUZpbGVVUklDb252ZXJ0ZXIuY3JlYXRlVVJJKAotCQkJCQkJCQkJcmVzRGVzYy5nZXRJZCgpKS5hcHBlbmRGcmFnbWVudCgKLQkJCQkJCQkJCWdldFVSSUZyYWdtZW50KG90aGVyUmVzb3VyY2UsIG9iaikpOwotCQkJCQkJCXJldHVybiBvYmplY3RVUkkudG9TdHJpbmcoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICghb2JqZWN0VVJJLnNjaGVtZSgpLmVxdWFscyhNdWx0aUZpbGVVUklDb252ZXJ0ZXIuU0NIRU1FKSkgewotCQkJCQlTdHJpbmcgZnJhZ21lbnQgPSBvYmplY3RVUkkuZnJhZ21lbnQoKTsKLQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsCi0JCQkJCQkJJiYgKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlKQotCQkJCQkJCQkJLmdldEVPYmplY3RCeUlEKGZyYWdtZW50KSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gIiMiICsgZnJhZ21lbnQ7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW9iamVjdFVSSSA9IGRlcmVzb2x2ZShvYmplY3RVUkkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBvYmplY3RVUkkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRIUkVGKG9iaik7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBQcm94eVJlZmVyZW5jZSB7Ci0JCXByaXZhdGUgSW50ZXJuYWxFT2JqZWN0IG93bmVyOwotCi0JCXByaXZhdGUgRVJlZmVyZW5jZSByZWZlcmVuY2U7Ci0KLQkJcHJpdmF0ZSBJbnRlcm5hbEVPYmplY3QgcHJveHk7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBvd25lcgotCQkgKiBAcGFyYW0gcmVmZXJlbmNlCi0JCSAqIEBwYXJhbSBwcm94eQotCQkgKi8KLQkJcHVibGljIFByb3h5UmVmZXJlbmNlKEludGVybmFsRU9iamVjdCBvd25lciwgRVJlZmVyZW5jZSByZWZlcmVuY2UsCi0JCQkJSW50ZXJuYWxFT2JqZWN0IHByb3h5KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQkJdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7Ci0JCQl0aGlzLnByb3h5ID0gcHJveHk7Ci0JCX0KLQotCQlwdWJsaWMgSW50ZXJuYWxFT2JqZWN0IGdldE93bmVyKCkgewotCQkJcmV0dXJuIG93bmVyOwotCQl9Ci0KLQkJcHVibGljIEludGVybmFsRU9iamVjdCBnZXRQcm94eSgpIHsKLQkJCXJldHVybiBwcm94eTsKLQkJfQotCi0JCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlZmVyZW5jZSgpIHsKLQkJCXJldHVybiByZWZlcmVuY2U7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IHBvc2l0aW9uKSB7Ci0JCS8vIFRPRE86IG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzIHJlcGxhY2VtZW50Ci0JCS8vIHNob3VsZCBsb29rIGF0IE11bHRpRmlsZVhNSVNhdmVJbXBsLk15RXNjYXBlLmNvbnZlcnRUZXh0KCkKLQkJLy8KLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlTdHJpbmcgc3RyID0gKFN0cmluZykgdmFsdWU7Ci0JCQlpZiAoc3RyLmluZGV4T2YoIlxuIikgPiAwKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2YWx1ZSA9IHN0ci5yZXBsYWNlQWxsKCJcbiIsIExJTkVfU0VQKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCTsKLQotCQlpbnQga2luZCA9IGdldEZlYXR1cmVLaW5kKGZlYXR1cmUpOwotCi0JCXRyeSB7Ci0JCQkvLyBUT0RPOiB0ZW1wb3JhcnkgZml4IHRvIGF2b2lkIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwKLQkJCS8vIG5lZWRzIHJldmlzaXQKLQkJCS8vCi0JCQlpZiAoa2luZCA9PSBJU19NQU5ZX01PVkUpIHsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgb2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKHBvc2l0aW9uID4gLTEgJiYgbGlzdC5pbmRleE9mKHZhbHVlKSA9PSAtMSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQlzdXBlci5zZXRWYWx1ZShvYmplY3QsIGZlYXR1cmUsIHZhbHVlLCBwb3NpdGlvbik7Ci0KLQkJCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBJU19NQU5ZX0FERDoKLQkJCWNhc2UgSVNfTUFOWV9NT1ZFOgotCQkJCUludGVybmFsRUxpc3QgbGlzdCA9IChJbnRlcm5hbEVMaXN0KSBvYmplY3QuZUdldChmZWF0dXJlKTsKLQotCQkJCS8vIHNhdmUgc2FtZSBkb2N1bWVudCBmb3J3YXJkICh1bmlkaXJlY3Rpb25hbCkgcmVmZXJlbmNlcyB0bwotCQkJCS8vIHJlc29sdmUgYXQgdGhlIGVuZCBvZiBkb2N1bWVudCBwYXJzaW5nCi0JCQkJLy8JCQkJCi0JCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7Ci0JCQkJCUVSZWZlcmVuY2UgcmVmID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0JCQkJCWlmIChyZWYuZ2V0RU9wcG9zaXRlKCkgIT0gbnVsbCkgewotCQkJCQkJSW50ZXJuYWxFT2JqZWN0IG93bmVyID0gKEludGVybmFsRU9iamVjdCkgb2JqZWN0OwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5iYXNpY0l0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlJbnRlcm5hbEVPYmplY3QgZWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXIKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQuZUlzUHJveHkoKQotCQkJCQkJCQkJJiYgZWxlbWVudC5lUHJveHlVUkkoKS50cmltRnJhZ21lbnQoKQotCQkJCQkJCQkJCQkuZXF1YWxzKHJlc291cmNlVVJJKSkgewotCQkJCQkJCQlzYW1lRG9jUmVmZXJlbmNlcy5hZGQobmV3IFByb3h5UmVmZXJlbmNlKG93bmVyLAotCQkJCQkJCQkJCXJlZiwgZWxlbWVudCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWJyZWFrOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChsb2dFcnJvcikgewotCQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJU3RyaW5nIGVyck1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoCi0JCQkJCQkiTXVsdGlGaWxlWE1JSGVscGVySW1wbC5zZXRWYWx1ZSgpOiBFUlJPUiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIlxuICBvYmplY3Q6ICIpLmFwcGVuZChvYmplY3QpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIlxuICBmZWF0dXJlOiAiKS5hcHBlbmQoZmVhdHVyZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgiXG4gIHZhbHVlOiAiKS5hcHBlbmQodmFsdWUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIlxuICBwb3NpdGlvbjogIikuYXBwZW5kKHBvc2l0aW9uKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKCJcbiAga2luZDogIikuYXBwZW5kKGtpbmQpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS50b1N0cmluZygpOwotCQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlcnJNc2cpOwotCQkJCX0KLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGVyck1zZyk7Ci0JCQl9Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGwjZ2V0VmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZShFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGYpIHsKLQkJT2JqZWN0IHZhbHVlID0gc3VwZXIuZ2V0VmFsdWUob2JqLCBmKTsKLQkJCi0JCS8vIHJlbW92ZSBhbnkgdmFsdWUgdGhhdCBkb2VzIG5vdCBiZWxvbmcgdG8gYW55IHJlc291cmNlCi0JCS8vCi0JCWlmKGYgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7Ci0JCQlpZihmLmlzTWFueSgpKSB7Ci0JCQkJaWYoZi5pc0NoYW5nZWFibGUoKSAmJiB2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRUxpc3QpIHsKLQkJCQkJSW50ZXJuYWxFTGlzdCBsaXN0ID0gKEludGVybmFsRUxpc3QpIHZhbHVlOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYoIW8uZUlzUHJveHkoKSAmJiBvLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIHZhbHVlOwotCQkJCWlmKCFvLmVJc1Byb3h5KCkgJiYgby5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSUxvYWRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JTG9hZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGQ4MWI2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JTG9hZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5TQVhYTUlIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlMb2FkSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkVQRlZlcnNpb25zOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogWE1MTG9hZCBpbXBsZW1lbnRhdGlvbiBmb3IgbGlicmFyeSBYTUkgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE11bHRpRmlsZVhNSUxvYWRJbXBsIGV4dGVuZHMgWE1JTG9hZEltcGwgewotCi0JcHVibGljIE11bHRpRmlsZVhNSUxvYWRJbXBsKFhNTEhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIoaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGVmYXVsdEhhbmRsZXIgbWFrZURlZmF1bHRIYW5kbGVyKCkgewotCQlyZXR1cm4gbmV3IFNBWFhNSUhhbmRsZXIocmVzb3VyY2UsIGhlbHBlciwgb3B0aW9ucykgewotCQkJICAKLQkJCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZShFT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNFbGVtZW50KSB7Ci0JCQkJaWYgKEVQRlZlcnNpb25zLlRPT0xfSUQuZXF1YWxzKHByZWZpeCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRGZWF0dXJlKG9iamVjdCwgcHJlZml4LCBuYW1lLCBpc0VsZW1lbnQpOwotCQkJfQotCQkJCi0JCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVVbmtub3duRmVhdHVyZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0VsZW1lbnQsIEVPYmplY3QgcGVla09iamVjdCwgU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKEVQRlZlcnNpb25zLlRPT0xfSUQuZXF1YWxzKHByZWZpeCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlzdXBlci5oYW5kbGVVbmtub3duRmVhdHVyZShwcmVmaXgsIG5hbWUsIGlzRWxlbWVudCwgcGVla09iamVjdCwgdmFsdWUpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHsKLQkJCQlzdXBlci5lbmREb2N1bWVudCgpOwotCi0JCQkJaWYgKGhlbHBlciBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSUhlbHBlckltcGwpIHsKLQkJCQkJTGlzdCBzYW1lRG9jUmVmZXJlbmNlcyA9ICgoTXVsdGlGaWxlWE1JSGVscGVySW1wbCkgaGVscGVyKS5zYW1lRG9jUmVmZXJlbmNlczsKLQkJCQkJaWYgKCFzYW1lRG9jUmVmZXJlbmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNhbWVEb2NSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlNdWx0aUZpbGVYTUlIZWxwZXJJbXBsLlByb3h5UmVmZXJlbmNlIHByb3h5UmVmID0gKE11bHRpRmlsZVhNSUhlbHBlckltcGwuUHJveHlSZWZlcmVuY2UpIGl0ZXIKLQkJCQkJCQkJCS5uZXh0KCk7Ci0KLQkJCQkJCQkvLyB0aGlzIHdpbGwgbWVyZ2UgdGhlIG9wcG9zaXRlIGZlYXR1cmUgbWFwcyBhcyB3ZWxsCi0JCQkJCQkJRU9iamVjdCByZXNvbHZlZCA9IHByb3h5UmVmLmdldE93bmVyKCkKLQkJCQkJCQkJCS5lUmVzb2x2ZVByb3h5KHByb3h5UmVmLmdldFByb3h5KCkpOwotCi0JCQkJCQkJSW50ZXJuYWxFTGlzdCB2YWx1ZXMgPSAoSW50ZXJuYWxFTGlzdCkgcHJveHlSZWYKLQkJCQkJCQkJCS5nZXRPd25lcigpLmVHZXQocHJveHlSZWYuZ2V0UmVmZXJlbmNlKCkpOwotCQkJCQkJCWludCBpbmRleCA9IHZhbHVlcy5iYXNpY0xpc3QoKS5pbmRleE9mKAotCQkJCQkJCQkJcHJveHlSZWYuZ2V0UHJveHkoKSk7Ci0JCQkJCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJCXZhbHVlcy5zZXRVbmlxdWUoaW5kZXgsIHJlc29sdmVkKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MTG9hZEltcGwjbG9hZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlLAotCSAqICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKFhNTFJlc291cmNlIHJlc291cmNlLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gc3RyaXAgb2ZmIHRoZSBVVEYtOCBCT00gYnl0ZXMgaWYgdGhleSBhcmUgc3RpbGwgdGhlcmUKLQkJCS8vCi0JCQlQdXNoYmFja0lucHV0U3RyZWFtIHBiaXMgPSBuZXcgUHVzaGJhY2tJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgMyk7Ci0JCQlieXRlIGJvbVtdID0gbmV3IGJ5dGVbM107Ci0JCQlpZiAocGJpcy5yZWFkKGJvbSkgPT0gMykgewotCQkJCWlmIChib21bMF0gIT0gKGJ5dGUpIDB4RUYgfHwgYm9tWzFdICE9IChieXRlKSAweEJCCi0JCQkJCQl8fCBib21bMl0gIT0gKGJ5dGUpIDB4QkYpIHsKLQkJCQkJcGJpcy51bnJlYWQoYm9tKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXN1cGVyLmxvYWQocmVzb3VyY2UsIHBiaXMsIG9wdGlvbnMpOwotCQl9IGNhdGNoIChSZXNvdXJjZS5JT1dyYXBwZWRFeGNlcHRpb24gZSkgewotCQkJaWYgKCFyZXNvdXJjZS5nZXRFcnJvcnMoKS5pc0VtcHR5KCkgJiYgaGVscGVyID09IG51bGwpIHsKLQkJCQkvLyB1bmtub3duIGZlYXR1cmVzIGRldGVjdGVkLCBsb2cgdGhlIHdhcm5pbmcgYW5kIGlnbm9yZSB0aGVtCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0RXJyb3JzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRXhjZXB0aW9uIGV4ID0gKEV4Y2VwdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZXguZ2V0TWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSVJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSVJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OGUxNDk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxMb2FkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MU2F2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5JRmFpbFNhZmVTYXZhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogUmVzb3VyY2UgaW1wbGVtZW50YXRpb24gZm9yIGxpYnJhcnkgWE1JIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUlSZXNvdXJjZUltcGwgCi1pbXBsZW1lbnRzIElMaWJyYXJ5UmVzb3VyY2UsIElGYWlsU2FmZVNhdmFibGUKLXsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0ZW1wRGlyOwotCi0JcHJpdmF0ZSBVUkkgZmluYWxVUkk7Ci0KLQlwcml2YXRlIFVSSSBvbGRVUkk7Ci0KLQlwcml2YXRlIFN0cmluZyBiYWNrdXBGaWxlOwotCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudFR4SUQ7Ci0KLQlwcml2YXRlIGxvbmcgbGFzdExvYWRUaW1lU3RhbXA7Ci0KLQlwcml2YXRlIFJlc291cmNlRGVzY3JpcHRvciByZXNvdXJjZURlc2NyaXB0b3I7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVbmxvYWRpbmc7Ci0KLQlwcml2YXRlIGxvbmcgZmlsZUxhc3RNb2RpZmllZDsKLQotCXB1YmxpYyBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCQlzZXRJbnRyaW5zaWNJRFRvRU9iamVjdE1hcChuZXcgSGFzaE1hcCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MTG9hZCBjcmVhdGVYTUxMb2FkKCkgewotCQlyZXR1cm4gbmV3IE11bHRpRmlsZVhNSUxvYWRJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjY3JlYXRlWE1MU2F2ZSgpCi0JICovCi0JcHJvdGVjdGVkIFhNTFNhdmUgY3JlYXRlWE1MU2F2ZSgpIHsKLQkJcmV0dXJuIG5ldyBNdWx0aUZpbGVYTUlTYXZlSW1wbChjcmVhdGVYTUxIZWxwZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsI2NyZWF0ZVhNTEhlbHBlcigpCi0JICovCi0JcHJvdGVjdGVkIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7Ci0JCXJldHVybiBuZXcgTXVsdGlGaWxlWE1JSGVscGVySW1wbCh0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2UjZ2V0SUQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRChFT2JqZWN0IGVPYmplY3QpIHsKLQkJU3RyaW5nIGlkID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChlT2JqZWN0KTsKLQkJaWYgKGlkICE9IG51bGwpCi0JCQlyZXR1cm4gaWQ7Ci0JCXJldHVybiBzdXBlci5nZXRJRChlT2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjc2V0SUQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElEKEVPYmplY3QgZU9iamVjdCwgU3RyaW5nIGlkKSB7Ci0JCU9iamVjdCBvbGRJRCA9IGlkICE9IG51bGwgPyBnZXRFT2JqZWN0VG9JRE1hcCgpLnB1dChlT2JqZWN0LCBpZCkKLQkJCQk6IGdldEVPYmplY3RUb0lETWFwKCkucmVtb3ZlKGVPYmplY3QpOwotCi0JCU1hcCBndWlkVG9NZXRob2RFbGVtZW50TWFwID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGdldFJlc291cmNlU2V0KCkpCi0JCQkJLmdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKTsKLQotCQlpZiAob2xkSUQgIT0gbnVsbCkgewotCQkJZ2V0SURUb0VPYmplY3RNYXAoKS5yZW1vdmUob2xkSUQpOwotCQkJCi0JCQlpZiAoZU9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkvLyByZW1vdmUgb2JqZWN0IGZyb20gZ3VpZFRvTWV0aG9kRWxlbWVudE1hcCBvbmx5IGlmIGl0IGlzIGEgcHJveHkKLQkJCQkvLwotCQkJCWlmKGVPYmplY3QuZUlzUHJveHkoKSkgewotCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBndWlkVG9NZXRob2RFbGVtZW50TWFwLmdldChpZCk7Ci0JCQkJCWlmKG9iaiAhPSBudWxsICYmIG9iai5lSXNQcm94eSgpKSB7Ci0JCQkJCQlndWlkVG9NZXRob2RFbGVtZW50TWFwLnJlbW92ZShpZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWd1aWRUb01ldGhvZEVsZW1lbnRNYXAucmVtb3ZlKGlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJZ2V0SURUb0VPYmplY3RNYXAoKS5wdXQoaWQsIGVPYmplY3QpOwotCQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZ3VpZFRvTWV0aG9kRWxlbWVudE1hcC5wdXQoaWQsIGVPYmplY3QpOwotCi0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGVPYmplY3Q7Ci0JCQkJaWYgKCFlLmdldEd1aWQoKS5lcXVhbHMoaWQpKSB7Ci0JCQkJCWUuc2V0R3VpZChpZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI3VzZVVVSURzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VVVUlEcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UjZ2V0VVJJRnJhZ21lbnQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUklGcmFnbWVudChFT2JqZWN0IGVPYmplY3QpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBpZCA9IGdldElEKGVPYmplY3QpOwotCi0JCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJCXJldHVybiBpZDsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlzdCB1cmlGcmFnbWVudFBhdGggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChFT2JqZWN0IGNvbnRhaW5lciA9IGVPYmplY3QuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbAotCQkJCQkJJiYgY29udGFpbmVyLmVSZXNvdXJjZSgpID09IHRoaXM7IGNvbnRhaW5lciA9IGVPYmplY3QKLQkJCQkJCS5lQ29udGFpbmVyKCkpIHsKLQkJCQkJdXJpRnJhZ21lbnRQYXRoLmFkZCgoKEludGVybmFsRU9iamVjdCkgY29udGFpbmVyKQotCQkJCQkJCS5lVVJJRnJhZ21lbnRTZWdtZW50KGVPYmplY3QuZUNvbnRhaW5pbmdGZWF0dXJlKCksCi0JCQkJCQkJCQllT2JqZWN0KSk7Ci0JCQkJCWVPYmplY3QgPSBjb250YWluZXI7Ci0JCQkJfQotCi0JCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoZ2V0VVJJRnJhZ21lbnRSb290U2VnbWVudChlT2JqZWN0KSk7Ci0KLQkJCQlmb3IgKExpc3RJdGVyYXRvciBpID0gdXJpRnJhZ21lbnRQYXRoCi0JCQkJCQkubGlzdEl0ZXJhdG9yKHVyaUZyYWdtZW50UGF0aC5zaXplKCkpOyBpLmhhc1ByZXZpb3VzKCk7KSB7Ci0JCQkJCXJlc3VsdC5hcHBlbmQoJy8nKTsKLQkJCQkJcmVzdWx0LmFwcGVuZCgoU3RyaW5nKSBpLnByZXZpb3VzKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciBnZXR0aW5nIFVSSSBmcmFnbWVudCBmb3IgIiArIGVPYmplY3QpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2F0dGFjaGVkSGVscGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGF0dGFjaGVkSGVscGVyKEVPYmplY3QgZU9iamVjdCkgewotCQlzdXBlci5hdHRhY2hlZEhlbHBlcihlT2JqZWN0KTsKLQotCQlpZiAodXNlSURzKCkpIHsKLQkJCVN0cmluZyBpZCA9IGdldElEKGVPYmplY3QpOwotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQkvLyB1cGRhdGUgdGhlIGVPYmplY3RUb0lETWFwCi0JCQkJLy8KLQkJCQlnZXRFT2JqZWN0VG9JRE1hcCgpLnB1dChlT2JqZWN0LCBpZCk7Ci0JCQkJCi0JCQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCSgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpKQotCQkJCQkJCS5nZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkucHV0KGlkLCBlT2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaXNUcmFja2luZ01vZGlmaWNhdGlvbigpICYmIGVPYmplY3QuZVJlc291cmNlKCkgIT0gdGhpcykgewotCQkJLy8gcmVtb3ZlIHRoZSBtb2RpZmljYXRpb24gdHJhY2tpbmcgYWRhcHRlciBmcm9tIHRoZSBlT2JqZWN0Ci0JCQkvLwotCQkJZU9iamVjdC5lQWRhcHRlcnMoKS5yZW1vdmUobW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhdHRhY2hlZEFsbFdpdGhJRHMoRU9iamVjdCBlT2JqKSB7Ci0JCS8vIGF0dGFjaGVkSGVscGVyKGVPYmopOwotCQkvLyBMaXN0IGxpc3QgPSBlT2JqLmVDb250ZW50cygpOwotCQkvLyBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkvLyBFT2JqZWN0IG8gPSAoRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCS8vIGlmIChvLmVSZXNvdXJjZSgpID09IHRoaXMpIHsKLQkJLy8gYXR0YWNoZWRBbGxXaXRoSURzKG8pOwotCQkvLyB9Ci0JCS8vIH0KLQotCQlJdGVyYXRvciBhbGxDb250ZW50cyA9IG5ldyBDb250ZW50VHJlZUl0ZXJhdG9yKGVPYmopOwotCi0JCXdoaWxlIChhbGxDb250ZW50cy5oYXNOZXh0KCkpIHsKLQkJCWF0dGFjaGVkSGVscGVyKChFT2JqZWN0KSBhbGxDb250ZW50cy5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhc2ljQXR0YWNoZWRBbGwoRU9iamVjdCBlT2JqKSB7Ci0JCWVPYmouZUFkYXB0ZXJzKCkuYWRkKG1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcik7Ci0JCUxpc3QgbGlzdCA9IGVPYmouZUNvbnRlbnRzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoby5lUmVzb3VyY2UoKSA9PSB0aGlzKSB7Ci0JCQkJYmFzaWNBdHRhY2hlZEFsbChvKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIG9uIGFuIG9iamVjdCBhbmQgYWxsIG9mIGl0cyBvZmZzdHJpbmcgb2JqZWN0cyB0aGF0IGFyZSBpbiB0aGUgc2FtZQotCSAqIHJlc291cmNlIGFzIHRoZSBvYmplY3Qgd2hlbiB0aGUgb2JqZWN0IGlzIGF0dGFjaGVkIHRvIHRoaXMgcmVzb3VyY2UuIFRoaXMKLQkgKiBtZXRob2QgaXMgZXhwZW5zaXZlLCBzbyB1c2UgaXQgd2l0aCBjYXV0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlT2JqCi0JICovCi0JcHVibGljIHZvaWQgYXR0YWNoZWRBbGwoRU9iamVjdCBlT2JqKSB7Ci0JCWlmICh1c2VJRHMoKSkgewotCQkJYXR0YWNoZWRBbGxXaXRoSURzKGVPYmopOwotCQl9IGVsc2UgewotCQkJYmFzaWNBdHRhY2hlZEFsbChlT2JqKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLkludGVybmFsI2F0dGFjaGVkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGF0dGFjaGVkKEVPYmplY3QgZU9iamVjdCkgewotCQlhdHRhY2hlZEFsbChlT2JqZWN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGV0YWNoZWRBbGxXaXRoSURzKEVPYmplY3QgZU9iaikgewotCQlJdGVyYXRvciBhbGxDb250ZW50cyA9IG5ldyBDb250ZW50VHJlZUl0ZXJhdG9yKGVPYmopOwotCi0JCXdoaWxlIChhbGxDb250ZW50cy5oYXNOZXh0KCkpIHsKLQkJCWRldGFjaGVkSGVscGVyKChFT2JqZWN0KSBhbGxDb250ZW50cy5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhc2ljRGV0YWNoZWRBbGwoRU9iamVjdCBlT2JqKSB7Ci0JCWVPYmouZUFkYXB0ZXJzKCkucmVtb3ZlKG1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcik7Ci0JCUxpc3QgbGlzdCA9IGVPYmouZUNvbnRlbnRzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoby5lUmVzb3VyY2UoKSA9PSB0aGlzKSB7Ci0JCQkJYmFzaWNEZXRhY2hlZEFsbChvKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNnZXRFT2JqZWN0QnlJRChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVPYmplY3RCeUlEKFN0cmluZyBpZCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIGd1aWQgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKGVsZW1lbnQpOwotCQkJaWYgKGd1aWQgIT0gbnVsbCAmJiBndWlkLmVxdWFscyhpZCkpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQotCQkvLyByZXR1cm4gc3VwZXIuZ2V0RU9iamVjdEJ5SUQoaWQpOwotCi0JCWlmIChpZFRvRU9iamVjdE1hcCAhPSBudWxsKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgZU9iamVjdCA9IChJbnRlcm5hbEVPYmplY3QpIGlkVG9FT2JqZWN0TWFwLmdldChpZCk7Ci0JCQlpZiAoZU9iamVjdCAhPSBudWxsICYmICFlT2JqZWN0LmVJc1Byb3h5KCkpIHsKLQkJCQlyZXR1cm4gZU9iamVjdDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VJbXBsI2xvYWQoamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNVbmxvYWRpbmcpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5sb2FkKG9wdGlvbnMpOwotCQl1cGRhdGVUaW1lU3RhbXBzKCk7Ci0JCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJaWYgKGdldFVSSSgpLnRvU3RyaW5nKCkuZXF1YWxzKHRlc3RSZXNvdXJjZVVSSVN0cikpIHsKLQkJCQl0ZXN0UmVzb3VyY2VMb2FkZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0ZXN0UmVzb3VyY2VMb2FkZWQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGVzdFJlc291cmNlVVJJU3RyID0gImZpbGU6L0M6L3RlbXAvbmV3bGliL2xpYnJhcnkueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHJldHVybiB0aGUgZmlsZUxhc3RNb2RpZmllZAotCSAqLwotCXB1YmxpYyBsb25nIGdldEZpbGVMYXN0TW9kaWZpZWQoKSB7Ci0JCXJldHVybiBmaWxlTGFzdE1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIFJlbG9hZHMgdGhpcyByZXNvdXJjZS4gT2xkIG9iamVjdHMgd2lsbCBiZWNvbWUgcHJveGllcyBhbmQgdGhleSB3aWxsIGJlCi0JICogYWRkZWQgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIDxjb2RlPnByb3hpZXM8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHByb3hpZXMKLQkgKi8KLQlzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWxvYWQoQ29sbGVjdGlvbiBwcm94aWVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNMb2FkZWQpIHsKLQkJCU5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBzZXRMb2FkZWQoZmFsc2UpOwotCQkJZG9VbmxvYWQocHJveGllcywgZmFsc2UpOwotCQkJLy8gZG9VbmxvYWQoKSBtaWdodCBoYXZlIHNldCB0aGlzIHJlc291cmNlIGxvYWRlZCBhZ2FpbgotCQkJLy8gc2V0IGlzTG9hZGVkIHRvIGZhbHNlIGFuZCBjb250ZW50cyB0byBudWxsIHRvIG1ha2Ugc3VyZQotCQkJLy8KLQkJCWlzTG9hZGVkID0gZmFsc2U7Ci0JCQljb250ZW50cyA9IG51bGw7Ci0JCQlpZiAobm90aWZpY2F0aW9uICE9IG51bGwpIHsKLQkJCQllTm90aWZ5KG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCQlsb2FkKGdldFJlc291cmNlU2V0KCkuZ2V0TG9hZE9wdGlvbnMoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB1bmxvYWRXaXRob3V0UmVtb3ZlKCkgewotCQlpZiAoaXNMb2FkZWQpIHsKLQkJCS8vIHNhdmUgdGhlIFJlc291cmNlRGVzY3JpcHRvciBwZiB0aGlzIHJlc291cmNlIGZvciBsYXRlciB1c2UgdG8KLQkJCS8vIGNyZWF0ZSBVUkkgZm9yIHRoZSBwcm94aWVzIGFmdGVyIHVubG9hZAotCQkJLy8KLQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJLmdldFJlc291cmNlRGVzY3JpcHRvcih0aGlzKTsKLQkJCWlmIChyZXNEZXNjICE9IG51bGwpIHsKLQkJCQlzZXRSZXNvdXJjZURlc2NyaXB0b3IocmVzRGVzYyk7Ci0JCQl9Ci0KLQkJCU5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBzZXRMb2FkZWQoZmFsc2UpOwotCQkJZG9VbmxvYWQobnVsbCwgZmFsc2UpOwotCQkJaWYgKG5vdGlmaWNhdGlvbiAhPSBudWxsKSB7Ci0JCQkJZU5vdGlmeShub3RpZmljYXRpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRG9lcyBhbGwgdGhlIHdvcmsgb2YgdW5sb2FkaW5nIHRoZSByZXNvdXJjZS4gSXQgY2FsbHMKLQkgKiB7QGxpbmsgI3VubG9hZGVkIHVubG9hZGVkfSBmb3IgZWFjaCBvYmplY3QgaXQgdGhlIGNvbnRlbnQKLQkgKiB7QGxpbmsgI2dldEFsbENvbnRlbnRzIHRyZWV9LCBhbmQgY2xlYXJzIHRoZQotCSAqIHtAbGluayAjZ2V0Q29udGVudHMgY29udGVudHN9LCB7QGxpbmsgI2dldEVycm9ycyBlcnJvcnN9LCBhbmQKLQkgKiB7QGxpbmsgI2dldFdhcm5pbmdzIHdhcm5pbmdzfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VubG9hZCgpIHsKLQkJZG9VbmxvYWQobnVsbCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdWwgMTcsIDIwMDYKLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb250ZW50VHJlZUl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gb2JqZWN0Ci0JCSAqLwotCQlwcml2YXRlIENvbnRlbnRUcmVlSXRlcmF0b3IoT2JqZWN0IG9iamVjdCkgewotCQkJc3VwZXIob2JqZWN0KTsKLQkJfQotCi0JCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlFQ29udGVudHNFTGlzdCBjb250ZW50cyA9IG5ldyBFQ29udGVudHNFTGlzdCgoRU9iamVjdCkgb2JqZWN0KSB7Ci0JCQkJCS8qCi0JCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJICogCi0JCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3QjcmVzb2x2ZSgpCi0JCQkJCSAqLwotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNvbHZlKCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250ZW50cy5iYXNpY0l0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChvLmVSZXNvdXJjZSgpID09IE11bHRpRmlsZVhNSVJlc291cmNlSW1wbC50aGlzCi0JCQkJCQkJfHwgby5lSXNQcm94eSgpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVW5sb2FkcyB0aGlzIHJlc291cmNlLiBPbGQgb2JqZWN0cyB3aWxsIGJlIGNvbWUgcHJveGllcyBhbmQgd2lsbCBiZSBhZGRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiA8Y29kZT5wcm94aWVzPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBwcm94aWVzCi0JICogQHBhcmFtIHJlbW92ZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gd2lsbCByZW1vdmUgYWxsIHRoZSB1bmxvYWRlZCBvYmplY3RzIGluCi0JICogICAgICAgICAgICB0aGUgcmVzb3VyY2UgZnJvbSB0aGVpciBjb250YWluZXJzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVW5sb2FkKENvbGxlY3Rpb24gcHJveGllcywgYm9vbGVhbiByZW1vdmUpIHsKLQkJaXNVbmxvYWRpbmcgPSB0cnVlOwotCi0JCXRyeSB7Ci0JCQkvLyBmcm9tIFJlc291cmNlSW1wbAotCQkJLy8KLQotCQkJSXRlcmF0b3IgYWxsQ29udGVudHMgPSBnZXRBbGxQcm9wZXJDb250ZW50cyhuZXcgQXJyYXlMaXN0KAotCQkJCQlnZXRDb250ZW50cygpKSk7Ci0KLQkJCS8vIFRoaXMgZ3VhcmQgaXMgbmVlZGVkIHRvIGVuc3VyZSB0aGF0IGNsZWFyIGRvZXNuJ3QgbWFrZSB0aGUKLQkJCS8vIHJlc291cmNlCi0JCQkvLyBiZWNvbWUgbG9hZGVkLgotCQkJLy8KLQkJCWlmICghZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQlpZiAocmVtb3ZlKSB7Ci0JCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBkb24ndCBjYWxsIGdldENvbnRlbnRzKCkuY2xlYXIoKSB0byBrZWVwIHRoZSByZWZlcmVuY2VzCi0JCQkJCS8vIHRvIGVsZW1lbnRzCi0JCQkJCS8vIHRoYXQganVzdCBiZWNhbWUgcHJveGllcyBhZnRlciB1bmxvYWQKLQkJCQkJLy8KLQkJCQkJY29udGVudHMgPSBudWxsOwotCQkJCX0KLQotCQkJCS8vIE1hcCBvYmpUb0NvbnRhaW5lck1hcCA9IG51bGw7Ci0JCQkJLy8gTWFwIGNvbnRhaW5lclRvRGVsaXZlck1hcCA9IG51bGw7Ci0JCQkJLy8gaWYoIXJlbW92ZSkgewotCQkJCS8vIG9ialRvQ29udGFpbmVyTWFwID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0Q29udGFpbmVycyh0aGlzKTsKLQkJCQkvLyBpZighb2JqVG9Db250YWluZXJNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gLy8gc2F2ZSB0aGUgY3VycmVudCBkZWxpdmVyIGZsYWcgb2YgYWxsIGNvbnRhaW5lcnMgb2YgY29udGVudAotCQkJCS8vIG9iamVjdHMKLQkJCQkvLyAvLyBhbmQgZGlzYWJsZSBub3RpZmljYXRpb24gb24gdGhvc2UgY29udGFpbmVyIHNvCi0JCQkJLy8gZ2V0Q29udGVudCgpLmNsZWFyKCkgd2lsbAotCQkJCS8vIC8vIG5vdCBkaXNwYXRjaCBub3RpZmljYXRpb24gdGhhdCBtaWdodCB1cGRhdGUgVUkuIEFuZCB3ZQotCQkJCS8vIGRvbid0IHdhbnQgdG8gdXBkYXRlCi0JCQkJLy8gLy8gVUkgYXQgdGhpcyBzdGFnZQotCQkJCS8vIC8vCi0JCQkJLy8gY29udGFpbmVyVG9EZWxpdmVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmpUb0NvbnRhaW5lck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCS8vIEVPYmplY3QgY29udGFpbmVyID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCS8vIGNvbnRhaW5lclRvRGVsaXZlck1hcC5wdXQoY29udGFpbmVyLCBuZXcKLQkJCQkvLyBCb29sZWFuKGNvbnRhaW5lci5lRGVsaXZlcigpKSk7Ci0JCQkJLy8gY29udGFpbmVyLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyBnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJLy8gaWYoIXJlbW92ZSAmJiBjb250YWluZXJUb0RlbGl2ZXJNYXAgIT0gbnVsbCkgewotCQkJCS8vIC8vIHJlc3RvcmUgdGhlIGNvbnRhaW5lciBvZiBjb250ZW50cyBvYmplY3RzCi0JCQkJLy8gLy8KLQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmpUb0NvbnRhaW5lck1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJLy8gTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJLy8gTXVsdGlSZXNvdXJjZUVPYmplY3Qgb2JqID0KLQkJCQkvLyAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KWVudHJ5LmdldEtleSgpKTsKLQkJCQkvLyBJbnRlcm5hbEVPYmplY3QgY29udGFpbmVyID0gKEludGVybmFsRU9iamVjdCkKLQkJCQkvLyBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCS8vIG9iai5lQmFzaWNTZXRDb250YWluZXIoY29udGFpbmVyLCBvYmouZUNvbnRhaW5lckZlYXR1cmVJRCgpKTsKLQkJCQkvLyB9Ci0KLQkJCQkvLyAvLyByZXN0b3JlIHRoZSBkZWxpdmVyIGZsYWcgb2YgY29udGVudHMgb2JqZWN0czsKLQkJCQkvLyAvLwotCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9Ci0JCQkJLy8gY29udGFpbmVyVG9EZWxpdmVyTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJCS8vIHsKLQkJCQkvLyBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkvLyBFT2JqZWN0IGNvbnRhaW5lciA9IChFT2JqZWN0KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkvLyBib29sZWFuIGRlbGl2ZXIgPSAoKEJvb2xlYW4pZW50cnkuZ2V0VmFsdWUoKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJLy8gY29udGFpbmVyLmVTZXREZWxpdmVyKGRlbGl2ZXIpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQl9Ci0JCQlnZXRFcnJvcnMoKS5jbGVhcigpOwotCQkJZ2V0V2FybmluZ3MoKS5jbGVhcigpOwotCi0JCQlBcnJheUxpc3QgdW5sb2FkZWRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdHJ5IHsKLQkJCQl3aGlsZSAoYWxsQ29udGVudHMuaGFzTmV4dCgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIGFsbENvbnRlbnRzCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQl1bmxvYWRlZChvKTsKLQkJCQkJCXVubG9hZGVkT2JqZWN0cy5hZGQobyk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJfQotCQkJaWYgKHByb3hpZXMgIT0gbnVsbCAmJiAhdW5sb2FkZWRPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJCXByb3hpZXMuYWRkQWxsKHVubG9hZGVkT2JqZWN0cyk7Ci0JCQl9Ci0JCQlpZiAocmVtb3ZlKSB7Ci0JCQkJLy8gcmVtb3ZlIHRoZSB1bmxvYWRlZCBvYmplY3RzIGZyb20gaXRzIGNvbnRhaW5lciB0byBwcmV2ZW50IHRoZQotCQkJCS8vIHdob2xlIGxpYnJhcnkgZnJvbSBzdGF5aW5nCi0JCQkJLy8gaW4gbWVtb3J5IGlmIG9ubHkgb25lIG9mIGl0cyBlbGVtZW50IGlzIGxlYWtlZAotCQkJCS8vIAotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHVubG9hZGVkT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBvYmplY3QgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUob2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGZyb20gWE1MUmVzb3VyY2VJbWwKLQkJCS8vCQkKLQotCQkJaWYgKGlkVG9FT2JqZWN0TWFwICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpZFRvRU9iamVjdE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZ2V0UmVzb3VyY2VTZXQoKSkKLQkJCQkJCQkuZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnJlbW92ZShpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJCWlkVG9FT2JqZWN0TWFwLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCWlmIChlT2JqZWN0VG9JRE1hcCAhPSBudWxsKSB7Ci0JCQkJZU9iamVjdFRvSURNYXAuY2xlYXIoKTsKLQkJCX0KLQotCQkJaWYgKGVPYmplY3RUb0V4dGVuc2lvbk1hcCAhPSBudWxsKSB7Ci0JCQkJZU9iamVjdFRvRXh0ZW5zaW9uTWFwLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCWlmIChpbnRyaW5zaWNJRFRvRU9iamVjdE1hcCAhPSBudWxsKSB7Ci0JCQkJaW50cmluc2ljSURUb0VPYmplY3RNYXAuY2xlYXIoKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlzVW5sb2FkaW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1bmxvYWRlZChJbnRlcm5hbEVPYmplY3QgaW50ZXJuYWxFT2JqZWN0KSB7Ci0JCVN0cmluZyBndWlkID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChpbnRlcm5hbEVPYmplY3QpOwotCQlpZiAoZ3VpZCAhPSBudWxsKSB7Ci0JCQlVUkkgdXJpID0gcmVzb3VyY2VEZXNjcmlwdG9yICE9IG51bGwgPyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIKLQkJCQkJLmNyZWF0ZVVSSShyZXNvdXJjZURlc2NyaXB0b3IuZ2V0SWQoKSkgOiBnZXRVUkkoKTsKLQkJCWludGVybmFsRU9iamVjdC5lU2V0UHJveHlVUkkodXJpLmFwcGVuZEZyYWdtZW50KGd1aWQpKTsKLQkJfQotCQlpbnRlcm5hbEVPYmplY3QuZUFkYXB0ZXJzKCkuY2xlYXIoKTsKLQotCQlpZiAoaW50ZXJuYWxFT2JqZWN0IGluc3RhbmNlb2YgTXVsdGlSZXNvdXJjZUVPYmplY3QpIHsKLQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG11bHRpUmVzb3VyY2VFT2JqZWN0ID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgaW50ZXJuYWxFT2JqZWN0KTsKLQotCQkJLy8gY2xlYXIgb3duIG9wcG9zaXRlIGZlYXR1cmUgbWFwCi0JCQkvLwkJCQotCQkJTWFwIG9wcG9zaXRlRmVhdHVyZU1hcCA9IG11bHRpUmVzb3VyY2VFT2JqZWN0Ci0JCQkJCS5iYXNpY0dldE9wcG9zaXRlRmVhdHVyZU1hcCgpOwotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZU1hcCAhPSBudWxsKSB7Ci0JCQkJb3Bwb3NpdGVGZWF0dXJlTWFwLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSBpdHNlbGYgZnJvbSBhbGwgb3Bwb3NpdGUgZmVhdHVyZXMKLQkJCS8vIAotCQkJbXVsdGlSZXNvdXJjZUVPYmplY3QucmVtb3ZlRnJvbUFsbE9wcG9zaXRlRmVhdHVyZXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRldGFjaGVkQWxsKEVPYmplY3QgZU9iaikgewotCQlpZiAodXNlSURzKCkpIHsKLQkJCWRldGFjaGVkQWxsV2l0aElEcyhlT2JqKTsKLQkJfSBlbHNlIHsKLQkJCWJhc2ljRGV0YWNoZWRBbGwoZU9iaik7Ci0JCX0KLQl9CQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLkludGVybmFsI2RldGFjaGVkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGRldGFjaGVkKEVPYmplY3QgZU9iamVjdCkgewotCQlkZXRhY2hlZEFsbChlT2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbCNjcmVhdGVNb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBBZGFwdGVyIGNyZWF0ZU1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBNb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbC5Nb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCS8vIGRvbid0IGhhbmRsZSBPcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24gYi9jIGl0IGRvZXMgbm90Ci0JCQkJLy8gcmVhbGx5IG1vZGlmeSB0aGlzIHJlc291cmNlCi0JCQkJLy8KLQkJCQlpZiAobm90aWZpY2F0aW9uIGluc3RhbmNlb2YgT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VJbXBsI3NldE1vZGlmaWVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kaWZpZWQoYm9vbGVhbiBpc01vZGlmaWVkKSB7Ci0JCS8vIGJvb2xlYW4gd2FzTW9kaWZpZWQgPSBpc01vZGlmaWVkKCk7Ci0JCXN1cGVyLnNldE1vZGlmaWVkKGlzTW9kaWZpZWQpOwotCQkvLyBpZihNdWx0aUZpbGVTYXZlVXRpbC5nZXRNZXRob2RFbGVtZW50KHRoaXMpIGluc3RhbmNlb2YKLQkJLy8gUHJvY2Vzc0NvbXBvbmVudCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpRmlsZVhNSVJlc291cmNlSW1wbC5zZXRNb2RpZmllZCgpOiAiICsKLQkJLy8gdGhpcyk7Ci0JCS8vIH0KLQkJLy8gdGhpcyBjb2RlIGlzIG5lZWRlZCB0byBzZXQgZGlydHkgZmxhZyB0byB0aGUgaXRlbSBwcm92aWRlcidzIGxhYmVsCi0JCS8vCi0JCS8vIGlmKHdhc01vZGlmaWVkICE9IGlzTW9kaWZpZWQgJiYgIWdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCS8vIC8vIHJlZnJlc2ggdGhlIGxhYmVsIG9mIHRoZSByZXNvdXJjZSdzIG9iamVjdAotCQkvLyAvLwotCQkvLyBFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBnZXRDb250ZW50cygpLmdldCgwKTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gb2JqLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBPYmplY3QgYWRhcHRlciA9IGl0ZXIubmV4dCgpOwotCQkvLyBpZihhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkvLyAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpYWRhcHRlcikuZmlyZU5vdGlmeUNoYW5nZWQobmV3Ci0JCS8vIFZpZXdlck5vdGlmaWNhdGlvbihuZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uU0VULCBvYmosIG9iaiksCi0JCS8vIG9iaiwgZmFsc2UsIHRydWUpKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQotCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCWlmICh0ZXN0UmVzb3VyY2VMb2FkZWQKLQkJCQkJJiYgZ2V0VVJJKCkudG9TdHJpbmcoKS5lcXVhbHModGVzdFJlc291cmNlVVJJU3RyKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaXNNb2RpZmllZD0iICsgaXNNb2RpZmllZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmllckltcGwjZURlbGl2ZXIoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVEZWxpdmVyKCkgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChyZXNvdXJjZVNldCAhPSBudWxsICYmICFyZXNvdXJjZVNldC5lRGVsaXZlcigpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBzdXBlci5lRGVsaXZlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChvcHRpb25zID09IG51bGwpIHsKLQkJCW9wdGlvbnMgPSBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuREVGQVVMVF9TQVZFX09QVElPTlM7Ci0JCX0KLQkJCi0JCXN1cGVyLnNhdmUob3B0aW9ucyk7Ci0KLQkJLy8gU3BlY2lhbCBoYW5kbGluZyBmb3Igc2F2aW5nIE1ldGhvZExpYnJhcnkgdG8gcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvCi0JCS8vIE1ldGhvZENvbmZpZ3VyYXRpb25zIGZyb20gbGlicmFyeSBmaWxlLgotCQkvLwotCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudCh0aGlzKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IChNZXRob2RMaWJyYXJ5KSBlOwotCQkJLy8gcmVtb3ZlIFJlc291cmNlRGVzY3JpcHRvcnMgb2YgY29uZmlndXJhdGlvbiBmaWxlcwotCQkJLy8KLQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXIodGhpcyk7Ci0JCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRlcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gcmVzTWdyCi0JCQkJCQkJLmdldFJlc291cmNlRGVzY3JpcHRvcihjb25maWcuZ2V0R3VpZCgpKTsKLQkJCQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShyZXNEZXNjKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUxpc3QgY29uZmlncyA9IG5ldyBBcnJheUxpc3QobGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKTsKLQkJCWJvb2xlYW4gb2xkRGVsaXZlciA9IGxpYi5lRGVsaXZlcigpOwotCQkJdHJ5IHsKLQkJCQlsaWIuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCWxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCQotCQkJCS8vIFNhdmUgbGlicmFyeSBmaWxlIGFnYWluIHRvIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byBjb25maWd1cmF0aW9ucy4KLQkJCQkvLyBUaGUgcHJldmlvdXMgc2F2ZSBpcyBzdGlsbCBuZWVkZWQgdG8gc2F2ZSBuZXcgY29uZmlndXJhdGlvbiBpbiBpdHMgb3duIGZpbGUKLQkJCQkvLwotCQkJCXN1cGVyLnNhdmUob3B0aW9ucyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5hZGRBbGwoY29uZmlncyk7Ci0JCQkJbGliLmVTZXREZWxpdmVyKG9sZERlbGl2ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFVSSSBnZXRGaW5hbFVSSSgpIHsKLQkJaWYgKGZpbmFsVVJJICE9IG51bGwpIHsKLQkJCXJldHVybiBmaW5hbFVSSTsKLQkJfQotCQlyZXR1cm4gZ2V0VVJJKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmluYWxVUkkoVVJJIHVyaSkgewotCQlmaW5hbFVSSSA9IHVyaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiYWNrVXBVUkkoKSB7Ci0JCW9sZFVSSSA9IGdldFVSSSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1RlbXBVUkkoKSB7Ci0JCWlmIChjdXJyZW50VHhJRCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY3JlYXRlVGVtcFVSSSgpLmVxdWFscyhnZXRVUkkoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgVVJJIGNyZWF0ZVRlbXBVUkkoKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHRoaXMpOwotCQlyZXR1cm4gVVJJLmNyZWF0ZUZpbGVVUkkobmV3IFN0cmluZ0J1ZmZlcihnZXRUZW1wRGlyKCkpLmFwcGVuZCgKLQkJCQlGaWxlLnNlcGFyYXRvcikuYXBwZW5kKGN1cnJlbnRUeElEKQotCQkJCS5hcHBlbmQoIm5ldyIpLmFwcGVuZChlLmdldEd1aWQoKSkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGdldFRlbXBEaXIoKSB7Ci0JCWlmICh0ZW1wRGlyID09IG51bGwpIHsKLQkJCXRlbXBEaXIgPSBuZXcgRmlsZShGaWxlTWFuYWdlci5nZXRUZW1wRGlyKCksICJFUEYiKS5nZXRBYnNvbHV0ZVBhdGgoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0ZW1wRGlyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRlbXBvcmFyeSBVUkkgdG8gc2F2ZSB0aGlzIHJlc291cmNlIHRvIGFuZCBpdCB3aWxsIGJlIHJlbmFtZWQgdG8KLQkgKiB0aGUgb3JpZ2luYWwgVVJJIHdoZW4gc2F2aW5nIGlzIGRvbmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZW1wVVJJKFN0cmluZyB0eElEKSB7Ci0JCWlmIChmaW5hbFVSSSA9PSBudWxsKSB7Ci0JCQlmaW5hbFVSSSA9IG9sZFVSSSA9IGdldFVSSSgpOwotCQkJY3VycmVudFR4SUQgPSB0eElEOwotCi0JCQlVUkkgdGVtcFVSSSA9IGNyZWF0ZVRlbXBVUkkoKTsKLQkJCXNldFVSSSh0ZW1wVVJJKTsKLQotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCXJlc291cmNlU2V0LmdldFVSSVRvVGVtcFVSSU1hcCgpLnB1dChvbGRVUkksIHRlbXBVUkkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIHJlc291cmNlIFVSSSB0byB0aGUgb3JpZ2luYWwgb25lLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGwKLQkgKiBhZnRlciBzYXZpbmcgcmVnYXJsZXNzIG9mIGl0cyBzdWNjZXNzLgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXN0b3JlVVJJKCkgewotCQlpZiAob2xkVVJJICE9IG51bGwpIHsKLQkJCXNldFVSSShvbGRVUkkpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdHhTdGFydGVkKCkgewotCQlyZXR1cm4gbW92ZVN0YXJ0ZWQoKSB8fCBzYXZlU3RhcnRlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRpbWVTdGFtcHMoKSB7Ci0JCWxhc3RMb2FkVGltZVN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWZpbGVMYXN0TW9kaWZpZWQgPSBuZXcgRmlsZShnZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkubGFzdE1vZGlmaWVkKCk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGlzIHJlc291cmNlIGlzIGN1cnJlbnRseSBzeW5jaHJvbml6ZWQgd2l0aCBpdHMgZGF0YSBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gPGxpPiAtMSBkb24ndCBrbm93Ci0JICogICAgICAgICA8bGk+IDAgbm8KLQkgKiAgICAgICAgIDxsaT4gMSB5ZXMKLQkgKi8KLQlwdWJsaWMgaW50IGNoZWNrU3luY2hyb25pemVkKCkgewotCQlsb25nIGN1cnJlbnRUaW1lID0gbmV3IEZpbGUoZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmxhc3RNb2RpZmllZCgpOwotCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5zYW1lKGN1cnJlbnRUaW1lLCBmaWxlTGFzdE1vZGlmaWVkKSkgewotCQkJLy8gc29tZSB0ZWFtIHByb3ZpZGVycyBjaGFuZ2VkIHRoZSB0aW1lc3RhbXAgb2YgbGFzdCBmaWxlIG1vZGlmaWNhdGlvbiBieSByZW1vdmluZyBzZWNvbmQgZnJhY3Rpb24KLQkJCS8vIGV2ZW4gdGhlIGZpbGUgd2FzIG5vdCBjaGFuZ2VkCi0JCQkvLwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyB2b2lkIHR4RmluaXNoZWQoYm9vbGVhbiBzdWNjZXNzZnVsKSB7Ci0JCWJvb2xlYW4gd2FzTW92ZSA9ICFvbGRVUkkuZXF1YWxzKGZpbmFsVVJJKTsKLQkJaWYgKHN1Y2Nlc3NmdWwpIHsKLQkJCXNldFVSSShmaW5hbFVSSSk7Ci0JCQlzZXRNb2RpZmllZChmYWxzZSk7Ci0JCQl1cGRhdGVUaW1lU3RhbXBzKCk7Ci0JCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlZnJlc2godGhpcyk7Ci0JCQlpZighd2FzTW92ZSkgewotCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZVNldC5nZXRVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyKCkudmFsaWRhdGVNYXJrZXJzKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3RvcmVVUkkoKTsKLQkJCWlmICh3YXNNb3ZlKSB7Ci0JCQkJLy8gcmVzdG9yZSB1cmkgb2YgUmVzb3VyY2VEZXNjcmlwdG9yIG9mIHRoaXMgcmVzb3VyY2UKLQkJCQkvLwotCQkJCU11bHRpRmlsZVNhdmVVdGlsLnVwZGF0ZVVSSU1hcHBpbmdzKHRoaXMsIG9sZFVSSSwgbnVsbCwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9sZFVSSSAhPSBudWxsKSB7Ci0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpOwotCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZVNldC5nZXRVUklUb1RlbXBVUklNYXAoKS5yZW1vdmUob2xkVVJJKTsKLQkJCX0KLQkJCW9sZFVSSSA9IG51bGw7Ci0JCX0KLQkJY3VycmVudFR4SUQgPSBudWxsOwotCQlmaW5hbFVSSSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlQmFja3VwKCkgewotCQlpZiAoYmFja3VwRmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCS8vIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZGVsZXRlKGJhY2t1cEZpbGUpOwotCQkJCW5ldyBGaWxlKGJhY2t1cEZpbGUpLmRlbGV0ZSgpOwotCQkJCWJhY2t1cEZpbGUgPSBudWxsOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlc3RvcmUoKSB7Ci0JCUZpbGUgc3JjID0gbnVsbCwgZGVzdCA9IG51bGw7Ci0JCWJvb2xlYW4gbW92ZWQgPSBmYWxzZTsKLQkJaWYgKGJhY2t1cEZpbGUgIT0gbnVsbCkgewotCQkJc3JjID0gbmV3IEZpbGUoYmFja3VwRmlsZSk7Ci0JCQlkZXN0ID0gbmV3IEZpbGUoZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQltb3ZlZCA9IG9sZFVSSSAhPSBudWxsICYmICFvbGRVUkkuZXF1YWxzKGZpbmFsVVJJKTsKLQkJCWlmIChtb3ZlZCkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldEZpbmFsVVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJCWRlc3QgPSBuZXcgRmlsZShvbGRVUkkudG9GaWxlU3RyaW5nKCkpOwotCQkJCW1vdmVkID0gZmlsZS5leGlzdHMoKSAmJiAhZGVzdC5leGlzdHMoKTsKLQkJCQlpZiAobW92ZWQpIHsKLQkJCQkJc3JjID0gZmlsZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHNyYyAhPSBudWxsKSB7Ci0JCQlpZiAoZGVzdC5leGlzdHMoKSkgewotCQkJCUZpbGVVdGlsLm1vdmVGaWxlKGRlc3QsbmV3IEZpbGUoZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpKTsKLQkJCX0KLQkJCWJvb2xlYW4gc3VjY2VzczsKLQkJCWlmIChtb3ZlZCkgewotCQkJCXN1Y2Nlc3MgPSBNdWx0aUZpbGVTYXZlVXRpbC5tb3ZlKHRoaXMsIHNyYywgZGVzdCk7Ci0JCQkJLy8gaWYoc3VjY2VzcykgewotCQkJCS8vIE11bHRpRmlsZVNhdmVVdGlsLnVwZGF0ZVVSSU1hcHBpbmdzKHRoaXMsIG51bGwpOwotCQkJCS8vIH0KLQkJCX0gZWxzZSB7Ci0JCQkJc3VjY2VzcyA9IEZpbGVVdGlsLm1vdmVGaWxlKHNyYyxkZXN0KTsKLQkJCX0KLQkJCWlmICghc3VjY2VzcykgewotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihOTFMuYmluZCgKLQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlc3RvcmVSZXNvdXJjZUVycm9yX21zZywgdGhpcykpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCVVSSSBnZXRPbGRVUkkoKSB7Ci0JCXJldHVybiBvbGRVUkk7Ci0JfQotCi0JYm9vbGVhbiBtb3ZlU3RhcnRlZCgpIHsKLQkJcmV0dXJuIG9sZFVSSSAhPSBudWxsICYmICFvbGRVUkkuZXF1YWxzKGdldEZpbmFsVVJJKCkpOwotCX0KLQotCWJvb2xlYW4gc2F2ZVN0YXJ0ZWQoKSB7Ci0JCXJldHVybiBjdXJyZW50VHhJRCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbW1pdCgpIHsKLQkJaWYgKGZpbmFsVVJJICE9IG51bGwgJiYgIWdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQlGaWxlIGZpbmFsRmlsZSA9IG5ldyBGaWxlKGZpbmFsVVJJLnRvRmlsZVN0cmluZygpKTsKLQkJCWJvb2xlYW4gd2FzTW92ZSA9ICFvbGRVUkkuZXF1YWxzKGZpbmFsVVJJKTsKLQkJCWlmICh3YXNNb3ZlKSB7Ci0JCQkJT2JqZWN0IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudCh0aGlzKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJCQlpZiAoZmluYWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkvLyBuYW1lIGZvciBmaW5hbEZpbGUgaXMgYWxyZWFkeSB0YWtlbgotCQkJCQkJLy8gdHJ5IHRvIGdldCB0aGUgbmV4dCBhdmFpbGFibGUgbmFtZQotCQkJCQkJLy8KLQkJCQkJCWZpbmFsVVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkoTWV0aG9kTGlicmFyeVBlcnNpc3RlcgotCQkJCQkJCQkuZ2V0TmV4dEF2YWlsYWJsZUZpbGVOYW1lKGZpbmFsRmlsZS5nZXRQYXJlbnQoKQotCQkJCQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IsCi0JCQkJCQkJCQkJKENvbnRlbnREZXNjcmlwdGlvbikgZSkpOwotCQkJCQkJZmluYWxGaWxlID0gbmV3IEZpbGUoZmluYWxVUkkudG9GaWxlU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBiYWNrIHVwIHRoZSBmaWxlCi0JCQkJLy8KLQkJCQlTdHJpbmcgYmFja3VwID0gZ2V0QmFja3VwRmlsZVBhdGgoKTsKLQkJCQlGaWxlIGJha0ZpbGUgPSBuZXcgRmlsZShiYWNrdXApOwotCi0JCQkJLy8gdHJ5aW5nIHRvIGRlbGV0ZSB0aGUgb2xkIGJhY2t1cCBmaWxlIGlmIGl0IGV4aXN0cwotCQkJCS8vCi0JCQkJaWYgKGJha0ZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJYmFrRmlsZS5kZWxldGUoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZmluYWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCS8vIHNvbWUgQ00gcHJvdmlkZXIgbGlrZSBDbGVhckNhc2UgcmVuYW1lZCB0aGUgdmVyc2lvbmVkCi0JCQkJCS8vIGZpbGUgaXQgaXRzIHJlcG9zaXRvcnkgYXMgc29vbiBhcyB1c2VyIHJlbmFtZWQgdGhlIGZpbGUKLQkJCQkJLy8gaW4gdGhlIHdvcmtzcGFjZS4gVG8gYXZvaWQgdGhpcywgdXNlIG9ubHkgcmVndWxhciByZW5hbWUKLQkJCQkJLy8gcm91dGluZSBvZiBqYXZhLmlvLkZpbGUgaW5zdGVhZCBvZiBJUmVzb3VyY2Ugcm91dGluZQotCQkJCQkvLwotCQkJCQlpZiAoRmlsZVV0aWwubW92ZUZpbGUoZmluYWxGaWxlLCBiYWtGaWxlKSkgewotCQkJCQkJYmFja3VwRmlsZSA9IGJhY2t1cDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVuYW1lRXJyb3JfbXNnLAotCQkJCQkJCQlmaW5hbEZpbGUsIGJhY2t1cCk7Ci0JCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24obXNnKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmVuYW1lIHRoZSByZXNvdXJjZSBmaWxlIHRvIHRoZSBvcmlnaW5hbCBuYW1lCi0JCQkvLwotCQkJRmlsZSBjdXJyZW50RmlsZSA9IG5ldyBGaWxlKHdhc01vdmUgPyBvbGRVUkkudG9GaWxlU3RyaW5nKCkKLQkJCQkJOiBnZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJCWlmICh3YXNNb3ZlKSB7Ci0JCQkJc3VjY2VzcyA9IE11bHRpRmlsZVNhdmVVdGlsLm1vdmUodGhpcywgY3VycmVudEZpbGUsIGZpbmFsRmlsZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHNvbWUgQ00gcHJvdmlkZXIgbGlrZSBDbGVhckNhc2UgcmVuYW1lZCB0aGUgdmVyc2lvbmVkIGZpbGUgaXQKLQkJCQkvLyBpdHMgcmVwb3NpdG9yeSBhcyBzb29uIGFzIHVzZXIgcmVuYW1lZCB0aGUgZmlsZQotCQkJCS8vIGluIHRoZSB3b3Jrc3BhY2UuIFRvIGF2b2lkIHRoaXMsIHVzZSBvbmx5IHJlZ3VsYXIgcmVuYW1lCi0JCQkJLy8gcm91dGluZSBvZiBqYXZhLmlvLkZpbGUgaW5zdGVhZCBvZiBJUmVzb3VyY2Ugcm91dGluZQotCQkJCS8vCi0JCQkJc3VjY2VzcyA9IEZpbGVVdGlsLm1vdmVGaWxlKGN1cnJlbnRGaWxlLCBmaW5hbEZpbGUpOwotCQkJfQotCQkJaWYgKCFzdWNjZXNzKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlbmFtZUVycm9yX21zZywKLQkJCQkJCWN1cnJlbnRGaWxlLCBmaW5hbEZpbGUpOwotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihtc2cpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAod2FzTW92ZSkgewotCQkJCQkvLyByZWZyZXNoIHJlc29sdmUgVVJJIG9mIFJlc291cmNlRGVzY3JpcHRvciBvZiB0aGlzCi0JCQkJCS8vIHJlc291cmNlCi0JCQkJCS8vCi0JCQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCQkuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKHRoaXMpOwotCQkJCQlpZiAocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJCQlyZXNEZXNjLmNsZWFyUmVzb2x2ZWRVUkkoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZyBtc2cgPSAiRkFUQUwgRVJST1I6IG5vIFJlc291cmNlRGVzY3JpcHRvciBmb3VuZCBpbiBwYXJlbnQgcmVzb3VyY2UgZm9yICIgKyB0aGlzOyAvLyROT04tTkxTLTEkCi0JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKG1zZyk7Ci0JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQkJCQkJfQotCi0JCQkJCS8vIHJlZnJlc2ggcmVzb2x2ZSBVUklzIGluIFJlc291cmNlRGVzY3JpcHRvcnMgb2YgdGhlIGNoaWxkCi0JCQkJCS8vIHJlc291cmNlcyBvZiB0aGlzIHJlc291cmNlCi0JCQkJCS8vCi0JCQkJCUhhc2hNYXAgb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgPSBudWxsOwotCQkJCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCQkuZ2V0UmVzb3VyY2VNYW5hZ2VyKHRoaXMpOwotCQkJCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCQkJCW9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc01nci5lQWxsQ29udGVudHMoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUmVzb3VyY2VEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKChSZXNvdXJjZURlc2NyaXB0b3IpIG9iaik7Ci0JCQkJCQkJCW9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwLnB1dChkZXNjCi0JCQkJCQkJCQkJLmdldFJlc29sdmVkVVJJKCksIGRlc2MpOwotCQkJCQkJCQlkZXNjLmNsZWFyUmVzb2x2ZWRVUkkoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyByZWZyZXNoIFVSSSBvZiBsb2FkZWQgY2hpbGQgcmVzb3VyY2VzIG9mIHRoaXMgcmVzb3VyY2UKLQkJCQkJLy8KLQkJCQkJaWYgKG9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwICE9IG51bGwpIHsKLQkJCQkJCS8vIGdvIHRocnUgdGhlIGxpc3Qgb2YgbG9hZGVkIHJlc291cmNlcyBpbiByZXNvdXJjZSBzZXQKLQkJCQkJCS8vIHRvIHVwZGF0ZSB0aGUgVVJJCi0JCQkJCQkvLwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpIG9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwCi0JCQkJCQkJCQkuZ2V0KHJlcy5nZXRVUkkoKSk7Ci0JCQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJCQlyZXMuc2V0VVJJKGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc291cmNlU2F2ZWQodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2t1cEZpbGVQYXRoKCkgewotCQlTdHJpbmcgYmFja3VwRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0VGVtcERpcigpKQotCQkJCS5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpCi0JCQkJLmFwcGVuZChjdXJyZW50VHhJRCkKLQkJCQkuYXBwZW5kKCJvbGQiKS5hcHBlbmQoUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQodGhpcykuZ2V0R3VpZCgpKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBiYWNrdXBGaWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxhc3RMb2FkVGltZVN0YW1wCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TGFzdExvYWRUaW1lU3RhbXAoKSB7Ci0JCXJldHVybiBsYXN0TG9hZFRpbWVTdGFtcDsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBjbGVhckRldGFjaGVkRU9iamVjdFRvSURNYXAoKSB7Ci0JCURFVEFDSEVEX0VPQkpFQ1RfVE9fSURfTUFQLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc0Rlc2MKLQkgKi8KLQl2b2lkIHNldFJlc291cmNlRGVzY3JpcHRvcihSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYykgewotCQlyZXNvdXJjZURlc2NyaXB0b3IgPSByZXNEZXNjOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2UjZ2V0TG9hZFN0YW1wKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRMb2FkU3RhbXAoKSB7Ci0JCXJldHVybiBnZXRMYXN0TG9hZFRpbWVTdGFtcCgpOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0UHJveHlVUkkoRU9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGd1aWQgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKG9iamVjdCk7Ci0JCWlmIChndWlkICE9IG51bGwpIHsKLQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNvdXJjZURlc2NyaXB0b3IgPSB0aGlzLnJlc291cmNlRGVzY3JpcHRvciAhPSBudWxsID8gdGhpcy5yZXNvdXJjZURlc2NyaXB0b3IgOgotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZURlc2NyaXB0b3IodGhpcyk7Ci0JCQlVUkkgdXJpID0gcmVzb3VyY2VEZXNjcmlwdG9yICE9IG51bGwgPyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIKLQkJCQkJLmNyZWF0ZVVSSShyZXNvdXJjZURlc2NyaXB0b3IuZ2V0SWQoKSkgOiBnZXRVUkkoKTsKLQkJCXJldHVybiB1cmkuYXBwZW5kRnJhZ21lbnQoZ3VpZCk7Ci0JCX0KLQkJcmV0dXJuIGdldFVSSSgpLmFwcGVuZEZyYWdtZW50KGdldElEKG9iamVjdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR4SUQoU3RyaW5nIHR4SUQpIHsKLQkJc2V0VGVtcFVSSSh0eElEKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSVNhdmVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JU2F2ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjlkOGFiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JU2F2ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkV4dGVuZGVkTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5FUEZWZXJzaW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBYTUxTYXZlIGltcGxlbWVudGF0aW9uIGZvciBsaWJyYXJ5IFhNSSBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxlWE1JU2F2ZUltcGwgZXh0ZW5kcyBYTUlTYXZlSW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VUID0gIlNBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlIG9wdGlvbnMgdG8gZm9yY2Ugc2F2aW5nIGFsbCByZXNvdXJjZXMgaW4gdGhlIHJlc291cmNlIHNldCwgd2hldGhlcgotCSAqIHRoZXkgaGF2ZSBiZWVuIG1vZGlmaWVkIG9yIHVuY2hhbmdlZC4gSXRzIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgInRydWUiCi0JICogb3IgImZhbHNlIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfQUxMID0gIlNBVkVfQUxMIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZSBvcHRpb24gdG8gc2F2ZSBvYmplY3RzIG9mIHRoZSBzYXZlIHR5cGUgdG9nZXRoZXIgaW4gdGhlIHNhbWUgZmlsZSBpZgotCSAqIE11bHRpRmlsZVV0aWwuY3JlYXRlRmlsZVVSSSgpIHJldHVybnMgdGhlIHNhbWUgVVJJIGZvciB0aGVtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfVE9HRVRIRVJfQ0xBU1NfU0VUID0gIlNBVkVfVE9HRVRIRVJfQ0xBU1NfU0VUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS19VUF9CRUZPUkVfU0FWRSA9ICJCQUNLX1VQX0JFRk9SRV9TQVZFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMgPSAiRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGSUVEX1JFU09VUkNFX1NFVCA9ICJNT0RJRklFRF9SRVNPVVJDRV9TRVQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlIG9wdGlvbiB0byBzcGVjaWZ5IGEgVHhSZWNvcmQgdG8gbG9nIHRoZSB0cmFuc2FjdGlvbmFsIGRhdGEgZm9yCi0JICogZmFpbC1zYWZlIHBlcnNpc3RlbmNlCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0JICogQHNlZSBUeFJlY29yZAotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFhfUkVDT1JEID0gIlRYX1JFQ09SRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJX0ZJTEUgPSAiTVVMVElfRklMRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNhdmUgb3B0aW9uIHRvIHJlZnJlc2ggdGhlIHdvcmtzcGFjZSB3aGVuIG5ldyByZXNvdXJjZSBpcyBjcmVhdGVkIGFuZAotCSAqIHNhdmVkLiBJdHMgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyAidHJ1ZSIgb3IgImZhbHNlIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0hfTkVXX1JFU09VUkNFID0gIlJFRlJFU0hfTkVXX1JFU09VUkNFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZSBvcHRpb24gdG8gY2hlY2sgdGhlIHJlc291cmNlIGZvciBtb2RpZmlhYmxlIGJlZm9yZSBzYXZpbmcgaXQuIEl0cwotCSAqIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgInRydWUiIG9yICJmYWxzZSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19NT0RJRlkgPSAiQ0hFQ0tfTU9ESUZZIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZTsKLQlwcml2YXRlIFNldCBzYXZlU2VwYXJhdGVseUNsYXNzU2V0OwotCi0JcHJpdmF0ZSBNYXAgb3B0aW9uczsKLQotCS8qKgotCSAqIEBwYXJhbSBoZWxwZXIKLQkgKi8KLQlwdWJsaWMgTXVsdGlGaWxlWE1JU2F2ZUltcGwoWE1MSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihoZWxwZXIpOwotCX0KLQotCVhNTEhlbHBlciBnZXRYTUxIZWxwZXIoKSB7Ci0JCXJldHVybiBoZWxwZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MU2F2ZUltcGwjaW5pdChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlLAotCSAqICAgICAgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KFhNTFJlc291cmNlIHJlc291cmNlLCBNYXAgb3B0cykgewotCQlzdXBlci5pbml0KHJlc291cmNlLCBvcHRzKTsKLQotCQlpZiAoZXNjYXBlICE9IG51bGwpIHsKLQkJCS8vIHVzZSBNeUVzY2FwZSB0byBpZ25vcmUgd2hpdGVzcGFjZXMKLQkJCS8vCi0JCQllc2NhcGUgPSBuZXcgTXlFc2NhcGUoKTsKLQkJfQotCi0JCXNhdmVTZXBhcmF0ZWx5Q2xhc3NTZXQgPSAoU2V0KSBvcHRzLmdldChTQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VUKTsKLQkJb3B0aW9ucyA9IG9wdHM7Ci0KLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQlpZiAocmVzb3VyY2VTZXQgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VTZXQgPSBuZXcgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JYm9vbGVhbiBjYW5TYXZlU2VwYXJhdGVseShPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBNdWx0aUZpbGVTYXZlVXRpbC5oYXNPd25SZXNvdXJjZShvYmosIHNhdmVTZXBhcmF0ZWx5Q2xhc3NTZXQpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFVtYUhSRUYoUmVzb3VyY2UgcmVzb3VyY2UsIEludGVybmFsRU9iamVjdCBvKSB7Ci0JCWlmIChvLmVJc1Byb3h5KCkKLQkJCQkmJiBvLmVQcm94eVVSSSgpLnNjaGVtZSgpLmVxdWFscyhNdWx0aUZpbGVVUklDb252ZXJ0ZXIuU0NIRU1FKSkgewotCQkJcmV0dXJuIG8uZVByb3h5VVJJKCkudG9TdHJpbmcoKTsKLQkJfQotCQlTdHJpbmcgaHJlZiA9IG51bGw7Ci0JCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJaHJlZiA9IGhlbHBlci5nZXRIUkVGKG8pOwotCQl9Ci0JCWlmIChocmVmID09IG51bGwpIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigiQ291bGQgbm90IGZpbmQgcmVzb3VyY2UgZGVzY3JpcHRvciBmb3IgcmVzb3VyY2UgIiArIHJlc291cmNlICsgIlxuICBvYmplY3Q6ICIgKyBvKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0SFJFRihyZXNvdXJjZSwgbyk7Ci0JCX0KLQkJcmV0dXJuIGhyZWY7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MU2F2ZUltcGwjc2F2ZUhyZWYob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVIcmVmKEVPYmplY3QgcmVtb3RlLCBFU3RydWN0dXJhbEZlYXR1cmUgZikgewotCQlpZiAoZiBpbnN0YW5jZW9mIEVSZWZlcmVuY2UgJiYgKChFUmVmZXJlbmNlKSBmKS5pc0NvbnRhaW5tZW50KCkKLQkJCQkmJiAhdG9ET00pIHsKLQkJCS8vIGlmIHRoaXMgSFJFRiBpcyBhIGNvbnRhaW5lZCBlbGVtZW50LCBzYXZlIGl0cyBJRCBhdHRyaWJ1dGUgc28gdGhlCi0JCQkvLyBwcm94eSBjYW4gYmUgY2FjaGVkIGluIHRoZQotCQkJLy8gR1VJRFRvRWxlbWVudE1hcCBmb3IgdGVtcG9yYXJ5IHVzZSBiZWZvcmUgaXQgY2FuIGJlIHJlc29sdmVkLgotCQkJLy8gVGhpcyBoZWxwcyBpbXByb3ZlIGxvYWRpbmcgdGltZS4KLQkJCS8vCi0JCQlTdHJpbmcgaHJlZiA9IGhlbHBlci5nZXRIUkVGKHJlbW90ZSk7Ci0JCQlpZiAoaHJlZiAhPSBudWxsKSB7Ci0JCQkJaWYgKGVzY2FwZVVSSSAhPSBudWxsKSB7Ci0JCQkJCWhyZWYgPSBlc2NhcGVVUkkuY29udmVydChocmVmKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5hbWUgPSBoZWxwZXIuZ2V0UU5hbWUoZik7Ci0JCQkJZG9jLnN0YXJ0RWxlbWVudChuYW1lKTsKLQkJCQlFQ2xhc3MgZUNsYXNzID0gcmVtb3RlLmVDbGFzcygpOwotCQkJCUVDbGFzcyBleHBlY3RlZFR5cGUgPSAoRUNsYXNzKSBmLmdldEVUeXBlKCk7Ci0JCQkJaWYgKHNhdmVUeXBlSW5mbyA/IHhtbFR5cGVJbmZvLnNob3VsZFNhdmVUeXBlKGVDbGFzcywKLQkJCQkJCWV4cGVjdGVkVHlwZSwgZikgOiBlQ2xhc3MgIT0gZXhwZWN0ZWRUeXBlCi0JCQkJCQkmJiBleHBlY3RlZFR5cGUuaXNBYnN0cmFjdCgpKSB7Ci0JCQkJCXNhdmVUeXBlQXR0cmlidXRlKGVDbGFzcyk7Ci0JCQkJfQotCQkJCVN0cmluZyBpZCA9IGhlbHBlci5nZXRJRChyZW1vdGUpOwotCQkJCWlmIChpZCAhPSBudWxsKSB7Ci0JCQkJCWRvYy5hZGRBdHRyaWJ1dGUoaWRBdHRyaWJ1dGVOYW1lLCBpZCk7Ci0JCQkJfQotCQkJCWRvYy5hZGRBdHRyaWJ1dGUoWE1MUmVzb3VyY2UuSFJFRiwgaHJlZik7Ci0JCQkJaWYgKGVPYmplY3RUb0V4dGVuc2lvbk1hcCAhPSBudWxsKSB7Ci0JCQkJCXByb2Nlc3NBdHRyaWJ1dGVFeHRlbnNpb25zKHJlbW90ZSk7Ci0JCQkJCWlmIChwcm9jZXNzRWxlbWVudEV4dGVuc2lvbnMocmVtb3RlKSkgewotCQkJCQkJZG9jLmVuZEVsZW1lbnQoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWRvYy5lbmRFbXB0eUVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWRvYy5lbmRFbXB0eUVsZW1lbnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5zYXZlSHJlZihyZW1vdGUsIGYpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFNhdmVJbXBsI3NhdmVGZWF0dXJlcyhvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzYXZlRmVhdHVyZXMoRU9iamVjdCBvKSB7Ci0JCXRyeSB7Ci0JCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBvCi0JCQkJCS5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJRU9iamVjdCBjb250YWluZXIgPSBvLmVDb250YWluZXIoKTsKLQkJCQlJbnRlcm5hbEVPYmplY3QgaW50ZXJuYWxFT2JqZWN0ID0gKChJbnRlcm5hbEVPYmplY3QpIG8pOwotCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBjYW5TYXZlU2VwYXJhdGVseShvKQotCQkJCQkJJiYgY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJYm9vbGVhbiBjb250YWluc05ld0ZlYXR1cmUgPSAocmVzb3VyY2UgPT0gY29udGFpbmVyCi0JCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIG87Ci0JCQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCQkJCS5jcmVhdGVGaWxlVVJJKChNZXRob2RFbGVtZW50KSBvKTsKLQkJCQkJaWYgKGNvbnRhaW5zTmV3RmVhdHVyZSkgewotCQkJCQkJaWYgKCFpbnRlcm5hbEVPYmplY3QuZUlzUHJveHkoKSkgewotCQkJCQkJCXJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCQkJCS5zYXZlKG8sIHVyaSwgb3B0aW9ucyk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBjaGVjayBpZiB0aGVyZSBpcyBhIFJlc291cmNlRGVzY3JpcHRvciBmb3IgdGhpcwotCQkJCQkJLy8gZWxlbWVudAotCQkJCQkJLy8gY3JlYXRlIGEgbmV3IG9uZSBpZiBuZWVkZWQKLQkJCQkJCS8vCi0JCQkJCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCQkJLmdldFJlc291cmNlTWFuYWdlcihjb250YWluZXIuZVJlc291cmNlKCkpOwotCQkJCQkJaWYgKHJlc01nciAhPSBudWxsCi0JCQkJCQkJCSYmIHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3IoZS5nZXRHdWlkKCkpID09IG51bGwpIHsKLQkJCQkJCQkvLyBtYWtlIHN1cmUgdGhhdCBubyBvdGhlciBSZXNvdXJjZU1hbmFnZXIgaGFzIGEKLQkJCQkJCQkvLyBSZXNvdXJjZURlc2NyaXB0b3IgZm9yIHRoaXMgZWxlbWVudAotCQkJCQkJCS8vCi0JCQkJCQkJTXVsdGlGaWxlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIHJlc291cmNlCi0JCQkJCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQkJCQlpZiAodXJpQ29udmVydGVyCi0JCQkJCQkJCQkuZmluZFJlc291cmNlRGVzY3JpcHRvcihlLmdldEd1aWQoKSkgPT0gbnVsbCkgewotCQkJCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5yZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIoCi0JCQkJCQkJCQkJcmVzTWdyLCBlLCByZXNvdXJjZS5nZXRGaW5hbFVSSSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlTdHJpbmcgaHJlZiA9IGdldFVtYUhSRUYocmVzb3VyY2UsIGludGVybmFsRU9iamVjdCk7Ci0JCQkJCWRvYy5hZGRBdHRyaWJ1dGUoWE1MUmVzb3VyY2UuSFJFRiwgaHJlZik7Ci0JCQkJCWVuZFNhdmVGZWF0dXJlcyhvLCAwLCBudWxsKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWlmIChvIGluc3RhbmNlb2YgUmVzb3VyY2VNYW5hZ2VyCi0JCQkJCQkmJiBoZWxwZXIuZ2V0UmVzb3VyY2UoKSAhPSByZXNvdXJjZSkgewotCQkJCQlTdHJpbmcgaHJlZiA9IGdldFVtYUhSRUYocmVzb3VyY2UsIGludGVybmFsRU9iamVjdCk7Ci0JCQkJCWRvYy5hZGRBdHRyaWJ1dGUoWE1MUmVzb3VyY2UuSFJFRiwgaHJlZik7Ci0JCQkJCWVuZFNhdmVGZWF0dXJlcyhvLCAwLCBudWxsKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLnNhdmVGZWF0dXJlcyhvKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVSUk9SIHNhdmluZyBmZWF0dXJlOiAiICsgbyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAgRmVhdHVyZSByZXNvdXJjZTogIiArIG8uZVJlc291cmNlKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlTYXZlSW1wbCNhZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZURlY2xhcmF0aW9ucygpIHsKLQkJc3VwZXIuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zKCk7Ci0JCQotCQlpZiAoIXRvRE9NKSB7Ci0JCQkvLyBzYXZlIHRvb2wgdmVyc2lvbiBpbmZvCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gVmVyc2lvblV0aWwuZ2V0QWxsVG9vbElEcygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHRvb2xJRCA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0JCQkJRVBGVmVyc2lvbnMgZXBmVmVyc2lvbnMgPSBWZXJzaW9uVXRpbC5nZXRWZXJzaW9ucyh0b29sSUQpOwotCQkJCVN0cmluZyBuc1VyaSA9IGVwZlZlcnNpb25zLmdldE5zVVJJKCk7Ci0JCQkJZG9jLmFkZEF0dHJpYnV0ZShFeHRlbmRlZE1ldGFEYXRhLlhNTE5TX1BSRUZJWCArICI6IiArIHRvb2xJRCwgbnNVcmkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHRvb2xWZXJzaW9uID0gZXBmVmVyc2lvbnMuZ2V0TWluVG9vbFZlcnNpb25Gb3JDdXJyZW50TGlicmFyeVZlcnNpb24oKS5nZXRUb29sVmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JCQkJZG9jLmFkZEF0dHJpYnV0ZSh0b29sSUQgKyAiOnZlcnNpb24iLCB0b29sVmVyc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhdHlwZVZhbHVlKE9iamVjdCB2YWx1ZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGYsCi0JICogYm9vbGVhbiBpc0F0dHJpYnV0ZSkgeyBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCSAqIFN0cmluZyBzdHIgPSAoU3RyaW5nKXZhbHVlOyBpZiAoc3RyLmluZGV4T2YoIlxyIikgPiAwKSB7IHN0ciA9Ci0JICogc3RyLnJlcGxhY2VBbGwoIlxyIiwgIiIpOyByZXR1cm4gc3VwZXIuZ2V0RGF0YXR5cGVWYWx1ZShzdHIsIGYsCi0JICogaXNBdHRyaWJ1dGUpOyB9IH07IHJldHVybiBzdXBlci5nZXREYXRhdHlwZVZhbHVlKHZhbHVlLCBmLCBpc0F0dHJpYnV0ZSk7IH0KLQkgKi8KLQotCS8vIFRPRE86IG5lZWRzIHRvIHJldmlzaXQgdGhpcyBjbGFzcyBzaW5jZSBpdHMgYmFzZSBjbGFzcyBoYXMgYmVlbiB1cGRhdGVkIGEKLQkvLyBsb3QgaW4gRU1GIDIuMgotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTXlFc2NhcGUgZXh0ZW5kcyBFc2NhcGUgewotCQlwcm90ZWN0ZWQgZmluYWwgY2hhcltdIEdSRUFURVIgPSB7ICcmJywgJ2cnLCAndCcsICc7JyB9OwotCi0JCXByb3RlY3RlZCBmaW5hbCBjaGFyW10gQkxBTksgPSB7fTsKLQotCQlwdWJsaWMgTXlFc2NhcGUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoKLQkJICogQ29udmVydHM6ICYgdG8gJmFtcDsgPCB0byAmbHQ7ICIgdG8gJnF1b3Q7IFx0IHRvICYjeDk7IFxuIHRvICYjeEE7IFxyCi0JCSAqIHRvICYjeEQ7Ci0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnQoU3RyaW5nIGlucHV0KSB7Ci0JCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJCWludCBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCgpOwotCQkJZ3JvdyhpbnB1dExlbmd0aCk7Ci0JCQlpbnB1dC5nZXRDaGFycygwLCBpbnB1dExlbmd0aCwgdmFsdWUsIDApOwotCQkJaW50IHBvcyA9IDA7Ci0JCQljaGFyIGNoID0gMDsKLQkJCXdoaWxlIChpbnB1dExlbmd0aC0tID4gMCkgewotCQkJCWNoID0gdmFsdWVbcG9zXTsKLQkJCQlzd2l0Y2ggKGNoKSB7Ci0JCQkJY2FzZSAnJic6Ci0JCQkJCXBvcyA9IHJlcGxhY2UocG9zLCBBTVAsIGlucHV0TGVuZ3RoKTsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJzwnOgotCQkJCQlwb3MgPSByZXBsYWNlKHBvcywgTEVTUywgaW5wdXRMZW5ndGgpOwotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPic6Ci0JCQkJCXBvcyA9IHJlcGxhY2UocG9zLCBHUkVBVEVSLCBpbnB1dExlbmd0aCk7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlICciJzoKLQkJCQkJcG9zID0gcmVwbGFjZShwb3MsIFFVT1RFLCBpbnB1dExlbmd0aCk7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQkvKgotCQkJCQkgKiBpZiAoIVhNTENoYXIuaXNWYWxpZChjaCkpIHsgdGhyb3cgbmV3Ci0JCQkJCSAqIFJ1bnRpbWVFeGNlcHRpb24oIkFuIGludmFsaWQgWE1MIGNoYXJhY3RlciAoVW5pY29kZTogMHgiICsKLQkJCQkJICogSW50ZWdlci50b0hleFN0cmluZyhjaCkrIikgd2FzIGZvdW5kIGluIHRoZSBlbGVtZW50Ci0JCQkJCSAqIGNvbnRlbnQ6IiAraW5wdXQpOyB9Ci0JCQkJCSAqLwotCQkJCQlwb3MrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNoYW5nZWQgPyBuZXcgU3RyaW5nKHZhbHVlLCAwLCBwb3MpIDogaW5wdXQ7Ci0JCX0KLQotCQkvKioKLQkJICogQ29udmVydHM6ICYgdG8gJmFtcDsgPCB0byAmbHQ7ID4gdG8gJmd0OyAiIHRvICZxdW90OyBcbiB0bwotCQkgKiBwbGF0Zm9ybS1kZXBlbmRlbnQgbGluZSBicmVha2luZyBjaGFyYWN0ZXIKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgY29udmVydFRleHQoU3RyaW5nIGlucHV0KSB7Ci0JCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJCWludCBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCgpOwotCQkJZ3JvdyhpbnB1dExlbmd0aCk7Ci0JCQlpbnB1dC5nZXRDaGFycygwLCBpbnB1dExlbmd0aCwgdmFsdWUsIDApOwotCQkJaW50IHBvcyA9IDA7Ci0JCQl3aGlsZSAoaW5wdXRMZW5ndGgtLSA+IDApIHsKLQkJCQlzd2l0Y2ggKHZhbHVlW3Bvc10pIHsKLQkJCQljYXNlICcmJzoKLQkJCQkJcG9zID0gcmVwbGFjZShwb3MsIEFNUCwgaW5wdXRMZW5ndGgpOwotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPCc6Ci0JCQkJCXBvcyA9IHJlcGxhY2UocG9zLCBMRVNTLCBpbnB1dExlbmd0aCk7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlICc+JzoKLQkJCQkJcG9zID0gcmVwbGFjZShwb3MsIEdSRUFURVIsIGlucHV0TGVuZ3RoKTsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyInOgotCQkJCQlwb3MgPSByZXBsYWNlKHBvcywgUVVPVEUsIGlucHV0TGVuZ3RoKTsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xyJzoKLQkJCQkJcG9zID0gcmVwbGFjZShwb3MsIEJMQU5LLCBpbnB1dExlbmd0aCk7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdcbic6Ci0JCQkJCXBvcyA9IHJlcGxhY2UocG9zLCBMSU5FX0ZFRUQsIGlucHV0TGVuZ3RoKTsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXBvcysrOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2hhbmdlZCA/IG5ldyBTdHJpbmcodmFsdWUsIDAsIHBvcykgOiBpbnB1dDsKLQkJfQotCi0JCS8qCi0JCSAqIFRha2VuIGZyb20gWE1MU2F2ZUltcGwkRXNjYXBlLmNvbnZlcnRUZXh0LCBhbmQgYWRkZWQgY29udmVyc2lvbiBvZiA+Ci0JCSAqIFRoaXMgaXMgdXNlZCBmb3IgWExJRkYncyAtIGNoYW5nZSBpdCdzIG5hbWUgc28gaXQgZG9lc24ndCBpbXBhY3QgRU1GCi0JCSAqIHNhdmluZyBDb252ZXJ0OiAmIHRvICZhbXA7IDwgdG8gJmx0OyAiIHRvICZxdW90OyBcbiB0byBsaW5lIHNlcGFyYXRvcgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBteUNvbnZlcnRUZXh0KFN0cmluZyBpbnB1dCkgewotCQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCQlpbnQgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgoKTsKLQkJCWdyb3coaW5wdXRMZW5ndGgpOwotCQkJaW5wdXQuZ2V0Q2hhcnMoMCwgaW5wdXRMZW5ndGgsIHZhbHVlLCAwKTsKLQkJCWludCBwb3MgPSAwOwotCQkJd2hpbGUgKGlucHV0TGVuZ3RoLS0gPiAwKSB7Ci0JCQkJc3dpdGNoICh2YWx1ZVtwb3NdKSB7Ci0JCQkJY2FzZSAnJic6Ci0JCQkJCXBvcyA9IHJlcGxhY2UocG9zLCBBTVAsIGlucHV0TGVuZ3RoKTsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJzwnOgotCQkJCQlwb3MgPSByZXBsYWNlKHBvcywgTEVTUywgaW5wdXRMZW5ndGgpOwotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPic6Ci0JCQkJCXBvcyA9IHJlcGxhY2UocG9zLCBHUkVBVEVSLCBpbnB1dExlbmd0aCk7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlICciJzoKLQkJCQkJcG9zID0gcmVwbGFjZShwb3MsIFFVT1RFLCBpbnB1dExlbmd0aCk7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdcbic6IHsKLQkJCQkJcG9zID0gcmVwbGFjZShwb3MsIExJTkVfRkVFRCwgaW5wdXRMZW5ndGgpOwotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWRlZmF1bHQ6Ci0JCQkJCXBvcysrOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBjaGFuZ2VkID8gbmV3IFN0cmluZyh2YWx1ZSwgMCwgcG9zKSA6IGlucHV0OwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrTW9kaWZ5UmVxdWlyZWQoTWFwIG9wdGlvbnMpIHsKLQkJT2JqZWN0IG9wdCA9IG9wdGlvbnMuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkNIRUNLX01PRElGWSk7Ci0JCXJldHVybiBvcHQgIT0gbnVsbCA/IEJvb2xlYW4udmFsdWVPZihvcHQudG9TdHJpbmcoKSkuYm9vbGVhblZhbHVlKCkKLQkJCQk6IGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYzBjYjg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBmb3IgdGhlIExpYnJhcnkgUGVyc2lzdGVuY2UgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBQZXJzaXN0ZW5jZVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvVHhSZWNvcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9UeFJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOWMwZWFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9UeFJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGtlZXAgdGhlIHRyYW5zYWN0aW9uIGRhdGEgdG8gc3VwcG9ydCBmYWlsLXNhZmUgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotY2xhc3MgVHhSZWNvcmQgewotCi0JcHJpdmF0ZSBTdHJpbmcgdHhJRDsKLQotCXByaXZhdGUgTGlzdCByZXNvdXJjZXNUb0NvbW1pdDsKLQotCXByb3RlY3RlZCBMaXN0IHdhcm5pbmdzOwotCi0JLyoqCi0JICogQHBhcmFtIHR4aWQKLQkgKiBAcGFyYW0gY29tbWl0Ci0JICovCi0JcHVibGljIFR4UmVjb3JkKCkgewotCQlzdXBlcigpOwotCQlyZXNvdXJjZXNUb0NvbW1pdCA9IG5ldyBVbmlxdWVFTGlzdCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHhJRCgpIHsKLQkJaWYgKHR4SUQgPT0gbnVsbCkgewotCQkJdHhJRCA9IFVtYVV0aWwuZ2VuZXJhdGVHVUlEKCk7Ci0JCX0KLQkJcmV0dXJuIHR4SUQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VzVG9Db21taXQoKSB7Ci0JCXJldHVybiByZXNvdXJjZXNUb0NvbW1pdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB3YXJuaW5ncwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdhcm5pbmdzKCkgewotCQlpZiAod2FybmluZ3MgPT0gbnVsbCkgewotCQkJd2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIHdhcm5pbmdzOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQl0eElEID0gbnVsbDsKLQkJcmVzb3VyY2VzVG9Db21taXQuY2xlYXIoKTsKLQkJaWYgKHdhcm5pbmdzICE9IG51bGwpIHsKLQkJCXdhcm5pbmdzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9Vbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9Vbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTg4ZTIyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLS8qKgotICogRXhjZXB0aW9uIGZvciBVUkkgdGhhdCBjYW5ub3QgYmUgbm9ybWFsaXplZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVubm9ybWFsaXplZFVSSUV4Y2VwdGlvbiBleHRlbmRzIE11bHRpRmlsZUlPRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLQkJc3VwZXIobXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDgxMjkzMTYyMTA3NTUzMzc4MTZMOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvWE1JTGlicmFyeVBlcnNpc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1hNSUxpYnJhcnlQZXJzaXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDU4MGFhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvWE1JTGlicmFyeVBlcnNpc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMTAsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5UGVyc2lzdGVyIGltcGxlbWVudHMgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgewotCQotCS8qKgotCSAqIENvbnRydWN0cyBhIG5ldyBYTUlMaWJyYXJ5UGVyc2lzdGVyIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBYTUlMaWJyYXJ5UGVyc2lzdGVyKCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNnZXRGaWxlRXh0ZW5zaW9uKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldEZpbGVFeHRlbnNpb24oZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2dldEZvbGRlclJlbGF0aXZlUGF0aChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb2xkZXJSZWxhdGl2ZVBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldEZvbGRlclJlbGF0aXZlUGF0aChlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjaGFzT3duRm9sZGVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duRm9sZGVyKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmhhc093bkZvbGRlcihlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUxpYnJhcnlQZXJzaXN0ZXIjYWRqdXN0TG9jYXRpb24ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdExvY2F0aW9uKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNkZWxldGUob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShNZXRob2RFbGVtZW50IGUpIHsKLQkJTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5kZWxldGUoZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI2dldEZhaWxTYWZlUGVyc2lzdGVyKCkKLQkgKi8KLQlwdWJsaWMgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldEZhaWxTYWZlUGVyc2lzdGVyKCkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNnZXRXYXJuaW5ncygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2FybmluZ3MoKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldFdhcm5pbmdzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI2hhc093blJlc291cmNlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2UoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuaGFzT3duUmVzb3VyY2UoZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI2hhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI3NhdmUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLnNhdmUocmVzb3VyY2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNzYXZlKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0Uuc2F2ZShlbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9YTUlMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvWE1JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YzJhZjk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9YTUlMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAyNywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkgaW1wbGVtZW50cyBJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSNjcmVhdGVMaWJyYXJ5UmVzb3VyY2VTZXQoKQotCSAqLwotCXB1YmxpYyBJTGlicmFyeVJlc291cmNlU2V0IGNyZWF0ZUxpYnJhcnlSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIG5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSNnZXRQZXJzaXN0ZW5jZVR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGVyc2lzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL0lNaWdyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9JTWlncmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDY2MTFhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL0lNaWdyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIE1pZ3JhdGVzIG9uZSB2ZXJzaW9uIG9mIFVNQSBsaWJyYXJ5IHRvIGFub3RoZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWlncmF0b3IgewotCi0Jdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb247Ci0Jdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pIHRocm93cyBFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vTWFwcGluZ1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vTWFwcGluZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDNiOWFmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01hcHBpbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkVQRlZlcnNpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIHN0YXRpYyBjb252ZW5pZW5jZSBtZXRob2RzIHRvIHBlcmZvcm0gbGlicmFyeSB1cGdyYWRlIGZyb20KLSAqIG9sZGVyIHZlcnNpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYXBwaW5nVXRpbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNaWdyYXRvciB7Ci0JCUJ1bmRsZSBidW5kbGU7Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZTsKLQotCQlTdHJpbmcgbGliTnNVUkk7Ci0KLQkJSU1pZ3JhdG9yIGluc3RhbmNlOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gYnVuZGxlCi0JCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkJICogQHBhcmFtIGxpYk5zVVJJCi0JCSAqLwotCQlwdWJsaWMgTWlncmF0b3IoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGxpYk5zVVJJKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJCXRoaXMubGliTnNVUkkgPSBsaWJOc1VSSTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIE1hcCBtaWdyYXRvcnM7Ci0JcHJpdmF0ZSBzdGF0aWMgU2V0IG9sZE5zVXJpcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElNaWdyYXRvciBnZXRNaWdyYXRvcihTdHJpbmcgbGliTnNVUkkpIHsKLQkJaWYgKG1pZ3JhdG9ycyA9PSBudWxsKSB7Ci0JCQltaWdyYXRvcnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJLy8gUHJvY2VzcyB0aGUgIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyIKLQkJCS8vIGV4dGVuc2lvbiBwb2ludAotCQkJLy8gY29udHJpYnV0b3JzLgotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0KLQkJCQkJLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeQotCQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJCQkJIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIiwgIm1pZ3JhdG9ycyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBuc1VSSSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImxpYk5zVVJJIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwKLQkJCQkJCQkJCSYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCQkmJiBuc1VSSSAhPSBudWxsCi0JCQkJCQkJCQkmJiBuc1VSSS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCW1pZ3JhdG9ycy5wdXQobnNVUkksIG5ldyBNaWdyYXRvcihidW5kbGUsCi0JCQkJCQkJCQkJY2xhc3NOYW1lLCBuc1VSSSkpOwotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlNaWdyYXRvciBtaWdyYXRvciA9IChNaWdyYXRvcikgbWlncmF0b3JzLmdldChsaWJOc1VSSSk7Ci0JCWlmIChtaWdyYXRvciAhPSBudWxsKSB7Ci0JCQlpZiAobWlncmF0b3IuaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCW1pZ3JhdG9yLmluc3RhbmNlID0gKElNaWdyYXRvcikgbWlncmF0b3IuYnVuZGxlLmxvYWRDbGFzcygKLQkJCQkJCQltaWdyYXRvci5jbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbWlncmF0b3IuaW5zdGFuY2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBjb252ZXJzaW9uUmVxdWlyZWQoU3RyaW5nIGxpYlBhdGgpIHsKLQkJU3RyaW5nIGN1cnJlbnROc1VSSSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRVTUFOc1VSSSgpOwotCQlTdHJpbmcgbGliTnNVUkkgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0VU1BTnNVUkkobGliUGF0aCk7Ci0KLQkJaWYgKG9sZE5zVXJpcy5jb250YWlucyhsaWJOc1VSSSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChjdXJyZW50TnNVUkkuZXF1YWxzKGxpYk5zVVJJKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWJvb2xlYW4gcmV0ID0gZ2V0TWlncmF0b3IobGliTnNVUkkpICE9IG51bGw7Ci0JCWlmIChyZXQpIHsKLQkJCW9sZE5zVXJpcy5hZGQobGliTnNVUkkpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBZGp1c3RlZExpYk5zVVJJKFN0cmluZyBsaWJOc1VSSSkgewotCQlTdHJpbmcgY3VycmVudE5zVVJJID0gUGVyc2lzdGVuY2VVdGlsLmdldFVNQU5zVVJJKCk7Ci0JCWlmICghIGN1cnJlbnROc1VSSS5lcXVhbHMobGliTnNVUkkpKSB7Ci0JCQlyZXR1cm4gbGliTnNVUkk7Ci0JCX0gZWxzZSBpZiAoISBsaWJOc1VSSS5lcXVhbHMoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiKSkgeyAvLyROT04tTkxTLTEkIAotCQkJcmV0dXJuIGxpYk5zVVJJOwotCQl9Ci0JCUVQRlZlcnNpb25zIGVwZlZlcnNpb25zID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCk7Ci0JCQotCQlyZXR1cm4gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMy91bWEuZWNvcmUiOwkvLyROT04tTkxTLTEkIAotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG5zVVJJID0gUGVyc2lzdGVuY2VVdGlsLmdldFVNQU5zVVJJKGxpYlBhdGgpOwotCQlJTWlncmF0b3IgbWlncmF0b3IgPSBnZXRNaWdyYXRvcihuc1VSSSk7Ci0JCWlmIChtaWdyYXRvciAhPSBudWxsKSB7Ci0JCQltaWdyYXRvci5taWdyYXRlKGxpYlBhdGgsIG1vbml0b3IsIGluZm8pOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTdHJpbmcgbGliUGF0aCA9IGFyZ3NbMF07Ci0JCVN5c3RlbS5vdXQKLQkJCQkucHJpbnRsbigiU3RhcnQgbWlncmF0aW5nIG1ldGhvZCBsaWJyYXJ5IGF0ICciICsgbGliUGF0aCArICInLi4uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0cnkgewotCQkJbWlncmF0ZShsaWJQYXRoLCBudWxsLCBudWxsKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJNaWdyYXRpb24gc3VjY2Vzc2Z1bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTWlncmF0aW9uIGZhaWxlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01pZ3JhdGlvblJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjJjMzhmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01pZ3JhdGlvblJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLkJhc2ljUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5BbnlUeXBlOwotCi0vKioKLSAqIFJlc291cmNlIGhhbmRsZXIgZm9yIG1pZ3JhdGluZyBVTUEgbGlicmFyeSBmcm9tIG9uZSB2ZXJzaW9uIHRvIGFub3RoZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBCYXNpY1Jlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsKLQotCXB1YmxpYyBNaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuQmFzaWNSZXNvdXJjZUhhbmRsZXIjcG9zdExvYWQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZSwKLQkgKiAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0sIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgcG9zdExvYWQoWE1MUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLAotCQkJTWFwIG9wdGlvbnMpIHsKLQkJaWYgKCFyZXNvdXJjZS5nZXRFT2JqZWN0VG9FeHRlbnNpb25NYXAoKS5pc0VtcHR5KCkpIHsKLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJNaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIucG9zdExvYWQoKTogIiArIHJlc291cmNlLmdldFVSSSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBTdGFydCB1bmtub3duIGZlYXR1cmVzIC0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0RU9iamVjdFRvRXh0ZW5zaW9uTWFwKCkuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVudHJ5LmdldEtleSgpIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkvLyBoYW5kbGUgbW92ZWQgZGF0YQotCQkJCQkvLwotCQkJCQloYW5kbGVVbmtub3duRGF0YSgoRU9iamVjdCkgZW50cnkuZ2V0S2V5KCksIChBbnlUeXBlKWVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gRW5kIHVua25vd24gZmVhdHVyZXMgLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZXh0KEFueVR5cGUgdmFsdWUpIHsKLQkJdHJ5IHsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJRmVhdHVyZU1hcC5FbnRyeSBlbnRyeSA9IChGZWF0dXJlTWFwLkVudHJ5KSB2YWx1ZS5nZXRNaXhlZCgpLmdldCgwKTsKLQkJCXJldHVybiAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEVBdHRyaWJ1dGUgZ2V0RUF0dHJpYnV0ZShFQ2xhc3MgZUNsYXNzLCBTdHJpbmcgbmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZUNsYXNzLmdldEVBbGxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGF0dHJpYi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VmFsdWUoRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSkgewotCQlpZiAoIWZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCWVPYmplY3QuZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlDb2xsZWN0aW9uIHZhbHVlcyA9IChDb2xsZWN0aW9uKSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQkJdmFsdWVzLmFkZEFsbCgoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQl2YWx1ZXMuYWRkKHZhbHVlKTsKLQkJCX0KLQkJfQotCi0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGhhbmRsZVVua25vd25GZWF0dXJlKEVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpOwotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVVua25vd25GZWF0dXJlcyhFT2JqZWN0IG93bmVyLCBGZWF0dXJlTWFwIGZlYXR1cmVNYXApIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZU1hcC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZlYXR1cmVNYXAuRW50cnkgZW50cnkgPSAoRmVhdHVyZU1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IGVudHJ5LmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQkJaWYoaGFuZGxlVW5rbm93bkZlYXR1cmUob3duZXIsIGYsIGVudHJ5LmdldFZhbHVlKCkpKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVVbmtub3duRGF0YShFT2JqZWN0IGUsIEFueVR5cGUgdW5rbm93bkRhdGEpIHsKLQkJaGFuZGxlVW5rbm93bkZlYXR1cmVzKGUsIHVua25vd25EYXRhLmdldE1peGVkKCkpOwotCQloYW5kbGVVbmtub3duRmVhdHVyZXMoZSwgdW5rbm93bkRhdGEuZ2V0QW55QXR0cmlidXRlKCkpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U2luZ2xlVmFsdWUoRmVhdHVyZU1hcCBmZWF0dXJlTWFwLAotCQkJU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVNYXAuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGZWF0dXJlTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbnRyeS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKGZlYXR1cmVOYW1lKSkgewotCQkJCXJldHVybiBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgQ29sbGVjdGlvbiBnZXRWYWx1ZShGZWF0dXJlTWFwIGZlYXR1cmVNYXAsCi0JCQlTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJQ29sbGVjdGlvbiBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlTWFwLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmVhdHVyZU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZW50cnkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscyhmZWF0dXJlTmFtZSkpIHsKLQkJCQlsaXN0LmFkZChlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vTWlncmF0aW9uVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NaWdyYXRpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlMTUyOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NaWdyYXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbC5IVE1MRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGhlbHAgbWlncmF0ZSBhbmQgZm9ybWF0IHRoZSBodG1sIGNvbnRlbnQuCi0gKiAKLSAqIEBhdXRob3IgSkluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRpb25VdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgU2V0PFN0cmluZz4gY2RhdGFGZWF0dXJlTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0Jc3RhdGljIHsKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJhbHRlcm5hdGl2ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoIm1haW5EZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiaG93VG9TdGFmZiIpOyAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgia2V5Q29uc2lkZXJhdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInB1cnBvc2UiKTsgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInNjb3BlIik7IC8vIFByb2Nlc3NEZXNjcmlwdGlvbiAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgidXNhZ2VOb3RlcyIpOyAvLyBQcm9jZXNzRGVzY3JpcHRpb24gLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIdG1sRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZikgewotCQlyZXR1cm4gY2RhdGFGZWF0dXJlTmFtZXMuY29udGFpbnMoZi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmb3JtYXRWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgYWxsIHN0cmluZyB0eXBlIGF0dHJpYnV0ZXMKLQotCQkJSFRNTEZvcm1hdHRlciBmb3JtYXRlciA9IG5ldyBIVE1MRm9ybWF0dGVyKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcwotCQkJCQkJLmdldChpKTsKLQotCQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB2YWx1ZTsKLQkJCQlpZiAoaXNIdG1sRmVhdHVyZShmZWF0dXJlKSAmJiB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQl0cnkgewotCQkJCQkJbmV3VmFsdWUgPSBmb3JtYXRlci5mb3JtYXRIVE1MKChTdHJpbmcpIHZhbHVlKTsKLQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBOb3QgY2hhbmdlIHZhbHVlIGlmIGl0IGNhbm5vdCBiZSBmb3JtYXR0ZWQKLQkJCQkJCS8vIFNob3VsZCBhbHNvIHdyaXRlIHRvIGxvZyBmb3IgdXNlciBhdHRlbnRpb24KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWVsZW1lbnQuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL1VNQTJVTUFSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vVU1BMlVNQVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDI1ZDFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vVU1BMlVNQVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkFueVR5cGU7Ci0KLS8qKgotICogUmVzb3VyY2UgaGFuZGxlciBmb3IgbWlncmF0aW5nIFVNQSBsaWJyYXJ5IGZyb20gb25lIHZlcnNpb24gdG8gYW5vdGhlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBNaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7Ci0KLQlwcml2YXRlIExpc3QgbW92ZUluZm9zOwotCi0JcHVibGljIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCW1vdmVJbmZvcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEVBdHRyaWJ1dGUgZ2V0RUF0dHJpYnV0ZShFQ2xhc3MgZUNsYXNzLCBTdHJpbmcgbmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZUNsYXNzLmdldEVBbGxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGF0dHJpYi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHJ1bGVzIHRvIG1vdmUgZGF0YQotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE5ld0ZlYXR1cmUoRU9iamVjdCBvd25lciwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgcnVsZXMgdG8gbW92ZSBkYXRhCi0JICogCi0JICogQHBhcmFtIG9sZE93bmVyCi0JICogQHBhcmFtIGZlYXR1cmVOYW1lCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldE5ld093bmVyKEVPYmplY3Qgb2xkT3duZXIsIFN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE5ld1ZhbHVlKEVPYmplY3Qgb2xkT3duZXIsIFN0cmluZyBmZWF0dXJlTmFtZSwKLQkJCUFueVR5cGUgdmFsdWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZURhdGEoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vdmVJbmZvcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1vdmVJbmZvIGluZm8gPSAoTW92ZUluZm8pIGl0ZXIubmV4dCgpOwotCQkJRU9iamVjdCBuZXdPd25lciA9IGdldE5ld093bmVyKGluZm8ub2xkT3duZXIsIGluZm8ub2xkRmVhdHVyZU5hbWUpOwotCQkJaWYgKG5ld093bmVyICE9IG51bGwpIHsKLQkJCQlzZXRWYWx1ZShuZXdPd25lciwgaW5mby5uZXdGZWF0dXJlLCBpbmZvLnZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWYWx1ZShFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICghZmVhdHVyZS5pc01hbnkoKSkgewotCQkJZU9iamVjdC5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCUNvbGxlY3Rpb24gdmFsdWVzID0gKENvbGxlY3Rpb24pIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCQl2YWx1ZXMuYWRkQWxsKChDb2xsZWN0aW9uKSB2YWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXZhbHVlcy5hZGQodmFsdWUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNb3ZlSW5mbyB7Ci0JCUVPYmplY3Qgb2xkT3duZXI7Ci0KLQkJU3RyaW5nIG9sZEZlYXR1cmVOYW1lOwotCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBuZXdGZWF0dXJlOwotCi0JCU9iamVjdCB2YWx1ZTsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKCkKLQkJCQkJLmFwcGVuZChnZXRDbGFzcygpLmdldE5hbWUoKSkKLQkJCQkJLmFwcGVuZCgiKFxuIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuYXBwZW5kKCIgIG9sZEZlYXR1cmVOYW1lOiAiKS5hcHBlbmQob2xkRmVhdHVyZU5hbWUpLmFwcGVuZCgnXG4nKSAvLyROT04tTkxTLTEkCi0JCQkJCS5hcHBlbmQoIiAgbmV3RmVhdHVyZTogIikuYXBwZW5kKG5ld0ZlYXR1cmUpLmFwcGVuZCgnXG4nKSAvLyROT04tTkxTLTEkCi0JCQkJCS5hcHBlbmQoIiAgdmFsdWU6ICIpLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCdcbicpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLmFwcGVuZCgiKSIpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFNpbmdsZVZhbHVlKEZlYXR1cmVNYXAgZmVhdHVyZU1hcCwKLQkJCVN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlTWFwLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmVhdHVyZU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZW50cnkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscyhmZWF0dXJlTmFtZSkpIHsKLQkJCQlyZXR1cm4gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIENvbGxlY3Rpb24gZ2V0VmFsdWUoRmVhdHVyZU1hcCBmZWF0dXJlTWFwLAotCQkJU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCUNvbGxlY3Rpb24gbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZU1hcC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZlYXR1cmVNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVudHJ5LmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoZmVhdHVyZU5hbWUpKSB7Ci0JCQkJbGlzdC5hZGQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJNb3ZlSW5mb3MoKSB7Ci0JCW1vdmVJbmZvcy5jbGVhcigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLk1pZ3JhdGlvblJlc291cmNlSGFuZGxlciNoYW5kbGVVbmtub3duRmVhdHVyZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVVbmtub3duRmVhdHVyZShFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCVN0cmluZyBmZWF0dXJlTmFtZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgbmV3RmVhdHVyZSA9IGdldE5ld0ZlYXR1cmUob3duZXIsIGZlYXR1cmVOYW1lKTsKLQkJaWYgKG5ld0ZlYXR1cmUgIT0gbnVsbCkgewotCQkJTW92ZUluZm8gbW92ZUluZm8gPSBuZXcgTW92ZUluZm8oKTsKLQkJCW1vdmVJbmZvLm9sZE93bmVyID0gb3duZXI7Ci0JCQltb3ZlSW5mby5vbGRGZWF0dXJlTmFtZSA9IGZlYXR1cmVOYW1lOwotCQkJbW92ZUluZm8ubmV3RmVhdHVyZSA9IG5ld0ZlYXR1cmU7Ci0JCQltb3ZlSW5mby52YWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgQW55VHlwZSA/IGdldE5ld1ZhbHVlKAotCQkJCQlvd25lciwgZmVhdHVyZU5hbWUsIChBbnlUeXBlKSB2YWx1ZSkKLQkJCQkJOiB2YWx1ZTsKLQkJCW1vdmVJbmZvcy5hZGQobW92ZUluZm8pOwotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKG1vdmVJbmZvKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vVXBncmFkZUNhbGxlckluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vVXBncmFkZUNhbGxlckluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDNjZTY3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL1VwZ3JhZGVDYWxsZXJJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQ2xhc3MgcmVwcmVzZW50aW5nIGNhbGxlciBpbmZvIGZvciBjYWxsaW5nIGxpYnJhcnkgdXBncmFkZSBjb2RlLgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXBncmFkZUNhbGxlckluZm8gewotCQotCXB1YmxpYyBzdGF0aWMgaW50IHVwZ3JhZGVMaWJyYXJ5ID0gMDsKLQlwdWJsaWMgc3RhdGljIGludCB1cGdyYWRlSW1wb3J0UGx1Z2luID0gMTsKLQlwdWJsaWMgc3RhdGljIGludCB1cGdyYWRlSW1wb3J0Q29uZmlnID0gMjsKLQkKLQlwcml2YXRlIGludCBjYWxsZXJUeXBlID0gdXBncmFkZUxpYnJhcnk7Ci0JcHJpdmF0ZSBTdHJpbmcgZXJyb3JNc2c7Ci0JRmlsZSBsaWJGaWxlOwotCUZpbGUgY29waWVkTGliRmlsZTsKLQkKLQlwdWJsaWMgVXBncmFkZUNhbGxlckluZm8oaW50IGNhbGxlclR5cGUsIEZpbGUgbGliRmlsZSkgewotCQl0aGlzLmNhbGxlclR5cGUgPSBjYWxsZXJUeXBlOwotCQl0aGlzLmxpYkZpbGUgPSBsaWJGaWxlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVcGdyYWRlTGlicmFyeShVcGdyYWRlQ2FsbGVySW5mbyBpbmZvKSB7Ci0JCXJldHVybiBpbmZvID09IG51bGwgfHwgaW5mby5pc1VwZ3JhZGVMaWJyYXJ5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVXBncmFkZUxpYnJhcnkoKSB7Ci0JCXJldHVybiBjYWxsZXJUeXBlID09IHVwZ3JhZGVMaWJyYXJ5OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRJc0V4cG9ydGVkUGx1Z2luTGliKCkgewotCQlyZXR1cm4gY2FsbGVyVHlwZSA9PSB1cGdyYWRlSW1wb3J0UGx1Z2luOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1zZyhTdHJpbmcgbXNnKSB7Ci0JCWVycm9yTXNnID0gbXNnOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTXNnKCkgewotCQlyZXR1cm4gZXJyb3JNc2c7Ci0JfQkJCQotCQotCXB1YmxpYyB2b2lkIHNldENvcGllZExpYkZpbGUoRmlsZSBmaWxlKSB7Ci0JCWNvcGllZExpYkZpbGUgPSBmaWxlOwotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXRDb3BpZWRMaWJGaWxlKCkgewotCQlyZXR1cm4gY29waWVkTGliRmlsZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEZpbGUgZ2V0TGliRmlsZSgpIHsKLQkJcmV0dXJuIGxpYkZpbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY29weUxpYnJhcnkoKSB7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvcGllZExpYnJhcnkoKSB7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9NaWdyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9NaWdyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMzg1YWEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvTWlncmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FeHRlbmRlZE1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuSWxsZWdhbFZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQW55VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWwuRWNvcmUyWE1MUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWwuRWNvcmUyWE1MUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sLmltcGwuRWNvcmUyWE1MUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMnhtbC51dGlsLkVjb3JlMlhNTEV4dGVuZGVkTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlIZWxwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VTUEyVU1BUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogTWlncmF0ZXMgb25lIHZlcnNpb24gb2YgVU1BIGxpYnJhcnkgdG8gYW5vdGhlciB1c2luZyB0aGUgcHJvdmlkZWQgRWNvcmUyWE1MCi0gKiBtYXBwaW5nIGZpbGVzIGFuZCBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyLiBUaGUgRWNvcmUyWE1MIG1hcHBpbmcgZmlsZXMKLSAqIHNwZWNpZmllcyB0aGUgbmFtZSBjaGFuZ2VzIG9mIGNsYXNzZXMvYXR0cmlidXRlcyB3aGlsZSBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyCi0gKiBoYW5kbGVzIHRoZSBkYXRhIG1vdmluZy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1pZ3JhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBOU19VUklzID0geyBNaWdyYXRvci5PTERfVU1BX05TX1VSSSwKLQkJCU1pZ3JhdG9yLk9MRF9VTUFfTlNfVVJJLCBNaWdyYXRvci5VTUFfTlNfVVJJIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUklbXSBFQ09SRTJYTUxfVVJJcyA9IHsKLQkJCVVSSQotCQkJCQkuY3JlYXRlVVJJKCJwbGF0Zm9ybTovcGx1Z2luL2NvbS5pYm0ucnBtLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL3VtYS5lY29yZTJ4bWwiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlVUkkKLQkJCQkJLmNyZWF0ZVVSSSgicGxhdGZvcm06L3BsdWdpbi9jb20uaWJtLnJwbS5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi91bWEyLmVjb3JlMnhtbCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCVVSSQotCQkJCQkuY3JlYXRlVVJJKCJwbGF0Zm9ybTovcGx1Z2luL2NvbS5pYm0ucnBtLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL3VtYTMuZWNvcmUyeG1sIikgLy8kTk9OLU5MUy0xJAotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTERfVU1BX05TX1VSSSA9ICJodHRwOi8vL2NvbS9pYm0vdW1hLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU1BX05TX1VSSSA9ICJodHRwOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRXh0ZW5kZWRNZXRhRGF0YVtdIGV4dGVuZGVkTWV0YURhdGFzOwotCi0JcHJpdmF0ZSBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyMCByZXNvdXJjZUhhbmRsZXI7Ci0KLQlwdWJsaWMgSGFzaE1hcCBvbGRQYXRoVG9OZXdVUklNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIENvbGxlY3Rpb24gYW55VHlwZUZlYXR1cmVWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHRlbmRlZE1ldGFEYXRhIGdldEV4dGVuZGVkTWV0YURhdGEoU3RyaW5nIG9sZE5zVVJJLAotCQkJVVJJIGVjb3JlMlhNTFVSSSkgewotCQlFUGFja2FnZS5SZWdpc3RyeSBlUGFja2FnZVJlZ2lzdHJ5ID0gbmV3IEVQYWNrYWdlUmVnaXN0cnlJbXBsKAotCQkJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFKTsKLQkJZVBhY2thZ2VSZWdpc3RyeS5wdXQob2xkTnNVUkksIFVtYVBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQlFY29yZTJYTUxSZWdpc3RyeSBlY29yZTJ4bWxSZWdpc3RyeSA9IG5ldyBFY29yZTJYTUxSZWdpc3RyeUltcGwoCi0JCQkJRWNvcmUyWE1MUmVnaXN0cnkuSU5TVEFOQ0UpOwotCi0JCWVjb3JlMnhtbFJlZ2lzdHJ5Ci0JCQkJLnB1dChvbGROc1VSSSwgRWNvcmVVdGlsLmdldE9iamVjdEJ5VHlwZShuZXcgUmVzb3VyY2VTZXRJbXBsKCkKLQkJCQkJCS5nZXRSZXNvdXJjZShlY29yZTJYTUxVUkksIHRydWUpLmdldENvbnRlbnRzKCksCi0JCQkJCQlFY29yZTJYTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRYTUxNYXAoKSkpOwotCi0JCXJldHVybiBuZXcgRWNvcmUyWE1MRXh0ZW5kZWRNZXRhRGF0YShlUGFja2FnZVJlZ2lzdHJ5LAotCQkJCWVjb3JlMnhtbFJlZ2lzdHJ5KSB7Ci0JCQlwdWJsaWMgRUNsYXNzaWZpZXIgZ2V0VHlwZShFUGFja2FnZSBlUGFja2FnZSwgU3RyaW5nIG5hbWUpIHsKLQkJCQlFQ2xhc3NpZmllciB0eXBlID0gc3VwZXIuZ2V0VHlwZShlUGFja2FnZSwgbmFtZSk7Ci0KLQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCS8vIHRyeSB0byBnZXQgdHlwZSBmcm9tIHRoZSBwYWNrYWdlIHdpdGggdGhlIGdpdmVuIG5hbWUKLQkJCQkJLy8KLQkJCQkJTGlzdCBlQ2xhc3NpZmllcnMgPSBlUGFja2FnZS5nZXRFQ2xhc3NpZmllcnMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDAsIHNpemUgPSBlQ2xhc3NpZmllcnMuc2l6ZSgpOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQkJCQlFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA9IChFQ2xhc3NpZmllcikgZUNsYXNzaWZpZXJzCi0JCQkJCQkJCS5nZXQoaSk7Ci0JCQkJCQlpZiAobmFtZS5lcXVhbHMoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpKSkgewotCQkJCQkJCXJldHVybiBlQ2xhc3NpZmllcjsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCi0JCQkJcmV0dXJuIHR5cGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIE1pZ3JhdG9yKCkgewotCQl0aGlzKE5TX1VSSXMsIEVDT1JFMlhNTF9VUklzKTsKLQl9Ci0KLQlwdWJsaWMgTWlncmF0b3IoU3RyaW5nW10gbnNVUklzLCBVUklbXSBlY29yZTJYTUxVUklzKSB7Ci0JCWludCBzaXplID0gZWNvcmUyWE1MVVJJcy5sZW5ndGg7Ci0JCWV4dGVuZGVkTWV0YURhdGFzID0gbmV3IEV4dGVuZGVkTWV0YURhdGFbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWNvcmUyWE1MVVJJcy5sZW5ndGg7IGkrKykgewotCQkJZXh0ZW5kZWRNZXRhRGF0YXNbaV0gPSBnZXRFeHRlbmRlZE1ldGFEYXRhKG5zVVJJc1tpXSwKLQkJCQkJZWNvcmUyWE1MVVJJc1tpXSk7Ci0JCX0KLQkJdGhpcy5yZXNvdXJjZUhhbmRsZXIgPSBuZXcgVU1BMlVNQVJlc291cmNlSGFuZGxlcjAoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZVN0YXR1cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBtc2cpIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShtc2cpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBBbnlUeXBlRmVhdHVyZVZhbHVlIHsKLQkJU3RyaW5nIG93bmVySWQ7Ci0KLQkJRU9iamVjdCBvd25lcjsKLQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCQlTdHJpbmcgdmFsdWVJZDsKLQotCQlBbnlUeXBlIHZhbHVlOwotCi0JCWludCBpbmRleDsKLQl9Ci0KLQljbGFzcyBNaWdyYXRvclVSSUNvbnZlcnRlciBleHRlbmRzIE11bHRpRmlsZVVSSUNvbnZlcnRlciB7Ci0JCXByaXZhdGUgUmVzb3VyY2VNYW5hZ2VyIG9sZFJlc01ncjsKLQotCQkvKioKLQkJICogQHBhcmFtIHJlc291cmNlU2V0Ci0JCSAqLwotCQlwdWJsaWMgTWlncmF0b3JVUklDb252ZXJ0ZXIoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0KSB7Ci0JCQlzdXBlcihyZXNvdXJjZVNldCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVVSSUNvbnZlcnRlciNub3JtYWxpemUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkJICovCi0JCXB1YmxpYyBVUkkgbm9ybWFsaXplKFVSSSB1cmkpIHsKLQkJCVVSSSBub3JtYWxpemVkID0gc3VwZXIubm9ybWFsaXplKHVyaSk7Ci0JCQlpZiAobm9ybWFsaXplZCA9PSBudWxsICYmIFNDSEVNRS5lcXVhbHNJZ25vcmVDYXNlKHVyaS5zY2hlbWUoKSkpIHsKLQkJCQlpZiAob2xkUmVzTWdyICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGlkID0gdXJpLmF1dGhvcml0eSgpOwotCQkJCQlub3JtYWxpemVkID0gZ2V0VVJJRnJvbU9sZFJlc291cmNlTWFuYWdlcihpZCk7Ci0JCQkJCWlmIChub3JtYWxpemVkICE9IG51bGwpIHsKLQkJCQkJCWlmICh1cmkuaGFzRnJhZ21lbnQoKSkgewotCQkJCQkJCW5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLmFwcGVuZEZyYWdtZW50KHVyaQotCQkJCQkJCQkJLmZyYWdtZW50KCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlub3JtYWxpemVkID0gbm9ybWFsaXplZC5hcHBlbmRGcmFnbWVudChpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJCXJldHVybiBub3JtYWxpemVkOwotCQl9Ci0KLQkJcHVibGljIFVSSSBnZXRVUklGcm9tT2xkUmVzb3VyY2VNYW5hZ2VyKFN0cmluZyBpZCkgewotCQkJaWYgKG9sZFJlc01nciA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSBvbGRSZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKGlkKTsKLQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQlVUkkgbm9ybWFsaXplZCA9IGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKTsKLQkJCQlVUkkgbmV3VVJJID0gKFVSSSkgb2xkUGF0aFRvTmV3VVJJTWFwLmdldChub3JtYWxpemVkCi0JCQkJCQkudG9GaWxlU3RyaW5nKCkpOwotCQkJCWlmIChuZXdVUkkgIT0gbnVsbCkgewotCQkJCQlub3JtYWxpemVkID0gbmV3VVJJOwotCQkJCX0KLQkJCQlyZXR1cm4gbm9ybWFsaXplZDsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLnVtYS5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVVUklDb252ZXJ0ZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJaWYgKG9sZFJlc01nciAhPSBudWxsKSB7Ci0JCQkJb2xkUmVzTWdyLmRpc3Bvc2UoKTsKLQkJCQlvbGRSZXNNZ3IgPSBudWxsOwotCQkJfQotCi0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIHJlc01ncjIKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE9sZFJlc291cmNlTWFuYWdlcihSZXNvdXJjZU1hbmFnZXIgcmVzTWdyKSB7Ci0JCQlvbGRSZXNNZ3IgPSByZXNNZ3I7Ci0JCX0KLQotCQlwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyIGdldE9sZFJlc291cmNlTWFuYWdlcigpIHsKLQkJCXJldHVybiBvbGRSZXNNZ3I7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVVSSUNvbnZlcnRlciNzZXRVUklNYXBwaW5nKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIGphdmEudXRpbC5TZXQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRVUklNYXBwaW5nKEVPYmplY3QgZSwgVVJJIHVyaSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCQkvLyBjb2RlIHRvIHN1cHBvcnQgbWlncmF0aW9uIGZyb20gb2xkZXIgdmVyc2lvbgotCQkJLy8KLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1pZ3JhdG9yVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IChNaWdyYXRvclVSSUNvbnZlcnRlcikgKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGUKLQkJCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQlSZXNvdXJjZU1hbmFnZXIgb2xkUmVzTWdyID0gdXJpQ29udmVydGVyCi0JCQkJCQkuZ2V0T2xkUmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCQkJaWYgKG9sZFJlc01nciAhPSBudWxsKSB7Ci0JCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gb2xkUmVzTWdyCi0JCQkJCQkJLmdldFJlc291cmNlRGVzY3JpcHRvcigoKE1ldGhvZEVsZW1lbnQpIGUpCi0JCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJb2xkUGF0aFRvTmV3VVJJTWFwLnB1dChkZXNjLmdldFJlc29sdmVkVVJJKCkKLQkJCQkJCQkJLnRvRmlsZVN0cmluZygpLCB1cmkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlzdXBlci5zZXRVUklNYXBwaW5nKGUsIHVyaSwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCQl9Ci0JfQotCi0JY2xhc3MgTWlncmF0b3JSZXNvdXJjZVNldCBleHRlbmRzIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS51bWEucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsI2dldFVSSUNvbnZlcnRlcigpCi0JCSAqLwotCQlwdWJsaWMgVVJJQ29udmVydGVyIGdldFVSSUNvbnZlcnRlcigpIHsKLQkJCWlmICh1cmlDb252ZXJ0ZXIgPT0gbnVsbCkgewotCQkJCXVyaUNvbnZlcnRlciA9IG5ldyBNaWdyYXRvclVSSUNvbnZlcnRlcih0aGlzKTsKLQkJCX0KLQkJCXJldHVybiB1cmlDb252ZXJ0ZXI7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgbG9hZE9sZFJlc291cmNlTWFuYWdlcihTdHJpbmcgbGliUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCS8vIHRyeWluZyB0byBsb2FkIHRoZSByZXNvdXJjZSBkZXNjcmlwdG9ycyBmaWxlCi0JCQkvLwotCQkJU3RyaW5nIGxpYkRpciA9IG5ldyBGaWxlKGxpYlBhdGgpLmdldFBhcmVudCgpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShsaWJEaXIsIFJFU01HUl9YTUkpOwotCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IG51bGw7Ci0JCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgbXVsdGlGaWxlVVJJQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCVJlc291cmNlIHJlc01nclJlcyA9IG5ldyBYTUlSZXNvdXJjZUltcGwoVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZQotCQkJCQkJLmdldEFic29sdXRlUGF0aCgpKSk7IC8vIHN1cGVyLmdldFJlc291cmNlKFVSSS5jcmVhdGVGaWxlVVJJKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLAotCQkJCS8vIHRydWUpOwotCQkJCXJlc01nclJlcy5sb2FkKG51bGwpOwotCQkJCWlmICghcmVzTWdyUmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCU9iamVjdCBvYmogPSByZXNNZ3JSZXMuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXNvdXJjZU1hbmFnZXIpIHsKLQkJCQkJCXJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIG9iajsKLQkJCQkJCS8vIHJlc01nci5yZXNvbHZlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTeXN0ZW0uZXJyCi0JCQkJCQkJCS5wcmludGxuKCJJbnZhbGlkIFJlc291cmNlTWFuYWdlciBmaWxlOiAiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCSgoTWlncmF0b3JVUklDb252ZXJ0ZXIpIG11bHRpRmlsZVVSSUNvbnZlcnRlcikKLQkJCQkJLnNldE9sZFJlc291cmNlTWFuYWdlcihyZXNNZ3IpOwotCQl9Ci0KLQkJcHVibGljIE1ldGhvZExpYnJhcnkgbG9hZExpYnJhcnkoU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24gewotCQkJbG9hZE9sZFJlc291cmNlTWFuYWdlcihwYXRoKTsKLQotCQkJcmV0dXJuIGxvYWRMaWJyYXJ5V2l0aG91dFJlc2V0KHBhdGgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLnVtYS5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGwjZmluZEVPYmplY3RJblVubG9hZGVkUmVzb3VyY2VzKGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBmaW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoU3RyaW5nIGlkKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLQkJCWlmIChnZXRSZXNvdXJjZU1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQkJb2JqZWN0ID0gc3VwZXIuZmluZEVPYmplY3RJblVubG9hZGVkUmVzb3VyY2VzKGlkKTsKLQkJCX0KLQkJCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJCVVSSSB1cmkgPSAoKE1pZ3JhdG9yVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKSkKLQkJCQkJCS5nZXRVUklGcm9tT2xkUmVzb3VyY2VNYW5hZ2VyKGlkKTsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHN1cGVyLmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JCQkJcmV0dXJuIHJlc291cmNlLmdldEVPYmplY3QoaWQpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbCNnZXRFT2JqZWN0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksCi0JCSAqICAgICAgYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJCS8vIEVPYmplY3QgZU9iaiA9IHN1cGVyR2V0RU9iamVjdCh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCQlFT2JqZWN0IGVPYmogPSBzdXBlci5nZXRFT2JqZWN0KHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJCWlmIChlT2JqID09IG51bGwKLQkJCQkJJiYgTWlncmF0b3JVUklDb252ZXJ0ZXIuU0NIRU1FLmVxdWFsc0lnbm9yZUNhc2UodXJpCi0JCQkJCQkJLnNjaGVtZSgpKSAmJiAhdXJpLmhhc0ZyYWdtZW50KCkpIHsKLQkJCQllT2JqID0gc3VwZXIuZ2V0RU9iamVjdCh1cmkuYXV0aG9yaXR5KCkpOwotCQkJfQotCQkJLy8gaWYodXJpLmF1dGhvcml0eSgpLmVxdWFscygiezExQjYwQTRCLUEwQzctNEQ1Qy04OTFBLTM0NkU4NjUyQTRFQn0iKSkKLQkJCS8vIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWlncmF0b3JSZXNvdXJjZVNldC5nZXRFT2JqZWN0KCk6IGVPYmogPSAiICsKLQkJCS8vIGVPYmopOwotCQkJLy8gfQotCQkJaWYgKGVPYmogPT0gbnVsbCB8fCBlT2JqLmVJc1Byb3h5KCkpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLQkJCQkJCSJDb3VsZCBub3QgbG9hZCBvYmplY3Qgd2l0aCBVUkkgJyIgKyB1cmkgKyAiJyAobm9ybWFsaXplZCBVUkk6ICciICsgZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSkgKyAiJykuXG5QbGVhc2Ugc2VlIGxvZyBmaWxlIGZvciBtb3JlIGRldGFpbHMuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlyZXR1cm4gZU9iajsKLQkJfQotCi0JCXB1YmxpYyBFT2JqZWN0IHN1cGVyR2V0RU9iamVjdChVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQkJdHJ5IHsKLQkJCQlVUkkgbm9ybWFsaXplZCA9IGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotCQkJCWlmIChub3JtYWxpemVkID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCQlyZXNvdXJjZSA9IGdldFJlc291cmNlKG5vcm1hbGl6ZWQudHJpbUZyYWdtZW50KCksIGxvYWRPbkRlbWFuZCk7Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGZyYWdtZW50ID0gbm9ybWFsaXplZC5mcmFnbWVudCgpOwotCQkJCQlpZiAoZnJhZ21lbnQgPT0gbnVsbCB8fCBmcmFnbWVudC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXR1cm4gcmVzb3VyY2UuZ2V0RU9iamVjdChmcmFnbWVudCk7Ci0JCQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IGU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkvLwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbCNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCQkgKi8KLQkJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJCVJlc291cmNlIHJlc3VsdCA9IG5ldyBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwodXJpKSB7Ci0JCQkJcHJvdGVjdGVkIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7Ci0JCQkJCXJldHVybiBuZXcgTXVsdGlGaWxlWE1JSGVscGVySW1wbCh0aGlzKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShFT2JqZWN0IG9iamVjdCwKLQkJCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwKLQkJCQkJCQkJaW50IHBvc2l0aW9uKSB7Ci0JCQkJCQkJYm9vbGVhbiBvbGQgPSBsb2dFcnJvcjsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlsb2dFcnJvciA9IGZhbHNlOwotCQkJCQkJCQlzdXBlcgotCQkJCQkJCQkJCS5zZXRWYWx1ZShvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCQkJCQkJCQkJcG9zaXRpb24pOwotCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBBbnlUeXBlCi0JCQkJCQkJCQkJJiYgb2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCQkvLyAmJiBvYmplY3QgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudAotCQkJCQkJCQkvLyAmJiBmZWF0dXJlID09Ci0JCQkJCQkJCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCkKLQkJCQkJCQkJKSB7Ci0JCQkJCQkJCQlBbnlUeXBlRmVhdHVyZVZhbHVlIGZ2YWx1ZSA9IG5ldyBBbnlUeXBlRmVhdHVyZVZhbHVlKCk7Ci0JCQkJCQkJCQkvLyBmdmFsdWUub3duZXIgPSBvYmplY3Q7Ci0JCQkJCQkJCQlmdmFsdWUub3duZXJJZCA9ICgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KQotCQkJCQkJCQkJCQkuZ2V0R3VpZCgpOwotCQkJCQkJCQkJZnZhbHVlLmZlYXR1cmUgPSBmZWF0dXJlOwotCQkJCQkJCQkJLy8gZnZhbHVlLnZhbHVlID0gKEFueVR5cGUpIHZhbHVlOwotCQkJCQkJCQkJZnZhbHVlLnZhbHVlSWQgPSAoU3RyaW5nKSBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyCi0JCQkJCQkJCQkJCS5nZXRTaW5nbGVWYWx1ZSgoKEFueVR5cGUpIHZhbHVlKQotCQkJCQkJCQkJCQkJCS5nZXRBbnlBdHRyaWJ1dGUoKSwgImd1aWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJZnZhbHVlLmluZGV4ID0gcG9zaXRpb247Ci0JCQkJCQkJCQlhbnlUeXBlRmVhdHVyZVZhbHVlcy5hZGQoZnZhbHVlKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXRocm93IGU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQlsb2dFcnJvciA9IG9sZDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyBMaXN0IHNldE1hbnlSZWZlcmVuY2UoCi0JCQkJCQkJCW9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyLk1hbnlSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQkJCQkJCQlTdHJpbmcgbG9jYXRpb24pIHsKLQkJCQkJCQlMaXN0IGV4Y2VwdGlvbnMgPSBzdXBlci5zZXRNYW55UmVmZXJlbmNlKHJlZmVyZW5jZSwKLQkJCQkJCQkJCWxvY2F0aW9uKTsKLQkJCQkJCQlpZiAoZXhjZXB0aW9ucyA9PSBudWxsKQotCQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU9iamVjdCBleCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCQlpZiAoZXggaW5zdGFuY2VvZiBJbGxlZ2FsVmFsdWVFeGNlcHRpb24pIHsKLQkJCQkJCQkJCUlsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBpdmUgPSAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uKSBleDsKLQkJCQkJCQkJCWlmIChpdmUuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFueVR5cGUKLQkJCQkJCQkJCQkJJiYgaXZlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCQkJCUFueVR5cGVGZWF0dXJlVmFsdWUgZnZhbHVlID0gbmV3IEFueVR5cGVGZWF0dXJlVmFsdWUoKTsKLQkJCQkJCQkJCQlmdmFsdWUub3duZXJJZCA9ICgoTWV0aG9kRWxlbWVudCkgaXZlCi0JCQkJCQkJCQkJCQkuZ2V0T2JqZWN0KCkpLmdldEd1aWQoKTsKLQkJCQkJCQkJCQlmdmFsdWUuZmVhdHVyZSA9IGl2ZS5nZXRGZWF0dXJlKCk7Ci0JCQkJCQkJCQkJZnZhbHVlLnZhbHVlSWQgPSAoU3RyaW5nKSBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyCi0JCQkJCQkJCQkJCQkuZ2V0U2luZ2xlVmFsdWUoKChBbnlUeXBlKSBpdmUKLQkJCQkJCQkJCQkJCQkJLmdldFZhbHVlKCkpCi0JCQkJCQkJCQkJCQkJCS5nZXRBbnlBdHRyaWJ1dGUoKSwKLQkJCQkJCQkJCQkJCQkJImd1aWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWZ2YWx1ZS5pbmRleCA9IC0xOwotCQkJCQkJCQkJCWFueVR5cGVGZWF0dXJlVmFsdWVzLmFkZChmdmFsdWUpOwotCQkJCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGV4Y2VwdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gZXhjZXB0aW9uczsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0JCQl9OwotCQkJcmVzdWx0LnNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCQkJZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc3VsdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNldCBjbGFzc05hbWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJY2xhc3NOYW1lcy5hZGQoIlRlY2huaXF1ZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gbmV3IE1pZ3JhdG9yUmVzb3VyY2VTZXQoKTsKLQkJLy8gUmVzb3VyY2VNYW5hZ2VyIG9sZFJlc01nciA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5kZWRNZXRhRGF0YXMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLQkJCWlmIChpIDwgMikgewotCQkJCXJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkucHV0KAotCQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1JFU09VUkNFX0hBTkRMRVIsIHJlc291cmNlSGFuZGxlcik7Ci0JCQl9Ci0JCQlyZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpCi0JCQkJCS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwKLQkJCQkJCQlleHRlbmRlZE1ldGFEYXRhc1tpXSk7Ci0KLQkJCWlmIChpID09IDApIHsKLQkJCQlyZXNvdXJjZUhhbmRsZXIuc2F2ZVByZXNlbnRhdGlvblVSSUZvcihjbGFzc05hbWVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzb3VyY2VIYW5kbGVyLnNhdmVQcmVzZW50YXRpb25VUklGb3IobnVsbCk7Ci0JCQl9Ci0KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkTGlicmFyeVRhc2tfbmFtZSk7Ci0KLQkJCS8vIGlmKG9sZFJlc01nciAhPSBudWxsKSB7Ci0JCQkvLyAoKE1pZ3JhdG9yVVJJQ29udmVydGVyKXJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpKS5zZXRPbGRSZXNvdXJjZU1hbmFnZXIob2xkUmVzTWdyKTsKLQkJCS8vIHJlc291cmNlU2V0LmxvYWRMaWJyYXJ5V2l0aG91dFJlc2V0KGxpYlBhdGgpOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQlyZXNvdXJjZVNldC5sb2FkTGlicmFyeShsaWJQYXRoKTsKLQkJCS8vIH0KLQotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSByZXNvdXJjZVNldC5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlpZiAobGliID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQkvLyBsb2FkIGFsbCB0aGUgcmVzb3VyY2VzIGluIG1lbW9yeQotCQkJLy8KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkUmVzb3VyY2VzVGFza19uYW1lKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkZWxpbmUgJiYgaSA+IDApIHsKLQkJCQkJLy8gaGFjayB0byByZXN0b3JlIHRoZSByaWdodCBwcmVzZW50YXRpb24gZm9yIG9sZCBUZWNobmlxdWUKLQkJCQkJLy8KLQkJCQkJR3VpZGVsaW5lIGd1aWRlbGluZSA9IChHdWlkZWxpbmUpIGVsZW1lbnQ7Ci0JCQkJCVVSSSB1cmkgPSByZXNvdXJjZUhhbmRsZXIuZ2V0UHJlc2VudGF0aW9uVVJJKGd1aWRlbGluZQotCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBwcmVzZW50YXRpb24gPSAoQ29udGVudERlc2NyaXB0aW9uKSByZXNvdXJjZVNldAotCQkJCQkJCQkuZ2V0RU9iamVjdCh1cmksIHRydWUpOwotCQkJCQkJZ3VpZGVsaW5lLnNldFByZXNlbnRhdGlvbihwcmVzZW50YXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQl0cnkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCVN5c3RlbS5lcnIKLQkJCQkJCQkJLnByaW50bG4oIkVycm9yIGl0ZXJhdGUgdGhydSBjcm9zcyByZWZlcmVuY2VzIG9mIGVsZW1lbnQ6ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaSA9PSAwKSB7Ci0JCQkJLy8gb2xkUmVzTWdyID0KLQkJCQkvLyAoKE1pZ3JhdG9yVVJJQ29udmVydGVyKXJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpKS5nZXRPbGRSZXNvdXJjZU1hbmFnZXIoKTsKLQotCQkJCW1pZ3JhdGVQcm9jZXNzQ29udGVudERlc2NyaXB0aW9ucyhtb25pdG9yLCBsaWIpOwotCi0JCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vdmVEYXRhVGFza19uYW1lKTsKLQotCQkJfQotCi0JCQlpZiAoaSA8IDIpIHsKLQkJCQlyZXNvdXJjZUhhbmRsZXIubW92ZURhdGEoKTsKLQkJCQlyZXNvdXJjZUhhbmRsZXIuY2xlYXJNb3ZlSW5mb3MoKTsKLQkJCX0KLQotCQkJaWYgKGkgPT0gZXh0ZW5kZWRNZXRhRGF0YXMubGVuZ3RoIC0gMSkgewotCQkJCW1pZ3JhdGVQcm9jZXNzZXMobW9uaXRvciwgbGliKTsKLQotCQkJCXJlc3RvcmVSZWZlcmVuY2VzKHJlc291cmNlU2V0KTsKLQotCQkJfQotCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMuc2F2ZUxpYnJhcnlUYXNrX25hbWUpOwotCi0JCQlyZXNvdXJjZVNldC5zYXZlKG51bGwsIHRydWUpOwotCQkJcmVzb3VyY2VTZXQucmVzZXQoKTsKLQotCQl9Ci0KLQkJLy8gZGVsZXRlIG9sZCByZXNtZ3IueG1pCi0JCS8vCi0JCXRyeSB7Ci0JCQlGaWxlIHJlc01nckZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZShsaWJQYXRoKS5nZXRQYXJlbnRGaWxlKCksCi0JCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5SRVNNR1JfWE1JKTsKLQkJCWlmIChyZXNNZ3JGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmVzTWdyRmlsZS5kZWxldGUoKTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZXN0b3JlUmVmZXJlbmNlcyhNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYW55VHlwZUZlYXR1cmVWYWx1ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBbnlUeXBlRmVhdHVyZVZhbHVlIGVsZW1lbnQgPSAoQW55VHlwZUZlYXR1cmVWYWx1ZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5vd25lcklkICE9IG51bGwgJiYgZWxlbWVudC52YWx1ZUlkICE9IG51bGwpIHsKLQkJCQlFT2JqZWN0IG93bmVyID0gcmVzb3VyY2VTZXQuZ2V0RU9iamVjdChlbGVtZW50Lm93bmVySWQpOwotCQkJCU9iamVjdCB2YWx1ZSA9IHJlc291cmNlU2V0LmdldEVPYmplY3QoZWxlbWVudC52YWx1ZUlkKTsKLQkJCQlVTUEyVU1BUmVzb3VyY2VIYW5kbGVyLnNldFZhbHVlKG93bmVyLCBlbGVtZW50LmZlYXR1cmUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQlhbnlUeXBlRmVhdHVyZVZhbHVlcy5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWlncmF0ZVByb2Nlc3NlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQlNZXRob2RMaWJyYXJ5IGxpYikgewotCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMuZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZSk7Ci0KLQkJU3RyaW5nW11bXSBwcm9jUGtnUGF0aHMgPSBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUFJPQ0VTU19QQUNLQUdFX1BBVEhTOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJQXJyYXlMaXN0IHByb2NQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm9jUGtnUGF0aHMubGVuZ3RoOyBqKyspIHsKLQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQkJcHJvY1BrZ1BhdGhzW2pdKTsKLQkJCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQkJcHJvY1BrZ3MuYWRkKHBrZyk7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByb2NQa2dzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IxCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGNoaWxkUGtnID0gKEVPYmplY3QpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJCWlmIChjaGlsZFBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBjaGlsZFBrZykKLQkJCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlmaXhQcmVzZW50YXRpb25OYW1lKHByb2MpOwotCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCQl0aHJvdyBlOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9IE1pZ3JhdG9yLmNsYXNzLmdldE5hbWUoKQotCQkJCQkJCQkJKyAiOiBpbnZhbGlkIFByb2Nlc3NDb21wb25lbnQgKHdpdGggbm8gUHJvY2Vzcyk6ICIgKyBjaGlsZFBrZyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrICJcbiAgUHJvY2Vzc0NvbXBvbmVudCdzIHJlc291cmNlIFVSSTogIiArIChjaGlsZFBrZy5lUmVzb3VyY2UoKSAhPSBudWxsID8gY2hpbGRQa2cuZVJlc291cmNlKCkuZ2V0VVJJKCkgOiBudWxsKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrICJcbiAgUGFyZW50IHBhY2thZ2U6ICIgKyBwa2cgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJKyAiXG4gIFBhcmVudCBwYWNrYWdlJ3MgcmVzb3VyY2UgVVJJOiAiICsgKHBrZy5lUmVzb3VyY2UoKSAhPSBudWxsID8gcGtnLmVSZXNvdXJjZSgpLmdldFVSSSgpIDogbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCTsKLQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKG1zZyk7Ci0JCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIG1pZ3JhdGVQcm9jZXNzQ29udGVudERlc2NyaXB0aW9ucygKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsCi0JCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMubWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbnNUYXNrX25hbWUpOwotCi0JCVN0cmluZ1tdW10gcHJvY1BrZ1BhdGhzID0gTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLlBST0NFU1NfUEFDS0FHRV9QQVRIUzsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmdldE1ldGhvZFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUFycmF5TGlzdCBwcm9jUGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvY1BrZ1BhdGhzLmxlbmd0aDsgaisrKSB7Ci0JCQkJTWV0aG9kUGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQkJCXByb2NQa2dQYXRoc1tqXSk7Ci0JCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJCXByb2NQa2dzLmFkZChwa2cpOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9jUGtncy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGNoaWxkUGtnID0gKE9iamVjdCkgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGNoaWxkUGtnKQotCQkJCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCQkJbWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbihwcm9jKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbihCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYgKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKGUpKSB7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IGUuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlFQ2xhc3MgZUNscyA9IENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbkVDbGFzcyhlKTsKLQkJCWlmIChlQ2xzICE9IGNvbnRlbnQpIHsKLQkJCQlDb250ZW50RGVzY3JpcHRpb24gbmV3Q29udGVudCA9IENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJCS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24oZSk7Ci0JCQkJbmV3Q29udGVudC5zZXRNYWluRGVzY3JpcHRpb24oY29udGVudC5nZXRNYWluRGVzY3JpcHRpb24oKSk7Ci0JCQkJbmV3Q29udGVudC5zZXRLZXlDb25zaWRlcmF0aW9ucyhjb250ZW50LmdldEtleUNvbnNpZGVyYXRpb25zKCkpOwotCQkJCW5ld0NvbnRlbnQuZ2V0U2VjdGlvbnMoKS5hZGRBbGwoY29udGVudC5nZXRTZWN0aW9ucygpKTsKLQkJCQllLnNldFByZXNlbnRhdGlvbihuZXdDb250ZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKEFjdGl2aXR5KSBlKS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQltaWdyYXRlQ29udGVudERlc2NyaXB0aW9uKChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpeFByZXNlbnRhdGlvbk5hbWUoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCWlmIChlLmdldFByZXNlbnRhdGlvbk5hbWUoKSA9PSBudWxsCi0JCQkJfHwgZS5nZXRQcmVzZW50YXRpb25OYW1lKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWUuc2V0UHJlc2VudGF0aW9uTmFtZShlLmdldE5hbWUoKSk7Ci0JCX0KLQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChBY3Rpdml0eSkgZSkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJZml4UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL1VNQTJVTUFSZXNvdXJjZUhhbmRsZXIwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL1VNQTJVTUFSZXNvdXJjZUhhbmRsZXIwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzZDIxYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9VTUEyVU1BUmVzb3VyY2VIYW5kbGVyMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQW55VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVU1BMlVNQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIwIGV4dGVuZHMgVU1BMlVNQVJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIFNldCBwcm9jTW92ZWRGZWF0dXJlTmFtZXM7Ci0KLQlwcml2YXRlIE1hcCBndWlkVG9QcmVzZW50YXRpb25NYXA7Ci0KLQlwcml2YXRlIFNldCBjbGFzc05hbWVzVG9TYXZlUHJlc2VudGF0aW9uVVJJOwotCi0JcHVibGljIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIwKCkgewotCQlzdXBlcigpOwotCi0JCWd1aWRUb1ByZXNlbnRhdGlvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHJvY01vdmVkRmVhdHVyZU5hbWVzID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10gewotCQkJCSJwdXJwb3NlIiAvLyROT04tTkxTLTEkCi0JCQkJLCAia2V5Q29uc2lkZXJhdGlvbnMiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJhbHRlcm5hdGl2ZXMiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJob3d0b1N0YWZmIiAvLyROT04tTkxTLTEkCi0JCQkJLCAidXNhZ2VHdWlkYW5jZSIgLy8kTk9OLU5MUy0xJAotCQkJCSwgImV4dGVybmFsSWQiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJzY29wZSIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInVzYWdlTm90ZXMiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJzY2FsZSIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInByb2plY3RDaGFyYWN0ZXJpc3RpY3MiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJyaXNrTGV2ZWwiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJlc3RpbWF0aW5nVGVjaG5pcXVlIiAvLyROT04tTkxTLTEkCi0JCQkJLCAicHJvamVjdE1lbWJlckV4cGVydGlzZSIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInR5cGVPZkNvbnRyYWN0IiAvLyROT04tTkxTLTEkCi0JCQkJLCAidGVjaG5pcXVlcyIgLy8kTk9OLU5MUy0xJAotCQkJCSwgIm1haW5EZXNjcmlwdGlvbiIgLy8kTk9OLU5MUy0xJAotCQl9KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVNQTJVTUFSZXNvdXJjZUhhbmRsZXIjZ2V0TmV3RmVhdHVyZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXROZXdGZWF0dXJlKEVPYmplY3Qgb3duZXIsIFN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlpZiAoInByZXNlbnRhdGlvbk5hbWUiLmVxdWFscyhmZWF0dXJlTmFtZSkgJiYgb3duZXIgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpOwotCQl9Ci0JCWlmIChwcm9jTW92ZWRGZWF0dXJlTmFtZXMuY29udGFpbnMoZmVhdHVyZU5hbWUpKSB7Ci0JCQlpZiAob3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKChQcm9jZXNzRWxlbWVudCkgb3duZXIpCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSBnZXRFQXR0cmlidXRlKGNvbnRlbnQuZUNsYXNzKCksIGZlYXR1cmVOYW1lKTsKLQkJCQlpZiAoYXR0cmliICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGF0dHJpYjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCJXb3JrT3JkZXIiLmVxdWFscyhmZWF0dXJlTmFtZSkgJiYgb3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0TmV3RmVhdHVyZShvd25lciwgZmVhdHVyZU5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VTUEyVU1BUmVzb3VyY2VIYW5kbGVyI2dldE5ld093bmVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXROZXdPd25lcihFT2JqZWN0IG9sZE93bmVyLCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJaWYgKCJwcmVzZW50YXRpb25OYW1lIi5lcXVhbHMoZmVhdHVyZU5hbWUpICYmIG9sZE93bmVyIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7IC8vJE5PTi1OTFMtMSQKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvbGRPd25lci5lQ29udGFpbmVyKCkpOwotCQkJaWYgKGRlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBkZTsKLQkJfQotCQlpZiAocHJvY01vdmVkRmVhdHVyZU5hbWVzLmNvbnRhaW5zKGZlYXR1cmVOYW1lKQotCQkJCSYmIG9sZE93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NFbGVtZW50KSBvbGRPd25lcikuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCX0KLQkJaWYgKCJXb3JrT3JkZXIiLmVxdWFscyhmZWF0dXJlTmFtZSkgJiYgb2xkT3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gb2xkT3duZXI7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0TmV3T3duZXIob2xkT3duZXIsIGZlYXR1cmVOYW1lKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VTUEyVU1BUmVzb3VyY2VIYW5kbGVyI2dldE5ld1ZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQW55VHlwZSkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE5ld1ZhbHVlKEVPYmplY3Qgb2xkT3duZXIsIFN0cmluZyBmZWF0dXJlTmFtZSwgQW55VHlwZSB2YWx1ZSkgewotCQlpZiAoIldvcmtPcmRlciIuZXF1YWxzKGZlYXR1cmVOYW1lKSAmJiBvbGRPd25lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKTsKLQkJCXdvcmtPcmRlci5zZXRHdWlkKChTdHJpbmcpIGdldFNpbmdsZVZhbHVlKHZhbHVlLmdldEFueUF0dHJpYnV0ZSgpLAotCQkJCQkiZ3VpZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHByZWRHdWlkID0gKFN0cmluZykgZ2V0U2luZ2xlVmFsdWUodmFsdWUuZ2V0QW55QXR0cmlidXRlKCksCi0JCQkJCSJwcmVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChwcmVkR3VpZCA9PSBudWxsKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG9iaiA9IChJbnRlcm5hbEVPYmplY3QpIGdldFNpbmdsZVZhbHVlKHZhbHVlCi0JCQkJCQkuZ2V0TWl4ZWQoKSwgInByZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXByZWRHdWlkID0gb2JqLmVQcm94eVVSSSgpLmF1dGhvcml0eSgpOwotCQkJfQotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgb2xkT3duZXIKLQkJCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSByZXNvdXJjZVNldAotCQkJCQkuZ2V0RU9iamVjdChwcmVkR3VpZCk7Ci0JCQl3b3JrT3JkZXIuc2V0UHJlZChwcmVkKTsKLQkJCXdvcmtPcmRlci5zZXRMaW5rVHlwZShXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0hfTElURVJBTCk7Ci0JCQlyZXR1cm4gd29ya09yZGVyOwotCQl9Ci0JCXJldHVybiBnZXRUZXh0KHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlUHJlc2VudGF0aW9uVVJJRm9yKFNldCBjbGFzc05hbWVzKSB7Ci0JCWNsYXNzTmFtZXNUb1NhdmVQcmVzZW50YXRpb25VUkkgPSBjbGFzc05hbWVzOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0UHJlc2VudGF0aW9uVVJJKFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiAoVVJJKSBndWlkVG9QcmVzZW50YXRpb25NYXAuZ2V0KGd1aWQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLk1pZ3JhdGlvblJlc291cmNlSGFuZGxlciNoYW5kbGVVbmtub3duRGF0YShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVVbmtub3duRGF0YShFT2JqZWN0IGUsIEFueVR5cGUgdW5rbm93bkRhdGEpIHsKLQkJc3VwZXIuaGFuZGxlVW5rbm93bkRhdGEoZSwgdW5rbm93bkRhdGEpOwotCQkKLQkJaWYgKGNsYXNzTmFtZXNUb1NhdmVQcmVzZW50YXRpb25VUkkgIT0gbnVsbAotCQkJCSYmIGUgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0VmFsdWUodW5rbm93bkRhdGEuZ2V0TWl4ZWQoKSwgImNvbnRlbnRFbGVtZW50cyIpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeyAvLyROT04tTkxTLTEkCi0JCQkJQW55VHlwZSB2YWx1ZSA9IChBbnlUeXBlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbAotCQkJCQkJJiYgY2xhc3NOYW1lc1RvU2F2ZVByZXNlbnRhdGlvblVSSS5jb250YWlucyh2YWx1ZQotCQkJCQkJCQkuZUNsYXNzKCkuZ2V0TmFtZSgpKSkgewotCQkJCQlPYmplY3QgcHJlc2VudGF0aW9uID0gZ2V0U2luZ2xlVmFsdWUodmFsdWUuZ2V0TWl4ZWQoKSwKLQkJCQkJCQkicHJlc2VudGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKHByZXNlbnRhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3QgZ3VpZCA9IGdldFNpbmdsZVZhbHVlKHZhbHVlLmdldEFueUF0dHJpYnV0ZSgpLAotCQkJCQkJCQkiZ3VpZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlVUkkgdXJpID0gKChJbnRlcm5hbEVPYmplY3QpIHByZXNlbnRhdGlvbikuZVByb3h5VVJJKCk7Ci0JCQkJCQlndWlkVG9QcmVzZW50YXRpb25NYXAucHV0KGd1aWQsIHVyaSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmYzZTAxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1udGF0aW9uIGZvciB1cGdyYWRpbmcgYSBtZXRob2QgbGlicmFyeSB0byBhIG5ld2VyIFVNQSB2ZXJzaW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiZjA2ZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdXBncmFkaW5nIGEgbWV0aG9kIGxpYnJhcnkgdG8gYSBuZXdlciBVTUEgdmVyc2lvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTZiMDdkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9uIGZvciBwZXJzaXN0aW5nIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwODc0ZWYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL0lSZWZyZXNoRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogSW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBwcm92aWRlcyBkYXRhIGFib3V0IGEgcmVmcmVzaCBldmVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVmcmVzaEV2ZW50IHsKLQotCS8qKgotCSAqIEdldHMgcmVzb3VyY2VzIHRoYXQgaGFkIGJlZW4gcmVmcmVzaGVkLgotCSAqIAotCSAqIEByZXR1cm4gcmVmcmVzaGVkIHJlc291cmNlcwotCSAqLwotCUNvbGxlY3Rpb24gZ2V0UmVmcmVzaGVkUmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBHZXRzIG9iamVjdHMgdGhhdCBoYWQgYmVlbiB1bmxvYWRlZCBhbmQgYmVjb21lIHByb3hpZXMgYWZ0ZXIgcmVmcmVzaAotCSAqIAotCSAqIEByZXR1cm4gdW5sb2FkZWQgb2JqZWN0cwotCSAqLwotCUNvbGxlY3Rpb24gZ2V0VW5sb2FkZWRPYmplY3RzKCk7Ci0KLQkvKioKLQkgKiBHZXRzIG9iamVjdHMgdGhhdCBoYWQgYmVlbiByZWZyZXNoZWQuCi0JICogCi0JICogQHJldHVybiByZWZyZXNoZWQgb2JqZWN0cwotCSAqLwotCUNvbGxlY3Rpb24gZ2V0UmVmcmVzaGVkT2JqZWN0cygpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjQ5YmJiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogSW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aWxsIGJlIG5vdGlmeSBhYm91dCBjaGFuZ2VzIGluIHJlc291cmNlcyBzbyBpdCBjYW4KLSAqIHJlYWN0IGFjY29yZGluZ2x5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hIYW5kbGVyIHsKLQotCXZvaWQgcmVmcmVzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0MTM0MTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2g7Ci0KLS8qKgotICogSW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgaWYgbGlzdGVuaW5nIHRvIHJlZnJlc2ggZXZlbnQsIHdpbGwgZ2V0IG5vdGlmaWVkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWZyZXNoTGlzdGVuZXIgewotCi0Jdm9pZCBub3RpZnlSZWZyZXNoZWQoSVJlZnJlc2hFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL1JlZnJlc2hKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL1JlZnJlc2hKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjY0ZTRjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9SZWZyZXNoSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2g7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBCYWNrZ3JvdW5kIGpvYiB0aGF0IGtlZXBzIG5vdGlmeWluZyByZWZyZXNoIGhhbmRsZXJzIGFib3V0IGNoYW5nZXMgaW4KLSAqIHJlc291cmNlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaEpvYiBleHRlbmRzIFdvcmtzcGFjZUpvYiBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVBEQVRFX0RFTEFZID0gMjAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1BSRUZJWCA9ICJFUEYgQXV0by1yZWZyZXNoOiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gYWRkZWRSZXNvdXJjZXMgPSBuZXcgVW5pcXVlRUxpc3QoKTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBVbmlxdWVFTGlzdCgpOwotCQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb3ZlZFJlc291cmNlcyA9IG5ldyBVbmlxdWVFTGlzdCgpOwotCi0JcHJpdmF0ZSBVbmlxdWVFTGlzdCBzYXZlZFJlc291cmNlcyA9IG5ldyBVbmlxdWVFTGlzdCgpOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIElSZWZyZXNoSGFuZGxlciByZWZyZXNoSGFuZGxlcjsKLQotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBhZGRlZFdvcmtzcGFjZVJlc291cmNlcyA9IG5ldyBVbmlxdWVFTGlzdCgpOwotCi0JcHJpdmF0ZSBSZWZyZXNoSm9iKCkgewotCQlzdXBlcigiRVBGIEF1dG8tUmVmcmVzaCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGIpIHsKLQkJZW5hYmxlZCA9IGI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZVNldCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VTZXQoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJdGhpcy5yZXNvdXJjZVNldCA9IHJlc291cmNlU2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hIYW5kbGVyKElSZWZyZXNoSGFuZGxlciBoYW5kbGVyKSB7Ci0JCXJlZnJlc2hIYW5kbGVyID0gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGV4aXN0aW5nIHJlc291cmNlcyB0aGF0IHJlYXBwZWFyIGluIHdvcmtzcGFjZXMKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGRlZFJlc291cmNlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFkZGVkUmVzb3VyY2VzKCkgewotCQlyZW1vdmVSZXNvdXJjZXMoYWRkZWRSZXNvdXJjZXMsIHNhdmVkUmVzb3VyY2VzKTsKLQkJcmV0dXJuIGFkZGVkUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFkZGVkV29ya3NwYWNlUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjaGFuZ2VkUmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoYW5nZWRSZXNvdXJjZXMoKSB7Ci0JCXJlbW92ZVJlc291cmNlcyhjaGFuZ2VkUmVzb3VyY2VzLCBzYXZlZFJlc291cmNlcyk7Ci0JCXJlbW92ZVJlc291cmNlcyhjaGFuZ2VkUmVzb3VyY2VzLCBsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzKTsKLQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyA8Y29kZT5yZXNvdXJjZXNUb1JlbW92ZTwvY29kZT4gZnJvbSA8Y29kZT5yZXNvdXJjZXM8L2NvZGU+IGlmCi0JICogdGhlIHJlc291cmNlcyBhcmUgc3luY2hyb25pemVkIHdpdGggdGhlaXIgc3RvcmFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzVG9SZW1vdmUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZVJlc291cmNlcyhDb2xsZWN0aW9uIHJlc291cmNlcywKLQkJCUNvbGxlY3Rpb24gcmVzb3VyY2VzVG9SZW1vdmUpIHsKLQkJc3luY2hyb25pemVkIChyZXNvdXJjZXNUb1JlbW92ZSkgewotCQkJaWYgKCFyZXNvdXJjZXNUb1JlbW92ZS5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXNUb1JlbW92ZS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgcmVzb3VyY2UgPSBpdGVyLm5leHQoKTsKLQkJCQkJYm9vbGVhbiBjYW5SZW1vdmUgPSB0cnVlOwotCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCBtZlJlc291cmNlID0gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlKTsKLQkJCQkJCWxvbmcgY3VycmVudFRpbWUgPSBuZXcgRmlsZShtZlJlc291cmNlLmdldFVSSSgpCi0JCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSkubGFzdE1vZGlmaWVkKCk7Ci0JCQkJCQljYW5SZW1vdmUgPSBjdXJyZW50VGltZSA9PSBtZlJlc291cmNlCi0JCQkJCQkJCS5nZXRGaWxlTGFzdE1vZGlmaWVkKCkKLQkJCQkJCQkJfHwgTXVsdGlGaWxlU2F2ZVV0aWwuc2FtZShjdXJyZW50VGltZSwKLQkJCQkJCQkJCQltZlJlc291cmNlLmdldEZpbGVMYXN0TW9kaWZpZWQoKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGNhblJlbW92ZSkgewotCQkJCQkJaWYgKHJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpKSB7Ci0JCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVtb3ZlZFJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZW1vdmVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlczsKLQl9Ci0JCi0JLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBtb3ZlZFJlc291cmNlcy4gCi0JICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW92ZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBtb3ZlZFJlc291cmNlczsgICAgICAgICAgICAgCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQlwdWJsaWMgdm9pZCByZXNvdXJjZVNhdmVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN5bmNocm9uaXplZCAoc2F2ZWRSZXNvdXJjZXMpIHsKLQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOwotCQlyZW1vdmVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCW1vdmVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMuY2xlYXIoKTsKLQkJYWRkZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMuY2xlYXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2NoZWR1bGVSZWZyZXNoKCkgewotCQlpZiAoZ2V0U3RhdGUoKSA9PSBKb2IuTk9ORSkgewotCQkJc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgV29ya3NwYWNlSm9iI3J1bkluV29ya3NwYWNlCi0JICovCi0JcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChyZWZyZXNoSGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0KLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlUaHJvd2FibGUgZXJyb3IgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihERUJVR19QUkVGSVggKyAiIHN0YXJ0aW5nIHJlZnJlc2ggam9iIik7IC8vJE5PTi1OTFMtMSQKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl0cnkgewotCQkJCXJlZnJlc2hIYW5kbGVyLnJlZnJlc2gobW9uaXRvcik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWVycm9yID0gZTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKERFQlVHX1BSRUZJWAotCQkJCQkJCQkrICIgZmluaXNoZWQgcmVmcmVzaCBqb2IgaW46ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKGVycm9yICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBGaWxlTWFuYWdlci5QTFVHSU5fSUQsIDAsCi0JCQkJCSJSZWZyZXNoIGVycm9yIiwgZXJyb3IpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3Nob3VsZFJ1bigpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNob3VsZFJ1bigpIHsKLQkJcmV0dXJuIHNob3VsZFJlZnJlc2goKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkUmVmcmVzaCgpIHsKLQkJcmV0dXJuICFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCAhY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQl8fCAhYWRkZWRSZXNvdXJjZXMuaXNFbXB0eSgpIHx8ICFtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQl8fCAhbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQl8fCAhYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgcmVmcmVzaCBqb2IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlZnJlc2hKb2Iuc3RhcnQoKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogU3RvcHMgdGhlIHJlZnJlc2ggam9iCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlZnJlc2hKb2Iuc3RvcCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJY2FuY2VsKCk7Ci0JfQotCi0JLy9UT0RPOiBtb3ZlIHRoaXMgbWV0aG9kIHRvIGEgdXRpbGl0eSBjbGFzcyBhbmQgbWFrZSBpdCBzdGF0aWMKLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoU3RyaW5nIHBhdGgpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHBhdGgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KHJlc291cmNlU2V0LmdldFJlc291cmNlcygpKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmICh1cmkuZXF1YWxzKHJlc291cmNlLmdldFVSSSgpKSkgewotCQkJCXJldHVybiByZXNvdXJjZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvL1RPRE86IG1vdmUgdGhpcyBtZXRob2QgdG8gYSB1dGlsaXR5IGNsYXNzIGFuZCBtYWtlIGl0IHN0YXRpYwotCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShJUmVzb3VyY2Ugd3NSZXMpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKHdzUmVzLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiByZXNvdXJjZSBjYW4gYmUgYWNjZXB0ZWQgYXMgYSBuZXcgcmVzb3VyY2Ugb2YKLQkgKiByZXNvdXJjZSBzZXQgb2YgdGhpcyByZWZyZXNoIGpvYiB0aGF0IG5lZWRzIHRvIGJlIGxvYWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFjY2VwdChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQlyZXR1cm4gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlU2V0KQotCQkJCQkuaXNOZXdSZXNvdXJjZVRvTG9hZChyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoIWlzRW5hYmxlZCgpIHx8IHJlc291cmNlU2V0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCQkJcHJpdmF0ZSBDb2xsZWN0aW9uIGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCQlwcml2YXRlIENvbGxlY3Rpb24gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkKLQkJCQlwcml2YXRlIENvbGxlY3Rpb24gbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCQlwcml2YXRlIENvbGxlY3Rpb24gYWRkZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCQlwcml2YXRlIEFycmF5TGlzdCBhZGRlZFdvcmtzcGFjZVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlOwotCQkJCQlJUGF0aCBwYXRoOwotCQkJCQlTdHJpbmcgbG9jOwotCQkJCQlpZiAoZGVsdGEuZ2V0RmxhZ3MoKSAhPSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTCi0JCQkJCQkJJiYgZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEOgotCQkJCQkJCS8vIGhhbmRsZSBhZGRlZCByZXNvdXJjZQotCQkJCQkJCS8vCi0JCQkJCQkJcGF0aCA9IGRlbHRhLmdldFJlc291cmNlKCkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkJCWxvYyA9IHBhdGgudG9TdHJpbmcoKTsKLQkJCQkJCQkJcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShsb2MpOwotCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKCFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQkJCQkJLy8gdGhlIHJlc291cmNlIHdhcyBjcmVhdGVkIGJ1dCBub3QKLQkJCQkJCQkJCQkvLyBsb2FkZWQgYi9jIHRoZSB3b3Jrc3BhY2UgcmVzb3VyY2UKLQkJCQkJCQkJCQkvLyB3YXMgbm90IGFkZGVkIHRvIHRoZSB3b3Jrc3BhY2UgYXQgdGhlCi0JCQkJCQkJCQkJLy8gdGltZSBvZiBsb2FkaW5nCi0JCQkJCQkJCQkJLy8KLQkJCQkJCQkJCQlNZXRob2RFbGVtZW50IG1lID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQkJCQkJCQkJaWYgKCEobWUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pKSB7Ci0JCQkJCQkJCQkJCS8vIG5vIGF1dG8tcmVsb2FkIGZvciBjb250ZW50Ci0JCQkJCQkJCQkJCS8vIGRlc2NyaXB0aW9uCi0JCQkJCQkJCQkJCS8vIE1ldGhvZEVsZW1lbnRFZGl0b3Igd2lsbCBkZXRlY3QKLQkJCQkJCQkJCQkJLy8gdGhlIGNoYW5nZSBhbmQgbG9hZCBpdAotCQkJCQkJCQkJCQkvLyB3aGVuIGFjdGl2YXRlZC4KLQkJCQkJCQkJCQkJLy8KLQkJCQkJCQkJCQkJYWRkZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSBpZiAoYWNjZXB0KGRlbHRhLmdldFJlc291cmNlKCkpKSB7Ci0JCQkJCQkJCQlhZGRlZFdvcmtzcGFjZVJlc291cmNlcy5hZGQoZGVsdGEKLQkJCQkJCQkJCQkJLmdldFJlc291cmNlKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOgotCQkJCQkJCWlmICgoSVJlc291cmNlRGVsdGEuTU9WRURfVE8gJiBkZWx0YS5nZXRGbGFncygpKSAhPSAwKSB7Ci0JCQkJCQkJCS8vIGhhbmRsZSBmaWxlIG1vdmUKLQkJCQkJCQkJcGF0aCA9IGRlbHRhLmdldFJlc291cmNlKCkuZ2V0TG9jYXRpb24oKTsgICAgICAgICAgICAgCi0JCQkJCQkJCWlmKHBhdGggIT0gbnVsbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJCQkJcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShwYXRoLnRvU3RyaW5nKCkpOyAgICAgICAgICAKLQkJCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQkJCQkJbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsgICAgICAgICAgICAgICAgIAotCQkJCQkJCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQkJCS8vCi0JCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQkJSVBhdGggbW92ZWRGcm9tUGF0aCA9IGRlbHRhLmdldFJlc291cmNlKCkKLQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJCQlJUGF0aCBtb3ZlZFRvUGF0aCA9IGRlbHRhLmdldE1vdmVkVG9QYXRoKCk7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJCS5wcmludGxuKCJSZXNvdXJjZSBtb3ZlZCBmcm9tICciICsgbW92ZWRGcm9tUGF0aCArICInIHRvICciICsgbW92ZWRUb1BhdGggKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJCQl9Ci0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlwYXRoID0gZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlyZXNvdXJjZSA9IGdldFJlc291cmNlKHBhdGgudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKLQkJCQkJCQlib29sZWFuIGVuY29kaW5nQ2hhbmdlZCA9ICgoSVJlc291cmNlRGVsdGEuRU5DT0RJTkcgJiBkZWx0YQotCQkJCQkJCQkJLmdldEZsYWdzKCkpICE9IDApOwotCQkJCQkJCWJvb2xlYW4gY29udGVudENoYW5nZWQgPSAoKElSZXNvdXJjZURlbHRhLkNPTlRFTlQgJiBkZWx0YQotCQkJCQkJCQkJLmdldEZsYWdzKCkpICE9IDApOwotCQkJCQkJCWlmIChlbmNvZGluZ0NoYW5nZWQgfHwgY29udGVudENoYW5nZWQpIHsKLQkJCQkJCQkJcGF0aCA9IGRlbHRhLmdldFJlc291cmNlKCkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCQkJCQkJbG9jID0gcGF0aC50b1N0cmluZygpOwotCQkJCQkJCQkJcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShsb2MpOwotCQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwKLQkJCQkJCQkJCQkJJiYgTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCQkJCQkJCQkuY2hlY2tTeW5jaHJvbml6ZWQocmVzb3VyY2UpICE9IDEpIHsKLQkJCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gd2F0Y2ggZm9yIHByb2plY3QgbW92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQllbHNlIGlmIChkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQkJJiYgZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsgICAgICAgICAgICAgICAgICAKLQkJCQkJCS8vIHRlc3RlZCB1c2luZyB0aGUgTW92ZS4uIGNvbW1hbmQgaW4gdGhlIFJlc291cmNlIE5hdmlnYXRvciB2aWV3ICAgICAgICAgICAgIAotCQkJCQkJLy8gdGhlIFJFUExBQ0VEIGZsYWcgb25seSBzZWVtZWQgdG8gb2NjdXIgd2hlbiB0aGUgbGlicmFyeSB3YXMgbW92ZWQgICAgICAgICAgCi0JCQkJCQkvLyBvdXRzaWRlIG9mIEVQRiBhbmQgRVBGIHdhcyByZS1zdGFydGVkLCBzbyBtYWtlIHN1cmUgaXQncyBjbGVhciwgb3RoZXJ3aXNlICAKLQkJCQkJCS8vIHdlIHJlbG9hZCB0aGUgbGlicmFyeSByaWdodCBhZnRlciBsb2FkaW5nIGl0IHdoZW4gc3RhcnRpbmcgRVBGICAgICAgICAgICAgIAotCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQkJCSgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSA9PSAwKSAmJiAgICAgICAgICAgICAgICAKLQkJCQkJCQkJKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuREVTQ1JJUFRJT04pICE9IDApKSB7ICAgICAgICAgICAgIAotCQkJCQkJCW1vdmVkUmVzb3VyY2VzLmFkZChkZWx0YS5nZXRSZXNvdXJjZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsKLQkJCQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0JCQkJfQotCi0JCQkJcHVibGljIENvbGxlY3Rpb24gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsKLQkJCQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7Ci0JCQkJfQotCi0JCQkJcHVibGljIENvbGxlY3Rpb24gZ2V0TW92ZWRSZXNvdXJjZXMoKSB7ICAgIAotCQkJCQlyZXR1cm4gbW92ZWRSZXNvdXJjZXM7ICAgICAgICAgICAgICAgICAKLQkJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQl9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0JCQlSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCk7Ci0JCQlkZWx0YS5hY2NlcHQodmlzaXRvcik7Ci0KLQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsKLQkJCW1vdmVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldE1vdmVkUmVzb3VyY2VzKCkpOwotCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotCQkJYWRkZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuYWRkZWRSZXNvdXJjZXMpOwotCQkJYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMpOwotCi0JCQlpZiAoc2hvdWxkUmVmcmVzaCgpKSB7Ci0JCQkJc2NoZWR1bGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc29sdmVzIHRoZSBwcm94eSBhbmQgaXRzIGNvbnRhaW5lcnMKLQkgKiAKLQkgKiBUT0RPOiBtb3ZlIHRoaXMgbWV0aG9kIHRvIGEgdXRpbGl0eSBjbGFzcyBhbmQgbWFrZSBpdCBzdGF0aWMKLQkgKiAKLQkgKiBAcGFyYW0gcHJveHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVPYmplY3QgcmVzb2x2ZShFT2JqZWN0IHByb3h5KSB7Ci0JCUVPYmplY3QgcmVzb2x2ZWQ7Ci0JCXRyeSB7Ci0JCQlyZXNvbHZlZCA9IEVjb3JlVXRpbC5yZXNvbHZlKHByb3h5LCByZXNvdXJjZVNldCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXNvbHZlZCA9IHByb3h5OwotCQl9Ci0JCUVPYmplY3QgY29udGFpbmVyID0gcHJveHkuZUNvbnRhaW5lcigpOwotCQlpZiAocmVzb2x2ZWQuZUNvbnRhaW5lcigpID09IG51bGwgJiYgY29udGFpbmVyICE9IG51bGwpIHsKLQkJCWlmIChjb250YWluZXIuZUlzUHJveHkoKSkgewotCQkJCWNvbnRhaW5lciA9IHJlc29sdmUoY29udGFpbmVyKTsKLQkJCX0KLQkJCUVSZWZlcmVuY2UgcmVmID0gcHJveHkuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQkJaWYgKHJlZi5pc01hbnkoKSkgewotCQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIGNvbnRhaW5lci5lR2V0KHJlZik7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyBpdGVyCi0JCQkJCQkubmV4dCgpKQotCQkJCQk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbnRhaW5lci5lR2V0KHJlZik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVkOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVmcmVzaEpvYiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFJlZnJlc2hKb2IgaW5zdGFuY2UgPSBuZXcgUmVmcmVzaEpvYigpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvaW50ZXJuYWwvUmVmcmVzaEV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9pbnRlcm5hbC9SZWZyZXNoRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y5ZDM1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9pbnRlcm5hbC9SZWZyZXNoRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hFdmVudDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBjbGFzcyBvZiBJUmVmcmVzaEV2ZW50Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZyZXNoRXZlbnQgaW1wbGVtZW50cyBJUmVmcmVzaEV2ZW50IHsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiByZWZyZXNoZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gdW5sb2FkZWRPYmplY3RzOwotCQotCXByaXZhdGUgQ29sbGVjdGlvbiByZWZyZXNoZWRPYmplY3RzOwotCi0JcHVibGljIFJlZnJlc2hFdmVudChDb2xsZWN0aW9uIHJlZnJlc2hlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb24gdW5sb2FkZWRPYmplY3RzKSB7Ci0JCXRoaXMocmVmcmVzaGVkUmVzb3VyY2VzLCB1bmxvYWRlZE9iamVjdHMsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCX0JCi0KLQkvKioKLQkgKiBAcGFyYW0gcmVmcmVzaGVkUmVzb3VyY2VzCi0JICogQHBhcmFtIHVubG9hZGVkT2JqZWN0cwotCSAqIEBwYXJhbSByZWZyZXNoZWRPYmplY3RzCi0JICovCi0JcHVibGljIFJlZnJlc2hFdmVudChDb2xsZWN0aW9uIHJlZnJlc2hlZFJlc291cmNlcywgQ29sbGVjdGlvbiB1bmxvYWRlZE9iamVjdHMsIENvbGxlY3Rpb24gcmVmcmVzaGVkT2JqZWN0cykgewotCQlzdXBlcigpOwotCQl0aGlzLnJlZnJlc2hlZFJlc291cmNlcyA9IHJlZnJlc2hlZFJlc291cmNlczsKLQkJdGhpcy51bmxvYWRlZE9iamVjdHMgPSB1bmxvYWRlZE9iamVjdHM7Ci0JCXRoaXMucmVmcmVzaGVkT2JqZWN0cyA9IHJlZnJlc2hlZE9iamVjdHM7Ci0JfQotCi0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hFdmVudCNnZXRSZWZyZXNoZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlZnJlc2hlZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHJlZnJlc2hlZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoRXZlbnQjZ2V0VW5sb2FkZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRVbmxvYWRlZE9iamVjdHMoKSB7Ci0JCXJldHVybiB1bmxvYWRlZE9iamVjdHM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hFdmVudCNnZXRSZWZyZXNoZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZWZyZXNoZWRPYmplY3RzKCkgewotCQlyZXR1cm4gcmVmcmVzaGVkT2JqZWN0czsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzZDdiNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBtYW5hZ2luZyBtZXRob2QgbGlicmFyeSByZWZyZXNoZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YWI3YzU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciBtYW5hZ2luZyBtZXRob2QgbGlicmFyeSByZWZyZXNoZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvTGlicmFyeVNjaGVkdWxpbmdSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9MaWJyYXJ5U2NoZWR1bGluZ1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2YzNmJlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9MaWJyYXJ5U2NoZWR1bGluZ1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFNjaGVkdWxpbmcgcnVsZSB1c2VkIHRvIGxvY2sgYSBsaWJyYXJ5IGR1cmluZyBhIG9wZXJhdGlvbiBhbmQgZGVmZXIgdGhlCi0gKiBicm9hZGNhc3Rpbmcgb2YgcmVzb3VyY2UgY2hhbmdlIGV2ZW50IHVudGlsIHRoZSBvcGVyYXRpb24gaXMgZmluaXNoZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDE1LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2NoZWR1bGluZ1J1bGUgaW1wbGVtZW50cyBJU2NoZWR1bGluZ1J1bGUgewotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCi0JLyoqCi0JICogQHBhcmFtIGxpYgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5U2NoZWR1bGluZ1J1bGUoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJdGhpcy5saWJyYXJ5ID0gbGliOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlI2NvbnRhaW5zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlpZiAodGhpcyA9PSBydWxlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAocnVsZSBpbnN0YW5jZW9mIExpYnJhcnlTY2hlZHVsaW5nUnVsZSkgewotCQkJcmV0dXJuICgoTGlicmFyeVNjaGVkdWxpbmdSdWxlKSBydWxlKS5saWJyYXJ5ID09IGxpYnJhcnk7Ci0JCX0KLQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBNdWx0aVJ1bGUpIHsKLQkJCU11bHRpUnVsZSBtcnVsZSA9IChNdWx0aVJ1bGUpIHJ1bGU7Ci0JCQlJU2NoZWR1bGluZ1J1bGVbXSBjaGlsZFJ1bGVzID0gbXJ1bGUuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZFJ1bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCEgKGNoaWxkUnVsZXNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIGFsbG93IGFueSBJUmVzb3VyY2UgcnVsZSB0byBuZXN0IHdpdGhpbiB0aGUgc2FtZSB0aHJlYWQKLQkJLy8KLQkJcmV0dXJuIHJ1bGUgaW5zdGFuY2VvZiBJUmVzb3VyY2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGUjaXNDb25mbGljdGluZyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25mbGljdGluZyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlyZXR1cm4gZXF1YWxzKHJ1bGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdGhpcyA9PSBvYmoKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgTGlicmFyeVNjaGVkdWxpbmdSdWxlICYmICgoTGlicmFyeVNjaGVkdWxpbmdSdWxlKSBvYmopLmxpYnJhcnkgPT0gbGlicmFyeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9QYXR0ZXJuQ29uc3RydWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BhdHRlcm5Db25zdHJ1Y3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjQ2ZTYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BhdHRlcm5Db25zdHJ1Y3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5TeW50YXhFeGNlcHRpb247Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIHN0YXRpYyBtZXRob2RzIHRvIGNyZWF0ZSBzZWFyY2ggcGF0dGVybgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGF0dGVybkNvbnN0cnVjdG9yIHsKLQotCXByaXZhdGUgUGF0dGVybkNvbnN0cnVjdG9yKCkgewotCQkvLyBkb24ndCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUGF0dGVybiBjcmVhdGVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuLAotCQkJYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIGJvb2xlYW4gaXNSZWdleCkKLQkJCXRocm93cyBQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVBhdHRlcm4ocGF0dGVybiwgaXNSZWdleCwgdHJ1ZSwgaXNDYXNlU2Vuc2l0aXZlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHBhdHRlcm4gZWxlbWVudCBmcm9tIHRoZSBwYXR0ZXJuIHN0cmluZyB3aGljaCBpcyBlaXRoZXIgYQotCSAqIHJlZy1leCBleHByZXNzaW9uIG9yIGluIG91ciBvbGQgJ1N0cmluZ01hdGNoZXInIGZvcm1hdC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0dGVybgotCSAqICAgICAgICAgICAgVGhlIHNlYXJjaCBwYXR0ZXJuCi0JICogQHBhcmFtIGlzUmVnZXgKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYXNzZWQgc3RyaW5nIGFscmVhZHkgaXMgYSByZWctZXgKLQkgKiAgICAgICAgICAgIHBhdHRlcm4KLQkgKiBAcGFyYW0gaXNTdHJpbmdNYXRjaGVyCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFzc2VkIHN0cmluZyBpcyBpbiB0aGUKLQkgKiAgICAgICAgICAgIFN0cmluZ01hdGNoZXIgZm9ybWF0LgotCSAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUKLQkgKiAgICAgICAgICAgIFNldCB0byA8Y29kZT50cnVlPC9jb2RlPiB0byBjcmVhdGUgYSBjYXNlIGluc2Vuc2l0aXZlCi0JICogICAgICAgICAgICBwYXR0ZXJuCi0JICogQHBhcmFtIGlzV2hvbGVXb3JkCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byBjcmVhdGUgYSBwYXR0ZXJuIHRoYXQgcmVxdWlyZXMgYSB3b3JkCi0JICogICAgICAgICAgICBib3VuZGFyeSBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kLgotCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgcGF0dGVybgotCSAqIEB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGF0dGVybiBjcmVhdGVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuLCBib29sZWFuIGlzUmVnZXgsCi0JCQlib29sZWFuIGlzU3RyaW5nTWF0Y2hlciwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsCi0JCQlib29sZWFuIGlzV2hvbGVXb3JkKSB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlZ2V4KSB7Ci0JCQlpZiAoaXNXaG9sZVdvcmQpIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwYXR0ZXJuLmxlbmd0aCgpICsgMTApOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlxcYig/OiIpLmFwcGVuZChwYXR0ZXJuKS5hcHBlbmQoIilcXGIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcGF0dGVybiA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaW50IGxlbiA9IHBhdHRlcm4ubGVuZ3RoKCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4gKyAxMCk7Ci0JCQkvLyBkb24ndCBhZGQgYSB3b3JkIGJvdW5kYXJ5IGlmIHRoZSBzZWFyY2ggdGV4dCBkb2VzIG5vdCBzdGFydCB3aXRoCi0JCQkvLyBhIHdvcmQgY2hhci4gKHRoaXMgd29ya3MgYXJvdW5kIGEgdXNlciBpbnB1dCBlcnJvcikuCi0JCQlpZiAoaXNXaG9sZVdvcmQgJiYgbGVuID4gMCAmJiBpc1dvcmRDaGFyKHBhdHRlcm4uY2hhckF0KDApKSkgewotCQkJCWJ1ZmZlci5hcHBlbmQoIlxcYiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlhcHBlbmRBc1JlZ0V4KGlzU3RyaW5nTWF0Y2hlciwgcGF0dGVybiwgYnVmZmVyKTsKLQkJCWlmIChpc1dob2xlV29yZCAmJiBsZW4gPiAwICYmIGlzV29yZENoYXIocGF0dGVybi5jaGFyQXQobGVuIC0gMSkpKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXFxiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXBhdHRlcm4gPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCWludCByZWdleE9wdGlvbnMgPSBQYXR0ZXJuLk1VTFRJTElORTsKLQkJaWYgKCFpc0Nhc2VTZW5zaXRpdmUpIHsKLQkJCXJlZ2V4T3B0aW9ucyB8PSBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLlVOSUNPREVfQ0FTRTsKLQkJfQotCQlyZXR1cm4gUGF0dGVybi5jb21waWxlKHBhdHRlcm4sIHJlZ2V4T3B0aW9ucyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dvcmRDaGFyKGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcGF0dGVybiBlbGVtZW50IGZyb20gYW4gYXJyYXkgb2YgcGF0dGVybnMgaW4gdGhlIG9sZAotCSAqICdTdHJpbmdNYXRjaGVyJyBmb3JtYXQuCi0JICogCi0JICogQHBhcmFtIHBhdHRlcm5zCi0JICogICAgICAgICAgICBUaGUgc2VhcmNoIHBhdHRlcm5zCi0JICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZQotCSAqICAgICAgICAgICAgU2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IHRvIGNyZWF0ZSBhIGNhc2UgaW5zZW5zaXRpdmUKLQkgKiAgICAgICAgICAgIHBhdHRlcm4KLQkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHBhdHRlcm4KLQkgKiBAdGhyb3dzIFBhdHRlcm5TeW50YXhFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBhdHRlcm4gY3JlYXRlUGF0dGVybihTdHJpbmdbXSBwYXR0ZXJucywKLQkJCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBwYXR0ZXJuID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQkvLyBub3RlIHRoYXQgdGhpcyB3b3JrcyBvbmx5IGFzIHdlIGtub3cgdGhhdCB0aGUgb3BlcmFuZHMgb2YgdGhlCi0JCQkJLy8gb3IgZXhwcmVzc2lvbiB3aWxsIGJlIHNpbXBsZSBhbmQgbmVlZCBubyBicmFja2V0cy4KLQkJCQlwYXR0ZXJuLmFwcGVuZCgnfCcpOwotCQkJfQotCQkJYXBwZW5kQXNSZWdFeCh0cnVlLCBwYXR0ZXJuc1tpXSwgcGF0dGVybik7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZVBhdHRlcm4ocGF0dGVybi50b1N0cmluZygpLCB0cnVlLCB0cnVlLCBpc0Nhc2VTZW5zaXRpdmUsCi0JCQkJZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQnVmZmVyIGFwcGVuZEFzUmVnRXgoYm9vbGVhbiBpc1N0cmluZ01hdGNoZXIsCi0JCQlTdHJpbmcgcGF0dGVybiwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlib29sZWFuIGlzRXNjYXBlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm4ubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjID0gcGF0dGVybi5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCS8vIHRoZSBiYWNrc2xhc2gKLQkJCWNhc2UgJ1xcJzoKLQkJCQkvLyB0aGUgYmFja3NsYXNoIGlzIGVzY2FwZSBjaGFyIGluIHN0cmluZyBtYXRjaGVyCi0JCQkJaWYgKGlzU3RyaW5nTWF0Y2hlciAmJiAhaXNFc2NhcGVkKSB7Ci0JCQkJCWlzRXNjYXBlZCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlzRXNjYXBlZCA9IGZhbHNlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCS8vIGNoYXJhY3RlcnMgdGhhdCBuZWVkIHRvIGJlIGVzY2FwZWQgaW4gdGhlIHJlZ2V4LgotCQkJY2FzZSAnKCc6Ci0JCQljYXNlICcpJzoKLQkJCWNhc2UgJ3snOgotCQkJY2FzZSAnfSc6Ci0JCQljYXNlICcuJzoKLQkJCWNhc2UgJ1snOgotCQkJY2FzZSAnXSc6Ci0JCQljYXNlICckJzoKLQkJCWNhc2UgJ14nOgotCQkJY2FzZSAnKyc6Ci0JCQljYXNlICd8JzoKLQkJCQlpZiAoaXNFc2NhcGVkKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZCgnXFwnKTsKLQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnPyc6Ci0JCQkJaWYgKGlzU3RyaW5nTWF0Y2hlciAmJiAhaXNFc2NhcGVkKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoJy4nKTsKLQkJCQl9IGVsc2UgewotCQkJCQlidWZmZXIuYXBwZW5kKCdcXCcpOwotCQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcqJzoKLQkJCQlpZiAoaXNTdHJpbmdNYXRjaGVyICYmICFpc0VzY2FwZWQpIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiLioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoJ1xcJyk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCQkJCWlzRXNjYXBlZCA9IGZhbHNlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKGlzRXNjYXBlZCkgewotCQkJCQlidWZmZXIuYXBwZW5kKCJcXFxcIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaXNFc2NhcGVkID0gZmFsc2U7Ci0JCQkJfQotCQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlzRXNjYXBlZCkgewotCQkJYnVmZmVyLmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BlcnNpc3RlbmNlUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgwZDkwYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTWVzc2FnZSBidW5kbGUgY2xhc3MgZm9yIGxpYnJhcnkgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFBlcnNpc3RlbmNlUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFBlcnNpc3RlbmNlUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUGVyc2lzdGVuY2VSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWROYW1lRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2JqTm90Rm91bmRFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkTGlicmFyeUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRMaWJyYXJ5RXJyb3JfZGV0YWlsczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hMaWJyYXJ5RmlsZXNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlTWFuYWdlcl9maWxlUmVhZE9ubHk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJNc2dfQ291bGROb3REZWxldGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW5hbWVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYWNrdXBFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYXJrZXJfZXJyX2Nhbm5vdFJlc29sdmVQcm94eTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vZGlmeUZpbGVFcnJvcl9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZVBhdGhOYW1lVG9vTG9uZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkUmVzb3VyY2VFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkUmVzb3VyY2VFcnJvcldpdGhSZWFzb25fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZExpYnJhcnlGaWxlRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZU5vdEZvdW5kRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplVVJJRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW92ZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vZGlmeVJlYWRPbmx5RmlsZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVSZXNvdXJjZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vZGlmeUZpbGVzRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb3VyY2VPdXRPZlN5bmNoX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRMaWJyYXJ5VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW92ZURhdGFUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRSZXNvdXJjZXNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaWdyYXRlQ29udGVudERlc2NyaXB0aW9uc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpeFByZXNlbnRhdGlvbk5hbWVUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyX2NvdWxkTm90UmVzb2x2ZVByb3h5OwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUGVyc2lzdGVuY2VSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BlcnNpc3RlbmNlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkYjIxNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkVQRlZlcnNpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uaW50ZXJuYWwuTWlncmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIGhlbHBlciBtZXRob2RzIGZvciBsaWJyYXJ5IHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVV0aWwgewotCi0JLyoqCi0JICogR2V0cyB0aGUgY3VycmVudCBuYW1lc3BhY2UgVVJJIG9mIFVNQS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVTUFOc1VSSSgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuZU5TX1VSSTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVTUFOc1VSSShTdHJpbmcgbGliUGF0aCkgewotCQl0cnkgewotCQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLQkJCQkJLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJRG9jdW1lbnQgZG9jID0gYnVpbGRlci5wYXJzZShuZXcgRmlsZShsaWJQYXRoKSk7Ci0JCQlFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgbnNVUkkgPSByb290LmdldEF0dHJpYnV0ZSgieG1sbnM6Y29tLmlibS51bWEiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG5zVVJJID09IG51bGwgfHwgbnNVUkkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbnNVUkkgPSByb290LmdldEF0dHJpYnV0ZSgieG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnNVUkk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY29udmVyc2lvblJlcXVpcmVkKFN0cmluZyBsaWJQYXRoKSB7Ci0JCVN0cmluZyBjdXJyZW50TnNVUkkgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0VU1BTnNVUkkoKTsKLQkJU3RyaW5nIGxpYk5zVVJJID0gUGVyc2lzdGVuY2VVdGlsLmdldFVNQU5zVVJJKGxpYlBhdGgpOwotCQlpZiAoY3VycmVudE5zVVJJLmVxdWFscyhsaWJOc1VSSSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChNaWdyYXRvci5PTERfVU1BX05TX1VSSS5lcXVhbHMobGliTnNVUkkpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElSZXNvdXJjZSBnZXRXb3Jrc3BhY2VSZXNvdXJjZShPYmplY3Qgb2JqKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJRGVzY3JpYmFibGVFbGVtZW50IGUgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBvYmo7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IGUuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlyZXNvdXJjZSA9IGNvbnRlbnQuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCXJlc291cmNlID0gZS5lUmVzb3VyY2UoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXNvdXJjZSA9ICgoRU9iamVjdCkgb2JqKS5lUmVzb3VyY2UoKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSZXNvdXJjZSkgewotCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIG9iajsKLQkJfQotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJcmV0dXJuIEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24ocmVzb3VyY2UuZ2V0VVJJKCkKLQkJCQkJLnRvRmlsZVN0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb248RU9iamVjdD4gZ2V0UHJveGllcyhFT2JqZWN0IG9iaikgewotCQlDb2xsZWN0aW9uPEVPYmplY3Q+IHByb3hpZXMgPSBuZXcgQXJyYXlMaXN0PEVPYmplY3Q+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iai5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoby5lSXNQcm94eSgpKSB7Ci0JCQkJcHJveGllcy5hZGQobyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3hpZXM7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRoZSBwcmltYXJ5IHRvb2wgdmVyc2lvbiBzdG9yZWQgaW4gdGhlIGdpdmVuIHJlc291cmNlCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiA8bGk+IDwgMCBpZiB0aGUgdmVyc2lvbiBvZiB0aGUgcHJpbWFyeSB0b29sIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgbWlzc2luZyBvciBvbGRlciB0aGFuIGN1cnJlbnQKLQkgKiAgICAgICAgIDxsaT4gMCBpZiB0aGUgcHJpbWFyeSB0b29sIHZlcnNpb24gaW4gdGhlIGdpdmVuIHJlc291cmNlIG1hdGNoZXMgdGhlIGN1cnJlbnQgdmVyc2lvbgotCSAqICAgICAgICAgPGxpPiA+IDAgaWYgIHRoZSBwcmltYXJ5IHRvb2wgdmVyc2lvbiBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgbmV3ZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2hlY2tUb29sVmVyc2lvbihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCU1hcCBmaWxlVmVyc2lvbk1hcCA9IFZlcnNpb25VdGlsLnJlYWRWZXJzaW9uc0Zyb21GaWxlKGZpbGUpOwotCQlpZihmaWxlVmVyc2lvbk1hcCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdmVyc2lvbiA9IChTdHJpbmcpIGZpbGVWZXJzaW9uTWFwLmdldChWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpOwotCQkJaWYodmVyc2lvbiAhPSBudWxsKSB7Ci0JCQkJRVBGVmVyc2lvbnMgdmVyc2lvbnMgPSBWZXJzaW9uVXRpbC5nZXRWZXJzaW9ucyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpOwotCQkJCXJldHVybiB2ZXJzaW9ucy5nZXRDdXJyZW50VmVyc2lvbigpLmNvbXBhcmVUb29sVmVyc2lvblRvKG5ldyBWZXJzaW9uKHZlcnNpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZmlyc3QgbWV0aG9kIGVsZW1lbnQgaW4gY29udGVudHMgb2YgdGhlIGdpdmVuIHJlc291cmNlLgotCSAqICAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwZmRmNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIEVycm9yIE1lc3NhZ2VzCi1pbnZhbGlkTmFtZUVycm9yX21zZz1UaGUgbmFtZSAnJ3swfScnIGlzIGludmFsaWQuIE1ldGhvZCBlbGVtZW50IG5hbWUgY2Fubm90IGNvbnRhaW4gdGhlc2UgY2hhcmFjdGVyczogXFwgLyA6ICogPyAiIDwgPiB8Ci1vYmpOb3RGb3VuZEVycm9yX21zZz1Db3VsZCBub3QgZmluZCBvYmplY3Qgd2l0aCBpZCAnJ3swfScnCi1sb2FkTGlicmFyeUVycm9yX21zZz1FcnJvcnMgZW5jb3VudGVyZWQgd2hpbGUgbG9hZGluZyBtZXRob2QgbGlicmFyeToKLWxvYWRMaWJyYXJ5RXJyb3JfZGV0YWlscz1cIFwgbGluZTogezB9LCBjb2x1bW46IHsxfSwgbXNnOiB7Mn0KLXJlc3RvcmVSZXNvdXJjZUVycm9yX21zZz1Db3VsZCBub3QgcmVzdG9yZSByZXNvdXJjZSAnJ3swfScnCi1GaWxlTWFuYWdlcl9maWxlUmVhZE9ubHk9RmlsZSAnJ3swfScnIGlzIHJlYWQtb25seQotRXJyTXNnX0NvdWxkTm90RGVsZXRlPUNvdWxkIG5vdCBkZWxldGUgezB9LiB7MX0KLXJlbmFtZUVycm9yX21zZz1Db3VsZCBub3QgcmVuYW1lICcnezB9JycgdG8gJyd7MX0nJwotYmFja3VwRXJyb3JfbXNnPUNvdWxkIG5vdCBiYWNrdXAgdXAgcmVzb3VyY2UgJyd7MH0nJwotbWFya2VyX2Vycl9jYW5ub3RSZXNvbHZlUHJveHk9Q291bGQgbm90IHJlc29sdmUgcHJveHkgezB9Ci1tb2RpZnlGaWxlRXJyb3JfbXNnPUNhbm5vdCBtb2RpZnkgZmlsZSAnJ3swfScnCi1maWxlUGF0aE5hbWVUb29Mb25nX21zZz1DYW5ub3Qgc2F2ZSByZXNvdXJjZS4gRmlsZSBwYXRoIG5hbWUgdG9vIGxvbmcgKGV4Y2VlZGluZyAyNTUpICcnezB9JycKLWxvYWRSZXNvdXJjZUVycm9yX21zZz1Db3VsZCBub3QgbG9hZCByZXNvdXJjZSAnJ3swfScnCi1sb2FkUmVzb3VyY2VFcnJvcldpdGhSZWFzb25fbXNnPUNvdWxkIG5vdCBsb2FkIHJlc291cmNlICcnezB9JycuIFJlYXNvbjogezF9Ci1pbnZhbGlkTGlicmFyeUZpbGVFcnJvcl9tc2c9SW52YWxpZCBtZXRob2QgbGlicmFyeSBmaWxlOgotZmlsZU5vdEZvdW5kRXJyb3JfbXNnPUNvdWxkIG5vdCBsb2NhdGUgYW55IG1ldGhvZCBsaWJyYXJ5IGZpbGUgaW4gd29ya3NwYWNlICcnezB9JycKLW5vcm1hbGl6ZVVSSUVycm9yX21zZz1Db3VsZCBub3QgZmluZCB0aGUgbm9ybWFsaXplZCBVUkkgZm9yICcnezB9JycKLW1vdmVFcnJvcl9tc2c9Q291bGQgbm90IG1vdmUgJyd7MH0nJyB0byAnJ3sxfScnLiBUaGUgZGVzdGluYXRpb24gYWxyZWFkeSBleGlzdHMuCi1tb2RpZnlSZWFkT25seUZpbGVFcnJvcl9tc2c9Q2Fubm90IG1vZGlmeSByZWFkLW9ubHkgZmlsZShzKTogezB9Ci1tb3ZlUmVzb3VyY2VFcnJvcl9tc2c9UmVzb3VyY2UgJyd7MH0nJyBpcyBpbnZvbHZlZCBpbiBhIHBlcnNpc3RlbmNlIG9wZXJhdGlvbiB0aGF0IGhhcyBub3QgYmVlbiBjb21taXR0ZWQuCi1tb2RpZnlGaWxlc0Vycm9yX21zZz1Db3VsZCBub3QgbW9kaWZ5IG9uZSBvciBtb3JlIGZpbGVzCi1yZXNvdXJjZU91dE9mU3luY2hfbXNnPVJlc291cmNlIGlzIG91dCBvZiBzeW5jaCBhbmQgbmVlZHMgdG8gYmUgcmVsb2FkZWQ6IHswfQotCi0jIFByb2dyZXNzIE1lc3NhZ2VzCi1sb2FkTGlicmFyeVRhc2tfbmFtZT1Mb2FkaW5nIG1ldGhvZCBsaWJyYXJ5Li4uCi1tb3ZlRGF0YVRhc2tfbmFtZT1Nb3ZpbmcgdGhlIGRhdGEuLi4KLXNhdmVMaWJyYXJ5VGFza19uYW1lPVNhdmluZyBtZXRob2QgbGlicmFyeS4uLgotbG9hZFJlc291cmNlc1Rhc2tfbmFtZT1Mb2FkaW5nIGFsbCByZXNvdXJjZXMgaW50byBtZW1vcnkuLi4KLW1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb25zVGFza19uYW1lPU1pZ3JhdGluZyBwcm9jZXNzIGNvbnRlbnQgZGVzY3JpcHRpb25zLi4uCi1maXhQcmVzZW50YXRpb25OYW1lVGFza19uYW1lPVNldHRpbmcgbnVsbC9lbXB0eSBwcmVzZW50YXRpb24gbmFtZSBvZiBldmVyeSBicmVha2Rvd24gZWxlbWVudCB0byBpdHMgbmFtZS4uLgotVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eT1Db3VsZCBub3QgcmVzb2x2ZSBwcm94eSAnJ3swfScnCi1yZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lPVJlZnJlc2hpbmcgbGlicmFyeSBmaWxlcyBpbiB3b3Jrc3BhY2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1VucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1VucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmU3ZDQxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9VbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5SZXNvbHZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSAqIEJhY2tncm91bmQgam9iIHRoYXQgbWFuYWdlIG1hcmtlcnMgZm9yIHVucmVzb2x2ZWQgcHJveGllcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlciBleHRlbmRzIFdvcmtzcGFjZUpvYiBpbXBsZW1lbnRzIElQcm94eVJlc29sdXRpb25MaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFTEFZID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9VUkkgPSAicHJveHlVUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1dORVJfR1VJRCA9ICJvd25lckdVSUQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmFsaWRPYmplY3QgewotCQlib29sZWFuIHZhbGlkOwotCQlPYmplY3Qgb2JqZWN0OwotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSB2YWxpZAotCQkgKiBAcGFyYW0gb2JqZWN0Ci0JCSAqLwotCQlwdWJsaWMgVmFsaWRPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQkJdmFsaWQgPSB0cnVlOwkJCQotCQl9Ci0JCQkJCi0JfQotCQotCXByaXZhdGUgTWFwIHVyaVRvRXhjZXB0aW9uc01hcDsKLQlwcml2YXRlIExpc3QgZXhjZXB0aW9uczsKLQlwcml2YXRlIE1hcCByZXNvdXJjZUdVSVRvTWFya2Vyc01hcDsKLQlwcml2YXRlIE1hcCBlbGVtZW50R1VJVG9NYXJrZXJzTWFwOwotCXByaXZhdGUgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQ7Ci0JcHJpdmF0ZSBMaXN0IHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzOwotCi0JcHVibGljIFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJc3VwZXIoIkVQRiBVbnJlc29sdmVkIFByb3h5IExvZ2dlciIpOyAvLyROT04tTkxTLTEkCQkKLQkJdGhpcy5yZXNvdXJjZVNldCA9IHJlc291cmNlU2V0OwotLy8JCXVucmVzb2x2ZWRSZXNvdXJjZUdVSURUb01hcmtlcnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl1cmlUb0V4Y2VwdGlvbnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlleGNlcHRpb25zID0gbmV3IEFycmF5TGlzdCgpOyAKLQkJcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQllbGVtZW50R1VJVG9NYXJrZXJzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJcmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnMgPSBuZXcgVW5pcXVlRUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgSU1hcmtlciBmaW5kTWFya2VyKElGaWxlIGZpbGUsIFN0cmluZyBwcm94eVVSSSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlNYXJrZXJbXSBtYXJrZXJzID0gZmlsZS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJaWYocHJveHlVUkkuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoUFJPWFlfVVJJKSkKLQkJCQkJJiYgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIC0xKSA9PSBzdGFydAotCQkJCQkmJiBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQsIC0xKSA9PSBlbmQpIAotCQkJewotCQkJCXJldHVybiBtYXJrZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFkZEV4Y2VwdGlvbihSZXNvbHZlRXhjZXB0aW9uIHJlKSB7Ci0JCXN5bmNocm9uaXplZChleGNlcHRpb25zKSB7Ci0JCQlVUkkgdXJpID0gKChJbnRlcm5hbEVPYmplY3QpcmUuZ2V0UHJveHkoKSkuZVByb3h5VVJJKCk7Ci0JCQlTZXQgZXhjZXB0aW9ucyA9IChTZXQpIHVyaVRvRXhjZXB0aW9uc01hcC5nZXQodXJpKTsJCQotCQkJaWYoZXhjZXB0aW9ucyA9PSBudWxsKSB7Ci0JCQkJZXhjZXB0aW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJdXJpVG9FeGNlcHRpb25zTWFwLnB1dCh1cmksIGV4Y2VwdGlvbnMpOwotCQkJfQotCQkJaWYoZXhjZXB0aW9ucy5hZGQocmUpKSB7Ci0JCQkJdGhpcy5leGNlcHRpb25zLmFkZChyZSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRG9jdW1lbnQgYmFzZWQgY2hhcmFjdGVyIHNlcXVlbmNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIERvY3VtZW50Q2hhclNlcXVlbmNlIGltcGxlbWVudHMgQ2hhclNlcXVlbmNlIHsKLQotCQkvKiogRG9jdW1lbnQgKi8KLQkJcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCi0JCS8qKgotCQkgKiBJbml0aWFsaXplIHdpdGggdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuCi0JCSAqIGRvY3VtZW50LgotCQkgKgotCQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50Ci0JCSAqLwotCQlwdWJsaWMgRG9jdW1lbnRDaGFyU2VxdWVuY2UoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQlmRG9jdW1lbnQ9IGRvY3VtZW50OwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlI2xlbmd0aCgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGxlbmd0aCgpIHsKLQkJCXJldHVybiBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjY2hhckF0KGludCkKLQkJICovCi0JCXB1YmxpYyBjaGFyIGNoYXJBdChpbnQgaW5kZXgpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZEb2N1bWVudC5nZXRDaGFyKGluZGV4KTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbih4LmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ujc3ViU2VxdWVuY2UoaW50LCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZkRvY3VtZW50LmdldChzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKHguZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTWFya2VyKFJlc291cmNlIHJlc291cmNlLCBVUkkgcHJveHlVUkksIFN0cmluZyBlcnJNc2csIFN0cmluZyBvd25lckdVSUQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlVUkkgY29udGFpbmVyVVJJID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoY29udGFpbmVyVVJJLnRvRmlsZVN0cmluZygpKTsKLQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBjb250YWluZXJVUkkgIT0gbnVsbCA/IGNvbnRhaW5lclVSSQotCQkJCQkudG9GaWxlU3RyaW5nKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQl0cnkgewotCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBudWxsKTsKLQkJCQkKLQkJCQkvLyBsb2NhdGUgdGhlIHRleHQgb2YgdW5yZXNvbHZlZCBVUkkgaW4gZmlsZQotCQkJCS8vCi0JCQkJSVRleHRGaWxlQnVmZmVyTWFuYWdlciBtYW5hZ2VyPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKTsKLQkJCQl0cnkgewotCQkJCQltYW5hZ2VyLmNvbm5lY3QocGF0aCwgbW9uaXRvcik7Ci0JCQkJCUlUZXh0RmlsZUJ1ZmZlciBmaWxlQnVmZmVyPSBtYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKHBhdGgpOwotCQkJCQlmaWxlQnVmZmVyLnJlcXVlc3RTeW5jaHJvbml6YXRpb25Db250ZXh0KCk7Ci0JCQkJCWZpbGVCdWZmZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJSURvY3VtZW50IGRvYyA9IGZpbGVCdWZmZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJaWYoZG9jICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBwcm94eVVSSVN0ciA9IHByb3h5VVJJLnRvU3RyaW5nKCk7Ci0JCQkJCQlQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuQ29uc3RydWN0b3IuY3JlYXRlUGF0dGVybihwcm94eVVSSVN0ciwgdHJ1ZSwgZmFsc2UpOwotCQkJCQkJTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKG5ldyBEb2N1bWVudENoYXJTZXF1ZW5jZShkb2MpKTsKLQkJCQkJCXdoaWxlKG1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJCQkJaW50IHN0YXJ0ID0gbWF0Y2hlci5zdGFydCgpOwotCQkJCQkJCWludCBlbmQgPSBtYXRjaGVyLmVuZCgpOwotCQkJCQkJCWlmKHN0YXJ0ICE9IGVuZCkgewotCQkJCQkJCQkvLyBtYWtlIHN1cmUgdGhhdCByZXNvbHZlciBpcyBzdGlsbCBpbiB0aGUgb3BlbiBsaWJyYXJ5IGJ5IGNoZWNraW5nIHdoZXRoZXIgaXRzIHJlc291cmNlCi0JCQkJCQkJCS8vIHN0aWxsIGJlbG9uZ3MgdG8gYSByZXNvdXJjZSBzZXQKLQkJCQkJCQkJLy8KLQkJCQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpICE9IG51bGwpIHsKLQkJCQkJCQkJCS8vIGNyZWF0ZSBwcm9ibGVtIG1hcmtlciBmb3IgZmlsZQotCQkJCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBmaW5kTWFya2VyKGZpbGUsIHByb3h5VVJJU3RyLCBzdGFydCwgZW5kKTsKLQkJCQkJCQkJCWlmKG1hcmtlciA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJbWFya2VyID0gZmlsZS5jcmVhdGVNYXJrZXIoSU1hcmtlci5QUk9CTEVNKTsKLQkJCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksCi0JCQkJCQkJCQkJCQlJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgZXJyTXNnKTsKLQkJCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTE9DQVRJT04sIGxvY2F0aW9uKTsKLQkJCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuVFJBTlNJRU5ULCB0cnVlKTsKLQkJCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgc3RhcnQpOwkKLQkJCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQsIGVuZCk7Ci0JCQkJCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShQUk9YWV9VUkksIHByb3h5VVJJU3RyKTsKLQkJCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKE9XTkVSX0dVSUQsIG93bmVyR1VJRCk7Ci0KLQkJCQkJCQkJCQkvLyBjYWNoZSBtYXJrZXIgdG8gaXQgY2FuIGJlIGZvdW5kIGVhc2lseSBhbmQgZGVsZXRlZAotCQkJCQkJCQkJCS8vCi0JCQkJCQkJCQkJY2FjaGVNYXJrZXIobWFya2VyLCBwcm94eVVSSSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkvLyB1cGRhdGUgb3duZXIgR1VJRAotCQkJCQkJCQkJCS8vCi0JCQkJCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShPV05FUl9HVUlELCBvd25lckdVSUQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZpbGVCdWZmZXIucmVsZWFzZVN5bmNocm9uaXphdGlvbkNvbnRleHQoKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1hbmFnZXIuZGlzY29ubmVjdChwYXRoLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhleCk7Ci0JCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTWFya2VyKFJlc29sdmVFeGNlcHRpb24gcmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJbnRlcm5hbEVPYmplY3QgcHJveHkgPSAoSW50ZXJuYWxFT2JqZWN0KSByZS5nZXRQcm94eSgpOwotCQlVUkkgY29udGFpbmVyVVJJID0gbnVsbDsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZihyZS5nZXRSZXNvbHZlcigpICE9IG51bGwpIHsKLQkJCXJlc291cmNlID0gcmUuZ2V0UmVzb2x2ZXIoKS5lUmVzb3VyY2UoKTsKLQkJCQotCQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVzb2x2ZXIgaXMgc3RpbGwgaW4gdGhlIG9wZW4gbGlicmFyeSBieSBjaGVja2luZyB3aGV0aGVyIGl0cyByZXNvdXJjZQotCQkJLy8gc3RpbGwgYmVsb25ncyB0byBhIHJlc291cmNlIHNldAotCQkJLy8KLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLmFkZE1hcmtlcigpOiByZXNvdXJjZVNldD0iICsgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5oYXNoQ29kZSgpKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsKSB7CQkJCQotCQkJCWNvbnRhaW5lclVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJfQotCQl9CQkJCQotCQlpZiAoY29udGFpbmVyVVJJICE9IG51bGwpIHsKLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGNvbnRhaW5lclVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGVyck1zZzsKLQkJCQlpZiAocmUuZXhjZXB0aW9uKCkgIT0gbnVsbCAmJiByZS5leGNlcHRpb24oKS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgIT0gbnVsbCAmJiAKLQkJCQkJCXJlLmV4Y2VwdGlvbigpLmdldExvY2FsaXplZE1lc3NhZ2UoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWVyck1zZyA9IHJlLmV4Y2VwdGlvbigpLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWVyck1zZyA9IHJlLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMuVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eSwgcHJveHkuZVByb3h5VVJJKCkpIDogcmUKLQkJCQkJCQkJLmdldE1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQkJYWRkTWFya2VyKHJlc291cmNlLCBwcm94eS5lUHJveHlVUkkoKSwgZXJyTXNnLCBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKHJlLmdldFJlc29sdmVyKCkpLCBtb25pdG9yKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtYXJrZXIKLQkgKiBAcGFyYW0gdXJpIHByb3h5IHVyaSAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FjaGVNYXJrZXIoSU1hcmtlciBtYXJrZXIsIFVSSSB1cmkpIHsKLQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJCVN0cmluZyByZXNvdXJjZUdVSUQgPSB1cmkuYXV0aG9yaXR5KCk7Ci0JCQlpZihyZXNvdXJjZUdVSUQgIT0gbnVsbCkgewotCQkJCVZhbGlkT2JqZWN0IHZvID0gKFZhbGlkT2JqZWN0KSByZXNvdXJjZUdVSVRvTWFya2Vyc01hcC5nZXQocmVzb3VyY2VHVUlEKTsKLQkJCQlpZih2byA9PSBudWxsKSB7Ci0JCQkJCXZvID0gbmV3IFZhbGlkT2JqZWN0KG5ldyBIYXNoU2V0KCkpOwotCQkJCQlyZXNvdXJjZUdVSVRvTWFya2Vyc01hcC5wdXQocmVzb3VyY2VHVUlELCB2byk7Ci0JCQkJfQotCQkJCUNvbGxlY3Rpb24gbWFya2VycyA9IChDb2xsZWN0aW9uKSB2by5vYmplY3Q7Ci0JCQkJbWFya2Vycy5hZGQobWFya2VyKTsKLQkJCX0KLQkJCVN0cmluZyBlbGVtZW50R1VJRCA9IHVyaS5mcmFnbWVudCgpOwotCQkJQ29sbGVjdGlvbiBtYXJrZXJzID0gKENvbGxlY3Rpb24pIGVsZW1lbnRHVUlUb01hcmtlcnNNYXAuZ2V0KGVsZW1lbnRHVUlEKTsKLQkJCWlmKG1hcmtlcnMgPT0gbnVsbCkgewotCQkJCW1hcmtlcnMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWVsZW1lbnRHVUlUb01hcmtlcnNNYXAucHV0KGVsZW1lbnRHVUlELCBtYXJrZXJzKTsKLQkJCX0KLQkJCW1hcmtlcnMuYWRkKG5ldyBWYWxpZE9iamVjdChtYXJrZXIpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyQWxsKCkgewotCQlib29sZWFuIG9sZEVuYWJsZWQgPSBlbmFibGVkOwotCQl0cnkgewotCQkJZW5hYmxlZCA9IGZhbHNlOwotCQkJY2FuY2VsKCk7Ci0KLQkJCXN5bmNocm9uaXplZCAoZXhjZXB0aW9ucykgewotCQkJCXVyaVRvRXhjZXB0aW9uc01hcC5jbGVhcigpOwotCQkJCWV4Y2VwdGlvbnMuY2xlYXIoKTsKLQkJCX0KLQkJCXN5bmNocm9uaXplZChlbGVtZW50R1VJVG9NYXJrZXJzTWFwKSB7Ci0JCQkJaWYoIWVsZW1lbnRHVUlUb01hcmtlcnNNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRHVUlUb01hcmtlcnNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoQ29sbGVjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gbWFya2Vycy5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJVmFsaWRPYmplY3Qgdm8gPSAoVmFsaWRPYmplY3QpIGl0ZXIxLm5leHQoKTsKLQkJCQkJCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSB2by5vYmplY3Q7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaWYobWFya2VyLmV4aXN0cygpKSB7Ci0JCQkJCQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQltYXJrZXJzLmNsZWFyKCk7Ci0JCQkJCX0KLQkJCQkJZWxlbWVudEdVSVRvTWFya2Vyc01hcC5jbGVhcigpOwotCQkJCQlyZXNvdXJjZUdVSVRvTWFya2Vyc01hcC5jbGVhcigpOwotCQkJCX0JCi0JCQl9Ci0JCQlzeW5jaHJvbml6ZWQocmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnMpIHsKLQkJCQlyZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2Vycy5jbGVhcigpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5hYmxlZCA9IG9sZEVuYWJsZWQ7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5jbGVhckFsbCgpOiBlbmQiKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1VucmVzb2x2ZWRQcm94eSgpIHsKLQkJcmV0dXJuICFlbGVtZW50R1VJVG9NYXJrZXJzTWFwLmlzRW1wdHkoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBSZXNvbHZlRXhjZXB0aW9uIG5leHRFeGNlcHRpb24oKSB7Ci0JCXN5bmNocm9uaXplZChleGNlcHRpb25zKSB7CQkJCi0JCQkvLyBzeW5jaHJvbml6ZWQ6IGluIG9yZGVyIHRvIGF0b21pY2FsbHkgb2J0YWluIGFuZCBjbGVhciByZXF1ZXN0cwotCQkJaWYoZXhjZXB0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVJlc29sdmVFeGNlcHRpb24gZSA9IChSZXNvbHZlRXhjZXB0aW9uKSB0aGlzLmV4Y2VwdGlvbnMucmVtb3ZlKDApOwotCQkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdCllLmdldFByb3h5KCkpLmVQcm94eVVSSSgpOwotCQkJCUNvbGxlY3Rpb24gZXhjZXB0aW9ucyA9IChDb2xsZWN0aW9uKSB1cmlUb0V4Y2VwdGlvbnNNYXAuZ2V0KHVyaSk7Ci0JCQkJaWYoZXhjZXB0aW9ucyAhPSBudWxsKSB7Ci0JCQkJCWV4Y2VwdGlvbnMucmVtb3ZlKGUpOwotCQkJCQlpZihleGNlcHRpb25zLmlzRW1wdHkoKSkgewotCQkJCQkJdXJpVG9FeGNlcHRpb25zTWFwLnJlbW92ZSh1cmkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBlOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgUmVzb3VyY2UgbmV4dFJlc291cmNlVG9WYWxpZGF0ZU1hcmtlcnMoKSB7Ci0JCXN5bmNocm9uaXplZChyZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2VycykgewotCQkJaWYocmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gKFJlc291cmNlKSByZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2Vycy5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iI3J1bkluV29ya3NwYWNlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5ydW5JbldvcmtzcGFjZSgpOiBiZWdpbiIpOwotCQl0cnkgewotCQlpZighZW5hYmxlZCkgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0KLQkJdHJ5IHsKLQkJCS8vIGFkZCBtYXJrZXJzCi0JCQkvLwotCQkJUmVzb2x2ZUV4Y2VwdGlvbiByZTsKLQkJCXdoaWxlKChyZSA9IG5leHRFeGNlcHRpb24oKSkgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWFkZE1hcmtlcihyZSwgbW9uaXRvcik7Ci0JCQkJfQotCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZW1vdmUgaW52YWxpZCBtYXJrZXJzCi0JCQkvLwotCQkJcmVtb3ZlTWFya2Vycyhtb25pdG9yKTsKLQkJCQotCQkJLy8gdmFsaWRhdGUgcmVzb3VyY2UgbWFya2VycwotCQkJLy8KLQkJCVJlc291cmNlIHJlc291cmNlOwotCQkJd2hpbGUoKHJlc291cmNlID0gbmV4dFJlc291cmNlVG9WYWxpZGF0ZU1hcmtlcnMoKSkgIT0gbnVsbCkgewotCQkJCWRvVmFsaWRhdGVNYXJrZXJzKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJfQotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJZmluYWxseSB7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5ydW5JbldvcmtzcGFjZSgpOiBlbmQiKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlRnJvbVJlc291cmNlR1VJRFRvTWFya2Vyc01hcChTdHJpbmcgcHJveHlVUkksIElNYXJrZXIgbWFya2VyKSB7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJKTsKLQkJU3RyaW5nIHJlc291cmNlR1VJRCA9IHVyaS5hdXRob3JpdHkoKTsKLQkJaWYocmVzb3VyY2VHVUlEICE9IG51bGwpIHsKLQkJCVZhbGlkT2JqZWN0IHZvID0gKFZhbGlkT2JqZWN0KSByZXNvdXJjZUdVSVRvTWFya2Vyc01hcC5nZXQocmVzb3VyY2VHVUlEKTsKLQkJCWlmKHZvICE9IG51bGwpIHsKLQkJCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoKENvbGxlY3Rpb24pdm8ub2JqZWN0KTsKLQkJCQlib29sZWFuIHJldCA9IG1hcmtlcnMucmVtb3ZlKG1hcmtlcik7Ci0JCQkJaWYobWFya2Vycy5pc0VtcHR5KCkpIHsKLQkJCQkJcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAucmVtb3ZlKHJlc291cmNlR1VJRCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlRnJvbUVsZW1lbnRHVUlEVG9NYXJrZXJzTWFwKFN0cmluZyBwcm94eVVSSSwgSU1hcmtlciBtYXJrZXIpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkocHJveHlVUkkpOwotCQlTdHJpbmcgZWxlbWVudEdVSUQgPSB1cmkuZnJhZ21lbnQoKTsKLQkJaWYoZWxlbWVudEdVSUQgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiB2YWxpZE9iamVjdHMgPSAoQ29sbGVjdGlvbikgZWxlbWVudEdVSVRvTWFya2Vyc01hcC5nZXQoZWxlbWVudEdVSUQpOwotCQkJaWYodmFsaWRPYmplY3RzICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9IHZhbGlkT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlWYWxpZE9iamVjdCB2bzEgPSAoVmFsaWRPYmplY3QpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJCWlmKHZvMS5vYmplY3QgPT0gbWFya2VyKSB7Ci0JCQkJCQlpdGVyYXRvcjEucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYodmFsaWRPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJCQllbGVtZW50R1VJVG9NYXJrZXJzTWFwLnJlbW92ZShlbGVtZW50R1VJRCk7Ci0JCQkJfQkKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlTWFya2VycyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudEdVSVRvTWFya2Vyc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNvbGxlY3Rpb24gbWFya2VycyA9IChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKCF2by52YWxpZCkgewotCQkJCQl0cnkgewotCQkJCQkJSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgdm8ub2JqZWN0OwotCQkJCQkJaWYobWFya2VyLmV4aXN0cygpKSB7Ci0JCQkJCQkJU3RyaW5nIHByb3h5VVJJID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShQUk9YWV9VUkkpOwotCi0JCQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCi0JCQkJCQkJLy8gcmVtb3ZlIHRoaXMgbWFya2VyIGZyb20gcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAKLQkJCQkJCQkvLwotCQkJCQkJCXJlbW92ZUZyb21SZXNvdXJjZUdVSURUb01hcmtlcnNNYXAocHJveHlVUkksIG1hcmtlcik7Ci0JCQkJCQl9Ci0JCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZUdVSVRvTWFya2Vyc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVZhbGlkT2JqZWN0IHZvID0gKFZhbGlkT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKCF2by52YWxpZCkgewotCQkJCXZvLnZhbGlkID0gdHJ1ZTsKLQkJCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoQ29sbGVjdGlvbikgdm8ub2JqZWN0OwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXI7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltYXJrZXIgPSAoSU1hcmtlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYobWFya2VyLmV4aXN0cygpKSB7Ci0JCQkJCQkJU3RyaW5nIHByb3h5VVJJU3RyID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShQUk9YWV9VUkkpOwotCQkJCQkJCVVSSSBwcm94eVVSSSA9IFVSSS5jcmVhdGVVUkkocHJveHlVUklTdHIpOwotCi0JCQkJCQkJLy8gcHJveHkgaXMgaW4gdGhlIHNhbWUgcmVzb3VyY2UgdGhhdCBpcyBqdXN0IGxvYWRlZCAKLQkJCQkJCQkvLyB0cnkgdG8gZ2V0IHRoZSBvYmplY3Qgd2l0aCB0aGlzIHByb3h5IFVSSSB3aXRob3V0IGxvYWRpbmcgbmV3IHJlc291cmNlCi0JCQkJCQkJLy8KLS8vCQkJCQkJCUVPYmplY3QgbyA9IHJlc291cmNlU2V0LmdldEVPYmplY3QocHJveHlVUkksIGZhbHNlKTsKLQkJCQkJCQlTdHJpbmcgZWxlbWVudEdVSUQgPSBwcm94eVVSSS5mcmFnbWVudCgpOwkJCQkJCQkKLQkJCQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLmdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS5nZXQoZWxlbWVudEdVSUQpOwotCQkJCQkJCWlmKG8gIT0gbnVsbCAmJiAhby5lSXNQcm94eSgpKSB7Ci0JCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKLQkJCQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7CQotCi0JCQkJCQkJCS8vIHJlbW92ZSB0aGlzIG1hcmtlciBmcm9tIGVsZW1lbnRHVUlUb01hcmtlcnNNYXAKLQkJCQkJCQkJLy8KLQkJCQkJCQkJcmVtb3ZlRnJvbUVsZW1lbnRHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJU3RyLCBtYXJrZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKG1hcmtlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklQcm94eVJlc29sdXRpb25MaXN0ZW5lciNub3RpZnlFeGNlcHRpb24oamF2YS5sYW5nLkV4Y2VwdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJaWYoIWVuYWJsZWQpIHJldHVybjsKLQkJCi0JCWlmKGUgaW5zdGFuY2VvZiBSZXNvbHZlRXhjZXB0aW9uKSB7Ci0JCQlSZXNvbHZlRXhjZXB0aW9uIHJlID0gKFJlc29sdmVFeGNlcHRpb24pIGU7Ci0JCQkKLS8vCQkJVVJJIHVyaSA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlLmdldFByb3h5KCkpLmVQcm94eVVSSSgpOwotLy8JCQlpZigiXzJKNFlvUFRERWRta3BZQVJOTjQ2OEEiLmVxdWFscyh1cmkuZnJhZ21lbnQoKSkpIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotLy8JCQl9Ci0JCQkKLQkJCWlmKGFkZEV4Y2VwdGlvbihyZSkpIHsJCQkKLQkJCQlzY2hlZHVsZShERUxBWSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklQcm94eVJlc29sdXRpb25MaXN0ZW5lciNwcm94eVJlc29sdmVkKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChPYmplY3QgcHJveHksIE9iamVjdCByZXNvbHZlZCkgewotCQlpZighZW5hYmxlZCkgcmV0dXJuOwotCQkKLQkJaWYocHJveHkgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdClwcm94eSkuZVByb3h5VVJJKCk7Ci0JCQkKLS8vCQkJaWYoIl8ySjRZb1BUREVkbWtwWUFSTk40NjhBIi5lcXVhbHModXJpLmZyYWdtZW50KCkpKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLS8vCQkJfQotCQkJCi0JCQkvLyByZW1vdmUgYWxsIGV4Y2VwdGlvbnMgZm9yIHRoaXMgVVJJCi0JCQkvLwotCQkJcmVtb3ZlRXhjZXB0aW9ucyh1cmkpOwotCQkJCi0JCQkvLyBpbnZhbGlkYXRlIGFsbCBtYXJrZXJzIGZvciB0aGlzIFVSSQotCQkJLy8KLQkJCWlmKGludmFsaWRhdGVNYXJrZXJzKHVyaSkpIHsKLQkJCQlzY2hlZHVsZShERUxBWSk7Ci0JCQl9CQkJCQkJCi0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGludmFsaWRhdGVNYXJrZXJzKFVSSSB1cmkpIHsKLQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCQlTdHJpbmcgcmVzb3VyY2VHVUlEID0gdXJpLmF1dGhvcml0eSgpOwotCQkJaWYocmVzb3VyY2VHVUlEICE9IG51bGwpIHsKLQkJCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAuZ2V0KHJlc291cmNlR1VJRCk7Ci0JCQkJaWYodm8gIT0gbnVsbCkgewotCQkJCQl2by52YWxpZCA9IGZhbHNlOwotCQkJCQlyZXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBlbGVtZW50R1VJRCA9IHVyaS5mcmFnbWVudCgpOwotCQkJaWYoZWxlbWVudEdVSUQgIT0gbnVsbCkgewotCQkJCUNvbGxlY3Rpb24gbWFya2VycyA9IChDb2xsZWN0aW9uKSBlbGVtZW50R1VJVG9NYXJrZXJzTWFwLmdldChlbGVtZW50R1VJRCk7Ci0JCQkJaWYobWFya2VycyAhPSBudWxsICYmICFtYXJrZXJzLmlzRW1wdHkoKSkgewotCQkJCQlyZXQgPSB0cnVlOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJVmFsaWRPYmplY3Qgdm8gPSAoVmFsaWRPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJdm8udmFsaWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUV4Y2VwdGlvbnMoVVJJIHVyaSkgewotCQlzeW5jaHJvbml6ZWQgKGV4Y2VwdGlvbnMpIHsKLQkJCUNvbGxlY3Rpb24gZXhjZXB0aW9ucyA9IChDb2xsZWN0aW9uKSB1cmlUb0V4Y2VwdGlvbnNNYXAuZ2V0KHVyaSk7Ci0JCQlpZihleGNlcHRpb25zID09IG51bGwgfHwgZXhjZXB0aW9ucy5pc0VtcHR5KCkpIHJldHVybjsKLQkJCXRoaXMuZXhjZXB0aW9ucy5yZW1vdmVBbGwoZXhjZXB0aW9ucyk7Ci0JCQl1cmlUb0V4Y2VwdGlvbnNNYXAucmVtb3ZlKHVyaSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgbWFya2VycyBmb3IgdW5yZXNvbHZlZCBwcm94aWVzIG9mIHRoZSBnaXZlbiByZXNvdXJjZQotCSAqICAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhck1hcmtlcnMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZSBmaWxlID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlpZihmaWxlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IGZpbGUuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCXJlbW92ZU1hcmtlcihtYXJrZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZU1hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQlTdHJpbmcgcHJveHlVUkkgPSBudWxsOwotCQl0cnkgewotCQkJaWYobWFya2VyLmV4aXN0cygpKSB7Ci0JCQkJcHJveHlVUkkgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKFBST1hZX1VSSSk7Ci0JCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCWlmKHByb3h5VVJJICE9IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZChlbGVtZW50R1VJVG9NYXJrZXJzTWFwKSB7Ci0JCQkJcmVtb3ZlRnJvbUVsZW1lbnRHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJLCBtYXJrZXIpOwotCQkJCXJlbW92ZUZyb21SZXNvdXJjZUdVSURUb01hcmtlcnNNYXAocHJveHlVUkksIG1hcmtlcik7Ci0JCQl9Ci0JCX0JCQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hcmtlckluZm8gewotCQlTdHJpbmcgcHJveHlVUkk7Ci0JCVN0cmluZyBvd25lckdVSUQ7Ci0JCVN0cmluZyBtZXNzYWdlOwotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYob2JqIGluc3RhbmNlb2YgTWFya2VySW5mbykgewotCQkJCU1hcmtlckluZm8gaW5mbyA9IChNYXJrZXJJbmZvKSBvYmo7Ci0JCQkJaWYocHJveHlVUkkgIT0gbnVsbCAmJiBvd25lckdVSUQgIT0gbnVsbCAmJiBwcm94eVVSSS5lcXVhbHMoaW5mby5wcm94eVVSSSkgJiYgb3duZXJHVUlELmVxdWFscyhpbmZvLm93bmVyR1VJRCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlcyBtYXJrZXJzIGZvciB1bnJlc29sdmVkIHByb3hpZXMgb2YgdGhlIGdpdmVuIHJlc291cmNlCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYXJrZXJzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWJvb2xlYW4gbmV3bHlBZGRlZCA9IGZhbHNlOwotCQlzeW5jaHJvbml6ZWQocmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnMpIHsKLQkJCW5ld2x5QWRkZWQgPSByZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2Vycy5hZGQocmVzb3VyY2UpOwotCQl9Ci0JCWlmKG5ld2x5QWRkZWQpIHsKLQkJCXNjaGVkdWxlKERFTEFZKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZG9WYWxpZGF0ZU1hcmtlcnMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZSBmaWxlID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlpZihmaWxlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IGZpbGUuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCUhhc2hTZXQgbWFya2VySW5mb3MgPSBuZXcgSGFzaFNldCgpOwkJCQkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQlTdHJpbmcgcHJveHlVUkkgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKFBST1hZX1VSSSk7Ci0JCQkJCWlmKHByb3h5VVJJICE9IG51bGwpIHsKLQkJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJKTsKLQkJCQkJCS8vIHRyeSB0byBnZXQgdGhlIG9iamVjdCB3aXRoIHRoaXMgcHJveHkgVVJJIHdpdGhvdXQgbG9hZGluZyBuZXcgcmVzb3VyY2UKLQkJCQkJCS8vCi0JCQkJCQlTdHJpbmcgZWxlbWVudEdVSUQgPSB1cmkuZnJhZ21lbnQoKTsJCQkJCQkJCi0JCQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLmdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS5nZXQoZWxlbWVudEdVSUQpOwotCQkJCQkJaWYobyA9PSBudWxsIHx8IG8uZUlzUHJveHkoKSkgewotCQkJCQkJCU1hcmtlckluZm8gaW5mbyA9IG5ldyBNYXJrZXJJbmZvKCk7Ci0JCQkJCQkJaW5mby5tZXNzYWdlID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpOwotCQkJCQkJCWluZm8ub3duZXJHVUlEID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShPV05FUl9HVUlEKTsKLQkJCQkJCQlpbmZvLnByb3h5VVJJID0gcHJveHlVUkk7Ci0JCQkJCQkJbWFya2VySW5mb3MuYWRkKGluZm8pOwkJCQkJCQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZihtYXJrZXIuZXhpc3RzKCkpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsJCQkJCQkJCQkKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlzeW5jaHJvbml6ZWQoZWxlbWVudEdVSVRvTWFya2Vyc01hcCkgewotCQkJCQkJCXJlbW92ZUZyb21FbGVtZW50R1VJRFRvTWFya2Vyc01hcChwcm94eVVSSSwgbWFya2VyKTsKLQkJCQkJCQlyZW1vdmVGcm9tUmVzb3VyY2VHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJLCBtYXJrZXIpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoIW1hcmtlckluZm9zLmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXJrZXJJbmZvcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU1hcmtlckluZm8gaW5mbyA9IChNYXJrZXJJbmZvKSBpdGVyLm5leHQoKTsKLQkJCQkJCWFkZE1hcmtlcihyZXNvdXJjZSwgVVJJLmNyZWF0ZVVSSShpbmZvLnByb3h5VVJJKSwgaW5mby5tZXNzYWdlLCBpbmZvLm93bmVyR1VJRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsJCQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiM2ZhMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgcGVyc2lzdGluZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OTRjMjM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZSBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0VXJpIDxlbT5Vcmk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZURlc2NyaXB0b3IoKQotICogQG1vZGVsCi0gKiBAZXh0ZW5kcyBFRGF0YU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlRGVzY3JpcHRvciBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZURlc2NyaXB0b3JfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Vcmk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVcmkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlRGVzY3JpcHRvcl9VcmkoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRVcmkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICB2b2lkIHNldFVyaShTdHJpbmcgdmFsdWUpOwotCi0gICAgVVJJIGdldFJlc29sdmVkVVJJKCk7Ci0gICAgCi0gICAgdm9pZCBzZXRSZXNvbHZlZFVSSShVUkkgdXJpKTsKLQkKLQkvKioKLQkgKiBDbGVhcnMgdGhlIHJlc29sdmVkIFVSSSB0aGF0IGhhcyBiZWVuIGNhY2hlZCBpbiBwcmV2aW91cyBjYWxsZWQgb2YgZ2V0UmVzb2x2ZWRVUkkoKQotCSAqIHNvIHRoZSBuZXh0IGNhbGwgdG8gZ2V0UmVzb2x2ZWRVUkkoKSB3aWxsIHVwZGF0ZSB0aGUgcmVzb2x2ZWRVUkkuCi0JICoKLQkgKi8KLQl2b2lkIGNsZWFyUmVzb2x2ZWRVUkkoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxN2ZiMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIE1hbmFnZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0VXJpQmFzZSA8ZW0+VXJpIEJhc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFN1Yk1hbmFnZXJzIDxlbT5TdWIgTWFuYWdlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFJlc291cmNlRGVzY3JpcHRvcnMgPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLSAqIEBtb2RlbAotICogQGV4dGVuZHMgRURhdGFPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBFRGF0YU9iamVjdCB7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3VpZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRHdWlkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZU1hbmFnZXJfR3VpZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRHdWlkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRHdWlkIDxlbT5HdWlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHdWlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHdWlkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcmkgQmFzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXJpIEJhc2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJpIEJhc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVyaUJhc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlTWFuYWdlcl9VcmlCYXNlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVyaUJhc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFVyaUJhc2UgPGVtPlVyaSBCYXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VcmkgQmFzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXJpQmFzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXJpQmFzZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIE1hbmFnZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIE1hbmFnZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIE1hbmFnZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlTWFuYWdlcl9TdWJNYW5hZ2VycygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U3ViTWFuYWdlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIERlc2NyaXB0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZU1hbmFnZXJfUmVzb3VyY2VEZXNjcmlwdG9ycygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIExpc3QgZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBHZXRzIGRpcmVjdCBSZXNvdXJjZURlc2NyaXB0b3Igd2hvc2UgaWQgaXMgdGhlIGdpdmVuIGd1aWQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlc291cmNlRGVzY3JpcHRvciBnZXRSZXNvdXJjZURlc2NyaXB0b3IoU3RyaW5nIGd1aWQpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgUmVzb3VyY2VEZXNjcmlwdG9yIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHVyaS4gSWYgY2xlYXJGb2xkZXIgaXMgdHJ1ZSwgdGhpcyBjYWxsIHdpbGwgcmVtb3ZlCi0gICAgICogYWxsIG90aGVyIFJlc291cmNlRGVzY3JpcHRvcnMgd2hvc2UgVVJJIHNoYXJlcyB0aGUgc2FtZSBmb2xkZXIgb2YgdGhlIGdpdmVuIHVyaS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogQHBhcmFtIGNsZWFyRm9sZGVyCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIExpc3QgcmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKFVSSSB1cmksIGJvb2xlYW4gY2xlYXJGb2xkZXIpOwotCi0Jdm9pZCBkaXNwb3NlKCk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlbWFuYWdlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODg2Y2FjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBSZXNvdXJjZURlc2NyaXB0b3IgY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFJlc291cmNlTWFuYWdlciBjcmVhdGVSZXNvdXJjZU1hbmFnZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSBnZXRSZXNvdXJjZW1hbmFnZXJQYWNrYWdlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzZTE5YWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFN0cmluZyBlTkFNRSA9ICJyZXNvdXJjZW1hbmFnZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZURlc2NyaXB0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwjZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IFJFU09VUkNFX0RFU0NSSVBUT1IgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfREVTQ1JJUFRPUl9fSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVyaTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBSRVNPVVJDRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VNYW5hZ2VySW1wbCA8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZU1hbmFnZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IFJFU09VUkNFX01BTkFHRVIgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9NQU5BR0VSX19HVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcmkgQmFzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX01BTkFHRVJfX1VSSV9CQVNFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWIgTWFuYWdlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFJFU09VUkNFX01BTkFHRVJfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yIDxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldFVyaSA8ZW0+VXJpPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXJpPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0VXJpKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldFJlc291cmNlRGVzY3JpcHRvcl9VcmkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyIDxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldEd1aWQgPGVtPkd1aWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HdWlkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0R3VpZCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZU1hbmFnZXJfR3VpZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRVcmlCYXNlIDxlbT5VcmkgQmFzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVyaSBCYXNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0VXJpQmFzZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZU1hbmFnZXJfVXJpQmFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFN1Yk1hbmFnZXJzIDxlbT5TdWIgTWFuYWdlcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YiBNYW5hZ2VyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFN1Yk1hbmFnZXJzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZU1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlTWFuYWdlcl9TdWJNYW5hZ2VycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFJlc291cmNlRGVzY3JpcHRvcnMgPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFJlc291cmNlRGVzY3JpcHRvcnMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlTWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VNYW5hZ2VyX1Jlc291cmNlRGVzY3JpcHRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFJlc291cmNlbWFuYWdlckZhY3RvcnkgZ2V0UmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlRGVzY3JpcHRvckltcGwgPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VEZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZURlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVTT1VSQ0VfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZURlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfREVTQ1JJUFRPUl9fSUQgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9ERVNDUklQVE9SX19VUkkgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yX1VyaSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwgPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VNYW5hZ2VySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZU1hbmFnZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVTT1VSQ0VfTUFOQUdFUiA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9NQU5BR0VSX19HVUlEID0gZUlOU1RBTkNFLmdldFJlc291cmNlTWFuYWdlcl9HdWlkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VcmkgQmFzZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX01BTkFHRVJfX1VSSV9CQVNFID0gZUlOU1RBTkNFLmdldFJlc291cmNlTWFuYWdlcl9VcmlCYXNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgTWFuYWdlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUyA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZU1hbmFnZXJfU3ViTWFuYWdlcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIERlc2NyaXB0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUyA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZU1hbmFnZXJfUmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VEZXNjcmlwdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDU3Yjg4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VEZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZSBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZURlc2NyaXB0b3JJbXBsI2dldFVyaSA8ZW0+VXJpPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMgUmVzb3VyY2VEZXNjcmlwdG9yIHsKLQkKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTY3MjUwODI2NjIzODU0NjJMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJpKCkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJpKCkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHVyaSA9IFVSSV9FREVGQVVMVDsKLQotCXByb3RlY3RlZCBVUkkgcmVzb2x2ZWRVUkk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLSAgCi0gLy9VTUEtLT4KLSAJCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotIC8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLkxpdGVyYWxzLlJFU09VUkNFX0RFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKLQkJaWYocmVzb2x2ZWRVUkkgIT0gbnVsbCAmJiAodXJpID09IG51bGwgfHwgdXJpLnN0YXJ0c1dpdGgoIi4uLyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQl1cmkgPSByZXNvbHZlZFVSSS5kZXJlc29sdmUoTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkoZVJlc291cmNlKCkpKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyBuZXdVcmkpIHsKLQkJU3RyaW5nIG9sZFVyaSA9IHVyaTsKLQkJdXJpID0gbmV3VXJpOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSSwgb2xkVXJpLCB1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fVVJJOgotCQkJCXJldHVybiBnZXRVcmkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19VUkk6Ci0JCQkJc2V0VXJpKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19VUkk6Ci0JCQkJc2V0VXJpKFVSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0vL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19VUkk6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVyaTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh1cmkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0VVJJKCkKLQkgKi8KLQlwdWJsaWMgVVJJIGdldFJlc29sdmVkVVJJKCkgewotCQlpZihyZXNvbHZlZFVSSSA9PSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVSZXNvdXJjZSgpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCVVSSSBiYXNlID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkoZVJlc291cmNlKCkpOwotCQkJCXJlc29sdmVkVVJJID0gVVJJLmNyZWF0ZVVSSShnZXRVcmkoKSkucmVzb2x2ZShiYXNlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc29sdmVkVVJJID0gVVJJLmNyZWF0ZVVSSShnZXRVcmkoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVkVVJJOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNzZXRVUkkob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvbHZlZFVSSShVUkkgdXJpKSB7CQkKLQkJcmVzb2x2ZWRVUkkgPSB1cmk7Ci0JCVN0cmluZyBuZXdVcmkgPSBudWxsOwotCQlpZihyZXNvbHZlZFVSSSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVSZXNvdXJjZSgpOwkKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlVUkkgYmFzZVVSSSA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEZpbmFsVVJJKHJlc291cmNlKTsKLQkJCQluZXdVcmkgPSByZXNvbHZlZFVSSS5kZXJlc29sdmUoYmFzZVVSSSkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlzZXRVcmkobmV3VXJpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjY2xlYXJSZXNvbHZlZFVSSSgpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXJSZXNvbHZlZFVSSSgpIHsKLQkJcmVzb2x2ZWRVUkkgPSBudWxsOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZU1hbmFnZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VNYW5hZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjA2MmZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZU1hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2UgTWFuYWdlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwjZ2V0VXJpQmFzZSA8ZW0+VXJpIEJhc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZU1hbmFnZXJJbXBsI2dldFN1Yk1hbmFnZXJzIDxlbT5TdWIgTWFuYWdlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZU1hbmFnZXJJbXBsI2dldFJlc291cmNlRGVzY3JpcHRvcnMgPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VNYW5hZ2VySW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMgUmVzb3VyY2VNYW5hZ2VyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTE2NDQ3MTQ3NTUwOTE2OTIwNEw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3VpZCgpIDxlbT5HdWlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHdWlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEd1aWQoKSA8ZW0+R3VpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3VpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBndWlkID0gR1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmlCYXNlKCkgPGVtPlVyaSBCYXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmlCYXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfQkFTRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmlCYXNlKCkgPGVtPlVyaSBCYXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmlCYXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVyaUJhc2UgPSBVUklfQkFTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1Yk1hbmFnZXJzKCkgPGVtPlN1YiBNYW5hZ2VyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJNYW5hZ2VycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHN1Yk1hbmFnZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlRGVzY3JpcHRvcnMoKSA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlRGVzY3JpcHRvcnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLSAgICBwcm90ZWN0ZWQgUmVzb3VyY2VNYW5hZ2VySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCWd1aWQgPSBVbWFVdGlsLmdlbmVyYXRlR1VJRCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5MaXRlcmFscy5SRVNPVVJDRV9NQU5BR0VSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R3VpZCgpIHsKLQkJcmV0dXJuIGd1aWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3VpZChTdHJpbmcgbmV3R3VpZCkgewotCQlTdHJpbmcgb2xkR3VpZCA9IGd1aWQ7Ci0JCWd1aWQgPSBuZXdHdWlkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX0dVSUQsIG9sZEd1aWQsIGd1aWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVyaUJhc2UoKSB7Ci0JCXJldHVybiB1cmlCYXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVyaUJhc2UoU3RyaW5nIG5ld1VyaUJhc2UpIHsKLQkJU3RyaW5nIG9sZFVyaUJhc2UgPSB1cmlCYXNlOwotCQl1cmlCYXNlID0gbmV3VXJpQmFzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRSwgb2xkVXJpQmFzZSwgdXJpQmFzZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN1Yk1hbmFnZXJzKCkgewotCQlpZiAoc3ViTWFuYWdlcnMgPT0gbnVsbCkgewotCQkJc3ViTWFuYWdlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nKFJlc291cmNlTWFuYWdlci5jbGFzcywgdGhpcywgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlMpOwotCQl9Ci0JCXJldHVybiBzdWJNYW5hZ2VyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkgewotCQlpZiAocmVzb3VyY2VEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZURlc2NyaXB0b3JzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZyhSZXNvdXJjZURlc2NyaXB0b3IuY2xhc3MsIHRoaXMsIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChndWlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGd1aWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVyaUJhc2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodXJpQmFzZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vCi0JLy8gU3RhcnQgY3VzdG9tIGNvZGUKLQkvLwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS51bWFmLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3QjZVJlc29sdmVQcm94eShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0KQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGVSZXNvbHZlUHJveHkoSW50ZXJuYWxFT2JqZWN0IHByb3h5KSB7Ci0JCXJldHVybiBzdXBlci5lUmVzb2x2ZVByb3h5KHByb3h5KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI3Jlc29sdmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc29sdmUoKSB7Ci0JCVVSSSBiYXNlID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkoZVJlc291cmNlKCkpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBSZXNvdXJjZURlc2NyaXB0b3JJbXBsIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBkZXNjLnJlc29sdmVkVVJJID0gVVJJLmNyZWF0ZVVSSShkZXNjLmdldFVyaSgpKS5yZXNvbHZlKGJhc2UpOwotICAgICAgICB9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2RlcmVzb2x2ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVyZXNvbHZlKCkgewotCQlVUkkgYmFzZSA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEZpbmFsVVJJKGVSZXNvdXJjZSgpKTsKLSAgICAgICAgLy8gY29udmVydCBwYXRoIGluIGFsbCBkZXNjcmlwdG9ycyB0byByZWxhdGl2ZQotICAgICAgICAvLwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZGVzYy5zZXRVcmkoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLmRlcmVzb2x2ZShiYXNlKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjcmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIGJvb2xlYW4pCi0JICovCi0JcHVibGljIExpc3QgcmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKFVSSSB1cmksIGJvb2xlYW4gY2xlYXJGb2xkZXIpIHsKLQkJQXJyYXlMaXN0IHJlbW92ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCVJlc291cmNlRGVzY3JpcHRvciByZW1vdmVkRGVzY3JpcHRvciA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZih1cmkuZXF1YWxzKGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKS50cmltRnJhZ21lbnQoKSkpIHsKLSAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOwotLy8gICAgICAgICAgICAgICAgcmVtb3ZlZERlc2NyaXB0b3IgPSBkZXNjOwotICAgICAgICAgICAgICAgIHJlbW92ZWRMaXN0LmFkZChkZXNjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotLy8gICAgICAgIGlmKHJlbW92ZWREZXNjcmlwdG9yICE9IG51bGwpIHsgICAgICAgIAkKLSAgICAgICAgCWlmKGNsZWFyRm9sZGVyKSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCBjaGlsZCBkZXNjcmlwdG9ycyBvZiB0aGUgcmVtb3ZlZCBkZXNjcmlwdG9yCi0gICAgICAgIAkJLy8KLSAgICAgICAgCQlTdHJpbmcgb2xkRGlyID0gbmV3IEZpbGUodXJpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKSArIEZpbGUuc2VwYXJhdG9yOwotICAgICAgICAJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLSAgICAgICAgCQkJaWYoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLnRvRmlsZVN0cmluZygpLnN0YXJ0c1dpdGgob2xkRGlyKSkgewotICAgICAgICAJCQkJaXRlci5yZW1vdmUoKTsKLSAgICAgICAgCQkJCXJlbW92ZWRMaXN0LmFkZChkZXNjKTsKLSAgICAgICAgCQkJfQotICAgICAgICAJCX0KLSAgICAgICAgCX0KLS8vICAgICAgICAJZWxzZSB7Ci0vLyAgICAgICAgCQkvLyByZW1vdmUgYWxsIHRoZSBkZXNjcmlwdG9ycyBvZiB0aGUgc2FtZSByZXNvdXJjZQotLy8gICAgICAgIAkJLy8KLS8vICAgICAgICAJCVVSSSByZXNVcmkgPSByZW1vdmVkRGVzY3JpcHRvci5nZXRSZXNvbHZlZFVSSSgpLnRyaW1GcmFnbWVudCgpOwotLy8gICAgICAgIAkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8gICAgICAgIAkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0vLyAgICAgICAgCQkJaWYoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLnRyaW1GcmFnbWVudCgpLmVxdWFscyhyZXNVcmkpKSB7Ci0vLyAgICAgICAgCQkJCWl0ZXIucmVtb3ZlKCk7Ci0vLyAgICAgICAgCQkJCXJlbW92ZWRMaXN0LmFkZChkZXNjKTsKLS8vICAgICAgICAJCQl9Ci0vLyAgICAgICAgCQl9ICAgICAgICAJCQotLy8gICAgICAgIAl9Ci0vLyAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVtb3ZlZExpc3Q7Ci0JfQkKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlRGVzY3JpcHRvciBnZXRSZXNvdXJjZURlc2NyaXB0b3IoU3RyaW5nIGd1aWQpIHsKLQkJaWYoaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcCA9PSBudWxsKSB7Ci0JCQlpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQotCQkJZUFkYXB0ZXJzKCkuYWRkKG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJICAgICAgICAgICAgUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2M7Ci0JCSAgICAgICAgICAgIHN3aXRjaChtc2cuZ2V0RmVhdHVyZUlEKFJlc291cmNlTWFuYWdlci5jbGFzcykpIHsKLQkJICAgICAgICAgICAgICAgIGNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUzoKLQkJICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKW1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJCQkJaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5wdXQoZGVzYy5nZXRJZCgpLCBkZXNjKTsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pbXNnLmdldE5ld1ZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQlkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJCQkJCQkJaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5wdXQoZGVzYy5nZXRJZCgpLCBkZXNjKTsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5yZW1vdmUoKChSZXNvdXJjZURlc2NyaXB0b3IpbXNnLmdldE9sZFZhbHVlKCkpLmdldElkKCkpOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCQkgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbiltc2cuZ2V0T2xkVmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlcgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAucmVtb3ZlKCgoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKSkuZ2V0SWQoKSk7Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0JCSAgICAgICAgICAgICAgICAgICAgfQotCQkgICAgICAgICAgICB9Ci0JCSAgICAgICAgfQotCi0JCQl9KTsKLQkJCQotCQkJLy8gcG9wdWxhdGUgdGhlIG1hcAotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZWxlbWVudCA9IChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCWlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAucHV0KGVsZW1lbnQuZ2V0SWQoKSwgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwLmdldChndWlkKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U3ViTWFuYWdlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19HVUlEOgotCQkJCXJldHVybiBnZXRHdWlkKCk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fVVJJX0JBU0U6Ci0JCQkJcmV0dXJuIGdldFVyaUJhc2UoKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlM6Ci0JCQkJcmV0dXJuIGdldFN1Yk1hbmFnZXJzKCk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlM6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlRGVzY3JpcHRvcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX0dVSUQ6Ci0JCQkJc2V0R3VpZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fVVJJX0JBU0U6Ci0JCQkJc2V0VXJpQmFzZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTOgotCQkJCWdldFN1Yk1hbmFnZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRTdWJNYW5hZ2VycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTOgotCQkJCWdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fR1VJRDoKLQkJCQlzZXRHdWlkKEdVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRToKLQkJCQlzZXRVcmlCYXNlKFVSSV9CQVNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTOgotCQkJCWdldFN1Yk1hbmFnZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlM6Ci0JCQkJZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0vL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19HVUlEOgotCQkJCXJldHVybiBHVUlEX0VERUZBVUxUID09IG51bGwgPyBndWlkICE9IG51bGwgOiAhR1VJRF9FREVGQVVMVC5lcXVhbHMoZ3VpZCk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fVVJJX0JBU0U6Ci0JCQkJcmV0dXJuIFVSSV9CQVNFX0VERUZBVUxUID09IG51bGwgPyB1cmlCYXNlICE9IG51bGwgOiAhVVJJX0JBU0VfRURFRkFVTFQuZXF1YWxzKHVyaUJhc2UpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUzoKLQkJCQlyZXR1cm4gc3ViTWFuYWdlcnMgIT0gbnVsbCAmJiAhc3ViTWFuYWdlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTOgotCQkJCXJldHVybiByZXNvdXJjZURlc2NyaXB0b3JzICE9IG51bGwgJiYgIXJlc291cmNlRGVzY3JpcHRvcnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcCAhPSBudWxsKSB7Ci0JCQlpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwLmNsZWFyKCk7Ci0JCQlpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID0gbnVsbDsKLQkJfQotCQkKLQkJZUFkYXB0ZXJzKCkuY2xlYXIoKTsJCQotCQkKLQkJLy8gZGlzcG9zZSB0aGUgc3ViIG1hbmFnZXJzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoSW50ZXJuYWxFTGlzdClnZXRTdWJNYW5hZ2VycygpKS5iYXNpY0l0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2VNYW5hZ2VyIHN1Yk1nciA9IChSZXNvdXJjZU1hbmFnZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYoISgoSW50ZXJuYWxFT2JqZWN0KXN1Yk1ncikuZUlzUHJveHkoKSkgewotCQkJCXN1Yk1nci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE1hcCBpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZW1hbmFnZXJGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxN2Y1ZGFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZW1hbmFnZXJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5IHsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZW1hbmFnZXJGYWN0b3J5IHRoZVJlc291cmNlbWFuYWdlckZhY3RvcnkgPSAoUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIpOyAvLyROT04tTkxTLTEkIAotCQkJaWYgKHRoZVJlc291cmNlbWFuYWdlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVSZXNvdXJjZW1hbmFnZXJGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IFJlc291cmNlbWFuYWdlckZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJlc291cmNlTWFuYWdlcigpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBSZXNvdXJjZURlc2NyaXB0b3IgY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKCkgewotCQlSZXNvdXJjZURlc2NyaXB0b3JJbXBsIHJlc291cmNlRGVzY3JpcHRvciA9IG5ldyBSZXNvdXJjZURlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiByZXNvdXJjZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFJlc291cmNlTWFuYWdlciBjcmVhdGVSZXNvdXJjZU1hbmFnZXIoKSB7Ci0JCVJlc291cmNlTWFuYWdlckltcGwgcmVzb3VyY2VNYW5hZ2VyID0gbmV3IFJlc291cmNlTWFuYWdlckltcGwoKTsKLQkJcmV0dXJuIHJlc291cmNlTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSBnZXRSZXNvdXJjZW1hbmFnZXJQYWNrYWdlKCkgewotCQlyZXR1cm4gKFJlc291cmNlbWFuYWdlclBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NDViNzI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSB7Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgcmVzb3VyY2VEZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgRUNsYXNzIHJlc291cmNlTWFuYWdlckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcml2YXRlIFJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlbWFuYWdlclBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFJlc291cmNlbWFuYWdlclBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCVJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsIHRoZVJlc291cmNlbWFuYWdlclBhY2thZ2UgPSAoUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZVJlc291cmNlbWFuYWdlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlUmVzb3VyY2VtYW5hZ2VyUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFJlc291cmNlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHJlc291cmNlRGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZURlc2NyaXB0b3JfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZURlc2NyaXB0b3JfVXJpKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRSZXNvdXJjZU1hbmFnZXIoKSB7Ci0JCXJldHVybiByZXNvdXJjZU1hbmFnZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VNYW5hZ2VyX0d1aWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZU1hbmFnZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZU1hbmFnZXJfVXJpQmFzZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlTWFuYWdlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlTWFuYWdlcl9TdWJNYW5hZ2VycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlc291cmNlTWFuYWdlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlTWFuYWdlcl9SZXNvdXJjZURlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VNYW5hZ2VyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFJlc291cmNlbWFuYWdlckZhY3RvcnkgZ2V0UmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChSZXNvdXJjZW1hbmFnZXJGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXJlc291cmNlRGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVNPVVJDRV9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3MsIFJFU09VUkNFX0RFU0NSSVBUT1JfX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3MsIFJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSSk7Ci0KLQkJcmVzb3VyY2VNYW5hZ2VyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFU09VUkNFX01BTkFHRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlTWFuYWdlckVDbGFzcywgUkVTT1VSQ0VfTUFOQUdFUl9fR1VJRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VNYW5hZ2VyRUNsYXNzLCBSRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VNYW5hZ2VyRUNsYXNzLCBSRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlc291cmNlTWFuYWdlckVDbGFzcywgUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MocmVzb3VyY2VEZXNjcmlwdG9yRUNsYXNzLCBSZXNvdXJjZURlc2NyaXB0b3IuY2xhc3MsICJSZXNvdXJjZURlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VEZXNjcmlwdG9yX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFJlc291cmNlRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZURlc2NyaXB0b3JfVXJpKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmkiLCBudWxsLCAwLCAxLCBSZXNvdXJjZURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHJlc291cmNlTWFuYWdlckVDbGFzcywgUmVzb3VyY2VNYW5hZ2VyLmNsYXNzLCAiUmVzb3VyY2VNYW5hZ2VyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlTWFuYWdlcl9HdWlkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJndWlkIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VNYW5hZ2VyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlTWFuYWdlcl9VcmlCYXNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmlCYXNlIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VNYW5hZ2VyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlTWFuYWdlcl9TdWJNYW5hZ2VycygpLCB0aGlzLmdldFJlc291cmNlTWFuYWdlcigpLCBudWxsLCAic3ViTWFuYWdlcnMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VNYW5hZ2VyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VNYW5hZ2VyX1Jlc291cmNlRGVzY3JpcHRvcnMoKSwgdGhpcy5nZXRSZXNvdXJjZURlc2NyaXB0b3IoKSwgbnVsbCwgInJlc291cmNlRGVzY3JpcHRvcnMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VNYW5hZ2VyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlFT3BlcmF0aW9uIG9wID0gYWRkRU9wZXJhdGlvbihyZXNvdXJjZU1hbmFnZXJFQ2xhc3MsIHRoaXMuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCksICJnZXRSZXNvdXJjZURlc2NyaXB0b3IiLCAwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZ3VpZCIsIDAsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0YjBkMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgbWFuYWdpbmcgWE1JIHJlc291cmNlcyBpbiBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0YWZjNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgbWFuYWdpbmcgWE1JIHJlc291cmNlcyBpbiBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9yZXNvdXJjZW1hbmFnZXIuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0MWM4YjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9yZXNvdXJjZW1hbmFnZXIuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJyZXNvdXJjZW1hbmFnZXIiCi0gICAgbnNVUkk9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlciI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVzb3VyY2VEZXNjcmlwdG9yIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlc291cmNlTWFuYWdlciI+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFJlc291cmNlRGVzY3JpcHRvciIgZVR5cGU9IiMvL1Jlc291cmNlRGVzY3JpcHRvciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdldHMgZGlyZWN0IFJlc291cmNlRGVzY3JpcHRvciB3aG9zZSBpZCBpcyB0aGUgZ2l2ZW4gZ3VpZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZ3VpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imd1aWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpQmFzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJNYW5hZ2VycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9SZXNvdXJjZU1hbmFnZXIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc291cmNlRGVzY3JpcHRvcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUmVzb3VyY2VEZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3Jlc291cmNlbWFuYWdlci5nZW5tb2RlbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcmVzb3VyY2VtYW5hZ2VyLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhY2I3OWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcmVzb3VyY2VtYW5hZ2VyLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjIgotICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlciIgdGVtcGxhdGVEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcyIKLSAgICBydW50aW1lSmFyPSJ0cnVlIiBkeW5hbWljVGVtcGxhdGVzPSJ0cnVlIiBtb2RlbE5hbWU9IlJlc291cmNlbWFuYWdlciIgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLnByb3ZpZGVyLlJlc291cmNlbWFuYWdlckVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIucHJlc2VudGF0aW9uLlJlc291cmNlbWFuYWdlckVkaXRvclBsdWdpbiIKLSAgICBub25OTFNNYXJrZXJzPSJ0cnVlIiByb290RXh0ZW5kc0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FRGF0YU9iamVjdCIKLSAgICByb290RXh0ZW5kc0NsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3QiIHJvb3RJbXBsZW1lbnRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkludGVybmFsRURhdGFPYmplY3QiCi0gICAgc3VwcHJlc3NFTUZUeXBlcz0idHJ1ZSIgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcmZhY2U9ImNvbW1vbmouc2RvLlNlcXVlbmNlIiBmZWF0dXJlTWFwV3JhcHBlckludGVybmFsSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuRVNlcXVlbmNlIgotICAgIGZlYXR1cmVNYXBXcmFwcGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5CYXNpY0VTZXF1ZW5jZSIgY29udGFpbm1lbnRQcm94aWVzPSJ0cnVlIj4KLSAgPGZvcmVpZ25Nb2RlbD5DOlxDQ19WaWV3c1xwbGVfVE5HX0F1dGhvcmluZ1x0bmdfYXV0aG9yaW5nXFRORyBVTUwgTW9kZWxzXHJlc291cmNlbWFuYWdlci5tZGw8L2ZvcmVpZ25Nb2RlbD4KLSAgPHN0YXRpY1BhY2thZ2VzPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvU0RPPC9zdGF0aWNQYWNrYWdlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9DT01NT05KX1NETz1vcmcuZWNsaXBzZS5lbWYuY29tbW9uai5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0VDT1JFX1NETz1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iUmVzb3VyY2VtYW5hZ2VyIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuZXBmIiBlY29yZVBhY2thZ2U9InJlc291cmNlbWFuYWdlci5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJyZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZURlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlRGVzY3JpcHRvci9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlRGVzY3JpcHRvci91cmkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VNYW5hZ2VyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSByZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZU1hbmFnZXIvZ3VpZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlTWFuYWdlci91cmlCYXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlTWFuYWdlci9zdWJNYW5hZ2VycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSByZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZU1hbmFnZXIvcmVzb3VyY2VEZXNjcmlwdG9ycyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249InJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlTWFuYWdlci9nZXRSZXNvdXJjZURlc2NyaXB0b3IiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0icmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VNYW5hZ2VyL2dldFJlc291cmNlRGVzY3JpcHRvci9ndWlkIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci91dGlsL1Jlc291cmNlbWFuYWdlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzMzBkNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci91dGlsL1Jlc291cmNlbWFuYWdlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlbWFuYWdlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VtYW5hZ2VyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgUmVzb3VyY2VtYW5hZ2VyU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IFJlc291cmNlbWFuYWdlclN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlRGVzY3JpcHRvcihSZXNvdXJjZURlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlTWFuYWdlcihSZXNvdXJjZU1hbmFnZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlTWFuYWdlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyIDxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlc291cmNlTWFuYWdlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTBhNDdjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3V0aWwvUmVzb3VyY2VtYW5hZ2VyU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlbWFuYWdlclN3aXRjaCB7Ci0JCi0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VtYW5hZ2VyU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFJlc291cmNlbWFuYWdlclBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUjogewotCQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNvdXJjZURlc2NyaXB0b3IgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNvdXJjZURlc2NyaXB0b3IocmVzb3VyY2VEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUjogewotCQkJCVJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIgPSAoUmVzb3VyY2VNYW5hZ2VyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2VNYW5hZ2VyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZURlc2NyaXB0b3IoUmVzb3VyY2VEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZU1hbmFnZXIoUmVzb3VyY2VNYW5hZ2VyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNTg3ZDZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBtYW5hZ2luZyBYTUkgcmVzb3VyY2VzIGluIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTFkZWU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIExpYnJhcnkgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjZGUxZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWE1YTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLAotIG9yZy5lY2xpcHNlLmVwZi51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnVpLmlkZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3MsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3MsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcwotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3MzFlZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMKLSAgICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL09wZW5MaWJyYXJ5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvT3BlbkxpYnJhcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjQ5ODMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvT3BlbkxpYnJhcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0UHJvY2Vzcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFByb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjQ5ODMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvd2l6YmFuL09wZW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9pY29ucy9mdWxsL3dpemJhbi9PcGVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI0OTgzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvd2l6YmFuL09wZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiZTFiZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgTGlicmFyeSBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBBY3Rpb24gCi1hY3Rpb25TZXRMYWJlbD1NZXRob2QgQXV0aG9yaW5nCi1maWxlT3Blbk1lbnVMYWJlbD1PcGVuCi1vcGVuTGlicmFyeUFjdGlvbmxhYmVsPU1ldGhvZCBMaWJyYXJ5Ci1vcGVuTGlicmFyeUFjdGlvblRvb2x0aXA9T3BlbiBhIG1ldGhvZCBsaWJyYXJ5Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISEKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgRGVmYXVsdCBNZXRob2QgTGlicmFyeSBQYXRoLgotbGlicmFyeVBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9NZXRob2QgTGlicmFyaWVzL2xpYnJhcnkxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYjYxMzFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPiAgICAgICAgICAgCi0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJuZXdMaWJyYXJ5V2l6YXJkUGFnZXMiCi0gICAgICAgICBuYW1lPSJFUEYgTmV3IE1ldGhvZCBMaWJyYXJ5IFdpemFyZCBQYWdlcyIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL05ld0xpYnJhcnlXaXphcmRQYWdlcy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJvcGVuTGlicmFyeVdpemFyZFBhZ2VzIgotICAgICAgICAgbmFtZT0iRVBGIE9wZW4gTWV0aG9kIExpYnJhcnkgV2l6YXJkIFBhZ2VzIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvT3BlbkxpYnJhcnlXaXphcmRQYWdlcy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvblNldCIKLSAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uU2V0TGFiZWwiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubWVudS5maWxlT3Blbk1lbnUiCi0gICAgICAgICAgICAgICBsYWJlbD0iJWZpbGVPcGVuTWVudUxhYmVsIgotICAgICAgICAgICAgICAgcGF0aD0iZmlsZS9uZXcuZXh0Ij4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iZ3JvdXBtMSIvPgotICAgICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJncm91cG0yIi8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5PcGVuTGlicmFyeUFjdGlvbiIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9ImZpbGVfb3Blbl9saWJyYXJ5X2NvbnRleHQiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuT3BlbkxpYnJhcnlBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJW9wZW5MaWJyYXJ5QWN0aW9ubGFiZWwiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZmlsZS9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5tZW51LmZpbGVPcGVuTWVudS9ncm91cG0xIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcCIvPgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NjaGVtYS9OZXdMaWJyYXJ5V2l6YXJkUGFnZXMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL05ld0xpYnJhcnlXaXphcmRQYWdlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMzljNDZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL05ld0xpYnJhcnlXaXphcmRQYWdlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSIgaWQ9Im5ld0xpYnJhcnlXaXphcmRQYWdlcyIgbmFtZT0iRVBGIE5ldyBNZXRob2QgTGlicmFyeSBXaXphcmQgUGFnZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRW5hYmxlcyBhIHBsdWctaW4gdG8gY29udHJpYnV0ZSBhIG1ldGhvZCBsaWJyYXJ5IHR5cGUgc3BlY2lmaWMgd2l6YXJkIHBhZ2UgdG8gdGhlIE5ldyBNZXRob2QgTGlicmFyeSB3aXphcmQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im5ld0xpYnJhcnlXaXphcmRQYWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibmV3TGlicmFyeVdpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSB3aXphcmQgcGFnZS4gVGhpcyBjbGFzcyBtdXN0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5BZGRMaWJyYXJ5V2l6YXJkUGFnZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiBhIHNwZWNpZmljIG1ldGhvZCBsaWJyYXJ5IHR5cGUgKGRhdGFiYXNlLCB4bWksIGV0Yy4pLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRpdGxlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgTGlicmFyeSBNYW5hZ2VyIGV4dGVuc2lvbiBwb2ludDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5ld0xpYnJhcnlXaXphcmRQYWdlcyZxdW90OyZndDsKLSAgICAgICZsdDthZGRMaWJyYXJ5V2l6YXJkUGFnZQotICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLk5ld1hNSUxpYnJhcnlXaXphcmRQYWdlJnF1b3Q7Ci0gICAgICAgICB0eXBlPSZxdW90O3htaSZxdW90OwotICAgICAgICAgdGl0bGU9JnF1b3Q7Q3JlYXRlcyBhIFhNSSBtZXRob2QgbGlicmFyeS4mcXVvdDsKLSAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90O1NwZWNpZnkgdGhlIGxvY2F0aW9uIGZvciB0aGUgWE1JIG1ldGhvZCBsaWJyYXJ5LiZxdW90OyZndDsKLSAgICAgICZsdDsvYWRkTGlicmFyeVdpemFyZFBhZ2UmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zY2hlbWEvT3BlbkxpYnJhcnlXaXphcmRQYWdlcy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zY2hlbWEvT3BlbkxpYnJhcnlXaXphcmRQYWdlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YzBlNDE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL09wZW5MaWJyYXJ5V2l6YXJkUGFnZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkiIGlkPSJvcGVuTGlicmFyeVdpemFyZFBhZ2VzIiBuYW1lPSJFUEYgT3BlbiBNZXRob2QgTGlicmFyeSBXaXphcmQgUGFnZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRW5hYmxlcyBhIHBsdWctaW4gdG8gY29udHJpYnV0ZSBhIG1ldGhvZCBsaWJyYXJ5IHR5cGUgc3BlY2lmaWMgd2l6YXJkIHBhZ2UgdG8gdGhlIE9wZW4gTWV0aG9kIExpYnJhcnkgd2l6YXJkLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvcGVuTGlicmFyeVdpemFyZFBhZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJvcGVuTGlicmFyeVdpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSB3aXphcmQgcGFnZS4gVGhpcyBjbGFzcyBtdXN0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5BZGRMaWJyYXJ5V2l6YXJkUGFnZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiBhIHNwZWNpZmljIG1ldGhvZCBsaWJyYXJ5IHR5cGUgKGRhdGFiYXNlLCB4bWksIGV0Yy4pLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRpdGxlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgTGlicmFyeSBNYW5hZ2VyIGV4dGVuc2lvbiBwb2ludDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJycmF5LnVpLm9wZW5MaWJyYXJ5V2l6YXJkUGFnZXMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7b3BlbkxpYnJhcnlXaXphcmRQYWdlCi0gICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuT3BlblhNSUxpYnJhcnlXaXphcmRQYWdlJnF1b3Q7Ci0gICAgICAgICB0eXBlPSZxdW90O3htaSZxdW90OwotICAgICAgICAgdGl0bGU9JnF1b3Q7T3BlbnMgYSBYTUkgbWV0aG9kIGxpYnJhcnkuJnF1b3Q7Ci0gICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDtTcGVjaWZ5IHRoZSBsb2NhdGlvbiBmb3IgdGhlIFhNSSBtZXRob2QgbGlicmFyeS4mcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L29wZW5MaWJyYXJ5V2l6YXJkUGFnZSZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9JTGlicmFyeVVJTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvSUxpYnJhcnlVSU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzNhZGJjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9JTGlicmFyeVVJTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHByb3ZpZGUgdXNlciBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIG9yIG9wZW5pbmcgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDI2LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlVSU1hbmFnZXIgewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGxpYnJhcnkgd2l0aCB1c2VyIHNwZWNpZmllZCBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBjcmVhdGVOZXdMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBPcGVuIGEgbWV0aG9kIGxpYnJhcnkgdGhhdCB1c2VyIHNwZWNpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFzdE9wZW4KLQkgKiAgICAgICAgICAgIGlmIHRydWUgd2lsbCB0cnkgdG8gb3BlbiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCBoYWQgYmVlbgotCSAqICAgICAgICAgICAgb3BlbmVkIG1vc3QgcmVjZW50bHkuCi0JICogQHJldHVybgotCSAqICAgICAgICAgICAgPGxpPjxjb2RlPnRydWU8L2NvZGU+IGlmIHN1Y2Nlc3NmdWwKLQkgKiAgICAgICAgICAgIDxsaT48Y29kZT5mYWxzZTwvY29kZT4gaWYgdXNlciBjYW5jZWxsZWQgb3IgZXhjZXB0aW9uCi0JICogICAgICAgICAgICBvY2N1cmVkCi0JICovCi0JYm9vbGVhbiBvcGVuTGlicmFyeShib29sZWFuIGxhc3RPcGVuKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0lNZXRob2RFbGVtZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0lNZXRob2RFbGVtZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTY0YjY2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9JTWV0aG9kRWxlbWVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kRWxlbWVudFByb3ZpZGVyIHsKLQlNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSUltYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhMWE1MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIExpYnJhcnkgVUkgaW1hZ2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlVSUltYWdlcyB7Ci0KLQkvKioKLQkgKiBUaGUgaW1hZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgTWV0aG9kIExpYnJhcnkgZWxlbWVudHMuCi0JICogPHA+Ci0JICogVGhlc2UgaW1hZ2VzIGFyZSBjYWNoZWQgYW5kIHNob3VsZCBub3QgYmUgZGlzcG9zZWQgYnkgdGhlIHVzZXIhCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUNUSVZJVFkgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQWN0aXZpdHkiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQVJUSUZBQ1QgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQXJ0aWZhY3QiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ0FQQUJJTElUWV9QQVRURVJOID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NIRUNLTElTVCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9DaGVja2xpc3QiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ09NUE9TSVRFX1JPTEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQ29tcG9zaXRlUm9sZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19DT05DRVBUID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0NvbmNlcHQiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ09OVEVOVF9QQUNLQUdFID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0NvbnRlbnRQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NVU1RPTV9DQVRFR09SWSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ERUxJVkVSQUJMRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyYWJsZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ERUxJVkVSWV9QUk9DRVNTID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2VzcyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ESVNDSVBMSU5FID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0Rpc2NpcGxpbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRElTQ0lQTElORV9HUk9VUElORyA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9EaXNjaXBsaW5lR3JvdXBpbmciKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRE9NQUlOID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0RvbWFpbiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19FU1RJTUFURSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Fc3RpbWF0ZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19FU1RJTUFUSU5HX01FVFJJQyA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Fc3RpbWF0aW5nTWV0cmljIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0VYQU1QTEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvRXhhbXBsZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19HVUlERUxJTkUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvR3VpZGVsaW5lIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0lURVJBVElPTiA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9JdGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX01FVEhPRF9DT05GSUdVUkFUT04gPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19NRVRIT0RfTElCQVJBUlkgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19NRVRIT0RfUEFDS0FHRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX01FVEhPRF9QTFVHSU4gPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX01JTEVTVE9ORSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9NaWxlc3RvbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfT1VUQ09NRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9PdXRjb21lIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BIQVNFID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1BoYXNlIik7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUkFDVElDRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9QcmFjdGljZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUk9DRVNTID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BST0NFU1NfQ09OVFJJQlVUSU9OID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUFJPQ0VTU19GQU1JTFkgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlseSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUk9DRVNTX1BBQ0tBR0UgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UiKTsgLy8kTk9OLU5MUy0xCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19SRVBPUlQgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUmVwb3J0Iik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1JPQURNQVAgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUm9hZG1hcCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ST0xFX0RFU0NSSVBUT1IgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZURlc2NyaXB0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUk9MRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1JPTEVfU0VUID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JvbGVTZXQiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUk9MRV9TRVRfR1JPVVBJTkcgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZVNldEdyb3VwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFsIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RBU0sgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvVGFzayIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19UQVNLX0RFU0NSSVBUT1IgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVEVBTV9QUk9GSUxFID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1RlYW1Qcm9maWxlIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RFTVBMQVRFID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1RlbXBsYXRlIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RFUk1fREVGSU5JVElPTiA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19UT09MID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Rvb2wiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVE9PTF9NRU5UT1IgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvVG9vbE1lbnRvciIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19XSElURVBBUEVSID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1doaXRlcGFwZXIiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfV09SS19QUk9EVUNUID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0Iik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1dPUktfUFJPRFVDVF9UWVBFID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgQSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBVTUEgRWRpdCBwbHVnLWluIHJvb3QuCi0JICogQHJldHVybiBBIDxjb2RlPkltYWdlPC9jb2RlPiBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBnZXRFbGVtZW50SW1hZ2UoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKAotCQkJCVVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UocGF0aCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NmQ4ODgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuT3BlbkxpYnJhcnlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9ncy5TZWxlY3RMaWJyYXJ5RGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTGlicmFyeUJhY2t1cFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uTWFwcGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgVUkgTWFuYWdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVVJTWFuYWdlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTEJBUl9DT05GSUdfQ09OVFJJQlVUSU9OX0lEID0gInRvb2xiYXIuY29uZmlnLmNvbnRyaWJ1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIExpYnJhcnlVSU1hbmFnZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNtZExpbmVMaWJQYXRoID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY21kTGluZURlZmF1bHRMaWJQYXRoID0gbnVsbDsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXBwTmFtZSA9ICJjb21wb3NlciI7Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwIHR5cGVUb01hbmFnZXJEZWZNYXA7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5VUlNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChMaWJyYXJ5VUlNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgTGlicmFyeVVJTWFuYWdlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUHJpdmF0ZSBkZWZhdWx0IGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nCi0JICogaW5zdGFudGlhdGVkLgotCSAqLwotCXByaXZhdGUgTGlicmFyeVVJTWFuYWdlcigpIHsKLQkJYWRkQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbigpOwotCX0KLQotCS8qKgotCSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgTWV0aG9kIExpYnJhcnkuCi0JICovCi0JcHVibGljIHZvaWQgcHJvbXB0Rm9yTWV0aG9kTGlicmFyeSgpIHsKLQkJdHJ5IHsKLQkJCU9wZW5MaWJyYXJ5QWN0aW9uIGFjdGlvbiA9IG5ldyBPcGVuTGlicmFyeUFjdGlvbigpOwotCQkJYWN0aW9uLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSk7Ci0JCQlhY3Rpb24ucnVuKG51bGwpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQkKLQkJLyoKLQkJaWYoIVNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVuY2VUeXBlKCkuZXF1YWxzKFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKSkgewotCQkJSUxpYnJhcnlVSU1hbmFnZXIgbWFuYWdlciA9IGdldExpYnJhcnlVSU1hbmFnZXIoU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZW5jZVR5cGUoKSk7Ci0JCQlpZihtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlpZighbWFuYWdlci5vcGVuTGlicmFyeSh0cnVlKSkgewotCQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkKLQkJLy8gUmV0cmlldmUgdGhlIExpYnJhcnkgcGF0aCB0aGF0IHdhcyBzYXZlZCBpbiBhIHByZXZpb3VzIHNlc3Npb24uCi0JCVN0cmluZyBsaWJQYXRoID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0U2F2ZWRMaWJyYXJ5UGF0aCgpOwotCQlpZiAoY21kTGluZUxpYlBhdGggIT0gbnVsbCkgewotCQkJbGliUGF0aCA9IGNtZExpbmVMaWJQYXRoOwotCQl9IGVsc2UgaWYgKGxpYlBhdGggPT0gbnVsbCB8fCBsaWJQYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCWlmIChjbWRMaW5lRGVmYXVsdExpYlBhdGggIT0gbnVsbCkgewotCQkJCWxpYlBhdGggPSBjbWRMaW5lRGVmYXVsdExpYlBhdGg7Ci0JCQl9Ci0JCX0KLQotCQkvLyBQcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgTWV0aG9kIExpYnJhcnkgZm9sZGVyIGlmOgotCQkvLyAoMSkgVGhlIHNhdmVkIG9yIGNvbW1hbmQgbGluZSBMaWJyYXJ5IHBhdGggaXMgaW52YWxpZCBBTkQKLQkJLy8gKDIpIFRoZSBwcm9tcHQgZm9yIE1ldGhvZCBMaWJyYXJ5IGF0IHN0YXJ0dXAgcHJlZmVyZW5jZSBpcyBzZXQgdG8KLQkJLy8gdHJ1ZSAodGhlIGRlZmF1bHQpCi0JCWlmIChYTUlMaWJyYXJ5VXRpbC5pc1ZhbGlkTGlicmFyeShsaWJQYXRoLCB0cnVlKSA9PSBTdGF0dXMuT0tfU1RBVFVTCi0JCQkJJiYgIUxpYnJhcnlVSVByZWZlcmVuY2VzLmdldFByb21wdEZvck1ldGhvZExpYnJhcnlBdFN0YXJ0dXAoKQotCQkJCSYmICFYTUlMaWJyYXJ5VXRpbC5pc01ldGhvZExpYnJhcnlMb2NrZWQobGliUGF0aCkpIHsKLQkJCW9wZW5MaWJyYXJ5KGxpYlBhdGgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gT3BlbiBhIGRpYWxvZyB0byBwcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgTWV0aG9kIExpYnJyYXkgZm9sZGVyLgotCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNWYWxpZExpYnJhcnkobGliUGF0aCkgIT0gU3RhdHVzLk9LX1NUQVRVUykgewotCQkJbGliUGF0aCA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldERlZmF1bHRMaWJyYXJ5UGF0aCgpOwotCQl9Ci0JCQotCQkvLyBidWcgMTUxMTk5IC0gY2hhbmdlIHBhcmVudCBzaGVsbCB0byBudWxsLiBkaWFsb2cgaXMgYWxzbyBjaGFuZ2VkIHRvCi0JCS8vIG5vdCBiZSBPTl9UT1AKLQkJT3BlbkxpYnJhcnlEaWFsb2cgZGlhbG9nID0gbmV3IE9wZW5MaWJyYXJ5RGlhbG9nKG51bGwsIGxpYlBhdGgpOwotCQl3aGlsZSAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCWxpYlBhdGggPSBkaWFsb2cuZ2V0TGlicmFyeVBhdGgoKTsKLQkJCWxpYlBhdGggPSB0b0Fic29sdXRlTGlicmFyeVBhdGgobGliUGF0aCk7Ci0JCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNWYWxpZExpYnJhcnkobGliUGF0aCwgdHJ1ZSkgPT0gU3RhdHVzLk9LX1NUQVRVUykgewotCQkJCWlmIChYTUlMaWJyYXJ5VXRpbC5pc01ldGhvZExpYnJhcnlMb2NrZWQobGliUGF0aCkpIHsKLQkJCQkJaWYgKGRpc3BsYXlMaWJyYXJ5TG9ja2VkTWVzc2FnZSgpICE9IDApCi0JCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvID0gVmVyc2lvblV0aWwuY2hlY2tMaWJyYXJ5VmVyc2lvbigKLQkJCQkJCW5ldyBGaWxlKGxpYlBhdGgsIFhNSUxpYnJhcnlNYW5hZ2VyLkxJQlJBUllfWE1JKSk7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLnJlc3VsdCA+IDApIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaW5mby50b29sSUQuZXF1YWxzKFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSkpIHsKLQkJCQkJCW1lc3NhZ2UgPSBOTFMuYmluZChMaWJyYXJ5VUlSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHQsIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCksIGluZm8udG9vbFZlcnNpb259KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW1lc3NhZ2UgPSBOTFMuYmluZChMaWJyYXJ5VUlSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHRfdW5rbm93biwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwotCQkJCQl9Ci0JCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuCi0JCQkJCQlkaXNwbGF5RXJyb3IoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLCBtZXNzYWdlKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChYTUlMaWJyYXJ5VXRpbC5pc01ldGhvZExpYnJhcnlVcGdyYWRlUmVxdWlyZWQobGliUGF0aCkpIHsKLQkJCQkJaWYgKCFMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dCkpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWlmICghdXBncmFkZUxpYnJhcnkobGliUGF0aCwgbnVsbCkpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChvcGVuTGlicmFyeShsaWJQYXRoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlNc2dEaWFsb2cgbXNnRGlhbG9nID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCWJvb2xlYW4gcmMgPSBtc2dEaWFsb2cKLQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCU5MUwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dCwKLQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IGxpYlBhdGggfSkpOwotCQkJCWlmICghcmMpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChjcmVhdGVMaWJyYXJ5KGxpYlBhdGgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCUxpYnJhcnlVSVJlc291cmNlcy5pbnZhbGlkTGlicmFyeVBhdGhfbXNnLAotCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuaW52YWxpZExpYnJhcnlQYXRoX3JlYXNvbik7Ci0JCX0KLQkJOwotCi0JCS8vIGlmIGRpYWxvZyBpcyBjbG9zZWQgd2l0aCB0aGUgT0sgYnV0dG9uYmVpbmcgY2xpY2tlZCAtLSB0cmVhdCBpdCBhcwotCQkvLyBjYW5jZWwKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JCSovCi0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hbmFnZXJEZWYgewotCQlCdW5kbGUgYnVuZGxlOwotCi0JCVN0cmluZyB0eXBlOwotCi0JCVN0cmluZyBjbGFzc05hbWU7Ci0JCQotCQlJTGlicmFyeVVJTWFuYWdlciBpbnN0YW5jZTsKLQotCQkvKioKLQkJICogQHBhcmFtIGJ1bmRsZQotCQkgKiBAcGFyYW0gdHlwZQotCQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JCSAqIEBwYXJhbSBpbnN0YW5jZQotCQkgKi8KLQkJcHJpdmF0ZSBNYW5hZ2VyRGVmKEJ1bmRsZSBidW5kbGUsIFN0cmluZyB0eXBlLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCX0KLQkJCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJTGlicmFyeVVJTWFuYWdlciBnZXRMaWJyYXJ5VUlNYW5hZ2VyKFN0cmluZyBwZXJzaXN0ZW5jZVR5cGUpIHsKLQkJaWYgKHR5cGVUb01hbmFnZXJEZWZNYXAgPT0gbnVsbCkgewotCQkJdHlwZVRvTWFuYWdlckRlZk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkvLyBQcm9jZXNzIHRoZSBleHRlbnNpb24gcG9pbnQgY29udHJpYnV0b3JzLgotCQkJLy8KLQkJCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtCi0JCQkJCS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkKLQkJCQkJLmdldEV4dGVuc2lvblBvaW50KAotCQkJCQkJCSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSIsICJsaWJyYXJ5VUlNYW5hZ2VycyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyB0eXBlID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsCi0JCQkJCQkJCQkmJiBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkJJiYgdHlwZSAhPSBudWxsCi0JCQkJCQkJCQkmJiB0eXBlLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJdHlwZVRvTWFuYWdlckRlZk1hcC5wdXQodHlwZSwgbmV3IE1hbmFnZXJEZWYoYnVuZGxlLAotCQkJCQkJCQkJCXR5cGUsIGNsYXNzTmFtZSkpOwotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlNYW5hZ2VyRGVmIG1nciA9IChNYW5hZ2VyRGVmKSB0eXBlVG9NYW5hZ2VyRGVmTWFwLmdldChwZXJzaXN0ZW5jZVR5cGUpOwotCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCWlmIChtZ3IuaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCW1nci5pbnN0YW5jZSA9IChJTGlicmFyeVVJTWFuYWdlcikgbWdyLmJ1bmRsZS5sb2FkQ2xhc3MoCi0JCQkJCQkJbWdyLmNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCWlmKERFQlVHICkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtZ3IuaW5zdGFuY2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQkvKioKLQkgKiBPcGVucyBhIE1ldGhvZCBMaWJyYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIG9wZW5MaWJyYXJ5KCkgewotCQlpZighU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZW5jZVR5cGUoKS5lcXVhbHMoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKSB7Ci0JCQlJTGlicmFyeVVJTWFuYWdlciBtYW5hZ2VyID0gZ2V0TGlicmFyeVVJTWFuYWdlcihTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlbmNlVHlwZSgpKTsKLQkJCWlmKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCW1hbmFnZXIub3BlbkxpYnJhcnkoZmFsc2UpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCVNlbGVjdExpYnJhcnlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdExpYnJhcnlEaXJlY3RvcnlEaWFsb2coCi0JCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0JCVN0cmluZyBsaWJQYXRoID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0U2F2ZWRMaWJyYXJ5UGF0aCgpOwotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChsaWJQYXRoKTsKLQkJZG8gewotCQkJbGliUGF0aCA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAobGliUGF0aCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzVmFsaWRMaWJyYXJ5KGxpYlBhdGgsIHRydWUpID09IFN0YXR1cy5PS19TVEFUVVMpIHsKLQkJCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNNZXRob2RMaWJyYXJ5TG9ja2VkKGxpYlBhdGgpKSB7Ci0JCQkJCWlmIChkaXNwbGF5TGlicmFyeUxvY2tlZE1lc3NhZ2UoKSAhPSAwKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbyA9IFZlcnNpb25VdGlsLmNoZWNrTGlicmFyeVZlcnNpb24oCi0JCQkJCQluZXcgRmlsZShsaWJQYXRoLCBYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1hNSSkpOwotCQkJCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5yZXN1bHQgPiAwKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGluZm8udG9vbElELmVxdWFscyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpKSB7Ci0JCQkJCQltZXNzYWdlID0gTkxTLmJpbmQoTGlicmFyeVVJUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0LCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQlQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpLCBpbmZvLnRvb2xWZXJzaW9ufSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQltZXNzYWdlID0gTkxTLmJpbmQoTGlicmFyeVVJUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0X3Vua25vd24sIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsKLQkJCQkJfQotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLgotCQkJCQkJZGlzcGxheUVycm9yKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwgbWVzc2FnZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzTWV0aG9kTGlicmFyeVVwZ3JhZGVSZXF1aXJlZChsaWJQYXRoKSkgewotCQkJCQlpZiAoIUxpYnJhcnlVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy51cGdyYWRlTGlicmFyeURpYWxvZ190ZXh0KSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmICghdXBncmFkZUxpYnJhcnkobGliUGF0aCwgbnVsbCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAob3BlbkxpYnJhcnkobGliUGF0aCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCU1zZ0RpYWxvZyBtc2dEaWFsb2cgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCUxpYnJhcnlVSVJlc291cmNlcy5pbnZhbGlkTGlicmFyeVBhdGhfbXNnLAotCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuaW52YWxpZExpYnJhcnlQYXRoX3JlYXNvbik7Ci0JCX0gd2hpbGUgKGxpYlBhdGggIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYSBNZXRob2QgTGlicmFyeSBnaXZlbiB0aGUgTGlicmFyeSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBQYXRoIHRvIGEgTWV0aG9kIExpYnJhcnkuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgTWV0aG9kIExpYnJhcnkgaXMgb3BlbmVkIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBvcGVuTGlicmFyeShmaW5hbCBTdHJpbmcgcGF0aCkgewotCQlNYXAgYXJncyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWFyZ3MucHV0KFhNSUxpYnJhcnlNYW5hZ2VyLkFSR19MSUJSQVJZX1BBVEgsIHBhdGgpOwotCQlyZXR1cm4gb3BlbkxpYnJhcnkoWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9UWVBFLCBhcmdzKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gb3BlbkxpYnJhcnkoZmluYWwgU3RyaW5nIHR5cGUsIGZpbmFsIE1hcCBhcmdzKSB7Ci0JCWZpbmFsIFN0cmluZyBwYXRoID0gKFN0cmluZykgYXJncy5nZXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCk7Ci0JCQotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0KLQkJZmluYWwgTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGZpbmFsIElTdGF0dXNbXSBzdGF0dXMgPSBuZXcgSVN0YXR1c1sxXTsKLQotCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZwotCQkvLyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3Jrc3BhY2UuCi0JCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlTdHJpbmcgdGFza05hbWUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbmluZ0xpYnJhcnlUYXNrX25hbWU7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2sodGFza05hbWUsIDIpOwotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3Iuc2V0VGFza05hbWUodGFza05hbWUpOwotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkub3Blbk1ldGhvZExpYnJhcnkodHlwZSwgYXJncyk7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZExpYnJhcnkoCi0JCQkJCQkJbGlicmFyeSk7Ci0JCQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLnNldFNhdmVkTGlicmFyeVBhdGgocGF0aCk7Ci0JCQkJCS8vIHNob3cgUHJvYmxlbXMgVmlldyBpZiBuZWNlc3NhcnkKLQkJCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9ICgoSUxpYnJhcnlSZXNvdXJjZVNldCkgTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKQotCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkJCWlmIChyZXNvdXJjZVNldC5oYXNVbnJlc29sdmVkUHJveHkoKSkgewotCQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlQbGF0Zm9ybVVJCi0JCQkJCQkJCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVBhZ2UoKQotCQkJCQkJCQkJCQkuc2hvd1ZpZXcoCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb2JsZW1WaWV3IiwgbnVsbCwgSVdvcmtiZW5jaFBhZ2UuVklFV19WSVNJQkxFKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJLy8gY291bGRuJ3Qgb3BlbiB0aGUgcHJvYmxlbSB2aWV3LCB0b28gYmFkLi4KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKCEoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uICYmIGUuZ2V0TWVzc2FnZSgpCi0JCQkJCQkJLnN0YXJ0c1dpdGgoIiMjIyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJCWVycm9ycy5hZGQoZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCkgewotCQkJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJCQkJc2hlbGwuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCQkJCX0KLQkJCX07Ci0JCQlkaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwotCQkJaWYgKGVycm9ycy5pc0VtcHR5KCkpIHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCQkJCWFjdGl2ZVBhZ2UuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJSXRlcmF0b3IgaXRlciA9IGVycm9ycy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlFeGNlcHRpb24gZSA9IChFeGNlcHRpb24pIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQkJaWYgKG1lc3NhZ2Uuc3RhcnRzV2l0aCgiIyMjIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBwcm9qZWN0RmlsZU5hbWUgPSBtZXNzYWdlLnN1YnN0cmluZygzKTsKLQotCQkJCQkJCVN0cmluZyBwcm9tcHQgPSBMaWJyYXJ5VUlSZXNvdXJjZXMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMucmVhZE9ubHlQcm9qZWN0RmlsZV90ZXh0LAotCQkJCQkJCQkJCQlwcm9qZWN0RmlsZU5hbWUpOwotCQkJCQkJCVN0cmluZ1tdIGJ1dHRvbkxhYmVscyA9IHsKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5yZXRyeUJ1dHRvbl90ZXh0LAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmNhbmNlbEJ1dHRvbl90ZXh0IH07Ci0JCQkJCQkJTWVzc2FnZURpYWxvZyBtc2dCb3ggPSBuZXcgTWVzc2FnZURpYWxvZyhEaXNwbGF5Ci0JCQkJCQkJCQkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCQludWxsLCBwcm9tcHQsIE1lc3NhZ2VEaWFsb2cuV0FSTklORywKLQkJCQkJCQkJCWJ1dHRvbkxhYmVscywgMCk7Ci0JCQkJCQkJaWYgKG1zZ0JveC5vcGVuKCkgPT0gMCkgewotCQkJCQkJCQlyZXR1cm4gb3BlbkxpYnJhcnkocGF0aCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBvcGVucyBhIG5ldyBNZXRob2QgTGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIE1ldGhvZCBMaWJyYXJ5IHBhdGguCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgTWV0aG9kIExpYnJhcnkgaXMgb3BlbmVkIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVMaWJyYXJ5KFN0cmluZyBwYXRoKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIGxpYnJhcnlQYXRoID0gbmV3IEZpbGUocGF0aCk7Ci0JCQlpZiAoIWxpYnJhcnlQYXRoLmV4aXN0cygpKSB7Ci0JCQkJbGlicmFyeVBhdGgubWtkaXJzKCk7Ci0JCQl9Ci0JCQlYTUlMaWJyYXJ5VXRpbC5jcmVhdGVNZXRob2RMaWJyYXJ5KGxpYnJhcnlQYXRoLmdldE5hbWUoKSwgcGF0aCk7Ci0JCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXRTYXZlZExpYnJhcnlQYXRoKHBhdGgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBDb25maWd1cmF0aW9uIGNvbnRyaWJ1dGlvbiB0byB0aGUgd29ya2JlbmNoIHRvb2xiYXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbigpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQlpZiAod29ya2JlbmNoICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gKElXb3JrYmVuY2hXaW5kb3cpIHdvcmtiZW5jaAotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlpZiAod2luZG93ICE9IG51bGwgJiYgd2luZG93IGluc3RhbmNlb2YgQXBwbGljYXRpb25XaW5kb3cpIHsKLQkJCQkvLyBDaGVjayB0byBzZWUgaWYgdGhlIGNvbmZpZ3VyYXRpb24gY29udHJpYnV0aW9uIGFscmVhZHkKLQkJCQkvLyBleGlzdHMuCi0JCQkJSUNvb2xCYXJNYW5hZ2VyIGNvb2xCYXIgPSAoKEFwcGxpY2F0aW9uV2luZG93KXdpbmRvdykuZ2V0Q29vbEJhck1hbmFnZXIoKTsKLQkJCQlJQ29udHJpYnV0aW9uSXRlbSBtYXJrZXIgPSBudWxsOwotCQkJCUlDb250cmlidXRpb25JdGVtIGNvb2xCYXJJdGVtID0gY29vbEJhcgotCQkJCQkJLmZpbmQoVE9PTEJBUl9DT05GSUdfQ09OVFJJQlVUSU9OX0lEKTsKLQkJCQlpZiAoY29vbEJhckl0ZW0gIT0gbnVsbCkgewotCQkJCQlpZiAoY29vbEJhckl0ZW0uaXNWaXNpYmxlKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gY29vbEJhci5nZXRJdGVtcygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoaXRlbXNbaV0gPT0gY29vbEJhckl0ZW0pIHsKLQkJCQkJCQljb29sQmFyLnJlbW92ZShUT09MQkFSX0NPTkZJR19DT05UUklCVVRJT05fSUQpOwotCQkJCQkJCWlmIChpICsgMSA8IGl0ZW1zLmxlbmd0aCkgewotCQkJCQkJCQltYXJrZXIgPSBpdGVtc1tpICsgMV07Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJSVRvb2xCYXJNYW5hZ2VyIHRvb2xiYXJNZ3IgPSBuZXcgVG9vbEJhck1hbmFnZXIoU1dULkZMQVQKLQkJCQkJCXwgU1dULkxFRlQpOwotCQkJCUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtIHRlc3RJdGVtID0gbmV3IENvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtKAotCQkJCQkJbnVsbCk7Ci0JCQkJdG9vbGJhck1nci5hZGQodGVzdEl0ZW0pOwotCQkJCVRvb2xCYXJDb250cmlidXRpb25JdGVtIGNvbnRyaWJJdGVtID0gbmV3IFRvb2xCYXJDb250cmlidXRpb25JdGVtKAotCQkJCQkJdG9vbGJhck1nciwgVE9PTEJBUl9DT05GSUdfQ09OVFJJQlVUSU9OX0lEKTsKLQkJCQlpZiAobWFya2VyICE9IG51bGwpIHsKLQkJCQkJY29vbEJhci5pbnNlcnRCZWZvcmUobWFya2VyLmdldElkKCksIGNvbnRyaWJJdGVtKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb29sQmFyLmFkZChjb250cmliSXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBncmFkZXMgYSBNZXRob2QgTGlicmFyeSB0byBhIG5ldyBtZXRhLW1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBsaWJEaXIKLQkgKiAgICAgICAgICAgIFBhdGggdG8gYSBNZXRob2QgTGlicmFyeS4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBNZXRob2QgTGlicmFyeSBpcyBzdWNlc3NmdWxseQotCSAqICAgICAgICAgdXBncmFkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHVwZ3JhZGVMaWJyYXJ5KGZpbmFsIFN0cmluZyBsaWJEaXIsIGZpbmFsIFVwZ3JhZGVDYWxsZXJJbmZvIGNhbGxlckluZm8pIHsJCQkJCQkJCQotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCWlmIChVcGdyYWRlQ2FsbGVySW5mby5pc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pKSB7Ci0JCQlMaWJyYXJ5QmFja3VwVXRpbC5wcm9tcHRCYWNrdXBMaWJyYXJ5KHNoZWxsLCBuZXcgRmlsZShsaWJEaXIpKTsKLQkJfQotCQkKLQkJZmluYWwgU3RyaW5nQnVmZmVyIGVyck1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZmluYWwgYm9vbGVhbltdIGNhbmNlbEZsYWdIb2xkZXIgPSB7IGZhbHNlIH07Ci0KLQkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbiBiZWNhdXNlIHRoaXMgaXMgYSBsb25nIHJ1bm5pbmcKLQkJLy8gYWN0aXZpdHkgdGhhdCBtb2RpZmllcyB0aGUgd29ya2JlbmNoLgotCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJU3RyaW5nIGxpYlhtaSA9IE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTElCUkFSWV9NT0RFTF9GSUxFTkFNRTsKLQkJCQlpZiAoY2FsbGVySW5mbyAhPSBudWxsICYmIGNhbGxlckluZm8uZ2V0SXNFeHBvcnRlZFBsdWdpbkxpYigpKSB7Ci0JCQkJCWxpYlhtaSA9IFhNSUxpYnJhcnlNYW5hZ2VyLmV4cG9ydEZpbGU7Ci0JCQkJfQotCQkJCW1vbml0b3IuYmVnaW5UYXNrKExpYnJhcnlVSVJlc291cmNlcy51cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lLCAxMCk7Ci0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJdHJ5IHsKLQkJCQkJTWFwcGluZ1V0aWwKLQkJCQkJCQkubWlncmF0ZSgKLQkJCQkJCQkJCWxpYkRpcgotCQkJCQkJCQkJCQkrICIvIiArIGxpYlhtaSwgbW9uaXRvciwgY2FsbGVySW5mbyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IAotCQkJCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJY2FuY2VsRmxhZ0hvbGRlclswXSA9IHRydWU7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQkJbXNnID0gTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnOwotCQkJCQl9Ci0JCQkJCWVyck1zZy5hcHBlbmQobXNnKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCS8vIFJ1biB0aGUgb3BlcmF0aW9uIGFuZCBkaXNwbGF5IHRoZSBwcm9ncmVzcy4KLQkJCVByb2dyZXNzTW9uaXRvckRpYWxvZyBwbURpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpIHsJCQkKLQkJCSAgICBwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7Ci0JCQkgICAgICAgIFBvaW50IGNhbGN1bGF0ZWRTaXplID0gc3VwZXIuZ2V0SW5pdGlhbFNpemUoKTsKLQkJCSAgICAgICAgaWYgKGNhbGN1bGF0ZWRTaXplLnggPCA2NzUpIHsKLQkJCSAgICAgICAgCWNhbGN1bGF0ZWRTaXplLnggPSA2NzU7Ci0JCQkJCX0KLQkJCSAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZWRTaXplOwotCQkJICAgIH0KLQkJCX07CQkgICAgCi0JCQlwbURpYWxvZy5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCQlpZihjYW5jZWxGbGFnSG9sZGVyWzBdKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAoZXJyTXNnLmxlbmd0aCgpID4gMCkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlLAotCQkJCQkJZXJyTXNnLnRvU3RyaW5nKCkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlLAotCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkZUxpYnJhcnlFcnJvcl9tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgTGlicmFyeSBwYXRoIHNldCB2aWEgdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gIi1saWJyYXJ5Ci0JICogPHBhdGg+Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21tYW5kTGluZUxpYnJhcnlQYXRoKCkgewotCQlyZXR1cm4gY21kTGluZUxpYlBhdGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgTGlicmFyeSBwYXRoIHZpYSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiAiLWxpYnJhcnkgPHBhdGg+Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29tbWFuZExpbmVMaWJyYXJ5UGF0aChTdHJpbmcgbGliUGF0aCkgewotCQljbWRMaW5lTGliUGF0aCA9IGxpYlBhdGg7Ci0JCUlQYXRoIHBhdGggPSBQYXRoLmZyb21PU1N0cmluZyhsaWJQYXRoKTsKLQkJaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJLy8gVE9ETzogUmV2aWV3IGltcGxlbWVudGF0aW9uLgotCQkJY21kTGluZUxpYlBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBGaWxlLnNlcGFyYXRvciArIGxpYlBhdGg7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNWYWxpZExpYnJhcnkoY21kTGluZUxpYlBhdGgsIHRydWUpICE9IFN0YXR1cy5PS19TVEFUVVMpIHsKLQkJCWNtZExpbmVMaWJQYXRoID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIExpYnJhcnkgcGF0aCB2aWEgdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gIi1kZWZhdWx0bGlicmFyeSA8cGF0aD4iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb21tYW5kTGluZURlZmF1bHRMaWJyYXJ5UGF0aChTdHJpbmcgbGliUGF0aCkgewotCQljbWRMaW5lRGVmYXVsdExpYlBhdGggPSBsaWJQYXRoOwotCQlJUGF0aCBwYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcobGliUGF0aCk7Ci0JCWlmICghcGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCS8vIFRPRE86IFJldmlldyBpbXBsZW1lbnRhdGlvbi4KLQkJCWNtZExpbmVEZWZhdWx0TGliUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSArIEZpbGUuc2VwYXJhdG9yICsgbGliUGF0aDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiY21kTGluZURlZmF1bHRMaWJQYXRoPSIgKyBjbWRMaW5lRGVmYXVsdExpYlBhdGgpOwotCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNWYWxpZExpYnJhcnkoY21kTGluZURlZmF1bHRMaWJQYXRoLCB0cnVlKSAhPSBTdGF0dXMuT0tfU1RBVFVTKSB7Ci0JCQljbWRMaW5lRGVmYXVsdExpYlBhdGggPSBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnRzIGxpYiBwYXRoIHRvIGFic29sdXRlIGxpYnJhcnkgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBsaWJQYXRoCi0JICogQHJldHVybiBSZXR1cm5zIGFic29sdXRlIGxpYnJhcnkgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvQWJzb2x1dGVMaWJyYXJ5UGF0aChTdHJpbmcgbGliUGF0aCkgewotCQlTdHJpbmcgYWJzUGF0aCA9IGxpYlBhdGg7Ci0KLQkJSVBhdGggZWNQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcobGliUGF0aCk7Ci0JCWlmICghZWNQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJLy8gVE9ETzogUmV2aWV3IGltcGxlbWVudGF0aW9uLgotCQkJYWJzUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSArIEZpbGUuc2VwYXJhdG9yICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiTWV0aG9kIExpYnJhcmllcyIgKyBGaWxlLnNlcGFyYXRvciArIGxpYlBhdGg7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBhYnNQYXRoOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXkgbGlicmFyeSBsb2NrZWQgbWVzc2FnZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpc3BsYXlMaWJyYXJ5TG9ja2VkTWVzc2FnZSgpIHsKLQkJU2hlbGwgc2hlbGwgPSBudWxsOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzaGVsbCA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpCi0JCQkJCS5nZXRBY3RpdmVTaGVsbCgpOwotCQkJaW1hZ2UgPSBzaGVsbC5nZXRJbWFnZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCU1lc3NhZ2VEaWFsb2cgbXNnRGxnID0gbmV3IE1lc3NhZ2VEaWFsb2coc2hlbGwsCi0JCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLCBpbWFnZSwKLQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMubGlicmFyeUxvY2tlZF9tc2csIE1lc3NhZ2VEaWFsb2cuRVJST1IsCi0JCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5saWJyYXJ5TG9ja2VkX29wZW5CdXR0b25fdGV4dCwKLQkJCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sCi0JCQkJMSk7Ci0KLQkJcmV0dXJuIG1zZ0RsZy5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhcHBsaWNhdGlvbiBuYW1lCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXBwTmFtZSgpIHsKLQkJcmV0dXJuIGFwcE5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFwcGxpY2F0aW9uIG5hbWUKLQkgKiBAcGFyYW0gYXBwTmFtZQotCSAqIAkJCUFwcGxpY2F0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXBwTmFtZShTdHJpbmcgYXBwTmFtZSkgewotCQlMaWJyYXJ5VUlNYW5hZ2VyLmFwcE5hbWUgPSBhcHBOYW1lOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOGNjYmU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IFVJIHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIExpYnJhcnlVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5VUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVJlc291cmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlYzJmZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IFVJIFJlc291cmNlcwotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlVSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBhYmlsaXR5UGF0dGVybl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0l0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBvc2l0ZVJvbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRlbnRQYWNrYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJ5UHJvY2Vzc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW5nTWV0cmljX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRhbmNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGl0ZXJhdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kQ29udGVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kTGlicmFyeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGFja2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaWxlc3RvbmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBoYXNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0ZhbWlseV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc1BhY2thZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV1c2FibGVBc3NldF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9hZG1hcF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURlc2NyaXB0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhbmRhcmRDYXRlZ29yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RlcF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrRGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVhbVByb2ZpbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtRGVmaW5pdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbE1lbnRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBhYmlsaXR5UGF0dGVybl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrSXRlbV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBvc2l0ZVJvbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udGVudFBhY2thZ2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lR3JvdXBpbmdfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0ZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGFuY2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpdGVyYXRpb25fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kQ29udGVudF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZExpYnJhcnlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQYWNrYWdlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlsZXN0b25lX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBoYXNlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzUGFja2FnZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldXNhYmxlQXNzZXRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YW5kYXJkQ2F0ZWdvcnlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGVwX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ01hdGVyaWFsX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tEZXNjcmlwdG9yX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1EZWZpbml0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xNZW50b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEVsZW1lbnRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBsaWNhdGlvbl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGl0bGVfMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhdGhMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cmlMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5VHlwZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlicmFyeURpYWxvZ19uZXdMaWJyYXJ5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlicmFyeUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uNDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfYWR2aWNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZExpYnJhcnlQYXRoX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5TG9ja2VkX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlMb2NrZWRfb3BlbkJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZE9ubHlQcm9qZWN0RmlsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV0cnlCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbmNlbEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRlTGlicmFyeURpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkaW5nTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3dpdGNoQ29uZmlnRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXJyZW50Q29uZmlnTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVGaWxlc0Vycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVBhdGhFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkUGF0aF9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYWNrdXBMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja3VwTGlicmFyeURpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja2luZ1VwTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhdGhTZWxlY3Rpb25FcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBva0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2tpcEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWx3YXlzQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXZlckJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaW5rVG9VUkxfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpbmtUb0ZpbGVfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRMaW5rX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50TGlua1dpdGhUeXBlX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEFjdGl2aXR5RGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0X3Vua25vd247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzZXNMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJpZWZEZXNjcmlwdGlvbkxhYmVsX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlbGV0ZURpYWxvZ19tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlbGV0ZURpYWxvZ19tc2dXaXRoUmVmZXJlbmNlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBMaWJyYXJ5VUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIGEgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBBbiBvYmplY3QuCi0JICogQHJldHVybiBBIGZvcm1hdHRlZCBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgbmV3IE9iamVjdFtdIHsgZGF0YSB9KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3NjMwMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNoZWNrbGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25jZXB0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkV4YW1wbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkZWxpbmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JdGVyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NaWxlc3RvbmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5PdXRjb21lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGhhc2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NGYW1pbHlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlcG9ydEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2FkbWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlbXBsYXRlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbE1lbnRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGw7Ci0KLS8qKgotICogRGVmaW5lcyBhbmQgY2FjaGVzIHRoZSBjb21tb25seSByZWZlcmVuY2VkIHRleHQgaW4gdGhlIExpYnJhcnkgVUkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVVJVGV4dCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0FDVElWSVRZID0gTGlicmFyeVVJUmVzb3VyY2VzLmFjdGl2aXR5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0FSVElGQUNUID0gTGlicmFyeVVJUmVzb3VyY2VzLmFydGlmYWN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NBUEFCSUxJVFlfUEFUVEVSTiA9IExpYnJhcnlVSVJlc291cmNlcy5jYXBhYmlsaXR5UGF0dGVybl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DSEVDS0xJU1QgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2hlY2tsaXN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NIRUNLX0lURU0gPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2hlY2tJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NPTVBPU0lURV9ST0xFID0gTGlicmFyeVVJUmVzb3VyY2VzLmNvbXBvc2l0ZVJvbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09OQ0VQVCA9IExpYnJhcnlVSVJlc291cmNlcy5jb25jZXB0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NPTlRFTlRfUEFDS0FHRSA9IExpYnJhcnlVSVJlc291cmNlcy5jb250ZW50UGFja2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DVVNUT01fQ0FURUdPUlkgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY3VzdG9tQ2F0ZWdvcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVMSVZFUkFCTEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVMSVZFUllfUFJPQ0VTUyA9IExpYnJhcnlVSVJlc291cmNlcy5kZWxpdmVyeVByb2Nlc3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVTQ1JJUFRPUiA9IExpYnJhcnlVSVJlc291cmNlcy5kZXNjcmlwdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RJU0NJUExJTkUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGlzY2lwbGluZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ESVNDSVBMSU5FX0dST1VQSU5HID0gTGlicmFyeVVJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ET01BSU4gPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZG9tYWluX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VTVElNQVRFID0gTGlicmFyeVVJUmVzb3VyY2VzLmV4YW1wbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRVNUSU1BVElOR19NRVRSSUMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXN0aW1hdGluZ01ldHJpY190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gTGlicmFyeVVJUmVzb3VyY2VzLmVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FWEFNUExFID0gTGlicmFyeVVJUmVzb3VyY2VzLmV4YW1wbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfR1VJREFOQ0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZ3VpZGFuY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfR1VJREVMSU5FID0gTGlicmFyeVVJUmVzb3VyY2VzLmd1aWRlbGluZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9JVEVSQVRJT04gPSBMaWJyYXJ5VUlSZXNvdXJjZXMuaXRlcmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9DT05GSUdVUkFUT04gPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NRVRIT0RfQ09OVEVOVCA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RDb250ZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9MSUJBUkFSWSA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RMaWJyYXJ5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9QQUNLQUdFID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZFBhY2thZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX1BMVUdJTiA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RQbHVnaW5fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUlMRVNUT05FID0gTGlicmFyeVVJUmVzb3VyY2VzLm1pbGVzdG9uZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9PVVRDT01FID0gTGlicmFyeVVJUmVzb3VyY2VzLm91dGNvbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUEhBU0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucGhhc2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJBQ1RJQ0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJhY3RpY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJPQ0VTUyA9IExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BST0NFU1NfQ09OVFJJQlVUSU9OID0gTGlicmFyeVVJUmVzb3VyY2VzLnByb2Nlc3NDb250cmlidXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJPQ0VTU19GQU1JTFkgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc0ZhbWlseV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTX1BBQ0tBR0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc1BhY2thZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUkVQT1JUID0gTGlicmFyeVVJUmVzb3VyY2VzLnJlcG9ydF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9SRVVTQUJMRV9BU1NFVCA9IExpYnJhcnlVSVJlc291cmNlcy5yZXVzYWJsZUFzc2V0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JPQURNQVAgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9hZG1hcF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ST0xFID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9ERVNDUklQVE9SID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVEZXNjcmlwdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JPTEVfU0VUID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVTZXRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9TRVRfR1JPVVBJTkcgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NUQU5EQVJEX0NBVEVHT1JZID0gTGlicmFyeVVJUmVzb3VyY2VzLnN0YW5kYXJkQ2F0ZWdvcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfU1RFUCA9IExpYnJhcnlVSVJlc291cmNlcy5zdGVwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RBU0sgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGFza190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9UQVNLX0RFU0NSSVBUT1IgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGFza0Rlc2NyaXB0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEVBTV9QUk9GSUxFID0gTGlicmFyeVVJUmVzb3VyY2VzLnRlYW1Qcm9maWxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RFTVBMQVRFID0gTGlicmFyeVVJUmVzb3VyY2VzLnRlbXBsYXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RFUk1fREVGSU5JVElPTiA9IExpYnJhcnlVSVJlc291cmNlcy50ZXJtRGVmaW5pdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9UT09MID0gTGlicmFyeVVJUmVzb3VyY2VzLnRvb2xfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVE9PTF9NRU5UT1IgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudG9vbE1lbnRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9XSElURVBBUEVSID0gTGlicmFyeVVJUmVzb3VyY2VzLndoaXRlcGFwZXJfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUID0gTGlicmFyeVVJUmVzb3VyY2VzLndvcmtQcm9kdWN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SID0gTGlicmFyeVVJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9XT1JLX1BST0RVQ1RfRUxFTUVOVCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdEVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUX1RZUEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMud29ya1Byb2R1Y3RUeXBlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0FDVElWSVRZX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5hY3Rpdml0eV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQVJUSUZBQ1RfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmFydGlmYWN0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DQVBBQklMSVRZX1BBVFRFUk5fUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DSEVDS0xJU1RfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmNoZWNrbGlzdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ0hFQ0tfSVRFTV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2hlY2tJdGVtX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DT01QT1NJVEVfUk9MRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY29tcG9zaXRlUm9sZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09OQ0VQVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY29uY2VwdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09OVEVOVF9QQUNLQUdFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5jb250ZW50UGFja2FnZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ1VTVE9NX0NBVEVHT1JZX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5jdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVMSVZFUkFCTEVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ERUxJVkVSWV9QUk9DRVNTX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5kZWxpdmVyeVByb2Nlc3NfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RFU0NSSVBUT1JfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RJU0NJUExJTkVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRpc2NpcGxpbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RJU0NJUExJTkVfR1JPVVBJTkdfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRE9NQUlOX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5kb21haW5fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VTVElNQVRFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5leGFtcGxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FU1RJTUFUSU5HX01FVFJJQ19QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXN0aW1hdGluZ01ldHJpY190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FWEFNUExFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5leGFtcGxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9HVUlEQU5DRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZ3VpZGFuY2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0dVSURFTElORV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZ3VpZGVsaW5lX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9JVEVSQVRJT05fUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLml0ZXJhdGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX0NPTkZJR1VSQVRPTl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX0NPTlRFTlRfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZENvbnRlbnRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9MSUJBUkFSWV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kTGlicmFyeV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX1BBQ0tBR0VfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZFBhY2thZ2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9QTFVHSU5fUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZFBsdWdpbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUlMRVNUT05FX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5taWxlc3RvbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX09VVENPTUVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm91dGNvbWVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BIQVNFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5waGFzZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJBQ1RJQ0VfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnByYWN0aWNlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTX0NPTlRSSUJVVElPTl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJPQ0VTU19GQU1JTFlfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BST0NFU1NfUEFDS0FHRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc1BhY2thZ2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JFUE9SVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucmVwb3J0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9SRVVTQUJMRV9BU1NFVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9BRE1BUF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9hZG1hcF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9sZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9ERVNDUklQVE9SX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5yb2xlRGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9TRVRfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVTZXRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JPTEVfU0VUX0dST1VQSU5HX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5yb2xlU2V0R3JvdXBpbmdfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NUQU5EQVJEX0NBVEVHT1JZX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5zdGFuZGFyZENhdGVnb3J5X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9TVEVQX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5zdGVwX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9TVVBQT1JUSU5HX01BVEVSSUFMX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RBU0tfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnRhc2tfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RBU0tfREVTQ1JJUFRPUl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGFza0Rlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RFQU1fUFJPRklMRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RFTVBMQVRFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy50ZW1wbGF0ZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEVSTV9ERUZJTklUSU9OX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy50ZXJtRGVmaW5pdGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVE9PTF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudG9vbF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVE9PTF9NRU5UT1JfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnRvb2xNZW50b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dISVRFUEFQRVJfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLndoaXRlcGFwZXJfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMud29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9FTEVNRU5UX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdEVsZW1lbnRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9UWVBFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgRUxFTUVOVF9URVhUID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBFTEVNRU5UX1RFWFRfUExVUkFMID0gbmV3IEhhc2hNYXAoKTsKLQotCXN0YXRpYyB7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQWN0aXZpdHlJbXBsLmNsYXNzLCBURVhUX0FDVElWSVRZKTsKLQkJRUxFTUVOVF9URVhULnB1dChBcnRpZmFjdEltcGwuY2xhc3MsIFRFWFRfQVJUSUZBQ1QpOwotCQlFTEVNRU5UX1RFWFQucHV0KENhcGFiaWxpdHlQYXR0ZXJuSW1wbC5jbGFzcywgVEVYVF9DQVBBQklMSVRZX1BBVFRFUk4pOwotCQlFTEVNRU5UX1RFWFQucHV0KENoZWNrbGlzdEltcGwuY2xhc3MsIFRFWFRfQ0hFQ0tMSVNUKTsKLQkJRUxFTUVOVF9URVhULnB1dChDb21wb3NpdGVSb2xlSW1wbC5jbGFzcywgVEVYVF9DT01QT1NJVEVfUk9MRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQ29uY2VwdEltcGwuY2xhc3MsIFRFWFRfQ09OQ0VQVCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQ29udGVudFBhY2thZ2VJbXBsLmNsYXNzLCBURVhUX0NPTlRFTlRfUEFDS0FHRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQ3VzdG9tQ2F0ZWdvcnlJbXBsLmNsYXNzLCBURVhUX0NVU1RPTV9DQVRFR09SWSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoRGVsaXZlcmFibGVJbXBsLmNsYXNzLCBURVhUX0RFTElWRVJBQkxFKTsKLQkJRUxFTUVOVF9URVhULnB1dChEZWxpdmVyeVByb2Nlc3NJbXBsLmNsYXNzLCBURVhUX0RFTElWRVJZX1BST0NFU1MpOwotCQlFTEVNRU5UX1RFWFQucHV0KERpc2NpcGxpbmVJbXBsLmNsYXNzLCBURVhUX0RJU0NJUExJTkUpOwotCQlFTEVNRU5UX1RFWFQKLQkJCQkucHV0KERpc2NpcGxpbmVHcm91cGluZ0ltcGwuY2xhc3MsIFRFWFRfRElTQ0lQTElORV9HUk9VUElORyk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoRG9tYWluSW1wbC5jbGFzcywgVEVYVF9ET01BSU4pOwotCQlFTEVNRU5UX1RFWFQucHV0KEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuY2xhc3MsCi0JCQkJVEVYVF9FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJRUxFTUVOVF9URVhULnB1dChFeGFtcGxlSW1wbC5jbGFzcywgVEVYVF9FWEFNUExFKTsKLQkJRUxFTUVOVF9URVhULnB1dChHdWlkZWxpbmVJbXBsLmNsYXNzLCBURVhUX0dVSURFTElORSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoSXRlcmF0aW9uSW1wbC5jbGFzcywgVEVYVF9JVEVSQVRJT04pOwotCQlFTEVNRU5UX1RFWFQucHV0KE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmNsYXNzLAotCQkJCVRFWFRfTUVUSE9EX0NPTkZJR1VSQVRPTik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoTWV0aG9kTGlicmFyeUltcGwuY2xhc3MsIFRFWFRfTUVUSE9EX0xJQkFSQVJZKTsKLQkJRUxFTUVOVF9URVhULnB1dChNZXRob2RQYWNrYWdlSW1wbC5jbGFzcywgVEVYVF9NRVRIT0RfUEFDS0FHRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoTWV0aG9kUGx1Z2luSW1wbC5jbGFzcywgVEVYVF9NRVRIT0RfUExVR0lOKTsKLQkJRUxFTUVOVF9URVhULnB1dChNaWxlc3RvbmVJbXBsLmNsYXNzLCBURVhUX01JTEVTVE9ORSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoT3V0Y29tZUltcGwuY2xhc3MsIFRFWFRfT1VUQ09NRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUGhhc2VJbXBsLmNsYXNzLCBURVhUX1BIQVNFKTsKLQkJRUxFTUVOVF9URVhULnB1dChQcmFjdGljZUltcGwuY2xhc3MsIFRFWFRfUFJBQ1RJQ0UpOwotCQlFTEVNRU5UX1RFWFQucHV0KFByb2Nlc3NGYW1pbHlJbXBsLmNsYXNzLCBURVhUX1BST0NFU1NfRkFNSUxZKTsKLQkJRUxFTUVOVF9URVhULnB1dChQcm9jZXNzUGFja2FnZUltcGwuY2xhc3MsIFRFWFRfUFJPQ0VTU19QQUNLQUdFKTsKLQkJRUxFTUVOVF9URVhULnB1dChSZXBvcnRJbXBsLmNsYXNzLCBURVhUX1JFUE9SVCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUmV1c2FibGVBc3NldEltcGwuY2xhc3MsIFRFWFRfUkVVU0FCTEVfQVNTRVQpOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvYWRtYXBJbXBsLmNsYXNzLCBURVhUX1JPQURNQVApOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvbGVJbXBsLmNsYXNzLCBURVhUX1JPTEUpOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvbGVEZXNjcmlwdG9ySW1wbC5jbGFzcywgVEVYVF9ST0xFX0RFU0NSSVBUT1IpOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvbGVTZXRJbXBsLmNsYXNzLCBURVhUX1JPTEVfU0VUKTsKLQkJRUxFTUVOVF9URVhULnB1dChSb2xlU2V0R3JvdXBpbmdJbXBsLmNsYXNzLCBURVhUX1JPTEVfU0VUX0dST1VQSU5HKTsKLQkJRUxFTUVOVF9URVhULnB1dChTdGVwSW1wbC5jbGFzcywgVEVYVF9TVEVQKTsKLQkJRUxFTUVOVF9URVhUCi0JCQkJLnB1dChTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmNsYXNzLCBURVhUX1NVUFBPUlRJTkdfTUFURVJJQUwpOwotCQlFTEVNRU5UX1RFWFQucHV0KFRhc2tJbXBsLmNsYXNzLCBURVhUX1RBU0spOwotCQlFTEVNRU5UX1RFWFQucHV0KFRhc2tEZXNjcmlwdG9ySW1wbC5jbGFzcywgVEVYVF9UQVNLX0RFU0NSSVBUT1IpOwotCQlFTEVNRU5UX1RFWFQucHV0KFRlYW1Qcm9maWxlSW1wbC5jbGFzcywgVEVYVF9URUFNX1BST0ZJTEUpOwotCQlFTEVNRU5UX1RFWFQucHV0KFRlbXBsYXRlSW1wbC5jbGFzcywgVEVYVF9URU1QTEFURSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoVGVybURlZmluaXRpb25JbXBsLmNsYXNzLCBURVhUX1RFUk1fREVGSU5JVElPTik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoVGVtcGxhdGVJbXBsLmNsYXNzLCBURVhUX1RFTVBMQVRFKTsKLQkJRUxFTUVOVF9URVhULnB1dChUb29sSW1wbC5jbGFzcywgVEVYVF9UT09MKTsKLQkJRUxFTUVOVF9URVhULnB1dChUb29sTWVudG9ySW1wbC5jbGFzcywgVEVYVF9UT09MX01FTlRPUik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoV2hpdGVwYXBlckltcGwuY2xhc3MsIFRFWFRfV0hJVEVQQVBFUik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoV29ya1Byb2R1Y3RJbXBsLmNsYXNzLCBURVhUX1dPUktfUFJPRFVDVCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5jbGFzcywKLQkJCQlURVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SKTsKLQkJRUxFTUVOVF9URVhULnB1dChXb3JrUHJvZHVjdFR5cGVJbXBsLmNsYXNzLCBURVhUX1dPUktfUFJPRFVDVF9UWVBFKTsKLQotCQkvLyBwbHVyYWwKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoQWN0aXZpdHlJbXBsLmNsYXNzLCBURVhUX0FDVElWSVRZX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KEFydGlmYWN0SW1wbC5jbGFzcywgVEVYVF9BUlRJRkFDVF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChDYXBhYmlsaXR5UGF0dGVybkltcGwuY2xhc3MsCi0JCQkJVEVYVF9DQVBBQklMSVRZX1BBVFRFUk5fUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoQ2hlY2tsaXN0SW1wbC5jbGFzcywgVEVYVF9DSEVDS0xJU1RfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoQ29tcG9zaXRlUm9sZUltcGwuY2xhc3MsCi0JCQkJVEVYVF9DT01QT1NJVEVfUk9MRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChDb25jZXB0SW1wbC5jbGFzcywgVEVYVF9DT05DRVBUX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KENvbnRlbnRQYWNrYWdlSW1wbC5jbGFzcywKLQkJCQlURVhUX0NPTlRFTlRfUEFDS0FHRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChDdXN0b21DYXRlZ29yeUltcGwuY2xhc3MsCi0JCQkJVEVYVF9DVVNUT01fQ0FURUdPUllfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRGVsaXZlcmFibGVJbXBsLmNsYXNzLCBURVhUX0RFTElWRVJBQkxFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KERlbGl2ZXJ5UHJvY2Vzc0ltcGwuY2xhc3MsCi0JCQkJVEVYVF9ERUxJVkVSWV9QUk9DRVNTX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KERpc2NpcGxpbmVJbXBsLmNsYXNzLCBURVhUX0RJU0NJUExJTkVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRGlzY2lwbGluZUdyb3VwaW5nSW1wbC5jbGFzcywKLQkJCQlURVhUX0RJU0NJUExJTkVfR1JPVVBJTkdfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRG9tYWluSW1wbC5jbGFzcywgVEVYVF9ET01BSU5fUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbC5jbGFzcywKLQkJCQlURVhUX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlNfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRXhhbXBsZUltcGwuY2xhc3MsIFRFWFRfRVhBTVBMRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChHdWlkZWxpbmVJbXBsLmNsYXNzLCBURVhUX0dVSURFTElORV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChJdGVyYXRpb25JbXBsLmNsYXNzLCBURVhUX0lURVJBVElPTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChNZXRob2RDb25maWd1cmF0aW9uSW1wbC5jbGFzcywKLQkJCQlURVhUX01FVEhPRF9DT05GSUdVUkFUT05fUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoTWV0aG9kTGlicmFyeUltcGwuY2xhc3MsCi0JCQkJVEVYVF9NRVRIT0RfTElCQVJBUllfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoTWV0aG9kUGFja2FnZUltcGwuY2xhc3MsCi0JCQkJVEVYVF9NRVRIT0RfUEFDS0FHRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChNZXRob2RQbHVnaW5JbXBsLmNsYXNzLAotCQkJCVRFWFRfTUVUSE9EX1BMVUdJTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChNaWxlc3RvbmVJbXBsLmNsYXNzLCBURVhUX01JTEVTVE9ORV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChPdXRjb21lSW1wbC5jbGFzcywgVEVYVF9PVVRDT01FX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFBoYXNlSW1wbC5jbGFzcywgVEVYVF9QSEFTRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChQcmFjdGljZUltcGwuY2xhc3MsIFRFWFRfUFJBQ1RJQ0VfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUHJvY2Vzc0ZhbWlseUltcGwuY2xhc3MsCi0JCQkJVEVYVF9QUk9DRVNTX0ZBTUlMWV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChQcm9jZXNzUGFja2FnZUltcGwuY2xhc3MsCi0JCQkJVEVYVF9QUk9DRVNTX1BBQ0tBR0VfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUmVwb3J0SW1wbC5jbGFzcywgVEVYVF9SRVBPUlRfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUmV1c2FibGVBc3NldEltcGwuY2xhc3MsCi0JCQkJVEVYVF9SRVVTQUJMRV9BU1NFVF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChSb2FkbWFwSW1wbC5jbGFzcywgVEVYVF9ST0FETUFQX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFJvbGVJbXBsLmNsYXNzLCBURVhUX1JPTEVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUm9sZURlc2NyaXB0b3JJbXBsLmNsYXNzLAotCQkJCVRFWFRfUk9MRV9ERVNDUklQVE9SX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFJvbGVTZXRJbXBsLmNsYXNzLCBURVhUX1JPTEVfU0VUX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFJvbGVTZXRHcm91cGluZ0ltcGwuY2xhc3MsCi0JCQkJVEVYVF9ST0xFX1NFVF9HUk9VUElOR19QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChTdGVwSW1wbC5jbGFzcywgVEVYVF9TVEVQX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFN1cHBvcnRpbmdNYXRlcmlhbEltcGwuY2xhc3MsCi0JCQkJVEVYVF9TVVBQT1JUSU5HX01BVEVSSUFMX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFRhc2tJbXBsLmNsYXNzLCBURVhUX1RBU0tfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoVGFza0Rlc2NyaXB0b3JJbXBsLmNsYXNzLAotCQkJCVRFWFRfVEFTS19ERVNDUklQVE9SX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwKLQkJCQkucHV0KFRlYW1Qcm9maWxlSW1wbC5jbGFzcywgVEVYVF9URUFNX1BST0ZJTEVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoVGVtcGxhdGVJbXBsLmNsYXNzLCBURVhUX1RFTVBMQVRFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFRlcm1EZWZpbml0aW9uSW1wbC5jbGFzcywKLQkJCQlURVhUX1RFUk1fREVGSU5JVElPTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChUZW1wbGF0ZUltcGwuY2xhc3MsIFRFWFRfVEVNUExBVEVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoVG9vbEltcGwuY2xhc3MsIFRFWFRfVE9PTF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChUb29sTWVudG9ySW1wbC5jbGFzcywgVEVYVF9UT09MX01FTlRPUl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChXaGl0ZXBhcGVySW1wbC5jbGFzcywgVEVYVF9XSElURVBBUEVSX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwKLQkJCQkucHV0KFdvcmtQcm9kdWN0SW1wbC5jbGFzcywgVEVYVF9XT1JLX1BST0RVQ1RfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5jbGFzcywKLQkJCQlURVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFdvcmtQcm9kdWN0VHlwZUltcGwuY2xhc3MsCi0JCQkJVEVYVF9XT1JLX1BST0RVQ1RfVFlQRV9QTFVSQUwpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXNlciBmcmllbmRseSB0ZXh0IGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVJVGV4dChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldFVJVGV4dChlbGVtZW50LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXNlciBmcmllbmRseSB0ZXh0IGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBwbHVyYWwKLQkgKiAgICAgICAgICAgIHRydWUgdG8gcmV0dXJuIHRoZSBwbHVyYWwgZm9ybQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVJVGV4dChNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gcGx1cmFsKSB7Ci0JCWlmIChwbHVyYWwpIHsKLQkJCVN0cmluZyBsYWJlbCA9IChTdHJpbmcpIEVMRU1FTlRfVEVYVF9QTFVSQUwuZ2V0KGVsZW1lbnQuZ2V0Q2xhc3MoKSk7Ci0JCQlyZXR1cm4gKGxhYmVsID09IG51bGwpID8gZWxlbWVudC5nZXROYW1lKCkgOiBsYWJlbDsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBsYWJlbCA9IChTdHJpbmcpIEVMRU1FTlRfVEVYVC5nZXQoZWxlbWVudC5nZXRDbGFzcygpKTsKLQkJCXJldHVybiAobGFiZWwgPT0gbnVsbCkgPyBlbGVtZW50LmdldE5hbWUoKSA6IGxhYmVsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXNlciBmcmllbmRseSB0ZXh0IGZvciBhIE1ldGhvZCBlbGVtZW50IGluIGxvd2VyIGNhc2UgKGV4Y2VwdAotCSAqIGZvciBHZXJtYW4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVJVGV4dExvd2VyKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0VUlUZXh0TG93ZXIoZWxlbWVudCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVzZXIgZnJpZW5kbHkgdGV4dCBmb3IgYSBNZXRob2QgZWxlbWVudCBpbiBsb3dlciBjYXNlIChleGNlcHQKLQkgKiBmb3IgR2VybWFuKS4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1cmFsCi0JICogICAgICAgICAgICB0cnVlIHRvIHJldHVybiB0aGUgcGx1cmFsIGZvcm0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVSVRleHRMb3dlcihNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gcGx1cmFsKSB7Ci0JCVN0cmluZyBsYWJlbDsKLQkJaWYgKHBsdXJhbCkgewotCQkJbGFiZWwgPSAoU3RyaW5nKSBFTEVNRU5UX1RFWFRfUExVUkFMLmdldChlbGVtZW50LmdldENsYXNzKCkpOwotCQkJbGFiZWwgPSAobGFiZWwgPT0gbnVsbCkgPyBlbGVtZW50LmdldE5hbWUoKSA6IGxhYmVsOwotCQl9IGVsc2UgewotCQkJbGFiZWwgPSAoU3RyaW5nKSBFTEVNRU5UX1RFWFQuZ2V0KGVsZW1lbnQuZ2V0Q2xhc3MoKSk7Ci0JCQlsYWJlbCA9IChsYWJlbCA9PSBudWxsKSA/IGVsZW1lbnQuZ2V0TmFtZSgpIDogbGFiZWw7Ci0JCX0KLQotCQlyZXR1cm4gU3RyVXRpbC50b0xvd2VyKGxhYmVsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJhMTQ3ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEhlbHBlciB1dGlsaXRpZXMgZm9yIGltcGxlbWVudGluZyBtZXRob2QgbGlicmFyeSBVSS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VUlVdGlsIHsKLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGFwcGxpY2F0aW9uIHNoZWxsIHRpdGxlIHRvIGRpc3BsYXkgdGhlIGFwcGxpY2F0aW9uIG5hbWUgYW5kCi0JICogdGhlIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlU2hlbGxUaXRsZSgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCVNoZWxsIHNoZWxsID0gd2luZG93LmdldFNoZWxsKCk7Ci0JCQlpZiAoc2hlbGwgIT0gbnVsbCkgewotCQkJCVN0cmluZyBsaWJQYXRoID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpOyAKLQkJCQlpZihsaWJQYXRoID09IG51bGwpIHsKLQkJCQkJbGliUGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJCVN0cmluZyBhcHBOYW1lID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgYXBwVGl0bGUgPSBOTFMuYmluZChMaWJyYXJ5VUlSZXNvdXJjZXMuYXBwbGljYXRpb25fdGl0bGUsCi0JCQkJCQluZXcgT2JqZWN0W10geyBhcHBOYW1lLCBsaWJQYXRoIH0pOwotCQkJCXNoZWxsLnNldFRleHQoYXBwVGl0bGUpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NGM1OTA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFNpbmd1bGFyKQotYWN0aXZpdHlfdGV4dD1BY3Rpdml0eQotYXJ0aWZhY3RfdGV4dD1BcnRpZmFjdAotY2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1DYXBhYmlsaXR5IFBhdHRlcm4KLWNoZWNrbGlzdF90ZXh0PUNoZWNrbGlzdAotY2hlY2tJdGVtX3RleHQ9Q2hlY2sgSXRlbQotY29tcG9zaXRlUm9sZV90ZXh0PUNvbXBvc2l0ZSBSb2xlCi1jb25jZXB0X3RleHQ9Q29uY2VwdAotY29udGVudFBhY2thZ2VfdGV4dD1Db250ZW50IFBhY2thZ2UKLWN1c3RvbUNhdGVnb3J5X3RleHQ9Q3VzdG9tIENhdGVnb3J5Ci1kZWxpdmVyYWJsZV90ZXh0PURlbGl2ZXJhYmxlCi1kZWxpdmVyeVByb2Nlc3NfdGV4dD1EZWxpdmVyeSBQcm9jZXNzCi1kZXNjcmlwdG9yX3RleHQ9RGVzY3JpcHRvcgotZGlzY2lwbGluZV90ZXh0PURpc2NpcGxpbmUKLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0PURpc2NpcGxpbmUgR3JvdXBpbmcKLWRvbWFpbl90ZXh0PURvbWFpbgotZXN0aW1hdGVfdGV4dD1Fc3RpbWF0ZQotZXN0aW1hdGluZ01ldHJpY190ZXh0PUVzdGltYXRpbmcgTWV0cmljCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dD1Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1leGFtcGxlX3RleHQ9RXhhbXBsZQotZ3VpZGFuY2VfdGV4dD1HdWlkYW5jZQotZ3VpZGVsaW5lX3RleHQ9R3VpZGVsaW5lCi1pdGVyYXRpb25fdGV4dD1JdGVyYXRpb24KLW1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dD1NZXRob2QgQ29uZmlndXJhdGlvbgotbWV0aG9kQ29udGVudF90ZXh0PU1ldGhvZCBDb250ZW50Ci1tZXRob2RMaWJyYXJ5X3RleHQ9TWV0aG9kIExpYnJhcnkKLW1ldGhvZFBhY2thZ2VfdGV4dD1NZXRob2QgUGFja2FnZQotbWV0aG9kUGx1Z2luX3RleHQ9TWV0aG9kIFBsdWctaW4KLW1pbGVzdG9uZV90ZXh0PU1pbGVzdG9uZQotb3V0Y29tZV90ZXh0PU91dGNvbWUKLXBoYXNlX3RleHQ9UGhhc2UKLXByYWN0aWNlX3RleHQ9UHJhY3RpY2UKLXByb2Nlc3NfdGV4dD1Qcm9jZXNzCi1wcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9RGlmZmVyZW50aWFsIFByb2Nlc3MKLXByb2Nlc3NGYW1pbHlfdGV4dD1Qcm9jZXNzIEZhbWlseQotcHJvY2Vzc1BhY2thZ2VfdGV4dD1Qcm9jZXNzIFBhY2thZ2UKLXJlcG9ydF90ZXh0PVJlcG9ydAotcmV1c2FibGVBc3NldF90ZXh0PVJldXNhYmxlIEFzc2V0Ci1yb2FkbWFwX3RleHQ9Um9hZG1hcAotcm9sZURlc2NyaXB0b3JfdGV4dD1Sb2xlIERlc2NyaXB0b3IKLXJvbGVfdGV4dD1Sb2xlCi1yb2xlU2V0X3RleHQ9Um9sZSBTZXQKLXJvbGVTZXRHcm91cGluZ190ZXh0PVJvbGUgU2V0IEdyb3VwaW5nCi1zdGFuZGFyZENhdGVnb3J5X3RleHQ9U3RhbmRhcmQgQ2F0ZWdvcnkKLXN0ZXBfdGV4dD1TdGVwCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dD1TdXBwb3J0aW5nIE1hdGVyaWFsCi10YXNrX3RleHQ9VGFzawotdGFza0Rlc2NyaXB0b3JfdGV4dD1UYXNrIERlc2NyaXB0b3IKLXRlYW1Qcm9maWxlX3RleHQ9VGVhbSBQcm9maWxlCi10ZW1wbGF0ZV90ZXh0PVRlbXBsYXRlCi10ZXJtRGVmaW5pdGlvbl90ZXh0PVRlcm0gRGVmaW5pdGlvbgotdG9vbF90ZXh0PVRvb2wKLXRvb2xNZW50b3JfdGV4dD1Ub29sIE1lbnRvcgotd2hpdGVwYXBlcl90ZXh0PVdoaXRlcGFwZXIKLXdvcmtQcm9kdWN0X3RleHQ9V29yayBQcm9kdWN0Ci13b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dD1Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcgotd29ya1Byb2R1Y3RFbGVtZW50X3RleHQ9V29yayBQcm9kdWN0IEVsZW1lbnQKLXdvcmtQcm9kdWN0VHlwZV90ZXh0PVdvcmsgUHJvZHVjdCBLaW5kCi0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFBsdXJhbCkKLWFjdGl2aXR5X3RleHRfcGx1cmFsPUFjdGl2aXRpZXMKLWFydGlmYWN0X3RleHRfcGx1cmFsPUFydGlmYWN0cwotY2FwYWJpbGl0eVBhdHRlcm5fdGV4dF9wbHVyYWw9Q2FwYWJpbGl0eSBQYXR0ZXJucwotY2hlY2tsaXN0X3RleHRfcGx1cmFsPUNoZWNrbGlzdHMKLWNoZWNrSXRlbV90ZXh0X3BsdXJhbD1DaGVjayBJdGVtcwotY29tcG9zaXRlUm9sZV90ZXh0X3BsdXJhbD1Db21wb3NpdGUgUm9sZXMKLWNvbmNlcHRfdGV4dF9wbHVyYWw9Q29uY2VwdHMKLWNvbnRlbnRQYWNrYWdlX3RleHRfcGx1cmFsPUNvbnRlbnQgUGFja2FnZXMKLWN1c3RvbUNhdGVnb3J5X3RleHRfcGx1cmFsPUN1c3RvbSBDYXRlZ29yaWVzCi1kZWxpdmVyYWJsZV90ZXh0X3BsdXJhbD1EZWxpdmVyYWJsZXMKLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0X3BsdXJhbD1EZWxpdmVyeSBQcm9jZXNzZXMKLWRlc2NyaXB0b3JfdGV4dF9wbHVyYWw9RGVzY3JpcHRvcnMKLWRpc2NpcGxpbmVfdGV4dF9wbHVyYWw9RGlzY2lwbGluZXMKLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0X3BsdXJhbD1EaXNjaXBsaW5lIEdyb3VwaW5ncwotZG9tYWluX3RleHRfcGx1cmFsPURvbWFpbnMKLWVzdGltYXRlX3RleHRfcGx1cmFsPUVzdGltYXRlcwotZXN0aW1hdGluZ01ldHJpY190ZXh0X3BsdXJhbD1Fc3RpbWF0aW5nIE1ldHJpY3MKLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0X3BsdXJhbD1Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1leGFtcGxlX3RleHRfcGx1cmFsPUV4YW1wbGVzCi1ndWlkYW5jZV90ZXh0X3BsdXJhbD1HdWlkYW5jZXMKLWd1aWRlbGluZV90ZXh0X3BsdXJhbD1HdWlkZWxpbmVzCi1pdGVyYXRpb25fdGV4dF9wbHVyYWw9SXRlcmF0aW9ucwotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0X3BsdXJhbD1NZXRob2QgQ29uZmlndXJhdGlvbnMKLW1ldGhvZENvbnRlbnRfdGV4dF9wbHVyYWw9TWV0aG9kIENvbnRlbnRzCi1tZXRob2RMaWJyYXJ5X3RleHRfcGx1cmFsPU1ldGhvZCBMaWJyYXJpZXMKLW1ldGhvZFBhY2thZ2VfdGV4dF9wbHVyYWw9TWV0aG9kIFBhY2thZ2VzCi1tZXRob2RQbHVnaW5fdGV4dF9wbHVyYWw9TWV0aG9kIFBsdWctaW5zCi1taWxlc3RvbmVfdGV4dF9wbHVyYWw9TWlsZXN0b25lcwotb3V0Y29tZV90ZXh0X3BsdXJhbD1PdXRjb21lcwotcGhhc2VfdGV4dF9wbHVyYWw9UGhhc2VzCi1wcmFjdGljZV90ZXh0X3BsdXJhbD1QcmFjdGljZXMKLXByb2Nlc3NfdGV4dF9wbHVyYWw9UHJvY2Vzc2VzCi1wcm9jZXNzQ29udHJpYnV0aW9uX3RleHRfcGx1cmFsPURpZmZlcmVudGlhbCBQcm9jZXNzZXMKLXByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw9UHJvY2VzcyBGYW1pbGllcwotcHJvY2Vzc1BhY2thZ2VfdGV4dF9wbHVyYWw9UHJvY2VzcyBQYWNrYWdlcwotcmVwb3J0X3RleHRfcGx1cmFsPVJlcG9ydHMKLXJldXNhYmxlQXNzZXRfdGV4dF9wbHVyYWw9UmV1c2FibGUgQXNzZXRzCi1yb2FkbWFwX3RleHRfcGx1cmFsPVJvYWRtYXBzCi1yb2xlRGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1Sb2xlIERlc2NyaXB0b3JzCi1yb2xlX3RleHRfcGx1cmFsPVJvbGVzCi1yb2xlU2V0X3RleHRfcGx1cmFsPVJvbGUgU2V0cwotcm9sZVNldEdyb3VwaW5nX3RleHRfcGx1cmFsPVJvbGUgU2V0IEdyb3VwaW5ncwotc3RhbmRhcmRDYXRlZ29yeV90ZXh0X3BsdXJhbD1TdGFuZGFyZCBDYXRlZ29yaWVzCi1zdGVwX3RleHRfcGx1cmFsPVN0ZXBzCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dF9wbHVyYWw9U3VwcG9ydGluZyBNYXRlcmlhbHMKLXRhc2tfdGV4dF9wbHVyYWw9VGFza3MKLXRhc2tEZXNjcmlwdG9yX3RleHRfcGx1cmFsPVRhc2sgRGVzY3JpcHRvcnMKLXRlYW1Qcm9maWxlX3RleHRfcGx1cmFsPVRlYW0gUHJvZmlsZXMKLXRlbXBsYXRlX3RleHRfcGx1cmFsPVRlbXBsYXRlcwotdGVybURlZmluaXRpb25fdGV4dF9wbHVyYWw9VGVybSBEZWZpbml0aW9ucwotdG9vbF90ZXh0X3BsdXJhbD1Ub29scwotdG9vbE1lbnRvcl90ZXh0X3BsdXJhbD1Ub29sIE1lbnRvcnMKLXdoaXRlcGFwZXJfdGV4dF9wbHVyYWw9V2hpdGVwYXBlcnMKLXdvcmtQcm9kdWN0X3RleHRfcGx1cmFsPVdvcmsgUHJvZHVjdHMKLXdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMKLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0X3BsdXJhbD1Xb3JrIFByb2R1Y3QgRWxlbWVudHMKLXdvcmtQcm9kdWN0VHlwZV90ZXh0X3BsdXJhbD1Xb3JrIFByb2R1Y3QgS2luZHMKLQotIyBBcHBsaWNhdGlvbiB0aXRsZS4KLWFwcGxpY2F0aW9uX3RpdGxlPXswfSAtIHsxfQotCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgV2l6YXJkCi1vcGVuTGlicmFyeVdpemFyZF90aXRsZT1PcGVuIE1ldGhvZCBMaWJyYXJ5Ci1vcGVuTGlicmFyeU1haW5XaXphcmRQYWdlX3RpdGxlPVNwZWNpZnkgYSBwYXRoIGNvbnRhaW5pbmcgYSBtZXRob2QgbGlicmFyeQotb3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZV8yPVNlbGVjdCBhIG1ldGhvZCBsaWJyYXJ5Ci1vcGVuTGlicmFyeU1haW5XaXphcmRQYWdlX3RleHQ9ezB9IHN0b3JlcyBtZXRob2RzIGFuZCBwcm9jZXNzZXMgaW4gYSBmb2xkZXIgY2FsbGVkIFxuYSBtZXRob2QgbGlicmFyeS4gU2VsZWN0IGEgbWV0aG9kIGxpYnJhcnkgZm9sZGVyIHRvIHVzZSBmb3IgdGhpcyBzZXNzaW9uLgotcGF0aExhYmVsX3RleHQ9UGF0aDoKLW5hbWVMYWJlbF90ZXh0PU5hbWU6Ci11cmlMYWJlbF90ZXh0PVVSSToKLW9wZW5Vbmxpc3RlZExpYnJhcnlDaGVja2JveF90ZXh0PU9wZW4gYSBtZXRob2QgbGlicmFyeSB0aGF0IGlzIG5vdCBsaXN0ZWQgYWJvdmUKLWxpYnJhcnlUeXBlTGFiZWxfdGV4dD1UeXBlOgotbGlicmFyeUxhYmVsX3RleHQ9TGlicmFyeToKLWJyb3dzZUJ1dHRvbl90ZXh0PUJyb3dzZS4uLgotcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94X3RleHQ9VXNlIHRoaXMgYXMgdGhlIGRlZmF1bHQgYW5kIGRvIG5vdCBhc2sgYWdhaW4uCi1vcGVuTGlicmFyeURpYWxvZ19uZXdMaWJyYXJ5X3RleHQ9Tm8gbWV0aG9kIGxpYnJhcnkgZXhpc3RzIGF0ICcnezB9JycuXG5BIG5ldyBtZXRob2QgbGlicmFyeSB3aWxsIGJlIGNyZWF0ZWQgYW5kIG9wZW5lZCBmb3IgeW91IGF0IHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LlxuXG5DbGljayBPSyB0byBwcm9jZWVkIG9yIENhbmNlbCB0byBzcGVjaWZ5IGFub3RoZXIgbWV0aG9kIGxpYnJhcnkgcGF0aC4KLQotIyBTZWxlY3QgTWV0aG9kIExpYnJhcnkgRm9sZGVyIERpYWxvZwotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190aXRsZT1TZWxlY3QgTWV0aG9kIExpYnJhcnkKLXNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGV4dD1TZWxlY3QgYSBtZXRob2QgbGlicmFyeSBmb2xkZXIuCi0KLSMgT3BlbiBMaWJyYXJ5IFByb2dyZXNzIE1lc3NhZ2UKLW9wZW5pbmdMaWJyYXJ5VGFza19uYW1lPU9wZW5pbmcgbWV0aG9kIGxpYnJhcnkuLi4KLQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yIERpYWxvZwotb3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQTDAzMDFFOiBVbmFibGUgdG8gY3JlYXRlIHRoZSBtZXRob2QgbGlicmFyeS4KLW9wZW5MaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbj1BbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuCi1vcGVuTGlicmFyeUVycm9yX3JlYXNvbjE9VGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSBwYXRoICcnezB9JycgaXMgaW52YWxpZC4KLW9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMj1BIG1ldGhvZCBsaWJyYXJ5IGFscmVhZHkgZXhpc3RzIGluICcnezB9JycuCi1vcGVuTGlicmFyeUVycm9yX3JlYXNvbjM9VGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSBmb2xkZXIgJyd7MH0nJyBjYW5ub3QgYmUgY3JlYXRlZC4KLW9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uND1UaGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IGZvbGRlciBpcyBhIHBsdWdpbiBvciBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24gZXhwb3J0IGZvbGRlci4KLW9wZW5MaWJyYXJ5RXJyb3JfYWR2aWNlPVNlbGVjdCBPSyB0byBzcGVjaWZ5IGFub3RoZXIgbWV0aG9kIGxpYnJhcnkgbmFtZSBvciBsb2NhdGlvbi4KLQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yIE1lc3NhZ2VzCi1pbnZhbGlkTGlicmFyeVBhdGhfbXNnPUlVUEwwMzAyRTogVW5hYmxlIHRvIG9wZW4gdGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeS4KLWludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb249VGhlIHNlbGVjdGVkIG1ldGhvZCBsaWJyYXJ5IGZvbGRlciBpcyBpbnZhbGlkLCBkb2VzIG5vdCBleGlzdCwgb3IgeW91IGRvIG5vdCBoYXZlIHRoZSBwcm9wZXIgcGVybWlzc2lvbiB0byBhY2Nlc3MgaXQuXG5cbkNsaWNrIE9LIHRvIHNlbGVjdCBhbm90aGVyIGxpYnJhcnkgZm9sZGVyLgotCi0jIExpYnJhcnkgTG9ja2VkIEVycm9yIERpYWxvZwotbGlicmFyeUxvY2tlZF9tc2c9SVVQTDAzMDNFOiBVbmFibGUgdG8gb3BlbiB0aGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5LlxuXG5UaGUgc2VsZWN0ZWQgbWV0aG9kIGxpYnJhcnkgYXBwZWFycyB0byBiZSBpbiB1c2UuIENsaWNrIENhbmNlbCB0byBzZWxlY3QgYW5vdGhlciBsaWJyYXJ5IGZvbGRlciwgb3IgY2xpY2sgRm9yY2UgT3BlbiBpZiB5b3Ugd2FudCB0byBvcGVuIHRoZSBsaWJyYXJ5IGFueXdheS5cblxuV0FSTklORzogQ29uY3VycmVudCB1c2Ugb2YgYSBtZXRob2QgbGlicmFyeSBtYXkgY2F1c2UgdGhhdCBsaWJyYXJ5IHRvIGJlY29tZSBjb3JydXB0ZWQuCi1saWJyYXJ5TG9ja2VkX29wZW5CdXR0b25fdGV4dD1Gb3JjZSBPcGVuCi0KLSMgUmVhZC1vbmx5IFByb2plY3QgRmlsZSBFcnJvciBEaWFsb2cKLXJlYWRPbmx5UHJvamVjdEZpbGVfdGV4dD1JVVBMMDMwNEU6ICcnezB9JycgaXMgcmVhZC1vbmx5LiBNYWtlIGl0IHdyaXRhYmxlIGJlZm9yZSBjb250aW51aW5nLgotcmV0cnlCdXR0b25fdGV4dD1SZXRyeQotY2FuY2VsQnV0dG9uX3RleHQ9Q2FuY2VsCi0KLSMgVmVyc2lvbiBNaXNtYXRjaCBEaWFsb2cKLXZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0PUlVUEwzMDVFOiBUaGUgc2VsZWN0ZWQgbGlicmFyeSBjYW5ub3QgYmUgb3BlbmVkLiBZb3UgbXVzdCB1cGdyYWRlIHswfSB0byB2ZXJzaW9uIHsxfSBvciBoaWdoZXIgaW4gb3JkZXIgdG8gb3BlbiB0aGlzIGxpYnJhcnkuCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duPUlVUEwzMDZFOiBUaGUgc2VsZWN0ZWQgbGlicmFyeSBjYW5ub3QgYmUgb3BlbmVkLiBZb3UgbXVzdCB1cGdyYWRlIHswfSB0byBhIGhpZ2hlciB2ZXJzaW9uIGluIG9yZGVyIHRvIG9wZW4gdGhpcyBsaWJyYXJ5LgotCi0jIFVwZ3JhZGUgTWV0aG9kIExpYnJhcnkgRGlhbG9nCi11cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZT1VcGdyYWRlIE1ldGhvZCBMaWJyYXJ5Ci11cGdyYWRlTGlicmFyeURpYWxvZ190ZXh0PVRoZSBsaWJyYXJ5IHlvdSBoYXZlIHNlbGVjdGVkIG5lZWRzIHRvIGJlIHVwZ3JhZGVkIHRvIHRoZSBuZXcgbGlicmFyeSBzdHJ1Y3R1cmUuXG5cbkRvIHlvdSB3YW50IHRvIHByb2NlZWQgd2l0aCB0aGUgdXBncmFkZT8KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9VXBncmFkaW5nIG1ldGhvZCBsaWJyYXJ5Li4uCi0KLSMgVXBncmFkZSBMaWJyYXJ5IEVycm9yIERpYWxvZwotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQTDAzMDZFOiBGYWlsZWQgdG8gdXBncmFkZSB0aGUgbWV0aG9kIGxpYnJhcnkuIFBsZWFzZSBzZWUgdGhlIGxvZyBmaWxlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgU3dpdGNoIENvbmZpZ3VyYXRpb24gRGlhbG9nCi1zd2l0Y2hDb25maWdEaWFsb2dfdGl0bGU9U3dpdGNoIENvbmZpZ3VyYXRpb24KLXN3aXRjaENvbmZpZ0RpYWxvZ190ZXh0PURvIHlvdSB3YW50IHRvIHN3aXRjaCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sICcnezB9JycsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgcHJvY2Vzcz8KLQkKLSMgQ29uZmlndXJhdGlvbiBDb21ibwotY3VycmVudENvbmZpZ0xhYmVsX3RleHQ9Q3VycmVudCBjb25maWd1cmF0aW9uOgotc2VsZWN0Q29uZmlnTGFiZWxfdGV4dD1TZWxlY3QgYSBjb25maWd1cmF0aW9uCi0KLSMgRGVsZXRlIEZpbGVzIENvbmZpcm1hdGlvbiBNZXNzYWdlCi1kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2c9VGhlIHNwZWNpZmllZCBwYXRoICcnezB9JycgYWxyZWFkeSBleGlzdHMuIEFsbCBmaWxlcyBpbiB0aGUgZm9sZGVyIHdpbGwgYmUgZGVsZXRlZC4gRG8geW91IHdhbnQgdG8gcHJvY2VlZD8KLQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcwotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249VGhlIHBhdGggJyd7MH0nJyBjb250YWlucyBvbmUgb3IgbW9yZSBmaWxlcyB0aGF0IGNhbm5vdCBiZSBkZWxldGVkLlxuXG5TZWxlY3QgYW5vdGhlciBwYXRoIGFuZCB0cnkgYWdhaW4uCi1jcmVhdGVQYXRoRXJyb3JfcmVhc29uPVVuYWJsZSB0byBjcmVhdGUgcGF0aCAnJ3swfScnLlxuXG5TZWxlY3QgYW5vdGhlciBwYXRoIGFuZCB0cnkgYWdhaW4uCi1pbnZhbGlkUGF0aF9tc2c9VGhlIHNwZWNpZmllZCBwYXRoIGlzIG5vdCB2YWxpZC4KLQotIyBCYWNrdXAgTGlicmFyeSBEaWFsb2cKLWJhY2t1cExpYnJhcnlEaWFsb2dfdGl0bGU9QmFja3VwIExpYnJhcnkKLWJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dD1JdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBiYWNrIHVwIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGJlZm9yZSBwcm9jZWVkaW5nLlxuXG5DbGljayBPSyB0byBjcmVhdGUgYSBiYWNrdXAgY29weSBvZiB0aGUgbGlicmFyeSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4gQ2xpY2sgU2tpcCB0byBjb250aW51ZSB3aXRob3V0IGNyZWF0aW5nIHRoZSBiYWNrdXAuCi1iYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lPU1ha2luZyBhIGJhY2t1cCBjb3B5IG9mIGxpYnJhcnkgZmlsZXMgLi4uCi0KLSMgUGF0aCBTZWxlY3Rpb24gRGlhbG9nCi1wYXRoU2VsZWN0aW9uRXJyb3JfbXNnPVVuYWJsZSB0byBjcmVhdGUgZGlyCi1va0J1dHRvbl90ZXh0PU9LCi1za2lwQnV0dG9uX3RleHQ9U2tpcAotCi0jIFByb2Nlc3MgRWRpdG9yIHByZWZlcmVuY2VzCi1hbHdheXNCdXR0b25fdGV4dD1BbHdheXMKLW5ldmVyQnV0dG9uX3RleHQ9TmV2ZXIKLXByb21wdEJ1dHRvbl90ZXh0PVByb21wdAotCi0jIEFkZCBMaW5rIERpYWxvZwotbGlua1RvVVJMX25hbWU9VVJMCi1saW5rVG9GaWxlX25hbWU9RmlsZQotZWxlbWVudExpbmtfbmFtZT1NZXRob2QgZWxlbWVudAotZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lPU1ldGhvZCBlbGVtZW50IHdpdGggdHlwZSBwcmVmaXgKLWVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0X25hbWU9TWV0aG9kIGVsZW1lbnQgd2l0aCBjdXN0b20gdGV4dAotCi0jIENvbnZlcnQgQWN0aXZpdHkgVHlwZSBEaWFsb2cKLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190aXRsZT1Db252ZXJ0IEFjdGl2aXR5IFR5cGUKLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0PVNlbGVjdCB0aGUgdGFyZ2V0IGFjdGl2aXR5IHR5cGUuCi11bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9tc2c9SVVQTDAzMDdFOiBUaGlzIGFjdGl2aXR5IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYW5vdGhlciB0eXBlLgotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uPVRoZXJlIGlzIG5vIGNvbXBhdGlibGUgYWN0aXZpdHkgdHlwZSBmb3IgezB9LgotCi0jIFNlbGVjdCBQcm9jZXNzIFdpemFyZCBQYWdlCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgcHJvY2Vzcwotc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dD1TZWxlY3QgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcyB0byBleHBvcnQuCi1wcm9jZXNzZXNMYWJlbF90ZXh0PVByb2Nlc3NlczoKLWJyaWVmRGVzY3JpcHRpb25MYWJlbF90ZXh0PUJyaWVmIGRlc2NyaXB0aW9uOgotCi0jIEV4cG9ydCBQcm9jZXNzIFdpemFyZCBFcnJvciBNZXNzYWdlLgotbm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnPUlVUEwwMzA4RTogTm8gbWV0aG9kIGxpYnJhcnkgaXMgY3VycmVudGx5IG9wZW5lZC4gQ2xpY2sgQ2FuY2VsLCBvcGVuIGEgbWV0aG9kIGxpYnJhcnkgb3IgY3JlYXRlIGEgbmV3IG9uZSwgYW5kIHJ1biB0aGlzIHdpemFyZCBhZ2Fpbi4gCi0KLSNNb3ZlZCBmcm9tIGF1dGhvcmluZyB1aSB0byBhdm9pZCBhdXRob3Jpbmd1aSBkZXBlbmRlbmN5Ci1lcnJvckRpYWxvZ190aXRsZT1FcnJvcgotTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbl9kZWxldGVjb25maXJtX3RleHQ9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnPwotY29uZmlybURlbGV0ZURpYWxvZ190aXRsZT1Db25maXJtIERlbGV0aW9uCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZz1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICcnezB9Jyc/Ci1jb25maXJtRGVsZXRlRGlhbG9nX21zZ1dpdGhSZWZlcmVuY2U9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnP1xuXG5UaGUgZm9sbG93aW5nIGVsZW1lbnQocykgY29udGFpbiByZWZlcmVuY2VzIHRvIHRoZSBpdGVtKHMpIHRvIGJlIGRlbGV0ZWQ6IHsxfQotUHJvY2Vzc0RlbGV0ZUFjdGlvbl9kZWxldGVjb2Zpcm1fdGV4dD1UaGlzIHdpbGwgc2F2ZSB0aGUgY3VycmVudCBlZGl0b3IgYW5kIHRoZSBjaGFuZ2Ugd2lsbCBiZSBwZXJtYW5lbnQuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJyd7MH0nJz8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkl0ZW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDNlNGNhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLkxpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLk5hbWVDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLQotLyoqCi0gKiBBZGRzIHRoZSBDb25maWd1cmF0aW9uIGNvbWJveGJveCB0byB0aGUgc3lzdGVtIHRvb2xiYXIuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gZXh0ZW5kcyBDb250cmlidXRpb25JdGVtIHsKLQotCXByaXZhdGUgc3RhdGljIENvbWJvIGNvbmZpZ0NvbWJvOwotCXByaXZhdGUgc3RhdGljIENvbWJvVmlld2VyIGNvbmZpZ0NvbWJvVmlld2VyOwotCXByb3RlY3RlZCBUb29sSXRlbSBpdGVtOwotCXByb3RlY3RlZCBDb29sSXRlbSBjb29sSXRlbTsKLQlwcml2YXRlIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpYlN2Y0xpc3RlbmVyOwotCi0JCi0JLy8gdGhlICJTZWxlY3QgYSBjb25maWd1cmF0aW9uIiBzdHJpbmcKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX0NPTkZJR1VSQVRJT04gPSBMaWJyYXJ5VUlSZXNvdXJjZXMuc2VsZWN0Q29uZmlnTGFiZWxfdGV4dDsKLQotCS8vIGNvbnRlbnQgcHJvdmlkZXIKLQlwcm90ZWN0ZWQgc3RhdGljIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlckNvbmZpZ3MgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlMaXN0IGNvbmZpZ3NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKSA9PSBudWxsKSB7Ci0JCQkJY29uZmlnc0xpc3QuYWRkKFNFTEVDVF9DT05GSUdVUkFUSU9OKTsKLQkJCX0KLQkJCWNvbmZpZ3NMaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpKSk7Ci0JCQlyZXR1cm4gY29uZmlnc0xpc3QudG9BcnJheSgpOwotCQl9Ci0JfTsKLQkKLQkvLyBsYWJlbCBwcm92aWRlcgotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyQ29uZmlncyA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgb2JqZWN0OwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCXJldHVybiAoKE1ldGhvZENvbmZpZ3VyYXRpb24pb2JqZWN0KS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQllbHNlIHJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSXRlbShJQWN0aW9uIGFjdGlvbikgewotCX0KLQotCS8qIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChUb29sQmFyIHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0ocGFyZW50LCBTV1QuU0VQQVJBVE9SKTsKLQkJQ29udHJvbCBib3ggPSBjcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCWl0ZW0uc2V0Q29udHJvbChib3gpOwotCQlpdGVtLnNldFdpZHRoKDI0MCk7Ci0JfQotCi0JLyogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXIsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsKENvb2xCYXIgY29vbEJhciwgaW50IGluZGV4KSB7Ci0JCUNvbnRyb2wgYm94ID0gY3JlYXRlQ29udHJvbChjb29sQmFyKTsKLQotCQlpbnQgZmxhZ3MgPSBTV1QuRFJPUF9ET1dOOwotCQlpZiAoaW5kZXggPj0gMCkgewotCQkJY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgZmxhZ3MsIGluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIGZsYWdzKTsKLQkJfQotCQkvLyBTZXQgdGhlIGJhY2sgcmVmZXJlbmNlLgotCQljb29sSXRlbS5zZXREYXRhKHRoaXMpOwotCi0JCS8vIEFkZCB0aGUgdG9vbGJhciB0byB0aGUgQ29vbEl0ZW0gd2lkZ2V0LgotCQljb29sSXRlbS5zZXRDb250cm9sKGJveCk7Ci0KLQkJLy8gSWYgdGhlIHRvb2xiYXIgaXRlbSBleGlzdHMgdGhlbiBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIGNvb2wgaXRlbS4KLQkJUG9pbnQgdG9vbEJhclNpemUgPSBib3guY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQkvLyBTZXQgdGhlIHByZWZmZXJlZCBzaXplIHRvIHRoZSBzaXplIG9mIHRoZSB0b29sYmFyIHBsdXMgdHJpbS4KLQkJY29vbEl0ZW0uc2V0TWluaW11bVNpemUodG9vbEJhclNpemUpOwotCQljb29sSXRlbS5zZXRQcmVmZXJyZWRTaXplKHRvb2xCYXJTaXplKTsKLQkJY29vbEl0ZW0uc2V0U2l6ZSh0b29sQmFyU2l6ZSk7Ci0JfQotCi0JLyogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29uZmlnQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCWNvbmZpZ0NvbWJvLnNldFZpc2libGVJdGVtQ291bnQoMTApOwotCQljb25maWdDb21iby5zZXRFbmFibGVkKHRydWUpOwotCQljb25maWdDb21ib1ZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb25maWdDb21ibyk7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJDb25maWdzKTsKLQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyQ29uZmlncyk7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyLnNldElucHV0KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCi0KLQkJY29uZmlnQ29tYm9WaWV3ZXIuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJcGVyZm9ybVNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlTdHJpbmcgc2F2ZWRDb25maWdOYW1lID0gZ2V0U2F2ZWRMYXN0Q29uZmlnKCk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gc2F2ZWRDb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIHNhdmVkQ29uZmlnTmFtZSk7Ci0JCWlmIChzYXZlZENvbmZpZyAhPSBudWxsKSB7Ci0JCQljb25maWdDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2F2ZWRDb25maWcpKTsKLQkJfQotCQllbHNlIHsKLQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihTRUxFQ1RfQ09ORklHVVJBVElPTikpOwotCQl9Ci0JCQotCQlsaWJTdmNMaXN0ZW5lciA9IG5ldyBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJCXNlbGVjdENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChudWxsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0SW5wdXQobGlicmFyeSk7Ci0JCQkJc2VsZWN0Q29uZmlndXJhdGlvbihudWxsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChsaWJyYXJ5KTsKLQkJCQlyZWZyZXNoKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQlpZiAobGlicmFyeSAhPSBjb25maWdDb21ib1ZpZXdlci5nZXRJbnB1dCgpKSB7Ci0JCQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldElucHV0KGxpYnJhcnkpOwotCQkJCQlyZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCWlmIChsaWJyYXJ5ICE9IGNvbmZpZ0NvbWJvVmlld2VyLmdldElucHV0KCkpIHsKLQkJCQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0SW5wdXQobGlicmFyeSk7Ci0JCQkJCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCQkJCXNlbGVjdENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0JCQotCQlyZXR1cm4gY29uZmlnQ29tYm87Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjdXJyZW50bHkgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldEN1cnJlbnRTZWxlY3RlZENvbmZpZygpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25maWdDb21ib1ZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IG9iamVjdCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXJldHVybiAoTWV0aG9kQ29uZmlndXJhdGlvbilvYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBjdXJyZW50bHkgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDdXJyZW50U2VsZWN0ZWRDb25maWdOYW1lKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbmZpZ0NvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlPYmplY3Qgb2JqZWN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuICgoTWV0aG9kQ29uZmlndXJhdGlvbilvYmplY3QpLmdldE5hbWUoKTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKQotCQkJcmV0dXJuIChTdHJpbmcpb2JqZWN0OwotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBlcmZvcm1TZWxlY3Rpb25DaGFuZ2VkKCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldEN1cnJlbnRTZWxlY3RlZENvbmZpZygpOwotCQlpZiAoY29uZmlnICE9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKSkgeyAKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJfQotCQlzYXZlU2VsZWN0ZWRDb25maWdJbnRvUGVyc2lzdGVuY2UoKTsKLQkJcmVmcmVzaCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2F2ZVNlbGVjdGVkQ29uZmlnSW50b1BlcnNpc3RlbmNlKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXN0b3JlCi0JCQkJLnNldFZhbHVlKAotCQkJCQkJTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9TRUxFQ1RFRF9DT05GSUdfSU5fTEFTVF9TRVNTSU9OLAotCQkJCQkJZ2V0Q3VycmVudFNlbGVjdGVkQ29uZmlnTmFtZSgpKTsKLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNhdmVkTGFzdENvbmZpZygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlyZXR1cm4gc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfU0VMRUNURURfQ09ORklHX0lOX0xBU1RfU0VTU0lPTik7Ci0JfQotCi0JLyogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihsaWJTdmNMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJfQotCQkKLQkJaWYgKCBjb25maWdDb21ibyAhPSBudWxsICYmICFjb25maWdDb21iby5pc0Rpc3Bvc2VkKCkgKSB7Ci0JCQljb25maWdDb21iby5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZWZyZXNoIGNvbmZpZ3VyYXRpb24gY29tYm8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJY29uZmlnQ29tYm9WaWV3ZXIucmVmcmVzaCgpOwotCX0KLQkKLQkvKioKLQkgKiBTZWxlY3QgY29uZmlndXJhdGlvbiBpbiBjb25maWd1cmF0aW9uIGNvbWJvIGJveAotCSAqIEBwYXJhbSBjb25maWcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0Q29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlOYW1lQ2FjaGUuZ2V0SW5zdGFuY2UoKS5jbGVhcigpOwotCQlpZiAoY29uZmlnICE9IG51bGwgJiYgY29uZmlnID09IGdldEN1cnJlbnRTZWxlY3RlZENvbmZpZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQljb25maWdDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29uZmlnKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBjb25maWcgaXMgbnVsbCwgc28gc2VsZWN0IHRoZSAiU2VsZWN0IGEgY29uZmlndXJhdGlvbiBpdGVtIgotCQkJLy8gZmlyc3QgcmVmcmVzaCBsaXN0IHNvIHRoYXQgdGhlICJTZWxlY3QgYSBjb25maWcuLiIgc3RyaW5nIGdldHMgYWRkZWQgdG8gdGhlIGxpc3QKLQkJCXJlZnJlc2goKTsKLQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihTRUxFQ1RfQ09ORklHVVJBVElPTiksIHRydWUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvSUxpYnJhcnlBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvSUxpYnJhcnlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmQwMzdhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBMaWJyYXJ5IGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeUFjdGlvbiBleHRlbmRzIElBY3Rpb24gewotLy8Jdm9pZCBub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsCi0vLwkJCU9iamVjdCBuZXdWYWx1ZSk7Ci0JCi0Jdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MTVmOGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5MaWJyYXJ5U2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBSdW5zIG9wZXJhdGlvbiB0aGF0IGxvY2tzIHRoZSBsaWJyYXJ5IGZvciB0aGUgZHVyYXRpb24gb2YgaXRzIGV4ZWN1dGlvbgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIGltcGxlbWVudHMgSVJ1bm5hYmxlQ29udGV4dCB7Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yOwotCQotCXB1YmxpYyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpIHsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBkb1J1bihmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIGZpbmFsIGJvb2xlYW4gd29ya1Vua25vd24pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uW10gaXRlSG9sZGVyID0gbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb25bMV07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJV29ya3NwYWNlUnVubmFibGUgd29ya3NwYWNlUnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih3b3JrVW5rbm93bikgewotICAgICAgICAJCQkJCXBtLmJlZ2luVGFzaygiIiwgMik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCQkJCQlwbS53b3JrZWQoMSk7Ci0gICAgICAgIAkJCQkJdHJ5IHsKLSAgICAgICAgCQkJCQkJcnVubmFibGUucnVuKHBtKTsKLSAgICAgICAgCQkJCQkJcG0ud29ya2VkKDIpOwotICAgICAgICAJCQkJCX0KLSAgICAgICAgCQkJCQlmaW5hbGx5IHsKLSAgICAgICAgCQkJCQkJcG0uZG9uZSgpOwotICAgICAgICAJCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgCXJ1bm5hYmxlLnJ1bihwbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBpdCBvdXRzaWRlIHRoZSB3b3Jrc3BhY2UgcnVubmFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZUhvbGRlclswXSA9IGU7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlLXRocm93IGFzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uLCB3aGljaCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXVnaHQgYW5kIHJlLXRocm93biBhcyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBiZWxvdy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ29yZUV4Y2VwdGlvbiBhbmQgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gYXJlIHByb3BhZ2F0ZWQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih3b3Jrc3BhY2VSdW5uYWJsZSwKLSAgICAgICAgICAgIAkJbmV3IExpYnJhcnlTY2hlZHVsaW5nUnVsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpLAotICAgICAgICAgICAgCQlJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFJlLXRocm93IHRoZSBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBpZiBhbnkgb2NjdXJyZWQKLSAgICAgICAgaWYgKGl0ZUhvbGRlclswXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBpdGVIb2xkZXJbMF07Ci0gICAgICAgIH0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dCNydW4oYm9vbGVhbiwgYm9vbGVhbiwgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsCi0JCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlkb1J1bihydW5uYWJsZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHsKLQkJdHJ5IHsKLQkJCWRvUnVuKHJ1bm5hYmxlLCB0cnVlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0JCQlpZihjYXVzZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoUnVudGltZUV4Y2VwdGlvbiljYXVzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmKGNhdXNlID09IG51bGwpIHsKLQkJCQkJY2F1c2UgPSBlOwotCQkJCX0KLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNhdXNlKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgbXNnID0gY2F1c2UuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBjYXVzZS5nZXRNZXNzYWdlKCkgOiBjYXVzZS50b1N0cmluZygpOyAKLQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoTGlicmFyeVVJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCBtc2csIGNhdXNlKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQotCQkJCX0JCQkJCi0JCQl9Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZihwcm9ncmVzc01vbml0b3IgPT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQlyZXR1cm4gcHJvZ3Jlc3NNb25pdG9yOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgdGhlIHByb2dyZXNzTW9uaXRvciB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJdGhpcy5wcm9ncmVzc01vbml0b3IgPSBwcm9ncmVzc01vbml0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL01ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmYzNDA4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL01ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLQotLyoqCi0gKiBBY3Rpb24gdG8gZGVsZXRlIG1ldGhvZCBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uIGV4dGVuZHMgRGVsZXRlQWN0aW9uIGltcGxlbWVudHMgSUxpYnJhcnlBY3Rpb24gewotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maXJtID0gdHJ1ZTsKLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3I7Ci0KLQkvKioKLQkgKiBEZWxldGVzIG1ldGhvZCBlbGVtZW50Ci0JICoKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbihFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQlzdXBlcihkb21haW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBjb25maXJtCi0JICogICAgICAgICAgICBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHVzZXIgY29uZmlybWF0aW9uIGlzIHJlcXVpcmVkLiBJZgotCSAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBleGVjdXRpbmcgdGhpcyBjb21tYW5kIHdpbGwgbm90Ci0JICogICAgICAgICAgICBpbnRlcmFjdCB3aXRoIHVzZXIgYW5kIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHdpbGwgYXBwbHkuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24oRWRpdGluZ0RvbWFpbiBkb21haW4sIGJvb2xlYW4gY29uZmlybSkgewotCQl0aGlzKGRvbWFpbik7Ci0JCXRoaXMuY29uZmlybSA9IGNvbmZpcm07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRGVsZXRlQWN0aW9uI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQotCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjbWQgPSBjcmVhdGVNZXRob2RFbGVtZW50RGVsZXRlQ29tbWFuZCgpOwotCQljbWQKLQkJCQkuYWRkQ29tbWFuZExpc3RlbmVyKG5ldyBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5Db21tYW5kTGlzdGVuZXIoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgbm90aWZ5RXhlY3V0ZWQoRXZlbnRPYmplY3QgZXZlbnRPYmplY3QpIHsKLQkJCQkJCURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNtZCA9IChEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCkgZXZlbnRPYmplY3QKLQkJCQkJCQkJLmdldFNvdXJjZSgpOwotCQkJCQkJZGlkRGVsZXRlKGNtZC5nZXRSZXN1bHQoKSk7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBub3RpZnlGYWlsdXJlKEV2ZW50T2JqZWN0IGV2ZW50T2JqZWN0KSB7Ci0JCQkJCQlkZWxldGVGYWlsZWQoKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmFpbGVkKCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGNvbW1hbmQgdG8gZGVsZXRlIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBjb21tYW5kCi0JICovCi0JcHVibGljIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNyZWF0ZU1ldGhvZEVsZW1lbnREZWxldGVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKHN1cGVyLmNyZWF0ZUNvbW1hbmQoc2VsZWN0aW9uKSwKLQkJCQlzZWxlY3Rpb24sIGNvbmZpcm0pIHsKLQkJCXByb3RlY3RlZCB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKExpc3Qgb3Bwb3NpdGVGZWF0dXJlcywKLQkJCQkJU2V0IGRlbGV0ZWRHVUlEcykgewotCQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgTGlicmFyeVNlcnZpY2UKLQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkKLQkJCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCXJlc291cmNlU2V0Ci0JCQkJCQkubG9hZE9wcG9zaXRlRmVhdHVyZXMob3Bwb3NpdGVGZWF0dXJlcywgZGVsZXRlZEdVSURzKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaWREZWxldGUoQ29sbGVjdGlvbiBkZWxldGVkRWxlbWVudHMpIHsKLQotCX0KLQotCS8qKgotCSAqIEdldCBjb25maXJtYXRpb24gbWVzc2FnZSB0byBkZWxldGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWxldGVDb25maXJtYXRpb25NZXNzYWdlKCkgewotCQlyZXR1cm4gTGlicmFyeVVJUmVzb3VyY2VzLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0OyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlybURlbGV0ZSgpIHsKLQkJaWYgKCFjb25maXJtKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWludCBpID0gMDsKLQkJU3RyaW5nQnVmZmVyIGVsZW1lbnRTdHIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoaXQubmV4dCgpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJaWYgKGkgPiAwKSB7Ci0JCQkJCWVsZW1lbnRTdHIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsZW1lbnRTdHIuYXBwZW5kKCgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXROYW1lKCkpOwotCi0JCQkJaSsrOwotCQkJfQotCQl9Ci0KLQkJT2JqZWN0W10gYXJncyA9IHsgZWxlbWVudFN0ci50b1N0cmluZygpIH07Ci0JCVN0cmluZyBtc2cgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuYmluZChMaWJyYXJ5VUlSZXNvdXJjZXMuY29uZmlybURlbGV0ZURpYWxvZ19tc2csIGFyZ3MpOyAvLyBOT04tTkxTLTEkCi0KLQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeVVJUmVzb3VyY2VzLmNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBkZWxldGVPayA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbih0aXRsZSwgbXNnKTsKLQkJcmV0dXJuIGRlbGV0ZU9rOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklMaWJyYXJ5QWN0aW9uI3NldFByb2dyZXNzTW9uaXRvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgcHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZihwcm9ncmVzc01vbml0b3IgPT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQlyZXR1cm4gcHJvZ3Jlc3NNb25pdG9yOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5zZXRQcm9ncmVzc01vbml0b3IoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcGVyZm9ybURlbGV0ZSgpOwotCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtcyBkZWxldGUKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWxldGUoKSB7Ci0JCXN1cGVyLnJ1bigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL09wZW5MaWJyYXJ5QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL09wZW5MaWJyYXJ5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5NDdmMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9PcGVuTGlicmFyeUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuT3BlbkxpYnJhcnlXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIHRoZSBPcGVuIExpYnJhcnkgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5MaWJyYXJ5QWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl0aGlzLndpbmRvdyA9IHdpbmRvdzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNydW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJT3BlbkxpYnJhcnlXaXphcmQgd2l6YXJkID0gbmV3IE9wZW5MaWJyYXJ5V2l6YXJkKCk7Ci0JCXdpemFyZC5pbml0KHdpbmRvdy5nZXRXb3JrYmVuY2goKSwgbnVsbCk7Ci0JCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL1Byb2Nlc3NEZWxldGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvUHJvY2Vzc0RlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYTU3NjU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvUHJvY2Vzc0RlbGV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkRlbGV0ZVJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkRlbGV0ZVRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkRlbGV0ZVRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUHJvY2Vzc0VsZW1lbnREZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi0KLS8qKgotICogRGVsZXRlIGFjdGlvbiBmb3IgcHJvY2VzcyBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0RlbGV0ZUFjdGlvbiBleHRlbmRzIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24gewotCXByaXZhdGUgYm9vbGVhbiBkZWxldGlvbkNvbmZpcm1lZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBIYXNoU2V0IHJlbW92ZWREZXNjcmlwdG9yczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0RlbGV0ZUFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqLwotCXB1YmxpYyBQcm9jZXNzRGVsZXRlQWN0aW9uKEVkaXRpbmdEb21haW4gZG9tYWluKSB7Ci0JCXN1cGVyKGRvbWFpbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gY29uZmlybQotCSAqLwotCXB1YmxpYyBQcm9jZXNzRGVsZXRlQWN0aW9uKEVkaXRpbmdEb21haW4gZG9tYWluLCBib29sZWFuIGNvbmZpcm0pIHsKLQkJc3VwZXIoZG9tYWluLCBjb25maXJtKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24jY3JlYXRlTWV0aG9kRWxlbWVudERlbGV0ZUNvbW1hbmQoKQotCSAqLwotCXB1YmxpYyBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjcmVhdGVNZXRob2RFbGVtZW50RGVsZXRlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQoUmVtb3ZlQ29tbWFuZC5jcmVhdGUoZG9tYWluLAotCQkJCXNlbGVjdGlvbiksIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBjb250ZW50IG9mIHRoZSBnaXZlbiBhY3Rpdml0eSBmcm9tIGl0cyByZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSBhY3QKLQkgKiBAcGFyYW0gbW9kaWZpZWRSZXNvdXJjZXMKLQkgKi8KLQkvLyBwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUNvbnRlbnRGcm9tUmVzb3VyY2UoQWN0aXZpdHkgYWN0LAotCS8vIFNldCBtb2RpZmllZFJlc291cmNlcykgewotCS8vIGlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihhY3QpKSB7Ci0JLy8gQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSBhY3QuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JLy8gUmVzb3VyY2UgcmVzb3VyY2UgPSBjb250ZW50LmVSZXNvdXJjZSgpOwotCS8vIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JLy8gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoY29udGVudCk7Ci0JLy8gbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvKioKLQkgKiBSdW4gdGhlIGRlbGV0ZSBhY3Rpb24gZ2l2ZW4gdGhlIGFjdGlvbiBtYW5hZ2VyCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJaWYgKGNvbmZpcm1EZWxldGUoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCS8vIHJlbW92ZSByZWZlcmVuY2VzCi0JCQkJcmVtb3ZlUmVmZXJlbmNlcyhhY3Rpb25NZ3IsIGl0b3IubmV4dCgpKTsKLQkJCX0KLQotCQkJLy8gZGVsZXRlIGVsZW1lbnQKLQkJCWRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUN1cnJlbnRFZGl0b3IoKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24jZ2V0RGVsZXRlQ29uZmlybWF0aW9uTWVzc2FnZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWxldGVDb25maXJtYXRpb25NZXNzYWdlKCkgewotCQlyZXR1cm4gTGlicmFyeVVJUmVzb3VyY2VzLlByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChjb25maXJtRGVsZXRlKCkpIHsJCQkKLQkJCS8vIGNvbGxlY3Rpb24gdGhlIHJlbGF0ZWQgZGVzY3JpcHRvcnMgYmVmb3JlIHRoZSBlbGVtZW50cyBnb3QgZGVsZXRlZAotCQkJLy8KLQkJCUNvbGxlY3Rpb24gZGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJYWRkUmVsYXRlZERlc2NyaXB0b3JzKGRlc2NyaXB0b3JzLCBlbGVtZW50KTsKLQkJCX0KLQotCQkJCi0JCQlDb21tYW5kIGNtZCA9IGNvbW1hbmQ7Ci0KLQkJCS8vIGRlbGV0ZSBlbGVtZW50cwotCQkJLy8KLQkJCWNtZC5leGVjdXRlKCk7Ci0KLQkJCS8vIENoZWNrIHJlZmVyZW5jZSBjb25maXJtYXRpb24gYW5kIGlmIGNvbmZpcm1lZCBzZXQKLQkJCS8vIGRlbGV0aW9uY29uZmlybWVkIHRvIHRydWUKLQkJCS8vIElmIGFueSBkZWxldGlvbiBoYXBwZW5zIGluIHNlcXVlbmNlLCB3aWxsIGNoZWNrIGZvcgotCQkJLy8gZGVsZXRpb25jb25maXJtZWQgdmFyaWFibGUKLQkJCS8vIGFuZCBwcm9jZWVkcyByZW1haW5pbmcgZGVsZXRpb24gc2VxdWVuY2UuIChlZzoKLQkJCS8vIEFic3RyYWN0RGlhZ3JhbUVkaXRvciAtIERlbGV0ZUFjdGlvbigpKS4KLQkJCWlmICgoKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKSBjbWQpLmV4ZWN1dGVkKSB7Ci0JCQkJZGVsZXRpb25Db25maXJtZWQgPSB0cnVlOwotCQkJCi0JCQkJQ29sbGVjdGlvbiBkZWxldGVkRWxlbWVudHMgPSBjbWQuZ2V0UmVzdWx0KCk7Ci0JCQkJQ29tbWFuZCBkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgPSBuZXcgRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKAotCQkJCQkJZGVzY3JpcHRvcnMsIGZhbHNlLCBkZWxldGVkRWxlbWVudHMpIHsKLQkJCQkJCi0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGRlbGV0ZShMaXN0IGVsZW1lbnRzKSB7Ci0JCQkJCQlyZXR1cm4gUHJvY2Vzc0RlbGV0ZUFjdGlvbi5kZWxldGUoZWxlbWVudHMpOwotCQkJCQl9Ci0JCQkJCQotLy8JCQkJCXByb3RlY3RlZCB2b2lkIHNlbGVjdERlc2NyaXB0b3JzVG9EZWxldGUoTGlzdCBkZXNjcmlwdG9yc1RvRGVsZXRlKSB7Ci0vLwkJCQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRGVsZXRlQWN0aW9uX3NlbGVjdERlc2NyaXB0b3JzVG9EZWxldGU7IAotLy8JCQkJCQlPYmplY3RbXSBkZXNjcmlwdG9ycyA9IFJlZmVyZW5jZVNlbGVjdGlvbi5nZXRSZWZlcmVuY2VzKGRlc2NyaXB0b3JzVG9EZWxldGUsIG1zZyk7Ci0vLwkJCQkJCWRlc2NyaXB0b3JzVG9EZWxldGUucmV0YWluQWxsKEFycmF5cy5hc0xpc3QoZGVzY3JpcHRvcnMpKTsKLS8vCQkJCQl9Ci0JCQkJfTsKLQkJCQl0cnkgewotCQkJCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuZXhlY3V0ZSgpOwotCQkJCX0KLQkJCQljYXRjaChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vCi0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gc2F2ZSB0aGUgY3VycmVudCBlZGl0b3IKLQkJCS8vCi0JCQlzYXZlQ3VycmVudEVkaXRvcigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRSZWxhdGVkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBkZXNjcmlwdG9ycywgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbCh0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbCh0YXNrRGVzYy5nZXRBc3Npc3RlZEJ5KCkpOwotCQkJZGVzY3JpcHRvcnMuYWRkKHRhc2tEZXNjLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpOwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKHRhc2tEZXNjLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKHRhc2tEZXNjLmdldEV4dGVybmFsSW5wdXQoKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwodGFza0Rlc2MuZ2V0T3B0aW9uYWxJbnB1dCgpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbCh0YXNrRGVzYy5nZXRPdXRwdXQoKSk7Ci0JCX0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldEFzc2lzdGVkVGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0QWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykpOwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbChyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVSZWZlcmVuY2VzKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgT2JqZWN0IG9iaikgewotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kID0gbnVsbDsKLQkJYm9vbGVhbiBmb3JjZSA9ICFjb25maXJtOwotCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWNtZCA9IG5ldyBEZWxldGVUYXNrRGVzY3JpcHRvcigoVGFza0Rlc2NyaXB0b3IpIG9iaiwgZm9yY2UpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQljbWQgPSBuZXcgRGVsZXRlUm9sZURlc2NyaXB0b3IoKFJvbGVEZXNjcmlwdG9yKSBvYmosIGZvcmNlKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCWNtZCA9IG5ldyBEZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqLAotCQkJCQlmb3JjZSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCWNtZCA9IG5ldyBEZWxldGVUZWFtUHJvZmlsZSgoVGVhbVByb2ZpbGUpIG9iaik7Ci0JCX0KLQkJaWYgKGNtZCAhPSBudWxsKSB7Ci0JCQlpZiAoYWN0aW9uTWdyICE9IG51bGwpIHsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCi0JCQl9IGVsc2UgewotCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQl9Ci0JCQlpZiAoY21kIGluc3RhbmNlb2YgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKSB7Ci0JCQkJcmVtb3ZlZERlc2NyaXB0b3JzCi0JCQkJCQkuYWRkQWxsKCgoUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKSBjbWQpCi0JCQkJCQkJCS5nZXRSZW1vdmVkRGVzY3JpcHRvcnMoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0KLQkJYm9vbGVhbiByZXQgPSBzdXBlci51cGRhdGVTZWxlY3Rpb24oZmlsdGVyU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEZpbHRlciBzZWxlY3Rpb24gCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKiAJCQlOZXcgU2VsZWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBmaWx0ZXJTZWxlY3Rpb24oCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpCi0JCQkJCQkJLmlzUmVhZE9ubHkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIHsKLQkJCQlsaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBpZiBkZWxldGlvbiBjb25maXJtZWQsIHNldCBjb25maXJtYXRpb24gYW5kIGNoaWxkIHByb2Nlc3MgY2FuIHVzZSB0aGUKLQkgKiBjb25maXJtYXRpb24gdG8gcHJvY2VlZCBmb3IgdGhlIGRlbGV0aW9uIG9mIHJlbWFpbmluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0aW9uQ29uZmlybWVkKCkgewotCQlyZXR1cm4gZGVsZXRpb25Db25maXJtZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGNvbW1hbmQKLQkgKiBAcmV0dXJuIGNtZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENvbW1hbmQoKSB7Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZGVsZXRlIHByb2Nlc3MgZWxlbWVudHMgd2l0aG91dCBVSSBhY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcmV0dXJuIHRoZSBleGVjdXRlZCBkZWxldGUgY29tbWFuZCBpZiBzb21lIG9mIHRoZSBnaXZlbiBlbGVtZW50cyBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQsIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBleGNlcHRpb24gT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gaWYgdXNlciBjYW5jZWxlZCB0aGlzIGRlbGV0aW9uIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZCBkZWxldGUoQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlQcm9jZXNzRGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbiA9IG5ldyBQcm9jZXNzRGVsZXRlQWN0aW9uKAotCQkJCW51bGwsIGZhbHNlKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JCQkgKi8KLQkJCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQlkb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0KLQkJCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29tbWFuZChzZWxlY3Rpb24pOwotCQkJfQotCi0JCX07Ci0JCWlmIChkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBBcnJheUxpc3QoZWxlbWVudHMpKSkpIHsKLQkJCWRlbGV0ZUFjdGlvbi5ydW4oKTsKLQkJCWlmICghZGVsZXRlQWN0aW9uLmlzRGVsZXRpb25Db25maXJtZWQoKSkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIGRlbGV0ZUFjdGlvbi5nZXRDb21tYW5kKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlNTRjOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBhY3Rpb25zIGZvciBtYW5hZ2luZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQmFzZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9CYXNlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyZGNkNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9CYXNlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIExpYnJhcnkgVUkgZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlRGlhbG9nIGV4dGVuZHMgVGl0bGVBcmVhRGlhbG9nIHsKLQotCS8qKgotCSAqIFRoZSBPSyBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQotCS8qKgotCSAqIFRoZSBDYW5jZWwgYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY2FuY2VsQnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcGFyZW50IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBCYXNlRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRpYWxvZyBidXR0b25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIE9LIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQotCQkvLyBDcmVhdGUgdGhlIENhbmNlbCBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIE9LIGJ1dHRvbi4KLQkJb2tCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIENhbmNlbCBidXR0b24uCi0JCWNhbmNlbEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0NvbnZlcnRBY3Rpdml0eURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9Db252ZXJ0QWN0aXZpdHlEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGU0ZWVjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0NvbnZlcnRBY3Rpdml0eURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db252ZXJ0QWN0aXZpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdERpYWxvZzsKLQotLyoqCi0gKiBEaWFsb2cgdG8gY29udmVydCBhY3Rpdml0eSB0eXBlIAotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRBY3Rpdml0eURpYWxvZyB7Ci0KLQkvKioKLQkgKiBRdWVyeSB1c2VyIGFuZCBjb252ZXJ0IHRoZSBvbGQgYWN0aXZpdHkgaW50byBuZXcgb25lCi0JICogCi0JICogQHBhcmFtIG9sZEFjdGl2aXR5Ci0JICogQHBhcmFtIHNoZWxsCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAKLQkgKiBAcmV0dXJuIE5ld2x5IGNvbnZlcnRlZCBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgcXVlcnlVc2VyQW5kQ29udmVydChBY3Rpdml0eSBvbGRBY3Rpdml0eSwgU2hlbGwgc2hlbGwsCi0JCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCQotCQlpZiAoc2hlbGwgPT0gbnVsbCkKLQkJCXNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJTGlzdERpYWxvZyBkbGcgPSBuZXcgTGlzdERpYWxvZyhzaGVsbCk7Ci0JCWRsZy5zZXRIZWlnaHRJbkNoYXJzKDUpOwotCQlkbGcuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJZGxnLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlzd2l0Y2ggKCgoSW50ZWdlcikgZWxlbWVudCkuaW50VmFsdWUoKSkgewotCQkJCS8vIFRPRE86IHJlZmFjdG9yIHRoZXNlIHN0cmluZ3MgKGFuZCB0aGlzIHdob2xlIGRpYWxvZykgaW50bwotCQkJCS8vIGxpYnJhcnkudWkKLQkJCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFk6Ci0JCQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfQUNUSVZJVFk7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLklURVJBVElPTjoKLQkJCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9JVEVSQVRJT047Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlBIQVNFOgotCQkJCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX1BIQVNFOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnVua25vd25HdWlkYW5jZV90ZXh0OyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQl9Ci0JCX0pOwotCQlMaXN0IG5ld0FjdGl2aXR5VHlwZUxpc3QgPSBnZXRWYWxpZE5ld0FjdGl2aXR5VHlwZXMob2xkQWN0aXZpdHkpOwotCQlpZiAobmV3QWN0aXZpdHlUeXBlTGlzdCA9PSBudWxsKSB7Ci0JCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX21zZywKLQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuYmluZChMaWJyYXJ5VUlSZXNvdXJjZXMudW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uLCBTdHJVdGlsLnRvTG93ZXIoVG5nVXRpbC5nZXRUeXBlVGV4dChvbGRBY3Rpdml0eSkpKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlkbGcuc2V0SW5wdXQobmV3QWN0aXZpdHlUeXBlTGlzdCk7Ci0JCWRsZy5zZXRUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMuY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlKTsKLQkJZGxnLnNldE1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLmNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0KTsKLQkJaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkKLQkJCXJldHVybiBudWxsOwotCi0JCU9iamVjdFtdIHNlbGVjdGlvblJlc3VsdCA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJaWYgKHNlbGVjdGlvblJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBjaG9zZW5BY3Rpdml0eSA9ICgoSW50ZWdlcikgc2VsZWN0aW9uUmVzdWx0WzBdKS5pbnRWYWx1ZSgpOwotCQkKLS8vCQlyZXR1cm4gQ29udmVydEFjdGl2aXR5VHlwZS5jb252ZXJ0QWN0aXZpdHkob2xkQWN0aXZpdHksIGNob3NlbkFjdGl2aXR5LCBjb21tYW5kKTsKLQkJCi0JCXJldHVybiBUeXBlQ29udmVydGVyLmNvbnZlcnRBY3Rpdml0eShvbGRBY3Rpdml0eSwgVHlwZUNvbnZlcnRlci5nZXRBY3Rpdml0eVR5cGUoY2hvc2VuQWN0aXZpdHkpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBsaXN0IG9mIHZhbGlkIG5ldyBhY3Rpdml0eSB0eXBlcyBiYXNlZCBvbiBvbGQgYWN0aXZpdHkgdHlwZQotCSAqIAotCSAqIEBwYXJhbSBvbGRBY3Rpdml0eQotCSAqIAotCSAqIEByZXR1cm4gbGlzdCBvZiB2YWxpZCBhY3Rpdml0eSB0eXBlcwotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRWYWxpZE5ld0FjdGl2aXR5VHlwZXMoQWN0aXZpdHkgb2xkQWN0aXZpdHkpIHsKLQkJaWYgKG9sZEFjdGl2aXR5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSW50ZWdlciBvbGRBY3Rpdml0eUNsYXNzSUQgPSBuZXcgSW50ZWdlcihvbGRBY3Rpdml0eS5lQ2xhc3MoKQotCQkJCS5nZXRDbGFzc2lmaWVySUQoKSk7Ci0JCWlmICghQ29udmVydEFjdGl2aXR5VHlwZS5jb21wYXRpYmxlQWN0aXZpdGllc0xpc3QuY29udGFpbnMob2xkQWN0aXZpdHlDbGFzc0lEKSkKLQkJCXJldHVybiBudWxsOwotCQlMaXN0IGFjdGl2aXR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gQ29udmVydEFjdGl2aXR5VHlwZS5jb21wYXRpYmxlQWN0aXZpdGllc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJbnRlZ2VyIGNvbXBhdGlibGVBY3Rpdml0eVR5cGVDbGFzc0lEID0gKEludGVnZXIpaXRlci5uZXh0KCk7Ci0JCQlpZiAoIW9sZEFjdGl2aXR5Q2xhc3NJRC5lcXVhbHMoY29tcGF0aWJsZUFjdGl2aXR5VHlwZUNsYXNzSUQpICYmCi0JCQkJCWNvbXBhdGlibGVBY3Rpdml0eVR5cGVDbGFzc0lELmludFZhbHVlKCkgIT0gVW1hUGFja2FnZS5DQVBBQklMSVRZX1BBVFRFUk4gJiYKLQkJCQkJY29tcGF0aWJsZUFjdGl2aXR5VHlwZUNsYXNzSUQuaW50VmFsdWUoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1MpCi0JCQkJYWN0aXZpdHlMaXN0LmFkZChjb21wYXRpYmxlQWN0aXZpdHlUeXBlQ2xhc3NJRCk7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXR5TGlzdDsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvTGlicmFyeUJhY2t1cERpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9MaWJyYXJ5QmFja3VwRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllYjViYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9MaWJyYXJ5QmFja3VwRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gYmFjayB1cCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUJhY2t1cERpYWxvZyBleHRlbmRzIFBhdGhTZWxlY3Rpb25EaWFsb2cgewotCi0JcHVibGljIExpYnJhcnlCYWNrdXBEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCVN0cmluZyBkaWFsb2dNZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFBhdGgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dNZXNzYWdlLCBkZWZhdWx0UGF0aCk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVCdXR0b24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgaW50IGlkLCBTdHJpbmcgbGFiZWwsCi0JCQlib29sZWFuIGRlZmF1bHRCdXR0b24pIHsKLQkJQnV0dG9uIGIgPSBzdXBlci5jcmVhdGVCdXR0b24ocGFyZW50LCBpZCwgbGFiZWwsIGRlZmF1bHRCdXR0b24pOwotCQlpZiAoaWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJYi5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5va0J1dHRvbl90ZXh0KTsKLQotCQl9IGVsc2UgaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKSB7Ci0JCQliLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLnNraXBCdXR0b25fdGV4dCk7Ci0JCX0KLQotCQlyZXR1cm4gYjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL09wZW5MaWJyYXJ5RGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL09wZW5MaWJyYXJ5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhYWRlNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9PcGVuTGlicmFyeURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBNZXRob2QgTGlicmFyeSBmb2xkZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciAxLjAKLSAqIAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NjM4Ci0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTGlicmFyeURpYWxvZyBleHRlbmRzIEJhc2VEaWFsb2cgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIEltYWdlIHRpdGxlSW1hZ2U7Ci0KLQlwcml2YXRlIFRleHQgbGlicmFyeVBhdGhUZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmcgbGlicmFyeVBhdGg7Ci0KLQlwcml2YXRlIEJ1dHRvbiBwcm9tcHRGb3JMaWJyYXJ5Q2hlY2tib3g7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiBAcGFyYW0gbGlicmFyeVBhdGgKLQkgKiAgICAgICAgICAgIFBhdGggdG8gYSBNZXRob2QgTGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlEaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgbGlicmFyeVBhdGgpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5saWJyYXJ5UGF0aCA9IGxpYnJhcnlQYXRoOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9ncy5CYXNlRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlzZXRUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZSk7Ci0JCVN0cmluZyBhcHBOYW1lID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKTsKLQkJU3RyaW5nIG9wZW5MaWJEdGV4dCA9IE5MUy5iaW5kKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeU1haW5XaXphcmRQYWdlX3RleHQsCi0JCQkJbmV3IE9iamVjdFtdIHsgYXBwTmFtZX0pOwotCQlzZXRNZXNzYWdlKG9wZW5MaWJEdGV4dCk7Ci0JCXRpdGxlSW1hZ2UgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJPcGVuTGlicmFyeS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZUltYWdlKHRpdGxlSW1hZ2UpOwotCi0JCUNvbXBvc2l0ZSBpbnB1dENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlpbnB1dENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotCQljcmVhdGVMYWJlbChpbnB1dENvbXBvc2l0ZSwgIiAiLCAzKTsgLy8kTk9OLU5MUy0xJAotCi0JCUxhYmVsIGxpYnJhcnlMYWJlbCA9IG5ldyBMYWJlbChpbnB1dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsaWJyYXJ5TGFiZWwuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMubGlicmFyeUxhYmVsX3RleHQpOwotCi0JCWxpYnJhcnlQYXRoVGV4dCA9IG5ldyBUZXh0KGlucHV0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDUwOwotCQlsaWJyYXJ5UGF0aFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJbGlicmFyeVBhdGhUZXh0LnNldFRleHQobGlicmFyeVBhdGgpOwotCQlsaWJyYXJ5UGF0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHN0YXR1cyA9IGlzVmFsaWRQYXRoKGxpYnJhcnlQYXRoVGV4dC5nZXRUZXh0KCkpOwotCQkJCQlpZiAoc3RhdHVzID09IG51bGwpIHsKLQkJCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKTsKLQkJCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihpbnB1dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCVNlbGVjdExpYnJhcnlEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZygKLQkJCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpKTsKLQkJCQkJZGQuc2V0RmlsdGVyUGF0aChsaWJyYXJ5UGF0aFRleHQuZ2V0VGV4dCgpKTsKLQkJCQkJU3RyaW5nIHBhdGggPSBkZC5vcGVuKCk7Ci0JCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJCWxpYnJhcnlQYXRoVGV4dC5zZXRUZXh0KHBhdGgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETzogRGlzcGxheSBhbiBlcnJvciBkaWFsb2cuCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljcmVhdGVMYWJlbChpbnB1dENvbXBvc2l0ZSwgIiAiLCAzKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbChpbnB1dENvbXBvc2l0ZSwgIiAiLCAzKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbChpbnB1dENvbXBvc2l0ZSwgIiAiLCAzKTsgLy8kTk9OLU5MUy0xJAotCQluZXcgTGFiZWwoaW5wdXRDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0KLQkJcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94ID0gbmV3IEJ1dHRvbihpbnB1dENvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94Ci0JCQkJLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLnByb21wdEZvckxpYnJhcnlDaGVja2JveF90ZXh0KTsKLQotCQlzdXBlci5nZXRTaGVsbCgpLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQotCQlzdXBlci5nZXRTaGVsbCgpLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHRpdGxlSW1hZ2UgIT0gbnVsbCAmJiAhdGl0bGVJbWFnZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJdGl0bGVJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQkvKiogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I29wZW4oKQotCSAqLwotCXB1YmxpYyBpbnQgb3BlbigpIHsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQlyZXR1cm4gc3VwZXIub3BlbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBwcm9tcHRGb3JMaWJyYXJ5Q2hlY2tib3gpIHsKLQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCS5zZXRQcm9tcHRGb3JNZXRob2RMaWJyYXJ5QXRTdGFydHVwKHByb21wdEZvckxpYnJhcnlDaGVja2JveAotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3BhbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGlzVmFsaWRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIExpYnJhcnlVSVJlc291cmNlcy5pbnZhbGlkUGF0aF9tc2c7Ci0JCX0KLQotCQlJUGF0aCBlY1BhdGggPSBQYXRoLmZyb21PU1N0cmluZyhwYXRoKTsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZWNQYXRoLmlzVmFsaWRQYXRoKHBhdGgpOwotCQlpZiAoIWlzVmFsaWQpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlSZXNvdXJjZXMuaW52YWxpZFBhdGhfbXNnOwotCQl9IGVsc2UgewotCQkJaWYgKCFTdHJVdGlsLmlzVmFsaWRQdWJsaXNoUGF0aChwYXRoKSkKLQkJCQlyZXR1cm4gTGlicmFyeVVJUmVzb3VyY2VzLmludmFsaWRQYXRoX21zZzsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9ncy5CYXNlRGlhbG9nI2NyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlCi0JICogICAgICBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJbGlicmFyeVBhdGggPSBsaWJyYXJ5UGF0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0UHJvbXB0Rm9yTWV0aG9kTGlicmFyeUF0U3RhcnR1cCghcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgQ2FuY2VsIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKiAKLQkgKiBUT0RPOiBUaGlzIHdpbGwgc2h1dGRvd24gdGhlIEVjbGlwc2UgSURFLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIE1ldGhvZCBMaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIGxpYnJhcnlQYXRoOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9QYXRoU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1BhdGhTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDFjYWUyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1BhdGhTZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuRGlyZWN0b3J5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIAotICogVXRpbGl0eSBjbGFzcyB0byBzZWxlY3QgYSBwYXRoCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBhdGhTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9wYXRoOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX2Jyb3dzZV9idXR0b247Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlOwotCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKLQotCXB1YmxpYyBQYXRoU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsCi0JCQlTdHJpbmcgZGlhbG9nTWVzc2FnZSwgU3RyaW5nIGRlZmF1bHRQYXRoKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQotCQl0aXRsZSA9IGRpYWxvZ1RpdGxlOwotCQltZXNzYWdlID0gZGlhbG9nTWVzc2FnZTsKLQkJdmFsdWUgPSBkZWZhdWx0UGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2J1dHRvblByZXNzZWQoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQl2YWx1ZSA9IGN0cmxfcGF0aC5nZXRUZXh0KCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSB0aGUgcGF0aCBpcyB2YWxpZAotCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlVSVJlc291cmNlcy5wYXRoU2VsZWN0aW9uRXJyb3JfbXNnOwotCQkJaWYgKERpcmVjdG9yeVZhbGlkYXRvci5jaGVja0FuZENyZWF0ZURpcih2YWx1ZSwgdGl0bGUsIG1zZykgPT0gZmFsc2UpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJaWYgKHRpdGxlICE9IG51bGwpCi0JCQlzaGVsbC5zZXRUZXh0KHRpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgT0sgYW5kIENhbmNlbCBidXR0b25zIGJ5IGRlZmF1bHQKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCi0JCS8vIGRvIHRoaXMgaGVyZSBiZWNhdXNlIHNldHRpbmcgdGhlIHRleHQgd2lsbCBzZXQgZW5hYmxlbWVudCBvbiB0aGUgb2sKLQkJLy8gYnV0dG9uCi0JCWN0cmxfcGF0aC5zZXRGb2N1cygpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJY3RybF9wYXRoLnNldFRleHQodmFsdWUpOwotCQkJY3RybF9wYXRoLnNlbGVjdEFsbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkvLyBjcmVhdGUgbWVzc2FnZQotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQobWVzc2FnZSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLQkJCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLk1JTklNVU1fTUVTU0FHRV9BUkVBX1dJRFRIKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlsYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQl9Ci0JCWN0cmxfcGF0aCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQljdHJsX3BhdGguc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQljdHJsX2Jyb3dzZV9idXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljdHJsX2Jyb3dzZV9idXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0JCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJY3RybF9icm93c2VfYnV0dG9uLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLmJyb3dzZUJ1dHRvbl90ZXh0KTsKLQkJY3RybF9icm93c2VfYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW9wZW5EaXJlY3RvcnlEaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBkaXJlY3RvcnkgZGlhbG9nCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlbkRpcmVjdG9yeURpYWxvZygpIHsKLQkJdHJ5IHsKLQkJCS8vIFRleHQgY3RybF9wYXRoID0gc3VwZXIuZ2V0VGV4dCgpOwotCQkJRGlyZWN0b3J5RGlhbG9nIGRkID0gbmV3IERpcmVjdG9yeURpYWxvZyh0aGlzLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJCWRkLnNldEZpbHRlclBhdGgoY3RybF9wYXRoLmdldFRleHQoKSk7Ci0KLQkJCVN0cmluZyBkZXN0aW5hdGlvbiA9IGRkLm9wZW4oKTsKLQkJCWlmIChkZXN0aW5hdGlvbiAhPSBudWxsKSB7Ci0JCQkJY3RybF9wYXRoLnNldFRleHQoZGVzdGluYXRpb24pOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGF0aAotCSAqIEByZXR1cm4gcGF0aAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9TZWxlY3RMaWJyYXJ5RGlyZWN0b3J5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4Y2E3ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9TZWxlY3RMaWJyYXJ5RGlyZWN0b3J5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFByb21wcyB0aGUgdXNlciB0byBzZWxlY3QgYSBtZXRob2QgbGlicmFyeSBmb2xkZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZyB7Ci0KLQlwcml2YXRlIERpcmVjdG9yeURpYWxvZyBkaWFsb2c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgc2hlbGwuCi0JICovCi0JcHVibGljIFNlbGVjdExpYnJhcnlEaXJlY3RvcnlEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXRoaXMocGFyZW50LCBTV1QuTk9ORSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IHNoZWxsLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIGRpYWxvZyBzdHlsZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZyhTaGVsbCBwYXJlbnQsIGludCBzdHlsZSkgewotCQlkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHBhcmVudCwgc3R5bGUpOwotCQlkaWFsb2cuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMuc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190aXRsZSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKExpYnJhcnlVSVJlc291cmNlcy5zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RleHQpOwotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXREZWZhdWx0TGlicmFyeVBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZmlsdGVyIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBmaWx0ZXIgcGF0aC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIE1ha2VzIHRoZSBkaWFsb2cgdmlzaWJsZSBhbmQgYnJpbmdzIGl0IHRvIHRoZSBmcm9udCBvZiB0aGUgZGlzcGxheS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIG9wZW4oKSB7Ci0JCXJldHVybiBkaWFsb2cub3BlbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9Td2l0Y2hDb25maWdEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvU3dpdGNoQ29uZmlnRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyODU3MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9Td2l0Y2hDb25maWdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc3dpdGNoIHRoZSBjdXJyZW50IENvbmZpZ3VyYXRpb24gdG8gYSByZWNvbW1lbmRlZAotICogQ29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN3aXRjaENvbmZpZ0RpYWxvZyB7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gcmVjb21tZW5kZWRDb25maWc7Ci0KLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgc2hlbGwuCi0JICogQHBhcmFtIHJlY29tbWVuZGVkQ29uZmlnCi0JICogICAgICAgICAgICBUaGUgcmVjb21tZW5kZWQgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3dpdGNoQ29uZmlnRGlhbG9nKFNoZWxsIHNoZWxsLCBNZXRob2RDb25maWd1cmF0aW9uIHJlY29tbWVuZGVkQ29uZmlnKSB7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJdGhpcy5yZWNvbW1lbmRlZENvbmZpZyA9IHJlY29tbWVuZGVkQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBkaWFsb2cgaWZmIHRoZSBnaXZlbiByZWNvbW1lbmRlZENvbmZpZyBpcyBkaWZmZXJlbnQgdGhhbiB0aGUKLQkgKiBjdXJyZW50bHkgc2VsZWN0ZWQgY29uZmlnCi0JICogCi0JICogcmV0dXJucyBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEIGlmIGRpYWxvZyB3YXNuJ3Qgc2hvd24sIG9yIGlmIGNvbmZpZyB3YXMKLQkgKiBzd2l0Y2hlZCByZXR1cm5zIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEIGlmIGRpYWxvZyB3YXMgc2hvd24gYW5kIHVzZXIKLQkgKiBkaWQgbm90IGNsaWNrIFllcwotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChyZWNvbW1lbmRlZENvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIHN3aXRjaENvbmZpZ1ByZWYgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRTd2l0Y2hDb25maWcoKTsKLQkJaWYgKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLk5FVkVSLmVxdWFscyhzd2l0Y2hDb25maWdQcmVmKSkgewotCQkJLy8gQ2FsbCB0aGlzIHRvIHJlZnJlc2ggYWN0aXZlIHBhcnQgaWYgbmVlZGVkLgotCQkJLy8gVE9ETzogUmV2aWV3IGltcGxlbWVudGF0aW9uLgotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpICE9IHJlY29tbWVuZGVkQ29uZmlnKSB7Ci0JCQlTdHJpbmcgY29uZmlnTmFtZSA9IHJlY29tbWVuZGVkQ29uZmlnLmdldE5hbWUoKTsKLQkJCWlmIChNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQuZXF1YWxzKHN3aXRjaENvbmZpZ1ByZWYpKSB7Ci0JCQkJTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgZGlhbG9nID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUKLQkJCQkJCS5vcGVuWWVzTm9RdWVzdGlvbihzaGVsbCwKLQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnN3aXRjaENvbmZpZ0RpYWxvZ190aXRsZSwKLQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzCi0JCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5zd2l0Y2hDb25maWdEaWFsb2dfdGV4dCwKLQkJCQkJCQkJCQljb25maWdOYW1lKSwKLQkJCQkJCQkJbnVsbCwgZmFsc2UsIExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksCi0JCQkJCQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLlBSRUZfU1dJVENIX0NPTkZJRyk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwKLQkJCQkJCQkJCWNvbmZpZ05hbWUpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKAotCQkJCQkJCWNvbmZpZyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gQ2FsbCB0aGlzIHRvIHJlZnJlc2ggYWN0aXZlIHBhcnQgaWYgbmVlZGVkLgotCQkJCQkvLyBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uCi0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oCi0JCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuQUxXQVlTLmVxdWFscyhzd2l0Y2hDb25maWdQcmVmKSkgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBjb25maWdOYW1lKTsKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKAotCQkJCQkJY29uZmlnKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9VbmNhbmNlbGFibGVMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1VuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2FmM2FjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1VuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogVGhpcyBkaWFsb2cgZXh0ZW5kcyBqZmFjZSBMaXN0U2VsZWN0aW9uRGlhbG9nIGFuZCByZW1vdmVzIGNhbmNlbCBidXR0b24KLSAgKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4xCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVW5jYW5jZWxhYmxlTGlzdFNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIExpc3RTZWxlY3Rpb25EaWFsb2cgewotCi0JcHVibGljIFVuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE9iamVjdCBpbnB1dCwKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciwKLSAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIFN0cmluZyBtZXNzYWdlKQotCXsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGlucHV0LCBjb250ZW50UHJvdmlkZXIsIGxhYmVsUHJvdmlkZXIsIG1lc3NhZ2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1VzZXJJbnB1dHNEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvVXNlcklucHV0c0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYjNkMmIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvVXNlcklucHV0c0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuVXNlcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoaXMgZGlhbG9nIGFjdHMgYXMgYSBpbnB1dCBkaWFsb2cgZHVyaW5nIGNvbW1hbmQgZXhlY3V0aW9uIGJhc2VkIG9uIHVzZXIKLSAqIGlucHV0IGFuZCBpbnB1dFR5cGUgZGlhbG9nIGJlaGF2aW91ciBjaGFuZ2VzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVzZXJJbnB1dHNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZ2xvYmFsRXJyb3JUeHQgPSAiIjsKLQkKLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCi0JcHJpdmF0ZSBMaXN0IHVzZXJJbnB1dHM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQlMYWJlbCBtZXNzYWdlQXJlYTsKLQotCUxhYmVsIGVycm9yQXJlYTsKLQotCUhhc2hNYXA8T2JqZWN0LE9iamVjdD4gb2xkSW5mb0ZvckNhbmNlbDsKLQkKLQlwcml2YXRlIENvbG9yIHJlZENvbG9yOwotCQotCXB1YmxpYyBVc2VySW5wdXRzRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBMaXN0IHVzZXJJbnB1dHMsIFN0cmluZyB0aXRsZSwKLQkJCVN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCQl0aGlzLnVzZXJJbnB1dHMgPSB1c2VySW5wdXRzOwotCQlvbGRJbmZvRm9yQ2FuY2VsID0gbmV3IEhhc2hNYXA8T2JqZWN0LE9iamVjdD4oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgVHJlZSBWaWV3ZXIuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBVc2VySW5wdXQgdXNlcklucHV0KSB7Ci0JCVRyZWVWaWV3ZXIgdmlld2VyOwotCQlpZiAoIXVzZXJJbnB1dC5pc011bHRpcGxlKCkpIHsKLQkJCXZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl9IGVsc2UgewotCQkJdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJfQotCi0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJewotCQkJc3BlYy53aWR0aEhpbnQgPSAyMDA7Ci0JCQlzcGVjLmhlaWdodEhpbnQgPSAyMDA7Ci0JCQlzcGVjLmhvcml6b250YWxTcGFuID0gMzsKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJfQotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQotCQkJfQotCi0JCX0pOwotCi0JCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl9IGVsc2UgewotCQkJCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQkJfQotCQkJdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0KLQkJCXZpZXdlci5zZXRJbnB1dCh1c2VySW5wdXQuZ2V0Q2hvaWNlcygpKTsKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCS8vIFRPRE86IHRyZWVWaWV3ZXIgU29ydGVyIGFuZCBFeHBhbmQvQ29sbGFwc2UKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBUYWJsZVZpZXdlcgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFVzZXJJbnB1dCB1c2VySW5wdXQpIHsKLQkJVGFibGVWaWV3ZXIgdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBUZXh0IGNvbnRyb2wKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHVzZXJJbnB1dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgVXNlcklucHV0IHVzZXJJbnB1dCkgewotCQlmaW5hbCBVc2VySW5wdXQgbG9jYWxpbnB1dCA9IHVzZXJJbnB1dDsKLQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IgPSB1c2VySW5wdXQuZ2V0VmFsaWRhdG9yKCk7Ci0JCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQllcnJvckFyZWEuc2V0VGV4dCgiIik7Ci0JCQl9Ci0JCX0pOwotCi0JCXRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBlcnJvclR4dCA9ICIiOwotCQkJCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCQllcnJvclR4dCA9IHZhbGlkYXRvci5pc1ZhbGlkKHRleHQuZ2V0VGV4dCgpKTsKLQkJCQkJaWYgKGVycm9yVHh0ICE9IG51bGwgJiYgZXJyb3JUeHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQllcnJvckFyZWEuc2V0VGV4dChlcnJvclR4dCk7Ci0JCQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwkJCQkJCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllcnJvckFyZWEuc2V0VGV4dCgiIik7Ci0JCQkJCX0KLQkJCQkJZ2xvYmFsRXJyb3JUeHQgPSBlcnJvclR4dDsKLQkJCQl9Ci0JCQkJaWYgKGVycm9yVHh0ID09IG51bGwgfHwgZXJyb3JUeHQubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlsb2NhbGlucHV0LnNldElucHV0KHRleHQuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlpZiAodXNlcklucHV0LmdldElucHV0KCkgIT0gbnVsbCkgewotCQkJdGV4dC5zZXRUZXh0KChTdHJpbmcpIHVzZXJJbnB1dC5nZXRJbnB1dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBzZXRJbnB1dCwgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIGl0LgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KFVzZXJJbnB1dCBpbnB1dCwgT2JqZWN0IG9iaikgewotCQlpbnB1dC5zZXRJbnB1dChvYmopOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBDb21ib3ZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogQHBhcmFtIHVzZXJJbnB1dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbWJvVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUsIFVzZXJJbnB1dCB1c2VySW5wdXQpIHsKLQkJZmluYWwgVXNlcklucHV0IGxvY2FsSW5wdXQgPSB1c2VySW5wdXQ7Ci0JCWZpbmFsIElWYWxpZGF0b3IgdmFsaWRhdG9yID0gdXNlcklucHV0LmdldFZhbGlkYXRvcigpOwotCQlmaW5hbCBDb21ib1ZpZXdlciB2aWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tcG9zaXRlKTsKLQkJdmlld2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YSgKLQkJCQluZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlpZiAodXNlcklucHV0LmdldExhYmVsUHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcih1c2VySW5wdXQuZ2V0TGFiZWxQcm92aWRlcigpKTsKLQkJfQotCQlMaXN0IGNob2ljZXMgPSB1c2VySW5wdXQuZ2V0Q2hvaWNlcygpOwotCQl2aWV3ZXIuc2V0SW5wdXQoY2hvaWNlcyk7Ci0JCWlmIChjaG9pY2VzICE9IG51bGwgJiYgY2hvaWNlcy5zaXplKCkgPiAwKSB7Ci0JCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNob2ljZXMuZ2V0KDApKSk7Ci0JCQlsb2NhbElucHV0LnNldElucHV0KGNob2ljZXMuZ2V0KDApKTsKLQkJfQotCQl2aWV3ZXIuZ2V0Q29tYm8oKS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIGVycm9yVHh0ID0gIiI7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLmlzVmFsaWQoc2VsZWN0ZWQuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCWVycm9yVHh0ID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQkJaWYgKGVycm9yVHh0ICE9IG51bGwgJiYgZXJyb3JUeHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWVycm9yQXJlYS5zZXRUZXh0KGVycm9yVHh0KTsKLQkJCQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9IGlmIChnbG9iYWxFcnJvclR4dCAhPSBudWxsICYmIGdsb2JhbEVycm9yVHh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQllcnJvckFyZWEuc2V0VGV4dChnbG9iYWxFcnJvclR4dCk7Ci0JCQkJCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJZXJyb3JBcmVhLnNldFRleHQoIiIpOwotCQkJfQotCQl9KTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZXJyb3JBcmVhLnNldFRleHQoIiIpOwotCi0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCU9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIGVycm9yVHh0ID0gIiI7Ci0JCQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLmlzVmFsaWQob2JqKTsKLQkJCQkJaWYgKHN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCQkJZXJyb3JUeHQgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChlcnJvclR4dCAhPSBudWxsICYmIGVycm9yVHh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJZXJyb3JBcmVhLnNldFRleHQoZXJyb3JUeHQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGdsb2JhbEVycm9yVHh0ICE9IG51bGwgJiYgZ2xvYmFsRXJyb3JUeHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQllcnJvckFyZWEuc2V0VGV4dChnbG9iYWxFcnJvclR4dCk7Ci0JCQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCWVycm9yQXJlYS5zZXRUZXh0KCIiKTsKLQkJCQl9Ci0JCQkJaWYgKGVycm9yVHh0ID09IG51bGwgfHwgZXJyb3JUeHQubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlsb2NhbElucHV0LnNldElucHV0KG9iaik7Ci0JCQkJfQotCQkJfQotCQl9KTsJCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgTGFiZWwgYW5kIFRleHQgZm9yIG1lc3NhZ2UgYXJlYS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVNZXNzYWdlQXJlYShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCW1lc3NhZ2VBcmVhID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlQXJlYS5zZXRUZXh0KG1lc3NhZ2UpOwotCQl9Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaGVpZ2h0SGludCA9IDI1OwotCQlnZC5taW5pbXVtV2lkdGggPSA0MDA7Ci0JCW1lc3NhZ2VBcmVhLnNldExheW91dERhdGEoZ2QpOwotCQlhcHBseURpYWxvZ0ZvbnQobWVzc2FnZUFyZWEpOwotCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlHcmlkRGF0YSBnZDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QxLmhvcml6b250YWxTcGFuID0gMjsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QxKTsKLQkJcmV0dXJuIG1lc3NhZ2VBcmVhOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCi0JCWNyZWF0ZU1lc3NhZ2VBcmVhKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gQ3JlYXRlIGNvbnRyb2xzIGJhc2VkIG9uIFVzZXJJbnB1dHMKLQkJaWYgKHVzZXJJbnB1dHMgIT0gbnVsbCAmJiB1c2VySW5wdXRzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB1c2VySW5wdXRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBVc2VySW5wdXQpIHsKLQkJCQkJVXNlcklucHV0IHVzZXJJbnB1dCA9IChVc2VySW5wdXQpIG9iamVjdDsKLQotCQkJCQkvLyBTdG9yZSB0aGUgdXNlcklucHV0IGluIHRoZSBoYXNobWFwIGZvciBjYW5jZWwgYWN0aW9uLgotCQkJCQlvbGRJbmZvRm9yQ2FuY2VsLnB1dCh1c2VySW5wdXQsIHVzZXJJbnB1dC5nZXRJbnB1dCgpKTsKLQotCQkJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQkJbGFiZWwuc2V0VGV4dCh1c2VySW5wdXQuZ2V0TGFiZWwoKSk7Ci0JCQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCQkJCWlmICh1c2VySW5wdXQuZ2V0VHlwZSgpID09IFVzZXJJbnB1dC5URVhUKSB7Ci0JCQkJCQljcmVhdGVUZXh0KGNvbXBvc2l0ZSwgdXNlcklucHV0KTsKLQkJCQkJfSBlbHNlIGlmICh1c2VySW5wdXQuZ2V0VHlwZSgpID09IFVzZXJJbnB1dC5TRUxFQ1RJT04pIHsKLQkJCQkJCWNyZWF0ZUNvbWJvVmlld2VyKGNvbXBvc2l0ZSwgdXNlcklucHV0KTsKLQkJCQkJfQotCQkJCQkvLyBjcmVhdGVFbXB0eUxhYmVsKGNvbXBvc2l0ZSwgMik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNyZWF0ZUVycm9yQXJlYShjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBFcnJvciBBcmVhLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRXJyb3JBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gY3JlYXRlIGJsYW5rIGxhYmVsCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQotCQllcnJvckFyZWEgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCXJlZENvbG9yID0gbmV3IENvbG9yKG51bGwsIG5ldyBSR0IoMjU1LCAwLCAwKSk7Ci0JCWlmKHJlZENvbG9yICE9IG51bGwpewotCQkJZXJyb3JBcmVhLnNldEZvcmVncm91bmQocmVkQ29sb3IpOwotCQl9Ci0JCS8vIGlmKGVycm9yVHh0ICE9IG51bGwgJiYgZXJyb3JUeHQubGVuZ3RoKCkgPjApewotCQkvLyBlcnJvckFyZWEuc2V0VGV4dChlcnJvclR4dCk7Ci0JCS8vIH0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlnZC5oZWlnaHRIaW50ID0gMjU7Ci0JCWVycm9yQXJlYS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYXBwbHlEaWFsb2dGb250KGVycm9yQXJlYSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJaWYgKHRoaXMudGl0bGUgIT0gbnVsbCkgewotCQkJbmV3U2hlbGwuc2V0VGV4dCh0aGlzLnRpdGxlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjb2tQcmVzc2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXJlc3VsdCA9IHRydWU7CQkKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjYW5jZWxQcmVzc2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCQlpZiAodXNlcklucHV0cyAhPSBudWxsICYmIHVzZXJJbnB1dHMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHVzZXJJbnB1dHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFVzZXJJbnB1dCkgewotCQkJCQlVc2VySW5wdXQgdXNlcklucHV0ID0gKFVzZXJJbnB1dCkgb2JqZWN0OwotCQkJCQl1c2VySW5wdXQuc2V0SW5wdXQob2xkSW5mb0ZvckNhbmNlbC5nZXQodXNlcklucHV0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHRzLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCWlmKHJlZENvbG9yICE9IG51bGwpewotCQkJcmVkQ29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQkvKioKLQkgKiBDcmVhdGUgYSBlbXB0eSBsYWJlbC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogQHBhcmFtIHNwYW4KLQkgKi8KLQkvLyBwcml2YXRlIHZvaWQgY3JlYXRlRW1wdHlMYWJlbChDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgc3Bhbil7Ci0JLy8gTGFiZWwgZW1wdHlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkvLyBlbXB0eUxhYmVsLnNldEJhY2tncm91bmQoQ29sb3JzLklOSEVSSVRFRF9FTEVNRU5UX0xBQkVMKTsKLQkvLyBHcmlkRGF0YSBlbXB0eURhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkvLyBlbXB0eUxhYmVsLnNldFRleHQoIiIpOwotCS8vIGVtcHR5RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCS8vIGVtcHR5RGF0YS5ob3Jpem9udGFsU3BhbiA9c3BhbjsKLQkvLyBlbXB0eURhdGEuaGVpZ2h0SGludCA9IDM7Ci0JLy8gZW1wdHlMYWJlbC5zZXRMYXlvdXREYXRhKGVtcHR5RGF0YSk7Ci0JLy8gfQotCS8qKgotCSAqIHZhbGlkYXRlcyB0aGUgaW5wdXQgd2l0aCBnaXZlbiBWYWxpZGF0b3IgaW4gVXNlcklucHV0LgotCSAqLwotCS8vIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1c2VySW5wdXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIFVzZXJJbnB1dCBlbGVtZW50ID0gKFVzZXJJbnB1dCkgaXRlci5uZXh0KCk7Ci0JLy8gSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBlbGVtZW50LmdldFZhbGlkYXRvcigpOwotCS8vIGlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCS8vIGlmIChlbGVtZW50LmdldFR5cGUoKSA9PSBVc2VySW5wdXQuVEVYVCkgewotCS8vIGVycm9yVHh0ICs9IHZhbGlkYXRvcgotCS8vIC5pc1ZhbGlkKGVsZW1lbnQuZ2V0SW5wdXQoKS50b1N0cmluZygpKTsKLQkvLyB9IGVsc2UgewotCS8vIGVycm9yVHh0ICs9IHZhbGlkYXRvci5pc1ZhbGlkKGVsZW1lbnQuZ2V0SW5wdXQoKSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gZXJyb3JUeHQgPSAiU3lzdGVtIG91dCB0ZXN0aW5nIjsKLQkvLyBpZiAoZXJyb3JUeHQgIT0gbnVsbCAmJiBlcnJvclR4dC5sZW5ndGgoKSA+IDApIHsKLQkvLyBlcnJvckFyZWEuc2V0VGV4dChlcnJvclR4dCk7Ci0JLy8gZXJyb3JBcmVhLnNldEZvcmVncm91bmQoQ29sb3JDb25zdGFudHMucmVkKTsKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vIHJldHVybiB0cnVlOwotCS8vIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0MDA3NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBkaWFsb2dzIGZvciBtYW5hZ2luZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQxMzZhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNb2RlbHMgdGhlIDxuZXdMaWJyYXJ5V2l6YXJkUGFnZT4gZWxlbWVudCBpbiB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicnJheS51aS5uZXdMaWJyYXJ5V2l6YXJkUGFnZXMiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiB0aGF0IGNvbnRyaWJ1dGVkIHRoaXMgcHJvdmlkZXIuCi0JcHJpdmF0ZSBCdW5kbGUgYnVuZGxlOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIGNsYXNzIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0JLy8gVGhlIGxpYnJhcnkgdHlwZSBpZGVudGlmaWVyLgotCXByaXZhdGUgU3RyaW5nIHR5cGVJZDsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSB0aXRsZS4KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSBkZXNjcmlwdGlvbi4KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc05hbWUsCi0JCQlTdHJpbmcgdHlwZUlkLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCXRoaXMudHlwZUlkID0gdHlwZUlkOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnLWluIHRoYXQgY29udHJpYnV0ZWQgdGhpcyBwcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZSgpIHsKLQkJcmV0dXJuIGJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSBjbGFzcyBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUgaWRlbnRpZmllci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLQkJcmV0dXJuIHR5cGVJZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSB0aXRsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRkNzdjNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIE1vZGVscyB0aGUgPG9wZW5MaWJyYXJ5V2l6YXJkUGFnZT4gZWxlbWVudCBpbiB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicnJheS51aS5vcGVuTGlicmFyeVdpemFyZFBhZ2VzIiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uIHsKLQotCS8vIFRoZSBwbHVnLWluIHRoYXQgY29udHJpYnV0ZWQgdGhpcyBwcm92aWRlci4KLQlwcml2YXRlIEJ1bmRsZSBidW5kbGU7Ci0KLQkvLyBUaGUgd2l6YXJkIHBhZ2UgY2xhc3MgbmFtZS4KLQlwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0KLQkvLyBUaGUgbGlicmFyeSB0eXBlIGlkZW50aWZpZXIuCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZUlkOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIHRpdGxlLgotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIGRlc2NyaXB0aW9uLgotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc05hbWUsCi0JCQlTdHJpbmcgdHlwZUlkLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCXRoaXMudHlwZUlkID0gdHlwZUlkOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnLWluIHRoYXQgY29udHJpYnV0ZWQgdGhpcyBwcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZSgpIHsKLQkJcmV0dXJuIGJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSBjbGFzcyBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUgaWRlbnRpZmllci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLQkJcmV0dXJuIHR5cGVJZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSB0aXRsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZDMyZGUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBVSSBzdXBwcG9ydCBmb3IgbWFuYWdpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5VUlQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVVJUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmQwNWNjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5VUlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBMaWJyYXJ5IFVJIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlVSVByZWZlcmVuY2VzIHsKLQotCS8qKgotCSAqIFRoZSBMaWJyYXJ5IFVJIHByZWZlcmVuY2Uga2V5cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9NUFRfRk9SX0xJQlJBUllfQVRfU1RBUlRVUCA9ICJwcm9tcHRGb3JMaWJyYXJ5QXRTdGFydHVwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfTElCUkFSWV9QQVRIID0gInNhdmVkTGlicmFyeVBhdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCA9ICJwdWJsaXNoVW5vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TV0lUQ0hfQ09ORklHID0gInN3aXRjaENvbmZpZ3VyYXRpb25PblByb2Nlc3NBY3RpdmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTiA9ICJwdWJsaXNoQWN0aXZpdHlEaWFncmFtZm9yQWN0aXZpdHlFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9TSE9SVF9OQU1FID0gImFwcG5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0xJQlJBUllfUEFUSFMgPSAibmV3TGlicmFyeVBhdGhzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fTElCUkFSWV9QQVRIUyA9ICJvcGVuTGlicmFyeVBhdGhzIjsgLy8kTk9OLU5MUy0xJAkJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9MSUJSQVJZX1VSSVMgPSAib3BlbkxpYnJhcnlVUklzIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoUFJPTVBUX0ZPUl9MSUJSQVJZX0FUX1NUQVJUVVAsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KFNBVkVEX0xJQlJBUllfUEFUSCwgIiIpOyAvLyROT04tTkxTLTEkCQotCQlzdG9yZS5zZXREZWZhdWx0KFBSRUZfU1dJVENIX0NPTkZJRywgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChORVdfTElCUkFSWV9QQVRIUywgZ2V0RGVmYXVsdExpYnJhcnlQYXRoKCkpOwotCQlzdG9yZS5zZXREZWZhdWx0KE9QRU5fTElCUkFSWV9QQVRIUywgZ2V0RGVmYXVsdExpYnJhcnlQYXRoKCkpOwotCQlzdG9yZS5zZXREZWZhdWx0KE9QRU5fTElCUkFSWV9VUklTLCAiIik7IC8vJE5PTi1OTFMtMSQJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvbXB0IGZvciBNZXRob2QgTGlicmFyeSBhdCBzdGFydHVwIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpcyB0aGUgcHJlZmVyZW5jZSBpcyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFByb21wdEZvck1ldGhvZExpYnJhcnlBdFN0YXJ0dXAoKSB7Ci0JCXJldHVybiBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oCi0JCQkJUFJPTVBUX0ZPUl9MSUJSQVJZX0FUX1NUQVJUVVApOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHByb21wdCBmb3IgTWV0aG9kIExpYnJhcnkgYXQgc3RhcnR1cCBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFByb21wdEZvck1ldGhvZExpYnJhcnlBdFN0YXJ0dXAoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJUFJPTVBUX0ZPUl9MSUJSQVJZX0FUX1NUQVJUVVAsIGVuYWJsZWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZChib29sZWFuIGVuYWJsZWQpIHsKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCwgZW5hYmxlZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKCkgewotCQlyZXR1cm4gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCVBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0REKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXR0ZXIgbWV0aG9kIGZvciBQdWJsaXNoIEFjdGl2aXR5IERpYWdyYW0gZm9yIEFjdGl2aXR5IEV4dGVuc2lvbiwKLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihib29sZWFuIGVuYWJsZWQpIHsKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlQVUJMSVNIX0FEX0ZPUl9BQ1RJVklUWV9FWFRFTlNJT04sIGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIGdldHRlciBtZXRob2QgZm9yIFB1Ymxpc2ggQWN0aXZpdHkgRGlhZ3JhbSBmb3IgQWN0aXZpdHkgRXh0ZW5zaW9uIGZsYWcKLQkgKiBmcm9tIHByZWZlcmVuY2Ugc3RvcmUsCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCVBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzd2l0Y2ggY29uZmlndXJhdGlvbiB2YWx1ZSBzdG9yZSBpbiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHJldHVybiB2YWx1ZSAtIGNvdWxkIGJlIEFMV0FZUywgTkVWRVIsIFBST01QVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN3aXRjaENvbmZpZygpIHsKLQkJcmV0dXJuIExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCVBSRUZfU1dJVENIX0NPTkZJRyk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgc3dpdGNoIGNvbmZpZ3VyYXRpb24gdmFsdWUgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVmFsdWUgY291bGQgYmUgQUxXQVlTLCBORVZFUiwgUFJPTVBUCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFN3aXRjaENvbmZpZyhTdHJpbmcgdmFsdWUpIHsKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlQUkVGX1NXSVRDSF9DT05GSUcsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBNZXRob2QgTGlicmFyeSBwYXRoIHRoYXQgd2FzIHNhdmVkIGluIGEgcHJldmlvdXMgc2Vzc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzYXZlZCBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2F2ZWRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCVNBVkVEX0xJQlJBUllfUEFUSCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgYSBNZXRob2QgTGlicmFyeSBwYXRoIHRvIHRoZSBMaWJyYXJ5IFVJIHByZWZlcmVuY2Ugc3RvcmUuCi0JICogCi0JICogQHBhcmFtIGxpYlBhdGgKLQkgKiAgICAgICAgICAgIFBhdGggdG8gYSBNZXRob2QgTGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2F2ZWRMaWJyYXJ5UGF0aChTdHJpbmcgbGliUGF0aCkgewotCQlTdHJpbmcgcGF0aCA9IGxpYlBhdGg7Ci0JCWlmIChwYXRoLmVuZHNXaXRoKE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTElCUkFSWV9NT0RFTF9GSUxFTkFNRSkpIHsKLQkJCXBhdGggPSBGaWxlVXRpbC5nZXRQYXJlbnREaXJlY3RvcnkocGF0aCk7Ci0JCX0KLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlTQVZFRF9MSUJSQVJZX1BBVEgsIHBhdGgpOwotCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgTWV0aG9kIExpYnJhcnkgcGF0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IE1ldGhvZCBMaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdExpYnJhcnlQYXRoKCkgewotCQlTdHJpbmcgdXNlckhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpLnJlcGxhY2UoJ1xcJywgJy8nKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGlicmFyeVBhdGggPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZygKLQkJCQkibGlicmFyeVBhdGgiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobGlicmFyeVBhdGggPT0gbnVsbCB8fCBsaWJyYXJ5UGF0aC5sZW5ndGgoKSA9PSAwCi0JCQkJfHwgbGlicmFyeVBhdGguc3RhcnRzV2l0aCgiWyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWxpYnJhcnlQYXRoID0gdXNlckhvbWUgKyAiL01ldGhvZCBMaWJyYXJpZXMvTGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChsaWJyYXJ5UGF0aC5zdGFydHNXaXRoKCI8dXNlci5ob21lPiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWxpYnJhcnlQYXRoID0gdXNlckhvbWUgKyBsaWJyYXJ5UGF0aC5zdWJzdHJpbmcoMTEpOwotCQl9Ci0JCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIikuZXF1YWxzKCJcXCIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbGlicmFyeVBhdGggPSBsaWJyYXJ5UGF0aC5yZXBsYWNlKCcvJywgJ1xcJyk7Ci0JCX0KLQotCQlpbnQgaWR4ID0gLTE7Ci0JCWlmICgoaWR4ID0gbGlicmFyeVBhdGguaW5kZXhPZigiPGFwcC5uYW1lPiIpKSA+PSAwKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhcHBOYW1lUHJvcGVyID0gTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJLmdldEFwcGxpY2F0aW9uU2hvcnROYW1lKCk7Ci0JCQlsaWJyYXJ5UGF0aCA9IGxpYnJhcnlQYXRoLnN1YnN0cmluZygwLCBpZHgpICsgYXBwTmFtZVByb3BlcgotCQkJCQkrIGxpYnJhcnlQYXRoLnN1YnN0cmluZyhpZHggKyAxMCk7Ci0JCX0KLQotCQlyZXR1cm4gbGlicmFyeVBhdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXBwbGljYXRpb24gc2hvcnQgbmFtZSBwYXNzZWQgaW4gdGhlIG1haW4gZmVhdHVyZSdzCi0JICogcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHBhc3NlZC1pbiBhcHBsaWNhdGlvbiBzaG9ydCBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uU2hvcnROYW1lKCkgewotCQlTdHJpbmcgYXBwbmFtZSA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkuZ2V0U3RyaW5nKEFQUExJQ0FUSU9OX1NIT1JUX05BTUUpOwotCQlyZXR1cm4gYXBwbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuZXcgbGlicmFyeSBwYXRocyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWV0aG9kIGxpYnJhcnkgcGF0aHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE5ld0xpYnJhcnlQYXRocygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldFN0cmluZ1ZhbHVlcyhMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLCBORVdfTElCUkFSWV9QQVRIUyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV3IGxpYnJhcnkgcGF0aHMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBtZXRob2QgbGlicmFyeSBwYXRocwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXROZXdMaWJyYXJ5UGF0aHNMaXN0KCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0TGlzdChMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLCBORVdfTElCUkFSWV9QQVRIUyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG1ldGhvZCBsaWJyYXJ5IHBhdGggdG8gdGhlIG5ldyBsaWJyYXJ5IHBhdGhzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGROZXdMaWJyYXJ5UGF0aChTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlMaXN0IHBhdGhzID0gZ2V0TmV3TGlicmFyeVBhdGhzTGlzdCgpOwotCQkJcGF0aHMucmVtb3ZlKHBhdGgpOwotCQkJcGF0aHMuYWRkKDAsIHBhdGgpOwotCQkJLy8gRklYTUUhIFJlYWQgZnJvbSBnbG9iYWwgcHJlZmVyZW5jZS4KLQkJCWlmIChwYXRocy5zaXplKCkgPiAxMCkgewotCQkJCXBhdGhzID0gcGF0aHMuc3ViTGlzdCgwLCAxMCk7Ci0JCQkJcGF0aHMuc2V0KDksIGdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQkJCX0KLQkJCVByZWZlcmVuY2VVdGlsLnNldExpc3QoTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksIE5FV19MSUJSQVJZX1BBVEhTLCBwYXRocyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcGVuIGxpYnJhcnkgcGF0aHMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1ldGhvZCBsaWJyYXJ5IHBhdGhzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRPcGVuTGlicmFyeVBhdGhzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0U3RyaW5nVmFsdWVzKExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksIE9QRU5fTElCUkFSWV9QQVRIUyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3BlbiBsaWJyYXJ5IHBhdGhzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgbWV0aG9kIGxpYnJhcnkgcGF0aHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3BlbkxpYnJhcnlQYXRoc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksIE9QRU5fTElCUkFSWV9QQVRIUyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG1ldGhvZCBsaWJyYXJ5IHBhdGggdG8gdGhlIG9wZW4gbGlicmFyeSBwYXRocyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5IHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkT3BlbkxpYnJhcnlQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCUxpc3QgcGF0aHMgPSBnZXRPcGVuTGlicmFyeVBhdGhzTGlzdCgpOwotCQkJcGF0aHMucmVtb3ZlKHBhdGgpOwotCQkJcGF0aHMuYWRkKDAsIHBhdGgpOwotCQkJLy8gRklYTUUhIFJlYWQgZnJvbSBnbG9iYWwgcHJlZmVyZW5jZS4KLQkJCWlmIChwYXRocy5zaXplKCkgPiAxMCkgewotCQkJCXBhdGhzID0gcGF0aHMuc3ViTGlzdCgwLCAxMCk7Ci0JCQkJcGF0aHMuc2V0KDksIGdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQkJCX0KLQkJCVByZWZlcmVuY2VVdGlsLnNldExpc3QoTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksIE9QRU5fTElCUkFSWV9QQVRIUywgcGF0aHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3BlbiBsaWJyYXJ5IFVSSXMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBtZXRob2QgbGlicmFyeSBVUklzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRPcGVuTGlicmFyeVVSSXMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMoTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwgT1BFTl9MSUJSQVJZX1VSSVMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wZW4gbGlicmFyeSBVUklzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgbWV0aG9kIGxpYnJhcnkgVVJJcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRPcGVuTGlicmFyeVVSSXNMaXN0KCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0TGlzdChMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLCBPUEVOX0xJQlJBUllfVVJJUyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG1ldGhvZCBsaWJyYXJ5IFVSSSB0byB0aGUgb3BlbiBsaWJyYXJ5IFVSSXMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5IFVSSQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPcGVuTGlicmFyeVVSSShTdHJpbmcgdXJpKSB7Ci0JCWlmICh1cmkgIT0gbnVsbCkgewotCQkJTGlzdCBsaWJyYXJ5VVJJcyA9IGdldE9wZW5MaWJyYXJ5UGF0aHNMaXN0KCk7Ci0JCQlsaWJyYXJ5VVJJcy5yZW1vdmUodXJpKTsKLQkJCWxpYnJhcnlVUklzLmFkZCgwLCB1cmkpOwotCQkJLy8gRklYTUUhIFJlYWQgZnJvbSBnbG9iYWwgcHJlZmVyZW5jZS4KLQkJCWlmIChsaWJyYXJ5VVJJcy5zaXplKCkgPiAxMCkgewotCQkJCWxpYnJhcnlVUklzID0gbGlicmFyeVVSSXMuc3ViTGlzdCgwLCAxMCk7Ci0JCQl9Ci0JCQlQcmVmZXJlbmNlVXRpbC5zZXRMaXN0KExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLCBPUEVOX0xJQlJBUllfVVJJUywgbGlicmFyeVVSSXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBhbGwgcHJlZmVyZW5jZXMKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUFsbFByZWZlcmVuY2VzKCkgewotCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvUmVjZW50bHlPcGVuZWRMaWJyYXJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9SZWNlbnRseU9wZW5lZExpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDFlYTMxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9SZWNlbnRseU9wZW5lZExpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci0KLS8qKgotICogTW9kZWxzIGEgcmVjZW50bHkgb3BlbmVkIG1ldGhvZCBsaWJyYXJ5IHByZWZlcmVuY2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICovCi1wdWJsaWMgY2xhc3MgUmVjZW50bHlPcGVuZWRMaWJyYXJ5IHsKLQotCXByaXZhdGUgVVJJIHVyaTsKLQkKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQotCXByaXZhdGUgU3RyaW5nIHBhdGg7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSZWNlbnRseU9wZW5lZExpYnJhcnkoU3RyaW5nIHVyaSkgewotCQl0cnkgewotCQkJdGhpcy51cmkgPSBuZXcgVVJJKHVyaSk7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh0aGlzLnVyaSk7Ci0JCQl0aGlzLm5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJCXRoaXMucGF0aCA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgVVJJLgotCSAqLwotCXB1YmxpYyBVUkkgZ2V0VVJJKCkgewotCQlyZXR1cm4gdXJpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKLQl9CQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5ODU4YTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciBtYW5hZ2luZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YzljNjU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIGEgcHJvY2VzcyB0cmVlLgotICogPHA+Ci0gKiBEaXNwbGF5cyB0aGUgdHJlZSBpbiB0aGUgZm9sbG93aW5nIGhpZXJhcmNoeToKLSAqIDx1bD4KLSAqIDxsaT5tZXRob2RfcGx1Z2luXzE8L2xpPgotICogPHVsPgotICogPGxpPiJDYXBhYmlsaXR5IFBhdHRlcm5zIiBVSSBmb2xkZXI8L2xpPgotICogPHVsPgotICogPGxpPmNhcGFiaWxpdHlfcGF0dGVybl8xPC9saT4KLSAqIDxsaT5jYXBhYmlsaXR5X3BhdHRlcm5fMjwvbGk+Ci0gKiA8L3VsPgotICogPC9saT4KLSAqIDxsaT4iRGVsaXZlcnkgUHJvY2Vzc2VzIiBVSSBmb2xkZXI8L2xpPgotICogPHVsPgotICogPGxpPmRlbGl2ZXJ5X3Byb2Nlc3NfMTwvbGk+Ci0gKiA8bGk+ZGVsaXZlcnlfcHJvY2Vzc18yPC9saT4KLSAqIDwvdWw+Ci0gKiA8L2xpPgotICogPC91bD4KLSAqIDwvbGk+Ci0gKiA8bGk+bWV0aG9kX3BsdWdpbl8yPC9saT4KLSAqIDx1bD4KLSAqIDxsaT4iQ2FwYWJpbGl0eSBQYXR0ZXJucyIgVUkgZm9sZGVyPC9saT4KLSAqIDwvbGk+Ci0gKiA8bGk+IkRlbGl2ZXJ5IFByb2Nlc3NlcyIgVUkgZm9sZGVyPC9saT4KLSAqIDwvbGk+Ci0gKiA8L3VsPgotICogPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQQUJJTElUWV9QQVRURVJOUyA9IExpYnJhcnlVSVJlc291cmNlcy5jYXBhYmlsaXR5UGF0dGVybl90ZXh0X3BsdXJhbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJVkVSWV9QUk9DRVNTRVMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfTElTVCA9IG5ldyBPYmplY3RbMF07Ci0KLQlwcml2YXRlIE1hcDxNZXRob2RQbHVnaW4sIFByb2Nlc3NUcmVlVUlGb2xkZXI+IGNhcGFiaWxpdHlQYXR0ZXJuVUlGb2xkZXJzID0gbmV3IEhhc2hNYXA8TWV0aG9kUGx1Z2luLCBQcm9jZXNzVHJlZVVJRm9sZGVyPigpOwotCi0JcHJpdmF0ZSBNYXA8TWV0aG9kUGx1Z2luLCBQcm9jZXNzVHJlZVVJRm9sZGVyPiBkZWxpdmVyeVByb2Nlc3NVSUZvbGRlcnMgPSBuZXcgSGFzaE1hcDxNZXRob2RQbHVnaW4sIFByb2Nlc3NUcmVlVUlGb2xkZXI+KCk7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJTGlzdCBwbHVnaW5zID0gKChNZXRob2RMaWJyYXJ5KSBwYXJlbnRFbGVtZW50KS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCQlMaXN0IHByb2Nlc3NlcyA9IFRuZ1V0aWwuZ2V0QWxsUHJvY2Vzc2VzKHBsdWdpbik7Ci0JCQkJaWYgKHByb2Nlc3Nlcy5zaXplKCkgPiAwKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChwbHVnaW4pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHBhcmVudEVsZW1lbnQ7Ci0KLQkJCVByb2Nlc3NUcmVlVUlGb2xkZXIgY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlciA9IGNhcGFiaWxpdHlQYXR0ZXJuVUlGb2xkZXJzCi0JCQkJCS5nZXQocGx1Z2luKTsKLQkJCWlmIChjYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVyID09IG51bGwpIHsKLQkJCQljYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVyID0gbmV3IFByb2Nlc3NUcmVlVUlGb2xkZXIoCi0JCQkJCQlDQVBBQklMSVRZX1BBVFRFUk5TLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucyIpLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCWNhcGFiaWxpdHlQYXR0ZXJuVUlGb2xkZXJzLnB1dChwbHVnaW4sCi0JCQkJCQljYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVyKTsKLQkJCX0KLQotCQkJUHJvY2Vzc1RyZWVVSUZvbGRlciBkZWxpdmVyeVByb2Nlc3NVSUZvbGRlciA9IGRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVycwotCQkJCQkuZ2V0KHBsdWdpbik7Ci0JCQlpZiAoZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXIgPT0gbnVsbCkgewotCQkJCWRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVyID0gbmV3IFByb2Nlc3NUcmVlVUlGb2xkZXIoCi0JCQkJCQlERUxJVkVSWV9QUk9DRVNTRVMsCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzZXMiKSwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlkZWxpdmVyeVByb2Nlc3NVSUZvbGRlcnMucHV0KHBsdWdpbiwgZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXIpOwotCQkJfQotCi0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlciwKLQkJCQkJZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXIgfTsKLQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1RyZWVVSUZvbGRlcikgewotCQkJUHJvY2Vzc1RyZWVVSUZvbGRlciB1aUZvbGRlciA9IChQcm9jZXNzVHJlZVVJRm9sZGVyKSBwYXJlbnRFbGVtZW50OwotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHVpRm9sZGVyLmdldFBhcmVudCgpOwotCQkJaWYgKHVpRm9sZGVyLmdldE5hbWUoKSA9PSBDQVBBQklMSVRZX1BBVFRFUk5TKSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDYXBhYmlsaXR5UGF0dGVybnMocGx1Z2luKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlVXRpbC5nZXREZWxpdmVyeVByb2Nlc3NlcyhwbHVnaW4pCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBFTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1RyZWVVSUZvbGRlcikgewotCQkJcmV0dXJuICgoUHJvY2Vzc1RyZWVVSUZvbGRlcikgZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbAotCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChDYXBhYmlsaXR5UGF0dGVybikgZWxlbWVudCk7Ci0JCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlcnMuZ2V0KHBsdWdpbik7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwKLQkJCQkJLmdldE1ldGhvZFBsdWdpbigoRGVsaXZlcnlQcm9jZXNzKSBlbGVtZW50KTsKLQkJCXJldHVybiBkZWxpdmVyeVByb2Nlc3NVSUZvbGRlcnMuZ2V0KHBsdWdpbik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQljYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVycy5jbGVhcigpOwotCQlkZWxpdmVyeVByb2Nlc3NVSUZvbGRlcnMuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlYTE2NWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgcHJvY2VzcyB0cmVlIHZpZXdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJbmV3IFVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1RyZWVMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1RyZWVVSUZvbGRlcikgewotCQkJcmV0dXJuICgoUHJvY2Vzc1RyZWVVSUZvbGRlcikgb2JqKS5nZXROYW1lKCk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChvYmopOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGFiZWxQcm92aWRlciNnZXRJbWFnZShPYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NUcmVlVUlGb2xkZXIpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NUcmVlVUlGb2xkZXIpIG9iaikuZ2V0SW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXRJbWFnZShvYmopOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVVSUZvbGRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVVSUZvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5M2VlZTFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVUlGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIE1vZGVscyBhIFVJIGZvbGRlciBpbiB0aGUgcHJvY2VzcyB0cmVlIHZpZXdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVHJlZVVJRm9sZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlIERFRkFVTFRfSU1BR0UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0ZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIGZvbGRlcgotCSAqLwotCXB1YmxpYyBQcm9jZXNzVHJlZVVJRm9sZGVyKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMobmFtZSwgREVGQVVMVF9JTUFHRSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgZm9sZGVyCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1RyZWVVSUZvbGRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHBhcmVudCkgewotCQl0aGlzKG5hbWUsIERFRkFVTFRfSU1BR0UsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgZm9sZGVyCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICBhbiBpbWFnZSBmb3IgdGhlIGZvbGRlcgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIFByb2Nlc3NUcmVlVUlGb2xkZXIoU3RyaW5nIG5hbWUsIEltYWdlIGltYWdlLCBPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb2xkZXIgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UuCi0JICogCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZm9yIGEgVUkgZm9sZGVyCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgb2JqZWN0IGZvciB0aGUgZm9sZGVyCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcGFyZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IG9iamVjdAotCSAqIEByZXR1cm4gdGhlIGdpdmVuIHBhcmVudCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgZm9sZGVyIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YmEwMjM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBEaXNwbGF5cyBhIHRyZWUgdmlldyB0aGF0IGFsbG93cyBhIHVzZXIgdG8gc2VsZWN0IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yCi0gKiBkZWxpdmVyeSBwcm9jZXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NUcmVlVmlld2VyIGV4dGVuZHMgVHJlZVZpZXdlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICovCi0JcHVibGljIFByb2Nlc3NUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJc2V0Q29udGVudFByb3ZpZGVyKG5ldyBQcm9jZXNzVHJlZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJc2V0TGFiZWxQcm92aWRlcihuZXcgUHJvY2Vzc1RyZWVMYWJlbFByb3ZpZGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1ZpZXcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5NTQ2MmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1ZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS52aWV3czsKLQotcHVibGljIGNsYXNzIFByb2Nlc3NWaWV3IHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9EaXJlY3RvcnlWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvRGlyZWN0b3J5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcwYzY2ZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9EaXJlY3RvcnlWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHZhbGlkYXRpbmcgYW5kIGNyZWF0aW5nIGEgZGlyZWN0b3J5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyMTUzCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXJlY3RvcnlWYWxpZGF0b3IgewotCi0JLyoqCi0JICogVmFsaWRhdGVzIGFuZCBjcmVhdGVzIGEgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqIDxwPgotCSAqIERpc3BsYXlzIGFuIGVycm9yIGRpYWxvZyBpZiB0aGUgZGlyZWN0b3J5IHBhdGggaXMgbm90IHZhbGlkLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIHRvIGJlIHZhbGlkYXRlZCBhbmQgY3JlYXRlZC4KLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSBkaWFsb2cgdGl0bGUuCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHBhdGggaXMgdmFsaWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQW5kQ3JlYXRlRGlyKFN0cmluZyBkaXIsIFN0cmluZyB0aXRsZSwKLQkJCVN0cmluZyBlcnJvck1zZykgewotCQlib29sZWFuIGFuc3dlciA9IGZhbHNlOwotCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpcik7Ci0JCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQlGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygpOwotCQkJaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCWFuc3dlciA9IExpYnJhcnlVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJdGl0bGUsCi0JCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmRlbGV0ZUZpbGVzQ29uZmlybWF0aW9uX21zZywKLQkJCQkJCQkJCQkJCWRpcikpOwotCQkJCWlmIChhbnN3ZXIgPT0gdHJ1ZSkgewotCQkJCQl0cnkgewotCQkJCQkJYW5zd2VyID0gRmlsZVV0aWwKLQkJCQkJCQkJLmRlbGV0ZUFsbEZpbGVzKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQkJaWYgKGFuc3dlciA9PSBmYWxzZSkgewotCQkJCQkJCUxpYnJhcnlVSVBsdWdpbgotCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQl0aXRsZSwKLQkJCQkJCQkJCQkJZXJyb3JNc2csCi0JCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJCQkJCQkJZGlyKSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQl0aXRsZSwKLQkJCQkJCQkJCQllcnJvck1zZywKLQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuZGVsZXRlRmlsZXNFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQkJCQkJCWRpciksIGUpOwotCQkJCQkJYW5zd2VyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWFuc3dlciA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0vLwkJCWlmICghZmlsZS5pc0Fic29sdXRlKCkpIHsKLS8vCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLAotLy8JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuaW52YWxpZFBhdGhfbXNnKTsKLS8vCQkJCWFuc3dlciA9IGZhbHNlOwotLy8JCQl9IGVsc2UgewotCi0JCQkJdHJ5IHsKLQkJCQkJaWYgKGZpbGUubWtkaXJzKCkgPT0gZmFsc2UpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCXRpdGxlLAotCQkJCQkJCQkJCWVycm9yTXNnLAotCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5jcmVhdGVQYXRoRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJCQkJCQlkaXIpKTsKLQkJCQkJCWFuc3dlciA9IGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYW5zd2VyID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCXRpdGxlLAotCQkJCQkJCWVycm9yTXNnLAotCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmNyZWF0ZVBhdGhFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQlkaXIpLCBlKTsKLQkJCQkJYW5zd2VyID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotLy8JCX0KLQotCQlyZXR1cm4gYW5zd2VyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTGlicmFyeUJhY2t1cFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTGlicmFyeUJhY2t1cFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjJjZDYwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL0xpYnJhcnlCYWNrdXBVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3MuTGlicmFyeUJhY2t1cERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGJhY2sgdXAgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlCYWNrdXBVdGlsIHsKLQotCXByaXZhdGUgU3RyaW5nIHBhdGggPSBudWxsOwotCi0JLyoqCi0JICogUHJvbXB0cyB0byBiYWNrdXAgbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBzaGVsbAotCSAqIEBwYXJhbSBsaWJQYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByb21wdEJhY2t1cExpYnJhcnkoU2hlbGwgc2hlbGwsIEZpbGUgbGliUGF0aCkgewotCQluZXcgTGlicmFyeUJhY2t1cFV0aWwoKS5kb0JhY2t1cChzaGVsbCwgbGliUGF0aCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvQmFja3VwKGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBGaWxlIGxpYlBhdGgpIHsKLQkJcGF0aCA9IG51bGw7Ci0KLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNoZWxsIHMgPSBzaGVsbDsKLQkJCQlpZiAocyA9PSBudWxsKSB7Ci0JCQkJCXMgPSBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCk7Ci0JCQkJfQotCi0JCQkJaWYgKHMgPT0gbnVsbCkgewotCQkJCQlzID0gbmV3IFNoZWxsKE1zZ0JveC5nZXREaXNwbGF5KCkpOwotCQkJCX0KLQotCQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlVSVJlc291cmNlcy5iYWNrdXBMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCQkJCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeVVJUmVzb3VyY2VzLmJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dDsKLQkJCQlTdHJpbmcgYmFja3VwUGF0aCA9IGxpYlBhdGguZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLmJhY2t1cCI7IC8vJE5PTi1OTFMtMSQJCi0KLQkJCQlMaWJyYXJ5QmFja3VwRGlhbG9nIGRsZyA9IG5ldyBMaWJyYXJ5QmFja3VwRGlhbG9nKHMsIHRpdGxlLAotCQkJCQkJbWVzc2FnZSwgYmFja3VwUGF0aCk7Ci0KLQkJCQlpZiAoZGxnLm9wZW4oKSA9PSBEaWFsb2cuT0spIHsKLQkJCQkJcGF0aCA9IGRsZy5nZXRQYXRoKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQliYWNrdXAobGliUGF0aCwgbmV3IEZpbGUocGF0aCkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBCYWNrIHVwIGxpYnJhcnkgCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEBwYXJhbSBkZXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGJhY2t1cChmaW5hbCBGaWxlIHNvdXJjZSwgZmluYWwgRmlsZSBkZXN0KSB7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIGV4Y3VkZSB0aGUgbm9uLWxpYnJhcnkgZmlsZXMgdGhhdCBtaWdodCBiZSBsb2NrZWQgYnkgcm1jLgotCQkJCQkvLyB0aGVzZSBmaWxlcyBtYXkgY2F1c2UgYmFja3VwIHRvIGZhaWwgZHVlIHRvIGZpbGUgbG9jay4KLQkJCQkJU3RyaW5nIGV4Y2x1ZGVzID0gIi5sb2NrIjsKLQkJCQkJTGF5b3V0UmVzb3VyY2VzLmNvcHlEaXIoc291cmNlLCBkZXN0LCAiKioiLCBleGNsdWRlcyk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCQkJTGlicmFyeVVJUmVzb3VyY2VzLmJhY2tpbmdVcExpYnJhcnlUYXNrX25hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYWEwNjA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGNsYXNzIGZvciBhIE5ldyBNZXRob2QgTGlicmFyeSB3aXphcmQgcGFnZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOZXdMaWJyYXJ5V2l6YXJkUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmRQYWdlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgc3BlY2lmaWMgdXNlciBzZWxlY3Rpb25zLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBNYXAgZ2V0U2VsZWN0aW9ucygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzg1Yzk5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRGVidWdUcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIE5ldyBMaWJyYXJ5IHdpemFyZCBwYWdlcyBkZWZpbmVkIHZpYSB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5uZXdMaWJyYXJ5V2l6YXJkUGFnZXMiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJuZXdMaWJyYXJ5V2l6YXJkUGFnZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBJZiB0cnVlLCBkZWJ1ZyB0cmFjaW5nIGlzIGVuYWJsZWQuCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCS8vIEEgbWFwIG9mIHdpemFyZCBwYWdlIHByb3ZpZGVycy4KLQlwcml2YXRlIE1hcCB3aXphcmRQYWdlUHJvdmlkZXJzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIEEgbGlzdCBvZiB3aXphcmQgcGFnZSBpbnN0YW5jZXMuCi0JcHJpdmF0ZSBNYXAgd2l6YXJkUGFnZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiaW5pdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIHR5cGVJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyB0aXRsZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImluaXQiLCAvLyROT04tTkxTLTEkIAotCQkJCQkJCQkJImNvbmZpZ0VsZW1lbnQsIGNsYXNzPSIgKyBjbGFzc05hbWUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSIsIHR5cGU9IiArIHR5cGVJZCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJIiwgdGl0bGU9IiArIHRpdGxlICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkiLCBkZXNjcmlwdGlvbj0iICsgZGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCQkJCQkJCQotCQkJCQkJfQotCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHR5cGVJZCAhPSBudWxsICYmIHR5cGVJZC50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHRpdGxlICE9IG51bGwgJiYgdGl0bGUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiBkZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCQkJCSYmIGRlc2NyaXB0aW9uLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlpZiAoIXdpemFyZFBhZ2VQcm92aWRlcnMuY29udGFpbnNLZXkodHlwZUlkKSkgewotCQkJCQkJCQlOZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiBwcm92aWRlciA9IG5ldyBOZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbigKLQkJCQkJCQkJCQlidW5kbGUsIGNsYXNzTmFtZSwgdHlwZUlkLCB0aXRsZSwKLQkJCQkJCQkJCQlkZXNjcmlwdGlvbik7Ci0JCQkJCQkJCXdpemFyZFBhZ2VQcm92aWRlcnMucHV0KHR5cGVJZCwgcHJvdmlkZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPk5ld0xpYnJhcnlXaXphcmRQYWdlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBOZXdMaWJyYXJ5V2l6YXJkUGFnZSBjcmVhdGVXaXphcmRQYWdlKFN0cmluZyBwYWdlSWQsIFN0cmluZyB0eXBlSWQpIHsKLQkJTmV3TGlicmFyeVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChOZXdMaWJyYXJ5V2l6YXJkUGFnZSkgd2l6YXJkUGFnZXMKLQkJCQkuZ2V0KHR5cGVJZCk7Ci0JCWlmICh3aXphcmRQYWdlICE9IG51bGwpIHsKLQkJCXJldHVybiB3aXphcmRQYWdlOwotCQl9Ci0KLQkJTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24gcHJvdmlkZXIgPSAoTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24pIHdpemFyZFBhZ2VQcm92aWRlcnMKLQkJCQkuZ2V0KHR5cGVJZCk7Ci0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlCdW5kbGUgYnVuZGxlID0gcHJvdmlkZXIuZ2V0QnVuZGxlKCk7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gcHJvdmlkZXIuZ2V0Q2xhc3NOYW1lKCk7Ci0JCQlDbGFzcyB3aXphcmRQYWdlQ2xhc3M7Ci0JCQlDbGFzc1tdIGFyZ0NsYXNzID0gbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MgfTsKLQkJCU9iamVjdFtdIGFyZ1ZhbHVlID0gbmV3IE9iamVjdFtdIHsgcGFnZUlkIH07Ci0JCQlDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcjsKLQkJCXRyeSB7Ci0JCQkJd2l6YXJkUGFnZUNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCWNvbnN0cnVjdG9yID0gd2l6YXJkUGFnZUNsYXNzLmdldENvbnN0cnVjdG9yKGFyZ0NsYXNzKTsKLQkJCQl3aXphcmRQYWdlID0gKE5ld0xpYnJhcnlXaXphcmRQYWdlKSBjb25zdHJ1Y3RvcgotCQkJCQkJLm5ld0luc3RhbmNlKGFyZ1ZhbHVlKTsKLQkJCQl3aXphcmRQYWdlLnNldFRpdGxlKHByb3ZpZGVyLmdldFRpdGxlKCkpOwotCQkJCXdpemFyZFBhZ2Uuc2V0RGVzY3JpcHRpb24ocHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJd2l6YXJkUGFnZXMucHV0KHR5cGVJZCwgd2l6YXJkUGFnZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdpemFyZFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvciBjYWNoZWQgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPk5ld0xpYnJhcnlXaXphcmRQYWdlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgTmV3TGlicmFyeVdpemFyZFBhZ2UgZ2V0V2l6YXJkUGFnZShTdHJpbmcgdHlwZUlkKSB7Ci0JCXJldHVybiAoTmV3TGlicmFyeVdpemFyZFBhZ2UpIHdpemFyZFBhZ2VzLmdldCh0eXBlSWQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeU1haW5QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5TWFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGEwMTIzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5TWFpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcGF0aCB0byBvcGVuIGEgbWV0aG9kCi0gKiBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIE9wZW5MaWJyYXJ5TWFpblBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBPcGVuTGlicmFyeU1haW5QYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSUQgPSAidHlwZUlkIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0KLQlwcml2YXRlIENvbWJvIGxpYnJhcnlQYXRoQ29tYm87Ci0KLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcml2YXRlIFN0cmluZyBsaWJyYXJ5VHlwZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5TWFpblBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeU1haW5XaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9PcGVuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgTGlicmFyeVVJUmVzb3VyY2VzLnBhdGhMYWJlbF90ZXh0KTsKLQotCQlsaWJyYXJ5UGF0aENvbWJvID0gY3JlYXRlQ29tYm9ib3goY29tcG9zaXRlKTsKLQotCQlicm93c2VCdXR0b24gPSBjcmVhdGVCdXR0b24oY29tcG9zaXRlLAotCQkJCUxpYnJhcnlVSVJlc291cmNlcy5icm93c2VCdXR0b25fdGV4dCk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlTdHJpbmdbXSBvcGVuTGlicmFyeVBhdGhzID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0T3BlbkxpYnJhcnlQYXRocygpOwotCQlsaWJyYXJ5UGF0aENvbWJvLnNldEl0ZW1zKG9wZW5MaWJyYXJ5UGF0aHMpOwotCQlpZiAob3BlbkxpYnJhcnlQYXRocy5sZW5ndGggPiAwKSB7Ci0JCQlsaWJyYXJ5UGF0aENvbWJvLnNldFRleHQob3BlbkxpYnJhcnlQYXRoc1swXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlsaWJyYXJ5UGF0aENvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWxpYnJhcnlQYXRoQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsIFNXVC5OT05FKTsKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChnZXRMaWJyYXJ5UGF0aCgpKTsKLQkJCQlTdHJpbmcgc2VsZWN0ZWREaXIgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChzZWxlY3RlZERpciAhPSBudWxsKSB7Ci0JCQkJCWxpYnJhcnlQYXRoQ29tYm8uYWRkKHNlbGVjdGVkRGlyLCAwKTsKLQkJCQkJbGlicmFyeVBhdGhDb21iby5zZXRUZXh0KHNlbGVjdGVkRGlyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gZ2V0TGlicmFyeU5hbWUoKS5sZW5ndGgoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0JCVN0cmluZyBsaWJQYXRoID0gZ2V0TGlicmFyeVBhdGgoKTsKLQkJU3RyaW5nIGxpYk5hbWUgPSBuZXcgRmlsZShsaWJQYXRoKS5nZXROYW1lKCk7Ci0JCWlmICghbGliUGF0aC5lcXVhbHMobGliTmFtZSkpIHsKLQkJCXJldHVybiBsaWJOYW1lOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIGxpYnJhcnlQYXRoQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSB0eXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVR5cGUoKSB7Ci0JCXJldHVybiBsaWJyYXJ5VHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlNYWluUGFnZTIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlNYWluUGFnZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmJlY2M3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5TWFpblBhZ2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5TWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5SZWNlbnRseU9wZW5lZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gZW50ZXIgdGhlIG5hbWUsIGJyaWVmIGRlc2NyaXB0aW9uIGFuZAotICogdHlwZSBmb3IgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlNYWluUGFnZTIgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBPcGVuTGlicmFyeU1haW5QYWdlMi5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lEID0gInR5cGVJZCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcm90ZWN0ZWQgQ29tYm8gbmFtZUNvbWJvOwotCi0JcHJvdGVjdGVkIFRleHQgdXJpVGV4dDsKLQotCXByb3RlY3RlZCBCdXR0b24gb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3BlblVubGlzdGVkTGlicmFyeSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIEJ1dHRvbltdIHJhZGlvQnV0dG9uczsKLQotCXByb3RlY3RlZCBNYXAgcmVjZW50bHlPcGVuZWRMaWJyYXJpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlNYWluUGFnZTIoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeU1haW5XaXphcmRQYWdlX3RpdGxlXzIpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL09wZW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCUxhYmVsIG5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQluYW1lTGFiZWwuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMubmFtZUxhYmVsX3RleHQpOwotCi0JCW5hbWVDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJbmFtZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIFNldCB0aGUgY29uZmlndXJhdGlvbiBsaXN0LgotCQlMaXN0IGxpYnJhcnlMaXN0ID0gZ2V0UmVjZW50bHlPcGVuZWRMaWJyYXJpZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGxpYnJhcnlMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVJlY2VudGx5T3BlbmVkTGlicmFyeSBsaWJyYXJ5ID0gKFJlY2VudGx5T3BlbmVkTGlicmFyeSkgaXQubmV4dCgpOwotCQkJcmVjZW50bHlPcGVuZWRMaWJyYXJpZXMucHV0KGxpYnJhcnkuZ2V0TmFtZSgpLCBsaWJyYXJ5KTsKLQkJfQotCQlTdHJpbmdbXSBsaWJyYXJ5TmFtZXMgPSBuZXcgU3RyaW5nW3JlY2VudGx5T3BlbmVkTGlicmFyaWVzLnNpemUoKV07Ci0JCXJlY2VudGx5T3BlbmVkTGlicmFyaWVzLmtleVNldCgpLnRvQXJyYXkobGlicmFyeU5hbWVzKTsKLQkJbmFtZUNvbWJvLnNldEl0ZW1zKGxpYnJhcnlOYW1lcyk7Ci0KLQkJTGFiZWwgdXJpTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9STUFMKTsKLQkJdXJpTGFiZWwuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMudXJpTGFiZWxfdGV4dCk7Ci0KLQkJdXJpVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXVyaVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXVyaVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCW9wZW5Vbmxpc3RlZExpYnJhcnlDaGVja2JveCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlvcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3gKLQkJCQkuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMub3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94X3RleHQpOwotCQlvcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3guc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCSgoR3JpZERhdGEpIG9wZW5Vbmxpc3RlZExpYnJhcnlDaGVja2JveC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlMYWJlbCBsaWJyYXJ5VHlwZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCWxpYnJhcnlUeXBlTGFiZWwuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMubGlicmFyeVR5cGVMYWJlbF90ZXh0KTsKLQotCQlDb21wb3NpdGUgdHlwZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9STUFMKTsKLQkJdHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJdHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlNYXAgdHlwZXMgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5VHlwZXMoKTsKLQkJcmFkaW9CdXR0b25zID0gbmV3IEJ1dHRvblt0eXBlcy5zaXplKCldOwotCQlpbnQgcmFkaW9CdXR0b25JbmRleCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB0eXBlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgdHlwZUlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJU3RyaW5nIHR5cGVOYW1lID0gKFN0cmluZykgdHlwZXMuZ2V0KHR5cGVJZCk7Ci0JCQlCdXR0b24gcmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uKHR5cGVDb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCQlyYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXJhZGlvQnV0dG9uLnNldFRleHQodHlwZU5hbWUpOwotCQkJcmFkaW9CdXR0b24uc2V0RGF0YShUWVBFX0lELCB0eXBlSWQpOwotCQkJcmFkaW9CdXR0b25zW3JhZGlvQnV0dG9uSW5kZXgrK10gPSByYWRpb0J1dHRvbjsKLQkJfQotCi0JCWlmIChyYWRpb0J1dHRvbnMubGVuZ3RoID4gMCkgewotCQkJcmFkaW9CdXR0b25zWzBdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlPcGVuTGlicmFyeVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRXaXphcmRQYWdlKGdldExpYnJhcnlUeXBlKCkpOwotCQlpZiAod2l6YXJkUGFnZSAhPSBudWxsKSB7Ci0JCQl3aXphcmRQYWdlLm9uRW50ZXJQYWdlKGdldExpYnJhcnlOYW1lKCkpOwotCQl9Ci0JCWlmICghb3BlblVubGlzdGVkTGlicmFyeSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHdpemFyZFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiBnZXRMaWJyYXJ5TmFtZSgpLmxlbmd0aCgpID4gMCB8fCBvcGVuVW5saXN0ZWRMaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIEFkZHMgbGlzdGVuZXJzIHRvIHRoZSB3aXphcmQgY29udHJvbHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJbmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94Ci0JCQkJLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQkJb3BlblVubGlzdGVkTGlicmFyeSA9IG9wZW5Vbmxpc3RlZExpYnJhcnlDaGVja2JveAotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBsaWJyYXJ5IG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWVDb21iby5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIFVSSSBvZiB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlVUkkoKSB7Ci0JCVJlY2VudGx5T3BlbmVkTGlicmFyeSBsaWJyYXJ5ID0gKFJlY2VudGx5T3BlbmVkTGlicmFyeSkgcmVjZW50bHlPcGVuZWRMaWJyYXJpZXMKLQkJCQkuZ2V0KGdldExpYnJhcnlOYW1lKCkpOwotCQlyZXR1cm4gbGlicmFyeS5nZXRVUkkoKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHBhdGggb2YgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIGxpYnJhcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5UGF0aCgpIHsKLQkJUmVjZW50bHlPcGVuZWRMaWJyYXJ5IGxpYnJhcnkgPSAoUmVjZW50bHlPcGVuZWRMaWJyYXJ5KSByZWNlbnRseU9wZW5lZExpYnJhcmllcwotCQkJCS5nZXQoZ2V0TGlicmFyeU5hbWUoKSk7Ci0JCXJldHVybiBsaWJyYXJ5LmdldFBhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcGVuIHVubGlzdGVkIG1ldGhvZCBsaWJycmF5IG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09wZW5Vbmxpc3RlZExpYnJhcnkoKSB7Ci0JCXJldHVybiBvcGVuVW5saXN0ZWRMaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIGxpYnJhcnkgdHlwZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlUeXBlKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHJhZGlvQnV0dG9ucy5sZW5ndGg7IGkrKykgewotCQkJQnV0dG9uIHJhZGlvQnV0dG9uID0gcmFkaW9CdXR0b25zW2ldOwotCQkJaWYgKHJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpIHJhZGlvQnV0dG9uLmdldERhdGEoVFlQRV9JRCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmcpIHJhZGlvQnV0dG9uc1swXS5nZXREYXRhKFRZUEVfSUQpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYSBsaXN0IG9mIHJlY2VudGx5IG9wZW5lZCBtZXRob2QgbGlicmFyaWVzLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIDxjb2RlPlJlY2VudGx5T3BlbmVkTGlicmFyeTwvY29kZT4gb2JqZWN0cwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBnZXRSZWNlbnRseU9wZW5lZExpYnJhcmllcygpIHsKLQkJTGlzdCBsaWJyYXJ5VVJJcyA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldE9wZW5MaWJyYXJ5VVJJc0xpc3QoKTsKLQkJTGlzdCBsaWJyYXJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChsaWJyYXJ5VVJJcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlicmFyeVVSSXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBsaWJyYXJ5VVJJID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCWxpYnJhcmllcy5hZGQobmV3IFJlY2VudGx5T3BlbmVkTGlicmFyeShsaWJyYXJ5VVJJKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpYnJhcmllczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODUzYTdlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVwZ3JhZGVDYWxsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQSB3aXphcmQgdGhhdCBndWlkZXMgdGhlIHVzZXIgdG8gb3BlbiBhIG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5MaWJyYXJ5V2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9IE9wZW5MaWJyYXJ5V2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCS8vIFRoZSBtYWluIHdpemFyZCBwYWdlLgotCXByaXZhdGUgT3BlbkxpYnJhcnlNYWluUGFnZSBtYWluUGFnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0V2luZG93VGl0bGUoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQltYWluUGFnZSA9IGNyZWF0ZU1haW5QYWdlKCk7Ci0JCWFkZFBhZ2UobWFpblBhZ2UpOwotCX0KLQotCXByb3RlY3RlZCBPcGVuTGlicmFyeU1haW5QYWdlIGNyZWF0ZU1haW5QYWdlKCkgewotCQlyZXR1cm4gbmV3IE9wZW5MaWJyYXJ5TWFpblBhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXJldHVybiBvcGVuTWV0aG9kTGlicmFyeShtYWluUGFnZS5nZXRMaWJyYXJ5UGF0aCgpLCBtYWluUGFnZS5nZXRMaWJyYXJ5VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5NZXRob2RMaWJyYXJ5KFN0cmluZyBwYXRoLCBTdHJpbmcgdHlwZSkgewotCQl0cnkgewotCQkJTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotCQkJb3B0aW9ucy5wdXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCwgbGlicmFyeVBhdGgKLQkJCQkJLmdldEFic29sdXRlUGF0aCgpKTsKLQotCQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzVmFsaWRMaWJyYXJ5KHBhdGgsIHRydWUpID09IFN0YXR1cy5PS19TVEFUVVMpIHsKLQkJCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNNZXRob2RMaWJyYXJ5TG9ja2VkKHBhdGgpKSB7Ci0JCQkJCWlmIChMaWJyYXJ5VUlNYW5hZ2VyLmRpc3BsYXlMaWJyYXJ5TG9ja2VkTWVzc2FnZSgpICE9IDApCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmICghaGFuZGxlVG9vbFZlcnNpb24ocGF0aCwgbnVsbCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLm9wZW5MaWJyYXJ5KHBhdGgpKSB7Ci0JCQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLmFkZE9wZW5MaWJyYXJ5UGF0aChsaWJyYXJ5UGF0aAotCQkJCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoWE1JTGlicmFyeVV0aWwKLQkJCQkJLmNvbnRhaW5zUGx1Z2luT3JDb25maWdTcGVjRXhwb3J0RmlsZShwYXRoKSkgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uNCk7Ci0JCQl9IGVsc2UgewotCQkJCU1zZ0RpYWxvZyBtc2dEaWFsb2cgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJYm9vbGVhbiByYyA9IG1zZ0RpYWxvZwotCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCQkJTkxTCi0JCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlEaWFsb2dfbmV3TGlicmFyeV90ZXh0LAotCQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgcGF0aCB9KSk7Ci0JCQkJaWYgKCFyYykKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlTGlicmFyeShwYXRoKSkgewotCQkJCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5hZGRPcGVuTGlicmFyeVBhdGgobGlicmFyeVBhdGgKLQkJCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJaWYgKHJlYXNvbiA9PSBudWxsKSB7Ci0JCQkJcmVhc29uID0gTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbjsKLQkJCX0KLQkJCXJlYXNvbiArPSAiXG5cbiIgKyBMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlFcnJvcl9hZHZpY2U7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChlLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlFcnJvcl9tc2csIHJlYXNvbik7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfbXNnLCByZWFzb24sIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBhbmQgaGFuZGxlIHRvb2wgdmVyc2lvbiBkaWZmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYW5kbGVUb29sVmVyc2lvbihTdHJpbmcgcGF0aCwKLQkJCVVwZ3JhZGVDYWxsZXJJbmZvIGNhbGxlckluZm8pIHsKLQkJU3RyaW5nIGxpYlhtaSA9IFhNSUxpYnJhcnlNYW5hZ2VyLkxJQlJBUllfWE1JOwotCQlpZiAoY2FsbGVySW5mbyAhPSBudWxsICYmIGNhbGxlckluZm8uZ2V0SXNFeHBvcnRlZFBsdWdpbkxpYigpKSB7Ci0JCQlsaWJYbWkgPSBYTUlMaWJyYXJ5TWFuYWdlci5leHBvcnRGaWxlOwotCQl9Ci0JCVZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbyA9IFZlcnNpb25VdGlsCi0JCQkJLmNoZWNrTGlicmFyeVZlcnNpb24obmV3IEZpbGUocGF0aCwgbGliWG1pKSk7Ci0JCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5yZXN1bHQgPiAwKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5mby50b29sSUQuZXF1YWxzKFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSkpIHsKLQkJCQltZXNzYWdlID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHQsCi0JCQkJCQluZXcgT2JqZWN0W10geyBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpLAotCQkJCQkJCQlpbmZvLnRvb2xWZXJzaW9uIH0pOwotCQkJfSBlbHNlIHsKLQkJCQltZXNzYWdlID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHRfdW5rbm93biwKLQkJCQkJCW5ldyBPYmplY3RbXSB7IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCkgfSk7Ci0JCQl9Ci0JCQlpZiAoIWlzVXBncmFkZUxpYnJhcnkoY2FsbGVySW5mbykpIHsKLQkJCQljYWxsZXJJbmZvLnNldEVycm9yTXNnKG1lc3NhZ2UpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsIG1lc3NhZ2UpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChYTUlMaWJyYXJ5VXRpbC5pc01ldGhvZExpYnJhcnlVcGdyYWRlUmVxdWlyZWQocGF0aCwgbGliWG1pKSkgewotCQkJaWYgKGlzVXBncmFkZUxpYnJhcnkoY2FsbGVySW5mbykKLQkJCQkJJiYgIUxpYnJhcnlVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy51cGdyYWRlTGlicmFyeURpYWxvZ190ZXh0KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmICghaXNVcGdyYWRlTGlicmFyeShjYWxsZXJJbmZvKSkgewotCQkJCWNhbGxlckluZm8uY29weUxpYnJhcnkoKTsKLQkJCQlpZiAoY2FsbGVySW5mby5nZXRDb3BpZWRMaWJGaWxlKCkgIT0gbnVsbCkgewotCQkJCQlwYXRoID0gY2FsbGVySW5mby5nZXRDb3BpZWRMaWJGaWxlKCkuZ2V0UGFyZW50RmlsZSgpCi0JCQkJCQkJLmdldEFic29sdXRlUGF0aCgpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghTGlicmFyeVVJTWFuYWdlci51cGdyYWRlTGlicmFyeShwYXRoLCBjYWxsZXJJbmZvKSkgewotCQkJCWlmIChjYWxsZXJJbmZvICE9IG51bGwpIHsKLQkJCQkJLy8gY2FsbGVySW5mby5zZXRFcnJvck1zZygidXBncmFkZUxpYnJhcnkgRmFpbGVkISIpOyAvL25lZWQKLQkJCQkJLy8gbmV3IHJlc291cmNlIHN0cmluZwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVXBncmFkZUxpYnJhcnkoVXBncmFkZUNhbGxlckluZm8gY2FsbGVySW5mbykgewotCQlyZXR1cm4gVXBncmFkZUNhbGxlckluZm8uaXNVcGdyYWRlTGlicmFyeShjYWxsZXJJbmZvKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YzVhNTZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVXBncmFkZUNhbGxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIG9wZW4gYSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTGlicmFyeVdpemFyZDIgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gT3BlbkxpYnJhcnlXaXphcmQyLmNsYXNzLmdldE5hbWUoKTsKLQotCS8vIFRoZSBtYWluIHdpemFyZCBwYWdlLgotCXByaXZhdGUgT3BlbkxpYnJhcnlNYWluUGFnZTIgbWFpblBhZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeVdpemFyZDIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRXaW5kb3dUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCW1haW5QYWdlID0gbmV3IE9wZW5MaWJyYXJ5TWFpblBhZ2UyKCk7Ci0JCWFkZFBhZ2UobWFpblBhZ2UpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRMaWJyYXJ5VHlwZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcGVyc2lzdGVuY2VJZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBwYWdlSWQgPSBwZXJzaXN0ZW5jZUlkICsgIlBhZ2UiOyAvLyROT04tTkxTLTEkCi0JCQlPcGVuTGlicmFyeVdpemFyZFBhZ2UgcGFnZSA9IE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkKLQkJCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlV2l6YXJkUGFnZShwYWdlSWQsIHBlcnNpc3RlbmNlSWQpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXBhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvd2l6YmFuL09wZW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCQkJCQkKLQkJCQlhZGRQYWdlKHBhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKG1haW5QYWdlLmlzUGFnZUNvbXBsZXRlKCkgJiYgIW1haW5QYWdlLmlzT3BlblVubGlzdGVkTGlicmFyeSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlJV2l6YXJkUGFnZVtdIHBhZ2VzID0gZ2V0UGFnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFwYWdlc1tpXS5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpICE9IG1haW5QYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlTdHJpbmcgdHlwZSA9IG1haW5QYWdlLmdldExpYnJhcnlUeXBlKCk7Ci0JCU9wZW5MaWJyYXJ5V2l6YXJkUGFnZSBwYWdlID0gT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFdpemFyZFBhZ2UodHlwZSk7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCQlpZiAobWFpblBhZ2UuaXNPcGVuVW5saXN0ZWRMaWJyYXJ5KCkpIHsKLQkJCQlNYXAgb3B0aW9ucyA9IHBhZ2UuZ2V0U2VsZWN0aW9ucygpOwotCQkJCXBhdGggPSAoU3RyaW5nKSBvcHRpb25zLmdldChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRIKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGF0aCA9IG1haW5QYWdlLmdldExpYnJhcnlQYXRoKCk7Ci0JCQl9Ci0JCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzVmFsaWRMaWJyYXJ5KHBhdGgsIHRydWUpID09IFN0YXR1cy5PS19TVEFUVVMpIHsKLQkJCQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzTWV0aG9kTGlicmFyeUxvY2tlZChwYXRoKSkgewotCQkJCQkJaWYgKExpYnJhcnlVSU1hbmFnZXIuZGlzcGxheUxpYnJhcnlMb2NrZWRNZXNzYWdlKCkgIT0gMCkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJaWYgKCFoYW5kbGVUb29sVmVyc2lvbihwYXRoLCBudWxsKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCWlmIChMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkub3BlbkxpYnJhcnkocGF0aCkpIHsKLQkJCQkJCWFkZFJlY2VudGx5T3BlbmVkTGlicmFyeSgpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKFhNSUxpYnJhcnlVdGlsCi0JCQkJCQkuY29udGFpbnNQbHVnaW5PckNvbmZpZ1NwZWNFeHBvcnRGaWxlKHBhdGgpKSB7Ci0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uNCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTXNnRGlhbG9nIG1zZ0RpYWxvZyA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJCWJvb2xlYW4gcmMgPSBtc2dEaWFsb2cKLQkJCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCQkJCU5MUwotCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlEaWFsb2dfbmV3TGlicmFyeV90ZXh0LAotCQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IHBhdGggfSkpOwotCQkJCQlpZiAoIXJjKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlpZiAoTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUxpYnJhcnkocGF0aCkpIHsKLQkJCQkJCWFkZFJlY2VudGx5T3BlbmVkTGlicmFyeSgpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChyZWFzb24gPT0gbnVsbCkgewotCQkJCXJlYXNvbiA9IExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUludGVybmxFcnJvcl9yZWFzb247Ci0JCQl9Ci0JCQlyZWFzb24gKz0gIlxuXG4iICsgTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfYWR2aWNlOwotCQkJaWYgKGUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX21zZywgcmVhc29uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlFcnJvcl9tc2csIHJlYXNvbiwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIG5ld2x5IG9wZW5lZCBvciBjcmVhdGVkIG1ldGhvZCBsaWJyYXJ5IHRvIHRoZSByZWNlbnRseSBvcGVuZWQKLQkgKiBtZXRob2QgbGlicmFyaWVzIHByZWZlcmVuY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVjZW50bHlPcGVuZWRMaWJyYXJ5KCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCVN0cmluZyBsaWJyYXJ5VVJJID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5TWFuYWdlcigKLQkJCQkJbGlicmFyeSkuZ2V0TWV0aG9kTGlicmFyeVVSSSgpLnRvU3RyaW5nKCk7Ci0JCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5hZGRPcGVuTGlicmFyeVVSSShsaWJyYXJ5VVJJKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIGFuZCBoYW5kbGUgdG9vbCB2ZXJzaW9uIGRpZmZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhbmRsZVRvb2xWZXJzaW9uKFN0cmluZyBwYXRoLAotCQkJVXBncmFkZUNhbGxlckluZm8gY2FsbGVySW5mbykgewotCQlTdHJpbmcgbGliWG1pID0gWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9YTUk7Ci0JCWlmIChjYWxsZXJJbmZvICE9IG51bGwgJiYgY2FsbGVySW5mby5nZXRJc0V4cG9ydGVkUGx1Z2luTGliKCkpIHsKLQkJCWxpYlhtaSA9IFhNSUxpYnJhcnlNYW5hZ2VyLmV4cG9ydEZpbGU7Ci0JCX0KLQkJVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvID0gVmVyc2lvblV0aWwKLQkJCQkuY2hlY2tMaWJyYXJ5VmVyc2lvbihuZXcgRmlsZShwYXRoLCBsaWJYbWkpKTsKLQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLnJlc3VsdCA+IDApIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmZvLnRvb2xJRC5lcXVhbHMoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKSkgewotCQkJCW1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dCwKLQkJCQkJCW5ldyBPYmplY3RbXSB7IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCksCi0JCQkJCQkJCWluZm8udG9vbFZlcnNpb24gfSk7Ci0JCQl9IGVsc2UgewotCQkJCW1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKSB9KTsKLQkJCX0KLQkJCWlmICghaXNVcGdyYWRlTGlicmFyeShjYWxsZXJJbmZvKSkgewotCQkJCWNhbGxlckluZm8uc2V0RXJyb3JNc2cobWVzc2FnZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwgbWVzc2FnZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzTWV0aG9kTGlicmFyeVVwZ3JhZGVSZXF1aXJlZChwYXRoLCBsaWJYbWkpKSB7Ci0JCQlpZiAoaXNVcGdyYWRlTGlicmFyeShjYWxsZXJJbmZvKQotCQkJCQkmJiAhTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RleHQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKCFpc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pKSB7Ci0JCQkJY2FsbGVySW5mby5jb3B5TGlicmFyeSgpOwotCQkJCWlmIChjYWxsZXJJbmZvLmdldENvcGllZExpYkZpbGUoKSAhPSBudWxsKSB7Ci0JCQkJCXBhdGggPSBjYWxsZXJJbmZvLmdldENvcGllZExpYkZpbGUoKS5nZXRQYXJlbnRGaWxlKCkKLQkJCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFMaWJyYXJ5VUlNYW5hZ2VyLnVwZ3JhZGVMaWJyYXJ5KHBhdGgsIGNhbGxlckluZm8pKSB7Ci0JCQkJaWYgKGNhbGxlckluZm8gIT0gbnVsbCkgewotCQkJCQkvLyBjYWxsZXJJbmZvLnNldEVycm9yTXNnKCJ1cGdyYWRlTGlicmFyeSBGYWlsZWQhIik7IC8vbmVlZAotCQkJCQkvLyBuZXcgcmVzb3VyY2Ugc3RyaW5nCi0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVcGdyYWRlTGlicmFyeShVcGdyYWRlQ2FsbGVySW5mbyBjYWxsZXJJbmZvKSB7Ci0JCXJldHVybiBVcGdyYWRlQ2FsbGVySW5mby5pc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViYTI5MDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGNsYXNzIGZvciBhIE9wZW4gTWV0aG9kIExpYnJhcnkgd2l6YXJkIHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3BlbkxpYnJhcnlXaXphcmRQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlXaXphcmRQYWdlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgc3BlY2lmaWMgdXNlciBzZWxlY3Rpb25zLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBNYXAgZ2V0U2VsZWN0aW9ucygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NTg3ZGI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5pbnRlcm5hbC53aXphcmRzLk5ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmludGVybmFsLndpemFyZHMuT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgT3BlbiBMaWJyYXJ5IHdpemFyZCBwYWdlcyBkZWZpbmVkIHZpYSB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5vcGVuTGlicmFyeVdpemFyZFBhZ2VzIiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gIm9wZW5MaWJyYXJ5V2l6YXJkUGFnZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkgaW5zdGFuY2UgPSBuZXcgT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSgpOwotCi0JLy8gQSBtYXAgb2Ygd2l6YXJkIHBhZ2UgcHJvdmlkZXJzLgotCXByaXZhdGUgTWFwIHdpemFyZFBhZ2VQcm92aWRlcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gQSBsaXN0IG9mIHdpemFyZCBwYWdlIGluc3RhbmNlcy4KLQlwcml2YXRlIE1hcCB3aXphcmRQYWdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBPcGVuTGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCUVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UsIEVYVEVOU0lPTl9QT0lOVF9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyB0eXBlSWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgdGl0bGUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJkZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCQkJCQkJCi0JCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJJiYgdHlwZUlkICE9IG51bGwgJiYgdHlwZUlkLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJJiYgdGl0bGUgIT0gbnVsbCAmJiB0aXRsZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIGRlc2NyaXB0aW9uICE9IG51bGwKLQkJCQkJCQkJJiYgZGVzY3JpcHRpb24udHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCWlmICghd2l6YXJkUGFnZVByb3ZpZGVycy5jb250YWluc0tleSh0eXBlSWQpKSB7Ci0JCQkJCQkJCU9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiBwcm92aWRlciA9IG5ldyBPcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24oCi0JCQkJCQkJCQkJYnVuZGxlLCBjbGFzc05hbWUsIHR5cGVJZCwgdGl0bGUsCi0JCQkJCQkJCQkJZGVzY3JpcHRpb24pOwotCQkJCQkJCQl3aXphcmRQYWdlUHJvdmlkZXJzLnB1dCh0eXBlSWQsIHByb3ZpZGVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5PcGVuTGlicmFyeVdpemFyZFBhZ2U8L2NvZGU+Ci0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZSBjcmVhdGVXaXphcmRQYWdlKFN0cmluZyBwYWdlSWQsIFN0cmluZyB0eXBlSWQpIHsKLQkJT3BlbkxpYnJhcnlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSAoT3BlbkxpYnJhcnlXaXphcmRQYWdlKSB3aXphcmRQYWdlcwotCQkJCS5nZXQodHlwZUlkKTsKLQkJaWYgKHdpemFyZFBhZ2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIHdpemFyZFBhZ2U7Ci0JCX0KLQotCQlPcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24gcHJvdmlkZXIgPSAoT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uKSB3aXphcmRQYWdlUHJvdmlkZXJzCi0JCQkJLmdldCh0eXBlSWQpOwotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJQnVuZGxlIGJ1bmRsZSA9IHByb3ZpZGVyLmdldEJ1bmRsZSgpOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHByb3ZpZGVyLmdldENsYXNzTmFtZSgpOwotCQkJQ2xhc3Mgd2l6YXJkUGFnZUNsYXNzOwotCQkJQ2xhc3NbXSBhcmdDbGFzcyA9IG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzIH07Ci0JCQlPYmplY3RbXSBhcmdWYWx1ZSA9IG5ldyBPYmplY3RbXSB7IHBhZ2VJZCB9OwotCQkJQ29uc3RydWN0b3IgY29uc3RydWN0b3I7Ci0JCQl0cnkgewotCQkJCXdpemFyZFBhZ2VDbGFzcyA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCQljb25zdHJ1Y3RvciA9IHdpemFyZFBhZ2VDbGFzcy5nZXRDb25zdHJ1Y3RvcihhcmdDbGFzcyk7Ci0JCQkJd2l6YXJkUGFnZSA9IChPcGVuTGlicmFyeVdpemFyZFBhZ2UpIGNvbnN0cnVjdG9yCi0JCQkJCQkubmV3SW5zdGFuY2UoYXJnVmFsdWUpOwotCQkJCXdpemFyZFBhZ2Uuc2V0VGl0bGUocHJvdmlkZXIuZ2V0VGl0bGUoKSk7Ci0JCQkJd2l6YXJkUGFnZS5zZXREZXNjcmlwdGlvbihwcm92aWRlci5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl3aXphcmRQYWdlcy5wdXQodHlwZUlkLCB3aXphcmRQYWdlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gd2l6YXJkUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9yIGNhY2hlZCB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TmV3TGlicmFyeVdpemFyZFBhZ2U8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeVdpemFyZFBhZ2UgZ2V0V2l6YXJkUGFnZShTdHJpbmcgdHlwZUlkKSB7Ci0JCXJldHVybiAoT3BlbkxpYnJhcnlXaXphcmRQYWdlKSB3aXphcmRQYWdlcy5nZXQodHlwZUlkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvU2VsZWN0UHJvY2Vzc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvU2VsZWN0UHJvY2Vzc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWJkN2UxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL1NlbGVjdFByb2Nlc3NQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3MuUHJvY2Vzc1RyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcHJvY2VzcyB0byBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDcuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0UHJvY2Vzc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RQcm9jZXNzUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFByb2Nlc3NUcmVlVmlld2VyIHByb2Nlc3NUcmVlVmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0IGJyaWVmRGVzY1RleHQ7Ci0KLQlwcml2YXRlIFByb2Nlc3MgcHJvY2VzczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFByb2Nlc3NQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMuc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihMaWJyYXJ5VUlSZXNvdXJjZXMuc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0UHJvY2Vzcy5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzZXNMYWJlbF90ZXh0KTsKLQotCQlwcm9jZXNzVHJlZVZpZXdlciA9IG5ldyBQcm9jZXNzVHJlZVZpZXdlcihjb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAyNTA7Ci0JCXByb2Nlc3NUcmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIExpYnJhcnlVSVJlc291cmNlcy5icmllZkRlc2NyaXB0aW9uTGFiZWxfdGV4dCk7Ci0KLQkJYnJpZWZEZXNjVGV4dCA9IGNyZWF0ZVRleHRNdWx0aShjb21wb3NpdGUsICIiLCAxMDAsIDcwLCAxKTsgLy8kTk9OLU5MUy0xJAkKLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCXByb2Nlc3NUcmVlVmlld2VyLnNldElucHV0KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCXByb2Nlc3NUcmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCi0JCWFkZEV2ZW50SGFuZGxlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFdmVudEhhbmRsZXJzKCkgewotCQlwcm9jZXNzVHJlZVZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlPYmplY3Qgc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgVHJlZVNlbGVjdGlvbikgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gKChUcmVlU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJCQkJCXByb2Nlc3MgPSAoUHJvY2VzcykgZWxlbWVudDsKLQkJCQkJCQkJYnJpZWZEZXNjVGV4dC5zZXRUZXh0KHByb2Nlc3MKLQkJCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlwcm9jZXNzID0gbnVsbDsKLQkJCQkJCQkJYnJpZWZEZXNjVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0UHJvY2VzcygpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IGdldFdpemFyZCgpLmdldE5leHRQYWdlKHRoaXMpOwotCQlpZiAobmV4dFBhZ2UgIT0gbnVsbCAmJiBuZXh0UGFnZSBpbnN0YW5jZW9mIEJhc2VXaXphcmRQYWdlKSB7Ci0JCQlCYXNlV2l6YXJkUGFnZSBuZXh0V2l6YXJkUGFnZSA9IChCYXNlV2l6YXJkUGFnZSkgbmV4dFBhZ2U7Ci0JCQluZXh0V2l6YXJkUGFnZS5vbkVudGVyUGFnZShnZXRQcm9jZXNzKCkpOwotCQl9Ci0JCXJldHVybiBuZXh0UGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNlbGVjdGVkIHByb2Nlc3MuCi0JICovCi0JcHVibGljIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2Y2NjAwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpemFyZHMgZm9yIG1hbmFnaW5nIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxYjc3OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIFhNSSBMaWJyYXJ5IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZjMyNTNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGVmMDM5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gU2VwIDExIDEyOjMxOjU3IFBEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzLnByb3BlcnRpZXM9ODg1OV8xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYzJhNzJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkucHJlZmVyZW5jZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMGIyZmM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZjJlYzdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBYTUkgTGlicmFyeQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRjMGFhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkaWFncmFtTWlncmF0aW9uIiBuYW1lPSJEaWFncmFtIE1pZ3JhdGlvbiIgc2NoZW1hPSJzY2hlbWEvSURpYWdyYW1NaWdyYXRpb24uZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGlicmFyeU1hbmFnZXJzIj4KLSAgICAgIDxsaWJyYXJ5TWFuYWdlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlciIgICAgICAgCQkKLSAgICAgICAgICAgIHR5cGU9InhtaSIKLSAgICAgICAgICAgIHR5cGVOYW1lPSJYTUkiPgotICAgICAgPC9saWJyYXJ5TWFuYWdlcj4gICAgIAotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubWlncmF0b3JzIj4KLSAgICAgIDxtaWdyYXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5pbnRlcm5hbC5taWdyYXRpb24uTWlncmF0b3IxMDIiCi0gICAgICAgICAgICBsaWJOc1VSST0iaHR0cDovL3d3dy5pYm0uY29tL3VtYS8xLjAuMi91bWEuZWNvcmUiLz4KLSAgICAgIDxtaWdyYXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5pbnRlcm5hbC5taWdyYXRpb24uTWlncmF0b3IxMDMiCi0gICAgICAgICAgICBsaWJOc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZTEiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQub3Bwb3NpdGVGZWF0dXJlTG9hZGVycyI+Ci0gICAgICA8b3Bwb3NpdGVGZWF0dXJlTG9hZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuaW50ZXJuYWwuWE1JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zY2hlbWEvSURpYWdyYW1NaWdyYXRpb24uZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NjaGVtYS9JRGlhZ3JhbU1pZ3JhdGlvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MTViZTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NjaGVtYS9JRGlhZ3JhbU1pZ3JhdGlvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pIiBpZD0iSURpYWdyYW1NaWdyYXRpb24iIG5hbWU9IkRpYWdyYW0gTWlncmF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFByb3ZpZGUgZGlhZ3JhbSBtaWdyYXRpb24gQVBJLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGlhZ3JhbU1pZ3JhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRpYWdyYW1NaWdyYXRpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuSURpYWdyYW1NaWdyYXRpb24KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9JRGlhZ3JhbU1pZ3JhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9JRGlhZ3JhbU1pZ3JhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMmZjNzA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvSURpYWdyYW1NaWdyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgZGlncmFtIG1pZ3JhdGlvbiAKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gTWFyY2ggMTksIDIwMDcKLSAqIEBzaW5jZSAgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpYWdyYW1NaWdyYXRpb24gewotCi0Jdm9pZCBtaWdyYXRlKENvbGxlY3Rpb248UHJvY2Vzcz4gcHJvY2Vzc2VzKSB0aHJvd3MgRXhjZXB0aW9uOwotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMTFhOTNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1maWxlUGF0aD1GaWxlIHBhdGgKLWNhbm5vdFdyaXRlVG9GaWxlcz1DYW5ub3Qgd3JpdGUgdG8gZmlsZShzKQotcmVhZE9ubHlGaWxlc190aXRsZT1SZWFkLW9ubHkgZmlsZShzKQotcmVhZE9ubHlGaWxlc19tc2c9VGhlIGZpbGVzIGxpc3RlZCBpbiBEZXRhaWxzIGFyZSByZWFkLW9ubHkuIE1ha2UgdGhlbSB3cml0YWJsZSBhbmQgY2xpY2sgb24gUmV0cnkgdG8gY29udGludWUuCi1lbGVtZW50UGF0aD1FbGVtZW50IHBhdGgKLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c9VGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgbWlzc2luZy4gQ2xpY2sgT0sgaWYgeW91IHdhbnQgdG8gcmVtb3ZlIGV2ZXJ5IHJlZmVyZW5jZSB0byB0aGUgc2VsZWN0ZWQgZmlsZXMgaW4gdGhlIGxpYnJhcnkKLW1pc3NpbmdGaWxlc190aXRsZT1NaXNzaW5nIGZpbGUocykKLWxvYWRFcnJvcj1Mb2FkIGVycm9yCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9GaWxlc1dpdGhMb2FkRXJyb3JzX21zZz1UaGUgZm9sbG93aW5nIGZpbGUocykgY291bGQgbm90IGJlIGxvYWRlZC4gQ2xpY2sgT0sgaWYgeW91IHdhbnQgdG8gcmVtb3ZlIGV2ZXJ5IHJlZmVyZW5jZSB0byB0aGUgc2VsZWN0ZWQgZmlsZXMgaW4gdGhlIGxpYnJhcnkKLWZpbGVzV2l0aExvYWRFcnJvcnNfdGl0bGU9RmlsZShzKSB3aXRoIGxvYWQgZXJyb3IKLQotIyBFcnJvciBNZXNzYWdlcwotbGlicmFyeUFscmVhZHlFeGlzdHNFcnJvcl9tc2c9QSBtZXRob2QgbGlicmFyeSBhbHJlYWR5IGV4aXN0cyBpbiAnJ3swfScnLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDIwMTg0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkRlYnVnVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5BYnN0cmFjdExpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTW9kZWxTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBYTUkgTGlicmFyeSBNYW5hZ2VyIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5TWFuYWdlciBleHRlbmRzIEFic3RyYWN0TGlicmFyeU1hbmFnZXIgewotCS8qKgotCSAqIFRoZSBzdXBwb3J0ZWQgbGlicmFyeSB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfVFlQRSA9ICJ4bWkiOwotCi0JLyoqCi0JICogVGhlIGxpYnJhcnkgWE1JIGZpbGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX1hNSSA9ICJsaWJyYXJ5LnhtaSI7Ci0KLQkvKioKLQkgKiBUaGUgcGx1Z2luIGFuZCBjb25maWcgc3BlYyBleHBvcnQgZmlsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGV4cG9ydEZpbGUgPSAiZXhwb3J0LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JLyoqCi0JICogVGhlIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfTElCUkFSWV9QQVRIID0gImxpYnJhcnkucGF0aCI7Ci0KLQkvLyBUaGUgbmFtZSBvZiB0aGUgbG9jayBmaWxlIGZvciBhIGxpYnJhcnkuCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9MT0NLX0ZJTEVOQU1FID0gIi5sb2NrIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIG1hbmFnZWQgbGlicmFyeS4KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhdGg7Ci0KLQkvLyBUaGUgZmlsZSBsb2NrIGZvciB0aGUgbWFuYWdlZCBsaWJyYXJ5LgotLy8JcHJpdmF0ZSBGaWxlTG9jayBsb2NrOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgaXMgbG9ja2VkLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIGRpc2FibGUgdGhpcyBjb2RlIGZvciBub3cgLSBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NzEwNgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBsaWJyYXJ5IGlzIGxvY2tlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kTGlicmFyeUxvY2tlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotLyoJCWlmIChkZWJ1ZykgeyAKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImlzTWV0aG9kTGlicmFyeUxvY2tlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gWE1JTGlicmFyeVV0aWwuaXNNZXRob2RMaWJyYXJ5TG9ja2VkKGdldE1ldGhvZExpYnJhcnlQYXRoKCkpOwotKi8JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgY3JlYXRlTWV0aG9kTGlicmFyeShTdHJpbmcgbmFtZSwgTWFwIGFyZ3MpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImNyZWF0ZU1ldGhvZExpYnJhcnkiLCAibmFtZT0iICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDAgfHwgYXJncyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGFyZ3MuZ2V0KEFSR19MSUJSQVJZX1BBVEgpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotCQlGaWxlIGxpYnJhcnlYTUlGaWxlID0gbmV3IEZpbGUobGlicmFyeVBhdGgsIExJQlJBUllfWE1JKTsKLQkJaWYgKGxpYnJhcnlYTUlGaWxlLmV4aXN0cygpKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCVhNSUxpYnJhcnlSZXNvdXJjZXMubGlicmFyeUFscmVhZHlFeGlzdHNFcnJvcl9tc2csCi0JCQkJCWxpYnJhcnlQYXRoLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCXRocm93IG5ldyBMaWJyYXJ5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihtc2cpOwotCQl9Ci0KLQkJaWYgKCFsaWJyYXJ5UGF0aC5leGlzdHMoKSkgewotCQkJbGlicmFyeVBhdGgubWtkaXJzKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJc2tpcEV2ZW50UHJvY2Vzc2luZyA9IHRydWU7Ci0KLQkJCS8vIExvY2sgdGhlIG1ldGhvZCBsaWJyYXJ5IHRvIHByZXZlbnQgYWNjZXNzIGJ5IGFub3RoZXIgRVBGIGNvbXBvc2VyCi0JCQkvLyBpbnN0YW5jZS4KLQkJCWxvY2tNZXRob2RMaWJyYXJ5KGxpYnJhcnlQYXRoKTsKLQotCQkJLy8gT3BlbiB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBmaWxlLgotCQkJTWV0aG9kTGlicmFyeVByb2plY3Qub3BlblByb2plY3QobGlicmFyeVBhdGguZ2V0QWJzb2x1dGVQYXRoKCksCi0JCQkJCW51bGwpOwotCi0JCQkvLyBDcmVhdGUgdGhlIHJlc291cmNlIHNldC4KLQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgZWRpdGluZ0RvbWFpbgotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQotCQkJLy8gQ3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotCQkJTW9kZWxTdG9yYWdlLm5ld0xpYnJhcnkocmVzb3VyY2VTZXQsIG5hbWUsIGxpYnJhcnlQYXRoCi0JCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSwgdHJ1ZSk7Ci0JCQlsaWJyYXJ5ID0gcmVzb3VyY2VTZXQuZ2V0Rmlyc3RNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJCS8vIEFkZCBhIGxpc3RlbmVyIHRvIG1vbml0b3IgbGlicmFyeSByZXNvdXJjZSBjaGFuZ2VzLgotCQkJYWRkUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXJzKCk7Ci0KLQkJCS8vIC8vIHRoaXMgaXMgYWxyZWFkeSBtb3ZlZCB0byBMaWJyYXJ5U2VydmljZQotCQkJLy8gbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0xPQURFRCwgbnVsbCk7Ci0KLQkJCWlmIChkZWJ1ZykgewotCQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywKLQkJCQkJCSJjcmVhdGVNZXRob2RMaWJyYXJ5IiwgImxpYnJhcnk9IiArIGxpYnJhcnkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJcmV0dXJuIGxpYnJhcnk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlza2lwRXZlbnRQcm9jZXNzaW5nID0gZmFsc2U7Ci0KLQkJCS8vIC8vIGV2ZW50IHByb2Nlc3NlZCBpbiBMaWJyYXJ5U2VydmljZQotCQkJLy8gbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NSRUFURUQsIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5IFVSSQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KGphdmEubmV0LlVSSSB1cmkpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgIm9wZW5NZXRob2RMaWJyYXJ5Iik7Ci0JCX0KLQotCQlpZiAodXJpID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmkpOwotCQkJbGlicmFyeSA9IG9wZW5NZXRob2RMaWJyYXJ5KGZpbGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbGlicmFyeSA9IG51bGw7Ci0JCX0KLQotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgIm9wZW5NZXRob2RMaWJyYXJ5IiwgImxpYnJhcnk9IiArIGxpYnJhcnkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+RmlsZTwvY29kZT4gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHBhdGggdG8gdGhlCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeS4KLQkgKiBAcmV0dXJuIGEgPGNvZGU+TWV0aG9kTGlicmFyeTwvY29kZT4uCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoRmlsZSBwYXRoKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJRmlsZSBsaWJyYXJ5WE1JRmlsZSA9IG5ldyBGaWxlKHBhdGgsIExJQlJBUllfWE1JKTsKLQkJaWYgKCFsaWJyYXJ5WE1JRmlsZS5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IExpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJLy9BbiBvbGQgdmVyc2lvbiBsaWJyYXJ5IHNob3VsZCBhbHdheXMgYmUgb3Blbm5lZCBmcm9tIE9wZW5MaWJyYXJ5V2l6YXJkLiBEb24ndCB3YW50IHRvIGhhbmRsZSBpdCBoZXJlLgotCQlWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8gPSBWZXJzaW9uVXRpbC5jaGVja0xpYnJhcnlWZXJzaW9uKGxpYnJhcnlYTUlGaWxlKTsKLQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLnJlc3VsdCA+IDApIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbigpOwotCQl9IGVsc2UgaWYgKFhNSUxpYnJhcnlVdGlsLmlzTWV0aG9kTGlicmFyeVVwZ3JhZGVSZXF1aXJlZChwYXRoLmdldEFic29sdXRlUGF0aCgpLCBMSUJSQVJZX1hNSSkpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbigpOwotCQl9Ci0JCQkJCi0JCXRyeSB7Ci0JCQlza2lwRXZlbnRQcm9jZXNzaW5nID0gdHJ1ZTsKLQotCQkJLy8gTG9jayB0aGUgbWV0aG9kIGxpYnJhcnkgdG8gcHJldmVudCBhY2Nlc3MgYnkgYW5vdGhlciBFUEYgY29tcG9zZXIKLQkJCS8vIGluc3RhbmNlLgotCQkJbG9ja01ldGhvZExpYnJhcnkocGF0aCk7Ci0KLQkJCS8vIE9wZW4gdGhlIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgZmlsZS4KLQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0Lm9wZW5Qcm9qZWN0KHBhdGguZ2V0QWJzb2x1dGVQYXRoKCksIG51bGwpOwotCi0JCQkvLyBDcmVhdGUgdGhlIHJlc291cmNlIHNldC4KLQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIGVkaXRpbmdEb21haW4KLQkJCQkJLmdldFJlc291cmNlU2V0KCkpOwotCi0JCQkvLyBMb2FkIHRoZSBtZXRob2QgbGlicmFyeS4KLQkJCXJlc291cmNlU2V0LmxvYWRNZXRob2RMaWJyYXJpZXMoVVJJLmNyZWF0ZUZpbGVVUkkobGlicmFyeVhNSUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpCi0JCQkJCSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCWxpYnJhcnkgPSByZXNvdXJjZVNldC5nZXRGaXJzdE1ldGhvZExpYnJhcnkoKTsKLQkJCQotCQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gbW9uaXRvciBsaWJyYXJ5IHJlc291cmNlIGNoYW5nZXMuCi0JCQlhZGRSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcnMoKTsKLQotCQkJcmV0dXJuIGxpYnJhcnk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KGUpOwotCQkJfQotCQkJdGhyb3cgbmV3IExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJZmlyZVByb3BlcnR5Q2hhbmdlKGxpYnJhcnksIFBST1BfRElSVFkpOwotCQkJc2tpcEV2ZW50UHJvY2Vzc2luZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVW5sb2NrcyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiBAZGVwcmVjYXRlZCBkaXNhYmxlIHRoaXMgY29kZSBmb3Igbm93IC0gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDcxMDYKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bmxvY2tNZXRob2RMaWJyYXJ5KCkgewotLyoJCXRyeSB7Ci0JCQlpZiAobG9jayAhPSBudWxsKSB7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQkJbG9jay5jaGFubmVsKCkuY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAidW5sb2NrTWV0aG9kTGlicmFyeSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLSovCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KE1hcCBhcmdzKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJvcGVuTWV0aG9kTGlicmFyeSIpOwotCQl9Ci0KLQkJaWYgKGFyZ3MgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBhcmdzLmdldChBUkdfTElCUkFSWV9QQVRIKTsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCWxpYnJhcnkgPSBvcGVuTWV0aG9kTGlicmFyeShuZXcgRmlsZShwYXRoKSk7Ci0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJvcGVuTWV0aG9kTGlicmFyeSIsICJsaWJyYXJ5PSIgKyBsaWJyYXJ5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlyZXR1cm4gbGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZW9wZW5zIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IHJlb3Blbk1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgInJlb3Blbk1ldGhvZExpYnJhcnkiKTsKLQkJfQotCi0JCWxpYnJhcnkgPSBvcGVuTWV0aG9kTGlicmFyeShuZXcgRmlsZShnZXRNZXRob2RMaWJyYXJ5UGF0aCgpKSk7Ci0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJyZW9wZW5NZXRob2RMaWJyYXJ5IiwgImxpYnJhcnk9IiArIGxpYnJhcnkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIExvY2tzIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IHRvIHByZXZlbnQgYWNjZXNzIGJ5IGFub3RoZXIgRVBGCi0JICogQ29tcG9zZXIgaW5zdGFuY2UuCi0JICogPHA+Ci0JICogVGhlIC5sb2NrIGZpbGUgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IGZvbGRlciB3aWxsIGJlIGxvY2tlZC4gSWYgaXQgZG9lcwotCSAqIG5vdCBleGlzdHMsIGEgbmV3IC5sb2NrIGZpbGUgd2lsbCBiZSBjcmVhdGVkLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIGRpc2FibGUgdGhpcyBjb2RlIGZvciBub3cgLSBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NzEwNgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIDxjb2RlPkZpbGU8L2NvZGU+IG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBwYXRoIHRvIHRoZQotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9ja01ldGhvZExpYnJhcnkoRmlsZSBwYXRoKSB7Ci0vKgkJRmlsZSBsb2NrRmlsZSA9IG5ldyBGaWxlKHBhdGgsIFJlc291cmNlVXRpbC5MT0NLX0ZJTEVOQU1FKTsKLQkJbG9jayA9IEZpbGVVdGlsLmxvY2tGaWxlKGxvY2tGaWxlKTsKLSovCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuQWJzdHJhY3RMaWJyYXJ5TWFuYWdlciNnZXRMaWJyYXJ5UGVyc2lzdGVyVHlwZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMaWJyYXJ5UGVyc2lzdGVyVHlwZSgpIHsKLQkJcmV0dXJuIFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkFic3RyYWN0TGlicmFyeU1hbmFnZXIjY3JlYXRlUmVzb3VyY2VTZXQoKQotCSAqLwotCXByb3RlY3RlZCBJTGlicmFyeVJlc291cmNlU2V0IGNyZWF0ZVJlc291cmNlU2V0KCkgewotCQlyZXR1cm4gUGVyc2lzdGVuY2VTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVJlc291cmNlU2V0KFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZExpYnJhcnlQYXRoKCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImdldE1ldGhvZExpYnJhcnlQYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWphdmEubmV0LlVSSSBsaWJyYXJ5VVJJID0gZ2V0TWV0aG9kTGlicmFyeVVSSSgpOwotCQlpZiAobGlicmFyeVVSSSAhPSBudWxsKSB7Ci0JCQkvLyBGaWxlIGxpYnJhcnlYTUlGaWxlID0gbmV3IEZpbGUobGlicmFyeVVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlGaWxlIGxpYnJhcnlYTUlGaWxlID0gbmV3IEZpbGUobGlicmFyeVVSSSk7Ci0JCQlpZiAobGlicmFyeVhNSUZpbGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoTElCUkFSWV9YTUkpKSB7Ci0JCQkJbGlicmFyeVhNSUZpbGUgPSBsaWJyYXJ5WE1JRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbGlicmFyeVhNSUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiMThiNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBYTUkgTGlicmFyeSBwbHVnLWluIGFjdGl2YXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFhNSUxpYnJhcnlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgWE1JTGlicmFyeVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1JTGlicmFyeVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5UmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzRjMjQ2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIFhNSSBMaWJyYXJ5IHJlc291cmNlIGJ1bmRsZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbm5vdFdyaXRlVG9GaWxlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRQYXRoOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZVBhdGg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZEVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ0ZpbGVzX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvRmlsZXNXaXRoTG9hZEVycm9yc19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9NaXNzaW5nRmlsZXNfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZE9ubHlGaWxlc19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkT25seUZpbGVzX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlBbHJlYWR5RXhpc3RzRXJyb3JfbXNnOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1JTGlicmFyeVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBYTUlMaWJyYXJ5UmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjA2N2ZkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogSGVscGVyIHV0aWxpdGllcyBmb3IgYWNjZXNzaW5nIGEgWE1JIG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlVdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9NRVRIT0RfTElCUkFSWV9QQVRIX01TRyA9IExpYnJhcnlSZXNvdXJjZXMuZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX0xJQlJBUllfRklMRV9NU0cgPSBMaWJyYXJ5UmVzb3VyY2VzLm1pc3NpbmdMaWJyYXJ5RmlsZUVycm9yX3JlYXNvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT1VMRF9OT1RfTE9DS19MSUJSQVJZX01TRyA9IExpYnJhcnlSZXNvdXJjZXMuY291bGROb3RMb2NrTGlicmFyeV9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgRU1QVFlfTUVUSE9EX0xJQlJBUllfUEFUSF9TVEFUVVMgPSBuZXcgU3RhdHVzKAotCQkJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAxLAotCQkJRU1QVFlfTUVUSE9EX0xJQlJBUllfUEFUSF9NU0csIG51bGwpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJU3RhdHVzIE1JU1NJTkdfTElCUkFSWV9GSUxFX1NUQVRVUyA9IG5ldyBTdGF0dXMoCi0JCQlTdGF0dXMuRVJST1IsIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIDEsCi0JCQlNSVNTSU5HX0xJQlJBUllfRklMRV9NU0csIG51bGwpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJU3RhdHVzIENPVUxEX05PVF9MT0NLX0xJQlJBUllfU1RBVFVTID0gbmV3IFN0YXR1cygKLQkJCVN0YXR1cy5FUlJPUiwgTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgMSwKLQkJCUNPVUxEX05PVF9MT0NLX0xJQlJBUllfTVNHLCBudWxsKTsKLQotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQkvLyBUT0RPOiBUaGlzIGNhbGwgaXMgbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIHBlcnNpc3RlbmNlIGxheWVyCi0JCQkvLyB0byBhdm9pZCBhIG51bGwgcG9pbnRlciBleGNlcHRpb24gaW4KLQkJCS8vIFBlcnNpc3RlbmNlVXRpbC5jb252ZXJzaW9uUmVxdWlyZWQoKS4gQSBiZXR0ZXIgc29sdXRpb24gaXMKLQkJCS8vIG5lZWRlZC4KLQkJCW5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBsaWJyYXJ5IGV4aXN0cyBvbiBhIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBhdGggY29udGFpbnMgYSB2YWxpZCBtZXRob2QKLQkgKiAgICAgICAgIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzTWV0aG9kTGlicmFyeShTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlGaWxlIGxpYnJhcnlEaXIgPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKCFsaWJyYXJ5RGlyLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlGaWxlIGxpYnJhcnlGaWxlID0gbmV3IEZpbGUobGlicmFyeURpciwgWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9YTUkpOwotCQlpZiAoIWxpYnJhcnlGaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkgbW9kZWwgKGxpYnJhcnkueG1pKSBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJudCBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkgbW9kZWwgZmlsZSAoaWYgb25lIGV4aXN0cykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMaWJyYXJ5TW9kZWxGaWxlKFN0cmluZyBwYXRoKSB7Ci0JCWlmICghU3RyVXRpbC5pc0JsYW5rKHBhdGgpKSB7Ci0JCQlTdHJpbmcgbGliUGF0aCA9IG5ldyBGaWxlKHBhdGgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJU3RyaW5nIHN1ZmZpeCA9IEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FOwotCQkJaWYgKGxpYlBhdGguZW5kc1dpdGgoc3VmZml4KSkgewotCQkJCXJldHVybiBsaWJQYXRoOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbGliUGF0aCArIHN1ZmZpeDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgYSBtZXRob2QgbGlicmFyeSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gdmFsaWRhdGVNb2RlbEZpbGUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCB2YWxpZGF0ZSB0aGF0IHRoZSBsaWJyYXJ5LnhtaSBmaWxlCi0JICogICAgICAgICAgICBhbHNvIGV4aXN0cy4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBwYXRoIGlzIGEgdmFsaWQgbWV0aG9kIGxpYnJhcnkKLQkgKiAgICAgICAgIGZvbGRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBpc1ZhbGlkTGlicmFyeShTdHJpbmcgcGF0aCwgYm9vbGVhbiB2YWxpZGF0ZU1vZGVsRmlsZSkgewotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9NRVRIT0RfTElCUkFSWV9QQVRIX1NUQVRVUzsKLQkJfQotCi0JCWlmICh2YWxpZGF0ZU1vZGVsRmlsZSkgewotCQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUoZ2V0TGlicmFyeU1vZGVsRmlsZShwYXRoKSk7Ci0JCQlpZiAoIWxpYkZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gTUlTU0lOR19MSUJSQVJZX0ZJTEVfU1RBVFVTOwotCQkJfQotCQl9Ci0KLQkJRmlsZSBsaWJQYXRoID0gbmV3IEZpbGUocGF0aCk7Ci0JCWlmIChwYXRoLmVuZHNXaXRoKE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTElCUkFSWV9NT0RFTF9GSUxFTkFNRSkpIHsKLQkJCWxpYlBhdGggPSBsaWJQYXRoLmdldFBhcmVudEZpbGUoKTsKLQkJfQotCi0JCVN0cmluZyBsaWJGdWxsUGF0aCA9IGxpYlBhdGguZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJaWYgKGxpYkZ1bGxQYXRoLnN0YXJ0c1dpdGgoIlxcIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gdGhlIGZpcnN0IHBhcnQgbXVzdCBiZSBhIG1hY2hpbmUgbmFtZSwgYW5kIHlvdSBtdXN0IHNwZWNpZnkgYQotCQkJLy8gZm9sZGVyCi0KLQkJCWJvb2xlYW4gaXNWYWxpZCA9IHRydWU7Ci0JCQlTdHJpbmcgdW5jUGF0aDsKLQkJCWludCBpbmRleCA9IGxpYkZ1bGxQYXRoLmluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyLCAyKTsKLQkJCWlmIChpbmRleCA8IDApIHsKLQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXVuY1BhdGggPSBsaWJGdWxsUGF0aC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQlpZiAodW5jUGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCS8vIG11c3Qgc3BlY2lmeSBhIHZhbGlkIHBhdGgKLQkJCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHRoZSB0b3AgbGV2ZWwgcGF0aCBtdXN0IGJlIHZhbGlkCi0JCQkJCWluZGV4ID0gbGliRnVsbFBhdGguaW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIsIGluZGV4ICsgMSk7Ci0JCQkJCWlmIChpbmRleCA8IDApIHsKLQkJCQkJCXVuY1BhdGggPSBsaWJGdWxsUGF0aDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXVuY1BhdGggPSBsaWJGdWxsUGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCQl9Ci0KLQkJCQkJRmlsZSBmID0gbmV3IEZpbGUodW5jUGF0aCk7Ci0JCQkJCWlmICghZi5leGlzdHMoKSkgewotCQkJCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIWlzVmFsaWQpIHsKLQkJCQkvLyBubyBuZXcgcmVzb3VyY2Ugc3RyaW5nLCB3YWl0IGxhdGVyCi0JCQkJLy8gcmV0dXJuIG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLAotCQkJCS8vIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIDEsICJJbnZhbGlkIHBhdGgiLCBudWxsKTsKLQkJCQlyZXR1cm4gRU1QVFlfTUVUSE9EX0xJQlJBUllfUEFUSF9TVEFUVVM7Ci0JCQl9Ci0JCX0KLQotCQkvLyBDaGVjayBmb3IgcHJlc2VuY2Ugb2YgYSAucHJvamVjdCBmaWxlLgotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luCi0JCQkJCS5nZXRXb3Jrc3BhY2UoKQotCQkJCQkubG9hZFByb2plY3REZXNjcmlwdGlvbigKLQkJCQkJCQluZXcgUGF0aChsaWJGdWxsUGF0aCArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJCQkrIElQcm9qZWN0RGVzY3JpcHRpb24uREVTQ1JJUFRJT05fRklMRV9OQU1FKSk7Ci0JCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCS8vIElmIGEgLnByb2plY3QgZmlsZSBkb2VzIG5vdCBleGlzdHMsIHVzZSBpdCB0byB2YWxpZGF0ZSB0aGUgcGF0aC4KLQkJLy8gb25seSBjYWxsIHZhbGlkYXRlUHJvamVjdExvY2F0aW9uIGlmIHBhdGggaXMgbm90IG9uIHdvcmtzcGFjZQotCQkvLyBmb3Igc29tZSByZWFzb24sIHZhbGlkYXRlUHJvamVjdExvY2F0aW9uIG9ubHkgd29ya3Mgb24gcGF0aHMgbm90IG9uIHRoZSB3b3Jrc3BhY2UKLQkJaWYgKFBsYXRmb3JtLmdldExvY2F0aW9uKCkuaXNQcmVmaXhPZihuZXcgUGF0aChsaWJGdWxsUGF0aCkpKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VVdGlsLmZpbmRQcm9qZWN0KGxpYkZ1bGxQYXRoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgKLQkJCQkJbGliUGF0aC5nZXROYW1lKCkpOwotCQl9Ci0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZVByb2plY3RMb2NhdGlvbihwcm9qZWN0LAotCQkJCW5ldyBQYXRoKGxpYkZ1bGxQYXRoKSk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIGEgbWV0aG9kIGxpYnJhcnkgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyBhIHZhbGlkIG1ldGhvZCBsaWJyYXJ5Ci0JICogICAgICAgICBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgaXNWYWxpZExpYnJhcnkoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGlzVmFsaWRMaWJyYXJ5KHBhdGgsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBsaWJyYXJ5IGlzIGxvY2tlZC4KLQkgKiA8cD4KLQkgKiBPbmNlIGEgbWV0aG9kIGxpYnJhcnkgaXMgbG9ja2VkLCBpdCBjYW5ub3QgYmUgYWNjZXNzZWQgYnkgYW5vdGhlciBFUEYKLQkgKiBDb21wb3NlciBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBkaXNhYmxlIHRoaXMgY29kZSBmb3Igbm93IC0gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDcxMDYKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgaXMgbG9ja2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWV0aG9kTGlicmFyeUxvY2tlZChTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gZmFsc2U7Ci0vKgkJLy8gY2hlY2sgaWYgbGlicmFyeSBpcyBjdXJyZW50bHkgb3BlbmVkIGJ5IHRoaXMgaW5zdGFuY2UKLQkJLy8gdGhlIEZpbGVMb2NrIG1lY2hhbmlzbSBpbiBKYXZhIGRvZXMgbm90IHNlZW0gdG8gcHJvcGVybHkgZGV0ZWN0IHdoZW4KLQkJLy8gCQl0aGUgY3VycmVudCBKVk0gaGFzIGxvY2tlZCB0aGUgZmlsZQotCQkvLyBUT0RPOiBjaGVjayBhbGwgb3BlbmVkIGxpYnJhcmllcyAocmF0aGVyIHRoYW4ganVzdCBjdXJyZW50KSB3aGVuIHRoZSBBUEkgYWxsb3dzIGl0Ci0JCVN0cmluZyBjdXJyZW50TGlicmFyeVBhdGggPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpOwotCQlpZiAoY3VycmVudExpYnJhcnlQYXRoICE9IG51bGwgJiYgbmV3IEZpbGUoY3VycmVudExpYnJhcnlQYXRoKS5lcXVhbHMobmV3IEZpbGUocGF0aCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlGaWxlIGxvY2tGaWxlID0gbmV3IEZpbGUocGF0aCwgUmVzb3VyY2VVdGlsLkxPQ0tfRklMRU5BTUUpOwotCQlyZXR1cm4gRmlsZVV0aWwuaXNGaWxlTG9ja2VkKGxvY2tGaWxlKTsKLSovCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGxpYnJhcnkgbmVlZHMgdG8gYmUgdXBncmFkZWQgdG8gYSBuZXcgZm9ybWF0LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbGlicmFyeSBuZWVkcyB0byBiZSB1cGdyYWRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01ldGhvZExpYnJhcnlVcGdyYWRlUmVxdWlyZWQoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGlzTWV0aG9kTGlicmFyeVVwZ3JhZGVSZXF1aXJlZChwYXRoLCBYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1hNSSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01ldGhvZExpYnJhcnlVcGdyYWRlUmVxdWlyZWQoU3RyaW5nIHBhdGgsIFN0cmluZyBsaWJYbWkpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uTWFwcGluZ1V0aWwuY29udmVyc2lvblJlcXVpcmVkKAotCQkJCQlwYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBsaWJYbWkpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IFhNSSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KFN0cmluZyBuYW1lLCBTdHJpbmcgcGF0aCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCU1hcCBhcmdzID0gbmV3IEhhc2hNYXAoKTsKLQkJYXJncy5wdXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCwgcGF0aCk7Ci0JCXJldHVybiBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZU1ldGhvZExpYnJhcnkobmFtZSwKLQkJCQlYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1RZUEUsIGFyZ3MpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGFuIGV4aXN0aW5nIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoU3RyaW5nIHBhdGgpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlNYXAgYXJncyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWFyZ3MucHV0KFhNSUxpYnJhcnlNYW5hZ2VyLkFSR19MSUJSQVJZX1BBVEgsIHBhdGgpOwotCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5vcGVuTWV0aG9kTGlicmFyeSgKLQkJCQlYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1RZUEUsIGFyZ3MpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuTWV0aG9kTGlicmFyeVByb2plY3QoTWV0aG9kTGlicmFyeSBsaWJyYXJ5LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwgJiYgbGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKS5pc0ZpbGUoKSkgewkJCQotCQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlVXRpbC5maW5kUHJvamVjdChsaWJyYXJ5KTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQl0cnkgewotCQkJCQlwcm9qZWN0Lm9wZW4oSVJlc291cmNlLkJBQ0tHUk9VTkRfUkVGUkVTSCwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVhNSUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgZGlyZWN0b3J5IGdpdmVuIGJ5IHNwZWNpZmllZCBwYXRoIGNvbnRhaW5zIGEgcGx1Z2luIG9yIGNvbmZpZyBzcGVjCi0JICogZXhwb3J0IGZpbGUuIAotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNQbHVnaW5PckNvbmZpZ1NwZWNFeHBvcnRGaWxlKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXBhdGggPSBuZXcgRmlsZShwYXRoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJcGF0aCArPSBGaWxlLnNlcGFyYXRvciArIFhNSUxpYnJhcnlNYW5hZ2VyLmV4cG9ydEZpbGU7Ci0JCUZpbGUgZXhwb3J0RmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQlyZXR1cm4gZXhwb3J0RmlsZS5leGlzdHMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvTGlicmFyeVByb2Nlc3Nvci50eHQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL0xpYnJhcnlQcm9jZXNzb3IudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YWI0MWE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvTGlicmFyeVByb2Nlc3Nvci50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuVmVyc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Nb2RlbFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVNhdmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSU1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci0KLS8qKgotICogTWFuYWdlcyBhIE1ldGhvZCBMaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVByb2Nlc3NvciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QX0RJUlRZID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVByb2Nlc3NvciBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQkvLyBtYWludGFpbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24KLQkvLyB1c2VyIHNob3VsZCBjYWxsIHNldC9nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpIG1ldGhvZHMKLQkvLyBwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRDb25maWdOYW1lID0gbnVsbDsKLQotCXByaXZhdGUgTWFwIHNhdmVPcHRpb25zOwotCi0JLy8gcHJpdmF0ZSBNYXAgc2F2ZUFzT3B0aW9uczsKLQkvLyBwcml2YXRlIFNldCBlQ2xhc3NlczsKLQotCXByaXZhdGUgTGlzdCBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBrZWVwIHRoZSBsaXN0ZW5lcnMgdG8gYmUgZGVsZXRlZCwgZG8gdGhlIGRlbGV0ZSBiZWZvcmUgZWFjaCBub3RpZmljYXRpb24KLQkvLyBhbmQgZW1wdHkgdGhpcyBsaXN0LgotCS8vIGRvbid0IGRlbGV0ZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBub3RpZmljYXRpb24gc2luY2Ugd2UgZG9uJ3Qgd2FudCB0bwotCS8vIGNoYW5nZSB0aGUgbGlzdGVuZXIgbGlzdCBhdCB0aGlzIHRpbWUKLQlwcml2YXRlIExpc3QgdG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gaXNNdWx0aXBsZUZpbGVzID0gZmFsc2U7Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gZGlydHkgPSBmYWxzZTsKLQotCWJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5PcGVyYXRpb24gPSBmYWxzZTsKLQotCXByaXZhdGUgVmVyc2lvbk1hbmFnZXIgdmVyc2lvbk1nciA9IG51bGw7Ci0KLQlwcml2YXRlIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1nciA9IG51bGw7OwotCi0JLy8gUkFUTEMwMDM4NDU5OCAtIEV4cG9ydDogSW5maW5pdGUgbG9vcCBOdWxscG9pbnRlckV4Y2VwdGlvbiBhZnRlcgotCS8vIGV4cG9ydGluZyBhbmQgdW5jaGVja2luZyBydXAgcGx1Z2luIGluIGNvbmZpZ3VyYXRpb24KLQkvLyBhZGQgdGhpcyBmbGFnIHRvIHRyZWF0IHRoZSBpbnN0YW5jZSBhcyBzaW5nbGV0b24gaW5zdGFjbmUgb3Igbm90Ci0JLy8gb25seSB0aGUgc2luZ2xldG9uIGluc3RhbmNlIGNhbiBkaXNwb3NlIHNoYXJlZCBvYmplY3RzLgotCXByaXZhdGUgYm9vbGVhbiBpc1NpbmdsZXRvbkluc3RhbmNlID0gZmFsc2U7Ci0KLQkvLyB0aGUgbG9jayBvbiB0aGUgbGlicmFyeSdzIC5wcm9qZWN0IGZpbGUKLQlwcml2YXRlIEZpbGVMb2NrIGxvY2s7Ci0KLQkvL1RPRE86IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIG5vdGlmeSB0aGUgY2hhbmdlIGluIGxpYnJhcnkgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRoZSBjb21tYW5kIHN0YWNrIGxpc3RlbmVyCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2tMaXN0ZW5lciBjb21tYW5kU3RhY2tMaXN0ZW5lciA9IG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgewotCQkJaWYgKCFpbk9wZXJhdGlvbikgewotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCi0JCQkJCQkvLwotCQkJCQkJQ29tbWFuZCBtb3N0UmVjZW50Q29tbWFuZCA9IExpYnJhcnlVdGlsCi0JCQkJCQkJCS51bndyYXAoKChDb21tYW5kU3RhY2spIGV2ZW50LmdldFNvdXJjZSgpKQotCQkJCQkJCQkJCS5nZXRNb3N0UmVjZW50Q29tbWFuZCgpKTsKLQotCQkJCQkJaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQlpZiAobW9zdFJlY2VudENvbW1hbmQgaW5zdGFuY2VvZiBBZGRDb21tYW5kKSB7Ci0JCQkJCQkJCUFkZENvbW1hbmQgY21kID0gKEFkZENvbW1hbmQpIG1vc3RSZWNlbnRDb21tYW5kOwotCQkJCQkJCQlFT2JqZWN0IG93bmVyID0gY21kLmdldE93bmVyKCk7Ci0JCQkJCQkJCWlmIChvd25lciBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJCQkJCUNvbGxlY3Rpb24gb2JqcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCW9ianMuYWRkKG93bmVyKTsKLQkJCQkJCQkJCW5vdGlmeUxpc3RlbmVycygKLQkJCQkJCQkJCQkJSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwKLQkJCQkJCQkJCQkJb2Jqcyk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlDb2xsZWN0aW9uIG9ianMgPSBtb3N0UmVjZW50Q29tbWFuZC5nZXRSZXN1bHQoKTsKLQkJCQkJCQkJCW5vdGlmeUxpc3RlbmVycygKLQkJCQkJCQkJCQkJSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTkVXQ0hJTEQsCi0JCQkJCQkJCQkJCW9ianMpOwotCQkJCQkJCQkJCi0JCQkJCQkJCQkvLyB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIGlmIHRoZQotCQkJCQkJCQkJLy8gb2JqZWN0IGlzIGEgbmV3bHkgYWRkZWQgbWV0aG9kIHBhY2thZ2UKLQkJCQkJCQkJCS8vCi0JCQkJCQkJCQlpZiAob3duZXIgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCQkJCQkJb2JqcyA9IExpYnJhcnlVdGlsLmdldENvbnRhaW5lZEVsZW1lbnRzKG93bmVyLCBvYmpzKTsKLQkJCQkJCQkJCQlpZighb2Jqcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCQkJYWRkTmV3UGFja2FnZXNUb0NvbmZpZ3VyYXRpb24ob2Jqcyk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0KLQkJCQkJCQl9IAotCQkJCQkJCWVsc2UgaWYobW9zdFJlY2VudENvbW1hbmQgaW5zdGFuY2VvZiBQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKSB7Ci0JCQkJCQkJCUNvbGxlY3Rpb24gb2JqcyA9IG1vc3RSZWNlbnRDb21tYW5kLmdldFJlc3VsdCgpOwotCQkJCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTkVXQ0hJTEQsIG9ianMpOwkKLQkJCQkJCQkJUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCBjbWQgPSAoKFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpbW9zdFJlY2VudENvbW1hbmQpOwotCQkJCQkJCQkKLQkJCQkJCQkJLy8gdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGlvbiBpZiB0aGUKLQkJCQkJCQkJLy8gb2JqZWN0IGlzIGEgbmV3bHkgYWRkZWQgbWV0aG9kIHBhY2thZ2UKLQkJCQkJCQkJLy8KLQkJCQkJCQkJaWYgKGNtZC5nZXRPd25lcigpIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQkJCQkJb2JqcyA9IExpYnJhcnlVdGlsLmdldENvbnRhaW5lZEVsZW1lbnRzKGNtZC5nZXRPd25lcigpLCBvYmpzKTsKLQkJCQkJCQkJCWlmKCFvYmpzLmlzRW1wdHkoKSkgewotCQkJCQkJCQkJCWFkZE5ld1BhY2thZ2VzVG9Db25maWd1cmF0aW9uKG9ianMpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKG1vc3RSZWNlbnRDb21tYW5kIGluc3RhbmNlb2YgQ3JlYXRlQ2hpbGRDb21tYW5kKSB7Ci0JCQkJCQkJCW5vdGlmeUxpc3RlbmVycygKLQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCwKLQkJCQkJCQkJCQltb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7Ci0JCQkJCQkJfSBlbHNlIGlmIChtb3N0UmVjZW50Q29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCQkJCW5vdGlmeUxpc3RlbmVycygKLQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELAotCQkJCQkJCQkJCW1vc3RSZWNlbnRDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBhZGQgdGhlIG5ldyBwYWNrYWdlcyBpbnRvIHRoZSBjb25maWd1cmF0aW9ucyBpZiB0aGUgcGFyZW50IGlzIGluIHRoZQotCSAqIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbmV3b2JqcwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGROZXdQYWNrYWdlc1RvQ29uZmlndXJhdGlvbihDb2xsZWN0aW9uIG5ld29ianMpIHsKLQkJaWYgKG5ld29ianMgPT0gbnVsbCB8fCBuZXdvYmpzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyIGhlbHBlciA9IG5ldyBMaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyKCk7Ci0KLQkJdHJ5IHsKLQkJCUVPYmplY3QgZSwgcGFyZW50OwotCQkJZm9yIChJdGVyYXRvciBpdCA9IG5ld29ianMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWUgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCWlmICgoZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpCi0JCQkJCQkmJiAoKHBhcmVudCA9IGUuZUNvbnRhaW5lcigpKSAhPSBudWxsKQotCQkJCQkJJiYgKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpKSB7Ci0JCQkJCU9iamVjdCBjb25maWdzID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgcGFyZW50KQotCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShBc3NvY2lhdGlvbkhlbHBlci5NZXRob2RQYWNrYWdlX01ldGhvZENvbmZpZ3VyYXRpb25zKTsKLQkJCQkJaWYgKGNvbmZpZ3MgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0Y29uZmlnID0gKChMaXN0KSBjb25maWdzKS5pdGVyYXRvcigpOyBpdGNvbmZpZwotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0Y29uZmlnCi0JCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCUxpc3QgcGtncyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKCFwa2dzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQkJCS8vIHBrZ3MuYWRkKGUpOwotCQkJCQkJCQloZWxwZXIKLQkJCQkJCQkJCQkuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJCQkJY29uZmlnLAotCQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLAotCQkJCQkJCQkJCQkJZSwgLTEpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaGVscGVyLnNhdmUoKTsKLQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaGVscGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZiAoIWluT3BlcmF0aW9uKSB7Ci0JCQkJaW50IGV2ZW50VHlwZSA9IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKTsKLQkJCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDogewotCQkJCQkvLyBvbmx5IGZvciBhZGQgTWV0aG9kUGx1Z2luLCBvciBtYXliZSBzb21lIG90aGVyIG1pc3NpbmcKLQkJCQkJLy8gc3R1ZmYgKGlmIGFueSkgdGhhdCBhcmUgbm90IGNyZWF0ZWQgYnkgYSBjb21tYW5kLgotCQkJCQkvLyBhbnl0aGluZyBjcmVhdGVkIGJ5IGEgY29tbWFuZCBhcmUgaGFuZGxlZCBieSB0aGUKLQkJCQkJLy8gY29tbWFuZFN0YWNrTGlzdGVuZXIKLQkJCQkJT2JqZWN0IG5vdGlmaWVyID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQkJCU9iamVjdCB2ID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWlmICgobm90aWZpZXIgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KQotCQkJCQkJCSYmICh2IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJCQkJQ29sbGVjdGlvbiBhZmZlY3RlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlhZmZlY3RlZE9iamVjdHMuYWRkKHYpOwotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELAotCQkJCQkJCQlhZmZlY3RlZE9iamVjdHMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDogewotCQkJCQlPYmplY3Qgbm90aWZpZXIgPSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQkJaWYgKG5vdGlmaWVyICE9IG51bGwpIHsKLQkJCQkJCUNvbGxlY3Rpb24gYWZmZWN0ZWRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJYWZmZWN0ZWRPYmplY3RzLmFkZChub3RpZmllcik7Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwKLQkJCQkJCQkJYWZmZWN0ZWRPYmplY3RzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQkvLyBub3RlOiB0aGlzIGlzIHRoZSByZW1vdmUgb2YgZWxlbWVudHMgZnJvbSB0aGUgcGFyZW50LAotCQkJCS8vIGl0IG1pZ2h0IGJlIGEgZGVsZXRlIGFjdGlvbiwgb3IgbWlnaHQgYmUganVzdCBhIHJlbW92ZSBvZgotCQkJCS8vIHJlZmVyZW5jZXMKLQkJCQkvLyBmb3IgZGVsZXRlIGFjdGlvbiwgdGhlIGRlbGV0ZWQgZWxlbWVudCBoYXMgbm8gY29udGFpbmVyCi0JCQkJLy8gZm9yIHJlbW92ZWQgcmVmZXJlbmNlLCB0aGUgcmVtb3ZlZCBlbGVtZW50IHN0aWxsIGhhdmUgaXQncwotCQkJCS8vIHBhcmVudAotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRTogewotCQkJCQlPYmplY3Qgbm90aWZpZXIgPSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQkJT2JqZWN0IG9sZFZhbHVlID0gbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0JCQkJCUNvbGxlY3Rpb24gYWZmZWN0ZWRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpZiAob2xkVmFsdWUgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCQkJJiYgKChFT2JqZWN0KSBvbGRWYWx1ZSkuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJCS8vIHRoZSBlbGVtZW50IGlzIGRlbGV0ZWQsIHNlbnQgYSBkZWxldGUgZXZlbnQKLQkJCQkJCWFmZmVjdGVkT2JqZWN0cy5hZGQob2xkVmFsdWUpOwotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQsCi0JCQkJCQkJCWFmZmVjdGVkT2JqZWN0cyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBvdGhlcndpc2UsIGl0J3MganVzdCBhIHJlbW92ZSBvZiByZWZlcmVuY2VzLCB0aGUKLQkJCQkJCS8vIG5vdGlmaWVyIGlzIHRoZSBjaGFuZ2VkIGVsZW1lbnQKLQkJCQkJCWFmZmVjdGVkT2JqZWN0cy5hZGQobm90aWZpZXIpOwotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCWFmZmVjdGVkT2JqZWN0cyk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOiB7Ci0JCQkJCUxpc3Qgb2xkVmFsdWUgPSBuZXcgQXJyYXlMaXN0KChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24KLQkJCQkJCQkuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCUFycmF5TGlzdCBkZWxldGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCUFycmF5TGlzdCByZW1vdmVkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYgKCFvbGRWYWx1ZS5pc0VtcHR5KCkpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9sZFZhbHVlLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJCQlpZiAoKChFT2JqZWN0KSBlbGVtZW50KS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVsZXRlZEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXJlbW92ZWRSZWZlcmVuY2VzLmFkZChlbGVtZW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWRlbGV0ZWRFbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJCS8vIHRoZSBlbGVtZW50IGlzIGRlbGV0ZWQsIHNlbnQgYSBkZWxldGUgZXZlbnQKLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ERUxFVEVELAotCQkJCQkJCQlkZWxldGVkRWxlbWVudHMpOwotCQkJCQl9Ci0JCQkJCWlmICghcmVtb3ZlZFJlZmVyZW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkvLyBvdGhlcndpc2UsIGl0J3MganVzdCBhIHJlbW92ZSBvZiByZWZlcmVuY2VzLCB0aGUKLQkJCQkJCS8vIG5vdGlmaWVyIGlzIHRoZSBjaGFuZ2VkIGVsZW1lbnQKLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELAotCQkJCQkJCQlyZW1vdmVkUmVmZXJlbmNlcyk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGlzdGVuZXJBZGRlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBBZGFwdGVyIGxpYkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTWV0aG9kTGlicmFyeS5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlM6Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbjsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCQkJCXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5hZGQoCi0JCQkJCQkJCXJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlwbHVnaW4uZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkucmVtb3ZlKAotCQkJCQkJCXJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQkJCQlwbHVnaW4uZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkucmVtb3ZlKAotCQkJCQkJCQlyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgQWRhcHRlciByZXNvdXJjZUNoYW5nZWRMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAobXNnLmdldEZlYXR1cmVJRChudWxsKSA9PSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTU9ESUZJRUQKLQkJCQkJJiYgbXNnLmdldEV2ZW50VHlwZSgpID09IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbi5TRVQpIHsKLQkJCQkvLyBkaXJ0eSA9IHRydWU7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKG1zZy5nZXROb3RpZmllcigpLCBQUk9QX0RJUlRZKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3RlbmVyTGlzdCBwcm9wQ2hhbmdlTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCi0JcHJpdmF0ZSBJUmVmcmVzaExpc3RlbmVyIHJlZnJlc2hMaXN0ZW5lciA9IG5ldyBJUmVmcmVzaExpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeVJlZnJlc2hlZChJUmVmcmVzaEV2ZW50IGV2ZW50KSB7Ci0JCQloYW5kbGVSZWZyZXNoRXZlbnQoZXZlbnQpOwotCQl9Ci0JCQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlQcm9jZXNzb3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKExpYnJhcnlQcm9jZXNzb3IuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBMaWJyYXJ5UHJvY2Vzc29yKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlZnJlc2hFdmVudChJUmVmcmVzaEV2ZW50IGV2ZW50KSB7Ci0JCWlmKExvZy5ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMaWJyYXJ5UHJvY2Vzc29yLmhhbmRsZVJlZnJlc2hFdmVudCgpIik7IC8vJE5PTi1OTFMtTiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICByZWZyZXNoZWQgcmVzb3VyY2VzOiAiICsgZXZlbnQuZ2V0UmVmcmVzaGVkUmVzb3VyY2VzKCkpOwotCQl9Ci0JCWlmKCFldmVudC5nZXRVbmxvYWRlZE9iamVjdHMoKS5pc0VtcHR5KCkpIHsKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmNsZWFuVXAoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlicmFyeVByb2Nlc3NvcigpIHsKLQkJaW5pdCgpOwotCi0JCS8vIHRoaXMgaXMgdGhlIG1haW4gaW5zdGFuY2UsIHdpbGwgYmUgdHJlYXRlZCBhcyBzaW5nbGV0b24KLQkJaXNTaW5nbGV0b25JbnN0YW5jZSA9IHRydWU7Ci0JfQotCi0JcHVibGljIExpYnJhcnlQcm9jZXNzb3IoUmVzb3VyY2UgcmVzKSB7Ci0JCXRoaXMoKTsKLQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQlzZXRSZXNvdXJjZShyZXMpOwotCQl9Ci0KLQkJaXNTaW5nbGV0b25JbnN0YW5jZSA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHRoaXMgY29uc3RydWN0IHNob3VsZCBiZSBjYWxsZWQgb25seSBpZiB5b3Ugd2FudCB0byBtYWludGFpbiB5b3VyIG93bgotCSAqIExpYnJhcnlQcm9jZXNzb3IsIHN1Y2ggYXMgd2hlbiBmb3IgbGlicmFyeSBpbXBvcnRpbmcgb3IgZXhwb3J0aW5nLgotCSAqIE90aGVyd2lzZSwgY2FsbCB0aGUgc3RhdGljIGdldEluc3RhbmNlKCkgbWV0aG9kIHRvIHJldHJpZXZlIHRoZSBzaW5nbGV0b24KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeVBhdGgKLQkgKi8KLQlwdWJsaWMgTGlicmFyeVByb2Nlc3NvcihTdHJpbmcgbGlicmFyeVBhdGgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzKCk7Ci0JCW9wZW5MaWJyYXJ5KGxpYnJhcnlQYXRoKTsKLQotCQlpc1NpbmdsZXRvbkluc3RhbmNlID0gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIgbCkgewotCQlwcm9wQ2hhbmdlTGlzdGVuZXJzLmFkZChsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKElQcm9wZXJ0eUxpc3RlbmVyIGwpIHsKLQkJcHJvcENoYW5nZUxpc3RlbmVycy5yZW1vdmUobCk7Ci0JfQotCi0JLyoqCi0JICogRmlyZXMgYSBwcm9wZXJ0eSBjaGFuZ2VkIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eUlkCi0JICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShmaW5hbCBPYmplY3Qgc291cmNlLCBmaW5hbCBpbnQgcHJvcGVydHlJZCkgewotCQlPYmplY3RbXSBhcnJheSA9IHByb3BDaGFuZ2VMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IG5YID0gMDsgblggPCBhcnJheS5sZW5ndGg7IG5YKyspIHsKLQkJCWZpbmFsIElQcm9wZXJ0eUxpc3RlbmVyIGwgPSAoSVByb3BlcnR5TGlzdGVuZXIpIGFycmF5W25YXTsKLQotCQkJLy8gc2luY2UgdGhpcyB3aWxsIGNhdXNlIFVJIHVwZGF0ZSwgd2hpY2ggbXVzdCBiZSBleGVjdXRlZCBpbiB0aGUgVUkKLQkJCS8vIHRocmVhZAotCQkJLy8gb3RoZXJ3aXNlLCB3aWxsIGNhdXNlIEludmFsaWQgVGhyZWFkIEFjY2VzcyBleGNlcHRpb24KLQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlsLnByb3BlcnR5Q2hhbmdlZChzb3VyY2UsIHByb3BlcnR5SWQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpYnJhcnlMaXN0ZW5lcnMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldExpYnJhcnkoKTsKLQotCQlpZiAobGlicmFyeSA9PSBudWxsIHx8IGxpYnJhcnkuZVJlc291cmNlKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gaWYoIWxpYnJhcnkuZUFkYXB0ZXJzKCkuY29udGFpbnMobGliQ2hhbmdlZExpc3RlbmVyKSkgewotCQkvLyBsaWJyYXJ5LmVBZGFwdGVycygpLmFkZChsaWJDaGFuZ2VkTGlzdGVuZXIpOwotCQkvLyB9Ci0JCWlmICghbGlicmFyeS5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5jb250YWlucyhyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcikpIHsKLQkJCWxpYnJhcnkuZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuYWRkKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCWlmICghcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmNvbnRhaW5zKAotCQkJCQlyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcikpIHsKLQkJCQlwbHVnaW4uZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuYWRkKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVMaWJyYXJ5TGlzdGVuZXJzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRMaWJyYXJ5KCk7Ci0KLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCB8fCBsaWJyYXJ5LmVSZXNvdXJjZSgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIGxpYnJhcnkuZUFkYXB0ZXJzKCkucmVtb3ZlKGxpYkNoYW5nZWRMaXN0ZW5lcik7Ci0JCWxpYnJhcnkuZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlwbHVnaW4uZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKLQkJCWlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKHRtcF9saXN0ZW5lcnNfdG9iZV9kZWxldGVkKSB7Ci0JCQkvLyBkZWxheSB0aGUgcmVtb3ZlIHRpbGwgYSBub3RpZmljYXRpb24gaXMgcmVxdWVzdGVkCi0JCQlpZiAoIXRtcF9saXN0ZW5lcnNfdG9iZV9kZWxldGVkLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJCXRtcF9saXN0ZW5lcnNfdG9iZV9kZWxldGVkLmFkZChsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhmaW5hbCBpbnQgb3B0aW9uLAotCQkJZmluYWwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWxvYWRlZCA9IHRydWU7Ci0KLQkJdHJ5IHsKLQkJCS8vIHJlbW92ZSB0aGUgbGlzdGVuZXJzIHRvIGJlIGRlbGV0ZWQKLQkJCWlmICh0bXBfbGlzdGVuZXJzX3RvYmVfZGVsZXRlZC5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IHRtcF9saXN0ZW5lcnNfdG9iZV9kZWxldGVkLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbCA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKGxpc3RlbmVycy5jb250YWlucyhsKSkgewotCQkJCQkJbGlzdGVuZXJzLnJlbW92ZShsKTsKLQkJCQkJfQotCQkJCX0KLQkJCQl0bXBfbGlzdGVuZXJzX3RvYmVfZGVsZXRlZC5jbGVhcigpOwotCQkJfQotCi0JCQkvLyBub3RpZnkgbGlzdGVuZXJzLAotCQkJLy8gbm90ZSwgdGhlIHNpemUgbWF5IGNoYW5nZSBzaW5jZSBub3RpZnkgYSBsaXN0ZW5lciBtYXkgY2F1c2VkIG5ldwotCQkJLy8gbGlzdGVuZXJzIGJlaW5nIGFkZGVkCi0JCQkvLyB0aG9zZSBuZXcgbGlzdGVuZXJzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBzbyB3ZQotCQkJLy8gYXJlIG9rCi0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IGxpc3RlbmVycy5zaXplKCkpIHsKLQkJCQlmaW5hbCBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVycwotCQkJCQkJLmdldChpKTsKLQkJCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQkvLyBzaW5jZSB0aGlzIHdpbGwgY2F1c2UgVUkgdXBkYXRlLCB3aGljaCBtdXN0IGJlIGV4ZWN1dGVkCi0JCQkJCS8vIGluIHRoZSBVSSB0aHJlYWQKLQkJCQkJLy8gb3RoZXJ3aXNlLCB3aWxsIGNhdXNlIEludmFsaWQgVGhyZWFkIEFjY2VzcyBleGNlcHRpb24KLQotCQkJCQkvLyBleGVjdXRlIGl0IGluIHN5bmMgbW9kZSwgb3RoZXJ3aXNlIG1heSBjYXVzZSBwcm9ibGVtCi0JCQkJCS8vIHNpbmNlIHRoZSBub3RpZmljYXRpb24gbWlnaHQgYmUgZXhlY3V0ZWQgdG9vIGxhdGUuCi0JCQkJCS8vIGZvciBleGFtcGxlLCBhZnRlciB0aGUgbGlzdGVuZXIgb2JqZWN0IGlzIGRpc3Bvc2VkCi0JCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlsaXN0ZW5lci5saWJyYXJ5Q2hhbmdlZChvcHRpb24sIGNvbGxlY3Rpb24pOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0KLQkJCQlpKys7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYmVnaW5PcGVyYXRpb24oKSB7Ci0JCWluT3BlcmF0aW9uID0gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5kT3BlcmF0aW9uKCkgewotCQlpbk9wZXJhdGlvbiA9IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyB2YWxpZCBpbiB0aGUgY3VycmVudCByZXNvdXJjZSBzZXQKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoRU9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0LmVJc1Byb3h5KCkpIHsKLQkJCUVPYmplY3QgZSA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvbHZlKG9iamVjdCk7Ci0JCQlyZXR1cm4gKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmICFlLmVJc1Byb3h5KCkKLQkJCQkJJiYgVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KGUpID09IGdldExpYnJhcnkoKSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBsaWJyYXJ5J3MgcHJvamVjdCBpcyBzdGlsbCBvcGVuLiBJZiBub3QsIG9wZW4gaXQKLQkgKi8KLQkvKgotCXB1YmxpYyBib29sZWFuIGVuc3VyZUxpYnJhcnlQcm9qZWN0T3BlbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRMaWJyYXJ5KCk7Ci0JCWlmKGxpYiAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcmogPSBSZXNvdXJjZVV0aWwuZmluZFByb2plY3QobGliKTsKLQkJCWlmKHByaiAhPSBudWxsICYmICFwcmouaXNPcGVuKCkpIHsKLQkJCQl0cnkgewotCQkJCQlwcmoub3BlbihJUmVzb3VyY2UuQkFDS0dST1VORF9SRUZSRVNILCBtb25pdG9yKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCSovCi0JCi0JcHVibGljIHZvaWQgb3BlbkxpYnJhcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG9wZW5MaWJyYXJ5ID0gZ2V0TGlicmFyeVJvb3RQYXRoKCkuZ2V0QWJzb2x1dGVQYXRoKCkKLQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgImxpYnJhcnkueG1pIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAob3BlbkxpYnJhcnkgIT0gbnVsbCAmJiAhb3BlbkxpYnJhcnkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlvcGVuTGlicmFyeShvcGVuTGlicmFyeSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBvcGVuTGlicmFyeShTdHJpbmcgbGlicmFyeVBhdGgpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJYmVnaW5PcGVyYXRpb24oKTsKLQkJCQotCQkJLy8gb3BlbiB0aGUgbWV0aG9kIGxpYnJhcnkgYXMgYSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2Ugc28gaXQgd2lsbAotCQkJLy8gc2hvdyB1cCBpbiB0aGUgUmVzb3VyY2Ugdmlldy4KLQkJCS8vCi0JCQlGaWxlIGxpYkRpciA9IG5ldyBGaWxlKGxpYnJhcnlQYXRoKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkKLQkJCS8vIG9ubHkgY2xvc2UgcHJldmlvdXMgbGlicmFyeSBpZiB0aGUgbmV3IGxpYnJhcnkncyBwcm9qZWN0IHdhcwotCQkJLy8gb3BlbmVkIHN1Y2Nlc3NmdWxseQotCQkJLy8gY2xvc2UgcHJldmlvdXMgbGlicmFyeSdzIHByb2plY3Qgb25seSBpZiBpdCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUKLQkJCS8vIG5ldyBvbmUKLQkJCWNsb3NlT3BlbmVkTGlicmFyeSgpOwotCi0JCQkvLyBsb2NrIHRoZSBsaWJyYXJ5Ci0JCQkvLwotCQkJbG9ja0xpYnJhcnkobGliRGlyKTsKLQotCQkJUmVzb3VyY2VVdGlsLm9wZW4obGliRGlyLmdldEFic29sdXRlUGF0aCgpLCBudWxsKTsKLQotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGVkaXRpbmdEb21haW4KLQkJCQkJLmdldFJlc291cmNlU2V0KCkpOwotCQkJYXNzaWduTGlicmFyeShyZXNvdXJjZVNldC5sb2FkTGlicmFyeShsaWJyYXJ5UGF0aCkpOwotCi0JCQlJU3RhdHVzIHN0YXR1czsKLQkJCWlmICghcmVzb3VyY2VTZXQuaGFzVW5yZXNvbHZlZFByb3h5KCkpIHsKLQkJCQlTdHJpbmcgbXNnID0gTGlicmFyeVJlc291cmNlcwotCQkJCQkJLmdldFN0cmluZygiTGlicmFyeS51bnJlc29sdmVkUHJveHlFcnJvci5yZWFzb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldElkKCksIDAsIG1zZywgbnVsbCk7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0KLQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9MT0FERUQsIG51bGwpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfSBmaW5hbGx5IHsKLQkJCWVuZE9wZXJhdGlvbigpOwotCi0JCQkvLyBkaXJ0eSA9IGZhbHNlOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlKGdldExpYnJhcnkoKSwgUFJPUF9ESVJUWSk7Ci0KLQkJCS8vIHNldEN1cnJlbnRDb25maWd1cmF0aW9uKG51bGwpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBBc3NpZ25zIGxpYnJhcnkgdG8gYSBuZXcgdmFsdWUgYW5kIGF0dGFjaCB0aGUgY2hhbmdlIGxpc3RlbmVycyB0byBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gbGliCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFzc2lnbkxpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJcmVtb3ZlTGlicmFyeUxpc3RlbmVycygpOwotCQlhZGRMaWJyYXJ5TGlzdGVuZXJzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3TGlicmFyeShTdHJpbmcgbGlicmFyeU5hbWUsIFN0cmluZyBsaWJyYXJ5UGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljbG9zZU9wZW5lZExpYnJhcnkoKTsKLQotCQkJLy8gaXNNdWx0aXBsZUZpbGVzID0gYk11bHRpcGxlOwotCQkJYmVnaW5PcGVyYXRpb24oKTsKLQotCQkJRmlsZSBsaWJfcGF0aCA9IG5ldyBGaWxlKGxpYnJhcnlQYXRoKTsKLQkJCWxpYnJhcnlQYXRoID0gbGliX3BhdGguZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJCS8vIG9wZW4gdGhlIG1ldGhvZCBsaWJyYXJ5IGFzIGEgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlIHNvIGl0IHdpbGwKLQkJCS8vIHNob3cgdXAgaW4gdGhlIFJlc291cmNlIHZpZXcuCi0JCQlSZXNvdXJjZVV0aWwub3BlbihsaWJyYXJ5UGF0aCwgbnVsbCk7Ci0KLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGVkaXRpbmdEb21haW4KLQkJCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQlNb2RlbFN0b3JhZ2UubmV3TGlicmFyeShyZXNvdXJjZVNldCwgbGlicmFyeU5hbWUsIGxpYnJhcnlQYXRoLCB0cnVlKTsKLQkJCWFzc2lnbkxpYnJhcnkocmVzb3VyY2VTZXQuZ2V0TWV0aG9kTGlicmFyeSgpKTsKLQotCQkJLy8gbG9jayB0aGUgbGlicmFyeQotCQkJbG9ja0xpYnJhcnkobGliX3BhdGgpOwotCQl9IGZpbmFsbHkgewotCQkJZW5kT3BlcmF0aW9uKCk7Ci0JCQkvLyBzZXREaXJ0eSh0cnVlKTsKLQkJCS8vIHNldEN1cnJlbnRDb25maWd1cmF0aW9uKG51bGwpOwotCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NSRUFURUQsIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGdpdmVuIHJlc291cmNlIGlmIGl0IGJlbG9uZyB0byB0aGUgY3VycmVudGx5IG9wZW4gbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBlZGl0aW5nRG9tYWluCi0JCQkJLmdldFJlc291cmNlU2V0KCkpOwotCQlpZiAocmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQlyZXNvdXJjZVNldC5zYXZlKHJlc291cmNlLCBzYXZlT3B0aW9ucyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlTGlicmFyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCWRvU2F2ZShzYXZlT3B0aW9ucyk7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2UobGlicmFyeSwgUFJPUF9ESVJUWSk7Ci0KLQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9TQVZFRCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgb3BlbiBsaWJyYXJ5IHVuZGVyIGEgbmV3IGxvY2F0aW9uCi0JICogCi0JICogQHBhcmFtIG5ld0RpcgotCSAqICAgICAgICAgICAgZGlyZWN0b3J5IHRvIHNhdmUgdGhlIG9wZW4gbGlicmFyeSB0bwotCSAqIEBwYXJhbSByZWdlbmVyYXRlR1VJRAotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgcmVnZW5lcmF0ZSBHVUlEIGZvciBhbGwgTWV0aG9kRWxlbWVudHMgaW4gdGhlIG9wZW4KLQkgKiAgICAgICAgICAgIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTGlicmFyeUFzKFN0cmluZyBuZXdEaXIsIGJvb2xlYW4gcmVnZW5lcmF0ZUdVSUQsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgb2xkTGliRGlyID0gZ2V0TGlicmFyeVJvb3RQYXRoKCkKLQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJLy8gY3JlYXRlIG5ldyBJUHJvamVjdAotCQlSZXNvdXJjZVV0aWwub3BlbihuZXdEaXIsIG1vbml0b3IpOwotCi0JCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGdldExpYnJhcnkoKQotCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlyZXNvdXJjZVNldC5zYXZlQXMobmV3RGlyLCByZWdlbmVyYXRlR1VJRCwgbW9uaXRvcik7Ci0KLQkJLy8gaGFuZGxlIGF0dGFjaG1lbnRzIGhlcmUKLQkJQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5jb3B5QXR0YWNobWVudHNMaWJyYXJ5KG9sZExpYkRpciwgbmV3RGlyLAotCQkJCW51bGwsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5UGF0aAotCSAqIEBwYXJhbSBiTXVsdGlwbGUKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUxpYnJhcnlBcyhTdHJpbmcgbGlicmFyeVBhdGgsIGJvb2xlYW4gYk11bHRpcGxlKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFJlc291cmNlIHJlcyA9Ci0JCS8vICgoUmVzb3VyY2UpZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSk7Ci0JCS8vIHJlcy5zZXRVUkkoVVJJLmNyZWF0ZUZpbGVVUkkobGlicmFyeVBhdGgpKTsKLQkJLy8gcmVzLnNldE1vZGlmaWVkKHRydWUpOwotCQkvLwotCQkvLyBzZXRTYXZlQXNNdWx0aXBsZUZvbGRlcihiTXVsdGlwbGUpOwotCQkvLyAgICAgICAgCQotCQkvLyBkb1NhdmUoc2F2ZUFzT3B0aW9ucyk7Ci0JCS8vIHNldERpcnR5KGZhbHNlKTsKLQkJLy8gaXNNdWx0aXBsZUZpbGVzID0gYk11bHRpcGxlOwotCQkvLyAgICAgICAgCi0JCS8vIG5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9TQVZFRCwgbnVsbCk7Ci0KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFJlc291cmNlKFJlc291cmNlIHJlcykgewotCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGVkaXRpbmdEb21haW4KLQkJCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQlyZXNvdXJjZVNldC5yZXNldCgpOwotCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlcyk7Ci0JCQlhc3NpZ25MaWJyYXJ5KHJlc291cmNlU2V0LmdldE1ldGhvZExpYnJhcnkoKSk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFJlc291cmNlIGdldExpYnJhcnlSZXNvdXJjZSgpIHsKLQkJTGlzdCByZXMgPSBnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKTsKLQkJaWYgKHJlcy5zaXplKCkgPiAwKSB7Ci0JCQlyZXR1cm4gKFJlc291cmNlKSByZXMuZ2V0KDApOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TGlicmFyeSgpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRMaWJyYXJ5UmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJCXJldHVybiAoTWV0aG9kTGlicmFyeSkgbzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldExpYnJhcnlVUkkoKSB7Ci0JCVJlc291cmNlIHNhdmVkUmVzb3VyY2UgPSBnZXRMaWJyYXJ5UmVzb3VyY2UoKTsKLQkJaWYgKHNhdmVkUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIHNhdmVkUmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldFJlbGF0aXZlVVJJKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlVUkkgbGliVVJJID0gZ2V0TGlicmFyeVVSSSgpOwotCQlVUkkgZWxlbWV0blVSSSA9IGVsZW1lbnQuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCVVSSSByZWxVcmkgPSBlbGVtZXRuVVJJLmRlcmVzb2x2ZShsaWJVUkkpOwotCi0JCXJldHVybiByZWxVcmk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNYW5hZ2VyKCkgewotCQkvLyBubyBFbGVtZW50TGF5b3V0TWFuYWdlciBpZCBsaWJyYXJ5IGlzIG5vdCBsb2FkZWQKLQkJaWYgKGxheW91dE1nciA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0TGlicmFyeSgpICE9IG51bGwpIHsKLQkJCQlsYXlvdXRNZ3IgPSBuZXcgRWxlbWVudExheW91dE1hbmFnZXIoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBsYXlvdXRNZ3I7Ci0JfQotCi0JLyoKLQlwdWJsaWMgVmVyc2lvbk1hbmFnZXIgZ2V0VmVyc2lvbk1hbmFnZXIoKSB7Ci0JCWlmICh2ZXJzaW9uTWdyID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmICh2ZXJzaW9uTWdyID09IG51bGwpIHsKLQkJCQkJdmVyc2lvbk1nciA9IG5ldyBWZXJzaW9uTWFuYWdlcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdmVyc2lvbk1ncjsKLQl9Ci0JKi8KLQotCXB1YmxpYyB2b2lkIHNldExpYnJhcnkoTWV0aG9kTGlicmFyeSBuZXdMaWIpIHsKLQkJYXNzaWduTGlicmFyeShuZXdMaWIpOwotCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpCi0JCQkJLmdldFJlc291cmNlcygpLmdldCgwKTsKLQkJcmVzLmdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKG5ld0xpYik7Ci0JCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9MT0FERUQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscygKLQkJCQkJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0JBQ0tfVVBfQkVGT1JFX1NBVkUpKSB7Ci0JCQkJCQkJc2F2ZU9wdGlvbnMucHV0KAotCQkJCQkJCQkJTXVsdGlGaWxlWE1JU2F2ZUltcGwuQkFDS19VUF9CRUZPUkVfU0FWRSwKLQkJCQkJCQkJCWV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmIChldmVudAotCQkJCQkJCQkuZ2V0UHJvcGVydHkoKQotCQkJCQkJCQkuZXF1YWxzKAotCQkJCQkJCQkJCVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUykpIHsKLQkJCQkJCQlzYXZlT3B0aW9ucwotCQkJCQkJCQkJLnB1dCgKLQkJCQkJCQkJCQkJTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsCi0JCQkJCQkJCQkJCWV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9KTsKLQotCQkvLyBjcmVhdGUgdGhlIGRlZmF1bHQgZWRpdGluZyBkb21haW4gZm9yIGxpYnJhcnkgb3BlcmF0aW9uCi0JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCWZhY3Rvcmllcyk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlCi0JCS8vIGV4ZWN1dGVkLgotCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKLQotCQkvLyBDcmVhdGUgdGhlIGVkaXRpbmcgZG9tYWluIHdpdGggYSBzcGVjaWFsIGNvbW1hbmQgc3RhY2suCi0JCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IG5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoKTsKLQkJCi0JCXJlc291cmNlU2V0LmFkZFJlZnJlc2hMaXN0ZW5lcihyZWZyZXNoTGlzdGVuZXIpOwotCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0UmVzb3VyY2VTZXQocmVzb3VyY2VTZXQpOwotCi0JCXNhdmVPcHRpb25zID0gcmVzb3VyY2VTZXQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JCWJvb2xlYW4gYiA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oCi0JCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0JBQ0tfVVBfQkVGT1JFX1NBVkUpOwotCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuQkFDS19VUF9CRUZPUkVfU0FWRSwgQm9vbGVhbgotCQkJCS52YWx1ZU9mKGIpKTsKLQkJYiA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oCi0JCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTKTsKLQkJc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkRJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTLAotCQkJCUJvb2xlYW4udmFsdWVPZihiKSk7Ci0KLQkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksCi0JCQkJY29tbWFuZFN0YWNrLCByZXNvdXJjZVNldCk7Ci0KLQkJLy8gQ3JlYXRlIG5ldyBJQ29udGVudERlc2NyaXB0aW9uUGVyc2lzdGVyIGFuZCBzZXQgaXQgdG8gdGhlCi0JCS8vIENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkgZm9yIHVzZS4KLQkJLy8KLQkJSU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgY29udGVudERlc2NQZXJzaXN0ZXIgPSBuZXcgTWV0aG9kTGlicmFyeVBlcnNpc3RlcigpOwotCQlDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0JCQkJLnNldE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIoY29udGVudERlc2NQZXJzaXN0ZXIpOwotCi0JCUNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnkuc2V0RmlsZU1hbmFnZXIoRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKSk7Ci0KLQkJcmVnaXN0ZXJFZGl0aW5nRG9tYWluKGVkaXRpbmdEb21haW4pOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvU2F2ZShNYXAgb3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChMb2cuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2F2ZSBvcHRpb25zOiAiICsgb3B0aW9ucyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIExpc3QgcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBGaWxlIGxpYkRpciA9IG5ldwotCQkvLyBGaWxlKCgoUmVzb3VyY2UpZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudEZpbGUoKTsKLQotCQl0cnkgewotCQkJYmVnaW5PcGVyYXRpb24oKTsKLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBlZGl0aW5nRG9tYWluCi0JCQkJCS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCS8vIFNhdmUgdGhlIHJlc291cmNlKHMpCi0JCQkvLwotCQkJcmVzb3VyY2VTZXQuc2F2ZShvcHRpb25zKTsKLQotCQkJKChCYXNpY0NvbW1hbmRTdGFjaykgZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuc2F2ZUlzRG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBleGNlcHRpb247Ci0JCX0gZmluYWxseSB7Ci0JCQllbmRPcGVyYXRpb24oKTsKLQotCQl9Ci0JfQotCi0JLyoKLQlwdWJsaWMgdm9pZCBkaXNjYXJkQ2hhbmdlcygpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpCi0JCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJcmVzb3VyY2Uuc2V0TW9kaWZpZWQoZmFsc2UpOwotCQl9Ci0JfQotCSovCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0xpYnJhcnlMb2FkZWQoKSB7Ci0JCXJldHVybiBsb2FkZWQ7Ci0JfQotCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiAoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgZ2V0RWRpdGluZ0RvbWFpbigpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldE1ldGhvZE1vZGVscygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gZ2V0TGlicmFyeSgpOwotCQlyZXR1cm4gKGxpYnJhcnkgPT0gbnVsbCkgPyBuZXcgQXJyYXlMaXN0KCkgOiBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbihTdHJpbmcgZ3VpZCkgewotCQlpZiAoZ3VpZCAhPSBudWxsKSB7CQotCQkJZm9yIChJdGVyYXRvciBpdCA9IGdldE1ldGhvZE1vZGVscygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RQbHVnaW4gcCA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCQlpZiAoZ3VpZC5lcXVhbHMocC5nZXRHdWlkKCkpKSB7Ci0JCQkJCXJldHVybiBwOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldCBwcm9jZXNzIGZhbWlseSBieSBuYW1lCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFByb2Nlc3NGYW1pbHkKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0ZhbWlseSBnZXRQcm9jZXNzRmFtaWx5KFN0cmluZyBuYW1lKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCUxpc3QgY29uZmlncyA9IGxpYnJhcnkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0Lm5leHQoKTsKLQkJCQlpZiAoKGNvbmZpZyBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHkpCi0JCQkJCQkmJiBjb25maWcuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCQlyZXR1cm4gKFByb2Nlc3NGYW1pbHkpIGNvbmZpZzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiByZWdpc3RlciBlZHRpbmcgZG9tYWluIHdpdGggdGhpcyBsaWJyYXJ5Ci0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRWRpdGluZ0RvbWFpbihBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZG9tYWluKSB7Ci0JCS8qKgotCQkgKiB0aGlzIG5vdGlmeXMgYWxsIGNoYW5nZXMsIG5vdCBqdXN0IHRoZSBjb250ZW50IGNoYW5nZSwgb25seSBwaWNrIHRoZQotCQkgKiBvbmVzIGZvciBlbGVtZW50IHVwZGF0ZXMuIFRoZSBvdGhlciBvcGVyYXRpb25zIGFyZSBjb2x2ZXJlZCBieSB0aGUKLQkJICogQ29tbWFuZCBldmVudHMKLQkJICovCi0JCSgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgZG9tYWluLmdldEFkYXB0ZXJGYWN0b3J5KCkpCi0JCQkJLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0KLQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gc2V0IHRoZSBtb3N0IHJlY2VudCBjb21tYW5kJ3MgYWZmZWN0ZWQgb2JqZWN0cyB0bwotCQkvLyBiZSB0aGUgc2VsZWN0aW9uIG9mIHRoZSB2aWV3ZXIgd2l0aCBmb2N1cy4KLQkJZG9tYWluLmdldENvbW1hbmRTdGFjaygpLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKGNvbW1hbmRTdGFja0xpc3RlbmVyKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RlblRvKENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJYWRhcHRlckZhY3RvcnkuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wTGlzdGVuaW5nVG8oQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlhZGFwdGVyRmFjdG9yeS5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RlblRvKENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spIHsKLQkJY29tbWFuZFN0YWNrLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKGNvbW1hbmRTdGFja0xpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wTGlzdGVuaW5nVG8oQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQljb21tYW5kU3RhY2sucmVtb3ZlQ29tbWFuZFN0YWNrTGlzdGVuZXIoY29tbWFuZFN0YWNrTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2F2ZU9wdGlvbnMuCi0JICovCi0JcHVibGljIE1hcCBnZXRTYXZlT3B0aW9ucygpIHsKLQkJcmV0dXJuIHNhdmVPcHRpb25zOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldExpYnJhcnlSb290UGF0aCgpIHsKLQkJVVJJIHVyaSA9IHRoaXMuZ2V0TGlicmFyeVVSSSgpOwotCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCVN0cmluZyBwYXRoID0gdXJpLnRvRmlsZVN0cmluZygpOwotCQkJRmlsZSBmID0gbmV3IEZpbGUocGF0aCk7Ci0JCQlyZXR1cm4gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNZXRob2RQbHVnaW4oZmluYWwgTWV0aG9kUGx1Z2luIG1vZGVsKSB7Ci0KLQkJLy8gc2luY2UgdGhpcyB3aWxsIGNhdXNlIFVJIHVwZGF0ZSwgd2hpY2ggbXVzdCBiZSBleGVjdXRlZCBpbiB0aGUgVUkKLQkJLy8gdGhyZWFkCi0JCS8vIG90aGVyd2lzZSwgd2lsbCBjYXVzZSBJbnZhbGlkIFRocmVhZCBBY2Nlc3MgZXhjZXB0aW9uCi0JCWZpbmFsIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnMgPSBuZXcgRXhjZXB0aW9uWzFdOwotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlnZXRMaWJyYXJ5KCkuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChtb2RlbCk7Ci0KLQkJCQlJTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkJLmdldE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKGdldExpYnJhcnkoKS5lUmVzb3VyY2UoKSk7Ci0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJZXhjZXB0aW9uc1swXSA9IGU7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQltb2RlbC5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQkJfQotCQl9KTsKLQotCQlpZiAoZXhjZXB0aW9uc1swXSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihleGNlcHRpb25zWzBdKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEVuYWJsZXMvZGlzYWJsZXMgbm90aWZpY2F0aW9uIGVudGlyZWx5LgotCSAqIAotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChib29sZWFuIGIpIHsKLQkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVTZXREZWxpdmVyKGIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5lRGVsaXZlcigpOwotCX0KLQotCS8qKgotCSAqIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiB0aGUgY3VycmVudCBsaWJyYXJ5IGlzIHRvIGJlIGNsb3NlZC4gZm9yIGV4YW1wbGUsCi0JICogd2hlbiB5b3UgdHJ5IHRvIG9wZW4gYSBub3RoZXIgbGlicmFyeSBmb3IgY3JlYXRlIGEgbmV3IGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZU9wZW5lZExpYnJhcnkoKSB7Ci0JCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9MSUJSQVJZX0NMT1NFRCwgbnVsbCk7Ci0KLQkJaWYgKExvZy5ERUJVRykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiVXNlZCBtZW1vcnkgYmVmb3JlIGNsb3NpbmcgbGlicmFyeTogIiArIChSdW50aW1lLmdldFJ1bnRpbWUoKS50b3RhbE1lbW9yeSgpIC0gUnVudGltZS5nZXRSdW50aW1lKCkuZnJlZU1lbW9yeSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBSQVRMQzAwMzg0NTk4IC0gRXhwb3J0OiBJbmZpbml0ZSBsb29wIE51bGxwb2ludGVyRXhjZXB0aW9uIGFmdGVyCi0JCS8vIGV4cG9ydGluZyBhbmQgdW5jaGVja2luZyBydXAgcGx1Z2luIGluIGNvbmZpZ3VyYXRpb24KLQkJLy8gc28gZG9uJ3QgZGlzcG9zZSBpdCBpZiBub3QgdGhlIG1haW4gc2luZ2xldG9uIGluc3RhbmNlCi0JCWlmIChpc1NpbmdsZXRvbkluc3RhbmNlKSB7Ci0JCQkvLyBkaXNwb3NlIGFsbCBpdGVtIHByb3ZpZGVycwotCQkJLy8KLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLnJlc2V0KCk7Ci0KLQkJCS8vIGNsZWFyIGZpbHRlciBjb25zdGFudHMgaGFzaE1hcAotCQkJaWYgKEZpbHRlckNvbnN0YW50cy5oYXNoTWFwICE9IG51bGwpIHsKLQkJCQlGaWx0ZXJDb25zdGFudHMuaGFzaE1hcC5jbGVhcigpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHRoaXMubGF5b3V0TWdyICE9IG51bGwpIHsKLQkJCXRoaXMubGF5b3V0TWdyLmNsZWFyKCk7Ci0JCX0KLQotCi0JCS8vIGNsZWFyIHRoZSB0ZW1wIGxheW91dCAKLQkJTGF5b3V0UmVzb3VyY2VzLmNsZWFyKCk7Ci0KLQkJLyoKLQkJICogaWYgKCB0aGlzLmRlcE1nciAhPSBudWxsICkgeyB0aGlzLmRlcE1nci5jbGVhcigpOyB9IHRoaXMuZGVwTWdyID0KLQkJICogbnVsbDsKLQkJICovCi0KLQkJdGhpcy5sYXlvdXRNZ3IgPSBudWxsOwotCi0JCS8vIHRoaXMuaW52YWxpZEd1aWRzLmNsZWFyKCk7Ci0KLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZWRpdGluZ0RvbWFpbgotCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCi0JCXJlc291cmNlU2V0LmNsZWFyRXJyb3JzKCk7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldExpYnJhcnkoKTsKLQotCQl1bmxvY2tMaWJyYXJ5KCk7Ci0KLQkJcmVzb3VyY2VTZXQucmVzZXQoKTsKLQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc2V0KCk7Ci0KLQkJUnVudGltZS5nZXRSdW50aW1lKCkuZ2MoKTsKLQkJaWYgKExvZy5ERUJVRykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiVXNlZCBtZW1vcnkgYWZ0ZXIgY2xvc2luZyBsaWJyYXJ5OiAiICsgKFJ1bnRpbWUuZ2V0UnVudGltZSgpLnRvdGFsTWVtb3J5KCkgLSBSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5sb2NrTGlicmFyeSgpIHsKLQkJLy8gcmVsZWFzZSBsb2NrIG9uIG9sZCBsaWIncyBwcm9qZWN0Ci0JCXRyeSB7Ci0JCQlpZiAobG9jayAhPSBudWxsKSB7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQkJbG9jay5jaGFubmVsKCkuY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9ja3MgdGhlIC5sb2NrIGZpbGUgaW4gdGhlIGdpdmVuIHBhdGguIENyZWF0ZXMgYSAubG9jayBmaWxlIGlmIG9uZSBkb2VzCi0JICogbm90IGV4aXN0Ci0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIHBhdGggdG8gbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIGxvY2tMaWJyYXJ5KEZpbGUgbGliRGlyRmlsZSkgewotCQlGaWxlIGxvY2tGaWxlID0gbmV3IEZpbGUobGliRGlyRmlsZSwgUmVzb3VyY2VVdGlsLkxPQ0tfRklMRU5BTUUpOwotCQlsb2NrID0gRmlsZVV0aWwubG9ja0ZpbGUobG9ja0ZpbGUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvWE1JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL1hNSU9wcG9zaXRlRmVhdHVyZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxM2I3YjUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvWE1JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklPcHBvc2l0ZUZlYXR1cmVMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgbG9hZGluZyBvZiBvcHBvc2l0ZSBmZWF0dXJlcyBmb3IgYSBYTUktYmFzZWQgbWV0aG9kIGxpYnJhcnkuCi0gKiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSU9wcG9zaXRlRmVhdHVyZUxvYWRlciBpbXBsZW1lbnRzIElPcHBvc2l0ZUZlYXR1cmVMb2FkZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklPcHBvc2l0ZUZlYXR1cmVMb2FkZXIjbG9hZE9wcG9zaXRlRmVhdHVyZXMoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlIYXNoU2V0IG9wcG9zaXRlRmVhdHVyZXMgPSBuZXcgSGFzaFNldCgpOwotCQlIYXNoU2V0IGRlbGV0ZWRHVUlEcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIG87Ci0JCQkJaWYocmVzb3VyY2VTZXQgPT0gbnVsbCkgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGUuZVJlc291cmNlKCk7Ci0JCQkJCVJlc291cmNlU2V0IHJzZXQ7Ci0JCQkJCWlmKHJlc291cmNlID09IG51bGwgfHwgISgocnNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCkpIGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByc2V0OwotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZS5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gKChNZXRob2RFbGVtZW50KSBlbGVtZW50KQotCQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlcygpOwotCQkJCQkJaWYgKGZlYXR1cmVzICE9IG51bGwKLQkJCQkJCQkJJiYgIWZlYXR1cmVzLmlzRW1wdHkoKSkgewotCQkJCQkJCW9wcG9zaXRlRmVhdHVyZXMKLQkJCQkJCQkJCS5hZGRBbGwoZmVhdHVyZXMpOwotCQkJCQkJCWRlbGV0ZWRHVUlEcy5hZGQoKChNZXRob2RFbGVtZW50KSBlbGVtZW50KQotCQkJCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9IGUuZ2V0T3Bwb3NpdGVGZWF0dXJlcygpOwotCQkJCWlmIChmZWF0dXJlcyAhPSBudWxsICYmICFmZWF0dXJlcy5pc0VtcHR5KCkpIHsKLQkJCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGRBbGwoZmVhdHVyZXMpOwotCQkJCQlkZWxldGVkR1VJRHMuYWRkKGUuZ2V0R3VpZCgpKTsKLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0JCQotCQlyZXNvdXJjZVNldC5sb2FkT3Bwb3NpdGVGZWF0dXJlcyhuZXcgQXJyYXlMaXN0KG9wcG9zaXRlRmVhdHVyZXMpLCBkZWxldGVkR1VJRHMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3IxMDIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyZDcyNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3IxMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuaW50ZXJuYWwubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlTYXZlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLklNaWdyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLk1pZ3JhdGlvblJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLk1pZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdW4gMTIsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1pZ3JhdG9yMTAyIGltcGxlbWVudHMgSU1pZ3JhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVTdGF0dXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3Iuc3ViVGFzayhtc2cpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIHByb3hpZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgTWFwIHByb3h5VG9GaWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgSGFzaE1hcCBwcm94eVRvRmlsZVdpdGhMb2FkRXJyb3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgbm90Rm91bmRQcm94aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgcHJveGllc1dpdGhVbm5vcm1hbGl6ZWRVUkkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGliOwotCi0JcHJpdmF0ZSBNaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyID0gbmV3IE1pZ3JhdGlvblJlc291cmNlSGFuZGxlcigpIHsKLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVVbmtub3duRmVhdHVyZShFT2JqZWN0IG93bmVyLAotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJCS8vIE9yZGVyIGdyYXBoIG5vZGVzIG9mIHRhc2sgZGVzY3JpcHRvcnMgaW4gQUREIGJhc2VkIG9uIHRoZWlyIG9yZGVyCi0JCQkvLyBpbiB0aGUgdGFzayBkZXNjcmlwdG9yIGxpc3Qgb2YgdGhlIHJvbGUgZGVzY3JpcHRvcgotCQkJLy8gb2xkIGZlYXR1cmU6IFJvbGVEZXNjcmlwdG9yLnBlcmZvcm1zQXNPd25lcgotCQkJLy8KLQkJCWlmKG93bmVyIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IKLQkJCQkJJiYgInBlcmZvcm1zQXNPd25lciIuZXF1YWxzKGZlYXR1cmUuZ2V0TmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJCSYmIHZhbHVlICE9IG51bGwpCi0JCQl7Ci0JCQkJQXJyYXlMaXN0IEdVSURzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKChTdHJpbmcpIHZhbHVlKTsKLQkJCQl3aGlsZSh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCUdVSURzLmFkZCh0b2tlbnMubmV4dFRva2VuKCkpOwotCQkJCX0KLQkJCQlpZihHVUlEcy5zaXplKCkgPiAxKSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9ICgoUm9sZURlc2NyaXB0b3Ipb3duZXIpLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCQlEaWFncmFtIGFkZCA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbShhY3QsIEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0sIGZhbHNlKTsKLQkJCQkJaWYoYWRkICE9IG51bGwpIHsKLQkJCQkJCU1hcCB0ZEd1aWRUb0dyYXBoTm9kZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCQlpbnQgc2l6ZSA9IGFkZC5nZXRDb250YWluZWQoKS5zaXplKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gYWRkLmdldENvbnRhaW5lZCgpLmdldChpKTsKLQkJCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgR3JhcGhOb2RlKSB7Ci0JCQkJCQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSAoKEdyYXBoTm9kZSllbGVtZW50KTsKLQkJCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSBncmFwaE5vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJCQlpZiAoYnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJCQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgYnJpZGdlKS5nZXRFbGVtZW50KCk7CQkJCQkJCQkKLQkJCQkJCQkJCWlmKG1lIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQkJCQlMaXN0IGxpc3QgPSBncmFwaE5vZGUuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCQkJCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShsaXN0LAotCQkJCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX1dPUktfUFJPRFVDVF9DT01QT1NJVEVfVFlQRSk7Ci0JCQkJCQkJCQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCQkJCQkJCQkJLy8gdGhpcyBpcyBub3QgYSBHcmFwaE5vZGUgZm9yIFdvcmtQcm9kdWN0Q29tcG9zaXRlCi0JCQkJCQkJCQkJCS8vIGl0IG11c3QgYmUgYSBHcmFwaE5vZGUgZm9yIGEgVGFza0Rlc2NyaXB0b3IKLQkJCQkJCQkJCQkJLy8KLQkJCQkJCQkJCQkJdGRHdWlkVG9HcmFwaE5vZGVNYXAucHV0KG1lLmdldEd1aWQoKSwgZ3JhcGhOb2RlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIHJlb3JkZXIgdGhlIGdyYXBoIG5vZGVzIHRvIG1hdGNoIG9yZGVyIG9mIHRoZWlyIGxpbmtlZCB0YXNrIGRlc2NyaXB0b3JzCi0JCQkJCQkvLwotCQkJCQkJQXJyYXlMaXN0IGdyYXBoTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgR1VJRHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlPYmplY3QgZ3JhcGhOb2RlID0gdGRHdWlkVG9HcmFwaE5vZGVNYXAuZ2V0KEdVSURzLmdldChpKSk7Ci0JCQkJCQkJaWYoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCQkJCQkJZ3JhcGhOb2Rlcy5hZGQoZ3JhcGhOb2RlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlhZGQuZ2V0Q29udGFpbmVkKCkucmVtb3ZlQWxsKGdyYXBoTm9kZXMpOwotCQkJCQkJYWRkLmdldENvbnRhaW5lZCgpLmFkZEFsbChncmFwaE5vZGVzKTsKLQkJCQkJfQkJCQkJCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QQVRIID0gWE1JTGlicmFyeVJlc291cmNlcy5maWxlUGF0aDsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5JTWlncmF0b3IjbWlncmF0ZShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbWlncmF0ZShsaWJQYXRoLCBtb25pdG9yLCBudWxsKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5JTWlncmF0b3IjbWlncmF0ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbykKLQkgKi8KLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW5pdE1pZ3JhdGUoKTsKLQkJCi0JCUZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKGxpYlBhdGgpOwotCi0JCWJvb2xlYW4gdG9WZXJpZnkgPSB0cnVlOwotCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8uZ2V0SXNFeHBvcnRlZFBsdWdpbkxpYigpKSB7Ci0JCQl0b1ZlcmlmeSA9IGZhbHNlOwotCQl9Ci0JCQotCQlSZXNvdXJjZVV0aWwub3BlbihsaWJGaWxlLmdldFBhcmVudCgpLCBtb25pdG9yKTsKLQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0IDEuMC4yIGRlZmF1bHQgdmFsdWVzIHNvIGRhdGEgY2FuIGJlIGNvcnJlY3RseSBsb2FkZWQKLQkJCS8vCi0JCQlzZXRPbGREZWZhdWx0VmFsdWVzKCk7Ci0KLQkJCS8vIGxvYWQgdGhlIGxpYnJhcnkKLQkJCS8vCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZExpYnJhcnlUYXNrX25hbWUpOwotCi0JCQlpZiAodG9WZXJpZnkpIHsKLQkJCQlyZXNvdXJjZVNldCA9IG5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXNvdXJjZVNldCA9IG5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoZmFsc2UpIHsKLQkJCQkJcHJvdGVjdGVkIHZvaWQgZGVtYW5kTG9hZChSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCQkJCWlmICghIHNraXBEZW1hbmRMb2FkKHJlc291cmNlKSkgewotCQkJCQkJCXN1cGVyLmRlbWFuZExvYWQocmVzb3VyY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXByaXZhdGUgYm9vbGVhbiBza2lwRGVtYW5kTG9hZChSZXNvdXJjZSByZXMpIHsKLQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJCQlpZiAoISBmaWxlLmV4aXN0cygpICYmIGZpbGUuZ2V0TmFtZSgpLmVxdWFscyhNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX1BMVUdJTl9NT0RFTF9GSUxFTkFNRSkpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQkJCQkKLQkJCXJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLQkJCXJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fUkVTT1VSQ0VfSEFORExFUiwgcmVzb3VyY2VIYW5kbGVyKTsKLQkJCWxpYiA9IHJlc291cmNlU2V0LmxvYWRMaWJyYXJ5KGxpYlBhdGgpOwotCQkJCi0JCQlyZW1vdmVQcm9jZXNzQ29udHJpYnV0aW9ucyhtb25pdG9yKTsKLQotCQkJLy8gdmVyaWZ5IHRoZSBsaWJyYXJ5Ci0JCQkvLwotCQkJLy8gVE9ETzogdW5jb21tZW50IGFmdGVyIGV4dGVybmFsaXplIHRoZSB0ZXh0Ci0JCQkvLyB1cGRhdGVTdGF0dXMobW9uaXRvciwgIlZlcmlmeWluZy4uLiIpOwotCi0JCQlpZiAodG9WZXJpZnkpIHsKLQkJCQlEaXNwbGF5IGRpcyA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJCWlmIChkaXMgPT0gbnVsbCB8fCBkaXMuZ2V0VGhyZWFkKCkgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkgewotCQkJCQl2ZXJpZnkoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkaXMuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCXZlcmlmeSgpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQkJcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZXMobW9uaXRvcik7Ci0JCQl9Ci0JCQkKLQkJCS8vIGxvYWQgYWxsIGVsZW1lbnRzIGluIG1lbW9yeQotCQkJLy8KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkUmVzb3VyY2VzVGFza19uYW1lKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQl0cnkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCVN5c3RlbS5lcnIKLQkJCQkJCQkJCS5wcmludGxuKCJFcnJvciBpdGVyYXRlIHRocnUgY3Jvc3MgcmVmZXJlbmNlcyBvZiBlbGVtZW50OiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl1cGRhdGUoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQsIG1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQotCQkJCi0JCQkKLQkJCXJlbW92ZU9sZERlZmF1bHRWYWx1ZXMoKTsKLQotCQkJLy8gY2hlY2sgbW9kaWZpZWQgcmVzb3VyY2VzIGZvciB3cml0YWJsZSBiZWZvcmUgc2F2aW5nIHRoZW0KLQkJCS8vCi0JCQlEaXNwbGF5IGRpcyA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJaWYgKGRpcyA9PSBudWxsIHx8IGRpcy5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQkJY2hlY2tNb2RpZmllZFJlc291cmNlcygpOwotCQkJfSBlbHNlIHsKLQkJCQlkaXMuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQljaGVja01vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJLy8gc2F2ZSBhbGwgZmlsZXMKLQkJCS8vCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMuc2F2ZUxpYnJhcnlUYXNrX25hbWUpOwotCQkJTWFwIHNhdmVPcHRpb25zID0gcmVzb3VyY2VTZXQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JCQlpZiAodG9WZXJpZnkpIHsKLQkJCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsCi0JCQkJCUJvb2xlYW4uVFJVRSk7Ci0JCQl9Ci0JCQlyZXNvdXJjZVNldC5zYXZlKHNhdmVPcHRpb25zLCB0cnVlKTsKLQotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsCi0JCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlZnJlc2hMaWJyYXJ5RmlsZXNUYXNrX25hbWUpOwotCQkJUmVzb3VyY2VVdGlsLnJlZnJlc2hSZXNvdXJjZXMobGliLCBtb25pdG9yKTsKLQkJCW1pZ3JhdGVEaWFncmFtKG1vbml0b3IpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZVNldC5yZXNldCgpOwotCQkJCXJlc291cmNlU2V0ID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgcHJvY2VzcyBjb250cmlidXRpb25zIGZyb20gYWxsIHBsdWdpbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvY2Vzc0NvbnRyaWJ1dGlvbnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlNZXRob2RQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoKTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQXJyYXlMaXN0KHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlNZXRob2RQYWNrYWdlIGNoaWxkUGtnID0gKE1ldGhvZFBhY2thZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEludGVybmFsRU9iamVjdCkgY2hpbGRQa2cpCi0JCQkJCQkJLmVEaXJlY3RSZXNvdXJjZSgpOwotCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmRlbGV0ZShwa2cpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLnJlbW92ZShyZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcGtnLmdldENoaWxkUGFja2FnZXMoKS5jbGVhcigpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWRvIHsKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbGliLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlBcnJheUxpc3QgcmVhZE9ubHlSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlTdHJpbmcgcGx1Z2luSWQgPSBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpOwotCQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKHBsdWdpbklkLCAwLAotCQkJCQlYTUlMaWJyYXJ5UmVzb3VyY2VzLmNhbm5vdFdyaXRlVG9GaWxlcywgbnVsbCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQlpZiAoZmlsZS5leGlzdHMoKSAmJiAhZmlsZS5jYW5Xcml0ZSgpKSB7Ci0JCQkJCXJlYWRPbmx5UmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBwbHVnaW5JZCwgMCwgZmlsZQotCQkJCQkJCS50b1N0cmluZygpLCBudWxsKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gWE1JTGlicmFyeVJlc291cmNlcy5yZWFkT25seUZpbGVzX3RpdGxlOwotCQkJCVN0cmluZyBtc2cgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLnJlYWRPbmx5RmlsZXNfbXNnOwotCQkJCUVycm9yRGlhbG9nIGVyckRsZyA9IG5ldyBFcnJvckRpYWxvZyhNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCksCi0JCQkJCQl0aXRsZSwgbXNnLCBzdGF0dXMsIElTdGF0dXMuT0sgfCBJU3RhdHVzLklORk8KLQkJCQkJCQkJfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJICogCi0JCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZyNjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkJCQkJICovCi0JCQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCQkJLy8gY3JlYXRlIFJldHJ5LCBDYW5jZWwgYW5kIERldGFpbHMgYnV0dG9ucwotCQkJCQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwKLQkJCQkJCQkJSURpYWxvZ0NvbnN0YW50cy5SRVRSWV9MQUJFTCwgdHJ1ZSk7Ci0KLQkJCQkJCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCi0JCQkJCQljcmVhdGVEZXRhaWxzQnV0dG9uKHBhcmVudCk7Ci0JCQkJCX0KLQotCQkJCQkvKgotCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCSAqIAotCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2cjb3BlbigpCi0JCQkJCSAqLwotCQkJCQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCQkJCQlzaG93RGV0YWlsc0FyZWEoKTsKLQkJCQkJCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQkJaWYgKGVyckRsZy5vcGVuKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpIHsKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gd2hpbGUgKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVVucmVzb2x2ZWRSZWZlcmVuY2VzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocHJveGllc1RvUmVtb3ZlLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJLy8gVE9ETzogdW5jb21tZW50IGFmdGVyIGV4dGVybmFsaXplIHRoZSB0ZXh0Ci0JCS8vIHVwZGF0ZVN0YXR1cyhtb25pdG9yLCAiUmVtb3ZpbmcgdW5yZXNvbHZlZCByZWZlcmVuY2VzIik7Ci0JCUhhc2hTZXQgR1VJRHMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm94aWVzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgcHJveHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCUdVSURzLmFkZChwcm94eS5lUHJveHlVUkkoKS5mcmFnbWVudCgpKTsKLQkJCUVjb3JlVXRpbC5yZW1vdmUocHJveHkpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBpdGVyYXRvciA9IChGZWF0dXJlSXRlcmF0b3IpIGVsZW1lbnQKLQkJCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG9iaiA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqLmVJc1Byb3h5KCkKLQkJCQkJCSYmIEdVSURzLmNvbnRhaW5zKG9iai5lUHJveHlVUkkoKS5mcmFnbWVudCgpKSkgewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGl0ZXJhdG9yLmZlYXR1cmUoKTsKLQkJCQkJaWYgKGZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWZlYXR1cmUuaXNEZXJpdmVkKCkpIHsKLQkJCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJKChMaXN0KSBlbGVtZW50LmVHZXQoZmVhdHVyZSkpLnJlbW92ZShvYmopOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGliCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeSgpIHsKLQkJbm90Rm91bmRQcm94aWVzLmNsZWFyKCk7Ci0JCXByb3hpZXNUb1JlbW92ZS5jbGVhcigpOwotCQlwcm94eVRvRmlsZU1hcC5jbGVhcigpOwotCQlwcm94eVRvRmlsZVdpdGhMb2FkRXJyb3JNYXAuY2xlYXIoKTsKLQkJcHJveGllc1dpdGhVbm5vcm1hbGl6ZWRVUkkuY2xlYXIoKTsKLQotCQlDb2xsZWN0aW9uPEVPYmplY3Q+IHByb3hpZXMgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0UHJveGllcyhsaWIpOwotCQlpZiAoIXByb3hpZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGxpYi5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJveGllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgcHJveHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlVUkkgdXJpID0gcHJveHkuZVByb3h5VVJJKCk7Ci0JCQkJVVJJIG5vcm1hbGl6ZWRVUkkgPSB1cmlDb252ZXJ0ZXIubm9ybWFsaXplKHVyaSk7Ci0JCQkJaWYgKG5vcm1hbGl6ZWRVUkkgPT0gbnVsbCkgewotCQkJCQlwcm94aWVzV2l0aFVubm9ybWFsaXplZFVSSS5hZGQocHJveHkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5vcm1hbGl6ZWRVUkkudG9GaWxlU3RyaW5nKCkpOwotCQkJCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCXByb3h5VG9GaWxlTWFwLnB1dChwcm94eSwgZmlsZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoCi0JCQkJCQkJCQlub3JtYWxpemVkVVJJLnRyaW1GcmFnbWVudCgpLCB0cnVlKTsKLQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0RU9iamVjdChub3JtYWxpemVkVVJJLmZyYWdtZW50KCkpID09IG51bGwpIHsKLQkJCQkJCQkJbm90Rm91bmRQcm94aWVzLmFkZChwcm94eSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlTdHJpbmcgZXJyTXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUKLQkJCQkJCQkJCS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQkJCQkJcHJveHlUb0ZpbGVXaXRoTG9hZEVycm9yTWFwLnB1dChwcm94eSwKLQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IGZpbGUsIGVyck1zZyB9KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcHJveHlUb0ZpbGVNYXAuaXNFbXB0eSgpKSB7Ci0JCQkvLyBwcm9tcCB1c2VyIHRvIHJlc29sdmUgbWlzc2luZyBmaWxlcwotCQkJLy8KLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QocHJveHlUb0ZpbGVNYXAua2V5U2V0KCkpOwotCQkJZmluYWwgU3RyaW5nIEVMRU1FTlRfUEFUSCA9IFhNSUxpYnJhcnlSZXNvdXJjZXMuZWxlbWVudFBhdGg7Ci0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgcHJveHlUb0ZpbGVNYXAuZ2V0KG9iamVjdCk7Ci0JCQkJCXJldHVybiBmaWxlLmdldEFic29sdXRlUGF0aCgpCi0JCQkJCQkJKyAiICgiICsgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JCQkJICogICAgICBpbnQpCi0JCQkJICovCi0JCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJCWNhc2UgMDoKLQkJCQkJCXJldHVybiBwcm94eVRvRmlsZU1hcC5nZXQob2JqZWN0KS50b1N0cmluZygpOwotCQkJCQljYXNlIDE6Ci0JCQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQl9OwotCi0JCQl0cnkgewotCQkJCVN0cmluZyBtc2cgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLnByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c7Ci0JCQkJU2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBTZWxlY3Rpb25EaWFsb2coTXNnQm94Ci0JCQkJCQkuZ2V0RGVmYXVsdFNoZWxsKCksIGxpc3QsIGxhYmVsUHJvdmlkZXIsIG1zZyk7Ci0KLQkJCQlkbGcuc2V0VGl0bGUoWE1JTGlicmFyeVJlc291cmNlcy5taXNzaW5nRmlsZXNfdGl0bGUpOwotCQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlkbGcuc2V0SW5pdGlhbEVsZW1lbnRTZWxlY3Rpb25zKGxpc3QpOwotCQkJCWRsZwotCQkJCQkJLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsgRklMRV9QQVRILAotCQkJCQkJCQlFTEVNRU5UX1BBVEggfSk7Ci0JCQkJaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJT2JqZWN0IG9ianNbXSA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJCQlpZiAob2JqcyA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlwcm94aWVzVG9SZW1vdmUuYWRkKGl0ZXIubmV4dCgpKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JCS8vIHByb21wdCB1c2VyIHRvIHJlc29sdmUgZmlsZXMgdGhhdCBjYW4gbm90IGJlIGxvYWRlZAotCQkvLwotCQlpZiAoIXByb3h5VG9GaWxlV2l0aExvYWRFcnJvck1hcC5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QocHJveHlUb0ZpbGVXaXRoTG9hZEVycm9yTWFwLmtleVNldCgpKTsKLQkJCWZpbmFsIFN0cmluZyBMT0FEX0VSUk9SID0gWE1JTGlicmFyeVJlc291cmNlcy5sb2FkRXJyb3I7Ci0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkJCQkgKiAgICAgIGludCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCU9iamVjdFtdIGFyciA9IChPYmplY3RbXSkgcHJveHlUb0ZpbGVNYXAuZ2V0KG9iamVjdCk7Ci0JCQkJCWlmIChjb2x1bW5JbmRleCA8IDIpIHsKLQkJCQkJCXJldHVybiBhcnJbY29sdW1uSW5kZXhdLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQl9OwotCi0JCQl0cnkgewotCQkJCVN0cmluZyBtc2cgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLnByb21wdFJlbW92ZVJlZmVyZW5jZXNUb0ZpbGVzV2l0aExvYWRFcnJvcnNfbXNnOwotCQkJCVNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgU2VsZWN0aW9uRGlhbG9nKE1zZ0JveAotCQkJCQkJLmdldERlZmF1bHRTaGVsbCgpLCBsaXN0LCBsYWJlbFByb3ZpZGVyLCBtc2cpOwotCi0JCQkJZGxnLnNldFRpdGxlKFhNSUxpYnJhcnlSZXNvdXJjZXMuZmlsZXNXaXRoTG9hZEVycm9yc190aXRsZSk7Ci0JCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWRsZy5zZXRJbml0aWFsRWxlbWVudFNlbGVjdGlvbnMobGlzdCk7Ci0JCQkJZGxnLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsgRklMRV9QQVRILCBMT0FEX0VSUk9SIH0pOwotCQkJCWlmIChkbGcub3BlbigpID09IERpYWxvZy5DQU5DRUwpIHsKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCU9iamVjdCBvYmpzW10gPSBkbGcuZ2V0UmVzdWx0KCk7Ci0JCQkJaWYgKG9ianMgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJcHJveGllc1RvUmVtb3ZlLmFkZChpdGVyLm5leHQoKSk7Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlBcnJheUxpc3QgcHJveGllc1RvUmV0YWluID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcm94aWVzLmFkZEFsbChwcm94eVRvRmlsZU1hcC5rZXlTZXQoKSk7Ci0JCXByb3hpZXMuYWRkQWxsKHByb3h5VG9GaWxlV2l0aExvYWRFcnJvck1hcC5rZXlTZXQoKSk7Ci0JCXByb3hpZXMucmVtb3ZlQWxsKHByb3hpZXNUb1JlbW92ZSk7Ci0KLQkJaWYgKHByb3hpZXNUb1JldGFpbi5pc0VtcHR5KCkpIHsKLQkJCXByb3hpZXNUb1JlbW92ZS5hZGRBbGwobm90Rm91bmRQcm94aWVzKTsKLQkJCXByb3hpZXNUb1JlbW92ZS5hZGRBbGwocHJveGllc1dpdGhVbm5vcm1hbGl6ZWRVUkkpOwotCQl9Ci0KLQkJU3RyaW5nIG1zZyA9ICJTdW1tYXJ5IG9mIHVucmVzb2x2ZWQgcHJveGllczoiOyAvLyROT04tTkxTLTEkCi0JCW1zZyArPSAiXG4gIE5vdCBmb3VuZCBwcm94aWVzOiAiICsgbm90Rm91bmRQcm94aWVzOyAvLyROT04tTkxTLTEkCi0JCW1zZyArPSAiXG4gIFByb3hpZXMgd2l0aCB1bm5vcm1hbGl6ZWQgVVJJOiAiICsgcHJveGllc1dpdGhVbm5vcm1hbGl6ZWRVUkk7IC8vJE5PTi1OTFMtMSQKLQkJWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nSW5mbyhtc2cpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVPbGREZWZhdWx0VmFsdWVzKCkgewotCQlNdWx0aVJlc291cmNlRU9iamVjdC5yZW1vdmVEZWZhdWx0VmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkanVzdFRvTmV3RGVmYXVsdFZhbHVlcyhNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCSgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJCS5yZW1vdmVGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0T2xkRGVmYXVsdFZhbHVlcygpIHsKLQkJTXVsdGlSZXNvdXJjZUVPYmplY3Quc2V0RGVmYXVsdFZhbHVlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpLCBCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoTWV0aG9kRWxlbWVudCBlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWRqdXN0VG9OZXdEZWZhdWx0VmFsdWVzKGUpOwotCi0JCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZTsKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwpIHsKLQkJCQlhY3QKLQkJCQkJCS5zZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMKTsKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCkgewotCQkJCWFjdAotCQkJCQkJLnNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlRfTElURVJBTCk7Ci0JCQl9Ci0JCX0KLQkJTWlncmF0aW9uVXRpbC5mb3JtYXRWYWx1ZShlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdE1pZ3JhdGUoKSB7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbWlncmF0ZURpYWdyYW0oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMl8xMDMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAyXzEwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZWE4OWE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAyXzEwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLmludGVybmFsLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAtIE1hciAyMCwgMjAwNwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0b3IxMDJfMTAzIGV4dGVuZHMgTWlncmF0b3IxMDIgewotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9jZXNzPiBkaWFncmFtRWxlbU1hcDsgCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdE1pZ3JhdGUoKSB7Ci0JCWRpYWdyYW1FbGVtTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBQcm9jZXNzPigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoTWV0aG9kRWxlbWVudCBlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci51cGRhdGUoZSwgbW9uaXRvcik7Ci0JCU1pZ3JhdG9yMTAzLnVwZGF0ZUVsZW1lbnQoZSwgZGlhZ3JhbUVsZW1NYXAsIG1vbml0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1pZ3JhdGVEaWFncmFtKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1pZ3JhdG9yMTAzLmRpYWdyYW1NaWdyYXRlKGRpYWdyYW1FbGVtTWFwLCBtb25pdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3IxMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzIxOWZmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5pbnRlcm5hbC5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLklEaWFncmFtTWlncmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NaWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVXBncmFkZUNhbGxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci0KLS8qKgotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gRmViIDEyLCAyMDA3Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRvcjEwMyBleHRlbmRzIE1pZ3JhdG9yQmFzZSB7Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9jZXNzPiBkaWFncmFtRWxlbU1hcDsgCi0JCi0JcHVibGljIHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbWlncmF0ZShsaWJQYXRoLCBtb25pdG9yLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBVcGdyYWRlQ2FsbGVySW5mbyBpbmZvKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUobGliUGF0aCk7Ci0KLQkJUmVzb3VyY2VVdGlsLm9wZW4obGliRmlsZS5nZXRQYXJlbnQoKSwgbW9uaXRvcik7Ci0KLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gbnVsbDsKLQkJCi0JCWRpYWdyYW1FbGVtTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBQcm9jZXNzPigpOwotCQl0cnkgewotCQkJLy8gbG9hZCB0aGUgbGlicmFyeQotCQkJLy8KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkTGlicmFyeVRhc2tfbmFtZSk7Ci0KLQkJCXJlc291cmNlU2V0ID0gbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbChmYWxzZSk7Ci0JCQkJCQkKLQkJCXJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLQotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSByZXNvdXJjZVNldC5sb2FkTGlicmFyeShsaWJQYXRoKTsKLQkJCQkJCQotCQkJLy8gbG9hZCBhbGwgZWxlbWVudHMgaW4gbWVtb3J5Ci0JCQkvLwotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRSZXNvdXJjZXNUYXNrX25hbWUpOwotCQkJCi0JCQl1cGRhdGVBbGxDb250ZW50cyhtb25pdG9yLCBsaWIpOwkJCQkJCi0JCQkKLQkJCS8vIHNhdmUgYWxsIGZpbGVzCi0JCQkvLwotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLnNhdmVMaWJyYXJ5VGFza19uYW1lKTsKLQkJCU1hcCBzYXZlT3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQkJcmVzb3VyY2VTZXQuc2F2ZShzYXZlT3B0aW9ucywgdHJ1ZSk7Ci0KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLAotCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5yZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lKTsKLQkJCQotCQkJCi0JCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhsaWIsIG1vbml0b3IpOwotCQkJCi0JCQlkaWFncmFtTWlncmF0ZShkaWFncmFtRWxlbU1hcCwgbW9uaXRvcik7CQotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCXJlc291cmNlU2V0LnJlc2V0KCk7Ci0JCQkJcmVzb3VyY2VTZXQgPSBudWxsOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGlhZ3JhbU1pZ3JhdGUoTWFwPFN0cmluZywgUHJvY2Vzcz4gZGlhZ3JhbUVsZW1NYXAsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBDb252ZXJ0IGRpYWdyYW1zIAkJCQotCQlJRGlhZ3JhbU1pZ3JhdGlvbiBpZG0gPSAoSURpYWdyYW1NaWdyYXRpb24pIEV4dGVuc2lvbk1hbmFnZXIuZ2V0RXh0ZW5zaW9uKCJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkiLCAiZGlhZ3JhbU1pZ3JhdGlvbiIpOyAJCQkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKGlkbSAhPSBudWxsICYmICFkaWFncmFtRWxlbU1hcC5pc0VtcHR5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJaWRtLm1pZ3JhdGUoZGlhZ3JhbUVsZW1NYXAudmFsdWVzKCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXVwZGF0ZUVsZW1lbnQoZWxlbWVudCwgZGlhZ3JhbUVsZW1NYXAsIG1vbml0b3IpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCB1cGRhdGVFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWFwPFN0cmluZywgUHJvY2Vzcz4gZGlhZ3JhbUVsZW1NYXAsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4gfHwKLQkJCWVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCVN0cmluZyBndWlkID0gZWxlbWVudC5nZXRHdWlkKCk7Ci0JCQlQcm9jZXNzIHByb2MgPSBkaWFncmFtRWxlbU1hcC5nZXQoZ3VpZCk7Ci0JCQlpZiAocHJvYyA9PSBudWxsKSB7Ci0JCQkJZGlhZ3JhbUVsZW1NYXAucHV0KGVsZW1lbnQuZ2V0R3VpZCgpLCAoUHJvY2VzcykgZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydChwcm9jID09IGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCU1pZ3JhdGlvblV0aWwuZm9ybWF0VmFsdWUoZWxlbWVudCk7Ci0JCWhhbmRsZVR5cGVDb252ZXJ0KGVsZW1lbnQpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZVR5cGVDb252ZXJ0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICgJZWxlbWVudCBpbnN0YW5jZW9mIEV4YW1wbGUgCQkJfHwKLQkJCQllbGVtZW50IGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCAJfHwKLQkJCQllbGVtZW50IGluc3RhbmNlb2YgV2hpdGVwYXBlcikgewkJCQotCQkJR3VpZGFuY2UgZ3VpZGFuY2UgPSAoR3VpZGFuY2UpIGVsZW1lbnQ7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gcHJlcyA9IGNvbnZlcnQoZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJaWYgKHByZXMgIT0gbnVsbCkgewotCQkJCWd1aWRhbmNlLnNldFByZXNlbnRhdGlvbihwcmVzKTsKLQkJCX0JCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBHdWlkYW5jZURlc2NyaXB0aW9uIGNvbnZlcnQoQ29udGVudERlc2NyaXB0aW9uIG9sZE9iaikgewotCQlpZiAob2xkT2JqID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUd1aWRhbmNlRGVzY3JpcHRpb24gbmV3T2JqID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpOwkJCi0JCVJlc291cmNlIHJlcyA9IG9sZE9iai5lUmVzb3VyY2UoKTsKLQkJcmVzLmdldENvbnRlbnRzKCkucmVtb3ZlKG9sZE9iaik7Ci0JCXJlcy5nZXRDb250ZW50cygpLmFkZChuZXdPYmopOwotCQkKLQkJTGlzdCBwcm9wZXJ0aWVzID0gb2xkT2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwkJCi0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQkJT2JqZWN0IHZhbHVlID0gb2xkT2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJbmV3T2JqLmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCQkJCi0JCXJldHVybiBuZXdPYmo7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvckJhc2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMDUyM2IwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLmludGVybmFsLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uSU1pZ3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVXBncmFkZUNhbGxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGltcGxlbWVudGF0aW9uIGZvciBtaWdyYXRvcnMKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gRmViIDEyLCAyMDA3Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNaWdyYXRvckJhc2UgaW1wbGVtZW50cyBJTWlncmF0b3IgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFhNSUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuaXNEZWJ1Z2dpbmcoKTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgdXBkYXRlU3RhdHVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIG1zZykgewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yLnN1YlRhc2sobXNnKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMTApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCS8vCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBbGxDb250ZW50cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE1ldGhvZExpYnJhcnkgbGliKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVDcm9zc1JlZmVyZW5jZXMoKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5lcnIKLQkJCQkJCQkJLnByaW50bG4oIkVycm9yIGl0ZXJhdGUgdGhydSBjcm9zcyByZWZlcmVuY2VzIG9mIGVsZW1lbnQ6ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCXVwZGF0ZUVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQsIG1vbml0b3IpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHVwZGF0ZUVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb247CQotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pIHRocm93cyBFeGNlcHRpb247Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL1NlbGVjdGlvbkRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9taWdyYXRpb24vU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2NjRkZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9taWdyYXRpb24vU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuaW50ZXJuYWwubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogRGlzcGxheXMgYSBkaWFsb2cgdGhhdCBsaXN0cyBtaXNzaW5nIGZpbGVzIGluIGEgbWV0aG9kIGxpYnJhcnkgdG8gYmUgdXBncmFkZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBMaXN0U2VsZWN0aW9uRGlhbG9nIHsKLQotCXByaXZhdGUgU3RyaW5nW10gY29sdW1uUHJvcGVydGllczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgT2JqZWN0IGlucHV0LAotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGlucHV0LCBjb250ZW50UHJvdmlkZXIsIGxhYmVsUHJvdmlkZXIsIG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgTGlzdCBpbnB1dCwKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBpbnB1dCwgbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChMaXN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwKLQkJCQkJT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCX0sIGxhYmVsUHJvdmlkZXIsIG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbHVtblByb3BlcnRpZXMoU3RyaW5nW10gY29sdW1uUHJvcGVydGllcykgewotCQl0aGlzLmNvbHVtblByb3BlcnRpZXMgPSBjb2x1bW5Qcm9wZXJ0aWVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGN0cmwgPSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIGNvbHVtbnMKLQkJLy8KLQkJVGFibGUgdGFibGUgPSBnZXRWaWV3ZXIoKS5nZXRUYWJsZSgpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCQkJY29sLnNldFRleHQoY29sdW1uUHJvcGVydGllc1tpXSk7Ci0JCQljb2wuc2V0UmVzaXphYmxlKHRydWUpOwotCQkJY29sLnNldFdpZHRoKDIwMCk7Ci0JCX0KLQkJZ2V0Vmlld2VyKCkuc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzKTsKLQkJZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCi0JCXJldHVybiBjdHJsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9taWdyYXRpb24vcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9taWdyYXRpb24vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODdjM2RmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIG1pZ3JhdGlvbiBzdXBwb3J0IGZvciB1cGdyYWRpbmcgYSBYTUktYmFzZWQgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGU3NzY4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIG1hbmFnaW5nIGEgWE1JLWJhc2VkIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZhNWRlMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIG1hbmFnaW5nIGEgWE1JLWJhc2VkIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvcHJlZmVyZW5jZXMvWE1JTGlicmFyeVByZWZlcmVuY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL3ByZWZlcmVuY2VzL1hNSUxpYnJhcnlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MjdjNDUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvcHJlZmVyZW5jZXMvWE1JTGlicmFyeVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBUaGUgWE1MIE1ldGhvZCBMaWJyYXJ5IHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlQcmVmZXJlbmNlcyB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBsaWJyYXJ5IHBhdGggcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MSUJSQVJZX1BBVEggPSAiZGVmYXVsdExpYnJhcnlQYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFhNSUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlTdHJpbmcgZGVmYXVsdExpYnJhcnlQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSAvLyROT04tTkxTLTEkCi0JCQkJLy8gRklYTUUhIEF2b2lkIHVzaW5nIGhhcmQgY29kZWQgY29uc3RhbnQKLQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgIkVQRiIKLQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgIk1ldGhvZCBMaWJyYXJpZXMiOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoREVGQVVMVF9MSUJSQVJZX1BBVEgsIGRlZmF1bHRMaWJyYXJ5UGF0aCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBsaWJyYXJ5IHBhdGggcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0TGlicmFyeVBhdGgoKSB7Ci0JCXJldHVybiBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJREVGQVVMVF9MSUJSQVJZX1BBVEgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Ly5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYzY5ZDNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIExpYnJhcnkgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1MDAzOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNDIzMzVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogbGlicmFyeS5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0sCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2U7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmFwYWNoZS5hbnQsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWNmZTQyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2UubGlicmFyeS5qYXIgPSBzcmMvCi1vdXRwdXQubGlicmFyeS5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBsaWJyYXJ5LmphcixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGxheW91dC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2ljb25zL1JvbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9pY29ucy9Sb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2ljb25zL1JvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvY3NzL2RlZmF1bHQuY3NzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvY3NzL2RlZmF1bHQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOWY5NzFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2Nzcy9kZWZhdWx0LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDUyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi1ib2R5Ci17Ci0JYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotfQotCi1wCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLWgxCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IGxhcmdlOwotfQotCi1oMgotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxNTAlOwotfQotCi1oMwotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci19Ci0KLWg0LCBoNSwgaDYKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTAwJTsKLX0KLQotYTpsaW5rCi17Ci0JY29sb3I6ICMwMDMzOTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hOmFjdGl2ZQotewotCWNvbG9yOiAjMDAzMzk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hOnZpc2l0ZWQKLXsKLQljb2xvcjogIzAwMzM5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWFbaHJlZl06aG92ZXIKLXsKLQljb2xvcjogI2ZmMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotb2wKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7Ci0JbWFyZ2luLWxlZnQ6IDMwcHg7Ci19Ci0KLW9sIGxpCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotdWwKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlsaXN0LXN0eWxlLXR5cGU6IGRpc2M7Ci0JbWFyZ2luLWxlZnQ6IDMwcHg7Ci0JbWFyZ2luLXRvcDogNXB4OwotCXBhZGRpbmctbGVmdDogMHB4OwotfQotCi11bCBsaQotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLXRhYmxlCi17Ci0JYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwkKLX0KLQotdGJvZHkKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl2YWxpZ246IGJhc2VsaW5lOwotfQotCi10aAotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLXRkCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXRkIHVsCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JbWFyZ2luLWJvdHRvbTogMHB4OwotCW1hcmdpbi1sZWZ0OiAzMHB4OwotfQotCi0ucGFnZVRpdGxlCi17Ci0JYmFja2dyb3VuZDogIzk5OTljYzsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LXNpemU6IDEycHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JcGFkZGluZy1ib3R0b206IDVweDsKLQlwYWRkaW5nLWxlZnQ6IDEwcHg7Ci0JcGFkZGluZy1yaWdodDogMTBweDsKLQlwYWRkaW5nLXRvcDogNXB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS5wYWdlVGl0bGVTZXBhcmF0b3IKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotCXBhZGRpbmc6IDBweDsKLX0KLQotLnRhYgotewotCWJhY2tncm91bmQtY29sb3I6ICM1YzgxYTc7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5hY3RpdmVUYWIKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjYzhkN2UzOwotCWNvbG9yOiAjMjkzZDZiOwkKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7IAotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotYS50YWI6bGluaywgYS50YWI6YWN0aXZlLCBhLnRhYjp2aXNpdGVkCi17Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWEudGFiOmhvdmVyCi17Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CQotfQotCi0ub3ZlcnZpZXcKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCXBhZGRpbmctYm90dG9tOiAxMHB4OwotCXBhZGRpbmctbGVmdDogMjBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDEwcHg7Ci19Ci0KLS5vdmVydmlld1RhYmxlCi17Ci0JYmFja2dyb3VuZDogI2ZmZmZmZjsKLQl3aWR0aDogMTAwJTsJCi19Ci0KLS5vdmVydmlld1RhYmxlIHRkCi17Ci0JcGFkZGluZy1ib3R0b206IDVweDsKLQlwYWRkaW5nLWxlZnQ6IDVweDsKLQlwYWRkaW5nLXJpZ2h0OiA1cHg7Ci0JcGFkZGluZy10b3A6IDVweDsKLX0KLQotLm92ZXJ2aWV3U2VwYXJhdG9yCi17Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLQlwYWRkaW5nOiAwcHg7Ci19Ci0KLS5leHBhbmRDb2xsYXBzZVRleHQKLXsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JcGFkZGluZy1sZWZ0OiA1cHg7Ci0JcGFkZGluZy1yaWdodDogNXB4OwotfQotCi0uZXhwYW5kQ29sbGFwc2VMaW5rCi17Ci0JY29sb3I6ICMzMzMzMzM7Ci0JcGFkZGluZy1ib3R0b206IDVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5leHBhbmRDb2xsYXBzZUxpbms6aG92ZXIKLXsKLQljb2xvcjogIzAwMDBmZjsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmV4cGFuZENvbGxhcHNlTGluazp2aXNpdGVkCi17Ci0JY29sb3I6ICMzMzMzMzM7Ci19Ci0KLS5zZWN0aW9uSGVhZGluZwotewotCWJhY2tncm91bmQtY29sb3I6ICM5OGIxYzQ7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JY3Vyc29yOiBoYW5kOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXBhZGRpbmctYm90dG9tOiAycHg7Ci0JcGFkZGluZy1sZWZ0OiAycHg7Ci0JcGFkZGluZy10b3A6IDJweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5zZWN0aW9uQ29udGVudAotewotCXBhZGRpbmctYm90dG9tOiAwcHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLS5zZWN0aW9uVGFibGUKLXsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItdG9wLWNvbG9yOiAjY2NjOwotCXdpZHRoOiAxMDAlOwotfQotCi0uc2VjdGlvblRhYmxlSGVhZGluZwotewotCWJhY2tncm91bmQ6ICNlZWU7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JaGVpZ2h0OiAyMDsKLQlwYWRkaW5nLWJvdHRvbTogMTBweDsKLQlwYWRkaW5nLWxlZnQ6IDEwcHg7Ci0JcGFkZGluZy1yaWdodDogMTBweDsKLQlwYWRkaW5nLXRvcDogMTBweDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXdpZHRoOiAyMCU7Ci19Ci0KLS5zZWN0aW9uVGFibGVDZWxsCi17Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JcGFkZGluZy1ib3R0b206IDEwcHg7Ci0JcGFkZGluZy1sZWZ0OiAxMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDEwcHg7Ci19Ci0KLS5icmVha2Rvd25UYWJsZQotewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMXB4OwotCXBhZGRpbmctYm90dG9tOiAwcHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5icmVha2Rvd25UYWJsZSB0aAotewotCWJhY2tncm91bmQ6ICNlZWU7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JaGVpZ2h0OiAyMDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0uYnJlYWtkb3duVGFibGUgdGQKLXsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLX0KLQotLmRlZmF1bHRUYWJsZQotewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXBhZGRpbmctYm90dG9tOiAwcHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5kZWZhdWx0VGFibGUgdGQKLXsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0uc3ViU2VjdGlvbkhlYWRpbmcKLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5zdWJTZWN0aW9uQ29udGVudAotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS5zdGVwSGVhZGluZwotewotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0JY29sb3I6ICMyOTNkNmI7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JcGFkZGluZy1ib3R0b206IDJweDsKLQlwYWRkaW5nLWxlZnQ6IDJweDsKLQlwYWRkaW5nLXRvcDogMnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnN0ZXBDb250ZW50Ci17Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JcGFkZGluZy1ib3R0b206IDVweDsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDBweDsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotLnN0ZXBUYWJsZQotewotCWJvcmRlci1ib3R0b206ICM5OTk5OTkgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjOTk5OTk5IHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICM5OTk5OTkgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICM5OTk5OTkgc29saWQgMHB4OwotCXBhZGRpbmctYm90dG9tOiAyMHB4OwotCXBhZGRpbmctbGVmdDogMTBweDsKLQlwYWRkaW5nLXJpZ2h0OiAxMHB4OwotCXBhZGRpbmctdG9wOiAxMHB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0uc3RlcFRhYmxlIHRkCi17Ci0JYm9yZGVyOiAjY2NjIHNvbGlkIDBweDsKLX0KLQotLnN0ZXBTZXBhcmF0b3IKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCXBhZGRpbmc6IDBweDsKLX0KLQotLmJhY2tUb1RvcExpbmsKLXsKLQljb2xvcjogI2ZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogbm9ybWFsOwkKLQltYXJnaW46IDBweDsKLQlwYWRkaW5nLWJvdHRvbTogMTBweDsKLQl0ZXh0LWFsaWduOiBtaWRkbGU7CQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmJhY2tUb1RvcExpbms6aG92ZXIKLXsKLQljb2xvcjogIzk2OTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmJhY2tUb1RvcExpbms6dmlzaXRlZAotewotCWNvbG9yOiAjNWM4MWE3OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS5jb3B5cmlnaHQKLXsKLQljb2xvcjogIzcwODBiMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLQlwYWRkaW5nLXJpZ2h0OiAxMHB4OwotCXBhZGRpbmctdG9wOiAyNXB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS52ZXJzaW9uSW5mbwotewotCWNvbG9yOiAjNzA4MGIwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCXBhZGRpbmctbGVmdDogMTBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDI1cHg7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLS5xdW90ZQotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLmNvZGVTYW1wbGUKLXsKLQlmb250LWZhbWlseTogY291cmllcjsKLQlmb250LXNpemU6IDEwcHQ7CQkKLX0KLQotLmVsZW1lbnRMaW5rCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7CQotCWNvbG9yOiAjMDAwMGZmOwotfQotCi0uZWxlbWVudExpbmtXaXRoVHlwZQotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCWNvbG9yOiAjMDAwMGZmOwotfQotCi0uZWxlbWVudExpbmtXaXRoVXNlclRleHQKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQljb2xvcjogIzAwMDBmZjsKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvY3NzL3JvcC5jc3MgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9jc3Mvcm9wLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGJmZmU0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9jc3Mvcm9wLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi1ib2R5eyAKLQlmb250LWZhbWlseTp2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7IAotCWZvbnQtc2l6ZToxMXB4OyAKLQl9Ci0KLXB7IAotCWZvbnQtZmFtaWx5OnZlcmRhbmEsYXJpYWwsc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplOjExcHg7IAotCX0KLQotdGR7IAotCWZvbnQtZmFtaWx5OnZlcmRhbmEsYXJpYWwsc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplOjExcHg7Ci0JfQotCi10aHsgCi0JZm9udC1mYW1pbHk6dmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6MTFweDsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjYzhkN2UzOyAKLQlwYWRkaW5nLWJvdHRvbTogNXB4OwotCXBhZGRpbmctdG9wOiAzcHg7Ci0JcGFkZGluZy1sZWZ0OiAzcHg7Ci0JcGFkZGluZy1yaWdodDogM3B4OwkJCi0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotLnNlY0hlYWQgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQljb2xvcjogI2ZmZmZmZjsKLQl9Ci0KLQotLnNlY0NvbnR7Ci0JIGZvbnQtZmFtaWx5OnZlcmRhbmEsYXJpYWwsc2Fucy1zZXJpZjsgCi0JIGZvbnQtc2l6ZToxMXB4OyAKLX0KLQotLnN1YkhlYWQgewotCWNvbG9yOiAjMjkzZDZiOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnN0ZXBDb250ewotCSBmb250LWZhbWlseTp2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7IAotCSBmb250LXNpemU6MTFweDsKLX0KLQotaDF7IGZvbnQtZmFtaWx5OmFyaWFsLHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OmJvbGQ7IGZvbnQtc2l6ZToxOHB4OyB9Ci1oMnsgZm9udC1mYW1pbHk6YXJpYWwsc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6Ym9sZDsgZm9udC1zaXplOjE1cHg7IH0KLWgzeyBmb250LWZhbWlseTphcmlhbCxzYW5zLXNlcmlmOyBmb250LXdlaWdodDpib2xkOyBmb250LXNpemU6MTRweDsgfQotaDR7IGZvbnQtZmFtaWx5OmFyaWFsLHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OmJvbGQ7IGZvbnQtc2l6ZToxMnB4OyB9Ci0KLS5jb2RlU2FtcGxlewotCWZvbnQtZmFtaWx5OiBDb3VyaWVyOwkKLX0KLQotLnF1b3RlewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7IAkKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5jb3B5eyBmb250LWZhbWlseTp2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZToxMHB4OyBjb2xvcjojOTk5OTk5O30KLWEuY29weTpsaW5rLAotYS5jb3B5OmFjdGl2ZSwKLWEuY29weTp2aXNpdGVkLAotYS5jb3B5OmhvdmVyeyBmb250LWZhbWlseTp2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZToxMHB4OyBjb2xvcjojOTk5OTk5O30KLQotYTpsaW5rewotICAgIGNvbG9yOiAjNWM4MWE3OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQlmb250LWZhbWlseTp2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0Om5vcm1hbDsgZm9udC1zaXplOjEwcHg7Ci19Ci0KLWE6YWN0aXZlewotICAgIGNvbG9yOiAjMDAwMGZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQlmb250LWZhbWlseTp2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0Om1vcm5hbDsgZm9udC1zaXplOjEwcHg7Ci19Ci0KLWE6dmlzaXRlZHsKLSAgICBjb2xvcjogIzY2MDA2NjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JZm9udC1mYW1pbHk6dmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmOyBmb250LXdlaWdodDpub3JtYWw7IGZvbnQtc2l6ZToxMHB4OwotfQotYTpob3ZlcnsKLSAgICBjb2xvcjogIzVjODFhNzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLQlmb250LWZhbWlseTp2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0Om5vcm1hbDsgZm9udC1zaXplOjEwcHg7Ci19Ci0KLWEudW5zZWxlY3Q6bGluaywKLWEudW5zZWxlY3Q6YWN0aXZlLAotYS51bnNlbGVjdDp2aXNpdGVkewotCWZvbnQtZmFtaWx5OnZlcmRhbmEsYXJpYWwsc2Fucy1zZXJpZjsgCi0JZm9udC13ZWlnaHQ6bm9ybWFsOyAKLQlmb250LXNpemU6MTBweDsgCi0JY29sb3I6ICM1YzgxYTc7IAotfQotCi1hLnVuc2VsZWN0OmhvdmVyeyBjb2xvcjogIzVjODFhNzsgfQotCi1hLnRhYjpsaW5rLAotYS50YWI6YWN0aXZlLAotYS50YWI6dmlzaXRlZHsKLQlmb250LWZhbWlseTp2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7IAotCWZvbnQtd2VpZ2h0OmJvbGQ7IAotCWZvbnQtc2l6ZToxMHB4OyAKLQljb2xvcjogI2ZmZmZmZjsgCi19Ci0KLWEudGFiOmhvdmVyeyAKLQljb2xvcjogI2M4ZDdlMzsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotCi0udGFiX2FjdGl2ZXsKLQlmb250LWZhbWlseTp2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7IAotCWZvbnQtd2VpZ2h0OmJvbGQ7IAotCWZvbnQtc2l6ZToxMHB4OyAKLQljb2xvcjogIzI5M2Q2YjsgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9BcnRpZmFjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9BcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMWU0ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvQXJ0aWZhY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvQXJ0aWZhY3QuanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvQXJ0aWZhY3QuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzM5MTI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL0FydGlmYWN0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL0RlbGl2ZXJhYmxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL0RlbGl2ZXJhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2RmZTYyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9EZWxpdmVyYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9PdXRjb21lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL091dGNvbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNjczODgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL091dGNvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvUm9sZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9Sb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWJmYTRjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9Sb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1JvbGUuanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvUm9sZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmMTgzYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvUm9sZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9UYXNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1Rhc2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZmM0NjEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1Rhc2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvVGFzay5qcGcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9UYXNrLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjVhYzJjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9UYXNrLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL3Byb2Nlc3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvcHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmOWEwODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvcHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYWN0aXZpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FjdGl2aXR5X21lZGl1bS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYWN0aXZpdHlfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYWN0aXZpdHlfbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9hY2xzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9hY2xzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTMwYjU5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfYWNscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfYW5hbWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2FuYW1kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTY2NjZlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfYW5hbWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2NsYXNzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9jbGFzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmODM1MmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2NsYXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kZXNtZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZGVzbWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDBjYzkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kZXNtZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZG9jLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kb2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZmI5ZDVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kb2MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2Rwa2cuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2Rwa2cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzI2YWE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kcGtnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kcGxtb2QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2RwbG1vZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVhZjU4ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2RwbG1vZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZHNzdWIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2Rzc3ViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzc3YTZiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZHNzdWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2V2ZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9ldmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViOWY2NWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2V2ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9pbXBtZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfaW1wbWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZmQwNmFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9pbXBtZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfaW50ZmMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2ludGZjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTgzMWJhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfaW50ZmMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX3BvYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfcG9jLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTgwN2ZkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfcG9jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9zaWduYS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfc2lnbmEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OGIwMzFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9zaWduYS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJ0aWZhY3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FydGlmYWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmExZTRmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJ0aWZhY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FydGlmYWN0X21lZGl1bS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJ0aWZhY3RfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmExZTRmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJ0aWZhY3RfbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9iYWNrX3RvX3RvcC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYmFja190b190b3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZmNkNWEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9iYWNrX3RvX3RvcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2hlY2tsaXN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jaGVja2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzNhYTNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jaGVja2xpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NpcmNsZV9jbG9zZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2lyY2xlX2Nsb3NlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWRkZDk3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2lyY2xlX2Nsb3NlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jaXJjbGVfb3Blbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2lyY2xlX29wZW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMjE4ZTI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jaXJjbGVfb3Blbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29sbGFwc2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbGxhcHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y2NTQxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29sbGFwc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzhmNzAxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb21wb3NpdGVyb2xlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb21wb3NpdGVyb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWJmYTRjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29tcG9zaXRlcm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29uY2VwdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29uY2VwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwZTk1Y2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbmNlcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmZjMDgxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb250ZW50X3BhY2thZ2VfbWVkaXVtLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb250ZW50X3BhY2thZ2VfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmZjMDgxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29udGVudF9wYWNrYWdlX21lZGl1bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGlzcGxheV92aWV3cy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGlzcGxheV92aWV3cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2MjQwMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc3BsYXlfdmlld3NfYS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGlzcGxheV92aWV3c19hLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDYyNDAyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGlzcGxheV92aWV3c19hLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9jbG9zZS5qcGcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fY2xvc2UuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmQyMDI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9jbG9zZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGwuanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjY2YjgxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsX3JpZ2h0LmpwZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9jbG9zZV9zbWFsbF9yaWdodC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3MDZjOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsX3JpZ2h0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9vcGVuLmpwZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9vcGVuLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTY5MDRlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fb3Blbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fb3Blbl9zbWFsbC5qcGcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fb3Blbl9zbWFsbC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhNjM1YjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX29wZW5fc21hbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX29wZW5fc21hbGxfcmlnaHQuanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX29wZW5fc21hbGxfcmlnaHQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NWI3ZDRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsX3JpZ2h0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb3duX2Fycm93LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb3duX2Fycm93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDY4YzQyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG93bl9hcnJvdy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZWQ0YzNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4YW1wbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NTMxMGIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9leHBhbmQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4cGFuZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjMGZlOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4cGFuZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZXhwYW5kX2FsbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZXhwYW5kX2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhMThhMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4cGFuZF9hbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2ZhbHNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9mYWxzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiNjY1ZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2ZhbHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkYW5jZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGFuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkYW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGFuY2VfbWVkaXVtLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkYW5jZV9tZWRpdW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkYW5jZV9tZWRpdW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2d1aWRsaW5lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllOTFlNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2d1aWRsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9pbmRlbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2luZGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMDAzYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2luZGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbGVmdG5hdl9tb2NrdXAuanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2xlZnRuYXZfbW9ja3VwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWIxNjU0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbGVmdG5hdl9tb2NrdXAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21ldGhvZF9wbHVnaW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21ldGhvZF9wbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MDZjMjc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9tZXRob2RfcGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9tZXRob2RfcGx1Z2luX21lZGl1bS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbWV0aG9kX3BsdWdpbl9tZWRpdW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MDZjMjc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9tZXRob2RfcGx1Z2luX21lZGl1bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbWlsZXN0b25lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9taWxlc3RvbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NzZmZjk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9taWxlc3RvbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL25lZWRfaWNvbi5qcGcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbmVlZF9pY29uLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmFkMTFjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbmVlZF9pY29uLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ub19ydXAuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL25vX3J1cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyNmM0MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL25vX3J1cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJhY3RpY2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3ByYWN0aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDhjNDM2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJhY3RpY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Byb2Nlc3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Byb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjlhMDg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9wcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9wcm9jZXNzX21lZGl1bS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJvY2Vzc19tZWRpdW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjlhMDg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9wcm9jZXNzX21lZGl1bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcmVwb3J0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yZXBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZWEyMzEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yZXBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JldXNhYmxlYXNzZXQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JldXNhYmxlYXNzZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Yjk3ODhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yZXVzYWJsZWFzc2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2FkbWFwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2FkbWFwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmZjNTEzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9hZG1hcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9sZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiZmE0YzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvbGVfbWVkaXVtLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlX21lZGl1bS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiZmE0YzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvbGVfbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlZGVzX2xnX2RnbTMyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlZGVzX2xnX2RnbTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGFmMjJlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9sZWRlc19sZ19kZ20zMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcnVwMS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcnVwMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2MjQwMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3J1cDEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3J1cDFfYS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcnVwMV9hLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDYyNDAyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcnVwMV9hLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zYW1wbGVfc2VjdGlvbmhlYWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3NhbXBsZV9zZWN0aW9uaGVhZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY1MmU4MjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3NhbXBsZV9zZWN0aW9uaGVhZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc2hpbS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc2hpbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhYmE3OTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3NoaW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3N0ZXBfc2FtcGxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zdGVwX3NhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzZjQwOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3N0ZXBfc2FtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zdXBwb3J0aW5nbWF0ZXJpYWwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3N1cHBvcnRpbmdtYXRlcmlhbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMWU0ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3N1cHBvcnRpbmdtYXRlcmlhbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX2VuZC1hLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfZW5kLWEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOGNjNWU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfZW5kLWEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9lbmQtaS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX2VuZC1pLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzc1NDQ3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX2VuZC1pLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfbWlkZGxlLWFfaS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX21pZGRsZS1hX2kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDc5NTU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfbWlkZGxlLWFfaS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX21pZGRsZS1pX2EuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9taWRkbGUtaV9hLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjQ5ODY3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX21pZGRsZS1pX2EuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9taWRkbGUtaV9pLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfbWlkZGxlLWlfaS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlODdiMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9taWRkbGUtaV9pLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfc3BhY2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9zcGFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0YTk4ZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9zcGFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX3NwYWNlX21pZGRsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX3NwYWNlX21pZGRsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliYTliYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9zcGFjZV9taWRkbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2suZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZmM0NjEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YXNrX21lZGl1bS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFza19tZWRpdW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZmM0NjEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YXNrX21lZGl1bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFza2Rlc19sZ19kZ20zMi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFza2Rlc19sZ19kZ20zMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2ZWQ0NzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2tkZXNfbGdfZGdtMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RlYW1wcm9maWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZWFtcHJvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg2YmQ3ZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RlYW1wcm9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZWNobmlxdWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RlY2huaXF1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllOTFlNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RlY2huaXF1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVtcGxhdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTU3YTdlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rlcm1kZWZpbml0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZXJtZGVmaW5pdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVkYzlmMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rlcm1kZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90aXRsZWJhY2tfbGVmdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGl0bGViYWNrX2xlZnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMGVjYTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90aXRsZWJhY2tfbGVmdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGl0bGViYWNrX3JpZ2h0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90aXRsZWJhY2tfcmlnaHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OGI4OWMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90aXRsZWJhY2tfcmlnaHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rvb2xtZW50b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rvb2xtZW50b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YzU1YTJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b29sbWVudG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b3AuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RvcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxNWFjZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RvcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdG9wX3NtLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b3Bfc20uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZTdmYmEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b3Bfc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RvcGJhcl9tb2NrdXAuanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RvcGJhcl9tb2NrdXAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOTY2NjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b3BiYXJfbW9ja3VwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90cnVlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90cnVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDU0ZGEwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdHJ1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdV9ib2xkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy91X2JvbGQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZmNkNWEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy91X2JvbGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3VwX2Fycm93LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy91cF9hcnJvdy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUxZTVjY2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3VwX2Fycm93LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy93aGl0ZXBhcGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy93aGl0ZXBhcGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjJlNDhlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvd2hpdGVwYXBlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvd29ya2Rlc19sZ19kZ20zMi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvd29ya2Rlc19sZ19kZ20zMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0NGU1ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3dvcmtkZXNfbGdfZGdtMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyNDA3ODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDY1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZnVuY3Rpb24gQWN0aXZpdHlUcmVlVGFibGUoLypQcm9jZXNzRWxlbWVudFBhZ2UqL3BhcmVudCkgewotdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci10aGlzLnRyZWVfbm9kZV9jbGFzcyAgPSAidHJlZU5vZGUiOwkvLyAhISEgZG9uJ3QgdHJhbnNsYXRlIHRoaXMgISEhCi10aGlzLmV4cGFuZEltYWdlID0gbnVsbDsKLXRoaXMuY29sbGFwc2VJbWFnZSA9IG51bGw7Ci10aGlzLnNoaW1JbWFnZSA9IG51bGw7Ci10aGlzLndic0l0ZW1IdG1sID0gbnVsbDsKLXRoaXMuaW1hZ2VQYXRoID0gbnVsbDsKLXRoaXMuTk9ERV9DT0xMQVBTRUQgPSAwOwotdGhpcy5OT0RFX0VYUEFOREVEID0gMTsKLXRoaXMuREVGQVVMVF9FWFBBTkRfTEVWRUwgPSAwOyAvLyAwIC0gY29sbGFwc2UgYWxsLCAxIC0gZXhwYW5kIHRoZSBmaXJzdCBsZXZlbCwgLi4uLCA5OTk5IC0gaWYgeW91IGhhdmUgdGhpcyBtYW55Ci0KLX07Ci0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHRyZWUgdGFibGUKLS8vIHRoZSBleHBlY3RlZCBmb3JtYXQgb2YgdGhlIGh0bWwgc291cmNlIGFyZSBhcyBmb2xsb3dzOgotLy8gZWFjaCA8VFIgdGFnIGhhcyBhIHVpbnF1ZSBpZCBhbmQgYSBwYXJlbnRJZC4KLS8qCi08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLTxsaW5rIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2Nzcy9kZWZhdWx0LmNzcyIgcmVsPSJTdHlsZVNoZWV0Ij4KLTxzY3JpcHQgc3JjPSIuL3RyZWV0YWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBvbmxvYWQ9ImNyZWF0ZVRyZWUoJ3RkJywgJ3RyZWVOb2RlJywgJy4vaW1hZ2VzLycpOyIgPgotPHRhYmxlIGJvcmRlcj0iMSI+Ci08dHIgaWQ9IjEiIHBhcmVudElkPSIwIj4KLTx0ZCBjbGFzcz0idHJlZU5vZGUiPmNvbCAxLTE8L3RkPjx0ZD5jb2wgMS0yPC90ZD4KLTwvdHI+Ci0KLTx0ciBpZD0iMiIgcGFyZW50SWQ9IjEiPgotPHRkIGNsYXNzPSJ0cmVlTm9kZSI+Y29sIDEtMTwvdGQ+PHRkPmNvbCAyLTI8L3RkPgotPC90cj4KLQotPHRyIGlkPSIzIiBwYXJlbnRJZD0iMSI+Ci08dGQgY2xhc3M9InRyZWVOb2RlIj5jb2wgMS0xPC90ZD48dGQ+Y29sIDItMjwvdGQ+Ci08L3RyPgotCi08dHIgaWQ9IjQiIHBhcmVudElkPSIwIj4KLTx0ZCBjbGFzcz0idHJlZU5vZGUiPmNvbCAyLTE8L3RkPjx0ZD5jb2wgMi0yPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ib2R5PgotKi8KLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbihpbWdQYXRoKQotewotCXRoaXMuaW1hZ2VQYXRoID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoKTsKLQl0aGlzLmV4cGFuZEltYWdlID0gdGhpcy5pbWFnZVBhdGggKyAnZXhwYW5kLmdpZic7CQotCXRoaXMuY29sbGFwc2VJbWFnZSA9IHRoaXMuaW1hZ2VQYXRoICsgJ2NvbGxhcHNlLmdpZic7Ci0JLy9leHBhbmRBbGxJbWFnZSA9IHRoaXMuaW1hZ2VQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJzsJCi0JLy9jb2xsYXBzZUFsbEltYWdlID0gdGhpcy5pbWFnZVBhdGggKyAnY29sbGFwc2VfYWxsLmdpZic7Ci0JLy9iYWNrVG9Ub3BJbWFnZSA9IHRoaXMuaW1hZ2VQYXRoICsgJ2JhY2tfdG9fdG9wLmdpZic7Ci0JdGhpcy5zaGltSW1hZ2UgPSB0aGlzLmltYWdlUGF0aCArICdpbmRlbnQuZ2lmJzsKLQl0aGlzLndic0l0ZW1IdG1sID0gbmV3IFdCU0l0ZW1IdG1sKHRoaXMsIHRoaXMuaW1hZ2VQYXRoKTsKLX07Ci0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5jcmVhdGVUcmVlID0gZnVuY3Rpb24odGFnTmFtZSwgY2xhc3NTZWxlY3RvcikgewotCi0JdGhpcy50cmVlX25vZGVfY2xhc3MgPSBjbGFzc1NlbGVjdG9yOwotCQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgewotCQkKLQkJLy9hbGVydCgic3RhcnQiKTsKLQkJCi0JCS8vIHNhdmUgbWFwIG9mIHBhcmVudElkIHRvIHBhcmVudCBUUiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCi0JCXZhciBjcmVhdGVkTm9kZXMgPSBuZXcgQXJyYXkoKTsKLQotCQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsKLQkJLy92YXIgc2VjdGlvbkVsZW1lbnRzID0gbmV3IEFycmF5KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCS8vdmFyIHRvdGFsTGlua3MgPSAwOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IgKSAKLQkJCXsKLQkJCQl2YXIgaW5kZW50U2l6ZSA9IDA7Ci0JCQkJdmFyIHRyRWxlbWVudD0gdGhpcy5nZXRUUihlbGVtZW50KTsJCi0JCQkJdmFyIHBhcmVudElkID0gdHJFbGVtZW50LmdldEF0dHJpYnV0ZSgicGFyZW50SWQiKTsKLQkJCQlwYXJlbnRUUiAgPSBudWxsOwotCQkJCWlmICggcGFyZW50SWQgIT0gIiIpCi0JCQkJewotCQkJCQotCQkJCQkvLyBjYWNoZSBpdCB0byBiZSBmYXN0ZXIKLQkJCQkJLy9wYXJlbnRUUiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRyRWxlbWVudC5wYXJlbnRJZCk7Ci0JCQkJCXBhcmVudFRSID0gY3JlYXRlZE5vZGVzW3BhcmVudElkXTsKLQkJCQkJaWYgKCBwYXJlbnRUUiAhPSBudWxsICYmIHBhcmVudFRSICE9IHVuZGVmaW5lZCApCi0JCQkJCXsKLQkJCQkJCWluZGVudFNpemUgPSBwYXJzZUludChwYXJlbnRUUi5nZXRBdHRyaWJ1dGUoImluZGVudFNpemUiKSkgKyAxOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXZhciBleHBhbmRlZCA9IHRoaXMuZ2V0RGVmYXVsdEV4cGFuZFN0YXRlKGluZGVudFNpemUpOwotCQkJCQotCQkJCXRyRWxlbWVudC5zZXRBdHRyaWJ1dGUoImluZGVudFNpemUiLCBpbmRlbnRTaXplKTsKLQkJCQl0ckVsZW1lbnQuc2V0QXR0cmlidXRlKCJleHBhbmRlZCIsIGV4cGFuZGVkKTsKLQkJCQkJCQkJCi0JCQkJLy9hbGVydCgiY3JlYXRlVHJlZU5vZGUgZm9yIGlkLCBwYXJlbnRJZCwgaW5kZW50ID0iICsgdHJFbGVtZW50LmlkICsgIiwgIiArIHBhcmVudElkICsgIiwgIGluZGVudFNpemU9IiArIGluZGVudFNpemUpOwotCQkJCS8vY3JlYXRlVHJlZU5vZGUoZWxlbWVudCwgaW5kZW50U2l6ZSk7Ci0JCQkJCi0JCQkJLy9zYXZlIHRoZSBjcmVhdGVkIG9uZXMgc28gd2UgY2FuIHJlZmVyZWNuZSBpdAotCQkJCWNyZWF0ZWROb2Rlc1t0ckVsZW1lbnQuaWRdID0gdHJFbGVtZW50OwotCQkJCQotCQkJCQotCQkJCWlmICggKHBhcmVudFRSICE9IG51bGwpICYmIHRoaXMuaXNOb2RlU3VwcHJlc3NlZChwYXJlbnRUUikgKQotCQkJCXsKLQkJCQkJdGhpcy5zZXROb2RlU3VwcHJlc3NlZCh0ckVsZW1lbnQsIHRydWUpOwotCQkJCQkvL2FsZXJ0KCJwYXJlbnQgc3VwcHJlc3NlZCIpOwotCQkJCX0KLQotCQkJCWlmICggdGhpcy5pc05vZGVTdXBwcmVzc2VkKHRyRWxlbWVudCkgPT0gdHJ1ZSB8fCAocGFyZW50VFIgIT0gbnVsbCAmJiBwYXJlbnRUUi5nZXRBdHRyaWJ1dGUoImV4cGFuZGVkIikgPT0gdGhpcy5OT0RFX0NPTExBUFNFRCkgKQotCQkJCXsKLQkJCQkJdHJFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCQkJCS8vYWxlcnQoInN1cHByZXNzZWQiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vYWxlcnQoImVuZCIpOwotCQkKLQl9Ci19OwotCi0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5nZXREZWZhdWx0RXhwYW5kU3RhdGUgPSBmdW5jdGlvbihsZXZlbCkKLXsKLQotCWlmIChsZXZlbCA+PSB0aGlzLkRFRkFVTFRfRVhQQU5EX0xFVkVMICkgewotCQlyZXR1cm4gdGhpcy5OT0RFX0NPTExBUFNFRDsKLQl9IGVsc2UgewotCQlyZXR1cm4gdGhpcy5OT0RFX0VYUEFOREVEOwotCX0KLQotfTsKLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmdldFRyZWVOb2RlU3JjID0gZnVuY3Rpb24obGV2ZWwpCi17Ci0JaWYgKCB0aGlzLmdldERlZmF1bHRFeHBhbmRTdGF0ZShsZXZlbCkgPT0gdGhpcy5OT0RFX0NPTExBUFNFRCApIHsKLQkJcmV0dXJuIHRoaXMuZXhwYW5kSW1hZ2U7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gdGhpcy5jb2xsYXBzZUltYWdlOwotCX0KLX07Ci0KLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmdldFRSID0gZnVuY3Rpb24oZWxlbWVudCkKLXsKLQkvLyB0aGUgaGVtbCBzdHJ1Y3R1cmUgaXMKLQkvLyA8dHIgaWQ9IjIiIHBhcmVudElkPSIxIj4KLQkvLyA8dGQgY2xhc3M9InRyZWVOb2RlIj5jb2wgMS0xPC90ZD48dGQ+Y29sIDItMjwvdGQ+Ci0JLy8gPC90cj4KLQl2YXIgZSA9IGVsZW1lbnQ7Ci0Jd2hpbGUgKCBlICE9IG51bGwgJiYgZS50YWdOYW1lICE9ICJUUiIgfHwgZS5jbGFzc05hbWUgIT0gdGhpcy50cmVlX25vZGVfY2xhc3MpCi0JewkKLQkJZSA9IGUucGFyZW50Tm9kZTsKLQkJLy9hbGVydChlLnRhZ05hbWUpOwotCX0KLQkKLQlyZXR1cm4gZTsKLX07Ci0KLQotLy8gRXhwYW5kcyBvciBjb2xsYXBzZXMgYSBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5leHBhbmRDb2xsYXBzZVRyZWVOb2RlID0gZnVuY3Rpb24oZXZ0RWxlbWVudCkgewotCi0JLy9hbGVydChldnRFbGVtZW50LnRhZ05hbWUpOwotCi0JdmFyIHRyRWxlbWVudCA9IHRoaXMuZ2V0VFIoZXZ0RWxlbWVudCk7Ci0JCi0JLy8gaWYgdGhlcmUgaXMgbm8gY2hpbGQsIHJlbW92ZSB0aGUgdHJlZSBub2RlIGltYWdlCi0JaWYgKCAhdGhpcy5faGFzQ2hpbGRyZW4odHJFbGVtZW50KSApCi0JewotCQlldnRFbGVtZW50LnNyYyA9IHRoaXMuc2hpbUltYWdlOwotCQlldnRFbGVtZW50Lm9uY2xpY2sgPSBudWxsOwotCQlldnRFbGVtZW50LnN0eWxlLmN1cnNvciA9ICJkZWZhdWx0IjsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQl2YXIgZXhwYW5kZWQgPSB0ckVsZW1lbnQuZ2V0QXR0cmlidXRlKCJleHBhbmRlZCIpOwotCi0JaWYgKGV4cGFuZGVkID09IHRoaXMuTk9ERV9FWFBBTkRFRCkgewotCQl0aGlzLmhpZGVDaGlsZHJlbih0ckVsZW1lbnQpOwotCQlldnRFbGVtZW50LnNyYyA9IHRoaXMuZXhwYW5kSW1hZ2U7Ci0JCWV4cGFuZGVkID0gdGhpcy5OT0RFX0NPTExBUFNFRDsKLQl9Ci0JZWxzZSB7Ci0JCXRoaXMuc2hvd0hpZGVDaGlsZHJlbih0ckVsZW1lbnQsIHRydWUpOwotCQlldnRFbGVtZW50LnNyYyA9IHRoaXMuY29sbGFwc2VJbWFnZTsKLQkJZXhwYW5kZWQgPSB0aGlzLk5PREVfRVhQQU5ERUQ7Ci0JfQotCQotCXRyRWxlbWVudC5zZXRBdHRyaWJ1dGUoImV4cGFuZGVkIiwgZXhwYW5kZWQpOwotCQotCS8qCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsKLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7Ci0JfQotCSovCi0JCi0JcmV0dXJuIGZhbHNlOwotfTsKLQotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuaGlkZUNoaWxkcmVuID0gZnVuY3Rpb24ocGFyZW50KQotewkKLQkvLyBtYWtlIHN1cmUgaXQncyB0aGUgVFIgZWxlbWVudAotCXBhcmVudCA9IHRoaXMuZ2V0VFIocGFyZW50KTsKLQkvL3ZhciBwYXJlbnRJZCA9IHBhcmVudC5pZDsKLQl2YXIgaW5kZW50U2l6ZSA9IHBhcnNlSW50KHBhcmVudC5nZXRBdHRyaWJ1dGUoImluZGVudFNpemUiKSk7Ci0JdmFyIG5leHRUUiA9IHBhcmVudDsKLQl3aGlsZSAoIChuZXh0VFI9dGhpcy5nZXROZXh0U2libGluZyhuZXh0VFIpKSAhPSBudWxsICYmIG5leHRUUi5nZXRBdHRyaWJ1dGUoImluZGVudFNpemUiKSA+IGluZGVudFNpemUgKQotCXsJCQotCQluZXh0VFIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsJCQotCX0KLQkJCi19OwotCi0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5zaG93SGlkZUNoaWxkcmVuID0gZnVuY3Rpb24ocGFyZW50LCBzaG93KQotewkJCi0JLy8gbWFrZSBzdXJlIGl0J3MgdGhlIFRSIGVsZW1lbnQKLQlwYXJlbnQgPSB0aGlzLmdldFRSKHBhcmVudCk7Ci0JCi0JLy92YXIgaW5kZW50U2l6ZSA9IHBhcmVudC5pbmRlbnRTaXplOwotCXZhciBuZXh0VFIgPSB0aGlzLmdldE5leHRTaWJsaW5nKHBhcmVudCk7Ci0Jd2hpbGUgKCBuZXh0VFIgIT0gbnVsbCAmJiBuZXh0VFIuZ2V0QXR0cmlidXRlKCJwYXJlbnRJZCIpID09IHBhcmVudC5pZCApCi0JewotCQlpZiAoIHNob3cgJiYgKHRoaXMuaXNOb2RlU3VwcHJlc3NlZChuZXh0VFIpID09IGZhbHNlKSApCi0JCXsKLQkJCW5leHRUUi5zdHlsZS5kaXNwbGF5ID0gJyc7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkKLQkJCW5leHRUUi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotCQl9Ci0JCQotCQluZXh0VFIgPSB0aGlzLnNob3dIaWRlQ2hpbGRyZW4obmV4dFRSLCAoc2hvdz09dHJ1ZSkmJihuZXh0VFIuZ2V0QXR0cmlidXRlKCJleHBhbmRlZCIpPT10aGlzLk5PREVfRVhQQU5ERUQpICk7Ci0JfQotCQotCXJldHVybiBuZXh0VFI7Ci0JCi19OwotCi0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5faGFzQ2hpbGRyZW4gPSBmdW5jdGlvbihwYXJlbnQpCi17Ci0KLQkvLyBtYWtlIHN1cmUgaXQncyB0aGUgVFIgZWxlbWVudAotCXBhcmVudCA9IHRoaXMuZ2V0VFIocGFyZW50KTsKLQotCXZhciBuZXh0VFIgPSB0aGlzLmdldE5leHRTaWJsaW5nKHBhcmVudCk7Ci0JCi0vL2FsZXJ0KCJwYXJlbnQuaWQ9IiArIHBhcmVudC5pZCArICIsIG5leHRUUi5wYXJlbnRJZD0iICsgbmV4dFRSLmdldEF0dHJpYnV0ZSgicGFyZW50SWQiKSArICIsIGlzU3VwcHJlc3NlZD0iICsgaXNOb2RlU3VwcHJlc3NlZChuZXh0VFIpKTsKLQotCWlmICggbmV4dFRSICE9IG51bGwgJiYgbmV4dFRSLmdldEF0dHJpYnV0ZSgicGFyZW50SWQiKSA9PSBwYXJlbnQuaWQpIAotCXsKLQkJaWYgKHRoaXMuaXNOb2RlU3VwcHJlc3NlZChuZXh0VFIpID09IGZhbHNlKQotCQl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCW5leHRUUi5uZXh0U2libGluZzsKLQkJCXdoaWxlIChuZXh0VFIgIT0gbnVsbCkKLQkJCXsKLQkJCQlpZiAodGhpcy5pc05vZGVTdXBwcmVzc2VkKG5leHRUUikgPT0gZmFsc2UpCi0JCQkJewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJbmV4dFRSID0gbmV4dFRSLm5leHRTaWJsaW5nOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXJldHVybiBmYWxzZTsKLX07Ci0KLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmdldE5leHRTaWJsaW5nID0gZnVuY3Rpb24oZWxlbWVudCkKLXsKLQotCXZhciBuZXh0RWxlbWVudCA9IGVsZW1lbnQubmV4dFNpYmxpbmc7Ci0Jd2hpbGUgKG5leHRFbGVtZW50ICE9IG51bGwgJiYgbmV4dEVsZW1lbnQudGFnTmFtZSAhPSBlbGVtZW50LnRhZ05hbWUgKQotCXsKLQkJbmV4dEVsZW1lbnQgPSBuZXh0RWxlbWVudC5uZXh0U2libGluZzsKLQl9Ci0JCi0JcmV0dXJuIG5leHRFbGVtZW50OwotfTsKLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmdldEZpcnN0Q2hpbGQgPSBmdW5jdGlvbih0ckVsZW1lbnQsIHRhZ05hbWUsIGNsYXNzTmFtZSkKLXsKLQl2YXIgZSA9IHRyRWxlbWVudC5maXJzdENoaWxkOwotCXdoaWxlIChlICE9IG51bGwpCi0JewotCWFsZXJ0KGUudGFnTmFtZSk7Ci0JCWlmICggKHRhZ05hbWUgPT0gbnVsbCB8fCBlLnRhZ05hbWUgPT0gdGFnTmFtZSkgJiYgKGNsYXNzTmFtZSA9PSBudWxsIHx8IGUuY2xhc3NOYW1lID09IGNsYXNzTmFtZSkgKQotCQl7Ci0JCQlyZXR1cm4gZTs7Ci0JCX0KLQkJCi0JCWUgPSBlLm5leHRTaWJsaW5nOwotCX0KLQkKLQlyZXR1cm4gbnVsbDsKLQkJCi19OwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuaXNOb2RlU3VwcHJlc3NlZCA9IGZ1bmN0aW9uKHRyRWxlbWVudCkKLXsKLQkvLyBpZiBpc1N1cHJlc3NlZCBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgYWx3YXlzIHVzZSBpdAotCS8vIG9ubHkgYnJvd3NpZ24gbW9kZWwgc2V0IHRoaXMgYXR0cmlidXRlCi0JLy8gaWYgbm90IGRlZmluZWQsIGl0J3MgaW4gcHVibGlzaGVkIHNpdGUsIGxvb2sgdXAgdGhlIGZsYWcgZnJvbSB0aGUgZ2VuZXJhdGVkIG1hcAotCWF0dHJfc3VwcHJlc3NlZCA9IHRyRWxlbWVudC5nZXRBdHRyaWJ1dGUoImlzU3VwcmVzc2VkIik7Ci0JCi0JaWYgKCBhdHRyX3N1cHByZXNzZWQgPT0gbnVsbCB8fCBhdHRyX3N1cHByZXNzZWQgPT0gIiIgfHwgYXR0cl9zdXBwcmVzc2VkID09IHVuZGVmaW5lZCApCi0JewotCQkvLyB0aGlzIG1ldGhvZCBpcyBkZWZpbmVkIGluIGFjdGl2aXR5bGF5b3V0LmpzCi0JCXJlbFBhdGggPSB0ckVsZW1lbnQuZ2V0QXR0cmlidXRlKCJyZWxQcm9jZXNzUGF0aCIpOwotCQlmbGFnID0gZmFsc2U7Ci0JCWlmICggcmVsUGF0aCAhPSBudWxsICYmIHJlbFBhdGggIT0gIiIgJiYgcmVsUGF0aCAhPSB1bmRlZmluZWQgKQotCQl7Ci0JCQlmbGFnID0gdGhpcy5wYXJlbnQuaXNTdXBwcmVzc2VkKGNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnBhcl9wcm9jLCBjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5wYXJfcGF0aCArIHJlbFBhdGgpOwotCQl9Ci0JCXRoaXMuc2V0Tm9kZVN1cHByZXNzZWQodHJFbGVtZW50LCBmbGFnKTsKLQkJCi0JCXJldHVybiBmbGFnOwotCX0KLQllbHNlCi0JewotCQlyZXR1cm4gKGF0dHJfc3VwcHJlc3NlZCA9PSAidHJ1ZSIpOwotCX0KLX07Ci0KLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLnNldE5vZGVTdXBwcmVzc2VkID0gZnVuY3Rpb24odHJFbGVtZW50LCBmbGFnKQotewotCXRyRWxlbWVudC5zZXRBdHRyaWJ1dGUoImlzU3VwcmVzc2VkIiwgZmxhZyA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkKLX07Ci0KLQotCi0KLS8vIGRlZmluZSB0aGUgYnJlYWsgZG93biBzdHJ1Y3R1cmUgY29sdW1ucyBpZHMgaGVyZQotQlNfQ09MX0lOREVYID0gImlkIjsKLUJTX0NPTF9OQU1FID0gIm5hbWUiOwotQlNfQ09MX1BSRUZJWCA9ICJwcmVmaXgiOwotQlNfQ09MX1BSRURFQ0VTU09SUyA9ICJwcmVkZWNlc3NvcnMiOwotQlNfQ09MX0lTX1JFUEVBVEFCTEUgPSAiaXNfcmVwZWF0YWJsZSI7Ci1CU19DT0xfSVNfT05HT0lORyA9ICJpc19vbmdvaW5nIjsKLUJTX0NPTF9JU19FVkVOVF9EUklWRU4gPSAiaXNfZXZlbnRfZHJpdmVuIjsKLUJTX0NPTF9FTlRSWV9TVEFURSA9ICJlbnRyeV9zdGF0ZSI7Ci1CU19DT0xfRVhJVF9TVEFURSA9ICJleGl0X3N0YXRlIjsKLUJTX0NPTF9URUFNUyA9ICJ0ZWFtcyI7Ci1CU19DT0xfVFlQRSA9ICJ0eXBlIjsKLUJTX0NPTF9NT0RFTF9JTkZPID0gIm1vZGVsX2luZm8iOwotQlNfQ09MX1BSRVNFTlRBVElPTl9OQU1FID0gInByZXNlbnRhdGlvbl9uYW1lIjsgCi1CU19DT0xfU1RFUFMgPSAic3RlcHMiOwotQlNfQ09MX0RFTElWRVJBQkxFID0gImRlbGl2ZXJhYmxlIjsgCi1CU19DT0xfSVNfT1BUSU9OQUwgPSAiaXNfb3B0aW9uYWwiOyAKLUJTX0NPTF9JU19QTEFOTkVEID0gImlzX3BsYW5uZWQiOwotQlNfQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9ICJoYXNfbXVsdGlwbGVfb2NjdXJyZW5jZXMiOwotCi0KLWZ1bmN0aW9uIFdCU0l0ZW1IdG1sKC8qQWN0aXZpdHlUcmVlVGFibGUqL3BhcmVudCkKLXsKLXRoaXMucGFyZW50ID0gcGFyZW50OwotLy90aGlzLmltYWdlUGF0aCA9IGltZ1BhdGg7Ci0KLXRoaXMuZXh0ZW5kVmFyaWFiaWxpdHkgPSAiZXh0ZW5kIjsgLy8gISEhIGRvbid0IHRyYW5zbGF0ZSB0aGlzICEhIQotdGhpcy5sb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5ID0gImxvY2FsQ29udHJpYnV0aW9uIjsJLy8gISEhIGRvbid0IHRyYW5zbGF0ZSB0aGlzICEhIQotdGhpcy5sb2NhbFJlcGxhY2VtZW50VmFyaWFiaWxpdHkgPSAibG9jYWxSZXBsYWNlbWVudCI7CS8vICEhISBkb24ndCB0cmFuc2xhdGUgdGhpcyAhISEKLQotdGhpcy5zb3VyY2VfaHRtbCA9ICIiOwotdGhpcy5jb2x1bW5zID0gW107Ci10aGlzLmZpZWxkcyA9IFtdOwotdGhpcy5pbmRlbnRTaXplID0gMDsKLXRoaXMuaGFzQ2hpbGRyZW4gPSBmYWxzZTsKLXRoaXMuaWQgPSAiIjsKLXRoaXMucGFyZW50SWQgPSAiIjsKLXRoaXMucmVsUGF0aCA9IG51bGw7Ci10aGlzLmlzU3VwcmVzc2VkID0gZmFsc2U7Ci10aGlzLnVybCA9ICIiOwotfTsKLQotCi1XQlNJdGVtSHRtbC5wcm90b3R5cGUuZ2V0VHJlZU5vZGVUYWJsZUh0bWwgPSBmdW5jdGlvbihpbmRlbnRTaXplLCBoYXNDaGlsZHJlbiwgdGl0bGUsIHVybCwgcmVsUGF0aCkKLXsKLQotLy8gdGVzdAotLy8gdGhlIHVybCBpcyBwYXNzZWQgaW4gdG8gYSBzdHJpbmcgdG8gY29uc3RydWN0IGEgc3RyaW5nIGxpdGVyYWwKLS8vIG5lZWQgdG8gZXNjYXBlIHRoZSBxdW90ZXMKLXVybCA9IHVybC5yZXBsYWNlKC8oXCd8XCIpL2csICJcXCQxIik7Ci0KLXVybCA9IGNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLmdldEFjdGl2aXR5SXRlbVVybCh1cmwsIGNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnBhcl9wcm9jLCBjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5wYXJfcGF0aCwgcmVsUGF0aCk7Ci0KLXZhciBzcmMgPSAKLSI8dGFibGUgYmdjb2xvcj1cIiMwMDAwMDBcIiBjZWxscGFkZGluZz1cIjBcIiBjZWxsc3BhY2luZz1cIjBcIiBib3JkZXI9XCIwXCIgY2xhc3M9XCJkZWZhdWx0VGFibGVcIj48dHI+PHRkIG5vd3JhcD1cIm5vd3JhcFwiPiIgKyAKLXRoaXMuZ2V0VHJlZU5vZGVIdG1sKGluZGVudFNpemUsIGhhc0NoaWxkcmVuKSArIAotIjwvdGQ+PHRkIHdpZHRoPVwiMTAwJVwiIG5vd3JhcD1cIm5vd3JhcFwiPiIgKyAKLSI8YSBocmVmPVwiIiArIHVybCArICJcIj4iICsgdGl0bGUgKyAiPC9hPiIgKyAKLSI8L3RkPjwvdHI+PC90YWJsZT4iOwotCi0JcmV0dXJuIHNyYzsKLX07Ci0KLQotV0JTSXRlbUh0bWwucHJvdG90eXBlLmdldFRyZWVOb2RlSHRtbCA9IGZ1bmN0aW9uKGluZGVudFNpemUsIGhhc0NoaWxkcmVuKQotewotCXZhciB3aWR0aCA9IDE3KmluZGVudFNpemU7Ci0KLQl2YXIgc3RyID0gIjxkaXYgY2xhc3M9XCJ0cmVlTm9kZVwiPjxzcGFuPiI7Ci0JaWYgKCBpbmRlbnRTaXplID4gMCApCi0JewotCQlzdHIgKz0gIjxpbWcgd2lkdGg9XCIiICsgd2lkdGggKyAiXCIgaGVpZ2h0PVwiMTVcIiBib3JkZXI9XCIwXCIgc3JjPVwiIiArIHRoaXMucGFyZW50LnNoaW1JbWFnZSArICJcIi8+IjsKLQl9Ci0KLQotCXZhciBpbWdTcmM7Ci0JCi0JaWYgKCAhaGFzQ2hpbGRyZW4gKQotCXsKLQkJc3RyICs9ICI8aW1nIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNVwiIGJvcmRlcj1cIjBcIiBhbGlnbj1cImFic21pZGRsZVwiIHNyYz1cIiIgKyB0aGlzLnBhcmVudC5zaGltSW1hZ2UgKyAiXCI+IjsKLQotCX0KLQllbHNlIAotCXsKLQkJaW1hZ2VTcmMgPSB0aGlzLnBhcmVudC5nZXRUcmVlTm9kZVNyYyhpbmRlbnRTaXplKTsKLQkJCi0JCXN0ciArPSAiPGltZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTVcIiBib3JkZXI9XCIwXCIgYWxpZ249XCJhYnNtaWRkbGVcIiBzcmM9XCIiICsgaW1hZ2VTcmMgKyAiXCIiIAotCQkgICArICIgc3R5bGU9XCJjdXJzb3I6aGFuZFwiIG9uY2xpY2s9XCJjb250ZW50UGFnZS5wcm9jZXNzUGFnZS50cmVlVGFibGUuZXhwYW5kQ29sbGFwc2VUcmVlTm9kZSh0aGlzKTtyZXR1cm4gZmFsc2U7XCIgLz4iOwotCX0KLQkKLQkKLQlzdHIgKz0gIjwvc3Bhbj4mIzE2MDsmIzE2MDs8L2Rpdj4iOwotCi0JcmV0dXJuIHN0cjsJCi19OwotCi1XQlNJdGVtSHRtbC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7Ci0JdmFyIGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmVlQ29udGVudCIpOwotCWlmICggZGl2ID09IG51bGwgKSByZXR1cm47Ci0JCi0JZGl2LmlubmVySFRNTCA9IAotCQkiPHRhYmxlIGJvcmRlcmNvbG9yPVwiIzk5OTk5OVwiIGNlbGxzcGFjaW5nPVwiMVwiIGNlbGxwYWRkaW5nPVwiMFwiIGJvcmRlcj1cIjBcIiB3aWR0aD1cIjEwMCVcIiBjbGFzcz1cImJyZWFrZG93blRhYmxlXCI+IiAKLQkJKyB0aGlzLnNvdXJjZV9odG1sCi0JCSsgIjwvdGFibGU+IjsKLQkJCi19OwotCi1XQlNJdGVtSHRtbC5wcm90b3R5cGUuYWRkQ29sdW1uID0gZnVuY3Rpb24oaWQsIGxhYmVsKSB7Ci0KLQl0aGlzLmNvbHVtbnNbdGhpcy5jb2x1bW5zLmxlbmd0aF0gPSBbaWQsIGxhYmVsXTsKLX07Ci0KLQotV0JTSXRlbUh0bWwucHJvdG90eXBlLmluaXRSb3cgPSBmdW5jdGlvbihpZCwgcGFyZW50SWQsIHJlbFBhdGgsIGlzU3VwcmVzc2VkLCBpbmRlbnRTaXplLCBoYXNDaGlsZHJlbiwgCi0JaW5kZXgsIHByZWZpeCwgbmFtZSwgdGl0bGUsIHVybCwgc3RlcHMsIHByZWRlY2Vzc29ycywgaW5mbywgdHlwZSwgCi0JcmVwZWF0YWJsZSwgbXVsdGlPY2N1cmVuY2VzLCBvcHRpb25hbCwgcGxhbm5lZCwgb25nb2luZywgZXZlbnREcml2ZW4sIAotCXRlYW0sIGVudHJ5U3RhdGUsIGV4aXRTdGF0ZSwgZGVsaXZlcmFibGUsIHZhcmlhYmlsaXR5VHlwZSkKLXsKLQl0aGlzLmluZGVudFNpemUgPSBpbmRlbnRTaXplOwotCXRoaXMuaGFzQ2hpbGRyZW4gPSBoYXNDaGlsZHJlbjsKLQl0aGlzLmlkID0gaWQ7Ci0JdGhpcy5wYXJlbnRJZCA9IHBhcmVudElkOwotCXRoaXMucmVsUGF0aCA9IHJlbFBhdGg7Ci0JdGhpcy5pc1N1cHJlc3NlZCA9IGlzU3VwcmVzc2VkOwotCQotCXRoaXMuZmllbGRzW0JTX0NPTF9JTkRFWF0gPSBpbmRleDsKLQl0aGlzLmZpZWxkc1tCU19DT0xfUFJFRklYXSA9IHByZWZpeDsKLQl0aGlzLmZpZWxkc1tCU19DT0xfTkFNRV0gPSBuYW1lOwotCXRoaXMuZmllbGRzW0JTX0NPTF9QUkVTRU5UQVRJT05fTkFNRV0gPSB0aXRsZTsKLQl0aGlzLnVybCA9IHVybDsKLQl0aGlzLmZpZWxkc1tCU19DT0xfU1RFUFNdID0gc3RlcHM7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX1BSRURFQ0VTU09SU10gPSBwcmVkZWNlc3NvcnM7Ci0JaWYgKHZhcmlhYmlsaXR5VHlwZS5pbmRleE9mKHRoaXMuZXh0ZW5kVmFyaWFiaWxpdHkpICE9IC0xIHx8IAotCQl2YXJpYWJpbGl0eVR5cGUuaW5kZXhPZih0aGlzLmxvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHkpICE9IC0xIHx8IAotCQl2YXJpYWJpbGl0eVR5cGUuaW5kZXhPZih0aGlzLmxvY2FsUmVwbGFjZW1lbnRWYXJpYWJpbGl0eSkgIT0gLTEgKQotCXsKLQkJdGhpcy5maWVsZHNbQlNfQ09MX01PREVMX0lORk9dID0gIiI7Ci0JfQotCWVsc2UKLQl7Ci0JCXRoaXMuZmllbGRzW0JTX0NPTF9NT0RFTF9JTkZPXSA9IGluZm87Ci0JfQkKLQl0aGlzLmZpZWxkc1tCU19DT0xfVFlQRV0gPSB0eXBlOwotCi0JdGhpcy5maWVsZHNbQlNfQ09MX1RFQU1TXSA9IHRlYW07Ci0KLQl0aGlzLmZpZWxkc1tCU19DT0xfRU5UUllfU1RBVEVdID0gZW50cnlTdGF0ZTsKLQl0aGlzLmZpZWxkc1tCU19DT0xfRVhJVF9TVEFURV0gPSBleGl0U3RhdGU7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX0RFTElWRVJBQkxFXSA9IGRlbGl2ZXJhYmxlOwotCQotCXRoaXMuc2V0U3RhdGVzKHJlcGVhdGFibGUsIG11bHRpT2NjdXJlbmNlcywgb3B0aW9uYWwsIHBsYW5uZWQsIG9uZ29pbmcsIGV2ZW50RHJpdmVuKTsKLQkKLQkKLX07Ci0KLVdCU0l0ZW1IdG1sLnByb3RvdHlwZS5hZGRTdGVwID0gZnVuY3Rpb24oc2VsZWN0ZWQsIGxpbmVCcmVhaykKLXsKLQl2YXIgaW1nX3NyYzsKLQlpZiAoIHNlbGVjdGVkICkgewotCQlpbWdfc3JjID0gdGhpcy5wYXJlbnQuaW1hZ2VQYXRoICsgImNpcmNsZV9jbG9zZS5naWYiOwotCX0gZWxzZSB7Ci0JCWltZ19zcmMgPSB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAiY2lyY2xlX29wZW4uZ2lmIjsJCi0JfQotCQotCXN0ZXBzID0gdGhpcy5maWVsZHNbQlNfQ09MX1NURVBTXTsKLQlzdGVwcyArPSAiPGltZyB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiOVwiIGFsdD1cIlwiIHNyYz1cIiIgKyBpbWdfc3JjICsgIlwiIC8+IjsKLQlpZiAobGluZUJyZWFrKQotCXsKLQkJc3RlcHMgKz0gIjxici8+IjsKLQl9Ci0JCi0JdGhpcy5maWVsZHNbQlNfQ09MX1NURVBTXSA9IHN0ZXBzOwotfTsKLQotCi1XQlNJdGVtSHRtbC5wcm90b3R5cGUuc2V0U3RhdGVzID0gZnVuY3Rpb24ocmVwZWF0YWJsZSwgbXVsdGlPY2N1cmVuY2VzLCBvcHRpb25hbCwgcGxhbm5lZCwgb25nb2luZywgZXZlbnREcml2ZW4pCi17Ci0JaWYgKCByZXBlYXRhYmxlID09ICJ0cnVlIikgewotCQlyZXBlYXRhYmxlID0gIjxpbWcgYWx0PVwiXCIgaGVpZ2h0PVwiMTVcIiB3aWR0aD1cIjIwXCIgc3JjPVwiIiArIHRoaXMucGFyZW50LmltYWdlUGF0aCArICJ0cnVlLmdpZlwiPiI7Ci0JfSBlbHNlIHsKLQkJcmVwZWF0YWJsZSA9ICImbmJzcDsiOwotCX0KLQkKLQlpZiAoIG11bHRpT2NjdXJlbmNlcyA9PSAidHJ1ZSIpIHsKLQkJbXVsdGlPY2N1cmVuY2VzID0gIjxpbWcgYWx0PVwiXCIgaGVpZ2h0PVwiMTVcIiB3aWR0aD1cIjIwXCIgc3JjPVwiIiArIHRoaXMucGFyZW50LmltYWdlUGF0aCArICJ0cnVlLmdpZlwiPiI7Ci0JfSBlbHNlIHsKLQkJbXVsdGlPY2N1cmVuY2VzID0gIiZuYnNwOyI7Ci0JfQotCQotCWlmICggb3B0aW9uYWwgPT0gInRydWUiKSB7Ci0JCW9wdGlvbmFsID0gIjxpbWcgYWx0PVwiXCIgaGVpZ2h0PVwiMTVcIiB3aWR0aD1cIjIwXCIgc3JjPVwiIiArIHRoaXMucGFyZW50LmltYWdlUGF0aCArICJ0cnVlLmdpZlwiPiI7Ci0JfSBlbHNlIHsKLQkJb3B0aW9uYWwgPSAiJm5ic3A7IjsKLQl9Ci0KLQlpZiAoIHBsYW5uZWQgPT0idHJ1ZSIpIHsKLQkJcGxhbm5lZCA9ICI8aW1nIGFsdD1cIlwiIGhlaWdodD1cIjE1XCIgd2lkdGg9XCIyMFwiIHNyYz1cIiIgKyB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAidHJ1ZS5naWZcIj4iOwotCX0gZWxzZSB7Ci0JCXBsYW5uZWQgPSAiJm5ic3A7IjsKLQl9Ci0KLQlpZiAoIG9uZ29pbmcgPT0idHJ1ZSIpIHsKLQkJb25nb2luZyA9ICI8aW1nIGFsdD1cIlwiIGhlaWdodD1cIjE1XCIgd2lkdGg9XCIyMFwiIHNyYz1cIiIgKyB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAidHJ1ZS5naWZcIj4iOwotCX0gZWxzZSB7Ci0JCW9uZ29pbmcgPSAiJm5ic3A7IjsKLQl9Ci0JCi0JaWYgKCBldmVudERyaXZlbiA9PSJ0cnVlIikgewotCQlldmVudERyaXZlbiA9ICI8aW1nIGFsdD1cIlwiIGhlaWdodD1cIjE1XCIgd2lkdGg9XCIyMFwiIHNyYz1cIiIgKyB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAidHJ1ZS5naWZcIj4iOwotCX0gZWxzZSB7Ci0JCWV2ZW50RHJpdmVuID0gIiZuYnNwOyI7Ci0JfQotCQotCQotCXRoaXMuZmllbGRzW0JTX0NPTF9JU19SRVBFQVRBQkxFXSA9IHJlcGVhdGFibGU7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU10gPSBtdWx0aU9jY3VyZW5jZXM7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX0lTX09QVElPTkFMXSA9IG9wdGlvbmFsOwotCXRoaXMuZmllbGRzW0JTX0NPTF9JU19QTEFOTkVEXSA9IHBsYW5uZWQ7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX0lTX09OR09JTkddID0gb25nb2luZzsKLQl0aGlzLmZpZWxkc1tCU19DT0xfSVNfRVZFTlRfRFJJVkVOXSA9IGV2ZW50RHJpdmVuOwotCi19OwotCi0KLVdCU0l0ZW1IdG1sLnByb3RvdHlwZS53cml0ZUhlYWRlciA9IGZ1bmN0aW9uKCkKLXsKLQotCXN0ciA9ICI8dHIgdmFsaWduPVwidG9wXCI+IjsKLQlmb3IgKCBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKyApIHsKLQkJY29sID0gdGhpcy5jb2x1bW5zW2ldOwotCQlzdHIgKz0gIjx0aCBub3dyYXA9XCJub3dyYXBcIj4iICsgY29sWzFdICsgIjwvdGg+IjsKLQl9CQkJCQotCQotCXN0ciArPSAiPC90cj4iOwotCS8vZG9jdW1lbnQud3JpdGUoc3RyKTsJCi0JdGhpcy5zb3VyY2VfaHRtbCArPSBzdHI7Ci19OwotCi0KLVdCU0l0ZW1IdG1sLnByb3RvdHlwZS5nZXRDZWxsSHRtbCA9IGZ1bmN0aW9uKGNvbHVtbkNvdW50KSB7Ci0JY29sID0gdGhpcy5jb2x1bW5zW2NvbHVtbkNvdW50XTsKLQljb2xfaWQgPSBjb2xbMF07Ci0JdGV4dCA9IHRoaXMuZmllbGRzW2NvbF9pZF07Ci0JaWYgKCB0ZXh0ID09ICIiICkgewotCQl0ZXh0ID0gIiZuYnNwOyI7Ci0JfQotCQotCXZhciBzdHIgPSAiPHRkIjsKLQlpZiAoIGNvbHVtbkNvdW50ICUgMiAhPSAwICkgewotCQlzdHIgKz0gIiBiZ2NvbG9yPVwiI2NjY2NjY1wiIjsKLQl9Ci0JCi0JaWYgKCBjb2xfaWQuaW5kZXhPZigiaXNfIikgPj0wIHx8IGNvbF9pZC5pbmRleE9mKCJoYXNfIikgPj0wICkgewkKLQkJc3RyICs9ICIgYWxpZ249XCJjZW50ZXJcIiI7Ci0JfQotCQotCWlmICggY29sX2lkID09IEJTX0NPTF9UWVBFICkgewotCQlzdHIgKz0gIiBub3dyYXA9XCJub3dyYXBcIiI7Ci0JfQotCQotCWlmICggY29sX2lkID09IEJTX0NPTF9QUkVTRU5UQVRJT05fTkFNRSApIHsKLQkJc3RyICs9ICIgd2lkdGg9XCIxMDAlXCI+IiArIHRoaXMuZ2V0VHJlZU5vZGVUYWJsZUh0bWwoCi0JCQl0aGlzLmluZGVudFNpemUsIHRoaXMuaGFzQ2hpbGRyZW4sIAotCQkJdGV4dCwgdGhpcy51cmwsIHRoaXMucmVsUGF0aCk7Ci0JfSBlbHNlIHsKLQkJc3RyICs9ICI+IiArIHRleHQ7Ci0JfQotCQotCXN0ciArPSAiPC90ZD4iOwotCi0JcmV0dXJuIHN0cjsKLQotfTsKLQotV0JTSXRlbUh0bWwucHJvdG90eXBlLndyaXRlUm93ID0gZnVuY3Rpb24oKQotewotCXNyYyA9IAkKLQkiPHRyIGNsYXNzPVwidHJlZU5vZGVcIiBpZD1cIiIgKyB0aGlzLmlkICsgIlwiIHBhcmVudElkPVwiIiArIHRoaXMucGFyZW50SWQgKyAiXCIgcmVsUHJvY2Vzc1BhdGg9XCIiICsgdGhpcy5yZWxQYXRoICsgIlwiIjsKLQotCS8vIGlzIHN1cHByZXNzZWQgZmxhZyBpcyBzZXQgb25seSB3aGVuIGluIGJyb3dzaW5nIG1vZGVsLCBpdCdzIG5vdCBzZXQgaW4gcHVibGlzaGluZyBtb2RlbAotCWlmICggdGhpcy5pc1N1cHJlc3NlZCAhPSBudWxsICYmIHRoaXMuaXNTdXByZXNzZWQgIT0gIiIgJiYgdGhpcy5pc1N1cHJlc3NlZCAhPSB1bmRlZmluZWQpIHsKLQkJc3JjICs9ICIgaXNTdXByZXNzZWQ9XCIiICsgdGhpcy5pc1N1cHJlc3NlZCArICJcIiI7Ci0JfQotCQotCXNyYyArPSAiPiI7Ci0JCi0JZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKysgKSB7Ci0JCXNyYyArPSB0aGlzLmdldENlbGxIdG1sKGkpOwotCX0JCQkJCi0JCi0Jc3JjICs9ICI8L3RyPiI7Ci0KLQkvL2RvY3VtZW50LndyaXRlKHNyYyk7Ci0JdGhpcy5zb3VyY2VfaHRtbCArPSBzcmM7Ci19OwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MTg1YWJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKiByZXNvdXJjZSBmaWxlcyBmb3IgY29udGVudCBwYWdlIGphdmFzY3JpcHQgCi0gKiB0aGlzIGZpbGUgc2hvdWxkIGJlIGxvY2FsaXplZAotKi8KLUNvbnRlbnRQYWdlUmVzb3VyY2UgPSBmdW5jdGlvbigpIHsKLQotCi10aGlzLmV4cGFuZEFsbFRleHQgPSAiRXhwYW5kIEFsbCBTZWN0aW9ucyI7Ci10aGlzLmNvbGxhcHNlQWxsVGV4dCA9ICJDb2xsYXBzZSBBbGwgU2VjdGlvbnMiOwotdGhpcy5iYWNrVG9Ub3BUZXh0ID0gIkJhY2sgdG8gdG9wIjsKLQotdGhpcy5leHBhbmRBbGxTdWJTZWN0aW9uc1RleHQgPSAiRXhwYW5kIEFsbCBTdGVwcyI7Ci10aGlzLmNvbGxhcHNlQWxsU3ViU2VjdGlvbnNUZXh0ID0gIkNvbGxhcHNlIEFsbCBTdGVwcyI7Ci0KLX07CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YmU1MGU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db250ZW50UGFnZVNlY3Rpb24gPSBmdW5jdGlvbigpewotCi10aGlzLmNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQgPSBmYWxzZTsKLXRoaXMuZmlyc3RTZWN0aW9uID0gbnVsbDsKLXRoaXMuZXhwYW5kSW1hZ2UgPSBudWxsOwotdGhpcy5jb2xsYXBzZUltYWdlID0gbnVsbDsKLXRoaXMuZXhwYW5kQWxsSW1hZ2UgPSBudWxsOwotdGhpcy5jb2xsYXBzZUFsbEltYWdlID0gbnVsbDsKLXRoaXMuYmFja1RvVG9wSW1hZ2UgPSBudWxsOwotdGhpcy5zaGltSW1hZ2UgPSBudWxsOwotdGhpcy5zZWN0aW9uQ29sbGFwc2VEaXZzID0gbnVsbDsKLXRoaXMuc2VjdGlvbkNvbGxhcHNlTGlua3MgPSBudWxsOwotCi0vLyB0ZXN0IG1lc3NhZ2UsIAotdGhpcy5iYWNrVG9Ub3BUZXh0ID0gbnVsbDsKLXRoaXMuZXhwYW5kQWxsVGV4dCA9IG51bGw7Ci10aGlzLmNvbGxhcHNlQWxsVGV4dCA9IG51bGw7Ci19OwotCi1Db250ZW50UGFnZVNlY3Rpb24ucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihpbWdQYXRoKSB7Ci0KLQl0aGlzLmJhY2tUb1RvcFRleHQgPSBjb250ZW50UGFnZS5yZXMuYmFja1RvVG9wVGV4dDsKLQl0aGlzLmV4cGFuZEFsbFRleHQgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kQWxsVGV4dDsKLQl0aGlzLmNvbGxhcHNlQWxsVGV4dCA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZUFsbFRleHQ7Ci0KLQl0aGlzLmV4cGFuZEltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2V4cGFuZC5naWYnKTsJCQotCXRoaXMuY29sbGFwc2VJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdjb2xsYXBzZS5naWYnKTsKLQl0aGlzLmV4cGFuZEFsbEltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJyk7CQotCXRoaXMuY29sbGFwc2VBbGxJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdjb2xsYXBzZV9hbGwuZ2lmJyk7Ci0JdGhpcy5iYWNrVG9Ub3BJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdiYWNrX3RvX3RvcC5naWYnKTsKLQl0aGlzLnNoaW1JbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdzaGltLmdpZicpOwotfTsKLQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc2VjdGlvbiBsaW5rcy4KLUNvbnRlbnRQYWdlU2VjdGlvbi5wcm90b3R5cGUuY3JlYXRlU2VjdGlvbkxpbmtzID0gZnVuY3Rpb24odGFnTmFtZSwgY2xhc3NTZWxlY3RvcikgewotCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7Ci0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOwotCQl2YXIgc2VjdGlvbkVsZW1lbnRzID0gbmV3IEFycmF5KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCXZhciB0b3RhbExpbmtzID0gMDsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7Ci0JCQkJc2VjdGlvbkVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXNlY3Rpb25FbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOwotCQl0aGlzLnNlY3Rpb25Db2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7Ci0JCXRoaXMuc2VjdGlvbkNvbGxhcHNlTGlua3MgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7Ci0JCXRoaXMuZmlyc3RTZWN0aW9uID0gc2VjdGlvbkVsZW1lbnRzWzBdOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25FbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBzZWN0aW9uRWxlbWVudHNbaV07Ci0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsKLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsJCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsKLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsKLQkJCQl2YXIgbmV4dEVsZW1lbnQgPSBzZWN0aW9uRWxlbWVudHNbaSArIDFdOwotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsICYmIG5leHRTaWJsaW5nLmNsYXNzTmFtZSAhPSAnY29weXJpZ2h0JykgewotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7Ci0JCQkJCW5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmcubmV4dFNpYmxpbmc7Ci0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsKLQkJCQl9Ci0JCQkJaWYgKHRoaXMuY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCkgewotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0gICAgCQkJfQotICAgIAkJCXRoaXMuc2VjdGlvbkNvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7Ci0gICAgCQkJdGhpcy5jcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJdGhpcy5jcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3Moc2VjdGlvbkVsZW1lbnRzWzBdKTsKLQl9Ci19OwotCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc2VjdGlvbi4KLUNvbnRlbnRQYWdlU2VjdGlvbi5wcm90b3R5cGUuY3JlYXRlQ29sbGFwc2libGVTZWN0aW9uID0gZnVuY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsKLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkgewotCQkvLyBBZGQgYSBzcGFjaW5nIGJldHdlZW4gdGhlIHNlY3Rpb25zLgotCQl2YXIgc2VjdGlvblNlcGFyYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwotCQlzZWN0aW9uU2VwYXJhdG9yLnNyYyA9IHRoaXMuc2hpbUltYWdlOwotCQlzZWN0aW9uU2VwYXJhdG9yLmhlaWdodCA9ICczJzsKLQkJc2VjdGlvblNlcGFyYXRvci5ib3JkZXIgPSAnMCc7Ci0JCXNlY3Rpb25TZXBhcmF0b3IuYWxpZ24gPSAnYWJzbWlkZGxlJzsKLQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzZWN0aW9uU2VwYXJhdG9yLCBlbGVtZW50KTsKLQkJCi0JCS8vIEFkZCBhIGV4cGFuZC9jb2xsYXBzZSBsaW5rIHRvIHRoZSBzZWN0aW9uIGhlYWRpbmcuCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7Ci0JCWxpbmsuaHJlZiA9ICcnOwotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJaWYgKHRoaXMuY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCkgewotCQkJaW1hZ2Uuc3JjID0gdGhpcy5leHBhbmRJbWFnZTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlLnNyYyA9IHRoaXMuY29sbGFwc2VJbWFnZTsKLQkJfQotCQkJCQotCQlpbWFnZS53aWR0aCA9ICcxNyc7Ci0JCWltYWdlLmhlaWdodCA9ICcxNSc7Ci0JCWltYWdlLmJvcmRlciA9ICcwJzsKLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsKLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7Ci0JCXZhciBzZWxmID0gdGhpczsKLQkJbGluay5vbmNsaWNrID0gZnVuY3Rpb24oZXZ0KSB7Ci0JCQkvLyBoZXJlICJ0aGlzIiBpcyB0aGUgdGFyaGV0IGVsZW1lbnQsIGkuZS4gdGhlIElNRwotCQkJLy8gRXhwYW5kcyBvciBjb2xsYXBzZXMgYSBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4KLQkJCWlmICh0aGlzLmNvbGxhcHNlRGl2LnN0eWxlLmRpc3BsYXkgPT0gJycpIHsKLQkJCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotCQkJCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBzZWxmLmV4cGFuZEltYWdlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOwotCQkJCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBzZWxmLmNvbGxhcHNlSW1hZ2U7Ci0JCQl9Ci0JCQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQkJCWV2dC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9OwotCi0JCXRoaXMuc2VjdGlvbkNvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsKLQkJc3Bhbi5hcHBlbmRDaGlsZChsaW5rKTsKLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLSAgICAJCi0JCS8vIEFkZCBhIEJhY2sgVG8gVG9wIGxpbmsgaW4gdGhlIHNlY3Rpb24gaGVhZGluZy4KLQkJdGhpcy5jcmVhdGVCYWNrVG9Ub3BMaW5rKHNpYmxpbmdDb250YWluZXIpOwotCX0KLX07Ci0KLS8vIENyZWF0ZXMgYSBCYWNrIHRvIHRvcCBsaW5rLgotQ29udGVudFBhZ2VTZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVCYWNrVG9Ub3BMaW5rID0gZnVuY3Rpb24oZWxlbWVudCkgewotCXZhciBkaXY7Ci0JCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgewotCQlkaXYuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOwotCQlkaXYuYWxpZ24gPSAncmlnaHQnOwotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJaW1hZ2Uuc3JjID0gdGhpcy5iYWNrVG9Ub3BJbWFnZTsKLQkJaW1hZ2Uud2lkdGggPSAnMTYnOwotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOwotCQlpbWFnZS5ib3JkZXIgPSAnMCc7Ci0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkKLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCWxpbmsuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOwotCQlsaW5rLmhyZWYgPSAnIyc7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOwotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKLQkJc3Bhbi5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7Ci0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5iYWNrVG9Ub3BUZXh0KSk7CQkKLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsKLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOwotCQllbGVtZW50LmFwcGVuZENoaWxkKGRpdik7Ci0JfQotfTsKLQotCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU2VjdGlvbnMgbGlua3MuCi1Db250ZW50UGFnZVNlY3Rpb24ucHJvdG90eXBlLmNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU2VjdGlvbnNMaW5rcyA9IGZ1bmN0aW9uKGZpcnN0RWxlbWVudCkgewotCXZhciBkaXY7Ci0JdmFyIHNlbGYgPSB0aGlzOwotCQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsKLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOwotCQlkaXYuYWxpZ24gPSAncmlnaHQnOwotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJaW1hZ2Uuc3JjID0gdGhpcy5leHBhbmRBbGxJbWFnZTsKLQkJaW1hZ2Uud2lkdGggPSAnMTYnOwotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOwotCQlpbWFnZS5ib3JkZXIgPSAnMCc7Ci0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkKLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7Ci0JCWxpbmsuaHJlZiA9ICcnOwotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsKLQkJbGluay5vbmNsaWNrID0gLyp0aGlzLmV4cGFuZEFsbDsqLyBmdW5jdGlvbihldnQpIHsKLQkJCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuc2VjdGlvbkNvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgewotCQkJIAlzZWxmLnNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOwotCQkJIAlzZWxmLnNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gc2VsZi5jb2xsYXBzZUltYWdlOwotCQkJIH0KLQkJCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQkJIAlldnQucHJldmVudERlZmF1bHQoKTsKLQkJCSB9Ci0JCQkgcmV0dXJuIGZhbHNlOwotCQl9OwotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsKLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLmV4cGFuZEFsbFRleHQpKTsKLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsKLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOwotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7Ci0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7CQkJCQkJCi0JCQotCQlpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwotCQlpbWFnZS5zcmMgPSB0aGlzLmNvbGxhcHNlQWxsSW1hZ2U7Ci0JCWltYWdlLndpZHRoID0gJzE2JzsKLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsKLQkJaW1hZ2UuYm9yZGVyID0gJzAnOwotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOwotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOwotCQlsaW5rLmhyZWYgPSAnIyc7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOwotCQlsaW5rLm9uY2xpY2sgPSAvKnRoaXMuY29sbGFwc2VBbGw7Ki9mdW5jdGlvbihldnQpIHsKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5zZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2VsZi5zZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCQkJc2VsZi5zZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IHNlbGYuZXhwYW5kSW1hZ2U7Ci0JCQl9Ci0JCQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQkJCWV2dC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9OwotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOwotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuY29sbGFwc2VBbGxUZXh0KSk7CQkJCQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOwotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7Ci0JCQotCQkvKgotCQl2YXIgb3ZlcnZpZXdTZXBhcmF0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3ZlcnZpZXdTZXBhcmF0b3IiKTsKLQkJb3ZlcnZpZXdTZXBhcmF0b3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBvdmVydmlld1NlcGFyYXRvcik7Ci0JCSovCi0JCWlmICh0aGlzLmZpcnN0U2VjdGlvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLmZpcnN0U2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIHRoaXMuZmlyc3RTZWN0aW9uKTsKLQkJfQotCX0KLX07Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIwMzEyZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIGRlZmluZSB0aGUgY2xhc3MgaGVyZSBzbyB3ZSBkb24ndCBuZWVkIHRvIGxvYWQgdGhlIGRldGFpbCBpbXBsZW1lbnRhdGlvbnMgCi1Db250ZW50UGFnZVN1YlNlY3Rpb24gPSBmdW5jdGlvbigpIHsKLQotCXRoaXMucGFyZW50ID0gY29udGVudFBhZ2U7Ci0JLy8gYnkgZGVmYXVsdCwgd2UgcmV1c2UgdGhlIGltYWdlcyBmcm9tIHNlY3Rpb24KLQl0aGlzLmV4cGFuZEltYWdlID0gdGhpcy5wYXJlbnQuc2VjdGlvbi5leHBhbmRJbWFnZTsJCQotCXRoaXMuY29sbGFwc2VJbWFnZSA9IHRoaXMucGFyZW50LnNlY3Rpb24uY29sbGFwc2VJbWFnZTsKLQl0aGlzLmV4cGFuZEFsbEltYWdlID0gdGhpcy5wYXJlbnQuc2VjdGlvbi5leHBhbmRBbGxJbWFnZTsJCi0JdGhpcy5jb2xsYXBzZUFsbEltYWdlID0gdGhpcy5wYXJlbnQuc2VjdGlvbi5jb2xsYXBzZUFsbEltYWdlOwotCi0JLy8gYW5kIHVzZSB0aGUgZGVmYXVsdCB0ZXN0LCBvcmVycmlkZSB0aGlzIGFzIG5lZWRlZAotCXRoaXMuZXhwYW5kQWxsVGV4dCA9IGNvbnRlbnRQYWdlLnJlcy5leHBhbmRBbGxTdWJTZWN0aW9uc1RleHQ7Ci0JdGhpcy5jb2xsYXBzZUFsbFRleHQgPSBjb250ZW50UGFnZS5yZXMuY29sbGFwc2VBbGxTdWJTZWN0aW9uc1RleHQ7CQotCi0JdGhpcy5jb2xsYXBzZVN0ZXBzQnlEZWZhdWx0ID0gdHJ1ZTsKLQl0aGlzLmZpcnN0U3RlcFNlY3Rpb24gPSBudWxsOwotCi0JdGhpcy5zdGVwQ29sbGFwc2VEaXZzID0gbnVsbDsKLQl0aGlzLnN0ZXBDb2xsYXBzZUxpbmtzID0gbnVsbDsKLQkJCi19OwotCi0vLyBDcmVhdGVzIHRoZSBjb2xsYXBzaWJsZSBzdGVwIHNlY3Rpb24gbGlua3MuCi1Db250ZW50UGFnZVN1YlNlY3Rpb24ucHJvdG90eXBlLmNyZWF0ZVN0ZXBMaW5rcyA9IGZ1bmN0aW9uKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IpIHsKLQkKLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsKLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7Ci0JCWlmIChlbGVtZW50cy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQl2YXIgc3RlcEVsZW1lbnRzID0gbmV3IEFycmF5KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCXZhciB0b3RhbExpbmtzID0gMDsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7Ci0JCQkJc3RlcEVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50OwotCQkJfQotCQl9Ci0JCWlmICh0b3RhbExpbmtzID09IDApIHJldHVybjsKLQkJc3RlcEVsZW1lbnRzLmxlbmd0aCA9IHRvdGFsTGlua3M7Ci0JCXRoaXMuc3RlcENvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsKLQkJdGhpcy5zdGVwQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsKLQkJdGhpcy5maXJzdFN0ZXBTZWN0aW9uID0gc3RlcEVsZW1lbnRzWzBdOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBzdGVwRWxlbWVudHNbaV07Ci0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsKLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsKLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOwotCQkJCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2libGluZ0NvbnRhaW5lciwgbmV4dFNpYmxpbmcpOwotCQkJCXZhciBuZXh0RWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpICsgMV07Ci0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwpIHsKLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOwotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOwotCQkJCQlzaWJsaW5nQ29udGFpbmVyLmFwcGVuZENoaWxkKHRvTW92ZSk7Ci0JCQkJfQotCQkJCWlmICh0aGlzLmNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsKLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotICAgIAkJCX0KLSAgICAJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0gICAgCQkJdGhpcy5zdGVwQ29sbGFwc2VEaXZzW2ldID0gc2libGluZ0NvbnRhaW5lcjsKLSAgICAJCQl0aGlzLmNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJdGhpcy5jcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3Moc3RlcEVsZW1lbnRzWzBdKTsKLQl9Ci19OwotCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uLgotQ29udGVudFBhZ2VTdWJTZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVDb2xsYXBzaWJsZVN0ZXBTZWN0aW9uID0gZnVuY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsKLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkgewotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCWxpbmsuY29sbGFwc2VEaXYgPSBzaWJsaW5nQ29udGFpbmVyOwotCQlsaW5rLmhyZWYgPSAnJzsKLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0JCWlmICh0aGlzLmNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsKLQkJCWltYWdlLnNyYyA9IHRoaXMuZXhwYW5kSW1hZ2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZS5zcmMgPSB0aGlzLmNvbGxhcHNlSW1hZ2U7Ci0JCX0KLQkJaW1hZ2Uud2lkdGggPSAnMTcnOwotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOwotCQlpbWFnZS5ib3JkZXIgPSAnMCc7Ci0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOwotCQkKLQkJdmFyIHNlbGYgPSB0aGlzOwotCQlsaW5rLm9uY2xpY2sgPSAvKnRoaXMuZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbjsqL2Z1bmN0aW9uKGV2dCkgewotCQkJaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgewotCQkJCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IHNlbGYuZXhwYW5kSW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJyc7Ci0JCQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IHNlbGYuY29sbGFwc2VJbWFnZTsKLQkJCX0KLQkJCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7Ci0JCQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX07Ci0JCXRoaXMuc3RlcENvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsKLQkJc3Bhbi5hcHBlbmRDaGlsZChsaW5rKTsKLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLQl9Ci19OwotCi0JCQkJCQotLy8gQ3JlYXRlcyB0aGUgRXhwYW5kIEFsbCBhbmQgQ29sbGFwc2UgQWxsIFN0ZXBzIGxpbmtzLgotQ29udGVudFBhZ2VTdWJTZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3MgPSBmdW5jdGlvbihmaXJzdEVsZW1lbnQpIHsKLQl2YXIgZGl2OwotCXZhciBzZWxmID0gdGhpczsKLQkKLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7Ci0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsKLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsJCQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJaW1hZ2Uuc3JjID0gdGhpcy5leHBhbmRBbGxJbWFnZTsKLQkJaW1hZ2Uud2lkdGggPSAnMTYnOwotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOwotCQlpbWFnZS5ib3JkZXIgPSAnMCc7Ci0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOwotCQlsaW5rLmhyZWYgPSAnJzsKLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7Ci0JCWxpbmsub25jbGljayA9IC8qdGhpcy5leHBhbmRBbGxTdGVwczsqL2Z1bmN0aW9uKGV2dCkgewotCQkJIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5zdGVwQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkgCXNlbGYuc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7Ci0JCQkgCXNlbGYuc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBzZWxmLmNvbGxhcHNlSW1hZ2U7Ci0JCQkgfQotCQkJIGlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7Ci0JCQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJIH0KLQkJCSByZXR1cm4gZmFsc2U7Ci0JCX07Ci0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOwotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuZXhwYW5kQWxsVGV4dCkpOwotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOwotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7Ci0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLQkJCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0JCWltYWdlLnNyYyA9IHRoaXMuY29sbGFwc2VBbGxJbWFnZTsKLQkJaW1hZ2Uud2lkdGggPSAnMTYnOwotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOwotCQlpbWFnZS5ib3JkZXIgPSAnMCc7Ci0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7Ci0JCWxpbmsuaHJlZiA9ICcnOwotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsKLQkJbGluay5vbmNsaWNrID0gLyp0aGlzLmNvbGxhcHNlQWxsU3RlcHM7Ki9mdW5jdGlvbihldnQpIHsKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5zdGVwQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2VsZi5zdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCQkJc2VsZi5zdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IHNlbGYuZXhwYW5kSW1hZ2U7Ci0JCQl9Ci0JCQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQkJCWV2dC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9OwotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOwotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuY29sbGFwc2VBbGxUZXh0KSk7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7Ci0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsKLQkJCi0JCWlmICh0aGlzLmZpcnN0U3RlcFNlY3Rpb24pIHsKLQkJCXRoaXMuZmlyc3RTdGVwU2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIHRoaXMuZmlyc3RTdGVwU2VjdGlvbik7Ci0JCX0KLQl9Ci19OwotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzZTkzZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotCi0vLyBkZWZpbmUgdGhlIGNsYXNzIGhlcmUgc28gd2UgZG9uJ3QgbmVlZCB0byBsb2FkIHRoZSBkZXRhaWwgaW1wbGVtZW50YXRpb25zIAotZnVuY3Rpb24gUHJvY2Vzc0VsZW1lbnRQYWdlKCkgewotCi0JdGhpcy5wYXJfcHJvYyA9IG51bGw7Ci0JdGhpcy5wYXJfcGF0aCA9IG51bGw7Ci0KLQkvLyBpbWFnZXMgZm9yIHRoZSBhY3Rpdml0eSwgZ2VuZXJhdGVkIGR5bmFtaWNhbGx5IHdoZW4gcHVibGlzaGluZwotCXRoaXMuaW1hZ2VGaWxlcyA9IFtdOwotCQotCS8vIHN1cHByZXNzZWQgaXRlbXMgZm9yIHRoZSBhY3Rpdml0eSwgZ2VuZXJhdGVkIGR5bmFtaWNhbGx5IHdoZW4gcHVibGlzaGluZwotCXRoaXMuc3VwcHJlc3NlZEl0ZW1zID0gW107Ci0JCi0JLy8gZWxlbWVudCB1cmxzIGZvciB0aGUgYWN0aXZpdHksIGdlbmVyYXRlZCBkeW5hbWljYWxseSB3aGVuIHB1Ymxpc2hpbmcKLQl0aGlzLmVsZW1lbnRVcmxzID0gW107Ci0JCQotCXRoaXMudHJlZVRhYmxlID0gbnVsbDsKLQkKLX07Ci0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKGhhc1RyZWUpIHsKLQotCXZhciBwYXJhbWV0ZXJzID0gY29udGVudFBhZ2UuZ2V0VXJsUGFyYW1ldGVycyhjb250ZW50UGFnZS5xdWVyeVN0ci5zdWJzdHJpbmcoMSkpOwotCXRoaXMucGFyX3Byb2MgPSBwYXJhbWV0ZXJzWyJwcm9jIl07Ci0JdGhpcy5wYXJfcGF0aCA9IHBhcmFtZXRlcnNbInBhdGgiXTsKLQkKLQlpZiAoIHRoaXMucGFyX3Byb2MgPT0gbnVsbCB8fCB0aGlzLnBhcl9wYXRoID09IG51bGwgKSB7Ci0JCXBhcmFtZXRlcnMgPSBjb250ZW50UGFnZS5nZXRVcmxQYXJhbWV0ZXJzKGNvbnRlbnRQYWdlLmRlZmF1bHRRdWVyeVN0ci5zdWJzdHJpbmcoMSkpOwotCQl0aGlzLnBhcl9wcm9jID0gcGFyYW1ldGVyc1sicHJvYyJdOwotCQl0aGlzLnBhcl9wYXRoID0gcGFyYW1ldGVyc1sicGF0aCJdOwotCX0JCi0JCi0JaWYgKCBoYXNUcmVlKSB7Ci0JCXRoaXMuY3JlYXRlVHJlZShjb250ZW50UGFnZS5pbWdQYXRoKTsKLQl9Ci19OwotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLm9ubG9hZCA9IGZ1bmN0aW9uKCkgewotCXRoaXMuYnVpbGRQcm9jZXNzRWxlbWVudEJyZWFkQ3J1bWIobG9jYXRpb24uaHJlZiwgdGhpcy5iYWNrUGF0aCk7Ci0JdGhpcy5maXhNYXBVcmxzKCk7Ci0JaWYgKCB0aGlzLnRyZWVUYWJsZSAhPSBudWxsICYmIHRoaXMudHJlZVRhYmxlLmNyZWF0ZVRyZWUpIHsKLQkJdGhpcy50cmVlVGFibGUuY3JlYXRlVHJlZSgnZGl2JywgJ3RyZWVOb2RlJyk7Ci0JfQotCQotfTsKLQotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmNyZWF0ZVRyZWUgPSBmdW5jdGlvbihpbWdQYXRoKSB7Ci0JdGhpcy50cmVlVGFibGUgPSBuZXcgQWN0aXZpdHlUcmVlVGFibGUodGhpcyk7Ci0JdGhpcy50cmVlVGFibGUuaW5pdGlhbGl6ZShpbWdQYXRoKTsKLX07Ci0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuZml4VGFiVXJsID0gZnVuY3Rpb24oYSkKLXsKLQlpZiAoYSA9PSBudWxsIHx8ICBxdWVyeVN0ciA9PSBudWxsICkgcmV0dXJuOwotCXZhciB1cmwgPSBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpICsgcXVlcnlTdHI7Ci0JCi0JYS5zZXRBdHRyaWJ1dGUoImhyZWYiLCB1cmwpOwotfQotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmZpeE1hcFVybHMgPSBmdW5jdGlvbigpIHsKLQotCS8vIGZpeCB0aGUgbWFwIGFyZWEgdXJsCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7Ci0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBUkVBIik7Ci0JCWlmICggZWxlbWVudHMgIT0gbnVsbCApIHsKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCXZhciB1cmwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaHJlZiIpOwotCQkJCXZhciByZWxQYXRoID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInJlbFBhdGgiKTsKLQkJCQlpZiAoIHVybCAhPSBudWxsICYmIHJlbFBhdGggIT0gbnVsbCApIHsKLQkJCQkJdXJsID0gdGhpcy5nZXRBY3Rpdml0eUl0ZW1VcmwodXJsLCB0aGlzLnBhcl9wcm9jLCB0aGlzLnBhcl9wYXRoLCByZWxQYXRoKTsKLQkJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoImhyZWYiLCB1cmwpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JLy8gZml4IHRoZSBkaWFncmFtIGltZyB1cmxzCi0JdmFyIGRpYWdyYW1UeXBlID0gIkFjdGl2aXR5IjsgLy8gbm8gdHJhbnN0YXRpb24hCi0JdmFyIGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGlhZ3JhbV8iICsgZGlhZ3JhbVR5cGUpOwotCWlmICggZSAhPSBudWxsICkgewotCQl2YXIgdXJsID0gdGhpcy5nZXREaWFncmFtSW1hZ2VVcmwodGhpcy5wYXJfcHJvYywgdGhpcy5wYXJfcGF0aCwgZGlhZ3JhbVR5cGUpOwotCQlpZiAoIHVybCAhPSBudWxsICkgewotCQkJZS5zcmMgPSB1cmw7Ci0JCX0KLQl9Ci0JCi0JZGlhZ3JhbVR5cGUgPSAiQWN0aXZpdHlEZXRhaWwiOyAvLyBubyB0cmFuc3RhdGlvbiEKLQllID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRpYWdyYW1fIiArIGRpYWdyYW1UeXBlKTsKLQkJaWYgKCBlICE9IG51bGwgKSB7Ci0JCQl2YXIgdXJsID0gdGhpcy5nZXREaWFncmFtSW1hZ2VVcmwodGhpcy5wYXJfcHJvYywgdGhpcy5wYXJfcGF0aCwgZGlhZ3JhbVR5cGUpOwotCQkJaWYgKCB1cmwgIT0gbnVsbCApIHsKLQkJCQllLnNyYyA9IHVybDsKLQkJCX0KLQl9Ci19Ci0KLQotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmdldEFjdGl2aXR5SXRlbVVybCA9IGZ1bmN0aW9uKHVybCwgcHJvY2VzcywgZWxlbWVudFByb2Nlc3NQYXRoLCByZWxQcm9jZXNzUGF0aCkKLXsKLQlxdWVyeVN0cmluZyA9ICI/cHJvYz0iICsgcHJvY2VzcyArICImcGF0aD0iICsgZWxlbWVudFByb2Nlc3NQYXRoICsgcmVsUHJvY2Vzc1BhdGg7Ci0JcmV0dXJuIGNvbnRlbnRQYWdlLnJlc29sdmVVcmwodXJsKSArIHF1ZXJ5U3RyaW5nOwotCQotfTsKLQotUHJvY2Vzc0VsZW1lbnRQYWdlLnByb3RvdHlwZS5nZXREaWFncmFtSW1hZ2VVcmwgPSBmdW5jdGlvbihwcm9jZXNzLCBlbGVtZW50UHJvY2Vzc1BhdGgsIGRpYWdyYW1UeXBlKQotewotCS8vIGdldCB0aGUgZGlhZ3JhbSBpbWFnZSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcGF0aCBhbmQgcHJvY2VzcwotCS8vIHJldHV0bnMgbnVsbCBpZiBub3RpbmcKLQkvLyBkaWFncmFtIHR5cGUgaXMgQWN0aXZpdHksIEFjdGl2aXR5RGV0YWlsLCAKLQkvL2FsZXJ0KCJnZXQgIiArIGRpYWdyYW1UeXBlICsgIiBkaWFncmFtIGZvciAiICsgZWxlbWVudFByb2Nlc3NQYXRoKTsKLQlyZXR1cm4gY29udGVudFBhZ2UucmVzb2x2ZVVybCh0aGlzLmltYWdlRmlsZXNbZWxlbWVudFByb2Nlc3NQYXRoK2RpYWdyYW1UeXBlXSk7Ci19OwotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmlzU3VwcHJlc3NlZCA9IGZ1bmN0aW9uKHByb2Nlc3MsIGVsZW1lbnRQcm9jZXNzUGF0aCkKLXsKLQlmbGFnID0gKHRoaXMuc3VwcHJlc3NlZEl0ZW1zW2VsZW1lbnRQcm9jZXNzUGF0aF0gPT0gdHJ1ZSk7Ci0JLy9pZiAoIGZsYWcgKSBhbGVydCgiZ290IG9uZTogIiArIGVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCQotCXJldHVybiBmbGFnOwotfTsKLQotUHJvY2Vzc0VsZW1lbnRQYWdlLnByb3RvdHlwZS5idWlsZFRlYW1UcmVlID0gZnVuY3Rpb24odGVhbVRyZWUpIHsJCi0JCi0JdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlYW1UcmVlIik7Ci0JaWYgKCBlbCA9PSBudWxsICkgcmV0dXJuOwotCQotCWlmICggdGVhbVRyZWUgPT0gbnVsbCB8fCB0ZWFtVHJlZS5sZW5ndGggPT0gMCApIHsKLQkJcmV0dXJuOwotCX0KLQkKLQl0ZWFtVHJlZVswXVswXSA9IHRlYW1UcmVlWzBdWzBdLnJlcGxhY2UoLyhcJ3xcIikvZywgIlxcJDEiKTsKLQotCXZhciB0ZWFtQnVmZmVyID0gIiI7Ci0JZm9yICggdmFyIGkgPSAwOyBpIDwgdGVhbVRyZWUubGVuZ3RoOyBpKysgKSB7Ci0KLQkJaWYgKCAhdGhpcy5pc1RlYW1TdXBwcmVzc2VkKHRlYW1UcmVlW2ldKSApIHsKLQkJCXRlYW1CdWZmZXIgKz0gIjxkaXYgY2xhc3M9XCJ0ZWFtU3RydWN0dXJlXCIgYWxpZ249XCJsZWZ0XCI+IjsKLQkJCXRlYW1CdWZmZXIgKz0gdGhpcy5nZXRUZWFtVHJlZUh0bWwodGVhbVRyZWVbaV0pOwotCQkJdGVhbUJ1ZmZlciArPSAiPC9kaXY+PGJyLz4iOwotCQl9Ci0KLQl9Ci0JCi0JLy9hbGVydCh0ZWFtQnVmZmVyKTsKLQkvL2RvY3VtZW50LndyaXRlKHRlYW1CdWZmZXIpOwotCWVsLmlubmVySFRNTCA9IHRlYW1CdWZmZXI7Ci19OwotCi0KLS8vIGZvcm1hdCBpcyBbdXJsLCB0aXRsZSwgcmVsUGF0aCwgc3VwcHJlc3NlZF0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuZ2V0VGVhbVRyZWVIdG1sID0gZnVuY3Rpb24odGVhbVRyZWUpIHsKLQotCWlmICggdGVhbVRyZWUgPT0gbnVsbCB8fCB0ZWFtVHJlZS5sZW5ndGggPCA0KSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQl2YXIgdXJsID0gdGVhbVRyZWVbMF07Ci0JdmFyIHRpdGxlID0gdGVhbVRyZWVbMV07Ci0JdmFyIHJlbFBhdGggPSB0ZWFtVHJlZVsyXTsKLQkKLQl1cmwgPSB0aGlzLmdldEFjdGl2aXR5SXRlbVVybCh1cmwsIHRoaXMucGFyX3Byb2MsIHRoaXMucGFyX3BhdGgsIHJlbFBhdGgpOwotCQotCXZhciB0ZWFtQnVmZmVyID0gIjxhIGhyZWY9XCIiICsgdXJsICsgIlwiPiIgKyB0aXRsZSArICI8L2E+IjsKLQkJCi0JaWYgKCB0ZWFtVHJlZS5sZW5ndGggPiA0ICYmIHRlYW1UcmVlWzRdICE9IG51bGwgJiYgdGVhbVRyZWVbNF0gIT0gIiIgJiYgdGVhbVRyZWVbNF0gIT0gdW5kZWZpbmVkICkgewotCQl0ZWFtQnVmZmVyICs9ICI8dWw+IjsKLQkJZm9yICggdmFyIGkgPSA0OyBpIDwgdGVhbVRyZWUubGVuZ3RoOyBpKysgKSB7Ci0JCQlpZiAodHlwZW9mIHRlYW1UcmVlW2ldID09ICJvYmplY3QiICYmICF0aGlzLmlzVGVhbVN1cHByZXNzZWQodGVhbVRyZWVbaV0pICkgewotCi0JCQkJdGVhbUJ1ZmZlciArPSAiPGxpPiI7Ci0JCQkJdGVhbUJ1ZmZlciArPSB0aGlzLmdldFRlYW1UcmVlSHRtbCh0ZWFtVHJlZVtpXSk7Ci0JCQkJdGVhbUJ1ZmZlciArPSAiPC9saT4iOwotCQkJfQotCQl9Ci0JCXRlYW1CdWZmZXIgKz0gIjwvdWw+IjsKLQl9Ci0KLQlyZXR1cm4gdGVhbUJ1ZmZlcjsKLX07Ci0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuaXNUZWFtU3VwcHJlc3NlZCA9IGZ1bmN0aW9uKHRlYW1UcmVlKSB7Ci0KLQlpZiAoIHRlYW1UcmVlID09IG51bGwgfHwgdGVhbVRyZWUubGVuZ3RoIDwgNCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JdmFyIHJlbFBhdGggPSB0ZWFtVHJlZVsyXTsKLQl2YXIgc3VwID0gdGVhbVRyZWVbM107Ci0KLQlpZiAoIHN1cCA9PSAiIiApIHsKLQkJcmV0dXJuIHRoaXMuaXNTdXBwcmVzc2VkKHRoaXMucGFyX3Byb2MsIHRoaXMucGFyX3BhdGggKyByZWxQYXRoKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gKHN1cCA9PSAidHJ1ZSIpOwotCX0KLQkKLX07Ci0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuYnVpbGRQcm9jZXNzRWxlbWVudEJyZWFkQ3J1bWIgPSBmdW5jdGlvbih1cmwpIHsKLQotCXZhciBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnJlYWRjcnVtYnMiKTsKLQlpZiAoIGRpdiA9PSBudWxsICkgcmV0dXJuOwotCi0JdmFyIHZpZXdGcmFtZSA9IGNvbnRlbnRQYWdlLmdldFZpZXdGcmFtZSgpOwotCWlmICggdmlld0ZyYW1lID09IG51bGwgKSB7Ci0JCXJldHVybjsKLQl9Ci0JCQotCXZhciBwYXRocyA9IHRoaXMucGFyX3BhdGguc3BsaXQoIiwiKTsKLQkKLQl2YXIgaGFzQXBwID0gKGNvbnRlbnRQYWdlLmdldEFwcCgpICE9IG51bGwpOwotCQotCS8vIHRoZSBmaXJzdCBwYXRoIGlzIHRoZSBwcm9jZXNzIGd1aWQKLQl2YXIgaWQgPSBwYXRoc1swXTsKLQl2YXIgbm9kZUluZm8gPSBudWxsOwotCWlmICggaGFzQXBwICkgeyAKLQkJbm9kZUluZm8gPSB2aWV3RnJhbWUuZ2V0Tm9kZUluZm8oaWQpOwotCX0KLQkKLQlpZiAoIGhhc0FwcCAmJiBub2RlSW5mbyAhPSBudWxsKSB7Ci0JCS8vIHJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCBzaW5jZSBpdCdzIHRoZSB2aWV3IG5vZGUKLQkJcGF0aHMuc2hpZnQoKTsKLQotCQl2YXIgc2VsZiA9IHRoaXM7Ci0JCXZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKGJjcykgewotCQkJc2VsZi5fc2hvd1Byb2Nlc3NFbGVtZW50QnJlYWRDcnVtYihkaXYsIGJjcywgdXJsKTsKLQkJfTsKLQkJdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzQnlQYXRoKG5vZGVJbmZvLCBwYXRocywgY2FsbGJhY2spOwotCX0gZWxzZSB7Ci0JCi0JCXZhciBiY3MgPSB2aWV3RnJhbWUuZ2V0QnJlYWRjcnVtYnNCeVBhdGgocGF0aHMpOwotCQl0aGlzLl9zaG93UHJvY2Vzc0VsZW1lbnRCcmVhZENydW1iKGRpdiwgYmNzLCB1cmwpOwotCX0KLQkKLQotfTsKLQotUHJvY2Vzc0VsZW1lbnRQYWdlLnByb3RvdHlwZS5fc2hvd1Byb2Nlc3NFbGVtZW50QnJlYWRDcnVtYiA9IGZ1bmN0aW9uKGRpdiwgYmNzLCB1cmwpIHsKLQl2YXIgdmlld0ZyYW1lID0gY29udGVudFBhZ2UuZ2V0Vmlld0ZyYW1lKCk7Ci0JaWYgKHZpZXdGcmFtZSA9PSBudWxsIHx8ICF2aWV3RnJhbWUuZ2V0QnJlYWRjcnVtYnMgKSB7Ci0JCXJldHVybjsKLQl9Ci0JCi0JdmFyIGxvY2FsQmNzID0gW107Ci0JdmFyIGNvdW50ID0gMDsKLQl2YXIgbGlua3NUZXh0ID0gIiI7Ci0JdmFyIHBhdGhzID0gdGhpcy5wYXJfcGF0aC5zcGxpdCgiLCIpOwotCXZhciBwYXRoID0gdGhpcy5wYXJfcGF0aDsKLQkKLQl2YXIgaGFzQXBwID0gKGNvbnRlbnRQYWdlLmdldEFwcCgpICE9IG51bGwpOwotCS8vYWxlcnQoImFwcDoiICsgaGFzQXBwKTsKLQl2YXIgYmFzZVVybCA9IG51bGw7Ci0JaWYgKCBoYXNBcHAgKSB7Ci0JCWJhc2VVcmwgPSBjb250ZW50UGFnZS5nZXRBcHAoKS5nZXRCYXNlVXJsKCk7Ci0JfSBlbHNlIHsJCi0JCWJhc2VVcmwgPSB2aWV3RnJhbWUuZ2V0QmFzZVVybCgpOwotCX0KLQkKLQl2YXIgbGFzdEJjc0lkID0gbnVsbDsKLQlpZiAoIGJjcyA9PSBudWxsICkgewotCQliY3MgPSBbXTsKLQl9IGVsc2UgaWYgKCBiY3MubGVuZ3RoID4gMCApIHsKLQkJbGFzdEJjc0lkID0gYmNzW2Jjcy5sZW5ndGgtMV0uaWQ7Ci0JfQotCQotCQotCWZvciAodmFyIGkgPSBwYXRocy5sZW5ndGgtMTsgaSA+PTA7IGktLSkgewotCQl2YXIgZ3VpZCA9IHBhdGhzW2ldOwotCi0JCXZhciBpdGVtX3RleHQgPSAiIjsKLQkJdmFyIGl0ZW1fdXJsID0gIiI7Ci0JCQotCQl2YXIgaXRlbSA9IHRoaXMuZWxlbWVudFVybHNbZ3VpZF07Ci0JCWlmICggaXRlbSAhPSBudWxsICkgewotCQkJaXRlbV90ZXh0ID0gaXRlbVswXTsKLQkJCWl0ZW1fdXJsID0gYmFzZVVybCArIGl0ZW1bMV07Ci0KLQkJCS8vIGdldCB0aGUgdXJsIHdpdGggbm8gYmFjayBwYXRoLCB0aGVuIGNvbnZlciB0byBhIGZ1bGwgdXJsCQkJCi0JCQlpdGVtX3VybCA9IHRoaXMuZ2V0QWN0aXZpdHlJdGVtVXJsKGl0ZW1fdXJsLCB0aGlzLnBhcl9wcm9jLCBwYXRoLCAnJyk7Ci0JCQkvLyBnZXQgdGhlIGxhc3QgdHJlZS1ub2RlIGJyZWFkY3J1bWJzCi0JCQkvLyBwcm9jZXNzIHRoaXMgYmVmb3JlIHRoZSBpdGVtX3VybCBpcyBzZXQKLQkJCS8vYWxlcnQoInZpZXdGcmFtZS5nZXRCcmVhZGNydW1iczogIiArIHZpZXdGcmFtZS5nZXRCcmVhZGNydW1icyk7Ci0JCQlpZiAoIGd1aWQgPT0gbGFzdEJjc0lkICkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQlsb2NhbEJjc1tjb3VudCsrXSA9IHtpZDogZ3VpZCwgdXJsOiBpdGVtX3VybCwgdGl0bGU6IGl0ZW1fdGV4dH07CQkJCi0JCX0KLQkJCi0JCS8vIHRyaW0gdGhlIHBhdGgKLQkJdmFyIHggPSBwYXRoLmluZGV4T2YoIiwiICsgZ3VpZCk7Ci0JCWlmICggeCA+IDAgKSB7Ci0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgeCk7Ci0JCX0KLQl9Ci0KLQlpZiAoIGxvY2FsQmNzLmxlbmd0aCA+IDAgKSB7Ci0JCS8vIG9yZGVyIGl0IHJpZ2h0Ci0JCWxvY2FsQmNzID0gbG9jYWxCY3MucmV2ZXJzZSgpOwotCQlpZiAoIGJjcyA9PSBudWxsICkgIGJjcyA9IFtdOwkJCi0JCXZhciBjb3VudCA9IGJjcy5sZW5ndGg7Ci0JCWZvciAodmFyIGkgPSAwOyBpIDwgbG9jYWxCY3MubGVuZ3RoOyBpKyspIHsKLQkJCWJjc1tjb3VudCtpXSA9IGxvY2FsQmNzW2ldOwotCQl9Ci0JfQotCQotCWlmICggYmNzICE9IG51bGwgJiYgYmNzLmxlbmd0aCA+IDAgKSB7Ci0JCWNvbnRlbnRQYWdlLnNob3dCcmVhZGNydW1ucyhkaXYsIGJjcyk7Ci0JfQotCQotfTsKLQotCi0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuZ2V0UHJvY2Vzc0VsZW1lbnRMaW5rSHRtbEZyb21JZCA9IGZ1bmN0aW9uKGd1aWQsIGVsZW1lbnRQYXRoLCBiYWNrUGF0aCkgewotCi0JdmFyIHN0ciA9ICIiOwotCXZhciBpdGVtID0gdGhpcy5lbGVtZW50VXJsc1tndWlkXTsKLQlpZiAoIGl0ZW0gIT0gbnVsbCApIHsKLQkJdmFyIHRleHQgPSBpdGVtWzBdOwotCQl2YXIgdXJsID0gYmFja1BhdGggKyBpdGVtWzFdOwotCQl1cmwgPSB0aGlzLmdldEFjdGl2aXR5SXRlbVVybCh1cmwsIHRoaXMucGFyX3Byb2MsIGVsZW1lbnRQYXRoLCAnJyk7Ci0JCQotCQkvLyBlc2NhcGUgdGhlIHF1b3RlcwotCQl1cmwgPSB1cmwucmVwbGFjZSgvJy9nLCAiXFwnIik7Ci0JCXVybCA9IHVybC5yZXBsYWNlKC9cIi9nLCAiXFxcIiIpOwotCQkJCi0JCQkKLQkJc3RyID0gIjxhIGhyZWY9XCIiICsgdXJsICsgIlwiPiIgKyB0ZXh0ICsgIjwvYT4iOwotCX0KLQotCQotCXJldHVybiBzdHI7Ci19OwotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9jb250ZW50UGFnZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTU0ZDIyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL2NvbnRlbnRQYWdlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUaGlzIHRlbXBvcmFyeSBmdW5jdGlvbiBoZWxwcyB0byByZXNvbHZlIEphdmFzY3JpcHQgZXJyb3JzIGluIHRoZSBtaWdyYXRlZCBSVVAKLS8vIGNvbnRlbnQgcGFnZXMuIEl0IHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZSBjb3JyZXNwb25kaW5nIC5qcyBmaWxlcyBhcmUgYmVpbmcKLS8vIG1pZ3JhdGVkIGFsb25nIHdpdGggdGhlIEhUTUwgY29udGVudCBwYWdlcy4KLWZ1bmN0aW9uIFJlZmVyZW5jZUhlbHBUb3BpYyAodG9waWNOYW1lLCBib29rICwgZmlsZU5hbWUpIHsKLSAgIC8vZG9jdW1lbnQud3JpdGUoIjxpPiIrIHRvcGljTmFtZSArICI8XC9pPiIpOwotfTsKLQotCi12YXIgY29udGVudFBhZ2UgPSB7Ci0KLQliYWNrUGF0aDogbnVsbCwKLQlpbWdQYXRoOiBudWxsLAotCWRlZmF1bHRRdWVyeVN0cjogbnVsbCwKLQlxdWVyeVN0cjogbnVsbCwKLQlpc1Byb2Nlc3NQYWdlOiBmYWxzZSwKLQlub2RlSW5mbzogbnVsbCwKLQkKLQkvLyBkZWZpbmUgcmVzb3VyY2UgZmlsZQotCXJlcyA6IG5ldyBDb250ZW50UGFnZVJlc291cmNlKCksCi0JCi0JLy8gZGVmaW5lIGFjdGl2aXR5IGxheW91dCwgbmVlZCB0byBjcmVhdGUgdGhpcyBhcyBhIHBsYWNlIGhvbGRlciAKLQkvLyBzbyB0aGF0IHRoZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgZGF0YSBjYW4gYmUgbG9hZGVkCi0JcHJvY2Vzc1BhZ2U6ICggdHlwZW9mIFByb2Nlc3NFbGVtZW50UGFnZSA9PSAidW5kZWZpbmVkIiApID8gbnVsbCA6IG5ldyBQcm9jZXNzRWxlbWVudFBhZ2UoKSwKLQkKLQkvLyBkZWZpbmUgc2VjdGlvbgotCXNlY3Rpb246IG5ldyBDb250ZW50UGFnZVNlY3Rpb24oKSwKLQkKLQkvLyBkZWZpbmUgc3ViLXNlY3Rpb24KLQlzdWJTZWN0aW9uOiBudWxsLAotCQotCQotCS8vIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIHRoZSBwYWdlIGlzIGxvYWRlZAotCS8vIHRoaXMgaXMgdXNlZCB0byBpbml0aWFsaXplIHNvbWUgcGFyYW1ldGVycyBiZWZvcmUgdGhlIHBhZ2UgY29udGVudCBpcyBwcm9jZXNzZWQKLQkvLyBmb3IgZXhhbXBsZSwgaWYgdGhlIGNvbnRlbnQgbmVlZHMgdG8gdXNlIHNvbWUgcGFyYW1ldGVycyBpbnNpZGUgdGhlIGNvbnRlbnQKLQkvLyB0aGlzIGFwcHJvYWNoIGlzIG5vdCByZWNvbW1lbnRlZCBidXQga2VlcCBoZXJlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0JcHJlbG9hZDogZnVuY3Rpb24oaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCBkZWZhdWx0UXVlcnlTdHIsIGhhc1N1YlNlY3Rpb24sIGlzUHJvY2Vzc1BhZ2UsIGhhc1RyZWUpIHsKLQkJdGhpcy5pc1Byb2Nlc3NQYWdlID0gaXNQcm9jZXNzUGFnZSB8fCBoYXNUcmVlOwotCQl0aGlzLmltZ1BhdGggPSBpbWdQYXRoOwotCQl0aGlzLmJhY2tQYXRoID0gYmFja1BhdGg7Ci0JCXRoaXMubm9kZUluZm8gPSBub2RlSW5mbzsKLQkJdGhpcy5kZWZhdWx0UXVlcnlTdHIgPSBkZWZhdWx0UXVlcnlTdHI7Ci0JCXRoaXMucXVlcnlTdHIgPSBsb2NhdGlvbi5zZWFyY2g7Ci0JCWlmICggdGhpcy5xdWVyeVN0ciA9PSBudWxsIHx8IHRoaXMucXVlcnlTdHIgPT0gIiIgKQotCQl7Ci0JCQl0aGlzLnF1ZXJ5U3RyID0gdGhpcy5kZWZhdWx0UXVlcnlTdHI7Ci0JCX0KLQkJCi0JCXRoaXMuc2VjdGlvbi5pbml0KHRoaXMuaW1nUGF0aCk7Ci0JCQotCQlpZiAoIGhhc1N1YlNlY3Rpb24gKSB7Ci0JCQl0aGlzLnN1YlNlY3Rpb24gPSBuZXcgQ29udGVudFBhZ2VTdWJTZWN0aW9uKCk7Ci0JCX0KLQkJCi0JCWlmICggdGhpcy5wcm9jZXNzUGFnZSAmJiAoaXNQcm9jZXNzUGFnZSB8fCBoYXNUcmVlKSApIHsKLQkJCXRoaXMucHJvY2Vzc1BhZ2UuaW5pdChoYXNUcmVlKTsKLQkJfQotCX0sCi0JCi0JLy8gY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHBhZ2UgaXMgbG9hZGVkCi0Jb25sb2FkOiBmdW5jdGlvbigpIHsKLQkJdGhpcy5zZWN0aW9uLmNyZWF0ZVNlY3Rpb25MaW5rcygnZGl2JywgJ3NlY3Rpb25IZWFkaW5nJywgdGhpcy5pbWdQYXRoKTsKLQkJaWYgKCB0aGlzLnN1YlNlY3Rpb24gIT0gbnVsbCApIHsKLQkJCXRoaXMuc3ViU2VjdGlvbi5jcmVhdGVTdGVwTGlua3MoJ2RpdicsICdzdGVwSGVhZGluZycpOwotCQl9Ci0JCQotCQlpZiAoIHRoaXMucHJvY2Vzc1BhZ2UgKSB7Ci0JCQl0aGlzLnByb2Nlc3NQYWdlLm9ubG9hZCgpOwotCQl9IGVsc2UgewotCQkJdGhpcy5idWlsZEJyZWFkY3J1bW5zKGxvY2F0aW9uLmhyZWYpOwotCQl9IAotCQkKLQkJLy8gdXNlciBjYW4gYWRkIGN1c3RvbWl6YXRpb24gY29kZSBoZXJlCi0JCS8vIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHBhZ2UgaXMgbG9hZGVkCi0JCS8vIHRoaXMgaXMgZXF1aXZhbGVudCB0byBpbnNlcnRpbmcgamF2YXNjcmlwdCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIDwvaHRtbD4gdGFnCi0JCQotCX0sCi0JCi0JLy8gdXRpbGl0eSBtZXRob2RzCi0JZ2V0VXJsUGFyYW1ldGVyczogZnVuY3Rpb24ocXVlcnlTdHIpCi0JewotCQl2YXIgYXJyID0gbmV3IEFycmF5KCk7CQotCQl2YXIgcGFpcnMgPSBxdWVyeVN0ci5zcGxpdCgiJiIpOwotCSAgIAlmb3IgKHZhciBpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSsrKSB7Ci0JICAgICAJCXZhciBwb3MgPSBwYWlyc1tpXS5pbmRleE9mKCc9Jyk7Ci0JICAgICAJCWlmIChwb3MgPT0gLTEpIGNvbnRpbnVlOwotCSAgICAgCQl2YXIgYXJnbmFtZSA9IHBhaXJzW2ldLnN1YnN0cmluZygwLHBvcyk7Ci0JICAgICAJCXZhciB2YWx1ZSA9IHBhaXJzW2ldLnN1YnN0cmluZyhwb3MrMSk7ICAgIAkKLQkgICAgIAkJYXJyW2FyZ25hbWVdID0gdmFsdWU7Ci0JCX0KLQkJCi0JCXJldHVybiBhcnI7Ci0JfSwKLQotCWdldEFwcCA6IGZ1bmN0aW9uKCkgewotCi0JCWlmKCB0eXBlb2YgdGhlQXBwICE9ICJ1bmRlZmluZWQiKSB7Ci0JCQlyZXR1cm4gdGhlQXBwOwotCQl9IGVsc2UgaWYgKCB3aW5kb3cucGFyZW50ICYmIHR5cGVvZiB3aW5kb3cucGFyZW50LnRoZUFwcCAhPSAidW5kZWZpbmVkIikgewotCQkJcmV0dXJuIHdpbmRvdy5wYXJlbnQudGhlQXBwOwotCQl9Ci0JCi0JCXJldHVybiBudWxsOwotCX0sCi0JCi0JZ2V0Vmlld0ZyYW1lOiBmdW5jdGlvbigpIHsKLQkKLQkJdmFyIGFwcCA9IHRoaXMuZ2V0QXBwKCk7Ci0JCWlmICggYXBwICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gYXBwLm5hdjsKLQkJfQotCQkJCQotCQl2YXIgdmlld0ZyYW1lID0gbnVsbDsKLQkJZm9yICggdmFyIGkgPSAwOyBpIDwgd2luZG93LnBhcmVudC5mcmFtZXMubGVuZ3RoOyBpKysgKSB7Ci0JCQlpZiAoIHdpbmRvdy5wYXJlbnQuZnJhbWVzW2ldLm5hbWUgPT0gJ29yeV90b2NfZnJhbWUnICkgewotCQkJCXZhciB0b2NGcmFtZSA9IHdpbmRvdy5wYXJlbnQuZnJhbWVzW2ldOwotCQkJCS8vYWxlcnQodG9jRnJhbWUpOwotCQkJCWlmICh0b2NGcmFtZS5mcmFtZXMubGVuZ3RoID4gMCApIHsKLQkJCQkJZm9yICggdmFyIHggPSAwOyB4IDwgdG9jRnJhbWUuZnJhbWVzLmxlbmd0aDsgeCsrICkgewotCQkJCQkJaWYgKHRvY0ZyYW1lLmZyYW1lc1t4XS5uYW1lID09ICdvcnlfdG9jJyApIHsKLQkJCQkJCQl2aWV3RnJhbWUgPSB0b2NGcmFtZS5mcmFtZXNbeF07Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIHZpZXdGcmFtZTsKLQl9LAotCi0JYnVpbGRCcmVhZGNydW1uczogZnVuY3Rpb24odXJsKSB7Ci0JCXZhciB2aWV3RnJhbWUgPSB0aGlzLmdldFZpZXdGcmFtZSgpOwotCQlpZiAoIHZpZXdGcmFtZSA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdmFyIGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJicmVhZGNydW1icyIpOwotCQlpZiAoZGl2ICE9IG51bGwgJiYgdmlld0ZyYW1lICE9IG51bGwgJiYgdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzICkgewotCQkJaWYgKCB0aGlzLmdldEFwcCgpID09IG51bGwgKSB7Ci0JCQkJLy8gZG9uJ3QgYnJlYWsgb2xkIGNvZGUKLQkJCQl2YXIgYmNzID0gdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzKHVybCk7Ci0JCQkJaWYgKCBiY3MgIT0gbnVsbCAmJiBiY3MubGVuZ3RoID4gMCApIHsKLQkJCQkJdGhpcy5zaG93QnJlYWRjcnVtbnMoZGl2LCBiY3MpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdmFyIHNlbGYgPSB0aGlzOwotCQkJCXZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKGJjcykgewotCQkJCQlpZiAoIGJjcyAhPSBudWxsICYmIGJjcy5sZW5ndGggPiAwICkgewotCQkJCQkJc2VsZi5zaG93QnJlYWRjcnVtbnMoZGl2LCBiY3MpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQkJCi0JCQkJaWYgKGNvbnRlbnRQYWdlLm5vZGVJbmZvICE9IG51bGwgJiYgY29udGVudFBhZ2Uubm9kZUluZm8ubGVuZ3RoID4gMCApIHsKLQkJCQkJdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzQnlQYXRoKGNvbnRlbnRQYWdlLm5vZGVJbmZvLCBudWxsLCBjYWxsYmFjayk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZG8gbm90aGluZwotCQkJCQkvL3ZpZXdGcmFtZS5nZXRCcmVhZGNydW1icyh1cmwsIGNhbGxiYWNrKTsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQkKLQkJfQotCQotCX0sCi0KLQotCXNob3dCcmVhZGNydW1uczogZnVuY3Rpb24oZGl2LCAvKmFycmF5Ki9iY3MpIHsKLQkJaWYgKGRpdiA9PSBudWxsIHx8IGJjcyA9PSBudWxsIHx8IGJjcy5sZW5ndGggPT0gMCAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXZhciBodG1sID0gIiI7Ci0JCWZvciAodmFyIGkgPSAwOyBpIDwgYmNzLmxlbmd0aDsgaSsrICkgewotCQkJdmFyIGJjID0gYmNzW2ldOyAvLyB7dXJsOnVybCwgdGl0bGU6dGl0bGV9Ci0JCQlpZiAoIGkgPiAwICkgewotCQkJCWh0bWwgKz0gIiZuYnNwOz4mbmJzcDsiOwotCQkJfQotCi0JCQkvLyBlc2NhcGUgdGhlIHF1b3RlcwotCQkJdmFyIHVybCA9IGJjLnVybDsKLQkJCXVybCA9IHVybC5yZXBsYWNlKC8nL2csICJcXCciKTsKLQkJCXVybCA9IHVybC5yZXBsYWNlKC9cIi9nLCAiXFxcIiIpOwotCi0JCQlodG1sICs9ICI8YSBocmVmPVwiIiArIHVybCArICJcIj4iICsgYmMudGl0bGUgKyAiPC9hPiIgOwotCQl9Ci0KLQkJdmFyIGh0bWwgPSAiPHRhYmxlIGJvcmRlcj1cIjBcIiBjZWxscGFkZGluZz1cIjBcIiBjZWxsc3BhY2luZz1cIjBcIiB3aWR0aD1cIjEwMCVcIj4iIAotCQkJKyAiPHRyPjx0ZCBhbGlnbj1cImxlZnRcIj4iICsgaHRtbCArICI8L3RkPjx0cj4iCi0JCQkrICI8L3RhYmxlPiI7Ci0JCWRpdi5pbm5lckhUTUwgPSBodG1sOwotCX0sCi0JCi0JCi0JcmVzb2x2ZVVybDogZnVuY3Rpb24odXJsKSB7Ci0JCi0JCWlmKCB0eXBlb2YgdGhlQXBwID09ICJ1bmRlZmluZWQiKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRoZUFwcC5yZXNvbHZlQ29udGVudFVybCh1cmwpOwotCQl9Ci0JfSwKLQkKLQkvKiBnZXQgdGhlIHBhZ2UgZ3VpZCwgaXQncyB0aGUgZ3VpZCBvZiB0aGUgZWxlbWVudCBvciBwYWdlKi8KLQlnZXRQYWdlSWQgOiBmdW5jdGlvbigpIHsKLQkJdmFyIGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGFnZS1ndWlkIik7Ci0JCWlmICggZSAhPSBudWxsICkgewotCQkJcmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLy8gaGVscGVyIG1ldGhvZHMKLQotfTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5ZmZiNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gZHluYW1pY2FsbHkgZ2VuZXJhdGVkIHByb2Nlc3MgbGF5b3V0IHJlbGF0ZWQgZGF0YSBmcm9tIFJNQyBwdWJsaXNoaW5nIHNlcnZpY2UgCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHkueHNsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTViMjBkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHkueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0iaGVscGVyLnhzbCIvPgotCQotCQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icXVlcnlTdHJpbmciIHNlbGVjdD0iQHF1ZXJ5U3RyaW5nIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVsUHJvY2Vzc1BhdGgiIHNlbGVjdD0iQHJlbFByb2Nlc3NQYXRoIi8+Ci0JCTxodG1sPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4gCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPCEtLSA8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+IC0tPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGRlZmF1bHRRdWVyeVN0ciA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHF1ZXJ5U3RyaW5nIi8+JzsKLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgZGVmYXVsdFF1ZXJ5U3RyLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCi0JCQk8L2hlYWQ+CQkJCi0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgkJCQkJCQkJCQkJCQkJCQotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFjdGl2aXR5VGFicyIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJnZW5lcmFsVGV4dEZpZWxkU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRzY29wZVRleHQiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nc2NvcGUnXSIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlbmVyYWxUZXh0RmllbGRTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHB1cnBvc2VUZXh0Ii8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3B1cnBvc2UnXSIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQkJCQkJCQkJCQkJCQkKLQkJCQkJCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEZWxpdmVyeVByb2Nlc3MnICI+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9qZWN0U3BlY2lmaWNzU2VjdGlvbiI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4JCQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlbmVyYWxUZXh0RmllbGRTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJGRlc2NyaXB0aW9uVGV4dCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdtYWluRGVzY3JpcHRpb24nXSIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iSWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2VuZXJhbFRleHRGaWVsZFNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkc3RhZmZpbmdUZXh0Ii8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2hvd3RvU3RhZmYnXSIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVzYWdlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlbmVyYWxUZXh0RmllbGRTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJGtleUNvbnNpZGVyYXRpb25zVGV4dCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdrZXlDb25zaWRlcmF0aW9ucyddIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlbmVyYWxUZXh0RmllbGRTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJGFsdGVybmF0aXZlc1RleHQiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nYWx0ZXJuYXRpdmVzJ10iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb3JtYXRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWN0aXZpdHlUYWJzIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCTx0ciB2YWxpZ249Im1pZGRsZSI+Ci0JCQkJPHRkIHdpZHRoPSIxMCIgY2xhc3M9ImFjdGl2ZVRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1hX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX1dCUyI+Ci0KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWJVcmxBdHRyaWJ1dGUiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ1cmwiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgdGFicy90YWJbQG5hbWU9J1dCUyddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCi0JCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3YnNUZXh0Ii8+PC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1pX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4JCQkJCi0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGEgY2xhc3M9InRhYiIgaWQ9IlRBQl9UQlMiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InVybCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCB0YWJzL3RhYltAbmFtZT0nVEJTJ10vQHVybCkiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YnNUZXh0Ii8+PC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9taWRkbGUtaV9pLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjE3IiBhbGlnbj0iYWJzbWlkZGxlIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGEgY2xhc3M9InRhYiIgaWQ9IlRBQl9XUEJTIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWJVcmxBdHRyaWJ1dGUiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ1cmwiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgdGFicy90YWJbQG5hbWU9J1dQQlMnXS9AdXJsKSIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdwYnNUZXh0Ii8+PC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9lbmQtaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iNTAlIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9zcGFjZS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIGNvbHNwYW49IjIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJCTx0cj4KLQkJCQk8dGQgY29sc3Bhbj0iMTAiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iNSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC90YWJsZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQkKLQk8eHNsOnRlbXBsYXRlIG5hbWU9IklsbHVzdHJhdGlvbnNTZWN0aW9uIj4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSdyb2FkbWFwcyddL0VsZW1lbnQpICsgY291bnQocmVmZXJlbmNlTGlzdFtAbmFtZT0nZXhhbXBsZXMnXS9FbGVtZW50KSA+IDAiPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbGx1c3RyYXRpb25zVGV4dCIvPjwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJHJvYWRtYXBUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3JvYWRtYXBzJ10vRWxlbWVudCIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkZXhhbXBsZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2V4YW1wbGVzJ10vRWxlbWVudCIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+CQotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvamVjdFNwZWNpZmljc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8eHNsOmlmIHRlc3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd0eXBlT2ZDb250cmFjdCddICE9ICcnIG9yICRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzJ10gIT0gJycgb3IgJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3Byb2plY3RNZW1iZXJFeHBlcnRpc2UnXSAhPSAnJyBvciAkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncmlza0xldmVsJ10gIT0gJycgb3IgJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3NjYWxlJ10gIT0gJyciPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9qZWN0U3BlY2lmaWNzVGV4dCIvPjwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiR0eXBlb2ZDb250cmFjdFRleHQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndHlwZU9mQ29udHJhY3QnXSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHByb2plY3RDaGFyYWN0ZXJpc3RpY3NUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3Byb2plY3RDaGFyYWN0ZXJpc3RpY3MnXSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHByb2plY3RNZW1iZXJFeHBlcnRpc2VUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3Byb2plY3RNZW1iZXJFeHBlcnRpc2UnXSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHJpc2tMZXZlbFRleHQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncmlza0xldmVsJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRzY2FsZVRleHQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nc2NhbGUnXSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8eHNsOmlmIHRlc3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10gIT0gJycgb3IgJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3VzYWdlTm90ZXMnXSAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR1c2FnZVRleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHVzYWdlR3VpZGFuY2VUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiR1c2FnZU5vdGVzVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VOb3RlcyddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4JCi0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KHJlZmVyZW5jZUxpc3RbQG5hbWU9J3ZhbGlkQ29udGV4dCddL0VsZW1lbnQpICsgY291bnQocmVmZXJlbmNlW0BuYW1lPSdzdXBlckFjdGl2aXRpZXMnXS9FbGVtZW50KSArIGNvdW50KHJlZmVyZW5jZUxpc3RbQG5hbWU9J2luY2x1ZGVzUGF0dGVybnMnXS9FbGVtZW50KSA+IDAiPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgkKLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQkKLQkJCQk8eHNsOmNob29zZT4KLQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KHJlZmVyZW5jZUxpc3RbQG5hbWU9J3ZhbGlkQ29udGV4dCddL0VsZW1lbnQpID4gMCI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkY29udGV4dHMiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjb250ZXh0VGV4dCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3ZhbGlkQ29udGV4dCddL0VsZW1lbnQiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOndoZW4+Ci0JCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZGNvbnRleHRzIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY29udGV4dFRleHQiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J2RlZmF1bHRDb250ZXh0J10vRWxlbWVudCIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCTwveHNsOmNob29zZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRwYXJlbnRBY3Rpdml0aWVzVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3N1cGVyQWN0aXZpdGllcyddL0VsZW1lbnQiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkKLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRpbmNsdWRlZFBhdHRlcm5zVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdpbmNsdWRlc1BhdHRlcm5zJ10vRWxlbWVudCIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQkKLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4JCi0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+PC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJGV2ZW50RHJpdmVuVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNFdmVudERyaXZlbiddIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCi0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG11bHRpcGxlT2NjdXJyZW5jZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkb25nb2luZ1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5lZFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5pbmdEYXRhVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J1BsYW5uaW5nRGF0YSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdsaW5rVG9QcmVkZWNlc3NvciddL0VsZW1lbnQiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcHJlZGVjZXNzb3JUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbGlua1RvUHJlZGVjZXNzb3InXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+CQkJCQotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcmVwZWF0YWJsZVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb3JtYXRpb25TZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDppZiB0ZXN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nZXN0aW1hdGluZ1RlY2huaXF1ZSddICE9ICcnIG9yIGNvdW50KHJlZmVyZW5jZUxpc3RbQG5hbWU9J2NvbmNlcHRzJ10vRWxlbWVudCkgKyBjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSdjaGVja2xpc3RzJ10vRWxlbWVudCkgKyBjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSdjb21tdW5pY2F0aW9uc01hdGVyaWFscyddL0VsZW1lbnQpICsgY291bnQocmVmZXJlbmNlTGlzdFtAbmFtZT0nZ3VpZGVsaW5lcyddL0VsZW1lbnQpICsgY291bnQocmVmZXJlbmNlTGlzdFtAbmFtZT0nc3VwcG9ydGluZ01hdGVyaWFscyddL0VsZW1lbnQpICsgY291bnQocmVmZXJlbmNlTGlzdFtAbmFtZT0ncmV1c2FibGVBc3NldHMnXS9FbGVtZW50KSA+IDAiPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb3JlSW5mb1RleHQiLz48L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ2hlY2tsaXN0cyI+CQkJCQkKLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nY2hlY2tsaXN0cyddL0VsZW1lbnQiLz4JCQkJCQotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDppZiB0ZXN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdjb21tdW5pY2F0aW9uc01hdGVyaWFscyddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNvbW11bmljYXRpb25zTWF0ZXJpYWxzVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMnXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdlZHVjYXRpb25NYXRlcmlhbHMnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRlZHVjYXRpb25NYXRlcmlhbHNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdlZHVjYXRpb25NYXRlcmlhbHMnXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGVzdGltYXRpbmdUZWNobmlxdWVUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdlc3RpbWF0aW5nVGVjaG5pcXVlJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4JCQkJCQotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdndWlkZWxpbmVzJ10vRWxlbWVudCIvPgkJCQkJCi0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgkJCQkJCi0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NvbmNlcHQnXSIvPgkJCQkKLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZXVzYWJsZUFzc2V0cyI+CQkJCQkKLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJldXNhYmxlQXNzZXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3JldXNhYmxlQXNzZXRzJ10vRWxlbWVudCIvPgkJCQkJCi0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdzdXBwb3J0aW5nTWF0ZXJpYWxzJ10vRWxlbWVudCIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4JCQkJCQotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdXaGl0ZXBhcGVyJ10iLz4JCQkJCQotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQkJCQotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgkKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfdGJzLnhzbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV90YnMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMGQyNTQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV90YnMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iaGVscGVyLnhzbCIvPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icXVlcnlTdHJpbmciIHNlbGVjdD0iQHF1ZXJ5U3RyaW5nIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVsUHJvY2Vzc1BhdGgiIHNlbGVjdD0iQHJlbFByb2Nlc3NQYXRoIi8+Ci0JCTxodG1sPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPCEtLSA8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+IC0tPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGRlZmF1bHRRdWVyeVN0ciA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHF1ZXJ5U3RyaW5nIi8+JzsKLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgIGRlZmF1bHRRdWVyeVN0ciwgZmFsc2UsIHRydWUsIHRydWUpOwotCQkJCTwvc2NyaXB0PgotCi0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFjdGl2aXR5VGFicyIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrZmxvd1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGJzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhY3Rpdml0eVRhYnMiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJPHRyIHZhbGlnbj0ibWlkZGxlIj4KLQkJCQk8dGQgY2xhc3M9InRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGEgY2xhc3M9InRhYiIgaWQ9IlRBQl9EZXNjcmlwdGlvbiI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdEZXNjcmlwdGlvbiddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWlfaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfV0JTIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWJVcmxBdHRyaWJ1dGUiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ1cmwiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgdGFicy90YWJbQG5hbWU9J1dCUyddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcDsiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd2JzVGV4dCIvPgotCQkJCQkJPC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1pX2EuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRic1RleHQiLz4KLQkJCQkJPC9zcGFuPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWFfaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfV1BCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdXUEJTJ10vQHVybCkiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3cGJzVGV4dCIvPgotCQkJCQkJPC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9lbmQtaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iNTAlIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNvbHNwYW49IjQiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGFsdD0iIiB0aXRsZT0iIiBoZWlnaHQ9IjIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZD4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9zcGFjZV9taWRkbGUuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZD4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9zcGFjZS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIGNvbHNwYW49IjMiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJCTx0cj4KLQkJCQk8dGQgY29sc3Bhbj0iMTAiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iNSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC90YWJsZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9IndvcmtmbG93U2VjdGlvbiI+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoYnJlYWtkb3duW0BuYW1lPSdUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9FbGVtZW50W0BUeXBlPSdUZWFtUHJvZmlsZSddKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVhbVN0cnVjdHVyZVRleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJPHAgYWxpZ249ImxlZnQiPgotCQkJPGRpdiBpZD0idGVhbVRyZWUiID48L2Rpdj4KLQkJCTwvcD4KLQkJCQotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCXZhciB0ZWFtVHJlZSA9IFsKLQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iYnJlYWtkb3duW0BuYW1lPSdUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9FbGVtZW50W0BUeXBlPSdUZWFtUHJvZmlsZScgYW5kIEBoYXNTdXBlclRlYW0gPSAnZmFsc2UnIF0iPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlYW1TdHJ1Y3R1cmUiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCV07Ci0JY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UuYnVpbGRUZWFtVHJlZSh0ZWFtVHJlZSk7Ci0JCQkJCTwvc2NyaXB0PgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0idGVhbVN0cnVjdHVyZSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudCIvPgotCVsiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICRlbGVtZW50L0BVcmwpIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ARGlzcGxheU5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0ByZWxQcm9jZXNzUGF0aCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQGlzU3VwcmVzc2VkIi8+IiwgCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGVsZW1lbnQvRWxlbWVudFtAVHlwZT0nVGVhbVByb2ZpbGUnXSkgPiAwIj4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZWxlbWVudC9FbGVtZW50W0BUeXBlPSdUZWFtUHJvZmlsZSddIj4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVhbVN0cnVjdHVyZSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwveHNsOmlmPgotCQldLAotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0idGJzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZWFtUHJvZmlsZUJyZWFrZG93blRleHQiLz4KLQkJPC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJPGRpdiBpZD0idHJlZUNvbnRlbnQiPjwvZGl2PgotCQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iYnJlYWtkb3duW0BuYW1lPSdUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9jb2x1bW5zL2NvbHVtbiI+Ci0JY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UudHJlZVRhYmxlLndic0l0ZW1IdG1sLmFkZENvbHVtbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhYmVsIi8+Iik7Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS53YnNJdGVtSHRtbC53cml0ZUhlYWRlcigpOwotCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJicmVha2Rvd25bQG5hbWU9J1RlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSddL0VsZW1lbnQiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iaW5kZW50IiBzZWxlY3Q9IjAiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50Tm9kZUlkIiBzZWxlY3Q9IiAnJyAiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS53YnNJdGVtSHRtbC5lbmQoKTsKLQkJCQk8L3NjcmlwdD4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3YnNJdGVtIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50Ii8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icGFyZW50Tm9kZUlkIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iaW5kZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJoYXNDaGlsZHJlbiI+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJGVsZW1lbnQvRWxlbWVudCkgPiAwIj50cnVlPC94c2w6d2hlbj4KLQkJCQk8eHNsOm90aGVyd2lzZT5mYWxzZTwveHNsOm90aGVyd2lzZT4KLQkJCTwveHNsOmNob29zZT4KLQkJPC94c2w6dmFyaWFibGU+Ci1jb250ZW50UGFnZS5wcm9jZXNzUGFnZS50cmVlVGFibGUud2JzSXRlbUh0bWwuaW5pdFJvdygiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0Bub2RlSWQiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJlbnROb2RlSWQiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0ByZWxQcm9jZXNzUGF0aCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQGlzU3VwcmVzc2VkIi8+IiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbmRlbnQiLz4sIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGFzQ2hpbGRyZW4iLz4sICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEluZGV4Ii8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3ByZWZpeCddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQERpc3BsYXlOYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAkZWxlbWVudC9AVXJsKSIvPiIsICIiLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BQcmVkZWNlc3NvcnMiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BNb2RlbEluZm8iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BUeXBlTmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+IiwgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc0V2ZW50RHJpdmVuJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BUZWFtIi8+IiwgIiIsICIiLCAiIiwgIiIsICIiKTsKLWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS53YnNJdGVtSHRtbC53cml0ZVJvdygpOwkKLQkJPCEtLQotCQk8dHIgY2xhc3M9InRyZWVOb2RlIj4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImlkIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQG5vZGVJZCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InBhcmVudElkIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmVudE5vZGVJZCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InJlbFByb2Nlc3NQYXRoIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQHJlbFByb2Nlc3NQYXRoIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaXNTdXByZXNzZWQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AaXNTdXByZXNzZWQiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8dGQgYmdjb2xvcj0iI2NjY2NjYyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0ncHJlZml4J10iLz4mIzE2MDs8L3RkPgotCQkJPHRkIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZVRyZWVOb2RlIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImluZGVudCIgc2VsZWN0PSIkaW5kZW50Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJoYXNDaGlsZHJlbiIgc2VsZWN0PSIkaGFzQ2hpbGRyZW4iLz4JCQkJCi0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0aXRsZSIgc2VsZWN0PSIkZWxlbWVudC9ARGlzcGxheU5hbWUiLz4JCQkKLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InVybCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAkZWxlbWVudC9AVXJsKSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVsUHJvY2Vzc1BhdGgiIHNlbGVjdD0iJGVsZW1lbnQvQHJlbFByb2Nlc3NQYXRoIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0KLQkJCTwvdGQ+Ci0JCQk8dGQgbm93cmFwPSJub3dyYXAiIGJnY29sb3I9IiNjY2NjY2MiPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATW9kZWxJbmZvIi8+JiMxNjA7PC90ZD4KLQkJCTx0ZCBub3dyYXA9Im5vd3JhcCI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BUeXBlTmFtZSIvPgotCQkJPC90ZD4KLQkJPC90cj4KLS0tPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRlbGVtZW50L0VsZW1lbnQpID4gMCI+Ci0JCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGVsZW1lbnQvRWxlbWVudCI+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbmRlbnQiIHNlbGVjdD0iJGluZGVudCsxIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXJlbnROb2RlSWQiIHNlbGVjdD0iJGVsZW1lbnQvQG5vZGVJZCIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQk8L3hzbDpmb3ItZWFjaD4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X3dicy54c2wgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfd2JzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWMwY2ZjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfd2JzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImhlbHBlci54c2wiLz4KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InF1ZXJ5U3RyaW5nIiBzZWxlY3Q9IkBxdWVyeVN0cmluZyIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlbFByb2Nlc3NQYXRoIiBzZWxlY3Q9IkByZWxQcm9jZXNzUGF0aCIvPgotCQk8aHRtbD4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTwhLS0gPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPiAtLT4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0FjdGl2aXR5VHJlZVRhYmxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL1Byb2Nlc3NFbGVtZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBkZWZhdWx0UXVlcnlTdHIgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxdWVyeVN0cmluZyIvPic7Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICBkZWZhdWx0UXVlcnlTdHIsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLQkJCQk8L3NjcmlwdD4KLQotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhY3Rpdml0eVRhYnMiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id29ya2Zsb3dTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Indic1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWN0aXZpdHlUYWJzIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCTx0ciB2YWxpZ249Im1pZGRsZSI+Ci0JCQkJPHRkIHdpZHRoPSIxMCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGEgY2xhc3M9InRhYiIgaWQ9IlRBQl9EZXNjcmlwdGlvbiI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdEZXNjcmlwdGlvbiddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWlfYS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImFjdGl2ZVRhYiI+Ci0JCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd2JzVGV4dCIvPgotCQkJCQk8L3NwYW4+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1hX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX1RCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdUQlMnXS9AdXJsKSIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRic1RleHQiLz4KLQkJCQkJCTwvc3Bhbj4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWlfaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfV1BCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdXUEJTJ10vQHVybCkiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3cGJzVGV4dCIvPgotCQkJCQkJPC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9lbmQtaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iNTAlIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNvbHNwYW49IjIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZD4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9zcGFjZV9taWRkbGUuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZD4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9zcGFjZS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIGNvbHNwYW49IjUiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJCTx0cj4KLQkJCQk8dGQgY29sc3Bhbj0iMTAiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iNSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC90YWJsZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9IndvcmtmbG93U2VjdGlvbiI+Ci0JCTx4c2w6aWYgdGVzdD0iZGlhZ3JhbXMvZGlhZ3JhbVtAbmFtZT0nQWN0aXZpdHknXSBvciBkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdBY3Rpdml0eURldGFpbCddIG9yIGRpYWdyYW1zL3VzZXJkaWFncmFtW0BuYW1lPSdBY3Rpdml0eSddIG9yIGRpYWdyYW1zL3VzZXJkaWFncmFtW0BuYW1lPSdBY3Rpdml0eURldGFpbCddIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtmbG93VGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iZGlhZ3JhbXMvdXNlcmRpYWdyYW1bQG5hbWU9J0FjdGl2aXR5J10iPgotCQkJCQkJCTx0cj4KLQkJCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIiBhbGlnbj0iY2VudGVyIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJkaWFncmFtcy91c2VyZGlhZ3JhbVtAbmFtZT0nQWN0aXZpdHknXSIvPgotCQkJCQkJCQk8L3RkPgotCQkJCQkJCTwvdHI+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdBY3Rpdml0eSddIj4KLQkJCQkJCQkJPHRyPgotCQkJCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIiBhbGlnbj0iY2VudGVyIj4KLQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheURpYWdyYW0iPgotCQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGlhZ3JhbSIgc2VsZWN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdBY3Rpdml0eSddIi8+Ci0JCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJCTwvdHI+Ci0JCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCTwveHNsOmNob29zZT4KLQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iZGlhZ3JhbXMvdXNlcmRpYWdyYW1bQG5hbWU9J0FjdGl2aXR5RGV0YWlsJ10iPgotCQkJCQkJCTx0cj4KLQkJCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIiBhbGlnbj0iY2VudGVyIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJkaWFncmFtcy91c2VyZGlhZ3JhbVtAbmFtZT0nQWN0aXZpdHlEZXRhaWwnXSIvPgotCQkJCQkJCQk8L3RkPgotCQkJCQkJCTwvdHI+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdBY3Rpdml0eURldGFpbCddIj4KLQkJCQkJCQkJPHRyPgotCQkJCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIiBhbGlnbj0iY2VudGVyIj4KLQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheURpYWdyYW0iPgotCQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGlhZ3JhbSIgc2VsZWN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdBY3Rpdml0eURldGFpbCddIi8+Ci0JCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJCTwvdHI+Ci0JCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCTwveHNsOmNob29zZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0id2JzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrQnJlYWtkb3duVGV4dCIvPgotCQk8L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQk8ZGl2IGlkPSJ0cmVlQ29udGVudCI+PC9kaXY+Ci0JCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJicmVha2Rvd25bQG5hbWU9J1dvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSddL2NvbHVtbnMvY29sdW1uIj4KLQljb250ZW50UGFnZS5wcm9jZXNzUGFnZS50cmVlVGFibGUud2JzSXRlbUh0bWwuYWRkQ29sdW1uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFiZWwiLz4iKTsKLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UudHJlZVRhYmxlLndic0l0ZW1IdG1sLndyaXRlSGVhZGVyKCk7Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJicmVha2Rvd25bQG5hbWU9J1dvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSddL0VsZW1lbnQiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iaW5kZW50IiBzZWxlY3Q9IjAiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50Tm9kZUlkIiBzZWxlY3Q9IiAnJyAiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS53YnNJdGVtSHRtbC5lbmQoKTsKLQkJCQk8L3NjcmlwdD4KLQkKLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPCEtLSB3cml0ZSB0aGUgd2JzIHRyIGh0bWwgLS0+Ci0JPCEtLSBpbml0KGlkLCBwYXJlbnRJZCwgcmVsUGF0aCwgaXNTdXByZXNzZWQsIGluZGVudFNpemUsIGhhc0NoaWxkcmVuLCBpbmRleCwgcHJlZml4LCB0aXRsZSwgdXJsLCBzdGVwcywgcHJlZGVjZXNzb3JzLCBpbmZvLCByZXBlYXRhYmxlLCBtdWx0aU9jY3VyZW5jZXMsIG9wdGlvbmFsLCBwbGFubmVkLCB0eXBlKSAtLT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnQiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJwYXJlbnROb2RlSWQiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJpbmRlbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imhhc0NoaWxkcmVuIj4KLQkJCTx4c2w6Y2hvb3NlPgotCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkZWxlbWVudC9FbGVtZW50KSA+IDAiPnRydWU8L3hzbDp3aGVuPgotCQkJCTx4c2w6b3RoZXJ3aXNlPmZhbHNlPC94c2w6b3RoZXJ3aXNlPgotCQkJPC94c2w6Y2hvb3NlPgotCQk8L3hzbDp2YXJpYWJsZT4JCi0JY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UudHJlZVRhYmxlLndic0l0ZW1IdG1sLmluaXRSb3coIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9Abm9kZUlkIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyZW50Tm9kZUlkIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AcmVsUHJvY2Vzc1BhdGgiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0Bpc1N1cHJlc3NlZCIvPiIsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5kZW50Ii8+LCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhhc0NoaWxkcmVuIi8+LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BJbmRleCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdwcmVmaXgnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQE5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BEaXNwbGF5TmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJGVsZW1lbnQvQFVybCkiLz4iLCAiIiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AUHJlZGVjZXNzb3JzIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATW9kZWxJbmZvIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVHlwZU5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPiIsICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPbmdvaW5nJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNFdmVudERyaXZlbiddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVGVhbSIvPiIsICIiLCAiIiwiIiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3ZhcmlhYmlsaXR5VHlwZSddIi8+Iik7PHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRlbGVtZW50L1N0ZXBzL1N0ZXAiPmNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS53YnNJdGVtSHRtbC5hZGRTdGVwKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2VsZWN0ZWQiLz4sIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpIG1vZCA1ID0gMCIvPik7PC94c2w6Zm9yLWVhY2g+Ci1jb250ZW50UGFnZS5wcm9jZXNzUGFnZS50cmVlVGFibGUud2JzSXRlbUh0bWwud3JpdGVSb3coKTsJCi08eHNsOmlmIHRlc3Q9ImNvdW50KCRlbGVtZW50L0VsZW1lbnQpID4gMCI+Ci0JCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGVsZW1lbnQvRWxlbWVudCI+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbmRlbnQiIHNlbGVjdD0iJGluZGVudCsxIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXJlbnROb2RlSWQiIHNlbGVjdD0iJGVsZW1lbnQvQG5vZGVJZCIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQk8L3hzbDpmb3ItZWFjaD4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X3dwYnMueHNsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X3dwYnMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTMwOGYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV93cGJzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImhlbHBlci54c2wiLz4KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InF1ZXJ5U3RyaW5nIiBzZWxlY3Q9IkBxdWVyeVN0cmluZyIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlbFByb2Nlc3NQYXRoIiBzZWxlY3Q9IkByZWxQcm9jZXNzUGF0aCIvPgotCQk8aHRtbD4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTwhLS0gPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPiAtLT4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0FjdGl2aXR5VHJlZVRhYmxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL1Byb2Nlc3NFbGVtZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBkZWZhdWx0UXVlcnlTdHIgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxdWVyeVN0cmluZyIvPic7Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sIGRlZmF1bHRRdWVyeVN0ciwgZmFsc2UsIHRydWUsIHRydWUpOwotCQkJCTwvc2NyaXB0PgotCi0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFjdGl2aXR5VGFicyIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrZmxvd1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id3Bic1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWN0aXZpdHlUYWJzIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCTx0ciB2YWxpZ249Im1pZGRsZSI+Ci0JCQkJPHRkIHdpZHRoPSIxMCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGEgY2xhc3M9InRhYiIgaWQ9IlRBQl9EZXNjcmlwdGlvbiI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdEZXNjcmlwdGlvbiddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWlfaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfV0JTIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWJVcmxBdHRyaWJ1dGUiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ1cmwiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgdGFicy90YWJbQG5hbWU9J1dCUyddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcDsiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd2JzVGV4dCIvPgotCQkJCQkJPC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1pX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX1RCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdUQlMnXS9AdXJsKSIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRic1RleHQiLz4KLQkJCQkJCTwvc3Bhbj4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWlfYS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImFjdGl2ZVRhYiI+Ci0JCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3Bic1RleHQiLz4KLQkJCQkJPC9zcGFuPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfZW5kLWEuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjUwJSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQkJPHRyPgotCQkJCTx0ZCBjb2xzcGFuPSI2Ij4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQ+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfc3BhY2VfbWlkZGxlLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgY2xhc3M9ImFjdGl2ZVRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQ+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfc3BhY2UuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBjb2xzcGFuPSIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNvbHNwYW49IjEwIiBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3b3JrZmxvd1NlY3Rpb24iPgotCQk8eHNsOmlmIHRlc3Q9ImRpYWdyYW1zL2RpYWdyYW1bQG5hbWU9J1dQRGVwZW5kZW5jeSddIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0RGVwZW5kZW5jaWVzVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPCEtLQotCQkJPHAgYWxpZ249ImNlbnRlciI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9ImRpYWdyYW1zL2RpYWdyYW1bQG5hbWU9J1dQRGVwZW5kZW5jeSddIi8+Ci0JCQk8L3A+Ci0JCQktLT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheURpYWdyYW0iPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGlhZ3JhbSIgc2VsZWN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdXUERlcGVuZGVuY3knXSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3cGJzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdEJyZWFrZG93blRleHQiLz4KLQkJPC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJPGRpdiBpZD0idHJlZUNvbnRlbnQiPjwvZGl2PgotCQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iYnJlYWtkb3duW0BuYW1lPSdXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSddL2NvbHVtbnMvY29sdW1uIj4KLWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS53YnNJdGVtSHRtbC5hZGRDb2x1bW4oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYWJlbCIvPiIpOwotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS53YnNJdGVtSHRtbC53cml0ZUhlYWRlcigpOwotCi0JCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImJyZWFrZG93bltAbmFtZT0nV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9FbGVtZW50Ij4KLQkJCQkJCTx4c2w6c29ydCBkYXRhLXR5cGU9InRleHQiIHNlbGVjdD0iQERpc3BsYXlOYW1lIiBvcmRlcj0iYXNjZW5kaW5nIi8+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id2JzSXRlbSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbmRlbnQiIHNlbGVjdD0iMCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXJlbnROb2RlSWQiIHNlbGVjdD0iICcnICIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci1jb250ZW50UGFnZS5wcm9jZXNzUGFnZS50cmVlVGFibGUud2JzSXRlbUh0bWwuZW5kKCk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0id2JzSXRlbSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InBhcmVudE5vZGVJZCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImluZGVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaGFzQ2hpbGRyZW4iPgotCQkJPHhzbDpjaG9vc2U+Ci0JCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCRlbGVtZW50L0VsZW1lbnQpID4gMCI+dHJ1ZTwveHNsOndoZW4+Ci0JCQkJPHhzbDpvdGhlcndpc2U+ZmFsc2U8L3hzbDpvdGhlcndpc2U+Ci0JCQk8L3hzbDpjaG9vc2U+Ci0JCTwveHNsOnZhcmlhYmxlPgotCQkKLWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS53YnNJdGVtSHRtbC5pbml0Um93KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQG5vZGVJZCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmVudE5vZGVJZCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQHJlbFByb2Nlc3NQYXRoIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AaXNTdXByZXNzZWQiLz4iLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGluZGVudCIvPiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoYXNDaGlsZHJlbiIvPiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ASW5kZXgiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0ncHJlZml4J10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BOYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ARGlzcGxheU5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICRlbGVtZW50L0BVcmwpIi8+IiwgIiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFByZWRlY2Vzc29ycyIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQE1vZGVsSW5mbyIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFR5cGVOYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzUmVwZWF0YWJsZSddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2hhc011bHRpcGxlT2NjdXJyZW5jZXMnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iLz4iLCAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzT25nb2luZyddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzRXZlbnREcml2ZW4nXSIvPiIsICIiLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BFbnRyeVN0YXRlIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ARXhpdFN0YXRlIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ARGVsaXZlcmFibGUiLz4iLCAiIiwgIiIpOwotY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UudHJlZVRhYmxlLndic0l0ZW1IdG1sLndyaXRlUm93KCk7CQotCQk8IS0tCi0JCTx0ciBjbGFzcz0idHJlZU5vZGUiPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaWQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9Abm9kZUlkIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0icGFyZW50SWQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyZW50Tm9kZUlkIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVsUHJvY2Vzc1BhdGgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AcmVsUHJvY2Vzc1BhdGgiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpc1N1cHJlc3NlZCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0Bpc1N1cHJlc3NlZCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdwcmVmaXgnXSIvPiYjMTYwOzwvdGQ+Ci0JCQk8dGQgd2lkdGg9IjEwMCUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlVHJlZU5vZGUiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iaW5kZW50IiBzZWxlY3Q9IiRpbmRlbnQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imhhc0NoaWxkcmVuIiBzZWxlY3Q9IiRoYXNDaGlsZHJlbiIvPgkJCQkKLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRpdGxlIiBzZWxlY3Q9IiRlbGVtZW50L0BEaXNwbGF5TmFtZSIvPgkJCQotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICRlbGVtZW50L0BVcmwpIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWxQcm9jZXNzUGF0aCIgc2VsZWN0PSIkZWxlbWVudC9AcmVsUHJvY2Vzc1BhdGgiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQotCQkJPC90ZD4KLQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgYmdjb2xvcj0iI2NjY2NjYyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BNb2RlbEluZm8iLz4mIzE2MDs8L3RkPgotCQkJPHRkIG5vd3JhcD0ibm93cmFwIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEVudHJ5U3RhdGUiLz4mIzE2MDs8L3RkPgotCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBiZ2NvbG9yPSIjY2NjY2NjIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEV4aXRTdGF0ZSIvPiYjMTYwOzwvdGQ+Ci0JCTwvdHI+Ci0tLT4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZWxlbWVudC9FbGVtZW50KSA+IDAiPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRlbGVtZW50L0VsZW1lbnQiPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3YnNJdGVtIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iaW5kZW50IiBzZWxlY3Q9IiRpbmRlbnQrMSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50Tm9kZUlkIiBzZWxlY3Q9IiRlbGVtZW50L0Bub2RlSWQiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hcnRpZmFjdC54c2wgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYXJ0aWZhY3QueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZTg1OTAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hcnRpZmFjdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJ3b3JrcHJvZHVjdC54c2wiLz4KLQkJCQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFydGlmYWN0RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdBcnRpZmFjdERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQkJCi0JCTxodG1sPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICcnLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHVycG9zZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGFydGlmYWN0RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGFydGlmYWN0RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdElsbHVzdHJhdGlvbnNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkYXJ0aWZhY3REZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhaWxvcmluZ1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGFydGlmYWN0RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJyaWVmT3V0bGluZSIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdicmllZk91dGxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdtYWluRGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRicmllZk91dGxpbmUgIT0gJycgb3IgJG1haW5EZXNjcmlwdGlvbiAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4JCQkKLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRicmllZk91dGxpbmUgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYnJpZWZPdXRsaW5lVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRicmllZk91dGxpbmUiLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJG1haW5EZXNjcmlwdGlvbiAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYWluRGVzY3JpcHRpb25UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCQotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+CQotCQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hcnRpZmFjdF9kZXNjcmlwdG9yLnhzbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hcnRpZmFjdF9kZXNjcmlwdG9yLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzdiZTdlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYXJ0aWZhY3RfZGVzY3JpcHRvci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJ3b3JrcHJvZHVjdC54c2wiLz4KLQkKLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgkJCQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdXb3JrUHJvZHVjdERlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0RGVzY3JpcHRvciIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVzY3JpcHRvckRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGVEZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJxdWVyeVN0cmluZyIgc2VsZWN0PSJAcXVlcnlTdHJpbmciLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWxQcm9jZXNzUGF0aCIgc2VsZWN0PSJAcmVsUHJvY2Vzc1BhdGgiLz4KLQkKLQkJPGh0bWw+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgZGVmYXVsdFF1ZXJ5U3RyID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcXVlcnlTdHJpbmciLz4nOwotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCBkZWZhdWx0UXVlcnlTdHIsIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQkJCQkJCQotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwdXJwb3NlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdG9yUmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQkKLQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdicmllZk91dGxpbmUnXSAhPScnICI+Ci0JCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCi0JCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlZmluZWREZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkKLQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCQotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdElsbHVzdHJhdGlvbnNTZWN0aW9uIi8+Ci0KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCQotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWlsb3JpbmdTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iLz4KLQkJCQkJCQkKLQkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgkKLQkKLQkJPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdGlvblNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYnJpZWZPdXRsaW5lIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2JyaWVmT3V0bGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3JlZmluZWREZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJGJyaWVmT3V0bGluZSAhPSAnJyBvciAkbWFpbkRlc2NyaXB0aW9uICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlc2NyaXB0aW9uVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgkJCQotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGJyaWVmT3V0bGluZSAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRicmllZk91dGxpbmVUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGJyaWVmT3V0bGluZSIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkbWFpbkRlc2NyaXB0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkbWFpbkRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQkJCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4JCi0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+PC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkgICAgPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2FjdGl2aXR5RW50cnlTdGF0ZSddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRhY3Rpdml0eUVudHJ5U3RhdGVUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nYWN0aXZpdHlFbnRyeVN0YXRlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0nYWN0aXZpdHlFeGl0U3RhdGUnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkYWN0aXZpdHlFeGl0U3RhdGVUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nYWN0aXZpdHlFeGl0U3RhdGUnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgkJCQotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgkJCQkKLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uZWRUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4JCQotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5pbmdEYXRhVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J1BsYW5uaW5nRGF0YSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQk8IS0tCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8eHNsOmlmIHRlc3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXNhZ2VUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IidVc2FnZSBHdWlkYW5jZSciLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3VzYWdlR3VpZGFuY2UnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JLS0+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InVzYWdlR3VpZGFuY2UiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3VzYWdlR3VpZGFuY2UnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiR1c2FnZUd1aWRhbmNlICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzYWdlR3VpZGFuY2VUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiR1c2FnZUd1aWRhbmNlIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdG9yUmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0IiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0nV29ya1Byb2R1Y3QnXS9FbGVtZW50W0BUeXBlPSdBcnRpZmFjdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkZWxpdmVyYWJsZVBhcnRzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltcGFjdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0naW1wYWN0cyddL0VsZW1lbnRbQFR5cGU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1wYWN0ZWRCeSIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdpbXBhY3RlZEJ5J10vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyddL0VsZW1lbnRbQFR5cGU9J1Rhc2tEZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvcHRpb25hbElucHV0VG8iIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMnXS9FbGVtZW50W0BUeXBlPSdUYXNrRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXh0ZXJuYWxJbnB1dFRvIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzJ10vRWxlbWVudFtAVHlwZT0nVGFza0Rlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dEZyb20iIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzJ10vRWxlbWVudFtAVHlwZT0nVGFza0Rlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1cGVyQWN0aXZpdGllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdzdXBlckFjdGl2aXRpZXMnXS9FbGVtZW50W0BUeXBlPSdBY3Rpdml0eSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycyddL0VsZW1lbnRbQFR5cGU9J1JvbGVEZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrZWRPbkJ5IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3dvcmtlZE9uQnknXS9FbGVtZW50Ii8+Ci0JCQkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVzcG9uc2libGVSb2xlKSArIGNvdW50KCR3b3JrZWRPbkJ5KSArIGNvdW50KCRtYW5kYXRvcnlJbnB1dFRvKSArIGNvdW50KCRvcHRpb25hbElucHV0VG8pICsgY291bnQoJGV4dGVybmFsSW5wdXRUbykgKyBjb3VudCgkb3V0cHV0RnJvbSkgKyBjb3VudCgkaW1wYWN0cykgKyBjb3VudCgkaW1wYWN0ZWRCeSk+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRpbXBhY3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVwZW5kZW50VGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRpbXBhY3RzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGltcGFjdGVkQnkpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbXBhY3RpbmdUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjMiPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGltcGFjdGVkQnkiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZXNwb25zaWJsZVJvbGUpICsgY291bnQoJHdvcmtlZE9uQnkpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgd2lkdGg9IjMwJSI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVUZXh0Ii8+OgkJCQkJCQkKLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMiI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9kaWZpZWRCeVRleHQiLz46Ci0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya2VkT25CeSI+Ci0JCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG1hbmRhdG9yeUlucHV0VG8pICsgY291bnQoJG9wdGlvbmFsSW5wdXRUbykgKyBjb3VudCgkZXh0ZXJuYWxJbnB1dFRvKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRUb1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgd2lkdGg9IjMwJSI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFuZGF0b3J5VGV4dCIvPjoJCQkJCQkJCQotCQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkbWFuZGF0b3J5SW5wdXRUbykgPiAwIj4KLQkJCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRtYW5kYXRvcnlJbnB1dFRvIj4JCQotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgkJCQkJCQkJCi0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkKLQkJCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6d2hlbj4JCQkJCi0JCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbm9uZVRleHQiLz4KLQkJCQkJCQkJCQk8L2xpPgkJCQkJCQkJCQotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB3aWR0aD0iMzAlIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz46Ci0JCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCRvcHRpb25hbElucHV0VG8pID4gMCI+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRvcHRpb25hbElucHV0VG8iPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCi0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6d2hlbj4JCQkJCi0JCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbm9uZVRleHQiLz4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC91bD4JCQkJCQkJCQkKLQkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4JCQkJCQkJCQkKLQkJCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlcm5hbFRleHQiLz46Ci0JCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCRleHRlcm5hbElucHV0VG8pID4gMCI+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRleHRlcm5hbElucHV0VG8iPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCi0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6d2hlbj4JCQkJCi0JCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbm9uZVRleHQiLz4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC91bD4JCQkJCQkJCQkKLQkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4JCQkJCQkJCQkKLQkJCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQkJCTwvdGQ+CQkJCQkKLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG91dHB1dEZyb20pID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRGcm9tVGV4dCIvPjwvdGg+CQkJCQkJCQotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMyI+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkb3V0cHV0RnJvbSkgPiAwIj4JCQkJCQkJCQkKLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRvdXRwdXRGcm9tIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwvdGQ+CQkJCQkJCQotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY2hlY2tsaXN0LnhzbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jaGVja2xpc3QueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZDQ4N2FkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jaGVja2xpc3QueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2UueHNsIi8+CQotCQotCQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+CQkKLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQkJCi0gICAgCTxodG1sPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQkJCi0JCQkJCS8vb3ZlcnJpZGUgdGhlIHN1YnNlY3Rpb24gdGV4dAotCQkJCQljb250ZW50UGFnZS5zdWJTZWN0aW9uLmV4cGFuZEFsbFRleHQgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHBhbmRBbGxUZXh0Ii8+JzsKLQkJCQkJY29udGVudFBhZ2Uuc3ViU2VjdGlvbi5jb2xsYXBzZUFsbFRleHQgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xsYXBzZUFsbFRleHQiLz4nOwkJCQkJCi0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNoZWNrSXRlbXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImNoZWNrSXRlbXNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNlY3Rpb25zIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9yZWZlcmVuY2VMaXN0W0BuYW1lPSdzZWN0aW9ucyddL0VsZW1lbnRbQFR5cGU9J1NlY3Rpb24nXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzZWN0aW9ucykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNoZWNrSXRlbXNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHNlY3Rpb25zIj4KLQkJCQkJCQkJPGRpdiBjbGFzcz0ic3RlcEhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J25hbWUnXSIvPjwvZGl2PgotCQkJCQkJCQk8ZGl2IGNsYXNzPSJzdGVwQ29udGVudCI+Ci0JCQkJCQkJCQk8dGFibGUgY2xhc3M9InN0ZXBUYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJCQkJCTx0ZD4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J3NlY3Rpb25EZXNjcmlwdGlvbiddIi8+Ci0JCQkJCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJCQkJPC90cj4KLQkJCQkJCQkJCTwvdGFibGU+Ci0JCQkJCQkJCTwvZGl2PgkJCQkJCQotCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2NvbXBvc2l0ZXJvbGUueHNsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2NvbXBvc2l0ZXJvbGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYWI5MTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb21wb3NpdGVyb2xlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOmluY2x1ZGUgaHJlZj0iaGVscGVyLnhzbCIvPgotCQotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVzY3JpcHRvckRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQkKLQkJPGh0bWw+CQotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgJycsIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4JCi0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0aWVzVGV4dCIvPjwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRtdWx0aXBsZU9jY3VycmVuY2VzVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uZWRUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFnZ3JlZ2F0ZWRSb2xlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdhZ2dyZWdhdGVkUm9sZXMnXS9FbGVtZW50Ii8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZUZvciIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyZXNwb25zaWJsZUZvciddL0VsZW1lbnQiLz4JCQkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYWdncmVnYXRlZFJvbGVzKSArIGNvdW50KCRyZXNwb25zaWJsZUZvcikgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYWdncmVnYXRlZFJvbGVzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYWdncmVnYXRlc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMyI+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkYWdncmVnYXRlZFJvbGVzIj4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZXNwb25zaWJsZUZvcikgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlRm9yVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyZXNwb25zaWJsZUZvciI+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDppZiB0ZXN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzYWdlVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSInVXNhZ2UgR3VpZGFuY2UnIi8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb250ZW50Y2F0ZWdvcnkueHNsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2NvbnRlbnRjYXRlZ29yeS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwMzBlYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2NvbnRlbnRjYXRlZ29yeS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1MTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCQotICAgIDx4c2w6aW5jbHVkZSBocmVmPSJoZWxwZXIueHNsIi8+Ci0gICAgCi0JCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Ik5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+CQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbk5hbWVfdGVtcCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdwcmVzZW50YXRpb25OYW1lJ10iIC8+Ci0gICAgCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uTmFtZSI+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iJHByZXNlbnRhdGlvbk5hbWVfdGVtcCAhPSAnJyAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJlc2VudGF0aW9uTmFtZV90ZW1wIi8+PC94c2w6d2hlbj4KLQkJCQk8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJE5hbWUiLz48L3hzbDpvdGhlcndpc2U+CQkJCQotCQkJPC94c2w6Y2hvb3NlPgotICAgIAk8L3hzbDp2YXJpYWJsZT4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdicmllZkRlc2NyaXB0aW9uJ10iLz4JICAgIAotCQk8aHRtbD4KLQkJCTxoZWFkPgotCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0N1c3RvbUNhdGVnb3J5JyI+CQkJCQotCQkJCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+PC90aXRsZT4KLQkJCQkJPC94c2w6d2hlbj4JCQkJCi0JCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCTwveHNsOmNob29zZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4gCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPCEtLSA8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+IC0tPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICcnLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlICE9ICdDdXN0b21DYXRlZ29yeSciPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHNlbGVjdD0iJGJyaWVmRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4JCQkJCQkKLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDaGVja2xpc3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ29uY2VwdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0d1aWRlbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1N1cHBvcnRpbmdNYXRlcmlhbCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdXaGl0ZXBhcGVyJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb25jZXB0c0FuZFBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J2NvbmNlcHRzQW5kUGFwZXJzJ10iLz4KLQkJCi0JCTx4c2w6Y2hvb3NlPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdDdXN0b21DYXRlZ29yeSciPgotCQkJPCEtLQotCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpICsgY291bnQoJGNvbmNlcHRzQW5kUGFwZXJzKSArIGNvdW50KCRndWlkZWxpbmVzKSA+IDAiPgotCQkJCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb3JlSW5mb1RleHQiLz48L2Rpdj4KLQkJCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ2hlY2tsaXN0cyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzQW5kUGFwZXJzIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkJCi0JCQkJCQk8L3RhYmxlPgotCQkJCQk8L2Rpdj4KLQkJCQk8L3hzbDppZj4KLQkJCS0tPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpICsgY291bnQoJGNvbmNlcHRzKSArIGNvdW50KCRndWlkZWxpbmVzKSArIGNvdW50KCRzdXBwb3J0aW5nTWF0ZXJpYWxzKSArIGNvdW50KCR3aGl0ZVBhcGVycykgPiAwIj4KLQkJCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+PC9kaXY+Ci0JCQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSIkY2hlY2tsaXN0cyIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9IiRjb25jZXB0cyIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEd1aWRlbGluZXMiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSIkZ3VpZGVsaW5lcyIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFscyIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9IiR3aGl0ZVBhcGVycyIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RhYmxlPgotCQkJCQk8L2Rpdj4KLQkJCQk8L3hzbDppZj4KLQkJCTwveHNsOm90aGVyd2lzZT4KLQkJPC94c2w6Y2hvb3NlPgotCTwveHNsOnRlbXBsYXRlPgotCQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0Rpc2NpcGxpbmUnIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93RGlzY2lwbGUiLz4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0Rpc2NpcGxpbmVHcm91cGluZyciPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNob3dEaXNjaXBsZUdyb3VwaW5nIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEb21haW4nIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93RG9tYWluIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdXb3JrUHJvZHVjdFR5cGUnIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93V29ya1Byb2R1Y3RUeXBlIi8+Ci0JCTwveHNsOmlmPgkJCi0JCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGVTZXRHcm91cGluZyciPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNob3dSb2xlU2V0R3JvdXBpbmciLz4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGVTZXQnIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93Um9sZVNldCIvPgotCQk8L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVG9vbCciPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNob3dUb29sIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdDdXN0b21DYXRlZ29yeSciPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNob3dDdXN0b21DYXRlZ29yeSIvPgotCQk8L3hzbDppZj4JCQotICAgIDwveHNsOnRlbXBsYXRlPgotCQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2hvd0Rpc2NpcGxlIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvd3MiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncmVmZXJlbmNlV29ya2Zsb3dzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRhc2tzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3Rhc2tzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1YmRpc2NpcGxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3N1YmRpc2NpcGxpbmUnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZWZlcmVuY2VXb3JrZmxvd3MpICsgY291bnQoJHRhc2tzKSArIGNvdW50KCRzdWJkaXNjaXBsaW5lcyk+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHJlZmVyZW5jZVdvcmtmbG93cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlZmVyZW5jZVdvcmtmbG93c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcmVmZXJlbmNlV29ya2Zsb3dzIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBkYXRhLXR5cGU9InRleHQiIHNlbGVjdD0iQERpc3BsYXlOYW1lIiBvcmRlcj0iYXNjZW5kaW5nIiAvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR0YXNrcykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhc2tzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0YXNrcyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHN1YmRpc2NpcGxpbmVzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3ViZGlzY2lwbGluZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHN1YmRpc2NpcGxpbmVzIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgZGF0YS10eXBlPSJ0ZXh0IiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIgb3JkZXI9ImFzY2VuZGluZyIgLz4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCQkJCQkJCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InNob3dEaXNjaXBsZUdyb3VwaW5nIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkaXNjaXBsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkaXNjaXBsaW5lcyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0NvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGRpc2NpcGxpbmVzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGlzY2lwbGluZXNUZXh0Ii8+PC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRpc2NpcGxpbmVzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzaG93RG9tYWluIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdWJkb21haW5zIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3N1YmRvbWFpbnMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3dvcmtQcm9kdWN0cyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0NvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMnXS9FbGVtZW50Ii8+CQkJCQkJCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHN1YmRvbWFpbnMpICsgY291bnQoJHdvcmtQcm9kdWN0cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzdWJkb21haW5zKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3ViZG9tYWluc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc3ViZG9tYWlucyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHdvcmtQcm9kdWN0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya1Byb2R1Y3RzIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBkYXRhLXR5cGU9InRleHQiIHNlbGVjdD0iQERpc3BsYXlOYW1lIiBvcmRlcj0iYXNjZW5kaW5nIiAvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQkJCQkJCQkJCQkJCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InNob3dXb3JrUHJvZHVjdFR5cGUiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSd3b3JrUHJvZHVjdHMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR3b3JrUHJvZHVjdHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0c1RleHQiLz48L3RoPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya1Byb2R1Y3RzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgICAgIAotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2hvd1JvbGVTZXRHcm91cGluZyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icm9sZVNldHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncm9sZVNldHMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyb2xlU2V0cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZVNldHNUZXh0Ii8+PC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJvbGVTZXRzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzaG93Um9sZVNldCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icm9sZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncm9sZXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyb2xlcykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZXNUZXh0Ii8+PC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJvbGVzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzaG93VG9vbCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ndG9vbE1lbnRvcnMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR0b29sTWVudG9ycykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG9vbE1lbnRvcnNUZXh0Ii8+PC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRvb2xNZW50b3JzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzaG93Q3VzdG9tQ2F0ZWdvcnkiPgotICAJCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcml6ZWRFbGVtZW50cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdjYXRlZ29yaXplZEVsZW1lbnRzJ10vRWxlbWVudCIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudCgkY2F0ZWdvcml6ZWRFbGVtZW50cykgPiAwIj4KLSAgICAgICAgCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0gICAgICAgICAgICAJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICAgICAgICAgCQk8dHIgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgICAgICAgIAkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRlbnRzVGV4dCIvPjwvdGg+Ci0gICAgICAgICAgICAgICAgICAgCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotICAgICAgICAgICAgICAgICAgICAgICAJCTx1bD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjYXRlZ29yaXplZEVsZW1lbnRzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCTxsaT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQk8YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L2E+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwvbGk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwvdWw+Ci0gICAgICAgICAgICAgICAgICAgICAJPC90ZD4KLSAgICAgICAgICAgICAgICAgICAJPC90cj4KLSAgICAgICAgICAgIAk8L3RhYmxlPgotICAgICAgICAgCTwvZGl2PgotICAgIAk8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZGVsaXZlcmFibGUueHNsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2RlbGl2ZXJhYmxlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGNhZjgwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZGVsaXZlcmFibGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0id29ya3Byb2R1Y3QueHNsIi8+Ci0JCi0JCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdEZWxpdmVyYWJsZURlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQkJCi0JCTxodG1sPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4gCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPCEtLSA8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+IC0tPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICcnLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHVycG9zZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZWxpdmVyYWJsZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3RJbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkZWxpdmVyYWJsZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXlDb25zaWRlcmF0aW9uc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWlsb3JpbmdTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZWxpdmVyYWJsZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkJCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkZWxpdmVyYWJsZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXh0ZXJuYWxEZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdleHRlcm5hbERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZGVsaXZlcmVkV29ya1Byb2R1Y3RzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2luZ0d1aWRhbmNlIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3BhY2thZ2luZ0d1aWRhbmNlJ10iLz4KLQkJCi0JCTx4c2w6aWYgdGVzdD0iJGV4dGVybmFsRGVzY3JpcHRpb24gIT0gJycgb3IgY291bnQoJGRlbGl2ZXJlZFdvcmtQcm9kdWN0cykgPiAwIG9yICRwYWNrYWdpbmdHdWlkYW5jZSAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZWxpdmVyYWJsZVByb3BlcnRpZXNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvbiAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlcm5hbERlc2NyaXB0aW9uVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRleHRlcm5hbERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkZWxpdmVyZWRXb3JrUHJvZHVjdHMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZWxpdmVyZWRQYXJ0c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZGVsaXZlcmVkV29ya1Byb2R1Y3RzIj4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRwYWNrYWdpbmdHdWlkYW5jZSAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdpbmdJbnN0cnVjdGlvbnNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHBhY2thZ2luZ0d1aWRhbmNlIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2d1aWRhbmNlLnhzbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyMmFlYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2d1aWRhbmNlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImhlbHBlci54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Rvb2wnXS9FbGVtZW50W0BUeXBlPSdUb29sJ10iLz4KLQkJCi0JCTxodG1sPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVG9vbE1lbnRvciciPgotCQkJCQk8bWV0YSBuYW1lPSJ0b29sIiBjb250ZW50PSJ7JHRvb2wvQERpc3BsYXlOYW1lfSIvPgotCQkJCTwveHNsOmlmPgotCQkJCTwhLS0gPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPiAtLT4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAgJycsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmZXJlbmNlTGlzdCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnRFbGVtZW50cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdjb250ZW50RWxlbWVudHMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjb250ZW50RWxlbWVudHMpICArIGNvdW50KCRjYXRlZ29yaWVzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJHJlbGF0ZWRFbGVtZW50c1RleHQiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGNvbnRlbnRFbGVtZW50cyIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCQotCQkKLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCQkJPCEtLSB1c2UgdGhlIHNwZWNpZmljIG5hbWVkIGxpc3QsICBvdGhlcndpc2UsIHRoZSB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgd2lsbCBiZSBpbmNsdWRlZCAsIGJ1ZyAxNjM4ODUgIC0tPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J2NoZWNrbGlzdHMnXS9FbGVtZW50W0BUeXBlPSdDaGVja2xpc3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdjb25jZXB0c0FuZFBhcGVycyddL0VsZW1lbnRbQFR5cGU9J0NvbmNlcHQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J2d1aWRlbGluZXMnXS9FbGVtZW50W0BUeXBlPSdHdWlkZWxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J3N1cHBvcnRpbmdNYXRlcmlhbHMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSAhPSdjb250ZW50RWxlbWVudHMnXS9FbGVtZW50W0BUeXBlPSdUb29sTWVudG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nY29uY2VwdHNBbmRQYXBlcnMnXS9FbGVtZW50W0BUeXBlPSdXaGl0ZXBhcGVyJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleGFtcGxlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nZXhhbXBsZXMnXS9FbGVtZW50W0BUeXBlPSdFeGFtcGxlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nYXNzZXRzJ10vRWxlbWVudFtAVHlwZT0nUmV1c2FibGVBc3NldCddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpICsgY291bnQoJGNvbmNlcHRzKSArIGNvdW50KCRndWlkZWxpbmVzKSArIGNvdW50KCRzdXBwb3J0aW5nTWF0ZXJpYWxzKSArIGNvdW50KCR0b29sTWVudG9ycykgKyBjb3VudCgkd2hpdGVQYXBlcnMpICsgY291bnQoJHJldXNhYmxlQXNzZXRzKSArIGNvdW50KCRleGFtcGxlcykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vcmVJbmZvVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0iJGNoZWNrbGlzdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSIkY29uY2VwdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEV4YW1wbGVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJleGFtcGxlcyIgc2VsZWN0PSIkZXhhbXBsZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEd1aWRlbGluZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0iJGd1aWRlbGluZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJldXNhYmxlQXNzZXRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgc2VsZWN0PSIkcmV1c2FibGVBc3NldHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFRvb2xNZW50b3JzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSIkdG9vbE1lbnRvcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSIkd2hpdGVQYXBlcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZV93aXRoX2F0dGFjaG1lbnQueHNsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2d1aWRhbmNlX3dpdGhfYXR0YWNobWVudC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhYzkzZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2d1aWRhbmNlX3dpdGhfYXR0YWNobWVudC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCTx4c2w6aW5jbHVkZSBocmVmPSJoZWxwZXIueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRvb2wiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSd0b29sJ10vRWxlbWVudFtAVHlwZT0nVG9vbCddIi8+Ci0JCQotCQk8aHRtbD4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rvb2xNZW50b3InIj4KLQkJCQkJPG1ldGEgbmFtZT0idG9vbCIgY29udGVudD0ieyR0b29sL0BEaXNwbGF5TmFtZX0iLz4KLQkJCQk8L3hzbDppZj4KLQkJCQk8IS0tIDxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4gLS0+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgICcnLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmZXJlbmNlTGlzdCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnRFbGVtZW50cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdjb250ZW50RWxlbWVudHMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjb250ZW50RWxlbWVudHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0ZWRFbGVtZW50c1RleHQiLz4KLQkJCQkJCTwvdGg+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjb250ZW50RWxlbWVudHMiPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdtYWluRGVzY3JpcHRpb24nXSIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYXR0YWNobWVudHMiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nYXR0YWNobWVudHMnXSIvPgkJCQkKLQkJCi0JCTx4c2w6aWYgdGVzdD0iJG1haW5EZXNjcmlwdGlvbiAhPSAnJyBvciAkYXR0YWNobWVudHMgIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVzY3JpcHRpb25UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+CQkJCi0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkbWFpbkRlc2NyaXB0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkbWFpbkRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQkKLQkJCQkJPHhzbDppZiB0ZXN0PSIkYXR0YWNobWVudHMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXR0YWNoZWRGaWxlc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPFVMPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdhdHRhY2hlZEZpbGUnXSI+Ci0JCQkJCQkJCTxsaT4KLQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InRhcmdldCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidfYmxhbmsnIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZmlsZU5hbWUiLz4KLQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC9VTD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQkJCTwhLS0gdXNlIHRoZSBzcGVjaWZpYyBuYW1lZCBsaXN0LCAgb3RoZXJ3aXNlLCB0aGUgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IHdpbGwgYmUgaW5jbHVkZWQgLCBidWcgMTYzODg1ICAtLT4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdjaGVja2xpc3RzJ10vRWxlbWVudFtAVHlwZT0nQ2hlY2tsaXN0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nY29uY2VwdHNBbmRQYXBlcnMnXS9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdndWlkZWxpbmVzJ10vRWxlbWVudFtAVHlwZT0nR3VpZGVsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdzdXBwb3J0aW5nTWF0ZXJpYWxzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRvb2xNZW50b3JzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgIT0nY29udGVudEVsZW1lbnRzJ10vRWxlbWVudFtAVHlwZT0nVG9vbE1lbnRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J2NvbmNlcHRzQW5kUGFwZXJzJ10vRWxlbWVudFtAVHlwZT0nV2hpdGVwYXBlciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXhhbXBsZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J2V4YW1wbGVzJ10vRWxlbWVudFtAVHlwZT0nRXhhbXBsZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmV1c2FibGVBc3NldHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J2Fzc2V0cyddL0VsZW1lbnRbQFR5cGU9J1JldXNhYmxlQXNzZXQnXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjaGVja2xpc3RzKSArIGNvdW50KCRjb25jZXB0cykgKyBjb3VudCgkZ3VpZGVsaW5lcykgKyBjb3VudCgkc3VwcG9ydGluZ01hdGVyaWFscykgKyBjb3VudCgkdG9vbE1lbnRvcnMpICsgY291bnQoJHdoaXRlUGFwZXJzKSArIGNvdW50KCRyZXVzYWJsZUFzc2V0cykgKyBjb3VudCgkZXhhbXBsZXMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb3JlSW5mb1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFeGFtcGxlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZXhhbXBsZXMiIHNlbGVjdD0iJGV4YW1wbGVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZXVzYWJsZUFzc2V0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmV1c2FibGVBc3NldHMiIHNlbGVjdD0iJHJldXNhYmxlQXNzZXRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRUb29sTWVudG9ycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0iJHRvb2xNZW50b3JzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRXaGl0ZVBhcGVycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0iJHdoaXRlUGFwZXJzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvaGVscGVyLnhzbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9oZWxwZXIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzBjYjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9oZWxwZXIueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTMyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFkZGl0aW9uYWxJbmZvVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhZGRpdGlvbmFsUGVyZm9ybWVyVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYWRkaXRpb25hbFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFnZ3JlZ2F0ZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhbHRlcm5hdGl2ZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhcHBsaWNhdGlvblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFzc2V0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYXNzaXN0aW5nVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYXR0YWNoZWRGaWxlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImJhY2tncm91bmRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJiYXNlZE9uTWV0aG9kUm9sZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImJhc2VkT25NZXRob2RUYXNrVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYmFzZWRPbk1ldGhvZFdvcmtQcm9kdWN0VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYnJlYWtkb3duRWxlbWVudFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImJyaWVmT3V0bGluZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNhdGVnb3JpZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjaGVja0l0ZW1zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY2hlY2tsaXN0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNoZWNrbGlzdFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbGxhcHNlQWxsVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjb25jZXB0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRhaW5lckFydGlmYWN0VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudEVsZW1lbnRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudFJlZmVyZW5jZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRleHRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjb250cmlidXRlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImRlbGl2ZXJhYmxlUHJvcGVydGllc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImRlbGl2ZXJlZFBhcnRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZGVwZW5kZW50VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb25UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJkaXNjaXBsaW5lc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImRpc2NpcGxpbmVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJkb21haW5zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZWR1Y2F0aW9uTWF0ZXJpYWxzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudERvZXNOb3RFeGlzdFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRNaWdodEJlRGVsZXRlZFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnROYW1lVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFR5cGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJlbnRyeVN0YXRlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXN0aW1hdGluZ1RlY2huaXF1ZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImV2ZW50RHJpdmVuVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXhhbXBsZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJleGl0U3RhdGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJleHBhbmRBbGxUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJleHRlbmRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXh0ZXJuYWxEZXNjcmlwdGlvblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImV4dGVybmFsSWRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJleHRlcm5hbFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImdvYWxzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZ3VpZGVsaW5lc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Imd1aWRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJpbGx1c3RyYXRpb25zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iaW1wYWN0aW5nVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iaW1wYWN0T2ZOb3RIYXZpbmdUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJpbmNsdWRlZFBhdHRlcm5zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iaW5kZXhUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJpbmZvQWJvdXRNaXNzaW5nRWxlbWVudFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImlucHV0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImlucHV0VG9UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJpc05vdFZhbGlkVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibWFpbkRlc2NyaXB0aW9uVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibWFpblJlc3BvbnNpYmxlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibWFpblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1hbmRhdG9yeVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1pc3NpbmdFbGVtZW50VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibW9kZWxJbmZvVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibW9kaWZpZWRCeVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1vZGlmaWVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibW9yZUluZm9UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJtdWx0aXBsZU9jY3VycmVuY2VzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibm9uZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im5vdGF0aW9uVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibm90QXZhaWxhYmxlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ib25nb2luZ1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im9wdGlvbmFsVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ib3V0cHV0RnJvbVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im91dHB1dHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBhY2thZ2luZ0luc3RydWN0aW9uc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBhZ2VOb3RJbnN0YWxsZWRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwYXJlbnRBY3Rpdml0aWVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGVyZm9ybWluZ1JvbGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGVyZm9ybXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwbGFubmVkVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGxhbm5pbmdEYXRhVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGxlYXNlRml4TGlua1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBsdWdpbk5hbWVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcmVkZWNlc3NvcnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcmVkZWNlc3NvclRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InByZWZpeFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InByaW1hcnlQZXJmb3JtZXJUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcm9ibGVtVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHJvamVjdENoYXJhY3RlcmlzdGljc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InByb2plY3RNZW1iZXJFeHBlcnRpc2VUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcm9qZWN0U3BlY2lmaWNzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHJvcGVydGllc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InB1cnBvc2VUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZWFzb25zRm9yTm90TmVlZGluZ1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlZmVyZW5jZVdvcmtmbG93c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlbGF0ZWRFbGVtZW50c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlbGF0aW9uc2hpcHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZXBlYXRhYmxlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVwbGFjZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZXBvcnRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVwcmVzZW50YXRpb25PcHRpb25zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVzcG9uc2libGVGb3JUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZXNwb25zaWJsZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJldXNhYmxlQXNzZXRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmlza0xldmVsVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icm9hZG1hcFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJvbGVTZXRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icm9sZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzY2FsZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InNjb3BlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic2tpbGxzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3RhZmZpbmdUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdGVwc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InN1YmNhdGVnb3JpZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdWJkb21haW5zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3ViUHJhY3RpY2VzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3ViVGVhbXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdW1tYXJ5VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFsc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InN5bm9ueW1zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idGFpbG9yaW5nVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idGFza3NUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0YnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0ZWFtUHJvZmlsZUJyZWFrZG93blRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRlYW1Sb2xlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRlYW1TdHJ1Y3R1cmVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0ZWFtVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idGVjaG5pcXVlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRlbXBsYXRlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRvb2xNZW50b3JzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idG9vbFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InR5cGVvZkNvbnRyYWN0VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idHlwZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InVzYWdlR3VpZGFuY2VUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ1c2FnZU5vdGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idXNhZ2VUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3YnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3aGl0ZXBhcGVyc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9IndvcmtCcmVha2Rvd25UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3b3JrZmxvd1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9IndvcmtQcm9kdWN0QnJlYWtkb3duVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0id29ya1Byb2R1Y3REZXBlbmRlbmNpZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3b3JrUHJvZHVjdHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3b3JrUHJvZHVjdFR5cGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0id3Bic1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbG9uX3dpdGhfc3BhY2UiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InN1YmRpc2NpcGxpbmVzVGV4dCIvPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQk8bWV0YSBuYW1lPSJ1bWEudHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJPG1ldGEgbmFtZT0idW1hLm5hbWUiIGNvbnRlbnQ9InskZWxlbWVudE5hbWV9Ii8+Ci0JCTxtZXRhIG5hbWU9InVtYS5wcmVzZW50YXRpb25OYW1lIiBjb250ZW50PSJ7JGVsZW1lbnRQcmVzZW50YXRpb25OYW1lfSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlJyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icm9sZU1ldGFJbmZvIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUYXNrJyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFza01ldGFJbmZvIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdBcnRpZmFjdCcgb3IgJGVsZW1lbnRUeXBlID0gJ0RlbGl2ZXJhYmxlJyBvciAkZWxlbWVudFR5cGUgPSAnT3V0Y29tZSciPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IndvcmtQcm9kdWN0TWV0YUluZm8iLz4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rvb2xNZW50b3InIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0b29sTWVudG9yTWV0YUluZm8iLz4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdE1ldGFJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkb21haW5zIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2RvbWFpbnMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RUeXBlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSd3b3JrUHJvZHVjdFR5cGVzJ10vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3RUeXBlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZG9tYWlucykgPiAwIj4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZG9tYWlucyI+Ci0JCQkJPG1ldGEgbmFtZT0idW1hLmNhdGVnb3J5IiBjb250ZW50PSJAVHlwZTpATmFtZTpARGlzcGxheU5hbWUiLz4KLQkJCTwveHNsOmZvci1lYWNoPgotCQk8L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RUeXBlcykgPiAwIj4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya1Byb2R1Y3RUeXBlcyI+Ci0JCQkJPG1ldGEgbmFtZT0idW1hLmNhdGVnb3J5IiBjb250ZW50PSJ7JHdvcmtQcm9kdWN0VHlwZXMvQFR5cGV9Onskd29ya1Byb2R1Y3RUeXBlcy9ATmFtZX06eyR3b3JrUHJvZHVjdFR5cGVzL0BEaXNwbGF5TmFtZX0iLz4KLQkJCTwveHNsOmZvci1lYWNoPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InRhc2tNZXRhSW5mbyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGlzY2lwbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZGlzY2lwbGluZXMnXS9FbGVtZW50W0BUeXBlPSdEaXNjaXBsaW5lJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZGlzY2lwbGluZXMpID4gMCI+Ci0JCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRpc2NpcGxpbmVzIj4KLQkJCQk8bWV0YSBuYW1lPSJ1bWEuY2F0ZWdvcnkiIGNvbnRlbnQ9InskZGlzY2lwbGluZXMvQFR5cGV9OnskZGlzY2lwbGluZXMvQE5hbWV9OnskZGlzY2lwbGluZXMvQERpc3BsYXlOYW1lfSIvPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icm9sZU1ldGFJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyb2xlU2V0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyb2xlU2V0cyddL0VsZW1lbnRbQFR5cGU9J1JvbGVTZXQnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRyb2xlU2V0cy9ATmFtZSAhPSAnJyI+Ci0JCQk8bWV0YSBuYW1lPSJ1bWEuY2F0ZWdvcnkiIGNvbnRlbnQ9Inskcm9sZVNldHMvQFR5cGV9Onskcm9sZVNldHMvQE5hbWV9Onskcm9sZVNldHMvQERpc3BsYXlOYW1lfSIvPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InRvb2xNZW50b3JNZXRhSW5mbyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Rvb2wnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iJHRvb2wvQE5hbWUgIT0gJyciPgotCQkJPG1ldGEgbmFtZT0idW1hLmNhdGVnb3J5IiBjb250ZW50PSJ7JHRvb2wvQFR5cGV9OnskdG9vbC9ATmFtZX06eyR0b29sL0BEaXNwbGF5TmFtZX0iLz4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iYmFja1BhdGgiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVmaXgiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdwcmVmaXgnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdicmllZkRlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzeW5vbnltcyIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3N5bm9ueW1zJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleHRlcm5hbElkIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nZXh0ZXJuYWxJZCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPGRpdiBpZD0icGFnZS1ndWlkIiA+PHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2d1aWQnXSIvPjwveHNsOmF0dHJpYnV0ZT48L2Rpdj4KLQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCTx0cj4KLQkJCQk8dGQgY2xhc3M9InBhZ2VUaXRsZSIgbm93cmFwPSJ0cnVlIj4KLQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0N1c3RvbUNhdGVnb3J5JyBvciAkZWxlbWVudFR5cGUgPSAnU3VwcG9ydGluZ01hdGVyaWFsJyBvciAkZWxlbWVudFR5cGUgPSAnU3VtbWFyeSciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJHByZWZpeCAhPSAnJyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByZWZpeCIvPiAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRleHRlcm5hbElkICE9ICcnIj4KLQkJCQkJCSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVybmFsSWQiLz4pCi0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGQ+Ci0JCQkJPHhzbDppZiB0ZXN0PSIkc2hvd1RyZWVCcm93c2VyIj4KLQkJCQkJPHRkIHdpZHRoPSIxMDAlIiBjbGFzcz0iZXhwYW5kQ29sbGFwc2VMaW5rIiBhbGlnbj0icmlnaHQiPgotCQkJCQkJPGEgbmFtZT0ibWFpbkluZGV4IiBocmVmPSJ7JGJhY2tQYXRofWluZGV4Lmh0bSIvPgotCQkJCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InskYmFja1BhdGh9c2NyaXB0cy90cmVlYnJvd3Nlci5qcyIvPgotCQkJCQk8L3RkPgotCQkJCTwveHNsOmlmPgotCQkJPC90cj4KLQkJPC90YWJsZT4KLQkJPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNsYXNzPSJwYWdlVGl0bGVTZXBhcmF0b3IiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGFsdD0iIiB0aXRsZT0iIiBoZWlnaHQ9IjEiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC90YWJsZT4KLQkJPHhzbDpjaG9vc2U+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0N1c3RvbUNhdGVnb3J5JyBhbmQgJGJyaWVmRGVzY3JpcHRpb24gPSAnJyI+Ci0JCQkJPGJyLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOm90aGVyd2lzZT4KLQkJCQk8ZGl2IGNsYXNzPSJvdmVydmlldyI+Ci0JCQkJCTx0YWJsZSB3aWR0aD0iOTclIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCQk8dHI+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSIkYnJpZWZEZXNjcmlwdGlvbiAhPSAnJyI+Ci0JCQkJCQkJCTx0ZCB3aWR0aD0iNTAiPgotCQkJCQkJCQkJPGltZyBzcmM9InskZWxlbWVudEljb259IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCQkJCQk8L3RkPgotCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTx0ZD4KLQkJCQkJCQkJPHRhYmxlIGNsYXNzPSJvdmVydmlld1RhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCQkJCQk8dHI+Ci0JCQkJCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRicmllZkRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJCQkJPC90ZD4KLQkJCQkJCQkJCTwvdHI+Ci0JCQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGUnIj4KLQkJCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJvbGVLZXlJbmZvIi8+Ci0JCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rhc2snIj4KLQkJCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhc2tLZXlJbmZvIi8+Ci0JCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0FydGlmYWN0JyBvciAkZWxlbWVudFR5cGUgPSAnRGVsaXZlcmFibGUnIG9yICRlbGVtZW50VHlwZSA9ICdPdXRjb21lJyI+Ci0JCQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdEtleUluZm8iLz4KLQkJCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVG9vbE1lbnRvciciPgotCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idG9vbE1lbnRvcktleUluZm8iLz4KLQkJCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGFza0Rlc2NyaXB0b3InIj4KLQkJCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhc2tEZXNjcmlwdG9yS2V5SW5mbyIvPgotCQkJCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlRGVzY3JpcHRvciciPgotCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icm9sZURlc2NyaXB0b3JLZXlJbmZvIi8+Ci0JCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1dvcmtQcm9kdWN0RGVzY3JpcHRvciciPgotCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3REZXNjcmlwdG9yS2V5SW5mbyIvPgotCQkJCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFzZUVsZW1lbnQiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSd2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50J10vRWxlbWVudCIvPgotCQkJCQkJCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J3ZhcmlhYmlsaXR5VHlwZSddIi8+Ci0JCQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGJhc2VFbGVtZW50KSA+IDAiPgotCQkJCQkJCQkJCQkJPHRyPgotCQkJCQkJCQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdyZXBsYWNlcyciPgotCQkJCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXBsYWNlc1RleHQiLz4KLQkJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQkJCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJCQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2NvbnRyaWJ1dGVzJyAiPgotCQkJCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb250cmlidXRlc1RleHQiLz4KLQkJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQkJCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJCQkJCQkJPCEtLSBkaXNwbGF5IGxvY2FsQ09udHJpYnV0aW9uIGFuZCBsb2NhbFJlcGxhY2VtZW50IGFzIGV4dGVuZHMgZm9yIG5vdyAtLT4KLQkJCQkJCQkJCQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2V4dGVuZHMnIG9yICR2YXJpYWJpbGl0eVR5cGUgPSAnbG9jYWxDb250cmlidXRpb24nIG9yICR2YXJpYWJpbGl0eVR5cGUgPSAnbG9jYWxSZXBsYWNlbWVudCcgIj4KLQkJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1RleHQiLz4KLQkJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQkJCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRiYXNlRWxlbWVudCI+Ci0JCQkJCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCQkJCQk8L3RkPgotCQkJCQkJCQkJCQkJPC90cj4KLQkJCQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQkJCQk8L3RhYmxlPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3RhYmxlPgotCQkJCTwvZGl2PgotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQk8L3hzbDpjaG9vc2U+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyb2xlS2V5SW5mbyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3lub255bXMiIHNlbGVjdD0icmVmZXJlbmNlL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdzeW5vbnltcyddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFzZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSd2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50J10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icm9sZVNldHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncm9sZVNldHMnXS9FbGVtZW50W0BUeXBlPSdSb2xlU2V0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSd2YXJpYWJpbGl0eVR5cGUnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRzeW5vbnltcyAhPSAnJyI+Ci0JCQk8dHI+Ci0JCQkJPHRkPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN5bm9ueW1zVGV4dCIvPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRzeW5vbnltcyIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYmFzZVJvbGUpID4gMCI+Ci0JCQk8dHI+Ci0JCQkJPHRkPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAncmVwbGFjZXMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVwbGFjZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdjb250cmlidXRlcyciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb250cmlidXRlc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2V4dGVuZHMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRiYXNlUm9sZSI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHJvbGVTZXRzKSA+IDAiPgotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaXplIiBzZWxlY3Q9ImNvdW50KCRyb2xlU2V0cykiLz4KLQkJCTx0cj4KLQkJCQk8dGQ+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZVNldHNUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJvbGVTZXRzIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgIT0gJHNpemUiPiwmIzE2MDs8L3hzbDppZj4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icm9sZURlc2NyaXB0b3JLZXlJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzb3VyY2VSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0nUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSIvRWxlbWVudC9AU2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCA9ICdmYWxzZScgYW5kIGNvdW50KCRzb3VyY2VSb2xlKSA+IDAiPgotCQkJPHRyPgotCQkJCTx0ZD4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlZE9uTWV0aG9kUm9sZVRleHQiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc291cmNlUm9sZSI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0YXNrS2V5SW5mbyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGlzY2lwbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZGlzY2lwbGluZXMnXS9FbGVtZW50W0BUeXBlPSdEaXNjaXBsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYXNlVGFzayIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0ndmFyaWFiaWxpdHlUeXBlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZGlzY2lwbGluZXMpID4gMCI+Ci0JCQk8dHI+Ci0JCQkJPHRkPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRpc2NpcGxpbmVzVGV4dCIvPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkaXNjaXBsaW5lcyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZGlzY2lwbGluZXMpID4gcG9zaXRpb24oKSI+LCYjMTYwOzwveHNsOmlmPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYmFzZVRhc2spID4gMCI+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkaXNjaXBsaW5lcykgPiAwIj4KLQkJCQkJCQk8YnIvPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAncmVwbGFjZXMnIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcGxhY2VzVGV4dCIvPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnY29udHJpYnV0ZXMnIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRyaWJ1dGVzVGV4dCIvPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnZXh0ZW5kcyciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1RleHQiLz4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJCTwveHNsOmlmPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRiYXNlVGFzayI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InRhc2tEZXNjcmlwdG9yS2V5SW5mbyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic291cmNlVGFzayIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J1Rhc2snXS9FbGVtZW50W0BUeXBlPSdUYXNrJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iL0VsZW1lbnQvQFNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQk8eHNsOmlmIHRlc3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQgPSAnZmFsc2UnIGFuZCBjb3VudCgkc291cmNlVGFzaykgPiAwIj4KLQkJCTx0cj4KLQkJCQk8dGQ+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZWRPbk1ldGhvZFRhc2tUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHNvdXJjZVRhc2siPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3REZXNjcmlwdG9yS2V5SW5mbyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic291cmNlV29ya1Byb2R1Y3QiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdXb3JrUHJvZHVjdCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iL0VsZW1lbnQvQFNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQk8eHNsOmlmIHRlc3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQgPSAnZmFsc2UnIGFuZCBjb3VudCgkc291cmNlV29ya1Byb2R1Y3QpID4gMCI+Ci0JCQk8dHI+Ci0JCQkJPHRkPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhc2VkT25NZXRob2RXb3JrUHJvZHVjdFRleHQiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc291cmNlV29ya1Byb2R1Y3QiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3RLZXlJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkb21haW5zIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2RvbWFpbnMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFzZVdvcmtQcm9kdWN0IiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdFR5cGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3dvcmtQcm9kdWN0VHlwZXMnXS9FbGVtZW50W0BUeXBlPSdXb3JrUHJvZHVjdFR5cGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J3ZhcmlhYmlsaXR5VHlwZSddIi8+Ci0JCTx0cj4KLQkJCTx0ZD4KLQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkb21haW5zKSA+IDAiPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRvbWFpbnNUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRvbWFpbnMiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGRvbWFpbnMpID4gcG9zaXRpb24oKSI+LCYjMTYwOzwveHNsOmlmPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR3b3JrUHJvZHVjdFR5cGVzKSA+IDAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkb21haW5zKSA+IDAiPgotCQkJCQkJPGJyLz4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3RUeXBlc1RleHQiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya1Byb2R1Y3RUeXBlcyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RUeXBlcykgPiBwb3NpdGlvbigpIj4sJiMxNjA7PC94c2w6aWY+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGJhc2VXb3JrUHJvZHVjdCkgPiAwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZG9tYWlucykgKyBjb3VudCgkd29ya1Byb2R1Y3RUeXBlcykgPiAwIj4KLQkJCQkJCTxici8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAncmVwbGFjZXMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVwbGFjZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdjb250cmlidXRlcyciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb250cmlidXRlc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2V4dGVuZHMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRiYXNlV29ya1Byb2R1Y3QiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L3RkPgotCQk8L3RyPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0idG9vbE1lbnRvcktleUluZm8iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRvb2wiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSd0b29sJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhc2VFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSd2YXJpYWJpbGl0eVR5cGUnXSIvPgotCQk8dHI+Ci0JCQk8dGQ+Ci0JCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkdG9vbCkgPiAwIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0b29sVGV4dCIvPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0b29sIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGJhc2VFbGVtZW50KSA+IDAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR0b29sKSAgPiAwIj4KLQkJCQkJCTxici8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAncmVwbGFjZXMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVwbGFjZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdjb250cmlidXRlcyciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb250cmlidXRlc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2V4dGVuZHMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRiYXNlRWxlbWVudCI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3hzbDppZj4KLQkJCTwvdGQ+Ci0JCTwvdHI+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJvdmVydmlld1NlcGFyYXRvciI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHRhYmxlIGlkPSJvdmVydmlld1NlcGFyYXRvciIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KLQkJCTx0cj4KLQkJCQk8dGQgY2xhc3M9Im92ZXJ2aWV3U2VwYXJhdG9yIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBhbHQ9IiIgdGl0bGU9IiIgaGVpZ2h0PSIxIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGFsdD0iIiB0aXRsZT0iIiBoZWlnaHQ9IjUiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC90YWJsZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImlsbHVzdHJhdGlvbnNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleGFtcGxlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0V4YW1wbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJldXNhYmxlQXNzZXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nUmV1c2FibGVBc3NldCddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGV4YW1wbGVzKSArIGNvdW50KCRyZXVzYWJsZUFzc2V0cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlsbHVzdHJhdGlvbnNUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRXhhbXBsZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImV4YW1wbGVzIiBzZWxlY3Q9IiRleGFtcGxlcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmV1c2FibGVBc3NldHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJldXNhYmxlQXNzZXRzIiBzZWxlY3Q9IiRyZXVzYWJsZUFzc2V0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwdXJwb3NlU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwdXJwb3NlIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3B1cnBvc2UnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRwdXJwb3NlICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHB1cnBvc2VUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHB1cnBvc2UiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJrZXlDb25zaWRlcmF0aW9ucyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdrZXlDb25zaWRlcmF0aW9ucyddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJGtleUNvbnNpZGVyYXRpb25zICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGtleUNvbnNpZGVyYXRpb25zVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRrZXlDb25zaWRlcmF0aW9ucyIvPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZXhhbXBsZXNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleGFtcGxlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdleGFtcGxlcyddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJGV4YW1wbGVzICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4YW1wbGVzVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGV4YW1wbGVzL0VsZW1lbnRbQFR5cGU9J0V4YW1wbGUnXSI+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvblNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J21haW5EZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJG1haW5EZXNjcmlwdGlvbiAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYWluRGVzY3JpcHRpb25UZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvbiIvPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVmaW5lZERlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncmVmaW5lZERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkcmVmaW5lZERlc2NyaXB0aW9uICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvblRleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkcmVmaW5lZERlc2NyaXB0aW9uIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhc3NldHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1JldXNhYmxlQXNzZXQnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRyZXVzYWJsZUFzc2V0cyAhPSAnJyAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXNzZXRzVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJldXNhYmxlQXNzZXRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgc2VsZWN0PSIkcmV1c2FibGVBc3NldHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYW5vdGF0aW9uU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJicmllZk91dGxpbmUiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nYnJpZWZPdXRsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXByZXNlbnRhdGlvbk9wdGlvbnMiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncmVwcmVzZW50YXRpb25PcHRpb25zJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkYnJpZWZPdXRsaW5lICE9ICcnIG9yICRyZXByZXNlbnRhdGlvbk9wdGlvbnMgIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbm90YXRpb25UZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRicmllZk91dGxpbmUgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJyaWVmT3V0bGluZVRleHQiLz4KLQkJCQkJCQk8L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkYnJpZWZPdXRsaW5lIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRyZXByZXNlbnRhdGlvbk9wdGlvbnMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQiLz4KLQkJCQkJCQk8L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkcmVwcmVzZW50YXRpb25PcHRpb25zIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0YWlsb3JpbmdTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltcGFjdE9mTm90SGF2aW5nIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2ltcGFjdE9mTm90SGF2aW5nJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWFzb25zRm9yTm90TmVlZGluZyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdyZWFzb25zRm9yTm90TmVlZGluZyddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVwcmVzZW50YXRpb25PcHRpb25zIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3JlcHJlc2VudGF0aW9uT3B0aW9ucyddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJGltcGFjdE9mTm90SGF2aW5nICE9ICcnIG9yICRyZWFzb25zRm9yTm90TmVlZGluZyAhPSAnJyBvciAkcmVwcmVzZW50YXRpb25PcHRpb25zICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhaWxvcmluZ1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGltcGFjdE9mTm90SGF2aW5nICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbXBhY3RPZk5vdEhhdmluZ1RleHQiLz4KLQkJCQkJCQk8L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkaW1wYWN0T2ZOb3RIYXZpbmciLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHJlYXNvbnNGb3JOb3ROZWVkaW5nICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWFzb25zRm9yTm90TmVlZGluZ1RleHQiLz4KLQkJCQkJCQk8L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkcmVhc29uc0Zvck5vdE5lZWRpbmciLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHJlcHJlc2VudGF0aW9uT3B0aW9ucyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVwcmVzZW50YXRpb25PcHRpb25zVGV4dCIvPgotCQkJCQkJCTwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRyZXByZXNlbnRhdGlvbk9wdGlvbnMiLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29weXJpZ2h0Ii8+Ci0JCTx0YWJsZSBjbGFzcz0iY29weXJpZ2h0IiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNsYXNzPSJjb3B5cmlnaHQiPgotCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3RhYmxlPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZ2VuZXJhbFRleHRGaWVsZFNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJmaWVsZFRleHQiLz4KLQkJPHhzbDppZiB0ZXN0PSIkZmllbGRUZXh0ICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpZWxkTGFiZWwiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkZmllbGRUZXh0Ii8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjaGVja2xpc3RzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2hlY2tsaXN0c1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkY2hlY2tsaXN0cyI+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbmNlcHRzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNvbmNlcHRzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbmNlcHRzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjb25jZXB0cyI+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkRXhhbXBsZXMiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImV4YW1wbGVzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGV4YW1wbGVzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4YW1wbGVzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRleGFtcGxlcyI+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZ3VpZGVsaW5lcyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRndWlkZWxpbmVzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGd1aWRlbGluZXNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGd1aWRlbGluZXMiPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZFJlcG9ydHMiPgotCQk8eHNsOnBhcmFtIG5hbWU9InJlcG9ydHMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVwb3J0cykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXBvcnRzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyZXBvcnRzIj4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRSZXVzYWJsZUFzc2V0cyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icmV1c2FibGVBc3NldHMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmV1c2FibGVBc3NldHMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmV1c2FibGVBc3NldHNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJldXNhYmxlQXNzZXRzIj4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFsc1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFscyI+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkVGVjaG5pcXVlcyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0idGVjaG5pcXVlcyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR0ZWNobmlxdWVzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlY2huaXF1ZXNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRlY2huaXF1ZXMiPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZFRlbXBsYXRlcyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0idGVtcGxhdGVzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHRlbXBsYXRlcykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZW1wbGF0ZXNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRlbXBsYXRlcyI+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQk8eHNsOnBhcmFtIG5hbWU9IndoaXRlUGFwZXJzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHdoaXRlUGFwZXJzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdoaXRlcGFwZXJzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3aGl0ZVBhcGVycyI+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRUb29sTWVudG9ycyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0idG9vbE1lbnRvcnMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkdG9vbE1lbnRvcnMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG9vbE1lbnRvcnNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRvb2xNZW50b3JzIj4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPCEtLSBhZGQgZ2VuZXJhbCByZWZlcmVuY2VzIC0tPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icmVmTmFtZSIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InJlZkVsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSIkcmVmRWxlbWVudCI+Ci0JCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZWZFbGVtZW50KT4wIj4KLQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWZOYW1lIi8+Ci0JCQkJCTwvdGg+Ci0JCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQk8dWw+Ci0JCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyZWZFbGVtZW50Ij4KLQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJPC9saT4KLQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCTwvdWw+Ci0JCQkJCTwvdGQ+Ci0JCQkJPC90cj4KLQkJCTwveHNsOmlmPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im5vdGF0aW9uU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2V4dGVybmFsRGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2luZ0d1aWRhbmNlIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3BhY2thZ2luZ0d1aWRhbmNlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvbiAhPSAnJyBvciAkcGFja2FnaW5nR3VpZGFuY2UgIT0gJycgIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5vdGF0aW9uVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvbiAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvblRleHQiLz4KLQkJCQkJCQk8L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkcGFja2FnaW5nR3VpZGFuY2UgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2luZ0d1aWRhbmNlVGV4dCIvPgotCQkJCQkJCTwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRwYWNrYWdpbmdHdWlkYW5jZSIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJmaWVsZFRleHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRmaWVsZFRleHQgIT0gJycgIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaWVsZExhYmVsIi8+Ci0JCQkJPC90aD4KLQkJCQk8eHNsOmNob29zZT4KLQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRmaWVsZFRleHQgPSAndHJ1ZScgb3IgJGZpZWxkVGV4dCA9ICdmYWxzZSciPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBhbGlnbj0ibGVmdCI+Ci0JCQkJCQkJPGltZyB3aWR0aD0iMjAiIGhlaWdodD0iMTUiIGFsdD0iIiB0aXRsZT0iIj4KLQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3JjIj48eHNsOmNob29zZT48eHNsOndoZW4gdGVzdD0iJGZpZWxkVGV4dCA9ICd0cnVlJyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz50cnVlLmdpZjwveHNsOndoZW4+PHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz5pbmRlbnQuZ2lmPC94c2w6b3RoZXJ3aXNlPjwveHNsOmNob29zZT48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJPC9pbWc+Ci0JCQkJCQkJPCEtLQotCQkJCQkJCTxsYWJlbCBmb3I9ImNib3gxIi8+Ci0JCQkJCQkJPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InJlYWRvbmx5Ij50cnVlPC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9IiRmaWVsZFRleHQgPSAndHJ1ZSciPgotCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2hlY2tlZCI+Y2hlY2tlZDwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImlkIj5jYm94MTwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPmNib3gxPC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJvbmNsaWNrIj48eHNsOmNob29zZT48eHNsOndoZW4gdGVzdD0iJGZpZWxkVGV4dCA9ICd0cnVlJyI+Ci0JIAkJCQkJCQkJdGhpcy5jaGVja2VkPXRydWU7Ci0gCQkJCQkJCQk8L3hzbDp3aGVuPjx4c2w6b3RoZXJ3aXNlPgotIAkJCQkJCQkJCXRoaXMuY2hlY2tlZD1mYWxzZTsKLSAJCQkJCQkJCTwveHNsOm90aGVyd2lzZT48L3hzbDpjaG9vc2U+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCTwvaW5wdXQ+Ci0JCQkJCQkJLS0+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3hzbDp3aGVuPgotCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRmaWVsZFRleHQiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8IS0tIGFkZCBnZW5lcmFsIGxpc3Qgd2l0aG91dCByZWZlcmVuY2VzIC0tPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkY29udGV4dHMiPgotCQk8eHNsOnBhcmFtIG5hbWU9InJlZk5hbWUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJyZWZFbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iJHJlZkVsZW1lbnQiPgotCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVmRWxlbWVudCk+MCI+Ci0JCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVmTmFtZSIvPgotCQkJCQk8L3RoPgotCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJPHVsPgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcmVmRWxlbWVudCI+Ci0JCQkJCQkJCTxsaT4KLQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJPC9saT4KLQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCTwvdWw+Ci0JCQkJCTwvdGQ+Ci0JCQkJPC90cj4KLQkJCTwveHNsOmlmPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudCIvPgotCQk8eHNsOmNob29zZT4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudC9AVXJsICE9ICcnICI+Ci0JCQkJPGE+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRlbGVtZW50L0BEaXNwbGF5TmFtZSIvPgotCQkJCTwvYT4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOm90aGVyd2lzZT4KLQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGVsZW1lbnQvQERpc3BsYXlOYW1lIi8+Ci0JCQk8L3hzbDpvdGhlcndpc2U+Ci0JCTwveHNsOmNob29zZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1hcHBpbmciPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6Y2hvb3NlPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUYXNrJyI+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidhY3Rpdml0eSciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUb29sTWVudG9yJyI+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iid0b29sX21lbnRvciciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdPdXRjb21lJyI+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidhcnRpZmFjdCciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEZWxpdmVyYWJsZSciPgotCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSInYXJ0aWZhY3QnIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQWN0aXZpdHknIj4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ3dvcmtmbG93X2RldGFpbCciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdDb25jZXB0JyI+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iidjb25jZXB0JyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0V4YW1wbGUnIj4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ2V4YW1wbGUnIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSInb3RoZXInIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQk8L3hzbDpjaG9vc2U+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPCEtLSBhY3Rpdml0eSBzcGVjaWZpYyBjb21tb24gdGVtcGxhdGVzIC0tPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJ1cmwiLz4KLQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR1cmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPCEtLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iaXRlbVVybEF0dHJpYnV0ZSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0idXJsIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icmVsUHJvY2Vzc1BhdGgiLz4KLQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+amF2YXNjcmlwdDpsb2NhdGlvbi5ocmVmPWdldEFjdGl2aXR5SXRlbVVybCgnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR1cmwiLz4nLCBwYXJfcHJvYywgcGFyX3BhdGgsICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbFByb2Nlc3NQYXRoIi8+Jyk7PC94c2w6YXR0cmlidXRlPgotCTwveHNsOnRlbXBsYXRlPgotLS0+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5RGlhZ3JhbSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGlhZ3JhbSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNpbmdsZS1xdW90ZSI+JzwveHNsOnZhcmlhYmxlPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNwZWNpYWwtcXVvdGUiPmA8L3hzbDp2YXJpYWJsZT4KLQkJPHAvPgotCQk8aW1nICBib3JkZXI9IjAiICBkaWFncmFtVHlwZT0ieyRkaWFncmFtL0BuYW1lfSIgPgotCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImlkIj5kaWFncmFtXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGlhZ3JhbS9AbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzcmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGlhZ3JhbS9tYXAvQHNyYyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJhbHQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoJGRpYWdyYW0vQGFsdCwkc2luZ2xlLXF1b3RlLCRzcGVjaWFsLXF1b3RlKSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSgkZGlhZ3JhbS9AYWx0LCRzaW5nbGUtcXVvdGUsJHNwZWNpYWwtcXVvdGUpIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InVzZW1hcCI+Izx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGlhZ3JhbS9tYXAvQG5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCTwvaW1nPgotCi0JCTxtYXAgbmFtZT0ieyRkaWFncmFtL21hcC9AbmFtZX0iPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkaWFncmFtL21hcC9hcmVhIj4KLQkJCQk8YXJlYT4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBocmVmIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWxQYXRoIj4sPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBndWlkIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJhbHQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYWx0Ii8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhbHQiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvb3JkcyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb29yZHMiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InNoYXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNoYXBlIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvYXJlYT4KLQkJCTwveHNsOmZvci1lYWNoPgotCQk8L21hcD4KLQotCTwveHNsOnRlbXBsYXRlPgotCTwhLS0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImNyZWF0ZVRyZWVOb2RlIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJpbmRlbnQiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJoYXNDaGlsZHJlbiIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InRpdGxlIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0idXJsIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icmVsUHJvY2Vzc1BhdGgiLz4KLQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+d3JpdGVUcmVlTm9kZVRhYmxlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5kZW50Ii8+LCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhhc0NoaWxkcmVuIi8+LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVybCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbFByb2Nlc3NQYXRoIi8+Iik7PC9zY3JpcHQ+Ci0JPC94c2w6dGVtcGxhdGU+Ci0tLT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvbWlsZXN0b25lLnhzbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9taWxlc3RvbmUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZDIxZjA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9taWxlc3RvbmUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6aW5jbHVkZSBocmVmPSJoZWxwZXIueHNsIi8+Ci0JCQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdNaWxlc3RvbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1pbGVzdG9uZURlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nTWlsZXN0b25lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkZXNjcmlwdG9yRGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24nXSIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQotCQk8aHRtbD4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4JCQkJCi0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAgJycsIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQk8eHNsOnRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydGllc1RleHQiLz48L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCSAgICA8eHNsOmlmIHRlc3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2xpbmtUb1ByZWRlY2Vzc29yJ10vRWxlbWVudCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRwcmVkZWNlc3NvclRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2xpbmtUb1ByZWRlY2Vzc29yJ10vRWxlbWVudCIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5pbmdEYXRhVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J1BsYW5uaW5nRGF0YSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG11bHRpcGxlT2NjdXJyZW5jZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRldmVudERyaXZlblRleHQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzRXZlbnREcml2ZW4nXSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT25nb2luZyddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRvbmdvaW5nVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT25nb2luZyddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkb3B0aW9uYWxUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRwbGFubmVkVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+CQkJCQotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcmVwZWF0YWJsZVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgkJCQkKLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDppZiB0ZXN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzYWdlVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkdXNhZ2VHdWlkYW5jZVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3VzYWdlR3VpZGFuY2UnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvb3V0Y29tZS54c2wgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvb3V0Y29tZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjNTBjNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL291dGNvbWUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0id29ya3Byb2R1Y3QueHNsIi8+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im91dGNvbWVEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J1dvcmtQcm9kdWN0RGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQkKLQkJPGh0bWw+CQotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4gCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPCEtLSA8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+IC0tPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InB1cnBvc2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRvdXRjb21lRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRvdXRjb21lRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdElsbHVzdHJhdGlvbnNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkb3V0Y29tZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFpbG9yaW5nU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkb3V0Y29tZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wYWdlX25vdF9pbnN0YWxsZWQueHNsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3BhZ2Vfbm90X2luc3RhbGxlZC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2Njk3NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3BhZ2Vfbm90X2luc3RhbGxlZC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9ImhlbHBlci54c2wiLz4KLQotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgkJCi0JCTxodG1sPgkKLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhZ2VOb3RJbnN0YWxsZWRUZXh0Ii8+PC90aXRsZT4KLQkJCTwvaGVhZD4JCQotCQkJPGJvZHk+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iQGludmFsaWRMaW5rIj4KLQkJCQkJPGI+PGgzPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudERvZXNOb3RFeGlzdFRleHQiLz48L2gzPjwvYj4KLQkJCQkJPHAvPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlzTm90VmFsaWRUZXh0Ii8+Ci0JCQkJCTxici8+CQotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRNaWdodEJlRGVsZXRlZFRleHQiLz4KLQkJCQkJPHAvPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBsZWFzZUZpeExpbmtUZXh0Ii8+CQkJCQkJCQkJCQotCQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOm90aGVyd2lzZT4KLQkJCQk8Yj48aDM+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaXNzaW5nRWxlbWVudFRleHQiLz48L2gzPjwvYj4KLQkJCQk8cC8+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub3RBdmFpbGFibGVUZXh0Ii8+CQkJCQkJCQkKLQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCTwveHNsOmNob29zZT4KLQkJCTwvYm9keT4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wcmFjdGljZS54c2wgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcHJhY3RpY2UueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZDgxOTc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wcmFjdGljZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJoZWxwZXIueHNsIi8+Ci0JCi0JCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4JCQotCSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQkKLSAgICAJPGh0bWw+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAgJycsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbjIiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4JCQkJCQkKLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbjIiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1YlByYWN0aWNlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdzdWJQcmFjdGljZXMnXS9FbGVtZW50Ii8+CQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnRSZWZlcmVuY2VzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2NvbnRlbnRSZWZlcmVuY2VzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdhY3Rpdml0eVJlZmVyZW5jZXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNvbnRlbnRSZWZlcmVuY2VzKSArIGNvdW50KCRzdWJQcmFjdGljZXMpICsgY291bnQoJGFjdGl2aXR5UmVmZXJlbmNlcyk+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzdWJQcmFjdGljZXMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdWJQcmFjdGljZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHN1YlByYWN0aWNlcyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGNvbnRlbnRSZWZlcmVuY2VzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udGVudFJlZmVyZW5jZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGNvbnRlbnRSZWZlcmVuY2VzIj4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYWN0aXZpdHlSZWZlcmVuY2VzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYWN0aXZpdHlSZWZlcmVuY2VzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRhY3Rpdml0eVJlZmVyZW5jZXMiPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdGlvblNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J21haW5EZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJvYmxlbSIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdwcm9ibGVtJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrZ3JvdW5kIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2JhY2tncm91bmQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImdvYWxzIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2dvYWxzJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhcHBsaWNhdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdhcHBsaWNhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdsZXZlbHNPZkFkb3B0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhZGRpdGlvbmFsSW5mbyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdhZGRpdGlvbmFsSW5mbyddIi8+Ci0JCQotCQk8eHNsOmlmIHRlc3Q9IiRtYWluRGVzY3JpcHRpb24gIT0gJycgb3IgJHByb2JsZW0gIT0gJycgb3IgJGJhY2tncm91bmQgIT0gJycgb3IgJGdvYWxzICE9ICcnIG9yICRhcHBsaWNhdGlvbiAhPSAnJyBvciAkbGV2ZWxzT2ZBZG9wdGlvbiAhPSAnJyBvciAkYWRkaXRpb25hbEluZm8gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVzY3JpcHRpb25UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+CQkJCi0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkbWFpbkRlc2NyaXB0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkbWFpbkRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRwcm9ibGVtICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb2JsZW1UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHByb2JsZW0iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGJhY2tncm91bmQgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja2dyb3VuZFRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkYmFja2dyb3VuZCIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkZ29hbHMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZ29hbHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGdvYWxzIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRhcHBsaWNhdGlvbiAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhcHBsaWNhdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkYXBwbGljYXRpb24iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGxldmVsc09mQWRvcHRpb24gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGV2ZWxzT2ZBZG9wdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkbGV2ZWxzT2ZBZG9wdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkYWRkaXRpb25hbEluZm8gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYWRkaXRpb25hbEluZm9UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGFkZGl0aW9uYWxJbmZvIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+ICAgIAotCQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGYzODQzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4KLQotYWRkaXRpb25hbEluZm9UZXh0PUFkZGl0aW9uYWwgSW5mb3JtYXRpb24KLWFkZGl0aW9uYWxQZXJmb3JtZXJUZXh0PUFkZGl0aW9uYWwgUGVyZm9ybWVycwotYWdncmVnYXRlc1RleHQ9QWdncmVnYXRlcwotYWx0ZXJuYXRpdmVzVGV4dD1BbHRlcm5hdGl2ZXMKLWFwcGxpY2F0aW9uVGV4dD1BcHBsaWNhdGlvbgotYXJ0aWZhY3RUZXh0PUFydGlmYWN0Ci1hc3NldHNUZXh0PUFzc2V0cwotYXNzaWdubWVudEFwcHJvYWNoZXNUZXh0PUFzc2lnbm1lbnQgQXBwcm9hY2hlcwotYXNzaXN0aW5nVGV4dD1Bc3Npc3RpbmcKLWF0dGFjaGVkRmlsZXNUZXh0PUF0dGFjaGVkIEZpbGVzCi1iYWNrZ3JvdW5kVGV4dD1CYWNrZ3JvdW5kCi1icmllZk91dGxpbmVUZXh0PUJyaWVmIE91dGxpbmUKLWNhdGVnb3JpZXNUZXh0PUNhdGVnb3JpZXMKLWNoZWNrSXRlbXNUZXh0PUNoZWNrIEl0ZW1zCi1jaGVja2xpc3RzVGV4dD1DaGVja2xpc3RzCi1jb2xsYXBzZUFsbFRleHQ9Q29sbGFwc2UgQWxsIENoZWNrIEl0ZW1zCi1jb21wb3NpdGVSb2xlVGV4dD1Db21wb3NpdGUgUm9sZQotY29uY2VwdHNUZXh0PUNvbmNlcHRzCi1jb250YWluZWRBcnRpZmFjdHNUZXh0PUNvbnRhaW5lZCBBcnRpZmFjdHMKLWNvbnRhaW5lckFydGlmYWN0VGV4dD1Db250YWluZXIgQXJ0aWZhY3QKLWNvbnRlbnRFbGVtZW50c1RleHQ9Q2F0ZWdvcml6ZWQgRWxlbWVudHMKLWNvbnRlbnRSZWZlcmVuY2VzVGV4dD1Db250ZW50IFJlZmVyZW5jZXMKLWRlbGl2ZXJhYmxlVGV4dD1EZWxpdmVyYWJsZQotZGVsaXZlcmFibGVQcm9wZXJ0aWVzVGV4dD1EZWxpdmVyYWJsZSBQcm9wZXJ0aWVzCi1kZWxpdmVyZWRQYXJ0c1RleHQ9RGVsaXZlcmFibGUgUGFydHMKLWRlbGl2ZXJlZFdvcmtQcm9kdWN0c1RleHQ9RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHMKLWRlcGVuZGVudFRleHQ9RGVwZW5kZW50IFdvcmsgUHJvZHVjdHMKLWRlc2NyaXB0aW9uVGV4dD1EZXNjcmlwdGlvbgotZGlzY2lwbGluZVRleHQ9RGlzY2lwbGluZQotZGlzY2lwbGluZXNUZXh0PURpc2NpcGxpbmVzCi1zdWJkaXNjaXBsaW5lc1RleHQ9U3ViZGlzY2lwbGluZXMKLWRvbWFpblRleHQ9RG9tYWluCi1kb21haW5zVGV4dD1Eb21haW5zCi1leGFtcGxlc1RleHQ9RXhhbXBsZXMKLWV4cGFuZEFsbFRleHQ9RXhwYW5kIEFsbCBDaGVjayBJdGVtcwotZXh0ZW5kc1RleHQ9RXh0ZW5kcwotZXh0ZXJuYWxUZXh0PUV4dGVybmFsCi1leHRlcm5hbERlc2NyaXB0aW9uVGV4dD1FeHRlcm5hbCBEZXNjcmlwdGlvbgotZ29hbHNUZXh0PUdvYWxzCi1ndWlkZWxpbmVzVGV4dD1HdWlkZWxpbmVzCi1pbGx1c3RyYXRpb25zVGV4dD1JbGx1c3RyYXRpb25zCQotaW1wYWN0T2ZOb3RIYXZpbmdUZXh0PUltcGFjdCBvZiBub3QgaGF2aW5nCi1pbXBhY3RpbmdUZXh0PUltcGFjdGluZyBXb3JrIFByb2R1Y3RzCi1pbnB1dHNUZXh0PUlucHV0cwotaW5wdXRUb1RleHQ9SW5wdXQgVG8KLWl0ZW1zVGV4dD1JdGVtcwota2V5Q29uc2lkZXJhdGlvbnNUZXh0PUtleSBDb25zaWRlcmF0aW9ucwotbGV2ZWxzT2ZBZG9wdGlvblRleHQ9TGV2ZWxzIG9mIEFkb3B0aW9uCi1tYW5kYXRvcnlUZXh0PU1hbmRhdG9yeQotbWFpblRleHQ9TWFpbgotbWFpbkRlc2NyaXB0aW9uVGV4dD1NYWluIERlc2NyaXB0aW9uCi1tYWluUmVzcG9uc2libGVUZXh0PU1haW4gUmVzcG9uc2libGUKLW1ldGhvZFRleHQ9TWV0aG9kIFdvcmsgUHJvZHVjdAotbW9kaWZpZWRCeVRleHQ9TW9kaWZpZWQgQnkKLW1vcmVJbmZvVGV4dD1Nb3JlIEluZm9ybWF0aW9uCi1ub3RhdGlvblRleHQ9Tm90YXRpb24KLW9wdGlvbmFsVGV4dD1PcHRpb25hbAotb3V0Y29tZVRleHQ9T3V0Y29tZQotb3V0cHV0RnJvbVRleHQ9T3V0cHV0IEZyb20KLW91dHB1dHNUZXh0PU91dHB1dHMKLXBhY2thZ2luZ0luc3RydWN0aW9uc1RleHQ9UGFja2FnaW5nIEluc3RydWN0aW9ucwotcGFja2FnaW5nR3VpZGFuY2VUZXh0PVBhY2thZ2luZyBHdWlkYW5jZQotcGVyZm9ybWluZ1JvbGVzVGV4dD1QZXJmb3JtaW5nIFJvbGVzCi1wcmltYXJ5UGVyZm9ybWVyVGV4dD1QcmltYXJ5IFBlcmZvcm1lcgotcHJvYmxlbVRleHQ9UHJvYmxlbQotcHJvcGVydGllc1RleHQ9UHJvcGVydGllcwotcHVycG9zZVRleHQ9UHVycG9zZQotcmVhc29uc0Zvck5vdE5lZWRpbmdUZXh0PVJlYXNvbnMgZm9yIG5vdCBuZWVkaW5nCi1yZWZlcmVuY2VXb3JrZmxvd3NUZXh0PVJlZmVyZW5jZSBXb3JrZmxvd3MKLXJlbGF0ZWRFbGVtZW50c1RleHQ9UmVsYXRlZCBFbGVtZW50cwotcmVsYXRpb25zaGlwc1RleHQ9UmVsYXRpb25zaGlwcwotcmVwb3J0c1RleHQ9UmVwb3J0cwotcmVwcmVzZW50YXRpb25PcHRpb25zVGV4dD1SZXByZXNlbnRhdGlvbiBPcHRpb25zCi1yZXNwb25zaWJsZVRleHQ9UmVzcG9uc2libGUKLXJlc3BvbnNpYmxlRm9yVGV4dD1SZXNwb25zaWJsZSBmb3IKLXJldXNhYmxlQXNzZXRzVGV4dD1SZXVzYWJsZSBBc3NldHMKLXJvbGVUZXh0PVJvbGUKLXJvbGVzVGV4dD1Sb2xlcwotcm9sZVNldHNUZXh0PVJvbGUgU2V0cwotc2tpbGxzVGV4dD1Ta2lsbHMKLXN0YWZmaW5nVGV4dD1TdGFmZmluZwotc3RlcHNUZXh0PVN0ZXBzCi1zdWJjYXRlZ29yaWVzVGV4dD1TdWItQ2F0ZWdvcmllcwkKLXN1YmRvbWFpbnNUZXh0PVN1YmRvbWFpbnMKLXN1YlByYWN0aWNlc1RleHQ9U3ViLVByYWN0aWNlcwotc3VwZXJUZWFtVGV4dD1TdXBlci1UZWFtIFByb2ZpbGUKLXN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0PVN1cHBvcnRpbmcgTWF0ZXJpYWxzCi1zdWJ0ZWFtc1RleHQ9U3ViLVRlYW1zIFByb2ZpbGVzCi1zeW5vbnltc1RleHQ9U3lub255bXMKLXRhaWxvcmluZ1RleHQ9VGFpbG9yaW5nCi10YXNrVGV4dD1UYXNrCi10YXNrc1RleHQ9VGFza3MKLXRic1RleHQ9VGVhbSBBbGxvY2F0aW9uCi10ZWFtUHJvZmlsZVRleHQ9VGVhbSBQcm9maWxlCi10ZWFtUm9sZXNUZXh0PVRlYW0gUHJvZmlsZSBSb2xlcwotdGVjaG5pcXVlc1RleHQ9R3VpZGVsaW5lcwotdGVtcGxhdGVzVGV4dD1UZW1wbGF0ZXMKLXRvb2xNZW50b3JzVGV4dD1Ub29sIE1lbnRvcnMKLXRvb2xUZXh0PVRvb2wKLXVzYWdlVGV4dD1Vc2FnZQotd2JzVGV4dD1Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUKLXdoaXRlcGFwZXJzVGV4dD1XaGl0ZXBhcGVycwotd29ya1Byb2R1Y3RzVGV4dD1Xb3JrIFByb2R1Y3RzCi13b3JrUHJvZHVjdFR5cGVzVGV4dD1Xb3JrIFByb2R1Y3QgS2luZHMKLXdwYnNUZXh0PVdvcmsgUHJvZHVjdCBVc2FnZQotd29ya0JyZWFrZG93blRleHQ9V29yayBCcmVha2Rvd24KLXdvcmtmbG93VGV4dD1Xb3JrZmxvdwotd29ya1Byb2R1Y3RCcmVha2Rvd25UZXh0PVdvcmsgUHJvZHVjdCBCcmVha2Rvd24KLXdvcmtQcm9kdWN0RGVwZW5kZW5jaWVzVGV4dD1Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jaWVzCi10ZWFtUHJvZmlsZUJyZWFrZG93blRleHQ9VGVhbSBCcmVha2Rvd24KLXRlYW1TdHJ1Y3R1cmVUZXh0PVRlYW0gU3RydWN0dXJlCi1wYWdlTm90SW5zdGFsbGVkVGV4dD1QYWdlIE5vdCBJbnN0YWxsZWQKLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PUVsZW1lbnQgRG9lcyBOb3QgRXhpc3QKLWlzTm90VmFsaWRUZXh0PVRoZSByZWZlcmVuY2VkIGVsZW1lbnQgaXMgbm90IGEgdmFsaWQgZWxlbWVudCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5LgotZWxlbWVudE1pZ2h0QmVEZWxldGVkVGV4dD1UaGUgZWxlbWVudCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgbGlicmFyeS4KLXBsZWFzZUZpeExpbmtUZXh0PVBsZWFzZSBjaGVjayB5b3VyIGNvbnRlbnQgbGlicmFyeSBhbmQgZml4IHRoZSBsaW5rLgotaW5mb0Fib3V0TWlzc2luZ0VsZW1lbnRUZXh0PUluZm9ybWF0aW9uIGFib3V0IHRoZSBtaXNzaW5nIGVsZW1lbnQ6Ci1lbGVtZW50TmFtZVRleHQ9RWxlbWVudCBOYW1lOgotZ3VpZFRleHQ9R1VJRDoKLW1pc3NpbmdFbGVtZW50VGV4dD1SZWZlcmVuY2VkIHBhZ2UgaXMgbm90IGluIHRoaXMgY29uZmlndXJhdGlvbgotbm90QXZhaWxhYmxlVGV4dD1UaGUgcmVmZXJlbmNlZCBwYWdlIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gVGhpcyBwYWdlIG1heSBiZSBhdmFpbGFibGUgaW4gYW5vdGhlciBwcm9jZXNzIGNvbmZpZ3VyYXRpb24uCi1lbGVtZW50VHlwZVRleHQ9RWxlbWVudCBUeXBlOgotcGx1Z2luTmFtZVRleHQ9UGx1Z2luIE5hbWU6Ci1wcmVkZWNlc3NvclRleHQ9UHJlZGVjZXNzb3IKLXBsYW5uaW5nRGF0YVRleHQ9UGxhbm5pbmdEYXRhCi1tdWx0aXBsZU9jY3VycmVuY2VzVGV4dD1NdWx0aXBsZSBPY2N1cnJlbmNlcwotZXZlbnREcml2ZW5UZXh0PUV2ZW50IERyaXZlbgotb25nb2luZ1RleHQ9T25nb2luZwotcGxhbm5lZFRleHQ9UGxhbm5lZAotcmVwZWF0YWJsZVRleHQ9UmVwZWF0YWJsZQotdXNhZ2VHdWlkYW5jZVRleHQ9VXNhZ2UgR3VpZGFuY2UKLWlucHV0c1RleHQ9SW5wdXRzCi1vdXRwdXRzVGV4dD1PdXRwdXRzCi1hY3Rpdml0eUVudHJ5U3RhdGVUZXh0PUFjdGl2aXR5IEVudHJ5IFN0YXRlCi1hY3Rpdml0eUV4aXRTdGF0ZVRleHQ9QWN0aXZpdHkgRXhpdCBTdGF0ZQotcHJlZml4VGV4dD1QcmVmaXgKLWV4dGVybmFsSWRUZXh0PUV4dGVybmFsIElkCi1zY29wZVRleHQ9U2NvcGUKLXJvYWRtYXBUZXh0PVJvYWRtYXAKLXR5cGVvZkNvbnRyYWN0VGV4dD1UeXBlIG9mIENvbnRyYWN0Ci1wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzVGV4dD1Qcm9qZWN0IENoYXJhY3RlcmlzdGljcwotcHJvamVjdE1lbWJlckV4cGVydGlzZVRleHQ9UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlCi1yaXNrTGV2ZWxUZXh0PVJpc2sgTGV2ZWwKLXNjYWxlVGV4dD1TY2FsZQotdXNhZ2VOb3Rlc1RleHQ9VXNhZ2UgTm90ZXMKLWNvbnRleHRUZXh0PUNvbnRleHQKLXBhcmVudEFjdGl2aXRpZXNUZXh0PVBhcmVudCBBY3Rpdml0aWVzCi1pbmNsdWRlZFBhdHRlcm5zVGV4dD1JbmNsdWRlZCBQYXR0ZXJucwotY2hlY2tsaXN0VGV4dD1DaGVja2xpc3QKLWNvbW11bmljYXRpb25zTWF0ZXJpYWxzVGV4dD1Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHMKLWVkdWNhdGlvbk1hdGVyaWFsc1RleHQ9RWR1Y2F0aW9uIE1hdGVyaWFscwotZXN0aW1hdGluZ1RlY2huaXF1ZVRleHQ9RXN0aW1hdGluZyBUZWNobmlxdWUKLWFkZGl0aW9uYWxUZXh0PUFkZGl0aW9uYWwKLW1vZGlmaWVzVGV4dD1Nb2RpZmllcwotYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0PUFkZGl0aW9uYWxseSBQZXJmb3JtcwotaW5kZXhUZXh0PUluZGV4Ci1wcmVmaXhUZXh0PVByZWZpeAotYnJlYWtkb3duRWxlbWVudFRleHQ9QnJlYWtkb3duIEVsZW1lbnQKLXN0ZXBzVGV4dD1TdGVwcwotcHJlZGVjZXNzb3JzVGV4dD1QcmVkZWNlc3NvcnMKLXJlcGVhdGFibGVUZXh0PVJlcGVhdGFibGUKLXR5cGVUZXh0PVR5cGUKLW9uZ29pbmdUZXh0PU9uZ29pbmcKLWV2ZW50RHJpdmVuVGV4dD1FdmVudC1Ecml2ZW4KLW1vZGVsSW5mb1RleHQ9TW9kZWwgSW5mbwotZW50cnlTdGF0ZVRleHQ9RW50cnkgU3RhdGUKLWV4aXRTdGF0ZVRleHQ9RXhpdCBTdGF0ZQotdGVhbVRleHQ9VGVhbQotcGFyZW50UGFja2FnZVRleHQ9UGFyZW50IFBhY2thZ2UKLWNvbnRhaW5lZFBhY2thZ2VzVGV4dD1Db250YWluZWQgUGFja2FnZXMKLWNvbnRlbnRzVGV4dD1Db250ZW50cwotYmFzZWRPbk1ldGhvZFJvbGVUZXh0PUJhc2VkIG9uIE1ldGhvZCBSb2xlCi1iYXNlZE9uTWV0aG9kVGFza1RleHQ9QmFzZWQgb24gTWV0aG9kIFRhc2sKLWJhc2VkT25NZXRob2RXb3JrUHJvZHVjdFRleHQ9QmFzZWQgb24gTWV0aG9kIFdvcmsgUHJvZHVjdAotc3VtbWFyeVRleHQ9U3VtbWFyeQotcGVyZm9ybXNUZXh0PVBlcmZvcm1zCi1yZXBsYWNlc1RleHQ9UmVwbGFjZXMKLWNvbnRyaWJ1dGVzVGV4dD1Db250cmlidXRlcwotbm9uZVRleHQ9Tm9uZQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zVGV4dD1Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1hY3Rpdml0eVJlZmVyZW5jZXNUZXh0PUFjdGl2aXR5IFJlZmVyZW5jZXMKLW5hbWVUZXh0PU5hbWUKLXByZXNlbnRhdGlvbk5hbWVUZXh0PVByZXNlbnRhdGlvbiBOYW1lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3JvbGUueHNsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3JvbGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNjVlMzAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yb2xlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9ImhlbHBlci54c2wiLz4KLQkJCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJvbGVEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J1JvbGVEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icm9sZVNldHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncm9sZVNldHMnXS9FbGVtZW50W0BUeXBlPSdSb2xlU2V0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJCi0JCTxodG1sPgkKLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIiBjb250ZW50PSJ7JGVsZW1lbnRQcmVzZW50YXRpb25OYW1lfSIvPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4JCi0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRyb2xlRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzdGFmZmluZ1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRyb2xlRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCSAgICAKLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdhZGRpdGlvbmFsbHlQZXJmb3JtcyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtb2RpZmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdtb2RpZmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0NvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMnXS9FbGVtZW50Ii8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJPHRyPgotCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiIGFsaWduPSJjZW50ZXIiPgkKLQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJkaWFncmFtIi8+Ci0JCQkJCTwvdGQ+Ci0JCQkJPC90cj4KLQkJCQkKLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRhZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRhZGRpdGlvbmFsbHlQZXJmb3JtcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRtb2RpZmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRtb2RpZmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkKLQkJCQkJPCEtLQotCQkJCTx0cj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYWRkaXRpb25hbGx5UGVyZm9ybXMpID4gMCI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHZhbGlnbj0idG9wIj4KLQkJCQkJCTxiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0Ii8+OjwvYj4JCQkJCQkJCi0JCQkJCQk8dWw+Ci0JCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRhZGRpdGlvbmFsbHlQZXJmb3JtcyI+Ci0JCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCTxsaT4KLQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQk8L2xpPgotCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJPC91bD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRtb2RpZmllcykgPiAwIj4JCQkKLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPGI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb2RpZmllc1RleHQiLz46PC9iPgotCQkJCQkJPHVsPgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkbW9kaWZpZXMiPgotCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJPC9saT4KLQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3hzbDppZj4JCQkJCQotCQkJCTwvdHI+Ci0tLT4KLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ2hlY2tsaXN0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NvbmNlcHQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdHdWlkZWxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdTdXBwb3J0aW5nTWF0ZXJpYWwnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nV2hpdGVwYXBlciddIi8+Ci0JCQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjaGVja2xpc3RzKSArIGNvdW50KCRjb25jZXB0cykgKyBjb3VudCgkZ3VpZGVsaW5lcykgKyBjb3VudCgkc3VwcG9ydGluZ01hdGVyaWFscykgKyBjb3VudCgkd2hpdGVQYXBlcnMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb3JlSW5mb1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ2hlY2tsaXN0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSIkY2hlY2tsaXN0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9IiRjb25jZXB0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSIkZ3VpZGVsaW5lcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkU3VwcG9ydGluZ01hdGVyaWFscyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFscyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9IiR3aGl0ZVBhcGVycyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdGFmZmluZ1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNraWxscyIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3NraWxscyddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIHNlbGVjdD0icmVmZXJlbmNlL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdhc3NpZ25tZW50QXBwcm9hY2hlcyddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3lub255bXMiIHNlbGVjdD0icmVmZXJlbmNlL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdzeW5vbnltcyddIi8+Ci0JCQotCQk8eHNsOmlmIHRlc3Q9IiRza2lsbHMgIT0gJycgb3IgJGFzc2lnbm1lbnRBcHByb2FjaGVzICE9ICcnIG9yICRzeW5vbnltcyAhPSAnJyAiID4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0YWZmaW5nVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHNraWxscyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRza2lsbHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHNraWxscyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkYXNzaWdubWVudEFwcHJvYWNoZXMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXNzaWdubWVudEFwcHJvYWNoZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGFzc2lnbm1lbnRBcHByb2FjaGVzIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9IiRzeW5vbnltcyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzeW5vbnltc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkc3lub255bXMiLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkKLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3JvbGVfZGVzY3JpcHRvci54c2wgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcm9sZV9kZXNjcmlwdG9yLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmVhOTlkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcm9sZV9kZXNjcmlwdG9yLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImhlbHBlci54c2wiLz4KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nUm9sZURlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJvbGVEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J1JvbGVEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVzY3JpcHRvckRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJxdWVyeVN0cmluZyIgc2VsZWN0PSJAcXVlcnlTdHJpbmciLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWxQcm9jZXNzUGF0aCIgc2VsZWN0PSJAcmVsUHJvY2Vzc1BhdGgiLz4KLQkJPGh0bWw+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGRlZmF1bHRRdWVyeVN0ciA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHF1ZXJ5U3RyaW5nIi8+JzsKLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgZGVmYXVsdFF1ZXJ5U3RyLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCi0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlZmluZWREZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3RhZmZpbmdTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0aWVzVGV4dCIvPgotCQk8L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkbXVsdGlwbGVPY2N1cnJlbmNlc1RleHQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2hhc011bHRpcGxlT2NjdXJyZW5jZXMnXSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkb3B0aW9uYWxUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRwbGFubmVkVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J1BsYW5uaW5nRGF0YSddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRwbGFubmluZ0RhdGFUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nUGxhbm5pbmdEYXRhJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2xpbmtUb1ByZWRlY2Vzc29yJ10vRWxlbWVudCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRwcmVkZWNlc3NvclRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2xpbmtUb1ByZWRlY2Vzc29yJ10vRWxlbWVudCIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPCEtLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDppZiB0ZXN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzYWdlVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSInVXNhZ2UgR3VpZGFuY2UnIi8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCS0tPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ1c2FnZUd1aWRhbmNlIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkdXNhZ2VHdWlkYW5jZSAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR1c2FnZUd1aWRhbmNlVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiR1c2FnZUd1aWRhbmNlIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icGVyZm9ybXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9ycyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZUZvciIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyZXNwb25zaWJsZUZvciddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdSb2xlRGVzY3JpcHRvcl9BZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1vZGlmaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J21vZGlmaWVzJ10vRWxlbWVudCIvPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+Ci0JCTwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCTx0cj4KLQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB2YWxpZ249InRvcCI+Ci0JCQkJCQk8Yj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBlcmZvcm1zVGV4dCIvPjo8L2I+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRwZXJmb3JtcykgPiAwIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcGVyZm9ybXMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCTwveHNsOmlmPgotCQkJCQk8L3RkPgotCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHZhbGlnbj0idG9wIj4KLQkJCQkJCTxiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVGb3JUZXh0Ii8+OjwvYj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHJlc3BvbnNpYmxlRm9yKSA+IDAiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyZXNwb25zaWJsZUZvciI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCTwvdGQ+Ci0JCQkJPC90cj4KLQkJCQk8dHI+Ci0JCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPGI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQiLz46PC9iPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYWRkaXRpb25hbGx5UGVyZm9ybXMpID4gMCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGFkZGl0aW9uYWxseVBlcmZvcm1zIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJPC90ZD4KLQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB2YWxpZ249InRvcCI+Ci0JCQkJCQk8Yj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vZGlmaWVzVGV4dCIvPjo8L2I+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRtb2RpZmllcykgPiAwIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkbW9kaWZpZXMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCTwveHNsOmlmPgotCQkJCQk8L3RkPgotCQkJCTwvdHI+Ci0JCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nR3VpZGVsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nU3VwcG9ydGluZ01hdGVyaWFsJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1doaXRlcGFwZXInXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjaGVja2xpc3RzKSArIGNvdW50KCRjb25jZXB0cykgKyBjb3VudCgkZ3VpZGVsaW5lcykgKyBjb3VudCgkc3VwcG9ydGluZ01hdGVyaWFscykgKyBjb3VudCgkd2hpdGVQYXBlcnMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb3JlSW5mb1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRXaGl0ZVBhcGVycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0iJHdoaXRlUGFwZXJzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InN0YWZmaW5nU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2tpbGxzIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nc2tpbGxzJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhc3NpZ25tZW50QXBwcm9hY2hlcyIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2Fzc2lnbm1lbnRBcHByb2FjaGVzJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzeW5vbnltcyIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3N5bm9ueW1zJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkc2tpbGxzICE9ICcnIG9yICRhc3NpZ25tZW50QXBwcm9hY2hlcyAhPSAnJyBvciAkc3lub255bXMgIT0gJycgIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0YWZmaW5nVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkc2tpbGxzICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRza2lsbHNUZXh0Ii8+Ci0JCQkJCQkJPC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHNraWxscyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkYXNzaWdubWVudEFwcHJvYWNoZXMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dCIvPgotCQkJCQkJCTwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRhc3NpZ25tZW50QXBwcm9hY2hlcyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkc3lub255bXMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN5bm9ueW1zVGV4dCIvPgotCQkJCQkJCTwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRzeW5vbnltcyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9zdW1tYXJ5LnhzbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9zdW1tYXJ5LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2U2NmMzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvc3VtbWFyeS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJoZWxwZXIueHNsIi8+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+PHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJCi0JCTxodG1sPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+CQkJCQotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzdW1tYXJ5T3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQkJCQkJCQotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJyZWZlcmVuY2VMaXN0Ij4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudChFbGVtZW50KSA+IDAiPgotCQkJCQkJCQkJPGgyIGNsYXNzPSJiYW5uZXIiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvaDI+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkVsZW1lbnQiPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVHlwZU5hbWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTxwLz4KLQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPC94c2w6Zm9yLWVhY2g+CQkJCQkJCQkJCQkJCQotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4JCQkJCQkKLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdW1tYXJ5T3ZlcnZpZXciPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdicmllZkRlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN5bm9ueW1zIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nc3lub255bXMnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImV4dGVybmFsSWQiIHNlbGVjdD0icmVmZXJlbmNlL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdleHRlcm5hbElkJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQkKLQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCTx0cj4KLQkJCQk8dGQgY2xhc3M9InBhZ2VUaXRsZSI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3VtbWFyeVRleHQiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGV4dGVybmFsSWQgIT0gJyciPgotCQkJCQkJKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZXJuYWxJZCIvPikKLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+Ci0JCTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgotCQkJPHRyPgotCQkJCTx0ZCBjbGFzcz0icGFnZVRpdGxlU2VwYXJhdG9yIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBhbHQ9IiIgdGl0bGU9IiIgaGVpZ2h0PSIxIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+CQkKLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Rhc2sueHNsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Rhc2sueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmNjZWM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90YXNrLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOmluY2x1ZGUgaHJlZj0iaGVscGVyLnhzbCIvPgotCQotCQkKLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idGFza0Rlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nVGFza0Rlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwZXJmb3JtaW5nUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3BlcmZvcm1lZEJ5J10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCQotCQk8aHRtbD4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSI+IAotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTwhLS0gPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPiAtLT4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwZXJmb3JtaW5nUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICcnLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwdXJwb3NlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkdGFza0Rlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkdGFza0Rlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3RlcHNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiR0YXNrRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiR0YXNrRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGl2ZXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiR0YXNrRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icGVyZm9ybWluZ1JvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwZXJmb3JtZWRCeSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InBlcmZvcm1pbmdSb2xlTmFtZSIgc2VsZWN0PSIkcGVyZm9ybWluZ1JvbGUvQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nYWRkaXRpb25hbGx5UGVyZm9ybWVkQnknXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFuZGF0b3J5SW5wdXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J21hbmRhdG9yeUlucHV0J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im9wdGlvbmFsSW5wdXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J29wdGlvbmFsSW5wdXQnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdvdXRwdXQnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0NvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMnXS9FbGVtZW50Ii8+Ci0KLQkJPHhzbDppZiB0ZXN0PSIkcGVyZm9ybWluZ1JvbGVOYW1lICE9ICcnIG9yIGNvdW50KCRjYXRlZ29yaWVzKSArIGNvdW50KCRhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSkgKyBjb3VudCgkbWFuZGF0b3J5SW5wdXRzKSArIGNvdW50KCRvcHRpb25hbElucHV0cykgKyBjb3VudCgkb3V0cHV0cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2F0ZWdvcmllcykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGNhdGVnb3JpZXMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQkKLQkJCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iJHBlcmZvcm1pbmdSb2xlTmFtZSAhPSAnJyBvciBjb3VudCgkYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgd2lkdGg9IjQyJSI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJpbWFyeVBlcmZvcm1lclRleHQiLz46Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iJHBlcmZvcm1pbmdSb2xlTmFtZSI+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwZXJmb3JtaW5nUm9sZS9AVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGVyZm9ybWluZ1JvbGVOYW1lIi8+PC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYWRkaXRpb25hbFBlcmZvcm1lclRleHQiLz46Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KSA+IDAiPgkJCQkJCQkJCQotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ij4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG1hbmRhdG9yeUlucHV0cykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dHMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSI0MiUiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1hbmRhdG9yeVRleHQiLz46Ci0JCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dHMpID4gMCI+Ci0JCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkbWFuZGF0b3J5SW5wdXRzIj4JCQotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgkJCQkJCQkJCi0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkKLQkJCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6d2hlbj4JCQkJCi0JCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbm9uZVRleHQiLz4KLQkJCQkJCQkJCQk8L2xpPgkJCQkJCQkJCQotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz46Ci0JCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCRvcHRpb25hbElucHV0cykgPiAwIj4KLQkJCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRvcHRpb25hbElucHV0cyI+CQkJCQotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgkJCQkJCQotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCi0JCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOndoZW4+CQkJCQotCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5vbmVUZXh0Ii8+Ci0JCQkJCQkJCQkJPC9saT4JCQkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8L3RkPgkJCQkJCi0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkb3V0cHV0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3V0cHV0cyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDaGVja2xpc3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ29uY2VwdCddIi8+CQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdHdWlkZWxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdTdXBwb3J0aW5nTWF0ZXJpYWwnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRvb2xNZW50b3JzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nVG9vbE1lbnRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdXaGl0ZXBhcGVyJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJ10iLz4KLQkJCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpICsgY291bnQoJGNvbmNlcHRzKSArIGNvdW50KCRndWlkZWxpbmVzKSArIGNvdW50KCRzdXBwb3J0aW5nTWF0ZXJpYWxzKSArIGNvdW50KCR0b29sTWVudG9ycykgKyBjb3VudCgkd2hpdGVQYXBlcnMpICsgY291bnQoJGVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vcmVJbmZvVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRUb29sTWVudG9ycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0iJHRvb2xNZW50b3JzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRXaGl0ZVBhcGVycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0iJHdoaXRlUGFwZXJzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgc2VsZWN0PSIkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQk8eHNsOnRlbXBsYXRlIG5hbWU9InN0ZXBzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzZWN0aW9ucyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vcmVmZXJlbmNlTGlzdFtAbmFtZT0nc2VjdGlvbnMnXS9FbGVtZW50W0BUeXBlPSdTZWN0aW9uJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkc2VjdGlvbnMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdGVwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc2VjdGlvbnMiPgotCQkJCQkJCQk8ZGl2IGNsYXNzPSJzdGVwSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nbmFtZSddIi8+PC9kaXY+Ci0JCQkJCQkJCTxkaXYgY2xhc3M9InN0ZXBDb250ZW50Ij4KLQkJCQkJCQkJCTx0YWJsZSBjbGFzcz0ic3RlcFRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQkJCQkJPHRkPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nc2VjdGlvbkRlc2NyaXB0aW9uJ10iLz4KLQkJCQkJCQkJCQkJPC90ZD4KLQkJCQkJCQkJCQk8L3RyPgotCQkJCQkJCQkJPC90YWJsZT4KLQkJCQkJCQkJPC9kaXY+CQkJCQkJCi0JCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGl2ZXNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFsdGVybmF0aXZlcyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdhbHRlcm5hdGl2ZXMnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRhbHRlcm5hdGl2ZXMgIT0gJycgIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFsdGVybmF0aXZlc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGFsdGVybmF0aXZlcyIvPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90YXNrX2Rlc2NyaXB0b3IueHNsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Rhc2tfZGVzY3JpcHRvci54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlZTlkNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Rhc2tfZGVzY3JpcHRvci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDppbmNsdWRlIGhyZWY9ImhlbHBlci54c2wiLz4KLQkKLQkKLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudElkIiBzZWxlY3Q9IkBJZCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiddIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwZXJmb3JtaW5nUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3BlcmZvcm1lZFByaW1hcmlseUJ5J10vRWxlbWVudFtAVHlwZT0nUm9sZURlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InF1ZXJ5U3RyaW5nIiBzZWxlY3Q9IkBxdWVyeVN0cmluZyIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlbFByb2Nlc3NQYXRoIiBzZWxlY3Q9IkByZWxQcm9jZXNzUGF0aCIvPgotCQkKLQkJPGh0bWw+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJ1bWEuZ3VpZCIgY29udGVudD0ieyRlbGVtZW50SWR9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBlcmZvcm1pbmdSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgZGVmYXVsdFF1ZXJ5U3RyID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcXVlcnlTdHJpbmciLz4nOwotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCBkZWZhdWx0UXVlcnlTdHIsIHRydWUsIHRydWUsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCi0JCQkJCQkJCi0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwdXJwb3NlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVmaW5lZERlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3RlcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVzYWdlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGl2ZXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iLz4KLQotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4JCQkJCQkKLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+PC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkgICAgPHhzbDppZiB0ZXN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdsaW5rVG9QcmVkZWNlc3NvciddL0VsZW1lbnQiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkcHJlZGVjZXNzb3JUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdsaW5rVG9QcmVkZWNlc3NvciddL0VsZW1lbnQiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0nUGxhbm5pbmdEYXRhJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uaW5nRGF0YVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRtdWx0aXBsZU9jY3VycmVuY2VzVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkZXZlbnREcml2ZW5UZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc0V2ZW50RHJpdmVuJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkb25nb2luZ1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5lZFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgkJCQkKLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHJlcGVhdGFibGVUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4JCQkJCi0JCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQk8IS0tCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8eHNsOmlmIHRlc3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXNhZ2VUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IidVc2FnZSBHdWlkYW5jZSciLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3VzYWdlR3VpZGFuY2UnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JLS0+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idXNhZ2VHdWlkYW5jZSIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkdXNhZ2VHdWlkYW5jZSAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR1c2FnZUd1aWRhbmNlVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkdXNhZ2VHdWlkYW5jZSIvPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgkKLQkKLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwZXJmb3JtaW5nUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3BlcmZvcm1lZFByaW1hcmlseUJ5J10vRWxlbWVudFtAVHlwZT0nUm9sZURlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFzc2lzdGVkQnkiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nYXNzaXN0ZWRCeSddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtYW5kYXRvcnlJbnB1dHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbWFuZGF0b3J5SW5wdXQnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3B0aW9uYWxJbnB1dHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3B0aW9uYWxJbnB1dCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleHRlcm5hbElucHV0IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2V4dGVybmFsSW5wdXQnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdvdXRwdXQnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRwZXJmb3JtaW5nUm9sZSkgKyBjb3VudCgkYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkpICsgY291bnQoJG1hbmRhdG9yeUlucHV0cykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dHMpICsgY291bnQoJG91dHB1dHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CQkJCQkKLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlc1RleHQiLz48L3RoPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB3aWR0aD0iMzAlIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1haW5UZXh0Ii8+OgotCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHBlcmZvcm1pbmdSb2xlKSA+IDAiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGVyZm9ybWluZ1JvbGUvQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBlcmZvcm1pbmdSb2xlL0BEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8L3RkPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB3aWR0aD0iMzAlIj4JCQkJCQkJCQotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYWRkaXRpb25hbFRleHQiLz46Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkpID4gMCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ij4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJPC90ZD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+CQkJCQkJCQkKLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFzc2lzdGluZ1RleHQiLz46Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYXNzaXN0ZWRCeSkgPiAwIj4JCQkJCQkJCQkKLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkYXNzaXN0ZWRCeSI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+CQkJCQkKLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkbWFuZGF0b3J5SW5wdXRzKSArIGNvdW50KCRvcHRpb25hbElucHV0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgd2lkdGg9IjMwJSI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFuZGF0b3J5VGV4dCIvPjoKLQkJCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJG1hbmRhdG9yeUlucHV0cykgPiAwIj4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG1hbmRhdG9yeUlucHV0cyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3VsPgkJCQkJCQkJCQotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgkJCQkJCQkJCQotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSIzMCUiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPjoKLQkJCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJG9wdGlvbmFsSW5wdXRzKSA+IDAiPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3B0aW9uYWxJbnB1dHMiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCi0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6d2hlbj4JCQkJCi0JCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbm9uZVRleHQiLz4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC91bD4JCQkJCQkJCQkKLQkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4JCQkJCQkJCQkKLQkJCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlcm5hbFRleHQiLz46Ci0JCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCRleHRlcm5hbElucHV0KSA+IDAiPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZXh0ZXJuYWxJbnB1dCI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3VsPgkJCQkJCQkJCQotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgkJCQkJCQkJCQotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4JCQkJCQotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG91dHB1dHMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG91dHB1dHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ic3RlcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzZWN0aW9ucyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdzZWxlY3RlZFN0ZXBzJ10vRWxlbWVudFtAVHlwZT0nU2VjdGlvbiddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHNlY3Rpb25zKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RlcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHNlY3Rpb25zIj4KLQkJCQkJCQkJPGRpdiBjbGFzcz0ic3RlcEhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J25hbWUnXSIvPjwvZGl2PgotCQkJCQkJCQk8ZGl2IGNsYXNzPSJzdGVwQ29udGVudCI+Ci0JCQkJCQkJCQk8dGFibGUgY2xhc3M9InN0ZXBUYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJCQkJCTx0ZD4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J3NlY3Rpb25EZXNjcmlwdGlvbiddIi8+Ci0JCQkJCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJCQkJPC90cj4KLQkJCQkJCQkJCTwvdGFibGU+Ci0JCQkJCQkJCTwvZGl2PgkJCQkJCQotCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCQotCQotCQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4JCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0d1aWRlbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1N1cHBvcnRpbmdNYXRlcmlhbCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdUb29sTWVudG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1doaXRlcGFwZXInXSIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpICsgY291bnQoJGNvbmNlcHRzKSArIGNvdW50KCRndWlkZWxpbmVzKSArIGNvdW50KCRzdXBwb3J0aW5nTWF0ZXJpYWxzKSArIGNvdW50KCR0b29sTWVudG9ycykgKyBjb3VudCgkd2hpdGVQYXBlcnMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb3JlSW5mb1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ2hlY2tsaXN0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSIkY2hlY2tsaXN0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9IiRjb25jZXB0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSIkZ3VpZGVsaW5lcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkU3VwcG9ydGluZ01hdGVyaWFscyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFscyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkVG9vbE1lbnRvcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRvb2xNZW50b3JzIiBzZWxlY3Q9IiR0b29sTWVudG9ycyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9IiR3aGl0ZVBhcGVycyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRpdmVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhbHRlcm5hdGl2ZXMiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nYWx0ZXJuYXRpdmVzJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkYWx0ZXJuYXRpdmVzICE9ICcnICI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhbHRlcm5hdGl2ZXNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRhbHRlcm5hdGl2ZXMiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvdGVhbXByb2ZpbGUueHNsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3RlYW1wcm9maWxlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGM0YzJiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvdGVhbXByb2ZpbGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6aW5jbHVkZSBocmVmPSJoZWxwZXIueHNsIi8+Ci0JCi0JCQkKLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiddIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJxdWVyeVN0cmluZyIgc2VsZWN0PSJAcXVlcnlTdHJpbmciLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWxQcm9jZXNzUGF0aCIgc2VsZWN0PSJAcmVsUHJvY2Vzc1BhdGgiLz4KLQkJCi0JCTxodG1sPgkKLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0FjdGl2aXR5VHJlZVRhYmxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL1Byb2Nlc3NFbGVtZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBkZWZhdWx0UXVlcnlTdHIgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxdWVyeVN0cmluZyIvPic7Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sIGRlZmF1bHRRdWVyeVN0ciwgZmFsc2UsIHRydWUsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+CQotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQk8eHNsOnRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydGllc1RleHQiLz48L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkbXVsdGlwbGVPY2N1cnJlbmNlc1RleHQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2hhc011bHRpcGxlT2NjdXJyZW5jZXMnXSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkb3B0aW9uYWxUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRwbGFubmVkVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdWJUZWFtcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdzdWJUZWFtJ10vRWxlbWVudCIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0idGVhbVJvbGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3RlYW1Sb2xlcyddL0VsZW1lbnQiLz4KLQkJCQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzdWJUZWFtcykgKyBjb3VudCgkdGVhbVJvbGVzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzdWJUZWFtcykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN1YlRlYW1zVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRzdWJUZWFtcyI+Ci0JCQkJCQkJCQk8eHNsOnNvcnQgZGF0YS10eXBlPSJ0ZXh0IiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIgb3JkZXI9ImFzY2VuZGluZyIgLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR0ZWFtUm9sZXMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZWFtUm9sZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjMiPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRlYW1Sb2xlcyI+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDppZiB0ZXN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzYWdlVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSInVXNhZ2UgR3VpZGFuY2UnIi8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC93b3JrcHJvZHVjdC54c2wgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvd29ya3Byb2R1Y3QueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTc5MTU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC93b3JrcHJvZHVjdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0iaGVscGVyLnhzbCIvPgotCi0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdElsbHVzdHJhdGlvbnNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0ZW1wbGF0ZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdUZW1wbGF0ZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVwb3J0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1JlcG9ydCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXhhbXBsZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdFeGFtcGxlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1JldXNhYmxlQXNzZXQnXSIvPgkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkdGVtcGxhdGVzKSArIGNvdW50KCRyZXBvcnRzKSArIGNvdW50KCRleGFtcGxlcykgKyBjb3VudCgkcmV1c2FibGVBc3NldHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbGx1c3RyYXRpb25zVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRUZW1wbGF0ZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRlbXBsYXRlcyIgc2VsZWN0PSIkdGVtcGxhdGVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZXBvcnRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZXBvcnRzIiBzZWxlY3Q9IiRyZXBvcnRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFeGFtcGxlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZXhhbXBsZXMiIHNlbGVjdD0iJGV4YW1wbGVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZXVzYWJsZUFzc2V0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmV1c2FibGVBc3NldHMiIHNlbGVjdD0iJHJldXNhYmxlQXNzZXRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250YWluZXJBcnRpZmFjdCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J2NvbnRhaW5lckFydGlmYWN0J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdjb250YWluZWRBcnRpZmFjdHMnXS9FbGVtZW50W0BUeXBlPSdBcnRpZmFjdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyZXNwb25zaWJsZVJvbGVzJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibW9kaWZ5Um9sZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbW9kaWZ5Um9sZXMnXS9FbGVtZW50Ii8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvVGFza3MiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbWFuZGF0b3J5SW5wdXRUb1Rhc2tzJ10vRWxlbWVudFtAVHlwZT0nVGFzayddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3B0aW9uYWxJbnB1dFRvVGFza3MiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3B0aW9uYWxJbnB1dFRvVGFza3MnXS9FbGVtZW50W0BUeXBlPSdUYXNrJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRGcm9tVGFza3MiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3V0cHV0RnJvbVRhc2tzJ10vRWxlbWVudFtAVHlwZT0nVGFzayddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2F0ZWdvcmllcykgKyBjb3VudCgkcmVzcG9uc2libGVSb2xlcykgKyBjb3VudCgkY29udGFpbmVyQXJ0aWZhY3QpICsgY291bnQoJGNvbnRhaW5lZEFydGlmYWN0cykgKyBjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tzKSArIGNvdW50KCRvcHRpb25hbElucHV0VG9UYXNrcykgKyBjb3VudCgkb3V0cHV0RnJvbVRhc2tzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCi0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGNhdGVnb3JpZXMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIj4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjYXRlZ29yaWVzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCi0JCQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjb250YWluZXJBcnRpZmFjdCkgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRhaW5lckFydGlmYWN0VGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIj4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjb250YWluZXJBcnRpZmFjdCI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjb250YWluZWRBcnRpZmFjdHMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb250YWluZWRBcnRpZmFjdHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGNvbnRhaW5lZEFydGlmYWN0cyI+Ci0JCQkJCQkJCQk8eHNsOnNvcnQgZGF0YS10eXBlPSJ0ZXh0IiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIgb3JkZXI9ImFzY2VuZGluZyIgLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgkJCQkJCQkJCQkJCi0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHJlc3BvbnNpYmxlUm9sZXMpICsgY291bnQoJG1vZGlmeVJvbGVzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSI0MiUiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlVGV4dCIvPjoKLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVzcG9uc2libGVSb2xlcykgPiAwIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGVzIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8IS0tCi0JCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotLS0+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCi0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9kaWZpZWRCeVRleHQiLz46Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG1vZGlmeVJvbGVzKSA+IDAiPgkJCQkJCQkJCQotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG1vZGlmeVJvbGVzIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgkJCQkJCQkKLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3MpICsgY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzKSArIGNvdW50KCRvdXRwdXRGcm9tVGFza3MpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXNrc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgd2lkdGg9IjQyJSI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRUb1RleHQiLz46Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG1hbmRhdG9yeUlucHV0VG9UYXNrcykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dFRvVGFza3MpID4gMCI+Ci0JCQkJCQkJCSAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3MpID4gMCI+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRtYW5kYXRvcnlJbnB1dFRvVGFza3MiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzKSA+IDAiPgotCQkJCQkJCQkJICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3MpID4gMCI+PGJyLz48L3hzbDppZj4KLQkJCQkJCQkJCTx1bD4JCQotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3B0aW9uYWxJbnB1dFRvVGFza3MiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCQkJCi0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRGcm9tVGV4dCIvPjoKLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkb3V0cHV0RnJvbVRhc2tzKSA+IDAiPgkJCQkJCQkJCQotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3V0cHV0RnJvbVRhc2tzIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgkJCQkJCQkKLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nR3VpZGVsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nU3VwcG9ydGluZ01hdGVyaWFsJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1Rvb2xNZW50b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nV2hpdGVwYXBlciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJ10iLz4KLQkJCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpICsgY291bnQoJGNvbmNlcHRzKSArIGNvdW50KCRndWlkZWxpbmVzKSArIGNvdW50KCRzdXBwb3J0aW5nTWF0ZXJpYWxzKSArIGNvdW50KCR0b29sTWVudG9ycykgKyBjb3VudCgkd2hpdGVQYXBlcnMpICsgY291bnQoJGVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vcmVJbmZvVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRUb29sTWVudG9ycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0iJHRvb2xNZW50b3JzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRXaGl0ZVBhcGVycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0iJHdoaXRlUGFwZXJzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgc2VsZWN0PSIkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YzY5NzhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIExpYnJhcnkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIHRvIGFuYWJsZSB0aGUgZXh0ZWQtcmVwbGFjZSBmZWF0dXJlCi0jRW5hYmxlRXh0ZW5kUmVwbGFjZT10cnVlCi0KLSN0aGlzIGlzIHJlcGxhY2VkIGJ5IGEgcHJlZmVyZW5jZSwgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBoZXJlCi0jIGZvciBlbGVtZW50IGV4dGVkaW5nIGZyb20gYW5vdGhlciwgCi0jIHR1cm4gdGhpcyBmbGFnIG9uIHRvIGlnbm9yZSB0aGUgYmFzZSB0by1tYW55IG91dGdvaW5nIGFzc29jaWF0aW9ucyBpZiB0aGUgZWxlbWVudCBoYXMgaXRzIG93bi4KLSNJZ25vcmVCYXNlVG9NYW55QXNzb2NpYXRpb25zPXRydWUKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OWY5MmM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmF0dXJlcyIKLSAgICAgICAgIGlkPSJwcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlIgotICAgICAgICAgbmFtZT0iTWV0aG9kIExpYnJhcnkgUHJvamVjdCBOYXR1cmUiPgotICAgICAgPHJ1bnRpbWU+Ci0gICAgICAgICA8cnVuIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC9ydW50aW1lPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJsaWJyYXJ5TWFuYWdlcnMiCi0gICAgICAgICBuYW1lPSJNZXRob2QgTGlicmFyeSBNYW5hZ2VycyIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL0xpYnJhcnlNYW5hZ2Vycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC50ZXh0UmVmZXJlbmNlUmVwbGFjZXIiPgotICAgICAgPHRleHRSZWZlcmVuY2VSZXBsYWNlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5UZXh0UmVmZXJlbmNlUmVwbGFjZXJJbXBsIi8+Ci0gICA8L2V4dGVuc2lvbj4gICAKLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NjaGVtYS9MaWJyYXJ5TWFuYWdlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL0xpYnJhcnlNYW5hZ2Vycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4M2MwYjJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL0xpYnJhcnlNYW5hZ2Vycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5IiBpZD0ibGlicmFyeU1hbmFnZXJzIiBuYW1lPSJNZXRob2QgTGlicmFyeSBNYW5hZ2VyIENvbnRyaWJ1dG9ycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFbmFibGVzIGEgcGx1Zy1pbiB0byByZWdpc3RlciBhIHNwZWNpZmljIExpYnJhcnkgTWFuYWdlciBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZSBMaWJyYXJ5IFNlcnZpY2UuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxpYnJhcnlNYW5hZ2VyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibGlicmFyeU1hbmFnZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBMaWJyYXJ5IE1hbmFnZXIuIFRoaXMgY2xhc3MgbXVzdCBiZSBhIHB1YmxpYyBpbXBsZW1lbnRhdGlvbiBvZiAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIGEgc3BlY2lmaWMgbWV0aG9kIGxpYnJhcnkgdHlwZSAoZGF0YWJhc2UsIHhtaSwgZXRjLikuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZU5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSB0cmFuc2xhdGFibGUgZGlzcGxheSBuYW1lIGZvciB0aGUgbGlicmFyeSB0eXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBMaWJyYXJ5IE1hbmFnZXIgZXh0ZW5zaW9uIHBvaW50OiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGlicmFyeU1hbmFnZXJzJnF1b3Q7Jmd0OwotICAgICAgJmx0O2xpYnJhcnlNYW5hZ2VyCi0gICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeU1hbmFnZXImcXVvdDsKLSAgICAgICAgIHR5cGU9JnF1b3Q7eG1pJnF1b3Q7Ci0gICAgICAgICB0eXBlTmFtZT0mcXVvdDtYTUkmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L2xpYnJhcnlNYW5hZ2VyJmd0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQWJzdHJhY3RMaWJyYXJ5TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQWJzdHJhY3RMaWJyYXJ5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NTRlYzY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0Fic3RyYWN0TGlicmFyeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkRlYnVnVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlTYXZlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5MaWJyYXJ5U2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBMaWJyYXJ5IE1hbmFnZXIuIFJlYWwgaW1wbGVtZW50YXRpb24gb2YgSUxpYnJhcnlNYW5hZ2VyIG11c3QKLSAqIHN1YmNsYXNzIHRoaXMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TGlicmFyeU1hbmFnZXIgaW1wbGVtZW50cyBJTGlicmFyeU1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUF9ESVJUWSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbGlicmFyeSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19MSUJSQVJZX05BTUUgPSAibGlicmFyeS5uYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gSWYgdHJ1ZSwgZ2VuZXJhdGUgZGVidWcgdHJhY2VzLgotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBUaGUgbWFuYWdlZCBsaWJyYXJ5LgotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IGxpYnJhcnk7Ci0KLQkvLyBUaGUgZGVmYXVsdCBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1hbmFnZWQgbGlicmFyeS4KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQkvLyBBIGxpc3Qgb2YgbGlzdGVuZXJzIHRoYXQgbW9uaXRvciBjaGFuZ2VzIHRvIHRoZSBtYW5hZ2VkIGxpYnJhcnkuCi0JcHJpdmF0ZSBMaXN0IGxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gQSBsaXN0IG9mIGxpc3RlbmVycyB0aGF0IGhhdmUgYmVlbiBkZXRhY2hlZCBmcm9tIHRoZSBtYW5hZ2VkIGxpYnJhcnkuCi0JcHJpdmF0ZSBMaXN0IGRldGFjaGVkTGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBBIGxpc3Qgb2YgbGlzdGVuZXJzIHRoYXQgbW9uaXRvciByZXNvdXJjZSBjaGFuZ2VzIGluIHRoZSBtYW5hZ2VkIGxpYnJhcnkuCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLQkvLyBUaGUgc2F2ZSBsaWJyYXJ5IG9wdGlvbnMuCi0JcHJpdmF0ZSBNYXAgc2F2ZU9wdGlvbnM7Ci0KLQkvLyBJZiB0cnVlLCBza2lwIGFsbCBldmVudCBwcm9jZXNzaW5nLgotCXByb3RlY3RlZCBib29sZWFuIHNraXBFdmVudFByb2Nlc3NpbmcgPSBmYWxzZTsKLQotCS8vIFRPRE86IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIG5vdGlmeSB0aGUgY2hhbmdlIGluIGxpYnJhcnkgaW5zdGVhZCBvZgotCS8vIHJlbHlpbmcgb24gdGhlIGNvbW1hbmQgc3RhY2sgbGlzdGVuZXIKLQlwcml2YXRlIENvbW1hbmRTdGFja0xpc3RlbmVyIGNvbW1hbmRTdGFja0xpc3RlbmVyID0gbmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGZpbmFsIEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJjb21tYW5kU3RhY2tDaGFuZ2VkIiwgImV2ZW50PSIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaWYgKCFza2lwRXZlbnRQcm9jZXNzaW5nKSB7Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KLQkJCQkJCUNvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSBMaWJyYXJ5VXRpbAotCQkJCQkJCQkudW53cmFwKCgoQ29tbWFuZFN0YWNrKSBldmVudC5nZXRTb3VyY2UoKSkKLQkJCQkJCQkJCQkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKSk7Ci0JCQkJCQlpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgewotCQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCBpbnN0YW5jZW9mIEFkZENvbW1hbmQpIHsKLQkJCQkJCQkJQWRkQ29tbWFuZCBjbWQgPSAoQWRkQ29tbWFuZCkgbW9zdFJlY2VudENvbW1hbmQ7Ci0JCQkJCQkJCUVPYmplY3Qgb3duZXIgPSBjbWQuZ2V0T3duZXIoKTsKLQotCQkJCQkJCQkvLyBuZWVkIHRvIHNlbmQgb3duZXIgY2hhbmdlZCBub3RpZmljYXRpb24gZm9yCi0JCQkJCQkJCS8vIGFsbCBlbGVtZW50IHR5cGVzCi0JCQkJCQkJCS8vIAotCQkJCQkJCQkvLyAxNTYwMjggLSBSZWZlcmVuY2UgZnJvbSBXUCBhbmQgR3VpZGVuY2Ugd2FzCi0JCQkJCQkJCS8vIG5vdCBkZXRlY3RlZAotCQkJCQkJCQkvLyB3aGVuIGRlc2VsZWN0IHRoZSByZWxhdGVkIGVsZW1lbnQgZnJvbQotCQkJCQkJCQkvLyBjb25maWd1cmF0aW9uCi0KLQkJCQkJCQkJQ29sbGVjdGlvbiBvYmpzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQlvYmpzLmFkZChvd25lcik7Ci0JCQkJCQkJCW5vdGlmeUxpc3RlbmVycygKLQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELAotCQkJCQkJCQkJCW9ianMpOwotCi0JCQkJCQkJCWlmICghKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikpIHsKLQotCQkJCQkJCQkJb2JqcyA9IG1vc3RSZWNlbnRDb21tYW5kLmdldFJlc3VsdCgpOwotCQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCwKLQkJCQkJCQkJCQkJb2Jqcyk7Ci0KLQkJCQkJCQkJCS8vIFVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gaWYgdGhlCi0JCQkJCQkJCQkvLyBvYmplY3QgaXMgYSBuZXdseSBhZGRlZCBtZXRob2QgcGFja2FnZS4KLQkJCQkJCQkJCWlmIChvd25lciBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJCQkJCQlvYmpzID0gTGlicmFyeVV0aWwKLQkJCQkJCQkJCQkJCS5nZXRDb250YWluZWRFbGVtZW50cyhvd25lciwKLQkJCQkJCQkJCQkJCQkJb2Jqcyk7Ci0JCQkJCQkJCQkJaWYgKCFvYmpzLmlzRW1wdHkoKSkgewotCQkJCQkJCQkJCQlhZGROZXdQYWNrYWdlc1RvQ29uZmlndXJhdGlvbihvYmpzKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgaWYgKG1vc3RSZWNlbnRDb21tYW5kIGluc3RhbmNlb2YgUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgewotCQkJCQkJCQlDb2xsZWN0aW9uIG9ianMgPSBtb3N0UmVjZW50Q29tbWFuZC5nZXRSZXN1bHQoKTsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELAotCQkJCQkJCQkJCW9ianMpOwotCQkJCQkJCQlQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kIGNtZCA9ICgoUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgbW9zdFJlY2VudENvbW1hbmQpOwotCi0JCQkJCQkJCS8vIFVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gaWYgdGhlCi0JCQkJCQkJCS8vIG9iamVjdCBpcyBhIG5ld2x5IGFkZGVkIG1ldGhvZCBwYWNrYWdlLgotCQkJCQkJCQlpZiAoY21kLmdldE93bmVyKCkgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCQkJCQlvYmpzID0gTGlicmFyeVV0aWwuZ2V0Q29udGFpbmVkRWxlbWVudHMoY21kCi0JCQkJCQkJCQkJCS5nZXRPd25lcigpLCBvYmpzKTsKLQkJCQkJCQkJCWlmICghb2Jqcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCQlhZGROZXdQYWNrYWdlc1RvQ29uZmlndXJhdGlvbihvYmpzKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSBpZiAobW9zdFJlY2VudENvbW1hbmQgaW5zdGFuY2VvZiBDcmVhdGVDaGlsZENvbW1hbmQpIHsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELAotCQkJCQkJCQkJCW1vc3RSZWNlbnRDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKLQkJCQkJCQl9IGVsc2UgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCQkJbW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfTsKLQotCS8vIExpc3RlbiB0byBjaGFuZ2VzIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCXByaXZhdGUgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCQkibm90aWZ5Q2hhbmdlZCIsICJub3RpZmljYXRpb249IiArIG5vdGlmaWNhdGlvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaWYgKCFza2lwRXZlbnRQcm9jZXNzaW5nKSB7Ci0JCQkJaW50IGV2ZW50VHlwZSA9IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKTsKLQkJCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDogewotCQkJCQkvLyBBIG1ldGhvZCBlbGVtZW50LCB0eXBpY2FsbHkgYSBtZXRob2QgcGx1Zy1pbiwgaGFzIGJlZW4KLQkJCQkJLy8gYWRkZWQgdG8gdGhlIG1hbmFnZWQgbGlicmFyeSB3aXRob3V0IHVzaW5nIGFuIGVkaXRpbmcKLQkJCQkJLy8gY29tbWFuZC4KLQkJCQkJT2JqZWN0IG5vdGlmaWVyID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQkJCU9iamVjdCB2YWx1ZSA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAoKG5vdGlmaWVyIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkKLQkJCQkJCQkmJiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIGFmZmVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWFmZmVjdGVkT2JqZWN0cy5hZGQodmFsdWUpOwotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELAotCQkJCQkJCQlhZmZlY3RlZE9iamVjdHMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDogewotCQkJCQlPYmplY3Qgbm90aWZpZXIgPSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQkJaWYgKG5vdGlmaWVyICE9IG51bGwpIHsKLQkJCQkJCUNvbGxlY3Rpb24gYWZmZWN0ZWRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJYWZmZWN0ZWRPYmplY3RzLmFkZChub3RpZmllcik7Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwKLQkJCQkJCQkJYWZmZWN0ZWRPYmplY3RzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6IHsKLQkJCQkJLy8gRWl0aGVyIGEgbWV0aG9kIGVsZW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZQotCQkJCQkvLyBjb250YWluaW5nIGVsZW1lbnQsIG9yIGEgbWV0aG9kIGVsZW1lbnQgcmVmZXJlbmNlIGhhcwotCQkJCQkvLyBiZWVuIGRlbGV0ZWQuCi0JCQkJCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlPYmplY3Qgb2xkVmFsdWUgPSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKTsKLQkJCQkJQ29sbGVjdGlvbiBhZmZlY3RlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkJCQkmJiAoKEVPYmplY3QpIG9sZFZhbHVlKS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJLy8gQSBtZXRob2QgZWxlbWVudCBoYXMgYmVlbiBkZWxldGVkLgotCQkJCQkJYWZmZWN0ZWRPYmplY3RzLmFkZChvbGRWYWx1ZSk7Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fREVMRVRFRCwKLQkJCQkJCQkJYWZmZWN0ZWRPYmplY3RzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIEEgbWV0aG9kIGVsZW1lbnQgcmVmZXJlbmNlIGhhcyBiZWVuIGRlbGV0ZWQsIG5vdGlmeQotCQkJCQkJLy8gdGhlIGxpc3RlbmVycyB0aGF0IHRoZSBjb250YWluaW5nIG1ldGhvZCBlbGVtZW50IGhhcwotCQkJCQkJLy8gY2hhbmdlZC4KLQkJCQkJCWFmZmVjdGVkT2JqZWN0cy5hZGQobm90aWZpZXIpOwotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCWFmZmVjdGVkT2JqZWN0cyk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6IHsKLQkJCQkJLy8gVHdvIG9yIG1vcmUgbWV0aG9kIGVsZW1lbnRzIGhhdmUgYmVlbiByZW1vdmVkIGZyb20KLQkJCQkJLy8gdGhlIGNvbnRhaW5pbmcgZWxlbWVudCwgb3IgdHcgb3IgbW9yZSBtZXRob2QgZWxlbWVudAotCQkJCQkvLyByZWZlcmVuY2UgaGF2ZSBiZWVuIGRlbGV0ZWQuCi0JCQkJCUxpc3Qgb2xkVmFsdWUgPSBuZXcgQXJyYXlMaXN0KChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24KLQkJCQkJCQkuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCUFycmF5TGlzdCBkZWxldGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCUFycmF5TGlzdCByZW1vdmVkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYgKCFvbGRWYWx1ZS5pc0VtcHR5KCkpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9sZFZhbHVlLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJCQlpZiAoKChFT2JqZWN0KSBlbGVtZW50KS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVsZXRlZEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXJlbW92ZWRSZWZlcmVuY2VzLmFkZChlbGVtZW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWRlbGV0ZWRFbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJCS8vIFR3byBvciBtb3JlIG1ldGhvZCBlbGVtZW50cyBoYXZlIGJlZW4gZGVsZXRlZC4KLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ERUxFVEVELAotCQkJCQkJCQlkZWxldGVkRWxlbWVudHMpOwotCQkJCQl9Ci0JCQkJCWlmICghcmVtb3ZlZFJlZmVyZW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkvLyBUd28gb3IgbW9yZSBtZXRob2QgZWxlbWVudCByZWZlcmVuY2UgaGFzIGJlZW4KLQkJCQkJCS8vIGRlbGV0ZWQuCi0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwKLQkJCQkJCQkJcmVtb3ZlZFJlZmVyZW5jZXMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLy8gTGlzdGVuIHRvIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgcmVzb3VyY2UgY2hhbmdlcy4KLQlwcml2YXRlIEFkYXB0ZXIgcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAibm90aWZ5Q2hhbmdlZCIsICJtc2c9IiArIG1zZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaWYgKG1zZy5nZXRGZWF0dXJlSUQobnVsbCkgPT0gUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX01PRElGSUVECi0JCQkJCSYmIG1zZy5nZXRFdmVudFR5cGUoKSA9PSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24uU0VUKSB7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKG1zZy5nZXROb3RpZmllcigpLCBQUk9QX0RJUlRZKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvLyBMaXN0ZW4gdG8gcGVyc2lzdGVuY2UgcmVmcmVzaCBldmVudHMuCi0JcHJpdmF0ZSBJUmVmcmVzaExpc3RlbmVyIHJlZnJlc2hMaXN0ZW5lciA9IG5ldyBJUmVmcmVzaExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlSZWZyZXNoZWQoSVJlZnJlc2hFdmVudCBldmVudCkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAibm90aWZ5UmVmcmVzaGVkIiwgImV2ZW50PSIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaGFuZGxlUmVmcmVzaEV2ZW50KGV2ZW50KTsKLQkJfQotCX07Ci0KLQkvLyBMaXN0ZW4gdG8gcHJlZmVyZW5jZSBzdG9yZSBjaGFuZ2VzLgotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJlZmVyZW5jZVN0b3JlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscygKLQkJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0JBQ0tfVVBfQkVGT1JFX1NBVkUpKSB7Ci0JCQkJc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkJBQ0tfVVBfQkVGT1JFX1NBVkUsIGV2ZW50Ci0JCQkJCQkuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9IGVsc2UgaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKAotCQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpKSB7Ci0JCQkJc2F2ZU9wdGlvbnMucHV0KAotCQkJCQkJTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsCi0JCQkJCQlldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdExpYnJhcnlNYW5hZ2VyKCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImluaXQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmZXJlbmNlU3RvcmVDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQlmYWN0b3JpZXMpOwotCi0JCS8vIENyZWF0ZSB0aGUgY29tbWFuZCBzdGFjay4KLQkJQmFzaWNDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrID0gbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSByZXNvdXJjZSBzZXQuCi0JCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBjcmVhdGVSZXNvdXJjZVNldCgpOwotCQlyZXNvdXJjZVNldC5hZGRSZWZyZXNoTGlzdGVuZXIocmVmcmVzaExpc3RlbmVyKTsKLQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldFJlc291cmNlU2V0KHJlc291cmNlU2V0KTsKLQotCQkvLyBJbml0aWFsaXplIHRoZSBsaWJyYXJ5IHNhdmUgb3B0aW9ucy4KLQkJc2F2ZU9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQkJYm9vbGVhbiBiID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQkFDS19VUF9CRUZPUkVfU0FWRSk7Ci0JCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5CQUNLX1VQX0JFRk9SRV9TQVZFLCBCb29sZWFuCi0JCQkJLnZhbHVlT2YoYikpOwotCQliID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpOwotCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsCi0JCQkJQm9vbGVhbi52YWx1ZU9mKGIpKTsKLQotCQkvLyBDcmVhdGUgdGhlIGVkaXRpbmcgZG9tYWluLgotCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwKLQkJCQljb21tYW5kU3RhY2ssIHJlc291cmNlU2V0KTsKLQotCQkvLyBSZWdpc3RlciB0aGUgZWRpdGluZyBkb21haW4uCi0JCXJlZ2lzdGVyRWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAic2F2ZU1ldGhvZExpYnJhcnkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCQlza2lwRXZlbnRQcm9jZXNzaW5nID0gdHJ1ZTsKLQotCQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIGVkaXRpbmdEb21haW4KLQkJCQkJCS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCQlyZXNvdXJjZVNldC5zYXZlKHNhdmVPcHRpb25zKTsKLQotCQkJCSgoQmFzaWNDb21tYW5kU3RhY2spIGVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpCi0JCQkJCQkuc2F2ZUlzRG9uZSgpOwotCi0JCQkJc2tpcEV2ZW50UHJvY2Vzc2luZyA9IGZhbHNlOwotCi0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKGxpYnJhcnksIFBST1BfRElSVFkpOwotCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlza2lwRXZlbnRQcm9jZXNzaW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNjYXJkcyBhbGwgY2hhbmdlcyBtYWRlIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2NhcmRNZXRob2RMaWJyYXJ5Q2hhbmdlcygpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJkaXNjYXJkTWV0aG9kTGlicmFyeUNoYW5nZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpCi0JCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQlyZXNvdXJjZS5zZXRNb2RpZmllZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VNZXRob2RMaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTdHJpbmcgbXNnID0gImxpYnJhcnk9IiArIGxpYnJhcnkgKyAiLCBtZW1vcnkgb24gZW50cnk9IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJKyAoUnVudGltZS5nZXRSdW50aW1lKCkudG90YWxNZW1vcnkoKSAtIFJ1bnRpbWUKLQkJCQkJCQkuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKSk7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJjbG9zZU1ldGhvZExpYnJhcnkiLCBtc2cpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvL1N0cmluZyBsaWJQYXRoID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkvLwkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpOwotCQlGaWxlIGxpYkZpbGUgPSBuZXcgRmlsZShsaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJU3RyaW5nIGxpYlBhdGggPSBsaWJGaWxlLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQkvLyByZW1vdmUgdGhlIGNvbmZpZ3VyYXRpb24gbWFuYWdlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlicmFyeQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUNvbmZpZ3VyYXRpb25NYW5hZ2VycyhsaWJyYXJ5KTsKLQotCQlyZW1vdmVSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcnMoKTsKLQotCQkvLyBDbGVhciB0aGUgdGVtcCBsYXlvdXQgcmVzb3VyY2VzLgotCQlMYXlvdXRSZXNvdXJjZXMuY2xlYXIoKTsKLQotCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIGVkaXRpbmdEb21haW4KLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcmVzb3VyY2VTZXQudW5sb2FkKCk7Ci0KLQkJLy8gVW5sb2NrcyB0aGUgbWV0aG9kIGxpYnJhcnkuCi0JCXVubG9ja01ldGhvZExpYnJhcnkoKTsKLQotCQl0cnkgewotCQkJLy8gQ2xvc2UgdGhlIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgZmlsZS4KLQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0LmNsb3NlUHJvamVjdChsaWJQYXRoLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfQotCi0JCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNldCgpOwotCi0JCS8vIEFjdGl2YXRlcyB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuCi0JCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7Ci0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlTdHJpbmcgbXNnID0gImxpYnJhcnk9IiArIGxpYnJhcnkgKyAiLCBtZW1vcnkgb24gZXhpdD0iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrIChSdW50aW1lLmdldFJ1bnRpbWUoKS50b3RhbE1lbW9yeSgpIC0gUnVudGltZQotCQkJCQkJCS5nZXRSdW50aW1lKCkuZnJlZU1lbW9yeSgpKTsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImNsb3NlTWV0aG9kTGlicmFyeSIsIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TWV0aG9kTGlicmFyeSgpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJnZXRNZXRob2RMaWJyYXJ5IiwgImxpYnJhcnk9IiArIGxpYnJhcnkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgInNldE1ldGhvZExpYnJhcnkiLCAibGlicmFyeT0iICsgbGlicmFyeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJaWYgKHRoaXMubGlicmFyeSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgdGhpcy5saWJyYXJ5LmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQobGlicmFyeSk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLmxpYnJhcnkgPSBsaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJnZXRBZGFwdGVyRmFjdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGdldEVkaXRpbmdEb21haW4oKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGVkaXRpbmcgZG9tYWluCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywKLQkJCQkJImdldEVkaXRpbmdEb21haW4iLCAiZWRpdGluZ0RvbWFpbj0iICsgZWRpdGluZ0RvbWFpbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIGFuIGVkaXRpbmcgZG9tYWluIHdpdGggdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqICAgICAgICAgICAgYW4gZWRpdGluZyBkb21haW4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckVkaXRpbmdEb21haW4oQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgInJlZ2lzdGVyRWRpdGluZ0RvbWFpbiIsICJkb21haW49IiArIGRvbWFpbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gbW9uaXRvciBsaWJyYXJ5IGNoYW5nZXMgbWFkZSBpbiB0aGUgZ2l2ZW4gZWRpdGluZwotCQkvLyBkb21haW4uCi0JCSgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgZG9tYWluLmdldEFkYXB0ZXJGYWN0b3J5KCkpCi0JCQkJLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0KLQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gbW9uaXRvciBjaGFuZ2VzIG1hZGUgdG8gdGhlIGNvbW1hbmQgc3RhY2suCi0JCS8vIFRoaXMgaXMgdXNlZCB0byBzZWxlY3QgdGhlIG1vc3QgcmVjZW50bHkgYWZmZWN0ZWQgb2JqZWN0cyBpbiB0aGUKLQkJLy8gdmlld2VyLgotCQlkb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoY29tbWFuZFN0YWNrTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBtb25pdG9yIGNoYW5nZXMgdG8gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgY2hhbmdlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJhZGRMaXN0ZW5lciIsICJsaXN0ZW5lcj0iICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJaWYgKCFsaWJyYXJ5Q2hhbmdlZExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCQlsaWJyYXJ5Q2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRoYXQgd2FzIGFkZGVkIHRvIG1vbml0b3IgY2hhbmdlcyB0byB0aGUgbWFuYWdlZAotCSAqIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBsaWJyYXJ5IGNoYW5nZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChkZXRhY2hlZExpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlEZWJ1Z1RyYWNlCi0JCQkJCQkucHJpbnQodGhpcywgInJlbW92ZUxpc3RlbmVyIiwgImxpc3RlbmVyPSIgKyBsaXN0ZW5lcik7Ci0JCQl9Ci0KLQkJCS8vIENhY2hlIHRoZSBsaXN0ZW5lciBhbmQgcmVtb3ZlIGl0IGp1c3QgYmVmb3JlIGRpc3BhdGNoaW5nIHRoZQotCQkJLy8gbGlicmFyeSBjaGFuZ2VkIGV2ZW50cy4KLQkJCWlmICghZGV0YWNoZWRMaWJyYXJ5Q2hhbmdlZExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCQlkZXRhY2hlZExpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gbW9uaXRvciByZXNvdXJjZSBjaGFuZ2VzIGluIHRoZSBtYW5hZ2VkIG1ldGhvZAotCSAqIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCSJhZGRQcm9wZXJ0eUxpc3RlbmVyIiwgImxpc3RlbmVyPSIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdGhhdCB3YXMgYWRkZWQgdG8gbW9uaXRvciByZXNvdXJjZSBjaGFuZ2VzIGluIHRoZQotCSAqIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCSJyZW1vdmVQcm9wZXJ0eUxpc3RlbmVyIiwgImxpc3RlbmVyPSIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgbGlzdGVuaW5nIHRvIGNvbW1hbmQgcHJvY2Vzc2luZyBvbiBhIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRTdGFjawotCSAqICAgICAgICAgICAgYSBjb21tYW5kIHN0YWNrCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRMaXN0ZW5pbmdUbyhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLAotCQkJCQkic3RhcnRMaXN0ZW5pbmdUbyIsICJjb21tYW5kU3RhY2s9IiArIGNvbW1hbmRTdGFjayk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJY29tbWFuZFN0YWNrLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKGNvbW1hbmRTdGFja0xpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyBsaXN0ZW5pbmcgdG8gY29tbWFuZCBwcm9jZXNzaW5nIG9uIGEgY29tbWFuZCBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZFN0YWNrCi0JICogICAgICAgICAgICBhIGNvbW1hbmQgc3RhY2sKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wTGlzdGVuaW5nVG8oQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywKLQkJCQkJInN0b3BMaXN0ZW5pbmdUbyIsICJjb21tYW5kU3RhY2s9IiArIGNvbW1hbmRTdGFjayk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJY29tbWFuZFN0YWNrLnJlbW92ZUNvbW1hbmRTdGFja0xpc3RlbmVyKGNvbW1hbmRTdGFja0xpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgbGlzdGVuaW5nIHRvIGNoYW5nZSBub3RpZmljYXRpb25zIHNlbnQgZnJvbSBhbiBhZGFwdGVyIGZhY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhbiBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydExpc3RlbmluZ1RvKENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCSJzdGFydExpc3RlbmluZ1RvIiwgImFkYXB0ZXJGYWN0b3J5PSIgKyBhZGFwdGVyRmFjdG9yeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJYWRhcHRlckZhY3RvcnkuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyBsaXN0ZW5pbmcgdG8gY2hhbmdlIG5vdGlmaWNhdGlvbnMgc2VudCBmcm9tIGFuIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLAotCQkJCQkic3RvcExpc3RlbmluZ1RvIiwgImFkYXB0ZXJGYWN0b3J5PSIgKyBhZGFwdGVyRmFjdG9yeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJYWRhcHRlckZhY3RvcnkucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZ3VpZAotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBlbGVtZW50J3MgR1VJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGVsZW1lbnQgb2YgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KFN0cmluZyBndWlkKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiZ2V0TWV0aG9kRWxlbWVudCIsICJndWlkPSIgKyBndWlkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQl0cnkgewotCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBsaWJyYXJ5Ci0JCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpIHJlc291cmNlU2V0LmdldEVPYmplY3QoZ3VpZCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0aCkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlbGF0aXZlIFVSSSBvZiBhIG1ldGhvZCBlbGVtZW50IGluIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIHJlbGF0aXZlIFVSSQotCSAqLwotCXB1YmxpYyBVUkkgZ2V0RWxlbWVudFJlbGF0aXZlVVJJKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywKLQkJCQkJImdldEVsZW1lbnRSZWxhdGl2ZVVSSSIsICJlbGVtZW50PSIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGxpYnJhcnkuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCVVSSSBsaWJyYXJ5VVJJID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQkJVVJJIGVsZW1lbnRVUkkgPSBlbGVtZW50LmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQkJCXJldHVybiBlbGVtZW50VVJJLmRlcmVzb2x2ZShsaWJyYXJ5VVJJKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSBpcyByZWFkIG9ubHkuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgaXMgcmVhZCBvbmx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXRob2RMaWJyYXJ5UmVhZE9ubHkoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiaXNNZXRob2RMaWJyYXJ5UmVhZE9ubHkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJVVJJIGxpYnJhcnlVUkkgPSBsaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQlpZihsaWJyYXJ5VVJJLmlzRmlsZSgpKSB7Ci0JCQlGaWxlIGxpYnJhcnlYTUlGaWxlID0gbmV3IEZpbGUobGlicmFyeVVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlyZXR1cm4gbGlicmFyeVhNSUZpbGUuZXhpc3RzKCkgJiYgIWxpYnJhcnlYTUlGaWxlLmNhbldyaXRlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSBjb250ZW50IGhhcwotCSAqICAgICAgICAgYmVlbiBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kTGlicmFyeU1vZGlmaWVkKCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImlzTWV0aG9kTGlicmFyeU1vZGlmaWVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKQotCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJaWYgKHJlc291cmNlLmlzTW9kaWZpZWQoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSBoYXMgYW55IHVucmVzb2x2ZWQgcHJveHkuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSBoYXMgYW4KLQkgKiAgICAgICAgIHVucmVzb2x2ZWQgcHJveHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzVW5yZXNvbHZlZFByb3h5KCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImhhc1VucmVzb2x2ZWRQcm94eSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKChJTGlicmFyeVJlc291cmNlU2V0KSBlZGl0aW5nRG9tYWluCi0JCQkJLmdldFJlc291cmNlU2V0KCkpOwotCQlyZXR1cm4gcmVzb3VyY2VTZXQuaGFzVW5yZXNvbHZlZFByb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogUmVsb2FkcyB0aGUgZ2l2ZW4gcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIHJlbG9hZGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gcmVsb2FkUmVzb3VyY2VzKGZpbmFsIENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiQWJzdHJhY3RMaWJyYXJ5TWFuYWdlci5yZWxvYWRSZXNvdXJjZXMoKTogU1RBUlQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQlmaW5hbCBBcnJheUxpc3QgcmVsb2FkZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlyZWxvYWRlZFJlc291cmNlcy5hZGRBbGwoZG9SZWxvYWRSZXNvdXJjZXMocmVzb3VyY2VzKSk7Ci0KLQkJCQl9Ci0KLQkJCX07Ci0JCQl0cnkgewotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsCi0JCQkJCQluZXcgTGlicmFyeVNjaGVkdWxpbmdSdWxlKGxpYnJhcnkpLAotCQkJCQkJSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCXJldHVybiByZWxvYWRlZFJlc291cmNlczsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJBYnN0cmFjdExpYnJhcnlNYW5hZ2VyLmRvUmVsb2FkUmVzb3VyY2VzKCk6IEVORCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZG9SZWxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJyZWxvYWRSZXNvdXJjZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgcmVzb3VyY2VzIHRvIHJlbG9hZCBjb250YWlucyBhbnkgZWxlbWVudHMgY2FjaGVkIGluCi0JCS8vIExpYnJhcnlTZXJ2aWNlCi0JCS8vIHRvIHVwZGF0ZSB0aGVtCi0JCS8vCi0JCUxpYnJhcnlTZXJ2aWNlIGxpYlN2YyA9IChMaWJyYXJ5U2VydmljZSkgTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKTsKLQkJUmVzb3VyY2UgY3VycmVudExpYlJlc291cmNlID0gbnVsbDsKLQkJSUxpYnJhcnlNYW5hZ2VyIGN1cnJlbnRMaWJNZ3IgPSBudWxsOwotCQlSZXNvdXJjZSBjdXJyZW50Q29uZmlnUmVzb3VyY2UgPSBudWxsOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBudWxsOwotCQlMaXN0IGNvbmZpZ1Jlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBjb25maWdzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQlpZiAoZSA9PSBsaWJTdmMuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSkgewotCQkJCWN1cnJlbnRMaWJNZ3IgPSBsaWJTdmMuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJY3VycmVudExpYlJlc291cmNlID0gcmVzb3VyY2U7Ci0JCQl9IGVsc2UgaWYgKGUgPT0gbGliU3ZjLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpIHsKLQkJCQljdXJyZW50Q29uZmlnUmVzb3VyY2UgPSByZXNvdXJjZTsKLQkJCQljdXJyZW50Q29uZmlnID0gbGliU3ZjLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJY29uZmlnUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJY29uZmlncy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQotCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIGxpYnJhcnkKLQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJQ29sbGVjdGlvbiByZWxvYWRlZFJlc291cmNlcyA9IHJlc291cmNlU2V0LnJlbG9hZFJlc291cmNlcyhyZXNvdXJjZXMpOwotCQlpZiAoIXJlbG9hZGVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJaWYgKGN1cnJlbnRMaWJSZXNvdXJjZSAhPSBudWxsIHx8IGN1cnJlbnRDb25maWdSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJLy8gdXBkYXRlIGNhY2hlZCBlbGVtZW50cyBpbiBMaWJyYXJ5U2VydmljZSBhbmQgdGhpcyBsaWJyYXJ5Ci0JCQkJLy8gbWFuYWdlcgotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVsb2FkZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAocmVzb3VyY2UgPT0gY3VycmVudExpYlJlc291cmNlKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJCQkJTWV0aG9kTGlicmFyeSBuZXdMaWIgPSAoTWV0aG9kTGlicmFyeSkgZTsKLQkJCQkJCQlsaWJTdmMuc2V0Q3VycmVudE1ldGhvZExpYnJhcnkobmV3TGliKTsKLQkJCQkJCQlpZiAoY3VycmVudExpYk1nciBpbnN0YW5jZW9mIEFic3RyYWN0TGlicmFyeU1hbmFnZXIpIHsKLQkJCQkJCQkJbGliU3ZjLnJlbW92ZUxpYnJhcnlNYW5hZ2VyKGN1cnJlbnRMaWJNZ3IpOwotCQkJCQkJCQkoKEFic3RyYWN0TGlicmFyeU1hbmFnZXIpIGN1cnJlbnRMaWJNZ3IpCi0JCQkJCQkJCQkJLnVwZGF0ZU1ldGhvZExpYnJhcnkobmV3TGliKTsKLQkJCQkJCQkJbGliU3ZjLnNldExpYnJhcnlNYW5hZ2VyKGN1cnJlbnRMaWJNZ3IpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocmVzb3VyY2UgPT0gY3VycmVudENvbmZpZ1Jlc291cmNlKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCQkJLy8gcmVtb3ZlIGNvbmZpZyBtYW5hZ2VyIG9mIG9sZCBjdXJyZW50IGNvbmZpZwotCQkJCQkJCS8vCi0JCQkJCQkJbGliU3ZjLnJlbW92ZUNvbmZpZ3VyYXRpb25NYW5hZ2VyKGN1cnJlbnRDb25maWcpOwotCQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGU7Ci0JCQkJCQkJbGliU3ZjLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoIWNvbmZpZ1Jlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCWludCBpZCA9IGNvbmZpZ1Jlc291cmNlcy5pbmRleE9mKHJlc291cmNlKTsKLQkJCQkJCWlmIChpZCAhPSAtMSkgewotCQkJCQkJCS8vIHJlbW92ZSBjb25maWcgbWFuYWdlciBvZiBvbGQgY29uZmlnCi0JCQkJCQkJLy8KLQkJCQkJCQlsaWJTdmMKLQkJCQkJCQkJCS5yZW1vdmVDb25maWd1cmF0aW9uTWFuYWdlcigoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlncwotCQkJCQkJCQkJCQkuZ2V0KGlkKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFRPRE86IFJldmlldyBpbXBsZW1lbnRhdGlvbi4KLQkJCVN1cHByZXNzaW9uLmNsZWFuVXAoKTsKLQkJfQotCQlyZXR1cm4gcmVsb2FkZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0xpYgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbmV3TGliKSB7Ci0JCWxpYnJhcnkgPSBuZXdMaWI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3B0aW9ucyB1c2VkIGZvciBzYXZpbmcgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1hcCBvZiBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBzYXZlIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgTWFwIGdldFNhdmVPcHRpb25zKCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImdldFNhdmVPcHRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBzYXZlT3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmV3IG1ldGhvZCBwbHVnLWluIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNZXRob2RQbHVnaW4oZmluYWwgTWV0aG9kUGx1Z2luIHBsdWdpbikKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiYWRkTWV0aG9kUGx1Z2luIiwgInBsdWdpbj0iICsgcGx1Z2luKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQkvLyBUaGlzIG9wZXJhdGlvbiB3aWxsIGNhdXNlIGFuIFVJIHVwZGF0ZS4gSXQgbXVzdCBiZSBleGVjdXRlZCBpbgotCQkvLyB0aGUgbWFpbiBVSSB0byBhb2lkIGFuIEludmFsaWQgVGhyZWFkIEFjY2VzcyBleGNlcHRpb24uCi0JCWZpbmFsIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnMgPSBuZXcgRXhjZXB0aW9uWzFdOwotCi0JCXRyeSB7Ci0JCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKS5hZGQocGx1Z2luKTsKLQotCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMKLQkJCQkJCQkuZ2V0TGlicmFyeVBlcnNpc3RlcihnZXRMaWJyYXJ5UGVyc2lzdGVyVHlwZSgpKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCQl0cnkgewotCQkJCQkJcGVyc2lzdGVyLnNhdmUobGlicmFyeS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCWV4Y2VwdGlvbnNbMF0gPSBlOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0KLQotCQlpZiAoZXhjZXB0aW9uc1swXSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZXhjZXB0aW9uc1swXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGxpYnJhcnkgbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocHJlZmVyZW5jZVN0b3JlQ2hhbmdlTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJTGlicmFyeVBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCQkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmZXJlbmNlU3RvcmVDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAobGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpID4gMCkgewotCQkJbGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMuY2xlYXIoKTsKLQkJfQotCi0JCWlmIChkZXRhY2hlZExpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLnNpemUoKSA+IDApIHsKLQkJCWRldGFjaGVkTGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMuY2xlYXIoKTsKLQkJfQotCi0JCWlmIChyZXNvdXJjZUNoYW5nZUxpc3RlbmVycy5zaXplKCkgPiAwKSB7Ci0JCQlyZXNvdXJjZUNoYW5nZUxpc3RlbmVycy5jbGVhcigpOwotCQl9Ci0KLQkJZWRpdGluZ0RvbWFpbiA9IG51bGw7Ci0JCWxpYnJhcnkgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0aGUgYXJndW1lbnRzIHVzZWQgZm9yIGNyZWF0aW5nIGEgbmV3IG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluaW5nRWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudC9jb250YWluaW5nIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgZWxlbWVudAotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0VsZW1lbnRDcmVhdGlvbkFyZ3VtZW50cygKLQkJCU1ldGhvZEVsZW1lbnQgY29udGFpbmluZ0VsZW1lbnQsIFN0cmluZyBuYW1lKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKGNvbnRhaW5pbmdFbGVtZW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IEludmFsaWRNZXRob2RFbGVtZW50TmFtZUV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIFRPRE86IENoZWNrIGZvciBpbGxlZ2FsIGNoYXJhY3RlcnMuCi0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIHBlcnNpc3RlbmNlIHJlZnJlc2ggZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBhIHJlZnJlc2ggZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWZyZXNoRXZlbnQoSVJlZnJlc2hFdmVudCBldmVudCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImhhbmRsZVJlZnJlc2hFdmVudCIsICJyZWZyZXNoZWRSZXNvdXJjZXM9IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJKyBldmVudC5nZXRSZWZyZXNoZWRSZXNvdXJjZXMoKSk7Ci0JCX0KLQotCQlpZiAoIWV2ZW50LmdldFVubG9hZGVkT2JqZWN0cygpLmlzRW1wdHkoKSkgewotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuY2xlYW5VcCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgYWxsIGxpYnJhcnkgY2hhbmdlZCBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhlIG1hbmFnZWQgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgY2hhbmdlIHRoYXQgaGFzIG9jY3VycmVkCi0JICogQHBhcmFtIGNoYW5nZWRFbGVtZW50cwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBlbGVtZW50cyB0aGF0IGhhdmUgY2hhbmdlZAotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoZmluYWwgaW50IG9wdGlvbiwKLQkJCWZpbmFsIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgIm5vdGlmeUxpc3RlbmVycyIsICJvcHRpb249IiArIG9wdGlvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCS8vIFJlbW92ZSB0aGUgY2hhbmdlZCBsaXN0ZW5lcnMgdGhhdCBoYXZlIGJlZW4gZGV0dGFjaGVkLgotCQkJaWYgKGRldGFjaGVkTGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBkZXRhY2hlZExpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbCA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKGxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLmNvbnRhaW5zKGwpKSB7Ci0JCQkJCQlsaWJyYXJ5Q2hhbmdlZExpc3RlbmVycy5yZW1vdmUobCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZGV0YWNoZWRMaWJyYXJ5Q2hhbmdlZExpc3RlbmVycy5jbGVhcigpOwotCQkJfQotCi0JCQkvLyBOb3RpZnkgdGhlIGNoYW5nZWQgbGlzdGVuZXJzLgotCQkJLy8gTm90ZTogbW9yZSBjaGFuZ2VkIGxpc3RlbmVycyBtYXkgYmUgYWRkZWQgd2hpbGUgZWFjaCBsaXN0ZW5lciBpcwotCQkJLy8gYmVpbmcgbm90aWZpZWQuIEhvd2V2ZXIsCi0JCQkvLyB0aGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCB3aGljaCBkb2VzIG5vIGhhcm0uCi0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IGxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLnNpemUoKSkgewotCQkJCWZpbmFsIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcikgbGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJLy8gU2luY2UgdGhpcyBtYXkgdHJpZ2dlciBhbiB1cGRhdGUgdG8gdGhlIFVJLCB0aGUKLQkJCQkJLy8gbm90aWZpY2F0aW9uIG11c3QgYmUgZXhlY3V0ZWQgaW4gdGhlIFVJIHRocmVhZCB0byBhdm9pZAotCQkJCQkvLyBnZXR0aW5nIGFuIEludmFsaWQgVGhyZWFkIEFjY2VzcyBleGNlcHRpb24uIFRoZQotCQkJCQkvLyBub3RpZmljYXRpb24gbXVzdCBhbHNvIGJlIGV4ZWN1dGVkIGluIHN5bmMgbW9kZSB0bwotCQkJCQkvLyBndXJhbnRlZSBkZWxpdmVyeSBvZiB0aGUgZXZlbnQgYmVmb3JlIGEgbGlzdGVuZXIgaXMKLQkJCQkJLy8gZGlzcG9zZWQuCi0JCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJRGVidWdUcmFjZQotCQkJCQkJCQkJCS5wcmludCgKLQkJCQkJCQkJCQkJCXRoaXMsCi0JCQkJCQkJCQkJCQkibm90aWZ5TGlzdGVuZXJzIiwgImxpc3RlbmVyPSIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCX0KLQkJCQkJCQlsaXN0ZW5lci5saWJyYXJ5Q2hhbmdlZChvcHRpb24sIGNvbGxlY3Rpb24pOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQkJaSsrOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAibm90aWZ5TGlzdGVuZXJzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZpcmVzIGEgcHJvcGVydHkgY2hhbmdlZCBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlJZAotCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGZpbmFsIE9iamVjdCBzb3VyY2UsIGZpbmFsIGludCBwcm9wZXJ0eUlkKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiZmlyZVByb3BlcnR5Q2hhbmdlIiwgInNvdXJjZT0iICsgc291cmNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlPYmplY3RbXSBhcnJheSA9IHJlc291cmNlQ2hhbmdlTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBJUHJvcGVydHlMaXN0ZW5lciBsaXN0ZW5lciA9IChJUHJvcGVydHlMaXN0ZW5lcikgYXJyYXlbaV07Ci0KLQkJCS8vIFRoaXMgb3BlcmF0aW9uIHdpbGwgY2F1c2UgYW4gVUkgdXBkYXRlLiBJdCBtdXN0IGJlIGV4ZWN1dGVkIGluCi0JCQkvLyB0aGUgbWFpbiBVSSB0byBhb2lkIGFuIEludmFsaWQgVGhyZWFkIEFjY2VzcyBleGNlcHRpb24uCi0JCQlTYWZlVXBkYXRlQ29udHJvbGxlci5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCQkJCSJmaXJlUHJvcGVydHlDaGFuZ2UiLCAibGlzdGVuZXI9IiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKHNvdXJjZSwgcHJvcGVydHlJZCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgcmVzb3VyY2UgY2hhbmdlZCBsaXN0ZW5lciB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXJzKCkgewotCQlpZiAobGlicmFyeSA9PSBudWxsIHx8IGxpYnJhcnkuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFsaWJyYXJ5LmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmNvbnRhaW5zKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKSkgewotCQkJbGlicmFyeS5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlpZiAoIXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5jb250YWlucygKLQkJCQkJcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpKSB7Ci0JCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQlpZiAoIWNvbmZpZy5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5jb250YWlucygKLQkJCQkJcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpKSB7Ci0JCQkJY29uZmlnLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSByZXNvdXJjZSBjaGFuZ2VkIGxpc3RlbmVyIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5Ci0JICogcmVzb3VyY2UgYW5kIG1ldGhvZCBwbHVnLWlucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwgfHwgbGlicmFyeS5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlsaWJyYXJ5LmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLnJlbW92ZShyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlwbHVnaW4uZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0Lm5leHQoKTsKLQkJCWNvbmZpZy5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5yZW1vdmUocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkgcmVzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpIHsKLQkJTGlzdCByZXMgPSBnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKTsKLQkJaWYgKHJlcy5zaXplKCkgPiAwKSB7Ci0JCQlyZXR1cm4gKFJlc291cmNlKSByZXMuZ2V0KDApOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgVVJJIG9mIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5qYXZhLm5ldC5VUkk8L2NvZGU+Ci0JICovCi0JcHVibGljIGphdmEubmV0LlVSSSBnZXRNZXRob2RMaWJyYXJ5VVJJKCkgewotCQlSZXNvdXJjZSBzYXZlZFJlc291cmNlID0gZ2V0TWV0aG9kTGlicmFyeVJlc291cmNlKCk7Ci0JCWlmIChzYXZlZFJlc291cmNlICE9IG51bGwpIHsKLQkJCVVSSSByZXNvdXJjZVVSSSA9IHNhdmVkUmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQl0cnkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlVVJJLnRvRmlsZVN0cmluZygpKTsKLQkJCQlyZXR1cm4gZmlsZS5nZXRQYXJlbnRGaWxlKCkudG9VUkkoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbmV3IHBhY2thZ2VzIGludG8gdGhlIGNvbmZpZ3VyYXRpb25zIGlmIHRoZSBwYXJlbnQgaXMgaW4gdGhlCi0JICogY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTmV3UGFja2FnZXNUb0NvbmZpZ3VyYXRpb24oQ29sbGVjdGlvbiBuZXdvYmpzKSB7Ci0JCWlmIChuZXdvYmpzID09IG51bGwgfHwgbmV3b2Jqcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlciBoZWxwZXIgPSBuZXcgTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcigpOwotCi0JCXRyeSB7Ci0JCQlFT2JqZWN0IGUsIHBhcmVudDsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBuZXdvYmpzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQllID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQlpZiAoKGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKQotCQkJCQkJJiYgKChwYXJlbnQgPSBlLmVDb250YWluZXIoKSkgIT0gbnVsbCkKLQkJCQkJCSYmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSkgewotCQkJCQlPYmplY3QgY29uZmlncyA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHBhcmVudCkKLQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoQXNzb2NpYXRpb25IZWxwZXIuTWV0aG9kUGFja2FnZV9NZXRob2RDb25maWd1cmF0aW9ucyk7Ci0JCQkJCWlmIChjb25maWdzIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGNvbmZpZyA9ICgoTGlzdCkgY29uZmlncykuaXRlcmF0b3IoKTsgaXRjb25maWcKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdGNvbmZpZwotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQlMaXN0IHBrZ3MgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJCQkJCWlmICghcGtncy5jb250YWlucyhlKSkgewotCQkJCQkJCQkvLyBwa2dzLmFkZChlKTsKLQkJCQkJCQkJaGVscGVyCi0JCQkJCQkJCQkJLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQkJCWNvbmZpZywKLQkJCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwKLQkJCQkJCQkJCQkJCWUsIC0xKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWhlbHBlci5zYXZlKCk7Ci0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWhlbHBlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB1bmxvY2tNZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0eXBlIG9mIGxpYnJhcnkgcGVyc2lzdGVyIHRvIGJlIHVzZWQgaW4gdGhpcyBsaWJyYXJ5IG1hbmFnZXIKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaWJyYXJ5IHBlcnNpc3RlciB0eXBlCi0JICogQHNlZSBTZXJ2aWNlcyNYTUlfUEVSU0lTVEVOQ0VfVFlQRQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TGlicmFyeVBlcnNpc3RlclR5cGUoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUxpYnJhcnlSZXNvdXJjZVNldCBjcmVhdGVSZXNvdXJjZVNldCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NvbmZpZ3VyYXRpb25BbHJlYWR5RXhpc3RzRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9Db25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlN2RiZDQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NvbmZpZ3VyYXRpb25BbHJlYWR5RXhpc3RzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBNZXRob2QgQ29uZmlndXJhdGlvbiBhbHJlYWR5IGV4aXN0cy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbiBleHRlbmRzCi0JCUxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkFscmVhZHlFeGlzdHNFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkFscmVhZHlFeGlzdHNFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSByb290IGNhdXNlIG9mIHRoZQotCSAqIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2csCi0JCQlUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKGVycm9yTXNnLCByb290Q2F1c2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NvbmZpZ3VyYXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyNzVlMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5EZXBlbmRlbmN5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIE1hbmFnZXMgYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uTWFuYWdlciB7Ci0KLQkvLyBJZiB0cnVlLCBnZW5lcmF0ZSBkZWJ1ZyB0cmFjZXMuCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8vIFRoZSBtYW5hZ2VkIG1ldGhvZCBjb25maWd1cmFpdG9uLgotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkKLQkvLyBUaGUgbWFuYWdlZCBjb25maWd1cmFpdG9uIGRhdGEuCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uRGF0YSBjb25maWdEYXRhOwotCi0JLy8gVGhlIGNvbnRhaW5pbmcgbWV0aG9kIGxpYnJhcnkgZm9yIHRoZSBtYW5hZ2VkIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IGxpYnJhcnk7Ci0KLQkvLyBUaGUgbGlicmFyeSBtYW5hZ2VyIGZvciB0aGUgY29udGFpbmluZyBtZXRob2QgbGlicmFyeS4KLQlwcm90ZWN0ZWQgSUxpYnJhcnlNYW5hZ2VyIGxpYnJhcnlNYW5hZ2VyOwotCi0JLy8gVGhlIGRlcGVuZGVuY3kgbWFuYWdlci4KLQlwcm90ZWN0ZWQgRGVwZW5kZW5jeU1hbmFnZXIgZGVwZW5kZW5jeU1hbmFnZXI7Ci0KLQkvLyBUaGUgbGF5b3V0IG1hbmFnZXIuCi0JcHJvdGVjdGVkIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXI7Ci0KLQkvLyBUaGUgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGFmY3A7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbk1hbmFnZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCWNvbmZpZ0RhdGEgPSBuZXcgQ29uZmlndXJhdGlvbkRhdGEoY29uZmlnKTsKLQotCQlsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldE1ldGhvZExpYnJhcnkoY29uZmlnKTsKLQotCQlsaWJyYXJ5TWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0TGlicmFyeU1hbmFnZXIobGlicmFyeSk7Ci0JCWFmY3AgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIobGlicmFyeU1hbmFnZXIKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkJZGVwZW5kZW5jeU1hbmFnZXIgPSBuZXcgRGVwZW5kZW5jeU1hbmFnZXIobGlicmFyeSk7Ci0KLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQlsYXlvdXRNYW5hZ2VyID0gbmV3IEVsZW1lbnRMYXlvdXRNYW5hZ2VyKCk7Ci0JCX0gZWxzZSB7Ci0JCQlsYXlvdXRNYW5hZ2VyID0gbmV3IEVsZW1lbnRMYXlvdXRNYW5hZ2VyKGNvbmZpZyk7Ci0JCQkvLyBjbG9zdXJlID0gbmV3IENvbmZpZ3VyYXRpb25DbG9zdXJlKHRoaXMsIGNvbmZpZyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBtYW5hZ2VkIGJ5IHRoaXMgY29uZmlndXJhdGlvbiBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUNvbmZpZ3VyYXRpb25NYW5hZ2VyI2dldENvbmZpZ3VyYXRpb25EYXRhKCkKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkRhdGEgZ2V0Q29uZmlndXJhdGlvbkRhdGEoKSB7Ci0JCXJldHVybiBjb25maWdEYXRhOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBjb250YWluaW5nIG1ldGhvZCBsaWJyYXJ5IGZvciB0aGUgbWFuYWdlZCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KCkgewotCQlyZXR1cm4gbGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBsaWJyYXJ5TWFuYWdlci5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXIgZmFjdG9yeSBjb250ZW50IHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGNvbnRlbnQgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gYWZjcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXBlbmRlbmN5IG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhIGRlcGVuZGVuY3kgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBEZXBlbmRlbmN5TWFuYWdlciBnZXREZXBlbmRlbmN5TWFuYWdlcigpIHsKLQkJcmV0dXJuIGRlcGVuZGVuY3lNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnQgbGF5b3V0IG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhbiBlbGVtZW50IGxheW91dCBtYW5hZ2VyCi0JICovCi0JcHVibGljIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldEVsZW1lbnRMYXlvdXRNYW5hZ2VyKCkgewotCQlyZXR1cm4gbGF5b3V0TWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIGNsb3N1cmUuCi0JICogCi0JICogQHJldHVybiBhIGNvbmZpZ3VyYXRpb24gY2xvc3VyZQotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQ2xvc3VyZSBnZXRDb25maWd1cmF0aW9uQ2xvc3VyZSgpIHsKLQkJcmV0dXJuIGNsb3N1cmU7Ci0JfQotCi0JLyoqCi0JICogTWFrZXMgYSBjb25maWd1cmF0aW9uIGNsb3N1cmUuCi0JICovCi0JcHVibGljIHZvaWQgbWFrZUNvbmZpZ3VyYXRpb25DbG9zdXJlKCkgewotCQlpZiAoY2xvc3VyZSAhPSBudWxsKSB7Ci0JCQljbG9zdXJlLm1ha2VDbG9zdXJlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBtZXRob2QgcGx1Zy1pbnMgaW4gdGhlIGNvbnRhaW5pbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgbWV0aG9kIHBsdWctaW5zCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kUGx1Z2lucygpIHsKLQkJcmV0dXJuIGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbiBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNvbmZpZyA9IG51bGw7Ci0JCWxpYnJhcnkgPSBudWxsOwotCQlsaWJyYXJ5TWFuYWdlciA9IG51bGw7Ci0JCWRlcGVuZGVuY3lNYW5hZ2VyID0gbnVsbDsKLQkJbGF5b3V0TWFuYWdlciA9IG51bGw7Ci0JCWNsb3N1cmUgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmYTBkMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIExpYnJhcnkgTWFuYWdlciBpbnN0YW5jZSBjYW5ub3QgYmUgY3JlYXRlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbiBleHRlbmRzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSByb290IGNhdXNlIG9mIHRoZQotCSAqIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2csIFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIoZXJyb3JNc2csIHJvb3RDYXVzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JQ29uZmlndXJhdGlvbkNsb3N1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lDb25maWd1cmF0aW9uQ2xvc3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYjA1ZTYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lDb25maWd1cmF0aW9uQ2xvc3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnREZXBlbmRlbmN5RXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIE1ldGhvZCBDb25maWd1cmF0aW9uIENsb3N1cmUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmF0aW9uQ2xvc3VyZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250YWluaW5pbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TGlicmFyeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcyBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogICAgICAgICAgICBhbiBhcnJheSBvZiBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9ucyhPYmplY3RbXSBlbGVtZW50cyk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBwbHVnLWluIG9yIHBhY2thZ2UgaXMgc2VsZWN0ZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBzZWxlY3RlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoT2JqZWN0IGlucHV0KTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGVsZW1lbnQgZGVwZW5kZW5jeSBlcnJvciBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAZWxlbWVudCBBIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgPGNvZGU+RWxlbWVudERlcGVuZGVuY3lFcnJvcjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERlcGVuZGVuY3lFcnJvciBnZXRFcnJvcihPYmplY3QgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgY2xvc3VyZSBoYXMgYW55IGVycm9yLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNsb3N1cmUgaGFzIG9uZSBvciBtb3JlIGVycm9ycwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0Vycm9yKCk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgY2xvc3VyZSBoYXMgYW55IHByb2JsZW0uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2xvc3VyZSBoYXMgb25lIG9yIG1vcmUgcHJvYmxlbXMuXAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Byb2JsZW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBlcnJvcnMuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgPGNvZGU+RXJyb3JJbmZvPC9jb2RlPgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFsbEVycm9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGRlcGVuZGVuY3kgZXJyb3JzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgPGNvZGU+RWxlbWVudERlcGVuZGVuY3lFcnJvcjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RGVwZW5kZW5jeUVycm9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGludmFsaWQgZWxlbWVudHMuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgaW52YWxpZCBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEludmFsaWRFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGNoYW5nZWQgZWxlbWVudHMuIFRoZXNlIGFyZSBlbGVtZW50cyB3aG9zZSBjaGVjayBzdGF0ZXMKLQkgKiBoYXZlIGNoYW5nZWQgb3Igd2hvc2UgaW1hZ2UgaGF2ZSBjaGFuZ2VkIGR1ZSB0byBlcnJvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBjaGFuZ2VkIG1ldGhvZCBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldENoYW5nZWRFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcyBzZWxlY3Rpb24uCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldFNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogTWFrZXMgYSBjbG9zdXJlIG9mIHRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Zy1pbiBhbmQgcGFja2FnZXMgaW4gYSBtZXRob2QKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIG1ha2VDbG9zdXJlKCk7Ci0KLQkvKioKLQkgKiBGaXhlcyBhbGwgZXJyb3JzIGFuZCB3YXJuaW5ncyBpbiB0aGUgY2xvc3VyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXhQcm9ibGVtcygpOwotCi0JLyoqCi0JICogU2F2ZXMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBQYWNrYWdlcyB0aGUgbGlicmFyeSBiYXNlZCBvbiB0aGUgc2VsZWN0aW9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgd2lsbCBjaGFuZ2UgdGhlIGN1cnJlbnQgbGlicmFyeS4gQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIGEKLQkgKiBjb3B5IG9mIHRoZSBjdXJyZW50IGxpYnJhcnkgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIHN0ZXBzOgotCSAqIDEuIENyZWF0ZSBhIG5ldyA8Y29kZT5Db25maWd1cmF0aW9uTWFuYWdlcjwvY29kZT4gd2l0aCBhIGNvcHkgb2YgdGhlCi0JICogb3JpZ2luYWwgbGlicmFyeSwgMi4gUmVidWlsZCB0aGUgZGVwZW5kZW5jeSwgMy4gQ3JlYXRlIGEKLQkgKiA8Y29kZT5Db25maWd1cmF0aW9uQ2xvc3VyZTwvY29kZT4gd2l0aCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByZW1vdmVCcm9rZW5SZWZlcmVuY2VzCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcmVtb3ZlIGFsbCBicm9rZW4gcmVmZXJlbmNlcwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IHBhY2thZ2VMaWJyYXJ5KGJvb2xlYW4gcmVtb3ZlQnJva2VuUmVmZXJlbmNlcyk7Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgY2xvc3VyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lDb25maWd1cmF0aW9uTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUNvbmZpZ3VyYXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwZTBjOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUNvbmZpZ3VyYXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuRGVwZW5kZW5jeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIE1ldGhvZCBDb25maWd1cmF0aW9uIE1hbmFnZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmF0aW9uTWFuYWdlciB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBtYW5hZ2VkIGJ5IHRoaXMgY29uZmlndXJhdGlvbiBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkKLQkvKioKLQkgKiBHZXRzIENvbmZpZ3VyYXRpb25EYXRhIG9iamVjdCBtYW5hZ2VkIGJ5IHRoaXMgY29uZmlndXJhdGlvbiBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gYSBDb25maWd1cmF0aW9uRGF0YSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkRhdGEgZ2V0Q29uZmlndXJhdGlvbkRhdGEoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRhaW5pbmcgbWV0aG9kIGxpYnJhcnkgZm9yIHRoZSBtYW5hZ2VkIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldE1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgYWRhcHRlciBmYWN0b3J5IGNvbnRlbnQgcHJvdmlkZXIuCi0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgY29udGVudCBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGRlcGVuZGVuY3kgbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgZGVwZW5kZW5jeSBtYW5hZ2VyCi0JICovCi0JcHVibGljIERlcGVuZGVuY3lNYW5hZ2VyIGdldERlcGVuZGVuY3lNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbGVtZW50IGxheW91dCBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gYW4gZWxlbWVudCBsYXlvdXQgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRFbGVtZW50TGF5b3V0TWFuYWdlcigpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIGNsb3N1cmUKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNsb3N1cmUgZ2V0Q29uZmlndXJhdGlvbkNsb3N1cmUoKTsKLQotCS8qKgotCSAqIE1ha2VzIGEgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIG1ha2VDb25maWd1cmF0aW9uQ2xvc3VyZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgbWV0aG9kIHBsdWctaW5zIGluIHRoZSBjb250YWluaW5nIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIG1ldGhvZCBwbHVnLWlucwotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZFBsdWdpbnMoKTsKLQkKLQkvKioKLQkgKiBEaXNwb3NlcyBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiZGMzNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgTGlicmFyeSBNYW5hZ2VyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeU1hbmFnZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoU3RyaW5nIG5hbWUsIE1hcCBhcmdzKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogT3BlbnMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5IFVSSQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KGphdmEubmV0LlVSSSB1cmkpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBhcmd1bWVudHMKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBvcGVuTWV0aG9kTGlicmFyeShNYXAgYXJncykKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlb3BlbnMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcmVvcGVuTWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNhdmVzIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVNZXRob2RMaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRGlzY2FyZHMgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjYXJkTWV0aG9kTGlicmFyeUNoYW5nZXMoKTsKLQotCS8qKgotCSAqIENsb3NlcyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZU1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldE1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk8L2NvZGU+Ci0JICovCi0JcHVibGljIGphdmEubmV0LlVSSSBnZXRNZXRob2RMaWJyYXJ5VVJJKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZExpYnJhcnlQYXRoKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGVkaXRpbmcgZG9tYWluCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCk7Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgYW4gZWRpdGluZyBkb21haW4gd2l0aCB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICBhbiBlZGl0aW5nIGRvbWFpbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRWRpdGluZ0RvbWFpbihBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZG9tYWluKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBtb25pdG9yIGNoYW5nZXMgdG8gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgY2hhbmdlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdGhhdCB3YXMgYWRkZWQgdG8gbW9uaXRvciBjaGFuZ2VzIHRvIHRoZSBtYW5hZ2VkCi0JICogbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgY2hhbmdlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gbW9uaXRvciByZXNvdXJjZSBjaGFuZ2VzIGluIHRoZSBtYW5hZ2VkIG1ldGhvZAotCSAqIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIG1vbml0b3IgcmVzb3VyY2UgY2hhbmdlcyBpbiB0aGUgbWFuYWdlZCBtZXRob2QKLQkgKiBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlMaXN0ZW5lcihJUHJvcGVydHlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBTdGFydHMgbGlzdGVuaW5nIHRvIGNvbW1hbmQgcHJvY2Vzc2luZyBvbiBhIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRTdGFjawotCSAqICAgICAgICAgICAgYSBjb21tYW5kIHN0YWNrCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRMaXN0ZW5pbmdUbyhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKTsKLQotCS8qKgotCSAqIFN0b3BzIGxpc3RlbmluZyB0byBjb21tYW5kIHByb2Nlc3Npbmcgb24gYSBjb21tYW5kIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIGEgY29tbWFuZCBzdGFjawotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKTsKLQotCS8qKgotCSAqIFN0YXJ0cyBsaXN0ZW5pbmcgdG8gY2hhbmdlIG5vdGlmaWNhdGlvbnMgc2VudCBmcm9tIGFuIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0TGlzdGVuaW5nVG8oQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSk7Ci0KLQkvKioKLQkgKiBTdG9wcyBsaXN0ZW5pbmcgdG8gY2hhbmdlIG5vdGlmaWNhdGlvbnMgc2VudCBmcm9tIGFuIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KTsKLQotCS8qKgotCSAqIEdldHMgYSBtZXRob2QgZWxlbWVudCBmcm9tIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBndWlkCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGVsZW1lbnQncyBHVUlELgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgZWxlbWVudCBvZiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoU3RyaW5nIGd1aWQpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVsYXRpdmUgVVJJIG9mIGEgbWV0aG9kIGVsZW1lbnQgaW4gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgcmVsYXRpdmUgVVJJCi0JICovCi0JcHVibGljIFVSSSBnZXRFbGVtZW50UmVsYXRpdmVVUkkoTWV0aG9kRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IGlzIGxvY2tlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbGlicmFyeSBpcyBsb2NrZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZExpYnJhcnlMb2NrZWQoKTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IGlzIHJlYWQgb25seS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbGlicmFyeSBpcyByZWFkIG9ubHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZExpYnJhcnlSZWFkT25seSgpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgaGFzCi0JICogICAgICAgICBiZWVuIG1vZGlmaWVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXRob2RMaWJyYXJ5TW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IGhhcyBhbnkgdW5yZXNvbHZlZCBwcm94eS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IGhhcyBhbgotCSAqICAgICAgICAgdW5yZXNvbHZlZCBwcm94eS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNVbnJlc29sdmVkUHJveHkoKTsKLQotCS8qKgotCSAqIFJlbG9hZHMgdGhlIGdpdmVuIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIHRoYXQgaGF2ZSByZWxvYWRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIHJlbG9hZFJlc291cmNlcyhDb2xsZWN0aW9uIHJlc291cmNlcyk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHRpb25zIHVzZWQgZm9yIHNhdmluZyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIHNhdmUgb3B0aW9ucwotCSAqLwotCXB1YmxpYyBNYXAgZ2V0U2F2ZU9wdGlvbnMoKTsKLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgbWV0aG9kIHBsdWctaW4gdG8gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgYSBtZXRob2QgcGx1Zy1pbgotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gcGx1Z2luKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRGlzcG9zZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBsaWJyYXJ5IG1hbmFnZXIuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeVNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZGQ5MGNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgU2VydmljZSBBUEkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeVNlcnZpY2UgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLAotCQkJTWFwIHBhcmFtcykgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogT3BlbnMgYW4gZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoU3RyaW5nIHR5cGUsIE1hcCBwYXJhbXMpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZW9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSByZW9wZW5NZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlb3BlbnMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2F2ZXMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENsb3NlcyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIDxwPgotCSAqIFRoaXMgYXV0b21hdGljYWxseSBkaXNwb3NlcyBpdHMgbGlicmFyeSBtYW5hZ2VyIGFuZCB0aGUgY29uZmlndXJhdGlvbiBtYW5hZ2VycyAKLQkgKiB0aGF0IG1hbmFnZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGluIHRoZSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlcGxhY2VzIGEgdGhlIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBvbGRMaWJyYXJ5Ci0JICogICAgICAgICAgICB0aGUgb2xkIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIG5ld0xpYnJhcnkKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBsYWNlTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IG9sZExpYnJhcnksCi0JCQlNZXRob2RMaWJyYXJ5IG5ld0xpYnJhcnkpOwotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIG1vbml0b3IgTGlicmFyeSBTZXJ2aWNlIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGlicmFyeSBzZXJ2aWNlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRoYXQgd2FzIGFkZGVkIHRvIG1vbml0b3IgTGlicmFyeSBTZXJ2aWNlIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGlicmFyeSBzZXJ2aWNlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IHBhdGguCi0JICogPHA+Ci0JICogTm90ZTogQSBmaWxlLWJhc2VkIG1ldGhvZCBsaWJyYXJ5IG1heSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgbWFuYWdlciBmb3IgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYSBsaWJyYXJ5IG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlNYW5hZ2VyIGdldExpYnJhcnlNYW5hZ2VyKE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0JCi0JcHVibGljIHZvaWQgc2V0TGlicmFyeU1hbmFnZXIoSUxpYnJhcnlNYW5hZ2VyIGxpYk1ncik7Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaWJyYXJ5TWFuYWdlcihJTGlicmFyeU1hbmFnZXIgbGliTWdyKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgbWFuYWdlciBmb3IgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIGxpYnJhcnkgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBJTGlicmFyeU1hbmFnZXIgZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgdGhlIGNvbnRhaW5pbmcgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKFN0cmluZyBuYW1lLAotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIG1hbmFnZXIgZm9yIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXIoCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXJzKAotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5KTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIG1hbmFnZXIgZm9yIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldEN1cnJlbnRDb25maWd1cmF0aW9uTWFuYWdlcigpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeVNlcnZpY2VMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWFiZmVjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeVNlcnZpY2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBMaWJyYXJ5IFNlcnZpY2UgbGlzdGVuZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gd2hlbiBhIG1ldGhvZCBsaWJyYXJ5IGhhcyBiZWVuIGNyZWF0ZWQuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHdoZW4gYSBtZXRob2QgbGlicmFyeSBoYXMgYmVlbiBvcGVuZWQuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gd2hlbiBhIG1ldGhvZCBsaWJyYXJ5IGhhcyBiZWVuIHJlb3BlbmVkLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gd2hlbiBhIG1ldGhvZCBsaWJyYXJ5IGhhcyBiZWVuIGNsb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KTsKLQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiB3aGVuIGEgbWV0aG9kIGxpYnJhcnkgaGFzIGJlZW4gc2V0IGFzIHRoZSBjdXJyZW50Ci0JICogbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gd2hlbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHNldCBhcyB0aGUKLQkgKiBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSW52YWxpZE1ldGhvZEVsZW1lbnROYW1lRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzczZjZhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIG1ldGhvZCBlbGVtZW50IG5hbWUgaXMgaW52YWxpZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24gZXh0ZW5kcyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEludmFsaWRNZXRob2RFbGVtZW50TmFtZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBJbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgcm9vdCBjYXVzZSBvZiB0aGUKLQkgKiBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSW52YWxpZE1ldGhvZEVsZW1lbnROYW1lRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZywKLQkJCVRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIoZXJyb3JNc2csIHJvb3RDYXVzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeUFscmVhZHlFeGlzdHNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU3MTE1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGEgTWV0aG9kIExpYnJhcnkgYWxyZWFkeSBleGlzdHMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUFscmVhZHlFeGlzdHNFeGNlcHRpb24gZXh0ZW5kcyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIExpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIocm9vdENhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgTGlicmFyeUFscmVhZHlFeGlzdHNFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgcm9vdCBjYXVzZSBvZiB0aGUKLQkgKiBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTGlicmFyeUFscmVhZHlFeGlzdHNFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnLCBUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKGVycm9yTXNnLCByb290Q2F1c2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeU1hbmFnZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5TWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDhlNmRlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5TWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmludGVybmFsLkxpYnJhcnlNYW5hZ2VyRWxlbWVudDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGNyZWF0aW9uIG9mIExpYnJhcnkgTWFuYWdlciBpbnN0YW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeU1hbmFnZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAibGlicmFyeU1hbmFnZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBMaWJyYXJ5TWFuYWdlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JLy8gQSBtYXAgb2YgbGlicmFyeSBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0JcHJpdmF0ZSBNYXAgbGlicmFyeU1hbmFnZXJFbGVtZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5TWFuYWdlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IExpYnJhcnlNYW5hZ2VyRmFjdG9yeSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIExpYnJhcnlNYW5hZ2VyRmFjdG9yeSgpIHsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJLy8gUHJvY2VzcyB0aGUgIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxpYnJhcnlNYW5hZ2VycyIgZXh0ZW5zaW9uIHBvaW50Ci0JCS8vIGNvbnRyaWJ1dG9ycy4KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIHR5cGVJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyB0eXBlTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgidHlwZU5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHR5cGVJZCAhPSBudWxsICYmIHR5cGVJZC50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHR5cGVOYW1lICE9IG51bGwKLQkJCQkJCQkJJiYgdHlwZU5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotLy8JCQkJCQkJaWYgKCFsaWJyYXJ5TWFuYWdlckVsZW1lbnRzLmNvbnRhaW5zS2V5KHR5cGVJZCkpIHsKLQkJCQkJCQkJTGlicmFyeU1hbmFnZXJFbGVtZW50IHByb3ZpZGVyID0gbmV3IExpYnJhcnlNYW5hZ2VyRWxlbWVudCgKLQkJCQkJCQkJCQlidW5kbGUsIGNsYXNzTmFtZSwgdHlwZUlkLCB0eXBlTmFtZSk7Ci0JCQkJCQkJCWxpYnJhcnlNYW5hZ2VyRWxlbWVudHMucHV0KHR5cGVJZCwgcHJvdmlkZXIpOwotLy8JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxpYnJhcnkgbWFuYWdlciBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUKLQkgKiBAcmV0dXJuIGEgbGlicmFyeSBtYW5hZ2VyCi0JICogQHRocm93IDxjb2RlPkNyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMKLQkgKiAgICAgICAgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIElMaWJyYXJ5TWFuYWdlciBjcmVhdGVMaWJyYXJ5TWFuYWdlcihTdHJpbmcgdHlwZSkKLQkJCXRocm93cyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbiB7Ci0JCUxpYnJhcnlNYW5hZ2VyRWxlbWVudCBwcm92aWRlciA9IChMaWJyYXJ5TWFuYWdlckVsZW1lbnQpIGxpYnJhcnlNYW5hZ2VyRWxlbWVudHMKLQkJCQkuZ2V0KHR5cGUpOwotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IENyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCUNsYXNzIGNsYXp6ID0gcHJvdmlkZXIuZ2V0QnVuZGxlKCkubG9hZENsYXNzKAotCQkJCQlwcm92aWRlci5nZXRDbGFzc05hbWUoKSk7Ci0JCQlyZXR1cm4gKElMaWJyYXJ5TWFuYWdlcikgY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdGhyb3cgbmV3IENyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGxpYnJhcnkgdHlwZXMgcmVnaXN0ZXJlZCB2aWEgdGhlCi0JICogIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxpYnJhcnlNYW5hZ2VycyIgZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgb2YgbGlicmFyeSB0eXBlcwotCSAqLwotCXB1YmxpYyBNYXAgZ2V0TGlicmFyeVR5cGVzKCkgewotCQlNYXAgdHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlicmFyeU1hbmFnZXJFbGVtZW50cy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgdHlwZUlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJU3RyaW5nIHR5cGVOYW1lID0gKChMaWJyYXJ5TWFuYWdlckVsZW1lbnQpIGxpYnJhcnlNYW5hZ2VyRWxlbWVudHMKLQkJCQkJLmdldCh0eXBlSWQpKS5nZXRUeXBlTmFtZSgpOwotCQkJdHlwZXMucHV0KHR5cGVJZCwgdHlwZU5hbWUpOwotCQl9Ci0JCXJldHVybiB0eXBlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeU5vdEZvdW5kRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhODlmMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeU5vdEZvdW5kRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBNZXRob2QgTGlicmFyeSBjYW5ub3QgYmUgbG9jYXRlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Tm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Tm90Rm91bmRFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Tm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgcm9vdCBjYXVzZSBvZiB0aGUKLQkgKiBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTGlicmFyeU5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZywgVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihlcnJvck1zZywgcm9vdENhdXNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTc5ODVhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9QQVRIID0gImxheW91dC8iOyAvLyROT04tTkxTLTEkOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9YU0xfUEFUSCA9ICJsYXlvdXQveHNsLyI7IC8vJE5PTi1OTFMtMSQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9DU1NfUEFUSCA9ICJsYXlvdXQvY3NzLyI7IC8vJE5PTi1OTFMtMSQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfU0NSSVBUU19GT0xERVIgPSAic2NyaXB0cyI7IC8vJE5PTi1OTFMtMSQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfU0NSSVBUU19QQVRIID0gImxheW91dC9zY3JpcHRzLyI7IC8vJE5PTi1OTFMtMSQ7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeVBsdWdpbiBwbHVnaW47Ci0KLQlwcml2YXRlIFN0cmluZyBsYXlvdXRQYXRoLCBsYXlvdXRYc2xQYXRoLCBsYXlvdXRDc3NQYXRoOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChzdXBlci5nZXRJbnN0YWxsVVJMKCksIExBWU9VVF9QQVRIKTsKLQkJCWxheW91dFBhdGggPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCi0JCQl1cmwgPSBuZXcgVVJMKHN1cGVyLmdldEluc3RhbGxVUkwoKSwgTEFZT1VUX1hTTF9QQVRIKTsKLQkJCWxheW91dFhzbFBhdGggPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCi0JCQl1cmwgPSBuZXcgVVJMKHN1cGVyLmdldEluc3RhbGxVUkwoKSwgTEFZT1VUX0NTU19QQVRIKTsKLQkJCWxheW91dENzc1BhdGggPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCi0JCUxheW91dFJlc291cmNlcy5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGF5b3V0UGF0aCgpIHsKLQkJcmV0dXJuIGxheW91dFBhdGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYXlvdXRYc2xQYXRoKCkgewotCQlyZXR1cm4gbGF5b3V0WHNsUGF0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExheW91dENzc1BhdGgoKSB7Ci0JCXJldHVybiBsYXlvdXRDc3NQYXRoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5UmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5UmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjNDhkMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaWJyYXJ5UmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTGlicmFyeVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5rbm93bl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVtcHR5TGlicmFyeVBhdGhFcnJvcl9yZWFzb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ0xpYnJhcnlGaWxlRXJyb3JfcmVhc29uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVucmVzb2x2ZWRQcm94eUVycm9yX3JlYXNvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdDbG9zdXJlV2FybmluZ19tc2cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkUmVzb3VyY2VzRXJyb3JfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRHdWlkYW5jZUVycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlQ29udmVydGVkR3VpZGFuY2VFcnJvcl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEFjdGl2aXR5RXJyb3JfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEFjdGl2aXR5RXJyb3JfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9yZWFzb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9yZWFzb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZExpYnJhcnlQYXRoRXJyb3JfcmVhc29uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvdWxkTm90TG9ja0xpYnJhcnlfcmVhc29uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlpbmdBdHRhY2htZW50c1Rhc2tfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEd1aWRhbmNlRGlhbG9nX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2VwdF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0ZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpbmdNZXRyaWNfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvcnRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xNZW50b3JfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybURlZmluaXRpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldXNhYmxlQXNzZXRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUxheW91dF9wcmltYXJ5VGFza3NfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUxheW91dF9hZGRpdGlvbmFsVGFza3NfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0R3VpZGFuY2VFcnJvcl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkUmVzb3VyY2VzRXJyb3JfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZFJlc291cmNlc0Vycm9yX3JlYXNvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbVBlcmZvcm1zX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0RXhwb3J0VXRpbF9NU0c4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydEV4cG9ydFV0aWxfTVNHOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmtub3duR3VpZGFuY2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uX2xvZ19ub0NvbnRlbnRQYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExpYnJhcnlNb2RpZmljYXRpb25IZWxwZXJfY2Fubm90VXBkYXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdhcm5pbmdEbGdfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEbGdfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEbGdfc2F2ZUVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtRm9udF9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtRm9udF9zaXplOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtX3hNYXJnaW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1feFNwYWNpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1feVNwYWNpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlEaWFncmFtTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpdml0eURldGFpbERpYWdyYW1OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdwRGVwZW5kZW5jeURpYWdyYW1OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbG9uX3dpdGhfc3BhY2U7Ci0JCi0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBMaWJyYXJ5UmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5ZTNhMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IExpYnJhcnkgU2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVNlcnZpY2UgaW1wbGVtZW50cyBJTGlicmFyeVNlcnZpY2UgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQ1JFQVRFX0xJQlJBUlkgPSAxOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfT1BFTl9MSUJSQVJZID0gMjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1JFT1BFTl9MSUJSQVJZID0gMzsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0NMT1NFX0xJQlJBUlkgPSA0OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU0VUX0NVUlJFTlRfTElCUkFSWSA9IDU7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TRVRfQ1VSUkVOVF9DT05GSUdVUkFUSU9OID0gNjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJvdGVjdGVkIHN0YXRpYyBJTGlicmFyeVNlcnZpY2UgaW5zdGFuY2UgPSBuZXcgTGlicmFyeVNlcnZpY2UoKTsKLQotCS8vIEEgbWFwIG9mIG1ldGhvZCBsaWJyYXJpZXMgdG8gbGlicmFyeSBtYW5hZ2Vycy4KLQlwcm90ZWN0ZWQgTWFwIGxpYnJhcnlNYW5hZ2VycyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBBIG1hcCBvZiBtZXRob2QgY29uZmlndXJhdGlvbnMgdG8gY29uZmlndXJhdGlvbiBtYW5hZ2Vycy4KLQlwcm90ZWN0ZWQgTWFwIGNvbmZpZ01hbmFnZXJzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIFRoZSBsaWJyYXJ5IHNlcnZpY2UgbGlzdGVuZXJzLgotCXByb3RlY3RlZCBMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIFRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IGN1cnJlbnRMaWJyYXJ5OwotCi0JLy8gVGhlIGN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZzsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElMaWJyYXJ5U2VydmljZSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBMaWJyYXJ5U2VydmljZSgpIHsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSBtYW5hZ2VyIGZhY3RvcnkgdG8gcHJlLXByb2Nlc3MgdGhlCi0JCS8vICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5saWJyYXJ5TWFuYWdlcnMiIGV4dGVuc2lvbiBwb2ludAotCQlMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQotCQkvLyBPcGVuIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IHdhcyBvcGVuZWQgaW4gdGhlIGxhc3Qgc2Vzc3Npb24uCi0JCXRyeSB7Ci0JCQlVUkkgdXJpID0gbmV3IFVSSShMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0U2F2ZWRNZXRob2RMaWJyYXJ5VVJJKCkpOwotCQkJU3RyaW5nIHR5cGUgPSBMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0U2F2ZWRNZXRob2RMaWJyYXJ5VHlwZSgpOwotCQkJb3Blbk1ldGhvZExpYnJhcnkodHlwZSwgdXJpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgdHlwZQotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBhcmd1bWVudHMKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwKLQkJCU1hcCBwYXJhbXMpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgdHlwZSA9PSBudWxsIHx8IHBhcmFtcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkJLmNyZWF0ZUxpYnJhcnlNYW5hZ2VyKHR5cGUpOwotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gbWFuYWdlci5jcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIHBhcmFtcyk7Ci0JCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQkJc2V0TGlicmFyeU1hbmFnZXIobWFuYWdlcik7Ci0KLQkJCQkvLyBTZXQgdGhlIGN1cnJlbnQgbGlicmFyeSwgZG8gdGhpcyBiZWZvcmUgbm90aWZ5IGxpc3RlbmVycy4KLQkJCQlzZXRDdXJyZW50TWV0aG9kTGlicmFyeShsaWJyYXJ5KTsKLQotCQkJCS8vIFNhdmUgdGhlIGxpYnJhcnkgVVJJIGFuZCB0eXBlIHRvIHByZWZlcmVuY2Ugc3RvcmUuCi0JCQkJc2F2ZU1ldGhvZExpYnJhcnlQcmVmZXJlbmNlcyhtYW5hZ2VyLmdldE1ldGhvZExpYnJhcnlVUkkoKSwKLQkJCQkJCXR5cGUpOwotCi0JCQkJbm90aWZ5TGlzdGVuZXJzKGxpYnJhcnksIEVWRU5UX0NSRUFURV9MSUJSQVJZKTsKLQkJCX0KLQkJCXJldHVybiBsaWJyYXJ5OwotCQl9IGNhdGNoIChMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYW4gZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IFVSSQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KFN0cmluZyB0eXBlLCBVUkkgdXJpKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkuY3JlYXRlTGlicmFyeU1hbmFnZXIodHlwZSk7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBtYW5hZ2VyLm9wZW5NZXRob2RMaWJyYXJ5KHVyaSk7Ci0JCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQkJc2V0TGlicmFyeU1hbmFnZXIobWFuYWdlcik7Ci0KLQkJCQkvLyBzZXQgYXMgY3VycmVudCBsaWJyYXJ5LCBkbyB0aGlzIGJlZm9yZSBub3RpZnkgbGlzdGVuZXJzCi0JCQkJc2V0Q3VycmVudE1ldGhvZExpYnJhcnkobGlicmFyeSk7Ci0KLQkJCQkvLyBTYXZlIHRoZSBsaWJyYXJ5IFVSSSBhbmQgdHlwZSB0byBwcmVmZXJlbmNlIHN0b3JlLgotCQkJCXNhdmVNZXRob2RMaWJyYXJ5UHJlZmVyZW5jZXMobWFuYWdlci5nZXRNZXRob2RMaWJyYXJ5VVJJKCksCi0JCQkJCQl0eXBlKTsKLQotCQkJCW5vdGlmeUxpc3RlbmVycyhsaWJyYXJ5LCBFVkVOVF9PUEVOX0xJQlJBUlkpOwotCQkJfQotCQkJcmV0dXJuIGxpYnJhcnk7Ci0JCX0gY2F0Y2ggKENyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhbiBleGlzdGluZyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUKLQkgKiBAcGFyYW0gcGFyYW1zCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBhcmd1bWVudHMKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBvcGVuTWV0aG9kTGlicmFyeShTdHJpbmcgdHlwZSwgTWFwIHBhcmFtcykKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChwYXJhbXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkJLmNyZWF0ZUxpYnJhcnlNYW5hZ2VyKHR5cGUpOwotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gbWFuYWdlci5vcGVuTWV0aG9kTGlicmFyeShwYXJhbXMpOwotCQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJCXNldExpYnJhcnlNYW5hZ2VyKG1hbmFnZXIpOwotCi0JCQkJLy8gc2V0IGFzIGN1cnJlbnQgbGlicmFyeSwgZG8gdGhpcyBiZWZvcmUgbm90aWZ5IGxpc3RlbmVycwotCQkJCXNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KGxpYnJhcnkpOwotCi0JCQkJLy8gc2V0IGFzIGN1cnJlbnQgbGlicmFyeSwgZG8gdGhpcyBiZWZvcmUgbm90aWZ5IGxpc3RlbmVycwotCQkJCXNhdmVNZXRob2RMaWJyYXJ5UHJlZmVyZW5jZXMobWFuYWdlci5nZXRNZXRob2RMaWJyYXJ5VVJJKCksCi0JCQkJCQl0eXBlKTsKLQotCQkJCW5vdGlmeUxpc3RlbmVycyhsaWJyYXJ5LCBFVkVOVF9PUEVOX0xJQlJBUlkpOwotCQkJfQotCQkJcmV0dXJuIGxpYnJhcnk7Ci0JCX0gY2F0Y2ggKENyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSByZW9wZW5NZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gZ2V0TGlicmFyeU1hbmFnZXIobGlicmFyeSk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmVtb3ZlTGlicmFyeU1hbmFnZXIobWFuYWdlcik7Ci0JCQkJbGlicmFyeSA9IG1hbmFnZXIucmVvcGVuTWV0aG9kTGlicmFyeSgpOwotCi0JCQkJLy8gdGhlIGxpYnJhcnkgaW5zdGFuY2UgY2hhbmdlZCwgcmVzZXQgdGhlIGxpYiBtYW5hZ2VyCi0JCQkJc2V0TGlicmFyeU1hbmFnZXIobWFuYWdlcik7Ci0KLQkJCQkvLyBzZXQgYXMgY3VycmVudCBsaWJyYXJ5LCBkbyB0aGlzIGJlZm9yZSBub3RpZnkgbGlzdGVuZXJzCi0JCQkJc2V0Q3VycmVudE1ldGhvZExpYnJhcnkobGlicmFyeSk7Ci0KLQkJCQlub3RpZnlMaXN0ZW5lcnMobGlicmFyeSwgRVZFTlRfUkVPUEVOX0xJQlJBUlkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVvcGVucyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSByZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlyZXR1cm4gcmVvcGVuTWV0aG9kTGlicmFyeShjdXJyZW50TGlicmFyeSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gZ2V0TGlicmFyeU1hbmFnZXIobGlicmFyeSk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuc2F2ZU1ldGhvZExpYnJhcnkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCXNhdmVNZXRob2RMaWJyYXJ5KGN1cnJlbnRMaWJyYXJ5KTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiA8cD4KLQkgKiBUaGlzIGF1dG9tYXRpY2FsbHkgZGlzcG9zZXMgaXRzIGxpYnJhcnkgbWFuYWdlciBhbmQgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBtYW5hZ2VycyB0aGF0IG1hbmFnZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGluIHRoZSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IGdldExpYnJhcnlNYW5hZ2VyKGxpYnJhcnkpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQlub3RpZnlMaXN0ZW5lcnMobGlicmFyeSwgRVZFTlRfQ0xPU0VfTElCUkFSWSk7Ci0KLQkJCS8vIC8vIG1vdmUgdGhpcyBwYXJ0IHRvIGxpYnJhcnlNYW5hZ2VyLmNsb3NlTWV0aG9kTGlicmFyeSgpCi0JCQkvLyAvLyBKaW5odWEgWGkgMDcvMTMvMDYKLQkJCS8vIE1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0KLQkJCS8vIExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhsaWJyYXJ5KTsKLQkJCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJLy8gSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ01hbmFnZXIgPSAoSUNvbmZpZ3VyYXRpb25NYW5hZ2VyKQotCQkJLy8gY29uZmlnTWFuYWdlcnMuZ2V0KGNvbmZpZ3NbaV0pOwotCQkJLy8gaWYgKGNvbmZpZ01hbmFnZXIgIT0gbnVsbCkgewotCQkJLy8gY29uZmlnTWFuYWdlci5kaXNwb3NlKCk7Ci0JCQkvLyBjb25maWdNYW5hZ2Vycy5yZW1vdmUoY29uZmlnTWFuYWdlcik7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQltYW5hZ2VyLmNsb3NlTWV0aG9kTGlicmFyeSgpOwotCQkJaWYgKGN1cnJlbnRMaWJyYXJ5ID09IGxpYnJhcnkpIHsKLQkJCQlzZXRDdXJyZW50TWV0aG9kTGlicmFyeShudWxsKTsKLQkJCX0KLQkJCXJlbW92ZUxpYnJhcnlNYW5hZ2VyKG1hbmFnZXIpOwotCQkJbWFuYWdlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChjdXJyZW50TGlicmFyeSAhPSBudWxsKSB7Ci0JCQljbG9zZU1ldGhvZExpYnJhcnkoY3VycmVudExpYnJhcnkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgYSB0aGUgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIG9sZExpYnJhcnkKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gbmV3TGlicmFyeQotCSAqICAgICAgICAgICAgdGhlIG5ldyBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgb2xkTGlicmFyeSwKLQkJCU1ldGhvZExpYnJhcnkgbmV3TGlicmFyeSkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IGdldExpYnJhcnlNYW5hZ2VyKG9sZExpYnJhcnkpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQlyZW1vdmVMaWJyYXJ5TWFuYWdlcihtYW5hZ2VyKTsKLQotCQkJLy8gdGhlIGxpYnJhcnkgbWFuYWdlciBzdGlsbCBob2xkIHRoZSBvbGQgbGlicmFyeSwgbmVlZCB0byByZXNldCBpdAotCQkJLy8gSmluaHVhIFhpLCAwNy8xMi8wNgotCQkJbWFuYWdlci5zZXRNZXRob2RMaWJyYXJ5KG5ld0xpYnJhcnkpOwotCi0JCQlzZXRMaWJyYXJ5TWFuYWdlcihtYW5hZ2VyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBtb25pdG9yIExpYnJhcnkgU2VydmljZSBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgc2VydmljZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciB0aGF0IHdhcyBhZGRlZCB0byBtb25pdG9yIExpYnJhcnkgU2VydmljZSBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgc2VydmljZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSB7Ci0JCXJldHVybiBjdXJyZW50TGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudE1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCWN1cnJlbnRMaWJyYXJ5ID0gbGlicmFyeTsKLQkJbm90aWZ5TGlzdGVuZXJzKGxpYnJhcnksIEVWRU5UX1NFVF9DVVJSRU5UX0xJQlJBUlkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgcGF0aC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBBIGZpbGUtYmFzZWQgbWV0aG9kIGxpYnJhcnkgbWF5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRMaWJyYXJ5TWFuYWdlcihjdXJyZW50TGlicmFyeSk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCXJldHVybiBtYW5hZ2VyLmdldE1ldGhvZExpYnJhcnlQYXRoKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgbWFuYWdlciBmb3IgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYSBsaWJyYXJ5IG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlNYW5hZ2VyIGdldExpYnJhcnlNYW5hZ2VyKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlyZXR1cm4gKElMaWJyYXJ5TWFuYWdlcikgbGlicmFyeU1hbmFnZXJzLmdldChsaWJyYXJ5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaWJyYXJ5TWFuYWdlcihJTGlicmFyeU1hbmFnZXIgbGliTWdyKSB7Ci0JCWlmIChsaWJNZ3IgIT0gbnVsbCkgewotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBsaWJNZ3IuZ2V0TWV0aG9kTGlicmFyeSgpOwotCQkJaWYgKGxpYiAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXJzKGxpYik7Ci0JCQkJbGlicmFyeU1hbmFnZXJzLnJlbW92ZShsaWIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGlicmFyeU1hbmFnZXIoSUxpYnJhcnlNYW5hZ2VyIGxpYk1ncikgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGxpYk1nci5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgIT0gbnVsbCkgewotCQkJbGlicmFyeU1hbmFnZXJzLnB1dChsaWIsIGxpYk1ncik7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgbWFuYWdlciBmb3IgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIGxpYnJhcnkgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBJTGlicmFyeU1hbmFnZXIgZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkgewotCQlyZXR1cm4gZ2V0TGlicmFyeU1hbmFnZXIoY3VycmVudExpYnJhcnkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICB0aGUgY29udGFpbmluZyBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oU3RyaW5nIG5hbWUsCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbGlicmFyeSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkJTGlzdCBjb25maWdzID0gbGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0Lm5leHQoKTsKLQkJCWlmIChuYW1lLmVxdWFscyhjb25maWcuZ2V0TmFtZSgpKSkgewotCQkJCXRocm93IG5ldyBDb25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbigpOwotCQkJfQotCQl9Ci0KLQkJY29uZmlnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQljb25maWcuc2V0TmFtZShuYW1lKTsKLQkJY29uZmlncy5hZGQoY29uZmlnKTsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudENvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQljdXJyZW50Q29uZmlnID0gY29uZmlnOwotCQlub3RpZnlMaXN0ZW5lcnMoY29uZmlnLCBFVkVOVF9TRVRfQ1VSUkVOVF9DT05GSUdVUkFUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIG1hbmFnZXIgZm9yIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIG1hbmFnZXIgPSAoSUNvbmZpZ3VyYXRpb25NYW5hZ2VyKSBjb25maWdNYW5hZ2VycwotCQkJCS5nZXQoY29uZmlnKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJbWFuYWdlciA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWcpOwotCQkJY29uZmlnTWFuYWdlcnMucHV0KGNvbmZpZywgbWFuYWdlcik7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlJQ29uZmlndXJhdGlvbk1hbmFnZXIgbWdyID0gKElDb25maWd1cmF0aW9uTWFuYWdlcikgY29uZmlnTWFuYWdlcnMKLQkJCQkucmVtb3ZlKGNvbmZpZyk7Ci0JCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJbWdyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyYXRpb25NYW5hZ2VycyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbnMobGlicmFyeSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJcmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlnc1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIG1hbmFnZXIgZm9yIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldEN1cnJlbnRDb25maWd1cmF0aW9uTWFuYWdlcigpIHsKLQkJaWYgKGN1cnJlbnRDb25maWcgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGN1cnJlbnRDb25maWcpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNlbmRzIGEgbWV0aG9kIGxpYnJhcnkgcmVsYXRlZCBldmVudCB0byBhbGwgbGlicmFyeSBzZXJ2aWNlIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoZmluYWwgTWV0aG9kTGlicmFyeSBsaWJyYXJ5LCBpbnQgZXZlbnRJZCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbmV3IEFycmF5TGlzdChsaXN0ZW5lcnMpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWZpbmFsIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpc3RlbmVyID0gKElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKSBpdAotCQkJCQkubmV4dCgpOwotCQkJc3dpdGNoIChldmVudElkKSB7Ci0JCQljYXNlIEVWRU5UX0NSRUFURV9MSUJSQVJZOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbGlzdGVuZXIubGlicmFyeUNyZWF0ZWQobGlicmFyeSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVZFTlRfT1BFTl9MSUJSQVJZOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbGlzdGVuZXIubGlicmFyeU9wZW5lZChsaWJyYXJ5KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFVkVOVF9SRU9QRU5fTElCUkFSWToKLQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWxpc3RlbmVyLmxpYnJhcnlSZW9wZW5lZChsaWJyYXJ5KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFVkVOVF9DTE9TRV9MSUJSQVJZOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbGlzdGVuZXIubGlicmFyeUNsb3NlZChsaWJyYXJ5KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFVkVOVF9TRVRfQ1VSUkVOVF9MSUJSQVJZOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbGlzdGVuZXIubGlicmFyeVNldChsaWJyYXJ5KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VuZHMgYSBtZXRob2QgY29uZmlndXJhdGlvbiByZWxhdGVkIGV2ZW50IHRvIGFsbCBsaWJyYXJ5IHNlcnZpY2UKLQkgKiBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGZpbmFsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBpbnQgZXZlbnRJZCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbmV3IEFycmF5TGlzdChsaXN0ZW5lcnMpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWZpbmFsIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpc3RlbmVyID0gKElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKSBpdAotCQkJCQkubmV4dCgpOwotCQkJc3dpdGNoIChldmVudElkKSB7Ci0JCQljYXNlIEVWRU5UX1NFVF9DVVJSRU5UX0NPTkZJR1VSQVRJT046Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsaXN0ZW5lci5jb25maWd1cmF0aW9uU2V0KGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBtZXRob2QgbGlicmFyeSBVUkkgYW5kIHR5cGUgdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgVVJJCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZW50aG9kIGxpYnJhcnkgdHlwZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVNZXRob2RMaWJyYXJ5UHJlZmVyZW5jZXMoVVJJIHVyaSwgU3RyaW5nIHR5cGUpIHsKLQkJTGlicmFyeVByZWZlcmVuY2VzLnNldFNhdmVkTWV0aG9kTGlicmFyeVVSSSh1cmkudG9TdHJpbmcoKSk7Ci0JCUxpYnJhcnlQcmVmZXJlbmNlcy5zZXRTYXZlZE1ldGhvZExpYnJhcnlUeXBlKHR5cGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2VFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdhOTMyMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIExpYnJhcnkgU2VydmljZSBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIocm9vdENhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgcm9vdCBjYXVzZSBvZiB0aGUKLQkgKiBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnLCBUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKGVycm9yTXNnLCByb290Q2F1c2UpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTdkMjJiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogQSBkZWZhdWx0IGxpYnJhcnkgc2VydmljZSBsaXN0ZW5lci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBpbXBsZW1lbnRzIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjY29uZmlndXJhdGlvblNldChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeUNsb3NlZChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlDcmVhdGVkKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlPcGVuZWQob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5UmVvcGVuZWQob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlTZXQob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZWMwZTcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIEhlbHBlciB1dGlsaXRpZXMgZm9yIGFjY2Vzc2luZyBhbmQgbWFuYWdpbmcgYSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2VydmljZVV0aWwgewotCi0JLyoqCi0JICogR2V0cyB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGhvZExpYnJhcnlQYXRoKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGxpYnJhcnkuZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlVUkkgcmVzb3VyY2VVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCWlmIChyZXNvdXJjZVVSSSAhPSBudWxsICYmIHJlc291cmNlVVJJLmlzRmlsZSgpKSB7Ci0JCQkJU3RyaW5nIHBhdGggPSByZXNvdXJjZVVSSS50b0ZpbGVTdHJpbmcoKTsKLQkJCQlyZXR1cm4gbmV3IEZpbGUocGF0aCkuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkgewotCQlyZXR1cm4gZ2V0TWV0aG9kTGlicmFyeVBhdGgoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgbWV0aG9kIGxpYnJhcnkgb2YgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlmb3IgKEVPYmplY3Qgb2JqID0gZWxlbWVudDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJcmV0dXJuIChNZXRob2RMaWJyYXJ5KSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIHNwZWNpZmljIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCQlMaXN0IGNvbmZpZ3MgPSBsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCEoY29uZmlnIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseSkKLQkJCQkJCSYmIGNvbmZpZy5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJldHVybiBjb25maWc7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbnMgaW4gYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWV0aG9kIGNvbmZpZ3VyYXRpb25zCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RDb25maWd1cmF0aW9uW10gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbnMoCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJTGlzdCBjb25maWdzOwotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkJCWNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KGxpYnJhcnkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gY29uZmlncy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQljb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKGNvbmZpZyA9PSBudWxsIHx8IGNvbmZpZyBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHkpIHsKLQkJCQkJaS5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljb25maWdzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlNZXRob2RDb25maWd1cmF0aW9uW10gcmVzdWx0ID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25bY29uZmlncy5zaXplKCldOwotCQljb25maWdzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lcyBvZiBhbGwgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGluIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRNZXRob2RDb25maWd1cmF0aW9uTmFtZXMoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUxpc3QgY29uZmlnTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQkJTGlzdCBjb25maWdzID0gbGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGkubmV4dCgpOwotCQkJCWlmICghKGNvbmZpZyBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHkpKSB7Ci0JCQkJCWNvbmZpZ05hbWVzLmFkZChjb25maWcuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tjb25maWdOYW1lcy5zaXplKCldOwotCQljb25maWdOYW1lcy50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIHByb2Nlc3NlcyBpbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dW4gYSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNhcGFiaWxpdHlQYXR0ZXJuPC9jb2RlPiBhbmQKLQkgKiAgICAgICAgPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFByb2Nlc3NlcygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcCByZXN1bHQgPSBuZXcgVHJlZU1hcCgpOwotCQlMaXN0IG1ldGhvZFBsdWdpbnMgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKGxpYnJhcnkpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBtZXRob2RQbHVnaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGkubmV4dCgpOwotCQkJU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgKLQkJCQkJbWV0aG9kUGx1Z2luLCBjYXBhYmlsaXR5UGF0dGVyblBhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCWdldENhcGFiaWxpdHlQYXR0ZXJucygoUHJvY2Vzc1BhY2thZ2UpIG1ldGhvZFBhY2thZ2UsCi0JCQkJCQkJcmVzdWx0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgZGVsaXZlcnlQcm9jZXNzUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJZGVsaXZlcnlQcm9jZXNzUGF0aHMpOwotCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKFByb2Nlc3NQYWNrYWdlKSBtZXRob2RQYWNrYWdlLCByZXN1bHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm5zIGluIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1biBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwIHJlc3VsdCA9IG5ldyBUcmVlTWFwKCk7Ci0JCUxpc3QgbWV0aG9kUGx1Z2lucyA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbnMobGlicmFyeSk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG1ldGhvZFBsdWdpbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgY2FwYWJpbGl0eVBhdHRlcm5QYXRoc1tdID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGg7Ci0JCQlNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKAotCQkJCQltZXRob2RQbHVnaW4sIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHMpOwotCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWdldENhcGFiaWxpdHlQYXR0ZXJucygoUHJvY2Vzc1BhY2thZ2UpIG1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJucyBpbiBhIG1ldGhvZCBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcmV0dW4gYSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNhcGFiaWxpdHlQYXR0ZXJuPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxDYXBhYmlsaXR5UGF0dGVybj4gZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlMaXN0PENhcGFiaWxpdHlQYXR0ZXJuPiBjYXBhYmlsaXR5UGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0PENhcGFiaWxpdHlQYXR0ZXJuPigpOwotCQlMaXN0IGl0ZW1zID0gVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVByb2Nlc3MgcHJvY2VzcyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIGl0Lm5leHQoKTsKLQkJCWlmIChwcm9jZXNzIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQljYXBhYmlsaXR5UGF0dGVybnMuYWRkKChDYXBhYmlsaXR5UGF0dGVybikgcHJvY2Vzcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgZGVsaXZlcnkgcHJvY2Vzc2VzIGluIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1biBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldERlbGl2ZXJ5UHJvY2Vzc2VzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwIHJlc3VsdCA9IG5ldyBUcmVlTWFwKCk7Ci0JCUxpc3QgbWV0aG9kUGx1Z2lucyA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbnMobGlicmFyeSk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG1ldGhvZFBsdWdpbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgZGVsaXZlcnlQcm9jZXNzUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoCi0JCQkJCW1ldGhvZFBsdWdpbiwgZGVsaXZlcnlQcm9jZXNzUGF0aHMpOwotCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKChQcm9jZXNzUGFja2FnZSkgbWV0aG9kUGFja2FnZSwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBkZWxpdmVyeSBwcm9jZXNzZXMgaW4gYSBtZXRob2QgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwbHVnLWluCi0JICogQHJldHVuIGEgY29sbGVjdGlvbiBvZiA8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PERlbGl2ZXJ5UHJvY2Vzcz4gZ2V0RGVsaXZlcnlQcm9jZXNzZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlMaXN0PERlbGl2ZXJ5UHJvY2Vzcz4gZGVsaXZlcnlQcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PERlbGl2ZXJ5UHJvY2Vzcz4oKTsKLQkJTGlzdCBpdGVtcyA9IFRuZ1V0aWwuZ2V0QWxsUHJvY2Vzc2VzKHBsdWdpbik7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzIHByb2Nlc3MgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBpdC5uZXh0KCk7Ci0JCQlpZiAocHJvY2VzcyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCWRlbGl2ZXJ5UHJvY2Vzc2VzLmFkZCgoRGVsaXZlcnlQcm9jZXNzKSBwcm9jZXNzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzZXM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIGNhcGFiaWxpdHkgcGF0dGVybnMgaW4gYSBwcm9jZXNzIHBhY2thZ2UuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3NQYWNrYWdlCi0JICogICAgICAgICAgICBhIHByb2Nlc3MgcGFja2FnZQotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiAgICAgICAgICAgIGEgbWFwCi0JICogQHJldHVybiBhbiB1cGRhdGVkIG1hcCBjb250YWluaW5nIGEgY29sbGVjdGlvbiBvZgotCSAqICAgICAgICAgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdldENhcGFiaWxpdHlQYXR0ZXJucyhQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSwKLQkJCU1hcCByZXN1bHQpIHsKLQkJTGlzdCBjaGlsZFBhY2thZ2VzID0gcHJvY2Vzc1BhY2thZ2UuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZFBhY2thZ2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudCkgb2JqOwotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jZXNzID0gcHJvY2Vzc0NvbXBvbmVudAotCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAocHJvY2VzcyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gcHJvY2Vzcy5nZXROYW1lKCk7Ci0JCQkJCXJlc3VsdC5wdXQobmFtZSwgcHJvY2Vzcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWdldENhcGFiaWxpdHlQYXR0ZXJucygoUHJvY2Vzc1BhY2thZ2UpIG9iaiwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBkZWxpdmVyeSBwcm9jZXNzZXMgaW4gYSBwcm9jZXNzIHBhY2thZ2UuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3NQYWNrYWdlCi0JICogICAgICAgICAgICBhIHByb2Nlc3MgcGFja2FnZQotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiAgICAgICAgICAgIGEgbWFwCi0JICogQHJldHVybiBhbiB1cGRhdGVkIG1hcCBjb250YWluaW5nIGEgY29sbGVjdGlvbiBvZgotCSAqICAgICAgICAgPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBnZXREZWxpdmVyeVByb2Nlc3NlcyhQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSwKLQkJCU1hcCByZXN1bHQpIHsKLQkJTGlzdCBjaGlsZFBhY2thZ2VzID0gcHJvY2Vzc1BhY2thZ2UuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZFBhY2thZ2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudCkgb2JqOwotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jZXNzID0gcHJvY2Vzc0NvbXBvbmVudAotCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAocHJvY2VzcyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQlTdHJpbmcgbmFtZSA9IHByb2Nlc3MuZ2V0TmFtZSgpOwotCQkJCQlyZXN1bHQucHV0KG5hbWUsIHByb2Nlc3MpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NlcygoUHJvY2Vzc1BhY2thZ2UpIG9iaiwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWVzIG9mIGFsbCBwcm9jZXNzIGZhbWlsaWVzIGluIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHByb2Nlc3MgZmFtaWx5IG5hbWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQcm9jZXNzRmFtaWx5TmFtZXMoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUxpc3QgcHJvY2Vzc0ZhbWlseU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkJCUxpc3QgY29uZmlncyA9IGxpYnJhcnkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBjb25maWdzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpLm5leHQoKTsKLQkJCQlpZiAoY29uZmlnIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseSkgewotCQkJCQlwcm9jZXNzRmFtaWx5TmFtZXMuYWRkKGNvbmZpZy5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbcHJvY2Vzc0ZhbWlseU5hbWVzLnNpemUoKV07Ci0JCXByb2Nlc3NGYW1pbHlOYW1lcy50b0FycmF5KHJlc3VsdCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lcyBvZiBhbGwgY29udGV4dHMgKG1ldGhvZCBjb25maWd1cmF0aW9ucykgYXNzaWduZWQgdG8gYQotCSAqIHByb2Nlc3MuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAgICAgICAgICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvbnRleHQgKG1ldGhvZCBjb25maWd1cmF0aW9uKSBuYW1lcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q29udGV4dHMoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCUxpc3QgY29udGV4dE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocHJvY2VzcyAhPSBudWxsKSB7Ci0JCQlMaXN0IGNvbnRleHRzID0gcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjb250ZXh0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb250ZXh0ID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0Lm5leHQoKTsKLQkJCQljb250ZXh0TmFtZXMuYWRkKGNvbnRleHQuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2NvbnRleHROYW1lcy5zaXplKCldOwotCQljb250ZXh0TmFtZXMudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbnMgYXNzaWduZWQgdG8gYSBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogICAgICAgICAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+TWV0aG9kQ29uZmlndXJhdGlvbjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRNZXRob2RDb25maWd1cmF0aW9ucyhQcm9jZXNzIHByb2Nlc3MpIHsKLQkJaWYgKHByb2Nlc3MgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcmVzdWx0ID0gbmV3IFRyZWVNYXAoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKGRlZmF1bHRDb250ZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdC5wdXQoZGVmYXVsdENvbnRleHQuZ2V0TmFtZSgpLCBkZWZhdWx0Q29udGV4dCk7Ci0JCX0KLQotCQlMaXN0IGNvbnRleHRzID0gcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY29udGV4dHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbnRleHQgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaS5uZXh0KCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LnB1dChjb250ZXh0LmdldE5hbWUoKSwgY29udGV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIEdVSUQgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHVUlEKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgZ3VpZCA9IGVsZW1lbnQuZ2V0R3VpZCgpOwotCQlpZiAoZ3VpZCA9PSBudWxsIHx8IGd1aWQubGVuZ3RoKCkgPT0gMCkgewotCQkJZ3VpZCA9IEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKTsKLQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gZWxlbWVudC5lRGVsaXZlcigpOwotCQkJdHJ5IHsKLQkJCQllbGVtZW50LmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQllbGVtZW50LnNldEd1aWQoZ3VpZCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWVsZW1lbnQuZVNldERlbGl2ZXIob2xkTm90aWZ5KTsKLQkJCX0KLQkJfQotCi0JCUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmVDb250ZW50cygpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXNldEdVSUQoKE1ldGhvZEVsZW1lbnQpIGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWJ1ZyBzdHJpbmcgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1ldGhvZCBlbGVtZW50IGNsYXNzIG5hbWUsIG5hbWUgYW5kIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWJ1Z1N0cmluZyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBlbGVtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIltuYW1lOiAiICsgZWxlbWVudC5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCSsgIiwgZ3VpZD0iICsgZWxlbWVudC5nZXRHdWlkKCkgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgcGVyc2lzdGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgcGVyc2lzdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJTGlicmFyeVBlcnNpc3RlciBnZXRDdXJyZW50UGVyc2lzdGVyKCkgewotCQl0cnkgewotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0KSB7Ci0JCQkJcmV0dXJuICgoSUxpYnJhcnlSZXNvdXJjZVNldCkgcmVzb3VyY2VTZXQpLmdldFBlcnNpc3RlcigpOwotCQkJfQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGxpYnJhcnkgcGVyc2lzdGVyIGZvciBhIGdpdmVuIHJlc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeSBwZXJzaXN0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElMaWJyYXJ5UGVyc2lzdGVyIGdldFBlcnNpc3RlckZvcihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQpIHsKLQkJCXJldHVybiAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIHJlc291cmNlU2V0KS5nZXRQZXJzaXN0ZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4MDljZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotdW5rbm93bl90ZXh0PVVua25vd24KLQotIyBFcnJvciBSZWFzb25zCi1lbXB0eUxpYnJhcnlQYXRoRXJyb3JfcmVhc29uPVRoZSBtZXRob2QgbGlicmFyeSBwYXRoIGlzIGVtcHR5LgotbWlzc2luZ0xpYnJhcnlGaWxlRXJyb3JfcmVhc29uPVRoZSBtZXRob2QgbGlicmFyeSBtb2RlbCBmaWxlIGlzIG1pc3NpbmcuCi11bnJlc29sdmVkUHJveHlFcnJvcl9yZWFzb249VGhlIHNlbGVjdGVkIG1ldGhvZCBsaWJyYXJ5IGNvbnRhaW5zIHVucmVzb2x2ZWQgZWxlbWVudCByZWZlcmVuY2VzLiBUaGlzIGlzIHVzdWFsbHkgY2F1c2VkIGJ5IG1pc3Npbmcgb3IgZGlzcGxhY2VkIFhNSSBmaWxlcyBpbiB0aGUgbGlicmFyeSBmb2xkZXIuXG5cbkNsb3NlIHRoaXMgZGlhbG9nIGFuZCBicmluZyB1cCB0aGUgUHJvYmxlbXMgdmlldyB0byBoZWxwIGlkZW50aWZ5IHRoZSB1bnJlc29sdmVkIHJlZmVyZW5jZXMuIFRvIGF2b2lkIGNvcnJ1cHRpbmcgdGhlIGxpYnJhcnksIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSByZXNvbHZlIHRoZXNlIHJlZmVyZW5jZXMgZmlyc3QgYmVmb3JlIGFkZGluZyBtb3JlIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkuCi0KLSMgV2FybmluZyBNZXNzYWdlcwotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMT1JVVBMMDAwN1c6IE9uZSBvciBtb3JlIGNoaWxkIGVsZW1lbnRzIGNvbnRhaW4gbWlzc2luZyByZWZlcmVuY2VzCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cyPUlVUEwwMDA4VzogVGhpcyBlbGVtZW50IHNob3VsZCBiZSBzZWxlY3RlZCB0byByZXNvbHZlIG9uZSBvciBtb3JlIG1pc3NpbmcgcmVmZXJlbmNlcwotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMz1JVVBMMDAwOVc6IFRoaXMgZWxlbWVudCByZWZlcmVuY2VzIG9uZSBvciBtb3JlIGVsZW1lbnRzIGluIGFuIHVuc2VsZWN0ZWQgcGFja2FnZQotCi0jIEVycm9yIE1lc3NhZ2VzCi1sb2FkUmVzb3VyY2VzRXJyb3JfbXNnPUlVUEwwMDAwRTogVGhlIG1ldGhvZCBsaWJyYXJ5IGhhcyBiZWVuIGxvYWRlZCBidXQgc29tZSBlcnJvcnMgaGF2ZSBiZWVuIGRldGVjdGVkLgotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9tc2c9SVVQTDAwMDFFOiBUaGlzIGd1aWRhbmNlIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYW5vdGhlciB0eXBlLgotY29udmVydEd1aWRhbmNlRXJyb3JfbXNnPUlVUEwwMDAyRTogVGhpcyBndWlkYW5jZSBjYW5ub3QgYmUgY29udmVydGVkIHRvIHRoZSB0YXJnZXQgdHlwZS4KLXNhdmVDb252ZXJ0ZWRHdWlkYW5jZUVycm9yX21zZz1JVVBMMDAwM0U6IFRoZSBjb252ZXJ0ZWQgZ3VpZGFuY2UgJyd7MH0nJyBjYW5ub3QgYmUgc2F2ZWQuCi0KLSMgQ29udmVydCBhY3Rpdml0eQotY29udmVydEFjdGl2aXR5RXJyb3JfdGl0bGU9Q29udmVydCBBY3Rpdml0eSBUeXBlIEVycm9yCi1jb252ZXJ0QWN0aXZpdHlFcnJvcl9tc2c9SVVQTDAwMDZFOiBUaGlzIGFjdGl2aXR5IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHRhcmdldCB0eXBlLgotc2F2ZUNvbnZlcnRlZEFjdGl2aXR5RXJyb3JfbXNnPUlVUEwwMDA3RTogVGhlIGNvbnZlcnRlZCBhY3Rpdml0eSAnJ3swfScnIGNhbm5vdCBiZSBzYXZlZC4KLQotIyBFcnJvciBSZWFzb25zCi1lcnJvcl9yZWFzb249SVVQTDAwMDRFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQuIENsaWNrIE9LIGZvciBtb3JlIGluZm9ybWF0aW9uLgotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9yZWFzb249VGhlcmUgaXMgbm8gY29tcGF0aWJsZSBndWlkYW5jZSB0eXBlIGZvciB7MH0uCi1pbnZhbGlkTGlicmFyeVBhdGhFcnJvcl9yZWFzb249SW52YWxpZCBsaWJyYXJ5IHBhdGguIFRoZSAucHJvamVjdCBmaWxlIGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotY291bGROb3RMb2NrTGlicmFyeV9yZWFzb249Q291bGQgbm90IGxvY2sgbGlicmFyeS4KLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotY29weWluZ0F0dGFjaG1lbnRzVGFza19uYW1lPUNvcHlpbmcgYXR0YWNobWVudHMuLi4KLQotIyBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZwotY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlPUNvbnZlcnQgR3VpZGFuY2UgVHlwZQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RleHQ9U2VsZWN0IHRoZSB0YXJnZXQgZ3VpZGFuY2UgdHlwZS4KLQotIyBHdWlkYW5jZSB0eXBlIG5hbWVzIGZvciBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZyAtIHNob3VsZCBiZSByZWZhY3RvcmVkIGludG8gbGlicmFyeS51aQotY2hlY2tsaXN0X3RleHQ9Q2hlY2tsaXN0Ci1jb25jZXB0X3RleHQ9Q29uY2VwdAotZXhhbXBsZV90ZXh0PUV4YW1wbGUKLWd1aWRlbGluZV90ZXh0PUd1aWRlbGluZQotZXN0aW1hdGVfdGV4dD1Fc3RpbWF0ZQotZXN0aW1hdGluZ01ldHJpY190ZXh0PUVzdGltYXRpbmcgTWV0cmljCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dD1Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1yZXBvcnRfdGV4dD1SZXBvcnQKLXRlbXBsYXRlX3RleHQ9VGVtcGxhdGUKLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PVN1cHBvcnRpbmcgTWF0ZXJpYWwKLXRvb2xNZW50b3JfdGV4dD1Ub29sIE1lbnRvcgotd2hpdGVwYXBlcl90ZXh0PVdoaXRlcGFwZXIKLXRlcm1EZWZpbml0aW9uX3RleHQ9VGVybSBEZWZpbml0aW9uCi1wcmFjdGljZV90ZXh0PVByYWN0aWNlCi1yZXVzYWJsZUFzc2V0X3RleHQ9UmV1c2FibGUgQXNzZXQKLQotI2FjdGl2aXR5IGJyZWFrZG93biBpbmZvIHN0cmluZ3MKLUFjdGl2aXR5TGF5b3V0X3ByaW1hcnlUYXNrc190ZXh0PVBlcmZvcm1zIGFzIE93bmVyCi1BY3Rpdml0eUxheW91dF9hZGRpdGlvbmFsVGFza3NfdGV4dD1QZXJmb3JtcyBhcyBBZGRpdGlvbmFsCi0KLQotIyBDb252ZXJ0IEd1aWRhbmNlIEVycm9yIE1lc3NhZ2VzCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl90aXRsZT1Db252ZXJ0IEd1aWRhbmNlIFR5cGUgRXJyb3IKLQotIyBMb2FkIFJlc291cmNlcyBFcnJvciBEaWFsb2cKLWxvYWRSZXNvdXJjZXNFcnJvcl90aXRsZT1PcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yCi1sb2FkUmVzb3VyY2VzRXJyb3JfcmVhc29uPVNvbWUgbGlicmFyeSByZXNvdXJjZXMgY291bGQgbm90IGJlIGxvYWRlZC5cblxuQ2xpY2sgRGV0YWlscyB0byByZXZpZXcgdGhlIGVycm9ycyBhbmQgcmVzb2x2ZSB0aGVtIGJlZm9yZSBhZGRpbmcgbW9yZSBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5LgotCi0jIFJvbGUgRGlhZ3JhbXMKLXJvbGVEaWFncmFtUGVyZm9ybXNfdGV4dD1wZXJmb3Jtcwotcm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0PXJlc3BvbnNpYmxlIGZvcgotCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cwPVJlZmVyZW5jZWQgZWxlbWVudDogezB9Ci1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxPUluZm86IHswfQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHND1XYXJuaW5nOiB7MH0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzc9RXJyb3I6IHswfQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9TWlzc2luZyByZWZlcmVuY2VkIGVsZW1lbnQgezB9Ci1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMT1VbmFibGUgdG8gZmluZCBlbGVtZW50IGZvciBndWlkIHswfQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTI9RmlsZSAnJ3swfScnIHJlZmVyZW5jZXMgbWlzc2luZyByZXNvdXJjZSAnJ3sxfScnCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNT1taXNzaW5nIHJlc291cmNlIGZpbGUgJyd7MH0nJwotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTc9VW5hYmxlIHRvIGNvbm5lY3QgdG8gdXJsICcnezB9JycKLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE5PVVuYWJsZSB0byBjb25uZWN0IHRvIHVybCAnJ3swfScnOiB7MX0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOD1Db3VsZCBub3QgZmluZCBmaWxlICcnezB9JycuCi1JbXBvcnRFeHBvcnRVdGlsX01TRzk9Q291bGQgbm90IGNyZWF0ZSB0ZW1wIGRpcmVjdG9yeSAnJ3swfScnLgotdW5rbm93bkd1aWRhbmNlX3RleHQ9VW5rbm93bgotCi1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uX2xvZ19ub0NvbnRlbnRQYXRoPUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uSGFuZGxlQXR0YWNobWVudHNQbHVnaW46IG5vIGNvbnRlbnRQYXRoIGZvciB7MH0KLUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXJfY2Fubm90VXBkYXRlPUlVUEwwMDA2VzogQ2Fubm90IHVwZGF0ZSB7MH0gezF9Ci13YXJuaW5nRGxnX3RpdGxlPVdhcm5pbmcKLWVycm9yRGxnX3RpdGxlPUVycm9yCi1lcnJvckRsZ19zYXZlRXJyb3I9SVVQTDAwMDVFOiBFcnJvciBzYXZpbmcgY2hhbmdlcyB0byBmaWxlICcnezB9JycKLQotIyBhY3Rpdml0eSBkaWFncmFtIG5hbWVzCi1hY3Rpdml0eURpYWdyYW1OYW1lPUFjdGl2aXR5IGRpYWdyYW06IHswfQotYWN0aXZpdHlEZXRhaWxEaWFncmFtTmFtZT1BY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbTogezB9Ci13cERlcGVuZGVuY3lEaWFncmFtTmFtZT1Xb3JrcHJ1ZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW06IHswfQotCi0jIGxvY2FsaXplIHRoZSB2YWx1ZSBiYXNlZCBvbiBsb2NhbGUuICBmb3IgZXhhbXBsZSwgCi0jIGZvciBFbmdsaXNoLCB0aGUgdmFsdWUgaXMgIi4gIgotI2NvbG9uX3dpdGhfc3BhY2U9OiAKLSMgZm9yIGZyZW5jaCwgdGhlIHZhbHVlIGlzICIgLiAiLCB5b3UgbmVlZCB0byB1c2UgYSBcIHRvIHByZXNlcnZlIHRoZSBsZWFkaW5nIHNwYWNlCi0jY29sb25fd2l0aF9zcGFjZT1cIDogCi0jIGZvciBjaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcwotIyBEb250IHRyaW0gdGhlIHNwYWNlcyBhZnRlciB0aGUgY29sb24uCi1jb2xvbl93aXRoX3NwYWNlPTogCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISEKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgUm9sZSBkaWFncmFtIGZvbnRzIGFuZCBsYXlvdXQKLXJvbGVEaWFncmFtRm9udF9uYW1lPUFyaWFsCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMj1BcmlhbAotcm9sZURpYWdyYW1Gb250X3NpemU9MTAKLXJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyPTEwCi1yb2xlRGlhZ3JhbV94TWFyZ2luPTIwMAotcm9sZURpYWdyYW1feFNwYWNpbmc9NzAKLXJvbGVEaWFncmFtX3lTcGFjaW5nPTMwCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9BdHRyaWJ1dGVGZWF0dXJlVmFsdWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQXR0cmlidXRlRmVhdHVyZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk1NmUyOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9BdHRyaWJ1dGVGZWF0dXJlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogZm9yIGEgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBmZWF0dXJlLCAKLSAqIHJlYWxpemVkIHRoZSBmZWF0dXJlIHZhbHVlIGJhc2VkIG9uIHRoZSBnaXZlbiByZWFsaXplci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVGZWF0dXJlVmFsdWUgZXh0ZW5kcyBGZWF0dXJlVmFsdWUgewotCi0JLy8gbWFwIG9mIGVsZW1lbnQgYW5kIHRoZSB2YWx1ZQotCUxpbmtlZEhhc2hNYXAgdmFsdWVNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCi0JLyoqCi0JICogY29uc3RyY3RvcgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQgd2hvc2UgZmVhdHVyZSB2YWx1ZSBpcyB0byBiZSByZWFsaXplZAotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQgTWV0aG9kRWxlbWVudCB0aGUgb3duZXIgZWxlbWVudCBvZiB0aGlzIGVsZW1lbnQsIHRoaXMgaXMgbmVlZGVkIGZvciBoYW5kbGUgdGhlIHNwYWNpYWwgY2FzZXMgCi0JICogd2hlcmUgdGhlIGVsZW1lbnQncyBlQ29udGFpbmVyIGlzIG5vdCBwcm9wZXJseSBzZXQgeWV0LiBGb3IgZXhhbXBsZSwgd2hlbiBhIG5ldyBDb250ZW50RGVzY3JpdGlvbiBvYmplY3QgaXMgY3JlYXRlZCwgCi0JICogaXQncyBvd25lciBpcyBub3Qgc2V0IHVudGlsIHRoZSBjb250ZW50IGlzIHNhdmVkLgotCSAqIEBwYXJhbSBmZWF0dXJlIE9iamVjdCBUaGUgZmVhdHVlIG9yIG9wcG9zaXRlIGZlYXR1cmUgd2hvc2UgdmFsdWUgaXMgdG8gYmUgcmVhbGl6ZWQKLQkgKiBAcGFyYW0gcmVhbGl6ZXIgRWxlbWVudFJlYWxpemVyIHRoZSByZWFsaXplciB1c2VkIHRvIHJlYWxpemUgdGhlIGZlYXR1cmUgdmFsdWUuCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBPYmplY3QgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBtZXRob2QgdG8gYWRkIGEgZmVhdHVyZSB2YWx1ZSB0byB0aGUgdmFsdWUgbGlzdC4gVGhpcyB2YWx1ZSBjb3VsZCBiZSB0aGUgZWxlbWVudCdzIG93biBmZWF0dXJlIHZhbHVlLCAKLQkgKiBvciB0aGUgZmVhdHVyZSB2YWx1ZSBvZiBhbm90aGVyIHZhcmlhYmlsaXR5IGVsZW1lbnQsIHN1Y2ggYXMgYSBjb250cmlidXRvci4gCi0JICogU28gdGhlIG93bmVyIGlzIHBhc3NlZCBpbiB0byBpbmRpY2F0ZSB0aGUgb3JpZ2luYXRpb24gb2YgdGhlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBvd25lciBWYXJpYWJpbGl0eUVsZW1lbnQgdGhlIGVsZW1lbnQgdGhhdCBwcm92aWRlIHRoZSB2YWx1ZSBkdWUgdG8gdmFyaWFiaWxpdHkgcmVhbGl6YXRpb24KLQkgKiBAcGFyYW0gdmFsdWUgT2JqZWN0IHRoZSBmZWF0dXJlIHZhbHVlIGZyb20gdGhlIG93bmVyIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoVmFyaWFiaWxpdHlFbGVtZW50IG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCAodmFsdWUgPT0gbnVsbCkgfHwgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJCSYmIHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gbm90ZTogb3duZXIgY2FuIGJlIG51bGwsIHRoaXMgaXMgZmluZQotCQl2YWx1ZU1hcC5wdXQob3duZXIsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGZlYXR1cmUgdmFsdWUgbGlzdC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHZhbHVlTWFwLnNpemUoKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSByZWFsaXplZCBmZWF0dXJlIHZhbHVlLgotCSAqIEByZXR1cm4gT2JqZWN0IHRoZSByZWFsaXplZCBmZWF0dXJlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWVudHJ5LmdldEtleSgpOwotCQkJT2JqZWN0IHYgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCi0JCQlpZiAodiA9PSBudWxsIHx8IHYudG9TdHJpbmcoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICggaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpICkgewotCQkJCVN0cmluZyBzdHIgPSBTdHJVdGlsLmdldFBsYWluVGV4dCh2LnRvU3RyaW5nKCkpLnRyaW0oKTsKLQkJCQlpZiAoIGlzQmxhbmtJbmRpY2F0b3Ioc3RyKSApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJCWlmIChzaXplKCkgPiAxKSB7Ci0JCQkJCS8vIHNvbWV0aGluZyB3cm9uZyBoZXJlLCB3aWxsIG5vdCBoYXBwZW4gYnV0IHB1dCB0ZXN0Ci0JCQkJCS8vIG1lc3NhZ2UgaGVyZSBqdXN0IGluIGNhc2UKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJBdHRyaWJ1dGVGZWF0dXJlVmFsdWU6IFByZXNlbnRhdGlvbiBOYW1lIGdldCBtb3JlIHRoZW4gb25lIGVudHJ5OiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHY7Ci0JCQl9Ci0KLQkJCWlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChDb25maWd1cmF0aW9uSGVscGVyLkFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IpOyAKLQkJCX0KLQotCQkJaWYgKGUgPT0gZWxlbWVudCB8fCBlID09IG51bGwgKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCh2KTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIGNvbnRlbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIKLQkJCQkJCS5nZXRFbGVtZW50UGF0aCgoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgCi0JCQkJCQkJCT8gKE1ldGhvZEVsZW1lbnQpIGUuZUNvbnRhaW5lcigpCi0JCQkJCQkJCTogZSk7Ci0KLQkJCQlTdHJpbmcgYmFja1BhdGggPSBSZXNvdXJjZUhlbHBlcgotCQkJCQkJLmdldEJhY2tQYXRoKChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSAKLQkJCQkJCQkJPyAoKG93bmVyRWxlbWVudCAhPSBudWxsKSA/IG93bmVyRWxlbWVudAotCQkJCQkJCQk6IChNZXRob2RFbGVtZW50KSBlbGVtZW50LmVDb250YWluZXIoKSkKLQkJCQkJCQkJOiBlbGVtZW50KTsKLQotCQkJCWJ1ZmZlci5hcHBlbmQoUmVzb3VyY2VIZWxwZXIuZml4Q29udGVudFVybFBhdGgodi50b1N0cmluZygpLAotCQkJCQkJY29udGVudFBhdGgsIGJhY2tQYXRoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGZmZmZkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25BcHBsaWNhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0aW9uQXBwbGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uQXBwbGljYXRvciBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uQXBwbGljYXRvciB7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShWYXJpYWJpbGl0eUVsZW1lbnQgdmUsCi0JCQlFQXR0cmlidXRlIGF0dHJpYnV0ZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh2ZSwgYXR0cmlidXRlLAotCQkJCQkJY29uZmlnKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZShWYXJpYWJpbGl0eUVsZW1lbnQgdmUsCi0JCQlFUmVmZXJlbmNlIHJlZiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXMwbkZlYXR1cmUocmVmKSkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQl2ZSwgcmVmLCBuZXcgRGVmYXVsdEVsZW1lbnRSZWFsaXplcigKLQkJCQkJCQljb25maWcpKTsKLQkJfSBlbHNlIGlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzMDFGZWF0dXJlKHJlZikpIHsKLQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSgKLQkJCQkJdmUsIHJlZiwgbmV3IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIoCi0JCQkJCQkJY29uZmlnKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRSZWZlcmVuY2UoQ29udGVudERlc2NyaXB0aW9uIGRlc2MsCi0JCQlNZXRob2RFbGVtZW50IG93bmVyLCBFUmVmZXJlbmNlIHJlZiwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0KLQkJTGlzdCB2YWx1ZXMgPSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJLmNhbGMwbkZlYXR1cmVWYWx1ZShkZXNjLCBvd25lciwgcmVmLAotCQkJCQkJbmV3IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIoY29uZmlnKSk7Ci0JCWlmIChyZWYuaXNNYW55KCkpIHsKLQkJCXJldHVybiB2YWx1ZXM7Ci0JCX0KLQkJaWYgKHZhbHVlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUxpc3QgdmFsdWVzID0gQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCS5jYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwKLQkJCQkJCW5ldyBEZWZhdWx0RWxlbWVudFJlYWxpemVyKGNvbmZpZykpOwotCi0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JcHVibGljIE9iamVjdCByZXNvbHZlKE9iamVjdCBvYmplY3QsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJT2JqZWN0IHJlc29sdmVkID0gQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iamVjdCwgY29uZmlnKTsKLQkJCWlmIChyZXNvbHZlZCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG9iamVjdDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHJlc29sdmVkOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIG9iamVjdDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uQ2xvc3VyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uQ2xvc3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMjViMzI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkNsb3N1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUNvbmZpZ3VyYXRpb25DbG9zdXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklDb25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuRGVwZW5kZW5jeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuRWxlbWVudERlcGVuZGVuY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuRWxlbWVudFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5QYWNrYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci0KLS8qKgotICogQSBtZXRob2QgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uQ2xvc3VyZSBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uQ2xvc3VyZSB7Ci0KLQkvLyBJZiB0cnVlLCBnZW5lcmF0ZSBkZWJ1ZyB0cmFjZXMuCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gbnVsbDsKLQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlnTWFuYWdlciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgRGVwZW5kZW5jeU1hbmFnZXIgZGVwZW5kZW5jeU1hbmFnZXIgPSBudWxsOwotCi0JLy8gTm9kZSBjaGFuZ2UgaW5mb3JtYXRpb24uIFRoZSBvYmplY3QgYXJlIHRoZSBtb2RlbCBvYmplY3RzCi0JLy8gY2hlY2sgdGhlIGxpbmtlZCBvYmplY3RzIGluIG5lZWRlZAotCXByb3RlY3RlZCBMaXN0IHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gQSBtYXAgb2YgaW52YWxpZCBub2RlcyB0byBFbGVtZW50RGVwZW5kZW5jeUVycm9yIG9iamVjdHMuCi0JcHJvdGVjdGVkIE1hcCBpbnZhbGlkTm9kZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJvdGVjdGVkIExpc3QgY2hhbmdlZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBBIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQ2xvc3VyZShNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQotCQljb25maWdNYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigKLQkJCQljb25maWcpOwotCQlpZiAoY29uZmlnTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlsaWJyYXJ5ID0gY29uZmlnTWFuYWdlci5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlkZXBlbmRlbmN5TWFuYWdlciA9IGNvbmZpZ01hbmFnZXIuZ2V0RGVwZW5kZW5jeU1hbmFnZXIoKTsKLQkJfQotCi0JCS8vIGNsZWFudXAgdGhlIG9sZCBzdGF0dXMgYW5kIHJlYnVpbGQgdGhlIGxpc3QKLQkJc2VsZWN0ZWQuY2xlYXIoKTsKLQkJY2hhbmdlZE5vZGVzLmNsZWFyKCk7Ci0JCWludmFsaWROb2Rlc01hcC5jbGVhcigpOwotCi0JCS8vIGNvbmZpZ3VyYXRpb24gY2hhbmdlZCwgcmUtYnVpbGQgdGhlIHNlbGVjdGlvbiBsaXN0Ci0JCXRyeSB7Ci0JCQlidWlsZExpc3QobGlicmFyeSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gQSA8Y29kZT5Db25maWd1cmF0aW9uTWFuYWdlcjwvY29kZT4uCi0JICovCi0JcHVibGljIElDb25maWd1cmF0aW9uTWFuYWdlciBnZXRDb25maWd1cmF0aW9uTWFuYWdlcigpIHsKLQkJcmV0dXJuIGNvbmZpZ01hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiBBIDxjb2RlPk1ldGhvZENvbmZpZ3VyYXRpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGFpbmluaW5nIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gQSA8Y29kZT5NZXRob2RDb25maWd1cmF0aW9uPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRMaWJyYXJ5KCkgewotCQlyZXR1cm4gbGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZHMgdGhlIHNlbGVjdGlvbiBsaXN0IGJhc2VkIG9uIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYnVpbGRMaXN0KEVPYmplY3QgaW5wdXQpIHsKLQkJLy8gVmFsaWRhdGUgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQotCQlzZWxlY3RlZC5hZGRBbGwoY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpKTsKLQkJc2VsZWN0ZWQuYWRkQWxsKGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkpOwotCi0JCS8vIFJlLWJ1aWxkIHRoZSBzZWxlY3Rpb25zIHRvIGF1dG8gYWRkIHRoZSBwcm9jZXNzIHBhY2thZ2VzLgotCQlzZXRTZWxlY3Rpb25zKHNlbGVjdGVkLnRvQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcyBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogICAgICAgICAgICBBbiBhcnJheSBvZiBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbnMoT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIENsZWFudXAgdGhlIG9sZCBzdGF0dXMgYW5kIHJlYnVpbGQgdGhlIGxpc3QuCi0JCXNlbGVjdGVkLmNsZWFyKCk7Ci0JCWNoYW5nZWROb2Rlcy5jbGVhcigpOwotCQlpbnZhbGlkTm9kZXNNYXAuY2xlYXIoKTsKLQkJYmVnaW5VcGRhdGUoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgZSA9IGVsZW1lbnRzW2ldOwotCQkJaWYgKCFzZWxlY3RlZC5jb250YWlucyhlKSkgewotCQkJCWlmICgoZSBpbnN0YW5jZW9mIEVPYmplY3QpKSB7Ci0JCQkJCWFkZCgoRU9iamVjdCkgZSwgZmFsc2UpOwotCi0JCQkJCS8vIElmIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlzIGEgcHJvY2VzcyBjb21wb25lbnQsCi0JCQkJCS8vIHNlbGVjdCBhbGwgdGhlIHByb2Nlc3MgcGFja2FnZXMgdGhhdCBjb250YWlucyB0aGUKLQkJCQkJLy8gYWN0aXZpdGllcy4KLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQlzZWxlY3RQcm9jZXNzUGFja2FnZXMoKChQcm9jZXNzQ29tcG9uZW50KSBlKQotCQkJCQkJCQkuZ2V0UHJvY2VzcygpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFRoZSBzZWxlY3RlZCBlbGVtZW50IGlzIGEgVUkgZm9sZGVyLgotCQkJCQlzZWxlY3RlZC5hZGQoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJZW5kVXBkYXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdFByb2Nlc3NQYWNrYWdlcyhBY3Rpdml0eSBhKSB7Ci0JCWlmIChhID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBhLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBwa2cgPSBlLmVDb250YWluZXIoKTsKLQkJCWlmICghc2VsZWN0ZWQuY29udGFpbnMocGtnKSkgewotCQkJCXNlbGVjdGVkLmFkZChwa2cpOwotCQkJCWNoYW5nZWROb2Rlcy5hZGQocGtnKTsKLQkJCX0KLQotCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXNlbGVjdFByb2Nlc3NQYWNrYWdlcygoQWN0aXZpdHkpIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG1ldGhvZCBwbHVnLWluIG9yIHBhY2thZ2UgdG8gdGhlIGNsb3N1cmUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEEgbWV0aG9kIGVsZW1lbnQuCi0JICogQHBhcmFtIGFkZENoaWxkcmVuCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgYWRkIGFsbCBjaGlsZCBtZXRob2QgZWxlbWVudHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZChFT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gYWRkQ2hpbGRyZW4pIHsKLQkJaWYgKCFMaWJyYXJ5VXRpbC5zZWxlY3RhYmxlKGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIXNlbGVjdGVkLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQlzZWxlY3RlZC5hZGQoZWxlbWVudCk7Ci0KLQkJCS8vIFNhdmUgdGhlIGNoYW5nZWQgbm9kZXMgc28gdGhhdCB3ZSBjYW4gdXBkYXRlIHRoZSBzdGF0dXMgbGF0ZXIuCi0JCQlhZGRDaGFuZ2VkKGVsZW1lbnQpOwotCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXNlbGVjdFN5c3RlbVBhY2thZ2VzKChNZXRob2RQbHVnaW4pIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIHRoZSBwYXJlbnQgbWV0aG9kIGVsZW1lbnQgYXMgd2VsbC4KLQkJRU9iamVjdCBwYXJlbnQgPSBlbGVtZW50LmVDb250YWluZXIoKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgIXNlbGVjdGVkLmNvbnRhaW5zKHBhcmVudCkpIHsKLQkJCWFkZChwYXJlbnQsIGZhbHNlKTsKLQkJfQotCi0JCS8vIEFkZCBjaGlsZHJlbiBhcyBuZWVkZWQuCi0JCWlmIChhZGRDaGlsZHJlbikgewotCQkJRUxpc3QgZWxlbWVudHMgPSBlbGVtZW50LmVDb250ZW50cygpOwotCQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQkJYWRkKGNoaWxkLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ2hhbmdlZChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoIWNoYW5nZWROb2Rlcy5jb250YWlucyhlbGVtZW50KSkgewotCQkJY2hhbmdlZE5vZGVzLmFkZChlbGVtZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZWxlY3RTeXN0ZW1QYWNrYWdlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUxpc3QgcGtncyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBwa2cgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJYWRkKHBrZywgZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtZXRob2QgcGx1Zy1pbiBvciBwYWNrYWdlIGlzIHNlbGVjdGVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgc2VsZWN0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChPYmplY3QgaW5wdXQpIHsKLQkJaWYgKChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHx8IGlucHV0ID09IGNvbmZpZwotCQkJCXx8IHNlbGVjdGVkLmNvbnRhaW5zKGlucHV0KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGVsZW1lbnQgZGVwZW5kZW5jeSBlcnJvciBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAZWxlbWVudCBBIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gQW4gPGNvZGU+RWxlbWVudERlcGVuZGVuY3lFcnJvcjwvY29kZT4uCi0JICovCi0JcHVibGljIEVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZ2V0RXJyb3IoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldEVycm9yKGVsZW1lbnQsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZ2V0RXJyb3IoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSAoRWxlbWVudERlcGVuZGVuY3lFcnJvcikgaW52YWxpZE5vZGVzTWFwCi0JCQkJLmdldChlbGVtZW50KTsKLQkJaWYgKGVycm9yID09IG51bGwgJiYgY3JlYXRlKSB7Ci0JCQllcnJvciA9IG5ldyBFbGVtZW50RGVwZW5kZW5jeUVycm9yKGVsZW1lbnQpOwotCQkJaW52YWxpZE5vZGVzTWFwLnB1dChlbGVtZW50LCBlcnJvcik7Ci0JCX0KLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZXJlIGlzIGVycm9yIGluIHRoaXMgY29uZmlndXJhdGlvbiBjbG9zdXJlCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRXJyb3IoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBpbnZhbGlkTm9kZXNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IChFbGVtZW50RGVwZW5kZW5jeUVycm9yKSBpdC5uZXh0KCk7Ci0JCQlpZiAoZXJyb3IuaXNFcnJvcigpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZXJlIGlzIGFueSBwcm9ibGVtIChlcnJvci93YXJuaW5nKSB3aXRoIHRoaXMgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Byb2JsZW0oKSB7Ci0JCXJldHVybiBpbnZhbGlkTm9kZXNNYXAuc2l6ZSgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgZXJyb3JzLgotCSAqIAotCSAqIEByZXR1cm4gQSBhIGxpc3Qgb2YgPGNvZGU+RXJyb3JJbmZvPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBbGxFcnJvcnMoKSB7Ci0JCUxpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW52YWxpZE5vZGVzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSAoRWxlbWVudERlcGVuZGVuY3lFcnJvcikgaXQubmV4dCgpOwotCQkJZXJyb3JzLmFkZEFsbChlcnJvci5nZXRBbGwoKSk7Ci0JCX0KLQkJcmV0dXJuIGVycm9yczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgZGVwZW5kZW5jeSBlcnJvcnMuCi0JICogCi0JICogQHJldHVybiBBbiBhcnJheSBvZiA8Y29kZT5FbGVtZW50RGVwZW5kZW5jeUVycm9yPC9jb2RlPgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXREZXBlbmRlbmN5RXJyb3JzKCkgewotCQlyZXR1cm4gaW52YWxpZE5vZGVzTWFwLnZhbHVlcygpLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgaW52YWxpZCBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgbGlzdCBvZiBpbnZhbGlkIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEludmFsaWRFbGVtZW50cygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoaW52YWxpZE5vZGVzTWFwLmtleVNldCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRXJyb3IoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGludmFsaWROb2Rlc01hcC5jb250YWluc0tleShlbGVtZW50KSkgewotCQkJaW52YWxpZE5vZGVzTWFwLnJlbW92ZShlbGVtZW50KTsKLQotCQkJLy8gRXJyb3Igc3RhdHVzIGNoYW5nZWQsIGFkZCBpdCB0byB0aGUgY2hhbmdlZCBsaXN0LgotCQkJaWYgKCFjaGFuZ2VkTm9kZXMuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQljaGFuZ2VkTm9kZXMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGNoYW5nZWQgZWxlbWVudHMuIFRoZXNlIGFyZSBlbGVtZW50cyB3aG9zZSBjaGVjayBzdGF0ZXMKLQkgKiBoYXZlIGNoYW5nZWQgb3Igd2hvc2UgaW1hZ2UgaGF2ZSBjaGFuZ2VkIGR1ZSB0byBlcnJvci4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgbGlzdCBvZiBjaGFuZ2VkIG1ldGhvZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDaGFuZ2VkRWxlbWVudHMoKSB7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KGNoYW5nZWROb2Rlcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBpbnZhbGlkTm9kZXNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIWl0ZW1zLmNvbnRhaW5zKGl0ZW0pKSB7Ci0JCQkJaXRlbXMuYWRkKGl0ZW0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIG1ldGhvZCBwbHVnLWlucyBhbmQgcGFja2FnZXMuCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGVkLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBiZWdpbiB0aGUgY2xvc3VyZSB1cGRhdGUuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblVwZGF0ZSgpIHsKLQkJY2hhbmdlZE5vZGVzLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogZW5kIHRoZSBjbG9zdXJlIHVwZGF0ZS4KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFVwZGF0ZSgpIHsKLQkJLy8gUHJvY2VzcyB0aGUgY2hhbmdlZCBlbGVtZW50cy4KLQkJLy8gTm90ZTogYWRkaXRpb25hbCBlbGVtZW50cyBtYXkgYmUgYWRkZWQgdG8gdGhlIGNoYW5nZXNOb2RlcyBkdWUgdG8KLQkJLy8gZXJyb3Igc3RhdHVzIGNoYW5nZSBidXQgb25seSB0aGUgb3JpZ2luYWwgY2hhbmdlZCBlbGVtZW50cyBuZWVkIHRvIGJlCi0JCS8vIHByb2Nlc3NlZC4KLQkJZm9yIChJdGVyYXRvciBpdCA9IG5ldyBBcnJheUxpc3QoY2hhbmdlZE5vZGVzKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hhbmdlZEVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQlFbGVtZW50RGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gZGVwZW5kZW5jeU1hbmFnZXIKLQkJCQkJLmdldERlcGVuZGVuY3koKE1ldGhvZEVsZW1lbnQpIGNoYW5nZWRFbGVtZW50KTsKLQkJCWlmIChkZXBlbmRlbmN5ID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGlzU2VsZWN0ZWQoY2hhbmdlZEVsZW1lbnQpKSB7Ci0JCQkJdmFsaWRhdGVTZWxlY3RlZChkZXBlbmRlbmN5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmFsaWRhdGVVblNlbGVjdGVkKGRlcGVuZGVuY3kpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJUaGVyZSBhcmUgKCIgKyBpbnZhbGlkTm9kZXNNYXAuc2l6ZSgpICsgIikgZXJyb3JzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBlbGVtZW50IGRlcGVuZGVuY3kgd2hlbiB0aGUgZWxlbWVudCBpcyBzZWxlY3RlZC4gV2hlbiB0aGUKLQkgKiBlbGVtZW50IGlzIHNlbGVjdGVkLCB3ZSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmc6IDEuIENoZWNrIGVycm9yIGZvcgotCSAqIHJlZmVyZW5jZXMgMi4gUmVtb3ZlIGVycm9yIGZvciBkZXBlbmRlbnRzIGFzc29jaWF0ZWQgd2l0aCBlbGVtZW50IDMuCi0JICogVXBkYXRlIHBhcmVudHM6IGlmIHRoZSBzZWxlY3Rpb24gaXMgdmFsaWQsIHJlbW92ZSBhbGwgZXJyb3JzIGZyb20gcGFyZW50cwotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQgaWYgdGhlIHNlbGVjdGlvbiBpcyBpbnZhbGlkLCBzZXQgZXJyb3IgdG8KLQkgKiBhbGwgcGFyZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZGVwZW5kZW5jeQotCSAqICAgICAgICAgICAgRWxlbWVudERlcGVuZGVuY3kKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVTZWxlY3RlZChFbGVtZW50RGVwZW5kZW5jeSBkZXBlbmRlbmN5KSB7Ci0JCU9iamVjdCBjaGFuZ2VkRWxlbWVudCA9IGRlcGVuZGVuY3kuZ2V0RWxlbWVudCgpOwotCi0JCS8vIFNpbmNlIHRoaXMgZWxlbWVudCBpcyBzZWxlY3RlZCwgcmVtb3ZlIGFsbCBwcmV2aW91cyBlcnJvcnMuCi0JCXJlbW92ZUVycm9yKGNoYW5nZWRFbGVtZW50KTsKLQotCQlpZiAoY2hhbmdlZEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBTaW5jZSB0aGlzIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIHJlbW92ZSBhbGwgZGVwZW5kZW5jeSBlcnJvcnMgaW4gdGhlCi0JCS8vIGRlcGVuZGVudCBlbGVtZW50cy4KLQkJTGlzdCBkZXBlbmRlbnRzID0gZGVwZW5kZW5jeS5nZXREZXBlbmRlbnRzKCk7Ci0JCWlmIChkZXBlbmRlbnRzICE9IG51bGwgJiYgZGVwZW5kZW50cy5zaXplKCkgPiAwKSB7Ci0JCQlPYmplY3QgZWxlbWVudDsKLQkJCWZvciAoSXRlcmF0b3IgaXRyID0gZGVwZW5kZW50cy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJCWVsZW1lbnQgPSBpdHIubmV4dCgpOwotCi0JCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IGdldEVycm9yKGVsZW1lbnQsIGZhbHNlKTsKLQkJCQlpZiAoZXJyb3IgIT0gbnVsbCkgewotCQkJCQllcnJvci5yZW1vdmVFcnJvcihjaGFuZ2VkRWxlbWVudCk7Ci0JCQkJCWlmIChlcnJvci5zaXplKCkgPT0gMCkgewotCQkJCQkJcmVtb3ZlRXJyb3IoZWxlbWVudCk7Ci0KLQkJCQkJCS8vIENsZWFyIHRoZSBwYXJlbnQgZXJyb3IgaW50cm9kdWNlZCBieSB0aGlzIGVsZW1lbnQuCi0JCQkJCQl1cGRhdGVQYXJlbnRzRm9yRXJyb3JzKChFT2JqZWN0KSBlbGVtZW50KTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gSWYgYW4gZWxlbWVudCBpcyBjaGVja2VkLCBjaGVjayB0aGUgZWxlbWVudCBpdCBkZXBlbmRzIG9uLAotCQkvLyB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBhcyB3ZWxsLgotCQlMaXN0IHJlZnMgPSBkZXBlbmRlbmN5LmdldFJlZmVyZW5jZXMoKTsKLQkJaWYgKHJlZnMgIT0gbnVsbCAmJiByZWZzLnNpemUoKSA+IDApIHsKLQkJCVBhY2thZ2VSZWZlcmVuY2UgcmVmOwotCQkJT2JqZWN0IGVsZW1lbnQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJlZnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCQlyZWYgPSAoUGFja2FnZVJlZmVyZW5jZSkgaXRyLm5leHQoKTsKLQkJCQllbGVtZW50ID0gcmVmLmdldFJlZkVsZW1lbnQoKTsKLQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvLyBEb24ndCB3YXJuIG9uIG9wdGlvbmFsIGlucHV0cyBub3QgYmVpbmcKLQkJCQkvLyBwcmVzZW50LCBzbyBhZGRlZCB0aGUgY2FuSWdub3JlKCkgbWV0aG9kCi0JCQkJaWYgKCFpc1NlbGVjdGVkKGVsZW1lbnQpICYmICFjYW5JZ25vcmUocmVmKSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZTsKLQkJCQkJaW50IGVycm9yVHlwZSA9IDA7Ci0JCQkJCWlmIChyZWYuaGFzQmFzZVJlZmVyZW5jZSgpKSB7Ci0JCQkJCQllcnJvclR5cGUgPSBFcnJvckluZm8uRVJST1I7Ci0JCQkJCQltZXNzYWdlID0gTGlicmFyeVJlc291cmNlcy5jb25maWdDbG9zdXJlV2FybmluZ19tc2cyOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZXJyb3JUeXBlID0gRXJyb3JJbmZvLldBUk5JTkc7Ci0JCQkJCQltZXNzYWdlID0gTGlicmFyeVJlc291cmNlcy5jb25maWdDbG9zdXJlV2FybmluZ19tc2czOwotCQkJCQl9Ci0KLQkJCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IGdldEVycm9yKGNoYW5nZWRFbGVtZW50LAotCQkJCQkJCXRydWUpOwotCQkJCQllcnJvci5hZGRFcnJvcihuZXcgRXJyb3JJbmZvKGVycm9yVHlwZSwgbWVzc2FnZSwKLQkJCQkJCQljaGFuZ2VkRWxlbWVudCwgZWxlbWVudCwgRXJyb3JJbmZvLlJFRkVSRU5DRV9UTykpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSBnZXRFcnJvcihjaGFuZ2VkRWxlbWVudCwKLQkJCQkJCQlmYWxzZSk7Ci0JCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0JCQkJCQllcnJvci5yZW1vdmVFcnJvcihlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIEZpbmFsbHksIHVwZGF0ZSB0aGUgcGFyZW50cy4KLQkJdXBkYXRlUGFyZW50c0ZvckVycm9ycygoRU9iamVjdCkgY2hhbmdlZEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRWxlbWVudERlcGVuZGVuY3kgd2hlbiB0aGUgZWxlbWVudCBpcyB1bnNlbGVjdGVkLiBXaGVuIHRoZQotCSAqIGVsZW1lbnQgaXMgdW5zZWxlY3RlZCwgd2UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nOiAxLiBjaGVjayBlcnJvciBmb3IKLQkgKiBkZXBlbmRlbmN0cyAyLiByZW1vdmUgZXJyb3IgZm9yIHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIGVsZW1lbnQsIGluCi0JICogY2FzZSBvZiBhbnkgYWRkZWQgd2hlbiB0aGUgZWxlbWVudCB3YXMgY2hlY2sgMy4gdXBkYXRlIHBhcmVudHM6IGlmIHRoZQotCSAqIHNlbGVjdGlvbiBpcyB2YWxpZCwgcmVtb3ZlIGFsbCBlcnJvcnMgZnJvbSBwYXJlbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0JICogZWxlbWVudCBpZiB0aGUgc2VsZWN0aW9uIGlzIGludmFsaWQsIHNldCBlcnJvciB0byBhbGwgcGFyZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZGVwZW5kZW5jeQotCSAqICAgICAgICAgICAgQSA8Y29kZT5FbGVtZW50RGVwZW5kZW5jeTwvY29kZT4gb2JqZWN0LgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVVuU2VsZWN0ZWQoRWxlbWVudERlcGVuZGVuY3kgZGVwZW5kZW5jeSkgewotCQlPYmplY3QgY2hhbmdlZEVsZW1lbnQgPSBkZXBlbmRlbmN5LmdldEVsZW1lbnQoKTsKLQotCQkvLyBTaW5jZSB0aGlzIGVsZW1lbnQgaXMgdW4tc2VsZWN0ZWQsIHJlbW92ZSBhbGwgcHJldmlvdXMgZXJyb3JzLgotCQlyZW1vdmVFcnJvcihjaGFuZ2VkRWxlbWVudCk7Ci0KLQkJaWYgKGNoYW5nZWRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gU2luY2UgdGhpcyBlbGVtZW50IGlzIHVuLXNlbGVjdGVkLCByZW1vdmUgYWxsIGVycm9ycyBpbiB0aGUKLQkJLy8gcmVmZXJlbmNlZCBlbGVtZW50cy4KLQkJTGlzdCByZWZzID0gZGVwZW5kZW5jeS5nZXRSZWZlcmVuY2VzKCk7Ci0JCWlmIChyZWZzICE9IG51bGwgJiYgcmVmcy5zaXplKCkgPiAwKSB7Ci0JCQlFbGVtZW50UmVmZXJlbmNlIHJlZjsKLQkJCU9iamVjdCBlbGVtZW50OwotCQkJZm9yIChJdGVyYXRvciBpdHIgPSByZWZzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJcmVmID0gKEVsZW1lbnRSZWZlcmVuY2UpIGl0ci5uZXh0KCk7Ci0JCQkJZWxlbWVudCA9IHJlZi5nZXRSZWZFbGVtZW50KCk7Ci0KLQkJCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gZ2V0RXJyb3IoZWxlbWVudCwgZmFsc2UpOwotCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0JCQkJCWVycm9yLnJlbW92ZUVycm9yKGNoYW5nZWRFbGVtZW50KTsKLQkJCQkJaWYgKGVycm9yLnNpemUoKSA9PSAwKSB7Ci0JCQkJCQlyZW1vdmVFcnJvcihlbGVtZW50KTsKLQotCQkJCQkJLy8gQ2xlYXIgdGhlIHBhcmVudCBlcnJvciBpbnRyb2R1Y2VkIGJ5IHRoaXMgZWxlbWVudC4KLQkJCQkJCXVwZGF0ZVBhcmVudHNGb3JFcnJvcnMoKEVPYmplY3QpIGVsZW1lbnQpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBJZiBhbiBlbGVtZW50IGlzIHVuY2hlY2tlZCwgY2hlY2sgdGhlIGRlcGVuZGVudCBlbGVtZW50cy4KLQkJLy8gSWYgdGhlcmUgYXJlIGNoZWNrIGVsZW1lbnRzIGRlcGVuZGluZyBvbiBpdCwgdGhlIGVsZW1lbnQgY2FuJ3QgYmUKLQkJLy8gdW5jaGVja2VkLgotCQlMaXN0IGRlcGVuZGVudHMgPSBkZXBlbmRlbmN5LmdldERlcGVuZGVudHMoKTsKLQkJaWYgKGRlcGVuZGVudHMgIT0gbnVsbCAmJiBkZXBlbmRlbnRzLnNpemUoKSA+IDApIHsKLQkJCU9iamVjdCBlbGVtZW50OwotCQkJZm9yIChJdGVyYXRvciBpdHIgPSBkZXBlbmRlbnRzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJZWxlbWVudCA9IGl0ci5uZXh0KCk7Ci0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGlzU2VsZWN0ZWQoZWxlbWVudCkpIHsKLQkJCQkJLy8gRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGRlcGVuZGVuY3kuCi0JCQkJCUVsZW1lbnREZXBlbmRlbmN5IGNoaWxkRGVwID0gZGVwZW5kZW5jeU1hbmFnZXIKLQkJCQkJCQkuZ2V0RGVwZW5kZW5jeSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0KLQkJCQkJdmFsaWRhdGVTZWxlY3RlZChjaGlsZERlcCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVtb3ZlRXJyb3IoY2hhbmdlZEVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGZpbmFsbHksIHVwZGF0ZSB0aGUgcGFyZW50cwotCQl1cGRhdGVQYXJlbnRzRm9yRXJyb3JzKChFT2JqZWN0KSBjaGFuZ2VkRWxlbWVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhcmVudEVycm9yKEVPYmplY3QgcGFyZW50LCBFT2JqZWN0IGVsZW1lbnQsCi0JCQlpbnQgZXJyb3JUeXBlKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkKLQkJCQkmJiBDb25maWd1cmF0aW9uSGVscGVyLmlzR2xvYmFsUGFja2FnZSgoTWV0aG9kUGFja2FnZSkgcGFyZW50KSkgewotCQkJdXBkYXRlUGFyZW50RXJyb3IocGFyZW50LmVDb250YWluZXIoKSwgZWxlbWVudCwgZXJyb3JUeXBlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFJlbW92ZSB0aGUgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudCBmcm9tIGFsbCBwYXJlbnRzLgotCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gZ2V0RXJyb3IocGFyZW50LCBmYWxzZSk7Ci0JCWlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLnNpemUoKSA+IDApIHsKLQkJCWVycm9yLnJlbW92ZUVycm9yKGVsZW1lbnQpOwotCQl9Ci0KLQkJaWYgKGVycm9yVHlwZSAhPSBFcnJvckluZm8uTk9ORSkgewotCQkJLy8gUHJvcGVnYXRlIHRoZSBlcnJvciB0byBhbGwgcGFyZW50cy4KLQkJCWVycm9yID0gZ2V0RXJyb3IocGFyZW50LCB0cnVlKTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeVJlc291cmNlcy5jb25maWdDbG9zdXJlV2FybmluZ19tc2cxOwotCQkJZXJyb3IuYWRkRXJyb3IobmV3IEVycm9ySW5mbyhlcnJvclR5cGUsIG1lc3NhZ2UsIHBhcmVudCwgZWxlbWVudCwKLQkJCQkJRXJyb3JJbmZvLk5PTkUpKTsKLQkJfSBlbHNlIGlmICgoZXJyb3IgIT0gbnVsbCkgJiYgKGVycm9yLnNpemUoKSA9PSAwKSkgewotCQkJcmVtb3ZlRXJyb3IocGFyZW50KTsKLQkJfQotCi0JCXVwZGF0ZVBhcmVudEVycm9yKHBhcmVudC5lQ29udGFpbmVyKCksIGVsZW1lbnQsIGVycm9yVHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhcmVudHNGb3JFcnJvcnMoRU9iamVjdCBlbGVtZW50KSB7Ci0JCWludCBlcnJvclR5cGUgPSBFcnJvckluZm8uTk9ORTsKLQotCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gZ2V0RXJyb3IoZWxlbWVudCk7Ci0JCWlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLnNpemUoKSA+IDApIHsKLQkJCWlmIChlcnJvci5pc0Vycm9yKCkgfHwgZXJyb3IuaXNDaGlsZEVycm9yKCkpIHsKLQkJCQllcnJvclR5cGUgPSBFcnJvckluZm8uQ0hJTERfRVJST1I7Ci0JCQl9IGVsc2UgaWYgKGVycm9yLmlzV2FybmluZygpIHx8IGVycm9yLmlzQ2hpbGRXYXJuaW5nKCkpIHsKLQkJCQllcnJvclR5cGUgPSBFcnJvckluZm8uQ0hJTERfV0FSTklORzsKLQkJCX0KLQkJfQotCi0JCXVwZGF0ZVBhcmVudEVycm9yKGVsZW1lbnQuZUNvbnRhaW5lcigpLCBlbGVtZW50LCBlcnJvclR5cGUpOwotCX0KLQotCS8qKgotCSAqIGFjY2VwdCB0aGUgY3V0cnJlbnQgc2VsZWN0aW9uIGFuZCBpZ25vcmUgYW55IHdhcm5pbmcgbWVzc2FnZS4gbWFrZSB0aGUKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIG1ha2VDbG9zdXJlKCkgewotCQkvLyBJZiBubyBlcnJvci4gdXBkYXRlIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkJd2hpbGUgKGhhc0Vycm9yKCkpIHsKLQkJCWZpeFByb2JsZW1zKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZml4IGFsbCBlcnJvcihzKSBhbmQgd2FybmlnbihzKQotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpeFByb2JsZW1zKCkgewotCQkvLyBJZiBubyBlcnJvciwgdXBkYXRlIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkJd2hpbGUgKGhhc1Byb2JsZW0oKSkgewotCQkJZml4UHJvYmxlbXMoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpeFByb2JsZW1zKGJvb2xlYW4gZXJyb3JPbmx5KSB7Ci0JCS8vIE5vdGU6IG1ha2UgY2xvc3VyZSB3aWxsIHNlbGVjdCBlbGVtZW50cyBhcyBuZWVkZWQuCi0JCS8vIHNvIHdlIG5lZWQgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgc2VsY3RlZCBvbmVzCi0JCS8vIGluIG9yZGVyIHRvIHRyYWNlIHRoZSBzdGF0dXMKLQkJTGlzdCBjdXJyZW50U2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KHNlbGVjdGVkKTsKLQotCQkvLyBiZWdpblVwZGF0ZSgpOwotCi0JCS8vIGxpc3Qgb2YgZXJyb3JJbmZvIG9iamVjdHMKLQkJTGlzdCBlcnJvcnMgPSBnZXRBbGxFcnJvcnMoKTsKLQkJaWYgKGVycm9ycy5zaXplKCkgPiAwKSB7Ci0JCQlpbnZhbGlkTm9kZXNNYXAuY2xlYXIoKTsKLQkJCUVycm9ySW5mbyBlcnJvcjsKLQkJCUVPYmplY3Qgb3duZXJFbGVtZW50LCBjYXVzZUVsZW1lbnQ7Ci0JCQlib29sZWFuIG93bmVyU2VsZWN0ZWQsIGNhdXNlU2VsZWN0ZWQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZXJyb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQllcnJvciA9IChFcnJvckluZm8pIGl0Lm5leHQoKTsKLQotCQkJCW93bmVyRWxlbWVudCA9IChFT2JqZWN0KSBlcnJvci5nZXRPd25lckVsZW1lbnQoKTsKLQkJCQljYXVzZUVsZW1lbnQgPSAoRU9iamVjdCkgZXJyb3IuZ2V0Q2F1c2VFbGVtZW50KCk7Ci0JCQkJYWRkQ2hhbmdlZChvd25lckVsZW1lbnQpOwotCQkJCWFkZENoYW5nZWQoY2F1c2VFbGVtZW50KTsKLQkJCQlpZiAoZXJyb3IuaXNDaGlsZEVycm9yKCkgfHwgZXJyb3IuaXNDaGlsZFdhcm5pbmcoKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoZXJyb3IuaXNXYXJuaW5nKCkgJiYgZXJyb3JPbmx5KSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCW93bmVyU2VsZWN0ZWQgPSBjdXJyZW50U2VsZWN0ZWQuY29udGFpbnMob3duZXJFbGVtZW50KTsKLQkJCQljYXVzZVNlbGVjdGVkID0gY3VycmVudFNlbGVjdGVkLmNvbnRhaW5zKGNhdXNlRWxlbWVudCk7Ci0KLQkJCQkvLyBJZiB0aGUgb3duZXIgZWxlbWVudCBpcyBub3Qgc2VsZWN0ZWQKLQkJCQkvLyB0aGUgZXJyb3IgaXMgY2F1c2VkIGJ5IHVuLXNlbGVjdGluZyB0aGlzIGVsZW1lbnQsCi0JCQkJLy8gc2VsZWN0IGl0IHdpbGwgZml4IHRoZSBlcnJvcgotCi0JCQkJLy8gSWYgdGhlIG93bmVyIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIHRoZSBlcnJvciBpcyBjYXVzZWQgYnkKLQkJCQkvLyB1bi1zZWxlY3RlZCByZWZlcmVuY2VzLgotCQkJCS8vIHNlbGVjdCB0aG9zZSBjYXVzZSBlbGVtZW50cyB3aWxsIGZpeCB0aGUgZXJyb3IKLQkJCQlpZiAoIW93bmVyU2VsZWN0ZWQpIHsKLQkJCQkJc2VsZWN0RXJyb3JFbGVtZW50KG93bmVyRWxlbWVudCk7Ci0JCQkJfSBlbHNlIGlmICghY2F1c2VTZWxlY3RlZCkgewotCQkJCQlzZWxlY3RFcnJvckVsZW1lbnQoY2F1c2VFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQllbmRVcGRhdGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0RXJyb3JFbGVtZW50KEVPYmplY3QgZWxlbWVudCkgewotCQkvLyBUaGUgc2VsZWN0aW9uIGlzIGJhc2VkIG9uIGEgcGFja2FnZSBsZXZlbC4gV2hlbiBhIG5vbi1wYWNrYWdlIGVsZW1lbnQKLQkJLy8gaXMgc2VsZWN0ZWQsIGFsbCBpdCdzIG5vbi1wYWNrYWdlIHNpYmxpbmdzIG11c3QgYmUgc2VsZWN0ZWQgYXMgd2VsbC4KLQkJaWYgKExpYnJhcnlVdGlsLnNlbGVjdGFibGUoZWxlbWVudCkpIHsKLQkJCWFkZChlbGVtZW50LCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHVwZGF0ZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGxpYnJhcnkgd2l0aCB0aGUgY3VycmVudCBzZWxlY3Rpb25zCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJTGlzdCBwYWNrYWdlcyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkJcGx1Z2lucy5jbGVhcigpOwotCQlwYWNrYWdlcy5jbGVhcigpOwotCi0JCUVPYmplY3QgZWxlbWVudDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWVsZW1lbnQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlpZiAoIXBsdWdpbnMuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQkJcGx1Z2lucy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICgoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpCi0JCQkJCSYmICFDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkJLmlzR2xvYmFsUGFja2FnZSgoTWV0aG9kUGFja2FnZSkgZWxlbWVudCkpIHsKLQkJCQlpZiAoIXBhY2thZ2VzLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCXBhY2thZ2VzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWNrYWdlcyB0aGUgbGlicmFyeSBiYXNlZCBvbiB0aGUgc2VsZWN0aW9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgd2lsbCBjaGFuZ2UgdGhlIGN1cnJlbnQgbGlicmFyeS4gQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIGEKLQkgKiBjb3B5IG9mIHRoZSBjdXJyZW50IGxpYnJhcnkgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIHN0ZXBzOgotCSAqIDEuIENyZWF0ZSBhIG5ldyA8Y29kZT5Db25maWd1cmF0aW9uTWFuYWdlcjwvY29kZT4gd2l0aCBhIGNvcHkgb2YgdGhlCi0JICogb3JpZ2luYWwgbGlicmFyeSwgMi4gUmVidWlsZCB0aGUgZGVwZW5kZW5jeSwgMy4gQ3JlYXRlIGEKLQkgKiA8Y29kZT5Db25maWd1cmF0aW9uQ2xvc3VyZTwvY29kZT4gd2l0aCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gQSA8Y29kZT5NZXRob2RMaWJyYXJ5PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBwYWNrYWdlTGlicmFyeShib29sZWFuIHJlbW92ZUJyb2tlblJlZmVyZW5jZXMpIHsKLQkJcHJvY2Vzc1NlbGVjdGlvbihsaWJyYXJ5LCByZW1vdmVCcm9rZW5SZWZlcmVuY2VzKTsKLQotCQkvLyBSZW1vdmUgdGhlIGNvbmZpZ3VyYXRpb25zIGV4Y2VwdCBmb3IgdGhlIGN1cnJlbnQgb25lLgotCQlMaXN0IGNvbmZpZ3MgPSBsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQljb25maWdzLmNsZWFyKCk7Ci0JCWNvbmZpZ3MuYWRkKGNvbmZpZyk7Ci0KLQkJcmV0dXJuIGxpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogcHJvY2VzcyB0aGUgc2VsZWN0ZWQgcGFja2FnZSBieSByZW1vdmVpbmcgYWxsIHVuc2VsZWN0ZWQgZWxlbWVudHMgYW5kIGFueQotCSAqIG1pc3NpbmcgcmVmZXJlbmNlcwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NTZWxlY3Rpb24oRU9iamVjdCBlbGVtZW50LAotCQkJYm9vbGVhbiByZW1vdmVCcm9rZW5SZWZlcmVuY2VzKSB7Ci0JCWlmIChyZW1vdmVCcm9rZW5SZWZlcmVuY2VzKSB7Ci0JCQkvLyBJdGVyYXRvciB0aGUgcmVmZXJlbmNlcyBhbmQgcmVtb3ZlIGJyb2tlbiByZWZlcmVuY2VzLgotCQkJRUxpc3QgcmVmZXJlbmNlcyA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpOwotCQkJaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBuZXcgQXJyYXlMaXN0KHJlZmVyZW5jZXMpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IHJlZiA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJCUVPYmplY3QgcGtnUmVmID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShyZWYpOwotCQkJCQlpZiAocGtnUmVmICE9IG51bGwgJiYgIWlzU2VsZWN0ZWQocGtnUmVmKSkgewotCQkJCQkJcmVtb3ZlUmVmZXJlbmNlKGVsZW1lbnQsIHJlZik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlFTGlzdCBlbGVtZW50cyA9IGVsZW1lbnQuZUNvbnRlbnRzKCk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbmV3IEFycmF5TGlzdChlbGVtZW50cykuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCi0JCQkJLy8gSWYgdGhlIGNoaWxkIGVsZW1lbnQgaXMgc2VsZWN0YWJsZSBidXQgaXQgaXMgbm90IGluIHRoZQotCQkJCS8vIGNvbmZpZ3VyYXRpb24sIHJlbW92ZSBpdC4KLQkJCQlpZiAoTGlicmFyeVV0aWwuc2VsZWN0YWJsZShjaGlsZCkgJiYgIWlzU2VsZWN0ZWQoY2hpbGQpKSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoY2hpbGQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByb2Nlc3NTZWxlY3Rpb24oY2hpbGQsIHJlbW92ZUJyb2tlblJlZmVyZW5jZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVSZWZlcmVuY2UoRU9iamVjdCBvd25lckVsZW1lbnQsIEVPYmplY3QgcmVmRWxlbWVudCkgewotCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGNvbmZpZ01hbmFnZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCUlQcm9wZXJ0eVNvdXJjZSBwcyA9IHByb3ZpZGVyLmdldFByb3BlcnR5U291cmNlKG93bmVyRWxlbWVudCk7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3JbXSBwZHMgPSBwcy5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0JCWlmIChwZHMgIT0gbnVsbCAmJiBwZHMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoSVByb3BlcnR5RGVzY3JpcHRvcikgcGRzW2ldOwotCQkJCU9iamVjdCBpZCA9IGRlc2NyaXB0b3IuZ2V0SWQoKTsKLQkJCQlPYmplY3QgdmFsdWUgPSBwcy5nZXRQcm9wZXJ0eVZhbHVlKGlkKTsKLQotCQkJCS8vIENoZWNrIHdoZXRoZXIgdGhlIHZhbHVlIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBhbiBlZGl0YWJsZQotCQkJCS8vIHZhbHVlLgotCQkJCUlQcm9wZXJ0eVNvdXJjZSBzb3VyY2UgPSBwcm92aWRlci5nZXRQcm9wZXJ0eVNvdXJjZSh2YWx1ZSk7Ci0JCQkJaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gc291cmNlLmdldEVkaXRhYmxlVmFsdWUoKTsKLQkJCQl9Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRUxpc3QpIHsKLQkJCQkJRUxpc3QgcmVmTGlzdCA9IChFTGlzdCkgdmFsdWU7Ci0JCQkJCWlmIChyZWZMaXN0LmNvbnRhaW5zKHJlZkVsZW1lbnQpKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiUmVmZXJlbmNlIFsiICsgTGlicmFyeVV0aWwuZ2V0TmFtZShyZWZFbGVtZW50KSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgIl0gcmVtb3ZlZCBmcm9tIFsiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXROYW1lKG93bmVyRWxlbWVudCkKLQkJCQkJCQkJCQkJKyAiXSdzIHJlZmVyZW5jZSBsaXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJlZkxpc3QucmVtb3ZlKHJlZkVsZW1lbnQpOwotCQkJCQkJcHMuc2V0UHJvcGVydHlWYWx1ZShpZCwgcmVmTGlzdCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIlJlZmVyZW5jZSBbIiArIExpYnJhcnlVdGlsLmdldE5hbWUocmVmRWxlbWVudCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSsgIl0gcmVtb3ZlZCBmcm9tIFsiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkrIExpYnJhcnlVdGlsLmdldE5hbWUob3duZXJFbGVtZW50KQotCQkJCQkJCQkJCSsgIl0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXBzLnNldFByb3BlcnR5VmFsdWUoaWQsIG51bGwpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGNsb3N1cmUuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY29uZmlnTWFuYWdlciA9IG51bGw7Ci0JCWNvbmZpZyA9IG51bGw7Ci0JCWxpYnJhcnkgPSBudWxsOwotCQlkZXBlbmRlbmN5TWFuYWdlciA9IG51bGw7Ci0JCXNlbGVjdGVkLmNsZWFyKCk7Ci0JCWNoYW5nZWROb2Rlcy5jbGVhcigpOwotCQlpbnZhbGlkTm9kZXNNYXAuY2xlYXIoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSWdub3JlKFBhY2thZ2VSZWZlcmVuY2UgcGtnUmVmKSB7Ci0JCXJldHVybiBwa2dSZWYuY2FuSWdub3JlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Db250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYjYyZWEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQkKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNvbnRlbnRQcm92aWRlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGNoaWxkcmVuCi0JICogQHBhcmFtIHBhcmVudEVsZW1lbnQgT2JqZWN0Ci0JICogQHJldHVybiBhbiBhcnJheSBvZiBPYmplY3RzIGZvciB0aGUgZ2l2ZW4gcGFyZW50IG9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCUxpc3Qgc2VscyA9ICgoTWV0aG9kQ29uZmlndXJhdGlvbikgcGFyZW50RWxlbWVudCkKLQkJCQkJLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQkJaWYgKHNlbHMgIT0gbnVsbCkgewotCQkJCXJldHVybiBzZWxzLnRvQXJyYXkoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJTGlzdCBzZWxzID0gKChNZXRob2RQbHVnaW4pIHBhcmVudEVsZW1lbnQpLmdldE1ldGhvZFBhY2thZ2VzKCk7Ci0JCQlpZiAoc2VscyAhPSBudWxsKSB7Ci0JCQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlMaXN0IHNlbGVjdGVkUGFja2FnZXMgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCi0JCQkJZm9yIChJdGVyYXRvciBpdCA9IHNlbHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IChNZXRob2RQYWNrYWdlKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChzZWxlY3RlZFBhY2thZ2VzICE9IG51bGwKLQkJCQkJCQkmJiBzZWxlY3RlZFBhY2thZ2VzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJCWl0ZW1zLmFkZChwa2cpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIGl0ZW1zLnRvQXJyYXkoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJTGlzdCBjaGlsZHJlbiA9ICgoRU9iamVjdCkgcGFyZW50RWxlbWVudCkuZUNvbnRlbnRzKCk7Ci0JCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCUxpc3Qgc2hvd0l0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBjaGlsZCA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKCghKGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpCi0JCQkJCQkJfHwgQ29uZmlndXJhdGlvbkhlbHBlci5jYW5TaG93KAotCQkJCQkJCQkJKE1ldGhvZEVsZW1lbnQpIGNoaWxkLCBjb25maWcpKSB7Ci0JCQkJCQlzaG93SXRlbXMuYWRkKGNoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gc2hvd0l0ZW1zLnRvQXJyYXkoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudHMgYXNzaWNpYXRlZCB3aXRoIHRoZSBnaXZlbiBlbGVtZW50LiBzYW1lIGFzIGdldENoaWxkcmVuKCkKLQkgKiBAcGFyYW0gaW5wdXRFbGVtZW50IE9iamVjdAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgT2JqZWN0cwotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcGFyYW50IG9iamVjdCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudCBPYmplY3QKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3QpIGVsZW1lbnQpLmVDb250YWluZXIoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlcmUgYXJlIGNoaWxkcmVuIGZvciB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50IE9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbgotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlMaXN0IGNoaWxkcmVuID0gKChFT2JqZWN0KSBlbGVtZW50KS5lQ29udGVudHMoKTsKLQkJCXJldHVybiBjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLnNpemUoKSA+IDA7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBub3RpZnkgaW5wdXQgY2hhbmdlZAotCSAqIEBwYXJhbSB2aWV3ZXIgVmlld2VyCi0JICogQHBhcmFtIG9sZElucHV0IE9iamVjdAotCSAqIEBwYXJhbSBuZXdJbnB1dCBPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIG5ld0lucHV0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogZGlzcG9zZSB0aGUgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIG9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uRGF0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDFlZTI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogIENsYXNzIG1hbmFnaW5nIGNvbmZpZ3VyYXRpb24gZGF0YSBjYWxjdWxhdGlvbiBhbmQgY2FjaGUKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gTWFyIDIwLCAyMDA3Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRGF0YSB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWN0aXZlID0gZmFsc2U7CS8vdGVtcCBmbGFnIHRvIGJlIHJlbW92ZWQKLQkKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByaXZhdGUgTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudERhdGE+IHN1YnN0cmFjdGVkRWxlbU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudERhdGE+KCk7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50RGF0YT4gYWRkZWRFbGVtTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50RGF0YT4oKTs7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnlEYXRhPiBzdWJzdHJhY3RlZENjTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnlEYXRhPigpOwotCXByaXZhdGUgTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5RGF0YT4gYWRkZWRDY01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5RGF0YT4oKTsKLQlwcml2YXRlIGJvb2xlYW4gbmVlZFVwZGF0ZUNvbmZpZ0NoYW5nZSA9IHRydWU7Ci0JcHJpdmF0ZSBTZXQ8Q29udGVudENhdGVnb3J5PiBjaGFuZ2VkQ29udGVudENhdGVnb3J5U2V0ID0gbmV3IEhhc2hTZXQ8Q29udGVudENhdGVnb3J5PigpOwotCXByaXZhdGUgTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBvcmlnaW5hbFN1YnN0cmFjdGVkOwotCXByaXZhdGUgTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBvcmlnbmFsQWRkZWQ7Ci0JCi0JcHVibGljIENvbmZpZ3VyYXRpb25EYXRhKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQkKLQkJLy8tPiBUZW1wIHRlc3QKLQkJCi0JCQotCQkKLQkJCi0JCQotCQkvLzwtIFRlbXAgdGVzdAotCQkJCQotCQlBZGFwdGVyIGNvbmZpZ0xpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCQkJaWYgKAkJdHlwZSA9PSBOb3RpZmljYXRpb24uQURECi0JCQkJCQl8fCAJdHlwZSA9PSBOb3RpZmljYXRpb24uQUREX01BTlkKLQkJCQkJCXx8IAl0eXBlID09IE5vdGlmaWNhdGlvbi5SRU1PVkUKLQkJCQkJCXx8ICB0eXBlID09IE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSkgewkJCQkJCi0JCQkJCW5lZWRVcGRhdGVDb25maWdDaGFuZ2UgPSB0cnVlOwotCQkJCQljaGFuZ2VkQ29udGVudENhdGVnb3J5U2V0ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWNvbmZpZy5lQWRhcHRlcnMoKS5hZGQoY29uZmlnTGlzdGVuZXIpOwotCX0JCi0JCi0JcHJpdmF0ZSBib29sZWFuIGdldFVwZGF0aW5nQ29uZmlnQ2hhbmdlKCkgewotCQlyZXR1cm4gb3JpZ2luYWxTdWJzdHJhY3RlZCAhPSBudWxsICYmIG9yaWduYWxBZGRlZCAhPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ29uZmlnQ2hhbmdlKCkgewotCQlpZiAoISBuZWVkVXBkYXRlQ29uZmlnQ2hhbmdlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGdldFVwZGF0aW5nQ29uZmlnQ2hhbmdlKCkpIHsKLQkJCXJldHVybjsJCQkKLQkJfQkJCi0JCQotCQlvcmlnaW5hbFN1YnN0cmFjdGVkID0gY29sbGVjdEFsbChjb25maWcuZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkpOwotCQlvcmlnbmFsQWRkZWQgPSBjb2xsZWN0QWxsKGNvbmZpZy5nZXRBZGRlZENhdGVnb3J5KCkpOwkJCi0JCQotCQlNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IGNhbFN1YnN0cmFjdGVkID0gaGFuZGxlUmVwbGFjZXJzKG9yaWdpbmFsU3Vic3RyYWN0ZWQsIHRydWUpOwotCQlNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IGNhbEFkZGVkID0gaGFuZGxlUmVwbGFjZXJzKG9yaWduYWxBZGRlZCwgZmFsc2UpOwotCQloYW5kbGVDb250cmlidXRvcnMoY2FsU3Vic3RyYWN0ZWQsIHRydWUpOwotCQloYW5kbGVDb250cmlidXRvcnMoY2FsQWRkZWQsIGZhbHNlKTsKLQkJCi0JCXVwZGF0ZUNjTWFwKGFkZGVkQ2NNYXAsIGNhbFN1YnN0cmFjdGVkLnZhbHVlcygpLCBhZGRlZEVsZW1NYXApOwotCQl1cGRhdGVDY01hcChzdWJzdHJhY3RlZENjTWFwLCBjYWxBZGRlZC52YWx1ZXMoKSwgc3Vic3RyYWN0ZWRFbGVtTWFwKTsKLQkJCi0JCW5lZWRVcGRhdGVDb25maWdDaGFuZ2UgPSBmYWxzZTsJCQotCQkKLQkJb3JpZ2luYWxTdWJzdHJhY3RlZCA9IG51bGw7CQkvL25vdCBuZWVkZWQgYWZ0ZXIgdXBkYXRlCi0JCW9yaWduYWxBZGRlZCA9IG51bGw7CQkJLy9ub3QgbmVlZGVkIGFmdGVyIHVwZGF0ZQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNvbnRyaWJ1dG9ycyhNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IG1hcCwgIGJvb2xlYW4gc3Vic3RyYWN0ZWQpIHsKLQkJaWYgKCEgc3Vic3RyYWN0ZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCQlMaXN0PENvbnRlbnRDYXRlZ29yeT4gYWRkZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxDb250ZW50Q2F0ZWdvcnk+KCk7Ci0JCQkJCi0JCWZvciAoSXRlcmF0b3I8Q29udGVudENhdGVnb3J5PiBpdCA9IG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2MgPSBpdC5uZXh0KCk7Ci0JCQlMaXN0PENvbnRlbnRDYXRlZ29yeT4gY29udHJpYnV0ZXJzID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb250cmlidXRvcnMoY2MsIGNvbmZpZyk7Ci0JCQlhZGRlZExpc3QuYWRkQWxsKGNvbnRyaWJ1dGVycyk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IGl0ID0gYWRkZWRMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYyA9IGl0Lm5leHQoKTsKLQkJCW1hcC5wdXQoY2MuZ2V0R3VpZCgpLCBjYyk7Ci0JCX0JCQotCX0KLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gaGFuZGxlUmVwbGFjZXJzKE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gb3JpZ2luYWxzLCBib29sZWFuIHN1YnN0cmFjdGVkKSB7Ci0JCWlmIChvcmlnaW5hbHMgPT0gbnVsbCB8fCBvcmlnaW5hbHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gb3JpZ2luYWxzOwotCQl9Ci0JCQotCQlNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IHJldCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PigpOwotCQkKLQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IGl0ID0gb3JpZ2luYWxzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYyA9IGl0Lm5leHQoKTsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCByZXBsYWNlciA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIoY2MsIGNvbmZpZyk7Ci0JCQlib29sZWFuIHRvS2VlcCA9IHRydWU7Ci0JCQlpZiAocmVwbGFjZXIgIT0gbnVsbCkgewotCQkJCXRvS2VlcCA9IGZhbHNlOwotCQkJCQotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBuZXN0ZWRSZXBsYWNlciA9IHJlcGxhY2VyOwotCQkJCXdoaWxlIChuZXN0ZWRSZXBsYWNlciAhPSBudWxsKSB7Ci0JCQkJCXJlcGxhY2VyID0gbmVzdGVkUmVwbGFjZXI7Ci0JCQkJCW5lc3RlZFJlcGxhY2VyID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcihuZXN0ZWRSZXBsYWNlciwgY29uZmlnKTsKLQkJCQl9Ci0JCQkJaWYgKHN1YnN0cmFjdGVkKSB7Ci0JCQkJCWlmIChvcmlnaW5hbFN1YnN0cmFjdGVkLmNvbnRhaW5zS2V5KHJlcGxhY2VyLmdldEd1aWQoKSkpIHsKLQkJCQkJCXRvS2VlcCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodG9LZWVwKSB7Ci0JCQkJcmV0LnB1dChjYy5nZXRHdWlkKCksIGNjKTsKLQkJCX0JCQkKLQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQkJCQotCQotCXByaXZhdGUgTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBjb2xsZWN0QWxsKENvbGxlY3Rpb248Q29udGVudENhdGVnb3J5PiBjY0xpc3QpIHsKLQkJaWYgKGNjTGlzdCA9PSBudWxsIHx8IGNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCU1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gYWxsID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+KCk7CQkKLQkJY29sbGVjdEFsbChjY0xpc3QsIGFsbCk7Ci0JCXJldHVybiBhbGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjb2xsZWN0QWxsKENvbGxlY3Rpb248Q29udGVudENhdGVnb3J5PiBjY0xpc3QsIE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gYWxsKSB7Ci0JCWlmIChjY0xpc3QgPT0gbnVsbCB8fCBjY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IGl0ID0gY2NMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYyA9IGl0Lm5leHQoKTsKLQkJCWlmICghIGFsbC5jb250YWluc0tleShjYy5nZXRHdWlkKCkpKSB7Ci0JCQkJYWxsLnB1dChjYy5nZXRHdWlkKCksIGNjKTsKLQkJCQljb2xsZWN0QWxsKGdldENoaWxkQ0MoY2MpLCBhbGwpOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIENvbGxlY3Rpb248Q29udGVudENhdGVnb3J5PiBnZXRDaGlsZENDKENvbnRlbnRDYXRlZ29yeSBjYykgewotCQlpZiAoY2MgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIGNjKS5nZXRTdWJDYXRlZ29yaWVzKCk7Ci0JCX0KLQkJaWYgKGNjIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJcmV0dXJuICgoRGlzY2lwbGluZSkgY2MpLmdldFN1YmRpc2NpcGxpbmUoKTsKLQkJfQotCQlpZiAoY2MgaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCXJldHVybiAoKERpc2NpcGxpbmVHcm91cGluZykgY2MpLmdldERpc2NpcGxpbmVzKCk7Ci0JCX0KLQkJaWYgKGNjIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQlyZXR1cm4gKChEb21haW4pIGNjKS5nZXRTdWJkb21haW5zKCk7Ci0JCX0KLQkJaWYgKGNjIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQl9Ci0JCWlmIChjYyBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykgewotCQkJcmV0dXJuICgoUm9sZVNldEdyb3VwaW5nKSBjYykuZ2V0Um9sZVNldHMoKTsKLQkJfQotCQlpZiAoY2MgaW5zdGFuY2VvZiBUb29sKSB7Ci0JCQlyZXR1cm4gKChUb29sKSBjYykuZ2V0VG9vbE1lbnRvcnMoKTsKLQkJfQotCQlpZiAoY2MgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVDY01hcChNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnlEYXRhPiBtYXAsIENvbGxlY3Rpb248Q29udGVudENhdGVnb3J5PiBjY0xpc3QsCi0JCQlNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50RGF0YT4gY2NEYXRhT3duZXIpIHsKLQkJaWYgKGNjTGlzdCA9PSBudWxsIHx8IGNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnlEYXRhPiBuZXdNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeURhdGE+KCk7Ci0JCQotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IGl0ID0gY2NMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYyA9IGl0Lm5leHQoKTsKLQkJCUNvbnRlbnRDYXRlZ29yeURhdGEgY2NEYXRhID0gbWFwID09IG51bGwgPyBudWxsIDogbWFwLmdldChjYwotCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCWlmIChjY0RhdGEgPT0gbnVsbCkgewotCQkJCWNjRGF0YSA9IG5ldyBDb250ZW50Q2F0ZWdvcnlEYXRhKGNjLCBjY0RhdGFPd25lcik7Ci0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQl9Ci0JCQluZXdNYXAucHV0KGNjLmdldEd1aWQoKSwgY2NEYXRhKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgQ29udGVudENhdGVnb3J5RGF0YT4+IGl0ID0gbWFwCi0JCQkJLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5PFN0cmluZywgQ29udGVudENhdGVnb3J5RGF0YT4gZW50cnkgPSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3VpZCA9IGVudHJ5LmdldEtleSgpOwotCQkJQ29udGVudENhdGVnb3J5RGF0YSBjY0RhdGEgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCi0JCQlpZiAoIW5ld01hcC5jb250YWluc0tleShndWlkKSkgewotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCWluY09yRGVjRWxlbU1hcChjY0RhdGFPd25lciwgZ2V0RWxlbWVudHMoY2NEYXRhLmdldENvbnRlbnRDYXRlZ29yeSgpKSwgZmFsc2UpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoY2hhbmdlZCkgewotCQkJbWFwID0gbmV3TWFwOwotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2NDaGFuZ2VzKCkgewotCQlpZiAoY2hhbmdlZENvbnRlbnRDYXRlZ29yeVNldCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IGl0ID0gY2hhbmdlZENvbnRlbnRDYXRlZ29yeVNldC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJQ29udGVudENhdGVnb3J5IGNjID0gaXQubmV4dCgpOwotCQkJdXBkYXRlQ2NDaGFuZ2Uoc3Vic3RyYWN0ZWRDY01hcCwgY2MpOwotCQkJdXBkYXRlQ2NDaGFuZ2UoYWRkZWRDY01hcCwgY2MpOwotCQl9Ci0JCWNoYW5nZWRDb250ZW50Q2F0ZWdvcnlTZXQgPSBudWxsOwotCX0JCQkJCi0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2NDaGFuZ2UoTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5RGF0YT4gbWFwLCBDb250ZW50Q2F0ZWdvcnkgY2MpIHsKLQkJQ29udGVudENhdGVnb3J5RGF0YSBjY0RhdGEgPSBtYXAgPT0gbnVsbCA/IG51bGwgOiBtYXAuZ2V0KGNjLmdldEd1aWQoKSk7Ci0JCWlmIChjY0RhdGEgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydChjY0RhdGEuZ2V0Q29udGVudENhdGVnb3J5KCkgPT0gY2MpOwotCQljY0RhdGEudXBkYXRlRWxlbWVudE1hcCgpOwotCX0JCQotCi0JLy9ObyBkdXBsaWNhdGVzIGluIHRoZSByZXR1cm5lZCBlbGVtZW50cwotCXByaXZhdGUgQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBnZXRFbGVtZW50cyhDb250ZW50Q2F0ZWdvcnkgY2MpIHsKLQkJQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kRWxlbWVudD4oKTsKLQkJZWxlbWVudHMuYWRkQWxsKGNjLmdldEFzc2V0cygpKTsKLQkJZWxlbWVudHMuYWRkQWxsKGNjLmdldENoZWNrbGlzdHMoKSk7Ci0JCWVsZW1lbnRzLmFkZEFsbChjYy5nZXRDb25jZXB0c0FuZFBhcGVycygpKTsKLQkJZWxlbWVudHMuYWRkQWxsKGNjLmdldEV4YW1wbGVzKCkpOwotCQllbGVtZW50cy5hZGRBbGwoY2MuZ2V0R3VpZGVsaW5lcygpKTsKLQkJZWxlbWVudHMuYWRkQWxsKGNjLmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKSk7CQkKLQkJCi0JCWlmIChjYyBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChDdXN0b21DYXRlZ29yeSkgY2MpLmdldFN1YkNhdGVnb3JpZXMoKSk7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChDdXN0b21DYXRlZ29yeSkgY2MpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY2MgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChEaXNjaXBsaW5lKSBjYykuZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCkpOwotCQkJZWxlbWVudHMuYWRkQWxsKCgoRGlzY2lwbGluZSkgY2MpLmdldFN1YmRpc2NpcGxpbmUoKSk7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChEaXNjaXBsaW5lKSBjYykuZ2V0VGFza3MoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY2MgaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKERpc2NpcGxpbmVHcm91cGluZykgY2MpLmdldERpc2NpcGxpbmVzKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGNjIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChEb21haW4pIGNjKS5nZXRTdWJkb21haW5zKCkpOwotCQkJZWxlbWVudHMuYWRkQWxsKCgoRG9tYWluKSBjYykuZ2V0V29ya1Byb2R1Y3RzKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGNjIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJZWxlbWVudHMuYWRkQWxsKCgoUm9sZVNldCkgY2MpLmdldFJvbGVzKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGNjIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSB7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChSb2xlU2V0R3JvdXBpbmcpIGNjKS5nZXRSb2xlU2V0cygpKTsKLQkJfQotCQllbHNlIGlmIChjYyBpbnN0YW5jZW9mIFRvb2wpIHsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKFRvb2wpIGNjKS5nZXRUb29sTWVudG9ycygpKTsKLQkJfQotCQllbHNlIGlmIChjYyBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkgewotCQkJZWxlbWVudHMuYWRkQWxsKCgoV29ya1Byb2R1Y3RUeXBlKSBjYykuZ2V0V29ya1Byb2R1Y3RzKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGdldFVuaXF1ZUNvbGxlY3Rpb24oZWxlbWVudHMpOwotCX0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZ2V0VW5pcXVlQ29sbGVjdGlvbihDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzKSB7Ci0JCUNvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gcmV0ID0gbmV3IExpbmtlZEhhc2hTZXQ8TWV0aG9kRWxlbWVudD4oKTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RFbGVtZW50PiBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCWlmICghIHJldC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCXJldC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGluY09yRGVjRWxlbU1hcChNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50RGF0YT4gbWFwLCAKLQkJCQkJCUNvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZWxlbWVudHMsIGJvb2xlYW4gaW5jKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kRWxlbWVudD4gaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlpbmNPckRlY0VsZW1NYXAobWFwLCBpdC5uZXh0KCksIGluYyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluY09yRGVjRWxlbU1hcChNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50RGF0YT4gbWFwLCBNZXRob2RFbGVtZW50IGVsZW1lbnQsIAotCQkJYm9vbGVhbiBpbmMpIHsKLQkJaWYgKG1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlNZXRob2RFbGVtZW50RGF0YSBkYXRhID0gbWFwLmdldChlbGVtZW50LmdldEd1aWQoKSk7Ci0JCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCWFzc2VydCAoZWxlbWVudCA9PSBkYXRhLmVsZW1lbnQpOwotCQkJYXNzZXJ0IChkYXRhLnJlZkNvdW50ID4gMCk7Ci0KLQkJCWlmIChpbmMpIHsKLQkJCQlkYXRhLnJlZkNvdW50Kys7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGEucmVmQ291bnQtLTsKLQkJCQlpZiAoZGF0YS5yZWZDb3VudCA9PSAwKSB7Ci0JCQkJCW1hcC5yZW1vdmUoZWxlbWVudC5nZXRHdWlkKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfSBlbHNlIGlmICghaW5jKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQltYXAucHV0KGVsZW1lbnQuZ2V0R3VpZCgpLCBuZXcgTWV0aG9kRWxlbWVudERhdGEoZWxlbWVudCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc093bmVyU2VsZWN0ZWQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGNoZWNrU3VidHJhY3RlZCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoQ29uZmlndXJhdGlvbkhlbHBlci5pc0Rlc2NyaXB0aW9uRWxlbWVudChlbGVtZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmIChnZXRVcGRhdGluZ0NvbmZpZ0NoYW5nZSgpKSB7Ci0JCQlpZiAob3JpZ2luYWxTdWJzdHJhY3RlZC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSkgfHwgCi0JCQkJb3JpZ25hbEFkZGVkLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQkJCQotCQl9IGVsc2UgewotCQkJdXBkYXRlQ29uZmlnQ2hhbmdlKCk7Ci0JCQl1cGRhdGVDY0NoYW5nZXMoKTsKLQkJCQotCQkJLy8gc2luY2UgVU1BIDEuMC40LCBjb25maWd1cmF0aW9uIGNhbiBoYXZlIGFkZGVkIGNhdGVnb3JpZXMgCi0JCQkvLyBhbmQgc3VidHJhY3RlZCBjYXRlZ29yaWVzLiBUaGUgb3JkZXIgb2YgZmlsdGVyaW5nIGlzOgotCQkJLy8gMS4gYW55IGVsZW1lbnQgaW4gdGhlIHN1YnRyYWN0ZWQgY2F0ZWdvcmllcyBzaG91bGQgYmUgZXhjbHVkZWQKLQkJCS8vIDIuIGFueSBlbGVtZW50IGluIHRoZSBhZGRlZCBjYXRlZ29yaWVzIHNob3VsZCBiZSBpbmNsdWRlZAotCQkJLy8gMy4gYW55IGVsZW1lbnQgbm90IGluIHRoZSBzZWxlY3RlZCBwYWNrYWdlIG9yIHBsdWdpbiBzaG91bGQgYmUgZXhjbHVkZWQuCQkKLQkJCWlmICggY2hlY2tTdWJ0cmFjdGVkKSB7Ci0JCQkJaWYgKHN1YnN0cmFjdGVkRWxlbU1hcC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCl7Ci0JCQkJCWlmIChjb250cmlidXRlZEJhc2VJblN1YnN0cmFjdGVkKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChhZGRlZEVsZW1NYXAuY29udGFpbnNLZXkoZWxlbWVudC5nZXRHdWlkKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gCi0JCQotCQkvLyBlbGVtZW50cyBiZXlvbmQgY29uZmlndXJhdGlvbiBzY29wZSBzaG91bGQgYmUgYWx3YXlzIHZpc2libGUKLQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkKLQkJCQl8fCAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlMaXN0IHBsdWdpbnMgPSBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCQlyZXR1cm4gKHBsdWdpbnMgIT0gbnVsbCkgJiYgcGx1Z2lucy5jb250YWlucyhlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIHRoZSBvd25lcnByb2Nlc3MgY2FuJ3Qgc2hvdywgY2FuJ3QgYWNjZXB0Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgKChBY3Rpdml0eSkgZWxlbWVudCkKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKGJhc2UgIT0gbnVsbCAmJiBiYXNlICE9IGVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBvd25pbmdQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJhc2UpOwotCQkJCQlpZiAoIG93bmluZ1Byb2MgIT0gbnVsbCAmJiBvd25pbmdQcm9jICE9IGVsZW1lbnQgCi0JCQkJCQkJJiYgIUNvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcob3duaW5nUHJvYywgY29uZmlnLCBjaGVja1N1YnRyYWN0ZWQpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUVPYmplY3QgcGtnID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlbGVtZW50KTsKLQotCQkJLy8gYWNjZXB0IGdsb2JhbCBwYWNrYWdlIGlmIHRoZSBwbHVnaW4gaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkJCWlmIChwa2cgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJCSYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNHbG9iYWxQYWNrYWdlKChNZXRob2RQYWNrYWdlKSBwa2cpKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihwa2cpOwotCQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKHBsdWdpbiwgY29uZmlnLCBjaGVja1N1YnRyYWN0ZWQpOwotCQkJfQotCi0JCQlMaXN0IHBrZ3MgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJaWYgKHBrZ3MgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLy8gcGVyIFBob25nJ3MgcmVxdWVzdCwgZm9yIFByb2Nlc3NQYWNrYWdlLCBjaGVjayB0aGUKLQkJCS8vIFByb2Nlc3NDb21wb25lbnQgcGFyZW50IGluc3RlYWQKLQkJCWlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXdoaWxlICgocGtnICE9IG51bGwpICYmICEocGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkKLQkJCQkJCSYmICFwa2dzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJcGtnID0gcGtnLmVDb250YWluZXIoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGlmIHBhY2thZ2Ugbm90IHNlbGVjdGVkLCByZXR1cm4gZmFsc2UKLQkJCWlmICgocGtnID09IG51bGwpIHx8ICFwa2dzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRyaWJ1dGVkQmFzZUluU3Vic3RyYWN0ZWQoVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0JCWlmICh2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSAhPSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKGJhc2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoc3Vic3RyYWN0ZWRFbGVtTWFwLmNvbnRhaW5zS2V5KGJhc2UuZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKGJhc2UsIGNvbmZpZywgdHJ1ZSkpIHsKLQkJCXJldHVybiBjb250cmlidXRlZEJhc2VJblN1YnN0cmFjdGVkKGJhc2UpOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0JCi0JcHJpdmF0ZSBjbGFzcyBDb250ZW50Q2F0ZWdvcnlEYXRhIHsKLQkJcHJpdmF0ZSBDb250ZW50Q2F0ZWdvcnkgY29udGVudENhdGVnb3J5OwotCQlwcml2YXRlIE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+KCk7Ci0JCXByaXZhdGUgTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudERhdGE+IGRhdGFNYXA7Ci0JCQotCQlwdWJsaWMgQ29udGVudENhdGVnb3J5RGF0YShDb250ZW50Q2F0ZWdvcnkgY2MsIE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnREYXRhPiBkYXRhTWFwKSB7Ci0JCQljb250ZW50Q2F0ZWdvcnkgPSBjYzsKLQkJCQotCQkJQWRhcHRlciBDb250ZW50Q2F0ZWdvcnlMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCQkJCWlmICh0eXBlID09IE5vdGlmaWNhdGlvbi5TRVQpIHsKLQkJCQkJCS8vdG8gZG86IGNoZWNrIGFueSB2YXJpYWJpbGl0eSBjaGFuZ2UKLQkJCQkJCS8vbXNnLmdldEZlYXR1cmUoKTsKLQkJCQkJCW5lZWRVcGRhdGVDb25maWdDaGFuZ2UgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQlpZiAobmVlZFVwZGF0ZUNvbmZpZ0NoYW5nZSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9CQkJCQkJCi0JCQkJCWNoYW5nZWRDb250ZW50Q2F0ZWdvcnlTZXQuYWRkKGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQkJfQotCQkJfTsJCQkKLQkJCWNvbnRlbnRDYXRlZ29yeS5lQWRhcHRlcnMoKS5hZGQoQ29udGVudENhdGVnb3J5TGlzdGVuZXIpOwotCQkJCi0JCQl0aGlzLmRhdGFNYXAgPSBkYXRhTWFwOwotCQkJdXBkYXRlRWxlbWVudE1hcCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgQ29udGVudENhdGVnb3J5IGdldENvbnRlbnRDYXRlZ29yeSgpIHsKLQkJCXJldHVybiBjb250ZW50Q2F0ZWdvcnk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZUVsZW1lbnRNYXAoKSB7Ci0KLQkJCU1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+IG5ld01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudD4oKTsKLQkJCUNvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZWxlbWVudExpc3QgPSBnZXRFbGVtZW50cyhjb250ZW50Q2F0ZWdvcnkpOwotCi0JCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJCWZvciAoSXRlcmF0b3I8TWV0aG9kRWxlbWVudD4gaXQgPSBlbGVtZW50TGlzdC5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudE1hcCA9PSBudWxsCi0JCQkJCQl8fCAhZWxlbWVudE1hcC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSkpIHsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJCWluY09yRGVjRWxlbU1hcChkYXRhTWFwLCBlbGVtZW50LCB0cnVlKTsKLQkJCQl9Ci0JCQkJbmV3TWFwLnB1dChlbGVtZW50LmdldEd1aWQoKSwgZWxlbWVudCk7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgTWV0aG9kRWxlbWVudD4+IGl0ID0gZWxlbWVudE1hcAotCQkJCQkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5PFN0cmluZywgTWV0aG9kRWxlbWVudD4gZW50cnkgPSBpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmICghbmV3TWFwLmNvbnRhaW5zS2V5KGd1aWQpKSB7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlpbmNPckRlY0VsZW1NYXAoZGF0YU1hcCwgZWxlbWVudCwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNoYW5nZWQpIHsKLQkJCQllbGVtZW50TWFwID0gbmV3TWFwOwotCQkJfQotCi0JCX0JCQotCQkJCQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIE1ldGhvZEVsZW1lbnREYXRhIHsKLQkJcHVibGljIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQkJcHVibGljIGludCByZWZDb3VudDsKLQkJCi0JCXB1YmxpYyBNZXRob2RFbGVtZW50RGF0YShNZXRob2RFbGVtZW50IGUpIHsKLQkJCWVsZW1lbnQgPSBlOwotCQkJcmVmQ291bnQgPSAxOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uRmFjdG9yeS50eHQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25GYWN0b3J5LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmY3YjhlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25GYWN0b3J5LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5EZXBlbmRlbmN5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWZjcCA9IG51bGw7Ci0KLQkvLyBtYXAgb2YgTWV0aG9kQ29uZmlndXJhdGlvbiBuYW1lIHRvIENvbmlndXJhdGlvbiBvYmplY3QKLQlwcml2YXRlIE1hcCBjb25maWdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBMaWJyYXJ5UHJvY2Vzc29yIGxpYnJhcnlQcm9jID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRDb25maWdOYW1lID0gbnVsbDsKLQotCS8vIG1hcCBvZiBjb25maWcgbmFtZSB0byBsYXlvdXQgbWFuYWdlcgotCS8vIGVhY2ggY29uZmlnIGhhcyBpdCdzIG93biBsYXlvdXQgbWFuYWdlcgotCXByaXZhdGUgTWFwIGxheW91dE1nck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIERlcGVuZGVuY3lNYW5hZ2VyIGRlcE1nciA9IG51bGw7Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkZhY3RvcnkoTGlicmFyeVByb2Nlc3NvciBsaWJyYXJ5UHJvYykgewotCi0JCXRoaXMubGlicmFyeVByb2MgPSBsaWJyYXJ5UHJvYzsKLQotCQlhZmNwID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGxpYnJhcnlQcm9jCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWxpYnJhcnlQcm9jLmFkZExpc3RlbmVyKG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJaWYgKG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DUkVBVEVECi0JCQkJCQl8fCBvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTE9BREVEKSB7Ci0JCQkJCWNsZWFyKCk7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCi0JCWNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWN1cnJlbnRDb25maWdOYW1lID0gbnVsbDsKLQkJaWYgKGNvbmZpZ01hcC5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlnTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkoKENvbmZpZ3VyYXRpb25DbG9zdXJlKSBpdC5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQljb25maWdNYXAuY2xlYXIoKTsKLQotCQlpZiAobGF5b3V0TWdyTWFwLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsYXlvdXRNZ3JNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCSgoRWxlbWVudExheW91dE1hbmFnZXIpIGl0Lm5leHQoKSkuY2xlYXIoKTsKLQkJCX0KLQkJfQotCi0JCWxheW91dE1nck1hcC5jbGVhcigpOwotCi0JCWlmIChkZXBNZ3IgIT0gbnVsbCkgewotCQkJZGVwTWdyLmNsZWFyKCk7Ci0JCQlkZXBNZ3IgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TGlicmFyeSgpIHsKLQkJcmV0dXJuIGxpYnJhcnlQcm9jLmdldExpYnJhcnkoKTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldExpYnJhcnlVcmkoKSB7Ci0JCXJldHVybiBsaWJyYXJ5UHJvYy5nZXRMaWJyYXJ5VVJJKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbGlicmFyeVByb2MuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gYWZjcDsKLQl9Ci0KLQlwdWJsaWMgRGVwZW5kZW5jeU1hbmFnZXIgZ2V0RGVwZW5kZW5jeU1hbmFnZXIoKSB7Ci0JCS8vIHJldHVybiBsaWJyYXJ5UHJvYy5nZXREZXBlbmRlbmN5TWFuYWdlcigpOwotCQlpZiAodGhpcy5kZXBNZ3IgPT0gbnVsbCkgewotCQkJZGVwTWdyID0gbmV3IERlcGVuZGVuY3lNYW5hZ2VyKGxpYnJhcnlQcm9jKTsKLQkJfQotCi0JCXJldHVybiBkZXBNZ3I7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kUGx1Z2lucygpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZWxlbWVudHMgPSBsaWJyYXJ5UHJvYy5nZXRMaWJyYXJ5KCkuZUNvbnRlbnRzKCk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJaXRlbXMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Q29uZmlndXJhdGlvbihTdHJpbmcgY29uZmlnTmFtZSkgewotCQl0aGlzLmN1cnJlbnRDb25maWdOYW1lID0gY29uZmlnTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudENvbmZpZ05hbWU7Ci0JfQotCi0JcHVibGljIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldExheW91dE1hbmFnZXIoKSB7Ci0JCXJldHVybiBnZXRMYXlvdXRNYW5hZ2VyKHRoaXMuY3VycmVudENvbmZpZ05hbWUpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNYW5hZ2VyKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCUVsZW1lbnRMYXlvdXRNYW5hZ2VyIG1nciA9IG51bGw7Ci0JCWlmIChjb25maWdOYW1lID09IG51bGwpIHsKLQkJCW1nciA9IGxpYnJhcnlQcm9jLmdldExheW91dE1hbmFnZXIoKTsKLQkJfSBlbHNlIHsKLQkJCW1nciA9IChFbGVtZW50TGF5b3V0TWFuYWdlcikgbGF5b3V0TWdyTWFwLmdldChjb25maWdOYW1lKTsKLQkJCWlmIChtZ3IgPT0gbnVsbCkgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbGlicmFyeVByb2MKLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKGNvbmZpZ05hbWUpOwotCQkJCW1nciA9IG5ldyBFbGVtZW50TGF5b3V0TWFuYWdlcihjb25maWcpOwotCQkJCWxheW91dE1nck1hcC5wdXQoY29uZmlnTmFtZSwgbWdyKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtZ3I7Ci0JfQotCi0JcHVibGljIENvbmZpZ3VyYXRpb25DbG9zdXJlIGdldENsb3N1cmUoKSB7Ci0JCXJldHVybiBnZXRDbG9zdXJlKGN1cnJlbnRDb25maWdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNsb3N1cmUgZ2V0Q2xvc3VyZShTdHJpbmcgY29uZmlnTmFtZSkgewotCQlDb25maWd1cmF0aW9uQ2xvc3VyZSBjb25maWcgPSBudWxsOwotCQlpZiAoY29uZmlnTmFtZSAhPSBudWxsKSB7Ci0JCQljb25maWcgPSAoQ29uZmlndXJhdGlvbkNsb3N1cmUpIGNvbmZpZ01hcC5nZXQoY29uZmlnTmFtZSk7Ci0JCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIG1vZGVsQ29uZmlnID0gbGlicmFyeVByb2MKLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKGNvbmZpZ05hbWUpOwotCQkJCWNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uQ2xvc3VyZSh0aGlzLCBtb2RlbENvbmZpZyk7Ci0JCQkJY29uZmlnTWFwLnB1dChjb25maWdOYW1lLCBjb25maWcpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlQ2xvc3VyZSgpIHsKLQkJQ29uZmlndXJhdGlvbkNsb3N1cmUgYyA9IGdldENsb3N1cmUoY3VycmVudENvbmZpZ05hbWUpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljLm1ha2VDbG9zdXJlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjOWU2MDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVmFyaWFiaWxpdHlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBBIG1ldGhvZCBjb25maWd1cmF0aW9uIGZpbHRlciB0byBhbGxvdyBmaWx0ZXJpbmcgZWxlbWVudCAKLSAqIGFuZCByZWFsaXplIHRoZSBlbGVtZW50IGZlYXR1cmUgdmFsdWVzIHdpdGhpbiBhIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkZpbHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSUNvbmZpZ3VyYXRvciB7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWc7CQotCXByaXZhdGUgVmlld2VyIHZpZXdlcjsKLQkKLQkvLyBzZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGNvbmZpZ3VyYXRpb24gdmlldyB0byB0cnVlLCBpLmUuIGNvbnRyaWJ1dG9ycyBhcmUgZGlzY2FyZGVkLgotCXByaXZhdGUgYm9vbGVhbiBkaXNjYXJkQ29udHJpYnV0b3JzID0gdHJ1ZTsKLQkKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogQHBhcmFtIG1ldGhvZENvbmZpZyBhIDxjb2RlPk1ldGhvZENvbmZpZ3VyYXRpb248L2NvZGU+Ci0JICogQHBhcmFtIHZpZXdlciBhIDxjb2RlPlZpZXdlcjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgVmlld2VyIHZpZXdlcikgewotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCi0JcHVibGljIENvbmZpZ3VyYXRpb25GaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFZpZXdlciB2aWV3ZXIsIGJvb2xlYW4gZGlzY2FyZENvbnRyaWJ1dG9ycykgewotCQl0aGlzKG1ldGhvZENvbmZpZywgdmlld2VyKTsKLQkJdGhpcy5kaXNjYXJkQ29udHJpYnV0b3JzID0gZGlzY2FyZENvbnRyaWJ1dG9yczsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG1ldGhvZENvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJb2JqID0gTGlicmFyeVV0aWwudW53cmFwKG9iaik7Ci0KLQkJaWYgKCAoRWxlbWVudFJlYWxpemVyLmlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSB8fCAgCi0JCQkJKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgJiYgQ29uZmlndXJhdGlvbkhlbHBlci5pc0V4dGVuZFJlcGxhY2VyKChWYXJpYWJpbGl0eUVsZW1lbnQpb2JqKSApCi0JCQkJJiYgRmVhdHVyZVZhbHVlLmlzQmxhbmtJbmRpY2F0b3Iob2JqKSApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCXJldHVybiBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKG9iaik7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FuU2hvdygoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQltZXRob2RDb25maWcpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJaWYgKExvZy5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJPYmplY3QgZmlsdGVyZWQ6ICIgKyAob2JqID09IG51bGwgPyBudWxsIDogb2JqLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHJlYWxpemVkIGNoaWxkcmVuIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IGFuZCBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIG9iaiBPYmplY3QKLQkgKiBAcGFyYW0gY2hpbGRGZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIAotCSAqIEByZXR1cm4gQ29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUpIHsKLQkJaWYgKG1ldGhvZENvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gbmV3IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnKTsKLQkJLy8gZGlzY2FyZCB0aGUgY29udHJpYnV0b3JzCi0JCXJlYWxpemVyLnNldERpc2NhcmRDb250cmlidXRvcih0aGlzLmRpc2NhcmRDb250cmlidXRvcnMpOwotCi0JCWlmIChjaGlsZEZlYXR1cmUgIT0gbnVsbCAmJiBjaGlsZEZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJTGlzdCB2YWx1ZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgY2hpbGRGZWF0dXJlLCByZWFsaXplcik7Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoZmluYWwgTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAodmlld2VyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBtZXRob2RDb25maWc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3Ijc2V0TWV0aG9kQ29uZmlndXJhdGlvbihvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQltZXRob2RDb25maWcgPSBjb25maWc7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZUVsZW1lbnRWYXJpYWJpbGl0eUxpc3QoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlWYXJpYWJpbGl0eUluZm8gaW5mbywgYm9vbGVhbiBpbmNsdWRlQmFzZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0KLQkJaWYgKG1ldGhvZENvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpZiB0aGUgZWxlbWVudCBoYXMgY29udHJpYnV0b3JzIGluIHRoZSBjb25maWd1cmF0aW9uLCBnZXQgdGhlCi0JCS8vIHJlZmVyZW5jZSBwcm9wZXJ0aWVzCi0JCS8vIGlmIGEgY29udHJpYnV0b3IgaGFzIHJlcGxhY2VyLCBpdCdzIHJlcGxhY2VyIGlzIHVzZWQKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29udHJpYnV0b3JzKGVsZW1lbnQsIG1ldGhvZENvbmZpZyk7Ci0JCWlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJTGlzdCB2YWx1ZXMgPSBpbmZvLmdldENvbnRyaWJ1dG9ycygpOwotCQkJCWlmICghdmFsdWVzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCXZhbHVlcy5hZGQoZSk7Ci0JCQkJfQotCQkJCXJlc29sdmVFbGVtZW50VmFyaWFiaWxpdHlMaXN0KGUsIGluZm8sIGZhbHNlLCByZWFsaXplcik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhbiBleHRlbmRlZCBlbGVtZW50LCBnZXQgdGhlIGJhc2UgZWxlbWVudCdzCi0JCS8vIGNvbnRyaWJ1dG9ycwotCQkvLyBOT1RFOiB0aGUgYmFzZSBlbGVtZW50IGl0c2VsZiBzaG91bGQgbm90IGJlIGluY2x1ZGVkIHNpbmNlIGl0J3MKLQkJLy8gYWxyZWFkeSBoYW5kbGVkCi0JCS8vIGluIHRoZSBhY3Rpdml0eSByZWFsaXp0aW9uIGluIEl0ZW1Qcm92aWRlcnMuCi0JCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzRXh0ZW5kZXIoZWxlbWVudCkpIHsKLQkJCU1ldGhvZEVsZW1lbnQgYmFzZSA9IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudChiYXNlLCByZWFsaXplcik7Ci0KLQkJCS8vIGlmIGluY2x1ZGViYXNlIGlzIHRydWUsIGFkZCB0aGUgZWxlbWVudCB0byB0aGUgaW5oZXJpdGFuY2UgbGlzdAotCQkJaWYgKGluY2x1ZGVCYXNlKSB7Ci0JCQkJTGlzdCB2YWx1ZXMgPSBpbmZvLmdldEluaGVyaXRhbmNlTGlzdCgpOwotCQkJCWlmICghdmFsdWVzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCXZhbHVlcy5hZGQoZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZXNvbHZlIHRoZSBiYXNlIHRvIGluY2x1ZGUgYWRkaXRpb25hbCBjb250cmlidXRvcnMgYW5kL29yIGJhc2UKLQkJCXJlc29sdmVFbGVtZW50VmFyaWFiaWxpdHlMaXN0KGUsIGluZm8sIGluY2x1ZGVCYXNlLCByZWFsaXplcik7Ci0KLQkJfQotCi0JfQotCi0JLyoKLQkgKiByZXNvbHZlIHRoZSB2YXJpYWJpbGl0eSBvZiB0aGUgZWxlbWVudCBhbmQgZ2V0IGEgbGlzdCBvZiBjb250cmlidXRvcnMuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgcmVhbGl6aW5nIGFjdGl0aXZ5IGJyZWFrZG93biBlbGVtZW50cyBpbiB0aGUKLQkgKiBpdGVtUHJvdmlkZXJzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yI2dldFZhcmlhYmlsaXR5SW5mbyhvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlJbmZvIGdldFZhcmlhYmlsaXR5SW5mbyhWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQotCQkvLyBjYWxjdWxhdGUgdGhlIGVsZW1lbnQgZmlyc3QKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gbmV3IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnLCB0cnVlLCB0cnVlKTsKLQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5SW5mbyh2ZSwgcmVhbGl6ZXIpOwotCX0KLQotCXByb3RlY3RlZCBWYXJpYWJpbGl0eUluZm8gZ2V0VmFyaWFiaWxpdHlJbmZvKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0KLQkJLy8gY2FsY3VsYXRlIHRoZSBlbGVtZW50IGZpcnN0Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudCh2ZSwgcmVhbGl6ZXIpOwotCi0JCWlmIChlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJVmFyaWFiaWxpdHlJbmZvIGluZm8gPSBuZXcgVmFyaWFiaWxpdHlJbmZvKHZlKTsKLQkJaW5mby5nZXRJbmhlcml0YW5jZUxpc3QoKS5hZGQoZSk7Ci0KLQkJcmVzb2x2ZUVsZW1lbnRWYXJpYWJpbGl0eUxpc3QoZSwgaW5mbywgdHJ1ZSwgcmVhbGl6ZXIpOwotCi0JCXJldHVybiBpbmZvOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IHJlc29sdmUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IG5ldyBEZWZhdWx0RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZywgdHJ1ZSwgdHJ1ZSk7Ci0JCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCgKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQsIHJlYWxpemVyKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgdW5jYXRlZ29yaXplZCB0YXNrcwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IElGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCS8vIDE1ODkyNCAtIHdyb25nIGNhdGVnb3JpZXMgaW4gY29uZmlndXJhdGlvbiB2aWV3Ci0JCQkJLy8gc2hvdWxkIHVzZSB0aGUgZGVmYXVsdCByZWFsaXplcgotCQkJCS8vIHdlIHNob3VsZCBub3QgZGlzY2FyZCB0aGUgZGlzY2lwbGluZSBjb250cmlidXRvcnMgCi0JCQkJLy8gaW5zdGVhZCBzaG91bGQgcmVhbGl6ZSB0byB0aGUgYmFzZSBkaXNjaXBsaW5lCi0JCQkJcmV0dXJuICggb2JqIGluc3RhbmNlb2YgVGFzayApICYmIAotCQkJCQlDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkoVGFzaylvYmosIAotCQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLlRhc2tfRGlzY2lwbGluZXMsIAotCQkJCQkJCW5ldyBEZWZhdWx0RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZykpLmlzRW1wdHkoKTsJCQkJCQotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB3b3JrcHJvZHVjdHMgd2l0aG91dCBhIGRvbWFpbgotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldERvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlcigpewotCQlyZXR1cm4gbmV3IElGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCS8vIDE1ODkyNCAtIHdyb25nIGNhdGVnb3JpZXMgaW4gY29uZmlndXJhdGlvbiB2aWV3Ci0JCQkJLy8gc2hvdWxkIHVzZSB0aGUgZGVmYXVsdCByZWFsaXplcgotCQkJCS8vIHdlIHNob3VsZCBub3QgZGlzY2FyZCB0aGUgZG9tYWluIGNvbnRyaWJ1dG9ycyAKLQkJCQkvLyBpbnN0ZWFkIHNob3VsZCByZWFsaXplIHRvIHRoZSBiYXNlIGRvbWFpbgotCQkJCXJldHVybiAoIG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0ICkgJiYgCi0JCQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQkJCShXb3JrUHJvZHVjdClvYmosIAotCQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X0RvbWFpbnMsIAotCQkJCQkJCW5ldyBEZWZhdWx0RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZykpLmlzRW1wdHkoKTsJCQkJCQotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB3b3JrcHJvZHVjdHMgd2l0aG91dCBhIFdQIFR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRXcFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIoKXsKLQkJcmV0dXJuIG5ldyBJRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkvLyAxNTg5MjQgLSB3cm9uZyBjYXRlZ29yaWVzIGluIGNvbmZpZ3VyYXRpb24gdmlldwotCQkJCS8vIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgcmVhbGl6ZXIKLQkJCQkvLyB3ZSBzaG91bGQgbm90IGRpc2NhcmQgdGhlIFdQVHlwZSBjb250cmlidXRvcnMgCi0JCQkJLy8gaW5zdGVhZCBzaG91bGQgcmVhbGl6ZSB0byB0aGUgYmFzZSAKLQkJCQlyZXR1cm4gKCBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCApICYmIAotCQkJCQlDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkoV29ya1Byb2R1Y3Qpb2JqLCAKLQkJCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9Xb3JrUHJvZHVjdFR5cGVzLCAKLQkJCQkJCQluZXcgRGVmYXVsdEVsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcpKS5pc0VtcHR5KCk7CQkJCQkKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgdW5jYXRlZ29yaXplZCByb2xlcwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFVuY2F0ZWdvcml6ZWRSb2xlRmlsdGVyKCl7Ci0JCXJldHVybiBuZXcgSUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gMTU4OTI0IC0gd3JvbmcgY2F0ZWdvcmllcyBpbiBjb25maWd1cmF0aW9uIHZpZXcKLQkJCQkvLyBzaG91bGQgdXNlIHRoZSBkZWZhdWx0IHJlYWxpemVyCi0JCQkJLy8gd2Ugc2hvdWxkIG5vdCBkaXNjYXJkIHRoZSByb2xlc2V0IGNvbnRyaWJ1dG9ycyAKLQkJCQkvLyBpbnN0ZWFkIHNob3VsZCByZWFsaXplIHRvIHRoZSBiYXNlIAotCQkJCXJldHVybiAoIG9iaiBpbnN0YW5jZW9mIFJvbGUgKSAmJiAKLQkJCQkJQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCQkJKFJvbGUpb2JqLCAKLQkJCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1JvbGVTZXRzLCAKLQkJCQkJCQluZXcgRGVmYXVsdEVsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcpKS5pc0VtcHR5KCk7CQkJCQkKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB1bmNhdGVnb3JpemVkIHRvb2wgbWVudG9ycwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IElGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCS8vIDE1ODkyNCAtIHdyb25nIGNhdGVnb3JpZXMgaW4gY29uZmlndXJhdGlvbiB2aWV3Ci0JCQkJLy8gc2hvdWxkIHVzZSB0aGUgZGVmYXVsdCByZWFsaXplcgotCQkJCS8vIHdlIHNob3VsZCBub3QgZGlzY2FyZCB0aGUgdG9vbCBjb250cmlidXRvcnMgCi0JCQkJLy8gaW5zdGVhZCBzaG91bGQgcmVhbGl6ZSB0byB0aGUgYmFzZSAKLQkJCQlyZXR1cm4gKCBvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yICkgJiYgCi0JCQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQkJCShUb29sTWVudG9yKW9iaiwgCi0JCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuVG9vbE1lbnRvcl9Ub29sLCAKLQkJCQkJCQluZXcgRGVmYXVsdEVsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcpKS5pc0VtcHR5KCk7CQkJCQkKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgZGlzY2lwbGluZXMgYW5kIGRpc3BsaW5lIGdyb3VwaW5ncwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldERpc2NpcGxpbmVzRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IElGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCS8vIFtCdWcgMTYyNjAzXSBOZXc6IFJlcGxhY2luZyBkaXNjaXBsaW5lcyBkbyBhcHBlYXIgaW5zaWRlIHRoZWlyIHJlcGxhY2VkIGVsZW1lbnRzIGRpc2NpcGxpbmUgZ3JvdXBpbmdzIAotCQkJCS8vIGFzIHdlbGwgYXMgb3V0c2lkZSBvZiB0aGUgZGlzY2lwbGluZSBncm91cGluZwotCQkJCWlmICggb2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nICkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuICggb2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSApICYmIAotCQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQkJKE1ldGhvZEVsZW1lbnQpb2JqLCAKLQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLkRpc2NpcGxpbmVfRGlzY2lwbGluZUdyb3VwaW5ncywgCi0JCQkJCQluZXcgRGVmYXVsdEVsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcpKS5pc0VtcHR5KCk7CQkJCQkKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3Igcm9sZXNldHMgYW5kIHJvbGVzZXQgZ3JvdXBpbmdzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0Um9sZVNldHNGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgSUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gW0J1ZyAxNjI2MDNdIE5ldzogUmVwbGFjaW5nIGRpc2NpcGxpbmVzIGRvIGFwcGVhciBpbnNpZGUgdGhlaXIgcmVwbGFjZWQgZWxlbWVudHMgZGlzY2lwbGluZSBncm91cGluZ3MgCi0JCQkJLy8gYXMgd2VsbCBhcyBvdXRzaWRlIG9mIHRoZSBkaXNjaXBsaW5lIGdyb3VwaW5nCi0JCQkJLy8gc2FtZSBmb3Igcm9sZXNldCBncm91cGluZwotCQkJCWlmICggb2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nICkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuICggb2JqIGluc3RhbmNlb2YgUm9sZVNldCApICYmIAotCQkJCQlDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkoTWV0aG9kRWxlbWVudClvYmosIAotCQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLlJvbGVTZXRfUm9sZVNldEdyb3VwcGluZ3MsIAotCQkJCQkJCW5ldyBEZWZhdWx0RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZykpLmlzRW1wdHkoKTsJCQkJCQotCQkJfQotCQl9OwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZmExMjdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkhlbHBlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUiA9ICI8cC8+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBhIENvbnRlbnREZXNjcmlwdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Rlc2NyaXB0aW9uRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCBlbGVtZW50ID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiB8fCBlbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbik7Ci0KLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgbWV0aG9kIHBhY2o9a2FnZSBpcyBhIGdsb2JhbCBwYWNrYWdlCi0JICogCi0JICogQHBhcmFtIHBrZyB7QGxpbmsgTWV0aG9kUGFja2FnZX0KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHbG9iYWxQYWNrYWdlKE1ldGhvZFBhY2thZ2UgcGtnKSB7Ci0JCWlmIChwa2cgPT0gbnVsbCkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIkNvbmZpZ3VyYXRpb25IZWxwZXIuaXNHbG9iYWxQYWNrYWdlOiBtZXRob2QgcGFja2FnZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCU1ldGhvZFBsdWdpbiBwID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBrZyk7Ci0JCWlmIChwID09IG51bGwpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJDb25maWd1cmF0aW9uSGVscGVyLmlzR2xvYmFsUGFja2FnZTogVW5hYmxlIHRvIGZpbmQgbWV0aG9kIHBsdWctaW4gZm9yICIgKyBwa2cuZ2V0TmFtZSgpICsgIjogIiArIHBrZy5nZXRHdWlkKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHApLmNvbnRhaW5zKHBrZyk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGluQ29uZmlnKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXJldHVybiBpbkNvbmZpZyhlbGVtZW50LCBjb25maWcsIHRydWUpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5Db25maWcoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gY2hlY2tTdWJ0cmFjdGVkKSB7Ci0JCWlmICghaXNPd25lclNlbGVjdGVkKGVsZW1lbnQsIGNvbmZpZywgY2hlY2tTdWJ0cmFjdGVkKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYSByZXBhbGNlciwgYW5kIGl0J3MgYmFzZSBlbGVtZW50IGhhcyBtb3JlIHRoYW4gb25lCi0JCS8vIHJlcGxhY2VyCi0JCS8vIG5vbmUgb2YgdGhlIHJlcGxhY2VycyBzaG91bGQgYmUgaW5jbHVkZWQgaW50byB0aGUgY29uZmlndXJhdGlvbgotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLQkJCWlmIChpc1JlcGxhY2VyKHZlKSkgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChpbkNvbmZpZyhiYXNlLCBjb25maWcpKSB7Ci0JCQkJCQotLy8JCQkJCS8vIEludmFsaWQgaG90c3BvdCBjcmVhdGVkIGZvciBsb2NhbGx5IHJlcGxhY2VkIGFjdGl2aXR5IGluIGFjdGl2aXR5IGRpYWdyYW0KLS8vCQkJCQkvLyB0aGlzIGlzIGJlY2F1c2UgdGhlIGFjdGl2aXR5IGhhcyBtb3JlIHRoYW4gb25lIGxvY2FsIHJlcGxhY2VycwotLy8JCQkJCS8vIGluIHZlcnNpb24gNy4wLCBsb2NhbCByZXBsYWNlbWVudCBpcyBtb2RlbGVkIHRoZSBzYW1lIHdheSBhcyBub21hbCByZXBsYWNlbWVudAotLy8JCQkJCS8vIHdlIG5lZWQgdG8gaWdub3JlIHRoaXMgY2hlY2tpbmcgZm9yIGFjdGl2aXR5Ci0vLwkJCQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkgKSB7Ci0vLwkJCQkJCXJldHVybiB0cnVlOwotLy8JCQkJCX0KLQkJCQkJCi0JCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoCi0JCQkJCQkJYmFzZSkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAoKGUgIT0gZWxlbWVudCkKLQkJCQkJCQkJJiYgKGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpCi0JCQkJCQkJCSYmIGlzT3duZXJTZWxlY3RlZChlLCBjb25maWcsIGNoZWNrU3VidHJhY3RlZCkpIHsKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCS5wcmludGxuKCJDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnOiBJZ25vcmluZyByZXBsYWNpbmcgZWxlbWVudCAnIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIicgc2luY2UgaXRzIGJhc2UgZWxlbWVudCBoYXMgbW9yZSB0aGFuIG9uZSByZXBsYWNlciBpbiB0aGUgY29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gYmFzZSBtdXN0IGJlIGluIHRoZSBjb25maWd1cmF0aW9uCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc093bmVyU2VsZWN0ZWQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gY2hlY2tTdWJ0cmFjdGVkKSB7Ci0JCWlmIChDb25maWd1cmF0aW9uRGF0YS5hY3RpdmUpIHsKLQkJCXJldHVybiBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlnKQotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRGF0YSgpCi0JCQkJCQkJCS5pc093bmVyU2VsZWN0ZWQoZWxlbWVudCwgY2hlY2tTdWJ0cmFjdGVkKTsKLQkJfQotCQkJCQotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoY29uZmlnID09IG51bGwgfHwgaXNEZXNjcmlwdGlvbkVsZW1lbnQoZWxlbWVudCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gc2luY2UgVU1BIDEuMC40LCBjb25maWd1cmF0aW9uIGNhbiBoYXZlIGFkZGVkIGNhdGVnb3JpZXMgCi0JCS8vIGFuZCBzdWJ0cmFjdGVkIGNhdGVnb3JpZXMuIFRoZSBvcmRlciBvZiBmaWx0ZXJpbmcgaXM6Ci0JCS8vIDEuIGFueSBlbGVtZW50IGluIHRoZSBzdWJ0cmFjdGVkIGNhdGVnb3JpZXMgc2hvdWxkIGJlIGV4Y2x1ZGVkCi0JCS8vIDIuIGFueSBlbGVtZW50IGluIHRoZSBhZGRlZCBjYXRlZ29yaWVzIHNob3VsZCBiZSBpbmNsdWRlZAotCQkvLyAzLiBhbnkgZWxlbWVudCBub3QgaW4gdGhlIHNlbGVjdGVkIHBhY2thZ2Ugb3IgcGx1Z2luIHNob3VsZCBiZSBleGNsdWRlZC4KLQkJCi0JCWlmICggY2hlY2tTdWJ0cmFjdGVkICkgewotCQkJLy8gZmlyc3QgY2hlY2sgc3VidHJhY3RlZCBlbGVtZW50cwotCQkJTGlzdCBzdWJ0cmFjdGVkQ2F0ZWdvcmllcyA9IGNvbmZpZy5nZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQkJCWlmICggc3VidHJhY3RlZENhdGVnb3JpZXMuc2l6ZSgpID4gMCApIHsKLQkJCQlmb3IgKCBJdGVyYXRvciBpdCA9IHN1YnRyYWN0ZWRDYXRlZ29yaWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJCUNvbnRlbnRDYXRlZ29yeSBjYyA9IChDb250ZW50Q2F0ZWdvcnkpaXQubmV4dCgpOwotCQkJCQlpZiAoIGNjID09IGVsZW1lbnQgKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIG5lZWQgdG8gY2hlY2sgYWxsIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMgYW5kIHN1Yi1jYXRlZ29yaWVzCi0JCQkJCS8vIHdlIG5lZWQgdG8gaGF2ZSBhbiBlZmZpY2llbnQgYWxnb3JpdGhtIGZvciB0aGlzIGNoZWNraW5nLgotCQkJCQkvLyBmb3Igbm93LCBvbmx5IGNoZWNrIHRoZSBjdXN0b20gY2F0ZWdvcnkncyBjYXRlZ29yaXNlZCBlbGVtZW50cwotCQkJCQkvLyBUT0RPLiBKaW5odWEgWGksIDExLzI3LzIwMDYKLQkJCQkJaWYgKCBjYyBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5ICkgewotCQkJCQkJaWYgKCAoKEN1c3RvbUNhdGVnb3J5KWNjKS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuY29udGFpbnMoZWxlbWVudCkgKSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gVE9ETywgbm90IGltcGxlbWVudGVkIHlldAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUT0RPLCBpc093bmVyU2VsZWN0ZWQ6IG5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gdGhlbiBjaGVjayBhZGRlZCBjYXRlZ29yaWVzCi0JCS8vIFRPRE8KLQkJCi0JCS8vIGVsZW1lbnRzIGJleW9uZCBjb25maWd1cmF0aW9uIHNjb3BlIHNob3VsZCBiZSBhbHdheXMgdmlzaWJsZQotCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KQotCQkJCXx8IChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJCXJldHVybiAocGx1Z2lucyAhPSBudWxsKSAmJiBwbHVnaW5zLmNvbnRhaW5zKGVsZW1lbnQpOwotCQl9IGVsc2UgewotCQkJLy8gaWYgdGhlIG93bmVycHJvY2VzcyBjYW4ndCBzaG93LCBjYW4ndCBhY2NlcHQKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSAoKEFjdGl2aXR5KSBlbGVtZW50KQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZiAoYmFzZSAhPSBudWxsICYmIGJhc2UgIT0gZWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IG93bmluZ1Byb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYmFzZSk7Ci0JCQkJCWlmICggb3duaW5nUHJvYyAhPSBudWxsICYmIG93bmluZ1Byb2MgIT0gZWxlbWVudCAKLQkJCQkJCQkmJiAhaW5Db25maWcob3duaW5nUHJvYywgY29uZmlnLCBjaGVja1N1YnRyYWN0ZWQpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUVPYmplY3QgcGtnID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlbGVtZW50KTsKLQotCQkJLy8gYWNjZXB0IGdsb2JhbCBwYWNrYWdlIGlmIHRoZSBwbHVnaW4gaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkJCWlmIChwa2cgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJCSYmIGlzR2xvYmFsUGFja2FnZSgoTWV0aG9kUGFja2FnZSkgcGtnKSkgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJCQlyZXR1cm4gaW5Db25maWcocGx1Z2luLCBjb25maWcsIGNoZWNrU3VidHJhY3RlZCk7Ci0JCQl9Ci0KLQkJCUxpc3QgcGtncyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQlpZiAocGtncyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvLyBwZXIgUGhvbmcncyByZXF1ZXN0LCBmb3IgUHJvY2Vzc1BhY2thZ2UsIGNoZWNrIHRoZQotCQkJLy8gUHJvY2Vzc0NvbXBvbmVudCBwYXJlbnQgaW5zdGVhZAotCQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJd2hpbGUgKChwa2cgIT0gbnVsbCkgJiYgIShwa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KQotCQkJCQkJJiYgIXBrZ3MuY29udGFpbnMocGtnKSkgewotCQkJCQlwa2cgPSBwa2cuZUNvbnRhaW5lcigpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaWYgcGFja2FnZSBub3Qgc2VsZWN0ZWQsIHJldHVybiBmYWxzZQotCQkJaWYgKChwa2cgPT0gbnVsbCkgfHwgIXBrZ3MuY29udGFpbnMocGtnKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpcyB0aGUgZWxlbWVudCBhIGNvbnRyaWJ1dG9yPwotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udHJpYnV0b3IoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMOwotCX0KLQotCS8qKgotCSAqIGlzIHRoZSBlbGVtZW50IGEgcmVwbGFjZXI/Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZXBsYWNlcihWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUw7Ci0JfQotCi0JLyoqCi0JICogaXMgdGhlIGVsZW1lbnQgYSBleHRlbmQtcmVwbGFjZXI/Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRSZXBsYWNlcihWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfUkVQTEFDRVNfTElURVJBTDsKLQl9Ci0JCi0JLyoqCi0JICogaXMgdGhlIGVsZW1lbnQgYW4gZXh0ZW5kZXI/Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRlcihWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHJlcGxhY2VyIG9mIHRoZSBlbGVtZW50IGluIHRoZSBjb25maWd1cmF0aW9uLiBPbmx5IG9uZSByZXBsYWNlcgotCSAqIGlzIGFsbG93ZWQuIElmIG1vcmUgdGhhbiBvbmUgcmVwbGFjZXIgaXMgZm91bmQsIHRoZW4gbm9uZSBvZiB0aGVtIHdpbGwgYmUKLQkgKiByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgVmFyaWFiaWxpdHlFbGVtZW50IHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gVmFyaWFiaWxpdHlFbGVtZW50IHRoZSByZXBsYWNlciBpZiB0aGVyZSBpcyBvbmUgYW5kIE9OTFkgb25lLAotCSAqICAgICAgICAgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhcmlhYmlsaXR5RWxlbWVudCBnZXRSZXBsYWNlcihWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IG51bGw7Ci0KLQkJLy8gdGhpcyB3aWxsIGdldCBhbGwgcmVwbGFjZXJzIHJlY3Vyc2l2ZWx5LiB3ZSBvbmx5IG5lZWQgdGhlIGltbWVkaWF0ZQotCQkvLyBvbmVzCi0JCS8vIGZvcihJdGVyYXRvciBpdGVyYXRvciA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKGVsZW1lbnQsCi0JCS8vIFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLQkJZm9yIChJdGVyYXRvciBpdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcyhlbGVtZW50KQotCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCWlmICggZSA9PSBudWxsIHx8ICFpbkNvbmZpZyhlLCBjb25maWcpICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlpZiAoIHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwgCi0JCQkJCXx8IHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfUkVQTEFDRVNfTElURVJBTCkgewotCQkJCWlmICh2ZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcjogUmVwbGFjZXIgaWdub3JlZCBmb3IgZWxlbWVudCAnIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIicgc2luY2UgaXQgaGFzIG1vcmUgdGhhbiBvbmUgcmVwbGFjZXJpbiB0aGUgY29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsgLy8gaWYgbW9yZSB0aGFuIG9uZSByZXBsYWNlciwgcmV0dXJuIG51bGwKLQkJCQl9Ci0KLQkJCQl2ZSA9IGU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdmU7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBpbW1lZGlhdGUgY29udHJpYnV0b3JzIG9mIHRoZSBlbGVtZW50IHdpdGhpbiB0aGUgY29uZmlndXJhdGlvbi4KLQkgKiBJZiBhIGNvbnRyaWJ1dG9yIGhhcyBpbW1lZGlhdGUgcmVwbGFjZXIsIGl0IGlzIHJlcGFsY2VkIHdpdGggdGhlIHJlcGxhY2VyCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDb250cmlidXRvcnMoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIGl0ZW1zOwotCQl9Ci0JCQotCQkvLyBUaGlzIG1ldGhvZCBnZXQgYWxsIGNvbnRyaWJ1dG9ycyByZWN1cnNpdmVseSwKLQkJLy8gd2Ugb25seSBuZWVkIHRoZSBmaXJzdCBsZXZlbAotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gVG5nVXRpbC5nZXRDb250cmlidXRvcnMoZWxlbWVudCk7IGl0Lmhhc05leHQoKTsgKQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGVsZW1lbnQpCi0JCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKChlICE9IG51bGwpCi0JCQkJCSYmIChlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMKQotCQkJCQkmJiBpbkNvbmZpZyhlLCBjb25maWcpKSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHJlcGxhY2VyID0gZ2V0UmVwbGFjZXIoZSwgY29uZmlnKTsKLQkJCQlpZiAocmVwbGFjZXIgIT0gbnVsbCkgewotCQkJCQlpdGVtcy5hZGQocmVwbGFjZXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWl0ZW1zLmFkZChlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblNob3coTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGNhblNob3coZWxlbWVudCxjb25maWcsIHRydWUpOwotCX0KLQkKLQotCS8qKgotCSAqIGVsZW1lbnQgY2FuJ3Qgc2hvdyBpbiB0aGUgY29uZmlndXJhdGlvbiB0cmVlIGlmIDEuIHRoZSBlbGVtZW50IGlzIG5vdCBpbgotCSAqIHRoZSBjb25maWd1cmF0aW9uIDIuIHRoZSBlbGVtZW50IGlzIGEgY29udHJpYnV0aW9uIHRvIGFub3RoZXIgZWxlbWVudCAzLgotCSAqIGlmIHRoZSBlbGVtZW50IGlzIGEgcmVwbGFjZXIgdG8gYSAzLiB0aGUgZWxlbWVudCBoYXMgYSByZXBsYWNlbWVudAotCSAqIGVsZW1lbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuU2hvdyhNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBjaGVja1N1YnRyYWN0ZWQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFpbkNvbmZpZyhlbGVtZW50LCBjb25maWcsIGNoZWNrU3VidHJhY3RlZCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0vLwkJLy8gaWYgaXQ7cyBhbiBhY3Rpdml0eSwgcmV0dXJuIHNpbmNlIGNvbnRyaWJ1dG9ycyBhcmUgbG9jYWwgY29udHJpYnV0aW9uIGFuZCBuZWVkcyB0byBiZSBzaG93bgotLy8JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJcmV0dXJuIHRydWU7Ci0vLwkJfQotCi0vLwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8JCS8vIHRoaXMgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSBzaW5jZSB0aGUgc3VwcHJlc3Npb24gc3RhdGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWN0aXZpdHkgYWRhcHRvciBmYWN0b3J5Ci0vLwkJLy8ganVzdCBsZWF2ZSBpdCBoZXJlIGZvciBub3cgc2luY2UgaXQgZG9lcyBub3QgaHVydC4gdGFrZSBpdCBhd2F5IGluIG5leHQgcmVsZWFzZQotLy8JCUJvb2xlYW4gc3VwcmVzc2VkID0gZWxlbWVudC5nZXRTdXBwcmVzc2VkKCk7Ci0vLwkJaWYgKHN1cHJlc3NlZCAhPSBudWxsICYmIHN1cHJlc3NlZC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLQotCQkJLy8gaWYgdGhpcyBpcyBhbiBleHRlbmRlciwgYWx3YXlzIHNob3csIGV2ZW4gdGhvdWdoIGl0IGV4dGVuZHMgYQotCQkJLy8gY29udHJpYnV0b3IKLQkJCWlmIChpc0V4dGVuZGVyKGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChpc0NvbnRyaWJ1dG9yKGUpIHx8IGdldFJlcGxhY2VyKGUsIGNvbmZpZykgIT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLy8gZm9yIGFjdGl2aXR5LCBkb24ndCBzaG93IHRoZSBvbmVzIHRoYXQgY29udGFpbnMgY29udHJpYnV0b3JzCi0JCQkvLyBKaW5odWEgWGksIDA3LzE0LzA2Ci0JCQlpZiAoIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpICYmIGhhc0NvbnRyaWJ1dG9yKChBY3Rpdml0eSllKSApIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCXdoaWxlICgoZSAhPSBudWxsKSAmJiBpc1JlcGxhY2VyKGUpKSB7Ci0JCQkJZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChpc0NvbnRyaWJ1dG9yKGUpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIDEuIGlmIGl0J3MgYQotCSAqIGNvbnRyaWJ1dG9yLCBzaG93IHRoZSBuYW1lIG9mIHRoZSBiYXNlIGVsZW1lbnQgMi4gaWYgaXQgaGFzIGEKLQkgKiByZXBsYWNlbWVuZXQsIHNob3cgdGhlIG5hbWUgb2YgdGhlIHJlcGxhY2VtZW50IGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLQkJCWlmIChpc0NvbnRyaWJ1dG9yKGUpKSB7Ci0JCQkJcmV0dXJuIGdldE5hbWUoZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIGNvbmZpZyk7Ci0JCQl9IGVsc2UgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCByZXAgPSBnZXRSZXBsYWNlcihlLCBjb25maWcpOwotCQkJCWlmIChyZXAgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZ2V0TmFtZShyZXAsIGNvbmZpZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcHJlc2VudGF0aW9uIG5hbWUgZm9yIGFuIGVsZW1lbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoCi0JCQkJZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCBjb25maWcpOwotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJbmFtZSA9IFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdmFyaWFiaWxpdHkgZWxlbWVudCBvd25lci4gSWYgdGhlIGVsZW1lbnQgaXMgYQotCSAqIFZhcmlhYmlsaXR5RWxlbWVudCwgcmV0dXJuIGl0c2VsZiBvdGhlcndpc2UsIGZpbmQgaXQncyBvd25lci4gRm9yCi0JICogZXhhbXBsZSwgYSBDb250ZW50RGVzY3Jpb3Rpb24gb2JqZWN0IGlzIG93bmVyZWQgYnkgYSBWYXJpYWJpbGl0eUVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gVmFyaWFiaWxpdHlFbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0VmFyaWFibGVPd25lcihNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCXJldHVybiAoVmFyaWFiaWxpdHlFbGVtZW50KSBlOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCS8vIHJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRPd25lciggKENvbnRlbnREZXNjcmlwdGlvbillICk7Ci0JCQlFT2JqZWN0IGVPYmogPSBlLmVDb250YWluZXIoKTsKLQkJCWlmIChlT2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIChWYXJpYWJpbGl0eUVsZW1lbnQpIGVPYmo7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZmVhdHVyZSB2YWx1ZSBpcyBtZXJnYWJsZSBvciBub3QKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01lcmdhYmxlQXR0cmlidXRlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmICghZmVhdHVyZS5nZXRFVHlwZSgpLmdldEluc3RhbmNlQ2xhc3NOYW1lKCkuZXF1YWxzKAotCQkJCSJqYXZhLmxhbmcuU3RyaW5nIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gZmVhdHVyZSBpZCBpcyBub3QgZ2xvYmFsbHkgdW5pcXVlLCBjYW4ndCBkbyBhIHN3aXRjaCBoZXJlCi0JCS8vIGNvbXBhcmUgdGhlIGFjdHVyZSBmZWF0cnVlIGluc3RlYWQKLQkJLyoKLQkJICogc3dpdGNoICggZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSApIHsgY2FzZQotCQkgKiBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlEOiBjYXNlCi0JCSAqIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCSAqIENvbnRyaWJ1dGluZyBhIFVuaXF1ZSBJRCBmb3Igd29yayBwcm9kdWN0IHJlbmRlcnMKLQkJICogYmFkIGh0bWwgLy8gZG9uJ3QgbWVyZ2UgVW5pcXVlIElEOiBjYXNlCi0JCSAqIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDogcmV0dXJuIGZhbHNlOyB9Ci0JCSAqLwotCi0JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfR3VpZCgpCi0JCQkJfHwgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpCi0JCQkJfHwgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpIAotCQkJCXx8IGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogaXMgYXR0cmlidXRlIGZlYXR1cmUgdmFsdWU/Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiAoZmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSk7Ci0JfQotCQotCS8qKgotCSAqIGlzIHRoaXMgYSB0by1vbmUgZmVhdHVyZT8KLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpczAxRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gKGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVDbGFzcykgJiYgIWZlYXR1cmUuaXNNYW55KCk7Ci0JfQotCi0JLyoqCi0JICogaXMgdGhpcyBhIHRvLW1hbnkgZmVhdHVyZT8KLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpczBuRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gKGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVDbGFzcykgJiYgZmVhdHVyZS5pc01hbnkoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhbmQgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlcwotCSAqICAgICAgICAgICAgVGhlIExpc3Qgb2YgdmFsdWVzIG9mIHRoZSBmZWF0dXJlLiBpZiB0aGUgZmVhdHVyZSBpcyBhIDAuLjEKLQkgKiAgICAgICAgICAgIGFzc29jaWF0aW9uLCB0aGUgTGlzdCBob2xkcyBhIHNpbmdsZSB2YWx1ZSBpZiBhbnkgZm9yCi0JICogICAgICAgICAgICByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLCBpdCdzIGEgbGlzdCBvZiByZWZlcmVuY2VzIGZvcgotCSAqICAgICAgICAgICAgYXR0cmlidXRlIGZlYXR1cmUsIGl0J3MgYSBsaXN0IG9mIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYmUKLQkgKiAgICAgICAgICAgIG1lcmdlcmVkIGZvciAwLi4xIGFzc29jaWF0aW9uLCB0aGUgbGlzdCBtYXkgY29udGFpbiAxIHZhbHVlLgotCSAqLwotLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYWxjdWxhdGVGZWF0dXJlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLS8vCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotLy8JCQlMaXN0IHZhbHVlcywgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0vLwkJY2FsY3VsYXRlRmVhdHVyZShlbGVtZW50LCBudWxsLCBmZWF0dXJlLCBjb25maWcsIHZhbHVlcywgcmVhbGl6ZXIpOwotLy8JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYWxjdWxhdGVGZWF0dXJlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgT3duZXJFbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBGZWF0dXJlVmFsdWUgdmFsdWVzLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB0aGlzIGlzIGEgdmFsaWQgZmVhdHVyZSAKLQkJLy8gZm9yIGV4YW1wbGUsIGlmIGFuIGFjdGl2aXR5IGNvbnRyaWJ1dGVzIHRvIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuLAotCQkvLyBzb21lIENhcGFiaWxpdHlQYXR0ZXJuIHNwZWNpZmljIGZlYXR1cmUgbWF5IG5vdCBiZSBhIHZhbGlkIGZlYXR1cmUgZm9yIHRoZSBBY3Rpdml0eQotCQlMaXN0IGZlYXR1cmVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKCAhZmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIEVDbGFzc2lmaWVyIHR5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGdldFZhcmlhYmxlT3duZXIoKE93bmVyRWxlbWVudCA9PSBudWxsKSA/IGVsZW1lbnQKLQkJCQk6IE93bmVyRWxlbWVudCk7Ci0KLQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCi0JCXZhbHVlcy5hZGQodmUsIHZhbHVlKTsKLS8vCQlpZiAoaXMwbkZlYXR1cmUoZmVhdHVyZSkpIHsKLS8vCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotLy8JCQkJZm9yIChJdGVyYXRvciBpdCA9ICgoTGlzdCkgdmFsdWUpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLS8vCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotLy8JCQkJCS8vIE1ldGhvZEVsZW1lbnQgY2UgPSBnZXRDYWxjdWxhdGVkRWxlbWVudChlLCBjb25maWcsCi0vLwkJCQkJLy8gcmVzb2x2ZUNvbnRyaWJ1dG9yKTsKLS8vCQkJCQlNZXRob2RFbGVtZW50IGNlID0gcmVhbGl6ZXIucmVhbGl6ZShlKTsKLS8vCi0vLwkJCQkJLy8gY2FsY3VsYXRlZCBlbGVtZW50IGNhbiBiZSBudWxsIGlmIGl0IGNhbid0IHNob3cKLS8vCQkJCQlpZiAoY2UgIT0gbnVsbCAmJiAhdmFsdWVzLmNvbnRhaW5zKGNlKSkgewotLy8JCQkJCQl2YWx1ZXMuYWRkKGNlKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHsKLS8vCQkJaWYgKGlzMDFGZWF0dXJlKGZlYXR1cmUpKSB7Ci0vLwkJCQkvLyBSdWxlOiBPdXRnb2ludCB0by1vbmUgYXNzb2NpYXRpb25zIG9mIGNvbnRyaWJ1dG9yIHdpbGwgYmUKLS8vCQkJCS8vIGlnbm9yZWQKLS8vCQkJCS8vIGlmIHRoZSBiYXNlIGFscmVhZHkgaGFzIHN1Y2ggYW4gYXNzb2NpYXRpb24KLS8vCQkJCS8vIHF1ZXN0aW9uOiBob3cgYWJvdXQgbW9yZSB0aGFuIG9uZSBjb250cmlidXRvcnMgd2l0aCB0aGUgc2FtZQotLy8JCQkJLy8gYXNzb2NpYXRpb25zPwotLy8JCQkJLy8gcGljayB0aGUgZmlyc3Qgb25lPwotLy8JCQkJaWYgKGlzQ29udHJpYnV0b3IodmUpKSB7Ci0vLwkJCQkJLy8gbm8gc3VjaCBhc3NvY2lhdGlvbiBpbiB0aGUgYmFzZSwgdGhlbiBhZGQgdGhpcyBvbmUKLS8vCQkJCQkvLyBpZiBhbHJlYWR5IGhhdmUsIG1heWJlIGZyb20gYW5vdGhlciBjb250cmlidXRvciwgaWdub3JlCi0vLwkJCQkJLy8gdGhlIHJlc3QKLS8vCQkJCQlpZiAodmFsdWVzLnNpemUoKSA9PSAwKSB7Ci0vLwkJCQkJCXZhbHVlcy5hZGQodmFsdWUpOwotLy8JCQkJCX0KLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJdmFsdWVzLmNsZWFyKCk7Ci0vLwkJCQkJdmFsdWVzLmFkZCh2YWx1ZSk7Ci0vLwkJCQl9Ci0vLwkJCX0gZWxzZSB7Ci0vLwkJCQkvLyBhdHRyaWJ1dGUgbWVyZ2UKLS8vCQkJCWlmICghKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotLy8JCQkJCQl8fCB2YWx1ZS50b1N0cmluZygpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLS8vCQkJCQl2YWx1ZXMuYWRkKG5ldyBGZWF0dXJlVmFsdWUoZWxlbWVudCwgdmFsdWUpKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQotCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHJlYWxpemUgdGhlIHZhcmlhYmlsaXR5IHJlbGF0aW9uc2hpcAotCQlpZiAodmUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLS8vCQlpZiAoKHZlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpCi0vLwkJCQkmJiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotLy8JCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCkpKSB7Ci0vLwkJCW9yZGVyU2VjdGlvbnMoKENvbnRlbnRFbGVtZW50KSB2ZSwgdmFsdWVzKTsKLS8vCQl9Ci0KLS8vCQkvLyBpZiBtZXJnYWJsZSBmZWF0dXJlCi0vLwkJLy8gcHJlc2VudGF0aW9uIG5hbWUgZG9lc24ndCB0YWtlIGNvbnRyaWJ1dGlvbgotLy8JCS8vIFByb2Nlc3NlczogQ29udHJpYnV0aW9uIG9uIGV4dGVuZGVkIGFjdGl2aXR5IGlzIHVwZGF0aW5nIGJhc2UgYWN0aXZpdHkncyBwcm9wZXJ0aWVzCi0vLwkJLy8gYWN0aXZpdHkgY29udHJpYnV0aW9uIGlzIGEgbG9jYWwgY29udHJpYnV0aW9uIGJhc2VkIG9uIGV4dGVuZAotLy8JCS8vIHNob3VsZCBub3QgYmUgdHJlYXRlZCBhcyBjb250cmlidXRvciwgCi0vLwkJYm9vbGVhbiBtZXJnZWFibGUgPSAhKChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIAotLy8JCQkJfHwgKE93bmVyRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSAmJiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgCi0vLwkJCQl8fCAoZWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkpOwotCQkKLQkJYm9vbGVhbiBtZXJnZWFibGUgPSB0cnVlOwotCQlpZiAoIGlzQXR0cmlidXRlRmVhdHVyZShmZWF0dXJlKSAmJiAhaXNNZXJnYWJsZUF0dHJpYnV0ZShmZWF0dXJlKSApIHsKLQkJCW1lcmdlYWJsZSA9IGZhbHNlOwotCQl9IAotCQkKLQkJaWYgKCBtZXJnZWFibGUgKSB7Ci0JCQkvLyBpZiB0aGUgZWxlbWVudCBoYXMgY29udHJpYnV0b3JzIGluIHRoZSBjb25maWd1cmF0aW9uLCBnZXQgdGhlCi0JCQkvLyByZWZlcmVuY2UgcHJvcGVydGllcwotCQkJLy8gaWYgYSBjb250cmlidXRvciBoYXMgcmVwbGFjZXIsIGl0J3MgcmVwbGFjZXIgaXMgdXNlZAotCQkJTGlzdCBpdGVtcyA9IGdldENvbnRyaWJ1dG9ycyh2ZSwgY29uZmlnKTsKLQkJCWlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCQlNZXRob2RFbGVtZW50IG8gPSBlOyAgLy8gdGhlIG93bmVyCi0KLQkJCQkJLy8gaWYgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBhIGRlc2NyaXB0aW9uLAotCQkJCQkvLyBnZXQgdGhlIHRoZSBkZXNjcmlwdGlvbiBvYmplY3Qgb2YgdGhlIGNvbnRyaWJ1dG9yCi0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkJCQllID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGUpLmdldFByZXNlbnRhdGlvbigpOwotCQkJCQl9Ci0JCQkJCWNhbGN1bGF0ZUZlYXR1cmUoZSwgbywgZmVhdHVyZSwgY29uZmlnLCB2YWx1ZXMsIHJlYWxpemVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhbiBleHRlbmRlZCBlbGVtZW50LCBnZXQgdGhlIGJhc2UgZWxlbWVudCdzCi0JCS8vIHByb3BlcnRpZXMgaWYgbmVlZGVkCi0JCWJvb2xlYW4gZXh0ZW5kUmVwbGFjZSA9IGlzRXh0ZW5kUmVwbGFjZXIodmUpIHx8IAotCQkJCUVsZW1lbnRSZWFsaXplci5pc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkgJiYgaXNSZXBsYWNlcih2ZSk7Ci0JCWJvb2xlYW4gaXNFeHRlbmRlciA9IGlzRXh0ZW5kZXIodmUpOwotCQkKLQkJaWYgKGlzRXh0ZW5kZXIgfHwgZXh0ZW5kUmVwbGFjZSkgewotCQkJYm9vbGVhbiBtZXJnZWJhc2UgPSBmYWxzZTsKLQkJCWlmIChpczBuRmVhdHVyZShmZWF0dXJlKSkgewotCQkJCW1lcmdlYmFzZSA9IHRydWU7Ci0JCQkJaWYgKCBleHRlbmRSZXBsYWNlIAotCQkJCQkJfHwgaXNFeHRlbmRlciAmJiBFbGVtZW50UmVhbGl6ZXIuaWdub3JlQmFzZVRvTWFueUFzc29jaWF0aW9ucygpKSB7Ci0JCQkJCW1lcmdlYmFzZSA9ICh2YWx1ZXMuc2l6ZSgpID09IDApOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoaXMwMUZlYXR1cmUoZmVhdHVyZSkpIHsKLQkJCQltZXJnZWJhc2UgPSAodmFsdWVzLnNpemUoKSA9PSAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVyZ2ViYXNlID0gKGlzTWVyZ2FibGVBdHRyaWJ1dGUoZmVhdHVyZSkgJiYgKHZhbHVlcy5zaXplKCkgPT0gMCkpOwotCQkJfQotCi0JCQlpZiAobWVyZ2ViYXNlKSB7Ci0JCQkJLy8gQXV0aG9yaW5nOiBFeHRlbmRpbmcgYSBiYXNlIHRoYXQgaGFzIGJlZW4KLQkJCQkvLyByZXBsYWNlZCwgZG9lcyBub3QgZXh0ZW5kIHRoZSByZXBsYWNlbWVudAotCQkJCS8vIG5lZWQgdG8gZ2V0IHRoZSByZWFsaXplZCBlbGVtZW50LAotCQkJCS8vIHRoZSBiYXNlIGVsZW1lbnQgbWlnaHQgYmUgcmVwbGFjZWQgYnkgYW5vdGhlciBvbmUsCi0JCQkJLy8gb3IgbWlnaHQgYmUgYSBjb250cmlidXRvciB0byBhbm90aGVyIGJhc2UKLQkJCQlNZXRob2RFbGVtZW50IGUgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKCAhZXh0ZW5kUmVwbGFjZSApIHsKLQkJCQkJZT0gZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoZSwgY29uZmlnKTsKLQkJCQl9CQkJCQkKLQkJCQlNZXRob2RFbGVtZW50IG8gPSBlOwotCi0JCQkJLy8gaWYgaXQncyBhIGNvbnRhaW5tZW50IGZlYXR1cmUsIHN1Y2ggYXMgc3ViLWFydGlmYWN0cwotCQkJCS8vIHRoZSBiYXNlIHNob3VsZCBub3QgYmUgdGhlIGNvbnRhaW5lcgotCQkJCS8vIDE2MjE1NCAtIENoZWNrIGNpcmN1bGFyIHJlZmVyZW5jZXMgd2l0aCBwYXJlbnQtL3N1Yi1hcnRpZmFjdHMgYW5kIHByYWN0aWNlcy9zdWItcHJhY3RpY2VzCQkJCQotCQkJCWlmICggaXNDb250YWlubWVudEZlYXR1cmUoZmVhdHVyZSkgKSB7Ci0JCQkJCUxpc3QgY29udGFpbmVycyA9IGdldENvbnRhaW5lcnModmUsIGNvbmZpZyk7Ci0JCQkJCWlmIChjb250YWluZXJzLmNvbnRhaW5zKGUpICkgewotCQkJCQkJbWVyZ2ViYXNlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAobWVyZ2ViYXNlICYmICh2ZSAhPSBlKSAmJiBpbkNvbmZpZyhlLCBjb25maWcpKSB7Ci0JCQkJCS8vIGlmIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgYSBkZXNjcmlwdGlvbiwKLQkJCQkJLy8gZ2V0IHRoZSB0aGUgZGVzY3JpcHRpb24gb2JqZWN0IG9mIHRoZSBiYXNlCi0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZSkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWNhbGN1bGF0ZUZlYXR1cmUoZSwgbywgZmVhdHVyZSwgY29uZmlnLCB2YWx1ZXMsIHJlYWxpemVyKTsKLQotCQkJCQkvLyBmb3IgZXh0ZW5kZXIsIHdlIG5lZWQgdG8gcmUtc29ydCB0aGUgc3RlcHMgYmFzZWQgb24gdGhlCi0JCQkJCS8vIGV4dGVuZGVyIGRlZmluZWQgb3JkZXIKLQkJCQkJaWYgKCh2ZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KQotCQkJCQkJCSYmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCkpKSB7Ci0JCQkJCQlvcmRlclNlY3Rpb25zKChDb250ZW50RWxlbWVudCkgdmUsIChMaXN0KXZhbHVlcy5nZXRWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQotCX0KLQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgcmVmbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCBPcHBvc2l0ZUZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBPcHBvc2l0ZUZlYXR1cmUKLQkgKiBAcGFyYW0gcmVhbGl6ZXIgRWxlbWVudFJlYWxpemVyCi0JICogQHBhcmFtIHZhbHVlcwotCSAqICAgICAgICAgICAgVGhlIExpc3Qgb2YgdmFsdWVzIG9mIHRoZSBmZWF0dXJlLiBmb3IgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZSwKLQkgKiAgICAgICAgICAgIGl0J3MgYSBsaXN0IG9mIHJlZmVyZW5jZXMgZm9yIGF0dHJpYnV0ZSBmZWF0dXJlLCBpdCdzIGEgbGlzdAotCSAqICAgICAgICAgICAgb2YgYXR0cmlidXRlIHZhbHVlcyB0byBiZSBtZXJnZXJlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIsIEZlYXR1cmVWYWx1ZSB2YWx1ZXMpIHsKLQkJY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKGVsZW1lbnQsIGZlYXR1cmUsIHRydWUsIGZhbHNlLCByZWFsaXplciwgdmFsdWVzKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSByZWZsaXN0IGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIE9wcG9zaXRlRmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIE9wcG9zaXRlRmVhdHVyZQotCSAqIEBwYXJhbSByZWFsaXplciBFbGVtZW50UmVhbGl6ZXIKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICBUaGUgTGlzdCBvZiB2YWx1ZXMgb2YgdGhlIGZlYXR1cmUuIGZvciByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLAotCSAqICAgICAgICAgICAgaXQncyBhIGxpc3Qgb2YgcmVmZXJlbmNlcyBmb3IgYXR0cmlidXRlIGZlYXR1cmUsIGl0J3MgYSBsaXN0Ci0JICogICAgICAgICAgICBvZiBhdHRyaWJ1dGUgdmFsdWVzIHRvIGJlIG1lcmdlcmVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIGJvb2xlYW4gbWVyZ2VSZXBsYWNlckJhc2UsIGJvb2xlYW4gbWVyZ2VFeHRlbmRlckJhc2UsIAotCQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyLCBGZWF0dXJlVmFsdWUgdmFsdWVzKSB7Ci0JCS8vIG11c3QgYmUgYSBNdWx0aVJlc291cmNlRU9iamVjdAotCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTXVsdGlSZXNvdXJjZUVPYmplY3QpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKTsKLQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBnZXRWYXJpYWJsZU93bmVyKGVsZW1lbnQpOwotCi0JCU9iamVjdCB2YWx1ZSA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKGZlYXR1cmUpOwotCQl2YWx1ZXMuYWRkKHZlLCB2YWx1ZSk7Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgJiYgY29uZmlnICE9IG51bGwpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBjZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQ7Ci0KLQkJCS8vIGlmIHRoZSBlbGVtZW50IGhhcyBjb250cmlidXRvcnMgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGdldCB0aGUKLQkJCS8vIHJlZmVyZW5jZSBwcm9wZXJ0aWVzCi0JCQlMaXN0IGl0ZW1zID0gZ2V0Q29udHJpYnV0b3JzKGNlLCBjb25maWcpOwotCQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlLCBmZWF0dXJlLCBtZXJnZVJlcGxhY2VyQmFzZSwgbWVyZ2VFeHRlbmRlckJhc2UsIHJlYWxpemVyLCB2YWx1ZXMpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYSByZXBsYWNlciBvZiBhIGJhc2UgZWxlbWVudCwgCi0JCQkvLyBnZXQgdGhlIGJhc2UgZWxlbWVudCdzIHByb3BlcnRpZXMKLQkJCS8vIG9ubHkgY292ZXIgMDEgb3IgMG0gcmVmZXJlbmNlcwotCQkJLy8gYXR0cmlidXRlcyBjYW4ndCBiZSBvcHBvc2l0ZSBmZWF0dXJlCi0KLQkJCS8vIHJlcGxhY2VkIGVsZW1lbnQgZG9lcyBub3Qgc2hvdyBpbmNvbWluZwotCQkJLy8gcmVsYXRpb25zaGlwcwotCQkJLy8gaW1jb21pbmcgcmVsYXRpb25zaGlwcyBhcmUgcmVwcmVzZW50ZWQgYnkgb3Bwb3NpdGUgZmVhdHVyZQotCQkJLy8gc28ga2VlcCB0aGUgcmVmZXJlbmNlcyB0byB0aGUgYmFzZSBlbGVtZW50Ci0JCQkKLQkJCS8vIEluY29uc2lzdGVuY3kgYmV0d2VlbiBQdWJsaXNoZWQgV29yayBQcm9kdWN0OiBXb3JrbG9hZCBBbmFseXNpcyBQYWdlIGFuZCBSZWZlcmVuY2VkIFBhZ2VzCi0JCQkvLyB0aGlzIGlzIGZyb20gdGhlIGJhc2Ugb2YgdGhlIGV4dGVuZGVyLiAKLQkJCS8vIGluY29taW5nIGFzc29jaWF0aW9ucyBmcm9tIHRoZSBiYXNlIHNob3VsZCBiZSBkaXNjYXJkZWQgZm9yIGV4dGVuZGVycwotCQkJYm9vbGVhbiBtZXJnZWJhc2UgPSBmYWxzZTsKLQkJCWJvb2xlYW4gaXNFeHRlbmRlciA9IGlzRXh0ZW5kZXIoY2UpOwotCQkJYm9vbGVhbiBpc1JlcGxhY2VyID0gaXNSZXBsYWNlcihjZSk7Ci0JCQlpZiAoaXNSZXBsYWNlcikgewotCQkJCW1lcmdlYmFzZSA9IG1lcmdlUmVwbGFjZXJCYXNlICYmICgodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB8fCAodmFsdWVzLnNpemUoKSA9PSAwKSk7Ci0JCQl9IGVsc2UgaWYgKGlzRXh0ZW5kZXIpIHsKLQkJCQltZXJnZWJhc2UgPSBtZXJnZUV4dGVuZGVyQmFzZTsKLQkJCX0KLQotCQkJaWYgKG1lcmdlYmFzZSkgewotCQkJCS8vIHJlc29sdmUgdGhlIGJhc2UgY29udHJpYnV0b3IgdG8gdGhlIGJhc2UgaWYgaSBhbSBub3QgYQotCQkJCS8vIHJlcGxhY2VyCi0JCQkJLy8gZG9uJ3QgcmVzb2x2ZSB0aGUgY29udHJpYnV0b3JzIHRvIHRoZSBiYXNlIGlmIGkgYW0gYQotCQkJCS8vIHJlcGxhY2VyLAotCQkJCS8vIHRoZSBjYWxsIGlzIGNvbWluZyBmcm9tIHRoZSBiYXNlLiBTbyBpZiByZXNvbHZlIHRvIGJhc2UgYWdhaW4KLQkJCQkvLyB3aWxsIGNhdXNlIGRlYWRsb2NrLgotCQkJCS8vIGRvbid0IHJlc29sdmUgdG8gdGhlIHJlcGxhY2VyIHNpbmNlIHdlIG5lZWQgdG8gY2FycnkgZG93biBhbGwKLQkJCQkvLyB0aGUgaW5jb21pbmcgMG4gYXNzb2NpYXRpb25zIGZyb20gYmFzZQotCQkJCS8vIGFjdHVhbGx5IHNob3VsZCByZXNvbHZlIHRvIHJlcGxhY2VyIGlmIGkgYW0gbm90IGEgcmVwbGFjZXIKLQkJCQkvLyAoaS5lLiBpIGFtIGFuIGVudGVuZGVyKQotCQkJCS8vIHRoaXMgaGFuZGxlcyB0aGUgc2VuYXJpbzogRzIgcmVwbGFjZXMgRzEgYW5kIEczIGV4dGVuZHMgRzEKLQkJCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIyID0gCi0JCQkJCW5ldyBEZWZhdWx0RWxlbWVudFJlYWxpemVyKGNvbmZpZywgKCFpc1JlcGxhY2VyKSwgKCFpc1JlcGxhY2VyKSk7Ci0KLQkJCQlNZXRob2RFbGVtZW50IGUgPSBnZXRDYWxjdWxhdGVkRWxlbWVudChjZQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgcmVhbGl6ZXIyKTsKLQkJCQkKLQkJCQkvLyBpZiB0aGUgYmFzZSBlbGVtZW50IHJlc29sdmVkIHRvIG51bGwsIAotCQkJCS8vIHRoaXMgaXMgYmVjYXVzZSBjYW5TaG93KCkgZG9uJ3QgYWxsb3cgcmVwbGFjZWQgZWxlbWVudCB0byBzaG93LgotCQkJCS8vIHdlIGRvbid0IHdhbnQgdG8gdGFrZSB0aGUgcmlzayB0byBmaXggRWxlbWVudFJlYWxpemVyCi0JCQkJLy8gc28gZml4IGhlcmUgc2luY2UgNy4wLjFfaWZpeDEsIAotCQkJCS8vIEppbmh1YSBYaSwgNC8xNy8wNgotCQkJCWlmICggZSA9PSBudWxsICkgewotCQkJCQllID0gY2UuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoKGUgIT0gY2UpICYmIGluQ29uZmlnKGUsIGNvbmZpZykpIHsKLQkJCQkJY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKGUsIGZlYXR1cmUsIG1lcmdlUmVwbGFjZXJCYXNlLCBtZXJnZUV4dGVuZGVyQmFzZSwgcmVhbGl6ZXIsIHZhbHVlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSBlbGVtZW50cyBpbiB0aGUgbGlzdCwgYW5kIHJldHVybnMgYSBuZXcgbGlzdCBvZiB1bmlxdWUKLQkgKiBlbGVtZW50cwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q2FsY3VsYXRlZEVsZW1lbnRzKExpc3QgZWxlbWVudHMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlyZXR1cm4gZ2V0Q2FsY3VsYXRlZEVsZW1lbnRzKGVsZW1lbnRzLCBuZXcgRGVmYXVsdEVsZW1lbnRSZWFsaXplcihjb25maWcpICk7Ci0JfQotCQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgZWxlbWVudHMgaW4gdGhlIGxpc3QsIGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgb2YgdW5pcXVlCi0JICogZWxlbWVudHMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcGFyYW0gcmVhbGl6ZXIgRWxlbWVudFJlYWxpemVyCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldENhbGN1bGF0ZWRFbGVtZW50cyhMaXN0IGVsZW1lbnRzLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgKSB7Ci0JCS8vIGNhbGN1bGF0ZSBlYWNoIGVsZW1lbnQgaW4gdGhlIGxpc3QgYW5kIHJldHVybiBhIG5ldyBsaXN0IG9mIGVsZW1lbnRzCi0JCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KGUsIHJlYWxpemVyKTsKLQkJCWlmICgoZSAhPSBudWxsKSAmJiAoIXZhbHVlcy5jb250YWlucyhlKSkpIHsKLQkJCQl2YWx1ZXMuYWRkKGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIGVsZW1lbnQgYmFzZWQgb24gdGxlIGNvbmZpZ3VyYXRpb24uIElmIG5vdGhpbmcgY2FuIGJlCi0JICogc2hvd24sIHJldHVybiBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gbmV3IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIoY29uZmlnLCB0cnVlLCB0cnVlKTsKLQotCQlyZXR1cm4gZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoZWxlbWVudCwgcmVhbGl6ZXIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0KLQkJTWV0aG9kRWxlbWVudCBlID0gZWxlbWVudDsKLQkJTWV0aG9kRWxlbWVudCBlMjsKLQkJd2hpbGUgKChlMiA9IHJlYWxpemVyLnJlYWxpemUoZSkpICE9IGUpIHsKLQkJCWUgPSBlMjsKLQkJfQotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGNhbGN1bGF0ZWQgMC4uMSBmZWF0dXJlIHZhbHVlIG9mIHRoZSBzcGVjaXBpZWQgZWxlbWVudCBhbmQKLQkgKiBmZWF0dXJlCi0JICogCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGNhbGMwMUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXJldHVybiBjYWxjMDFGZWF0dXJlVmFsdWUoZWxlbWVudCwgbnVsbCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGNhbGN1bGF0ZWQgMC4uMSBmZWF0dXJlIHZhbHVlIG9mIHRoZSBzcGVjaXBpZWQgZWxlbWVudCBhbmQKLQkgKiBmZWF0dXJlCi0JICogCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGNhbGMwMUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCAKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJLy8gcHJlc2VudGF0aW9uIG9iamVjdCBmZWF0dXJlIHNob3VsZCBuZXZlciBiZSByZWFsaXplZC4gYWx3YXlzIGtlZXAKLQkJLy8gaXQncyBvd24gdmFsdWUKLQkJT2JqZWN0IHYgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCWlmICh2IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpIHY7Ci0JCX0KLQotCQlUb09uZUZlYXR1cmVWYWx1ZSB2YWx1ZXMgPSBuZXcgVG9PbmVGZWF0dXJlVmFsdWUoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWNhbGN1bGF0ZUZlYXR1cmUoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCByZWFsaXplci5nZXRDb25maWd1cmF0aW9uKCksIHZhbHVlcywgcmVhbGl6ZXIpOwotLy8JCWlmICh2YWx1ZXMuc2l6ZSgpID4gMCkgewotLy8JCQl2ID0gKE1ldGhvZEVsZW1lbnQpIHZhbHVlcy5nZXQoMCk7Ci0vLwkJCWlmICh2IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotLy8JCQkJcmV0dXJuIGdldENhbGN1bGF0ZWRFbGVtZW50KChNZXRob2RFbGVtZW50KSB2LCByZWFsaXplci5nZXRDb25maWd1cmF0aW9uKCkpOwotLy8JCQl9Ci0vLwkJfQotCi0JCXJldHVybiAoTWV0aG9kRWxlbWVudCl2YWx1ZXMuZ2V0VmFsdWUoKTsKLQl9Ci0KLQotCS8qKgotCSAqIGlzIHRoaXMgZmVhdHVyZSBmb3IgY29udGFpbmQgY2hpbGRyZW4/IHN1Y2ggYXMgYXJ0aWZhY3QncyBjb250YWluZWQgYXJ0aWZhY3QuCi0JICogQHBhcmFtIGZlYXR1cmUgCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGFpbm1lbnRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpCi0JCQkJfHwgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZV9TdWJQcmFjdGljZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBhbGxvdyBjb250YWluZWQgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGFpbm1lbnRFbGVtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QgfHwgZWxlbWVudCBpbnN0YW5jZW9mIFByYWN0aWNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0Q29udGFpbmVycyhNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUVPYmplY3QgbyA9IGVsZW1lbnQ7Ci0JCXdoaWxlICgobyAhPSBudWxsKSAmJiAoKG8gPSBvLmVDb250YWluZXIoKSkgIT0gbnVsbCkKLQkJCQkmJiBvLmdldENsYXNzKCkuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJaWYgKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlvID0gZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgbywgY29uZmlnKTsKLQkJCX0KLQotCQkJaWYgKChvICE9IG51bGwpICYmICFpdGVtcy5jb250YWlucyhvKSkgewotCQkJCWl0ZW1zLmFkZChvKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIDAxIG9wcG9zaXRlIGZlYXR1cmUgKGlmIGFueSkgZm9yIHRoZSBnaXZlbiBmZWF0dXJlLiByZXR1cm5zIG51bGwKLQkgKiBpZiBubyBzdWNoIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHJldHVybiBPcHBvc2l0ZUZlYXR1cmUgdGhlIDAxIG9wcG9zaXRlIGZlYXR1cmUgb2YgdGhlIGdpdmVuIGZlYXR1cmUsCi0JICogICAgICAgICBudWxsIGlmIG5vIHN1Y2ggdGhpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9wcG9zaXRlRmVhdHVyZSBnZXQwMU9wcG9zaXRlRmVhdHVyZSgKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQotCQkvLyBzaW5jZSAxLjBtNCwgdGhlc2UgYXJlIG5vdCAwMSBmZWF0dXJlIGFueSBtb3JlCi0vLwkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpKSB7Ci0vLwkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5UYXNrX0Rpc2NpcGxpbmU7Ci0vLwkJfSBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSkgewotLy8JCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlOwotLy8JCX0KLQkJCi0vLwkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSApIHsKLS8vCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X0RvbWFpbnM7Ci0vLwkJfSAKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogZ2V0IHRoZSB0YXJnZXQgZmVhdHVyZSBmb3IgdGhlIG9wcG9zaXRlIGZlYXR1cmUgaWYgdGhlIHRhcmdldCBmZWF0dXJlIGlzIGEgdG8tT25lIGZlYXR1cmUsIAotCSAqIG90aGVyd2lzZSwgcmV0dXJuIG51bGwuCi0JICogQHBhcmFtIG9GZWF0dXJlCi0JICogQHJldHVybiBFU3RydWN0dXJhbEZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXQwMUZlYXR1cmUoT3Bwb3NpdGVGZWF0dXJlIG9GZWF0dXJlKSB7Ci0JCWlmICggb0ZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9QcmltYXJ5X1Rhc2tzIAotCQkJCXx8IG9GZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnMgKSB7Ci0JCQlyZXR1cm4gb0ZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIDAuLm4gZmVhdHVyZSB2YWx1ZSBvZiB0aGUgc3BlY2lwaWVkIGVsZW1lbnQsIGl0J3MKLQkgKiBvd25lciBlbGVtZW50IGFuZCBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICogQHBhcmFtIGZlYXR1cmUge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZX0KLQkgKiBAcGFyYW0gcmVhbGl6ZXIge0BsaW5rIEVsZW1lbnRSZWFsaXplcn0KLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBjYWxjMG5GZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgCi0JewotCQlyZXR1cm4gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG51bGwsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIDAuLm4gZmVhdHVyZSB2YWx1ZSBvZiB0aGUgc3BlY2lwaWVkIGVsZW1lbnQgYW5kCi0JICogZmVhdHVyZS4gaWYgdGhlIG9wcG9zaXRlIGZlYXR1cmUgb24gdGhlIG90aGVyIGVuZCBpcyBhIHRvLW9uZSBmZWF0dXJlLAotCSAqIHRoZSBmZWF0dXJlIHZhbHVlIGl0ZW0gY2FuJ3QgYmUgaW4gdGhlIHZhbHVlIGxpc3QgdW5sZXNzIGl0J3Mgb3Bwb3NpdGUKLQkgKiBmZWF0dXJlIHZhbHVlIGlzIHRoZSBjdXJyZW50IGVsZW1lbnQuIEZvciBleGFtcGxlLCBmb3IgZGlzY2lwbGluZV90YXNrcywKLQkgKiB0aGUgdGFza3MgY2FuIGJlIHNlbGVjdGVkIGlmIGFuZCBPTkxZIGlmIHRoZSB0YXNrJ3MgdGFza19kaXNjaXBsaW5lCi0JICogb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBpcyB0aGUgY3VycmVudCBkaXNjaXBsaW5lCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICogQHBhcmFtIGZlYXR1cmUge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZX0KLQkgKiBAcGFyYW0gcmVhbGl6ZXIge0BsaW5rIEVsZW1lbnRSZWFsaXplcn0KLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBjYWxjMG5GZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCwgCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCQkJCi0JCUxpc3QgdiA9IG51bGw7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpOwotCQkKLQkJLy8gV3JvbmcgIm1vZGlmaWVzIiBpbmZvcm1hdGlvbiBwdWJsaXNoZWQgaW4gdGVhbSBhbGxvY2F0aW9uIHZpZXcgZm9yIHNtYWxsIGNvbmZpZ3VyYXRpb24KLQkJLy8gbmVlZCB0byBtYW51YWxseSBjYWxjdWxhdGUgdGhlIG1vZGlmeSBmZWF0dXJlcwotCQkvLyBjYW4ndCByZWx5IG9uIHRoZSB1bWEgbW9kZWwgc2luY2UgdGhhdCBpcyBub3QgY29uZmlndXJhdGlvbiBzcGVjaWZpYy4KLQkJLy8gcm9sZSBtb2RpZmllcyBwcm9kdWN0IG1lYW5zOgotCQkvLyByb2xlIHBlcmZvcm1zIG9uIHRhc2tzLCBhbmQgdGFza3MgcHJvZHVjZSB3b3JrcHJvZHVjdHMgYXMgb3V0cHV0Ci0JCS8vIHNvIGhhbmRsZSB0aGVzZSBzY2VuYXJpb3MgYXMgc3BlY2lhbCBjYXNlcwotCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlICYmIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9Nb2RpZmllcygpICkgewotLy8JCQlMaXN0IHYyID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQljYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9QcmltYXJ5X1Rhc2tzLCByZWFsaXplciwgdjIpOwotLy8JCQlpZiAoIHYyLnNpemUoKSA+IDAgKSB7Ci0vLwkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdjIuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLS8vCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0vLwkJCQkJY2FsY3VsYXRlRmVhdHVyZShlLCBvd25lckVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCksIGNvbmZpZywgdiwgcmVhbGl6ZXIpOwkJCQkJCi0vLwkJCQl9Ci0vLwkJCX0JCi0JCQl2ID0gY2FsY01vZGlmaWVkV29ya1Byb2R1Y3RzKChSb2xlKWVsZW1lbnQsIG93bmVyRWxlbWVudCwgcmVhbGl6ZXIpOwotCQl9ZWxzZSBpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvciAmJiBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCkgKSB7Ci0vLwkJCUxpc3QgdjIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlbGVtZW50LCBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzLCByZWFsaXplciwgdjIpOwotLy8JCQlpZiAoIHYyLnNpemUoKSA+IDAgKSB7Ci0vLwkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdjIuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLS8vCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0vLwkJCQkJY2FsY3VsYXRlRmVhdHVyZShlLCBvd25lckVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLCBjb25maWcsIHYsIHJlYWxpemVyKTsJCQkJCQotLy8JCQkJfQotLy8JCQl9Ci0JCQl2ID0gY2FsY01vZGlmaWVkV29ya1Byb2R1Y3REZXNjcmlwdG9ycygoUm9sZURlc2NyaXB0b3IpZWxlbWVudCwgb3duZXJFbGVtZW50LCByZWFsaXplcik7Ci0JCX0gZWxzZSB7Ci0JCQlUb01hbnlGZWF0dXJlVmFsdWUgZnYgPSBuZXcgVG9NYW55RmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkJY2FsY3VsYXRlRmVhdHVyZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsIGNvbmZpZywgZnYsIHJlYWxpemVyKTsKLQkJCXYgPSAoTGlzdClmdi5nZXRWYWx1ZSgpOwotCQl9Ci0JCQotCQlMaXN0IHZhbHVlcyA9IGdldENhbGN1bGF0ZWRFbGVtZW50cyh2LCByZWFsaXplcik7Ci0JCWlmICh2YWx1ZXMuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCXZhbHVlcy5yZW1vdmUoZWxlbWVudCk7Ci0JCX0KLQotCQkvLyAqIGlmIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIG9uIHRoZSBvdGhlciBlbmQgaXMgYSB0by1vbmUgZmVhdHVyZSwKLQkJLy8gKiB0aGUgZmVhdHVyZSB2YWx1ZSBpdGVtIGNhbid0IGJlIGluIHRoZSB2YWx1ZSBsaXN0IHVubGVzcyBpdCdzCi0JCS8vIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgaXMgdGhlIGN1cnJlbnQgZWxlbWVudC4KLQkJLy8gKiBGb3IgZXhhbXBsZSwgZm9yIGRpc2NpcGxpbmVfdGFza3MsIHRoZSB0YXNrcyBjYW4gYmUgc2VsZWN0ZWQKLQkJLy8gKiBpZiBhbmQgT05MWSBpZiB0aGUgdGFzaydzIHRhc2tfZGlzY2lwbGluZSBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlIGlzCi0JCS8vIHRoZSBjdXJyZW50IGRpc2NpcGxpbmUKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mID0gZ2V0MDFPcHBvc2l0ZUZlYXR1cmUoZmVhdHVyZSk7Ci0JCWlmIChvZiAhPSBudWxsKSB7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLQkJCQlNZXRob2RFbGVtZW50IG8gPSAoTWV0aG9kRWxlbWVudCkgdmFsdWVzLmdldChpKTsKLQotCQkJCS8vIGNhbGN1bGF0ZSBpdCdzIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUsIHRoZSB2YWx1ZSBtdXN0IGJlIHRoZQotCQkJCS8vIGdpdmVuIGVsZW1lbnQKLQkJCQkvLyBvdGhlcndpc2UsIHJlbW92ZSBpdAotCQkJCS8vIG5vdGU6IGRvbid0IHVzZSB0aGUgY3VycmVudCByZWFsaXplcgotCQkJCS8vIHVzZSB0aGUgZGVmYXVsdCByZWFsaXplciBzaW5jZSB3ZSBuZWVkIHRvIHJlYWxpemUgdGhlIGVsZW1lbnQgaW4gdGhlIGRlZmF1bHQgd2F5Ci0JCQkJLy8gMTU4OTI0IC0gd3JvbmcgY2F0ZWdvcmllcyBpbiBjb25maWd1cmF0aW9uIHZpZXcKLQotCQkJCQotCQkJCS8vIHdvcmthcm91bmQgdG8gYWxsb3cgc2hvdy9oaWRlIHN1YnRyYWN0ZWQgZWxlbWVudHMKLQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyIHIgPSBuZXcgRGVmYXVsdEVsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkJCXIuc2V0U2hvd1N1YnRyYWN0ZWQocmVhbGl6ZXIuc2hvd1N1YnRyYWN0ZWQoKSk7Ci0JCQkJCi0JCQkJTWV0aG9kRWxlbWVudCBvbyA9IGNhbGMwMUZlYXR1cmVWYWx1ZShvLCBvZiwgcik7Ci0JCQkJaWYgKG9vICE9IGVsZW1lbnQpIHsKLQkJCQkJdmFsdWVzLnJlbW92ZShpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY29udGFpbm1lbnQgZmVhdHVyZSB2YWx1ZSBzaG91bGQgbm90IGNvbnRhaW4gdGhlIG93bmVyIGVsZW1lbnQgb3IgaXRzCi0JCS8vIHBhcmVudHMKLQkJLy8gZm9yIGV4YW1wbGUsIGFydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0cyBzaG91bGQgbm90IGJlIHRoZSBhcnRpZmFjdAotCQkvLyBpdHNlbGYgb3IgaXRzIHBhcmVudHMKLQkJaWYgKGlzQ29udGFpbm1lbnRGZWF0dXJlKGZlYXR1cmUpKSB7Ci0JCQlMaXN0IGNvbnRhaW5lcnMgPSBnZXRDb250YWluZXJzKGVsZW1lbnQsIGNvbmZpZyk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLQkJCQlPYmplY3QgbyA9IChPYmplY3QpIHZhbHVlcy5nZXQoaSk7Ci0JCQkJaWYgKG8gPT0gZWxlbWVudCB8fCBjb250YWluZXJzLmNvbnRhaW5zKG8pKSB7Ci0JCQkJCXZhbHVlcy5yZW1vdmUoaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJTGlzdCByZXR1cm5MaXN0ID0gcmVhbGl6ZXIucmVhbGl6ZShlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZXMpOwotCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSAmJiBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSApIHsKLQkJCXJldHVybkxpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoZWxlbWVudCwgcmV0dXJuTGlzdC50b0FycmF5KCksIHRydWUpOwotCQl9Ci0KLQkJLy8gdGhlIGZvbGxvd2luZyBwYXJ0IG1pZ2h0IG5vdCBiZSBnZW5lcmFsIHRvIGFsbCBjYXNlcwotCQkvLyBzbyBwdXQgaXQgaW50byB0aGUgcmVhbGl6ZXIKLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JCQotLy8JCS8vIGlmIHRoZSBmZWF0dXJlIHZhbHVlIGlzIGNvbnRhaW5tZW50IGVsZW1lbnQgc3VjaCBhcyBhcnRpZmFjdAotLy8JCS8vIHRoZSBjaGlsZCBlbGVtZW50IGNhbid0IHNob3cgaWYgYW55IG9mIHRoZSBwYXJlbnQocykgYXJlIGluIHRoZSBsaXN0Ci0vLwkJLy8gUHVibGlzaGVkIHNpdGU6IERpc3BsYXkgb2YgV1BzIHVuZGVyIHJlc3BvbnNpYmxlIHJvbGUKLS8vCQlpZiAoZmVhdHVyZS5pc01hbnkoKSAmJiB2YWx1ZXMuc2l6ZSgpID4gMAotLy8JCQkJJiYgaXNDb250YWlubWVudEVsZW1lbnQodmFsdWVzLmdldCgwKSkpIHsKLS8vCQkJaW50IGkgPSAwOwotLy8JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLS8vCQkJCU1ldGhvZEVsZW1lbnQgbyA9IChNZXRob2RFbGVtZW50KSB2YWx1ZXMuZ2V0KGkpOwotLy8KLS8vCQkJCS8vIGlmIHRoZSBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGxpc3QsIHJlbW92ZSB0aGlzCi0vLwkJCQkvLyBlbGVtZW50IGZyb20gdGhlIGxpc3QKLS8vCQkJCWlmIChpc0NvbnRhaW5lckluTGlzdChvLCB2YWx1ZXMsIGNvbmZpZykpIHsKLS8vCQkJCQl2YWx1ZXMucmVtb3ZlKGkpOwotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlpKys7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vIG5lZWQgdG8gc29ydCB0aGUgY29uY2VwdCBhbmQgcGFwZXJzIGJ5IHR5cGUKLS8vCQlpZiAoKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLS8vCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpKQotLy8JCQkJJiYgKHZhbHVlcy5zaXplKCkgPiAwKSkgewotLy8JCQlMaXN0IHBhcGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJaW50IGkgPSAwOwotLy8JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLS8vCQkJCU9iamVjdCBvID0gdmFsdWVzLmdldChpKTsKLS8vCQkJCWlmIChvIGluc3RhbmNlb2YgV2hpdGVwYXBlcikgewotLy8JCQkJCXBhcGVycy5hZGQobyk7Ci0vLwkJCQkJdmFsdWVzLnJlbW92ZShpKTsKLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJaSsrOwotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCQlpZiAocGFwZXJzLnNpemUoKSA+IDApIHsKLS8vCQkJCXZhbHVlcy5hZGRBbGwocGFwZXJzKTsKLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgY29udGFpbmVyIG9mIHRoZSBlbGVtZW50IGlzIGluIHRoZSBsaXN0IG9yIG5vdAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGl0ZW1zCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWluZXJJbkxpc3QoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBMaXN0IGl0ZW1zLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJRU9iamVjdCBvID0gZWxlbWVudDsKLQkJd2hpbGUgKChvICE9IG51bGwpICYmICgobyA9IG8uZUNvbnRhaW5lcigpKSAhPSBudWxsKQotCQkJCSYmIG8uZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQlpZiAoaXRlbXMuY29udGFpbnMobykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlvID0gZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgbywgY29uZmlnKTsKLQkJCX0KLQotCQkJaWYgKChvICE9IG51bGwpICYmIGl0ZW1zLmNvbnRhaW5zKG8pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlIG9mIHRoZSBzcGVjaXBpZWQgZWxlbWVudCBhbmQKLQkgKiBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICogQHBhcmFtIGZlYXR1cmUge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZX0KLQkgKiBAcGFyYW0gY29uZmlnIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoZWxlbWVudCwgbnVsbCwgZmVhdHVyZSwgY29uZmlnKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGNhbGN1bGF0ZWQgYXR0cmlidXRlIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50IGFuZAotCSAqIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG93bmVyRWxlbWVudCB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKiBAcGFyYW0gZmVhdHVyZSB7QGxpbmsgRVN0cnVjdHVyYWxGZWF0dXJlfQotCSAqIEBwYXJhbSBjb25maWcge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259Ci0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChpc01lcmdhYmxlQXR0cmlidXRlKGZlYXR1cmUpKSB7Ci0JCQkvLyBtZXJnZSB0aGUgYXR0cmlidXRlIHZhbHVlcwotCQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gbmV3IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCUF0dHJpYnV0ZUZlYXR1cmVWYWx1ZSB2YWx1ZXMgPSBuZXcgQXR0cmlidXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkJY2FsY3VsYXRlRmVhdHVyZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLAotCQkJCQkJcmVhbGl6ZXIpOwotCi0vLwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotLy8JCQkJRmVhdHVyZVZhbHVlIGF2ID0gKEZlYXR1cmVWYWx1ZSkgaXQubmV4dCgpOwotLy8JCQkJaWYgKGF2LnRleHQgPT0gbnVsbCB8fCBhdi50ZXh0LnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCkgewotLy8JCQkJCWNvbnRpbnVlOwotLy8JCQkJfQotLy8KLS8vCQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0vLwkJCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKSB7Ci0vLwkJCQkJaWYgKHZhbHVlcy5zaXplKCkgPiAxKSB7Ci0vLwkJCQkJCS8vIHNvbWV0aGluZyB3cm9uZyBoZXJlLCB3aWxsIG5vdCBoYXBwZW4gYnV0IHB1dCB0ZXN0Ci0vLwkJCQkJCS8vIG1lc3NhZ2UgaGVyZSBqdXN0IGluIGNhc2UKLS8vCQkJCQkJaWYgKGRlYnVnKSB7Ci0vLwkJCQkJCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJCQkJCS5wcmludGxuKCJDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWU6IFByZXNlbnRhdGlvbiBOYW1lIGdldCBtb3JlIHRoZW4gb25lIGVudHJ5OiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQkJcmV0dXJuIGF2LnRleHQ7Ci0vLwkJCQl9Ci0vLwotLy8JCQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLS8vCQkJCQlidWZmZXIuYXBwZW5kKEFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IpOyAKLS8vCQkJCX0KLS8vCi0vLwkJCQlpZiAoYXYuZWxlbWVudCA9PSBlbGVtZW50KSB7Ci0vLwkJCQkJYnVmZmVyLmFwcGVuZChhdi50ZXh0KTsKLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJU3RyaW5nIGNvbnRlbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIKLS8vCQkJCQkJCS5nZXRFbGVtZW50UGF0aCgoYXYuZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgPyAoTWV0aG9kRWxlbWVudCkgYXYuZWxlbWVudAotLy8JCQkJCQkJCQkuZUNvbnRhaW5lcigpCi0vLwkJCQkJCQkJCTogYXYuZWxlbWVudCk7Ci0vLwotLy8JCQkJCVN0cmluZyBiYWNrUGF0aCA9IFJlc291cmNlSGVscGVyCi0vLwkJCQkJCQkuZ2V0QmFja1BhdGgoKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pID8gKChvd25lckVsZW1lbnQgIT0gbnVsbCkgPyBvd25lckVsZW1lbnQKLS8vCQkJCQkJCQkJOiAoTWV0aG9kRWxlbWVudCkgZWxlbWVudC5lQ29udGFpbmVyKCkpCi0vLwkJCQkJCQkJCTogZWxlbWVudCk7Ci0vLwotLy8JCQkJCWJ1ZmZlci5hcHBlbmQoUmVzb3VyY2VIZWxwZXIuZml4Q29udGVudFVybFBhdGgoYXYudGV4dCwKLS8vCQkJCQkJCWNvbnRlbnRQYXRoLCBiYWNrUGF0aCkpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkKLQkJCXJldHVybiB2YWx1ZXMuZ2V0VmFsdWUoKTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIDAuLm4gb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBvZiB0aGUgc3BlY2lwaWVkIGVsZW1lbnQKLQkgKiBhbmQgb3Bwb3NpdGUgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZSB7QGxpbmsgRVN0cnVjdHVyYWxGZWF0dXJlfQotCSAqIEBwYXJhbSByZWFsaXplciB7QGxpbmsgRWxlbWVudFJlYWxpemVyfQotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2Yge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGNhbGMwbkZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXJldHVybiBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwgdHJ1ZSwgZmFsc2UsIHJlYWxpemVyKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGNhbGN1bGF0ZWQgMC4ubiBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlIG9mIHRoZSBzcGVjaXBpZWQgZWxlbWVudAotCSAqIGFuZCBvcHBvc2l0ZSBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICogQHBhcmFtIGZlYXR1cmUge0BsaW5rIE9wcG9zaXRlRmVhdHVyZX0KLQkgKiBAcGFyYW0gbWVyZ2VSZXBsYWNlckJhc2UgYm9vbGVhbgotCSAqIEBwYXJhbSBtZXJnZUV4dGVuZGVyQmFzZSBib29sZWFuCi0JICogQHBhcmFtIHJlYWxpemVyIHtAbGluayBFbGVtZW50UmVhbGl6ZXJ9Ci0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBib29sZWFuIG1lcmdlUmVwbGFjZXJCYXNlLCBib29sZWFuIG1lcmdlRXh0ZW5kZXJCYXNlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUgdmFsdWVzID0gbmV3IFRvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKGVsZW1lbnQsIGZlYXR1cmUsIG1lcmdlUmVwbGFjZXJCYXNlLCBtZXJnZUV4dGVuZGVyQmFzZSwgcmVhbGl6ZXIsIHZhbHVlcyk7Ci0JCXJldHVybiAoTGlzdCl2YWx1ZXMuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JCi0JCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIDAuLjEgZmVhdHVyZSB2YWx1ZSBvZiB0aGUgc3BlY2lwaWVkIGVsZW1lbnQgYW5kCi0JICogb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEBwYXJhbSBlbGVtZW50IHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqIEBwYXJhbSBmZWF0dXJlIHtAbGluayBPcHBvc2l0ZUZlYXR1cmV9Ci0JICogQHBhcmFtIHJlYWxpemVyIHtAbGluayBFbGVtZW50UmVhbGl6ZXJ9Ci0JICogCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGNhbGMwMUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCVRvT25lT3Bwb3NpdGVGZWF0dXJlVmFsdWUgdmFsdWVzID0gbmV3IFRvT25lT3Bwb3NpdGVGZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQljYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoZWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIsIHZhbHVlcyk7Ci0vLwkJaWYgKHZhbHVlcy5zaXplKCkgPiAwKSB7Ci0vLwkJCXJldHVybiBnZXRDYWxjdWxhdGVkRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgdmFsdWVzLmdldCgwKSwgcmVhbGl6ZXIpOwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpdmFsdWVzLmdldFZhbHVlKCk7Ci0JCQotCX0KLQotCS8qKgotCSAqIG9yZGVyIHRoZSBzZWN0aW9ucwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IHtAbGluayBDb250ZW50RWxlbWVudH0KLQkgKiBAcGFyYW0gdmFsdWVzIHtAbGluayBMaXN0fSAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3JkZXJTZWN0aW9ucyhDb250ZW50RWxlbWVudCBlbGVtZW50LCBMaXN0IHZhbHVlcykgewotCQlTdHJpbmcgb3JkZXJpbmdHdWlkZSA9IGVsZW1lbnQuZ2V0T3JkZXJpbmdHdWlkZSgpOwotCQlpZiAob3JkZXJpbmdHdWlkZSA9PSBudWxsIHx8IG9yZGVyaW5nR3VpZGUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlTZWN0aW9uTGlzdCBzbGlzdCA9IG5ldyBTZWN0aW9uTGlzdChlbGVtZW50LAotCQkJCVNlY3Rpb25MaXN0LlNURVBTX0ZPUl9FTEVNRU5UX0FORF9QQVJFTlRTKTsKLQotCQlpZiAoaXNTYW1lTGlzdCh2YWx1ZXMsIHNsaXN0KSkgewotCQkJdmFsdWVzLmNsZWFyKCk7Ci0JCQl2YWx1ZXMuYWRkQWxsKHNsaXN0KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIG90aGVyd2lzZSwgbmVlZCB0byByZW9yZGVyIHRoZSBsaXN0Ci0JCU9yZGVyZWRMaXN0Q29tcGFyYXRvciBjb21wID0gbmV3IE9yZGVyZWRMaXN0Q29tcGFyYXRvcihuZXcgQXJyYXlMaXN0KAotCQkJCXZhbHVlcyksIHNsaXN0KTsKLQkJVHJlZVNldCBzID0gbmV3IFRyZWVTZXQoY29tcCk7Ci0JCXMuYWRkQWxsKHZhbHVlcyk7Ci0KLQkJdmFsdWVzLmNsZWFyKCk7Ci0JCXZhbHVlcy5hZGRBbGwocyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NhbWVMaXN0KExpc3QgbDEsIExpc3QgbDIpIHsKLQkJaWYgKGwxLnNpemUoKSAhPSBsMi5zaXplKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBsMS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmICghbDIuY29udGFpbnMobykpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIGNvcHlyaWdodCBvZiB0aGUgZWxlbWVudCBpbnQgaGUgY29uZmlndXJhdGlvbi4gUnVsZTogMS4KLQkgKiBjb250cmlidXRvcnMnIGNvcHlyaWdodCBzdGF0bWVudCBzaG91bGQgYmUgbWVyZ2VkIHRvIHRoZSBiYXNlIDIuIGV4dGVuZGVkCi0JICogZWxlbWVudCBpbmhlcml0ZXMgdGhlIGNvcHlyaWdodHMgZnJvbSB0aGUgYmFzZSAzLiByZXBsYWNlciBkb24ndCBpbmhlcml0ZQotCSAqIHRoZSBjb3B5cmlnaHRzIGZyb20gdGhlIGJhc2UgNC4gY29weXJpZ2h0IGVsZW1lbnRzIHNob3VsZCBiZSB1bmlxdWUsIG5vCi0JICogZHVwbGljYXRlIGVudHJ5Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2FsY3VsYXRlQ29weXJpZ2h0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBMaXN0IHZhbHVlcykgewotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0ID0gKFN1cHBvcnRpbmdNYXRlcmlhbCkgZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoCi0JCQkJTGlicmFyeVV0aWwuZ2V0Q29weXJpZ2h0KGVsZW1lbnQpLCBjb25maWcpOwotCQlpZiAoY29weXJpZ2h0ICE9IG51bGwgJiYgIXZhbHVlcy5jb250YWlucyhjb3B5cmlnaHQpKSB7Ci0JCQl2YWx1ZXMuYWRkKGNvcHlyaWdodCk7Ci0JCX0KLQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBnZXRWYXJpYWJsZU93bmVyKGVsZW1lbnQpOwotCQlpZiAodmUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBtZXJnZSBjb3B5cmlnaHRzIG9mIGNvbnRyaWJ1dG9ycwotCQlMaXN0IGl0ZW1zID0gZ2V0Q29udHJpYnV0b3JzKHZlLCBjb25maWcpOwotCQlpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJY2FsY3VsYXRlQ29weXJpZ2h0KGUsIGNvbmZpZywgdmFsdWVzKTsKLQkJCX0KLQkJfQotCi0JCS8vIGlmIHRoZSBlbGVtZW50IGlzIGFuIGV4dGVuZGVkIGVsZW1lbnQsIGdldCB0aGUgYmFzZSBlbGVtZW50J3MKLQkJLy8gY29weXJpZ2h0Ci0JCS8vIHRoZSBiYXNlIGVsZW1lbnQncyBjb3B5cmlnaHQgc2hvdWxkIGFwcGVhciBmaXJzdAotCQlpZiAoaXNFeHRlbmRlcih2ZSkpIHsKLQkJCS8vIHJlYWxpemUgdGhlIGJhc2UgZWxlbWVudCBmaXJzdC4KLQkJCU1ldGhvZEVsZW1lbnQgZSA9IGdldENhbGN1bGF0ZWRFbGVtZW50KHZlCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIGNvbmZpZyk7Ci0JCQlpZiAoKHZlICE9IGUpICYmIGluQ29uZmlnKGUsIGNvbmZpZykpIHsKLQkJCQlMaXN0IGJhc2VJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQljYWxjdWxhdGVDb3B5cmlnaHQoZSwgY29uZmlnLCBiYXNlSXRlbXMpOwotCi0JCQkJLy8gYWRkIHRoZSBiYXNlIGl0ZW1zIHRvIHRoZSBiZWdpbmluZwotCQkJCWlmIChiYXNlSXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCQkvLyBBdXRob3Jpbmc6IER1cGxpY2F0ZSBjb3B5cmlnaHRzIHdoZW4gMgotCQkJCQkvLyBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIGNveXJpZ2h0IGFyZSBleHRlbmRpbmcgZWFjaCBvdGhlcgotCQkJCQkvLyByZW1vdmUgdGhlIGR1cGxpY2F0ZSBvbmVzCi0JCQkJCWludCBpID0gMDsKLQkJCQkJd2hpbGUgKGkgPCB2YWx1ZXMuc2l6ZSgpKSB7Ci0JCQkJCQlpZiAoYmFzZUl0ZW1zLmNvbnRhaW5zKHZhbHVlcy5nZXQoaSkpKSB7Ci0JCQkJCQkJdmFsdWVzLnJlbW92ZShpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaSsrOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJdmFsdWVzLmFkZEFsbCgwLCBiYXNlSXRlbXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjb3B5cmlnaHQgdGV4dAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqIEBwYXJhbSBjb25maWcge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb3B5cmlnaHRUZXh0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCVN0cmluZ0J1ZmZlciBjb3B5cmlnaHRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb25maWd1cmF0aW9uSGVscGVyLmNhbGN1bGF0ZUNvcHlyaWdodChlbGVtZW50LCBjb25maWcsIGl0ZW1zKTsKLQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWNvcHlyaWdodCA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0Lm5leHQoKTsKLQotCQkJCS8vIENvbnRyaWJ1dGluZyBzdXBwb3J0IG1hdGVyaWFsIGRvZXMgbm90IHNob3cKLQkJCQkvLyB1cCBpbiBjb3B5IHJpZ2h0Ci0JCQkJLy8gbmVlZCB0byByZXNvbHZlIHRoZSBmZWF0dXJlIHZhbHVlLiBjYW4ndCBqdXN0IGdldCB0aGUgdmFsdWUsCi0JCQkJLy8gaXQgbWF5IGhhdmUgY29udHJpYnV0b3JzCi0JCQkJLy8gU3RyaW5nIHN0YXRlbWVudCA9Ci0JCQkJLy8gY29weXJpZ2h0LmdldFByZXNlbnRhdGlvbigpLmdldE1haW5EZXNjcmlwdGlvbigpOwotCQkJCS8vCQkJCQkJCQkJCQkKLQkJCQlTdHJpbmcgc3RhdGVtZW50ID0gKFN0cmluZykgY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShjb3B5cmlnaHQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgY29weXJpZ2h0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSwgY29uZmlnKTsKLQkJCQlpZiAoc3RhdGVtZW50ICE9IG51bGwgJiYgc3RhdGVtZW50Lmxlbmd0aCgpID4gMCkgewotCQkJCQkvLyBuZWVkIHRvIGZpeCB0aGUgY29udGVudCBmb3IgcmVsYXRpdmUgbGlua3MuCi0JCQkJCS8vIHNpbmNlIHRoZSBsaW5rIGlzIGEgcmVsYXRpdmUgcGF0aCB0byB0aGUKLQkJCQkJLy8gU3VwcG9ydGluZ01hdGVyaWFsIGxvY2F0aW9uLAotCQkJCQkvLyBuZWVkIHRvIGNvbnZlcnQgdG8gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZWxlbWVudAotCQkJCQkvLyBzbyByZS1jYWxjdWF0ZSB0aGUgYmFjayBwYXRoCi0JCQkJCS8vIGp4aSwgMDYvMjgvMDUKLQkJCQkJU3RyaW5nIGNvbnRlbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFBhdGgoY29weXJpZ2h0KTsKLQkJCQkJU3RyaW5nIGJhY2tQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0QmFja1BhdGgoZWxlbWVudCk7Ci0JCQkJCXN0YXRlbWVudCA9IFJlc291cmNlSGVscGVyLmZpeENvbnRlbnRVcmxQYXRoKHN0YXRlbWVudCwKLQkJCQkJCQljb250ZW50UGF0aCwgYmFja1BhdGgpOwotCi0JCQkJCWlmIChjb3B5cmlnaHRzLmxlbmd0aCgpID4gMCkgewotCQkJCQkJY29weXJpZ2h0cy5hcHBlbmQoIjxwLz4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWNvcHlyaWdodHMuYXBwZW5kKHN0YXRlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvcHlyaWdodHMudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIFN0cmluZyBhdHRyaWJ1dGUgdmFsdWVzIG9mIGFuIGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIGUgQWN0aXZpdHkgb3IgaXQncyBDb250ZW50RGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gYXR0cmliCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aXZpdHlTdHJpbmdBdHRyaWJ1dGUoTWV0aG9kRWxlbWVudCBlLCBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCwgCi0JCQlFQXR0cmlidXRlIGF0dHJpYiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYoIVN0cmluZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGF0dHJpYi5nZXRFQXR0cmlidXRlVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGlzIG5vdCBvZiB0eXBlIFN0cmluZzogIiArIGF0dHJpYik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJT2JqZWN0IHN0ciA9IG51bGw7Ci0JCWJvb2xlYW4gaXNEZXNjOwotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmU7Ci0JCWlmICggZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiApCi0JCXsKLQkJCXZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAoIHZlID09IG51bGwgKSB7Ci0JCQkJdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KW93bmVyRWxlbWVudDsKLQkJCX0KLQkJCWlzRGVzYyA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpCi0JCXsKLQkJCXZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCllOwotCQkJaXNEZXNjID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlzdHIgPSBlLmVHZXQoYXR0cmliKTsKLQkJCXJldHVybiAoc3RyPT1udWxsKSA/ICIiIDogc3RyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCQotCQlpZihhdHRyaWIgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkgfHwgYXR0cmliID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpIHsKLQkJCXJldHVybiAoU3RyaW5nKWUuZUdldChhdHRyaWIpOwotCQl9CQkKLQkJCQkJCi0JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCWlmKCBiYXNlICE9IG51bGwgJiYgdmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCkgewotCQkJLy8gZm9yIGxvY2FsIGNvbnRyaWJ1dGlvbiwgYXBwZW5kIHRoZSB0ZXh0IHRvIHRoZSBiYXNlCi0JCQlPYmplY3Qgc3RyQmFzZTsKLQkJCWlmICggaXNEZXNjICkgewotCQkJCXN0ciA9ICgoRGVzY3JpYmFibGVFbGVtZW50KXZlKS5nZXRQcmVzZW50YXRpb24oKS5lR2V0KGF0dHJpYik7Ci0JCQkJc3RyQmFzZSA9IGNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoICgoRGVzY3JpYmFibGVFbGVtZW50KWJhc2UpLmdldFByZXNlbnRhdGlvbigpLCBiYXNlLCBhdHRyaWIsIGNvbmZpZyk7Ci0JCQl9IGVsc2UgewotCQkJCXN0ciA9IHZlLmVHZXQoYXR0cmliKTsKLQkJCQlzdHJCYXNlID0gY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShiYXNlLCBudWxsLCBhdHRyaWIsIGNvbmZpZyk7CQkJCQotCQkJfQotCQkJCi0JCQlpZiAoIHN0ckJhc2UgIT0gbnVsbCAmJiBzdHJCYXNlLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwICkgewotCQkJCWlmICggc3RyICE9IG51bGwgJiYgc3RyLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwICkgewotCQkJCQlzdHIgPSBzdHJCYXNlICsgQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUiArIHN0cjsKLQkJCQl9IGVsc2UgewotCQkJCQlzdHIgPSBzdHJCYXNlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN0ciA9IGNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoZSwgdmUsIGF0dHJpYiwgY29uZmlnKTsKLQkJfQotCi0JCXJldHVybiAoc3RyPT1udWxsKSA/ICIiIDogc3RyLnRvU3RyaW5nKCk7Ci0JCQotLy8JCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlOwotLy8JCVZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGU7CQotLy8JCWJvb2xlYW4gY29uY2F0ID0gYXR0cmliICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCk7Ci0vLwkJd2hpbGUodHJ1ZSkgewotLy8JCQliYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotLy8JCQlpZihiYXNlID09IG51bGwpIHsKLS8vCQkJCU9iamVjdCBzdHI7Ci0vLwkJCQlpZiAoIGlzRGVzYyApIHsKLS8vCQkJCQlzdHIgPSAoKERlc2NyaWJhYmxlRWxlbWVudCl2ZSkuZ2V0UHJlc2VudGF0aW9uKCkuZUdldChhdHRyaWIpOyAKLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJc3RyID0gIHZlLmVHZXQoYXR0cmliKTsgCi0vLwkJCQl9Ci0vLwkJCQlpZihzdHIgPT0gbnVsbCB8fCBzdHIudG9TdHJpbmcoKS5sZW5ndGgoKSA9PSAwKSB7Ci0vLwkJCQkJaWYodmFsdWVzLmlzRW1wdHkoKSkgewotLy8JCQkJCQl2YWx1ZXMuYWRkKHN0cik7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkJZWxzZSB7Ci0vLwkJCQkJdmFsdWVzLmFkZCgwLCBzdHIpOwotLy8JCQkJfQotLy8JCQkJYnJlYWs7Ci0vLwkJCX0KLS8vCQkJZWxzZSBpZihiYXNlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJCU9iamVjdCBzdHI7Ci0vLwkJCQlpZiAoIGlzRGVzYyApIHsKLS8vCQkJCQlzdHIgPSAoKERlc2NyaWJhYmxlRWxlbWVudCl2ZSkuZ2V0UHJlc2VudGF0aW9uKCkuZUdldChhdHRyaWIpOyAKLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJc3RyID0gdmUuZUdldChhdHRyaWIpOyAKLS8vCQkJCX0KLS8vCi0vLwkJCQl2YXJpYWJpbGl0eVR5cGUgPSB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLS8vCQkJCWlmKHZhcmlhYmlsaXR5VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKSB7Ci0vLwkJCQkJaWYoc3RyID09IG51bGwgfHwgc3RyLnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCkgewotLy8JCQkJCQkvLyB1c2UgdGhlIHZhbHVlIG9mIHRoZSBiYXNlCi0vLwkJCQkJCS8vCi0vLwkJCQkJCXZlID0gYmFzZTsKLS8vCQkJCQl9Ci0vLwkJCQkJZWxzZSB7Ci0vLwkJCQkJCXZhbHVlcy5hZGQoMCwgc3RyKTsKLS8vCQkJCQkJYnJlYWs7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkJZWxzZSBpZih2YXJpYWJpbGl0eVR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMKSB7CQkJCQkKLS8vCQkJCQlpZihzdHIgIT0gbnVsbCAmJiBzdHIudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLS8vCQkJCQkJLy8gYWRkIHRvIHRoZSBsaXN0Ci0vLwkJCQkJCS8vCi0vLwkJCQkJCXZhbHVlcy5hZGQoMCwgc3RyKTsKLS8vCQkJCQkJaWYoIWNvbmNhdCkgewotLy8JCQkJCQkJYnJlYWs7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQkJLy8gZ28gdG8gdGhlIGJhc2UKLS8vCQkJCQl2ZSA9IGJhc2U7Ci0vLwkJCQl9Ci0vLwkJCQllbHNlIGlmKHZhcmlhYmlsaXR5VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlRfTElURVJBTCkgewotLy8JCQkJCXZhbHVlcy5hZGQoMCwgc3RyKTsKLS8vCQkJCQlicmVhazsKLS8vCQkJCX0KLS8vCQkJCS8vVE9ETzogaGFuZGxlIENPTlRSSUJVVEVTIEFORCBSRVBMQUNFUwotLy8JCQl9Ci0vLwkJfQotLy8JCQotLy8JCWlmICggdmFsdWVzLnNpemUoKSA9PSAwICkgewotLy8JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLS8vCQl9Ci0vLwkJZWxzZSBpZiAoIHZhbHVlcy5zaXplKCkgPT0xICkgewotLy8JCQlyZXR1cm4gKFN0cmluZyl2YWx1ZXMuZ2V0KDApOwotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLS8vCQkJZm9yIChJdGVyYXRvciBpdCA9IHZhbHVlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQkJaWYgKCBidWZmZXIubGVuZ3RoKCkgPiAwICkgewotLy8JCQkJCWJ1ZmZlci5hcHBlbmQoQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUik7Ci0vLwkJCQl9Ci0vLwkJCQlidWZmZXIuYXBwZW5kKGl0Lm5leHQoKSk7Ci0vLwkJCX0KLS8vCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwkJCQotLy8JCX0KLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGFsbCBwcm9jZXNzZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFByb2Nlc3NlcyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBwbHVnaW5zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTGlzdCBpdGVtcyA9IFRuZ1V0aWwuZ2V0QWxsUHJvY2Vzc2VzKChNZXRob2RQbHVnaW4paXQubmV4dCgpKTsKLQkJCWZvciAoIEl0ZXJhdG9yIGl0cCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7ICkgewotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcylpdHAubmV4dCgpOwotCQkJCWlmICggY2FuU2hvdyhwLCBjb25maWcpICYmICFwcm9jZXNzZXMuY29udGFpbnMocCkgKSB7Ci0JCQkJCXByb2Nlc3Nlcy5hZGQocCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcHJvY2Vzc2VzOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgYWxsIHByb2Nlc3NlcyBpbiB0aGUgcGx1Z2luIGFuZCB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFByb2Nlc3NlcyhNZXRob2RQbHVnaW4gcGx1Z2luLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpdGVtcyA9IFRuZ1V0aWwuZ2V0QWxsUHJvY2Vzc2VzKHBsdWdpbik7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0cCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7ICkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHAgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKWl0cC5uZXh0KCk7Ci0JCQlpZiAoIGNhblNob3cocCwgY29uZmlnKSAmJiAhcHJvY2Vzc2VzLmNvbnRhaW5zKHApICkgewotCQkJCXByb2Nlc3Nlcy5hZGQocCk7Ci0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIHByb2Nlc3NlczsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGFsbCBkZWxpdmVyeSBwcm9jZXNzZXMgaW4gdGhlIHBsdWdpbiBhbmQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbERlbGl2ZXJ5UHJvY2Vzc2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4sIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUxpc3QgcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGl0ZW1zID0gVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJZm9yICggSXRlcmF0b3IgaXRwID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTsgKSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcCA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpaXRwLm5leHQoKTsKLQkJCWlmICggcCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcyApIHsKLQkJCQlpZiAoIGNhblNob3cocCwgY29uZmlnKSAmJiAhcHJvY2Vzc2VzLmNvbnRhaW5zKHApICkgewotCQkJCQlwcm9jZXNzZXMuYWRkKHApOwotCQkJCX0KLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gcHJvY2Vzc2VzOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgYWxsIENhcGFiaWxpdHlQYXR0ZXJucyBpbiB0aGUgcGx1Z2luIGFuZCBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsQ2FwYWJpbGl0eVBhdHRlcm5zKE1ldGhvZFBsdWdpbiBwbHVnaW4sIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUxpc3QgcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGl0ZW1zID0gVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJZm9yICggSXRlcmF0b3IgaXRwID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTsgKSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcCA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpaXRwLm5leHQoKTsKLQkJCWlmICggcCBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuICkgewotCQkJCWlmICggY2FuU2hvdyhwLCBjb25maWcpICYmICFwcm9jZXNzZXMuY29udGFpbnMocCkgKSB7Ci0JCQkJCXByb2Nlc3Nlcy5hZGQocCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgd29yayBwcm9kdWN0cyBtb2RpZmllZCBieSB0aGUgc3BlY2lmaWVkIHJvbGUsIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgUm9sZQotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQgTWV0aG9kRWxlbWVudCB0aGUgb3duZXIgdG8gYWNjZXB0IHRoZSBjYWxjdWxhdGVkIHZhbHVlCi0JICogQHBhcmFtIHJlYWxpemVyCi0JICogQHJldHVybiBMaXN0IGxpc3Qgb2Ygd29yayBwcm9kdWN0cyBiZWluZyBtb2RpZmllZCBieSB0aGUgcm9sZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBjYWxjTW9kaWZpZWRXb3JrUHJvZHVjdHMoUm9sZSBlbGVtZW50LCBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9QcmltYXJ5X1Rhc2tzOwotCQlUb01hbnlPcHBvc2l0ZUZlYXR1cmVWYWx1ZSBmdjIgPSBuZXcgVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUoZWxlbWVudCwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKGVsZW1lbnQsIG9mZWF0dXJlLCByZWFsaXplciwgZnYyKTsKLQkJaWYgKCBmdjIuc2l6ZSgpID4gMCApIHsKLQkJCUxpc3QgdjIgPSAoTGlzdClmdjIuZ2V0VmFsdWUoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB2Mi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLQkJCQlUb01hbnlGZWF0dXJlVmFsdWUgZnYgPSBuZXcgVG9NYW55RmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkJCSgoTGlzdClmdi5nZXRWYWx1ZSgpKS5hZGRBbGwodik7Ci0JCQkJCi0JCQkJY2FsY3VsYXRlRmVhdHVyZShlLCBvd25lckVsZW1lbnQsIAotCQkJCQkJZmVhdHVyZSwgCi0JCQkJCQlyZWFsaXplci5nZXRDb25maWd1cmF0aW9uKCksIGZ2LCByZWFsaXplcik7CQotCQkJCXYgPSAoTGlzdClmdi5nZXRWYWx1ZSgpOwotCQkJfQotCQl9CQotCQkKLQkJcmV0dXJuIHY7Ci0JfQotCQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBtb2RpZmllZCBieSB0aGUgc3BlY2lmaWVkIHJvbGUgZGVzY3JpcHRvciwgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBSb2xlRGVzY3JpcHRvcgotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQgTWV0aG9kRWxlbWVudCB0aGUgb3duZXIgdG8gYWNjZXB0IHRoZSBjYWxjdWxhdGVkIHZhbHVlCi0JICogQHBhcmFtIHJlYWxpemVyCi0JICogQHJldHVybiBMaXN0IGxpc3Qgb2Ygd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIGJlaW5nIG1vZGlmaWVkIGJ5IHRoZSByb2xlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsY01vZGlmaWVkV29ya1Byb2R1Y3REZXNjcmlwdG9ycyhSb2xlRGVzY3JpcHRvciBlbGVtZW50LCBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9yczsKLQkJVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUgZnYyID0gbmV3IFRvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlbGVtZW50LCBvZmVhdHVyZSwgcmVhbGl6ZXIsIGZ2Mik7Ci0JCWlmICggZnYyLnNpemUoKSA+IDAgKSB7Ci0JCQlMaXN0IHYyID0gKExpc3QpZnYyLmdldFZhbHVlKCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHYyLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotCQkJCQotCQkJCVRvTWFueUZlYXR1cmVWYWx1ZSBmdiA9IG5ldyBUb01hbnlGZWF0dXJlVmFsdWUoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCQkJKChMaXN0KWZ2LmdldFZhbHVlKCkpLmFkZEFsbCh2KTsKLQkJCQkKLQkJCQljYWxjdWxhdGVGZWF0dXJlKGUsIG93bmVyRWxlbWVudCwgCi0JCQkJCQlmZWF0dXJlLCAKLQkJCQkJCXJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKSwgZnYsIHJlYWxpemVyKTsJCi0JCQkJdiA9IChMaXN0KWZ2LmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB2OwotCX0KLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHJvbGVzIHRoYXQgbW9kaWZpZXMgdGhlIHNwZWNpZmllZCB3b3JrIHByb2R1Y3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gZWxlbWVudCBXb3JrUHJvZHVjdAotCSAqIEBwYXJhbSByZWFsaXplcgotCSAqIEByZXR1cm4gTGlzdCB0aGUgcm9sZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsY01vZGlmeVJvbGVzKFdvcmtQcm9kdWN0IGVsZW1lbnQsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlMaXN0IHRhc2tzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJZWxlbWVudCwgCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcywgCi0JCQkJcmVhbGl6ZXIpOwotCQlMaXN0IG1vZGlmeVJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGFza3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVRhc2sgdCA9IChUYXNrKWl0Lm5leHQoKTsKLQkJCVJvbGUgciA9IChSb2xlKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKAotCQkJCQl0LCAKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpLCAKLQkJCQkJcmVhbGl6ZXIpOwotCQkJaWYgKCAociAhPSBudWxsKSAmJiAhbW9kaWZ5Um9sZXMuY29udGFpbnMocikgKSB7Ci0JCQkJbW9kaWZ5Um9sZXMuYWRkKHIpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbW9kaWZ5Um9sZXM7Ci0JfQotCQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgcm9sZSBkZXNjcmlwdG9ycyB0aGF0IG1vZGlmaWVzIHRoZSBzcGVjaWZpZWQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gZWxlbWVudCBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAcGFyYW0gcmVhbGl6ZXIKLQkgKiBAcmV0dXJuIExpc3QgdGhlIHJvbGUgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsY01vZGlmeVJvbGVEZXNjcmlwdG9ycyhXb3JrUHJvZHVjdERlc2NyaXB0b3IgZWxlbWVudCwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCUxpc3QgdGFza0Rlc2NyaXB0b3JzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJZWxlbWVudCwgCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzLCAKLQkJCQlyZWFsaXplcik7Ci0JCUxpc3QgbW9kaWZ5Um9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB0YXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVRhc2tEZXNjcmlwdG9yIHQgPSAoVGFza0Rlc2NyaXB0b3IpaXQubmV4dCgpOwotCQkJUm9sZURlc2NyaXB0b3IgciA9IChSb2xlRGVzY3JpcHRvcilDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSgKLQkJCQkJdCwgCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksIAotCQkJCQlyZWFsaXplcik7Ci0JCQlpZiAoIChyICE9IG51bGwpICYmICFtb2RpZnlSb2xlcy5jb250YWlucyhyKSApIHsKLQkJCQltb2RpZnlSb2xlcy5hZGQocik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBtb2RpZnlSb2xlczsKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGFjdGl2aXR5IGlzIGEgY29udHJpYnV0b3IgCi0JICogb3IgY29udGFpbnMgYW55IHN1Yi1hY3Rpdml0aWVzIHRoYXQgYXJlIGNvbnRyaWJ1dG9ycwotCSAqIEBwYXJhbSBlbGVtZW50IEFjdGl2aXR5Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0NvbnRyaWJ1dG9yKEFjdGl2aXR5IGVsZW1lbnQpIHsKLQkJaWYgKCBpc0NvbnRyaWJ1dG9yKGVsZW1lbnQpICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGVsZW1lbnQuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoICEobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaWYgKCBoYXNDb250cmlidXRvciggKEFjdGl2aXR5KW8gKSApIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGJhc2UgcHJvY2Vzc2VzIGZvciBhbiB7QGxpbmsgQWN0aXZpdHl9IGluIHRoZSBDb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEJhc2VQcm9jZXNzZXMoQWN0aXZpdHkgZWxlbWVudCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCB2YWx1ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0QmFzZVByb2Nlc3NlcyhlbGVtZW50LCBjb25maWcsIHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgYWxsIGJhc2UgcHJvY2Vzc2VzIGZvciBhbiBhY3Rpdml0eSBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZSBMaXN0IHRoZSBiYXNlcyBwcm9jZXNzZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0QmFzZVByb2Nlc3NlcyhBY3Rpdml0eSBlbGVtZW50LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTGlzdCB2YWx1ZSkgewotCQkKLQkJLy8gZ2V0IGl0J3Mgb3duIGJhc2UKLQkJaWYgKCBDb25maWd1cmF0aW9uSGVscGVyLmlzRXh0ZW5kZXIoZWxlbWVudCkgKSB7Ci0JCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KWVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKCBiYXNlICE9IG51bGwgCi0JCQkJCSYmICF2YWx1ZS5jb250YWlucyhiYXNlKSAKLQkJCQkJJiYgKGJhc2UgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpICkgewotCQkJCWlmICggY2FuU2hvdyhiYXNlLCBjb25maWcpICkgewotCQkJCQl2YWx1ZS5hZGQoYmFzZSk7Ci0JCQkJfQotCQkJCWdldEJhc2VQcm9jZXNzZXMoYmFzZSwgY29uZmlnLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGlmIHRoZSBzdWItYWN0aXZpdGllcyBoYXZlIGJhc2UsIHByb2Nlc3MgaXQKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBlbGVtZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKCBvIGluc3RhbmNlb2YgQWN0aXZpdHkgKSB7Ci0JCQkJZ2V0QmFzZVByb2Nlc3NlcygoQWN0aXZpdHkpbywgY29uZmlnLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uc0xhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbnNMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5ZWM5MjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uc0xhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgbm90IHVzZWQgYW55IG1vcmUuIHdpbGwgYmUgcmVtb3ZlZCBsYXRlcgotICpAZGVwcmVjYXRlZAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25zTGFiZWxQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciB7Ci0KLQlNZXRob2RDb25maWd1cmF0aW9uW10gY29uZmlncyA9IG51bGw7Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbnNMYWJlbFByb3ZpZGVyKE1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmNvbmZpZ3MgPSBjb25maWdzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgSUxhYmVsUHJvdmlkZXJ9LmdldEltYWdlIGJ5IGZvcndhcmRpbmcgaXQgdG8gYW4KLQkgKiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElJdGVtTGFiZWxQcm92aWRlciNnZXRJbWFnZSBJSXRlbUxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2V9Ci0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gYnkgZGVmYXVsdCwgcmV0dXJuIHRoZSBkZWZhdWx0IGltYWdlCi0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZUZyb21PYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIElMYWJlbFByb3ZpZGVyfS5nZXRUZXh0IGJ5IGZvcndhcmRpbmcgaXQgdG8gYW4KLQkgKiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElJdGVtTGFiZWxQcm92aWRlciNnZXRUZXh0IElJdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0fQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCS8vIGhhY2tpbmcgaGVyZSwgbmVlZCB0byByZS13b3JrLi4uLgotCQkJbmFtZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0TmFtZSgoTWV0aG9kRWxlbWVudCkgb2JqZWN0LAotCQkJCQljb25maWdzWzBdKTsKLQkJfQotCi0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCW5hbWUgPSAoKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJbmFtZSA9IHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0RlZmF1bHRFbGVtZW50UmVhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRGVmYXVsdEVsZW1lbnRSZWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOTcxOTA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRGVmYXVsdEVsZW1lbnRSZWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVhbGl6ZXIuCi0gKiBSZWFsaXplcyB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgcmVhbGl6ZSBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVsZW1lbnRSZWFsaXplciBleHRlbmRzIEVsZW1lbnRSZWFsaXplciB7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZSBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGNvbmZpZyBNZXRob2RDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIERlZmF1bHRFbGVtZW50UmVhbGl6ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoY29uZmlnKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBhbmQgYWRkaXRpb25hbCByZWFsaXphdGlvbiBvcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSByZXNvbHZlQ29udHJpYnV0b3IgYm9vbGVhbiBpZiB0cnVlLCBjb250cnVidXRvcnMgZnJvbSBmZWF0dXJlIHZhbHVlIGxpc3Qgd2lsbCBiZSByZXNvbHZlZC4gZGVmYXVsdCB0byBmYWxzZS4KLQkgKiBAcGFyYW0gcmVzb2x2ZVJlcGxhY2VyIGJvb2xlYW4gaWYgdHVyZSwgZWxlbWVudCB3aXRoIGEgcmVwbGFjZXIgd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgcmVwbGFjZXIuIGRlZmF1bHQgdG8gdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgRGVmYXVsdEVsZW1lbnRSZWFsaXplcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCWJvb2xlYW4gcmVzb2x2ZUNvbnRyaWJ1dG9yLCBib29sZWFuIHJlc29sdmVSZXBsYWNlcikgewotCQlzdXBlcihjb25maWcsIHJlc29sdmVDb250cmlidXRvciwgcmVzb2x2ZVJlcGxhY2VyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBFbGVtZW50UmVhbGl6ZXIucmVhbGl6ZQotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBzdXBlci5yZWFsaXplKGVsZW1lbnQpOwotCX0KLQkKLQkvKioKLQkgKiByZWFsaXplIHRoZSBsaXN0IG9mIGZlYXR1cmUgdmFsdWVzIGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgb2YgdmFsdWVzCi0JICogVGhlIG5ldyBtaWdodCBiZSBhIHJlLXNvcnRpbmcgb2YgdGhlIG9yaWdpbmFsIGxpc3QgCi0JICogb3Igc29tZSBvZiB0aGUgdmFsdWVzIGNhbiBiZSBmaWx0ZXJlZCBvdXQsIGRlcGVuZGluZyBvbiB0aGUgZGV0YWlsIGltcGxlbWVudGF0aW9uCi0JICogTm90ZTogdGhlIGxpc3QgdmFsdWUgcGFzc2VkIGluIG1pZ2h0IGJlIHVwZGF0ZWQgYXMgd2VsbC4KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlcyBMaXN0Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgcmVhbGl6ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIExpc3QgdmFsdWVzKQotCXsKLQkJaWYgKCB2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm4gdmFsdWVzOwotCQl9Ci0JCQotCQkvLyBXcm9uZyAibW9kaWZpZXMiIGluZm9ybWF0aW9uIHB1Ymxpc2hlZCBpbiB0ZWFtIGFsbG9jYXRpb24gdmlldyBmb3Igc21hbGwgY29uZmlndXJhdGlvbgotCQkvLyBhZGRlZCBmaWx0ZXIgdG8gY2xlYW4gdXAgdW4td2FudGVkIGl0ZW1zCi0JCWlmICggc3VwZXIuZmlsdGVyICE9IG51bGwgKSB7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLQkJCQlNZXRob2RFbGVtZW50IG8gPSAoTWV0aG9kRWxlbWVudCkgdmFsdWVzLmdldChpKTsKLQotCQkJCWlmICggIWZpbHRlci5hY2NlcHQobykgKSB7Ci0JCQkJCXZhbHVlcy5yZW1vdmUoaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQotCQkvLyBpZiB0aGUgZmVhdHVyZSB2YWx1ZSBpcyBjb250YWlubWVudCBlbGVtZW50IHN1Y2ggYXMgYXJ0aWZhY3QKLQkJLy8gdGhlIGNoaWxkIGVsZW1lbnQgY2FuJ3Qgc2hvdyBpZiBhbnkgb2YgdGhlIHBhcmVudChzKSBhcmUgaW4gdGhlIGxpc3QKLQkJLy8gMDAzODQ2MTkgLSBQdWJsaXNoZWQgc2l0ZTogRGlzcGxheSBvZiBXUHMgdW5kZXIgcmVzcG9uc2libGUgcm9sZQotCQkKLQkJLy8gdGhpcyBpcyBub3QgYSBnZW5lcmFsIHJ1bGUuIG9ubHkgYXBwbHkgdG8gdGhlIHB1Ymxpc2hlZCBuYXZpZ2F0aW9uIHRyZWUuCi0JCS8vIHNvIG1vdmUgdGhpcyBsb2dpYyB0byB0aGUgdHJlZSBnZW5lcmF0aW9uIGNvZGUgaW4gcHVibGlzaGluZwotCQkvLyBnZWVucmFsbHksIHNob3cgYWxsIGVsZW1lbnRzLCBzZWUgYnVnCi0JCS8vIDAwMzg2NzY1IC0gUm9sZSByZXNwb25zaWJpbGl0aWVzIG5lZWQgdG8gc2hvdyAoY29udHJpYnV0ZWQpIHN1Yi1hcnRpZmFjdHMJCi0vLwkJaWYgKGZlYXR1cmUuaXNNYW55KCkgJiYgdmFsdWVzLnNpemUoKSA+IDAKLS8vCQkJCSYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250YWlubWVudEVsZW1lbnQodmFsdWVzLmdldCgwKSkpIHsKLS8vCQkJaW50IGkgPSAwOwotLy8JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLS8vCQkJCU1ldGhvZEVsZW1lbnQgbyA9IChNZXRob2RFbGVtZW50KSB2YWx1ZXMuZ2V0KGkpOwotLy8KLS8vCQkJCS8vIGlmIHRoZSBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGxpc3QsIHJlbW92ZSB0aGlzCi0vLwkJCQkvLyBlbGVtZW50IGZyb20gdGhlIGxpc3QKLS8vCQkJCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udGFpbmVySW5MaXN0KG8sIHZhbHVlcywgY29uZmlnKSkgewotLy8JCQkJCXZhbHVlcy5yZW1vdmUoaSk7Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCWkrKzsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQotCQkvLyBuZWVkIHRvIHNvcnQgdGhlIGNvbmNlcHQgYW5kIHBhcGVycyBieSB0eXBlCi0JCWlmICgoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpKQotCQkJCSYmICh2YWx1ZXMuc2l6ZSgpID4gMCkpIHsKLQkJCUxpc3QgcGFwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB2YWx1ZXMuc2l6ZSgpKSB7Ci0JCQkJT2JqZWN0IG8gPSB2YWx1ZXMuZ2V0KGkpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgV2hpdGVwYXBlcikgewotCQkJCQlwYXBlcnMuYWRkKG8pOwotCQkJCQl2YWx1ZXMucmVtb3ZlKGkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChwYXBlcnMuc2l6ZSgpID4gMCkgewotCQkJCXZhbHVlcy5hZGRBbGwocGFwZXJzKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0VsZW1lbnREZXBlbmRlbmN5RXJyb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRWxlbWVudERlcGVuZGVuY3lFcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMWFhMTIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRWxlbWVudERlcGVuZGVuY3lFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaG9sZHMgdGhlIGVsZW1lbnQgZGVwZW5kZW5jeSBlcnJvciBpbiBhIGNvbmZpZ3VyYXRpb24gY2xvc3VyZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnREZXBlbmRlbmN5RXJyb3IgewotCi0JcHJpdmF0ZSBPYmplY3QgZXJyb3JFbGVtZW50OwotCi0JLyoqCi0JICogbWFwIG9mIGNhdXNlZWxlbWVudCB0byB0aGUgRXJyb3JJbmZvIG9iamVjdAotCSAqLwotCXByaXZhdGUgTWFwIGVycm9ySW5mb01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIGludCBlcnJvckJpdHMgPSAwOwotCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBFbGVtZW50RGVwZW5kZW5jeUVycm9yKE9iamVjdCBlbGVtZW50KSB7Ci0JCXRoaXMuZXJyb3JFbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgZXJyb3IKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RXJyb3JFbGVtZW50KCkgewotCQlyZXR1cm4gZXJyb3JFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudHMgdGhhdCBjYXVzZWQgdGhlIGVycm9yCi0JICogQHJldHVybiBPYmplY3RbXQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDYXVzZUVsZW1lbnRzKCkgewotCQlyZXR1cm4gZXJyb3JJbmZvTWFwLmtleVNldCgpLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGNvdW50IG9mIHRoZSBlcnJvciBpbmZvIGVudHJ5Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBlcnJvckluZm9NYXAuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIGFkZCBhbiBlcnJvciBlbnRyeQotCSAqIEBwYXJhbSBlcnJvckluZm8gRXJyb3JJbmZvCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXJyb3IoRXJyb3JJbmZvIGVycm9ySW5mbykgewotCQllcnJvckluZm9NYXAucHV0KGVycm9ySW5mby5nZXRDYXVzZUVsZW1lbnQoKSwgZXJyb3JJbmZvKTsKLQkJZXJyb3JCaXRzIHw9IGVycm9ySW5mby5nZXRFcnJvclR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmUgdGhlIGVycm9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2F1c2VFbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGNhdXNlRWxlbWVudAotCSAqICAgICAgICAgICAgT2JqZWN0IHRoZSBlbGVtZW50IHRoYXQgY2F1c2VkIHRoZSBlcnJvcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUVycm9yKE9iamVjdCBjYXVzZUVsZW1lbnQpIHsKLQkJZXJyb3JJbmZvTWFwLnJlbW92ZShjYXVzZUVsZW1lbnQpOwotCi0JCS8vIHJlY2FsY3VsYXRlIHRoZSBlcnJvciBiaXRzCi0JCWNhbGN1bGF0ZUVycm9yQml0cygpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZSB0aGUgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYXVzZUVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gY2F1c2VFbGVtZW50Ci0JICogICAgICAgICAgICBPYmplY3QgdGhlIGVsZW1lbnQgdGhhdCBjYXVzZWQgdGhlIGVycm9yCi0JICovCi0JcHVibGljIEVycm9ySW5mbyBnZXRFcnJvcihPYmplY3QgY2F1c2VFbGVtZW50KSB7Ci0JCXJldHVybiAoRXJyb3JJbmZvKSBlcnJvckluZm9NYXAuZ2V0KGNhdXNlRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGEgbGlzdCBvZiBhbGwgRXJySW5mbyBvYmplY3RzCi0JICogCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBFcnJvckluZm8gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFsbCgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoZXJyb3JJbmZvTWFwLnZhbHVlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayB0aGlzIGlzIGFuIGVycm9yIG9yIG5vdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgewotCQlyZXR1cm4gKGVycm9yQml0cyAmIEVycm9ySW5mby5FUlJPUikgPiAwOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoaXMgaXMgYSB3YXJuaW5nCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXYXJuaW5nKCkgewotCQlyZXR1cm4gKGVycm9yQml0cyAmIEVycm9ySW5mby5XQVJOSU5HKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhpcyBpcyBkdWUgdG8gYW4gZXJyb3IgaW4gaXQncyBjaGlsZHJlbgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRFcnJvcigpIHsKLQkJcmV0dXJuIChlcnJvckJpdHMgJiBFcnJvckluZm8uQ0hJTERfRVJST1IpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGlzIGlzIGR1ZSB0byBhIHdhcm5pbmcgaW4gaXQncyBjaGlsZHJlbgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRXYXJuaW5nKCkgewotCQlyZXR1cm4gKGVycm9yQml0cyAmIEVycm9ySW5mby5DSElMRF9XQVJOSU5HKSA+IDA7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZUVycm9yQml0cygpIHsKLQkJZXJyb3JCaXRzID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVycm9ySW5mb01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQllcnJvckJpdHMgfD0gKChFcnJvckluZm8pIGl0Lm5leHQoKSkuZ2V0RXJyb3JUeXBlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRWxlbWVudFJlYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0VsZW1lbnRSZWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NGZiMTQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRWxlbWVudFJlYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogUmVhbGl6ZXMgdGhlIGVsZW1lbnQgYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHJlYWxpemUgb3B0aW9ucy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVsZW1lbnRSZWFsaXplciB7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQkvLyBub3RlOiBkaXNjYXJkIGNvbnRyaWJ1dG9yIHRha2VzIGhpZ2hlciBwcmlvcml0eSwgaWYgc2V0IHRvIHRydWUsCi0JLy8gcmVzb2x2ZUNvbnRyaWJ1dG9yIHdpbGwgYmUgaWdub3JlZAotCXByaXZhdGUgYm9vbGVhbiBkaXNjYXJkQ29udHJpYnV0b3IgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlQ29udHJpYnV0b3IgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIHJlc29sdmVSZXBsYWNlciA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvd1N1YnRyYWN0ZWQgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgSUZpbHRlciBmaWx0ZXIgPSBudWxsOwotCQotCS8vIHRoaXMgaXMgdGhlIGRlZmF1bHQgc2V0dGluZyBiYXNlZCBvbiB0aGUgcHJlZmVyZW5jZSBzZXR0aW5nCi0JLy8gc3ViY2xhc3Mgc2hvdWxkIGltcGxlbWVudCB0aGVpciBvd24gbWV0aG9kIHRoZSBnZXQgdGhlIHZhbHVlCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWZhdWx0RW5hYmxlRXh0ZW5kUmVwbGFjZSA9IGZhbHNlOwotCQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVmYXVsdElnbm9yZUJhc2VUb01hbnlBc3NvY2lhdGlvbnMgPSBmYWxzZTsKLQotCXN0YXRpYyB7Ci0JCVN0cmluZyBzdHIgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmcoIkVuYWJsZUV4dGVuZFJlcGxhY2UiKTsKLQkJaWYgKCBzdHIgIT0gbnVsbCAmJiBzdHIudHJpbSgpLmVxdWFscygidHJ1ZSIpICkgewotCQkJZGVmYXVsdEVuYWJsZUV4dGVuZFJlcGxhY2UgPSB0cnVlOwotCQl9Ci0JCQotCQkvLyBub3QgaW4gcHJvcGVydHkgZmlsZSBhbnkgbW9yZQotCQkvLyBkZWZpbmVkIGFzIGEgcHJlZmVybmVjZQotLy8JCXN0ciA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZygiSWdub3JlQmFzZVRvTWFueUFzc29jaWF0aW9ucyIpOwotLy8JCWlmICggc3RyICE9IG51bGwgJiYgc3RyLnRyaW0oKS5lcXVhbHMoInRydWUiKSApIHsKLS8vCQkJZGVmYXVsdElnbm9yZUJhc2VUb01hbnlBc3NvY2lhdGlvbnMgPSB0cnVlOwotLy8JCX0KLQkJLy8gMTcxODgyIC0gRXh0ZW5kcy1SZXBsYWNlIFZhcmlhYmlsaXR5Ci0JCWRlZmF1bHRJZ25vcmVCYXNlVG9NYW55QXNzb2NpYXRpb25zID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCS5nZXRCb29sZWFuKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRVhURU5EX1NFTUFOVElDU19DSEVDSyk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZSBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGNvbmZpZyBNZXRob2RDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIEVsZW1lbnRSZWFsaXplcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzKGNvbmZpZywgdHJ1ZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0IGFuIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gYW5kIGFkZGl0aW9uYWwgcmVhbGl6YXRpb24gb3B0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcmVzb2x2ZUNvbnRyaWJ1dG9yIGJvb2xlYW4gaWYgdHJ1ZSwgY29udHJ1YnV0b3JzIGZyb20gZmVhdHVyZSB2YWx1ZSBsaXN0IHdpbGwgYmUgcmVzb2x2ZWQuIGRlZmF1bHQgdG8gZmFsc2UuCi0JICogQHBhcmFtIHJlc29sdmVSZXBsYWNlciBib29sZWFuIGlmIHR1cmUsIGVsZW1lbnQgd2l0aCBhIHJlcGxhY2VyIHdpbGwgYmUgcmVzb2x2ZWQgdG8gdGhlIHJlcGxhY2VyLiBkZWZhdWx0IHRvIHRydWUuCi0JICovCi0JcHVibGljIEVsZW1lbnRSZWFsaXplcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCWJvb2xlYW4gcmVzb2x2ZUNvbnRyaWJ1dG9yLCBib29sZWFuIHJlc29sdmVSZXBsYWNlcikgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5yZXNvbHZlQ29udHJpYnV0b3IgPSByZXNvbHZlQ29udHJpYnV0b3I7Ci0JCXRoaXMucmVzb2x2ZVJlcGxhY2VyID0gcmVzb2x2ZVJlcGxhY2VyOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBpcyBleHRlbmQtcmVwbGFjZSBlbmFibGVkIGZvciByZXBsYWNlbWVudAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkgewotCQlyZXR1cm4gZGVmYXVsdEVuYWJsZUV4dGVuZFJlcGxhY2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpZ25vcmVCYXNlVG9NYW55QXNzb2NpYXRpb25zKCkgewotCQlyZXR1cm4gZGVmYXVsdElnbm9yZUJhc2VUb01hbnlBc3NvY2lhdGlvbnM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJZ25vcmVCYXNlVG9NYW55QXNzb2NpYXRpb25zKGJvb2xlYW4gZmxhZykgewotCQlkZWZhdWx0SWdub3JlQmFzZVRvTWFueUFzc29jaWF0aW9ucyA9IGZsYWc7Ci0JfQotCQotCS8qKgotCSAqIHNldCB0aGUgZmxhZy4gaWYgdHJ1ZSwgdGhlIGNvbnRyaWJ1dG9ycyBmcm9tIGEgcmVhbGl6ZWQgZmVhdHVyZSBsaXN0IHdpbGwgYmUgZGlzY2FyZGVkCi0JICogCi0JICogQHBhcmFtIGRpc2NhcmRDb250cmlidXRvciBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzY2FyZENvbnRyaWJ1dG9yKGJvb2xlYW4gZGlzY2FyZENvbnRyaWJ1dG9yKSB7Ci0JCXRoaXMuZGlzY2FyZENvbnRyaWJ1dG9yID0gZGlzY2FyZENvbnRyaWJ1dG9yOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZmxhZy4gaWYgdHJ1ZSB0aGUgY29udHJpYnV0b3JzIHdpbGwgYmUgcmVzb2x2ZWQuCi0JICogQHBhcmFtIHJlc29sdmVDb250cmlidXRvciBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb2x2ZUNvbnRyaWJ1dG9yKGJvb2xlYW4gcmVzb2x2ZUNvbnRyaWJ1dG9yKSB7Ci0JCXRoaXMucmVzb2x2ZUNvbnRyaWJ1dG9yID0gcmVzb2x2ZUNvbnRyaWJ1dG9yOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZmxhZy4gaWYgdHJ1ZSB0aGUgZWxlbWVudCB3aXRoIGEgcmVwbGFjZXIgd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgcmVwbGFjZXIuCi0JICogCi0JICogQHBhcmFtIHJlc29sdmVSZXBsYWNlciBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb2x2ZVJlcGxhY2VyKGJvb2xlYW4gcmVzb2x2ZVJlcGxhY2VyKSB7Ci0JCXRoaXMucmVzb2x2ZVJlcGxhY2VyID0gcmVzb2x2ZVJlcGxhY2VyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3dTdWJ0cmFjdGVkKCkgewotCQlyZXR1cm4gc2hvd1N1YnRyYWN0ZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNob3dTdWJ0cmFjdGVkKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnNob3dTdWJ0cmFjdGVkID0gZmxhZzsKLQl9Ci0JCi0KLQkvKioKLQkgKiBzZXQgYSBmaWx0ZXIgZm9yIHRoaXMgcmVhbGl6ZXIKLQkgKiBAcGFyYW0gZmlsdGVyIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0eWhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JCi0JLyoqCi0JICogcmVhbGl6ZSB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCByZWFsaXplKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCAhaW5Db25maWcoZWxlbWVudCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gV29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIHRoYXQgcG9pbnQgdG8gd29yayBwcm9kdWN0cwotCQkvLyBvdXRzaWRlIHRoZSBjb25maWd1cmF0aW9uIGFyZSBzdGlsbCBwdWJsaXNoZWQKLQkJLy8gbGlua2VkIGVsZW1lbnQgbXVzdCBiZSBpbiBjb25maWcgYXMgd2VsbAotCQlNZXRob2RFbGVtZW50IGxpbmtlZEVsZW1lbnQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0VGFzaygpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRSb2xlKCk7Ci0JCX0KLQotCQlpZiAoKGxpbmtlZEVsZW1lbnQgIT0gbnVsbCkKLQkJCQkmJiAhaW5Db25maWcobGlua2VkRWxlbWVudCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gaWYgbm8gY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpZWQsIGRvbid0IGNhbGN1bGF0ZQotCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZTsKLQotCQkJLy8gaWYgZGlzY2FyZENvbnRyaWJ1dG9yIHNldCB0byB0cnVlLCBkaXNjYXJkIHRoZSBjb250cmlidXRvciBhbmQKLQkJCS8vIHJldHVybiBudWxsCi0JCQlpZiAoZGlzY2FyZENvbnRyaWJ1dG9yICYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250cmlidXRvcih2ZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJaWYgKHJlc29sdmVDb250cmlidXRvcikgewotCQkJCS8vIGlmIHRoZSBlbGVtZW50IGlzIGEgY29udHJpYnV0b3IsIHJlc292bGUgdG8gaXQncyBiYXNlCi0JCQkJd2hpbGUgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250cmlidXRvcih2ZSkpIHsKLQkJCQkJZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJaWYgKGluQ29uZmlnKGUpKSB7Ci0JCQkJCQl2ZSA9IGU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBpZiB0aGUgYmFzZSBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGl0J3MgYW4KLQkJCQkJCS8vIGVycm9yCi0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJDb25maWd1cmF0aW9uIGNsb3N1cmUgZXJyb3I6IEJhc2UgZWxlbWVudCAnIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHZlKSArICInIG5vdCBpbiBjb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZXNvbHZlUmVwbGFjZXIpIHsKLQkJCQllID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcih2ZSwgY29uZmlnKTsKLQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIWluQ29uZmlnKHZlKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhIHJlcGxhY2VyLCBhbmQgdGhlIGJhc2UgaXMgYSBjb250cmlidXRvciwgCi0JCQkvLyBuZWVkIHRvIHJlc29sdmUgdGhlIGVsZW1lbnQgdG8gdGhlIGJhc2UgaWYgcmVzb2x2ZUNvbnRyaWJ1dG9yIGlzIHRydWUKLQkJCS8vIDE1MjIzMCAtIEJyb3dzaW5nOiBSb2xlPC0tPldQIHJlbGF0aW9uc2hpcCBzaG93cyBpbmNvbnNpc3RhbmN5Ci0JCQllID0gdmU7Ci0JCQl3aGlsZSAoKGUgIT0gbnVsbCkgJiYgQ29uZmlndXJhdGlvbkhlbHBlci5pc1JlcGxhY2VyKGUpKSB7Ci0JCQkJZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udHJpYnV0b3IoZSkpIHsKLQkJCQkJcmV0dXJuIHJlYWxpemUoZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBjYW4ndCByZXR1cm4gaGVyZSwgbmVlZCB0byBjaGVjayBjYW5TaG93Ci0JCQkvLyByZXR1cm4gdmU7Ci0JCQlpZiAoY2FuU2hvdyh2ZSkpIHsKLQkJCQlyZXR1cm4gdmU7Ci0JCQl9Ci0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGNhblNob3coZWxlbWVudCkpIHsKLQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmVhbGl6ZSB0aGUgbGlzdCBvZiBmZWF0dXJlIHZhbHVlcyBhbmQgcmV0dXJucyBhIG5ldyBsaXN0IG9mIHZhbHVlcwotCSAqIFRoZSBuZXcgbWlnaHQgYmUgYSByZS1zb3J0aW5nIG9mIHRoZSBvcmlnaW5hbCBsaXN0IAotCSAqIG9yIHNvbWUgb2YgdGhlIHZhbHVlcyBjYW4gYmUgZmlsdGVyZWQgb3V0LCBkZXBlbmRpbmcgb24gdGhlIGRldGFpbCBpbXBsZW1lbnRhdGlvbgotCSAqIE5vdGU6IHRoZSBsaXN0IHZhbHVlIHBhc3NlZCBpbiBtaWdodCBiZSB1cGRhdGVkIGFzIHdlbGwuCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEBwYXJhbSB2YWx1ZXMgTGlzdAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBMaXN0IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIExpc3QgdmFsdWVzKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGluQ29uZmlnKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZyhlbGVtZW50LCBjb25maWcsICFzaG93U3VidHJhY3RlZCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TaG93KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYW5TaG93KGVsZW1lbnQsIGNvbmZpZywgIXNob3dTdWJ0cmFjdGVkKCkpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRXJyb3JJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0Vycm9ySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMmViNjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRXJyb3JJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBBbiBFcnJvckluZm8gb2JqZWN0IGhvbGRzIHRoZSBlcnJvciBtZXNzYWdlIGluZm8gY2F1c2VkIGJ5IGFuIGVsZW1lbnQuIFRoZQotICogRXJyb3JJbmZvIG9iamVjdCBpcyBvd25lZCBieSB0aGUgb3duZXIgZWxlbWVudCB3aGljaCBoYXMgdGhpcyBlcnJvcgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JJbmZvIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hJTERfRVJST1IgPSA0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hJTERfV0FSTklORyA9IDg7Ci0KLQkvKioKLQkgKiB0aGlzIGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBvd25lciBlbGVtZW50IGFuZCB0aGUgY2F1c2UgZWxlbWVudC4gCi0JICogVGhlIG93bmVyIGVsZW1lbnQgcmVmZXJlbmNlcyB0byB0aGUgdGhlIGNhdXNlIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUZFUkVOQ0VfVE8gPSAxNjsKLQotCS8qKgotCSAqIHRoaXMgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG93bmVyIGVsZW1lbnQgYW5kIHRoZSBjYXVzZSBlbGVtZW50LiAKLQkgKiBUaGUgb3duZXIgZWxlbWVudCBpcyByZWZlcmVuY2VkIGJ5IHRoZSB0aGUgY2F1c2UgZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFRkVSRU5DRURfQlkgPSAzMjsKLQotCXByaXZhdGUgaW50IGVycm9yVHlwZTsKLQotCXByaXZhdGUgT2JqZWN0IG93bmVyRWxlbWVudDsKLQotCXByaXZhdGUgT2JqZWN0IGNhdXNlRWxlbWVudDsKLQotCXByaXZhdGUgU3RyaW5nIGVycm9yTWVzc2FnZTsKLQotCXByaXZhdGUgaW50IHJlbGF0aW9uID0gMDsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIGVycm9yVHlwZSBpbnQgdGhlIGVycm9yIHR5cGUKLQkgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IE9iamVjdCwgdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoaXMgZXJyb3IKLQkgKiBAcGFyYW0gY2F1c2VFbGVtZW50IE9iamVjdCwgdGhlIGVsZW1lbnQgdGhhdCBjYXVzZWQgdGhpcyBlcnJvcgotCSAqIEBwYXJhbSByZWxhdGlvbiBpbnQgdGhlIHJlbGF0aGlvc2hpcCBiZXR3ZWVuIHRoZSBvd25lciBlbGVtZW50IGFuZCB0aGUgY2F1c2UgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgRXJyb3JJbmZvKGludCBlcnJvclR5cGUsIFN0cmluZyBtZXNzYWdlLCBPYmplY3Qgb3duZXJFbGVtZW50LAotCQkJT2JqZWN0IGNhdXNlRWxlbWVudCwgaW50IHJlbGF0aW9uKSB7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50OwotCQl0aGlzLmNhdXNlRWxlbWVudCA9IGNhdXNlRWxlbWVudDsKLQkJdGhpcy5lcnJvclR5cGUgPSBlcnJvclR5cGU7Ci0JCXRoaXMuZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLQkJdGhpcy5yZWxhdGlvbiA9IHJlbGF0aW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRSZWxhdGlvbigpIHsKLQkJcmV0dXJuIHJlbGF0aW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRPd25lckVsZW1lbnQoKSB7Ci0JCXJldHVybiBvd25lckVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENhdXNlRWxlbWVudCgpIHsKLQkJcmV0dXJuIGNhdXNlRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFcnJvclR5cGUoKSB7Ci0JCXJldHVybiBlcnJvclR5cGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFcnJvcigpIHsKLQkJcmV0dXJuIChlcnJvclR5cGUgJiBFUlJPUikgPiAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2FybmluZygpIHsKLQkJcmV0dXJuIChlcnJvclR5cGUgJiBXQVJOSU5HKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDaGlsZEVycm9yKCkgewotCQlyZXR1cm4gKGVycm9yVHlwZSAmIENISUxEX0VSUk9SKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDaGlsZFdhcm5pbmcoKSB7Ci0JCXJldHVybiAoZXJyb3JUeXBlICYgQ0hJTERfV0FSTklORykgPiAwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9GZWF0dXJlVmFsdWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRmVhdHVyZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0NmFiMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9GZWF0dXJlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBpZGVudGlmeSB0aGUgZmVhdHVyZSB2YWx1ZSBhbmQgdGhlIG93bmluZyBlbGVtZW50LiAKLSAqIHRoaXMgaGVscHMgdG8gaWRlbnRpZnkgd2hlcmUgdGhlIHZhbHVlIGlzIGNvbWluZyBmcm9tLiAKLSAqIEZvciBleGFtcGxlLCB0aGUgcmVhbGl6ZWQgdmFsdWUgY2FuIGJlIGZyb20gdGhlIGJhc2UgZWxlbWVudCBhcyB3ZWxsIGFzIGNvbnRyaWJ1dG9ycwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotYWJzdHJhY3QgY2xhc3MgRmVhdHVyZVZhbHVlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX05VTExfID0gIl9OVUxMXyI7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBlbGVtZW50OyAgLy8gdGhlIGVsZW1lbnQKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQ7ICAvLyB0aGUgY29udGFpbmVyIG9mIHRoZSBlbGVtZW50Ci0JcHJvdGVjdGVkIE9iamVjdCBmZWF0dXJlOyAvLyBFU3RydWN0cnVhbEZlYXR1cmUgb3IgT3Bwb3NpdGVmZWF0dXJlCi0JcHJvdGVjdGVkIEVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8qKgotCSAqIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudCB0aGUgZWxlbWVudCB0aGF0IHRoZSB2YWx1ZSBpcyBjYWxjdWF0ZWQgZm9yLiAKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoZSB2YWx1ZQotCSAqIEBwYXJhbSBmZWF0dXJlIE9iamVjdCBlaXRoZXIgRVN0cnVjdHVyYWxGZWF0dXJlIG9yIE9wcG9zaXRlRmVhdHVyZS4KLQkgKiBAcGFyYW0gcmVhbGl6ZXIgRWxlbWVudFJlYWxpemVyCi0JICovCi0JcHVibGljIEZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBPYmplY3QgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLnJlYWxpemVyID0gcmVhbGl6ZXI7Ci0JfQotCi0JYWJzdHJhY3QgcHVibGljIHZvaWQgYWRkKFZhcmlhYmlsaXR5RWxlbWVudCBvd25lciwgT2JqZWN0IHZhbHVlKTsKLQlhYnN0cmFjdCBwdWJsaWMgaW50IHNpemUoKTsKLQlhYnN0cmFjdCBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgb3duZXIgZWxlbWVudAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE93bmVyRWxlbWVudCgpIHsKLQkJcmV0dXJuIG93bmVyRWxlbWVudDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBFU3RydWN0dXJhbEZlYXR1cmUuIHJldHVybiBudWxsIGlmIGl0J3Mgbm90IGEgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlpZiAoIGZlYXR1cmUgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUgKSB7Ci0JCQlyZXR1cm4gKEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBPcHBvc2l0ZUZlYXR1cmUsIHJldHVybiBudWxsIGlmIHRoaXMgaXMgbm90IGFuIE9wcG9zaXRlRmVhdHVyZQotCSAqIEByZXR1cm4gT3Bwb3NpdGVGZWF0dXJlCi0JICovCi0JcHVibGljIE9wcG9zaXRlRmVhdHVyZSBnZXRPcHBvc2l0ZUZlYXR1cmUoKSB7Ci0JCWlmICggZmVhdHVyZSBpbnN0YW5jZW9mIE9wcG9zaXRlRmVhdHVyZSApIHsKLQkJCXJldHVybiAoT3Bwb3NpdGVGZWF0dXJlKWZlYXR1cmU7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHJlYWxpemVyCi0JICogQHJldHVybiBFbGVtZW50UmVhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlYWxpemVyIGdldFJlYWxpemVyKCkgewotCQlyZXR1cm4gcmVhbGl6ZXI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSB7Ci0JCWlmICggRWxlbWVudFJlYWxpemVyLmlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJTWV0aG9kRWxlbWVudCBlID0gZWxlbWVudDsKLQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQllID0gKE1ldGhvZEVsZW1lbnQpKChDb250ZW50RGVzY3JpcHRpb24pZWxlbWVudCkuZUNvbnRhaW5lcigpOwotCQkJaWYgKCBlID09IG51bGwgKSB7Ci0JCQkJZSA9IG93bmVyRWxlbWVudDsKLQkJCX0KLQkJfQotCi0JCWlmICggKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpICYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNFeHRlbmRSZXBsYWNlcigoVmFyaWFiaWxpdHlFbGVtZW50KWUpICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0JsYW5rSW5kaWNhdG9yKE9iamVjdCB2YWx1ZSkgewotCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlyZXR1cm4gX05VTExfLmVxdWFscyh2YWx1ZS50b1N0cmluZygpKTsKLQkJfSBlbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gX05VTExfLmVxdWFscygoKE1ldGhvZEVsZW1lbnQpdmFsdWUpLmdldE5hbWUoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL09yZGVyZWRMaXN0Q29tcGFyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9PcmRlcmVkTGlzdENvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2JjOWQ3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL09yZGVyZWRMaXN0Q29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIGEgY29tcGFyYXRvciB0byBzb3J0IGFuIGVsZW1lbnQgbGlzdC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcmRlcmVkTGlzdENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQotCS8vIHNvcnQgdGhlIGJhc2VsaXN0IGFjY29yZGluZyB0byB0aGUgc29ydGVkIGxpc3QKLQkvLyBhbnkgaXRlbSBpbiBzb3J0ZWQgbGlzdCBidXQgbm90IGluIGJhc2UgbGlzdCBhcmUgaWdub3JlZAotCS8vIGFueSBpdGVtIGluIGJhc2UgbGlzdCBidXQgbm90IGluIHNvcnRlZCBsaXN0IGtlZXBzIHRoZSBvcmlnaW5hbCBvcmRlcgotCUxpc3QgYmFzZUxpc3Q7Ci0KLQlMaXN0IHNvcnRlZExpc3Q7Ci0KLQlPcmRlcmVkTGlzdENvbXBhcmF0b3IoTGlzdCBiYXNlTGlzdCwgTGlzdCBzb3J0ZWRMaXN0KSB7Ci0JCXRoaXMuYmFzZUxpc3QgPSBiYXNlTGlzdDsKLQkJdGhpcy5zb3J0ZWRMaXN0ID0gc29ydGVkTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBjb21wYXJlIHRvIG9iamVjdHMuCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCWludCBpMSwgaTI7Ci0JCWlmIChzb3J0ZWRMaXN0ICE9IG51bGwpIHsKLQkJCWkxID0gc29ydGVkTGlzdC5sYXN0SW5kZXhPZihlMSk7Ci0JCQlpMiA9IHNvcnRlZExpc3QubGFzdEluZGV4T2YoZTIpOwotCQkJaWYgKGkxID49IDAgfHwgaTIgPj0gMCkgewotCQkJCS8vIGlmIG5vdCBpbiB0aGUgc29ydGVkIGxpc3QsIGZpbmQgdGhlIGltbWVkaWF0ZSBwcmVkaWNlc3NvcgotCQkJCS8vIHRoYXQgaXMgaW4gdGhlIGxpc3QgYW5kIGNvbXBhcmUgdG8gaXQuCi0JCQkJLy8gaWYgbm8gc3VjaCBlbGVtZW50LCBjb21wYXJlIHRvIHRoZSBvcmlnaW5hbCBsaXN0Ci0JCQkJaWYgKGkxIDwgMCkgewotCQkJCQlpMSA9IGZpbmRDb21wYXJhYmxlSW5kZXgoZTEpOwotCQkJCX0KLQotCQkJCWlmIChpMiA8IDApIHsKLQkJCQkJaTIgPSBmaW5kQ29tcGFyYWJsZUluZGV4KGUyKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaTEgPj0gMCAmJiBpMiA+PSAwICYmIGkxICE9IGkyKSB7Ci0JCQkJCXJldHVybiBpMSAtIGkyOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBvcmlnaW5hbE9yZGVyKGUxLCBlMik7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZmluZENvbXBhcmFibGVJbmRleChPYmplY3QgZSkgewotCQlpbnQgaTIgPSAtMTsKLQkJZm9yIChpbnQgaSA9IGJhc2VMaXN0Lmxhc3RJbmRleE9mKGUpOyBpID49IDA7IGktLSkgewotCQkJT2JqZWN0IG8gPSBiYXNlTGlzdC5nZXQoaSk7Ci0JCQlpMiA9IHNvcnRlZExpc3QubGFzdEluZGV4T2Yobyk7Ci0JCQlpZiAoaTIgPj0gMCkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGkyOwotCX0KLQotCXByaXZhdGUgaW50IG9yaWdpbmFsT3JkZXIoT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJaW50IGkxLCBpMjsKLQkJaWYgKGJhc2VMaXN0ICE9IG51bGwpIHsKLQkJCWkxID0gYmFzZUxpc3QubGFzdEluZGV4T2YoZTEpOwotCQkJaTIgPSBiYXNlTGlzdC5sYXN0SW5kZXhPZihlMik7Ci0KLQkJCXJldHVybiBpMSAtIGkyOwotCQl9Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1Byb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMTdhMTgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVmFyaWFiaWxpdHlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZpbHRlciB0aGF0IHN0aWxsIHNob3dzIGNlcnRhaW4gZWxlbWVudHMgZHVyaW5nIHByb2Nlc3MgYXV0aG9yaW5nIHRoYXQKLSAqIFByb2Nlc3NDb25maWd1cmF0b3IgZG9lcyBub3Qgc2hvdy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKYW4gMTEsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yIGV4dGVuZHMgUHJvY2Vzc0NvbmZpZ3VyYXRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yIElOU1RBTkNFID0gbmV3IFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IoKTsKLQotCXByaXZhdGUgUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcigpIHsKLQkJc3VwZXIobnVsbCwgbnVsbCk7Ci0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobmV3IElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQkJc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLAotCQkJVmlld2VyIHZpZXdlcikgewotCQlzdXBlcihtZXRob2RDb25maWcsIHZpZXdlcik7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICogb3ZlcnJpZGUgdGhpcywgIGZvciBwcm9jZXNzIGF1dGhvcmluZyBlZGl0LCBzaG91bGQgZ2V0IGRpcmVjdCBjaGlsZHJlbiBubyByZWFsaXphdGlvbi4KLQkgKiAgCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSkgewotCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgb2JqOwotCQlyZXR1cm4gKExpc3QpZU9iamVjdC5lR2V0KGNoaWxkRmVhdHVyZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkZpbHRlciNyZXNvbHZlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCByZXNvbHZlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyI2dldFZhcmlhYmlsaXR5SW5mbyhvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlJbmZvIGdldFZhcmlhYmlsaXR5SW5mbyhWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQkJcmV0dXJuIG5ldyBWYXJpYWJpbGl0eUluZm8odmUpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm8jZ2V0SW5oZXJpcmFuY2VMaXN0KCkKLQkJCSAqLwotCQkJcHVibGljIExpc3QgZ2V0SW5oZXJpdGFuY2VMaXN0KCkgewotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGdldE93bmVyKCkpOwotCQkJfQotCQkJCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVmFyaWFiaWxpdHlJbmZvI2dldENvbnRyaWJ1dG9ycygpCi0JCQkgKi8KLQkJCXB1YmxpYyBMaXN0IGdldENvbnRyaWJ1dG9ycygpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzQ29uZmlndXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1Byb2Nlc3NDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDE3NzdiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1Byb2Nlc3NDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbmZpZ3VyYXRvciBleHRlbmRzIENvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrT3duaW5nUHJvY2VzczsKLQotCS8qKgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIFByb2Nlc3NDb25maWd1cmF0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnLCB2aWV3ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBjaGVja093bmluZ1Byb2Nlc3MgaWYgdHJ1ZSB3aWxsIGNoZWNrIG9uIG93bmluZyBwcm9jZXNzIG9mIGFjdGl2aXRpZXMgd2hldGhlciBpdCBpcyBpbiB0aGUgY29uZmlndXJhdGlvbi4KLQkgKiAgICAgICAgICBUaGlzIGNoZWNrIGlzIG5vdCByZXF1aXJlZCBpbiBwcm9jZXNzIGVkaXRvciBhbmQgc2tpcHBpbmcgaXQgaGVscHMgdGhlIHBlcmZvcm1hbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29uZmlndXJhdG9yKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBWaWV3ZXIgdmlld2VyLCBib29sZWFuIGNoZWNrT3duaW5nUHJvY2VzcykgewotCQl0aGlzKG1ldGhvZENvbmZpZywgdmlld2VyKTsKLQkJdGhpcy5jaGVja093bmluZ1Byb2Nlc3MgPSBjaGVja093bmluZ1Byb2Nlc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotCQltZXRob2RDb25maWcgPSBuZXdDb25maWc7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG1ldGhvZENvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCURlZmF1bHRFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBuZXcgRGVmYXVsdEVsZW1lbnRSZWFsaXplcihzdXBlci5tZXRob2RDb25maWcpOwotCQkJcmV0dXJuIGFjY2VwdCgoQnJlYWtkb3duRWxlbWVudClvYmosIHJlYWxpemVyKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmopOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvciNhY2NlcHQob3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChCcmVha2Rvd25FbGVtZW50IGUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlpZiAoZSBpbnN0YW5jZW9mIE1pbGVzdG9uZSB8fCBlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCS8vIGFjY2VwdCBhbGwgcHJvY2VzcyBlbGVtZW50cyB0aGF0IGFyZSBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBjb250ZW50Ci0JCQkvLyBlbGVtZW50Ci0JCQkvLwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoKEFjdGl2aXR5KSBlKTsKLQkJCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpIGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IGFjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCWlmIChiYXNlID09IG51bGwpCi0JCQl7Ci0JCQkJaWYoY2hlY2tPd25pbmdQcm9jZXNzKSB7Ci0JCQkJCXJldHVybiByZWFsaXplci5pbkNvbmZpZyhUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCB8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCB8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMKQotCQkJewotCQkJCS8vIGNoZWNrIG93bmluZyBwcm9jZXNzIG9mIGJhc2UgYWN0aXZpdHkgb25seSBmb3IgZXh0ZW5kcyBhbmQgbG9jYWwgY29udHJpYnV0aW9uL3JlcGxhY2VtZW50Ci0JCQkJLy8KLQkJCQlyZXR1cm4gcmVhbGl6ZXIuaW5Db25maWcoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJhc2UpICk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkvLyBUT0RPOiBuZWVkIHRvIGNvbnNpZGVyIGNoZWNraW5nIG9uIG93bmluZyBwcm9jZXNzIG9mIHRoZSBkZXNjcmlwdG9yIHdoZXRoZXIgaXQgaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCi0JCQkvLyBDdXJyZW50bHksIHRoaXMgY2hlY2sgaXMgbm90IHJlcXVpcmVkIGFuZCBza2lwcGluZyBpdCBoZWxwcyB0aGUgcGVyZm9ybWFuY2UuCi0JCQkvLyBCdXQgdGhpcyBjaGVjayBtaWdodCBhZmZlY3QgdGhlIGN1cnJlbnQgY29kZSwgZS5nLjogcHJvY2VzcyBwcm9wZXJ0aWVzIHZpZXcuCi0JCQkvLwotCQkJTWV0aG9kRWxlbWVudCBsaW5rZWRfb2JqID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGUpOwotCQkJaWYgKGxpbmtlZF9vYmogPT0gbnVsbCB8fCBsaW5rZWRfb2JqLmVJc1Byb3h5KCkpIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBwcm9jZXNzZXMgb3duIGRlc2NyaXB0b3IgKGluZGVwZW5kZW50IGZyb20gdGhlIGNvbnRlbnQpCi0JCQkJLy8gYWx3YXlzIGFjY2VwdCBpdAotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBtYWtlIHN1cmUgdGhhdCBlbGVtZW50IHdpdGggcmVwbGFjZXIgbWlnaHQgc3RpbGwgYmUgYWNjZXB0ZWQKLQkJCQkvLwotCQkJCWxpbmtlZF9vYmogPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KGxpbmtlZF9vYmosIHJlYWxpemVyKTsKLQotCQkJCS8vIGlmIHRoZSBsaW5rZWQgZWxlbWVudCBpcyBub3QgaW4gY29uZmlnLCBkb24ndCBhY2NlcHQgaXQKLQkJCQlyZXR1cm4gcmVhbGl6ZXIuaW5Db25maWcobGlua2VkX29iaik7Ci0JCQl9CQkKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdChlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzVmFyaWFiaWxpdHlDb25maWd1cmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc1ZhcmlhYmlsaXR5Q29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwODVjNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzVmFyaWFiaWxpdHlDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVmFyaWFiaWxpdHlDb25maWd1cmF0b3IgZXh0ZW5kcyBQcm9jZXNzQ29uZmlndXJhdG9yIHsKLQotCS8qKgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIFByb2Nlc3NWYXJpYWJpbGl0eUNvbmZpZ3VyYXRvcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywKLQkJCVZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnLCB2aWV3ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKLQkJbWV0aG9kQ29uZmlnID0gbmV3Q29uZmlnOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQ29uZmlndXJhdG9yI2FjY2VwdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSAoKEFjdGl2aXR5KSBlKQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgPT0gbnVsbCkgewotCQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKAotCQkJCQkJVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGUpLCBtZXRob2RDb25maWcpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZyhUbmdVdGlsCi0JCQkJCQkuZ2V0T3duaW5nUHJvY2VzcyhiYXNlKSwgbWV0aG9kQ29uZmlnKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5hY2NlcHQoZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub01hbnlGZWF0dXJlVmFsdWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9NYW55RmVhdHVyZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwZDc3NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub01hbnlGZWF0dXJlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogcmVhbGl6ZWQgZmVhdHVyZSB2YWx1ZSBmb3IgYSB0b01hbnkgZmVhdHVyZQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFRvTWFueUZlYXR1cmVWYWx1ZSBleHRlbmRzIEZlYXR1cmVWYWx1ZSB7Ci0KLQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRmVhdHVyZVZhbHVlI0ZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50LCBNZXRob2RFbGVtZW50LCBPYmplY3QsIEVsZW1lbnRSZWFsaXplcikKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSByZWFsaXplcgotCSAqLwotCXB1YmxpYyBUb01hbnlGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCwgT2JqZWN0IGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlzdXBlcihlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSBmZWF0dXJlIHZhbHVlIHRvIHRoZSB2YWx1ZSBsaXN0Ci0JICogQHBhcmFtIG93bmVyIFZhcmlhYmlsaXR5RWxlbWVudAotCSAqIEBwYXJhbSB2YWx1ZSBPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoVmFyaWFiaWxpdHlFbGVtZW50IG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCAhKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgKSB7CQotCQkJcmV0dXJuOwotCQl9Ci0JCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9ICgoTGlzdCkgdmFsdWUpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQlNZXRob2RFbGVtZW50IGNlID0gcmVhbGl6ZXIucmVhbGl6ZShlKTsKLQkKLQkJCQkvLyBjYWxjdWxhdGVkIGVsZW1lbnQgY2FuIGJlIG51bGwgaWYgaXQgY2FuJ3Qgc2hvdwotCQkJCWlmIChjZSAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnMoY2UpKSB7Ci0JCQkJCXZhbHVlcy5hZGQoY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKCAob3duZXIgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkKLQkJCQkmJiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpKSkgewotCQkJQ29uZmlndXJhdGlvbkhlbHBlci5vcmRlclNlY3Rpb25zKChDb250ZW50RWxlbWVudCkgb3duZXIsIHZhbHVlcyk7Ci0JCX0KLQkJCQkJCQotCX0KLQkKLQotCS8qKgotCSAqIGdldCB0aGUgcmVhbGl6ZWQgdmFsdWUKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CQkKLQkJaWYgKCBpc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkgKSB7Ci0JCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCi0JCQkvLyByZW1vdmUgdGhlIF9OVUxMXyBpdGVtLiB0aGF0IGlzIHVzZWQgYXMgYW4gaW5kaWNhdG9yIHRvIGJsYW5rIG91dCB0aGUgYmFzZSAKLQkJCS8vIGZvciB0aGUgZXh0ZW5kLXJlcGxhY2UKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlPYmplY3QgbyA9IChPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQlpZiAoIGlzQmxhbmtJbmRpY2F0b3IobykgKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpdGVtcy5hZGQobyk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBpdGVtczsKLQkJfQotCQkKLQkJcmV0dXJuIHZhbHVlczsKLQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgc2l6ZSBvZiB0aGUgdmFsdWUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB2YWx1ZXMuc2l6ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDRiZjBkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLQotLyoqCi0gKiByZWFsaXplZCBmZWF0dXJlIHZhbHVlIGZvciBhIHRvTWFueSBvcHBvc2l0ZSBmZWF0dXJlCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUgZXh0ZW5kcyBUb01hbnlGZWF0dXJlVmFsdWUgewotCQotCS8qKgotCSAqIEBzZWUgY29uc3RydWN0IGEgZmVhdHVyZSB2YWx1ZSBvYmplY3QgZm9yIHRvLW1hbnkgb3Bwb3NpdGUgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gcmVhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG51bGwsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQl9Ci0KLQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Ub01hbnlGZWF0dXJlVmFsdWUjYWRkKFZhcmlhYmlsaXR5RWxlbWVudCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChWYXJpYWJpbGl0eUVsZW1lbnQgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQkKLQkJLy8gd29yayBhcm91bmQgZm9yIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgdGhhdCBzdGlsbCByZXR1cm4gYSBzaW5nbGUgdmFsdWUgaW5zdGVhZCBvZiBhIGxpc3QKLQkJaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0JCQlBcnJheUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXYuYWRkKHZhbHVlKTsKLQkJCXZhbHVlID0gdjsKLQkJfQotCQkKLQkJaWYgKCAhKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgKSB7CQotCQkJcmV0dXJuOwotCQl9Ci0JCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9ICgoTGlzdCkgdmFsdWUpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0KLQkJCS8vIFJlcGxhY2UgZG9lcyBub3QgY29tcGxldGVseSByZW1vdmUKLQkJCS8vIG91dGdvaW5nIGFzc29jaWF0aW9ucwotCQkJLy8gaWYgdGhlIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgaGFzIHJlcGxhY2VyIGluIHRoZQotCQkJLy8gY29uZmlndXJhdGlvbgotCQkJLy8gaXQncyBvdXRnb2luZyBhc3NvY2lhdGlvbnMgKGkuZS4sIHRoaXMgZWxlbWVudCkgd2lsbCBiZQotCQkJLy8gcmVwbGFjZWQgYnkgdGhlIHJlcGxhY2luZyBlbGVtZW50Ci0JCQkvLyBhcyBhIHJlc3VsdCwgdGhlIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgc2hvdWxkIGRyb3AgdGhlCi0JCQkvLyByZXBsYWNlZCBlbGVtZW50Ci0JCQkvLwotCQkJLy8gZm9yIGV4YW1wbGUsIFIxIC0+IHJlc3BvbnNpYmxlIGZvciBBMSwgUjIgcmVzcG9uc2libGUgZm9yCi0JCQkvLyBBMgotCQkJLy8gaWYgUjIgcmVwbGFjZXMgUjEsIHRoZW4gUjIgc3RpbGwgcmVzcG9uc2libGUgZm9yIEEyCi0JCQkvLyBidXQgQTEgZG9lcyBub3QgaGF2ZSBhIHJlc3BvbnNpYmxlIHJvbGUgKG5vdCBSMikKLQkJCS8vIHNvIGZvciBBMSdzIHJlc3BvbnNpYmxlIHJvbGUgb3Bwb3NpdGUgZmVhdHVyZSwKLQkJCS8vIHRoZSB2YWx1ZSBSMSBzaG91bGQgYmUgZHJvcHBlZCBpbnN0ZWFkIG9mIHJlYWxpemUgdG8gUjIKLQkJCS8vIEppbmh1YSBYaSwgMTAvMjcvMjAwNQotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHJlcGxhY2VyID0gbnVsbDsKLQkJCWlmICggZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCApIHsKLQkJCQlyZXBsYWNlciA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCX0KLQkJCWJvb2xlYW4gaXNWYWx1ZVJlcGxhY2VkID0gKHJlcGxhY2VyICE9IG51bGwpOwotCi0JCQlib29sZWFuIGtlZXAgPSAhaXNWYWx1ZVJlcGxhY2VkOwotCQkJaWYgKCBpc1ZhbHVlUmVwbGFjZWQgJiYgCi0JCQkJCShDb25maWd1cmF0aW9uSGVscGVyLmlzRXh0ZW5kUmVwbGFjZXIocmVwbGFjZXIpIAotCQkJCQl8fCBFbGVtZW50UmVhbGl6ZXIuaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpKSApIHsKLQkJCQkvLyBpZiB0aGUgdmFsdWUgaXMgcmVwbGFjZWQsIGJ1dCB0aGUgb3V0IGdvaW5nIGZlYXR1cmUgaXMgaW5oZXJpdGVkIGJ5IHRoZSByZXBsYWNlcgotCQkJCS8vIHRoZW4gd2Ugc2hvdWxkIGtlZXAgdGhpcyB2YWx1ZSwgc28gd2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIGZlYXR1cmUgdmFsdWUgCi0JCQkJLy8gb2YgdGhlIHJlcGxhY2VyCi0JCQkJT3Bwb3NpdGVGZWF0dXJlIG9mID0gKE9wcG9zaXRlRmVhdHVyZSlmZWF0dXJlOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gb2YuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJCWlmICggZi5pc01hbnkoKSApIHsKLQkJCQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJlcGxhY2VyLCBmLCByZWFsaXplcik7Ci0JCQkJCWtlZXAgPSBpdGVtcy5jb250YWlucyhvd25lcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBpdGVtID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUocmVwbGFjZXIsIGYsIHJlYWxpemVyKTsKLQkJCQkJa2VlcCA9IChpdGVtID09IG93bmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGlmIHRoZSB2YWx1ZSdzIGZlYXR1cmUgdG8gdGhpcyBlbGVtZW50IGlzIHRvLW9uZSwgCi0JCQkvLyB0aGVuIHRoaXMgdmFsdWUncyBmZWF0dXJlIHZhbHVlIHNob3VsZCBiZSB0aGUgZWxlbWVudCwKLQkJCS8vIG90aGVyd2lzZSBkcm9wIHRoZSB2YWx1ZQotCQkJLy8gZm9yIGV4YW1wbGUsIAotCQkJLy8gVDEgLT4gUjEgKHByaW1hcnkgcGVyZm9ybWFlcikKLQkJCS8vIFQyIC0+IFIyCi0JCQkvLyBUMiBjb250cmlidXRlcyB0byBUMQotCQkJLy8gc2luY2UgVDEgYWxyZWFkeSBoYXMgUjEsIHNvIFIyIGlzIGRyb3BlZAotCQkJLy8gc28gd2hlbiBjYWxjdWxhdGluZyBSMidzIHBlcmZvcm1pbmcgdGFza3MsIFQxIHNob3VsZCBub3QgYmUgaW5jbHVkZWQKLQkJCWlmICgga2VlcCApIHsKLQkJCQlNZXRob2RFbGVtZW50IHZlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChlLCByZWFsaXplcik7Ci0JCQkJaWYgKCB2ZSAhPSBudWxsICkgewotCQkJCQlPcHBvc2l0ZUZlYXR1cmUgb2YgPSAoT3Bwb3NpdGVGZWF0dXJlKWZlYXR1cmU7Ci0JCQkJCQotCQkJCQkvLyBjaGVjayBpZiB0aGlzIGlzIGEgdG8tb25lIGZlYXR1cmUsIGN1cnJlbnRseSBvbmx5IFRhc2stPlByaW1hcnkgUm9sZSBhbmQgVEQgLT4gUHJpbWFyeSBSRAotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0MDFGZWF0dXJlKG9mKTsKLQkJCQkJaWYgKCBmICE9IG51bGwgKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGl0ZW0gPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh2ZSwgZiwgcmVhbGl6ZXIpOwotCQkJCQkJCi0JCQkJCQkvLyBpZiB0aGUgdmFsdWUgZWxlbWVudCdzIHRvLW9uZSBmZWF0dXJlIHZhbHVlIGl0ZW0gaXMgbm90IHRoZSBjdXJyZW50IGVsZW1lbnQsIAotCQkJCQkJLy8gdGhlbiB0aGUgZWxlbWVudCdzIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgc2hvdWxkIG5vdCBjb250YWluIHRoaXMgdmFsdWUuCi0JCQkJCQkvLyBzYXksIHRoZSB2YWx1ZSBlbGVtZW50IGlzIGEgdGFzayBhbmQgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBhIHJvbGUsCi0JCQkJCQkvLyB0aGVuIGlmIHRoZSB0YXNrJ3MgcHJpbWFyeSBwZXJmb3JtZXIgKGl0ZW0gYWJvdmUpIGlzIG5vdCB0aGlzIHJvbGUgKHRoZSBjdXJyZW50IGVsZW1lbnQpLCAKLQkJCQkJCS8vIHRoZW4gdGhlIHJvbGUncyBwZXJmb3JtaW5nIHRhc2tzICh0aGUgb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSkgCi0JCQkJCQkvLyBzaG91bGQgbm90IGNvbnRhaW4gdGhpcyB0YXNrICh0aGUgdmFsdWUsIHZlIGFib3ZlKQotCQkJCQkJaWYgKCBpdGVtICE9IGVsZW1lbnQpIHsKLQkJCQkJCQlrZWVwID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCQotCQkJaWYgKCBrZWVwICkgewotCQkJCQkKLQkJCQlNZXRob2RFbGVtZW50IGNlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChlLCByZWFsaXplcik7Ci0KLQkJCQkvLyBjYWxjdWxhdGVkIGVsZW1lbnQgY2FuIGJlIG51bGwgaWYgaXQgY2FuJ3Qgc2hvdwotCQkJCWlmIChjZSAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnMoY2UpKSB7Ci0JCQkJCXZhbHVlcy5hZGQoY2UpOwotCQkJCX0KLQkJCX0KLQkJfQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvT25lRmVhdHVyZVZhbHVlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvT25lRmVhdHVyZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3MjIxM2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub09uZUZlYXR1cmVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIHJlYWxpemVkIGZlYXR1cmUgdmFsdWUgZm9yIGEgdG8tb25lIGZlYXR1cmUKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUb09uZUZlYXR1cmVWYWx1ZSBleHRlbmRzIEZlYXR1cmVWYWx1ZSB7Ci0KLQkvLyBtYXAgb2YgZWxlbWVudCBhbmQgdGhlIHZhbHVlCi0JTGlua2VkSGFzaE1hcCB2YWx1ZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgdGhlIG9iamVjdCBmb3IgYSB0by1vbmUgZmVhdHVyZSB2YWx1ZQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG93bmVyRWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIHJlYWxpemVyCi0JICovCi0JcHVibGljIFRvT25lRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIE9iamVjdCBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJc3VwZXIoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5GZWF0dXJlVmFsdWUjYWRkKFZhcmlhYmlsaXR5RWxlbWVudCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChWYXJpYWJpbGl0eUVsZW1lbnQgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoICh2YWx1ZSA9PSBudWxsKSB8fCAhKHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgKSB7CQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBzaW5jZSB0aGlzIGlzIGEgdG8gb25lIGFzc29jaWF0aW9uLCBpZiB0aGUgYmFzZSBvZiB0aGUgb3duZXIgYWxyZWFkeSBoYXMgb25lLCAKLQkJLy8gbm8gY29udHJpYnV0aW5nIHZhbHVlIHNob3VsZCBiZSBhZGRlZAotCQkvLyAxNzI2MDIgLSBWYXJpYWJpbGl0eTogUHJpbWFyeSByb2xlIG1pc3NpbmcgaW4gdGhlIHRyYW5zaXRpdmUgY2FzZSBvZiBjb250cmlidXRpbmcgdGFza3MKLQkJaWYgKCBDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udHJpYnV0b3Iob3duZXIpICkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBvd25lci5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoIGJhc2UgIT0gbnVsbCAmJiB2YWx1ZU1hcC5jb250YWluc0tleShiYXNlKSApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCU1ldGhvZEVsZW1lbnQgZSA9IHN1cGVyLnJlYWxpemVyLnJlYWxpemUoKE1ldGhvZEVsZW1lbnQpdmFsdWUpOwotCQkKLQkJaWYgKCBlICE9IG51bGwgKSB7Ci0JCQlPYmplY3Qga2V5ID0gKG93bmVyPT1udWxsKSA/IGVsZW1lbnQgOiBvd25lcjsKLQkJCWlmICggIXZhbHVlTWFwLmNvbnRhaW5zS2V5KGtleSkgKSB7Ci0JCQkJdmFsdWVNYXAucHV0KGtleSwgZSk7Ci0JCQl9Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRmVhdHVyZVZhbHVlI2dldFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQkKLQkJT2JqZWN0IHYgPSBudWxsOwotCQlpZiAoIHNpemUoKSA9PSAwICkgewotCQkJcmV0dXJuIHY7Ci0JCX0KLQkJCi0JCU9iamVjdFtdIGVudHJpZXMgPSB2YWx1ZU1hcC5lbnRyeVNldCgpLnRvQXJyYXkoKTsKLQkJaWYgKCBzaXplKCkgPT0gMSApIHsKLQkJCS8vIGlmIGp1c3Qgb25lIGVudHJ5LCByZXR1cm4gaXQKLQkJCXYgPSAoKE1hcC5FbnRyeSllbnRyaWVzWzBdKS5nZXRWYWx1ZSgpOwotCQl9IGVsc2UgewotCQkJLy8gaWYgbW9yZSB0aGFuIG9uZSBlbnRyeSwgaWYgdGhlIGZpcnN0IGVudHJ5IGlzIGZyb20gdGhlIGVsZW1lbnQgaXRzZWxmLCB0aGVuIHJldHVybiB0aGUgdmFsdWUKLQkJCS8vIG90aGVyd2lzZSwgcmV0dXJuIG51bGwKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpZW50cmllc1swXTsKLQkJCWlmICggZW50cnkuZ2V0S2V5KCkgPT0gc3VwZXIuZWxlbWVudCApIHsKLQkJCQl2ID0gIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICggaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpICkgewotCQkJaWYgKCBpc0JsYW5rSW5kaWNhdG9yKHYpICkgewotCQkJCS8vIHJlbW92ZSB0aGUgX05VTExfIGl0ZW0uIHRoYXQgaXMgdXNlZCBhcyBhbiBpbmRpY2F0b3IgdG8gYmxhbmsgb3V0IHRoZSBiYXNlIAotCQkJCS8vIGZvciB0aGUgZXh0ZW5kLXJlcGxhY2UKLQkJCQl2ID0gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHY7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdmFsdWVNYXAuc2l6ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub09uZU9wcG9zaXRlRmVhdHVyZVZhbHVlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvT25lT3Bwb3NpdGVGZWF0dXJlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmY5NjUzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvT25lT3Bwb3NpdGVGZWF0dXJlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIHJlYWxpemVkIGZlYXR1cmUgdmFsdWUgZm9yIGEgdG8tb25lIG9wcG9zaXRlIGZlYXR1cmUKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUb09uZU9wcG9zaXRlRmVhdHVyZVZhbHVlIGV4dGVuZHMgVG9PbmVGZWF0dXJlVmFsdWUgewotCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIHJlYWxpemVyCi0JICovCi0JcHVibGljIFRvT25lT3Bwb3NpdGVGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG51bGwsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlRvT25lRmVhdHVyZVZhbHVlI2FkZChWYXJpYWJpbGl0eUVsZW1lbnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoVmFyaWFiaWxpdHlFbGVtZW50IG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCAodmFsdWUgPT0gbnVsbCkgfHwgISh2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpICkgewkKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gUmVwbGFjZSBkb2VzIG5vdCBjb21wbGV0ZWx5IHJlbW92ZSBvdXRnb2luZwotCQkvLyBhc3NvY2lhdGlvbnMKLQkJLy8gaWYgdGhlIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgaGFzIHJlcGxhY2VyIGluIHRoZQotCQkvLyBjb25maWd1cmF0aW9uCi0JCS8vIGl0J3Mgb3V0Z29pbmcgYXNzb2NpYXRpb25zIChpLmUuLCB0aGlzIGVsZW1lbnQpIHdpbGwgYmUKLQkJLy8gcmVwbGFjZWQgYnkgdGhlIHJlcGxhY2luZyBlbGVtZW50Ci0JCS8vIGFzIGEgcmVzdWx0LCB0aGUgb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBzaG91bGQgZHJvcCB0aGUKLQkJLy8gcmVwbGFjZWQgZWxlbWVudAotCQkvLwotCQkvLyBmb3IgZXhhbXBsZSwgUjEgLT4gcmVzcG9uc2libGUgZm9yIEExLCBSMiByZXNwb25zaWJsZSBmb3IgQTIKLQkJLy8gaWYgUjIgcmVwbGFjZXMgUjEsIHRoZW4gUjIgc3RpbGwgcmVzcG9uc2libGUgZm9yIEEyCi0JCS8vIGJ1dCBBMSBkb2VzIG5vdCBoYXZlIGEgcmVzcG9uc2libGUgcm9sZSAobm90IFIyKQotCQkvLyBzbyBmb3IgQTEncyByZXNwb25zaWJsZSByb2xlIG9wcG9zaXRlIGZlYXR1cmUsCi0JCS8vIHRoZSB2YWx1ZSBSMSBzaG91bGQgYmUgZHJvcHBlZCBpbnN0ZWFkIG9mIHJlYWxpemUgdG8gUjIKLQkJLy8gSmluaHVhIFhpLCAxMC8yNy8yMDA1Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSB2YWx1ZTsKLQkJYm9vbGVhbiBpc1ZhbHVlUmVwbGFjZWQgPSAoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkKLQkJCQkmJiAoQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcigoVmFyaWFiaWxpdHlFbGVtZW50KSBlLCByZWFsaXplci5nZXRDb25maWd1cmF0aW9uKCkpICE9IG51bGwpOwotCQlpZiAoIWlzVmFsdWVSZXBsYWNlZCkgewotCQkJLy8gY29udHJpYnV0b3IgY2FuJ3QgY29udHJpYnV0ZSAwLi4xIHJlZmVyZW5jZSBpZiBiYXNlCi0JCQkvLyBhbHJlYWR5IGhhcyBvbmUsCi0JCQkvLyBvciBpZiBtb3JlIHRoYW4gb25lIGNvbnRyaWJ1dG9yIGhhcyB0aGUgdmFsdWUuCi0JCQkvLyBmb3IgZXhhbXBsZSwgaWYgdGhlIGJhc2UgdGFzayBoYXMgbm8gZGlzY2lwbGluZSwgYW5kIG9ubHkKLQkJCS8vIG9uZSBvZiBpdCdzIGNvbnRyaWJ1dG9ycyBoYXMgZGlzY2lwbGluZSwKLQkJCS8vIHRoZW4gdGhhdCBjb250cmlidXRvcidzIGRpc2NpcGxpbmUgd2lsbCBiZSB1c2VkLAotCQkJLy8gb3RoZXJ3aXNlLCBubyBkaXNjaXBsaW5lCi0KLQkJCS8vIHJpZ2h0IG5vdywgd2UgY2FuJ3QgZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIG1vcmUgdGhlbiBvbmUKLQkJCS8vIGNvbnRyaWJ1dG9ycyBoYXMgdGhlIHZhbHVlCi0JCQkvLyBzbyB3ZSBpZ25vcmUgY29udHJpYnV0b3IncyAwMSBpbWNvbWluZyB2YWx1ZQotCQkJCi0JCQkvLyAoU3VibWl0KTogSW5hYmlsaXR5IHRvIGFkZCByZXNwb25zaWJsZSBmb3IgcmVsYXRpb25zaGlwIHRvIGEgd29yayBwcm9kdWN0Ci0JCQkvLyBuZWVkIHRvIGZpeCB0aGlzIGlzc3VlLiBhbHdheXMgdGFrZSB0aGUgZmlyc3Qgb25lLgotCQkJZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoZSwgcmVhbGl6ZXIpOwotCQkJaWYgKCBlICE9IG51bGwgKSB7Ci0JCQkJT2JqZWN0IGtleSA9IChvd25lcj09bnVsbCkgPyBlbGVtZW50IDogb3duZXI7Ci0JCQkJaWYgKCAhdmFsdWVNYXAuY29udGFpbnNLZXkoa2V5KSApIHsKLQkJCQkJdmFsdWVNYXAucHV0KGtleSwgZSk7Ci0JCQkJfQotCQkJfQkJCi0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkZlYXR1cmVWYWx1ZSNnZXRWYWx1ZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJCi0JCU9iamVjdCB2ID0gbnVsbDsKLQkJCi0JCWlmICggc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm4gdjsKLQkJfQotCQkKLQkJT2JqZWN0W10gZW50cmllcyA9IHZhbHVlTWFwLmVudHJ5U2V0KCkudG9BcnJheSgpOwotCQlpZiAoIHNpemUoKSA9PSAxICkgewotCQkJLy8gaWYganVzdCBvbmUgZW50cnksIHJldHVybiBpdAotCQkJdiA9ICgoTWFwLkVudHJ5KWVudHJpZXNbMF0pLmdldFZhbHVlKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiBtb3JlIHRoYW4gb25lIGVudHJ5LCBpZiB0aGUgZmlyc3QgZW50cnkgaXMgZnJvbSB0aGUgZWxlbWVudCBpdHNlbGYsIHRoZW4gcmV0dXJuIHRoZSB2YWx1ZQotCQkJLy8gb3RoZXJ3aXNlLCByZXR1cm4gbnVsbAotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSllbnRyaWVzWzBdOwotCQkJaWYgKCBlbnRyeS5nZXRLZXkoKSA9PSBzdXBlci5lbGVtZW50ICkgewotCQkJCXYgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoIGlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSApIHsKLQkJCWlmICggaXNCbGFua0luZGljYXRvcih2KSApIHsKLQkJCQkvLyByZW1vdmUgdGhlIF9OVUxMXyBpdGVtLiB0aGF0IGlzIHVzZWQgYXMgYW4gaW5kaWNhdG9yIHRvIGJsYW5rIG91dCB0aGUgYmFzZSAKLQkJCQkvLyBmb3IgdGhlIGV4dGVuZC1yZXBsYWNlCi0JCQkJdiA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB2OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiMzNmZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBlbGVtZW50IHJlYWxpemF0aW9uIHN1cHBvcnQgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9ldmVudHMvSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZXZlbnRzL0lMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDQxMjY2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9ldmVudHMvSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIHsKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OX0xPQURFRCA9IDB4MTsKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OX1NBVkVEID0gMHgyOwotCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fQ1JFQVRFRCA9IDB4NDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTl9DSEFOR0VEID0gMHg4OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OX0RFTEVURUQgPSAweDEwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OX05FV0NISUxEID0gMHgyMDsKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OX0NPTkZJR1VSQVRJT05fU0VMRUNURUQgPSAweDQwOwotCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fTElCUkFSWV9DTE9TRUQgPSAweDgwOwotCi0JLyoqCi0JICogbm90aWZ5IHRoZSBsaXN0ZW5lciBvZiB0aGUgbGlicmFyeSBjaGFuZ2VzLgotCSAqIAotCSAqIEBwYXJhbSBvcHRpb24KLQkgKiAgICAgICAgICAgIGludCBvbmUgb2YgdGhlIGNoYW5nZSBvcHRpb25zCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBjaGFuZ2VkIGVsZW1lbnRzIGluIHRoZSBsaWJyYXJ5LCBpZiB0aGUgb3B0aW9uIGlzCi0JICogICAgICAgICAgICBPUFRJT05fQ0hBTkdFRCwgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9ldmVudHMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZXZlbnRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTBiYWM2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9ldmVudHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIG1ldGhvZCBsaWJyYXJ5IGV2ZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9pbnRlcm5hbC9MaWJyYXJ5TWFuYWdlckVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2ludGVybmFsL0xpYnJhcnlNYW5hZ2VyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NzEyODYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2ludGVybmFsL0xpYnJhcnlNYW5hZ2VyRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIE1vZGVscyBhICJsaWJyYXJ5TWFuYWdlciIgY29uZmlndXJhdGlvbiBlbGVtZW50IGluIHRoZQotICogIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxpYnJhcnlNYW5hZ2VycyIgZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlNYW5hZ2VyRWxlbWVudCB7Ci0KLQkvLyBUaGUgY29udHJpYnV0aW5nIHBsdWctaW4uCi0JcHJpdmF0ZSBCdW5kbGUgYnVuZGxlOwotCi0JLy8gVGhlIGxpYnJhcnkgbWFuYWdlciBjbGFzcyBuYW1lLgotCXByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLQotCS8vIFRoZSBsaWJyYXJ5IHR5cGUgaWRlbnRpZmllci4KLQlwcml2YXRlIFN0cmluZyB0eXBlSWQ7Ci0KLQkvLyBUaGUgbGlicmFyeSB0eXBlIGRpc3BsYXkgbmFtZS4KLQlwcml2YXRlIFN0cmluZyB0eXBlTmFtZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZQotCSAqICAgICAgICAgICAgVGhlIGNvbnRyaWJ1dGluZyBwbHVnLWluLgotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiAgICAgICAgICAgIFRoZSBsaWJyYXJ5IG1hbmFnZXIgY2xhc3MgbmFtZS4KLQkgKiBAcGFyYW0gdHlwZUlkCi0JICogICAgICAgICAgICBUaGUgbGlicmFyeSB0eXBlIGlkZW50aWZpZXIuCi0JICogQHBhcmFtIHR5cGVOYW1lCi0JICogICAgICAgICAgICBUaGUgbGlicmFyeSB0eXBlIGRpc3BsYXkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeU1hbmFnZXJFbGVtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc05hbWUsCi0JCQlTdHJpbmcgdHlwZUlkLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQl0aGlzLnR5cGVJZCA9IHR5cGVJZDsKLQkJdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRyaWJ1dGluZyBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBCdW5kbGUgZ2V0QnVuZGxlKCkgewotCQlyZXR1cm4gYnVuZGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgbWFuYWdlciBjbGFzcyBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgdHlwZSBpZGVudGlmaWVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUlkKCkgewotCQlyZXR1cm4gdHlwZUlkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgdHlwZSBkaXNwbGF5IG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHR5cGVOYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvaW50ZXJuYWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvaW50ZXJuYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NzFkMGE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGV4dGVuc2lvbiBwb2ludCBtYW5hZ2VtZW50IGZvciB0aGUgbGlicmFyeSBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Cb29rbWFyay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jvb2ttYXJrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmN2RlOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jvb2ttYXJrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBib29rbWFyayBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlIHB1Ymxpc2hlZCBib29rbWFyayBlbnRyaWVzLiAKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJvb2ttYXJrIHsKLQotCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzY1MjU4Mjc5MTMyNjMyMzg2M0w7Ci0KLQkvLyBwb2ludHMgdG8gdGhlIGRlc2NyaXB0aW9uIGZpbGUgaW4gdGhlIGZpbGUgc3lzdGVtCi0JcHJpdmF0ZSBTdHJpbmcgX2ZpbGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHVzZWQgYXMgImNsb3NlZCIgb3IgImRlZmF1bHQiIGljb24KLQlwcml2YXRlIFN0cmluZyBfY2xvc2VkSWNvbk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gdXNlZCBhcyAib3BlbiIgaWNvbgotCXByaXZhdGUgU3RyaW5nIF9vcGVuSWNvbk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcHJlc2VudGF0aW9uIG5hbWUgb2YgdGhlIGVudHJ5Ci0JcHJpdmF0ZSBTdHJpbmcgX3ByZXNlbnRhdGlvbk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gd2hldGhlciBtb3VzZSBpcyBvdmVyIHRoZSBib29rbWFyawotCS8vIHRoaXMgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci0JLy8gcHJpdmF0ZSBib29sZWFuIF9pc01vdXNlT3ZlciA9IGZhbHNlOwotCi0JLy8gd2hldGhlciB0aGUgZmlsZSBleGlzdHMgaW4gdGhlIGZpbGUgc3lzdGVtCi0JcHJpdmF0ZSBib29sZWFuIF9pc0V4aXN0ID0gdHJ1ZTsKLQotCS8vIHdoZXRoZXIgdGhlIGZpbGUgaXMgZnJvbSBjb250ZW50IGxpYnJhcnkKLQlwcml2YXRlIGJvb2xlYW4gX2lzRnJvbUNvbnRlbnRMaWJyYXJ5ID0gdHJ1ZTsKLQotCS8vIHVuaXF1ZSBpZC4KLQkvLyBBIGJvb2ttYXJrIG1heSBub3QgaGF2ZSBhIHVuaXF1ZUlEIGluIHdoaWNoIGNhc2UgdGhlCi0JLy8gYm9va21hcmsgaGFzIG5vIHJlbGF0aW9uIHRvIGFueSBsYXlvdXQgZWxlbWVudHMuCi0JcHJpdmF0ZSBTdHJpbmcgX3VuaXF1ZUlkID0gbnVsbDsKLQotCS8vIHdoZXRoZXIgdGhlIGJvb2ttYXJrIGlzIHZpc2libGUKLQlwcml2YXRlIGJvb2xlYW4gX2lzVmlzaWJsZSA9IHRydWU7Ci0KLQkvLyB3aGV0aGVyIHRoZSBib29rbWFyayBpcyBlbmFibGVkCi0JLy8gdGhpcyBpcyB0byBzdXBwb3J0IGEgc3BlY2lhbCBjYXNlIHdoZXJlIGJvb2ttYXJrcwotCS8vIGFyZSB0byByZW1haW4gaGlkZGVuIGFuZCBjYW5ub3QgYmUgdW5oaWRkZW4gYXMKLQkvLyB3ZWxsIGFzIHRyYW5zcGFyZW5jeQotCXByaXZhdGUgYm9vbGVhbiBfaXNFbmFibGVkID0gdHJ1ZTsKLQotCS8vIHdoZXRoZXIgdGhlIGJvb2ttYXJrIGlzIHRyYW5zcGFyZW50Ci0JcHJpdmF0ZSBib29sZWFuIF9pc1RyYW5zcGFyZW50ID0gZmFsc2U7Ci0KLQkvLyB3aGV0aGVyIHRoZSBib29rbWFyayBpcyBhIGRlZmF1bHQgb25lCi0JLy8gZGVmYXVsdCBtZWFucyB0aGF0IGl0IGlzIHB1Ymxpc2hlZCBhbmQgaXMgcmVhZC1vbmx5Ci0JcHJpdmF0ZSBib29sZWFuIF9pc0RlZmF1bHQgPSBmYWxzZTsKLQotCS8vIHdoZXRoZXIgdGhlIGJvb2ttYXJrIGlzIHRoZSBjdXJyZW50IG9uZQotCS8vIGN1cnJlbnQgbWVhbnMgdGhlIGZpcnN0IG9uZSB0byBiZSBmb2N1c2VkIG9uCi0JcHJpdmF0ZSBib29sZWFuIF9pc0N1cnJlbnQgPSBmYWxzZTsKLQotCXByaXZhdGUgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gIiI7Ci0JCi0JcHJpdmF0ZSBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBCb29rbWFyayBwYXJlbnQgPSBudWxsOwotCQotCS8vIHRoZSBvd25lciBlbGVtZW50IG9mIHRoZSBub2RlCi0JcHJpdmF0ZSBPYmplY3Qgb3duZXIgPSBudWxsOwotCQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuIFRha2VzIGluIHRoZSBwcmVzZW50YXRpb24gbmFtZSBvZiB0aGUgcHJvY2VzcyBsYXlvdXQKLQkgKiBlbnRyeS4KLQkgKi8KLQlwdWJsaWMgQm9va21hcmsoU3RyaW5nIG5hbWUpIHsKLQkJX3VuaXF1ZUlkID0gbnVsbDsKLQkJX3ByZXNlbnRhdGlvbk5hbWUgPSBuYW1lOwotCQlpZiAoX3ByZXNlbnRhdGlvbk5hbWUgPT0gbnVsbCkgewotCQkJX3ByZXNlbnRhdGlvbk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogTmFtZSBhbmQgdW5pcXVlSWQgZm9yIGEgbGF5b3V0IG5vZGUuCi0JICovCi0JcHVibGljIEJvb2ttYXJrKFN0cmluZyBwcmVzZW50YXRpb25OYW1lLCBTdHJpbmcgdW5pcXVlSWQpIHsKLQkJdGhpcyhwcmVzZW50YXRpb25OYW1lKTsKLQkJX3VuaXF1ZUlkID0gdW5pcXVlSWQ7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPd25lcihPYmplY3QgZWxlbWVudCkgewotCQl0aGlzLm93bmVyID0gZWxlbWVudDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRPd25lcigpIHsKLQkJcmV0dXJuIHRoaXMub3duZXI7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHJldHVybiBwcmVzZW50YXRpb24gbmFtZSBhcyB0aGUgdXNlciBvYmplY3QuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRVc2VyT2JqZWN0KCkgewotCQlyZXR1cm4gKF9wcmVzZW50YXRpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIHVzZXIgb2JqZWN0Ci0JICogQHBhcmFtIHVzZXJPYmplY3QgT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlck9iamVjdChPYmplY3QgdXNlck9iamVjdCkgewotCQlfcHJlc2VudGF0aW9uTmFtZSA9IChTdHJpbmcpIHVzZXJPYmplY3Q7Ci0JCWlmIChfcHJlc2VudGF0aW9uTmFtZSA9PSBudWxsKSB7Ci0JCQlfcHJlc2VudGF0aW9uTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIHByZXNlbnRhdGlvbiBuYW1lCi0JICogCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcgbmFtZSkgewotCQlfcHJlc2VudGF0aW9uTmFtZSA9IG5hbWU7Ci0JCWlmIChfcHJlc2VudGF0aW9uTmFtZSA9PSBudWxsKSB7Ci0JCQlfcHJlc2VudGF0aW9uTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHByZXNlbnRhdGlvbiBuYW1lCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiAoX3ByZXNlbnRhdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZmlsZSBuYW1lCi0JICogCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJX2ZpbGVOYW1lID0gbmFtZTsKLQkJaWYgKF9maWxlTmFtZSA9PSBudWxsKSB7Ci0JCQlfZmlsZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JCXJldHVybiAoX2ZpbGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGljb24gbmFtZSBmb3IgdGhlIGNsb3NlZCBpY29uCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xvc2VkSWNvbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJX2Nsb3NlZEljb25OYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGNsb3NlZCBpY29uIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xvc2VkSWNvbk5hbWUoKSB7Ci0JCXJldHVybiAoX2Nsb3NlZEljb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG9wZW4gaWNvbiBuYW1lCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdGhlIG9wZW4gaWNvbiBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcGVuSWNvbk5hbWUoKSB7Ci0JCXJldHVybiAoX29wZW5JY29uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBvcGVuIGljb24gbmFtZQotCSAqIAotCSAqIEBwYXJhbSBuYW1lIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wZW5JY29uTmFtZShTdHJpbmcgbmFtZSkgewotCQlfb3Blbkljb25OYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGV4aXN0IGZsYWcKLQkgKiAKLQkgKiBAcGFyYW0gaXNFeGlzdCBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhpc3QoYm9vbGVhbiBpc0V4aXN0KSB7Ci0JCV9pc0V4aXN0ID0gaXNFeGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGV4aXN0IGZsYWcKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4aXN0KCkgewotCQlyZXR1cm4gKF9pc0V4aXN0KTsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIGlzIGEgbGVnYWN5IG1ldGhvZCwgbm90IHVzZWQgYW55IG1vcmUKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBwYXJhbSBmbGFnIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcm9tQ29udGVudExpYnJhcnkoYm9vbGVhbiBmbGFnKSB7Ci0JCV9pc0Zyb21Db250ZW50TGlicmFyeSA9IGZsYWc7Ci0JfQotCi0JLyoqCi0JICogdGhpcyBpcyBhIGxlZ2FjeSBtZXRob2QsIG5vdCB1c2VkIGFueSBtb3JlCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Zyb21Db250ZW50TGlicmFyeSgpIHsKLQkJcmV0dXJuIChfaXNGcm9tQ29udGVudExpYnJhcnkpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdW5pcXVlIGlkIG9mIHRoZSBib29rbWFyawotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKLQkJcmV0dXJuIChfdW5pcXVlSWQpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgdW5pcXVlIGlkIG9mIHRoZSBib29rbWFyawotCSAqIAotCSAqIEBwYXJhbSB1bmlxdWVJZCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKLQkJX3VuaXF1ZUlkID0gdW5pcXVlSWQ7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSB2aXNpYmxlIGZsYWcKLQkgKiAKLQkgKiBAcGFyYW0gaXNWaXNpYmxlIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gaXNWaXNpYmxlKSB7Ci0JCV9pc1Zpc2libGUgPSBpc1Zpc2libGU7Ci0JCS8vIHNwZWNpYWwgY2FzZSB3aGVyZSBhbGwgY2hpbGRyZW4gbmVlZCB0byBjaGFuZ2UgYXMgd2VsbAotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldENoaWxkQ291bnQoKTsgaSsrKSB7Ci0JCQlCb29rbWFyayBjaGlsZCA9IChCb29rbWFyaykgKChCb29rbWFyaykgZ2V0Q2hpbGRBdChpKSk7Ci0JCQljaGlsZC5zZXRWaXNpYmxlKGlzVmlzaWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHZpc2libGUgZmxhZwotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLQkJcmV0dXJuIChfaXNWaXNpYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGVuYWJsZWQgZmxhZwotCSAqIAotCSAqIEBwYXJhbSBpc0VuYWJsZWQgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpIHsKLQkJX2lzRW5hYmxlZCA9IGlzRW5hYmxlZDsKLQkJLy8gc3BlY2lhbCBjYXNlIHdoZXJlIGFsbCBjaGlsZHJlbiBuZWVkIHRvIGNoYW5nZSBhcyB3ZWxsCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0Q2hpbGRDb3VudCgpOyBpKyspIHsKLQkJCUJvb2ttYXJrIGNoaWxkID0gKEJvb2ttYXJrKSAoKEJvb2ttYXJrKSBnZXRDaGlsZEF0KGkpKTsKLQkJCWNoaWxkLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZW5hYmxlZCBmbGFnCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gKF9pc0VuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgdHJhbnNwYXJhbnQgZmxhZwotCSAqIAotCSAqIEBwYXJhbSBpc1RyYW5zcGFyZW50IGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc3BhcmVuY3koYm9vbGVhbiBpc1RyYW5zcGFyZW50KSB7Ci0JCS8vIHNldCBhdCB0aGlzIGJvb2ttYXJrIG9ubHksIG5vdCBjaGlsZHJlbgotCQlfaXNUcmFuc3BhcmVudCA9IGlzVHJhbnNwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB0cmFuc3BhcmVudCBmbGFnCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUcmFuc3BhcmVudCgpIHsKLQkJcmV0dXJuIChfaXNUcmFuc3BhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBib29rbWFyayBhcyBkZWZhdWx0Ci0JICogCi0JICogQHBhcmFtIGlzRGVmYXVsdCBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChib29sZWFuIGlzRGVmYXVsdCkgewotCQlfaXNEZWZhdWx0ID0gaXNEZWZhdWx0OwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoaXMgYm9va21hcmsgaXMgc2V0IGFzIGRlZmF1bHQKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0JCXJldHVybiAoX2lzRGVmYXVsdCk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBjdXJyZW50IGZsYWcKLQkgKiAKLQkgKiBAcGFyYW0gaXNDdXJyZW50IGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50KGJvb2xlYW4gaXNDdXJyZW50KSB7Ci0JCV9pc0N1cnJlbnQgPSBpc0N1cnJlbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjdXJyZW50IGZsYWcKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnQoKSB7Ci0JCXJldHVybiAoX2lzQ3VycmVudCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKLQkJcmV0dXJuIGNoaWxkcmVuLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgcmVhbCBjaGlsZCBjb3VudCByZWdhcmRsZXNzIG9mIHZpc2liaWxpdHkuCi0JICovCi0JcHVibGljIGludCBnZXRBY3R1YWxDaGlsZENvdW50KCkgewotCQlyZXR1cm4gKGdldENoaWxkQ291bnQoKSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBzcGVjaWZpZWQgY2hpbGQKLQkgKiBAcGFyYW0gaSBpbnQgcG9zaXRpb24gb2YgdGhlIGNoaWxkCi0JICogQHJldHVybiBPYmplY3QgdGhlIGNoaWxkIGJvb2ttYXJrCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDaGlsZEF0KGludCBpKSB7Ci0JCXJldHVybiBjaGlsZHJlbi5nZXQoaSk7Ci0JfQotCi0JLyoqCi0JICogc2FtZSBhcyBnZXRDaGlsZEF0Ci0JICogCi0JICogQHBhcmFtIGkgaW50IHBvc2l0aW9uIG9mIHRoZSBjaGlsZAotCSAqIEByZXR1cm4gT2JqZWN0IHRoZSBjaGlsZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsQ2hpbGRBdChpbnQgaSkgewotCQlyZXR1cm4gY2hpbGRyZW4uZ2V0KGkpOwotCX0KLQotCS8qKgotCSAqIGFkZCBhIG5ldyBjaGlsZCBib29rbWFyawotCSAqIAotCSAqIEBwYXJhbSBjaGlsZCBCb29rbWFyawotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkKEJvb2ttYXJrIGNoaWxkKSB7Ci0JCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCWNoaWxkLnBhcmVudCA9IHRoaXM7Ci0JfQotCi0JcHVibGljIEJvb2ttYXJrIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50OwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHF1ZXJ5IHN0cmluZyB0byB0aGlzIGJvb2ttYXJrLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpCi0JewotCQlyZXR1cm4gcXVlcnlTdHJpbmc7Ci0JfQotCQotCS8qKgotCSAqIHNldCB0aGUgcXVlcnkgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIHF1ZXJ5U3RyIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5U3RyaW5nKFN0cmluZyBxdWVyeVN0cikKLQl7Ci0JCXRoaXMucXVlcnlTdHJpbmcgPSBxdWVyeVN0cjsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSB4bWwgZG9jdW1lbnQgZm9yIHRoaXMgYm9va21hcmsuCi0JICogCi0JICogQHJldHVybiBYbWxFbGVtZW50Ci0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudCgpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gbmV3IFhtbEVsZW1lbnQoIkVsZW1lbnQiKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiZ3VpZCIsIGdldFVuaXF1ZUlkKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgZ2V0UHJlc2VudGF0aW9uTmFtZSgpLnRyaW0oKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoImNsb3NlZEljb25OYW1lIiwgZ2V0Q2xvc2VkSWNvbk5hbWUoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm9wZW5JY29uTmFtZSIsIGdldE9wZW5JY29uTmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiZXhpc3QiLCBpc0V4aXN0KCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkiZnJvbUNvbnRlbnRMaWJyYXJ5IiwgaXNGcm9tQ29udGVudExpYnJhcnkoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJLnNldEF0dHJpYnV0ZSgidmlzaWJsZSIsIGlzVmlzaWJsZSgpID8gInRydWUiIDogImZhbHNlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkuc2V0QXR0cmlidXRlKCJlbmFibGVkIiwgaXNFbmFibGVkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCS5zZXRBdHRyaWJ1dGUoInRyYW5zcGFyZW50IiwgaXNUcmFuc3BhcmVudCgpID8gInRydWUiIDogImZhbHNlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkuc2V0QXR0cmlidXRlKCJkZWZhdWx0IiwgaXNEZWZhdWx0KCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCS5zZXRBdHRyaWJ1dGUoImN1cnJlbnQiLCBpc0N1cnJlbnQoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJjbG9zZWRJY29uSWQiLCBnZXRJY29uSWQoZ2V0Q2xvc2VkSWNvbk5hbWUoKSkpOwotCQkKLQkJU3RyaW5nIHFTdHIgPSBnZXRRdWVyeVN0cmluZygpOwotCQlpZiAoIHFTdHIgPT0gbnVsbCB8fCBxU3RyLmxlbmd0aCgpID09IDAgKSB7Ci0JCQlxU3RyID0gIj9ub2RlSWQ9IiArIGVsZW1lbnRYbWwuZ2V0SWQoKTsKLQkJfSBlbHNlIHsKLQkJCXFTdHIgKz0gIiZub2RlSWQ9IiArIGVsZW1lbnRYbWwuZ2V0SWQoKTsgCi0JCX0KLQkJCi0JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJ1cmwiLCBnZXRGaWxlTmFtZSgpICsgcVN0cik7IC8vJE5PTi1OTFMtMSQKLQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRDaGlsZENvdW50KCk7IGkrKykgewotCQkJQm9va21hcmsgY2hpbGQgPSAoQm9va21hcmspIGdldEFjdHVhbENoaWxkQXQoaSk7Ci0JCQllbGVtZW50WG1sLmFkZENoaWxkKGNoaWxkLmdldFhtbEVsZW1lbnQoKSk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLQkJcmV0dXJuIGdldEZpbGVOYW1lKCkgKyBnZXRRdWVyeVN0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEljb25JZChTdHJpbmcgaWNvbkZpbGVOYW1lKSB7Ci0JCWlmICggaWNvbkZpbGVOYW1lID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQotCQlyZXR1cm4gSW50ZWdlci50b0hleFN0cmluZyhpY29uRmlsZU5hbWUuaGFzaENvZGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Cb29rbWFya0xpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Cb29rbWFya0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWRhMTA2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvQm9va21hcmtMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIGEgbGlzdCBvZiBib29rbWFya3MKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJvb2ttYXJrTGlzdCB7Ci0KLQkvLyBhIGxpc3Qgb2YgYm9va21hcmsgaXRlbXMKLQlwcml2YXRlIExpc3QgYm9va21hcmtzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogZGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqCi0JICovCi0JcHVibGljIEJvb2ttYXJrTGlzdCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSBuZXcgYm9va21hcmsgIGVudHJ5IHRvIHRoZSBsaXN0Ci0JICogQHBhcmFtIG5hbWUgU3RyaW5nIHRoZSBCb29rbWFyayBuYW1lCi0JICogQHBhcmFtIGZpbGVOYW1lIFN0cmluZyB0aGUgZmlsZSBuYW1lIG9mIHRoZSBib29rbWFyawotCSAqIEBwYXJhbSBzZXRBc0RlZmF1bHQgYm9vbGVhbiBzZXQgdGhlIGJvb2ttYXJrIGFzIGRlZmF1bHQgaWYgdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRCb29rbWFyayhTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbGVOYW1lLCBib29sZWFuIHNldEFzRGVmYXVsdCkgewotCQlfQm9va21hcmtFbnRyeSBlbnRyeSA9IG5ldyBfQm9va21hcmtFbnRyeShuYW1lLCBmaWxlTmFtZSwgc2V0QXNEZWZhdWx0KTsKLQkJYm9va21hcmtzLmFkZChlbnRyeSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGEgbGlzdCBvZiBib29rbWFyayBlbnRyaWVzCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0Qm9va21hcmtzKCkgewotCQlyZXR1cm4gYm9va21hcmtzOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgeG1sIGRvY3VtZW50IGZvciB0aGUgYm9va21hcmsgZW50cmllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KCkgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBuZXcgWG1sRWxlbWVudCgiQm9va21hcmtzIik7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYm9va21hcmtzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCV9Cb29rbWFya0VudHJ5IGVudHJ5ID0gKF9Cb29rbWFya0VudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgYm9va21hcmsgPSBlbnRyeS5maWxlTmFtZTsKLQotCQkJLy8gU3RyaW5nIHRhYk5hbWU9IiI7Ci0JCQlTdHJpbmcgdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBpbmR4ID0gYm9va21hcmsubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZHggPiAwKSB7Ci0JCQkJLy8gdGFiTmFtZSA9IGJvb2ttYXJrLnN1YnN0cmluZygwLCBpbmR4KS5yZXBsYWNlKCdfJywgJyAnKTsKLQkJCQl1cmwgPSBib29rbWFyay5zdWJzdHJpbmcoMCwgaW5keCkgKyAiLmh0bWwiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbGVtZW50WG1sLm5ld0NoaWxkKCJCb29rbWFyayIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGJvb2ttYXJrKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoInRhYk5hbWUiLCBlbnRyeS50YWJOYW1lKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoInVybCIsIHVybCkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCSJkZWZhdWx0IiwgKGVudHJ5LmlzRGVmYXVsdCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCXByaXZhdGUgY2xhc3MgX0Jvb2ttYXJrRW50cnkgewotCQlwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKLQotCQlwcml2YXRlIFN0cmluZyB0YWJOYW1lOwotCi0JCWJvb2xlYW4gaXNEZWZhdWx0OwotCi0JCV9Cb29rbWFya0VudHJ5KFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsZU5hbWUsIGJvb2xlYW4gaXNEZWZhdWx0KSB7Ci0JCQl0aGlzLnRhYk5hbWUgPSBuYW1lLnRyaW0oKTsKLQkJCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLQkJCXRoaXMuaXNEZWZhdWx0ID0gaXNEZWZhdWx0OwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9EZWZhdWx0Q29udGVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjBmMDhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9EZWZhdWx0Q29udGVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBJQ29udGVudFZhbGlkYXRvci4gVGhpcyB2YWxpZGF0b3IgaXMgdXNlZCBmb3IgYnJvd3NpbmcgYW5kIHByZXZpZXcKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29udGVudFZhbGlkYXRvciBpbXBsZW1lbnRzIElDb250ZW50VmFsaWRhdG9yIHsKLQotCXByb3RlY3RlZCBQcmludFN0cmVhbSBpbmZvOwotCi0JcHJvdGVjdGVkIFByaW50U3RyZWFtIHdhcm5pbmc7Ci0KLQlwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gZXJyb3I7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YkRpcjsKLQotCXByb3RlY3RlZCBib29sZWFuIHNob3dCcm9rZW5MaW5rcyA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWZhdWx0X3Nob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycyA9IHRydWU7Ci0JCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKgotCSAqLwotCXB1YmxpYyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBwdWJEaXIKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IoU3RyaW5nIHB1YkRpcikgewotCQl0aGlzLnB1YkRpciA9IHB1YkRpcjsKLQkJaW5mbyA9IFN5c3RlbS5vdXQ7Ci0JCXdhcm5pbmcgPSBTeXN0ZW0ub3V0OwotCQllcnJvciA9IFN5c3RlbS5lcnI7Ci0JfQotCi0JLyoqCi0JICogc2V0IHB1Ymxpc2ggZGlyCi0JICogQHBhcmFtIHB1YkRpciBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoRGlyKFN0cmluZyBwdWJEaXIpIHsKLQkJdGhpcy5wdWJEaXIgPSBwdWJEaXI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaERpcigpIHsKLQkJcmV0dXJuIHRoaXMucHViRGlyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNob3dCcm9rZW5MaW5rcyhib29sZWFuIGZsYWcpIHsKLQkJc2hvd0Jyb2tlbkxpbmtzID0gZmxhZzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc2hvd0Jyb2tlbkxpbmtzKCkgewotCQlyZXR1cm4gc2hvd0Jyb2tlbkxpbmtzOwotCX0KLQlwdWJsaWMgTGlua0luZm8gdmFsaWRhdGVMaW5rKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBhdHRyaWJ1dGVzLAotCQkJU3RyaW5nIHRleHQsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0KLQkJTGlua0luZm8gaW5mbyA9IG5ldyBMaW5rSW5mbyhvd25lciwgdGhpcywgcHViRGlyKTsKLQkJaW5mby52YWxpZGF0ZUxpbmsoYXR0cmlidXRlcywgdGV4dCwgY29uZmlnKTsKLQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWluZm8KLQkJCQkucHJpbnRsbihOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEsICgob3duZXIgPT0gbnVsbCkgPyAiIiA6IExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG93bmVyKSkgKyAiOiAiICsgbWVzc2FnZSkpOyAKLQkJaW5mby5mbHVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJd2FybmluZwotCQkJCS5wcmludGxuKE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNCwgKChvd25lciA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUob3duZXIpKSArICI6ICIgKyBtZXNzYWdlKSk7IAotCQl3YXJuaW5nLmZsdXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aCkgewotCQllcnJvcgotCQkJCS5wcmludGxuKE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNywgKChvd25lciA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUob3duZXIpKSArICI6ICIgKyBtZXNzYWdlKSk7IAotCQlpZiAodGggIT0gbnVsbCkgewotCQkJdGgucHJpbnRTdGFja1RyYWNlKGVycm9yKTsKLQkJfQotCQllcnJvci5mbHVzaCgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbWVzc2FnZSkgewotCQlsb2dJbmZvKG51bGwsIG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbG9nV2FybmluZyhudWxsLCBtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRoKSB7Ci0JCWxvZ0Vycm9yKG51bGwsIG1lc3NhZ2UsIHRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dNaXNzaW5nUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsCi0JCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQpIHsKLQkJbG9nV2FybmluZygKLQkJCQlvd25lciwKLQkJCQlOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEwLCBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShyZWZFbGVtZW50KSkpOyAKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dNaXNzaW5nUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBndWlkLAotCQkJU3RyaW5nIGxpbmtlZFRleHQpIHsKLQkJbG9nV2FybmluZyhvd25lciwgTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMSwgZ3VpZCkpOyAKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dNaXNzaW5nUmVzb3VyY2UoTWV0aG9kRWxlbWVudCBvd25lciwgRmlsZSByZXNvdXJjZUZpbGUsCi0JCQlTdHJpbmcgdXJsKSB7Ci0JCVN0cmluZyBtc2c7Ci0JCWlmIChyZXNvdXJjZUZpbGUgIT0gbnVsbCkgewotCQkJbXNnID0gTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMiwgcmVzb3VyY2VGaWxlLmdldFBhdGgoKSwgdXJsKTsgCi0JCX0gZWxzZSB7Ci0JCQltc2cgPSBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE1LCB1cmwpOyAKLQkJfQotCi0JCWxvZ1dhcm5pbmcob3duZXIsIG1zZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9nSW52YWxpZEV4dGVybmFsTGluayhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgdXJsLAotCQkJU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3RyaW5nIHRleHQ7Ci0JCWlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5sZW5ndGgoKSA+IDApIHsKLQkJCXRleHQgPSBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE5LCB1cmwsIG1lc3NhZ2UpOyAKLQkJfSBlbHNlIHsKLQkJCXRleHQgPSBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE3LCB1cmwpOyAKLQkJfQotCQlsb2dXYXJuaW5nKG93bmVyLCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBkaXNjYXJkZWQgb3Igbm90Ci0JICogZGlzY2FyZGVkIGVsZW1lbnRzIHdpbGwgYmUgdHJlYXRlZCBhcyBvdXQgc2lkZSB0aGUgY29uZmlndXJzYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudCB0aGUgb3duZXIgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gT2JqZWN0IGZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlIG9yIE9wcG9zaXRlRmVhdHVyZQotCSAqIEBwYXJhbSBlIE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gYmUgY2hlY2tlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzY2FyZGVkKE1ldGhvZEVsZW1lbnQgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvd25lciwgTWV0aG9kRWxlbWVudCBlKQotCXsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2V0RGlzY2FyZGVkRWxlbWVudChNZXRob2RFbGVtZW50IGUpIHsKLQkJCi0JfQotCQotCXB1YmxpYyBib29sZWFuIHNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGRlZmF1bHRfc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdFNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycyhib29sZWFuIHNob3cpIHsKLQkJZGVmYXVsdF9zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMgPSBzaG93OwotCX0KLQkKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0RlZmF1bHRTaGFwZWljb25zLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRGVmYXVsdFNoYXBlaWNvbnMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDhiNTYyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRGVmYXVsdFNoYXBlaWNvbnMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBEZWZhdWx0IFNoYXBlIEljb24gTWFwcGluZyBmb3IgdGhlIE1ldGhvZCBFbGVtZW50cy4KLQotIyBDb3JlIE1ldGhvZCBFbGVtZW50cwotYXJ0aWZhY3Q9aW1hZ2VzL2FydGlmYWN0LmdpZgotY29udGVudGVsZW1lbnQ9aW1hZ2VzL2d1aWRhbmNlLmdpZgotY29udGVudHBhY2thZ2U9aW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYKLWRlbGl2ZXJhYmxlPWltYWdlcy9hcnRpZmFjdC5naWYKLW1ldGhvZHBsdWdpbj1pbWFnZXMvbWV0aG9kX3BsdWdpbi5naWYKLW91dGNvbWU9aW1hZ2VzL2FydGlmYWN0LmdpZgotcm9sZT1pbWFnZXMvcm9sZS5naWYKLXRhc2s9aW1hZ2VzL3Rhc2suZ2lmCi0KLSMgR3VpZGFuY2UKLWNoZWNrbGlzdD1pbWFnZXMvY2hlY2tsaXN0LmdpZgotY29uY2VwdD1pbWFnZXMvY29uY2VwdC5naWYKLWV4YW1wbGU9aW1hZ2VzL2V4YW1wbGUuZ2lmCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM9aW1hZ2VzL2VzdGltYXRpb25jb25zaWRlcmF0aW9ucy5naWYKLWd1aWRhbmNlPWltYWdlcy9ndWlkYW5jZS5naWYKLWd1aWRsaW5lPWltYWdlcy9ndWlkbGluZS5naWYKLXByYWN0aWNlPWltYWdlcy9wcmFjdGljZS5naWYKLXJvYWRtYXA9aW1hZ2VzL3JvYWRtYXAuZ2lmCi1yZXBvcnQ9aW1hZ2VzL3JlcG9ydC5naWYKLXJldXNhYmxlYXNzZXQ9aW1hZ2VzL3JldXNhYmxlYXNzZXQuZ2lmCi1zdXBwb3J0aW5nbWF0ZXJpYWw9aW1hZ2VzL3N1cHBvcnRpbmdtYXRlcmlhbC5naWYKLXRlY2huaXF1ZT1pbWFnZXMvdGVjaG5pcXVlLmdpZgotdGVtcGxhdGU9aW1hZ2VzL3RlbXBsYXRlLmdpZgotdGVybWRlZmluaXRpb249aW1hZ2VzL3Rlcm1kZWZpbml0aW9uLmdpZgotdG9vbG1lbnRvcj1pbWFnZXMvdG9vbG1lbnRvci5naWYKLXdoaXRlcGFwZXI9aW1hZ2VzL3doaXRlcGFwZXIuZ2lmCi0KLSMgQ29udGVudCBDYXRlZ29yaWVzCi1jdXN0b21jYXRlZ29yeT1pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgotZGlzY2lwbGluZT1pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgotZGlzY2lwbGluZWdyb3VwaW5nPWltYWdlcy9jb250ZW50X3BhY2thZ2UuZ2lmCi1kb21haW49aW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYKLXJvbGVzZXQ9aW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYKLXJvbGVzZXRncm91cGluZz1pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgotdG9vbD1pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgotd29ya3Byb2R1Y3R0eXBlPWltYWdlcy9jb250ZW50X3BhY2thZ2UuZ2lmCi0KLSMgUHJvY2VzcyBFbGVtZW50cwotYWN0aXZpdHk9aW1hZ2VzL3Byb2Nlc3MuZ2lmCi1jYXBhYmlsaXR5cGF0dGVybj1pbWFnZXMvcHJvY2Vzcy5naWYKLWRlbGl2ZXJ5cHJvY2Vzcz1pbWFnZXMvcHJvY2Vzcy5naWYKLWl0ZXJhdGlvbj1pbWFnZXMvcHJvY2Vzcy5naWYKLXBoYXNlPWltYWdlcy9wcm9jZXNzLmdpZgotcHJvY2Vzcz1pbWFnZXMvcHJvY2Vzcy5naWYKLQotIyBEZXNjcmlwdG9ycwotY29tcG9zaXRlcm9sZT1pbWFnZXMvY29tcG9zaXRlcm9sZS5naWYKLXJvbGVkZXNjcmlwdG9yPWltYWdlcy9yb2xlZGVzX2xnX2RnbTMyLmdpZgotdGFza2Rlc2NyaXB0b3I9aW1hZ2VzL3Rhc2tkZXNfbGdfZGdtMzIuZ2lmCi10ZWFtcHJvZmlsZT1pbWFnZXMvdGVhbXByb2ZpbGUuZ2lmCi13b3JrcHJvZHVjdGRlc2NyaXB0b3I9aW1hZ2VzL3dvcmtkZXNfbGdfZGdtMzIuZ2lmCi1taWxlc3RvbmU9aW1hZ2VzL21pbGVzdG9uZS5naWYKLQotIyBNaXNjCi1nZW5lcmFsPWltYWdlcy9ndWlkYW5jZS5naWYKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9FbGVtZW50TGF5b3V0TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0VsZW1lbnRMYXlvdXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5YmZmYTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0VsZW1lbnRMYXlvdXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkRlZmF1bHRFbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLklBY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BYnN0cmFjdEVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkdlbmVyYWxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSBFbGVtZW50TGF5b3V0TWFuYWdlci5jbGFzcwotCQkJLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdF9jb25maWdfcGF0aCA9ICJub2NvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgYm9vbGVhbiBpc1B1Ymxpc2hpbmdNb2RlID0gZmFsc2U7IC8vIGRlZmF1bHQgdG8gYnJvd3NpbmcgbW9kZQotCQotCXByaXZhdGUgU3RyaW5nIHB1Ymxpc2hfZGlyID0gbnVsbDsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCi0JcHJpdmF0ZSBJQWN0aXZpdHlEaWFncmFtU2VydmljZSBkaWFncmFtU2VydmljZSA9IG51bGw7Ci0KLQkvLyBuZWVkIHRvIHNlcGVyYXRlIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9ybSBjb250ZW50IGFuZCBkaWFncmFtCi0JLy8gZGlhZ3JhbSBhZGFwdG9yIGZhY3Rvcnkgc2hvdWxkIG5vdCBiZSByb2xsZWQgdXAKLQlwcml2YXRlIExheW91dEFkYXB0ZXJGYWN0b3J5IGNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBMYXlvdXRBZGFwdGVyRmFjdG9yeSBkaWFncmFtTGF5b3V0QWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQotCS8vIGNhY2hlIHRoZSBzdXBwcmVzc2lvbiBvYmplY3QgZm9yIHB1Ymxpc2hpbmcgbW9kZWwgb25seQotCS8vIG1hcCBvZiBwcm9jIGd1aWQgdG8gU3VwcHJlc2lpb24gb2JqZWN0CQotCXByaXZhdGUgTWFwIHN1cHJlc3Npb25NYXAgPSBudWxsOwotCQotCXByaXZhdGUgSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLQkKLQlwcml2YXRlIEVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IG51bGw7Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoaW5nTW9kZSgpCi0JewotCQlyZXR1cm4gdGhpcy5pc1B1Ymxpc2hpbmdNb2RlOwotCX0KLQkKLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIoKSB7Ci0JCXRoaXMobnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzKGNvbmZpZywgbnVsbCwgbnVsbCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIHB1Ymxpc2hkaXIsIElDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvciwgYm9vbGVhbiBpc1B1Ymxpc2hpbmdNb2RlKSB7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQl0aGlzLmlzUHVibGlzaGluZ01vZGUgPSBpc1B1Ymxpc2hpbmdNb2RlOwotCQkKLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJfQotCi0JCWlmIChwdWJsaXNoZGlyID09IG51bGwpIHsKLQkJCXB1Ymxpc2hkaXIgPSBMYXlvdXRSZXNvdXJjZXMuZ2V0RGVmYXVsdFB1Ymxpc2hEaXIoKTsKLQkJCWlmICghcHVibGlzaGRpci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCQlwdWJsaXNoZGlyICs9IEZpbGUuc2VwYXJhdG9yOwotCQkJfQotCi0JCQkvLyBhbHNvIGFwcGVuZCB0aGUgY29uZmlndXJhdGlvbiBwYXRoCi0JCQlpZiAodGhpcy5jb25maWcgPT0gbnVsbCkgewotCQkJCXB1Ymxpc2hkaXIgKz0gZGVmYXVsdF9jb25maWdfcGF0aDsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIHN0ciA9IFN0clV0aWwucmVtb3ZlU3BlY2lhbENoYXJhY3RlcnModGhpcy5jb25maWcuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoIHN0ciA9PSAiIiApIHsKLQkJCQkJc3RyID0gSW50ZWdlci50b0hleFN0cmluZyh0aGlzLmNvbmZpZy50b1N0cmluZygpLmhhc2hDb2RlKCkpOwotCQkJCX0KLQkJCQlwdWJsaXNoZGlyICs9IHN0cjsKLQkJCX0KLQkJfQotCi0JCXNldFB1Ymxpc2hEaXIocHVibGlzaGRpcik7Ci0KLQkJY29udGVudExheW91dEFkYXB0ZXJGYWN0b3J5ID0gbmV3IExheW91dEFkYXB0ZXJGYWN0b3J5KHRoaXMuY29uZmlnKTsKLQkJZGlhZ3JhbUxheW91dEFkYXB0ZXJGYWN0b3J5ID0gbmV3IExheW91dEFkYXB0ZXJGYWN0b3J5KHRoaXMuY29uZmlnKTsKLQkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIElDb250ZW50VmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQl2YWxpZGF0b3IgPSBuZXcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IoZ2V0UHVibGlzaERpcigpKTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQkKLQlwdWJsaWMgRWxlbWVudFJlYWxpemVyIGdldEVsZW1lbnRSZWFsaXplcigpIHsKLQkJaWYgKCByZWFsaXplciA9PSBudWxsICkgewotCQkJcmVhbGl6ZXIgPSBuZXcgRGVmYXVsdEVsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkJcmVhbGl6ZXIuc2V0RmlsdGVyKGNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeS5nZXRGaWx0ZXIoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiByZWFsaXplcjsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50UmVhbGl6ZXIoRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXRoaXMucmVhbGl6ZXIgPSByZWFsaXplcjsJCQotCX0KLQkKLQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRXQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeS53YnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRUQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeS50YnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRXUEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBjb250ZW50TGF5b3V0QWRhcHRlckZhY3Rvcnkud3Bic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldENCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gY29udGVudExheW91dEFkYXB0ZXJGYWN0b3J5LmNic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldERpYWdyYW1BZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGRpYWdyYW1MYXlvdXRBZGFwdGVyRmFjdG9yeS53YnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlEaWFncmFtU2VydmljZShJQWN0aXZpdHlEaWFncmFtU2VydmljZSBkaWFncmFtU2VydmljZSkgewotCQl0aGlzLmRpYWdyYW1TZXJ2aWNlID0gZGlhZ3JhbVNlcnZpY2U7Ci0JfQotCi0JcHVibGljIElBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGdldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoKSB7Ci0JCXJldHVybiB0aGlzLmRpYWdyYW1TZXJ2aWNlOwotCX0KLQotCXB1YmxpYyBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbihQcm9jZXNzIHByb2MpCi0JewotCQlTdXBwcmVzc2lvbiBzdXAgPSBudWxsOwotCQlpZiAoIGlzUHVibGlzaGluZ01vZGUpCi0JCXsKLQkJCWlmICggc3VwcmVzc2lvbk1hcCA9PSBudWxsICkKLQkJCXsKLQkJCQlzdXByZXNzaW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCX0KLQkJCVN0cmluZyBndWlkID0gcHJvYy5nZXRHdWlkKCk7Ci0JCQlzdXAgPSAoU3VwcHJlc3Npb24pc3VwcmVzc2lvbk1hcC5nZXQoZ3VpZCk7Ci0JCQlpZiAoIHN1cCA9PSBudWxsICkKLQkJCXsKLQkJCQlzdXAgPSBuZXcgU3VwcHJlc3Npb24ocHJvYyk7Ci0JCQkJc3VwcmVzc2lvbk1hcC5wdXQoZ3VpZCwgc3VwKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXN1cCA9IG5ldyBTdXBwcmVzc2lvbihwcm9jKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJlcGFyZUFkYXB0b3JGYWN0b3JpZXNGb3JQcm9jZXNzKFByb2Nlc3MgcHJvYykKLQl7Ci0JCS8vIG5lZWQgdG8gaXRlcmF0ZSB0aGUgYWRhcHRvciBmYWN0b3J5IHRvIGdlbmVyYXRlIHRoZSBhZGFwdG9yIHRyZWUKLQkJcHJlcGFyZUFkYXB0ZXJmYWN0b3J5Rm9yKGdldENCU0FkYXB0ZXJGYWN0b3J5KCksIHByb2MpOwotCQlwcmVwYXJlQWRhcHRlcmZhY3RvcnlGb3IoZ2V0VEJTQWRhcHRlckZhY3RvcnkoKSwgcHJvYyk7Ci0JCXByZXBhcmVBZGFwdGVyZmFjdG9yeUZvcihnZXRXQlNBZGFwdGVyRmFjdG9yeSgpLCBwcm9jKTsKLQkJcHJlcGFyZUFkYXB0ZXJmYWN0b3J5Rm9yKGdldFdQQlNBZGFwdGVyRmFjdG9yeSgpLCBwcm9jKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVBZGFwdGVyZmFjdG9yeUZvcigKLQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsIHx8IGFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBvYmo7Ci0JCX0gZWxzZSB7Ci0JCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iaiwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHJhd2l0ZW0gPSBpdC5uZXh0KCk7Ci0KLQkJCQlNZXRob2RFbGVtZW50IGl0ZW0gPSAoTWV0aG9kRWxlbWVudCkgTGlicmFyeVV0aWwKLQkJCQkJCS51bndyYXAocmF3aXRlbSk7Ci0JCQkJaWYgKChpdGVtIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJCXByZXBhcmVBZGFwdGVyZmFjdG9yeUZvcihhZGFwdGVyRmFjdG9yeSwgcmF3aXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgSUVsZW1lbnRMYXlvdXQgY3JlYXRlTGF5b3V0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYW4gYWN0aXZpdHksIHdlIG5lZWQgdG8gZmluZWQgdGhlIHBhdGggdG8gdGhlIHByb2Nlc3MKLQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQlQcm9jZXNzIG93bmluZ1Byb2MgPSBudWxsOwotCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSApCi0JCXsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSllbGVtZW50OwotCQkJcGF0aCA9IEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQuZ2V0UGF0aChhY3QpOwotCQkJb3duaW5nUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpOwotCQl9Ci0JCQotCQlyZXR1cm4gY3JlYXRlTGF5b3V0KGVsZW1lbnQsIG93bmluZ1Byb2MsIHBhdGgpOwotCX0KLQotCXB1YmxpYyBJRWxlbWVudExheW91dCBjcmVhdGVMYXlvdXQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJUHJvY2VzcyBvd25pbmdQcm9jLCBTdHJpbmcgcGF0aCkgewotCQlBYnN0cmFjdEVsZW1lbnRMYXlvdXQgbGF5b3V0ID0gbnVsbDsKLQotCQlTdHJpbmcgY2xhc3NOYW1lOwotCQlpZiAoQ29uZmlndXJhdGlvbkhlbHBlci5pc0Rlc2NyaXB0aW9uRWxlbWVudChlbGVtZW50KSkgewotCQkJY2xhc3NOYW1lID0gIkNvbnRlbnREZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWNsYXNzTmFtZSA9ICJBY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmICgoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KQotCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSkgewotCQkJY2xhc3NOYW1lID0gIldvcmtCcmVha2Rvd25FbGVtZW50IjsgLy8kTk9OLU5MUy0xJCAgLy8gdGFza2Rlc2NyaXB0b3IgaGFzIGl0J3Mgb3duIGxheW91dAotCQl9IGVsc2UgewotCQkJQ2xhc3MgaVtdID0gZWxlbWVudC5nZXRDbGFzcygpLmdldEludGVyZmFjZXMoKTsKLQkJCWlmIChpICE9IG51bGwgJiYgaS5sZW5ndGggPT0gMSkgewotCQkJCWNsYXNzTmFtZSA9IGlbMF0uZ2V0TmFtZSgpOwotCQkJfSBlbHNlIHsKLQkJCQljbGFzc05hbWUgPSBlbGVtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJfQotCi0JCQlpbnQgaW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZGV4ID49IDApIHsKLQkJCQljbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQl9Ci0JCX0KLQotCQljbGFzc05hbWUgPSBQQUNLQUdFX05BTUUgKyAiLmVsZW1lbnRzLiIgKyBjbGFzc05hbWUgKyAiTGF5b3V0IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJdHJ5IHsKLQkJCUNsYXNzIGMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQkJbGF5b3V0ID0gKEFic3RyYWN0RWxlbWVudExheW91dCkgYy5uZXdJbnN0YW5jZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJaWYgKGxheW91dCA9PSBudWxsKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxheW91dCBjbGFzcyAnIiArIGNsYXNzTmFtZSArICInIGZvciBlbGVtZW50Ci0JCQkvLyAnIiArIGVsZW1lbnQuZ2V0TmFtZSgpICsgIicgbm90IGRlZmluZWQuIFVzZSBHZW5lcmFsTGF5b3V0Iik7Ci0JCQlsYXlvdXQgPSBuZXcgR2VuZXJhbExheW91dCgpOwotCQl9Ci0KLQkJaWYgKGxheW91dCBpbnN0YW5jZW9mIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQpIHsKLQkJCSgoQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dCkgbGF5b3V0KS5pbml0KHRoaXMsIGVsZW1lbnQsCi0JCQkJCW93bmluZ1Byb2MsIHBhdGgpOwotCQl9IGVsc2UgewotCQkJbGF5b3V0LmluaXQodGhpcywgZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gbGF5b3V0OwotCX0KLQotCXB1YmxpYyBJRWxlbWVudExheW91dCBnZXRMYXlvdXQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGNyZWF0ZSkgewotCQkvLyBTdHJpbmcgaWQgPSBlbGVtZW50LmdldEd1aWQoKTsKLQkJSUVsZW1lbnRMYXlvdXQgbGF5b3V0ID0gbnVsbDsgLy8gKElFbGVtZW50TGF5b3V0KWxheW91dE1hcC5nZXQoaWQpOwotCQlpZiAoKGxheW91dCA9PSBudWxsKSAmJiBjcmVhdGUpIHsKLQkJCWxheW91dCA9IGNyZWF0ZUxheW91dChlbGVtZW50KTsKLQkJCS8vIGxheW91dE1hcC5wdXQoaWQsIGxheW91dCk7Ci0JCX0KLQotCQlyZXR1cm4gbGF5b3V0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9wYXJhbWV0ZXJzID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSJcXD9wcm9jPSguKj8pJnBhdGg9KC4qKT8iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJRWxlbWVudExheW91dCBnZXRMYXlvdXQoU3RyaW5nIHVybCkgewotCi0JCVByb2Nlc3Mgb3duaW5nUHJvYyA9IG51bGw7Ci0JCVN0cmluZyBwYXRoID0gbnVsbDsKLQotCQlNYXRjaGVyIG0gPSBwX3BhcmFtZXRlcnMubWF0Y2hlcih1cmwpOwotCQlpZiAobS5maW5kKCkpIHsKLQkJCVN0cmluZyBwcm9jID0gbS5ncm91cCgxKTsKLQkJCXBhdGggPSBtLmdyb3VwKDIpOwotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJb3duaW5nUHJvYyA9IChQcm9jZXNzKSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoCi0JCQkJCQlwcm9jKTsKLQkJCX0KLQkJfQotCi0JCS8vIE1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KXVybE1hcC5nZXQodXJsKTsKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudEZyb21GaWxlTmFtZSh1cmwpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY3JlYXRlTGF5b3V0KGVsZW1lbnQsIG93bmluZ1Byb2MsIHBhdGgpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW4ndCBmaW5kIGVsZW1lbnQgZm9yIHVybCAnIiArIHVybCArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRRdWVyeVN0cmluZyhTdHJpbmcgcHJvYywgU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuICI/IiArIFJlc291cmNlSGVscGVyLlVSTF9QQVJBTUVURVJfUFJPQ0VTUyArICI9IiArIHByb2MgKyAiJiIKLQkJCQkrIFJlc291cmNlSGVscGVyLlVSTF9QQVJBTUVURVJfUEFUSCArICI9IiArIHBhdGg7Ci0JfQotCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuY29uZmlnOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hEaXIoU3RyaW5nIHBhdGgpIHsKLQkJdGhpcy5wdWJsaXNoX2RpciA9IHBhdGg7Ci0JCWlmICggIXRoaXMucHVibGlzaF9kaXIuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpICkgewotCQkJdGhpcy5wdWJsaXNoX2RpciArPSBGaWxlLnNlcGFyYXRvcjsKLQkJfQotCi0JCS8vIGluaXRpYWxpemUgcHVibGlzaGluZyBzaXRlIGlmIG5lZWRlZAotCQlpbml0X3B1Ymxpc2hpbmdTaXRlKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hEaXIoKSB7Ci0JCXJldHVybiB0aGlzLnB1Ymxpc2hfZGlyOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0X3B1Ymxpc2hpbmdTaXRlKCkgewotCQlpZiAoIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCkgKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJCZWdpbiBpbml0aWFsaXppbmcgcHVibGlzaGluZyBzaXRlOiAiICsgcHVibGlzaF9kaXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCS8vIGNvcHkgdGhlIGxheW91dCBmaWxlcyBmcm9tIHBsdWdpbiBsYXlvdXQgdG8gcHVibGlzaGlnbiBzaXRlCi0JCUxheW91dFJlc291cmNlcy5jb3B5TGF5b3V0RmlsZXMocHVibGlzaF9kaXIpOwotCi0JCWlmICggTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKSApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRW5kIGluaXRpYWxpemluZyBwdWJsaXNoaW5nIHNpdGU6ICIgKyBwdWJsaXNoX2Rpcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNvcHlMaWJyYXJ5UmVzb3VyY2VzKCkgewotCQlpZiAoIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCkgKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJCZWdpbiBjb3B5aW5nIGxpYnJhcnkgcmVzb3VyY2VzIHRvIHB1Ymxpc2hpbmcgc2l0ZTogIiArIHB1Ymxpc2hfZGlyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQkvLyBjb3B5IGxpYnJhcnkgcmVzb3VyY2VzIGZyb20gbGlicmFyeSB0byBwdWJsaXNoaW5nIHNpdGUKLQkJRmlsZSBsaWJSb290ID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSk7Ci0JCWlmIChsaWJSb290ICE9IG51bGwpIHsKLQkJCUxheW91dFJlc291cmNlcy5jb3B5RGlyKGxpYlJvb3QuZ2V0UGF0aCgpLCBwdWJsaXNoX2Rpcik7Ci0JCX0KLQotCQlpZiAoIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCkgKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJFbmQgY29weWluZyBsaWJyYXJ5IHJlc291cmNlcyB0byBwdWJsaXNoaW5nIHNpdGU6ICIgKyBwdWJsaXNoX2Rpcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkvLyBsYXlvdXRNYXAuY2xlYXIoKTsKLQkJCi0JCWlmICggc3VwcmVzc2lvbk1hcCAhPSBudWxsICkKLQkJewotCQkJc3VwcmVzc2lvbk1hcC5jbGVhcigpOwotCQl9Ci0JCQotCQljb250ZW50TGF5b3V0QWRhcHRlckZhY3RvcnkuY2xlYXIoKTsKLQkJZGlhZ3JhbUxheW91dEFkYXB0ZXJGYWN0b3J5LmNsZWFyKCk7Ci0JCQotCQlpZiAoIHZhbGlkYXRvciAhPSBudWxsICkKLQkJewotCQkJdmFsaWRhdG9yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBMYXlvdXRBZGFwdGVyRmFjdG9yeQotCXsKLQkJcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnkgd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB0YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHdwYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQotCQlQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIgY29uZmlndXJhdG9yID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBMYXlvdXRBZGFwdGVyRmFjdG9yeShNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykKLQkJewotCQkJLy8gY3JlYXRlIGFkYXB0IGZhY3RvcmllcwotCQkJLy8KLQkJCWlmKGlzUHVibGlzaGluZ01vZGUoKSkgewotCQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVB1Ymxpc2hpbmdXQlNBZGFwdGVyRmFjdG9yeSgpOwotCQkJCXRic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVB1Ymxpc2hpbmdUQlNBZGFwdGVyRmFjdG9yeSgpOwotCQkJCXdwYnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVQdWJsaXNoaW5nV1BCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJY2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHVibGlzaGluZ0NCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJdGJzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCXdwYnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWNic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQl9Ci0KLQkJCS8vIHNldCBjb25maWd1cmF0aW9uIGZpbHRlcgotCQkJY29uZmlndXJhdG9yID0gbmV3IFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcihtZXRob2RDb25maWcsIHRoaXMpOwotCi0JCQl3YnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsKLQkJCXRic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihjb25maWd1cmF0b3IpOwotCQkJd3Bic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihjb25maWd1cmF0b3IpOwotCQkJY2JzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7CQkKLQkJfQotCQkKLQkJcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQkJcmV0dXJuIGNvbmZpZ3VyYXRvcjsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY2xlYXIoKQotCQl7Ci0JCQlpZiAod2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXdic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0KLQkJCWlmICh0YnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJdGJzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJCXRic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKHdwYnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJd3Bic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQl3cGJzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCi0JCQlpZiAoY2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWNic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQljYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9IdG1sQnVpbGRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0h0bWxCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4YTEyNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0h0bWxCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlRpbWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sLlhTTFRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuQ29udGVudFJlc291cmNlU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5DYWxlbmRhcjsKLQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgSFRNTCBwYWdlIGZvciBhIE1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIdG1sQnVpbGRlciB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQotCXByaXZhdGUgUHJvcGVydGllcyB4c2xQYXJhbXMgPSBudWxsOwotCi0JcHJpdmF0ZSBFbGVtZW50TGF5b3V0TWFuYWdlciBtZ3IgPSBudWxsOwotCi0JcHJpdmF0ZSBDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHNjYW5Db250ZW50ID0gdHJ1ZTsKLQotCS8vIElmIHRydWUsIGRpc3BsYXkgdGhlICJTaG93IHRyZWUgYnJvd3NlIiBpbWFnZS9saW5rIHRvIHRoZSByaWdodCBvZiBhCi0JLy8gcHVibGlzaGVkIHBhZ2UuCi0JcHJpdmF0ZSBib29sZWFuIHNob3dUcmVlQnJvd3NlciA9IGZhbHNlOwotCi0JLy9wcml2YXRlIElDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBIdG1sQnVpbGRlcigpIHsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEh0bWxCdWlsZGVyKEVsZW1lbnRMYXlvdXRNYW5hZ2VyIG1ncikgewotCQlpbml0KCk7Ci0JCXNldExheW91dE1hbmFnZXIobWdyKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCWRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQkJdHJ5IHsKLQkJCXhzbFBhcmFtcyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByb3BlcnRpZXMoCi0JCQkJCSIvbGF5b3V0L3hzbC9yZXNvdXJjZXMucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCS8vIGFkZCB0aGUgY29sb24gcHJvcGVydHksIAotCQkJeHNsUGFyYW1zLnB1dCgiY29sb25fd2l0aF9zcGFjZSIsIExpYnJhcnlSZXNvdXJjZXMuY29sb25fd2l0aF9zcGFjZSk7Ci0JCQkKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJeHNsUGFyYW1zID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHB1Ymxpc2ggZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaERpcigpIHsKLQkJcmV0dXJuIChtZ3IgPT0gbnVsbCkgPyBudWxsIDogbWdyLmdldFB1Ymxpc2hEaXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwdWJsaXNoIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoRGlyKFN0cmluZyBkaXIpIHsKLQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQltZ3Iuc2V0UHVibGlzaERpcihkaXIpOwotCQl9Ci0KLQkJZ2V0U2Nhbm5lcigpLnNldFRhcmdldFJvb3RQYXRoKG5ldyBGaWxlKGdldFB1Ymxpc2hEaXIoKSkpOwotCi0JCS8vIFJlc2V0IHRoZSB2YWxpZGF0b3IncyBwdWJsaXNoIGRpci4KLQkJZ2V0VmFsaWRhdG9yKCkuc2V0UHVibGlzaERpcihkaXIpOwotCX0KLQotLy8JLyoqCi0vLwkgKiBTZXRzIHRoZSBjb250ZW50IHZhbGlkYXRvci4KLS8vCSAqLwotLy8JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKElDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotLy8JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotLy8JCWdldFNjYW5uZXIoKS5zZXRWYWxpZGF0b3IodGhpcy52YWxpZGF0b3IpOwotLy8JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIElDb250ZW50VmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLS8vCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsKLS8vCQkJdmFsaWRhdG9yID0gbmV3IERlZmF1bHRDb250ZW50VmFsaWRhdG9yKGdldFB1Ymxpc2hEaXIoKSk7Ci0vLwkJfQotLy8JCXJldHVybiB2YWxpZGF0b3I7Ci0JCQotCQlyZXR1cm4gdGhpcy5tZ3IuZ2V0VmFsaWRhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCByZXNvdXJjZSBzY2FubmVyLgotCSAqLwotCXByaXZhdGUgQ29udGVudFJlc291cmNlU2Nhbm5lciBnZXRTY2FubmVyKCkgewotCQlpZiAoc2Nhbm5lciA9PSBudWxsKSB7Ci0JCQlzY2FubmVyID0gbmV3IENvbnRlbnRSZXNvdXJjZVNjYW5uZXIobmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpLCBnZXRWYWxpZGF0b3IoKSk7Ci0JCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCQlzY2FubmVyLnNldFRhcmdldFJvb3RQYXRoKG5ldyBGaWxlKGdldFB1Ymxpc2hEaXIoKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzY2FubmVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZsYWcgdG8gZGlzcGxheSB0aGUgIlNob3cgdHJlZSBicm93c2VyIiBpbWFnZS9saW5rLgotCSAqLwotCXB1YmxpYyB2b2lkIGVuYWJsZVRyZWVCcm93c2VyKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnNob3dUcmVlQnJvd3NlciA9IGZsYWc7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlcyBjb250ZW50IHNjYW5uaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGVuYWJsZUNvbnRlbnRTY2FuKGJvb2xlYW4gc2NhbikgewotCQl0aGlzLnNjYW5Db250ZW50ID0gc2NhbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGNvbnRlbnQgc2Nhbm5pbmcgaXMgZW5hYmxlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250ZW50U2NhbkVuYWJsZWQoKSB7Ci0JCXJldHVybiBzY2FuQ29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBFbGVtZW50IExheW91dCBNYW5hZ2VyLgotCSAqIDxwPgotCSAqIEEgRWxlbWVudCBMYXlvdXQgTWFuYWdlciBpcyBhc3NvY2lhdGVkIHdpdGggYSBjb25maWd1cmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExheW91dE1hbmFnZXIoRWxlbWVudExheW91dE1hbmFnZXIgbWdyKSB7Ci0JCXRoaXMubWdyID0gbWdyOwotCQlpZiAodGhpcy5tZ3IgPT0gbnVsbCkgewotCQkJdGhpcy5tZ3IgPSBnZXREZWZhdWx0TGF5b3V0TWFuYWdlcigpOwotCQl9Ci0KLQkJLy8gVXBkYXRlIHRoZSBzY2FubmVyIHRhcmdldCBwYXRoLgotCQlnZXRTY2FubmVyKCkuc2V0VGFyZ2V0Um9vdFBhdGgobmV3IEZpbGUoZ2V0UHVibGlzaERpcigpKSk7Ci0KLQkJLy8gUmVzZXQgdGhlIHZhbGlkYXRvciBwdWIgZGlyLgotCQlnZXRWYWxpZGF0b3IoKS5zZXRQdWJsaXNoRGlyKGdldFB1Ymxpc2hEaXIoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBFbGVtZW50IExheW91dCBNYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0RGVmYXVsdExheW91dE1hbmFnZXIoKSB7Ci0JCXJldHVybiBuZXcgRWxlbWVudExheW91dE1hbmFnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBFbGVtZW50IExheW91dCBNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNYW5hZ2VyKCkgewotCQlpZiAodGhpcy5tZ3IgPT0gbnVsbCkgewotCQkJdGhpcy5tZ3IgPSBnZXREZWZhdWx0TGF5b3V0TWFuYWdlcigpOwotCQkJOwotCQl9Ci0JCXJldHVybiBtZ3I7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBIVE1MIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBBIE1ldGhvZCBlbGVtZW50LgotCSAqIEByZXR1cm4gQSB1cmwgb2YgdGhlIGdlbmVyYXRlZCBjb250ZW50IEhUTUwgZmlsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSHRtbChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHVybCA9IG51bGw7Ci0JCWlmIChkZWJ1ZykgewotCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCUlFbGVtZW50TGF5b3V0IGxheW91dCA9IGdldExheW91dE1hbmFnZXIoKS5nZXRMYXlvdXQoZWxlbWVudCwgdHJ1ZSk7Ci0JCQl1cmwgPSBnZW5lcmF0ZUh0bWwobGF5b3V0KTsKLQkJCWxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiVGltZSB0YWtlbiB0byByZW5kZXIgSFRNTCBwYWdlIGZvciAiICsgZWxlbWVudC5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJIjogIiArIChlbmRUaW1lIC0gc3RhcnRUaW1lKSArICIgbXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gZWxzZSB7Ci0JCQlJRWxlbWVudExheW91dCBsYXlvdXQgPSBnZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0TGF5b3V0KGVsZW1lbnQsIHRydWUpOwotCQkJdXJsID0gZ2VuZXJhdGVIdG1sKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgYSBNZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBUaGUgVVJMIG9mIGEgTWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVIdG1sKFN0cmluZyB1cmwpIHsKLQkJSUVsZW1lbnRMYXlvdXQgbGF5b3V0ID0gZ2V0TGF5b3V0TWFuYWdlcigpLmdldExheW91dCh1cmwpOwotCQlnZW5lcmF0ZUh0bWwobGF5b3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgZm9yIGEgTWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxheW91dAotCSAqICAgICAgICAgICAgQSBNZXRob2QgRWxlbWVudC4gTGF5b3V0IG9iamVjdC4KLQkgKiBAcGFyYW0gbGlua2VkRWxlbWVudHMKLQkgKiAgICAgICAgICAgIElmIG5vdCBudWxsLCB0aGlzIG9iamVjdCB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGEgbGlzdCBvZgotCSAqICAgICAgICAgICAgbGlua2VkIGVsZW1lbnRzIGluIHRoZSBwYWdlLgotCSAqIEByZXR1cm4gQSB1cmwgb2YgdGhlIGdlbmVyYXRlZCBjb250ZW50IEhUTUwgZmlsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSHRtbChJRWxlbWVudExheW91dCBsYXlvdXQpIHsKLQkJaWYgKGxheW91dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gImFib3V0OmJsYW5rIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gYWRkIHRpbWUgbG9nZ2luZyB3aGVuIHB1Ymxpc2hpbmcgZWxlbWVudAotCQlsb25nIHRpbWVfc3RhcnQgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpOwotCQlTdHJpbmcgZWxlbWVudFBhdGggPSBsYXlvdXQuZ2V0RmlsZVBhdGgoKS5yZXBsYWNlKCcvJywKLQkJCQlGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlTdHJpbmcgZWxlbWVudFBhdGhOYW1lID0gZWxlbWVudFBhdGgKLQkJCQkrIGxheW91dC5nZXRGaWxlTmFtZShSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsKLQkJU3RyaW5nIGZpbGVQYXRoID0gdGhpcy5nZXRQdWJsaXNoRGlyKCkgKyBlbGVtZW50UGF0aDsKLQkJU3RyaW5nIGh0bWxfZmlsZSA9IHRoaXMuZ2V0UHVibGlzaERpcigpICsgZWxlbWVudFBhdGhOYW1lOwotCi0JCXRyeSB7Ci0KLQkJCVN0cmluZ0J1ZmZlciB4bWwgPSBnZXRYbWwobGF5b3V0KTsKLQotCQkJU3RyaW5nIHhzbF91cmk7Ci0KLQkJCUZpbGUgZiA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKLQkJCWlmICghZi5leGlzdHMoKSkgewotCQkJCWYubWtkaXJzKCk7Ci0JCQl9Ci0KLQkJCS8vIEdlbmVyYXRlIHRoZSBhZGRpdG9uYWwgb3V0cHV0cy4KLQkJCUxpc3QgbGF5b3V0cyA9IGxheW91dC5nZXRMYXlvdXRzKCk7Ci0JCQl4c2xfdXJpID0gbGF5b3V0LmdldFhzbFVybCgpOwotCQkJZ2VuZXJhdGVIdG1sKGxheW91dCwgeHNsX3VyaSwgaHRtbF9maWxlLCB4bWwpOwotCi0JCQkvLyBHZW5lcmF0ZSBvdGhlciBsYXlvdXQgZmlsZXMuCi0JCQlpZiAobGF5b3V0cyAhPSBudWxsICYmIGxheW91dHMuc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsYXlvdXRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJTGF5b3V0SW5mbyBpbmZvID0gKExheW91dEluZm8pIGl0Lm5leHQoKTsKLQkJCQkJeHNsX3VyaSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExheW91dFhzbFBhdGgoKQotCQkJCQkJCSsgaW5mby5sYXlvdXRfeHNsOwotCQkJCQlTdHJpbmcgZmlsZSA9IGZpbGVQYXRoICsgaW5mby5maWxlTmFtZTsKLQkJCQkJZ2VuZXJhdGVIdG1sKGxheW91dCwgeHNsX3VyaSwgZmlsZSwgeG1sKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJaHRtbF9maWxlID0gbnVsbDsKLQkJfQotCi0JCWxvbmcgdGltZV9lbmQgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpOwotCQlsb25nIG1pbmlfc2Vjb25kcyA9IHRpbWVfZW5kIC0gdGltZV9zdGFydDsKLQkJaWYgKG1pbmlfc2Vjb25kcyA+IDEwMDApIHsKLQkJCVN0cmluZyBtc2cgPSBtaW5pX3NlY29uZHMKLQkJCQkJKyAiIG1pbmktc2Vjb25kKHMpIHB1Ymxpc2hpbmcgZWxlbWVudCAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUobGF5b3V0LmdldEVsZW1lbnQoKSkgKyAiWyIgKyBlbGVtZW50UGF0aE5hbWUgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXRWYWxpZGF0b3IoKTsKLQkJCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJfSBlbHNlIHsKLQkJCQl2YWxpZGF0b3IubG9nSW5mbyhtc2cpOwotCQkJfQotCQl9Ci0JCWlmIChodG1sX2ZpbGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGh0bWxfZmlsZTsKLQkJfQotCi0JCXJldHVybiAiYWJvdXQ6YmxhbmsiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBIVE1MIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYXlvdXQKLQkgKiAgICAgICAgICAgIEEgTWV0aG9kIEVsZW1lbnQuIExheW91dCBvYmplY3QuCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0LgotCSAqIEBwYXJhbSBodG1sRmlsZQotCSAqICAgICAgICAgICAgVGhlIEhUTUwgZmlsZSB0byBiZSBnZW5lcmF0ZWQuCi0JICogQHBhcmFtIHhtbAotCSAqICAgICAgICAgICAgVGhlIFhNTCBidWZmZXIuCi0JICogQHJldHVybiBBIHVybCBvZiB0aGUgZ2VuZXJhdGVkIGNvbnRlbnQgSFRNTCBmaWxlLgotCSAqLwotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUh0bWwoSUVsZW1lbnRMYXlvdXQgbGF5b3V0LAotCQkJU3RyaW5nIHhzbF91cmksIFN0cmluZyBodG1sX2ZpbGUsIFN0cmluZ0J1ZmZlciB4bWwpIHsKLQkJVGhyb3dhYmxlIHRoID0gbnVsbDsKLQkJaWYgKGxheW91dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlUaW1lciB0aW1lciA9IG51bGw7Ci0JCWlmICggZGVidWcgKSB7Ci0JCQl0aW1lciA9IG5ldyBUaW1lcigpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsX3VyaSwgeG1sLnRvU3RyaW5nKCksIHhzbFBhcmFtcywgc3cpOwotCQkJc3cuZmx1c2goKTsKLQkJCVN0cmluZyBjb250ZW50ID0gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLQotCQkJaWYgKCBkZWJ1ZykgewotCQkJCXRpbWVyLnN0b3AoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4odGltZXIuZ2V0VGltZSgpICsgIiBtaW5pIHNlY29uZHMgZm9yIHhtbC94c2x0IHRyYW5zZm9ybWF0aW9uIik7Ci0JCQkJdGltZXIuc3RhcnQoKTsKLQkJCX0KLQkJCS8vIEFsd2F5cyB2YWxpZGF0ZSBhbmQgZml4IHRoZSBjb250ZW50IGJlZm9yZSBwdWJsaXNoaW5nLgotCQkJY29udGVudCA9IFJlc291cmNlSGVscGVyLnZhbGlkYXRlQ29udGVudChsYXlvdXQuZ2V0RWxlbWVudCgpLAotCQkJCQljb250ZW50LCBnZXRWYWxpZGF0b3IoKSwgbGF5b3V0LmdldExheW91dE1ncigpCi0JCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQlpZiAoY29udGVudFNjYW5FbmFibGVkKCkpIHsKLQkJCQlzY2FuQ29udGVudEZvclJlc291cmNlcyhsYXlvdXQuZ2V0RWxlbWVudCgpLCBjb250ZW50LCBsYXlvdXQKLQkJCQkJCS5nZXRGaWxlUGF0aCgpKTsKLQkJCX0KLQotCQkJaWYgKCBkZWJ1ZykgewotCQkJCXRpbWVyLnN0b3AoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4odGltZXIuZ2V0VGltZSgpICsgIiBtaW5pIHNlY29uZHMgc2Nhbm5pbmcgY29udGVudCIpOwotCQkJCXRpbWVyLnN0YXJ0KCk7Ci0JCQl9Ci0JCQkKLQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotCQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShodG1sX2ZpbGUpLCAidXRmLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJb3V0cHV0LndyaXRlKGNvbnRlbnQpOwotCQkJb3V0cHV0LmZsdXNoKCk7Ci0JCQlvdXRwdXQuY2xvc2UoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGggPSBlOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRoID0gZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRoID0gZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aCA9IGU7Ci0JCX0KLQotCQlpZiAodGggIT0gbnVsbCkgewotCQkJdGhpcy5nZXRWYWxpZGF0b3IoKS5sb2dFcnJvcihsYXlvdXQuZ2V0RWxlbWVudCgpLAotCQkJCQkiRXJyb3IgZ2VuZXJhdGluZyBlbGVtZW50IGNvbnRlbnQiLCB0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgYSBNZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGF5b3V0Ci0JICogICAgICAgICAgICBBIE1ldGhvZCBFbGVtZW50LiBMYXlvdXQgb2JqZWN0LgotCSAqIEByZXR1cm4gQSB1cmwgb2YgdGhlIGdlbmVyYXRlZCBjb250ZW50IEhUTUwgZmlsZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBnZXRYbWwoSUVsZW1lbnRMYXlvdXQgbGF5b3V0KSB7Ci0JCVN0cmluZ0J1ZmZlciB4bWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IGxheW91dC5nZXRYbWxFbGVtZW50KHRydWUpOwotCQlpZiAoc2hvd1RyZWVCcm93c2VyKSB7Ci0JCQl4bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgic2hvd1RyZWVCcm93c2VyIiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQl4bWwuYXBwZW5kKFhtbEhlbHBlci5YTUxfSEVBREVSKS5hcHBlbmQoeG1sRWxlbWVudC50b1htbCgpKTsKLQotCQlpZiAoIGRlYnVnICkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgeG1sX2ZpbGUgPSB0aGlzLmdldFB1Ymxpc2hEaXIoKSArICJ4bWwiICsgRmlsZS5zZXBhcmF0b3I7IC8vJE5PTi1OTFMtMSQKLQkJCQl4bWxfZmlsZSArPSBsYXlvdXQuZ2V0VHlwZSgpICsgIi4iICsgbGF5b3V0LmdldEZpbGVOYW1lKCIueG1sIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUZpbGUgeGYgPSBuZXcgRmlsZSh4bWxfZmlsZSk7Ci0JCQkJaWYgKCAheGYuZXhpc3RzKCkgKQotCQkJCXsKLQkJCQkJeGYuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQkJCQl4Zi5jcmVhdGVOZXdGaWxlKCk7Ci0JCQkJfQotCQkJCQkJCQotCQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotCQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oeGYpLCAidXRmLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCW91dHB1dC53cml0ZSh4bWwudG9TdHJpbmcoKSk7Ci0JCQkJb3V0cHV0LmZsdXNoKCk7Ci0JCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCi0JCQkJLy8gRmlsZVdyaXRlciB4dyA9IG5ldyBGaWxlV3JpdGVyKHhtbF9maWxlKTsKLQkJCQkvLyB4dy53cml0ZSh4bWwudG9TdHJpbmcoKSk7Ci0JCQkJLy8geHcuZmx1c2goKTsKLQkJCQkvLyB4dy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB4bWw7Ci0JfQotCi0JLyoqCi0JICogU2NhbnMgdGhlIGNvbnRlbnQgZm9yIHJlc291cmNlIHJlZmVyZW5jZXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNjYW5Db250ZW50Rm9yUmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBjb250ZW50LAotCQkJU3RyaW5nIGNvbnRlbnRQYXRoKSB7Ci0JCWdldFNjYW5uZXIoKS5yZXNvbHZlUmVzb3VyY2VzKG93bmVyLCBjb250ZW50LCBjb250ZW50UGF0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLS8vCQlpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLS8vCQkJdmFsaWRhdG9yLmRpc3Bvc2UoKTsKLS8vCQl9Ci0KLQkJbWdyID0gbnVsbDsKLQkJc2Nhbm5lciA9IG51bGw7Ci0vLwkJdmFsaWRhdG9yID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvSUNvbnRlbnRWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9JQ29udGVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZmZhOGEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9JQ29udGVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogaW50ZXJmYWNlIGZvciBjb250ZW50IHZhbGlkYXRvciBhdCBicm93c2luZyBhbmQgcHVibGlzaGluZwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudFZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBzZXQgcHVibGlzaCBkaXIKLQkgKiBAcGFyYW0gcHViRGlyIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hEaXIoU3RyaW5nIHB1YkRpcik7Ci0KLQkvKioKLQkgKiBzaG93IGJyb2tlbiBsaW5rcyBpZiB0cnVlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvd0Jyb2tlbkxpbmtzKCk7Ci0JCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGxpbmsgYXR0cmlidXRlIGFuZCBsaW5rZWQgdGV4dCBmb3IgdGhlIG93bmluZyBlbGVtZW50IHdpdGhpbiB0aGUgY29uZmlndXJhdGlvbi4gCi0JICogUmV0dXJucyBhIExpbmtJbmZvIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIge0BsaW5rIE1ldGhvZEVsZW1lbnR9IHRoZSBvd25lciBlbGVtZW50Ci0JICogQHBhcmFtIGF0dHJpYnV0ZXMgU3RyaW5nIHRoZSB1cmwgYXR0cmlidXRlcwotCSAqIEBwYXJhbSB0ZXh0IFN0cmluZyB0aGUgbGlua2VkIHRleHQKLQkgKiBAcGFyYW0gY29uZmlnIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIExpbmtJbmZvCi0JICovCi0JcHVibGljIExpbmtJbmZvIHZhbGlkYXRlTGluayhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgYXR0cmlidXRlcywKLQkJCVN0cmluZyB0ZXh0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQkvKioKLQkgKiBsb2cgdGhlIGluZm8gZm9yIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBtZXNzYWdlKTsKLQotCS8qKgotCSAqIGxvZyBhIG1pc3NpbmcgcmVmZXJlbmNlCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmRWxlbWVudCBNZXRob2RFbGVtZW50IHRoZSByZWZlcm5lY2VkIGVsZW1lbnQgdGhhdCBpcyBtaXNzaW5nIGluIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dNaXNzaW5nUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsCi0JCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQpOwotCi0JLyoqCi0JICogbG9nIGEgbWlzc2luZyByZWZlcmVuY2UKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudCB0aGUgb3duZXIgZWxlbWVudAotCSAqIEBwYXJhbSBndWlkIFN0cmluZyB0aGUgcmVmZXJlbmNlZCBndWlkIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGVsZW1lbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYW55IG1vcmUKLQkgKiBAcGFyYW0gbGlua2VkVGV4dCBTdHJpbmcgdGhlIGxpbmtlZCB0ZXh0IGFsb25nIHdpdGggdGhlIGxpbmsuCi0JICovCi0JcHVibGljIHZvaWQgbG9nTWlzc2luZ1JlZmVyZW5jZShNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgZ3VpZCwKLQkJCVN0cmluZyBsaW5rZWRUZXh0KTsKLQotCS8qKgotCSAqIGxvZyBhIG1pc3NpbmcgcmVzb3VyY2UgCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQgdGhlIG93bmVyCi0JICogQHBhcmFtIHJlc291cmNlRmlsZSBGaWxlIHRoZSBmaWxlIHRoYXQgb3duZWQgYnkgdGhlIGVsZW1lbnQgYW5kIHJlZmVyZW5jZXMgdGhlIG1pc2luZyByZXNvdXJjZSwgCi0JICogbnVsbCBpZiB0aGUgbWlzaW5nIHJlZmVyZW5jZSBpcyByZWZlcmVuY2VkIGJ5IHRoZSBlbGVtZW50IGl0c2VsZiAKLQkgKiBAcGFyYW0gdXJsIFN0cmluZyB0aGUgdXJsIHRoYXQgY2FuJ3QgYmUgcmVzb3ZsZWQgdG8gYSByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dNaXNzaW5nUmVzb3VyY2UoTWV0aG9kRWxlbWVudCBvd25lciwgRmlsZSByZXNvdXJjZUZpbGUsCi0JCQlTdHJpbmcgdXJsKTsKLQotCS8qKgotCSAqIGxvZ24gYSB3YXJuaW5nIG1lc3NhZ2UKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogbG9nIGFuIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotCSAqIEBwYXJhbSB0aCBUaHJvd2FibGUsIG51bGwgaWYgbm90Ci0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aCk7Ci0KLQkvKioKLQkgKiBsb2cgYW4gaW52YWxpZCBleHRlcm5hbCBsaW5rCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gdXJsIFN0cmluZyB0aGUgdXJsCi0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW52YWxpZEV4dGVybmFsTGluayhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgdXJsLAotCQkJU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogbG9nIGEgbWVzc2FnZQotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0luZm8oU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogbG9nIGEgd2FybmluZwotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotIAkgKi8KLQlwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyBtZXNzYWdlKTsKLQotCS8qKgotCSAqIGxvZyBhbiBlcnJvcgotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotCSAqIEBwYXJhbSB0aCBUaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRoKTsKLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGRpc2NhcmRlZCBvciBub3QKLQkgKiBkaXNjYXJkZWQgZWxlbWVudHMgd2lsbCBiZSB0cmVhdGVkIGFzIG91dCBzaWRlIHRoZSBjb25maWd1cnNhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50IHRoZSBvd25lciBvZiB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBPYmplY3QgZmVhdHVyZSBFU3RydWN0dXJhbEZlYXR1cmUgb3IgT3Bwb3NpdGVGZWF0dXJlCi0JICogQHBhcmFtIGUgTWV0aG9kRWxlbWVudCB0aGUgZWxlbWVudCB0byBiZSBjaGVja2VkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNjYXJkZWQoTWV0aG9kRWxlbWVudCBvd25lciwgT2JqZWN0IGZlYXR1cmUsIE1ldGhvZEVsZW1lbnQgZSk7Ci0KLQkvKioKLQkgKiBzZXQgYW4gZGlzY2FyZGVkIGVsZW1lbnQKLQkgKiBAcGFyYW0gZSBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzY2FyZGVkRWxlbWVudChNZXRob2RFbGVtZW50IGUpOwotCi0JLyoqCi0JICogZGlzcG9zZSB0aGUgb2JqZWN0IGFuZCBmcmVlIHJlc291cmNlcwotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCQkKLQkvKioKLQkgKiBhZGQgYSByZWZlcm5lY2VkIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBlIE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgb3duZXIgZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgb3duZXIsIE1ldGhvZEVsZW1lbnQgZSk7Ci0JCQotCS8qKgotCSAqIGdldCB0aGUgZmxhZyBhYm91dCBzaG93aW5nIGV4dHJhIGluZm9ybWF0aW9uIGZyb20gdGhlIGxpbmtlZCBlbGVtZW50cyBmb3IgZGVzY3JpcHRvcnMKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0lFbGVtZW50TGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvSUVsZW1lbnRMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODIyOTIyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvSUVsZW1lbnRMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBlbGVtZW50IGxheW91dC4gYW55IGVsZW1lbnQgbGF5b3V0IHNob3VsZCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiBBbiBlbGVtZW50IGxheW91dCBkZWZpbmVzIGhvdyB0aGUgZWxlbWVudCBzaG91bGQgYmUgcmVuZGVyZWQgaW4gYnJvd3NpbmcgYW5kIHB1Ymxpc2hpbmcuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVsZW1lbnRMYXlvdXQgewotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IGlkLCB3aGljaCBpcyB0aGUgZWxlbWVudCdzIEdVSUQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogdGhlIHJlYWxpemVkIHByZXNlbnRhdGlvbiBuYW1lIG9mIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiB0aGUgdXJsIG9mIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpOwotCi0JLyoqCi0JICogdGhlIHVybCBmb3Igc2hhcGUgaWNvbiBvZiB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaGFwZWljb25VcmwoKTsKLQotCS8qKgotCSAqIHRoZSB1cmwgZm9yIG5vZGUgaWNvbiBvZiB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlaWNvblVybCgpOwotCi0JLyoqCi0JICogdGhlIHVybCBmb3IgZGlhZ3JhbSBpY29uIG9mIHRoZSBlbGVtZW50LCAKLQkgKiBmb3IgZXhhbXBsZSwgdGhlIGljb24gZm9yIGEgcm9sZSBpbiB0aGUgcm9sZS10YXNrLXdwIHJlbGF0aW9uc2hpcCBkaWFncmFtLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaWFncmFtaWNvblVybCgpOyAvLyBpY29uIGZvciBkaWFncmFtIHN1Y2ggYXMgUm9sZSBkaWFncmFtCi0KLQkvKioKLQkgKiB0aGUgbGF5b3V0IHhzbCB1cmwKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WHNsVXJsKCk7Ci0KLQkvKioKLQkgKiB0aGUgYmFjayBwYXRoIG9mIHRoZSBlbGVtZW50IHJlbGF0aXZlIHRvIHRoZSBwdWJsaXNoaW5nIHJvb3QgZGlyLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrUGF0aCgpOwotCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgcm9vdAotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aCgpOwotCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gYW5vdGhlciBlbGVtZW50LiBUaGlzIGlzIHRoZQotCSAqIHJlbGF0aXZlVG8uYmFja3BhdGggKyB0aGlzLmVsZW1lbnRwYXRoCi0JICogCi0JICogQHBhcmFtIHJlbGF0aXZlVG8KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoSUVsZW1lbnRMYXlvdXQgcmVsYXRpdmVUbyk7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGZpbGUgbmFtZSBvZiB0aGUgZWxlbWVudCwgd2l0aCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uLgotCSAqIEBwYXJhbSBleHQgU3RyaW5nIGV4dGVuc2lvbiwgc3VjaCBhcyAiLmh0bWwiCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyBleHQpOwotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIGdldCB0aGUgbGF5b3V0IG1hbmFnZXIgZm9yIHJhbmRlcmluZyB0aGUgbGF5b3V0IG9mIHRoZSBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gRWxlbWVudExheW91dE1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0TGF5b3V0TWdyKCk7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIFhtbEVsZW1lbnQgZm9yIHRoZSBlbGVtZW50IGxheW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMKLQkgKiAgICAgICAgICAgIHRydWUgdG8gaW5jbHVkZSB0aGUgeG1sIG9mIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQuIGZhbHNlIHRvCi0JICogICAgICAgICAgICBpZ25vcmUgdGhlIHhtbCBvZiB0aGUgcmVmZXJlbmNlcy4KLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JLyoqCi0JICogcmV0dXJuIGEgbGlzdCBvZiBMYXlvdXRJbmZvIG9iamVjdHMKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBMYXlvdXRJbmZvIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMYXlvdXRzKCk7Ci0KLQotCS8qKgotCSAqIGlmIHRoZSBlbGVtZW50J3MgY29udGVudCBpcyB0YXJnZXQgZm9yIGFub3RoZXIgZWxlbWVudCwgc2V0IGl0IGhlcmUuIGZvcgotCSAqIGV4YW1wbGUsIHN0ZXAgY29udGVudCBjYXQgdGFyZ2V0IGZvciBhIFRhc2sgb3IgYSB0YXNrIGRlc2NyaXB0b3IKLQkgKiBjb3B5cmlnaHQgY29udGVudCBjYW4gdGFyZ2V0IHRvIGRpZmZlcmVudCBlbGVtZW50cy4KLQkgKiAKLQkgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGlzIHRoYXQgdGhlIHN5c3RlbSB3aWxsIGZpeCB0aGUgbGlua3MgaW4gdGhlIGNvbnRlbnQKLQkgKiB0byByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFRhcmdldChNZXRob2RFbGVtZW50IHRhcmdldEVsZW1lbnQpOwotCi0JLyoqCi0JICogbmVlZCB0byBzZXQgdGhlIG93bmVyIG9mIHRoZSBjdXJyZW50IGxheW91dCBlbGVtZW50LiBJbiBtb3N0IGNhc2VzIHRoaXMKLQkgKiBzaG91bGQgYmUgdGhlIGVDb250YWluZXIgb2YgdGhlIGVsZW1lbnQuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaW4gc29tZQotCSAqIHNpdHVhdGlvbiB0aGUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIG93bmVyIHdoZW4gdGhlIG9iamVjdCBpcyBjcmVhdGVkLgotCSAqIEZvciBleGFtcGxlLCB0aGUgQ29udGVudERlc2NyaXB0aW9uIG9iamVjdCdzIGVDb250aW5lciBpcyBudWxsIGlmIHRoZQotCSAqIGNvbnRlbnQgZmlsZSBpcyBub3Qgc2F2ZWQuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudE93bmVyKE1ldGhvZEVsZW1lbnQgb3duZXIpOwotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGh0bWwgY29udGVudCBnZW5lcmF0ZWQgZnJvbSB0aGlzIHhzbCBmaWxlIG5lZWRzIHRvIGJlIHNjYW5uZWQgb3Igbm90Ci0JICogc2NhbiB0aGUgY29udGVudCBpcyBmb3IgaWRlbnRpZnlpbmcgZWxlbWVudCByZWZlcmVuY2VzIGluIHRoZSBjb250ZW50IGFuZCBjb3B5IG92ZXIgcmVzb3VyY2UgZmlsZXMKLQkgKiBpbiBzb21lIGNhc2VzIHdlIGRvbid0IG5lZWQgdG8gc2NhbiB0aGUgY29udGVudCwgZm9yIGV4YW1wbGUsIHRoZSBhY3Rpdml0eSBicmVha2Rvd24gc3RydWN0dXJlCi0JICogCi0JICogQHBhcmFtIHhzbFVybCB0aGUgeHNsIHRoYXQgaHRtbCBpcyBnZW5lcmF0ZWQgZnJvbSwgbnVsbCBmb3IgdGhlIGRlZmF1bHQgeHNsIGxheW91dAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIG5lZWRDb250ZW50U2NhbihTdHJpbmcgeHNsVXJsKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2hvdwotCSAqIEBkZXByZWNhdGVkIHRoaXMgbWV0aG9kIGlzIG5vdCBuZWVkZWQgYW55IG1vcmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG93RWxlbWVudExpbmsoYm9vbGVhbiBzaG93KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dEluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM2ODg1YTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotLyoqCi0gKiBsTHlvdXQgaW5mbyBmb3IgYW4gZWxlbWVudC4KLSAqIDxwPgotICogVGhpcyBpcyB1c2VkIHdoZW4gYW4gZWxlbWVudCBvdXRwdXQgbW9yZSB0aGVuIG9uZSBsYXlvdXQsIHN1Y2ggYXMgYWN0aXZpdHkKLSAqIHRhYnMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExheW91dEluZm8gewotCi0JcHVibGljIExheW91dEluZm8oU3RyaW5nIG5hbWUsIFN0cmluZyB4c2wsIFN0cmluZyBmaWxlTmFtZSwKLQkJCWJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGF5b3V0X3hzbCA9IHhzbDsKLQkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotCQl0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0Ci0JICovCi0JcHVibGljIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogdGhlIGxheW91dCB4c2wgZmlsZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBsYXlvdXRfeHNsOwotCi0JLyoqCi0JICogdGhlIG91dG91dCBmaWxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZpbGVOYW1lOwotCi0JLyoqCi0JICogaXMgdGhpcyB0aGUgcHJpbWFyeSBsYXlvdXQ/IHRoaXMgYXBwbHkgdG8gdGhlIGNhc2Ugd2hlbiBvbmUgZWxlbWVudCBoYXMgbW9yZSB0aGFuIG9uZSBsYXlvdXQuCi0JICogIEZvciBleGFtcGxlLCBhbiBhY3Rpdml0eSBlbGVtZW50IGhhcyA0IGxheW91dHMuCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5OwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0UmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0UmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2NjY2NTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeHBhbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0KLS8qKgotICogYSB1dGlsaXR5IGNsYXNzIHRvIGhhbmRsZSBsYXlvdXQgcmVsYXRlZCByZXNvdXJjZXMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRSZXNvdXJjZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBzaGFwZWljb25CdW5kbGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEVNUF9MQVlPVVRfRElSID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgewotCQl0cnkgewotCQkJU3RyaW5nIHBrZyA9IExheW91dFJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIHJlc291cmNlID0gTGF5b3V0UmVzb3VyY2VzLmNsYXNzLmdldE5hbWUoKTsKLQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlKTsKLQkJCXNoYXBlaWNvbkJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShwa2cKLQkJCQkJKyAiLkRlZmF1bHRTaGFwZWljb25zIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJLyoKLQkJCSAqIFRFTVBfTEFZT1VUX0RJUiA9IGdldFN0cmluZygidGVtcF9sYXlvdXRfZGlyIik7IGlmICgKLQkJCSAqIFRFTVBfTEFZT1VUX0RJUiAhPSBudWxsICkgeyBURU1QX0xBWU9VVF9ESVIgPQotCQkJICogVEVNUF9MQVlPVVRfRElSLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOyB9Ci0JCQkgKi8KLQotCQkJLy8gTXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVQRiBydW5uaW5nIGRpZmZlcmVudCBsaWJzIGFyZSBzaGFyaW5nIHRoZSBzYW1lIGxheW91dCBkaXJlY3RvcnkKLQkJCS8vIHVzZSB0aW1lc3RhbXAgdG8gaWRlbnRpZnkgZWFjaCBpbnN0YW5jZQotCQkJLy8gd2UgbmVlZCB0byBjbGVhbiB0aGUgZmlsZXMgd2hlbiB0aGUgYXBwbGljYXRpb24gZXhpdAkJCQotCQkJU3RyaW5nIHVzZXJIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJVEVNUF9MQVlPVVRfRElSID0gdXNlckhvbWUgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrICJFUEYiICsgRmlsZS5zZXBhcmF0b3IgKyAibGF5b3V0IiArIEZpbGUuc2VwYXJhdG9yIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrIExvbmcudG9IZXhTdHJpbmcoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKSkgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCQotCQkJRmlsZSBydXBUbXBEaXIgPSBuZXcgRmlsZShURU1QX0xBWU9VVF9ESVIpOwotCQkJaWYgKCFydXBUbXBEaXIuZXhpc3RzKCkpIHsKLQkJCQlydXBUbXBEaXIubWtkaXJzKCk7Ci0JCQl9IGVsc2UgewotCQkJCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKHJ1cFRtcERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjYWxsIHRoaXMgd2hlbiB0aGUgYXBwbGljYXRpb24gZXhpdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcigpCi0JewotCQl0cnkgewotCQkJRmlsZVV0aWwuZGVsZXRlQWxsRmlsZXMoVEVNUF9MQVlPVVRfRElSKTsKLQkJCQotCQkJLy8gYWxzbyBkZWxldGUgdGhlIGZvbGRlcgotCQkJbmV3IEZpbGUoVEVNUF9MQVlPVVRfRElSKS5kZWxldGUoKTsKLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGRlZmF1bHQgcHVibGlzaCBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFB1Ymxpc2hEaXIoKSB7Ci0JCXJldHVybiBURU1QX0xBWU9VVF9ESVI7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB4c2wgdXJpIGZvciB0aGUgZ2l2ZW4ga2V5cwotCSAqIEBwYXJhbSBrZXkgU3RyaW5nCi0JICogQHBhcmFtIHNlY29uZEtleSBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFhzbFVyaShTdHJpbmcga2V5LCBTdHJpbmcgc2Vjb25kS2V5KSB7Ci0JCVN0cmluZyB1cmwgPSBnZXRTdHJpbmcocmVzb3VyY2VCdW5kbGUsIGtleS50b0xvd2VyQ2FzZSgpKTsKLQkJaWYgKCh1cmwgPT0gbnVsbCkgJiYgKHNlY29uZEtleSAhPSBudWxsKSkgewotCQkJdXJsID0gZ2V0U3RyaW5nKHJlc291cmNlQnVuZGxlLCBzZWNvbmRLZXkudG9Mb3dlckNhc2UoKSk7Ci0JCX0KLQotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCXVybCA9IGdldFN0cmluZyhyZXNvdXJjZUJ1bmRsZSwgImRlZmF1bHQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkvLyByZXNvbHZlIHRoZSBmaWxlCi0JCQlyZXR1cm4gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF5b3V0WHNsUGF0aCgpICsgdXJsOwotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBkZWZhdWx0IHNoYXBlIGljb24gdXJsCi0JICogQHBhcmFtIGtleSBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRTaGFwZWljb25VcmwoU3RyaW5nIGtleSkgewotCQlTdHJpbmcgdXJsID0gZ2V0U3RyaW5nKHNoYXBlaWNvbkJ1bmRsZSwga2V5KTsKLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQl1cmwgPSBnZXRTdHJpbmcoc2hhcGVpY29uQnVuZGxlLCAiZ2VuZXJhbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gdXJsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IG51bGw7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCByZXNvdXJjZSBzdHJpbmcgZm9yIHRoZSBrZXkKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKHJlc291cmNlQnVuZGxlLCBrZXkpOwotCX0KLQotCS8qKgotCSAqIGNvcHkgZmlsZXMgZnJvbSBvbmUgZGlyIHRvIGFub3RoZXIKLQkgKiBAcGFyYW0gZnJvbURpciBTdHJpbmcKLQkgKiBAcGFyYW0gdG9EaXIgU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlEaXIoU3RyaW5nIGZyb21EaXIsIFN0cmluZyB0b0RpcikgewotCi0JCVN0cmluZyBpbmNsdWRlcyA9ICIqLiosICoqL2Nzcy8qLiosICoqL2ljb25zLyouKiwgKiovaW1hZ2VzLyouKiwgKiovcmVzb3VyY2VzLyouKiwgKiovc3R5bGVzaGVldHMvKi4qLCAqKi9zY3JpcHRzLyouKiI7IC8vJE5PTi1OTFMtMSQKLQkJY29weURpcihmcm9tRGlyLCB0b0RpciwgaW5jbHVkZXMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNvcHkgZmlsZXMgZnJvbSBvbmUgZGlyIHRvIGFub3RoZXIsIHdpdGggZmlsdGVycwotCSAqIEBwYXJhbSBmcm9tRGlyIFN0cmluZwotCSAqIEBwYXJhbSB0b0RpciBTdHJpbmcKLQkgKiBAcGFyYW0gaW5jbHVkZXMgU3RyaW5nCi0JICogQHBhcmFtIGV4Y2x1ZGVzIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyKFN0cmluZyBmcm9tRGlyLCBTdHJpbmcgdG9EaXIsIFN0cmluZyBpbmNsdWRlcywKLQkJCVN0cmluZyBleGNsdWRlcykgewotCQljb3B5RGlyKG5ldyBGaWxlKGZyb21EaXIpLCBuZXcgRmlsZSh0b0RpciksIGluY2x1ZGVzLCBleGNsdWRlcyk7Ci0JfQotCi0JLyoqCi0JICogY29weSBkaXIKLQkgKiAKLQkgKiBAcGFyYW0gZnJvbURpciBGaWxlCi0JICogQHBhcmFtIHRvRGlyIEZpbGUKLQkgKiBAcGFyYW0gaW5jbHVkZXMgU3RyaW5nCi0JICogQHBhcmFtIGV4Y2x1ZGVzIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyKEZpbGUgZnJvbURpciwgRmlsZSB0b0RpciwgU3RyaW5nIGluY2x1ZGVzLAotCQkJU3RyaW5nIGV4Y2x1ZGVzKQotCXsKLQkJY29weURpcihmcm9tRGlyLCB0b0RpciwgaW5jbHVkZXMsIGV4Y2x1ZGVzLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIGNvcHkgZGlyCi0JICogQHBhcmFtIGZyb21EaXIgRmlsZQotCSAqIEBwYXJhbSB0b0RpciBGaWxlCi0JICogQHBhcmFtIGluY2x1ZGVzIFN0cmluZwotCSAqIEBwYXJhbSBleGNsdWRlcyBTdHJpbmcKLQkgKiBAcGFyYW0gb3ZlcndyaXRlIGJvb2xlYW4gdHJ1ZSB0byBvdmVycmlkZSBleGlzdGluZyBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyKEZpbGUgZnJvbURpciwgRmlsZSB0b0RpciwgU3RyaW5nIGluY2x1ZGVzLAotCQkJU3RyaW5nIGV4Y2x1ZGVzLCBib29sZWFuIG92ZXJ3cml0ZSkgewotCQlDb3B5IGNwID0gbmV3IENvcHkoKTsKLQkJY3Auc2V0T3ZlcndyaXRlKG92ZXJ3cml0ZSk7IC8vIG9ubHkgY3BveSBuZXcgZmlsZXMgb3IgbmV3ZXIgZmlsZXMKLQkJaWYgKGluY2x1ZGVzICE9IG51bGwgfHwgZXhjbHVkZXMgIT0gbnVsbCkgewotCQkJRmlsZVNldCBzZXQgPSBuZXcgRmlsZVNldCgpOwotCQkJaWYgKGluY2x1ZGVzICE9IG51bGwpIHsKLQkJCQlzZXQuc2V0SW5jbHVkZXMoaW5jbHVkZXMpOwotCQkJfQotCi0JCQlpZiAoZXhjbHVkZXMgIT0gbnVsbCkgewotCQkJCXNldC5zZXRFeGNsdWRlcyhleGNsdWRlcyk7Ci0JCQl9Ci0KLQkJCXNldC5zZXREaXIoZnJvbURpcik7Ci0JCQljcC5hZGRGaWxlc2V0KHNldCk7Ci0JCX0KLQotCQljcC5zZXRUb2Rpcih0b0Rpcik7Ci0JCWNwLnNldFByb2plY3QobmV3IFByb2plY3QoKSk7Ci0JCWNwLmV4ZWN1dGUoKTsKLQotCX0KLQotCS8qKgotCSAqIGNvcHkgdGhlIGxheW91dCBmaWxlcyBmcm9tIHRoZSBsaWJyYXJ5IGxheW91dCBwYXRoIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBwdWJsaXNoIGZvbGRlcgotCSAqIAotCSAqIEBwYXJhbSB0b0RpcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5TGF5b3V0RmlsZXMoU3RyaW5nIHRvRGlyKSB7Ci0JCS8vIGNvcHkgdGhlIGxheW91dCBmaWxlcyB0byB0aGUgdGVtcCBmb2xkZXIKLQkJU3RyaW5nIHNvdXJjZURpciA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExheW91dFBhdGgoKTsKLQkJY29weURpcihzb3VyY2VEaXIsIHRvRGlyKTsKLQotCQl0cnkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuY29weUxvY2FsaXplZEZpbGVzKAotCQkJCQlMaWJyYXJ5UGx1Z2luLkxBWU9VVF9TQ1JJUFRTX1BBVEgsCi0JCQkJCW5ldyBGaWxlKHRvRGlyLCBMaWJyYXJ5UGx1Z2luLkxBWU9VVF9TQ1JJUFRTX0ZPTERFUiksIHRydWUsCi0JCQkJCWZhbHNlKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuemlwKEZpbGUgemlwRmlsZSwgRmlsZSB0b0RpcikgewotCQlFeHBhbmQgZXhwID0gbmV3IEV4cGFuZCgpOwotCQlleHAuc2V0T3ZlcndyaXRlKHRydWUpOyAKLQkJZXhwLnNldFNyYyh6aXBGaWxlKTsKLQkJZXhwLnNldERlc3QodG9EaXIpOwotCQlleHAuc2V0UHJvamVjdChuZXcgUHJvamVjdCgpKTsKLQkJZXhwLmV4ZWN1dGUoKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRSZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRSZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2I5MTRkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0UmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jCi0jIHVybHMgc3RhcnQgd2l0aCB0aGUgZm9sbG93aW5nIHdpbGwgYmUgdHJlYXRlZCBhcyBleHRlcm5hbCB1cmxzLCB1c2UgfCB0byBzcGVyYXRlIAotIwotI2V4dGVybmFsVXJsX3N0YXJ0V2l0aD1odHRwOi8vfGh0dHBzOi8vfGZ0cDovLwotIyBzZWUgYWxsIHRoZSBwb3NzaWJsZSBwcm90b2NhbHMgYXQ6Ci0jIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvdXJpLXNjaGVtZXMuaHRtbAotZXh0ZXJuYWxVcmxfc3RhcnRXaXRoPVthLXpBLVowLTlcXC5dezEsMTV9Oi8vCi0KLSMgWFNMIFN0eWxlc2hlZXQgTWFwcGluZyBmb3IgdGhlIE1ldGhvZCBFbGVtZW50cy4KLQotIyBDb3JlIE1ldGhvZCBFbGVtZW50cwotYXJ0aWZhY3Q9YXJ0aWZhY3QueHNsCi1kZWxpdmVyYWJsZT1kZWxpdmVyYWJsZS54c2wKLW91dGNvbWU9b3V0Y29tZS54c2wKLXJvbGU9cm9sZS54c2wKLXRhc2s9dGFzay54c2wKLQotIyBHdWlkYW5jZQotY2hlY2tsaXN0PWNoZWNrbGlzdC54c2wKLWNvbmNlcHQ9Z3VpZGFuY2UueHNsCi1leGFtcGxlPWd1aWRhbmNlX3dpdGhfYXR0YWNobWVudC54c2wKLWd1aWRlbGluZT1ndWlkYW5jZS54c2wKLXByYWN0aWNlPXByYWN0aWNlLnhzbAotcmVwb3J0PWd1aWRhbmNlLnhzbAotcm9hZG1hcD1ndWlkYW5jZS54c2wKLXJldXNhYmxlYXNzZXQ9Z3VpZGFuY2Vfd2l0aF9hdHRhY2htZW50LnhzbAotc3VwcG9ydGluZ21hdGVyaWFsPWd1aWRhbmNlLnhzbAotdGVtcGxhdGU9Z3VpZGFuY2Vfd2l0aF9hdHRhY2htZW50LnhzbAotdGVybWRlZmluaXRpb249Z3VpZGFuY2UueHNsCi10b29sbWVudG9yPWd1aWRhbmNlLnhzbAotd2hpdGVwYXBlcj1ndWlkYW5jZV93aXRoX2F0dGFjaG1lbnQueHNsCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM9Z3VpZGFuY2UueHNsCi0KLSMgQ29udGVudCBDYXRlZ29yaWVzCi1jdXN0b21jYXRlZ29yeT1jb250ZW50Y2F0ZWdvcnkueHNsCi1kaXNjaXBsaW5lPWNvbnRlbnRjYXRlZ29yeS54c2wKLWRpc2NpcGxpbmVncm91cGluZz1jb250ZW50Y2F0ZWdvcnkueHNsCi1kb21haW49Y29udGVudGNhdGVnb3J5LnhzbAotcm9sZXNldD1jb250ZW50Y2F0ZWdvcnkueHNsCi1yb2xlc2V0Z3JvdXBpbmc9Y29udGVudGNhdGVnb3J5LnhzbAotdG9vbD1jb250ZW50Y2F0ZWdvcnkueHNsCi13b3JrcHJvZHVjdHR5cGU9Y29udGVudGNhdGVnb3J5LnhzbAotCi0jIFByb2Nlc3MgRWxlbWVudHMKLWFjdGl2aXR5PWFjdGl2aXR5X3dicy54c2wKLWNhcGFiaWxpdHlwYXR0ZXJuPWFjdGl2aXR5X3dicy54c2wKLWRlbGl2ZXJ5cHJvY2Vzcz1hY3Rpdml0eV93YnMueHNsCi1pdGVyYXRpb249YWN0aXZpdHlfd2JzLnhzbAotcGhhc2U9YWN0aXZpdHlfd2JzLnhzbAotcHJvY2Vzcz1hY3Rpdml0eV93YnMueHNsCi1wcm9jZXNzY29udHJpYnV0aW9uPWFjdGl2aXR5X3dicy54c2wKLQotIyBEZXNjcmlwdG9ycwotY29tcG9zaXRlcm9sZT1jb21wb3NpdGVyb2xlLnhzbAotbWlsZXN0b25lPW1pbGVzdG9uZS54c2wKLXJvbGVkZXNjcmlwdG9yPXJvbGVfZGVzY3JpcHRvci54c2wKLXRhc2tkZXNjcmlwdG9yPXRhc2tfZGVzY3JpcHRvci54c2wKLXRlYW1wcm9maWxlPXRlYW1wcm9maWxlLnhzbAotd29ya3Byb2R1Y3RkZXNjcmlwdG9yPWFydGlmYWN0X2Rlc2NyaXB0b3IueHNsCi0KLSMgTWlzYwotZGVmYXVsdD1kZWZhdWx0LnhzbAotZ2VuZXJhbD1nZW5lcmFsLnhzbAotcGFnZV9ub3RfaW5zdGFsbGVkPXBhZ2Vfbm90X2luc3RhbGxlZC54c2wKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MaW5rSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xpbmtJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzZTYxNWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xpbmtJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sLlhTTFRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotCi0vKioKLSAqIGNsYXNzIHRvIHByb2Nlc3MgYW4gZWxlbWVudCBsaW5rIGluIHRoZSBjb250ZW50Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rSW5mbyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0FUVFJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0FUVFJfR1VJRCA9ICJndWlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19BVFRSX0hSRUYgPSAiaHJlZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfQVRUUl9LRVkgPSAia2V5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19BVFRSX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfQVRUUl9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBsaW5rZWRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBsaW5rRWxlbWVudCA9IG51bGw7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50ID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBpc01pc3NpbmdSZWZlcmVuY2UgPSBmYWxzZTsKLQotCXByaXZhdGUgTWFwIGF0dHJpYnV0ZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIElDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCXByaXZhdGUgU3RyaW5nIHB1YkRpcjsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqIEBwYXJhbSBwdWJEaXIKLQkgKi8KLQlwdWJsaWMgTGlua0luZm8oTWV0aG9kRWxlbWVudCBvd25lciwgSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yLAotCQkJU3RyaW5nIHB1YkRpcikgewotCQl0aGlzLm93bmVyRWxlbWVudCA9IG93bmVyOwotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQkJdGhpcy5wdWJEaXIgPSBwdWJEaXI7Ci0JfQotCi0JLyoqCi0JICogaXMgdGhpcyBhbiBlbGVtZW50IGxpbms/Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbGVtZW50TGluaygpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLmlzRWxlbWVudExpbmsoZ2V0RWxlbWVudExpbmtUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCBsaW5rIHR5cGUKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudExpbmtUeXBlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKExJTktfQVRUUl9DTEFTUyk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBndWlkIG9mIHRoZSBlbGVtZW50IGxpbmsKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R3VpZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShMSU5LX0FUVFJfR1VJRCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB1cmwgb2YgdGhlIGxpbmsKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKExJTktfQVRUUl9IUkVGKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxpbmtlZCB0ZXh0Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmtlZFRleHQoKSB7Ci0JCXJldHVybiBsaW5rZWRUZXh0OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbGlua2VkIGVsZW1lbnQKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRMaW5rZWRFbGVtZW50KCkgewotCQlyZXR1cm4gbGlua0VsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBodG1sIGZvciB0aGUgbGluay4KLQkgKiAKLQkgKiBAcGFyYW0gc2hvd0Jyb2tlbkxpbmtzIGJvb2xlYW4gdHJ1ZSB0byBzaG93IHRoZSBicm9rZW4gbGluayBtYXJrLiBmYWxzZSB0byBzaG93IHRleHQgb25seQotCSAqIEByZXR1cm4gU3RyaW5nQnVmZmVyCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBnZXRIdG1sKGJvb2xlYW4gc2hvd0Jyb2tlbkxpbmtzKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJaWYgKGlzTWlzc2luZ1JlZmVyZW5jZSAmJiAocHViRGlyICE9IG51bGwpKSB7Ci0JCQlTdHJpbmcgdXJsID0gIiI7Ci0JCQlpZiAoIXNob3dCcm9rZW5MaW5rcykgewotCQkJCWJ1ZmZlci5hcHBlbmQobGlua2VkVGV4dCk7Ci0JCQkJcmV0dXJuIGJ1ZmZlcjsKLQkJCX0KLQotCQkJdXJsID0gZ2V0TWlzc2luZ0VsZW1lbnRVcmwoKTsKLQkJCWJ1ZmZlcgotCQkJCQkuYXBwZW5kKCI8aW1nIGFsdD1cIlwiIHNyYz1cIiIgKyBSZXNvdXJjZUhlbHBlci5nZXRCYWNrUGF0aChvd25lckVsZW1lbnQpICsgImltYWdlcy9ub19ydXAuZ2lmXCI+JiMxNjA7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlzZXRVcmwodXJsKTsKLQkJfQotCi0JCWJ1ZmZlci5hcHBlbmQoIjxhIik7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWlmIChMSU5LX0FUVFJfSFJFRi5lcXVhbHMoa2V5KQotCQkJCQkmJiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlidWZmZXIuYXBwZW5kKCIgIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuYXBwZW5kKGVudHJ5LmdldEtleSgpKS5hcHBlbmQoIj0iKSAvLyROT04tTkxTLTEkCi0JCQkJCS5hcHBlbmQoIlwiIikuYXBwZW5kKGVudHJ5LmdldFZhbHVlKCkpLmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlidWZmZXIuYXBwZW5kKCI+IikuYXBwZW5kKGxpbmtlZFRleHQpLmFwcGVuZCgiPC9hPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBsaW5rIGF0dHJpYnV0ZXMKLQkgKiBAcGFyYW0gYXR0cmlidXRlcyBTdHJpbmcgdGhlIGxpbmsgYXR0cmlidXRlcwotCSAqIEBwYXJhbSB0ZXh0IFN0cmluZyB0aGUgbGlua2VkIHRleHQKLQkgKiBAcGFyYW0gY29uZmlnIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUxpbmsoU3RyaW5nIGF0dHJpYnV0ZXMsIFN0cmluZyB0ZXh0LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5saW5rZWRUZXh0ID0gdGV4dDsKLQotCQlNYXRjaGVyIG0yID0gUmVzb3VyY2VIZWxwZXIucF90YWdfYXR0cmlidXRlcy5tYXRjaGVyKGF0dHJpYnV0ZXMpOwotCQl3aGlsZSAobTIuZmluZCgpKSB7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSBtMi5ncm91cCgxKS50cmltKCkudG9Mb3dlckNhc2UoKTsKLQkJCVN0cmluZyBhdHRyVmFsdWUgPSBtMi5ncm91cCgzKS50cmltKCk7Ci0JCQkvKgotCQkJICogaWYgKGF0dHJWYWx1ZS5zdGFydHNXaXRoKCJcIiIpKSB7IGF0dHJWYWx1ZSA9Ci0JCQkgKiBhdHRyVmFsdWUuc3Vic3RyaW5nKDEpOyB9IGlmIChhdHRyVmFsdWUuZW5kc1dpdGgoIlwiIikpIHsKLQkJCSAqIGF0dHJWYWx1ZSA9IGF0dHJWYWx1ZS5zdWJzdHJpbmcoMCwgYXR0clZhbHVlLmxlbmd0aCgpIC0gMSk7IH0KLQkJCSAqLwotCi0JCQkvLyBHVlQ6IENhbm5vdCBQcmV2aWV3L0Jyb3dzZSBEZXNjcmlwdGlvbiBUYWIgd2hlbgotCQkJLy8gdGhlIENQIGNvbnRhaW5zIGNoaW5lc2UgY2hhcmFjdGVycwotCQkJLy8gZ2VuZXJhdGVkIGh0bWwgZnJvbSB4c2x0IGdvdCB0aGUgaHJlZiB1cmxzIGVuY29kZWQuIHdlIGRvbid0IHdhbnQKLQkJCS8vIHRoYXQgbWFrZSBzdXJlIGRlY29kZSB0aGUgdXJsIHVzaW5nICJVVEYtOCIgZW5jb2RpbmcKLQkJCWlmIChhdHRyTmFtZS5lcXVhbHMoTElOS19BVFRSX0hSRUYpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJYXR0clZhbHVlID0gZGVjb2RlKGF0dHJWYWx1ZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhdHRyaWJ1dGVNYXAucHV0KGF0dHJOYW1lLCBhdHRyVmFsdWUpOwotCQl9Ci0KLQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkKCk7Ci0JCWlmIChndWlkID09IG51bGwpIHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBmaWxlIGNvbnRhaW5zIGd1aWQsIGlmIHllcywgbmVlZCB0byBnZXQgdGhlIGVsZW1lbnQKLQkJCVN0cmluZyB1cmwgPSBnZXRVcmwoKTsKLQkJCWd1aWQgPSBSZXNvdXJjZUhlbHBlci5nZXRHdWlkRnJvbUZpbGVOYW1lKHVybCk7Ci0JCQlpZiAoZ3VpZCAhPSBudWxsKSB7Ci0JCQkJc2V0R3VpZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCXZhbGlkYXRlRWxlbWVudFVybChjb25maWcpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZGVjb2RlKFN0cmluZyBzdHIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFVSTERlY29kZXIuZGVjb2RlKHN0ciwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYXR0cmlidXRlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKFN0cmluZykgYXR0cmlidXRlTWFwLmdldChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgZ3VpZAotCSAqIEBwYXJhbSBndWlkIFN0cmluZwotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRHdWlkKFN0cmluZyBndWlkKSB7Ci0JCWF0dHJpYnV0ZU1hcC5wdXQoTElOS19BVFRSX0dVSUQsIGd1aWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRVcmwoU3RyaW5nIHVybCkgewotCQlhdHRyaWJ1dGVNYXAucHV0KExJTktfQVRUUl9IUkVGLCB1cmwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUVsZW1lbnRVcmwoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkKCk7Ci0JCWlmIChndWlkICE9IG51bGwpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IG51bGw7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCWUgPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQl9Ci0KLQkJCS8vIGlmIHByb2Nlc3MgY29tcG9uZW50LCBnZXQgc2hvdyB0aGUgcHJvY2VzcwotCQkJaWYgKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJZSA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZSkuZ2V0UHJvY2VzcygpOwotCQkJfQotCi0JCQkvLyAxNTY0NzQgLSBQcm9jZXNzIFBhY2thZ2UgKGVpdGhlciBDUCBwYWNrYWdlIG9yIERQIHBhY2thZ2UpIGNhbgotCQkJLy8gbm90IGJlIGxpbmtlZCBpbiBSVEUKLQkJCS8vIGRvbid0IHNob3cgbGluayBmb3IgcGFja2FnZXMuCi0JCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UgfHwgZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkJCQkJfHwgZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQllID0gbnVsbDsKLQkJCQkvLyByZW1vdmUgdGhlIGxpbmsgYXR5dHJpYnV0ZQotCQkJCXNldFVybChudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlMSA9IENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoZSwgY29uZmlnKTsKLQkJCQkJaWYgKGUxICE9IG51bGwpIHsKLQkJCQkJCWUgPSBlMTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlzTWlzc2luZ1JlZmVyZW5jZSA9IHRydWU7Ci0JCQkJCQl2YWxpZGF0b3IubG9nTWlzc2luZ1JlZmVyZW5jZShvd25lckVsZW1lbnQsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpc01pc3NpbmdSZWZlcmVuY2UgPSB0cnVlOwotCQkJCXZhbGlkYXRvci5sb2dNaXNzaW5nUmVmZXJlbmNlKG93bmVyRWxlbWVudCwgZ3VpZCwgbGlua2VkVGV4dCk7Ci0JCQl9Ci0KLQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQlndWlkID0gZS5nZXRHdWlkKCk7Ci0JCQkJc2V0R3VpZChndWlkKTsKLQkJCQlTdHJpbmcgdXJsID0gZ2V0VXJsKCk7Ci0KLQkJCQkvLyB1cmwgY2FuIGJlIG51bGwsIGZvciBleGFtcGxlLCBhbiBlbGVtZW50IGxpbmsgZm9yCi0JCQkJLy8gcHJlc2VudGF0aW9uIG5hbWUsIHN1Y2ggYXMKLQkJCQkvLyA8YSBjbGFzcz0iUHJlc2VudGF0aW9uTmFtZSIKLQkJCQkvLyBndWlkPSJ7RUU5N0E4Q0QtNjZDQS00QTlCLTk4NzEtRTNCOTRDQ0VENTI4fSI+UHJvamVjdAotCQkJCS8vIE1hbmFnZXI8L2E+Ci0JCQkJLy8gd2Ugb25seSBuZWVkIHRvIGdldCB0aGUgZWxlbWVudCBmcm9tIHRoZSBndWlkCi0JCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJCXVybCA9IHVybC50cmltKCk7Ci0JCQkJCWlmICghdXJsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgKLQkJCQkJCQlSZXNvdXJjZUhlbHBlci5VUkxfU1RSX0pBVkFTQ1JJUFQpKSB7Ci0JCQkJCQl1cmwgPSBSZXNvdXJjZUhlbHBlci5nZXRVcmwoZSwgb3duZXJFbGVtZW50LAotCQkJCQkJCQlSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MLCB1cmwpOwotCQkJCQkJc2V0VXJsKHVybCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoaXNFbGVtZW50TGluaygpKSB7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gUmVzb3VyY2VIZWxwZXIuZ2V0TGlua1RleHQoZSwKLQkJCQkJCQlnZXRFbGVtZW50TGlua1R5cGUoKSk7Ci0JCQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCQkJCS8vIGlmIG51bGwsIGNhbiBiZSB1c2VkIHRleHQsIGRvbid0IHJlc2V0IGl0Ci0JCQkJCQl0aGlzLmxpbmtlZFRleHQgPSB0ZXh0OwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHZhbGlkYXRvci5pc0Rpc2NhcmRlZChvd25lckVsZW1lbnQsIG51bGwsIGUpKSB7Ci0JCQkJCWlzTWlzc2luZ1JlZmVyZW5jZSA9IHRydWU7Ci0JCQkJCXZhbGlkYXRvci5sb2dNaXNzaW5nUmVmZXJlbmNlKG93bmVyRWxlbWVudCwgZSk7Ci0JCQkJCWUgPSBudWxsOyAvLyBpZ25vcmUgdGhlIGVsZW1lbnQgc2luY2UgaXQncyBkaXNjYXJkZWQKLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMubGlua0VsZW1lbnQgPSBlOwotCi0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19QQUdFU19YU0wgPSAicGFnZXNfbm90X2luc3RhbGxlZC8iOwotCS8vIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBnZXRNaXNzaW5nRWxlbWVudFVybCgpIHsKLQkJaWYgKCFpc01pc3NpbmdSZWZlcmVuY2UpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RyaW5nIHVybCA9IG51bGw7Ci0KLQkJLy8gaWYgKGxpbmtFbGVtZW50ID09IG51bGwpIHsKLQkJLy8gLy8gdGhpcyBpcyBhbiBpbnZhbGlkIGVsZW1lbnQsIG1heWJlIGRlbGV0ZWQgZnJvbSB0aGUgbGlicmFyeQotCQkvLyAvLyBhbHJlYWR5Ci0JCS8vIHVybCA9IFJlc291cmNlSGVscGVyLk1JU1NJTkdfUEFHRVNfRk9MREVSICsgZ2V0R3VpZCgpCi0JCS8vICsgUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTDsKLQkJLy8gfSBlbHNlIHsKLQkJLy8gdXJsID0gUmVzb3VyY2VIZWxwZXIuTUlTU0lOR19QQUdFU19GT0xERVIKLQkJLy8gKyBSZXNvdXJjZUhlbHBlci5nZXRGaWxlTmFtZShsaW5rRWxlbWVudCwKLQkJLy8gUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCk7Ci0JCS8vIH0KLQotCQl1cmwgPSBSZXNvdXJjZUhlbHBlci5NSVNTSU5HX1BBR0VTX0ZPTERFUiArICJwYWdlc19ub3RfaW5zdGFsbGVkIgotCQkJCSsgUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTDsKLQotCQlGaWxlIGYgPSBuZXcgRmlsZShwdWJEaXIsIHVybCk7Ci0JCUZpbGUgZGlyID0gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCWlmICghZGlyLmV4aXN0cygpKSB7Ci0JCQlkaXIubWtkaXJzKCk7Ci0JCX0KLQotCQkvLyBpZiAoICFmLmV4aXN0cygpICkKLQkJewotCQkJLy8gZ2VuZXJhdGUgdGhlIGh0bWwgZmlsZQotCQkJWG1sRWxlbWVudCB4bWwgPSBuZXcgWG1sRWxlbWVudCgiRWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobGlua0VsZW1lbnQgPT0gbnVsbCkgewotCQkJCXhtbC5zZXRBdHRyaWJ1dGUoImludmFsaWRMaW5rIiwgInRydWUiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoImd1aWQiLCBnZXRHdWlkKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBsaW5rZWRUZXh0KTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQl4bWwKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoImd1aWQiLCBnZXRHdWlkKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoInR5cGUiLCBsaW5rRWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgbGlua0VsZW1lbnQuZ2V0TmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkicGx1Z2luTmFtZSIsIExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihsaW5rRWxlbWVudCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJU3RyaW5nIHhzbFBhdGggPSBMYXlvdXRSZXNvdXJjZXMuZ2V0WHNsVXJpKAotCQkJCQkicGFnZV9ub3RfaW5zdGFsbGVkIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCXNhdmVIdG1sKHhtbCwgeHNsUGF0aCwgZik7Ci0JCX0KLQotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuZ2V0QmFja1BhdGgob3duZXJFbGVtZW50KS5yZXBsYWNlKAotCQkJCUZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKQotCQkJCSsgdXJsOwotCX0KLQotCS8qKgotCSAqIHNhdmUgYSBodG1sIGZpbGUgCi0JICogQHBhcmFtIHhtbEVsZW1lbnQKLQkgKiBAcGFyYW0geHNsX3VyaQotCSAqIEBwYXJhbSBvdXRwdXRGaWxlCi0JICogQGRlcHJlY2F0ZWQgdGhpcyBtZXRob2QgaWQgbm90IHVzZWQgYW55IG1vcmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlSHRtbChYbWxFbGVtZW50IHhtbEVsZW1lbnQsIFN0cmluZyB4c2xfdXJpLCBGaWxlIG91dHB1dEZpbGUpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZ0J1ZmZlciB4bWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl4bWwuYXBwZW5kKFhtbEhlbHBlci5YTUxfSEVBREVSKS5hcHBlbmQoeG1sRWxlbWVudC50b1htbCgpKTsKLQotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0JCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpLCAidXRmLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJUHJvcGVydGllcyB4c2xQYXJhbXMgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9wZXJ0aWVzKAotCQkJCQkiL2xheW91dC94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlYU0xUUHJvY2Vzc29yLnRyYW5zZm9ybSh4c2xfdXJpLCB4bWwudG9TdHJpbmcoKSwgeHNsUGFyYW1zLCBvdXRwdXQpOwotCQkJb3V0cHV0LmZsdXNoKCk7Ci0JCQlvdXRwdXQuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L1Byb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L1Byb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZGUyNDk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Qcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLQotCi0vKioKLSAqIFRoZSBwcm9jZXNzIGZpbHRlciB3aXRoIGFkYXB0b3IgZmFjdG9yeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlciBleHRlbmRzIFByb2Nlc3NDb25maWd1cmF0b3IgaW1wbGVtZW50cwotCQlJQWRhcHRlckZhY3RvcnlGaWx0ZXIgewotCi0JcHJpdmF0ZSBFbGVtZW50TGF5b3V0TWFuYWdlci5MYXlvdXRBZGFwdGVyRmFjdG9yeSBmYWN0b3J5OwotCi0JLyoqCi0JICogY29uc3RydWN0b3IgdGhlIGZpbHRlcgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqLwotCXB1YmxpYyBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIEVsZW1lbnRMYXlvdXRNYW5hZ2VyLkxheW91dEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnLCBudWxsKTsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFdCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeS53YnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFRCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeS50YnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFdQQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3Rvcnkud3Bic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gQWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5LmNic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIGFjY2VwdCB0aGUgb2JqZWN0IG9yIG5vdC4KLQkgKiBAcGFyYW0gb2JqIE9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBzdXBlci5hY2NlcHQob2JqKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0RpYWdyYW1JbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9EaWFncmFtSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZmIwZmNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0RpYWdyYW1JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW07Ci0KLWltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIGNsYXNzIGZvciBkaWFncmFtIGxheW91dAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JbmZvIGV4dGVuZHMgTWV0aG9kRWxlbWVudERpYWdyYW0gewotCi0JcHJpdmF0ZSBpbnQgc3VwcHJlc3NlZENvdW50ID0gMDsKLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBkaWFncmFtVHlwZQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIERpYWdyYW1JbmZvKFN0cmluZyBkaWFncmFtVHlwZSwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKGVsZW1lbnQpOwotCi0JCXN1cGVyLnNldEhUTUxNYXAobmV3IEhUTUxNYXAoZGlhZ3JhbVR5cGUgKyAiXyIgKyBlbGVtZW50LmdldE5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogYWRkIGEgZGlhZ3JhbSBhcmVhCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0geAotCSAqIEBwYXJhbSB5Ci0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodAotCSAqIEBwYXJhbSBhbHRUYWcKLQkgKiBAcGFyYW0gc3VwcHJlc3NlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFyZWEoTWV0aG9kRWxlbWVudCBlLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwKLQkJCVN0cmluZyBhbHRUYWcsIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlpZiAoIHN1cHByZXNzZWQgKQotCQl7Ci0JCQlzdXBwcmVzc2VkQ291bnQrKzsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKGFsdFRhZyA9PSBudWxsKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCWFsdFRhZyA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBlKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJaWYgKGFsdFRhZy5sZW5ndGgoKSA8IDEgfHwgYWx0VGFnID09ICIiKSB7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCU9iamVjdCBiYXNlID0gKChBY3Rpdml0eSkgZSkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJYWx0VGFnID0gKChBY3Rpdml0eSkgYmFzZSkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlICE9IG51bGwpIHsKLQkJCQlhbHRUYWcgPSBlLmdldE5hbWUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWx0VGFnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCVJlY3RhbmdsZSBjb29yZGluYXRlcyA9IG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0JCVN0cmluZyBocmVmID0gUmVzb3VyY2VIZWxwZXIuZ2V0VXJsKGUsIHN1cGVyLmdldE1ldGhvZEVsZW1lbnQoKSwKLQkJCQlSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsKLQkJSFRNTE1hcCBtYXAgPSBzdXBlci5nZXRIVE1MTWFwKCk7Ci0JCW1hcC5hZGRBcmVhKG5ldyBIVE1MQXJlYShlLmdldEd1aWQoKSwgaHJlZiwgInJlY3QiLCBjb29yZGluYXRlcywgYWx0VGFnKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbWFnZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwdWJsaXNoaW5nIGRpci4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlRmlsZVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJc3VwZXIuc2V0SW1hZ2VGaWxlTmFtZShSZXNvdXJjZUhlbHBlci5nZXRCYWNrUGF0aChzdXBlcgotCQkJCS5nZXRNZXRob2RFbGVtZW50KCkpCi0JCQkJKyBwYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG51bWJlciBvZiBhcmVhcwotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRBcmVhQ291bnQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRIVE1MTWFwKCkuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbnVtYmVyIG9mIHN1cHByZXNzZWQgYXJlYXMKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3VwcHJlc3NlZENvdW50KCkgewotCQlyZXR1cm4gc3VwcHJlc3NlZENvdW50OwotCX0KLQkKLQkvKioKLQkgKiBpcyBlbXB0eT8KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLQl7Ci0JCXJldHVybiBnZXRBcmVhQ291bnQoKSArIGdldFN1cHByZXNzZWRDb3VudCgpID09IDA7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9IVE1MQXJlYS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vSFRNTEFyZWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTQyZWU4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9IVE1MQXJlYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW07Ci0KLWltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7Ci0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSBIVE1MIEFSRUEgdGFnLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhJCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MQXJlYSB7Ci0KLQlwcml2YXRlIFN0cmluZyBndWlkID0gIG51bGw7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgaHJlZjsKLQotCXByaXZhdGUgU3RyaW5nIHNoYXBlOwotCi0JcHJpdmF0ZSBSZWN0YW5nbGUgY29vcmRpbmF0ZXM7Ci0KLQlwcml2YXRlIFN0cmluZyBhbHRUYWc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkhUTUxBcmVhPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSFRNTEFyZWEoU3RyaW5nIGd1aWQsIFN0cmluZyBocmVmLCBTdHJpbmcgc2hhcGUsIFJlY3RhbmdsZSBjb29yZGluYXRlcywKLQkJCVN0cmluZyBhbHRUYWcpIHsKLQkJdGhpcy5ndWlkID0gZ3VpZDsKLQkJdGhpcy5ocmVmID0gaHJlZjsKLQkJdGhpcy5zaGFwZSA9IHNoYXBlOwotCQl0aGlzLmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXM7Ci0JCXRoaXMuYWx0VGFnID0gYWx0VGFnOwotCQkKLQkJLy8gcmVtb3ZlIG5ldyBsaW5lIGNoYXJhY3RlcnMsIG90aGVyd2lzZSBpdCB3aWxsIGNhdXNlZCBhIHdoaXRlIHNwYWNlIGluIHRoZSBwdWJsaXNoZWQgaHRtbAotCQkvLyBub3QgYXMgZXhwZWN0ZWQuIAotCQkvLyBzZWUgYnVnIDAwMzg4OTc4IC0gRXh0cmEgc3BhY2UgaW4gdGhlIGZseW92ZXIgdGV4dCBpbiB0aGUgQ2FzcGlhbiBKYXBhbmVzZSBzaXRlCQkKLQkJaWYgKCB0aGlzLmFsdFRhZyAhPSBudWxsICkgewotCQkJdGhpcy5hbHRUYWcgPSB0aGlzLmFsdFRhZy5yZXBsYWNlQWxsKCIoXHJ8XG4pKyIsICIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZ3VpZAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHdWlkKCkgewotCQlyZXR1cm4gZ3VpZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSFJFRi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0JCXJldHVybiBocmVmOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcGUoKSB7Ci0JCXJldHVybiBzaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcy4KLQkgKi8KLQlwdWJsaWMgUmVjdGFuZ2xlIGdldENvb3JkaW5hdGVzKCkgewotCQlyZXR1cm4gY29vcmRpbmF0ZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWx0IHRhZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsdFRhZygpIHsKLQkJcmV0dXJuIGFsdFRhZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0hUTUxNYXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0hUTUxNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjUwYWJiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9IVE1MTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgSFRNTCBNQVAgdGFnLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxNYXAgewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGFyZWFzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5IVE1MTWFwPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSFRNTE1hcChTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmV3IGFyZWEgdG8gdGhlIG1hcC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBcmVhKEhUTUxBcmVhIGFyZWEpIHsKLQkJaWYgKGFyZWEgIT0gbnVsbCkgewotCQkJYXJlYXMuYWRkKGFyZWEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpdGVyYXRvciB0byBpdGVyYXRlIHRoZSBhcmVhcy4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0QXJlYXMoKSB7Ci0JCXJldHVybiBhcmVhcy5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGFyZWFzLnNpemUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0lBY3Rpdml0eURpYWdyYW1TZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9JQWN0aXZpdHlEaWFncmFtU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTk1ZDM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0lBY3Rpdml0eURpYWdyYW1TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgewotCi0JLyoqCi0JICogc2F2ZSB0aGUgZWxlbWVudCBkaWFncmFtIGltYWdlIGFuZCByZXR1cm5zIHRoZSBpbWFnZSBmaWxlIHVybC4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcGVyIE9iamVjdCB0aGUgaXRlbSBwcm92aWRlciB3cmFwcGVyIG9mIHRoZSBhY3Rpdml0eSBlbGVtZW50Ci0JICogQHBhcmFtIGltZ1BhdGggU3RyaW5nIHRoZSBnZW5lcmF0ZWQgaW1hZ2UgcGF0aCByZWxhdGl2ZSB0byB0aGUgcHVibGlzaGluZyBkaXIuCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgSUZpbHRlcgotCSAqIEBwYXJhbSBzdXAKLQkgKiAgICAgICAgICAgIFN1cHByZXNzaW9uCi0JICogQHJldHVybiBEaWFncmFtSW5mbyB0aGUgZGlhZ3JhbSBpbmZvCi0JICovCi0JcHVibGljIERpYWdyYW1JbmZvIHNhdmVEaWFncmFtKE9iamVjdCB3cmFwZXIsIFN0cmluZyBpbWdQYXRoLCBTdHJpbmcgZGlhZ3JhbVR5cGUsCi0JCQlJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vTWV0aG9kRWxlbWVudERpYWdyYW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL01ldGhvZEVsZW1lbnREaWFncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0YzNjZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vTWV0aG9kRWxlbWVudERpYWdyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbTsKLQotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgYSBwdWJsaXNoZWQgZGlhZ3JhbSBmb3IgYSA8Y29kZT5NZXRob2RFbGVtZW50PC9jb2RlPi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudERpYWdyYW0gewotCi0JLy8gVGhlIE1ldGhvZEVsZW1lbnQuCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQkvLyBUaGUgZ2VuZXJhdGVkIEpQRUcgZmlsZSBuYW1lLgotCXByaXZhdGUgU3RyaW5nIGltYWdlRmlsZU5hbWU7Ci0KLQkvLyBUaGUgSFRNTCBBcmVhIE1hcC4KLQlwcml2YXRlIEhUTUxNYXAgaHRtbE1hcDsKLQotCS8vIFRoZSBIVE1MIHRoYXQgcmVwcmVzZW50cyB0aGlzIGRpYWdyYW0uCi0JLy8gcHJpdmF0ZSBTdHJpbmcgZGlhZ3JhbUhUTUw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlJvbGVEaWFncmFtSW5mbzwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSA8Y29kZT5Db250ZW50RWxlbWVudDwvY29kZT4uCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnREaWFncmFtKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPk1ldGhvZEVsZW1lbnQ8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHVibGlzaGVkCi0JICogZGlhZ3JhbS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5NZXRob2RFbGVtZW50PC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhlIHB1Ymxpc2hlZAotCSAqICAgICAgICAgZGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmaWxlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBUaGUgaW1hZ2UgZmlsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1hZ2VGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGltYWdlRmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgZmlsZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVOYW1lCi0JICogICAgICAgICAgICBUaGUgaW1hZ2UgZmlsZSBuYW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlRmlsZU5hbWUoU3RyaW5nIGltYWdlRmlsZU5hbWUpIHsKLQkJdGhpcy5pbWFnZUZpbGVOYW1lID0gaW1hZ2VGaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBIVE1MIEFyZWEgTWFwLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIEhUTUwgQXJlYSBNYXAuCi0JICovCi0JcHVibGljIEhUTUxNYXAgZ2V0SFRNTE1hcCgpIHsKLQkJcmV0dXJuIGh0bWxNYXA7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgSFRNTCBBcmVhIE1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gaHRtbE1hcAotCSAqICAgICAgICAgICAgVGhlIEhUTUwgQXJlYSBNYXAuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SFRNTE1hcChIVE1MTWFwIGh0bWxNYXApIHsKLQkJdGhpcy5odG1sTWFwID0gaHRtbE1hcDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgZGlhZ3JhbS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBIVE1MIHNvdXJjZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRpYWdyYW0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIVE1MKCkgewotCQlTdHJpbmdCdWZmZXIgaHRtbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaHRtbC5hcHBlbmQoIjxwPiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbWFnZUZpbGVOYW1lICE9IG51bGwgJiYgaHRtbE1hcCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbWFwTmFtZSA9IGh0bWxNYXAuZ2V0TmFtZSgpOwotCQkJaHRtbC5hcHBlbmQoIjxtYXAgbmFtZT1cIiIpLmFwcGVuZChodG1sTWFwLmdldE5hbWUoKSkuYXBwZW5kKCJcIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlJdGVyYXRvciBhcmVhcyA9IGh0bWxNYXAuZ2V0QXJlYXMoKTsKLQkJCXdoaWxlIChhcmVhcy5oYXNOZXh0KCkpIHsKLQkJCQlIVE1MQXJlYSBodG1sQXJlYSA9IChIVE1MQXJlYSkgYXJlYXMubmV4dCgpOwotCQkJCVJlY3RhbmdsZSBjb29yZHMgPSBodG1sQXJlYS5nZXRDb29yZGluYXRlcygpOwotCQkJCWh0bWwKLQkJCQkJCS5hcHBlbmQoIjxhcmVhIGhyZWY9XCIiKS5hcHBlbmQoaHRtbEFyZWEuZ2V0SHJlZigpKS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkuYXBwZW5kKCIgc2hhcGU9XCIiKS5hcHBlbmQoaHRtbEFyZWEuZ2V0U2hhcGUoKSkuYXBwZW5kKCJcIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLmFwcGVuZCgiIGNvb3Jkcz1cIiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoKGludCkgY29vcmRzLmdldFgoKSkKLQkJCQkJCS5hcHBlbmQoIiwgIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgoaW50KSBjb29yZHMuZ2V0WSgpKQotCQkJCQkJLmFwcGVuZCgiLCAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKChpbnQpIChjb29yZHMuZ2V0WCgpICsgY29vcmRzLmdldFdpZHRoKCkpKQotCQkJCQkJLmFwcGVuZCgiLCAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKChpbnQpIChjb29yZHMuZ2V0WSgpICsgY29vcmRzLmdldEhlaWdodCgpKSkKLQkJCQkJCS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgiIGFsdD1cIiIpLmFwcGVuZChodG1sQXJlYS5nZXRBbHRUYWcoKSkuYXBwZW5kKCJcIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLmFwcGVuZCgiIHRpdGxlPVwiIikuYXBwZW5kKGh0bWxBcmVhLmdldEFsdFRhZygpKS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkuYXBwZW5kKCIvPiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlodG1sLmFwcGVuZCgiPC9tYXA+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWh0bWwKLQkJCQkJLmFwcGVuZCgiPGltZyBib3JkZXI9XCIwXCIgc3JjPVwiIikuYXBwZW5kKGltYWdlRmlsZU5hbWUpLmFwcGVuZCgiXCIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJLmFwcGVuZCgiIGFsdD1cIiIpLmFwcGVuZChtYXBOYW1lKS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCS5hcHBlbmQoIiB0aXRsZT1cIiIpLmFwcGVuZChtYXBOYW1lKS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCS5hcHBlbmQoIiB1c2VtYXA9XCIjIikuYXBwZW5kKG1hcE5hbWUpLmFwcGVuZCgiXCIvPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlodG1sLmFwcGVuZCgiPC9wPiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBodG1sLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB4bWwgZWxlbWVudCBmb3IgdGhlIGRpYWdyYW0KLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KCkKLQl7Ci0JCVhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IG51bGw7Ci0KLQkJaWYgKGltYWdlRmlsZU5hbWUgIT0gbnVsbCAmJiBodG1sTWFwICE9IG51bGwpIHsKLQkJCVN0cmluZyBtYXBOYW1lID0gaHRtbE1hcC5nZXROYW1lKCk7Ci0JCQl4bWxFbGVtZW50ID0gbmV3IFhtbEVsZW1lbnQoIm1hcCIpCi0JCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIG1hcE5hbWUpICAvLyROT04tTkxTLTEkIAotCQkJCS5zZXRBdHRyaWJ1dGUoInNyYyIsIGltYWdlRmlsZU5hbWUpIC8vJE5PTi1OTFMtMSQgCi0JCQkJLnNldEF0dHJpYnV0ZSgiYWx0IiwgbWFwTmFtZSk7ICAvLyROT04tTkxTLTEkIAotCQkJCi0JCQlJdGVyYXRvciBhcmVhcyA9IGh0bWxNYXAuZ2V0QXJlYXMoKTsKLQkJCXdoaWxlIChhcmVhcy5oYXNOZXh0KCkpIHsKLQkJCQlIVE1MQXJlYSBodG1sQXJlYSA9IChIVE1MQXJlYSkgYXJlYXMubmV4dCgpOwotCQkJCVJlY3RhbmdsZSBjb29yZHMgPSBodG1sQXJlYS5nZXRDb29yZGluYXRlcygpOwotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgoaW50KSBjb29yZHMuZ2V0WCgpKQotCQkJCS5hcHBlbmQoIiwgIikgLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQoKGludCkgY29vcmRzLmdldFkoKSkKLQkJCQkuYXBwZW5kKCIsICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuYXBwZW5kKChpbnQpIChjb29yZHMuZ2V0WCgpICsgY29vcmRzLmdldFdpZHRoKCkpKQotCQkJCS5hcHBlbmQoIiwgIikgLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQoKGludCkgKGNvb3Jkcy5nZXRZKCkgKyBjb29yZHMuZ2V0SGVpZ2h0KCkpKTsKLQkJCQkKLQkJCQkvLyBuZWVkIHRvIGVzY2FwZSB0aGUgdXJsIHNpbmNlIGl0IHdpbGwgYmUgcGFzc2VkIGFzIGEgbGl0ZXJhbCBzdHJpbmcgdG8gYSBqYXZhc2NyaXB0IHZhcmlhYmxlCi0JCQkJeG1sRWxlbWVudC5uZXdDaGlsZCgiYXJlYSIpCi0JCQkJCS5zZXRBdHRyaWJ1dGUoImd1aWQiLCAoaHRtbEFyZWEuZ2V0R3VpZCgpID09IG51bGwpID8gIiIgOiBodG1sQXJlYS5nZXRHdWlkKCkgKSAgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJocmVmIiwgU3RyVXRpbC5lc2NhcGUoaHRtbEFyZWEuZ2V0SHJlZigpKSkJLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJzaGFwZSIsIGh0bWxBcmVhLmdldFNoYXBlKCkpCS8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiY29vcmRzIiwgYnVmZmVyLnRvU3RyaW5nKCkpCS8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiYWx0IiwgaHRtbEFyZWEuZ2V0QWx0VGFnKCkpOwkvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB4bWxFbGVtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL1JvbGVEaWFncmFtUHVibGlzaGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9Sb2xlRGlhZ3JhbVB1Ymxpc2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZTdiMTgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL1JvbGVEaWFncmFtUHVibGlzaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW07Ci0KLWltcG9ydCBqYXZhLmF3dC5CYXNpY1N0cm9rZTsKLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5Gb250OwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7Ci1pbXBvcnQgamF2YS5hd3QuUG9pbnQ7Ci1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotaW1wb3J0IGphdmEuYXd0LlJlbmRlcmluZ0hpbnRzOwotaW1wb3J0IGphdmEuYXd0LlRleHR1cmVQYWludDsKLWltcG9ydCBqYXZhLmF3dC5nZW9tLkxpbmUyRDsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSTE4blV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JbWFnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuUm9sZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotCi0vKioKLSAqIFJlbmRlcnMgdGhlIFJvbGUgZGlhZ3JhbSB1c2luZyBKYXZhMkQgYW5kIHNhdmVzIGl0IGFzIGEgSlBFRyBmaWxlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGlhZ3JhbVB1Ymxpc2hlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9GT05UX05BTUUgPSAiQXJpYWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9GT05UX1NJWkUgPSAxMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1hfTUFSR0lOID0gMjAwOwkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9YX1NQQUNJTkcgPSA3MDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1lfU1BBQ0lORyA9IDMwOwotCi0JLy8gVGhlIG1heGltdW0gd2lkdGggb2YgdGhlIGdlbmVyYXRlZCBpbWFnZS4KLQlwcml2YXRlIGludCBtYXhJbWFnZVdpZHRoID0gMTAyNDsKLQotCS8vIFRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlLgotCXByaXZhdGUgaW50IG1heEltYWdlSGVpZ2h0ID0gMTAyNDsKLQotCS8vIFRoZSBib3JkZXIgd2lkdGguCi0JcHJpdmF0ZSBpbnQgYm9yZGVyV2lkdGggPSAxMDsKLQotCS8vIFRoZSBib3JkZXIgaGVpZ2h0LgotCXByaXZhdGUgaW50IGJvcmRlckhlaWdodCA9IDEwOwotCi0JLy8gVGhlIGFkZGl0aW9uYWwgc3BhY2luZyBiZWZvcmUgdGhlIGxlZnQtbW9zdCBUYXNrIGFuZC9vciBXb3JrIFByb2R1Y3QKLQkvLyBpbWFnZS4KLQlwcml2YXRlIGludCB4TWFyZ2luID0gMjQwOwotCi0JLy8gVGhlIGhvcml6b250YWwgc3BhY2luZyBiZXR3ZWVuIHRoZSBlbGVtZW50IGltYWdlcy4KLQlwcml2YXRlIGludCB4U3BhY2luZyA9IDQ1OwotCi0JLy8gVGhlIHZlcnRpY2FsIHNwYWNpbmcgYmV0d2VlbiB0aGUgZWxlbWVudCBpbWFnZXMuCi0JcHJpdmF0ZSBpbnQgeVNwYWNpbmcgPSA0MDsKLQotCXByaXZhdGUgaW50IGxpbmVQYWRkaW5nID0gMTI7Ci0KLQlwcml2YXRlIEZvbnQgdGV4dEZvbnQgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5JbWFnZVB1Ymxpc2hlcjwvY29kZT4uCi0JICovCi0JcHVibGljIFJvbGVEaWFncmFtUHVibGlzaGVyKCkgewotCQkvLyBTZWxlY3QgdGhlIGZvbnQgZm9yIHJlbmRlcmluZyB0aGUgZWxlbWVudCBuYW1lcy4KLQkJU3RyaW5nIGZvbnROYW1lOwotCQlpbnQgZm9udFNpemU7Ci0JCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoUGxhdGZvcm0uV1NfV0lOMzIpKSB7Ci0JCQlmb250TmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI7Ci0JCQlmb250U2l6ZSA9IEkxOG5VdGlsLmdldEludChMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyLCBERUZBVUxUX0ZPTlRfU0laRSk7IAotCQl9IGVsc2UgewotCQkJZm9udE5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lOwkJCi0JCQlmb250U2l6ZSA9IEkxOG5VdGlsLmdldEludChMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9zaXplLCBERUZBVUxUX0ZPTlRfU0laRSk7IAotCQl9Ci0JCWlmIChmb250TmFtZS5zdGFydHNXaXRoKCJbIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZm9udE5hbWUgPSBERUZBVUxUX0ZPTlRfTkFNRTsKLQkJfQotCQl0ZXh0Rm9udCA9IG5ldyBGb250KGZvbnROYW1lLCBGb250LlBMQUlOLCBmb250U2l6ZSk7Ci0KLQkJeE1hcmdpbiA9IEkxOG5VdGlsLmdldEludChMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtX3hNYXJnaW4sIERFRkFVTFRfWF9NQVJHSU4pOyAKLQkJeFNwYWNpbmcgPSBJMThuVXRpbC5nZXRJbnQoTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbV94U3BhY2luZywgREVGQVVMVF9YX1NQQUNJTkcpOyAKLQkJeVNwYWNpbmcgPSBJMThuVXRpbC5nZXRJbnQoTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbV95U3BhY2luZywgREVGQVVMVF9ZX1NQQUNJTkcpOyAKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIFJvbGUgRGlhZ3JhbSBIVE1MIHNvdXJjZSBmb3IgdGhlIGdpdmVuIHJvbGUuCi0JICogCi0JICogQHBhcmFtIHJvbGUKLQkgKiAgICAgICAgICAgIFRoZSBSb2xlIGVsZW1lbnQuCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwdWJsaXNoIHBhdGguCi0JICogQHJldHVybiBBIDxjb2RlPk1ldGhvZEVsZW1lbnREaWFncmFtPC9jb2RlPiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqICAgICAgICAgcHVibGlzaGVkIGRpYWdyYW0uCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnREaWFncmFtIHB1Ymxpc2goUm9sZUxheW91dCByb2xlTGF5b3V0LCBGaWxlIHBhdGgpIHsKLQotCQlSb2xlIHJvbGUgPSAoUm9sZSkgcm9sZUxheW91dC5nZXRFbGVtZW50KCk7Ci0KLQkJaWYgKHJvbGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCU1ldGhvZEVsZW1lbnREaWFncmFtIGVsZW1lbnREaWFncmFtID0gbmV3IE1ldGhvZEVsZW1lbnREaWFncmFtKHJvbGUpOwotCi0JCQlTdHJpbmcgcHVibGlzaERpciA9IHJvbGVMYXlvdXQuZ2V0TGF5b3V0TWdyKCkuZ2V0UHVibGlzaERpcigpOwotCQkJU3RyaW5nIG1hcE5hbWUgPSByb2xlTGF5b3V0LmdldERpc3BsYXlOYW1lKCk7Ci0JCQlpZiAobWFwTmFtZSA9PSBudWxsIHx8IG1hcE5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCW1hcE5hbWUgPSAiVW5rbm93biI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJbWFwTmFtZSA9IG1hcE5hbWUucmVwbGFjZSgnICcsICdfJyk7Ci0JCQl9Ci0JCQlIVE1MTWFwIGh0bWxNYXAgPSBuZXcgSFRNTE1hcChtYXBOYW1lKTsKLQkJCWVsZW1lbnREaWFncmFtLnNldEhUTUxNYXAoaHRtbE1hcCk7Ci0KLQkJCS8vIENyZWF0ZSB0aGUgQVdUIEpQYW5lbCBmb3IgcmVuZGVyaW5nIHRoZSBkaWFncmFtLgotCQkJSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbCgpOwotCi0JCQkvLyBDcmVhdGUgdGhlIG91dHB1dCBCdWZmZXJlZEltYWdlLgotCQkJQnVmZmVyZWRJbWFnZSBvdXRwdXRJbWFnZSA9IG5ldyBCdWZmZXJlZEltYWdlKG1heEltYWdlV2lkdGgsCi0JCQkJCW1heEltYWdlSGVpZ2h0LCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQik7Ci0JCQlHcmFwaGljczJEIGcyZCA9IChHcmFwaGljczJEKSBvdXRwdXRJbWFnZS5nZXRHcmFwaGljcygpOwotCi0JCQkvLyBTd2l0Y2ggb24gYW50aS1hbGlhc2luZy4KLQkJCWcyZC5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9URVhUX0FOVElBTElBU0lORywKLQkJCQkJUmVuZGVyaW5nSGludHMuVkFMVUVfVEVYVF9BTlRJQUxJQVNfT04pOwotCQkJZzJkLnNldFJlbmRlcmluZ0hpbnQoUmVuZGVyaW5nSGludHMuS0VZX0FOVElBTElBU0lORywKLQkJCQkJUmVuZGVyaW5nSGludHMuVkFMVUVfQU5USUFMSUFTX09OKTsKLQkJCWcyZC5maWxsUmVjdCgwLCAwLCBtYXhJbWFnZVdpZHRoLCBtYXhJbWFnZUhlaWdodCk7Ci0KLQkJCS8vIFNldCB0aGUgc3Ryb2tlIGZvciBkcmF3aW5nIHRoZSBhc3NvY2lhdGlvbiBsaW5lcy4KLQkJCWcyZC5zZXRTdHJva2UobmV3IEJhc2ljU3Ryb2tlKDEuMjVmKSk7Ci0JCQlnMmQuc2V0Q29sb3IoQ29sb3IuQkxBQ0spOwotCi0JCQlpbnQgeE9mZnNldCA9IHhTcGFjaW5nIC8gMjsKLQotCQkJLy8gUmVuZGVycyB0aGUgVGFza3MgcGVyZm9ybWVkIGJ5IHRoZSBSb2xlLgotCQkJTGlzdCB0YXNrcyA9IHJvbGVMYXlvdXQuZ2V0UGVyZm9ybXMoKTsKLQkJCWludCB0b3RhbFRhc2tzID0gdGFza3MgIT0gbnVsbCA/IHRhc2tzLnNpemUoKSA6IDA7Ci0JCQlQb2ludCB0YXNrU3RhcnRQb2ludCA9IG5ldyBQb2ludChib3JkZXJXaWR0aCArIHhNYXJnaW4sCi0JCQkJCWJvcmRlckhlaWdodCk7Ci0JCQlQb2ludCB0YXNrRW5kUG9pbnQgPSBuZXcgUG9pbnQoYm9yZGVyV2lkdGggKyB4TWFyZ2luLCBib3JkZXJIZWlnaHQpOwotCQkJaW50IHggPSB0YXNrU3RhcnRQb2ludC54OwotCQkJaW50IHkgPSB0YXNrU3RhcnRQb2ludC55OwotCQkJaW50IHRhc2tzRW5kWCA9IDA7Ci0JCQlpZiAodG90YWxUYXNrcyA+IDApIHsKLQkJCQlpbnQgdGFza05vID0gMTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSB0YXNrcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgdGFza05vKyspIHsKLQkJCQkJVGFzayB0YXNrID0gKFRhc2spIGkubmV4dCgpOwotCi0JCQkJCUlFbGVtZW50TGF5b3V0IHRhc2tMYXlvdXQgPSByb2xlTGF5b3V0LmdldExheW91dE1ncigpCi0JCQkJCQkJLmdldExheW91dCh0YXNrLCB0cnVlKTsKLQotCQkJCQlTdHJpbmcgdGFza05hbWUgPSB0YXNrTGF5b3V0LmdldERpc3BsYXlOYW1lKCk7Ci0JCQkJCVN0cmluZyBpbWFnZUZpbGUgPSBwdWJsaXNoRGlyCi0JCQkJCQkJKyB0YXNrTGF5b3V0LmdldERpYWdyYW1pY29uVXJsKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlCdWZmZXJlZEltYWdlIHRhc2tJbWFnZSA9IEltYWdlVXRpbC5nZXRCdWZmZXJlZEltYWdlKAotCQkJCQkJCQlpbWFnZUZpbGUsIHBhbmVsKTsKLQkJCQkJCWludCB0YXNrV2lkdGggPSB0YXNrSW1hZ2UuZ2V0V2lkdGgoKTsKLQkJCQkJCWludCB0YXNrSGVpZ2h0ID0gdGFza0ltYWdlLmdldEhlaWdodCgpOwotCQkJCQkJaWYgKHRhc2tObyA9PSAxKSB7Ci0JCQkJCQkJdGFza0VuZFBvaW50LnggKz0gdGFza1dpZHRoOwotCQkJCQkJCXRhc2tFbmRQb2ludC55ICs9IHRhc2tIZWlnaHQ7Ci0JCQkJCQkJdGFza3NFbmRYID0gdGFza0VuZFBvaW50Lng7Ci0JCQkJCQl9Ci0JCQkJCQlSZWN0YW5nbGUgdGFza0ltYWdlUmVjdCA9IG5ldyBSZWN0YW5nbGUoeCwgeSwKLQkJCQkJCQkJdGFza1dpZHRoLCB0YXNrSGVpZ2h0KTsKLQkJCQkJCVRleHR1cmVQYWludCB0YXNrUGFpbnQgPSBuZXcgVGV4dHVyZVBhaW50KHRhc2tJbWFnZSwKLQkJCQkJCQkJdGFza0ltYWdlUmVjdCk7Ci0JCQkJCQlnMmQuc2V0UGFpbnQodGFza1BhaW50KTsKLQkJCQkJCWcyZC5maWxsKHRhc2tJbWFnZVJlY3QpOwotCQkJCQkJaWYgKHRhc2tOYW1lICE9IG51bGwpIHsKLQkJCQkJCQlJbWFnZVV0aWwuZHJhd1RleHQoZzJkLCB0YXNrTmFtZSwgdGV4dEZvbnQsCi0JCQkJCQkJCQlDb2xvci5CTEFDSywgeCAtIHhPZmZzZXQsIHRhc2tFbmRQb2ludC55LAotCQkJCQkJCQkJdGFza1dpZHRoICsgeFNwYWNpbmcpOwotCQkJCQkJfQotCi0JCQkJCQlTdHJpbmcgaHJlZiA9IHRhc2tMYXlvdXQuZ2V0RmlsZVBhdGgocm9sZUxheW91dCkKLQkJCQkJCQkJKyB0YXNrTGF5b3V0LmdldEZpbGVOYW1lKCIuaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlIVE1MQXJlYSBodG1sQXJlYSA9IG5ldyBIVE1MQXJlYSh0YXNrLmdldEd1aWQoKSwgaHJlZiwKLQkJCQkJCQkJInJlY3QiLCB0YXNrSW1hZ2VSZWN0LCB0YXNrTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWh0bWxNYXAuYWRkQXJlYShodG1sQXJlYSk7Ci0KLQkJCQkJCWlmICh4ICsgdGFza1dpZHRoID4gdGFza3NFbmRYKSB7Ci0JCQkJCQkJdGFza3NFbmRYID0geCArIHRhc2tXaWR0aDsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJaW50IHhJbmNyZW1lbnQgPSB0YXNrV2lkdGggKyB4U3BhY2luZzsKLQkJCQkJCQl4ICs9IHhJbmNyZW1lbnQ7Ci0JCQkJCQkJdGFza0VuZFBvaW50LnggKz0geEluY3JlbWVudDsKLQkJCQkJCQlpZiAoKHggKyB4SW5jcmVtZW50ICsgeE9mZnNldCArIGJvcmRlcldpZHRoKSA+IG1heEltYWdlV2lkdGgpIHsKLQkJCQkJCQkJeCA9IHRhc2tTdGFydFBvaW50Lng7Ci0JCQkJCQkJCWludCB5SW5jcmVtZW50ID0gdGFza0hlaWdodCArIHlTcGFjaW5nOwotCQkJCQkJCQl5ICs9IHlJbmNyZW1lbnQ7Ci0JCQkJCQkJCXRhc2tFbmRQb2ludC55ICs9IHlJbmNyZW1lbnQ7Ci0JCQkJCQkJCXRhc2tFbmRQb2ludC54ID0gdGFza1N0YXJ0UG9pbnQueCArIHRhc2tXaWR0aDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmVuZGVycyB0aGUgV29yayBQcm9kdWN0cyB0aGF0IHRoZSBSb2xlIGlzIHJlc3BvbnNpYmxlIGZvci4KLQkJCUxpc3Qgd29ya1Byb2R1Y3RzID0gcm9sZUxheW91dC5nZXRSZXNwb25zaWJsZUZvcigpOwotCQkJaW50IHRvdGFsV29ya1Byb2R1Y3RzID0gd29ya1Byb2R1Y3RzICE9IG51bGwgPyB3b3JrUHJvZHVjdHMuc2l6ZSgpCi0JCQkJCTogMDsKLQkJCVBvaW50IHdvcmtQcm9kdWN0U3RhcnRQb2ludCA9IG5ldyBQb2ludCh0YXNrU3RhcnRQb2ludC54LAotCQkJCQlib3JkZXJIZWlnaHQpOwotCQkJUG9pbnQgd29ya1Byb2R1Y3RFbmRQb2ludCA9IG5ldyBQb2ludCh0YXNrU3RhcnRQb2ludC54LAotCQkJCQlib3JkZXJIZWlnaHQpOwotCQkJaWYgKHRvdGFsVGFza3MgPiAwICYmIHRvdGFsV29ya1Byb2R1Y3RzID4gMCkgewotCQkJCXdvcmtQcm9kdWN0U3RhcnRQb2ludC55ID0gdGFza0VuZFBvaW50LnkgKyB5U3BhY2luZyArIHlTcGFjaW5nCi0JCQkJCQkvIDI7Ci0JCQkJd29ya1Byb2R1Y3RFbmRQb2ludC55ID0gd29ya1Byb2R1Y3RTdGFydFBvaW50Lnk7Ci0JCQl9IGVsc2UgaWYgKHRvdGFsVGFza3MgPiAwKSB7Ci0JCQkJd29ya1Byb2R1Y3RFbmRQb2ludC55ID0gdGFza0VuZFBvaW50LnkgKyBib3JkZXJIZWlnaHQ7Ci0JCQl9Ci0JCQl4ID0gd29ya1Byb2R1Y3RTdGFydFBvaW50Lng7Ci0JCQl5ID0gd29ya1Byb2R1Y3RTdGFydFBvaW50Lnk7Ci0JCQlpbnQgd29ya1Byb2R1Y3RzRW5kWCA9IDA7Ci0JCQlpZiAodG90YWxXb3JrUHJvZHVjdHMgPiAwKSB7Ci0JCQkJaW50IHdvcmtQcm9kdWN0Tm8gPSAxOwotCQkJCWZvciAoSXRlcmF0b3IgaSA9IHdvcmtQcm9kdWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgd29ya1Byb2R1Y3RObysrKSB7Ci0JCQkJCVdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSBpLm5leHQoKTsKLQotCQkJCQlJRWxlbWVudExheW91dCB3cExheW91dCA9IHJvbGVMYXlvdXQuZ2V0TGF5b3V0TWdyKCkKLQkJCQkJCQkuZ2V0TGF5b3V0KHdvcmtQcm9kdWN0LCB0cnVlKTsKLQotCQkJCQlTdHJpbmcgd29ya1Byb2R1Y3ROYW1lID0gd3BMYXlvdXQuZ2V0RGlzcGxheU5hbWUoKTsKLQkJCQkJU3RyaW5nIGltYWdlRmlsZSA9IHB1Ymxpc2hEaXIKLQkJCQkJCQkrIHdwTGF5b3V0LmdldERpYWdyYW1pY29uVXJsKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlCdWZmZXJlZEltYWdlIHdvcmtQcm9kdWN0SW1hZ2UgPSBJbWFnZVV0aWwKLQkJCQkJCQkJLmdldEJ1ZmZlcmVkSW1hZ2UoaW1hZ2VGaWxlLCBwYW5lbCk7Ci0JCQkJCQlpbnQgd29ya1Byb2R1Y3RXaWR0aCA9IHdvcmtQcm9kdWN0SW1hZ2UuZ2V0V2lkdGgoKTsKLQkJCQkJCWludCB3b3JrUHJvZHVjdEhlaWdodCA9IHdvcmtQcm9kdWN0SW1hZ2UuZ2V0SGVpZ2h0KCk7Ci0JCQkJCQlpZiAod29ya1Byb2R1Y3RObyA9PSAxKSB7Ci0JCQkJCQkJd29ya1Byb2R1Y3RFbmRQb2ludC54ICs9IHdvcmtQcm9kdWN0V2lkdGg7Ci0JCQkJCQkJd29ya1Byb2R1Y3RFbmRQb2ludC55ICs9IHdvcmtQcm9kdWN0SGVpZ2h0OwotCQkJCQkJCXdvcmtQcm9kdWN0c0VuZFggPSB3b3JrUHJvZHVjdEVuZFBvaW50Lng7Ci0JCQkJCQl9Ci0JCQkJCQlSZWN0YW5nbGUgd29ya1Byb2R1Y3RJbWFnZVJlY3QgPSBuZXcgUmVjdGFuZ2xlKHgsIHksCi0JCQkJCQkJCXdvcmtQcm9kdWN0V2lkdGgsIHdvcmtQcm9kdWN0SGVpZ2h0KTsKLQkJCQkJCVRleHR1cmVQYWludCB3b3JrUHJvZHVjdFBhaW50ID0gbmV3IFRleHR1cmVQYWludCgKLQkJCQkJCQkJd29ya1Byb2R1Y3RJbWFnZSwgd29ya1Byb2R1Y3RJbWFnZVJlY3QpOwotCQkJCQkJZzJkLnNldFBhaW50KHdvcmtQcm9kdWN0UGFpbnQpOwotCQkJCQkJZzJkLmZpbGwod29ya1Byb2R1Y3RJbWFnZVJlY3QpOwotCQkJCQkJaWYgKHdvcmtQcm9kdWN0TmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJSW1hZ2VVdGlsLmRyYXdUZXh0KGcyZCwgd29ya1Byb2R1Y3ROYW1lLCB0ZXh0Rm9udCwKLQkJCQkJCQkJCUNvbG9yLkJMQUNLLCB4IC0geE9mZnNldCwKLQkJCQkJCQkJCXdvcmtQcm9kdWN0RW5kUG9pbnQueSwgd29ya1Byb2R1Y3RXaWR0aAotCQkJCQkJCQkJCQkrIHhTcGFjaW5nKTsKLQkJCQkJCX0KLQotCQkJCQkJU3RyaW5nIGhyZWYgPSB3cExheW91dC5nZXRGaWxlUGF0aChyb2xlTGF5b3V0KQotCQkJCQkJCQkrIHdwTGF5b3V0LmdldEZpbGVOYW1lKCIuaHRtbCIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCUhUTUxBcmVhIGh0bWxBcmVhID0gbmV3IEhUTUxBcmVhKHdvcmtQcm9kdWN0LmdldEd1aWQoKSwgaHJlZiwKLQkJCQkJCQkJInJlY3QiLCB3b3JrUHJvZHVjdEltYWdlUmVjdCwgd29ya1Byb2R1Y3ROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaHRtbE1hcC5hZGRBcmVhKGh0bWxBcmVhKTsKLQotCQkJCQkJaWYgKHggKyB3b3JrUHJvZHVjdFdpZHRoID4gd29ya1Byb2R1Y3RzRW5kWCkgewotCQkJCQkJCXdvcmtQcm9kdWN0c0VuZFggPSB4ICsgd29ya1Byb2R1Y3RXaWR0aDsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJaW50IHhJbmNyZW1lbnQgPSB3b3JrUHJvZHVjdFdpZHRoICsgeFNwYWNpbmc7Ci0JCQkJCQkJeCArPSB4SW5jcmVtZW50OwotCQkJCQkJCXdvcmtQcm9kdWN0RW5kUG9pbnQueCArPSB4SW5jcmVtZW50OwotCQkJCQkJCWlmICgoeCArIHhJbmNyZW1lbnQgKyB4T2Zmc2V0ICsgYm9yZGVyV2lkdGgpID4gbWF4SW1hZ2VXaWR0aCkgewotCQkJCQkJCQl4ID0gd29ya1Byb2R1Y3RTdGFydFBvaW50Lng7Ci0JCQkJCQkJCWludCB5SW5jcmVtZW50ID0gd29ya1Byb2R1Y3RIZWlnaHQgKyB5U3BhY2luZzsKLQkJCQkJCQkJeSArPSB5SW5jcmVtZW50OwotCQkJCQkJCQl3b3JrUHJvZHVjdEVuZFBvaW50LnkgKz0geUluY3JlbWVudDsKLQkJCQkJCQkJd29ya1Byb2R1Y3RFbmRQb2ludC54ID0gd29ya1Byb2R1Y3RTdGFydFBvaW50LngKLQkJCQkJCQkJCQkrIHdvcmtQcm9kdWN0V2lkdGg7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFJlbmRlciB0aGUgUm9sZS4KLQkJCVBvaW50IHJvbGVTdGFydFBvaW50ID0gbmV3IFBvaW50KHhPZmZzZXQtNSwgYm9yZGVySGVpZ2h0KTsKLQkJCVBvaW50IHJvbGVFbmRQb2ludCA9IHJvbGVTdGFydFBvaW50OwkJCQotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgcm9sZU5hbWUgPSByb2xlTGF5b3V0LmdldERpc3BsYXlOYW1lKCk7Ci0JCQkJU3RyaW5nIGltYWdlRmlsZSA9IHB1Ymxpc2hEaXIgKyByb2xlTGF5b3V0LmdldERpYWdyYW1pY29uVXJsKCk7Ci0JCQkJQnVmZmVyZWRJbWFnZSByb2xlSW1hZ2UgPSBJbWFnZVV0aWwuZ2V0QnVmZmVyZWRJbWFnZShpbWFnZUZpbGUsCi0JCQkJCQlwYW5lbCk7Ci0JCQkJaW50IHJvbGVXaWR0aCA9IHJvbGVJbWFnZS5nZXRXaWR0aCgpOwotCQkJCWludCByb2xlSGVpZ2h0ID0gcm9sZUltYWdlLmdldEhlaWdodCgpOwotCQkJCXggPSB4T2Zmc2V0LTU7Ci0JCQkJeSA9IGJvcmRlckhlaWdodDsKLQkJCQlyb2xlRW5kUG9pbnQueCArPSByb2xlV2lkdGg7Ci0JCQkJcm9sZUVuZFBvaW50LnkgKz0gcm9sZUhlaWdodDsKLQkJCQlpZiAodG90YWxXb3JrUHJvZHVjdHMgPiAwKSB7Ci0JCQkJCXkgPSBib3JkZXJIZWlnaHQKLQkJCQkJCQkrICh3b3JrUHJvZHVjdEVuZFBvaW50LnkgLSB0YXNrU3RhcnRQb2ludC55IC0gcm9sZUhlaWdodCkKLQkJCQkJCQkvIDI7Ci0KLQkJCQkJLy8gUmVuZGVyIHRoZSAicmVzcG9uc2libGUgZm9yIiBhc3NvY2lhdGlvbiBsaW5lLgotCQkJCQlQb2ludCBzdGFydFBvaW50ID0gbmV3IFBvaW50KHggKyByb2xlV2lkdGggKyBsaW5lUGFkZGluZwotCQkJCQkJCS8gMiwgeSArIHJvbGVIZWlnaHQgLyAyKTsKLQkJCQkJUG9pbnQgZW5kUG9pbnQgPSBuZXcgUG9pbnQod29ya1Byb2R1Y3RTdGFydFBvaW50LngKLQkJCQkJCQktIGxpbmVQYWRkaW5nLCB3b3JrUHJvZHVjdFN0YXJ0UG9pbnQueQotCQkJCQkJCSsgKHdvcmtQcm9kdWN0RW5kUG9pbnQueSAtIHdvcmtQcm9kdWN0U3RhcnRQb2ludC55KQotCQkJCQkJCS8gMik7Ci0JCQkJCXJlbmRlckFzc29jaWF0aW9uKAotCQkJCQkJCWcyZCwKLQkJCQkJCQlzdGFydFBvaW50LAotCQkJCQkJCWVuZFBvaW50LAotCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0LCB0ZXh0Rm9udCwgQ29sb3IuQkxBQ0spOwotCQkJCX0gZWxzZSBpZiAodG90YWxUYXNrcyA+IDApIHsKLQkJCQkJeSA9IGJvcmRlckhlaWdodAotCQkJCQkJCSsgKHRhc2tFbmRQb2ludC55IC0gdGFza1N0YXJ0UG9pbnQueSAtIHJvbGVIZWlnaHQpCi0JCQkJCQkJLyAyOwotCQkJCX0KLQkJCQlyb2xlU3RhcnRQb2ludC55ID0geTsKLQkJCQlyb2xlRW5kUG9pbnQueSA9IHkgKyByb2xlSGVpZ2h0OwotCi0JCQkJaWYgKHRvdGFsVGFza3MgPiAwKSB7Ci0JCQkJCS8vIFJlbmRlciB0aGUgInBlcmZvcm1zIiBhc3NvY2lhdGlvbiBsaW5lLgotCQkJCQlQb2ludCBzdGFydFBvaW50ID0gbmV3IFBvaW50KHggKyByb2xlV2lkdGggKyBsaW5lUGFkZGluZwotCQkJCQkJCS8gMiwgeSArIHJvbGVIZWlnaHQgLyAyKTsKLQkJCQkJUG9pbnQgZW5kUG9pbnQgPSBuZXcgUG9pbnQodGFza1N0YXJ0UG9pbnQueCAtIGxpbmVQYWRkaW5nLAotCQkJCQkJCWJvcmRlckhlaWdodCArICh0YXNrRW5kUG9pbnQueSAtIHRhc2tTdGFydFBvaW50LnkpCi0JCQkJCQkJCQkvIDIpOwotCQkJCQlyZW5kZXJBc3NvY2lhdGlvbigKLQkJCQkJCQlnMmQsCi0JCQkJCQkJc3RhcnRQb2ludCwKLQkJCQkJCQllbmRQb2ludCwKLQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtUGVyZm9ybXNfdGV4dCwgdGV4dEZvbnQsIENvbG9yLkJMQUNLKTsKLQkJCQl9Ci0JCQkJUmVjdGFuZ2xlIHJvbGVJbWFnZVJlY3QgPSBuZXcgUmVjdGFuZ2xlKHgsIHksIHJvbGVXaWR0aCwKLQkJCQkJCXJvbGVIZWlnaHQpOwotCQkJCVRleHR1cmVQYWludCByb2xlUGFpbnQgPSBuZXcgVGV4dHVyZVBhaW50KHJvbGVJbWFnZSwKLQkJCQkJCXJvbGVJbWFnZVJlY3QpOwotCQkJCWcyZC5zZXRQYWludChyb2xlUGFpbnQpOwotCQkJCWcyZC5maWxsKHJvbGVJbWFnZVJlY3QpOwotCQkJCWlmIChyb2xlTmFtZSAhPSBudWxsKSB7Ci0JCQkJCUltYWdlVXRpbC5kcmF3VGV4dChnMmQsIHJvbGVOYW1lLCB0ZXh0Rm9udCwgQ29sb3IuQkxBQ0ssIHggLSB4T2Zmc2V0LAotCQkJCQkJCXkgKyByb2xlSGVpZ2h0LCByb2xlV2lkdGggKyB4U3BhY2luZyk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQotCQkJLy8gQ2FsY3VsYXRlIHRoZSBvcHRpbWFsIHdpZHRoIGFuZCBoZWlnaHQgZm9yIHRoZSByZW5kZXJlZCBpbWFnZS4KLQkJCWludCBvcHRpbWFsV2lkdGggPSBNYXRoLm1heCh0YXNrc0VuZFgsIHdvcmtQcm9kdWN0c0VuZFgpCi0JCQkJCSsgYm9yZGVyV2lkdGg7Ci0JCQlvcHRpbWFsV2lkdGggPSBNYXRoCi0JCQkJCS5tYXgob3B0aW1hbFdpZHRoLCByb2xlRW5kUG9pbnQueCArIGJvcmRlcldpZHRoKTsKLQkJCQotCQkJb3B0aW1hbFdpZHRoID0gTWF0aC5taW4ob3B0aW1hbFdpZHRoLCBtYXhJbWFnZVdpZHRoKTsKLQkJCQotCQkJaW50IG9wdGltYWxIZWlnaHQgPSB3b3JrUHJvZHVjdEVuZFBvaW50LnkgKyBib3JkZXJIZWlnaHQ7Ci0JCQlvcHRpbWFsSGVpZ2h0ID0gTWF0aC5tYXgob3B0aW1hbEhlaWdodCwgcm9sZUVuZFBvaW50LnkKLQkJCQkJKyBib3JkZXJIZWlnaHQpOwotCQkJb3B0aW1hbFdpZHRoICs9IHhPZmZzZXQ7Ci0JCQlvcHRpbWFsSGVpZ2h0ICs9IDIwOwotCQkJCi0JCQlvcHRpbWFsSGVpZ2h0ID0gTWF0aC5taW4ob3B0aW1hbEhlaWdodCwgbWF4SW1hZ2VIZWlnaHQpOwotCQkJQnVmZmVyZWRJbWFnZSBvcHRpbWFsSW1hZ2UgPSBvdXRwdXRJbWFnZS5nZXRTdWJpbWFnZSgwLCAwLAotCQkJCQlvcHRpbWFsV2lkdGgsIG9wdGltYWxIZWlnaHQpOwotCi0JCQkvLyBTYXZlIHRoZSBpbWFnZSBhcyBhIEpQRUcgZmlsZS4KLQkJCUZpbGUganBnRmlsZSA9IG5ldyBGaWxlKHBhdGgsIHJvbGVMYXlvdXQuZ2V0RmlsZVBhdGgoKQotCQkJCQkrIHJvbGVMYXlvdXQuZ2V0RmlsZU5hbWUoIi5qcGciKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgcGFyZW50Rm9sZGVyID0ganBnRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpZiAoIXBhcmVudEZvbGRlci5leGlzdHMoKSkgewotCQkJCXBhcmVudEZvbGRlci5ta2RpcnMoKTsKLQkJCX0KLQkJCUltYWdlSU8ud3JpdGUob3B0aW1hbEltYWdlLCAianBnIiwganBnRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWVsZW1lbnREaWFncmFtLnNldEltYWdlRmlsZU5hbWUoanBnRmlsZS5nZXROYW1lKCkpOwotCQkJcmV0dXJuIGVsZW1lbnREaWFncmFtOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbmRlcnMgdGhlIGFzc29jaWF0aW9uIGxpbmUuCi0JICogCi0JICogQHBhcmFtIGcyZAotCSAqICAgICAgICAgICAgVGhlIEdyYXBoaWNzMkQgY29udGV4dC4KLQkgKiBAcGFyYW0gc3RhcnRQb2ludAotCSAqICAgICAgICAgICAgVGhlIHN0YXJ0IHBvaW50IG9mIHRoZSBsaW5lLgotCSAqIEBwYXJhbSBlbmRQb2ludAotCSAqICAgICAgICAgICAgVGhlIGVuZCBwb2ludCBvZiB0aGUgbGluZS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIGFzc29jaWF0aW9uIG5hbWUuCi0JICogQHBhcmFtIGZvbnQKLQkgKiAgICAgICAgICAgIFRoZSBmb250IGZvciByZW5kZXJpbmcgdGhlIGFzc29jaWF0aW9uIG5hbWUuCi0JICogQHBhcmFtIGNvbG9yCi0JICogICAgICAgICAgICB0aGUgY29sb3IgZm9yIHJlbmRlcmluZyB0aGUgYXNzb2NpYXRpb24gbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW5kZXJBc3NvY2lhdGlvbihHcmFwaGljczJEIGcyZCwgUG9pbnQgc3RhcnRQb2ludCwKLQkJCVBvaW50IGVuZFBvaW50LCBTdHJpbmcgbmFtZSwgRm9udCBmb250LCBDb2xvciBjb2xvcikgewotCQlnMmQuZHJhdyhuZXcgTGluZTJELkRvdWJsZShzdGFydFBvaW50LngsIHN0YXJ0UG9pbnQueSwgZW5kUG9pbnQueCwKLQkJCQllbmRQb2ludC55KSk7Ci0JCWludCB0ZXh0WCA9IHN0YXJ0UG9pbnQueCArIChlbmRQb2ludC54IC0gc3RhcnRQb2ludC54KSAvIDIgLSA0MDsKLQkJaW50IHRleHRZID0gc3RhcnRQb2ludC55ICsgKGVuZFBvaW50LnkgLSBzdGFydFBvaW50LnkpIC8gMiAtIDU7Ci0JCWlmIChzdGFydFBvaW50LnkgIT0gZW5kUG9pbnQueSkgewotCQkJZzJkLnNldENvbG9yKENvbG9yLldISVRFKTsKLQkJCWcyZC5maWxsUmVjdCh0ZXh0WCwgdGV4dFksIDgwLCAxMCk7Ci0JCX0gZWxzZSB7Ci0JCQl0ZXh0WSAtPSAxMDsKLQkJfQotCQlJbWFnZVV0aWwuZHJhd1RleHQoZzJkLCBuYW1lLCBmb250LCBjb2xvciwgdGV4dFgsIHRleHRZLCA4MCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxYmYzMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcm9sZSBhbmQgYWN0aXZpdHkgZGlhZ3JhbXMgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhaXRvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWJzdHJhY3RFbGVtZW50TGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWJzdHJhY3RFbGVtZW50TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNkYzAyODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Fic3RyYWN0RWxlbWVudExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBsYXlvdXQgZm9yIGFsbCBNZXRob2QgRWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaWNuZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWxlbWVudExheW91dCBpbXBsZW1lbnRzIElFbGVtZW50TGF5b3V0IHsKLQotCXByb3RlY3RlZCBFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyOwotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudDsKLQotCXByb3RlY3RlZCBTdHJpbmcgdXJsID0gbnVsbDsKLQotCS8vIGVsZW1lbnQgZWxlbWVudCBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwdWJsaXNoaW5nIHJvb3QKLQlwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnRQYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHRoZSBiYWNrIHVwIHBhdGggdG8gcmVhdGggdGhlIHB1Ymxpc2hpbmcgcm9vdAotCXByb3RlY3RlZCBTdHJpbmcgYmFja1BhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbWFwIG9mIGxheW91dCBmaWxlIHRvIHRoZSBvdXRwdXQgZmlsZSBleHRlbnRpb24sIGlmIHRoZSBlbGVtZW50IGhhcyBtb3JlCi0JLy8gdGhhbiBvbmUgbGF5b3V0IG91dHB1dAotCXByb3RlY3RlZCBMaXN0IGxheW91dHMgPSBudWxsOwotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93RWxlbWVudExpbmsgPSB0cnVlOwotCQotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXB1YmxpYyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQoKSB7Ci0JfQotCi0JLyoqCi0JICogaWYgdGhlIGVsZW1lbnQncyBjb250ZW50IGlzIHRhcmdldCBmb3IgYW5vdGhlciBlbGVtZW50LCBzZXQgaXQgaGVyZS4gZm9yCi0JICogZXhhbXBsZSwgc3RlcCBjb250ZW50IGNhdCB0YXJnZXQgZm9yIGEgVGFzayBvciBhIHRhc2sgZGVzY3JpcHRvcgotCSAqIGNvcHlyaWdodCBjb250ZW50IGNhbiB0YXJnZXQgdG8gZGlmZmVyZW50IGVsZW1lbnRzLgotCSAqIAotCSAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgaXMgdGhhdCB0aGUgc3lzdGVtIHdpbGwgZml4IHRoZSBsaW5rcyBpbiB0aGUgY29udGVudAotCSAqIHRvIHJlbGF0aXZlIHRvIHRoZSB0YXJnZXQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50VGFyZ2V0KE1ldGhvZEVsZW1lbnQgdGFyZ2V0RWxlbWVudCkgewotCQl0aGlzLnRhcmdldEVsZW1lbnQgPSB0YXJnZXRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIG5lZWQgdG8gc2V0IHRoZSBvd25lciBvZiB0aGUgY3VycmVudCBsYXlvdXQgZWxlbWVudC4gSW4gbW9zdCBjYXNlcyB0aGlzCi0JICogc2hvdWxkIGJlIHRoZSBlQ29udGFpbmVyIG9mIHRoZSBlbGVtZW50LiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGluIHNvbWUKLQkgKiBzaXR1YXRpb24gdGhlIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBvd25lciB3aGVuIHRoZSBvYmplY3QgaXMgY3JlYXRlZC4KLQkgKiBGb3IgZXhhbXBsZSwgdGhlIENvbnRlbnREZXNjcmlwdGlvbiBvYmplY3QncyBlQ29udGluZXIgaXMgbnVsbCBpZiB0aGUKLQkgKiBjb250ZW50IGZpbGUgaXMgbm90IHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRPd25lcihNZXRob2RFbGVtZW50IG93bmVyKSB7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gb3duZXI7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG93RWxlbWVudExpbmsoYm9vbGVhbiBzaG93KSB7Ci0JCXRoaXMuc2hvd0VsZW1lbnRMaW5rID0gc2hvdzsKLQl9Ci0JCi0JLyoqCi0JICogaW5pdGlhbGl6ZSB0aGUgbGF5b3V0IHdpdGggdGhlIGVsZW1lbnQgbGF5b3V0IG1hbmFnZXIgYW5kIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBsYXlvdXRNYW5hZ2VyIEVsZW1lbnRMYXlvdXRNYW5hZ2VyCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBfX2luaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmxheW91dE1hbmFnZXIgPSBsYXlvdXRNYW5hZ2VyOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQlpZiAoIUNvbmZpZ3VyYXRpb25IZWxwZXIuaXNEZXNjcmlwdGlvbkVsZW1lbnQoZWxlbWVudCkpIHsKLQkJCWlmICggIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgKSB7Ci0JCQkJLy8gbWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIGxvYWRlZCB3aXRoIHRoZSBjb3JyZWN0IGNvbnRhaW5lcgotCQkJCS8vIG90aGVyd2lzZSB0aGUgIGVsZW1lbnQgbWF5IG5vdCBoYXZlIGEgdmFsaWQgY29udGFpbmVyCi0JCQkJLy8gYW5kIHRodXMgdGhlIGVsZW1lbnQgY29udGVudCBwYXRoIGNhbid0IGJlIGRldGVybWluZWQKLQkJCQkvLyB0aGlzIGlzIGp1c3QgYSB3b3JrYXJvdW5kLiBzaG91bGQgd2UgaGF2ZSBhIGJldHRlciB3YXkgdG8gbWFrZSBzdXJlIHRoZSBlbGVtZW50cyBhcmUgbG9hZGVkIGNvcnJlY3RseT8/Pz8/Pz8/Pz8/Ci0JCQkJLy8gMTYwNDQxIC0gTWlzc2luZyB0ZW1wbGF0ZSBmaWxlcyB3aGVuIHB1Ymxpc2ggY29uZmlndXJhdGlvbgotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCQkJaWYgKCBwbHVnaW4gPT0gbnVsbCB8fCBwbHVnaW4uZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJCi0JCQkJCS8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaW4gcHVibGlzaGluZyBtb2RlIHNpbmNlIHRoZSB3aG9sZSBsaWJyYXJ5IGlzIGFscmVhZHkgbG9hZGVkCi0JCQkJCWlmICggZGVidWcgJiYgZ2V0TGF5b3V0TWdyKCkuaXNQdWJsaXNoaW5nTW9kZSgpICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogRWxlbWVudCB3aXRob3V0IGEgdmFsaWQgY29udGFpbmVyOiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCQkJfSAKLQkJCX0KLQkJCWJ1aWxkUGF0aCgpOwotCQkJdGhpcy51cmwgPSBlbGVtZW50UGF0aCArIGdldEZpbGVOYW1lKFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUwpOwotCQl9Ci0JCQotCQkvLyB0aGlzIGlzIGEgd29ya2Fyb3VuZC4gCi0JCS8vIHdlIG5lZWQgdG8gcGFzcyBwYXJhbWV0ZXJzIGluIHRoZSBmaWxlIHVybCwgCi0JCS8vIGhvd2V2ZXIsIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGUgcGFyYW1ldGVycyBpcyBub3QgcGFzc2VkIG92ZXIgaW4gYnJvd3NpbmcKLQkJLy8gc28gY3JlYXRlIGEgZHVtbXkgZmlsZQotCQlpZiAoIXRoaXMubGF5b3V0TWFuYWdlci5pc1B1Ymxpc2hpbmdNb2RlKCkgJiYgISgKLQkJCQkJZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiAKLQkJCQl8fCBlbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbgotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSApCi0JCXsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGh0bWxfZmlsZSA9IHRoaXMubGF5b3V0TWFuYWdlci5nZXRQdWJsaXNoRGlyKCkgKyB0aGlzLmdldEZpbGVQYXRoKCkgKyBnZXRGaWxlTmFtZShSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsKLQkJCQlGaWxlIGYgPSBuZXcgRmlsZShodG1sX2ZpbGUpOwotCQkJCWlmICggIWYuZXhpc3RzKCkgKQotCQkJCXsKLQkJCQkJZi5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJCWYuY3JlYXRlTmV3RmlsZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldExheW91dEluZm8oTGF5b3V0SW5mbyBpbmZvKSB7Ci0JCWlmIChsYXlvdXRzID09IG51bGwpIHsKLQkJCWxheW91dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJbGF5b3V0cy5hZGQoaW5mbyk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIGEgbGlzdCBvZiBMYXlvdXRJbmZvIG9iamVjdHMKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBMYXlvdXRJbmZvIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMYXlvdXRzKCkgewotCQlyZXR1cm4gbGF5b3V0czsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRMYXlvdXRNZ3IoKQotCSAqLwotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNZ3IoKSB7Ci0JCXJldHVybiB0aGlzLmxheW91dE1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0RWxlbWVudCgpCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0VHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldERpc3BsYXlOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQkvKgotCQkgKiBTdHJpbmcgbmFtZSA9IG51bGw7IGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsgbmFtZSA9Ci0JCSAqICgoQ29udGVudEVsZW1lbnQpZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOyB9IGlmIChuYW1lID09IG51bGwgfHwKLQkJICogbmFtZS5sZW5ndGgoKSA9PSAwKSB7IG5hbWUgPSB0aGlzLmdldE5hbWUoKTsgfSByZXR1cm4gbmFtZTsKLQkJICovCi0KLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0R3VpZCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFVybCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0QmFja1BhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja1BhdGgoKSB7Ci0JCXJldHVybiBiYWNrUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRGaWxlUGF0aCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRQYXRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byBhbm90aGVyIGVsZW1lbnQuIFRoaXMgaXMgdGhlCi0JICogcmVsYXRpdmVUby5iYWNrcGF0aCArIHRoaXMuZWxlbWVudHBhdGguCi0JICoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRGaWxlUGF0aChJRWxlbWVudExheW91dCkKLQkgKi8KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoSUVsZW1lbnRMYXlvdXQgcmVsYXRpdmVUbykgewotCQlyZXR1cm4gcmVsYXRpdmVUby5nZXRCYWNrUGF0aCgpICsgdGhpcy5nZXRGaWxlUGF0aCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgbmFtZSB3aXRoIHRoZSBnaXZlbiBleHRlbnNpb24uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0RmlsZU5hbWUoU3RyaW5nKQotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZShTdHJpbmcgZXh0KSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5nZXRGaWxlTmFtZShlbGVtZW50LCBleHQpOwotCX0KLQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYc2xVcmwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WHNsVXJsKCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gTGF5b3V0UmVzb3VyY2VzLmdldFhzbFVyaShnZXRUeXBlKCkudG9Mb3dlckNhc2UoKSwKLQkJCQkJImNvbnRlbnRlbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBMYXlvdXRSZXNvdXJjZXMuZ2V0WHNsVXJpKGdldFR5cGUoKS50b0xvd2VyQ2FzZSgpLCBudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFBhdGgoKSB7Ci0JCS8vIHRoaXMgaXMgPHBsdWdpbj4vPGVsZW1lbnQgdHlwZT4vCi0JCWVsZW1lbnRQYXRoID0gIiI7Ci0JCWJhY2tQYXRoID0gIi4vIjsKLQkJaWYgKCAhKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSApCi0JCXsKLQkJCWVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbWVudCkucmVwbGFjZSgKLQkJCQkJRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQkJYmFja1BhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRCYWNrUGF0aChlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBodG1sIGNvbnRlbnQgZ2VuZXJhdGVkIGZyb20gdGhpcyB4c2wgZmlsZSBuZWVkcyB0byBiZSBzY2FubmVkIG9yIG5vdAotCSAqIHNjYW4gdGhlIGNvbnRlbnQgaXMgZm9yIGlkZW50aWZ5aW5nIGVsZW1lbnQgcmVmZXJlbmNlcyBpbiB0aGUgY29udGVudCBhbmQgY29weSBvdmVyIHJlc291cmNlIGZpbGVzCi0JICogaW4gc29tZSBjYXNlcyB3ZSBkb24ndCBuZWVkIHRvIHNjYW4gdGhlIGNvbnRlbnQsIGZvciBleGFtcGxlLCB0aGUgYWN0aXZpdHkgYnJlYWtkb3duIHN0cnVjdHVyZQotCSAqIAotCSAqIEBwYXJhbSB4c2xVcmwgdGhlIHhzbCB0aGF0IGh0bWwgaXMgZ2VuZXJhdGVkIGZyb20sIG51bGwgZm9yIHRoZSBkZWZhdWx0IHhzbCBsYXlvdXQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuZWVkQ29udGVudFNjYW4oU3RyaW5nIHhzbFVybCkKLQl7Ci0JCS8vIGJ5IGRlZmF1bHQgYWxsIGNvbnRlbnRzIGFyZSBzY2FubmVkCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGxheW91dCBmb3IgYSBjaGlsZCBlbGVtZW50IG9mIHRoaXMgZWxlbWVudAotCSAqIEFjdGl2aXR5RWxlbWVudExheW91dCBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGxheW91dCB3aXRoIG5vZGUgcGF0aAotCSAqIEBwYXJhbSBjaGlsZAotCSAqIEByZXR1cm4gSUVsZW1lbnRMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgSUVsZW1lbnRMYXlvdXQgZ2V0Q2hpbGRMYXlvdXQoTWV0aG9kRWxlbWVudCBjaGlsZCkKLQl7Ci0JCXJldHVybiBsYXlvdXRNYW5hZ2VyLmdldExheW91dChjaGlsZCwgdHJ1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NDaGlsZChPYmplY3QgZmVhdHVyZSwgWG1sRWxlbWVudCBwYXJlbnQsIE1ldGhvZEVsZW1lbnQgZSwKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJSUVsZW1lbnRMYXlvdXQgbCA9IGdldENoaWxkTGF5b3V0KGUpOwotCQkJaWYgKGwgIT0gbnVsbCkgewotCQkJCS8vIGRvbid0IGluY2x1ZGUgdGhlIHJlZmVyZW5jZXMgb2YgdGhlIHJlZmVyZWNlZCBlbGVtZW50cywKLQkJCQkvLyBvdGhlcndpc2UsIG1heSBjYXVzZSBkZWFkbG9jawotCQkJCWJvb2xlYW4gaXNDb250ZW50ID0gKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQkJCQkJJiYgQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJCQkuaXNEZXNjcmlwdGlvbkVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIGUpOwotCQkJCWlmIChpc0NvbnRlbnQpIHsKLQkJCQkJaWYgKHRhcmdldEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJbC5zZXRDb250ZW50VGFyZ2V0KHRhcmdldEVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJCWwuc2V0RWxlbWVudE93bmVyKGVsZW1lbnQpOwotCQkJCX0KLQkJCQlwYXJlbnQuYWRkQ2hpbGQobC5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ2hpbGQoT2JqZWN0IGZlYXR1cmUsIFhtbEVsZW1lbnQgcGFyZW50LCBMaXN0IGl0ZW1zLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gaXQubmV4dCgpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIGU7Ci0JCQkJCWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KG1lLAotCQkJCQkJCWxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCQkJSUVsZW1lbnRMYXlvdXQgbCA9IGdldENoaWxkTGF5b3V0KG1lKTsKLQkJCQkJCWlmIChsICE9IG51bGwpIHsJCQkJCQkJCi0JCQkJCQkJLy8gZG9uJ3QgaW5jbHVkZSB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgcmVmZXJlY2VkCi0JCQkJCQkJLy8gZWxlbWVudHMsIG90aGVyd2lzZSwgbWF5IGNhdXNlIGRlYWRsb2NrCi0JCQkJCQkJcGFyZW50LmFkZENoaWxkKGwuZ2V0WG1sRWxlbWVudChDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkJCQkuaXNEZXNjcmlwdGlvbkVsZW1lbnQobWUpID8gdHJ1ZQotCQkJCQkJCQkJOiBpbmNsdWRlUmVmZXJlbmNlcykpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSB0by1tYW55IHJlZmVyZW5jZXMKLQkgKiBAcGFyYW0gZWxlbWVudFhtbCBYbWxFbGVtZW50Ci0JICogQHBhcmFtIGluY2x1ZGVSZWZlcmVuY2VzIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjYWxjdWxhdGUwblJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQkvLyByZWZlcmVuY2VNYXAuY2xlYXIoKTsKLQotCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgYWxsIHN0cmluZyB0eXBlIGF0dHJpYnV0ZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcwotCQkJCQkJLmdldChpKTsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlsb2FkRmVhdHVyZShmZWF0dXJlLCBlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudCgpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gbmV3IFhtbEVsZW1lbnQoIkVsZW1lbnQiKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiSWQiLCBnZXRJZCgpKSAvLyROT04tTkxTLTEkCQotCQkJCS5zZXRBdHRyaWJ1dGUoIlR5cGUiLCBnZXRUeXBlKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJUeXBlTmFtZSIsIFRuZ1V0aWwuZ2V0VHlwZVRleHQoZWxlbWVudCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJOYW1lIiwgZ2V0TmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiQmFja1BhdGgiLCBnZXRCYWNrUGF0aCgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiU2hhcGVpY29uVXJsIiwgZ2V0U2hhcGVpY29uVXJsKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJEaXNwbGF5TmFtZSIsIGdldERpc3BsYXlOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKCBzaG93RWxlbWVudExpbmsgKSB7Ci0JCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiVXJsIiwgZ2V0VXJsKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gCi0JCQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQkvKioKLQkgKiBsb2FkIHRoZSBhdHRyaWJ1dGVzCi0JICogQHBhcmFtIGVsZW1lbnRYbWwgWG1sRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRBdHRyaWJ1dGVzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCkgewotCi0JCWJvb2xlYW4gaXNBY3Rpdml0eUF0dHJpYnV0ZSA9IChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIAotCQkJfHwgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIAotCQkJCSYmIChlbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IG93bmVyRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KTsKLQkJCi0JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCS8vIGdldCBhbGwgc3RyaW5nIHR5cGUgYXR0cmlidXRlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHAgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0aWVzLmdldChpKTsJCQkKLQkJCQlpZiAoIShwIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKXA7Ci0JCQkJU3RyaW5nIG5hbWUgPSBwLmdldE5hbWUoKTsKLQkJCQkJCQkJCQotCQkJCU9iamVjdCB2YWx1ZTsKLQkJCQlpZiAobmFtZS5lcXVhbHMoInByZXNlbnRhdGlvbk5hbWUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJLy8gdmFsdWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCQkJCXZhbHVlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQsCi0JCQkJCQkJbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCX0gZWxzZSBpZiggaXNBY3Rpdml0eUF0dHJpYnV0ZSAmJiBTdHJpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhdHRyaWIuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkpKSB7Ci0JCQkJCQotCQkJCQkvLyBmb3IgYWN0aXZpdHksIHRoZSB3YXkgdG8gbWVyZ2UgYXR0cmlidXRlIGZyb20gYmFzZSBpcyBkaWZmZXJlbnQKLQkJCQkJdmFsdWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldEFjdGl2aXR5U3RyaW5nQXR0cmlidXRlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgYXR0cmliLCBnZXRMYXlvdXRNZ3IoKS5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gZ2V0QXR0cmlidXRlRmVhdHVyZVZhbHVlKHApOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBlc2NhcGUgQnJpZWYgRGVzY3JpcHRpb24gaW50byBIVE1MIGVudGl0aWVzCi0JCQkJaWYgKG5hbWUuZXF1YWxzKCJicmllZkRlc2NyaXB0aW9uIikgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlNdWx0aUZpbGVYTUlTYXZlSW1wbC5NeUVzY2FwZSBteUVzY2FwZSA9IG5ldyBNdWx0aUZpbGVYTUlTYXZlSW1wbC5NeUVzY2FwZSgpOwotCQkJCQl2YWx1ZSA9IFN0clV0aWwuY29udmVydE5ld2xpbmVzVG9IVE1MKChTdHJpbmcpdmFsdWUpOwotCQkJCQl2YWx1ZSA9IG15RXNjYXBlLmNvbnZlcnQoKFN0cmluZyl2YWx1ZSk7Ci0JCQkJfQotCi0JCQkJZWxlbWVudFhtbAotCQkJCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKS5zZXRWYWx1ZSgodmFsdWUgPT0gbnVsbCkgPyAiIiA6IHZhbHVlLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBhdHRyaWJ1dGUgZmVhdHVyZSB2YWx1ZSBhbmQgbWVyZ2UgdGhlIHRleHQsIGZpeCB1cmwgcmVmZXJuZWNlcywgZXRjLgotCSAqIEBwYXJhbSBmZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJT2JqZWN0IHZhbHVlID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsCi0JCQkJb3duZXJFbGVtZW50LCBmZWF0dXJlLCBsYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0KLQkJLy8gbm93IGlmIHRoZSB0YXJnZXQgaXMgc2V0IGFuZCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZWxlbWVudCBvciB0aGUKLQkJLy8gZWxlbWVudCdzIG93bmVyCi0JCS8vIHRoZW4gZml4IHRoZSBjb250ZW50Ci0JCWlmICgodGFyZ2V0RWxlbWVudCAhPSBudWxsKSAmJiAodmFsdWUgIT0gbnVsbCkKLQkJCQkmJiAodmFsdWUudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApKSB7Ci0JCQlTdHJpbmcgY29udGVudFBhdGggPSBSZXNvdXJjZUhlbHBlcgotCQkJCQkuZ2V0RWxlbWVudFBhdGgoKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pID8gCi0JCQkJCQkJKChvd25lckVsZW1lbnQ9PW51bGwpID8gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQuZUNvbnRhaW5lcigpIDogb3duZXJFbGVtZW50KSAKLQkJCQkJCQk6IGVsZW1lbnQpOwotCi0JCQlTdHJpbmcgYmFja1BhdGggPSBSZXNvdXJjZUhlbHBlcgotCQkJCQkuZ2V0QmFja1BhdGgoKHRhcmdldEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pID8gKE1ldGhvZEVsZW1lbnQpIHRhcmdldEVsZW1lbnQKLQkJCQkJCQkuZUNvbnRhaW5lcigpCi0JCQkJCQkJOiB0YXJnZXRFbGVtZW50KTsKLQotCQkJdmFsdWUgPSBSZXNvdXJjZUhlbHBlci5maXhDb250ZW50VXJsUGF0aCh2YWx1ZS50b1N0cmluZygpLAotCQkJCQljb250ZW50UGF0aCwgYmFja1BhdGgpOwotCi0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogbG9hZCB0aGUgY29weXJpZ2h0IHRleHQKLQkgKiBAcGFyYW0gZWxlbWVudFhtbCBYbWxFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgbG9hZENvcHlyaWdodChYbWxFbGVtZW50IGVsZW1lbnRYbWwpIHsKLQotCQkvLyBMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBDb25maWd1cmF0aW9uSGVscGVyLmNhbGN1bGF0ZUNvcHlyaWdodChlbGVtZW50LAotCQkvLyBsYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSwgaXRlbXMpOwotCQkvLyBpZiAoIGl0ZW1zLnNpemUoKSA+IDAgKQotCQkvLyB7Ci0JCS8vIFN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHQ7Ci0JCS8vIFN0cmluZ0J1ZmZlciBjb3B5cmlnaHRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyBmb3IgKCBJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotCQkvLyB7Ci0JCS8vIGNvcHlyaWdodCA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0Lm5leHQoKTsKLQkJLy8gU3RyaW5nIHN0YXRlbWVudCA9IGNvcHlyaWdodC5nZXRQcmVzZW50YXRpb24oKS5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJLy8JCQkJCQkJCi0JCS8vIC8vIG5lZWQgdG8gZml4IHRoZSBjb250ZW50IGZvciByZWxhdGl2ZSBsaW5rcy4KLQkJLy8gLy8gc2luY2UgdGhlIGxpbmsgaXMgYSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBTdXBwb3J0aW5nTWF0ZXJpYWwKLQkJLy8gbG9jYXRpb24sCi0JCS8vIC8vIG5lZWQgdG8gY29udmVydCB0byByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBlbGVtZW50Ci0JCS8vIC8vIHNvIHJlLWNhbGN1YXRlIHRoZSBiYWNrIHBhdGgKLQkJLy8gLy8ganhpLCAwNi8yOC8wNQotCQkvLyBTdHJpbmcgY29udGVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChjb3B5cmlnaHQpOwotCQkvLyBTdHJpbmcgYmFja1BhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRCYWNrUGF0aChlbGVtZW50KTsKLQkJLy8gc3RhdGVtZW50ID0gUmVzb3VyY2VIZWxwZXIuZml4Q29udGVudFVybFBhdGgoc3RhdGVtZW50LCBjb250ZW50UGF0aCwKLQkJLy8gYmFja1BhdGgpOwotCQkvLyBjb3B5cmlnaHRzLmFwcGVuZChzdGF0ZW1lbnQpOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIGVsZW1lbnRYbWwubmV3Q2hpbGQoImNvcHlyaWdodCIpLnNldFZhbHVlKGNvcHlyaWdodHMudG9TdHJpbmcoKSk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gfQotCi0JCVN0cmluZyBjb3B5cmlnaHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvcHlyaWdodFRleHQoZWxlbWVudCwKLQkJCQlsYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCWlmIChjb3B5cmlnaHQgIT0gbnVsbCAmJiBjb3B5cmlnaHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQllbGVtZW50WG1sLm5ld0NoaWxkKCJjb3B5cmlnaHQiKS5zZXRWYWx1ZShjb3B5cmlnaHQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHRvLW9uZSByZWZlcmVuY2UKLQkgKiBAcGFyYW0gZWxlbWVudFhtbCBYbWxFbGVtZW50Ci0JICogQHBhcmFtIGluY2x1ZGVSZWZlcmVuY2VzIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjYWxjdWxhdGUwMVJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgZWxlbWVudCByZWZlcmVuY2VzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgcCA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnRpZXMuZ2V0KGkpOwotCi0JCQkJLy8gT2JqZWN0IHZhbHVlID0gZWxlbWVudC5nZXQoaSk7Ci0KLQkJCQlFQ2xhc3NpZmllciB0eXBlID0gcC5nZXRFVHlwZSgpOwotCQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBFQ2xhc3MpIHx8IHAuaXNNYW55KCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJbG9hZEZlYXR1cmUocCwgZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogbG9hZCB0aGUgbm9uLWF0dHJpYnV0ZSBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gZWxlbWVudFhtbAotCSAqIEBwYXJhbSBpbmNsdWRlUmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBYbWxFbGVtZW50IGVsZW1lbnRYbWwsCi0JCQlib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCWlmICghKGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVDbGFzcykpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gZmVhdHVyZS5nZXROYW1lKCk7Ci0KLQkJaWYgKCFmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZShlbGVtZW50LCBvd25lckVsZW1lbnQsCi0JCQkJCWZlYXR1cmUsIGxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJLy8gQnJvd3Npbmcgc3RvcHMgd29ya2luZyB3aGVuIGEgcm9sZSBpcyBzZXQgdG8KLQkJCS8vIHJlcGxhY2VkIGFub3RoZXIgcm9sZQotCQkJLy8gZm9yIHJlcGxhY2VyLCB0aGUgYmFzZSB3aWxsIGJlIGV2YWx1YXRlZCB0byB0aGUgcmVwbGFjZXIKLQkJCS8vIGFuZCBjYXVzaW5nIGRlYWRsb2NrCi0JCQlpZiAoZSAhPSBudWxsICYmIGUgIT0gZWxlbWVudCkgewotCQkJCWJvb2xlYW4gc2hvd0RldGFpbCA9IChDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkuaXNEZXNjcmlwdGlvbkVsZW1lbnQoZSkKLQkJCQkvKgotCQkJCSAqIHx8IChwID09Ci0JCQkJICogVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKSkKLQkJCQkgKi8pID8gdHJ1ZSA6IGluY2x1ZGVSZWZlcmVuY2VzOwotCQkJCQotCQkJCWlmICggYWNjZXB0RmVhdHVyZVZhbHVlKGZlYXR1cmUsIGUpICkgewotCQkJCQlwcm9jZXNzQ2hpbGQoZmVhdHVyZSwgCi0JCQkJCQkJZWxlbWVudFhtbAotCQkJCQkJCQkJLm5ld0NoaWxkKCJyZWZlcmVuY2UiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKSwgZSwgc2hvd0RldGFpbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlMaXN0IHB2ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWlmICggYWNjZXB0RmVhdHVyZVZhbHVlKGZlYXR1cmUsIHB2KSApIHsKLQkJCQlhZGRSZWZlcmVuY2VzKGZlYXR1cmUsIGVsZW1lbnRYbWwsIG5hbWUsIHB2KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGxvYWQgdGhlIG5vbi1hdHRyaWJ1dGUgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGVsZW1lbnRYbWwKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRmVhdHVyZShPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgWG1sRWxlbWVudCBlbGVtZW50WG1sLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOwotCi0JCWlmICghZmVhdHVyZS5pc01hbnkoKSkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQkJZmVhdHVyZSwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkvLyBCcm93c2luZyBzdG9wcyB3b3JraW5nIHdoZW4gYSByb2xlIGlzIHNldCB0bwotCQkJLy8gcmVwbGFjZWQgYW5vdGhlciByb2xlCi0JCQkvLyBmb3IgcmVwbGFjZXIsIHRoZSBiYXNlIHdpbGwgYmUgZXZhbHVhdGVkIHRvIHRoZSByZXBsYWNlcgotCQkJLy8gYW5kIGNhdXNpbmcgZGVhZGxvY2sKLQkJCWlmIChlICE9IG51bGwgJiYgZSAhPSBlbGVtZW50KSB7Ci0JCQkJYm9vbGVhbiBzaG93RGV0YWlsID0gKENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCS5pc0Rlc2NyaXB0aW9uRWxlbWVudChlKQotCQkJCS8qCi0JCQkJICogfHwgKHAgPT0KLQkJCQkgKiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpKQotCQkJCSAqLykgPyB0cnVlIDogaW5jbHVkZVJlZmVyZW5jZXM7Ci0KLQkJCQlpZiAoIGFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCBlKSApCi0JCQkJewotCQkJCQlwcm9jZXNzQ2hpbGQoZmVhdHVyZSwgCi0JCQkJCQkJZWxlbWVudFhtbAotCQkJCQkJCQkJLm5ld0NoaWxkKCJyZWZlcmVuY2UiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKSwgZSwgc2hvd0RldGFpbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlMaXN0IHB2ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlpZiAoIGFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCBwdikgJiYgcHYuc2l6ZSgpID4gMCkgewotCQkJCWFkZFJlZmVyZW5jZXMoZmVhdHVyZSwgZWxlbWVudFhtbCwgbmFtZSwgcHYpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogbG9hZCByZWZlcmVuY2VzIGZvciB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50WG1sIFhtbEVsZW1lbnQKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRSZWZlcmVuY2VzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnRpZXMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJaWYgKGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJCQlsb2FkRmVhdHVyZShmZWF0dXJlLCBlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlDb2xsZWN0aW9uIG9wcG9zaXRlUHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3QoZWxlbWVudC5nZXRPcHBvc2l0ZUZlYXR1cmVzKCkpOwotCQlmb3IgKEl0ZXJhdG9yIHo9IG9wcG9zaXRlUHJvcGVydGllcy5pdGVyYXRvcigpOyB6Lmhhc05leHQoKTsgKQotCQl7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSAoT3Bwb3NpdGVGZWF0dXJlKSB6Lm5leHQoKTsKLQkJCWxvYWRGZWF0dXJlKG9mZWF0dXJlLCBlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhZGQgdGhlIHJlZmVyZW5jZSBsYXlvdXQgdG8gdGhlIHJlc3VsdAotCSAqIEBwYXJhbSBmZWF0dXJlIE9iamVjdAotCSAqIEBwYXJhbSBlbGVtZW50WG1sIFhtbEVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmZXJlbmNlTmFtZSBTdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlKE9iamVjdCBmZWF0dXJlLCBYbWxFbGVtZW50IGVsZW1lbnRYbWwsIFN0cmluZyByZWZlcmVuY2VOYW1lLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXByb2Nlc3NDaGlsZChmZWF0dXJlLCAKLQkJCQllbGVtZW50WG1sCi0JCQkJCQkubmV3Q2hpbGQoInJlZmVyZW5jZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIHJlZmVyZW5jZU5hbWUpLCBlbGVtZW50LCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGFkZCByZWZlcmVuY2VzIHRvIHRoZSBsYXlvdXQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBlbGVtZW50WG1sCi0JICogQHBhcmFtIHJlZmVyZW5jZU5hbWUKLQkgKiBAcGFyYW0gaXRlbXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2VzKE9iamVjdCBmZWF0dXJlLCBYbWxFbGVtZW50IGVsZW1lbnRYbWwsIFN0cmluZyByZWZlcmVuY2VOYW1lLAotCQkJTGlzdCBpdGVtcykgewotCQlwcm9jZXNzQ2hpbGQoZmVhdHVyZSwgCi0JCQkJZWxlbWVudFhtbAotCQkJCQkJLm5ld0NoaWxkKCJyZWZlcmVuY2VMaXN0Iikuc2V0QXR0cmlidXRlKCJuYW1lIiwgcmVmZXJlbmNlTmFtZSksIGl0ZW1zLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gZ2V0WG1sRWxlbWVudCgpOwotCi0JCS8vIGxvYWQgdGhlIHJlZmVyZW5jZXMKLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0KLQkJCS8vIGxvYWQgdGhlIGNvcHlyaWdodCBpbmZvCi0JCQlsb2FkQ29weXJpZ2h0KGVsZW1lbnRYbWwpOwotCi0JCQkvLyBsb2FkIHRoZSBhdHRyaWJ1dGVzCi0JCQlsb2FkQXR0cmlidXRlcyhlbGVtZW50WG1sKTsKLQotCQkJbG9hZFJlZmVyZW5jZXMoZWxlbWVudFhtbCwgZmFsc2UpOwotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0JLyoqCi0JICogc29tZSBsYXlvdXQgbmVlZCB0byBoYXZlIHRoZSBmZWF0dXJlIHZhbHVlcyBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiBTbwotCSAqIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBmZWF0dXJlIGlzIGNhbGN1bGF0ZWQgaW4gdGhpcyBhYnN0cmFjdAotCSAqIGNsYXNzCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGZWF0dXJlVmFsdWUoT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuRGVzY3JpYmFibGVFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMpIHsKLQkJCWlmICggdmFsdWUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSApIHsKLQkJCQlyZXR1cm4gZ2V0UHVibGlzaENhdGVnb3J5UHJvcGVydHkoKE1ldGhvZEVsZW1lbnQpdmFsdWUpOwotCQkJfSBlbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJTGlzdCBpdGVtcyA9IChMaXN0KXZhbHVlOwotCQkJCWludCBpID0gMDsKLQkJCQl3aGlsZSAoIGkgPCBpdGVtcy5zaXplKCkgKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0ZW1zLmdldChpKTsKLQkJCQkJaWYgKCAhZ2V0UHVibGlzaENhdGVnb3J5UHJvcGVydHkoZSkgKSB7Ci0JCQkJCQlpdGVtcy5yZW1vdmUoaSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpKys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGdldFB1Ymxpc2hDYXRlZ29yeVByb3BlcnR5KE1ldGhvZEVsZW1lbnQgZSkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IFRuZ1V0aWwuZ2V0UHVibGlzaENhdGVnb3J5UHJvcGVydHkoZSk7Ci0JCWlmICggcHJvcCA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlTdHJpbmcgdiA9IHByb3AuZ2V0VmFsdWUoKTsKLQkJaWYgKCB2ID09IG51bGwgfHwgIXYudG9TdHJpbmcoKS5lcXVhbHMoInRydWUiKSApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0U2hhcGVpY29uVXJsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNoYXBlaWNvblVybCgpIHsKLQkJVVJJIHVyaSA9IG51bGw7Ci0JCVN0cmluZyBpbWFnZVVybDsKLQkJLy8gU3RyaW5nIGltYWdlRmlsZTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCXVyaSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KS5nZXRTaGFwZWljb24oKTsKLQkJfQotCi0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJaW1hZ2VVcmwgPSBnZXREZWZhdWx0U2hhcGVpY29uVXJsKCk7Ci0JCX0gZWxzZSB7Ci0JCQlVUkkgaW1hZ2VVcmkgPSBSZXNvdXJjZUhlbHBlci5nZXRSZWxhdGl2ZVVSSSh1cmksIG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlCi0JCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKS50b1VSSSgpKTsKLQkJCWltYWdlVXJsID0gTmV0VXRpbC5kZWNvZGVkRmlsZVVybChpbWFnZVVyaS50b1N0cmluZygpKTsKLQkJfQotCi0JCS8vIG5lZWQgdG8gY29weSB0aGUgaW1hZ2UgZmlsZSBpZiBpdCdzIG5vdCBpbiB0aGUgZGVmYXVsdCBkaXJlY3RvcnkKLQkJaWYgKCFpbWFnZVVybC5zdGFydHNXaXRoKCJpbWFnZXMvIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkKLQkJCS8vIEZyb20gRVBGIDEuMiwgc2hhcGVJY29uL25vZGVJY29uIHN0b3JlcyB1cmkgcmVsYXRpdmUgdG8gcGx1Z2luIHBhdGguIAotCQkJLy8gQmVsb3cgc2VjdGlvbiBvZiBjb2RlIGlzIG5lY2Vzc2FyeSB0byBhcHBlbmQgcGx1Z2luIG5hbWUgdG8gc2hhcGVJY29uL25vZGVJY29uIHVyaS4KLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJCWlmKHBsdWdpbiAhPSBudWxsKXsKLQkJCQlpZihpbWFnZVVybC5pbmRleE9mKHBsdWdpbi5nZXROYW1lKCkpIDwgMCl7Ci0JCQkJCVN0cmluZyBwbHVnaW5QYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0UGx1Z2luUGF0aChlbGVtZW50LCAKLQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKTsKLQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGx1Z2luUGF0aCArIEZpbGUuc2VwYXJhdG9yKyBpbWFnZVVybCk7Ci0JCQkJCWltYWdlVXJsID0gTmV0VXRpbC5lbmNvZGVGaWxlVVJMKEZpbGVVdGlsLmdldFJlbGF0aXZlUGF0aChmaWxlLCAKLQkJCQkJCQluZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKSkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJRmlsZSBzb3VyY2UgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSwgaW1hZ2VVcmwpOwotCQkJRmlsZSBkZXN0ID0gbmV3IEZpbGUoZ2V0TGF5b3V0TWdyKCkuZ2V0UHVibGlzaERpcigpLCBpbWFnZVVybCk7Ci0JCQlSZXNvdXJjZUhlbHBlci5jb3B5RmlsZShzb3VyY2UsIGRlc3QpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlVXJsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldE5vZGVpY29uVXJsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVpY29uVXJsKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTaGFwZWljb25VcmwoKSB7Ci0JCXJldHVybiBMYXlvdXRSZXNvdXJjZXMuZ2V0RGVmYXVsdFNoYXBlaWNvblVybChlbGVtZW50LmdldFR5cGUoKQotCQkJCS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0RGlhZ3JhbWljb25VcmwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlhZ3JhbWljb25VcmwoKSB7Ci0JCXJldHVybiAiaWNvbnMvIiArIGVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSArICIuZ2lmIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogdGhpcyBpcyBhIHNoYXJlZCBtZXRob2QgdG8gbG9hZCB0aGUgd29yayBvcmRlciBvZiB0aGUgd29yayBicmVha2Rvd24KLQkgKiBlbGVtZW50LiB3aWxsIGJlIHVzZWQgYnkgYWxsIHdvcmsgYnJlYWtkb3duIGVsZW1udCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRYbWwKLQkgKiAgICAgICAgICAgIFhtbEVsZW1lbnQgdGhlIHBhcmVudCB4bWwgZWxlbWVudCB0byBsb2FkIHRoZSB3b3JrIG9yZGVyCi0JICogICAgICAgICAgICBsYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkV29ya09yZGVyKFhtbEVsZW1lbnQgZWxlbWVudFhtbCkgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCk7Ci0KLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCVhtbEVsZW1lbnQgcHJlZGVjZXNzb3JYbWwgPSBlbGVtZW50WG1sCi0JCQkJLm5ld0NoaWxkKCJyZWZlcmVuY2VMaXN0Iikuc2V0QXR0cmlidXRlKCJuYW1lIiwgZmVhdHVyZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlXb3JrT3JkZXIgd28gPSAoV29ya09yZGVyKSBpdC5uZXh0KCk7Ci0JCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkuY2FsYzAxRmVhdHVyZVZhbHVlKHdvLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya09yZGVyX1ByZWQoKSwgbGF5b3V0TWFuYWdlcgotCQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCWlmIChtZSAhPSBudWxsKSB7Ci0JCQkJCUlFbGVtZW50TGF5b3V0IGwgPSBnZXRDaGlsZExheW91dChtZSk7Ci0JCQkJCWlmIChsICE9IG51bGwpIHsKLQkJCQkJCXByZWRlY2Vzc29yWG1sLmFkZENoaWxkKGwuZ2V0WG1sRWxlbWVudChmYWxzZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMGVjNDI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotICogYWJzdHJjdCBjbGFzcyBmb3IgcHJvY2VzcyBlbGVtZW50IGxheW91dCB0aGF0IGlzIHByb2Nlc3Mgc3BlY2lmaWMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQgZXh0ZW5kcwotCQlBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHJvdGVjdGVkIFByb2Nlc3Mgb3duaW5nUHJvY2VzcyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnRQcm9jZXNzUGF0aCA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyByZWxQcm9jZXNzUGF0aCA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIHBhdGhzID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlOYW1lID0gbnVsbDsKLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3QgYSBsYXlvdXQgZm9yIHByb2Nlc3MgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBsYXlvdXRNYW5hZ2VyCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gb3duaW5nUHJvYwotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlQcm9jZXNzIG93bmluZ1Byb2MsIFN0cmluZyBwYXRoKSB7Ci0KLQkJaW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQotCQl0aGlzLm93bmluZ1Byb2Nlc3MgPSBvd25pbmdQcm9jOwotCQl0aGlzLmVsZW1lbnRQcm9jZXNzUGF0aCA9IHBhdGg7Ci0KLQkJaWYgKHRoaXMub3duaW5nUHJvY2VzcyA9PSBudWxsKSB7Ci0JCQl0aGlzLm93bmluZ1Byb2Nlc3MgPSBUbmdVdGlsCi0JCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBzdXBlci5lbGVtZW50KTsKLQkJfQotCi0JCWlmIChMaWJyYXJ5VXRpbC5pc1Byb2Nlc3MoZWxlbWVudCkpIHsKLQkJCW93bmluZ1Byb2Nlc3MgPSAoUHJvY2VzcykgZWxlbWVudDsKLQkJCWVsZW1lbnRQcm9jZXNzUGF0aCA9IEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQubWFrZVBhdGgobnVsbCwKLQkJCQkJZWxlbWVudCk7Ci0JCQlyZWxQcm9jZXNzUGF0aCA9IGVsZW1lbnRQcm9jZXNzUGF0aDsKLQkJfQotCQkKLQkJaWYgKCBlbGVtZW50UHJvY2Vzc1BhdGggPT0gbnVsbCAmJiB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KQotCQl7Ci0JCQllbGVtZW50UHJvY2Vzc1BhdGggPSBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmdldFBhdGgoKEJyZWFrZG93bkVsZW1lbnQpdGhpcy5lbGVtZW50KTsKLQkJfQotCQkKLQkJLy8gZ2V0IHRoZSBwYXRoIGFycmF5Ci0JCXBhdGhzID0gZ2V0UGF0aEFycmF5KGVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCQotCX0KLQotCi0JLyoqCi0JICogdGhlIHByb2Nlc3MgcGF0aCBvZiB0aGlzIGl0ZW0gcmVsYXRpdmUgdG8gdGhlIGNhbGxpbmcgaXRlbQotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVsYXRpdmVQcm9jZXNzUGF0aChTdHJpbmcgcGF0aCkKLQl7Ci0JCXRoaXMucmVsUHJvY2Vzc1BhdGggPSBwYXRoOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHJlbGF0aXZlIHByb2Nlc3MgcGF0aAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVByb2Nlc3NQYXRoKCkKLQl7Ci0JCXJldHVybiB0aGlzLnJlbFByb2Nlc3NQYXRoOwotCX0KLQkKLS8vCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotLy8JCVN0cmluZyB1cmwgPSBzdXBlci5nZXRVcmwoKTsKLS8vCi0vLwkJcmV0dXJuIHVybCArIGdldFF1ZXJ5U3RyaW5nKCk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBnZXQgcXVlcnkgc3RyaW5nIGZvciB0aGUgcHJvY2VzcyBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkgewotLy8JCWlmIChvd25pbmdQcm9jZXNzID09IGVsZW1lbnQpIHsKLS8vCQkJcmV0dXJuICIiOwotLy8JCX0KLQkJLy8gcmV0dXJuICI/IiArIFJlc291cmNlSGVscGVyLlVSTF9QQVJBTUVURVJfUFJPQ0VTUyArICI9IiArCi0JCS8vIG93bmluZ1Byb2Nlc3MuZ2V0R3VpZCgpICsgIiYiICsgUmVzb3VyY2VIZWxwZXIuVVJMX1BBUkFNRVRFUl9QQVRIICsKLQkJLy8gIj0iICsgZWxlbWVudFByb2Nlc3NQYXRoOwotCi0JCXJldHVybiBFbGVtZW50TGF5b3V0TWFuYWdlci5nZXRRdWVyeVN0cmluZyhvd25pbmdQcm9jZXNzLmdldEd1aWQoKSwKLQkJCQllbGVtZW50UHJvY2Vzc1BhdGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldERpc3BsYXlOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlpZiAoIHRoaXMuZGlzcGxheU5hbWUgPT0gbnVsbCApIHsKLQkJCVByb2Nlc3MgcHJvYyA9IGdldE93bmluZ1Byb2Nlc3MoKTsKLQkJCQotCQkJLy8gbmVlZCB0byBoYW5kbGUgdGhlIHN1cHJlc3NlZCBicmVha2Rvd24gZWxlbWVudHMKLQkJCS8vIHVzZSB0aGUgU3VwcmVzcyB1dGlsaXR5Ci0JCQlTdXBwcmVzc2lvbiBzdXAgPSBnZXRTdXBwcmVzc2lvbihwcm9jKTsKLQkKLQkJCS8vIGRpc3BsYXkgbmFtZSBuZWVkcyB0byBiZSBmaXhlZCwgZXh0ZW5kZWQgYWN0aXZpdHkgbWF5IG5lZWQgdG8gZ2V0IGRpc3BsYXkgbmFtZSBmcm9tIHRoZSBiYXNlCi0JCQkvLyBEVlQ6ICBQTnMgb2YgZXh0ZW5kZWQgcHJvY2Vzc2VzIG5vIHBpY2tlZCB1cCBmb3IgcHVibGlzaCAoVENUIDYzOCkKLQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyLmdldENCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgodGhpcy5wYXRocywgYWRhcHRlckZhY3RvcnkpOwotCQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQkJd3JhcHBlciA9IHN1cGVyLmVsZW1lbnQ7Ci0JCQl9Ci0JCi0JCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQl3cmFwcGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQotCQkJdGhpcy5kaXNwbGF5TmFtZSA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShlbGVtZW50LAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLCBhZGFwdGVyKTsKLQkJfQotCQkKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oUHJvY2VzcyBwcm9jKQotCXsKLQkJcmV0dXJuIGxheW91dE1hbmFnZXIuZ2V0U3VwcHJlc3Npb24ocHJvYyk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoKTsKLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoInF1ZXJ5U3RyaW5nIiwgZ2V0UXVlcnlTdHJpbmcoKSkgLy8kTk9OLU5MUy0xJAotCQkJLy8uc2V0QXR0cmlidXRlKCJvd25pbmdQcm9jZXNzR3VpZCIsIG93bmluZ1Byb2Nlc3MuZ2V0R3VpZCgpKSAvLyAvLyROT04tTkxTLTEkCi0JCQkvLy5zZXRBdHRyaWJ1dGUoImVsZW1lbnRQcm9jZXNzUGF0aCIsIGVsZW1lbnRQcm9jZXNzUGF0aCkgLy8kTk9OLU5MUy0xJAotCQkJLnNldEF0dHJpYnV0ZSgicmVsUHJvY2Vzc1BhdGgiLCByZWxQcm9jZXNzUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb2Nlc3MgZ2V0T3duaW5nUHJvY2VzcygpIHsKLQkJcmV0dXJuIG93bmluZ1Byb2Nlc3M7Ci0JfQotCi0JcHJvdGVjdGVkIElFbGVtZW50TGF5b3V0IGdldExheW91dChQcm9jZXNzRWxlbWVudEl0ZW0gaXRlbSkgewotCQlJRWxlbWVudExheW91dCBsYXlvdXQgPSBsYXlvdXRNYW5hZ2VyLmNyZWF0ZUxheW91dChpdGVtLmVsZW1lbnQsIG93bmluZ1Byb2Nlc3MsIGl0ZW0ucGF0aCk7Ci0JCQotCQlpZiAoIGxheW91dCBpbnN0YW5jZW9mIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQgKQotCQl7CQkKLQkJCS8vIHNldCB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGlzIGxheW91dCBzaW5jZSB0aGlzIGlzIHRoZSBjYWxsZXIKLQkJCVN0cmluZyByZWxQYXRoID0gQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dC5nZXRSZWxhdGl2ZVBhdGgoaXRlbS5wYXRoLCB0aGlzLmVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCQkoKEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQpbGF5b3V0KS5zZXRSZWxhdGl2ZVByb2Nlc3NQYXRoKHJlbFBhdGgpOwotCQl9Ci0JCXJldHVybiBsYXlvdXQ7Ci0JfQotCi0JLyoqCi0JICogc3RhdGljIHV0aWxpdHkgbWV0aG9kcyBmb3IgbWFrZSBhIHBhdGggZm9yIHRoZSBwcm9jZXNzIGVsZW5tZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVBhdGgoU3RyaW5nIHBhcmVudFBhdGgsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAocGFyZW50UGF0aCA9PSBudWxsIHx8IHBhcmVudFBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0R3VpZCgpOwotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudFBhdGggKyAiLCIgKyBlbGVtZW50LmdldEd1aWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzdGF0aWMgbWV0aG9kIHRvIGdldCB0aGUgcGF0aCBvZiBhIGJyZWFrIGRvd24gZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoKEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJU3RyaW5nIHBhdGggPSBlbGVtZW50LmdldEd1aWQoKTsKLQkJQnJlYWtkb3duRWxlbWVudCBhY3QgPSBlbGVtZW50OwotCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZWxlbWVudCk7Ci0KLQkJLy8gQ2hlY2sgc3VwZXJhY3Rpdml0eSBpcyBwcm9jZXNzIGFuZCBzaG91bGQgb3duaW5nIHByb2Nlc3MgKHRoaXMgaXMgdXNlZnVsIGluIGRlZXBjb3B5Ci0JCXdoaWxlICggYWN0ICE9IHByb2MgKQotCQl7Ci0JCQlBY3Rpdml0eSBzdXBlckFjdHMgPSBhY3QuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQlpZiAoIHN1cGVyQWN0cyAhPSBudWxsICkKLQkJCXsKLQkJCQlhY3QgPSBzdXBlckFjdHM7Ci0JCQkJcGF0aCA9IGFjdC5nZXRHdWlkKCkgKyAiLCIgKyBwYXRoOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcGF0aDsJCQotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHBhdGggZm9yIGEgZ2l2ZW4gYnJlYWtkb3duIGVsZW1lbnQgaXRlbSBwcm92aWRlcgotCSAqIEBwYXJhbSB3cmFwcGVyIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpCi0JewotCQlPYmplY3QgZSA9IExpYnJhcnlVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYgKCAhKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCU9iamVjdCB0b3BJdGVtID0gd3JhcHBlci5nZXRUb3BJdGVtKCk7Ci0JCVN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlwYXRoLmFwcGVuZCgoKE1ldGhvZEVsZW1lbnQpZSkuZ2V0R3VpZCgpKTsKLQkJCi0JCU9iamVjdCBwYXJlbnQgPSB3cmFwcGVyOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50ICE9IHRvcEl0ZW0pIHsKLQkJCWlmICggcGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCApIHsKLQkJCQlwYXJlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnQpcGFyZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCQllID0gcGFyZW50OwotCQkJfSBlbHNlIGlmICggcGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgKXsKLQkJCQlwYXJlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXBhcmVudCkuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQkJZSA9IExpYnJhcnlVdGlsLnVud3JhcChwYXJlbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJaWYgKCBlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXBhdGguaW5zZXJ0KDAsICgoTWV0aG9kRWxlbWVudCllKS5nZXRHdWlkKCkgKyAiLCIpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiB1dGlsaXR5IG1ldGhvZCB0byBnZXQgdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHBhcmVudAotCSAqIEBwYXJhbSBwYXRoIFN0cmluZwotCSAqIEBwYXJhbSBwYXJlbnRQYXRoIFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKFN0cmluZyBwYXRoLCBTdHJpbmcgcGFyZW50UGF0aCkgewotCQkKLQkJaWYgKCBwYXRoID09IG51bGwgKQotCQl7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCQkKLQkJaWYgKCBwYXRoLnN0YXJ0c1dpdGgocGFyZW50UGF0aCkgKQotCQl7Ci0JCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcocGFyZW50UGF0aC5sZW5ndGgoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcGF0aCBhcnJyYXkKLQkgKiBAcGFyYW0gcGF0aCBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZ1tdCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQYXRoQXJyYXkoU3RyaW5nIHBhdGgpCi0JewotCQlpZiAoIHBhdGggPT0gbnVsbCApCi0JCXsKLQkJCXJldHVybiBuZXcgU3RyaW5nW117fTsJCQkKLQkJfQotCQkKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXRoLCAiLCIpOwotCQl3aGlsZSAoIHN0Lmhhc01vcmVUb2tlbnMoKSApCi0JCXsKLQkJCVN0cmluZyBzID0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotCQkJaWYgKCBzLmxlbmd0aCgpID4gMCApCi0JCQl7Ci0JCQkJaXRlbXMuYWRkKHMpOwotCQkJfQotCQl9Ci0JCQotCQlTdHJpbmdbXSBhcnIgPSBuZXcgU3RyaW5nW2l0ZW1zLnNpemUoKV07Ci0JCWl0ZW1zLnRvQXJyYXkoYXJyKTsKLQkJCi0JCXJldHVybiBhcnI7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgb3duaW5nIHByb2Nlc3MgZnJvbSBwYXRoLCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgcGF0aCBpcyB0aGUgZ3VpZCBvZiB0aGUgcHJvY2VzcwotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPd25pbmdQcm9jZXNzR3VpZEZyb21QYXRoKFN0cmluZyBwYXRoKQotCXsKLQkJaWYgKCBwYXRoID09IG51bGwgKQotCQl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaW50IGluZGV4ID0gcGF0aC5pbmRleE9mKCIsIik7Ci0JCVN0cmluZyBndWlkOwotCQlpZiAoIGluZGV4IDwgMCApCi0JCXsKLQkJCWd1aWQgPSBwYXRoOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJZ3VpZCA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCQkKLQkJcmV0dXJuIGd1aWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBwYXJlbnQgcGF0aAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXJlbnRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCWlmICggcGF0aCA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2YoIiwiKTsKLQkJaWYgKCBpbmRleCA+IDAgKSB7Ci0JCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWN0aXZpdHlMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BY3Rpdml0eUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YzcwNGQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BY3Rpdml0eUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuVGltZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLklBY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuQlNDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuTmFtZUNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgUm9sZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0IHsKLQkKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSQUNFX1JFUExBQ0VNRU5UID0gIl9CUl8iOwkgLy8kTk9OLU5MUy0xJAotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTkJSQUNFX1NUUklORyA9ICJcXHsiOwkgLy8kTk9OLU5MUy0xJAotCQotCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8gdXNlckRpYWdyYW1JbmZvID0gbnVsbDsKLQlib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQkKLQlwcml2YXRlIFRCU0l0ZW1EZXRhaWwgaXRlbURldGFpbCA9IG5ldyBUQlNJdGVtRGV0YWlsKCk7Ci0JCi0JcHVibGljIEFjdGl2aXR5TGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGluaXRpYWxpemUgdGhlIGxheW91dAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIHByb2Nlc3MgaXMgbG9hZGVkCi0JCS8vIG90aGVyd2lzZSB0aGUgcHJvY2VzcyBvciBwcm9jZXNzIGVsZW1lbnRzIG1heSBub3QgaGF2ZSBhIHZhbGlkIGNvbnRhaW5lcgotCQkvLyBhbmQgdGh1cyB0aGUgZWxlbWVudCBjb250ZW50IHBhdGggY2FuJ3QgYmUgZGV0ZXJtaW5lZAotCQkvLyB0aGlzIGlzIGp1c3QgYSB3b3JrYXJvdW5kLiBzaG91bGQgd2UgaGF2ZSBhIGJldHRlciB3YXkgdG8gbWFrZSBzdXJlIHRoZSBlbGVtZW50cyBhcmUgbG9hZGVkIGNvcnJlY3RseT8/Pz8/Pz8/Pz8/Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCWlmICggcGx1Z2luID09IG51bGwgfHwgcGx1Z2luLmVDb250YWluZXIoKSA9PSBudWxsICkgewotCQkJLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiBpbiBwdWJsaXNoaW5nIG1vZGUgc2luY2UgdGhlIHdob2xlIGxpYnJhcnkgaXMgYWxyZWFkeSBsb2FkZWQKLQkJCWlmICggZGVidWcgJiYgZ2V0TGF5b3V0TWdyKCkuaXNQdWJsaXNoaW5nTW9kZSgpICkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IEVsZW1lbnQgd2l0aG91dCBhIHZhbGlkIGNvbnRhaW5lcjogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpKTsKLQkJCX0KLQotCQkJTGlicmFyeVV0aWwubG9hZEFsbFByb2Nlc3NlcyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQl9Ci0JCQotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0KLQkJdXNlckRpYWdyYW1JbmZvID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8oKEFjdGl2aXR5KWVsZW1lbnQpOwotCQkKLQkJLy8gc2V0dXAgdGhlIG11bHRpIGxheW91dCBvdXRwdXQKLQkJLy8gU3RyaW5nIGZpbGVfZGVzYyA9IHN1cGVyLmdldEZpbGVOYW1lKFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUwpOwkJCi0JCQotCQlTdHJpbmcgZmlsZTsKLQkJCi0vLwkJaWYgKHN1cGVyLmVsZW1lbnQuZ2V0R3VpZCgpLnN0YXJ0c1dpdGgoInsiKSkKLS8vCQl7Ci0vLwkJCVN0cmluZyBuZXdHdWlkID0gc3VwZXIuZWxlbWVudC5nZXRHdWlkKCkucmVwbGFjZUZpcnN0KCBPUEVOQlJBQ0VfU1RSSU5HLCBCUkFDRV9SRVBMQUNFTUVOVCApOwotLy8JCQlmaWxlID0gc3VwZXIuZWxlbWVudC5nZXROYW1lKCkgKyBuZXdHdWlkLnN1YnN0cmluZygwLCBuZXdHdWlkLmxlbmd0aCgpLTEpOwotLy8JCX0KLS8vCQllbHNlCi0JCQkvL2ZpbGUgPSBTdHJVdGlsLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKHN1cGVyLmVsZW1lbnQuZ2V0TmFtZSgpKSArIHN1cGVyLmVsZW1lbnQuZ2V0R3VpZCgpOwotCQkKLQkJZmlsZSA9IE5hbWVDYWNoZS5nZXRJbnN0YW5jZSgpLmdldEZpbGVOYW1lKHN1cGVyLmVsZW1lbnQpOwotCi0JCS8vIHJlcGxhY2UgJyBhbmQgIiB3aXRoIHNwYWNlCi0JCWZpbGUgPSBmaWxlLnJlcGxhY2UoJ1wnJywgJyAnKS5yZXBsYWNlKCdcIicsICcgJyk7Ci0JCQotCQlzZXRMYXlvdXRJbmZvKG5ldyBMYXlvdXRJbmZvKAotCQkJCSJEZXNjcmlwdGlvbiIsICJhY3Rpdml0eS54c2wiLCBmaWxlICsgIl9kZXNjIiArIFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUwsIHRydWUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJc2V0TGF5b3V0SW5mbyhuZXcgTGF5b3V0SW5mbygKLQkJCQkiV1BCUyIsICJhY3Rpdml0eV93cGJzLnhzbCIsIGZpbGUgKyAiX3dwYnMiICsgUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJc2V0TGF5b3V0SW5mbyhuZXcgTGF5b3V0SW5mbygKLQkJCQkiVEJTIiwgImFjdGl2aXR5X3Ricy54c2wiLCBmaWxlICsgIl90YnMiICsgUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJc2V0TGF5b3V0SW5mbyhuZXcgTGF5b3V0SW5mbygKLQkJCQkiV0JTIiwgImFjdGl2aXR5X3dicy54c2wiLCBmaWxlICsgIl93YnMiICsgUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCX0KLQotCQotCS8qKgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNvbGxlY3QgdGhlIFN1cHBvcnRpbmdNYXRlcmlhbHMgdGhhdCBhcmUgZm9yIHVzZXIgZGVmaW5lZCBkaWFncmFtcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEZlYXR1cmVWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQotCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsICkgewkJCQotCQkJcmV0dXJuICF1c2VyRGlhZ3JhbUluZm8uaXNEaWFncmFtKCAoU3VwcG9ydGluZ01hdGVyaWFsKXZhbHVlICk7Ci0JCX0KLQkJZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgTGlzdCApCi0JCXsKLQkJCUxpc3QgaXRlbXMgPSAoTGlzdCl2YWx1ZTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlICggaSA8IGl0ZW1zLnNpemUoKSApCi0JCQl7Ci0JCQkJT2JqZWN0IG8gPSBpdGVtcy5nZXQoaSk7Ci0JCQkJaWYgKCAobyBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgJiYgdXNlckRpYWdyYW1JbmZvLmlzRGlhZ3JhbSgoU3VwcG9ydGluZ01hdGVyaWFsKW8pICkgewkJCQotCQkJCQlpdGVtcy5yZW1vdmUoaSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQotCQlTdHJpbmcgbXNnOwotCQlUaW1lciB0ID0gbnVsbDsKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCXQgPSBuZXcgVGltZXIoKTsJCi0JCQltc2cgPSAiR2VuZXJhdGluZyBsYXlvdXQgeG1sIGZvciAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgIC8vJE5PTi1OTFMtMSQgCi0JCQkJKyAiLCBpbmNsdWRlUmVmZXJlbmNlcyA9ICIgKyBpbmNsdWRlUmVmZXJlbmNlczsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQkJCi0KLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudCgpOwotCQkKLQkJLy8gbG9hZCB0aGUgYXR0cmlidXRlcwotCQlsb2FkQXR0cmlidXRlcyhlbGVtZW50WG1sKTsKLQkJCi0JCVByb2Nlc3MgcHJvYyA9IGdldE93bmluZ1Byb2Nlc3MoKTsKLQkJCi0JCS8vIG5lZWQgdG8gaGFuZGxlIHRoZSBzdXByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnRzCi0JCS8vIHVzZSB0aGUgU3VwcmVzcyB1dGlsaXR5Ci0JCVN1cHByZXNzaW9uIHN1cCA9IGdldFN1cHByZXNzaW9uKHByb2MpOwotCi0vLwkJLy8gZGlzcGxheSBuYW1lIG5lZWRzIHRvIGJlIGZpeGVkLCBleHRlbmRlZCBhY3Rpdml0eSBtYXkgbmVlZCB0byBnZXQgZGlzcGxheSBuYW1lIGZyb20gdGhlIGJhc2UKLS8vCQkvLyBEVlQ6ICBQTnMgb2YgZXh0ZW5kZWQgcHJvY2Vzc2VzIG5vIHBpY2tlZCB1cCBmb3IgcHVibGlzaCAoVENUIDYzOCkKLS8vCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlci5nZXRDQlNBZGFwdGVyRmFjdG9yeSgpOwotLy8JCU9iamVjdCB3cmFwcGVyID0gc3VwLmdldE9iamVjdEJ5UGF0aChzdXBlci5wYXRocywgYWRhcHRlckZhY3RvcnkpOwotLy8JCWlmICggd3JhcHBlciA9PSBudWxsICkgewotLy8JCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLS8vCQl9Ci0vLwotLy8JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0vLwkJCQl3cmFwcGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotLy8KLS8vCQlTdHJpbmcgZGlzcGxheU5hbWUgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoZWxlbWVudCwKLS8vCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUsIGFkYXB0ZXIpOwotLy8KLS8vCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBkaXNwbGF5TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmICghaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCXJldHVybiBlbGVtZW50WG1sOwotCQl9Ci0KLQkJLy8gZ2V0IHRoZSB0YWJzIHhtbCBzZWN0aW9uCi0JCVhtbEVsZW1lbnQgdGFic1htbCA9IGVsZW1lbnRYbWwubmV3Q2hpbGQoInRhYnMiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGF5b3V0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlMYXlvdXRJbmZvIGluZm8gPSAoTGF5b3V0SW5mbykgaXQubmV4dCgpOwotCQkJdGFic1htbC5uZXdDaGlsZCgidGFiIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgaW5mby5uYW1lKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoInVybCIsIHN1cGVyLmVsZW1lbnRQYXRoICsgaW5mby5maWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIGRvIGl0IG9ubHkgd2hlbiBpdCdzIGEgcHJvY2VzcyBvciBpdCdzIG5vdCBpbiBwdWJsaXNoaW5nIG1vZGVsCi0JCS8vIHNpbmNlIGluIHB1Ymxpc2hpbmcsIHRoZSBpdGVyYXRpb24gYWx3YXlzIHN0YXJ0IGZyb20gcHJvY2VzcwotCQkvLyBmb3IgYnJvd3NpbmcsIGl0IGNhbiBzdGFydCBpbiB0aGUgbWlkZGxlIAotCQlpZiAoICFnZXRMYXlvdXRNZ3IoKS5pc1B1Ymxpc2hpbmdNb2RlKCkgfHwgc3VwZXIuZWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyApIHsKLQkJCWdldExheW91dE1ncigpLnByZXBhcmVBZGFwdG9yRmFjdG9yaWVzRm9yUHJvY2Vzcyhwcm9jKTsKLQkJfQotCi0JCS8vIGxvYWQgdGhlIGNvcHlyaWdodCBpbmZvCi0JCWxvYWRDb3B5cmlnaHQoZWxlbWVudFhtbCk7Ci0KLQkJLy8gY2FsY3VsYXRlIG90aGVyIHNlbGVjdGVkIHJlZmVyZWNuZXMKLQkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGVsZW1lbnQgcmVmZXJlbmNlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0aWVzCi0JCQkJCQkuZ2V0KGkpOwotCi0JCQkJLy8gc2tpcCB0aGUgYnJlYWtkb3duIGVsZW1lbnRzIHNpbmNlIHdlIHdpbGwgYnVpbGQgdGhlIGJyZWFrZG93bgotCQkJCS8vIHN0cnVjdHVyZSBsYXRlcgotCQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvLyBPYmplY3QgdmFsdWUgPSBlbGVtZW50LmdldChpKTsKLQkJCQlFQ2xhc3NpZmllciB0eXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBFQ2xhc3MpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWxvYWRGZWF0dXJlKGZlYXR1cmUsIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJCX0KLQkJfQotCQkKLQkJQ29sbGVjdGlvbiBvcHBvc2l0ZVByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnQuZ2V0T3Bwb3NpdGVGZWF0dXJlcygpKTsKLQkJZm9yIChJdGVyYXRvciB6PSBvcHBvc2l0ZVByb3BlcnRpZXMuaXRlcmF0b3IoKTsgei5oYXNOZXh0KCk7ICkKLQkJewotCQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gKE9wcG9zaXRlRmVhdHVyZSkgei5uZXh0KCk7Ci0JCQlsb2FkRmVhdHVyZShvZmVhdHVyZSwgZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCQl9Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJdC5zdG9wKCk7Ci0JCQltc2cgPSB0LmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGJ1aWxkaW5nIEFjdGl2aXR5IERlc2NyaW90aW9uIHhtbCBmb3IgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICA7IC8vJE5PTi1OTFMtMSQgCQkJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCQotCQkJdC5zdGFydCgpOwotCQl9Ci0KLQkJYnVpbGRXQlMoZWxlbWVudFhtbCwgc3VwKTsKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCXQuc3RvcCgpOwotCQkJbXNnID0gdC5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBidWlsZGluZyBXQlMgZm9yICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSAgOyAvLyROT04tTkxTLTEkIAkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQkKLQkJCXQuc3RhcnQoKTsKLQkJfQotCQkKLQkJYnVpbGRUQlMoZWxlbWVudFhtbCwgc3VwKTsJCi0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJdC5zdG9wKCk7Ci0JCQltc2cgPSB0LmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGJ1aWxkaW5nIFRCUyBmb3IgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICA7IC8vJE5PTi1OTFMtMSQgCQkJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkKLQkJCXQuc3RhcnQoKTsKLQkJfQotCQkKLQkJYnVpbGRXUEJTKGVsZW1lbnRYbWwsIHN1cCk7Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJdC5zdG9wKCk7Ci0JCQltc2cgPSB0LmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGJ1aWxkaW5nIFdQQlMgZm9yICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSAgOyAvLyROT04tTkxTLTEkIAkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQkKLQkJCW1zZyA9IHQuZ2V0VG90YWxUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBidWlsZGluZyBsYXlvdXQgeG1sIGZvciAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgIDsgLy8kTk9OLU5MUy0xJCAJCQkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JCQotCQkKLS8vCQkvLyBmb3IgdGVzdCBvbmx5Ci0vLwkJUHJvY2Vzc0xheW91dERhdGEgZGF0YSA9IG5ldyBQcm9jZXNzTGF5b3V0RGF0YShnZXRPd25pbmdQcm9jZXNzKCkuZ2V0R3VpZCgpKTsKLS8vCQlsb2FkTGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFVzZXJEaWFncmFtVGV4dChTdXBwb3J0aW5nTWF0ZXJpYWwgdXNlckRpYWdyYW0pCi0JewotCQkvLyB1c2VyIGRlZmluZWQgZGlhZ3JhbQotCQlBYnN0cmFjdEVsZW1lbnRMYXlvdXQgbCA9IG5ldyBHZW5lcmFsTGF5b3V0KCk7Ci0JCWwuaW5pdChnZXRMYXlvdXRNZ3IoKSwgdXNlckRpYWdyYW0uZ2V0UHJlc2VudGF0aW9uKCkpOwotCQlsLnNldENvbnRlbnRUYXJnZXQoZWxlbWVudCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCQlyZXR1cm4gKFN0cmluZylsLmdldEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShmZWF0dXJlKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0Q29sdW1ucyhYbWxFbGVtZW50IHBhcmVudFhtbCwgTGlzdCBjb2xzKSB7Ci0JCVhtbEVsZW1lbnQgY29sc1htbCA9IHBhcmVudFhtbC5uZXdDaGlsZCgiY29sdW1ucyIpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29scy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJQlNDb2x1bW4gY29sID0gKEJTQ29sdW1uKWl0Lm5leHQoKTsKLQkJCWNvbHNYbWwubmV3Q2hpbGQoImNvbHVtbiIpCi0JCQkJLnNldEF0dHJpYnV0ZSgiaWQiLCBjb2wuaWQpCi0JCQkJLnNldEF0dHJpYnV0ZSgibGFiZWwiLCBjb2wubGFiZWwpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFdCUyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIFN1cHByZXNzaW9uIHN1cCkKLQl7Ci0JCS8vIGJ1aWxkIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRyZWUKLQkJWG1sRWxlbWVudCBicyA9IGVsZW1lbnRYbWwKLQkJCQkubmV3Q2hpbGQoImJyZWFrZG93biIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCS5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZ2V0RGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBzZXQgdGhlIGNvbHVtbnMKLQkJc2V0Q29sdW1ucyhicywgUHJlZmVyZW5jZVV0aWwuZ2V0V0JTQ29sdW1ucygpKTsKLQkJCi0JCS8vIHB1Ymxpc2ggdGhlIGNvbnNvbGlkYXRlZCB2aWV3Ci0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyCi0JCQkJLmdldENCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCUNvbXBvc2l0ZVJvbGVzIGNycyA9IG51bGw7IC8vbmV3IENvbXBvc2l0ZVJvbGVzKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIHN1cGVyLmVsZW1lbnQpOwotCQkvLyBpZiAoIHN1cGVyLmVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzICkKLQkJewotCQkJUHJvY2Vzc1V0aWwudXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBzdXAuZ2V0UHJvY2VzcygpKTsKLQkJfQotCi0JCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nID0gbmV3IEFjdGl2aXR5TGF5b3V0U2V0dGluZygKLQkJCQlhZGFwdGVyRmFjdG9yeSwgY3JzLCBzdXApOwotCi0JCS8vIGVzY2FwZSB0aGUgcXVvdGVzIGluIHRoZSBzdHJpbmcgc2ljbmUgd2Ugc2V0IHRoZSBzdHJpbmcgaW50byBqYXZhc2NyaXB0IHZhcmlhYmxlcyBpbiB0aGUgbGF5b3V0Ci0JCXNldHRpbmcuZXNjYXBlU3RyaW5nID0gdHJ1ZTsKLQkJCi0JCS8vIHNldCB0byBvbmx5IHNob3cgdGFzayBkZXNjcmlwdG9ycyBmb3Igc3ViLWFjdGl2aXRpZXMKLQkJc2V0dGluZy5zaG93VGFza09ubHkgPSB0cnVlOwotCQkKLQkJLy8gbmVlZCB0byBnZXQgdGhlIHJhdyBpdGVtIHByb3ZpZGVyIGZyb20gdGhlIGFkYXB0ZXIgZmFjdG9yeQotCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLQkJfSAKLQkJCi0JCWlmICggc3VwLmlzU3VwcHJlc3NlZCh3cmFwcGVyKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJUHJvY2Vzc0VsZW1lbnRJdGVtIGVsZW1lbnRJdGVtID0gbmV3IFByb2Nlc3NFbGVtZW50SXRlbSh3cmFwcGVyLCBzdXBlci5lbGVtZW50LCBzdXBlci5lbGVtZW50UHJvY2Vzc1BhdGgpOwotCQlpdGVyYXRlKGVsZW1lbnRJdGVtLCBicywgc2V0dGluZyk7Ci0JCQotCi0JCVhtbEVsZW1lbnQgZGlhZ3JhbXMgPSBlbGVtZW50WG1sLm5ld0NoaWxkKCJkaWFncmFtcyIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlTdHJpbmcgZGlhZ3JhbVR5cGU7Ci0JCVN0cmluZyBpbWdGaWxlOwotCQlkaWFncmFtVHlwZSA9IFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVzsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIHVzZXJEaWFncmFtID0gdXNlckRpYWdyYW1JbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpOwotCQlpZiAoIHVzZXJEaWFncmFtSW5mby5jYW5QdWJsaXNoQURJbWFnZSgpICYmICh1c2VyRGlhZ3JhbSAhPSBudWxsKSApCi0JCXsJCQkJCi0JCQlkaWFncmFtcy5uZXdDaGlsZCgidXNlcmRpYWdyYW0iKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGRpYWdyYW1UeXBlKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldFZhbHVlKGdldFVzZXJEaWFncmFtVGV4dCh1c2VyRGlhZ3JhbSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaW1nRmlsZSA9IFJlc291cmNlSGVscGVyLmdldERpYWdyYW1GaWxlUGF0aE5hbWUoZWxlbWVudCwgZGlhZ3JhbVR5cGUpOwotCQkJRGlhZ3JhbUluZm8gZGlhZ3JhbV93b3JrZmxvdyA9IGdlbmVyYXRlRGlhZ3JhbShzdXAsIGRpYWdyYW1UeXBlLCBpbWdGaWxlKTsJCi0JCQlpZiAoZGlhZ3JhbV93b3JrZmxvdyAhPSBudWxsCi0JCQkJCSYmIGRpYWdyYW1fd29ya2Zsb3cuZ2V0SW1hZ2VGaWxlTmFtZSgpICE9IG51bGwpIHsKLQkJCQlkaWFncmFtcy5uZXdDaGlsZCgiZGlhZ3JhbSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1cpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoImFsdCIsIGdldERpYWdyYW1EaXNwbGF5TmFtZShSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1cpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkvLy5zZXRWYWx1ZShkaWFncmFtX3dvcmtmbG93LmdldEhUTUwoKSk7Ci0JCQkJCQkuYWRkQ2hpbGQoZGlhZ3JhbV93b3JrZmxvdy5nZXRYbWxFbGVtZW50KCkpOwotCQkJfQotCQl9Ci0JCQotCQlkaWFncmFtVHlwZSA9IFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUw7Ci0JCXVzZXJEaWFncmFtID0gdXNlckRpYWdyYW1JbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCQlpZiAoIHVzZXJEaWFncmFtSW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKSAmJiAodXNlckRpYWdyYW0gIT0gbnVsbCkgKQotCQl7CQkJCQotCQkJZGlhZ3JhbXMubmV3Q2hpbGQoInVzZXJkaWFncmFtIikgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBkaWFncmFtVHlwZSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRWYWx1ZShnZXRVc2VyRGlhZ3JhbVRleHQodXNlckRpYWdyYW0pKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWltZ0ZpbGUgPSBSZXNvdXJjZUhlbHBlci5nZXREaWFncmFtRmlsZVBhdGhOYW1lKGVsZW1lbnQsIGRpYWdyYW1UeXBlKTsKLQkJCURpYWdyYW1JbmZvIGRpYWdyYW1fZGV0YWlsID0gZ2VuZXJhdGVEaWFncmFtKHN1cCwgZGlhZ3JhbVR5cGUsIGltZ0ZpbGUpOwkKLQkJCWlmIChkaWFncmFtX2RldGFpbCAhPSBudWxsICYmIGRpYWdyYW1fZGV0YWlsLmdldEltYWdlRmlsZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJZGlhZ3JhbXMKLQkJCQkJCS5uZXdDaGlsZCgiZGlhZ3JhbSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkiYWx0IiwgZ2V0RGlhZ3JhbURpc3BsYXlOYW1lKFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkvLy5zZXRWYWx1ZShkaWFncmFtX2RldGFpbC5nZXRIVE1MKCkpOwotCQkJCQkJLmFkZENoaWxkKGRpYWdyYW1fZGV0YWlsLmdldFhtbEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWRpYWdyYW1UeXBlID0gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1k7Ci0JCXVzZXJEaWFncmFtID0gdXNlckRpYWdyYW1JbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCQlpZiAoIHVzZXJEaWFncmFtSW5mby5jYW5QdWJsaXNoV1BESW1hZ2UoKSAmJiAodXNlckRpYWdyYW0gIT0gbnVsbCkgKQotCQl7CQkJCQotCQkJZGlhZ3JhbXMubmV3Q2hpbGQoInVzZXJkaWFncmFtIikgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBkaWFncmFtVHlwZSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRWYWx1ZShnZXRVc2VyRGlhZ3JhbVRleHQodXNlckRpYWdyYW0pKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWltZ0ZpbGUgPSBSZXNvdXJjZUhlbHBlci5nZXREaWFncmFtRmlsZVBhdGhOYW1lKGVsZW1lbnQsIGRpYWdyYW1UeXBlKTsKLQkJCURpYWdyYW1JbmZvIGRpYWdyYW1fd3AgPSBnZW5lcmF0ZURpYWdyYW0oc3VwLCBkaWFncmFtVHlwZSwgaW1nRmlsZSk7CQotCQkJaWYgKGRpYWdyYW1fd3AgIT0gbnVsbCAmJiBkaWFncmFtX3dwLmdldEltYWdlRmlsZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJZGlhZ3JhbXMubmV3Q2hpbGQoImRpYWdyYW0iKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1kpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkJCSJhbHQiLCBnZXREaWFncmFtRGlzcGxheU5hbWUoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1kpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkvLy5zZXRWYWx1ZShkaWFncmFtX3dwLmdldEhUTUwoKSk7Ci0JCQkJCQkuYWRkQ2hpbGQoZGlhZ3JhbV93cC5nZXRYbWxFbGVtZW50KCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldERpYWdyYW1EaXNwbGF5TmFtZShTdHJpbmcgdHlwZSkgewotCQotCQlTdHJpbmcgbmFtZSA9IGdldERpc3BsYXlOYW1lKCk7Ci0JCWlmICggUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XLmVxdWFscyh0eXBlKSApIHsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLmFjdGl2aXR5RGlhZ3JhbU5hbWUsIG5hbWUpOwkJCi0JCX0gZWxzZSBpZiAoIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwuZXF1YWxzKHR5cGUpICkgewotCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuYWN0aXZpdHlEZXRhaWxEaWFncmFtTmFtZSwgbmFtZSk7CQkKLQkJfSBlbHNlIGlmICggUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1kuZXF1YWxzKHR5cGUpICkgewotCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMud3BEZXBlbmRlbmN5RGlhZ3JhbU5hbWUsIG5hbWUpOwkJCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQlwcml2YXRlIERpYWdyYW1JbmZvIGdlbmVyYXRlRGlhZ3JhbShTdXBwcmVzc2lvbiBzdXAsIFN0cmluZyBkaWFncmFtVHlwZSwgU3RyaW5nIGltZ0ZpbGUpCi0JewotCQlUaW1lciB0aW1lciA9IG51bGw7Ci0JCWlmIChkZWJ1ZyApewotCQkJdGltZXIgPSBuZXcgVGltZXIoKTsJCQkKLQkJfQotCQkvLyBnZW5lcmF0ZSBkaWFncmFtCi0JCS8vIHNob3cgdGhlIGFjdGl2aXR5IGRpYWdyYW1zCi0JCUlBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlID0gbGF5b3V0TWFuYWdlcgotCQkJCS5nZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKCk7Ci0JCURpYWdyYW1JbmZvIGRpYWdyYW0gPSBudWxsOwotCQlpZiAoZGlhZ3JhbVNlcnZpY2UgIT0gbnVsbCkgewotCQkJSUZpbHRlciBmaWx0ZXIgPSBsYXlvdXRNYW5hZ2VyLmdldERpYWdyYW1BZGFwdGVyRmFjdG9yeSgpLmdldEZpbHRlcigpOwotCQkJCi0JCQkvLyBnZXQgdGhlIHdyYXBwZXIgZnJvbSB0aGUgV0JTIGFkYXB0ZXIgZmFjdG9yeQotCQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHN1cGVyLnBhdGhzLCBsYXlvdXRNYW5hZ2VyLmdldERpYWdyYW1BZGFwdGVyRmFjdG9yeSgpKTsKLQotCQkJZGlhZ3JhbSA9IGRpYWdyYW1TZXJ2aWNlLnNhdmVEaWFncmFtKHdyYXBwZXIsCi0JCQkJCWltZ0ZpbGUsCi0JCQkJCWRpYWdyYW1UeXBlLCBmaWx0ZXIsIHN1cCk7Ci0JCQkKLQkJfQotCi0JCWlmICggdGltZXIgIT0gbnVsbCApewotCQkJdGltZXIuc3RvcCgpOwkKLQkJCVN0cmluZyBtc2cgPSB0aW1lci5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBnZW5lcmF0aW5nICIgKyBkaWFncmFtVHlwZSArICIgZGlhZ3JhbSIgIDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQkJCi0JCXJldHVybiBkaWFncmFtOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFRCUyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIFN1cHByZXNzaW9uIHN1cCkKLQl7Ci0JCVhtbEVsZW1lbnQgYnMgPSBlbGVtZW50WG1sCi0JCS5uZXdDaGlsZCgiYnJlYWtkb3duIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgIlRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCS5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZ2V0RGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBzZXQgdGhlIGNvbHVtbnMKLQkJc2V0Q29sdW1ucyhicywgUHJlZmVyZW5jZVV0aWwuZ2V0VEJTQ29sdW1ucygpKTsKLQotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlci5nZXRUQlNBZGFwdGVyRmFjdG9yeSgpOwotCQlDb21wb3NpdGVSb2xlcyBjcnMgPSBudWxsOyAvL25ldyBDb21wb3NpdGVSb2xlcyhhZGFwdGVyRmFjdG9yeSwgKEFjdGl2aXR5KSBzdXBlci5lbGVtZW50KTsKLQkJCi0JCS8vIHJvb2x1cCB0aGUgbGF5b3V0Ci0JCUlCU0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCXN1cGVyLmVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCi0JCS8vIG5lZWQgdG8gZ2V0IHRoZSByYXcgaXRlbSBwcm92aWRlciBmcm9tIHRoZSBhZGFwdGVyIGZhY3RvcnkKLQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHN1cGVyLnBhdGhzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmICggd3JhcHBlciA9PSBudWxsICkgewotCQkJd3JhcHBlciA9IHN1cGVyLmVsZW1lbnQ7Ci0JCX0KLQkJUHJvY2Vzc0VsZW1lbnRJdGVtIGVsZW1lbnRJdGVtID0gbmV3IFByb2Nlc3NFbGVtZW50SXRlbSh3cmFwcGVyLCBzdXBlci5lbGVtZW50LCBzdXBlci5lbGVtZW50UHJvY2Vzc1BhdGgpOwotCi0JCS8vIGNvbGxlY3QgYWxsIFJvbGVEZXNjcmlwdG9ycyBiZWZvcmUgcm9sbHVwCi0JCXByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJaXRlbURldGFpbC5pdGVyYXRlKGFkYXB0ZXJGYWN0b3J5LCB3cmFwcGVyKTsKLQotCQlwcm92aWRlci5zZXRSb2xsZWRVcCh0cnVlKTsJCQotCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZyA9IG5ldyBBY3Rpdml0eUxheW91dFNldHRpbmcoYWRhcHRlckZhY3RvcnksIGNycywgc3VwKTsKLQkJc2V0dGluZy5yb2xsdXBSb2xlcyA9IHRydWU7Ci0KLQkJaXRlcmF0ZShlbGVtZW50SXRlbSwgYnMsIHNldHRpbmcpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRXUEJTKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgU3VwcHJlc3Npb24gc3VwKQotCXsKLQkJWG1sRWxlbWVudCBicyA9IGVsZW1lbnRYbWwKLQkJLm5ld0NoaWxkKCJicmVha2Rvd24iKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkuc2V0QXR0cmlidXRlKCJEaXNwbGF5TmFtZSIsIGdldERpc3BsYXlOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gc2V0IHRoZSBjb2x1bW5zCi0JCXNldENvbHVtbnMoYnMsIFByZWZlcmVuY2VVdGlsLmdldFdQQlNDb2x1bW5zKCkpOwotCi0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyLmdldFdQQlNBZGFwdGVyRmFjdG9yeSgpOwotCQlDb21wb3NpdGVSb2xlcyBjcnMgPSBudWxsOyAvL25ldyBDb21wb3NpdGVSb2xlcyhhZGFwdGVyRmFjdG9yeSwgKEFjdGl2aXR5KSBzdXBlci5lbGVtZW50KTsKLQkJCi0JCS8vIHJvb2x1cCB0aGUgbGF5b3V0Ci0JCUlCU0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHN1cGVyLmVsZW1lbnQsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJcHJvdmlkZXIuc2V0Um9sbGVkVXAodHJ1ZSk7Ci0JCQotCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZyA9IG5ldyBBY3Rpdml0eUxheW91dFNldHRpbmcoYWRhcHRlckZhY3RvcnksIGNycywgc3VwKTsKLQotCQkvLyBuZWVkIHRvIGdldCB0aGUgcmF3IGl0ZW0gcHJvdmlkZXIgZnJvbSB0aGUgYWRhcHRlciBmYWN0b3J5Ci0JCU9iamVjdCB3cmFwcGVyID0gc3VwLmdldE9iamVjdEJ5UGF0aChzdXBlci5wYXRocywgYWRhcHRlckZhY3RvcnkpOwotCQlpZiAoIHdyYXBwZXIgPT0gbnVsbCApIHsKLQkJCXdyYXBwZXIgPSBzdXBlci5lbGVtZW50OwotCQl9Ci0JCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0od3JhcHBlciwgc3VwZXIuZWxlbWVudCwgc3VwZXIuZWxlbWVudFByb2Nlc3NQYXRoKTsKLQkJaXRlcmF0ZShlbGVtZW50SXRlbSwgYnMsIHNldHRpbmcpOwotCi0JfQotCi0JLyoqCi0JICogaXRlcmF0ZSB0aGUgYnJlYWsgZG93biBzdHJ1Y3R1cmUgYW5kIGJ1aWxkIHRoZSB4bWwgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50SXRlbQotCSAqICAgICAgICAgICAgVGhlIG9iamVjdCB0byBpdGVyYXRlLiBJdCBjYW4gYmUgYSBicmVha2Rvd24gZWxlbWVudCwgb3IgaXQncwotCSAqICAgICAgICAgICAgYWRhcHRvcgotCSAqIEBwYXJhbSBwYXJlbnRYbWwKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZShQcm9jZXNzRWxlbWVudEl0ZW0gcGFyZW50SXRlbSwgWG1sRWxlbWVudCBwYXJlbnRYbWwsCi0JCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZykgewotCQlpdGVyYXRlKHBhcmVudEl0ZW0sIHBhcmVudFhtbCwgc2V0dGluZywgMCk7Ci0JfQotCQotCS8vIGxldmVsIHRvIGV4cGFuZCBhbGwgQldTIGFjdGl2aXRpZXMgdG8sIDAgZm9yIHRoZSBmaXJzdCBsZXZlbAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9TSE9XX0xFVkVMID0gMTsKLQkKLQkvKioKLQkgKiBpdGVyYXRlIHRoZSBicmVhayBkb3duIHN0cnVjdHVyZSBhbmQgYnVpbGQgdGhlIHhtbCBkb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRJdGVtCi0JICogICAgICAgICAgICBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUuIEl0IGNhbiBiZSBhIGJyZWFrZG93biBlbGVtZW50LCBvciBpdCdzCi0JICogICAgICAgICAgICBhZGFwdG9yCi0JICogQHBhcmFtIHBhcmVudFhtbAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXByaXZhdGUgdm9pZCBpdGVyYXRlKFByb2Nlc3NFbGVtZW50SXRlbSBwYXJlbnRJdGVtLCBYbWxFbGVtZW50IHBhcmVudFhtbCwKLQkJCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nLCBpbnQgYWN0TGV2ZWwpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJT2JqZWN0IHBhcmVudE9iaiA9IHBhcmVudEl0ZW0ucmF3SXRlbTsKLQkJCQotCQlUaW1lciB0aW1lciA9IG51bGw7Ci0JCWlmIChkZWJ1ZyApewotCQkJdGltZXIgPSBuZXcgVGltZXIoKTsJCQkKLQkJfQotCQkKLQkJaWYgKHBhcmVudE9iaiBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBwYXJlbnRPYmo7Ci0JCX0gZWxzZSB7Ci0JCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHNldHRpbmcuYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCXBhcmVudE9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCi0JCS8vIEVpdGhlciBkZWxlZ2F0ZSB0aGUgY2FsbCBvciByZXR1cm4gbm90aGluZy4KLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLS8vCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKHBhcmVudE9iaiwKLS8vCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLCBwcm92aWRlcik7Ci0vLwkJCXBhcmVudFhtbC5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZGlzcGxheU5hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vTGlzdCB1bmlxdWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJQ29sbGVjdGlvbiBpdGVtcyA9IHByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudE9iaik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCByYXdpdGVtID0gaXQubmV4dCgpOwotCi0JCQkJTWV0aG9kRWxlbWVudCBpdGVtID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsCi0JCQkJCQkudW53cmFwKHJhd2l0ZW0pOwotCi0JCQkJaWYgKCBzZXR0aW5nLnNob3dUYXNrT25seSAmJiAoYWN0TGV2ZWwgPiBBQ1RJVklUWV9TSE9XX0xFVkVMKQotCQkJCQkJJiYgIShpdGVtIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgaXRlbSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKCBpdGVtID09IG51bGwgKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBhZGQgdGhlIGVsZW1lbnQgdG8gdGhlIHJlZmVyZW5jZSBsaXN0LCAKLQkJCQkvLyB0aGlzIGlzIGZvciBwdWJsaXNoaW5nIG9ubHksIGZvciBicm93c2luZywgdGhpcyBjYWxsIGRvZXMgbm90aGluZwotCQkJCWdldExheW91dE1ncigpLmdldFZhbGlkYXRvcigpLmFkZFJlZmVyZW5jZWRFbGVtZW50KHN1cGVyLmVsZW1lbnQsIGl0ZW0pOwotCQkJCQotCQkJCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0ocmF3aXRlbSwgaXRlbSwgcGFyZW50SXRlbSk7Ci0KLQkJCQkvLyBQcm9jZXNzIFB1Ymxpc2hpbmc6IFJlcGxhY2Ugcm9sZSBkZXNjcmlwdG9yCi0JCQkJLy8gd2l0aCBjb21wb3NpdGUgcm9sZQotCQkJCS8vIGlmIGl0IGNvbnRhaW5zIHRoZSByb2xlIGRlc2NyaXB0b3IgZHVyaW5nIHByZXZpZXcvcHVibGlzaGluZwotCQkJCS8vIHNvIGlmIHRoaXMgZ3V5IGlzIGEgUm9sZURlc2NycHRvciwgZmluZCB0aGUgY29tcG9zaXRlIHJvbGUKLQkJCQkvLyBkZXNjcmlwdG9yIHdpdGhpbiB0aGUgc2NvcGUKLQkJCQkvLyAKLQkJCQlpZiAoKHBhcmVudE9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5ICYmIHNldHRpbmcuY3JzICE9IG51bGwpCi0JCQkJCQkmJiAoaXRlbSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSkgewotCQkJCQlDb21wb3NpdGVSb2xlIGNyID0gc2V0dGluZy5jcnMuZ2V0Q29tcG9zaXRlUm9sZSgKLQkJCQkJCQkoQWN0aXZpdHkpIHBhcmVudE9iaiwgKFJvbGVEZXNjcmlwdG9yKSBpdGVtKTsKLQkJCQkJaWYgKGNyICE9IG51bGwpIHsKLQkJCQkJCWl0ZW0gPSBjcjsKLQkJCQkJfQotCQkJCX0KLQotCQkJCVhtbEVsZW1lbnQgY2hpbGQgPSBnZW5lcmF0ZUNoaWxkWG1sKGVsZW1lbnRJdGVtLCBwYXJlbnRYbWwsIHNldHRpbmcpOwotCQkJCQkKLQkJCQlwYXJlbnRYbWwuYWRkQ2hpbGQoY2hpbGQpOwotCQkJCQkJCQkJCi0JCQkJLy8gc2hvdyBvbmx5IHRhc2sgdGFzayBkZXNjcmlwdG9ycyBmb3Igc3ViIGFjdGl2aXRpZXMgaW4gdGhlIHRicyBsYXlvdXQKLQkJCQlpZiAoIHNldHRpbmcuc2hvd1Rhc2tPbmx5ICYmIChhY3RMZXZlbCA+IEFDVElWSVRZX1NIT1dfTEVWRUwpICYmICEoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5ICkpIHsKLQkJCQkJLy8gaWYgYWN0IGxldmVsID4gMCwgb25seSBpdGVyYXRlIHRoZSBzdWItYWN0aXZpdGllcwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gaW5ldGVyYXRlIGNoaWxkcmVuLCBub3QganVzdCBhY3Rpdml0eSwgYW55IGNoaWxkIGluIHRoZQotCQkJCS8vIHJhd2l0ZW0gc2hvdWxkIGJlIGl0ZXJhdGVkLAotCQkJCS8vIHN1Y2ggYXMgdGhlIHN1Yi1hcnRpZmFjdHMKLQkJCQlpdGVyYXRlKGVsZW1lbnRJdGVtLCBjaGlsZCwgc2V0dGluZywgCi0JCQkJCQkoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSA/IGFjdExldmVsKzEgOiBhY3RMZXZlbCk7CQkJCQotCQkJfQotCQl9Ci0JCQotCQlpZiAoIHRpbWVyICE9IG51bGwgKSB7Ci0JCQl0aW1lci5zdG9wKCk7CQotCQkJaWYgKHRpbWVyLmdldFRpbWUoKSA+IDEwMCkgewotCQkJCVN0cmluZyBtc2cgPSB0aW1lci5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBpdGVyYXRpbmcgYnJlYWtkb3duIGl0ZW0gIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHBhcmVudEl0ZW0uZWxlbWVudCkgIDsgLy8kTk9OLU5MUy0xJCAJCQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBYbWxFbGVtZW50IGdlbmVyYXRlQ2hpbGRYbWwoUHJvY2Vzc0VsZW1lbnRJdGVtIGVsZW1lbnRJdGVtLCBYbWxFbGVtZW50IHBhcmVudFhtbCwKLQkJCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nKQotCXsKLQkJVGltZXIgdGltZXIgPSBudWxsOwotCQlpZiAoZGVidWcgKXsKLQkJCXRpbWVyID0gbmV3IFRpbWVyKCk7CQkJCi0JCX0KLQkJCi0JCU1ldGhvZEVsZW1lbnQgaXRlbSA9IGVsZW1lbnRJdGVtLmVsZW1lbnQ7Ci0JCQotCQlJRWxlbWVudExheW91dCBsID0gZ2V0TGF5b3V0KGVsZW1lbnRJdGVtKTsKLQkKLQkJLy8gbGF0IHRoZSBwcmVzZW50YXRpb24gdG8gZGV0ZXJtaW5lIHdoZW4gdG8gc2hvdwotCQkvLyBzZXQgZ2VuZXJhdGUgdGhlIGZsYWcgZm9yIGJyb3dzaW5nCi0JCWJvb2xlYW4gaXNTdXByZXNzZWQgPSBzZXR0aW5nLnN1cC5pc1N1cHByZXNzZWQoZWxlbWVudEl0ZW0ucmF3SXRlbSk7Ci0JCWlmICggaXNTdXByZXNzZWQgKSB7Ci0JCQlpdGVtRGV0YWlsLmFkZFN1cHByZXNzZWQoZWxlbWVudEl0ZW0uZWxlbWVudCk7Ci0JCX0KLQkJCi0JCVhtbEVsZW1lbnQgY2hpbGQgPSBsLmdldFhtbEVsZW1lbnQoZmFsc2UpOwotCi0JCS8vIHdlIHN0aWxsIGdlbmVyYXRlIHRoZSBpdGVtIGV2ZW4gdGhvdWdoIGl0J3Mgc3VwcHJlc3NlZCwgCi0JCS8vIGxldCB0aGUgbGF5b3V0IGphdmFzY3JpcHQgdG8gaGFuZGxlIHRoZSBzaG93IG9yIGhpZGUKLQkJLy8gc2V0IHRoZSBpc1N1cHJlc3NlZCBmbGFnIGZvciBicm93c2luZyBtb2RlbCBvbmx5LAotCQkvLyBmb3IgcHVibGlzaGluZywgdGhlIGZsYWcgd2lsbCBiZSBnZWVucmF0ZWQgYW5kIHNhdmVkIGluIGEgc2VwZXJhdGVkIGpzIGZpbGUKLQkJLy8gcHVibGlzaGVkIGh0bWwgcGFnZXMgd2lsbCBnZXQgdGhlIGlzU3VwcmVzc2VkIGZsYWcgdmlhIGphdmFzY3JpcHQgbWV0aG9kLgotCQlpZiAoICFnZXRMYXlvdXRNZ3IoKS5pc1B1Ymxpc2hpbmdNb2RlKCkgKQotCQl7Ci0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoImlzU3VwcmVzc2VkIiwgKGlzU3VwcmVzc2VkID8gInRydWUiIDogImZhbHNlIikgKTsKLQkJfQotCQkKLQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZiAoZWxlbWVudEl0ZW0ucmF3SXRlbSBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGVsZW1lbnRJdGVtLnJhd0l0ZW07Ci0JCX0gZWxzZSB7Ci0JCQlhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgc2V0dGluZy5hZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoZWxlbWVudEl0ZW0uZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCTsKLQkJfQotCi0JCS8vIGdldCB0aGUgaW5kZXggYW5kIHByZWRlY2Vzc29yIGluZGVjZXMKLQkJaWYgKGVsZW1lbnRJdGVtLmVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlTdHJpbmcgaW5kZXggPSBnZXRJbmRleChhZGFwdGVyKTsKLQkJCVN0cmluZyBtb2RlbEluZm8gPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLCBhZGFwdGVyKTsKLQkJCVN0cmluZyB0ZWFtID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKGl0ZW0sCi0JCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMsIGFkYXB0ZXIpOwotCQkJU3RyaW5nIHByZWZpeCA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwgYWRhcHRlcik7CQkJCi0JCQlTdHJpbmcgaXNFdmVudERyaXZlbiA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTiwgYWRhcHRlcik7Ci0JCQlTdHJpbmcgaXNPbmdvaW5nID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKGl0ZW0sCi0JCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORywgYWRhcHRlcik7Ci0JCQlTdHJpbmcgaXNPcHRpb25hbCA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMLCBhZGFwdGVyKTsKLQkJCVN0cmluZyBpc1BsYW5uZWQgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVELCBhZGFwdGVyKTsKLQkJCVN0cmluZyBpc1JlcGVhdGFibGUgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFLCBhZGFwdGVyKTsKLQkJCVN0cmluZyBoYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gUHJvY2Vzc1V0aWwKLQkJCQkJLmdldEF0dHJpYnV0ZSgKLQkJCQkJCQlpdGVtLAotCQkJCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLAotCQkJCQkJCWFkYXB0ZXIpOwotCQkJCi0JCQlTdHJpbmcgZGlzcGxheU5hbWUgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwgYWRhcHRlcik7Ci0JCQkKLQkJCVN0cmluZyBtTmFtZSA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsIGFkYXB0ZXIpOwotCi0JCQkvLyBmb3IgV0JTIGxheW91dCB3ZSBwdXQgdGhlIHN0cmluZyBpbnRvIGphdmFzY3JpcHQgdmFyaWFibGVzCi0JCQkvLyBzbyBuZWVkIHRvIGVzY2FwZSB0aGUgcXVvdGVzICIgYW5kICcKLQkJCWlmICggc2V0dGluZy5lc2NhcGVTdHJpbmcgKQotCQkJewotCQkJCW1vZGVsSW5mbyA9IFN0clV0aWwuZXNjYXBlKG1vZGVsSW5mbyk7Ci0JCQkJZGlzcGxheU5hbWUgPSBTdHJVdGlsLmVzY2FwZShkaXNwbGF5TmFtZSk7Ci0JCQkJbU5hbWUgPSBTdHJVdGlsLmVzY2FwZShtTmFtZSk7Ci0JCQkJCi0JCQkJLy8gYW5kIHRoZSB1cmwKLQkJCQkvLyBuZWVkIGFuIGVzY2FwZWQgdXJsIGZvciBqYXZhc2NyaXB0Ci0JCQkJU3RyaW5nIGpzRXNjYXBlZFVybCA9IFN0clV0aWwuZXNjYXBlKGwuZ2V0VXJsKCkpOwotCQkJCWNoaWxkLnNldEF0dHJpYnV0ZSgiVXJsIiwganNFc2NhcGVkVXJsKTsKLQotCQkJfQotCQkJCi0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoIkluZGV4IiwgaW5kZXgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiTW9kZWxJbmZvIiwgbW9kZWxJbmZvKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIlRlYW0iLCB0ZWFtKTsgLy8kTk9OLU5MUy0xJAotCi0JCQljaGlsZC5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgInByZWZpeCIpLnNldFZhbHVlKHByZWZpeCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkKLQkJCWNoaWxkCi0JCQkJCS5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgImlzRXZlbnREcml2ZW4iKS5zZXRWYWx1ZShpc0V2ZW50RHJpdmVuKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0JCQljaGlsZAotCQkJCQkubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJpc09uZ29pbmciKS5zZXRWYWx1ZShpc09uZ29pbmcpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCWNoaWxkCi0JCQkJCS5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgImlzT3B0aW9uYWwiKS5zZXRWYWx1ZShpc09wdGlvbmFsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0JCQljaGlsZAotCQkJCQkubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJpc1BsYW5uZWQiKS5zZXRWYWx1ZShpc1BsYW5uZWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCWNoaWxkCi0JCQkJCS5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgImlzUmVwZWF0YWJsZSIpLnNldFZhbHVlKGlzUmVwZWF0YWJsZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJY2hpbGQKLQkJCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIpLnNldFZhbHVlKGhhc011bHRpcGxlT2NjdXJyZW5jZXMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQotCQkJY2hpbGQuc2V0QXR0cmlidXRlKCJEaXNwbGF5TmFtZSIsIFhNTFV0aWwuZXNjYXBlKGRpc3BsYXlOYW1lKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkLnNldEF0dHJpYnV0ZSgiTmFtZSIsIFhNTFV0aWwuZXNjYXBlKG1OYW1lKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChpdGVtIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlTdHJpbmcgZW50cnlTdGF0ZSA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlKGl0ZW0sIElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUpOwotCQkJU3RyaW5nIGV4aXRTdGF0ZSA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlKGl0ZW0sIElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURSk7Ci0JCQlTdHJpbmcgZGVsaXZlcmFibGUgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZShpdGVtLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFKTsKLQotCQkJY2hpbGQuc2V0QXR0cmlidXRlKCJFbnRyeVN0YXRlIiwgZW50cnlTdGF0ZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJFeGl0U3RhdGUiLCBleGl0U3RhdGUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiRGVsaXZlcmFibGUiLCBkZWxpdmVyYWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChpdGVtIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCVN0cmluZyBwcmVkZWNlc3NvcnMgPSBnZXRQcmVkZWNlc3NvcnMoYWRhcHRlciwKLQkJCQkJc2V0dGluZy5zdXApOwotCQkJY2hpbGQuc2V0QXR0cmlidXRlKCJQcmVkZWNlc3NvcnMiLCBwcmVkZWNlc3NvcnMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBpZiBpdCdzIGEgdGFzayBkZXNjcmlwdG9yLCBnZXQgdGhlIHN0ZXBzCi0JCWlmIChpdGVtIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQotCQkJWG1sRWxlbWVudCBzdGVwc1htbCA9IGNoaWxkLm5ld0NoaWxkKCJTdGVwcyIpOyAvLyROT04tTkxTLTEkCi0JCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaXRlbTsKLQkJCUxpc3Qgc2VsU3RlcHMgPSB0ZC5nZXRTZWxlY3RlZFN0ZXBzKCk7Ci0JCQlUYXNrIHQgPSAoVGFzaykgQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodGQuZ2V0VGFzaygpLAotCQkJCQkJCWdldExheW91dE1ncigpLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQlpZiAodCAhPSBudWxsKSB7Ci0JCQkJTGlzdCBzdGVwcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCS5jYWxjMG5GZWF0dXJlVmFsdWUodCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFRhc2tfU3RlcHMoKSwgZ2V0TGF5b3V0TWdyKCkKLQkJCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0ZXBzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBzdGVwID0gc3RlcHMuZ2V0KGkpOwotCQkJCQlib29sZWFuIHNlbGVjdGVkID0gc2VsU3RlcHMuY29udGFpbnMoc3RlcCk7Ci0JCQkJCXN0ZXBzWG1sCi0JCQkJCQkJLm5ld0NoaWxkKCJTdGVwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkJCQkiaW5kZXgiLCBJbnRlZ2VyLnRvU3RyaW5nKGkpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJCSJzZWxlY3RlZCIsIHNlbGVjdGVkID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJfQotCi0JCX0KLQotCQkvLyBidWlsZCB0aGUgdGVhbSBwcm9maWxlIHRyZWUuCi0JCS8vIFRoaXMgaXMgYSB0ZW1wb3JhcnkgcmVwbGFjZW1lbnQgZm9yIHRoZSB0ZWFtIGJyZWFrZG93bgotCQkvLyBzdHJ1Y3R1cmUgZGlhZ3JhbQotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQlUZWFtUHJvZmlsZSBzdXBlclRlYW0gPSAoKFRlYW1Qcm9maWxlKWl0ZW0pLmdldFN1cGVyVGVhbSgpOwotCQkJY2hpbGQuc2V0QXR0cmlidXRlKCJoYXNTdXBlclRlYW0iLCAoc3VwZXJUZWFtICE9IG51bGwpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQkvLyBpZiByb2xlIHJvbGx1cCBpcyBzZXQsIGJ1aWxkIHRoZSByb2xlIHN1YiB0cmVlCi0JCWlmIChzZXR0aW5nLnJvbGx1cFJvbGVzICYmIGl0ZW0gaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJYnVpbGRSb2xlUm9sbHVwKChSb2xlRGVzY3JpcHRvcikgaXRlbSwgY2hpbGQsIHNldHRpbmcpOwotCQl9Ci0JCQotCQlpZiAoIHRpbWVyICE9IG51bGwgKSB7Ci0JCQl0aW1lci5zdG9wKCk7CQotCQkJaWYgKHRpbWVyLmdldFRpbWUoKSA+IDEwMCkgewotCQkJCVN0cmluZyBtc2cgPSB0aW1lci5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBnZW5lcmF0aW5nIHhtbCBmb3IgYnJlYWtkb3duIGl0ZW0gIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnRJdGVtLmVsZW1lbnQpICA7IC8vJE5PTi1OTFMtMSQgCQkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGNoaWxkOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRSb2xlUm9sbHVwKFJvbGVEZXNjcmlwdG9yIHJvbGVJdGVtLCBYbWxFbGVtZW50IHBhcmVudFhtbCwKLQkJCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nKSB7Ci0JCVJvbGUgciA9IHJvbGVJdGVtLmdldFJvbGUoKTsKLQkJTGlzdCBkZXNjcmlwdG9ycyA9IGl0ZW1EZXRhaWwuZ2V0RGVzY3JpcHRvcnMocik7Ci0JCWlmICggZGVzY3JpcHRvcnMgPT0gbnVsbCApIHsKLQkJCWRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWlmICggIWRlc2NyaXB0b3JzLmNvbnRhaW5zKHJvbGVJdGVtKSApIHsKLQkJCWRlc2NyaXB0b3JzLmFkZChyb2xlSXRlbSk7Ci0JCX0KLQkJCi0JCUxpc3QgcmVzcG9uc2libGVGb3IgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbW9kaWZpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcHJpbWFyeVRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGFkZGl0aW9uYWxUYXNrcyA9IG5ldyBBcnJheUxpc3QoKTsJCi0JCUxpc3QgaXRlbXM7Ci0JCQotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGRlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkKLQkJCXJvbGVJdGVtID0gKFJvbGVEZXNjcmlwdG9yKSBpdC5uZXh0KCk7Ci0JCQkKLQkJCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocm9sZUl0ZW0sCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksIAotCQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlyZXNwb25zaWJsZUZvci5hZGRBbGwoaXRlbXMpOwotCQkJCQotCQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyb2xlSXRlbSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfTW9kaWZpZXMoKSwgZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJbW9kaWZpZXMuYWRkQWxsKGl0ZW1zKTsKLQkJCQotCQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyb2xlSXRlbSwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9ycywKLQkJCQkJZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJcHJpbWFyeVRhc2tzLmFkZEFsbChpdGVtcyk7Ci0JCQkKLQkJCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocm9sZUl0ZW0sCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX0FkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMsIAotCQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRpdGlvbmFsVGFza3MuYWRkQWxsKGl0ZW1zKTsKLQkJfQotCQkKLQkJQ29sbGVjdGlvbnMuc29ydChyZXNwb25zaWJsZUZvciwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCWNyZWF0ZVJvbGVSb2xsdXBOb2RlcyhwYXJlbnRYbWwsIHJlc3BvbnNpYmxlRm9yLCBUbmdVdGlsCi0JCQkJLmdldEZlYXR1cmVUZXh0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkpKTsKLQotCQlDb2xsZWN0aW9ucy5zb3J0KG1vZGlmaWVzLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJY3JlYXRlUm9sZVJvbGx1cE5vZGVzKHBhcmVudFhtbCwgbW9kaWZpZXMsIFRuZ1V0aWwKLQkJCQkuZ2V0RmVhdHVyZVRleHQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfTW9kaWZpZXMoKSkpOwotCi0JCUNvbGxlY3Rpb25zLnNvcnQocHJpbWFyeVRhc2tzLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJY3JlYXRlUm9sZVJvbGx1cE5vZGVzKHBhcmVudFhtbCwgcHJpbWFyeVRhc2tzLCAKLQkJCQlMaWJyYXJ5UmVzb3VyY2VzLkFjdGl2aXR5TGF5b3V0X3ByaW1hcnlUYXNrc190ZXh0KTsgCi0KLQkJQ29sbGVjdGlvbnMuc29ydChhZGRpdGlvbmFsVGFza3MsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQljcmVhdGVSb2xlUm9sbHVwTm9kZXMocGFyZW50WG1sLCBhZGRpdGlvbmFsVGFza3MsIAotCQkJCUxpYnJhcnlSZXNvdXJjZXMuQWN0aXZpdHlMYXlvdXRfYWRkaXRpb25hbFRhc2tzX3RleHQpOyAKLQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUm9sZVJvbGx1cE5vZGVzKFhtbEVsZW1lbnQgcGFyZW50WG1sLCBMaXN0IGl0ZW1zLAotCQkJU3RyaW5nIGluZm8pIHsKLQkJCi0JCS8vIDE2MDE4OCAtIFB1Ymxpc2hlZCBUZWFtIEFsbG9jYXRpb24gdGFiIHNob3dzIHJlZHVuZGFudCBpbmZvcm1hdGlvbgotCQkvLyBvbmx5IHNob3cgb25lIGRlc2NyaXB0b3IgaWYgbW9yZSB0aGFuIG9uZSBhcmUgbGlua2VkIHRvIHRoZSBzYW1lIHRhc2sgb3Igd3AuCi0JCS8vIHNvIGtlZXAgdGhlIHByb2Nlc3NlZCB0YXNrIGFuZCB3cCBpbnN0ZWFkIG9mIHRoZSBkZXNjcmlwdG9ycwotCQlMaXN0IHByb2Nlc3NlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTWV0aG9kRWxlbWVudCBsaW5rZWQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCWxpbmtlZCA9IG51bGw7Ci0JCQlpZiAoIGUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvciApIHsKLQkJCQlsaW5rZWQgPSAoKFRhc2tEZXNjcmlwdG9yKWUpLmdldFRhc2soKTsKLQkJCX0gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgKSB7Ci0JCQkJbGlua2VkID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZSkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCX0KLQkJCWlmICggbGlua2VkID09IG51bGwgKSB7Ci0JCQkJbGlua2VkID0gZTsKLQkJCX0KLQkJCQotCQkJaWYgKCBwcm9jZXNzZWQuY29udGFpbnMobGlua2VkKSApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJcHJvY2Vzc2VkLmFkZChsaW5rZWQpOwotCQkJCi0JCQlJRWxlbWVudExheW91dCBsID0gbGF5b3V0TWFuYWdlci5nZXRMYXlvdXQoZSwgdHJ1ZSk7Ci0JCQlYbWxFbGVtZW50IGNoaWxkID0gbC5nZXRYbWxFbGVtZW50KGZhbHNlKTsKLQkJCWNoaWxkLnNldEF0dHJpYnV0ZSgiTW9kZWxJbmZvIiwgaW5mbyk7IC8vJE5PTi1OTFMtMSQKLQkJCXBhcmVudFhtbC5hZGRDaGlsZChjaGlsZCk7Ci0JCX0KLQotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZXgoSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIpIHsKLQkJLy8gSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBmYWN0b3J5LmFkYXB0KGUsCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7OwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBhZGFwdGVyLmdldElkKCk7Ci0JCQlpZiAoaW5kZXggPT0gMCkgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIEludGVnZXIudG9TdHJpbmcoaW5kZXgpOwotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZGVjZXNzb3JzKElCU0l0ZW1Qcm92aWRlciBhZGFwdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJLy8gSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBmYWN0b3J5LmFkYXB0KGUsCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7OwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlQcmVkZWNlc3Nvckxpc3QgbGlzdCA9IGFkYXB0ZXIuZ2V0UHJlZGVjZXNzb3JzKCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGxpc3QudG9VblN1cHByZXNzZWRTdHJpbmcoc3VwKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBjbGFzcyBDb21wb3NpdGVSb2xlcyB7Ci0JCS8vIGEgbWFwIG9mIGFjdGl2aXR5IHRvIENvbXBvc2l0ZVJvbGVJbmZvCi0JCU1hcCBpdGVtTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlwdWJsaWMgQ29tcG9zaXRlUm9sZXMoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCQlBY3Rpdml0eSBhY3QpIHsKLQkJCXNjYW4oYWRhcHRlckZhY3RvcnksIG51bGwsIGFjdCk7Ci0JCX0KLQotCQlwcml2YXRlIENvbXBvc2l0ZVJvbGVJbmZvIGdldENvbXBvc2l0ZVJvbGVJbmZvKEFjdGl2aXR5IHBhcmVudCwKLQkJCQlBY3Rpdml0eSBhY3QpIHsKLQkJCUNvbXBvc2l0ZVJvbGVJbmZvIGluZm8gPSAoQ29tcG9zaXRlUm9sZUluZm8pIGl0ZW1NYXAuZ2V0KGFjdCk7Ci0JCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJaW5mbyA9IG5ldyBDb21wb3NpdGVSb2xlSW5mbyhwYXJlbnQsIGFjdCk7Ci0JCQkJaXRlbU1hcC5wdXQoYWN0LCBpbmZvKTsKLQkJCX0KLQotCQkJcmV0dXJuIGluZm87Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgc2NhbihDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJCUFjdGl2aXR5IHBhcmVudCwgQWN0aXZpdHkgYWN0KSB7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoYWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlDb2xsZWN0aW9uIGl0ZW1zID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4oYWN0KTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlNZXRob2RFbGVtZW50IGl0ZW0gPSAoTWV0aG9kRWxlbWVudCkgTGlicmFyeVV0aWwudW53cmFwKGl0Ci0JCQkJCQkJLm5leHQoKSk7Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJCQkJZ2V0Q29tcG9zaXRlUm9sZUluZm8ocGFyZW50LCBhY3QpLmFkZENvbXBvc2l0ZVJvbGUoCi0JCQkJCQkJCShDb21wb3NpdGVSb2xlKSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCXNjYW4oYWRhcHRlckZhY3RvcnksIGFjdCwgKEFjdGl2aXR5KSBpdGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBmaW5kIHRoZSBjb21wb3NpdGUgcm9sZSBmb3IgdGhlIHJvbGUgZGVzY3JpcHRvciBmcm9tIHRoZSBhY3Rpdml0eSBhbmQKLQkJICogaXQncyBwYXJlbnRzLCByZXR1cm4gbnVsbCBpZiBub3QgZm91bmQKLQkJICogCi0JCSAqIEBwYXJhbSBhY3Rpdml0eQotCQkgKiBAcGFyYW0gaXRlbQotCQkgKiBAcmV0dXJuIFJvbGVEZXNjcmlwdG9yCi0JCSAqLwotCQlwcml2YXRlIENvbXBvc2l0ZVJvbGUgZ2V0Q29tcG9zaXRlUm9sZShBY3Rpdml0eSBhY3Rpdml0eSwKLQkJCQlSb2xlRGVzY3JpcHRvciBpdGVtKSB7Ci0JCQkvLyBpdGVyYXRlIHRoZSBicmVha2Rvd24gZWxlbWVudHMsCi0JCQkvLyBpZiB0aGVyZSBpcyBhIGNvbXBvc2l0ZSByb2xlIHRoYXQgY29udGFpbnMgdGhlIHJvbGUsIHJldHVybiB0aGUKLQkJCS8vIGNvbXBvc2l0ZSwKLQkJCS8vIGlmIG5vdCwgZmluZCBpbiB0aGUgcGFyZW50IGFjdGl2aXR5Ci0KLQkJCWlmIChhY3Rpdml0eSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCUNvbXBvc2l0ZVJvbGUgZGVzYyA9IG51bGw7Ci0JCQlDb21wb3NpdGVSb2xlSW5mbyBpbmZvID0gKENvbXBvc2l0ZVJvbGVJbmZvKSBpdGVtTWFwLmdldChhY3Rpdml0eSk7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJZGVzYyA9IGluZm8uZ2V0Q29tcG9zaXRlUm9sZShpdGVtKTsKLQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkZXNjOwotCQkJCX0KLQotCQkJCXJldHVybiBnZXRDb21wb3NpdGVSb2xlKGluZm8uZ2V0UGFyZW50QWN0aXZpdHkoKSwgaXRlbSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIENvbXBvc2l0ZVJvbGVJbmZvIHsKLQkJQWN0aXZpdHkgcGFyZW50OwotCi0JCUFjdGl2aXR5IG93bmVyOwotCi0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIENvbXBvc2l0ZVJvbGVJbmZvKEFjdGl2aXR5IHBhcmVudCwgQWN0aXZpdHkgb3duZXIpIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZENvbXBvc2l0ZVJvbGUoQ29tcG9zaXRlUm9sZSBlKSB7Ci0JCQlpZiAoIWl0ZW1zLmNvbnRhaW5zKGUpKSB7Ci0JCQkJaXRlbXMuYWRkKGUpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBBY3Rpdml0eSBnZXRQYXJlbnRBY3Rpdml0eSgpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQotCQlwcml2YXRlIENvbXBvc2l0ZVJvbGUgZ2V0Q29tcG9zaXRlUm9sZShSb2xlRGVzY3JpcHRvciBpdGVtKSB7Ci0JCQlpZiAoaXRlbXMuc2l6ZSgpID09IDApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJUm9sZSByID0gaXRlbS5nZXRSb2xlKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUNvbXBvc2l0ZVJvbGUgY3IgPSAoQ29tcG9zaXRlUm9sZSkgaXQubmV4dCgpOwotCQkJCWlmIChjci5nZXRBZ2dyZWdhdGVkUm9sZXMoKS5jb250YWlucyhyKSkgewotCQkJCQlyZXR1cm4gY3I7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBBY3Rpdml0eUxheW91dFNldHRpbmcgewotCQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCQlwdWJsaWMgQ29tcG9zaXRlUm9sZXMgY3JzOwotCi0JCXB1YmxpYyBTdXBwcmVzc2lvbiBzdXA7Ci0KLQkJYm9vbGVhbiByb2xsdXBSb2xlcyA9IGZhbHNlOwotCi0JCXB1YmxpYyBib29sZWFuIGVzY2FwZVN0cmluZyA9IGZhbHNlOwotCQkKLQkJLy8gc2V0IHRvIHNob3cgdGFzayBvbmx5IGZvciBzdWIgYWN0aXZpdGllcwotCQkvLyB0aGlzIG9ubHkgYXBwbHkgdG8gQ0JTIGxheW91dAotCQlwdWJsaWMgYm9vbGVhbiBzaG93VGFza09ubHkgPSBmYWxzZTsKLQkJCi0JCXB1YmxpYyBBY3Rpdml0eUxheW91dFNldHRpbmcoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCQlDb21wb3NpdGVSb2xlcyBjcnMsIFN1cHByZXNzaW9uIHN1cCkgewotCQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQkJdGhpcy5jcnMgPSBjcnM7Ci0JCQl0aGlzLnN1cCA9IHN1cDsKLQotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIFRCU0l0ZW1EZXRhaWwgewotCQkKLQkJLy8gcmVjb3JkIHRoZSBzdXBwcmVzc2VkIGl0ZW1zCi0JCUxpc3Qgc3VwcHJlc3NlZEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJLy8gbWFwIG9mIHJvbGUgdG8gcm9sZSBkZXNjcmlwdG9ycwotCQlNYXAgcm9sZURlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJcHVibGljIFRCU0l0ZW1EZXRhaWwoKSB7Ci0JCQkKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkU3VwcHJlc3NlZChPYmplY3QgaXRlbSkgewotCQkJaWYgKCAhc3VwcHJlc3NlZEl0ZW1zLmNvbnRhaW5zKGl0ZW0pICkgewotCQkJCXN1cHByZXNzZWRJdGVtcy5hZGQoaXRlbSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGl0ZXJhdGUoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IHBhcmVudE9iaikgewotCQkKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0JCQlpZiAocGFyZW50T2JqIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBwYXJlbnRPYmo7Ci0JCQl9IGVsc2UgewotCQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCQlwYXJlbnRPYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQl9Ci0KLQkJCS8vIEVpdGhlciBkZWxlZ2F0ZSB0aGUgY2FsbCBvciByZXR1cm4gbm90aGluZy4KLQkJCWlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCQotCQkJQ29sbGVjdGlvbiBpdGVtcyA9IHByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudE9iaik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCByYXdpdGVtID0gaXQubmV4dCgpOwotCi0JCQkJTWV0aG9kRWxlbWVudCBpdGVtID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsLnVud3JhcChyYXdpdGVtKTsKLQkJCQlpZiAoIGl0ZW0gaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvciApIHsKLQkJCQkJYWRkUm9sZURlc2NyaXB0b3IoIChSb2xlRGVzY3JpcHRvcilpdGVtICk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaXRlcmF0ZShhZGFwdGVyRmFjdG9yeSwgcmF3aXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkKLQkJcHJpdmF0ZSB2b2lkIGFkZFJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIHJkZXNjKSB7Ci0JCQlSb2xlIHIgPSByZGVzYy5nZXRSb2xlKCk7Ci0JCQlpZiAociAhPSBudWxsICkgewotCQkJCUxpc3QgaXRlbXMgPSAoTGlzdClyb2xlRGVzY3JpcHRvck1hcC5nZXQocik7Ci0JCQkJaWYgKCBpdGVtcyA9PSBudWxsICkgewotCQkJCQlpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJcm9sZURlc2NyaXB0b3JNYXAucHV0KHIsIGl0ZW1zKTsKLQkJCQkJaWYgKGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBZGRlZCBSb2xlRGVzY3JpcHRvciAiICsgcmRlc2MuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoICFpdGVtcy5jb250YWlucyhyZGVzYykgKSB7Ci0JCQkJCWl0ZW1zLmFkZChyZGVzYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdG9ycyhSb2xlIHIpIHsKLQkJCXJldHVybiAoTGlzdClyb2xlRGVzY3JpcHRvck1hcC5nZXQocik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogbG9hZCB0aGUgcHJvY2VzcyBzcGVjaWZpYyBsYXlvdXQgZGF0YSBmb3IgcHVibGlzaGluZy4KLQkgKiBicm93c2luZyBkb2VzIG5vdCBuZWVkIHRoaXMgc2luY2UgaXQncyBnZW5lcmF0ZWQgb24gdGhlIGZseQotCSAqIEBwYXJhbSBwcm9jX2RhdGEKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkTGF5b3V0RGF0YShQcm9jZXNzTGF5b3V0RGF0YSBwcm9jX2RhdGEpCi0JewotCQlUaW1lciB0ID0gbmV3IFRpbWVyKCk7CQkKLQotCQlBY3Rpdml0eUxheW91dERhdGEgYWN0X2RhdGEgPSBwcm9jX2RhdGEuY3JlYXRlQWN0aXZpdHlMYXVvdXREYXRhKHRoaXMuZWxlbWVudFByb2Nlc3NQYXRoKTsKLQkJCi0JCS8vIGl0ZXJhdGUgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIGNvbGxlY3QgdGhlIGluZm8uCi0JCVByb2Nlc3MgcHJvYyA9IGdldE93bmluZ1Byb2Nlc3MoKTsKLQkJaWYgKCBwcm9jID09IHRoaXMuZWxlbWVudCApIHsKLQkJCXN1cENvdW50ID0gMDsKLQkJfQotCQkKLQkJLy8gbmVlZCB0byBoYW5kbGUgdGhlIHN1cHJlc3NlZCBicmVha2Rvd24gZWxlbWVudHMKLQkJLy8gdXNlIHRoZSBTdXByZXNzIHV0aWxpdHkKLQkJU3VwcHJlc3Npb24gc3VwID0gZ2V0U3VwcHJlc3Npb24ocHJvYyk7Ci0KLQkJLy8gbmVlZCB0byBpbnRlcmF0ZSB0aGUgMyBsYXlvdXQgc3RydWN0dXJlIHNpY25lIHRoZWlyIHBhdGggaXMgZGlmZmVyZW50Ci0JCWxvYWRXQlNMYXlvdXREYXRhKGFjdF9kYXRhLCBzdXApOwotCQlsb2FkVEJTTGF5b3V0RGF0YShhY3RfZGF0YSwgc3VwKTsKLQkJbG9hZFdQQlNMYXlvdXREYXRhKGFjdF9kYXRhLCBzdXApOwotCQkKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCXQuc3RvcCgpOwotCQkJU3RyaW5nIG1zZyA9IHQuZ2V0VGltZSgpCi0JCQkJCSsgIiBtaW5pLXNlY29uZChzKSBsb2FkaW5nIGxheW91dCBkYXRhIGZvciBwcm9jZXNzICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShwcm9jKSAvLyROT04tTkxTLTEkIC8KLQkJCQkJKyAiLCBhY3Rpdml0eTogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHN1cGVyLmVsZW1lbnQpOyAvLyROT04tTkxTLTEkIC8JCQkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkV0JTTGF5b3V0RGF0YShBY3Rpdml0eUxheW91dERhdGEgYWN0X2RhdGEsIFN1cHByZXNzaW9uIHN1cCkKLQl7Ci0JCS8vIHB1Ymxpc2ggdGhlIGNvbnNvbGlkYXRlZCB2aWV3Ci0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyCi0JCQkJLmdldENCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCUNvbXBvc2l0ZVJvbGVzIGNycyA9IG51bGw7IC8vbmV3IENvbXBvc2l0ZVJvbGVzKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIHN1cGVyLmVsZW1lbnQpOwotCi0JCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nID0gbmV3IEFjdGl2aXR5TGF5b3V0U2V0dGluZygKLQkJCQlhZGFwdGVyRmFjdG9yeSwgY3JzLCBzdXApOwotCi0JCS8vIG5lZWQgdG8gZ2V0IHRoZSByYXcgaXRlbSBwcm92aWRlciBmcm9tIHRoZSBhZGFwdGVyIGZhY3RvcnkKLQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHN1cGVyLnBhdGhzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmICggd3JhcHBlciA9PSBudWxsICkgewotCQkJd3JhcHBlciA9IHN1cGVyLmVsZW1lbnQ7Ci0JCX0KLQkJUHJvY2Vzc0VsZW1lbnRJdGVtIGVsZW1lbnRJdGVtID0gbmV3IFByb2Nlc3NFbGVtZW50SXRlbSh3cmFwcGVyLCBzdXBlci5lbGVtZW50LCBzdXBlci5lbGVtZW50UHJvY2Vzc1BhdGgpOwotCQlpdGVyYXRlUHJvY2Vzc0l0ZW0oZWxlbWVudEl0ZW0sIGFjdF9kYXRhLCBzZXR0aW5nKTsKLQotLy8JCS8vIGlmIHRoZXJlIGlzIG5vIHByb2Nlc3MtbG9jYWwgc3VwcmVzc2VkIGl0ZW0sIGRvbid0IGdlbmVyYXRlIGRpYWdyYW1zCi0JCS8vIG5vLCB0aGlzIHdpbGwgbm90IHdvcmssIHNpbmNlIHRoZSB0ZXh0IGNvbG9yIG9mZCB0aGUgZGlhZ3JhbSBpcyBncmVlbiwgaWYgdXNlIGJhc2UsIGl0J3MgYmxhY2suCi0JCS8vIHNvIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGRpYWdyYW0gbm8gbWF0dGVyIHdoYXQuCi0vLwkJaWYgKCAhYWN0X2RhdGEuaGFzTG9jYWxTdXBwcmVzc2VkKCkgKQotLy8JCXsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLQkJCi0JCVN0cmluZyBkaWFncmFtVHlwZSwgaW1nRmlsZTsKLQkJCi0JCS8vIG1ha2UgYSBzaG9ydCBwcmVmaXggZm9yIHRoZSBmaWxlIG5hbWUKLQkJU3RyaW5nIHByZWZpeCA9IEludGVnZXIudG9IZXhTdHJpbmcoc3VwZXIuZWxlbWVudFByb2Nlc3NQYXRoLmhhc2hDb2RlKCkpOwotCQkKLQkJZGlhZ3JhbVR5cGUgPSBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1c7Ci0JCWltZ0ZpbGUgPSBSZXNvdXJjZUhlbHBlci5nZXREaWFncmFtRmlsZVBhdGhOYW1lKGVsZW1lbnQsIHByZWZpeCArICJfIiArIGRpYWdyYW1UeXBlKTsKLQkJRGlhZ3JhbUluZm8gZGlhZ3JhbV93b3JrZmxvdyA9IGdlbmVyYXRlRGlhZ3JhbShzdXAsIGRpYWdyYW1UeXBlLCBpbWdGaWxlKTsJCi0JCWlmIChkaWFncmFtX3dvcmtmbG93ICE9IG51bGwKLQkJCQkmJiBkaWFncmFtX3dvcmtmbG93LmdldEltYWdlRmlsZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQlhY3RfZGF0YS5zZXRBY3Rpdml0eURpYWdyYW1QYXRoKGRpYWdyYW1fd29ya2Zsb3cuZ2V0SW1hZ2VGaWxlTmFtZSgpKTsKLQkJfQotCQkKLQkJZGlhZ3JhbVR5cGUgPSBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCQlpbWdGaWxlID0gUmVzb3VyY2VIZWxwZXIuZ2V0RGlhZ3JhbUZpbGVQYXRoTmFtZShlbGVtZW50LCBwcmVmaXggKyAiXyIgKyBkaWFncmFtVHlwZSk7Ci0JCURpYWdyYW1JbmZvIGRpYWdyYW1fZGV0YWlsID0gZ2VuZXJhdGVEaWFncmFtKHN1cCwgZGlhZ3JhbVR5cGUsIGltZ0ZpbGUpOwkKLQkJaWYgKGRpYWdyYW1fZGV0YWlsICE9IG51bGwgJiYgZGlhZ3JhbV9kZXRhaWwuZ2V0SW1hZ2VGaWxlTmFtZSgpICE9IG51bGwpIHsKLQkJCWFjdF9kYXRhLnNldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbVBhdGgoZGlhZ3JhbV9kZXRhaWwuZ2V0SW1hZ2VGaWxlTmFtZSgpKTsKLQkJfQotCi0JCWRpYWdyYW1UeXBlID0gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1k7Ci0JCWltZ0ZpbGUgPSBSZXNvdXJjZUhlbHBlci5nZXREaWFncmFtRmlsZVBhdGhOYW1lKGVsZW1lbnQsIHByZWZpeCArICJfIiArIGRpYWdyYW1UeXBlKTsKLQkJRGlhZ3JhbUluZm8gZGlhZ3JhbV93cCA9IGdlbmVyYXRlRGlhZ3JhbShzdXAsIGRpYWdyYW1UeXBlLCBpbWdGaWxlKTsJCi0JCWlmIChkaWFncmFtX3dwICE9IG51bGwgJiYgZGlhZ3JhbV93cC5nZXRJbWFnZUZpbGVOYW1lKCkgIT0gbnVsbCkgewotCQkJYWN0X2RhdGEuc2V0V1BEZXBlbmRlbmN5RGlhZ3JhbVBhdGgoZGlhZ3JhbV93cC5nZXRJbWFnZUZpbGVOYW1lKCkpOwotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRUQlNMYXlvdXREYXRhKEFjdGl2aXR5TGF5b3V0RGF0YSBhY3RfZGF0YSwgU3VwcHJlc3Npb24gc3VwKQotCXsKLQkJLy8gcHVibGlzaCB0aGUgY29uc29saWRhdGVkIHZpZXcKLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGxheW91dE1hbmFnZXIKLQkJCQkuZ2V0VEJTQWRhcHRlckZhY3RvcnkoKTsKLQkJQ29tcG9zaXRlUm9sZXMgY3JzID0gbnVsbDsgLy9uZXcgQ29tcG9zaXRlUm9sZXMoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgc3VwZXIuZWxlbWVudCk7Ci0KLQkJLy8gcm9vbHVwIHRoZSBsYXlvdXQKLQkJSUJTSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJc3VwZXIuZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJcHJvdmlkZXIuc2V0Um9sbGVkVXAodHJ1ZSk7Ci0KLQkJCi0JCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nID0gbmV3IEFjdGl2aXR5TGF5b3V0U2V0dGluZygKLQkJCQlhZGFwdGVyRmFjdG9yeSwgY3JzLCBzdXApOwotCQlzZXR0aW5nLnJvbGx1cFJvbGVzID0gdHJ1ZTsKLQotCQkKLQkJLy8gbmVlZCB0byBnZXQgdGhlIHJhdyBpdGVtIHByb3ZpZGVyIGZyb20gdGhlIGFkYXB0ZXIgZmFjdG9yeQotCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLQkJfQotCQlQcm9jZXNzRWxlbWVudEl0ZW0gZWxlbWVudEl0ZW0gPSBuZXcgUHJvY2Vzc0VsZW1lbnRJdGVtKHdyYXBwZXIsIHN1cGVyLmVsZW1lbnQsIHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCWl0ZXJhdGVQcm9jZXNzSXRlbShlbGVtZW50SXRlbSwgYWN0X2RhdGEsIHNldHRpbmcpOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkV1BCU0xheW91dERhdGEoQWN0aXZpdHlMYXlvdXREYXRhIGFjdF9kYXRhLCBTdXBwcmVzc2lvbiBzdXApCi0JewotCQkvLyBwdWJsaXNoIHRoZSBjb25zb2xpZGF0ZWQgdmlldwotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlcgotCQkJCS5nZXRXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQkJQ29tcG9zaXRlUm9sZXMgY3JzID0gbnVsbDsgLy9uZXcgQ29tcG9zaXRlUm9sZXMoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgc3VwZXIuZWxlbWVudCk7Ci0KLQkJLy8gcm9vbHVwIHRoZSBsYXlvdXQKLQkJSUJTSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJc3VwZXIuZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJcHJvdmlkZXIuc2V0Um9sbGVkVXAodHJ1ZSk7Ci0JCi0JCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nID0gbmV3IEFjdGl2aXR5TGF5b3V0U2V0dGluZygKLQkJCQlhZGFwdGVyRmFjdG9yeSwgY3JzLCBzdXApOwotCi0JCQotCQkvLyBuZWVkIHRvIGdldCB0aGUgcmF3IGl0ZW0gcHJvdmlkZXIgZnJvbSB0aGUgYWRhcHRlciBmYWN0b3J5Ci0JCU9iamVjdCB3cmFwcGVyID0gc3VwLmdldE9iamVjdEJ5UGF0aChzdXBlci5wYXRocywgYWRhcHRlckZhY3RvcnkpOwotCQlpZiAoIHdyYXBwZXIgPT0gbnVsbCApIHsKLQkJCXdyYXBwZXIgPSBzdXBlci5lbGVtZW50OwotCQl9Ci0JCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0od3JhcHBlciwgc3VwZXIuZWxlbWVudCwgc3VwZXIuZWxlbWVudFByb2Nlc3NQYXRoKTsKLQkJaXRlcmF0ZVByb2Nlc3NJdGVtKGVsZW1lbnRJdGVtLCBhY3RfZGF0YSwgc2V0dGluZyk7Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHN1cENvdW50ID0gMDsKLQkKLQlwcml2YXRlIHZvaWQgaXRlcmF0ZVByb2Nlc3NJdGVtKFByb2Nlc3NFbGVtZW50SXRlbSBwYXJlbnRJdGVtLCBBY3Rpdml0eUxheW91dERhdGEgYWN0X2RhdGEsIAotCQkJQWN0aXZpdHlMYXlvdXRTZXR0aW5nIHNldHRpbmcpIHsKLQkJCi0JCS8vU3RyaW5nIG1zZyA9ICIgLS0tIGl0ZXJhdGUgcHJvY2VzcyBpdGVtICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShwYXJlbnRJdGVtLmVsZW1lbnQpICsgIlsiICsgcGFyZW50SXRlbS5wYXRoICsgIl0iIDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCQkJCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJT2JqZWN0IHBhcmVudE9iaiA9IHBhcmVudEl0ZW0ucmF3SXRlbTsKLQkJCi0JCWlmIChwYXJlbnRPYmogaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50T2JqOwotCQl9IGVsc2UgewotCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBzZXR0aW5nLmFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQlwYXJlbnRPYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCX0KLQotCQkvLyBFaXRoZXIgZGVsZWdhdGUgdGhlIGNhbGwgb3IgcmV0dXJuIG5vdGhpbmcuCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50T2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHJhd2l0ZW0gPSBpdC5uZXh0KCk7CQkJCi0JCQkJCi0vLwkJCQkvLyBsYXQgdGhlIHByZXNlbnRhdGlvbiB0byBkZXRlcm1pbmUgd2hlbiB0byBzaG93Ci0vLwkJCQkvLyBzZXQgZ2VuZXJhdGUgdGhlIGZsYWcgZm9yIGJyb3dzaW5nCi0JCQkJYm9vbGVhbiBpc1N1cHJlc3NlZCA9IHNldHRpbmcuc3VwLmlzU3VwcHJlc3NlZChyYXdpdGVtKTsKLQkJCQlNZXRob2RFbGVtZW50IGl0ZW0gPSAoTWV0aG9kRWxlbWVudCkgTGlicmFyeVV0aWwKLQkJCQkJCS51bndyYXAocmF3aXRlbSk7Ci0JCQkJCQkJCQotCQkJCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0ocmF3aXRlbSwgaXRlbSwgcGFyZW50SXRlbSk7Ci0KLQkJCQlpZiAoZGVidWcgJiYgaXNTdXByZXNzZWQgKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic3VwcHJlc3NlZDogIiArICsrc3VwQ291bnQgKyAiIDogIiAKLQkJCQkJCQkrIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGl0ZW0pIAotCQkJCQkJCSsgIjogIiArIGVsZW1lbnRJdGVtLnBhdGgpOwotCQkJCQkKLQkJCQl9Ci0KLQkJCQlJRWxlbWVudExheW91dCBsID0gZ2V0TGF5b3V0KGVsZW1lbnRJdGVtKTsKLQkJCQlpZiAoIGwgaW5zdGFuY2VvZiBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0ICkKLQkJCQl7CQkKLQkJCQkJaWYgKCBpc1N1cHJlc3NlZCApCi0JCQkJCXsKLQkJCQkJCVN0cmluZyByZWxQYXRoID0gKChBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0KWwpLmdldFJlbGF0aXZlUHJvY2Vzc1BhdGgoKTsKLQkJCQkJCWFjdF9kYXRhLnNldFN1cHByZXNzZWQocmVsUGF0aCk7Ci0JCQkJCX0gCi0JCQkJCWVsc2UgCi0JCQkJCXsJCQkJCi0JCQkJCQkvLyBvbmx5IGl0ZXJhdGUgdW4tc3VwcHJlc3NlZCBpdGVtCi0JCQkJCQkvLyBpZiB0aGUgbGF5b3V0IGlzIGFuIGFjdGl2aXR5IGxheW91dCwgY29sbGVjdCB0aGUgbGF5b3V0IGRhdGEgZm9yIGl0Ci0JCQkJCQlpZiAoIGwgaW5zdGFuY2VvZiBBY3Rpdml0eUxheW91dCApCi0JCQkJCQl7Ci0JCQkJCQkJKChBY3Rpdml0eUxheW91dClsKS5sb2FkTGF5b3V0RGF0YShhY3RfZGF0YS5nZXRQcm9jZXNzTGF5b3V0RGF0YSgpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQkvLyBpbmV0ZXJhdGUgY2hpbGRyZW4sIG5vdCBqdXN0IGFjdGl2aXR5LCBhbnkgY2hpbGQgaW4gdGhlCi0JCQkJCQkJLy8gcmF3aXRlbSBzaG91bGQgYmUgaXRlcmF0ZWQsCi0JCQkJCQkJLy8gc3VjaCBhcyB0aGUgc3ViLWFydGlmYWN0cwotCQkJCQkJCWl0ZXJhdGVQcm9jZXNzSXRlbShlbGVtZW50SXRlbSwgYWN0X2RhdGEsIHNldHRpbmcpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQl9CQotCQotCS8qKgotCSAqIGdldCBhbGwgdGhlIGxpbmtlZCB0YXNrcywgcm9sZXMsIGFuZCB3b3JrcHJvZHVjdHMgZm9yIHRoaXMgYWN0aXZpdHkgYW5kIGFsbCBpdCdzIGJyZWFrZG93biBlbGVtZW50cywgcmVjdXJzaXZlbHkuCi0JICogdGhlIGVsZW1lbnQgZm91bmQgYXJlIG5vdGlmaWVkIHZpYSBJQ29udGVudFZhbGlkYXRvci5hZGRSZWZlcmVuY2VkRWxlbWVudCgpCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZmluZEFsbExpbmtlZEVsZW1lbnRzKCkgewotCQkvLyBpdGVyYXRlIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCBjb2xsZWN0IHRoZSBpbmZvLgotCQlQcm9jZXNzIHByb2MgPSBnZXRPd25pbmdQcm9jZXNzKCk7Ci0JCQotCQkvLyBuZWVkIHRvIGhhbmRsZSB0aGUgc3VwcmVzc2VkIGJyZWFrZG93biBlbGVtZW50cwotCQkvLyB1c2UgdGhlIFN1cHJlc3MgdXRpbGl0eQotCQlTdXBwcmVzc2lvbiBzdXAgPSBnZXRTdXBwcmVzc2lvbihwcm9jKTsKLQotCQkvLyBwdWJsaXNoIHRoZSBjb25zb2xpZGF0ZWQgdmlldwotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlcgotCQkJCS5nZXRDQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JCS8vIG5lZWQgdG8gZ2V0IHRoZSByYXcgaXRlbSBwcm92aWRlciBmcm9tIHRoZSBhZGFwdGVyIGZhY3RvcnkKLQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHN1cGVyLnBhdGhzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmICggd3JhcHBlciA9PSBudWxsICkgewotCQkJd3JhcHBlciA9IHN1cGVyLmVsZW1lbnQ7Ci0JCX0KLQkJCi0JCWdldExheW91dE1ncigpLmdldFZhbGlkYXRvcigpLmFkZFJlZmVyZW5jZWRFbGVtZW50KG51bGwsIHN1cGVyLmVsZW1lbnQpOwotCi0JCWl0ZXJhdGVJdGVtRm9yTGlua2VkRWxlbWVudHMod3JhcHBlciwgYWRhcHRlckZhY3RvcnksIHN1cCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdGVJdGVtRm9yTGlua2VkRWxlbWVudHMoT2JqZWN0IHBhcmVudE9iaiwgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotCQkKLQkJaWYgKHBhcmVudE9iaiBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBwYXJlbnRPYmo7Ci0JCX0gZWxzZSB7Ci0JCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQlwYXJlbnRPYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCX0KLQotCQkvLyBFaXRoZXIgZGVsZWdhdGUgdGhlIGNhbGwgb3IgcmV0dXJuIG5vdGhpbmcuCi0JCWlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUNvbGxlY3Rpb24gaXRlbXMgPSBwcm92aWRlci5nZXRDaGlsZHJlbihwYXJlbnRPYmopOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHJhd2l0ZW0gPSBpdC5uZXh0KCk7CQkJCi0JCQkKLQkJCWlmICggc3VwLmlzU3VwcHJlc3NlZChyYXdpdGVtKSApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJTWV0aG9kRWxlbWVudCBpdGVtID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsCi0JCQkJCS51bndyYXAocmF3aXRlbSk7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSBudWxsOwotCQkJaWYgKCBpdGVtIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IgKSB7Ci0JCQkJZSA9ICgoVGFza0Rlc2NyaXB0b3IpaXRlbSkuZ2V0VGFzaygpOwotCQkJfSBlbHNlIGlmICggaXRlbSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yICkgewotCQkJCWUgPSAoKFJvbGVEZXNjcmlwdG9yKWl0ZW0pLmdldFJvbGUoKTsKLQkJCX0gZWxzZSBpZiAoIGl0ZW0gaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgKSB7Ci0JCQkJZSA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWl0ZW0pLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQl9IAotCQkJCi0JCQlpZiAoIGUgIT0gbnVsbCApIHsKLQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRWYWxpZGF0b3IoKS5hZGRSZWZlcmVuY2VkRWxlbWVudChpdGVtLCBlKTsKLQkJCX0gCi0JCQkJCi0JCQlNZXRob2RFbGVtZW50IHBhcmVudCA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbC51bndyYXAocmF3aXRlbSk7Ci0JCQlnZXRMYXlvdXRNZ3IoKS5nZXRWYWxpZGF0b3IoKS5hZGRSZWZlcmVuY2VkRWxlbWVudChwYXJlbnQsIGl0ZW0pOwotCi0JCQlpdGVyYXRlSXRlbUZvckxpbmtlZEVsZW1lbnRzKHJhd2l0ZW0sIGFkYXB0ZXJGYWN0b3J5LCBzdXApOwotCQl9Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BY3Rpdml0eUxheW91dERhdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BY3Rpdml0eUxheW91dERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDMyMWUwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWN0aXZpdHlMYXlvdXREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBjbGFzcyB0byBob2xkIHByb2Nlc3Mgc3BlY2lmaWMgbGF5b3V0IGRhdGEgZm9yIGVhY2ggYWN0aXZpdHkKLSAqIHRoZSBkYXRhIHdpbGwgYmUgd3JpdGUgb3V0IHRvIGEgamF2YXNjcmlwdCBtYXAgCi0gKiBzbyB0aGF0IGFjdGl2aXR5IGxheW91dCBpbiB0aGUgcHVibGlzaGVkIHNpdGUgY2FuIGdldCB0aGUgc3RhdHVzIGR5bmFtaWNhbGx5LgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUxheW91dERhdGEgewotCi0JcHJpdmF0ZSBQcm9jZXNzTGF5b3V0RGF0YSBwcm9jX2RhdGE7Ci0JCi0JcHVibGljIFN0cmluZyBhZF9pbWdfcGF0aCA9IG51bGw7Ci0JcHVibGljIFN0cmluZyBhZGRfaW1nX3BhdGggPSBudWxsOwotCXB1YmxpYyBTdHJpbmcgd3BkX2ltZ19wYXRoID0gbnVsbDsKLQkKLQkvLyBtYXAgb2Ygc3VwcmVzc2VkIGl0ZW0ncyByZWxhdGl2ZSBwYXRoIHRvIHRoZSBjdXJyZW50IGFjdGl2aXR5Ci0JcHJpdmF0ZSBMaXN0IHN1cHJlc3NlZEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8qKgotCSAqIGNvbnN0dWN0b3IKLQkgKiBAcGFyYW0gcHJvY19kYXRhCi0JICogQHBhcmFtIGFjdGl2aXR5X3BhdGgKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlMYXlvdXREYXRhKFByb2Nlc3NMYXlvdXREYXRhIHByb2NfZGF0YSwgU3RyaW5nIGFjdGl2aXR5X3BhdGgpCi0JewotCQl0aGlzLnByb2NfZGF0YSA9IHByb2NfZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIFByb2Nlc3NMYXlvdXREYXRhCi0JICogQHJldHVybiBQcm9jZXNzTGF5b3V0RGF0YQotCSAqLwotCXB1YmxpYyBQcm9jZXNzTGF5b3V0RGF0YSBnZXRQcm9jZXNzTGF5b3V0RGF0YSgpCi0JewotCQlyZXR1cm4gcHJvY19kYXRhOwotCX0KLQkKLQkvKioKLQkgKiBzZXQgYWN0aXZpdHkgZGlhZ3JhbSBwYXRoCi0JICogQHBhcmFtIHBhdGggU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlEaWFncmFtUGF0aChTdHJpbmcgcGF0aCkKLQl7Ci0JCWFkX2ltZ19wYXRoID0gcGF0aDsKLQl9Ci0JCi0JLyoqCi0JICogc2V0IGFjdGl2aXR5IGRldGFpbCBkaWFncmFtIHBhdGgKLQkgKiBAcGFyYW0gcGF0aCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eURldGFpbERpYWdyYW1QYXRoKFN0cmluZyBwYXRoKQotCXsKLQkJYWRkX2ltZ19wYXRoID0gcGF0aDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhdGggU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0V1BEZXBlbmRlbmN5RGlhZ3JhbVBhdGgoU3RyaW5nIHBhdGgpCi0JewotCQl3cGRfaW1nX3BhdGggPSBwYXRoOwotCX0KLQkKLQkvKioKLQkgKiBzZXQgdGhlIGVsZW1lbnQncyByZWxhdGl2ZSBwYXRoIGZvciB0aGUgc3VwcHJlc3MgZWxlbWVudAotCSAqIEBwYXJhbSBpdGVtUmVsUGF0aAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cHByZXNzZWQoU3RyaW5nIGl0ZW1SZWxQYXRoKQotCXsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlN1cHByZXNzZWQ6ICIgKyBhY3Rpdml0eV9wYXRoICsgIjogIiArIGl0ZW1SZWxQYXRoKTsKLQkJCi0JCWlmICggIXN1cHJlc3NlZEl0ZW1zLmNvbnRhaW5zKGl0ZW1SZWxQYXRoKSApCi0JCXsKLQkJCXN1cHJlc3NlZEl0ZW1zLmFkZChpdGVtUmVsUGF0aCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBzdXBwcmVzc2VkIGVsZW1lbnRzCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBTdHJpbmcgZm9yIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBzdXBwcmVzc2VkIGVsZW1lbnRzCi0JICovCi0JcHVibGljIExpc3QgZ2V0U3VwcHJlc3NlZEl0ZW1zKCkKLQl7Ci0JCXJldHVybiBzdXByZXNzZWRJdGVtczsKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlcmUgaXMgYW55IHN1cHByZXNzZWQgaXRlbSBsb2NhbCB0byB0aGlzIHByb2Nlc3MKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNMb2NhbFN1cHByZXNzZWQoKQotCXsKLQkJcmV0dXJuIChzdXByZXNzZWRJdGVtcy5zaXplKCkgPiAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQXJ0aWZhY3RMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BcnRpZmFjdExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTI4NjkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BcnRpZmFjdExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYW4gQXJ0aWZhY3QuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RMYXlvdXQgZXh0ZW5kcyBXb3JrUHJvZHVjdExheW91dCB7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgQXJ0aWZhY3RMYXlvdXQKLQkgKgotCSAqLwotCXB1YmxpYyBBcnRpZmFjdExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9DaGVja2xpc3RMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9DaGVja2xpc3RMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTU5YzIyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQ2hlY2tsaXN0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIENoZWNrbGlzdC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tsaXN0TGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciBjaGVjayBsaXN0IGxheW91dAotCSAqCi0JICovCi0JcHVibGljIENoZWNrbGlzdExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBpbml0aWFsaXplIHRoZSBsYXlvdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuQ2hlY2tsaXN0X0NvbnRlbnRFbGVtZW50cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLkNoZWNrbGlzdF9Db250ZW50RWxlbWVudHMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0NvbmNlcHRMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Db25jZXB0TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1NzRhODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0NvbmNlcHRMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgQ29uY2VwdC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uY2VwdExheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgYSBsYXlvdXQgZm9yIENvbmNlcHQKLQkgKgotCSAqLwotCXB1YmxpYyBDb25jZXB0TGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGluaXRpYWxpemUgdGhlIGxheW91dAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJTGlzdCBjb250ZW50RWxlbWVudHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Db25jZXB0X0NvbnRlbnRFbGVtZW50cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLkNvbmNlcHRfQ29udGVudEVsZW1lbnRzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0RlbGl2ZXJhYmxlTGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVsaXZlcmFibGVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2I1NTU2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVsaXZlcmFibGVMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgRGVsaXZlcmFibGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcmFibGVMYXlvdXQgZXh0ZW5kcyBXb3JrUHJvZHVjdExheW91dCB7Ci0KLQkvKioKLQkgKiBsYXlvdXQgZm9yIERlbGl2ZXJhYmxlCi0JICoKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGVMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVzY3JpcHRvckRlc2NyaXB0aW9uTGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVzY3JpcHRvckRlc2NyaXB0aW9uTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQwZmQ4M2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogbGF5b3V0IGNsYXNzIGZvciBkZXNjcmlwdG9yIGNvbnRlbnRzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JTWV0aG9kRWxlbWVudCBkZXNjcmlwdG9yOwotCU1ldGhvZEVsZW1lbnQgbGlua2VkRWxlbWVudDsKLQlBYnN0cmFjdEVsZW1lbnRMYXlvdXQgbGlua2VkRGVzY3JpcHRpb25MYXlvdXQgPSBudWxsOwotCi0JLyoqCi0JICogbGF5b3V0IGZvciBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JEZXNjcmlwdGlvbkxheW91dChNZXRob2RFbGVtZW50IGRlc2NyaXB0b3IpIHsKLQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQl9Ci0JCi0JLyoqCi0JICogaW5pdGlhbGl6ZSB0aGUgbGF5b3V0Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCQkKLQkJc3VwZXIudGFyZ2V0RWxlbWVudCA9IGRlc2NyaXB0b3I7Ci0JCXN1cGVyLm93bmVyRWxlbWVudCA9IGRlc2NyaXB0b3I7Ci0JCQotCQlpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChUYXNrRGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0VGFzaygpOwotCQl9IGVsc2UgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJbGlua2VkRWxlbWVudCA9ICgoUm9sZURlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFJvbGUoKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCX0KLQkJCi0JCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCWxpbmtlZERlc2NyaXB0aW9uTGF5b3V0ID0gbmV3IEdlbmVyYWxMYXlvdXQoKTsKLQkJCWxpbmtlZERlc2NyaXB0aW9uTGF5b3V0LmluaXQobGF5b3V0TWFuYWdlciwgKChEZXNjcmliYWJsZUVsZW1lbnQpbGlua2VkRWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJbGlua2VkRGVzY3JpcHRpb25MYXlvdXQuc2V0Q29udGVudFRhcmdldChkZXNjcmlwdG9yKTsKLQkJCWxpbmtlZERlc2NyaXB0aW9uTGF5b3V0LnNldEVsZW1lbnRPd25lcihsaW5rZWRFbGVtZW50KTsJCQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkQXR0cmlidXRlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwpIHsKLQotCQlNYXAgZmVhdHVyZVZhbHVlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGFsbCBzdHJpbmcgdHlwZSBhdHRyaWJ1dGVzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgcCA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnRpZXMuZ2V0KGkpOwkJCQotCQkJCWlmICghKHAgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSlwOwotCQkJCVN0cmluZyBuYW1lID0gcC5nZXROYW1lKCk7Ci0JCQkJCQkJCQotCQkJCU9iamVjdCB2YWx1ZTsKLQkJCQlpZiAobmFtZS5lcXVhbHMoInByZXNlbnRhdGlvbk5hbWUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJLy8gdmFsdWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCQkJCXZhbHVlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQsCi0JCQkJCQkJbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gZ2V0QXR0cmlidXRlRmVhdHVyZVZhbHVlKHApOwotCQkJCX0KLQkJCQkKLQkJCQlmZWF0dXJlVmFsdWVNYXAucHV0KG5hbWUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQkKLQkJU3RyaW5nIHJlZmluZWREZXNjTmFtZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpLmdldE5hbWUoKTsKLQkJU3RyaW5nIG1haW5EZXNjTmFtZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkuZ2V0TmFtZSgpOwotCQkKLQkJLy8gbm93LCBnZXQgdGhlIGZlYXR1cmUgdmFsdWUgZnJvbSB0aGUgbGluayBlbGVtZW50J3MgZGVjcmlwdGlvbgotCQlwcm9wZXJ0aWVzID0gbnVsbDsKLQkJaWYgKCAoIGxpbmtlZERlc2NyaXB0aW9uTGF5b3V0IT1udWxsICkgJiYgKGxpbmtlZERlc2NyaXB0aW9uTGF5b3V0LmdldEVsZW1lbnQoKSAhPSBudWxsKSApIHsKLQkJCXByb3BlcnRpZXMgPSBsaW5rZWREZXNjcmlwdGlvbkxheW91dC5nZXRFbGVtZW50KCkuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCX0KLQkJCi0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCS8vIGdldCBhbGwgc3RyaW5nIHR5cGUgYXR0cmlidXRlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHAgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0aWVzLmdldChpKTsJCQkKLQkJCQlpZiAoIShwIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkvL0VBdHRyaWJ1dGUgYXR0cmliID0gKEVBdHRyaWJ1dGUpcDsKLQkJCQlTdHJpbmcgbmFtZSA9IHAuZ2V0TmFtZSgpOwotCQkJCWlmICggbmFtZS5lcXVhbHMobWFpbkRlc2NOYW1lKSApIHsKLQkJCQkJbmFtZSA9IHJlZmluZWREZXNjTmFtZTsKLQkJCQl9Ci0JCQkJCi0JCQkJT2JqZWN0IHZhbHVlID0gZmVhdHVyZVZhbHVlTWFwLmdldChuYW1lKTsKLQkJCQlpZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUudG9TdHJpbmcoKS5sZW5ndGgoKSA9PSAwICkgewotCQkJCQl2YWx1ZSA9IGxpbmtlZERlc2NyaXB0aW9uTGF5b3V0LmdldEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShwKTsKLQkJCQkJZmVhdHVyZVZhbHVlTWFwLnB1dChuYW1lLCB2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBub3cgc2V0IHRoZSB2YWx1ZXMKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVWYWx1ZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZyllbnRyeS5nZXRLZXkoKTsKLQkJCU9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQllbGVtZW50WG1sLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKQkvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpCQkvLyROT04tTkxTLTEkCi0JCQkJLnNldFZhbHVlKCh2YWx1ZSA9PSBudWxsKSA/ICIiIDogdmFsdWUudG9TdHJpbmcoKSk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9EZXNjcmlwdG9yTGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVzY3JpcHRvckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZDIzOWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9EZXNjcmlwdG9yTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIGJhc2UgbGF5b3V0IGNsYXNzIGZvciBkZXNjcmlwdG9ycwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVzY3JpcHRvckxheW91dCBleHRlbmRzIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQgewotCi0JTWV0aG9kRWxlbWVudCBsaW5rZWRFbGVtZW50ID0gbnVsbDsKLQotCUFic3RyYWN0RWxlbWVudExheW91dCBlbGVtZW50TGF5b3V0ID0gbnVsbDsKLQotCXByb3RlY3RlZCB2b2lkIF9faW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0VGFzaygpOwotCQkJaWYgKGxpbmtlZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWVsZW1lbnRMYXlvdXQgPSBuZXcgVGFza0xheW91dCgpOwotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJbGlua2VkRWxlbWVudCA9ICgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFJvbGUoKTsKLQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQllbGVtZW50TGF5b3V0ID0gbmV3IFJvbGVMYXlvdXQoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlpZiAobGlua2VkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJZWxlbWVudExheW91dCA9IG5ldyBXb3JrUHJvZHVjdExheW91dCgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnRMYXlvdXQgIT0gbnVsbCkgewotCQkJZWxlbWVudExheW91dC5pbml0KGxheW91dE1hbmFnZXIsIGxpbmtlZEVsZW1lbnQpOwotCQkJZWxlbWVudExheW91dC5zZXRDb250ZW50VGFyZ2V0KGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZm9yIGRlc2NyaXB0b3JzLCBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkLCBnZXQgZnJvbSB0aGUgbGliZWQKLQkgKiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlPYmplY3QgdmFsdWUgPSBzdXBlci5nZXRBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoZmVhdHVyZSk7Ci0JCWlmICgoZWxlbWVudExheW91dCA9PSBudWxsKSB8fCAodmFsdWUgIT0gbnVsbCkKLQkJCQkmJiAodmFsdWUudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQkvLyBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkLCBncmFiIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZnJvbSB0aGUKLQkJLy8gbGlua2VkIGVsZW1lbnQKLQkJLy8gc3BlY2lmaWVkIGF0dHJpYnV0ZXMgb25seS4gQWRkIG1vcmUgZmVhdHVyZSBoZXJlIGlmIG5lZWRlZAotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSkgewotCQkJcmV0dXJuIGVsZW1lbnRMYXlvdXQuZ2V0QXR0cmlidXRlRmVhdHVyZVZhbHVlKGZlYXR1cmUpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbGF5b3V0IGZvciBhIGNoaWxkIGVsZW1lbnQgb2YgdGhpcyBlbGVtZW50Ci0JICogQWN0aXZpdHlFbGVtZW50TGF5b3V0IHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgbGF5b3V0IHdpdGggbm9kZSBwYXRoCi0JICogQHBhcmFtIGNoaWxkCi0JICogQHJldHVybiBJRWxlbWVudExheW91dAotCSAqLwotCXByb3RlY3RlZCBJRWxlbWVudExheW91dCBnZXRDaGlsZExheW91dChNZXRob2RFbGVtZW50IGNoaWxkKQotCXsKLQkJaWYgKCBsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpIAotCQkJCSYmIChjaGlsZCBpbnN0YW5jZW9mIERlc2NyaXB0b3JEZXNjcmlwdGlvbikgKSB7Ci0JCQlEZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQgbCA9IG5ldyBEZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQodGhpcy5lbGVtZW50KTsKLQkJCWwuaW5pdChsYXlvdXRNYW5hZ2VyLCBjaGlsZCk7Ci0JCQlyZXR1cm4gbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBsYXlvdXRNYW5hZ2VyLmdldExheW91dChjaGlsZCwgdHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGlzY2lwbGluZUxheW91dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Rpc2NpcGxpbmVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGIyZWVkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGlzY2lwbGluZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBEaXNjaXBsaW5lTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9FeGFtcGxlTGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRXhhbXBsZUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OGVhNWI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9FeGFtcGxlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGFuIEV4YW1wbGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4YW1wbGVMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIEV4YW1wbGVMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkV4YW1wbGVfQ29udGVudEVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuRXhhbXBsZV9Db250ZW50RWxlbWVudHMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0KLQkJCUd1aWRhbmNlIGd1aWRhbmNlID0gKEd1aWRhbmNlKSBzdXBlci5lbGVtZW50OwotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQkJCi0JCQkJLy8gQXV0aG9yaW5nOiAgVGVtcGxhdGUgYXR0YWNobWVudHMgb2YgYSBjb250cmlidXRpbmcgdGVtcGxhdGUgZ3VpZGFuY2UgZWxlbWVudCBhcmUgbm90IGFwcGVuZGVkIHRvIHRoZSBiYXNlIGxpc3Qgb2YgYXR0YWNobWVudHMJCQkJCi0JCQkJLy9TdHJpbmcgYXR0YWNobWVudFN0cmluZyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uKWNvbnRlbnQpLmdldEF0dGFjaG1lbnRzKCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCk7Ci0JCQkJU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShjb250ZW50LCBzdXBlci5lbGVtZW50LCBmZWF0dXJlLCBzdXBlci5sYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJaWYgKCAoYXR0YWNobWVudFN0cmluZyAhPSBudWxsKSAmJiAoYXR0YWNobWVudFN0cmluZy5pbmRleE9mKENvbmZpZ3VyYXRpb25IZWxwZXIuQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUikgPiAwKSApCi0JCQkJewotCQkJCQlhdHRhY2htZW50U3RyaW5nID0gYXR0YWNobWVudFN0cmluZy5yZXBsYWNlQWxsKENvbmZpZ3VyYXRpb25IZWxwZXIuQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUiwgVG5nVXRpbC5HVUlEQU5DRV9GSUxFU1RSSU5HX1NFUEFSQVRPUik7IAotCQkJCX0KLQkJCQlMaXN0IGF0dGFjaG1lbnRMaXN0ID0gVG5nVXRpbC5jb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvTGlzdChhdHRhY2htZW50U3RyaW5nKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRhY2htZW50TGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgYXR0YWNobWVudEZpbGUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGF0dGFjaG1lbnRGaWxlICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVVdGlsLmdldEZpbGVOYW1lKGF0dGFjaG1lbnRGaWxlKTsKLQkJCQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkiYXR0YWNoZWRGaWxlIikuc2V0QXR0cmlidXRlKCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSJ1cmwiLCAiZmlsZTovLyIgKyBhdHRhY2htZW50RmlsZSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCQkJCQkuc2V0QXR0cmlidXRlKCJmaWxlTmFtZSIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvR2VuZXJhbExheW91dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0dlbmVyYWxMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmU2NzNkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvR2VuZXJhbExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmFsTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBHZW5lcmFsTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9HdWlkZWxpbmVMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9HdWlkZWxpbmVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y2MDY5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvR3VpZGVsaW5lTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIEd1aWRlbGluZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGVsaW5lTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBHdWlkZWxpbmVMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkd1aWRlbGluZV9Db250ZW50RWxlbWVudHMsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5HdWlkZWxpbmVfQ29udGVudEVsZW1lbnRzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9PdXRjb21lTGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvT3V0Y29tZUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzODQ5OWEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9PdXRjb21lTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIE91dGNvbWUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3V0Y29tZUxheW91dCBleHRlbmRzIFdvcmtQcm9kdWN0TGF5b3V0IHsKLQotCXB1YmxpYyBPdXRjb21lTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Byb2Nlc3NFbGVtZW50SXRlbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Byb2Nlc3NFbGVtZW50SXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDI5OTM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Qcm9jZXNzRWxlbWVudEl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBzaW1wbGUgaG9sZGVyIG9mIHByb2Nlc3MgZWxlbWVudCBpdGVtIGluZm8KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFbGVtZW50SXRlbSB7Ci0JCi0JcHVibGljIE9iamVjdCByYXdJdGVtID0gbnVsbDsKLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQlwdWJsaWMgU3RyaW5nIHBhdGggPSBudWxsOwotCXB1YmxpYyBTdHJpbmcgcHJvY19ndWlkID0gbnVsbDsKLQkKLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnRJdGVtKE9iamVjdCByYXdJdGVtLCBNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwYXRoKQotCXsKLQkJdGhpcy5yYXdJdGVtID0gcmF3SXRlbTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJdGhpcy5wcm9jX2d1aWQgPSBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmdldE93bmluZ1Byb2Nlc3NHdWlkRnJvbVBhdGgocGF0aCk7Ci0JfQotCQotCXB1YmxpYyBQcm9jZXNzRWxlbWVudEl0ZW0oT2JqZWN0IHJhd0l0ZW0sIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgUHJvY2Vzc0VsZW1lbnRJdGVtIHBhcmVudCkKLQl7Ci0JCXRoaXMucmF3SXRlbSA9IHJhd0l0ZW07Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMucGF0aCA9IEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQubWFrZVBhdGgocGFyZW50LnBhdGgsIHRoaXMuZWxlbWVudCk7IC8vIG1ha2UgcGF0aCBoZXJlCi0JCXRoaXMucHJvY19ndWlkID0gcGFyZW50LnByb2NfZ3VpZDsJCQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKQotCXsKLQkJcmV0dXJuIEVsZW1lbnRMYXlvdXRNYW5hZ2VyLmdldFF1ZXJ5U3RyaW5nKHByb2NfZ3VpZCwgcGF0aCk7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0xheW91dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Byb2Nlc3NMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI1ZDgwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgUm9sZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0xheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgUHJvY2Vzc0xheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KCk7Ci0KLQkJaWYgKCFpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JCX0KLQotCQkvLyBidWlsZCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0cmVlCi0JCVhtbEVsZW1lbnQgYnMgPSBlbGVtZW50WG1sCi0JCQkJLm5ld0NoaWxkKCJicmVha2Rvd24iKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiV29yayBCcmVha2Rvd24gU3RydWN0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlpdGVyYXRlKHN1cGVyLmVsZW1lbnQsIGJzLCBhZGFwdGVyRmFjdG9yeSk7Ci0KLQkJYnMgPSBlbGVtZW50WG1sCi0JCQkJLm5ld0NoaWxkKCJicmVha2Rvd24iKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJaXRlcmF0ZShzdXBlci5lbGVtZW50LCBicywgYWRhcHRlckZhY3RvcnkpOwotCi0JCWJzID0gZWxlbWVudFhtbAotCQkJCS5uZXdDaGlsZCgiYnJlYWtkb3duIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgIldvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJaXRlcmF0ZShzdXBlci5lbGVtZW50LCBicywgYWRhcHRlckZhY3RvcnkpOwotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCS8qKgotCSAqIGl0ZXJhdGUgdGhlIGJyZWFrIGRvd24gc3RydWN0dXJlIGFuZCBidWlsZCB0aGUgeG1sIGRvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIHBhcmVudE9iagotCSAqIEBwYXJhbSBwYXJlbnRYbWwKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZShPYmplY3QgcGFyZW50T2JqLCBYbWxFbGVtZW50IHBhcmVudFhtbCwKLQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGFyZW50T2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBFaXRoZXIgZGVsZWdhdGUgdGhlIGNhbGwgb3IgcmV0dXJuIG5vdGhpbmcuCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50T2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBpdGVtID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsLnVud3JhcChpdAotCQkJCQkJLm5leHQoKSk7Ci0JCQkJLy8gc3VwZXIucHJvY2Vzc0NoaWxkKHBhcmVudFhtbCwgaXRlbSwgZmFsc2UpOwotCQkJCUlFbGVtZW50TGF5b3V0IGwgPSBsYXlvdXRNYW5hZ2VyLmdldExheW91dChpdGVtLCB0cnVlKTsKLQkJCQlpZiAobCAhPSBudWxsKSB7Ci0JCQkJCVhtbEVsZW1lbnQgY2hpbGQgPSBsLmdldFhtbEVsZW1lbnQoZmFsc2UpOwotCQkJCQlwYXJlbnRYbWwuYWRkQ2hpbGQoY2hpbGQpOwotCi0JCQkJCS8vIGluZXRlcmF0ZSBjaGlsZHJlbgotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlpdGVyYXRlKGl0ZW0sIGNoaWxkLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Byb2Nlc3NMYXlvdXREYXRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0xheW91dERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzFkYWFlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0xheW91dERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiAKLSAqIGNsYXNzIHRvIGhvbGQgcHJvY2VzcyBzcGVjaWZpYyBsYXlvdXQgZGF0YSBmb3IgZWFjaCBhY3Rpdml0eQotICogdGhlIGRhdGEgd2lsbCBiZSB3cml0ZSBvdXQgdG8gYSBqYXZhc2NyaXB0IG1hcCAKLSAqIHNvIHRoYXQgYWN0aXZpdHkgbGF5b3V0IGluIHRoZSBwdWJsaXNoZWQgc2l0ZSBjYW4gZ2V0IHRoZSBzdGF0dXMgZHluYW1pY2FsbHkuCi0gKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NMYXlvdXREYXRhIHsKLQotCU1hcCBhY3Rpdml0eU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKiBAcGFyYW0gcHJvY19ndWlkCi0JICovCi0JcHVibGljIFByb2Nlc3NMYXlvdXREYXRhKFN0cmluZyBwcm9jX2d1aWQpCi0JewotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiBpdCBjb250YWlucyB0aGUgYWN0aXZpdHkgbGF5b3V0IG9mIHRoZSBzcGVjaWZpZWQgcGF0aAotCSAqIEBwYXJhbSBhY3Rpdml0eV9wYXRoIFN0cmluZwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FjdGl2aXR5TGF5b3V0KFN0cmluZyBhY3Rpdml0eV9wYXRoKQotCXsKLQkJcmV0dXJuIGFjdGl2aXR5TWFwLmNvbnRhaW5zS2V5KGFjdGl2aXR5X3BhdGgpOwotCX0KLQkKLQkvKioKLQkgKiBjcmVhdGUgYW4gQWN0aXZpdHlMYXlvdXREYXRhIGZvciB0aGUgYWN0aXZpdHkgcGF0aAotCSAqIEBwYXJhbSBhY3Rpdml0eV9wYXRoIFN0cmluZwotCSAqIEByZXR1cm4gQWN0aXZpdHlMYXlvdXREYXRhCi0JICovCi0JcHVibGljIEFjdGl2aXR5TGF5b3V0RGF0YSBjcmVhdGVBY3Rpdml0eUxhdW91dERhdGEoU3RyaW5nIGFjdGl2aXR5X3BhdGgpCi0JewotCQlBY3Rpdml0eUxheW91dERhdGEgZGF0YSA9IChBY3Rpdml0eUxheW91dERhdGEpYWN0aXZpdHlNYXAuZ2V0KGFjdGl2aXR5X3BhdGgpOwotCQlpZiAoIGRhdGEgPT0gbnVsbCApCi0JCXsKLQkJCWRhdGEgPSBuZXcgQWN0aXZpdHlMYXlvdXREYXRhKHRoaXMsIGFjdGl2aXR5X3BhdGgpOwotCQkJYWN0aXZpdHlNYXAucHV0KGFjdGl2aXR5X3BhdGgsIGRhdGEpOwotCQl9Ci0JCQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGEgbWFwIG9mIHRoZSBhY3Rpdml0eSBsYXlvdXQgZGF0YQotCSAqIEByZXR1cm4gTWFwCi0JICovCi0JcHVibGljIE1hcCBnZXRBY3Rpdml0eUxheW91dERhdGFNYXAoKQotCXsKLQkJcmV0dXJuIGFjdGl2aXR5TWFwOwotCX0KLQkKLQkvKioKLQkgKiBwcmludCB0aGUgaW5mbyB0byBhIGphdmFzY3JpcHQgZmlsZSBpbiB0aGUgcHVibGlzaGVkIHNpdGUuIAotCSAqIFRoZXNlIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGxheW91dCBvZiBwcm9jZXNzIGVsZW1lbnRzLgotCSAqIEBwYXJhbSBwcyBQcmludFdyaXRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50KFByaW50V3JpdGVyIHBzKQotCXsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBhY3Rpdml0eU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotCQl7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKLQkJCVN0cmluZyBhY3Rpdml0eV9wYXRoID0gKFN0cmluZyllbnRyeS5nZXRLZXkoKTsKLQkJCUFjdGl2aXR5TGF5b3V0RGF0YSBkYXRhID0gKEFjdGl2aXR5TGF5b3V0RGF0YSllbnRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKCBkYXRhLmFkX2ltZ19wYXRoICE9IG51bGwgKQotCQkJewotCQkJCVN0cmluZyBrZXkgPSBhY3Rpdml0eV9wYXRoICsgUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XOwotCQkJCXByaW50SW1nRmlsZShwcywga2V5LCBkYXRhLmFkX2ltZ19wYXRoKTsKLQkJCX0KLQkJCQotCQkJaWYgKCBkYXRhLmFkZF9pbWdfcGF0aCAhPSBudWxsICkKLQkJCXsKLQkJCQlTdHJpbmcga2V5ID0gYWN0aXZpdHlfcGF0aCArIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUw7Ci0JCQkJcHJpbnRJbWdGaWxlKHBzLCBrZXksIGRhdGEuYWRkX2ltZ19wYXRoKTsKLQkJCX0KLQkJCQotCQkJaWYgKCBkYXRhLndwZF9pbWdfcGF0aCAhPSBudWxsICkKLQkJCXsKLQkJCQlTdHJpbmcga2V5ID0gYWN0aXZpdHlfcGF0aCArIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZOwotCQkJCXByaW50SW1nRmlsZShwcywga2V5LCBkYXRhLndwZF9pbWdfcGF0aCk7Ci0JCQl9Ci0KLQkJCWlmICggZGF0YS5nZXRTdXBwcmVzc2VkSXRlbXMoKS5zaXplKCkgPiAwICkKLQkJCXsKLQkJCQlmb3IgKCBJdGVyYXRvciBpdDIgPSBkYXRhLmdldFN1cHByZXNzZWRJdGVtcygpLml0ZXJhdG9yKCk7IGl0Mi5oYXNOZXh0KCk7ICkKLQkJCQl7Ci0JCQkJCVN0cmluZyByZWxQYXRoID0gKFN0cmluZylpdDIubmV4dCgpOwotCQkJCQlTdHJpbmcga2V5ID0gYWN0aXZpdHlfcGF0aCArIHJlbFBhdGg7Ci0JCQkJCXByaW50U3VwcHJlc3NlZEl0ZW0ocHMsIGtleSk7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcmludEltZ0ZpbGUoUHJpbnRXcml0ZXIgcHMsIFN0cmluZyBrZXksIFN0cmluZyBmaWxlTmFtZSkKLQl7Ci0JCVN0cmluZyBsaW5lID0gImNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLmltYWdlRmlsZXNbXCIiICsga2V5ICsgIlwiXT1cIiIgKyBmaWxlTmFtZSArICJcIiI7Ci0JCXBzLnByaW50bG4obGluZSk7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKGxpbmUpOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByaW50U3VwcHJlc3NlZEl0ZW0oUHJpbnRXcml0ZXIgcHMsIFN0cmluZyBrZXkpCi0JewotCQlTdHJpbmcgbGluZSA9ICJjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5zdXBwcmVzc2VkSXRlbXNbXCIiICsga2V5ICsgIlwiXT10cnVlIjsKLQkJcHMucHJpbnRsbihsaW5lKTsJCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKGxpbmUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9SZXBvcnRMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9SZXBvcnRMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmE5OWU2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUmVwb3J0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFJlcG9ydC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVwb3J0TGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBSZXBvcnRMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlJlcG9ydF9Xb3JrUHJvZHVjdHMsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5SZXBvcnRfV29ya1Byb2R1Y3RzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9SZXVzYWJsZUFzc2V0TGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUmV1c2FibGVBc3NldExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNjI1ZTM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9SZXVzYWJsZUFzc2V0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgUmV1c2FibGUgQXNzZXQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJldXNhYmxlQXNzZXRMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIFJldXNhYmxlQXNzZXRMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlJldXNhYmxlQXNzZXRfQ29udGVudEVsZW1lbnRzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuUmV1c2FibGVBc3NldF9Db250ZW50RWxlbWVudHMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0KLQkJCUd1aWRhbmNlIGd1aWRhbmNlID0gKEd1aWRhbmNlKSBzdXBlci5lbGVtZW50OwotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQkJCi0JCQkJLy8gQXV0aG9yaW5nOiAgVGVtcGxhdGUgYXR0YWNobWVudHMgb2YgYSBjb250cmlidXRpbmcgdGVtcGxhdGUgZ3VpZGFuY2UgZWxlbWVudCBhcmUgbm90IGFwcGVuZGVkIHRvIHRoZSBiYXNlIGxpc3Qgb2YgYXR0YWNobWVudHMJCQkJCi0JCQkJLy9TdHJpbmcgYXR0YWNobWVudFN0cmluZyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uKWNvbnRlbnQpLmdldEF0dGFjaG1lbnRzKCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCk7Ci0JCQkJU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShjb250ZW50LCBzdXBlci5lbGVtZW50LCBmZWF0dXJlLCBzdXBlci5sYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJaWYgKCAoYXR0YWNobWVudFN0cmluZyAhPSBudWxsKSAmJiAoYXR0YWNobWVudFN0cmluZy5pbmRleE9mKENvbmZpZ3VyYXRpb25IZWxwZXIuQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUikgPiAwKSApCi0JCQkJewotCQkJCQlhdHRhY2htZW50U3RyaW5nID0gYXR0YWNobWVudFN0cmluZy5yZXBsYWNlQWxsKENvbmZpZ3VyYXRpb25IZWxwZXIuQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUiwgVG5nVXRpbC5HVUlEQU5DRV9GSUxFU1RSSU5HX1NFUEFSQVRPUik7IAotCQkJCX0KLQkJCQlMaXN0IGF0dGFjaG1lbnRMaXN0ID0gVG5nVXRpbC5jb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvTGlzdChhdHRhY2htZW50U3RyaW5nKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRhY2htZW50TGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgYXR0YWNobWVudEZpbGUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGF0dGFjaG1lbnRGaWxlICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVVdGlsLmdldEZpbGVOYW1lKGF0dGFjaG1lbnRGaWxlKTsKLQkJCQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkiYXR0YWNoZWRGaWxlIikuc2V0QXR0cmlidXRlKCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSJ1cmwiLCAiZmlsZTovLyIgKyBhdHRhY2htZW50RmlsZSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCQkJCQkuc2V0QXR0cmlidXRlKCJmaWxlTmFtZSIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JvYWRtYXBMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Sb2FkbWFwTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjYTJlNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JvYWRtYXBMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgUm9hZG1hcC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9hZG1hcExheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgUm9hZG1hcExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuUm9hZG1hcF9BY3Rpdml0ZXMsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Sb2FkbWFwX0FjdGl2aXRlcywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9sZURlc2NyaXB0b3JMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Sb2xlRGVzY3JpcHRvckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNWFjMDRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Sb2xlRGVzY3JpcHRvckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIFRoZSBsYXlvdXQgZm9yIGEgUm9sZURlc2NyaXB0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvckxheW91dCBleHRlbmRzIERlc2NyaXB0b3JMYXlvdXQgewotCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCS8vIHVzZSB0aGUgZGVmYXVsdAotCQkvLyBpZiB5b3UgbmVlZCB0byBnZW5lcmF0ZSBkaWFncmFtLCB5b3UgbWF5IG5lZWQgdG8ga2VlcCB0aGUgZmVhdHVyZQotCQkvLyB2YWx1ZXMuCi0JCS8vIGp1c3QgZG8gc29tZXRoaW5nIHNpbWlsYXIgdG8gdGhlIFJvbGVMYXlvdXQKLQkJLy8gTk9URTogZm9yIHJvbGUtdGFza3MgcmVsYXRpb25zaGlwLCB0aGUgZmVhdHVyZSBpcwotCQkvLyBSb2xlRGVzY3JpcHRvciNnZXRQZXJmb3Jtc0FzT3duZXIKLQkJLy8gaXQncyBhIGJpZGlyZWN0aW9uYWwgZmVhdHVyZSwgZG9uJ3QgbmVlZCBvcHBvc2l0ZSBmZWF0dXJlCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWRSZWZlcmVuY2VzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCi0JCXN1cGVyLmxvYWRSZWZlcmVuY2VzKGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCi0JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJTaG93RnVsbE1ldGhvZENvbnRlbnQiLCAobGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQkJCi0JCWlmICggKHN1cGVyLmVsZW1lbnRMYXlvdXQgIT0gbnVsbCApICYmIGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkgKSB7Ci0JCQkvLyBhbHNvIGxvYWQgdGhlIGxpbmtlZCBlbGVtZW50IHJlZmVyZW5jZWQgaW5mb3JtYXRpb24KLQkJCXN1cGVyLmVsZW1lbnRMYXlvdXQubG9hZEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJCXN1cGVyLmVsZW1lbnRMYXlvdXQubG9hZEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLCBlbGVtZW50WG1sLCBmYWxzZSk7Ci0JCQlzdXBlci5lbGVtZW50TGF5b3V0LmxvYWRGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJCXN1cGVyLmVsZW1lbnRMYXlvdXQubG9hZEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwgZWxlbWVudFhtbCwgZmFsc2UpOwotCQkJc3VwZXIuZWxlbWVudExheW91dC5sb2FkRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJCXN1cGVyLmVsZW1lbnRMYXlvdXQubG9hZEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLCBlbGVtZW50WG1sLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Sb2xlTGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9sZUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZjA3YTkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Sb2xlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5NZXRob2RFbGVtZW50RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5Sb2xlRGlhZ3JhbVB1Ymxpc2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFJvbGUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHJvdGVjdGVkIE1hcCByZWZlcmVuY2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIFJvbGVMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJTGlzdCBwZXJmb3JtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQlzdXBlci5lbGVtZW50LCBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1ByaW1hcnlfVGFza3MsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJcmVmZXJlbmNlTWFwLnB1dCgicGVyZm9ybXMiLCBwZXJmb3Jtcyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gTk8sIHRoaXMgaXMgd3JvbmchIHNob3VsZCBjYWxjdWxhdGUgdGhlIHJlYWxpemVkIGZlYXR1cmUgdmFsdWUhCi0JCQkvLyBtb3ZlZCB0byBhY2NlcHRGZWF0dXJlVmFsdWUgdG8gZ2V0IHRoZSByZWFsaXplZCB2YWx1ZSBhbmQgc2F2ZSB0bwotCQkJLy8gdGhlIG1hcAotCQkJLy8gaWYgKHN1cGVyLmVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlSW1wbCkKLQkJCS8vIHsKLQkJCS8vIHJlZmVyZW5jZU1hcC5wdXQoInJlc3BvbnNpYmxlRm9yIiwKLQkJCS8vICgoUm9sZUltcGwpc3VwZXIuZWxlbWVudCkuZ2V0UmVzcG9uc2libGVGb3IoKSk7Ci0JCQkvLyB9Ci0KLQkJCUxpc3QgYWRkaXRpb25hbGx5UGVyZm9ybXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJc3VwZXIuZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9TZWNvbmRhcnlfVGFza3MsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJLy8gcmVmZXJlbmNlTWFwLnB1dCgiYWRkaXRpb25hbGx5UGVyZm9ybXMiLCBhZGRpdGlvbmFsbHlQZXJmb3Jtcyk7Ci0JCQkvLyAvLyROT04tTkxTLTEkCi0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlJvbGVfU2Vjb25kYXJ5X1Rhc2tzLCBlbGVtZW50WG1sLAotCQkJCQkiYWRkaXRpb25hbGx5UGVyZm9ybXMiLCBhZGRpdGlvbmFsbHlQZXJmb3Jtcyk7IC8vJE5PTi1OTFMtMSQKLQkJCVJvbGVEaWFncmFtUHVibGlzaGVyIGRpYWdyYW1QdWJsaXNoZXIgPSBuZXcgUm9sZURpYWdyYW1QdWJsaXNoZXIoKTsKLQkJCU1ldGhvZEVsZW1lbnREaWFncmFtIGRpYWdyYW0gPSBkaWFncmFtUHVibGlzaGVyLnB1Ymxpc2godGhpcywKLQkJCQkJbmV3IEZpbGUobGF5b3V0TWFuYWdlci5nZXRQdWJsaXNoRGlyKCkpKTsKLQotCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkKLQkJCQllbGVtZW50WG1sLnNldENvbnRlbnQoImRpYWdyYW0iLCBkaWFncmFtLmdldEhUTUwoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJTGlzdCByb2xlU2V0cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQlzdXBlci5lbGVtZW50LCBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1JvbGVTZXRzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9Sb2xlU2V0cywgZWxlbWVudFhtbCwKLQkJCQkJInJvbGVTZXRzIiwgcm9sZVNldHMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0UGVyZm9ybXMoKSB7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KSByZWZlcmVuY2VNYXAuZ2V0KCJwZXJmb3JtcyIpOyAvLyROT04tTkxTLTEkCi0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFkZGl0aW9uYWxseVBlcmZvcm1zKCkgewotCQlMaXN0IGxpc3QgPSAoTGlzdCkgcmVmZXJlbmNlTWFwLmdldCgiYWRkaXRpb25hbGx5UGVyZm9ybXMiKTsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQlyZXR1cm4gbGlzdDsJCQotCX0KLQotCXB1YmxpYyBMaXN0IGdldFJlc3BvbnNpYmxlRm9yKCkgewotCQlMaXN0IGxpc3QgPSAgKExpc3QpIHJlZmVyZW5jZU1hcC5nZXQoInJlc3BvbnNpYmxlRm9yIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbnMuc29ydChsaXN0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJcmV0dXJuIGxpc3Q7CQkKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRNb2RpZmllcygpIHsKLQkJTGlzdCBsaXN0ID0gIChMaXN0KSByZWZlcmVuY2VNYXAuZ2V0KCJtb2RpZmllcyIpOyAvLyROT04tTkxTLTEkCi0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCXJldHVybiBsaXN0OwkJCi0JfQotCi0JLyoqCi0JICogc29tZSBsYXlvdXQgbmVlZCB0byBoYXZlIHRoZSBmZWF0dXJlIHZhbHVlcyBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiBTbwotCSAqIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBmZWF0dXJlIGlzIGNhbGN1bGF0ZWQgaW4gdGhpcyBhYnN0cmFjdAotCSAqIGNsYXNzCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlGZWF0dXJlVmFsdWUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlyZWZlcmVuY2VNYXAucHV0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBzb21lIGxheW91dCBuZWVkIHRvIGhhdmUgdGhlIGZlYXR1cmUgdmFsdWVzIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuIFNvCi0JICogdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIGZlYXR1cmUgaXMgY2FsY3VsYXRlZCBpbiB0aGlzIGFic3RyYWN0Ci0JICogY2xhc3MKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEZlYXR1cmVWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSkgewotCi0JCS8vIHNhdmUgdGhlIGZlYXR1cmUgdmFsdWUgZm9yIGRpYWdyYW0gZ2VuZXJhdGlvbgotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkpIHsKLQkJCXJlZmVyZW5jZU1hcC5wdXQoInJlc3BvbnNpYmxlRm9yIiwgdmFsdWUpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvU3RlcExheW91dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N0ZXBMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmVkYzE4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvU3RlcExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGVwTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBTdGVwTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9TdW1tYXJ5UGFnZUxheW91dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N1bW1hcnlQYWdlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1MzZjOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N1bW1hcnlQYWdlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIFRoZSBsYXlvdXQgZm9yIGEgc3VtbWFyeSBwYWdlIG9mIGFuIGVsZW1lbnQuCi0gKiA8cD4KLSAqIFRoZSBzdW1tYXJ5cGFnZSBsYXlvdXQgYSBsaXN0IG9mIGVsZW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhlIG93bmVyIGVsZW1lbnQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN1bW1hcnlQYWdlTGF5b3V0IGltcGxlbWVudHMgSUVsZW1lbnRMYXlvdXQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9UWVBFID0gIlN1bW1hcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1hTTCA9ICJzdW1tYXJ5LnhzbCI7IC8vJE5PTi1OTFMtMSQKLQotCUVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXI7Ci0KLQlNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQlMaXN0IHJlZkxpc3Q7Ci0KLQlTdHJpbmcgdGl0bGU7Ci0JCi0JU3RyaW5nIHByZWZpeDsKLQotCS8vIFN0cmluZyBmaWxlTmFtZTsKLQlJRWxlbWVudExheW91dCBlbGVtZW50TGF5b3V0OwotCi0JcHVibGljIFN1bW1hcnlQYWdlTGF5b3V0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0aXRsZSwgTGlzdCByZWZMaXN0KSB7Ci0JCXRoaXMubGF5b3V0TWFuYWdlciA9IGxheW91dE1hbmFnZXI7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMucmVmTGlzdCA9IHJlZkxpc3Q7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQotCQl0aGlzLmVsZW1lbnRMYXlvdXQgPSBsYXlvdXRNYW5hZ2VyLmdldExheW91dChlbGVtZW50LCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIFN1bW1hcnlQYWdlTGF5b3V0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB0aXRsZSwgCi0JCQlMaXN0IHJlZkxpc3QpIAotCXsKLQkJdGhpcy5sYXlvdXRNYW5hZ2VyID0gbGF5b3V0TWFuYWdlcjsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5yZWZMaXN0ID0gcmVmTGlzdDsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLnByZWZpeCA9IChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwICYmIHByZWZpeC5pbmRleE9mKCJudWxsIikgPCAwKSA/IHByZWZpeCA6ICJTdW1tYXJ5IjsKLQotCQl0aGlzLmVsZW1lbnRMYXlvdXQgPSBsYXlvdXRNYW5hZ2VyLmdldExheW91dChlbGVtZW50LCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRHdWlkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gTEFZT1VUX1RZUEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gZWxlbWVudExheW91dC5nZXRGaWxlUGF0aCgpCi0JCQkJKyBnZXRGaWxlTmFtZShSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNoYXBlaWNvblVybCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlaWNvblVybCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaWFncmFtaWNvblVybCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRYc2xVcmwoKSB7Ci0JCXJldHVybiBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXlvdXRYc2xQYXRoKCkgKyBMQVlPVVRfWFNMOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja1BhdGgoKSB7Ci0JCXJldHVybiBlbGVtZW50TGF5b3V0LmdldEJhY2tQYXRoKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRMYXlvdXQuZ2V0RmlsZVBhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKElFbGVtZW50TGF5b3V0IHJlbGF0aXZlVG8pIHsKLQkJcmV0dXJuIGVsZW1lbnRMYXlvdXQuZ2V0RmlsZVBhdGgocmVsYXRpdmVUbyk7Ci0JfQotCi0vLwlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyBleHQpIHsKLS8vCQlyZXR1cm4gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZSh0aXRsZSArICJfIikgKyBlbGVtZW50TGF5b3V0LmdldEZpbGVOYW1lKGV4dCk7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZShTdHJpbmcgZXh0KSB7Ci0JCXJldHVybiBTdHJVdGlsLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKHByZWZpeCArICJfIikgKyBlbGVtZW50TGF5b3V0LmdldEZpbGVOYW1lKGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNZ3IoKSB7Ci0JCXJldHVybiBsYXlvdXRNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCi0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IG5ldyBYbWxFbGVtZW50KCJFbGVtZW50IikgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIlR5cGUiLCBnZXRUeXBlKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJOYW1lIiwgZ2V0TmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiVXJsIiwgZ2V0VXJsKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJCYWNrUGF0aCIsIGdldEJhY2tQYXRoKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJJbWFnZVVybCIsIGdldFNoYXBlaWNvblVybCgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBnZXREaXNwbGF5TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJCi0JCQlTdHJpbmcgY29weXJpZ2h0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb3B5cmlnaHRUZXh0KGVsZW1lbnQsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCWlmIChjb3B5cmlnaHQgIT0gbnVsbCAmJiBjb3B5cmlnaHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiY29weXJpZ2h0Iikuc2V0VmFsdWUoY29weXJpZ2h0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlYbWxFbGVtZW50IHJlZlhtbCA9IGVsZW1lbnRYbWwKLQkJCQkJLm5ld0NoaWxkKCJyZWZlcmVuY2VMaXN0Iikuc2V0QXR0cmlidXRlKCJuYW1lIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSAoTWV0aG9kRWxlbWVudCkgZTsKLQkJCQkJbWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KG1lLAotCQkJCQkJCWxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQkJaWYgKG1lICE9IG51bGwpIHsKLQkJCQkJCUlFbGVtZW50TGF5b3V0IGwgPSBsYXlvdXRNYW5hZ2VyLmdldExheW91dChtZSwgdHJ1ZSk7Ci0JCQkJCQlpZiAobCAhPSBudWxsKSB7Ci0JCQkJCQkJLy8gZG9uJ3QgaW5jbHVkZSB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgcmVmZXJlY2VkCi0JCQkJCQkJLy8gZWxlbWVudHMsIG90aGVyd2lzZSwgbWF5IGNhdXNlIGRlYWRsb2NrCi0JCQkJCQkJcmVmWG1sLmFkZENoaWxkKGwuZ2V0WG1sRWxlbWVudChmYWxzZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TGF5b3V0cygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBuYW1lIHdpdGggdGhlIGdpdmVuIGV4dGVuc2lvbiBmb3IgdGhlIGdpdmVuIGxheW91dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKExheW91dEluZm8gaW5mbywgU3RyaW5nIGV4dCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZU5hbWUoZWxlbWVudCwgbnVsbCwgaW5mby5uYW1lLCBleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRUYXJnZXQoTWV0aG9kRWxlbWVudCB0YXJnZXRFbGVtZW50KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudE93bmVyKE1ldGhvZEVsZW1lbnQgb3duZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgaHRtbCBjb250ZW50IGdlbmVyYXRlZCBmcm9tIHRoaXMgeHNsIGZpbGUgbmVlZHMgdG8gYmUgc2Nhbm5lZCBvciBub3QKLQkgKiBzY2FuIHRoZSBjb250ZW50IGlzIGZvciBpZGVudGlmeWluZyBlbGVtZW50IHJlZmVyZW5jZXMgaW4gdGhlIGNvbnRlbnQgYW5kIGNvcHkgb3ZlciByZXNvdXJjZSBmaWxlcwotCSAqIGluIHNvbWUgY2FzZXMgd2UgZG9uJ3QgbmVlZCB0byBzY2FuIHRoZSBjb250ZW50LCBmb3IgZXhhbXBsZSwgdGhlIGFjdGl2aXR5IGJyZWFrZG93biBzdHJ1Y3R1cmUKLQkgKiAKLQkgKiBAcGFyYW0geHNsVXJsIHRoZSB4c2wgdGhhdCBodG1sIGlzIGdlbmVyYXRlZCBmcm9tLCBudWxsIGZvciB0aGUgZGVmYXVsdCB4c2wgbGF5b3V0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbmVlZENvbnRlbnRTY2FuKFN0cmluZyB4c2xVcmwpCi0JewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNob3dFbGVtZW50TGluayhib29sZWFuIHNob3cpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9TdXBwb3J0aW5nTWF0ZXJpYWxMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9TdXBwb3J0aW5nTWF0ZXJpYWxMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2RjMjE4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvU3VwcG9ydGluZ01hdGVyaWFsTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFN1cHBvcnRpbmcgTWF0ZXJpYWwuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN1cHBvcnRpbmdNYXRlcmlhbExheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJTGlzdCBjb250ZW50RWxlbWVudHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5TdXBwb3J0aW5nTWF0ZXJpYWxfQ29udGVudEVsZW1lbnRzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuU3VwcG9ydGluZ01hdGVyaWFsX0NvbnRlbnRFbGVtZW50cywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGFza0Rlc2NyaXB0b3JMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UYXNrRGVzY3JpcHRvckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZWNkY2Y2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UYXNrRGVzY3JpcHRvckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGxheW91dCBmb3IgYSBUYXNrRGVzY3JpcHRvci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9yTGF5b3V0IGV4dGVuZHMgRGVzY3JpcHRvckxheW91dCB7Ci0KLQlwdWJsaWMgVGFza0Rlc2NyaXB0b3JMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlyZXR1cm4gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFic3RyYWN0RWxlbWVudExheW91dCNsb2FkUmVmZXJlbmNlcyhYbWxFbGVtZW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRSZWZlcmVuY2VzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnRpZXMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCkpIHsKLQkJCQkJLy8gbmVlZCB0byBoYW5kbGUgdGhlIHN0ZXAgY29udGVudHMgYnkgZml4aW5nIHRoZSBsaW5rcwotCQkJCQlwcm9jZXNzU3RlcHMoZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCQkJfSBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSkgewotCQkJCQlzdXBlci5sb2FkV29ya09yZGVyKGVsZW1lbnRYbWwpOwotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJCWxvYWRGZWF0dXJlKGZlYXR1cmUsIGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJTaG93RnVsbE1ldGhvZENvbnRlbnQiLCAobGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQkJCi0JCWlmICgoc3VwZXIuZWxlbWVudExheW91dCAhPSBudWxsICkgJiYgbGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSApIHsKLQkJCS8vIGFsc28gbG9hZCB0aGUgbGlua2VkIGVsZW1lbnQgcmVmZXJlbmNlZCBpbmZvcm1hdGlvbgotCQkJc3VwZXIuZWxlbWVudExheW91dC5sb2FkRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1Rvb2xNZW50b3JzKCksIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJCXN1cGVyLmVsZW1lbnRMYXlvdXQubG9hZEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJCXN1cGVyLmVsZW1lbnRMYXlvdXQubG9hZEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLCBlbGVtZW50WG1sLCBmYWxzZSk7Ci0JCQlzdXBlci5lbGVtZW50TGF5b3V0LmxvYWRGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJCXN1cGVyLmVsZW1lbnRMYXlvdXQubG9hZEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwgZWxlbWVudFhtbCwgZmFsc2UpOwotCQkJc3VwZXIuZWxlbWVudExheW91dC5sb2FkRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJCXN1cGVyLmVsZW1lbnRMYXlvdXQubG9hZEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLCBlbGVtZW50WG1sLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1N0ZXBzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQlYbWxFbGVtZW50IHN0ZXBYbWwgPSBlbGVtZW50WG1sCi0JCQkJLm5ld0NoaWxkKCJyZWZlcmVuY2VMaXN0Iikuc2V0QXR0cmlidXRlKCJuYW1lIiwgZmVhdHVyZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gaXQubmV4dCgpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIGU7Ci0JCQkJCWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KG1lLAotCQkJCQkJCWxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCQkJSUVsZW1lbnRMYXlvdXQgbCA9IGxheW91dE1hbmFnZXIuZ2V0TGF5b3V0KG1lLCB0cnVlKTsKLQkJCQkJCWlmIChsICE9IG51bGwpIHsKLQkJCQkJCQlsLnNldENvbnRlbnRUYXJnZXQoZWxlbWVudCk7Ci0JCQkJCQkJc3RlcFhtbC5hZGRDaGlsZChsCi0JCQkJCQkJCQkuZ2V0WG1sRWxlbWVudChDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkJCQkJCS5pc0Rlc2NyaXB0aW9uRWxlbWVudChtZSkgPyB0cnVlCi0JCQkJCQkJCQkJCTogaW5jbHVkZVJlZmVyZW5jZXMpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Rhc2tMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UYXNrTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1MTE2YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Rhc2tMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgVGFzay4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza0xheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgVGFza0xheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlUYXNrIHRhc2sgPSAoVGFzaykgc3VwZXIuZWxlbWVudDsKLQkJCVJvbGUgcGVyZm9ybWluZ1JvbGUgPSB0YXNrLmdldFBlcmZvcm1lZEJ5KCk7Ci0JCQlpZiAocGVyZm9ybWluZ1JvbGUgIT0gbnVsbCkgewotCQkJCU1ldGhvZEVsZW1lbnQgcm9sZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoCi0JCQkJCQkoTWV0aG9kRWxlbWVudCkgcGVyZm9ybWluZ1JvbGUsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcm9sZU5hbWUgPSAoKFJvbGUpIHJvbGUpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQkJaWYgKHJvbGVOYW1lID09IG51bGwgfHwgcm9sZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJcm9sZU5hbWUgPSByb2xlLmdldE5hbWUoKTsKLQkJCQkJfQotCQkJCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgicGVyZm9ybWluZ1JvbGVOYW1lIiwgcm9sZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCWFkZFJlZmVyZW5jZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCksIGVsZW1lbnRYbWwsICJwZXJmb3JtaW5nUm9sZSIsIHJvbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQkvLyBjYWxjdWxhdGUgdGhlIGNhdGVnb3JpZXMgb3Bwb3NpdGUgZmVhdHVyZQotCQkJLy8gbXVsdGlwbGljaXR5IGNoYW5nZSBmb3Igb3Bwb3NpdGUgZmVhdHVyZXMKLQkJCUxpc3QgZGlzY2lwbGluZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJc3VwZXIuZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuVGFza19EaXNjaXBsaW5lcywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlRhc2tfRGlzY2lwbGluZXMsIGVsZW1lbnRYbWwsICJkaXNjaXBsaW5lcyIsIGRpc2NpcGxpbmVzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlMaXN0IHVzZXJjYXRlZ29yaWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCXN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkRlc2NyaWJhYmxlRWxlbWVudF9DdXN0b21DYXRlZ29yaWVzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCXByb2Nlc3NDaGlsZChBc3NvY2lhdGlvbkhlbHBlci5EZXNjcmliYWJsZUVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcywgCi0JCQkJCWVsZW1lbnRYbWwKLQkJCQkJCQkubmV3Q2hpbGQoInJlZmVyZW5jZUxpc3QiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiY3VzdG9tQ2F0ZWdvcmllcyIpLCB1c2VyY2F0ZWdvcmllcywgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCX0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGVhbVByb2ZpbGVMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UZWFtUHJvZmlsZUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjUxMWQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UZWFtUHJvZmlsZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIFRlYW0gUHJvZmlsZSBsYXlvdXQgZm9yIGJyb3dzaW5nCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFRlYW1Qcm9maWxlTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgVGVhbVByb2ZpbGVMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCX0KLQkvKioKLQkgKiBsb2FkIHRoZSBub24tYXR0cmlidXRlIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBlbGVtZW50WG1sCi0JICogQHBhcmFtIGluY2x1ZGVSZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHZvaWQgbG9hZEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFhtbEVsZW1lbnQgZWxlbWVudFhtbCwKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJaWYgKCEoZmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUNsYXNzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIG5hbWUgPSBmZWF0dXJlLmdldE5hbWUoKTsKLQotCQlpZiAoIWZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKGVsZW1lbnQsCi0JCQkJCWZlYXR1cmUsIGxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJLy8gQnJvd3Npbmcgc3RvcHMgd29ya2luZyB3aGVuIGEgcm9sZSBpcyBzZXQgdG8KLQkJCS8vIHJlcGxhY2VkIGFub3RoZXIgcm9sZQotCQkJLy8gZm9yIHJlcGxhY2VyLCB0aGUgYmFzZSB3aWxsIGJlIGV2YWx1YXRlZCB0byB0aGUgcmVwbGFjZXIKLQkJCS8vIGFuZCBjYXVzaW5nIGRlYWRsb2NrCi0JCQlpZiAoZSAhPSBudWxsICYmIGUgIT0gZWxlbWVudCkgewotCQkJCWJvb2xlYW4gc2hvd0RldGFpbCA9IChDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkuaXNEZXNjcmlwdGlvbkVsZW1lbnQoZSkKLQkJCQkvKgotCQkJCSAqIHx8IChwID09Ci0JCQkJICogVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKSkKLQkJCQkgKi8pID8gdHJ1ZSA6IGluY2x1ZGVSZWZlcmVuY2VzOwotCi0JCQkJaWYgKCBhY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgZSkgKSB7Ci0JCQkJCXByb2Nlc3NDaGlsZChmZWF0dXJlLCAKLQkJCQkJCQllbGVtZW50WG1sCi0JCQkJCQkJCQkubmV3Q2hpbGQoInJlZmVyZW5jZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpLCBlLCBzaG93RGV0YWlsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCUxpc3QgcHYgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLAotCQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlMaXN0IHJvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmICgocHYgIT0gbnVsbCkgJiYgKCFwdi5pc0VtcHR5KCkpKQotCQkJewotCQkJCWZvciAoSXRlcmF0b3IgaXRvcj1wdi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgCi0JCQkJCXsKLQkJCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBvYmo7Ci0JCQkJCQlpZiAoKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpCi0JCQkJCQkJfHwgKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpKQotCQkJCQkJCXJvbGVEZXNjTGlzdC5hZGQob2JqKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCBhY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgcm9sZURlc2NMaXN0KSAmJiByb2xlRGVzY0xpc3Quc2l6ZSgpID4gMCApIHsKLQkJCQlhZGRSZWZlcmVuY2VzKGZlYXR1cmUsIGVsZW1lbnRYbWwsIG5hbWUsIHJvbGVEZXNjTGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGVtcGxhdGVMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UZW1wbGF0ZUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YmY4ZTY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UZW1wbGF0ZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFRlbXBsYXRlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgVGVtcGxhdGVMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlRlbXBsYXRlX1dvcmtQcm9kdWN0cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlRlbXBsYXRlX1dvcmtQcm9kdWN0cywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJR3VpZGFuY2UgZ3VpZGFuY2UgPSAoR3VpZGFuY2UpIHN1cGVyLmVsZW1lbnQ7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQkKLQkJCQkvLyBBdXRob3Jpbmc6ICBUZW1wbGF0ZSBhdHRhY2htZW50cyBvZiBhIGNvbnRyaWJ1dGluZyB0ZW1wbGF0ZSBndWlkYW5jZSBlbGVtZW50IGFyZSBub3QgYXBwZW5kZWQgdG8gdGhlIGJhc2UgbGlzdCBvZiBhdHRhY2htZW50cwkJCQkKLQkJCQkvL1N0cmluZyBhdHRhY2htZW50U3RyaW5nID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24pY29udGVudCkuZ2V0QXR0YWNobWVudHMoKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKTsKLQkJCQlTdHJpbmcgYXR0YWNobWVudFN0cmluZyA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGNvbnRlbnQsIHN1cGVyLmVsZW1lbnQsIGZlYXR1cmUsIHN1cGVyLmxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlpZiAoIChhdHRhY2htZW50U3RyaW5nICE9IG51bGwpICYmIChhdHRhY2htZW50U3RyaW5nLmluZGV4T2YoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SKSA+IDApICkKLQkJCQl7Ci0JCQkJCWF0dGFjaG1lbnRTdHJpbmcgPSBhdHRhY2htZW50U3RyaW5nLnJlcGxhY2VBbGwoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SLCBUbmdVdGlsLkdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SKTsgCi0JCQkJfQotCQkJCUxpc3QgYXR0YWNobWVudExpc3QgPSBUbmdVdGlsLmNvbnZlcnRHdWlkYW5jZUF0dGFjaG1lbnRzVG9MaXN0KGF0dGFjaG1lbnRTdHJpbmcpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGF0dGFjaG1lbnRMaXN0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyBhdHRhY2htZW50RmlsZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoYXR0YWNobWVudEZpbGUgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVV0aWwuZ2V0RmlsZU5hbWUoYXR0YWNobWVudEZpbGUpOwotCQkJCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCSJhdHRhY2hlZEZpbGUiKS5zZXRBdHRyaWJ1dGUoIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJInVybCIsICJmaWxlOi8vIiArIGF0dGFjaG1lbnRGaWxlKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImZpbGVOYW1lIiwgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkIAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Ub29sTWVudG9yTGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVG9vbE1lbnRvckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YWM3Zjk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Ub29sTWVudG9yTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFRvb2wgTWVudG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sTWVudG9yTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBUb29sTWVudG9yTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJTGlzdCBjb250ZW50RWxlbWVudHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Ub29sTWVudG9yX1Rhc2tzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuVG9vbE1lbnRvcl9UYXNrcywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJTWV0aG9kRWxlbWVudCB0b29sID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUoCi0JCQkJCXN1cGVyLmVsZW1lbnQsIEFzc29jaWF0aW9uSGVscGVyLlRvb2xNZW50b3JfVG9vbCwKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2UoQXNzb2NpYXRpb25IZWxwZXIuVG9vbE1lbnRvcl9Ub29sLCBlbGVtZW50WG1sLCAidG9vbCIsIHRvb2wpOyAvLyROT04tTkxTLTEkCQkJCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9XaGl0ZXBhcGVyTGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvV2hpdGVwYXBlckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNzEzNjNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9XaGl0ZXBhcGVyTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgV2hpdGVwYXBlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdoaXRlcGFwZXJMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCQotCXB1YmxpYyBXaGl0ZXBhcGVyTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsIAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Db25jZXB0X0NvbnRlbnRFbGVtZW50cywgCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Db25jZXB0X0NvbnRlbnRFbGVtZW50cywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJR3VpZGFuY2UgZ3VpZGFuY2UgPSAoR3VpZGFuY2UpIHN1cGVyLmVsZW1lbnQ7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQkKLQkJCQkvLyBBdXRob3Jpbmc6ICBUZW1wbGF0ZSBhdHRhY2htZW50cyBvZiBhIGNvbnRyaWJ1dGluZyB0ZW1wbGF0ZSBndWlkYW5jZSBlbGVtZW50IGFyZSBub3QgYXBwZW5kZWQgdG8gdGhlIGJhc2UgbGlzdCBvZiBhdHRhY2htZW50cwkJCQkKLQkJCQkvL1N0cmluZyBhdHRhY2htZW50U3RyaW5nID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24pY29udGVudCkuZ2V0QXR0YWNobWVudHMoKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKTsKLQkJCQlTdHJpbmcgYXR0YWNobWVudFN0cmluZyA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGNvbnRlbnQsIHN1cGVyLmVsZW1lbnQsIGZlYXR1cmUsIHN1cGVyLmxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlpZiAoIChhdHRhY2htZW50U3RyaW5nICE9IG51bGwpICYmIChhdHRhY2htZW50U3RyaW5nLmluZGV4T2YoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SKSA+IDApICkKLQkJCQl7Ci0JCQkJCWF0dGFjaG1lbnRTdHJpbmcgPSBhdHRhY2htZW50U3RyaW5nLnJlcGxhY2VBbGwoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SLCBUbmdVdGlsLkdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SKTsgCi0JCQkJfQotCQkJCUxpc3QgYXR0YWNobWVudExpc3QgPSBUbmdVdGlsLmNvbnZlcnRHdWlkYW5jZUF0dGFjaG1lbnRzVG9MaXN0KGF0dGFjaG1lbnRTdHJpbmcpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGF0dGFjaG1lbnRMaXN0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyBhdHRhY2htZW50RmlsZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoYXR0YWNobWVudEZpbGUgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVV0aWwuZ2V0RmlsZU5hbWUoYXR0YWNobWVudEZpbGUpOwotCQkJCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCSJhdHRhY2hlZEZpbGUiKS5zZXRBdHRyaWJ1dGUoIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJInVybCIsICJmaWxlOi8vIiArIGF0dGFjaG1lbnRGaWxlKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImZpbGVOYW1lIiwgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkIAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrQnJlYWtkb3duRWxlbWVudExheW91dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtCcmVha2Rvd25FbGVtZW50TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzZGQzNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtCcmVha2Rvd25FbGVtZW50TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogVGhlIGxheW91dCBmb3Igd29yayBicmVha2Rvd24gRWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudExheW91dCBleHRlbmRzIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSB0aGUgd29ya29yZGVyCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sLCBib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcwotCQkJCQkJLmdldChpKTsKLQkJCQlpZiAoZmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJCWlmIChmZWF0dXJlICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCkpIHsKLQkJCQkJCWxvYWRGZWF0dXJlKGZlYXR1cmUsIGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN1cGVyLmxvYWRXb3JrT3JkZXIoZWxlbWVudFhtbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDk0ODA1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JMYXlvdXQgZXh0ZW5kcyBEZXNjcmlwdG9yTGF5b3V0IHsKLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BYnN0cmFjdEVsZW1lbnRMYXlvdXQjbG9hZFJlZmVyZW5jZXMoWG1sRWxlbWVudCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkUmVmZXJlbmNlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQotCQlzdXBlci5sb2FkUmVmZXJlbmNlcyhlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCQotCQkvLyAxNjEzMjUgLSBXUERlc2NyaXB0b3JzIGRpZCBub3Qgc2hvdyBtb2RpZnkgUm9sZURlc2NyaXB0b3JzCi0JCS8vIGdldCB0aGUgbW9kaWZpZXMgZmVhdHVyZQotCQkvLyB0aGlzIGd1eSBkb2VzIG5vdCBoYXZlIGEgZGVmaW5lZCBvcHBvc2l0ZSBmZWF0dXJlCi0JCUxpc3QgbW9kaWZ5Um9sZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNNb2RpZnlSb2xlRGVzY3JpcHRvcnMoCi0JCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcilzdXBlci5lbGVtZW50LCAKLQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCi0JCWFkZFJlZmVyZW5jZXMobnVsbCwgZWxlbWVudFhtbCwgIndvcmtlZE9uQnkiLCBtb2RpZnlSb2xlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJTaG93RnVsbE1ldGhvZENvbnRlbnQiLCAobGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQkJCi0JCWlmICgoc3VwZXIuZWxlbWVudExheW91dCAhPSBudWxsICkgJiYgbGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSApIHsKLQkJCS8vIGFsc28gbG9hZCB0aGUgbGlua2VkIGVsZW1lbnQgcmVmZXJlbmNlZCBpbmZvcm1hdGlvbgotCQkJc3VwZXIuZWxlbWVudExheW91dC5sb2FkRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgZWxlbWVudFhtbCwgZmFsc2UpOwotCQkJc3VwZXIuZWxlbWVudExheW91dC5sb2FkRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCksIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJCXN1cGVyLmVsZW1lbnRMYXlvdXQubG9hZEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCksIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJCXN1cGVyLmVsZW1lbnRMYXlvdXQubG9hZEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKSwgZWxlbWVudFhtbCwgZmFsc2UpOwotCQkJc3VwZXIuZWxlbWVudExheW91dC5sb2FkRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwgZWxlbWVudFhtbCwgZmFsc2UpOwotCQkJc3VwZXIuZWxlbWVudExheW91dC5sb2FkRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJCXN1cGVyLmVsZW1lbnRMYXlvdXQubG9hZEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwgZWxlbWVudFhtbCwgZmFsc2UpOwotCQkJc3VwZXIuZWxlbWVudExheW91dC5sb2FkRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLCBlbGVtZW50WG1sLCBmYWxzZSk7Ci0JCQlzdXBlci5lbGVtZW50TGF5b3V0LmxvYWRGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwgZWxlbWVudFhtbCwgZmFsc2UpOwotCQkJc3VwZXIuZWxlbWVudExheW91dC5sb2FkRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrUHJvZHVjdExheW91dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtQcm9kdWN0TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljNjEwNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtQcm9kdWN0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhbiBBcnRpZmFjdC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIFdvcmtQcm9kdWN0TGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQotCQkJLy8gbm8gdGhpcyB3aWxsIGxvc2UgdGhlIGNvbnRyaWJ1dG9yCi0JCQkvLyBSb2xlIHJlc3BvbnNpYmxlUm9sZSA9Ci0JCQkvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGUoKFdvcmtQcm9kdWN0KXN1cGVyLmVsZW1lbnQpOwotCQkJLy9tdWx0aXBsaWNpdHkgY2hhbmdlIGZvciBvcHBvc2l0ZSBmZWF0dXJlcwotCQkJTGlzdCByZXNwb25zaWJsZVJvbGVzID0gQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlcywKLQkJCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLS8vCQkJaWYgKHJlc3BvbnNpYmxlUm9sZSAhPSBudWxsKSB7Ci0vLwkJCQlNZXRob2RFbGVtZW50IHJvbGUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KAotLy8JCQkJCQkoTWV0aG9kRWxlbWVudCkgcmVzcG9uc2libGVSb2xlLCBsYXlvdXRNYW5hZ2VyCi0vLwkJCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0vLwkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0vLwkJCQkJU3RyaW5nIHJvbGVOYW1lID0gKChSb2xlKSByb2xlKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0vLwkJCQkJaWYgKHJvbGVOYW1lID09IG51bGwgfHwgcm9sZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotLy8JCQkJCQlyb2xlTmFtZSA9IHJvbGUuZ2V0TmFtZSgpOwotLy8JCQkJCX0KLS8vCQkJCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgicmVzcG9uc2libGVSb2xlTmFtZSIsIHJvbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCWFkZFJlZmVyZW5jZShBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGUsIGVsZW1lbnRYbWwsICJyZXNwb25zaWJsZVJvbGUiLCByb2xlKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJfQotLy8JCQl9Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXMsIGVsZW1lbnRYbWwsICJyZXNwb25zaWJsZVJvbGVzIiwgcmVzcG9uc2libGVSb2xlcyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gQnJvd3NpbmcgYSBDb25maWd1cmF0aW9uIEluY2x1ZGVzIGEgUmVsYXRpb25zaGlwIHRoYXQgaXMgbm90IFBhcnQgb2YgdGhlIENvbmZpZ3VyYXRpb24KLQkJCS8vIHNob3VsZCBjYWxsIHRoZSBjb25maWd1cmF0aW9uIGhlbHBlciB0byByZWFsaXplIHRoZSB2YWx1ZQotCQkJLy8gdGhlcmUgaXMgbm8gb3Bwb3NpdGUgZmVhdHVyZSBkZWZpbmVkIGZvciB0aGlzLiAKLQkJCS8vIHdlIGdldCB0aGUgdmFsdWUgaW4gdHdvIHN0ZXBzOgotCQkJLy8gMS4gZ2V0IHRoZSB0YXNrcyB0aGF0IG91dHB1dCB0aGlzIFdQCi0JCQkvLyAyLiBnZXQgdGhlIHJvbGVzIHRoYXQgaXMgdGhlIHJlc3BvbnNpYmxlIGZvciB0aGUgdGFza3MKLS8vCQkJTGlzdCBtb2RpZnlSb2xlcyA9IEFzc29jaWF0aW9uSGVscGVyCi0vLwkJCQkJLmdldE1vZGlmaWVkQnkoKFdvcmtQcm9kdWN0KSBzdXBlci5lbGVtZW50KTsKLS8vCQkJbW9kaWZ5Um9sZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50cygKLS8vCQkJCQltb2RpZnlSb2xlcywgbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCi0vLwkJCUxpc3QgdGFza3MgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLS8vCQkJCQlzdXBlci5lbGVtZW50LCAKLS8vCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9PdXRwdXRGcm9tX1Rhc2tzLCAKLS8vCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLS8vCQkJTGlzdCBtb2RpZnlSb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJZm9yIChJdGVyYXRvciBpdCA9IHRhc2tzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCQlUYXNrIHQgPSAoVGFzaylpdC5uZXh0KCk7Ci0vLwkJCQlMaXN0IHJvbGVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0vLwkJCQkJCXQsIAotLy8JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCksIAotLy8JCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRyID0gcm9sZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgKSB7Ci0vLwkJCQkJT2JqZWN0IHIgPSBpdHIubmV4dCgpOwotLy8JCQkJCWlmICggIW1vZGlmeVJvbGVzLmNvbnRhaW5zKHIpICkgewotLy8JCQkJCQltb2RpZnlSb2xlcy5hZGQocik7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0JCQkKLQkJCUxpc3QgbW9kaWZ5Um9sZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNNb2RpZnlSb2xlcygKLQkJCQkJKFdvcmtQcm9kdWN0KXN1cGVyLmVsZW1lbnQsIAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQotCQkJLy8gdGhpcyBndXkgZG9lcyBub3QgaGF2ZSBhIGRlZmluZWQgb3Bwb3NpdGUgZmVhdHVyZQotCQkJLy8ganVzdCBwYXNzIG51bGwgYXMgaXQncyBmZWF0dXJlIG9iamVjdCwgSmluaHVhIFhpLCAwNC8xNy8yMDA2Ci0JCQlhZGRSZWZlcmVuY2VzKG51bGwsIGVsZW1lbnRYbWwsICJtb2RpZnlSb2xlcyIsIG1vZGlmeVJvbGVzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlMaXN0IGRvbWFpbnMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJc3VwZXIuZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfRG9tYWlucywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X0RvbWFpbnMsIGVsZW1lbnRYbWwsICJkb21haW5zIiwgZG9tYWlucyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJTGlzdCB3b3JrUHJvZHVjdFR5cGVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3RUeXBlcywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1dvcmtQcm9kdWN0VHlwZXMsIGVsZW1lbnRYbWwsICJ3b3JrUHJvZHVjdFR5cGVzIiwgd29ya1Byb2R1Y3RUeXBlcyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJTGlzdCBtYW5kYXRvcnlJbnB1dFRvVGFza3MgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfTWFuZGF0b3J5SW5wdXRUb19UYXNrcywgZWxlbWVudFhtbCwKLQkJCQkJIm1hbmRhdG9yeUlucHV0VG9UYXNrcyIsIG1hbmRhdG9yeUlucHV0VG9UYXNrcyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJTGlzdCBvcHRpb25hbElucHV0VG9UYXNrcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X09wdGlvbmFsSW5wdXRUb19UYXNrcywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X09wdGlvbmFsSW5wdXRUb19UYXNrcywgZWxlbWVudFhtbCwKLQkJCQkJIm9wdGlvbmFsSW5wdXRUb1Rhc2tzIiwgb3B0aW9uYWxJbnB1dFRvVGFza3MpOyAvLyROT04tTkxTLTEkCi0KLQkJCUxpc3Qgb3V0cHV0RnJvbVRhc2tzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MsIAotCQkJCQllbGVtZW50WG1sLCAib3V0cHV0RnJvbVRhc2tzIiwgb3V0cHV0RnJvbVRhc2tzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3YzRmM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGxheW91dCBtYW5hZ2VtZW50IGZvciBtZXRob2QgYW5kIHByb2Nlc3MgZWxlbWVudHMgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2Q1YmVmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIG1hbmFnaW5nIHRoZSBsYXlvdXQgb2YgbWV0aG9kIGFuZCBwcm9jZXNzIGVsZW1lbnRzIGluIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvSVhtbEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL0lYbWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlYzg3ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvSVhtbEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGFuIFhNTCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElYbWxFbGVtZW50IHsKLQotCS8qKgotCSAqIGdldCB0aGUgeG1sIHN0cmluZyB0ZXh0Ci0JICogQHJldHVybiBTdHJpbmdCdWZmZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIHRvWG1sKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL1htbEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL1htbEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2ZmOTYxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9YbWxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnRzIGEgWE1MIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhtbEVsZW1lbnQgaW1wbGVtZW50cyBJWG1sRWxlbWVudCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUiA9IEZpbGVVdGlsLkxJTkVfU0VQOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE5PREVfSUQgPSAibm9kZUlkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBBUkVOVF9OT0RFX0lEID0gInBhcmVudE5vZGVJZCI7Ci0KLQlwcml2YXRlIFN0cmluZyBlbGVtZW50X25hbWUgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgZWxlbWVudF92YWx1ZSA9IG51bGw7Ci0KLQlwcml2YXRlIE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgTWFwIGNvbnRlbnRzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKLQotCS8qKgotCSAqIGNyZWF0ZSBhbiBYbWxFbGVtZW50Ci0JICogCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcyhuYW1lLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgYW4gWG1sRWxlbWVudAotCSAqIEBwYXJhbSBuYW1lIFN0cmluZwotCSAqIEBwYXJhbSBpZCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudChTdHJpbmcgbmFtZSwgU3RyaW5nIGlkKSB7Ci0JCXRoaXMuZWxlbWVudF9uYW1lID0gbmFtZTsKLQkJCi0JCWlmIChpZCA9PSBudWxsICkgewotCQkJaWQgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKHRoaXMudG9TdHJpbmcoKS5oYXNoQ29kZSgpKTsKLQkJfQotCQkKLQkJdGhpcy5pZCA9IGlkOwotCQlzZXRBdHRyaWJ1dGUoTk9ERV9JRCwgdGhpcy5pZCk7Ci0JfQotCQotCS8qKgotCSAqIHNldCBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gWG1sRWxlbWVudCB0aGUgZWxlbWVudCBpdHNlbGYKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlhdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQgdGhlIGVsZW1lbnQgaXRzZWxmCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuZWxlbWVudF92YWx1ZSA9IHZhbHVlOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQuCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQgdGhlIGVsZW1lbnQgaXRzZWxmCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgc2V0Q29udGVudChTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWNvbnRlbnRzLnB1dChuYW1lLCB2YWx1ZSk7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIGFkZCBhIGNoaWxkIGVsZW1lbnQKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQgdGhlIGVsZW1lbnQgaXRzZWxmCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgYWRkQ2hpbGQoWG1sRWxlbWVudCBjaGlsZCkgewotCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBuZXcgY2hpaWxkIGVsZW1lbnQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gWG1sRWxlbWVudCB0aGUgY2hpbGQgZWxlbWVudAotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IG5ld0NoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuZXdDaGlsZChuYW1lLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogY3JlYXRlIGEgbmV3IGNoaWxkIGVsZW1lbnQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBpZAotCSAqIEByZXR1cm4gWG1sRWxlbWVudCB0aGUgY2hpbGQgZWxlbWVudAotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IG5ld0NoaWxkKFN0cmluZyBuYW1lLCBTdHJpbmcgaWQpIHsKLQkJWG1sRWxlbWVudCBjaGlsZCA9IG5ldyBYbWxFbGVtZW50KG5hbWUsIGlkKTsKLQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgaWQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiB0aGlzLmlkOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHhtbCBzdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZ0J1ZmZlcgotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgdG9YbWwoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChjb250ZW50cy5zaXplKCkgPT0gMCAmJiBjaGlsZHJlbi5zaXplKCkgPT0gMCkgewotCQkJYnVmZmVyLmFwcGVuZCgKLQkJCQkJWG1sSGVscGVyLmdldEVsZW1lbnQoZWxlbWVudF9uYW1lLCBlbGVtZW50X3ZhbHVlLAotCQkJCQkJCWF0dHJpYnV0ZXMpKS5hcHBlbmQoQlIpOwotCQl9IGVsc2UgewotCQkJYnVmZmVyLmFwcGVuZChYbWxIZWxwZXIuYmVnaW5FbGVtZW50KGVsZW1lbnRfbmFtZSwgYXR0cmlidXRlcykpCi0JCQkJCS5hcHBlbmQoQlIpOwotCi0JCQkvLyBwcm9jZXNzIHRoZSBjb250ZW50cwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNvbnRlbnRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRMaXN0ID0gKChMaXN0KSB2YWx1ZSkuaXRlcmF0b3IoKTsgaXRMaXN0Ci0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoCi0JCQkJCQkJCVhtbEhlbHBlci5nZXRFbGVtZW50KGtleSwgaXRMaXN0Lm5leHQoKQotCQkJCQkJCQkJCS50b1N0cmluZygpLCBudWxsKSkuYXBwZW5kKEJSKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWJ1ZmZlcgotCQkJCQkJCS5hcHBlbmQoCi0JCQkJCQkJCQlYbWxIZWxwZXIKLQkJCQkJCQkJCQkJLmdldEVsZW1lbnQoCi0JCQkJCQkJCQkJCQkJa2V5LAotCQkJCQkJCQkJCQkJCSh2YWx1ZSA9PSBudWxsKSA/ICIiIDogdmFsdWUudG9TdHJpbmcoKSwgbnVsbCkpLmFwcGVuZChCUik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHByb2Nlc3MgdGhlIGNoaWxkcmVuCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUlYbWxFbGVtZW50IGNoaWxkID0gKElYbWxFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJYnVmZmVyLmFwcGVuZChjaGlsZC50b1htbCgpKTsKLQkJCX0KLQotCQkJYnVmZmVyLmFwcGVuZChYbWxIZWxwZXIuZW5kRWxlbWVudChlbGVtZW50X25hbWUpKS5hcHBlbmQoQlIpOwotCQl9Ci0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci0KLQkvKioKLQkgKiBzYXZlIHRoZSBlbGVtZW50J3MgeG1sIHRvIGEgZmlsZQotCSAqIEBwYXJhbSBmaWxlUGF0aE5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlVG8oU3RyaW5nIGZpbGVQYXRoTmFtZSkgewotCQlTdHJpbmdCdWZmZXIgeG1sID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl4bWwuYXBwZW5kKFhtbEhlbHBlci5YTUxfSEVBREVSKS5hcHBlbmQodGhpcy50b1htbCgpKTsKLQotCQl0cnkgewotCQkJLy8gbWF5IG5lZWQgdG8gY3JlYXRlIHRoZSBmb2xkZXJzLCBUT0RPCi0JCQkvKgotCQkJICogRmlsZSB4ZiA9IG5ldyBGaWxlKCBmaWxlUGF0aCk7IGlmICggIXhmLmV4aXN0cygpICkgeyB4Zi5ta2RpcnMoKTsgfQotCQkJICovCi0KLQkJCS8vIG5lZWQgdG8gZW5mb3JlIHV0Zi04IGVuY29kaW5nLCBjYW4ndCB1c2UgRmlsZVdyaXRlciwganhpCi0JCQkvLyBGaWxlV3JpdGVyIHh3ID0gbmV3IEZpbGVXcml0ZXIoZmlsZVBhdGhOYW1lKTsKLQkJCU91dHB1dFN0cmVhbVdyaXRlciB4dyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0JCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVQYXRoTmFtZSksICJ1dGYtOCIpOyAvLyROT04tTkxTLTEkCi0KLQkJCXh3LndyaXRlKHhtbC50b1N0cmluZygpKTsKLQkJCXh3LmZsdXNoKCk7Ci0JCQl4dy5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvWG1sSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9YbWxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTVmYWQyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9YbWxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgcHJvY2Vzc2luZyB0aGUgWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgTWV0aG9kIEVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqLwotcHVibGljIGNsYXNzIFhtbEhlbHBlciB7Ci0KLQkvKioKLQkgKiBYTUwgZGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0hFQURFUiA9IFhNTFV0aWwuWE1MX0RFQ0xBUkFUSU9OCi0JCQkrIEZpbGVVdGlsLkxJTkVfU0VQOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWROYW1lKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gWE1MVXRpbC5lc2NhcGUoZWxlbWVudE5hbWUucmVwbGFjZSgnICcsICctJykpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHF1b3RlKFN0cmluZyBzdHIpIHsKLQkJcmV0dXJuICJcIiIgKyBzdHIgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgcykgewotCQlyZXR1cm4gcyA9PSBudWxsID8gIiIgOiBzOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogY3JlYXRlIHRoZSBzdGFydCB0YWcgb2YgYW4geG1sIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUKLQkgKiBAcGFyYW0gYXR0cmlidXRlcwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmVnaW5FbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSwgTWFwIGF0dHJpYnV0ZXMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiPCIgKyB2YWxpZE5hbWUoZWxlbWVudE5hbWUpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoKGF0dHJpYnV0ZXMgIT0gbnVsbCkgJiYgKGF0dHJpYnV0ZXMuc2l6ZSgpID4gMCkpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQlTdHJpbmcga2V5LCB2YWx1ZTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQkJa2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJdmFsdWUgPSBxdW90ZShYTUxVdGlsLmVzY2FwZSgKLQkJCQkJCXZhbGlkYXRlKChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCkpLCB0cnVlKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiICIgKyB2YWxpZE5hbWUoa2V5KSArICI9IiArIHZhbHVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiPiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgYW4gZW5kIHRhZyBvZiBhbiB4bWwgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50TmFtZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5kRWxlbWVudChTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuICI8LyIgKyB2YWxpZE5hbWUoZWxlbWVudE5hbWUpICsgIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgYW4geG1sIGVsZW1lbnQgc3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnROYW1lCi0JICogQHBhcmFtIGVsZW1lbnRWYWx1ZQotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGVsZW1lbnRWYWx1ZSwKLQkJCU1hcCBhdHRyaWJ1dGVzKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoYmVnaW5FbGVtZW50KGVsZW1lbnROYW1lLCBhdHRyaWJ1dGVzKSkuYXBwZW5kKAotCQkJCVhNTFV0aWwuZXNjYXBlKHZhbGlkYXRlKGVsZW1lbnRWYWx1ZSksIHRydWUpKS5hcHBlbmQoCi0JCQkJZW5kRWxlbWVudChlbGVtZW50TmFtZSkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkMGYwMzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgbGF5b3V0IG1hbmFnZW1lbnQgc3VwcG9ydCBmb3IgbWV0aG9kIGFuZCBwcm9jZXNzIGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDkxNjE1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdGhlIGxpYnJhcnkgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZlcmVuY2VzL0xpYnJhcnlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZTE4MzY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZlcmVuY2VzL0xpYnJhcnlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLQotLyoqCi0gKiBUaGUgTGlicmFyeSBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5UHJlZmVyZW5jZXMgewotCi0JLyoqCi0JICogVGhlIExpYnJhcnkgcHJlZmVyZW5jZSBrZXlzIHByZWZpeC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAibGlicmFyeS4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmZXJlbmNlIGtleSBmb3Igc3RvcmluZyB0aGUgVVJJIG9mIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IHdhcyBvcGVuZWQKLQkgKiBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX01FVEhPRF9MSVJBUllfVVJJID0gUFJFRklYCi0JCQkrICJzYXZlZE1ldGhvZExpYnJhcnlVUkkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmZXJlbmNlIGtleSBmb3Igc3RvcmluZyB0aGUgdHlwZSBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB3YXMgb3BlbmVkCi0JICogaW4gdGhlIGxhc3Qgc2Vzc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9NRVRIT0RfTElSQVJZX1RZUEUgPSBQUkVGSVgKLQkJCSsgInNhdmVkTWV0aG9kTGlicmFyeVR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmZXJlbmNlIGtleSBmb3Igc3RvcmluZyB0aGUgYmFja3VwIGJlZm9yZSBzYXZlIG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLVVBfQkVGT1JFX1NBVkUgPSBQUkVGSVggKyAiYmFja3VwQmVmb3JlU2F2ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByZWZlcmVuY2Uga2V5IGZvciBzdG9yaW5nIHRoZSBkaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcyBvcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMgPSBQUkVGSVgKLQkJCSsgImRpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdldHMgdGhlIFVSSSBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB3YXMgb3BlbmVkIGluIHRoZSBsYXN0IHNlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2F2ZWRNZXRob2RMaWJyYXJ5VVJJKCkgewotCQlyZXR1cm4gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCVNBVkVEX01FVEhPRF9MSVJBUllfVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgVVJJIG9mIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IHdhcyBvcGVuZWQgaW4gdGhlIGxhc3Qgc2Vzc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2F2ZWRNZXRob2RMaWJyYXJ5VVJJKFN0cmluZyB2YWx1ZSkgewotCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlTQVZFRF9NRVRIT0RfTElSQVJZX1VSSSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNhdmVkTWV0aG9kTGlicmFyeVR5cGUoKSB7Ci0JCXJldHVybiBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJU0FWRURfTUVUSE9EX0xJUkFSWV9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgdHlwZSBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB3YXMgb3BlbmVkIGluIHRoZSBsYXN0IHNlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNhdmVkTWV0aG9kTGlicmFyeVR5cGUoU3RyaW5nIHZhbHVlKSB7Ci0JCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCVNBVkVEX01FVEhPRF9MSVJBUllfVFlQRSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGJhY2t1cCBiZWZvcmUgc2F2ZSBvcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEJhY2t1cEJlZm9yZVNhdmUoKSB7Ci0JCXJldHVybiBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCUJBQ0tVUF9CRUZPUkVfU0FWRSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGJhY2t1cCBiZWZvcmUgc2F2ZSBvcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEJhY2t1cEJlZm9yZVNhdmUoYm9vbGVhbiB2YWx1ZSkgewotCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlCQUNLVVBfQkVGT1JFX1NBVkUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcyBvcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oCi0JCQkJRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBkaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcyBvcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcyhib29sZWFuIHZhbHVlKSB7Ci0JCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCURJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTLCB2YWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5Y2MwMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciB0aGUgbGlicmFyeSBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL0JTQ29sdW1uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9CU0NvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNzgxYmFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL0JTQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmczsKLQotLyoqCi0gKiBTaW1wbGUgZGF0YSBzdHJ1Y3R1cmUgdG8gaWRlbnRpZnkgYSBicmVha2Rvd24gbGF5b3V0IGNvbHVtbi4KLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQlNDb2x1bW4gewotCi0JcHVibGljIFN0cmluZyBpZDsKLQlwdWJsaWMgU3RyaW5nIGxhYmVsOwotCQotCXB1YmxpYyBCU0NvbHVtbihTdHJpbmcgaWQsIFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDYzZWM4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnM7Ci0KLS8qKgotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMgZXh0ZW5kcyBQcmVmZXJlbmNlQ29uc3RhbnRzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfREVGQVVMVF9MSUJSQVJZX1BBUkVOVF9ESVJFQ1RPUlkgPSBQUkVGSVggKyAiZGVmYXVsdF9saWJyYXJ5X3BhcmVudF9kaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX0xJQlJBUllfUEFSRU5UX0RJUkVDVE9SWSA9IFBSRUZJWCArICJsYXN0X2xpYnJhcnlfX3BhcmVudF9kaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX0RFRkFVTFRfRElSRUNUT1JZX0NIRUNLRUQgPSBQUkVGSVggKyAibGFzdF9kZWZhdWx0X2RpcmVjdG9yeV9jaGVja2VkIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUkFESU9fU0FWRV9DSE9JQ0UgPSBQUkVGSVggKyAicmFkaW9fc2F2ZV9jaG9pY2UiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX1RSQU5TTEFUSU9OX0VYUE9SVF9ESVJFQ1RPUlkgPSBQUkVGSVggKyAibGFzdF90cmFuc2xhdGlvbl9leHBvcnRfZGlyZWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX1BVQkxJU0hfRk9MREVSID0gUFJFRklYICsgImxhc3RfcHVibGlzaF9mb2xkZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ERUZBVUxUX1BVQkxJU0hfRElSRUNUT1JZID0gUFJFRklYICsgImRlZmF1bHRfcHVibGlzaF9kaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ERUZBVUxUX0ZFRURCQUNLX1VSTCA9IFBSRUZJWCArICJkZWZhdWx0X2ZlZWRiYWNrX3VybCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1BST01QVF9GT1JfTElCUkFSWV9BVF9TVEFSVFVQID0gUFJFRklYICsgInByb21wdF9mb3JfbGlicmFyeV9hdF9zdGFydHVwIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU0VMRUNURURfQ09ORklHX0lOX0xBU1RfU0VTU0lPTiA9IFBSRUZJWCArICJzZWxlY3RlZF9jb25maWdfaW5fbGFzdF9zZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfREVGQVVMVF9ISVNUT1JZX1NJWkUgPSBQUkVGSVggKyAiZGVmYXVsdF9saXN0X2xlbmd0aF9sYWJlbCI7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViNGE2NGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLQotLyoqCi0gKiBDb25zdGFudHMgdG8gYmUgdXNlZCBpbiBwcmVmZXJlbmNlIHN0b3JlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBQcmVmZXJlbmNlQ29uc3RhbnRzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmLiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIG1vdmVkIGZyb20gdG8gaGVyZSB0byBzaGFyZSB0aGUgY29uc3RhbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9XQlNfQ09MVU1OUyA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9UQlNfQ09MVU1OUyA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9XUEJTX0NPTFVNTlMgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQkFDS19VUF9CRUZPUkVfU0FWRSA9IFBSRUZJWAotCQkJKyAiYmFja191cF9iZWZvcmVfc2F2ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMgPSBQUkVGSVgKLQkJCSsgImRpc2NhcmRfdW5yZXNvbHZlZF9yZWZlcmVuY2VzIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRVhURU5EX1NFTUFOVElDU19DSEVDSyA9IFBSRUZJWAotCQkJKyAiZXh0ZW5kX3NlbWFudGljc19jaGVjayI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGRlZmluZSB0aGUgZGVmYXVsdCBjb2x1bW5zIGZvciB3YnMsIHRicywgYW5kIHdwYnMgbGF5b3V0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1dCU19DT0xVTU5TID0gewotCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLAotCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lELCAKLQkJLy9JQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwgCi0JCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLCAKLQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLAotCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUsIAotCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQsIAotCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUsIAotCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywgCi0JCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORywKLQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4sIAotCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMCi0JfTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfVEJTX0NPTFVNTlMgPSB7Ci0JCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfSUQsCi0JCS8vSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgsIAotCQlJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8sIAotCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TLCAKLQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLAotCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQsCi0JCUlCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLCAKLQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PUFRJT05BTAotCX07Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1dQQlNfQ09MVU1OUyA9IHsKLQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwKLQkJLy9JQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwgCi0JCUlCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTywgCi0JCUlCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUsCi0JCUlCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURSwgCi0JCUlCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUsIAotCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUsIAotCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQsIAotCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywgCi0JCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwKLQl9OwotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9QcmVmZXJlbmNlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvUHJlZmVyZW5jZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDIzZGZkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9QcmVmZXJlbmNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogdXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgdGhlIHByb2Nlc3MgZWxlbWVudCBsYXlvdXQgcHJlZmVyZW5jZXMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlVXRpbCB7Ci0JCQotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgeHNsUGFyYW1zOwotCXByaXZhdGUgc3RhdGljIE1hcCBjb2xJZExhYmVsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvLyBxdWljayBzb2x1dGlvbiwgdGhlIHRlYW0gY29sdW1uIGZvciB0aGUgV0JTIHZpZXcuCi0JLy8gMTYyNzgzIC0gUHVibGlzaCB0ZWFtIGluZm9ybWF0aW9uIGluIFdCUyBmb3IgVERzCi0JcHJpdmF0ZSBzdGF0aWMgQlNDb2x1bW4gdGVhbUNvbCA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfU1RFUFMgPSAic3RlcHMiOwotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQl4c2xQYXJhbXMgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9wZXJ0aWVzKAotCQkJCQkiL2xheW91dC94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lELCBnZXRMYWJlbCgiaW5kZXhUZXh0IikpOwotCQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FLCBnZXRMYWJlbCgibmFtZVRleHQiKSk7Ci0JCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLCBnZXRMYWJlbCgiYnJlYWtkb3duRWxlbWVudFRleHQiKSk7Ci0JCQljb2xJZExhYmVsTWFwLnB1dChJRF9TVEVQUywgZ2V0TGFiZWwoInN0ZXBzVGV4dCIpKTsJCQotCQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgsIGdldExhYmVsKCJwcmVmaXhUZXh0IikpOwotCQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLCBnZXRMYWJlbCgidHlwZVRleHQiKSk7Ci0JCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8sIGdldExhYmVsKCJtb2RlbEluZm9UZXh0IikpOwotCQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMsIGdldExhYmVsKCJwcmVkZWNlc3NvcnNUZXh0IikpOwotCQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFLCBnZXRMYWJlbCgicmVwZWF0YWJsZVRleHQiKSk7Ci0JCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcsIGdldExhYmVsKCJvbmdvaW5nVGV4dCIpKTsKLQkJCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOLCBnZXRMYWJlbCgiZXZlbnREcml2ZW5UZXh0IikpOwotCQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PUFRJT05BTCwgZ2V0TGFiZWwoIm9wdGlvbmFsVGV4dCIpKTsKLQkJCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRCwgZ2V0TGFiZWwoInBsYW5uZWRUZXh0IikpOwotCQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsIGdldExhYmVsKCJtdWx0aXBsZU9jY3VycmVuY2VzVGV4dCIpKTsKLQotCQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUywgZ2V0TGFiZWwoInRlYW1UZXh0IikpOwotCi0JCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFLCBnZXRMYWJlbCgiZGVsaXZlcmFibGVUZXh0IikpOwotCQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSwgZ2V0TGFiZWwoImVudHJ5U3RhdGVUZXh0IikpOwotCQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFLCBnZXRMYWJlbCgiZXhpdFN0YXRlVGV4dCIpKTsKLQkJCQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExhYmVsKFN0cmluZyBrZXkpIHsKLQkJU3RyaW5nIGxhYmVsID0geHNsUGFyYW1zLmdldFByb3BlcnR5KGtleSk7Ci0JCWlmICggbGFiZWwgPT0gbnVsbCApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FuJ3QgZmluZCBwcm9wZXJ0eSBlbnRyeSBmb3IgIiArIGtleSk7Ci0JCQlsYWJlbCA9IGtleTsKLQkJfQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhIGxpc3Qgb2YgY29sdW1ucyBmb3IgV0JTIGxheW91dAotCSAqIEByZXR1cm4gTGlzdCBvZiBCU0NvbHVtbiBvYmplY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFdCU0NvbHVtbnMoKSB7Ci0JCUxpc3QgY29scyA9IGdldFByZWZlcmVuY2VJdGVtcyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpOwotCQkKLQkJLy8gaWYgdGhlIFRCUyBjb2x1bW5zIGhhcyB0ZWFtLCBhbHNvIGFkZCB0byB0aGUgV0JTCi0JCS8vIDE2Mjc4MyAtIFB1Ymxpc2ggdGVhbSBpbmZvcm1hdGlvbiBpbiBXQlMgZm9yIFREcwotCQl0ZWFtQ29sID0gbnVsbDsKLQkJZ2V0VEJTQ29sdW1ucygpOwotCQlpZiAoIHRlYW1Db2wgIT0gbnVsbCApIHsKLQkJCWNvbHMuYWRkKGNvbHMuc2l6ZSgpLCB0ZWFtQ29sKTsKLQkJfQotCQlyZXR1cm4gY29sczsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGEgbGlzdCBvZiBjb2x1bW5zIGZvciBUQlMgbGF5b3V0Ci0JICogQHJldHVybiBMaXN0IG9mIEJTQ29sdW1uIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VEJTQ29sdW1ucygpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VJdGVtcyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIGNvbHVtbnMgZm9yIFdQQlMgbGF5b3V0Ci0JICogQHJldHVybiBMaXN0IG9mIEJTQ29sdW1uIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0V1BCU0NvbHVtbnMoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlSXRlbXMoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUyk7Ci0JfQotCQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBjb2x1bW5zCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlUHJlZmVyZW5jZXMoKSB7Ci0JCS8vIGNhbGwgdGhlIG1ldGhvZCB0byBtYWtlIHN1cmUgdGhlIGRlZmF1bHQgaXMgbG9hZGVkCi0JCWdldFdCU0NvbHVtbnMoKTsKLQkJZ2V0VEJTQ29sdW1ucygpOwotCQlnZXRXUEJTQ29sdW1ucygpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldFByZWZlcmVuY2VJdGVtcyhTdHJpbmcga2V5KSB7Ci0JCQotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CQkKLQkJU3RyaW5nIHN0ciA9IHN0b3JlLmdldFN0cmluZyhrZXkpOwotCQlpZiAoc3RyID09IG51bGwpIHsKLQkJCXN0ciA9IHN0b3JlLmdldERlZmF1bHRTdHJpbmcoa2V5KTsKLQkJfQotCQkKLQkJaWYgKCBzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCApIHsKLQkJCXN0ciA9IGdldERlZmF1bHQoa2V5KTsKLQkJCXN0b3JlLnNldFZhbHVlKGtleSwgc3RyKTsKLQkJfQotCQkKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgaWQgPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwkJCi0JCQlpZiAoaWQgIT0gbnVsbCAmJiBpZC5sZW5ndGgoKSAhPSAwICkgewotCQkJCQotCQkJCUJTQ29sdW1uIGNvbCA9IG5ldyBCU0NvbHVtbihpZCwgZ2V0Q29sVGV4dChpZCkpOwotCQkJCWl0ZW1zLmFkZChjb2wpOwotCQkJCS8vIGFkZCBzdGVwcyBjb2x1bW4gZm9yIFdCUwotCQkJCWlmICgga2V5LmVxdWFscyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpIAotCQkJCQkJJiYgaWQuZXF1YWxzKElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUpICkgewotCQkJCQljb2wgPSBuZXcgQlNDb2x1bW4oSURfU1RFUFMsIGdldENvbFRleHQoSURfU1RFUFMpKTsKLQkJCQkJaXRlbXMuYWRkKGNvbCk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIHNhdmUgdGhlIHRlYW0gY29sdW1uIGZvciBXQlMKLQkJCQkvLyAxNjI3ODMgLSBQdWJsaXNoIHRlYW0gaW5mb3JtYXRpb24gaW4gV0JTIGZvciBURHMKLQkJCQlpZiAoIElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMuZXF1YWxzKGlkKSApIHsKLQkJCQkJdGVhbUNvbCA9IGNvbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBpdGVtczsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvbFRleHQoU3RyaW5nIGtleSkgewotCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpY29sSWRMYWJlbE1hcC5nZXQoa2V5KTsKLQkJaWYgKCB0ZXh0ID09IG51bGwgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGxhYmVsIGRlZmluZWQgZm9yIGNvbHVtbiAiICsga2V5KTsgCi0JCQl0ZXh0ID0ga2V5OwotCQl9Ci0JCQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgIFN0cmluZyBnZXREZWZhdWx0KFN0cmluZyBrZXkpIHsKLQkJaWYgKCBQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMuZXF1YWxzKGtleSkgKSB7Ci0JCQlyZXR1cm4gdG9TdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5ERUZBVUxUX1dCU19DT0xVTU5TKTsKLQkJfQotCQkKLQkJaWYgKCBQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMuZXF1YWxzKGtleSkgKSB7Ci0JCQlyZXR1cm4gdG9TdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5ERUZBVUxUX1RCU19DT0xVTU5TKTsKLQkJfQotCQkKLQkJaWYgKCBQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TLmVxdWFscyhrZXkpICkgewotCQkJcmV0dXJuIHRvU3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuREVGQVVMVF9XUEJTX0NPTFVNTlMpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKFN0cmluZ1tdIGlkcykgewotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbWF4ID0gaWRzLmxlbmd0aCAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoaWRzW2ldKQotCQkJCQkuYXBwZW5kKCcsJyk7Ci0JCX0KLQkJc3RyQnVmLmFwcGVuZChpZHNbaWRzLmxlbmd0aC0xXSk7Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5Y2MwMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciB0aGUgbGlicmFyeSBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvTWV0aG9kTGlicmFyeVByb2plY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvTWV0aG9kTGlicmFyeVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTc4N2Y4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcm9qZWN0L01ldGhvZExpYnJhcnlQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyB0aGUgTWV0aG9kIExpYnJhcnkgUHJvamVjdHMgaW4gYSB3b3Jrc3BhY2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeVByb2plY3QgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgQW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQotCSAqICAgICAgICAgICAgQSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5IHByb2plY3QuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiBAcmV0dXJuIEEgbWV0aG9kIGxpYnJhcnkgcHJvamVjdC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlUHJvamVjdChTdHJpbmcgcGF0aCwgU3RyaW5nIHByb2plY3ROYW1lLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkKLQkJLy8gZmluZCB0aGUgcHJvamVjdCBieSBwYXRoCi0JCUlQcm9qZWN0IHByb2plY3QgPSBmaW5kUHJvamVjdChwYXRoKTsJCQotCQlpZiAocHJvamVjdCAhPSBudWxsICkgewotCQkJcHJvamVjdC5kZWxldGUoSVByb2plY3QuRk9SQ0UKLQkJCQkJfCBJUHJvamVjdC5ORVZFUl9ERUxFVEVfUFJPSkVDVF9DT05URU5ULCBtb25pdG9yKTsKLQkJfQotCQkKLQkJaWYgKCBwcm9qZWN0TmFtZSA9PSBudWxsICkgewotCQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotCQkJcHJvamVjdE5hbWUgPSBsaWJyYXJ5UGF0aC5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCS8vIGlmIGEgcHJvamVjdCBvZiB0aGUgc2FtZSBuYW1lIGFsc28gZXhpc3RzLCBkZWxldGUgaXQKLQkJLy8gdGhpcyBpcyBuZWVkZWQgdG8gdGFrZSBjYXJlIG9mIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86Ci0JCS8vIGEgcHJvamVjdCBpcyBvcGVuZWQgYnV0IG5vdCBjbG9zZWQgZm9yIHNvbWUgcmVhc29uCi0JCS8vIG5vdyBjcmVhdGUgYSBuZXcgbGlicmFyeSB3aXRoIHRoZSBzYW1lIG5hbWUgKHNhbWUgbGlicmFyeSBmb2xkZXIpCi0JCS8vIHdlIG5lZWQgdG8gZGVsZXRlIHRoZSBwcmV2aW91cyBvbmUKLQkJcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWlmIChwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQlwcm9qZWN0LmRlbGV0ZShJUHJvamVjdC5GT1JDRQotCQkJCQl8IElQcm9qZWN0Lk5FVkVSX0RFTEVURV9QUk9KRUNUX0NPTlRFTlQsIG1vbml0b3IpOwotCQl9Ci0JCQotCi0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSB3b3Jrc3BhY2UKLQkJCQkubmV3UHJvamVjdERlc2NyaXB0aW9uKHByb2plY3ROYW1lKTsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKE1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlLk5BVFVSRV9JRFMpOwotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IG5ldyBQYXRoKHBhdGgpOwotCQlpZiAoIVBsYXRmb3JtLmdldExvY2F0aW9uKCkuaXNQcmVmaXhPZihwcm9qZWN0UGF0aCkpIHsKLQkJCWRlc2NyaXB0aW9uLnNldExvY2F0aW9uKHByb2plY3RQYXRoKTsKLQkJfQotCQlwcm9qZWN0LmNyZWF0ZShkZXNjcmlwdGlvbiwgbW9uaXRvcik7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBpbiB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIEFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgQSBwcm9ncmVzcyBtb25pdG9yLgotCSAqIEByZXR1cm4gQSA8Y29kZT5JUHJvamVjdDwvY29kZT4gb3IgPG9jZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1ldGhvZAotCSAqICAgICAgICAgbGlicmFyeSBwcm9qZWN0IGNhbm5vdCBiZSBjcmVhdGVkLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KFN0cmluZyBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJSVByb2plY3QgcHJvamVjdCA9IGZpbmRQcm9qZWN0KHBhdGgpOwotLy8JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLS8vCQkJcHJvamVjdC5kZWxldGUoSVByb2plY3QuRk9SQ0UKLS8vCQkJCQl8IElQcm9qZWN0Lk5FVkVSX0RFTEVURV9QUk9KRUNUX0NPTlRFTlQsIG1vbml0b3IpOwotLy8JCX0KLS8vCQlGaWxlIGxpYnJhcnlQYXRoID0gbmV3IEZpbGUocGF0aCk7Ci0vLwkJU3RyaW5nIHByb2plY3RQYXRoID0gbGlicmFyeVBhdGguZ2V0QWJzb2x1dGVQYXRoKCk7Ci0vLwkJU3RyaW5nIHByb2plY3ROYW1lID0gbGlicmFyeVBhdGguZ2V0TmFtZSgpOwotLy8JCXJldHVybiBjcmVhdGVQcm9qZWN0KHByb2plY3RQYXRoLCBwcm9qZWN0TmFtZSwgbW9uaXRvcik7Ci0JCQotCQlyZXR1cm4gY3JlYXRlUHJvamVjdChwYXRoLCBudWxsLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IGEgd29ya3NwYWNlIHByb2plY3QgaXMgYSBtZXRob2QgbGlicmFyeSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBBIHdvcmtzcGFjZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHdvcmtzcGFjZSBwcm9qZWN0IGlzIGEgbWV0aG9kCi0JICogICAgICAgICBsaWJyYXJ5IHByb2plY3QsIDxjb2RlPmZhbHNlPC9jbG9kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01ldGhvZExpYnJhcnlQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBjbG9zZVByb2plY3RPbkV4aXQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCXByb2plY3Qub3BlbihJUmVzb3VyY2UuQkFDS0dST1VORF9SRUZSRVNILAotCQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQljbG9zZVByb2plY3RPbkV4aXQgPSB0cnVlOwotCQkJCX0KLQkJCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZ1tdIG5hdHVyZUlkcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQkJCQlpZiAoQXJyYXlzLmFzTGlzdChuYXR1cmVJZHMpLmNvbnRhaW5zKAotCQkJCQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlLk5BVFVSRV9JRCkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChjbG9zZVByb2plY3RPbkV4aXQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXByb2plY3QuY2xvc2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIExvY2F0ZXMgYSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgQW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEByZXR1cm4gQSA8Y29kZT5JUHJvamVjdDwvY29kZT4gb3IgPG9jZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1ldGhvZAotCSAqICAgICAgICAgbGlicmFyeSBwcm9qZWN0IGNhbm5vdCBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGZpbmRQcm9qZWN0KFN0cmluZyBwYXRoKSB7Ci0JCWZpbmFsIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCQlpZiAobmV3IEZpbGUocGF0aCkuY29tcGFyZVRvKHByb2plY3QuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSkgPT0gMAotCQkJCQkJJiYgaXNNZXRob2RMaWJyYXJ5UHJvamVjdChwcm9qZWN0KSkgewotCQkJCQlyZXR1cm4gcHJvamVjdDsKLQkJCQl9Ci0JCQkJaWYgKG5ldyBGaWxlKHBhdGgpLmNvbXBhcmVUbyhwcm9qZWN0LmdldExvY2F0aW9uKCkudG9GaWxlKCkpID09IDApIHsKLQkJCQkJcmV0dXJuIHByb2plY3Q7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTG9jYXRlcyBhIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaW4gdGhlIGN1cnJlbnQgd29ya3NwYWNlLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBBIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEByZXR1cm4gQSA8Y29kZT5JUHJvamVjdDwvY29kZT4gb3IgPG9jZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1ldGhvZAotCSAqICAgICAgICAgbGlicmFyeSBwcm9qZWN0IGNhbm5vdCBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGZpbmRQcm9qZWN0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlyZXR1cm4gZmluZFByb2plY3QoZ2V0TGlicmFyeVBhdGgobGlicmFyeSkpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGFuIGV4aXN0aW5nIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaW4gdGhlIGN1cnJlbnQgd29ya3NwYWNlLgotCSAqIDxwPgotCSAqIElmIHRoZSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGNhbm5vdCBiZSBsb2NhdGVkLCBjcmVhdGUgYSBuZXcgb25lLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICogQHJldHVybiBBIDxjb2RlPklQcm9qZWN0PC9jb2RlPi4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3Qgb3BlblByb2plY3QoU3RyaW5nIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBvcGVuUHJvamVjdChwYXRoLCBudWxsLCAgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYW4gZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBpbiB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCi0JICogPHA+Ci0JICogSWYgdGhlIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgY2Fubm90IGJlIGxvY2F0ZWQsIGNyZWF0ZSBhIG5ldyBvbmUuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIEFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgQSBwcm9ncmVzcyBtb25pdG9yLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+SVByb2plY3Q8L2NvZGU+LgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBvcGVuUHJvamVjdChTdHJpbmcgcGF0aCwgU3RyaW5nIHByb2plY3ROYW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gbmV3IFBhdGgocGF0aCArIEZpbGUuc2VwYXJhdG9yCi0JCQkJKyBJUHJvamVjdERlc2NyaXB0aW9uLkRFU0NSSVBUSU9OX0ZJTEVfTkFNRSk7Ci0KLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKLQkJdHJ5IHsKLQkJCWRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpCi0JCQkJCS5sb2FkUHJvamVjdERlc2NyaXB0aW9uKHByb2plY3RQYXRoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWRlc2NyaXB0aW9uID0gbnVsbDsKLQkJfQotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkvLyAucHJvamVjdCBmaWxlIGlzIG1pc3NpbmcsIGNyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeQotCQkJLy8gcHJvamVjdC4KLQkJCXByb2plY3QgPSBNZXRob2RMaWJyYXJ5UHJvamVjdC5jcmVhdGVQcm9qZWN0KHBhdGgsIHByb2plY3ROYW1lLCBtb25pdG9yKTsKLQkJfSBlbHNlIHsKLQkJCS8vIC5wcm9qZWN0IGZpbGUgZXhpc3RzLCByZXRyaWV2ZSB0aGUgcHJvamVjdCBmcm9tIHRoZQotCQkJLy8gd29ya3NwYWNlLgotCQkJaWYgKCBwcm9qZWN0TmFtZSAhPSBudWxsICkgewotCQkJCWRlc2NyaXB0aW9uLnNldE5hbWUocHJvamVjdE5hbWUpOwotCQkJfQotCQkJCi0JCQlwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KAotCQkJCQlkZXNjcmlwdGlvbi5nZXROYW1lKCkpOwotCQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJLy8gVGhlIHByb2plY3QgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4gQ3JlYXRlIGEgbmV3Ci0JCQkJLy8gbWV0aG9kIGxpYnJhcnkgcHJvamVjdCB1c2luZyB0aGUgcHJvamVjdCBuYW1lIGZyb20gdGhlCi0JCQkJLy8gLnByb2plY3QgZmlsZS4KLQkJCQlwcm9qZWN0ID0gTWV0aG9kTGlicmFyeVByb2plY3QuY3JlYXRlUHJvamVjdChwYXRoLCBwcm9qZWN0Ci0JCQkJCQkuZ2V0TmFtZSgpLCBtb25pdG9yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gVGhlIHByb2plY3QgZG9lcyBleGlzdCBpbiB0aGUgd29ya3NwYWNlLgotCQkJCS8vIFZlcmlmeSB0aGF0IHRoZSBsb2NhdGlvbiBtYXRjaGVzLiBJZiBub3QsIGNyZWF0ZSBhIG5ldyBtZXRob2QKLQkJCQkvLyBsaWJyYXJ5IHByb2plY3QuCi0JCQkJaWYgKG5ldyBGaWxlKHBhdGgpLmNvbXBhcmVUbyhwcm9qZWN0LmdldExvY2F0aW9uKCkudG9GaWxlKCkpICE9IDApIHsKLQkJCQkJcHJvamVjdCA9IE1ldGhvZExpYnJhcnlQcm9qZWN0LmNyZWF0ZVByb2plY3QocGF0aCwgbW9uaXRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQlwcm9qZWN0Lm9wZW4oSVJlc291cmNlLkJBQ0tHUk9VTkRfUkVGUkVTSCwgbW9uaXRvcik7Ci0JCX0KLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCX0KLQotCQkvLyBNYWtlIHN1cmUgdGhlIHByb2plY3QgaGFzIHRoZSBNZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS4KLQkJU3RyaW5nW10gbmF0dXJlSWRzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCWlmICghQXJyYXlzLmFzTGlzdChuYXR1cmVJZHMpLmNvbnRhaW5zKAotCQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlLk5BVFVSRV9JRCkpIHsKLQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhNZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5OQVRVUkVfSURTKTsKLQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIElQcm9qZWN0LkZPUkNFCi0JCQkJCXwgSVByb2plY3QuS0VFUF9ISVNUT1JZLCBtb25pdG9yKTsKLQkJfQotCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIENsb3NlcyBhIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgQW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBBIHByb2dyZXNzIG1vbml0b3IuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VQcm9qZWN0KFN0cmluZyBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBmaW5kUHJvamVjdChwYXRoKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQlwcm9qZWN0LmNsb3NlKG1vbml0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xvc2VzIGEgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBBIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBBIHByb2dyZXNzIG1vbml0b3IuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VQcm9qZWN0KE1ldGhvZExpYnJhcnkgbGlicmFyeSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQljbG9zZVByb2plY3QoZ2V0TGlicmFyeVBhdGgobGlicmFyeSksIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgYSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGZyb20gdGhlIGN1cnJlbnQgd29ya3NwYWNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGlzIHN1Y2Nlc3NmdWxseQotCSAqICAgICAgICAgZGVsZXRlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGVQcm9qZWN0KFN0cmluZyBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGZpbmRQcm9qZWN0KHBhdGgpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQkJfQotCQkJCXByb2plY3QuZGVsZXRlKElQcm9qZWN0LkZPUkNFCi0JCQkJCQl8IElQcm9qZWN0Lk5FVkVSX0RFTEVURV9QUk9KRUNUX0NPTlRFTlQsIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgYSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGZyb20gdGhlIGN1cnJlbnQgd29ya3NwYWNlLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBBIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBBIHByb2dyZXNzIG1vbml0b3IuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBpcyBzdWNjZXNzZnVsbHkKLQkgKiAgICAgICAgIGRlbGV0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZVByb2plY3QoTWV0aG9kTGlicmFyeSBsaWJyYXJ5LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBkZWxldGVQcm9qZWN0KGdldExpYnJhcnlQYXRoKGxpYnJhcnkpLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiBAcmV0dXJuIEFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGlicmFyeVBhdGgoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXJldHVybiBuZXcgRmlsZShsaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKQotCQkJCS5nZXRQYXJlbnQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2YzYzNjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcm9qZWN0L01ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQSBNZXRob2QgTGlicmFyeSBQcm9qZWN0IG5hdHVyZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZSBpbXBsZW1lbnRzIElQcm9qZWN0TmF0dXJlIHsKLQotCS8qKgotCSAqIFRoZSBuYXR1cmUgSUQgZm9yIGEgTWV0aG9kIExpYnJhcnkgUHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRVUkVfSUQgPSBNZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIE1ldGhvZCBMaWJyYXJ5IFByb2plY3QgbmF0dXJlIElEcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIE5BVFVSRV9JRFMgPSB7IE5BVFVSRV9JRCB9OwotCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZSNjb25maWd1cmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlI2RlY29uZmlndXJlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlI2dldFByb2plY3QoKQotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlI3NldFByb2plY3QoSVByb2plY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcm9qZWN0L3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMzE4YjRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgbWFuYWdlbWVudCBvZiBtZXRob2QgbGlicmFyeSBwcm9qZWN0cyBpbiBhIHdvcmtzcGFjZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9EZXBlbmRlbmN5TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvRGVwZW5kZW5jeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjI0MTBkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9EZXBlbmRlbmN5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIG1ldGhvZCBlbGVtZW50IGRlcGVuZGVuY2llcyBpbiBhIG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXBlbmRlbmN5TWFuYWdlciB7Ci0KLQkvLyBJZiB0cnVlLCBnZW5lcmF0ZSBkZWJ1ZyB0cmFjZXMuCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8vIFRoZSBtcmV0aG9kIGxpYnJhcnkuCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnkgbGlicmFyeTsKLQotCS8vIFRoZSBsaWJyYXJ5IG1hbmFnZXIuCi0JcHJvdGVjdGVkIElMaWJyYXJ5TWFuYWdlciBsaWJyYXJ5TWFuYWdlcjsKLQotCS8vIEEgbWFwIG9mIHBhY2thZ2UgZWxlbWVudHMgdG8gUGFja2FnZURlcGVuZGVuY3kgb2JqZWN0cy4KLQlwcm90ZWN0ZWQgTWFwIGRlcGVuZGVuY3lNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBsaWJTdmNMaXN0ZW5lciA9IG51bGw7Ci0JCi0JLy8gQSBsaWJyYXJ5IGNoYW5nZSBsaXN0ZW5lci4KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGliTGlzdGVuZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGVwZW5kZW5jeU1hbmFnZXIoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXRoaXMubGlicmFyeSA9IGxpYnJhcnk7Ci0JCXRoaXMubGlicmFyeU1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlNYW5hZ2VyKAotCQkJCWxpYnJhcnkpOwotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBMaXN0ZW4gdG8gbGlicmFyeSBjaGFuZ2VzIGFuZCB1cGRhdGUgdGhlIGRlcGVuZGVuY3kgYWNjb3JkaW5nbHkuCi0JCWxpYlN2Y0xpc3RlbmVyID0gbmV3IElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjb25maWd1cmF0aW9uIHNldDogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGNvbmZpZykpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTGlicmFyeSBjbG9zZWQ6ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShsaWJyYXJ5KSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTGlicmFyeSBjcmVhdGVkOiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUobGlicmFyeSkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTGlicmFyeSBvcGVuZWQ6ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShsaWJyYXJ5KSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxpYnJhcnkgcmVvcGVuZWQ6ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShsaWJyYXJ5KSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMaWJyYXJ5IHNldDogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGxpYnJhcnkpKTsKLQkJCX0KLQkJCQotCQl9OwotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJCi0JCWxpYkxpc3RlbmVyID0gbmV3IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNoYW5nZWRJdGVtcykgewotLy8JCQkJaWYgKG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9MT0FERUQKLS8vCQkJCQkJfHwgb3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NSRUFURUQpIHsKLS8vCQkJCQkvLyBUT0RPOiBJcyB0aGlzIG5lY2Vzc2FyeT8KLS8vCQkJCQkvLyByZWZyZXNoKCk7Ci0vLwkJCQl9IGVsc2UgCi0JCQkJaWYgKG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ERUxFVEVEKSB7Ci0JCQkJCWhhbmRsZURlbGV0ZWRFbGVtZW50KGNoYW5nZWRJdGVtcyk7Ci0JCQkJfSBlbHNlIGlmIChvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRAotCQkJCQkJfHwgb3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxEKSB7Ci0JCQkJCWlmIChjaGFuZ2VkSXRlbXMgIT0gbnVsbCAmJiBjaGFuZ2VkSXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoYW5nZWRJdGVtcy5pdGVyYXRvcigpOyBpdAotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCU9iamVjdCBlID0gaXQubmV4dCgpOwotCQkJCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCQkJCWJ1aWxkRGVwZW5kZW5jeUZvcigoTWV0aG9kRWxlbWVudCkgZSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZQotCQkJCQkJCQkJCQkJKyAiIGlzIG5vdCBhIG1ldGhvZCBlbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlsaWJyYXJ5TWFuYWdlci5hZGRMaXN0ZW5lcihsaWJMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBkZXBlbmRlbmN5IGZvciBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBBIG1ldGhvZCBlbGVtZW50LgotCSAqIEByZXR1cm4gQSA8Y29kZT5QYWNrYWdlRGVwZW5kZW5jeTwvY29kZT4uCi0JICovCi0JcHVibGljIFBhY2thZ2VEZXBlbmRlbmN5IGdldERlcGVuZGVuY3koTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICghTGlicmFyeVV0aWwuc2VsZWN0YWJsZShlbGVtZW50KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBBbHdheXMgcmVidWlsZCB0aGUgZGVwZW5kZW5jeSBmb3IgdGhlIGVsZW1lbnQgc2luY2UgdGhlCi0JCS8vIGRlcGVuZGVudHMgbWF5IG5vdCBiZSBmdWxseSBlc3RhYmxpc2hlZC4KLQkJUGFja2FnZURlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IGdldERlcGVuZGVuY3koZWxlbWVudCwgZmFsc2UpOwotCQlpZiAoZGVwZW5kZW5jeSA9PSBudWxsIHx8ICFkZXBlbmRlbmN5LmlzTG9hZGVkKCkpIHsKLQkJCWJ1aWxkRGVwZW5kZW5jeShlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBnZXREZXBlbmRlbmN5KGVsZW1lbnQsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgdGhlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnREZXBlbmRlbmN5KCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGVwZW5kZW5jeU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkoKFBhY2thZ2VEZXBlbmRlbmN5KSBpdC5uZXh0KCkpLnByaW50KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZHMgdGhlIGRlcGVuZGVuY3kgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEEgbWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRGVwZW5kZW5jeShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCVBhY2thZ2VEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBidWlsZERlcGVuZGVuY3lGb3IoZWxlbWVudCk7Ci0KLQkJCUVMaXN0IGVsZW1lbnRzID0gZWxlbWVudC5lQ29udGVudHMoKTsKLQkJCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQkJaWYgKG1ldGhvZEVsZW1lbnQgIT0gbnVsbAotCQkJCQkJCSYmICFMaWJyYXJ5VXRpbC5zZWxlY3RhYmxlKG1ldGhvZEVsZW1lbnQpKSB7Ci0JCQkJCQlidWlsZERlcGVuZGVuY3lGb3IobWV0aG9kRWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWRlcGVuZGVuY3kuc2V0TG9hZGVkKHRydWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyB0aGUgZGVwZW5kZW5jeSBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiA8cD4KLQkgKiBUaGlzIGNyZWF0ZXMgYW4gPGNvZGU+RWxlbWVudFJlZmVyZW5jZTwvY29kZT4gZm9yIHRoZSBnaXZlbiBlbGVtZW50Ci0JICogdGhhdCBwb2ludHMgdG8gYWxsIHRoZSByZWZlcmVuY2VkIGVsZW1lbnRzLCBhbmQgYWRkcyB0aGUgZ2l2ZW4gZWxlbWVudCBhcwotCSAqIGEgZGVwZW5kZW50IGVsZW1lbnQgdG8gYWxsIHRoZSByZWZlcmVuY2VkIGVsZW1lbnRzLiBUaGlzIHNob3VsZCBvbmx5IGJlCi0JICogY2FsbGVkIG9uY2UgZm9yIGVhY2ggbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEEgbWV0aG9kIGVsZW1lbnQuCi0JICogQHJldHVybiBBIDxjb2RlPlBhY2thZ2VEZXBlbmRlbmN5PC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIFBhY2thZ2VEZXBlbmRlbmN5IGJ1aWxkRGVwZW5kZW5jeUZvcihNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBCdWlsZCB0aGUgZGVwZW5kZW5jeSBvbiB0aGUgc2VsZWN0YWJsZSBlbGVtZW50L3BhcmVudCBvbmx5Ci0JCUVPYmplY3Qgc2VsZWN0YWJsZUVsZW1lbnQgPSBMaWJyYXJ5VXRpbC5nZXRTZWxlY3RhYmxlKGVsZW1lbnQpOwotCQlpZiAoc2VsZWN0YWJsZUVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlQYWNrYWdlRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gZ2V0RGVwZW5kZW5jeShzZWxlY3RhYmxlRWxlbWVudCwgdHJ1ZSk7Ci0KLQkJLy8gUmVtb3ZlIGFueSBleGlzdGluZyBlbGVtZW50IHJlZmVyZW5jZSBmb3IgdGhpcyBlbGVtZW50LgotCQlkZXBlbmRlbmN5LnJlbW92ZVJlZmVyZW5jZShlbGVtZW50KTsKLQotCQkvLyBHZXQgdGhlIFZhcmlhYmlsaXR5RWxlbWVudC4KLQkJQ29udGVudEVsZW1lbnQgYmFzZUVsZW1lbnQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQliYXNlRWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgKChDb250ZW50RWxlbWVudCkgZWxlbWVudCkKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJLy8gRXN0YWJsaXNoIHRoZSBwYWNrYWdlIHJlZmVyZW5jZS4KLQkJCQlFT2JqZWN0IHNlbGVjdGFibGVCYXNlID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShiYXNlRWxlbWVudCk7Ci0JCQkJaWYgKHNlbGVjdGFibGVCYXNlICE9IG51bGwpIHsKLQkJCQkJUGFja2FnZVJlZmVyZW5jZSBwa2dSZWYgPSBkZXBlbmRlbmN5LmdldFJlZmVyZW5jZSgKLQkJCQkJCQlzZWxlY3RhYmxlQmFzZSwgdHJ1ZSk7Ci0KLQkJCQkJaWYgKCFwa2dSZWYuaGFzUmVmZXJlbmNlKGVsZW1lbnQsIGJhc2VFbGVtZW50KSkgewotCQkJCQkJLy8gQWRkIHRoZSBkZXRhaWwgZWxlbWVudCByZWZlcmVuY2UgdG8gdGhlIHBhY2thZ2UKLQkJCQkJCS8vIHJlZmVyZW5jZS4KLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudFJlZmVyZW5jZSByZWYgPSBuZXcgVmFyaWFiaWxpdHlFbGVtZW50UmVmZXJlbmNlKAotCQkJCQkJCQllbGVtZW50LCBiYXNlRWxlbWVudCk7Ci0JCQkJCQlwa2dSZWYuYWRkUmVmZXJlbmNlKHJlZik7Ci0JCQkJCX0KLQotCQkJCQkvLyBTZXQgdGhlIGRlcGVuZGVudCBvZiB0aGUgcmVmZXJlbmNlZCBwYWNrYWdlLgotCQkJCQlnZXREZXBlbmRlbmN5KHNlbGVjdGFibGVCYXNlLCB0cnVlKS5hZGREZXBlbmRlbnQoCi0JCQkJCQkJc2VsZWN0YWJsZUVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUxpc3QgcmVmZXJlbmNlcyA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpOwotCi0JCS8vIFVwZGF0ZSB0aGUgZGVwZW5kZW50cyBvZiB0aG9zZSBlbGVtZW50cyBpbiB0aGUgbGlzdC4KLQkJaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCAmJiByZWZlcmVuY2VzLnNpemUoKSA+IDApIHsKLQkJCS8vIEdldCB0aGUgc2VsZWN0YWJsZSByZWZlcmVuY2VzCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCByZWZFbGVtZW50ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQlFT2JqZWN0IHNlbGVjdGFibGVSZWYgPSBMaWJyYXJ5VXRpbC5nZXRTZWxlY3RhYmxlKHJlZkVsZW1lbnQpOwotCQkJCWlmIChzZWxlY3RhYmxlUmVmICE9IG51bGwpIHsKLQkJCQkJUGFja2FnZVJlZmVyZW5jZSBwa2dSZWYgPSBkZXBlbmRlbmN5LmdldFJlZmVyZW5jZSgKLQkJCQkJCQlzZWxlY3RhYmxlUmVmLCB0cnVlKTsKLQotCQkJCQlpZiAoZWxlbWVudCA9PSBzZWxlY3RhYmxlRWxlbWVudAotCQkJCQkJCSYmIHJlZkVsZW1lbnQgPT0gc2VsZWN0YWJsZVJlZikgewotCQkJCQkJLy8gTm8gbmVlZCB0byBhZGQgdGhpcy4KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJaWYgKCFwa2dSZWYuaGFzUmVmZXJlbmNlKGVsZW1lbnQsIHJlZkVsZW1lbnQpKSB7Ci0JCQkJCQlHZW5lcmFsUmVmZXJlbmNlIHJlZiA9IG5ldyBHZW5lcmFsUmVmZXJlbmNlKGVsZW1lbnQsCi0JCQkJCQkJCXJlZkVsZW1lbnQpOwotCQkJCQkJcGtnUmVmLmFkZFJlZmVyZW5jZShyZWYpOwotCQkJCQl9Ci0KLQkJCQkJZ2V0RGVwZW5kZW5jeShzZWxlY3RhYmxlUmVmLCB0cnVlKS5hZGREZXBlbmRlbnQoCi0JCQkJCQkJc2VsZWN0YWJsZUVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBkZXBlbmRlbmN5OwotCX0KLQotCXByaXZhdGUgUGFja2FnZURlcGVuZGVuY3kgZ2V0RGVwZW5kZW5jeShFT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCWlmICghTGlicmFyeVV0aWwuc2VsZWN0YWJsZShlbGVtZW50KSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIkVycm9yLCBTZWxlY3RhYmxlIGVsZW1lbnQgcmVxdWlyZWQ6ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlQYWNrYWdlRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gKFBhY2thZ2VEZXBlbmRlbmN5KSBkZXBlbmRlbmN5TWFwCi0JCQkJLmdldChlbGVtZW50KTsKLQkJaWYgKGRlcGVuZGVuY3kgPT0gbnVsbCAmJiBjcmVhdGUpIHsKLQkJCWRlcGVuZGVuY3kgPSBuZXcgUGFja2FnZURlcGVuZGVuY3koZWxlbWVudCk7Ci0JCQlkZXBlbmRlbmN5TWFwLnB1dChlbGVtZW50LCBkZXBlbmRlbmN5KTsKLQkJfQotCi0JCXJldHVybiBkZXBlbmRlbmN5OwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURlbGV0ZWRFbGVtZW50KENvbGxlY3Rpb24gY2hhbmdlZEl0ZW1zKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBjaGFuZ2VkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZW1vdmVSZWZlcmVuY2UoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZWxlbWVudCByZWZlcmVuY2UgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudCwgcmVidWlsZCBsYXRlcgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBBIG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVBhY2thZ2VEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBudWxsOwotCi0JCU1ldGhvZEVsZW1lbnQgcGtnID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUoZWxlbWVudCk7Ci0JCWlmICgocGtnID09IG51bGwpIHx8ICgoZGVwZW5kZW5jeSA9IGdldERlcGVuZGVuY3kocGtnLCBmYWxzZSkpID09IG51bGwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlkZXBlbmRlbmN5LnJlbW92ZVJlZmVyZW5jZShlbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL0VsZW1lbnREZXBlbmRlbmN5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9FbGVtZW50RGVwZW5kZW5jeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NjhlZWIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL0VsZW1lbnREZXBlbmRlbmN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBIb2xkcyB0aGUgYSBsaXN0IG9mIHBhY2thZ2UgcmVmZXJlbmNlcyBvZiBvbmUgcGFja2FnZSBlbGVtZW50IGl0IGFsc28gaG9sZHMgYQotICogbGlzdCBvZiBkZXBlbmRhbnQgcGFja2FnZSBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudERlcGVuZGVuY3kgewotCi0JLy8gdGhlIHBhY2thZ2UgZWxlbWVudAotCXByb3RlY3RlZCBPYmplY3QgZWxlbWVudDsKLQotCS8qKgotCSAqIGxpc3Qgb2YgRWxlbWVudFJlZmVyZW5jZSBvYmplY3RzLCBlYWNoIEVsZW1lbnRSZWZlcmVuY2Ugb2JqZWN0IGhvbGRzIGEKLQkgKiBsaXN0IG9mIHJlZmVyZW5jZXMgb2YgdGhlIHNhbWUgdHlwZQotCSAqLwotCXByb3RlY3RlZCBMaXN0IHJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBkZXBlbmRlbnRzCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZGVwZW5kZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBFbGVtZW50RGVwZW5kZW5jeShPYmplY3QgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIGVsZW1lbnRzIHRoaXMgZWxlbWVudCBkZXBlbmRzIG9uCi0JICogCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBFbGVtZW50UmVmZXJlbmNlIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIEVsZW1lbnRSZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gcmVmRWxlbWVudCB0aGF0IHRoZSBjdXJyZW50Ci0JICogZWxlbWVudCByZWNlcmVuY2VzIHRvLgotCSAqIAotCSAqIEBwYXJhbSBSZWZFbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgY3VycmVudCBlbGVtZW50IHJlZmVyZW5jZXMKLQkgKiBAcmV0dXJuIEVsZW1lbnRSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoT2JqZWN0IHJlZkVsZW1lbnQpIHsKLQkJRWxlbWVudFJlZmVyZW5jZSByZWY7Ci0JCU9iamVjdCByZWZFbDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJcmVmID0gKEVsZW1lbnRSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLQkJCXJlZkVsID0gcmVmLmdldFJlZkVsZW1lbnQoKTsKLQkJCWlmIChyZWZFbCAhPSBudWxsICYmIHJlZkVsID09IHJlZkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gcmVmOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgZGVwZW5kIG9uIHRoaXMgZWxlbWVudAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlcGVuZGVudHMoKSB7Ci0JCXJldHVybiBkZXBlbmRlbnRzOwotCX0KLQotCS8qKgotCSAqIGFkZCBhIGRlcGVuZGVudAotCSAqIEBwYXJhbSBlbCBPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREZXBlbmRlbnQoT2JqZWN0IGVsKSB7Ci0JCWlmICghZGVwZW5kZW50cy5jb250YWlucyhlbCkpIHsKLQkJCWRlcGVuZGVudHMuYWRkKGVsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFkZCBhIHJlZmVyZW5jZQotCSAqIEBwYXJhbSByZWYgRWxlbWVudFJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZShFbGVtZW50UmVmZXJlbmNlIHJlZikgewotCQlyZWZlcmVuY2VzLmFkZChyZWYpOwotCX0KLQotCS8qKgotCSAqIHByaW50IG91dCB0aGUgcmVmZXJlbmNlcy4gVGhpcyBpcyBhIGRlYnVnZ2luZyBtZXRob2QuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludCgpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHJlZiA9IGl0Lm5leHQoKTsKLQkJCWlmIChyZWYgaW5zdGFuY2VvZiBQYWNrYWdlUmVmZXJlbmNlKSB7Ci0JCQkJKChQYWNrYWdlUmVmZXJlbmNlKSByZWYpLnByaW50KCk7Ci0JCQl9IGVsc2UgewotCQkJCSgoRWxlbWVudFJlZmVyZW5jZSkgcmVmKS5wcmludCgpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9FbGVtZW50RmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvRWxlbWVudEZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjIyYzI4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9FbGVtZW50RmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXM7Ci0KLQotcHVibGljIGNsYXNzIEVsZW1lbnRGaWxlIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0JU3RyaW5nIGd1aWQ7Ci0JU3RyaW5nIGZpbGVOYW1lOwotCQotCXB1YmxpYyBFbGVtZW50RmlsZShTdHJpbmcgZ3VpZCwgU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXRoaXMuZ3VpZCA9IGd1aWQ7Ci0JCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBlKQl7Ci0JCUVsZW1lbnRGaWxlIGVGaWxlID0gKEVsZW1lbnRGaWxlKSBlOwotCQkKLQkJaWYgKCEoZ2V0R3VpZCgpLmVxdWFscyhlRmlsZS5nZXRHdWlkKCkpKSAKLQkJCQkmJiBnZXRGaWxlTmFtZSgpLmVxdWFscyhlRmlsZS5nZXRGaWxlTmFtZSgpKSkgewotCQkJcmV0dXJuIGFwcGVuZEluZGV4KCk7Ci0JCX0KLQkJcmV0dXJuIGdldEZpbGVOYW1lKCkuZXF1YWxzKGVGaWxlLmdldEZpbGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZmlsZU5hbWUuaGFzaENvZGUoKTsKLQl9Ci0JCi0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IGFGaWxlKSB7CQkKLQkJaWYgKGFGaWxlIGluc3RhbmNlb2YgRWxlbWVudEZpbGUpCi0JCXsKLQkJCUVsZW1lbnRGaWxlIGUgPSAoRWxlbWVudEZpbGUpIGFGaWxlOwotCQkJcmV0dXJuIGZpbGVOYW1lLmNvbXBhcmVUbyhlLmdldEZpbGVOYW1lKCkpOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgZk5hbWUpIHsKLQkJZmlsZU5hbWUgPSBmTmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpCXsKLQkJcmV0dXJuIGZpbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEd1aWQoKQl7Ci0JCXJldHVybiBndWlkOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYXBwZW5kSW5kZXgoKSB7Ci0JCVN0cmluZ0J1ZmZlciB0U3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRGaWxlTmFtZSgpKTsKLQkJaW50IGJlZ2luZElkeCA9IGdldEZpbGVOYW1lKCkubGFzdEluZGV4T2YoIi0iKTsKLQkJaW50IGVuZElkeCA9IGdldEZpbGVOYW1lKCkubGFzdEluZGV4T2YoIi5odG0iKTsKLQkJaWYgKGJlZ2luZElkeCA+IC0xICYmIGVuZElkeCA+IC0xKSB7Ci0JCQlTdHJpbmcgaWR4U3RyaW5nID0gZ2V0RmlsZU5hbWUoKS5zdWJzdHJpbmcoYmVnaW5kSWR4KzEsIGVuZElkeCk7Ci0JCQlpZiAoaWR4U3RyaW5nICE9IG51bGwgJiYgaWR4U3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJCXRyeSB7Ci0JCQkJCWludCBhSW50ID0gSW50ZWdlci5wYXJzZUludChpZHhTdHJpbmcpOwotCQkJCQlpZiAoYUludCA+IDApIHsKLQkJCQkJCXRTdHJpbmcucmVwbGFjZShiZWdpbmRJZHgrMSwgZW5kSWR4LCBJbnRlZ2VyLnRvU3RyaW5nKCsrYUludCkpOwkKLQkJCQkJCXNldEZpbGVOYW1lKHRTdHJpbmcudG9TdHJpbmcoKSk7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCXRTdHJpbmcuaW5zZXJ0KGVuZElkeCwgIi0xIik7Ci0JCQkJCXNldEZpbGVOYW1lKHRTdHJpbmcudG9TdHJpbmcoKSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZW5kSWR4ID4gLTEpIHsJCQkKLQkJCXRTdHJpbmcuaW5zZXJ0KGVuZElkeCwgIi0xIik7Ci0JCQlzZXRGaWxlTmFtZSh0U3RyaW5nLnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9FbGVtZW50UmVmZXJlbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9FbGVtZW50UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiMWM3MmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvRWxlbWVudFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRlZmluZXMgYW4gRWxlbWVudCBSZWZlcmVuY2UgYmV0d2VlbiB0d28gZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50UmVmZXJlbmNlIHsKLQotCU9iamVjdCBlbGVtZW50LCByZWZFbGVtZW50OwotCi0JLyoqCi0JICogY29uc3RydWN0IHRoZSByZWZlcmVuY2UgaW5zdGFuY2UKLQkgKiBAcGFyYW0gZWxlbWVudCBPYmplY3QgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmRWxlbWVudCBPYmplY3QgdGhlIHJlZmVyZW5jZWQgZWxlbWVudAotCSAqLwotCXB1YmxpYyBFbGVtZW50UmVmZXJlbmNlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgcmVmRWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLnJlZkVsZW1lbnQgPSByZWZFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHJlZmVyZW5jZWQgZWxlbWVudAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWZFbGVtZW50KCkgewotCQlyZXR1cm4gcmVmRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBkZWJ1Z2dpbmcgbWV0aG9kIHRvIHByaW50IG91dCB0aGUgcmVsYXRpb25zaGlwCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludCgpIHsKLQkJU3lzdGVtLm91dAotCQkJCS5wcmludGxuKCIgICAgIiArIExpYnJhcnlVdGlsLmdldE5hbWUoZWxlbWVudCkgKyAiIC0tPiAiICsgTGlicmFyeVV0aWwuZ2V0TmFtZShyZWZFbGVtZW50KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSByZWZlcmVuY2UgY2FuIGJlIGlnbm9yZWQKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5JZ25vcmUoKSB7Ci0JCS8vIGlmIHRoZSBlbGVtZW50IGhhcyBubyBjb250YWluZXIsIGl0J3MgYSBkZWxldGVkIGVsZW1lbnQsIGlnbm9yZSBpdAotCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJCSYmICgoRU9iamVjdCkgZWxlbWVudCkuZUNvbnRhaW5lcigpID09IG51bGwKLQkJCQl8fCAocmVmRWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJJiYgKChFT2JqZWN0KSByZWZFbGVtZW50KS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyBEb24ndCB3YXJuIG9uIG9wdGlvbmFsIGlucHV0cyBub3QgYmVpbmcgcHJlc2VudAotCQkvLyBzbyBhZGRlZCB0aGUgY2FuSWdub3JlKCkgbWV0aG9kCi0JCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2spICYmIChyZWZFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpKSB7Ci0JCQkvLyBpZiBpdCdzIGEgbWFuZGF0b3J5IGlucHV0LCBjYW4gaWdub3JlCi0JCQlpZiAoKChUYXNrKSBlbGVtZW50KS5nZXRNYW5kYXRvcnlJbnB1dCgpLmNvbnRhaW5zKHJlZkVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvLyBub3QgbWFuZGF0b3J5LCBidXQgb3B0aW9uYWwsIG9rLCBpZ25vcmUgaXQKLQkJCWlmICgoKFRhc2spIGVsZW1lbnQpLmdldE9wdGlvbmFsSW5wdXQoKS5jb250YWlucyhyZWZFbGVtZW50KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gcm9sZSdzIG1vZGlmaWVzIGZlYXR1cmUgaXMgYWN0dWFsbHkgYSBkZXJlaXZlZCBvcHBvc2l0ZSBmZWF0dXJlLAotCQkvLyBpdCdzIHZhbHVlIGNhbiBiZSBhbiBlbGVtZW50IG5vdCB2aXNpYmxlIHRvIHRoaXMgcGx1Z2luCi0JCS8vIGlnbm9yZSBpdAotCQkvLyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW5jeSBlcnJvciByZXBvcnRlZAotCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlKSAmJiAocmVmRWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJUm9sZSByID0gKFJvbGUpIGVsZW1lbnQ7Ci0JCQlpZiAoci5nZXRNb2RpZmllcygpLmNvbnRhaW5zKHJlZkVsZW1lbnQpCi0JCQkJCSYmICFyLmdldFJlc3BvbnNpYmxlRm9yKCkuY29udGFpbnMocmVmRWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL0dlbmVyYWxSZWZlcmVuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL0dlbmVyYWxSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGI2YjAyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9HZW5lcmFsUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlczsKLQotLyoqCi0gKiBEZWZpbmUgYSBnZW5lcmFsIHJlZmVyZW5jZSBiZXR3ZWVuIHR3byBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYWxSZWZlcmVuY2UgZXh0ZW5kcyBFbGVtZW50UmVmZXJlbmNlIHsKLQotCXB1YmxpYyBHZW5lcmFsUmVmZXJlbmNlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgcmVmRWxlbWVudCkgewotCQlzdXBlcihlbGVtZW50LCByZWZFbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL0xpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL0xpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI0NzgwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5BY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBoZWxwZXIgaXMgdXNpbmcgYW4gaW5zdGFuY2Ugb2YgSUFjdGlvbk1hbmFnZXIgdG8ga2VlcCB0cmFjayBvZiBjaGFuZ2VzLgotICogQ2xpZW4gbXVzdCB7QGxpbmsgI2Rpc3Bvc2UoKSA8ZW0+ZGlzcG9zZTwvZW0+fSB0aGlzIGhlbHBlciBhZnRlciB1c2UuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyIHsKLQotCUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gbnVsbDsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGFjdGlvbiBtYW5hZ2VyCi0JICogQHJldHVybiBBY3Rpb25NYW5hZ2VyCi0JICovCi0JcHVibGljIEFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJaWYgKGFjdGlvbk1nciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWN0aW9uTWdyOwotCQl9Ci0KLQkJYWN0aW9uTWdyID0gbmV3IEFjdGlvbk1hbmFnZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBkb0FjdGlvbihpbnQgYWN0aW9uVHlwZSwgRU9iamVjdCBvYmplY3QsCi0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQkJCWlmIChjYW5VcGRhdGUob2JqZWN0KSkgewotCQkJCQlyZXR1cm4gc3VwZXIuZG9BY3Rpb24oYWN0aW9uVHlwZSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQkJCQlpbmRleCk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgc2F2ZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJfQotCQl9OwotCi0JCXJldHVybiBhY3Rpb25NZ3I7Ci0JfQotCi0JLyoqCi0JICogZGlzcG9zZQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGFjdGlvbk1nciAhPSBudWxsKSB7Ci0JCQlhY3Rpb25NZ3IuZGlzcG9zZSgpOwotCQkJYWN0aW9uTWdyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHVwZGF0ZSBpcyBhbGxvd2VkCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5VcGRhdGUoRU9iamVjdCBvYmplY3QpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChvYmplY3QsIG51bGwpOwotCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyX2Nhbm5vdFVwZGF0ZSwgVG5nVXRpbC5nZXRUeXBlVGV4dChvYmplY3QpLCBvYmplY3QKLQkJCS5lR2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpKTsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlXYXJuaW5nKAotCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLndhcm5pbmdEbGdfdGl0bGUKLQkJCQkJLCBtc2csIFRuZ1V0aWwuZ2V0TWVzc2FnZShzdGF0dXMpKTsKLQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgc2F2ZSBpcyBuZWVkZWQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKSB7Ci0JCXJldHVybiAoYWN0aW9uTWdyICE9IG51bGwpICYmIGFjdGlvbk1nci5pc1NhdmVOZWVkZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBkbyBzYXZlCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKCkgewotCQlpZiAoYWN0aW9uTWdyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7CQkJCi0JCQlDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzID0gYWN0aW9uTWdyLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQlGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZ2V0UGVyc2lzdGVyKG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuZXJyb3JEbGdfc2F2ZUVycm9yCi0JCQkJCQkJLCByZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSA/IHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpIDogcmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKSk7IAotCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJTGlicmFyeVJlc291cmNlcy5lcnJvckRsZ190aXRsZQotCQkJCQkJCSwgbXNnLCBlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCWFjdGlvbk1nci5zYXZlSXNEb25lKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0aCkgewotCQkJCQl0cnkgewotCQkJCQkJLy8gaWYgcm9sbGJhY2sgZmFpbGVkLCByZWxvYWQgdGhlIGxpYnJhcnkKLQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJLnJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZTEpIHsKLQkJCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZ2V0UGVyc2lzdGVyKENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWlmKHJlc291cmNlU2V0IGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZVNldCkgewotCQkJCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9ICgoSUxpYnJhcnlSZXNvdXJjZVNldClyZXNvdXJjZVNldCkuZ2V0UGVyc2lzdGVyKCk7Ci0JCQkJaWYocGVyc2lzdGVyICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHBlcnNpc3Rlci5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL05hbWVDYWNoZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvTmFtZUNhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlNjJhYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvTmFtZUNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkJvb2ttYXJrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBOYW1lQ2FjaGUgewotCQotCXByaXZhdGUgc3RhdGljIE5hbWVDYWNoZSBpbnN0YW5jZSA9IG5ldyBOYW1lQ2FjaGUoKTsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gYU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCXByaXZhdGUgU2V0PEVsZW1lbnRGaWxlPiBhU2V0ID0gbmV3IEhhc2hTZXQ8RWxlbWVudEZpbGU+KCk7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGdNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5hbWVDYWNoZSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLgotCSAqLwotCXByaXZhdGUgTmFtZUNhY2hlKCkgewotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJYU1hcC5jbGVhcigpOwotCQlhU2V0LmNsZWFyKCk7Ci0JCWdNYXAuY2xlYXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4IGFuZCBleHRlbnNpb24KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG5hbWVQcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgdGhlIG5hbWUKLQkgKiBAcGFyYW0gbmFtZVN1ZmZpeCBTdHJpbmcgc3VmZml4IGZvciB0aGUgbmFtZQotCSAqIEBwYXJhbSBleHQgU3RyaW5nIGZpbGUgZXh0ZW5zaW9uLCBmb3IgZXhhbXBsZSwgIi5odG1sIgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCSAKLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWVQcmVmaXgsCi0JCQlTdHJpbmcgbmFtZVN1ZmZpeCwgU3RyaW5nIGV4dCkgewotCQkKLQkJU3RyaW5nIGV4aXN0aW5nRWxlbWVudE5hbWUgPSBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobmFtZVByZWZpeCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKG5hbWVQcmVmaXgpOwotCQl9Ci0JCQotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkgPT0gIiIpCi0JCQlyZXR1cm4gIjAiICsgZXh0OyAvLyROT04tTkxTLTEkCi0JCQotCQlpZiAoIWdNYXAuaXNFbXB0eSgpKSB7Ci0JCQlleGlzdGluZ0VsZW1lbnROYW1lID0gIChTdHJpbmcpIGdNYXAuZ2V0KGVsZW1lbnQuZ2V0R3VpZCgpKTsKLQkJfQotCQkvLyBCcm93c2luZzogQnJvd3NpbmcgQ1Agd2l0aCBzcGVjaWFsIGNoYXJzIGZhaWxlZCB3aXRoCi0JCS8vIGJsYW5rIHBhZ2VzIGFuZCBTY3JpcHQgRXJyb3IgbmVlZCB0byBtYWtlIGEgdmFsaWQgZmlsZSBuYW1lCi0JCWJ1ZmZlci5hcHBlbmQoKGV4aXN0aW5nRWxlbWVudE5hbWUgIT0gbnVsbCkgPyBleGlzdGluZ0VsZW1lbnROYW1lIDogU3RyVXRpbC5yZW1vdmVTcGVjaWFsQ2hhcmFjdGVycyhlbGVtZW50LmdldE5hbWUoKSkpOwotCQlpZiAobmFtZVN1ZmZpeCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKG5hbWVTdWZmaXgpOwotCQl9Ci0KLQkJaWYgKGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoZXh0LmluZGV4T2YoIi4iKSA8IDApIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlleHQgPSAiLiIgKyBleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoZXh0KTsKLQkJfQotCi0JCUVsZW1lbnRGaWxlIGEgPSBuZXcgRWxlbWVudEZpbGUoZWxlbWVudC5nZXRHdWlkKCksIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCi0JCWlmIChhICE9IG51bGwgJiYgYVNldC5hZGQoYSkpIHsKLQkJCWludCBleHREb3QgPSBhLmdldEZpbGVOYW1lKCkubGFzdEluZGV4T2YoIi4iKTsKLQkJCWFNYXAucHV0KChleHREb3QgPCAwKSA/IGEuZ2V0RmlsZU5hbWUoKSA6IGEuZ2V0RmlsZU5hbWUoKS5zdWJzdHJpbmcoMCwgZXh0RG90KSwgZWxlbWVudC5nZXRHdWlkKCkpOwkJCSAKLQkJCWdNYXAucHV0KGVsZW1lbnQuZ2V0R3VpZCgpLCAoZXh0RG90IDwgMCkgPyBhLmdldEZpbGVOYW1lKCkgOiBhLmdldEZpbGVOYW1lKCkuc3Vic3RyaW5nKDAsIGV4dERvdCkpOwotCQl9Ci0KLQkJcmV0dXJuIGEuZ2V0RmlsZU5hbWUoKTsgCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihTdHJVdGlsLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKGVsZW1lbnQuZ2V0TmFtZSgpKSk7Ci0JCQotCQlFbGVtZW50RmlsZSBhID0gbmV3IEVsZW1lbnRGaWxlKGVsZW1lbnQuZ2V0R3VpZCgpLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQotCQlpZiAoYSAhPSBudWxsICYmIGFTZXQuYWRkKGEpKSB7Ci0JCQlhTWFwLnB1dChhLmdldEZpbGVOYW1lKCksIGVsZW1lbnQuZ2V0R3VpZCgpKTsKLS8vCQkJZ01hcC5wdXQoZWxlbWVudC5nZXRHdWlkKCksIGEuZ2V0RmlsZU5hbWUoKSk7Ci0JCX0KLQotCQlyZXR1cm4gYS5nZXRGaWxlTmFtZSgpOyAKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZShTdHJpbmcgZ3VpZCkgewotCQkKLQkJaWYgKCFnTWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIChTdHJpbmcpIGdNYXAuZ2V0KGd1aWQpOwotCQl9Ci0JCXJldHVybiBudWxsOyAKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGd1aWQgZnJvbSB0aGUgZmlsZSBuYW1lLCBhc3N1bWluZyB0aGUgZmlsZSBuYW1lIGlzIGdlbmVyYXRlZCBmcm9tIGFuIGVsZW1lbnQsIAotCSAqIHJldHVybiBudWxsIGlmIG5vdCBmb3VuZC4KLQkgKiBAcGFyYW0gZmlsZU5hbWUgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEd1aWRGcm9tRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWlmIChmaWxlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQkJCQotCQkKLQkJU3RyaW5nIGd1aWQgPSBudWxsOwotCQkKLQkJaW50IGlkeCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIvIik7Ci0JCWludCBsYXN0SWR4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKTsKLQotCQlpZiAoaWR4ID4gLTEpIHsKLQkJCWd1aWQgPSAoU3RyaW5nKSBhTWFwLmdldCgobGFzdElkeCA+IC0xICYmIGlkeCA8IGxhc3RJZHgpID8gCi0JCQkJCWZpbGVOYW1lLnN1YnN0cmluZyhpZHgrMSwgbGFzdElkeCkgOiAoaWR4IDwgZmlsZU5hbWUubGVuZ3RoKCkpID8gCi0JCQkJCQkJZmlsZU5hbWUuc3Vic3RyaW5nKGlkeCsxKSA6IG51bGwpOwotCQl9IGVsc2UgewotCQkJZ3VpZCA9IChTdHJpbmcpIGFNYXAuZ2V0KChsYXN0SWR4ID4gLTEpID8gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGxhc3RJZHgpIDogZmlsZU5hbWUpOwotCQl9Ci0JCWlmIChndWlkID09IG51bGwpCXJldHVybiBudWxsOwkJCi0JCi0JCS8vIHR1cm4gb2ZmIGVycm9yIHJlcG9ydGluZyBhbmQgc2VlIGlmIGd1aWQgZXhpc3RzIGluIGxpYnJhcnkKLQkJYm9vbGVhbiBvbGRSZXBvcnRfRXJyb3IgPSBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUkVQT1JUX0VSUk9SOwotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUkVQT1JUX0VSUk9SID0gZmFsc2U7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLlJFUE9SVF9FUlJPUiA9IG9sZFJlcG9ydF9FcnJvcjsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBndWlkOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGZpbGUgbmFtZSB3aXRoIHRoZSBnaXZlbiBwcmVmaXggYW5kIGV4dGVuc2lvbgotCSAqIEBwYXJhbSB2aWV3IEJvb2ttYXJrCi0JICogQHBhcmFtIG5hbWVQcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgdGhlIG5hbWUKLQkgKiBAcGFyYW0gbmFtZVN1ZmZpeCBTdHJpbmcgc3VmZml4IGZvciB0aGUgbmFtZQotCSAqIEBwYXJhbSBleHQgU3RyaW5nIGZpbGUgZXh0ZW5zaW9uLCBmb3IgZXhhbXBsZSwgIi5odG1sIgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCSAKLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKEJvb2ttYXJrIHZpZXcsIFN0cmluZyBuYW1lUHJlZml4LAotCQkJU3RyaW5nIG5hbWVTdWZmaXgsIFN0cmluZyBleHQpIHsKLQkJCi0JCVN0cmluZyBleGlzdGluZ0VsZW1lbnROYW1lID0gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5hbWVQcmVmaXggIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZChuYW1lUHJlZml4KTsKLQkJfQotCQkKLQkJaWYgKHZpZXcuZ2V0UHJlc2VudGF0aW9uTmFtZSgpID09ICIiKQotCQkJcmV0dXJuICIwIiArIGV4dDsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKCFnTWFwLmlzRW1wdHkoKSkgewotCQkJZXhpc3RpbmdFbGVtZW50TmFtZSA9ICAoU3RyaW5nKSBnTWFwLmdldCh2aWV3LmdldFVuaXF1ZUlkKCkpOwotCQl9Ci0JCS8vIEJyb3dzaW5nOiBCcm93c2luZyBDUCB3aXRoIHNwZWNpYWwgY2hhcnMgZmFpbGVkIHdpdGgKLQkJLy8gYmxhbmsgcGFnZXMgYW5kIFNjcmlwdCBFcnJvciBuZWVkIHRvIG1ha2UgYSB2YWxpZCBmaWxlIG5hbWUKLQkJYnVmZmVyLmFwcGVuZCgoZXhpc3RpbmdFbGVtZW50TmFtZSAhPSBudWxsKSA/IGV4aXN0aW5nRWxlbWVudE5hbWUgOiBTdHJVdGlsLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKHZpZXcuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKSk7Ci0JCWlmIChuYW1lU3VmZml4ICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZVN1ZmZpeCk7Ci0JCX0KLQotCQlpZiAoZXh0ICE9IG51bGwpIHsKLQkJCWlmIChleHQuaW5kZXhPZigiLiIpIDwgMCkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWV4dCA9ICIuIiArIGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChleHQpOwotCQl9Ci0KLQkJRWxlbWVudEZpbGUgYSA9IG5ldyBFbGVtZW50RmlsZSh2aWV3LmdldFVuaXF1ZUlkKCksIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCi0JCWlmIChhICE9IG51bGwgJiYgYVNldC5hZGQoYSkpIHsKLQkJCWludCBleHREb3QgPSBhLmdldEZpbGVOYW1lKCkubGFzdEluZGV4T2YoIi4iKTsKLQkJCWFNYXAucHV0KChleHREb3QgPCAwKSA/IGEuZ2V0RmlsZU5hbWUoKSA6IGEuZ2V0RmlsZU5hbWUoKS5zdWJzdHJpbmcoMCwgZXh0RG90KSwgdmlldy5nZXRVbmlxdWVJZCgpKTsJCQkgCi0JCQlnTWFwLnB1dCh2aWV3LmdldFVuaXF1ZUlkKCksIChleHREb3QgPCAwKSA/IGEuZ2V0RmlsZU5hbWUoKSA6IGEuZ2V0RmlsZU5hbWUoKS5zdWJzdHJpbmcoMCwgZXh0RG90KSk7Ci0JCX0KLQotCQlyZXR1cm4gYS5nZXRGaWxlTmFtZSgpOyAKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9QYWNrYWdlRGVwZW5kZW5jeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvUGFja2FnZURlcGVuZGVuY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWIxZTkwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9QYWNrYWdlRGVwZW5kZW5jeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogSG9sZHMgdGhlIGEgbGlzdCBvZiBwYWNrYWdlIHJlZmVyZW5jZXMgb2Ygb25lIHBhY2thZ2UgZWxlbWVudCBpdCBhbHNvIGhvbGRzIGEKLSAqIGxpc3Qgb2YgZGVwZW5kYW50IHBhY2thZ2UgZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlRGVwZW5kZW5jeSBleHRlbmRzIEVsZW1lbnREZXBlbmRlbmN5IHsKLQotCXByaXZhdGUgYm9vbGVhbiBsb2FkZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIGNvbnN0cnVjdCBhIHBhY2thZ2UgZGVwZW5kZW5jeSBmb3IgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBQYWNrYWdlRGVwZW5kZW5jeShPYmplY3QgZWxlbWVudCkgewotCQlzdXBlcihlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGxvYWRlZCBmbGFnCi0JICogQHBhcmFtIGxvYWRlZCBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9hZGVkKGJvb2xlYW4gbG9hZGVkKSB7Ci0JCXRoaXMubG9hZGVkID0gbG9hZGVkOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIGlzIGxvYWRlZCBvciBub3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRlZCgpIHsKLQkJcmV0dXJuIHRoaXMubG9hZGVkOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcmVmZXJlbmNlIGZvciBhbiBlbGVtZW50Ci0JICogQHBhcmFtIHJlZkVsZW1lbnQgT2JqZWN0Ci0JICogQHBhcmFtIGNyZWF0ZSBib29sZWFuIGlmIHRydWUgY3JlYXRlIGlmIG5vdCBleGlzdC4KLQkgKiBAcmV0dXJuIFBhY2thZ2VSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgUGFja2FnZVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoT2JqZWN0IHJlZkVsZW1lbnQsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCVBhY2thZ2VSZWZlcmVuY2UgcmVmID0gKFBhY2thZ2VSZWZlcmVuY2UpIHN1cGVyCi0JCQkJLmdldFJlZmVyZW5jZShyZWZFbGVtZW50KTsKLQkJaWYgKHJlZiA9PSBudWxsICYmIGNyZWF0ZSkgewotCQkJcmVmID0gbmV3IFBhY2thZ2VSZWZlcmVuY2UoZWxlbWVudCwgcmVmRWxlbWVudCk7Ci0JCQlzdXBlci5hZGRSZWZlcmVuY2UocmVmKTsKLQkJfQotCi0JCXJldHVybiByZWY7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHdpdGggdGhlIGdpdmVuIG93bmVyIGVsZW1lbnQKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IE9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZShPYmplY3Qgb3duZXJFbGVtZW50KSB7Ci0JCVBhY2thZ2VSZWZlcmVuY2UgcmVmOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc3VwZXIuZ2V0UmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCXJlZiA9IChQYWNrYWdlUmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0JCQlyZWYucmVtb3ZlUmVmZXJlbmNlKG93bmVyRWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBkZWJ1ZyBtZXRob2QgdG8gcHJpbnQgb3V0IHRoZSByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnQoKSB7Ci0JCXN1cGVyLnByaW50KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9QYWNrYWdlUmVmZXJlbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9QYWNrYWdlUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiY2Y0ODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvUGFja2FnZVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotCi0KLS8qKgotICogQSBwYWNrYWdlIHJlZmVyZW5jZSBob2xkcyB0aGUgcmVmZXJlbmNlIG9mIHRoZSBjdXJyZW50IHBhY2thZ2UgZWxlbWVudCB0bwotICogYW5vdGhlciBwYWNrYWdlIGVsZW1lbnQuIElmIG9uZSBlbGVtZW50IGluIHRoZSBwYWNrYWdlIHJlZmVyZW5jZXMgdG8gYW5vdGhlcgotICogZWxlbWVudCBpbiBhbm90aGVyIHBhY2thZ2UsIHRoZSB0aGlzIHBhY2thZ2UgcmVmZXJlY2VzIHRvIHRoYXQgcGFja2FnZS4KLSAqIFVubGlrZSBlbGVtZW50IHJlZmVyZW5jZXMsIFBhY2thZ2VSZWZlcmVuY2UgaG9sZCBhIG9uZSB0byBvbmUgcmVsYXRpb25zaGlwCi0gKiBiZXR3ZWVuIHR3byBwYWNrYWdlcyBUaGUgUGFja2FnZXJlZmVyZW5jZSBvYmplY3QgYWxzbyBob2xkIGEgbGlzdCBvZgotICogRWxlbWVudFJlZmVyZW5jZXMgZm9yIGJldHdlZW4gdGhlIHR3byBwYWNrYWdlcwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZVJlZmVyZW5jZSBleHRlbmRzIEVsZW1lbnRSZWZlcmVuY2UgewotCQotCS8vIGxpc3Qgb2YgZWxlbWVudCByZWZlcmVjZXMgYmV0d2VlbiB0aGUgdHdvIHBhY2thZ2UKLQlwcml2YXRlIExpc3QgcmVmTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBQYWNrYWdlUmVmZXJlbmNlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgcmVmRWxlbWVudCkgewotCQlzdXBlcihlbGVtZW50LCByZWZFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSBuZXcgZWxlbWVudCByZWZlcmVuY2UgaWYgdGhlIHJlZmVyZW5jZSBpcyBub3Qgc2V0LiBjYWxsCi0JICogaGFzUmVmZXJlbmNlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgcmVmRWxlbWVudCkgYmVmb3JlIGNhbGxpbmcgdGhpcwotCSAqIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSByZWYKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2UoRWxlbWVudFJlZmVyZW5jZSByZWYpIHsKLQkJcmVmTGlzdC5hZGQocmVmKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIGVsZW1lbnQgcmVmZXJlbmNlcyBhbW9uZyB0aGlzIHBhY2thZ2UgcmVmZXJlbmNlCi0JICogCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBFbGVtZW50UmVmZXJlbmNlIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gcmVmTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayB0aGUgZWxlbWVudCByZWZlcmVuY2UgZXhpc3RzIGluIHRoaXMgcGFja2FnZSByZWZlcmVuY2UKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSByZWZFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1JlZmVyZW5jZShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHJlZkVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZkxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWxlbWVudFJlZmVyZW5jZSByZWYgPSAoRWxlbWVudFJlZmVyZW5jZSkgaXQubmV4dCgpOwotCQkJaWYgKHJlZi5nZXRFbGVtZW50KCkgPT0gZWxlbWVudAotCQkJCQkmJiByZWYuZ2V0UmVmRWxlbWVudCgpID09IHJlZkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGVyZSBpcyBhIHJlZmVyZW5jZSBvZiB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQmFzZVJlZmVyZW5jZSgpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZkxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWxlbWVudFJlZmVyZW5jZSByZWYgPSAoRWxlbWVudFJlZmVyZW5jZSkgaXQubmV4dCgpOwotCQkJaWYgKHJlZiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudFJlZmVyZW5jZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZSB0aGUgcmVmZXJlbmNlIG93bmVyZCBieSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVmZXJlbmNlKE9iamVjdCBvd25lckVsZW1lbnQpIHsKLQkJT2JqZWN0IGU7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCByZWZMaXN0LnNpemUoKSkgewotCQkJRWxlbWVudFJlZmVyZW5jZSByZWYgPSAoRWxlbWVudFJlZmVyZW5jZSkgcmVmTGlzdC5nZXQoaSk7Ci0JCQllID0gcmVmLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlICE9IG51bGwgJiYgZSA9PSBvd25lckVsZW1lbnQpIHsKLQkJCQlyZWZMaXN0LnJlbW92ZShpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJpbnQgb3V0Ci0JICovCi0JcHVibGljIHZvaWQgcHJpbnQoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihMaWJyYXJ5VXRpbC5nZXROYW1lKGVsZW1lbnQpCi0JCQkJKyAiIC0tPiAiICsgTGlicmFyeVV0aWwuZ2V0TmFtZShyZWZFbGVtZW50KSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkoKEVsZW1lbnRSZWZlcmVuY2UpIGl0Lm5leHQoKSkucHJpbnQoKTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBwYWNrYWdlIHJlZmVyZW5jZSBjYW4gYmUgaWdub3JlZAotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbklnbm9yZSgpIHsKLQkJLy8gaWYgdGhlIHBhY2thZ2UgaGFzIG5vIGVsZW1lbnQgcmVmZXJlbmNlIG9yIGFsbCBlbGVtZW50IHJlZmVyZW5jZXMgY2FuCi0JCS8vIGJlIGlnbm9yZWQsIHJldHVybiB0cnVlCi0JCS8vIG90aGVyd2lzZSwgZmFsc2UKLQkJTGlzdCByZWZzID0gdGhpcy5nZXRSZWZlcmVuY2VzKCk7Ci0KLQkJaWYgKHJlZnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWxlbWVudFJlZmVyZW5jZSByZWYgPSAoRWxlbWVudFJlZmVyZW5jZSkgaXQubmV4dCgpOwotCQkJaWYgKCFyZWYuY2FuSWdub3JlKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9TYWZlVXBkYXRlQ29udHJvbGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvU2FmZVVwZGF0ZUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA0YWQzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9TYWZlVXBkYXRlQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIGEgdXRpbGl0eSBjbGFzcyB0byBhbGxvdyBVSSB1cGRhdGUgd2l0aCB0aGUgdmFsaWQgVUkgdGhyZWFkLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNhZmVVcGRhdGVDb250cm9sbGVyIHsKLQotCS8qKgotCSAqIHN5bmMgZXhlY3V0ZSB0aGUgcnVubmFibGUgd2l0aCB0aGUgdmFsaWQgVUkgdGhyZWFkLgotCSAqIEBwYXJhbSBydW5uYWJsZSBSdW5uYWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzeW5jRXhlYyhSdW5uYWJsZSBydW5uYWJsZSkgewotCQl0cnkgewotCQkJLy8gc2luY2UgdGhpcyB3aWxsIGNhdXNlIFVJIHVwZGF0ZSwgd2hpY2ggbXVzdCBiZSBleGVjdXRlZCBpbiB0aGUgVUkKLQkJCS8vIHRocmVhZAotCQkJLy8gb3RoZXJ3aXNlLCB3aWxsIGNhdXNlIEludmFsaWQgVGhyZWFkIEFjY2VzcyBleGNlcHRpb24KLQkJCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCX0KLQkJCWlmIChkaXNwbGF5ID09IG51bGwpIHsKLQkJCQlydW5uYWJsZS5ydW4oKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGlzcGxheS5zeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhc3luYyBleGVjdXRlIHRoZSBydW5uYWJsZSB3aXRoIHRoZSB2YWxpZCBVSSB0aHJlYWQuCi0JICogQHBhcmFtIHJ1bm5hYmxlIFJ1bm5hYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzeW5jRXhlYyhSdW5uYWJsZSBydW5uYWJsZSkgewotCQl0cnkgewotCQkJLy8gc2luY2UgdGhpcyB3aWxsIGNhdXNlIFVJIHVwZGF0ZSwgd2hpY2ggbXVzdCBiZSBleGVjdXRlZCBpbiB0aGUgVUkKLQkJCS8vIHRocmVhZAotCQkJLy8gb3RoZXJ3aXNlLCB3aWxsIGNhdXNlIEludmFsaWQgVGhyZWFkIEFjY2VzcyBleGNlcHRpb24KLQkJCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCX0KLQkJCWlmIChkaXNwbGF5ID09IG51bGwpIHsKLQkJCQlydW5uYWJsZS5ydW4oKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMocnVubmFibGUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9WYXJpYWJpbGl0eUVsZW1lbnRSZWZlcmVuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL1ZhcmlhYmlsaXR5RWxlbWVudFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YTdhYmMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL1ZhcmlhYmlsaXR5RWxlbWVudFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXM7Ci0KLS8qKgotICogZGVmaW5lIGFuIGVsZW1lbnQgcmVmZXJlbmNlIGZvciB2YXJpYWJpbGl0eSBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJpbGl0eUVsZW1lbnRSZWZlcmVuY2UgZXh0ZW5kcyBFbGVtZW50UmVmZXJlbmNlIHsKLQotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnRSZWZlcmVuY2UoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBiYXNlRWxlbWVudCkgewotCQlzdXBlcihlbGVtZW50LCBiYXNlRWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9WYXJpYWJsZUVsZW1lbnRMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9WYXJpYWJsZUVsZW1lbnRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjOTlmNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvVmFyaWFibGVFbGVtZW50TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBob2xkcyBhbGwgdGhlIHZhcmlhYmxlIGVsZW1lbnRzIChjb250cmlidXRvcnMsIHJlcGxhY2Vycykgb2YgdGhlCi0gKiBzcGVjaWZpZWQgYmFzZSBlbGVtZW50LiBhbmQgcHJvdmlkZSBtZXRob2RzIHRvIGNhbGN1bGF0ZSB0aGUgZmluYWwgb3V0cHV0LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFibGVFbGVtZW50TGlzdCB7Ci0KLQlwcml2YXRlIExpc3QgdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKiBAcGFyYW0gYmFzZUVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBWYXJpYWJsZUVsZW1lbnRMaXN0KE1ldGhvZEVsZW1lbnQgYmFzZUVsZW1lbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSB2YXJpYWJpbGl0eSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIHZhcmlhYmxlIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRWYXJpYWJsZUVsZW1lbnQoTWV0aG9kRWxlbWVudCB2YXJpYWJsZSkgewotCQlpZiAoIXZhcmlhYmxlcy5jb250YWlucyh2YXJpYWJsZSkpIHsKLQkJCXZhcmlhYmxlcy5hZGQodmFyaWFibGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlIGEgdmFyaWFiaWxpdHkgZWxlbWVudAotCSAqIEBwYXJhbSB2YXJpYWJsZSBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVmFyaWFibGVFbGVtZW50KE1ldGhvZEVsZW1lbnQgdmFyaWFibGUpIHsKLQkJaWYgKHZhcmlhYmxlcy5jb250YWlucyh2YXJpYWJsZSkpIHsKLQkJCXZhcmlhYmxlcy5yZW1vdmUodmFyaWFibGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IGFsbCB2YXJpYWJpbGl0eSBlbGVtZW50cwotCSAqIEByZXR1cm4gT2JqZWN0W10KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0VmFyaWFibGVFbGVtZW50cygpIHsKLQkJcmV0dXJuIHZhcmlhYmxlcy50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBudW1iZXIgb2YgdmFyaWFiaWxpdHkgZWxlbWVudHMKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmxlcy5zaXplKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9WZXJzaW9uTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvVmVyc2lvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTNmZGJjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9WZXJzaW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSB2ZXJzaW9uaW5nIG9mIHRoZSBlbGVtZW50IGluIHRoZSBtZXRob2QgZWxlbWVudC4gCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCB1c2VkIGFueSBtb3JlIHNpbmNlIHZlcnNpb24gaXMgbm90IG1hbmFnZWQgYXV0b21hdGljYWxseQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVmVyc2lvbk1hbmFnZXIgewotCi0JcHJpdmF0ZSBJTGlicmFyeU1hbmFnZXIgbWFuYWdlcjsKLQotCXByaXZhdGUgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGliU3ZjTGlzdGVuZXIgPSBudWxsOwotCXByaXZhdGUgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJMaXN0ZW5lciA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5Qcm9jZXNzaW5nID0gZmFsc2U7Ci0KLQlwdWJsaWMgVmVyc2lvbk1hbmFnZXIoSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlsaWJTdmNMaXN0ZW5lciA9IG5ldyBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjb25maWd1cmF0aW9uIHNldDogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGNvbmZpZykpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJMaWJyYXJ5IGNsb3NlZDogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGxpYnJhcnkpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkxpYnJhcnkgY2xvc2VkOiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUobGlicmFyeSkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJMaWJyYXJ5IG9wZW5lZDogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGxpYnJhcnkpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJMaWJyYXJ5IHJlb3BlbmVkOiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUobGlicmFyeSkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJMaWJyYXJ5IHNldDogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGxpYnJhcnkpKTsKLQkJCX0KLQkJCQotCQl9OwotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJCi0JCS8vIGFkZCBsaWJyYXJ5IGNoYW5nZSBsaXN0ZW5lcgotCQlsaWJMaXN0ZW5lciA9IG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjaGFuZ2VkSXRlbXMpIHsKLQkJCQlpZiAob3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQKLQkJCQkJLy8JfHwgb3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NSRUFURUQKLQkJCQkJCXx8IG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ERUxFVEVEKSB7Ci0JCQkJCWlmICghaW5Qcm9jZXNzaW5nICYmIGNoYW5nZWRJdGVtcyAhPSBudWxsKSB7Ci0JCQkJCQlpblByb2Nlc3NpbmcgPSB0cnVlOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwcm9jZXNzQ2hhbmdlcyhvcHRpb24sIGNoYW5nZWRJdGVtcyk7Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCWluUHJvY2Vzc2luZyA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCW1hbmFnZXIuYWRkTGlzdGVuZXIobGliTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVtb3ZlTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5yZW1vdmVMaXN0ZW5lcihsaWJMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NoYW5nZXMoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjaGFuZ2VkSXRlbXMpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PSBCRUdJTjogcHJvY2Vzc0NoYW5nZXMKLQkJLy8gPT09PT09PT09PT09PT09PSIpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZWQgaXRlbXM6ICIgKyBjaGFuZ2VkSXRlbXMpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09IEVORDogcHJvY2Vzc0NoYW5nZXMKLQkJLy8gPT09PT09PT09PT09PT09PSIpOwotCi0JCWlmIChjaGFuZ2VkSXRlbXMgPT0gbnVsbCB8fCBjaGFuZ2VkSXRlbXMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBjaGFuZ2VkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCBwa2c7Ci0KLQkJCS8vIG5vdGUgb25seSBwYWNrYWdlIGhhcyB2ZXJzaW9uLAotCQkJLy8gaXQgdGhlIGNoYW5nZWQgZWxlbWVudCBpcyBhIHBhY2thZ2UKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0KSB7Ci0JCQkJcGtnID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCkgZWxlbWVudDsKLQkJCQlzd2l0Y2ggKG9wdGlvbikgewotCQkJCWNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRDoKLQkJCQkJdXBkYXRlVmVyc2lvbihwa2cpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTkVXQ0hJTEQ6Ci0JCQkJCXVwZGF0ZVZlcnNpb24ocGtnKTsKLQkJCQkJdXBkYXRlVmVyc2lvbigob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0KSBwa2cKLQkJCQkJCQkuZUNvbnRhaW5lcigpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQ6Ci0JCQkJCXVwZGF0ZVZlcnNpb24oKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCkgcGtnCi0JCQkJCQkJLmVDb250YWluZXIoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCAhPSBudWxsKSAvLyBUT0RPOiBjaGFuZ2VkSXRlbXMgc29tdGltZXMgY29udGFpbnMKLQkJCS8vIG51bGwgZWxlbWVudC4gVGhpcyBtdXN0IG5vdCBiZSB0aGUKLQkJCS8vIGNhc2UuCi0JCQl7Ci0JCQkJLy8gaXQgdGhlIGVsZW1lbnQgaXMgbm90IGEgcGFja2FnZSwgdXBkYXRlIHRoZSBwYXJlbnQKLQkJCQlFT2JqZWN0IHBhcmVudCA9IGVsZW1lbnQuZUNvbnRhaW5lcigpOwotCQkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbAotCQkJCQkJJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQpKSB7Ci0JCQkJCXBhcmVudCA9IHBhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQkJfQotCi0JCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCXBrZyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQpIHBhcmVudDsKLQkJCQkJdXBkYXRlVmVyc2lvbihwa2cpOwotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogc3dpdGNoIChvcHRpb24pIHsgY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VEOgotCQkJCSAqIGNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ1JFQVRFRDogY2FzZQotCQkJCSAqIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQ6IHVwZGF0ZVZlcnNpb24ocGtnKTsKLQkJCQkgKiBicmVhazsgfQotCQkJCSAqLwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlVmVyc2lvbihvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQgcGtnKSB7Ci0JCWlmIChwa2cgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gU3RyaW5nIG9sZFZlciA9IHBrZy5nZXRWZXJzaW9uKCk7Ci0KLQkJLy8gY3JlYXRlIGEgdmVyc2lvbiBudW1iZXIgYmFzZWQgb24gdGhlIGRhdGUKLQkJQ2FsZW5kYXIgYyA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0JCWludCB5ID0gYy5nZXQoQ2FsZW5kYXIuWUVBUik7Ci0JCWludCBtID0gYy5nZXQoQ2FsZW5kYXIuTU9OVEgpICsgMTsKLQkJaW50IGQgPSBjLmdldChDYWxlbmRhci5EQVRFKTsKLQkJbG9uZyB0ID0gYy5nZXRUaW1lSW5NaWxsaXMoKTsKLQotCQlTdHJpbmcgYmFzZVZlciA9IEludGVnZXIudG9TdHJpbmcoeSkgKyBJbnRlZ2VyLnRvU3RyaW5nKG0pCi0JCQkJKyBJbnRlZ2VyLnRvU3RyaW5nKGQpOwotCQlTdHJpbmcgbWluaVZlciA9IExvbmcudG9IZXhTdHJpbmcodCk7Ci0KLQkJYm9vbGVhbiBvbGROb3RpZnkgPSBwa2cuZURlbGl2ZXIoKTsKLQkJdHJ5IHsKLQkJCXBrZy5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkvKgotCQkJICogU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotCQkJICogU3lzdGVtLm91dC5wcmludGxuKCIgZURldmlsZXIoKT0iICsgcGtnLmVEZWxpdmVyKCkpOwotCQkJICogU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotCQkJICovCi0JCQlwa2cuc2V0VmVyc2lvbihiYXNlVmVyICsgIi4iICsgbWluaVZlcik7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCXBrZy5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1OTRiNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgdGhlIGxpYnJhcnkgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0NvbnRlbnRSZXNvdXJjZVNjYW5uZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udGVudFJlc291cmNlU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNWJhZmVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udGVudFJlc291cmNlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JQ29udGVudFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIHV0aWxpdHkgY2xhc3MgdG8gc2NhbiBjb250ZW50IGFuZCBjb3B5IHJlc291cmNlcyB0byB0aGUgdGFyZ2V0IGxvY2F0aW9uIGZvciBicm93c2luZyBhbmQgcHVibGlzaGluZwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRSZXNvdXJjZVNjYW5uZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaW1hZ2VfcmVmID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSIoPChpbWd8aWZyYW1lKS4qP3NyY1xccyo9XFxzKlwiKSguKj8pKFwiKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBGaWxlIHNvdXJjZVJvb3RQYXRoOwotCi0JcHJpdmF0ZSBGaWxlIHRhcmdldFJvb3RQYXRoOwotCi0JcHJpdmF0ZSBJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQlwcml2YXRlIExpc3QgcHJvY2Vzc2VkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgdGhlIG9iamVjdCB3aXRoIHRoZSByb290IHBhdGggb2YgdGhlIHNvdXJjZSBjb250ZW50Ci0JICogQHBhcmFtIHNvdXJjZVJvb3RQYXRoIEZpbGUKLQkgKi8KLQlwdWJsaWMgQ29udGVudFJlc291cmNlU2Nhbm5lcihGaWxlIHNvdXJjZVJvb3RQYXRoKSB7Ci0JCXRoaXMoc291cmNlUm9vdFBhdGgsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdCB0aGUgb2JqZWN0IGluc3RhbmNlIHdpdGggdGhlIHJvb3QgcGF0aCBvZiB0aGUgc291cmNlIGNvbnRlbnQgYW5kIGEgY29udGVudCB2YWxpZGF0b3IKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlUm9vdFBhdGggRmlsZQotCSAqIEBwYXJhbSB2YWxpZGF0b3IgSUNvbnRlbnRWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgQ29udGVudFJlc291cmNlU2Nhbm5lcihGaWxlIHNvdXJjZVJvb3RQYXRoLAotCQkJSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMuc291cmNlUm9vdFBhdGggPSBzb3VyY2VSb290UGF0aDsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogc2V0IGNvbnRlbnQgdmFsaWRhdG9yCi0JICogQHBhcmFtIHZhbGlkYXRvciBJQ29udGVudFZhbGlkYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBzb3VyY2Ugcm9vdCBwYXRoCi0JICogQHJldHVybiBGaWxlCi0JICovCi0JcHVibGljIEZpbGUgZ2V0U291cmNlUm9vdFBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLnNvdXJjZVJvb3RQYXRoOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHRhcmdldCByb290IHBhdGgKLQkgKiBAcmV0dXJuIEZpbGUKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRUYXJnZXRSb290UGF0aCgpIHsKLQkJcmV0dXJuIHRoaXMudGFyZ2V0Um9vdFBhdGg7Ci0JfQotCQotCS8qKgotCSAqIHNldCB0aGUgdGFyZ2V0IHJvb3QgcGF0aAotCSAqIEBwYXJhbSB0YXJnZXRSb290UGF0aCBGaWxlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0Um9vdFBhdGgoRmlsZSB0YXJnZXRSb290UGF0aCkgewotCQl0aGlzLnRhcmdldFJvb3RQYXRoID0gdGFyZ2V0Um9vdFBhdGg7Ci0JfQotCi0JLyoqCi0JICogcmVzb2x2ZSB0aGUgaW1hZ2VzIGluIHRoZSB0ZXh0LiBjb3B5IHRoZSBpbWFnZSB0byBkZXN0aW5hdGlvbiBpZiBuZWVkZWQKLQkgKiBUaGlzIGlzIHVzZWQgZm9yIGNvcHlpbmcgcmVzb3VyY2VzIGZyb20gYSBsaWJyYXJ5IHRvIGFub3RoZXIgZGVzdGluYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudAotCSAqIEBwYXJhbSBjb250ZW50UGF0aAotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgcGF0aCBvZiB0aGUgc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlc291cmNlcyhTdHJpbmcgY29udGVudCwgU3RyaW5nIGNvbnRlbnRQYXRoKSB7Ci0JCXJlc29sdmVSZXNvdXJjZXMobnVsbCwgY29udGVudCwgY29udGVudFBhdGgpOwotCX0KLQotCS8qKgotCSAqIHJlc29sdmUgdGhlIGltYWdlcyBpbiB0aGUgdGV4dC4gY29weSB0aGUgaW1hZ2UgdG8gZGVzdGluYXRpb24gaWYgbmVlZGVkCi0JICogVGhpcyBpcyB1c2VkIGZvciBjb3B5aW5nIHJlc291cmNlcyBmcm9tIGEgbGlicmFyeSB0byBhbm90aGVyIGRlc3RpbmF0aW9uCi0JICogCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gY29udGVudCBTdHJpbmcKLQkgKiBAcGFyYW0gY29udGVudFBhdGggU3RyaW5nCi0JICogICAgICAgICAgICB0aGUgY29udGVudCBwYXRoIG9mIHRoZSBzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvbHZlUmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBjb250ZW50LAotCQkJU3RyaW5nIGNvbnRlbnRQYXRoKSB7Ci0JCXByb2Nlc3NlZEl0ZW1zLmNsZWFyKCk7Ci0JCVJlc291cmNlSGVscGVyLnJlc29sdmVSZXNvdXJjZXMob3duZXIsIG51bGwsIGNvbnRlbnQsIGNvbnRlbnRQYXRoLAotCQkJCXRoaXMuc291cmNlUm9vdFBhdGgsIHRoaXMudGFyZ2V0Um9vdFBhdGgsIHByb2Nlc3NlZEl0ZW1zLAotCQkJCXZhbGlkYXRvcik7Ci0JfQotCi0JLyoqCi0JICogcmVzb2x2ZSB0aGUgaW1hZ2VzIGluIHRoZSB0ZXh0LiBjb3B5IHRoZSBpbWFnZSB0byBkZXN0aW5hdGlvbiBpZiBuZWVkZWQKLQkgKiBUaGlzIGlzIHVzZWQgZm9yIG1vdmluZyByZXNvdXJjZXMgd2l0aGluIGEgbGlicmFyeSBpZSwgd2hlbgotCSAqIHNvdXJjZVJvb3RQYXRoLmVxdWFscyh0YXJnZXRSb290UGF0aCkKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogICAgICAgICAgICB0aGUgY29udGVudCBwYXRoIG9mIHRoZSBzb3VyY2UKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVJlc291cmNlc1BsdWdpbihTdHJpbmcgY29udGVudCwgU3RyaW5nIGNvbnRlbnRQYXRoLAotCQkJU3RyaW5nIG9sZENvbnRlbnRQYXRoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIHByb2Nlc3MgaW1hZ2VzCi0JCQlNYXRjaGVyIG0gPSBSZXNvdXJjZUhlbHBlci5wX2ltYWdlX3JlZi5tYXRjaGVyKGNvbnRlbnQpOwotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMyk7Ci0JCQkJdXJsID0gcHJvY2Vzc1Jlc291cmNlVXJsUGx1Z2luKHVybCwgY29udGVudFBhdGgsIG9sZENvbnRlbnRQYXRoKTsKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCBtLmdyb3VwKDEpICsgdXJsICsgbS5ncm91cCg0KSk7Ci0JCQl9Ci0JCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCQljb250ZW50ID0gc2IudG9TdHJpbmcoKTsKLQkJCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCQkvLyBwcm9jZXNzIGF0dGFjaG1lbnRzCi0JCQltID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX3JlZl9nZW4ubWF0Y2hlcihjb250ZW50KTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCVN0cmluZ0J1ZmZlciBzYkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJLy8gU3RyaW5nIHRhZyA9IG0uZ3JvdXAoMSk7Ci0JCQkJU3RyaW5nIHVybHRleHQgPSAiICIgKyBtLmdyb3VwKDIpICsgIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlpZiAoUmVzb3VyY2VIZWxwZXIuZ2V0R3VpZEZyb21VcmwodXJsdGV4dCkgPT0gbnVsbCkgewotCQkJCQlNYXRjaGVyIG0yID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX2hyZWZfcGlja2VyCi0JCQkJCQkJLm1hdGNoZXIodXJsdGV4dCk7Ci0JCQkJCWlmIChtMi5maW5kKCkpIHsKLQkJCQkJCVN0cmluZyB1cmwgPSBtMi5ncm91cCgxKS50cmltKCkucmVwbGFjZUFsbCgiXCIiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJdXJsID0gcHJvY2Vzc1Jlc291cmNlVXJsUGx1Z2luKHVybCwgY29udGVudFBhdGgsCi0JCQkJCQkJCW9sZENvbnRlbnRQYXRoKTsKLQkJCQkJCW0yLmFwcGVuZFJlcGxhY2VtZW50KHNiTGluaywgdXJsdGV4dC5zdWJzdHJpbmcobTIKLQkJCQkJCQkJLnN0YXJ0KCksIG0yLnN0YXJ0KDEpKQotCQkJCQkJCQkrIHVybCArIHVybHRleHQuc3Vic3RyaW5nKG0yLmVuZCgxKSwgbTIuZW5kKCkpKTsKLQkJCQkJCW0yLmFwcGVuZFRhaWwoc2JMaW5rKTsKLQkJCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIGNvbnRlbnQuc3Vic3RyaW5nKG0uc3RhcnQoKSwgbQotCQkJCQkJCQkuc3RhcnQoMikpCi0JCQkJCQkJCSsgc2JMaW5rLnRvU3RyaW5nKCkKLQkJCQkJCQkJKyBjb250ZW50LnN1YnN0cmluZyhtLmVuZCgyKSwgbS5lbmQoKSkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCQltLmFwcGVuZFRhaWwoc2IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3NlcyBhIHJlc291cmNlIHVybCBmb3IgbW92aW5nIHdpdGhpbiBhIGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogICAgICAgICAgICBuZXcgcGx1Z2luIHBhdGgKLQkgKiBAcGFyYW0gb2xkQ29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIG9sZCBwbHVnaW4gcGF0aAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc1Jlc291cmNlVXJsUGx1Z2luKFN0cmluZyB1cmwsIFN0cmluZyBjb250ZW50UGF0aCwKLQkJCVN0cmluZyBvbGRDb250ZW50UGF0aCkgewotCQlTdHJpbmcgaW1hZ2VGaWxlID0gUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZVBhdGhGcm9tVXJsKHVybCwKLQkJCQlvbGRDb250ZW50UGF0aCk7Ci0JCWlmIChpbWFnZUZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHVybDsKLQkJfQotCQlTdHJpbmcgbmV3VXJsID0gbnVsbDsKLQkJRmlsZSBzb3VyY2U7Ci0JCUZpbGUgZGVzdDsKLQkJLy8gdGFyZ2V0Um9vdFBhdGggaXMgc2V0IHRvIHRoZSB0YXJnZXQgcGx1Z2luIGRpcmVjdG9yeQotCQlzb3VyY2UgPSBuZXcgRmlsZSh0aGlzLnNvdXJjZVJvb3RQYXRoLmdldFBhcmVudEZpbGUoKSwgaW1hZ2VGaWxlKTsKLQkJaWYgKGltYWdlRmlsZS5pbmRleE9mKEZpbGUuc2VwYXJhdG9yKSAhPSAtMSkgewotCQkJU3RyaW5nIG9sZFBsdWdpbiA9IGltYWdlRmlsZS5zdWJzdHJpbmcoMCwgaW1hZ2VGaWxlCi0JCQkJCS5pbmRleE9mKEZpbGUuc2VwYXJhdG9yKSk7Ci0JCQlTdHJpbmcgbmV3UGx1Z2luID0gdGhpcy50YXJnZXRSb290UGF0aC5nZXROYW1lKCk7Ci0JCQluZXdVcmwgPSB1cmwucmVwbGFjZUZpcnN0KG9sZFBsdWdpbiwgbmV3UGx1Z2luKTsKLQkJCWltYWdlRmlsZSA9IGltYWdlRmlsZS5zdWJzdHJpbmcoaW1hZ2VGaWxlLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKTsKLQkJfQotCQlkZXN0ID0gbmV3IEZpbGUodGhpcy50YXJnZXRSb290UGF0aCwgaW1hZ2VGaWxlKTsKLQotCQlSZXNvdXJjZUhlbHBlci5jb3B5RmlsZShzb3VyY2UsIGRlc3QpOwotCi0JCXJldHVybiBuZXdVcmw7Ci0JfQotCi0JCi0JLyoqCi0JICogY29weSBhbGwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIHRoZSBlbGVtZW50IGFuZCBhbGwgaXRzIGNvbnRhaW5lZCBlbGVtZW50cywgcmVjdXJzaXZlbHkKLQkgKiBAcGFyYW0gZWxlbWVudCBFT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgY29weVJlc291cmNlcyhFT2JqZWN0IGVsZW1lbnQpIHsKLQkJCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQgKSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZGUgPSAoRGVzY3JpYmFibGVFbGVtZW50KWVsZW1lbnQ7Ci0JCQlTdHJpbmcgZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChkZSk7Ci0JCQkKLQkJCS8vMS4gaWNvbnMKLQkJCWphdmEubmV0LlVSSSBpY29uID0gZGUuZ2V0U2hhcGVpY29uKCk7Ci0JCQlpZiAoIGljb24gIT0gbnVsbCApIHsKLQkJCQlTdHJpbmcgcGF0aCA9IGljb24uZ2V0UGF0aCgpOwotCQkJCVJlc291cmNlSGVscGVyLmNvcHlGaWxlKAotCQkJCQkJbmV3IEZpbGUoZ2V0U291cmNlUm9vdFBhdGgoKSwgcGF0aCksIAotCQkJCQkJbmV3IEZpbGUoZ2V0VGFyZ2V0Um9vdFBhdGgoKSwgcGF0aCkpOwotCQkJfQotCQkJCi0JCQlpY29uID0gZGUuZ2V0Tm9kZWljb24oKTsKLQkJCWlmICggaWNvbiAhPSBudWxsICkgewotCQkJCVN0cmluZyBwYXRoID0gaWNvbi5nZXRQYXRoKCk7Ci0JCQkJUmVzb3VyY2VIZWxwZXIuY29weUZpbGUoCi0JCQkJCQluZXcgRmlsZShnZXRTb3VyY2VSb290UGF0aCgpLCBwYXRoKSwgCi0JCQkJCQluZXcgRmlsZShnZXRUYXJnZXRSb290UGF0aCgpLCBwYXRoKSk7Ci0JCQl9Ci0JCQkKLQkJCS8vIDIuIGF0dGFjaG1lbnRzCi0JCQotCQkJCi0JCQkvLyAzLiBjb250ZW50cwotCQkJQ29udGVudERlc2NyaXB0aW9uIGRlc2MgPSBkZS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWlmICggZGVzYy5lQ29udGFpbmVyKCkgIT0gbnVsbCApIHsKLQkJCQlMaXN0IHByb3BlcnRpZXMgPSBkZXNjLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQkJCQkJCQkKLQkJCQkvLyBnZXQgYWxsIHN0cmluZyB0eXBlIGF0dHJpYnV0ZXMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0aWVzCi0JCQkJCQkJLmdldChpKTsKLQkJCQkJaWYgKCAhKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSApIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlPYmplY3QgdmFsdWUgPSBkZXNjLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWlmICggdmFsdWUgPT0gbnVsbCApIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkKLQkJCQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCkgKSB7Ci0JCQkJCQlMaXN0IHNlY3Rpb25zID0gKExpc3QpdmFsdWU7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc2VjdGlvbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQkJCQlTdHJpbmcgdGV4dCA9ICgoU2VjdGlvbilpdC5uZXh0KCkpLmdldFNlY3Rpb25EZXNjcmlwdGlvbigpOwotCQkJCQkJCXJlc29sdmVSZXNvdXJjZXMoZGUsIHRleHQsIGVsZW1lbnRQYXRoKTsKLQkJCQkJCX0KLQkJCQkJfSAgZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCkgKSB7Ci0JCQkJCQlTdHJpbmcgdXJscyA9IHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpOwotCQkJCQkJaWYgKHVybHMubGVuZ3RoKCkgIT0gMCApIHsKLQkJCQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHVybHMsICJ8Iik7IC8vIHRoaXMgaXMgaGFyZGNvZGVkIHNvbWVob3cKLQkJCQkJCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpICkgewotCQkJCQkJCQlTdHJpbmcgdXJsID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJCQkJCVJlc291cmNlSGVscGVyLmNvcHlGaWxlKAotCQkJCQkJCQkJCW5ldyBGaWxlKGdldFNvdXJjZVJvb3RQYXRoKCksIGVsZW1lbnRQYXRoICsgdXJsKSwgCi0JCQkJCQkJCQkJbmV3IEZpbGUoZ2V0VGFyZ2V0Um9vdFBhdGgoKSwgZWxlbWVudFBhdGggKyB1cmwpKTsKLQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgKSB7Ci0JCQkJCQlyZXNvbHZlUmVzb3VyY2VzKGRlLCB2YWx1ZS50b1N0cmluZygpLCBlbGVtZW50UGF0aCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0NvbnZlcnRBY3Rpdml0eVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udmVydEFjdGl2aXR5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMTAyNGZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udmVydEFjdGl2aXR5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogY2xhc3MgdG8gY29udmVydCBhY3Rpdml0eSB0eXBlcwotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29udmVydEFjdGl2aXR5VHlwZSB7Ci0KLS8vCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5IG9sZEFjdGl2aXR5ID0gbnVsbDsKLS8vCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5IG5ld0FjdGl2aXR5ID0gbnVsbDsKLS8vCQotLy8JLy8gb3JpZ2luYWwgYWN0aXZpdHkncyBjb250YWluZXIKLS8vCXByaXZhdGUgc3RhdGljIFByb2Nlc3NQYWNrYWdlIG9sZEFjdGl2aXR5Q29udGFpbmVyID0gbnVsbDsKLS8vCQotLy8JLy8gdGhlIG9yaWdpbmFsIGFjdGl2aXR5J3MgYnJlYWtkb3duIGxpc3QKLS8vCXByaXZhdGUgc3RhdGljIExpc3Qgb2xkQWN0aXZpdHlCcmVha2Rvd24gPSBudWxsOwotLy8JCi0vLwkvLyBpbmRleCBvZiB0aGUgb3JpZ2luYWwgYWN0aXZpdHkgaW4gaXQncyBzdXBlckFjdGl2aXR5J3MgYnJlYWtkb3duIGxpc3QKLS8vCXByaXZhdGUgc3RhdGljIGludCBvbGRBY3Rpdml0eUJyZWFrZG93bkluZGV4ID0gLTE7Ci0vLwkKLS8vCS8vIG9yaWdpbmFsIEFjdGl2aXR5J3MgcGFyZW50IGFjdGl2aXR5Ci0vLwlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBzdXBlckFjdCA9IG51bGw7Ci0vLwkKLS8vCS8vIHBhcmVudCBhY3Rpdml0eSdzIGJyZWFrZG93biBsaXN0Ci0vLwlwcml2YXRlIHN0YXRpYyBFTGlzdCBzdXBlckFjdGJyZWFrZG93bkxpc3QgPSBudWxsOwotLy8JCi0vLwkvLyBvcmlnaW5hbCBBY3Rpdml0eSdzIHZhcmlhYmlsaXR5VHlwZQotLy8JcHJpdmF0ZSBzdGF0aWMgVmFyaWFiaWxpdHlUeXBlIG9sZEFjdFZhclR5cGUgPSBudWxsOwotLy8JCi0vLwkvLyBvcmlnaW5hbCBBY3Rpdml0eSdzIHZhcmlhYmlsaXR5RWxlbWVudAotLy8JcHJpdmF0ZSBzdGF0aWMgVmFyaWFiaWxpdHlFbGVtZW50IG9sZEFjdFZhckVsZW1lbnQgPSBudWxsOwotLy8JCi0vLwkvLyBvcmlnaW5hbCBBY3Rpdml0eSdzIGltbWVkaXRhdGVWYXJpZXRpZXMKLS8vCXByaXZhdGUgc3RhdGljIExpc3Qgb2xkQWN0SW1tZWRpYXRlVmFyaWV0aWVzTGlzdCA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGludFtdIGNvbXBhdGlibGVBY3Rpdml0aWVzID0geyBVbWFQYWNrYWdlLkFDVElWSVRZLAotCQkJVW1hUGFja2FnZS5JVEVSQVRJT04sCi0JCQlVbWFQYWNrYWdlLlBIQVNFLAotCQkJVW1hUGFja2FnZS5DQVBBQklMSVRZX1BBVFRFUk4sCi0JCQlVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1MsCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBjb21wYXRpYmxlQWN0aXZpdGllc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jc3RhdGljIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wYXRpYmxlQWN0aXZpdGllcy5sZW5ndGg7IGkrKykKLQkJCWNvbXBhdGlibGVBY3Rpdml0aWVzTGlzdC5hZGQobmV3IEludGVnZXIoY29tcGF0aWJsZUFjdGl2aXRpZXNbaV0pKTsKLQl9Ci0KLQkvLyBUaGlzIG1ldGhvZCBpcyBidWdneSBhbmQgaXMgcmVwbGFjZWQgd2l0aCBUeXBlQ29udmVydGVyLmNvbnZlcnRBY3Rpdml0eSgpCi0JLy8KLS8vCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgY29udmVydEFjdGl2aXR5KEFjdGl2aXR5IG9sZEFjdGl2aXR5LCBpbnQgbmV3VHlwZSwKLS8vCQkJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgY29tbWFuZCkgewotLy8KLS8vCQkKLS8vCQlDb252ZXJ0QWN0aXZpdHlUeXBlLm9sZEFjdGl2aXR5ID0gb2xkQWN0aXZpdHk7Ci0vLwkJCi0vLwkJLy8gYWN0aXZpdHkgaXMgYWxyZWFkeSB0aGlzIHR5cGUKLS8vCQlpZiAobmV3VHlwZSA9PSBvbGRBY3Rpdml0eS5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSkgewotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0vLwkJCi0vLwkJLy8gbmV3VHlwZSBpcyBub3QgdmFsaWQKLS8vCQlpZiAoIWNvbXBhdGlibGVBY3Rpdml0aWVzTGlzdC5jb250YWlucyhuZXcgSW50ZWdlcihuZXdUeXBlKSkpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8JCQotLy8JCUFjdGl2aXR5IG5ld0FjdGl2aXR5ID0gZG9Db252ZXJ0KG5ld1R5cGUsIGNvbW1hbmQpOwotLy8KLS8vCQlyZXR1cm4gbmV3QWN0aXZpdHk7Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgZG9Db252ZXJ0KGludCBuZXdUeXBlLCBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0vLwkJCi0vLwkJdHJ5IHsKLS8vCQkJRmlsZSBvbGRBY3Rpdml0eVBhdGhGaWxlID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotLy8JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSwgTWV0aG9kTGlicmFyeVBlcnNpc3RlcgotLy8JCQkJCS5nZXRFbGVtZW50UGF0aChvbGRBY3Rpdml0eSkpOwotLy8KLS8vCQkJLy8gY3JlYXRlIG5ldyBhY3Rpdml0eQotLy8JCQluZXdBY3Rpdml0eSA9IGNyZWF0ZU5ld0FjdGl2aXR5KG5ld1R5cGUpOwotLy8KLS8vCQkJLy8gVE9ETzogc3RvcmUgb2xkQWN0aXZpdHkncyBmZWF0dXJlcyBoZXJlLCBhbmQgZG9uJ3Qgc2V0IHRoZW0gdW50aWwKLS8vCQkJLy8gYWZ0ZXIgb2xkYWN0aXZpdHkgaXMgZGVsZXRlZAotLy8JCQkKLS8vCQkJLy8gc3RvcmUgb2xkQWN0aXZpdHkncyBicmVha2Rvd24gbGlzdAotLy8JCQlvbGRBY3Rpdml0eUJyZWFrZG93biA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2xkQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJb2xkQWN0aXZpdHlCcmVha2Rvd24uYWRkKGl0ZXIubmV4dCgpKTsKLS8vCQkJfQotLy8JCQlvbGRBY3Rpdml0eUJyZWFrZG93bkluZGV4ID0gZ2V0SW5kZXhJbkJyZWFrZG93bihvbGRBY3Rpdml0eSk7Ci0vLwkJCQotLy8JCQkvLyBjb3B5IGFsbCBkYXRhIGZyb20gb2xkQWN0aXZpdHkgdG8gbmV3QWN0aXZpdHkKLS8vCQkJSXRlcmF0b3IgaXRlciA9IG9sZEFjdGl2aXR5LmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotLy8JCQkJCS5pdGVyYXRvcigpOwotLy8JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLS8vCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0vLwkJCQlPYmplY3QgbyA9IG9sZEFjdGl2aXR5LmVHZXQoZmVhdHVyZSk7Ci0vLwkJCQlpZiAoZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTgotLy8JCQkJCQkmJiBmZWF0dXJlLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dVSUQKLS8vCQkJCQkJJiYgZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMKLS8vCQkJCQkJJiYgZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLkFDVElWSVRZX19TVVBFUl9BQ1RJVklUSUVTIAotLy8JCQkJCQkmJiBmZWF0dXJlLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlMKLS8vCQkJCQkJJiYgZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQKLS8vCQkJCQkJJiYgZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVAotLy8JCQkJCQkmJiBmZWF0dXJlLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUxTCi0vLwkJCQkJCSYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUxTCi0vLwkJCQkJCSkgewotLy8JCQkJCW5ld0FjdGl2aXR5LmVTZXQoZmVhdHVyZSwgbyk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCi0vLwkJCS8vIHN0b3JlIEd1aWQgaGVyZQotLy8JCQlTdHJpbmcgb2xkQWN0aXZpdHlHdWlkID0gb2xkQWN0aXZpdHkuZ2V0R3VpZCgpOwotLy8KLS8vCQkJLy8gc3RvcmUgb2xkIGFjdGl2aXR5J3MgZUNvbnRhaW5lcgotLy8JCQlvbGRBY3Rpdml0eUNvbnRhaW5lciA9IChQcm9jZXNzUGFja2FnZSkgb2xkQWN0aXZpdHkKLS8vCQkJCQkuZUNvbnRhaW5lcigpOwotLy8KLS8vCQkJLy8gc2V0IGNvbnRhaW5lcgotLy8JCQlvbGRBY3Rpdml0eUNvbnRhaW5lci5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmUob2xkQWN0aXZpdHkpOwotLy8JCQlvbGRBY3Rpdml0eUNvbnRhaW5lci5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQobmV3QWN0aXZpdHkpOwotLy8KLS8vCQkJLy8gY3JlYXRlIHByZXNlbnRhdGlvbgotLy8JCQlDb250ZW50RGVzY3JpcHRpb24gbmV3Q29udGVudERlc2MgPSBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0vLwkJCQkJLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihuZXdBY3Rpdml0eSk7Ci0vLwkJCW5ld0FjdGl2aXR5LnNldFByZXNlbnRhdGlvbihuZXdDb250ZW50RGVzYyk7Ci0vLwotLy8JCQlGaWxlIG5ld0FjdGl2aXR5UGF0aEZpbGUgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0vLwkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpLCBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0vLwkJCQkJLmdldEVsZW1lbnRQYXRoKG5ld0FjdGl2aXR5KSk7Ci0vLwkJCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKAotLy8JCQkJCW9sZEFjdGl2aXR5UGF0aEZpbGUpOwotLy8JCQlzY2FubmVyLnNldFRhcmdldFJvb3RQYXRoKG5ld0FjdGl2aXR5UGF0aEZpbGUpOwotLy8KLS8vCQkJLy8gY29weSBhbGwgcHJlc2VudGF0aW9uIGRhdGEgZnJvbSBvbGRBY3Rpdml0eSB0byBuZXdBY3Rpdml0eQotLy8JCQlDb250ZW50RGVzY3JpcHRpb24gb2xkQ29udGVudERlc2MgPSBvbGRBY3Rpdml0eS5nZXRQcmVzZW50YXRpb24oKTsKLS8vCQkJaXRlciA9IG9sZENvbnRlbnREZXNjLmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLS8vCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0vLwkJCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKSBpdGVyLm5leHQoKTsKLS8vCQkJCWlmIChhdHRyaWIuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRAotLy8JCQkJCQkmJiBhdHRyaWIuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRQotLy8JCQkJCQkmJiBhdHRyaWIuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUwotLy8JCQkJCQkmJiBhdHRyaWIuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRQotLy8JCQkJCQkmJiBhdHRyaWIuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUwotLy8JCQkJCQkmJiBhdHRyaWIuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0UKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTAotLy8JCQkJCQkmJiBhdHRyaWIuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRQotLy8JCQkJCQkmJiBhdHRyaWIuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUCi0vLwkJCQkJCSkgewotLy8JCQkJCU9iamVjdCBvID0gb2xkQ29udGVudERlc2MuZUdldChhdHRyaWIpOwotLy8JCQkJCWlmIChvIGluc3RhbmNlb2YgU3RyaW5nICYmICgoU3RyaW5nKSBvKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0vLwkJCQkJCS8vIHByb2Nlc3MgbGlua3MKLS8vCQkJCQkJc2Nhbm5lci5yZXNvbHZlUmVzb3VyY2VzKG5ld0FjdGl2aXR5LCAoU3RyaW5nKSBvLCAiIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQkJLy8gc2Nhbm5lci5yZXNvbHZlUmVzb3VyY2VzKG5ld0FjdGl2aXR5LCAoU3RyaW5nKSBvLAotLy8JCQkJCQkvLyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmdldEVsZW1lbnRQYXRoKG5ld0FjdGl2aXR5KSk7Ci0vLwkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLS8vCQkJCQl9Ci0vLwkJCQkJbmV3Q29udGVudERlc2MuZVNldChhdHRyaWIsIG8pOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCQotLy8JCQkvLyBtYWtlIGJyZWFrZG93biBsaW5rcwotLy8JCQlMaXN0IG9sZEFjdEJyZWFrZG93bkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCW9sZEFjdEJyZWFrZG93bkxpc3QuYWRkQWxsKG9sZEFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpOwotLy8JCQlmb3IgKGl0ZXIgPSBvbGRBY3RCcmVha2Rvd25MaXN0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpaXRlci5uZXh0KCk7Ci0vLwkJCQliZS5zZXRTdXBlckFjdGl2aXRpZXMobnVsbCk7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCW9sZEFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuY2xlYXIoKTsKLS8vCQkJbmV3QWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwob2xkQWN0aXZpdHlCcmVha2Rvd24pOwotLy8JCQkvLyBtb3ZlIG5ldyBhY3Rpdml0eSB0byBwcm9wZXIgaW5kZXggaW4gdGhlIHBhcmVudCBhY3QncyBicmVha2Rvd24gbGlzdAotLy8JCQlzdXBlckFjdCA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkob2xkQWN0aXZpdHkpOwotLy8JCQlzdXBlckFjdGJyZWFrZG93bkxpc3QgPSAoRUxpc3Qpc3VwZXJBY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLS8vCQkJc3VwZXJBY3RicmVha2Rvd25MaXN0LmFkZChvbGRBY3Rpdml0eUJyZWFrZG93bkluZGV4LCBuZXdBY3Rpdml0eSk7Ci0vLwkJCQotLy8JCQkvLyBoYW5kbGUgdmFyaWFiaWxpdHkKLS8vCQkJb2xkQWN0VmFyRWxlbWVudCA9IG9sZEFjdGl2aXR5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLS8vCQkJb2xkQWN0VmFyVHlwZSA9IG9sZEFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotLy8JCQlvbGRBY3RJbW1lZGlhdGVWYXJpZXRpZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQlvbGRBY3RJbW1lZGlhdGVWYXJpZXRpZXNMaXN0LmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMob2xkQWN0aXZpdHkpKTsKLS8vCQkJCi0vLwkJCWlmIChvbGRBY3RWYXJFbGVtZW50ICE9IG51bGwgJiYgb2xkQWN0VmFyVHlwZSAhPSBudWxsKSB7Ci0vLwkJCQluZXdBY3Rpdml0eS5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KG9sZEFjdFZhckVsZW1lbnQpOwotLy8JCQkJbmV3QWN0aXZpdHkuc2V0VmFyaWFiaWxpdHlUeXBlKG9sZEFjdFZhclR5cGUpOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlmb3IgKGl0ZXIgPSBvbGRBY3RJbW1lZGlhdGVWYXJpZXRpZXNMaXN0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLS8vCQkJCXZlLnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQobmV3QWN0aXZpdHkpOwotLy8JCQl9Ci0vLwotLy8JCQkvLyBjcmVhdGUgdGVtcCBQcm9jZXNzUGFja2FnZSBhbmQgbW92ZSBvbGRBY3Rpdml0eSB0byBpdAotLy8JCQlQcm9jZXNzUGFja2FnZSB0ZW1wUGFyZW50ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLS8vCQkJdGVtcFBhcmVudC5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQob2xkQWN0aXZpdHkpOwotLy8JCQl0ZW1wUGFyZW50LnNldE5hbWUoInRlbXAgUFAgZm9yIGRlbGV0aW9uIik7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwkJCS8vIGRlbGV0ZSBvbGQgQWN0aXZpdHkgaGVyZSAtIGlmIGZhaWxzLCByb2xsIGJhY2sgYnkgZGVsZXRpbmcgbmV3IEFjdGl2aXR5Ci0vLwkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotLy8KLS8vCQkJaWYgKCFjb21tYW5kLmV4ZWN1dGVkIHx8IGNvbW1hbmQuZmFpbGVkKSB7Ci0vLwkJCQkvLyBkZWxldGUgZmFpbGVkLCBvciB1c2VyIHNlbGVjdGVkIGNhbmNlbCBvbiB0aGUgImRlbGV0ZQotLy8JCQkJLy8gcmVmZXJlbmNlcyIgZGlhbG9nCi0vLwkJCQkvLyBjbGVhbiB1cCBuZXcgQWN0aXZpdHkKLS8vCi0vLwkJCQl1bmRvKCk7Ci0vLwotLy8JCQkJbmV3QWN0aXZpdHkgPSBudWxsOwotLy8JCQkJbmV3Q29udGVudERlc2MgPSBudWxsOwotLy8JCQkJcmV0dXJuIG51bGw7Ci0vLwkJCX0KLS8vCi0vLwkJCS8vIHNldCBuZXcgYWN0aXZpdHkncyBHVUlECi0vLwkJCW5ld0FjdGl2aXR5LnNldEd1aWQob2xkQWN0aXZpdHlHdWlkKTsKLS8vCQkJCi0vLwkJCS8vIFRPRE86IHVwZGF0ZSBlZGl0b3IgY29udGVudHMgCi0vLwotLy8JCQkvLyBUT0RPOiBvbiByb2xsYmFjaywgbGlicmFyeSBtYXkgYmUgZGlydHkgYmVjYXVzZSBvZiB0aGUKLS8vCQkJLy8gY29udGFpbmVyL2NvbnRlbnRkZXNjIGNoYW5nZXMgd2UndmUgZG9uZQotLy8JCQkvLyBmaXggdGhpcyBieSBzdG9yaW5nIGFsbCB0aGUgb2xkIGFjdGl2aXR5J3MgaW5mbywgdGhlbiBvbmx5IGNyZWF0ZQotLy8JCQkvLyBuZXcgYWN0aXZpdHkgYWZ0ZXIgb2xkIG9uZSBoYXMKLS8vCQkJLy8gYmVlbiBkZWxldGVkLgotLy8KLS8vCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VTZXQgPSBuZXcgSGFzaFNldCgpOwotLy8JCQkKLS8vCQkJLy8gc2F2ZSBuZXcgYWN0aXZpdHkgYW5kIGl0cyBwcmVzZW50YXRpb24KLS8vCQkJSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLS8vCQkJCQkuZ2V0TWV0aG9kTGlicmFyeVBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlpZiAobmV3QWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkKLS8vCQkJCQltb2RpZmllZFJlc291cmNlU2V0LmFkZChuZXdBY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0vLwkJCQlpZiAobmV3QWN0aXZpdHkuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkgIT0gbnVsbCkKLS8vCQkJCQltb2RpZmllZFJlc291cmNlU2V0LmFkZChuZXdBY3Rpdml0eS5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSk7Ci0vLwkJCQlpZiAob2xkQWN0aXZpdHlDb250YWluZXIuZVJlc291cmNlKCkgIT0gbnVsbCkKLS8vCQkJCQltb2RpZmllZFJlc291cmNlU2V0LmFkZChvbGRBY3Rpdml0eUNvbnRhaW5lci5lUmVzb3VyY2UoKSk7Ci0vLwkJCQlpZiAoc3VwZXJBY3QuZVJlc291cmNlKCkgIT0gbnVsbCkKLS8vCQkJCQltb2RpZmllZFJlc291cmNlU2V0LmFkZChzdXBlckFjdC5lUmVzb3VyY2UoKSk7Ci0vLwotLy8JCQkJZm9yIChpdGVyID0gbW9kaWZpZWRSZXNvdXJjZVNldC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0vLwkJCQkJcGVyc2lzdGVyLnNhdmUocmVzKTsKLS8vCQkJCX0KLS8vCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLS8vCi0vLwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLS8vCQkJCWNvbW1hbmQudW5kbygpOwotLy8JCQkJCi0vLwkJCQl1bmRvKCk7Ci0vLwkJCQlMaWJyYXJ5UGx1Z2luCi0vLwkJCQkJCS5nZXREZWZhdWx0KCkKLS8vCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0vLwkJCQkJCS5kaXNwbGF5RXJyb3IoCi0vLwkJCQkJCQkJTGlicmFyeVJlc291cmNlcy5jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZSwKLS8vCQkJCQkJCQlOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLnNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZywgbmV3QWN0aXZpdHkuZ2V0TmFtZSgpKSwgCi0vLwkJCQkJCQkJTGlicmFyeVJlc291cmNlcy5lcnJvcl9yZWFzb24sCi0vLwkJCQkJCQkJZSk7Ci0vLwkJCQluZXdBY3Rpdml0eSA9IG51bGw7Ci0vLwkJCX0KLS8vCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLS8vCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCWNvbW1hbmQudW5kbygpOwotLy8JCQl1bmRvKCk7Ci0vLwkJCUxpYnJhcnlQbHVnaW4KLS8vCQkJCQkuZ2V0RGVmYXVsdCgpCi0vLwkJCQkJLmdldE1zZ0RpYWxvZygpCi0vLwkJCQkJLmRpc3BsYXlFcnJvcigKLS8vCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuY29udmVydEFjdGl2aXR5RXJyb3JfdGl0bGUsCi0vLwkJCQkJCQlOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRBY3Rpdml0eUVycm9yX21zZywgbmV3QWN0aXZpdHkuZ2V0TmFtZSgpKSwgCi0vLwkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgCi0vLwkJCQkJCQlleCk7Ci0vLwkJCW5ld0FjdGl2aXR5ID0gbnVsbDsKLS8vCQl9Ci0vLwkJcmV0dXJuIG5ld0FjdGl2aXR5OwotLy8JfQotLy8KLS8vCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5IGNyZWF0ZU5ld0FjdGl2aXR5KGludCBuZXdUeXBlKSB7Ci0vLwkJc3dpdGNoIChuZXdUeXBlKSB7Ci0vLwkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWToKLS8vCQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eSgpOwotLy8JCQljYXNlIFVtYVBhY2thZ2UuSVRFUkFUSU9OOgotLy8JCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUl0ZXJhdGlvbigpOwotLy8JCQljYXNlIFVtYVBhY2thZ2UuUEhBU0U6Ci0vLwkJCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGhhc2UoKTsKLS8vCQkJZGVmYXVsdDoKLS8vCQkJCXJldHVybiBudWxsOwotLy8JCX0KLS8vCX0KLS8vCQotLy8JcHJpdmF0ZSBzdGF0aWMgaW50IGdldEluZGV4SW5CcmVha2Rvd24oQWN0aXZpdHkgYWN0KSB7Ci0vLwkJaW50IGluZGV4ID0gLTE7Ci0vLwkJQWN0aXZpdHkgc3VwZXJBY3QgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGFjdCk7Ci0vLwkJaWYgKHN1cGVyQWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotLy8JCQkvLyBnZXQgcHJvY2VzcywgZmluZCBicmVha2Rvd24KLS8vCQkJaW5kZXggPSAoKFByb2Nlc3NDb21wb25lbnQpc3VwZXJBY3QpLmdldFByb2Nlc3MoKS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2YoYWN0KTsKLS8vCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCWluZGV4ID0gc3VwZXJBY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pbmRleE9mKGFjdCk7Ci0vLwkJfQotLy8JCXJldHVybiBpbmRleDsKLS8vCX0KLS8vCQotLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1bmRvKCkgewotLy8JCS8vIHVuZG8gbW92aW5nIG9mIG9sZEFjdGl2aXR5IHRvIHRoZSBmYWtlIFBQCi0vLwkJaWYgKG9sZEFjdGl2aXR5Q29udGFpbmVyICE9IG51bGwpIHsKLS8vCQkJb2xkQWN0aXZpdHlDb250YWluZXIuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlKG5ld0FjdGl2aXR5KTsKLS8vCQkJaWYgKCFvbGRBY3Rpdml0eUNvbnRhaW5lci5nZXRQcm9jZXNzRWxlbWVudHMoKS5jb250YWlucyhvbGRBY3Rpdml0eSkpCi0vLwkJCQlvbGRBY3Rpdml0eUNvbnRhaW5lci5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQob2xkQWN0aXZpdHkpOwotLy8JCX0KLS8vCQkvLyB1bmRvIHRoZSBicmVha2Rvd24gbGluayBjaGFuZ2VzCi0vLwkJaWYgKG5ld0FjdGl2aXR5ICE9IG51bGwpIHsKLS8vCQkJbmV3QWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jbGVhcigpOwotLy8JCX0KLS8vCQlpZiAob2xkQWN0aXZpdHlCcmVha2Rvd24gIT0gbnVsbCAmJiBvbGRBY3Rpdml0eSAhPSBudWxsKSB7Ci0vLy8vCQkJb2xkQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jbGVhcigpOwotLy8JCQlvbGRBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChvbGRBY3Rpdml0eUJyZWFrZG93bik7Ci0vLwkJfQotLy8JCWlmIChzdXBlckFjdGJyZWFrZG93bkxpc3QgIT0gbnVsbCkgewotLy8JCQlpZiAobmV3QWN0aXZpdHkgIT0gbnVsbCkgewotLy8JCQkJc3VwZXJBY3RicmVha2Rvd25MaXN0LnJlbW92ZShuZXdBY3Rpdml0eSk7Ci0vLwkJCX0KLS8vCQkJaWYgKG9sZEFjdGl2aXR5QnJlYWtkb3duSW5kZXggIT0gLTEgJiYgb2xkQWN0aXZpdHkgIT0gbnVsbCAmJgotLy8JCQkJCSFzdXBlckFjdGJyZWFrZG93bkxpc3QuY29udGFpbnMob2xkQWN0aXZpdHkpKQotLy8JCQkJc3VwZXJBY3RicmVha2Rvd25MaXN0LmFkZChvbGRBY3Rpdml0eUJyZWFrZG93bkluZGV4LCBvbGRBY3Rpdml0eSk7Ci0vLwkJfQotLy8JCQotLy8JCS8vIHZhcmlhYmlsaXR5Ci0vLwkJaWYgKG9sZEFjdFZhckVsZW1lbnQgIT0gbnVsbCAmJiBvbGRBY3RWYXJUeXBlICE9IG51bGwpIHsKLS8vCQkJb2xkQWN0aXZpdHkuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChvbGRBY3RWYXJFbGVtZW50KTsKLS8vCQkJb2xkQWN0aXZpdHkuc2V0VmFyaWFiaWxpdHlUeXBlKG9sZEFjdFZhclR5cGUpOwotLy8JCX0KLS8vCQkKLS8vCQlpZiAob2xkQWN0SW1tZWRpYXRlVmFyaWV0aWVzTGlzdCAhPSBudWxsKSB7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9sZEFjdEltbWVkaWF0ZVZhcmlldGllc0xpc3QuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotLy8JCQkJdmUuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChvbGRBY3Rpdml0eSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8KLS8vCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0NvbnZlcnRHdWlkYW5jZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udmVydEd1aWRhbmNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTY2OGVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udmVydEd1aWRhbmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5Db250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklucHV0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdERpYWxvZzsKLQotLyoqCi0gKiBjbGFzcyB0byBjb252ZXJ0IGd1aWRhbmNlIHR5cGVzCi0gKiAKLSAqIEBhdXRob3IgPz8/Ci0gKiBAc2ljbmUgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29udmVydEd1aWRhbmNlVHlwZSB7Ci0KLQlzdGF0aWMgSVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50W10gY29tcGF0aWJsZUd1aWRhbmNlcyA9IHsgVW1hUGFja2FnZS5DT05DRVBULAotCS8vIFVtYVBhY2thZ2UuQ0hFQ0tMSVNULAotCQkJLy8gVW1hUGFja2FnZS5FWEFNUExFLAotCQkJVW1hUGFja2FnZS5HVUlERUxJTkUsCi0JCQkvLyBVbWFQYWNrYWdlLkVTVElNQVRFLAotCQkJLy8gVW1hUGFja2FnZS5FU1RJTUFUSU5HX01FVFJJQywKLQkJCS8vIFVtYVBhY2thZ2UuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUywKLQkJCS8vIFVtYVBhY2thZ2UuUkVQT1JULAotCQkJLy8gVW1hUGFja2FnZS5URU1QTEFURSwKLQkJCVVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTCwKLQkvLyBVbWFQYWNrYWdlLlRPT0xfTUVOVE9SLAotCS8vIFVtYVBhY2thZ2UuV0hJVEVQQVBFUiwKLQkvLyBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTiwKLQkvLyBVbWFQYWNrYWdlLlBSQUNUSUNFLAotCS8vIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQKLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBjb21wYXRpYmxlR3VpZGFuY2VzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlzdGF0aWMgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBhdGlibGVHdWlkYW5jZXMubGVuZ3RoOyBpKyspCi0JCQljb21wYXRpYmxlR3VpZGFuY2VzTGlzdC5hZGQobmV3IEludGVnZXIoY29tcGF0aWJsZUd1aWRhbmNlc1tpXSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgR3VpZGFuY2UgY29udmVydEd1aWRhbmNlKEd1aWRhbmNlIG9sZEd1aWRhbmNlLCBTaGVsbCBzaGVsbCwKLQkJCURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIGNvbnZlcnRHdWlkYW5jZShvbGRHdWlkYW5jZSwgc2hlbGwsIGNvbW1hbmQsIG51bGwpOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBHdWlkYW5jZSBjb252ZXJ0R3VpZGFuY2UoR3VpZGFuY2Ugb2xkR3VpZGFuY2UsIFNoZWxsIHNoZWxsLAotCQkJCURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNvbW1hbmQsIEVDbGFzcyBuZXdUeXBlKSB7Ci0JCWlmIChuZXdUeXBlID09IG51bGwpIHsKLQkJaWYgKHNoZWxsID09IG51bGwpCi0JCQlzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCUxpc3REaWFsb2cgZGxnID0gbmV3IExpc3REaWFsb2coc2hlbGwpOwotCQlkbGcuc2V0SGVpZ2h0SW5DaGFycyg1KTsKLQkJZGxnLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWRsZy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJc3dpdGNoICgoKEludGVnZXIpIGVsZW1lbnQpLmludFZhbHVlKCkpIHsKLQkJCQkvLyBUT0RPOiByZWZhY3RvciB0aGVzZSBzdHJpbmdzIChhbmQgdGhpcyB3aG9sZSBkaWFsb2cpIGludG8KLQkJCQkvLyBsaWJyYXJ5LnVpCi0JCQkJY2FzZSBVbWFQYWNrYWdlLkNPTkNFUFQ6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLmNvbmNlcHRfdGV4dDsgCi0JCQkJY2FzZSBVbWFQYWNrYWdlLkNIRUNLTElTVDoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMuY2hlY2tsaXN0X3RleHQ7IAotCQkJCWNhc2UgVW1hUGFja2FnZS5FWEFNUExFOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5leGFtcGxlX3RleHQ7IAotCQkJCWNhc2UgVW1hUGFja2FnZS5HVUlERUxJTkU6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLmd1aWRlbGluZV90ZXh0OyAKLQkJCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMuZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlJFUE9SVDoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMucmVwb3J0X3RleHQ7IAotCQkJCWNhc2UgVW1hUGFja2FnZS5URU1QTEFURToKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMudGVtcGxhdGVfdGV4dDsgCi0JCQkJY2FzZSBVbWFQYWNrYWdlLlNVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0OwotCQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX01FTlRPUjoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMudG9vbE1lbnRvcl90ZXh0OwotCQkJCWNhc2UgVW1hUGFja2FnZS5XSElURVBBUEVSOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy53aGl0ZXBhcGVyX3RleHQ7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTjoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMudGVybURlZmluaXRpb25fdGV4dDsKLQkJCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0U6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnByYWN0aWNlX3RleHQ7IAotCQkJCWNhc2UgVW1hUGFja2FnZS5SRVVTQUJMRV9BU1NFVDoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMucmV1c2FibGVBc3NldF90ZXh0OwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnVua25vd25HdWlkYW5jZV90ZXh0OwotCQkJCX0KLQotCQkJfQotCQl9KTsKLQkJTGlzdCBuZXdHdWlkYW5jZVR5cGVMaXN0ID0gZ2V0VmFsaWROZXdHdWlkYW5jZVR5cGVzKG9sZEd1aWRhbmNlKTsKLQkJaWYgKG5ld0d1aWRhbmNlVHlwZUxpc3QgPT0gbnVsbCkgewotCQkJTGlicmFyeVBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuY29udmVydEd1aWRhbmNlRXJyb3JfdGl0bGUsCi0JCQkJCQkJTGlicmFyeVJlc291cmNlcy51bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZywKLQkJCQkJCQlOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLnVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfcmVhc29uLCBTdHJVdGlsLnRvTG93ZXIoVG5nVXRpbC5nZXRUeXBlVGV4dChvbGRHdWlkYW5jZSkpKSk7IAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZGxnLnNldElucHV0KG5ld0d1aWRhbmNlVHlwZUxpc3QpOwotCQlkbGcuc2V0VGl0bGUoTGlicmFyeVJlc291cmNlcy5jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGUpOwotCQlkbGcuc2V0TWVzc2FnZShMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRHdWlkYW5jZURpYWxvZ190ZXh0KTsKLQkJaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkKLQkJCXJldHVybiBudWxsOwotCi0JCU9iamVjdFtdIHNlbGVjdGlvblJlc3VsdCA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJaWYgKHNlbGVjdGlvblJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBjaG9zZW5HdWlkYW5jZSA9ICgoSW50ZWdlcikgc2VsZWN0aW9uUmVzdWx0WzBdKS5pbnRWYWx1ZSgpOwotCQkKLS8vCQlHdWlkYW5jZSBuZXdHdWlkYW5jZSA9IGRvQ29udmVydChvbGRHdWlkYW5jZSwgY2hvc2VuR3VpZGFuY2UsIGNvbW1hbmQpOwotCQkKLQkJbmV3VHlwZSA9IGdldEd1aWRhbmNlVHlwZShjaG9zZW5HdWlkYW5jZSk7Ci0JCX0KLQkJCi0JCWlmKG5ld1R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJVHlwZUNvbnZlcnRlci5UeXBlQ29udmVyc2lvbkNvbW1hbmQgY21kID0gVHlwZUNvbnZlcnRlci5jcmVhdGVUeXBlQ29udmVyc2lvbkNvbW1hbmQob2xkR3VpZGFuY2UsIG5ld1R5cGUsIG51bGwsIG51bGwsIHRydWUsIHRydWUpOwotCQl0cnkgewotCQkJaWYoIWNtZC5nZXRJbGxlZ2FsUmVmZXJlbmNlcnMoKS5pc0VtcHR5KCkpIHsKLQkJCQkvLyB0eXBlIGNvbnZlcnNpb24gd2lsbCByZW1vdmUgc29tZSBpbGxlZ2FsIHJlZmVyZW5jZXMKLQkJCQkvLyBjb25maXJtIHdpdGggdXNlciBiZWZvcmUgY29udGludWUKLQkJCQkvLwotCQkJCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNtZC5nZXRJbGxlZ2FsUmVmZXJlbmNlcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkvLyBkb24ndCBzaG93IHByZWRlZmluZWQgZWxlbWVudAotCQkJCQkvLwotCQkJCQlpZighVG5nVXRpbC5pc1ByZWRlZmluZWQoZSkpIHsKLQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5lbGVtZW50VHlwZV90ZXh0LCBlLmVDbGFzcygpLmdldE5hbWUoKSwgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGUpKTsgCi0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbXNnLAotCQkJCQkJCQludWxsKTsKLQkJCQkJCW11bHRpU3RhdHVzLmFkZChzdGF0dXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChtdWx0aVN0YXR1cy5nZXRDaGlsZHJlbigpLmxlbmd0aCA+IDAgJiYKLQkJCQkJCUxpYnJhcnlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQsCi0JCQkJCQkJCW11bHRpU3RhdHVzKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQotCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoY21kLmdldE1vZGlmaWVkUmVzb3VyY2VzKCksIHNoZWxsKTsKLQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheShMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRHdWlkYW5jZURpYWxvZ190aXRsZSwgc3RhdHVzKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWNtZC5leGVjdXRlKCk7Ci0JCQlHdWlkYW5jZSBuZXdHdWlkYW5jZSA9IChHdWlkYW5jZSkgY21kLmdldFJlc3VsdCgpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCQkvLyBzYXZlIG1vZGlmaWVkIHJlc291cmNlcwotCQkJLy8KLQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQl0cnkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNtZC5nZXRNb2RpZmllZFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQl9Ci0JCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQotCQkJCWlmKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKG5ld0d1aWRhbmNlKSkgewotCQkJCQlwZXJzaXN0ZXIuYWRqdXN0TG9jYXRpb24obmV3R3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkpOwotCQkJCX0JCQkJCi0KLQkJCQljbWQuY29weVJlc291cmNlcygpOwotCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuY29udmVydEd1aWRhbmNlRXJyb3JfdGl0bGUsCi0JCQkJCQlOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLnNhdmVDb252ZXJ0ZWRHdWlkYW5jZUVycm9yX21zZywKLQkJCQkJCQkJbmV3R3VpZGFuY2UuZ2V0TmFtZSgpKSwKLQkJCQkJCQkJTGlicmFyeVJlc291cmNlcy5lcnJvcl9yZWFzb24sIGUpOwotCQkJfQotCi0JCQlyZXR1cm4gbmV3R3VpZGFuY2U7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZihjbWQgIT0gbnVsbCkgewotCQkJCXRyeSB7IGNtZC5kaXNwb3NlKCk7IH0gY2F0Y2goRXhjZXB0aW9uIGUpIHt9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkR3VpZGFuY2UKLQkgKiBAcGFyYW0gbmV3R3VpZGFuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShHdWlkYW5jZSBvbGRHdWlkYW5jZSwgR3VpZGFuY2UgbmV3R3VpZGFuY2UpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQkJCi0JCXZhbGlkYXRvciA9IG5ldyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3Iob2xkR3VpZGFuY2UuZUNvbnRhaW5lcigpCi0JCQkJLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwKLQkJCQkoQ29udGVudEVsZW1lbnQpIG5ld0d1aWRhbmNlLCBuZXcgVmFsaWRhdG9yRmFjdG9yeS5UeXBlRmlsdGVyKG5ld0d1aWRhbmNlKSk7Ci0JCQotCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQobmV3R3VpZGFuY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZlYXR1cmVUeHQgPSBUbmdVdGlsLmdldEZlYXR1cmVUZXh0KFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQJCQkKLQkJCVN0cmluZyBkbGdNc2cgPSBOTFMuYmluZCgKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0LAotCQkJCQlTdHJVdGlsLnRvTG93ZXIoZmVhdHVyZVR4dCksIG5ld0d1aWRhbmNlLmdldE5hbWUoKSk7Ci0JCQlTdHJpbmcgY3VycmVudFZhbHVlID0gKFN0cmluZykgbmV3R3VpZGFuY2UuZUdldChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0KLQkJCUlJbnB1dFZhbGlkYXRvciBpbnB1dFZhbGlkYXRvciA9IG5ldyBJSW5wdXRWYWxpZGF0b3IoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCXJldHVybiB2YWxpZGF0b3IuaXNWYWxpZChuZXdUZXh0KTsKLQkJCQl9Ci0JCQl9OwotCi0JCQlJbnB1dERpYWxvZyBpbnB1dERsZyA9IG5ldyBJbnB1dERpYWxvZygKLQkJCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLCB0aXRsZSwgZGxnTXNnLCBjdXJyZW50VmFsdWUsCi0JCQkJCWlucHV0VmFsaWRhdG9yKTsKLQkJCWlmIChpbnB1dERsZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIGlucHV0RGxnLmdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEVDbGFzcyBnZXRHdWlkYW5jZVR5cGUoaW50IG5ld0d1aWRhbmNlVHlwZSkgewotCQlzd2l0Y2ggKG5ld0d1aWRhbmNlVHlwZSkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OQ0VQVDoKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTkNFUFQ7Ci0JCWNhc2UgVW1hUGFja2FnZS5DSEVDS0xJU1Q6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DSEVDS0xJU1Q7Ci0JCWNhc2UgVW1hUGFja2FnZS5FWEFNUExFOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRVhBTVBMRTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURFTElORToKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdVSURFTElORTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCQljYXNlIFVtYVBhY2thZ2UuUkVQT1JUOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVQT1JUOwotCQljYXNlIFVtYVBhY2thZ2UuVEVNUExBVEU6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5URU1QTEFURTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TVVBQT1JUSU5HX01BVEVSSUFMOwotCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9NRU5UT1I6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UT09MX01FTlRPUjsKLQkJY2FzZSBVbWFQYWNrYWdlLldISVRFUEFQRVI6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XSElURVBBUEVSOwotCQljYXNlIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVSTV9ERUZJTklUSU9OOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0U6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVVU0FCTEVfQVNTRVQ7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEd1aWRhbmNlIGNyZWF0ZU5ld0d1aWRhbmNlKGludCBuZXdHdWlkYW5jZVR5cGUpIHsKLQkJc3dpdGNoIChuZXdHdWlkYW5jZVR5cGUpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTkNFUFQ6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uY2VwdCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ0hFQ0tMSVNUOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNoZWNrbGlzdCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRVhBTVBMRToKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeGFtcGxlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlERUxJTkU6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGVsaW5lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVQT1JUOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlcG9ydCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVNUExBVEU6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVtcGxhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX01FTlRPUjoKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sTWVudG9yKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XSElURVBBUEVSOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdoaXRlcGFwZXIoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTjoKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZXJtRGVmaW5pdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0U6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJldXNhYmxlQXNzZXQoKTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFZhbGlkTmV3R3VpZGFuY2VUeXBlcyhHdWlkYW5jZSBvbGRHdWlkYW5jZSkgewotCQlpZiAob2xkR3VpZGFuY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJbnRlZ2VyIG9sZEd1aWRhbmNlQ2xhc3NJRCA9IG5ldyBJbnRlZ2VyKG9sZEd1aWRhbmNlLmVDbGFzcygpCi0JCQkJLmdldENsYXNzaWZpZXJJRCgpKTsKLQkJaWYgKCFjb21wYXRpYmxlR3VpZGFuY2VzTGlzdC5jb250YWlucyhvbGRHdWlkYW5jZUNsYXNzSUQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgZ3VpZGFuY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBhdGlibGVHdWlkYW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUludGVnZXIgY29tcGF0aWJsZUd1aWRhbmNlVHlwZUNsYXNzSUQgPSBuZXcgSW50ZWdlcigKLQkJCQkJY29tcGF0aWJsZUd1aWRhbmNlc1tpXSk7Ci0JCQlpZiAoIW9sZEd1aWRhbmNlQ2xhc3NJRC5lcXVhbHMoY29tcGF0aWJsZUd1aWRhbmNlVHlwZUNsYXNzSUQpKQotCQkJCWd1aWRhbmNlTGlzdC5hZGQoY29tcGF0aWJsZUd1aWRhbmNlVHlwZUNsYXNzSUQpOwotCQl9Ci0JCXJldHVybiBndWlkYW5jZUxpc3Q7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0NvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODkyOGZiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0NvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kLkJhc2ljUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGNvcHkgYXR0YWNobWVlbnRzIHRvIGFub3RoZXIgbG9jYXRpb24KLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpY25lIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24gZXh0ZW5kcyBCYXNpY1Jlc291cmNlTWFuYWdlciB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZVNldDsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZzsKLQotCXByaXZhdGUgTWFwIGVsZW1lbnRUb09sZFBsdWdpbk1hcDsKLQotCXByaXZhdGUgTWV0aG9kUGx1Z2luIGxhc3RPbGRQbHVnaW4gPSBudWxsOwotCi0JcHVibGljIENvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24oKSB7Ci0JCWRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGF0dGFjaG1lbnRzIHdpdGhpbiBhIGxpYnJhcnksIGZyb20gb25lIHBsdWdpbiB0byBhbm90aGVyCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gY29weVJlZmVyZW5jZWRDb250ZW50cyhDb2xsZWN0aW9uIGVsZW1lbnRzLAotCQkJTWFwIGVsZW1lbnRUb09sZFBsdWdpbk1hcCkgewotCQlsYXN0T2xkUGx1Z2luID0gbnVsbDsKLQkJbW9kaWZpZWRSZXNvdXJjZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChlbGVtZW50VG9PbGRQbHVnaW5NYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VTZXQ7Ci0JCX0KLQkJdGhpcy5lbGVtZW50VG9PbGRQbHVnaW5NYXAgPSBlbGVtZW50VG9PbGRQbHVnaW5NYXA7Ci0KLQkJSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQlSZXNvdXJjZSByID0gKFJlc291cmNlKSBvOwotCQkJCUl0ZXJhdG9yIHJlc291cmNlSXRlciA9IHIuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChyZXNvdXJjZUl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSByZXNvdXJjZUl0ZXIubmV4dCgpOwotCQkJCQlIYW5kbGVBdHRhY2htZW50c1BsdWdpbihlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIG87Ci0JCQkJSGFuZGxlQXR0YWNobWVudHNQbHVnaW4oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VTZXQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIEhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luKEVPYmplY3QgZSkgewotCQkvLyBoYW5kbGUgc2VsZgotCQlNZXRob2RFbGVtZW50IGVsZW1lbnRUb1Byb2Nlc3MgPSBudWxsOwotCQkvLyBmaW5kIHRoZSBvbGQgcGx1Z2luLCBpZiB0aGVyZSBpcyBvbmUKLQkJaWYgKGVsZW1lbnRUb09sZFBsdWdpbk1hcCAhPSBudWxsCi0JCQkJJiYgKE1ldGhvZFBsdWdpbikgZWxlbWVudFRvT2xkUGx1Z2luTWFwLmdldChlKSAhPSBudWxsKSB7Ci0JCQlsYXN0T2xkUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgZWxlbWVudFRvT2xkUGx1Z2luTWFwLmdldChlKTsKLQkJfQotCi0JCWlmIChsYXN0T2xkUGx1Z2luICE9IG51bGwpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJRGVzY3JpYmFibGVFbGVtZW50IGRlID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZTsKLQotCQkJCS8vIEN1c3RvbSBpY29ucwotCQkJCXRyeSB7Ci0JCQkJCUZpbGUgbGliRGlyRmlsZSA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpOwotCQkJCQkvLyBzaGFwZSBpY29uCi0JCQkJCWphdmEubmV0LlVSSSBzaGFwZUljb25VcmkgPSBkZS5nZXRTaGFwZWljb24oKTsKLQkJCQkJaWYgKHNoYXBlSWNvblVyaSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBUbyBoYW5kbGUgdGhlIHNoYXBlSWNvbi9ub2RlSWNvbiB1cmkgZ290IGNoYW5nZWQsIGl0cyByZWxhdGl2ZSB0byBwbHVnaW5QYXRoLgotCQkJCQkJamF2YS5uZXQuVVJJIHNyY1NoYXBlVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aFVSSShkZSwKLQkJCQkJCQkJc2hhcGVJY29uVXJpKTsKLQkJCQkJCVN0cmluZyBzaGFwZUljb25QYXRoID0gc2hhcGVJY29uVXJpLmdldFBhdGgoKTsKLQkJCQkJCWlmKHNoYXBlSWNvblBhdGguaW5kZXhPZihsYXN0T2xkUGx1Z2luLmdldE5hbWUoKSkgPCAwKXsKLQkJCQkJCQlzcmNTaGFwZVVyaSA9IG5ldyBGaWxlKFJlc291cmNlSGVscGVyLmdldFBsdWdpblBhdGgobGFzdE9sZFBsdWdpbikgKyBGaWxlLnNlcGFyYXRvcisgc2hhcGVJY29uUGF0aCkudG9VUkkoKTsKLQkJCQkJCX0KLQkJCQkJCUZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHNyY1NoYXBlVXJpKTsKLQkJCQkJCUZpbGUgdGd0RmlsZSA9IG5ldyBGaWxlKHNyY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKLQkJCQkJCQkJLnJlcGxhY2VGaXJzdCgKLQkJCQkJCQkJCQkiXFwiICsgRmlsZS5zZXBhcmF0b3IgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJKyBsYXN0T2xkUGx1Z2luLmdldE5hbWUoKQotCQkJCQkJCQkJCQkJKyAiXFwiICsgRmlsZS5zZXBhcmF0b3IsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiXFwiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCQkJCQkJCSsgVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZGUpCi0JCQkJCQkJCQkJCQkJCS5nZXROYW1lKCkgKyAiXFwiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IpKTsKLQkJCQkJCWlmICghdGd0RmlsZS5leGlzdHMoKSkgewotCQkJCQkJCUZpbGVVdGlsLmNvcHlmaWxlKHNyY0ZpbGUsIHRndEZpbGUpOwotCQkJCQkJfQotCQkJCQkJamF2YS5uZXQuVVJJIG5ld1NoYXBlSWNvblVyaSA9IG5ldyBqYXZhLm5ldC5VUkkoTmV0VXRpbAotCQkJCQkJCQkuZW5jb2RlRmlsZVVSTChGaWxlVXRpbC5nZXRSZWxhdGl2ZVBhdGgoCi0JCQkJCQkJCQkJdGd0RmlsZSwgbmV3IEZpbGUoUmVzb3VyY2VIZWxwZXIuZ2V0UGx1Z2luUGF0aChkZSwgCi0JCQkJCQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpKSkpKTsKLQkJCQkJCWRlLnNldFNoYXBlaWNvbihuZXdTaGFwZUljb25VcmkpOwotCQkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQoZGUuZVJlc291cmNlKCkpOwotCQkJCQl9Ci0KLQkJCQkJLy8gbm9kZSBpY29uCi0JCQkJCWphdmEubmV0LlVSSSBub2RlSWNvblVyaSA9IGRlLmdldE5vZGVpY29uKCk7Ci0JCQkJCWlmIChub2RlSWNvblVyaSAhPSBudWxsKSB7Ci0JCQkJCQlqYXZhLm5ldC5VUkkgc3JjTm9kZVVyaSA9IFRuZ1V0aWwuZ2V0RnVsbFBhdGhVUkkoZGUsCi0JCQkJCQkJCW5vZGVJY29uVXJpKTsKLQkJCQkJCVN0cmluZyBub2RlSWNvblBhdGggPSBub2RlSWNvblVyaS5nZXRQYXRoKCk7Ci0JCQkJCQlpZihub2RlSWNvblBhdGguaW5kZXhPZihsYXN0T2xkUGx1Z2luLmdldE5hbWUoKSkgPCAwKXsKLQkJCQkJCQlzcmNOb2RlVXJpID0gbmV3IEZpbGUoUmVzb3VyY2VIZWxwZXIuZ2V0UGx1Z2luUGF0aChsYXN0T2xkUGx1Z2luKSArIEZpbGUuc2VwYXJhdG9yKyBub2RlSWNvblBhdGgpLnRvVVJJKCk7Ci0JCQkJCQl9Ci0JCQkJCQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShzcmNOb2RlVXJpKTsKLQkJCQkJCUZpbGUgdGd0RmlsZSA9IG5ldyBGaWxlKHNyY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKLQkJCQkJCQkJLnJlcGxhY2VGaXJzdCgKLQkJCQkJCQkJCQkiXFwiICsgRmlsZS5zZXBhcmF0b3IgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJKyBsYXN0T2xkUGx1Z2luLmdldE5hbWUoKQotCQkJCQkJCQkJCQkJKyAiXFwiICsgRmlsZS5zZXBhcmF0b3IsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiXFwiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCQkJCQkJCSsgVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZGUpCi0JCQkJCQkJCQkJCQkJCS5nZXROYW1lKCkgKyAiXFwiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IpKTsKLQkJCQkJCWlmICghdGd0RmlsZS5leGlzdHMoKSkgewotCQkJCQkJCUZpbGVVdGlsLmNvcHlmaWxlKHNyY0ZpbGUsIHRndEZpbGUpOwotCQkJCQkJfQotCQkJCQkJamF2YS5uZXQuVVJJIG5ld05vZGVJY29uVXJpID0gbmV3IGphdmEubmV0LlVSSShOZXRVdGlsCi0JCQkJCQkJCS5lbmNvZGVGaWxlVVJMKEZpbGVVdGlsLmdldFJlbGF0aXZlUGF0aCgKLQkJCQkJCQkJCQl0Z3RGaWxlLCBuZXcgRmlsZShSZXNvdXJjZUhlbHBlci5nZXRQbHVnaW5QYXRoKGRlLCAKLQkJCQkJCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSkpKSkpOwotCQkJCQkJZGUuc2V0Tm9kZWljb24obmV3Tm9kZUljb25VcmkpOwotCQkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQoZGUuZVJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQl9Ci0JCQkJSGFuZGxlQXR0YWNobWVudHNQbHVnaW4oZGUuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCXJldHVybjsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJCWVsZW1lbnRUb1Byb2Nlc3MgPSAoQ29udGVudERlc2NyaXB0aW9uKSBlOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWVsZW1lbnRUb1Byb2Nlc3MgPSAoTWV0aG9kRWxlbWVudCkgZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5IYW5kbGVBdHRhY2htZW50c1BsdWdpbjogdW5rbm93biB0eXBlICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGVsZW1lbnRUb1Byb2Nlc3MgIT0gbnVsbAotCQkJCQkmJiBlbGVtZW50VG9Qcm9jZXNzLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkvLyBzZXQgdXAgQ29udGVudFJlc291cmNlU2Nhbm5lciBmb3IgdGhpcyBlbGVtZW50Ci0JCQkJLy8gZ2l2ZSBDb250ZW50UmVzb3VyY2VTY2FubmVyIHNhbWUgZGlyZWN0b3J5IGZvciBzb3VyY2VSb290UGF0aAotCQkJCS8vIGFuZCB0YXJnZXRSb290UGF0aAotCQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJCQotCQkJCVVSSSBlbGVtZW50VVJJID0gbWFuYWdlciAhPSBudWxsID8gbWFuYWdlci5nZXRFbGVtZW50UmVsYXRpdmVVUkkoZWxlbWVudFRvUHJvY2VzcykgOiBudWxsOwotCQkJCWlmIChlbGVtZW50VVJJID09IG51bGwgfHwgZWxlbWVudFVSSS5zZWdtZW50Q291bnQoKSA8IDEpCi0JCQkJCXJldHVybjsKLQkJCQlTdHJpbmcgdGFyZ2V0UGx1Z2luRGlyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpCi0JCQkJCQkrIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkrIE5ldFV0aWwuZGVjb2RlZEZpbGVVcmwoZWxlbWVudFVSSS5zZWdtZW50KDApKTsKLQkJCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBuZXcgQ29udGVudFJlc291cmNlU2Nhbm5lcigKLQkJCQkJCW5ldyBGaWxlKHRhcmdldFBsdWdpbkRpcikpOwotCQkJCXNjYW5uZXIuc2V0VGFyZ2V0Um9vdFBhdGgobmV3IEZpbGUodGFyZ2V0UGx1Z2luRGlyKSk7Ci0KLQkJCQkvLyBpdGVyYXRlIHRocnUgZWxlbWVudCdzIGNvbnRlbnQKLQotCQkJCVN0cmluZyBjb250ZW50UGF0aCA9IFJlc291cmNlSGVscGVyCi0JCQkJCQkuZ2V0RWxlbWVudFBhdGgoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRUb1Byb2Nlc3MpOwotCQkJCWlmIChjb250ZW50UGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCUxpYnJhcnlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ1dhcm5pbmcoCi0JCQkJCQkJCQlOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb25fbG9nX25vQ29udGVudFBhdGgsIChuZXcgT2JqZWN0W10geyAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRUb1Byb2Nlc3MpLmdldE5hbWUoKSB9KSkpOyAKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCVN0cmluZyBvbGRDb250ZW50UGF0aCA9IGNvbnRlbnRQYXRoLnJlcGxhY2VGaXJzdChVbWFVdGlsCi0JCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnRUb1Byb2Nlc3MpLmdldE5hbWUoKSwKLQkJCQkJCWxhc3RPbGRQbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCQlJdGVyYXRvciBpdGVyID0gZWxlbWVudFRvUHJvY2Vzcy5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpCi0JCQkJCQkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0JCQkJCU9iamVjdCBvID0gZWxlbWVudFRvUHJvY2Vzcy5lR2V0KGF0dHJpYik7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCQlTdHJpbmcgY29udGVudCA9IChTdHJpbmcpIG87Ci0JCQkJCQlpZiAoY29udGVudC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IHNjYW5uZXIucmVzb2x2ZVJlc291cmNlc1BsdWdpbigKLQkJCQkJCQkJCWNvbnRlbnQsIGNvbnRlbnRQYXRoLCBvbGRDb250ZW50UGF0aCk7Ci0JCQkJCQkJaWYgKG5ld0NvbnRlbnQgIT0gbnVsbAotCQkJCQkJCQkJJiYgbmV3Q29udGVudC50cmltKCkubGVuZ3RoKCkgIT0gMAotCQkJCQkJCQkJJiYgIWNvbnRlbnQuZXF1YWxzKG5ld0NvbnRlbnQpKSB7Ci0JCQkJCQkJCWVsZW1lbnRUb1Byb2Nlc3MuZVNldChhdHRyaWIsIG5ld0NvbnRlbnQpOwotCQkJCQkJCQltb2RpZmllZFJlc291cmNlU2V0LmFkZChlbGVtZW50VG9Qcm9jZXNzCi0JCQkJCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBUZW1wbGF0ZSBhdHRhY2htZW50cwotCQkJCWlmIChlbGVtZW50VG9Qcm9jZXNzIGluc3RhbmNlb2YgR3VpZGFuY2VEZXNjcmlwdGlvbikgewotCQkJCQlTdHJpbmcgYXR0YWNobWVudFN0cmluZyA9ICgoR3VpZGFuY2VEZXNjcmlwdGlvbikgZWxlbWVudFRvUHJvY2VzcykKLQkJCQkJCQkuZ2V0QXR0YWNobWVudHMoKTsKLQkJCQkJTGlzdCBhdHRhY2htZW50TGlzdCA9IFRuZ1V0aWwKLQkJCQkJCQkuY29udmVydEd1aWRhbmNlQXR0YWNobWVudHNUb0xpc3QoYXR0YWNobWVudFN0cmluZyk7Ci0JCQkJCWZvciAoaXRlciA9IGF0dGFjaG1lbnRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJU3RyaW5nIGF0dGFjaG1lbnQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChhdHRhY2htZW50ICE9IG51bGwKLQkJCQkJCQkJJiYgYXR0YWNobWVudC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJRmlsZSBzcmNDb250ZW50UGF0aCA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCksCi0JCQkJCQkJCQkJb2xkQ29udGVudFBhdGgpOwotCQkJCQkJCQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShzcmNDb250ZW50UGF0aCwKLQkJCQkJCQkJCQlhdHRhY2htZW50KTsKLQkJCQkJCQkJRmlsZSB0Z3RDb250ZW50UGF0aCA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCksCi0JCQkJCQkJCQkJY29udGVudFBhdGgpOwotCQkJCQkJCQlGaWxlIHRndEZpbGUgPSBuZXcgRmlsZSh0Z3RDb250ZW50UGF0aCwKLQkJCQkJCQkJCQlhdHRhY2htZW50KTsKLQkJCQkJCQkJaWYgKCF0Z3RGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJCQlGaWxlVXRpbC5jb3B5ZmlsZShzcmNGaWxlLCB0Z3RGaWxlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJLmxvZ0Vycm9yKGV4KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBoYW5kbGUgY2hpbGRyZW4KLQkJSXRlcmF0b3IgaXRlciA9IGUuZUFsbENvbnRlbnRzKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRU9iamVjdCBjaGlsZCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCUhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luKGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvcHkgYWxsIGF0dGFjaG1lbnRzIGZyb20gb25lIGxpYnJhcnkgdG8gYW5vdGhlcgotCSAqIAotCSAqIEBwYXJhbSBvbGRMaWJEaXIKLQkgKiAgICAgICAgICAgIE9yaWdpbmFsIGxpYnJhcnkgcm9vdAotCSAqIEBwYXJhbSBuZXdMaWJEaXIKLQkgKiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IHJvb3QKLQkgKiBAcGFyYW0geG1pTGlzdAotCSAqICAgICAgICAgICAgbGlzdCBvZiB4bWkgRmlsZSdzIChwYXNzIG51bGwgdG8gcHJvY2VzcyBhbGwgZmlsZXMgaW4KLQkgKiAgICAgICAgICAgIG5ld0xpYkRpcikKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgb3B0aW9uYWwgKGNhbiBiZSBudWxsKSBJUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlBdHRhY2htZW50c0xpYnJhcnkoU3RyaW5nIG9sZExpYkRpciwKLQkJCVN0cmluZyBuZXdMaWJEaXIsIExpc3QgeG1pTGlzdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJLy8gZ2V0IGxpc3Qgb2YgLnhtaSBmaWxlcyBpbiBuZXdMaWJEaXIKLQkJaWYgKHhtaUxpc3QgPT0gbnVsbCkKLQkJCXhtaUxpc3QgPSBGaWxlVXRpbC5maWxlTGlzdChuZXcgRmlsZShuZXdMaWJEaXIpLCAieG1pIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJbW9uaXRvci5zdWJUYXNrKExpYnJhcnlSZXNvdXJjZXMuY29weWluZ0F0dGFjaG1lbnRzVGFza19uYW1lKTsKLQotCQlJdGVyYXRvciBpdGVyID0geG1pTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQlGaWxlIHhtaUZpbGUgPSAoRmlsZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoeG1pRmlsZS5leGlzdHMoKSkgewotCQkJCS8vIHBhcnNlIHhtaSBmaWxlCi0JCQkJU0FYUGFyc2VyWE1JIHBhcnNlciA9IG5ldyBTQVhQYXJzZXJYTUkobnVsbCk7Ci0JCQkJcGFyc2VyLnBhcnNlKHhtaUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCS8vIGl0ZXJhdGUgdGhydSBpdCdzIGVsZW1lbnRzLCBjaGVja2luZyBjb250ZW50IGZvciBhdHRhY2htZW50cwotCQkJCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKAotCQkJCQkJbmV3IEZpbGUob2xkTGliRGlyKSk7Ci0JCQkJc2Nhbm5lci5zZXRUYXJnZXRSb290UGF0aChuZXcgRmlsZShuZXdMaWJEaXIpKTsKLQkJCQlIYW5kbGVBdHRhY2htZW50cyhwYXJzZXIueG1pTWFwLCBzY2FubmVyLCB4bWlGaWxlLmdldFBhcmVudCgpCi0JCQkJCQkuc3Vic3RyaW5nKG5ld0xpYkRpci5sZW5ndGgoKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBIYW5kbGVBdHRhY2htZW50cyhIYXNoTWFwIGVNYXAsCi0JCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIsIFN0cmluZyBjb250ZW50UGF0aCkgewotCQkvLyBoYW5kbGUgc2VsZgotCQlTdHJpbmcgY29udGVudCA9IFNBWFBhcnNlclhNSS5nZXRFbGVtZW50Q29udGVudChlTWFwKTsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJLy8gc2NhbiBjb250ZW50IGZvciBhdHRhY2htZW50cwotCQkJc2Nhbm5lci5yZXNvbHZlUmVzb3VyY2VzKGNvbnRlbnQsIGNvbnRlbnRQYXRoKTsKLQkJfQotCi0JCS8vIGhhbmRsZSBjaGlsZHJlbgotCQlJdGVyYXRvciBpdGVyID0gKChBcnJheUxpc3QpIGVNYXAuZ2V0KCJjaGlsZHJlbiIpKS5pdGVyYXRvcigpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSGFzaE1hcCBjaGlsZE1hcCA9IChIYXNoTWFwKSBpdGVyLm5leHQoKTsKLQkJCUhhbmRsZUF0dGFjaG1lbnRzKGNoaWxkTWFwLCBzY2FubmVyLCBjb250ZW50UGF0aCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvSWNvblV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvSWNvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDNjZjZjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0ljb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci0KLS8qKgotICogdXRpbGl0eSBjbGFzcyB0byBtYW5hZ2UgaWNvbiB1cmxzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSWNvblV0aWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIG5vZGVJY29uUGx1Z2luUm9vdCA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0FjdGl2aXR5ID0gImZ1bGwvb2JqMTYvQWN0aXZpdHkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0FydGlmYWN0ID0gImZ1bGwvb2JqMTYvQXJ0aWZhY3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0NhcGFiaWxpdHlQYXR0ZXJuID0gImZ1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0NoZWNrbGlzdCA9ICJmdWxsL29iajE2L0NoZWNrbGlzdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fQ29uY2VwdCA9ICJmdWxsL29iajE2L0NvbmNlcHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0NvbnRlbnRQYWNrYWdlID0gImZ1bGwvb2JqMTYvQ29udGVudFBhY2thZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0N1c3RvbUNhdGVnb3J5ID0gImZ1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0RlbGl2ZXJhYmxlID0gImZ1bGwvb2JqMTYvRGVsaXZlcmFibGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0RlbGl2ZXJ5UHJvY2VzcyA9ICJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2VzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRGlzY2lwbGluZSA9ICJmdWxsL29iajE2L0Rpc2NpcGxpbmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0Rpc2NpcGxpbmVHcm91cGluZyA9ICJmdWxsL29iajE2L0Rpc2NpcGxpbmVHcm91cGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRG9tYWluID0gImZ1bGwvb2JqMTYvRG9tYWluIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Fc3RpbWF0ZSA9ICJmdWxsL29iajE2L0VzdGltYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPSAiZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0V4YW1wbGUgPSAiZnVsbC9vYmoxNi9FeGFtcGxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9HdWlkZWxpbmUgPSAiZnVsbC9vYmoxNi9HdWlkZWxpbmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0l0ZXJhdGlvbiA9ICJmdWxsL29iajE2L0l0ZXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTWV0aG9kQ29uZmlndXJhdGlvbiA9ICJmdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX01ldGhvZExpYnJhcnkgPSAiZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9NZXRob2RQYWNrYWdlID0gImZ1bGwvb2JqMTYvTWV0aG9kUGFja2FnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTWV0aG9kUGx1Z2luID0gImZ1bGwvb2JqMTYvTWV0aG9kUGx1Z2luIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9NaWxlc3RvbmUgPSAiZnVsbC9vYmoxNi9NaWxlc3RvbmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX091dGNvbWUgPSAiZnVsbC9vYmoxNi9PdXRjb21lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9QaGFzZSA9ICJmdWxsL29iajE2L1BoYXNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9QcmFjdGljZSA9ICJmdWxsL29iajE2L1ByYWN0aWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Qcm9jZXNzQ29udHJpYnV0aW9uID0gImZ1bGwvb2JqMTYvUHJvY2Vzc0NvbnRyaWJ1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUHJvY2Vzc0ZhbWlseSA9ICJmdWxsL29iajE2L1Byb2Nlc3NGYW1pbHkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1Byb2Nlc3NQYWNrYWdlID0gImZ1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JlcG9ydCA9ICJmdWxsL29iajE2L1JlcG9ydCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUmV1c2FibGVBc3NldCA9ICJmdWxsL29iajE2L1JldXNhYmxlQXNzZXQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JvYWRtYXAgPSAiZnVsbC9vYmoxNi9Sb2FkbWFwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Sb2xlID0gImZ1bGwvb2JqMTYvUm9sZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUm9sZVNldCA9ICJmdWxsL29iajE2L1JvbGVTZXQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JvbGVTZXRHcm91cGluZyA9ICJmdWxsL29iajE2L1JvbGVTZXRHcm91cGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fU3VwcG9ydGluZ01hdGVyaWFsID0gImZ1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9UYXNrID0gImZ1bGwvb2JqMTYvVGFzayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVGVtcGxhdGUgPSAiZnVsbC9vYmoxNi9UZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVGVybURlZmluaXRpb24gPSAiZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVG9vbCA9ICJmdWxsL29iajE2L1Rvb2wiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1Rvb2xNZW50b3IgPSAiZnVsbC9vYmoxNi9Ub29sTWVudG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9XaGl0ZXBhcGVyID0gImZ1bGwvb2JqMTYvV2hpdGVwYXBlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fV29ya1Byb2R1Y3QgPSAiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fV29ya1Byb2R1Y3RUeXBlID0gImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbWFwIG9mIGltYWdlIHR5cGUgdG8gaW1hZ2UKLQlwcml2YXRlIHN0YXRpYyBNYXAgbm9kZUljb25VcmxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXN0YXRpYyB7Ci0JCW5vZGVJY29uVXJsTWFwLnB1dCgiYWN0aXZpdHkiLCBJQ09OX0FjdGl2aXR5KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImFydGlmYWN0IiwgSUNPTl9BcnRpZmFjdCk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJjYXBhYmlsaXR5cGF0dGVybiIsIElDT05fQ2FwYWJpbGl0eVBhdHRlcm4pOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiY2hlY2tsaXN0IiwgSUNPTl9DaGVja2xpc3QpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiY29uY2VwdCIsIElDT05fQ29uY2VwdCk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJjb250ZW50cGFja2FnZSIsIElDT05fQ29udGVudFBhY2thZ2UpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiY3VzdG9tY2F0ZWdvcnkiLCBJQ09OX0N1c3RvbUNhdGVnb3J5KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImRlbGl2ZXJhYmxlIiwgSUNPTl9EZWxpdmVyYWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJkZWxpdmVyeXByb2Nlc3MiLCBJQ09OX0RlbGl2ZXJ5UHJvY2Vzcyk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJkaXNjaXBsaW5lIiwgSUNPTl9EaXNjaXBsaW5lKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImRpc2NpcGxpbmVncm91cGluZyIsIElDT05fRGlzY2lwbGluZUdyb3VwaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImRvbWFpbiIsIElDT05fRG9tYWluKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImVzdGltYXRlIiwgSUNPTl9Fc3RpbWF0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KAotCQkJCSJlc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMiLCBJQ09OX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJleGFtcGxlIiwgSUNPTl9FeGFtcGxlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImd1aWRlbGluZSIsIElDT05fR3VpZGVsaW5lKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIml0ZXJhdGlvbiIsIElDT05fSXRlcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIm1ldGhvZGNvbmZpZ3VyYXRpb24iLCBJQ09OX01ldGhvZENvbmZpZ3VyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgibWV0aG9kbGlicmFyeSIsIElDT05fTWV0aG9kTGlicmFyeSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJtZXRob2RwYWNrYWdlIiwgSUNPTl9NZXRob2RQYWNrYWdlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIm1ldGhvZHBsdWdpbiIsIElDT05fTWV0aG9kUGx1Z2luKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIm1pbGVzdG9uZSIsIElDT05fTWlsZXN0b25lKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIm91dGNvbWUiLCBJQ09OX091dGNvbWUpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgicGhhc2UiLCBJQ09OX1BoYXNlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInByYWN0aWNlIiwgSUNPTl9QcmFjdGljZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJwcm9jZXNzY29udHJpYnV0aW9uIiwgSUNPTl9Qcm9jZXNzQ29udHJpYnV0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInByb2Nlc3NmYW1pbHkiLCBJQ09OX1Byb2Nlc3NGYW1pbHkpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgicHJvY2Vzc3BhY2thZ2UiLCBJQ09OX1Byb2Nlc3NQYWNrYWdlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInJlcG9ydCIsIElDT05fUmVwb3J0KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInJldXNhYmxlYXNzZXQiLCBJQ09OX1JldXNhYmxlQXNzZXQpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgicm9hZG1hcCIsIElDT05fUm9hZG1hcCk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJyb2xlIiwgSUNPTl9Sb2xlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInJvbGVzZXQiLCBJQ09OX1JvbGVTZXQpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgicm9sZXNldGdyb3VwaW5nIiwgSUNPTl9Sb2xlU2V0R3JvdXBpbmcpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgic3VwcG9ydGluZ21hdGVyaWFsIiwgSUNPTl9TdXBwb3J0aW5nTWF0ZXJpYWwpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgidGFzayIsIElDT05fVGFzayk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ0ZW1wbGF0ZSIsIElDT05fVGVtcGxhdGUpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgidGVybWRlZmluaXRpb24iLCBJQ09OX1Rlcm1EZWZpbml0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInRvb2wiLCBJQ09OX1Rvb2wpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgidG9vbG1lbnRvciIsIElDT05fVG9vbE1lbnRvcik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ3aGl0ZXBhcGVyIiwgSUNPTl9XaGl0ZXBhcGVyKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIndvcmtwcm9kdWN0IiwgSUNPTl9Xb3JrUHJvZHVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ3b3JrcHJvZHVjdHR5cGUiLCBJQ09OX1dvcmtQcm9kdWN0VHlwZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlub2RlSWNvblVybE1hcC5wdXQoInJvbGVkZXNjcmlwdG9yIiwgSUNPTl9Sb2xlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInRhc2tkZXNjcmlwdG9yIiwgSUNPTl9UYXNrKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIndvcmtwcm9kdWN0ZGVzY3JpcHRvciIsIElDT05fV29ya1Byb2R1Y3QpOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCW5vZGVJY29uUGx1Z2luUm9vdCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0QmFzZVVSTCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBub2RlIGljb24gdXJsCi0JICogCi0JICogQHBhcmFtIHR5cGUgU3RyaW5nIHRoZSBlbGVtZW50IHR5cGUKLQkgKiBAcmV0dXJuIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGdldE5vZGVJY29uVVJMKFN0cmluZyB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgbm9kZUljb25VcmxNYXAuZ2V0KHR5cGUudG9Mb3dlckNhc2UoKSk7Ci0JCQlpZiAoa2V5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFVSTChub2RlSWNvblBsdWdpblJvb3QsICJpY29ucy8iICsga2V5ICsgIi5naWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBub2RlIGljb24gZmlsZSBsb2NhdGlvbiBmb3IgdGhlIGVsZW1lbnQgdHlwZQotCSAqIEBwYXJhbSB0eXBlIFN0cmluZyB0aGUgZWxlbWVudCB0eXBlCi0JICogQHJldHVybiBGaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldE5vZGVJY29uRmlsZShTdHJpbmcgdHlwZSkgewotCQlVUkwgdXJsID0gZ2V0Tm9kZUljb25VUkwodHlwZSk7Ci0JCWlmICh1cmwgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9JbXBvcnRFeHBvcnRVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0ltcG9ydEV4cG9ydFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGQ2ODA3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0ltcG9ydEV4cG9ydFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIHV0aWxpdHkgY2xhc3MgdG8gaGFuZGxlIGVsZW1lbnQgcmVwbGFjZSBvciByZW5hbWluZyBmb3IgaW1wb3J0L2V4cG9ydAotICogCi0gKiBAYXV0aG9yID8/PwotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydEV4cG9ydFV0aWwgewotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9jQ29tcAotCSAqIEBwYXJhbSBkaXIKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0JICogQHRocm93cyBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yCi0JICogQHRocm93cyBTQVhFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZShQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wLCBTdHJpbmcgZGlyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLAotCQkJRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciwgU0FYRXhjZXB0aW9uIHsKLQkJRmlsZSBuZXdQcm9jQ29tcEZpbGUgPSBuZXcgRmlsZShkaXIsCi0JCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9NT0RFTF9GSUxFTkFNRSk7Ci0JCWlmICghbmV3UHJvY0NvbXBGaWxlLmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKAotCQkJCQlNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuSW1wb3J0RXhwb3J0VXRpbF9NU0c4LCBuZXcgT2JqZWN0W10geyBuZXdQcm9jQ29tcEZpbGUgfSkpOwotCQl9Ci0KLQkJU3RyaW5nIG9sZE1vZGVsRmlsZVN0ciA9IHByb2NDb21wLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQlTdHJpbmcgb2xkUHJvY0NvbXBEaXIgPSBuZXcgRmlsZShvbGRNb2RlbEZpbGVTdHIpLmdldFBhcmVudCgpOwotCi0JCVN0cmluZyBzdWZmaXggPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRCYWNrdXBGaWxlU3VmZml4KCk7Ci0KLQkJRmlsZSB0ZW1wRGlyID0gbnVsbDsKLQotCQl0cnkgewotCQkJLy8gY29weSBkaXIgYSB0ZW1wIGRpciBpbnNpZGUgdGhlIHRhcmdldCBkaXIKLQkJCS8vCi0JCQl0ZW1wRGlyID0gbmV3IEZpbGUob2xkUHJvY0NvbXBEaXIsIHN1ZmZpeCk7Ci0JCQlpZiAoIXRlbXBEaXIubWtkaXIoKSkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigKLQkJCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLkltcG9ydEV4cG9ydFV0aWxfTVNHOSwgbmV3IE9iamVjdFtdIHsgdGVtcERpciB9KSk7Ci0JCQl9Ci0JCQlGaWxlVXRpbC5jb3B5ZGlyZWN0b3J5KG5ldyBGaWxlKGRpciksIHRlbXBEaXIpOwotCQkJbmV3UHJvY0NvbXBGaWxlID0gbmV3IEZpbGUodGVtcERpciwKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9NT0RFTF9GSUxFTkFNRSk7Ci0KLQkJCS8vIGxvYWQgdGhlIG5ldyBtb2RlbC54bWkKLQkJCS8vCi0JCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHByb2NDb21wCi0JCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJUmVzb3VyY2UgbmV3UmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkKLQkJCQkJLmNyZWF0ZUZpbGVVUkkobmV3UHJvY0NvbXBGaWxlLmdldEFic29sdXRlUGF0aCgpKSwgdHJ1ZSk7Ci0KLQkJCS8vIGZpeCBjb25maWd1cmF0aW9uIHJlZmVyZW5jZXMKLQkJCS8vCi0JCQlQcm9jZXNzQ29tcG9uZW50IG5ld1Byb2NDb21wID0gKFByb2Nlc3NDb21wb25lbnQpIFBlcnNpc3RlbmNlVXRpbAotCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChuZXdSZXNvdXJjZSk7Ci0JCQlQcm9jZXNzIG5ld1Byb2MgPSBuZXdQcm9jQ29tcC5nZXRQcm9jZXNzKCk7Ci0JCQluZXdQcm9jCi0JCQkJCS5zZXREZWZhdWx0Q29udGV4dChwcm9jQ29tcC5nZXRQcm9jZXNzKCkKLQkJCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKSk7Ci0JCQluZXdQcm9jLmdldFZhbGlkQ29udGV4dCgpLmNsZWFyKCk7Ci0JCQluZXdQcm9jLmdldFZhbGlkQ29udGV4dCgpLmFkZEFsbCgKLQkJCQkJcHJvY0NvbXAuZ2V0UHJvY2VzcygpLmdldFZhbGlkQ29udGV4dCgpKTsKLQotCQkJLy8gZml4IGFsbCBzdGVwcwotCQkJLy8JCQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3UHJvY0NvbXAuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQkJVGFzayB0YXNrID0gdGFza0Rlc2MuZ2V0VGFzaygpOwotCQkJCQlTdHJpbmcgdGFza05hbWUgPSB0YXNrID09IG51bGwgPyAiTk9ORSIgOiAiJyIgKyB0YXNrLmdldE5hbWUoKSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUYXNrOiAiICsgdGFza05hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmICh0YXNrICE9IG51bGwpIHsKLQkJCQkJCXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5jbGVhcigpOwotCQkJCQkJdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLmFkZEFsbCh0YXNrLmdldFN0ZXBzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZXBsYWNlIEdVSUQgb2YgbmV3IFByb2Nlc3NDb21wb25lbnQgYW5kIGl0cyBSZXNvdXJjZU1hbmFnZXIgd2l0aAotCQkJLy8gb2xkIG9uZXMKLQkJCS8vCi0KLQkJCS8vIC8vIHJlYWQgdGhlIG1vZGVsLnhtaSBmaWxlCi0JCQkvLyBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9Ci0JCQkvLyBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQkvLyBEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKG5ld1Byb2NDb21wRmlsZSk7Ci0KLQkJCS8vIHNldCBHVUlEIG9mIG5ldyBSZXNvdXJjZU1hbmFnZXIgdG8gb2xkIEdVSUQKLQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCQkuZ2V0UmVzb3VyY2VNYW5hZ2VyKHByb2NDb21wLmVSZXNvdXJjZSgpKTsKLQkJCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJCU11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlTWFuYWdlcihuZXdSZXNvdXJjZSkuc2V0R3VpZCgKLQkJCQkJCXJlc01nci5nZXRHdWlkKCkpOwotCQkJfQotCi0JCQkvLyBOb2RlTGlzdCBsaXN0ID0KLQkJCS8vIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIik7Ci0JCQkvLyBFbGVtZW50IGUgPSAoRWxlbWVudCkgbGlzdC5pdGVtKDApOwotCQkJLy8gZS5zZXRBdHRyaWJ1dGUoInhtaTppZCIsIGd1aWQpOwotCQkJLy8gZS5zZXRBdHRyaWJ1dGUoImd1aWQiLCBndWlkKTsKLQotCQkJLy8gc2V0IEdVSUQgb2YgbmV3IFByb2Nlc3NDb21wb25lbnQgdG8gb2xkIEdVSUQKLQkJCW5ld1Byb2NDb21wLnNldEd1aWQocHJvY0NvbXAuZ2V0R3VpZCgpKTsKLQotCQkJLy8gZ3VpZCA9IHByb2NDb21wLmdldEd1aWQoKTsKLQkJCS8vIGxpc3QgPQotCQkJLy8gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiKTsKLQkJCS8vIGUgPSAoRWxlbWVudCkgbGlzdC5pdGVtKDApOwotCQkJLy8gZS5zZXRBdHRyaWJ1dGUoInhtaTppZCIsIGd1aWQpOwotCQkJLy8gZS5zZXRBdHRyaWJ1dGUoImd1aWQiLCBndWlkKTsKLQotCQkJLy8gc2F2ZSB0aGUgbmV3IG1vZGVsLnhtaQotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCU1hcCBzYXZlT3B0aW9ucyA9IG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIuZ2V0U2F2ZU9wdGlvbnMoKSA6IG5ldyBIYXNoTWFwKCk7CQkJCi0JCQluZXdSZXNvdXJjZS5zYXZlKHNhdmVPcHRpb25zKTsKLQotCQkJLy8gYmFjayB1cCBvbGQgbW9kZWwueG1pCi0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShvbGRNb2RlbEZpbGVTdHIpOwotCQkJRmlsZVV0aWwubW92ZUZpbGUoZmlsZSwgbmV3IEZpbGUob2xkTW9kZWxGaWxlU3RyICsgIi5iYWsiICsgc3VmZml4KSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJRmlsZVV0aWwubW92ZUZpbGUobmV3UHJvY0NvbXBGaWxlLCBuZXcgRmlsZShvbGRNb2RlbEZpbGVTdHIpKTsKLQotCQkJLy8gWE1MVXRpbC5zYXZlRG9jdW1lbnQoZG9jLCBvbGRNb2RlbEZpbGVTdHIpOwotCi0JCQlGaWxlIG5ld0NvbnRlbnRGaWxlID0gbmV3IEZpbGUodGVtcERpciwKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9DT05URU5UX0ZJTEVOQU1FKTsKLQotCQkJLy8gYmFjayB1cCBvbGQgY29udGVudC54bWkKLQkJCVN0cmluZyBjb250ZW50RmlsZVN0ciA9IG9sZFByb2NDb21wRGlyICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0NPTlRFTlRfRklMRU5BTUU7Ci0JCQlGaWxlIG9sZENvbnRlbnRGaWxlID0gbmV3IEZpbGUoY29udGVudEZpbGVTdHIpOwotCQkJRmlsZVV0aWwubW92ZUZpbGUob2xkQ29udGVudEZpbGUsIG5ldyBGaWxlKGNvbnRlbnRGaWxlU3RyICsgIi5iYWsiICsgc3VmZml4KSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gY29weSBuZXcgY29udGVudC54bWkKLQkJCWlmIChuZXdDb250ZW50RmlsZS5leGlzdHMoKSkgewotCQkJCUZpbGVVdGlsLm1vdmVGaWxlKG5ld0NvbnRlbnRGaWxlLCBvbGRDb250ZW50RmlsZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodGVtcERpciAhPSBudWxsKSB7Ci0JCQkJRmlsZVV0aWwuZGVsZXRlQWxsRmlsZXModGVtcERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJdGVtcERpci5kZWxldGUoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTGlicmFyeU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTGlicmFyeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTVkNDhkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0xpYnJhcnlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQWRkVG9DYXRlZ29yeUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlbW92ZUZyb21DYXRlZ29yeUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBhbGwgdGhlIHJvdXRpbmVzIHVzZWQgYnkgdGhlIHRvb2wgZWRpdG9yIHRvIG1hbmlwdWxhdGUKLSAqIHRoZSBhc3NvY2lhdGlvbnMgb2YgYSBtZXRob2QgZWxlbWVudCBpbiB0aGUgbGlicmFyeSB3aXRoIG90aGVyIGNhdGVnb3JpZXMgb3IKLSAqIG1ldGhvZCBlbGVtZW50cwotICogCi0gKiBVc2UgZ2V0QXZhaWxhYmxlWFhYIHRvIHJldHJpZXZlIGEgcGljayBsaXN0IG9mIGNhdGVnb3JpZXMsIG1ldGhvZCBlbGVtZW50IGZvcgotICogYSBnaXZlbiBtZXRob2QgZWxlbWVudC4gVXNlIGFkZFRvWFhYIHRvIGVzdGFibGlzaCBhIG5ldyBhc3NvY2lhdGlvbi4gVXNlCi0gKiByZW1vdmVGcm9tWFhYIHRvIHJlbW92ZSBhbiBleGlzaXRpbmcgYXNzb2NpYXRpb24uCi0gKiAKLSAqIENhbGwgcmVsZWFzZUNhdGVnb3JpZXMoKSBiZWZvcmUgdGhlIGVkaXRvciBjbG9zZXMsIHBhc3NpbmcgaW4gYWxsIHRoZQotICogY2F0ZWdvcmllcyB0aGF0IHlvdSBoYXZlIHJldHJpZXZlZCB3aXRoIGdldEF2YWlsYWJsZVhYWCgpIGZvciB0aGUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeU1hbmFnZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcGFyYXRvciBuYW1lQ29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaWYgKG8xIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBvMiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBvMSkuZ2V0TmFtZSgpLmNvbXBhcmVUbygKLQkJCQkJCSgoTWV0aG9kRWxlbWVudCkgbzIpLmdldE5hbWUoKSk7Ci0JCQl9Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeU1hbmFnZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaWJyYXJ5TWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTGlicmFyeU1hbmFnZXIuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBMaWJyYXJ5TWFuYWdlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIExpYnJhcnlNYW5hZ2VyKCkgewotCX0KLQotCS8vIC8vLy8vLwotCS8vIEJlZ2luIG9mIGNvZGUgbW92ZWQgZnJvbSBNZXRob2RFbGVtZW50VXRpbCBhbmQgbWFkZSBwcml2YXRlCi0JLy8gLy8vLy8vCi0JLyoqCi0JICogUmV0dXJuIGNhdGVnb3JpZXMgaW4gdGhlIG1vZGVsLCBnaXZlbiBwYXJ0aWN1bGFyIG9iamVjdCBhbmQgY2xhc3MKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGNsYXNzCi0JICogQHBhcmFtIFN0cmluZ1tdCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoTWV0aG9kRWxlbWVudCBvYmplY3QsIENsYXNzIGNsYXNzVHlwZSwKLQkJCVN0cmluZ1tdIHBhdGgpIHsKLQkJTGlzdCBpdGVtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTWV0aG9kUGx1Z2luIG1vZGVsID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0KLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCS8vIGFkZCBhbGwgY2F0ZWdvcmllcyBmcm9tIHRoZSBjdXJyZW50IHBsdWdpbgotCQkJLy8KLQkJCUNvbnRlbnRQYWNrYWdlIGRpc2NpcGxpbmVQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShtb2RlbCwKLQkJCQkJcGF0aCk7Ci0JCQlpZiAoZGlzY2lwbGluZVBrZyAhPSBudWxsKSB7Ci0JCQkJRUxpc3QgY29udGVudENhdHMgPSAoRUxpc3QpIGRpc2NpcGxpbmVQa2cuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50Q2F0cy5zaXplKCk7IGkrKykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGNvbnRlbnRDYXRzLmdldChpKTsKLQotCQkJCQlpZiAoY2xhc3NUeXBlLmlzSW5zdGFuY2UoZWxlbWVudCkgJiYgZWxlbWVudCAhPSBvYmplY3QpIHsKLQkJCQkJCWl0ZW1MaXN0LmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gYWRkIGFsbCBjYXRlZ29yaWVzIGZyb20gYmFzZSBwbHVnaW5zIHRoYXQgYXJlIG5vdCBleHRlbmRlZAotCQkJLy8KLQkJCUxpc3QgbGlzdCA9IE1pc2MuZ2V0QWxsQmFzZShtb2RlbCk7Ci0JCQkvLyBsaXN0LmFkZCgwLCBtb2RlbCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQlDb250ZW50UGFja2FnZSBwYXJlbnREaXNjaXBsaW5lcyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKAotCQkJCQkJKChNZXRob2RQbHVnaW4pIGxpc3QuZ2V0KGopKSwgcGF0aCk7Ci0JCQkJaWYgKHBhcmVudERpc2NpcGxpbmVzICE9IG51bGwpIHsKLQkJCQkJRUxpc3QgY29udGVudENhdHMgPSAoRUxpc3QpIHBhcmVudERpc2NpcGxpbmVzCi0JCQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRDYXRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGNvbnRlbnRDYXRzLmdldChpKTsKLQotCQkJCQkJaWYgKGNsYXNzVHlwZS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGl0ZW0gPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50OwotCQkJCQkJCWlmIChpdGVtLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCQkJCQkJCS8vIG1ha2Ugc3VyZSB0aGUgaXRlbUxpc3QgZG9lc24ndCBoYXZlIGEKLQkJCQkJCQkJLy8gY2F0ZWdvcnkgdGhhdCBleHRlbmRzIHRoaXMKLQkJCQkJCQkJaW50IGs7Ci0JCQkJCQkJCWZvciAoayA9IDA7IGsgPCBpdGVtTGlzdC5zaXplKCk7IGsrKykgewotCQkJCQkJCQkJaWYgKCgoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVtTGlzdC5nZXQoaykpCi0JCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gaXRlbSkKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoayA9PSBpdGVtTGlzdC5zaXplKCkpCi0JCQkJCQkJCQlpdGVtTGlzdC5hZGQoaXRlbSk7Ci0KLQkJCQkJCQkJLy8gaXRlbUxpc3QuYWRkKGl0ZW0pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUNvbGxlY3Rpb25zLnNvcnQoaXRlbUxpc3QsIG5hbWVDb21wYXJhdG9yKTsKLQotCQlyZXR1cm4gaXRlbUxpc3Q7Ci0JfQotCi0JLy8gLy8vLy8vLy8KLQkvLyBFbmQgb2YgY29kZSBtb3ZlZCBmcm9tIE1ldGhvZEVsZW1lbnRVdGlsCi0JLy8gLy8vLy8vLy8KLQotCS8qKgotCSAqIEdldHMgYWxsIGRpc2NpcGxpbmVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudAotCSAqIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gbGlzdCBvZiBEaXNjaXBsaW5lIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVEaXNjaXBsaW5lcyhNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoZSwgRGlzY2lwbGluZS5jbGFzcywKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxUX0RJU0NJUExJTkVfREVGX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGRvbWFpbnMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gbGlzdCBvZiBEb21haW4gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZURvbWFpbnMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCUxpc3QgZG9tYWlucyA9IGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoZSwgRG9tYWluLmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFRfRE9NQUlOX1BBVEgpOwotCi0JCS8vIGdldCBhbGwgdGhlIGRvbWFpbnMgaW5jbHVkaW5nIHN1YmRvbWFpbnMKLQkJLy8KLQkJTGlzdCBhbGxEb21haW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkb21haW5zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRG9tYWluIGRvbWFpbiA9IChEb21haW4pIGl0ZXIubmV4dCgpOwotCQkJSXRlcmF0b3IgZG9tYWluVHJlZSA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihkb21haW4sIHRydWUpIHsKLQotCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCXJldHVybiAoKERvbWFpbikgb2JqZWN0KS5nZXRTdWJkb21haW5zKCkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQl3aGlsZSAoZG9tYWluVHJlZS5oYXNOZXh0KCkpIHsKLQkJCQlhbGxEb21haW5zLmFkZChkb21haW5UcmVlLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlDb2xsZWN0aW9ucy5zb3J0KGFsbERvbWFpbnMsIG5hbWVDb21wYXJhdG9yKTsKLQotCQlyZXR1cm4gYWxsRG9tYWluczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB3b3JrIHByb2R1Y3QgdHlwZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50Ci0JICogb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBsaXN0IG9mIFdvcmtQcm9kdWN0VHlwZSBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlV29ya1Byb2R1Y3RUeXBlcyhNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoZSwgV29ya1Byb2R1Y3RUeXBlLmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFRfV09SS19QUk9EVUNUX1RZUEVfUEFUSCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgcm9sZSBzZXRzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgUm9sZVNldCBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlUm9sZVNldHMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIFJvbGVTZXQuY2xhc3MsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgY3VzdG9tIGNhdGVnb3JpZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50Ci0JICogb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBsaXN0IG9mIFJvbGVTZXQgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUN1c3RvbUNhdGVnb3JpZXMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCUxpc3QgY2F0ZWdvcmllcyA9IGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoZSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVF9DVVNUT01fQ0FURUdPUllfUEFUSCk7Ci0JCS8vIGZpbHRlciBvdXQgdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3JpZXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2F0ZWdvcmllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgaXRlci5uZXh0KCkpKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2F0ZWdvcmllczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0b29scyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBsaXN0IG9mIFRvb2wgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVRvb2xzKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ2F0ZWdvcmllcyhlLCBUb29sLmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGRpc2NpcGxpbmUgZ3JvdXBpbmdzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4KLQkgKiBNZXRob2RFbGVtZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gbGlzdCBvZiBSb2xlU2V0IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVEaXNjaXBsaW5lR3JvdXBpbmdzKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ2F0ZWdvcmllcyhlLCBEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHJvbGUgc2V0IGdyb3VwaW5ncyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQKLQkgKiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgUm9sZVNldCBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlUm9sZVNldEdyb3VwaW5ncyhNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoZSwgUm9sZVNldEdyb3VwaW5nLmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCX0KLQotCS8qKgotCSAqIGFkZCBhIHRhc2sgdG8gYSBkaXNjaXBsaW5lCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIEBwYXJhbSBkaXNjaXBsaW5lCi0JICogQHBhcmFtIHRhc2sKLQkgKiBAcmV0dXJuIERpc2NpcGxpbmUKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZSBhZGRUb0Rpc2NpcGxpbmUoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLAotCQkJRGlzY2lwbGluZSBkaXNjaXBsaW5lLCBUYXNrIHRhc2spIHsKLQkJcmV0dXJuIChEaXNjaXBsaW5lKSBhZGRUb0NhdGVnb3J5KGFjdGlvbk1nciwgZGlzY2lwbGluZSwgdGFzaywKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2tzKCksCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIGFkZCBhIHdvcmtwcm9kdWN0IHRvIGEgZG9tYWluCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gd3AKLQkgKiBAcmV0dXJuIERvbWFpbgotCSAqLwotCXB1YmxpYyBEb21haW4gYWRkVG9Eb21haW4oSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBEb21haW4gZG9tYWluLAotCQkJV29ya1Byb2R1Y3Qgd3ApIHsKLQkJcmV0dXJuIChEb21haW4pIGFkZFRvQ2F0ZWdvcnkoYWN0aW9uTWdyLCBkb21haW4sIHdwLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgsIHRydWUpOwotCX0KLQotCi0JLyoqCi0JICogYWRkIGEgd29yayBwcm9kdWN0IHRvIGEgV29ya1Byb2R1Y3RUeXBlCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIEBwYXJhbSB3cFR5cGUKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcmV0dXJuIFdvcmtQcm9kdWN0VHlwZQotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGUgYWRkVG9Xb3JrUHJvZHVjdFR5cGUoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLAotCQkJV29ya1Byb2R1Y3RUeXBlIHdwVHlwZSwgV29ya1Byb2R1Y3Qgd3ApIHsKLQkJcmV0dXJuIChXb3JrUHJvZHVjdFR5cGUpIGFkZFRvQ2F0ZWdvcnkoYWN0aW9uTWdyLCB3cFR5cGUsIHdwLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgsIHRydWUpOwotCX0KLQotCi0KLQkvKioKLQkgKiBhZGQgYW4gZWxlbWVudCB0byBhIEN1c3RvbUNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIEBwYXJhbSB1c2VyRGVmaW5lZENhdGVnb3J5Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIEN1c3RvbUNhdGVnb3J5Ci0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5IGFkZFRvQ3VzdG9tQ2F0ZWdvcnkoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLAotCQkJQ3VzdG9tQ2F0ZWdvcnkgdXNlckRlZmluZWRDYXRlZ29yeSwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKEN1c3RvbUNhdGVnb3J5KSBhZGRUb0NhdGVnb3J5KGFjdGlvbk1nciwKLQkJCQkJdXNlckRlZmluZWRDYXRlZ29yeSwgZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCwgdHJ1ZSk7Ci0JCX0KLQotCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJLy8gcmV0dXJuIChDdXN0b21DYXRlZ29yeSkgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsIHVzZXJEZWZpbmVkQ2F0ZWdvcnksCi0JCS8vIGVsZW1lbnQsCi0JCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSwKLQkJLy8gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgsIHRydWUpOwotCQkvLyB9Ci0JCS8vIGVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkvLyByZXR1cm4gKEN1c3RvbUNhdGVnb3J5KSBhZGRUb0NhdGVnb3J5KGFjdGlvbk1nciwgdXNlckRlZmluZWRDYXRlZ29yeSwKLQkJLy8gZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcmllcygpLAotCQkvLyBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCwgdHJ1ZSk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzcyl7Ci0JCS8vIHJldHVybiAoQ3VzdG9tQ2F0ZWdvcnkpIGFkZFRvQ2F0ZWdvcnkoYWN0aW9uTWdyLCB1c2VyRGVmaW5lZENhdGVnb3J5LAotCQkvLyBlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9Qcm9jZXNzRWxlbWVudHMoKSwKLQkJLy8gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgsIHRydWUpOwotCQkvLyB9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBhZGQgYSB0b29sbWVudG9yIHRvIGEgVG9vbAotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKiBAcGFyYW0gdG9vbAotCSAqIEBwYXJhbSB0b29sTWVudG9yCi0JICogQHJldHVybiBUb29sCi0JICovCi0JcHVibGljIFRvb2wgYWRkVG9Ub29sKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgVG9vbCB0b29sLAotCQkJVG9vbE1lbnRvciB0b29sTWVudG9yKSB7Ci0JCXJldHVybiAoVG9vbCkgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsIHRvb2wsIHRvb2xNZW50b3IsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgsIHRydWUpOwotCX0KLQotCi0JLyoqCi0JICogYWRkIGEgcm9sZSB0byBhIFJvbGVTZXQKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICogQHBhcmFtIHJvbGVTZXQKLQkgKiBAcGFyYW0gcm9sZQotCSAqIEByZXR1cm4gUm9sZVNldAotCSAqLwotCXB1YmxpYyBSb2xlU2V0IGFkZFRvUm9sZVNldChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIFJvbGVTZXQgcm9sZVNldCwKLQkJCVJvbGUgcm9sZSkgewotCQlyZXR1cm4gKFJvbGVTZXQpIGFkZFRvQ2F0ZWdvcnkoYWN0aW9uTWdyLCByb2xlU2V0LCByb2xlLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbWV0aG9kIGVsZW1lbnQgdG8gdGhlIGNhdGVnb3J5LiBUaGlzIG1ldGhvZCBtaWdodCBjcmVhdGUgYSBuZXcKLQkgKiBjb250cmlidXRvciB0byB0aGUgZ2l2ZW4gY2F0ZWdvcnkgaW4gdGhlIG1ldGhvZCBlbGVtZW50J3MgcGx1Z2luIGlmIHRoZQotCSAqIGdpdmVuIGNhdGVnb3J5IGJlbG9uZ3MgdG8gdGhlIGJhc2UgcGx1Z2luIG9mIHRoZSBtZXRob2QgZWxlbWVudCdzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBjYXRlZ29yeVBrZ1BhdGgKLQkgKiBAcGFyYW0gY2hlY2tGb3JFeGlzdGluZ0NvbnRyaWJ1dG9yCi0JICogQHJldHVybiB0aGUgYWN0dWFsIGNhdGVnb3J5IHRoYXQgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50IGlzIGFkZGVkIHRvCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yeSBhZGRUb0NhdGVnb3J5KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSwgTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZ1tdIGNhdGVnb3J5UGtnUGF0aCwKLQkJCWJvb2xlYW4gY2hlY2tGb3JFeGlzdGluZ0NvbnRyaWJ1dG9yKSB7Ci0JCUFkZFRvQ2F0ZWdvcnlDb21tYW5kIGNtZCA9IG5ldyBBZGRUb0NhdGVnb3J5Q29tbWFuZChjYXRlZ29yeSwgZWxlbWVudCwKLQkJCQlmZWF0dXJlLCBjYXRlZ29yeVBrZ1BhdGgsIGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvcik7Ci0JCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCXJldHVybiAoQ29udGVudENhdGVnb3J5KSAoKExpc3QpIGNtZC5nZXRBZmZlY3RlZE9iamVjdHMoKSkuZ2V0KDApOwotCX0KLQotLy8JcHVibGljIHZvaWQgc2V0UmVzcG9uc2libGVSb2xlKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgV29ya1Byb2R1Y3Qgd3AsCi0vLwkJCVJvbGUgcm9sZSkgewotLy8JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQgPSBuZXcgU2V0T3Bwb3NpdGVGZWF0dXJlQ29tbWFuZCh3cCwKLS8vCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZSwgcm9sZSk7Ci0vLwkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLS8vCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIG1ldGhvZCBlbGVtZW50IGZyb20gdGhlIGNhdGVnb3J5LiBUaGlzIG1ldGhvZCBtaWdodCBkZWxldGUKLQkgKiB0aGUgY2F0ZWdvcnkgaWYgaXQgaXMgYSBjb250cmlidXRvciBhbmQgYmVjYW1lIGVtcHR5IGFmdGVyIHRoZSByZW1vdmFsIG9mCi0JICogdGhlIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIGZlYXR1cmUgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29udGVudFBrZ1BhdGgKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1ldGhvZCBlbGVtZW50IGlzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLCBmYWxzZQotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21DYXRlZ29yeShJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnksIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmdbXSBjb250ZW50UGtnUGF0aCkgewotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kID0gbmV3IFJlbW92ZUZyb21DYXRlZ29yeUNvbW1hbmQoY2F0ZWdvcnksCi0JCQkJZWxlbWVudCwgZmVhdHVyZSwgY29udGVudFBrZ1BhdGgpOwotCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQlyZXR1cm4gIWNtZC5nZXRSZXN1bHQoKS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgY2F0ZWdvcnkuIFRoaXMgbWV0aG9kIG1pZ2h0IGRlbGV0ZQotCSAqIHRoZSBjYXRlZ29yeSBpZiBpdCBpcyBhIGNvbnRyaWJ1dG9yIGFuZCBiZWNhbWUgZW1wdHkgYWZ0ZXIgdGhlIHJlbW92YWwgb2YKLQkgKiB0aGUgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgZmVhdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50RmVhdHVyZXMKLQkgKiAgICAgICAgICAgIGZlYXR1cmVzIHRvIGNoZWNrIGZvciBlbXB0aW5lc3MgYmVmb3JlIGRlbGV0aW5nIHRoZSBjYXRlZ29yeQotCSAqIEBwYXJhbSBjb250ZW50UGtnUGF0aAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgaXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQsIGZhbHNlCi0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JLy8gcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbUNhdGVnb3J5KENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSwgTWV0aG9kRWxlbWVudAotCS8vIGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmVbXQotCS8vIGVsZW1lbnRGZWF0dXJlcywgU3RyaW5nW10gY29udGVudFBrZ1BhdGgpIHsKLQkvLyBib29sZWFuIHJldDsKLQkvLyBib29sZWFuIGVtcHR5ID0gZmFsc2U7Ci0JLy8gTWV0aG9kUGx1Z2luIGNhdGVnb3J5UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkpOwotCS8vIE1ldGhvZFBsdWdpbiBlbGVtZW50UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JLy8gQ29udGVudENhdGVnb3J5IHVzZWRDYXRlZ29yeTsKLQkvLyBpZihjYXRlZ29yeVBsdWdpbiAhPSBlbGVtZW50UGx1Z2luKSB7Ci0JLy8gdXNlZENhdGVnb3J5ID0KLQkvLyBUbmdVdGlsLmZpbmRDb250cmlidXRvcihVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShlbGVtZW50UGx1Z2luLAotCS8vIGNvbnRlbnRQa2dQYXRoKSwgY2F0ZWdvcnkpOwotCS8vIGlmKHVzZWRDYXRlZ29yeSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vIGVsc2UgewotCS8vIHVzZWRDYXRlZ29yeSA9IGNhdGVnb3J5OwotCS8vIH0KLQkvLyBpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JLy8gQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHVzZWRDYXRlZ29yeS5lR2V0KGZlYXR1cmUpOwotCS8vIHJldCA9IGNvbGxlY3Rpb24ucmVtb3ZlKGVsZW1lbnQpOwotCS8vIGVtcHR5ID0gdHJ1ZTsKLQkvLyAvL1RPRE86IG5lZWQgcmV2aXNpdCB0byBmaW5kIGJldHRlciB3YXkgdG8gcmVtb3ZlIHRoZSBlbXB0eSBjb250cmlidXRvcnMKLQkvLyB3aXRob3V0IGFkZGluZyB0byBtdWNoIHdvcmsgb24gaW4gdGhlIFVJIGNvZGUKLQkvLyAvLwotCS8vIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JLy8gLy8gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBjYXRlZ29yeS5lR2V0KGVsZW1lbnRGZWF0dXJlc1tpXSk7Ci0JLy8gLy8gaWYoIWNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JLy8gLy8gZW1wdHkgPSBmYWxzZTsKLQkvLyAvLyBicmVhazsKLQkvLyAvLyB9Ci0JLy8gLy8gfQotCS8vIH0KLQkvLyBlbHNlIHsKLQkvLyB1c2VkQ2F0ZWdvcnkuZVNldChmZWF0dXJlLCBudWxsKTsKLQkvLyByZXQgPSB0cnVlOwotCS8vIH0KLQkvLyAvLyBpZihjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCAmJiBlbXB0eSkgewotCS8vIC8vIEVjb3JlVXRpbC5yZW1vdmUoY2F0ZWdvcnkpOwotCS8vIC8vIH0KLQkvLyByZXR1cm4gcmV0OwotCS8vIH0KLQkvLyBwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tRGlzY2lwbGluZShEaXNjaXBsaW5lIGRpc2NpcGxpbmUsIFRhc2sgdGFzaykgewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpOwotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkoZGlzY2lwbGluZSwgdGFzaywgZmVhdHVyZSwgbmV3Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlW10geyBmZWF0dXJlIH0sCi0JLy8gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCS8vIH0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tRGlzY2lwbGluZShJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUsIFRhc2sgdGFzaykgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKTsKLQkJcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeShhY3Rpb25NZ3IsIGRpc2NpcGxpbmUsIHRhc2ssIGZlYXR1cmUsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCX0KLQotCS8vIHB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21Eb21haW4oRG9tYWluIGRvbWFpbiwgV29ya1Byb2R1Y3Qgd3ApIHsKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9Ci0JLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpOwotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkoZG9tYWluLCB3cCwgZmVhdHVyZSwgbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHsKLQkvLyBmZWF0dXJlIH0sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCk7Ci0JLy8gfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbURvbWFpbihJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIERvbWFpbiBkb21haW4sCi0JCQlXb3JrUHJvZHVjdCB3cCkgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKTsKLQkJcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeShhY3Rpb25NZ3IsIGRvbWFpbiwgd3AsIGZlYXR1cmUsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoKTsKLQl9Ci0KLQkvLyBwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tV29ya1Byb2R1Y3RUeXBlKFdvcmtQcm9kdWN0VHlwZSB3cFR5cGUsCi0JLy8gV29ya1Byb2R1Y3Qgd3ApIHsKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9Ci0JLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpOwotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkod3BUeXBlLCB3cCwgZmVhdHVyZSwgbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHsKLQkvLyBmZWF0dXJlIH0sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCk7Ci0JLy8gfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbVdvcmtQcm9kdWN0VHlwZShJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlXb3JrUHJvZHVjdFR5cGUgd3BUeXBlLCBXb3JrUHJvZHVjdCB3cCkgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKTsKLQkJcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeShhY3Rpb25NZ3IsIHdwVHlwZSwgd3AsIGZlYXR1cmUsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQl9Ci0KLQkvLyBwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tUm9sZVNldChSb2xlU2V0IHJvbGVTZXQsIFJvbGUgcm9sZSkgewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpOwotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkocm9sZVNldCwgcm9sZSwgZmVhdHVyZSwgbmV3Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlW10geyBmZWF0dXJlIH0sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCS8vIH0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21Sb2xlU2V0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgUm9sZVNldCByb2xlU2V0LAotCQkJUm9sZSByb2xlKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpOwotCQlyZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KGFjdGlvbk1nciwgcm9sZVNldCwgcm9sZSwgZmVhdHVyZSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQl9Ci0KLQkvLyBwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tVG9vbChUb29sIHRvb2wsIFRvb2xNZW50b3IgdG9vbE1lbnRvcikgewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpOwotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkodG9vbCwgdG9vbE1lbnRvciwgZmVhdHVyZSwgbmV3Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlW10geyBmZWF0dXJlIH0sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpOwotCS8vIH0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21Ub29sKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgVG9vbCB0b29sLAotCQkJVG9vbE1lbnRvciB0b29sTWVudG9yKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpOwotCQlyZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KGFjdGlvbk1nciwgdG9vbCwgdG9vbE1lbnRvciwgZmVhdHVyZSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKTsKLQl9Ci0KLQkvLyBwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkKLQkvLyB1c2VyRGVmaW5lZENhdGVnb3J5LCBNZXRob2RFbGVtZW50IGUpIHsKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgY29udGVudEVsZW1lbnRGZWF0dXJlID0KLQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGNvbnRlbnRDYXRlZ29yeUZlYXR1cmUgPQotCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3JpZXMoKTsKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmVbXSBmZWF0dXJlcyA9IHsgY29udGVudEVsZW1lbnRGZWF0dXJlLAotCS8vIGNvbnRlbnRDYXRlZ29yeUZlYXR1cmUgfTsKLQkvLyBpZihlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkvLyByZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KHVzZXJEZWZpbmVkQ2F0ZWdvcnksIGUsIGNvbnRlbnRFbGVtZW50RmVhdHVyZSwKLQkvLyBmZWF0dXJlcywgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCS8vIH0KLQkvLyBlbHNlIGlmKGUgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkvLyByZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KHVzZXJEZWZpbmVkQ2F0ZWdvcnksIGUsIGNvbnRlbnRDYXRlZ29yeUZlYXR1cmUsCi0JLy8gZmVhdHVyZXMsIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21DdXN0b21DYXRlZ29yeShJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlDdXN0b21DYXRlZ29yeSB1c2VyRGVmaW5lZENhdGVnb3J5LCBNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKTsKLQkJCXJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkoYWN0aW9uTWdyLCB1c2VyRGVmaW5lZENhdGVnb3J5LCBlLAotCQkJCQlmZWF0dXJlLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENhbGwgdGhpcyBtZXRob2QgYmVmb3JlIHRoZSBlZGl0b3IgY2xvc2VzLCBwYXNzaW5nIGluIGFsbCB0aGUgY2F0ZWdvcmllcwotCSAqIHRoYXQgeW91IGhhdmUgcmV0cmlldmVkIHdpdGggZ2V0QXZhaWxhYmxlWFhYKCkgZm9yIHRoZSBlZGl0b3IKLQkgKiAKLQkgKiBAcGFyYW0gY29uc3VtZXIKLQkgKiBAcGFyYW0gY2F0ZWdvcmllcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VDYXRlZ29yaWVzKE1ldGhvZEVsZW1lbnQgY29uc3VtZXIsIENvbGxlY3Rpb24gY2F0ZWdvcmllcykgewotCQlNZXRob2RQbHVnaW4gY29uc3VtZXJQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjb25zdW1lcik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCU1ldGhvZFBsdWdpbiBjYXRlZ29yeVBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNhdGVnb3J5KTsKLQkJCWlmIChjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkJCQkmJiBjYXRlZ29yeVBsdWdpbiA9PSBjb25zdW1lclBsdWdpbgotCQkJCQkmJiBUbmdVdGlsLmlzRW1wdHkoY2F0ZWdvcnkpKSB7Ci0JCQkJRWNvcmVVdGlsLnJlbW92ZShjYXRlZ29yeSk7Ci0JCQkJaWYgKGNhdGVnb3J5IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkoY2F0ZWdvcnlQbHVnaW4pCi0JCQkJCQkJLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5yZW1vdmUoY2F0ZWdvcnkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nW10gcGF0aCA9IGdldENhdGVnb3J5UGFja2FnZVBhdGgoY2F0ZWdvcnkpOwotCQkJCS8vIHBhdGggY2FuIGJlIG51bGwgaWYgdGhlIGNhdGVnb3J5IGlzIGRlbGV0ZWQKLQkJCQkvLwotCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJQ29udGVudFBhY2thZ2UgY2F0ZWdvcnlQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgKLQkJCQkJCQljb25zdW1lclBsdWdpbiwgcGF0aCk7Ci0JCQkJCUNvbnRlbnRDYXRlZ29yeSBjb250cmlidXRvciA9IFRuZ1V0aWwuZmluZENvbnRyaWJ1dG9yKAotCQkJCQkJCWNhdGVnb3J5UGtnLCBjYXRlZ29yeSk7Ci0JCQkJCWlmIChjb250cmlidXRvciAhPSBudWxsICYmIFRuZ1V0aWwuaXNFbXB0eShjb250cmlidXRvcikpIHsKLQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoY29udHJpYnV0b3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlVGFza3MoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoVGFzay5jbGFzcywgY2F0ZWdvcnksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVXb3JrUHJvZHVjdHMoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCS8vIC8vIHNwZWNpYWwgaGFuZGxpbmcgdG8gZGlzYWxsb3cgYXNzaWdtZW50IG9mIHdvcmsgcHJvZHVjdHMgdG8gZG9tYWluCi0JCS8vIHdpdGggc3ViZG9tYWlucwotCQkvLyAvLwotCQkvLyBpZihjYXRlZ29yeSBpbnN0YW5jZW9mIERvbWFpbiAmJgotCQkvLyAhKChEb21haW4pY2F0ZWdvcnkpLmdldFN1YmRvbWFpbnMoKS5pc0VtcHR5KCkpIHsKLQkJLy8gcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCS8vIH0KLQotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ29udGVudEVsZW1lbnRzKFdvcmtQcm9kdWN0LmNsYXNzLCBjYXRlZ29yeSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVJvbGVzKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ29udGVudEVsZW1lbnRzKFJvbGUuY2xhc3MsIGNhdGVnb3J5LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIGdpdmVuIGNvbnRlbnQgZWxlbWVudAotCSAqIHRvIHJlZmVyZW5jZSB0bwotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50VHlwZQotCSAqICAgICAgICAgICAgY29uY3JlY3QgY2xhc3Mgb2YgdGhlIHRoZSBnaXZlbiBjb250ZW50IGVsZW1lbnQuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gbG9jYWxPbmx5Ci0JICogICAgICAgICAgICBpZiB0cnVlLCBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gZWxlbWVudCdzIHBsdWdpbiBhcmUKLQkgKiAgICAgICAgICAgIGluY2x1ZGVkIGluIHRoZSByZXN1bHQuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbnRlbnRFbGVtZW50cyhDbGFzcyBtZXRob2RFbGVtZW50VHlwZSwKLQkJCUNvbnRlbnRFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gbG9jYWxPbmx5KSB7Ci0JCUxpc3QgZWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbW9kZWxMaXN0OwotCQlpZiAobG9jYWxPbmx5KSB7Ci0JCQltb2RlbExpc3QgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KFVtYVV0aWwKLQkJCQkJLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KSk7Ci0JCX0gZWxzZSB7Ci0JCQltb2RlbExpc3QgPSBNZXRob2RFbGVtZW50VXRpbC5nZXRBbGxNb2RlbHMoZWxlbWVudCk7Ci0JCX0KLQkJaW50IHNpemUgPSBtb2RlbExpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIG1vZGVsID0gKE1ldGhvZFBsdWdpbikgbW9kZWxMaXN0LmdldChpKTsKLQkJCUNvbnRlbnRQYWNrYWdlIGNvcmVDb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UobW9kZWwsCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJCWlmIChjb3JlQ29udGVudFBrZyA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJVHJlZUl0ZXJhdG9yIGl0ZXJhdG9yID0gY29yZUNvbnRlbnRQa2cuZUFsbENvbnRlbnRzKCk7Ci0KLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChtZXRob2RFbGVtZW50VHlwZS5pc0luc3RhbmNlKG9iaikgJiYgb2JqICE9IGVsZW1lbnQpIHsKLQkJCQkJZWxlbWVudExpc3QuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChlbGVtZW50TGlzdCwgbmFtZUNvbXBhcmF0b3IpOwotCi0JCXJldHVybiBlbGVtZW50TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcm9sZQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVRhc2tzKFJvbGUgcm9sZSkgewotCQkvLyBXaGlsZSBlZGl0aW5nIGEgcm9sZSwgeW91IG9ubHkgY2FuIGFzc2lnbiB0aGlzIHJvbGUgdG8gYSB0YXNrIGluIHRoZQotCQkvLyBzYW1lIHBsdWdpbi4KLQkJLy8gT3RoZXdpc2UgeW91IHdpbGwgbW9kaWZ5IHRoZSBiYXNlIHBsdWdpbi4KLQkJLy8KLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNvbnRlbnRFbGVtZW50cyhUYXNrLmNsYXNzLCByb2xlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVUYXNrcyhXb3JrUHJvZHVjdCB3cCkgewotCQkvLyBXaGlsZSBlZGl0aW5nIGEgd29yayBwcm9kdWN0LCB5b3Ugb25seSBjYW4gYXNzaWduIHRoaXMgd29yayBwcm9kdWN0Ci0JCS8vIHRvIGEgdGFzayBpbiB0aGUgc2FtZSBwbHVnaW4uCi0JCS8vIE90aGV3aXNlIHlvdSB3aWxsIG1vZGlmeSB0aGUgYmFzZSBwbHVnaW4uCi0JCS8vCi0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoVGFzay5jbGFzcywgd3AsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVJvbGVzKFdvcmtQcm9kdWN0IHdwKSB7Ci0JCS8vIFdoaWxlIGVkaXRpbmcgYSB3b3JrIHByb2R1Y3QsIHlvdSBvbmx5IGNhbiBhc3NpZ24gdGhpcyB3b3JrIHByb2R1Y3QKLQkJLy8gdG8gYSByb2xlIGluIHRoZSBzYW1lIHBsdWdpbi4KLQkJLy8gT3RoZXdpc2UgeW91IHdpbGwgbW9kaWZ5IHRoZSBiYXNlIHBsdWdpbi4KLQkJLy8KLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNvbnRlbnRFbGVtZW50cyhSb2xlLmNsYXNzLCB3cCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJvbGUKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVXb3JrUHJvZHVjdHMoUm9sZSByb2xlKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoV29ya1Byb2R1Y3QuY2xhc3MsIHJvbGUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFzawotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVdvcmtQcm9kdWN0cyhUYXNrIHRhc2spIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNvbnRlbnRFbGVtZW50cyhXb3JrUHJvZHVjdC5jbGFzcywgdGFzaywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0YXNrCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlUm9sZXMoVGFzayB0YXNrKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoUm9sZS5jbGFzcywgdGFzaywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0YXNrCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U3RlcExpc3QoVGFzayB0YXNrKSB7Ci0JCWlmICh0YXNrLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwKLQkJCQl8fCB0YXNrLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IFRuZ1V0aWwuZ2V0QmFzZSh0YXNrKTsKLQkJCWZpbmFsIExpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAodHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQkJc3luY2hyb25pemVkICh0eXBlcykgewotCQkJCQlpZiAodHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQl0eXBlcy5hZGQoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwpOwotCQkJCQkJdHlwZXMuYWRkKFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJSXRlcmF0b3IgZXh0ZW5kZWQgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYmFzZSkgewotCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCUxpc3QgbGlzdCA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldEltbWVkaWF0ZVZhcmlldGllcygoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QpOwotCQkJCQlpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QuaXNFbXB0eSgpKQotCQkJCQkJQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkJCQlMaXN0IG91dHB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGxpc3QuZ2V0KGkpOwotCQkJCQkJaWYgKHR5cGVzLmNvbnRhaW5zKGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpKSB7Ci0JCQkJCQkJb3V0cHV0TGlzdC5hZGQoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG91dHB1dExpc3QuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQl9OwotCQkJZm9yICg7IGV4dGVuZGVkLmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHQgPSAoVGFzaykgZXh0ZW5kZWQubmV4dCgpOwotCQkJCXQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gYmFzZQotCSAqIEBwYXJhbSB2YXJpYWJpbGl0eVR5cGVzCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5kZWQoVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UsIENvbGxlY3Rpb24gdmFyaWFiaWxpdHlUeXBlcykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldEV4dGVuZGVkKGxpc3QsIGJhc2UsIHZhcmlhYmlsaXR5VHlwZXMpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldEV4dGVuZGVkKExpc3Qgb3V0cHV0TGlzdCwgVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UsCi0JCQlDb2xsZWN0aW9uIHZhcmlhYmlsaXR5VHlwZXMpIHsKLQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGJhc2UpOwotCQlpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBsaXN0LmdldChpKTsKLQkJCWlmICh2YXJpYWJpbGl0eVR5cGVzLmNvbnRhaW5zKGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpKSB7Ci0JCQkJb3V0cHV0TGlzdC5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAodmFyaWFiaWxpdHlUeXBlcy5jb250YWlucyhlLmdldFZhcmlhYmlsaXR5VHlwZSgpKSkgewotCQkJCWdldEV4dGVuZGVkKG91dHB1dExpc3QsIGJhc2UsIHZhcmlhYmlsaXR5VHlwZXMpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRDYXRlZ29yeVBhY2thZ2VQYXRoKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlFT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCWZvciAocGFyZW50ID0gY2F0ZWdvcnkuZUNvbnRhaW5lcigpOyBwYXJlbnQgIT0gbnVsbAotCQkJCSYmICEocGFyZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpOyBwYXJlbnQgPSBwYXJlbnQKLQkJCQkuZUNvbnRhaW5lcigpKQotCQkJOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udGVudFBhY2thZ2UgY2F0ZWdvcnlQa2cgPSAoQ29udGVudFBhY2thZ2UpIHBhcmVudDsKLQkJcmV0dXJuIE1pc2MuZ2V0UGF0aFJlbGF0aXZlVG9QbHVnaW4oY2F0ZWdvcnlQa2cpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzZhZTE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTGlicmFyeVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5UcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVNhdmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlVdGlsIHsKLQotCS8qKgotCSAqIENoZWNrIGlzIGdpdmVuIHBsdWdpbiBuYW1lIGlzIHZhbGlkIG5hbWUgaW4gdGhlIGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tQbHVnaW5OYW1lKE1ldGhvZFBsdWdpbiBwbHVnaW4sIFN0cmluZyBuZXdOYW1lKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlyZXR1cm4gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlVmFsaWRhdG9yKGxpYiwKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUywKLQkJCQkoSUZpbHRlcikgbnVsbCwgbnVsbCwgVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FKQotCQkJCS5pc1ZhbGlkKG5ld05hbWUpOwkJCi0JfQotCi0JLyoqCi0JICogbWV0aG9kIHRvIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGEgcGx1Z2luIG9yIHBhY2thZ2Ugc28gdGhhdCBpcyBjYW4gYmUgc2VsZWN0ZWQgaW4gY29uZmlndXJhdGlvbiBlZGl0b3IuIAotCSAqIE1heSBuZWVkIGEgYmV0dGVyIG5hbWUgZm9yIHRoaXMuCi0JICogQHBhcmFtIGVsZW1lbnQgRU9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZWxlY3RhYmxlKEVPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQgdGhhdCBpcyBzZWxlY3RhYmxlLgotCSAqIEBwYXJhbSBlbGVtZW50IEVPYmplY3QKLQkgKiBAcmV0dXJuIEVPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgZ2V0U2VsZWN0YWJsZShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQuZUNvbnRhaW5lcigpOwotCQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlyZXR1cm4gcGtnOwotCQkJfSBlbHNlIGlmIChwa2cgIT0gbnVsbCkgewotCQkJCXJldHVybiBwa2cuZUNvbnRhaW5lcigpOwotCQkJfQotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCUVPYmplY3QgcGFyZW50ID0gZWxlbWVudDsKLQkJCXdoaWxlICgocGFyZW50ICE9IG51bGwpICYmICFzZWxlY3RhYmxlKHBhcmVudCkpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQuZUNvbnRhaW5lcigpOwotCQkJfQotCi0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBtZXRob2QgcGx1Z2luIGZvciB0aGUgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IEVPYmplY3QKLQkgKiBAcmV0dXJuIE1ldGhvZFBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbihFT2JqZWN0IGVsZW1lbnQpIHsKLQkJLy8gRU9iamVjdCBwYXJlbnQgPSBlbGVtZW50OwotCQkvLyB3aGlsZSAoKHBhcmVudCAhPSBudWxsKSAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJLy8gcGFyZW50ID0gcGFyZW50LmVDb250YWluZXIoKTsKLQkJLy8gfQotCQkvLwotCQkvLyByZXR1cm4gKE1ldGhvZFBsdWdpbikgcGFyZW50OwotCi0JCXJldHVybiBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYSBwcmludGFibGUgbmFtZSBzdHJpbmcgZm9yIHRoZSBlbGVtZW50LiBOb3RlLCB0aGlzIGlzIG5vdCB0aGUgZWxlbWVudCBuYW1lIGF0dHJpYnV0ZQotCSAqIEBwYXJhbSBlbGVtZW50IE9iamVjdAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMudW5rbm93bl90ZXh0OyAKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRGdWxsTmFtZSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdldCBhIHByaW50YWJsZSBuYW1lIGZvciB0aGUgZWxlbWVudC4KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGdWxsTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKHNlbGVjdGFibGUoZWxlbWVudCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlidWZmZXIuYXBwZW5kKCJbIikuYXBwZW5kKGVsZW1lbnQuZ2V0TmFtZSgpKS5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlNZXRob2RFbGVtZW50IHBhcmVudCA9IGVsZW1lbnQ7Ci0JCQl3aGlsZSAoKHBhcmVudCA9IChNZXRob2RFbGVtZW50KSBwYXJlbnQuZUNvbnRhaW5lcigpKSAhPSBudWxsKSB7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJ1ZmZlci5pbnNlcnQoMCwgIlsiICsgcGFyZW50LmdldE5hbWUoKSArICJdLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlbGVtZW50LmdldE5hbWUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCdzIHR5cGU6bmFtZSBhcyBhIGxvY2FsaXplZCBzdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2NhbGl6ZVR5cGVOYW1lKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCVN0cmluZyBuYW1lU3RyID0gVG5nVXRpbC5nZXRUeXBlVGV4dChlbGVtZW50KSArIExpYnJhcnlSZXNvdXJjZXMuY29sb25fd2l0aF9zcGFjZSA7Ci0JCQkKLQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpICE9IG51bGwpIHsKLQkJCQluYW1lU3RyICs9ICIoIiArICgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KS5nZXRQcmVzZW50YXRpb25OYW1lKCkKLQkJCQkJCSsgIikgIiArICgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQl9IGVsc2UgewotCQkJCW5hbWVTdHIgKz0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmFtZVN0ciA7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0VHlwZU5hbWUoZWxlbWVudCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50J3MgdHlwZTpuYW1lCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50ID09IG51bGwgPyAiIiA6IGVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGVsZW1lbnQuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBtZXRob2QgcGx1Z2lucyBpbiB0aGUgbGlicmFyeQotCSAqIEBwYXJhbSBsaWJyYXJ5IE1ldGhvZExpYnJhcnkKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIE1ldGhvZFBsdWdpbiBvYmplY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE1ldGhvZFBsdWdpbnMoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVsZW1lbnRzID0gbGlicmFyeS5lQ29udGVudHMoKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlpdGVtcy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCS8qKgotCSAqIGdldCBhIGxpc3Qgb2YgZ3VpZCBzdHJpbmdzIG9mIHRoZSBtZXRob2QgcGx1Z2lucyBpbiB0aGUgbGlicmFyeQotCSAqIEBwYXJhbSBsaWJyYXJ5IE1ldGhvZExpYnJhcnkKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TWV0aG9kUGx1Z2luR3VpZHMoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZWxlbWVudHMgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQkJaXRlbXMuYWRkKGVsZW1lbnQuZ2V0R3VpZCgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIE1ldGhvZFBsdWdpbiBpbiB0aGUgbGlicmFyeSB3aXRoIHRoZSBnaXZlbiBwbHVnaW4gZ3VpZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeSBNZXRob2RMaWJyYXJ5Ci0JICogQHBhcmFtIHBsdWdpbkd1aWQgU3RyaW5nCi0JICogQHJldHVybiBNZXRob2RQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBsdWdpbiBnZXRNZXRob2RQbHVnaW4oTWV0aG9kTGlicmFyeSBsaWJyYXJ5LAotCQkJU3RyaW5nIHBsdWdpbkd1aWQpIHsKLQkJaWYgKHBsdWdpbkd1aWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlMaXN0IGVsZW1lbnRzID0gbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZFBsdWdpbiBlbGVtZW50ID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJCWlmIChwbHVnaW5HdWlkLmVxdWFscyhlbGVtZW50LmdldEd1aWQoKSkpIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGFsbCB0aGUgY29udGFpbmVkIE1ldGhvZFBhY2thZ2VzIGZvciB0aGUgZWxlbWVudCwgcmV0dXJuIGVtcHR5IGxpc3QgaWYgbm90aGluZyBmb3VuZC4KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE1ldGhvZFBhY2thZ2VzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCWl0ZW1zLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKioKLQkgKiB1cHdyYXAgdGhlIG9iamVjdAotCSAqIEBwYXJhbSBvYmogT2JqZWN0Ci0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCB1bndyYXAoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gVG5nVXRpbC51bndyYXAob2JqKTsKLQl9Ci0KLQkvKioKLQkgKiB1bndyYXAgdGhlIGNvbW1hbmQKLQkgKiBAcGFyYW0gY21kIENvbW1hbmQKLQkgKiBAcmV0dXJuIENvbW1hbmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1hbmQgdW53cmFwKENvbW1hbmQgY21kKSB7Ci0JCXJldHVybiBUbmdVdGlsLnVud3JhcChjbWQpOwotCX0KLQotCS8qKgotCSAqIGNsZWFyIHRoZSByZXNvdXJjZSB0aGUgZWxlbWVudHMgYXNzb2NpYXRlZCB0by4gU28gdGhhdCB0aGUgZWxlbWVudCBjYW4gYmUKLQkgKiBhZGRlZCB0byBhbm90aGVyIGxpYnJhcnkgYW5kIGdvdCBuZXcgcmVzb3VyY2UgYXNzaWduZWQuCi0JICogCi0JICogQHBhcmFtIGltcG9ydExpYnJhdHkKLQkgKiAgICAgICAgICAgIE1ldGhvZExpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGV0YWNoRnJvbVJlc291cmNlKE1ldGhvZExpYnJhcnkgaW1wb3J0TGlicmF0eSkgewotCQlSZXNvdXJjZVNldCByZXNTZXQgPSBudWxsOwotCQlSZXNvdXJjZSByZXMgPSBpbXBvcnRMaWJyYXR5LmVSZXNvdXJjZSgpOwotCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCXJlc1NldCA9IHJlcy5nZXRSZXNvdXJjZVNldCgpOwotCQl9Ci0KLQkJaWYgKHJlc1NldCAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVJdGVyYXRvciBpdCA9IHJlc1NldC5nZXRBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTXVsdGlSZXNvdXJjZUVPYmplY3QpIHsKLQkJCQkJKChNdWx0aVJlc291cmNlRU9iamVjdCkgb2JqKS5lU2V0UmVzb3VyY2UobnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY2xlYXIgYWxsIHRoZSB1bnJlc29sdmVkIHByb3hpZXMKLQkJY2xlYXJQcm94aWVzKGltcG9ydExpYnJhdHkpOwotCX0KLQotCS8qKgotCSAqIGNsZWFyIHByb3h5IGZvciB0aGUgZWxlbWVudC4gVGhpcyBpcyB1c2VkIHRvIGZpeCB0aGUgZWxlbWVudCB3aGVuIHRoZSBwcm94eSBjYW4ndCBiZSByZXNvbHZlZC4KLQkgKiBAcGFyYW0gZWxlbWVudCBFT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyUHJveGllcyhFT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQuZUlzUHJveHkoKSkgewotCQkJLy8gcmVzZXQgdGhlIHByb3h5IHRvIG51bGwKLQkJCXNldFByb3h5VVJJKGVsZW1lbnQsIG51bGwpOwotCQl9IGVsc2UgewotCQkJLy8gaXRlcmF0ZSB0aGUgY2hpbGRyZW4KLQkJCWZvciAoVHJlZUl0ZXJhdG9yIGl0ID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG8uZUlzUHJveHkoKSkgewotCQkJCQlzZXRQcm94eVVSSShvLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIG9iamVjdCdzIHByb3h5IHVyaQotCSAqIEBwYXJhbSBvYmogRU9iamVjdAotCSAqIEBwYXJhbSB1cmkgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm94eVVSSShFT2JqZWN0IG9iaiwKLQkJCW9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkgdXJpKSB7Ci0JCSgob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCkgb2JqKS5lU2V0UHJveHlVUkkodXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBsb2FkIGFsbCBlbGVtZW50cyBpbiB0aGUgbGlicmFyeQotCSAqIEBwYXJhbSBsaWIgTWV0aG9kTGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQWxsKE1ldGhvZExpYnJhcnkgbGliKSB7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXRyeSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBsb2FkIGFsbCBwcm9jZXNzZXMgaW4gdGhlIGxpYnJhcnkKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9hZEFsbFByb2Nlc3NlcyhNZXRob2RMaWJyYXJ5IGxpYikgewotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQl0cnkgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCQlUbmdVdGlsLmdldEFsbFByb2Nlc3NlcyhwbHVnaW4pOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQl9Ci0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBzYXZlIGFsbCBlbGVtZW50cyBpbiB0aGUgbGlicmFyeSBub3QgbWF0dGVyIHRoZSBlbGVtZW50IGlzIGNoYW5nZWQgb3Igbm90LiAKLQkgKiBEb24ndCByZWZyZXNoIHRoZSB3b3Jrc3BhY2UuCi0JICogQHBhcmFtIGxpYiBNZXRob2RMaWJyYXJ5Ci0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUFsbChNZXRob2RMaWJyYXJ5IGxpYikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNhdmVMaWJyYXJ5KGxpYiwgdHJ1ZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIHNhdmUgdGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSBiYXNlZCBvbiB0aGUgbGlicmFyeSByZXNvdXJjZXNldC4gWW91Ci0JICogbmVlZCB0byBzZXQgdGhlIHJlc291cmNlIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCB0byBzYXZlIHRoZQotCSAqIGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gbGliCi0JICogICAgICAgICAgICBNZXRob2RMaWJyYXJ5Ci0JICogQHBhcmFtIHNhdmVBbGwKLQkgKiAgICAgICAgICAgIGJvb2xlYW4gaWYgdHJ1ZSwgZm9yY2Ugc2F2aW5nIGFsbCB0aGUgcmVzb3VyY2VzIGV2ZW4gaWYgdGhleQotCSAqICAgICAgICAgICAgYXJlIG5vdCBtb2RpZmllZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUxpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWIsIGJvb2xlYW4gc2F2ZUFsbCwKLQkJCWJvb2xlYW4gcmVmcmVzaCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlMaWJyYXJ5UmVzb3VyY2VTZXQgbGliUmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgbGliLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmKGxpYlJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBsaWJSZXNvdXJjZVNldDsKLQotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlNYXAgc2F2ZU9wdGlvbnMgPSBtYW5hZ2VyICE9IG51bGwgPyBtYW5hZ2VyLmdldFNhdmVPcHRpb25zKCkKLQkJCQkJOiBuZXcgSGFzaE1hcCgpOwotCi0JCQkvLyBiYWNrIHVwIGN1cnJlbnQgUkVGUkVTSF9ORVdfUkVTT1VSQ0Ugb3B0aW9uCi0JCQlPYmplY3Qgb2xkID0gc2F2ZU9wdGlvbnMuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlJFRlJFU0hfTkVXX1JFU09VUkNFKTsKLQkJCU9iamVjdCBvbGRDaGVja01vZGlmeSA9IHNhdmVPcHRpb25zCi0JCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkNIRUNLX01PRElGWSk7Ci0JCQl0cnkgewotCQkJCS8vIGRpc2FibGUgd29ya3NwYWNlIHJlZnJlc2ggd2hlbiBuZXcgZmlsZSBpcyBjcmVhdGVkCi0JCQkJc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlJFRlJFU0hfTkVXX1JFU09VUkNFLAotCQkJCQkJcmVmcmVzaCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkJCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5DSEVDS19NT0RJRlksICJmYWxzZSIpOwotCi0JCQkJLy8gc2F2ZSByZXNvdXJjZSBzZXQgaGVyZQotCQkJCXJlc291cmNlU2V0LnNhdmUoc2F2ZU9wdGlvbnMsIHNhdmVBbGwpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQkvLyByZXN0b3JlIFJFRlJFU0hfTkVXX1JFU09VUkNFIG9wdGlvbgotCQkJCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5SRUZSRVNIX05FV19SRVNPVVJDRSwgb2xkKTsKLQkJCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuQ0hFQ0tfTU9ESUZZLCBvbGRDaGVja01vZGlmeSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsaWJSZXNvdXJjZVNldC5zYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBsb2FkIHRoZSBsaWJyYXJ5IGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gcmV0dXJuIHRoZSBNZXRob2RMaWJyYXJ5LgotCSAqIFRoaXMgbWV0aG9kIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB0aGUgb3BlbiBsaWJyYXJ5IGluIExpYnJhcnlTZXJ2aWNlLiAKLQkgKiBJdCBvbmx5IGxvYWQgdGhlIHJvdyBsaWJyYXJ5IG9iamVjdCBidXQgd2lsbCBub3QgaW1wYWN0IHRoZSBjdXJyZW50IEVQRiBlbnZpcm9ubWVudC4KLQkgKiBAcGFyYW0gbGlicmFyeVBhdGggU3RyaW5nCi0JICogQHJldHVybiBNZXRob2RMaWJyYXJ5Ci0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZExpYnJhcnkgbG9hZExpYnJhcnkoU3RyaW5nIGxpYnJhcnlQYXRoKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBQZXJzaXN0ZW5jZVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUmVzb3VyY2VTZXQoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpOwotCQlyZXNvdXJjZVNldC5sb2FkTWV0aG9kTGlicmFyaWVzKFVSSS5jcmVhdGVGaWxlVVJJKGxpYnJhcnlQYXRoKSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJcmV0dXJuIHJlc291cmNlU2V0LmdldEZpcnN0TWV0aG9kTGlicmFyeSgpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcm9vdCBwYXRoIG9mIHRoZSBtZXRob2QgbGlicmFyeSAKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAcmV0dXJuIEZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0TGlicmFyeVJvb3RQYXRoKE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCVJlc291cmNlIHJlcyA9IGxpYi5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVVSSSB1cmkgPSByZXMuZ2V0VVJJKCk7Ci0JCVN0cmluZyBwYXRoID0gdXJpLnRvRmlsZVN0cmluZygpOwotCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKLQkJcmV0dXJuIGYuZ2V0UGFyZW50RmlsZSgpOwotCX0KLQotCS8qKgotCSAqIGdldCBhbGwgcGFja2FnZXMgaW4gdGhlIHBsdWdpbgotCSAqIEBwYXJhbSBwbHVnaW4gTWV0aG9kUGx1Z2luCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFBhY2thZ2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdCBhbGxQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUxpc3QgcGtncyA9IHBsdWdpbi5nZXRNZXRob2RQYWNrYWdlcygpOwotCQlhbGxQa2dzLmFkZEFsbChwa2dzKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlnZXRBbGxDaGlsZFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKSBpdC5uZXh0KCksIGFsbFBrZ3MpOwotCQl9Ci0KLQkJcmV0dXJuIGFsbFBrZ3M7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGFsbCBjaGlsZCBwYWNrYWdlcyBvZiB0aGUgZ2l2ZW4gTWV0aG9kUGFja2FnZSBhbmQgYWRkIHRvIHRoZSBsaXN0Ci0JICogQHBhcmFtIHBrZyBNZXRob2RQYWNrYWdlCi0JICogQHBhcmFtIHJlc3VsdCBMaXN0IHRoZSBwYWNrYWdlcyBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxDaGlsZFBhY2thZ2VzKE1ldGhvZFBhY2thZ2UgcGtnLCBMaXN0IHJlc3VsdCkgewotCQlMaXN0IHBrZ3MgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlyZXN1bHQuYWRkQWxsKHBrZ3MpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2dzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWdldEFsbENoaWxkUGFja2FnZXMoKE1ldGhvZFBhY2thZ2UpIGl0Lm5leHQoKSwgcmVzdWx0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCBhbGwgY29uZmlndXJhdGlvbnMgcmVmZXJlbmNlZCBieSB0aGlzIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuIExpc3Qgb2YgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBc3NvY2lhdGVkQ29uZmlndXJhdGlvbnMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQkvLyBnZXQgdGhlIGNvbmZpZ3MgdGhhdCByZWZlcmVuY2VzIHRoaXMgbWV0aG9kIHBsdWdpbgotCQlMaXN0IGFsbENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgY29uZmlncyA9IChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBwbHVnaW4pCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKEFzc29jaWF0aW9uSGVscGVyLk1ldGhvZFBsdWdpbl9NZXRob2RDb25maWd1cmF0aW9ucyk7Ci0JCWFkZFVuaXF1ZUl0ZW1zKGNvbmZpZ3MsIGFsbENvbmZpZ3MpOwotCi0JCS8vIGdldCB0aGUgY29uZmlncyB0aGF0IHJlZmVyZW5jZXMgdGhlIHBhY2thZ2VzIGluIHRoaXMgcGx1Z2luCi0JCUxpc3QgcGtncyA9IGdldEFsbFBhY2thZ2VzKHBsdWdpbik7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2dzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG8gPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGl0Lm5leHQoKTsKLQotCQkJY29uZmlncyA9IChMaXN0KSBvCi0JCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShBc3NvY2lhdGlvbkhlbHBlci5NZXRob2RQYWNrYWdlX01ldGhvZENvbmZpZ3VyYXRpb25zKTsKLQkJCWFkZFVuaXF1ZUl0ZW1zKGNvbmZpZ3MsIGFsbENvbmZpZ3MpOwotCQl9Ci0KLQkJLy8gZ2V0IHRoZSBjb25naWd1cmF0aW9ucyB0aGF0IHJlZmVyZW5jZWQgYnkgdGhlIHByb2Nlc3NlcyBpbiB0aGlzCi0JCS8vIHBsdWdpbgotCQlMaXN0IHByb2NzID0gVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHByb2NzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgaXQKLQkJCQkJLm5leHQoKTsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gYyA9IHAuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCWlmICgoYyAhPSBudWxsKSAmJiAhYWxsQ29uZmlncy5jb250YWlucyhjKSkgewotCQkJCWFsbENvbmZpZ3MuYWRkKGMpOwotCQkJfQotCQkJYWRkVW5pcXVlSXRlbXMocC5nZXRWYWxpZENvbnRleHQoKSwgYWxsQ29uZmlncyk7Ci0JCX0KLQotCQlyZXR1cm4gYWxsQ29uZmlnczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFVuaXF1ZUl0ZW1zKExpc3QgZnJvbSwgTGlzdCB0bykgewotCQlpZiAoZnJvbSA9PSBudWxsIHx8IHRvID09IG51bGwgfHwgZnJvbS5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGZyb20uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIXRvLmNvbnRhaW5zKG8pKSB7Ci0JCQkJdG8uYWRkKG8pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYnkgZm9yY2luZyB0byBzZWxlY3QgdGhlIGdsb2JhbCBwYWNrYWdlcyBvZgotCSAqIHRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Z2lucywgdGhpcyBpcyBuZWVkZWQgZm9yIGNvbmZpZ3VyYXRpb24gZXhwb3J0aW5nLgotCSAqIElmIGdsb2JhbCBwYWNrYWdlcyBhcmUgbWlzc2luZywgdGhlIGV4cG9ydGVkIGNvbmZpZ3VyYXRpb24gaXMgbm90IHZhbGlkCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLS8vCQlMaXN0IHBsdWdpbnMgPSBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0vLwkJTGlzdCBwa2dTZWxzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLS8vCi0vLwkJZm9yIChJdGVyYXRvciBpdHAgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7KSB7Ci0vLwkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdHAubmV4dCgpOwotLy8JCQlMaXN0IHBrZ3MgPSBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHBsdWdpbik7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXQgPSBwa2dzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLS8vCQkJCU9iamVjdCBwa2cgPSBpdC5uZXh0KCk7Ci0vLwkJCQlpZiAoIXBrZ1NlbHMuY29udGFpbnMocGtnKSkgewotLy8JCQkJCXBrZ1NlbHMuYWRkKHBrZyk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0JCQotCQkvLyBtb3ZlZCB0byBUbmdVdGlsCi0JCVRuZ1V0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjb3B5cmlnaHQgb2JqZWN0IGZvciBhbiBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3VwcG9ydGluZ01hdGVyaWFsCi0JICovCi0JcHVibGljIHN0YXRpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgZ2V0Q29weXJpZ2h0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgc20gPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFVuaXQpIHsKLQkJCXNtID0gKChNZXRob2RVbml0KSBlbGVtZW50KS5nZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlzbSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KS5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkuZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCk7Ci0JCX0KLQotCQkvLyBpZiBubyBjb3B5cmlnaHQgb2YgaXQncyBvd24sIGdldCB0aGUgY29weXJpZ2h0IGZyb20gdGhlIHBsdWdpbgotCQlpZiAoc20gPT0gbnVsbCkgewotCQkJTWV0aG9kUGx1Z2luIHAgPSBnZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCQlpZiAocCAhPSBudWxsKSB7Ci0JCQkJc20gPSBwLmdldENvcHlyaWdodFN0YXRlbWVudCgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHNtOwotCX0KLQotCS8qKgotCSAqIGZvciB0aGUgZ2l2ZW4gY29udGFpbmVyIGFuZCBlbGVtZW50cyBsaXN0LCBjaGVjayBpZiB0aGUgZWxlbWVudCBpbiB0aGUgbGlzdCBpcyBjb250YWluZWQgYnkgdGhlIGNvbnRhaW5lciBvciBub3QuIAotCSAqIHJldHVybiBhbGwgdGhlIGNvbnRhaW5lZCBlbGVtZW50cyBmb3IgYSBnaXZlbiBjb250YWluZXIKLQkgKiBAcGFyYW0gY29udGFpbmVyIE9iamVjdAotCSAqIEBwYXJhbSBlbGVtZW50cyBDb2xsZWN0aW9uCi0JICogQHJldHVybiBDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldENvbnRhaW5lZEVsZW1lbnRzKE9iamVjdCBjb250YWluZXIsCi0JCQlDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJY29udGFpbmVyID0gKChUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcikgY29udGFpbmVyKS5nZXRUYXJnZXQoKTsKLQkJfQotCQlBcnJheUxpc3QgY29udGFpbmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkJJiYgVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KChFT2JqZWN0KSBlbGVtZW50LCBjb250YWluZXIpKSB7Ci0JCQkJY29udGFpbmVkLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbmVkOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHR3byBtZXRob2QgZWxlbWVudCBhcmUgaWRlbnRpY2FsIG9yIG5vdC4gVHdvIGVsZW1lbnRzIGFyZQotCSAqIGlkZW50aWNhbCBpZiBhbmQgb25seSBpZjogYWxsIHRoZSBhdHRyaWJ1dGUgdmFsdWVzIGFyZSBlcXVhbCBhbGwgdGhlCi0JICogcmVmZXJlbmNlZCBlbGVtZW50cyBhcmUgZXF1YWwgYWxsIHRoZSBjb250YWluZWQgZWxlbWVudHMgYXJlIGlkZW50aWNhbAotCSAqIAotCSAqIEBwYXJhbSBvbGRPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3T2JqCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSWRlbnRpY2FsKE1ldGhvZEVsZW1lbnQgb2xkT2JqLCBNZXRob2RFbGVtZW50IG5ld09iaikgewotCi0JCWlmICgob2xkT2JqID09IG51bGwpICYmIChuZXdPYmogPT0gbnVsbCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYgKChvbGRPYmogPT0gbnVsbCkgfHwgKG5ld09iaiA9PSBudWxsKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gdGhpcyBkb2VzIG5vdCB3b3JrLCB0aGUgdG9TdHJpbmcgY29udGFpbnMgdGhlIG9iamVjdCBpbnN0YW5jZSBpbmZvCi0JCS8vIHJldHVybiBvbGRPYmoudG9TdHJpbmcoKS5lcXVhbHMobmV3T2JqLnRvU3RyaW5nKCkpOwotCi0JCUxpc3QgcHJvcGVydGllcyA9IG9sZE9iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0aWVzCi0JCQkJCQkuZ2V0KGkpOwotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IG9sZE9iai5lR2V0KGZlYXR1cmUpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChvbGRWYWx1ZSA9PSBudWxsICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKG9sZFZhbHVlID09IG51bGwgfHwgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCi0JCQkJCS8vIGlmIGl0J2MgY29udGFpbm1lbnQgZmVhdHVyZSB2YWx1ZSwgaXRlcmF0ZSBpdAotCQkJCQlNZXRob2RFbGVtZW50IG9sZGUgPSAoTWV0aG9kRWxlbWVudCkgb2xkVmFsdWU7Ci0JCQkJCWlmIChvbGRlLmVDb250YWluZXIoKSA9PSBvbGRPYmopIHsKLQkJCQkJCWlmICghaXNJZGVudGljYWwob2xkZSwgKE1ldGhvZEVsZW1lbnQpIG5ld1ZhbHVlKSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJTGlzdCBvbGRsID0gKExpc3QpIG9sZFZhbHVlOwotCQkJCQlMaXN0IG5ld2wgPSAoTGlzdCkgbmV3VmFsdWU7Ci0JCQkJCWlmIChvbGRsLnNpemUoKSAhPSBuZXdsLnNpemUoKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJZm9yIChpbnQgeCA9IDA7IHggPCBvbGRsLnNpemUoKTsgeCsrKSB7Ci0JCQkJCQlPYmplY3QgbyA9IG9sZGwuZ2V0KHgpOwotCQkJCQkJT2JqZWN0IG4gPSBuZXdsLmdldCh4KTsKLQkJCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCS8vIGlmIGl0J2MgY29udGFpbm1lbnQgZmVhdHVyZSB2YWx1ZSwgaXRlcmF0ZSBpdAotCQkJCQkJCU1ldGhvZEVsZW1lbnQgb2xkZSA9IChNZXRob2RFbGVtZW50KSBvOwotCQkJCQkJCWlmIChvbGRlLmVDb250YWluZXIoKSA9PSBvbGRPYmopIHsKLQkJCQkJCQkJaWYgKCFpc0lkZW50aWNhbChvbGRlLCAoTWV0aG9kRWxlbWVudCkgbikpIHsKLQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSBpZiAob2xkVmFsdWUgIT0gbmV3VmFsdWUpIHsKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKCFvLmVxdWFscyhuKSkgewotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCFvbGRWYWx1ZS5lcXVhbHMobmV3VmFsdWUpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYSBwcm9jZXNzIG9yIG5vdC4gCi0JICogQSBQcm9jZXNzIGlzIGEgQ2FwYWJpbGl0eVBhdHRlcm4gb3IgRGVsaXZlcnlQcm9jZXNzIG9iamVjdCAKLQkgKiB0aGF0IGlzIGNvbnRhaW5lZCBieSBhIFByb2Nlc3NDb21wb25lbnQuCi0JICogQHBhcmFtIGUgRU9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb2Nlc3MoRU9iamVjdCBlKSB7Ci0JCXJldHVybiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgJiYgCi0JCQkoZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFZhbGlkVmlld3MoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCi0JCUxpc3Qgdmlld3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgdmlldyA9IChDb250ZW50Q2F0ZWdvcnkpaXQubmV4dCgpOwotCQkJaWYgKCAhQ29uZmlndXJhdGlvbkhlbHBlci5pc0NvbnRyaWJ1dG9yKHZpZXcpICkgewotCQkJCXZpZXcgPSAoQ29udGVudENhdGVnb3J5KUNvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodmlldywgY29uZmlnKTsKLQkJCQlpZiAoIHZpZXcgIT0gbnVsbCAmJiAhdmlld3MuY29udGFpbnModmlldykgKSB7Ci0JCQkJCXZpZXdzLmFkZCh2aWV3KTsKLQkJCQl9IAotCQkJfQkKLQkJfQotCQkJCQotCQlyZXR1cm4gdmlld3M7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0xvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYTZmNjk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMb2cgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnZXIgSU5TVEFOQ0UgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldExvZ2dlcigpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL01vZGVsU3RvcmFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Nb2RlbFN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2YwNThlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL01vZGVsU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTW9kZWxTdG9yYWdlIHsKLQkKLQkvKioKLQkgKiByZXR1cm4gdGhlIE1ldGhvZFBsdWdpbnMgaW4gdGhlIGN1cnJlbnQgTWV0aG9kTGlicmFyeQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRCYXNlTW9kZWxzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYiAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QobGliLmdldE1ldGhvZFBsdWdpbnMoKSk7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBNZXRob2RMaWJyYXJ5IGFuZCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgUmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICogQHBhcmFtIGRpciBTdHJpbmcKLQkgKiBAcGFyYW0gYk11bHRpcGxlIGJvb2xlYW4KLQkgKiBAcmV0dXJuIFJlc291cmNlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIG5ld0xpYnJhcnkoSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCwKLQkJCVN0cmluZyBuYW1lLCBTdHJpbmcgZGlyLCBib29sZWFuIGJNdWx0aXBsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBsaWJfZmlsZW5hbWUgPSBudWxsOwotCQkvLyBNYXAgb3B0aW9ucyA9IG5ldwotCQkvLyBIYXNoTWFwKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5ERUZBVUxUX1NBVkVfT1BUSU9OUyk7Ci0JCWlmIChiTXVsdGlwbGUpIHsKLQkJCWxpYl9maWxlbmFtZSA9IE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTElCUkFSWV9NT0RFTF9GSUxFTkFNRTsKLQkJCS8vIG9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1VTFRJX0ZJTEUsIEJvb2xlYW4uVFJVRSk7Ci0JCX0gZWxzZSB7Ci0JCQlsaWJfZmlsZW5hbWUgPSBuYW1lOwotCQl9Ci0JCXJlc291cmNlU2V0LnVubG9hZCgpOwotCQlSZXNvdXJjZSByZXMgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlRmlsZVVSSShkaXIKLQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgbGliX2ZpbGVuYW1lKSk7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCQlsaWIuc2V0TmFtZShuYW1lKTsKLQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKGxpYik7Ci0JCXJlc291cmNlU2V0LnNhdmUobnVsbCk7Ci0JCXJldHVybiByZXM7Ci0JfQotCQotCS8qKgotCSAqIGluaXRpYWxpemUgYSBuZXcgbWV0aG9kIHBsdWdpbgotCSAqIEBwYXJhbSBlbXB0eU1vZGVsIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gTWV0aG9kUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RQbHVnaW4gaW5pdGlhbGl6ZShNZXRob2RQbHVnaW4gZW1wdHlNb2RlbCkgewotCQllbXB0eU1vZGVsLnNldFVzZXJDaGFuZ2VhYmxlKEJvb2xlYW4uVFJVRSk7Ci0KLQkJY3JlYXRlQ29udGVudFBhY2thZ2VzKGVtcHR5TW9kZWwsIE1vZGVsU3RydWN0dXJlLkRFRkFVTFRfRE9NQUlOX1BBVEgpOwotCQljcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCWNyZWF0ZUNvbnRlbnRQYWNrYWdlcyhlbXB0eU1vZGVsLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQkJY3JlYXRlQ29udGVudFBhY2thZ2VzKGVtcHR5TW9kZWwsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQljcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpOwotCQljcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCk7Ci0JCWNyZWF0ZUNvbnRlbnRQYWNrYWdlcyhlbXB0eU1vZGVsLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuc3RhbmRhcmRDYXRlZ29yeVBhdGgpOwotCi0JCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cgPSBjcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCVRuZ1V0aWwuY3JlYXRlUm9vdEN1c3RvbUNhdGVnb3J5KGNvbnRlbnRQa2cpOwotCi0JCS8vIGNyZWF0ZSBEZWxpdmVyeVByb2Nlc3NlcyBwcm9jZXNzIHBhY2thZ2UKLQkJLy8KLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJcGtnLnNldE5hbWUoTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoWzBdKTsKLQkJZW1wdHlNb2RlbC5nZXRNZXRob2RQYWNrYWdlcygpLmFkZChwa2cpOwotCi0JCS8vIGNyZWF0ZSBQcm9jZXNzQ29udHJpYnV0aW9ucyBwcm9jZXNzIHBhY2thZ2UKLQkJLy8KLQkJTW9kZWxTdHJ1Y3R1cmUuY3JlYXRlUHJvY2Vzc0NvbnRyaWJ1dGlvblBhY2thZ2UoZW1wdHlNb2RlbCk7Ci0KLQkJLy8gY3JlYXRlIENhcGFiaWxpdHlQYXR0ZXJucyBwcm9jZXNzIHBhY2thZ2UKLQkJLy8KLQkJcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJaW50IGxlbiA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoLmxlbmd0aCAtIDE7Ci0JCXBrZy5zZXROYW1lKE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoW2xlbl0pOwotCQlTdHJpbmdbXSBwYXRoID0gbmV3IFN0cmluZ1tsZW5dOwotCQlTeXN0ZW0uYXJyYXljb3B5KE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoLCAwLCBwYXRoLAotCQkJCTAsIGxlbik7Ci0JCUNvbnRlbnRQYWNrYWdlIGNvbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShlbXB0eU1vZGVsLCBwYXRoKTsKLQkJY29udFBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0KLQkJLy8gLy8gY3JlYXRlIGluaGVyaXRlZCBkb21haW5zCi0JCS8vIC8vCi0JCS8vIExpc3QgYWxsQmFzZSA9IE1pc2MuZ2V0QWxsQmFzZShlbXB0eU1vZGVsKTsKLQkJLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJNb2RlbFN0b3JhZ2UuaW5pdGlhbGl6ZSgpOiBhbGxCYXNlPSIrYWxsQmFzZSk7Ci0JCS8vIGZvcihJdGVyYXRvciBpdGVyID0gYWxsQmFzZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJLy8gQ29udGVudFBhY2thZ2UgYmFzZURvbWFpblBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGJhc2VQbHVnaW4sCi0JCS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFRfRE9NQUlOX1BBVEgpOwotCQkvLyBJbmhlcml0ZWRDYXRlZ29yeVBhY2thZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldwotCQkvLyBJbmhlcml0ZWREb21haW5QYWNrYWdlTGlzdGVuZXIoZG9tYWluUGtnKTsKLQkJLy8gYmFzZURvbWFpblBrZy5lQWRhcHRlcnMoKS5hZGQobGlzdGVuZXIpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0KLQkJLy8gYmFzZURvbWFpblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCS8vIENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSA9IChDb250ZW50Q2F0ZWdvcnkpIGVsZW1lbnQ7Ci0JCS8vIGlmKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCS8vIC8vIHRoaXMgY2F0ZWdvcnkgaXMgbm90IGEgaW5oZXJpdGVkIG9uZSwgY2FuIGJlIGFkZGVkLgotCQkvLyAvLwotCQkvLyBkb21haW5Qa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGxpc3RlbmVyLmNyZWF0ZUluaGVyaXRlZCgoQ29udGVudENhdGVnb3J5KQotCQkvLyBlbGVtZW50KSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQotCQkvLyBUT0RPOiB0ZXN0IG9uLWZseSBjcmVhdGlvbiBvZiBjYXRlZ29yeSBjb250cmlidXRvcgotCQkvLyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcikKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoZW1wdHlNb2RlbCwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gaXRlbVByb3ZpZGVyLmFkZEluaGVyaXRlZENhdGVnb3JpZXMoKTsKLQotCQlyZXR1cm4gZW1wdHlNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBlbXB0eU1vZGVsCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2VzKE1ldGhvZFBsdWdpbiBtb2RlbCwKLQkJCVN0cmluZ1tdIHBhdGgpIHsKLQkJTGlzdCBsaXN0ID0gbW9kZWwuZ2V0TWV0aG9kUGFja2FnZXMoKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UobGlzdCwgcGF0aFswXSk7Ci0JCWlmIChwa2cgPT0gbnVsbCkgewotCQkJcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKTsKLQkJCXBrZy5zZXROYW1lKHBhdGhbMF0pOwotCQkJbGlzdC5hZGQocGtnKTsKLQkJfQotCQlmb3IgKGludCBpID0gMTsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCWxpc3QgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkJcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UobGlzdCwgcGF0aFtpXSk7Ci0JCQlpZiAocGtnID09IG51bGwpIHsKLQkJCQlwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpOwotCQkJCXBrZy5zZXROYW1lKHBhdGhbaV0pOwotCQkJCWxpc3QuYWRkKHBrZyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBrZzsKLQl9Ci0KLQkvKioKLQkgKiBsb2FkIHRoZSBjb250YWlubWVudCBwcm94aWVzIGZvciB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIG9iaiBFT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRDb250YWlubWVudFByb3hpZXMoRU9iamVjdCBvYmopIHsKLQkJLy8gZm9yKFRyZWVJdGVyYXRvciBpdGVyID0gb2JqLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJTGlzdCBsaXN0ID0gb2JqLmVDb250ZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCQkvLyBJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpaXRlci5uZXh0KCk7Ci0JCQlpZiAoby5lUHJveHlVUkkoKSAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJwcm94eSBVUkkgPSAiICsgby5lUHJveHlVUkkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG8uZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQlSZXNvdXJjZSByZXMgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShvLmVQcm94eVVSSSgpLCB0cnVlKTsKLQkJCQlJbnRlcm5hbEVPYmplY3QgcmVzb2x2ZWRPYmogPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXJlc29sdmVkT2JqID0gKEludGVybmFsRU9iamVjdCkgcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVzb2x2ZWRPYmogPSAiICsgcmVzb2x2ZWRPYmopOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHJlc29sdmVkT2JqICE9IG51bGwpIHsKLQkJCQkJRWNvcmVVdGlsLnJlcGxhY2UobywgcmVzb2x2ZWRPYmopOwotCQkJCQkoKEJhc2ljRUxpc3QpIHJlcy5nZXRDb250ZW50cygpKS5zZXREYXRhKDEsCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgcmVzb2x2ZWRPYmogfSk7ICAgICAgICAgCi0JCQkJCW8gPSByZXNvbHZlZE9iajsKLQkJCQl9Ci0JCQl9Ci0JCQlsb2FkQ29udGFpbm1lbnRQcm94aWVzKG8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbG9hZCBhbGwgcHJveGllcyBmb3IgdGhlIG9iamVjdAotCSAqIEBwYXJhbSBvYmogRU9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQWxsUHJveGllcyhFT2JqZWN0IG9iaikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmouZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJfQotCQl9Ci0KLQkJLy8gbG9hZENvbnRhaW5tZW50UHJveGllcyhvYmopOwotCQkvLyBsb2FkQ3Jvc3NSZWZlcmVuY2VQcm94aWVzKG9iaik7Ci0JfQotCi0JLyoqCi0JICogbG9hZCBhbGwgY3Jvc3MgcmVmZXJlbmNlIHByb3hpZXMgZm9yIHRoZSBvYmplY3QKLQkgKiBAcGFyYW0gb2JqIEVPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9hZENyb3NzUmVmZXJlbmNlUHJveGllcyhFT2JqZWN0IG9iaikgewotCQlMaXN0IGxpc3QgPSBvYmouZUNyb3NzUmVmZXJlbmNlcygpOwotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGxpc3QuZ2V0KGkpOwotCQkJbG9hZENyb3NzUmVmZXJlbmNlUHJveGllcyhvKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGZpbmQgYSBNZXRob2RFbGVtZW50IHdpdGggdGhlIGdpdmVuIGVsZW1lbnQgbmFtZSBpbiB0aGUgZWxlbWVudCBsaXN0Ci0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnRzIFRoZSBlbGVtZW50IGxpc3QKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZmluZE1ldGhvZEVsZW1lbnQoTGlzdCBtZXRob2RFbGVtZW50cywKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWludCBzaXplID0gbWV0aG9kRWxlbWVudHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG1ldGhvZEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChuYW1lLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IG9mIGluZGV4IGludCBoZSBsaXN0IGxvY2F0aW9uIGZvciB0aGUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50cyBMaXN0Ci0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKExpc3QgbWV0aG9kRWxlbWVudHMsIFN0cmluZyBuYW1lKSB7Ci0JCWludCBzaXplID0gbWV0aG9kRWxlbWVudHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG1ldGhvZEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChuYW1lLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9QbHVnaW5SZWZlcmVuY2VDaGVja2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1BsdWdpblJlZmVyZW5jZUNoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzU0YWY3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1BsdWdpblJlZmVyZW5jZUNoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGNoZWNrIHBsdWdpbiByZWZlcmVuY2VzCi0gKiBAYXV0aG9yID8/PwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luUmVmZXJlbmNlQ2hlY2tlciB7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgTGlzdCBjaGVja0NpcmN1bGFyRGVwZW5kZW50UGx1Z2luc0luTGlicmFyeSgpIHsKLS8vCQlMaXN0IGNkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCi0vLwkJTGlzdCBhbGxQbHVnaW5MaXN0ID0gTW9kZWxTdG9yYWdlLmdldEJhc2VNb2RlbHMoKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxQbHVnaW5MaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotLy8JCQlpZiAoaGFzQ2lyY3VsYXJDb25mbGljdFdpdGhQbHVnaW4oZWxlbWVudCkpCi0vLwkJCQljZExpc3QuYWRkKGVsZW1lbnQpOwotLy8JCX0KLS8vCQlyZXR1cm4gY2RMaXN0OwotLy8JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFQbHVnaW4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ2lyY3VsYXJDb25mbGljdFdpdGhQbHVnaW4oTWV0aG9kUGx1Z2luIGFQbHVnaW4pIHsJCQotLy8JCWJvb2xlYW4gYW5zd2VyID0gZmFsc2U7Ci0vLwotLy8JCUxpc3QgYWxsb3dhYmxlQmFzZUxpc3QgPSBnZXRBcHBsaWNhYmxlQmFzZVBsdWdpbnMoYVBsdWdpbik7Ci0vLwkJTGlzdCBleHRlbmRlZEJhc2VMaXN0ID0gYVBsdWdpbi5nZXRCYXNlcygpOwotLy8KLS8vCQlpZiAoIWFsbG93YWJsZUJhc2VMaXN0LmNvbnRhaW5zQWxsKGV4dGVuZGVkQmFzZUxpc3QpKSB7Ci0vLwkJCVN5c3RlbS5vdXQKLS8vCQkJCQkucHJpbnRsbigiJCQkOiBjaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkIGZvciAiICsgYVBsdWdpbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0vLwkJCXByaW50UGx1Z2luTGlzdCgiYWxsb3dhYmxlIHBsdWdpbiBsaXN0IiwgYWxsb3dhYmxlQmFzZUxpc3QpOyAvLyROT04tTkxTLTEkCi0vLwkJCXByaW50UGx1Z2luTGlzdCgiY3VycmVudCBiYXNlIGxpc3QiLCBleHRlbmRlZEJhc2VMaXN0KTsgLy8kTk9OLU5MUy0xJAotLy8JCQlhbnN3ZXIgPSB0cnVlOwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGFuc3dlcjsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFQbHVnaW4uZ2V0QmFzZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBiYXNlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZighRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYVBsdWdpbiwgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19CQVNFUywgYmFzZSkuaXNPSygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhUGx1Z2luCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFwcGxpY2FibGVCYXNlUGx1Z2lucyhNZXRob2RQbHVnaW4gYVBsdWdpbikgewotCQlMaXN0IG1vZGVscyA9IE1vZGVsU3RvcmFnZS5nZXRCYXNlTW9kZWxzKCk7Ci0KLQkJTGlzdCBkZXNjZW5kYW50TGlzdCA9IGdldERlc2NlbmRhbnRzKGFQbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXNjZW5kYW50TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBlbGVtZW50ID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYVBsdWdpbi5nZXRCYXNlcygpLmNvbnRhaW5zKGVsZW1lbnQpKSB7CQkvL3BhcnQgb2YgMTcwMzY3OiBhbGxvdyBpdCB0byBzaG93IGZvciB1bnNlbGVjdAotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJbW9kZWxzLnJlbW92ZShlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBtb2RlbHM7Ci0JfQotCi0JLy8gdGhvc2UgdHdvIGdldERlc2NlbmRhbnRzKCkgbWV0aG9kcyBzaG91bGQgYmUgbW92ZWQgaW50byBsb3dlciBsYXllcgotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0RGVzY2VuZGFudHMoTWV0aG9kUGx1Z2luIG1ldGhvZE9iamVjdCkgewotCQlMaXN0IGRlc2NlbmRhbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUxpc3Qgb2JqTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJb2JqTGlzdC5hZGQobWV0aG9kT2JqZWN0KTsKLQotCQlnZXREZXNjZW5kYW50cyhkZXNjZW5kYW50TGlzdCwgb2JqTGlzdCk7Ci0KLQkJcmV0dXJuIGRlc2NlbmRhbnRMaXN0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0RGVzY2VuZGFudHMoTGlzdCBhbGxEZXNjZW5kYW50TGlzdCwKLQkJCUxpc3QgbWV0aG9kT2JqZWN0TGlzdCkgewotCQlpZiAobWV0aG9kT2JqZWN0TGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gYWxsRGVzY2VuZGFudExpc3Q7Ci0KLQkJTGlzdCBjb21iRGVzY2VuZGFudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBlbGVtZW50ID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlMaXN0IGRlc2NlbmRhbnRMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJLmdldFBsdWdpbkRpcmVjdEV4dGVuc2lvbnMoZWxlbWVudCk7Ci0JCQljb21iRGVzY2VuZGFudExpc3QuYWRkQWxsKGRlc2NlbmRhbnRMaXN0KTsKLQotCQl9Ci0KLQkJYWxsRGVzY2VuZGFudExpc3QuYWRkQWxsKG1ldGhvZE9iamVjdExpc3QpOwotCQlMaXN0IG5leHRDaGVja0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbWJEZXNjZW5kYW50TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWFsbERlc2NlbmRhbnRMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKQotCQkJCW5leHRDaGVja0xpc3QuYWRkKGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGdldERlc2NlbmRhbnRzKGFsbERlc2NlbmRhbnRMaXN0LCBuZXh0Q2hlY2tMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZGVzYwotCSAqIEBwYXJhbSBwbHVnaW5MaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50UGx1Z2luTGlzdChTdHJpbmcgZGVzYywgTGlzdCBwbHVnaW5MaXN0KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnQoIiQkJCAiICsgZGVzYyArICI6IFsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwbHVnaW5MaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KHBsdWdpbi5nZXROYW1lKCkgKyAiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1Jlc291cmNlSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1Jlc291cmNlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5ZWY5NTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9SZXNvdXJjZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sLlhTTFRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkRlZmF1bHRDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JQ29udGVudFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MaW5rSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5OYW1lQ2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlSGVscGVyIHsKLQotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSQUNFX1JFUExBQ0VNRU5UID0gIl9CUl8iOyAvLyROT04tTkxTLTEkCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTkJSQUNFX1NUUklORyA9ICJcXHsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfQk9PS01BUktfSU5ESUNBVE9SID0gIiMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfUEFSQU1FVEVSX0lORElDQVRPUiA9ICI/IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1BBUkFNRVRFUl9QUk9DRVNTID0gInByb2MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfU1RSX0pBVkFTQ1JJUFQgPSAiamF2YXNjcmlwdDoiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfU1RSX01BSUxUTyA9ICJtYWlsdG86IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1BBUkFNRVRFUl9QQVRIID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUl9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUl9LRVkgPSAia2V5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJfVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUl9HVUlEID0gImd1aWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUl9IUkVGID0gImhyZWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUl9WQUxVRV9JTkRFWCA9ICJpbmRleCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfRVhUX0hUTUwgPSAiLmh0bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0VYVF9IVE0gPSAiLmh0bSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfRVhUX0pQRUcgPSAiLmpwZWciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1BBR0VTX0ZPTERFUiA9ICJwYWdlc19ub3RfaW5zdGFsbGVkLyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGluayA9ICJlbGVtZW50TGluayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhUeXBlID0gImVsZW1lbnRMaW5rV2l0aFR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVXNlclRleHQgPSAiZWxlbWVudExpbmtXaXRoVXNlclRleHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9GT0xERVIgPSBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLlJFU09VUkNFX0ZPTERFUjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2h0bWxfZmlsZV9uYW1lID0gUGF0dGVybgotCQkJLmNvbXBpbGUoIiguKiksKC4qKVxcLmh0bWwiKTsgLy8kTk9OLU5MUy0xJAotCi0JLy8gdGhpcyBvbmUgZG9lcyBub3Qgd29yayB3aGVuIGNvbnRhaW5pbmcgbm9uLWVuZ2xpc2ggY2hhcmFjdGVycywgdXNlIHRoZQotCS8vIG1vcmUgZ2VuZXJhbCBvbmUKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9saW5rX3JlZiA9Ci0JLy8gUGF0dGVybi5jb21waWxlKCI8YVxccys/KFtePl0qKT4oLio/KTwvYT4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfAotCS8vIFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2xpbmtfcmVmID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSI8YVxccys/KC4qPyk+KC4qPyk8L2E+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9hcmVhX3JlZiA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiPGFyZWEuKj8oaHJlZlxccyo9XFxzKlwiKC4qPylcIikiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2xpbmtfcmVmX2dlbiA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiPChhfGFyZWEpXFxzKz8oW14+XSopPiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua190eXBlX3BpY2tlciA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiIGNsYXNzXFxzKj89XFxzKj8oLio/KVxccysiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2xpbmtfZ3VpZF9waWNrZXIgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIiBndWlkXFxzKj89XFxzKj8oLio/KVxccysiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2xpbmtfaHJlZl9waWNrZXIgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIiBocmVmXFxzKj89XFxzKj9cIiguKj8pXCJcXHMrIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF90YWdfcmVmID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSI8KFtePiFdKikoXFxufFxccikoW14+XSopPiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaW1hZ2VfcmVmID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSIoPChpbWd8aWZyYW1lKS4qP3NyY1xccyo9XFxzKlwiKSguKj8pKFwiKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfdXJsX2RlY29kZXIgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIig8W14+XSo/KHNyY3xocmVmKVxccyo9XFxzKlwiKSguKj8pKFwiW14+XSo/PikiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX3RhZ19hdHRyaWJ1dGVzID0gUGF0dGVybgotCS5jb21waWxlKAotCQkJIiguKj8pXFxzKj1cXHMqKFwiPykoXFxTKilcXDIiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2Nzc19yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkiIHVybFxcKCguKj8pXFwpIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQkvLyBkZWZpbmUgY29uc3RhbnRzIGZvciBkaWFncmFtIHR5cGUuCi0JLy8gVGhpcyB3aWxsIGJlIHVzZWQgd2hlbiBsaW5raW5nIGRpYWdyYW1zIGludG8gcHVibGlzaGVkIGNvbnRlbnRzCi0JLy8gQWN0aXZpdHkgZGlhZ3JhbQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fVFlQRV9XT1JLRkxPVyA9ICJBY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTCA9ICJBY3Rpdml0eURldGFpbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFdQRGVwZW5kZW5jeSBkaWFncmFtCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1kgPSAiV1BEZXBlbmRlbmN5IjsgLy8kTk9OLU5MUy0xJAotCi0JCi0JcHVibGljIFJlc291cmNlSGVscGVyKCkgewotCX0KLQotCS8qKgotCSAqIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBmb2xkZXIgb2YgdGhlIHBsdWdpbiBpbiB0aGUgbGlicmFyeSwKLQkgKiByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSByb290Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpblJlc291cmNlUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCi0JCVN0cmluZyBwYXRoOwotCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCXBhdGggPSBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmdldFJlc291cmNlUGF0aChlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXBhdGggPSBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmdldFJlc291cmNlUGF0aChwbHVnaW4pOwotCQl9Ci0KLQkJcmV0dXJuIGZpeFBhdGgocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBmb2xkZXIgb2YgdGhlIGVsZW1lbnQgaW4gdGhlCi0JICogbGlicmFyeSwgcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnkgcm9vdAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRSZXNvdXJjZVBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRSZXNvdXJjZVBhdGgoZWxlbWVudCk7Ci0JCXJldHVybiBmaXhQYXRoKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZm9sZGVyIG9mIHRoZSBlbGVtZW50IGluIHRoZSBsaWJyYXJ5LAotCSAqIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50UGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRFbGVtZW50UGF0aChlbGVtZW50KTsKLQkJCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIldhcm5pbmchIE5vIFBhdGggZm9yIEVsZW1lbnQgWyIgKyBlbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiAiICsgZWxlbWVudC5nZXROYW1lKCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGZpeFBhdGgocGF0aCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGZpeCB0aGUgcGF0aCBieSBhcHBlbmRpbmcgYSBGaWxlLnNlcGVyYXRvciB0byB0aGUgZW5kIG9mIGl0Ci0JICogQHBhcmFtIHBhdGggU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaXhQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKCFwYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJcmV0dXJuIHBhdGggKyBGaWxlLnNlcGFyYXRvcjsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwYXRoOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50J3MgYmFjayBwYXRoIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QuIEZvciBleGFtcGxlLAotCSAqICJPcGVuVVBcZ3VpZGFuY2VcY29uY2VwdFxjMS54bWwiLCB0aGUgYmFjayBwYXRoIGlzICIuLy4uLy4uLy4uLyIKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYWNrUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJLy8gTGludXg6IEJyb3dzaW5nIGFuZCBwcmV2aWV3IHNob3dzIG9ubHkgcGxhaW4gdGV4dC4KLQkJLy8gVGhlcmUgYXJlIG5vIGltYWdlcy9zZWN0aW9ucwotCQkvLyBlbGVtZW50IHBhdGggc2hvdWxkIGNoZWNrIEZpbGUuc2VwYXJhdG9yQ2hhciBpbnN0ZWFkIG9mICJcIgotCQlTdHJpbmcgYmFja1BhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcGF0aCA9IGdldEVsZW1lbnRQYXRoKGVsZW1lbnQpOwotCQlpZiAocGF0aCAhPSBudWxsICYmIHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQliYWNrUGF0aCA9IHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykucmVwbGFjZUFsbCgKLQkJCQkJIi4qPy8iLCAiXFwuXFwuLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gIi4vIiArIGJhY2tQYXRoOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBleHQgU3RyaW5nIHRoZSBmaWxlIGV4dGVuYXNpb24sIGZvciBleGFtcGxlLCAiLmh0bWwiCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBleHQpIHsKLQkJcmV0dXJuIGdldEZpbGVOYW1lKGVsZW1lbnQsIG51bGwsIG51bGwsIGV4dCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4IGFuZCBleHRlbnNpb24KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG5hbWVQcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgdGhlIG5hbWUKLQkgKiBAcGFyYW0gbmFtZVN1ZmZpeCBTdHJpbmcgc3VmZml4IGZvciB0aGUgbmFtZQotCSAqIEBwYXJhbSBleHQgU3RyaW5nIGZpbGUgZXh0ZW5zaW9uLCBmb3IgZXhhbXBsZSwgIi5odG1sIgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCSAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lUHJlZml4LAotCQkJU3RyaW5nIG5hbWVTdWZmaXgsIFN0cmluZyBleHQpIHsJCQotCQlyZXR1cm4gTmFtZUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0RmlsZU5hbWUoZWxlbWVudCwgbmFtZVByZWZpeCwgbmFtZVN1ZmZpeCwgZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGd1aWQgZnJvbSB0aGUgZmlsZSBuYW1lLCBhc3N1bWluZyB0aGUgZmlsZSBuYW1lIGlzIGdlbmVyYXRlZCBmcm9tIGFuIGVsZW1lbnQsIAotCSAqIHJldHVybiBudWxsIGlmIG5vdCBmb3VuZC4KLQkgKiBAcGFyYW0gZmlsZU5hbWUgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHdWlkRnJvbUZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotCQlyZXR1cm4gTmFtZUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0R3VpZEZyb21GaWxlTmFtZShmaWxlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IGZyb20gdGhlIGZpbGUgbmFtZSwgYXNzdW1pbmcgdGhlIGZpbGUgbmFtZSBpcyBnZW5lcmF0ZWQgZnJvbSBhbiBlbGVtZW50LAotCSAqIHJldHVybiBudWxsIGlmIG5vdC4KLQkgKiBAcGFyYW0gZmlsZU5hbWUgU3RyaW5nCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnRGcm9tRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21GaWxlTmFtZShmaWxlTmFtZSk7Ci0JCWlmIChndWlkICE9IG51bGwpIHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCB1cmwgcmVsYXRpdmUgdG8gdGhlIHJlZkVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHJlZkVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBmaWxlRXh0IFN0cmluZyBmaWxlIGV4dGVuc2lvbgotCSAqIEBwYXJhbSBvbGRfdXJsIFN0cmluZyB0aGUgb2xkIHVybCBvZiB0aGUgZWxlbWVudC4gSWYgdGhlIG9sZCB1cmwgaXMgbm90IG51bGwsIAotCSAqIGFueSBib29rbWFyayBvciB1cmwgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRvIHRoZSBuZXcgdXJsCi0JICogQHJldHVybiBTdHJpbmcgU3RyaW5nIHRoZSBuZXcgZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVybChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQsIFN0cmluZyBmaWxlRXh0LCBTdHJpbmcgb2xkX3VybCkgewotCQlTdHJpbmcgdXJsID0gZ2V0VXJsKGVsZW1lbnQsIHJlZkVsZW1lbnQsIGZpbGVFeHQpOwotCi0JCS8vIGlmIHRoZSBvbGQgdXJsIGhhcyBib29rbWFyayBpbiBpdCwga2VlcCBpdAotCQlpZiAob2xkX3VybCAhPSBudWxsKSB7Ci0JCQlpbnQgaW5keCA9IG9sZF91cmwuaW5kZXhPZihVUkxfQk9PS01BUktfSU5ESUNBVE9SKTsKLQkJCWlmIChpbmR4IDwgMCkgewotCQkJCS8vIGtlZXAgdXJsIHF1ZXJ5IHN0cmluZyBhcyB3ZWxsCi0JCQkJaW5keCA9IG9sZF91cmwuaW5kZXhPZihVUkxfUEFSQU1FVEVSX0lORElDQVRPUik7Ci0JCQl9Ci0KLQkJCWlmIChpbmR4ID49IDApIHsKLQkJCQl1cmwgPSB1cmwgKyBvbGRfdXJsLnN1YnN0cmluZyhpbmR4KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IHVybCByZWxhdGl2ZSB0byB0aGUgcmVmRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmRWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGZpbGVFeHQgU3RyaW5nIGZpbGUgZXh0ZW5zaW9uCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHVybAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVybChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQsIFN0cmluZyBmaWxlRXh0KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHJlZkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEVsZW1lbnRQYXRoKGVsZW1lbnQpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpCi0JCQkJCSsgZ2V0RmlsZU5hbWUoZWxlbWVudCwgZmlsZUV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKGdldEJhY2tQYXRoKHJlZkVsZW1lbnQpICsgZ2V0RWxlbWVudFBhdGgoZWxlbWVudCkpLnJlcGxhY2UoCi0JCQkJCUZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKQotCQkJCQkrIGdldEZpbGVOYW1lKGVsZW1lbnQsIGZpbGVFeHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBsaW5rIHRleHQgZm9yIGFuIGVsZW1lbnQKLQkgKiBAcGFyYW0gZSBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGxpbmtUeXBlIFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGlua1RleHQoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgbGlua1R5cGUpIHsKLQkJU3RyaW5nIGxpbmtlZFRleHQgPSBudWxsOwotCQkKLQkJLy8gUlRFIG1heSBjaGFuZ2UgdGhlIGNhc2Ugb2YgYXR0cmlidXRlcy4KLQkJaWYgKChsaW5rVHlwZSAhPSBudWxsKQotCQkJCSYmICFFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVXNlclRleHQuZXF1YWxzSWdub3JlQ2FzZShsaW5rVHlwZSkpIHsKLQkJCWlmIChFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVHlwZS5lcXVhbHNJZ25vcmVDYXNlKGxpbmtUeXBlKSkgewotCQkJCWxpbmtlZFRleHQgPSBnZXRFbGVtZW50TGlua1RleHQoZSwgdHJ1ZSk7Ci0JCQl9IGVsc2UgaWYgKEVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGluay5lcXVhbHNJZ25vcmVDYXNlKGxpbmtUeXBlKSkgewotCQkJCWxpbmtlZFRleHQgPSBnZXRFbGVtZW50TGlua1RleHQoZSwgZmFsc2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxpbmtlZFRleHQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IGxpbmsgdGV4dCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHdpdGhUeXBlIGJvb2xlYW4gaWYgdHJ1ZSB0aGUgZWxlbWVudCB0eXBlIHN0cmluZyB3aWxsIGJlIGluY2x1ZGVkCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50TGlua1RleHQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJYm9vbGVhbiB3aXRoVHlwZSkgewotCQlTdHJpbmcgdGV4dCA9IFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50KTsKLQotCQlpZiAod2l0aFR5cGUpIHsKLQkJCXJldHVybiBnZXRFbGVtZW50VHlwZVRleHQoZWxlbWVudCkgKyBMaWJyYXJ5UmVzb3VyY2VzLmNvbG9uX3dpdGhfc3BhY2UgKyB0ZXh0OyAKLQkJfQotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIGd0ZSB0aGUgZWxlbWVudCB0eXBlIHN0cmluZwotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRUeXBlVGV4dChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0KLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0VHlwZVRleHQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogYXV0byBnZW5lcmF0ZWQgZWxlbWVudCBsaW5rIDxhIGNsYXNzPSJlbGVtZW50TGluayIgaHJlZj0iZWxlbWVudF91cmwiCi0JICogZ3VpZD0iZWxlbWVudF9ndWlkIj5lbGVtZW50X3R5cGU6IGVsZW1lbnRfcHJlc2VudGF0aW9uX25hbWU8L2E+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gd2l0aFR5cGUKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRMaW5rKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCWJvb2xlYW4gd2l0aFR5cGUsIFN0cmluZyB1cmwpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRFbGVtZW50TGlua1RleHQoZWxlbWVudCwgd2l0aFR5cGUpOwotCQlTdHJpbmcgbGlua0NsYXNzID0gRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rOwotCQlpZiAod2l0aFR5cGUpCi0JCQlsaW5rQ2xhc3MgPSBFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVHlwZTsKLQkJcmV0dXJuIGdldEVsZW1lbnRMaW5rKGVsZW1lbnQsIHRleHQsIHVybCwgbGlua0NsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBlbGVtZW50IGxpbmsgd2l0aCB1c2VyIHNwZWNpZmllZCBsaW5rIHRleHQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIHVybAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudExpbmsoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCwKLQkJCVN0cmluZyB1cmwpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRMaW5rKGVsZW1lbnQsIHRleHQsIHVybCwKLQkJCQlFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVXNlclRleHQpOwotCX0KLQotCS8qKgotCSAqIGVsZW1lbnQgbGluayB3aXRoIHVzZXIgc3BlY2lmaWVkIGxpbmsgdGV4dAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gdXJsCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50TGluayhNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0ZXh0LAotCQkJU3RyaW5nIHVybCwgU3RyaW5nIGxpbmtDbGFzcykgewotCQlyZXR1cm4gIjxhIGNsYXNzPVwiIiArIGxpbmtDbGFzcyArICJcIiAiICsgZ2V0VXJsVGV4dCh1cmwpICsgIiBndWlkPVwiIiArIGVsZW1lbnQuZ2V0R3VpZCgpICsgIlwiID4iICsgdGV4dCArICI8L2E+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JfQotCi0JLyoqCi0JICogdGhlIHBhc3NlZCBpbiB1cmwgbWlnaHQgY29udGFpbiB0aGUgaHJlZiBhdHRyaWJ1dGUgd2l0aCBpdCwgb3IgZXZlbiBvdGhlcgotCSAqIGF0dHJpYnV0ZXMsIHNvIGNoZWNrIGlmIHRoaXMgaXMgYSBwdXJlIHVybCBvciBub3QuIHJldHVybiB0aGUgdXJsIGhyZWYKLQkgKiB0ZXJtIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFVybFRleHQoU3RyaW5nIHVybCkgewotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCXVybCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQl1cmwgPSB1cmwudHJpbSgpOwotCQl9Ci0KLQkJLy8gc3RhcnRzIHdpdGggaHJlZiwgb3IgY29udGFpbnMgYW4gaHJlZiB0ZXJtIGluIGl0Ci0JCWlmICh1cmwudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJocmVmIikgfHwgdXJsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiIGhyZWYiKSA+IDApIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0KLQkJcmV0dXJuICJocmVmPVwiIiArIHVybCArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBjb250ZW50IGJ5IGNoZWNraW5nIGVsZW1lbnQgbGlua3MgYW5kIGltYWdlcwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHNvdXJjZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGVDb250ZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHNvdXJjZSkgewotCQlyZXR1cm4gdmFsaWRhdGVDb250ZW50KGVsZW1lbnQsIHNvdXJjZSwgbmV3IERlZmF1bHRDb250ZW50VmFsaWRhdG9yKCksCi0JCQkJbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGxpbmsgdHlwZSBpcyBlbGVtZW50IGxpbmsgb3Igbm90Ci0JICogQHBhcmFtIGxpbmtUeXBlIFN0cmluZwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VsZW1lbnRMaW5rKFN0cmluZyBsaW5rVHlwZSkgewotCQlpZiAobGlua1R5cGUgPT0gbnVsbCB8fCBsaW5rVHlwZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBSVEUgbWF5IGNoYW5nZSB0aGUgY2FzZSBvZiBhdHRyaWJ1dGVzLgotCQlyZXR1cm4gbGlua1R5cGUuZXF1YWxzSWdub3JlQ2FzZShFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmspCi0JCQkJfHwgbGlua1R5cGUuZXF1YWxzSWdub3JlQ2FzZShFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVHlwZSkKLQkJCQl8fCBsaW5rVHlwZS5lcXVhbHNJZ25vcmVDYXNlKEVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhVc2VyVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGNvbnRlbnQgYnkgY2hlY2tpbmcgZWxlbWVudCBsaW5rcyBhbmQgaW1hZ2VzLCBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgb3duZXIKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudCwgdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoZSBjb250ZW50Ci0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBNZXRob2RDb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uIHRvIHdoaWNoIHRoZSBjb250ZW50IGlzCi0JICogICAgICAgICAgICB2YWxpZGF0ZWQKLQkgKiBAcGFyYW0gbGlua2VkRWxlbWVudHMKLQkgKiAgICAgICAgICAgIExpc3QgYSBwYXNzZWQgaW4gbGlzdCB0byBjb2xsZWN0IHRoZSBsaW5rZWQgZWxlbWVudHMgaW4gdGhpcwotCSAqICAgICAgICAgICAgY29udGVudCwgaWYgbnVsbCwgbm8gbGlua2VkIGVsZW1lbnRzIGFyZSBjb2xsZWN0ZWQuCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHZhbGlkYXRlZCBjb250ZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGVDb250ZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHNvdXJjZSwKLQkJCUlDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdHJ5IHsKLQkJCS8vIGZpcnN0IHZhbGlkYXRlIHRoZSB0YWdzLCByZW1vdmUgYW55IENGL0xGIGZyb20gdGhlIHRhZyB0ZXh0Ci0JCQlzb3VyY2UgPSB2YWxpZGF0ZVRhZyhzb3VyY2UpOwotCi0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlNYXRjaGVyIG0gPSBwX2xpbmtfcmVmLm1hdGNoZXIoc291cmNlKTsKLQotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBtLmdyb3VwKCk7Ci0KLQkJCQkvLyBQcm9ibGVtcyBwYXJzaW5nIDxhIGhyZWY+IHRhZ3MKLQkJCQkvLyBuZWVkIHRvIHJlbW92ZSBhbGwgTEYsIENSIHdpdGhpbiB0aGUgPGEgLi4+IHRhZwotCQkJCVN0cmluZyB1cmx0ZXh0ID0gbS5ncm91cCgxKTsKLQkJCQlTdHJpbmcgbGlua2VkVGV4dCA9IG0uZ3JvdXAoMik7Ci0JCQkJTGlua0luZm8gaW5mbyA9IHZhbGlkYXRvci52YWxpZGF0ZUxpbmsoZWxlbWVudCwgdXJsdGV4dCwKLQkJCQkJCWxpbmtlZFRleHQsIGNvbmZpZyk7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQl0ZXh0ID0gaW5mby5nZXRIdG1sKHZhbGlkYXRvci5zaG93QnJva2VuTGlua3MoKSkudG9TdHJpbmcoKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gaW5mby5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCXZhbGlkYXRvci5hZGRSZWZlcmVuY2VkRWxlbWVudChlbGVtZW50LCBlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCVN0cmluZyByZXBsYWNlbWVudCA9IHRleHQucmVwbGFjZUFsbCgiZmlsZTovLy8iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQucmVwbGFjZUFsbCgiZmlsZTovLyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCQotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIHJlZ0V4cEVzY2FwZShyZXBsYWNlbWVudCkpOwotCQkJfQotCi0JCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCQl9Ci0KLQkJCS8vIGFsc28gZml4IHRoZSBhcmVhIG1hcAotCQkJc291cmNlID0gc2IudG9TdHJpbmcoKTsKLQkJCW0gPSBwX2FyZWFfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJCXNiLnNldExlbmd0aCgwKTsKLQotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCS8vIFN0cmluZyB0ZXh0ID0gbS5ncm91cCgpOwotCQkJCVN0cmluZyBocmVmID0gbS5ncm91cCgyKTsKLQkJCQlTdHJpbmcgZ3VpZCA9IG51bGw7Ci0JCQkJaWYgKCAhaXNKYXZhc2NyaXB0VXJsKGhyZWYpICkgewotCQkJCQlndWlkID0gZ2V0R3VpZEZyb21GaWxlTmFtZShocmVmKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBtYW5hZ2VyICE9IG51bGwgPyBtYW5hZ2VyCi0JCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCkgOiBudWxsOwotCQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBzaG91bGQgcmVhbGl6ZSB0aGUgZWxlbWVudCwgYW5kIGdldCB0aGUgcmVhbGl6ZWQgb25lCi0JCQkJCQlNZXRob2RFbGVtZW50IGUxID0gQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJCQkuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoZSwgY29uZmlnKTsKLQkJCQkJCWlmIChlMSAhPSBudWxsKSB7Ci0JCQkJCQkJZSA9IGUxOwotCQkJCQkJfQotCi0JCQkJCQl2YWxpZGF0b3IuYWRkUmVmZXJlbmNlZEVsZW1lbnQoZWxlbWVudCwgZSk7Ci0KLQkJCQkJCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKGUsIGNvbmZpZykKLQkJCQkJCQkJJiYgIXZhbGlkYXRvci5pc0Rpc2NhcmRlZChlbGVtZW50LCBudWxsLCBlKSkgewotCQkJCQkJCWhyZWYgPSBnZXRVcmwoZSwgZWxlbWVudCwgRklMRV9FWFRfSFRNTCwgaHJlZik7Ci0JCQkJCQl9IGVsc2UgaWYgKCB2YWxpZGF0b3Iuc2hvd0Jyb2tlbkxpbmtzKCkgKXsKLQkJCQkJCQlocmVmID0gZ2V0RGlzY2FyZGVkRWxlbWVudFVSTChlbGVtZW50LCBlLCBndWlkLAotCQkJCQkJCQkJKChEZWZhdWx0Q29udGVudFZhbGlkYXRvcikgdmFsaWRhdG9yKQotCQkJCQkJCQkJCQkuZ2V0UHVibGlzaERpcigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaHJlZiA9ICIiOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaHJlZiA9IFVSTERlY29kZXIuZGVjb2RlKGhyZWYsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJU3RyaW5nIHJlcGxhY2VtZW50OwkJCQotCQkJCWlmICggaHJlZiA9PSBudWxsIHx8IGhyZWYubGVuZ3RoKCkgPT0gMCApIHsKLQkJCQkJcmVwbGFjZW1lbnQgPSBzb3VyY2Uuc3Vic3RyaW5nKG0uc3RhcnQoKSwgbS5zdGFydCgxKSkKLQkJCQkJKyBzb3VyY2Uuc3Vic3RyaW5nKG0uZW5kKDEpLCBtLmVuZCgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXBsYWNlbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobS5zdGFydCgpLCBtLnN0YXJ0KDIpKQotCQkJCQkJKyBocmVmICsgc291cmNlLnN1YnN0cmluZyhtLmVuZCgyKSwgbS5lbmQoKSk7Ci0JCQkJfQotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIHJlZ0V4cEVzY2FwZShyZXBsYWNlbWVudCkpOwotCQkJfQotCi0JCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCQkvLyBTaGFwZSBpY29uIGJyb2tlbiBpbiBwcmV2aWV3IGFuZCBicm93c2luZwotCQkJLy8gLy8gbmVlZCB0byBkZWNvZGUgdGhlIGltYWdlIHBhdGggdW5sZXNzIHdlIGNhbiBkaXNhYmxlIHRoZSB1cmwKLQkJCS8vIGVuY29kaW5nIGluIHhzbHQKLQkJCS8vIHNvdXJjZSA9IHNiLnRvU3RyaW5nKCk7Ci0JCQkvLyBzYi5zZXRMZW5ndGgoMCk7Ci0JCQkvLyBtID0gUmVzb3VyY2VIZWxwZXIucF9pbWFnZV9yZWYubWF0Y2hlcihzb3VyY2UpOwotCQkJLy8gd2hpbGUgKCBtLmZpbmQoKSApCi0JCQkvLyB7Ci0JCQkvLyBTdHJpbmcgdXJsID0gbS5ncm91cCgzKTsKLQkJCS8vIHVybCA9IFVSTERlY29kZXIuZGVjb2RlKHVybCwgIlVURi04Iik7Ci0JCQkvLyBtLmFwcGVuZFJlcGxhY2VtZW50KHNiLCBtLmdyb3VwKDEpICsgdXJsICsgbS5ncm91cCg0KSk7Ci0JCQkvLyB9Ci0JCQkvLyBtLmFwcGVuZFRhaWwoc2IpOwotCQkJLy8gcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0KLQkJCS8vIGRlY29kZSB0aGUgdXJscwotCQkJcmV0dXJuIGRlY29kZVVybHNJbkNvbnRlbnQoc2IudG9TdHJpbmcoKSk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogZGVjb2RlIHRoZSB1cmxzIGluIHRoZSBjb250ZW50LiBDb250ZW50IGZyb20geHNsdCBvdXRwdXQgYXJlIGVuY29kZWQuIFdlCi0JICogZG9uJ3Qgd2FudCB0aGlzIHRvIGJlIGVuY29kZWQgc2luY2UgdGhlIGJyb3dzZXIgbWF5IGRlY29kZSBpdCBpbiBhIHdyb25nCi0JICogZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZVVybHNJbkNvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKLQkJdHJ5IHsKLQkJCS8vIFNoYXBlIGljb24gYnJva2VuIGluIHByZXZpZXcgYW5kIGJyb3dzaW5nCi0JCQkvLyBuZWVkIHRvIGRlY29kZSB0aGUgaW1hZ2UgcGF0aCB1bmxlc3Mgd2UgY2FuIGRpc2FibGUgdGhlIHVybAotCQkJLy8gZW5jb2RpbmcgaW4geHNsdAotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJTWF0Y2hlciBtID0gUmVzb3VyY2VIZWxwZXIucF91cmxfZGVjb2Rlci5tYXRjaGVyKGNvbnRlbnQpOwotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMyk7Ci0JCQkJdXJsID0gVVJMRGVjb2Rlci5kZWNvZGUodXJsLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB0ZXh0ID0gbS5ncm91cCgxKSArIHVybCArIG0uZ3JvdXAoNCk7Ci0JCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHRleHQpKTsgCQotCQkJfQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0KLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogZXNjYXBlIHRoZSByZWdleHAgcmVzZXJ2ZWQgd29yZHMsIHN1Y2ggYXMgJAotCSAqIEBwYXJhbSB0ZXh0IFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVnRXhwRXNjYXBlKFN0cmluZyB0ZXh0KSB7Ci0JCS8vIGVzY2FwZSB0aGUgcmVnRXhwIHJlc2VydmVkIHdvcmRzLAotCQkvLyB0aGUgJCBzaWduIGlzIHJlc2VydmVkIGZvciBncm91cCBtYXRjaGluZyAKLQkJaW50IGk9dGV4dC5pbmRleE9mKCckJyk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCBpIDwgMCApIHsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCQotCQlpbnQgc3RhcnQgPSAwOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl3aGlsZSAoIGkgPiBzdGFydCApIHsKLQkJCWJ1ZmZlci5hcHBlbmQodGV4dC5zdWJzdHJpbmcoc3RhcnQsIGkpKS5hcHBlbmQoIlxcIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN0YXJ0ID0gaTsKLQkJCWk9dGV4dC5pbmRleE9mKCckJywgc3RhcnQrMSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJYnVmZmVyLmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhzdGFydCkpOwotCQkKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBmaXggdGhlIGVsZW1lbnQgdXJsIGluIHRoZSB1cmx0ZXh0LiB0aGUgdGV4dCBpcyB0aGUgcGFydCBmcm9tIHRoZQotCSAqIHBfbGlua19yZWYgcGF0dGVybiBtYXRjaAotCSAqIAotCSAqIEBwYXJhbSB1cmx0ZXh0Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgTWV0aG9kQ29uZmlndXJhdGlvbiB0aGUgY29uZmlndXJhdGlvbiB0byB3aGljaCB0aGUgY29udGVudCBpcwotCSAqICAgICAgICAgICAgdmFsaWRhdGVkCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpeGVkIHRleHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaXhFbGVtZW50VXJsKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHVybHRleHQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlNYXRjaGVyIG0gPSBwX2xpbmtfaHJlZl9waWNrZXIubWF0Y2hlcigiICIgKyB1cmx0ZXh0ICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgdXJsID0gbS5ncm91cCgxKTsKLQkJCVN0cmluZyBuZXd1cmwgPSBudWxsOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21VcmwodXJsdGV4dCk7Ci0JCQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChndWlkKSA6IG51bGw7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCQkJCWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KGUsCi0JCQkJCQkJCQljb25maWcpOwotCQkJCQkJfQotCQkJCQkJbmV3dXJsID0gZ2V0VXJsKGUsIGVsZW1lbnQsIEZJTEVfRVhUX0hUTUwsIHVybCk7Ci0JCQkJCX0KLQotCQkJCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBudWxsLCB3ZSBzaG91bGQgcmVtb3ZlIHRoZSB1cmwgbGluayBhbmQKLQkJCQkJLy8gbG9nIGFuIGVycm9yCi0JCQkJCS8vIFRPRE8KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuZXd1cmwgIT0gbnVsbCAmJiAhbmV3dXJsLmVxdWFscyh1cmwpKSB7Ci0JCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gIiBocmVmPVwiIiArIG5ld3VybCArICJcIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUocmVwbGFjZW1lbnQpKTsKLQkJCQltLmFwcGVuZFRhaWwoc2IpOwotCQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdXJsdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQgbGluayB0eXBlIGZvciB0aGUgdXJsCi0JICogQHBhcmFtIHNvdXJjZSBTdHJpbmcgdGhlIGxpbmsKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdHlwZSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50TGlua1R5cGUoU3RyaW5nIHNvdXJjZSkgewotCQlNYXRjaGVyIG0gPSBwX2xpbmtfdHlwZV9waWNrZXIubWF0Y2hlcigiICIgKyBzb3VyY2UgKyAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlyZXR1cm4gbS5ncm91cCgxKS50cmltKCkucmVwbGFjZUFsbCgiXCIiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBndWlkIGZyb20gdGhlIHVybAotCSAqIEBwYXJhbSBzb3VyY2UgU3RyaW5nIHRoZSB1cmwKLQkgKiBAcmV0dXJuIFN0cmlnbiB0aGUgZ3VpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEd1aWRGcm9tVXJsKFN0cmluZyBzb3VyY2UpIHsKLQkJTWF0Y2hlciBtID0gcF9saW5rX2d1aWRfcGlja2VyLm1hdGNoZXIoIiAiICsgc291cmNlICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChtLmZpbmQoKSkgewotCQkJcmV0dXJuIG0uZ3JvdXAoMSkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCW0gPSBwX2xpbmtfaHJlZl9waWNrZXIubWF0Y2hlcigiICIgKyBzb3VyY2UgKyAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgaHJlZiA9IG0uZ3JvdXAoMSkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBnZXRHdWlkRnJvbUZpbGVOYW1lKGhyZWYpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogaGFuZGxlIGEgYnVnIGluIElFLiBhbmNob3IgdGFnIGNhbid0IGhhdmUgQ1IgTEYsIGxpa2UgPEEgXHJcbgotCSAqIGhyZWY9Ind3dy55YWhvby5jb20iIFxyXG4+IHNjYW4gdGhlIHN0cmluZyBzb3VyY2UsIGZpbmQgYWxsIGFuY2hvciB0YWdzCi0JICogYW5kIHJlcGxhY2Ugd2l0aCBzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpeGVkIHNvdXJjZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlVGFnKFN0cmluZyBzb3VyY2UpIHsKLQkJLy8gUGF0dGVybiBwX2FuY2hvcl9yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoIigqKz8pPSgqLj8pIiwKLQkJLy8gUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOwotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTWF0Y2hlciBtID0gcF90YWdfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJLy8gU3RyaW5nQnVmZmVyIHRlbXBTYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gbS5ncm91cCgpOwotCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gZml4VGFnQXR0cmlidXRlKHRleHQpOwotCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCX0KLQotCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGZpeCB0YWcgYXR0cmlidXRlCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZml4VGFnQXR0cmlidXRlKFN0cmluZyBzb3VyY2UpIHsKLQkJLy8gc2ltcGx5IHJlcGxhY2UgYWxsIENSIExGIHdpdGggJyAnLCBmaW5lIHR1bmUgbGF0ZXIKLQkJcmV0dXJuIHNvdXJjZQotCQkJCS5yZXBsYWNlQWxsKCJcXFxyXFxcbiIsICIgIikucmVwbGFjZUFsbCgiXFxcciIsICIgIikucmVwbGFjZUFsbCgiXFxcbiIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByZXNvdXJjZSBmaWxlIHVybCByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSByb290Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRoaXMgcmVzb3VyY2UKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgRmlsZSB0aGUgcmVzb3VyY2UncyBwaHlzaWNhbCBwYXRoCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHVybCB0byB0aGlzIHJlc291cmNlIGZyb20gdGhlIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZUZpbGVVcmwoTWV0aG9kRWxlbWVudCBlLCBGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGZpbGVVcmwgPSBnZXRGaWxlVXJsKGZpbGUpOwotCQkvLyBTdHJpbmcgZWxlbWVudFBhdGggPQotCQkvLyBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UmVzb3VyY2VQYXRoKGUpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLAotCQkvLyAnLycpOwotCi0JCWZpbGVVcmwgPSBSZXNvdXJjZUhlbHBlci5nZXRCYWNrUGF0aChlKSArIGZpbGVVcmw7Ci0KLQkJcmV0dXJuIGZpbGVVcmw7Ci0KLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGZpbGUncyByZWxhdGl2ZSBwYXRoIHRvIHRoZSBwbHVnaW4gcm9vdAotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlVXJsKEZpbGUgZikgewotCQlTdHJpbmcgcGF0aCA9IGdldEZpbGVSZWxQYXRoKGYpOwotCQlwYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBVUkkgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBiYXNlCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gamF2YS5uZXQuVVJJCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0UmVsYXRpdmVVUkkoVVJJIHVyaSwgU3RyaW5nIHJvb3RQYXRoKSB7Ci0JCXJldHVybiBnZXRSZWxhdGl2ZVVSSSh1cmksIG5ldyBGaWxlKHJvb3RQYXRoKS50b1VSSSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIFVSSSByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIGJhc2UKLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBqYXZhLm5ldC5VUkkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRSZWxhdGl2ZVVSSShVUkkgdXJpLCBVUkkgcmVsYXRpdmVUbykgewotCQlVUkkgcmVsVXJpID0gcmVsYXRpdmVUby5yZWxhdGl2aXplKHVyaSk7Ci0JCXJldHVybiByZWxVcmk7Ci0JfQotCi0JLyoqCi0JICogcmVzb2x2ZSB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgbGlicmFyeSByb290Ci0JICogCi0JICogQHBhcmFtIGYKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgcmFsdGl2ZSBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZVJlbFBhdGgoRmlsZSBmKSB7Ci0JCUZpbGUgbGlicmFyeVJvb3RQYXRoID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSk7Ci0JCVN0cmluZyByb290ID0gbGlicmFyeVJvb3RQYXRoLmdldEFic29sdXRlUGF0aCgpOwotCQlTdHJpbmcgcGF0aCA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCWlmIChwYXRoLnN0YXJ0c1dpdGgocm9vdCkpIHsKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZyhyb290Lmxlbmd0aCgpKTsKLQkJfQotCi0JCWlmIChwYXRoLnN0YXJ0c1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7Ci0JCX0KLQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIFVSSSByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSByb290Ci0JICogCi0JICogQHBhcmFtIGYKLQkgKiBAcmV0dXJuIGphdmEubmV0LlVSSQotCSAqLwotCXB1YmxpYyBzdGF0aWMgamF2YS5uZXQuVVJJIGdldEZpbGVSZWxhdGl2ZVVSSShGaWxlIGYpIHsKLQkJRmlsZSBsaWJyYXJ5Um9vdFBhdGggPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKTsKLQkJamF2YS5uZXQuVVJJIGxpYlVSSSA9IGxpYnJhcnlSb290UGF0aC50b1VSSSgpOwotCQlqYXZhLm5ldC5VUkkgZmlsZVVSSSA9IGYudG9VUkkoKTsKLQkJamF2YS5uZXQuVVJJIHJlbFVyaSA9IGxpYlVSSS5yZWxhdGl2aXplKGZpbGVVUkkpOwotCi0JCXJldHVybiByZWxVcmk7Ci0JfQotCi0JLyoqCi0JICogY29weSB0aGUgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEBwYXJhbSBkZXN0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvcHlGaWxlKEZpbGUgc291cmNlLCBGaWxlIGRlc3QpIHsKLQkJaWYgKChzb3VyY2UgPT0gbnVsbCkgfHwgIXNvdXJjZS5leGlzdHMoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJYm9vbGVhbiBuZWVkQ29weSA9IHRydWU7Ci0JCWlmIChkZXN0LmV4aXN0cygpKSB7Ci0JCQluZWVkQ29weSA9IChkZXN0Lmxhc3RNb2RpZmllZCgpICE9IHNvdXJjZS5sYXN0TW9kaWZpZWQoKSkKLQkJCQkJfHwgKGRlc3QubGVuZ3RoKCkgIT0gc291cmNlLmxlbmd0aCgpKTsKLQkJfQotCi0JCWlmIChuZWVkQ29weSkgewotCQkJRmlsZSBwYXJlbnQgPSBkZXN0LmdldFBhcmVudEZpbGUoKTsKLQkJCWlmICghcGFyZW50LmV4aXN0cygpKSB7Ci0JCQkJcGFyZW50Lm1rZGlycygpOwotCQkJfQotCi0JCQl0cnkgewotCQkJCWlmICghZGVzdC5leGlzdHMoKSkgewotCQkJCQlkZXN0LmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQl9Ci0KLQkJCQlGaWxlVXRpbC5jb3B5RmlsZShzb3VyY2UsIGRlc3QpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGZpbGUgVVJMIGZvciBhbiBhdHRhY2htZW50Ci0JICogCi0JICogQHBhcmFtIGF0dGFjaG1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGF0dGFjaAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgTWV0aG9kRWxlbWVudCByZWZlcmVuY2luZyB0aGUgZmlsZQotCSAqIEBwYXJhbSBjb3B5RmlsZQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgd2lsbCBjb3B5IHRoZSBmaWxlIChpZiBpdCBpc24ndCBhbHJlYWR5IGluIHRoZSBwbHVnaW4KLQkgKiAgICAgICAgICAgIHBhdGgpCi0JICogQHJldHVybiBVUkwgb2YgdGhlIGZvcm0gLi8uLi8mbHQ7cm9sZXMmZ3Q7L3Jlc291cmNlcy8mbHQ7ZmlsZW5hbWUgb2YKLQkgKiAgICAgICAgIGF0dGFjaG1lbnQmZ3Q7Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVSTEZvckF0dGFjaG1lbnQoRmlsZSBhdHRhY2htZW50LAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGNvcHlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgbGliRGlyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKTsKLQkJU3RyaW5nIHBsdWdpbkRpciA9IEZpbGVVdGlsLmFwcGVuZFNlcGFyYXRvcihuZXcgRmlsZShVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KQotCQkJCS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCkpOwotCQlGaWxlIGZvcm1hdEZpbGUgPSBudWxsOwotCQlpZiAoYXR0YWNobWVudC5nZXRBYnNvbHV0ZVBhdGgoKS5zdGFydHNXaXRoKHBsdWdpbkRpcikpIHsKLQkJCWZvcm1hdEZpbGUgPSBhdHRhY2htZW50OwotCQl9IGVsc2UgewotCQkJU3RyaW5nIHJlc291cmNlTG9jID0gbGliRGlyICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmdldFJlc291cmNlUGF0aChlbGVtZW50KTsKLQkJCS8vIEZpbGUgcmVzb3VyY2VEaXIgPSBuZXcgRmlsZShyZXNvdXJjZUxvYyk7Ci0JCQlmb3JtYXRGaWxlID0gbmV3IEZpbGUocmVzb3VyY2VMb2MgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIGF0dGFjaG1lbnQuZ2V0TmFtZSgpKTsKLQkJCWlmIChjb3B5RmlsZSkgewotCQkJCUZpbGVVdGlsLmNvcHlmaWxlKGF0dGFjaG1lbnQsIGZvcm1hdEZpbGUpOwotCQkJCUlSZXNvdXJjZSB3c1Jlc291cmNlID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihmb3JtYXRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQlpZih3c1Jlc291cmNlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUZpbGVNYW5hZ2VyLnJlZnJlc2god3NSZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLmdldFJlbGF0aXZlUGF0aFRvRmlsZUZyb21FbGVtZW50KGVsZW1lbnQsCi0JCQkJZm9ybWF0RmlsZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBhdHRhY2htZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGhUb0ZpbGVGcm9tRWxlbWVudCgKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRmlsZSBhdHRhY2htZW50KSB7Ci0JCVN0cmluZyBsaWJEaXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpOwotCQkvLyBTdHJpbmcgcGx1Z2luRGlyID0gbmV3Ci0JCS8vIEZpbGUoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCkuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCQlTdHJpbmcgZWxlbWVudExvYyA9IGxpYkRpciArIEZpbGUuc2VwYXJhdG9yICsgZ2V0RWxlbWVudFBhdGgoZWxlbWVudCk7Ci0JCXJldHVybiBGaWxlVXRpbC5nZXRSZWxhdGl2ZVBhdGgoYXR0YWNobWVudCwgbmV3IEZpbGUoZWxlbWVudExvYykpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBwYXRoIG5hbWUgb2YgdGhlIHR5cGUgb2YgZGlhZ3JhbSBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiAgICAgICAgICAgIFN0cmluZyBkaWFncmFtIHR5cGUgZGVmaW5lZCBpbiBvbmUgb2YgdGhlIGRpYWdyYW0gdHlwZQotCSAqICAgICAgICAgICAgY29uc3RhbnRzCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSByb290Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlhZ3JhbUZpbGVQYXRoTmFtZShNZXRob2RFbGVtZW50IGUsCi0JCQlTdHJpbmcgZGlhZ3JhbVR5cGUpIHsKLQkJLy8gSW5zdGFuY2VzIG9mIHRoZSBzYW1lIGFjdGl2aXR5L0NQIHNoYXJlIHRoZQotCQkvLyBzYW1lIGRpYWdyYW0gaW4gYSBEZWxpdmVyeSBQcm9jZXNzCi0JCS8vIG5lZWQgdG8gbWFrZSB0aGUgbmFtZSB1bmlxdWUKLQkJcmV0dXJuIGdldEVsZW1lbnRSZXNvdXJjZVBhdGgoZSkKLQkJCQkrIFN0clV0aWwucmVtb3ZlU3BlY2lhbENoYXJhY3RlcnMoZS5nZXROYW1lKCkpCi0JCQkJKyAiXyIgKyBlLmdldEd1aWQoKSArICJfIiArIGRpYWdyYW1UeXBlICsgRklMRV9FWFRfSlBFRzsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotLy8JCXJldHVybiBnZXRFbGVtZW50UmVzb3VyY2VQYXRoKGUpCi0vLwkJKyBTdHJVdGlsLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKAotLy8JCQkJTmFtZUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0RmlsZU5hbWUoZS5nZXRHdWlkKCkpLnJlcGxhY2VBbGwoIi5odG1sIiwgIiIpKSArICJfIiArIGRpYWdyYW1UeXBlICsgRklMRV9FWFRfSlBFRzsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUkVGSVhfMiA9ICJmaWxlOi8vIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUkVGSVhfMyA9ICJmaWxlOi8vLyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGdldCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZmlsZSBiYXNlZCBvbiB0aGUgdXJsCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgU3RyaW5nIHRoZSB1cmwKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgcGF0aCBvZiB0aGUgY29udGVudCB0aGF0IGNvbnRhaW5zIHRoaXMgdXJsCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgY29udGVudCBwdWJsaXNoaW5nIHJvb3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlUGF0aEZyb21VcmwoU3RyaW5nIHVybCwgU3RyaW5nIGNvbnRlbnRQYXRoKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvY2Vzc2luZyBpbWFnZSB1cmwgWyIgKyB1cmwgKyAiXSIpOwotCQlpZiAoaXNFeHRlcm5hbExpbmsodXJsKQotCQkJCXx8IHVybC5zdGFydHNXaXRoKCJtYWlsdG86IikgfHwgdXJsLnN0YXJ0c1dpdGgoVVJMX0JPT0tNQVJLX0lORElDQVRPUikpIC8vJE5PTi1OTFMtMSQgCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaW50IGluZGV4ID0gdXJsLmluZGV4T2YoRklMRV9QUkVGSVhfMyk7Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKEZJTEVfUFJFRklYXzMubGVuZ3RoKCkpOwotCQl9Ci0KLQkJaW5kZXggPSB1cmwuaW5kZXhPZihGSUxFX1BSRUZJWF8yKTsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCXVybCA9IHVybC5zdWJzdHJpbmcoRklMRV9QUkVGSVhfMi5sZW5ndGgoKSk7Ci0JCX0KLQotCQlGaWxlIGYgPSBuZXcgRmlsZShjb250ZW50UGF0aCk7Ci0JCWludCBzdGFydCA9IDA7Ci0JCWluZGV4ID0gMDsKLQkJd2hpbGUgKChmICE9IG51bGwpICYmIChpbmRleCA9IHVybC5pbmRleE9mKCIuLi8iLCBzdGFydCkpID49IDApIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJZiA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJc3RhcnQgPSBpbmRleCArIDM7Ci0JCX0KLQotCQlTdHJpbmcgcm9vdEZvbGRlciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChmICE9IG51bGwpIHsKLQkJCXJvb3RGb2xkZXIgPSBmLmdldFBhdGgoKTsKLQkJfQotCi0JCWlmIChyb290Rm9sZGVyLmxlbmd0aCgpID4gMCAmJiAhcm9vdEZvbGRlci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCXJvb3RGb2xkZXIgKz0gRmlsZS5zZXBhcmF0b3I7Ci0JCX0KLQotCQkvLyB0aGUgZmlsZSBwYXRoIGlzCi0JCVN0cmluZyBwYXRoID0gcm9vdEZvbGRlcgotCQkJCSsgdXJsLnN1YnN0cmluZyhzdGFydCkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLQkJcmV0dXJuIFhNTFV0aWwudW5lc2NhcGUoTmV0VXRpbC5kZWNvZGVkRmlsZVVybChwYXRoKSk7Ci0JfQotCi0JLyoqCi0JICogZm9yIHRoZSBnaXZlbiBjb250ZW50IHdpdGggdXJsIGJhc2VkIG9uIHRoZSBvbGRDb250ZW50UGF0aCwgcmVzb2x2ZSB0bwotCSAqIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjb250ZW50UGF0aC4gSWYgYmFja3BhdGggaXMKLQkgKiBzcGVjaWZpZWQsIGFkZCB0aGUgYmFja1BhdGguIHJldHVybiB0aGUgdXBkYXRlZCBjb250ZW50LiBBIHR5cGljYWwKLQkgKiBzY2VuYXJpbyBpcyB0aGUgY29udGVudCBpcyBmcm9tIGEgY29udHJpYnV0aW5nIGVsZW1lbnQsIHdoaWNoIGhhcyB1cmxzCi0JICogcmVsYXRpdmUgdG8gdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50J3MgY29udGVudFBhdGguIFRoaXMgbWV0aG9kIHdpbGwgZml4Ci0JICogdGhlIHVybCB0byBiYXNlZCBvbiB0aGUgYmFzZSBlbGVtZW50J3MgY29udGVudFBhdGguCi0JICogCi0JICogU28gY2FsbCBmaXhDb250ZW50VXJsUGF0aChjb250cmlidXRvcl90ZXh0LCBjb250cmlidXRvcl9lbGVtZW50UGF0aCwKLQkgKiBiYXNlRWxlbWVudF9iYWNrUGF0aCkKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudAotCSAqIEBwYXJhbSBjb250ZW50UGF0aAotCSAqIEBwYXJhbSBvbGRDb250ZW50UGF0aAotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSB1cGRhdGVkIGNvbnRlbnQgd2l0aCBmaXhlZCBwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpeENvbnRlbnRVcmxQYXRoKFN0cmluZyBjb250ZW50LCBTdHJpbmcgY29udGVudFBhdGgsCi0JCQlTdHJpbmcgYmFja1BhdGgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cnkgewotCQkJLy8gcHJvY2VzcyBpbWFnZXMKLQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfaW1hZ2VfcmVmLm1hdGNoZXIoY29udGVudCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgzKTsKLQkJCQl1cmwgPSByZXNvbHZlVXJsKHVybCwgY29udGVudFBhdGgsIGJhY2tQYXRoKTsKLQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKG0uZ3JvdXAoMSkgKyB1cmwgKyBtLmdyb3VwKDQpKSk7Ci0JCQkJfQotCQkJfQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQotCQkJY29udGVudCA9IHNiLnRvU3RyaW5nKCk7Ci0JCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQkJLy8gcHJvY2VzcyBhdHRhY2htZW50cwotCQkJbSA9IFJlc291cmNlSGVscGVyLnBfbGlua19yZWZfZ2VuLm1hdGNoZXIoY29udGVudCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmdCdWZmZXIgc2JMaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCS8vIFN0cmluZyB0YWcgPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyB1cmx0ZXh0ID0gIiAiICsgbS5ncm91cCgyKSArICIgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJaWYgKFJlc291cmNlSGVscGVyLmdldEd1aWRGcm9tVXJsKHVybHRleHQpID09IG51bGwpIHsKLQkJCQkJTWF0Y2hlciBtMiA9IFJlc291cmNlSGVscGVyLnBfbGlua19ocmVmX3BpY2tlcgotCQkJCQkJCS5tYXRjaGVyKHVybHRleHQpOwotCQkJCQlpZiAobTIuZmluZCgpKSB7Ci0JCQkJCQlTdHJpbmcgdXJsID0gbTIuZ3JvdXAoMSkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCXVybCA9IHJlc29sdmVVcmwodXJsLCBjb250ZW50UGF0aCwgYmFja1BhdGgpOwotCQkJCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gdXJsdGV4dC5zdWJzdHJpbmcobTIuc3RhcnQoKSwgbTIuc3RhcnQoMSkpCi0JCQkJCQkJCQkrIHVybAotCQkJCQkJCQkJKyB1cmx0ZXh0LnN1YnN0cmluZyhtMi5lbmQoMSksIG0yLmVuZCgpKTsKLQkJCQkJCQkKLQkJCQkJCQltMi5hcHBlbmRSZXBsYWNlbWVudChzYkxpbmssIHJlZ0V4cEVzY2FwZShyZXBsYWNlbWVudCkpOwotCQkJCQkJCW0yLmFwcGVuZFRhaWwoc2JMaW5rKTsKLQkJCQkJCQkKLQkJCQkJCQlyZXBsYWNlbWVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKG0uc3RhcnQoKSwgbS5zdGFydCgyKSkKLQkJCQkJCQkJCSsgc2JMaW5rLnRvU3RyaW5nKCkgKyBjb250ZW50LnN1YnN0cmluZyhtLmVuZCgyKSwgbS5lbmQoKSk7Ci0JCQkJCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqIEBwYXJhbSBjb250ZW50UGF0aAotCSAqIEBwYXJhbSBiYWNrUGF0aAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVVybChTdHJpbmcgdXJsLCBTdHJpbmcgY29udGVudFBhdGgsCi0JCQlTdHJpbmcgYmFja1BhdGgpIHsKLQkJdXJsID0gZ2V0RmlsZVBhdGhGcm9tVXJsKHVybCwgY29udGVudFBhdGgpOwotCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCWlmIChiYWNrUGF0aCAhPSBudWxsKSB7Ci0JCQkJdXJsID0gYmFja1BhdGggKyB1cmw7Ci0JCQl9Ci0KLQkJCXJldHVybiB1cmwucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfVVJMX1NUQVJUX1dJVEggPSBMYXlvdXRSZXNvdXJjZXMKLQkJCS5nZXRTdHJpbmcoImV4dGVybmFsVXJsX3N0YXJ0V2l0aCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9leHRlcm5hbF91cmxfc3RhcnRXaXRoID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSIoIiArIEVYVEVSTkFMX1VSTF9TVEFSVF9XSVRIICsgIikiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgdXJsIG9yIG5vdAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlcm5hbExpbmsoU3RyaW5nIHVybCkgewotCQkvLyAxNjI5NjkgLSBSZWZpbmUgZXh0ZXJuYWwgbGluaydzIHJlZ3VsYXIgZXhwIGluIGVwZi5saWJyYXJ5L2xheW91dC9MYXlvdXRSZXNvdXJjZXMucHJvcGVydGllcwotCQkvLyBmaWxlOi8vIHNob3VsZCBiZSBleGNsdWRlZAotCQlpZiAoIHVybCA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQl1cmwgPSB1cmwudG9Mb3dlckNhc2UoKTsKLQkJaWYgKCB1cmwuc3RhcnRzV2l0aCgiZmlsZTovLyIpICkgeyAgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoIHVybC5zdGFydHNXaXRoKCJodHRwOi8vIikgCS8vJE5PTi1OTFMtMSQKLQkJCQl8fCB1cmwuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSAvLyROT04tTkxTLTEkCi0JCQkJfHwgdXJsLnN0YXJ0c1dpdGgoImZ0cDovLyIpICAvLyROT04tTkxTLTEkCi0JCQkJfHwgdXJsLnN0YXJ0c1dpdGgoInd3dy4iKSApIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCU1hdGNoZXIgbSA9IHBfZXh0ZXJuYWxfdXJsX3N0YXJ0V2l0aC5tYXRjaGVyKHVybCk7Ci0JCWlmIChtLmZpbmQoKSkgewotCQkJcmV0dXJuIChtLnN0YXJ0KDEpID09IDApOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhc2NyaXB0VXJsKFN0cmluZyB1cmwpIHsKLQkJaWYgKHVybCA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB1cmwuc3RhcnRzV2l0aChVUkxfU1RSX01BSUxUTykKLQkJCQl8fCB1cmwudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFVSTF9TVFJfSkFWQVNDUklQVCk7Ci0JfQotCQotCS8qKgotCSAqIGZpbmQgdGhlIHJlc291cmNlIGZpbGUgYmFzZWQgb24gdGhlIHVybCwgY29weSB0aGUgZmlsZSB0byB0aGUgZGVzdGluYXRpb24KLQkgKiBmb2xkZXIuIGlmIHRoZSBmaWxlIGlzIGFuIGh0bWwgYXR0YWNobWVudCwgc2NhbiB0aGUgZmlsZSByZWN1cnNpdmVseSBhbmQKLQkgKiBjb3B5IGNvbnRhaW5lZCBpbWFnZXMsIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQsIHRoZSBvd25lciBlbGVtZW50Ci0JICogQHBhcmFtIHJlc291cmNlRmlsZQotCSAqICAgICAgICAgICAgRmlsZSwgdGhlIHJlc291cmNlIGZpbGUKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIHVybCB0byBiZSBwcm9jZXNzZWQKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgY29udGVudCBwYXRoIG9mIHRoZSB1cmwgb3duZXIsIHJlbGF0aXZlIHRvIHRoZQotCSAqICAgICAgICAgICAgc291cmNlIHJvb3QgcGF0aAotCSAqIEBwYXJhbSBzb3VyY2VSb290UGF0aAotCSAqICAgICAgICAgICAgRmlsZSB0aGUgc291cmNlIHJvb3QgcGF0aCwgdXN1YWxseSBpdCdzIHRoZSBsaWJyYXJ5IHJvb3QgcGF0aAotCSAqIEBwYXJhbSB0YXJnZXRSb290UGF0aAotCSAqICAgICAgICAgICAgRmlsZSB0aGUgdGFyZ2V0IHJvb3QgcGF0aCwgdXN1YWxseSBpdCdzIHRoZSBwdWJsaXNoaW5nIHJvb3QKLQkgKiAgICAgICAgICAgIHBhdGgKLQkgKiBAcGFyYW0gcHJvY2Vzc2VkSXRlbXMKLQkgKiAgICAgICAgICAgIExpc3QsIGEgbGlzdCB0byBob2xkIGFsbCBwcm9jZXNzZWQgdXJscywgdG8gYXZvaWQgZHVwbGljYXRlCi0JICogICAgICAgICAgICBwcm9jZXNzaW5nCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqICAgICAgICAgICAgSUNvbnRlbnRWYWxpZGF0b3IKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgZml4ZWQgdXJsLCBub3QgdXNlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzUmVzb3VyY2VVcmwoTWV0aG9kRWxlbWVudCBvd25lciwKLQkJCUZpbGUgcmVzb3VyY2VGaWxlLCBTdHJpbmcgdXJsLCBTdHJpbmcgY29udGVudFBhdGgsCi0JCQlGaWxlIHNvdXJjZVJvb3RQYXRoLCBGaWxlIHRhcmdldFJvb3RQYXRoLCBMaXN0IHByb2Nlc3NlZEl0ZW1zLAotCQkJSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCWlmICh1cmwgPT0gbnVsbCB8fCBpc0V4dGVybmFsTGluayh1cmwpIHx8IGlzSmF2YXNjcmlwdFVybCh1cmwpCi0JCQkJfHwgdXJsLnN0YXJ0c1dpdGgoVVJMX0JPT0tNQVJLX0lORElDQVRPUikpIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQotCQkvLyBpZiB0aGUgdXJsIGNvbnRhaW5zIHRoZSBndWlkLCBpdCBtaWdodCBiZSBzb21lIGtpbmQgb2YgZWxlbWVudCBsaW5rLAotCQkvLyBmb3IgZXhhbXBsZSwgYWN0aXZpdHkgY2FuIGhhdmUgbW9kZWwgdGhhbiBvbmUgZWxlbWVudCBsaW5rCi0JCVN0cmluZyBndWlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG93bmVyICE9IG51bGwpIHsKLQkJCWd1aWQgPSBvd25lci5nZXRHdWlkKCk7Ci0JCQlpZiAodXJsLmluZGV4T2YoZ3VpZCkgPj0gMCB8fCAodXJsLmluZGV4T2Yob3duZXIuZ2V0TmFtZSgpLnRyaW0oKSkgPiAtMSAmJiAodXJsLmluZGV4T2YoRklMRV9FWFRfSFRNKSA+IC0xKSB8fCB1cmwuaW5kZXhPZihGSUxFX0VYVF9IVE1MKSA+IC0xKSkgewkJCQkKLQkJCQlyZXR1cm4gdXJsOwotCQkJfQkJCQotCQl9Ci0JCQotCQkvLyBQdWJsaXNoaW5nIHJlcG9ydCBsaXN0cyBtaXNzaW5nIHJlc291cmNlIGZpbGVzIHRoYXQKLQkJLy8gYXJlIHByZXNlbnQKLQkJLy8gYm9va21hcmtzIHNob3VsZCBiZSBzdHJpcHBlZCBvdXQgd2hlbiBjaGVja2luZyByZXNvdXJjZQotCQlpbnQgaW5kZXggPSB1cmwuaW5kZXhPZihVUkxfQk9PS01BUktfSU5ESUNBVE9SKTsKLQkJaWYgKGluZGV4IDwgMCkgewotCQkJaW5kZXggPSB1cmwuaW5kZXhPZihVUkxfUEFSQU1FVEVSX0lORElDQVRPUik7Ci0JCX0KLQotCQlTdHJpbmcgdXJsX3RhaWwgPSAiIjsKLQkJaWYgKGluZGV4ID4gMCkgewotCQkJdXJsX3RhaWwgPSB1cmwuc3Vic3RyaW5nKGluZGV4KTsKLQkJCXVybCA9IHVybC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9Ci0KLQkJU3RyaW5nIGltYWdlRmlsZSA9IFJlc291cmNlSGVscGVyLmdldEZpbGVQYXRoRnJvbVVybCh1cmwsIGNvbnRlbnRQYXRoKTsKLQkJaWYgKGltYWdlRmlsZSA9PSBudWxsKSB7Ci0JCQlpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCQl2YWxpZGF0b3IubG9nTWlzc2luZ1Jlc291cmNlKG93bmVyLCByZXNvdXJjZUZpbGUsIHVybCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGluZGV4Lmh0bSBpcyB0aGUgZGVmYXVsdCBpbmRleCBmaWxlLCBhbHdheXMgaWdub3JlIGl0Ci0JCWlmIChpbWFnZUZpbGUuZXF1YWxzSWdub3JlQ2FzZSgiaW5kZXguaHRtIikgfHwgaW1hZ2VGaWxlLmVxdWFsc0lnbm9yZUNhc2UoImluZGV4Lmh0bWwiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXsKLQkJCXJldHVybiB1cmwgKyB1cmxfdGFpbDsKLQkJfQotCi0JCVN0cmluZyBuZXdVcmwgPSB1cmw7Ci0KLQkJRmlsZSBzb3VyY2U7Ci0JCUZpbGUgZGVzdDsKLQkJLy8gY2hlY2sgaWYgdGhpcyBpcyBhIHJlYWwgZmlsZSwgaWYgbm90LCBpdCBpcyBhIHJlZmVyZW5jZSB0byBhIGJhc2UKLQkJLy8gcGx1Z2luCi0JCXNvdXJjZSA9IG5ldyBGaWxlKHNvdXJjZVJvb3RQYXRoLCBpbWFnZUZpbGUpOwotCi0JCS8vIGlmIHRoZSBmaWxlIGlzIG5vdCBpbiB0aGUgbGlicmFyeSwgY2hlY2sgdGhlIHBsdWdpbiBsYXlvdXQgZm9sZGVyCi0JCWlmICghc291cmNlLmV4aXN0cygpKSB7Ci0JCQlzb3VyY2UgPSBuZXcgRmlsZShMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXlvdXRQYXRoKCksCi0JCQkJCWltYWdlRmlsZSk7Ci0JCX0KLQotCQlkZXN0ID0gbmV3IEZpbGUodGFyZ2V0Um9vdFBhdGgsIGltYWdlRmlsZSk7Ci0KLQkJaWYgKHNvdXJjZS5leGlzdHMoKSkgewotCQkJUmVzb3VyY2VIZWxwZXIuY29weUZpbGUoc291cmNlLCBkZXN0KTsKLQotCQkJLy8gaWYgdGhlIGZpbGUgaXMgYW4gaHRtbCBhdHRhY2htZW50LCBuZWVkIHRvIHNjYW4gdGhlIGZpbGUgYW5kIGNvcHkKLQkJCS8vIHRoZSByZWZlcmVuY2VkIGZpbGUgaW4gaXQsIHJlY3Vyc2l2ZWx5Ci0JCQlpZiAoaW1hZ2VGaWxlLmVuZHNXaXRoKFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTSkKLQkJCQkJfHwgaW1hZ2VGaWxlLmVuZHNXaXRoKFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUwpKSB7Ci0JCQkJRmlsZSBmID0gbmV3IEZpbGUoaW1hZ2VGaWxlKTsKLQkJCQl0cnkgewotCQkJCQlyZXNvbHZlUmVzb3VyY2VzKG93bmVyLCBmLCBGaWxlVXRpbC5yZWFkRmlsZShzb3VyY2UsCi0JCQkJCQkJRmlsZVV0aWwuRU5DT0RJTkdfVVRGXzgpLnRvU3RyaW5nKCksIGYuZ2V0UGFyZW50KCksCi0JCQkJCQkJc291cmNlUm9vdFBhdGgsIHRhcmdldFJvb3RQYXRoLCBwcm9jZXNzZWRJdGVtcywKLQkJCQkJCQl2YWxpZGF0b3IpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgdGhlIGRlc3RpbmF0aW9uIGZpbGUgaXMgdGhlcmUsIG1pZ2h0IGJlIGdlbmVyYXRlZCBkeW5hbWljYWxseSwgc28KLQkJLy8gZG9uJ3QgbG9nIGl0Ci0JCWVsc2UgaWYgKCFkZXN0LmV4aXN0cygpICYmIGlzVmFsaWRGaWxlVXJsKHVybCkgJiYgKHZhbGlkYXRvciAhPSBudWxsKSkgewotCQkJdmFsaWRhdG9yLmxvZ01pc3NpbmdSZXNvdXJjZShvd25lciwgcmVzb3VyY2VGaWxlLCB1cmwpOwotCQl9Ci0KLQkJcmV0dXJuIG5ld1VybCArIHVybF90YWlsOwotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRmlsZVVybChTdHJpbmcgdXJsKSB7Ci0JCS8vIGp1c3QgYSB0ZW1wIHNvbHV0aW9uIGhlcmUgdG8gZ2V0IHJpZCBvZiB0aGUgd3JvbmcgcmVwb3J0aW5nIG9mIG1zc2luZwotCQkvLyByZXNvdXJjZQotCQlpZiAodXJsID09IG51bGwgfHwgdXJsLmVxdWFscygiJyArIGRpYWdyYW1faW1nICsgJyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIHJlc29sdmUgdGhlIGltYWdlcyBpbiB0aGUgdGV4dC4gY29weSB0aGUgaW1hZ2UgdG8gZGVzdGluYXRpb24gaWYgbmVlZGVkCi0JICogVGhpcyBpcyB1c2VkIGZvciBjb3B5aW5nIHJlc291cmNlcyBmcm9tIGEgbGlicmFyeSB0byBhbm90aGVyIGRlc3RpbmF0aW9uCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50LCB0aGUgb3duZXIgZWxlbWVudAotCSAqIEBwYXJhbSByZXNvdXJjZUZpbGUKLQkgKiAgICAgICAgICAgIEZpbGUsIHRoZSByZXNvdXJjZSBmaWxlCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgY29udGVudCBzdHJpbmcgdG8gYmUgcHJvY2Vzc2VkCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIGNvbnRlbnQgcGF0aCBvZiB0aGUgc291cmNlIHRleHQsIHJlbGF0aXZlIHRvIHRoZQotCSAqICAgICAgICAgICAgc291cmNlIHJvb3QgcGF0aAotCSAqIEBwYXJhbSBzb3VyY2VSb290UGF0aAotCSAqICAgICAgICAgICAgRmlsZSB0aGUgc291cmNlIHJvb3QgcGF0aCwgdXN1YWxseSBpdCdzIHRoZSBsaWJyYXJ5IHJvb3QgcGF0aAotCSAqIEBwYXJhbSB0YXJnZXRSb290UGF0aAotCSAqICAgICAgICAgICAgRmlsZSB0aGUgdGFyZ2V0IHJvb3QgcGF0aCwgdXN1YWxseSBpdCdzIHRoZSBwdWJsaXNoaW5nIHJvb3QKLQkgKiAgICAgICAgICAgIHBhdGgKLQkgKiBAcGFyYW0gcHJvY2Vzc2VkSXRlbXMKLQkgKiAgICAgICAgICAgIExpc3QsIGEgbGlzdCB0byBob2xkIGFsbCBwcm9jZXNzZWQgdXJscywgdG8gYXZvaWQgZHVwbGljYXRlCi0JICogICAgICAgICAgICBwcm9jZXNzaW5nCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqICAgICAgICAgICAgSUNvbnRlbnRWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZVJlc291cmNlcyhNZXRob2RFbGVtZW50IG93bmVyLCBGaWxlIHJlc291cmNlRmlsZSwKLQkJCVN0cmluZyBjb250ZW50LCBTdHJpbmcgY29udGVudFBhdGgsIEZpbGUgc291cmNlUm9vdFBhdGgsCi0JCQlGaWxlIHRhcmdldFJvb3RQYXRoLCBMaXN0IHByb2Nlc3NlZEl0ZW1zLAotCQkJSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRyeSB7Ci0JCQkvLyBwcm9jZXNzIGltYWdlcwotCQkJTWF0Y2hlciBtID0gUmVzb3VyY2VIZWxwZXIucF9pbWFnZV9yZWYubWF0Y2hlcihjb250ZW50KTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCVN0cmluZyB1cmwgPSBtLmdyb3VwKDMpOwotCQkJCWlmICghcHJvY2Vzc2VkSXRlbXMuY29udGFpbnModXJsKSkgewotCQkJCQkvLyBub3RlOiBhZGQgdGhlIHVybCBpbnRvIHRoZSBwcm9jZXNzZWRJdGVtcyBsaXN0IGZpcnN0LAotCQkJCQkvLyBvdGhlcndpc2UgbWF5IGdldCBkZWFkbG9jayBpZiB0aGUgdXJsIGNvbnRlbnQgaGFzCi0JCQkJCS8vIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBvd25lcgotCQkJCQlwcm9jZXNzZWRJdGVtcy5hZGQodXJsKTsKLQkJCQkJUmVzb3VyY2VIZWxwZXIucHJvY2Vzc1Jlc291cmNlVXJsKG93bmVyLCByZXNvdXJjZUZpbGUsIHVybCwKLQkJCQkJCQljb250ZW50UGF0aCwgc291cmNlUm9vdFBhdGgsIHRhcmdldFJvb3RQYXRoLAotCQkJCQkJCXByb2Nlc3NlZEl0ZW1zLCB2YWxpZGF0b3IpOwotCQkJCX0KLQkJCX0KLQotCQkJbSA9IFJlc291cmNlSGVscGVyLnBfY3NzX3JlZi5tYXRjaGVyKGNvbnRlbnQpOwotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nIGNzc1VSTCA9IG0uZ3JvdXAoMSk7Ci0KLQkJCQkvLyBpdCdzIGhhcmQgdG8gdGVsbCBpZiB0aGlzIGlzIGEgcmlnaHQgbWF0Y2ggb3Igbm90Ci0JCQkJLy8gc2luY2Ugd2UgY2FuJ3QgdGVsbCBpZiB0aGUgbWF0Y2hlZCBvbmUgaXMgYWN0dWFsbHkgZnJvbSBhIGNzcwotCQkJCS8vIG9yIGp1c3QgYSBodG1sIHRleHQKLQkJCQkvLyBmb3IgZXhhbXBsZSwgdGV4dCBjYW4gaGF2ZSBzb21ldGhpbmcgbGlrZSB1cmwoeHh4KSB3aGljaCBpcwotCQkJCS8vIG1hdGNoZWQgaGVyZQotCQkJCS8vIHdlIGRvbid0IHdhbnQgdG8gcmVwb3J0IG1pc3NpbmcgcmVzb3VyY2UgZm9yIHRoaXMKLQkJCQkvLyBzbyBkb24ndCBzZXQgdGhlIHZhbGlkYXRvcgotCQkJCS8vIFB1Ymxpc2hpbmcgd2FybmluZ3M6IGluYXBwcm9wcmlhdGUgd2FybmluZ3MKLQkJCQkvLyBjb21pbmcgZnJvbSByZXF1aXJlZCBjb3B5cml0ZS5odG0KLQotCQkJCWlmICghcHJvY2Vzc2VkSXRlbXMuY29udGFpbnMoY3NzVVJMKSkgewotCQkJCQkvLyBub3RlOiBhZGQgdGhlIHVybCBpbnRvIHRoZSBwcm9jZXNzZWRJdGVtcyBsaXN0IGZpcnN0LAotCQkJCQkvLyBvdGhlcndpc2UgbWF5IGdldCBkZWFkbG9jayBpZiB0aGUgdXJsIGNvbnRlbnQgaGFzCi0JCQkJCS8vIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBvd25lcgotCQkJCQlwcm9jZXNzZWRJdGVtcy5hZGQoY3NzVVJMKTsKLQkJCQkJUmVzb3VyY2VIZWxwZXIKLQkJCQkJCQkucHJvY2Vzc1Jlc291cmNlVXJsKG93bmVyLCByZXNvdXJjZUZpbGUsIGNzc1VSTCwKLQkJCQkJCQkJCWNvbnRlbnRQYXRoLCBzb3VyY2VSb290UGF0aCwKLQkJCQkJCQkJCXRhcmdldFJvb3RQYXRoLCBwcm9jZXNzZWRJdGVtcywgbnVsbC8qIHZhbGlkYXRvciAqLyk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBwcm9jZXNzIGF0dGFjaG1lbnRzCi0JCQltID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX3JlZl9nZW4ubWF0Y2hlcihjb250ZW50KTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCS8vIFN0cmluZyB0YWcgPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyB1cmx0ZXh0ID0gbS5ncm91cCgyKTsKLQkJCQlpZiAoUmVzb3VyY2VIZWxwZXIuZ2V0R3VpZEZyb21VcmwodXJsdGV4dCkgPT0gbnVsbCkgewotCQkJCQlNYXRjaGVyIG0yID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX2hyZWZfcGlja2VyCi0JCQkJCQkJLm1hdGNoZXIoIiAiICsgdXJsdGV4dCArICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlpZiAobTIuZmluZCgpKSB7Ci0JCQkJCQlTdHJpbmcgdXJsID0gbTIuZ3JvdXAoMSkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWlmICghcHJvY2Vzc2VkSXRlbXMuY29udGFpbnModXJsKSkgewotCQkJCQkJCS8vIG5vdGU6IGFkZCB0aGUgdXJsIGludG8gdGhlIHByb2Nlc3NlZEl0ZW1zIGxpc3QKLQkJCQkJCQkvLyBmaXJzdCwgb3RoZXJ3aXNlIG1heSBnZXQgZGVhZGxvY2sgaWYgdGhlIHVybAotCQkJCQkJCS8vIGNvbnRlbnQgaGFzIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBvd25lcgotCQkJCQkJCXByb2Nlc3NlZEl0ZW1zLmFkZCh1cmwpOwotCQkJCQkJCVJlc291cmNlSGVscGVyLnByb2Nlc3NSZXNvdXJjZVVybChvd25lciwKLQkJCQkJCQkJCXJlc291cmNlRmlsZSwgdXJsLCBjb250ZW50UGF0aCwKLQkJCQkJCQkJCXNvdXJjZVJvb3RQYXRoLCB0YXJnZXRSb290UGF0aCwKLQkJCQkJCQkJCXByb2Nlc3NlZEl0ZW1zLCB2YWxpZGF0b3IpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogdGFrZSB0aGUgdGFnIGF0dHJpYnV0ZXMgc3RyaW5nIGFzIGlucHV0IGFuZCByZXR1cm5zIHRoZSBhdHRyaWJ1dGUKLQkgKiBuYW1lLXZhbHVlIG1hcAotCSAqIAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzU3RyCi0JICogQHJldHVybiBNYXAgdGhlIGF0dHJpYnV0ZSBuYW1lLXZhbHVlIG1hcAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFRhZ0F0dHJpYnV0ZXMoU3RyaW5nIGF0dHJpYnV0ZXNTdHIpIHsKLQotCQkvLyB1c2UgTGlua2VkSGFzaE1hcCB0byByZXNlcnZlIHRoZSBvcmRlciBvZiB0aGUgYXR0cmlidXRlcwotCQlNYXAgYXR0cmlidXRlTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoMyk7Ci0JCU1hdGNoZXIgbTIgPSBwX3RhZ19hdHRyaWJ1dGVzLm1hdGNoZXIoYXR0cmlidXRlc1N0cik7Ci0JCXdoaWxlIChtMi5maW5kKCkpIHsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IG0yLmdyb3VwKDEpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IG0yLmdyb3VwKDMpLnRyaW0oKTsKLQotCQkJLy8gQ2Fubm90IFByZXZpZXcvQnJvd3NlIERlc2NyaXB0aW9uIFRhYiB3aGVuCi0JCQkvLyB0aGUgQ1AgY29udGFpbnMgY2hpbmVzZSBjaGFyYWN0ZXJzCi0JCQkvLyBnZW5lcmF0ZWQgaHRtbCBmcm9tIHhzbHQgZ290IHRoZSBocmVmIHVybHMgZW5jb2RlZC4gd2UgZG9uJ3Qgd2FudAotCQkJLy8gdGhhdAotCQkJLy8gbWFrZSBzdXJlIGRlY29kZSB0aGUgdXJsIHVzaW5nICJVVEYtOCIgZW5jb2RpbmcKLQkJCWlmIChhdHRyTmFtZS5lcXVhbHMoVEFHX0FUVFJfSFJFRikpIHsKLQkJCQl0cnkgewotCQkJCQlhdHRyVmFsdWUgPSBVUkxEZWNvZGVyLmRlY29kZShhdHRyVmFsdWUsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJYXR0cmlidXRlTWFwLnB1dChhdHRyTmFtZSwgYXR0clZhbHVlKTsKLQkJfQotCi0JCXJldHVybiBhdHRyaWJ1dGVNYXA7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyB0aGUgYXR0cmlidXRlIG5hbWUtdmFsdWUgbWFwIGZvciBhbiBIVE1MIGxpbmsKLQkgKiAKLQkgKiBAcGFyYW0gbGluawotCSAqIEByZXR1cm4gTWFwCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0QXR0cmlidXRlc0Zyb21MaW5rKFN0cmluZyBsaW5rKSB7Ci0JCU1hdGNoZXIgbSA9IHBfbGlua19yZWYubWF0Y2hlcihsaW5rKTsKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgYXR0cmlidXRlcyA9IG0uZ3JvdXAoMSk7Ci0JCQlyZXR1cm4gZ2V0VGFnQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB0YWtlcyBhbiBhdHRyaWJ1dGVNYXAgKGllLCBmcm9tICNnZXRUYWdBdHRyaWJ1dGVzKSBhbmQgcmV0dXJucyB0aGUgU3RyaW5nCi0JICogcmVwcmVzZW50YXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlTWFwCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGVzQXNTdHJpbmcoTWFwIGF0dHJpYnV0ZU1hcCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBhdHRyaWJ1dGVNYXAuZ2V0KGtleSk7Ci0JCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkKLQkJCQlidWYuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1Zi5hcHBlbmQoa2V5ICsgIj1cIiIgKyB2YWx1ZSArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQmFkIGxpbmsgZnJvbSBXZWxjb21lIHBhZ2UgaHVtcCBjaGFydAotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREaXNjYXJkZWRFbGVtZW50VVJMKE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LAotCQkJTWV0aG9kRWxlbWVudCBsaW5rRWxlbWVudCwgU3RyaW5nIGd1aWQsIFN0cmluZyBwdWJEaXIpIHsKLQkJU3RyaW5nQnVmZmVyIGRpc2NhcmRlZEVsZW1lbnRVUkwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJZGlzY2FyZGVkRWxlbWVudFVSTC5hcHBlbmQoTUlTU0lOR19QQUdFU19GT0xERVIpLmFwcGVuZCgKLQkJCQkicGFnZXNfbm90X2luc3RhbGxlZCIpLmFwcGVuZChGSUxFX0VYVF9IVE1MKTsKLQotCQlGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShwdWJEaXIsIGRpc2NhcmRlZEVsZW1lbnRVUkwudG9TdHJpbmcoKSk7Ci0JCUZpbGUgZGlyID0gb3V0cHV0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCWlmICghZGlyLmV4aXN0cygpKSB7Ci0JCQlkaXIubWtkaXJzKCk7Ci0JCX0KLQotCQkvLyBnZW5lcmF0ZSB0aGUgaHRtbCBmaWxlCi0JCVhtbEVsZW1lbnQgeG1sID0gbmV3IFhtbEVsZW1lbnQoIkVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXhtbAotCQkJCS5zZXRBdHRyaWJ1dGUoImd1aWQiLCBndWlkKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCBsaW5rRWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGxpbmtFbGVtZW50LmdldE5hbWUoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkicGx1Z2luTmFtZSIsIExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihsaW5rRWxlbWVudCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQkJCi0JCVN0cmluZyB4c2xQYXRoID0gTGF5b3V0UmVzb3VyY2VzLmdldFhzbFVyaSgicGFnZV9ub3RfaW5zdGFsbGVkIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQl0cnkgewotCQkJU3RyaW5nQnVmZmVyIHhtbDIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl4bWwyLmFwcGVuZChYbWxIZWxwZXIuWE1MX0hFQURFUikuYXBwZW5kKHhtbC50b1htbCgpKTsKLQotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0JCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpLCAidXRmLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJUHJvcGVydGllcyB4c2xQYXJhbXMgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9wZXJ0aWVzKAotCQkJCQkiL2xheW91dC94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlYU0xUUHJvY2Vzc29yCi0JCQkJCS50cmFuc2Zvcm0oeHNsUGF0aCwgeG1sMi50b1N0cmluZygpLCB4c2xQYXJhbXMsIG91dHB1dCk7Ci0JCQlvdXRwdXQuZmx1c2goKTsKLQkJCW91dHB1dC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGdldEJhY2tQYXRoKG93bmVyRWxlbWVudCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykKLQkJCQkrIGRpc2NhcmRlZEVsZW1lbnRVUkwudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JCi0JLyoqCi0JICogRk9SIFVTRSBXSVRIIFJJQ0ggVEVYVCBFRElUT1IKLQkgKiB2YWxpZGF0ZSB0aGUgY29udGVudCBieSBjaGVja2luZyBlbGVtZW50IGxpbmtzIGFuZCBpbWFnZXMsIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBvd25lcgotCSAqIAotCSAqIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSB2YWxpZGF0ZUNvbnRlbnQgbWV0aG9kLCBleGNlcHQgaXQgZG9lcyBub3QgZGVjb2RlIHRoZSByZXN1bHRzCi0JICogdmlhIFVSTERlY29kZXIuZGVjb2RlKCkKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudCwgdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoZSBjb250ZW50Ci0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBNZXRob2RDb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uIHRvIHdoaWNoIHRoZSBjb250ZW50IGlzCi0JICogICAgICAgICAgICB2YWxpZGF0ZWQKLQkgKiBAcGFyYW0gbGlua2VkRWxlbWVudHMKLQkgKiAgICAgICAgICAgIExpc3QgYSBwYXNzZWQgaW4gbGlzdCB0byBjb2xsZWN0IHRoZSBsaW5rZWQgZWxlbWVudHMgaW4gdGhpcwotCSAqICAgICAgICAgICAgY29udGVudCwgaWYgbnVsbCwgbm8gbGlua2VkIGVsZW1lbnRzIGFyZSBjb2xsZWN0ZWQuCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHZhbGlkYXRlZCBjb250ZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGVSaWNoVGV4dENvbnRlbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgc291cmNlLCBJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLSAJCXRyeSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCQkKLQkJCS8vIGZpcnN0IHZhbGlkYXRlIHRoZSB0YWdzLCByZW1vdmUgYW55IENGL0xGIGZyb20gdGhlIHRhZyB0ZXh0Ci0JCQlzb3VyY2UgPSB2YWxpZGF0ZVRhZyhzb3VyY2UpOwotCi0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlNYXRjaGVyIG0gPSBwX2xpbmtfcmVmLm1hdGNoZXIoc291cmNlKTsKLQotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBtLmdyb3VwKCk7Ci0KLQkJCQkvLyBQcm9ibGVtcyBwYXJzaW5nIDxhIGhyZWY+IHRhZ3MKLQkJCQkvLyBuZWVkIHRvIHJlbW92ZSBhbGwgTEYsIENSIHdpdGhpbiB0aGUgPGEgLi4+IHRhZwotCQkJCVN0cmluZyB1cmx0ZXh0ID0gbS5ncm91cCgxKTsKLQkJCQlTdHJpbmcgbGlua2VkVGV4dCA9IG0uZ3JvdXAoMik7Ci0JCQkJTGlua0luZm8gaW5mbyA9IHZhbGlkYXRvci52YWxpZGF0ZUxpbmsoZWxlbWVudCwgdXJsdGV4dCwKLQkJCQkJCWxpbmtlZFRleHQsIGNvbmZpZyk7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQl0ZXh0ID0gaW5mby5nZXRIdG1sKHZhbGlkYXRvci5zaG93QnJva2VuTGlua3MoKSkudG9TdHJpbmcoKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gaW5mby5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCXZhbGlkYXRvci5hZGRSZWZlcmVuY2VkRWxlbWVudChlbGVtZW50LCBlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCVN0cmluZyByZXBsYWNlbWVudCA9IHRleHQucmVwbGFjZUFsbCgiZmlsZTovLy8iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQucmVwbGFjZUFsbCgiZmlsZTovLyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCQl9Ci0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0KLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJCX0KLQotCQkJLy8gYWxzbyBmaXggdGhlIGFyZWEgbWFwCi0JCQlzb3VyY2UgPSBzYi50b1N0cmluZygpOwotCQkJbSA9IHBfYXJlYV9yZWYubWF0Y2hlcihzb3VyY2UpOwotCQkJc2Iuc2V0TGVuZ3RoKDApOwotCi0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJLy8gU3RyaW5nIHRleHQgPSBtLmdyb3VwKCk7Ci0JCQkJU3RyaW5nIGhyZWYgPSBtLmdyb3VwKDIpOwotCQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21GaWxlTmFtZShocmVmKTsKLQkJCQlpZiAoZ3VpZCAhPSBudWxsKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChndWlkKSA6IG51bGw7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCS8vIHNob3VsZCByZWFsaXplIHRoZSBlbGVtZW50LCBhbmQgZ2V0IHRoZSByZWFsaXplZCBvbmUKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZTEgPSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudChlLCBjb25maWcpOwotCQkJCQkJaWYgKGUxICE9IG51bGwpIHsKLQkJCQkJCQllID0gZTE7Ci0JCQkJCQl9Ci0KLQkJCQkJCXZhbGlkYXRvci5hZGRSZWZlcmVuY2VkRWxlbWVudChlbGVtZW50LCBlKTsKLQotCQkJCQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcoZSwgY29uZmlnKQotCQkJCQkJCQkmJiAhdmFsaWRhdG9yLmlzRGlzY2FyZGVkKGVsZW1lbnQsIG51bGwsIGUpKSB7Ci0JCQkJCQkJaHJlZiA9IGdldFVybChlLCBlbGVtZW50LCBGSUxFX0VYVF9IVE1MLCBocmVmKTsKLQkJCQkJCX0gZWxzZSBpZiAoIHZhbGlkYXRvci5zaG93QnJva2VuTGlua3MoKSApewotCQkJCQkJCWhyZWYgPSBnZXREaXNjYXJkZWRFbGVtZW50VVJMKGVsZW1lbnQsIGUsIGd1aWQsCi0JCQkJCQkJCQkoKERlZmF1bHRDb250ZW50VmFsaWRhdG9yKSB2YWxpZGF0b3IpCi0JCQkJCQkJCQkJCS5nZXRQdWJsaXNoRGlyKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlocmVmID0gIiI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJU3RyaW5nIHJlcGxhY2VtZW50OwkJCQotCQkJCWlmICggaHJlZiA9PSBudWxsIHx8IGhyZWYubGVuZ3RoKCkgPT0gMCApIHsKLQkJCQkJcmVwbGFjZW1lbnQgPSBzb3VyY2Uuc3Vic3RyaW5nKG0uc3RhcnQoKSwgbS5zdGFydCgxKSkKLQkJCQkJKyBzb3VyY2Uuc3Vic3RyaW5nKG0uZW5kKDEpLCBtLmVuZCgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXBsYWNlbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobS5zdGFydCgpLCBtLnN0YXJ0KDIpKQotCQkJCQkJKyBocmVmICsgc291cmNlLnN1YnN0cmluZyhtLmVuZCgyKSwgbS5lbmQoKSk7Ci0JCQkJfQotCQkJCi0JCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCQl9Ci0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0KLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBjb3B5IGFsbCByZXNvdXJjZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgdG8gdGhlIHRhcmdldCBsb2NhdGlvbi4KLQkgKiByZWN1cnNpdmUgYWxsIGl0J3MgY29udGFpbmVkIGVsZW1lbnRzIGlmIHJlY3Vyc2l2ZSBpcyB0cnVlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZyb20KLQkgKiBAcGFyYW0gdG8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weUFsbFJlc291cmNlcyhFT2JqZWN0IGVsZW1lbnQsIEZpbGUgZnJvbSwgRmlsZSB0bywgYm9vbGVhbiByZWN1cnNpdmUpIHsKLQkJCi0JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKGZyb20pOwotCQlzY2FubmVyLnNldFRhcmdldFJvb3RQYXRoKHRvKTsKLQkJc2Nhbm5lci5jb3B5UmVzb3VyY2VzKGVsZW1lbnQpOwotCQkKLQkJaWYgKCByZWN1cnNpdmUgKSB7Ci0JCQlmb3IgKCBJdGVyYXRvciBpdCA9IGVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdClpdC5uZXh0KCk7Ci0JCQkJc2Nhbm5lci5jb3B5UmVzb3VyY2VzKG9iaik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luUGF0aChFT2JqZWN0IGUsIFN0cmluZyByb290UGF0aCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKHJvb3RQYXRoKS5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpCi0JCQkJCS5hcHBlbmQoTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRFbGVtZW50UGF0aChwbHVnaW4pKQotCQkJCQkudG9TdHJpbmcoKTsKLQkJCXJldHVybiBwYXRoOwotCQl9Ci0JCXJldHVybiByb290UGF0aDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5QYXRoKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJU3RyaW5nIHJvb3RQYXRoID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKTsKLQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIocm9vdFBhdGgpLmFwcGVuZChGaWxlLnNlcGFyYXRvcikKLQkJCQkJLmFwcGVuZChNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmdldEVsZW1lbnRQYXRoKHBsdWdpbikpCi0JCQkJCS50b1N0cmluZygpOwotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQkJcmV0dXJuIHJvb3RQYXRoOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvUmVzb3VyY2VVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1Jlc291cmNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYzZjZmFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvUmVzb3VyY2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgbWFuYWdpbmcgdGhlIE1ldGhvZCBMaWJyYXJ5IGFzIGEgcHJvamVjdCBpbiB0aGUgRWNsaXBzZQotICogd29ya3NwYWNlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVV0aWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1ldGhvZExpYnJhcnlOYXR1cmUgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1ldGhvZExpYnJhcnlOYXR1cmVzID0geyBtZXRob2RMaWJyYXJ5TmF0dXJlIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0tfRklMRU5BTUUgPSAiLmxvY2siOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBvcGVuKE1ldGhvZExpYnJhcnkgbGliLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlvcGVuKGdldExpYnJhcnlEaXJlY3RvcnkobGliKSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGxpYkRpciBTdHJpbmcKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBvcGVuKFN0cmluZyBsaWJEaXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChsaWJEaXIgKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgSVByb2plY3REZXNjcmlwdGlvbi5ERVNDUklQVElPTl9GSUxFX05BTUUpOwotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbnVsbDsKLQotCQl0cnkgewotCQkJZGVzY3JpcHRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKLQkJCQkJLmxvYWRQcm9qZWN0RGVzY3JpcHRpb24ocGF0aCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvLyBtaXNzaW5nIC5wcm9qZWN0IGZpbGUKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIyMjIC0gZXhjZXB0aW9uIGluIGxvYWRQcm9qZWN0RGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJCS8vIC5wcm9qZWN0IGZpbGUgaXMgbWlzc2luZyAtIGNyZWF0ZSBhIG5ldyBwcm9qZWN0Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiIyMjIC0gY3JlYXRpbmcgbmV3IG1ldGhvZCBsaWJyYXJ5IHByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlwcm9qZWN0ID0gY3JlYXRlVmFsaWRQcm9qZWN0RnJvbVBhdGgobGliRGlyLCBtb25pdG9yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gLnByb2plY3QgZmlsZSBleGlzdHMKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCIjIyMgLSBvcGVuaW5nIGV4aXN0aW5nIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgIiArIGRlc2NyaXB0aW9uLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQkvLyBjaGVjayBpZiBwcm9qZWN0IG9mIHRoaXMgbmFtZSBleGlzdHMgaW4gd29ya3NwYWNlCi0JCQkJcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgKLQkJCQkJCWRlc2NyaXB0aW9uLmdldE5hbWUoKSk7Ci0KLQkJCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkJLy8gcHJvamVjdCBkb2Vzbid0IGV4aXN0IGluIHdvcmtzcGFjZSwgc28gbWFrZSBvbmUgd2l0aCB0aGUKLQkJCQkJLy8gcHJvamVjdCBuYW1lIGluIC5wcm9qZWN0Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiIyMjIC0gY3JlYXRpbmcgZXhpc3RpbmcgLnByb2plY3QgIiArIGRlc2NyaXB0aW9uLmdldE5hbWUoKSArICIgaW4gd29ya3NwYWNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQkJcHJvamVjdCA9IGNyZWF0ZVByb2plY3QobGliRGlyLCBwcm9qZWN0LmdldE5hbWUoKSwKLQkJCQkJCQkJbW9uaXRvcik7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJCS8vIGZhaWxlZCB0byBtYWtlIHRoaXMgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlIC0KLQkJCQkJCS8vIGFub3RoZXIgcHJvamVjdCBtYXkgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZSBhdCB0aGlzCi0JCQkJCQkvLyBsb2NhdGlvbgotCQkJCQkJLy8gc28gd2UgbmVlZCB0byBkZWxldGUgdGhhdCBjb25mbGljdGluZyBwcm9qZWN0IGFuZCB0cnkKLQkJCQkJCS8vIGFnYWluCi0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiIyMjIC0gY3JlYXRpbmcgZXhpc3RpbmcgLnByb2plY3QgZmFpbGVkIC0gZGVsZXRpbmcgd29ya3NwYWNlLXByb2plY3QgaW4gIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJbGliRGlyCi0JCQkJCQkJCQkJCSsgIiBhbmQgY3JlYXRpbmcgd29ya3NwYWNlLXByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZGVsZXRlUHJvamVjdChsaWJEaXIsIG1vbml0b3IpOwotCQkJCQkJcHJvamVjdCA9IGNyZWF0ZVByb2plY3QobGliRGlyLCBwcm9qZWN0LmdldE5hbWUoKSwKLQkJCQkJCQkJbW9uaXRvcik7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBwcm9qZWN0IGRvZXMgZXhpc3QgaW4gd29ya3NwYWNlIC0gbWFrZSBzdXJlIGxvY2F0aW9uCi0JCQkJCS8vIG1hdGNoZXMsIGlmIG5vdCwgbWFrZSBhIG5ldyBwcm9qZWN0Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiIyMjIC0gcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiIGV4aXN0cyBpbiB3b3Jrc3BhY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJaWYgKG5ldyBGaWxlKGxpYkRpcikuY29tcGFyZVRvKHByb2plY3QuZ2V0TG9jYXRpb24oKQotCQkJCQkJCS50b0ZpbGUoKSkgIT0gMCkgewotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIiMjIyAtIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIiBleGlzdHMgaW4gd29ya3NwYWNlLCBidXQgbG9jYXRpb24gZGlmZmVycyAtIGNyZWF0ZSBhIG5ldyBwcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQkJRmlsZSBwcm9qZWN0RmlsZSA9IHBhdGgudG9GaWxlKCk7Ci0JCQkJCQlpZiAocHJvamVjdEZpbGUuY2FuV3JpdGUoKSkgewotCQkJCQkJCXByb2plY3RGaWxlLmRlbGV0ZSgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyB0aGlzIHdpbGwgY2F1c2UgdGhlIGNhbGxlciB0byBkaXNwbGF5IGEKLQkJCQkJCQkvLyBtZXNzYWdlYm94IGFza2luZyB0aGUgdXNlciB0byBtYWtlIC5wcm9qZWN0Ci0JCQkJCQkJLy8gd3JpdGFibGUKLQkJCQkJCQkvLyBUT0RPOiB1c2Ugb3VyIG93biB0eXBlIG9mIEV4Y2VwdGlvbj8KLQkJCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0JCQkJCQkJCQkiIyMjIiArIHByb2plY3RGaWxlLmdldEFic29sdXRlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJcHJvamVjdCA9IGNyZWF0ZVZhbGlkUHJvamVjdEZyb21QYXRoKGxpYkRpciwgbW9uaXRvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQkJLy8gbGliRGlyIG11c3QgYmUgYW4gaW52YWxpZCBwYXRoIChvdmVybGFwcyB3b3Jrc3BhY2U/KQotCQkJCS8vIFRPRE86IHRoaXMgZXhjZXB0aW9uIGlzbid0IGhhbmRsZWQgd2VsbCAtIGl0IHNob3VsZG4ndCBoYXBwZW4KLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTGlicmFyeVJlc291cmNlcy5pbnZhbGlkTGlicmFyeVBhdGhFcnJvcl9yZWFzb24pOwotCQkJfQotCQkJcHJvamVjdC5vcGVuKElSZXNvdXJjZS5CQUNLR1JPVU5EX1JFRlJFU0gsIG1vbml0b3IpOwkJCQkJCQotCQkJCi0JCQkvLyBTZXQgbG9jayBmaWxlIGFzIHRlYW0gcHJpdmF0ZSBtZW1iZXIgc28gaXQgd2lsbCBub3QgYmUgc2hhcmVkIChhZGRlZCB0byBzb3VyY2UgY29udHJvbCkuCi0JCQkvLyBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIHByb2plY3QgZm9sZGVyIGdvdCByZWZyZXNoZWQuIFNvIHRoaXMgcG9ydGlvbiBvZiBjb2RlIG11c3QgYmUKLQkJCS8vIGV4ZWN1dGVkIHJpZ2h0IGFmdGVyIElQcm9qZWN0Lm9wZW4oKSByZXR1cm5lZC4gUHJvamVjdCBtdXN0IGJlIG9wZW5lZCB3aXRoIElSZXNvdXJjZS5CQUNLR1JPVU5EX1JFRlJFU0gKLQkJCS8vIHRvIHByZXZlbnQgbG9jayBmaWxlIGZyb20gYmVpbmcgYWRkZWQgdG8gdGhlIHByb2plY3QgYmVmb3JlIGl0IGlzIHNldCBhcyB0ZWFtIHByaXZhdGUgbWVtYmVyCi0JCQkvLwotCQkJRmlsZSBsb2NrRmlsZSA9IG5ldyBGaWxlKGxpYkRpciwgUmVzb3VyY2VVdGlsLkxPQ0tfRklMRU5BTUUpOwotCQkJaWYobG9ja0ZpbGUuZXhpc3RzKCkpIHsKLQkJCQl0cnkgewotCQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChsb2NrRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCQkJCQlpZih3c1JlcyAhPSBudWxsKSB7Ci0JCQkJCQl3c1Jlcy5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG51bGwpOwotCQkJCQkJd3NSZXMuc2V0VGVhbVByaXZhdGVNZW1iZXIodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG1vbml0b3IgZm9yIGNoYW5nZSBpbiB0aGUgcmVzb3VyY2UKLS8vCQkJUmVmcmVzaE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5tb25pdG9yKHByb2plY3QpOwotCi0JCQlkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQotCQkJLy8gbWFrZSBzdXJlIHByb2plY3QgaGFzIHRoZSBNZXRob2RMaWJyYXJ5TmF0dXJlCi0JCQlTdHJpbmdbXSBleGlzdGluZ05hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJCWlmICghKEFycmF5cy5hc0xpc3QoZXhpc3RpbmdOYXR1cmVzKS5jb250YWlucyhtZXRob2RMaWJyYXJ5TmF0dXJlKSkpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCIjIyMgLSBhZGRpbmcgbWV0aG9kbGlicmFyeW5hdHVyZSB0byAiICsgZGVzY3JpcHRpb24uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobWV0aG9kTGlicmFyeU5hdHVyZXMpOwotCQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIElQcm9qZWN0LkZPUkNFCi0JCQkJCQl8IElQcm9qZWN0LktFRVBfSElTVE9SWSwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCXRocm93IGV4OwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xvc2VzIGEgbGlicmFyeSdzIHByb2plY3QuIEl0IGZpbmRzIHRoZSBwcm9qZWN0IGJ5IGxvY2F0aW5nIGEgcHJvamVjdAotCSAqIHdpdGggdGhlIHNhbWUgbG9jYXRpb24gYXMgdGhlIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGNsb3NlKE1ldGhvZExpYnJhcnkgbGliLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJSVByb2plY3QgcHJvamVjdCA9IGZpbmRQcm9qZWN0KGxpYik7Ci0vLwkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzT3BlbigpKSB7Ci0vLwkJCWlmIChkZWJ1ZykgewotLy8JCQkJU3lzdGVtLm91dAotLy8JCQkJCQkucHJpbnRsbigiIyMjIC0gY2xvc2luZyBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJfQotLy8JCQlwcm9qZWN0LmNsb3NlKG1vbml0b3IpOwotLy8JCX0gZWxzZSB7Ci0vLwkJCWlmIChkZWJ1ZykgewotLy8JCQkJU3lzdGVtLm91dAotLy8JCQkJCQkucHJpbnRsbigiIyMjIC0gRVJST1IgY2xvc2luZyBwcm9qZWN0IGZvciBsaWJyYXJ5IGluIFwiIiArIGdldExpYnJhcnlEaXJlY3RvcnkobGliKSArICJcIjogcHJvamVjdCBjb3VsZCBub3QgYmUgZm91bmQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotLy8JCQl9Ci0vLwkJfQotCQkKLQkJY2xvc2UoZ2V0TGlicmFyeURpcmVjdG9yeShsaWIpLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZGlyIFN0cmluZwotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgY2xvc2UoU3RyaW5nIGRpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGZpbmRQcm9qZWN0KGRpcik7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5pc09wZW4oKSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIiMjIyAtIGNsb3NpbmcgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwcm9qZWN0LmNsb3NlKG1vbml0b3IpOwotCQkJCi0JCQkvLyBzdG9wIG1vbml0b3JpbmcgY2hhbmdlIG9uIHRoZSBwcm9qZWN0Ci0JCQkvLwotLy8JCQlSZWZyZXNoTWFuYWdlci5nZXRJbnN0YW5jZSgpLnVubW9uaXRvcihwcm9qZWN0KTsKLQkJCQotCQl9IGVsc2UgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIiMjIyAtIEVSUk9SIGNsb3NpbmcgcHJvamVjdCBmb3IgbGlicmFyeSBpbiBcIiIgKyBkaXIgKyAiXCI6IHByb2plY3QgY291bGQgbm90IGJlIGZvdW5kLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCX0KLQotCQkKLQkvKioKLQkgKiBMb2NhdGVzIHRoZSBwcm9qZWN0IHdpdGggdGhlIHNhbWUgbG9jYXRpb24gYXMgdGhlIGxpYnJhcnkncyBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGxpYiBNZXRob2RMaWJyYXJ5Ci0JICogQHJldHVybiBJUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZmluZFByb2plY3QoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJcmV0dXJuIGZpbmRQcm9qZWN0KGdldExpYnJhcnlEaXJlY3RvcnkobGliKSk7Ci0JfQotCi0JLyoqCi0JICogTG9jYXRlc3QgdGhlIHByb2plY3Qgd2hvc2UgbG9jYXRpb24gbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyIFN0cmluZwotCSAqIEByZXR1cm4gSVByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGZpbmRQcm9qZWN0KFN0cmluZyBkaXIpIHsKLQkJZmluYWwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJCWlmIChuZXcgRmlsZShkaXIpLmNvbXBhcmVUbyhwcm9qZWN0LmdldExvY2F0aW9uKCkudG9GaWxlKCkpID09IDApIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCIjIyMgLSBmb3VuZCBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIgd2l0aCBsb2NhdGlvbiAiICsgZGlyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIHByb2plY3Q7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIHByb2plY3Qgd2hvc2UgbG9jYXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYiBNZXRob2RMaWJyYXJ5Ci0JICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWxldGVQcm9qZWN0KE1ldGhvZExpYnJhcnkgbGliLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBkZWxldGVQcm9qZWN0KGdldExpYnJhcnlEaXJlY3RvcnkobGliKSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgcHJvamVjdCB3aG9zZSBsb2NhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVsZXRlUHJvamVjdChTdHJpbmcgcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBkZWxldGUgYW55IHdvcmtzcGFjZSBwcm9qZWN0IHRoYXQgZXhpc3RzIGZvciB0aGlzIHBhdGgKLQkJSVByb2plY3QgcHJvamVjdCA9IGZpbmRQcm9qZWN0KHBhdGgpOwotCQl0cnkgewotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIiMjIyAtIGRlbGV0aW5nIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0JCQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJCX0KLQkJCQlwcm9qZWN0LmRlbGV0ZShJUHJvamVjdC5GT1JDRQotCQkJCQkJfCBJUHJvamVjdC5ORVZFUl9ERUxFVEVfUFJPSkVDVF9DT05URU5ULCBtb25pdG9yKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHByb2plY3QgZm9yIHRoZSBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGUgbGlicmFyeSBpcyBub3QgaW4gYSB2YWxpZCBwcm9qZWN0IGxvY2F0aW9uIChpZSwKLQkgKiAgICAgICAgIG92ZXJsYXBzIHRoZSB3b3Jrc3BhY2UpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlUHJvamVjdChNZXRob2RMaWJyYXJ5IGxpYiwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gY3JlYXRlVmFsaWRQcm9qZWN0RnJvbVBhdGgoZ2V0TGlicmFyeURpcmVjdG9yeShsaWIpLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcHJvamVjdCBmb3IgdGhlIHBhdGggc3BlY2lmaWVkLCB1c2luZyB0aGUgbGFzdCBwYXRoIGZyYWdtZW50IGFzCi0JICogdGhlIHByb2plY3QgbmFtZS4gV2lsbCBhcHBlbmQgaW5jcmVhc2luZyBpbnRlZ2VycyB0byB0aGUgcHJvamVjdCBuYW1lIGluCi0JICogb3JkZXIgdG8gY3JlYXRlIGEgdmFsaWQgcHJvamVjdC4gRmlyc3QgZGVsZXRlcyBhbnkgd29ya3NwYWNlIHByb2plY3QKLQkgKiB3aG9zZSBsb2NhdGlvbiBpcyB0aGUgZ2l2ZW4gcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybiBJUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlVmFsaWRQcm9qZWN0RnJvbVBhdGgoU3RyaW5nIHBhdGgsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZGVsZXRlIGFueSB3b3Jrc3BhY2UgcHJvamVjdCB0aGF0IGV4aXN0cyBmb3IgdGhpcyBwYXRoCi0JCUlQcm9qZWN0IHByb2plY3QgPSBmaW5kUHJvamVjdChwYXRoKTsKLQkJdHJ5IHsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlwcm9qZWN0LmRlbGV0ZShJUHJvamVjdC5GT1JDRQotCQkJCQkJfCBJUHJvamVjdC5ORVZFUl9ERUxFVEVfUFJPSkVDVF9DT05URU5ULCBtb25pdG9yKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgbGliTmFtZSA9IG5ldyBGaWxlKHBhdGgpLmdldE5hbWUoKTsKLQkJU3RyaW5nIGxpYkRpciA9IG5ldyBGaWxlKHBhdGgpLmdldEFic29sdXRlUGF0aCgpOwotCi0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IGxpYk5hbWU7Ci0JCWludCBpID0gMjsKLQkJd2hpbGUgKGkgPCAxMDApIHsKLQkJCXRyeSB7Ci0JCQkJcHJvamVjdCA9IGNyZWF0ZVByb2plY3QobGliRGlyLCBwcm9qZWN0TmFtZSwgbW9uaXRvcik7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiIyMjIC0gY3JlYXRpbmcgbmV3IG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgIiArIHByb2plY3ROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gcHJvamVjdDsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlwcm9qZWN0TmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIobGliTmFtZSkuYXBwZW5kKCcgJykuYXBwZW5kKGkrKykKLQkJCQkJCS50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIGNyZWF0ZSBhIHByb2plY3QgbmFtZWQgcHJvamVjdE5hbWUgaW4gdGhlIGRpcmVjdG9yeSBkaXIuCi0JICogVGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhpcyBmYWlscyBmb3IgYW55IHJlYXNvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogQHBhcmFtIHByb2plY3ROYW1lCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVByb2plY3QgY3JlYXRlUHJvamVjdChTdHJpbmcgZGlyLCBTdHJpbmcgcHJvamVjdE5hbWUsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0KLQkJLy8gZ2V0IGEgcHJvamVjdCBoYW5kbGUKLQkJSVByb2plY3QgbmV3UHJvamVjdEhhbmRsZSA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSB3b3Jrc3BhY2UKLQkJCQkubmV3UHJvamVjdERlc2NyaXB0aW9uKG5ld1Byb2plY3RIYW5kbGUuZ2V0TmFtZSgpKTsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG1ldGhvZExpYnJhcnlOYXR1cmVzKTsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBuZXcgUGF0aChkaXIpOwotCQlpZiAoIVBsYXRmb3JtLmdldExvY2F0aW9uKCkuaXNQcmVmaXhPZihwcm9qZWN0UGF0aCkpIHsKLQkJCWRlc2NyaXB0aW9uLnNldExvY2F0aW9uKHByb2plY3RQYXRoKTsKLQkJfQotCi0JCW5ld1Byb2plY3RIYW5kbGUuY3JlYXRlKGRlc2NyaXB0aW9uLCBtb25pdG9yKTsKLQkJcmV0dXJuIG5ld1Byb2plY3RIYW5kbGU7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2VzIGFsbCAob3BlbikgcHJvamVjdHMgdGhhdCBoYXZlIHRoZSBNZXRob2RMaWJyYXJ5IG5hdHVyZQotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VBbGxNZXRob2RMaWJyYXJ5UHJvamVjdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZpbmFsIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCQlpZiAocHJvamVjdC5pc09wZW4oKQotCQkJCQkJJiYgcHJvamVjdC5nZXROYXR1cmUobWV0aG9kTGlicmFyeU5hdHVyZSkgIT0gbnVsbCkgewotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIiMjIyAtIGNsb3NpbmcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcHJvamVjdC5jbG9zZShtb25pdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGxpYiBNZXRob2RMaWJyYXJ5Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMaWJyYXJ5RGlyZWN0b3J5KE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCXJldHVybiBuZXcgRmlsZShsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB1c2VkUmVzb3VyY2VzCi0JICogQHJldHVybiBDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldE91dE9mU3luY2hSZXNvdXJjZXMoQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzKSB7Ci0JCUFycmF5TGlzdCBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1c2VkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIGZpbGVQYXRoID0gcmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQlJUmVzb3VyY2Ugd3NSZXMgPSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKGZpbGVQYXRoKTsKLQkJCWlmKHdzUmVzICE9IG51bGwgJiYgIXdzUmVzLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKSkgewotCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOwotCX0JCi0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyBDb2xsZWN0aW9uCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc091dE9mU3luY2goQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYocmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCQlTdHJpbmcgZmlsZVBhdGggPSByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKGZpbGVQYXRoKTsKLQkJCQlpZih3c1JlcyAhPSBudWxsICYmICF3c1Jlcy5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9CQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXNUb0NoZWNrIENvbGxlY3Rpb24KLQkgKiBAcGFyYW0gcmVtb3ZlZFJlc291cmNlcyBDb2xsZWN0aW9uCi0JICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZXMgQ29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja091dE9mU3luY2hSZXNvdXJjZXMoQ29sbGVjdGlvbiByZXNvdXJjZXNUb0NoZWNrLCAKLQkJCUNvbGxlY3Rpb24gcmVtb3ZlZFJlc291cmNlcywgQ29sbGVjdGlvbiBjaGFuZ2VkUmVzb3VyY2VzKQotCXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzVG9DaGVjay5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBmaWxlUGF0aCA9IHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJSVJlc291cmNlIHdzUmVzID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihmaWxlUGF0aCk7Ci0JCQlpZih3c1JlcyA9PSBudWxsKSB7Ci0JCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQkJZWxzZSBpZighd3NSZXMuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKSB7Ci0JCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hSZXNvdXJjZXMoTWV0aG9kTGlicmFyeSBsaWIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZihsaWIgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJqID0gTWV0aG9kTGlicmFyeVByb2plY3QuZmluZFByb2plY3QobGliKTsKLQkJCWlmKHByaiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJqLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9TQVhQYXJzZXJYTUkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvU0FYUGFyc2VyWE1JLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY0NzlmY2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9TQVhQYXJzZXJYTUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbC5BYnN0cmFjdFNBWFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGwuTXlFc2NhcGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcGFyc2VzIGFuIFhNSSBmaWxlLCBhbmQgc3RvcmVzIHRoZSBkYXRhIGluIGEgSGFzaE1hcCBjYWxsZWQgYW4KLSAqICJlTWFwIi4KLSAqIDxwPgotICogQW4gZU1hcCBoYXMgNCBlbnRyaWVzOgotICogPGxpPiJ0YWciIC0gdGhlIGVsZW1lbnQncyB0YWc8L2xpPgotICogPGxpPiJhdHRyaWJ1dGVzIiAtIGFuIEFycmF5TGlzdCBvZiB0aGUgWE1MIGF0dHJpYnV0ZXMuIEVhY2ggYXR0cmlidXRlIGlzIG9mCi0gKiB0aGUgZm9ybSAoYXR0cmlidXRlIG5hbWUpLChhdHRyaWJ1dGUgdmFsdWUpPC9saT4KLSAqIDxsaT4iY29udGVudCIgLSB0aGUgZWxlbWVudCdzIGNvbnRlbnQ8L2xpPgotICogPGxpPiJjaGlsZHJlbiIgLSBhbiBBcnJheUxpc3Qgb2YgdGhlIGVsZW1lbnQncyBzdWItZWxlbWVudHMuIEVhY2ggY2hpbGQgaXMKLSAqIGFuIGVNYXAuPC9saT4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIHJvb3QgZWxlbWVudCdzIGVNYXAgaXMgcmVmZXJlbmNlZCBieSBUTkdTQVhQYXJzZXJYTUkueG1pTWFwCi0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU0FYUGFyc2VyWE1JIGV4dGVuZHMgQWJzdHJhY3RTQVhQYXJzZXIgewotCi0JcHVibGljIEhhc2hNYXAgeG1pTWFwOwotCi0JLy8gcHJpdmF0ZSBpbnQgZWxlbWVudENvdW50ID0gMDsKLQlwcml2YXRlIFN0YWNrIHN0YWNrOwotCi0JcHJpdmF0ZSBNeUVzY2FwZSBlc2NhcGUgPSBuZXcgTXlFc2NhcGUoKTsKLQotCXB1YmxpYyBTQVhQYXJzZXJYTUkoTG9nZ2VyIGxvZ2dlcikgewotCQkvLyB2YWxpZGF0aW5nIGlzIGZhbHNlIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBEVEQKLQkJc3VwZXIobG9nZ2VyLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFhNTCBwYXJzZXIgc3RhcnRzIHRvIHBhcnNlIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgewotCQlzdXBlci5zdGFydERvY3VtZW50KCk7Ci0JCXN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB7Ci0JCXN1cGVyLmVuZERvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkwsIFN0cmluZyBsb2NhbE5hbWUsCi0JCQlTdHJpbmcgcW5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlIYXNoTWFwIGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl0cnkgewotCQkJSGFzaE1hcCBwYXJlbnQgPSAoSGFzaE1hcCkgc3RhY2sucGVlaygpOwotCQkJKChBcnJheUxpc3QpIHBhcmVudC5nZXQoImNoaWxkcmVuIikpLmFkZChlTWFwKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFbXB0eVN0YWNrRXhjZXB0aW9uIGUpIHsKLQkJCXhtaU1hcCA9IGVNYXA7Ci0JCX0KLQotCQkvLyBwdXQgdGFnCi0JCWVNYXAucHV0KCJ0YWciLCBxbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBwdXQgYXR0cmlidXRlTWFwCi0JCUxpc3QgYXR0cmlidXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWF0dHJpYnV0ZUxpc3QuYWRkKGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSkKLQkJCQkJCSsgIiwiICsgYXR0cmlidXRlcy5nZXRWYWx1ZShpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQllTWFwLnB1dCgiYXR0cmlidXRlcyIsIGF0dHJpYnV0ZUxpc3QpOyAvLyROT04tTkxTLTEkCi0KLQkJZU1hcC5wdXQoImNoaWxkcmVuIiwgbmV3IEFycmF5TGlzdCgpKTsgLy8kTk9OLU5MUy0xJAotCQlzdGFjay5wdXNoKGVNYXApOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSTCwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlIYXNoTWFwIGVNYXAgPSAoSGFzaE1hcCkgc3RhY2sucGVlaygpOwotCQkJTGlzdCBhdHRyaWJ1dGVMaXN0ID0gKEFycmF5TGlzdCkgZU1hcC5nZXQoImF0dHJpYnV0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dHJpYnV0ZUxpc3Quc2l6ZSgpID09IDApCi0JCQkJaWYgKHN0ckJ1Zi50b1N0cmluZygpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJZU1hcC5wdXQoImNvbnRlbnQiLCBlc2NhcGUuY29udmVydExpbmVzKHN0ckJ1Zi50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCX0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlzdGFjay5wb3AoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JLiBGaW5kIGEgZ3VpZCdzIGVsZW1lbnQgdGFnIHdpdGhpbiB0aGUgWE1JCi0JICogZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudFRhZwotCSAqIEBwYXJhbSBndWlkCi0JICogQHBhcmFtIHhtaU1hcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhhc2hNYXAgZmluZEVsZW1lbnRUYWdvZkd1aWQoU3RyaW5nIGVsZW1lbnRUYWcsIFN0cmluZyBndWlkLAotCQkJSGFzaE1hcCB4bWlNYXApIHsKLQkJSGFzaE1hcCBlTWFwID0gU0FYUGFyc2VyWE1JLmZpbmRHdWlkKGd1aWQsIHhtaU1hcCk7Ci0KLQkJLy8gd2UgaGF2ZSBoYXNobWFwIG9mIHRoZSBndWlkJ3MgZWxlbWVudCAtIHNlYXJjaCBjaGlsZHJlbiBmb3IgdGhlCi0JCS8vIGVsZW1lbnRUYWcKLQkJSXRlcmF0b3IgaXRlciA9ICgoQXJyYXlMaXN0KSBlTWFwLmdldCgiY2hpbGRyZW4iKSkuaXRlcmF0b3IoKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUhhc2hNYXAgY2hpbGRNYXAgPSAoSGFzaE1hcCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoU0FYUGFyc2VyWE1JLmdldFRhZyhjaGlsZE1hcCkuZXF1YWxzKGVsZW1lbnRUYWcpKQotCQkJCXJldHVybiBjaGlsZE1hcDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JLiBzZWFyY2hlcyBlTWFwJ3MgY2hpbGRyZW4gZm9yIGVsZW1lbnRUYWcKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudFRhZwotCSAqIEBwYXJhbSBlTWFwCi0JICogQHJldHVybiBIYXNoTWFwCi0JICovCi0JcHVibGljIHN0YXRpYyBIYXNoTWFwIGdldENoaWxkRWxlbWVudFRhZyhTdHJpbmcgZWxlbWVudFRhZywgSGFzaE1hcCBlTWFwKSB7Ci0JCS8vIHNlYXJjaCBjaGlsZHJlbiBmb3IgdGhlIGVsZW1lbnRUYWcKLQkJSXRlcmF0b3IgaXRlciA9ICgoQXJyYXlMaXN0KSBlTWFwLmdldCgiY2hpbGRyZW4iKSkuaXRlcmF0b3IoKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUhhc2hNYXAgY2hpbGRNYXAgPSAoSGFzaE1hcCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoU0FYUGFyc2VyWE1JLmdldFRhZyhjaGlsZE1hcCkuZXF1YWxzKGVsZW1lbnRUYWcpKQotCQkJCXJldHVybiBjaGlsZE1hcDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JLiByZXR1cm5zIFRhZyBvZiBlbGVtZW50LiBEb2VzIG5vdCByZXR1cm4KLQkgKiBudWxsLCByZXR1cm5zICIiIGluc3RlYWQuCi0JICogCi0JICogQHBhcmFtIGVNYXAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhZyhIYXNoTWFwIGVNYXApIHsKLQkJU3RyaW5nIHRhZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChlTWFwICE9IG51bGwpCi0JCQl0YWcgPSAoU3RyaW5nKSBlTWFwLmdldCgidGFnIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRhZyAhPSBudWxsKQotCQkJcmV0dXJuIHRhZzsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogRm9yIHVzZSB3aXRoIFROR1NBWFBhcnNlclhNSS4gZ2V0cyBjb250ZW50IG9mIGVsZW1lbnQgLSBjYW4gYmUgbnVsbAotCSAqIAotCSAqIEBwYXJhbSBlTWFwCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50Q29udGVudChIYXNoTWFwIGVNYXApIHsKLQkJU3RyaW5nIGNvbnRlbnQgPSBudWxsOwotCQlpZiAoZU1hcCAhPSBudWxsKQotCQkJY29udGVudCA9IChTdHJpbmcpIGVNYXAuZ2V0KCJjb250ZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgYSBndWlkIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGdpdmVuIGVNYXAgLSBjYW4gcmV0dXJuIG51bGwKLQkgKiAKLQkgKiBAcGFyYW0gZ3VpZAotCSAqICAgICAgICAgICAgZ3VpZCB0byBmaW5kCi0JICogQHBhcmFtIGVNYXAKLQkgKiAgICAgICAgICAgIHVzZSBUTkdTQVhQYXJzZXJYTUkueG1pTWFwLCBvciBhIHN1Yi1lTWFwCi0JICogQHJldHVybiBIYXNoTWFwCi0JICovCi0JcHVibGljIHN0YXRpYyBIYXNoTWFwIGZpbmRHdWlkKFN0cmluZyBndWlkLCBIYXNoTWFwIGVNYXApIHsKLQkJQXJyYXlMaXN0IGF0dExpc3QgPSAoQXJyYXlMaXN0KSBlTWFwLmdldCgiYXR0cmlidXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChndWlkLmVxdWFscyhTQVhQYXJzZXJYTUkuZ2V0R3VpZE9mTGlzdChhdHRMaXN0KSkpCi0JCQlyZXR1cm4gZU1hcDsKLQotCQlJdGVyYXRvciBpdGVyID0gKChBcnJheUxpc3QpIGVNYXAuZ2V0KCJjaGlsZHJlbiIpKS5pdGVyYXRvcigpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSGFzaE1hcCBjaGlsZE1hcCA9IChIYXNoTWFwKSBpdGVyLm5leHQoKTsKLQkJCUhhc2hNYXAgcmVzdWx0ID0gZmluZEd1aWQoZ3VpZCwgY2hpbGRNYXApOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRm9yIHVzZSB3aXRoIFROR1NBWFBhcnNlclhNSS4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0TGlzdAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3VpZE9mTGlzdChBcnJheUxpc3QgYXR0TGlzdCkgewotCQlJdGVyYXRvciBpdGVyID0gYXR0TGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhdHRwYWlyID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgYXR0bmFtZSA9IGF0dHBhaXIuc3Vic3RyaW5nKDAsIGF0dHBhaXIuaW5kZXhPZigiLCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGF0dHZhbCA9IGF0dHBhaXIuc3Vic3RyaW5nKGF0dHBhaXIuaW5kZXhPZigiLCIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChhdHRuYW1lLmVxdWFscygiZ3VpZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGF0dHZhbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JIHdoZW4gcGFyc2luZyByZXNtZ3IueG1pCi0JICogCi0JICogQHBhcmFtIGF0dExpc3QKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElkT2ZMaXN0KEFycmF5TGlzdCBhdHRMaXN0KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBhdHRMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGF0dHBhaXIgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwgYXR0cGFpci5pbmRleE9mKCIsIikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXR0dmFsID0gYXR0cGFpci5zdWJzdHJpbmcoYXR0cGFpci5pbmRleE9mKCIsIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dG5hbWUuZXF1YWxzKCJpZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGF0dHZhbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZU1hcAotCSAqIEByZXR1cm4gVVJJCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0UHJlc2VudGF0aW9uVXJpT2ZFbGVtZW50KEhhc2hNYXAgZU1hcCkgewotCQlpZiAoZU1hcCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyB0YWcgPSBTQVhQYXJzZXJYTUkuZ2V0VGFnKGVNYXApOwotCi0JCS8vIC8vIGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGJyZWFrZG93bkVsZW1lbnQgLSBpZiBzbywgcmV0dXJuIG51bGwKLQkJLy8gLy8gYmVjYXVzZSB3aGlsZSBicmVha2Rvd25FbGVtZW50cyBoYXZlIHByZXNlbnRhdGlvbnMsIHRoZXkgYXJlIG5vdAotCQkvLyB1c2VkLgotCQkvLyBpZiAodGFnLmVxdWFscygiYnJlYWtkb3duRWxlbWVudHMiKSkgewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCQkvLyAvLyBwcm9jZXNzZXMgZG9uJ3QgdXNlIHRoZWlyIHByZXNlbnRhdGlvbiBlaXRoZXIKLQkJLy8gaWYgKHRhZy5lcXVhbHMoInByb2Nlc3MiKSkgewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCi0JCS8vIGxvb2sgZm9yIGNoaWxkUGFja2FnZSBwcmVzZW50YXRpb25zLCB3aGljaCBhcmUgYW4gaHJlZiBhdHRyaWJ1dGUKLQkJaWYgKHRhZy5lcXVhbHMoImNoaWxkUGFja2FnZXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlBcnJheUxpc3QgYXR0TGlzdCA9IChBcnJheUxpc3QpIGVNYXAuZ2V0KCJhdHRyaWJ1dGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBhdHRMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgYXR0cGFpciA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCVN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwgYXR0cGFpci5pbmRleE9mKCIsIikpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGF0dHZhbCA9IGF0dHBhaXIuc3Vic3RyaW5nKGF0dHBhaXIuaW5kZXhPZigiLCIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYXR0bmFtZS5lcXVhbHMoImhyZWYiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXRyeSB7Ci0JCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShhdHR2YWwpOwotCQkJCQkJcmV0dXJuIHVyaTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCQkvLyBpZiAoYXR0dmFsLmluZGV4T2YoInVtYTovLyIpICE9IC0xKSB7Ci0JCQkJCS8vIFN0cmluZyBwcmVzSWQgPQotCQkJCQkvLyBhdHR2YWwuc3Vic3RyaW5nKGF0dHZhbC5pbmRleE9mKCJ1bWE6Ly8iKSs2KTsKLQkJCQkJLy8gcmV0dXJuIHByZXNJZDsKLQkJCQkJLy8gfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUFycmF5TGlzdCBjaGlsZExpc3QgPSAoQXJyYXlMaXN0KSBlTWFwLmdldCgiY2hpbGRyZW4iKTsgLy8kTk9OLU5MUy0xJAotCQlJdGVyYXRvciBpdGVyID0gY2hpbGRMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSGFzaE1hcCBjaGlsZE1hcCA9IChIYXNoTWFwKSBpdGVyLm5leHQoKTsKLQkJCXRhZyA9IFNBWFBhcnNlclhNSS5nZXRUYWcoY2hpbGRNYXApOwotCQkJaWYgKHRhZy5lcXVhbHMoInByZXNlbnRhdGlvbiIpKSB7IC8vIHx8Ci0JCQkJLy8gdGFnLmVxdWFscygidmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIpKQotCQkJCS8vIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJQXJyYXlMaXN0IGF0dExpc3QgPSAoQXJyYXlMaXN0KSBjaGlsZE1hcC5nZXQoImF0dHJpYnV0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCUl0ZXJhdG9yIGF0dEl0ZXIgPSBhdHRMaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGF0dEl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCVN0cmluZyBhdHRwYWlyID0gKFN0cmluZykgYXR0SXRlci5uZXh0KCk7Ci0JCQkJCVN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwgYXR0cGFpci5pbmRleE9mKCIsIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBhdHR2YWwgPSBhdHRwYWlyLnN1YnN0cmluZyhhdHRwYWlyLmluZGV4T2YoIiwiKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChhdHRuYW1lLmVxdWFscygiaHJlZiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkoYXR0dmFsKTsKLQkJCQkJCQlyZXR1cm4gdXJpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBpZiAoYXR0dmFsLmluZGV4T2YoInVtYTovLyIpICE9IC0xKSB7Ci0JCQkJCQkvLyBTdHJpbmcgcHJlc0lkID0KLQkJCQkJCS8vIGF0dHZhbC5zdWJzdHJpbmcoYXR0dmFsLmluZGV4T2YoInVtYTovLyIpKzYpOwotCQkJCQkJLy8gcmV0dXJuIHByZXNJZDsKLQkJCQkJCS8vIH0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGlmIChhdHRMaXN0LnNpemUoKSA9PSAwKQotCQkJCS8vIGNvbnRpbnVlOwotCQkJCS8vIFN0cmluZyBhdHRwYWlyID0gKFN0cmluZylhdHRMaXN0LmdldCgwKTsKLQkJCQkvLyAvLyBTdHJpbmcgYXR0bmFtZSA9IGF0dHBhaXIuc3Vic3RyaW5nKDAsCi0JCQkJLy8gYXR0cGFpci5pbmRleE9mKCIsIikpOwotCQkJCS8vIFN0cmluZyBhdHR2YWwgPSBhdHRwYWlyLnN1YnN0cmluZyhhdHRwYWlyLmluZGV4T2YoIiwiKSsxKTsKLQkJCQkvLyBpZiAoYXR0dmFsLmluZGV4T2YoInVtYTovLyIpICE9IC0xKSB7Ci0JCQkJLy8gU3RyaW5nIHByZXNJZCA9IGF0dHZhbC5zdWJzdHJpbmcoYXR0dmFsLmluZGV4T2YoInVtYTovLyIpKzYpOwotCQkJCS8vIHJldHVybiBwcmVzSWQ7Ci0JCQkJLy8gfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlTWFwCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLQkgKiBAcGFyYW0gYXR0cmlidXRlVmFsdWUKLQkgKiBAcmV0dXJuIEhhc2hNYXAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhhc2hNYXAgZmluZEVsZW1lbnRCeUF0dHJpYnV0ZShIYXNoTWFwIGVNYXAsCi0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKSB7Ci0JCS8vIHNlYXJjaCB0aGlzIGVNYXAncyBjaGlsZHJlbgotCQlJdGVyYXRvciBpdGVyID0gKChBcnJheUxpc3QpIGVNYXAuZ2V0KCJjaGlsZHJlbiIpKS5pdGVyYXRvcigpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSGFzaE1hcCBjaGlsZE1hcCA9IChIYXNoTWFwKSBpdGVyLm5leHQoKTsKLQkJCUhhc2hNYXAgcmVzdWx0ID0gZmluZEVsZW1lbnRCeUF0dHJpYnV0ZShjaGlsZE1hcCwgYXR0cmlidXRlTmFtZSwKLQkJCQkJYXR0cmlidXRlVmFsdWUpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQkvLyBzZWFyY2ggdGhpcyBlTWFwCi0JCWl0ZXIgPSAoKEFycmF5TGlzdCkgZU1hcC5nZXQoImF0dHJpYnV0ZXMiKSkuaXRlcmF0b3IoKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhdHRwYWlyID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgYXR0bmFtZSA9IGF0dHBhaXIuc3Vic3RyaW5nKDAsIGF0dHBhaXIuaW5kZXhPZigiLCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGF0dHZhbCA9IGF0dHBhaXIuc3Vic3RyaW5nKGF0dHBhaXIuaW5kZXhPZigiLCIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChhdHRuYW1lLmVxdWFscyhhdHRyaWJ1dGVOYW1lKSAmJiBhdHR2YWwuZXF1YWxzKGF0dHJpYnV0ZVZhbHVlKSkKLQkJCQlyZXR1cm4gZU1hcDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZU1hcAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGVPZkVsZW1lbnQoSGFzaE1hcCBlTWFwLAotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJSXRlcmF0b3IgaXRlciA9ICgoQXJyYXlMaXN0KSBlTWFwLmdldCgiYXR0cmlidXRlcyIpKS5pdGVyYXRvcigpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGF0dHBhaXIgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwgYXR0cGFpci5pbmRleE9mKCIsIikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXR0dmFsID0gYXR0cGFpci5zdWJzdHJpbmcoYXR0cGFpci5pbmRleE9mKCIsIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dG5hbWUuZXF1YWxzKGF0dHJpYnV0ZU5hbWUpKQotCQkJCXJldHVybiBhdHR2YWw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1RleHRSZWZlcmVuY2VSZXBsYWNlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvVGV4dFJlZmVyZW5jZVJlcGxhY2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNThhZGE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvVGV4dFJlZmVyZW5jZVJlcGxhY2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIGZvciBJVGV4dFJlZmVyZW5jZVJlcGxhY2VyLiBVc2VkIGluIGRlZXAgY29weQotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVRleHRSZWZlcmVuY2VSZXBsYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBUZXh0UmVmZXJlbmNlUmVwbGFjZXJJbXBsIGltcGxlbWVudHMgSVRleHRSZWZlcmVuY2VSZXBsYWNlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENBUEFCSUxJVFlfUEFUSCA9IE11bHRpRmlsZVNhdmVVdGlsLkNBUEFCSUxJVFlfUEFUVEVSTl9QQVRIICsgIi8iOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBERUxJVkVSWV9QQVRIID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVMSVZFUllfUFJPQ0VTU19QQVRIICsgIi8iOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyAgPSBmYWxzZTsJCi0JCi0JcHJpdmF0ZSBNYXAgY29udmVydE1hcChNYXAgb2xkVG9OZXdPYmplY3RNYXApIHsKLQkJaWYgKG9sZFRvTmV3T2JqZWN0TWFwID09IG51bGwpIHsKLQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gb2xkVG9OZXdPYmplY3RNYXAgaXMgbnVsbC4iKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCU1hcCBtID0gbnVsbDsKLQkJSXRlcmF0b3IgaXQgPSBvbGRUb05ld09iamVjdE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCU9iamVjdCB2YWwgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBvbGQga2V5ID0gIiArIGtleSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gb2xkIHZhbCA9ICIgKyB2YWwpOwotCQkJfQotCQkJaWYgKCBrZXkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIHZhbCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgbmV3S2V5ID0gKChNZXRob2RFbGVtZW50KWtleSkuZ2V0R3VpZCgpOwotCQkJCVN0cmluZyBuZXdWYWwgPSAoKE1ldGhvZEVsZW1lbnQpdmFsKS5nZXRHdWlkKCk7Ci0JCQkJaWYgKGtleSAhPSBudWxsICYmIHZhbCAhPSBudWxsKSB7Ci0JCQkJCWlmIChtID09IG51bGwpIHsKLQkJCQkJCW0gPSBuZXcgSGFzaE1hcCgpOwotCQkJCQl9Ci0JCQkJCW0ucHV0KG5ld0tleSwgbmV3VmFsKTsKLQkJCQl9Ci0JCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbmV3IGtleSA9ICIgKyBuZXdLZXkgKyAiLCBuZXdWYWwgPSAiICsgbmV3VmFsKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLQkJCQl9Ci0JCQl9IAotCQl9Ci0JCXJldHVybiBtOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2UgU3RyaW5nCi0JICogQHBhcmFtIG93bmVyIEVPYmplY3QKLQkgKiBAb2xkVG9OZXdPYmplY3RNYXAgTWFwCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHNvdXJjZSwgRU9iamVjdCBvd25lciwgTWFwIG9sZFRvTmV3T2JqZWN0TWFwKSB7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBFbnRlcmluZyBUZXh0UmVmZXJlbmNlUmVwbGFjZXJJbXBsLnJlcGxhY2U6ICIgKyBzb3VyY2UpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gb3duZXI6ICIgKyBvd25lcik7Ci0JCX0KLQkJU3RyaW5nIHJldCA9IHJlcGxhY2VfKHNvdXJjZSwgb3duZXIsIG9sZFRvTmV3T2JqZWN0TWFwKTsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCWJvb2xlYW4gbm9DaGFuZ2UgPSAhIHNvdXJjZS5lcXVhbHMocmV0KTsKLQkJCVN0cmluZyBzdHIgPSBzb3VyY2UuZXF1YWxzKHJldCkgPyAiTm8gY2huYW5nZSEiIDogcmV0OwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gRXhpdGluZyBUZXh0UmVmZXJlbmNlUmVwbGFjZXJJbXBsLnJlcGxhY2U6ICIgKyBzdHIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyByZXBsYWNlXyhTdHJpbmcgc291cmNlLCBFT2JqZWN0IG93bmVyLCBNYXAgb2xkVG9OZXdPYmplY3RNYXApIHsJCi0JCU1hcCBsb2NhbE1hcCA9IGNvbnZlcnRNYXAob2xkVG9OZXdPYmplY3RNYXApOwotCQlpZiAobG9jYWxNYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIHNvdXJjZTsKLQkJfQotCQkKLQkJU3RyaW5nIHJlcGxhY2luZ1BhdGggPSBudWxsOwotCQlTdHJpbmcgcmVwbGFjZWRQYXRoID0gbnVsbDsJCQkKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlyZXBsYWNpbmdQYXRoID0gREVMSVZFUllfUEFUSDsKLQkJCXJlcGxhY2VkUGF0aCA9IENBUEFCSUxJVFlfUEFUSDsKLQkJfQotCQllbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQlyZXBsYWNpbmdQYXRoID0gQ0FQQUJJTElUWV9QQVRIOwotCQkJcmVwbGFjZWRQYXRoID0gREVMSVZFUllfUEFUSDsKLQkJfSBlbHNlIHsKLQkJCXJlcGxhY2luZ1BhdGggPSAiIjsKLQkJCXJlcGxhY2VkUGF0aCA9ICIiOwotCQl9Ci0JCQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfbGlua19yZWYubWF0Y2hlcihzb3VyY2UpOwotCi0JCXdoaWxlIChtLmZpbmQoKSkgewotCQkJU3RyaW5nIHRleHQgPSBtLmdyb3VwKCk7CQkJCQkJCi0JCQlNYXAgYXR0cmlidXRlTWFwID0gUmVzb3VyY2VIZWxwZXIuZ2V0QXR0cmlidXRlc0Zyb21MaW5rKHRleHQpOwotCQkJU3RyaW5nIG9sZEd1aWQgPSAoU3RyaW5nKSBhdHRyaWJ1dGVNYXAuZ2V0KFJlc291cmNlSGVscGVyLlRBR19BVFRSX0dVSUQpOwkKLQkJCVN0cmluZyBuZXdHdWlkID0gb2xkR3VpZCA9PSBudWxsID8gbnVsbCA6IChTdHJpbmcpIGxvY2FsTWFwLmdldChvbGRHdWlkKTsKLQkJCQotCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB0ZXh0OiAgICAgICIgKyB0ZXh0KTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBhdHRyaWJ1dGVNYXA6ICIgKyBhdHRyaWJ1dGVNYXApOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG9sZEd1aWQ6ICIgKyBvbGRHdWlkKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBuZXdHdWlkOiAiICsgbmV3R3VpZCk7Ci0JCQl9CQkJCi0JCQlpZiAobmV3R3VpZCAhPSBudWxsICYmICFuZXdHdWlkLmVxdWFscyhvbGRHdWlkKSkgewotCQkJCQkJCQkKLQkJCQkvL1N0cmluZyByZXBsYWNlbWVudCA9IHRleHQucmVwbGFjZUFsbChvbGRHdWlkLCBuZXdHdWlkKTsKLQkJCQkvL0Nhbid0IHVzZSB0aGUgYWJvdmUgY29tbWVudGVkIG91dCBsaW5lLCBiZWNhdXNlIHNvbWUgZ3VpZCBzdHJpbmdzIGFyZSBub3QgdmFsaWQgcmVnZXggcGF0dGVybnMKLQkJCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSByZXBsYWNlQWxsKHRleHQsIG9sZEd1aWQsIG5ld0d1aWQpOwkJCi0JCQkJaWYgKHJlcGxhY2VtZW50LmluZGV4T2YocmVwbGFjZWRQYXRoKSA+IDApIHsKLQkJCQkJcmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudC5yZXBsYWNlRmlyc3QocmVwbGFjZWRQYXRoLCByZXBsYWNpbmdQYXRoKTsKLQkJCQl9Ci0JCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcmVwbGFjZW1lbnQ6ICIgKyByZXBsYWNlbWVudCk7Ci0JCQkJfQotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIHJlcGxhY2VtZW50KTsJCi0JCQl9Ci0JCQkKLQkJfQotCQltLmFwcGVuZFRhaWwoc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHRleHQgU3RyaW5nCi0JICogQHBhcmFtIHJlcGxhY2VkIFN0cmluZwotCSAqIEBwYXJhbSByZXBsYWNpbmcgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlQWxsKFN0cmluZyB0ZXh0LCBTdHJpbmcgcmVwbGFjZWQsIFN0cmluZyByZXBsYWNpbmcpIHsKLQkJaW50IGZyb21JbmRleCA9IDA7Ci0JCWludCBpeCA9IHRleHQuaW5kZXhPZihyZXBsYWNlZCwgZnJvbUluZGV4KTsKLQkJaWYgKGl4IDwgMCkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0JCQkKLQkJaW50IHJlcGxhY2VkTGVuID0gcmVwbGFjZWQubGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciBuZXdUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl3aGlsZSAoaXggPj0gZnJvbUluZGV4KSB7Ci0JCQlpZiAoaXggPiBmcm9tSW5kZXgpIHsKLQkJCQluZXdUZXh0LmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhmcm9tSW5kZXgsIGl4KSk7Ci0JCQl9Ci0JCQluZXdUZXh0LmFwcGVuZChyZXBsYWNpbmcpOwotCQkJZnJvbUluZGV4ID0gaXggKyByZXBsYWNlZExlbjsKLQkJCWl4ID0gdGV4dC5pbmRleE9mKHJlcGxhY2VkLCBmcm9tSW5kZXgpOwotCQl9Ci0JCWlmIChmcm9tSW5kZXggPCB0ZXh0Lmxlbmd0aCgpICkgewotCQkJbmV3VGV4dC5hcHBlbmQodGV4dC5zdWJzdHJpbmcoZnJvbUluZGV4LCB0ZXh0Lmxlbmd0aCgpKSk7Ci0JCX0KLQkJcmV0dXJuIG5ld1RleHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvVHlwZUNvbnZlcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9UeXBlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjZjYyMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9UeXBlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5TZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBTZXAgMTMsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlQ29udmVydGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIGFjdGl2aXR5RmVhdHVyZUNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0JCQlpZihhcmcwID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkKLQl9OwotCQotCS8qKgotCSAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIGEgb2JqZWN0IG9mIG5ldyB0eXBlIHNwZWNpZmllZCBieSA8Y29kZT5uZXdUeXBlPC9jb2RlPiB3aGlsZSBzdGlsbAotCSAqIHByZXNlcnZpbmcgYXMgbWFueSBhdHRyaWJ1dGVzIGFuZCByZWxhdGlvbnNoaXBzIGFzIHBvc3NpYmxlCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBuZXdUeXBlCi0JICogQHBhcmFtIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAgbWFwIG9mIGZlYXR1cmUgb2YgPGNvZGU+b2JqZWN0PC9jb2RlPiB0byBmZWF0dXJlIG9mIDxjb2RlPm5ld1R5cGU8L2NvZGU+Ci0JICogQHJldHVybiBuZXcgb2JqZWN0IG9mIHR5cGUgPGNvZGU+bmV3VHlwZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVPYmplY3QgY29udmVydChFT2JqZWN0IG9iamVjdCwgRUNsYXNzIG5ld1R5cGUsCi0JCQlNYXAgb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCwgQ29tcGFyYXRvciBmZWF0dXJlQ29tcGFyYXRvciwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSAKLQl7Ci0JCVR5cGVDb252ZXJzaW9uQ29tbWFuZCBjbWQgPSBjcmVhdGVUeXBlQ29udmVyc2lvbkNvbW1hbmQob2JqZWN0LCBuZXdUeXBlLCBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwLCBmZWF0dXJlQ29tcGFyYXRvcik7Ci0JCXRyeSB7Ci0JCQljbWQuZXhlY3V0ZSgpOwotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkQWxsKGNtZC5nZXRNb2RpZmllZFJlc291cmNlcygpKTsKLQkJCXJldHVybiAoRU9iamVjdCkgY21kLmdldFJlc3VsdCgpLml0ZXJhdG9yKCkubmV4dCgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJY21kLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBFT2JqZWN0IGNvbnZlcnQoRU9iamVjdCBvYmplY3QsIEVDbGFzcyBuZXdUeXBlLCBNYXAgb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCwKLS8vCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0vLwkJRU9iamVjdCBuZXdPYmplY3QgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUobmV3VHlwZSk7Ci0vLwkJCi0vLwkJLy8gY29weSBhbGwgdGhlIGZlYXR1cmVzCi0vLwkJLy8KLS8vCQlMaXN0IG5ld09iamVjdEZlYXR1cmVzID0gbmV3VHlwZS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0LmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyLm5leHQoKTsKLS8vCQkJaWYoIW5ld09iamVjdEZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0vLwkJCQlpZihvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwICE9IG51bGwpIHsKLS8vCQkJCQlPYmplY3QgZiA9IG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAuZ2V0KGZlYXR1cmUpOwotLy8JCQkJCWlmKGYgIT0gbnVsbCAmJiBuZXdPYmplY3RGZWF0dXJlcy5jb250YWlucyhmKSkgewotLy8JCQkJCQlmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZjsKLS8vCQkJCQl9Ci0vLwkJCQkJZWxzZSB7Ci0vLwkJCQkJCWZlYXR1cmUgPSBudWxsOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCQlpZihmZWF0dXJlICE9IG51bGwgJiYgZmVhdHVyZS5pc0NoYW5nZWFibGUoKSkgewkJCQkKLS8vCQkJCWJvb2xlYW4gZmVhdHVyZUhhbmRsZWQgPSBmYWxzZTsKLS8vCQkJCWlmKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7Ci0vLwkJCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgZmVhdHVyZTsKLS8vCQkJCQlpZihyZWYgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04pIHsKLS8vCQkJCQkJaWYoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oKE1ldGhvZEVsZW1lbnQpIG9iamVjdCkpIHsKLS8vCQkJCQkJCUVPYmplY3QgdmFsdWUgPSAoRU9iamVjdCkgb2JqZWN0LmVHZXQocmVmKTsKLS8vCQkJCQkJCUVDbGFzcyBjb250ZW50RGVzY1R5cGUgPSBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5LmdldENvbnRlbnREZXNjcmlwdGlvblR5cGUobmV3VHlwZSk7Ci0vLwkJCQkJCQlpZihjb250ZW50RGVzY1R5cGUgIT0gbnVsbCAmJiBjb250ZW50RGVzY1R5cGUgIT0gdmFsdWUuZUNsYXNzKCkpIHsKLS8vCQkJCQkJCQl2YWx1ZSA9IGNvbnZlcnQodmFsdWUsIGNvbnRlbnREZXNjVHlwZSwgbnVsbCwgbW9kaWZpZWRSZXNvdXJjZXMpOwotLy8JCQkJCQkJfQotLy8JCQkJCQkJbmV3T2JqZWN0LmVTZXQocmVmLCB2YWx1ZSk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJZmVhdHVyZUhhbmRsZWQgPSB0cnVlOwotLy8JCQkJCX0JCQkJCQotLy8JCQkJCWVsc2UgaWYoIXJlZi5pc0NvbnRhaW5tZW50KCkgJiYgcmVmLmdldEVPcHBvc2l0ZSgpICE9IG51bGwpIHsKLS8vCQkJCQkJLy8gUmVmZXJlbmNlIGlzIGJpLWRpcmVjdGlvbmFsLiBJZiBvcHBvc2l0ZSByZWZlcmVuY2UgaXMgYSBsaXN0LCByZXBsYWNlIG9iamVjdAotLy8JCQkJCQkvLyB3aXRoIG5ldyBvYmplY3QgYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4gdGhlIGxpc3QuCi0vLwkJCQkJCS8vCi0vLwkJCQkJCUVSZWZlcmVuY2Ugb3Bwb3NpdGVSZWYgPSByZWYuZ2V0RU9wcG9zaXRlKCk7CQkJCQkJCi0vLwkJCQkJCWlmKG9wcG9zaXRlUmVmLmlzTWFueSgpKSB7Ci0vLwkJCQkJCQlPYmplY3QgdmFsdWUgPSBvYmplY3QuZUdldChyZWYpOwotLy8JCQkJCQkJaWYodmFsdWUgIT0gbnVsbCkgewotLy8JCQkJCQkJCWlmKHJlZi5pc01hbnkoKSkgewotLy8JCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChDb2xsZWN0aW9uKXZhbHVlKQotLy8JCQkJCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJCQkJCQlFT2JqZWN0IG90aGVyRW5kID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLS8vCQkJCQkJCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBvdGhlckVuZC5lR2V0KG9wcG9zaXRlUmVmKTsKLS8vCQkJCQkJCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihvYmplY3QpOwotLy8JCQkJCQkJCQkJbGlzdC5zZXQoaW5kZXgsIG5ld09iamVjdCk7Ci0vLwkJCQkJCQkJCX0KLS8vCQkJCQkJCQl9Ci0vLwkJCQkJCQkJZWxzZSB7Ci0vLwkJCQkJCQkJCUVPYmplY3Qgb3RoZXJFbmQgPSAoRU9iamVjdCkgdmFsdWU7Ci0vLwkJCQkJCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBvdGhlckVuZC5lR2V0KG9wcG9zaXRlUmVmKTsKLS8vCQkJCQkJCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKG9iamVjdCk7Ci0vLwkJCQkJCQkJCWxpc3Quc2V0KGluZGV4LCBuZXdPYmplY3QpOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCX0KLS8vCQkJCQkJCWZlYXR1cmVIYW5kbGVkID0gdHJ1ZTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWlmKCFmZWF0dXJlSGFuZGxlZCkgewotLy8JCQkJCW5ld09iamVjdC5lU2V0KGZlYXR1cmUsIG9iamVjdC5lR2V0KGZlYXR1cmUpKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0vLwkJCS8vIHJlZGlyZWN0IGFsbCBpbmNvbWluZyByZWZlcmVuY2VzIG9mIG9iamVjdCB0byBuZXdPYmplY3QKLS8vCQkJLy8KLS8vCQkJCi0vLwkJCU1ldGhvZEVsZW1lbnQgbWUgPSAoTWV0aG9kRWxlbWVudCkgb2JqZWN0OwotLy8JCQlDb2xsZWN0aW9uIG9wcG9zaXRlRmVhdHVyZXMgPSBtZS5nZXRPcHBvc2l0ZUZlYXR1cmVzKCk7Ci0vLwkJCWlmKCFvcHBvc2l0ZUZlYXR1cmVzLmlzRW1wdHkoKSkgewotLy8JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBtZS5lUmVzb3VyY2UoKTsKLS8vCQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLS8vCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0vLwkJCQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLS8vCQkJCQkJKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLmxvYWRPcHBvc2l0ZUZlYXR1cmVzKG5ldyBBcnJheUxpc3Qob3Bwb3NpdGVGZWF0dXJlcyksIAotLy8JCQkJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihtZS5nZXRHdWlkKCkpKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCQkKLS8vCQkJCU1hcCByZWZlcmVuY2VyVG9GZWF0dXJlTGlzdE1hcCA9IEFzc29jaWF0aW9uSGVscGVyLmdldFJlZmVyZW5jZU1hcChtZSk7Ci0vLwkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VyVG9GZWF0dXJlTGlzdE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLS8vCQkJCQlFT2JqZWN0IHJlZmVyZW5jZXIgPSAoRU9iamVjdCkgZW50cnkuZ2V0S2V5KCk7Ci0vLwkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQ29sbGVjdGlvbillbnRyeS5nZXRWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotLy8JCQkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCQkJRVJlZmVyZW5jZSBmZWF0dXJlID0gKEVSZWZlcmVuY2UpIGl0ZXJhdG9yLm5leHQoKTsKLS8vCQkJCQkJaWYoZmVhdHVyZS5nZXRFVHlwZSgpLmlzSW5zdGFuY2UobmV3T2JqZWN0KSkgewotLy8JCQkJCQkJaWYoZmVhdHVyZS5pc01hbnkoKSkgewotLy8JCQkJCQkJCUxpc3QgbGlzdCA9IChMaXN0KSByZWZlcmVuY2VyLmVHZXQoZmVhdHVyZSk7Ci0vLwkJCQkJCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKG9iamVjdCk7Ci0vLwkJCQkJCQkJbGlzdC5zZXQoaW5kZXgsIG5ld09iamVjdCk7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCQllbHNlIHsKLS8vCQkJCQkJCQlyZWZlcmVuY2VyLmVTZXQoZmVhdHVyZSwgbmV3T2JqZWN0KTsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCQllbHNlIHsJCQkJCQkJCi0vLwkJCQkJCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0vLwkJCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIHJlZmVyZW5jZXIuZUdldChmZWF0dXJlKTsKLS8vCQkJCQkJCQlsaXN0LnJlbW92ZShvYmplY3QpOwotLy8JCQkJCQkJfQotLy8JCQkJCQkJZWxzZSB7Ci0vLwkJCQkJCQkJcmVmZXJlbmNlci5lU2V0KGZlYXR1cmUsIGZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCkpOwotLy8JCQkJCQkJfQotLy8JCQkJCQkJcmVzb3VyY2UgPSByZWZlcmVuY2VyLmVSZXNvdXJjZSgpOwotLy8JCQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotLy8JCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJCi0vLwkJLy8gcmVwbGFjZSBvYmplY3Qgd2l0aCBuZXdPYmplY3QgaW4gdGhlIG9iamVjdCdzIGNvbnRhaW5lcgotLy8JCS8vCi0vLwkJRU9iamVjdCBjb250YWluZXIgPSBvYmplY3QuZUNvbnRhaW5lcigpOwotLy8JCWlmKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0vLwkJCUVSZWZlcmVuY2UgcmVmID0gb2JqZWN0LmVDb250YWlubWVudEZlYXR1cmUoKTsKLS8vCQkJaWYocmVmLmlzTWFueSgpKSB7Ci0vLwkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgY29udGFpbmVyLmVHZXQocmVmKTsKLS8vCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihvYmplY3QpOwotLy8JCQkJbGlzdC5zZXQoaW5kZXgsIG5ld09iamVjdCk7Ci0vLwkJCX0KLS8vCQkJZWxzZSB7Ci0vLwkJCQljb250YWluZXIuZVNldChyZWYsIG5ld09iamVjdCk7Ci0vLwkJCX0KLS8vCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb250YWluZXIuZVJlc291cmNlKCk7Ci0vLwkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLS8vCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJCi0vLwkJcmV0dXJuIG5ld09iamVjdDsKLS8vCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUNvcHlUYXNrIHsKLQkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyOwotCQlNZXRob2RFbGVtZW50IG93bmVyOwotCQlTdHJpbmcgY29udGVudDsKLQkJU3RyaW5nIGNvbnRlbnRQYXRoOwotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSBzY2FubmVyCi0JCSAqIEBwYXJhbSBvd25lcgotCQkgKiBAcGFyYW0gY29udGVudAotCQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkJICovCi0JCXB1YmxpYyBSZXNvdXJjZUNvcHlUYXNrKENvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciwgTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIGNvbnRlbnQsIFN0cmluZyBjb250ZW50UGF0aCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc2Nhbm5lciA9IHNjYW5uZXI7Ci0JCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCQl0aGlzLmNvbnRlbnQgPSBjb250ZW50OwotCQkJdGhpcy5jb250ZW50UGF0aCA9IGNvbnRlbnRQYXRoOwotCQl9CQotCQkJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFR5cGVDb252ZXJzaW9uQ29tbWFuZCBleHRlbmRzIENvbXBvdW5kQ29tbWFuZCBpbXBsZW1lbnRzIElSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQkJcHJpdmF0ZSBDb2xsZWN0aW9uIHJlc3VsdDsKLQkJcHJpdmF0ZSBFT2JqZWN0IG9iamVjdDsKLQkJcHJpdmF0ZSBIYXNoU2V0IG1vZGlmaWVkUmVzb3VyY2VzOwotCQlwcml2YXRlIGJvb2xlYW4gZ290TW9kaWZpZWRSZXNvdXJjZXM7Ci0JCXByaXZhdGUgTGlzdCByZXNvdXJjZUNvcHlUYXNrczsKLQkJcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZTsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uIGlsbGVnYWxSZWZlcmVuY2VyczsKLQotCQkvKioKLQkJICogQHBhcmFtIG9iamVjdAotCQkgKi8KLQkJcHVibGljIFR5cGVDb252ZXJzaW9uQ29tbWFuZChFT2JqZWN0IG9iamVjdCkgewotCQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlyZXNvdXJjZSA9IG9iamVjdC5lUmVzb3VyY2UoKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQkJcmVzb3VyY2VDb3B5VGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWlmKGlsbGVnYWxSZWZlcmVuY2VycyAhPSBudWxsKSB7Ci0JCQkJaWxsZWdhbFJlZmVyZW5jZXJzLmNsZWFyKCk7Ci0JCQl9Ci0JCQlpZihtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJCX0KLQkJCWlmKHJlc291cmNlQ29weVRhc2tzICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZUNvcHlUYXNrcy5jbGVhcigpOwotCQkJfQotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQl9Ci0JCQkJCi0JCS8qKgotCQkgKiBHZXRzIHJlZmVyZW5jZXJzIHRoYXQgYmVjb21lIGlsbGVnYWwgYWZ0ZXIgdGhlIHR5cGUgY29udmVyc2lvbgotCQkgKiAKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0SWxsZWdhbFJlZmVyZW5jZXJzKCkgewotCQkJaWYoaWxsZWdhbFJlZmVyZW5jZXJzID09IG51bGwpIHsKLQkJCQlnZXRNb2RpZmllZFJlc291cmNlcygpOwotCQkJfQotCQkJcmV0dXJuIGlsbGVnYWxSZWZlcmVuY2VyczsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY29weVJlc291cmNlcygpIHsKLQkJCWlmKCFyZXNvdXJjZUNvcHlUYXNrcy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZUNvcHlUYXNrcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2VDb3B5VGFzayB0ID0gKFJlc291cmNlQ29weVRhc2spIGl0ZXIubmV4dCgpOwotCQkJCQlGaWxlIG5ld1Jlc291cmNlUGF0aCA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCksIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFBhdGgodC5vd25lcikpOwotCQkJCQl0LnNjYW5uZXIuc2V0VGFyZ2V0Um9vdFBhdGgobmV3UmVzb3VyY2VQYXRoKTsKLQkJCQkJaWYodC5jb250ZW50ICE9IG51bGwpIHsKLQkJCQkJCXQuc2Nhbm5lci5yZXNvbHZlUmVzb3VyY2VzKHQub3duZXIsIHQuY29udGVudCwgdC5jb250ZW50UGF0aCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdC5vd25lci5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoRUF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCU9iamVjdCB2YWx1ZSA9IHQub3duZXIuZUdldChhdHRyaWJ1dGUpOwotCQkJCQkJCWlmKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCQkJCXQuc2Nhbm5lci5yZXNvbHZlUmVzb3VyY2VzKHQub3duZXIsIChTdHJpbmcpIHZhbHVlLCB0LmNvbnRlbnRQYXRoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQkJaWYoIWdvdE1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCQkJaWxsZWdhbFJlZmVyZW5jZXJzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmKGNtZCBpbnN0YW5jZW9mIFJlbW92ZUNvbW1hbmQpIHsKLQkJCQkJCVJlbW92ZUNvbW1hbmQgcmVtb3ZlQ29tbWFuZCA9IChSZW1vdmVDb21tYW5kKSBjbWQ7Ci0JCQkJCQlFT2JqZWN0IG93bmVyID0gcmVtb3ZlQ29tbWFuZC5nZXRPd25lcigpOwotCQkJCQkJUmVzb3VyY2Ugb3duZXJSZXNvdXJjZSA9IG93bmVyLmVSZXNvdXJjZSgpOwotCQkJCQkJaWYob3duZXJSZXNvdXJjZSAhPSBudWxsICYmIG93bmVyUmVzb3VyY2UgIT0gcmVzb3VyY2UpIHsKLQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQob3duZXJSZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZihvd25lclJlc291cmNlICE9IG51bGwgJiYgb3duZXIgIT0gb2JqZWN0ICYmICFVbWFVdGlsLmlzQ29udGFpbmVkQnkob3duZXIsIG9iamVjdCkpIHsKLQkJCQkJCQlpbGxlZ2FsUmVmZXJlbmNlcnMuYWRkKG93bmVyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmKGNtZCBpbnN0YW5jZW9mIFNldENvbW1hbmQpIHsKLQkJCQkJCVNldENvbW1hbmQgc2V0Q29tbWFuZCA9IChTZXRDb21tYW5kKSBjbWQ7Ci0JCQkJCQlFT2JqZWN0IG93bmVyID0gc2V0Q29tbWFuZC5nZXRPd25lcigpOwotCQkJCQkJUmVzb3VyY2Ugb3duZXJSZXNvdXJjZSA9IG93bmVyLmVSZXNvdXJjZSgpOwotCQkJCQkJaWYob3duZXJSZXNvdXJjZSAhPSBudWxsICYmIG93bmVyUmVzb3VyY2UgIT0gcmVzb3VyY2UgJiYgc2V0Q29tbWFuZC5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJCUVPYmplY3QgdmFsdWUgPSAoRU9iamVjdCkgc2V0Q29tbWFuZC5nZXRWYWx1ZSgpOwotCQkJCQkJCWlmKHZhbHVlICE9IG9iamVjdCB8fCAhVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KHZhbHVlLCBvYmplY3QpKSB7Ci0JCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChvd25lclJlc291cmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZihvd25lclJlc291cmNlICE9IG51bGwgJiYgb3duZXIgIT0gb2JqZWN0ICYmICFVbWFVdGlsLmlzQ29udGFpbmVkQnkob3duZXIsIG9iamVjdCkKLQkJCQkJCQkJJiYgc2V0Q29tbWFuZC5nZXRWYWx1ZSgpID09IHNldENvbW1hbmQuZ2V0RmVhdHVyZSgpLmdldERlZmF1bHRWYWx1ZSgpKSB7Ci0JCQkJCQkJaWxsZWdhbFJlZmVyZW5jZXJzLmFkZChvd25lcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZ290TW9kaWZpZWRSZXNvdXJjZXMgPSB0cnVlOwotCQkJfQotCQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgc2V0UmVzdWx0KENvbGxlY3Rpb24gcmVzdWx0KSB7Ci0JCQl0aGlzLnJlc3VsdCA9IHJlc3VsdDsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG9iamVjdCBFT2JqZWN0Ci0JICogQHBhcmFtIG5ld1R5cGUgRUNsYXNzCi0JICogQHBhcmFtIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAgTWFwCi0JICogQHBhcmFtIGZlYXR1cmVDb21wYXJhdG9yIENvbXBhcmF0b3IKLQkgKiBAcmV0dXJuIFR5cGVDb252ZXJzaW9uQ29tbWFuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUNvbnZlcnNpb25Db21tYW5kIGNyZWF0ZVR5cGVDb252ZXJzaW9uQ29tbWFuZChFT2JqZWN0IG9iamVjdCwgRUNsYXNzIG5ld1R5cGUsIAotCQkJTWFwIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAsIENvbXBhcmF0b3IgZmVhdHVyZUNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIGNyZWF0ZVR5cGVDb252ZXJzaW9uQ29tbWFuZChvYmplY3QsIG5ld1R5cGUsIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAsIGZlYXR1cmVDb21wYXJhdG9yLCBmYWxzZSwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IEVPYmplY3QKLQkgKiBAcGFyYW0gbmV3VHlwZSBFQ2xhc3MKLQkgKiBAcGFyYW0gb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCBNYXAKLQkgKiBAcGFyYW0gZmVhdHVyZUNvbXBhcmF0b3IgQ29tcGFyYXRvcgotCSAqIEBwYXJhbSByZW1vdmVJbmNvbWluZ1JlZmVyZW5jZXMgYm9vbGVhbgotCSAqIEBwYXJhbSByZW1vdmVWYXJpYWJpbGl0eSBib29sZWFuCi0JICogQHJldHVybiBUeXBlQ29udmVyc2lvbkNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVDb252ZXJzaW9uQ29tbWFuZCBjcmVhdGVUeXBlQ29udmVyc2lvbkNvbW1hbmQoRU9iamVjdCBvYmplY3QsIEVDbGFzcyBuZXdUeXBlLCAKLQkJCU1hcCBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwLCBDb21wYXJhdG9yIGZlYXR1cmVDb21wYXJhdG9yLCAKLQkJCWJvb2xlYW4gcmVtb3ZlSW5jb21pbmdSZWZlcmVuY2VzLCBib29sZWFuIHJlbW92ZVZhcmlhYmlsaXR5KSB7Ci0JCVR5cGVDb252ZXJzaW9uQ29tbWFuZCBjbWQgPSBuZXcgVHlwZUNvbnZlcnNpb25Db21tYW5kKG9iamVjdCk7Ci0JCUVPYmplY3QgbmV3T2JqZWN0ID0gcHJlcGFyZUNvbnZlcnQob2JqZWN0LCBuZXdUeXBlLCBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwLCBmZWF0dXJlQ29tcGFyYXRvciwgcmVtb3ZlSW5jb21pbmdSZWZlcmVuY2VzLCByZW1vdmVWYXJpYWJpbGl0eSwgY21kKTsKLQkJCi0JCS8vIHJlcGxhY2Ugb2JqZWN0IHdpdGggbmV3T2JqZWN0IGluIHRoZSBvYmplY3QncyBjb250YWluZXIKLQkJLy8KLQkJRU9iamVjdCBjb250YWluZXIgPSBvYmplY3QuZUNvbnRhaW5lcigpOwotCQlpZihjb250YWluZXIgIT0gbnVsbCkgewotCQkJRVJlZmVyZW5jZSByZWYgPSBvYmplY3QuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQkJaWYocmVmLmlzTWFueSgpKSB7Ci0JCQkJTGlzdCBsaXN0ID0gKExpc3QpIGNvbnRhaW5lci5lR2V0KHJlZik7Ci0JCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJY21kLmFwcGVuZChuZXcgU2V0Q29tbWFuZChudWxsLCBjb250YWluZXIsIHJlZiwgbmV3T2JqZWN0LCBpbmRleCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY21kLmFwcGVuZChuZXcgU2V0Q29tbWFuZChudWxsLCBjb250YWluZXIsIHJlZiwgbmV3T2JqZWN0KSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWNtZC5zZXRSZXN1bHQoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXdPYmplY3QpKTsKLQkJCi0JCXJldHVybiBjbWQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIENvbnRlbnRSZXNvdXJjZVNjYW5uZXIgY3JlYXRlU2Nhbm5lcihFT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gJiYgIShvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pKSB7Ci0JCQlGaWxlIG9sZFJlc291cmNlUGF0aCA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpLCBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0JCQkJCS5nZXRFbGVtZW50UGF0aCgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KSk7Ci0JCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBuZXcgQ29udGVudFJlc291cmNlU2Nhbm5lcihvbGRSZXNvdXJjZVBhdGgpOwotCQkJcmV0dXJuIHNjYW5uZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQkvKioKLQkgKiBQcmVwYXJlcyBhIGNvbXBvdW5kIGNvbW1hbmQgdG8gZG8gYSB0eXBlIGNvbnZlcnNpb24KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIG5ld1R5cGUKLQkgKiBAcGFyYW0gb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcAotCSAqIEBwYXJhbSBmZWF0dXJlQ29tcGFyYXRvciB1c2VkIHRvIHNvcnQgdGhlIGZlYXR1cmUgbGlzdCBvZiBvYmplY3QgdG8gY29udmVydCBiZWZvcmUgY29weWluZy9tb3ZpbmcKLQkgKiAgICAgICAgZmVhdHVyZSB2YWx1ZXMgdG8gbmV3IG9iamVjdC4KLQkgKiBAcGFyYW0gcmVtb3ZlSW5jb21pbmdSZWZlcmVuY2VzIGlmIHRydWUgd2lsbCByZW1vdmUgYWxsIGluY29taW5nIHJlZmVyZW5jZXMgCi0JICogQHBhcmFtIGNvbXBvdW5kQ29tbWFuZAotCSAqIEByZXR1cm4gRU9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRU9iamVjdCBwcmVwYXJlQ29udmVydChFT2JqZWN0IG9iamVjdCwgRUNsYXNzIG5ld1R5cGUsIE1hcCBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwLAotCQkJQ29tcGFyYXRvciBmZWF0dXJlQ29tcGFyYXRvciwgYm9vbGVhbiByZW1vdmVJbmNvbWluZ1JlZmVyZW5jZXMsIGJvb2xlYW4gcmVtb3ZlVmFyaWFiaWxpdHksCi0JCQlUeXBlQ29udmVyc2lvbkNvbW1hbmQgY29tcG91bmRDb21tYW5kKSB7Ci0JCUVPYmplY3QgbmV3T2JqZWN0ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKG5ld1R5cGUpOwotCQkKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJLy8gSGFuZGxlIGluY29taW5nIHJlZmVyZW5jZXMuCi0JCQkvLyBJZiByZW1vdmVJbmNvbW1pbmdSZWZlcmVuY2VzIGlzIGZhbHNlLCByZWRpcmVjdCBhbGwgaW5jb21pbmcgcmVmZXJlbmNlcyBvZiBvYmplY3QgdG8gbmV3T2JqZWN0Ci0JCQkvLyBJZiByZW1vdmVJbmNvbW1pbmdSZWZlcmVuY2VzIGlzIHRydWUsIHJlbW92ZSBhbGwgb2YgdGhlbS4KLQkJCS8vCQkJCi0KLQkJCU1ldGhvZEVsZW1lbnQgbWUgPSAoTWV0aG9kRWxlbWVudCkgb2JqZWN0OwotCQkJQ29sbGVjdGlvbiBvcHBvc2l0ZUZlYXR1cmVzID0gbWUuZ2V0T3Bwb3NpdGVGZWF0dXJlcygpOwotCQkJaWYoIW9wcG9zaXRlRmVhdHVyZXMuaXNFbXB0eSgpKSB7CQkJCQotCQkJCQotCQkJCS8vIGxvYWQgb3Bwb3NpdGUgZmVhdHVyZXMKLQkJCQkvLwotCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qob2JqZWN0KTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldE9wcG9zaXRlRmVhdHVyZUxvYWRlcnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlJT3Bwb3NpdGVGZWF0dXJlTG9hZGVyIGxvYWRlciA9IChJT3Bwb3NpdGVGZWF0dXJlTG9hZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJbG9hZGVyLmxvYWRPcHBvc2l0ZUZlYXR1cmVzKGNvbGxlY3Rpb24pOwotCQkJCX0KLQkJCQkKLQkJCQlNYXAgcmVmZXJlbmNlclRvRmVhdHVyZUxpc3RNYXAgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZWZlcmVuY2VNYXAobWUpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZXJUb0ZlYXR1cmVMaXN0TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCUVPYmplY3QgcmVmZXJlbmNlciA9IChFT2JqZWN0KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQ29sbGVjdGlvbillbnRyeS5nZXRWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFUmVmZXJlbmNlIGZlYXR1cmUgPSAoRVJlZmVyZW5jZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYoIXJlbW92ZUluY29taW5nUmVmZXJlbmNlcyAmJiBmZWF0dXJlLmdldEVUeXBlKCkuaXNJbnN0YW5jZShuZXdPYmplY3QpKSB7Ci0JCQkJCQkJLy8gbmV3IHR5cGUgaXMgY29tcGF0aWJsZSwgcmVmZXJlbmNlIGNhbiBiZSBwcmVzZXJ2ZWQKLQkJCQkJCQkvLwotCQkJCQkJCWlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIHJlZmVyZW5jZXIuZUdldChmZWF0dXJlKTsKLQkJCQkJCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQobmV3IFNldENvbW1hbmQobnVsbCwgcmVmZXJlbmNlciwgZmVhdHVyZSwgbmV3T2JqZWN0LCBpbmRleCkpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChuZXcgU2V0Q29tbWFuZChudWxsLCByZWZlcmVuY2VyLCBmZWF0dXJlLCBuZXdPYmplY3QpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBuZXcgdHlwZSBpcyBub3QgY29tcGF0aWJsZSwgcmVmZXJlbmNlIG11c3QgYmUgcmVtb3ZlZAotCQkJCQkJCS8vCi0JCQkJCQkJaWYoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKG5ldyBSZW1vdmVDb21tYW5kKG51bGwsIHJlZmVyZW5jZXIsIGZlYXR1cmUsIG9iamVjdCkpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChuZXcgU2V0Q29tbWFuZChudWxsLCByZWZlcmVuY2VyLCBmZWF0dXJlLCBmZWF0dXJlLmdldERlZmF1bHRWYWx1ZSgpKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBjb3B5IGFsbCB0aGUgZmVhdHVyZXMKLQkJLy8KLQkJTGlzdCBuZXdPYmplY3RGZWF0dXJlcyA9IG5ld1R5cGUuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlMaXN0IG9iamVjdEZlYXR1cmVzID0gbmV3IEFycmF5TGlzdChvYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpKTsKLQkJaWYocmVtb3ZlVmFyaWFiaWxpdHkpIHsKLQkJCW9iamVjdEZlYXR1cmVzLnJlbW92ZShVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQpOwotCQkJb2JqZWN0RmVhdHVyZXMucmVtb3ZlKFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSk7Ci0JCX0KLQkJaWYoZmVhdHVyZUNvbXBhcmF0b3IgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbnMuc29ydChvYmplY3RGZWF0dXJlcywgZmVhdHVyZUNvbXBhcmF0b3IpOwotCQl9Ci0JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IGNyZWF0ZVNjYW5uZXIob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0RmVhdHVyZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJaWYoIW5ld09iamVjdEZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQkJaWYob2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCAhPSBudWxsKSB7Ci0JCQkJCU9iamVjdCBmID0gb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcC5nZXQoZmVhdHVyZSk7Ci0JCQkJCWlmKGYgIT0gbnVsbCAmJiBuZXdPYmplY3RGZWF0dXJlcy5jb250YWlucyhmKSkgewotCQkJCQkJZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGY7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlmZWF0dXJlID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZmVhdHVyZSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJaWYoZmVhdHVyZSAhPSBudWxsICYmIGZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkpIHsJCQkJCi0JCQkJYm9vbGVhbiBmZWF0dXJlSGFuZGxlZCA9IGZhbHNlOwotCQkJCWlmKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7Ci0JCQkJCUVSZWZlcmVuY2UgcmVmID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0JCQkJCWlmKHJlZiA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTikgewotCQkJCQkJaWYoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oKE1ldGhvZEVsZW1lbnQpIG9iamVjdCkpIHsKLQkJCQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIG9iamVjdC5lR2V0KHJlZik7Ci0JCQkJCQkJRUNsYXNzIGNvbnRlbnREZXNjVHlwZSA9IENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuZ2V0Q29udGVudERlc2NyaXB0aW9uVHlwZShuZXdUeXBlKTsKLQkJCQkJCQlpZihjb250ZW50RGVzY1R5cGUgIT0gbnVsbCAmJiBjb250ZW50RGVzY1R5cGUgIT0gY29udGVudC5lQ2xhc3MoKSkgewotCQkJCQkJCQlFT2JqZWN0IG5ld0NvbnRlbnQgPSBwcmVwYXJlQ29udmVydChjb250ZW50LCBjb250ZW50RGVzY1R5cGUsIG51bGwsIG51bGwsIHJlbW92ZUluY29taW5nUmVmZXJlbmNlcywgcmVtb3ZlVmFyaWFiaWxpdHksIGNvbXBvdW5kQ29tbWFuZCk7Ci0JCQkJCQkJCQotCQkJCQkJCQkvLyByZW1vdmUgb2xkIGNvbnRlbnQKLQkJCQkJCQkJLy8KLQkJCQkJCQkJRU9iamVjdCBjb250YWluZXIgPSBjb250ZW50LmVDb250YWluZXIoKTsKLQkJCQkJCQkJaWYoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQobmV3IFNldENvbW1hbmQobnVsbCwgb2JqZWN0LCByZWYsIG51bGwpKTsKLQkJCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gY29udGVudC5lUmVzb3VyY2UoKTsKLQkJCQkJCQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCQljb21wb3VuZENvbW1hbmQubW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnQuZVJlc291cmNlKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCQljb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgbmV3Q29udGVudDsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5yZXNvdXJjZUNvcHlUYXNrcy5hZGQobmV3IFJlc291cmNlQ29weVRhc2soY3JlYXRlU2Nhbm5lcihjb250ZW50KSwgY29udGVudCwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKG5ldyBTZXRDb21tYW5kKG51bGwsIG5ld09iamVjdCwgcmVmLCBjb250ZW50KSk7Ci0JCQkJCQl9Ci0JCQkJCQlmZWF0dXJlSGFuZGxlZCA9IHRydWU7Ci0JCQkJCX0JCQkJCQotCQkJCQllbHNlIGlmKCFyZWYuaXNDb250YWlubWVudCgpICYmIHJlZi5nZXRFT3Bwb3NpdGUoKSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBSZWZlcmVuY2UgaXMgYmktZGlyZWN0aW9uYWwuIElmIG9wcG9zaXRlIHJlZmVyZW5jZSBpcyBhIGxpc3QsIHJlcGxhY2Ugb2JqZWN0Ci0JCQkJCQkvLyB3aXRoIG5ldyBvYmplY3QgYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4gdGhlIGxpc3QuCi0JCQkJCQkvLwotCQkJCQkJRVJlZmVyZW5jZSBvcHBvc2l0ZVJlZiA9IHJlZi5nZXRFT3Bwb3NpdGUoKTsJCQkJCQkKLQkJCQkJCWlmKG9wcG9zaXRlUmVmLmlzTWFueSgpKSB7Ci0JCQkJCQkJT2JqZWN0IHZhbHVlID0gb2JqZWN0LmVHZXQocmVmKTsKLQkJCQkJCQlpZih2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmKHJlZi5pc01hbnkoKSkgewotCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQ29sbGVjdGlvbil2YWx1ZSkKLQkJCQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQlFT2JqZWN0IG90aGVyRW5kID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgb3RoZXJFbmQuZUdldChvcHBvc2l0ZVJlZik7Ci0JCQkJCQkJCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChuZXcgU2V0Q29tbWFuZChudWxsLCBvdGhlckVuZCwgb3Bwb3NpdGVSZWYsIG5ld09iamVjdCwgaW5kZXgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCUVPYmplY3Qgb3RoZXJFbmQgPSAoRU9iamVjdCkgdmFsdWU7Ci0JCQkJCQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgb3RoZXJFbmQuZUdldChvcHBvc2l0ZVJlZik7Ci0JCQkJCQkJCQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQobmV3IFNldENvbW1hbmQobnVsbCwgb3RoZXJFbmQsIG9wcG9zaXRlUmVmLCBuZXdPYmplY3QsIGluZGV4KSk7CQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWZlYXR1cmVIYW5kbGVkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZighZmVhdHVyZUhhbmRsZWQpIHsKLQkJCQkJT2JqZWN0IHZhbHVlID0gb2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSkgewotCQkJCQkJLy8gdmFsaWRhdGUgbmFtZQotCQkJCQkJU3RyaW5nIG5ld05hbWUgPSBjaGVja05hbWUob2JqZWN0LCBuZXdUeXBlKTsKLQkJCQkJCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ld05hbWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYoc2Nhbm5lciAhPSBudWxsICYmIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICYmIG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCVN0cmluZyBzdHIgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsoc3RyKSkgewotCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5yZXNvdXJjZUNvcHlUYXNrcy5hZGQobmV3IFJlc291cmNlQ29weVRhc2soc2Nhbm5lciwgKE1ldGhvZEVsZW1lbnQpb2JqZWN0LCBzdHIsICIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKG5ldyBTZXRDb21tYW5kKG51bGwsIG5ld09iamVjdCwgZmVhdHVyZSwgdmFsdWUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCQkJCQotCQlyZXR1cm4gbmV3T2JqZWN0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBvbGRBY3Rpdml0eSBBY3Rpdml0eQotCSAqIEBwYXJhbSBuZXdUeXBlIEVDbGFzcwotCSAqIEByZXR1cm4gQWN0aXZpdHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IGNvbnZlcnRBY3Rpdml0eShBY3Rpdml0eSBvbGRBY3Rpdml0eSwgRUNsYXNzIG5ld1R5cGUpIHsKLQkJLy8gYWN0aXZpdHkgaXMgYWxyZWFkeSB0aGlzIHR5cGUKLQkJLy8KLQkJaWYgKG5ld1R5cGUgPT0gb2xkQWN0aXZpdHkuZUNsYXNzKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlIYXNoU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJQWN0aXZpdHkgbmV3QWN0aXZpdHkgPSAoQWN0aXZpdHkpIFR5cGVDb252ZXJ0ZXIuY29udmVydChvbGRBY3Rpdml0eSwgbmV3VHlwZSwgbnVsbCwgYWN0aXZpdHlGZWF0dXJlQ29tcGFyYXRvciwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCS8vIHNhdmUgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCS8vCi0JCWlmICghbW9kaWZpZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJdHJ5IHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXMpOwotCQkJCX0KLQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlLAotCQkJCQkJCQlOTFMKLQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuc2F2ZUNvbnZlcnRlZEFjdGl2aXR5RXJyb3JfbXNnLAotCQkJCQkJCQkJCQkJbmV3QWN0aXZpdHkuZ2V0TmFtZSgpKSwKLQkJCQkJCQkJTGlicmFyeVJlc291cmNlcy5lcnJvcl9yZWFzb24sIGUpOwotCi0JCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBuZXdBY3Rpdml0eTsKLQl9CQkKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZUlEIGludAotCSAqIEByZXR1cm4gRUNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBFQ2xhc3MgZ2V0QWN0aXZpdHlUeXBlKGludCB0eXBlSUQpIHsKLQkJc3dpdGNoICh0eXBlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFk7Ci0JCWNhc2UgVW1hUGFja2FnZS5JVEVSQVRJT046Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5JVEVSQVRJT047Ci0JCWNhc2UgVW1hUGFja2FnZS5QSEFTRToKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBIQVNFOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBAcGFyYW0gb2xkR3VpZGFuY2UKLQkgKiBAcGFyYW0gbmV3R3VpZGFuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShFT2JqZWN0IG9iamVjdCwgRUNsYXNzIG5ld1R5cGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JCQlOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpb2JqZWN0OwotCQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVOYW1lVmFsaWRhdG9yKGUuZUNvbnRhaW5lcigpLCBlLCBuZXdUeXBlKTsKLQkJCVN0cmluZyBtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChlLmdldE5hbWUoKSk7Ci0JCQlpZihtc2cgIT0gbnVsbCkgewotCQkJCVN0cmluZyBmZWF0dXJlVHh0ID0gVG5nVXRpbC5nZXRGZWF0dXJlVGV4dChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQJCQkKLQkJCQlTdHJpbmcgZGxnTXNnID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQsCi0JCQkJCQlTdHJVdGlsLnRvTG93ZXIoZmVhdHVyZVR4dCksIGUuZ2V0TmFtZSgpKTsKLQkJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gKFN0cmluZykgZS5lR2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCi0JCQkJSUlucHV0VmFsaWRhdG9yIGlucHV0VmFsaWRhdG9yID0gbmV3IElJbnB1dFZhbGlkYXRvcigpIHsKLQkJCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCQlyZXR1cm4gdmFsaWRhdG9yLmlzVmFsaWQobmV3VGV4dCk7Ci0JCQkJCX0KLQkJCQl9OwotCQotCQkJCUlucHV0RGlhbG9nIGlucHV0RGxnID0gbmV3IElucHV0RGlhbG9nKAotCQkJCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLCB0aXRsZSwgZGxnTXNnLCBjdXJyZW50VmFsdWUsCi0JCQkJCQlpbnB1dFZhbGlkYXRvcik7Ci0JCQkJaWYgKGlucHV0RGxnLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlyZXR1cm4gaW5wdXREbGcuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDBlMGUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgYWNjZXNzIGFuZCBlZGl0aW5nIHN1cHBvcnQgZm9yIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Ly5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWM5Zjc5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODg0YjMwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LAotIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gY29tLmlibS5pY3UKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NDk0ZWZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgbW9kZWwvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L21vZGVsL01TX1Byb2plY3RfMjAwMy5nZW5tb2RlbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9tb2RlbC9NU19Qcm9qZWN0XzIwMDMuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY5NDZmMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L21vZGVsL01TX1Byb2plY3RfMjAwMy5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDU5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0IiBtb2RlbE5hbWU9Ik1TX1Byb2plY3RfMjAwMyIgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UueHNkLmVjb3JlLmltcG9ydGVyIj4KLSAgPGZvcmVpZ25Nb2RlbD5maWxlOi9DOi9FY2xpcHNlMzExL01TX1Byb2plY3RfMjAwMy54c2Q8L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iTXNwcm9qZWN0IiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuZXBmIiByZXNvdXJjZT0iWE1MIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgbG9hZEluaXRpYWxpemF0aW9uPSJ0cnVlIiBlY29yZVBhY2thZ2U9Im1zcHJvamVjdC5lY29yZSMvIj4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0FjY3J1ZUF0Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9BY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQWxpYXNUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9BdXRob3JUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQm9va2luZ1R5cGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Cb29raW5nVHlwZVR5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9DYWxjdWxhdGlvblR5cGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9DYXRlZ29yeVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0NvZGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Db21wYW55VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ29uc3RyYWludFR5cGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Db250YWN0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ29zdFJhdGVUYWJsZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0N1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9DdXJyZW5jeVN5bWJvbFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0RheVR5cGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0RlZmF1bHRUYXNrRVZNZXRob2RUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EZWZhdWx0VGFza1R5cGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EdXJhdGlvbkZvcm1hdFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0R1cmF0aW9uRm9ybWF0VHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0R1cmF0aW9uRm9ybWF0VHlwZTIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0R1cmF0aW9uRm9ybWF0VHlwZTMiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0R1cmF0aW9uRm9ybWF0VHlwZTQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0R1cmF0aW9uRm9ybWF0VHlwZTUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0Vhcm5lZFZhbHVlTWV0aG9kVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRWFybmVkVmFsdWVNZXRob2RUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRW1haWxBZGRyZXNzVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0ZpeGVkQ29zdEFjY3J1YWxUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9GWVN0YXJ0RGF0ZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0dyb3VwVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rQWRkcmVzc1R5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua0FkZHJlc3NUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rQWRkcmVzc1R5cGUyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua1R5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua1R5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtUeXBlMiIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSW5pdGlhbHNUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9MYWdGb3JtYXRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9MZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9NYW5hZ2VyVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTWF0ZXJpYWxMYWJlbFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL05hbWVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9OYW1lVHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL05hbWVUeXBlMiIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTmFtZVR5cGUzIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9OZXdUYXNrU3RhcnREYXRlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTlRBY2NvdW50VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZU51bWJlclR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL092ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL092ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9QaG9uZXRpY0FsaWFzVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vUGhvbmV0aWNzVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vUHJlZml4VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vUmF0ZVRhYmxlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vUm9sbHVwVHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1N0YW5kYXJkUmF0ZUZvcm1hdFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1N0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9TdWJqZWN0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vU3VicHJvamVjdE5hbWVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9UaXRsZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1R5cGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9UeXBlVHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1R5cGVUeXBlMiIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVHlwZVR5cGUzIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9UeXBlVHlwZTQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1R5cGVUeXBlNSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVUlEVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVW5pdFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1ZhbHVlbGlzdFNvcnRPcmRlclR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1dlZWtTdGFydERheVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1dvcmtDb250b3VyVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vV29ya0Zvcm1hdFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1dvcmtHcm91cFR5cGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvdGFza1VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcmVzb3VyY2VVSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3BlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FjdHVhbENvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FjdHVhbEZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FjdHVhbFN0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hQ1dQIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9jb25maXJtZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2Nvc3RSYXRlVGFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2Nvc3RWYXJpYW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvY1YiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2RlbGF5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9maW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2ZpbmlzaFZhcmlhbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9oeXBlcmxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2h5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2h5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3dvcmtWYXJpYW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvaGFzRml4ZWRSYXRlVW5pdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2ZpeGVkTWF0ZXJpYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2xldmVsaW5nRGVsYXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2xldmVsaW5nRGVsYXlGb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2xpbmtlZEZpZWxkcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvbWlsZXN0b25lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9ub3RlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvb3ZlcmFsbG9jYXRlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvb3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9vdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3JlZ3VsYXJXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZW1haW5pbmdDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3JlbWFpbmluZ092ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcmVtYWluaW5nV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcmVzcG9uc2VQZW5kaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9zdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvc3RvcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcmVzdW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9zdGFydFZhcmlhbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC91bml0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvdXBkYXRlTmVlZGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC92QUMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3dvcmtDb250b3VyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9iQ1dTIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9iQ1dQIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9ib29raW5nVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9jcmVhdGlvbkRhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9leHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2Jhc2VsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvdGltZXBoYXNlZERhdGEiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudHMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50cy9hc3NpZ25tZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0F2YWlsYWJpbGl0eVBlcmlvZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXZhaWxhYmlsaXR5UGVyaW9kL2F2YWlsYWJsZUZyb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9BdmFpbGFiaWxpdHlQZXJpb2QvYXZhaWxhYmxlVG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9BdmFpbGFiaWxpdHlQZXJpb2QvYXZhaWxhYmxlVW5pdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQXZhaWxhYmlsaXR5UGVyaW9kcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0F2YWlsYWJpbGl0eVBlcmlvZHMvYXZhaWxhYmlsaXR5UGVyaW9kIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvdGltZXBoYXNlZERhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9udW1iZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9pbnRlcmltIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvc3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9maW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9kdXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2R1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvZXN0aW1hdGVkRHVyYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS93b3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvY29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2JDV1MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9iQ1dQIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUyL251bWJlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMi93b3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUyL2Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTIvYkNXUyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMi9iQ1dQIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMy90aW1lcGhhc2VkRGF0YSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMy9udW1iZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMvc3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMvZmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL3dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMvY29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMy9iQ1dTIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL2JDV1AiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFyL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFyL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9DYWxlbmRhci9pc0Jhc2VDYWxlbmRhciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFyL2Jhc2VDYWxlbmRhclVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9DYWxlbmRhci93ZWVrRGF5cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9DYWxlbmRhcnMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9DYWxlbmRhcnMvY2FsZW5kYXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vRG9jdW1lbnRSb290Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRG9jdW1lbnRSb290L21peGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0RvY3VtZW50Um9vdC94TUxOU1ByZWZpeE1hcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Eb2N1bWVudFJvb3QveFNJU2NoZW1hTG9jYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vRG9jdW1lbnRSb290L3Byb2plY3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL2ZpZWxkSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9maWVsZE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9hbGlhcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL3Bob25ldGljQWxpYXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9yb2xsdXBUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvY2FsY3VsYXRpb25UeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvZm9ybXVsYSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL3Jlc3RyaWN0VmFsdWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvdmFsdWVsaXN0U29ydE9yZGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvYXBwZW5kTmV3VmFsdWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvZGVmYXVsdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS92YWx1ZUxpc3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTIvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUyL2ZpZWxkSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTIvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTIvdmFsdWVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMi9kdXJhdGlvbkZvcm1hdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTMiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMy91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTMvZmllbGRJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMy92YWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMy92YWx1ZUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUzL2R1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlNCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGU0L3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlNC9maWVsZElEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGU0L3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGU0L3ZhbHVlSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTQvZHVyYXRpb25Gb3JtYXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGVzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGVzL2V4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL01hc2siPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL01hc2svbGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9NYXNrL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9NYXNrL2xlbmd0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL01hc2svc2VwYXJhdG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL01hc2tzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vTWFza3MvbWFzayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvZmllbGRJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL2ZpZWxkTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL2FsaWFzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvcGhvbmV0aWNBbGlhcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS92YWx1ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9lbnRlcnByaXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9yZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9sZWFmT25seSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL2FsbExldmVsc1JlcXVpcmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvb25seVRhYmxlVmFsdWVzQWxsb3dlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9tYXNrcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZTIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlMi91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZTIvZmllbGRJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlMi92YWx1ZUlEIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlMyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUzL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlMy9maWVsZElEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUzL3ZhbHVlSUQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGVzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGVzL291dGxpbmVDb2RlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1ByZWRlY2Vzc29yTGluayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJlZGVjZXNzb3JMaW5rL3ByZWRlY2Vzc29yVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJlZGVjZXNzb3JMaW5rL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9QcmVkZWNlc3NvckxpbmsvY3Jvc3NQcm9qZWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJlZGVjZXNzb3JMaW5rL2Nyb3NzUHJvamVjdE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9QcmVkZWNlc3NvckxpbmsvbGlua0xhZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ByZWRlY2Vzc29yTGluay9sYWdGb3JtYXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3RpdGxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9zdWJqZWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jYXRlZ29yeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY29tcGFueSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbWFuYWdlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvYXV0aG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jcmVhdGlvbkRhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3JldmlzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9sYXN0U2F2ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3NjaGVkdWxlRnJvbVN0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9zdGFydERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2ZpbmlzaERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2ZZU3RhcnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jcml0aWNhbFNsYWNrTGltaXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2N1cnJlbmN5RGlnaXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jdXJyZW5jeVN5bWJvbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY3VycmVuY3lTeW1ib2xQb3NpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY2FsZW5kYXJVSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2RlZmF1bHRTdGFydFRpbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2RlZmF1bHRGaW5pc2hUaW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9taW51dGVzUGVyRGF5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9taW51dGVzUGVyV2VlayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGF5c1Blck1vbnRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9kZWZhdWx0VGFza1R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2RlZmF1bHRGaXhlZENvc3RBY2NydWFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9kZWZhdWx0U3RhbmRhcmRSYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9kZWZhdWx0T3ZlcnRpbWVSYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9kdXJhdGlvbkZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvd29ya0Zvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZWRpdGFibGVBY3R1YWxDb3N0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvaG9ub3JDb25zdHJhaW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZWFybmVkVmFsdWVNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbXVsdGlwbGVDcml0aWNhbFBhdGhzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9uZXdUYXNrc0VmZm9ydERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbmV3VGFza3NFc3RpbWF0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3NwbGl0c0luUHJvZ3Jlc3NUYXNrcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvc3ByZWFkQWN0dWFsQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvc3ByZWFkUGVyY2VudENvbXBsZXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC90YXNrVXBkYXRlc1Jlc291cmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9maXNjYWxZZWFyU3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3dlZWtTdGFydERheSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbW92ZUNvbXBsZXRlZEVuZHNCYWNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9tb3ZlUmVtYWluaW5nU3RhcnRzQmFjayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9zdGF0dXNEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jdXJyZW50RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvYXV0b2xpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L25ld1Rhc2tTdGFydERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2RlZmF1bHRUYXNrRVZNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3Byb2plY3RFeHRlcm5hbGx5RWRpdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9leHRlbmRlZENyZWF0aW9uRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvYWN0dWFsc0luU3luYyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvcmVtb3ZlRmlsZVByb3BlcnRpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2FkbWluUHJvamVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L291dGxpbmVDb2RlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3dCU01hc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZXh0ZW5kZWRBdHRyaWJ1dGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY2FsZW5kYXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvdGFza3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9yZXNvdXJjZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9hc3NpZ25tZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9SYXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SYXRlL3JhdGVzRnJvbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1JhdGUvcmF0ZXNUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1JhdGUvcmF0ZVRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9zdGFuZGFyZFJhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SYXRlL3N0YW5kYXJkUmF0ZUZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1JhdGUvb3ZlcnRpbWVSYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9vdmVydGltZVJhdGVGb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SYXRlL2Nvc3RQZXJVc2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vUmF0ZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9SYXRlcy9yYXRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9pRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvaXNOdWxsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvaW5pdGlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9waG9uZXRpY3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9uVEFjY291bnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9tYXRlcmlhbExhYmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvY29kZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2dyb3VwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvd29ya0dyb3VwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvZW1haWxBZGRyZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvaHlwZXJsaW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvaHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2h5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9tYXhVbml0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3BlYWtVbml0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL292ZXJBbGxvY2F0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hdmFpbGFibGVGcm9tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYXZhaWxhYmxlVG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9zdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2ZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2NhbkxldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYWNjcnVlQXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS93b3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcmVndWxhcldvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9vdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hY3R1YWxXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcmVtYWluaW5nV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3JlbWFpbmluZ092ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3BlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9zdGFuZGFyZFJhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9zdGFuZGFyZFJhdGVGb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9jb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvb3ZlcnRpbWVSYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvb3ZlcnRpbWVSYXRlRm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvb3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvY29zdFBlclVzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjdHVhbENvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hY3R1YWxPdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9yZW1haW5pbmdDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvd29ya1ZhcmlhbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvY29zdFZhcmlhbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvc1YiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9jViIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FDV1AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9jYWxlbmRhclVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL25vdGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYkNXUyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2JDV1AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9pc0dlbmVyaWMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9pc0luYWN0aXZlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvaXNFbnRlcnByaXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYm9va2luZ1R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYWN0aXZlRGlyZWN0b3J5R1VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2NyZWF0aW9uRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9leHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9iYXNlbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9vdXRsaW5lQ29kZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hdmFpbGFiaWxpdHlQZXJpb2RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3JhdGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3RpbWVwaGFzZWREYXRhIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlcy9yZXNvdXJjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9UYXNrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2lzTnVsbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svY3JlYXRlRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svY29udGFjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svd0JTIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay93QlNMZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svb3V0bGluZU51bWJlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svb3V0bGluZUxldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9wcmlvcml0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svc3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2ZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZHVyYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2R1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay93b3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9zdG9wIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZXN1bWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3Jlc3VtZVZhbGlkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9lZmZvcnREcml2ZW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3JlY3VycmluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svb3ZlckFsbG9jYXRlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZXN0aW1hdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9taWxlc3RvbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3N1bW1hcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2NyaXRpY2FsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9pc1N1YnByb2plY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2lzU3VicHJvamVjdFJlYWRPbmx5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9zdWJwcm9qZWN0TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZXh0ZXJuYWxUYXNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9leHRlcm5hbFRhc2tQcm9qZWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9lYXJseVN0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9lYXJseUZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbGF0ZVN0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9sYXRlRmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9zdGFydFZhcmlhbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9maW5pc2hWYXJpYW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svd29ya1ZhcmlhbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9mcmVlU2xhY2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3RvdGFsU2xhY2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2ZpeGVkQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZml4ZWRDb3N0QWNjcnVhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcGVyY2VudENvbXBsZXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9wZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9jb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9vdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL292ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsU3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2FjdHVhbEZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsRHVyYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2FjdHVhbENvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2FjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZWd1bGFyV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVtYWluaW5nRHVyYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3JlbWFpbmluZ0Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3JlbWFpbmluZ1dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3JlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hQ1dQIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9jViIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svY29uc3RyYWludFR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2NhbGVuZGFyVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9jb25zdHJhaW50RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZGVhZGxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2xldmVsQXNzaWdubWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2xldmVsaW5nQ2FuU3BsaXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2xldmVsaW5nRGVsYXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2xldmVsaW5nRGVsYXlGb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3ByZUxldmVsZWRTdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcHJlTGV2ZWxlZEZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaHlwZXJsaW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9oeXBlcmxpbmtBZGRyZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9oeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9pZ25vcmVSZXNvdXJjZUNhbGVuZGFyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9ub3RlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaGlkZUJhciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcm9sbHVwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9iQ1dTIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9iQ1dQIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9waHlzaWNhbFBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZWFybmVkVmFsdWVNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9wcmVkZWNlc3NvckxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2FjdHVhbFdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2V4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYmFzZWxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9vdXRsaW5lQ29kZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3RpbWVwaGFzZWREYXRhIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1Rhc2tzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vVGFza3MvdGFzayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9UaW1lUGVyaW9kIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UaW1lUGVyaW9kL2Zyb21EYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGltZVBlcmlvZC90b0RhdGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vVGltZXBoYXNlZERhdGFUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UaW1lcGhhc2VkRGF0YVR5cGUvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZS91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UaW1lcGhhc2VkRGF0YVR5cGUvc3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UaW1lcGhhc2VkRGF0YVR5cGUvZmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGltZXBoYXNlZERhdGFUeXBlL3VuaXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UaW1lcGhhc2VkRGF0YVR5cGUvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlL3ZhbHVlSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZS9wYXJlbnRWYWx1ZUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZS9kZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZTIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlMi9pRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlMi92YWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlMi9kZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZUxpc3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZUxpc3QvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vVmFsdWVzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWVzL2dyb3VwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlcy92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrL2xldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFzay90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFzay9sZW5ndGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrL3NlcGFyYXRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFza3MvdmVyaWZ5VW5pcXVlQ29kZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrcy9nZW5lcmF0ZUNvZGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFza3MvcHJlZml4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2tzL3dCU01hc2siLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vV2Vla0RheSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vV2Vla0RheS9kYXlUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vV2Vla0RheS9kYXlXb3JraW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1dlZWtEYXkvdGltZVBlcmlvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9XZWVrRGF5L3dvcmtpbmdUaW1lcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9XZWVrRGF5cyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1dlZWtEYXlzL3dlZWtEYXkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vV29ya2luZ1RpbWUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dvcmtpbmdUaW1lL2Zyb21UaW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vV29ya2luZ1RpbWUvdG9UaW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1dvcmtpbmdUaW1lcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1dvcmtpbmdUaW1lcy93b3JraW5nVGltZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvbW9kZWwvbXNwcm9qZWN0LmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L21vZGVsL21zcHJvamVjdC5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzFlYmQyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvbW9kZWwvbXNwcm9qZWN0LmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNTUxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtc3Byb2plY3QiCi0gICAgbnNVUkk9Imh0dHA6Ly9lcGYuZWNsaXBzZS5vcmcvbXNwcm9qZWN0IiBuc1ByZWZpeD0ibXNwcm9qZWN0Ij4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmdWxsIHByb2plY3Qgc2NoZW1hIGRlZmluaXRpb24gZnJvbSB0aGUgcHJvamVjdCBsZXZlbCBkb3duLCAmI3hEOyYjeEE7JiN4OTsmI3g5O3N0YXJ0aW5nIHdpdGggZGF0YSB0eXBlIGRlZmluaXRpb25zLiIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVBbm5vdGF0aW9ucz4KLSAgICA8ZGV0YWlscyBrZXk9ImFwcGluZm8iIHZhbHVlPSJUaGUgTWljcm9zb2Z0IFByb2plY3QgRGF0YSBJbnRlcmNoYW5nZSBTY2hlbWEgZm9yIE1pY3Jvc29mdCBQcm9qZWN0IDEwLiYjeEQ7JiN4QTsmI3g5OyYjeDk7Ii8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkFjY3J1ZUF0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWNjcnVlQXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZlRGlyZWN0b3J5R1VJRF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjE2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkFsaWFzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWxpYXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBc3NpZ25tZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXNrVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza1VJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyY2VudFdvcmtDb21wbGV0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiB3b3JrIGNvbXBsZXRlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbEZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBvdmVydGltZSBjb3N0IGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgYW1vdW50IG9mIG92ZXJ0aW1lIHdvcmsgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBhbW91bnQgb2Ygd29yayBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYUNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgYXNzaWdubWVudCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25maXJtZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIFJlc291cmNlIGhhcyBhY2NlcHRlZCBhbGwgb2YgaGlzIG9yIGhlciBhc3NpZ25tZW50cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25maXJtZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdGVkIG9yIHNjaGVkdWxlZCBjb3N0IG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0UmF0ZVRhYmxlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29zdFJhdGVUYWJsZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29zdCByYXRlIHRhYmxlIHVzZWQgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RSYXRlVGFibGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0VmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjb3N0IGFuZCBiYXNlbGluZSBjb3N0IGZvciBhIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ1YiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWxheSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCB0aGF0IHRoZSBhc3NpZ25tZW50IGlzIGRlbGF5ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVsYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIGFzc2lnbm1lbnQgZmluaXNoIGRhdGUgZnJvbSB0aGUgYmFzZWxpbmUgZmluaXNoIGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua0FkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtTdWJBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgYXNzaWdubWVudCB3b3JrIGZyb20gdGhlIGJhc2VsaW5lIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1ZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzRml4ZWRSYXRlVW5pdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIFVuaXRzIGFyZSBGaXhlZCBSYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikhhc0ZpeGVkUmF0ZVVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZml4ZWRNYXRlcmlhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgY29uc3VtcHRpb24gb2YgdGhlIGFzc2lnbmVkIG1hdGVyaWFsIHJlc291cmNlIG9jY3VycyBpbiBhIHNpbmdsZSwgZml4ZWQgYW1vdW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkTWF0ZXJpYWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0RlbGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVsYXkgY2F1c2VkIGJ5IGxldmVsaW5nLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0RlbGF5Rm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgZGVsYXkuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Rm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua2VkRmllbGRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBQcm9qZWN0IGlzIGxpbmtlZCB0byBhbm90aGVyIE9MRSBvYmplY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGlua2VkRmllbGRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWlsZXN0b25lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBhc3NpZ25tZW50IGlzIGEgbWlsZXN0b25lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbGVzdG9uZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGVzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5vdGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcmFsbG9jYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgYXNzaWdubWVudCBpcyBvdmVyYWxsb2NhdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJhbGxvY2F0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdW0gb2YgdGhlIGFjdHVhbCBhbmQgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVndWxhcldvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIG5vbi1vdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVndWxhcldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lQ29zdCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgb3ZlcnRpbWUgY29zdCBvZiBjb21wbGV0aW5nIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lV29yayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3BvbnNlUGVuZGluZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVHJ1ZSBpZiBhIHJlc3BvbnNlIGhhcyBub3QgYmVlbiByZWNlaXZlZCBmb3IgYSBUZWFtQXNzaWduIG1lc3NhZ2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3BvbnNlUGVuZGluZyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RvcCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgd2FzIHN0b3BwZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RvcCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgcmVzdW1lZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXN1bWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIGFzc2lnbm1lbnQgc3RhcnQgZGF0ZSBmcm9tIHRoZSBiYXNlbGluZSBzdGFydCBkYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0VmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bml0cyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgdW5pdHMgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXBkYXRlTmVlZGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUcnVlIGlmIHRoZSByZXNvdXJjZSBhc3NpZ25lZCB0byBhIHRhc2sgbmVlZHMgdG8gYmUgdXBkYXRlZCBhcyB0byB0aGUgc3RhdHVzIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVwZGF0ZU5lZWRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZBQyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYmFzbGluZSBjb3N0IGFuZCB0b3RhbCBjb3N0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZBQyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHNjaGVkdWxlZCB3b3JrIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya0NvbnRvdXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrQ29udG91clR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd29yayBjb250b3VyIG9mIHRoZSBhc3NpZ25tZW50LiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RmxhdCwgMT1CYWNrIExvYWRlZCwgMj1Gcm9udCBMb2FkZWQsIDM9RG91YmxlIFBlYWssIDQ9RWFybHkgUGVhaywgNT1MYXRlIFBlYWssICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgNj1CZWxsLCA3PVR1cnRsZSwgOD1Db250b3VyZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrQ29udG91ciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9va2luZ1R5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Cb29raW5nVHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGJvb2tpbmcgdHlwZSBvZiB0aGUgYXNzaWdubWVudC4gMT1Db21taXRlZCwgMj1Qcm9wb3NlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJvb2tpbmdUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29ya1Byb3RlY3RlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRpb25EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgYXNzaWdubWVudCB3YXMgY3JlYXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JlYXRpb25EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGU0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VsaW5lIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Jhc2VsaW5lMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGJhc2VsaW5lIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBc3NpZ25tZW50cyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBc3NpZ25tZW50c18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lnbm1lbnQiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQXNzaWdubWVudCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGFzc2lnbm1lbnQgaW4gZWFjaCBBc3NpZ25tZW50cyBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBdXRob3JUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRob3JfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXZhaWxhYmlsaXR5UGVyaW9kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJpbGl0eVBlcmlvZF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZUZyb20iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBiZWNvbWVzIGF2YWlsYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZUZyb20iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXN0IGRhdGUgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlVG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVVbml0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZSBkdXJpbmcgdGhlIHNwZWNpZmllZCBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZVVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXZhaWxhYmlsaXR5UGVyaW9kcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFiaWxpdHlQZXJpb2RzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXZhaWxhYmlsaXR5UGVyaW9kIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0F2YWlsYWJpbGl0eVBlcmlvZCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJpb2QgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmlsaXR5UGVyaW9kIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmFzZWxpbmUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2sgYmFzZWxpbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibnVtYmVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIG51bWJlciBvZiB0aGUgYmFzZWxpbmUgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImludGVyaW0iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoaXMgaXMgYW4gSW50ZXJpbSBCYXNlbGluZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW50ZXJpbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGR1cmF0aW9uIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBEdXJhdGlvbiBvZiB0aGUgVGFzayBiYXNlbGluZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGVkRHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGJhc2VsaW5lIGR1cmF0aW9uIG9mIHRoZSB0YXNrIHdhcyBlc3RpbWF0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRlZER1cmF0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgd29yayBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmFzZWxpbmUyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bWJlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOdW1iZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdvcmsgYXNzaWduZWQgdGhlIHJlc291cmNlIHdoZW4gdGhlIGJhc2VsaW5lIGlzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0ZWQgY29zdCBmb3IgdGhlIHJlc291cmNlIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0IGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmFzZWxpbmUzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFzZWxpbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJudW1iZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBhbW91bnQgb2Ygd29yayBzY2hlZHVsZWQgb24gdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZUZvckVhcm5lZFZhbHVlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3IDggOSAxMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJCb29raW5nVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCb29raW5nVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJCb29raW5nVHlwZVR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQm9va2luZ1R5cGVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNhbGN1bGF0aW9uVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxjdWxhdGlvblR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYWxlbmRhciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIGNhbGVuZGFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNCYXNlQ2FsZW5kYXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGNhbGVuZGFyIGlzIGEgYmFzZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNCYXNlQ2FsZW5kYXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYXNlQ2FsZW5kYXJVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYmFzZSBjYWxlbmRhciAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB3aGljaCB0aGlzIGNhbGVuZGFyIGRlcGVuZHMuIE9ubHkgYXBwbGljYWJsZSBpZiB0aGUgY2FsZW5kYXIgaXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgYmFzZSBjYWxlbmRhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZUNhbGVuZGFyVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2Vla0RheXMiIGVUeXBlPSIjLy9XZWVrRGF5cyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIFdlZWtkYXlzIHRoYXQgZGVmaW5lcyB0aGlzIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhbGVuZGFycyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhcnNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYWxlbmRhciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DYWxlbmRhciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNhbGVuZGFycyBhcmUgdXNlZCB0byBkZWZpbmUgc3RhbmRhcmQgd29ya2luZyBhbmQgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgbm9uLXdvcmtpbmcgdGltZXMuIFByb2plY3RzIG11c3QgaGF2ZSBvbmUgYmFzZSBjYWxlbmRhci4gVGFza3MgYW5kIHJlc291cmNlcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBtYXkgaGF2ZSB0aGVpciBvd24gbm9uLWJhc2UgY2FsZW5kYXJzIHdoaWNoIGFyZSBiYXNlZCBvbiBhIGJhc2UgY2FsZW5kYXIuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ2F0ZWdvcnlUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYXRlZ29yeV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb2RlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29kZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb21wYW55VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29tcGFueV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb25zdHJhaW50VHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25zdHJhaW50VHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb250YWN0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGFjdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb3N0UmF0ZVRhYmxlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RSYXRlVGFibGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeVN5bWJvbFBvc2l0aW9uXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDdXJyZW5jeVN5bWJvbFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iMjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGF5VHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEYXlUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRGaXhlZENvc3RBY2NydWFsXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza0VWTWV0aG9kXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRlZmF1bHRUYXNrVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza1R5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb2N1bWVudFJvb3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJtaXhlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaXhlZCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRXaWxkY2FyZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSI6bWl4ZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ieE1MTlNQcmVmaXhNYXAiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ieG1sbnM6cHJlZml4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InhTSVNjaGVtYUxvY2F0aW9uIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InhzaTpzY2hlbWFMb2NhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9qZWN0IiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2plY3QiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdCBpcyB0aGUgdG9wIGxldmVsIGVsZW1lbnQgb2YgdGhlIGRvY3VtZW50LiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUzIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGU0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl80Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGU1IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl81Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJFYXJuZWRWYWx1ZU1ldGhvZFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybmVkVmFsdWVNZXRob2RfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkVtYWlsQWRkcmVzc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVtYWlsQWRkcmVzc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBmaWVsZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWxpYXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9BbGlhc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBmaWVsZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBob25ldGljQWxpYXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9QaG9uZXRpY0FsaWFzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwaG9uZXRpYyBwcm9udW5jaWF0aW9uIG9mIHRoZSBhbGlhcyBvZiB0aGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tIGZpZWxkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBob25ldGljQWxpYXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xsdXBUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUm9sbHVwVHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJIb3cgcm9sbHVwcyBhcmUgY2FsY3VsYXRlZC4gVmFsdWVzIGFyZTogMD1NYXhpbXVtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUiBmb3IgZmxhZyBmaWVsZHMpLCAxPU1pbmltdW0gKEFORCBmb3IgZmxhZyBmaWVsZHMpLCAyPUNvdW50IGFsbCwgMz1TdW0sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ9QXZlcmFnZSwgNT1BdmVyYWdlIEZpcnN0IFN1YmxldmVsLCA2PUNvdW50IEZpcnN0IFN1YmxldmVsLCA3PUNvdW50ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbnN1bW1hcmllcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xsdXBUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FsY3VsYXRpb25UeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ2FsY3VsYXRpb25UeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgcm9sbHVwcyBhcmUgY2FsY3VsYXRlZCBmb3IgdGFzayBhbmQgZ3JvdXAgc3VtbWFyeSByb3dzLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPU5vbmUsIDE9Um9sbHVwLCAyPUNhbGN1bGF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGN1bGF0aW9uVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZvcm11bGEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm11bGEgdGhhdCBNaWNyb3NvZnQgUHJvamVjdCB1c2VzIHRvIHBvcHVsYXRlIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b20gdGFzayBmaWVsZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRm9ybXVsYSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3RyaWN0VmFsdWVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBSZXN0cmljdFZhbHVlcz1UcnVlIHRoZW4gb25seSB2YWx1ZXMgaW4gdGhlIGxpc3QgYXJlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgaW4gdGhlIGZpbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzdHJpY3RWYWx1ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZWxpc3RTb3J0T3JkZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9WYWx1ZWxpc3RTb3J0T3JkZXJUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSG93IHZhbHVlIGxpc3RzIGFyZSBzb3J0ZWQuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9RGVzY2VuZGluZywgMT1Bc2NlbmRpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVsaXN0U29ydE9yZGVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwZW5kTmV3VmFsdWVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBBcHBlbmROZXdWYWx1ZXM9VHJ1ZSB0aGVuIGFueSBuZXcgdmFsdWVzIGFkZGVkIGluIGEgcHJvamVjdCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXV0b21hdGljYWxseSBhcHBlbmRlZCB0byB0aGUgbGlzdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXBwZW5kTmV3VmFsdWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIHBvaW50cyB0byB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgbGlzdC4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHByZXNlbnQgaWYgbm8gZGVmYXVsdCBpcyBzZXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZUxpc3QiIGVUeXBlPSIjLy9WYWx1ZUxpc3QiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGVuIHZhbHVlcyBvZiBleHRlbmRlZCBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWQgYXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyBvZiBlbGVtZW50cyBpbiB0aGUgc2NoZW1hLCB0aGV5IG1heSBlaXRoZXIgYmUgc3BlY2lmaWVkIGJ5IHZhbHVlcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBieSByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbGlzdC4gIEFwcGxpY2F0aW9ucyBtYXkgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzdW1lIG9yZGVyaW5nIG9mIHRoZSBsaXN0IGJ5IG9yZGVyaW5nIHNwZWNpZmllZCBoZXJlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUxpc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZTIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIFBJRCBvZiB0aGUgY3VzdG9tIGZpZWxkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlMyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGUzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGU0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlXy5fM18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpZWxkIElEIGluIHRoZSBsb2NhbGlzZWQgbGFuZ3VhZ2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVhY2ggb2YgdGhlIGluZGl2aWR1YWwgZW50cmllcyBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlcyBkZWZpbml0aW9uICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uICBUaGVyZSBhcmUgbm8gbGltaXRzIHRvIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBtYXkgYXBwZWFyLCBidXQgcHJvamVjdCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICB3aWxsIG9ubHkgdW5kZXJzdGFuZCBGbGFnMS1GbGFnMTAsIGV0Yy4gIFRoaXMgbXVzdCBhcHBlYXIgb25jZSBpbiBlYWNoIEV4dGVuZGVkQXR0cmlidXRlcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkV4dGVybmFsVGFza1Byb2plY3RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbFRhc2tQcm9qZWN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkZpeGVkQ29zdEFjY3J1YWxUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaXhlZENvc3RBY2NydWFsXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJGWVN0YXJ0RGF0ZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGWVN0YXJ0RGF0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikdyb3VwVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3JvdXBfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rQWRkcmVzc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rQWRkcmVzc1R5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtBZGRyZXNzXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtBZGRyZXNzVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3NfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1N1YkFkZHJlc3NUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzc18uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua18uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua18uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSW5pdGlhbHNUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbml0aWFsc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJMYWdGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGFnRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXRfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJNYW5hZ2VyVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuYWdlcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNYXNrIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hc2tfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxldmVsIG9mIHRoZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiBtYXNrLiBWYWx1ZXMgYXJlOiAwPU51bWJlcnMsIDE9VXBwZXIgQ2FzZSBMZXR0ZXJzLCAyPUxvd2VyIENhc2UgTGV0dGVycywgMz1DaGFyYWN0ZXJzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtYXhpbXVtIGxlbmd0aCBpbiBjaGFyYWN0ZXJzIG9mIHRoZSBvdXRsaW5lIGNvZGUgdmFsdWVzLiAgSWYgbGVuZ3RoIGlzIGFueSwgdGhlIHZhbHVlIGlzIHplcm8uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikxlbmd0aCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcGFyYXRvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VwYXJhdG9yIHZhbHVlIG9mIHRoZSBjb2RlIHZhbHVlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VwYXJhdG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWFza3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFza3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXNrIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01hc2siCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm91ciBlbGVtZW50cyBvZiB0aGUgbWFzayBjb25zdGl0dXRlIHRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIG91dGxpbmUgY29kZSBtdXN0IGFwcGVhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFzayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik1hdGVyaWFsTGFiZWxUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXRlcmlhbExhYmVsXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5hbWVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5hbWVUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmFtZVR5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOYW1lVHlwZTMiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iMjU1Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5ld1Rhc2tTdGFydERhdGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmV3VGFza1N0YXJ0RGF0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOVEFjY291bnRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOVEFjY291bnRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvcmVzcG9uZHMgdG8gdGhlIGZpZWxkIG51bWJlciBvZiBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsaWFzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbGlhcyBvZiB0aGUgY3VzdG9tIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWxpYXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwaG9uZXRpY0FsaWFzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwaG9uZXRpYyBwcm9udW5jaWF0aW9uIG9mIHRoZSBhbGlhcyBvZiB0aGUgY3VzdG9tIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlcyIgZVR5cGU9IiMvL1ZhbHVlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZXMgb2YgdGhlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW50ZXJwcmlzZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUgaXMgYW4gZW50ZXJwcmlzZSBjdXN0b20gb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbnRlcnByaXNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFub3RoZXIgY3VzdG9tIGZpZWxkIGZvciB3aGljaCB0aGlzIGlzIGFuIGFsaWFzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgY3VzdG9tIG91dGxpbmUgY29kZSBjYW4gYmUgdXNlZCBieSB0aGUgUmVzb3VyY2UgU3Vic3RpdHV0aW9uIFdpemFyZCBpbiBNaWNyb3NvZnQgUHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGVhZk9ubHkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgb3Igbm90IHZhbHVlcyBzcGVjaWZpZWQgaW4gdGhpcyBvdXRsaW5lIGNvZGUgZmllbGQgbXVzdCBiZSBsZWFmIHZhbHVlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGVhZk9ubHkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbGxMZXZlbHNSZXF1aXJlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTmV3IGNvZGVzIG11c3QgaGF2ZSBhbGwgbGV2ZWxzIHByZXNlbnQuICBOb3QgYXZhaWxhYmxlIGZvciBFbnRlcnByaXNlIENvZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGxMZXZlbHNSZXF1aXJlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9ubHlUYWJsZVZhbHVlc0FsbG93ZWQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdmFsdWVzIHNwZWNpZmllZCBtdXN0IGNvbWUgZnJvbSB2YWx1ZXMgdGFibGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik9ubHlUYWJsZVZhbHVlc0FsbG93ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXNrcyIgZVR5cGU9IiMvL01hc2tzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRhYmxlIG9mIGVudHJpZXMgdGhhdCBkZWZpbmUgdGhlIG91dGxpbmUgY29kZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlMiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmllbGQgSUQgaW4gdGhlIGxvY2FsaXNlZCBsYW5ndWFnZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uIGluIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlMyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmllbGQgSUQgaW4gdGhlIGxvY2FsaXNlZCBsYW5ndWFnZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lQ29kZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpbmRpdmlkdWFsIG91dGxpbmUgY29kZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iT3V0bGluZU51bWJlclR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVOdW1iZXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlRm9ybWF0Xy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlBob25ldGljQWxpYXNUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY0FsaWFzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUGhvbmV0aWNzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByZWRlY2Vzc29yTGluayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvckxpbmtfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVkZWNlc3NvclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwcmVkZWNlc3NvciB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGluayB0eXBlLiAgVmFsdWVzIGFyZSAwPUZGLCAxPUZTLCAyPVNGIGFuZCAzPVNTJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcm9zc1Byb2plY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByZWRlY2Vzc29yIGlzIHBhcnQgb2YgYW5vdGhlciBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcm9zc1Byb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcm9zc1Byb2plY3ROYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHRlcm5hbCBwcmVkZWNlc3NvciBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcm9zc1Byb2plY3ROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua0xhZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBsYWcgaW4gdGVudGhzIG9mIGEgbWludXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMaW5rTGFnIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFnRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTGFnRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGxhZyBmb3JtYXQuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYWdGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJQcmVmaXhUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVmaXhfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9qZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2plY3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9VSURUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGl0bGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UaXRsZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGl0bGUgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpdGxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ViamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N1YmplY3RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN1YmplY3Qgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YmplY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRlZ29yeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NhdGVnb3J5VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjYXRlZ29yeSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2F0ZWdvcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb21wYW55IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29tcGFueVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29tcGFueSB0aGF0IG93bnMgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbXBhbnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYW5hZ2VyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTWFuYWdlclR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWFuYWdlciBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuYWdlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0F1dGhvclR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYXV0aG9yIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRob3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGlvbkRhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXZpc2lvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiB0aW1lcyBhIHByb2plY3QgaGFzIGJlZW4gc2F2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJldmlzaW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFzdFNhdmVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcHJvamVjdCB3YXMgbGFzdCBzYXZlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGFzdFNhdmVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NoZWR1bGVGcm9tU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByb2plY3QgaXMgc2NoZHVsZWQgZnJvbSB0aGUgc3RhcnQgZGF0ZSBvciBmaW5pc2ggZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNjaGVkdWxlRnJvbVN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHByb2plY3QuIFJlcXVpcmVkIGlmIFNjaGVkdWxlRnJvbVN0YXJ0IGlzIHRydWUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2hEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSBwcm9qZWN0LiBSZXF1aXJlZCBpZiBTY2hlZHVsZUZyb21TdGFydCBpcyBmYWxzZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmWVN0YXJ0RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0ZZU3RhcnREYXRlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkZpc2NhbCBZZWFyIHN0YXJ0aW5nIG1vbnRoLiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MT1KYW51YXJ5LCAyPUZlYnJ1YXJ5LCAzPU1hcmNoLCA0PUFwcmlsLCA1PU1heSwgNj1KdW5lLCA3PUp1bHksICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTs4PUF1Z3VzdCwgOT1TZXB0ZW1iZXIsIDEwPU9jdG9iZXIsIDExPU5vdmVtYmVyLCAxMj1EZWNlbWJlciAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRllTdGFydERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcml0aWNhbFNsYWNrTGltaXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgZGF5cyBwYXN0IGl0cyBlbmQgZGF0ZSB0aGF0IGEgdGFzayBjYW4gZ28gJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O2JlZm9yZSBNaWNyb3NvZnQgUHJvamVjdCBtYXJrcyB0aGF0IHRhc2sgYXMgYSBjcml0aWNhbCB0YXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcml0aWNhbFNsYWNrTGltaXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjdXJyZW5jeURpZ2l0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc3ltYm9sLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeURpZ2l0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbmN5U3ltYm9sIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ3VycmVuY3lTeW1ib2xUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGN1cnJlbmN5IHN5bWJvbCB1c2VkIGluIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeVN5bWJvbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbmN5U3ltYm9sUG9zaXRpb24iCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9DdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVuY3kgc3ltYm9sLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9QmVmb3JlLCAxPUFmdGVyLCAyPUJlZm9yZSBXaXRoIFNwYWNlLCAzPUFmdGVyIHdpdGggc3BhY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sUG9zaXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWxlbmRhclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3QgY2FsZW5kYXIuICBSZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtDYWxlbmRhcnMgZWxlbWVudCBvZiB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0U3RhcnRUaW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1RpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBzdGFydCB0aW1lIG9mIG5ldyB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFN0YXJ0VGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRGaW5pc2hUaW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1RpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggdGltZSBvZiBuZXcgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRGaW5pc2hUaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWludXRlc1BlckRheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciBkYXkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbnV0ZXNQZXJEYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW51dGVzUGVyV2VlayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciB3ZWVrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaW51dGVzUGVyV2VlayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRheXNQZXJNb250aCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBkYXlzIHBlciBtb250aC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGF5c1Blck1vbnRoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFRhc2tUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRGVmYXVsdFRhc2tUeXBlVHlwZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHR5cGUgb2YgbmV3IHRhc2tzLiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1GaXhlZCBVbml0cywgMT1GaXhlZCBEdXJhdGlvbiwgMj1GaXhlZCBXb3JrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza1R5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0RlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGZyb20gd2hlcmUgZml4ZWQgY29zdHMgYXJlIGFjY3J1ZWQuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MT1TdGFydCwgMj1Qcm9yYXRlZCwgMz1FbmQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0U3RhbmRhcmRSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhbmRhcmQgcmF0ZSBmb3IgbmV3IHJlc291cmNlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFN0YW5kYXJkUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRPdmVydGltZVJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBvdmVydGltZSByYXRlIGZvciBuZXcgcmVzb3VyY2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0T3ZlcnRpbWVSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGU1Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTszPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzUzPW51bGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya0Zvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgd29yayB1bml0IGZvcm1hdC4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWRpdGFibGVBY3R1YWxDb3N0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgb3Igbm90IGFjdHVhbCBjb3N0cyBhcmUgZWRpdGFibGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVkaXRhYmxlQWN0dWFsQ29zdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJob25vckNvbnN0cmFpbnRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRhc2tzIGhvbm91ciB0aGVpciBjb25zdHJhaW50IGRhdGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIb25vckNvbnN0cmFpbnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybmVkVmFsdWVNZXRob2QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9FYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgbWV0aG9kIGZvciBjYWxjdWxhdGluZyBlYXJuZWQgdmFsdWUuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0byBjYWxjdWxhdGUgc3VidGFza3MgYXMgc3VtbWFyeSB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibXVsdGlwbGVDcml0aWNhbFBhdGhzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBtdWx0aXBsZSBjcml0aWNhbCBwYXRocyBhcmUgY2FsY3VsYXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTXVsdGlwbGVDcml0aWNhbFBhdGhzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmV3VGFza3NFZmZvcnREcml2ZW4iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbmV3IHRhc2tzIGFyZSBlZmZvcnQgZHJpdmVuLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrc0VmZm9ydERyaXZlbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5ld1Rhc2tzRXN0aW1hdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIHNob3cgdGhlIGVzdGltYXRlZCBkdXJhdGlvbiBieSBkZWZhdWx0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrc0VzdGltYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwbGl0c0luUHJvZ3Jlc3NUYXNrcyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBpbi1wcm9ncmVzcyB0YXNrcyBjYW4gYmUgc3BsaXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNwbGl0c0luUHJvZ3Jlc3NUYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwcmVhZEFjdHVhbENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgYWN0dWFsIGNvc3RzIGFyZSBzcHJlYWQgdG8gdGhlIHN0YXR1cyBkYXRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTcHJlYWRBY3R1YWxDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ByZWFkUGVyY2VudENvbXBsZXRlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBwZXJjZW50IGNvbXBsZXRlIGlzIHNwcmVhZCB0byB0aGUgc3RhdHVzIGRhdGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNwcmVhZFBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhc2tVcGRhdGVzUmVzb3VyY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdXBkYXRlcyB0byB0YXNrcyB1cGRhdGUgcmVzb3VyY2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrVXBkYXRlc1Jlc291cmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmlzY2FsWWVhclN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgZmlzY2FsIHllYXIgbnVtYmVyaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpc2NhbFllYXJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndlZWtTdGFydERheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dlZWtTdGFydERheVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdGFydCBkYXkgb2YgdGhlIHdlZWsuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVN1bmRheSwgMT1Nb25kYXksIDI9VHVlc2RheSwgMz1XZWRuZXNkYXksIDQ9VGh1cnNkYXksIDU9RnJpZGF5LCA2PVNhdHVyZGF5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtTdGFydERheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vdmVDb21wbGV0ZWRFbmRzQmFjayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O1NwZWNpZmllcyB3aGV0aGVyIHRoZSBlbmQgb2YgY29tcGxldGVkIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBiZWdpbiBhZnRlciB0aGUgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7c3RhdHVzIGRhdGUgYnV0IGJlZ3VuIGVhcmx5IHNob3VsZCBiZSBtb3ZlZCBiYWNrIHRvIHRoZSBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1vdmVDb21wbGV0ZWRFbmRzQmFjayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vdmVSZW1haW5pbmdTdGFydHNCYWNrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJlZ2lubmluZyBvZiByZW1haW5pbmcgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGJlZ2luIGFmdGVyIHRoZSAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtzdGF0dXMgZGF0ZSBidXQgYmVndW4gZWFybHkgc2hvdWxkIGJlIG1vdmVkIGJhY2sgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O1NwZWNpZmllcyB3aGV0aGVyIHRoZSBiZWdpbm5pbmcgb2YgcmVtYWluaW5nIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBoYXZlIGJlZ3VuIGxhdGUgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7c2hvdWxkIGJlIG1vdmVkIHVwIHRvIHRoZSBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVuZCBvZiBjb21wbGV0ZWQgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVlbiBjb21wbGV0ZWQgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7YmVmb3JlIHRoZSBzdGF0dXMgZGF0ZSBidXQgYmVndW4gbGF0ZSBzaG91bGQgYmUgbW92ZWQgdXAgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0Jhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNwZWNpZmljIGJhc2VsaW5lIHVzZWQgdG8gY2FsY3VsYXRlIFZhcmlhbmNlIHZhbHVlcy4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPUJhc2VsaW5lLCAxPUJhc2VsaW5lIDEsIDI9QmFzZWxpbmUgMiwgMz1CYXNlbGluZSAzLCA0PUJhc2VsaW5lIDQsIDU9QmFzZWxpbmUgNSwgNj1CYXNlbGluZSA2LCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Nz1CYXNlbGluZSA3LCA4PUJhc2VsaW5lIDgsIDk9QmFzZWxpbmUgOSwgMTA9QmFzZWxpbmUgMTAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGFkZCBuZXcgcmVzb3VyY2VzIHRvIHRoZSByZXNvdXJjZSBwb29sLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGF0dXNEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0ZSB1c2VkIGZvciBjYWxjdWxhdGlvbiBhbmQgcmVwb3J0aW5nLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGF0dXNEYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VycmVudERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3lzdGVtIGRhdGUgdGhhdCB0aGUgWE1MIHdhcyBnZW5lcmF0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbnREYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJvamVjdCB3YXMgY3JlYXRlZCBieSBhIFByb2plY3QgU2VydmVyIHVzZXIgYXMgb3Bwb3NlZCB0byBhbiBOVCB1c2VyLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dG9saW5rIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIGF1dG9saW5rIGluc2VydGVkIG9yIG1vdmVkIHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRvbGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5ld1Rhc2tTdGFydERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9OZXdUYXNrU3RhcnREYXRlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGRhdGUgZm9yIG5ldyB0YXNrcyBzdGFydC4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVByb2plY3QgU3RhcnQgRGF0ZSwgMT1DdXJyZW50IERhdGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmV3VGFza1N0YXJ0RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRUYXNrRVZNZXRob2QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EZWZhdWx0VGFza0VWTWV0aG9kVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGVhcm5lZCB2YWx1ZSBtZXRob2QgZm9yIHRhc2tzLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrRVZNZXRob2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJvamVjdCBYTUwgd2FzIGVkaXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlbmRlZENyZWF0aW9uRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGUgdXNlZCBmb3IgY2FsY3VsYXRpb24gYW5kIHJlcG9ydGluZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxzSW5TeW5jIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIGFsbCBhY3R1YWwgd29yayBoYXMgYmVlbiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsc0luU3luYyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbW92ZUZpbGVQcm9wZXJ0aWVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIHJlbW92ZSBhbGwgZmlsZSBwcm9wZXJ0aWVzIG9uIHNhdmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbW92ZUZpbGVQcm9wZXJ0aWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRtaW5Qcm9qZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcm9qZWN0IGlzIGFuIGFkbWluaXN0cmF0aXZlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFkbWluUHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlcyIgZVR5cGU9IiMvL091dGxpbmVDb2RlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIG91dGxpbmUgY29kZSBkZWZpbml0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuICBUaGVzZSBjb2RlcyBtYXkgYmUgYXNzb2NpYXRlZCBvbmx5IHdpdGggdGhpcyBwcm9qZWN0LCBvciBtYXkgYmUgY29tbW9uIGFtb25nIHNldmVyYWwgcHJvamVjdHMgKGVudGVycHJpc2UgY29kZXMpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3QlNNYXNrcyIgZVR5cGU9IiMvL1dCU01hc2tzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRhYmxlIG9mIGVudHJpZXMgdGhhdCBkZWZpbmUgdGhlIG91dGxpbmUgY29kZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlcyIgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZSAoY3VzdG9tIGZpZWxkKSBkZWZpbml0aW9ucyAmI3hEOyYjeEE7ICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhbGVuZGFycyIgZVR5cGU9IiMvL0NhbGVuZGFycyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGNhbGVuZGFycyB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgJiN4RDsmI3hBOyAgICAgICAgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFza3MiIGVUeXBlPSIjLy9UYXNrcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIHRhc2tzIHRoYXQgbWFrZSB1cCB0aGUgcHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZXMiIGVUeXBlPSIjLy9SZXNvdXJjZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NpZ25tZW50cyIgZVR5cGU9IiMvL0Fzc2lnbm1lbnRzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgYXNzaWdubWVudHMgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmF0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmF0ZXNGcm9tIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcmF0ZSBiZWNvbWVzIGVmZmVjdGl2ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXNGcm9tIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmF0ZXNUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXN0IGRhdGUgdGhhdCB0aGUgcmF0ZSBpcyBlZmZlY3RpdmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVzVG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYXRlVGFibGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9SYXRlVGFibGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByYXRlIHRhYmxlIGZvciB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9QSwgMT1CLCAyPUMsIDM9RCwgND1FIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVUYWJsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YW5kYXJkIHJhdGUgZm9yIHRoZSByZXNvdXJjZSBmb3IgdGhlIHBlcmlvZCBzcGVjaWZpZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0YW5kYXJkUmF0ZUZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBzdGFuZGFyZCByYXRlLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3ZlcnRpbWUgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIG92ZXJ0aW1lIHJhdGUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8sIDc9eSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGVGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0UGVyVXNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29zdCBwZXIgdXNlIG9mIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFBlclVzZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJhdGVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmF0ZSIgdXBwZXJCb3VuZD0iMjUiIGVUeXBlPSIjLy9SYXRlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmluaXRpb24gb2YgYSB0aW1lIHBlcmlvZCwgYW5kIHRoZSByYXRlcyBhcHBsaWNhYmxlIGZvciAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzb3VyY2UgZHVyaW5nIHRoYXQgcGVyaW9kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUmF0ZVRhYmxlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVUYWJsZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXNvdXJjZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3NpdGlvbiBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZSB3aXRoaW4gdGhlIGxpc3Qgb2YgcmVzb3VyY2VzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9OYW1lVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVHlwZVR5cGU0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgcmVzb3VyY2UuIFZhbHVlcyBhcmU6IDA9TWF0ZXJpYWwsIDE9V29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNOdWxsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgbnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNOdWxsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5pdGlhbHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Jbml0aWFsc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaW5pdGlhbHMgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbml0aWFscyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBob25ldGljcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1Bob25ldGljc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGhvbmV0aWMgc3BlbGxpbmcgb2YgdGhlIHJlc291cmNlIG5hbWUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdXNlIHdpdGggSmFwYW5lc2Ugb25seS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iblRBY2NvdW50IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTlRBY2NvdW50VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBOVCBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5UQWNjb3VudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hdGVyaWFsTGFiZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9NYXRlcmlhbExhYmVsVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBtYXRlcmlhbCByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWF0ZXJpYWxMYWJlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvZGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9Db2RlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2RlIG9yIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29kZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vR3JvdXBUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGdyb3VwIHRvIHdoaWNoIHRoZSByZXNvdXJjZSBiZWxvbmdzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHcm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtHcm91cCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtHcm91cFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiB3b3JrZ3JvdXAgdG8gd2hpY2ggdGhlIHJlc291cmNlIGJlbG9uZ3MuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RGVmYXVsdCwgMT1Ob25lLCAyPUVtYWlsLCAzPVdlYiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrR3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbWFpbEFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9FbWFpbEFkZHJlc3NUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbWFpbEFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua0FkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtTdWJBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWF4VW5pdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjEuMCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtYXhpbXVtIG51bWJlciBvZiB1bml0cyB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1heFVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVha1VuaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhcmdlc3QgbnVtYmVyIG9mIHVuaXRzIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZSBhdCBhbnkgdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVha1VuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlckFsbG9jYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcmVzb3VyY2UgaXMgb3ZlcmFsbG9jYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlckFsbG9jYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZUZyb20iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmlyc3QgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZUZyb20iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXN0IGRhdGUgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlVG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbkxldmVsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSByZXNvdXJjZSBjYW4gYmUgbGV2ZWxlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FuTGV2ZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY2NydWVBdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0FjY3J1ZUF0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSG93IGNvc3QgaXMgYWNjcnVlZCBhZ2FpbnN0IHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMT1TdGFydCwgMj1FbmQsIDM9UHJvcmF0ZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWNjcnVlQXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWd1bGFyV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWd1bGFyV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGFjdHVhbCB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiByZW1haW5pbmcgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ1dvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGFjdHVhbCBvdmVydGltZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lV29yayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgcmVtYWluaW5nIG92ZXJ0aW1lIHdvcmsgcmVxdWlyZWQgdG8gY29tcGxldGUgYWxsIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJjZW50V29ya0NvbXBsZXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSBvZiB3b3JrIGNvbXBsZXRlZCBhY3Jvc3MgYWxsIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhbmRhcmQgcmF0ZSBvZiB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgc3RhbmRhcmQgcmF0ZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15LCA4PW1hdGVyaWFsIHJlc291cmNlIHJhdGUgKG9yIGJsYW5rIHN5bWJvbCBzcGVjaWZpZWQpJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBwcm9qZWN0IGNvc3QgZm9yIHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3ZlcnRpbWUgcmF0ZSBvZiB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL092ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgb3ZlcnRpbWUgcmF0ZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIG92ZXJ0aW1lIGNvc3QgZm9yIHRoZSByZXNvdXJjZSBpbmNsdWRpbmcgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdHMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RQZXJVc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb3N0IHBlciB1c2Ugb2YgdGhlIHJlc291cmNlLiBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0UGVyVXNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IGluY3VycmVkIGJ5IHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0Nvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIHJlc291cmNlIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lQ29zdCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgb3ZlcnRpbWUgY29zdCBvZiB0aGUgcmVzb3VyY2UgdG8gY29tcGxldGUgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBiYXNlbGluZSB3b3JrIGFuZCB0aGUgd29yayBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1ZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYmFzZWxpbmUgY29zdCBhbmQgdGhlIGNvc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIHNjaGVkdWxlIHZhcmlhbmNlLCB0aHJvdWdoIHRoZSBwcm9qZWN0IHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTViIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UsIHRocm91Z2ggdGhlIHByb2plY3Qgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNWIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYUNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FsZW5kYXJVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZXNvdXJjZSBjYWxlbmRhci5SZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlIENhbGVuZGFycyBlbGVtZW50IG9mICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGVzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTm90ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygb2YgdGhlIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZSBmb3IgdGhlIHByb2plY3QgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzR2VuZXJpYyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGdlbmVyaWMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzR2VuZXJpYyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzSW5hY3RpdmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBzZXQgdG8gaW5hY3RpdmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzSW5hY3RpdmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0VudGVycHJpc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBhbiBFbnRlcnByaXNlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc0VudGVycHJpc2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib29raW5nVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Jvb2tpbmdUeXBlVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGJvb2tpbmcgdHlwZSBvZiB0aGUgcmVzb3VyY2UuIDE9Q29tbWl0ZWQsIDI9UHJvcG9zZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQm9va2luZ1R5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrUHJvdGVjdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2ZURpcmVjdG9yeUdVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9BY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBBY3RpdmUgRGlyZWN0b3J5IEdVSUQgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZlRGlyZWN0b3J5R1VJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0aW9uRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHJlc291cmNlIHdhcyBjcmVhdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWxpbmUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQmFzZWxpbmUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJhc2VsaW5lIHZhbHVlcyBmb3IgdGhlIHJlc291cmNlcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lQ29kZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gb3V0bGluZSBjb2RlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSBhIHBvaW50ZXIgYmFjayB0byAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0bGluZSBjb2RlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXZhaWxhYmlsaXR5UGVyaW9kcyIgZVR5cGU9IiMvL0F2YWlsYWJpbGl0eVBlcmlvZHMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2YgcGVyaW9kcyBkdXJpbmcgd2hpY2ggdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmlsaXR5UGVyaW9kcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJhdGVzIiBlVHlwZT0iIy8vUmF0ZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2YgcGVyaW9kcyBhbmQgdGhlIHJhdGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIG9uZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlc291cmNlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9SZXNvdXJjZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHJlc291cmNlIGluIGVhY2ggUmVzb3VyY2VzIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUm9sbHVwVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xsdXBUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGVGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZUZvcm1hdF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNyA4Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN1YmplY3RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJqZWN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN1YnByb2plY3ROYW1lVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3VicHJvamVjdE5hbWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvc2l0aW9uIGlkZW50aWZpZXIgb2YgdGhlIHRhc2sgd2l0aGluIHRoZSBsaXN0IG9mIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9OYW1lVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9Rml4ZWQgVW5pdHMsIDE9Rml4ZWQgRHVyYXRpb24sIDI9Rml4ZWQgV29yay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzTnVsbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHRhc2sgaXMgbnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNOdWxsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRlRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgd2FzIGNyZWF0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyZWF0ZURhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb250YWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29udGFjdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29udGFjdCBwZXJzb24gZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250YWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id0JTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgY29kZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id0JTTGV2ZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJpZ2h0bW9zdCBXQlMgbGV2ZWwgb2YgdGhlIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im91dGxpbmVOdW1iZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lTnVtYmVyVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvdXRsaW5lIG51bWJlciBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZU51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im91dGxpbmVMZXZlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG91dGxpbmUgbGV2ZWwgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByaW9yaXR5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJpb3JpdHkgb2YgdGhlIHRhc2sgZnJvbSAwIHRvIDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByaW9yaXR5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGxhbm5lZCBkdXJhdGlvbiBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBEdXJhdGlvbiBvZiB0aGUgVGFzay4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygc2NoZWR1bGVkIHdvcmsgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RvcCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgd2FzIHN0b3BwZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0b3AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXN1bWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSB0YXNrIHJlc3VtZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3VtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VtZVZhbGlkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGNhbiBiZSByZXN1bWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXN1bWVWYWxpZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVmZm9ydERyaXZlbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBlZmZvcnQtZHJpdmVuLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFZmZvcnREcml2ZW4iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWN1cnJpbmciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgYSByZWN1cnJpbmcgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVjdXJyaW5nIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlckFsbG9jYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBvdmVyYWxsb2NhdGVkLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgaW5mb3JtYXRpb25hbCBvbmx5LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVyQWxsb2NhdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGVzdGltYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWlsZXN0b25lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGEgbWlsZXN0b25lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaWxlc3RvbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdW1tYXJ5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGEgc3VtbWFyeSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdW1tYXJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JpdGljYWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgaW4gdGhlIGNyaXRpY2FsIGNoYWluLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcml0aWNhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3VicHJvamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBhbiBpbnNlcnRlZCBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc1N1YnByb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N1YnByb2plY3RSZWFkT25seSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgaW5zZXJ0ZWQgcHJvamVjdCBpcyByZWFkLW9ubHkuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzU3VicHJvamVjdFJlYWRPbmx5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VicHJvamVjdE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdWJwcm9qZWN0TmFtZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBpbnNlcnRlZCBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJwcm9qZWN0TmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsVGFzayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBleHRlcm5hbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWxUYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxUYXNrUHJvamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVybmFsVGFza1Byb2plY3RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNvdXJjZSBsb2NhdGlvbiBhbmQgdGFzayBpZGVudGlmaWVyIG9mIHRoZSBleHRlcm5hbCB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbFRhc2tQcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybHlTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlYXJseSBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJseVN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybHlGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWFybHkgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcmx5RmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGF0ZVN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhdGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGF0ZVN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGF0ZUZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXRlIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYXRlRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIHRoZSB0YXNrIHN0YXJ0IGRhdGUgZnJvbSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFzZWxpbmUgc3RhcnQgZGF0ZSBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnRWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIHRhc2sgZmluaXNoIGRhdGUgZnJvbSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFzZWxpbmUgZmluaXNoIGRhdGUgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya1ZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIHRhc2sgd29yayBmcm9tIHRoZSBiYXNlbGluZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZyZWVTbGFjayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBmcmVlIHNsYWNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGcmVlU2xhY2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b3RhbFNsYWNrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHRvdGFsIHNsYWNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb3RhbFNsYWNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZml4ZWRDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpeGVkIGNvc3Qgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpeGVkQ29zdEFjY3J1YWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9GaXhlZENvc3RBY2NydWFsVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkhvdyB0aGUgZml4ZWQgY29zdCBpcyBhY2NydWVkIGFnYWluc3QgdGhlIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDE9U3RhcnQsIDI9UHJvcmF0ZWQgYW5kIDM9RW5kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaXhlZENvc3RBY2NydWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyY2VudENvbXBsZXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSBvZiB0aGUgdGFzayBkdXJhdGlvbiBjb21wbGV0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmNlbnRXb3JrQ29tcGxldGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIG9mIHRoZSB0YXNrIHdvcmsgY29tcGxldGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3RlZCBvciBzY2hlZHVsZWQgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN1bSBvZiB0aGUgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbEZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbEZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbER1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBkdXJhdGlvbiBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3Qgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgd29yayBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIG92ZXJ0aW1lIHdvcmsgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWd1bGFyV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVndWxhcldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdEdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgdGltZSByZXF1aXJlZCB0byBjb21wbGV0ZSB0aGUgdW5maW5pc2hlZCBwb3J0aW9uIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0Nvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgY29tcGxldGluZyB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ1dvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVDb3N0IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3QgcHJvamVjdGVkIHRvIGZpbmlzaCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVXb3JrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCB0byBmaW5pc2ggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIHRhc2sgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQUNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNWIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uc3RyYWludFR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db25zdHJhaW50VHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29uc3RyYWludCBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9QXMgU29vbiBBcyBQb3NzaWJsZSwgMT1BcyBMYXRlIEFzIFBvc3NpYmxlLCAyPU11c3QgU3RhcnQgT24sIDM9TXVzdCBGaW5pc2ggT24sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ9U3RhcnQgTm8gRWFybGllciBUaGFuLCA1PVN0YXJ0IE5vIExhdGVyIFRoYW4sIDY9RmluaXNoIE5vIEVhcmxpZXIgVGhhbiBhbmQgNz1GaW5pc2ggTm8gTGF0ZXIgVGhhbiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25zdHJhaW50VHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbGVuZGFyVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFzayBjYWxlbmRhci5SZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlIENhbGVuZGFycyBlbGVtZW50IG9mICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnN0cmFpbnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgYXJndW1lbnQgZm9yIHRoZSB0YXNrIGNvbnN0cmFpbnQgdHlwZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uc3RyYWludERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWFkbGluZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWFkbGluZSBmb3IgdGhlIHRhc2sgdG8gYmUgY29tcGxldGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWFkbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsQXNzaWdubWVudHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbGV2ZWxpbmcgY2FuIGFkanVzdCBhc3NpZ25tZW50cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxBc3NpZ25tZW50cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nQ2FuU3BsaXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbGV2ZWxpbmcgY2FuIHNwbGl0IHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0NhblNwbGl0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdEZWxheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlbGF5IGNhdXNlZCBieSBsZXZlbGluZyB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nRGVsYXlGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9MZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgZGVsYXkuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Rm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlTGV2ZWxlZFN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2sgYmVmb3JlIGl0IHdhcyBsZXZlbGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVMZXZlbGVkU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVMZXZlbGVkRmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrIGJlZm9yZSBpdCB3YXMgbGV2ZWxlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlTGV2ZWxlZEZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGluayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1R5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rQWRkcmVzc1R5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtTdWJBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWdub3JlUmVzb3VyY2VDYWxlbmRhciIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpZ25vcmVzIHRoZSByZXNvdXJjZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSWdub3JlUmVzb3VyY2VDYWxlbmRhciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGVzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOb3RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhpZGVCYXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIEdBTlRUIGJhciBvZiB0aGUgdGFzayBpcyBoaWRkZW4gd2hlbiBkaXNwbGF5ZWQgaW4gTWljcm9zb2Z0IFByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkhpZGVCYXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xsdXAiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgcm9sbGVkIHVwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xsdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2UgY29tcGxldGUgdmFsdWUgZW50ZXJlZCBieSB0aGUgUHJvamVjdCBNYW5hZ2VyLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSBmb3IgY2FsY3VsYXRpbmcgQkNXUC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGh5c2ljYWxQZXJjZW50Q29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJuZWRWYWx1ZU1ldGhvZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Vhcm5lZFZhbHVlTWV0aG9kVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXRob2QgZm9yIGNhbGN1bGF0aW5nIGVhcm5lZCB2YWx1ZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1QZXJjZW50IENvbXBsZXRlLCAxPVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybmVkVmFsdWVNZXRob2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWNlc3NvckxpbmsiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUHJlZGVjZXNzb3JMaW5rIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgcHJlZGVjZXNzb3IgdGFzayBvZiB0aGUgdGFzayB0aGF0IGNvbnRhaW5zIGl0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvckxpbmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrUHJvdGVjdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlbGluZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CYXNlbGluZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGJhc2VsaW5lIHZhbHVlcyBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lQ29kZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gb3V0bGluZSBjb2RlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgb3V0bGluZSBjb2RlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZXBoYXNlZERhdGEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFzayIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgdGFzayBpbiBlYWNoIFRhc2tzIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUaW1lUGVyaW9kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVQZXJpb2RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmcm9tRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBiZWdpbm5pbmcgb2YgdGhlIGV4Y2VwdGlvbiB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRnJvbURhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b0RhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW5kIG9mIHRoZSBleGNlcHRpb24gdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRpbWVwaGFzZWREYXRhVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmluaXRpb24gb2YgdGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2suJiN4RDsmI3hBOyYjeDk7JiN4OTsgICAgICAgICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGFUeXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVHlwZVR5cGUzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiB0YXNrIHRpbWVwaGFzZWQgZGF0YS4gVmFsdWVzIGFyZTomI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxPUFzc2lnbm1lbnQgUmVtYWluaW5nIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyPUFzc2lnbm1lbnQgQWN0dWFsIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzPUFzc2lnbm1lbnQgQWN0dWFsIE92ZXJ0aW1lIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0PUFzc2lnbm1lbnQgQmFzZWxpbmUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU9QXNzaWdubWVudCBCYXNlbGluZSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNj1Bc3NpZ25tZW50IEFjdHVhbCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNz1SZXNvdXJjZSBCYXNlbGluZSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgOD1SZXNvdXJjZSBCYXNlbGluZSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgOT1UYXNrIEJhc2VsaW5lIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxMD1UYXNrIEJhc2VsaW5lIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxMT1UYXNrIFBlcmNlbnQgQ29tcGxldGUmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxNj1Bc3NpZ25tZW50IEJhc2VsaW5lIDEgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE3PUFzc2lnbm1lbnQgQmFzZWxpbmUgMSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTg9VGFzayBCYXNlbGluZSAxIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxOT1UYXNrIEJhc2VsaW5lIDEgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIwPVJlc291cmNlIEJhc2VsaW5lIDEgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIxPVJlc291cmNlIEJhc2VsaW5lIDEgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIyPUFzc2lnbm1lbnQgQmFzZWxpbmUgMiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjM9QXNzaWdubWVudCBCYXNlbGluZSAyIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyND1UYXNrIEJhc2VsaW5lIDIgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI1PVRhc2sgQmFzZWxpbmUgMiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjY9UmVzb3VyY2UgQmFzZWxpbmUgMiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjc9UmVzb3VyY2UgQmFzZWxpbmUgMiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjg9QXNzaWdubWVudCBCYXNlbGluZSAzIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyOT1Bc3NpZ25tZW50IEJhc2VsaW5lIDMgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDMwPVRhc2sgQmFzZWxpbmUgMyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzE9VGFzayBCYXNlbGluZSAzIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzMj1SZXNvdXJjZSBCYXNlbGluZSAzIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzMz1SZXNvdXJjZSBCYXNlbGluZSAzIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzND1Bc3NpZ25tZW50IEJhc2VsaW5lIDQgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM1PUFzc2lnbm1lbnQgQmFzZWxpbmUgNCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzY9VGFzayBCYXNlbGluZSA0IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzNz1UYXNrIEJhc2VsaW5lIDQgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM4PVJlc291cmNlIEJhc2VsaW5lIDQgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM5PVJlc291cmNlIEJhc2VsaW5lIDQgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQwPUFzc2lnbm1lbnQgQmFzZWxpbmUgNSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDE9QXNzaWdubWVudCBCYXNlbGluZSA1IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0Mj1UYXNrIEJhc2VsaW5lIDUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQzPVRhc2sgQmFzZWxpbmUgNSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDQ9UmVzb3VyY2UgQmFzZWxpbmUgNSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDU9UmVzb3VyY2UgQmFzZWxpbmUgNSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDY9QXNzaWdubWVudCBCYXNlbGluZSA2IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0Nz1Bc3NpZ25tZW50IEJhc2VsaW5lIDYgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ4PVRhc2sgQmFzZWxpbmUgNiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDk9VGFzayBCYXNlbGluZSA2IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1MD1SZXNvdXJjZSBCYXNlbGluZSA2IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1MT1SZXNvdXJjZSBCYXNlbGluZSA2IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1Mj1Bc3NpZ25tZW50IEJhc2VsaW5lIDcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUzPUFzc2lnbm1lbnQgQmFzZWxpbmUgNyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTQ9VGFzayBCYXNlbGluZSA3IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1NT1UYXNrIEJhc2VsaW5lIDcgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU2PVJlc291cmNlIEJhc2VsaW5lIDcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU3PVJlc291cmNlIEJhc2VsaW5lIDcgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU4PUFzc2lnbm1lbnQgQmFzZWxpbmUgOCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTk9QXNzaWdubWVudCBCYXNlbGluZSA4IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2MD1UYXNrIEJhc2VsaW5lIDggV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDYxPVRhc2sgQmFzZWxpbmUgOCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjI9UmVzb3VyY2UgQmFzZWxpbmUgOCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjM9UmVzb3VyY2UgQmFzZWxpbmUgOCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjQ9QXNzaWdubWVudCBCYXNlbGluZSA5IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2NT1Bc3NpZ25tZW50IEJhc2VsaW5lIDkgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY2PVRhc2sgQmFzZWxpbmUgOSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjc9VGFzayBCYXNlbGluZSA5IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2OD1SZXNvdXJjZSBCYXNlbGluZSA5IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2OT1SZXNvdXJjZSBCYXNlbGluZSA5IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3MD1Bc3NpZ25tZW50IEJhc2VsaW5lIDEwIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3MT1Bc3NpZ25tZW50IEJhc2VsaW5lIDEwIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3Mj1UYXNrIEJhc2VsaW5lIDEwIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3Mz1UYXNrIEJhc2VsaW5lIDEwIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3ND1SZXNvdXJjZSBCYXNlbGluZSAxMCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzU9UmVzb3VyY2UgQmFzZWxpbmUgMTAgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDc2PVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bml0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVW5pdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSB1bml0IG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9bSwgMT1oLCAyPWQsIDM9dywgNT1tbywgOD15JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVW5pdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBwZXIgdW5pdCBvZiB0aW1lIGZvciB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlRpdGxlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGl0bGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZTMiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fM18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDQ4IDQ5IDUwIDUxIDUyIDUzIDU0IDU1IDU2IDU3IDU4IDU5IDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3IDY4IDY5IDcwIDcxIDcyIDczIDc0IDc1IDc2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlNCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl80Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlNSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl81Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVSURUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSURfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSIxNiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVbml0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVuaXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDUgOCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYWx1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIG91dGxpbmUgY29kZSB2YWx1ZSBhY3Jvc3MgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJlbnRWYWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgdGhlIHBhcmVudCBub2RlIG9mIHRoZSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBhcmVudFZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVzY3JpcHRpb24gb2YgdGhpcyB2YWx1ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVzY3JpcHRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYWx1ZTIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVuaXF1ZSBJRCBvZiB2YWx1ZSBhY3Jvc3MgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHZhbHVlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBsaXN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlTGlzdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUxpc3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9WYWx1ZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWVzIHRoYXQgbWFrZSB1cCB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVsaXN0U29ydE9yZGVyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsdWUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVmFsdWUiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaW5kaXZpZHVhbCB2YWx1ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDowIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldCU01hc2siPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTTWFza18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGV2ZWwgb2YgdGhlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1R5cGVUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHRoZSBub2RlIHZhbHVlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWVzIGFyZTogMD1OdW1iZXJzLCAxPVVwcGVyY2FzZSBMZXR0ZXJzLCAyPUxvd2VyY2FzZSBMZXR0ZXJzLCAzPUNoYXJhY3RlcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1heGltdW0gbGVuZ3RoIGluIGNoYXJhY3RlcnMuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgb21pdHRlZCB3aGVuIGxlbmd0aCBpcyAmcXVvdDthbnkmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikxlbmd0aCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcGFyYXRvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VwYXJhdG9yIGNoYXJhY3RlciBvZiB0aGUgbm9kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VwYXJhdG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV0JTTWFza3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTTWFza3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJpZnlVbmlxdWVDb2RlcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgV0JTIGNvZGVzIGFyZSB1bmlxdWUgZm9yIG5ldyB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmVyaWZ5VW5pcXVlQ29kZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZUNvZGVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBXQlMgY29kZXMgYXJlIGdlbmVyYXRlZCBmb3IgbmV3IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHZW5lcmF0ZUNvZGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUHJlZml4VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcmVmaXggZm9yIGFsbCBXQlMgY29kZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWZpeCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndCU01hc2siIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vV0JTTWFzayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBXQlMgTWFzayB0aGF0IGlzIGFwcGxpZWQgdG8gYWxsIHRhc2tzIGluIHRoZSBQcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2Vla0RheSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF5VHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RheVR5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgZGF5LiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1FeGNlcHRpb24sIDE9TW9uZGF5LCAyPVR1ZXNkYXksICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzPVdlZG5lc2RheSwgND1UaHVyc2RheSwgNT1GcmlkYXksIDY9U2F0dXJkYXksICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3PVN1bmRheSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEYXlUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF5V29ya2luZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgc3BlY2lmaWVkIGRhdGUgb3IgZGF5ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIHdvcmtpbmcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRheVdvcmtpbmciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lUGVyaW9kIiBlVHlwZT0iIy8vVGltZVBlcmlvZCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgYSBjb250aWd1b3VzIHNldCBvZiBleGNlcHRpb24gZGF5cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVQZXJpb2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JraW5nVGltZXMiIGVUeXBlPSIjLy9Xb3JraW5nVGltZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiB3b3JraW5nIHRpbWVzIHRoYXQgZGVmaW5lIHRoZSB0aW1lIHdvcmtlZCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIHdlZWtkYXkuICBPbmUgb2YgdGhlc2UgbXVzdCBiZSBwcmVzZW50LCBhbmQgdGhlcmUgbWF5IGJlIG5vIG1vcmUgdGhhbiBmaXZlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2Vla0RheXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla0RheXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWVrRGF5IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1dlZWtEYXkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHdlZWtkYXkgZWl0aGVyIGRlZmluZXMgcmVndWxhciBkYXlzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB3ZWVrIG9yIGV4Y2VwdGlvbiBkYXlzIGluIHRoZSBjYWxlbmRhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla0RheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldlZWtTdGFydERheVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrU3RhcnREYXlfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldvcmtDb250b3VyVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtDb250b3VyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3IDgiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV29ya0Zvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldvcmtHcm91cFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrR3JvdXBfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtpbmdUaW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtpbmdUaW1lXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZnJvbVRpbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBiZWdpbm5pbmcgb2YgdGhlIHdvcmtpbmcgdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGcm9tVGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvVGltZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9UaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVuZCBvZiB0aGUgd29ya2luZyAgdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb1RpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JraW5nVGltZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWVzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya2luZ1RpbWUiIHVwcGVyQm91bmQ9IjUiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JraW5nVGltZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIHdvcmtpbmcgdGltZSBkdXJpbmcgdGhlIHdlZWtkYXkuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUxNjgwNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0PgotIyA8L2NvcHlyaWdodD4KLSMKLSMgJElkOiBwbHVnaW4ucHJvcGVydGllcyx2IDEuNSAyMDA3LzAzLzA2IDIxOjEwOjIyIHNrYW5ub29yaSBFeHAgJAotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1wbHVnaW5OYW1lID0gRVBGIE1TUHJvamVjdDIwMDMgTW9kZWwKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YmI0M2NjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPCEtLQotIDxjb3B5cmlnaHQ+Ci0gPC9jb3B5cmlnaHQ+Ci0KLSAkSWQ6IHBsdWdpbi54bWwsdiAxLjIgMjAwNi8wNC8xMSAxNToyOTo1NSBqdGhhcmlvIEV4cCAkCi0tLT4KLQotPHBsdWdpbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgIDxwYWNrYWdlIAotICAgICAgIHVyaSA9ICJodHRwOi8vZXBmLmVjbGlwc2Uub3JnL21zcHJvamVjdCIgCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlIgotICAgICAgIGdlbk1vZGVsID0gIm1vZGVsL01TX1Byb2plY3RfMjAwMy5nZW5tb2RlbCIgLz4gCi0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KLSAgICA8cGFyc2VyIAotICAgICAgIHR5cGU9Im1zcHJvamVjdCIgCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbC5Nc3Byb2plY3RSZXNvdXJjZUZhY3RvcnlJbXBsIiAvPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Bc3NpZ25tZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXNzaWdubWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMzVkNWE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Bc3NpZ25tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDM0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXNzaWdubWVudC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXNzaWdubWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUYXNrVUlEIDxlbT5UYXNrIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc291cmNlVUlEIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzQ29uZmlybWVkIDxlbT5Db25maXJtZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFJhdGVUYWJsZSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RGVsYXkgPGVtPkRlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1VwZGF0ZU5lZWRlZCA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFZBQyA8ZW0+VkFDPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtDb250b3VyIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJvb2tpbmdUeXBlIDxlbT5Cb29raW5nIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXNzaWdubWVudF8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBc3NpZ25tZW50IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2sgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFza1VJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVGFza1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFza1VJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VGFza1VJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFRhc2tVSUQgPGVtPlRhc2sgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFza1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFza1VJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzb3VyY2VVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1Jlc291cmNlVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXNvdXJjZVVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UmVzb3VyY2VVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZXNvdXJjZVVJRCA8ZW0+UmVzb3VyY2UgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlc291cmNlVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZVVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiB3b3JrIGNvbXBsZXRlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGVyY2VudFdvcmtDb21wbGV0ZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVyY2VudFdvcmtDb21wbGV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgY29zdCBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxGaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsRmluaXNoIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0FjdHVhbFN0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsU3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxTdGFydCA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgYW1vdW50IG9mIHdvcmsgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQUNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFDV1AoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmZpcm1lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgUmVzb3VyY2UgaGFzIGFjY2VwdGVkIGFsbCBvZiBoaXMgb3IgaGVyIGFzc2lnbm1lbnRzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlybWVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvbmZpcm1lZCgpCi0JICogQHNlZSAjdW5zZXRDb25maXJtZWQoKQotCSAqIEBzZWUgI3NldENvbmZpcm1lZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQ29uZmlybWVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb25maXJtZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQ29uZmlybWVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNDb25maXJtZWQgPGVtPkNvbmZpcm1lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlybWVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvbmZpcm1lZCgpCi0JICogQHNlZSAjdW5zZXRDb25maXJtZWQoKQotCSAqIEBzZWUgI2lzQ29uZmlybWVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb25maXJtZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0NvbmZpcm1lZCA8ZW0+Q29uZmlybWVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENvbmZpcm1lZCgpCi0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBzZWUgI3NldENvbmZpcm1lZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q29uZmlybWVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0NvbmZpcm1lZCA8ZW0+Q29uZmlybWVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25maXJtZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENvbmZpcm1lZCgpCi0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBzZWUgI3NldENvbmZpcm1lZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q29uZmlybWVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcHJvamVjdGVkIG9yIHNjaGVkdWxlZCBjb3N0IG9mIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0IFJhdGUgVGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb3N0IHJhdGUgdGFibGUgdXNlZCBmb3IgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFJhdGUgVGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvc3RSYXRlVGFibGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0Nvc3RSYXRlVGFibGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Db3N0UmF0ZVRhYmxlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFJhdGVUYWJsZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Q29zdFJhdGVUYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RSYXRlVGFibGUgPGVtPkNvc3QgUmF0ZSBUYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0UmF0ZVRhYmxlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY29zdCBhbmQgYmFzZWxpbmUgY29zdCBmb3IgYSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICN1bnNldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0Q29zdFZhcmlhbmNlKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQ29zdFZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0Q29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29zdFZhcmlhbmNlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0Q29zdFZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDb3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0NWKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ1YnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRDVigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDVihmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBzZWUgI3NldENWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlbGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IHRoYXQgdGhlIGFzc2lnbm1lbnQgaXMgZGVsYXllZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbGF5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWxheShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfRGVsYXkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlbGF5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREZWxheSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldERlbGF5IDxlbT5EZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWxheShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0ZpbmlzaCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgdGhlIGFzc2lnbm1lbnQgZmluaXNoIGRhdGUgZnJvbSB0aGUgYmFzZWxpbmUgZmluaXNoIGRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaFZhcmlhbmNlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9GaW5pc2hWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoVmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEZpbmlzaFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoVmFyaWFuY2UgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoVmFyaWFuY2UoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0h5cGVybGluaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua1R5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGluaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIeXBlcmxpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfSHlwZXJsaW5rQWRkcmVzcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua0FkZHJlc3NUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmtBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0h5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGlua1N1YkFkZHJlc3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgYXNzaWdubWVudCB3b3JrIGZyb20gdGhlIGJhc2VsaW5lIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1dvcmtWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtWYXJpYW5jZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtWYXJpYW5jZShmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0V29ya1ZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0V29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYXMgRml4ZWQgUmF0ZSBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgVW5pdHMgYXJlIEZpeGVkIFJhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjc2V0SGFzRml4ZWRSYXRlVW5pdHMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0hhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIYXNGaXhlZFJhdGVVbml0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNIYXNGaXhlZFJhdGVVbml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjaXNIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFzRml4ZWRSYXRlVW5pdHMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0hhc0ZpeGVkUmF0ZVVuaXRzIDxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjaXNIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjc2V0SGFzRml4ZWRSYXRlVW5pdHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEhhc0ZpeGVkUmF0ZVVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0hhc0ZpeGVkUmF0ZVVuaXRzIDxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEhhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAc2VlICNpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAc2VlICNzZXRIYXNGaXhlZFJhdGVVbml0cyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SGFzRml4ZWRSYXRlVW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpeGVkIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBjb25zdW1wdGlvbiBvZiB0aGUgYXNzaWduZWQgbWF0ZXJpYWwgcmVzb3VyY2Ugb2NjdXJzIGluIGEgc2luZ2xlLCBmaXhlZCBhbW91bnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICN1bnNldEZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3NldEZpeGVkTWF0ZXJpYWwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0ZpeGVkTWF0ZXJpYWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpeGVkTWF0ZXJpYWwnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRml4ZWRNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzRml4ZWRNYXRlcmlhbCA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3Vuc2V0Rml4ZWRNYXRlcmlhbCgpCi0JICogQHNlZSAjaXNGaXhlZE1hdGVyaWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaXhlZE1hdGVyaWFsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICNpc0ZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3NldEZpeGVkTWF0ZXJpYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEZpeGVkTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzRml4ZWRNYXRlcmlhbCA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICNpc0ZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3NldEZpeGVkTWF0ZXJpYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEZpeGVkTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsaW5nIERlbGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVsYXkgY2F1c2VkIGJ5IGxldmVsaW5nLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0xldmVsaW5nRGVsYXkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsaW5nRGVsYXknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBkZWxheS4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkxldmVsaW5nRGVsYXlGb3JtYXRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbGluZ0RlbGF5Rm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nRGVsYXlGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaW5rZWQgRmllbGRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBQcm9qZWN0IGlzIGxpbmtlZCB0byBhbm90aGVyIE9MRSBvYmplY3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rZWQgRmllbGRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjdW5zZXRMaW5rZWRGaWVsZHMoKQotCSAqIEBzZWUgI3NldExpbmtlZEZpZWxkcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfTGlua2VkRmllbGRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMaW5rZWRGaWVsZHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTGlua2VkRmllbGRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpbmtlZCBGaWVsZHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICN1bnNldExpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjaXNMaW5rZWRGaWVsZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpbmtlZEZpZWxkcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTGlua2VkRmllbGRzIDxlbT5MaW5rZWQgRmllbGRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjaXNMaW5rZWRGaWVsZHMoKQotCSAqIEBzZWUgI3NldExpbmtlZEZpZWxkcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TGlua2VkRmllbGRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0xpbmtlZEZpZWxkcyA8ZW0+TGlua2VkIEZpZWxkczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGlua2VkIEZpZWxkczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICNpc0xpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjc2V0TGlua2VkRmllbGRzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMaW5rZWRGaWVsZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgYXNzaWdubWVudCBpcyBhIG1pbGVzdG9uZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3Vuc2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X01pbGVzdG9uZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWlsZXN0b25lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3Vuc2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNpc01pbGVzdG9uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWlsZXN0b25lKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWlsZXN0b25lPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vdGVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X05vdGVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05vdGVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5vdGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vdGVzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVyYWxsb2NhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBhc3NpZ25tZW50IGlzIG92ZXJhbGxvY2F0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyYWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE92ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjc2V0T3ZlcmFsbG9jYXRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfT3ZlcmFsbG9jYXRlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcmFsbG9jYXRlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNPdmVyYWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyYWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE92ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyYWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVyYWxsb2NhdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE92ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2lzT3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjc2V0T3ZlcmFsbG9jYXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0T3ZlcmFsbG9jYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyYWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRPdmVyYWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJhbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE92ZXJhbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdW0gb2YgdGhlIGFjdHVhbCBhbmQgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X092ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZ3VsYXIgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWd1bGFyV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9SZWd1bGFyV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlZ3VsYXJXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlZ3VsYXJXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVndWxhcldvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHByb2plY3RlZCBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUmVtYWluaW5nQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHByb2plY3RlZCBvdmVydGltZSBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9SZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ092ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ092ZXJ0aW1lV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ1dvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUmVtYWluaW5nV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzcG9uc2UgUGVuZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVHJ1ZSBpZiBhIHJlc3BvbnNlIGhhcyBub3QgYmVlbiByZWNlaXZlZCBmb3IgYSBUZWFtQXNzaWduIG1lc3NhZ2UuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI3Vuc2V0UmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAc2VlICNzZXRSZXNwb25zZVBlbmRpbmcoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1Jlc3BvbnNlUGVuZGluZygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzcG9uc2VQZW5kaW5nJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1Jlc3BvbnNlUGVuZGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjdW5zZXRSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI2lzUmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNwb25zZVBlbmRpbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1Jlc3BvbnNlUGVuZGluZyA8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI2lzUmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAc2VlICNzZXRSZXNwb25zZVBlbmRpbmcoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc3BvbnNlUGVuZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNSZXNwb25zZVBlbmRpbmcgPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjaXNSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI3NldFJlc3BvbnNlUGVuZGluZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVzcG9uc2VQZW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1N0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0b3A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgd2FzIHN0b3BwZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdG9wPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdG9wKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1N0b3AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdG9wJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0b3AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdG9wIDxlbT5TdG9wPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdG9wPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdG9wKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN1bWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgcmVzdW1lZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzdW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1Jlc3VtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3VtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZXN1bWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZXN1bWUgPGVtPlJlc3VtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3VtZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YXJpYW5jZSBvZiB0aGUgYXNzaWdubWVudCBzdGFydCBkYXRlIGZyb20gdGhlIGJhc2VsaW5lIHN0YXJ0IGRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnRWYXJpYW5jZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfU3RhcnRWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnRWYXJpYW5jZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0U3RhcnRWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0VmFyaWFuY2UgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnRWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnRWYXJpYW5jZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbnVtYmVyIG9mIHVuaXRzIGZvciB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFVuaXRzKCkKLQkgKiBAc2VlICN1bnNldFVuaXRzKCkKLQkgKiBAc2VlICNzZXRVbml0cyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1VuaXRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVW5pdHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRVbml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFVuaXRzIDxlbT5Vbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0VW5pdHMoKQotCSAqIEBzZWUgI2dldFVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVbml0cyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VW5pdHMoKQotCSAqIEBzZWUgI2dldFVuaXRzKCkKLQkgKiBAc2VlICNzZXRVbml0cyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRVbml0cygpCi0JICogQHNlZSAjZ2V0VW5pdHMoKQotCSAqIEBzZWUgI3NldFVuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVwZGF0ZSBOZWVkZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRydWUgaWYgdGhlIHJlc291cmNlIGFzc2lnbmVkIHRvIGEgdGFzayBuZWVkcyB0byBiZSB1cGRhdGVkIGFzIHRvIHRoZSBzdGF0dXMgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGUgTmVlZGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFVwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjdW5zZXRVcGRhdGVOZWVkZWQoKQotCSAqIEBzZWUgI3NldFVwZGF0ZU5lZWRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVXBkYXRlTmVlZGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVcGRhdGVOZWVkZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzVXBkYXRlTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNVcGRhdGVOZWVkZWQgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICN1bnNldFVwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjaXNVcGRhdGVOZWVkZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVwZGF0ZU5lZWRlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzVXBkYXRlTmVlZGVkIDxlbT5VcGRhdGUgTmVlZGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFVwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjaXNVcGRhdGVOZWVkZWQoKQotCSAqIEBzZWUgI3NldFVwZGF0ZU5lZWRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VXBkYXRlTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1VwZGF0ZU5lZWRlZCA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICNpc1VwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjc2V0VXBkYXRlTmVlZGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRVcGRhdGVOZWVkZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZBQzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBiYXNsaW5lIGNvc3QgYW5kIHRvdGFsIGNvc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WQUM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VkFDKCkKLQkgKiBAc2VlICN1bnNldFZBQygpCi0JICogQHNlZSAjc2V0VkFDKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVkFDKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVkFDJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0VkFDKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VkFDIDxlbT5WQUM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZBQzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRWQUMoKQotCSAqIEBzZWUgI3Vuc2V0VkFDKCkKLQkgKiBAc2VlICNnZXRWQUMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZBQyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRWQUMgPGVtPlZBQzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRWQUMoKQotCSAqIEBzZWUgI2dldFZBQygpCi0JICogQHNlZSAjc2V0VkFDKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VkFDKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRWQUMgPGVtPlZBQzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VkFDPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRWQUMoKQotCSAqIEBzZWUgI2dldFZBQygpCi0JICogQHNlZSAjc2V0VkFDKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VkFDKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIHNjaGVkdWxlZCB3b3JrIGZvciB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0V29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmsgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgQ29udG91cjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHdvcmsgY29udG91ciBvZiB0aGUgYXNzaWdubWVudC4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RmxhdCwgMT1CYWNrIExvYWRlZCwgMj1Gcm9udCBMb2FkZWQsIDM9RG91YmxlIFBlYWssIDQ9RWFybHkgUGVhaywgNT1MYXRlIFBlYWssIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2PUJlbGwsIDc9VHVydGxlLCA4PUNvbnRvdXJlZAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBDb250b3VyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrQ29udG91cihCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfV29ya0NvbnRvdXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JrQ29udG91clR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtDb250b3VyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRXb3JrQ29udG91cigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtDb250b3VyIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgQ29udG91cjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29ya0NvbnRvdXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtDb250b3VyKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQkNXUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1MoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Cb29raW5nIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgYm9va2luZyB0eXBlIG9mIHRoZSBhc3NpZ25tZW50LiAxPUNvbW1pdGVkLCAyPVByb3Bvc2VkCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Cb29raW5nIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJvb2tpbmdUeXBlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9Cb29raW5nVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJvb2tpbmdUeXBlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQm9va2luZ1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEJvb2tpbmdUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Qm9va2luZyBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCb29raW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Qm9va2luZ1R5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgd29yayBpcyBwcm90ZWN0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbFdvcmtQcm90ZWN0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgd2FzIGNyZWF0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0aW9uRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9DcmVhdGlvbkRhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcmVhdGlvbkRhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyZWF0aW9uRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgSUQsIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9FeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGJhc2VsaW5lIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0Jhc2VsaW5lKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Jhc2VsaW5lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRpbWVwaGFzZWQgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aW1lIHBoYXNlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1RpbWVwaGFzZWREYXRhKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpbWVwaGFzZWREYXRhJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKTsKLQotfSAvLyBBc3NpZ25tZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXNzaWdubWVudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Bc3NpZ25tZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNzJiNzNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Bc3NpZ25tZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBc3NpZ25tZW50cy5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFzc2lnbm1lbnRzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHMjZ2V0QXNzaWdubWVudCA8ZW0+QXNzaWdubWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBc3NpZ25tZW50c18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBc3NpZ25tZW50cyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgYXNzaWdubWVudCBpbiBlYWNoIEFzc2lnbm1lbnRzIGNvbGxlY3Rpb24uCi0JICogICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NpZ25tZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRzX0Fzc2lnbm1lbnQoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Fzc2lnbm1lbnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRBc3NpZ25tZW50KCk7Ci0KLX0gLy8gQXNzaWdubWVudHMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9BdmFpbGFiaWxpdHlQZXJpb2QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9BdmFpbGFiaWxpdHlQZXJpb2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjEzYmM3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXZhaWxhYmlsaXR5UGVyaW9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBdmFpbGFiaWxpdHlQZXJpb2QuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlRnJvbSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVRvIDxlbT5BdmFpbGFibGUgVG88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVVuaXRzIDxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0F2YWlsYWJpbGl0eVBlcmlvZF8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBdmFpbGFiaWxpdHlQZXJpb2QgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdmFpbGFibGUgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgcmVzb3VyY2UgYmVjb21lcyBhdmFpbGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgcGVyaW9kLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdmFpbGFibGVGcm9tKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlRnJvbSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F2YWlsYWJsZUZyb20nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QXZhaWxhYmxlRnJvbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlRnJvbSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdmFpbGFibGVGcm9tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFibGVGcm9tKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdmFpbGFibGUgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBsYXN0IGRhdGUgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHBlcmlvZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgVG88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF2YWlsYWJsZVRvKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlVG8oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdmFpbGFibGVUbycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBdmFpbGFibGVUbygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVG8gPGVtPkF2YWlsYWJsZSBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIFRvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdmFpbGFibGVUbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXZhaWxhYmxlVG8oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBlcmNlbnRhZ2UgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGR1cmluZyB0aGUgc3BlY2lmaWVkIHBlcmlvZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBzZWUgI3NldEF2YWlsYWJsZVVuaXRzKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVVbml0cygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F2YWlsYWJsZVVuaXRzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QXZhaWxhYmxlVW5pdHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVVuaXRzIDxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjdW5zZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF2YWlsYWJsZVVuaXRzKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVW5pdHMgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBzZWUgI3NldEF2YWlsYWJsZVVuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QXZhaWxhYmxlVW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVW5pdHMgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBzZWUgI3NldEF2YWlsYWJsZVVuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QXZhaWxhYmxlVW5pdHMoKTsKLQotfSAvLyBBdmFpbGFiaWxpdHlQZXJpb2QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9BdmFpbGFiaWxpdHlQZXJpb2RzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXZhaWxhYmlsaXR5UGVyaW9kcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YzQyM2RiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9BdmFpbGFiaWxpdHlQZXJpb2RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEF2YWlsYWJpbGl0eVBlcmlvZHMuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHMjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXZhaWxhYmlsaXR5UGVyaW9kc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBdmFpbGFiaWxpdHlQZXJpb2RzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmlsaXR5IFBlcmlvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwZXJpb2QgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEF2YWlsYWJpbGl0eVBlcmlvZHNfQXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F2YWlsYWJpbGl0eVBlcmlvZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEF2YWlsYWJpbGl0eVBlcmlvZCgpOwotCi19IC8vIEF2YWlsYWJpbGl0eVBlcmlvZHMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Jhc2VsaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4NmRlMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Jhc2VsaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZS5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzZWxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzSW50ZXJpbSA8ZW0+SW50ZXJpbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0RHVyYXRpb24gPGVtPkR1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjaXNFc3RpbWF0ZWREdXJhdGlvbiA8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQmFzZWxpbmVfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmFzZWxpbmUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGltZSBwaGFzZWQgZGF0YSBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2sgYmFzZWxpbmUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX1RpbWVwaGFzZWREYXRhKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpbWVwaGFzZWREYXRhJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk51bWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TnVtYmVyKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfTnVtYmVyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOdW1iZXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldE51bWJlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE51bWJlcihCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyaW08L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhpcyBpcyBhbiBJbnRlcmltIEJhc2VsaW5lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVyaW08L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SW50ZXJpbSgpCi0JICogQHNlZSAjdW5zZXRJbnRlcmltKCkKLQkgKiBAc2VlICNzZXRJbnRlcmltKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfSW50ZXJpbSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ludGVyaW0nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSW50ZXJpbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0ludGVyaW0gPGVtPkludGVyaW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkludGVyaW08L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SW50ZXJpbSgpCi0JICogQHNlZSAjdW5zZXRJbnRlcmltKCkKLQkgKiBAc2VlICNpc0ludGVyaW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEludGVyaW0oYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjaXNJbnRlcmltIDxlbT5JbnRlcmltPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEludGVyaW0oKQotCSAqIEBzZWUgI2lzSW50ZXJpbSgpCi0JICogQHNlZSAjc2V0SW50ZXJpbShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SW50ZXJpbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzSW50ZXJpbSA8ZW0+SW50ZXJpbTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJpbTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SW50ZXJpbSgpCi0JICogQHNlZSAjaXNJbnRlcmltKCkKLQkgKiBAc2VlICNzZXRJbnRlcmltKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJbnRlcmltKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX1N0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9GaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBkdXJhdGlvbiBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9EdXJhdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uIDxlbT5EdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREdXJhdGlvbihPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBEdXJhdGlvbiBvZiB0aGUgVGFzayBiYXNlbGluZS4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgMjA9ZSUsIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX0R1cmF0aW9uRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRHVyYXRpb25Gb3JtYXRUeXBlMSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRHVyYXRpb25Gb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGVkIER1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBiYXNlbGluZSBkdXJhdGlvbiBvZiB0aGUgdGFzayB3YXMgZXN0aW1hdGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjdW5zZXRFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjc2V0RXN0aW1hdGVkRHVyYXRpb24oYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9Fc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGVkRHVyYXRpb24nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRXN0aW1hdGVkRHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjaXNFc3RpbWF0ZWREdXJhdGlvbiA8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI3Vuc2V0RXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI2lzRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVzdGltYXRlZER1cmF0aW9uKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjaXNFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjc2V0RXN0aW1hdGVkRHVyYXRpb24oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEVzdGltYXRlZER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjaXNFc3RpbWF0ZWREdXJhdGlvbiA8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEVzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAc2VlICNpc0VzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAc2VlICNzZXRFc3RpbWF0ZWREdXJhdGlvbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RXN0aW1hdGVkRHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgd29yayBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0V29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9Db3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfQkNXUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dTKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfQkNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1AoKTsKLQotfSAvLyBCYXNlbGluZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Jhc2VsaW5lMi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Jhc2VsaW5lMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTBiZGZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJhc2VsaW5lMi5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNlbGluZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Jhc2VsaW5lXy5fMV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCYXNlbGluZTIgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OdW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE51bWJlcihCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lMl9OdW1iZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOdW1iZXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldE51bWJlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROdW1iZXIoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgd29yayBhc3NpZ25lZCB0aGUgcmVzb3VyY2Ugd2hlbiB0aGUgYmFzZWxpbmUgaXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUyX1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldFdvcmsgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcm9qZWN0ZWQgY29zdCBmb3IgdGhlIHJlc291cmNlIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvc3QoKQotCSAqIEBzZWUgI3Vuc2V0Q29zdCgpCi0JICogQHNlZSAjc2V0Q29zdChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTJfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Nvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvc3QoKQotCSAqIEBzZWUgI3Vuc2V0Q29zdCgpCi0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29zdChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q29zdCgpCi0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQHNlZSAjc2V0Q29zdChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Q29zdCgpCi0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQHNlZSAjc2V0Q29zdChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lMl9CQ1dTKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQkNXUycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEJDV1MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dTKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygb2YgdGhlIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZSBmb3IgdGhlIHByb2plY3QgdG8tZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTJfQkNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1AoKTsKLQotfSAvLyBCYXNlbGluZTIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZTMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODc2YmZkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZTMuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNlbGluZTM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Jhc2VsaW5lXy5fMl8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCYXNlbGluZTMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGltZSBwaGFzZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIEJhc2VsaW5lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19UaW1lcGhhc2VkRGF0YSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUaW1lcGhhc2VkRGF0YScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TnVtYmVyKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfTnVtYmVyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOdW1iZXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE51bWJlcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2goU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19GaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2goU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0b3RhbCBhbW91bnQgb2Ygd29yayBzY2hlZHVsZWQgb24gdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUzX1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFdvcmsgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0b3RhbCBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgb24gdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfQkNXUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfQkNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1AoKTsKLQotfSAvLyBCYXNlbGluZTMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9DYWxlbmRhci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0NhbGVuZGFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4YTkyMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0NhbGVuZGFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDYWxlbmRhci5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYWxlbmRhcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjaXNJc0Jhc2VDYWxlbmRhciA8ZW0+SXMgQmFzZSBDYWxlbmRhcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRCYXNlQ2FsZW5kYXJVSUQgPGVtPkJhc2UgQ2FsZW5kYXIgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldFdlZWtEYXlzIDxlbT5XZWVrIERheXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRDYWxlbmRhcigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ2FsZW5kYXJfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FsZW5kYXIgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY2FsZW5kYXIuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRDYWxlbmRhcl9VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lIG9mIHRoZSBjYWxlbmRhci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJfTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk5hbWVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgQmFzZSBDYWxlbmRhcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgY2FsZW5kYXIgaXMgYSBiYXNlIGNhbGVuZGFyLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3Vuc2V0SXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3NldElzQmFzZUNhbGVuZGFyKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJfSXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lzQmFzZUNhbGVuZGFyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzQmFzZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2lzSXNCYXNlQ2FsZW5kYXIgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3Vuc2V0SXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI2lzSXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzQmFzZUNhbGVuZGFyKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2lzSXNCYXNlQ2FsZW5kYXIgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI2lzSXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3NldElzQmFzZUNhbGVuZGFyKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc0Jhc2VDYWxlbmRhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2lzSXNCYXNlQ2FsZW5kYXIgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNzZXRJc0Jhc2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNCYXNlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgQ2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGJhc2UgY2FsZW5kYXIgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB3aGljaCB0aGlzIGNhbGVuZGFyIGRlcGVuZHMuIE9ubHkgYXBwbGljYWJsZSBpZiB0aGUgY2FsZW5kYXIgaXMgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYSBiYXNlIGNhbGVuZGFyLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QmFzZUNhbGVuZGFyVUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJfQmFzZUNhbGVuZGFyVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYXNlQ2FsZW5kYXJVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEJhc2VDYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRCYXNlQ2FsZW5kYXJVSUQgPGVtPkJhc2UgQ2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QmFzZUNhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCYXNlQ2FsZW5kYXJVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWVrIERheXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIFdlZWtkYXlzIHRoYXQgZGVmaW5lcyB0aGlzIGNhbGVuZGFyLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldlZWsgRGF5czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V2Vla0RheXMoV2Vla0RheXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJfV2Vla0RheXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXZWVrRGF5cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlZWtEYXlzIGdldFdlZWtEYXlzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldFdlZWtEYXlzIDxlbT5XZWVrIERheXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldlZWsgRGF5czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V2Vla0RheXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdlZWtEYXlzKFdlZWtEYXlzIHZhbHVlKTsKLQotfSAvLyBDYWxlbmRhcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0NhbGVuZGFycy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0NhbGVuZGFycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZGE4ZmJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9DYWxlbmRhcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ2FsZW5kYXJzLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FsZW5kYXJzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJzI2dldENhbGVuZGFyIDxlbT5DYWxlbmRhcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFycygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ2FsZW5kYXJzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhbGVuZGFycyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhbGVuZGFyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBDYWxlbmRhcnMgYXJlIHVzZWQgdG8gZGVmaW5lIHN0YW5kYXJkIHdvcmtpbmcgYW5kIAotCSAqICAgICAgICAgICAgICAgICAgICAgbm9uLXdvcmtpbmcgdGltZXMuIFByb2plY3RzIG11c3QgaGF2ZSBvbmUgYmFzZSBjYWxlbmRhci4gVGFza3MgYW5kIHJlc291cmNlcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgIG1heSBoYXZlIHRoZWlyIG93biBub24tYmFzZSBjYWxlbmRhcnMgd2hpY2ggYXJlIGJhc2VkIG9uIGEgYmFzZSBjYWxlbmRhci4KLQkgKiAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRDYWxlbmRhcnNfQ2FsZW5kYXIoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2FsZW5kYXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRDYWxlbmRhcigpOwotCi19IC8vIENhbGVuZGFycwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0RvY3VtZW50Um9vdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0RvY3VtZW50Um9vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMmM1ZGY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Eb2N1bWVudFJvb3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERvY3VtZW50Um9vdC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb2N1bWVudCBSb290PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRQcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RG9jdW1lbnRSb290KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPScnIGtpbmQ9J21peGVkJyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEb2N1bWVudFJvb3QgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXREb2N1bWVudFJvb3RfTWl4ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnRXaWxkY2FyZCcgbmFtZT0nOm1peGVkJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRNaXhlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCkKLQkgKiBAbW9kZWwgbWFwVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiBrZXlUeXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB2YWx1ZVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd4bWxuczpwcmVmaXgnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTWFwIGdldFhNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIGtleVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlVHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3hzaTpzY2hlbWFMb2NhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcm9qZWN0IGlzIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQuCi0JICogCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByb2plY3QoUHJvamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXREb2N1bWVudFJvb3RfUHJvamVjdCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHVwcGVyPSItMiIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJvamVjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2plY3QgZ2V0UHJvamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHZhbHVlKTsKLQotfSAvLyBEb2N1bWVudFJvb3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1YmE1YjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZS5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFBob25ldGljQWxpYXMgPGVtPlBob25ldGljIEFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFJvbGx1cFR5cGUgPGVtPlJvbGx1cCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldENhbGN1bGF0aW9uVHlwZSA8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGb3JtdWxhIDxlbT5Gb3JtdWxhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzUmVzdHJpY3RWYWx1ZXMgPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXREZWZhdWx0IDxlbT5EZWZhdWx0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlTGlzdCA8ZW0+VmFsdWUgTGlzdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbmRlZEF0dHJpYnV0ZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGRJRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRmllbGRJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZElEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZElEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgY3VzdG9tIGZpZWxkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX0ZpZWxkTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZE5hbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBmaWVsZAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWxpYXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX0FsaWFzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQWxpYXNUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBbGlhcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBbGlhcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRBbGlhcyA8ZW0+QWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWxpYXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBob25ldGljIEFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGhvbmV0aWMgcHJvbnVuY2lhdGlvbiBvZiB0aGUgYWxpYXMgb2YgdGhlIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tIGZpZWxkCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQaG9uZXRpY0FsaWFzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9QaG9uZXRpY0FsaWFzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUGhvbmV0aWNBbGlhc1R5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Bob25ldGljQWxpYXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGhvbmV0aWNBbGlhcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBob25ldGljQWxpYXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGx1cCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBIb3cgcm9sbHVwcyBhcmUgY2FsY3VsYXRlZC4gVmFsdWVzIGFyZTogMD1NYXhpbXVtIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9SIGZvciBmbGFnIGZpZWxkcyksIDE9TWluaW11bSAoQU5EIGZvciBmbGFnIGZpZWxkcyksIDI9Q291bnQgYWxsLCAzPVN1bSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0PUF2ZXJhZ2UsIDU9QXZlcmFnZSBGaXJzdCBTdWJsZXZlbCwgNj1Db3VudCBGaXJzdCBTdWJsZXZlbCwgNz1Db3VudCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbnN1bW1hcmllcwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xsdXAgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Um9sbHVwVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX1JvbGx1cFR5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Sb2xsdXBUeXBlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUm9sbHVwVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Um9sbHVwVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRSb2xsdXBUeXBlIDxlbT5Sb2xsdXAgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9sbHVwIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJvbGx1cFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJvbGx1cFR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWxjdWxhdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHJvbGx1cHMgYXJlIGNhbGN1bGF0ZWQgZm9yIHRhc2sgYW5kIGdyb3VwIHN1bW1hcnkgcm93cy4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPU5vbmUsIDE9Um9sbHVwLCAyPUNhbGN1bGF0aW9uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhbGN1bGF0aW9uVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX0NhbGN1bGF0aW9uVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGN1bGF0aW9uVHlwZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbGN1bGF0aW9uVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Q2FsY3VsYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldENhbGN1bGF0aW9uVHlwZSA8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FsY3VsYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWxjdWxhdGlvblR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Gb3JtdWxhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm9ybXVsYSB0aGF0IE1pY3Jvc29mdCBQcm9qZWN0IHVzZXMgdG8gcG9wdWxhdGUgdGhlIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tIHRhc2sgZmllbGQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZvcm11bGE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZvcm11bGEoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX0Zvcm11bGEoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRm9ybXVsYScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGb3JtdWxhKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZvcm11bGEgPGVtPkZvcm11bGE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZvcm11bGE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZvcm11bGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZvcm11bGEoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3RyaWN0IFZhbHVlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgUmVzdHJpY3RWYWx1ZXM9VHJ1ZSB0aGVuIG9ubHkgdmFsdWVzIGluIHRoZSBsaXN0IGFyZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgaW4gdGhlIGZpbGUKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICN1bnNldFJlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNzZXRSZXN0cmljdFZhbHVlcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXN0cmljdFZhbHVlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSZXN0cmljdFZhbHVlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc1Jlc3RyaWN0VmFsdWVzIDxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjdW5zZXRSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjaXNSZXN0cmljdFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzdHJpY3RWYWx1ZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNSZXN0cmljdFZhbHVlcyA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNpc1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNzZXRSZXN0cmljdFZhbHVlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVzdHJpY3RWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc1Jlc3RyaWN0VmFsdWVzIDxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBzZWUgI2lzUmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBzZWUgI3NldFJlc3RyaWN0VmFsdWVzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZXN0cmljdFZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEhvdyB2YWx1ZSBsaXN0cyBhcmUgc29ydGVkLiBWYWx1ZXMgYXJlOiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9RGVzY2VuZGluZywgMT1Bc2NlbmRpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlbGlzdFNvcnRPcmRlcihCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX1ZhbHVlbGlzdFNvcnRPcmRlcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlbGlzdFNvcnRPcmRlclR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlbGlzdFNvcnRPcmRlcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VmFsdWVsaXN0U29ydE9yZGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlbGlzdFNvcnRPcmRlciA8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlbGlzdFNvcnRPcmRlcihCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFwcGVuZCBOZXcgVmFsdWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJZiBBcHBlbmROZXdWYWx1ZXM9VHJ1ZSB0aGVuIGFueSBuZXcgdmFsdWVzIGFkZGVkIGluIGEgcHJvamVjdCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIHRvIHRoZSBsaXN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBzZWUgI3Vuc2V0QXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICNzZXRBcHBlbmROZXdWYWx1ZXMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9BcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FwcGVuZE5ld1ZhbHVlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNBcHBlbmROZXdWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNBcHBlbmROZXdWYWx1ZXMgPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBzZWUgI3Vuc2V0QXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICNpc0FwcGVuZE5ld1ZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXBwZW5kTmV3VmFsdWVzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBzZWUgI2lzQXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICNzZXRBcHBlbmROZXdWYWx1ZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEFwcGVuZE5ld1ZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjaXNBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBzZWUgI3NldEFwcGVuZE5ld1ZhbHVlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QXBwZW5kTmV3VmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIHBvaW50cyB0byB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgbGlzdC4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgcHJlc2VudCBpZiBubyBkZWZhdWx0IGlzIHNldC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVmYXVsdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRGVmYXVsdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RGVmYXVsdCA8ZW0+RGVmYXVsdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgTGlzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hlbiB2YWx1ZXMgb2YgZXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkIGFzIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyBvZiBlbGVtZW50cyBpbiB0aGUgc2NoZW1hLCB0aGV5IG1heSBlaXRoZXIgYmUgc3BlY2lmaWVkIGJ5IHZhbHVlcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGJ5IHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBsaXN0LiAgQXBwbGljYXRpb25zIG1heSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc3VtZSBvcmRlcmluZyBvZiB0aGUgbGlzdCBieSBvcmRlcmluZyBzcGVjaWZpZWQgaGVyZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgTGlzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VmFsdWVMaXN0KFZhbHVlTGlzdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9WYWx1ZUxpc3QoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZUxpc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYWx1ZUxpc3QgZ2V0VmFsdWVMaXN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlTGlzdCA8ZW0+VmFsdWUgTGlzdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgTGlzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VmFsdWVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZUxpc3QoVmFsdWVMaXN0IHZhbHVlKTsKLQotfSAvLyBFeHRlbmRlZEF0dHJpYnV0ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlMi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmN2Y4MTI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlMi5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlMigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGVfLl8xXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGVkQXR0cmlidXRlMiBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGRJRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX0ZpZWxkSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGRJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlMl9WYWx1ZUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk9JSwgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfRHVyYXRpb25Gb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EdXJhdGlvbkZvcm1hdFR5cGUyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbkZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi19IC8vIEV4dGVuZGVkQXR0cmlidXRlMgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlMy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMGIwMTA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlMy5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlMygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGVfLl8yXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGVkQXR0cmlidXRlMyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGRJRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX0ZpZWxkSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGRJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlM19WYWx1ZUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfRHVyYXRpb25Gb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EdXJhdGlvbkZvcm1hdFR5cGUzIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbkZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi19IC8vIEV4dGVuZGVkQXR0cmlidXRlMwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlNC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDQyNDBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlNC5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlNCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGVfLl8zXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGVkQXR0cmlidXRlNCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZpZWxkIElEIGluIHRoZSBsb2NhbGlzZWQgbGFuZ3VhZ2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGRJRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X0ZpZWxkSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGRJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlNF9WYWx1ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVmFsdWVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfRHVyYXRpb25Gb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EdXJhdGlvbkZvcm1hdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLX0gLy8gRXh0ZW5kZWRBdHRyaWJ1dGU0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlNjNhZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZXMuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0V4dGVuZGVkQXR0cmlidXRlc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbmRlZEF0dHJpYnV0ZXMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEVhY2ggb2YgdGhlIGluZGl2aWR1YWwgZW50cmllcyBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlcyBkZWZpbml0aW9uIAotCSAqICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi4gIFRoZXJlIGFyZSBubyBsaW1pdHMgdG8gdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IG1heSBhcHBlYXIsIGJ1dCBwcm9qZWN0IAotCSAqICAgICAgICAgICAgICAgICAgICAgd2lsbCBvbmx5IHVuZGVyc3RhbmQgRmxhZzEtRmxhZzEwLCBldGMuICBUaGlzIG11c3QgYXBwZWFyIG9uY2UgaW4gZWFjaCBFeHRlbmRlZEF0dHJpYnV0ZXMgCi0JICogICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzX0V4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi19IC8vIEV4dGVuZGVkQXR0cmlidXRlcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01hc2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9NYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJlMDJlMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01hc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1hc2suamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0TGV2ZWwgPGVtPkxldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0U2VwYXJhdG9yIDxlbT5TZXBhcmF0b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRNYXNrKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNYXNrXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hc2sgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxldmVsIG9mIHRoZSBtYXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWwoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRNYXNrX0xldmVsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWwoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHlwZSBvZiBtYXNrLiBWYWx1ZXMgYXJlOiAwPU51bWJlcnMsIDE9VXBwZXIgQ2FzZSBMZXR0ZXJzLCAyPUxvd2VyIENhc2UgTGV0dGVycywgMz1DaGFyYWN0ZXJzCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRNYXNrX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UeXBlVHlwZTUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbWF4aW11bSBsZW5ndGggaW4gY2hhcmFjdGVycyBvZiB0aGUgb3V0bGluZSBjb2RlIHZhbHVlcy4gIElmIGxlbmd0aCBpcyBhbnksIHRoZSB2YWx1ZSBpcyB6ZXJvLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExlbmd0aChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE1hc2tfTGVuZ3RoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZW5ndGgnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExlbmd0aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGVuZ3RoKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VwYXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2VwYXJhdG9yIHZhbHVlIG9mIHRoZSBjb2RlIHZhbHVlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VwYXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXBhcmF0b3IoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE1hc2tfU2VwYXJhdG9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NlcGFyYXRvcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZXBhcmF0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VwYXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXBhcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcGFyYXRvcihTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1hc2sKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9NYXNrcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01hc2tzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0NGU0NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01hc2tzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1hc2tzLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFza3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrcyNnZXRNYXNrIDxlbT5NYXNrPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0TWFza3MoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01hc2tzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hc2tzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFzazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm91ciBlbGVtZW50cyBvZiB0aGUgbWFzayBjb25zdGl0dXRlIHRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIG91dGxpbmUgY29kZSBtdXN0IGFwcGVhci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFzazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRNYXNrc19NYXNrKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYXNrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWFzaygpOwotCi19IC8vIE1hc2tzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTXNwcm9qZWN0RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2M5ZWVkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTXNwcm9qZWN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0RmFjdG9yeS5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTXNwcm9qZWN0RmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCU1zcHJvamVjdEZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Bc3NpZ25tZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Bc3NpZ25tZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBc3NpZ25tZW50IGNyZWF0ZUFzc2lnbm1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXNzaWdubWVudHM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBc3NpZ25tZW50cyBjcmVhdGVBc3NpZ25tZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBdmFpbGFiaWxpdHlQZXJpb2QgY3JlYXRlQXZhaWxhYmlsaXR5UGVyaW9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXZhaWxhYmlsaXR5UGVyaW9kcyBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2VsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CYXNlbGluZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmFzZWxpbmUgY3JlYXRlQmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmFzZWxpbmUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CYXNlbGluZTI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJhc2VsaW5lMiBjcmVhdGVCYXNlbGluZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmFzZWxpbmUzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CYXNlbGluZTM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJhc2VsaW5lMyBjcmVhdGVCYXNlbGluZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FsZW5kYXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNhbGVuZGFyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDYWxlbmRhciBjcmVhdGVDYWxlbmRhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYWxlbmRhcnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNhbGVuZGFyczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2FsZW5kYXJzIGNyZWF0ZUNhbGVuZGFycygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb2N1bWVudFJvb3QgY3JlYXRlRG9jdW1lbnRSb290KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFeHRlbmRlZEF0dHJpYnV0ZSBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFeHRlbmRlZEF0dHJpYnV0ZTIgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVuZGVkQXR0cmlidXRlMyBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXh0ZW5kZWRBdHRyaWJ1dGU0IGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlNCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFeHRlbmRlZEF0dHJpYnV0ZXMgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1hc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1hc2s8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1hc2sgY3JlYXRlTWFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NYXNrczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWFza3M8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1hc2tzIGNyZWF0ZU1hc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPdXRsaW5lQ29kZSBjcmVhdGVPdXRsaW5lQ29kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGUyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPdXRsaW5lQ29kZTIgY3JlYXRlT3V0bGluZUNvZGUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGxpbmVDb2RlMyBjcmVhdGVPdXRsaW5lQ29kZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0bGluZUNvZGVzIGNyZWF0ZU91dGxpbmVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcmVkZWNlc3NvckxpbmsgY3JlYXRlUHJlZGVjZXNzb3JMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2plY3QgY3JlYXRlUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SYXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSYXRlIGNyZWF0ZVJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJhdGVzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSYXRlcyBjcmVhdGVSYXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlc291cmNlIGNyZWF0ZVJlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2VzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXNvdXJjZXMgY3JlYXRlUmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2sgY3JlYXRlVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFza3M8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2tzIGNyZWF0ZVRhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRpbWUgUGVyaW9kPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UaW1lIFBlcmlvZDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGltZVBlcmlvZCBjcmVhdGVUaW1lUGVyaW9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UaW1lcGhhc2VkIERhdGEgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGltZXBoYXNlZERhdGFUeXBlIGNyZWF0ZVRpbWVwaGFzZWREYXRhVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhbHVlIGNyZWF0ZVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbHVlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsdWUyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYWx1ZTIgY3JlYXRlVmFsdWUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbHVlIExpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbHVlIExpc3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhbHVlTGlzdCBjcmVhdGVWYWx1ZUxpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsdWVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhbHVlcyBjcmVhdGVWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V0JTIE1hc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldCUyBNYXNrPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXQlNNYXNrIGNyZWF0ZVdCU01hc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V0JTIE1hc2tzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XQlMgTWFza3M8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdCU01hc2tzIGNyZWF0ZVdCU01hc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlZWsgRGF5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XZWVrIERheTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2Vla0RheSBjcmVhdGVXZWVrRGF5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlZWsgRGF5czwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2VlayBEYXlzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWVrRGF5cyBjcmVhdGVXZWVrRGF5cygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JraW5nIFRpbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmtpbmcgVGltZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya2luZ1RpbWUgY3JlYXRlV29ya2luZ1RpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29ya2luZyBUaW1lczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29ya2luZyBUaW1lczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya2luZ1RpbWVzIGNyZWF0ZVdvcmtpbmdUaW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNc3Byb2plY3RQYWNrYWdlIGdldE1zcHJvamVjdFBhY2thZ2UoKTsKLQotfSAvL01zcHJvamVjdEZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Nc3Byb2plY3RQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTXNwcm9qZWN0UGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODU2NzY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Nc3Byb2plY3RQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTU0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdFBhY2thZ2UuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgZnVsbCBwcm9qZWN0IHNjaGVtYSBkZWZpbml0aW9uIGZyb20gdGhlIHByb2plY3QgbGV2ZWwgZG93biwgCi0gKiAJCXN0YXJ0aW5nIHdpdGggZGF0YSB0eXBlIGRlZmluaXRpb25zLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdEZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1zcHJvamVjdFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAibXNwcm9qZWN0IjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2VwZi5lY2xpcHNlLm9yZy9tc3Byb2plY3QiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAibXNwcm9qZWN0IjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTXNwcm9qZWN0UGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwgPGVtPkFzc2lnbm1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFTU0lHTk1FTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFzayBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19UQVNLX1VJRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlEID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQUNUVUFMX0NPU1QgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1RVQUxfRklOSVNIID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQUNUVUFMX1dPUksgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1dQID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlybWVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQ09ORklSTUVEID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0NPU1QgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0IFJhdGUgVGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19DT1NUX1JBVEVfVEFCTEUgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0IFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRSA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQ1YgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0RFTEFZID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fRklOSVNIID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHlwZXJsaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fSFlQRVJMSU5LID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19IWVBFUkxJTktfQUREUkVTUyA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0hZUEVSTElOS19TVUJfQUREUkVTUyA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUyA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpeGVkIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fRklYRURfTUFURVJJQUwgPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVlfRk9STUFUID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEZpZWxkczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0xJTktFRF9GSUVMRFMgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaWxlc3RvbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19NSUxFU1RPTkUgPSAyODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX05PVEVTID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcmFsbG9jYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fT1ZFUlRJTUVfQ09TVCA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19PVkVSVElNRV9XT1JLID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVndWxhciBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVHVUxBUl9XT1JLID0gMzM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRU1BSU5JTkdfQ09TVCA9IDM0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1QgPSAzNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLID0gMzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRU1BSU5JTkdfV09SSyA9IDM3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNlIFBlbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19TVEFSVCA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0b3A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19TVE9QID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzdW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVTVU1FID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19TVEFSVF9WQVJJQU5DRSA9IDQyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fVU5JVFMgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGUgTmVlZGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fVVBEQVRFX05FRURFRCA9IDQ0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZBQzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1ZBQyA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19XT1JLID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBDb250b3VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fV09SS19DT05UT1VSID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0JDV1MgPSA0ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQkNXUCA9IDQ5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJvb2tpbmcgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0JPT0tJTkdfVFlQRSA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRCA9IDUxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCA9IDUyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19DUkVBVElPTl9EQVRFID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEUgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQkFTRUxJTkUgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQSA9IDU2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Bc3NpZ25tZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfRkVBVFVSRV9DT1VOVCA9IDU3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudHNJbXBsIDxlbT5Bc3NpZ25tZW50czwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50c0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBU1NJR05NRU5UUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzaWdubWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Bc3NpZ25tZW50czwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZEltcGwgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXZhaWxhYmlsaXR5UGVyaW9kSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEF2YWlsYWJpbGl0eVBlcmlvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBVkFJTEFCSUxJVFlfUEVSSU9EID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFibGUgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9GUk9NID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFibGUgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVE8gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9VTklUUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRF9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRFMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0RTX19BVkFJTEFCSUxJVFlfUEVSSU9EID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRFNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwgPGVtPkJhc2VsaW5lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJBU0VMSU5FID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEEgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk51bWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19OVU1CRVIgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyaW08L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fSU5URVJJTSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fU1RBUlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19GSU5JU0ggPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX0RVUkFUSU9OID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fRFVSQVRJT05fRk9STUFUID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZWQgRHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fRVNUSU1BVEVEX0RVUkFUSU9OID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX1dPUksgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fQ09TVCA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19CQ1dTID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19CQ1dQID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJhc2VsaW5lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX0ZFQVRVUkVfQ09VTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lMkltcGwgPGVtPkJhc2VsaW5lMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QmFzZWxpbmUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJBU0VMSU5FMiA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUyX19OVU1CRVIgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX1dPUksgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX0NPU1QgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX0JDV1MgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX0JDV1AgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CYXNlbGluZTI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUyX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUzSW1wbCA8ZW0+QmFzZWxpbmUzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUzID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fVElNRVBIQVNFRF9EQVRBID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX05VTUJFUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX1NUQVJUID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX0ZJTklTSCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fV09SSyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fQ09TVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fQkNXUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fQkNXUCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJhc2VsaW5lMzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfRkVBVFVSRV9DT1VOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwgPGVtPkNhbGVuZGFyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBTEVOREFSID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FMRU5EQVJfX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEJhc2UgQ2FsZW5kYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9fSVNfQkFTRV9DQUxFTkRBUiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDYWxlbmRhciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9fQkFTRV9DQUxFTkRBUl9VSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlZWsgRGF5czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBTEVOREFSX19XRUVLX0RBWVMgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5DYWxlbmRhcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFyc0ltcGwgPGVtPkNhbGVuZGFyczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhcnNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q2FsZW5kYXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBTEVOREFSUyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsZW5kYXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBTEVOREFSU19fQ0FMRU5EQVIgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5DYWxlbmRhcnM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FMRU5EQVJTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRG9jdW1lbnRSb290SW1wbCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Eb2N1bWVudFJvb3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1QgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19NSVhFRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVAgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fUFJPSkVDVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURSA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxpYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX0FMSUFTID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaG9uZXRpYyBBbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fUEhPTkVUSUNfQUxJQVMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGx1cCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19ST0xMVVBfVFlQRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsY3VsYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fQ0FMQ1VMQVRJT05fVFlQRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rm9ybXVsYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fRk9STVVMQSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzdHJpY3QgVmFsdWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19SRVNUUklDVF9WQUxVRVMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUiA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXBwZW5kIE5ldyBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19ERUZBVUxUID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgTGlzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVCA9IDExOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlMkltcGwgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUyID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFMl9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFX0lEID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUyX19EVVJBVElPTl9GT1JNQVQgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlM0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFMyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTNfX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX19GSUVMRF9JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRV9JRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFM19fRFVSQVRJT05fRk9STUFUID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTQgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9fRklFTERfSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUVfSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTRfX0RVUkFUSU9OX0ZPUk1BVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlc0ltcGwgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVTID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVTX19FWFRFTkRFRF9BVFRSSUJVVEUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCA8ZW0+TWFzazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE1hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUFTSyA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUFTS19fTEVWRUwgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNQVNLX19UWVBFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNQVNLX19MRU5HVEggPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcGFyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1BU0tfX1NFUEFSQVRPUiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1hc2s8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUFTS19GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1hc2tzSW1wbCA8ZW0+TWFza3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTWFza3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUFTS1MgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXNrPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNQVNLU19fTUFTSyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1hc2tzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1BU0tTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX0ZJRUxEX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19GSUVMRF9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fQUxJQVMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBob25ldGljIEFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19QSE9ORVRJQ19BTElBUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19WQUxVRVMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGVycHJpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX0VOVEVSUFJJU0UgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19FTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX1JFU09VUkNFX1NVQlNUSVRVVElPTl9FTkFCTEVEID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZWFmIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX0xFQUZfT05MWSA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxsIExldmVscyBSZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRCA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19NQVNLUyA9IDExOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX0ZFQVRVUkVfQ09VTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlMkltcGwgPGVtPk91dGxpbmUgQ29kZTI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE91dGxpbmVDb2RlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUyID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFMl9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTJfX0ZJRUxEX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTJfX1ZBTFVFX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3V0bGluZSBDb2RlMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUyX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUzSW1wbCA8ZW0+T3V0bGluZSBDb2RlMzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0T3V0bGluZUNvZGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTMgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUzX19VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFM19fRklFTERfSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFM19fVkFMVUVfSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PdXRsaW5lIENvZGUzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTNfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZXNJbXBsIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2Rlc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRPdXRsaW5lQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFUyA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGxpbmUgQ29kZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFU19fT1VUTElORV9DT0RFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJlZGVjZXNzb3JMaW5rSW1wbCA8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBSRURFQ0VTU09SX0xJTksgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkVERUNFU1NPUl9MSU5LX19QUkVERUNFU1NPUl9VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkVERUNFU1NPUl9MSU5LX19UWVBFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Dcm9zcyBQcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3Jvc3MgUHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVF9OQU1FID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIExhZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSRURFQ0VTU09SX0xJTktfX0xJTktfTEFHID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWcgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19fTEFHX0ZPUk1BVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19GRUFUVVJFX0NPVU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsIDxlbT5Qcm9qZWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9KRUNUID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGl0bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19USVRMRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1NVQkpFQ1QgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ0FURUdPUlkgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBhbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19DT01QQU5ZID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW5hZ2VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTUFOQUdFUiA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQVVUSE9SID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGlvbiBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1JFQVRJT05fREFURSA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV2aXNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19SRVZJU0lPTiA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFzdCBTYXZlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0xBU1RfU0FWRUQgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVCA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19TVEFSVF9EQVRFID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19GSU5JU0hfREFURSA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZZIFN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19GWVNUQVJUX0RBVEUgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Dcml0aWNhbCBTbGFjayBMaW1pdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlUID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVuY3kgRGlnaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1VSUkVOQ1lfRElHSVRTID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVuY3kgU3ltYm9sPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ0FMRU5EQVJfVUlEID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBTdGFydCBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREVGQVVMVF9TVEFSVF9USU1FID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBGaW5pc2ggVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfRklOSVNIX1RJTUUgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaW51dGVzIFBlciBEYXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NSU5VVEVTX1BFUl9EQVkgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaW51dGVzIFBlciBXZWVrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTUlOVVRFU19QRVJfV0VFSyA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRheXMgUGVyIE1vbnRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREFZU19QRVJfTU9OVEggPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFRhc2sgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfVEFTS19UWVBFID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTCA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURSA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfT1ZFUlRJTUVfUkFURSA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RVUkFUSU9OX0ZPUk1BVCA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fV09SS19GT1JNQVQgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19FRElUQUJMRV9BQ1RVQUxfQ09TVFMgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib25vciBDb25zdHJhaW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0hPTk9SX0NPTlNUUkFJTlRTID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWFybmVkIFZhbHVlIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0QgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19JTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUlkgPSAzNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ORVdfVEFTS1NfRUZGT1JUX0RSSVZFTiA9IDM2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ORVdfVEFTS1NfRVNUSU1BVEVEID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fU1BMSVRTX0lOX1BST0dSRVNTX1RBU0tTID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ByZWFkIEFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NUID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURSA9IDQwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1RBU0tfVVBEQVRFU19SRVNPVVJDRSA9IDQxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpc2NhbCBZZWFyIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fRklTQ0FMX1lFQVJfU1RBUlQgPSA0MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWVrIFN0YXJ0IERheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1dFRUtfU1RBUlRfREFZID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19CQUNLID0gNDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSyA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQgPSA0NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkQgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRSA9IDQ4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1MgPSA0OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGF0dXMgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1NUQVRVU19EQVRFID0gNTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1VSUkVOVF9EQVRFID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX01JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkwgPSA1MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRvbGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0FVVE9MSU5LID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX05FV19UQVNLX1NUQVJUX0RBVEUgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREVGQVVMVF9UQVNLX0VWX01FVEhPRCA9IDU1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEID0gNTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0VYVEVOREVEX0NSRUFUSU9OX0RBVEUgPSA1NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWxzIEluIFN5bmM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkMgPSA1ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fUkVNT1ZFX0ZJTEVfUFJPUEVSVElFUyA9IDU5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkbWluIFByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19BRE1JTl9QUk9KRUNUID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX09VVExJTkVfQ09ERVMgPSA2MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XQlMgTWFza3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19XQlNfTUFTS1MgPSA2MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUyA9IDYzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhbGVuZGFyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0NBTEVOREFSUyA9IDY0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fVEFTS1MgPSA2NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19SRVNPVVJDRVMgPSA2NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0FTU0lHTk1FTlRTID0gNjc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlByb2plY3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9GRUFUVVJFX0NPVU5UID0gNjg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCA8ZW0+UmF0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkFURSA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhdGVzIEZyb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19SQVRFU19GUk9NID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYXRlcyBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX1JBVEVTX1RPID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYXRlIFRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURV9fUkFURV9UQUJMRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX1NUQU5EQVJEX1JBVEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURV9fU1RBTkRBUkRfUkFURV9GT1JNQVQgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19PVkVSVElNRV9SQVRFID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBSYXRlIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX09WRVJUSU1FX1JBVEVfRk9STUFUID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0IFBlciBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19DT1NUX1BFUl9VU0UgPSA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfRkVBVFVSRV9DT1VOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlc0ltcGwgPGVtPlJhdGVzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFJhdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJBVEVTID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURVNfX1JBVEUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SYXRlczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCA8ZW0+UmVzb3VyY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0UgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19OQU1FID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1RZUEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE51bGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSVNfTlVMTCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSU5JVElBTFMgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBob25ldGljczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19QSE9ORVRJQ1MgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5UIEFjY291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fTlRBQ0NPVU5UID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXRlcmlhbCBMYWJlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19NQVRFUklBTF9MQUJFTCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29kZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DT0RFID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19HUk9VUCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgR3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fV09SS19HUk9VUCA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVtYWlsIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fRU1BSUxfQUREUkVTUyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19IWVBFUkxJTksgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUyA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19IWVBFUkxJTktfU1VCX0FERFJFU1MgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXggVW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fTUFYX1VOSVRTID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVhayBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19QRUFLX1VOSVRTID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlciBBbGxvY2F0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFibGUgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BVkFJTEFCTEVfRlJPTSA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BVkFJTEFCTEVfVE8gPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19TVEFSVCA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19GSU5JU0ggPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYW4gTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ0FOX0xFVkVMID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjcnVlIEF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDQ1JVRV9BVCA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fV09SSyA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZ3VsYXIgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19SRUdVTEFSX1dPUksgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX09WRVJUSU1FX1dPUksgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BQ1RVQUxfV09SSyA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1JFTUFJTklOR19XT1JLID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUksgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSyA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19QRVJDRU5UX1dPUktfQ09NUExFVEUgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEUgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19TVEFOREFSRF9SQVRFX0ZPUk1BVCA9IDM0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ09TVCA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fT1ZFUlRJTUVfUkFURSA9IDM2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEVfRk9STUFUID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19PVkVSVElNRV9DT1NUID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdCBQZXIgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRSA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDVFVBTF9DT1NUID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1QgPSA0MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19SRU1BSU5JTkdfQ09TVCA9IDQyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19XT1JLX1ZBUklBTkNFID0gNDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DT1NUX1ZBUklBTkNFID0gNDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U1Y8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fU1YgPSA0NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DVjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DViA9IDQ3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNXUCA9IDQ4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DQUxFTkRBUl9VSUQgPSA0OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19OT1RFUyA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQkNXUyA9IDUxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQkNXUCA9IDUyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEdlbmVyaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSVNfR0VORVJJQyA9IDUzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEluYWN0aXZlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0lTX0lOQUNUSVZFID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW50ZXJwcmlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19JU19FTlRFUlBSSVNFID0gNTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Qm9va2luZyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0JPT0tJTkdfVFlQRSA9IDU2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BQ1RVQUxfV09SS19QUk9URUNURUQgPSA1NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEID0gNTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDVElWRV9ESVJFQ1RPUllfR1VJRCA9IDU5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ1JFQVRJT05fREFURSA9IDYwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0VYVEVOREVEX0FUVFJJQlVURSA9IDYxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQkFTRUxJTkUgPSA2MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19PVVRMSU5FX0NPREUgPSA2MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUyA9IDY0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1JBVEVTID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fVElNRVBIQVNFRF9EQVRBID0gNjY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlJlc291cmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0ZFQVRVUkVfQ09VTlQgPSA2NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlc0ltcGwgPGVtPlJlc291cmNlczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZXNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UmVzb3VyY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFU09VUkNFUyA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRVNfX1JFU09VUkNFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UmVzb3VyY2VzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsIDxlbT5UYXNrPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTkFNRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1RZUEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE51bGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JU19OVUxMID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGUgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NSRUFURV9EQVRFID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OVEFDVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V0JTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fV0JTID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XQlMgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19XQlNfTEVWRUwgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGxpbmUgTnVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1VUTElORV9OVU1CRVIgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGxpbmUgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVVRMSU5FX0xFVkVMID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpb3JpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUklPUklUWSA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1RBUlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GSU5JU0ggPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0RVUkFUSU9OID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRFVSQVRJT05fRk9STUFUID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1dPUksgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdG9wPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1RPUCA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFU1VNRSA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VtZSBWYWxpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFU1VNRV9WQUxJRCA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVmZm9ydCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FRkZPUlRfRFJJVkVOID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVjdXJyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVDVVJSSU5HID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlciBBbGxvY2F0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVkVSX0FMTE9DQVRFRCA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VTVElNQVRFRCA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX01JTEVTVE9ORSA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1bW1hcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVU1NQVJZID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JpdGljYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DUklUSUNBTCA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN1YnByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JU19TVUJQUk9KRUNUID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JU19TVUJQUk9KRUNUX1JFQURfT05MWSA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YnByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NVQlBST0pFQ1RfTkFNRSA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIFRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FWFRFUk5BTF9UQVNLID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVhURVJOQUxfVEFTS19QUk9KRUNUID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWFybHkgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FQVJMWV9TVEFSVCA9IDMyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVhcmx5IEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VBUkxZX0ZJTklTSCA9IDMzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhdGUgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19MQVRFX1NUQVJUID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGF0ZSBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19MQVRFX0ZJTklTSCA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1RBUlRfVkFSSUFOQ0UgPSAzNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2ggVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GSU5JU0hfVkFSSUFOQ0UgPSAzNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fV09SS19WQVJJQU5DRSA9IDM4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyZWUgU2xhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GUkVFX1NMQUNLID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgU2xhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19UT1RBTF9TTEFDSyA9IDQwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpeGVkIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GSVhFRF9DT1NUID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rml4ZWQgQ29zdCBBY2NydWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRklYRURfQ09TVF9BQ0NSVUFMID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyY2VudCBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BFUkNFTlRfQ09NUExFVEUgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QRVJDRU5UX1dPUktfQ09NUExFVEUgPSA0NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09TVCA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVkVSVElNRV9DT1NUID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09WRVJUSU1FX1dPUksgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BQ1RVQUxfU1RBUlQgPSA0ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX0ZJTklTSCA9IDQ5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBEdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9EVVJBVElPTiA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX0NPU1QgPSA1MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9PVkVSVElNRV9DT1NUID0gNTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BQ1RVQUxfV09SSyA9IDUzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUksgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWd1bGFyIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRUdVTEFSX1dPUksgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgRHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRU1BSU5JTkdfRFVSQVRJT04gPSA1NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFTUFJTklOR19DT1NUID0gNTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRU1BSU5JTkdfV09SSyA9IDU4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1QgPSA1OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QUNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDV1AgPSA2MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DVjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NWID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uc3RyYWludCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OU1RSQUlOVF9UWVBFID0gNjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ0FMRU5EQVJfVUlEID0gNjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uc3RyYWludCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OU1RSQUlOVF9EQVRFID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVhZGxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19ERUFETElORSA9IDY2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsIEFzc2lnbm1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTEVWRUxfQVNTSUdOTUVOVFMgPSA2NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbGluZyBDYW4gU3BsaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19MRVZFTElOR19DQU5fU1BMSVQgPSA2ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0xFVkVMSU5HX0RFTEFZID0gNjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUID0gNzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIExldmVsZWQgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUkVfTEVWRUxFRF9TVEFSVCA9IDcxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBMZXZlbGVkIEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSCA9IDcyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0hZUEVSTElOSyA9IDczOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluayBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSFlQRVJMSU5LX0FERFJFU1MgPSA3NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1MgPSA3NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVIgPSA3NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX05PVEVTID0gNzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGlkZSBCYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19ISURFX0JBUiA9IDc4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGx1cDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JPTExVUCA9IDc5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19CQ1dTID0gODA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0JDV1AgPSA4MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURSA9IDgyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FQVJORURfVkFMVUVfTUVUSE9EID0gODM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3IgTGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFREVDRVNTT1JfTElOSyA9IDg0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRCA9IDg1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCA9IDg2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVhURU5ERURfQVRUUklCVVRFID0gODc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZWxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0JBU0VMSU5FID0gODg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVVRMSU5FX0NPREUgPSA4OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1RJTUVQSEFTRURfREFUQSA9IDkwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5UYXNrPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfRkVBVFVSRV9DT1VOVCA9IDkxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza3NJbXBsIDxlbT5UYXNrczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLUyA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tTX19UQVNLID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VGFza3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS1NfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lUGVyaW9kSW1wbCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZVBlcmlvZEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUaW1lUGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRJTUVfUEVSSU9EID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJvbSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRV9QRVJJT0RfX0ZST01fREFURSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG8gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVfUEVSSU9EX19UT19EQVRFID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRV9QRVJJT0RfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsIDxlbT5UaW1lcGhhc2VkIERhdGEgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19UWVBFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUSU1FUEhBU0VEX0RBVEFfVFlQRV9fVUlEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19TVEFSVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRVBIQVNFRF9EQVRBX1RZUEVfX0ZJTklTSCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19VTklUID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19WQUxVRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVJbXBsIDxlbT5WYWx1ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQUxVRSA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVfX1ZBTFVFX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJlbnQgVmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRV9fUEFSRU5UX1ZBTFVFX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFX19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRV9fREVTQ1JJUFRJT04gPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlMkltcGwgPGVtPlZhbHVlMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZTJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VmFsdWUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBTFVFMiA9IDMyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUUyX19JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRTJfX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFMl9fREVTQ1JJUFRJT04gPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5WYWx1ZTI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUUyX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVMaXN0SW1wbCA8ZW0+VmFsdWUgTGlzdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUxpc3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VmFsdWVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBTFVFX0xJU1QgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVfTElTVF9fVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5WYWx1ZSBMaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFX0xJU1RfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZXNJbXBsIDxlbT5WYWx1ZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQUxVRVMgPSAzNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVTX19HUk9VUCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFU19fVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5WYWx1ZXM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVTX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza0ltcGwgPGVtPldCUyBNYXNrPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V0JTTWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXQlNfTUFTSyA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tfX0xFVkVMID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tfX1RZUEUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLX19MRU5HVEggPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcGFyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLX19TRVBBUkFUT1IgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XQlMgTWFzazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS19GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbCA8ZW0+V0JTIE1hc2tzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdCU01hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdCU19NQVNLUyA9IDM2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIENvZGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tTX19HRU5FUkFURV9DT0RFUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tTX19QUkVGSVggPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldCUyBNYXNrPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS1NfX1dCU19NQVNLID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V0JTIE1hc2tzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLU19GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlJbXBsIDxlbT5XZWVrIERheTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XZWVrRGF5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdlZWtEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV0VFS19EQVkgPSAzNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFRUtfREFZX19EQVlfVFlQRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF5IFdvcmtpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUVLX0RBWV9fREFZX1dPUktJTkcgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VFS19EQVlfX1RJTUVfUEVSSU9EID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JraW5nIFRpbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VFS19EQVlfX1dPUktJTkdfVElNRVMgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XZWVrIERheTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUVLX0RBWV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlzSW1wbCA8ZW0+V2VlayBEYXlzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdlZWtEYXlzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdFRUtfREFZUyA9IDM4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlZWsgRGF5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUVLX0RBWVNfX1dFRUtfREFZID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V2VlayBEYXlzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFRUtfREFZU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lSW1wbCA8ZW0+V29ya2luZyBUaW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdvcmtpbmdUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRSA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyb20gVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRV9fRlJPTV9USU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UbyBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS0lOR19USU1FX19UT19USU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRV9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lc0ltcGwgPGVtPldvcmtpbmcgVGltZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV29ya2luZ1RpbWVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdvcmtpbmdUaW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLSU5HX1RJTUVTID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29ya2luZyBUaW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLSU5HX1RJTUVTX19XT1JLSU5HX1RJTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRVNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkFjY3J1ZSBBdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QWNjcnVlQXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNDUlVFX0FUID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEFjdGl2ZURpcmVjdG9yeUdVSURUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFDVElWRV9ESVJFQ1RPUllfR1VJRF9UWVBFID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkFsaWFzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QWxpYXNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFMSUFTX1RZUEUgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+QXV0aG9yIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QXV0aG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBVVRIT1JfVFlQRSA9IDQ0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRSA9IDQ1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Cb29raW5nIFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Qm9va2luZ1R5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJPT0tJTkdfVFlQRV9UWVBFID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkJvb2tpbmcgVHlwZSBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Qm9va2luZ1R5cGVUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBCT09LSU5HX1RZUEVfVFlQRTEgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q2FsY3VsYXRpb24gVHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDYWxjdWxhdGlvblR5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBTENVTEFUSU9OX1RZUEVfVFlQRSA9IDQ4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5DYXRlZ29yeSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENhdGVnb3J5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDQVRFR09SWV9UWVBFID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNvZGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDb2RlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT0RFX1RZUEUgPSA1MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q29tcGFueSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENvbXBhbnlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTVBBTllfVFlQRSA9IDUxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Db25zdHJhaW50IFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q29uc3RyYWludFR5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfVFlQRV9UWVBFID0gNTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNvbnRhY3QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDb250YWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05UQUNUX1RZUEUgPSA1MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q29zdCBSYXRlIFRhYmxlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENvc3RSYXRlVGFibGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPU1RfUkFURV9UQUJMRV9UWVBFID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbiBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fVFlQRSA9IDU1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDdXJyZW5jeVN5bWJvbFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ1VSUkVOQ1lfU1lNQk9MX1RZUEUgPSA1NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RGF5IFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RGF5VHlwZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREFZX1RZUEVfVFlQRSA9IDU3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRSA9IDU4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldERlZmF1bHRUYXNrRVZNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRSA9IDU5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREZWZhdWx0VGFza1R5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFRkFVTFRfVEFTS19UWVBFX1RZUEUgPSA2MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldER1cmF0aW9uRm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVVJBVElPTl9GT1JNQVRfVFlQRSA9IDYxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldER1cmF0aW9uRm9ybWF0VHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFVSQVRJT05fRk9STUFUX1RZUEUxID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVVJBVElPTl9GT1JNQVRfVFlQRTIgPSA2MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUzPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREdXJhdGlvbkZvcm1hdFR5cGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERVUkFUSU9OX0ZPUk1BVF9UWVBFMyA9IDY0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldER1cmF0aW9uRm9ybWF0VHlwZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFVSQVRJT05fRk9STUFUX1RZUEU0ID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVVJBVElPTl9GT1JNQVRfVFlQRTUgPSA2NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFID0gNjc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2QgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEVhcm5lZFZhbHVlTWV0aG9kVHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMSA9IDY4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5FbWFpbCBBZGRyZXNzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RW1haWxBZGRyZXNzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTUFJTF9BRERSRVNTX1RZUEUgPSA2OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVhURVJOQUxfVEFTS19QUk9KRUNUX1RZUEUgPSA3MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRklYRURfQ09TVF9BQ0NSVUFMX1RZUEUgPSA3MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RlkgU3RhcnQgRGF0ZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRGWVN0YXJ0RGF0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRllfU1RBUlRfREFURV9UWVBFID0gNzI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkdyb3VwIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0R3JvdXBUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdST1VQX1RZUEUgPSA3MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfQUREUkVTU19UWVBFID0gNzQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua0FkZHJlc3NUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfQUREUkVTU19UWVBFMSA9IDc1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX0FERFJFU1NfVFlQRTIgPSA3NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUgPSA3NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTEgPSA3ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUyPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTIgPSA3OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfVFlQRSA9IDgwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5IeXBlcmxpbmsgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rVHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX1RZUEUxID0gODE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkh5cGVybGluayBUeXBlMjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtUeXBlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfVFlQRTIgPSA4MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SW5pdGlhbHMgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRJbml0aWFsc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU5JVElBTFNfVFlQRSA9IDgzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5MYWcgRm9ybWF0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldExhZ0Zvcm1hdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTEFHX0ZPUk1BVF9UWVBFID0gODQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRSA9IDg1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRTEgPSA4NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TWFuYWdlciBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE1hbmFnZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1BTkFHRVJfVFlQRSA9IDg3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5NYXRlcmlhbCBMYWJlbCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE1hdGVyaWFsTGFiZWxUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1BVEVSSUFMX0xBQkVMX1RZUEUgPSA4ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE5hbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5BTUVfVFlQRSA9IDg5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5OYW1lIFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE5hbWVUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOQU1FX1RZUEUxID0gOTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk5hbWUgVHlwZTI8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TmFtZVR5cGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5BTUVfVFlQRTIgPSA5MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TmFtZSBUeXBlMzwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXROYW1lVHlwZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTkFNRV9UWVBFMyA9IDkyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5OZXcgVGFzayBTdGFydCBEYXRlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE5ld1Rhc2tTdGFydERhdGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5FV19UQVNLX1NUQVJUX0RBVEVfVFlQRSA9IDkzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5OVCBBY2NvdW50IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TlRBY2NvdW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOVF9BQ0NPVU5UX1RZUEUgPSA5NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+T3V0bGluZSBOdW1iZXIgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRPdXRsaW5lTnVtYmVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVVRMSU5FX05VTUJFUl9UWVBFID0gOTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRSA9IDk2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRTEgPSA5NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UGhvbmV0aWMgQWxpYXMgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRQaG9uZXRpY0FsaWFzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQSE9ORVRJQ19BTElBU19UWVBFID0gOTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlBob25ldGljcyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFBob25ldGljc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEhPTkVUSUNTX1RZUEUgPSA5OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UHJlZml4IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UHJlZml4VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkVGSVhfVFlQRSA9IDEwMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UmF0ZSBUYWJsZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRSYXRlVGFibGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJBVEVfVEFCTEVfVFlQRSA9IDEwMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Um9sbHVwIFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Um9sbHVwVHlwZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MTFVQX1RZUEVfVFlQRSA9IDEwMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFID0gMTAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRTEgPSAxMDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlN1YmplY3QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRTdWJqZWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVUJKRUNUX1RZUEUgPSAxMDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlN1YnByb2plY3QgTmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFN1YnByb2plY3ROYW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVUJQUk9KRUNUX05BTUVfVFlQRSA9IDEwNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VGl0bGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUaXRsZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVElUTEVfVFlQRSA9IDEwNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUeXBlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFX1RZUEUgPSAxMDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlR5cGUgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFR5cGVUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFX1RZUEUxID0gMTA5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UeXBlIFR5cGUyPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUeXBlVHlwZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFlQRV9UWVBFMiA9IDExMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHlwZSBUeXBlMzwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VHlwZVR5cGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRZUEVfVFlQRTMgPSAxMTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlR5cGUgVHlwZTQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFR5cGVUeXBlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFX1RZUEU0ID0gMTEyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UeXBlIFR5cGU1PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUeXBlVHlwZTUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFlQRV9UWVBFNSA9IDExMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VUlEIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VUlEVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVSURfVFlQRSA9IDExNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VW5pdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRVbml0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVTklUX1RZUEUgPSAxMTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFZhbHVlbGlzdFNvcnRPcmRlclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFMVUVMSVNUX1NPUlRfT1JERVJfVFlQRSA9IDExNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+V2VlayBTdGFydCBEYXkgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V2Vla1N0YXJ0RGF5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXRUVLX1NUQVJUX0RBWV9UWVBFID0gMTE3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Xb3JrIENvbnRvdXIgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V29ya0NvbnRvdXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfQ09OVE9VUl9UWVBFID0gMTE4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Xb3JrIEZvcm1hdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRXb3JrRm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX0ZPUk1BVF9UWVBFID0gMTE5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Xb3JrIEdyb3VwIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdvcmtHcm91cFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19HUk9VUF9UWVBFID0gMTIwOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQgPGVtPkFzc2lnbm1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXNzaWdubWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXNzaWdubWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VGFza1VJRCA8ZW0+VGFzayBVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXNrIFVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUYXNrVUlEKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Rhc2tVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc291cmNlVUlEIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVzb3VyY2VVSUQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVzb3VyY2VVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1BlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsQ29zdCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxGaW5pc2ggPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgRmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxGaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxTdGFydCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbFdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFDV1AoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNDb25maXJtZWQgPGVtPkNvbmZpcm1lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbmZpcm1lZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0NvbmZpcm1lZCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Db25maXJtZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3QoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFJhdGVUYWJsZSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RSYXRlVGFibGUoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdFJhdGVUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDViA8ZW0+Q1Y8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DVjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDVigpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9DVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RGVsYXkgPGVtPkRlbGF5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVsYXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RGVsYXkoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfRGVsYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9GaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaFZhcmlhbmNlIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfRmluaXNoVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGluaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IeXBlcmxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IeXBlcmxpbmtBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IeXBlcmxpbmtTdWJBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IYXNGaXhlZFJhdGVVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzRml4ZWRNYXRlcmlhbCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9GaXhlZE1hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsaW5nIERlbGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheUZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaW5rZWQgRmllbGRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0xpbmtlZEZpZWxkcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc01pbGVzdG9uZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9NaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE5vdGVzKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X05vdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc092ZXJhbGxvY2F0ZWQgPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVyYWxsb2NhdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzT3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9PdmVyYWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9PdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZWd1bGFyV29yaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZWd1bGFyV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ0Nvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1Jlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXNwb25zZVBlbmRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdG9wIDxlbT5TdG9wPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RvcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdG9wKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0b3AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc3VtZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXN1bWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0VmFyaWFuY2UgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnRWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9TdGFydFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vbml0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Vbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNVcGRhdGVOZWVkZWQgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VcGRhdGUgTmVlZGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzVXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1VwZGF0ZU5lZWRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VkFDIDxlbT5WQUM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WQUM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VkFDKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1ZBQygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29yaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrQ29udG91ciA8ZW0+V29yayBDb250b3VyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yayBDb250b3VyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtDb250b3VyKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1dvcmtDb250b3VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0JDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJvb2tpbmcgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCb29raW5nVHlwZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Cb29raW5nVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzaWdubWVudF9FeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2VsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJhc2VsaW5lKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50X0Jhc2VsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzaWdubWVudF9UaW1lcGhhc2VkRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXNzaWdubWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBc3NpZ25tZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHMjZ2V0QXNzaWdubWVudCA8ZW0+QXNzaWdubWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXNzaWdubWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHMjZ2V0QXNzaWdubWVudCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFzc2lnbm1lbnRzX0Fzc2lnbm1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZUZyb20gPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXZhaWxhYmxlIEZyb208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVGcm9tKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVGcm9tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVRvIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdmFpbGFibGUgVG88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVUbygpCi0JICogQHNlZSAjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlVG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVW5pdHMgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kcyNnZXRBdmFpbGFiaWxpdHlQZXJpb2QgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHMjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RzX0F2YWlsYWJpbGl0eVBlcmlvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCYXNlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJhc2VsaW5lX1RpbWVwaGFzZWREYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OdW1iZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldE51bWJlcigpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX051bWJlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzSW50ZXJpbSA8ZW0+SW50ZXJpbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkludGVyaW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzSW50ZXJpbSgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX0ludGVyaW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0U3RhcnQoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRGaW5pc2goKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9GaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0RHVyYXRpb24oKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9EdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0VzdGltYXRlZER1cmF0aW9uIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9Fc3RpbWF0ZWREdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldFdvcmsgPGVtPldvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRXb3JrKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dTPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfQkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIgPGVtPkJhc2VsaW5lMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CYXNlbGluZTI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QmFzZWxpbmUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TnVtYmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0TnVtYmVyKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9OdW1iZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRXb3JrKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0Q29zdCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1MoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUyX0JDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9CQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyA8ZW0+QmFzZWxpbmUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJhc2VsaW5lMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCYXNlbGluZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCYXNlbGluZTNfVGltZXBoYXNlZERhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OdW1iZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXROdW1iZXIoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX051bWJlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lM19TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFdvcmsgPGVtPldvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0V29yaygpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRDb3N0IDxlbT5Db3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldENvc3QoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0Nvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lM19CQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciA8ZW0+Q2FsZW5kYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2FsZW5kYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDYWxlbmRhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRVSUQoKQotCSAqIEBzZWUgI2dldENhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENhbGVuZGFyX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgQmFzZSBDYWxlbmRhcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjaXNJc0Jhc2VDYWxlbmRhcigpCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENhbGVuZGFyX0lzQmFzZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0QmFzZUNhbGVuZGFyVUlEIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJhc2UgQ2FsZW5kYXIgVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRCYXNlQ2FsZW5kYXJVSUQoKQotCSAqIEBzZWUgI2dldENhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9CYXNlQ2FsZW5kYXJVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRXZWVrRGF5cyA8ZW0+V2VlayBEYXlzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V2VlayBEYXlzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRXZWVrRGF5cygpCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENhbGVuZGFyX1dlZWtEYXlzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycyA8ZW0+Q2FsZW5kYXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNhbGVuZGFyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDYWxlbmRhcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycyNnZXRDYWxlbmRhciA8ZW0+Q2FsZW5kYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNhbGVuZGFyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnMjZ2V0Q2FsZW5kYXIoKQotCSAqIEBzZWUgI2dldENhbGVuZGFycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q2FsZW5kYXJzX0NhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERvY3VtZW50Um9vdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWl4ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRNaXhlZCgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREb2N1bWVudFJvb3RfTWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFhTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAc2VlICNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRQcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFByb2plY3QoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZpZWxkSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9GaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGROYW1lKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRmllbGROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWxpYXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEFsaWFzKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQWxpYXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUGhvbmV0aWNBbGlhcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFJvbGx1cFR5cGUgPGVtPlJvbGx1cCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um9sbHVwIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFJvbGx1cFR5cGUoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9Sb2xsdXBUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Q2FsY3VsYXRpb25UeXBlIDxlbT5DYWxjdWxhdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Q2FsY3VsYXRpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQ2FsY3VsYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Rm9ybXVsYSA8ZW0+Rm9ybXVsYTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZvcm11bGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZvcm11bGEoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9Gb3JtdWxhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNSZXN0cmljdFZhbHVlcyA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUmVzdHJpY3RWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlbGlzdFNvcnRPcmRlcigpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX1ZhbHVlbGlzdFNvcnRPcmRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0FwcGVuZE5ld1ZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldERlZmF1bHQgPGVtPkRlZmF1bHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXREZWZhdWx0KCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRGVmYXVsdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlTGlzdCA8ZW0+VmFsdWUgTGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlZhbHVlIExpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlTGlzdCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEV4dGVuZGVkQXR0cmlidXRlX1ZhbHVlTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRVSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfRmllbGRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlMl9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VmFsdWVJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfVmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX0R1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEV4dGVuZGVkQXR0cmlidXRlMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFVJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRGaWVsZElEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19GaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWUgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZUlEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19WYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfRHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0IDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldEZpZWxkSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X0ZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZSBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1ZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9EdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlcyNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlcyNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZXNfRXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayA8ZW0+TWFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZXZlbCgpCi0JICogQHNlZSAjZ2V0TWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWFza19MZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0TWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWFza19UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxlbmd0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZW5ndGgoKQotCSAqIEBzZWUgI2dldE1hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1hc2tfTGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcGFyYXRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRTZXBhcmF0b3IoKQotCSAqIEBzZWUgI2dldE1hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1hc2tfU2VwYXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzIDxlbT5NYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1hc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrcyNnZXRNYXNrIDxlbT5NYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrcyNnZXRNYXNrKCkKLQkgKiBAc2VlICNnZXRNYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWFza3NfTWFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE91dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0ZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZE5hbWUoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9GaWVsZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRBbGlhcyA8ZW0+QWxpYXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbGlhczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0QWxpYXMoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9BbGlhcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFBob25ldGljQWxpYXMgPGVtPlBob25ldGljIEFsaWFzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9QaG9uZXRpY0FsaWFzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0VmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5WYWx1ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFZhbHVlcygpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE91dGxpbmVDb2RlX1ZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzRW50ZXJwcmlzZSA8ZW0+RW50ZXJwcmlzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVudGVycHJpc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0VudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyA8ZW0+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzTGVhZk9ubHkgPGVtPkxlYWYgT25seTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxlYWYgT25seTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNMZWFmT25seSgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0xlYWZPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNBbGxMZXZlbHNSZXF1aXJlZCA8ZW0+QWxsIExldmVscyBSZXF1aXJlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9BbGxMZXZlbHNSZXF1aXJlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRNYXNrcyA8ZW0+TWFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0TWFza3MoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRPdXRsaW5lQ29kZV9NYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIgPGVtPk91dGxpbmUgQ29kZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRsaW5lQ29kZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRVSUQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUyX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfRmllbGRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VmFsdWVJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfVmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMgPGVtPk91dGxpbmUgQ29kZTM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRsaW5lQ29kZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRVSUQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUzX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTNfRmllbGRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VmFsdWVJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTNfVmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRsaW5lQ29kZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlcyNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlcyNnZXRPdXRsaW5lQ29kZSgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRPdXRsaW5lQ29kZXNfT3V0bGluZUNvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJlZGVjZXNzb3JMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldFByZWRlY2Vzc29yVUlEIDxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRQcmVkZWNlc3NvclVJRCgpCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfUHJlZGVjZXNzb3JVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0IDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19Dcm9zc1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSA8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfQ3Jvc3NQcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMaW5rTGFnIDxlbT5MaW5rIExhZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxpbmsgTGFnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGlua0xhZygpCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfTGlua0xhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMYWdGb3JtYXQgPGVtPkxhZyBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYWcgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGFnRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19MYWdGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRVSUQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRpdGxlIDxlbT5UaXRsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRpdGxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRpdGxlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1RpdGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdWJqZWN0IDxlbT5TdWJqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3ViamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdWJqZWN0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1N1YmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhdGVnb3J5KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDb21wYW55IDxlbT5Db21wYW55PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tcGFueTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDb21wYW55KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NvbXBhbnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1hbmFnZXIgPGVtPk1hbmFnZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYW5hZ2VyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1hbmFnZXIoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTWFuYWdlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXV0aG9yIDxlbT5BdXRob3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRob3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXV0aG9yKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dGhvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXZpc2lvbiA8ZW0+UmV2aXNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXZpc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXZpc2lvbigpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9SZXZpc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TGFzdFNhdmVkIDxlbT5MYXN0IFNhdmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFzdCBTYXZlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRMYXN0U2F2ZWQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTGFzdFNhdmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NjaGVkdWxlRnJvbVN0YXJ0IDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NjaGVkdWxlRnJvbVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXJ0RGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RmluaXNoRGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9GaW5pc2hEYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRGWVN0YXJ0RGF0ZSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZZIFN0YXJ0IERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RllTdGFydERhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRllTdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyaXRpY2FsU2xhY2tMaW1pdCA8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDcml0aWNhbFNsYWNrTGltaXQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQ3JpdGljYWxTbGFja0xpbWl0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeURpZ2l0cyA8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5RGlnaXRzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbmN5RGlnaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbCA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5U3ltYm9sKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbmN5U3ltYm9sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uIDxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFyVUlEKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NhbGVuZGFyVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0U3RhcnRUaW1lIDxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFN0YXJ0VGltZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0U3RhcnRUaW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0RmluaXNoVGltZSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgRmluaXNoIFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdEZpbmlzaFRpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJEYXkgPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNaW51dGVzUGVyRGF5KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01pbnV0ZXNQZXJEYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJXZWVrIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWludXRlcyBQZXIgV2VlazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNaW51dGVzUGVyV2VlaygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9NaW51dGVzUGVyV2VlaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGF5c1Blck1vbnRoIDxlbT5EYXlzIFBlciBNb250aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRheXMgUGVyIE1vbnRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERheXNQZXJNb250aCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EYXlzUGVyTW9udGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrVHlwZSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFRhc2tUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSA8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdE92ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V29ya0Zvcm1hdCA8ZW0+V29yayBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXb3JrRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1dvcmtGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cyA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9FZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0hvbm9yQ29uc3RyYWludHMgPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0hvbm9yQ29uc3RyYWludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEVhcm5lZFZhbHVlTWV0aG9kIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9FYXJuZWRWYWx1ZU1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9JbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X011bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VmZm9ydERyaXZlbiA8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tzRWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRXN0aW1hdGVkIDxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tzRXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcyA8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRBY3R1YWxDb3N0IDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NwcmVhZEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkUGVyY2VudENvbXBsZXRlIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1Rhc2tVcGRhdGVzUmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0Zpc2NhbFllYXJTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V2Vla1N0YXJ0RGF5IDxlbT5XZWVrIFN0YXJ0IERheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldlZWsgU3RhcnQgRGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdlZWtTdGFydERheSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9XZWVrU3RhcnREYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGF0dXNEYXRlIDxlbT5TdGF0dXMgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXR1cyBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXR1c0RhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfU3RhdHVzRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVudERhdGUgPGVtPkN1cnJlbnQgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkN1cnJlbnQgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW50RGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW50RGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIDxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvbGluayA8ZW0+QXV0b2xpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRvbGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9saW5rKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dG9saW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROZXdUYXNrU3RhcnREYXRlIDxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROZXdUYXNrU3RhcnREYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tTdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrRVZNZXRob2QgPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrRVZNZXRob2QoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFRhc2tFVk1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Qcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUgPGVtPkV4dGVuZGVkIENyZWF0aW9uIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQ3JlYXRpb25EYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0V4dGVuZGVkQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FjdHVhbHNJblN5bmMgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQWN0dWFsc0luU3luYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNSZW1vdmVGaWxlUHJvcGVydGllcyA8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9SZW1vdmVGaWxlUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBZG1pblByb2plY3QgPGVtPkFkbWluIFByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BZG1pbiBQcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0FkbWluUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0T3V0bGluZUNvZGVzIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRPdXRsaW5lQ29kZXMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2plY3RfT3V0bGluZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V0JTIE1hc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdCU01hc2tzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9qZWN0X1dCU01hc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvamVjdF9FeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFycyA8ZW0+Q2FsZW5kYXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2FsZW5kYXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFycygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvamVjdF9DYWxlbmRhcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRhc2tzIDxlbT5UYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlRhc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRhc2tzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9qZWN0X1Rhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJlc291cmNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXNvdXJjZXMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2plY3RfUmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Bc3NpZ25tZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBc3NpZ25tZW50cygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvamVjdF9Bc3NpZ25tZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlIDxlbT5SYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzRnJvbSA8ZW0+UmF0ZXMgRnJvbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhdGVzIEZyb208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZXNGcm9tKCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1JhdGVzRnJvbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZXNUbyA8ZW0+UmF0ZXMgVG88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SYXRlcyBUbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc1RvKCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1JhdGVzVG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVUYWJsZSA8ZW0+UmF0ZSBUYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhdGUgVGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZVRhYmxlKCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1JhdGVUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfU3RhbmRhcmRSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0T3ZlcnRpbWVSYXRlIDxlbT5PdmVydGltZSBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfT3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdCBQZXIgVXNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldENvc3RQZXJVc2UoKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfQ29zdFBlclVzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlcyA8ZW0+UmF0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSYXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXMjZ2V0UmF0ZSA8ZW0+UmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXMjZ2V0UmF0ZSgpCi0JICogQHNlZSAjZ2V0UmF0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJhdGVzX1JhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UgPGVtPlJlc291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlc291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SUQgPGVtPklEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldElEKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIE51bGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNOdWxsKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SW5pdGlhbHMgPGVtPkluaXRpYWxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5pdGlhbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEluaXRpYWxzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSW5pdGlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQaG9uZXRpY3MgPGVtPlBob25ldGljczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBob25ldGljczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGhvbmV0aWNzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUGhvbmV0aWNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TlRBY2NvdW50IDxlbT5OVCBBY2NvdW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TlQgQWNjb3VudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TlRBY2NvdW50KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfTlRBY2NvdW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF0ZXJpYWxMYWJlbCA8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF0ZXJpYWxMYWJlbCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX01hdGVyaWFsTGFiZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb2RlIDxlbT5Db2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29kZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0NvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Hcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtHcm91cCA8ZW0+V29yayBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmsgR3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtHcm91cCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmtHcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEVtYWlsQWRkcmVzcyA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVtYWlsIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEVtYWlsQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0VtYWlsQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9IeXBlcmxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSHlwZXJsaW5rQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0h5cGVybGlua1N1YkFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXhVbml0cyA8ZW0+TWF4IFVuaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWF4IFVuaXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXhVbml0cygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX01heFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVha1VuaXRzIDxlbT5QZWFrIFVuaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVhayBVbml0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUGVha1VuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmxlRnJvbSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdmFpbGFibGUgRnJvbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0F2YWlsYWJsZUZyb20oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXZhaWxhYmxlIFRvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVUbygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0F2YWlsYWJsZVRvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0RmluaXNoKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNDYW5MZXZlbCA8ZW0+Q2FuIExldmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FuIExldmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0NhbkxldmVsKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ2FuTGV2ZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY2NydWVBdCA8ZW0+QWNjcnVlIEF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWNjcnVlIEF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY2NydWVBdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjY3J1ZUF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZWd1bGFyV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1JlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YW5kYXJkIFJhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1N0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfU3RhbmRhcmRSYXRlRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlIDxlbT5PdmVydGltZSBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfT3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGVGb3JtYXQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZVJhdGVGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0UGVyVXNlIDxlbT5Db3N0IFBlciBVc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0IFBlciBVc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3RQZXJVc2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0UGVyVXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsQ29zdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Xb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0IFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTViA8ZW0+U1Y8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TVjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U1YoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENWIDxlbT5DVjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNWPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDVigpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0NWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFDV1AoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9DYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROb3RlcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX05vdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1MoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9CQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1AoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9CQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0dlbmVyaWMgPGVtPklzIEdlbmVyaWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBHZW5lcmljPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzR2VuZXJpYygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0lzR2VuZXJpYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNJbmFjdGl2ZSA8ZW0+SXMgSW5hY3RpdmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBJbmFjdGl2ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSXNJbmFjdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNFbnRlcnByaXNlIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc0VudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Qm9va2luZyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCb29raW5nVHlwZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0Jvb2tpbmdUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdGl2ZURpcmVjdG9yeUdVSUQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3RpdmVEaXJlY3RvcnlHVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfRXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJhc2VsaW5lKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfQmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9PdXRsaW5lQ29kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9BdmFpbGFiaWxpdHlQZXJpb2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmF0ZXMgPGVtPlJhdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJhdGVzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfUmF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VGltZXBoYXNlZERhdGEoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9UaW1lcGhhc2VkRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXNvdXJjZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXMjZ2V0UmVzb3VyY2UgPGVtPlJlc291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzI2dldFJlc291cmNlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlc19SZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFVJRCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldElEIDxlbT5JRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldElEKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBOdWxsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNOdWxsKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lzTnVsbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q3JlYXRlRGF0ZSA8ZW0+Q3JlYXRlIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DcmVhdGUgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDcmVhdGVEYXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NyZWF0ZURhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnRhY3QgPGVtPkNvbnRhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db250YWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnRhY3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQ29udGFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTIDxlbT5XQlM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5XQlM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1dCUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTTGV2ZWwgPGVtPldCUyBMZXZlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldCUyBMZXZlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXQlNMZXZlbCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19XQlNMZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZU51bWJlciA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdXRsaW5lIE51bWJlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lTnVtYmVyKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX091dGxpbmVOdW1iZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVMZXZlbCA8ZW0+T3V0bGluZSBMZXZlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk91dGxpbmUgTGV2ZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZUxldmVsKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX091dGxpbmVMZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJpb3JpdHkgPGVtPlByaW9yaXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJpb3JpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJpb3JpdHkoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUHJpb3JpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2goKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19EdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19EdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29yaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdG9wIDxlbT5TdG9wPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RvcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdG9wKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N0b3AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlc3VtZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZXN1bWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVzdW1lVmFsaWQgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3VtZSBWYWxpZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1Jlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1Jlc3VtZVZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VmZm9ydERyaXZlbiA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVmZm9ydCBEcml2ZW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JlY3VycmluZyA8ZW0+UmVjdXJyaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVjdXJyaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVjdXJyaW5nKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1JlY3VycmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19PdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VzdGltYXRlZCA8ZW0+RXN0aW1hdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXN0aW1hdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0VzdGltYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc01pbGVzdG9uZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19NaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzU3VtbWFyeSA8ZW0+U3VtbWFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN1bW1hcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNTdW1tYXJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N1bW1hcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzQ3JpdGljYWwgPGVtPkNyaXRpY2FsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JpdGljYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNDcml0aWNhbCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Dcml0aWNhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3QgPGVtPklzIFN1YnByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBTdWJwcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lzU3VicHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3RSZWFkT25seSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lzU3VicHJvamVjdFJlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdWJwcm9qZWN0TmFtZSA8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN1YnByb2plY3ROYW1lKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N1YnByb2plY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0V4dGVybmFsVGFzayA8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIFRhc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRXh0ZXJuYWxUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0IDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19FeHRlcm5hbFRhc2tQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseVN0YXJ0IDxlbT5FYXJseSBTdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVhcmx5IFN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcmx5U3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRWFybHlTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybHlGaW5pc2ggPGVtPkVhcmx5IEZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVhcmx5IEZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseUZpbmlzaCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19FYXJseUZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGF0ZVN0YXJ0IDxlbT5MYXRlIFN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGF0ZSBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMYXRlU3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTGF0ZVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMYXRlRmluaXNoIDxlbT5MYXRlIEZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhdGUgRmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVGaW5pc2goKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTGF0ZUZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydCBWYXJpYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N0YXJ0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpbmlzaFZhcmlhbmNlIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RmluaXNoVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRmluaXNoVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1dvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RnJlZVNsYWNrIDxlbT5GcmVlIFNsYWNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RnJlZSBTbGFjazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGcmVlU2xhY2soKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRnJlZVNsYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUb3RhbFNsYWNrIDxlbT5Ub3RhbCBTbGFjazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvdGFsIFNsYWNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFRvdGFsU2xhY2soKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfVG90YWxTbGFjaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0IDxlbT5GaXhlZCBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Rml4ZWQgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRml4ZWRDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3RBY2NydWFsIDxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19GaXhlZENvc3RBY2NydWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50Q29tcGxldGUgPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19QZXJjZW50Q29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdmVydGltZVdvcmsgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19PdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFN0YXJ0IDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgU3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBGaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbEZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRHVyYXRpb24gPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxEdXJhdGlvbigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxEdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWd1bGFyIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVndWxhcldvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0R1cmF0aW9uIDxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nRHVyYXRpb24oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nRHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QUNXUDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWIDxlbT5DVjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNWPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb25zdHJhaW50VHlwZSA8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnRUeXBlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnN0cmFpbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NhbGVuZGFyVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb25zdHJhaW50RGF0ZSA8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnREYXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnN0cmFpbnREYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREZWFkbGluZSA8ZW0+RGVhZGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWFkbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREZWFkbGluZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19EZWFkbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbEFzc2lnbm1lbnRzIDxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbEFzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsaW5nQ2FuU3BsaXQgPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTGV2ZWxpbmdDYW5TcGxpdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGV2ZWxpbmdEZWxheSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbGluZyBEZWxheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsaW5nRGVsYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExldmVsaW5nRGVsYXlGb3JtYXQgPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsaW5nRGVsYXlGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZUxldmVsZWRTdGFydCA8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkU3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUHJlTGV2ZWxlZFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkRmluaXNoIDxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19QcmVMZXZlbGVkRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSHlwZXJsaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSHlwZXJsaW5rQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5vdGVzKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX05vdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0hpZGVCYXIgPGVtPkhpZGUgQmFyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGlkZSBCYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNIaWRlQmFyKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0hpZGVCYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUm9sbHVwIDxlbT5Sb2xsdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Sb2xsdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSb2xsdXAoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUm9sbHVwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0JDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1AoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUgPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1BoeXNpY2FsUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRWFybmVkVmFsdWVNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlZGVjZXNzb3JMaW5rIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZWRlY2Vzc29yTGluaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19QcmVkZWNlc3NvckxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX0V4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QmFzZWxpbmUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfQmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZUNvZGUgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX091dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19UaW1lcGhhc2VkRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrcyA8ZW0+VGFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFza3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3MjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3MjZ2V0VGFzaygpCi0JICogQHNlZSAjZ2V0VGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tzX1Rhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRpbWVQZXJpb2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kI2dldEZyb21EYXRlIDxlbT5Gcm9tIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Gcm9tIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0RnJvbURhdGUoKQotCSAqIEBzZWUgI2dldFRpbWVQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVQZXJpb2RfRnJvbURhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kI2dldFRvRGF0ZSA8ZW0+VG8gRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0VG9EYXRlKCkKLQkgKiBAc2VlICNnZXRUaW1lUGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lUGVyaW9kX1RvRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUgPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRpbWVwaGFzZWREYXRhVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRVSUQoKQotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVuaXQgPGVtPlVuaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vbml0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VW5pdCgpCi0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWUgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlSUQoKQotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRWYWx1ZV9WYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0UGFyZW50VmFsdWVJRCA8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRQYXJlbnRWYWx1ZUlEKCkKLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWVfUGFyZW50VmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWVfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyIDxlbT5WYWx1ZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VmFsdWUyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFZhbHVlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXRJRCA8ZW0+SUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldElEKCkKLQkgKiBAc2VlICNnZXRWYWx1ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlMl9JRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRWYWx1ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlMl9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRWYWx1ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlMl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3QgPGVtPlZhbHVlIExpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VmFsdWUgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWYWx1ZUxpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3QjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFZhbHVlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VmFsdWVMaXN0X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcyA8ZW0+VmFsdWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlZhbHVlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcyNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMjZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWVzX0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFZhbHVlc19WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrIDxlbT5XQlMgTWFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V0JTTWFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGV2ZWwgPGVtPkxldmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGV2ZWwoKQotCSAqIEBzZWUgI2dldFdCU01hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdCU01hc2tfTGV2ZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFdCU01hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdCU01hc2tfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZW5ndGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGVuZ3RoKCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX0xlbmd0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0U2VwYXJhdG9yIDxlbT5TZXBhcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXBhcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX1NlcGFyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldCUyBNYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdCU01hc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI2dldFdCU01hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19WZXJpZnlVbmlxdWVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzR2VuZXJhdGVDb2RlcyA8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V0JTTWFza3NfR2VuZXJhdGVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlZml4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNnZXRQcmVmaXgoKQotCSAqIEBzZWUgI2dldFdCU01hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19QcmVmaXgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFdCU01hc2sgPGVtPldCUyBNYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjZ2V0V0JTTWFzaygpCi0JICogQHNlZSAjZ2V0V0JTTWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdCU01hc2tzX1dCU01hc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSA8ZW0+V2VlayBEYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V2VlayBEYXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdlZWtEYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldERheVR5cGUgPGVtPkRheSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0RGF5VHlwZSgpCi0JICogQHNlZSAjZ2V0V2Vla0RheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2Vla0RheV9EYXlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNpc0RheVdvcmtpbmcgPGVtPkRheSBXb3JraW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF5IFdvcmtpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjaXNEYXlXb3JraW5nKCkKLQkgKiBAc2VlICNnZXRXZWVrRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWVrRGF5X0RheVdvcmtpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0VGltZVBlcmlvZCgpCi0JICogQHNlZSAjZ2V0V2Vla0RheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2Vla0RheV9UaW1lUGVyaW9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXRXb3JraW5nVGltZXMgPGVtPldvcmtpbmcgVGltZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFdvcmtpbmdUaW1lcygpCi0JICogQHNlZSAjZ2V0V2Vla0RheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2Vla0RheV9Xb3JraW5nVGltZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXMgPGVtPldlZWsgRGF5czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XZWVrIERheXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXZWVrRGF5cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXMjZ2V0V2Vla0RheSA8ZW0+V2VlayBEYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldlZWsgRGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5cyNnZXRXZWVrRGF5KCkKLQkgKiBAc2VlICNnZXRXZWVrRGF5cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2Vla0RheXNfV2Vla0RheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmtpbmcgVGltZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtpbmdUaW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0RnJvbVRpbWUgPGVtPkZyb20gVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZyb20gVGltZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0RnJvbVRpbWUoKQotCSAqIEBzZWUgI2dldFdvcmtpbmdUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JraW5nVGltZV9Gcm9tVGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldFRvVGltZSA8ZW0+VG8gVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvIFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldFRvVGltZSgpCi0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtpbmdUaW1lX1RvVGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXMgPGVtPldvcmtpbmcgVGltZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29ya2luZyBUaW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JraW5nVGltZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lcyNnZXRXb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Xb3JraW5nIFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lcyNnZXRXb3JraW5nVGltZSgpCi0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JraW5nVGltZXNfV29ya2luZ1RpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+QWNjcnVlIEF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5BY2NydWUgQXQ8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQWNjcnVlQXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QWNjcnVlQXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FjdGl2ZURpcmVjdG9yeUdVSURfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPScxNiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5BbGlhcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5BbGlhcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBbGlhc18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUwJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRBbGlhc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5BdXRob3IgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+QXV0aG9yIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0F1dGhvcl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QXV0aG9yVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdCYXNlbGluZUZvckVhcm5lZFZhbHVlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyA0IDUgNiA3IDggOSAxMCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+Qm9va2luZyBUeXBlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkJvb2tpbmcgVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Jvb2tpbmdUeXBlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRCb29raW5nVHlwZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+Qm9va2luZyBUeXBlIFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Cb29raW5nIFR5cGUgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQm9va2luZ1R5cGVfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRCb29raW5nVHlwZVR5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkNhbGN1bGF0aW9uIFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q2FsY3VsYXRpb24gVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NhbGN1bGF0aW9uVHlwZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDYWxjdWxhdGlvblR5cGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+Q2F0ZWdvcnkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q2F0ZWdvcnkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ2F0ZWdvcnlfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldENhdGVnb3J5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkNvZGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29kZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb2RlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDb2RlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkNvbXBhbnkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29tcGFueSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb21wYW55Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDb21wYW55VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Db25zdHJhaW50IFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29uc3RyYWludCBUeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29uc3RyYWludFR5cGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQgNSA2IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldENvbnN0cmFpbnRUeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkNvbnRhY3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29udGFjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb250YWN0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDb250YWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Db3N0IFJhdGUgVGFibGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29zdCBSYXRlIFRhYmxlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29zdFJhdGVUYWJsZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Q29zdFJhdGVUYWJsZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0N1cnJlbmN5U3ltYm9sUG9zaXRpb25fLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkN1cnJlbmN5IFN5bWJvbCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ3VycmVuY3lTeW1ib2xfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPScyMCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Q3VycmVuY3lTeW1ib2xUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkRheSBUeXBlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkRheSBUeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGF5VHlwZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCA1IDYgNyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RGF5VHlwZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVmYXVsdFRhc2tFVk1ldGhvZF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RGVmYXVsdCBUYXNrIFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RGVmYXVsdCBUYXNrIFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWZhdWx0VGFza1R5cGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RGVmYXVsdFRhc2tUeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRHVyYXRpb25Gb3JtYXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRHVyYXRpb25Gb3JtYXRfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEdXJhdGlvbkZvcm1hdF8uXzJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUzPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0R1cmF0aW9uRm9ybWF0Xy5fM18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldER1cmF0aW9uRm9ybWF0VHlwZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTQ8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRHVyYXRpb25Gb3JtYXRfLl80Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEdXJhdGlvbkZvcm1hdF8uXzVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGU1KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Vhcm5lZFZhbHVlTWV0aG9kXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFYXJuZWRWYWx1ZU1ldGhvZF8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEVhcm5lZFZhbHVlTWV0aG9kVHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5FbWFpbCBBZGRyZXNzIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkVtYWlsIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRW1haWxBZGRyZXNzXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFbWFpbEFkZHJlc3NUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFeHRlcm5hbFRhc2tQcm9qZWN0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5GaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRml4ZWRDb3N0QWNjcnVhbF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBlbnVtZXJhdGlvbj0nMSAyIDMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEZpeGVkQ29zdEFjY3J1YWxUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkZZIFN0YXJ0IERhdGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RlkgU3RhcnQgRGF0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0ZZU3RhcnREYXRlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEZZU3RhcnREYXRlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkdyb3VwIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkdyb3VwIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0dyb3VwXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRHcm91cFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtBZGRyZXNzXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rQWRkcmVzc18uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua0FkZHJlc3NUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rQWRkcmVzc18uXzJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua0FkZHJlc3NUeXBlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rU3ViQWRkcmVzc18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rU3ViQWRkcmVzc18uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUyPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtTdWJBZGRyZXNzXy5fMl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SHlwZXJsaW5rIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rXy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBUeXBlMjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rXy5fMl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5Jbml0aWFscyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Jbml0aWFscyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdJbml0aWFsc18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SW5pdGlhbHNUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkxhZyBGb3JtYXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TGFnIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0xhZ0Zvcm1hdF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldExhZ0Zvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0xldmVsaW5nRGVsYXlGb3JtYXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdMZXZlbGluZ0RlbGF5Rm9ybWF0Xy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk1hbmFnZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TWFuYWdlciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNYW5hZ2VyXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRNYW5hZ2VyVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk1hdGVyaWFsIExhYmVsIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk1hdGVyaWFsIExhYmVsIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01hdGVyaWFsTGFiZWxfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE1hdGVyaWFsTGFiZWxUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TmFtZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OYW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05hbWVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE5hbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TmFtZSBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TmFtZSBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTmFtZV8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE5hbWVUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk5hbWUgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk5hbWUgVHlwZTI8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05hbWVfLl8yXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXROYW1lVHlwZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5OYW1lIFR5cGUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OYW1lIFR5cGUzPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdOYW1lXy5fM18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzI1NSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TmFtZVR5cGUzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05ld1Rhc2tTdGFydERhdGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE5ld1Rhc2tTdGFydERhdGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TlQgQWNjb3VudCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OVCBBY2NvdW50IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05UQWNjb3VudF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TlRBY2NvdW50VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk91dGxpbmUgTnVtYmVyIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk91dGxpbmUgTnVtYmVyIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J091dGxpbmVOdW1iZXJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE91dGxpbmVOdW1iZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nT3ZlcnRpbWVSYXRlRm9ybWF0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J092ZXJ0aW1lUmF0ZUZvcm1hdF8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyA0IDUgNyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5QaG9uZXRpYyBBbGlhcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5QaG9uZXRpYyBBbGlhcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQaG9uZXRpY0FsaWFzXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTAnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFBob25ldGljQWxpYXNUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+UGhvbmV0aWNzIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlBob25ldGljcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQaG9uZXRpY3NfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFBob25ldGljc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5QcmVmaXggVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UHJlZml4IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ByZWZpeF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUwJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRQcmVmaXhUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlJhdGUgVGFibGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UmF0ZSBUYWJsZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JhdGVUYWJsZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0UmF0ZVRhYmxlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Sb2xsdXAgVHlwZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Sb2xsdXAgVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGx1cFR5cGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQgNSA2IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFJvbGx1cFR5cGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nU3RhbmRhcmRSYXRlRm9ybWF0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1N0YW5kYXJkUmF0ZUZvcm1hdF8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyA0IDUgNyA4JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlN1YmplY3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U3ViamVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdTdWJqZWN0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTdWJqZWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlN1YnByb2plY3QgTmFtZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5TdWJwcm9qZWN0IE5hbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nU3VicHJvamVjdE5hbWVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFN1YnByb2plY3ROYW1lVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlRpdGxlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlRpdGxlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1RpdGxlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUaXRsZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VHlwZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVHlwZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5UeXBlIFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UeXBlIFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1R5cGVfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VHlwZVR5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlR5cGUgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlR5cGUgVHlwZTI8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVHlwZV8uXzJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VHlwZSBUeXBlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VHlwZSBUeXBlMzwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUeXBlXy5fM18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDQ4IDQ5IDUwIDUxIDUyIDUzIDU0IDU1IDU2IDU3IDU4IDU5IDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3IDY4IDY5IDcwIDcxIDcyIDczIDc0IDc1IDc2JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VHlwZSBUeXBlNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VHlwZSBUeXBlNDwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUeXBlXy5fNF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VHlwZVR5cGU0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlR5cGUgVHlwZTU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlR5cGUgVHlwZTU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVHlwZV8uXzVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZTUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5VSUQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VUlEIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1VJRF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzE2JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRVSURUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlVuaXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VW5pdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1VuaXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDUgOCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VW5pdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdWYWx1ZWxpc3RTb3J0T3JkZXJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFZhbHVlbGlzdFNvcnRPcmRlclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+V2VlayBTdGFydCBEYXkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+V2VlayBTdGFydCBEYXkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXZWVrU3RhcnREYXlfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQgNSA2JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXZWVrU3RhcnREYXlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPldvcmsgQ29udG91ciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Xb3JrIENvbnRvdXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrQ29udG91cl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCA1IDYgNyA4JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXb3JrQ29udG91clR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+V29yayBGb3JtYXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+V29yayBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrRm9ybWF0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXb3JrRm9ybWF0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Xb3JrIEdyb3VwIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPldvcmsgR3JvdXAgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrR3JvdXBfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXb3JrR3JvdXBUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNc3Byb2plY3RGYWN0b3J5IGdldE1zcHJvamVjdEZhY3RvcnkoKTsKLQotfSAvL01zcHJvamVjdFBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkZTZmODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZS5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRsaW5lIENvZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFBob25ldGljQWxpYXMgPGVtPlBob25ldGljIEFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFZhbHVlcyA8ZW0+VmFsdWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzRW50ZXJwcmlzZSA8ZW0+RW50ZXJwcmlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyA8ZW0+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzTGVhZk9ubHkgPGVtPkxlYWYgT25seTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRNYXNrcyA8ZW0+TWFza3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nT3V0bGluZUNvZGVfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3V0bGluZUNvZGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ29yZXNwb25kcyB0byB0aGUgZmllbGQgbnVtYmVyIG9mIG91dGxpbmUgY29kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0ZpZWxkSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGRJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfRmllbGROYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpZWxkTmFtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWVsZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWxpYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbGlhcyBvZiB0aGUgY3VzdG9tIG91dGxpbmUgY29kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWxpYXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsaWFzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9BbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBbGlhcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBbGlhcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRBbGlhcyA8ZW0+QWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWxpYXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBob25ldGljIEFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGhvbmV0aWMgcHJvbnVuY2lhdGlvbiBvZiB0aGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQaG9uZXRpY0FsaWFzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9QaG9uZXRpY0FsaWFzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Bob25ldGljQWxpYXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGhvbmV0aWNBbGlhcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBob25ldGljQWxpYXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlcyBvZiB0aGUgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3V0bGluZSBjb2RlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZhbHVlcyhWYWx1ZXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfVmFsdWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWVzIGdldFZhbHVlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRWYWx1ZXMgPGVtPlZhbHVlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlcyhWYWx1ZXMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50ZXJwcmlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUgaXMgYW4gZW50ZXJwcmlzZSBjdXN0b20gb3V0bGluZSBjb2RlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRlcnByaXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVudGVycHJpc2UoKQotCSAqIEBzZWUgI3Vuc2V0RW50ZXJwcmlzZSgpCi0JICogQHNlZSAjc2V0RW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0VudGVycHJpc2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VudGVycHJpc2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRW50ZXJwcmlzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0VudGVycHJpc2UgPGVtPkVudGVycHJpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudGVycHJpc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RW50ZXJwcmlzZSgpCi0JICogQHNlZSAjdW5zZXRFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNpc0VudGVycHJpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVudGVycHJpc2UoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNFbnRlcnByaXNlIDxlbT5FbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEVudGVycHJpc2UoKQotCSAqIEBzZWUgI2lzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjc2V0RW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RW50ZXJwcmlzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzRW50ZXJwcmlzZSA8ZW0+RW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50ZXJwcmlzZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RW50ZXJwcmlzZSgpCi0JICogQHNlZSAjaXNFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNzZXRFbnRlcnByaXNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRFbnRlcnByaXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSByZWZlcmVuY2UgdG8gYW5vdGhlciBjdXN0b20gZmllbGQgZm9yIHdoaWNoIHRoaXMgaXMgYW4gYWxpYXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyhCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0VudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPGVtPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUgY2FuIGJlIHVzZWQgYnkgdGhlIFJlc291cmNlIFN1YnN0aXR1dGlvbiBXaXphcmQgaW4gTWljcm9zb2Z0IFByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQHNlZSAjdW5zZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI3NldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCA8ZW0+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQHNlZSAjdW5zZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQHNlZSAjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI3NldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAc2VlICNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQHNlZSAjc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxlYWYgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBvciBub3QgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGlzIG91dGxpbmUgY29kZSBmaWVsZCBtdXN0IGJlIGxlYWYgdmFsdWVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZWFmIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGVhZk9ubHkoKQotCSAqIEBzZWUgI3Vuc2V0TGVhZk9ubHkoKQotCSAqIEBzZWUgI3NldExlYWZPbmx5KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfTGVhZk9ubHkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xlYWZPbmx5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0xlYWZPbmx5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzTGVhZk9ubHkgPGVtPkxlYWYgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGVhZiBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExlYWZPbmx5KCkKLQkgKiBAc2VlICN1bnNldExlYWZPbmx5KCkKLQkgKiBAc2VlICNpc0xlYWZPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZWFmT25seShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0xlYWZPbmx5IDxlbT5MZWFmIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TGVhZk9ubHkoKQotCSAqIEBzZWUgI2lzTGVhZk9ubHkoKQotCSAqIEBzZWUgI3NldExlYWZPbmx5KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRMZWFmT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzTGVhZk9ubHkgPGVtPkxlYWYgT25seTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGVhZiBPbmx5PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRMZWFmT25seSgpCi0JICogQHNlZSAjaXNMZWFmT25seSgpCi0JICogQHNlZSAjc2V0TGVhZk9ubHkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldExlYWZPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBOZXcgY29kZXMgbXVzdCBoYXZlIGFsbCBsZXZlbHMgcHJlc2VudC4gIE5vdCBhdmFpbGFibGUgZm9yIEVudGVycHJpc2UgQ29kZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBzZWUgI3Vuc2V0QWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBzZWUgI3NldEFsbExldmVsc1JlcXVpcmVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FsbExldmVsc1JlcXVpcmVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0FsbExldmVsc1JlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzQWxsTGV2ZWxzUmVxdWlyZWQgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBzZWUgI3Vuc2V0QWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBzZWUgI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsbExldmVsc1JlcXVpcmVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzQWxsTGV2ZWxzUmVxdWlyZWQgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBzZWUgI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBzZWUgI3NldEFsbExldmVsc1JlcXVpcmVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBbGxMZXZlbHNSZXF1aXJlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzQWxsTGV2ZWxzUmVxdWlyZWQgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNpc0FsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNzZXRBbGxMZXZlbHNSZXF1aXJlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QWxsTGV2ZWxzUmVxdWlyZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdmFsdWVzIHNwZWNpZmllZCBtdXN0IGNvbWUgZnJvbSB2YWx1ZXMgdGFibGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjdW5zZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICNzZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT25seVRhYmxlVmFsdWVzQWxsb3dlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICN1bnNldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBzZWUgI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICNzZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkIDxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBzZWUgI3NldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGFibGUgb2YgZW50cmllcyB0aGF0IGRlZmluZSB0aGUgb3V0bGluZSBjb2RlIG1hc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hc2tzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNYXNrcyhNYXNrcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9NYXNrcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01hc2tzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWFza3MgZ2V0TWFza3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0TWFza3MgPGVtPk1hc2tzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hc2tzKE1hc2tzIHZhbHVlKTsKLQotfSAvLyBPdXRsaW5lQ29kZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2RlMi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2RlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ODgzZDRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGxpbmVDb2RlMi5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRsaW5lIENvZGUyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZTIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J091dGxpbmVDb2RlXy5fMV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBPdXRsaW5lQ29kZTIgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlMl9VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZmllbGQgSUQgaW4gdGhlIGxvY2FsaXNlZCBsYW5ndWFnZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGRJRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUyX0ZpZWxkSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGRJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIElEIGluIHRoZSB2YWx1ZSBsaXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBpbiB0aGUgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlMl9WYWx1ZUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLX0gLy8gT3V0bGluZUNvZGUyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1YTlhMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2RlMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogT3V0bGluZUNvZGUzLmphdmEsdiAxLjIgMjAwNi8wNC8xMSAxNToyOTo1NSBqdGhhcmlvIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZTM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlMygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nT3V0bGluZUNvZGVfLl8yXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dGxpbmVDb2RlMyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUzX1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZElEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZTNfRmllbGRJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZElEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlM19WYWx1ZUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLX0gLy8gT3V0bGluZUNvZGUzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxMGJlNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2Rlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZXMuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRsaW5lIENvZGVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZXMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J091dGxpbmVDb2Rlc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBPdXRsaW5lQ29kZXMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBpbmRpdmlkdWFsIG91dGxpbmUgY29kZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgQ29kZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZXNfT3V0bGluZUNvZGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRsaW5lQ29kZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE91dGxpbmVDb2RlKCk7Ci0KLX0gLy8gT3V0bGluZUNvZGVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUHJlZGVjZXNzb3JMaW5rLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUHJlZGVjZXNzb3JMaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyM2ZlNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ByZWRlY2Vzc29yTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJlZGVjZXNzb3JMaW5rLmphdmEsdiAxLjIgMjAwNi8wNC8xMSAxNToyOTo1NSBqdGhhcmlvIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByZWRlY2Vzc29yIExpbms8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0UHJlZGVjZXNzb3JVSUQgPGVtPlByZWRlY2Vzc29yIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjaXNDcm9zc1Byb2plY3QgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldENyb3NzUHJvamVjdE5hbWUgPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGlua0xhZyA8ZW0+TGluayBMYWc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldExhZ0Zvcm1hdCA8ZW0+TGFnIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByZWRlY2Vzc29yTGluaygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJlZGVjZXNzb3JMaW5rXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByZWRlY2Vzc29yTGluayBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwcmVkZWNlc3NvciB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlZGVjZXNzb3JVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcmVkZWNlc3NvckxpbmtfUHJlZGVjZXNzb3JVSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZWRlY2Vzc29yVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRQcmVkZWNlc3NvclVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0UHJlZGVjZXNzb3JVSUQgPGVtPlByZWRlY2Vzc29yIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlZGVjZXNzb3JVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGluayB0eXBlLiAgVmFsdWVzIGFyZSAwPUZGLCAxPUZTLCAyPVNGIGFuZCAzPVNTCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByZWRlY2Vzc29yTGlua19UeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVHlwZVR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3Jvc3MgUHJvamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgcHJlZGVjZXNzb3IgaXMgcGFydCBvZiBhbm90aGVyIHByb2plY3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI3Vuc2V0Q3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRDcm9zc1Byb2plY3QoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcmVkZWNlc3NvckxpbmtfQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcm9zc1Byb2plY3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQ3Jvc3NQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNpc0Nyb3NzUHJvamVjdCA8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI3Vuc2V0Q3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICNpc0Nyb3NzUHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3Jvc3NQcm9qZWN0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNpc0Nyb3NzUHJvamVjdCA8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI2lzQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRDcm9zc1Byb2plY3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENyb3NzUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNpc0Nyb3NzUHJvamVjdCA8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Q3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICNpc0Nyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjc2V0Q3Jvc3NQcm9qZWN0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDcm9zc1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyb3NzIFByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGV4dGVybmFsIHByZWRlY2Vzc29yIHByb2plY3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcm9zc1Byb2plY3ROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcmVkZWNlc3NvckxpbmtfQ3Jvc3NQcm9qZWN0TmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcm9zc1Byb2plY3ROYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENyb3NzUHJvamVjdE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldENyb3NzUHJvamVjdE5hbWUgPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcm9zc1Byb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcm9zc1Byb2plY3ROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaW5rIExhZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBsYWcgaW4gdGVudGhzIG9mIGEgbWludXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpbmsgTGFnPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMaW5rTGFnKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJlZGVjZXNzb3JMaW5rX0xpbmtMYWcoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xpbmtMYWcnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExpbmtMYWcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldExpbmtMYWcgPGVtPkxpbmsgTGFnPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rIExhZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGlua0xhZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGlua0xhZyhCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhZyBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGxhZyBmb3JtYXQuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhZyBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhZ0Zvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByZWRlY2Vzc29yTGlua19MYWdGb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5MYWdGb3JtYXRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMYWdGb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExhZ0Zvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGFnRm9ybWF0IDxlbT5MYWcgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYWcgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYWdGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExhZ0Zvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotfSAvLyBQcmVkZWNlc3NvckxpbmsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Qcm9qZWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlODYxOGE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Qcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvamVjdC5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRUaXRsZSA8ZW0+VGl0bGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdWJqZWN0IDxlbT5TdWJqZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q29tcGFueSA8ZW0+Q29tcGFueTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1hbmFnZXIgPGVtPk1hbmFnZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBdXRob3IgPGVtPkF1dGhvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFJldmlzaW9uIDxlbT5SZXZpc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldExhc3RTYXZlZCA8ZW0+TGFzdCBTYXZlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU2NoZWR1bGVGcm9tU3RhcnQgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZZU3RhcnREYXRlIDxlbT5GWSBTdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JpdGljYWxTbGFja0xpbWl0IDxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5RGlnaXRzIDxlbT5DdXJyZW5jeSBEaWdpdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbCA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbiA8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFydFRpbWUgPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaW5pc2hUaW1lIDxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWludXRlc1BlckRheSA8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWludXRlc1BlcldlZWsgPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREYXlzUGVyTW9udGggPGVtPkRheXMgUGVyIE1vbnRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFRhc2tUeXBlIDxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsIDxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRPdmVydGltZVJhdGUgPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXb3JrRm9ybWF0IDxlbT5Xb3JrIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cyA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNIb25vckNvbnN0cmFpbnRzIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEVhcm5lZFZhbHVlTWV0aG9kIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFZmZvcnREcml2ZW4gPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VzdGltYXRlZCA8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZEFjdHVhbENvc3QgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkUGVyY2VudENvbXBsZXRlIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzVGFza1VwZGF0ZXNSZXNvdXJjZSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNGaXNjYWxZZWFyU3RhcnQgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V2Vla1N0YXJ0RGF5IDxlbT5XZWVrIFN0YXJ0IERheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGF0dXNEYXRlIDxlbT5TdGF0dXMgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbnREYXRlIDxlbT5DdXJyZW50IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9saW5rIDxlbT5BdXRvbGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5ld1Rhc2tTdGFydERhdGUgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza0VWTWV0aG9kIDxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQ3JlYXRpb25EYXRlIDxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBY3R1YWxzSW5TeW5jIDxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBZG1pblByb2plY3QgPGVtPkFkbWluIFByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRPdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJzIDxlbT5DYWxlbmRhcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRUYXNrcyA8ZW0+VGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEFzc2lnbm1lbnRzIDxlbT5Bc3NpZ25tZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3QoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2plY3RfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVUlEVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTmFtZVR5cGUzIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaXRsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpdGxlIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaXRsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGl0bGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfVGl0bGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaXRsZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpdGxlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRpdGxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VGl0bGUgPGVtPlRpdGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UaXRsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGl0bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRpdGxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWJqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3ViamVjdCBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3ViamVjdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9TdWJqZWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuU3ViamVjdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YmplY3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3ViamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN1YmplY3QgPGVtPlN1YmplY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1YmplY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN1YmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1YmplY3QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY2F0ZWdvcnkgb2YgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXRlZ29yeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DYXRlZ29yeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhdGVnb3J5VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2F0ZWdvcnknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYXRlZ29yeSA8ZW0+Q2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2F0ZWdvcnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbXBhbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb21wYW55IHRoYXQgb3ducyB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcGFueTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29tcGFueShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Db21wYW55KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ29tcGFueVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbXBhbnknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tcGFueSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENvbXBhbnkgPGVtPkNvbXBhbnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbXBhbnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbXBhbnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbXBhbnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hbmFnZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBtYW5hZ2VyIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYW5hZ2VyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYW5hZ2VyKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X01hbmFnZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYW5hZ2VyVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWFuYWdlcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWFuYWdlciA8ZW0+TWFuYWdlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFuYWdlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFuYWdlcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0aG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYXV0aG9yIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRob3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhvcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9BdXRob3IoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdXRob3JUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdXRob3InIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXV0aG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXV0aG9yIDxlbT5BdXRob3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXV0aG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRob3IoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIHByb2plY3Qgd2FzIGNyZWF0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0aW9uRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DcmVhdGlvbkRhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcmVhdGlvbkRhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyZWF0aW9uRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV2aXNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBudW1iZXIgb2YgdGltZXMgYSBwcm9qZWN0IGhhcyBiZWVuIHNhdmVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXZpc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmV2aXNpb24oQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1JldmlzaW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXZpc2lvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UmV2aXNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXZpc2lvbiA8ZW0+UmV2aXNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJldmlzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXZpc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmV2aXNpb24oQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYXN0IFNhdmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSBwcm9qZWN0IHdhcyBsYXN0IHNhdmVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYXN0IFNhdmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYXN0U2F2ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTGFzdFNhdmVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGFzdFNhdmVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldExhc3RTYXZlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldExhc3RTYXZlZCA8ZW0+TGFzdCBTYXZlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFzdCBTYXZlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGFzdFNhdmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYXN0U2F2ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgcHJvamVjdCBpcyBzY2hkdWxlZCBmcm9tIHRoZSBzdGFydCBkYXRlIG9yIGZpbmlzaCBkYXRlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICN1bnNldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNzZXRTY2hlZHVsZUZyb21TdGFydChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfU2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NjaGVkdWxlRnJvbVN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NjaGVkdWxlRnJvbVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTY2hlZHVsZUZyb21TdGFydCA8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQHNlZSAjdW5zZXRTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQHNlZSAjaXNTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NoZWR1bGVGcm9tU3RhcnQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NjaGVkdWxlRnJvbVN0YXJ0IDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNzZXRTY2hlZHVsZUZyb21TdGFydChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U2NoZWR1bGVGcm9tU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU2NoZWR1bGVGcm9tU3RhcnQgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNzZXRTY2hlZHVsZUZyb21TdGFydChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U2NoZWR1bGVGcm9tU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBwcm9qZWN0LiBSZXF1aXJlZCBpZiBTY2hlZHVsZUZyb21TdGFydCBpcyB0cnVlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydERhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfU3RhcnREYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnREYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydERhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHByb2plY3QuIFJlcXVpcmVkIGlmIFNjaGVkdWxlRnJvbVN0YXJ0IGlzIGZhbHNlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9GaW5pc2hEYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoRGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRGaW5pc2hEYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2hEYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GWSBTdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBGaXNjYWwgWWVhciBzdGFydGluZyBtb250aC4gVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMT1KYW51YXJ5LCAyPUZlYnJ1YXJ5LCAzPU1hcmNoLCA0PUFwcmlsLCA1PU1heSwgNj1KdW5lLCA3PUp1bHksIAotCSAqIAkJCQkJCTg9QXVndXN0LCA5PVNlcHRlbWJlciwgMTA9T2N0b2JlciwgMTE9Tm92ZW1iZXIsIDEyPURlY2VtYmVyIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GWSBTdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGWVN0YXJ0RGF0ZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRllTdGFydERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5GWVN0YXJ0RGF0ZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZZU3RhcnREYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRGWVN0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZZU3RhcnREYXRlIDxlbT5GWSBTdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GWSBTdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGWVN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RllTdGFydERhdGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Dcml0aWNhbCBTbGFjayBMaW1pdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBkYXlzIHBhc3QgaXRzIGVuZCBkYXRlIHRoYXQgYSB0YXNrIGNhbiBnbyAKLQkgKiAJCQkJCQliZWZvcmUgTWljcm9zb2Z0IFByb2plY3QgbWFya3MgdGhhdCB0YXNrIGFzIGEgY3JpdGljYWwgdGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyaXRpY2FsU2xhY2tMaW1pdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ3JpdGljYWxTbGFja0xpbWl0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcml0aWNhbFNsYWNrTGltaXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldENyaXRpY2FsU2xhY2tMaW1pdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyaXRpY2FsU2xhY2tMaW1pdCA8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcml0aWNhbFNsYWNrTGltaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyaXRpY2FsU2xhY2tMaW1pdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkN1cnJlbmN5IERpZ2l0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc3ltYm9sLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW5jeSBEaWdpdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEN1cnJlbmN5RGlnaXRzKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DdXJyZW5jeURpZ2l0cygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3VycmVuY3lEaWdpdHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEN1cnJlbmN5RGlnaXRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lEaWdpdHMgPGVtPkN1cnJlbmN5IERpZ2l0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeURpZ2l0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3VycmVuY3lEaWdpdHMoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DdXJyZW5jeSBTeW1ib2w8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjdXJyZW5jeSBzeW1ib2wgdXNlZCBpbiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDdXJyZW5jeVN5bWJvbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DdXJyZW5jeVN5bWJvbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkN1cnJlbmN5U3ltYm9sVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3VycmVuY3lTeW1ib2wnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q3VycmVuY3lTeW1ib2woKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbCA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW5jeSBTeW1ib2w8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDdXJyZW5jeVN5bWJvbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbmN5IHN5bWJvbC4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9QmVmb3JlLCAxPUFmdGVyLCAyPUJlZm9yZSBXaXRoIFNwYWNlLCAzPUFmdGVyIHdpdGggc3BhY2UuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbihCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ3VycmVuY3lTeW1ib2xQb3NpdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDdXJyZW5jeVN5bWJvbFBvc2l0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbiA8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWxlbmRhciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcm9qZWN0IGNhbGVuZGFyLiAgUmVmZXJzIHRvIGEgdmFsaWQgVUlEIGluIHRoZSAKLQkgKiAJCQkJCQlDYWxlbmRhcnMgZWxlbWVudCBvZiB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ2FsZW5kYXJVSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbGVuZGFyVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBTdGFydCBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBzdGFydCB0aW1lIG9mIG5ldyB0YXNrcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0U3RhcnRUaW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRTdGFydFRpbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRTdGFydFRpbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RGVmYXVsdFN0YXJ0VGltZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFydFRpbWUgPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhcnRUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0U3RhcnRUaW1lKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IEZpbmlzaCBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBmaW5pc2ggdGltZSBvZiBuZXcgdGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgRmluaXNoIFRpbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHRGaW5pc2hUaW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRGaW5pc2hUaW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5UaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0RmluaXNoVGltZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXREZWZhdWx0RmluaXNoVGltZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaW5pc2hUaW1lIDxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0RmluaXNoVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdEZpbmlzaFRpbWUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbnV0ZXMgUGVyIERheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciBkYXkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWludXRlc1BlckRheShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTWludXRlc1BlckRheSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWludXRlc1BlckRheScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TWludXRlc1BlckRheSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJEYXkgPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNaW51dGVzUGVyRGF5KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWludXRlcyBQZXIgV2VlazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciB3ZWVrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNaW51dGVzUGVyV2VlayhCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTWludXRlc1BlcldlZWsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01pbnV0ZXNQZXJXZWVrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRNaW51dGVzUGVyV2VlaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJXZWVrIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyV2VlaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWludXRlc1BlcldlZWsoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXlzIFBlciBNb250aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBkYXlzIHBlciBtb250aC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF5cyBQZXIgTW9udGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERheXNQZXJNb250aChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGF5c1Blck1vbnRoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEYXlzUGVyTW9udGgnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldERheXNQZXJNb250aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERheXNQZXJNb250aCA8ZW0+RGF5cyBQZXIgTW9udGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRheXMgUGVyIE1vbnRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREYXlzUGVyTW9udGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERheXNQZXJNb250aChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgVGFzayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjEiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IHR5cGUgb2YgbmV3IHRhc2tzLiBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkwPUZpeGVkIFVuaXRzLCAxPUZpeGVkIER1cmF0aW9uLCAyPUZpeGVkIFdvcmsuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRUYXNrVHlwZSgpCi0JICogQHNlZSAjdW5zZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iMSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRGVmYXVsdFRhc2tUeXBlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdFRhc2tUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREZWZhdWx0VGFza1R5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza1R5cGUgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrVHlwZSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RGVmYXVsdFRhc2tUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza1R5cGUgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RGVmYXVsdFRhc2tUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgZnJvbSB3aGVyZSBmaXhlZCBjb3N0cyBhcmUgYWNjcnVlZC4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTE9U3RhcnQsIDI9UHJvcmF0ZWQsIDM9RW5kCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRGaXhlZENvc3RBY2NydWFsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsIDxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgc3RhbmRhcmQgcmF0ZSBmb3IgbmV3IHJlc291cmNlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZShmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0U3RhbmRhcmRSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZShmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0U3RhbmRhcmRSYXRlIDxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldERlZmF1bHRTdGFuZGFyZFJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0U3RhbmRhcmRSYXRlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBvdmVydGltZSByYXRlIGZvciBuZXcgcmVzb3VyY2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjdW5zZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0T3ZlcnRpbWVSYXRlKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRPdmVydGltZVJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjdW5zZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0T3ZlcnRpbWVSYXRlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRPdmVydGltZVJhdGUgPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0T3ZlcnRpbWVSYXRlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI2dldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRPdmVydGltZVJhdGUoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgCi0JICogCQkJCQkJMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCAKLQkgKiAJCQkJCQk1Mz1udWxsLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9EdXJhdGlvbkZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkR1cmF0aW9uRm9ybWF0VHlwZTUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IHdvcmsgdW5pdCBmb3JtYXQuIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29ya0Zvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfV29ya0Zvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtGb3JtYXRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRXb3JrRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V29ya0Zvcm1hdCA8ZW0+V29yayBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIG9yIG5vdCBhY3R1YWwgY29zdHMgYXJlIGVkaXRhYmxlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjdW5zZXRFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICNzZXRFZGl0YWJsZUFjdHVhbENvc3RzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9FZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWRpdGFibGVBY3R1YWxDb3N0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNFZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNFZGl0YWJsZUFjdHVhbENvc3RzIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICN1bnNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBzZWUgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWRpdGFibGVBY3R1YWxDb3N0cyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cyA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEVkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBzZWUgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjc2V0RWRpdGFibGVBY3R1YWxDb3N0cyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RWRpdGFibGVBY3R1YWxDb3N0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNFZGl0YWJsZUFjdHVhbENvc3RzIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICNzZXRFZGl0YWJsZUFjdHVhbENvc3RzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRFZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ib25vciBDb25zdHJhaW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRhc2tzIGhvbm91ciB0aGVpciBjb25zdHJhaW50IGRhdGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICN1bnNldEhvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3NldEhvbm9yQ29uc3RyYWludHMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0hvbm9yQ29uc3RyYWludHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSG9ub3JDb25zdHJhaW50cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSG9ub3JDb25zdHJhaW50cyA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEhvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3Vuc2V0SG9ub3JDb25zdHJhaW50cygpCi0JICogQHNlZSAjaXNIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIb25vckNvbnN0cmFpbnRzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNIb25vckNvbnN0cmFpbnRzIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNpc0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3NldEhvbm9yQ29uc3RyYWludHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEhvbm9yQ29uc3RyYWludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSG9ub3JDb25zdHJhaW50cyA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNpc0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3NldEhvbm9yQ29uc3RyYWludHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEhvbm9yQ29uc3RyYWludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IG1ldGhvZCBmb3IgY2FsY3VsYXRpbmcgZWFybmVkIHZhbHVlLiBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkwPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFYXJuZWRWYWx1ZU1ldGhvZChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFYXJuZWRWYWx1ZU1ldGhvZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RWFybmVkVmFsdWVNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVhcm5lZFZhbHVlTWV0aG9kKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdG8gY2FsY3VsYXRlIHN1YnRhc2tzIGFzIHN1bW1hcnkgdGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI3Vuc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5IDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI3Vuc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgbXVsdGlwbGUgY3JpdGljYWwgcGF0aHMgYXJlIGNhbGN1bGF0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE11bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjdW5zZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBzZWUgI3NldE11bHRpcGxlQ3JpdGljYWxQYXRocyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTXVsdGlwbGVDcml0aWNhbFBhdGhzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc011bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICN1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE11bHRpcGxlQ3JpdGljYWxQYXRocyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBzZWUgI2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICNzZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMgPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgbmV3IHRhc2tzIGFyZSBlZmZvcnQgZHJpdmVuLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOZXdUYXNrc0VmZm9ydERyaXZlbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFZmZvcnREcml2ZW4gPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNzZXROZXdUYXNrc0VmZm9ydERyaXZlbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0byBzaG93IHRoZSBlc3RpbWF0ZWQgZHVyYXRpb24gYnkgZGVmYXVsdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X05ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOZXdUYXNrc0VzdGltYXRlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNOZXdUYXNrc0VzdGltYXRlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFc3RpbWF0ZWQgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0TmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI2lzTmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5ld1Rhc2tzRXN0aW1hdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VzdGltYXRlZCA8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE5ld1Rhc2tzRXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRXN0aW1hdGVkIDxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE5ld1Rhc2tzRXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBpbi1wcm9ncmVzcyB0YXNrcyBjYW4gYmUgc3BsaXQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI3Vuc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI3Vuc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcGxpdHNJblByb2dyZXNzVGFza3MgPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcGxpdHNJblByb2dyZXNzVGFza3MgPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ByZWFkIEFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgYWN0dWFsIGNvc3RzIGFyZSBzcHJlYWQgdG8gdGhlIHN0YXR1cyBkYXRlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjdW5zZXRTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9TcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTcHJlYWRBY3R1YWxDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NwcmVhZEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZEFjdHVhbENvc3QgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI3Vuc2V0U3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjaXNTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRBY3R1YWxDb3N0IDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjaXNTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRTcHJlYWRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZEFjdHVhbENvc3QgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNpc1NwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI3NldFNwcmVhZEFjdHVhbENvc3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNwcmVhZEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHBlcmNlbnQgY29tcGxldGUgaXMgc3ByZWFkIHRvIHRoZSBzdGF0dXMgZGF0ZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICN1bnNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9TcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTcHJlYWRQZXJjZW50Q29tcGxldGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU3ByZWFkUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUgPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI3Vuc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUgPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI3NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSA8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI2lzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNzZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFzayBVcGRhdGVzIFJlc291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHVwZGF0ZXMgdG8gdGFza3MgdXBkYXRlIHJlc291cmNlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFRhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI3Vuc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjc2V0VGFza1VwZGF0ZXNSZXNvdXJjZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFza1VwZGF0ZXNSZXNvdXJjZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNUYXNrVXBkYXRlc1Jlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICN1bnNldFRhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFza1VwZGF0ZXNSZXNvdXJjZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzVGFza1VwZGF0ZXNSZXNvdXJjZSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFRhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjc2V0VGFza1VwZGF0ZXNSZXNvdXJjZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICNzZXRUYXNrVXBkYXRlc1Jlc291cmNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUYXNrVXBkYXRlc1Jlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaXNjYWwgWWVhciBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGZpc2NhbCB5ZWFyIG51bWJlcmluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBzZWUgI3Vuc2V0RmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNzZXRGaXNjYWxZZWFyU3RhcnQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0Zpc2NhbFllYXJTdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmlzY2FsWWVhclN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0Zpc2NhbFllYXJTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmlzY2FsIFllYXIgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICN1bnNldEZpc2NhbFllYXJTdGFydCgpCi0JICogQHNlZSAjaXNGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpc2NhbFllYXJTdGFydChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBzZWUgI2lzRmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNzZXRGaXNjYWxZZWFyU3RhcnQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEZpc2NhbFllYXJTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNGaXNjYWxZZWFyU3RhcnQgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNpc0Zpc2NhbFllYXJTdGFydCgpCi0JICogQHNlZSAjc2V0RmlzY2FsWWVhclN0YXJ0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRGaXNjYWxZZWFyU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldlZWsgU3RhcnQgRGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTdGFydCBkYXkgb2YgdGhlIHdlZWsuIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9U3VuZGF5LCAxPU1vbmRheSwgMj1UdWVzZGF5LCAzPVdlZG5lc2RheSwgND1UaHVyc2RheSwgNT1GcmlkYXksIDY9U2F0dXJkYXkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2VlayBTdGFydCBEYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdlZWtTdGFydERheShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfV2Vla1N0YXJ0RGF5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla1N0YXJ0RGF5VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2Vla1N0YXJ0RGF5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRXZWVrU3RhcnREYXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXZWVrU3RhcnREYXkgPGVtPldlZWsgU3RhcnQgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XZWVrIFN0YXJ0IERheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V2Vla1N0YXJ0RGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXZWVrU3RhcnREYXkoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkJCQkJCQlTcGVjaWZpZXMgd2hldGhlciB0aGUgZW5kIG9mIGNvbXBsZXRlZCBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gYmVnaW4gYWZ0ZXIgdGhlIAotCSAqIAkJCQkJCQlzdGF0dXMgZGF0ZSBidXQgYmVndW4gZWFybHkgc2hvdWxkIGJlIG1vdmVkIGJhY2sgdG8gdGhlIHN0YXR1cyBkYXRlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAc2VlICN1bnNldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Nb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNb3ZlQ29tcGxldGVkRW5kc0JhY2snIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2sgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzQmFjayA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI3NldE1vdmVDb21wbGV0ZWRFbmRzQmFjayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzQmFjayA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI3NldE1vdmVDb21wbGV0ZWRFbmRzQmFjayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCQkJCQkJCVNwZWNpZmllcyB3aGV0aGVyIHRoZSBiZWdpbm5pbmcgb2YgcmVtYWluaW5nIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBiZWdpbiBhZnRlciB0aGUgCi0JICogCQkJCQkJCXN0YXR1cyBkYXRlIGJ1dCBiZWd1biBlYXJseSBzaG91bGQgYmUgbW92ZWQgYmFjayB0byB0aGUgc3RhdHVzIGRhdGUuCi0JICogCQkJCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICN1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICNzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjdW5zZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICNzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJCQkJCQkJU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJlZ2lubmluZyBvZiByZW1haW5pbmcgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVndW4gbGF0ZSAKLQkgKiAJCQkJCQkJc2hvdWxkIGJlIG1vdmVkIHVwIHRvIHRoZSBzdGF0dXMgZGF0ZS4KLQkgKiAJCQkJCQkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI3Vuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI3NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Nb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICN1bnNldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICNzZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI3NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJCQkJCQkJU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVuZCBvZiBjb21wbGV0ZWQgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVlbiBjb21wbGV0ZWQgCi0JICogCQkJCQkJCWJlZm9yZSB0aGUgc3RhdHVzIGRhdGUgYnV0IGJlZ3VuIGxhdGUgc2hvdWxkIGJlIG1vdmVkIHVwIHRvIHRoZSBzdGF0dXMgZGF0ZS4KLQkgKiAJCQkJCQkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQHNlZSAjdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI3NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI3Vuc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICNzZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICNzZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNwZWNpZmljIGJhc2VsaW5lIHVzZWQgdG8gY2FsY3VsYXRlIFZhcmlhbmNlIHZhbHVlcy4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9QmFzZWxpbmUsIDE9QmFzZWxpbmUgMSwgMj1CYXNlbGluZSAyLCAzPUJhc2VsaW5lIDMsIDQ9QmFzZWxpbmUgNCwgNT1CYXNlbGluZSA1LCA2PUJhc2VsaW5lIDYsIAotCSAqIAkJCQkJCTc9QmFzZWxpbmUgNywgOD1CYXNlbGluZSA4LCA5PUJhc2VsaW5lIDksIDEwPUJhc2VsaW5lIDEwCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0Jhc2VsaW5lRm9yRWFybmVkVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgYWRkIG5ldyByZXNvdXJjZXMgdG8gdGhlIHJlc291cmNlIHBvb2wuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQHNlZSAjdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI3NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI3Vuc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAc2VlICNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQHNlZSAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI3NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAc2VlICNzZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhdHVzIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERhdGUgdXNlZCBmb3IgY2FsY3VsYXRpb24gYW5kIHJlcG9ydGluZy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhdHVzIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXR1c0RhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfU3RhdHVzRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXR1c0RhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RhdHVzRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXR1c0RhdGUgPGVtPlN0YXR1cyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGF0dXMgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhdHVzRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhdHVzRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VycmVudCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3lzdGVtIGRhdGUgdGhhdCB0aGUgWE1MIHdhcyBnZW5lcmF0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3VycmVudERhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ3VycmVudERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDdXJyZW50RGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRDdXJyZW50RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbnREYXRlIDxlbT5DdXJyZW50IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3VycmVudERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEN1cnJlbnREYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkIGJ5IGEgUHJvamVjdCBTZXJ2ZXIgdXNlciBhcyBvcHBvc2VkIHRvIGFuIE5UIHVzZXIuCi0JICogCQkJCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICNzZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9NaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICNzZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBzZWUgI2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0b2xpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdG8gYXV0b2xpbmsgaW5zZXJ0ZWQgb3IgbW92ZWQgdGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dG9saW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF1dG9saW5rKCkKLQkgKiBAc2VlICN1bnNldEF1dG9saW5rKCkKLQkgKiBAc2VlICNzZXRBdXRvbGluayhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQXV0b2xpbmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F1dG9saW5rJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0F1dG9saW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvbGluayA8ZW0+QXV0b2xpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dG9saW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF1dG9saW5rKCkKLQkgKiBAc2VlICN1bnNldEF1dG9saW5rKCkKLQkgKiBAc2VlICNpc0F1dG9saW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRvbGluayhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b2xpbmsgPGVtPkF1dG9saW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEF1dG9saW5rKCkKLQkgKiBAc2VlICNpc0F1dG9saW5rKCkKLQkgKiBAc2VlICNzZXRBdXRvbGluayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QXV0b2xpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b2xpbmsgPGVtPkF1dG9saW5rPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvbGluazwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QXV0b2xpbmsoKQotCSAqIEBzZWUgI2lzQXV0b2xpbmsoKQotCSAqIEBzZWUgI3NldEF1dG9saW5rKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBdXRvbGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgZGF0ZSBmb3IgbmV3IHRhc2tzIHN0YXJ0LiAgVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMD1Qcm9qZWN0IFN0YXJ0IERhdGUsIDE9Q3VycmVudCBEYXRlCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5ld1Rhc2tTdGFydERhdGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X05ld1Rhc2tTdGFydERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5OZXdUYXNrU3RhcnREYXRlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTmV3VGFza1N0YXJ0RGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TmV3VGFza1N0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5ld1Rhc2tTdGFydERhdGUgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5ld1Rhc2tTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5ld1Rhc2tTdGFydERhdGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBlYXJuZWQgdmFsdWUgbWV0aG9kIGZvciB0YXNrcy4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHRUYXNrRVZNZXRob2QoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRUYXNrRVZNZXRob2QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EZWZhdWx0VGFza0VWTWV0aG9kVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdFRhc2tFVk1ldGhvZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrRVZNZXRob2QgPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHRUYXNrRVZNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRUYXNrRVZNZXRob2QoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBwcm9qZWN0IFhNTCB3YXMgZWRpdGVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICN1bnNldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNzZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjdW5zZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkIDxlbT5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNzZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNzZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIENyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERhdGUgdXNlZCBmb3IgY2FsY3VsYXRpb24gYW5kIHJlcG9ydGluZy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRXh0ZW5kZWRDcmVhdGlvbkRhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlbmRlZENyZWF0aW9uRGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQ3JlYXRpb25EYXRlIDxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbHMgSW4gU3luYzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBhbGwgYWN0dWFsIHdvcmsgaGFzIGJlZW4gc3luY2hyb25pemVkIHdpdGggdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICN1bnNldEFjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI3NldEFjdHVhbHNJblN5bmMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0FjdHVhbHNJblN5bmMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbHNJblN5bmMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQWN0dWFsc0luU3luYygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWN0dWFsc0luU3luYyA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QWN0dWFsc0luU3luYygpCi0JICogQHNlZSAjdW5zZXRBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICNpc0FjdHVhbHNJblN5bmMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbHNJblN5bmMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FjdHVhbHNJblN5bmMgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICNpc0FjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI3NldEFjdHVhbHNJblN5bmMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEFjdHVhbHNJblN5bmMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWN0dWFsc0luU3luYyA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI2lzQWN0dWFsc0luU3luYygpCi0JICogQHNlZSAjc2V0QWN0dWFsc0luU3luYyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QWN0dWFsc0luU3luYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0byByZW1vdmUgYWxsIGZpbGUgcHJvcGVydGllcyBvbiBzYXZlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICN1bnNldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNzZXRSZW1vdmVGaWxlUHJvcGVydGllcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfUmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbW92ZUZpbGVQcm9wZXJ0aWVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNSZW1vdmVGaWxlUHJvcGVydGllcyA8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjdW5zZXRSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNzZXRSZW1vdmVGaWxlUHJvcGVydGllcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUmVtb3ZlRmlsZVByb3BlcnRpZXMgPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNzZXRSZW1vdmVGaWxlUHJvcGVydGllcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkbWluIFByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHByb2plY3QgaXMgYW4gYWRtaW5pc3RyYXRpdmUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRtaW4gUHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI3Vuc2V0QWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRBZG1pblByb2plY3QoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0FkbWluUHJvamVjdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWRtaW5Qcm9qZWN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0FkbWluUHJvamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWRtaW5Qcm9qZWN0IDxlbT5BZG1pbiBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZG1pbiBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFkbWluUHJvamVjdCgpCi0JICogQHNlZSAjdW5zZXRBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBZG1pblByb2plY3QoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FkbWluUHJvamVjdCA8ZW0+QWRtaW4gUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRBZG1pblByb2plY3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEFkbWluUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBZG1pblByb2plY3QgPGVtPkFkbWluIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkbWluIFByb2plY3Q8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFkbWluUHJvamVjdCgpCi0JICogQHNlZSAjaXNBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI3NldEFkbWluUHJvamVjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QWRtaW5Qcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBvdXRsaW5lIGNvZGUgZGVmaW5pdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LiAgVGhlc2UgY29kZXMgbWF5IGJlIGFzc29jaWF0ZWQgb25seSB3aXRoIHRoaXMgcHJvamVjdCwgb3IgbWF5IGJlIGNvbW1vbiBhbW9uZyBzZXZlcmFsIHByb2plY3RzIChlbnRlcnByaXNlIGNvZGVzKS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0T3V0bGluZUNvZGVzKE91dGxpbmVDb2RlcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X091dGxpbmVDb2RlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J091dGxpbmVDb2RlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGxpbmVDb2RlcyBnZXRPdXRsaW5lQ29kZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRPdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3V0bGluZUNvZGVzKE91dGxpbmVDb2RlcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XQlMgTWFza3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0YWJsZSBvZiBlbnRyaWVzIHRoYXQgZGVmaW5lIHRoZSBvdXRsaW5lIGNvZGUgbWFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V0JTIE1hc2tzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXQlNNYXNrcyhXQlNNYXNrcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1dCU01hc2tzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV0JTTWFza3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXQlNNYXNrcyBnZXRXQlNNYXNrcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdCU01hc2tzIDxlbT5XQlMgTWFza3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldCUyBNYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V0JTTWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdCU01hc2tzKFdCU01hc2tzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZSAoY3VzdG9tIGZpZWxkKSBkZWZpbml0aW9ucyAKLQkgKiAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0V4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVuZGVkQXR0cmlidXRlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVuZGVkQXR0cmlidXRlcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWxlbmRhcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGNhbGVuZGFycyB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgCi0JICogICAgICAgICBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhbGVuZGFycyhDYWxlbmRhcnMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DYWxlbmRhcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDYWxlbmRhcnMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDYWxlbmRhcnMgZ2V0Q2FsZW5kYXJzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJzIDxlbT5DYWxlbmRhcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWxlbmRhcnMoQ2FsZW5kYXJzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiB0YXNrcyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuCi0JICogICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFza3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFRhc2tzKFRhc2tzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfVGFza3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUYXNrcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2tzIGdldFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhc2tzKFRhc2tzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIHRoYXQgbWFrZSB1cCB0aGUgcHJvamVjdC4KLQkgKiAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlc291cmNlcyhSZXNvdXJjZXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9SZXNvdXJjZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXNvdXJjZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0UmVzb3VyY2VzIDxlbT5SZXNvdXJjZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZXMoUmVzb3VyY2VzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBhc3NpZ25tZW50cyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuCi0JICogICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NpZ25tZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QXNzaWdubWVudHMoQXNzaWdubWVudHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Bc3NpZ25tZW50cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Fzc2lnbm1lbnRzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXNzaWdubWVudHMgZ2V0QXNzaWdubWVudHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXNzaWdubWVudHMoQXNzaWdubWVudHMgdmFsdWUpOwotCi19IC8vIFByb2plY3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZDcxZDdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSYXRlLmphdmEsdiAxLjIgMjAwNi8wNC8xMSAxNToyOTo1NSBqdGhhcmlvIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzRnJvbSA8ZW0+UmF0ZXMgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzVG8gPGVtPlJhdGVzIFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZVRhYmxlIDxlbT5SYXRlIFRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0IDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldE92ZXJ0aW1lUmF0ZSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRDb3N0UGVyVXNlIDxlbT5Db3N0IFBlciBVc2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSYXRlXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJhdGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYXRlcyBGcm9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSByYXRlIGJlY29tZXMgZWZmZWN0aXZlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhdGVzIEZyb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJhdGVzRnJvbShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZV9SYXRlc0Zyb20oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmF0ZXNGcm9tJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJhdGVzRnJvbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzRnJvbSA8ZW0+UmF0ZXMgRnJvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZXMgRnJvbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmF0ZXNGcm9tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSYXRlc0Zyb20oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhdGVzIFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGFzdCBkYXRlIHRoYXQgdGhlIHJhdGUgaXMgZWZmZWN0aXZlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhdGVzIFRvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSYXRlc1RvKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlX1JhdGVzVG8oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmF0ZXNUbycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSYXRlc1RvKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZXNUbyA8ZW0+UmF0ZXMgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhdGVzIFRvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSYXRlc1RvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSYXRlc1RvKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYXRlIFRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJhdGUgdGFibGUgZm9yIHRoZSByZXNvdXJjZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUEsIDE9QiwgMj1DLCAzPUQsIDQ9RQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlIFRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSYXRlVGFibGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlX1JhdGVUYWJsZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVUYWJsZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JhdGVUYWJsZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UmF0ZVRhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZVRhYmxlIDxlbT5SYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlIFRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSYXRlVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJhdGVUYWJsZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YW5kYXJkIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdGFuZGFyZCByYXRlIGZvciB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwZXJpb2Qgc3BlY2lmaWVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YW5kYXJkUmF0ZShCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfU3RhbmRhcmRSYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFuZGFyZFJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFuZGFyZFJhdGUoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgc3RhbmRhcmQgcmF0ZS4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXkKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhbmRhcmRSYXRlRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZV9TdGFuZGFyZFJhdGVGb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5TdGFuZGFyZFJhdGVGb3JtYXRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFuZGFyZFJhdGVGb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFN0YW5kYXJkUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YW5kYXJkUmF0ZUZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBvdmVydGltZSByYXRlIGZvciB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwZXJpb2Qgc3BlY2lmaWVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lUmF0ZShCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfT3ZlcnRpbWVSYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldE92ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldE92ZXJ0aW1lUmF0ZSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVJhdGUoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBSYXRlIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgb3ZlcnRpbWUgcmF0ZS4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lUmF0ZUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfT3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVSYXRlRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRPdmVydGltZVJhdGVGb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVJhdGVGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0IFBlciBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb3N0IHBlciB1c2Ugb2YgdGhlIHJlc291cmNlLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBQZXIgVXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0UGVyVXNlKEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZV9Db3N0UGVyVXNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0UGVyVXNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRDb3N0UGVyVXNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFBlciBVc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3RQZXJVc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3RQZXJVc2UoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLX0gLy8gUmF0ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1JhdGVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmF0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmZmZjJjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmF0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmF0ZXMuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SYXRlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzI2dldFJhdGUgPGVtPlJhdGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmF0ZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmF0ZXMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZpbml0aW9uIG9mIGEgdGltZSBwZXJpb2QsIGFuZCB0aGUgcmF0ZXMgYXBwbGljYWJsZSBmb3IgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzb3VyY2UgZHVyaW5nIHRoYXQgcGVyaW9kLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVzX1JhdGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHVwcGVyPSIyNSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFJhdGUoKTsKLQotfSAvLyBSYXRlcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODQ2NTM3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyODYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXNvdXJjZS5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRJRCA8ZW0+SUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEluaXRpYWxzIDxlbT5Jbml0aWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQaG9uZXRpY3MgPGVtPlBob25ldGljczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROVEFjY291bnQgPGVtPk5UIEFjY291bnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF0ZXJpYWxMYWJlbCA8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29kZSA8ZW0+Q29kZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29ya0dyb3VwIDxlbT5Xb3JrIEdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEVtYWlsQWRkcmVzcyA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF4VW5pdHMgPGVtPk1heCBVbml0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZWFrVW5pdHMgPGVtPlBlYWsgVW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0NhbkxldmVsIDxlbT5DYW4gTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWNjcnVlQXQgPGVtPkFjY3J1ZSBBdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFNWIDxlbT5TVjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDViA8ZW0+Q1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0dlbmVyaWMgPGVtPklzIEdlbmVyaWM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlIDxlbT5JcyBJbmFjdGl2ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzRW50ZXJwcmlzZSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcyA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmF0ZXMgPGVtPlJhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmVzb3VyY2VfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2UgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcG9zaXRpb24gaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2Ugd2l0aGluIHRoZSBsaXN0IG9mIHJlc291cmNlcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9JRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldElEIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTmFtZVR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHR5cGUgb2YgcmVzb3VyY2UuIFZhbHVlcyBhcmU6IDA9TWF0ZXJpYWwsIDE9V29yawotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9UeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVHlwZVR5cGU0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBOdWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgbnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBOdWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzTnVsbCgpCi0JICogQHNlZSAjdW5zZXRJc051bGwoKQotCSAqIEBzZWUgI3NldElzTnVsbChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0lzTnVsbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNOdWxsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzTnVsbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgTnVsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc051bGwoKQotCSAqIEBzZWUgI3Vuc2V0SXNOdWxsKCkKLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNOdWxsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzTnVsbCgpCi0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBzZWUgI3NldElzTnVsbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE51bGw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzTnVsbCgpCi0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBzZWUgI3NldElzTnVsbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0aWFsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGluaXRpYWxzIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5pdGlhbHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0luaXRpYWxzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSW5pdGlhbHNUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbml0aWFscycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbml0aWFscygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRJbml0aWFscyA8ZW0+SW5pdGlhbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbml0aWFscygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5pdGlhbHMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBob25ldGljczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBob25ldGljIHNwZWxsaW5nIG9mIHRoZSByZXNvdXJjZSBuYW1lLiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdXNlIHdpdGggSmFwYW5lc2Ugb25seS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaG9uZXRpY3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBob25ldGljcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUGhvbmV0aWNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUGhvbmV0aWNzVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGhvbmV0aWNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBob25ldGljcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQaG9uZXRpY3MgPGVtPlBob25ldGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGhvbmV0aWNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBob25ldGljcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TlQgQWNjb3VudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIE5UIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OVCBBY2NvdW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROVEFjY291bnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX05UQWNjb3VudCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk5UQWNjb3VudFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05UQWNjb3VudCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROVEFjY291bnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TlRBY2NvdW50IDxlbT5OVCBBY2NvdW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OVCBBY2NvdW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROVEFjY291bnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5UQWNjb3VudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWF0ZXJpYWwgTGFiZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBtYXRlcmlhbCByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWF0ZXJpYWxMYWJlbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfTWF0ZXJpYWxMYWJlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hdGVyaWFsTGFiZWxUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYXRlcmlhbExhYmVsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1hdGVyaWFsTGFiZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF0ZXJpYWxMYWJlbCA8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hdGVyaWFsIExhYmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXRlcmlhbExhYmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXRlcmlhbExhYmVsKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29kZSBvciBvdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29kZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ29kZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNvZGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb2RlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvZGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29kZSA8ZW0+Q29kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29kZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBncm91cCB0byB3aGljaCB0aGUgcmVzb3VyY2UgYmVsb25ncy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0R3JvdXAoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0dyb3VwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuR3JvdXBUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdHcm91cCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3JvdXAoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgR3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIHdvcmtncm91cCB0byB3aGljaCB0aGUgcmVzb3VyY2UgYmVsb25ncy4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPURlZmF1bHQsIDE9Tm9uZSwgMj1FbWFpbCwgMz1XZWIKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIEdyb3VwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrR3JvdXAoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Xb3JrR3JvdXAoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JrR3JvdXBUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrR3JvdXAnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFdvcmtHcm91cCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrR3JvdXAgPGVtPldvcmsgR3JvdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgR3JvdXA8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmtHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya0dyb3VwKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW1haWwgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVtYWlsIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVtYWlsQWRkcmVzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfRW1haWxBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRW1haWxBZGRyZXNzVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRW1haWxBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVtYWlsQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRFbWFpbEFkZHJlc3MgPGVtPkVtYWlsIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVtYWlsIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVtYWlsQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RW1haWxBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0h5cGVybGluaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua1R5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9IeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rQWRkcmVzc1R5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmtBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkb2N1bWVudCBib29rbWFyayBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9IeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGlua1N1YkFkZHJlc3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rU3ViQWRkcmVzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWF4IFVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjEuMCI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXRzIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXggVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI3NldE1heFVuaXRzKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX01heFVuaXRzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iMS4wIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYXhVbml0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldE1heFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE1heFVuaXRzIDxlbT5NYXggVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1heCBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNYXhVbml0cygpCi0JICogQHNlZSAjdW5zZXRNYXhVbml0cygpCi0JICogQHNlZSAjZ2V0TWF4VW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1heFVuaXRzKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXhVbml0cyA8ZW0+TWF4IFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1heFVuaXRzKCkKLQkgKiBAc2VlICNnZXRNYXhVbml0cygpCi0JICogQHNlZSAjc2V0TWF4VW5pdHMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNYXhVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE1heFVuaXRzIDxlbT5NYXggVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1heCBVbml0czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI2dldE1heFVuaXRzKCkKLQkgKiBAc2VlICNzZXRNYXhVbml0cyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1heFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZWFrIFVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGFyZ2VzdCBudW1iZXIgb2YgdW5pdHMgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGF0IGFueSB0aW1lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlYWsgVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICN1bnNldFBlYWtVbml0cygpCi0JICogQHNlZSAjc2V0UGVha1VuaXRzKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1BlYWtVbml0cygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BlYWtVbml0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldFBlYWtVbml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZWFrVW5pdHMgPGVtPlBlYWsgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlYWsgVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICN1bnNldFBlYWtVbml0cygpCi0JICogQHNlZSAjZ2V0UGVha1VuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZWFrVW5pdHMoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBlYWtVbml0cyA8ZW0+UGVhayBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRQZWFrVW5pdHMoKQotCSAqIEBzZWUgI2dldFBlYWtVbml0cygpCi0JICogQHNlZSAjc2V0UGVha1VuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UGVha1VuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVha1VuaXRzIDxlbT5QZWFrIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZWFrIFVuaXRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRQZWFrVW5pdHMoKQotCSAqIEBzZWUgI2dldFBlYWtVbml0cygpCi0JICogQHNlZSAjc2V0UGVha1VuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UGVha1VuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVyIEFsbG9jYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgcmVzb3VyY2UgaXMgb3ZlcmFsbG9jYXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICN1bnNldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdmVyQWxsb2NhdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVyQWxsb2NhdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc092ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjdW5zZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE92ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRPdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdmFpbGFibGUgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZpcnN0IGRhdGUgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdmFpbGFibGVGcm9tKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BdmFpbGFibGVGcm9tKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmxlRnJvbScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBdmFpbGFibGVGcm9tKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJsZUZyb20gPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgRnJvbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXZhaWxhYmxlRnJvbShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGFzdCBkYXRlIHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIFRvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdmFpbGFibGVUbyhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQXZhaWxhYmxlVG8oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdmFpbGFibGVUbycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBdmFpbGFibGVUbygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgVG88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFibGVUbyhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FuIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSByZXNvdXJjZSBjYW4gYmUgbGV2ZWxlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYW4gTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q2FuTGV2ZWwoKQotCSAqIEBzZWUgI3Vuc2V0Q2FuTGV2ZWwoKQotCSAqIEBzZWUgI3NldENhbkxldmVsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ2FuTGV2ZWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbkxldmVsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0NhbkxldmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzQ2FuTGV2ZWwgPGVtPkNhbiBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FuIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENhbkxldmVsKCkKLQkgKiBAc2VlICN1bnNldENhbkxldmVsKCkKLQkgKiBAc2VlICNpc0NhbkxldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYW5MZXZlbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0NhbkxldmVsIDxlbT5DYW4gTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q2FuTGV2ZWwoKQotCSAqIEBzZWUgI2lzQ2FuTGV2ZWwoKQotCSAqIEBzZWUgI3NldENhbkxldmVsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDYW5MZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzQ2FuTGV2ZWwgPGVtPkNhbiBMZXZlbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FuIExldmVsPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDYW5MZXZlbCgpCi0JICogQHNlZSAjaXNDYW5MZXZlbCgpCi0JICogQHNlZSAjc2V0Q2FuTGV2ZWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENhbkxldmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2NydWUgQXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEhvdyBjb3N0IGlzIGFjY3J1ZWQgYWdhaW5zdCB0aGUgcmVzb3VyY2UuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMT1TdGFydCwgMj1FbmQsIDM9UHJvcmF0ZWQKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2NydWUgQXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjY3J1ZUF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQWNjcnVlQXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BY2NydWVBdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWNjcnVlQXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEFjY3J1ZUF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjY3J1ZUF0IDxlbT5BY2NydWUgQXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY3J1ZSBBdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWNjcnVlQXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjY3J1ZUF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRvdGFsIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0V29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWd1bGFyIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVndWxhcldvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JlZ3VsYXJXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVndWxhcldvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVndWxhcldvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVndWxhcldvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdmVydGltZVdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0T3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIGFjdHVhbCB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbFdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiByZW1haW5pbmcgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ1dvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JlbWFpbmluZ1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBhY3R1YWwgb3ZlcnRpbWUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbE92ZXJ0aW1lV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiByZW1haW5pbmcgb3ZlcnRpbWUgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBlcmNlbnRhZ2Ugb2Ygd29yayBjb21wbGV0ZWQgYWNyb3NzIGFsbCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBlcmNlbnRXb3JrQ29tcGxldGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9QZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQZXJjZW50V29ya0NvbXBsZXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRQZXJjZW50V29ya0NvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHN0YW5kYXJkIHJhdGUgb2YgdGhlIHJlc291cmNlLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhbmRhcmRSYXRlKEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfU3RhbmRhcmRSYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFuZGFyZFJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFuZGFyZFJhdGUgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhbmRhcmRSYXRlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIHN0YW5kYXJkIHJhdGUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15LCA4PW1hdGVyaWFsIHJlc291cmNlIHJhdGUgKG9yIGJsYW5rIHN5bWJvbCBzcGVjaWZpZWQpCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YW5kYXJkUmF0ZUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFuZGFyZFJhdGVGb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFN0YW5kYXJkUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFuZGFyZFJhdGVGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdG90YWwgcHJvamVjdCBjb3N0IGZvciB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG92ZXJ0aW1lIHJhdGUgb2YgdGhlIHJlc291cmNlLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfT3ZlcnRpbWVSYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldE92ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIG92ZXJ0aW1lIHJhdGUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lUmF0ZUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVJhdGVGb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVJhdGVGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdG90YWwgb3ZlcnRpbWUgY29zdCBmb3IgdGhlIHJlc291cmNlIGluY2x1ZGluZyBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0cy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0T3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0IFBlciBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb3N0IHBlciB1c2Ugb2YgdGhlIHJlc291cmNlLiBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBQZXIgVXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0UGVyVXNlKEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ29zdFBlclVzZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFBlclVzZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdFBlclVzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0UGVyVXNlIDxlbT5Db3N0IFBlciBVc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgUGVyIFVzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29zdFBlclVzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29zdFBlclVzZShCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbENvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BY3R1YWxDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIHJlc291cmNlIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JlbWFpbmluZ0Nvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ0Nvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgcHJvamVjdGVkIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIHJlc291cmNlIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdPdmVydGltZUNvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBiYXNlbGluZSB3b3JrIGFuZCB0aGUgd29yayBhcyBtaW51dGVzIHggMTAwMC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Xb3JrVmFyaWFuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrVmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRXb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya1ZhcmlhbmNlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYmFzZWxpbmUgY29zdCBhbmQgdGhlIGNvc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ29zdFZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0Q29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3RWYXJpYW5jZShmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDb3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDb3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFYXJuZWQgdmFsdWUgc2NoZWR1bGUgdmFyaWFuY2UsIHRocm91Z2ggdGhlIHByb2plY3Qgc3RhdHVzIGRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U1YoKQotCSAqIEBzZWUgI3Vuc2V0U1YoKQotCSAqIEBzZWUgI3NldFNWKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1NWKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU1YnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRTVigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTViA8ZW0+U1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNWPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNWKCkKLQkgKiBAc2VlICN1bnNldFNWKCkKLQkgKiBAc2VlICNnZXRTVigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U1YoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFNWIDxlbT5TVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTVigpCi0JICogQHNlZSAjZ2V0U1YoKQotCSAqIEBzZWUgI3NldFNWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTViA8ZW0+U1Y8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNWPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTVigpCi0JICogQHNlZSAjZ2V0U1YoKQotCSAqIEBzZWUgI3NldFNWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZSwgdGhyb3VnaCB0aGUgcHJvamVjdCBzdGF0dXMgZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DVjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDVigpCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ1YoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDVicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldENWKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDVihmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q1YgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICNnZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNnZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QUNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBjb3N0IG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQUNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJlc291cmNlIGNhbGVuZGFyLlJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgQ2FsZW5kYXJzIGVsZW1lbnQgb2YgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ2FsZW5kYXJVSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbGVuZGFyVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUZXh0IG5vdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vdGVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Ob3RlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOb3RlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROb3RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vdGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm90ZXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0JDV1MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dTJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBHZW5lcmljPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgZ2VuZXJpYy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBHZW5lcmljPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzR2VuZXJpYygpCi0JICogQHNlZSAjdW5zZXRJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3NldElzR2VuZXJpYyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0lzR2VuZXJpYygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNHZW5lcmljJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzR2VuZXJpYygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzR2VuZXJpYyA8ZW0+SXMgR2VuZXJpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgR2VuZXJpYzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3Vuc2V0SXNHZW5lcmljKCkKLQkgKiBAc2VlICNpc0lzR2VuZXJpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNHZW5lcmljKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNHZW5lcmljIDxlbT5JcyBHZW5lcmljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzR2VuZXJpYygpCi0JICogQHNlZSAjaXNJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3NldElzR2VuZXJpYyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNHZW5lcmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0dlbmVyaWMgPGVtPklzIEdlbmVyaWM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEdlbmVyaWM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzR2VuZXJpYygpCi0JICogQHNlZSAjaXNJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3NldElzR2VuZXJpYyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNHZW5lcmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBJbmFjdGl2ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIHNldCB0byBpbmFjdGl2ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBJbmFjdGl2ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0luYWN0aXZlKCkKLQkgKiBAc2VlICN1bnNldElzSW5hY3RpdmUoKQotCSAqIEBzZWUgI3NldElzSW5hY3RpdmUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Jc0luYWN0aXZlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc0luYWN0aXZlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzSW5hY3RpdmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlIDxlbT5JcyBJbmFjdGl2ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgSW5hY3RpdmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNJbmFjdGl2ZSgpCi0JICogQHNlZSAjdW5zZXRJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzSW5hY3RpdmUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlIDxlbT5JcyBJbmFjdGl2ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBzZWUgI3NldElzSW5hY3RpdmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzSW5hY3RpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzSW5hY3RpdmUgPGVtPklzIEluYWN0aXZlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBJbmFjdGl2ZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNJbmFjdGl2ZSgpCi0JICogQHNlZSAjaXNJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNzZXRJc0luYWN0aXZlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc0luYWN0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBFbnRlcnByaXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgYW4gRW50ZXJwcmlzZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFbnRlcnByaXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjdW5zZXRJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldElzRW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0lzRW50ZXJwcmlzZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNFbnRlcnByaXNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzRW50ZXJwcmlzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzRW50ZXJwcmlzZSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3Vuc2V0SXNFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNpc0lzRW50ZXJwcmlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNFbnRlcnByaXNlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNFbnRlcnByaXNlIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjaXNJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldElzRW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNFbnRlcnByaXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0VudGVycHJpc2UgPGVtPklzIEVudGVycHJpc2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEVudGVycHJpc2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjaXNJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldElzRW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNFbnRlcnByaXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Cb29raW5nIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgYm9va2luZyB0eXBlIG9mIHRoZSByZXNvdXJjZS4gMT1Db21taXRlZCwgMj1Qcm9wb3NlZAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJvb2tpbmcgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Qm9va2luZ1R5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Cb29raW5nVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJvb2tpbmdUeXBlVHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Jvb2tpbmdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRCb29raW5nVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Cb29raW5nIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJvb2tpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCb29raW5nVHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxXb3JrUHJvdGVjdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgQWN0aXZlIERpcmVjdG9yeSBHVUlEIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3RpdmVEaXJlY3RvcnlHVUlEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BY3RpdmVEaXJlY3RvcnlHVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdGl2ZURpcmVjdG9yeUdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZlRGlyZWN0b3J5R1VJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRpb24gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3JlYXRpb25EYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9DcmVhdGlvbkRhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcmVhdGlvbkRhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcmVhdGlvbkRhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlIEZpZWxkIElELCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0V4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVuZGVkQXR0cmlidXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJhc2VsaW5lIHZhbHVlcyBmb3IgdGhlIHJlc291cmNlcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9CYXNlbGluZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYXNlbGluZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEJhc2VsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlM30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgb2YgYW4gb3V0bGluZSBjb2RlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSBhIHBvaW50ZXIgYmFjayB0byAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRsaW5lIGNvZGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgQ29kZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdXRsaW5lQ29kZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRsaW5lQ29kZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE91dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBjb2xsZWN0aW9uIG9mIHBlcmlvZHMgZHVyaW5nIHdoaWNoIHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BdmFpbGFiaWxpdHlQZXJpb2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmlsaXR5UGVyaW9kcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUF2YWlsYWJpbGl0eVBlcmlvZHMgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBjb2xsZWN0aW9uIG9mIHBlcmlvZHMgYW5kIHRoZSByYXRlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBvbmUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJhdGVzKFJhdGVzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JhdGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmF0ZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSYXRlcyBnZXRSYXRlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSYXRlcyA8ZW0+UmF0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhdGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSYXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmF0ZXMoUmF0ZXMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpbWUgcGhhc2VkIGRhdGEKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfVGltZXBoYXNlZERhdGEoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGltZXBoYXNlZERhdGEnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCi19IC8vIFJlc291cmNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjYWU5MWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXNvdXJjZXMuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXMjZ2V0UmVzb3VyY2UgPGVtPlJlc291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSZXNvdXJjZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHJlc291cmNlIGluIGVhY2ggUmVzb3VyY2VzIGNvbGxlY3Rpb24uCi0JICogICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VzX1Jlc291cmNlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzb3VyY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSZXNvdXJjZSgpOwotCi19IC8vIFJlc291cmNlcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Rhc2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0NTcxYzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Rhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldElEIDxlbT5JRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDcmVhdGVEYXRlIDxlbT5DcmVhdGUgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnRhY3QgPGVtPkNvbnRhY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXQlMgPGVtPldCUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdCU0xldmVsIDxlbT5XQlMgTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lTnVtYmVyIDxlbT5PdXRsaW5lIE51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVMZXZlbCA8ZW0+T3V0bGluZSBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByaW9yaXR5IDxlbT5Qcmlvcml0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RHVyYXRpb24gPGVtPkR1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdG9wIDxlbT5TdG9wPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVzdW1lIDxlbT5SZXN1bWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1Jlc3VtZVZhbGlkIDxlbT5SZXN1bWUgVmFsaWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VmZm9ydERyaXZlbiA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVjdXJyaW5nIDxlbT5SZWN1cnJpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFc3RpbWF0ZWQgPGVtPkVzdGltYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1N1bW1hcnkgPGVtPlN1bW1hcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0NyaXRpY2FsIDxlbT5Dcml0aWNhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0IDxlbT5JcyBTdWJwcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3RSZWFkT25seSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdWJwcm9qZWN0TmFtZSA8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFeHRlcm5hbFRhc2sgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0IDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseVN0YXJ0IDxlbT5FYXJseSBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcmx5RmluaXNoIDxlbT5FYXJseSBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMYXRlU3RhcnQgPGVtPkxhdGUgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMYXRlRmluaXNoIDxlbT5MYXRlIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0YXJ0VmFyaWFuY2UgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RmluaXNoVmFyaWFuY2UgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZyZWVTbGFjayA8ZW0+RnJlZSBTbGFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFRvdGFsU2xhY2sgPGVtPlRvdGFsIFNsYWNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0IDxlbT5GaXhlZCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGVyY2VudENvbXBsZXRlIDxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFN0YXJ0IDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxGaW5pc2ggPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxEdXJhdGlvbiA8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0R1cmF0aW9uIDxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdDb3N0IDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29uc3RyYWludFR5cGUgPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb25zdHJhaW50RGF0ZSA8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RGVhZGxpbmUgPGVtPkRlYWRsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbEFzc2lnbm1lbnRzIDxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxpbmdDYW5TcGxpdCA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGV2ZWxpbmdEZWxheSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0IDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkU3RhcnQgPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlTGV2ZWxlZEZpbmlzaCA8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhciA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNIaWRlQmFyIDxlbT5IaWRlIEJhcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUm9sbHVwIDxlbT5Sb2xsdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlIDxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybmVkVmFsdWVNZXRob2QgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVkZWNlc3NvckxpbmsgPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2soKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Rhc2tfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFzayBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcG9zaXRpb24gaWRlbnRpZmllciBvZiB0aGUgdGFzayB3aXRoaW4gdGhlIGxpc3Qgb2YgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19JRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SUQgPGVtPklEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG5hbWUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTmFtZVR5cGUyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHlwZSBvZiB0YXNrLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9Rml4ZWQgVW5pdHMsIDE9Rml4ZWQgRHVyYXRpb24sIDI9Rml4ZWQgV29yay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19UeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVHlwZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgTnVsbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHRhc2sgaXMgbnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBOdWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzTnVsbCgpCi0JICogQHNlZSAjdW5zZXRJc051bGwoKQotCSAqIEBzZWUgI3NldElzTnVsbChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfSXNOdWxsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc051bGwnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIE51bGw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNOdWxsKCkKLQkgKiBAc2VlICN1bnNldElzTnVsbCgpCi0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzTnVsbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzTnVsbCgpCi0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBzZWUgI3NldElzTnVsbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgTnVsbDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNOdWxsKCkKLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQHNlZSAjc2V0SXNOdWxsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc051bGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0ZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0YXNrIHdhcyBjcmVhdGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0ZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcmVhdGVEYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0NyZWF0ZURhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcmVhdGVEYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldENyZWF0ZURhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDcmVhdGVEYXRlIDxlbT5DcmVhdGUgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRlIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyZWF0ZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyZWF0ZURhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb250YWN0IHBlcnNvbiBmb3IgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29udGFjdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Db250YWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ29udGFjdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbnRhY3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29udGFjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnRhY3QgPGVtPkNvbnRhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbnRhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnRhY3QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldCUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSBjb2RlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldCUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V0JTKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1dCUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXQlMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0V0JTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTIDxlbT5XQlM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldCUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V0JTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXQlMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldCUyBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJpZ2h0bW9zdCBXQlMgbGV2ZWwgb2YgdGhlIHRhc2suIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldCUyBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V0JTTGV2ZWwoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfV0JTTGV2ZWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV0JTTGV2ZWwnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0V0JTTGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXQlNMZXZlbCA8ZW0+V0JTIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XQlMgTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdCU0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXQlNMZXZlbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0bGluZSBOdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBvdXRsaW5lIG51bWJlciBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRsaW5lIE51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3V0bGluZU51bWJlcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19PdXRsaW5lTnVtYmVyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZU51bWJlclR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J091dGxpbmVOdW1iZXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0T3V0bGluZU51bWJlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVOdW1iZXIgPGVtPk91dGxpbmUgTnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRsaW5lIE51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3V0bGluZU51bWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3V0bGluZU51bWJlcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0bGluZSBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG91dGxpbmUgbGV2ZWwgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0bGluZSBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3V0bGluZUxldmVsKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19PdXRsaW5lTGV2ZWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J091dGxpbmVMZXZlbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0T3V0bGluZUxldmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZUxldmVsIDxlbT5PdXRsaW5lIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRsaW5lIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPdXRsaW5lTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE91dGxpbmVMZXZlbChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByaW9yaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcHJpb3JpdHkgb2YgdGhlIHRhc2sgZnJvbSAwIHRvIDEwMDAuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpb3JpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByaW9yaXR5KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Qcmlvcml0eSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJpb3JpdHknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFByaW9yaXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJpb3JpdHkgPGVtPlByaW9yaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcmlvcml0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJpb3JpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByaW9yaXR5KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfU3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0ZpbmlzaCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwbGFubmVkIGR1cmF0aW9uIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREdXJhdGlvbihPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19EdXJhdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RHVyYXRpb24gPGVtPkR1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIER1cmF0aW9uIG9mIHRoZSBUYXNrLiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19EdXJhdGlvbkZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkR1cmF0aW9uRm9ybWF0VHlwZTQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBzY2hlZHVsZWQgd29yayBmb3IgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Xb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29yayA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RvcDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgdGFzayB3YXMgc3RvcHBlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdG9wPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdG9wKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1N0b3AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdG9wJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0b3AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdG9wIDxlbT5TdG9wPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdG9wPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdG9wKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN1bWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgcmVzdW1lZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlc3VtZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19SZXN1bWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXN1bWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVzdW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVzdW1lIDxlbT5SZXN1bWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVzdW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXN1bWUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3VtZSBWYWxpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBjYW4gYmUgcmVzdW1lZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bWUgVmFsaWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVzdW1lVmFsaWQoKQotCSAqIEBzZWUgI3Vuc2V0UmVzdW1lVmFsaWQoKQotCSAqIEBzZWUgI3NldFJlc3VtZVZhbGlkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19SZXN1bWVWYWxpZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzdW1lVmFsaWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUmVzdW1lVmFsaWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1Jlc3VtZVZhbGlkIDxlbT5SZXN1bWUgVmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VtZSBWYWxpZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjdW5zZXRSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjaXNSZXN1bWVWYWxpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzdW1lVmFsaWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1Jlc3VtZVZhbGlkIDxlbT5SZXN1bWUgVmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UmVzdW1lVmFsaWQoKQotCSAqIEBzZWUgI2lzUmVzdW1lVmFsaWQoKQotCSAqIEBzZWUgI3NldFJlc3VtZVZhbGlkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZXN1bWVWYWxpZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZXN1bWVWYWxpZCA8ZW0+UmVzdW1lIFZhbGlkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bWUgVmFsaWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICNpc1Jlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICNzZXRSZXN1bWVWYWxpZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVzdW1lVmFsaWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVmZm9ydCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgZWZmb3J0LWRyaXZlbi4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FZmZvcnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVmZm9ydERyaXZlbigpCi0JICogQHNlZSAjdW5zZXRFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI3NldEVmZm9ydERyaXZlbihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRWZmb3J0RHJpdmVuKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFZmZvcnREcml2ZW4nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFZmZvcnREcml2ZW4gPGVtPkVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVmZm9ydCBEcml2ZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICN1bnNldEVmZm9ydERyaXZlbigpCi0JICogQHNlZSAjaXNFZmZvcnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVmZm9ydERyaXZlbihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRWZmb3J0RHJpdmVuIDxlbT5FZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEVmZm9ydERyaXZlbigpCi0JICogQHNlZSAjaXNFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI3NldEVmZm9ydERyaXZlbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VmZm9ydERyaXZlbiA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWZmb3J0IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNpc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjc2V0RWZmb3J0RHJpdmVuKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRFZmZvcnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlY3VycmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBhIHJlY3VycmluZyB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlY3VycmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZWN1cnJpbmcoKQotCSAqIEBzZWUgI3Vuc2V0UmVjdXJyaW5nKCkKLQkgKiBAc2VlICNzZXRSZWN1cnJpbmcoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JlY3VycmluZygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVjdXJyaW5nJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1JlY3VycmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVjdXJyaW5nIDxlbT5SZWN1cnJpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlY3VycmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZWN1cnJpbmcoKQotCSAqIEBzZWUgI3Vuc2V0UmVjdXJyaW5nKCkKLQkgKiBAc2VlICNpc1JlY3VycmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVjdXJyaW5nKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZWN1cnJpbmcgPGVtPlJlY3VycmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZWN1cnJpbmcoKQotCSAqIEBzZWUgI2lzUmVjdXJyaW5nKCkKLQkgKiBAc2VlICNzZXRSZWN1cnJpbmcoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlY3VycmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZWN1cnJpbmcgPGVtPlJlY3VycmluZzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVjdXJyaW5nPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZWN1cnJpbmcoKQotCSAqIEBzZWUgI2lzUmVjdXJyaW5nKCkKLQkgKiBAc2VlICNzZXRSZWN1cnJpbmcoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJlY3VycmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlciBBbGxvY2F0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgb3ZlcmFsbG9jYXRlZC4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgaW5mb3JtYXRpb25hbCBvbmx5LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjc2V0T3ZlckFsbG9jYXRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfT3ZlckFsbG9jYXRlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlckFsbG9jYXRlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNPdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjdW5zZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjc2V0T3ZlckFsbG9jYXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0T3ZlckFsbG9jYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjc2V0T3ZlckFsbG9jYXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0T3ZlckFsbG9jYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGVzdGltYXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RXN0aW1hdGVkKCkKLQkgKiBAc2VlICN1bnNldEVzdGltYXRlZCgpCi0JICogQHNlZSAjc2V0RXN0aW1hdGVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Fc3RpbWF0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNFc3RpbWF0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VzdGltYXRlZCA8ZW0+RXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RXN0aW1hdGVkKCkKLQkgKiBAc2VlICN1bnNldEVzdGltYXRlZCgpCi0JICogQHNlZSAjaXNFc3RpbWF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVzdGltYXRlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXN0aW1hdGVkIDxlbT5Fc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RXN0aW1hdGVkKCkKLQkgKiBAc2VlICNpc0VzdGltYXRlZCgpCi0JICogQHNlZSAjc2V0RXN0aW1hdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRFc3RpbWF0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXN0aW1hdGVkIDxlbT5Fc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RXN0aW1hdGVkKCkKLQkgKiBAc2VlICNpc0VzdGltYXRlZCgpCi0JICogQHNlZSAjc2V0RXN0aW1hdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRFc3RpbWF0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBhIG1pbGVzdG9uZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaWxlc3RvbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICN1bnNldE1pbGVzdG9uZSgpCi0JICogQHNlZSAjc2V0TWlsZXN0b25lKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19NaWxlc3RvbmUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01pbGVzdG9uZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNNaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NaWxlc3RvbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICN1bnNldE1pbGVzdG9uZSgpCi0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1pbGVzdG9uZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNpc01pbGVzdG9uZSgpCi0JICogQHNlZSAjc2V0TWlsZXN0b25lKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNpc01pbGVzdG9uZSgpCi0JICogQHNlZSAjc2V0TWlsZXN0b25lKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1bW1hcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgYSBzdW1tYXJ5IHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VtbWFyeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTdW1tYXJ5KCkKLQkgKiBAc2VlICN1bnNldFN1bW1hcnkoKQotCSAqIEBzZWUgI3NldFN1bW1hcnkoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1N1bW1hcnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1bW1hcnknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU3VtbWFyeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzU3VtbWFyeSA8ZW0+U3VtbWFyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3VtbWFyeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTdW1tYXJ5KCkKLQkgKiBAc2VlICN1bnNldFN1bW1hcnkoKQotCSAqIEBzZWUgI2lzU3VtbWFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3VtbWFyeShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzU3VtbWFyeSA8ZW0+U3VtbWFyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTdW1tYXJ5KCkKLQkgKiBAc2VlICNpc1N1bW1hcnkoKQotCSAqIEBzZWUgI3NldFN1bW1hcnkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFN1bW1hcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzU3VtbWFyeSA8ZW0+U3VtbWFyeTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VtbWFyeTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U3VtbWFyeSgpCi0JICogQHNlZSAjaXNTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRTdW1tYXJ5KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTdW1tYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Dcml0aWNhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBpbiB0aGUgY3JpdGljYWwgY2hhaW4uCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGljYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q3JpdGljYWwoKQotCSAqIEBzZWUgI3Vuc2V0Q3JpdGljYWwoKQotCSAqIEBzZWUgI3NldENyaXRpY2FsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Dcml0aWNhbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3JpdGljYWwnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQ3JpdGljYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0NyaXRpY2FsIDxlbT5Dcml0aWNhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGljYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q3JpdGljYWwoKQotCSAqIEBzZWUgI3Vuc2V0Q3JpdGljYWwoKQotCSAqIEBzZWUgI2lzQ3JpdGljYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyaXRpY2FsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNDcml0aWNhbCA8ZW0+Q3JpdGljYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q3JpdGljYWwoKQotCSAqIEBzZWUgI2lzQ3JpdGljYWwoKQotCSAqIEBzZWUgI3NldENyaXRpY2FsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDcml0aWNhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNDcml0aWNhbCA8ZW0+Q3JpdGljYWw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyaXRpY2FsPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDcml0aWNhbCgpCi0JICogQHNlZSAjaXNDcml0aWNhbCgpCi0JICogQHNlZSAjc2V0Q3JpdGljYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENyaXRpY2FsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBTdWJwcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGFuIGluc2VydGVkIHByb2plY3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3VicHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1N1YnByb2plY3QoKQotCSAqIEBzZWUgI3Vuc2V0SXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRJc1N1YnByb2plY3QoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0lzU3VicHJvamVjdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNTdWJwcm9qZWN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzU3VicHJvamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0IDxlbT5JcyBTdWJwcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTdWJwcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3VicHJvamVjdCgpCi0JICogQHNlZSAjdW5zZXRJc1N1YnByb2plY3QoKQotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1N1YnByb2plY3QoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdCA8ZW0+SXMgU3VicHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc1N1YnByb2plY3QoKQotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRJc1N1YnByb2plY3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzU3VicHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3QgPGVtPklzIFN1YnByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFN1YnByb2plY3Q8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzU3VicHJvamVjdCgpCi0JICogQHNlZSAjaXNJc1N1YnByb2plY3QoKQotCSAqIEBzZWUgI3NldElzU3VicHJvamVjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNTdWJwcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgaW5zZXJ0ZWQgcHJvamVjdCBpcyByZWFkLW9ubHkuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBzZWUgI3Vuc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBzZWUgI3NldElzU3VicHJvamVjdFJlYWRPbmx5KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Jc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNTdWJwcm9qZWN0UmVhZE9ubHknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdFJlYWRPbmx5IDxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBzZWUgI3Vuc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzU3VicHJvamVjdFJlYWRPbmx5KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3RSZWFkT25seSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBzZWUgI3NldElzU3VicHJvamVjdFJlYWRPbmx5KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc1N1YnByb2plY3RSZWFkT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3RSZWFkT25seSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjaXNJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzU3VicHJvamVjdFJlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWJwcm9qZWN0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGluc2VydGVkIHByb2plY3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdWJwcm9qZWN0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19TdWJwcm9qZWN0TmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlN1YnByb2plY3ROYW1lVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3VicHJvamVjdE5hbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3VicHJvamVjdE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdWJwcm9qZWN0TmFtZSA8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN1YnByb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdWJwcm9qZWN0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgVGFzazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBleHRlcm5hbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBUYXNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEV4dGVybmFsVGFzaygpCi0JICogQHNlZSAjdW5zZXRFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI3NldEV4dGVybmFsVGFzayhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRXh0ZXJuYWxUYXNrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlcm5hbFRhc2snIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRXh0ZXJuYWxUYXNrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFeHRlcm5hbFRhc2sgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIFRhc2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICN1bnNldEV4dGVybmFsVGFzaygpCi0JICogQHNlZSAjaXNFeHRlcm5hbFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4dGVybmFsVGFzayhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXh0ZXJuYWxUYXNrIDxlbT5FeHRlcm5hbCBUYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEV4dGVybmFsVGFzaygpCi0JICogQHNlZSAjaXNFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI3NldEV4dGVybmFsVGFzayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RXh0ZXJuYWxUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0V4dGVybmFsVGFzayA8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICNpc0V4dGVybmFsVGFzaygpCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxUYXNrKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRFeHRlcm5hbFRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNvdXJjZSBsb2NhdGlvbiBhbmQgdGFzayBpZGVudGlmaWVyIG9mIHRoZSBleHRlcm5hbCB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxUYXNrUHJvamVjdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19FeHRlcm5hbFRhc2tQcm9qZWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVybmFsVGFza1Byb2plY3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEV4dGVybmFsVGFza1Byb2plY3QgPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlcm5hbFRhc2tQcm9qZWN0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FYXJseSBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVhcmx5IHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWFybHkgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVhcmx5U3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRWFybHlTdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Vhcmx5U3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RWFybHlTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcmx5U3RhcnQgPGVtPkVhcmx5IFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJseSBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWFybHlTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWFybHlTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWFybHkgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWFybHkgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWFybHkgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFYXJseUZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19FYXJseUZpbmlzaCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Vhcmx5RmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEVhcmx5RmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybHlGaW5pc2ggPGVtPkVhcmx5IEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWFybHkgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFYXJseUZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWFybHlGaW5pc2goT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhdGUgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBsYXRlIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGF0ZSBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGF0ZVN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0xhdGVTdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xhdGVTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRMYXRlU3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMYXRlU3RhcnQgPGVtPkxhdGUgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhdGUgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhdGVTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGF0ZVN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYXRlIEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxhdGUgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGF0ZSBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhdGVGaW5pc2goT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfTGF0ZUZpbmlzaCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xhdGVGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0TGF0ZUZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVGaW5pc2ggPGVtPkxhdGUgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYXRlIEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGF0ZUZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGF0ZUZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YXJpYW5jZSBvZiB0aGUgdGFzayBzdGFydCBkYXRlIGZyb20gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFzZWxpbmUgc3RhcnQgZGF0ZSBhcyBtaW51dGVzIHggMTAwMC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnRWYXJpYW5jZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfU3RhcnRWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnRWYXJpYW5jZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0U3RhcnRWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0YXJ0VmFyaWFuY2UgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnRWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnRWYXJpYW5jZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhcmlhbmNlIG9mIHRoZSB0YXNrIGZpbmlzaCBkYXRlIGZyb20gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFzZWxpbmUgZmluaXNoIGRhdGUgYXMgbWludXRlcyB4IDEwMDAuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2hWYXJpYW5jZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRmluaXNoVmFyaWFuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpbmlzaFZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRGaW5pc2hWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpbmlzaFZhcmlhbmNlIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaFZhcmlhbmNlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhcmlhbmNlIG9mIHRhc2sgd29yayBmcm9tIHRoZSBiYXNlbGluZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sgd29yayBhcyBtaW51dGVzIHggMTAwMC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1dvcmtWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtWYXJpYW5jZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtWYXJpYW5jZShmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0V29ya1ZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0V29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GcmVlIFNsYWNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIGZyZWUgc2xhY2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RnJlZSBTbGFjazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RnJlZVNsYWNrKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19GcmVlU2xhY2soKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZyZWVTbGFjaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RnJlZVNsYWNrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RnJlZVNsYWNrIDxlbT5GcmVlIFNsYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GcmVlIFNsYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGcmVlU2xhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZyZWVTbGFjayhCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvdGFsIFNsYWNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIHRvdGFsIHNsYWNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvdGFsIFNsYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUb3RhbFNsYWNrKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Ub3RhbFNsYWNrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUb3RhbFNsYWNrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRUb3RhbFNsYWNrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VG90YWxTbGFjayA8ZW0+VG90YWwgU2xhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRvdGFsIFNsYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUb3RhbFNsYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUb3RhbFNsYWNrKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Rml4ZWQgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZpeGVkIGNvc3Qgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Rml4ZWQgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI3Vuc2V0Rml4ZWRDb3N0KCkKLQkgKiBAc2VlICNzZXRGaXhlZENvc3QoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19GaXhlZENvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaXhlZENvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRGaXhlZENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3QgPGVtPkZpeGVkIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Rml4ZWRDb3N0KCkKLQkgKiBAc2VlICN1bnNldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjZ2V0Rml4ZWRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaXhlZENvc3QoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0IDxlbT5GaXhlZCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjZ2V0Rml4ZWRDb3N0KCkKLQkgKiBAc2VlICNzZXRGaXhlZENvc3QoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRGaXhlZENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpeGVkQ29zdCA8ZW0+Rml4ZWQgQ29zdDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Rml4ZWQgQ29zdDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Rml4ZWRDb3N0KCkKLQkgKiBAc2VlICNnZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI3NldEZpeGVkQ29zdChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEZpeGVkQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Rml4ZWQgQ29zdCBBY2NydWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBIb3cgdGhlIGZpeGVkIGNvc3QgaXMgYWNjcnVlZCBhZ2FpbnN0IHRoZSB0YXNrLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDE9U3RhcnQsIDI9UHJvcmF0ZWQgYW5kIDM9RW5kLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIENvc3QgQWNjcnVhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Rml4ZWRDb3N0QWNjcnVhbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19GaXhlZENvc3RBY2NydWFsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRml4ZWRDb3N0QWNjcnVhbFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpeGVkQ29zdEFjY3J1YWwnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpeGVkQ29zdEFjY3J1YWwgPGVtPkZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaXhlZENvc3RBY2NydWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaXhlZENvc3RBY2NydWFsKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJjZW50IENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGVyY2VudGFnZSBvZiB0aGUgdGFzayBkdXJhdGlvbiBjb21wbGV0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyY2VudCBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGVyY2VudENvbXBsZXRlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19QZXJjZW50Q29tcGxldGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BlcmNlbnRDb21wbGV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGVyY2VudENvbXBsZXRlIDxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBlcmNlbnRDb21wbGV0ZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhc2sgd29yayBjb21wbGV0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19QZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQZXJjZW50V29ya0NvbXBsZXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRQZXJjZW50V29ya0NvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBlcmNlbnRXb3JrQ29tcGxldGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcHJvamVjdGVkIG9yIHNjaGVkdWxlZCBjb3N0IG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0Nvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Nvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHN1bSBvZiB0aGUgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX092ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX092ZXJ0aW1lV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJ0aW1lV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdmVydGltZVdvcmsgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0FjdHVhbFN0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsU3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxTdGFydCA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxGaW5pc2goT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxGaW5pc2goT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBEdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBkdXJhdGlvbiBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgRHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbER1cmF0aW9uKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0FjdHVhbER1cmF0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsRHVyYXRpb24nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsRHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxEdXJhdGlvbiA8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgRHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxEdXJhdGlvbihPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgY29zdCBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0QWN0dWFsQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxPdmVydGltZUNvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHdvcmsgZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0FjdHVhbFdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbFdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIG92ZXJ0aW1lIHdvcmsgZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVndWxhciBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIG5vbi1vdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWd1bGFyV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19SZWd1bGFyV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlZ3VsYXJXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlZ3VsYXJXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVndWxhcldvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBEdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiB0aW1lIHJlcXVpcmVkIHRvIGNvbXBsZXRlIHRoZSB1bmZpbmlzaGVkIHBvcnRpb24gb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIER1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdEdXJhdGlvbihPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19SZW1haW5pbmdEdXJhdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ0R1cmF0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ0R1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nRHVyYXRpb24gPGVtPlJlbWFpbmluZyBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIER1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdEdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nRHVyYXRpb24oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHByb2plY3RlZCBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ0Nvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JlbWFpbmluZ0Nvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ0Nvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdDb3N0IDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ0Nvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJlbWFpbmluZyB3b3JrIHNjaGVkdWxlZCB0byBjb21wbGV0ZSB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19SZW1haW5pbmdXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZW1haW5pbmdXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJlbWFpbmluZyBvdmVydGltZSBjb3N0IHByb2plY3RlZCB0byBmaW5pc2ggdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdPdmVydGltZUNvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIHRvIGZpbmlzaCB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ092ZXJ0aW1lV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQUNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFDV1AoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DVjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDVigpCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19DVigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NWJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0Q1YoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNnZXRDVigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q1YoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q1YgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICNnZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q1YgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DVjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25zdHJhaW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb25zdHJhaW50IG9uIHRoZSBzdGFydCBvciBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUFzIFNvb24gQXMgUG9zc2libGUsIDE9QXMgTGF0ZSBBcyBQb3NzaWJsZSwgMj1NdXN0IFN0YXJ0IE9uLCAzPU11c3QgRmluaXNoIE9uLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ9U3RhcnQgTm8gRWFybGllciBUaGFuLCA1PVN0YXJ0IE5vIExhdGVyIFRoYW4sIDY9RmluaXNoIE5vIEVhcmxpZXIgVGhhbiBhbmQgNz1GaW5pc2ggTm8gTGF0ZXIgVGhhbgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29uc3RyYWludFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0NvbnN0cmFpbnRUeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ29uc3RyYWludFR5cGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb25zdHJhaW50VHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Q29uc3RyYWludFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb25zdHJhaW50VHlwZSA8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25zdHJhaW50IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbnN0cmFpbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb25zdHJhaW50VHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRhc2sgY2FsZW5kYXIuUmVmZXJzIHRvIGEgdmFsaWQgVUlEIGluIHRoZSBDYWxlbmRhcnMgZWxlbWVudCBvZiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FsZW5kYXJVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0NhbGVuZGFyVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDYWxlbmRhclVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Q2FsZW5kYXJVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnN0cmFpbnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgYXJndW1lbnQgZm9yIHRoZSB0YXNrIGNvbnN0cmFpbnQgdHlwZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25zdHJhaW50IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbnN0cmFpbnREYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0NvbnN0cmFpbnREYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29uc3RyYWludERhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q29uc3RyYWludERhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb25zdHJhaW50RGF0ZSA8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25zdHJhaW50IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbnN0cmFpbnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb25zdHJhaW50RGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVhZGxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWFkbGluZSBmb3IgdGhlIHRhc2sgdG8gYmUgY29tcGxldGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlYWRsaW5lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWFkbGluZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19EZWFkbGluZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlYWRsaW5lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldERlYWRsaW5lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RGVhZGxpbmUgPGVtPkRlYWRsaW5lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWFkbGluZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVhZGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlYWRsaW5lKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbCBBc3NpZ25tZW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBsZXZlbGluZyBjYW4gYWRqdXN0IGFzc2lnbm1lbnRzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExldmVsQXNzaWdubWVudHMoKQotCSAqIEBzZWUgI3Vuc2V0TGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjc2V0TGV2ZWxBc3NpZ25tZW50cyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGV2ZWxBc3NpZ25tZW50cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNMZXZlbEFzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbEFzc2lnbm1lbnRzIDxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjdW5zZXRMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICNpc0xldmVsQXNzaWdubWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsQXNzaWdubWVudHMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsQXNzaWdubWVudHMgPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExldmVsQXNzaWdubWVudHMoKQotCSAqIEBzZWUgI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjc2V0TGV2ZWxBc3NpZ25tZW50cyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TGV2ZWxBc3NpZ25tZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbEFzc2lnbm1lbnRzIDxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldExldmVsQXNzaWdubWVudHMoKQotCSAqIEBzZWUgI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjc2V0TGV2ZWxBc3NpZ25tZW50cyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TGV2ZWxBc3NpZ25tZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIGxldmVsaW5nIGNhbiBzcGxpdCB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQHNlZSAjdW5zZXRMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICNzZXRMZXZlbGluZ0NhblNwbGl0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19MZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbGluZ0NhblNwbGl0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0xldmVsaW5nQ2FuU3BsaXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsaW5nQ2FuU3BsaXQgPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI3Vuc2V0TGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQHNlZSAjaXNMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZXZlbGluZ0NhblNwbGl0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbGluZ0NhblNwbGl0IDxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQHNlZSAjaXNMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICNzZXRMZXZlbGluZ0NhblNwbGl0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRMZXZlbGluZ0NhblNwbGl0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsaW5nQ2FuU3BsaXQgPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICNpc0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI3NldExldmVsaW5nQ2FuU3BsaXQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldExldmVsaW5nQ2FuU3BsaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsaW5nIERlbGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVsYXkgY2F1c2VkIGJ5IGxldmVsaW5nIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZXZlbGluZ0RlbGF5KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19MZXZlbGluZ0RlbGF5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbGluZ0RlbGF5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMZXZlbGluZ0RlbGF5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGV2ZWxpbmdEZWxheSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZXZlbGluZ0RlbGF5KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgZGVsYXkuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfTGV2ZWxpbmdEZWxheUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGV2ZWxpbmdEZWxheUZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExldmVsaW5nRGVsYXlGb3JtYXQgPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIExldmVsZWQgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSB0YXNrIGJlZm9yZSBpdCB3YXMgbGV2ZWxlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlTGV2ZWxlZFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1ByZUxldmVsZWRTdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZUxldmVsZWRTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRQcmVMZXZlbGVkU3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkU3RhcnQgPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlTGV2ZWxlZFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVMZXZlbGVkU3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBMZXZlbGVkIEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrIGJlZm9yZSBpdCB3YXMgbGV2ZWxlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZUxldmVsZWRGaW5pc2goT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUHJlTGV2ZWxlZEZpbmlzaCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZUxldmVsZWRGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZUxldmVsZWRGaW5pc2ggPGVtPlByZSBMZXZlbGVkIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVMZXZlbGVkRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVMZXZlbGVkRmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEh5cGVybGluayhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19IeXBlcmxpbmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5IeXBlcmxpbmtUeXBlMiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSHlwZXJsaW5rJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGluaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfSHlwZXJsaW5rQWRkcmVzcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua0FkZHJlc3NUeXBlMiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSHlwZXJsaW5rQWRkcmVzcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIeXBlcmxpbmtBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkb2N1bWVudCBib29rbWFyayBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEh5cGVybGlua1N1YkFkZHJlc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfSHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua1N1YkFkZHJlc3NUeXBlMiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSHlwZXJsaW5rU3ViQWRkcmVzcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGlua1N1YkFkZHJlc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpZ25vcmVzIHRoZSByZXNvdXJjZSBjYWxlbmRhci4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQHNlZSAjdW5zZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNzZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19JZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJZ25vcmVSZXNvdXJjZUNhbGVuZGFyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIgPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3Vuc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQHNlZSAjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQHNlZSAjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNzZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIgPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3NldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUZXh0IG5vdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm90ZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfTm90ZXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTm90ZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Tm90ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vdGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm90ZXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhpZGUgQmFyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBHQU5UVCBiYXIgb2YgdGhlIHRhc2sgaXMgaGlkZGVuIHdoZW4gZGlzcGxheWVkIGluIE1pY3Jvc29mdCBQcm9qZWN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhpZGUgQmFyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEhpZGVCYXIoKQotCSAqIEBzZWUgI3Vuc2V0SGlkZUJhcigpCi0JICogQHNlZSAjc2V0SGlkZUJhcihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfSGlkZUJhcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSGlkZUJhcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNIaWRlQmFyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNIaWRlQmFyIDxlbT5IaWRlIEJhcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGlkZSBCYXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SGlkZUJhcigpCi0JICogQHNlZSAjdW5zZXRIaWRlQmFyKCkKLQkgKiBAc2VlICNpc0hpZGVCYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhpZGVCYXIoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0hpZGVCYXIgPGVtPkhpZGUgQmFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEhpZGVCYXIoKQotCSAqIEBzZWUgI2lzSGlkZUJhcigpCi0JICogQHNlZSAjc2V0SGlkZUJhcihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SGlkZUJhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNIaWRlQmFyIDxlbT5IaWRlIEJhcjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGlkZSBCYXI8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEhpZGVCYXIoKQotCSAqIEBzZWUgI2lzSGlkZUJhcigpCi0JICogQHNlZSAjc2V0SGlkZUJhcihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SGlkZUJhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sbHVwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIHJvbGxlZCB1cC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xsdXA8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Um9sbHVwKCkKLQkgKiBAc2VlICN1bnNldFJvbGx1cCgpCi0JICogQHNlZSAjc2V0Um9sbHVwKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Sb2xsdXAoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGx1cCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSb2xsdXAoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JvbGx1cCA8ZW0+Um9sbHVwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xsdXA8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Um9sbHVwKCkKLQkgKiBAc2VlICN1bnNldFJvbGx1cCgpCi0JICogQHNlZSAjaXNSb2xsdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJvbGx1cChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUm9sbHVwIDxlbT5Sb2xsdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Um9sbHVwKCkKLQkgKiBAc2VlICNpc1JvbGx1cCgpCi0JICogQHNlZSAjc2V0Um9sbHVwKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSb2xsdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUm9sbHVwIDxlbT5Sb2xsdXA8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGx1cDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Um9sbHVwKCkKLQkgKiBAc2VlICNpc1JvbGx1cCgpCi0JICogQHNlZSAjc2V0Um9sbHVwKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSb2xsdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0JDV1MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dTJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dTKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQkNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1AoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwZXJjZW50YWdlIGNvbXBsZXRlIHZhbHVlIGVudGVyZWQgYnkgdGhlIFByb2plY3QgTWFuYWdlci4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSBmb3IgY2FsY3VsYXRpbmcgQkNXUC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BoeXNpY2FsUGVyY2VudENvbXBsZXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlIDxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FYXJuZWQgVmFsdWUgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbWV0aG9kIGZvciBjYWxjdWxhdGluZyBlYXJuZWQgdmFsdWUuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1QZXJjZW50IENvbXBsZXRlLCAxPVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFYXJuZWRWYWx1ZU1ldGhvZChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FYXJuZWRWYWx1ZU1ldGhvZFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Vhcm5lZFZhbHVlTWV0aG9kJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcm5lZFZhbHVlTWV0aG9kIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWFybmVkVmFsdWVNZXRob2QoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvciBMaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3Nvckxpbmt9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVmaW5lcyB0aGUgcHJlZGVjZXNzb3IgdGFzayBvZiB0aGUgdGFzayB0aGF0IGNvbnRhaW5zIGl0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19QcmVkZWNlc3NvckxpbmsoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlZGVjZXNzb3JMaW5rJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UHJlZGVjZXNzb3JMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgd29yayBpcyBwcm90ZWN0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0FjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxXb3JrUHJvdGVjdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsV29ya1Byb3RlY3RlZChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIG92ZXJ0aW1lIHdvcmsgaXMgcHJvdGVjdGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19FeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbGxlY3Rpb24gb2YgYmFzZWxpbmUgdmFsdWVzIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2VsaW5lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQmFzZWxpbmUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYXNlbGluZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEJhc2VsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgb2YgYW4gb3V0bGluZSBjb2RlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBvdXRsaW5lIGNvZGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgQ29kZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX091dGxpbmVDb2RlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J091dGxpbmVDb2RlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0T3V0bGluZUNvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRpbWVwaGFzZWQgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aW1lIHBoYXNlZCBkYXRhIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19UaW1lcGhhc2VkRGF0YSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUaW1lcGhhc2VkRGF0YScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCk7Ci0KLX0gLy8gVGFzawpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Rhc2tzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVGFza3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDBmNjk3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVGFza3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFza3MuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGFza3NfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFza3MgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXNrPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHRhc2sgaW4gZWFjaCBUYXNrcyBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza3NfVGFzaygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFzaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRhc2soKTsKLQotfSAvLyBUYXNrcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVQZXJpb2QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UaW1lUGVyaW9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkYTc3Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVQZXJpb2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGltZVBlcmlvZC5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kI2dldEZyb21EYXRlIDxlbT5Gcm9tIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCNnZXRUb0RhdGUgPGVtPlRvIERhdGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lUGVyaW9kKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUaW1lUGVyaW9kXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRpbWVQZXJpb2QgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Gcm9tIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBiZWdpbm5pbmcgb2YgdGhlIGV4Y2VwdGlvbiB0aW1lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gcm9tIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZyb21EYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lUGVyaW9kX0Zyb21EYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRnJvbURhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RnJvbURhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCNnZXRGcm9tRGF0ZSA8ZW0+RnJvbSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Gcm9tIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZyb21EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGcm9tRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG8gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVuZCBvZiB0aGUgZXhjZXB0aW9uIHRpbWUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRvRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZVBlcmlvZF9Ub0RhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUb0RhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0VG9EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0VG9EYXRlIDxlbT5UbyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UbyBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUb0RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRvRGF0ZShPYmplY3QgdmFsdWUpOwotCi19IC8vIFRpbWVQZXJpb2QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UaW1lcGhhc2VkRGF0YVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UaW1lcGhhc2VkRGF0YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDc5NWEzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVGltZXBoYXNlZERhdGFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUaW1lcGhhc2VkRGF0YVR5cGUuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgdGltZSBwaGFzZWQgZGF0YSBibG9jay4KLSAqIAkJICAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VW5pdCA8ZW0+VW5pdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUaW1lcGhhc2VkRGF0YVR5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUaW1lcGhhc2VkRGF0YVR5cGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgdGFzayB0aW1lcGhhc2VkIGRhdGEuIFZhbHVlcyBhcmU6Ci0JICogICAgICAgICAgICAgICAgICAgICAxPUFzc2lnbm1lbnQgUmVtYWluaW5nIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDI9QXNzaWdubWVudCBBY3R1YWwgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMz1Bc3NpZ25tZW50IEFjdHVhbCBPdmVydGltZSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA0PUFzc2lnbm1lbnQgQmFzZWxpbmUgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNT1Bc3NpZ25tZW50IEJhc2VsaW5lIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDY9QXNzaWdubWVudCBBY3R1YWwgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNz1SZXNvdXJjZSBCYXNlbGluZSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA4PVJlc291cmNlIEJhc2VsaW5lIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDk9VGFzayBCYXNlbGluZSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAxMD1UYXNrIEJhc2VsaW5lIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDExPVRhc2sgUGVyY2VudCBDb21wbGV0ZQotCSAqICAgICAgICAgICAgICAgICAgICAgMTY9QXNzaWdubWVudCBCYXNlbGluZSAxIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDE3PUFzc2lnbm1lbnQgQmFzZWxpbmUgMSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAxOD1UYXNrIEJhc2VsaW5lIDEgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMTk9VGFzayBCYXNlbGluZSAxIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDIwPVJlc291cmNlIEJhc2VsaW5lIDEgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMjE9UmVzb3VyY2UgQmFzZWxpbmUgMSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAyMj1Bc3NpZ25tZW50IEJhc2VsaW5lIDIgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMjM9QXNzaWdubWVudCBCYXNlbGluZSAyIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDI0PVRhc2sgQmFzZWxpbmUgMiBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAyNT1UYXNrIEJhc2VsaW5lIDIgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMjY9UmVzb3VyY2UgQmFzZWxpbmUgMiBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAyNz1SZXNvdXJjZSBCYXNlbGluZSAyIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDI4PUFzc2lnbm1lbnQgQmFzZWxpbmUgMyBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAyOT1Bc3NpZ25tZW50IEJhc2VsaW5lIDMgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMzA9VGFzayBCYXNlbGluZSAzIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDMxPVRhc2sgQmFzZWxpbmUgMyBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAzMj1SZXNvdXJjZSBCYXNlbGluZSAzIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDMzPVJlc291cmNlIEJhc2VsaW5lIDMgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMzQ9QXNzaWdubWVudCBCYXNlbGluZSA0IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDM1PUFzc2lnbm1lbnQgQmFzZWxpbmUgNCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAzNj1UYXNrIEJhc2VsaW5lIDQgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMzc9VGFzayBCYXNlbGluZSA0IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDM4PVJlc291cmNlIEJhc2VsaW5lIDQgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMzk9UmVzb3VyY2UgQmFzZWxpbmUgNCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA0MD1Bc3NpZ25tZW50IEJhc2VsaW5lIDUgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNDE9QXNzaWdubWVudCBCYXNlbGluZSA1IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQyPVRhc2sgQmFzZWxpbmUgNSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA0Mz1UYXNrIEJhc2VsaW5lIDUgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNDQ9UmVzb3VyY2UgQmFzZWxpbmUgNSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA0NT1SZXNvdXJjZSBCYXNlbGluZSA1IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQ2PUFzc2lnbm1lbnQgQmFzZWxpbmUgNiBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA0Nz1Bc3NpZ25tZW50IEJhc2VsaW5lIDYgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNDg9VGFzayBCYXNlbGluZSA2IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQ5PVRhc2sgQmFzZWxpbmUgNiBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA1MD1SZXNvdXJjZSBCYXNlbGluZSA2IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDUxPVJlc291cmNlIEJhc2VsaW5lIDYgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNTI9QXNzaWdubWVudCBCYXNlbGluZSA3IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDUzPUFzc2lnbm1lbnQgQmFzZWxpbmUgNyBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA1ND1UYXNrIEJhc2VsaW5lIDcgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNTU9VGFzayBCYXNlbGluZSA3IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDU2PVJlc291cmNlIEJhc2VsaW5lIDcgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNTc9UmVzb3VyY2UgQmFzZWxpbmUgNyBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA1OD1Bc3NpZ25tZW50IEJhc2VsaW5lIDggV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNTk9QXNzaWdubWVudCBCYXNlbGluZSA4IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDYwPVRhc2sgQmFzZWxpbmUgOCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA2MT1UYXNrIEJhc2VsaW5lIDggQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNjI9UmVzb3VyY2UgQmFzZWxpbmUgOCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA2Mz1SZXNvdXJjZSBCYXNlbGluZSA4IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDY0PUFzc2lnbm1lbnQgQmFzZWxpbmUgOSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA2NT1Bc3NpZ25tZW50IEJhc2VsaW5lIDkgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNjY9VGFzayBCYXNlbGluZSA5IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDY3PVRhc2sgQmFzZWxpbmUgOSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA2OD1SZXNvdXJjZSBCYXNlbGluZSA5IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDY5PVJlc291cmNlIEJhc2VsaW5lIDkgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNzA9QXNzaWdubWVudCBCYXNlbGluZSAxMCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA3MT1Bc3NpZ25tZW50IEJhc2VsaW5lIDEwIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDcyPVRhc2sgQmFzZWxpbmUgMTAgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNzM9VGFzayBCYXNlbGluZSAxMCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA3ND1SZXNvdXJjZSBCYXNlbGluZSAxMCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA3NT1SZXNvdXJjZSBCYXNlbGluZSAxMCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA3Nj1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlCi0JICogICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZXBoYXNlZERhdGFUeXBlX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UeXBlVHlwZTMiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHJlY29yZC4KLQkgKiAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZXBoYXNlZERhdGFUeXBlX1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4KLQkgKiAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZXBoYXNlZERhdGFUeXBlX1N0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuCi0JICogICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZXBoYXNlZERhdGFUeXBlX0ZpbmlzaCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGltZSB1bml0IG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiAKLQkgKiAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1tLCAxPWgsIDI9ZCwgMz13LCA1PW1vLCA4PXkKLQkgKiAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVuaXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVW5pdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlVuaXRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVbml0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVbml0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRVbml0IDxlbT5Vbml0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vbml0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVbml0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBwZXIgdW5pdCBvZiB0aW1lIGZvciB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4KLQkgKiAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZXBoYXNlZERhdGFUeXBlX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBUaW1lcGhhc2VkRGF0YVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1OTZjNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWYWx1ZS5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFBhcmVudFZhbHVlSUQgPGVtPlBhcmVudCBWYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhbHVlXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbHVlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIG91dGxpbmUgY29kZSB2YWx1ZSBhY3Jvc3MgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVfVmFsdWVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJlbnQgVmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IG5vZGUgb2YgdGhlIG91dGxpbmUgY29kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJlbnRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVfUGFyZW50VmFsdWVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGFyZW50VmFsdWVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UGFyZW50VmFsdWVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRQYXJlbnRWYWx1ZUlEIDxlbT5QYXJlbnQgVmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBWYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyZW50VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFyZW50VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHZhbHVlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgZGVzY3JpcHRpb24gb2YgdGhpcyB2YWx1ZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZV9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZXNjcmlwdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBWYWx1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlMi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYmQ5MTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlMi5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0SUQgPGVtPklEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlMigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVmFsdWVfLl8xXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbHVlMiBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBVbmlxdWUgSUQgb2YgdmFsdWUgYWNyb3NzIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlMl9JRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0SUQgPGVtPklEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgdmFsdWUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWUyX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHZhbHVlIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGxpc3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWUyX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Rlc2NyaXB0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBWYWx1ZTIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZUxpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzhiZDdkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlTGlzdC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZhbHVlIExpc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3QjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVMaXN0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdWYWx1ZUxpc3RfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFsdWVMaXN0IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWVzIHRoYXQgbWFrZSB1cCB0aGUgdmFsdWUgbGlzdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZUxpc3RfVmFsdWUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VmFsdWUoKTsKLQotfSAvLyBWYWx1ZUxpc3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTMzMGMzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlcy5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdWYWx1ZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFsdWVzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVzX0dyb3VwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaW5kaXZpZHVhbCB2YWx1ZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlc19WYWx1ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyBncm91cD0nI2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRWYWx1ZSgpOwotCi19IC8vIFZhbHVlcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XQlNNYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3NWVmNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdCU01hc2suamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V0JTIE1hc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldExldmVsIDxlbT5MZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldFNlcGFyYXRvciA8ZW0+U2VwYXJhdG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFzaygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV0JTTWFza18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXQlNNYXNrIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBsZXZlbCBvZiB0aGUgbWFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExldmVsKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza19MZXZlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMZXZlbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldExldmVsIDxlbT5MZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZXZlbChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIHRoZSBub2RlIHZhbHVlLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZXMgYXJlOiAwPU51bWJlcnMsIDE9VXBwZXJjYXNlIExldHRlcnMsIDI9TG93ZXJjYXNlIExldHRlcnMsIDM9Q2hhcmFjdGVycy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tfVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlR5cGVUeXBlMiIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbWF4aW11bSBsZW5ndGggaW4gY2hhcmFjdGVycy4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIG9taXR0ZWQgd2hlbiBsZW5ndGggaXMgImFueSIuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxlbmd0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGVuZ3RoKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXQlNNYXNrX0xlbmd0aCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGVuZ3RoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExlbmd0aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGVuZ3RoKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXBhcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIG9mIHRoZSBub2RlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXBhcmF0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcGFyYXRvcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza19TZXBhcmF0b3IoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NlcGFyYXRvcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZXBhcmF0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VwYXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXBhcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcGFyYXRvcihTdHJpbmcgdmFsdWUpOwotCi19IC8vIFdCU01hc2sKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XQlNNYXNrcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2tzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5ZWExZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2tzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXQlNNYXNrcy5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldCUyBNYXNrczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzVmVyaWZ5VW5pcXVlQ29kZXMgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNHZW5lcmF0ZUNvZGVzIDxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNnZXRXQlNNYXNrIDxlbT5XQlMgTWFzazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXQlNNYXNrc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXQlNNYXNrcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgV0JTIGNvZGVzIGFyZSB1bmlxdWUgZm9yIG5ldyB0YXNrcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjdW5zZXRWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjc2V0VmVyaWZ5VW5pcXVlQ29kZXMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXQlNNYXNrc19WZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZlcmlmeVVuaXF1ZUNvZGVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1ZlcmlmeVVuaXF1ZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzVmVyaWZ5VW5pcXVlQ29kZXMgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI3Vuc2V0VmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZlcmlmeVVuaXF1ZUNvZGVzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzVmVyaWZ5VW5pcXVlQ29kZXMgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI3NldFZlcmlmeVVuaXF1ZUNvZGVzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRWZXJpZnlVbmlxdWVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzVmVyaWZ5VW5pcXVlQ29kZXMgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICNpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICNzZXRWZXJpZnlVbmlxdWVDb2Rlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VmVyaWZ5VW5pcXVlQ29kZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdlbmVyYXRlIENvZGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIFdCUyBjb2RlcyBhcmUgZ2VuZXJhdGVkIGZvciBuZXcgdGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIENvZGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEdlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI3Vuc2V0R2VuZXJhdGVDb2RlcygpCi0JICogQHNlZSAjc2V0R2VuZXJhdGVDb2Rlcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tzX0dlbmVyYXRlQ29kZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdHZW5lcmF0ZUNvZGVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0dlbmVyYXRlQ29kZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNHZW5lcmF0ZUNvZGVzIDxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0R2VuZXJhdGVDb2RlcygpCi0JICogQHNlZSAjdW5zZXRHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICNpc0dlbmVyYXRlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdlbmVyYXRlQ29kZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNHZW5lcmF0ZUNvZGVzIDxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICNpc0dlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI3NldEdlbmVyYXRlQ29kZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEdlbmVyYXRlQ29kZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc0dlbmVyYXRlQ29kZXMgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0R2VuZXJhdGVDb2RlcygpCi0JICogQHNlZSAjaXNHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICNzZXRHZW5lcmF0ZUNvZGVzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRHZW5lcmF0ZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcmVmaXggZm9yIGFsbCBXQlMgY29kZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlZml4KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXQlNNYXNrc19QcmVmaXgoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVmaXhUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVmaXgnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlZml4KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlZml4KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XQlMgTWFzazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgV0JTIE1hc2sgdGhhdCBpcyBhcHBsaWVkIHRvIGFsbCB0YXNrcyBpbiB0aGUgUHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V0JTIE1hc2s8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza3NfV0JTTWFzaygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV0JTTWFzaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFdCU01hc2soKTsKLQotfSAvLyBXQlNNYXNrcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dlZWtEYXkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XZWVrRGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzZGUyZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dlZWtEYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdlZWtEYXkuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2VlayBEYXk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldERheVR5cGUgPGVtPkRheSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjaXNEYXlXb3JraW5nIDxlbT5EYXkgV29ya2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0V29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV2Vla0RheV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWVrRGF5IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIGRheS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1FeGNlcHRpb24sIDE9TW9uZGF5LCAyPVR1ZXNkYXksIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM9V2VkbmVzZGF5LCA0PVRodXJzZGF5LCA1PUZyaWRheSwgNj1TYXR1cmRheSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNz1TdW5kYXkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERheVR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXZWVrRGF5X0RheVR5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EYXlUeXBlVHlwZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RheVR5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldERheVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXREYXlUeXBlIDxlbT5EYXkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERheVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERheVR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXkgV29ya2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgc3BlY2lmaWVkIGRhdGUgb3IgZGF5IAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaXMgd29ya2luZy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF5IFdvcmtpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGF5V29ya2luZygpCi0JICogQHNlZSAjdW5zZXREYXlXb3JraW5nKCkKLQkgKiBAc2VlICNzZXREYXlXb3JraW5nKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheV9EYXlXb3JraW5nKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEYXlXb3JraW5nJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0RheVdvcmtpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNpc0RheVdvcmtpbmcgPGVtPkRheSBXb3JraW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXkgV29ya2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREYXlXb3JraW5nKCkKLQkgKiBAc2VlICN1bnNldERheVdvcmtpbmcoKQotCSAqIEBzZWUgI2lzRGF5V29ya2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGF5V29ya2luZyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2lzRGF5V29ya2luZyA8ZW0+RGF5IFdvcmtpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGF5V29ya2luZygpCi0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAc2VlICNzZXREYXlXb3JraW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXREYXlXb3JraW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNpc0RheVdvcmtpbmcgPGVtPkRheSBXb3JraW5nPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXkgV29ya2luZzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RGF5V29ya2luZygpCi0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAc2VlICNzZXREYXlXb3JraW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXREYXlXb3JraW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVmaW5lcyBhIGNvbnRpZ3VvdXMgc2V0IG9mIGV4Y2VwdGlvbiBkYXlzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lIFBlcmlvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGltZVBlcmlvZChUaW1lUGVyaW9kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdlZWtEYXlfVGltZVBlcmlvZCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpbWVQZXJpb2QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUaW1lUGVyaW9kIGdldFRpbWVQZXJpb2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXRUaW1lUGVyaW9kIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRpbWVQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRpbWVQZXJpb2QoVGltZVBlcmlvZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JraW5nIFRpbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiB3b3JraW5nIHRpbWVzIHRoYXQgZGVmaW5lIHRoZSB0aW1lIHdvcmtlZCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgd2Vla2RheS4gIE9uZSBvZiB0aGVzZSBtdXN0IGJlIHByZXNlbnQsIGFuZCB0aGVyZSBtYXkgYmUgbm8gbW9yZSB0aGFuIGZpdmUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmtpbmcgVGltZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheV9Xb3JraW5nVGltZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JraW5nVGltZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JraW5nVGltZXMgZ2V0V29ya2luZ1RpbWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0V29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXb3JraW5nVGltZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMgdmFsdWUpOwotCi19IC8vIFdlZWtEYXkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XZWVrRGF5cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dlZWtEYXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwN2VmYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dlZWtEYXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdlZWtEYXlzLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2VlayBEYXlzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXMjZ2V0V2Vla0RheSA8ZW0+V2VlayBEYXk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXZWVrRGF5cygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV2Vla0RheXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2Vla0RheXMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWVrIERheTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHdlZWtkYXkgZWl0aGVyIGRlZmluZXMgcmVndWxhciBkYXlzIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHdlZWsgb3IgZXhjZXB0aW9uIGRheXMgaW4gdGhlIGNhbGVuZGFyLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWVrIERheTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXZWVrRGF5c19XZWVrRGF5KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXZWVrRGF5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0V2Vla0RheSgpOwotCi19IC8vIFdlZWtEYXlzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV29ya2luZ1RpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Xb3JraW5nVGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZGI5MjFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Xb3JraW5nVGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JraW5nVGltZS5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29ya2luZyBUaW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0RnJvbVRpbWUgPGVtPkZyb20gVGltZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSNnZXRUb1RpbWUgPGVtPlRvIFRpbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXb3JraW5nVGltZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya2luZ1RpbWVfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2luZ1RpbWUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Gcm9tIFRpbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBiZWdpbm5pbmcgb2YgdGhlIHdvcmtpbmcgdGltZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZyb20gVGltZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RnJvbVRpbWUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdvcmtpbmdUaW1lX0Zyb21UaW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5UaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGcm9tVGltZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRGcm9tVGltZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSNnZXRGcm9tVGltZSA8ZW0+RnJvbSBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Gcm9tIFRpbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZyb21UaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGcm9tVGltZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG8gVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVuZCBvZiB0aGUgd29ya2luZyAgdGltZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvIFRpbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRvVGltZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V29ya2luZ1RpbWVfVG9UaW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5UaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUb1RpbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0VG9UaW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldFRvVGltZSA8ZW0+VG8gVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VG8gVGltZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VG9UaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUb1RpbWUoT2JqZWN0IHZhbHVlKTsKLQotfSAvLyBXb3JraW5nVGltZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dvcmtpbmdUaW1lcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dvcmtpbmdUaW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNTkzNGE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Xb3JraW5nVGltZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya2luZ1RpbWVzLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29ya2luZyBUaW1lczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lcyNnZXRXb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V29ya2luZ1RpbWVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JraW5nVGltZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2luZ1RpbWVzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29ya2luZyBUaW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSB3b3JraW5nIHRpbWUgZHVyaW5nIHRoZSB3ZWVrZGF5LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdvcmtpbmdUaW1lc19Xb3JraW5nVGltZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHVwcGVyPSI1IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JraW5nVGltZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFdvcmtpbmdUaW1lKCk7Ci0KLX0gLy8gV29ya2luZ1RpbWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Bc3NpZ25tZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXNzaWdubWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTgwZjMwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Bc3NpZ25tZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFzc2lnbm1lbnRJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFzc2lnbm1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFRhc2tVSUQgPGVtPlRhc2sgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0UmVzb3VyY2VVSUQgPGVtPlJlc291cmNlIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QWN0dWFsRmluaXNoIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxTdGFydCA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNDb25maXJtZWQgPGVtPkNvbmZpcm1lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRDb3N0UmF0ZVRhYmxlIDxlbT5Db3N0IFJhdGUgVGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRDViA8ZW0+Q1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXREZWxheSA8ZW0+RGVsYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEZpbmlzaFZhcmlhbmNlIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNIYXNGaXhlZFJhdGVVbml0cyA8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNpc0ZpeGVkTWF0ZXJpYWwgPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0TGV2ZWxpbmdEZWxheSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0IDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNpc0xpbmtlZEZpZWxkcyA8ZW0+TGlua2VkIEZpZWxkczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNpc092ZXJhbGxvY2F0ZWQgPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRPdmVydGltZVdvcmsgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNSZXNwb25zZVBlbmRpbmcgPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRTdG9wIDxlbT5TdG9wPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0UmVzdW1lIDxlbT5SZXN1bWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRTdGFydFZhcmlhbmNlIDxlbT5TdGFydCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFVuaXRzIDxlbT5Vbml0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2lzVXBkYXRlTmVlZGVkIDxlbT5VcGRhdGUgTmVlZGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0VkFDIDxlbT5WQUM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0V29ya0NvbnRvdXIgPGVtPldvcmsgQ29udG91cjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25tZW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXNzaWdubWVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXNrVUlEKCkgPGVtPlRhc2sgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXNrVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVEFTS19VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFza1VJRCgpIDxlbT5UYXNrIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFza1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdGFza1VJRCA9IFRBU0tfVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVUlEKCkgPGVtPlJlc291cmNlIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBSRVNPVVJDRV9VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VVSUQoKSA8ZW0+UmVzb3VyY2UgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZVVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgcmVzb3VyY2VVSUQgPSBSRVNPVVJDRV9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBlcmNlbnRXb3JrQ29tcGxldGUgPSBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsQ29zdCgpIDxlbT5BY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIEFDVFVBTF9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbENvc3QoKSA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGFjdHVhbENvc3QgPSBBQ1RVQUxfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxGaW5pc2goKSA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfRklOSVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbEZpbmlzaCgpIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsRmluaXNoID0gQUNUVUFMX0ZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBhY3R1YWxPdmVydGltZUNvc3QgPSBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsT3ZlcnRpbWVXb3JrID0gQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsU3RhcnQoKSA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX1NUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFN0YXJ0KCkgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsU3RhcnQgPSBBQ1RVQUxfU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29yaygpIDxlbT5BY3R1YWwgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29yaygpIDxlbT5BY3R1YWwgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxXb3JrID0gQUNUVUFMX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QUNXUCgpIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEFDV1BfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QUNXUCgpIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYUNXUCA9IEFDV1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFDV1AgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFDV1BFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDb25maXJtZWQoKSA8ZW0+Q29uZmlybWVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0NvbmZpcm1lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENPTkZJUk1FRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDb25maXJtZWQoKSA8ZW0+Q29uZmlybWVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0NvbmZpcm1lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlybWVkID0gQ09ORklSTUVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDb25maXJtZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbmZpcm1lZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBDT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgY29zdCA9IENPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdFJhdGVUYWJsZSgpIDxlbT5Db3N0IFJhdGUgVGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3RSYXRlVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDT1NUX1JBVEVfVEFCTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdFJhdGVUYWJsZSgpIDxlbT5Db3N0IFJhdGUgVGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3RSYXRlVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGNvc3RSYXRlVGFibGUgPSBDT1NUX1JBVEVfVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdFZhcmlhbmNlKCkgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBDT1NUX1ZBUklBTkNFX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RWYXJpYW5jZSgpIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBjb3N0VmFyaWFuY2UgPSBDT1NUX1ZBUklBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDb3N0IFZhcmlhbmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb3N0VmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q1YoKSA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IENWX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENWKCkgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGNWID0gQ1ZfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENWIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjVkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWxheSgpIDxlbT5EZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBERUxBWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWxheSgpIDxlbT5EZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGRlbGF5ID0gREVMQVlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hWYXJpYW5jZSgpIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRklOSVNIX1ZBUklBTkNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaFZhcmlhbmNlKCkgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGZpbmlzaFZhcmlhbmNlID0gRklOSVNIX1ZBUklBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGluaygpIDxlbT5IeXBlcmxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFlQRVJMSU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGluaygpIDxlbT5IeXBlcmxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBoeXBlcmxpbmsgPSBIWVBFUkxJTktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBoeXBlcmxpbmtBZGRyZXNzID0gSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBoeXBlcmxpbmtTdWJBZGRyZXNzID0gSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtWYXJpYW5jZSgpIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgV09SS19WQVJJQU5DRV9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrVmFyaWFuY2UoKSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgd29ya1ZhcmlhbmNlID0gV09SS19WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgV29yayBWYXJpYW5jZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gd29ya1ZhcmlhbmNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGFzRml4ZWRSYXRlVW5pdHMoKSA8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBIQVNfRklYRURfUkFURV9VTklUU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIYXNGaXhlZFJhdGVVbml0cygpIDxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzRml4ZWRSYXRlVW5pdHMgPSBIQVNfRklYRURfUkFURV9VTklUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSGFzIEZpeGVkIFJhdGUgVW5pdHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0ZpeGVkUmF0ZVVuaXRzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRml4ZWRNYXRlcmlhbCgpIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaXhlZE1hdGVyaWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRklYRURfTUFURVJJQUxfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRml4ZWRNYXRlcmlhbCgpIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaXhlZE1hdGVyaWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaXhlZE1hdGVyaWFsID0gRklYRURfTUFURVJJQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEZpeGVkIE1hdGVyaWFsIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaXhlZE1hdGVyaWFsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXkoKSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRVZFTElOR19ERUxBWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbGluZ0RlbGF5KCkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5ID0gTEVWRUxJTkdfREVMQVlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxldmVsaW5nRGVsYXlGb3JtYXQgPSBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMaW5rZWRGaWVsZHMoKSA8ZW0+TGlua2VkIEZpZWxkczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMaW5rZWRGaWVsZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMSU5LRURfRklFTERTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xpbmtlZEZpZWxkcygpIDxlbT5MaW5rZWQgRmllbGRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xpbmtlZEZpZWxkcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGlua2VkRmllbGRzID0gTElOS0VEX0ZJRUxEU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGlua2VkIEZpZWxkcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGlua2VkRmllbGRzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWlsZXN0b25lKCkgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNSUxFU1RPTkVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWlsZXN0b25lKCkgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1pbGVzdG9uZSA9IE1JTEVTVE9ORV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTWlsZXN0b25lIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtaWxlc3RvbmVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90ZXMoKSA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RFU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RlcygpIDxlbT5Ob3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm90ZXMgPSBOT1RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc092ZXJhbGxvY2F0ZWQoKSA8ZW0+T3ZlcmFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNPdmVyYWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gT1ZFUkFMTE9DQVRFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPdmVyYWxsb2NhdGVkKCkgPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT3ZlcmFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3ZlcmFsbG9jYXRlZCA9IE9WRVJBTExPQ0FURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE92ZXJhbGxvY2F0ZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJhbGxvY2F0ZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVDb3N0KCkgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIE9WRVJUSU1FX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVDb3N0KCkgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgb3ZlcnRpbWVDb3N0ID0gT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVdvcmsoKSA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBPVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lV29yaygpIDxlbT5PdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgb3ZlcnRpbWVXb3JrID0gT1ZFUlRJTUVfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWd1bGFyV29yaygpIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRUdVTEFSX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVndWxhcldvcmsoKSA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZWd1bGFyV29yayA9IFJFR1VMQVJfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdDb3N0KCkgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nQ29zdCgpIDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgcmVtYWluaW5nQ29zdCA9IFJFTUFJTklOR19DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdCA9IFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZW1haW5pbmdPdmVydGltZVdvcmsgPSBSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbWFpbmluZ1dvcmsgPSBSRU1BSU5JTkdfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Jlc3BvbnNlUGVuZGluZygpIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc3BvbnNlUGVuZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFU1BPTlNFX1BFTkRJTkdfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzcG9uc2VQZW5kaW5nKCkgPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNwb25zZVBlbmRpbmcgPSBSRVNQT05TRV9QRU5ESU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZXNwb25zZSBQZW5kaW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNwb25zZVBlbmRpbmdFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydCgpIDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3RhcnQgPSBTVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdG9wKCkgPGVtPlN0b3A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0b3AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1BfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RvcCgpIDxlbT5TdG9wPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0b3AgPSBTVE9QX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VtZSgpIDxlbT5SZXN1bWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVTVU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VtZSgpIDxlbT5SZXN1bWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZXN1bWUgPSBSRVNVTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnRWYXJpYW5jZSgpIDxlbT5TdGFydCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnRWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFNUQVJUX1ZBUklBTkNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0VmFyaWFuY2UoKSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHN0YXJ0VmFyaWFuY2UgPSBTVEFSVF9WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbml0cygpIDxlbT5Vbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgVU5JVFNfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pdHMoKSA8ZW0+VW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgdW5pdHMgPSBVTklUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVW5pdHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVuaXRzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXBkYXRlTmVlZGVkKCkgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVXBkYXRlTmVlZGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVBEQVRFX05FRURFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVcGRhdGVOZWVkZWQoKSA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNVcGRhdGVOZWVkZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZU5lZWRlZCA9IFVQREFURV9ORUVERURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFVwZGF0ZSBOZWVkZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZU5lZWRlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWQUMoKSA8ZW0+VkFDPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWQUMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgVkFDX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZBQygpIDxlbT5WQUM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZBQygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHZBQyA9IFZBQ19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVkFDIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2QUNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBXT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB3b3JrID0gV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrQ29udG91cigpIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtDb250b3VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgV09SS19DT05UT1VSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtDb250b3VyKCkgPGVtPldvcmsgQ29udG91cjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya0NvbnRvdXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHdvcmtDb250b3VyID0gV09SS19DT05UT1VSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dTIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dTRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvb2tpbmdUeXBlKCkgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Qm9va2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBCT09LSU5HX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9va2luZ1R5cGUoKSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCb29raW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYm9va2luZ1R5cGUgPSBCT09LSU5HX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxXb3JrUHJvdGVjdGVkID0gQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPSBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25EYXRlKCkgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQ1JFQVRJT05fREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGlvbkRhdGUoKSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0aW9uRGF0ZSA9IENSRUFUSU9OX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBleHRlbmRlZEF0dHJpYnV0ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlbGluZSgpIDxlbT5CYXNlbGluZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGJhc2VsaW5lID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBc3NpZ25tZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEFzc2lnbm1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFRhc2tVSUQoKSB7Ci0JCXJldHVybiB0YXNrVUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhc2tVSUQoQmlnSW50ZWdlciBuZXdUYXNrVUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVGFza1VJRCA9IHRhc2tVSUQ7Ci0JCXRhc2tVSUQgPSBuZXdUYXNrVUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RBU0tfVUlELCBvbGRUYXNrVUlELCB0YXNrVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UmVzb3VyY2VVSUQoKSB7Ci0JCXJldHVybiByZXNvdXJjZVVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVVJRChCaWdJbnRlZ2VyIG5ld1Jlc291cmNlVUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUmVzb3VyY2VVSUQgPSByZXNvdXJjZVVJRDsKLQkJcmVzb3VyY2VVSUQgPSBuZXdSZXNvdXJjZVVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNPVVJDRV9VSUQsIG9sZFJlc291cmNlVUlELCByZXNvdXJjZVVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKSB7Ci0JCXJldHVybiBwZXJjZW50V29ya0NvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcmNlbnRXb3JrQ29tcGxldGUoQmlnSW50ZWdlciBuZXdQZXJjZW50V29ya0NvbXBsZXRlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUGVyY2VudFdvcmtDb21wbGV0ZSA9IHBlcmNlbnRXb3JrQ29tcGxldGU7Ci0JCXBlcmNlbnRXb3JrQ29tcGxldGUgPSBuZXdQZXJjZW50V29ya0NvbXBsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1BFUkNFTlRfV09SS19DT01QTEVURSwgb2xkUGVyY2VudFdvcmtDb21wbGV0ZSwgcGVyY2VudFdvcmtDb21wbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldEFjdHVhbENvc3QoKSB7Ci0JCXJldHVybiBhY3R1YWxDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbENvc3QoQmlnRGVjaW1hbCBuZXdBY3R1YWxDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQWN0dWFsQ29zdCA9IGFjdHVhbENvc3Q7Ci0JCWFjdHVhbENvc3QgPSBuZXdBY3R1YWxDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9DT1NULCBvbGRBY3R1YWxDb3N0LCBhY3R1YWxDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxGaW5pc2goKSB7Ci0JCXJldHVybiBhY3R1YWxGaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsRmluaXNoKE9iamVjdCBuZXdBY3R1YWxGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbEZpbmlzaCA9IGFjdHVhbEZpbmlzaDsKLQkJYWN0dWFsRmluaXNoID0gbmV3QWN0dWFsRmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9GSU5JU0gsIG9sZEFjdHVhbEZpbmlzaCwgYWN0dWFsRmluaXNoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gYWN0dWFsT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld0FjdHVhbE92ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZEFjdHVhbE92ZXJ0aW1lQ29zdCA9IGFjdHVhbE92ZXJ0aW1lQ29zdDsKLQkJYWN0dWFsT3ZlcnRpbWVDb3N0ID0gbmV3QWN0dWFsT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NULCBvbGRBY3R1YWxPdmVydGltZUNvc3QsIGFjdHVhbE92ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gYWN0dWFsT3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QgbmV3QWN0dWFsT3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxPdmVydGltZVdvcmsgPSBhY3R1YWxPdmVydGltZVdvcms7Ci0JCWFjdHVhbE92ZXJ0aW1lV29yayA9IG5ld0FjdHVhbE92ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SSywgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrLCBhY3R1YWxPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbFN0YXJ0KCkgewotCQlyZXR1cm4gYWN0dWFsU3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsU3RhcnQoT2JqZWN0IG5ld0FjdHVhbFN0YXJ0KSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxTdGFydCA9IGFjdHVhbFN0YXJ0OwotCQlhY3R1YWxTdGFydCA9IG5ld0FjdHVhbFN0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9TVEFSVCwgb2xkQWN0dWFsU3RhcnQsIGFjdHVhbFN0YXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxXb3JrKCkgewotCQlyZXR1cm4gYWN0dWFsV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCBuZXdBY3R1YWxXb3JrKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxXb3JrID0gYWN0dWFsV29yazsKLQkJYWN0dWFsV29yayA9IG5ld0FjdHVhbFdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUkssIG9sZEFjdHVhbFdvcmssIGFjdHVhbFdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QUNXUCgpIHsKLQkJcmV0dXJuIGFDV1A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QUNXUChmbG9hdCBuZXdBQ1dQKSB7Ci0JCWZsb2F0IG9sZEFDV1AgPSBhQ1dQOwotCQlhQ1dQID0gbmV3QUNXUDsKLQkJYm9vbGVhbiBvbGRBQ1dQRVNldCA9IGFDV1BFU2V0OwotCQlhQ1dQRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNXUCwgb2xkQUNXUCwgYUNXUCwgIW9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBQ1dQKCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYm9vbGVhbiBvbGRBQ1dQRVNldCA9IGFDV1BFU2V0OwotCQlhQ1dQID0gQUNXUF9FREVGQVVMVDsKLQkJYUNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDV1AsIG9sZEFDV1AsIEFDV1BfRURFRkFVTFQsIG9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBQ1dQKCkgewotCQlyZXR1cm4gYUNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25maXJtZWQoKSB7Ci0JCXJldHVybiBjb25maXJtZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlybWVkKGJvb2xlYW4gbmV3Q29uZmlybWVkKSB7Ci0JCWJvb2xlYW4gb2xkQ29uZmlybWVkID0gY29uZmlybWVkOwotCQljb25maXJtZWQgPSBuZXdDb25maXJtZWQ7Ci0JCWJvb2xlYW4gb2xkQ29uZmlybWVkRVNldCA9IGNvbmZpcm1lZEVTZXQ7Ci0JCWNvbmZpcm1lZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPTkZJUk1FRCwgb2xkQ29uZmlybWVkLCBjb25maXJtZWQsICFvbGRDb25maXJtZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDb25maXJtZWQoKSB7Ci0JCWJvb2xlYW4gb2xkQ29uZmlybWVkID0gY29uZmlybWVkOwotCQlib29sZWFuIG9sZENvbmZpcm1lZEVTZXQgPSBjb25maXJtZWRFU2V0OwotCQljb25maXJtZWQgPSBDT05GSVJNRURfRURFRkFVTFQ7Ci0JCWNvbmZpcm1lZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPTkZJUk1FRCwgb2xkQ29uZmlybWVkLCBDT05GSVJNRURfRURFRkFVTFQsIG9sZENvbmZpcm1lZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENvbmZpcm1lZCgpIHsKLQkJcmV0dXJuIGNvbmZpcm1lZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdChCaWdEZWNpbWFsIG5ld0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRDb3N0ID0gY29zdDsKLQkJY29zdCA9IG5ld0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVCwgb2xkQ29zdCwgY29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldENvc3RSYXRlVGFibGUoKSB7Ci0JCXJldHVybiBjb3N0UmF0ZVRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3RSYXRlVGFibGUoQmlnSW50ZWdlciBuZXdDb3N0UmF0ZVRhYmxlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ29zdFJhdGVUYWJsZSA9IGNvc3RSYXRlVGFibGU7Ci0JCWNvc3RSYXRlVGFibGUgPSBuZXdDb3N0UmF0ZVRhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfUkFURV9UQUJMRSwgb2xkQ29zdFJhdGVUYWJsZSwgY29zdFJhdGVUYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRDb3N0VmFyaWFuY2UoKSB7Ci0JCXJldHVybiBjb3N0VmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdFZhcmlhbmNlKGZsb2F0IG5ld0Nvc3RWYXJpYW5jZSkgewotCQlmbG9hdCBvbGRDb3N0VmFyaWFuY2UgPSBjb3N0VmFyaWFuY2U7Ci0JCWNvc3RWYXJpYW5jZSA9IG5ld0Nvc3RWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRDb3N0VmFyaWFuY2VFU2V0ID0gY29zdFZhcmlhbmNlRVNldDsKLQkJY29zdFZhcmlhbmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRSwgb2xkQ29zdFZhcmlhbmNlLCBjb3N0VmFyaWFuY2UsICFvbGRDb3N0VmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDb3N0VmFyaWFuY2UoKSB7Ci0JCWZsb2F0IG9sZENvc3RWYXJpYW5jZSA9IGNvc3RWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRDb3N0VmFyaWFuY2VFU2V0ID0gY29zdFZhcmlhbmNlRVNldDsKLQkJY29zdFZhcmlhbmNlID0gQ09TVF9WQVJJQU5DRV9FREVGQVVMVDsKLQkJY29zdFZhcmlhbmNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRSwgb2xkQ29zdFZhcmlhbmNlLCBDT1NUX1ZBUklBTkNFX0VERUZBVUxULCBvbGRDb3N0VmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDb3N0VmFyaWFuY2UoKSB7Ci0JCXJldHVybiBjb3N0VmFyaWFuY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRDVigpIHsKLQkJcmV0dXJuIGNWOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENWKGZsb2F0IG5ld0NWKSB7Ci0JCWZsb2F0IG9sZENWID0gY1Y7Ci0JCWNWID0gbmV3Q1Y7Ci0JCWJvb2xlYW4gb2xkQ1ZFU2V0ID0gY1ZFU2V0OwotCQljVkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NWLCBvbGRDViwgY1YsICFvbGRDVkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldENWKCkgewotCQlmbG9hdCBvbGRDViA9IGNWOwotCQlib29sZWFuIG9sZENWRVNldCA9IGNWRVNldDsKLQkJY1YgPSBDVl9FREVGQVVMVDsKLQkJY1ZFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DViwgb2xkQ1YsIENWX0VERUZBVUxULCBvbGRDVkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENWKCkgewotCQlyZXR1cm4gY1ZFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldERlbGF5KCkgewotCQlyZXR1cm4gZGVsYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsYXkoQmlnSW50ZWdlciBuZXdEZWxheSkgewotCQlCaWdJbnRlZ2VyIG9sZERlbGF5ID0gZGVsYXk7Ci0JCWRlbGF5ID0gbmV3RGVsYXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fREVMQVksIG9sZERlbGF5LCBkZWxheSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmluaXNoKCkgewotCQlyZXR1cm4gZmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaChPYmplY3QgbmV3RmluaXNoKSB7Ci0JCU9iamVjdCBvbGRGaW5pc2ggPSBmaW5pc2g7Ci0JCWZpbmlzaCA9IG5ld0ZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSU5JU0gsIG9sZEZpbmlzaCwgZmluaXNoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RmluaXNoVmFyaWFuY2UoKSB7Ci0JCXJldHVybiBmaW5pc2hWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2hWYXJpYW5jZShCaWdJbnRlZ2VyIG5ld0ZpbmlzaFZhcmlhbmNlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRmluaXNoVmFyaWFuY2UgPSBmaW5pc2hWYXJpYW5jZTsKLQkJZmluaXNoVmFyaWFuY2UgPSBuZXdGaW5pc2hWYXJpYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSU5JU0hfVkFSSUFOQ0UsIG9sZEZpbmlzaFZhcmlhbmNlLCBmaW5pc2hWYXJpYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGluayhTdHJpbmcgbmV3SHlwZXJsaW5rKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmsgPSBoeXBlcmxpbms7Ci0JCWh5cGVybGluayA9IG5ld0h5cGVybGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTkssIG9sZEh5cGVybGluaywgaHlwZXJsaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtBZGRyZXNzID0gaHlwZXJsaW5rQWRkcmVzczsKLQkJaHlwZXJsaW5rQWRkcmVzcyA9IG5ld0h5cGVybGlua0FkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX0FERFJFU1MsIG9sZEh5cGVybGlua0FkZHJlc3MsIGh5cGVybGlua0FkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0JCXJldHVybiBoeXBlcmxpbmtTdWJBZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1N1YkFkZHJlc3MoU3RyaW5nIG5ld0h5cGVybGlua1N1YkFkZHJlc3MpIHsKLQkJU3RyaW5nIG9sZEh5cGVybGlua1N1YkFkZHJlc3MgPSBoeXBlcmxpbmtTdWJBZGRyZXNzOwotCQloeXBlcmxpbmtTdWJBZGRyZXNzID0gbmV3SHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTktfU1VCX0FERFJFU1MsIG9sZEh5cGVybGlua1N1YkFkZHJlc3MsIGh5cGVybGlua1N1YkFkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0V29ya1ZhcmlhbmNlKCkgewotCQlyZXR1cm4gd29ya1ZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtWYXJpYW5jZShmbG9hdCBuZXdXb3JrVmFyaWFuY2UpIHsKLQkJZmxvYXQgb2xkV29ya1ZhcmlhbmNlID0gd29ya1ZhcmlhbmNlOwotCQl3b3JrVmFyaWFuY2UgPSBuZXdXb3JrVmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkV29ya1ZhcmlhbmNlRVNldCA9IHdvcmtWYXJpYW5jZUVTZXQ7Ci0JCXdvcmtWYXJpYW5jZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0UsIG9sZFdvcmtWYXJpYW5jZSwgd29ya1ZhcmlhbmNlLCAhb2xkV29ya1ZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0V29ya1ZhcmlhbmNlKCkgewotCQlmbG9hdCBvbGRXb3JrVmFyaWFuY2UgPSB3b3JrVmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkV29ya1ZhcmlhbmNlRVNldCA9IHdvcmtWYXJpYW5jZUVTZXQ7Ci0JCXdvcmtWYXJpYW5jZSA9IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0JCXdvcmtWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0UsIG9sZFdvcmtWYXJpYW5jZSwgV09SS19WQVJJQU5DRV9FREVGQVVMVCwgb2xkV29ya1ZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0V29ya1ZhcmlhbmNlKCkgewotCQlyZXR1cm4gd29ya1ZhcmlhbmNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkgewotCQlyZXR1cm4gaGFzRml4ZWRSYXRlVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFzRml4ZWRSYXRlVW5pdHMoYm9vbGVhbiBuZXdIYXNGaXhlZFJhdGVVbml0cykgewotCQlib29sZWFuIG9sZEhhc0ZpeGVkUmF0ZVVuaXRzID0gaGFzRml4ZWRSYXRlVW5pdHM7Ci0JCWhhc0ZpeGVkUmF0ZVVuaXRzID0gbmV3SGFzRml4ZWRSYXRlVW5pdHM7Ci0JCWJvb2xlYW4gb2xkSGFzRml4ZWRSYXRlVW5pdHNFU2V0ID0gaGFzRml4ZWRSYXRlVW5pdHNFU2V0OwotCQloYXNGaXhlZFJhdGVVbml0c0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hBU19GSVhFRF9SQVRFX1VOSVRTLCBvbGRIYXNGaXhlZFJhdGVVbml0cywgaGFzRml4ZWRSYXRlVW5pdHMsICFvbGRIYXNGaXhlZFJhdGVVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEhhc0ZpeGVkUmF0ZVVuaXRzKCkgewotCQlib29sZWFuIG9sZEhhc0ZpeGVkUmF0ZVVuaXRzID0gaGFzRml4ZWRSYXRlVW5pdHM7Ci0JCWJvb2xlYW4gb2xkSGFzRml4ZWRSYXRlVW5pdHNFU2V0ID0gaGFzRml4ZWRSYXRlVW5pdHNFU2V0OwotCQloYXNGaXhlZFJhdGVVbml0cyA9IEhBU19GSVhFRF9SQVRFX1VOSVRTX0VERUZBVUxUOwotCQloYXNGaXhlZFJhdGVVbml0c0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hBU19GSVhFRF9SQVRFX1VOSVRTLCBvbGRIYXNGaXhlZFJhdGVVbml0cywgSEFTX0ZJWEVEX1JBVEVfVU5JVFNfRURFRkFVTFQsIG9sZEhhc0ZpeGVkUmF0ZVVuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SGFzRml4ZWRSYXRlVW5pdHMoKSB7Ci0JCXJldHVybiBoYXNGaXhlZFJhdGVVbml0c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaXhlZE1hdGVyaWFsKCkgewotCQlyZXR1cm4gZml4ZWRNYXRlcmlhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaXhlZE1hdGVyaWFsKGJvb2xlYW4gbmV3Rml4ZWRNYXRlcmlhbCkgewotCQlib29sZWFuIG9sZEZpeGVkTWF0ZXJpYWwgPSBmaXhlZE1hdGVyaWFsOwotCQlmaXhlZE1hdGVyaWFsID0gbmV3Rml4ZWRNYXRlcmlhbDsKLQkJYm9vbGVhbiBvbGRGaXhlZE1hdGVyaWFsRVNldCA9IGZpeGVkTWF0ZXJpYWxFU2V0OwotCQlmaXhlZE1hdGVyaWFsRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklYRURfTUFURVJJQUwsIG9sZEZpeGVkTWF0ZXJpYWwsIGZpeGVkTWF0ZXJpYWwsICFvbGRGaXhlZE1hdGVyaWFsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Rml4ZWRNYXRlcmlhbCgpIHsKLQkJYm9vbGVhbiBvbGRGaXhlZE1hdGVyaWFsID0gZml4ZWRNYXRlcmlhbDsKLQkJYm9vbGVhbiBvbGRGaXhlZE1hdGVyaWFsRVNldCA9IGZpeGVkTWF0ZXJpYWxFU2V0OwotCQlmaXhlZE1hdGVyaWFsID0gRklYRURfTUFURVJJQUxfRURFRkFVTFQ7Ci0JCWZpeGVkTWF0ZXJpYWxFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSVhFRF9NQVRFUklBTCwgb2xkRml4ZWRNYXRlcmlhbCwgRklYRURfTUFURVJJQUxfRURFRkFVTFQsIG9sZEZpeGVkTWF0ZXJpYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRGaXhlZE1hdGVyaWFsKCkgewotCQlyZXR1cm4gZml4ZWRNYXRlcmlhbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGV2ZWxpbmdEZWxheSgpIHsKLQkJcmV0dXJuIGxldmVsaW5nRGVsYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWxpbmdEZWxheShCaWdJbnRlZ2VyIG5ld0xldmVsaW5nRGVsYXkpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbGluZ0RlbGF5ID0gbGV2ZWxpbmdEZWxheTsKLQkJbGV2ZWxpbmdEZWxheSA9IG5ld0xldmVsaW5nRGVsYXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVksIG9sZExldmVsaW5nRGVsYXksIGxldmVsaW5nRGVsYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkgewotCQlyZXR1cm4gbGV2ZWxpbmdEZWxheUZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KEJpZ0ludGVnZXIgbmV3TGV2ZWxpbmdEZWxheUZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZExldmVsaW5nRGVsYXlGb3JtYXQgPSBsZXZlbGluZ0RlbGF5Rm9ybWF0OwotCQlsZXZlbGluZ0RlbGF5Rm9ybWF0ID0gbmV3TGV2ZWxpbmdEZWxheUZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MRVZFTElOR19ERUxBWV9GT1JNQVQsIG9sZExldmVsaW5nRGVsYXlGb3JtYXQsIGxldmVsaW5nRGVsYXlGb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xpbmtlZEZpZWxkcygpIHsKLQkJcmV0dXJuIGxpbmtlZEZpZWxkczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5rZWRGaWVsZHMoYm9vbGVhbiBuZXdMaW5rZWRGaWVsZHMpIHsKLQkJYm9vbGVhbiBvbGRMaW5rZWRGaWVsZHMgPSBsaW5rZWRGaWVsZHM7Ci0JCWxpbmtlZEZpZWxkcyA9IG5ld0xpbmtlZEZpZWxkczsKLQkJYm9vbGVhbiBvbGRMaW5rZWRGaWVsZHNFU2V0ID0gbGlua2VkRmllbGRzRVNldDsKLQkJbGlua2VkRmllbGRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTElOS0VEX0ZJRUxEUywgb2xkTGlua2VkRmllbGRzLCBsaW5rZWRGaWVsZHMsICFvbGRMaW5rZWRGaWVsZHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRMaW5rZWRGaWVsZHMoKSB7Ci0JCWJvb2xlYW4gb2xkTGlua2VkRmllbGRzID0gbGlua2VkRmllbGRzOwotCQlib29sZWFuIG9sZExpbmtlZEZpZWxkc0VTZXQgPSBsaW5rZWRGaWVsZHNFU2V0OwotCQlsaW5rZWRGaWVsZHMgPSBMSU5LRURfRklFTERTX0VERUZBVUxUOwotCQlsaW5rZWRGaWVsZHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MSU5LRURfRklFTERTLCBvbGRMaW5rZWRGaWVsZHMsIExJTktFRF9GSUVMRFNfRURFRkFVTFQsIG9sZExpbmtlZEZpZWxkc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldExpbmtlZEZpZWxkcygpIHsKLQkJcmV0dXJuIGxpbmtlZEZpZWxkc0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNaWxlc3RvbmUoKSB7Ci0JCXJldHVybiBtaWxlc3RvbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWlsZXN0b25lKGJvb2xlYW4gbmV3TWlsZXN0b25lKSB7Ci0JCWJvb2xlYW4gb2xkTWlsZXN0b25lID0gbWlsZXN0b25lOwotCQltaWxlc3RvbmUgPSBuZXdNaWxlc3RvbmU7Ci0JCWJvb2xlYW4gb2xkTWlsZXN0b25lRVNldCA9IG1pbGVzdG9uZUVTZXQ7Ci0JCW1pbGVzdG9uZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX01JTEVTVE9ORSwgb2xkTWlsZXN0b25lLCBtaWxlc3RvbmUsICFvbGRNaWxlc3RvbmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNaWxlc3RvbmUoKSB7Ci0JCWJvb2xlYW4gb2xkTWlsZXN0b25lID0gbWlsZXN0b25lOwotCQlib29sZWFuIG9sZE1pbGVzdG9uZUVTZXQgPSBtaWxlc3RvbmVFU2V0OwotCQltaWxlc3RvbmUgPSBNSUxFU1RPTkVfRURFRkFVTFQ7Ci0JCW1pbGVzdG9uZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX01JTEVTVE9ORSwgb2xkTWlsZXN0b25lLCBNSUxFU1RPTkVfRURFRkFVTFQsIG9sZE1pbGVzdG9uZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1pbGVzdG9uZSgpIHsKLQkJcmV0dXJuIG1pbGVzdG9uZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RlcygpIHsKLQkJcmV0dXJuIG5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGVzKFN0cmluZyBuZXdOb3RlcykgewotCQlTdHJpbmcgb2xkTm90ZXMgPSBub3RlczsKLQkJbm90ZXMgPSBuZXdOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19OT1RFUywgb2xkTm90ZXMsIG5vdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPdmVyYWxsb2NhdGVkKCkgewotCQlyZXR1cm4gb3ZlcmFsbG9jYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVyYWxsb2NhdGVkKGJvb2xlYW4gbmV3T3ZlcmFsbG9jYXRlZCkgewotCQlib29sZWFuIG9sZE92ZXJhbGxvY2F0ZWQgPSBvdmVyYWxsb2NhdGVkOwotCQlvdmVyYWxsb2NhdGVkID0gbmV3T3ZlcmFsbG9jYXRlZDsKLQkJYm9vbGVhbiBvbGRPdmVyYWxsb2NhdGVkRVNldCA9IG92ZXJhbGxvY2F0ZWRFU2V0OwotCQlvdmVyYWxsb2NhdGVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUkFMTE9DQVRFRCwgb2xkT3ZlcmFsbG9jYXRlZCwgb3ZlcmFsbG9jYXRlZCwgIW9sZE92ZXJhbGxvY2F0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRPdmVyYWxsb2NhdGVkKCkgewotCQlib29sZWFuIG9sZE92ZXJhbGxvY2F0ZWQgPSBvdmVyYWxsb2NhdGVkOwotCQlib29sZWFuIG9sZE92ZXJhbGxvY2F0ZWRFU2V0ID0gb3ZlcmFsbG9jYXRlZEVTZXQ7Ci0JCW92ZXJhbGxvY2F0ZWQgPSBPVkVSQUxMT0NBVEVEX0VERUZBVUxUOwotCQlvdmVyYWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUkFMTE9DQVRFRCwgb2xkT3ZlcmFsbG9jYXRlZCwgT1ZFUkFMTE9DQVRFRF9FREVGQVVMVCwgb2xkT3ZlcmFsbG9jYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE92ZXJhbGxvY2F0ZWQoKSB7Ci0JCXJldHVybiBvdmVyYWxsb2NhdGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRPdmVydGltZUNvc3QoKSB7Ci0JCXJldHVybiBvdmVydGltZUNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgbmV3T3ZlcnRpbWVDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkT3ZlcnRpbWVDb3N0ID0gb3ZlcnRpbWVDb3N0OwotCQlvdmVydGltZUNvc3QgPSBuZXdPdmVydGltZUNvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfQ09TVCwgb2xkT3ZlcnRpbWVDb3N0LCBvdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE92ZXJ0aW1lV29yaygpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZVdvcmsoT2JqZWN0IG5ld092ZXJ0aW1lV29yaykgewotCQlPYmplY3Qgb2xkT3ZlcnRpbWVXb3JrID0gb3ZlcnRpbWVXb3JrOwotCQlvdmVydGltZVdvcmsgPSBuZXdPdmVydGltZVdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfV09SSywgb2xkT3ZlcnRpbWVXb3JrLCBvdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlZ3VsYXJXb3JrKCkgewotCQlyZXR1cm4gcmVndWxhcldvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVndWxhcldvcmsoT2JqZWN0IG5ld1JlZ3VsYXJXb3JrKSB7Ci0JCU9iamVjdCBvbGRSZWd1bGFyV29yayA9IHJlZ3VsYXJXb3JrOwotCQlyZWd1bGFyV29yayA9IG5ld1JlZ3VsYXJXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFR1VMQVJfV09SSywgb2xkUmVndWxhcldvcmssIHJlZ3VsYXJXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nQ29zdCgpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ0Nvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRSZW1haW5pbmdDb3N0ID0gcmVtYWluaW5nQ29zdDsKLQkJcmVtYWluaW5nQ29zdCA9IG5ld1JlbWFpbmluZ0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1QsIG9sZFJlbWFpbmluZ0Nvc3QsIHJlbWFpbmluZ0Nvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSB7Ci0JCXJldHVybiByZW1haW5pbmdPdmVydGltZUNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkUmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlyZW1haW5pbmdPdmVydGltZUNvc3QgPSBuZXdSZW1haW5pbmdPdmVydGltZUNvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1QsIG9sZFJlbWFpbmluZ092ZXJ0aW1lQ29zdCwgcmVtYWluaW5nT3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiByZW1haW5pbmdPdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdSZW1haW5pbmdPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZFJlbWFpbmluZ092ZXJ0aW1lV29yayA9IHJlbWFpbmluZ092ZXJ0aW1lV29yazsKLQkJcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLLCBvbGRSZW1haW5pbmdPdmVydGltZVdvcmssIHJlbWFpbmluZ092ZXJ0aW1lV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ1dvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgbmV3UmVtYWluaW5nV29yaykgewotCQlPYmplY3Qgb2xkUmVtYWluaW5nV29yayA9IHJlbWFpbmluZ1dvcms7Ci0JCXJlbWFpbmluZ1dvcmsgPSBuZXdSZW1haW5pbmdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19XT1JLLCBvbGRSZW1haW5pbmdXb3JrLCByZW1haW5pbmdXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXNwb25zZVBlbmRpbmcoKSB7Ci0JCXJldHVybiByZXNwb25zZVBlbmRpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzcG9uc2VQZW5kaW5nKGJvb2xlYW4gbmV3UmVzcG9uc2VQZW5kaW5nKSB7Ci0JCWJvb2xlYW4gb2xkUmVzcG9uc2VQZW5kaW5nID0gcmVzcG9uc2VQZW5kaW5nOwotCQlyZXNwb25zZVBlbmRpbmcgPSBuZXdSZXNwb25zZVBlbmRpbmc7Ci0JCWJvb2xlYW4gb2xkUmVzcG9uc2VQZW5kaW5nRVNldCA9IHJlc3BvbnNlUGVuZGluZ0VTZXQ7Ci0JCXJlc3BvbnNlUGVuZGluZ0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1BPTlNFX1BFTkRJTkcsIG9sZFJlc3BvbnNlUGVuZGluZywgcmVzcG9uc2VQZW5kaW5nLCAhb2xkUmVzcG9uc2VQZW5kaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVzcG9uc2VQZW5kaW5nKCkgewotCQlib29sZWFuIG9sZFJlc3BvbnNlUGVuZGluZyA9IHJlc3BvbnNlUGVuZGluZzsKLQkJYm9vbGVhbiBvbGRSZXNwb25zZVBlbmRpbmdFU2V0ID0gcmVzcG9uc2VQZW5kaW5nRVNldDsKLQkJcmVzcG9uc2VQZW5kaW5nID0gUkVTUE9OU0VfUEVORElOR19FREVGQVVMVDsKLQkJcmVzcG9uc2VQZW5kaW5nRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTUE9OU0VfUEVORElORywgb2xkUmVzcG9uc2VQZW5kaW5nLCBSRVNQT05TRV9QRU5ESU5HX0VERUZBVUxULCBvbGRSZXNwb25zZVBlbmRpbmdFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXNwb25zZVBlbmRpbmcoKSB7Ci0JCXJldHVybiByZXNwb25zZVBlbmRpbmdFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChPYmplY3QgbmV3U3RhcnQpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0ID0gc3RhcnQ7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlQsIG9sZFN0YXJ0LCBzdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RvcCgpIHsKLQkJcmV0dXJuIHN0b3A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RvcChPYmplY3QgbmV3U3RvcCkgewotCQlPYmplY3Qgb2xkU3RvcCA9IHN0b3A7Ci0JCXN0b3AgPSBuZXdTdG9wOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUT1AsIG9sZFN0b3AsIHN0b3ApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlc3VtZSgpIHsKLQkJcmV0dXJuIHJlc3VtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bWUoT2JqZWN0IG5ld1Jlc3VtZSkgewotCQlPYmplY3Qgb2xkUmVzdW1lID0gcmVzdW1lOwotCQlyZXN1bWUgPSBuZXdSZXN1bWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTVU1FLCBvbGRSZXN1bWUsIHJlc3VtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFN0YXJ0VmFyaWFuY2UoKSB7Ci0JCXJldHVybiBzdGFydFZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0VmFyaWFuY2UoQmlnSW50ZWdlciBuZXdTdGFydFZhcmlhbmNlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkU3RhcnRWYXJpYW5jZSA9IHN0YXJ0VmFyaWFuY2U7Ci0JCXN0YXJ0VmFyaWFuY2UgPSBuZXdTdGFydFZhcmlhbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUX1ZBUklBTkNFLCBvbGRTdGFydFZhcmlhbmNlLCBzdGFydFZhcmlhbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldFVuaXRzKCkgewotCQlyZXR1cm4gdW5pdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5pdHMoZmxvYXQgbmV3VW5pdHMpIHsKLQkJZmxvYXQgb2xkVW5pdHMgPSB1bml0czsKLQkJdW5pdHMgPSBuZXdVbml0czsKLQkJYm9vbGVhbiBvbGRVbml0c0VTZXQgPSB1bml0c0VTZXQ7Ci0JCXVuaXRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVU5JVFMsIG9sZFVuaXRzLCB1bml0cywgIW9sZFVuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VW5pdHMoKSB7Ci0JCWZsb2F0IG9sZFVuaXRzID0gdW5pdHM7Ci0JCWJvb2xlYW4gb2xkVW5pdHNFU2V0ID0gdW5pdHNFU2V0OwotCQl1bml0cyA9IFVOSVRTX0VERUZBVUxUOwotCQl1bml0c0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VOSVRTLCBvbGRVbml0cywgVU5JVFNfRURFRkFVTFQsIG9sZFVuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VW5pdHMoKSB7Ci0JCXJldHVybiB1bml0c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGVOZWVkZWQoKSB7Ci0JCXJldHVybiB1cGRhdGVOZWVkZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlTmVlZGVkKGJvb2xlYW4gbmV3VXBkYXRlTmVlZGVkKSB7Ci0JCWJvb2xlYW4gb2xkVXBkYXRlTmVlZGVkID0gdXBkYXRlTmVlZGVkOwotCQl1cGRhdGVOZWVkZWQgPSBuZXdVcGRhdGVOZWVkZWQ7Ci0JCWJvb2xlYW4gb2xkVXBkYXRlTmVlZGVkRVNldCA9IHVwZGF0ZU5lZWRlZEVTZXQ7Ci0JCXVwZGF0ZU5lZWRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQsIG9sZFVwZGF0ZU5lZWRlZCwgdXBkYXRlTmVlZGVkLCAhb2xkVXBkYXRlTmVlZGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VXBkYXRlTmVlZGVkKCkgewotCQlib29sZWFuIG9sZFVwZGF0ZU5lZWRlZCA9IHVwZGF0ZU5lZWRlZDsKLQkJYm9vbGVhbiBvbGRVcGRhdGVOZWVkZWRFU2V0ID0gdXBkYXRlTmVlZGVkRVNldDsKLQkJdXBkYXRlTmVlZGVkID0gVVBEQVRFX05FRURFRF9FREVGQVVMVDsKLQkJdXBkYXRlTmVlZGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVVBEQVRFX05FRURFRCwgb2xkVXBkYXRlTmVlZGVkLCBVUERBVEVfTkVFREVEX0VERUZBVUxULCBvbGRVcGRhdGVOZWVkZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRVcGRhdGVOZWVkZWQoKSB7Ci0JCXJldHVybiB1cGRhdGVOZWVkZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRWQUMoKSB7Ci0JCXJldHVybiB2QUM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VkFDKGZsb2F0IG5ld1ZBQykgewotCQlmbG9hdCBvbGRWQUMgPSB2QUM7Ci0JCXZBQyA9IG5ld1ZBQzsKLQkJYm9vbGVhbiBvbGRWQUNFU2V0ID0gdkFDRVNldDsKLQkJdkFDRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVkFDLCBvbGRWQUMsIHZBQywgIW9sZFZBQ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFZBQygpIHsKLQkJZmxvYXQgb2xkVkFDID0gdkFDOwotCQlib29sZWFuIG9sZFZBQ0VTZXQgPSB2QUNFU2V0OwotCQl2QUMgPSBWQUNfRURFRkFVTFQ7Ci0JCXZBQ0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1ZBQywgb2xkVkFDLCBWQUNfRURFRkFVTFQsIG9sZFZBQ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFZBQygpIHsKLQkJcmV0dXJuIHZBQ0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRXb3JrKCkgewotCQlyZXR1cm4gd29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrKE9iamVjdCBuZXdXb3JrKSB7Ci0JCU9iamVjdCBvbGRXb3JrID0gd29yazsKLQkJd29yayA9IG5ld1dvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SSywgb2xkV29yaywgd29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFdvcmtDb250b3VyKCkgewotCQlyZXR1cm4gd29ya0NvbnRvdXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya0NvbnRvdXIoQmlnSW50ZWdlciBuZXdXb3JrQ29udG91cikgewotCQlCaWdJbnRlZ2VyIG9sZFdvcmtDb250b3VyID0gd29ya0NvbnRvdXI7Ci0JCXdvcmtDb250b3VyID0gbmV3V29ya0NvbnRvdXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19DT05UT1VSLCBvbGRXb3JrQ29udG91ciwgd29ya0NvbnRvdXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QkNXUyhmbG9hdCBuZXdCQ1dTKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQliQ1dTID0gbmV3QkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUywgb2xkQkNXUywgYkNXUywgIW9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dTKCkgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTID0gQkNXU19FREVGQVVMVDsKLQkJYkNXU0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1MsIG9sZEJDV1MsIEJDV1NfRURFRkFVTFQsIG9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXU0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1AoZmxvYXQgbmV3QkNXUCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYkNXUCA9IG5ld0JDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1AsIG9sZEJDV1AsIGJDV1AsICFvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUCgpIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUCA9IEJDV1BfRURFRkFVTFQ7Ci0JCWJDV1BFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dQLCBvbGRCQ1dQLCBCQ1dQX0VERUZBVUxULCBvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEJvb2tpbmdUeXBlKCkgewotCQlyZXR1cm4gYm9va2luZ1R5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9va2luZ1R5cGUoQmlnSW50ZWdlciBuZXdCb29raW5nVHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZEJvb2tpbmdUeXBlID0gYm9va2luZ1R5cGU7Ci0JCWJvb2tpbmdUeXBlID0gbmV3Qm9va2luZ1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQk9PS0lOR19UWVBFLCBvbGRCb29raW5nVHlwZSwgYm9va2luZ1R5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxXb3JrUHJvdGVjdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0IG5ld0FjdHVhbFdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbFdvcmtQcm90ZWN0ZWQgPSBhY3R1YWxXb3JrUHJvdGVjdGVkOwotCQlhY3R1YWxXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsV29ya1Byb3RlY3RlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SS19QUk9URUNURUQsIG9sZEFjdHVhbFdvcmtQcm90ZWN0ZWQsIGFjdHVhbFdvcmtQcm90ZWN0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0IG5ld0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCkgewotCQlPYmplY3Qgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPSBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVELCBvbGRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQsIGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCkgewotCQlyZXR1cm4gY3JlYXRpb25EYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uRGF0ZShPYmplY3QgbmV3Q3JlYXRpb25EYXRlKSB7Ci0JCU9iamVjdCBvbGRDcmVhdGlvbkRhdGUgPSBjcmVhdGlvbkRhdGU7Ci0JCWNyZWF0aW9uRGF0ZSA9IG5ld0NyZWF0aW9uRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DUkVBVElPTl9EQVRFLCBvbGRDcmVhdGlvbkRhdGUsIGNyZWF0aW9uRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEV4dGVuZGVkQXR0cmlidXRlNC5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEUpOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QmFzZWxpbmUoKSB7Ci0JCWlmIChiYXNlbGluZSA9PSBudWxsKSB7Ci0JCQliYXNlbGluZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChCYXNlbGluZTMuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkFTRUxJTkUpOwotCQl9Ci0JCXJldHVybiBiYXNlbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKSB7Ci0JCWlmICh0aW1lcGhhc2VkRGF0YSA9PSBudWxsKSB7Ci0JCQl0aW1lcGhhc2VkRGF0YSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChUaW1lcGhhc2VkRGF0YVR5cGUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVElNRVBIQVNFRF9EQVRBKTsKLQkJfQotCQlyZXR1cm4gdGltZXBoYXNlZERhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JBU0VMSU5FOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEJhc2VsaW5lKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVElNRVBIQVNFRF9EQVRBOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRpbWVwaGFzZWREYXRhKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RBU0tfVUlEOgotCQkJCXJldHVybiBnZXRUYXNrVUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlEOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZVVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlyZXR1cm4gZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsRmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUks6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1dQOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QUNXUCgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT05GSVJNRUQ6Ci0JCQkJcmV0dXJuIGlzQ29uZmlybWVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1JBVEVfVEFCTEU6Ci0JCQkJcmV0dXJuIGdldENvc3RSYXRlVGFibGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1ZBUklBTkNFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Q29zdFZhcmlhbmNlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NWOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Q1YoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fREVMQVk6Ci0JCQkJcmV0dXJuIGdldERlbGF5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIOgotCQkJCXJldHVybiBnZXRGaW5pc2goKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSU5JU0hfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaFZhcmlhbmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LOgotCQkJCXJldHVybiBnZXRIeXBlcmxpbmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rQWRkcmVzcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRXb3JrVmFyaWFuY2UoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSEFTX0ZJWEVEX1JBVEVfVU5JVFM6Ci0JCQkJcmV0dXJuIGlzSGFzRml4ZWRSYXRlVW5pdHMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklYRURfTUFURVJJQUw6Ci0JCQkJcmV0dXJuIGlzRml4ZWRNYXRlcmlhbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MRVZFTElOR19ERUxBWToKLQkJCQlyZXR1cm4gZ2V0TGV2ZWxpbmdEZWxheSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xJTktFRF9GSUVMRFM6Ci0JCQkJcmV0dXJuIGlzTGlua2VkRmllbGRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX01JTEVTVE9ORToKLQkJCQlyZXR1cm4gaXNNaWxlc3RvbmUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTk9URVM6Ci0JCQkJcmV0dXJuIGdldE5vdGVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUkFMTE9DQVRFRDoKLQkJCQlyZXR1cm4gaXNPdmVyYWxsb2NhdGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFR1VMQVJfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVndWxhcldvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ1dvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HOgotCQkJCXJldHVybiBpc1Jlc3BvbnNlUGVuZGluZygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVE9QOgotCQkJCXJldHVybiBnZXRTdG9wKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTVU1FOgotCQkJCXJldHVybiBnZXRSZXN1bWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVEFSVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gZ2V0U3RhcnRWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VOSVRTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0VW5pdHMoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVVBEQVRFX05FRURFRDoKLQkJCQlyZXR1cm4gaXNVcGRhdGVOZWVkZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVkFDOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0VkFDKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUks6Ci0JCQkJcmV0dXJuIGdldFdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX0NPTlRPVVI6Ci0JCQkJcmV0dXJuIGdldFdvcmtDb250b3VyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1MoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1AoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQk9PS0lOR19UWVBFOgotCQkJCXJldHVybiBnZXRCb29raW5nVHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1JFQVRJT05fREFURToKLQkJCQlyZXR1cm4gZ2V0Q3JlYXRpb25EYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JBU0VMSU5FOgotCQkJCXJldHVybiBnZXRCYXNlbGluZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQToKLQkJCQlyZXR1cm4gZ2V0VGltZXBoYXNlZERhdGEoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RBU0tfVUlEOgotCQkJCXNldFRhc2tVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNPVVJDRV9VSUQ6Ci0JCQkJc2V0UmVzb3VyY2VVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJc2V0UGVyY2VudFdvcmtDb21wbGV0ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9DT1NUOgotCQkJCXNldEFjdHVhbENvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfRklOSVNIOgotCQkJCXNldEFjdHVhbEZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJc2V0QWN0dWFsU3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLOgotCQkJCXNldEFjdHVhbFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDV1A6Ci0JCQkJc2V0QUNXUCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT05GSVJNRUQ6Ci0JCQkJc2V0Q29uZmlybWVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUOgotCQkJCXNldENvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1JBVEVfVEFCTEU6Ci0JCQkJc2V0Q29zdFJhdGVUYWJsZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfVkFSSUFOQ0U6Ci0JCQkJc2V0Q29zdFZhcmlhbmNlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NWOgotCQkJCXNldENWKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0RFTEFZOgotCQkJCXNldERlbGF5KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIOgotCQkJCXNldEZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFOgotCQkJCXNldEZpbmlzaFZhcmlhbmNlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LOgotCQkJCXNldEh5cGVybGluaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rQWRkcmVzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXNldEh5cGVybGlua1N1YkFkZHJlc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJc2V0V29ya1ZhcmlhbmNlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hBU19GSVhFRF9SQVRFX1VOSVRTOgotCQkJCXNldEhhc0ZpeGVkUmF0ZVVuaXRzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSVhFRF9NQVRFUklBTDoKLQkJCQlzZXRGaXhlZE1hdGVyaWFsKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MRVZFTElOR19ERUxBWToKLQkJCQlzZXRMZXZlbGluZ0RlbGF5KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXNldExldmVsaW5nRGVsYXlGb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MSU5LRURfRklFTERTOgotCQkJCXNldExpbmtlZEZpZWxkcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTUlMRVNUT05FOgotCQkJCXNldE1pbGVzdG9uZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTk9URVM6Ci0JCQkJc2V0Tm90ZXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQ6Ci0JCQkJc2V0T3ZlcmFsbG9jYXRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRPdmVydGltZUNvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSVElNRV9XT1JLOgotCQkJCXNldE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVHVUxBUl9XT1JLOgotCQkJCXNldFJlZ3VsYXJXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfV09SSzoKLQkJCQlzZXRSZW1haW5pbmdXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HOgotCQkJCXNldFJlc3BvbnNlUGVuZGluZygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUT1A6Ci0JCQkJc2V0U3RvcCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTVU1FOgotCQkJCXNldFJlc3VtZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlRfVkFSSUFOQ0U6Ci0JCQkJc2V0U3RhcnRWYXJpYW5jZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VOSVRTOgotCQkJCXNldFVuaXRzKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQ6Ci0JCQkJc2V0VXBkYXRlTmVlZGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19WQUM6Ci0JCQkJc2V0VkFDKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUks6Ci0JCQkJc2V0V29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19DT05UT1VSOgotCQkJCXNldFdvcmtDb250b3VyKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUzoKLQkJCQlzZXRCQ1dTKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1A6Ci0JCQkJc2V0QkNXUCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CT09LSU5HX1RZUEU6Ci0JCQkJc2V0Qm9va2luZ1R5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsV29ya1Byb3RlY3RlZCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1JFQVRJT05fREFURToKLQkJCQlzZXRDcmVhdGlvbkRhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQlnZXRCYXNlbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzZWxpbmUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVEFTS19VSUQ6Ci0JCQkJc2V0VGFza1VJRChUQVNLX1VJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU09VUkNFX1VJRDoKLQkJCQlzZXRSZXNvdXJjZVVJRChSRVNPVVJDRV9VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJc2V0UGVyY2VudFdvcmtDb21wbGV0ZShQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KEFDVFVBTF9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX0ZJTklTSDoKLQkJCQlzZXRBY3R1YWxGaW5pc2goQUNUVUFMX0ZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lQ29zdChBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yayhBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9TVEFSVDoKLQkJCQlzZXRBY3R1YWxTdGFydChBQ1RVQUxfU1RBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SSzoKLQkJCQlzZXRBY3R1YWxXb3JrKEFDVFVBTF9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNXUDoKLQkJCQl1bnNldEFDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09ORklSTUVEOgotCQkJCXVuc2V0Q29uZmlybWVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1Q6Ci0JCQkJc2V0Q29zdChDT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9SQVRFX1RBQkxFOgotCQkJCXNldENvc3RSYXRlVGFibGUoQ09TVF9SQVRFX1RBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRToKLQkJCQl1bnNldENvc3RWYXJpYW5jZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DVjoKLQkJCQl1bnNldENWKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0RFTEFZOgotCQkJCXNldERlbGF5KERFTEFZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIOgotCQkJCXNldEZpbmlzaChGSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSU5JU0hfVkFSSUFOQ0U6Ci0JCQkJc2V0RmluaXNoVmFyaWFuY2UoRklOSVNIX1ZBUklBTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LOgotCQkJCXNldEh5cGVybGluayhIWVBFUkxJTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtBZGRyZXNzKEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXNldEh5cGVybGlua1N1YkFkZHJlc3MoSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19WQVJJQU5DRToKLQkJCQl1bnNldFdvcmtWYXJpYW5jZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUzoKLQkJCQl1bnNldEhhc0ZpeGVkUmF0ZVVuaXRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJWEVEX01BVEVSSUFMOgotCQkJCXVuc2V0Rml4ZWRNYXRlcmlhbCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MRVZFTElOR19ERUxBWToKLQkJCQlzZXRMZXZlbGluZ0RlbGF5KExFVkVMSU5HX0RFTEFZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXNldExldmVsaW5nRGVsYXlGb3JtYXQoTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTElOS0VEX0ZJRUxEUzoKLQkJCQl1bnNldExpbmtlZEZpZWxkcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19NSUxFU1RPTkU6Ci0JCQkJdW5zZXRNaWxlc3RvbmUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTk9URVM6Ci0JCQkJc2V0Tm90ZXMoTk9URVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSQUxMT0NBVEVEOgotCQkJCXVuc2V0T3ZlcmFsbG9jYXRlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSVElNRV9DT1NUOgotCQkJCXNldE92ZXJ0aW1lQ29zdChPVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRPdmVydGltZVdvcmsoT1ZFUlRJTUVfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFR1VMQVJfV09SSzoKLQkJCQlzZXRSZWd1bGFyV29yayhSRUdVTEFSX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdDb3N0KFJFTUFJTklOR19DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nV29yayhSRU1BSU5JTkdfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1BPTlNFX1BFTkRJTkc6Ci0JCQkJdW5zZXRSZXNwb25zZVBlbmRpbmcoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoU1RBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVE9QOgotCQkJCXNldFN0b3AoU1RPUF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1VNRToKLQkJCQlzZXRSZXN1bWUoUkVTVU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlRfVkFSSUFOQ0U6Ci0JCQkJc2V0U3RhcnRWYXJpYW5jZShTVEFSVF9WQVJJQU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VOSVRTOgotCQkJCXVuc2V0VW5pdHMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVVBEQVRFX05FRURFRDoKLQkJCQl1bnNldFVwZGF0ZU5lZWRlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19WQUM6Ci0JCQkJdW5zZXRWQUMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SSzoKLQkJCQlzZXRXb3JrKFdPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX0NPTlRPVVI6Ci0JCQkJc2V0V29ya0NvbnRvdXIoV09SS19DT05UT1VSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUzoKLQkJCQl1bnNldEJDV1MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUDoKLQkJCQl1bnNldEJDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQk9PS0lOR19UWVBFOgotCQkJCXNldEJvb2tpbmdUeXBlKEJPT0tJTkdfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1JFQVRJT05fREFURToKLQkJCQlzZXRDcmVhdGlvbkRhdGUoQ1JFQVRJT05fREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JBU0VMSU5FOgotCQkJCWdldEJhc2VsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RBU0tfVUlEOgotCQkJCXJldHVybiBUQVNLX1VJRF9FREVGQVVMVCA9PSBudWxsID8gdGFza1VJRCAhPSBudWxsIDogIVRBU0tfVUlEX0VERUZBVUxULmVxdWFscyh0YXNrVUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNPVVJDRV9VSUQ6Ci0JCQkJcmV0dXJuIFJFU09VUkNFX1VJRF9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VVSUQgIT0gbnVsbCA6ICFSRVNPVVJDRV9VSURfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlVUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIFBFUkNFTlRfV09SS19DT01QTEVURV9FREVGQVVMVCA9PSBudWxsID8gcGVyY2VudFdvcmtDb21wbGV0ZSAhPSBudWxsIDogIVBFUkNFTlRfV09SS19DT01QTEVURV9FREVGQVVMVC5lcXVhbHMocGVyY2VudFdvcmtDb21wbGV0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX0NPU1Q6Ci0JCQkJcmV0dXJuIEFDVFVBTF9DT1NUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxDb3N0ICE9IG51bGwgOiAhQUNUVUFMX0NPU1RfRURFRkFVTFQuZXF1YWxzKGFjdHVhbENvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJcmV0dXJuIEFDVFVBTF9GSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbEZpbmlzaCAhPSBudWxsIDogIUFDVFVBTF9GSU5JU0hfRURFRkFVTFQuZXF1YWxzKGFjdHVhbEZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZUNvc3QgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbE92ZXJ0aW1lV29yayAhPSBudWxsIDogIUFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxULmVxdWFscyhhY3R1YWxPdmVydGltZVdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9TVEFSVDoKLQkJCQlyZXR1cm4gQUNUVUFMX1NUQVJUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxTdGFydCAhPSBudWxsIDogIUFDVFVBTF9TVEFSVF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsU3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLOgotCQkJCXJldHVybiBBQ1RVQUxfV09SS19FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsV29yayAhPSBudWxsIDogIUFDVFVBTF9XT1JLX0VERUZBVUxULmVxdWFscyhhY3R1YWxXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1dQOgotCQkJCXJldHVybiBpc1NldEFDV1AoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT05GSVJNRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0Q29uZmlybWVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVDoKLQkJCQlyZXR1cm4gQ09TVF9FREVGQVVMVCA9PSBudWxsID8gY29zdCAhPSBudWxsIDogIUNPU1RfRURFRkFVTFQuZXF1YWxzKGNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfUkFURV9UQUJMRToKLQkJCQlyZXR1cm4gQ09TVF9SQVRFX1RBQkxFX0VERUZBVUxUID09IG51bGwgPyBjb3N0UmF0ZVRhYmxlICE9IG51bGwgOiAhQ09TVF9SQVRFX1RBQkxFX0VERUZBVUxULmVxdWFscyhjb3N0UmF0ZVRhYmxlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1ZBUklBTkNFOgotCQkJCXJldHVybiBpc1NldENvc3RWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NWOgotCQkJCXJldHVybiBpc1NldENWKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fREVMQVk6Ci0JCQkJcmV0dXJuIERFTEFZX0VERUZBVUxUID09IG51bGwgPyBkZWxheSAhPSBudWxsIDogIURFTEFZX0VERUZBVUxULmVxdWFscyhkZWxheSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIOgotCQkJCXJldHVybiBGSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaCAhPSBudWxsIDogIUZJTklTSF9FREVGQVVMVC5lcXVhbHMoZmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSU5JU0hfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoVmFyaWFuY2UgIT0gbnVsbCA6ICFGSU5JU0hfVkFSSUFOQ0VfRURFRkFVTFQuZXF1YWxzKGZpbmlzaFZhcmlhbmNlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTks6Ci0JCQkJcmV0dXJuIEhZUEVSTElOS19FREVGQVVMVCA9PSBudWxsID8gaHlwZXJsaW5rICE9IG51bGwgOiAhSFlQRVJMSU5LX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19BRERSRVNTOgotCQkJCXJldHVybiBIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCA9PSBudWxsID8gaHlwZXJsaW5rQWRkcmVzcyAhPSBudWxsIDogIUhZUEVSTElOS19BRERSRVNTX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmtBZGRyZXNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJcmV0dXJuIEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCA9PSBudWxsID8gaHlwZXJsaW5rU3ViQWRkcmVzcyAhPSBudWxsIDogIUhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rU3ViQWRkcmVzcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19WQVJJQU5DRToKLQkJCQlyZXR1cm4gaXNTZXRXb3JrVmFyaWFuY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUzoKLQkJCQlyZXR1cm4gaXNTZXRIYXNGaXhlZFJhdGVVbml0cygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJWEVEX01BVEVSSUFMOgotCQkJCXJldHVybiBpc1NldEZpeGVkTWF0ZXJpYWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MRVZFTElOR19ERUxBWToKLQkJCQlyZXR1cm4gTEVWRUxJTkdfREVMQVlfRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsaW5nRGVsYXkgIT0gbnVsbCA6ICFMRVZFTElOR19ERUxBWV9FREVGQVVMVC5lcXVhbHMobGV2ZWxpbmdEZWxheSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXJldHVybiBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsaW5nRGVsYXlGb3JtYXQgIT0gbnVsbCA6ICFMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKGxldmVsaW5nRGVsYXlGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xJTktFRF9GSUVMRFM6Ci0JCQkJcmV0dXJuIGlzU2V0TGlua2VkRmllbGRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTUlMRVNUT05FOgotCQkJCXJldHVybiBpc1NldE1pbGVzdG9uZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX05PVEVTOgotCQkJCXJldHVybiBOT1RFU19FREVGQVVMVCA9PSBudWxsID8gbm90ZXMgIT0gbnVsbCA6ICFOT1RFU19FREVGQVVMVC5lcXVhbHMobm90ZXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQ6Ci0JCQkJcmV0dXJuIGlzU2V0T3ZlcmFsbG9jYXRlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lQ29zdCAhPSBudWxsIDogIU9WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gb3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMob3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRUdVTEFSX1dPUks6Ci0JCQkJcmV0dXJuIFJFR1VMQVJfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVndWxhcldvcmsgIT0gbnVsbCA6ICFSRUdVTEFSX1dPUktfRURFRkFVTFQuZXF1YWxzKHJlZ3VsYXJXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ0Nvc3QgIT0gbnVsbCA6ICFSRU1BSU5JTkdfQ09TVF9FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdPdmVydGltZUNvc3QgIT0gbnVsbCA6ICFSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nT3ZlcnRpbWVDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ092ZXJ0aW1lV29yayAhPSBudWxsIDogIVJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdPdmVydGltZVdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nV29yayAhPSBudWxsIDogIVJFTUFJTklOR19XT1JLX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HOgotCQkJCXJldHVybiBpc1NldFJlc3BvbnNlUGVuZGluZygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUOgotCQkJCXJldHVybiBTVEFSVF9FREVGQVVMVCA9PSBudWxsID8gc3RhcnQgIT0gbnVsbCA6ICFTVEFSVF9FREVGQVVMVC5lcXVhbHMoc3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUT1A6Ci0JCQkJcmV0dXJuIFNUT1BfRURFRkFVTFQgPT0gbnVsbCA/IHN0b3AgIT0gbnVsbCA6ICFTVE9QX0VERUZBVUxULmVxdWFscyhzdG9wKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNVTUU6Ci0JCQkJcmV0dXJuIFJFU1VNRV9FREVGQVVMVCA9PSBudWxsID8gcmVzdW1lICE9IG51bGwgOiAhUkVTVU1FX0VERUZBVUxULmVxdWFscyhyZXN1bWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXJldHVybiBTVEFSVF9WQVJJQU5DRV9FREVGQVVMVCA9PSBudWxsID8gc3RhcnRWYXJpYW5jZSAhPSBudWxsIDogIVNUQVJUX1ZBUklBTkNFX0VERUZBVUxULmVxdWFscyhzdGFydFZhcmlhbmNlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUzoKLQkJCQlyZXR1cm4gaXNTZXRVbml0cygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQ6Ci0JCQkJcmV0dXJuIGlzU2V0VXBkYXRlTmVlZGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVkFDOgotCQkJCXJldHVybiBpc1NldFZBQygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUks6Ci0JCQkJcmV0dXJuIFdPUktfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmsgIT0gbnVsbCA6ICFXT1JLX0VERUZBVUxULmVxdWFscyh3b3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX0NPTlRPVVI6Ci0JCQkJcmV0dXJuIFdPUktfQ09OVE9VUl9FREVGQVVMVCA9PSBudWxsID8gd29ya0NvbnRvdXIgIT0gbnVsbCA6ICFXT1JLX0NPTlRPVVJfRURFRkFVTFQuZXF1YWxzKHdvcmtDb250b3VyKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dTOgotCQkJCXJldHVybiBpc1NldEJDV1MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dQOgotCQkJCXJldHVybiBpc1NldEJDV1AoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CT09LSU5HX1RZUEU6Ci0JCQkJcmV0dXJuIEJPT0tJTkdfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYm9va2luZ1R5cGUgIT0gbnVsbCA6ICFCT09LSU5HX1RZUEVfRURFRkFVTFQuZXF1YWxzKGJvb2tpbmdUeXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsV29ya1Byb3RlY3RlZCAhPSBudWxsIDogIUFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsV29ya1Byb3RlY3RlZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCAhPSBudWxsIDogIUFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DUkVBVElPTl9EQVRFOgotCQkJCXJldHVybiBDUkVBVElPTl9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjcmVhdGlvbkRhdGUgIT0gbnVsbCA6ICFDUkVBVElPTl9EQVRFX0VERUZBVUxULmVxdWFscyhjcmVhdGlvbkRhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGUgIT0gbnVsbCAmJiAhZXh0ZW5kZWRBdHRyaWJ1dGUuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JBU0VMSU5FOgotCQkJCXJldHVybiBiYXNlbGluZSAhPSBudWxsICYmICFiYXNlbGluZS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiB0aW1lcGhhc2VkRGF0YSAhPSBudWxsICYmICF0aW1lcGhhc2VkRGF0YS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdGFza1VJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFza1VJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VVSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc291cmNlVUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwZXJjZW50V29ya0NvbXBsZXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwZXJjZW50V29ya0NvbXBsZXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxGaW5pc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbEZpbmlzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsT3ZlcnRpbWVDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxPdmVydGltZUNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxTdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsU3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbFdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFDV1A6ICIpOwotCQlpZiAoYUNXUEVTZXQpIHJlc3VsdC5hcHBlbmQoYUNXUCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbmZpcm1lZDogIik7Ci0JCWlmIChjb25maXJtZWRFU2V0KSByZXN1bHQuYXBwZW5kKGNvbmZpcm1lZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvc3RSYXRlVGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvc3RSYXRlVGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvc3RWYXJpYW5jZTogIik7Ci0JCWlmIChjb3N0VmFyaWFuY2VFU2V0KSByZXN1bHQuYXBwZW5kKGNvc3RWYXJpYW5jZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNWOiAiKTsKLQkJaWYgKGNWRVNldCkgcmVzdWx0LmFwcGVuZChjVik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlbGF5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWxheSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaFZhcmlhbmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2hWYXJpYW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHlwZXJsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua0FkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua0FkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua1N1YkFkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtWYXJpYW5jZTogIik7Ci0JCWlmICh3b3JrVmFyaWFuY2VFU2V0KSByZXN1bHQuYXBwZW5kKHdvcmtWYXJpYW5jZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhhc0ZpeGVkUmF0ZVVuaXRzOiAiKTsKLQkJaWYgKGhhc0ZpeGVkUmF0ZVVuaXRzRVNldCkgcmVzdWx0LmFwcGVuZChoYXNGaXhlZFJhdGVVbml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpeGVkTWF0ZXJpYWw6ICIpOwotCQlpZiAoZml4ZWRNYXRlcmlhbEVTZXQpIHJlc3VsdC5hcHBlbmQoZml4ZWRNYXRlcmlhbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxldmVsaW5nRGVsYXk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxldmVsaW5nRGVsYXkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxldmVsaW5nRGVsYXlGb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxldmVsaW5nRGVsYXlGb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpbmtlZEZpZWxkczogIik7Ci0JCWlmIChsaW5rZWRGaWVsZHNFU2V0KSByZXN1bHQuYXBwZW5kKGxpbmtlZEZpZWxkcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1pbGVzdG9uZTogIik7Ci0JCWlmIChtaWxlc3RvbmVFU2V0KSByZXN1bHQuYXBwZW5kKG1pbGVzdG9uZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vdGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcmFsbG9jYXRlZDogIik7Ci0JCWlmIChvdmVyYWxsb2NhdGVkRVNldCkgcmVzdWx0LmFwcGVuZChvdmVyYWxsb2NhdGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZUNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWd1bGFyV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVndWxhcldvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ0Nvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ0Nvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ092ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzcG9uc2VQZW5kaW5nOiAiKTsKLQkJaWYgKHJlc3BvbnNlUGVuZGluZ0VTZXQpIHJlc3VsdC5hcHBlbmQocmVzcG9uc2VQZW5kaW5nKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdG9wOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdG9wKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXN1bWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc3VtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhcnRWYXJpYW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnRWYXJpYW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdW5pdHM6ICIpOwotCQlpZiAodW5pdHNFU2V0KSByZXN1bHQuYXBwZW5kKHVuaXRzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXBkYXRlTmVlZGVkOiAiKTsKLQkJaWYgKHVwZGF0ZU5lZWRlZEVTZXQpIHJlc3VsdC5hcHBlbmQodXBkYXRlTmVlZGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdkFDOiAiKTsKLQkJaWYgKHZBQ0VTZXQpIHJlc3VsdC5hcHBlbmQodkFDKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29ya0NvbnRvdXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmtDb250b3VyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dTOiAiKTsKLQkJaWYgKGJDV1NFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dQOiAiKTsKLQkJaWYgKGJDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBib29raW5nVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYm9va2luZ1R5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbFdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjcmVhdGlvbkRhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNyZWF0aW9uRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Fzc2lnbm1lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Bc3NpZ25tZW50c0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Fzc2lnbm1lbnRzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjN2U4MDliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Fzc2lnbm1lbnRzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXNzaWdubWVudHNJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bc3NpZ25tZW50czwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRzSW1wbCNnZXRBc3NpZ25tZW50IDxlbT5Bc3NpZ25tZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXNzaWdubWVudHNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBc3NpZ25tZW50cyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaWdubWVudCgpIDxlbT5Bc3NpZ25tZW50PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhc3NpZ25tZW50ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBc3NpZ25tZW50c0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRBc3NpZ25tZW50cygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBc3NpZ25tZW50KCkgewotCQlpZiAoYXNzaWdubWVudCA9PSBudWxsKSB7Ci0JCQlhc3NpZ25tZW50ID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEFzc2lnbm1lbnQuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQpOwotCQl9Ci0JCXJldHVybiBhc3NpZ25tZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UU19fQVNTSUdOTUVOVDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBc3NpZ25tZW50KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UU19fQVNTSUdOTUVOVDoKLQkJCQlyZXR1cm4gZ2V0QXNzaWdubWVudCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UU19fQVNTSUdOTUVOVDoKLQkJCQlnZXRBc3NpZ25tZW50KCkuY2xlYXIoKTsKLQkJCQlnZXRBc3NpZ25tZW50KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTX19BU1NJR05NRU5UOgotCQkJCWdldEFzc2lnbm1lbnQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTX19BU1NJR05NRU5UOgotCQkJCXJldHVybiBhc3NpZ25tZW50ICE9IG51bGwgJiYgIWFzc2lnbm1lbnQuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9Bc3NpZ25tZW50c0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0F2YWlsYWJpbGl0eVBlcmlvZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0F2YWlsYWJpbGl0eVBlcmlvZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzY1MjMyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9BdmFpbGFiaWxpdHlQZXJpb2RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBdmFpbGFiaWxpdHlQZXJpb2RJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXZhaWxhYmlsaXR5UGVyaW9kSW1wbCNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZEltcGwjZ2V0QXZhaWxhYmxlVG8gPGVtPkF2YWlsYWJsZSBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZEltcGwjZ2V0QXZhaWxhYmxlVW5pdHMgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEF2YWlsYWJpbGl0eVBlcmlvZEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEF2YWlsYWJpbGl0eVBlcmlvZCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZUZyb20oKSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZUZyb20oKSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYXZhaWxhYmxlRnJvbSA9IEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVRvKCkgPGVtPkF2YWlsYWJsZSBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFWQUlMQUJMRV9UT19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFibGVUbygpIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGF2YWlsYWJsZVRvID0gQVZBSUxBQkxFX1RPX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVVuaXRzKCkgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQVZBSUxBQkxFX1VOSVRTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVVuaXRzKCkgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBhdmFpbGFibGVVbml0cyA9IEFWQUlMQUJMRV9VTklUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQXZhaWxhYmxlIFVuaXRzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdmFpbGFibGVVbml0c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBdmFpbGFiaWxpdHlQZXJpb2RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBdmFpbGFibGVGcm9tKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlRnJvbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGVGcm9tKE9iamVjdCBuZXdBdmFpbGFibGVGcm9tKSB7Ci0JCU9iamVjdCBvbGRBdmFpbGFibGVGcm9tID0gYXZhaWxhYmxlRnJvbTsKLQkJYXZhaWxhYmxlRnJvbSA9IG5ld0F2YWlsYWJsZUZyb207Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX0ZST00sIG9sZEF2YWlsYWJsZUZyb20sIGF2YWlsYWJsZUZyb20pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF2YWlsYWJsZVRvKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlVG87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlVG8oT2JqZWN0IG5ld0F2YWlsYWJsZVRvKSB7Ci0JCU9iamVjdCBvbGRBdmFpbGFibGVUbyA9IGF2YWlsYWJsZVRvOwotCQlhdmFpbGFibGVUbyA9IG5ld0F2YWlsYWJsZVRvOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9UTywgb2xkQXZhaWxhYmxlVG8sIGF2YWlsYWJsZVRvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEF2YWlsYWJsZVVuaXRzKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlVW5pdHMoZmxvYXQgbmV3QXZhaWxhYmxlVW5pdHMpIHsKLQkJZmxvYXQgb2xkQXZhaWxhYmxlVW5pdHMgPSBhdmFpbGFibGVVbml0czsKLQkJYXZhaWxhYmxlVW5pdHMgPSBuZXdBdmFpbGFibGVVbml0czsKLQkJYm9vbGVhbiBvbGRBdmFpbGFibGVVbml0c0VTZXQgPSBhdmFpbGFibGVVbml0c0VTZXQ7Ci0JCWF2YWlsYWJsZVVuaXRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTLCBvbGRBdmFpbGFibGVVbml0cywgYXZhaWxhYmxlVW5pdHMsICFvbGRBdmFpbGFibGVVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEF2YWlsYWJsZVVuaXRzKCkgewotCQlmbG9hdCBvbGRBdmFpbGFibGVVbml0cyA9IGF2YWlsYWJsZVVuaXRzOwotCQlib29sZWFuIG9sZEF2YWlsYWJsZVVuaXRzRVNldCA9IGF2YWlsYWJsZVVuaXRzRVNldDsKLQkJYXZhaWxhYmxlVW5pdHMgPSBBVkFJTEFCTEVfVU5JVFNfRURFRkFVTFQ7Ci0JCWF2YWlsYWJsZVVuaXRzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTLCBvbGRBdmFpbGFibGVVbml0cywgQVZBSUxBQkxFX1VOSVRTX0VERUZBVUxULCBvbGRBdmFpbGFibGVVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEF2YWlsYWJsZVVuaXRzKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlVW5pdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfRlJPTToKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmxlRnJvbSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9UTzoKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmxlVG8oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVU5JVFM6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRBdmFpbGFibGVVbml0cygpKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX0ZST006Ci0JCQkJc2V0QXZhaWxhYmxlRnJvbSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1RPOgotCQkJCXNldEF2YWlsYWJsZVRvKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVU5JVFM6Ci0JCQkJc2V0QXZhaWxhYmxlVW5pdHMoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXNldEF2YWlsYWJsZUZyb20oQVZBSUxBQkxFX0ZST01fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVE86Ci0JCQkJc2V0QXZhaWxhYmxlVG8oQVZBSUxBQkxFX1RPX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTOgotCQkJCXVuc2V0QXZhaWxhYmxlVW5pdHMoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfRlJPTToKLQkJCQlyZXR1cm4gQVZBSUxBQkxFX0ZST01fRURFRkFVTFQgPT0gbnVsbCA/IGF2YWlsYWJsZUZyb20gIT0gbnVsbCA6ICFBVkFJTEFCTEVfRlJPTV9FREVGQVVMVC5lcXVhbHMoYXZhaWxhYmxlRnJvbSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1RPOgotCQkJCXJldHVybiBBVkFJTEFCTEVfVE9fRURFRkFVTFQgPT0gbnVsbCA/IGF2YWlsYWJsZVRvICE9IG51bGwgOiAhQVZBSUxBQkxFX1RPX0VERUZBVUxULmVxdWFscyhhdmFpbGFibGVUbyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTOgotCQkJCXJldHVybiBpc1NldEF2YWlsYWJsZVVuaXRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdmFpbGFibGVGcm9tOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdmFpbGFibGVGcm9tKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdmFpbGFibGVUbzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXZhaWxhYmxlVG8pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF2YWlsYWJsZVVuaXRzOiAiKTsKLQkJaWYgKGF2YWlsYWJsZVVuaXRzRVNldCkgcmVzdWx0LmFwcGVuZChhdmFpbGFibGVVbml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BdmFpbGFiaWxpdHlQZXJpb2RJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTNjMjMzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsI2dldEF2YWlsYWJpbGl0eVBlcmlvZCA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBdmFpbGFiaWxpdHlQZXJpb2RzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKSA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhdmFpbGFiaWxpdHlQZXJpb2QgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKSB7Ci0JCWlmIChhdmFpbGFiaWxpdHlQZXJpb2QgPT0gbnVsbCkgewotCQkJYXZhaWxhYmlsaXR5UGVyaW9kID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEF2YWlsYWJpbGl0eVBlcmlvZC5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EU19fQVZBSUxBQklMSVRZX1BFUklPRCk7Ci0JCX0KLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFNfX0FWQUlMQUJJTElUWV9QRVJJT0Q6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EU19fQVZBSUxBQklMSVRZX1BFUklPRDoKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTX19BVkFJTEFCSUxJVFlfUEVSSU9EOgotCQkJCWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpLmNsZWFyKCk7Ci0JCQkJZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTX19BVkFJTEFCSUxJVFlfUEVSSU9EOgotCQkJCWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFNfX0FWQUlMQUJJTElUWV9QRVJJT0Q6Ci0JCQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZCAhPSBudWxsICYmICFhdmFpbGFiaWxpdHlQZXJpb2QuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQmFzZWxpbmUySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQmFzZWxpbmUySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTFkODY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Jhc2VsaW5lMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJhc2VsaW5lMkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzZWxpbmUyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUySW1wbCNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lMkltcGwjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lMkltcGwjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lMkltcGwjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lMkltcGwjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJhc2VsaW5lMkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEJhc2VsaW5lMiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bWJlcigpIDxlbT5OdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE51bWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIE5VTUJFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG51bWJlciA9IE5VTUJFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFdPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHdvcmsgPSBXT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBDT1NUX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGNvc3QgPSBDT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDb3N0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb3N0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dTIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dTRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEJhc2VsaW5lMkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNlbGluZTIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXROdW1iZXIoKSB7Ci0JCXJldHVybiBudW1iZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TnVtYmVyKEJpZ0ludGVnZXIgbmV3TnVtYmVyKSB7Ci0JCUJpZ0ludGVnZXIgb2xkTnVtYmVyID0gbnVtYmVyOwotCQludW1iZXIgPSBuZXdOdW1iZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19OVU1CRVIsIG9sZE51bWJlciwgbnVtYmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRXb3JrKCkgewotCQlyZXR1cm4gd29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrKE9iamVjdCBuZXdXb3JrKSB7Ci0JCU9iamVjdCBvbGRXb3JrID0gd29yazsKLQkJd29yayA9IG5ld1dvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19XT1JLLCBvbGRXb3JrLCB3b3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldENvc3QoKSB7Ci0JCXJldHVybiBjb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3QoZmxvYXQgbmV3Q29zdCkgewotCQlmbG9hdCBvbGRDb3N0ID0gY29zdDsKLQkJY29zdCA9IG5ld0Nvc3Q7Ci0JCWJvb2xlYW4gb2xkQ29zdEVTZXQgPSBjb3N0RVNldDsKLQkJY29zdEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQ09TVCwgb2xkQ29zdCwgY29zdCwgIW9sZENvc3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDb3N0KCkgewotCQlmbG9hdCBvbGRDb3N0ID0gY29zdDsKLQkJYm9vbGVhbiBvbGRDb3N0RVNldCA9IGNvc3RFU2V0OwotCQljb3N0ID0gQ09TVF9FREVGQVVMVDsKLQkJY29zdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQ09TVCwgb2xkQ29zdCwgQ09TVF9FREVGQVVMVCwgb2xkQ29zdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENvc3QoKSB7Ci0JCXJldHVybiBjb3N0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QkNXUyhmbG9hdCBuZXdCQ1dTKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQliQ1dTID0gbmV3QkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dTLCBvbGRCQ1dTLCBiQ1dTLCAhb2xkQkNXU0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1MoKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCQliQ1dTRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1AsIG9sZEJDV1AsIGJDV1AsICFvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUCgpIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUCA9IEJDV1BfRURFRkFVTFQ7Ci0JCWJDV1BFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1AsIG9sZEJDV1AsIEJDV1BfRURFRkFVTFQsIG9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fTlVNQkVSOgotCQkJCXJldHVybiBnZXROdW1iZXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX1dPUks6Ci0JCQkJcmV0dXJuIGdldFdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0NPU1Q6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRDb3N0KCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1MoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dQOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUCgpKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19OVU1CRVI6Ci0JCQkJc2V0TnVtYmVyKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQ09TVDoKLQkJCQlzZXRDb3N0KCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUzoKLQkJCQlzZXRCQ1dTKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUDoKLQkJCQlzZXRCQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoTlVNQkVSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19XT1JLOgotCQkJCXNldFdvcmsoV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQ09TVDoKLQkJCQl1bnNldENvc3QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dTOgotCQkJCXVuc2V0QkNXUygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1A6Ci0JCQkJdW5zZXRCQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19OVU1CRVI6Ci0JCQkJcmV0dXJuIE5VTUJFUl9FREVGQVVMVCA9PSBudWxsID8gbnVtYmVyICE9IG51bGwgOiAhTlVNQkVSX0VERUZBVUxULmVxdWFscyhudW1iZXIpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQ09TVDoKLQkJCQlyZXR1cm4gaXNTZXRDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dTOgotCQkJCXJldHVybiBpc1NldEJDV1MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1A6Ci0JCQkJcmV0dXJuIGlzU2V0QkNXUCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobnVtYmVyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChudW1iZXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvc3Q6ICIpOwotCQlpZiAoY29zdEVTZXQpIHJlc3VsdC5hcHBlbmQoY29zdCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJDV1M6ICIpOwotCQlpZiAoYkNXU0VTZXQpIHJlc3VsdC5hcHBlbmQoYkNXUyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJDV1A6ICIpOwotCQlpZiAoYkNXUEVTZXQpIHJlc3VsdC5hcHBlbmQoYkNXUCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9CYXNlbGluZTJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlNjRjNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQmFzZWxpbmUzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQmFzZWxpbmUzSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlbGluZTNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBCYXNlbGluZTMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTUJFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbnVtYmVyID0gTlVNQkVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFdPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHdvcmsgPSBXT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29zdCA9IENPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUygpIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEJDV1NfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUygpIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJDV1MgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJDV1NFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUCgpIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEJDV1BfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUCgpIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYkNXUCA9IEJDV1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJDV1AgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJDV1BFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmFzZWxpbmUzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEJhc2VsaW5lMygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpIHsKLQkJaWYgKHRpbWVwaGFzZWREYXRhID09IG51bGwpIHsKLQkJCXRpbWVwaGFzZWREYXRhID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRpbWVwaGFzZWREYXRhVHlwZS5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1RJTUVQSEFTRURfREFUQSk7Ci0JCX0KLQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TnVtYmVyKCkgewotCQlyZXR1cm4gbnVtYmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE51bWJlcihTdHJpbmcgbmV3TnVtYmVyKSB7Ci0JCVN0cmluZyBvbGROdW1iZXIgPSBudW1iZXI7Ci0JCW51bWJlciA9IG5ld051bWJlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUiwgb2xkTnVtYmVyLCBudW1iZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoU3RyaW5nIG5ld1N0YXJ0KSB7Ci0JCVN0cmluZyBvbGRTdGFydCA9IHN0YXJ0OwotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fU1RBUlQsIG9sZFN0YXJ0LCBzdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmluaXNoKCkgewotCQlyZXR1cm4gZmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaChTdHJpbmcgbmV3RmluaXNoKSB7Ci0JCVN0cmluZyBvbGRGaW5pc2ggPSBmaW5pc2g7Ci0JCWZpbmlzaCA9IG5ld0ZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdvcmsoKSB7Ci0JCXJldHVybiB3b3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmsoT2JqZWN0IG5ld1dvcmspIHsKLQkJT2JqZWN0IG9sZFdvcmsgPSB3b3JrOwotCQl3b3JrID0gbmV3V29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1dPUkssIG9sZFdvcmssIHdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvc3QoKSB7Ci0JCXJldHVybiBjb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3QoU3RyaW5nIG5ld0Nvc3QpIHsKLQkJU3RyaW5nIG9sZENvc3QgPSBjb3N0OwotCQljb3N0ID0gbmV3Q29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0NPU1QsIG9sZENvc3QsIGNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QkNXUyhmbG9hdCBuZXdCQ1dTKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQliQ1dTID0gbmV3QkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dTLCBvbGRCQ1dTLCBiQ1dTLCAhb2xkQkNXU0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1MoKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCQliQ1dTRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1AsIG9sZEJDV1AsIGJDV1AsICFvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUCgpIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUCA9IEJDV1BfRURFRkFVTFQ7Ci0JCWJDV1BFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1AsIG9sZEJDV1AsIEJDV1BfRURFRkFVTFQsIG9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fVElNRVBIQVNFRF9EQVRBOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRpbWVwaGFzZWREYXRhKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1RJTUVQSEFTRURfREFUQToKLQkJCQlyZXR1cm4gZ2V0VGltZXBoYXNlZERhdGEoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUjoKLQkJCQlyZXR1cm4gZ2V0TnVtYmVyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19DT1NUOgotCQkJCXJldHVybiBnZXRDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dQKCkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fRklOSVNIOgotCQkJCXNldEZpbmlzaCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQ09TVDoKLQkJCQlzZXRDb3N0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1A6Ci0JCQkJc2V0QkNXUCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoTlVNQkVSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19TVEFSVDoKLQkJCQlzZXRTdGFydChTVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fRklOSVNIOgotCQkJCXNldEZpbmlzaChGSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1dPUks6Ci0JCQkJc2V0V29yayhXT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUzoKLQkJCQl1bnNldEJDV1MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dQOgotCQkJCXVuc2V0QkNXUCgpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiB0aW1lcGhhc2VkRGF0YSAhPSBudWxsICYmICF0aW1lcGhhc2VkRGF0YS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19OVU1CRVI6Ci0JCQkJcmV0dXJuIE5VTUJFUl9FREVGQVVMVCA9PSBudWxsID8gbnVtYmVyICE9IG51bGwgOiAhTlVNQkVSX0VERUZBVUxULmVxdWFscyhudW1iZXIpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fU1RBUlQ6Ci0JCQkJcmV0dXJuIFNUQVJUX0VERUZBVUxUID09IG51bGwgPyBzdGFydCAhPSBudWxsIDogIVNUQVJUX0VERUZBVUxULmVxdWFscyhzdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19GSU5JU0g6Ci0JCQkJcmV0dXJuIEZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoICE9IG51bGwgOiAhRklOSVNIX0VERUZBVUxULmVxdWFscyhmaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQ09TVDoKLQkJCQlyZXR1cm4gQ09TVF9FREVGQVVMVCA9PSBudWxsID8gY29zdCAhPSBudWxsIDogIUNPU1RfRURFRkFVTFQuZXF1YWxzKGNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUzoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dQOgotCQkJCXJldHVybiBpc1NldEJDV1AoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG51bWJlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobnVtYmVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dTOiAiKTsKLQkJaWYgKGJDV1NFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dQOiAiKTsKLQkJaWYgKGJDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQmFzZWxpbmUzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQmFzZWxpbmVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzdmNzI3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJhc2VsaW5lSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzZWxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNpc0ludGVyaW0gPGVtPkludGVyaW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldER1cmF0aW9uIDxlbT5EdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmFzZWxpbmVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBCYXNlbGluZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZXBoYXNlZERhdGEoKSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdGltZXBoYXNlZERhdGEgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bWJlcigpIDxlbT5OdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE51bWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIE5VTUJFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG51bWJlciA9IE5VTUJFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ludGVyaW0oKSA8ZW0+SW50ZXJpbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJbnRlcmltKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5URVJJTV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnRlcmltKCkgPGVtPkludGVyaW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW50ZXJpbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW50ZXJpbSA9IElOVEVSSU1fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEludGVyaW0gYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGludGVyaW1FU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydCgpIDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3RhcnQgPSBTVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2goKSA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2goKSA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZmluaXNoID0gRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uKCkgPGVtPkR1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRFVSQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb24oKSA8ZW0+RHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGR1cmF0aW9uID0gRFVSQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdCA9IERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VzdGltYXRlZER1cmF0aW9uKCkgPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVTVElNQVRFRF9EVVJBVElPTl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFc3RpbWF0ZWREdXJhdGlvbigpIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVzdGltYXRlZER1cmF0aW9uID0gRVNUSU1BVEVEX0RVUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFc3RpbWF0ZWQgRHVyYXRpb24gYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVzdGltYXRlZER1cmF0aW9uRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgd29yayA9IFdPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGNvc3QgPSBDT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dTIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dTRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEJhc2VsaW5lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEJhc2VsaW5lKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCkgewotCQlpZiAodGltZXBoYXNlZERhdGEgPT0gbnVsbCkgewotCQkJdGltZXBoYXNlZERhdGEgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGltZXBoYXNlZERhdGFUeXBlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEEpOwotCQl9Ci0JCXJldHVybiB0aW1lcGhhc2VkRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXROdW1iZXIoKSB7Ci0JCXJldHVybiBudW1iZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TnVtYmVyKEJpZ0ludGVnZXIgbmV3TnVtYmVyKSB7Ci0JCUJpZ0ludGVnZXIgb2xkTnVtYmVyID0gbnVtYmVyOwotCQludW1iZXIgPSBuZXdOdW1iZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX05VTUJFUiwgb2xkTnVtYmVyLCBudW1iZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyaW0oKSB7Ci0JCXJldHVybiBpbnRlcmltOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludGVyaW0oYm9vbGVhbiBuZXdJbnRlcmltKSB7Ci0JCWJvb2xlYW4gb2xkSW50ZXJpbSA9IGludGVyaW07Ci0JCWludGVyaW0gPSBuZXdJbnRlcmltOwotCQlib29sZWFuIG9sZEludGVyaW1FU2V0ID0gaW50ZXJpbUVTZXQ7Ci0JCWludGVyaW1FU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fSU5URVJJTSwgb2xkSW50ZXJpbSwgaW50ZXJpbSwgIW9sZEludGVyaW1FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJbnRlcmltKCkgewotCQlib29sZWFuIG9sZEludGVyaW0gPSBpbnRlcmltOwotCQlib29sZWFuIG9sZEludGVyaW1FU2V0ID0gaW50ZXJpbUVTZXQ7Ci0JCWludGVyaW0gPSBJTlRFUklNX0VERUZBVUxUOwotCQlpbnRlcmltRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0lOVEVSSU0sIG9sZEludGVyaW0sIElOVEVSSU1fRURFRkFVTFQsIG9sZEludGVyaW1FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJbnRlcmltKCkgewotCQlyZXR1cm4gaW50ZXJpbUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KE9iamVjdCBuZXdTdGFydCkgewotCQlPYmplY3Qgb2xkU3RhcnQgPSBzdGFydDsKLQkJc3RhcnQgPSBuZXdTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fU1RBUlQsIG9sZFN0YXJ0LCBzdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmluaXNoKCkgewotCQlyZXR1cm4gZmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaChPYmplY3QgbmV3RmluaXNoKSB7Ci0JCU9iamVjdCBvbGRGaW5pc2ggPSBmaW5pc2g7Ci0JCWZpbmlzaCA9IG5ld0ZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRklOSVNILCBvbGRGaW5pc2gsIGZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RHVyYXRpb24oKSB7Ci0JCXJldHVybiBkdXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihPYmplY3QgbmV3RHVyYXRpb24pIHsKLQkJT2JqZWN0IG9sZER1cmF0aW9uID0gZHVyYXRpb247Ci0JCWR1cmF0aW9uID0gbmV3RHVyYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0RVUkFUSU9OLCBvbGREdXJhdGlvbiwgZHVyYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpIHsKLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgbmV3RHVyYXRpb25Gb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGREdXJhdGlvbkZvcm1hdCA9IGR1cmF0aW9uRm9ybWF0OwotCQlkdXJhdGlvbkZvcm1hdCA9IG5ld0R1cmF0aW9uRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTl9GT1JNQVQsIG9sZER1cmF0aW9uRm9ybWF0LCBkdXJhdGlvbkZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXN0aW1hdGVkRHVyYXRpb24oKSB7Ci0JCXJldHVybiBlc3RpbWF0ZWREdXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFc3RpbWF0ZWREdXJhdGlvbihib29sZWFuIG5ld0VzdGltYXRlZER1cmF0aW9uKSB7Ci0JCWJvb2xlYW4gb2xkRXN0aW1hdGVkRHVyYXRpb24gPSBlc3RpbWF0ZWREdXJhdGlvbjsKLQkJZXN0aW1hdGVkRHVyYXRpb24gPSBuZXdFc3RpbWF0ZWREdXJhdGlvbjsKLQkJYm9vbGVhbiBvbGRFc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSBlc3RpbWF0ZWREdXJhdGlvbkVTZXQ7Ci0JCWVzdGltYXRlZER1cmF0aW9uRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0VTVElNQVRFRF9EVVJBVElPTiwgb2xkRXN0aW1hdGVkRHVyYXRpb24sIGVzdGltYXRlZER1cmF0aW9uLCAhb2xkRXN0aW1hdGVkRHVyYXRpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRFc3RpbWF0ZWREdXJhdGlvbigpIHsKLQkJYm9vbGVhbiBvbGRFc3RpbWF0ZWREdXJhdGlvbiA9IGVzdGltYXRlZER1cmF0aW9uOwotCQlib29sZWFuIG9sZEVzdGltYXRlZER1cmF0aW9uRVNldCA9IGVzdGltYXRlZER1cmF0aW9uRVNldDsKLQkJZXN0aW1hdGVkRHVyYXRpb24gPSBFU1RJTUFURURfRFVSQVRJT05fRURFRkFVTFQ7Ci0JCWVzdGltYXRlZER1cmF0aW9uRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0VTVElNQVRFRF9EVVJBVElPTiwgb2xkRXN0aW1hdGVkRHVyYXRpb24sIEVTVElNQVRFRF9EVVJBVElPTl9FREVGQVVMVCwgb2xkRXN0aW1hdGVkRHVyYXRpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFc3RpbWF0ZWREdXJhdGlvbigpIHsKLQkJcmV0dXJuIGVzdGltYXRlZER1cmF0aW9uRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdvcmsoKSB7Ci0JCXJldHVybiB3b3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmsoT2JqZWN0IG5ld1dvcmspIHsKLQkJT2JqZWN0IG9sZFdvcmsgPSB3b3JrOwotCQl3b3JrID0gbmV3V29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fV09SSywgb2xkV29yaywgd29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldENvc3QoKSB7Ci0JCXJldHVybiBjb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3QoQmlnRGVjaW1hbCBuZXdDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQ29zdCA9IGNvc3Q7Ci0JCWNvc3QgPSBuZXdDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19DT1NULCBvbGRDb3N0LCBjb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1MoZmxvYXQgbmV3QkNXUykgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYkNXUyA9IG5ld0JDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXU0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dTLCBvbGRCQ1dTLCBiQ1dTLCAhb2xkQkNXU0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1MoKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCQliQ1dTRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1MsIG9sZEJDV1MsIEJDV1NfRURFRkFVTFQsIG9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXU0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1AoZmxvYXQgbmV3QkNXUCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYkNXUCA9IG5ld0JDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dQLCBvbGRCQ1dQLCBiQ1dQLCAhb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1AoKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCQliQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1AsIG9sZEJDV1AsIEJDV1BfRURFRkFVTFQsIG9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGltZXBoYXNlZERhdGEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIGdldFRpbWVwaGFzZWREYXRhKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX05VTUJFUjoKLQkJCQlyZXR1cm4gZ2V0TnVtYmVyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0lOVEVSSU06Ci0JCQkJcmV0dXJuIGlzSW50ZXJpbSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0RVUkFUSU9OOgotCQkJCXJldHVybiBnZXREdXJhdGlvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0VTVElNQVRFRF9EVVJBVElPTjoKLQkJCQlyZXR1cm4gaXNFc3RpbWF0ZWREdXJhdGlvbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fV09SSzoKLQkJCQlyZXR1cm4gZ2V0V29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19DT1NUOgotCQkJCXJldHVybiBnZXRDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1M6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dTKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dQOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUCgpKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fTlVNQkVSOgotCQkJCXNldE51bWJlcigoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19JTlRFUklNOgotCQkJCXNldEludGVyaW0oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19TVEFSVDoKLQkJCQlzZXRTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTjoKLQkJCQlzZXREdXJhdGlvbigoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT046Ci0JCQkJc2V0RXN0aW1hdGVkRHVyYXRpb24oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19DT1NUOgotCQkJCXNldENvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUzoKLQkJCQlzZXRCQ1dTKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dQOgotCQkJCXNldEJDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fTlVNQkVSOgotCQkJCXNldE51bWJlcihOVU1CRVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fSU5URVJJTToKLQkJCQl1bnNldEludGVyaW0oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1NUQVJUOgotCQkJCXNldFN0YXJ0KFNUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0RVUkFUSU9OOgotCQkJCXNldER1cmF0aW9uKERVUkFUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdChEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRVNUSU1BVEVEX0RVUkFUSU9OOgotCQkJCXVuc2V0RXN0aW1hdGVkRHVyYXRpb24oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1dPUks6Ci0JCQkJc2V0V29yayhXT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0NPU1Q6Ci0JCQkJc2V0Q29zdChDT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1M6Ci0JCQkJdW5zZXRCQ1dTKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dQOgotCQkJCXVuc2V0QkNXUCgpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhICE9IG51bGwgJiYgIXRpbWVwaGFzZWREYXRhLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fTlVNQkVSOgotCQkJCXJldHVybiBOVU1CRVJfRURFRkFVTFQgPT0gbnVsbCA/IG51bWJlciAhPSBudWxsIDogIU5VTUJFUl9FREVGQVVMVC5lcXVhbHMobnVtYmVyKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fSU5URVJJTToKLQkJCQlyZXR1cm4gaXNTZXRJbnRlcmltKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1NUQVJUOgotCQkJCXJldHVybiBTVEFSVF9FREVGQVVMVCA9PSBudWxsID8gc3RhcnQgIT0gbnVsbCA6ICFTVEFSVF9FREVGQVVMVC5lcXVhbHMoc3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19GSU5JU0g6Ci0JCQkJcmV0dXJuIEZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoICE9IG51bGwgOiAhRklOSVNIX0VERUZBVUxULmVxdWFscyhmaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTjoKLQkJCQlyZXR1cm4gRFVSQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uICE9IG51bGwgOiAhRFVSQVRJT05fRURFRkFVTFQuZXF1YWxzKGR1cmF0aW9uKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uRm9ybWF0ICE9IG51bGwgOiAhRFVSQVRJT05fRk9STUFUX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbkZvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0VTVElNQVRFRF9EVVJBVElPTjoKLQkJCQlyZXR1cm4gaXNTZXRFc3RpbWF0ZWREdXJhdGlvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19XT1JLOgotCQkJCXJldHVybiBXT1JLX0VERUZBVUxUID09IG51bGwgPyB3b3JrICE9IG51bGwgOiAhV09SS19FREVGQVVMVC5lcXVhbHMod29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0NPU1Q6Ci0JCQkJcmV0dXJuIENPU1RfRURFRkFVTFQgPT0gbnVsbCA/IGNvc3QgIT0gbnVsbCA6ICFDT1NUX0VERUZBVUxULmVxdWFscyhjb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUzoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1A6Ci0JCQkJcmV0dXJuIGlzU2V0QkNXUCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobnVtYmVyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChudW1iZXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGludGVyaW06ICIpOwotCQlpZiAoaW50ZXJpbUVTZXQpIHJlc3VsdC5hcHBlbmQoaW50ZXJpbSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZHVyYXRpb25Gb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGR1cmF0aW9uRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlc3RpbWF0ZWREdXJhdGlvbjogIik7Ci0JCWlmIChlc3RpbWF0ZWREdXJhdGlvbkVTZXQpIHJlc3VsdC5hcHBlbmQoZXN0aW1hdGVkRHVyYXRpb24pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dTOiAiKTsKLQkJaWYgKGJDV1NFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dQOiAiKTsKLQkJaWYgKGJDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQmFzZWxpbmVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9DYWxlbmRhckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0NhbGVuZGFySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNWM0MGJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0NhbGVuZGFySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ2FsZW5kYXJJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5czsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhbGVuZGFyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQ2FsZW5kYXJJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQ2FsZW5kYXJJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwjaXNJc0Jhc2VDYWxlbmRhciA8ZW0+SXMgQmFzZSBDYWxlbmRhcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFySW1wbCNnZXRCYXNlQ2FsZW5kYXJVSUQgPGVtPkJhc2UgQ2FsZW5kYXIgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQ2FsZW5kYXJJbXBsI2dldFdlZWtEYXlzIDxlbT5XZWVrIERheXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWxlbmRhckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENhbGVuZGFyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0Jhc2VDYWxlbmRhcigpIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfQkFTRV9DQUxFTkRBUl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0Jhc2VDYWxlbmRhcigpIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Jhc2VDYWxlbmRhciA9IElTX0JBU0VfQ0FMRU5EQVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIEJhc2UgQ2FsZW5kYXIgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQmFzZUNhbGVuZGFyRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VDYWxlbmRhclVJRCgpIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZUNhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQkFTRV9DQUxFTkRBUl9VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZUNhbGVuZGFyVUlEKCkgPGVtPkJhc2UgQ2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlQ2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGJhc2VDYWxlbmRhclVJRCA9IEJBU0VfQ0FMRU5EQVJfVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2Vla0RheXMoKSA8ZW0+V2VlayBEYXlzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWVrRGF5cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFdlZWtEYXlzIHdlZWtEYXlzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDYWxlbmRhckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYWxlbmRhcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVJRCgpIHsKLQkJcmV0dXJuIHVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVSUQoQmlnSW50ZWdlciBuZXdVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc0Jhc2VDYWxlbmRhcigpIHsKLQkJcmV0dXJuIGlzQmFzZUNhbGVuZGFyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzQmFzZUNhbGVuZGFyKGJvb2xlYW4gbmV3SXNCYXNlQ2FsZW5kYXIpIHsKLQkJYm9vbGVhbiBvbGRJc0Jhc2VDYWxlbmRhciA9IGlzQmFzZUNhbGVuZGFyOwotCQlpc0Jhc2VDYWxlbmRhciA9IG5ld0lzQmFzZUNhbGVuZGFyOwotCQlib29sZWFuIG9sZElzQmFzZUNhbGVuZGFyRVNldCA9IGlzQmFzZUNhbGVuZGFyRVNldDsKLQkJaXNCYXNlQ2FsZW5kYXJFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fSVNfQkFTRV9DQUxFTkRBUiwgb2xkSXNCYXNlQ2FsZW5kYXIsIGlzQmFzZUNhbGVuZGFyLCAhb2xkSXNCYXNlQ2FsZW5kYXJFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc0Jhc2VDYWxlbmRhcigpIHsKLQkJYm9vbGVhbiBvbGRJc0Jhc2VDYWxlbmRhciA9IGlzQmFzZUNhbGVuZGFyOwotCQlib29sZWFuIG9sZElzQmFzZUNhbGVuZGFyRVNldCA9IGlzQmFzZUNhbGVuZGFyRVNldDsKLQkJaXNCYXNlQ2FsZW5kYXIgPSBJU19CQVNFX0NBTEVOREFSX0VERUZBVUxUOwotCQlpc0Jhc2VDYWxlbmRhckVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19JU19CQVNFX0NBTEVOREFSLCBvbGRJc0Jhc2VDYWxlbmRhciwgSVNfQkFTRV9DQUxFTkRBUl9FREVGQVVMVCwgb2xkSXNCYXNlQ2FsZW5kYXJFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0Jhc2VDYWxlbmRhcigpIHsKLQkJcmV0dXJuIGlzQmFzZUNhbGVuZGFyRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRCYXNlQ2FsZW5kYXJVSUQoKSB7Ci0JCXJldHVybiBiYXNlQ2FsZW5kYXJVSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFzZUNhbGVuZGFyVUlEKEJpZ0ludGVnZXIgbmV3QmFzZUNhbGVuZGFyVUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQmFzZUNhbGVuZGFyVUlEID0gYmFzZUNhbGVuZGFyVUlEOwotCQliYXNlQ2FsZW5kYXJVSUQgPSBuZXdCYXNlQ2FsZW5kYXJVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0JBU0VfQ0FMRU5EQVJfVUlELCBvbGRCYXNlQ2FsZW5kYXJVSUQsIGJhc2VDYWxlbmRhclVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWVrRGF5cyBnZXRXZWVrRGF5cygpIHsKLQkJcmV0dXJuIHdlZWtEYXlzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdlZWtEYXlzKFdlZWtEYXlzIG5ld1dlZWtEYXlzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdlZWtEYXlzIG9sZFdlZWtEYXlzID0gd2Vla0RheXM7Ci0JCXdlZWtEYXlzID0gbmV3V2Vla0RheXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUywgb2xkV2Vla0RheXMsIG5ld1dlZWtEYXlzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWVrRGF5cyhXZWVrRGF5cyBuZXdXZWVrRGF5cykgewotCQlpZiAobmV3V2Vla0RheXMgIT0gd2Vla0RheXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHdlZWtEYXlzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdlZWtEYXlzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdXZWVrRGF5cyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXZWVrRGF5cykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXZWVrRGF5cyhuZXdXZWVrRGF5cywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVMsIG5ld1dlZWtEYXlzLCBuZXdXZWVrRGF5cykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRXZWVrRGF5cyhudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19JU19CQVNFX0NBTEVOREFSOgotCQkJCXJldHVybiBpc0lzQmFzZUNhbGVuZGFyKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19CQVNFX0NBTEVOREFSX1VJRDoKLQkJCQlyZXR1cm4gZ2V0QmFzZUNhbGVuZGFyVUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUzoKLQkJCQlyZXR1cm4gZ2V0V2Vla0RheXMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fSVNfQkFTRV9DQUxFTkRBUjoKLQkJCQlzZXRJc0Jhc2VDYWxlbmRhcigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0JBU0VfQ0FMRU5EQVJfVUlEOgotCQkJCXNldEJhc2VDYWxlbmRhclVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVM6Ci0JCQkJc2V0V2Vla0RheXMoKFdlZWtEYXlzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19JU19CQVNFX0NBTEVOREFSOgotCQkJCXVuc2V0SXNCYXNlQ2FsZW5kYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0JBU0VfQ0FMRU5EQVJfVUlEOgotCQkJCXNldEJhc2VDYWxlbmRhclVJRChCQVNFX0NBTEVOREFSX1VJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVM6Ci0JCQkJc2V0V2Vla0RheXMoKFdlZWtEYXlzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0lTX0JBU0VfQ0FMRU5EQVI6Ci0JCQkJcmV0dXJuIGlzU2V0SXNCYXNlQ2FsZW5kYXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fQkFTRV9DQUxFTkRBUl9VSUQ6Ci0JCQkJcmV0dXJuIEJBU0VfQ0FMRU5EQVJfVUlEX0VERUZBVUxUID09IG51bGwgPyBiYXNlQ2FsZW5kYXJVSUQgIT0gbnVsbCA6ICFCQVNFX0NBTEVOREFSX1VJRF9FREVGQVVMVC5lcXVhbHMoYmFzZUNhbGVuZGFyVUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTOgotCQkJCXJldHVybiB3ZWVrRGF5cyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzQmFzZUNhbGVuZGFyOiAiKTsKLQkJaWYgKGlzQmFzZUNhbGVuZGFyRVNldCkgcmVzdWx0LmFwcGVuZChpc0Jhc2VDYWxlbmRhcik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJhc2VDYWxlbmRhclVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYmFzZUNhbGVuZGFyVUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ2FsZW5kYXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9DYWxlbmRhcnNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9DYWxlbmRhcnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiZTM3MGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQ2FsZW5kYXJzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ2FsZW5kYXJzSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYWxlbmRhcnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhcnNJbXBsI2dldENhbGVuZGFyIDxlbT5DYWxlbmRhcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENhbGVuZGFyc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENhbGVuZGFycyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXIoKSA8ZW0+Q2FsZW5kYXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjYWxlbmRhciA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FsZW5kYXJzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldENhbGVuZGFycygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDYWxlbmRhcigpIHsKLQkJaWYgKGNhbGVuZGFyID09IG51bGwpIHsKLQkJCWNhbGVuZGFyID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KENhbGVuZGFyLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSU19fQ0FMRU5EQVIpOwotCQl9Ci0JCXJldHVybiBjYWxlbmRhcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDYWxlbmRhcigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQlyZXR1cm4gZ2V0Q2FsZW5kYXIoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQlnZXRDYWxlbmRhcigpLmNsZWFyKCk7Ci0JCQkJZ2V0Q2FsZW5kYXIoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQlnZXRDYWxlbmRhcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQlyZXR1cm4gY2FsZW5kYXIgIT0gbnVsbCAmJiAhY2FsZW5kYXIuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9DYWxlbmRhcnNJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmNzg2ZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9jdW1lbnRSb290SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvY3VtZW50IFJvb3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRQcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRSb290SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRG9jdW1lbnRSb290IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaXhlZCgpIDxlbT5NaXhlZDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaXhlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgbWl4ZWQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WE1MTlNQcmVmaXhNYXAoKSA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTWFwIHhNTE5TUHJlZml4TWFwID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkgPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4U0lTY2hlbWFMb2NhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRSb290SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldE1peGVkKCkgewotCQlpZiAobWl4ZWQgPT0gbnVsbCkgewotCQkJbWl4ZWQgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQpOwotCQl9Ci0JCXJldHVybiBtaXhlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU1hcCBnZXRYTUxOU1ByZWZpeE1hcCgpIHsKLQkJaWYgKHhNTE5TUHJlZml4TWFwID09IG51bGwpIHsKLQkJCXhNTE5TUHJlZml4TWFwID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQKTsKLQkJfQotCQlyZXR1cm4geE1MTlNQcmVmaXhNYXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSB7Ci0JCWlmICh4U0lTY2hlbWFMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQl4U0lTY2hlbWFMb2NhdGlvbiA9IG5ldyBFY29yZUVNYXAoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTik7Ci0JCX0KLQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiAoUHJvamVjdClnZXRNaXhlZCgpLmdldChNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfUHJvamVjdCgpLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcm9qZWN0KFByb2plY3QgbmV3UHJvamVjdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmJhc2ljQWRkKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9Qcm9qZWN0KCksIG5ld1Byb2plY3QsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoUHJvamVjdCBuZXdQcm9qZWN0KSB7Ci0JCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X1Byb2plY3QoKSwgbmV3UHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1peGVkKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRYTUxOU1ByZWZpeE1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19QUk9KRUNUOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRQcm9qZWN0KG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCXJldHVybiBnZXRNaXhlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJcmV0dXJuIGdldFhNTE5TUHJlZml4TWFwKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4gZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19QUk9KRUNUOgotCQkJCXJldHVybiBnZXRQcm9qZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKLQkJCQlnZXRNaXhlZCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJZ2V0WE1MTlNQcmVmaXhNYXAoKS5jbGVhcigpOwotCQkJCWdldFhNTE5TUHJlZml4TWFwKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlnZXRYU0lTY2hlbWFMb2NhdGlvbigpLmNsZWFyKCk7Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19QUk9KRUNUOgotCQkJCXNldFByb2plY3QoKFByb2plY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJZ2V0TWl4ZWQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCWdldFhNTE5TUHJlZml4TWFwKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlnZXRYU0lTY2hlbWFMb2NhdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1BST0pFQ1Q6Ci0JCQkJc2V0UHJvamVjdCgoUHJvamVjdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlyZXR1cm4gbWl4ZWQgIT0gbnVsbCAmJiAhbWl4ZWQuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwICE9IG51bGwgJiYgIXhNTE5TUHJlZml4TWFwLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmICF4U0lTY2hlbWFMb2NhdGlvbi5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fUFJPSkVDVDoKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtaXhlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWl4ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Eb2N1bWVudFJvb3RJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4ZmE1ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlMkltcGwjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlMkltcGwjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEF0dHJpYnV0ZTJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFeHRlbmRlZEF0dHJpYnV0ZTIgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZElEID0gRklFTERfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVkFMVUVfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWVJRCA9IFZBTFVFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4dGVuZGVkQXR0cmlidXRlMigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVJRCgpIHsKLQkJcmV0dXJuIHVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVSUQoQmlnSW50ZWdlciBuZXdVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZElEKCkgewotCQlyZXR1cm4gZmllbGRJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZElEKFN0cmluZyBuZXdGaWVsZElEKSB7Ci0JCVN0cmluZyBvbGRGaWVsZElEID0gZmllbGRJRDsKLQkJZmllbGRJRCA9IG5ld0ZpZWxkSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fRklFTERfSUQsIG9sZEZpZWxkSUQsIGZpZWxkSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCkgewotCQlyZXR1cm4gdmFsdWVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgbmV3VmFsdWVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFZhbHVlSUQgPSB2YWx1ZUlEOwotCQl2YWx1ZUlEID0gbmV3VmFsdWVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRV9JRCwgb2xkVmFsdWVJRCwgdmFsdWVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldER1cmF0aW9uRm9ybWF0KCkgewotCQlyZXR1cm4gZHVyYXRpb25Gb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciBuZXdEdXJhdGlvbkZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZER1cmF0aW9uRm9ybWF0ID0gZHVyYXRpb25Gb3JtYXQ7Ci0JCWR1cmF0aW9uRm9ybWF0ID0gbmV3RHVyYXRpb25Gb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fRFVSQVRJT05fRk9STUFULCBvbGREdXJhdGlvbkZvcm1hdCwgZHVyYXRpb25Gb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gZ2V0RmllbGRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBnZXRWYWx1ZUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBnZXREdXJhdGlvbkZvcm1hdCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVUlEOgotCQkJCXNldFVJRChVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKEZJRUxEX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKFZBTFVFX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fRFVSQVRJT05fRk9STUFUOgotCQkJCXNldER1cmF0aW9uRm9ybWF0KERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gRklFTERfSURfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkSUQgIT0gbnVsbCA6ICFGSUVMRF9JRF9FREVGQVVMVC5lcXVhbHMoZmllbGRJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIFZBTFVFX0lEX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZUlEICE9IG51bGwgOiAhVkFMVUVfSURfRURFRkFVTFQuZXF1YWxzKHZhbHVlSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbkZvcm1hdCAhPSBudWxsIDogIURVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMoZHVyYXRpb25Gb3JtYXQpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpZWxkSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZHVyYXRpb25Gb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGR1cmF0aW9uRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OGM4NWY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlM0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlM0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlM0ltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRXh0ZW5kZWRBdHRyaWJ1dGUzIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGRJRCA9IEZJRUxEX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFZBTFVFX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHZhbHVlSUQgPSBWQUxVRV9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0ID0gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4dGVuZGVkQXR0cmlidXRlM0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGRJRCgpIHsKLQkJcmV0dXJuIGZpZWxkSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGRJRChTdHJpbmcgbmV3RmllbGRJRCkgewotCQlTdHJpbmcgb2xkRmllbGRJRCA9IGZpZWxkSUQ7Ci0JCWZpZWxkSUQgPSBuZXdGaWVsZElEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0ZJRUxEX0lELCBvbGRGaWVsZElELCBmaWVsZElEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpIHsKLQkJcmV0dXJuIHZhbHVlSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIG5ld1ZhbHVlSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRWYWx1ZUlEID0gdmFsdWVJRDsKLQkJdmFsdWVJRCA9IG5ld1ZhbHVlSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUVfSUQsIG9sZFZhbHVlSUQsIHZhbHVlSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpIHsKLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgbmV3RHVyYXRpb25Gb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGREdXJhdGlvbkZvcm1hdCA9IGR1cmF0aW9uRm9ybWF0OwotCQlkdXJhdGlvbkZvcm1hdCA9IG5ld0R1cmF0aW9uRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0RVUkFUSU9OX0ZPUk1BVCwgb2xkRHVyYXRpb25Gb3JtYXQsIGR1cmF0aW9uRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRFVSQVRJT05fRk9STUFUOgotCQkJCXNldER1cmF0aW9uRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRChGSUVMRF9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRChWQUxVRV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdChEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1VJRDoKLQkJCQlyZXR1cm4gVUlEX0VERUZBVUxUID09IG51bGwgPyB1SUQgIT0gbnVsbCA6ICFVSURfRURFRkFVTFQuZXF1YWxzKHVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIEZJRUxEX0lEX0VERUZBVUxUID09IG51bGwgPyBmaWVsZElEICE9IG51bGwgOiAhRklFTERfSURfRURFRkFVTFQuZXF1YWxzKGZpZWxkSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBWQUxVRV9JRF9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVJRCAhPSBudWxsIDogIVZBTFVFX0lEX0VERUZBVUxULmVxdWFscyh2YWx1ZUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gZHVyYXRpb25Gb3JtYXQgIT0gbnVsbCA6ICFEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKGR1cmF0aW9uRm9ybWF0KTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZElEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZElEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbkZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0V4dGVuZGVkQXR0cmlidXRlM0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlNEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlNEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWM2MzVjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlNEltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlNEltcGwjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkQXR0cmlidXRlNEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEV4dGVuZGVkQXR0cmlidXRlNCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkSUQgPSBGSUVMRF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBWQUxVRV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB2YWx1ZUlEID0gVkFMVUVfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdCA9IERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkSUQoKSB7Ci0JCXJldHVybiBmaWVsZElEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkSUQoU3RyaW5nIG5ld0ZpZWxkSUQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkSUQgPSBmaWVsZElEOwotCQlmaWVsZElEID0gbmV3RmllbGRJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRCwgb2xkRmllbGRJRCwgZmllbGRJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKSB7Ci0JCXJldHVybiB2YWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciBuZXdWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVJRCA9IHZhbHVlSUQ7Ci0JCXZhbHVlSUQgPSBuZXdWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFX0lELCBvbGRWYWx1ZUlELCB2YWx1ZUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKSB7Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIG5ld0R1cmF0aW9uRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkRHVyYXRpb25Gb3JtYXQgPSBkdXJhdGlvbkZvcm1hdDsKLQkJZHVyYXRpb25Gb3JtYXQgPSBuZXdEdXJhdGlvbkZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19EVVJBVElPTl9GT1JNQVQsIG9sZER1cmF0aW9uRm9ybWF0LCBkdXJhdGlvbkZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBnZXRGaWVsZElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIGdldFZhbHVlSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoRklFTERfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoVkFMVUVfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gVkFMVUVfSURfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlSUQgIT0gbnVsbCA6ICFWQUxVRV9JRF9FREVGQVVMVC5lcXVhbHModmFsdWVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uRm9ybWF0ICE9IG51bGwgOiAhRFVSQVRJT05fRk9STUFUX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbkZvcm1hdCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmllbGRJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGRJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkdXJhdGlvbkZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZHVyYXRpb25Gb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOGI0OWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldEFsaWFzIDxlbT5BbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRSb2xsdXBUeXBlIDxlbT5Sb2xsdXAgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRDYWxjdWxhdGlvblR5cGUgPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjZ2V0Rm9ybXVsYSA8ZW0+Rm9ybXVsYTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNpc1Jlc3RyaWN0VmFsdWVzIDxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjZ2V0VmFsdWVsaXN0U29ydE9yZGVyIDxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNpc0FwcGVuZE5ld1ZhbHVlcyA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjZ2V0RGVmYXVsdCA8ZW0+RGVmYXVsdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRWYWx1ZUxpc3QgPGVtPlZhbHVlIExpc3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEF0dHJpYnV0ZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEV4dGVuZGVkQXR0cmlidXRlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZElEID0gRklFTERfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGROYW1lKCkgPGVtPkZpZWxkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZE5hbWUoKSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkTmFtZSA9IEZJRUxEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWxpYXMoKSA8ZW0+QWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElBU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbGlhcygpIDxlbT5BbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWxpYXMgPSBBTElBU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaG9uZXRpY0FsaWFzKCkgPGVtPlBob25ldGljIEFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9ORVRJQ19BTElBU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaG9uZXRpY0FsaWFzKCkgPGVtPlBob25ldGljIEFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBob25ldGljQWxpYXMgPSBQSE9ORVRJQ19BTElBU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xsdXBUeXBlKCkgPGVtPlJvbGx1cCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xsdXBUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUk9MTFVQX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sbHVwVHlwZSgpIDxlbT5Sb2xsdXAgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sbHVwVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgcm9sbHVwVHlwZSA9IFJPTExVUF9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGN1bGF0aW9uVHlwZSgpIDxlbT5DYWxjdWxhdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxjdWxhdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDQUxDVUxBVElPTl9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGN1bGF0aW9uVHlwZSgpIDxlbT5DYWxjdWxhdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxjdWxhdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGNhbGN1bGF0aW9uVHlwZSA9IENBTENVTEFUSU9OX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rm9ybXVsYSgpIDxlbT5Gb3JtdWxhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGb3JtdWxhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNVUxBX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZvcm11bGEoKSA8ZW0+Rm9ybXVsYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Rm9ybXVsYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtdWxhID0gRk9STVVMQV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Jlc3RyaWN0VmFsdWVzKCkgPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXN0cmljdFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFU1RSSUNUX1ZBTFVFU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXN0cmljdFZhbHVlcygpIDxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlc3RyaWN0VmFsdWVzID0gUkVTVFJJQ1RfVkFMVUVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZXN0cmljdCBWYWx1ZXMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlc3RyaWN0VmFsdWVzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlbGlzdFNvcnRPcmRlcigpIDxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVsaXN0U29ydE9yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVkFMVUVMSVNUX1NPUlRfT1JERVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVsaXN0U29ydE9yZGVyKCkgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHZhbHVlbGlzdFNvcnRPcmRlciA9IFZBTFVFTElTVF9TT1JUX09SREVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXBwZW5kTmV3VmFsdWVzKCkgPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0FwcGVuZE5ld1ZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFQUEVORF9ORVdfVkFMVUVTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FwcGVuZE5ld1ZhbHVlcygpIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFwcGVuZE5ld1ZhbHVlcyA9IEFQUEVORF9ORVdfVkFMVUVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBcHBlbmQgTmV3IFZhbHVlcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXBwZW5kTmV3VmFsdWVzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHQoKSA8ZW0+RGVmYXVsdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0KCkgPGVtPkRlZmF1bHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdF8gPSBERUZBVUxUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVMaXN0KCkgPGVtPlZhbHVlIExpc3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlTGlzdCB2YWx1ZUxpc3QgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4dGVuZGVkQXR0cmlidXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4dGVuZGVkQXR0cmlidXRlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZElEKCkgewotCQlyZXR1cm4gZmllbGRJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZElEKFN0cmluZyBuZXdGaWVsZElEKSB7Ci0JCVN0cmluZyBvbGRGaWVsZElEID0gZmllbGRJRDsKLQkJZmllbGRJRCA9IG5ld0ZpZWxkSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9JRCwgb2xkRmllbGRJRCwgZmllbGRJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgewotCQlyZXR1cm4gZmllbGROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkTmFtZShTdHJpbmcgbmV3RmllbGROYW1lKSB7Ci0JCVN0cmluZyBvbGRGaWVsZE5hbWUgPSBmaWVsZE5hbWU7Ci0JCWZpZWxkTmFtZSA9IG5ld0ZpZWxkTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX05BTUUsIG9sZEZpZWxkTmFtZSwgZmllbGROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbGlhcygpIHsKLQkJcmV0dXJuIGFsaWFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsaWFzKFN0cmluZyBuZXdBbGlhcykgewotCQlTdHJpbmcgb2xkQWxpYXMgPSBhbGlhczsKLQkJYWxpYXMgPSBuZXdBbGlhczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FMSUFTLCBvbGRBbGlhcywgYWxpYXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBob25ldGljQWxpYXMoKSB7Ci0JCXJldHVybiBwaG9uZXRpY0FsaWFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBob25ldGljQWxpYXMoU3RyaW5nIG5ld1Bob25ldGljQWxpYXMpIHsKLQkJU3RyaW5nIG9sZFBob25ldGljQWxpYXMgPSBwaG9uZXRpY0FsaWFzOwotCQlwaG9uZXRpY0FsaWFzID0gbmV3UGhvbmV0aWNBbGlhczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1BIT05FVElDX0FMSUFTLCBvbGRQaG9uZXRpY0FsaWFzLCBwaG9uZXRpY0FsaWFzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Um9sbHVwVHlwZSgpIHsKLQkJcmV0dXJuIHJvbGx1cFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbHVwVHlwZShCaWdJbnRlZ2VyIG5ld1JvbGx1cFR5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRSb2xsdXBUeXBlID0gcm9sbHVwVHlwZTsKLQkJcm9sbHVwVHlwZSA9IG5ld1JvbGx1cFR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ST0xMVVBfVFlQRSwgb2xkUm9sbHVwVHlwZSwgcm9sbHVwVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldENhbGN1bGF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGNhbGN1bGF0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWxjdWxhdGlvblR5cGUoQmlnSW50ZWdlciBuZXdDYWxjdWxhdGlvblR5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRDYWxjdWxhdGlvblR5cGUgPSBjYWxjdWxhdGlvblR5cGU7Ci0JCWNhbGN1bGF0aW9uVHlwZSA9IG5ld0NhbGN1bGF0aW9uVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0NBTENVTEFUSU9OX1RZUEUsIG9sZENhbGN1bGF0aW9uVHlwZSwgY2FsY3VsYXRpb25UeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb3JtdWxhKCkgewotCQlyZXR1cm4gZm9ybXVsYTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JtdWxhKFN0cmluZyBuZXdGb3JtdWxhKSB7Ci0JCVN0cmluZyBvbGRGb3JtdWxhID0gZm9ybXVsYTsKLQkJZm9ybXVsYSA9IG5ld0Zvcm11bGE7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GT1JNVUxBLCBvbGRGb3JtdWxhLCBmb3JtdWxhKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXN0cmljdFZhbHVlcygpIHsKLQkJcmV0dXJuIHJlc3RyaWN0VmFsdWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3RyaWN0VmFsdWVzKGJvb2xlYW4gbmV3UmVzdHJpY3RWYWx1ZXMpIHsKLQkJYm9vbGVhbiBvbGRSZXN0cmljdFZhbHVlcyA9IHJlc3RyaWN0VmFsdWVzOwotCQlyZXN0cmljdFZhbHVlcyA9IG5ld1Jlc3RyaWN0VmFsdWVzOwotCQlib29sZWFuIG9sZFJlc3RyaWN0VmFsdWVzRVNldCA9IHJlc3RyaWN0VmFsdWVzRVNldDsKLQkJcmVzdHJpY3RWYWx1ZXNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JFU1RSSUNUX1ZBTFVFUywgb2xkUmVzdHJpY3RWYWx1ZXMsIHJlc3RyaWN0VmFsdWVzLCAhb2xkUmVzdHJpY3RWYWx1ZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZXN0cmljdFZhbHVlcygpIHsKLQkJYm9vbGVhbiBvbGRSZXN0cmljdFZhbHVlcyA9IHJlc3RyaWN0VmFsdWVzOwotCQlib29sZWFuIG9sZFJlc3RyaWN0VmFsdWVzRVNldCA9IHJlc3RyaWN0VmFsdWVzRVNldDsKLQkJcmVzdHJpY3RWYWx1ZXMgPSBSRVNUUklDVF9WQUxVRVNfRURFRkFVTFQ7Ci0JCXJlc3RyaWN0VmFsdWVzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19SRVNUUklDVF9WQUxVRVMsIG9sZFJlc3RyaWN0VmFsdWVzLCBSRVNUUklDVF9WQUxVRVNfRURFRkFVTFQsIG9sZFJlc3RyaWN0VmFsdWVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzdHJpY3RWYWx1ZXMoKSB7Ci0JCXJldHVybiByZXN0cmljdFZhbHVlc0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsdWVsaXN0U29ydE9yZGVyKCkgewotCQlyZXR1cm4gdmFsdWVsaXN0U29ydE9yZGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlbGlzdFNvcnRPcmRlcihCaWdJbnRlZ2VyIG5ld1ZhbHVlbGlzdFNvcnRPcmRlcikgewotCQlCaWdJbnRlZ2VyIG9sZFZhbHVlbGlzdFNvcnRPcmRlciA9IHZhbHVlbGlzdFNvcnRPcmRlcjsKLQkJdmFsdWVsaXN0U29ydE9yZGVyID0gbmV3VmFsdWVsaXN0U29ydE9yZGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVMSVNUX1NPUlRfT1JERVIsIG9sZFZhbHVlbGlzdFNvcnRPcmRlciwgdmFsdWVsaXN0U29ydE9yZGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcHBlbmROZXdWYWx1ZXMoKSB7Ci0JCXJldHVybiBhcHBlbmROZXdWYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXBwZW5kTmV3VmFsdWVzKGJvb2xlYW4gbmV3QXBwZW5kTmV3VmFsdWVzKSB7Ci0JCWJvb2xlYW4gb2xkQXBwZW5kTmV3VmFsdWVzID0gYXBwZW5kTmV3VmFsdWVzOwotCQlhcHBlbmROZXdWYWx1ZXMgPSBuZXdBcHBlbmROZXdWYWx1ZXM7Ci0JCWJvb2xlYW4gb2xkQXBwZW5kTmV3VmFsdWVzRVNldCA9IGFwcGVuZE5ld1ZhbHVlc0VTZXQ7Ci0JCWFwcGVuZE5ld1ZhbHVlc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQVBQRU5EX05FV19WQUxVRVMsIG9sZEFwcGVuZE5ld1ZhbHVlcywgYXBwZW5kTmV3VmFsdWVzLCAhb2xkQXBwZW5kTmV3VmFsdWVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QXBwZW5kTmV3VmFsdWVzKCkgewotCQlib29sZWFuIG9sZEFwcGVuZE5ld1ZhbHVlcyA9IGFwcGVuZE5ld1ZhbHVlczsKLQkJYm9vbGVhbiBvbGRBcHBlbmROZXdWYWx1ZXNFU2V0ID0gYXBwZW5kTmV3VmFsdWVzRVNldDsKLQkJYXBwZW5kTmV3VmFsdWVzID0gQVBQRU5EX05FV19WQUxVRVNfRURFRkFVTFQ7Ci0JCWFwcGVuZE5ld1ZhbHVlc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQVBQRU5EX05FV19WQUxVRVMsIG9sZEFwcGVuZE5ld1ZhbHVlcywgQVBQRU5EX05FV19WQUxVRVNfRURFRkFVTFQsIG9sZEFwcGVuZE5ld1ZhbHVlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEFwcGVuZE5ld1ZhbHVlcygpIHsKLQkJcmV0dXJuIGFwcGVuZE5ld1ZhbHVlc0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gZGVmYXVsdF87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmV3RGVmYXVsdCkgewotCQlTdHJpbmcgb2xkRGVmYXVsdCA9IGRlZmF1bHRfOwotCQlkZWZhdWx0XyA9IG5ld0RlZmF1bHQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ERUZBVUxULCBvbGREZWZhdWx0LCBkZWZhdWx0XykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYWx1ZUxpc3QgZ2V0VmFsdWVMaXN0KCkgewotCQlyZXR1cm4gdmFsdWVMaXN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFZhbHVlTGlzdChWYWx1ZUxpc3QgbmV3VmFsdWVMaXN0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVZhbHVlTGlzdCBvbGRWYWx1ZUxpc3QgPSB2YWx1ZUxpc3Q7Ci0JCXZhbHVlTGlzdCA9IG5ld1ZhbHVlTGlzdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1QsIG9sZFZhbHVlTGlzdCwgbmV3VmFsdWVMaXN0KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUxpc3QoVmFsdWVMaXN0IG5ld1ZhbHVlTGlzdCkgewotCQlpZiAobmV3VmFsdWVMaXN0ICE9IHZhbHVlTGlzdCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodmFsdWVMaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXZhbHVlTGlzdCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRV9MSVNULCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWx1ZUxpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VmFsdWVMaXN0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1QsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VmFsdWVMaXN0KG5ld1ZhbHVlTGlzdCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVCwgbmV3VmFsdWVMaXN0LCBuZXdWYWx1ZUxpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRV9MSVNUOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRWYWx1ZUxpc3QobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gZ2V0RmllbGRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RmllbGROYW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BTElBUzoKLQkJCQlyZXR1cm4gZ2V0QWxpYXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1BIT05FVElDX0FMSUFTOgotCQkJCXJldHVybiBnZXRQaG9uZXRpY0FsaWFzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ST0xMVVBfVFlQRToKLQkJCQlyZXR1cm4gZ2V0Um9sbHVwVHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQ0FMQ1VMQVRJT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0Q2FsY3VsYXRpb25UeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GT1JNVUxBOgotCQkJCXJldHVybiBnZXRGb3JtdWxhKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19SRVNUUklDVF9WQUxVRVM6Ci0JCQkJcmV0dXJuIGlzUmVzdHJpY3RWYWx1ZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUjoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVsaXN0U29ydE9yZGVyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BUFBFTkRfTkVXX1ZBTFVFUzoKLQkJCQlyZXR1cm4gaXNBcHBlbmROZXdWYWx1ZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ERUZBVUxUOgotCQkJCXJldHVybiBnZXREZWZhdWx0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRV9MSVNUOgotCQkJCXJldHVybiBnZXRWYWx1ZUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX05BTUU6Ci0JCQkJc2V0RmllbGROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FMSUFTOgotCQkJCXNldEFsaWFzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1BIT05FVElDX0FMSUFTOgotCQkJCXNldFBob25ldGljQWxpYXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUk9MTFVQX1RZUEU6Ci0JCQkJc2V0Um9sbHVwVHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQ0FMQ1VMQVRJT05fVFlQRToKLQkJCQlzZXRDYWxjdWxhdGlvblR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZPUk1VTEE6Ci0JCQkJc2V0Rm9ybXVsYSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19SRVNUUklDVF9WQUxVRVM6Ci0JCQkJc2V0UmVzdHJpY3RWYWx1ZXMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVMSVNUX1NPUlRfT1JERVI6Ci0JCQkJc2V0VmFsdWVsaXN0U29ydE9yZGVyKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BUFBFTkRfTkVXX1ZBTFVFUzoKLQkJCQlzZXRBcHBlbmROZXdWYWx1ZXMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fREVGQVVMVDoKLQkJCQlzZXREZWZhdWx0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1Q6Ci0JCQkJc2V0VmFsdWVMaXN0KChWYWx1ZUxpc3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKEZJRUxEX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9OQU1FOgotCQkJCXNldEZpZWxkTmFtZShGSUVMRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BTElBUzoKLQkJCQlzZXRBbGlhcyhBTElBU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJc2V0UGhvbmV0aWNBbGlhcyhQSE9ORVRJQ19BTElBU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUk9MTFVQX1RZUEU6Ci0JCQkJc2V0Um9sbHVwVHlwZShST0xMVVBfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQ0FMQ1VMQVRJT05fVFlQRToKLQkJCQlzZXRDYWxjdWxhdGlvblR5cGUoQ0FMQ1VMQVRJT05fVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRk9STVVMQToKLQkJCQlzZXRGb3JtdWxhKEZPUk1VTEFfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JFU1RSSUNUX1ZBTFVFUzoKLQkJCQl1bnNldFJlc3RyaWN0VmFsdWVzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVMSVNUX1NPUlRfT1JERVI6Ci0JCQkJc2V0VmFsdWVsaXN0U29ydE9yZGVyKFZBTFVFTElTVF9TT1JUX09SREVSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BUFBFTkRfTkVXX1ZBTFVFUzoKLQkJCQl1bnNldEFwcGVuZE5ld1ZhbHVlcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0RFRkFVTFQ6Ci0JCQkJc2V0RGVmYXVsdChERUZBVUxUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRV9MSVNUOgotCQkJCXNldFZhbHVlTGlzdCgoVmFsdWVMaXN0KW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIEZJRUxEX0lEX0VERUZBVUxUID09IG51bGwgPyBmaWVsZElEICE9IG51bGwgOiAhRklFTERfSURfRURFRkFVTFQuZXF1YWxzKGZpZWxkSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfTkFNRToKLQkJCQlyZXR1cm4gRklFTERfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZmllbGROYW1lICE9IG51bGwgOiAhRklFTERfTkFNRV9FREVGQVVMVC5lcXVhbHMoZmllbGROYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FMSUFTOgotCQkJCXJldHVybiBBTElBU19FREVGQVVMVCA9PSBudWxsID8gYWxpYXMgIT0gbnVsbCA6ICFBTElBU19FREVGQVVMVC5lcXVhbHMoYWxpYXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJcmV0dXJuIFBIT05FVElDX0FMSUFTX0VERUZBVUxUID09IG51bGwgPyBwaG9uZXRpY0FsaWFzICE9IG51bGwgOiAhUEhPTkVUSUNfQUxJQVNfRURFRkFVTFQuZXF1YWxzKHBob25ldGljQWxpYXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUk9MTFVQX1RZUEU6Ci0JCQkJcmV0dXJuIFJPTExVUF9UWVBFX0VERUZBVUxUID09IG51bGwgPyByb2xsdXBUeXBlICE9IG51bGwgOiAhUk9MTFVQX1RZUEVfRURFRkFVTFQuZXF1YWxzKHJvbGx1cFR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQ0FMQ1VMQVRJT05fVFlQRToKLQkJCQlyZXR1cm4gQ0FMQ1VMQVRJT05fVFlQRV9FREVGQVVMVCA9PSBudWxsID8gY2FsY3VsYXRpb25UeXBlICE9IG51bGwgOiAhQ0FMQ1VMQVRJT05fVFlQRV9FREVGQVVMVC5lcXVhbHMoY2FsY3VsYXRpb25UeXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZPUk1VTEE6Ci0JCQkJcmV0dXJuIEZPUk1VTEFfRURFRkFVTFQgPT0gbnVsbCA/IGZvcm11bGEgIT0gbnVsbCA6ICFGT1JNVUxBX0VERUZBVUxULmVxdWFscyhmb3JtdWxhKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JFU1RSSUNUX1ZBTFVFUzoKLQkJCQlyZXR1cm4gaXNTZXRSZXN0cmljdFZhbHVlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVMSVNUX1NPUlRfT1JERVI6Ci0JCQkJcmV0dXJuIFZBTFVFTElTVF9TT1JUX09SREVSX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZWxpc3RTb3J0T3JkZXIgIT0gbnVsbCA6ICFWQUxVRUxJU1RfU09SVF9PUkRFUl9FREVGQVVMVC5lcXVhbHModmFsdWVsaXN0U29ydE9yZGVyKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTOgotCQkJCXJldHVybiBpc1NldEFwcGVuZE5ld1ZhbHVlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fREVGQVVMVDoKLQkJCQlyZXR1cm4gREVGQVVMVF9FREVGQVVMVCA9PSBudWxsID8gZGVmYXVsdF8gIT0gbnVsbCA6ICFERUZBVUxUX0VERUZBVUxULmVxdWFscyhkZWZhdWx0Xyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRV9MSVNUOgotCQkJCXJldHVybiB2YWx1ZUxpc3QgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZpZWxkSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpZWxkTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhbGlhczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWxpYXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBob25ldGljQWxpYXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBob25ldGljQWxpYXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJvbGx1cFR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJvbGx1cFR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhbGN1bGF0aW9uVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FsY3VsYXRpb25UeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmb3JtdWxhOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmb3JtdWxhKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXN0cmljdFZhbHVlczogIik7Ci0JCWlmIChyZXN0cmljdFZhbHVlc0VTZXQpIHJlc3VsdC5hcHBlbmQocmVzdHJpY3RWYWx1ZXMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZWxpc3RTb3J0T3JkZXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlbGlzdFNvcnRPcmRlcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXBwZW5kTmV3VmFsdWVzOiAiKTsKLQkJaWYgKGFwcGVuZE5ld1ZhbHVlc0VTZXQpIHJlc3VsdC5hcHBlbmQoYXBwZW5kTmV3VmFsdWVzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdF8pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FeHRlbmRlZEF0dHJpYnV0ZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTA2MDdmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZXNJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZXNJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEF0dHJpYnV0ZXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFeHRlbmRlZEF0dHJpYnV0ZXMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGV4dGVuZGVkQXR0cmlidXRlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeHRlbmRlZEF0dHJpYnV0ZXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV4dGVuZGVkQXR0cmlidXRlKCkgewotCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJZXh0ZW5kZWRBdHRyaWJ1dGUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRXh0ZW5kZWRBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFU19fRVhURU5ERURfQVRUUklCVVRFKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVNfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFU19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVTX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVNfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFU19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZSAhPSBudWxsICYmICFleHRlbmRlZEF0dHJpYnV0ZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0V4dGVuZGVkQXR0cmlidXRlc0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01hc2tJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9NYXNrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YTBmMTA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01hc2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNYXNrSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1hc2tJbXBsI2dldExldmVsIDxlbT5MZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1hc2tJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1hc2tJbXBsI2dldFNlcGFyYXRvciA8ZW0+U2VwYXJhdG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWFza0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1hc2sgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbCgpIDxlbT5MZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRVZFTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbCgpIDxlbT5MZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxldmVsID0gTEVWRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExlbmd0aCgpIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIExFTkdUSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxlbmd0aCA9IExFTkdUSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXBhcmF0b3IoKSA8ZW0+U2VwYXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXBhcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXBhcmF0b3IoKSA8ZW0+U2VwYXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXBhcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VwYXJhdG9yID0gU0VQQVJBVE9SX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1hc2tJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWFzaygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExldmVsKCkgewotCQlyZXR1cm4gbGV2ZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWwoQmlnSW50ZWdlciBuZXdMZXZlbCkgewotCQlCaWdJbnRlZ2VyIG9sZExldmVsID0gbGV2ZWw7Ci0JCWxldmVsID0gbmV3TGV2ZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVWRUwsIG9sZExldmVsLCBsZXZlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoQmlnSW50ZWdlciBuZXdUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKEJpZ0ludGVnZXIgbmV3TGVuZ3RoKSB7Ci0JCUJpZ0ludGVnZXIgb2xkTGVuZ3RoID0gbGVuZ3RoOwotCQlsZW5ndGggPSBuZXdMZW5ndGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVOR1RILCBvbGRMZW5ndGgsIGxlbmd0aCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VwYXJhdG9yKCkgewotCQlyZXR1cm4gc2VwYXJhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcGFyYXRvcihTdHJpbmcgbmV3U2VwYXJhdG9yKSB7Ci0JCVN0cmluZyBvbGRTZXBhcmF0b3IgPSBzZXBhcmF0b3I7Ci0JCXNlcGFyYXRvciA9IG5ld1NlcGFyYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19TRVBBUkFUT1IsIG9sZFNlcGFyYXRvciwgc2VwYXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFVkVMOgotCQkJCXJldHVybiBnZXRMZXZlbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19MRU5HVEg6Ci0JCQkJcmV0dXJuIGdldExlbmd0aCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1NFUEFSQVRPUjoKLQkJCQlyZXR1cm4gZ2V0U2VwYXJhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFVkVMOgotCQkJCXNldExldmVsKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fVFlQRToKLQkJCQlzZXRUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVOR1RIOgotCQkJCXNldExlbmd0aCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1NFUEFSQVRPUjoKLQkJCQlzZXRTZXBhcmF0b3IoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19MRVZFTDoKLQkJCQlzZXRMZXZlbChMRVZFTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVOR1RIOgotCQkJCXNldExlbmd0aChMRU5HVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19TRVBBUkFUT1I6Ci0JCQkJc2V0U2VwYXJhdG9yKFNFUEFSQVRPUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVWRUw6Ci0JCQkJcmV0dXJuIExFVkVMX0VERUZBVUxUID09IG51bGwgPyBsZXZlbCAhPSBudWxsIDogIUxFVkVMX0VERUZBVUxULmVxdWFscyhsZXZlbCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFTkdUSDoKLQkJCQlyZXR1cm4gTEVOR1RIX0VERUZBVUxUID09IG51bGwgPyBsZW5ndGggIT0gbnVsbCA6ICFMRU5HVEhfRURFRkFVTFQuZXF1YWxzKGxlbmd0aCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fU0VQQVJBVE9SOgotCQkJCXJldHVybiBTRVBBUkFUT1JfRURFRkFVTFQgPT0gbnVsbCA/IHNlcGFyYXRvciAhPSBudWxsIDogIVNFUEFSQVRPUl9FREVGQVVMVC5lcXVhbHMoc2VwYXJhdG9yKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxldmVsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGVuZ3RoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZW5ndGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlcGFyYXRvcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2VwYXJhdG9yKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWFza0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01hc2tzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTWFza3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxNTllNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTWFza3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNYXNrc0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hc2tzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTWFza3NJbXBsI2dldE1hc2sgPGVtPk1hc2s8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXNrc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1hc2tzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXNrKCkgPGVtPk1hc2s8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1hc2sgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1hc2tzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE1hc2tzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1hc2soKSB7Ci0JCWlmIChtYXNrID09IG51bGwpIHsKLQkJCW1hc2sgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWFzay5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5NQVNLU19fTUFTSyk7Ci0JCX0KLQkJcmV0dXJuIG1hc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tTX19NQVNLOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1hc2soKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tTX19NQVNLOgotCQkJCXJldHVybiBnZXRNYXNrKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tTX19NQVNLOgotCQkJCWdldE1hc2soKS5jbGVhcigpOwotCQkJCWdldE1hc2soKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1NfX01BU0s6Ci0JCQkJZ2V0TWFzaygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1NfX01BU0s6Ci0JCQkJcmV0dXJuIG1hc2sgIT0gbnVsbCAmJiAhbWFzay5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL01hc2tzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTXNwcm9qZWN0RmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01zcHJvamVjdEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkNGZjNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTXNwcm9qZWN0RmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNDQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNc3Byb2plY3RGYWN0b3J5SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3Nvckxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNc3Byb2plY3RGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIE1zcHJvamVjdEZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVDogcmV0dXJuIGNyZWF0ZUFzc2lnbm1lbnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UUzogcmV0dXJuIGNyZWF0ZUFzc2lnbm1lbnRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRDogcmV0dXJuIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTOiByZXR1cm4gY3JlYXRlQXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FOiByZXR1cm4gY3JlYXRlQmFzZWxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTI6IHJldHVybiBjcmVhdGVCYXNlbGluZTIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTM6IHJldHVybiBjcmVhdGVCYXNlbGluZTMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUjogcmV0dXJuIGNyZWF0ZUNhbGVuZGFyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTOiByZXR1cm4gY3JlYXRlQ2FsZW5kYXJzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVDogcmV0dXJuIGNyZWF0ZURvY3VtZW50Um9vdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTogcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMjogcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTM6IHJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0OiByZXR1cm4gY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFUzogcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0s6IHJldHVybiBjcmVhdGVNYXNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1M6IHJldHVybiBjcmVhdGVNYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTogcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2RlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMjogcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2RlMigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTM6IHJldHVybiBjcmVhdGVPdXRsaW5lQ29kZTMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTOiByZXR1cm4gY3JlYXRlT3V0bGluZUNvZGVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOSzogcmV0dXJuIGNyZWF0ZVByZWRlY2Vzc29yTGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1Q6IHJldHVybiBjcmVhdGVQcm9qZWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURTogcmV0dXJuIGNyZWF0ZVJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFUzogcmV0dXJuIGNyZWF0ZVJhdGVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0U6IHJldHVybiBjcmVhdGVSZXNvdXJjZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFUzogcmV0dXJuIGNyZWF0ZVJlc291cmNlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0s6IHJldHVybiBjcmVhdGVUYXNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS1M6IHJldHVybiBjcmVhdGVUYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EOiByZXR1cm4gY3JlYXRlVGltZVBlcmlvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFOiByZXR1cm4gY3JlYXRlVGltZXBoYXNlZERhdGFUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUU6IHJldHVybiBjcmVhdGVWYWx1ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMjogcmV0dXJuIGNyZWF0ZVZhbHVlMigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1Q6IHJldHVybiBjcmVhdGVWYWx1ZUxpc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVM6IHJldHVybiBjcmVhdGVWYWx1ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTSzogcmV0dXJuIGNyZWF0ZVdCU01hc2soKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1M6IHJldHVybiBjcmVhdGVXQlNNYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZOiByZXR1cm4gY3JlYXRlV2Vla0RheSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZUzogcmV0dXJuIGNyZWF0ZVdlZWtEYXlzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FOiByZXR1cm4gY3JlYXRlV29ya2luZ1RpbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTOiByZXR1cm4gY3JlYXRlV29ya2luZ1RpbWVzKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDQ1JVRV9BVDoKLQkJCQlyZXR1cm4gY3JlYXRlQWNjcnVlQXRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BQ1RJVkVfRElSRUNUT1JZX0dVSURfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BTElBU19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVBbGlhc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVVRIT1JfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQXV0aG9yVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CT09LSU5HX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQm9va2luZ1R5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVCb29raW5nVHlwZVR5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMQ1VMQVRJT05fVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDYWxjdWxhdGlvblR5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FURUdPUllfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ2F0ZWdvcnlUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09ERV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDb2RlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTVBBTllfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcGFueVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT05TVFJBSU5UX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ29uc3RyYWludFR5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OVEFDVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDb250YWN0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPU1RfUkFURV9UQUJMRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDb3N0UmF0ZVRhYmxlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDdXJyZW5jeVN5bWJvbFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EQVlfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVEYXlUeXBlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVEZWZhdWx0VGFza1R5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMjoKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlMkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMzoKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlM0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNDoKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlNEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNToKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlNUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVNQUlMX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRW1haWxBZGRyZXNzVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVSTkFMX1RBU0tfUFJPSkVDVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVGaXhlZENvc3RBY2NydWFsVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZZX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRllTdGFydERhdGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuR1JPVVBfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlR3JvdXBUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRTI6Ci0JCQkJcmV0dXJuIGNyZWF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUyOgotCQkJCXJldHVybiBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rVHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRTI6Ci0JCQkJcmV0dXJuIGNyZWF0ZUh5cGVybGlua1R5cGUyRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSU5JVElBTFNfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlSW5pdGlhbHNUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEFHX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVMYWdGb3JtYXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQU5BR0VSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU1hbmFnZXJUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFURVJJQUxfTEFCRUxfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTWF0ZXJpYWxMYWJlbFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU5hbWVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlTmFtZVR5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMjoKLQkJCQlyZXR1cm4gY3JlYXRlTmFtZVR5cGUyRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMzoKLQkJCQlyZXR1cm4gY3JlYXRlTmFtZVR5cGUzRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVOZXdUYXNrU3RhcnREYXRlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5UX0FDQ09VTlRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTlRBY2NvdW50VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfTlVNQkVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU91dGxpbmVOdW1iZXJUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDX0FMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVBob25ldGljQWxpYXNUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUEhPTkVUSUNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVBob25ldGljc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVGSVhfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlUHJlZml4VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlUmF0ZVRhYmxlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJPTExVUF9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGx1cFR5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNVQkpFQ1RfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU3ViamVjdFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVUJQUk9KRUNUX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU3VicHJvamVjdE5hbWVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElUTEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVGl0bGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVUeXBlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTE6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTI6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlMkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTM6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlM0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTQ6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlNEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlNUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlVJRF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVVSURUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVU5JVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVVbml0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFTElTVF9TT1JUX09SREVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhbHVlbGlzdFNvcnRPcmRlclR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX1NUQVJUX0RBWV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVXZWVrU3RhcnREYXlUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19DT05UT1VSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtDb250b3VyVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtGb3JtYXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19HUk9VUF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVXb3JrR3JvdXBUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDQ1JVRV9BVDoKLQkJCQlyZXR1cm4gY29udmVydEFjY3J1ZUF0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BQ1RJVkVfRElSRUNUT1JZX0dVSURfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEFjdGl2ZURpcmVjdG9yeUdVSURUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BTElBU19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0QWxpYXNUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVVRIT1JfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEF1dGhvclR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CT09LSU5HX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEJvb2tpbmdUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0Qm9va2luZ1R5cGVUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMQ1VMQVRJT05fVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q2FsY3VsYXRpb25UeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FURUdPUllfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENhdGVnb3J5VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09ERV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q29kZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTVBBTllfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENvbXBhbnlUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT05TVFJBSU5UX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENvbnN0cmFpbnRUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OVEFDVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q29udGFjdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPU1RfUkFURV9UQUJMRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q29zdFJhdGVUYWJsZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q3VycmVuY3lTeW1ib2xUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EQVlfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RGF5VHlwZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydERlZmF1bHRUYXNrRVZNZXRob2RUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RGVmYXVsdFRhc2tUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREdXJhdGlvbkZvcm1hdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMjoKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMzoKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTNUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNDoKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNToKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEVhcm5lZFZhbHVlTWV0aG9kVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEVhcm5lZFZhbHVlTWV0aG9kVHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVNQUlMX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEVtYWlsQWRkcmVzc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVSTkFMX1RBU0tfUFJPSkVDVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Rml4ZWRDb3N0QWNjcnVhbFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZZX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEZZU3RhcnREYXRlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuR1JPVVBfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEdyb3VwVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua0FkZHJlc3NUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua0FkZHJlc3NUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRTI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIeXBlcmxpbmtBZGRyZXNzVHlwZTJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUyOgotCQkJCXJldHVybiBjb252ZXJ0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua1R5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRTI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIeXBlcmxpbmtUeXBlMlRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSU5JVElBTFNfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEluaXRpYWxzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEFHX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TGFnRm9ybWF0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQU5BR0VSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNYW5hZ2VyVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFURVJJQUxfTEFCRUxfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE1hdGVyaWFsTGFiZWxUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnROYW1lVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydE5hbWVUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMjoKLQkJCQlyZXR1cm4gY29udmVydE5hbWVUeXBlMlRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMzoKLQkJCQlyZXR1cm4gY29udmVydE5hbWVUeXBlM1RvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TmV3VGFza1N0YXJ0RGF0ZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5UX0FDQ09VTlRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE5UQWNjb3VudFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfTlVNQkVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRPdXRsaW5lTnVtYmVyVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDX0FMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRQaG9uZXRpY0FsaWFzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUEhPTkVUSUNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRQaG9uZXRpY3NUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVGSVhfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFByZWZpeFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFJhdGVUYWJsZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJPTExVUF9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSb2xsdXBUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNVQkpFQ1RfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFN1YmplY3RUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVUJQUk9KRUNUX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFN1YnByb2plY3ROYW1lVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElUTEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFRpdGxlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VHlwZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTE6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTM6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTNUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTQ6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlVJRF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VUlEVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVU5JVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VW5pdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFTElTVF9TT1JUX09SREVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX1NUQVJUX0RBWV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0V2Vla1N0YXJ0RGF5VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19DT05UT1VSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRXb3JrQ29udG91clR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRXb3JrRm9ybWF0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19HUk9VUF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0V29ya0dyb3VwVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXNzaWdubWVudCBjcmVhdGVBc3NpZ25tZW50KCkgewotCQlBc3NpZ25tZW50SW1wbCBhc3NpZ25tZW50ID0gbmV3IEFzc2lnbm1lbnRJbXBsKCk7Ci0JCXJldHVybiBhc3NpZ25tZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBc3NpZ25tZW50cyBjcmVhdGVBc3NpZ25tZW50cygpIHsKLQkJQXNzaWdubWVudHNJbXBsIGFzc2lnbm1lbnRzID0gbmV3IEFzc2lnbm1lbnRzSW1wbCgpOwotCQlyZXR1cm4gYXNzaWdubWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEF2YWlsYWJpbGl0eVBlcmlvZCBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2QoKSB7Ci0JCUF2YWlsYWJpbGl0eVBlcmlvZEltcGwgYXZhaWxhYmlsaXR5UGVyaW9kID0gbmV3IEF2YWlsYWJpbGl0eVBlcmlvZEltcGwoKTsKLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXZhaWxhYmlsaXR5UGVyaW9kcyBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2RzKCkgewotCQlBdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCBhdmFpbGFiaWxpdHlQZXJpb2RzID0gbmV3IEF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsKCk7Ci0JCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCYXNlbGluZSBjcmVhdGVCYXNlbGluZSgpIHsKLQkJQmFzZWxpbmVJbXBsIGJhc2VsaW5lID0gbmV3IEJhc2VsaW5lSW1wbCgpOwotCQlyZXR1cm4gYmFzZWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJhc2VsaW5lMiBjcmVhdGVCYXNlbGluZTIoKSB7Ci0JCUJhc2VsaW5lMkltcGwgYmFzZWxpbmUyID0gbmV3IEJhc2VsaW5lMkltcGwoKTsKLQkJcmV0dXJuIGJhc2VsaW5lMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmFzZWxpbmUzIGNyZWF0ZUJhc2VsaW5lMygpIHsKLQkJQmFzZWxpbmUzSW1wbCBiYXNlbGluZTMgPSBuZXcgQmFzZWxpbmUzSW1wbCgpOwotCQlyZXR1cm4gYmFzZWxpbmUzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYWxlbmRhciBjcmVhdGVDYWxlbmRhcigpIHsKLQkJQ2FsZW5kYXJJbXBsIGNhbGVuZGFyID0gbmV3IENhbGVuZGFySW1wbCgpOwotCQlyZXR1cm4gY2FsZW5kYXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhbGVuZGFycyBjcmVhdGVDYWxlbmRhcnMoKSB7Ci0JCUNhbGVuZGFyc0ltcGwgY2FsZW5kYXJzID0gbmV3IENhbGVuZGFyc0ltcGwoKTsKLQkJcmV0dXJuIGNhbGVuZGFyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRSb290IGNyZWF0ZURvY3VtZW50Um9vdCgpIHsKLQkJRG9jdW1lbnRSb290SW1wbCBkb2N1bWVudFJvb3QgPSBuZXcgRG9jdW1lbnRSb290SW1wbCgpOwotCQlyZXR1cm4gZG9jdW1lbnRSb290OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEF0dHJpYnV0ZSBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLQkJRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsIGV4dGVuZGVkQXR0cmlidXRlID0gbmV3IEV4dGVuZGVkQXR0cmlidXRlSW1wbCgpOwotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4dGVuZGVkQXR0cmlidXRlMiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTIoKSB7Ci0JCUV4dGVuZGVkQXR0cmlidXRlMkltcGwgZXh0ZW5kZWRBdHRyaWJ1dGUyID0gbmV3IEV4dGVuZGVkQXR0cmlidXRlMkltcGwoKTsKLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRBdHRyaWJ1dGUzIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMygpIHsKLQkJRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCBleHRlbmRlZEF0dHJpYnV0ZTMgPSBuZXcgRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCgpOwotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGUzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEF0dHJpYnV0ZTQgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0KCkgewotCQlFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsIGV4dGVuZGVkQXR0cmlidXRlNCA9IG5ldyBFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsKCk7Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4dGVuZGVkQXR0cmlidXRlcyBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZXMoKSB7Ci0JCUV4dGVuZGVkQXR0cmlidXRlc0ltcGwgZXh0ZW5kZWRBdHRyaWJ1dGVzID0gbmV3IEV4dGVuZGVkQXR0cmlidXRlc0ltcGwoKTsKLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFzayBjcmVhdGVNYXNrKCkgewotCQlNYXNrSW1wbCBtYXNrID0gbmV3IE1hc2tJbXBsKCk7Ci0JCXJldHVybiBtYXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNYXNrcyBjcmVhdGVNYXNrcygpIHsKLQkJTWFza3NJbXBsIG1hc2tzID0gbmV3IE1hc2tzSW1wbCgpOwotCQlyZXR1cm4gbWFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGxpbmVDb2RlIGNyZWF0ZU91dGxpbmVDb2RlKCkgewotCQlPdXRsaW5lQ29kZUltcGwgb3V0bGluZUNvZGUgPSBuZXcgT3V0bGluZUNvZGVJbXBsKCk7Ci0JCXJldHVybiBvdXRsaW5lQ29kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0bGluZUNvZGUyIGNyZWF0ZU91dGxpbmVDb2RlMigpIHsKLQkJT3V0bGluZUNvZGUySW1wbCBvdXRsaW5lQ29kZTIgPSBuZXcgT3V0bGluZUNvZGUySW1wbCgpOwotCQlyZXR1cm4gb3V0bGluZUNvZGUyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPdXRsaW5lQ29kZTMgY3JlYXRlT3V0bGluZUNvZGUzKCkgewotCQlPdXRsaW5lQ29kZTNJbXBsIG91dGxpbmVDb2RlMyA9IG5ldyBPdXRsaW5lQ29kZTNJbXBsKCk7Ci0JCXJldHVybiBvdXRsaW5lQ29kZTM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGxpbmVDb2RlcyBjcmVhdGVPdXRsaW5lQ29kZXMoKSB7Ci0JCU91dGxpbmVDb2Rlc0ltcGwgb3V0bGluZUNvZGVzID0gbmV3IE91dGxpbmVDb2Rlc0ltcGwoKTsKLQkJcmV0dXJuIG91dGxpbmVDb2RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaW5rIGNyZWF0ZVByZWRlY2Vzc29yTGluaygpIHsKLQkJUHJlZGVjZXNzb3JMaW5rSW1wbCBwcmVkZWNlc3NvckxpbmsgPSBuZXcgUHJlZGVjZXNzb3JMaW5rSW1wbCgpOwotCQlyZXR1cm4gcHJlZGVjZXNzb3JMaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9qZWN0IGNyZWF0ZVByb2plY3QoKSB7Ci0JCVByb2plY3RJbXBsIHByb2plY3QgPSBuZXcgUHJvamVjdEltcGwoKTsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJhdGUgY3JlYXRlUmF0ZSgpIHsKLQkJUmF0ZUltcGwgcmF0ZSA9IG5ldyBSYXRlSW1wbCgpOwotCQlyZXR1cm4gcmF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmF0ZXMgY3JlYXRlUmF0ZXMoKSB7Ci0JCVJhdGVzSW1wbCByYXRlcyA9IG5ldyBSYXRlc0ltcGwoKTsKLQkJcmV0dXJuIHJhdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZSgpIHsKLQkJUmVzb3VyY2VJbXBsIHJlc291cmNlID0gbmV3IFJlc291cmNlSW1wbCgpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlcyBjcmVhdGVSZXNvdXJjZXMoKSB7Ci0JCVJlc291cmNlc0ltcGwgcmVzb3VyY2VzID0gbmV3IFJlc291cmNlc0ltcGwoKTsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFzayBjcmVhdGVUYXNrKCkgewotCQlUYXNrSW1wbCB0YXNrID0gbmV3IFRhc2tJbXBsKCk7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrcyBjcmVhdGVUYXNrcygpIHsKLQkJVGFza3NJbXBsIHRhc2tzID0gbmV3IFRhc2tzSW1wbCgpOwotCQlyZXR1cm4gdGFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRpbWVQZXJpb2QgY3JlYXRlVGltZVBlcmlvZCgpIHsKLQkJVGltZVBlcmlvZEltcGwgdGltZVBlcmlvZCA9IG5ldyBUaW1lUGVyaW9kSW1wbCgpOwotCQlyZXR1cm4gdGltZVBlcmlvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGltZXBoYXNlZERhdGFUeXBlIGNyZWF0ZVRpbWVwaGFzZWREYXRhVHlwZSgpIHsKLQkJVGltZXBoYXNlZERhdGFUeXBlSW1wbCB0aW1lcGhhc2VkRGF0YVR5cGUgPSBuZXcgVGltZXBoYXNlZERhdGFUeXBlSW1wbCgpOwotCQlyZXR1cm4gdGltZXBoYXNlZERhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYWx1ZSBjcmVhdGVWYWx1ZSgpIHsKLQkJVmFsdWVJbXBsIHZhbHVlID0gbmV3IFZhbHVlSW1wbCgpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhbHVlMiBjcmVhdGVWYWx1ZTIoKSB7Ci0JCVZhbHVlMkltcGwgdmFsdWUyID0gbmV3IFZhbHVlMkltcGwoKTsKLQkJcmV0dXJuIHZhbHVlMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFsdWVMaXN0IGNyZWF0ZVZhbHVlTGlzdCgpIHsKLQkJVmFsdWVMaXN0SW1wbCB2YWx1ZUxpc3QgPSBuZXcgVmFsdWVMaXN0SW1wbCgpOwotCQlyZXR1cm4gdmFsdWVMaXN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYWx1ZXMgY3JlYXRlVmFsdWVzKCkgewotCQlWYWx1ZXNJbXBsIHZhbHVlcyA9IG5ldyBWYWx1ZXNJbXBsKCk7Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdCU01hc2sgY3JlYXRlV0JTTWFzaygpIHsKLQkJV0JTTWFza0ltcGwgd2JzTWFzayA9IG5ldyBXQlNNYXNrSW1wbCgpOwotCQlyZXR1cm4gd2JzTWFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV0JTTWFza3MgY3JlYXRlV0JTTWFza3MoKSB7Ci0JCVdCU01hc2tzSW1wbCB3YnNNYXNrcyA9IG5ldyBXQlNNYXNrc0ltcGwoKTsKLQkJcmV0dXJuIHdic01hc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWVrRGF5IGNyZWF0ZVdlZWtEYXkoKSB7Ci0JCVdlZWtEYXlJbXBsIHdlZWtEYXkgPSBuZXcgV2Vla0RheUltcGwoKTsKLQkJcmV0dXJuIHdlZWtEYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlZWtEYXlzIGNyZWF0ZVdlZWtEYXlzKCkgewotCQlXZWVrRGF5c0ltcGwgd2Vla0RheXMgPSBuZXcgV2Vla0RheXNJbXBsKCk7Ci0JCXJldHVybiB3ZWVrRGF5czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya2luZ1RpbWUgY3JlYXRlV29ya2luZ1RpbWUoKSB7Ci0JCVdvcmtpbmdUaW1lSW1wbCB3b3JraW5nVGltZSA9IG5ldyBXb3JraW5nVGltZUltcGwoKTsKLQkJcmV0dXJuIHdvcmtpbmdUaW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JraW5nVGltZXMgY3JlYXRlV29ya2luZ1RpbWVzKCkgewotCQlXb3JraW5nVGltZXNJbXBsIHdvcmtpbmdUaW1lcyA9IG5ldyBXb3JraW5nVGltZXNJbXBsKCk7Ci0JCXJldHVybiB3b3JraW5nVGltZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlQWNjcnVlQXRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0QWNjcnVlQXRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVBbGlhc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEFsaWFzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVBdXRob3JUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRBdXRob3JUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUJvb2tpbmdUeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRCb29raW5nVHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVCb29raW5nVHlwZVR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEJvb2tpbmdUeXBlVHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVDYWxjdWxhdGlvblR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydENhbGN1bGF0aW9uVHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUNhdGVnb3J5VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q2F0ZWdvcnlUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUNvZGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb2RlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVDb21wYW55VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q29tcGFueVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUNvbnN0cmFpbnRUeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb25zdHJhaW50VHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUNvbnRhY3RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb250YWN0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlQ29zdFJhdGVUYWJsZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q29zdFJhdGVUYWJsZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlQ3VycmVuY3lTeW1ib2xUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDdXJyZW5jeVN5bWJvbFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZURheVR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERheVR5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZURlZmF1bHRUYXNrRVZNZXRob2RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERlZmF1bHRUYXNrRVZNZXRob2RUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRGVmYXVsdFRhc2tUeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREZWZhdWx0VGFza1R5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydER1cmF0aW9uRm9ybWF0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTJGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlMlRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTNGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlM1RvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlNFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlNVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFYXJuZWRWYWx1ZU1ldGhvZFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVhcm5lZFZhbHVlTWV0aG9kVHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUVtYWlsQWRkcmVzc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVtYWlsQWRkcmVzc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEV4dGVybmFsVGFza1Byb2plY3RUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUZpeGVkQ29zdEFjY3J1YWxUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRGaXhlZENvc3RBY2NydWFsVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRllTdGFydERhdGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEZZU3RhcnREYXRlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlR3JvdXBUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRHcm91cFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua0FkZHJlc3NUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rQWRkcmVzc1R5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rQWRkcmVzc1R5cGUyVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMlRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua1R5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtUeXBlMkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rVHlwZTJUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSW5pdGlhbHNUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJbml0aWFsc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUxhZ0Zvcm1hdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TGFnRm9ybWF0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydExldmVsaW5nRGVsYXlGb3JtYXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydExldmVsaW5nRGVsYXlGb3JtYXRUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTWFuYWdlclR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE1hbmFnZXJUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU1hdGVyaWFsTGFiZWxUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNYXRlcmlhbExhYmVsVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVOYW1lVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TmFtZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZVR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZVR5cGUyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVHlwZTJUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZVR5cGUzRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVHlwZTNUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZU5ld1Rhc2tTdGFydERhdGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE5ld1Rhc2tTdGFydERhdGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVOVEFjY291bnRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROVEFjY291bnRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU91dGxpbmVOdW1iZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRPdXRsaW5lTnVtYmVyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRPdmVydGltZVJhdGVGb3JtYXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVBob25ldGljQWxpYXNUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQaG9uZXRpY0FsaWFzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVQaG9uZXRpY3NUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQaG9uZXRpY3NUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVByZWZpeFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFByZWZpeFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVJhdGVUYWJsZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0UmF0ZVRhYmxlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVJvbGx1cFR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJvbGx1cFR5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVN1YmplY3RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdWJqZWN0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVTdWJwcm9qZWN0TmFtZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFN1YnByb2plY3ROYW1lVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVUaXRsZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRpdGxlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVHlwZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVUeXBlVHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHlwZVR5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVHlwZVR5cGUyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFR5cGVUeXBlMlRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVR5cGVUeXBlM0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUeXBlVHlwZTNUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVUeXBlVHlwZTRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHlwZVR5cGU0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVHlwZVR5cGU1RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFR5cGVUeXBlNVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlVUlEVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VUlEVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVW5pdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VW5pdFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlbGlzdFNvcnRPcmRlclR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVXZWVrU3RhcnREYXlUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFdlZWtTdGFydERheVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVXb3JrQ29udG91clR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya0NvbnRvdXJUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlV29ya0Zvcm1hdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya0Zvcm1hdFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVXb3JrR3JvdXBUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFdvcmtHcm91cFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXNwcm9qZWN0UGFja2FnZSBnZXRNc3Byb2plY3RQYWNrYWdlKCkgewotCQlyZXR1cm4gKE1zcHJvamVjdFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTXNwcm9qZWN0UGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vTXNwcm9qZWN0RmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01zcHJvamVjdFBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Nc3Byb2plY3RQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTUyNzI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01zcHJvamVjdFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0UGFja2FnZUltcGwuamF2YSx2IDEuNCAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5FY29yZVJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLmltcGwuWE1MVHlwZVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsLk1zcHJvamVjdFZhbGlkYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNc3Byb2plY3RQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIE1zcHJvamVjdFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFja2FnZUZpbGVuYW1lID0gIm1zcHJvamVjdC5lY29yZSI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhc3NpZ25tZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFzc2lnbm1lbnRzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGF2YWlsYWJpbGl0eVBlcmlvZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhdmFpbGFiaWxpdHlQZXJpb2RzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJhc2VsaW5lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJhc2VsaW5lMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBiYXNlbGluZTNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2FsZW5kYXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2FsZW5kYXJzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRvY3VtZW50Um9vdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBleHRlbmRlZEF0dHJpYnV0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBleHRlbmRlZEF0dHJpYnV0ZTJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXh0ZW5kZWRBdHRyaWJ1dGUzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4dGVuZGVkQXR0cmlidXRlNEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBleHRlbmRlZEF0dHJpYnV0ZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWFza0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtYXNrc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvdXRsaW5lQ29kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvdXRsaW5lQ29kZTJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3V0bGluZUNvZGUzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG91dGxpbmVDb2Rlc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcmVkZWNlc3NvckxpbmtFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvamVjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByYXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJhdGVzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlc291cmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlc291cmNlc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhc2tzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRpbWVQZXJpb2RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGltZXBoYXNlZERhdGFUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHZhbHVlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHZhbHVlMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB2YWx1ZUxpc3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdmFsdWVzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdic01hc2tFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2JzTWFza3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2Vla0RheUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3ZWVrRGF5c0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JraW5nVGltZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JraW5nVGltZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgYWNjcnVlQXRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgYWxpYXNUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGF1dGhvclR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgYm9va2luZ1R5cGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGJvb2tpbmdUeXBlVHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgY2FsY3VsYXRpb25UeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjYXRlZ29yeVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgY29kZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgY29tcGFueVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgY29uc3RyYWludFR5cGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNvbnRhY3RUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNvc3RSYXRlVGFibGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGN1cnJlbmN5U3ltYm9sVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkYXlUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZGVmYXVsdFRhc2tFVk1ldGhvZFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZGVmYXVsdFRhc2tUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkdXJhdGlvbkZvcm1hdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZHVyYXRpb25Gb3JtYXRUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkdXJhdGlvbkZvcm1hdFR5cGUyRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGR1cmF0aW9uRm9ybWF0VHlwZTNFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZHVyYXRpb25Gb3JtYXRUeXBlNEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkdXJhdGlvbkZvcm1hdFR5cGU1RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGVhcm5lZFZhbHVlTWV0aG9kVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBlYXJuZWRWYWx1ZU1ldGhvZFR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGVtYWlsQWRkcmVzc1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZml4ZWRDb3N0QWNjcnVhbFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZnlTdGFydERhdGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGdyb3VwVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtBZGRyZXNzVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtBZGRyZXNzVHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rQWRkcmVzc1R5cGUyRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtUeXBlMkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBpbml0aWFsc1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbGFnRm9ybWF0VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbWFuYWdlclR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbWF0ZXJpYWxMYWJlbFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbmFtZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbmFtZVR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG5hbWVUeXBlMkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBuYW1lVHlwZTNFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbmV3VGFza1N0YXJ0RGF0ZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbnRBY2NvdW50VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBvdXRsaW5lTnVtYmVyVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBvdmVydGltZVJhdGVGb3JtYXRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHBob25ldGljQWxpYXNUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHBob25ldGljc1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgcHJlZml4VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSByYXRlVGFibGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHJvbGx1cFR5cGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc3ViamVjdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc3VicHJvamVjdE5hbWVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHRpdGxlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0eXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0eXBlVHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHlwZVR5cGUyRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHR5cGVUeXBlM0VEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0eXBlVHlwZTRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHlwZVR5cGU1RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHVpZFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdW5pdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdmFsdWVsaXN0U29ydE9yZGVyVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB3ZWVrU3RhcnREYXlUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHdvcmtDb250b3VyVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB3b3JrRm9ybWF0VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB3b3JrR3JvdXBUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTXNwcm9qZWN0UGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIE1zcHJvamVjdEZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1zcHJvamVjdFBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKE1zcHJvamVjdFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCU1zcHJvamVjdFBhY2thZ2VJbXBsIHRoZU1zcHJvamVjdFBhY2thZ2UgPSAoTXNwcm9qZWN0UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgTXNwcm9qZWN0UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBNc3Byb2plY3RQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCVhNTFR5cGVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gTG9hZCBwYWNrYWdlcwotCQl0aGVNc3Byb2plY3RQYWNrYWdlLmxvYWRQYWNrYWdlKCk7Ci0KLQkJLy8gRml4IGxvYWRlZCBwYWNrYWdlcwotCQl0aGVNc3Byb2plY3RQYWNrYWdlLmZpeFBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIFJlZ2lzdGVyIHBhY2thZ2UgdmFsaWRhdG9yCi0JCUVWYWxpZGF0b3IuUmVnaXN0cnkuSU5TVEFOQ0UucHV0Ci0JCQkodGhlTXNwcm9qZWN0UGFja2FnZSwgCi0JCQkgbmV3IEVWYWxpZGF0b3IuRGVzY3JpcHRvcigpIHsKLQkJCQkgcHVibGljIEVWYWxpZGF0b3IgZ2V0RVZhbGlkYXRvcigpIHsKLQkJCQkJIHJldHVybiBNc3Byb2plY3RWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JCQkJIH0KLQkJCSB9KTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZU1zcHJvamVjdFBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZU1zcHJvamVjdFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBc3NpZ25tZW50KCkgewotCQlpZiAoYXNzaWdubWVudEVDbGFzcyA9PSBudWxsKSB7Ci0JCQlhc3NpZ25tZW50RUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzKTsKLQkJfQotCQlyZXR1cm4gYXNzaWdubWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfVGFza1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVzb3VyY2VVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1BlcmNlbnRXb3JrQ29tcGxldGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbENvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbEZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxPdmVydGltZVdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbFN0YXJ0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BQ1dQKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29uZmlybWVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0Nvc3RSYXRlVGFibGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Db3N0VmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9DVigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0RlbGF5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfRmluaXNoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfRmluaXNoVmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IeXBlcmxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IeXBlcmxpbmtBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfSHlwZXJsaW5rU3ViQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1dvcmtWYXJpYW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0hhc0ZpeGVkUmF0ZVVuaXRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfRml4ZWRNYXRlcmlhbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0xldmVsaW5nRGVsYXkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9MZXZlbGluZ0RlbGF5Rm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTGlua2VkRmllbGRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTWlsZXN0b25lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTm90ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9PdmVyYWxsb2NhdGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVndWxhcldvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZW1haW5pbmdDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Jlc3BvbnNlUGVuZGluZygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0YXJ0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfU3RvcCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Jlc3VtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0YXJ0VmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Vbml0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1VwZGF0ZU5lZWRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1ZBQygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrQ29udG91cigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0JDV1MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9CQ1dQKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQm9va2luZ1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxXb3JrUHJvdGVjdGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ3JlYXRpb25EYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFzc2lnbm1lbnRfRXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXNzaWdubWVudF9CYXNlbGluZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50X1RpbWVwaGFzZWREYXRhKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXNzaWdubWVudHMoKSB7Ci0JCWlmIChhc3NpZ25tZW50c0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlhc3NpZ25tZW50c0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNCk7Ci0JCX0KLQkJcmV0dXJuIGFzc2lnbm1lbnRzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFzc2lnbm1lbnRzX0Fzc2lnbm1lbnQoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRBc3NpZ25tZW50cygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKSB7Ci0JCWlmIChhdmFpbGFiaWxpdHlQZXJpb2RFQ2xhc3MgPT0gbnVsbCkgewotCQkJYXZhaWxhYmlsaXR5UGVyaW9kRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2KTsKLQkJfQotCQlyZXR1cm4gYXZhaWxhYmlsaXR5UGVyaW9kRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVGcm9tKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlVG8oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVVbml0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkgewotCQlpZiAoYXZhaWxhYmlsaXR5UGVyaW9kc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlhdmFpbGFiaWxpdHlQZXJpb2RzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3KTsKLQkJfQotCQlyZXR1cm4gYXZhaWxhYmlsaXR5UGVyaW9kc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RzX0F2YWlsYWJpbGl0eVBlcmlvZCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldEF2YWlsYWJpbGl0eVBlcmlvZHMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QmFzZWxpbmUoKSB7Ci0JCWlmIChiYXNlbGluZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQliYXNlbGluZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOCk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VsaW5lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJhc2VsaW5lX1RpbWVwaGFzZWREYXRhKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0QmFzZWxpbmUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lX051bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9JbnRlcmltKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lX1N0YXJ0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lX0ZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9EdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9EdXJhdGlvbkZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9Fc3RpbWF0ZWREdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9Xb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lX0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfQkNXUygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfQkNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCYXNlbGluZTIoKSB7Ci0JCWlmIChiYXNlbGluZTJFQ2xhc3MgPT0gbnVsbCkgewotCQkJYmFzZWxpbmUyRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg5KTsKLQkJfQotCQlyZXR1cm4gYmFzZWxpbmUyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9OdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9Xb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUyX0JDV1MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9CQ1dQKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJhc2VsaW5lMygpIHsKLQkJaWYgKGJhc2VsaW5lM0VDbGFzcyA9PSBudWxsKSB7Ci0JCQliYXNlbGluZTNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEwKTsKLQkJfQotCQlyZXR1cm4gYmFzZWxpbmUzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJhc2VsaW5lM19UaW1lcGhhc2VkRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX051bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX1N0YXJ0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfRmluaXNoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lM19CQ1dTKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfQkNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDYWxlbmRhcigpIHsKLQkJaWYgKGNhbGVuZGFyRUNsYXNzID09IG51bGwpIHsKLQkJCWNhbGVuZGFyRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxNSk7Ci0JCX0KLQkJcmV0dXJuIGNhbGVuZGFyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENhbGVuZGFyX1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldENhbGVuZGFyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9OYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0Q2FsZW5kYXIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENhbGVuZGFyX0lzQmFzZUNhbGVuZGFyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0Q2FsZW5kYXIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENhbGVuZGFyX0Jhc2VDYWxlbmRhclVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldENhbGVuZGFyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDYWxlbmRhcl9XZWVrRGF5cygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldENhbGVuZGFyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENhbGVuZGFycygpIHsKLQkJaWYgKGNhbGVuZGFyc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQljYWxlbmRhcnNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDE2KTsKLQkJfQotCQlyZXR1cm4gY2FsZW5kYXJzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENhbGVuZGFyc19DYWxlbmRhcigpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldENhbGVuZGFycygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREb2N1bWVudFJvb3QoKSB7Ci0JCWlmIChkb2N1bWVudFJvb3RFQ2xhc3MgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRSb290RUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgyOSk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50Um9vdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREb2N1bWVudFJvb3RfTWl4ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXREb2N1bWVudFJvb3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldERvY3VtZW50Um9vdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0RG9jdW1lbnRSb290KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfUHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldERvY3VtZW50Um9vdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlRUNsYXNzID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzOSk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0ZpZWxkSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRmllbGROYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0FsaWFzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX1Bob25ldGljQWxpYXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUm9sbHVwVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9DYWxjdWxhdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRm9ybXVsYSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9SZXN0cmljdFZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9WYWx1ZWxpc3RTb3J0T3JkZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQXBwZW5kTmV3VmFsdWVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0RlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEV4dGVuZGVkQXR0cmlidXRlX1ZhbHVlTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZTJFQ2xhc3MgPT0gbnVsbCkgewotCQkJZXh0ZW5kZWRBdHRyaWJ1dGUyRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0MCk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfRmllbGRJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfVmFsdWVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX0R1cmF0aW9uRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4dGVuZGVkQXR0cmlidXRlMygpIHsKLQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlM0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZTNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQxKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGUzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19GaWVsZElEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19WYWx1ZUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfRHVyYXRpb25Gb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkgewotCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGU0RUNsYXNzID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlNEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDIpOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlNCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X0ZpZWxkSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9WYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlNCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1ZhbHVlSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9EdXJhdGlvbkZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlNCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJZXh0ZW5kZWRBdHRyaWJ1dGVzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0Myk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZXNfRXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWFzaygpIHsKLQkJaWYgKG1hc2tFQ2xhc3MgPT0gbnVsbCkgewotCQkJbWFza0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjIpOwotCQl9Ci0JCXJldHVybiBtYXNrRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1hc2tfTGV2ZWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRNYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNYXNrX1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRNYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNYXNrX0xlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE1hc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1hc2tfU2VwYXJhdG9yKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0TWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNYXNrcygpIHsKLQkJaWYgKG1hc2tzRUNsYXNzID09IG51bGwpIHsKLQkJCW1hc2tzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2Myk7Ci0JCX0KLQkJcmV0dXJuIG1hc2tzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1hc2tzX01hc2soKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRNYXNrcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPdXRsaW5lQ29kZSgpIHsKLQkJaWYgKG91dGxpbmVDb2RlRUNsYXNzID09IG51bGwpIHsKLQkJCW91dGxpbmVDb2RlRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3MSk7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVDb2RlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0ZpZWxkSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGVfRmllbGROYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0FsaWFzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX1Bob25ldGljQWxpYXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0T3V0bGluZUNvZGVfVmFsdWVzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0VudGVycHJpc2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGVfRW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGVfUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0xlYWZPbmx5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0FsbExldmVsc1JlcXVpcmVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE91dGxpbmVDb2RlX01hc2tzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE91dGxpbmVDb2RlMigpIHsKLQkJaWYgKG91dGxpbmVDb2RlMkVDbGFzcyA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZTJFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDcyKTsKLQkJfQotCQlyZXR1cm4gb3V0bGluZUNvZGUyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlMl9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlMl9GaWVsZElEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfVmFsdWVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPdXRsaW5lQ29kZTMoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZTNFQ2xhc3MgPT0gbnVsbCkgewotCQkJb3V0bGluZUNvZGUzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3Myk7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVDb2RlM0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTNfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTNfRmllbGRJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUzX1ZhbHVlSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0bGluZUNvZGVzKCkgewotCQlpZiAob3V0bGluZUNvZGVzRUNsYXNzID09IG51bGwpIHsKLQkJCW91dGxpbmVDb2Rlc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzQpOwotCQl9Ci0JCXJldHVybiBvdXRsaW5lQ29kZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0T3V0bGluZUNvZGVzX091dGxpbmVDb2RlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0T3V0bGluZUNvZGVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByZWRlY2Vzc29yTGluaygpIHsKLQkJaWYgKHByZWRlY2Vzc29yTGlua0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvckxpbmtFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDgwKTsKLQkJfQotCQlyZXR1cm4gcHJlZGVjZXNzb3JMaW5rRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19QcmVkZWNlc3NvclVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByZWRlY2Vzc29yTGluaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJlZGVjZXNzb3JMaW5rX1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcmVkZWNlc3NvckxpbmsoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19Dcm9zc1Byb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcmVkZWNlc3NvckxpbmsoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19Dcm9zc1Byb2plY3ROYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJlZGVjZXNzb3JMaW5rKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfTGlua0xhZygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByZWRlY2Vzc29yTGluaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJlZGVjZXNzb3JMaW5rX0xhZ0Zvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByZWRlY2Vzc29yTGluaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9qZWN0KCkgewotCQlpZiAocHJvamVjdEVDbGFzcyA9PSBudWxsKSB7Ci0JCQlwcm9qZWN0RUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4Mik7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1RpdGxlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TdWJqZWN0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DYXRlZ29yeSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ29tcGFueSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQXV0aG9yKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DcmVhdGlvbkRhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1JldmlzaW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9MYXN0U2F2ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TY2hlZHVsZUZyb21TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1N0YXJ0RGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0ZpbmlzaERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9GWVN0YXJ0RGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NyaXRpY2FsU2xhY2tMaW1pdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbmN5RGlnaXRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ3VycmVuY3lTeW1ib2woKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ2FsZW5kYXJVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0U3RhcnRUaW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdEZpbmlzaFRpbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9NaW51dGVzUGVyRGF5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTWludXRlc1BlcldlZWsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EYXlzUGVyTW9udGgoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0VGFza1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0RlZmF1bHRTdGFuZGFyZFJhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0T3ZlcnRpbWVSYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRHVyYXRpb25Gb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Xb3JrRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRWRpdGFibGVBY3R1YWxDb3N0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0hvbm9yQ29uc3RyYWludHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9FYXJuZWRWYWx1ZU1ldGhvZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X011bHRpcGxlQ3JpdGljYWxQYXRocygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTmV3VGFza3NFc3RpbWF0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TcGxpdHNJblByb2dyZXNzVGFza3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TcHJlYWRBY3R1YWxDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU3ByZWFkUGVyY2VudENvbXBsZXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfVGFza1VwZGF0ZXNSZXNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0Zpc2NhbFllYXJTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1dlZWtTdGFydERheSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01vdmVDb21wbGV0ZWRFbmRzQmFjaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9CYXNlbGluZUZvckVhcm5lZFZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU3RhdHVzRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbnREYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dG9saW5rKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTmV3VGFza1N0YXJ0RGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0RlZmF1bHRUYXNrRVZNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Qcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0V4dGVuZGVkQ3JlYXRpb25EYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQWN0dWFsc0luU3luYygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQWRtaW5Qcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2plY3RfT3V0bGluZUNvZGVzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2plY3RfV0JTTWFza3MoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvamVjdF9FeHRlbmRlZEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvamVjdF9DYWxlbmRhcnMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvamVjdF9UYXNrcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9qZWN0X1Jlc291cmNlcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9qZWN0X0Fzc2lnbm1lbnRzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmF0ZSgpIHsKLQkJaWYgKHJhdGVFQ2xhc3MgPT0gbnVsbCkgewotCQkJcmF0ZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoODMpOwotCQl9Ci0JCXJldHVybiByYXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfUmF0ZXNGcm9tKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmF0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmF0ZV9SYXRlc1RvKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmF0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmF0ZV9SYXRlVGFibGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSYXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSYXRlX1N0YW5kYXJkUmF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfU3RhbmRhcmRSYXRlRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmF0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmF0ZV9PdmVydGltZVJhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSYXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSYXRlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfQ29zdFBlclVzZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmF0ZXMoKSB7Ci0JCWlmIChyYXRlc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlyYXRlc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoODQpOwotCQl9Ci0JCXJldHVybiByYXRlc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSYXRlc19SYXRlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UmF0ZXMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVzb3VyY2UoKSB7Ci0JCWlmIChyZXNvdXJjZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoODYpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0lzTnVsbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jbml0aWFscygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9QaG9uZXRpY3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfTlRBY2NvdW50KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX01hdGVyaWFsTGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Hcm91cCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfV29ya0dyb3VwKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9FbWFpbEFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0h5cGVybGluaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSHlwZXJsaW5rQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSHlwZXJsaW5rU3ViQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfTWF4VW5pdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1BlYWtVbml0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfT3ZlckFsbG9jYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQXZhaWxhYmxlRnJvbSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQXZhaWxhYmxlVG8oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1N0YXJ0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0NhbkxldmVsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY2NydWVBdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUmVndWxhcldvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJ0aW1lV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUmVtYWluaW5nV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdPdmVydGltZVdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1BlcmNlbnRXb3JrQ29tcGxldGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1N0YW5kYXJkUmF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfU3RhbmRhcmRSYXRlRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZVJhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0UGVyVXNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxPdmVydGltZUNvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1JlbWFpbmluZ0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1JlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfV29ya1ZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0VmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1NWKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9DVigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQUNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ2FsZW5kYXJVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX05vdGVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9CQ1dTKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9CQ1dQKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc0dlbmVyaWMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0lzSW5hY3RpdmUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0lzRW50ZXJwcmlzZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQm9va2luZ1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbFdvcmtQcm90ZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0aXZlRGlyZWN0b3J5R1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1OSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ3JlYXRpb25EYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9FeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfQmFzZWxpbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlX091dGxpbmVDb2RlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9BdmFpbGFiaWxpdHlQZXJpb2RzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9SYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfVGltZXBoYXNlZERhdGEoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVzb3VyY2VzKCkgewotCQlpZiAocmVzb3VyY2VzRUNsYXNzID09IG51bGwpIHsKLQkJCXJlc291cmNlc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoODcpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VzX1Jlc291cmNlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UmVzb3VyY2VzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2soKSB7Ci0JCWlmICh0YXNrRUNsYXNzID09IG51bGwpIHsKLQkJCXRhc2tFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDkzKTsKLQkJfQotCQlyZXR1cm4gdGFza0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0lzTnVsbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQ3JlYXRlRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQ29udGFjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfV0JTKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19XQlNMZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3V0bGluZU51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3V0bGluZUxldmVsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUHJpb3JpdHkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0ZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0R1cmF0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRHVyYXRpb25Gb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Xb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfU3RvcCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1Jlc3VtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1Jlc3VtZVZhbGlkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRWZmb3J0RHJpdmVuKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUmVjdXJyaW5nKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3ZlckFsbG9jYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0VzdGltYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX01pbGVzdG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1N1bW1hcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Dcml0aWNhbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0lzU3VicHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0lzU3VicHJvamVjdFJlYWRPbmx5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfU3VicHJvamVjdE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19FeHRlcm5hbFRhc2soKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19FeHRlcm5hbFRhc2tQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRWFybHlTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0Vhcmx5RmluaXNoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfTGF0ZVN0YXJ0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfTGF0ZUZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1N0YXJ0VmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19GaW5pc2hWYXJpYW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1dvcmtWYXJpYW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0ZyZWVTbGFjaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1RvdGFsU2xhY2soKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19GaXhlZENvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19GaXhlZENvc3RBY2NydWFsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUGVyY2VudENvbXBsZXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUGVyY2VudFdvcmtDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19PdmVydGltZUNvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19PdmVydGltZVdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbEZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbER1cmF0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbE92ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbFdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZWd1bGFyV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1JlbWFpbmluZ0R1cmF0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1JlbWFpbmluZ1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdPdmVydGltZUNvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1OSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdPdmVydGltZVdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BQ1dQKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQ1YoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Db25zdHJhaW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NhbGVuZGFyVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQ29uc3RyYWludERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19EZWFkbGluZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsQXNzaWdubWVudHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbGluZ0NhblNwbGl0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfTGV2ZWxpbmdEZWxheSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsaW5nRGVsYXlGb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19QcmVMZXZlbGVkU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19QcmVMZXZlbGVkRmluaXNoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfSHlwZXJsaW5rKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfSHlwZXJsaW5rQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDc0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0h5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19JZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfTm90ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19IaWRlQmFyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUm9sbHVwKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQkNXUygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0JDV1AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19QaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0Vhcm5lZFZhbHVlTWV0aG9kKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoODMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfUHJlZGVjZXNzb3JMaW5rKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoODQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsV29ya1Byb3RlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX0V4dGVuZGVkQXR0cmlidXRlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoODcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfQmFzZWxpbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19PdXRsaW5lQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX1RpbWVwaGFzZWREYXRhKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFza3MoKSB7Ci0JCWlmICh0YXNrc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl0YXNrc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTQpOwotCQl9Ci0JCXJldHVybiB0YXNrc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrc19UYXNrKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0VGFza3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGltZVBlcmlvZCgpIHsKLQkJaWYgKHRpbWVQZXJpb2RFQ2xhc3MgPT0gbnVsbCkgewotCQkJdGltZVBlcmlvZEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTUpOwotCQl9Ci0JCXJldHVybiB0aW1lUGVyaW9kRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVQZXJpb2RfRnJvbURhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lUGVyaW9kKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lUGVyaW9kX1RvRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRpbWVQZXJpb2QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkgewotCQlpZiAodGltZXBoYXNlZERhdGFUeXBlRUNsYXNzID09IG51bGwpIHsKLQkJCXRpbWVwaGFzZWREYXRhVHlwZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTYpOwotCQl9Ci0JCXJldHVybiB0aW1lcGhhc2VkRGF0YVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRpbWVwaGFzZWREYXRhVHlwZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX0ZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRpbWVwaGFzZWREYXRhVHlwZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX1VuaXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9WYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRpbWVwaGFzZWREYXRhVHlwZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRWYWx1ZSgpIHsKLQkJaWYgKHZhbHVlRUNsYXNzID09IG51bGwpIHsKLQkJCXZhbHVlRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDYpOwotCQl9Ci0JCXJldHVybiB2YWx1ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYWx1ZV9WYWx1ZUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhbHVlX1BhcmVudFZhbHVlSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRWYWx1ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWVfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRWYWx1ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWVfRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRWYWx1ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRWYWx1ZTIoKSB7Ci0JCWlmICh2YWx1ZTJFQ2xhc3MgPT0gbnVsbCkgewotCQkJdmFsdWUyRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDcpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWUyX0lEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYWx1ZTJfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRWYWx1ZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhbHVlMl9EZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFZhbHVlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRWYWx1ZUxpc3QoKSB7Ci0JCWlmICh2YWx1ZUxpc3RFQ2xhc3MgPT0gbnVsbCkgewotCQkJdmFsdWVMaXN0RUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDgpOwotCQl9Ci0JCXJldHVybiB2YWx1ZUxpc3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VmFsdWVMaXN0X1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0VmFsdWVMaXN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFZhbHVlcygpIHsKLQkJaWYgKHZhbHVlc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl2YWx1ZXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExMCk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYWx1ZXNfR3JvdXAoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRWYWx1ZXMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFZhbHVlc19WYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFZhbHVlcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXQlNNYXNrKCkgewotCQlpZiAod2JzTWFza0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl3YnNNYXNrRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTEpOwotCQl9Ci0JCXJldHVybiB3YnNNYXNrRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdCU01hc2tfTGV2ZWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXQlNNYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXQlNNYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX0xlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdCU01hc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdCU01hc2tfU2VwYXJhdG9yKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V0JTTWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXQlNNYXNrcygpIHsKLQkJaWYgKHdic01hc2tzRUNsYXNzID09IG51bGwpIHsKLQkJCXdic01hc2tzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTIpOwotCQl9Ci0JCXJldHVybiB3YnNNYXNrc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19WZXJpZnlVbmlxdWVDb2RlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdCU01hc2tzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19HZW5lcmF0ZUNvZGVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V0JTTWFza3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdCU01hc2tzX1ByZWZpeCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdCU01hc2tzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXQlNNYXNrc19XQlNNYXNrKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0V0JTTWFza3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2Vla0RheSgpIHsKLQkJaWYgKHdlZWtEYXlFQ2xhc3MgPT0gbnVsbCkgewotCQkJd2Vla0RheUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTEzKTsKLQkJfQotCQlyZXR1cm4gd2Vla0RheUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWVrRGF5X0RheVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXZWVrRGF5KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWVrRGF5X0RheVdvcmtpbmcoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXZWVrRGF5KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWVrRGF5X1RpbWVQZXJpb2QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRXZWVrRGF5KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWVrRGF5X1dvcmtpbmdUaW1lcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFdlZWtEYXkoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2Vla0RheXMoKSB7Ci0JCWlmICh3ZWVrRGF5c0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl3ZWVrRGF5c0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTE0KTsKLQkJfQotCQlyZXR1cm4gd2Vla0RheXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2Vla0RheXNfV2Vla0RheSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFdlZWtEYXlzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtpbmdUaW1lKCkgewotCQlpZiAod29ya2luZ1RpbWVFQ2xhc3MgPT0gbnVsbCkgewotCQkJd29ya2luZ1RpbWVFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExOSk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtpbmdUaW1lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtpbmdUaW1lX0Zyb21UaW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V29ya2luZ1RpbWUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtpbmdUaW1lX1RvVGltZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdvcmtpbmdUaW1lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtpbmdUaW1lcygpIHsKLQkJaWYgKHdvcmtpbmdUaW1lc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl3b3JraW5nVGltZXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEyMCk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtpbmdUaW1lc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JraW5nVGltZXNfV29ya2luZ1RpbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRXb3JraW5nVGltZXMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0QWNjcnVlQXQoKSB7Ci0JCWlmIChhY2NydWVBdEVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlhY2NydWVBdEVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMCk7Ci0JCX0KLQkJcmV0dXJuIGFjY3J1ZUF0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUoKSB7Ci0JCWlmIChhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMSk7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2ZURpcmVjdG9yeUdVSURUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0QWxpYXNUeXBlKCkgewotCQlpZiAoYWxpYXNUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWFsaWFzVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMik7Ci0JCX0KLQkJcmV0dXJuIGFsaWFzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEF1dGhvclR5cGUoKSB7Ci0JCWlmIChhdXRob3JUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWF1dGhvclR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDUpOwotCQl9Ci0JCXJldHVybiBhdXRob3JUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUoKSB7Ci0JCWlmIChiYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQliYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTEpOwotCQl9Ci0JCXJldHVybiBiYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEJvb2tpbmdUeXBlVHlwZSgpIHsKLQkJaWYgKGJvb2tpbmdUeXBlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlib29raW5nVHlwZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEyKTsKLQkJfQotCQlyZXR1cm4gYm9va2luZ1R5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Qm9va2luZ1R5cGVUeXBlMSgpIHsKLQkJaWYgKGJvb2tpbmdUeXBlVHlwZTFFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYm9va2luZ1R5cGVUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTMpOwotCQl9Ci0JCXJldHVybiBib29raW5nVHlwZVR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q2FsY3VsYXRpb25UeXBlVHlwZSgpIHsKLQkJaWYgKGNhbGN1bGF0aW9uVHlwZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJY2FsY3VsYXRpb25UeXBlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTQpOwotCQl9Ci0JCXJldHVybiBjYWxjdWxhdGlvblR5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q2F0ZWdvcnlUeXBlKCkgewotCQlpZiAoY2F0ZWdvcnlUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWNhdGVnb3J5VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTcpOwotCQl9Ci0JCXJldHVybiBjYXRlZ29yeVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRDb2RlVHlwZSgpIHsKLQkJaWYgKGNvZGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWNvZGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxOCk7Ci0JCX0KLQkJcmV0dXJuIGNvZGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q29tcGFueVR5cGUoKSB7Ci0JCWlmIChjb21wYW55VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljb21wYW55VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTkpOwotCQl9Ci0JCXJldHVybiBjb21wYW55VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENvbnN0cmFpbnRUeXBlVHlwZSgpIHsKLQkJaWYgKGNvbnN0cmFpbnRUeXBlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljb25zdHJhaW50VHlwZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDIwKTsKLQkJfQotCQlyZXR1cm4gY29uc3RyYWludFR5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q29udGFjdFR5cGUoKSB7Ci0JCWlmIChjb250YWN0VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljb250YWN0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjEpOwotCQl9Ci0JCXJldHVybiBjb250YWN0VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENvc3RSYXRlVGFibGVUeXBlKCkgewotCQlpZiAoY29zdFJhdGVUYWJsZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJY29zdFJhdGVUYWJsZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDIyKTsKLQkJfQotCQlyZXR1cm4gY29zdFJhdGVUYWJsZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSgpIHsKLQkJaWYgKGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgyMyk7Ci0JCX0KLQkJcmV0dXJuIGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q3VycmVuY3lTeW1ib2xUeXBlKCkgewotCQlpZiAoY3VycmVuY3lTeW1ib2xUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWN1cnJlbmN5U3ltYm9sVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjQpOwotCQl9Ci0JCXJldHVybiBjdXJyZW5jeVN5bWJvbFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREYXlUeXBlVHlwZSgpIHsKLQkJaWYgKGRheVR5cGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWRheVR5cGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgyNSk7Ci0JCX0KLQkJcmV0dXJuIGRheVR5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlKCkgewotCQlpZiAoZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjYpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREZWZhdWx0VGFza0VWTWV0aG9kVHlwZSgpIHsKLQkJaWYgKGRlZmF1bHRUYXNrRVZNZXRob2RUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWRlZmF1bHRUYXNrRVZNZXRob2RUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgyNyk7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRUYXNrRVZNZXRob2RUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGVmYXVsdFRhc2tUeXBlVHlwZSgpIHsKLQkJaWYgKGRlZmF1bHRUYXNrVHlwZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZGVmYXVsdFRhc2tUeXBlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjgpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0VGFza1R5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlKCkgewotCQlpZiAoZHVyYXRpb25Gb3JtYXRUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWR1cmF0aW9uRm9ybWF0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzApOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGUxKCkgewotCQlpZiAoZHVyYXRpb25Gb3JtYXRUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkdXJhdGlvbkZvcm1hdFR5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzMSk7Ci0JCX0KLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0VHlwZTFFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGUyKCkgewotCQlpZiAoZHVyYXRpb25Gb3JtYXRUeXBlMkVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkdXJhdGlvbkZvcm1hdFR5cGUyRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzMik7Ci0JCX0KLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0VHlwZTJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGUzKCkgewotCQlpZiAoZHVyYXRpb25Gb3JtYXRUeXBlM0VEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkdXJhdGlvbkZvcm1hdFR5cGUzRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzMyk7Ci0JCX0KLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0VHlwZTNFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGU0KCkgewotCQlpZiAoZHVyYXRpb25Gb3JtYXRUeXBlNEVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkdXJhdGlvbkZvcm1hdFR5cGU0RURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzNCk7Ci0JCX0KLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0VHlwZTRFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGU1KCkgewotCQlpZiAoZHVyYXRpb25Gb3JtYXRUeXBlNUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkdXJhdGlvbkZvcm1hdFR5cGU1RURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzNSk7Ci0JCX0KLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0VHlwZTVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoKSB7Ci0JCWlmIChlYXJuZWRWYWx1ZU1ldGhvZFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZWFybmVkVmFsdWVNZXRob2RUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzNik7Ci0JCX0KLQkJcmV0dXJuIGVhcm5lZFZhbHVlTWV0aG9kVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEVhcm5lZFZhbHVlTWV0aG9kVHlwZTEoKSB7Ci0JCWlmIChlYXJuZWRWYWx1ZU1ldGhvZFR5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWVhcm5lZFZhbHVlTWV0aG9kVHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDM3KTsKLQkJfQotCQlyZXR1cm4gZWFybmVkVmFsdWVNZXRob2RUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEVtYWlsQWRkcmVzc1R5cGUoKSB7Ci0JCWlmIChlbWFpbEFkZHJlc3NUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWVtYWlsQWRkcmVzc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDM4KTsKLQkJfQotCQlyZXR1cm4gZW1haWxBZGRyZXNzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEV4dGVybmFsVGFza1Byb2plY3RUeXBlKCkgewotCQlpZiAoZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQ0KTsKLQkJfQotCQlyZXR1cm4gZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRGaXhlZENvc3RBY2NydWFsVHlwZSgpIHsKLQkJaWYgKGZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0NSk7Ci0JCX0KLQkJcmV0dXJuIGZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RllTdGFydERhdGVUeXBlKCkgewotCQlpZiAoZnlTdGFydERhdGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWZ5U3RhcnREYXRlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDYpOwotCQl9Ci0JCXJldHVybiBmeVN0YXJ0RGF0ZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRHcm91cFR5cGUoKSB7Ci0JCWlmIChncm91cFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZ3JvdXBUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0Nyk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua0FkZHJlc3NUeXBlKCkgewotCQlpZiAoaHlwZXJsaW5rQWRkcmVzc1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rQWRkcmVzc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQ4KTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rQWRkcmVzc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZTEoKSB7Ci0JCWlmIChoeXBlcmxpbmtBZGRyZXNzVHlwZTFFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rQWRkcmVzc1R5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0OSk7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua0FkZHJlc3NUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua0FkZHJlc3NUeXBlMigpIHsKLQkJaWYgKGh5cGVybGlua0FkZHJlc3NUeXBlMkVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtBZGRyZXNzVHlwZTJFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDUwKTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rQWRkcmVzc1R5cGUyRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUoKSB7Ci0JCWlmIChoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtTdWJBZGRyZXNzVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTEpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSgpIHsKLQkJaWYgKGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDUyKTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKCkgewotCQlpZiAoaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWh5cGVybGlua1N1YkFkZHJlc3NUeXBlMkVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTMpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtUeXBlKCkgewotCQlpZiAoaHlwZXJsaW5rVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1NCk7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtUeXBlMSgpIHsKLQkJaWYgKGh5cGVybGlua1R5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWh5cGVybGlua1R5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1NSk7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua1R5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZTIoKSB7Ci0JCWlmIChoeXBlcmxpbmtUeXBlMkVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtUeXBlMkVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTYpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtUeXBlMkVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEluaXRpYWxzVHlwZSgpIHsKLQkJaWYgKGluaXRpYWxzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlpbml0aWFsc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDU3KTsKLQkJfQotCQlyZXR1cm4gaW5pdGlhbHNUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TGFnRm9ybWF0VHlwZSgpIHsKLQkJaWYgKGxhZ0Zvcm1hdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbGFnRm9ybWF0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTgpOwotCQl9Ci0JCXJldHVybiBsYWdGb3JtYXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUoKSB7Ci0JCWlmIChsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTkpOwotCQl9Ci0JCXJldHVybiBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSgpIHsKLQkJaWYgKGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDYwKTsKLQkJfQotCQlyZXR1cm4gbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TWFuYWdlclR5cGUoKSB7Ci0JCWlmIChtYW5hZ2VyVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQltYW5hZ2VyVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjEpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE1hdGVyaWFsTGFiZWxUeXBlKCkgewotCQlpZiAobWF0ZXJpYWxMYWJlbFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbWF0ZXJpYWxMYWJlbFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDY0KTsKLQkJfQotCQlyZXR1cm4gbWF0ZXJpYWxMYWJlbFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXROYW1lVHlwZSgpIHsKLQkJaWYgKG5hbWVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW5hbWVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2NSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TmFtZVR5cGUxKCkgewotCQlpZiAobmFtZVR5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW5hbWVUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjYpOwotCQl9Ci0JCXJldHVybiBuYW1lVHlwZTFFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXROYW1lVHlwZTIoKSB7Ci0JCWlmIChuYW1lVHlwZTJFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbmFtZVR5cGUyRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2Nyk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVUeXBlMkVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE5hbWVUeXBlMygpIHsKLQkJaWYgKG5hbWVUeXBlM0VEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQluYW1lVHlwZTNFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDY4KTsKLQkJfQotCQlyZXR1cm4gbmFtZVR5cGUzRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TmV3VGFza1N0YXJ0RGF0ZVR5cGUoKSB7Ci0JCWlmIChuZXdUYXNrU3RhcnREYXRlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQluZXdUYXNrU3RhcnREYXRlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjkpOwotCQl9Ci0JCXJldHVybiBuZXdUYXNrU3RhcnREYXRlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE5UQWNjb3VudFR5cGUoKSB7Ci0JCWlmIChudEFjY291bnRUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW50QWNjb3VudFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDcwKTsKLQkJfQotCQlyZXR1cm4gbnRBY2NvdW50VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE91dGxpbmVOdW1iZXJUeXBlKCkgewotCQlpZiAob3V0bGluZU51bWJlclR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJb3V0bGluZU51bWJlclR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDc1KTsKLQkJfQotCQlyZXR1cm4gb3V0bGluZU51bWJlclR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRPdmVydGltZVJhdGVGb3JtYXRUeXBlKCkgewotCQlpZiAob3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlvdmVydGltZVJhdGVGb3JtYXRUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3Nik7Ci0JCX0KLQkJcmV0dXJuIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRPdmVydGltZVJhdGVGb3JtYXRUeXBlMSgpIHsKLQkJaWYgKG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3Nyk7Ci0JCX0KLQkJcmV0dXJuIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0UGhvbmV0aWNBbGlhc1R5cGUoKSB7Ci0JCWlmIChwaG9uZXRpY0FsaWFzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlwaG9uZXRpY0FsaWFzVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzgpOwotCQl9Ci0JCXJldHVybiBwaG9uZXRpY0FsaWFzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFBob25ldGljc1R5cGUoKSB7Ci0JCWlmIChwaG9uZXRpY3NUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXBob25ldGljc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDc5KTsKLQkJfQotCQlyZXR1cm4gcGhvbmV0aWNzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFByZWZpeFR5cGUoKSB7Ci0JCWlmIChwcmVmaXhUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXByZWZpeFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDgxKTsKLQkJfQotCQlyZXR1cm4gcHJlZml4VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFJhdGVUYWJsZVR5cGUoKSB7Ci0JCWlmIChyYXRlVGFibGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXJhdGVUYWJsZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDg1KTsKLQkJfQotCQlyZXR1cm4gcmF0ZVRhYmxlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFJvbGx1cFR5cGVUeXBlKCkgewotCQlpZiAocm9sbHVwVHlwZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJcm9sbHVwVHlwZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDg4KTsKLQkJfQotCQlyZXR1cm4gcm9sbHVwVHlwZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlKCkgewotCQlpZiAoc3RhbmRhcmRSYXRlRm9ybWF0VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlzdGFuZGFyZFJhdGVGb3JtYXRUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4OSk7Ci0JCX0KLQkJcmV0dXJuIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSgpIHsKLQkJaWYgKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg5MCk7Ci0JCX0KLQkJcmV0dXJuIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U3ViamVjdFR5cGUoKSB7Ci0JCWlmIChzdWJqZWN0VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlzdWJqZWN0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTEpOwotCQl9Ci0JCXJldHVybiBzdWJqZWN0VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFN1YnByb2plY3ROYW1lVHlwZSgpIHsKLQkJaWYgKHN1YnByb2plY3ROYW1lVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlzdWJwcm9qZWN0TmFtZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDkyKTsKLQkJfQotCQlyZXR1cm4gc3VicHJvamVjdE5hbWVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VGl0bGVUeXBlKCkgewotCQlpZiAodGl0bGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXRpdGxlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTcpOwotCQl9Ci0JCXJldHVybiB0aXRsZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRUeXBlVHlwZSgpIHsKLQkJaWYgKHR5cGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg5OCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGUxKCkgewotCQlpZiAodHlwZVR5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTkpOwotCQl9Ci0JCXJldHVybiB0eXBlVHlwZTFFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRUeXBlVHlwZTIoKSB7Ci0JCWlmICh0eXBlVHlwZTJFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdHlwZVR5cGUyRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDApOwotCQl9Ci0JCXJldHVybiB0eXBlVHlwZTJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRUeXBlVHlwZTMoKSB7Ci0JCWlmICh0eXBlVHlwZTNFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdHlwZVR5cGUzRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDEpOwotCQl9Ci0JCXJldHVybiB0eXBlVHlwZTNFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRUeXBlVHlwZTQoKSB7Ci0JCWlmICh0eXBlVHlwZTRFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdHlwZVR5cGU0RURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDIpOwotCQl9Ci0JCXJldHVybiB0eXBlVHlwZTRFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRUeXBlVHlwZTUoKSB7Ci0JCWlmICh0eXBlVHlwZTVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdHlwZVR5cGU1RURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDMpOwotCQl9Ci0JCXJldHVybiB0eXBlVHlwZTVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRVSURUeXBlKCkgewotCQlpZiAodWlkVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl1aWRUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDQpOwotCQl9Ci0JCXJldHVybiB1aWRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VW5pdFR5cGUoKSB7Ci0JCWlmICh1bml0VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl1bml0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA1KTsKLQkJfQotCQlyZXR1cm4gdW5pdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlKCkgewotCQlpZiAodmFsdWVsaXN0U29ydE9yZGVyVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl2YWx1ZWxpc3RTb3J0T3JkZXJUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDkpOwotCQl9Ci0JCXJldHVybiB2YWx1ZWxpc3RTb3J0T3JkZXJUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0V2Vla1N0YXJ0RGF5VHlwZSgpIHsKLQkJaWYgKHdlZWtTdGFydERheVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJd2Vla1N0YXJ0RGF5VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTE1KTsKLQkJfQotCQlyZXR1cm4gd2Vla1N0YXJ0RGF5VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFdvcmtDb250b3VyVHlwZSgpIHsKLQkJaWYgKHdvcmtDb250b3VyVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl3b3JrQ29udG91clR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExNik7Ci0JCX0KLQkJcmV0dXJuIHdvcmtDb250b3VyVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFdvcmtGb3JtYXRUeXBlKCkgewotCQlpZiAod29ya0Zvcm1hdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJd29ya0Zvcm1hdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExNyk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtGb3JtYXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0V29ya0dyb3VwVHlwZSgpIHsKLQkJaWYgKHdvcmtHcm91cFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJd29ya0dyb3VwVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTE4KTsKLQkJfQotCQlyZXR1cm4gd29ya0dyb3VwVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXNwcm9qZWN0RmFjdG9yeSBnZXRNc3Byb2plY3RGYWN0b3J5KCkgewotCQlyZXR1cm4gKE1zcHJvamVjdEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0xvYWRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogTGFvZHMgdGhlIHBhY2thZ2UgYW5kIGFueSBzdWItcGFja2FnZXMgZnJvbSB0aGVpciBzZXJpYWxpemVkIGZvcm0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFBhY2thZ2UoKSB7Ci0JCWlmIChpc0xvYWRlZCkgcmV0dXJuOwotCQlpc0xvYWRlZCA9IHRydWU7Ci0KLQkJVVJMIHVybCA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2UocGFja2FnZUZpbGVuYW1lKTsKLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTWlzc2luZyBzZXJpYWxpemVkIHBhY2thZ2U6ICIgKyBwYWNrYWdlRmlsZW5hbWUpOwotCQl9Ci0JCVJlc291cmNlIHJlc291cmNlID0gbmV3IEVjb3JlUmVzb3VyY2VGYWN0b3J5SW1wbCgpLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkodXJsLnRvU3RyaW5nKCkpKTsKLQkJdHJ5IHsKLQkJCXJlc291cmNlLmxvYWQobnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJfQotCQlpbml0aWFsaXplRnJvbUxvYWRlZEVQYWNrYWdlKHRoaXMsIChFUGFja2FnZSlyZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKSk7Ci0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRml4ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEZpeGVzIHVwIHRoZSBsb2FkZWQgcGFja2FnZSwgdG8gbWFrZSBpdCBhcHBlYXIgYXMgaWYgaXQgaGFkIGJlZW4gcHJvZ3JhbW1hdGljYWxseSBidWlsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXhQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0ZpeGVkKSByZXR1cm47Ci0JCWlzRml4ZWQgPSB0cnVlOwotCQlmaXhFQ2xhc3NpZmllcnMoKTsKLQl9Ci19IC8vTXNwcm9qZWN0UGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlMkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTI2ZDhkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZTJJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTJJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUySW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlMkltcGwjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRsaW5lQ29kZTJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBPdXRsaW5lQ29kZTIgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZElEID0gRklFTERfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFZBTFVFX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHZhbHVlSUQgPSBWQUxVRV9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPdXRsaW5lQ29kZTJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0bGluZUNvZGUyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkSUQoKSB7Ci0JCXJldHVybiBmaWVsZElEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkSUQoU3RyaW5nIG5ld0ZpZWxkSUQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkSUQgPSBmaWVsZElEOwotCQlmaWVsZElEID0gbmV3RmllbGRJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19GSUVMRF9JRCwgb2xkRmllbGRJRCwgZmllbGRJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKSB7Ci0JCXJldHVybiB2YWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciBuZXdWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVJRCA9IHZhbHVlSUQ7Ci0JCXZhbHVlSUQgPSBuZXdWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1ZBTFVFX0lELCBvbGRWYWx1ZUlELCB2YWx1ZUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVJRCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoRklFTERfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKFZBTFVFX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gVkFMVUVfSURfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlSUQgIT0gbnVsbCA6ICFWQUxVRV9JRF9FREVGQVVMVC5lcXVhbHModmFsdWVJRCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmllbGRJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGRJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL091dGxpbmVDb2RlMkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlM0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlM0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOThmZGY1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZTNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZTNJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZTM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTNJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUzSW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlM0ltcGwjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRsaW5lQ29kZTNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBPdXRsaW5lQ29kZTMgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZElEID0gRklFTERfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFZBTFVFX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHZhbHVlSUQgPSBWQUxVRV9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPdXRsaW5lQ29kZTNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0bGluZUNvZGUzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkSUQoKSB7Ci0JCXJldHVybiBmaWVsZElEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkSUQoU3RyaW5nIG5ld0ZpZWxkSUQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkSUQgPSBmaWVsZElEOwotCQlmaWVsZElEID0gbmV3RmllbGRJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19GSUVMRF9JRCwgb2xkRmllbGRJRCwgZmllbGRJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKSB7Ci0JCXJldHVybiB2YWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciBuZXdWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVJRCA9IHZhbHVlSUQ7Ci0JCXZhbHVlSUQgPSBuZXdWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1ZBTFVFX0lELCBvbGRWYWx1ZUlELCB2YWx1ZUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVJRCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoRklFTERfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKFZBTFVFX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gVkFMVUVfSURfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlSUQgIT0gbnVsbCA6ICFWQUxVRV9JRF9FREVGQVVMVC5lcXVhbHModmFsdWVJRCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmllbGRJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGRJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL091dGxpbmVDb2RlM0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwOThiYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRBbGlhcyA8ZW0+QWxpYXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjZ2V0UGhvbmV0aWNBbGlhcyA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjZ2V0VmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjaXNFbnRlcnByaXNlIDxlbT5FbnRlcnByaXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2dldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzIDxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCA8ZW0+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjaXNMZWFmT25seSA8ZW0+TGVhZiBPbmx5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2lzQWxsTGV2ZWxzUmVxdWlyZWQgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkIDxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2dldE1hc2tzIDxlbT5NYXNrczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGxpbmVDb2RlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgT3V0bGluZUNvZGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkSUQgPSBGSUVMRF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZE5hbWUoKSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkTmFtZSgpIDxlbT5GaWVsZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGROYW1lID0gRklFTERfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbGlhcygpIDxlbT5BbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUFTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsaWFzKCkgPGVtPkFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbGlhcyA9IEFMSUFTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBob25ldGljQWxpYXMoKSA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT05FVElDX0FMSUFTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBob25ldGljQWxpYXMoKSA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGhvbmV0aWNBbGlhcyA9IFBIT05FVElDX0FMSUFTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVzKCkgPGVtPlZhbHVlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFsdWVzIHZhbHVlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFbnRlcnByaXNlKCkgPGVtPkVudGVycHJpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRW50ZXJwcmlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVOVEVSUFJJU0VfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRW50ZXJwcmlzZSgpIDxlbT5FbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VudGVycHJpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVudGVycHJpc2UgPSBFTlRFUlBSSVNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFbnRlcnByaXNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbnRlcnByaXNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCkgPGVtPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEVOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCkgPGVtPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPSBFTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKSA8ZW0+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPSBSRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xlYWZPbmx5KCkgPGVtPkxlYWYgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMZWFmT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIExFQUZfT05MWV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMZWFmT25seSgpIDxlbT5MZWFmIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGVhZk9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxlYWZPbmx5ID0gTEVBRl9PTkxZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBMZWFmIE9ubHkgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxlYWZPbmx5RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKSA8ZW0+QWxsIExldmVscyBSZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBbGxMZXZlbHNSZXF1aXJlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFMTF9MRVZFTFNfUkVRVUlSRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKSA8ZW0+QWxsIExldmVscyBSZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBbGxMZXZlbHNSZXF1aXJlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWxsTGV2ZWxzUmVxdWlyZWQgPSBBTExfTEVWRUxTX1JFUVVJUkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBbGwgTGV2ZWxzIFJlcXVpcmVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhbGxMZXZlbHNSZXF1aXJlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKSA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gb25seVRhYmxlVmFsdWVzQWxsb3dlZCA9IE9OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXNrcygpIDxlbT5NYXNrczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNYXNrcyBtYXNrcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0bGluZUNvZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0bGluZUNvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkSUQoKSB7Ci0JCXJldHVybiBmaWVsZElEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkSUQoU3RyaW5nIG5ld0ZpZWxkSUQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkSUQgPSBmaWVsZElEOwotCQlmaWVsZElEID0gbmV3RmllbGRJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX0lELCBvbGRGaWVsZElELCBmaWVsZElEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7Ci0JCXJldHVybiBmaWVsZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGROYW1lKFN0cmluZyBuZXdGaWVsZE5hbWUpIHsKLQkJU3RyaW5nIG9sZEZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKLQkJZmllbGROYW1lID0gbmV3RmllbGROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfTkFNRSwgb2xkRmllbGROYW1lLCBmaWVsZE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgewotCQlyZXR1cm4gYWxpYXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxpYXMoU3RyaW5nIG5ld0FsaWFzKSB7Ci0JCVN0cmluZyBvbGRBbGlhcyA9IGFsaWFzOwotCQlhbGlhcyA9IG5ld0FsaWFzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxJQVMsIG9sZEFsaWFzLCBhbGlhcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNBbGlhcygpIHsKLQkJcmV0dXJuIHBob25ldGljQWxpYXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGhvbmV0aWNBbGlhcyhTdHJpbmcgbmV3UGhvbmV0aWNBbGlhcykgewotCQlTdHJpbmcgb2xkUGhvbmV0aWNBbGlhcyA9IHBob25ldGljQWxpYXM7Ci0JCXBob25ldGljQWxpYXMgPSBuZXdQaG9uZXRpY0FsaWFzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUEhPTkVUSUNfQUxJQVMsIG9sZFBob25ldGljQWxpYXMsIHBob25ldGljQWxpYXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFsdWVzIGdldFZhbHVlcygpIHsKLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRWYWx1ZXMoVmFsdWVzIG5ld1ZhbHVlcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlWYWx1ZXMgb2xkVmFsdWVzID0gdmFsdWVzOwotCQl2YWx1ZXMgPSBuZXdWYWx1ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVMsIG9sZFZhbHVlcywgbmV3VmFsdWVzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoVmFsdWVzIG5ld1ZhbHVlcykgewotCQlpZiAobmV3VmFsdWVzICE9IHZhbHVlcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodmFsdWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXZhbHVlcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ZhbHVlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFZhbHVlcyhuZXdWYWx1ZXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1ZBTFVFUywgbmV3VmFsdWVzLCBuZXdWYWx1ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VudGVycHJpc2UoKSB7Ci0JCXJldHVybiBlbnRlcnByaXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGVycHJpc2UoYm9vbGVhbiBuZXdFbnRlcnByaXNlKSB7Ci0JCWJvb2xlYW4gb2xkRW50ZXJwcmlzZSA9IGVudGVycHJpc2U7Ci0JCWVudGVycHJpc2UgPSBuZXdFbnRlcnByaXNlOwotCQlib29sZWFuIG9sZEVudGVycHJpc2VFU2V0ID0gZW50ZXJwcmlzZUVTZXQ7Ci0JCWVudGVycHJpc2VFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0UsIG9sZEVudGVycHJpc2UsIGVudGVycHJpc2UsICFvbGRFbnRlcnByaXNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RW50ZXJwcmlzZSgpIHsKLQkJYm9vbGVhbiBvbGRFbnRlcnByaXNlID0gZW50ZXJwcmlzZTsKLQkJYm9vbGVhbiBvbGRFbnRlcnByaXNlRVNldCA9IGVudGVycHJpc2VFU2V0OwotCQllbnRlcnByaXNlID0gRU5URVJQUklTRV9FREVGQVVMVDsKLQkJZW50ZXJwcmlzZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRSwgb2xkRW50ZXJwcmlzZSwgRU5URVJQUklTRV9FREVGQVVMVCwgb2xkRW50ZXJwcmlzZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEVudGVycHJpc2UoKSB7Ci0JCXJldHVybiBlbnRlcnByaXNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpIHsKLQkJcmV0dXJuIGVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKEJpZ0ludGVnZXIgbmV3RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMpIHsKLQkJQmlnSW50ZWdlciBvbGRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyA9IGVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzOwotCQllbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyA9IG5ld0VudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVMsIG9sZEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzLCBlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkgewotCQlyZXR1cm4gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZChib29sZWFuIG5ld1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCkgewotCQlib29sZWFuIG9sZFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCA9IHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZDsKLQkJcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkID0gbmV3UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkOwotCQlib29sZWFuIG9sZFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZEVTZXQgPSByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0OwotCQlyZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1JFU09VUkNFX1NVQlNUSVRVVElPTl9FTkFCTEVELCBvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQsIHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCwgIW9sZFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpIHsKLQkJYm9vbGVhbiBvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPSByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQ7Ci0JCWJvb2xlYW4gb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldCA9IHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZEVTZXQ7Ci0JCXJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCA9IFJFU09VUkNFX1NVQlNUSVRVVElPTl9FTkFCTEVEX0VERUZBVUxUOwotCQlyZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1JFU09VUkNFX1NVQlNUSVRVVElPTl9FTkFCTEVELCBvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQsIFJFU09VUkNFX1NVQlNUSVRVVElPTl9FTkFCTEVEX0VERUZBVUxULCBvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKSB7Ci0JCXJldHVybiByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGVhZk9ubHkoKSB7Ci0JCXJldHVybiBsZWFmT25seTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZWFmT25seShib29sZWFuIG5ld0xlYWZPbmx5KSB7Ci0JCWJvb2xlYW4gb2xkTGVhZk9ubHkgPSBsZWFmT25seTsKLQkJbGVhZk9ubHkgPSBuZXdMZWFmT25seTsKLQkJYm9vbGVhbiBvbGRMZWFmT25seUVTZXQgPSBsZWFmT25seUVTZXQ7Ci0JCWxlYWZPbmx5RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19MRUFGX09OTFksIG9sZExlYWZPbmx5LCBsZWFmT25seSwgIW9sZExlYWZPbmx5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TGVhZk9ubHkoKSB7Ci0JCWJvb2xlYW4gb2xkTGVhZk9ubHkgPSBsZWFmT25seTsKLQkJYm9vbGVhbiBvbGRMZWFmT25seUVTZXQgPSBsZWFmT25seUVTZXQ7Ci0JCWxlYWZPbmx5ID0gTEVBRl9PTkxZX0VERUZBVUxUOwotCQlsZWFmT25seUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTEVBRl9PTkxZLCBvbGRMZWFmT25seSwgTEVBRl9PTkxZX0VERUZBVUxULCBvbGRMZWFmT25seUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldExlYWZPbmx5KCkgewotCQlyZXR1cm4gbGVhZk9ubHlFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWxsTGV2ZWxzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBhbGxMZXZlbHNSZXF1aXJlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxMZXZlbHNSZXF1aXJlZChib29sZWFuIG5ld0FsbExldmVsc1JlcXVpcmVkKSB7Ci0JCWJvb2xlYW4gb2xkQWxsTGV2ZWxzUmVxdWlyZWQgPSBhbGxMZXZlbHNSZXF1aXJlZDsKLQkJYWxsTGV2ZWxzUmVxdWlyZWQgPSBuZXdBbGxMZXZlbHNSZXF1aXJlZDsKLQkJYm9vbGVhbiBvbGRBbGxMZXZlbHNSZXF1aXJlZEVTZXQgPSBhbGxMZXZlbHNSZXF1aXJlZEVTZXQ7Ci0JCWFsbExldmVsc1JlcXVpcmVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTExfTEVWRUxTX1JFUVVJUkVELCBvbGRBbGxMZXZlbHNSZXF1aXJlZCwgYWxsTGV2ZWxzUmVxdWlyZWQsICFvbGRBbGxMZXZlbHNSZXF1aXJlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEFsbExldmVsc1JlcXVpcmVkKCkgewotCQlib29sZWFuIG9sZEFsbExldmVsc1JlcXVpcmVkID0gYWxsTGV2ZWxzUmVxdWlyZWQ7Ci0JCWJvb2xlYW4gb2xkQWxsTGV2ZWxzUmVxdWlyZWRFU2V0ID0gYWxsTGV2ZWxzUmVxdWlyZWRFU2V0OwotCQlhbGxMZXZlbHNSZXF1aXJlZCA9IEFMTF9MRVZFTFNfUkVRVUlSRURfRURFRkFVTFQ7Ci0JCWFsbExldmVsc1JlcXVpcmVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTExfTEVWRUxTX1JFUVVJUkVELCBvbGRBbGxMZXZlbHNSZXF1aXJlZCwgQUxMX0xFVkVMU19SRVFVSVJFRF9FREVGQVVMVCwgb2xkQWxsTGV2ZWxzUmVxdWlyZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBbGxMZXZlbHNSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIGFsbExldmVsc1JlcXVpcmVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoYm9vbGVhbiBuZXdPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKSB7Ci0JCWJvb2xlYW4gb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZCA9IG9ubHlUYWJsZVZhbHVlc0FsbG93ZWQ7Ci0JCW9ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPSBuZXdPbmx5VGFibGVWYWx1ZXNBbGxvd2VkOwotCQlib29sZWFuIG9sZE9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0ID0gb25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQ7Ci0JCW9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQsIG9sZE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQsIG9ubHlUYWJsZVZhbHVlc0FsbG93ZWQsICFvbGRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpIHsKLQkJYm9vbGVhbiBvbGRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkID0gb25seVRhYmxlVmFsdWVzQWxsb3dlZDsKLQkJYm9vbGVhbiBvbGRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCA9IG9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0OwotCQlvbmx5VGFibGVWYWx1ZXNBbGxvd2VkID0gT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRF9FREVGQVVMVDsKLQkJb25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRCwgb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZCwgT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRF9FREVGQVVMVCwgb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFza3MgZ2V0TWFza3MoKSB7Ci0JCXJldHVybiBtYXNrczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNYXNrcyhNYXNrcyBuZXdNYXNrcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlNYXNrcyBvbGRNYXNrcyA9IG1hc2tzOwotCQltYXNrcyA9IG5ld01hc2tzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1MsIG9sZE1hc2tzLCBuZXdNYXNrcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFza3MoTWFza3MgbmV3TWFza3MpIHsKLQkJaWYgKG5ld01hc2tzICE9IG1hc2tzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChtYXNrcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCltYXNrcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19NQVNLUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3TWFza3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TWFza3MpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1MsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TWFza3MobmV3TWFza3MsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTLCBuZXdNYXNrcywgbmV3TWFza3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVM6Ci0JCQkJCXJldHVybiBiYXNpY1NldFZhbHVlcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19NQVNLUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0TWFza3MobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gZ2V0RmllbGRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RmllbGROYW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTElBUzoKLQkJCQlyZXR1cm4gZ2V0QWxpYXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1BIT05FVElDX0FMSUFTOgotCQkJCXJldHVybiBnZXRQaG9uZXRpY0FsaWFzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVM6Ci0JCQkJcmV0dXJuIGdldFZhbHVlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRToKLQkJCQlyZXR1cm4gaXNFbnRlcnByaXNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVM6Ci0JCQkJcmV0dXJuIGdldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19SRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRDoKLQkJCQlyZXR1cm4gaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19MRUFGX09OTFk6Ci0JCQkJcmV0dXJuIGlzTGVhZk9ubHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTExfTEVWRUxTX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc0FsbExldmVsc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRDoKLQkJCQlyZXR1cm4gaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1M6Ci0JCQkJcmV0dXJuIGdldE1hc2tzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19GSUVMRF9OQU1FOgotCQkJCXNldEZpZWxkTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTElBUzoKLQkJCQlzZXRBbGlhcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlzZXRQaG9uZXRpY0FsaWFzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1ZBTFVFUzoKLQkJCQlzZXRWYWx1ZXMoKFZhbHVlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRToKLQkJCQlzZXRFbnRlcnByaXNlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTOgotCQkJCXNldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19SRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRDoKLQkJCQlzZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTEVBRl9PTkxZOgotCQkJCXNldExlYWZPbmx5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0FMTF9MRVZFTFNfUkVRVUlSRUQ6Ci0JCQkJc2V0QWxsTGV2ZWxzUmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRDoKLQkJCQlzZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTOgotCQkJCXNldE1hc2tzKChNYXNrcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoRklFTERfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX05BTUU6Ci0JCQkJc2V0RmllbGROYW1lKEZJRUxEX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0FMSUFTOgotCQkJCXNldEFsaWFzKEFMSUFTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlzZXRQaG9uZXRpY0FsaWFzKFBIT05FVElDX0FMSUFTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVM6Ci0JCQkJc2V0VmFsdWVzKChWYWx1ZXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRToKLQkJCQl1bnNldEVudGVycHJpc2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19FTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBUzoKLQkJCQlzZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyhFTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRUQ6Ci0JCQkJdW5zZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19MRUFGX09OTFk6Ci0JCQkJdW5zZXRMZWFmT25seSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0FMTF9MRVZFTFNfUkVRVUlSRUQ6Ci0JCQkJdW5zZXRBbGxMZXZlbHNSZXF1aXJlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQ6Ci0JCQkJdW5zZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1M6Ci0JCQkJc2V0TWFza3MoKE1hc2tzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIEZJRUxEX0lEX0VERUZBVUxUID09IG51bGwgPyBmaWVsZElEICE9IG51bGwgOiAhRklFTERfSURfRURFRkFVTFQuZXF1YWxzKGZpZWxkSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfTkFNRToKLQkJCQlyZXR1cm4gRklFTERfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZmllbGROYW1lICE9IG51bGwgOiAhRklFTERfTkFNRV9FREVGQVVMVC5lcXVhbHMoZmllbGROYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0FMSUFTOgotCQkJCXJldHVybiBBTElBU19FREVGQVVMVCA9PSBudWxsID8gYWxpYXMgIT0gbnVsbCA6ICFBTElBU19FREVGQVVMVC5lcXVhbHMoYWxpYXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJcmV0dXJuIFBIT05FVElDX0FMSUFTX0VERUZBVUxUID09IG51bGwgPyBwaG9uZXRpY0FsaWFzICE9IG51bGwgOiAhUEhPTkVUSUNfQUxJQVNfRURFRkFVTFQuZXF1YWxzKHBob25ldGljQWxpYXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTOgotCQkJCXJldHVybiB2YWx1ZXMgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0U6Ci0JCQkJcmV0dXJuIGlzU2V0RW50ZXJwcmlzZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVM6Ci0JCQkJcmV0dXJuIEVOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTX0VERUZBVUxUID09IG51bGwgPyBlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyAhPSBudWxsIDogIUVOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTX0VERUZBVUxULmVxdWFscyhlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19SRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRDoKLQkJCQlyZXR1cm4gaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0xFQUZfT05MWToKLQkJCQlyZXR1cm4gaXNTZXRMZWFmT25seSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNTZXRBbGxMZXZlbHNSZXF1aXJlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRDoKLQkJCQlyZXR1cm4gaXNTZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19NQVNLUzoKLQkJCQlyZXR1cm4gbWFza3MgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZpZWxkSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpZWxkTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhbGlhczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWxpYXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBob25ldGljQWxpYXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBob25ldGljQWxpYXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVudGVycHJpc2U6ICIpOwotCQlpZiAoZW50ZXJwcmlzZUVTZXQpIHJlc3VsdC5hcHBlbmQoZW50ZXJwcmlzZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkOiAiKTsKLQkJaWYgKHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZEVTZXQpIHJlc3VsdC5hcHBlbmQocmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGVhZk9ubHk6ICIpOwotCQlpZiAobGVhZk9ubHlFU2V0KSByZXN1bHQuYXBwZW5kKGxlYWZPbmx5KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWxsTGV2ZWxzUmVxdWlyZWQ6ICIpOwotCQlpZiAoYWxsTGV2ZWxzUmVxdWlyZWRFU2V0KSByZXN1bHQuYXBwZW5kKGFsbExldmVsc1JlcXVpcmVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb25seVRhYmxlVmFsdWVzQWxsb3dlZDogIik7Ci0JCWlmIChvbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCkgcmVzdWx0LmFwcGVuZChvbmx5VGFibGVWYWx1ZXNBbGxvd2VkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL091dGxpbmVDb2RlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGVzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNTdhNjU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2Rlc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGxpbmVDb2Rlc0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2Rlc0ltcGwjZ2V0T3V0bGluZUNvZGUgPGVtPk91dGxpbmUgQ29kZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGxpbmVDb2Rlc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE91dGxpbmVDb2RlcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0bGluZUNvZGUoKSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgb3V0bGluZUNvZGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGxpbmVDb2Rlc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRsaW5lQ29kZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0T3V0bGluZUNvZGUoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZSA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChPdXRsaW5lQ29kZS5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTX19PVVRMSU5FX0NPREUpOwotCQl9Ci0JCXJldHVybiBvdXRsaW5lQ29kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFU19fT1VUTElORV9DT0RFOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE91dGxpbmVDb2RlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTX19PVVRMSU5FX0NPREU6Ci0JCQkJcmV0dXJuIGdldE91dGxpbmVDb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVNfX09VVExJTkVfQ09ERToKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0T3V0bGluZUNvZGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFU19fT1VUTElORV9DT0RFOgotCQkJCWdldE91dGxpbmVDb2RlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTX19PVVRMSU5FX0NPREU6Ci0JCQkJcmV0dXJuIG91dGxpbmVDb2RlICE9IG51bGwgJiYgIW91dGxpbmVDb2RlLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vT3V0bGluZUNvZGVzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUHJlZGVjZXNzb3JMaW5rSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUHJlZGVjZXNzb3JMaW5rSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjI3MzRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ByZWRlY2Vzc29yTGlua0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByZWRlY2Vzc29yTGlua0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJlZGVjZXNzb3IgTGluazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjZ2V0UHJlZGVjZXNzb3JVSUQgPGVtPlByZWRlY2Vzc29yIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjaXNDcm9zc1Byb2plY3QgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsI2dldENyb3NzUHJvamVjdE5hbWUgPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjZ2V0TGlua0xhZyA8ZW0+TGluayBMYWc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsI2dldExhZ0Zvcm1hdCA8ZW0+TGFnIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByZWRlY2Vzc29yTGlua0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFByZWRlY2Vzc29yTGluayB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlY2Vzc29yVUlEKCkgPGVtPlByZWRlY2Vzc29yIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQUkVERUNFU1NPUl9VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZGVjZXNzb3JVSUQoKSA8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgcHJlZGVjZXNzb3JVSUQgPSBQUkVERUNFU1NPUl9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ3Jvc3NQcm9qZWN0KCkgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ1JPU1NfUFJPSkVDVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDcm9zc1Byb2plY3QoKSA8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDcm9zc1Byb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNyb3NzUHJvamVjdCA9IENST1NTX1BST0pFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENyb3NzIFByb2plY3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNyb3NzUHJvamVjdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcm9zc1Byb2plY3ROYW1lKCkgPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyb3NzUHJvamVjdE5hbWUoKSA8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcm9zc1Byb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNyb3NzUHJvamVjdE5hbWUgPSBDUk9TU19QUk9KRUNUX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlua0xhZygpIDxlbT5MaW5rIExhZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua0xhZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIExJTktfTEFHX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtMYWcoKSA8ZW0+TGluayBMYWc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtMYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxpbmtMYWcgPSBMSU5LX0xBR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYWdGb3JtYXQoKSA8ZW0+TGFnIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFnRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEFHX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYWdGb3JtYXQoKSA8ZW0+TGFnIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFnRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsYWdGb3JtYXQgPSBMQUdfRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByZWRlY2Vzc29yTGlua0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmVkZWNlc3NvckxpbmsoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQcmVkZWNlc3NvclVJRCgpIHsKLQkJcmV0dXJuIHByZWRlY2Vzc29yVUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWRlY2Vzc29yVUlEKEJpZ0ludGVnZXIgbmV3UHJlZGVjZXNzb3JVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRQcmVkZWNlc3NvclVJRCA9IHByZWRlY2Vzc29yVUlEOwotCQlwcmVkZWNlc3NvclVJRCA9IG5ld1ByZWRlY2Vzc29yVUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRCwgb2xkUHJlZGVjZXNzb3JVSUQsIHByZWRlY2Vzc29yVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIG5ld1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ3Jvc3NQcm9qZWN0KCkgewotCQlyZXR1cm4gY3Jvc3NQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyb3NzUHJvamVjdChib29sZWFuIG5ld0Nyb3NzUHJvamVjdCkgewotCQlib29sZWFuIG9sZENyb3NzUHJvamVjdCA9IGNyb3NzUHJvamVjdDsKLQkJY3Jvc3NQcm9qZWN0ID0gbmV3Q3Jvc3NQcm9qZWN0OwotCQlib29sZWFuIG9sZENyb3NzUHJvamVjdEVTZXQgPSBjcm9zc1Byb2plY3RFU2V0OwotCQljcm9zc1Byb2plY3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNULCBvbGRDcm9zc1Byb2plY3QsIGNyb3NzUHJvamVjdCwgIW9sZENyb3NzUHJvamVjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldENyb3NzUHJvamVjdCgpIHsKLQkJYm9vbGVhbiBvbGRDcm9zc1Byb2plY3QgPSBjcm9zc1Byb2plY3Q7Ci0JCWJvb2xlYW4gb2xkQ3Jvc3NQcm9qZWN0RVNldCA9IGNyb3NzUHJvamVjdEVTZXQ7Ci0JCWNyb3NzUHJvamVjdCA9IENST1NTX1BST0pFQ1RfRURFRkFVTFQ7Ci0JCWNyb3NzUHJvamVjdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1QsIG9sZENyb3NzUHJvamVjdCwgQ1JPU1NfUFJPSkVDVF9FREVGQVVMVCwgb2xkQ3Jvc3NQcm9qZWN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q3Jvc3NQcm9qZWN0KCkgewotCQlyZXR1cm4gY3Jvc3NQcm9qZWN0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyb3NzUHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBjcm9zc1Byb2plY3ROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyb3NzUHJvamVjdE5hbWUoU3RyaW5nIG5ld0Nyb3NzUHJvamVjdE5hbWUpIHsKLQkJU3RyaW5nIG9sZENyb3NzUHJvamVjdE5hbWUgPSBjcm9zc1Byb2plY3ROYW1lOwotCQljcm9zc1Byb2plY3ROYW1lID0gbmV3Q3Jvc3NQcm9qZWN0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUX05BTUUsIG9sZENyb3NzUHJvamVjdE5hbWUsIGNyb3NzUHJvamVjdE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMaW5rTGFnKCkgewotCQlyZXR1cm4gbGlua0xhZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5rTGFnKEJpZ0ludGVnZXIgbmV3TGlua0xhZykgewotCQlCaWdJbnRlZ2VyIG9sZExpbmtMYWcgPSBsaW5rTGFnOwotCQlsaW5rTGFnID0gbmV3TGlua0xhZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MSU5LX0xBRywgb2xkTGlua0xhZywgbGlua0xhZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExhZ0Zvcm1hdCgpIHsKLQkJcmV0dXJuIGxhZ0Zvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWdGb3JtYXQoQmlnSW50ZWdlciBuZXdMYWdGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRMYWdGb3JtYXQgPSBsYWdGb3JtYXQ7Ci0JCWxhZ0Zvcm1hdCA9IG5ld0xhZ0Zvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MQUdfRk9STUFULCBvbGRMYWdGb3JtYXQsIGxhZ0Zvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19QUkVERUNFU1NPUl9VSUQ6Ci0JCQkJcmV0dXJuIGdldFByZWRlY2Vzc29yVUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzQ3Jvc3NQcm9qZWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xJTktfTEFHOgotCQkJCXJldHVybiBnZXRMaW5rTGFnKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTEFHX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0TGFnRm9ybWF0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRDoKLQkJCQlzZXRQcmVkZWNlc3NvclVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1Q6Ci0JCQkJc2V0Q3Jvc3NQcm9qZWN0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUX05BTUU6Ci0JCQkJc2V0Q3Jvc3NQcm9qZWN0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTElOS19MQUc6Ci0JCQkJc2V0TGlua0xhZygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xBR19GT1JNQVQ6Ci0JCQkJc2V0TGFnRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRDoKLQkJCQlzZXRQcmVkZWNlc3NvclVJRChQUkVERUNFU1NPUl9VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1Q6Ci0JCQkJdW5zZXRDcm9zc1Byb2plY3QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVF9OQU1FOgotCQkJCXNldENyb3NzUHJvamVjdE5hbWUoQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTElOS19MQUc6Ci0JCQkJc2V0TGlua0xhZyhMSU5LX0xBR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xBR19GT1JNQVQ6Ci0JCQkJc2V0TGFnRm9ybWF0KExBR19GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRDoKLQkJCQlyZXR1cm4gUFJFREVDRVNTT1JfVUlEX0VERUZBVUxUID09IG51bGwgPyBwcmVkZWNlc3NvclVJRCAhPSBudWxsIDogIVBSRURFQ0VTU09SX1VJRF9FREVGQVVMVC5lcXVhbHMocHJlZGVjZXNzb3JVSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUOgotCQkJCXJldHVybiBpc1NldENyb3NzUHJvamVjdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBjcm9zc1Byb2plY3ROYW1lICE9IG51bGwgOiAhQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxULmVxdWFscyhjcm9zc1Byb2plY3ROYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MSU5LX0xBRzoKLQkJCQlyZXR1cm4gTElOS19MQUdfRURFRkFVTFQgPT0gbnVsbCA/IGxpbmtMYWcgIT0gbnVsbCA6ICFMSU5LX0xBR19FREVGQVVMVC5lcXVhbHMobGlua0xhZyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTEFHX0ZPUk1BVDoKLQkJCQlyZXR1cm4gTEFHX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gbGFnRm9ybWF0ICE9IG51bGwgOiAhTEFHX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMobGFnRm9ybWF0KTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHByZWRlY2Vzc29yVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVkZWNlc3NvclVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3Jvc3NQcm9qZWN0OiAiKTsKLQkJaWYgKGNyb3NzUHJvamVjdEVTZXQpIHJlc3VsdC5hcHBlbmQoY3Jvc3NQcm9qZWN0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3Jvc3NQcm9qZWN0TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3Jvc3NQcm9qZWN0TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGlua0xhZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGlua0xhZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFnRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYWdGb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QcmVkZWNlc3NvckxpbmtJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Qcm9qZWN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUHJvamVjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmUzZDgzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Qcm9qZWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc3MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2plY3RJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2plY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRUaXRsZSA8ZW0+VGl0bGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRTdWJqZWN0IDxlbT5TdWJqZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0Q29tcGFueSA8ZW0+Q29tcGFueTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldE1hbmFnZXIgPGVtPk1hbmFnZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRBdXRob3IgPGVtPkF1dGhvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldFJldmlzaW9uIDxlbT5SZXZpc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldExhc3RTYXZlZCA8ZW0+TGFzdCBTYXZlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzU2NoZWR1bGVGcm9tU3RhcnQgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEZZU3RhcnREYXRlIDxlbT5GWSBTdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0Q3JpdGljYWxTbGFja0xpbWl0IDxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEN1cnJlbmN5RGlnaXRzIDxlbT5DdXJyZW5jeSBEaWdpdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRDdXJyZW5jeVN5bWJvbCA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbiA8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldERlZmF1bHRTdGFydFRpbWUgPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldERlZmF1bHRGaW5pc2hUaW1lIDxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0TWludXRlc1BlckRheSA8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0TWludXRlc1BlcldlZWsgPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREYXlzUGVyTW9udGggPGVtPkRheXMgUGVyIE1vbnRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0RGVmYXVsdFRhc2tUeXBlIDxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsIDxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldERlZmF1bHRTdGFuZGFyZFJhdGUgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldERlZmF1bHRPdmVydGltZVJhdGUgPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRXb3JrRm9ybWF0IDxlbT5Xb3JrIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzRWRpdGFibGVBY3R1YWxDb3N0cyA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNIb25vckNvbnN0cmFpbnRzIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEVhcm5lZFZhbHVlTWV0aG9kIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzTmV3VGFza3NFZmZvcnREcml2ZW4gPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNOZXdUYXNrc0VzdGltYXRlZCA8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1NwcmVhZEFjdHVhbENvc3QgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzU3ByZWFkUGVyY2VudENvbXBsZXRlIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNGaXNjYWxZZWFyU3RhcnQgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0V2Vla1N0YXJ0RGF5IDxlbT5XZWVrIFN0YXJ0IERheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRTdGF0dXNEYXRlIDxlbT5TdGF0dXMgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEN1cnJlbnREYXRlIDxlbT5DdXJyZW50IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc0F1dG9saW5rIDxlbT5BdXRvbGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldE5ld1Rhc2tTdGFydERhdGUgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0VGFza0VWTWV0aG9kIDxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEV4dGVuZGVkQ3JlYXRpb25EYXRlIDxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNBY3R1YWxzSW5TeW5jIDxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNBZG1pblByb2plY3QgPGVtPkFkbWluIFByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRPdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRXQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0Q2FsZW5kYXJzIDxlbT5DYWxlbmRhcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRUYXNrcyA8ZW0+VGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRSZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEFzc2lnbm1lbnRzIDxlbT5Bc3NpZ25tZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBQcm9qZWN0IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpdGxlKCkgPGVtPlRpdGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaXRsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGl0bGUoKSA8ZW0+VGl0bGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRpdGxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlID0gVElUTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViamVjdCgpIDxlbT5TdWJqZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJKRUNUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YmplY3QoKSA8ZW0+U3ViamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdWJqZWN0ID0gU1VCSkVDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRlZ29yeSgpIDxlbT5DYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGVnb3J5KCkgPGVtPkNhdGVnb3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjYXRlZ29yeSA9IENBVEVHT1JZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbXBhbnkoKSA8ZW0+Q29tcGFueTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tcGFueSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFOWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21wYW55KCkgPGVtPkNvbXBhbnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbXBhbnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcGFueSA9IENPTVBBTllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFuYWdlcigpIDxlbT5NYW5hZ2VyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYW5hZ2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5BR0VSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hbmFnZXIoKSA8ZW0+TWFuYWdlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYW5hZ2VyID0gTUFOQUdFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3IoKSA8ZW0+QXV0aG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3IoKSA8ZW0+QXV0aG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXV0aG9yID0gQVVUSE9SX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uRGF0ZSgpIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IENSRUFUSU9OX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25EYXRlKCkgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGlvbkRhdGUgPSBDUkVBVElPTl9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJldmlzaW9uKCkgPGVtPlJldmlzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXZpc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFJFVklTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJldmlzaW9uKCkgPGVtPlJldmlzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXZpc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgcmV2aXNpb24gPSBSRVZJU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXN0U2F2ZWQoKSA8ZW0+TGFzdCBTYXZlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFzdFNhdmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBMQVNUX1NBVkVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhc3RTYXZlZCgpIDxlbT5MYXN0IFNhdmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXN0U2F2ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbGFzdFNhdmVkID0gTEFTVF9TQVZFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTQ0hFRFVMRV9GUk9NX1NUQVJUX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU2NoZWR1bGVGcm9tU3RhcnQoKSA8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2NoZWR1bGVGcm9tU3RhcnQgPSBTQ0hFRFVMRV9GUk9NX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBTY2hlZHVsZSBGcm9tIFN0YXJ0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzY2hlZHVsZUZyb21TdGFydEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydERhdGUoKSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVEFSVF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0RGF0ZSgpIDxlbT5TdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3RhcnREYXRlID0gU1RBUlRfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hEYXRlKCkgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hEYXRlKCkgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaERhdGUgPSBGSU5JU0hfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGWVN0YXJ0RGF0ZSgpIDxlbT5GWSBTdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGWVN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEZZU1RBUlRfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGWVN0YXJ0RGF0ZSgpIDxlbT5GWSBTdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGWVN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZllTdGFydERhdGUgPSBGWVNUQVJUX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCkgPGVtPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcml0aWNhbFNsYWNrTGltaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDUklUSUNBTF9TTEFDS19MSU1JVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcml0aWNhbFNsYWNrTGltaXQoKSA8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyaXRpY2FsU2xhY2tMaW1pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY3JpdGljYWxTbGFja0xpbWl0ID0gQ1JJVElDQUxfU0xBQ0tfTElNSVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lEaWdpdHMoKSA8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeURpZ2l0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIENVUlJFTkNZX0RJR0lUU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXJyZW5jeURpZ2l0cygpIDxlbT5DdXJyZW5jeSBEaWdpdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbmN5RGlnaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBjdXJyZW5jeURpZ2l0cyA9IENVUlJFTkNZX0RJR0lUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXJyZW5jeVN5bWJvbCgpIDxlbT5DdXJyZW5jeSBTeW1ib2w8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJSRU5DWV9TWU1CT0xfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lTeW1ib2woKSA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeVN5bWJvbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjdXJyZW5jeVN5bWJvbCA9IENVUlJFTkNZX1NZTUJPTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCkgPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCkgPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY3VycmVuY3lTeW1ib2xQb3NpdGlvbiA9IENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxlbmRhclVJRCgpIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ0FMRU5EQVJfVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGVuZGFyVUlEKCkgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGNhbGVuZGFyVUlEID0gQ0FMRU5EQVJfVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRTdGFydFRpbWUoKSA8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhcnRUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBERUZBVUxUX1NUQVJUX1RJTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFN0YXJ0VGltZSgpIDxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRTdGFydFRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZGVmYXVsdFN0YXJ0VGltZSA9IERFRkFVTFRfU1RBUlRfVElNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0RmluaXNoVGltZSgpIDxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0RmluaXNoVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgREVGQVVMVF9GSU5JU0hfVElNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0RmluaXNoVGltZSgpIDxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0RmluaXNoVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkZWZhdWx0RmluaXNoVGltZSA9IERFRkFVTFRfRklOSVNIX1RJTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWludXRlc1BlckRheSgpIDxlbT5NaW51dGVzIFBlciBEYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbnV0ZXNQZXJEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBNSU5VVEVTX1BFUl9EQVlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWludXRlc1BlckRheSgpIDxlbT5NaW51dGVzIFBlciBEYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbnV0ZXNQZXJEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG1pbnV0ZXNQZXJEYXkgPSBNSU5VVEVTX1BFUl9EQVlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWludXRlc1BlcldlZWsoKSA8ZW0+TWludXRlcyBQZXIgV2VlazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWludXRlc1BlcldlZWsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBNSU5VVEVTX1BFUl9XRUVLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZXNQZXJXZWVrKCkgPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbnV0ZXNQZXJXZWVrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBtaW51dGVzUGVyV2VlayA9IE1JTlVURVNfUEVSX1dFRUtfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF5c1Blck1vbnRoKCkgPGVtPkRheXMgUGVyIE1vbnRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXlzUGVyTW9udGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEQVlTX1BFUl9NT05USF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXlzUGVyTW9udGgoKSA8ZW0+RGF5cyBQZXIgTW9udGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERheXNQZXJNb250aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZGF5c1Blck1vbnRoID0gREFZU19QRVJfTU9OVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFRhc2tUeXBlKCkgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBERUZBVUxUX1RBU0tfVFlQRV9FREVGQVVMVCA9IG5ldyBCaWdJbnRlZ2VyKCIxIik7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0VGFza1R5cGUoKSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRUYXNrVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZGVmYXVsdFRhc2tUeXBlID0gREVGQVVMVF9UQVNLX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIERlZmF1bHQgVGFzayBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0VGFza1R5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKSA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKSA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCA9IERFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRTdGFuZGFyZFJhdGUoKSA8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfU1RBTkRBUkRfUkFURV9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGRlZmF1bHRTdGFuZGFyZFJhdGUgPSBERUZBVUxUX1NUQU5EQVJEX1JBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIERlZmF1bHQgU3RhbmRhcmQgUmF0ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkgPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX09WRVJUSU1FX1JBVEVfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpIDxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBkZWZhdWx0T3ZlcnRpbWVSYXRlID0gREVGQVVMVF9PVkVSVElNRV9SQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBEZWZhdWx0IE92ZXJ0aW1lIFJhdGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRPdmVydGltZVJhdGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdCA9IERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrRm9ybWF0KCkgPGVtPldvcmsgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgV09SS19GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya0Zvcm1hdCgpIDxlbT5Xb3JrIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya0Zvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgd29ya0Zvcm1hdCA9IFdPUktfRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVESVRBQkxFX0FDVFVBTF9DT1NUU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkgPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZGl0YWJsZUFjdHVhbENvc3RzID0gRURJVEFCTEVfQUNUVUFMX0NPU1RTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFZGl0YWJsZSBBY3R1YWwgQ29zdHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIb25vckNvbnN0cmFpbnRzKCkgPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBIT05PUl9DT05TVFJBSU5UU19FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hvbm9yQ29uc3RyYWludHMoKSA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSG9ub3JDb25zdHJhaW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaG9ub3JDb25zdHJhaW50cyA9IEhPTk9SX0NPTlNUUkFJTlRTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBIb25vciBDb25zdHJhaW50cyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaG9ub3JDb25zdHJhaW50c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKSA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGVhcm5lZFZhbHVlTWV0aG9kID0gRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpIDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5TRVJURURfUFJPSkVDVFNfTElLRV9TVU1NQVJZX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSA9IElOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnlFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKSA8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTVVMVElQTEVfQ1JJVElDQUxfUEFUSFNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkgPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbXVsdGlwbGVDcml0aWNhbFBhdGhzID0gTVVMVElQTEVfQ1JJVElDQUxfUEFUSFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE11bHRpcGxlIENyaXRpY2FsIFBhdGhzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtdWx0aXBsZUNyaXRpY2FsUGF0aHNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE5FV19UQVNLU19FRkZPUlRfRFJJVkVOX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTmV3VGFza3NFZmZvcnREcml2ZW4oKSA8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5ld1Rhc2tzRWZmb3J0RHJpdmVuID0gTkVXX1RBU0tTX0VGRk9SVF9EUklWRU5fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05ld1Rhc2tzRXN0aW1hdGVkKCkgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBORVdfVEFTS1NfRVNUSU1BVEVEX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTmV3VGFza3NFc3RpbWF0ZWQoKSA8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNOZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbmV3VGFza3NFc3RpbWF0ZWQgPSBORVdfVEFTS1NfRVNUSU1BVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBOZXcgVGFza3MgRXN0aW1hdGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZXdUYXNrc0VzdGltYXRlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1BMSVRTX0lOX1BST0dSRVNTX1RBU0tTX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkgPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwbGl0c0luUHJvZ3Jlc3NUYXNrcyA9IFNQTElUU19JTl9QUk9HUkVTU19UQVNLU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU3BsaXRzIEluIFByb2dyZXNzIFRhc2tzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGxpdHNJblByb2dyZXNzVGFza3NFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTcHJlYWRBY3R1YWxDb3N0KCkgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1BSRUFEX0FDVFVBTF9DT1NUX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3ByZWFkQWN0dWFsQ29zdCgpIDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3ByZWFkQWN0dWFsQ29zdCA9IFNQUkVBRF9BQ1RVQUxfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU3ByZWFkIEFjdHVhbCBDb3N0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcHJlYWRBY3R1YWxDb3N0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkgPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQUkVBRF9QRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwcmVhZFBlcmNlbnRDb21wbGV0ZSA9IFNQUkVBRF9QRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBTcHJlYWQgUGVyY2VudCBDb21wbGV0ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3ByZWFkUGVyY2VudENvbXBsZXRlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFRBU0tfVVBEQVRFU19SRVNPVVJDRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkgPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0YXNrVXBkYXRlc1Jlc291cmNlID0gVEFTS19VUERBVEVTX1JFU09VUkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUYXNrIFVwZGF0ZXMgUmVzb3VyY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaXNjYWxZZWFyU3RhcnQoKSA8ZW0+RmlzY2FsIFllYXIgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRklTQ0FMX1lFQVJfU1RBUlRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmlzY2FsWWVhclN0YXJ0KCkgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Zpc2NhbFllYXJTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlzY2FsWWVhclN0YXJ0ID0gRklTQ0FMX1lFQVJfU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEZpc2NhbCBZZWFyIFN0YXJ0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaXNjYWxZZWFyU3RhcnRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2Vla1N0YXJ0RGF5KCkgPGVtPldlZWsgU3RhcnQgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWVrU3RhcnREYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBXRUVLX1NUQVJUX0RBWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWVrU3RhcnREYXkoKSA8ZW0+V2VlayBTdGFydCBEYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlZWtTdGFydERheSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgd2Vla1N0YXJ0RGF5ID0gV0VFS19TVEFSVF9EQVlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKSA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1PVkVfQ09NUExFVEVEX0VORFNfQkFDS19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKSA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZUNvbXBsZXRlZEVuZHNCYWNrID0gTU9WRV9DT01QTEVURURfRU5EU19CQUNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2sgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0tfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKSA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1vdmVSZW1haW5pbmdTdGFydHNCYWNrID0gTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0tfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKSA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkID0gTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPSBNT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKSA8ZW0+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpIDxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBiYXNlbGluZUZvckVhcm5lZFZhbHVlID0gQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpIDxlbT5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLU19FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpIDxlbT5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA9IEFVVE9fQUREX05FV19SRVNPVVJDRVNfQU5EX1RBU0tTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXR1c0RhdGUoKSA8ZW0+U3RhdHVzIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXR1c0RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFNUQVRVU19EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXR1c0RhdGUoKSA8ZW0+U3RhdHVzIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXR1c0RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3RhdHVzRGF0ZSA9IFNUQVRVU19EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1cnJlbnREYXRlKCkgPGVtPkN1cnJlbnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VycmVudERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IENVUlJFTlRfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXJyZW50RGF0ZSgpIDxlbT5DdXJyZW50IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGN1cnJlbnREYXRlID0gQ1VSUkVOVF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpIDxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSA8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMID0gTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0F1dG9saW5rKCkgPGVtPkF1dG9saW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0F1dG9saW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVVUT0xJTktfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXV0b2xpbmsoKSA8ZW0+QXV0b2xpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXV0b2xpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF1dG9saW5rID0gQVVUT0xJTktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEF1dG9saW5rIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvbGlua0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROZXdUYXNrU3RhcnREYXRlKCkgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5ld1Rhc2tTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBORVdfVEFTS19TVEFSVF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5ld1Rhc2tTdGFydERhdGUoKSA8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmV3VGFza1N0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbmV3VGFza1N0YXJ0RGF0ZSA9IE5FV19UQVNLX1NUQVJUX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpIDxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza0VWTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVGQVVMVF9UQVNLX0VWX01FVEhPRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0VGFza0VWTWV0aG9kKCkgPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRUYXNrRVZNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGRlZmF1bHRUYXNrRVZNZXRob2QgPSBERUZBVUxUX1RBU0tfRVZfTUVUSE9EX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBST0pFQ1RfRVhURVJOQUxMWV9FRElURURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPSBQUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBQcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpIDxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRVhURU5ERURfQ1JFQVRJT05fREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpIDxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBleHRlbmRlZENyZWF0aW9uRGF0ZSA9IEVYVEVOREVEX0NSRUFUSU9OX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBY3R1YWxzSW5TeW5jKCkgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBY3R1YWxzSW5TeW5jKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQUNUVUFMU19JTl9TWU5DX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FjdHVhbHNJblN5bmMoKSA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0FjdHVhbHNJblN5bmMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjdHVhbHNJblN5bmMgPSBBQ1RVQUxTX0lOX1NZTkNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFjdHVhbHMgSW4gU3luYyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWN0dWFsc0luU3luY0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkgPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRU1PVkVfRklMRV9QUk9QRVJUSUVTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkgPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpbGVQcm9wZXJ0aWVzID0gUkVNT1ZFX0ZJTEVfUFJPUEVSVElFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVtb3ZlIEZpbGUgUHJvcGVydGllcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBZG1pblByb2plY3QoKSA8ZW0+QWRtaW4gUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBZG1pblByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBRE1JTl9QUk9KRUNUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FkbWluUHJvamVjdCgpIDxlbT5BZG1pbiBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0FkbWluUHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRtaW5Qcm9qZWN0ID0gQURNSU5fUFJPSkVDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQWRtaW4gUHJvamVjdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRtaW5Qcm9qZWN0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0bGluZUNvZGVzKCkgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE91dGxpbmVDb2RlcyBvdXRsaW5lQ29kZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V0JTTWFza3MoKSA8ZW0+V0JTIE1hc2tzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXQlNNYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFdCU01hc2tzIHdCU01hc2tzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVuZGVkQXR0cmlidXRlcygpIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFeHRlbmRlZEF0dHJpYnV0ZXMgZXh0ZW5kZWRBdHRyaWJ1dGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGVuZGFycygpIDxlbT5DYWxlbmRhcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGVuZGFycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENhbGVuZGFycyBjYWxlbmRhcnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFza3MoKSA8ZW0+VGFza3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza3MgdGFza3MgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VzKCkgPGVtPlJlc291cmNlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VzIHJlc291cmNlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NpZ25tZW50cygpIDxlbT5Bc3NpZ25tZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzaWdubWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBBc3NpZ25tZW50cyBhc3NpZ25tZW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvamVjdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9qZWN0KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKFN0cmluZyBuZXdVSUQpIHsKLQkJU3RyaW5nIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyBuZXdUaXRsZSkgewotCQlTdHJpbmcgb2xkVGl0bGUgPSB0aXRsZTsKLQkJdGl0bGUgPSBuZXdUaXRsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19USVRMRSwgb2xkVGl0bGUsIHRpdGxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdWJqZWN0KCkgewotCQlyZXR1cm4gc3ViamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdWJqZWN0KFN0cmluZyBuZXdTdWJqZWN0KSB7Ci0JCVN0cmluZyBvbGRTdWJqZWN0ID0gc3ViamVjdDsKLQkJc3ViamVjdCA9IG5ld1N1YmplY3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1VCSkVDVCwgb2xkU3ViamVjdCwgc3ViamVjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeShTdHJpbmcgbmV3Q2F0ZWdvcnkpIHsKLQkJU3RyaW5nIG9sZENhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCWNhdGVnb3J5ID0gbmV3Q2F0ZWdvcnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FURUdPUlksIG9sZENhdGVnb3J5LCBjYXRlZ29yeSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFueSgpIHsKLQkJcmV0dXJuIGNvbXBhbnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tcGFueShTdHJpbmcgbmV3Q29tcGFueSkgewotCQlTdHJpbmcgb2xkQ29tcGFueSA9IGNvbXBhbnk7Ci0JCWNvbXBhbnkgPSBuZXdDb21wYW55OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NPTVBBTlksIG9sZENvbXBhbnksIGNvbXBhbnkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hbmFnZXIoKSB7Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hbmFnZXIoU3RyaW5nIG5ld01hbmFnZXIpIHsKLQkJU3RyaW5nIG9sZE1hbmFnZXIgPSBtYW5hZ2VyOwotCQltYW5hZ2VyID0gbmV3TWFuYWdlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NQU5BR0VSLCBvbGRNYW5hZ2VyLCBtYW5hZ2VyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRob3IoKSB7Ci0JCXJldHVybiBhdXRob3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0aG9yKFN0cmluZyBuZXdBdXRob3IpIHsKLQkJU3RyaW5nIG9sZEF1dGhvciA9IGF1dGhvcjsKLQkJYXV0aG9yID0gbmV3QXV0aG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVEhPUiwgb2xkQXV0aG9yLCBhdXRob3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0aW9uRGF0ZSgpIHsKLQkJcmV0dXJuIGNyZWF0aW9uRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbkRhdGUoT2JqZWN0IG5ld0NyZWF0aW9uRGF0ZSkgewotCQlPYmplY3Qgb2xkQ3JlYXRpb25EYXRlID0gY3JlYXRpb25EYXRlOwotCQljcmVhdGlvbkRhdGUgPSBuZXdDcmVhdGlvbkRhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JFQVRJT05fREFURSwgb2xkQ3JlYXRpb25EYXRlLCBjcmVhdGlvbkRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRSZXZpc2lvbigpIHsKLQkJcmV0dXJuIHJldmlzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJldmlzaW9uKEJpZ0ludGVnZXIgbmV3UmV2aXNpb24pIHsKLQkJQmlnSW50ZWdlciBvbGRSZXZpc2lvbiA9IHJldmlzaW9uOwotCQlyZXZpc2lvbiA9IG5ld1JldmlzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFVklTSU9OLCBvbGRSZXZpc2lvbiwgcmV2aXNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhc3RTYXZlZCgpIHsKLQkJcmV0dXJuIGxhc3RTYXZlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXN0U2F2ZWQoT2JqZWN0IG5ld0xhc3RTYXZlZCkgewotCQlPYmplY3Qgb2xkTGFzdFNhdmVkID0gbGFzdFNhdmVkOwotCQlsYXN0U2F2ZWQgPSBuZXdMYXN0U2F2ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTEFTVF9TQVZFRCwgb2xkTGFzdFNhdmVkLCBsYXN0U2F2ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NjaGVkdWxlRnJvbVN0YXJ0KCkgewotCQlyZXR1cm4gc2NoZWR1bGVGcm9tU3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NoZWR1bGVGcm9tU3RhcnQoYm9vbGVhbiBuZXdTY2hlZHVsZUZyb21TdGFydCkgewotCQlib29sZWFuIG9sZFNjaGVkdWxlRnJvbVN0YXJ0ID0gc2NoZWR1bGVGcm9tU3RhcnQ7Ci0JCXNjaGVkdWxlRnJvbVN0YXJ0ID0gbmV3U2NoZWR1bGVGcm9tU3RhcnQ7Ci0JCWJvb2xlYW4gb2xkU2NoZWR1bGVGcm9tU3RhcnRFU2V0ID0gc2NoZWR1bGVGcm9tU3RhcnRFU2V0OwotCQlzY2hlZHVsZUZyb21TdGFydEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NDSEVEVUxFX0ZST01fU1RBUlQsIG9sZFNjaGVkdWxlRnJvbVN0YXJ0LCBzY2hlZHVsZUZyb21TdGFydCwgIW9sZFNjaGVkdWxlRnJvbVN0YXJ0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U2NoZWR1bGVGcm9tU3RhcnQoKSB7Ci0JCWJvb2xlYW4gb2xkU2NoZWR1bGVGcm9tU3RhcnQgPSBzY2hlZHVsZUZyb21TdGFydDsKLQkJYm9vbGVhbiBvbGRTY2hlZHVsZUZyb21TdGFydEVTZXQgPSBzY2hlZHVsZUZyb21TdGFydEVTZXQ7Ci0JCXNjaGVkdWxlRnJvbVN0YXJ0ID0gU0NIRURVTEVfRlJPTV9TVEFSVF9FREVGQVVMVDsKLQkJc2NoZWR1bGVGcm9tU3RhcnRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TQ0hFRFVMRV9GUk9NX1NUQVJULCBvbGRTY2hlZHVsZUZyb21TdGFydCwgU0NIRURVTEVfRlJPTV9TVEFSVF9FREVGQVVMVCwgb2xkU2NoZWR1bGVGcm9tU3RhcnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTY2hlZHVsZUZyb21TdGFydCgpIHsKLQkJcmV0dXJuIHNjaGVkdWxlRnJvbVN0YXJ0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIHN0YXJ0RGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydERhdGUoT2JqZWN0IG5ld1N0YXJ0RGF0ZSkgewotCQlPYmplY3Qgb2xkU3RhcnREYXRlID0gc3RhcnREYXRlOwotCQlzdGFydERhdGUgPSBuZXdTdGFydERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBUlRfREFURSwgb2xkU3RhcnREYXRlLCBzdGFydERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaERhdGUoKSB7Ci0JCXJldHVybiBmaW5pc2hEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaERhdGUoT2JqZWN0IG5ld0ZpbmlzaERhdGUpIHsKLQkJT2JqZWN0IG9sZEZpbmlzaERhdGUgPSBmaW5pc2hEYXRlOwotCQlmaW5pc2hEYXRlID0gbmV3RmluaXNoRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSU5JU0hfREFURSwgb2xkRmluaXNoRGF0ZSwgZmluaXNoRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEZZU3RhcnREYXRlKCkgewotCQlyZXR1cm4gZllTdGFydERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RllTdGFydERhdGUoQmlnSW50ZWdlciBuZXdGWVN0YXJ0RGF0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZEZZU3RhcnREYXRlID0gZllTdGFydERhdGU7Ci0JCWZZU3RhcnREYXRlID0gbmV3RllTdGFydERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRllTVEFSVF9EQVRFLCBvbGRGWVN0YXJ0RGF0ZSwgZllTdGFydERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRDcml0aWNhbFNsYWNrTGltaXQoKSB7Ci0JCXJldHVybiBjcml0aWNhbFNsYWNrTGltaXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JpdGljYWxTbGFja0xpbWl0KEJpZ0ludGVnZXIgbmV3Q3JpdGljYWxTbGFja0xpbWl0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ3JpdGljYWxTbGFja0xpbWl0ID0gY3JpdGljYWxTbGFja0xpbWl0OwotCQljcml0aWNhbFNsYWNrTGltaXQgPSBuZXdDcml0aWNhbFNsYWNrTGltaXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JJVElDQUxfU0xBQ0tfTElNSVQsIG9sZENyaXRpY2FsU2xhY2tMaW1pdCwgY3JpdGljYWxTbGFja0xpbWl0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q3VycmVuY3lEaWdpdHMoKSB7Ci0JCXJldHVybiBjdXJyZW5jeURpZ2l0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW5jeURpZ2l0cyhCaWdJbnRlZ2VyIG5ld0N1cnJlbmN5RGlnaXRzKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ3VycmVuY3lEaWdpdHMgPSBjdXJyZW5jeURpZ2l0czsKLQkJY3VycmVuY3lEaWdpdHMgPSBuZXdDdXJyZW5jeURpZ2l0czsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9ESUdJVFMsIG9sZEN1cnJlbmN5RGlnaXRzLCBjdXJyZW5jeURpZ2l0cykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVuY3lTeW1ib2woKSB7Ci0JCXJldHVybiBjdXJyZW5jeVN5bWJvbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW5jeVN5bWJvbChTdHJpbmcgbmV3Q3VycmVuY3lTeW1ib2wpIHsKLQkJU3RyaW5nIG9sZEN1cnJlbmN5U3ltYm9sID0gY3VycmVuY3lTeW1ib2w7Ci0JCWN1cnJlbmN5U3ltYm9sID0gbmV3Q3VycmVuY3lTeW1ib2w7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MLCBvbGRDdXJyZW5jeVN5bWJvbCwgY3VycmVuY3lTeW1ib2wpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCkgewotCQlyZXR1cm4gY3VycmVuY3lTeW1ib2xQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKEJpZ0ludGVnZXIgbmV3Q3VycmVuY3lTeW1ib2xQb3NpdGlvbikgewotCQlCaWdJbnRlZ2VyIG9sZEN1cnJlbmN5U3ltYm9sUG9zaXRpb24gPSBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uOwotCQljdXJyZW5jeVN5bWJvbFBvc2l0aW9uID0gbmV3Q3VycmVuY3lTeW1ib2xQb3NpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9TWU1CT0xfUE9TSVRJT04sIG9sZEN1cnJlbmN5U3ltYm9sUG9zaXRpb24sIGN1cnJlbmN5U3ltYm9sUG9zaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRDYWxlbmRhclVJRCgpIHsKLQkJcmV0dXJuIGNhbGVuZGFyVUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIgbmV3Q2FsZW5kYXJVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRDYWxlbmRhclVJRCA9IGNhbGVuZGFyVUlEOwotCQljYWxlbmRhclVJRCA9IG5ld0NhbGVuZGFyVUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSX1VJRCwgb2xkQ2FsZW5kYXJVSUQsIGNhbGVuZGFyVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0U3RhcnRUaW1lKCkgewotCQlyZXR1cm4gZGVmYXVsdFN0YXJ0VGltZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0U3RhcnRUaW1lKE9iamVjdCBuZXdEZWZhdWx0U3RhcnRUaW1lKSB7Ci0JCU9iamVjdCBvbGREZWZhdWx0U3RhcnRUaW1lID0gZGVmYXVsdFN0YXJ0VGltZTsKLQkJZGVmYXVsdFN0YXJ0VGltZSA9IG5ld0RlZmF1bHRTdGFydFRpbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9TVEFSVF9USU1FLCBvbGREZWZhdWx0U3RhcnRUaW1lLCBkZWZhdWx0U3RhcnRUaW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0RmluaXNoVGltZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRGaW5pc2hUaW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRGaW5pc2hUaW1lKE9iamVjdCBuZXdEZWZhdWx0RmluaXNoVGltZSkgewotCQlPYmplY3Qgb2xkRGVmYXVsdEZpbmlzaFRpbWUgPSBkZWZhdWx0RmluaXNoVGltZTsKLQkJZGVmYXVsdEZpbmlzaFRpbWUgPSBuZXdEZWZhdWx0RmluaXNoVGltZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJTklTSF9USU1FLCBvbGREZWZhdWx0RmluaXNoVGltZSwgZGVmYXVsdEZpbmlzaFRpbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRNaW51dGVzUGVyRGF5KCkgewotCQlyZXR1cm4gbWludXRlc1BlckRheTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaW51dGVzUGVyRGF5KEJpZ0ludGVnZXIgbmV3TWludXRlc1BlckRheSkgewotCQlCaWdJbnRlZ2VyIG9sZE1pbnV0ZXNQZXJEYXkgPSBtaW51dGVzUGVyRGF5OwotCQltaW51dGVzUGVyRGF5ID0gbmV3TWludXRlc1BlckRheTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9EQVksIG9sZE1pbnV0ZXNQZXJEYXksIG1pbnV0ZXNQZXJEYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRNaW51dGVzUGVyV2VlaygpIHsKLQkJcmV0dXJuIG1pbnV0ZXNQZXJXZWVrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbnV0ZXNQZXJXZWVrKEJpZ0ludGVnZXIgbmV3TWludXRlc1BlcldlZWspIHsKLQkJQmlnSW50ZWdlciBvbGRNaW51dGVzUGVyV2VlayA9IG1pbnV0ZXNQZXJXZWVrOwotCQltaW51dGVzUGVyV2VlayA9IG5ld01pbnV0ZXNQZXJXZWVrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JTlVURVNfUEVSX1dFRUssIG9sZE1pbnV0ZXNQZXJXZWVrLCBtaW51dGVzUGVyV2VlaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldERheXNQZXJNb250aCgpIHsKLQkJcmV0dXJuIGRheXNQZXJNb250aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXlzUGVyTW9udGgoQmlnSW50ZWdlciBuZXdEYXlzUGVyTW9udGgpIHsKLQkJQmlnSW50ZWdlciBvbGREYXlzUGVyTW9udGggPSBkYXlzUGVyTW9udGg7Ci0JCWRheXNQZXJNb250aCA9IG5ld0RheXNQZXJNb250aDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EQVlTX1BFUl9NT05USCwgb2xkRGF5c1Blck1vbnRoLCBkYXlzUGVyTW9udGgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREZWZhdWx0VGFza1R5cGUoKSB7Ci0JCXJldHVybiBkZWZhdWx0VGFza1R5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFRhc2tUeXBlKEJpZ0ludGVnZXIgbmV3RGVmYXVsdFRhc2tUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGVmYXVsdFRhc2tUeXBlID0gZGVmYXVsdFRhc2tUeXBlOwotCQlkZWZhdWx0VGFza1R5cGUgPSBuZXdEZWZhdWx0VGFza1R5cGU7Ci0JCWJvb2xlYW4gb2xkRGVmYXVsdFRhc2tUeXBlRVNldCA9IGRlZmF1bHRUYXNrVHlwZUVTZXQ7Ci0JCWRlZmF1bHRUYXNrVHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfVEFTS19UWVBFLCBvbGREZWZhdWx0VGFza1R5cGUsIGRlZmF1bHRUYXNrVHlwZSwgIW9sZERlZmF1bHRUYXNrVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldERlZmF1bHRUYXNrVHlwZSgpIHsKLQkJQmlnSW50ZWdlciBvbGREZWZhdWx0VGFza1R5cGUgPSBkZWZhdWx0VGFza1R5cGU7Ci0JCWJvb2xlYW4gb2xkRGVmYXVsdFRhc2tUeXBlRVNldCA9IGRlZmF1bHRUYXNrVHlwZUVTZXQ7Ci0JCWRlZmF1bHRUYXNrVHlwZSA9IERFRkFVTFRfVEFTS19UWVBFX0VERUZBVUxUOwotCQlkZWZhdWx0VGFza1R5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRSwgb2xkRGVmYXVsdFRhc2tUeXBlLCBERUZBVUxUX1RBU0tfVFlQRV9FREVGQVVMVCwgb2xkRGVmYXVsdFRhc2tUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RGVmYXVsdFRhc2tUeXBlKCkgewotCQlyZXR1cm4gZGVmYXVsdFRhc2tUeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRGaXhlZENvc3RBY2NydWFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKEJpZ0ludGVnZXIgbmV3RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwpIHsKLQkJQmlnSW50ZWdlciBvbGREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCA9IGRlZmF1bHRGaXhlZENvc3RBY2NydWFsOwotCQlkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCA9IG5ld0RlZmF1bHRGaXhlZENvc3RBY2NydWFsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMLCBvbGREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCwgZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRTdGFuZGFyZFJhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZShmbG9hdCBuZXdEZWZhdWx0U3RhbmRhcmRSYXRlKSB7Ci0JCWZsb2F0IG9sZERlZmF1bHRTdGFuZGFyZFJhdGUgPSBkZWZhdWx0U3RhbmRhcmRSYXRlOwotCQlkZWZhdWx0U3RhbmRhcmRSYXRlID0gbmV3RGVmYXVsdFN0YW5kYXJkUmF0ZTsKLQkJYm9vbGVhbiBvbGREZWZhdWx0U3RhbmRhcmRSYXRlRVNldCA9IGRlZmF1bHRTdGFuZGFyZFJhdGVFU2V0OwotCQlkZWZhdWx0U3RhbmRhcmRSYXRlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9TVEFOREFSRF9SQVRFLCBvbGREZWZhdWx0U3RhbmRhcmRSYXRlLCBkZWZhdWx0U3RhbmRhcmRSYXRlLCAhb2xkRGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldERlZmF1bHRTdGFuZGFyZFJhdGUoKSB7Ci0JCWZsb2F0IG9sZERlZmF1bHRTdGFuZGFyZFJhdGUgPSBkZWZhdWx0U3RhbmRhcmRSYXRlOwotCQlib29sZWFuIG9sZERlZmF1bHRTdGFuZGFyZFJhdGVFU2V0ID0gZGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQ7Ci0JCWRlZmF1bHRTdGFuZGFyZFJhdGUgPSBERUZBVUxUX1NUQU5EQVJEX1JBVEVfRURFRkFVTFQ7Ci0JCWRlZmF1bHRTdGFuZGFyZFJhdGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQU5EQVJEX1JBVEUsIG9sZERlZmF1bHRTdGFuZGFyZFJhdGUsIERFRkFVTFRfU1RBTkRBUkRfUkFURV9FREVGQVVMVCwgb2xkRGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldERlZmF1bHRTdGFuZGFyZFJhdGUoKSB7Ci0JCXJldHVybiBkZWZhdWx0U3RhbmRhcmRSYXRlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRPdmVydGltZVJhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZShmbG9hdCBuZXdEZWZhdWx0T3ZlcnRpbWVSYXRlKSB7Ci0JCWZsb2F0IG9sZERlZmF1bHRPdmVydGltZVJhdGUgPSBkZWZhdWx0T3ZlcnRpbWVSYXRlOwotCQlkZWZhdWx0T3ZlcnRpbWVSYXRlID0gbmV3RGVmYXVsdE92ZXJ0aW1lUmF0ZTsKLQkJYm9vbGVhbiBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCA9IGRlZmF1bHRPdmVydGltZVJhdGVFU2V0OwotCQlkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFLCBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlLCBkZWZhdWx0T3ZlcnRpbWVSYXRlLCAhb2xkRGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldERlZmF1bHRPdmVydGltZVJhdGUoKSB7Ci0JCWZsb2F0IG9sZERlZmF1bHRPdmVydGltZVJhdGUgPSBkZWZhdWx0T3ZlcnRpbWVSYXRlOwotCQlib29sZWFuIG9sZERlZmF1bHRPdmVydGltZVJhdGVFU2V0ID0gZGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQ7Ci0JCWRlZmF1bHRPdmVydGltZVJhdGUgPSBERUZBVUxUX09WRVJUSU1FX1JBVEVfRURFRkFVTFQ7Ci0JCWRlZmF1bHRPdmVydGltZVJhdGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX09WRVJUSU1FX1JBVEUsIG9sZERlZmF1bHRPdmVydGltZVJhdGUsIERFRkFVTFRfT1ZFUlRJTUVfUkFURV9FREVGQVVMVCwgb2xkRGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldERlZmF1bHRPdmVydGltZVJhdGUoKSB7Ci0JCXJldHVybiBkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpIHsKLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgbmV3RHVyYXRpb25Gb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGREdXJhdGlvbkZvcm1hdCA9IGR1cmF0aW9uRm9ybWF0OwotCQlkdXJhdGlvbkZvcm1hdCA9IG5ld0R1cmF0aW9uRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RVUkFUSU9OX0ZPUk1BVCwgb2xkRHVyYXRpb25Gb3JtYXQsIGR1cmF0aW9uRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0V29ya0Zvcm1hdCgpIHsKLQkJcmV0dXJuIHdvcmtGb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya0Zvcm1hdChCaWdJbnRlZ2VyIG5ld1dvcmtGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRXb3JrRm9ybWF0ID0gd29ya0Zvcm1hdDsKLQkJd29ya0Zvcm1hdCA9IG5ld1dvcmtGb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV09SS19GT1JNQVQsIG9sZFdvcmtGb3JtYXQsIHdvcmtGb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlQWN0dWFsQ29zdHMoKSB7Ci0JCXJldHVybiBlZGl0YWJsZUFjdHVhbENvc3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlQWN0dWFsQ29zdHMoYm9vbGVhbiBuZXdFZGl0YWJsZUFjdHVhbENvc3RzKSB7Ci0JCWJvb2xlYW4gb2xkRWRpdGFibGVBY3R1YWxDb3N0cyA9IGVkaXRhYmxlQWN0dWFsQ29zdHM7Ci0JCWVkaXRhYmxlQWN0dWFsQ29zdHMgPSBuZXdFZGl0YWJsZUFjdHVhbENvc3RzOwotCQlib29sZWFuIG9sZEVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0ID0gZWRpdGFibGVBY3R1YWxDb3N0c0VTZXQ7Ci0JCWVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FRElUQUJMRV9BQ1RVQUxfQ09TVFMsIG9sZEVkaXRhYmxlQWN0dWFsQ29zdHMsIGVkaXRhYmxlQWN0dWFsQ29zdHMsICFvbGRFZGl0YWJsZUFjdHVhbENvc3RzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RWRpdGFibGVBY3R1YWxDb3N0cygpIHsKLQkJYm9vbGVhbiBvbGRFZGl0YWJsZUFjdHVhbENvc3RzID0gZWRpdGFibGVBY3R1YWxDb3N0czsKLQkJYm9vbGVhbiBvbGRFZGl0YWJsZUFjdHVhbENvc3RzRVNldCA9IGVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0OwotCQllZGl0YWJsZUFjdHVhbENvc3RzID0gRURJVEFCTEVfQUNUVUFMX0NPU1RTX0VERUZBVUxUOwotCQllZGl0YWJsZUFjdHVhbENvc3RzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRURJVEFCTEVfQUNUVUFMX0NPU1RTLCBvbGRFZGl0YWJsZUFjdHVhbENvc3RzLCBFRElUQUJMRV9BQ1RVQUxfQ09TVFNfRURFRkFVTFQsIG9sZEVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFZGl0YWJsZUFjdHVhbENvc3RzKCkgewotCQlyZXR1cm4gZWRpdGFibGVBY3R1YWxDb3N0c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIb25vckNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gaG9ub3JDb25zdHJhaW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb25vckNvbnN0cmFpbnRzKGJvb2xlYW4gbmV3SG9ub3JDb25zdHJhaW50cykgewotCQlib29sZWFuIG9sZEhvbm9yQ29uc3RyYWludHMgPSBob25vckNvbnN0cmFpbnRzOwotCQlob25vckNvbnN0cmFpbnRzID0gbmV3SG9ub3JDb25zdHJhaW50czsKLQkJYm9vbGVhbiBvbGRIb25vckNvbnN0cmFpbnRzRVNldCA9IGhvbm9yQ29uc3RyYWludHNFU2V0OwotCQlob25vckNvbnN0cmFpbnRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFMsIG9sZEhvbm9yQ29uc3RyYWludHMsIGhvbm9yQ29uc3RyYWludHMsICFvbGRIb25vckNvbnN0cmFpbnRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SG9ub3JDb25zdHJhaW50cygpIHsKLQkJYm9vbGVhbiBvbGRIb25vckNvbnN0cmFpbnRzID0gaG9ub3JDb25zdHJhaW50czsKLQkJYm9vbGVhbiBvbGRIb25vckNvbnN0cmFpbnRzRVNldCA9IGhvbm9yQ29uc3RyYWludHNFU2V0OwotCQlob25vckNvbnN0cmFpbnRzID0gSE9OT1JfQ09OU1RSQUlOVFNfRURFRkFVTFQ7Ci0JCWhvbm9yQ29uc3RyYWludHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19IT05PUl9DT05TVFJBSU5UUywgb2xkSG9ub3JDb25zdHJhaW50cywgSE9OT1JfQ09OU1RSQUlOVFNfRURFRkFVTFQsIG9sZEhvbm9yQ29uc3RyYWludHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRIb25vckNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gaG9ub3JDb25zdHJhaW50c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RWFybmVkVmFsdWVNZXRob2QoKSB7Ci0JCXJldHVybiBlYXJuZWRWYWx1ZU1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFYXJuZWRWYWx1ZU1ldGhvZChCaWdJbnRlZ2VyIG5ld0Vhcm5lZFZhbHVlTWV0aG9kKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRWFybmVkVmFsdWVNZXRob2QgPSBlYXJuZWRWYWx1ZU1ldGhvZDsKLQkJZWFybmVkVmFsdWVNZXRob2QgPSBuZXdFYXJuZWRWYWx1ZU1ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FQVJORURfVkFMVUVfTUVUSE9ELCBvbGRFYXJuZWRWYWx1ZU1ldGhvZCwgZWFybmVkVmFsdWVNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpIHsKLQkJcmV0dXJuIGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoYm9vbGVhbiBuZXdJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkpIHsKLQkJYm9vbGVhbiBvbGRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPSBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk7Ci0JCWluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSA9IG5ld0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeTsKLQkJYm9vbGVhbiBvbGRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnlFU2V0ID0gaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldDsKLQkJaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSU5TRVJURURfUFJPSkVDVFNfTElLRV9TVU1NQVJZLCBvbGRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnksIGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSwgIW9sZEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpIHsKLQkJYm9vbGVhbiBvbGRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPSBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk7Ci0JCWJvb2xlYW4gb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCA9IGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQ7Ci0JCWluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSA9IElOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWV9FREVGQVVMVDsKLQkJaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSU5TRVJURURfUFJPSkVDVFNfTElLRV9TVU1NQVJZLCBvbGRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnksIElOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWV9FREVGQVVMVCwgb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkgewotCQlyZXR1cm4gaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpcGxlQ3JpdGljYWxQYXRocygpIHsKLQkJcmV0dXJuIG11bHRpcGxlQ3JpdGljYWxQYXRoczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoYm9vbGVhbiBuZXdNdWx0aXBsZUNyaXRpY2FsUGF0aHMpIHsKLQkJYm9vbGVhbiBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHMgPSBtdWx0aXBsZUNyaXRpY2FsUGF0aHM7Ci0JCW11bHRpcGxlQ3JpdGljYWxQYXRocyA9IG5ld011bHRpcGxlQ3JpdGljYWxQYXRoczsKLQkJYm9vbGVhbiBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHNFU2V0ID0gbXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldDsKLQkJbXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTVVMVElQTEVfQ1JJVElDQUxfUEFUSFMsIG9sZE11bHRpcGxlQ3JpdGljYWxQYXRocywgbXVsdGlwbGVDcml0aWNhbFBhdGhzLCAhb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkgewotCQlib29sZWFuIG9sZE11bHRpcGxlQ3JpdGljYWxQYXRocyA9IG11bHRpcGxlQ3JpdGljYWxQYXRoczsKLQkJYm9vbGVhbiBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHNFU2V0ID0gbXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldDsKLQkJbXVsdGlwbGVDcml0aWNhbFBhdGhzID0gTVVMVElQTEVfQ1JJVElDQUxfUEFUSFNfRURFRkFVTFQ7Ci0JCW11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTLCBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHMsIE1VTFRJUExFX0NSSVRJQ0FMX1BBVEhTX0VERUZBVUxULCBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKSB7Ci0JCXJldHVybiBtdWx0aXBsZUNyaXRpY2FsUGF0aHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmV3VGFza3NFZmZvcnREcml2ZW4oKSB7Ci0JCXJldHVybiBuZXdUYXNrc0VmZm9ydERyaXZlbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXdUYXNrc0VmZm9ydERyaXZlbihib29sZWFuIG5ld05ld1Rhc2tzRWZmb3J0RHJpdmVuKSB7Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFZmZvcnREcml2ZW4gPSBuZXdUYXNrc0VmZm9ydERyaXZlbjsKLQkJbmV3VGFza3NFZmZvcnREcml2ZW4gPSBuZXdOZXdUYXNrc0VmZm9ydERyaXZlbjsKLQkJYm9vbGVhbiBvbGROZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQgPSBuZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQ7Ci0JCW5ld1Rhc2tzRWZmb3J0RHJpdmVuRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VGRk9SVF9EUklWRU4sIG9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuLCBuZXdUYXNrc0VmZm9ydERyaXZlbiwgIW9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKSB7Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFZmZvcnREcml2ZW4gPSBuZXdUYXNrc0VmZm9ydERyaXZlbjsKLQkJYm9vbGVhbiBvbGROZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQgPSBuZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQ7Ci0JCW5ld1Rhc2tzRWZmb3J0RHJpdmVuID0gTkVXX1RBU0tTX0VGRk9SVF9EUklWRU5fRURFRkFVTFQ7Ci0JCW5ld1Rhc2tzRWZmb3J0RHJpdmVuRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VGRk9SVF9EUklWRU4sIG9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuLCBORVdfVEFTS1NfRUZGT1JUX0RSSVZFTl9FREVGQVVMVCwgb2xkTmV3VGFza3NFZmZvcnREcml2ZW5FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpIHsKLQkJcmV0dXJuIG5ld1Rhc2tzRWZmb3J0RHJpdmVuRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ld1Rhc2tzRXN0aW1hdGVkKCkgewotCQlyZXR1cm4gbmV3VGFza3NFc3RpbWF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmV3VGFza3NFc3RpbWF0ZWQoYm9vbGVhbiBuZXdOZXdUYXNrc0VzdGltYXRlZCkgewotCQlib29sZWFuIG9sZE5ld1Rhc2tzRXN0aW1hdGVkID0gbmV3VGFza3NFc3RpbWF0ZWQ7Ci0JCW5ld1Rhc2tzRXN0aW1hdGVkID0gbmV3TmV3VGFza3NFc3RpbWF0ZWQ7Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFc3RpbWF0ZWRFU2V0ID0gbmV3VGFza3NFc3RpbWF0ZWRFU2V0OwotCQluZXdUYXNrc0VzdGltYXRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FU1RJTUFURUQsIG9sZE5ld1Rhc2tzRXN0aW1hdGVkLCBuZXdUYXNrc0VzdGltYXRlZCwgIW9sZE5ld1Rhc2tzRXN0aW1hdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TmV3VGFza3NFc3RpbWF0ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFc3RpbWF0ZWQgPSBuZXdUYXNrc0VzdGltYXRlZDsKLQkJYm9vbGVhbiBvbGROZXdUYXNrc0VzdGltYXRlZEVTZXQgPSBuZXdUYXNrc0VzdGltYXRlZEVTZXQ7Ci0JCW5ld1Rhc2tzRXN0aW1hdGVkID0gTkVXX1RBU0tTX0VTVElNQVRFRF9FREVGQVVMVDsKLQkJbmV3VGFza3NFc3RpbWF0ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRVNUSU1BVEVELCBvbGROZXdUYXNrc0VzdGltYXRlZCwgTkVXX1RBU0tTX0VTVElNQVRFRF9FREVGQVVMVCwgb2xkTmV3VGFza3NFc3RpbWF0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXROZXdUYXNrc0VzdGltYXRlZCgpIHsKLQkJcmV0dXJuIG5ld1Rhc2tzRXN0aW1hdGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpIHsKLQkJcmV0dXJuIHNwbGl0c0luUHJvZ3Jlc3NUYXNrczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoYm9vbGVhbiBuZXdTcGxpdHNJblByb2dyZXNzVGFza3MpIHsKLQkJYm9vbGVhbiBvbGRTcGxpdHNJblByb2dyZXNzVGFza3MgPSBzcGxpdHNJblByb2dyZXNzVGFza3M7Ci0JCXNwbGl0c0luUHJvZ3Jlc3NUYXNrcyA9IG5ld1NwbGl0c0luUHJvZ3Jlc3NUYXNrczsKLQkJYm9vbGVhbiBvbGRTcGxpdHNJblByb2dyZXNzVGFza3NFU2V0ID0gc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldDsKLQkJc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BMSVRTX0lOX1BST0dSRVNTX1RBU0tTLCBvbGRTcGxpdHNJblByb2dyZXNzVGFza3MsIHNwbGl0c0luUHJvZ3Jlc3NUYXNrcywgIW9sZFNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpIHsKLQkJYm9vbGVhbiBvbGRTcGxpdHNJblByb2dyZXNzVGFza3MgPSBzcGxpdHNJblByb2dyZXNzVGFza3M7Ci0JCWJvb2xlYW4gb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCA9IHNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQ7Ci0JCXNwbGl0c0luUHJvZ3Jlc3NUYXNrcyA9IFNQTElUU19JTl9QUk9HUkVTU19UQVNLU19FREVGQVVMVDsKLQkJc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BMSVRTX0lOX1BST0dSRVNTX1RBU0tTLCBvbGRTcGxpdHNJblByb2dyZXNzVGFza3MsIFNQTElUU19JTl9QUk9HUkVTU19UQVNLU19FREVGQVVMVCwgb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkgewotCQlyZXR1cm4gc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NwcmVhZEFjdHVhbENvc3QoKSB7Ci0JCXJldHVybiBzcHJlYWRBY3R1YWxDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwcmVhZEFjdHVhbENvc3QoYm9vbGVhbiBuZXdTcHJlYWRBY3R1YWxDb3N0KSB7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkQWN0dWFsQ29zdCA9IHNwcmVhZEFjdHVhbENvc3Q7Ci0JCXNwcmVhZEFjdHVhbENvc3QgPSBuZXdTcHJlYWRBY3R1YWxDb3N0OwotCQlib29sZWFuIG9sZFNwcmVhZEFjdHVhbENvc3RFU2V0ID0gc3ByZWFkQWN0dWFsQ29zdEVTZXQ7Ci0JCXNwcmVhZEFjdHVhbENvc3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfQUNUVUFMX0NPU1QsIG9sZFNwcmVhZEFjdHVhbENvc3QsIHNwcmVhZEFjdHVhbENvc3QsICFvbGRTcHJlYWRBY3R1YWxDb3N0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U3ByZWFkQWN0dWFsQ29zdCgpIHsKLQkJYm9vbGVhbiBvbGRTcHJlYWRBY3R1YWxDb3N0ID0gc3ByZWFkQWN0dWFsQ29zdDsKLQkJYm9vbGVhbiBvbGRTcHJlYWRBY3R1YWxDb3N0RVNldCA9IHNwcmVhZEFjdHVhbENvc3RFU2V0OwotCQlzcHJlYWRBY3R1YWxDb3N0ID0gU1BSRUFEX0FDVFVBTF9DT1NUX0VERUZBVUxUOwotCQlzcHJlYWRBY3R1YWxDb3N0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NULCBvbGRTcHJlYWRBY3R1YWxDb3N0LCBTUFJFQURfQUNUVUFMX0NPU1RfRURFRkFVTFQsIG9sZFNwcmVhZEFjdHVhbENvc3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTcHJlYWRBY3R1YWxDb3N0KCkgewotCQlyZXR1cm4gc3ByZWFkQWN0dWFsQ29zdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKSB7Ci0JCXJldHVybiBzcHJlYWRQZXJjZW50Q29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKGJvb2xlYW4gbmV3U3ByZWFkUGVyY2VudENvbXBsZXRlKSB7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlID0gc3ByZWFkUGVyY2VudENvbXBsZXRlOwotCQlzcHJlYWRQZXJjZW50Q29tcGxldGUgPSBuZXdTcHJlYWRQZXJjZW50Q29tcGxldGU7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlRVNldCA9IHNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQ7Ci0JCXNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9QRVJDRU5UX0NPTVBMRVRFLCBvbGRTcHJlYWRQZXJjZW50Q29tcGxldGUsIHNwcmVhZFBlcmNlbnRDb21wbGV0ZSwgIW9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpIHsKLQkJYm9vbGVhbiBvbGRTcHJlYWRQZXJjZW50Q29tcGxldGUgPSBzcHJlYWRQZXJjZW50Q29tcGxldGU7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlRVNldCA9IHNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQ7Ci0JCXNwcmVhZFBlcmNlbnRDb21wbGV0ZSA9IFNQUkVBRF9QRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUOwotCQlzcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURSwgb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlLCBTUFJFQURfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCwgb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCkgewotCQlyZXR1cm4gc3ByZWFkUGVyY2VudENvbXBsZXRlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Rhc2tVcGRhdGVzUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0YXNrVXBkYXRlc1Jlc291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhc2tVcGRhdGVzUmVzb3VyY2UoYm9vbGVhbiBuZXdUYXNrVXBkYXRlc1Jlc291cmNlKSB7Ci0JCWJvb2xlYW4gb2xkVGFza1VwZGF0ZXNSZXNvdXJjZSA9IHRhc2tVcGRhdGVzUmVzb3VyY2U7Ci0JCXRhc2tVcGRhdGVzUmVzb3VyY2UgPSBuZXdUYXNrVXBkYXRlc1Jlc291cmNlOwotCQlib29sZWFuIG9sZFRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0ID0gdGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQ7Ci0JCXRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0UsIG9sZFRhc2tVcGRhdGVzUmVzb3VyY2UsIHRhc2tVcGRhdGVzUmVzb3VyY2UsICFvbGRUYXNrVXBkYXRlc1Jlc291cmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpIHsKLQkJYm9vbGVhbiBvbGRUYXNrVXBkYXRlc1Jlc291cmNlID0gdGFza1VwZGF0ZXNSZXNvdXJjZTsKLQkJYm9vbGVhbiBvbGRUYXNrVXBkYXRlc1Jlc291cmNlRVNldCA9IHRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0OwotCQl0YXNrVXBkYXRlc1Jlc291cmNlID0gVEFTS19VUERBVEVTX1JFU09VUkNFX0VERUZBVUxUOwotCQl0YXNrVXBkYXRlc1Jlc291cmNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS19VUERBVEVTX1JFU09VUkNFLCBvbGRUYXNrVXBkYXRlc1Jlc291cmNlLCBUQVNLX1VQREFURVNfUkVTT1VSQ0VfRURFRkFVTFQsIG9sZFRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRUYXNrVXBkYXRlc1Jlc291cmNlKCkgewotCQlyZXR1cm4gdGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaXNjYWxZZWFyU3RhcnQoKSB7Ci0JCXJldHVybiBmaXNjYWxZZWFyU3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlzY2FsWWVhclN0YXJ0KGJvb2xlYW4gbmV3RmlzY2FsWWVhclN0YXJ0KSB7Ci0JCWJvb2xlYW4gb2xkRmlzY2FsWWVhclN0YXJ0ID0gZmlzY2FsWWVhclN0YXJ0OwotCQlmaXNjYWxZZWFyU3RhcnQgPSBuZXdGaXNjYWxZZWFyU3RhcnQ7Ci0JCWJvb2xlYW4gb2xkRmlzY2FsWWVhclN0YXJ0RVNldCA9IGZpc2NhbFllYXJTdGFydEVTZXQ7Ci0JCWZpc2NhbFllYXJTdGFydEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZJU0NBTF9ZRUFSX1NUQVJULCBvbGRGaXNjYWxZZWFyU3RhcnQsIGZpc2NhbFllYXJTdGFydCwgIW9sZEZpc2NhbFllYXJTdGFydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEZpc2NhbFllYXJTdGFydCgpIHsKLQkJYm9vbGVhbiBvbGRGaXNjYWxZZWFyU3RhcnQgPSBmaXNjYWxZZWFyU3RhcnQ7Ci0JCWJvb2xlYW4gb2xkRmlzY2FsWWVhclN0YXJ0RVNldCA9IGZpc2NhbFllYXJTdGFydEVTZXQ7Ci0JCWZpc2NhbFllYXJTdGFydCA9IEZJU0NBTF9ZRUFSX1NUQVJUX0VERUZBVUxUOwotCQlmaXNjYWxZZWFyU3RhcnRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSVNDQUxfWUVBUl9TVEFSVCwgb2xkRmlzY2FsWWVhclN0YXJ0LCBGSVNDQUxfWUVBUl9TVEFSVF9FREVGQVVMVCwgb2xkRmlzY2FsWWVhclN0YXJ0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RmlzY2FsWWVhclN0YXJ0KCkgewotCQlyZXR1cm4gZmlzY2FsWWVhclN0YXJ0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRXZWVrU3RhcnREYXkoKSB7Ci0JCXJldHVybiB3ZWVrU3RhcnREYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2Vla1N0YXJ0RGF5KEJpZ0ludGVnZXIgbmV3V2Vla1N0YXJ0RGF5KSB7Ci0JCUJpZ0ludGVnZXIgb2xkV2Vla1N0YXJ0RGF5ID0gd2Vla1N0YXJ0RGF5OwotCQl3ZWVrU3RhcnREYXkgPSBuZXdXZWVrU3RhcnREYXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0VFS19TVEFSVF9EQVksIG9sZFdlZWtTdGFydERheSwgd2Vla1N0YXJ0RGF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKSB7Ci0JCXJldHVybiBtb3ZlQ29tcGxldGVkRW5kc0JhY2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKGJvb2xlYW4gbmV3TW92ZUNvbXBsZXRlZEVuZHNCYWNrKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNCYWNrID0gbW92ZUNvbXBsZXRlZEVuZHNCYWNrOwotCQltb3ZlQ29tcGxldGVkRW5kc0JhY2sgPSBuZXdNb3ZlQ29tcGxldGVkRW5kc0JhY2s7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNCYWNrRVNldCA9IG1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQ7Ci0JCW1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfQkFDSywgb2xkTW92ZUNvbXBsZXRlZEVuZHNCYWNrLCBtb3ZlQ29tcGxldGVkRW5kc0JhY2ssICFvbGRNb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNCYWNrID0gbW92ZUNvbXBsZXRlZEVuZHNCYWNrOwotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQgPSBtb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0OwotCQltb3ZlQ29tcGxldGVkRW5kc0JhY2sgPSBNT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0tfRURFRkFVTFQ7Ci0JCW1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfQkFDSywgb2xkTW92ZUNvbXBsZXRlZEVuZHNCYWNrLCBNT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0tfRURFRkFVTFQsIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpIHsKLQkJcmV0dXJuIG1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpIHsKLQkJcmV0dXJuIG1vdmVSZW1haW5pbmdTdGFydHNCYWNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKGJvb2xlYW4gbmV3TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2spIHsKLQkJYm9vbGVhbiBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA9IG1vdmVSZW1haW5pbmdTdGFydHNCYWNrOwotCQltb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA9IG5ld01vdmVSZW1haW5pbmdTdGFydHNCYWNrOwotCQlib29sZWFuIG9sZE1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldCA9IG1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldDsKLQkJbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSywgb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2ssIG1vdmVSZW1haW5pbmdTdGFydHNCYWNrLCAhb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpIHsKLQkJYm9vbGVhbiBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA9IG1vdmVSZW1haW5pbmdTdGFydHNCYWNrOwotCQlib29sZWFuIG9sZE1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldCA9IG1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldDsKLQkJbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPSBNT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDS19FREVGQVVMVDsKLQkJbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSywgb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2ssIE1PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLX0VERUZBVUxULCBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkgewotCQlyZXR1cm4gbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKSB7Ci0JCXJldHVybiBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZChib29sZWFuIG5ld01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPSBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZDsKLQkJbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPSBuZXdNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZDsKLQkJYm9vbGVhbiBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQgPSBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQsIG9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkLCBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCwgIW9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPSBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZDsKLQkJYm9vbGVhbiBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQgPSBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkID0gTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkRfRURFRkFVTFQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQsIG9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkLCBNT1ZFX1JFTUFJTklOR19TVEFSVFNfRk9SV0FSRF9FREVGQVVMVCwgb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpIHsKLQkJcmV0dXJuIG1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpIHsKLQkJcmV0dXJuIG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoYm9vbGVhbiBuZXdNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQpIHsKLQkJYm9vbGVhbiBvbGRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPSBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ7Ci0JCW1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCA9IG5ld01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZDsKLQkJYm9vbGVhbiBvbGRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmRFU2V0ID0gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldDsKLQkJbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJELCBvbGRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQsIG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCwgIW9sZE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpIHsKLQkJYm9vbGVhbiBvbGRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPSBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldCA9IG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQ7Ci0JCW1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCA9IE1PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRF9FREVGQVVMVDsKLQkJbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJELCBvbGRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQsIE1PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRF9FREVGQVVMVCwgb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkgewotCQlyZXR1cm4gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKCkgewotCQlyZXR1cm4gYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKEJpZ0ludGVnZXIgbmV3QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSkgewotCQlCaWdJbnRlZ2VyIG9sZEJhc2VsaW5lRm9yRWFybmVkVmFsdWUgPSBiYXNlbGluZUZvckVhcm5lZFZhbHVlOwotCQliYXNlbGluZUZvckVhcm5lZFZhbHVlID0gbmV3QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19CQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFLCBvbGRCYXNlbGluZUZvckVhcm5lZFZhbHVlLCBiYXNlbGluZUZvckVhcm5lZFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKSB7Ci0JCXJldHVybiBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKGJvb2xlYW4gbmV3QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKSB7Ci0JCWJvb2xlYW4gb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzID0gYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOwotCQlhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPSBuZXdBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3M7Ci0JCWJvb2xlYW4gb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzRVNldCA9IGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQ7Ci0JCWF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9fQUREX05FV19SRVNPVVJDRVNfQU5EX1RBU0tTLCBvbGRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MsIGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcywgIW9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpIHsKLQkJYm9vbGVhbiBvbGRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPSBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3M7Ci0JCWJvb2xlYW4gb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzRVNldCA9IGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQ7Ci0JCWF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA9IEFVVE9fQUREX05FV19SRVNPVVJDRVNfQU5EX1RBU0tTX0VERUZBVUxUOwotCQlhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLUywgb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzLCBBVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLU19FREVGQVVMVCwgb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkgewotCQlyZXR1cm4gYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0YXR1c0RhdGUoKSB7Ci0JCXJldHVybiBzdGF0dXNEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXR1c0RhdGUoT2JqZWN0IG5ld1N0YXR1c0RhdGUpIHsKLQkJT2JqZWN0IG9sZFN0YXR1c0RhdGUgPSBzdGF0dXNEYXRlOwotCQlzdGF0dXNEYXRlID0gbmV3U3RhdHVzRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVEFUVVNfREFURSwgb2xkU3RhdHVzRGF0ZSwgc3RhdHVzRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3VycmVudERhdGUoKSB7Ci0JCXJldHVybiBjdXJyZW50RGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50RGF0ZShPYmplY3QgbmV3Q3VycmVudERhdGUpIHsKLQkJT2JqZWN0IG9sZEN1cnJlbnREYXRlID0gY3VycmVudERhdGU7Ci0JCWN1cnJlbnREYXRlID0gbmV3Q3VycmVudERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOVF9EQVRFLCBvbGRDdXJyZW50RGF0ZSwgY3VycmVudERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSB7Ci0JCXJldHVybiBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoYm9vbGVhbiBuZXdNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKSB7Ci0JCWJvb2xlYW4gb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCA9IG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkw7Ci0JCW1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPSBuZXdNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMOwotCQlib29sZWFuIG9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0ID0gbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQ7Ci0JCW1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMLCBvbGRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMLCBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMLCAhb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSB7Ci0JCWJvb2xlYW4gb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCA9IG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkw7Ci0JCWJvb2xlYW4gb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQgPSBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldDsKLQkJbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCA9IE1JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkxfRURFRkFVTFQ7Ci0JCW1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMLCBvbGRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMLCBNSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMX0VERUZBVUxULCBvbGRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpIHsKLQkJcmV0dXJuIG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b2xpbmsoKSB7Ci0JCXJldHVybiBhdXRvbGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRvbGluayhib29sZWFuIG5ld0F1dG9saW5rKSB7Ci0JCWJvb2xlYW4gb2xkQXV0b2xpbmsgPSBhdXRvbGluazsKLQkJYXV0b2xpbmsgPSBuZXdBdXRvbGluazsKLQkJYm9vbGVhbiBvbGRBdXRvbGlua0VTZXQgPSBhdXRvbGlua0VTZXQ7Ci0JCWF1dG9saW5rRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT0xJTkssIG9sZEF1dG9saW5rLCBhdXRvbGluaywgIW9sZEF1dG9saW5rRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QXV0b2xpbmsoKSB7Ci0JCWJvb2xlYW4gb2xkQXV0b2xpbmsgPSBhdXRvbGluazsKLQkJYm9vbGVhbiBvbGRBdXRvbGlua0VTZXQgPSBhdXRvbGlua0VTZXQ7Ci0JCWF1dG9saW5rID0gQVVUT0xJTktfRURFRkFVTFQ7Ci0JCWF1dG9saW5rRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT0xJTkssIG9sZEF1dG9saW5rLCBBVVRPTElOS19FREVGQVVMVCwgb2xkQXV0b2xpbmtFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBdXRvbGluaygpIHsKLQkJcmV0dXJuIGF1dG9saW5rRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXROZXdUYXNrU3RhcnREYXRlKCkgewotCQlyZXR1cm4gbmV3VGFza1N0YXJ0RGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXdUYXNrU3RhcnREYXRlKEJpZ0ludGVnZXIgbmV3TmV3VGFza1N0YXJ0RGF0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZE5ld1Rhc2tTdGFydERhdGUgPSBuZXdUYXNrU3RhcnREYXRlOwotCQluZXdUYXNrU3RhcnREYXRlID0gbmV3TmV3VGFza1N0YXJ0RGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS19TVEFSVF9EQVRFLCBvbGROZXdUYXNrU3RhcnREYXRlLCBuZXdUYXNrU3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRUYXNrRVZNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFRhc2tFVk1ldGhvZChCaWdJbnRlZ2VyIG5ld0RlZmF1bHRUYXNrRVZNZXRob2QpIHsKLQkJQmlnSW50ZWdlciBvbGREZWZhdWx0VGFza0VWTWV0aG9kID0gZGVmYXVsdFRhc2tFVk1ldGhvZDsKLQkJZGVmYXVsdFRhc2tFVk1ldGhvZCA9IG5ld0RlZmF1bHRUYXNrRVZNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX0VWX01FVEhPRCwgb2xkRGVmYXVsdFRhc2tFVk1ldGhvZCwgZGVmYXVsdFRhc2tFVk1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSB7Ci0JCXJldHVybiBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZChib29sZWFuIG5ld1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKSB7Ci0JCWJvb2xlYW4gb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPSBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZDsKLQkJcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPSBuZXdQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZDsKLQkJYm9vbGVhbiBvbGRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQgPSBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQ7Ci0JCXByb2plY3RFeHRlcm5hbGx5RWRpdGVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRCwgb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQsIHByb2plY3RFeHRlcm5hbGx5RWRpdGVkLCAhb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpIHsKLQkJYm9vbGVhbiBvbGRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA9IHByb2plY3RFeHRlcm5hbGx5RWRpdGVkOwotCQlib29sZWFuIG9sZFByb2plY3RFeHRlcm5hbGx5RWRpdGVkRVNldCA9IHByb2plY3RFeHRlcm5hbGx5RWRpdGVkRVNldDsKLQkJcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPSBQUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEX0VERUZBVUxUOwotCQlwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1BST0pFQ1RfRVhURVJOQUxMWV9FRElURUQsIG9sZFByb2plY3RFeHRlcm5hbGx5RWRpdGVkLCBQUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEX0VERUZBVUxULCBvbGRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkgewotCQlyZXR1cm4gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKSB7Ci0JCXJldHVybiBleHRlbmRlZENyZWF0aW9uRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlbmRlZENyZWF0aW9uRGF0ZShPYmplY3QgbmV3RXh0ZW5kZWRDcmVhdGlvbkRhdGUpIHsKLQkJT2JqZWN0IG9sZEV4dGVuZGVkQ3JlYXRpb25EYXRlID0gZXh0ZW5kZWRDcmVhdGlvbkRhdGU7Ci0JCWV4dGVuZGVkQ3JlYXRpb25EYXRlID0gbmV3RXh0ZW5kZWRDcmVhdGlvbkRhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQ1JFQVRJT05fREFURSwgb2xkRXh0ZW5kZWRDcmVhdGlvbkRhdGUsIGV4dGVuZGVkQ3JlYXRpb25EYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBY3R1YWxzSW5TeW5jKCkgewotCQlyZXR1cm4gYWN0dWFsc0luU3luYzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxzSW5TeW5jKGJvb2xlYW4gbmV3QWN0dWFsc0luU3luYykgewotCQlib29sZWFuIG9sZEFjdHVhbHNJblN5bmMgPSBhY3R1YWxzSW5TeW5jOwotCQlhY3R1YWxzSW5TeW5jID0gbmV3QWN0dWFsc0luU3luYzsKLQkJYm9vbGVhbiBvbGRBY3R1YWxzSW5TeW5jRVNldCA9IGFjdHVhbHNJblN5bmNFU2V0OwotCQlhY3R1YWxzSW5TeW5jRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQUNUVUFMU19JTl9TWU5DLCBvbGRBY3R1YWxzSW5TeW5jLCBhY3R1YWxzSW5TeW5jLCAhb2xkQWN0dWFsc0luU3luY0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEFjdHVhbHNJblN5bmMoKSB7Ci0JCWJvb2xlYW4gb2xkQWN0dWFsc0luU3luYyA9IGFjdHVhbHNJblN5bmM7Ci0JCWJvb2xlYW4gb2xkQWN0dWFsc0luU3luY0VTZXQgPSBhY3R1YWxzSW5TeW5jRVNldDsKLQkJYWN0dWFsc0luU3luYyA9IEFDVFVBTFNfSU5fU1lOQ19FREVGQVVMVDsKLQkJYWN0dWFsc0luU3luY0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FDVFVBTFNfSU5fU1lOQywgb2xkQWN0dWFsc0luU3luYywgQUNUVUFMU19JTl9TWU5DX0VERUZBVUxULCBvbGRBY3R1YWxzSW5TeW5jRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QWN0dWFsc0luU3luYygpIHsKLQkJcmV0dXJuIGFjdHVhbHNJblN5bmNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVtb3ZlRmlsZVByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiByZW1vdmVGaWxlUHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1vdmVGaWxlUHJvcGVydGllcyhib29sZWFuIG5ld1JlbW92ZUZpbGVQcm9wZXJ0aWVzKSB7Ci0JCWJvb2xlYW4gb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXMgPSByZW1vdmVGaWxlUHJvcGVydGllczsKLQkJcmVtb3ZlRmlsZVByb3BlcnRpZXMgPSBuZXdSZW1vdmVGaWxlUHJvcGVydGllczsKLQkJYm9vbGVhbiBvbGRSZW1vdmVGaWxlUHJvcGVydGllc0VTZXQgPSByZW1vdmVGaWxlUHJvcGVydGllc0VTZXQ7Ci0JCXJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVNT1ZFX0ZJTEVfUFJPUEVSVElFUywgb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXMsIHJlbW92ZUZpbGVQcm9wZXJ0aWVzLCAhb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZW1vdmVGaWxlUHJvcGVydGllcygpIHsKLQkJYm9vbGVhbiBvbGRSZW1vdmVGaWxlUHJvcGVydGllcyA9IHJlbW92ZUZpbGVQcm9wZXJ0aWVzOwotCQlib29sZWFuIG9sZFJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldCA9IHJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldDsKLQkJcmVtb3ZlRmlsZVByb3BlcnRpZXMgPSBSRU1PVkVfRklMRV9QUk9QRVJUSUVTX0VERUZBVUxUOwotCQlyZW1vdmVGaWxlUHJvcGVydGllc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFTU9WRV9GSUxFX1BST1BFUlRJRVMsIG9sZFJlbW92ZUZpbGVQcm9wZXJ0aWVzLCBSRU1PVkVfRklMRV9QUk9QRVJUSUVTX0VERUZBVUxULCBvbGRSZW1vdmVGaWxlUHJvcGVydGllc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gcmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRtaW5Qcm9qZWN0KCkgewotCQlyZXR1cm4gYWRtaW5Qcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkbWluUHJvamVjdChib29sZWFuIG5ld0FkbWluUHJvamVjdCkgewotCQlib29sZWFuIG9sZEFkbWluUHJvamVjdCA9IGFkbWluUHJvamVjdDsKLQkJYWRtaW5Qcm9qZWN0ID0gbmV3QWRtaW5Qcm9qZWN0OwotCQlib29sZWFuIG9sZEFkbWluUHJvamVjdEVTZXQgPSBhZG1pblByb2plY3RFU2V0OwotCQlhZG1pblByb2plY3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BRE1JTl9QUk9KRUNULCBvbGRBZG1pblByb2plY3QsIGFkbWluUHJvamVjdCwgIW9sZEFkbWluUHJvamVjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEFkbWluUHJvamVjdCgpIHsKLQkJYm9vbGVhbiBvbGRBZG1pblByb2plY3QgPSBhZG1pblByb2plY3Q7Ci0JCWJvb2xlYW4gb2xkQWRtaW5Qcm9qZWN0RVNldCA9IGFkbWluUHJvamVjdEVTZXQ7Ci0JCWFkbWluUHJvamVjdCA9IEFETUlOX1BST0pFQ1RfRURFRkFVTFQ7Ci0JCWFkbWluUHJvamVjdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FETUlOX1BST0pFQ1QsIG9sZEFkbWluUHJvamVjdCwgQURNSU5fUFJPSkVDVF9FREVGQVVMVCwgb2xkQWRtaW5Qcm9qZWN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QWRtaW5Qcm9qZWN0KCkgewotCQlyZXR1cm4gYWRtaW5Qcm9qZWN0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0bGluZUNvZGVzIGdldE91dGxpbmVDb2RlcygpIHsKLQkJcmV0dXJuIG91dGxpbmVDb2RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPdXRsaW5lQ29kZXMoT3V0bGluZUNvZGVzIG5ld091dGxpbmVDb2RlcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlPdXRsaW5lQ29kZXMgb2xkT3V0bGluZUNvZGVzID0gb3V0bGluZUNvZGVzOwotCQlvdXRsaW5lQ29kZXMgPSBuZXdPdXRsaW5lQ29kZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUywgb2xkT3V0bGluZUNvZGVzLCBuZXdPdXRsaW5lQ29kZXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGxpbmVDb2RlcyhPdXRsaW5lQ29kZXMgbmV3T3V0bGluZUNvZGVzKSB7Ci0JCWlmIChuZXdPdXRsaW5lQ29kZXMgIT0gb3V0bGluZUNvZGVzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChvdXRsaW5lQ29kZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpb3V0bGluZUNvZGVzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19PVVRMSU5FX0NPREVTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdPdXRsaW5lQ29kZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T3V0bGluZUNvZGVzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19PVVRMSU5FX0NPREVTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE91dGxpbmVDb2RlcyhuZXdPdXRsaW5lQ29kZXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19PVVRMSU5FX0NPREVTLCBuZXdPdXRsaW5lQ29kZXMsIG5ld091dGxpbmVDb2RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXQlNNYXNrcyBnZXRXQlNNYXNrcygpIHsKLQkJcmV0dXJuIHdCU01hc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdCU01hc2tzKFdCU01hc2tzIG5ld1dCU01hc2tzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdCU01hc2tzIG9sZFdCU01hc2tzID0gd0JTTWFza3M7Ci0JCXdCU01hc2tzID0gbmV3V0JTTWFza3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0JTX01BU0tTLCBvbGRXQlNNYXNrcywgbmV3V0JTTWFza3MpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdCU01hc2tzKFdCU01hc2tzIG5ld1dCU01hc2tzKSB7Ci0JCWlmIChuZXdXQlNNYXNrcyAhPSB3QlNNYXNrcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod0JTTWFza3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpd0JTTWFza3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3V0JTTWFza3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V0JTTWFza3MpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXQlNNYXNrcyhuZXdXQlNNYXNrcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUywgbmV3V0JTTWFza3MsIG5ld1dCU01hc2tzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4dGVuZGVkQXR0cmlidXRlcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcyBuZXdFeHRlbmRlZEF0dHJpYnV0ZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRXh0ZW5kZWRBdHRyaWJ1dGVzIG9sZEV4dGVuZGVkQXR0cmlidXRlcyA9IGV4dGVuZGVkQXR0cmlidXRlczsKLQkJZXh0ZW5kZWRBdHRyaWJ1dGVzID0gbmV3RXh0ZW5kZWRBdHRyaWJ1dGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVMsIG9sZEV4dGVuZGVkQXR0cmlidXRlcywgbmV3RXh0ZW5kZWRBdHRyaWJ1dGVzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlbmRlZEF0dHJpYnV0ZXMoRXh0ZW5kZWRBdHRyaWJ1dGVzIG5ld0V4dGVuZGVkQXR0cmlidXRlcykgewotCQlpZiAobmV3RXh0ZW5kZWRBdHRyaWJ1dGVzICE9IGV4dGVuZGVkQXR0cmlidXRlcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWV4dGVuZGVkQXR0cmlidXRlcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RXh0ZW5kZWRBdHRyaWJ1dGVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0V4dGVuZGVkQXR0cmlidXRlcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFeHRlbmRlZEF0dHJpYnV0ZXMobmV3RXh0ZW5kZWRBdHRyaWJ1dGVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUywgbmV3RXh0ZW5kZWRBdHRyaWJ1dGVzLCBuZXdFeHRlbmRlZEF0dHJpYnV0ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FsZW5kYXJzIGdldENhbGVuZGFycygpIHsKLQkJcmV0dXJuIGNhbGVuZGFyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDYWxlbmRhcnMoQ2FsZW5kYXJzIG5ld0NhbGVuZGFycywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDYWxlbmRhcnMgb2xkQ2FsZW5kYXJzID0gY2FsZW5kYXJzOwotCQljYWxlbmRhcnMgPSBuZXdDYWxlbmRhcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJTLCBvbGRDYWxlbmRhcnMsIG5ld0NhbGVuZGFycyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FsZW5kYXJzKENhbGVuZGFycyBuZXdDYWxlbmRhcnMpIHsKLQkJaWYgKG5ld0NhbGVuZGFycyAhPSBjYWxlbmRhcnMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNhbGVuZGFycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljYWxlbmRhcnMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q2FsZW5kYXJzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NhbGVuZGFycykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENhbGVuZGFycyhuZXdDYWxlbmRhcnMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUlMsIG5ld0NhbGVuZGFycywgbmV3Q2FsZW5kYXJzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tzIGdldFRhc2tzKCkgewotCQlyZXR1cm4gdGFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VGFza3MoVGFza3MgbmV3VGFza3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJVGFza3Mgb2xkVGFza3MgPSB0YXNrczsKLQkJdGFza3MgPSBuZXdUYXNrczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLUywgb2xkVGFza3MsIG5ld1Rhc2tzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrcyhUYXNrcyBuZXdUYXNrcykgewotCQlpZiAobmV3VGFza3MgIT0gdGFza3MpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHRhc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXRhc2tzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VGFza3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VGFza3MpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFRhc2tzKG5ld1Rhc2tzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1MsIG5ld1Rhc2tzLCBuZXdUYXNrcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCkgewotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlc291cmNlcyhSZXNvdXJjZXMgbmV3UmVzb3VyY2VzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVJlc291cmNlcyBvbGRSZXNvdXJjZXMgPSByZXNvdXJjZXM7Ci0JCXJlc291cmNlcyA9IG5ld1Jlc291cmNlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVNPVVJDRVMsIG9sZFJlc291cmNlcywgbmV3UmVzb3VyY2VzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXMoUmVzb3VyY2VzIG5ld1Jlc291cmNlcykgewotCQlpZiAobmV3UmVzb3VyY2VzICE9IHJlc291cmNlcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmVzb3VyY2VzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlc291cmNlcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSZXNvdXJjZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVzb3VyY2VzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVNPVVJDRVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVzb3VyY2VzKG5ld1Jlc291cmNlcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFU09VUkNFUywgbmV3UmVzb3VyY2VzLCBuZXdSZXNvdXJjZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXNzaWdubWVudHMgZ2V0QXNzaWdubWVudHMoKSB7Ci0JCXJldHVybiBhc3NpZ25tZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBc3NpZ25tZW50cyhBc3NpZ25tZW50cyBuZXdBc3NpZ25tZW50cywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlBc3NpZ25tZW50cyBvbGRBc3NpZ25tZW50cyA9IGFzc2lnbm1lbnRzOwotCQlhc3NpZ25tZW50cyA9IG5ld0Fzc2lnbm1lbnRzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTLCBvbGRBc3NpZ25tZW50cywgbmV3QXNzaWdubWVudHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFzc2lnbm1lbnRzKEFzc2lnbm1lbnRzIG5ld0Fzc2lnbm1lbnRzKSB7Ci0JCWlmIChuZXdBc3NpZ25tZW50cyAhPSBhc3NpZ25tZW50cykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYXNzaWdubWVudHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYXNzaWdubWVudHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBc3NpZ25tZW50cyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBc3NpZ25tZW50cykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVNTSUdOTUVOVFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QXNzaWdubWVudHMobmV3QXNzaWdubWVudHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUywgbmV3QXNzaWdubWVudHMsIG5ld0Fzc2lnbm1lbnRzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX09VVExJTkVfQ09ERVM6Ci0JCQkJCXJldHVybiBiYXNpY1NldE91dGxpbmVDb2RlcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0JTX01BU0tTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRXQlNNYXNrcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUlM6Ci0JCQkJCXJldHVybiBiYXNpY1NldENhbGVuZGFycyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1M6Ci0JCQkJCXJldHVybiBiYXNpY1NldFRhc2tzKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVNPVVJDRVM6Ci0JCQkJCXJldHVybiBiYXNpY1NldFJlc291cmNlcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVNTSUdOTUVOVFM6Ci0JCQkJCXJldHVybiBiYXNpY1NldEFzc2lnbm1lbnRzKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RJVExFOgotCQkJCXJldHVybiBnZXRUaXRsZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NVQkpFQ1Q6Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0Q2F0ZWdvcnkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DT01QQU5ZOgotCQkJCXJldHVybiBnZXRDb21wYW55KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUFOQUdFUjoKLQkJCQlyZXR1cm4gZ2V0TWFuYWdlcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVEhPUjoKLQkJCQlyZXR1cm4gZ2V0QXV0aG9yKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JFQVRJT05fREFURToKLQkJCQlyZXR1cm4gZ2V0Q3JlYXRpb25EYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVWSVNJT046Ci0JCQkJcmV0dXJuIGdldFJldmlzaW9uKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTEFTVF9TQVZFRDoKLQkJCQlyZXR1cm4gZ2V0TGFzdFNhdmVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVDoKLQkJCQlyZXR1cm4gaXNTY2hlZHVsZUZyb21TdGFydCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVEFSVF9EQVRFOgotCQkJCXJldHVybiBnZXRTdGFydERhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSU5JU0hfREFURToKLQkJCQlyZXR1cm4gZ2V0RmluaXNoRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURToKLQkJCQlyZXR1cm4gZ2V0RllTdGFydERhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DUklUSUNBTF9TTEFDS19MSU1JVDoKLQkJCQlyZXR1cm4gZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfRElHSVRTOgotCQkJCXJldHVybiBnZXRDdXJyZW5jeURpZ2l0cygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX1NZTUJPTDoKLQkJCQlyZXR1cm4gZ2V0Q3VycmVuY3lTeW1ib2woKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9TWU1CT0xfUE9TSVRJT046Ci0JCQkJcmV0dXJuIGdldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUl9VSUQ6Ci0JCQkJcmV0dXJuIGdldENhbGVuZGFyVUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9TVEFSVF9USU1FOgotCQkJCXJldHVybiBnZXREZWZhdWx0U3RhcnRUaW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9GSU5JU0hfVElNRToKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9EQVk6Ci0JCQkJcmV0dXJuIGdldE1pbnV0ZXNQZXJEYXkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLOgotCQkJCXJldHVybiBnZXRNaW51dGVzUGVyV2VlaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RBWVNfUEVSX01PTlRIOgotCQkJCXJldHVybiBnZXREYXlzUGVyTW9udGgoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFRhc2tUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUw6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9TVEFOREFSRF9SQVRFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX09WRVJUSU1FX1JBVEU6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XT1JLX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0V29ya0Zvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VESVRBQkxFX0FDVFVBTF9DT1NUUzoKLQkJCQlyZXR1cm4gaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0hPTk9SX0NPTlNUUkFJTlRTOgotCQkJCXJldHVybiBpc0hvbm9yQ29uc3RyYWludHMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRUFSTkVEX1ZBTFVFX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0RWFybmVkVmFsdWVNZXRob2QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19JTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUlk6Ci0JCQkJcmV0dXJuIGlzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTOgotCQkJCXJldHVybiBpc011bHRpcGxlQ3JpdGljYWxQYXRocygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRUZGT1JUX0RSSVZFTjoKLQkJCQlyZXR1cm4gaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRVNUSU1BVEVEOgotCQkJCXJldHVybiBpc05ld1Rhc2tzRXN0aW1hdGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUzoKLQkJCQlyZXR1cm4gaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBpc1NwcmVhZEFjdHVhbENvc3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGlzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tfVVBEQVRFU19SRVNPVVJDRToKLQkJCQlyZXR1cm4gaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZJU0NBTF9ZRUFSX1NUQVJUOgotCQkJCXJldHVybiBpc0Zpc2NhbFllYXJTdGFydCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XRUVLX1NUQVJUX0RBWToKLQkJCQlyZXR1cm4gZ2V0V2Vla1N0YXJ0RGF5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19CQUNLOgotCQkJCXJldHVybiBpc01vdmVDb21wbGV0ZWRFbmRzQmFjaygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSzoKLQkJCQlyZXR1cm4gaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfRk9SV0FSRDoKLQkJCQlyZXR1cm4gaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkQ6Ci0JCQkJcmV0dXJuIGlzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0JBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUU6Ci0JCQkJcmV0dXJuIGdldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLUzoKLQkJCQlyZXR1cm4gaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBVFVTX0RBVEU6Ci0JCQkJcmV0dXJuIGdldFN0YXR1c0RhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5UX0RBVEU6Ci0JCQkJcmV0dXJuIGdldEN1cnJlbnREYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTDoKLQkJCQlyZXR1cm4gaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LOgotCQkJCXJldHVybiBpc0F1dG9saW5rKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLX1NUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIGdldE5ld1Rhc2tTdGFydERhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfRVZfTUVUSE9EOgotCQkJCXJldHVybiBnZXREZWZhdWx0VGFza0VWTWV0aG9kKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRDoKLQkJCQlyZXR1cm4gaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9DUkVBVElPTl9EQVRFOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FDVFVBTFNfSU5fU1lOQzoKLQkJCQlyZXR1cm4gaXNBY3R1YWxzSW5TeW5jKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFTU9WRV9GSUxFX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGlzUmVtb3ZlRmlsZVByb3BlcnRpZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQURNSU5fUFJPSkVDVDoKLQkJCQlyZXR1cm4gaXNBZG1pblByb2plY3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUzoKLQkJCQlyZXR1cm4gZ2V0T3V0bGluZUNvZGVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0JTX01BU0tTOgotCQkJCXJldHVybiBnZXRXQlNNYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEV4dGVuZGVkQXR0cmlidXRlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUzoKLQkJCQlyZXR1cm4gZ2V0Q2FsZW5kYXJzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1M6Ci0JCQkJcmV0dXJuIGdldFRhc2tzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gZ2V0QXNzaWdubWVudHMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVUlEOgotCQkJCXNldFVJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19USVRMRToKLQkJCQlzZXRUaXRsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1VCSkVDVDoKLQkJCQlzZXRTdWJqZWN0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ09NUEFOWToKLQkJCQlzZXRDb21wYW55KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NQU5BR0VSOgotCQkJCXNldE1hbmFnZXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVEhPUjoKLQkJCQlzZXRBdXRob3IoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVZJU0lPTjoKLQkJCQlzZXRSZXZpc2lvbigoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0xBU1RfU0FWRUQ6Ci0JCQkJc2V0TGFzdFNhdmVkKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TQ0hFRFVMRV9GUk9NX1NUQVJUOgotCQkJCXNldFNjaGVkdWxlRnJvbVN0YXJ0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVEFSVF9EQVRFOgotCQkJCXNldFN0YXJ0RGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEU6Ci0JCQkJc2V0RmluaXNoRGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRllTVEFSVF9EQVRFOgotCQkJCXNldEZZU3RhcnREYXRlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JJVElDQUxfU0xBQ0tfTElNSVQ6Ci0JCQkJc2V0Q3JpdGljYWxTbGFja0xpbWl0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfRElHSVRTOgotCQkJCXNldEN1cnJlbmN5RGlnaXRzKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MOgotCQkJCXNldEN1cnJlbmN5U3ltYm9sKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9TWU1CT0xfUE9TSVRJT046Ci0JCQkJc2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRDYWxlbmRhclVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRToKLQkJCQlzZXREZWZhdWx0U3RhcnRUaW1lKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJTklTSF9USU1FOgotCQkJCXNldERlZmF1bHRGaW5pc2hUaW1lKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9EQVk6Ci0JCQkJc2V0TWludXRlc1BlckRheSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JTlVURVNfUEVSX1dFRUs6Ci0JCQkJc2V0TWludXRlc1BlcldlZWsoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EQVlTX1BFUl9NT05USDoKLQkJCQlzZXREYXlzUGVyTW9udGgoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRToKLQkJCQlzZXREZWZhdWx0VGFza1R5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURToKLQkJCQlzZXREZWZhdWx0U3RhbmRhcmRSYXRlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfT1ZFUlRJTUVfUkFURToKLQkJCQlzZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dPUktfRk9STUFUOgotCQkJCXNldFdvcmtGb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FRElUQUJMRV9BQ1RVQUxfQ09TVFM6Ci0JCQkJc2V0RWRpdGFibGVBY3R1YWxDb3N0cygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFM6Ci0JCQkJc2V0SG9ub3JDb25zdHJhaW50cygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRUFSTkVEX1ZBTFVFX01FVEhPRDoKLQkJCQlzZXRFYXJuZWRWYWx1ZU1ldGhvZCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWToKLQkJCQlzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTOgotCQkJCXNldE11bHRpcGxlQ3JpdGljYWxQYXRocygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VGRk9SVF9EUklWRU46Ci0JCQkJc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FU1RJTUFURUQ6Ci0JCQkJc2V0TmV3VGFza3NFc3RpbWF0ZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUzoKLQkJCQlzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9BQ1RVQUxfQ09TVDoKLQkJCQlzZXRTcHJlYWRBY3R1YWxDb3N0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURToKLQkJCQlzZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tfVVBEQVRFU19SRVNPVVJDRToKLQkJCQlzZXRUYXNrVXBkYXRlc1Jlc291cmNlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSVNDQUxfWUVBUl9TVEFSVDoKLQkJCQlzZXRGaXNjYWxZZWFyU3RhcnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dFRUtfU1RBUlRfREFZOgotCQkJCXNldFdlZWtTdGFydERheSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfQkFDSzoKLQkJCQlzZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLOgotCQkJCXNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfRk9SV0FSRDoKLQkJCQlzZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEOgotCQkJCXNldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRToKLQkJCQlzZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1M6Ci0JCQkJc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVEFUVVNfREFURToKLQkJCQlzZXRTdGF0dXNEYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5UX0RBVEU6Ci0JCQkJc2V0Q3VycmVudERhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkw6Ci0JCQkJc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT0xJTks6Ci0JCQkJc2V0QXV0b2xpbmsoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLX1NUQVJUX0RBVEU6Ci0JCQkJc2V0TmV3VGFza1N0YXJ0RGF0ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfVEFTS19FVl9NRVRIT0Q6Ci0JCQkJc2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1BST0pFQ1RfRVhURVJOQUxMWV9FRElURUQ6Ci0JCQkJc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FDVFVBTFNfSU5fU1lOQzoKLQkJCQlzZXRBY3R1YWxzSW5TeW5jKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTOgotCQkJCXNldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BRE1JTl9QUk9KRUNUOgotCQkJCXNldEFkbWluUHJvamVjdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUzoKLQkJCQlzZXRPdXRsaW5lQ29kZXMoKE91dGxpbmVDb2RlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUzoKLQkJCQlzZXRXQlNNYXNrcygoV0JTTWFza3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9BVFRSSUJVVEVTOgotCQkJCXNldEV4dGVuZGVkQXR0cmlidXRlcygoRXh0ZW5kZWRBdHRyaWJ1dGVzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJTOgotCQkJCXNldENhbGVuZGFycygoQ2FsZW5kYXJzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1M6Ci0JCQkJc2V0VGFza3MoKFRhc2tzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTOgotCQkJCXNldFJlc291cmNlcygoUmVzb3VyY2VzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVNTSUdOTUVOVFM6Ci0JCQkJc2V0QXNzaWdubWVudHMoKEFzc2lnbm1lbnRzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19USVRMRToKLQkJCQlzZXRUaXRsZShUSVRMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NVQkpFQ1Q6Ci0JCQkJc2V0U3ViamVjdChTVUJKRUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoQ0FURUdPUllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DT01QQU5ZOgotCQkJCXNldENvbXBhbnkoQ09NUEFOWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01BTkFHRVI6Ci0JCQkJc2V0TWFuYWdlcihNQU5BR0VSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUSE9SOgotCQkJCXNldEF1dGhvcihBVVRIT1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DUkVBVElPTl9EQVRFOgotCQkJCXNldENyZWF0aW9uRGF0ZShDUkVBVElPTl9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVWSVNJT046Ci0JCQkJc2V0UmV2aXNpb24oUkVWSVNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19MQVNUX1NBVkVEOgotCQkJCXNldExhc3RTYXZlZChMQVNUX1NBVkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVDoKLQkJCQl1bnNldFNjaGVkdWxlRnJvbVN0YXJ0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVJUX0RBVEU6Ci0JCQkJc2V0U3RhcnREYXRlKFNUQVJUX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSU5JU0hfREFURToKLQkJCQlzZXRGaW5pc2hEYXRlKEZJTklTSF9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRllTVEFSVF9EQVRFOgotCQkJCXNldEZZU3RhcnREYXRlKEZZU1RBUlRfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlUOgotCQkJCXNldENyaXRpY2FsU2xhY2tMaW1pdChDUklUSUNBTF9TTEFDS19MSU1JVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX0RJR0lUUzoKLQkJCQlzZXRDdXJyZW5jeURpZ2l0cyhDVVJSRU5DWV9ESUdJVFNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9TWU1CT0w6Ci0JCQkJc2V0Q3VycmVuY3lTeW1ib2woQ1VSUkVOQ1lfU1lNQk9MX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OOgotCQkJCXNldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJfVUlEOgotCQkJCXNldENhbGVuZGFyVUlEKENBTEVOREFSX1VJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRToKLQkJCQlzZXREZWZhdWx0U3RhcnRUaW1lKERFRkFVTFRfU1RBUlRfVElNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklOSVNIX1RJTUU6Ci0JCQkJc2V0RGVmYXVsdEZpbmlzaFRpbWUoREVGQVVMVF9GSU5JU0hfVElNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JTlVURVNfUEVSX0RBWToKLQkJCQlzZXRNaW51dGVzUGVyRGF5KE1JTlVURVNfUEVSX0RBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JTlVURVNfUEVSX1dFRUs6Ci0JCQkJc2V0TWludXRlc1BlcldlZWsoTUlOVVRFU19QRVJfV0VFS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RBWVNfUEVSX01PTlRIOgotCQkJCXNldERheXNQZXJNb250aChEQVlTX1BFUl9NT05USF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfVEFTS19UWVBFOgotCQkJCXVuc2V0RGVmYXVsdFRhc2tUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMOgotCQkJCXNldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKERFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9TVEFOREFSRF9SQVRFOgotCQkJCXVuc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX09WRVJUSU1FX1JBVEU6Ci0JCQkJdW5zZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdChEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XT1JLX0ZPUk1BVDoKLQkJCQlzZXRXb3JrRm9ybWF0KFdPUktfRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRURJVEFCTEVfQUNUVUFMX0NPU1RTOgotCQkJCXVuc2V0RWRpdGFibGVBY3R1YWxDb3N0cygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19IT05PUl9DT05TVFJBSU5UUzoKLQkJCQl1bnNldEhvbm9yQ29uc3RyYWludHMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRUFSTkVEX1ZBTFVFX01FVEhPRDoKLQkJCQlzZXRFYXJuZWRWYWx1ZU1ldGhvZChFQVJORURfVkFMVUVfTUVUSE9EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSU5TRVJURURfUFJPSkVDVFNfTElLRV9TVU1NQVJZOgotCQkJCXVuc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTOgotCQkJCXVuc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOOgotCQkJCXVuc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VTVElNQVRFRDoKLQkJCQl1bnNldE5ld1Rhc2tzRXN0aW1hdGVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUzoKLQkJCQl1bnNldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfQUNUVUFMX0NPU1Q6Ci0JCQkJdW5zZXRTcHJlYWRBY3R1YWxDb3N0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXVuc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tfVVBEQVRFU19SRVNPVVJDRToKLQkJCQl1bnNldFRhc2tVcGRhdGVzUmVzb3VyY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklTQ0FMX1lFQVJfU1RBUlQ6Ci0JCQkJdW5zZXRGaXNjYWxZZWFyU3RhcnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0VFS19TVEFSVF9EQVk6Ci0JCQkJc2V0V2Vla1N0YXJ0RGF5KFdFRUtfU1RBUlRfREFZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19CQUNLOgotCQkJCXVuc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLOgotCQkJCXVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQ6Ci0JCQkJdW5zZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkQ6Ci0JCQkJdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRToKLQkJCQlzZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLUzoKLQkJCQl1bnNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVEFUVVNfREFURToKLQkJCQlzZXRTdGF0dXNEYXRlKFNUQVRVU19EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOVF9EQVRFOgotCQkJCXNldEN1cnJlbnREYXRlKENVUlJFTlRfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkw6Ci0JCQkJdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LOgotCQkJCXVuc2V0QXV0b2xpbmsoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tfU1RBUlRfREFURToKLQkJCQlzZXROZXdUYXNrU3RhcnREYXRlKE5FV19UQVNLX1NUQVJUX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfRVZfTUVUSE9EOgotCQkJCXNldERlZmF1bHRUYXNrRVZNZXRob2QoREVGQVVMVF9UQVNLX0VWX01FVEhPRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1BST0pFQ1RfRVhURVJOQUxMWV9FRElURUQ6Ci0JCQkJdW5zZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9DUkVBVElPTl9EQVRFOgotCQkJCXNldEV4dGVuZGVkQ3JlYXRpb25EYXRlKEVYVEVOREVEX0NSRUFUSU9OX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkM6Ci0JCQkJdW5zZXRBY3R1YWxzSW5TeW5jKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFTU9WRV9GSUxFX1BST1BFUlRJRVM6Ci0JCQkJdW5zZXRSZW1vdmVGaWxlUHJvcGVydGllcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BRE1JTl9QUk9KRUNUOgotCQkJCXVuc2V0QWRtaW5Qcm9qZWN0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX09VVExJTkVfQ09ERVM6Ci0JCQkJc2V0T3V0bGluZUNvZGVzKChPdXRsaW5lQ29kZXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUzoKLQkJCQlzZXRXQlNNYXNrcygoV0JTTWFza3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVM6Ci0JCQkJc2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKChFeHRlbmRlZEF0dHJpYnV0ZXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUzoKLQkJCQlzZXRDYWxlbmRhcnMoKENhbGVuZGFycyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1M6Ci0JCQkJc2V0VGFza3MoKFRhc2tzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVNPVVJDRVM6Ci0JCQkJc2V0UmVzb3VyY2VzKChSZXNvdXJjZXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTOgotCQkJCXNldEFzc2lnbm1lbnRzKChBc3NpZ25tZW50cyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19USVRMRToKLQkJCQlyZXR1cm4gVElUTEVfRURFRkFVTFQgPT0gbnVsbCA/IHRpdGxlICE9IG51bGwgOiAhVElUTEVfRURFRkFVTFQuZXF1YWxzKHRpdGxlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVUJKRUNUOgotCQkJCXJldHVybiBTVUJKRUNUX0VERUZBVUxUID09IG51bGwgPyBzdWJqZWN0ICE9IG51bGwgOiAhU1VCSkVDVF9FREVGQVVMVC5lcXVhbHMoc3ViamVjdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIENBVEVHT1JZX0VERUZBVUxUID09IG51bGwgPyBjYXRlZ29yeSAhPSBudWxsIDogIUNBVEVHT1JZX0VERUZBVUxULmVxdWFscyhjYXRlZ29yeSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ09NUEFOWToKLQkJCQlyZXR1cm4gQ09NUEFOWV9FREVGQVVMVCA9PSBudWxsID8gY29tcGFueSAhPSBudWxsIDogIUNPTVBBTllfRURFRkFVTFQuZXF1YWxzKGNvbXBhbnkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01BTkFHRVI6Ci0JCQkJcmV0dXJuIE1BTkFHRVJfRURFRkFVTFQgPT0gbnVsbCA/IG1hbmFnZXIgIT0gbnVsbCA6ICFNQU5BR0VSX0VERUZBVUxULmVxdWFscyhtYW5hZ2VyKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRIT1I6Ci0JCQkJcmV0dXJuIEFVVEhPUl9FREVGQVVMVCA9PSBudWxsID8gYXV0aG9yICE9IG51bGwgOiAhQVVUSE9SX0VERUZBVUxULmVxdWFscyhhdXRob3IpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIENSRUFUSU9OX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNyZWF0aW9uRGF0ZSAhPSBudWxsIDogIUNSRUFUSU9OX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNyZWF0aW9uRGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVWSVNJT046Ci0JCQkJcmV0dXJuIFJFVklTSU9OX0VERUZBVUxUID09IG51bGwgPyByZXZpc2lvbiAhPSBudWxsIDogIVJFVklTSU9OX0VERUZBVUxULmVxdWFscyhyZXZpc2lvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTEFTVF9TQVZFRDoKLQkJCQlyZXR1cm4gTEFTVF9TQVZFRF9FREVGQVVMVCA9PSBudWxsID8gbGFzdFNhdmVkICE9IG51bGwgOiAhTEFTVF9TQVZFRF9FREVGQVVMVC5lcXVhbHMobGFzdFNhdmVkKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TQ0hFRFVMRV9GUk9NX1NUQVJUOgotCQkJCXJldHVybiBpc1NldFNjaGVkdWxlRnJvbVN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBUlRfREFURToKLQkJCQlyZXR1cm4gU1RBUlRfREFURV9FREVGQVVMVCA9PSBudWxsID8gc3RhcnREYXRlICE9IG51bGwgOiAhU1RBUlRfREFURV9FREVGQVVMVC5lcXVhbHMoc3RhcnREYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSU5JU0hfREFURToKLQkJCQlyZXR1cm4gRklOSVNIX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaERhdGUgIT0gbnVsbCA6ICFGSU5JU0hfREFURV9FREVGQVVMVC5lcXVhbHMoZmluaXNoRGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRllTVEFSVF9EQVRFOgotCQkJCXJldHVybiBGWVNUQVJUX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGZZU3RhcnREYXRlICE9IG51bGwgOiAhRllTVEFSVF9EQVRFX0VERUZBVUxULmVxdWFscyhmWVN0YXJ0RGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JJVElDQUxfU0xBQ0tfTElNSVQ6Ci0JCQkJcmV0dXJuIENSSVRJQ0FMX1NMQUNLX0xJTUlUX0VERUZBVUxUID09IG51bGwgPyBjcml0aWNhbFNsYWNrTGltaXQgIT0gbnVsbCA6ICFDUklUSUNBTF9TTEFDS19MSU1JVF9FREVGQVVMVC5lcXVhbHMoY3JpdGljYWxTbGFja0xpbWl0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9ESUdJVFM6Ci0JCQkJcmV0dXJuIENVUlJFTkNZX0RJR0lUU19FREVGQVVMVCA9PSBudWxsID8gY3VycmVuY3lEaWdpdHMgIT0gbnVsbCA6ICFDVVJSRU5DWV9ESUdJVFNfRURFRkFVTFQuZXF1YWxzKGN1cnJlbmN5RGlnaXRzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9TWU1CT0w6Ci0JCQkJcmV0dXJuIENVUlJFTkNZX1NZTUJPTF9FREVGQVVMVCA9PSBudWxsID8gY3VycmVuY3lTeW1ib2wgIT0gbnVsbCA6ICFDVVJSRU5DWV9TWU1CT0xfRURFRkFVTFQuZXF1YWxzKGN1cnJlbmN5U3ltYm9sKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9TWU1CT0xfUE9TSVRJT046Ci0JCQkJcmV0dXJuIENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9FREVGQVVMVCA9PSBudWxsID8gY3VycmVuY3lTeW1ib2xQb3NpdGlvbiAhPSBudWxsIDogIUNVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9FREVGQVVMVC5lcXVhbHMoY3VycmVuY3lTeW1ib2xQb3NpdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBDQUxFTkRBUl9VSURfRURFRkFVTFQgPT0gbnVsbCA/IGNhbGVuZGFyVUlEICE9IG51bGwgOiAhQ0FMRU5EQVJfVUlEX0VERUZBVUxULmVxdWFscyhjYWxlbmRhclVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9TVEFSVF9USU1FOgotCQkJCXJldHVybiBERUZBVUxUX1NUQVJUX1RJTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRTdGFydFRpbWUgIT0gbnVsbCA6ICFERUZBVUxUX1NUQVJUX1RJTUVfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRTdGFydFRpbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklOSVNIX1RJTUU6Ci0JCQkJcmV0dXJuIERFRkFVTFRfRklOSVNIX1RJTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRGaW5pc2hUaW1lICE9IG51bGwgOiAhREVGQVVMVF9GSU5JU0hfVElNRV9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdEZpbmlzaFRpbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JTlVURVNfUEVSX0RBWToKLQkJCQlyZXR1cm4gTUlOVVRFU19QRVJfREFZX0VERUZBVUxUID09IG51bGwgPyBtaW51dGVzUGVyRGF5ICE9IG51bGwgOiAhTUlOVVRFU19QRVJfREFZX0VERUZBVUxULmVxdWFscyhtaW51dGVzUGVyRGF5KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLOgotCQkJCXJldHVybiBNSU5VVEVTX1BFUl9XRUVLX0VERUZBVUxUID09IG51bGwgPyBtaW51dGVzUGVyV2VlayAhPSBudWxsIDogIU1JTlVURVNfUEVSX1dFRUtfRURFRkFVTFQuZXF1YWxzKG1pbnV0ZXNQZXJXZWVrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EQVlTX1BFUl9NT05USDoKLQkJCQlyZXR1cm4gREFZU19QRVJfTU9OVEhfRURFRkFVTFQgPT0gbnVsbCA/IGRheXNQZXJNb250aCAhPSBudWxsIDogIURBWVNfUEVSX01PTlRIX0VERUZBVUxULmVxdWFscyhkYXlzUGVyTW9udGgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfVEFTS19UWVBFOgotCQkJCXJldHVybiBpc1NldERlZmF1bHRUYXNrVHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMOgotCQkJCXJldHVybiBERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVCA9PSBudWxsID8gZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgIT0gbnVsbCA6ICFERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gaXNTZXREZWZhdWx0U3RhbmRhcmRSYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBpc1NldERlZmF1bHRPdmVydGltZVJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gZHVyYXRpb25Gb3JtYXQgIT0gbnVsbCA6ICFEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKGR1cmF0aW9uRm9ybWF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XT1JLX0ZPUk1BVDoKLQkJCQlyZXR1cm4gV09SS19GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmtGb3JtYXQgIT0gbnVsbCA6ICFXT1JLX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMod29ya0Zvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRURJVEFCTEVfQUNUVUFMX0NPU1RTOgotCQkJCXJldHVybiBpc1NldEVkaXRhYmxlQWN0dWFsQ29zdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19IT05PUl9DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gaXNTZXRIb25vckNvbnN0cmFpbnRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRUFSTkVEX1ZBTFVFX01FVEhPRDoKLQkJCQlyZXR1cm4gRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVCA9PSBudWxsID8gZWFybmVkVmFsdWVNZXRob2QgIT0gbnVsbCA6ICFFQVJORURfVkFMVUVfTUVUSE9EX0VERUZBVUxULmVxdWFscyhlYXJuZWRWYWx1ZU1ldGhvZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSU5TRVJURURfUFJPSkVDVFNfTElLRV9TVU1NQVJZOgotCQkJCXJldHVybiBpc1NldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTOgotCQkJCXJldHVybiBpc1NldE11bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOOgotCQkJCXJldHVybiBpc1NldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VTVElNQVRFRDoKLQkJCQlyZXR1cm4gaXNTZXROZXdUYXNrc0VzdGltYXRlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUzoKLQkJCQlyZXR1cm4gaXNTZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfQUNUVUFMX0NPU1Q6Ci0JCQkJcmV0dXJuIGlzU2V0U3ByZWFkQWN0dWFsQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXJldHVybiBpc1NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tfVVBEQVRFU19SRVNPVVJDRToKLQkJCQlyZXR1cm4gaXNTZXRUYXNrVXBkYXRlc1Jlc291cmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklTQ0FMX1lFQVJfU1RBUlQ6Ci0JCQkJcmV0dXJuIGlzU2V0RmlzY2FsWWVhclN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0VFS19TVEFSVF9EQVk6Ci0JCQkJcmV0dXJuIFdFRUtfU1RBUlRfREFZX0VERUZBVUxUID09IG51bGwgPyB3ZWVrU3RhcnREYXkgIT0gbnVsbCA6ICFXRUVLX1NUQVJUX0RBWV9FREVGQVVMVC5lcXVhbHMod2Vla1N0YXJ0RGF5KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0s6Ci0JCQkJcmV0dXJuIGlzU2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0s6Ci0JCQkJcmV0dXJuIGlzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfRk9SV0FSRDoKLQkJCQlyZXR1cm4gaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRDoKLQkJCQlyZXR1cm4gaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19CQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFOgotCQkJCXJldHVybiBCQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBiYXNlbGluZUZvckVhcm5lZFZhbHVlICE9IG51bGwgOiAhQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9FREVGQVVMVC5lcXVhbHMoYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1M6Ci0JCQkJcmV0dXJuIGlzU2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBVFVTX0RBVEU6Ci0JCQkJcmV0dXJuIFNUQVRVU19EQVRFX0VERUZBVUxUID09IG51bGwgPyBzdGF0dXNEYXRlICE9IG51bGwgOiAhU1RBVFVTX0RBVEVfRURFRkFVTFQuZXF1YWxzKHN0YXR1c0RhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTlRfREFURToKLQkJCQlyZXR1cm4gQ1VSUkVOVF9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjdXJyZW50RGF0ZSAhPSBudWxsIDogIUNVUlJFTlRfREFURV9FREVGQVVMVC5lcXVhbHMoY3VycmVudERhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkw6Ci0JCQkJcmV0dXJuIGlzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LOgotCQkJCXJldHVybiBpc1NldEF1dG9saW5rKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tfU1RBUlRfREFURToKLQkJCQlyZXR1cm4gTkVXX1RBU0tfU1RBUlRfREFURV9FREVGQVVMVCA9PSBudWxsID8gbmV3VGFza1N0YXJ0RGF0ZSAhPSBudWxsIDogIU5FV19UQVNLX1NUQVJUX0RBVEVfRURFRkFVTFQuZXF1YWxzKG5ld1Rhc2tTdGFydERhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfVEFTS19FVl9NRVRIT0Q6Ci0JCQkJcmV0dXJuIERFRkFVTFRfVEFTS19FVl9NRVRIT0RfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRUYXNrRVZNZXRob2QgIT0gbnVsbCA6ICFERUZBVUxUX1RBU0tfRVZfTUVUSE9EX0VERUZBVUxULmVxdWFscyhkZWZhdWx0VGFza0VWTWV0aG9kKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEOgotCQkJCXJldHVybiBpc1NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQ1JFQVRJT05fREFURToKLQkJCQlyZXR1cm4gRVhURU5ERURfQ1JFQVRJT05fREFURV9FREVGQVVMVCA9PSBudWxsID8gZXh0ZW5kZWRDcmVhdGlvbkRhdGUgIT0gbnVsbCA6ICFFWFRFTkRFRF9DUkVBVElPTl9EQVRFX0VERUZBVUxULmVxdWFscyhleHRlbmRlZENyZWF0aW9uRGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQUNUVUFMU19JTl9TWU5DOgotCQkJCXJldHVybiBpc1NldEFjdHVhbHNJblN5bmMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTOgotCQkJCXJldHVybiBpc1NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQURNSU5fUFJPSkVDVDoKLQkJCQlyZXR1cm4gaXNTZXRBZG1pblByb2plY3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19PVVRMSU5FX0NPREVTOgotCQkJCXJldHVybiBvdXRsaW5lQ29kZXMgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1M6Ci0JCQkJcmV0dXJuIHdCU01hc2tzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGVzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJTOgotCQkJCXJldHVybiBjYWxlbmRhcnMgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLUzoKLQkJCQlyZXR1cm4gdGFza3MgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVNPVVJDRVM6Ci0JCQkJcmV0dXJuIHJlc291cmNlcyAhPSBudWxsOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTOgotCQkJCXJldHVybiBhc3NpZ25tZW50cyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRpdGxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0aXRsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3ViamVjdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3ViamVjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2F0ZWdvcnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhdGVnb3J5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb21wYW55OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb21wYW55KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYW5hZ2VyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYW5hZ2VyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdXRob3I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF1dGhvcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3JlYXRpb25EYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVhdGlvbkRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJldmlzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXZpc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFzdFNhdmVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYXN0U2F2ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNjaGVkdWxlRnJvbVN0YXJ0OiAiKTsKLQkJaWYgKHNjaGVkdWxlRnJvbVN0YXJ0RVNldCkgcmVzdWx0LmFwcGVuZChzY2hlZHVsZUZyb21TdGFydCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0RGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2hEYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2hEYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmWVN0YXJ0RGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZllTdGFydERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNyaXRpY2FsU2xhY2tMaW1pdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3JpdGljYWxTbGFja0xpbWl0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjdXJyZW5jeURpZ2l0czogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3VycmVuY3lEaWdpdHMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGN1cnJlbmN5U3ltYm9sOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjdXJyZW5jeVN5bWJvbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3VycmVuY3lTeW1ib2xQb3NpdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3VycmVuY3lTeW1ib2xQb3NpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FsZW5kYXJVSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhbGVuZGFyVUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0U3RhcnRUaW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0U3RhcnRUaW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0RmluaXNoVGltZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdEZpbmlzaFRpbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1pbnV0ZXNQZXJEYXk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1pbnV0ZXNQZXJEYXkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1pbnV0ZXNQZXJXZWVrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtaW51dGVzUGVyV2Vlayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGF5c1Blck1vbnRoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkYXlzUGVyTW9udGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRUYXNrVHlwZTogIik7Ci0JCWlmIChkZWZhdWx0VGFza1R5cGVFU2V0KSByZXN1bHQuYXBwZW5kKGRlZmF1bHRUYXNrVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRGaXhlZENvc3RBY2NydWFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdFN0YW5kYXJkUmF0ZTogIik7Ci0JCWlmIChkZWZhdWx0U3RhbmRhcmRSYXRlRVNldCkgcmVzdWx0LmFwcGVuZChkZWZhdWx0U3RhbmRhcmRSYXRlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdE92ZXJ0aW1lUmF0ZTogIik7Ci0JCWlmIChkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCkgcmVzdWx0LmFwcGVuZChkZWZhdWx0T3ZlcnRpbWVSYXRlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZHVyYXRpb25Gb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGR1cmF0aW9uRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlZGl0YWJsZUFjdHVhbENvc3RzOiAiKTsKLQkJaWYgKGVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0KSByZXN1bHQuYXBwZW5kKGVkaXRhYmxlQWN0dWFsQ29zdHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBob25vckNvbnN0cmFpbnRzOiAiKTsKLQkJaWYgKGhvbm9yQ29uc3RyYWludHNFU2V0KSByZXN1bHQuYXBwZW5kKGhvbm9yQ29uc3RyYWludHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlYXJuZWRWYWx1ZU1ldGhvZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWFybmVkVmFsdWVNZXRob2QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeTogIik7Ci0JCWlmIChpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnlFU2V0KSByZXN1bHQuYXBwZW5kKGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG11bHRpcGxlQ3JpdGljYWxQYXRoczogIik7Ci0JCWlmIChtdWx0aXBsZUNyaXRpY2FsUGF0aHNFU2V0KSByZXN1bHQuYXBwZW5kKG11bHRpcGxlQ3JpdGljYWxQYXRocyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5ld1Rhc2tzRWZmb3J0RHJpdmVuOiAiKTsKLQkJaWYgKG5ld1Rhc2tzRWZmb3J0RHJpdmVuRVNldCkgcmVzdWx0LmFwcGVuZChuZXdUYXNrc0VmZm9ydERyaXZlbik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5ld1Rhc2tzRXN0aW1hdGVkOiAiKTsKLQkJaWYgKG5ld1Rhc2tzRXN0aW1hdGVkRVNldCkgcmVzdWx0LmFwcGVuZChuZXdUYXNrc0VzdGltYXRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNwbGl0c0luUHJvZ3Jlc3NUYXNrczogIik7Ci0JCWlmIChzcGxpdHNJblByb2dyZXNzVGFza3NFU2V0KSByZXN1bHQuYXBwZW5kKHNwbGl0c0luUHJvZ3Jlc3NUYXNrcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNwcmVhZEFjdHVhbENvc3Q6ICIpOwotCQlpZiAoc3ByZWFkQWN0dWFsQ29zdEVTZXQpIHJlc3VsdC5hcHBlbmQoc3ByZWFkQWN0dWFsQ29zdCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNwcmVhZFBlcmNlbnRDb21wbGV0ZTogIik7Ci0JCWlmIChzcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0KSByZXN1bHQuYXBwZW5kKHNwcmVhZFBlcmNlbnRDb21wbGV0ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhc2tVcGRhdGVzUmVzb3VyY2U6ICIpOwotCQlpZiAodGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQpIHJlc3VsdC5hcHBlbmQodGFza1VwZGF0ZXNSZXNvdXJjZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpc2NhbFllYXJTdGFydDogIik7Ci0JCWlmIChmaXNjYWxZZWFyU3RhcnRFU2V0KSByZXN1bHQuYXBwZW5kKGZpc2NhbFllYXJTdGFydCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdlZWtTdGFydERheTogIik7Ci0JCXJlc3VsdC5hcHBlbmQod2Vla1N0YXJ0RGF5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtb3ZlQ29tcGxldGVkRW5kc0JhY2s6ICIpOwotCQlpZiAobW92ZUNvbXBsZXRlZEVuZHNCYWNrRVNldCkgcmVzdWx0LmFwcGVuZChtb3ZlQ29tcGxldGVkRW5kc0JhY2spOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjazogIik7Ci0JCWlmIChtb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQpIHJlc3VsdC5hcHBlbmQobW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2spOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZDogIik7Ci0JCWlmIChtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQpIHJlc3VsdC5hcHBlbmQobW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ6ICIpOwotCQlpZiAobW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldCkgcmVzdWx0LmFwcGVuZChtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiYXNlbGluZUZvckVhcm5lZFZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChiYXNlbGluZUZvckVhcm5lZFZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3M6ICIpOwotCQlpZiAoYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzRVNldCkgcmVzdWx0LmFwcGVuZChhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGF0dXNEYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGF0dXNEYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjdXJyZW50RGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3VycmVudERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkw6ICIpOwotCQlpZiAobWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQpIHJlc3VsdC5hcHBlbmQobWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF1dG9saW5rOiAiKTsKLQkJaWYgKGF1dG9saW5rRVNldCkgcmVzdWx0LmFwcGVuZChhdXRvbGluayk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5ld1Rhc2tTdGFydERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5ld1Rhc2tTdGFydERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRUYXNrRVZNZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRUYXNrRVZNZXRob2QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb2plY3RFeHRlcm5hbGx5RWRpdGVkOiAiKTsKLQkJaWYgKHByb2plY3RFeHRlcm5hbGx5RWRpdGVkRVNldCkgcmVzdWx0LmFwcGVuZChwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4dGVuZGVkQ3JlYXRpb25EYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleHRlbmRlZENyZWF0aW9uRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsc0luU3luYzogIik7Ci0JCWlmIChhY3R1YWxzSW5TeW5jRVNldCkgcmVzdWx0LmFwcGVuZChhY3R1YWxzSW5TeW5jKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtb3ZlRmlsZVByb3BlcnRpZXM6ICIpOwotCQlpZiAocmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0KSByZXN1bHQuYXBwZW5kKHJlbW92ZUZpbGVQcm9wZXJ0aWVzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWRtaW5Qcm9qZWN0OiAiKTsKLQkJaWYgKGFkbWluUHJvamVjdEVTZXQpIHJlc3VsdC5hcHBlbmQoYWRtaW5Qcm9qZWN0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2plY3RJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SYXRlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWUzOWY1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SYXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmF0ZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCNnZXRSYXRlc0Zyb20gPGVtPlJhdGVzIEZyb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCNnZXRSYXRlc1RvIDxlbT5SYXRlcyBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldFJhdGVUYWJsZSA8ZW0+UmF0ZSBUYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmF0ZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJhdGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYXRlc0Zyb20oKSA8ZW0+UmF0ZXMgRnJvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmF0ZXNGcm9tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSQVRFU19GUk9NX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVzRnJvbSgpIDxlbT5SYXRlcyBGcm9tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlc0Zyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmF0ZXNGcm9tID0gUkFURVNfRlJPTV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYXRlc1RvKCkgPGVtPlJhdGVzIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlc1RvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSQVRFU19UT19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYXRlc1RvKCkgPGVtPlJhdGVzIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlc1RvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJhdGVzVG8gPSBSQVRFU19UT19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYXRlVGFibGUoKSA8ZW0+UmF0ZSBUYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUkFURV9UQUJMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYXRlVGFibGUoKSA8ZW0+UmF0ZSBUYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciByYXRlVGFibGUgPSBSQVRFX1RBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZSgpIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBTVEFOREFSRF9SQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZSgpIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHN0YW5kYXJkUmF0ZSA9IFNUQU5EQVJEX1JBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKSA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgc3RhbmRhcmRSYXRlRm9ybWF0ID0gU1RBTkRBUkRfUkFURV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVSYXRlKCkgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIE9WRVJUSU1FX1JBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVSYXRlKCkgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgb3ZlcnRpbWVSYXRlID0gT1ZFUlRJTUVfUkFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKSA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIE9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpIDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBvdmVydGltZVJhdGVGb3JtYXQgPSBPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0UGVyVXNlKCkgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdFBlclVzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIENPU1RfUEVSX1VTRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0UGVyVXNlKCkgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdFBlclVzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgY29zdFBlclVzZSA9IENPU1RfUEVSX1VTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSYXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFJhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJhdGVzRnJvbSgpIHsKLQkJcmV0dXJuIHJhdGVzRnJvbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSYXRlc0Zyb20oT2JqZWN0IG5ld1JhdGVzRnJvbSkgewotCQlPYmplY3Qgb2xkUmF0ZXNGcm9tID0gcmF0ZXNGcm9tOwotCQlyYXRlc0Zyb20gPSBuZXdSYXRlc0Zyb207Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfRlJPTSwgb2xkUmF0ZXNGcm9tLCByYXRlc0Zyb20pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJhdGVzVG8oKSB7Ci0JCXJldHVybiByYXRlc1RvOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhdGVzVG8oT2JqZWN0IG5ld1JhdGVzVG8pIHsKLQkJT2JqZWN0IG9sZFJhdGVzVG8gPSByYXRlc1RvOwotCQlyYXRlc1RvID0gbmV3UmF0ZXNUbzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19UTywgb2xkUmF0ZXNUbywgcmF0ZXNUbykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFJhdGVUYWJsZSgpIHsKLQkJcmV0dXJuIHJhdGVUYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSYXRlVGFibGUoQmlnSW50ZWdlciBuZXdSYXRlVGFibGUpIHsKLQkJQmlnSW50ZWdlciBvbGRSYXRlVGFibGUgPSByYXRlVGFibGU7Ci0JCXJhdGVUYWJsZSA9IG5ld1JhdGVUYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFX1RBQkxFLCBvbGRSYXRlVGFibGUsIHJhdGVUYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldFN0YW5kYXJkUmF0ZSgpIHsKLQkJcmV0dXJuIHN0YW5kYXJkUmF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFuZGFyZFJhdGUoQmlnRGVjaW1hbCBuZXdTdGFuZGFyZFJhdGUpIHsKLQkJQmlnRGVjaW1hbCBvbGRTdGFuZGFyZFJhdGUgPSBzdGFuZGFyZFJhdGU7Ci0JCXN0YW5kYXJkUmF0ZSA9IG5ld1N0YW5kYXJkUmF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFLCBvbGRTdGFuZGFyZFJhdGUsIHN0YW5kYXJkUmF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFN0YW5kYXJkUmF0ZUZvcm1hdCgpIHsKLQkJcmV0dXJuIHN0YW5kYXJkUmF0ZUZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFuZGFyZFJhdGVGb3JtYXQoQmlnSW50ZWdlciBuZXdTdGFuZGFyZFJhdGVGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRTdGFuZGFyZFJhdGVGb3JtYXQgPSBzdGFuZGFyZFJhdGVGb3JtYXQ7Ci0JCXN0YW5kYXJkUmF0ZUZvcm1hdCA9IG5ld1N0YW5kYXJkUmF0ZUZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFX0ZPUk1BVCwgb2xkU3RhbmRhcmRSYXRlRm9ybWF0LCBzdGFuZGFyZFJhdGVGb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRPdmVydGltZVJhdGUoKSB7Ci0JCXJldHVybiBvdmVydGltZVJhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwgbmV3T3ZlcnRpbWVSYXRlKSB7Ci0JCUJpZ0RlY2ltYWwgb2xkT3ZlcnRpbWVSYXRlID0gb3ZlcnRpbWVSYXRlOwotCQlvdmVydGltZVJhdGUgPSBuZXdPdmVydGltZVJhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURSwgb2xkT3ZlcnRpbWVSYXRlLCBvdmVydGltZVJhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRPdmVydGltZVJhdGVGb3JtYXQoKSB7Ci0JCXJldHVybiBvdmVydGltZVJhdGVGb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KEJpZ0ludGVnZXIgbmV3T3ZlcnRpbWVSYXRlRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkT3ZlcnRpbWVSYXRlRm9ybWF0ID0gb3ZlcnRpbWVSYXRlRm9ybWF0OwotCQlvdmVydGltZVJhdGVGb3JtYXQgPSBuZXdPdmVydGltZVJhdGVGb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQsIG9sZE92ZXJ0aW1lUmF0ZUZvcm1hdCwgb3ZlcnRpbWVSYXRlRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q29zdFBlclVzZSgpIHsKLQkJcmV0dXJuIGNvc3RQZXJVc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdFBlclVzZShCaWdEZWNpbWFsIG5ld0Nvc3RQZXJVc2UpIHsKLQkJQmlnRGVjaW1hbCBvbGRDb3N0UGVyVXNlID0gY29zdFBlclVzZTsKLQkJY29zdFBlclVzZSA9IG5ld0Nvc3RQZXJVc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fQ09TVF9QRVJfVVNFLCBvbGRDb3N0UGVyVXNlLCBjb3N0UGVyVXNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX0ZST006Ci0JCQkJcmV0dXJuIGdldFJhdGVzRnJvbSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX1RPOgotCQkJCXJldHVybiBnZXRSYXRlc1RvKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURV9UQUJMRToKLQkJCQlyZXR1cm4gZ2V0UmF0ZVRhYmxlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gZ2V0U3RhbmRhcmRSYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldFN0YW5kYXJkUmF0ZUZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEU6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lUmF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEVfRk9STUFUOgotCQkJCXJldHVybiBnZXRPdmVydGltZVJhdGVGb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19DT1NUX1BFUl9VU0U6Ci0JCQkJcmV0dXJuIGdldENvc3RQZXJVc2UoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfRlJPTToKLQkJCQlzZXRSYXRlc0Zyb20oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX1RPOgotCQkJCXNldFJhdGVzVG8oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVfVEFCTEU6Ci0JCQkJc2V0UmF0ZVRhYmxlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURToKLQkJCQlzZXRTdGFuZGFyZFJhdGUoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFX0ZPUk1BVDoKLQkJCQlzZXRTdGFuZGFyZFJhdGVGb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFOgotCQkJCXNldE92ZXJ0aW1lUmF0ZSgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEVfRk9STUFUOgotCQkJCXNldE92ZXJ0aW1lUmF0ZUZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX0NPU1RfUEVSX1VTRToKLQkJCQlzZXRDb3N0UGVyVXNlKChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX0ZST006Ci0JCQkJc2V0UmF0ZXNGcm9tKFJBVEVTX0ZST01fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19UTzoKLQkJCQlzZXRSYXRlc1RvKFJBVEVTX1RPX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURV9UQUJMRToKLQkJCQlzZXRSYXRlVGFibGUoUkFURV9UQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEU6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlKFNUQU5EQVJEX1JBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFX0ZPUk1BVDoKLQkJCQlzZXRTdGFuZGFyZFJhdGVGb3JtYXQoU1RBTkRBUkRfUkFURV9GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFOgotCQkJCXNldE92ZXJ0aW1lUmF0ZShPVkVSVElNRV9SQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KE9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fQ09TVF9QRVJfVVNFOgotCQkJCXNldENvc3RQZXJVc2UoQ09TVF9QRVJfVVNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19GUk9NOgotCQkJCXJldHVybiBSQVRFU19GUk9NX0VERUZBVUxUID09IG51bGwgPyByYXRlc0Zyb20gIT0gbnVsbCA6ICFSQVRFU19GUk9NX0VERUZBVUxULmVxdWFscyhyYXRlc0Zyb20pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX1RPOgotCQkJCXJldHVybiBSQVRFU19UT19FREVGQVVMVCA9PSBudWxsID8gcmF0ZXNUbyAhPSBudWxsIDogIVJBVEVTX1RPX0VERUZBVUxULmVxdWFscyhyYXRlc1RvKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFX1RBQkxFOgotCQkJCXJldHVybiBSQVRFX1RBQkxFX0VERUZBVUxUID09IG51bGwgPyByYXRlVGFibGUgIT0gbnVsbCA6ICFSQVRFX1RBQkxFX0VERUZBVUxULmVxdWFscyhyYXRlVGFibGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEU6Ci0JCQkJcmV0dXJuIFNUQU5EQVJEX1JBVEVfRURFRkFVTFQgPT0gbnVsbCA/IHN0YW5kYXJkUmF0ZSAhPSBudWxsIDogIVNUQU5EQVJEX1JBVEVfRURFRkFVTFQuZXF1YWxzKHN0YW5kYXJkUmF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIFNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBzdGFuZGFyZFJhdGVGb3JtYXQgIT0gbnVsbCA6ICFTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMoc3RhbmRhcmRSYXRlRm9ybWF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBPVkVSVElNRV9SQVRFX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZVJhdGUgIT0gbnVsbCA6ICFPVkVSVElNRV9SQVRFX0VERUZBVUxULmVxdWFscyhvdmVydGltZVJhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEVfRk9STUFUOgotCQkJCXJldHVybiBPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gb3ZlcnRpbWVSYXRlRm9ybWF0ICE9IG51bGwgOiAhT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lUmF0ZUZvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fQ09TVF9QRVJfVVNFOgotCQkJCXJldHVybiBDT1NUX1BFUl9VU0VfRURFRkFVTFQgPT0gbnVsbCA/IGNvc3RQZXJVc2UgIT0gbnVsbCA6ICFDT1NUX1BFUl9VU0VfRURFRkFVTFQuZXF1YWxzKGNvc3RQZXJVc2UpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmF0ZXNGcm9tOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyYXRlc0Zyb20pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJhdGVzVG86ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJhdGVzVG8pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJhdGVUYWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmF0ZVRhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFuZGFyZFJhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YW5kYXJkUmF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhbmRhcmRSYXRlRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFuZGFyZFJhdGVGb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lUmF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVSYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdmVydGltZVJhdGVGb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG92ZXJ0aW1lUmF0ZUZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdFBlclVzZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdFBlclVzZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1JhdGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SYXRlc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1JhdGVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYzdkOTA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1JhdGVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmF0ZXNJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SYXRlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVzSW1wbCNnZXRSYXRlIDxlbT5SYXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmF0ZXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSYXRlcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZSgpIDxlbT5SYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByYXRlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSYXRlc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRSYXRlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSYXRlKCkgewotCQlpZiAocmF0ZSA9PSBudWxsKSB7Ci0JCQlyYXRlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJhdGUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuUkFURVNfX1JBVEUpOwotCQl9Ci0JCXJldHVybiByYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFU19fUkFURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSYXRlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFU19fUkFURToKLQkJCQlyZXR1cm4gZ2V0UmF0ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFU19fUkFURToKLQkJCQlnZXRSYXRlKCkuY2xlYXIoKTsKLQkJCQlnZXRSYXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVTX19SQVRFOgotCQkJCWdldFJhdGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVTX19SQVRFOgotCQkJCXJldHVybiByYXRlICE9IG51bGwgJiYgIXJhdGUuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9SYXRlc0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Jlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwNTY3NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjE1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVzb3VyY2VJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRJRCA8ZW0+SUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEluaXRpYWxzIDxlbT5Jbml0aWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRQaG9uZXRpY3MgPGVtPlBob25ldGljczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXROVEFjY291bnQgPGVtPk5UIEFjY291bnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0TWF0ZXJpYWxMYWJlbCA8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q29kZSA8ZW0+Q29kZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0V29ya0dyb3VwIDxlbT5Xb3JrIEdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEVtYWlsQWRkcmVzcyA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0TWF4VW5pdHMgPGVtPk1heCBVbml0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRQZWFrVW5pdHMgPGVtPlBlYWsgVW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNpc0NhbkxldmVsIDxlbT5DYW4gTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QWNjcnVlQXQgPGVtPkFjY3J1ZSBBdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFNWIDxlbT5TVjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRDViA8ZW0+Q1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjaXNJc0dlbmVyaWMgPGVtPklzIEdlbmVyaWM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjaXNJc0luYWN0aXZlIDxlbT5JcyBJbmFjdGl2ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNpc0lzRW50ZXJwcmlzZSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcyA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UmF0ZXMgPGVtPlJhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJlc291cmNlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElEKCkgPGVtPklEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElEKCkgPGVtPklEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgaUQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzTnVsbCgpIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX05VTExfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNOdWxsKCkgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGwgPSBJU19OVUxMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBOdWxsIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGxFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbHMoKSA8ZW0+SW5pdGlhbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFscygpIDxlbT5Jbml0aWFsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdGlhbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaW5pdGlhbHMgPSBJTklUSUFMU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaG9uZXRpY3MoKSA8ZW0+UGhvbmV0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT05FVElDU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaG9uZXRpY3MoKSA8ZW0+UGhvbmV0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGhvbmV0aWNzID0gUEhPTkVUSUNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5UQWNjb3VudCgpIDxlbT5OVCBBY2NvdW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROVEFjY291bnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5UQUNDT1VOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROVEFjY291bnQoKSA8ZW0+TlQgQWNjb3VudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TlRBY2NvdW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5UQWNjb3VudCA9IE5UQUNDT1VOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXRlcmlhbExhYmVsKCkgPGVtPk1hdGVyaWFsIExhYmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXRlcmlhbExhYmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVRFUklBTF9MQUJFTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXRlcmlhbExhYmVsKCkgPGVtPk1hdGVyaWFsIExhYmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXRlcmlhbExhYmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hdGVyaWFsTGFiZWwgPSBNQVRFUklBTF9MQUJFTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2RlKCkgPGVtPkNvZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29kZSgpIDxlbT5Db2RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvZGUgPSBDT0RFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwKCkgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAoKSA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdyb3VwID0gR1JPVVBfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya0dyb3VwKCkgPGVtPldvcmsgR3JvdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFdPUktfR1JPVVBfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya0dyb3VwKCkgPGVtPldvcmsgR3JvdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgd29ya0dyb3VwID0gV09SS19HUk9VUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbWFpbEFkZHJlc3MoKSA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW1haWxBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTUFJTF9BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVtYWlsQWRkcmVzcygpIDxlbT5FbWFpbCBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbWFpbEFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZW1haWxBZGRyZXNzID0gRU1BSUxfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rID0gSFlQRVJMSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rQWRkcmVzcyA9IEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzcyA9IEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXhVbml0cygpIDxlbT5NYXggVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1heFVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IE1BWF9VTklUU19FREVGQVVMVCA9IDEuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXhVbml0cygpIDxlbT5NYXggVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1heFVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgbWF4VW5pdHMgPSBNQVhfVU5JVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1heCBVbml0cyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF4VW5pdHNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVha1VuaXRzKCkgPGVtPlBlYWsgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlYWtVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBQRUFLX1VOSVRTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlYWtVbml0cygpIDxlbT5QZWFrIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZWFrVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBwZWFrVW5pdHMgPSBQRUFLX1VOSVRTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBQZWFrIFVuaXRzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwZWFrVW5pdHNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPdmVyQWxsb2NhdGVkKCkgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBPVkVSX0FMTE9DQVRFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPdmVyQWxsb2NhdGVkKCkgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJBbGxvY2F0ZWQgPSBPVkVSX0FMTE9DQVRFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgT3ZlciBBbGxvY2F0ZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJBbGxvY2F0ZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmxlRnJvbSgpIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQVZBSUxBQkxFX0ZST01fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmxlRnJvbSgpIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhdmFpbGFibGVGcm9tID0gQVZBSUxBQkxFX0ZST01fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmxlVG8oKSA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdmFpbGFibGVUbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQVZBSUxBQkxFX1RPX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVRvKCkgPGVtPkF2YWlsYWJsZSBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYXZhaWxhYmxlVG8gPSBBVkFJTEFCTEVfVE9fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydCgpIDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3RhcnQgPSBTVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2goKSA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2goKSA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZmluaXNoID0gRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FuTGV2ZWwoKSA8ZW0+Q2FuIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0NhbkxldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ0FOX0xFVkVMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NhbkxldmVsKCkgPGVtPkNhbiBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYW5MZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuTGV2ZWwgPSBDQU5fTEVWRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENhbiBMZXZlbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuTGV2ZWxFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjcnVlQXQoKSA8ZW0+QWNjcnVlIEF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2NydWVBdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEFDQ1JVRV9BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2NydWVBdCgpIDxlbT5BY2NydWUgQXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY3J1ZUF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBhY2NydWVBdCA9IEFDQ1JVRV9BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFdPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHdvcmsgPSBXT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZ3VsYXJXb3JrKCkgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFR1VMQVJfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWd1bGFyV29yaygpIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlZ3VsYXJXb3JrID0gUkVHVUxBUl9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lV29yaygpIDxlbT5PdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IE9WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVXb3JrKCkgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBvdmVydGltZVdvcmsgPSBPVkVSVElNRV9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmsoKSA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmsoKSA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsV29yayA9IEFDVFVBTF9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ1dvcmsoKSA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFTUFJTklOR19XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ1dvcmsoKSA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nV29yayA9IFJFTUFJTklOR19XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxPdmVydGltZVdvcmsgPSBBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBlcmNlbnRXb3JrQ29tcGxldGUgPSBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlKCkgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFNUQU5EQVJEX1JBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlKCkgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgc3RhbmRhcmRSYXRlID0gU1RBTkRBUkRfUkFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKSA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpIDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBzdGFuZGFyZFJhdGVGb3JtYXQgPSBTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBDT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgY29zdCA9IENPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVSYXRlKCkgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIE9WRVJUSU1FX1JBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVSYXRlKCkgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgb3ZlcnRpbWVSYXRlID0gT1ZFUlRJTUVfUkFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKSA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIE9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpIDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBvdmVydGltZVJhdGVGb3JtYXQgPSBPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZUNvc3QoKSA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZUNvc3QoKSA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBvdmVydGltZUNvc3QgPSBPVkVSVElNRV9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RQZXJVc2UoKSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9QRVJfVVNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RQZXJVc2UoKSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBjb3N0UGVyVXNlID0gQ09TVF9QRVJfVVNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbENvc3QoKSA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBBQ1RVQUxfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxDb3N0KCkgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBhY3R1YWxDb3N0ID0gQUNUVUFMX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgYWN0dWFsT3ZlcnRpbWVDb3N0ID0gQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nQ29zdCgpIDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0Nvc3QoKSA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHJlbWFpbmluZ0Nvc3QgPSBSRU1BSU5JTkdfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCByZW1haW5pbmdPdmVydGltZUNvc3QgPSBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrVmFyaWFuY2UoKSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1ZhcmlhbmNlKCkgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHdvcmtWYXJpYW5jZSA9IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFdvcmsgVmFyaWFuY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHdvcmtWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0VmFyaWFuY2UoKSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IENPU1RfVkFSSUFOQ0VfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdFZhcmlhbmNlKCkgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGNvc3RWYXJpYW5jZSA9IENPU1RfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENvc3QgVmFyaWFuY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvc3RWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTVigpIDxlbT5TVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgU1ZfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U1YoKSA8ZW0+U1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgc1YgPSBTVl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU1YgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNWRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENWKCkgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBDVl9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDVigpIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBjViA9IENWX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDViBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY1ZFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QUNXUCgpIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEFDV1BfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QUNXUCgpIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYUNXUCA9IEFDV1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFDV1AgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFDV1BFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXJVSUQoKSA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIENBTEVOREFSX1VJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxlbmRhclVJRCgpIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBjYWxlbmRhclVJRCA9IENBTEVOREFSX1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RlcygpIDxlbT5Ob3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEVTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdGVzKCkgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBub3RlcyA9IE5PVEVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dTIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dTRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNHZW5lcmljKCkgPGVtPklzIEdlbmVyaWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNHZW5lcmljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfR0VORVJJQ19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0dlbmVyaWMoKSA8ZW0+SXMgR2VuZXJpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc0dlbmVyaWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzR2VuZXJpYyA9IElTX0dFTkVSSUNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIEdlbmVyaWMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzR2VuZXJpY0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzSW5hY3RpdmUoKSA8ZW0+SXMgSW5hY3RpdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNJbmFjdGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0lOQUNUSVZFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzSW5hY3RpdmUoKSA8ZW0+SXMgSW5hY3RpdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNJbmFjdGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmFjdGl2ZSA9IElTX0lOQUNUSVZFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBJbmFjdGl2ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmFjdGl2ZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzRW50ZXJwcmlzZSgpIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzRW50ZXJwcmlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0VOVEVSUFJJU0VfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNFbnRlcnByaXNlKCkgPGVtPklzIEVudGVycHJpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNFbnRlcnByaXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VudGVycHJpc2UgPSBJU19FTlRFUlBSSVNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBFbnRlcnByaXNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VudGVycHJpc2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9va2luZ1R5cGUoKSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCb29raW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEJPT0tJTkdfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCb29raW5nVHlwZSgpIDxlbT5Cb29raW5nIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJvb2tpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBib29raW5nVHlwZSA9IEJPT0tJTkdfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbFdvcmtQcm90ZWN0ZWQgPSBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA9IEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCkgPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZFX0RJUkVDVE9SWV9HVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2ZURpcmVjdG9yeUdVSUQoKSA8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2ZURpcmVjdG9yeUdVSUQgPSBBQ1RJVkVfRElSRUNUT1JZX0dVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25EYXRlKCkgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQ1JFQVRJT05fREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGlvbkRhdGUoKSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0aW9uRGF0ZSA9IENSRUFUSU9OX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBleHRlbmRlZEF0dHJpYnV0ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlbGluZSgpIDxlbT5CYXNlbGluZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGJhc2VsaW5lID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVDb2RlKCkgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG91dGxpbmVDb2RlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKSA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBBdmFpbGFiaWxpdHlQZXJpb2RzIGF2YWlsYWJpbGl0eVBlcmlvZHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZXMoKSA8ZW0+UmF0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmF0ZXMgcmF0ZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZXBoYXNlZERhdGEoKSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdGltZXBoYXNlZERhdGEgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0SUQoKSB7Ci0JCXJldHVybiBpRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJRChCaWdJbnRlZ2VyIG5ld0lEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkSUQgPSBpRDsKLQkJaUQgPSBuZXdJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSUQsIG9sZElELCBpRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIG5ld1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzTnVsbCgpIHsKLQkJcmV0dXJuIGlzTnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc051bGwoYm9vbGVhbiBuZXdJc051bGwpIHsKLQkJYm9vbGVhbiBvbGRJc051bGwgPSBpc051bGw7Ci0JCWlzTnVsbCA9IG5ld0lzTnVsbDsKLQkJYm9vbGVhbiBvbGRJc051bGxFU2V0ID0gaXNOdWxsRVNldDsKLQkJaXNOdWxsRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX05VTEwsIG9sZElzTnVsbCwgaXNOdWxsLCAhb2xkSXNOdWxsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNOdWxsKCkgewotCQlib29sZWFuIG9sZElzTnVsbCA9IGlzTnVsbDsKLQkJYm9vbGVhbiBvbGRJc051bGxFU2V0ID0gaXNOdWxsRVNldDsKLQkJaXNOdWxsID0gSVNfTlVMTF9FREVGQVVMVDsKLQkJaXNOdWxsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX05VTEwsIG9sZElzTnVsbCwgSVNfTlVMTF9FREVGQVVMVCwgb2xkSXNOdWxsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNOdWxsKCkgewotCQlyZXR1cm4gaXNOdWxsRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxzKCkgewotCQlyZXR1cm4gaW5pdGlhbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbHMoU3RyaW5nIG5ld0luaXRpYWxzKSB7Ci0JCVN0cmluZyBvbGRJbml0aWFscyA9IGluaXRpYWxzOwotCQlpbml0aWFscyA9IG5ld0luaXRpYWxzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUywgb2xkSW5pdGlhbHMsIGluaXRpYWxzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaG9uZXRpY3MoKSB7Ci0JCXJldHVybiBwaG9uZXRpY3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGhvbmV0aWNzKFN0cmluZyBuZXdQaG9uZXRpY3MpIHsKLQkJU3RyaW5nIG9sZFBob25ldGljcyA9IHBob25ldGljczsKLQkJcGhvbmV0aWNzID0gbmV3UGhvbmV0aWNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QSE9ORVRJQ1MsIG9sZFBob25ldGljcywgcGhvbmV0aWNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROVEFjY291bnQoKSB7Ci0JCXJldHVybiBuVEFjY291bnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TlRBY2NvdW50KFN0cmluZyBuZXdOVEFjY291bnQpIHsKLQkJU3RyaW5nIG9sZE5UQWNjb3VudCA9IG5UQWNjb3VudDsKLQkJblRBY2NvdW50ID0gbmV3TlRBY2NvdW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OVEFDQ09VTlQsIG9sZE5UQWNjb3VudCwgblRBY2NvdW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXRlcmlhbExhYmVsKCkgewotCQlyZXR1cm4gbWF0ZXJpYWxMYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXRlcmlhbExhYmVsKFN0cmluZyBuZXdNYXRlcmlhbExhYmVsKSB7Ci0JCVN0cmluZyBvbGRNYXRlcmlhbExhYmVsID0gbWF0ZXJpYWxMYWJlbDsKLQkJbWF0ZXJpYWxMYWJlbCA9IG5ld01hdGVyaWFsTGFiZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX01BVEVSSUFMX0xBQkVMLCBvbGRNYXRlcmlhbExhYmVsLCBtYXRlcmlhbExhYmVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2RlKCkgewotCQlyZXR1cm4gY29kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2RlKFN0cmluZyBuZXdDb2RlKSB7Ci0JCVN0cmluZyBvbGRDb2RlID0gY29kZTsKLQkJY29kZSA9IG5ld0NvZGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPREUsIG9sZENvZGUsIGNvZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEdyb3VwKCkgewotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3JvdXAoU3RyaW5nIG5ld0dyb3VwKSB7Ci0JCVN0cmluZyBvbGRHcm91cCA9IGdyb3VwOwotCQlncm91cCA9IG5ld0dyb3VwOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19HUk9VUCwgb2xkR3JvdXAsIGdyb3VwKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0V29ya0dyb3VwKCkgewotCQlyZXR1cm4gd29ya0dyb3VwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtHcm91cChCaWdJbnRlZ2VyIG5ld1dvcmtHcm91cCkgewotCQlCaWdJbnRlZ2VyIG9sZFdvcmtHcm91cCA9IHdvcmtHcm91cDsKLQkJd29ya0dyb3VwID0gbmV3V29ya0dyb3VwOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX0dST1VQLCBvbGRXb3JrR3JvdXAsIHdvcmtHcm91cCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW1haWxBZGRyZXNzKCkgewotCQlyZXR1cm4gZW1haWxBZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVtYWlsQWRkcmVzcyhTdHJpbmcgbmV3RW1haWxBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRFbWFpbEFkZHJlc3MgPSBlbWFpbEFkZHJlc3M7Ci0JCWVtYWlsQWRkcmVzcyA9IG5ld0VtYWlsQWRkcmVzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRU1BSUxfQUREUkVTUywgb2xkRW1haWxBZGRyZXNzLCBlbWFpbEFkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGluaygpIHsKLQkJcmV0dXJuIGh5cGVybGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmsoU3RyaW5nIG5ld0h5cGVybGluaykgewotCQlTdHJpbmcgb2xkSHlwZXJsaW5rID0gaHlwZXJsaW5rOwotCQloeXBlcmxpbmsgPSBuZXdIeXBlcmxpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOSywgb2xkSHlwZXJsaW5rLCBoeXBlcmxpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua0FkZHJlc3MoKSB7Ci0JCXJldHVybiBoeXBlcmxpbmtBZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nIG5ld0h5cGVybGlua0FkZHJlc3MpIHsKLQkJU3RyaW5nIG9sZEh5cGVybGlua0FkZHJlc3MgPSBoeXBlcmxpbmtBZGRyZXNzOwotCQloeXBlcmxpbmtBZGRyZXNzID0gbmV3SHlwZXJsaW5rQWRkcmVzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSFlQRVJMSU5LX0FERFJFU1MsIG9sZEh5cGVybGlua0FkZHJlc3MsIGh5cGVybGlua0FkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0JCXJldHVybiBoeXBlcmxpbmtTdWJBZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1N1YkFkZHJlc3MoU3RyaW5nIG5ld0h5cGVybGlua1N1YkFkZHJlc3MpIHsKLQkJU3RyaW5nIG9sZEh5cGVybGlua1N1YkFkZHJlc3MgPSBoeXBlcmxpbmtTdWJBZGRyZXNzOwotCQloeXBlcmxpbmtTdWJBZGRyZXNzID0gbmV3SHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSFlQRVJMSU5LX1NVQl9BRERSRVNTLCBvbGRIeXBlcmxpbmtTdWJBZGRyZXNzLCBoeXBlcmxpbmtTdWJBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldE1heFVuaXRzKCkgewotCQlyZXR1cm4gbWF4VW5pdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF4VW5pdHMoZmxvYXQgbmV3TWF4VW5pdHMpIHsKLQkJZmxvYXQgb2xkTWF4VW5pdHMgPSBtYXhVbml0czsKLQkJbWF4VW5pdHMgPSBuZXdNYXhVbml0czsKLQkJYm9vbGVhbiBvbGRNYXhVbml0c0VTZXQgPSBtYXhVbml0c0VTZXQ7Ci0JCW1heFVuaXRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX01BWF9VTklUUywgb2xkTWF4VW5pdHMsIG1heFVuaXRzLCAhb2xkTWF4VW5pdHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNYXhVbml0cygpIHsKLQkJZmxvYXQgb2xkTWF4VW5pdHMgPSBtYXhVbml0czsKLQkJYm9vbGVhbiBvbGRNYXhVbml0c0VTZXQgPSBtYXhVbml0c0VTZXQ7Ci0JCW1heFVuaXRzID0gTUFYX1VOSVRTX0VERUZBVUxUOwotCQltYXhVbml0c0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVhfVU5JVFMsIG9sZE1heFVuaXRzLCBNQVhfVU5JVFNfRURFRkFVTFQsIG9sZE1heFVuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TWF4VW5pdHMoKSB7Ci0JCXJldHVybiBtYXhVbml0c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldFBlYWtVbml0cygpIHsKLQkJcmV0dXJuIHBlYWtVbml0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZWFrVW5pdHMoZmxvYXQgbmV3UGVha1VuaXRzKSB7Ci0JCWZsb2F0IG9sZFBlYWtVbml0cyA9IHBlYWtVbml0czsKLQkJcGVha1VuaXRzID0gbmV3UGVha1VuaXRzOwotCQlib29sZWFuIG9sZFBlYWtVbml0c0VTZXQgPSBwZWFrVW5pdHNFU2V0OwotCQlwZWFrVW5pdHNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVBS19VTklUUywgb2xkUGVha1VuaXRzLCBwZWFrVW5pdHMsICFvbGRQZWFrVW5pdHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRQZWFrVW5pdHMoKSB7Ci0JCWZsb2F0IG9sZFBlYWtVbml0cyA9IHBlYWtVbml0czsKLQkJYm9vbGVhbiBvbGRQZWFrVW5pdHNFU2V0ID0gcGVha1VuaXRzRVNldDsKLQkJcGVha1VuaXRzID0gUEVBS19VTklUU19FREVGQVVMVDsKLQkJcGVha1VuaXRzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFQUtfVU5JVFMsIG9sZFBlYWtVbml0cywgUEVBS19VTklUU19FREVGQVVMVCwgb2xkUGVha1VuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UGVha1VuaXRzKCkgewotCQlyZXR1cm4gcGVha1VuaXRzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJBbGxvY2F0ZWQoKSB7Ci0JCXJldHVybiBvdmVyQWxsb2NhdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbiBuZXdPdmVyQWxsb2NhdGVkKSB7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZCA9IG92ZXJBbGxvY2F0ZWQ7Ci0JCW92ZXJBbGxvY2F0ZWQgPSBuZXdPdmVyQWxsb2NhdGVkOwotCQlib29sZWFuIG9sZE92ZXJBbGxvY2F0ZWRFU2V0ID0gb3ZlckFsbG9jYXRlZEVTZXQ7Ci0JCW92ZXJBbGxvY2F0ZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQsIG9sZE92ZXJBbGxvY2F0ZWQsIG92ZXJBbGxvY2F0ZWQsICFvbGRPdmVyQWxsb2NhdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0T3ZlckFsbG9jYXRlZCgpIHsKLQkJYm9vbGVhbiBvbGRPdmVyQWxsb2NhdGVkID0gb3ZlckFsbG9jYXRlZDsKLQkJYm9vbGVhbiBvbGRPdmVyQWxsb2NhdGVkRVNldCA9IG92ZXJBbGxvY2F0ZWRFU2V0OwotCQlvdmVyQWxsb2NhdGVkID0gT1ZFUl9BTExPQ0FURURfRURFRkFVTFQ7Ci0JCW92ZXJBbGxvY2F0ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQsIG9sZE92ZXJBbGxvY2F0ZWQsIE9WRVJfQUxMT0NBVEVEX0VERUZBVUxULCBvbGRPdmVyQWxsb2NhdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0T3ZlckFsbG9jYXRlZCgpIHsKLQkJcmV0dXJuIG92ZXJBbGxvY2F0ZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QXZhaWxhYmxlRnJvbSgpIHsKLQkJcmV0dXJuIGF2YWlsYWJsZUZyb207Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlRnJvbShPYmplY3QgbmV3QXZhaWxhYmxlRnJvbSkgewotCQlPYmplY3Qgb2xkQXZhaWxhYmxlRnJvbSA9IGF2YWlsYWJsZUZyb207Ci0JCWF2YWlsYWJsZUZyb20gPSBuZXdBdmFpbGFibGVGcm9tOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfRlJPTSwgb2xkQXZhaWxhYmxlRnJvbSwgYXZhaWxhYmxlRnJvbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QXZhaWxhYmxlVG8oKSB7Ci0JCXJldHVybiBhdmFpbGFibGVUbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGVUbyhPYmplY3QgbmV3QXZhaWxhYmxlVG8pIHsKLQkJT2JqZWN0IG9sZEF2YWlsYWJsZVRvID0gYXZhaWxhYmxlVG87Ci0JCWF2YWlsYWJsZVRvID0gbmV3QXZhaWxhYmxlVG87Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9UTywgb2xkQXZhaWxhYmxlVG8sIGF2YWlsYWJsZVRvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KE9iamVjdCBuZXdTdGFydCkgewotCQlPYmplY3Qgb2xkU3RhcnQgPSBzdGFydDsKLQkJc3RhcnQgPSBuZXdTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBUlQsIG9sZFN0YXJ0LCBzdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmluaXNoKCkgewotCQlyZXR1cm4gZmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaChPYmplY3QgbmV3RmluaXNoKSB7Ci0JCU9iamVjdCBvbGRGaW5pc2ggPSBmaW5pc2g7Ci0JCWZpbmlzaCA9IG5ld0ZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRklOSVNILCBvbGRGaW5pc2gsIGZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FuTGV2ZWwoKSB7Ci0JCXJldHVybiBjYW5MZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYW5MZXZlbChib29sZWFuIG5ld0NhbkxldmVsKSB7Ci0JCWJvb2xlYW4gb2xkQ2FuTGV2ZWwgPSBjYW5MZXZlbDsKLQkJY2FuTGV2ZWwgPSBuZXdDYW5MZXZlbDsKLQkJYm9vbGVhbiBvbGRDYW5MZXZlbEVTZXQgPSBjYW5MZXZlbEVTZXQ7Ci0JCWNhbkxldmVsRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTl9MRVZFTCwgb2xkQ2FuTGV2ZWwsIGNhbkxldmVsLCAhb2xkQ2FuTGV2ZWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDYW5MZXZlbCgpIHsKLQkJYm9vbGVhbiBvbGRDYW5MZXZlbCA9IGNhbkxldmVsOwotCQlib29sZWFuIG9sZENhbkxldmVsRVNldCA9IGNhbkxldmVsRVNldDsKLQkJY2FuTGV2ZWwgPSBDQU5fTEVWRUxfRURFRkFVTFQ7Ci0JCWNhbkxldmVsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTl9MRVZFTCwgb2xkQ2FuTGV2ZWwsIENBTl9MRVZFTF9FREVGQVVMVCwgb2xkQ2FuTGV2ZWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDYW5MZXZlbCgpIHsKLQkJcmV0dXJuIGNhbkxldmVsRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRBY2NydWVBdCgpIHsKLQkJcmV0dXJuIGFjY3J1ZUF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY3J1ZUF0KEJpZ0ludGVnZXIgbmV3QWNjcnVlQXQpIHsKLQkJQmlnSW50ZWdlciBvbGRBY2NydWVBdCA9IGFjY3J1ZUF0OwotCQlhY2NydWVBdCA9IG5ld0FjY3J1ZUF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ0NSVUVfQVQsIG9sZEFjY3J1ZUF0LCBhY2NydWVBdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0V29yaygpIHsKLQkJcmV0dXJuIHdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29yayhPYmplY3QgbmV3V29yaykgewotCQlPYmplY3Qgb2xkV29yayA9IHdvcms7Ci0JCXdvcmsgPSBuZXdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLLCBvbGRXb3JrLCB3b3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWd1bGFyV29yaygpIHsKLQkJcmV0dXJuIHJlZ3VsYXJXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ3VsYXJXb3JrKE9iamVjdCBuZXdSZWd1bGFyV29yaykgewotCQlPYmplY3Qgb2xkUmVndWxhcldvcmsgPSByZWd1bGFyV29yazsKLQkJcmVndWxhcldvcmsgPSBuZXdSZWd1bGFyV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVHVUxBUl9XT1JLLCBvbGRSZWd1bGFyV29yaywgcmVndWxhcldvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE92ZXJ0aW1lV29yaygpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZVdvcmsoT2JqZWN0IG5ld092ZXJ0aW1lV29yaykgewotCQlPYmplY3Qgb2xkT3ZlcnRpbWVXb3JrID0gb3ZlcnRpbWVXb3JrOwotCQlvdmVydGltZVdvcmsgPSBuZXdPdmVydGltZVdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1dPUkssIG9sZE92ZXJ0aW1lV29yaywgb3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxXb3JrKCkgewotCQlyZXR1cm4gYWN0dWFsV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCBuZXdBY3R1YWxXb3JrKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxXb3JrID0gYWN0dWFsV29yazsKLQkJYWN0dWFsV29yayA9IG5ld0FjdHVhbFdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLLCBvbGRBY3R1YWxXb3JrLCBhY3R1YWxXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZW1haW5pbmdXb3JrKCkgewotCQlyZXR1cm4gcmVtYWluaW5nV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdXb3JrKE9iamVjdCBuZXdSZW1haW5pbmdXb3JrKSB7Ci0JCU9iamVjdCBvbGRSZW1haW5pbmdXb3JrID0gcmVtYWluaW5nV29yazsKLQkJcmVtYWluaW5nV29yayA9IG5ld1JlbWFpbmluZ1dvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19XT1JLLCBvbGRSZW1haW5pbmdXb3JrLCByZW1haW5pbmdXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdBY3R1YWxPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZEFjdHVhbE92ZXJ0aW1lV29yayA9IGFjdHVhbE92ZXJ0aW1lV29yazsKLQkJYWN0dWFsT3ZlcnRpbWVXb3JrID0gbmV3QWN0dWFsT3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfV09SSywgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrLCBhY3R1YWxPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ092ZXJ0aW1lV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0IG5ld1JlbWFpbmluZ092ZXJ0aW1lV29yaykgewotCQlPYmplY3Qgb2xkUmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gcmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCQlyZW1haW5pbmdPdmVydGltZVdvcmsgPSBuZXdSZW1haW5pbmdPdmVydGltZVdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLLCBvbGRSZW1haW5pbmdPdmVydGltZVdvcmssIHJlbWFpbmluZ092ZXJ0aW1lV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKSB7Ci0JCXJldHVybiBwZXJjZW50V29ya0NvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcmNlbnRXb3JrQ29tcGxldGUoQmlnSW50ZWdlciBuZXdQZXJjZW50V29ya0NvbXBsZXRlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUGVyY2VudFdvcmtDb21wbGV0ZSA9IHBlcmNlbnRXb3JrQ29tcGxldGU7Ci0JCXBlcmNlbnRXb3JrQ29tcGxldGUgPSBuZXdQZXJjZW50V29ya0NvbXBsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QRVJDRU5UX1dPUktfQ09NUExFVEUsIG9sZFBlcmNlbnRXb3JrQ29tcGxldGUsIHBlcmNlbnRXb3JrQ29tcGxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRTdGFuZGFyZFJhdGUoKSB7Ci0JCXJldHVybiBzdGFuZGFyZFJhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhbmRhcmRSYXRlKEJpZ0RlY2ltYWwgbmV3U3RhbmRhcmRSYXRlKSB7Ci0JCUJpZ0RlY2ltYWwgb2xkU3RhbmRhcmRSYXRlID0gc3RhbmRhcmRSYXRlOwotCQlzdGFuZGFyZFJhdGUgPSBuZXdTdGFuZGFyZFJhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEUsIG9sZFN0YW5kYXJkUmF0ZSwgc3RhbmRhcmRSYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkgewotCQlyZXR1cm4gc3RhbmRhcmRSYXRlRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW5kYXJkUmF0ZUZvcm1hdChCaWdJbnRlZ2VyIG5ld1N0YW5kYXJkUmF0ZUZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZFN0YW5kYXJkUmF0ZUZvcm1hdCA9IHN0YW5kYXJkUmF0ZUZvcm1hdDsKLQkJc3RhbmRhcmRSYXRlRm9ybWF0ID0gbmV3U3RhbmRhcmRSYXRlRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFOREFSRF9SQVRFX0ZPUk1BVCwgb2xkU3RhbmRhcmRSYXRlRm9ybWF0LCBzdGFuZGFyZFJhdGVGb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRDb3N0KCkgewotCQlyZXR1cm4gY29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgbmV3Q29zdCkgewotCQlCaWdEZWNpbWFsIG9sZENvc3QgPSBjb3N0OwotCQljb3N0ID0gbmV3Q29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVCwgb2xkQ29zdCwgY29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldE92ZXJ0aW1lUmF0ZSgpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lUmF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZVJhdGUoQmlnRGVjaW1hbCBuZXdPdmVydGltZVJhdGUpIHsKLQkJQmlnRGVjaW1hbCBvbGRPdmVydGltZVJhdGUgPSBvdmVydGltZVJhdGU7Ci0JCW92ZXJ0aW1lUmF0ZSA9IG5ld092ZXJ0aW1lUmF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfUkFURSwgb2xkT3ZlcnRpbWVSYXRlLCBvdmVydGltZVJhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRPdmVydGltZVJhdGVGb3JtYXQoKSB7Ci0JCXJldHVybiBvdmVydGltZVJhdGVGb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KEJpZ0ludGVnZXIgbmV3T3ZlcnRpbWVSYXRlRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkT3ZlcnRpbWVSYXRlRm9ybWF0ID0gb3ZlcnRpbWVSYXRlRm9ybWF0OwotCQlvdmVydGltZVJhdGVGb3JtYXQgPSBuZXdPdmVydGltZVJhdGVGb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEVfRk9STUFULCBvbGRPdmVydGltZVJhdGVGb3JtYXQsIG92ZXJ0aW1lUmF0ZUZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldE92ZXJ0aW1lQ29zdCgpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCBuZXdPdmVydGltZUNvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRPdmVydGltZUNvc3QgPSBvdmVydGltZUNvc3Q7Ci0JCW92ZXJ0aW1lQ29zdCA9IG5ld092ZXJ0aW1lQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfQ09TVCwgb2xkT3ZlcnRpbWVDb3N0LCBvdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRDb3N0UGVyVXNlKCkgewotCQlyZXR1cm4gY29zdFBlclVzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0UGVyVXNlKEJpZ0RlY2ltYWwgbmV3Q29zdFBlclVzZSkgewotCQlCaWdEZWNpbWFsIG9sZENvc3RQZXJVc2UgPSBjb3N0UGVyVXNlOwotCQljb3N0UGVyVXNlID0gbmV3Q29zdFBlclVzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVF9QRVJfVVNFLCBvbGRDb3N0UGVyVXNlLCBjb3N0UGVyVXNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0QWN0dWFsQ29zdCgpIHsKLQkJcmV0dXJuIGFjdHVhbENvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsQ29zdChCaWdEZWNpbWFsIG5ld0FjdHVhbENvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRBY3R1YWxDb3N0ID0gYWN0dWFsQ29zdDsKLQkJYWN0dWFsQ29zdCA9IG5ld0FjdHVhbENvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9DT1NULCBvbGRBY3R1YWxDb3N0LCBhY3R1YWxDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gYWN0dWFsT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld0FjdHVhbE92ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZEFjdHVhbE92ZXJ0aW1lQ29zdCA9IGFjdHVhbE92ZXJ0aW1lQ29zdDsKLQkJYWN0dWFsT3ZlcnRpbWVDb3N0ID0gbmV3QWN0dWFsT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVCwgb2xkQWN0dWFsT3ZlcnRpbWVDb3N0LCBhY3R1YWxPdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwgbmV3UmVtYWluaW5nQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ0Nvc3QgPSByZW1haW5pbmdDb3N0OwotCQlyZW1haW5pbmdDb3N0ID0gbmV3UmVtYWluaW5nQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX0NPU1QsIG9sZFJlbWFpbmluZ0Nvc3QsIHJlbWFpbmluZ0Nvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSB7Ci0JCXJldHVybiByZW1haW5pbmdPdmVydGltZUNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkUmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlyZW1haW5pbmdPdmVydGltZUNvc3QgPSBuZXdSZW1haW5pbmdPdmVydGltZUNvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9DT1NULCBvbGRSZW1haW5pbmdPdmVydGltZUNvc3QsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCXJldHVybiB3b3JrVmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya1ZhcmlhbmNlKGZsb2F0IG5ld1dvcmtWYXJpYW5jZSkgewotCQlmbG9hdCBvbGRXb3JrVmFyaWFuY2UgPSB3b3JrVmFyaWFuY2U7Ci0JCXdvcmtWYXJpYW5jZSA9IG5ld1dvcmtWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRXb3JrVmFyaWFuY2VFU2V0ID0gd29ya1ZhcmlhbmNlRVNldDsKLQkJd29ya1ZhcmlhbmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfVkFSSUFOQ0UsIG9sZFdvcmtWYXJpYW5jZSwgd29ya1ZhcmlhbmNlLCAhb2xkV29ya1ZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0V29ya1ZhcmlhbmNlKCkgewotCQlmbG9hdCBvbGRXb3JrVmFyaWFuY2UgPSB3b3JrVmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkV29ya1ZhcmlhbmNlRVNldCA9IHdvcmtWYXJpYW5jZUVTZXQ7Ci0JCXdvcmtWYXJpYW5jZSA9IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0JCXdvcmtWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFLCBvbGRXb3JrVmFyaWFuY2UsIFdPUktfVkFSSUFOQ0VfRURFRkFVTFQsIG9sZFdvcmtWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFdvcmtWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIHdvcmtWYXJpYW5jZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldENvc3RWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIGNvc3RWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0VmFyaWFuY2UoZmxvYXQgbmV3Q29zdFZhcmlhbmNlKSB7Ci0JCWZsb2F0IG9sZENvc3RWYXJpYW5jZSA9IGNvc3RWYXJpYW5jZTsKLQkJY29zdFZhcmlhbmNlID0gbmV3Q29zdFZhcmlhbmNlOwotCQlib29sZWFuIG9sZENvc3RWYXJpYW5jZUVTZXQgPSBjb3N0VmFyaWFuY2VFU2V0OwotCQljb3N0VmFyaWFuY2VFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVF9WQVJJQU5DRSwgb2xkQ29zdFZhcmlhbmNlLCBjb3N0VmFyaWFuY2UsICFvbGRDb3N0VmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDb3N0VmFyaWFuY2UoKSB7Ci0JCWZsb2F0IG9sZENvc3RWYXJpYW5jZSA9IGNvc3RWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRDb3N0VmFyaWFuY2VFU2V0ID0gY29zdFZhcmlhbmNlRVNldDsKLQkJY29zdFZhcmlhbmNlID0gQ09TVF9WQVJJQU5DRV9FREVGQVVMVDsKLQkJY29zdFZhcmlhbmNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfVkFSSUFOQ0UsIG9sZENvc3RWYXJpYW5jZSwgQ09TVF9WQVJJQU5DRV9FREVGQVVMVCwgb2xkQ29zdFZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q29zdFZhcmlhbmNlKCkgewotCQlyZXR1cm4gY29zdFZhcmlhbmNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0U1YoKSB7Ci0JCXJldHVybiBzVjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTVihmbG9hdCBuZXdTVikgewotCQlmbG9hdCBvbGRTViA9IHNWOwotCQlzViA9IG5ld1NWOwotCQlib29sZWFuIG9sZFNWRVNldCA9IHNWRVNldDsKLQkJc1ZFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1YsIG9sZFNWLCBzViwgIW9sZFNWRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U1YoKSB7Ci0JCWZsb2F0IG9sZFNWID0gc1Y7Ci0JCWJvb2xlYW4gb2xkU1ZFU2V0ID0gc1ZFU2V0OwotCQlzViA9IFNWX0VERUZBVUxUOwotCQlzVkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TViwgb2xkU1YsIFNWX0VERUZBVUxULCBvbGRTVkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFNWKCkgewotCQlyZXR1cm4gc1ZFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRDVigpIHsKLQkJcmV0dXJuIGNWOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENWKGZsb2F0IG5ld0NWKSB7Ci0JCWZsb2F0IG9sZENWID0gY1Y7Ci0JCWNWID0gbmV3Q1Y7Ci0JCWJvb2xlYW4gb2xkQ1ZFU2V0ID0gY1ZFU2V0OwotCQljVkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DViwgb2xkQ1YsIGNWLCAhb2xkQ1ZFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDVigpIHsKLQkJZmxvYXQgb2xkQ1YgPSBjVjsKLQkJYm9vbGVhbiBvbGRDVkVTZXQgPSBjVkVTZXQ7Ci0JCWNWID0gQ1ZfRURFRkFVTFQ7Ci0JCWNWRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NWLCBvbGRDViwgQ1ZfRURFRkFVTFQsIG9sZENWRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q1YoKSB7Ci0JCXJldHVybiBjVkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEFDV1AoKSB7Ci0JCXJldHVybiBhQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFDV1AoZmxvYXQgbmV3QUNXUCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYUNXUCA9IG5ld0FDV1A7Ci0JCWJvb2xlYW4gb2xkQUNXUEVTZXQgPSBhQ1dQRVNldDsKLQkJYUNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQLCBvbGRBQ1dQLCBhQ1dQLCAhb2xkQUNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEFDV1AoKSB7Ci0JCWZsb2F0IG9sZEFDV1AgPSBhQ1dQOwotCQlib29sZWFuIG9sZEFDV1BFU2V0ID0gYUNXUEVTZXQ7Ci0JCWFDV1AgPSBBQ1dQX0VERUZBVUxUOwotCQlhQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDV1AsIG9sZEFDV1AsIEFDV1BfRURFRkFVTFQsIG9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBQ1dQKCkgewotCQlyZXR1cm4gYUNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q2FsZW5kYXJVSUQoKSB7Ci0JCXJldHVybiBjYWxlbmRhclVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyIG5ld0NhbGVuZGFyVUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ2FsZW5kYXJVSUQgPSBjYWxlbmRhclVJRDsKLQkJY2FsZW5kYXJVSUQgPSBuZXdDYWxlbmRhclVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FMRU5EQVJfVUlELCBvbGRDYWxlbmRhclVJRCwgY2FsZW5kYXJVSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGVzKCkgewotCQlyZXR1cm4gbm90ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90ZXMoU3RyaW5nIG5ld05vdGVzKSB7Ci0JCVN0cmluZyBvbGROb3RlcyA9IG5vdGVzOwotCQlub3RlcyA9IG5ld05vdGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OT1RFUywgb2xkTm90ZXMsIG5vdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1MoZmxvYXQgbmV3QkNXUykgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYkNXUyA9IG5ld0JDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXU0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dTLCBvbGRCQ1dTLCBiQ1dTLCAhb2xkQkNXU0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1MoKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCQliQ1dTRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JDV1MsIG9sZEJDV1MsIEJDV1NfRURFRkFVTFQsIG9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXU0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1AoZmxvYXQgbmV3QkNXUCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYkNXUCA9IG5ld0JDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dQLCBvbGRCQ1dQLCBiQ1dQLCAhb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1AoKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCQliQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JDV1AsIG9sZEJDV1AsIEJDV1BfRURFRkFVTFQsIG9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc0dlbmVyaWMoKSB7Ci0JCXJldHVybiBpc0dlbmVyaWM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNHZW5lcmljKGJvb2xlYW4gbmV3SXNHZW5lcmljKSB7Ci0JCWJvb2xlYW4gb2xkSXNHZW5lcmljID0gaXNHZW5lcmljOwotCQlpc0dlbmVyaWMgPSBuZXdJc0dlbmVyaWM7Ci0JCWJvb2xlYW4gb2xkSXNHZW5lcmljRVNldCA9IGlzR2VuZXJpY0VTZXQ7Ci0JCWlzR2VuZXJpY0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19HRU5FUklDLCBvbGRJc0dlbmVyaWMsIGlzR2VuZXJpYywgIW9sZElzR2VuZXJpY0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzR2VuZXJpYygpIHsKLQkJYm9vbGVhbiBvbGRJc0dlbmVyaWMgPSBpc0dlbmVyaWM7Ci0JCWJvb2xlYW4gb2xkSXNHZW5lcmljRVNldCA9IGlzR2VuZXJpY0VTZXQ7Ci0JCWlzR2VuZXJpYyA9IElTX0dFTkVSSUNfRURFRkFVTFQ7Ci0JCWlzR2VuZXJpY0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19HRU5FUklDLCBvbGRJc0dlbmVyaWMsIElTX0dFTkVSSUNfRURFRkFVTFQsIG9sZElzR2VuZXJpY0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzR2VuZXJpYygpIHsKLQkJcmV0dXJuIGlzR2VuZXJpY0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc0luYWN0aXZlKCkgewotCQlyZXR1cm4gaXNJbmFjdGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0luYWN0aXZlKGJvb2xlYW4gbmV3SXNJbmFjdGl2ZSkgewotCQlib29sZWFuIG9sZElzSW5hY3RpdmUgPSBpc0luYWN0aXZlOwotCQlpc0luYWN0aXZlID0gbmV3SXNJbmFjdGl2ZTsKLQkJYm9vbGVhbiBvbGRJc0luYWN0aXZlRVNldCA9IGlzSW5hY3RpdmVFU2V0OwotCQlpc0luYWN0aXZlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0lOQUNUSVZFLCBvbGRJc0luYWN0aXZlLCBpc0luYWN0aXZlLCAhb2xkSXNJbmFjdGl2ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzSW5hY3RpdmUoKSB7Ci0JCWJvb2xlYW4gb2xkSXNJbmFjdGl2ZSA9IGlzSW5hY3RpdmU7Ci0JCWJvb2xlYW4gb2xkSXNJbmFjdGl2ZUVTZXQgPSBpc0luYWN0aXZlRVNldDsKLQkJaXNJbmFjdGl2ZSA9IElTX0lOQUNUSVZFX0VERUZBVUxUOwotCQlpc0luYWN0aXZlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0lOQUNUSVZFLCBvbGRJc0luYWN0aXZlLCBJU19JTkFDVElWRV9FREVGQVVMVCwgb2xkSXNJbmFjdGl2ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzSW5hY3RpdmUoKSB7Ci0JCXJldHVybiBpc0luYWN0aXZlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzRW50ZXJwcmlzZSgpIHsKLQkJcmV0dXJuIGlzRW50ZXJwcmlzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0VudGVycHJpc2UoYm9vbGVhbiBuZXdJc0VudGVycHJpc2UpIHsKLQkJYm9vbGVhbiBvbGRJc0VudGVycHJpc2UgPSBpc0VudGVycHJpc2U7Ci0JCWlzRW50ZXJwcmlzZSA9IG5ld0lzRW50ZXJwcmlzZTsKLQkJYm9vbGVhbiBvbGRJc0VudGVycHJpc2VFU2V0ID0gaXNFbnRlcnByaXNlRVNldDsKLQkJaXNFbnRlcnByaXNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0VOVEVSUFJJU0UsIG9sZElzRW50ZXJwcmlzZSwgaXNFbnRlcnByaXNlLCAhb2xkSXNFbnRlcnByaXNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNFbnRlcnByaXNlKCkgewotCQlib29sZWFuIG9sZElzRW50ZXJwcmlzZSA9IGlzRW50ZXJwcmlzZTsKLQkJYm9vbGVhbiBvbGRJc0VudGVycHJpc2VFU2V0ID0gaXNFbnRlcnByaXNlRVNldDsKLQkJaXNFbnRlcnByaXNlID0gSVNfRU5URVJQUklTRV9FREVGQVVMVDsKLQkJaXNFbnRlcnByaXNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0VOVEVSUFJJU0UsIG9sZElzRW50ZXJwcmlzZSwgSVNfRU5URVJQUklTRV9FREVGQVVMVCwgb2xkSXNFbnRlcnByaXNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNFbnRlcnByaXNlKCkgewotCQlyZXR1cm4gaXNFbnRlcnByaXNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRCb29raW5nVHlwZSgpIHsKLQkJcmV0dXJuIGJvb2tpbmdUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvb2tpbmdUeXBlKEJpZ0ludGVnZXIgbmV3Qm9va2luZ1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRCb29raW5nVHlwZSA9IGJvb2tpbmdUeXBlOwotCQlib29raW5nVHlwZSA9IG5ld0Jvb2tpbmdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CT09LSU5HX1RZUEUsIG9sZEJvb2tpbmdUeXBlLCBib29raW5nVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIHsKLQkJcmV0dXJuIGFjdHVhbFdvcmtQcm90ZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsV29ya1Byb3RlY3RlZChPYmplY3QgbmV3QWN0dWFsV29ya1Byb3RlY3RlZCkgewotCQlPYmplY3Qgb2xkQWN0dWFsV29ya1Byb3RlY3RlZCA9IGFjdHVhbFdvcmtQcm90ZWN0ZWQ7Ci0JCWFjdHVhbFdvcmtQcm90ZWN0ZWQgPSBuZXdBY3R1YWxXb3JrUHJvdGVjdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SS19QUk9URUNURUQsIG9sZEFjdHVhbFdvcmtQcm90ZWN0ZWQsIGFjdHVhbFdvcmtQcm90ZWN0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0IG5ld0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCkgewotCQlPYmplY3Qgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPSBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCwgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGl2ZURpcmVjdG9yeUdVSUQoKSB7Ci0JCXJldHVybiBhY3RpdmVEaXJlY3RvcnlHVUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZURpcmVjdG9yeUdVSUQoU3RyaW5nIG5ld0FjdGl2ZURpcmVjdG9yeUdVSUQpIHsKLQkJU3RyaW5nIG9sZEFjdGl2ZURpcmVjdG9yeUdVSUQgPSBhY3RpdmVEaXJlY3RvcnlHVUlEOwotCQlhY3RpdmVEaXJlY3RvcnlHVUlEID0gbmV3QWN0aXZlRGlyZWN0b3J5R1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUSVZFX0RJUkVDVE9SWV9HVUlELCBvbGRBY3RpdmVEaXJlY3RvcnlHVUlELCBhY3RpdmVEaXJlY3RvcnlHVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGlvbkRhdGUoKSB7Ci0JCXJldHVybiBjcmVhdGlvbkRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRpb25EYXRlKE9iamVjdCBuZXdDcmVhdGlvbkRhdGUpIHsKLQkJT2JqZWN0IG9sZENyZWF0aW9uRGF0ZSA9IGNyZWF0aW9uRGF0ZTsKLQkJY3JlYXRpb25EYXRlID0gbmV3Q3JlYXRpb25EYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DUkVBVElPTl9EQVRFLCBvbGRDcmVhdGlvbkRhdGUsIGNyZWF0aW9uRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEV4dGVuZGVkQXR0cmlidXRlMy5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEJhc2VsaW5lKCkgewotCQlpZiAoYmFzZWxpbmUgPT0gbnVsbCkgewotCQkJYmFzZWxpbmUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmFzZWxpbmUyLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQVNFTElORSk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRPdXRsaW5lQ29kZSgpIHsKLQkJaWYgKG91dGxpbmVDb2RlID09IG51bGwpIHsKLQkJCW91dGxpbmVDb2RlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE91dGxpbmVDb2RlMy5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1VUTElORV9DT0RFKTsKLQkJfQotCQlyZXR1cm4gb3V0bGluZUNvZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEF2YWlsYWJpbGl0eVBlcmlvZHMgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpIHsKLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QXZhaWxhYmlsaXR5UGVyaW9kcyhBdmFpbGFiaWxpdHlQZXJpb2RzIG5ld0F2YWlsYWJpbGl0eVBlcmlvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQXZhaWxhYmlsaXR5UGVyaW9kcyBvbGRBdmFpbGFiaWxpdHlQZXJpb2RzID0gYXZhaWxhYmlsaXR5UGVyaW9kczsKLQkJYXZhaWxhYmlsaXR5UGVyaW9kcyA9IG5ld0F2YWlsYWJpbGl0eVBlcmlvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTLCBvbGRBdmFpbGFiaWxpdHlQZXJpb2RzLCBuZXdBdmFpbGFiaWxpdHlQZXJpb2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdmFpbGFiaWxpdHlQZXJpb2RzKEF2YWlsYWJpbGl0eVBlcmlvZHMgbmV3QXZhaWxhYmlsaXR5UGVyaW9kcykgewotCQlpZiAobmV3QXZhaWxhYmlsaXR5UGVyaW9kcyAhPSBhdmFpbGFiaWxpdHlQZXJpb2RzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhdmFpbGFiaWxpdHlQZXJpb2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWF2YWlsYWJpbGl0eVBlcmlvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QXZhaWxhYmlsaXR5UGVyaW9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBdmFpbGFiaWxpdHlQZXJpb2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQklMSVRZX1BFUklPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QXZhaWxhYmlsaXR5UGVyaW9kcyhuZXdBdmFpbGFiaWxpdHlQZXJpb2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTLCBuZXdBdmFpbGFiaWxpdHlQZXJpb2RzLCBuZXdBdmFpbGFiaWxpdHlQZXJpb2RzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJhdGVzIGdldFJhdGVzKCkgewotCQlyZXR1cm4gcmF0ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmF0ZXMoUmF0ZXMgbmV3UmF0ZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUmF0ZXMgb2xkUmF0ZXMgPSByYXRlczsKLQkJcmF0ZXMgPSBuZXdSYXRlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkFURVMsIG9sZFJhdGVzLCBuZXdSYXRlcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmF0ZXMoUmF0ZXMgbmV3UmF0ZXMpIHsKLQkJaWYgKG5ld1JhdGVzICE9IHJhdGVzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyYXRlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyYXRlcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSYXRlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSYXRlcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJhdGVzKG5ld1JhdGVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTLCBuZXdSYXRlcywgbmV3UmF0ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKSB7Ci0JCWlmICh0aW1lcGhhc2VkRGF0YSA9PSBudWxsKSB7Ci0JCQl0aW1lcGhhc2VkRGF0YSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChUaW1lcGhhc2VkRGF0YVR5cGUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1RJTUVQSEFTRURfREFUQSk7Ci0JCX0KLQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEV4dGVuZGVkQXR0cmlidXRlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JBU0VMSU5FOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEJhc2VsaW5lKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09VVExJTkVfQ09ERToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRPdXRsaW5lQ29kZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0QXZhaWxhYmlsaXR5UGVyaW9kcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRSYXRlcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1RJTUVQSEFTRURfREFUQToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUaW1lcGhhc2VkRGF0YSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lEOgotCQkJCXJldHVybiBnZXRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfTlVMTDoKLQkJCQlyZXR1cm4gaXNJc051bGwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lOSVRJQUxTOgotCQkJCXJldHVybiBnZXRJbml0aWFscygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QSE9ORVRJQ1M6Ci0JCQkJcmV0dXJuIGdldFBob25ldGljcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OVEFDQ09VTlQ6Ci0JCQkJcmV0dXJuIGdldE5UQWNjb3VudCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVRFUklBTF9MQUJFTDoKLQkJCQlyZXR1cm4gZ2V0TWF0ZXJpYWxMYWJlbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT0RFOgotCQkJCXJldHVybiBnZXRDb2RlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0dST1VQOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX0dST1VQOgotCQkJCXJldHVybiBnZXRXb3JrR3JvdXAoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRU1BSUxfQUREUkVTUzoKLQkJCQlyZXR1cm4gZ2V0RW1haWxBZGRyZXNzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOSzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19BRERSRVNTOgotCQkJCXJldHVybiBnZXRIeXBlcmxpbmtBZGRyZXNzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVhfVU5JVFM6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRNYXhVbml0cygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVBS19VTklUUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldFBlYWtVbml0cygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJcmV0dXJuIGlzT3ZlckFsbG9jYXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQkxFX0ZST006Ci0JCQkJcmV0dXJuIGdldEF2YWlsYWJsZUZyb20oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQkxFX1RPOgotCQkJCXJldHVybiBnZXRBdmFpbGFibGVUbygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRklOSVNIOgotCQkJCXJldHVybiBnZXRGaW5pc2goKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FOX0xFVkVMOgotCQkJCXJldHVybiBpc0NhbkxldmVsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ0NSVUVfQVQ6Ci0JCQkJcmV0dXJuIGdldEFjY3J1ZUF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUks6Ci0JCQkJcmV0dXJuIGdldFdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVHVUxBUl9XT1JLOgotCQkJCXJldHVybiBnZXRSZWd1bGFyV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUks6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ1dvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlyZXR1cm4gZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFOREFSRF9SQVRFOgotCQkJCXJldHVybiBnZXRTdGFuZGFyZFJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldFN0YW5kYXJkUmF0ZUZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUOgotCQkJCXJldHVybiBnZXRDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEU6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lUmF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1BFUl9VU0U6Ci0JCQkJcmV0dXJuIGdldENvc3RQZXJVc2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRXb3JrVmFyaWFuY2UoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRDb3N0VmFyaWFuY2UoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NWOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0U1YoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NWOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Q1YoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRBQ1dQKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQUxFTkRBUl9VSUQ6Ci0JCQkJcmV0dXJuIGdldENhbGVuZGFyVUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05PVEVTOgotCQkJCXJldHVybiBnZXROb3RlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1AoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0dFTkVSSUM6Ci0JCQkJcmV0dXJuIGlzSXNHZW5lcmljKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19JTkFDVElWRToKLQkJCQlyZXR1cm4gaXNJc0luYWN0aXZlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFOgotCQkJCXJldHVybiBpc0lzRW50ZXJwcmlzZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQk9PS0lOR19UWVBFOgotCQkJCXJldHVybiBnZXRCb29raW5nVHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUSVZFX0RJUkVDVE9SWV9HVUlEOgotCQkJCXJldHVybiBnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENyZWF0aW9uRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGdldEV4dGVuZGVkQXR0cmlidXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JBU0VMSU5FOgotCQkJCXJldHVybiBnZXRCYXNlbGluZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVVRMSU5FX0NPREU6Ci0JCQkJcmV0dXJuIGdldE91dGxpbmVDb2RlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTOgotCQkJCXJldHVybiBnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTOgotCQkJCXJldHVybiBnZXRSYXRlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIGdldFRpbWVwaGFzZWREYXRhKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lEOgotCQkJCXNldElEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMOgotCQkJCXNldElzTnVsbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lOSVRJQUxTOgotCQkJCXNldEluaXRpYWxzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEhPTkVUSUNTOgotCQkJCXNldFBob25ldGljcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05UQUNDT1VOVDoKLQkJCQlzZXROVEFjY291bnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVRFUklBTF9MQUJFTDoKLQkJCQlzZXRNYXRlcmlhbExhYmVsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09ERToKLQkJCQlzZXRDb2RlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fR1JPVVA6Ci0JCQkJc2V0R3JvdXAoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX0dST1VQOgotCQkJCXNldFdvcmtHcm91cCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FTUFJTF9BRERSRVNTOgotCQkJCXNldEVtYWlsQWRkcmVzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtBZGRyZXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXNldEh5cGVybGlua1N1YkFkZHJlc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVhfVU5JVFM6Ci0JCQkJc2V0TWF4VW5pdHMoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFQUtfVU5JVFM6Ci0JCQkJc2V0UGVha1VuaXRzKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSX0FMTE9DQVRFRDoKLQkJCQlzZXRPdmVyQWxsb2NhdGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQkxFX0ZST006Ci0JCQkJc2V0QXZhaWxhYmxlRnJvbSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9UTzoKLQkJCQlzZXRBdmFpbGFibGVUbygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQVJUOgotCQkJCXNldFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRklOSVNIOgotCQkJCXNldEZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTl9MRVZFTDoKLQkJCQlzZXRDYW5MZXZlbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDQ1JVRV9BVDoKLQkJCQlzZXRBY2NydWVBdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRUdVTEFSX1dPUks6Ci0JCQkJc2V0UmVndWxhcldvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9XT1JLOgotCQkJCXNldE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLOgotCQkJCXNldEFjdHVhbFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfV09SSzoKLQkJCQlzZXRSZW1haW5pbmdXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRXb3JrQ29tcGxldGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURToKLQkJCQlzZXRTdGFuZGFyZFJhdGUoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1Q6Ci0JCQkJc2V0Q29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFOgotCQkJCXNldE92ZXJ0aW1lUmF0ZSgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlzZXRPdmVydGltZVJhdGVGb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRPdmVydGltZUNvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVF9QRVJfVVNFOgotCQkJCXNldENvc3RQZXJVc2UoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZUNvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19WQVJJQU5DRToKLQkJCQlzZXRXb3JrVmFyaWFuY2UoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfVkFSSUFOQ0U6Ci0JCQkJc2V0Q29zdFZhcmlhbmNlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVjoKLQkJCQlzZXRTVigoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ1Y6Ci0JCQkJc2V0Q1YoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDV1A6Ci0JCQkJc2V0QUNXUCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FMRU5EQVJfVUlEOgotCQkJCXNldENhbGVuZGFyVUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05PVEVTOgotCQkJCXNldE5vdGVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUzoKLQkJCQlzZXRCQ1dTKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dQOgotCQkJCXNldEJDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0dFTkVSSUM6Ci0JCQkJc2V0SXNHZW5lcmljKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfSU5BQ1RJVkU6Ci0JCQkJc2V0SXNJbmFjdGl2ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0VOVEVSUFJJU0U6Ci0JCQkJc2V0SXNFbnRlcnByaXNlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQk9PS0lOR19UWVBFOgotCQkJCXNldEJvb2tpbmdUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVElWRV9ESVJFQ1RPUllfR1VJRDoKLQkJCQlzZXRBY3RpdmVEaXJlY3RvcnlHVUlEKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ1JFQVRJT05fREFURToKLQkJCQlzZXRDcmVhdGlvbkRhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JBU0VMSU5FOgotCQkJCWdldEJhc2VsaW5lKCkuY2xlYXIoKTsKLQkJCQlnZXRCYXNlbGluZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVVRMSU5FX0NPREU6Ci0JCQkJZ2V0T3V0bGluZUNvZGUoKS5jbGVhcigpOwotCQkJCWdldE91dGxpbmVDb2RlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTOgotCQkJCXNldEF2YWlsYWJpbGl0eVBlcmlvZHMoKEF2YWlsYWJpbGl0eVBlcmlvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkFURVM6Ci0JCQkJc2V0UmF0ZXMoKFJhdGVzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lEOgotCQkJCXNldElEKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX05VTEw6Ci0JCQkJdW5zZXRJc051bGwoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lOSVRJQUxTOgotCQkJCXNldEluaXRpYWxzKElOSVRJQUxTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BIT05FVElDUzoKLQkJCQlzZXRQaG9uZXRpY3MoUEhPTkVUSUNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05UQUNDT1VOVDoKLQkJCQlzZXROVEFjY291bnQoTlRBQ0NPVU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX01BVEVSSUFMX0xBQkVMOgotCQkJCXNldE1hdGVyaWFsTGFiZWwoTUFURVJJQUxfTEFCRUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09ERToKLQkJCQlzZXRDb2RlKENPREVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fR1JPVVA6Ci0JCQkJc2V0R3JvdXAoR1JPVVBfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19HUk9VUDoKLQkJCQlzZXRXb3JrR3JvdXAoV09SS19HUk9VUF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FTUFJTF9BRERSRVNTOgotCQkJCXNldEVtYWlsQWRkcmVzcyhFTUFJTF9BRERSRVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoSFlQRVJMSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19BRERSRVNTOgotCQkJCXNldEh5cGVybGlua0FkZHJlc3MoSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXNldEh5cGVybGlua1N1YkFkZHJlc3MoSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX01BWF9VTklUUzoKLQkJCQl1bnNldE1heFVuaXRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QRUFLX1VOSVRTOgotCQkJCXVuc2V0UGVha1VuaXRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSX0FMTE9DQVRFRDoKLQkJCQl1bnNldE92ZXJBbGxvY2F0ZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXNldEF2YWlsYWJsZUZyb20oQVZBSUxBQkxFX0ZST01fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQkxFX1RPOgotCQkJCXNldEF2YWlsYWJsZVRvKEFWQUlMQUJMRV9UT19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFSVDoKLQkJCQlzZXRTdGFydChTVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKEZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQU5fTEVWRUw6Ci0JCQkJdW5zZXRDYW5MZXZlbCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNDUlVFX0FUOgotCQkJCXNldEFjY3J1ZUF0KEFDQ1JVRV9BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLOgotCQkJCXNldFdvcmsoV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRUdVTEFSX1dPUks6Ci0JCQkJc2V0UmVndWxhcldvcmsoUkVHVUxBUl9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0T3ZlcnRpbWVXb3JrKE9WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUks6Ci0JCQkJc2V0QWN0dWFsV29yayhBQ1RVQUxfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfV09SSzoKLQkJCQlzZXRSZW1haW5pbmdXb3JrKFJFTUFJTklOR19XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yayhBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRXb3JrQ29tcGxldGUoUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEU6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlKFNUQU5EQVJEX1JBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlRm9ybWF0KFNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1Q6Ci0JCQkJc2V0Q29zdChDT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEU6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlKE9WRVJUSU1FX1JBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KE9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0T3ZlcnRpbWVDb3N0KE9WRVJUSU1FX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVF9QRVJfVVNFOgotCQkJCXNldENvc3RQZXJVc2UoQ09TVF9QRVJfVVNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9DT1NUOgotCQkJCXNldEFjdHVhbENvc3QoQUNUVUFMX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19DT1NUOgotCQkJCXNldFJlbWFpbmluZ0Nvc3QoUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJdW5zZXRXb3JrVmFyaWFuY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfVkFSSUFOQ0U6Ci0JCQkJdW5zZXRDb3N0VmFyaWFuY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NWOgotCQkJCXVuc2V0U1YoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NWOgotCQkJCXVuc2V0Q1YoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDV1A6Ci0JCQkJdW5zZXRBQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0Q2FsZW5kYXJVSUQoQ0FMRU5EQVJfVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05PVEVTOgotCQkJCXNldE5vdGVzKE5PVEVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JDV1M6Ci0JCQkJdW5zZXRCQ1dTKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dQOgotCQkJCXVuc2V0QkNXUCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfR0VORVJJQzoKLQkJCQl1bnNldElzR2VuZXJpYygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfSU5BQ1RJVkU6Ci0JCQkJdW5zZXRJc0luYWN0aXZlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFOgotCQkJCXVuc2V0SXNFbnRlcnByaXNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CT09LSU5HX1RZUEU6Ci0JCQkJc2V0Qm9va2luZ1R5cGUoQk9PS0lOR19UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RJVkVfRElSRUNUT1JZX0dVSUQ6Ci0JCQkJc2V0QWN0aXZlRGlyZWN0b3J5R1VJRChBQ1RJVkVfRElSRUNUT1JZX0dVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ1JFQVRJT05fREFURToKLQkJCQlzZXRDcmVhdGlvbkRhdGUoQ1JFQVRJT05fREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkFTRUxJTkU6Ci0JCQkJZ2V0QmFzZWxpbmUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1VUTElORV9DT0RFOgotCQkJCWdldE91dGxpbmVDb2RlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTOgotCQkJCXNldEF2YWlsYWJpbGl0eVBlcmlvZHMoKEF2YWlsYWJpbGl0eVBlcmlvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUzoKLQkJCQlzZXRSYXRlcygoUmF0ZXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlEICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX05VTEw6Ci0JCQkJcmV0dXJuIGlzU2V0SXNOdWxsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lOSVRJQUxTOgotCQkJCXJldHVybiBJTklUSUFMU19FREVGQVVMVCA9PSBudWxsID8gaW5pdGlhbHMgIT0gbnVsbCA6ICFJTklUSUFMU19FREVGQVVMVC5lcXVhbHMoaW5pdGlhbHMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QSE9ORVRJQ1M6Ci0JCQkJcmV0dXJuIFBIT05FVElDU19FREVGQVVMVCA9PSBudWxsID8gcGhvbmV0aWNzICE9IG51bGwgOiAhUEhPTkVUSUNTX0VERUZBVUxULmVxdWFscyhwaG9uZXRpY3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OVEFDQ09VTlQ6Ci0JCQkJcmV0dXJuIE5UQUNDT1VOVF9FREVGQVVMVCA9PSBudWxsID8gblRBY2NvdW50ICE9IG51bGwgOiAhTlRBQ0NPVU5UX0VERUZBVUxULmVxdWFscyhuVEFjY291bnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVRFUklBTF9MQUJFTDoKLQkJCQlyZXR1cm4gTUFURVJJQUxfTEFCRUxfRURFRkFVTFQgPT0gbnVsbCA/IG1hdGVyaWFsTGFiZWwgIT0gbnVsbCA6ICFNQVRFUklBTF9MQUJFTF9FREVGQVVMVC5lcXVhbHMobWF0ZXJpYWxMYWJlbCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPREU6Ci0JCQkJcmV0dXJuIENPREVfRURFRkFVTFQgPT0gbnVsbCA/IGNvZGUgIT0gbnVsbCA6ICFDT0RFX0VERUZBVUxULmVxdWFscyhjb2RlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fR1JPVVA6Ci0JCQkJcmV0dXJuIEdST1VQX0VERUZBVUxUID09IG51bGwgPyBncm91cCAhPSBudWxsIDogIUdST1VQX0VERUZBVUxULmVxdWFscyhncm91cCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfR1JPVVA6Ci0JCQkJcmV0dXJuIFdPUktfR1JPVVBfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmtHcm91cCAhPSBudWxsIDogIVdPUktfR1JPVVBfRURFRkFVTFQuZXF1YWxzKHdvcmtHcm91cCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VNQUlMX0FERFJFU1M6Ci0JCQkJcmV0dXJuIEVNQUlMX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGVtYWlsQWRkcmVzcyAhPSBudWxsIDogIUVNQUlMX0FERFJFU1NfRURFRkFVTFQuZXF1YWxzKGVtYWlsQWRkcmVzcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOSzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmsgIT0gbnVsbCA6ICFIWVBFUkxJTktfRURFRkFVTFQuZXF1YWxzKGh5cGVybGluayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19BRERSRVNTOgotCQkJCXJldHVybiBIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCA9PSBudWxsID8gaHlwZXJsaW5rQWRkcmVzcyAhPSBudWxsIDogIUhZUEVSTElOS19BRERSRVNTX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmtBZGRyZXNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXJldHVybiBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGlua1N1YkFkZHJlc3MgIT0gbnVsbCA6ICFIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQuZXF1YWxzKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVhfVU5JVFM6Ci0JCQkJcmV0dXJuIGlzU2V0TWF4VW5pdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVBS19VTklUUzoKLQkJCQlyZXR1cm4gaXNTZXRQZWFrVW5pdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJcmV0dXJuIGlzU2V0T3ZlckFsbG9jYXRlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfRlJPTToKLQkJCQlyZXR1cm4gQVZBSUxBQkxFX0ZST01fRURFRkFVTFQgPT0gbnVsbCA/IGF2YWlsYWJsZUZyb20gIT0gbnVsbCA6ICFBVkFJTEFCTEVfRlJPTV9FREVGQVVMVC5lcXVhbHMoYXZhaWxhYmxlRnJvbSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9UTzoKLQkJCQlyZXR1cm4gQVZBSUxBQkxFX1RPX0VERUZBVUxUID09IG51bGwgPyBhdmFpbGFibGVUbyAhPSBudWxsIDogIUFWQUlMQUJMRV9UT19FREVGQVVMVC5lcXVhbHMoYXZhaWxhYmxlVG8pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFSVDoKLQkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRklOSVNIOgotCQkJCXJldHVybiBGSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaCAhPSBudWxsIDogIUZJTklTSF9FREVGQVVMVC5lcXVhbHMoZmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FOX0xFVkVMOgotCQkJCXJldHVybiBpc1NldENhbkxldmVsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDQ1JVRV9BVDoKLQkJCQlyZXR1cm4gQUNDUlVFX0FUX0VERUZBVUxUID09IG51bGwgPyBhY2NydWVBdCAhPSBudWxsIDogIUFDQ1JVRV9BVF9FREVGQVVMVC5lcXVhbHMoYWNjcnVlQXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLOgotCQkJCXJldHVybiBXT1JLX0VERUZBVUxUID09IG51bGwgPyB3b3JrICE9IG51bGwgOiAhV09SS19FREVGQVVMVC5lcXVhbHMod29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFR1VMQVJfV09SSzoKLQkJCQlyZXR1cm4gUkVHVUxBUl9XT1JLX0VERUZBVUxUID09IG51bGwgPyByZWd1bGFyV29yayAhPSBudWxsIDogIVJFR1VMQVJfV09SS19FREVGQVVMVC5lcXVhbHMocmVndWxhcldvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBPVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZVdvcmsgIT0gbnVsbCA6ICFPVkVSVElNRV9XT1JLX0VERUZBVUxULmVxdWFscyhvdmVydGltZVdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SSzoKLQkJCQlyZXR1cm4gQUNUVUFMX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmsgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19FREVGQVVMVC5lcXVhbHMoYWN0dWFsV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nV29yayAhPSBudWxsIDogIVJFTUFJTklOR19XT1JLX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZVdvcmsgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdPdmVydGltZVdvcmsgIT0gbnVsbCA6ICFSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nT3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXJldHVybiBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQgPT0gbnVsbCA/IHBlcmNlbnRXb3JrQ29tcGxldGUgIT0gbnVsbCA6ICFQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQuZXF1YWxzKHBlcmNlbnRXb3JrQ29tcGxldGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFOREFSRF9SQVRFOgotCQkJCXJldHVybiBTVEFOREFSRF9SQVRFX0VERUZBVUxUID09IG51bGwgPyBzdGFuZGFyZFJhdGUgIT0gbnVsbCA6ICFTVEFOREFSRF9SQVRFX0VERUZBVUxULmVxdWFscyhzdGFuZGFyZFJhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFOREFSRF9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gU1RBTkRBUkRfUkFURV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YW5kYXJkUmF0ZUZvcm1hdCAhPSBudWxsIDogIVNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxULmVxdWFscyhzdGFuZGFyZFJhdGVGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUOgotCQkJCXJldHVybiBDT1NUX0VERUZBVUxUID09IG51bGwgPyBjb3N0ICE9IG51bGwgOiAhQ09TVF9FREVGQVVMVC5lcXVhbHMoY29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEU6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX1JBVEVfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lUmF0ZSAhPSBudWxsIDogIU9WRVJUSU1FX1JBVEVfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lUmF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEVfRk9STUFUOgotCQkJCXJldHVybiBPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gb3ZlcnRpbWVSYXRlRm9ybWF0ICE9IG51bGwgOiAhT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lUmF0ZUZvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lQ29zdCAhPSBudWxsIDogIU9WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRToKLQkJCQlyZXR1cm4gQ09TVF9QRVJfVVNFX0VERUZBVUxUID09IG51bGwgPyBjb3N0UGVyVXNlICE9IG51bGwgOiAhQ09TVF9QRVJfVVNFX0VERUZBVUxULmVxdWFscyhjb3N0UGVyVXNlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX0NPU1Q6Ci0JCQkJcmV0dXJuIEFDVFVBTF9DT1NUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxDb3N0ICE9IG51bGwgOiAhQUNUVUFMX0NPU1RfRURFRkFVTFQuZXF1YWxzKGFjdHVhbENvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbE92ZXJ0aW1lQ29zdCAhPSBudWxsIDogIUFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhhY3R1YWxPdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ0Nvc3QgIT0gbnVsbCA6ICFSRU1BSU5JTkdfQ09TVF9FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nT3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ092ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0V29ya1ZhcmlhbmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0Q29zdFZhcmlhbmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NWOgotCQkJCXJldHVybiBpc1NldFNWKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NWOgotCQkJCXJldHVybiBpc1NldENWKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDV1A6Ci0JCQkJcmV0dXJuIGlzU2V0QUNXUCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQUxFTkRBUl9VSUQ6Ci0JCQkJcmV0dXJuIENBTEVOREFSX1VJRF9FREVGQVVMVCA9PSBudWxsID8gY2FsZW5kYXJVSUQgIT0gbnVsbCA6ICFDQUxFTkRBUl9VSURfRURFRkFVTFQuZXF1YWxzKGNhbGVuZGFyVUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTk9URVM6Ci0JCQkJcmV0dXJuIE5PVEVTX0VERUZBVUxUID09IG51bGwgPyBub3RlcyAhPSBudWxsIDogIU5PVEVTX0VERUZBVUxULmVxdWFscyhub3Rlcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JDV1M6Ci0JCQkJcmV0dXJuIGlzU2V0QkNXUygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dQOgotCQkJCXJldHVybiBpc1NldEJDV1AoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfR0VORVJJQzoKLQkJCQlyZXR1cm4gaXNTZXRJc0dlbmVyaWMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfSU5BQ1RJVkU6Ci0JCQkJcmV0dXJuIGlzU2V0SXNJbmFjdGl2ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFOgotCQkJCXJldHVybiBpc1NldElzRW50ZXJwcmlzZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CT09LSU5HX1RZUEU6Ci0JCQkJcmV0dXJuIEJPT0tJTkdfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYm9va2luZ1R5cGUgIT0gbnVsbCA6ICFCT09LSU5HX1RZUEVfRURFRkFVTFQuZXF1YWxzKGJvb2tpbmdUeXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxULmVxdWFscyhhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RJVkVfRElSRUNUT1JZX0dVSUQ6Ci0JCQkJcmV0dXJuIEFDVElWRV9ESVJFQ1RPUllfR1VJRF9FREVGQVVMVCA9PSBudWxsID8gYWN0aXZlRGlyZWN0b3J5R1VJRCAhPSBudWxsIDogIUFDVElWRV9ESVJFQ1RPUllfR1VJRF9FREVGQVVMVC5lcXVhbHMoYWN0aXZlRGlyZWN0b3J5R1VJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIENSRUFUSU9OX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNyZWF0aW9uRGF0ZSAhPSBudWxsIDogIUNSRUFUSU9OX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNyZWF0aW9uRGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGUgIT0gbnVsbCAmJiAhZXh0ZW5kZWRBdHRyaWJ1dGUuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQVNFTElORToKLQkJCQlyZXR1cm4gYmFzZWxpbmUgIT0gbnVsbCAmJiAhYmFzZWxpbmUuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVVRMSU5FX0NPREU6Ci0JCQkJcmV0dXJuIG91dGxpbmVDb2RlICE9IG51bGwgJiYgIW91dGxpbmVDb2RlLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQklMSVRZX1BFUklPRFM6Ci0JCQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZHMgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkFURVM6Ci0JCQkJcmV0dXJuIHJhdGVzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1RJTUVQSEFTRURfREFUQToKLQkJCQlyZXR1cm4gdGltZXBoYXNlZERhdGEgIT0gbnVsbCAmJiAhdGltZXBoYXNlZERhdGEuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNOdWxsOiAiKTsKLQkJaWYgKGlzTnVsbEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNOdWxsKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW5pdGlhbHM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGluaXRpYWxzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwaG9uZXRpY3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBob25ldGljcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgblRBY2NvdW50OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuVEFjY291bnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1hdGVyaWFsTGFiZWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1hdGVyaWFsTGFiZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvZGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvZGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29ya0dyb3VwOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrR3JvdXApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVtYWlsQWRkcmVzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZW1haWxBZGRyZXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoeXBlcmxpbms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGluayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHlwZXJsaW5rQWRkcmVzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaHlwZXJsaW5rQWRkcmVzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHlwZXJsaW5rU3ViQWRkcmVzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaHlwZXJsaW5rU3ViQWRkcmVzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWF4VW5pdHM6ICIpOwotCQlpZiAobWF4VW5pdHNFU2V0KSByZXN1bHQuYXBwZW5kKG1heFVuaXRzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVha1VuaXRzOiAiKTsKLQkJaWYgKHBlYWtVbml0c0VTZXQpIHJlc3VsdC5hcHBlbmQocGVha1VuaXRzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlckFsbG9jYXRlZDogIik7Ci0JCWlmIChvdmVyQWxsb2NhdGVkRVNldCkgcmVzdWx0LmFwcGVuZChvdmVyQWxsb2NhdGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXZhaWxhYmxlRnJvbTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXZhaWxhYmxlRnJvbSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXZhaWxhYmxlVG86ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF2YWlsYWJsZVRvKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYW5MZXZlbDogIik7Ci0JCWlmIChjYW5MZXZlbEVTZXQpIHJlc3VsdC5hcHBlbmQoY2FuTGV2ZWwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY2NydWVBdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWNjcnVlQXQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlZ3VsYXJXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWd1bGFyV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZVdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbFdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ1dvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ1dvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ092ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyY2VudFdvcmtDb21wbGV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGVyY2VudFdvcmtDb21wbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhbmRhcmRSYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFuZGFyZFJhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YW5kYXJkUmF0ZUZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhbmRhcmRSYXRlRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdmVydGltZVJhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG92ZXJ0aW1lUmF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVSYXRlRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZVJhdGVGb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0UGVyVXNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0UGVyVXNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZUNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nT3ZlcnRpbWVDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdPdmVydGltZUNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtWYXJpYW5jZTogIik7Ci0JCWlmICh3b3JrVmFyaWFuY2VFU2V0KSByZXN1bHQuYXBwZW5kKHdvcmtWYXJpYW5jZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvc3RWYXJpYW5jZTogIik7Ci0JCWlmIChjb3N0VmFyaWFuY2VFU2V0KSByZXN1bHQuYXBwZW5kKGNvc3RWYXJpYW5jZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNWOiAiKTsKLQkJaWYgKHNWRVNldCkgcmVzdWx0LmFwcGVuZChzVik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNWOiAiKTsKLQkJaWYgKGNWRVNldCkgcmVzdWx0LmFwcGVuZChjVik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFDV1A6ICIpOwotCQlpZiAoYUNXUEVTZXQpIHJlc3VsdC5hcHBlbmQoYUNXUCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhbGVuZGFyVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYWxlbmRhclVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbm90ZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5vdGVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dTOiAiKTsKLQkJaWYgKGJDV1NFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dQOiAiKTsKLQkJaWYgKGJDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc0dlbmVyaWM6ICIpOwotCQlpZiAoaXNHZW5lcmljRVNldCkgcmVzdWx0LmFwcGVuZChpc0dlbmVyaWMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc0luYWN0aXZlOiAiKTsKLQkJaWYgKGlzSW5hY3RpdmVFU2V0KSByZXN1bHQuYXBwZW5kKGlzSW5hY3RpdmUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc0VudGVycHJpc2U6ICIpOwotCQlpZiAoaXNFbnRlcnByaXNlRVNldCkgcmVzdWx0LmFwcGVuZChpc0VudGVycHJpc2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBib29raW5nVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYm9va2luZ1R5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbFdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3RpdmVEaXJlY3RvcnlHVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3RpdmVEaXJlY3RvcnlHVUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjcmVhdGlvbkRhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNyZWF0aW9uRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Jlc291cmNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmVzb3VyY2VzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmVzb3VyY2VzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTljMDM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Jlc291cmNlc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlc291cmNlc0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2VzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VzSW1wbCNnZXRSZXNvdXJjZSA8ZW0+UmVzb3VyY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSZXNvdXJjZXMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlKCkgPGVtPlJlc291cmNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2UgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmVzb3VyY2UoKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZS5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRVNfX1JFU09VUkNFKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFU19fUkVTT1VSQ0U6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFU19fUkVTT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFU19fUkVTT1VSQ0U6Ci0JCQkJZ2V0UmVzb3VyY2UoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFU19fUkVTT1VSQ0U6Ci0JCQkJZ2V0UmVzb3VyY2UoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFU19fUkVTT1VSQ0U6Ci0JCQkJcmV0dXJuIHJlc291cmNlICE9IG51bGwgJiYgIXJlc291cmNlLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vUmVzb3VyY2VzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGFza0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Rhc2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkNjE5MDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGFza0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3NDAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldElEIDxlbT5JRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRDcmVhdGVEYXRlIDxlbT5DcmVhdGUgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldENvbnRhY3QgPGVtPkNvbnRhY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRXQlMgPGVtPldCUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFdCU0xldmVsIDxlbT5XQlMgTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRPdXRsaW5lTnVtYmVyIDxlbT5PdXRsaW5lIE51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE91dGxpbmVMZXZlbCA8ZW0+T3V0bGluZSBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFByaW9yaXR5IDxlbT5Qcmlvcml0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RHVyYXRpb24gPGVtPkR1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRTdG9wIDxlbT5TdG9wPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UmVzdW1lIDxlbT5SZXN1bWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc1Jlc3VtZVZhbGlkIDxlbT5SZXN1bWUgVmFsaWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0VmZm9ydERyaXZlbiA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzUmVjdXJyaW5nIDxlbT5SZWN1cnJpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNFc3RpbWF0ZWQgPGVtPkVzdGltYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc1N1bW1hcnkgPGVtPlN1bW1hcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0NyaXRpY2FsIDxlbT5Dcml0aWNhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzSXNTdWJwcm9qZWN0IDxlbT5JcyBTdWJwcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNJc1N1YnByb2plY3RSZWFkT25seSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRTdWJwcm9qZWN0TmFtZSA8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNFeHRlcm5hbFRhc2sgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0IDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRFYXJseVN0YXJ0IDxlbT5FYXJseSBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEVhcmx5RmluaXNoIDxlbT5FYXJseSBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRMYXRlU3RhcnQgPGVtPkxhdGUgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRMYXRlRmluaXNoIDxlbT5MYXRlIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFN0YXJ0VmFyaWFuY2UgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RmluaXNoVmFyaWFuY2UgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEZyZWVTbGFjayA8ZW0+RnJlZSBTbGFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFRvdGFsU2xhY2sgPGVtPlRvdGFsIFNsYWNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Rml4ZWRDb3N0IDxlbT5GaXhlZCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UGVyY2VudENvbXBsZXRlIDxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEFjdHVhbFN0YXJ0IDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxGaW5pc2ggPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxEdXJhdGlvbiA8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFJlbWFpbmluZ0R1cmF0aW9uIDxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRSZW1haW5pbmdDb3N0IDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Q29uc3RyYWludFR5cGUgPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRDb25zdHJhaW50RGF0ZSA8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RGVhZGxpbmUgPGVtPkRlYWRsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNMZXZlbEFzc2lnbm1lbnRzIDxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzTGV2ZWxpbmdDYW5TcGxpdCA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0TGV2ZWxpbmdEZWxheSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0IDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRQcmVMZXZlbGVkU3RhcnQgPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UHJlTGV2ZWxlZEZpbmlzaCA8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhciA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNIaWRlQmFyIDxlbT5IaWRlIEJhcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzUm9sbHVwIDxlbT5Sb2xsdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlIDxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RWFybmVkVmFsdWVNZXRob2QgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRQcmVkZWNlc3NvckxpbmsgPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUYXNrIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElEKCkgPGVtPklEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElEKCkgPGVtPklEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgaUQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzTnVsbCgpIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX05VTExfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNOdWxsKCkgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGwgPSBJU19OVUxMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBOdWxsIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGxFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRlRGF0ZSgpIDxlbT5DcmVhdGUgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQ1JFQVRFX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRlRGF0ZSgpIDxlbT5DcmVhdGUgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVEYXRlID0gQ1JFQVRFX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGFjdCgpIDxlbT5Db250YWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250YWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UQUNUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRhY3QoKSA8ZW0+Q29udGFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb250YWN0ID0gQ09OVEFDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXQlMoKSA8ZW0+V0JTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXQlMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdCU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXQlMoKSA8ZW0+V0JTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXQlMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgd0JTID0gV0JTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdCU0xldmVsKCkgPGVtPldCUyBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V0JTTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdCU19MRVZFTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXQlNMZXZlbCgpIDxlbT5XQlMgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdCU0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHdCU0xldmVsID0gV0JTX0xFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVOdW1iZXIoKSA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGxpbmVOdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVExJTkVfTlVNQkVSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVOdW1iZXIoKSA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGxpbmVOdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgb3V0bGluZU51bWJlciA9IE9VVExJTkVfTlVNQkVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVMZXZlbCgpIDxlbT5PdXRsaW5lIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBPVVRMSU5FX0xFVkVMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVMZXZlbCgpIDxlbT5PdXRsaW5lIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG91dGxpbmVMZXZlbCA9IE9VVExJTkVfTEVWRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpb3JpdHkoKSA8ZW0+UHJpb3JpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByaW9yaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUFJJT1JJVFlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpb3JpdHkoKSA8ZW0+UHJpb3JpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByaW9yaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwcmlvcml0eSA9IFBSSU9SSVRZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbigpIDxlbT5EdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IERVUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uKCkgPGVtPkR1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkdXJhdGlvbiA9IERVUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBXT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB3b3JrID0gV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdG9wKCkgPGVtPlN0b3A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0b3AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1BfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RvcCgpIDxlbT5TdG9wPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0b3AgPSBTVE9QX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VtZSgpIDxlbT5SZXN1bWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVTVU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VtZSgpIDxlbT5SZXN1bWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZXN1bWUgPSBSRVNVTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXN1bWVWYWxpZCgpIDxlbT5SZXN1bWUgVmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVzdW1lVmFsaWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVNVTUVfVkFMSURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzdW1lVmFsaWQoKSA8ZW0+UmVzdW1lIFZhbGlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc3VtZVZhbGlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXN1bWVWYWxpZCA9IFJFU1VNRV9WQUxJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVzdW1lIFZhbGlkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXN1bWVWYWxpZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VmZm9ydERyaXZlbigpIDxlbT5FZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VmZm9ydERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVGRk9SVF9EUklWRU5fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRWZmb3J0RHJpdmVuKCkgPGVtPkVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRWZmb3J0RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZmZvcnREcml2ZW4gPSBFRkZPUlRfRFJJVkVOX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFZmZvcnQgRHJpdmVuIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZmZvcnREcml2ZW5FU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWN1cnJpbmcoKSA8ZW0+UmVjdXJyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlY3VycmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFQ1VSUklOR19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWN1cnJpbmcoKSA8ZW0+UmVjdXJyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlY3VycmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVjdXJyaW5nID0gUkVDVVJSSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZWN1cnJpbmcgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlY3VycmluZ0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc092ZXJBbGxvY2F0ZWQoKSA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE9WRVJfQUxMT0NBVEVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc092ZXJBbGxvY2F0ZWQoKSA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3ZlckFsbG9jYXRlZCA9IE9WRVJfQUxMT0NBVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBPdmVyIEFsbG9jYXRlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3ZlckFsbG9jYXRlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VzdGltYXRlZCgpIDxlbT5Fc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXN0aW1hdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVNUSU1BVEVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VzdGltYXRlZCgpIDxlbT5Fc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXN0aW1hdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlc3RpbWF0ZWQgPSBFU1RJTUFURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEVzdGltYXRlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXN0aW1hdGVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWlsZXN0b25lKCkgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNSUxFU1RPTkVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWlsZXN0b25lKCkgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1pbGVzdG9uZSA9IE1JTEVTVE9ORV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTWlsZXN0b25lIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtaWxlc3RvbmVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdW1tYXJ5KCkgPGVtPlN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3VtbWFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNVTU1BUllfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3VtbWFyeSgpIDxlbT5TdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N1bW1hcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN1bW1hcnkgPSBTVU1NQVJZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBTdW1tYXJ5IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdW1tYXJ5RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ3JpdGljYWwoKSA8ZW0+Q3JpdGljYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ3JpdGljYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDUklUSUNBTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDcml0aWNhbCgpIDxlbT5Dcml0aWNhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDcml0aWNhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY3JpdGljYWwgPSBDUklUSUNBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ3JpdGljYWwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNyaXRpY2FsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTdWJwcm9qZWN0KCkgPGVtPklzIFN1YnByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfU1VCUFJPSkVDVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1N1YnByb2plY3QoKSA8ZW0+SXMgU3VicHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N1YnByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3VicHJvamVjdCA9IElTX1NVQlBST0pFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFN1YnByb2plY3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3VicHJvamVjdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkgPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfU1VCUFJPSkVDVF9SRUFEX09OTFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3VicHJvamVjdFJlYWRPbmx5ID0gSVNfU1VCUFJPSkVDVF9SRUFEX09OTFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFN1YnByb2plY3QgUmVhZCBPbmx5IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1YnByb2plY3RSZWFkT25seUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJwcm9qZWN0TmFtZSgpIDxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YnByb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJQUk9KRUNUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VicHJvamVjdE5hbWUoKSA8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJwcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdWJwcm9qZWN0TmFtZSA9IFNVQlBST0pFQ1RfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4dGVybmFsVGFzaygpIDxlbT5FeHRlcm5hbCBUYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4dGVybmFsVGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYVEVSTkFMX1RBU0tfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXh0ZXJuYWxUYXNrKCkgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXh0ZXJuYWxUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHRlcm5hbFRhc2sgPSBFWFRFUk5BTF9UQVNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFeHRlcm5hbCBUYXNrIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHRlcm5hbFRhc2tFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpIDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsVGFza1Byb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX1RBU0tfUFJPSkVDVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0KCkgPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRlcm5hbFRhc2tQcm9qZWN0ID0gRVhURVJOQUxfVEFTS19QUk9KRUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcmx5U3RhcnQoKSA8ZW0+RWFybHkgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcmx5U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEVBUkxZX1NUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcmx5U3RhcnQoKSA8ZW0+RWFybHkgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcmx5U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZWFybHlTdGFydCA9IEVBUkxZX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcmx5RmluaXNoKCkgPGVtPkVhcmx5IEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybHlGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEVBUkxZX0ZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFYXJseUZpbmlzaCgpIDxlbT5FYXJseSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcmx5RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGVhcmx5RmluaXNoID0gRUFSTFlfRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhdGVTdGFydCgpIDxlbT5MYXRlIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXRlU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IExBVEVfU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGF0ZVN0YXJ0KCkgPGVtPkxhdGUgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhdGVTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBsYXRlU3RhcnQgPSBMQVRFX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhdGVGaW5pc2goKSA8ZW0+TGF0ZSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhdGVGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IExBVEVfRklOSVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhdGVGaW5pc2goKSA8ZW0+TGF0ZSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhdGVGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbGF0ZUZpbmlzaCA9IExBVEVfRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0VmFyaWFuY2UoKSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBTVEFSVF9WQVJJQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydFZhcmlhbmNlKCkgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBzdGFydFZhcmlhbmNlID0gU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoVmFyaWFuY2UoKSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hWYXJpYW5jZSgpIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBmaW5pc2hWYXJpYW5jZSA9IEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrVmFyaWFuY2UoKSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1ZhcmlhbmNlKCkgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHdvcmtWYXJpYW5jZSA9IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFdvcmsgVmFyaWFuY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHdvcmtWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcmVlU2xhY2soKSA8ZW0+RnJlZSBTbGFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnJlZVNsYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRlJFRV9TTEFDS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcmVlU2xhY2soKSA8ZW0+RnJlZSBTbGFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnJlZVNsYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBmcmVlU2xhY2sgPSBGUkVFX1NMQUNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvdGFsU2xhY2soKSA8ZW0+VG90YWwgU2xhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvdGFsU2xhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBUT1RBTF9TTEFDS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb3RhbFNsYWNrKCkgPGVtPlRvdGFsIFNsYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb3RhbFNsYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0b3RhbFNsYWNrID0gVE9UQUxfU0xBQ0tfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rml4ZWRDb3N0KCkgPGVtPkZpeGVkIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpeGVkQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBGSVhFRF9DT1NUX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpeGVkQ29zdCgpIDxlbT5GaXhlZCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaXhlZENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBmaXhlZENvc3QgPSBGSVhFRF9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBGaXhlZCBDb3N0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaXhlZENvc3RFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpIDxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaXhlZENvc3RBY2NydWFsKCkgPGVtPkZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaXhlZENvc3RBY2NydWFsID0gRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBlcmNlbnRDb21wbGV0ZSA9IFBFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBlcmNlbnRXb3JrQ29tcGxldGUgPSBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGNvc3QgPSBDT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lQ29zdCgpIDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBPVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lQ29zdCgpIDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIG92ZXJ0aW1lQ29zdCA9IE9WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVXb3JrKCkgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVdvcmsoKSA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IG92ZXJ0aW1lV29yayA9IE9WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsU3RhcnQoKSA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX1NUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFN0YXJ0KCkgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsU3RhcnQgPSBBQ1RVQUxfU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsRmluaXNoKCkgPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX0ZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxGaW5pc2goKSA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbEZpbmlzaCA9IEFDVFVBTF9GSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsRHVyYXRpb24oKSA8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxEdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX0RVUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbER1cmF0aW9uKCkgPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsRHVyYXRpb24gPSBBQ1RVQUxfRFVSQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsQ29zdCgpIDxlbT5BY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIEFDVFVBTF9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbENvc3QoKSA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGFjdHVhbENvc3QgPSBBQ1RVQUxfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBhY3R1YWxPdmVydGltZUNvc3QgPSBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrKCkgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrKCkgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbFdvcmsgPSBBQ1RVQUxfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsT3ZlcnRpbWVXb3JrID0gQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVndWxhcldvcmsoKSA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVHVUxBUl9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZ3VsYXJXb3JrKCkgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVndWxhcldvcmsgPSBSRUdVTEFSX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nRHVyYXRpb24oKSA8ZW0+UmVtYWluaW5nIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdEdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX0RVUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0R1cmF0aW9uKCkgPGVtPlJlbWFpbmluZyBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nRHVyYXRpb24gPSBSRU1BSU5JTkdfRFVSQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nQ29zdCgpIDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0Nvc3QoKSA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHJlbWFpbmluZ0Nvc3QgPSBSRU1BSU5JTkdfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbWFpbmluZ1dvcmsgPSBSRU1BSU5JTkdfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCByZW1haW5pbmdPdmVydGltZUNvc3QgPSBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QUNXUCgpIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEFDV1BfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QUNXUCgpIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYUNXUCA9IEFDV1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFDV1AgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFDV1BFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q1YoKSA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IENWX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENWKCkgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGNWID0gQ1ZfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENWIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjVkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25zdHJhaW50VHlwZSgpIDxlbT5Db25zdHJhaW50IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnN0cmFpbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ09OU1RSQUlOVF9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnN0cmFpbnRUeXBlKCkgPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uc3RyYWludFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGNvbnN0cmFpbnRUeXBlID0gQ09OU1RSQUlOVF9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGVuZGFyVUlEKCkgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDQUxFTkRBUl9VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXJVSUQoKSA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY2FsZW5kYXJVSUQgPSBDQUxFTkRBUl9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uc3RyYWludERhdGUoKSA8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25zdHJhaW50RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQ09OU1RSQUlOVF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnN0cmFpbnREYXRlKCkgPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uc3RyYWludERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29uc3RyYWludERhdGUgPSBDT05TVFJBSU5UX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVhZGxpbmUoKSA8ZW0+RGVhZGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlYWRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBERUFETElORV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWFkbGluZSgpIDxlbT5EZWFkbGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVhZGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZGVhZGxpbmUgPSBERUFETElORV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xldmVsQXNzaWdubWVudHMoKSA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIExFVkVMX0FTU0lHTk1FTlRTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xldmVsQXNzaWdubWVudHMoKSA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGV2ZWxBc3NpZ25tZW50cyA9IExFVkVMX0FTU0lHTk1FTlRTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBMZXZlbCBBc3NpZ25tZW50cyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGV2ZWxBc3NpZ25tZW50c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xldmVsaW5nQ2FuU3BsaXQoKSA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMRVZFTElOR19DQU5fU1BMSVRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpIDxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGV2ZWxpbmdDYW5TcGxpdCA9IExFVkVMSU5HX0NBTl9TUExJVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGV2ZWxpbmcgQ2FuIFNwbGl0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsZXZlbGluZ0NhblNwbGl0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXkoKSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRVZFTElOR19ERUxBWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbGluZ0RlbGF5KCkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5ID0gTEVWRUxJTkdfREVMQVlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxldmVsaW5nRGVsYXlGb3JtYXQgPSBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlTGV2ZWxlZFN0YXJ0KCkgPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVMZXZlbGVkU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFBSRV9MRVZFTEVEX1NUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZUxldmVsZWRTdGFydCgpIDxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlTGV2ZWxlZFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHByZUxldmVsZWRTdGFydCA9IFBSRV9MRVZFTEVEX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZUxldmVsZWRGaW5pc2goKSA8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVMZXZlbGVkRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBQUkVfTEVWRUxFRF9GSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpIDxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZUxldmVsZWRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcHJlTGV2ZWxlZEZpbmlzaCA9IFBSRV9MRVZFTEVEX0ZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rID0gSFlQRVJMSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rQWRkcmVzcyA9IEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzcyA9IEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKSA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVJfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlUmVzb3VyY2VDYWxlbmRhciA9IElHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSWdub3JlIFJlc291cmNlIENhbGVuZGFyIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdGVzKCkgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9URVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90ZXMoKSA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vdGVzID0gTk9URVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIaWRlQmFyKCkgPGVtPkhpZGUgQmFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hpZGVCYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBISURFX0JBUl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIaWRlQmFyKCkgPGVtPkhpZGUgQmFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hpZGVCYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhpZGVCYXIgPSBISURFX0JBUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSGlkZSBCYXIgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhpZGVCYXJFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSb2xsdXAoKSA8ZW0+Um9sbHVwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JvbGx1cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJPTExVUF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSb2xsdXAoKSA8ZW0+Um9sbHVwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JvbGx1cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcm9sbHVwID0gUk9MTFVQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSb2xsdXAgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJvbGx1cEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFBIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKSA8ZW0+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBoeXNpY2FsUGVyY2VudENvbXBsZXRlID0gUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKSA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGVhcm5lZFZhbHVlTWV0aG9kID0gRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlY2Vzc29yTGluaygpIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByZWRlY2Vzc29yTGluayA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxXb3JrUHJvdGVjdGVkID0gQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPSBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBleHRlbmRlZEF0dHJpYnV0ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlbGluZSgpIDxlbT5CYXNlbGluZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGJhc2VsaW5lID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVDb2RlKCkgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG91dGxpbmVDb2RlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2soKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldElEKCkgewotCQlyZXR1cm4gaUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUQoQmlnSW50ZWdlciBuZXdJRCkgewotCQlCaWdJbnRlZ2VyIG9sZElEID0gaUQ7Ci0JCWlEID0gbmV3SUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUQsIG9sZElELCBpRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgbmV3VHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc051bGwoKSB7Ci0JCXJldHVybiBpc051bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNOdWxsKGJvb2xlYW4gbmV3SXNOdWxsKSB7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsID0gaXNOdWxsOwotCQlpc051bGwgPSBuZXdJc051bGw7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsRVNldCA9IGlzTnVsbEVTZXQ7Ci0JCWlzTnVsbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX05VTEwsIG9sZElzTnVsbCwgaXNOdWxsLCAhb2xkSXNOdWxsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNOdWxsKCkgewotCQlib29sZWFuIG9sZElzTnVsbCA9IGlzTnVsbDsKLQkJYm9vbGVhbiBvbGRJc051bGxFU2V0ID0gaXNOdWxsRVNldDsKLQkJaXNOdWxsID0gSVNfTlVMTF9FREVGQVVMVDsKLQkJaXNOdWxsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfTlVMTCwgb2xkSXNOdWxsLCBJU19OVUxMX0VERUZBVUxULCBvbGRJc051bGxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc051bGwoKSB7Ci0JCXJldHVybiBpc051bGxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlRGF0ZSgpIHsKLQkJcmV0dXJuIGNyZWF0ZURhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRlRGF0ZShPYmplY3QgbmV3Q3JlYXRlRGF0ZSkgewotCQlPYmplY3Qgb2xkQ3JlYXRlRGF0ZSA9IGNyZWF0ZURhdGU7Ci0JCWNyZWF0ZURhdGUgPSBuZXdDcmVhdGVEYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSRUFURV9EQVRFLCBvbGRDcmVhdGVEYXRlLCBjcmVhdGVEYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250YWN0KCkgewotCQlyZXR1cm4gY29udGFjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250YWN0KFN0cmluZyBuZXdDb250YWN0KSB7Ci0JCVN0cmluZyBvbGRDb250YWN0ID0gY29udGFjdDsKLQkJY29udGFjdCA9IG5ld0NvbnRhY3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OVEFDVCwgb2xkQ29udGFjdCwgY29udGFjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V0JTKCkgewotCQlyZXR1cm4gd0JTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdCUyhTdHJpbmcgbmV3V0JTKSB7Ci0JCVN0cmluZyBvbGRXQlMgPSB3QlM7Ci0JCXdCUyA9IG5ld1dCUzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlMsIG9sZFdCUywgd0JTKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXQlNMZXZlbCgpIHsKLQkJcmV0dXJuIHdCU0xldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdCU0xldmVsKFN0cmluZyBuZXdXQlNMZXZlbCkgewotCQlTdHJpbmcgb2xkV0JTTGV2ZWwgPSB3QlNMZXZlbDsKLQkJd0JTTGV2ZWwgPSBuZXdXQlNMZXZlbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlNfTEVWRUwsIG9sZFdCU0xldmVsLCB3QlNMZXZlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0bGluZU51bWJlcigpIHsKLQkJcmV0dXJuIG91dGxpbmVOdW1iZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0bGluZU51bWJlcihTdHJpbmcgbmV3T3V0bGluZU51bWJlcikgewotCQlTdHJpbmcgb2xkT3V0bGluZU51bWJlciA9IG91dGxpbmVOdW1iZXI7Ci0JCW91dGxpbmVOdW1iZXIgPSBuZXdPdXRsaW5lTnVtYmVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTlVNQkVSLCBvbGRPdXRsaW5lTnVtYmVyLCBvdXRsaW5lTnVtYmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0T3V0bGluZUxldmVsKCkgewotCQlyZXR1cm4gb3V0bGluZUxldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGxpbmVMZXZlbChCaWdJbnRlZ2VyIG5ld091dGxpbmVMZXZlbCkgewotCQlCaWdJbnRlZ2VyIG9sZE91dGxpbmVMZXZlbCA9IG91dGxpbmVMZXZlbDsKLQkJb3V0bGluZUxldmVsID0gbmV3T3V0bGluZUxldmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTEVWRUwsIG9sZE91dGxpbmVMZXZlbCwgb3V0bGluZUxldmVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UHJpb3JpdHkoKSB7Ci0JCXJldHVybiBwcmlvcml0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmlvcml0eShCaWdJbnRlZ2VyIG5ld1ByaW9yaXR5KSB7Ci0JCUJpZ0ludGVnZXIgb2xkUHJpb3JpdHkgPSBwcmlvcml0eTsKLQkJcHJpb3JpdHkgPSBuZXdQcmlvcml0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUklPUklUWSwgb2xkUHJpb3JpdHksIHByaW9yaXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KE9iamVjdCBuZXdTdGFydCkgewotCQlPYmplY3Qgb2xkU3RhcnQgPSBzdGFydDsKLQkJc3RhcnQgPSBuZXdTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVCwgb2xkU3RhcnQsIHN0YXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGaW5pc2goKSB7Ci0JCXJldHVybiBmaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoKE9iamVjdCBuZXdGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZEZpbmlzaCA9IGZpbmlzaDsKLQkJZmluaXNoID0gbmV3RmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldER1cmF0aW9uKCkgewotCQlyZXR1cm4gZHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHVyYXRpb24oT2JqZWN0IG5ld0R1cmF0aW9uKSB7Ci0JCU9iamVjdCBvbGREdXJhdGlvbiA9IGR1cmF0aW9uOwotCQlkdXJhdGlvbiA9IG5ld0R1cmF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OLCBvbGREdXJhdGlvbiwgZHVyYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpIHsKLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgbmV3RHVyYXRpb25Gb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGREdXJhdGlvbkZvcm1hdCA9IGR1cmF0aW9uRm9ybWF0OwotCQlkdXJhdGlvbkZvcm1hdCA9IG5ld0R1cmF0aW9uRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OX0ZPUk1BVCwgb2xkRHVyYXRpb25Gb3JtYXQsIGR1cmF0aW9uRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRXb3JrKCkgewotCQlyZXR1cm4gd29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrKE9iamVjdCBuZXdXb3JrKSB7Ci0JCU9iamVjdCBvbGRXb3JrID0gd29yazsKLQkJd29yayA9IG5ld1dvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SSywgb2xkV29yaywgd29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RvcCgpIHsKLQkJcmV0dXJuIHN0b3A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RvcChPYmplY3QgbmV3U3RvcCkgewotCQlPYmplY3Qgb2xkU3RvcCA9IHN0b3A7Ci0JCXN0b3AgPSBuZXdTdG9wOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUT1AsIG9sZFN0b3AsIHN0b3ApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlc3VtZSgpIHsKLQkJcmV0dXJuIHJlc3VtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bWUoT2JqZWN0IG5ld1Jlc3VtZSkgewotCQlPYmplY3Qgb2xkUmVzdW1lID0gcmVzdW1lOwotCQlyZXN1bWUgPSBuZXdSZXN1bWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FLCBvbGRSZXN1bWUsIHJlc3VtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVzdW1lVmFsaWQoKSB7Ci0JCXJldHVybiByZXN1bWVWYWxpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bWVWYWxpZChib29sZWFuIG5ld1Jlc3VtZVZhbGlkKSB7Ci0JCWJvb2xlYW4gb2xkUmVzdW1lVmFsaWQgPSByZXN1bWVWYWxpZDsKLQkJcmVzdW1lVmFsaWQgPSBuZXdSZXN1bWVWYWxpZDsKLQkJYm9vbGVhbiBvbGRSZXN1bWVWYWxpZEVTZXQgPSByZXN1bWVWYWxpZEVTZXQ7Ci0JCXJlc3VtZVZhbGlkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElELCBvbGRSZXN1bWVWYWxpZCwgcmVzdW1lVmFsaWQsICFvbGRSZXN1bWVWYWxpZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc3VtZVZhbGlkKCkgewotCQlib29sZWFuIG9sZFJlc3VtZVZhbGlkID0gcmVzdW1lVmFsaWQ7Ci0JCWJvb2xlYW4gb2xkUmVzdW1lVmFsaWRFU2V0ID0gcmVzdW1lVmFsaWRFU2V0OwotCQlyZXN1bWVWYWxpZCA9IFJFU1VNRV9WQUxJRF9FREVGQVVMVDsKLQkJcmVzdW1lVmFsaWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUVfVkFMSUQsIG9sZFJlc3VtZVZhbGlkLCBSRVNVTUVfVkFMSURfRURFRkFVTFQsIG9sZFJlc3VtZVZhbGlkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzdW1lVmFsaWQoKSB7Ci0JCXJldHVybiByZXN1bWVWYWxpZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFZmZvcnREcml2ZW4oKSB7Ci0JCXJldHVybiBlZmZvcnREcml2ZW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWZmb3J0RHJpdmVuKGJvb2xlYW4gbmV3RWZmb3J0RHJpdmVuKSB7Ci0JCWJvb2xlYW4gb2xkRWZmb3J0RHJpdmVuID0gZWZmb3J0RHJpdmVuOwotCQllZmZvcnREcml2ZW4gPSBuZXdFZmZvcnREcml2ZW47Ci0JCWJvb2xlYW4gb2xkRWZmb3J0RHJpdmVuRVNldCA9IGVmZm9ydERyaXZlbkVTZXQ7Ci0JCWVmZm9ydERyaXZlbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VGRk9SVF9EUklWRU4sIG9sZEVmZm9ydERyaXZlbiwgZWZmb3J0RHJpdmVuLCAhb2xkRWZmb3J0RHJpdmVuRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RWZmb3J0RHJpdmVuKCkgewotCQlib29sZWFuIG9sZEVmZm9ydERyaXZlbiA9IGVmZm9ydERyaXZlbjsKLQkJYm9vbGVhbiBvbGRFZmZvcnREcml2ZW5FU2V0ID0gZWZmb3J0RHJpdmVuRVNldDsKLQkJZWZmb3J0RHJpdmVuID0gRUZGT1JUX0RSSVZFTl9FREVGQVVMVDsKLQkJZWZmb3J0RHJpdmVuRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUZGT1JUX0RSSVZFTiwgb2xkRWZmb3J0RHJpdmVuLCBFRkZPUlRfRFJJVkVOX0VERUZBVUxULCBvbGRFZmZvcnREcml2ZW5FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFZmZvcnREcml2ZW4oKSB7Ci0JCXJldHVybiBlZmZvcnREcml2ZW5FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVjdXJyaW5nKCkgewotCQlyZXR1cm4gcmVjdXJyaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlY3VycmluZyhib29sZWFuIG5ld1JlY3VycmluZykgewotCQlib29sZWFuIG9sZFJlY3VycmluZyA9IHJlY3VycmluZzsKLQkJcmVjdXJyaW5nID0gbmV3UmVjdXJyaW5nOwotCQlib29sZWFuIG9sZFJlY3VycmluZ0VTZXQgPSByZWN1cnJpbmdFU2V0OwotCQlyZWN1cnJpbmdFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUNVUlJJTkcsIG9sZFJlY3VycmluZywgcmVjdXJyaW5nLCAhb2xkUmVjdXJyaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVjdXJyaW5nKCkgewotCQlib29sZWFuIG9sZFJlY3VycmluZyA9IHJlY3VycmluZzsKLQkJYm9vbGVhbiBvbGRSZWN1cnJpbmdFU2V0ID0gcmVjdXJyaW5nRVNldDsKLQkJcmVjdXJyaW5nID0gUkVDVVJSSU5HX0VERUZBVUxUOwotCQlyZWN1cnJpbmdFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUNVUlJJTkcsIG9sZFJlY3VycmluZywgUkVDVVJSSU5HX0VERUZBVUxULCBvbGRSZWN1cnJpbmdFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZWN1cnJpbmcoKSB7Ci0JCXJldHVybiByZWN1cnJpbmdFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3ZlckFsbG9jYXRlZCgpIHsKLQkJcmV0dXJuIG92ZXJBbGxvY2F0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlckFsbG9jYXRlZChib29sZWFuIG5ld092ZXJBbGxvY2F0ZWQpIHsKLQkJYm9vbGVhbiBvbGRPdmVyQWxsb2NhdGVkID0gb3ZlckFsbG9jYXRlZDsKLQkJb3ZlckFsbG9jYXRlZCA9IG5ld092ZXJBbGxvY2F0ZWQ7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZEVTZXQgPSBvdmVyQWxsb2NhdGVkRVNldDsKLQkJb3ZlckFsbG9jYXRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJfQUxMT0NBVEVELCBvbGRPdmVyQWxsb2NhdGVkLCBvdmVyQWxsb2NhdGVkLCAhb2xkT3ZlckFsbG9jYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE92ZXJBbGxvY2F0ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZCA9IG92ZXJBbGxvY2F0ZWQ7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZEVTZXQgPSBvdmVyQWxsb2NhdGVkRVNldDsKLQkJb3ZlckFsbG9jYXRlZCA9IE9WRVJfQUxMT0NBVEVEX0VERUZBVUxUOwotCQlvdmVyQWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQsIG9sZE92ZXJBbGxvY2F0ZWQsIE9WRVJfQUxMT0NBVEVEX0VERUZBVUxULCBvbGRPdmVyQWxsb2NhdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0T3ZlckFsbG9jYXRlZCgpIHsKLQkJcmV0dXJuIG92ZXJBbGxvY2F0ZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXN0aW1hdGVkKCkgewotCQlyZXR1cm4gZXN0aW1hdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVzdGltYXRlZChib29sZWFuIG5ld0VzdGltYXRlZCkgewotCQlib29sZWFuIG9sZEVzdGltYXRlZCA9IGVzdGltYXRlZDsKLQkJZXN0aW1hdGVkID0gbmV3RXN0aW1hdGVkOwotCQlib29sZWFuIG9sZEVzdGltYXRlZEVTZXQgPSBlc3RpbWF0ZWRFU2V0OwotCQllc3RpbWF0ZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQsIG9sZEVzdGltYXRlZCwgZXN0aW1hdGVkLCAhb2xkRXN0aW1hdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RXN0aW1hdGVkKCkgewotCQlib29sZWFuIG9sZEVzdGltYXRlZCA9IGVzdGltYXRlZDsKLQkJYm9vbGVhbiBvbGRFc3RpbWF0ZWRFU2V0ID0gZXN0aW1hdGVkRVNldDsKLQkJZXN0aW1hdGVkID0gRVNUSU1BVEVEX0VERUZBVUxUOwotCQllc3RpbWF0ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQsIG9sZEVzdGltYXRlZCwgRVNUSU1BVEVEX0VERUZBVUxULCBvbGRFc3RpbWF0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFc3RpbWF0ZWQoKSB7Ci0JCXJldHVybiBlc3RpbWF0ZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWlsZXN0b25lKCkgewotCQlyZXR1cm4gbWlsZXN0b25lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbGVzdG9uZShib29sZWFuIG5ld01pbGVzdG9uZSkgewotCQlib29sZWFuIG9sZE1pbGVzdG9uZSA9IG1pbGVzdG9uZTsKLQkJbWlsZXN0b25lID0gbmV3TWlsZXN0b25lOwotCQlib29sZWFuIG9sZE1pbGVzdG9uZUVTZXQgPSBtaWxlc3RvbmVFU2V0OwotCQltaWxlc3RvbmVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19NSUxFU1RPTkUsIG9sZE1pbGVzdG9uZSwgbWlsZXN0b25lLCAhb2xkTWlsZXN0b25lRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWlsZXN0b25lKCkgewotCQlib29sZWFuIG9sZE1pbGVzdG9uZSA9IG1pbGVzdG9uZTsKLQkJYm9vbGVhbiBvbGRNaWxlc3RvbmVFU2V0ID0gbWlsZXN0b25lRVNldDsKLQkJbWlsZXN0b25lID0gTUlMRVNUT05FX0VERUZBVUxUOwotCQltaWxlc3RvbmVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19NSUxFU1RPTkUsIG9sZE1pbGVzdG9uZSwgTUlMRVNUT05FX0VERUZBVUxULCBvbGRNaWxlc3RvbmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNaWxlc3RvbmUoKSB7Ci0JCXJldHVybiBtaWxlc3RvbmVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VtbWFyeSgpIHsKLQkJcmV0dXJuIHN1bW1hcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VtbWFyeShib29sZWFuIG5ld1N1bW1hcnkpIHsKLQkJYm9vbGVhbiBvbGRTdW1tYXJ5ID0gc3VtbWFyeTsKLQkJc3VtbWFyeSA9IG5ld1N1bW1hcnk7Ci0JCWJvb2xlYW4gb2xkU3VtbWFyeUVTZXQgPSBzdW1tYXJ5RVNldDsKLQkJc3VtbWFyeUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVTU1BUlksIG9sZFN1bW1hcnksIHN1bW1hcnksICFvbGRTdW1tYXJ5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U3VtbWFyeSgpIHsKLQkJYm9vbGVhbiBvbGRTdW1tYXJ5ID0gc3VtbWFyeTsKLQkJYm9vbGVhbiBvbGRTdW1tYXJ5RVNldCA9IHN1bW1hcnlFU2V0OwotCQlzdW1tYXJ5ID0gU1VNTUFSWV9FREVGQVVMVDsKLQkJc3VtbWFyeUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVTU1BUlksIG9sZFN1bW1hcnksIFNVTU1BUllfRURFRkFVTFQsIG9sZFN1bW1hcnlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTdW1tYXJ5KCkgewotCQlyZXR1cm4gc3VtbWFyeUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDcml0aWNhbCgpIHsKLQkJcmV0dXJuIGNyaXRpY2FsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyaXRpY2FsKGJvb2xlYW4gbmV3Q3JpdGljYWwpIHsKLQkJYm9vbGVhbiBvbGRDcml0aWNhbCA9IGNyaXRpY2FsOwotCQljcml0aWNhbCA9IG5ld0NyaXRpY2FsOwotCQlib29sZWFuIG9sZENyaXRpY2FsRVNldCA9IGNyaXRpY2FsRVNldDsKLQkJY3JpdGljYWxFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUklUSUNBTCwgb2xkQ3JpdGljYWwsIGNyaXRpY2FsLCAhb2xkQ3JpdGljYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDcml0aWNhbCgpIHsKLQkJYm9vbGVhbiBvbGRDcml0aWNhbCA9IGNyaXRpY2FsOwotCQlib29sZWFuIG9sZENyaXRpY2FsRVNldCA9IGNyaXRpY2FsRVNldDsKLQkJY3JpdGljYWwgPSBDUklUSUNBTF9FREVGQVVMVDsKLQkJY3JpdGljYWxFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUklUSUNBTCwgb2xkQ3JpdGljYWwsIENSSVRJQ0FMX0VERUZBVUxULCBvbGRDcml0aWNhbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENyaXRpY2FsKCkgewotCQlyZXR1cm4gY3JpdGljYWxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNTdWJwcm9qZWN0KCkgewotCQlyZXR1cm4gaXNTdWJwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzU3VicHJvamVjdChib29sZWFuIG5ld0lzU3VicHJvamVjdCkgewotCQlib29sZWFuIG9sZElzU3VicHJvamVjdCA9IGlzU3VicHJvamVjdDsKLQkJaXNTdWJwcm9qZWN0ID0gbmV3SXNTdWJwcm9qZWN0OwotCQlib29sZWFuIG9sZElzU3VicHJvamVjdEVTZXQgPSBpc1N1YnByb2plY3RFU2V0OwotCQlpc1N1YnByb2plY3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNULCBvbGRJc1N1YnByb2plY3QsIGlzU3VicHJvamVjdCwgIW9sZElzU3VicHJvamVjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzU3VicHJvamVjdCgpIHsKLQkJYm9vbGVhbiBvbGRJc1N1YnByb2plY3QgPSBpc1N1YnByb2plY3Q7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0RVNldCA9IGlzU3VicHJvamVjdEVTZXQ7Ci0JCWlzU3VicHJvamVjdCA9IElTX1NVQlBST0pFQ1RfRURFRkFVTFQ7Ci0JCWlzU3VicHJvamVjdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1QsIG9sZElzU3VicHJvamVjdCwgSVNfU1VCUFJPSkVDVF9FREVGQVVMVCwgb2xkSXNTdWJwcm9qZWN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNTdWJwcm9qZWN0KCkgewotCQlyZXR1cm4gaXNTdWJwcm9qZWN0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkgewotCQlyZXR1cm4gaXNTdWJwcm9qZWN0UmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoYm9vbGVhbiBuZXdJc1N1YnByb2plY3RSZWFkT25seSkgewotCQlib29sZWFuIG9sZElzU3VicHJvamVjdFJlYWRPbmx5ID0gaXNTdWJwcm9qZWN0UmVhZE9ubHk7Ci0JCWlzU3VicHJvamVjdFJlYWRPbmx5ID0gbmV3SXNTdWJwcm9qZWN0UmVhZE9ubHk7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0ID0gaXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0OwotCQlpc1N1YnByb2plY3RSZWFkT25seUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZLCBvbGRJc1N1YnByb2plY3RSZWFkT25seSwgaXNTdWJwcm9qZWN0UmVhZE9ubHksICFvbGRJc1N1YnByb2plY3RSZWFkT25seUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzU3VicHJvamVjdFJlYWRPbmx5KCkgewotCQlib29sZWFuIG9sZElzU3VicHJvamVjdFJlYWRPbmx5ID0gaXNTdWJwcm9qZWN0UmVhZE9ubHk7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0ID0gaXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0OwotCQlpc1N1YnByb2plY3RSZWFkT25seSA9IElTX1NVQlBST0pFQ1RfUkVBRF9PTkxZX0VERUZBVUxUOwotCQlpc1N1YnByb2plY3RSZWFkT25seUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZLCBvbGRJc1N1YnByb2plY3RSZWFkT25seSwgSVNfU1VCUFJPSkVDVF9SRUFEX09OTFlfRURFRkFVTFQsIG9sZElzU3VicHJvamVjdFJlYWRPbmx5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKSB7Ci0JCXJldHVybiBpc1N1YnByb2plY3RSZWFkT25seUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdWJwcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIHN1YnByb2plY3ROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1YnByb2plY3ROYW1lKFN0cmluZyBuZXdTdWJwcm9qZWN0TmFtZSkgewotCQlTdHJpbmcgb2xkU3VicHJvamVjdE5hbWUgPSBzdWJwcm9qZWN0TmFtZTsKLQkJc3VicHJvamVjdE5hbWUgPSBuZXdTdWJwcm9qZWN0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVUJQUk9KRUNUX05BTUUsIG9sZFN1YnByb2plY3ROYW1lLCBzdWJwcm9qZWN0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWxUYXNrKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxUYXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsVGFzayhib29sZWFuIG5ld0V4dGVybmFsVGFzaykgewotCQlib29sZWFuIG9sZEV4dGVybmFsVGFzayA9IGV4dGVybmFsVGFzazsKLQkJZXh0ZXJuYWxUYXNrID0gbmV3RXh0ZXJuYWxUYXNrOwotCQlib29sZWFuIG9sZEV4dGVybmFsVGFza0VTZXQgPSBleHRlcm5hbFRhc2tFU2V0OwotCQlleHRlcm5hbFRhc2tFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLLCBvbGRFeHRlcm5hbFRhc2ssIGV4dGVybmFsVGFzaywgIW9sZEV4dGVybmFsVGFza0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEV4dGVybmFsVGFzaygpIHsKLQkJYm9vbGVhbiBvbGRFeHRlcm5hbFRhc2sgPSBleHRlcm5hbFRhc2s7Ci0JCWJvb2xlYW4gb2xkRXh0ZXJuYWxUYXNrRVNldCA9IGV4dGVybmFsVGFza0VTZXQ7Ci0JCWV4dGVybmFsVGFzayA9IEVYVEVSTkFMX1RBU0tfRURFRkFVTFQ7Ci0JCWV4dGVybmFsVGFza0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0ssIG9sZEV4dGVybmFsVGFzaywgRVhURVJOQUxfVEFTS19FREVGQVVMVCwgb2xkRXh0ZXJuYWxUYXNrRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RXh0ZXJuYWxUYXNrKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxUYXNrRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsVGFza1Byb2plY3QoKSB7Ci0JCXJldHVybiBleHRlcm5hbFRhc2tQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsVGFza1Byb2plY3QoU3RyaW5nIG5ld0V4dGVybmFsVGFza1Byb2plY3QpIHsKLQkJU3RyaW5nIG9sZEV4dGVybmFsVGFza1Byb2plY3QgPSBleHRlcm5hbFRhc2tQcm9qZWN0OwotCQlleHRlcm5hbFRhc2tQcm9qZWN0ID0gbmV3RXh0ZXJuYWxUYXNrUHJvamVjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLX1BST0pFQ1QsIG9sZEV4dGVybmFsVGFza1Byb2plY3QsIGV4dGVybmFsVGFza1Byb2plY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVhcmx5U3RhcnQoKSB7Ci0JCXJldHVybiBlYXJseVN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVhcmx5U3RhcnQoT2JqZWN0IG5ld0Vhcmx5U3RhcnQpIHsKLQkJT2JqZWN0IG9sZEVhcmx5U3RhcnQgPSBlYXJseVN0YXJ0OwotCQllYXJseVN0YXJ0ID0gbmV3RWFybHlTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9TVEFSVCwgb2xkRWFybHlTdGFydCwgZWFybHlTdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWFybHlGaW5pc2goKSB7Ci0JCXJldHVybiBlYXJseUZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFYXJseUZpbmlzaChPYmplY3QgbmV3RWFybHlGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZEVhcmx5RmluaXNoID0gZWFybHlGaW5pc2g7Ci0JCWVhcmx5RmluaXNoID0gbmV3RWFybHlGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfRklOSVNILCBvbGRFYXJseUZpbmlzaCwgZWFybHlGaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhdGVTdGFydCgpIHsKLQkJcmV0dXJuIGxhdGVTdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXRlU3RhcnQoT2JqZWN0IG5ld0xhdGVTdGFydCkgewotCQlPYmplY3Qgb2xkTGF0ZVN0YXJ0ID0gbGF0ZVN0YXJ0OwotCQlsYXRlU3RhcnQgPSBuZXdMYXRlU3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9TVEFSVCwgb2xkTGF0ZVN0YXJ0LCBsYXRlU3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhdGVGaW5pc2goKSB7Ci0JCXJldHVybiBsYXRlRmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhdGVGaW5pc2goT2JqZWN0IG5ld0xhdGVGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZExhdGVGaW5pc2ggPSBsYXRlRmluaXNoOwotCQlsYXRlRmluaXNoID0gbmV3TGF0ZUZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX0ZJTklTSCwgb2xkTGF0ZUZpbmlzaCwgbGF0ZUZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFN0YXJ0VmFyaWFuY2UoKSB7Ci0JCXJldHVybiBzdGFydFZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0VmFyaWFuY2UoQmlnSW50ZWdlciBuZXdTdGFydFZhcmlhbmNlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkU3RhcnRWYXJpYW5jZSA9IHN0YXJ0VmFyaWFuY2U7Ci0JCXN0YXJ0VmFyaWFuY2UgPSBuZXdTdGFydFZhcmlhbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUX1ZBUklBTkNFLCBvbGRTdGFydFZhcmlhbmNlLCBzdGFydFZhcmlhbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RmluaXNoVmFyaWFuY2UoKSB7Ci0JCXJldHVybiBmaW5pc2hWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2hWYXJpYW5jZShCaWdJbnRlZ2VyIG5ld0ZpbmlzaFZhcmlhbmNlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRmluaXNoVmFyaWFuY2UgPSBmaW5pc2hWYXJpYW5jZTsKLQkJZmluaXNoVmFyaWFuY2UgPSBuZXdGaW5pc2hWYXJpYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0hfVkFSSUFOQ0UsIG9sZEZpbmlzaFZhcmlhbmNlLCBmaW5pc2hWYXJpYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCXJldHVybiB3b3JrVmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya1ZhcmlhbmNlKGZsb2F0IG5ld1dvcmtWYXJpYW5jZSkgewotCQlmbG9hdCBvbGRXb3JrVmFyaWFuY2UgPSB3b3JrVmFyaWFuY2U7Ci0JCXdvcmtWYXJpYW5jZSA9IG5ld1dvcmtWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRXb3JrVmFyaWFuY2VFU2V0ID0gd29ya1ZhcmlhbmNlRVNldDsKLQkJd29ya1ZhcmlhbmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRSwgb2xkV29ya1ZhcmlhbmNlLCB3b3JrVmFyaWFuY2UsICFvbGRXb3JrVmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCWZsb2F0IG9sZFdvcmtWYXJpYW5jZSA9IHdvcmtWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRXb3JrVmFyaWFuY2VFU2V0ID0gd29ya1ZhcmlhbmNlRVNldDsKLQkJd29ya1ZhcmlhbmNlID0gV09SS19WQVJJQU5DRV9FREVGQVVMVDsKLQkJd29ya1ZhcmlhbmNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRSwgb2xkV29ya1ZhcmlhbmNlLCBXT1JLX1ZBUklBTkNFX0VERUZBVUxULCBvbGRXb3JrVmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCXJldHVybiB3b3JrVmFyaWFuY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEZyZWVTbGFjaygpIHsKLQkJcmV0dXJuIGZyZWVTbGFjazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcmVlU2xhY2soQmlnSW50ZWdlciBuZXdGcmVlU2xhY2spIHsKLQkJQmlnSW50ZWdlciBvbGRGcmVlU2xhY2sgPSBmcmVlU2xhY2s7Ci0JCWZyZWVTbGFjayA9IG5ld0ZyZWVTbGFjazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GUkVFX1NMQUNLLCBvbGRGcmVlU2xhY2ssIGZyZWVTbGFjaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFRvdGFsU2xhY2soKSB7Ci0JCXJldHVybiB0b3RhbFNsYWNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvdGFsU2xhY2soQmlnSW50ZWdlciBuZXdUb3RhbFNsYWNrKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVG90YWxTbGFjayA9IHRvdGFsU2xhY2s7Ci0JCXRvdGFsU2xhY2sgPSBuZXdUb3RhbFNsYWNrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RPVEFMX1NMQUNLLCBvbGRUb3RhbFNsYWNrLCB0b3RhbFNsYWNrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEZpeGVkQ29zdCgpIHsKLQkJcmV0dXJuIGZpeGVkQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaXhlZENvc3QoZmxvYXQgbmV3Rml4ZWRDb3N0KSB7Ci0JCWZsb2F0IG9sZEZpeGVkQ29zdCA9IGZpeGVkQ29zdDsKLQkJZml4ZWRDb3N0ID0gbmV3Rml4ZWRDb3N0OwotCQlib29sZWFuIG9sZEZpeGVkQ29zdEVTZXQgPSBmaXhlZENvc3RFU2V0OwotCQlmaXhlZENvc3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NULCBvbGRGaXhlZENvc3QsIGZpeGVkQ29zdCwgIW9sZEZpeGVkQ29zdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEZpeGVkQ29zdCgpIHsKLQkJZmxvYXQgb2xkRml4ZWRDb3N0ID0gZml4ZWRDb3N0OwotCQlib29sZWFuIG9sZEZpeGVkQ29zdEVTZXQgPSBmaXhlZENvc3RFU2V0OwotCQlmaXhlZENvc3QgPSBGSVhFRF9DT1NUX0VERUZBVUxUOwotCQlmaXhlZENvc3RFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NULCBvbGRGaXhlZENvc3QsIEZJWEVEX0NPU1RfRURFRkFVTFQsIG9sZEZpeGVkQ29zdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEZpeGVkQ29zdCgpIHsKLQkJcmV0dXJuIGZpeGVkQ29zdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaXhlZENvc3RBY2NydWFsKCkgewotCQlyZXR1cm4gZml4ZWRDb3N0QWNjcnVhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaXhlZENvc3RBY2NydWFsKFN0cmluZyBuZXdGaXhlZENvc3RBY2NydWFsKSB7Ci0JCVN0cmluZyBvbGRGaXhlZENvc3RBY2NydWFsID0gZml4ZWRDb3N0QWNjcnVhbDsKLQkJZml4ZWRDb3N0QWNjcnVhbCA9IG5ld0ZpeGVkQ29zdEFjY3J1YWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVF9BQ0NSVUFMLCBvbGRGaXhlZENvc3RBY2NydWFsLCBmaXhlZENvc3RBY2NydWFsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UGVyY2VudENvbXBsZXRlKCkgewotCQlyZXR1cm4gcGVyY2VudENvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcmNlbnRDb21wbGV0ZShCaWdJbnRlZ2VyIG5ld1BlcmNlbnRDb21wbGV0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZFBlcmNlbnRDb21wbGV0ZSA9IHBlcmNlbnRDb21wbGV0ZTsKLQkJcGVyY2VudENvbXBsZXRlID0gbmV3UGVyY2VudENvbXBsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfQ09NUExFVEUsIG9sZFBlcmNlbnRDb21wbGV0ZSwgcGVyY2VudENvbXBsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHBlcmNlbnRXb3JrQ29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyY2VudFdvcmtDb21wbGV0ZShCaWdJbnRlZ2VyIG5ld1BlcmNlbnRXb3JrQ29tcGxldGUpIHsKLQkJQmlnSW50ZWdlciBvbGRQZXJjZW50V29ya0NvbXBsZXRlID0gcGVyY2VudFdvcmtDb21wbGV0ZTsKLQkJcGVyY2VudFdvcmtDb21wbGV0ZSA9IG5ld1BlcmNlbnRXb3JrQ29tcGxldGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFLCBvbGRQZXJjZW50V29ya0NvbXBsZXRlLCBwZXJjZW50V29ya0NvbXBsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdChCaWdEZWNpbWFsIG5ld0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRDb3N0ID0gY29zdDsKLQkJY29zdCA9IG5ld0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09TVCwgb2xkQ29zdCwgY29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldE92ZXJ0aW1lQ29zdCgpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCBuZXdPdmVydGltZUNvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRPdmVydGltZUNvc3QgPSBvdmVydGltZUNvc3Q7Ci0JCW92ZXJ0aW1lQ29zdCA9IG5ld092ZXJ0aW1lQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9DT1NULCBvbGRPdmVydGltZUNvc3QsIG92ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gb3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lV29yayhPYmplY3QgbmV3T3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRPdmVydGltZVdvcmsgPSBvdmVydGltZVdvcms7Ci0JCW92ZXJ0aW1lV29yayA9IG5ld092ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLLCBvbGRPdmVydGltZVdvcmssIG92ZXJ0aW1lV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsU3RhcnQoKSB7Ci0JCXJldHVybiBhY3R1YWxTdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxTdGFydChPYmplY3QgbmV3QWN0dWFsU3RhcnQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbFN0YXJ0ID0gYWN0dWFsU3RhcnQ7Ci0JCWFjdHVhbFN0YXJ0ID0gbmV3QWN0dWFsU3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1NUQVJULCBvbGRBY3R1YWxTdGFydCwgYWN0dWFsU3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbEZpbmlzaCgpIHsKLQkJcmV0dXJuIGFjdHVhbEZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxGaW5pc2goT2JqZWN0IG5ld0FjdHVhbEZpbmlzaCkgewotCQlPYmplY3Qgb2xkQWN0dWFsRmluaXNoID0gYWN0dWFsRmluaXNoOwotCQlhY3R1YWxGaW5pc2ggPSBuZXdBY3R1YWxGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0ZJTklTSCwgb2xkQWN0dWFsRmluaXNoLCBhY3R1YWxGaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbER1cmF0aW9uKCkgewotCQlyZXR1cm4gYWN0dWFsRHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsRHVyYXRpb24oT2JqZWN0IG5ld0FjdHVhbER1cmF0aW9uKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxEdXJhdGlvbiA9IGFjdHVhbER1cmF0aW9uOwotCQlhY3R1YWxEdXJhdGlvbiA9IG5ld0FjdHVhbER1cmF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9EVVJBVElPTiwgb2xkQWN0dWFsRHVyYXRpb24sIGFjdHVhbER1cmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0QWN0dWFsQ29zdCgpIHsKLQkJcmV0dXJuIGFjdHVhbENvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsQ29zdChCaWdEZWNpbWFsIG5ld0FjdHVhbENvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRBY3R1YWxDb3N0ID0gYWN0dWFsQ29zdDsKLQkJYWN0dWFsQ29zdCA9IG5ld0FjdHVhbENvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0NPU1QsIG9sZEFjdHVhbENvc3QsIGFjdHVhbENvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRBY3R1YWxPdmVydGltZUNvc3QoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZUNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgbmV3QWN0dWFsT3ZlcnRpbWVDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQWN0dWFsT3ZlcnRpbWVDb3N0ID0gYWN0dWFsT3ZlcnRpbWVDb3N0OwotCQlhY3R1YWxPdmVydGltZUNvc3QgPSBuZXdBY3R1YWxPdmVydGltZUNvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1QsIG9sZEFjdHVhbE92ZXJ0aW1lQ29zdCwgYWN0dWFsT3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxXb3JrKCkgewotCQlyZXR1cm4gYWN0dWFsV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCBuZXdBY3R1YWxXb3JrKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxXb3JrID0gYWN0dWFsV29yazsKLQkJYWN0dWFsV29yayA9IG5ld0FjdHVhbFdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUkssIG9sZEFjdHVhbFdvcmssIGFjdHVhbFdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0IG5ld0FjdHVhbE92ZXJ0aW1lV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrID0gYWN0dWFsT3ZlcnRpbWVXb3JrOwotCQlhY3R1YWxPdmVydGltZVdvcmsgPSBuZXdBY3R1YWxPdmVydGltZVdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUkssIG9sZEFjdHVhbE92ZXJ0aW1lV29yaywgYWN0dWFsT3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWd1bGFyV29yaygpIHsKLQkJcmV0dXJuIHJlZ3VsYXJXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ3VsYXJXb3JrKE9iamVjdCBuZXdSZWd1bGFyV29yaykgewotCQlPYmplY3Qgb2xkUmVndWxhcldvcmsgPSByZWd1bGFyV29yazsKLQkJcmVndWxhcldvcmsgPSBuZXdSZWd1bGFyV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUdVTEFSX1dPUkssIG9sZFJlZ3VsYXJXb3JrLCByZWd1bGFyV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nRHVyYXRpb24oKSB7Ci0JCXJldHVybiByZW1haW5pbmdEdXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdEdXJhdGlvbihPYmplY3QgbmV3UmVtYWluaW5nRHVyYXRpb24pIHsKLQkJT2JqZWN0IG9sZFJlbWFpbmluZ0R1cmF0aW9uID0gcmVtYWluaW5nRHVyYXRpb247Ci0JCXJlbWFpbmluZ0R1cmF0aW9uID0gbmV3UmVtYWluaW5nRHVyYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0RVUkFUSU9OLCBvbGRSZW1haW5pbmdEdXJhdGlvbiwgcmVtYWluaW5nRHVyYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwgbmV3UmVtYWluaW5nQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ0Nvc3QgPSByZW1haW5pbmdDb3N0OwotCQlyZW1haW5pbmdDb3N0ID0gbmV3UmVtYWluaW5nQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfQ09TVCwgb2xkUmVtYWluaW5nQ29zdCwgcmVtYWluaW5nQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ1dvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgbmV3UmVtYWluaW5nV29yaykgewotCQlPYmplY3Qgb2xkUmVtYWluaW5nV29yayA9IHJlbWFpbmluZ1dvcms7Ci0JCXJlbWFpbmluZ1dvcmsgPSBuZXdSZW1haW5pbmdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLLCBvbGRSZW1haW5pbmdXb3JrLCByZW1haW5pbmdXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA9IHJlbWFpbmluZ092ZXJ0aW1lQ29zdDsKLQkJcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9DT1NULCBvbGRSZW1haW5pbmdPdmVydGltZUNvc3QsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QgbmV3UmVtYWluaW5nT3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRSZW1haW5pbmdPdmVydGltZVdvcmsgPSByZW1haW5pbmdPdmVydGltZVdvcms7Ci0JCXJlbWFpbmluZ092ZXJ0aW1lV29yayA9IG5ld1JlbWFpbmluZ092ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSywgb2xkUmVtYWluaW5nT3ZlcnRpbWVXb3JrLCByZW1haW5pbmdPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QUNXUCgpIHsKLQkJcmV0dXJuIGFDV1A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QUNXUChmbG9hdCBuZXdBQ1dQKSB7Ci0JCWZsb2F0IG9sZEFDV1AgPSBhQ1dQOwotCQlhQ1dQID0gbmV3QUNXUDsKLQkJYm9vbGVhbiBvbGRBQ1dQRVNldCA9IGFDV1BFU2V0OwotCQlhQ1dQRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUCwgb2xkQUNXUCwgYUNXUCwgIW9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBQ1dQKCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYm9vbGVhbiBvbGRBQ1dQRVNldCA9IGFDV1BFU2V0OwotCQlhQ1dQID0gQUNXUF9FREVGQVVMVDsKLQkJYUNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDV1AsIG9sZEFDV1AsIEFDV1BfRURFRkFVTFQsIG9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBQ1dQKCkgewotCQlyZXR1cm4gYUNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldENWKCkgewotCQlyZXR1cm4gY1Y7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q1YoZmxvYXQgbmV3Q1YpIHsKLQkJZmxvYXQgb2xkQ1YgPSBjVjsKLQkJY1YgPSBuZXdDVjsKLQkJYm9vbGVhbiBvbGRDVkVTZXQgPSBjVkVTZXQ7Ci0JCWNWRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1YsIG9sZENWLCBjViwgIW9sZENWRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q1YoKSB7Ci0JCWZsb2F0IG9sZENWID0gY1Y7Ci0JCWJvb2xlYW4gb2xkQ1ZFU2V0ID0gY1ZFU2V0OwotCQljViA9IENWX0VERUZBVUxUOwotCQljVkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NWLCBvbGRDViwgQ1ZfRURFRkFVTFQsIG9sZENWRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q1YoKSB7Ci0JCXJldHVybiBjVkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q29uc3RyYWludFR5cGUoKSB7Ci0JCXJldHVybiBjb25zdHJhaW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50VHlwZShCaWdJbnRlZ2VyIG5ld0NvbnN0cmFpbnRUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ29uc3RyYWludFR5cGUgPSBjb25zdHJhaW50VHlwZTsKLQkJY29uc3RyYWludFR5cGUgPSBuZXdDb25zdHJhaW50VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX1RZUEUsIG9sZENvbnN0cmFpbnRUeXBlLCBjb25zdHJhaW50VHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldENhbGVuZGFyVUlEKCkgewotCQlyZXR1cm4gY2FsZW5kYXJVSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FsZW5kYXJVSUQoQmlnSW50ZWdlciBuZXdDYWxlbmRhclVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZENhbGVuZGFyVUlEID0gY2FsZW5kYXJVSUQ7Ci0JCWNhbGVuZGFyVUlEID0gbmV3Q2FsZW5kYXJVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ0FMRU5EQVJfVUlELCBvbGRDYWxlbmRhclVJRCwgY2FsZW5kYXJVSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbnN0cmFpbnREYXRlKCkgewotCQlyZXR1cm4gY29uc3RyYWludERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uc3RyYWludERhdGUoT2JqZWN0IG5ld0NvbnN0cmFpbnREYXRlKSB7Ci0JCU9iamVjdCBvbGRDb25zdHJhaW50RGF0ZSA9IGNvbnN0cmFpbnREYXRlOwotCQljb25zdHJhaW50RGF0ZSA9IG5ld0NvbnN0cmFpbnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfREFURSwgb2xkQ29uc3RyYWludERhdGUsIGNvbnN0cmFpbnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREZWFkbGluZSgpIHsKLQkJcmV0dXJuIGRlYWRsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlYWRsaW5lKE9iamVjdCBuZXdEZWFkbGluZSkgewotCQlPYmplY3Qgb2xkRGVhZGxpbmUgPSBkZWFkbGluZTsKLQkJZGVhZGxpbmUgPSBuZXdEZWFkbGluZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ERUFETElORSwgb2xkRGVhZGxpbmUsIGRlYWRsaW5lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMZXZlbEFzc2lnbm1lbnRzKCkgewotCQlyZXR1cm4gbGV2ZWxBc3NpZ25tZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbEFzc2lnbm1lbnRzKGJvb2xlYW4gbmV3TGV2ZWxBc3NpZ25tZW50cykgewotCQlib29sZWFuIG9sZExldmVsQXNzaWdubWVudHMgPSBsZXZlbEFzc2lnbm1lbnRzOwotCQlsZXZlbEFzc2lnbm1lbnRzID0gbmV3TGV2ZWxBc3NpZ25tZW50czsKLQkJYm9vbGVhbiBvbGRMZXZlbEFzc2lnbm1lbnRzRVNldCA9IGxldmVsQXNzaWdubWVudHNFU2V0OwotCQlsZXZlbEFzc2lnbm1lbnRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxfQVNTSUdOTUVOVFMsIG9sZExldmVsQXNzaWdubWVudHMsIGxldmVsQXNzaWdubWVudHMsICFvbGRMZXZlbEFzc2lnbm1lbnRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TGV2ZWxBc3NpZ25tZW50cygpIHsKLQkJYm9vbGVhbiBvbGRMZXZlbEFzc2lnbm1lbnRzID0gbGV2ZWxBc3NpZ25tZW50czsKLQkJYm9vbGVhbiBvbGRMZXZlbEFzc2lnbm1lbnRzRVNldCA9IGxldmVsQXNzaWdubWVudHNFU2V0OwotCQlsZXZlbEFzc2lnbm1lbnRzID0gTEVWRUxfQVNTSUdOTUVOVFNfRURFRkFVTFQ7Ci0JCWxldmVsQXNzaWdubWVudHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTF9BU1NJR05NRU5UUywgb2xkTGV2ZWxBc3NpZ25tZW50cywgTEVWRUxfQVNTSUdOTUVOVFNfRURFRkFVTFQsIG9sZExldmVsQXNzaWdubWVudHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCkgewotCQlyZXR1cm4gbGV2ZWxBc3NpZ25tZW50c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMZXZlbGluZ0NhblNwbGl0KCkgewotCQlyZXR1cm4gbGV2ZWxpbmdDYW5TcGxpdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbGluZ0NhblNwbGl0KGJvb2xlYW4gbmV3TGV2ZWxpbmdDYW5TcGxpdCkgewotCQlib29sZWFuIG9sZExldmVsaW5nQ2FuU3BsaXQgPSBsZXZlbGluZ0NhblNwbGl0OwotCQlsZXZlbGluZ0NhblNwbGl0ID0gbmV3TGV2ZWxpbmdDYW5TcGxpdDsKLQkJYm9vbGVhbiBvbGRMZXZlbGluZ0NhblNwbGl0RVNldCA9IGxldmVsaW5nQ2FuU3BsaXRFU2V0OwotCQlsZXZlbGluZ0NhblNwbGl0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfQ0FOX1NQTElULCBvbGRMZXZlbGluZ0NhblNwbGl0LCBsZXZlbGluZ0NhblNwbGl0LCAhb2xkTGV2ZWxpbmdDYW5TcGxpdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldExldmVsaW5nQ2FuU3BsaXQoKSB7Ci0JCWJvb2xlYW4gb2xkTGV2ZWxpbmdDYW5TcGxpdCA9IGxldmVsaW5nQ2FuU3BsaXQ7Ci0JCWJvb2xlYW4gb2xkTGV2ZWxpbmdDYW5TcGxpdEVTZXQgPSBsZXZlbGluZ0NhblNwbGl0RVNldDsKLQkJbGV2ZWxpbmdDYW5TcGxpdCA9IExFVkVMSU5HX0NBTl9TUExJVF9FREVGQVVMVDsKLQkJbGV2ZWxpbmdDYW5TcGxpdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVCwgb2xkTGV2ZWxpbmdDYW5TcGxpdCwgTEVWRUxJTkdfQ0FOX1NQTElUX0VERUZBVUxULCBvbGRMZXZlbGluZ0NhblNwbGl0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TGV2ZWxpbmdDYW5TcGxpdCgpIHsKLQkJcmV0dXJuIGxldmVsaW5nQ2FuU3BsaXRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXkoKSB7Ci0JCXJldHVybiBsZXZlbGluZ0RlbGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlciBuZXdMZXZlbGluZ0RlbGF5KSB7Ci0JCUJpZ0ludGVnZXIgb2xkTGV2ZWxpbmdEZWxheSA9IGxldmVsaW5nRGVsYXk7Ci0JCWxldmVsaW5nRGVsYXkgPSBuZXdMZXZlbGluZ0RlbGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZLCBvbGRMZXZlbGluZ0RlbGF5LCBsZXZlbGluZ0RlbGF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIHsKLQkJcmV0dXJuIGxldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChCaWdJbnRlZ2VyIG5ld0xldmVsaW5nRGVsYXlGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbGluZ0RlbGF5Rm9ybWF0ID0gbGV2ZWxpbmdEZWxheUZvcm1hdDsKLQkJbGV2ZWxpbmdEZWxheUZvcm1hdCA9IG5ld0xldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFULCBvbGRMZXZlbGluZ0RlbGF5Rm9ybWF0LCBsZXZlbGluZ0RlbGF5Rm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcmVMZXZlbGVkU3RhcnQoKSB7Ci0JCXJldHVybiBwcmVMZXZlbGVkU3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlTGV2ZWxlZFN0YXJ0KE9iamVjdCBuZXdQcmVMZXZlbGVkU3RhcnQpIHsKLQkJT2JqZWN0IG9sZFByZUxldmVsZWRTdGFydCA9IHByZUxldmVsZWRTdGFydDsKLQkJcHJlTGV2ZWxlZFN0YXJ0ID0gbmV3UHJlTGV2ZWxlZFN0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX1NUQVJULCBvbGRQcmVMZXZlbGVkU3RhcnQsIHByZUxldmVsZWRTdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpIHsKLQkJcmV0dXJuIHByZUxldmVsZWRGaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlTGV2ZWxlZEZpbmlzaChPYmplY3QgbmV3UHJlTGV2ZWxlZEZpbmlzaCkgewotCQlPYmplY3Qgb2xkUHJlTGV2ZWxlZEZpbmlzaCA9IHByZUxldmVsZWRGaW5pc2g7Ci0JCXByZUxldmVsZWRGaW5pc2ggPSBuZXdQcmVMZXZlbGVkRmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSCwgb2xkUHJlTGV2ZWxlZEZpbmlzaCwgcHJlTGV2ZWxlZEZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGluayhTdHJpbmcgbmV3SHlwZXJsaW5rKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmsgPSBoeXBlcmxpbms7Ci0JCWh5cGVybGluayA9IG5ld0h5cGVybGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTkssIG9sZEh5cGVybGluaywgaHlwZXJsaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtBZGRyZXNzID0gaHlwZXJsaW5rQWRkcmVzczsKLQkJaHlwZXJsaW5rQWRkcmVzcyA9IG5ld0h5cGVybGlua0FkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1MsIG9sZEh5cGVybGlua0FkZHJlc3MsIGh5cGVybGlua0FkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0JCXJldHVybiBoeXBlcmxpbmtTdWJBZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1N1YkFkZHJlc3MoU3RyaW5nIG5ld0h5cGVybGlua1N1YkFkZHJlc3MpIHsKLQkJU3RyaW5nIG9sZEh5cGVybGlua1N1YkFkZHJlc3MgPSBoeXBlcmxpbmtTdWJBZGRyZXNzOwotCQloeXBlcmxpbmtTdWJBZGRyZXNzID0gbmV3SHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1MsIG9sZEh5cGVybGlua1N1YkFkZHJlc3MsIGh5cGVybGlua1N1YkFkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKSB7Ci0JCXJldHVybiBpZ25vcmVSZXNvdXJjZUNhbGVuZGFyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoYm9vbGVhbiBuZXdJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKSB7Ci0JCWJvb2xlYW4gb2xkSWdub3JlUmVzb3VyY2VDYWxlbmRhciA9IGlnbm9yZVJlc291cmNlQ2FsZW5kYXI7Ci0JCWlnbm9yZVJlc291cmNlQ2FsZW5kYXIgPSBuZXdJZ25vcmVSZXNvdXJjZUNhbGVuZGFyOwotCQlib29sZWFuIG9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0ID0gaWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQ7Ci0JCWlnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVIsIG9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXIsIGlnbm9yZVJlc291cmNlQ2FsZW5kYXIsICFvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpIHsKLQkJYm9vbGVhbiBvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyID0gaWdub3JlUmVzb3VyY2VDYWxlbmRhcjsKLQkJYm9vbGVhbiBvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCA9IGlnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0OwotCQlpZ25vcmVSZXNvdXJjZUNhbGVuZGFyID0gSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSX0VERUZBVUxUOwotCQlpZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSLCBvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyLCBJR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVJfRURFRkFVTFQsIG9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkgewotCQlyZXR1cm4gaWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RlcygpIHsKLQkJcmV0dXJuIG5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGVzKFN0cmluZyBuZXdOb3RlcykgewotCQlTdHJpbmcgb2xkTm90ZXMgPSBub3RlczsKLQkJbm90ZXMgPSBuZXdOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OT1RFUywgb2xkTm90ZXMsIG5vdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIaWRlQmFyKCkgewotCQlyZXR1cm4gaGlkZUJhcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIaWRlQmFyKGJvb2xlYW4gbmV3SGlkZUJhcikgewotCQlib29sZWFuIG9sZEhpZGVCYXIgPSBoaWRlQmFyOwotCQloaWRlQmFyID0gbmV3SGlkZUJhcjsKLQkJYm9vbGVhbiBvbGRIaWRlQmFyRVNldCA9IGhpZGVCYXJFU2V0OwotCQloaWRlQmFyRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSElERV9CQVIsIG9sZEhpZGVCYXIsIGhpZGVCYXIsICFvbGRIaWRlQmFyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SGlkZUJhcigpIHsKLQkJYm9vbGVhbiBvbGRIaWRlQmFyID0gaGlkZUJhcjsKLQkJYm9vbGVhbiBvbGRIaWRlQmFyRVNldCA9IGhpZGVCYXJFU2V0OwotCQloaWRlQmFyID0gSElERV9CQVJfRURFRkFVTFQ7Ci0JCWhpZGVCYXJFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUiwgb2xkSGlkZUJhciwgSElERV9CQVJfRURFRkFVTFQsIG9sZEhpZGVCYXJFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRIaWRlQmFyKCkgewotCQlyZXR1cm4gaGlkZUJhckVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsdXAoKSB7Ci0JCXJldHVybiByb2xsdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbHVwKGJvb2xlYW4gbmV3Um9sbHVwKSB7Ci0JCWJvb2xlYW4gb2xkUm9sbHVwID0gcm9sbHVwOwotCQlyb2xsdXAgPSBuZXdSb2xsdXA7Ci0JCWJvb2xlYW4gb2xkUm9sbHVwRVNldCA9IHJvbGx1cEVTZXQ7Ci0JCXJvbGx1cEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JPTExVUCwgb2xkUm9sbHVwLCByb2xsdXAsICFvbGRSb2xsdXBFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSb2xsdXAoKSB7Ci0JCWJvb2xlYW4gb2xkUm9sbHVwID0gcm9sbHVwOwotCQlib29sZWFuIG9sZFJvbGx1cEVTZXQgPSByb2xsdXBFU2V0OwotCQlyb2xsdXAgPSBST0xMVVBfRURFRkFVTFQ7Ci0JCXJvbGx1cEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JPTExVUCwgb2xkUm9sbHVwLCBST0xMVVBfRURFRkFVTFQsIG9sZFJvbGx1cEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJvbGx1cCgpIHsKLQkJcmV0dXJuIHJvbGx1cEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1MoZmxvYXQgbmV3QkNXUykgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYkNXUyA9IG5ld0JDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXU0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1MsIG9sZEJDV1MsIGJDV1MsICFvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUygpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0JCWJDV1NFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dQLCBvbGRCQ1dQLCBiQ1dQLCAhb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1AoKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCQliQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUCwgb2xkQkNXUCwgQkNXUF9FREVGQVVMVCwgb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHBoeXNpY2FsUGVyY2VudENvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKEJpZ0ludGVnZXIgbmV3UGh5c2ljYWxQZXJjZW50Q29tcGxldGUpIHsKLQkJQmlnSW50ZWdlciBvbGRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSA9IHBoeXNpY2FsUGVyY2VudENvbXBsZXRlOwotCQlwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSA9IG5ld1BoeXNpY2FsUGVyY2VudENvbXBsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEUsIG9sZFBoeXNpY2FsUGVyY2VudENvbXBsZXRlLCBwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEVhcm5lZFZhbHVlTWV0aG9kKCkgewotCQlyZXR1cm4gZWFybmVkVmFsdWVNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWFybmVkVmFsdWVNZXRob2QoQmlnSW50ZWdlciBuZXdFYXJuZWRWYWx1ZU1ldGhvZCkgewotCQlCaWdJbnRlZ2VyIG9sZEVhcm5lZFZhbHVlTWV0aG9kID0gZWFybmVkVmFsdWVNZXRob2Q7Ci0JCWVhcm5lZFZhbHVlTWV0aG9kID0gbmV3RWFybmVkVmFsdWVNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTkVEX1ZBTFVFX01FVEhPRCwgb2xkRWFybmVkVmFsdWVNZXRob2QsIGVhcm5lZFZhbHVlTWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFByZWRlY2Vzc29yTGluaygpIHsKLQkJaWYgKHByZWRlY2Vzc29yTGluayA9PSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvckxpbmsgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUHJlZGVjZXNzb3JMaW5rLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRURFQ0VTU09SX0xJTkspOwotCQl9Ci0JCXJldHVybiBwcmVkZWNlc3Nvckxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgewotCQlyZXR1cm4gYWN0dWFsV29ya1Byb3RlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxXb3JrUHJvdGVjdGVkKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkID0gYWN0dWFsV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsV29ya1Byb3RlY3RlZCA9IG5ld0FjdHVhbFdvcmtQcm90ZWN0ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUktfUFJPVEVDVEVELCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkLCBhY3R1YWxXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA9IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCwgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFeHRlbmRlZEF0dHJpYnV0ZTIuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURU5ERURfQVRUUklCVVRFKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEJhc2VsaW5lKCkgewotCQlpZiAoYmFzZWxpbmUgPT0gbnVsbCkgewotCQkJYmFzZWxpbmUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmFzZWxpbmUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkFTRUxJTkUpOwotCQl9Ci0JCXJldHVybiBiYXNlbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0T3V0bGluZUNvZGUoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZSA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChPdXRsaW5lQ29kZTIuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9DT0RFKTsKLQkJfQotCQlyZXR1cm4gb3V0bGluZUNvZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCkgewotCQlpZiAodGltZXBoYXNlZERhdGEgPT0gbnVsbCkgewotCQkJdGltZXBoYXNlZERhdGEgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGltZXBoYXNlZERhdGFUeXBlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RJTUVQSEFTRURfREFUQSk7Ci0JCX0KLQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVERUNFU1NPUl9MSU5LOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByZWRlY2Vzc29yTGluaygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JBU0VMSU5FOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEJhc2VsaW5lKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9DT0RFOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE91dGxpbmVDb2RlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVElNRVBIQVNFRF9EQVRBOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRpbWVwaGFzZWREYXRhKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lEOgotCQkJCXJldHVybiBnZXRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfTlVMTDoKLQkJCQlyZXR1cm4gaXNJc051bGwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JFQVRFX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENyZWF0ZURhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05UQUNUOgotCQkJCXJldHVybiBnZXRDb250YWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTOgotCQkJCXJldHVybiBnZXRXQlMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlNfTEVWRUw6Ci0JCQkJcmV0dXJuIGdldFdCU0xldmVsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9OVU1CRVI6Ci0JCQkJcmV0dXJuIGdldE91dGxpbmVOdW1iZXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMOgotCQkJCXJldHVybiBnZXRPdXRsaW5lTGV2ZWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUklPUklUWToKLQkJCQlyZXR1cm4gZ2V0UHJpb3JpdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OOgotCQkJCXJldHVybiBnZXREdXJhdGlvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RPUDoKLQkJCQlyZXR1cm4gZ2V0U3RvcCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRToKLQkJCQlyZXR1cm4gZ2V0UmVzdW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElEOgotCQkJCXJldHVybiBpc1Jlc3VtZVZhbGlkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VGRk9SVF9EUklWRU46Ci0JCQkJcmV0dXJuIGlzRWZmb3J0RHJpdmVuKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFQ1VSUklORzoKLQkJCQlyZXR1cm4gaXNSZWN1cnJpbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJcmV0dXJuIGlzT3ZlckFsbG9jYXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQ6Ci0JCQkJcmV0dXJuIGlzRXN0aW1hdGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX01JTEVTVE9ORToKLQkJCQlyZXR1cm4gaXNNaWxlc3RvbmUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VNTUFSWToKLQkJCQlyZXR1cm4gaXNTdW1tYXJ5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSSVRJQ0FMOgotCQkJCXJldHVybiBpc0NyaXRpY2FsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzSXNTdWJwcm9qZWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZOgotCQkJCXJldHVybiBpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVQlBST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gZ2V0U3VicHJvamVjdE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLOgotCQkJCXJldHVybiBpc0V4dGVybmFsVGFzaygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGdldEV4dGVybmFsVGFza1Byb2plY3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0RWFybHlTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RWFybHlGaW5pc2goKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJUOgotCQkJCXJldHVybiBnZXRMYXRlU3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0TGF0ZUZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXJldHVybiBnZXRTdGFydFZhcmlhbmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklOSVNIX1ZBUklBTkNFOgotCQkJCXJldHVybiBnZXRGaW5pc2hWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRXb3JrVmFyaWFuY2UoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRlJFRV9TTEFDSzoKLQkJCQlyZXR1cm4gZ2V0RnJlZVNsYWNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVE9UQUxfU0xBQ0s6Ci0JCQkJcmV0dXJuIGdldFRvdGFsU2xhY2soKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NUOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Rml4ZWRDb3N0KCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlyZXR1cm4gZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGdldFBlcmNlbnRDb21wbGV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlyZXR1cm4gZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsRmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0RVUkFUSU9OOgotCQkJCXJldHVybiBnZXRBY3R1YWxEdXJhdGlvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFR1VMQVJfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVndWxhcldvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfRFVSQVRJT046Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ0R1cmF0aW9uKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEFDV1AoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1Y6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRDVigpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldENvbnN0cmFpbnRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBnZXRDYWxlbmRhclVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfREFURToKLQkJCQlyZXR1cm4gZ2V0Q29uc3RyYWludERhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ERUFETElORToKLQkJCQlyZXR1cm4gZ2V0RGVhZGxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTF9BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gaXNMZXZlbEFzc2lnbm1lbnRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVDoKLQkJCQlyZXR1cm4gaXNMZXZlbGluZ0NhblNwbGl0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZOgotCQkJCXJldHVybiBnZXRMZXZlbGluZ0RlbGF5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXJldHVybiBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFX0xFVkVMRURfU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFByZUxldmVsZWRTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOSzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVI6Ci0JCQkJcmV0dXJuIGlzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OT1RFUzoKLQkJCQlyZXR1cm4gZ2V0Tm90ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUjoKLQkJCQlyZXR1cm4gaXNIaWRlQmFyKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JPTExVUDoKLQkJCQlyZXR1cm4gaXNSb2xsdXAoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1MoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1AoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURToKLQkJCQlyZXR1cm4gZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJORURfVkFMVUVfTUVUSE9EOgotCQkJCXJldHVybiBnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRURFQ0VTU09SX0xJTks6Ci0JCQkJcmV0dXJuIGdldFByZWRlY2Vzc29yTGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JBU0VMSU5FOgotCQkJCXJldHVybiBnZXRCYXNlbGluZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfQ09ERToKLQkJCQlyZXR1cm4gZ2V0T3V0bGluZUNvZGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIGdldFRpbWVwaGFzZWREYXRhKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JRDoKLQkJCQlzZXRJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVFlQRToKLQkJCQlzZXRUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfTlVMTDoKLQkJCQlzZXRJc051bGwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSRUFURV9EQVRFOgotCQkJCXNldENyZWF0ZURhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlRBQ1Q6Ci0JCQkJc2V0Q29udGFjdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTOgotCQkJCXNldFdCUygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTX0xFVkVMOgotCQkJCXNldFdCU0xldmVsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX05VTUJFUjoKLQkJCQlzZXRPdXRsaW5lTnVtYmVyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMOgotCQkJCXNldE91dGxpbmVMZXZlbCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSSU9SSVRZOgotCQkJCXNldFByaW9yaXR5KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OOgotCQkJCXNldER1cmF0aW9uKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUT1A6Ci0JCQkJc2V0U3RvcCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FOgotCQkJCXNldFJlc3VtZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElEOgotCQkJCXNldFJlc3VtZVZhbGlkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FRkZPUlRfRFJJVkVOOgotCQkJCXNldEVmZm9ydERyaXZlbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVDVVJSSU5HOgotCQkJCXNldFJlY3VycmluZygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJc2V0T3ZlckFsbG9jYXRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVNUSU1BVEVEOgotCQkJCXNldEVzdGltYXRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTUlMRVNUT05FOgotCQkJCXNldE1pbGVzdG9uZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VNTUFSWToKLQkJCQlzZXRTdW1tYXJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUklUSUNBTDoKLQkJCQlzZXRDcml0aWNhbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVDoKLQkJCQlzZXRJc1N1YnByb2plY3QoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZOgotCQkJCXNldElzU3VicHJvamVjdFJlYWRPbmx5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVUJQUk9KRUNUX05BTUU6Ci0JCQkJc2V0U3VicHJvamVjdE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0s6Ci0JCQkJc2V0RXh0ZXJuYWxUYXNrKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLX1BST0pFQ1Q6Ci0JCQkJc2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfU1RBUlQ6Ci0JCQkJc2V0RWFybHlTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfRklOSVNIOgotCQkJCXNldEVhcmx5RmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJUOgotCQkJCXNldExhdGVTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9GSU5JU0g6Ci0JCQkJc2V0TGF0ZUZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RBUlRfVkFSSUFOQ0U6Ci0JCQkJc2V0U3RhcnRWYXJpYW5jZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSF9WQVJJQU5DRToKLQkJCQlzZXRGaW5pc2hWYXJpYW5jZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJc2V0V29ya1ZhcmlhbmNlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZSRUVfU0xBQ0s6Ci0JCQkJc2V0RnJlZVNsYWNrKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVE9UQUxfU0xBQ0s6Ci0JCQkJc2V0VG90YWxTbGFjaygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1Q6Ci0JCQkJc2V0Rml4ZWRDb3N0KCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlzZXRGaXhlZENvc3RBY2NydWFsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRDb21wbGV0ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlzZXRQZXJjZW50V29ya0NvbXBsZXRlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09TVDoKLQkJCQlzZXRDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRPdmVydGltZUNvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLOgotCQkJCXNldE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1NUQVJUOgotCQkJCXNldEFjdHVhbFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfRklOSVNIOgotCQkJCXNldEFjdHVhbEZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0RVUkFUSU9OOgotCQkJCXNldEFjdHVhbER1cmF0aW9uKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUks6Ci0JCQkJc2V0QWN0dWFsV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUdVTEFSX1dPUks6Ci0JCQkJc2V0UmVndWxhcldvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19EVVJBVElPTjoKLQkJCQlzZXRSZW1haW5pbmdEdXJhdGlvbigoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLOgotCQkJCXNldFJlbWFpbmluZ1dvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUDoKLQkJCQlzZXRBQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NWOgotCQkJCXNldENWKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfVFlQRToKLQkJCQlzZXRDb25zdHJhaW50VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRDYWxlbmRhclVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfREFURToKLQkJCQlzZXRDb25zdHJhaW50RGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fREVBRExJTkU6Ci0JCQkJc2V0RGVhZGxpbmUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMX0FTU0lHTk1FTlRTOgotCQkJCXNldExldmVsQXNzaWdubWVudHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVDoKLQkJCQlzZXRMZXZlbGluZ0NhblNwbGl0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19ERUxBWToKLQkJCQlzZXRMZXZlbGluZ0RlbGF5KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXNldExldmVsaW5nRGVsYXlGb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVfTEVWRUxFRF9TVEFSVDoKLQkJCQlzZXRQcmVMZXZlbGVkU3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSDoKLQkJCQlzZXRQcmVMZXZlbGVkRmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTks6Ci0JCQkJc2V0SHlwZXJsaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtBZGRyZXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rU3ViQWRkcmVzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSOgotCQkJCXNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05PVEVTOgotCQkJCXNldE5vdGVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUjoKLQkJCQlzZXRIaWRlQmFyKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ST0xMVVA6Ci0JCQkJc2V0Um9sbHVwKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dTOgotCQkJCXNldEJDV1MoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUDoKLQkJCQlzZXRCQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJc2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJORURfVkFMVUVfTUVUSE9EOgotCQkJCXNldEVhcm5lZFZhbHVlTWV0aG9kKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFREVDRVNTT1JfTElOSzoKLQkJCQlnZXRQcmVkZWNlc3NvckxpbmsoKS5jbGVhcigpOwotCQkJCWdldFByZWRlY2Vzc29yTGluaygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkFTRUxJTkU6Ci0JCQkJZ2V0QmFzZWxpbmUoKS5jbGVhcigpOwotCQkJCWdldEJhc2VsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9DT0RFOgotCQkJCWdldE91dGxpbmVDb2RlKCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVUlEOgotCQkJCXNldFVJRChVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JRDoKLQkJCQlzZXRJRChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19OVUxMOgotCQkJCXVuc2V0SXNOdWxsKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSRUFURV9EQVRFOgotCQkJCXNldENyZWF0ZURhdGUoQ1JFQVRFX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05UQUNUOgotCQkJCXNldENvbnRhY3QoQ09OVEFDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dCUzoKLQkJCQlzZXRXQlMoV0JTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTX0xFVkVMOgotCQkJCXNldFdCU0xldmVsKFdCU19MRVZFTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTlVNQkVSOgotCQkJCXNldE91dGxpbmVOdW1iZXIoT1VUTElORV9OVU1CRVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMOgotCQkJCXNldE91dGxpbmVMZXZlbChPVVRMSU5FX0xFVkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJJT1JJVFk6Ci0JCQkJc2V0UHJpb3JpdHkoUFJJT1JJVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVDoKLQkJCQlzZXRTdGFydChTVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT046Ci0JCQkJc2V0RHVyYXRpb24oRFVSQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SSzoKLQkJCQlzZXRXb3JrKFdPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVE9QOgotCQkJCXNldFN0b3AoU1RPUF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRToKLQkJCQlzZXRSZXN1bWUoUkVTVU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElEOgotCQkJCXVuc2V0UmVzdW1lVmFsaWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUZGT1JUX0RSSVZFTjoKLQkJCQl1bnNldEVmZm9ydERyaXZlbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUNVUlJJTkc6Ci0JCQkJdW5zZXRSZWN1cnJpbmcoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJdW5zZXRPdmVyQWxsb2NhdGVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VTVElNQVRFRDoKLQkJCQl1bnNldEVzdGltYXRlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19NSUxFU1RPTkU6Ci0JCQkJdW5zZXRNaWxlc3RvbmUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VNTUFSWToKLQkJCQl1bnNldFN1bW1hcnkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JJVElDQUw6Ci0JCQkJdW5zZXRDcml0aWNhbCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNUOgotCQkJCXVuc2V0SXNTdWJwcm9qZWN0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZOgotCQkJCXVuc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VCUFJPSkVDVF9OQU1FOgotCQkJCXNldFN1YnByb2plY3ROYW1lKFNVQlBST0pFQ1RfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0s6Ci0JCQkJdW5zZXRFeHRlcm5hbFRhc2soKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTS19QUk9KRUNUOgotCQkJCXNldEV4dGVybmFsVGFza1Byb2plY3QoRVhURVJOQUxfVEFTS19QUk9KRUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfU1RBUlQ6Ci0JCQkJc2V0RWFybHlTdGFydChFQVJMWV9TVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX0ZJTklTSDoKLQkJCQlzZXRFYXJseUZpbmlzaChFQVJMWV9GSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJUOgotCQkJCXNldExhdGVTdGFydChMQVRFX1NUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9GSU5JU0g6Ci0JCQkJc2V0TGF0ZUZpbmlzaChMQVRFX0ZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXNldFN0YXJ0VmFyaWFuY2UoU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0hfVkFSSUFOQ0U6Ci0JCQkJc2V0RmluaXNoVmFyaWFuY2UoRklOSVNIX1ZBUklBTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRToKLQkJCQl1bnNldFdvcmtWYXJpYW5jZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GUkVFX1NMQUNLOgotCQkJCXNldEZyZWVTbGFjayhGUkVFX1NMQUNLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVE9UQUxfU0xBQ0s6Ci0JCQkJc2V0VG90YWxTbGFjayhUT1RBTF9TTEFDS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1Q6Ci0JCQkJdW5zZXRGaXhlZENvc3QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVF9BQ0NSVUFMOgotCQkJCXNldEZpeGVkQ29zdEFjY3J1YWwoRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEVSQ0VOVF9DT01QTEVURToKLQkJCQlzZXRQZXJjZW50Q29tcGxldGUoUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlzZXRQZXJjZW50V29ya0NvbXBsZXRlKFBFUkNFTlRfV09SS19DT01QTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPU1Q6Ci0JCQkJc2V0Q29zdChDT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRPdmVydGltZUNvc3QoT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0T3ZlcnRpbWVXb3JrKE9WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJc2V0QWN0dWFsU3RhcnQoQUNUVUFMX1NUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0ZJTklTSDoKLQkJCQlzZXRBY3R1YWxGaW5pc2goQUNUVUFMX0ZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9EVVJBVElPTjoKLQkJCQlzZXRBY3R1YWxEdXJhdGlvbihBQ1RVQUxfRFVSQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KEFDVFVBTF9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUks6Ci0JCQkJc2V0QWN0dWFsV29yayhBQ1RVQUxfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yayhBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFR1VMQVJfV09SSzoKLQkJCQlzZXRSZWd1bGFyV29yayhSRUdVTEFSX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfRFVSQVRJT046Ci0JCQkJc2V0UmVtYWluaW5nRHVyYXRpb24oUkVNQUlOSU5HX0RVUkFUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdChSRU1BSU5JTkdfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLOgotCQkJCXNldFJlbWFpbmluZ1dvcmsoUkVNQUlOSU5HX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1dQOgotCQkJCXVuc2V0QUNXUCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DVjoKLQkJCQl1bnNldENWKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfVFlQRToKLQkJCQlzZXRDb25zdHJhaW50VHlwZShDT05TVFJBSU5UX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0Q2FsZW5kYXJVSUQoQ0FMRU5EQVJfVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OU1RSQUlOVF9EQVRFOgotCQkJCXNldENvbnN0cmFpbnREYXRlKENPTlNUUkFJTlRfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RFQURMSU5FOgotCQkJCXNldERlYWRsaW5lKERFQURMSU5FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxfQVNTSUdOTUVOVFM6Ci0JCQkJdW5zZXRMZXZlbEFzc2lnbm1lbnRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVDoKLQkJCQl1bnNldExldmVsaW5nQ2FuU3BsaXQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVk6Ci0JCQkJc2V0TGV2ZWxpbmdEZWxheShMRVZFTElOR19ERUxBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX1NUQVJUOgotCQkJCXNldFByZUxldmVsZWRTdGFydChQUkVfTEVWRUxFRF9TVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSDoKLQkJCQlzZXRQcmVMZXZlbGVkRmluaXNoKFBSRV9MRVZFTEVEX0ZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoSFlQRVJMSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rQWRkcmVzcyhIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUjoKLQkJCQl1bnNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTk9URVM6Ci0JCQkJc2V0Tm90ZXMoTk9URVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUjoKLQkJCQl1bnNldEhpZGVCYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUk9MTFVQOgotCQkJCXVuc2V0Um9sbHVwKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1M6Ci0JCQkJdW5zZXRCQ1dTKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1A6Ci0JCQkJdW5zZXRCQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJc2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJc2V0RWFybmVkVmFsdWVNZXRob2QoRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRURFQ0VTU09SX0xJTks6Ci0JCQkJZ2V0UHJlZGVjZXNzb3JMaW5rKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQVNFTElORToKLQkJCQlnZXRCYXNlbGluZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfQ09ERToKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlEICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX05VTEw6Ci0JCQkJcmV0dXJuIGlzU2V0SXNOdWxsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JFQVRFX0RBVEU6Ci0JCQkJcmV0dXJuIENSRUFURV9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjcmVhdGVEYXRlICE9IG51bGwgOiAhQ1JFQVRFX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNyZWF0ZURhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlRBQ1Q6Ci0JCQkJcmV0dXJuIENPTlRBQ1RfRURFRkFVTFQgPT0gbnVsbCA/IGNvbnRhY3QgIT0gbnVsbCA6ICFDT05UQUNUX0VERUZBVUxULmVxdWFscyhjb250YWN0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlM6Ci0JCQkJcmV0dXJuIFdCU19FREVGQVVMVCA9PSBudWxsID8gd0JTICE9IG51bGwgOiAhV0JTX0VERUZBVUxULmVxdWFscyh3QlMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dCU19MRVZFTDoKLQkJCQlyZXR1cm4gV0JTX0xFVkVMX0VERUZBVUxUID09IG51bGwgPyB3QlNMZXZlbCAhPSBudWxsIDogIVdCU19MRVZFTF9FREVGQVVMVC5lcXVhbHMod0JTTGV2ZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTlVNQkVSOgotCQkJCXJldHVybiBPVVRMSU5FX05VTUJFUl9FREVGQVVMVCA9PSBudWxsID8gb3V0bGluZU51bWJlciAhPSBudWxsIDogIU9VVExJTkVfTlVNQkVSX0VERUZBVUxULmVxdWFscyhvdXRsaW5lTnVtYmVyKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMOgotCQkJCXJldHVybiBPVVRMSU5FX0xFVkVMX0VERUZBVUxUID09IG51bGwgPyBvdXRsaW5lTGV2ZWwgIT0gbnVsbCA6ICFPVVRMSU5FX0xFVkVMX0VERUZBVUxULmVxdWFscyhvdXRsaW5lTGV2ZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSSU9SSVRZOgotCQkJCXJldHVybiBQUklPUklUWV9FREVGQVVMVCA9PSBudWxsID8gcHJpb3JpdHkgIT0gbnVsbCA6ICFQUklPUklUWV9FREVGQVVMVC5lcXVhbHMocHJpb3JpdHkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUOgotCQkJCXJldHVybiBTVEFSVF9FREVGQVVMVCA9PSBudWxsID8gc3RhcnQgIT0gbnVsbCA6ICFTVEFSVF9FREVGQVVMVC5lcXVhbHMoc3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSDoKLQkJCQlyZXR1cm4gRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2ggIT0gbnVsbCA6ICFGSU5JU0hfRURFRkFVTFQuZXF1YWxzKGZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT046Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbiAhPSBudWxsIDogIURVUkFUSU9OX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uRm9ybWF0ICE9IG51bGwgOiAhRFVSQVRJT05fRk9STUFUX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbkZvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUT1A6Ci0JCQkJcmV0dXJuIFNUT1BfRURFRkFVTFQgPT0gbnVsbCA/IHN0b3AgIT0gbnVsbCA6ICFTVE9QX0VERUZBVUxULmVxdWFscyhzdG9wKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUU6Ci0JCQkJcmV0dXJuIFJFU1VNRV9FREVGQVVMVCA9PSBudWxsID8gcmVzdW1lICE9IG51bGwgOiAhUkVTVU1FX0VERUZBVUxULmVxdWFscyhyZXN1bWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRV9WQUxJRDoKLQkJCQlyZXR1cm4gaXNTZXRSZXN1bWVWYWxpZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VGRk9SVF9EUklWRU46Ci0JCQkJcmV0dXJuIGlzU2V0RWZmb3J0RHJpdmVuKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVDVVJSSU5HOgotCQkJCXJldHVybiBpc1NldFJlY3VycmluZygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJfQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc1NldE92ZXJBbGxvY2F0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQ6Ci0JCQkJcmV0dXJuIGlzU2V0RXN0aW1hdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTUlMRVNUT05FOgotCQkJCXJldHVybiBpc1NldE1pbGVzdG9uZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVTU1BUlk6Ci0JCQkJcmV0dXJuIGlzU2V0U3VtbWFyeSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSSVRJQ0FMOgotCQkJCXJldHVybiBpc1NldENyaXRpY2FsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVDoKLQkJCQlyZXR1cm4gaXNTZXRJc1N1YnByb2plY3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNUX1JFQURfT05MWToKLQkJCQlyZXR1cm4gaXNTZXRJc1N1YnByb2plY3RSZWFkT25seSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVQlBST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gU1VCUFJPSkVDVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzdWJwcm9qZWN0TmFtZSAhPSBudWxsIDogIVNVQlBST0pFQ1RfTkFNRV9FREVGQVVMVC5lcXVhbHMoc3VicHJvamVjdE5hbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0s6Ci0JCQkJcmV0dXJuIGlzU2V0RXh0ZXJuYWxUYXNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTS19QUk9KRUNUOgotCQkJCXJldHVybiBFWFRFUk5BTF9UQVNLX1BST0pFQ1RfRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVybmFsVGFza1Byb2plY3QgIT0gbnVsbCA6ICFFWFRFUk5BTF9UQVNLX1BST0pFQ1RfRURFRkFVTFQuZXF1YWxzKGV4dGVybmFsVGFza1Byb2plY3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX1NUQVJUOgotCQkJCXJldHVybiBFQVJMWV9TVEFSVF9FREVGQVVMVCA9PSBudWxsID8gZWFybHlTdGFydCAhPSBudWxsIDogIUVBUkxZX1NUQVJUX0VERUZBVUxULmVxdWFscyhlYXJseVN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9GSU5JU0g6Ci0JCQkJcmV0dXJuIEVBUkxZX0ZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gZWFybHlGaW5pc2ggIT0gbnVsbCA6ICFFQVJMWV9GSU5JU0hfRURFRkFVTFQuZXF1YWxzKGVhcmx5RmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJUOgotCQkJCXJldHVybiBMQVRFX1NUQVJUX0VERUZBVUxUID09IG51bGwgPyBsYXRlU3RhcnQgIT0gbnVsbCA6ICFMQVRFX1NUQVJUX0VERUZBVUxULmVxdWFscyhsYXRlU3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xBVEVfRklOSVNIOgotCQkJCXJldHVybiBMQVRFX0ZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gbGF0ZUZpbmlzaCAhPSBudWxsIDogIUxBVEVfRklOSVNIX0VERUZBVUxULmVxdWFscyhsYXRlRmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0VmFyaWFuY2UgIT0gbnVsbCA6ICFTVEFSVF9WQVJJQU5DRV9FREVGQVVMVC5lcXVhbHMoc3RhcnRWYXJpYW5jZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklOSVNIX1ZBUklBTkNFOgotCQkJCXJldHVybiBGSU5JU0hfVkFSSUFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaFZhcmlhbmNlICE9IG51bGwgOiAhRklOSVNIX1ZBUklBTkNFX0VERUZBVUxULmVxdWFscyhmaW5pc2hWYXJpYW5jZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRToKLQkJCQlyZXR1cm4gaXNTZXRXb3JrVmFyaWFuY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GUkVFX1NMQUNLOgotCQkJCXJldHVybiBGUkVFX1NMQUNLX0VERUZBVUxUID09IG51bGwgPyBmcmVlU2xhY2sgIT0gbnVsbCA6ICFGUkVFX1NMQUNLX0VERUZBVUxULmVxdWFscyhmcmVlU2xhY2spOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RPVEFMX1NMQUNLOgotCQkJCXJldHVybiBUT1RBTF9TTEFDS19FREVGQVVMVCA9PSBudWxsID8gdG90YWxTbGFjayAhPSBudWxsIDogIVRPVEFMX1NMQUNLX0VERUZBVUxULmVxdWFscyh0b3RhbFNsYWNrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NUOgotCQkJCXJldHVybiBpc1NldEZpeGVkQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlyZXR1cm4gRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUID09IG51bGwgPyBmaXhlZENvc3RBY2NydWFsICE9IG51bGwgOiAhRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxULmVxdWFscyhmaXhlZENvc3RBY2NydWFsKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXJldHVybiBQRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUID09IG51bGwgPyBwZXJjZW50Q29tcGxldGUgIT0gbnVsbCA6ICFQRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhwZXJjZW50Q29tcGxldGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlyZXR1cm4gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID09IG51bGwgPyBwZXJjZW50V29ya0NvbXBsZXRlICE9IG51bGwgOiAhUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhwZXJjZW50V29ya0NvbXBsZXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT1NUOgotCQkJCXJldHVybiBDT1NUX0VERUZBVUxUID09IG51bGwgPyBjb3N0ICE9IG51bGwgOiAhQ09TVF9FREVGQVVMVC5lcXVhbHMoY29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gb3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhT1ZFUlRJTUVfQ09TVF9FREVGQVVMVC5lcXVhbHMob3ZlcnRpbWVDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBPVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZVdvcmsgIT0gbnVsbCA6ICFPVkVSVElNRV9XT1JLX0VERUZBVUxULmVxdWFscyhvdmVydGltZVdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9TVEFSVDoKLQkJCQlyZXR1cm4gQUNUVUFMX1NUQVJUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxTdGFydCAhPSBudWxsIDogIUFDVFVBTF9TVEFSVF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsU3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJcmV0dXJuIEFDVFVBTF9GSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbEZpbmlzaCAhPSBudWxsIDogIUFDVFVBTF9GSU5JU0hfRURFRkFVTFQuZXF1YWxzKGFjdHVhbEZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0RVUkFUSU9OOgotCQkJCXJldHVybiBBQ1RVQUxfRFVSQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbER1cmF0aW9uICE9IG51bGwgOiAhQUNUVUFMX0RVUkFUSU9OX0VERUZBVUxULmVxdWFscyhhY3R1YWxEdXJhdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0NPU1Q6Ci0JCQkJcmV0dXJuIEFDVFVBTF9DT1NUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxDb3N0ICE9IG51bGwgOiAhQUNUVUFMX0NPU1RfRURFRkFVTFQuZXF1YWxzKGFjdHVhbENvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUks6Ci0JCQkJcmV0dXJuIEFDVFVBTF9XT1JLX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxXb3JrICE9IG51bGwgOiAhQUNUVUFMX1dPUktfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVHVUxBUl9XT1JLOgotCQkJCXJldHVybiBSRUdVTEFSX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlZ3VsYXJXb3JrICE9IG51bGwgOiAhUkVHVUxBUl9XT1JLX0VERUZBVUxULmVxdWFscyhyZWd1bGFyV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0RVUkFUSU9OOgotCQkJCXJldHVybiBSRU1BSU5JTkdfRFVSQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ0R1cmF0aW9uICE9IG51bGwgOiAhUkVNQUlOSU5HX0RVUkFUSU9OX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdEdXJhdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ0Nvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nV29yayAhPSBudWxsIDogIVJFTUFJTklOR19XT1JLX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ092ZXJ0aW1lQ29zdCAhPSBudWxsIDogIVJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdPdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nT3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ092ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUDoKLQkJCQlyZXR1cm4gaXNTZXRBQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1Y6Ci0JCQkJcmV0dXJuIGlzU2V0Q1YoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX1RZUEU6Ci0JCQkJcmV0dXJuIENPTlNUUkFJTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gY29uc3RyYWludFR5cGUgIT0gbnVsbCA6ICFDT05TVFJBSU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGNvbnN0cmFpbnRUeXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DQUxFTkRBUl9VSUQ6Ci0JCQkJcmV0dXJuIENBTEVOREFSX1VJRF9FREVGQVVMVCA9PSBudWxsID8gY2FsZW5kYXJVSUQgIT0gbnVsbCA6ICFDQUxFTkRBUl9VSURfRURFRkFVTFQuZXF1YWxzKGNhbGVuZGFyVUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX0RBVEU6Ci0JCQkJcmV0dXJuIENPTlNUUkFJTlRfREFURV9FREVGQVVMVCA9PSBudWxsID8gY29uc3RyYWludERhdGUgIT0gbnVsbCA6ICFDT05TVFJBSU5UX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNvbnN0cmFpbnREYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ERUFETElORToKLQkJCQlyZXR1cm4gREVBRExJTkVfRURFRkFVTFQgPT0gbnVsbCA/IGRlYWRsaW5lICE9IG51bGwgOiAhREVBRExJTkVfRURFRkFVTFQuZXF1YWxzKGRlYWRsaW5lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTF9BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfQ0FOX1NQTElUOgotCQkJCXJldHVybiBpc1NldExldmVsaW5nQ2FuU3BsaXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19ERUxBWToKLQkJCQlyZXR1cm4gTEVWRUxJTkdfREVMQVlfRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsaW5nRGVsYXkgIT0gbnVsbCA6ICFMRVZFTElOR19ERUxBWV9FREVGQVVMVC5lcXVhbHMobGV2ZWxpbmdEZWxheSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXJldHVybiBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsaW5nRGVsYXlGb3JtYXQgIT0gbnVsbCA6ICFMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKGxldmVsaW5nRGVsYXlGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX1NUQVJUOgotCQkJCXJldHVybiBQUkVfTEVWRUxFRF9TVEFSVF9FREVGQVVMVCA9PSBudWxsID8gcHJlTGV2ZWxlZFN0YXJ0ICE9IG51bGwgOiAhUFJFX0xFVkVMRURfU1RBUlRfRURFRkFVTFQuZXF1YWxzKHByZUxldmVsZWRTdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFX0xFVkVMRURfRklOSVNIOgotCQkJCXJldHVybiBQUkVfTEVWRUxFRF9GSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IHByZUxldmVsZWRGaW5pc2ggIT0gbnVsbCA6ICFQUkVfTEVWRUxFRF9GSU5JU0hfRURFRkFVTFQuZXF1YWxzKHByZUxldmVsZWRGaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOSzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmsgIT0gbnVsbCA6ICFIWVBFUkxJTktfRURFRkFVTFQuZXF1YWxzKGh5cGVybGluayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJcmV0dXJuIEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmtBZGRyZXNzICE9IG51bGwgOiAhSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQuZXF1YWxzKGh5cGVybGlua0FkZHJlc3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmtTdWJBZGRyZXNzICE9IG51bGwgOiAhSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmtTdWJBZGRyZXNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVI6Ci0JCQkJcmV0dXJuIGlzU2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05PVEVTOgotCQkJCXJldHVybiBOT1RFU19FREVGQVVMVCA9PSBudWxsID8gbm90ZXMgIT0gbnVsbCA6ICFOT1RFU19FREVGQVVMVC5lcXVhbHMobm90ZXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hJREVfQkFSOgotCQkJCXJldHVybiBpc1NldEhpZGVCYXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ST0xMVVA6Ci0JCQkJcmV0dXJuIGlzU2V0Um9sbHVwKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUzoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUDoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURToKLQkJCQlyZXR1cm4gUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCA9PSBudWxsID8gcGh5c2ljYWxQZXJjZW50Q29tcGxldGUgIT0gbnVsbCA6ICFQSFlTSUNBTF9QRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTkVEX1ZBTFVFX01FVEhPRDoKLQkJCQlyZXR1cm4gRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVCA9PSBudWxsID8gZWFybmVkVmFsdWVNZXRob2QgIT0gbnVsbCA6ICFFQVJORURfVkFMVUVfTUVUSE9EX0VERUZBVUxULmVxdWFscyhlYXJuZWRWYWx1ZU1ldGhvZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFREVDRVNTT1JfTElOSzoKLQkJCQlyZXR1cm4gcHJlZGVjZXNzb3JMaW5rICE9IG51bGwgJiYgIXByZWRlY2Vzc29yTGluay5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZSAhPSBudWxsICYmICFleHRlbmRlZEF0dHJpYnV0ZS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkFTRUxJTkU6Ci0JCQkJcmV0dXJuIGJhc2VsaW5lICE9IG51bGwgJiYgIWJhc2VsaW5lLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0NPREU6Ci0JCQkJcmV0dXJuIG91dGxpbmVDb2RlICE9IG51bGwgJiYgIW91dGxpbmVDb2RlLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhICE9IG51bGwgJiYgIXRpbWVwaGFzZWREYXRhLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzTnVsbDogIik7Ci0JCWlmIChpc051bGxFU2V0KSByZXN1bHQuYXBwZW5kKGlzTnVsbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNyZWF0ZURhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNyZWF0ZURhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnRhY3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnRhY3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdCUzogIik7Ci0JCXJlc3VsdC5hcHBlbmQod0JTKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3QlNMZXZlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQod0JTTGV2ZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG91dGxpbmVOdW1iZXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG91dGxpbmVOdW1iZXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG91dGxpbmVMZXZlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3V0bGluZUxldmVsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmlvcml0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJpb3JpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZHVyYXRpb25Gb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGR1cmF0aW9uRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdG9wOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdG9wKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXN1bWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc3VtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzdW1lVmFsaWQ6ICIpOwotCQlpZiAocmVzdW1lVmFsaWRFU2V0KSByZXN1bHQuYXBwZW5kKHJlc3VtZVZhbGlkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWZmb3J0RHJpdmVuOiAiKTsKLQkJaWYgKGVmZm9ydERyaXZlbkVTZXQpIHJlc3VsdC5hcHBlbmQoZWZmb3J0RHJpdmVuKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVjdXJyaW5nOiAiKTsKLQkJaWYgKHJlY3VycmluZ0VTZXQpIHJlc3VsdC5hcHBlbmQocmVjdXJyaW5nKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlckFsbG9jYXRlZDogIik7Ci0JCWlmIChvdmVyQWxsb2NhdGVkRVNldCkgcmVzdWx0LmFwcGVuZChvdmVyQWxsb2NhdGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXN0aW1hdGVkOiAiKTsKLQkJaWYgKGVzdGltYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQoZXN0aW1hdGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWlsZXN0b25lOiAiKTsKLQkJaWYgKG1pbGVzdG9uZUVTZXQpIHJlc3VsdC5hcHBlbmQobWlsZXN0b25lKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3VtbWFyeTogIik7Ci0JCWlmIChzdW1tYXJ5RVNldCkgcmVzdWx0LmFwcGVuZChzdW1tYXJ5KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3JpdGljYWw6ICIpOwotCQlpZiAoY3JpdGljYWxFU2V0KSByZXN1bHQuYXBwZW5kKGNyaXRpY2FsKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNTdWJwcm9qZWN0OiAiKTsKLQkJaWYgKGlzU3VicHJvamVjdEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNTdWJwcm9qZWN0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNTdWJwcm9qZWN0UmVhZE9ubHk6ICIpOwotCQlpZiAoaXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0KSByZXN1bHQuYXBwZW5kKGlzU3VicHJvamVjdFJlYWRPbmx5KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3VicHJvamVjdE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN1YnByb2plY3ROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHRlcm5hbFRhc2s6ICIpOwotCQlpZiAoZXh0ZXJuYWxUYXNrRVNldCkgcmVzdWx0LmFwcGVuZChleHRlcm5hbFRhc2spOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHRlcm5hbFRhc2tQcm9qZWN0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleHRlcm5hbFRhc2tQcm9qZWN0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlYXJseVN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlYXJseVN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlYXJseUZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWFybHlGaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhdGVTdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGF0ZVN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYXRlRmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYXRlRmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydFZhcmlhbmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydFZhcmlhbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2hWYXJpYW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoVmFyaWFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtWYXJpYW5jZTogIik7Ci0JCWlmICh3b3JrVmFyaWFuY2VFU2V0KSByZXN1bHQuYXBwZW5kKHdvcmtWYXJpYW5jZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZyZWVTbGFjazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZnJlZVNsYWNrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0b3RhbFNsYWNrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0b3RhbFNsYWNrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaXhlZENvc3Q6ICIpOwotCQlpZiAoZml4ZWRDb3N0RVNldCkgcmVzdWx0LmFwcGVuZChmaXhlZENvc3QpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaXhlZENvc3RBY2NydWFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaXhlZENvc3RBY2NydWFsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwZXJjZW50Q29tcGxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBlcmNlbnRDb21wbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyY2VudFdvcmtDb21wbGV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGVyY2VudFdvcmtDb21wbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZUNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxTdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsU3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbEZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsRmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxEdXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsRHVyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbENvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbENvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVndWxhcldvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlZ3VsYXJXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdEdXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nRHVyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ0Nvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ0Nvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ1dvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ1dvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ092ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYUNXUDogIik7Ci0JCWlmIChhQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChhQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY1Y6ICIpOwotCQlpZiAoY1ZFU2V0KSByZXN1bHQuYXBwZW5kKGNWKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29uc3RyYWludFR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnN0cmFpbnRUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYWxlbmRhclVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FsZW5kYXJVSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnN0cmFpbnREYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb25zdHJhaW50RGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVhZGxpbmU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlYWRsaW5lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbEFzc2lnbm1lbnRzOiAiKTsKLQkJaWYgKGxldmVsQXNzaWdubWVudHNFU2V0KSByZXN1bHQuYXBwZW5kKGxldmVsQXNzaWdubWVudHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0NhblNwbGl0OiAiKTsKLQkJaWYgKGxldmVsaW5nQ2FuU3BsaXRFU2V0KSByZXN1bHQuYXBwZW5kKGxldmVsaW5nQ2FuU3BsaXQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0RlbGF5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbGluZ0RlbGF5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0RlbGF5Rm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbGluZ0RlbGF5Rm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmVMZXZlbGVkU3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZUxldmVsZWRTdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJlTGV2ZWxlZEZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlTGV2ZWxlZEZpbmlzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHlwZXJsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua0FkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua0FkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua1N1YkFkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlnbm9yZVJlc291cmNlQ2FsZW5kYXI6ICIpOwotCQlpZiAoaWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQpIHJlc3VsdC5hcHBlbmQoaWdub3JlUmVzb3VyY2VDYWxlbmRhcik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vdGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaGlkZUJhcjogIik7Ci0JCWlmIChoaWRlQmFyRVNldCkgcmVzdWx0LmFwcGVuZChoaWRlQmFyKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcm9sbHVwOiAiKTsKLQkJaWYgKHJvbGx1cEVTZXQpIHJlc3VsdC5hcHBlbmQocm9sbHVwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGh5c2ljYWxQZXJjZW50Q29tcGxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBoeXNpY2FsUGVyY2VudENvbXBsZXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlYXJuZWRWYWx1ZU1ldGhvZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWFybmVkVmFsdWVNZXRob2QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbFdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGFza0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Rhc2tzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGFza3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1NTQyYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGFza3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrc0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2tzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza3NJbXBsI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFRhc2tzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXNrKCkgPGVtPlRhc2s8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRhc2sgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRhc2soKSB7Ci0JCWlmICh0YXNrID09IG51bGwpIHsKLQkJCXRhc2sgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGFzay5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5UQVNLU19fVEFTSyk7Ci0JCX0KLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTX19UQVNLOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRhc2soKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTX19UQVNLOgotCQkJCXJldHVybiBnZXRUYXNrKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTX19UQVNLOgotCQkJCWdldFRhc2soKS5jbGVhcigpOwotCQkJCWdldFRhc2soKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS1NfX1RBU0s6Ci0JCQkJZ2V0VGFzaygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS1NfX1RBU0s6Ci0JCQkJcmV0dXJuIHRhc2sgIT0gbnVsbCAmJiAhdGFzay5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1Rhc2tzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGltZVBlcmlvZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1RpbWVQZXJpb2RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjZWY2MjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGltZVBlcmlvZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRpbWVQZXJpb2RJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lUGVyaW9kSW1wbCNnZXRGcm9tRGF0ZSA8ZW0+RnJvbSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZVBlcmlvZEltcGwjZ2V0VG9EYXRlIDxlbT5UbyBEYXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGltZVBlcmlvZEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFRpbWVQZXJpb2QgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcm9tRGF0ZSgpIDxlbT5Gcm9tIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZyb21EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGUk9NX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnJvbURhdGUoKSA8ZW0+RnJvbSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGcm9tRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmcm9tRGF0ZSA9IEZST01fREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb0RhdGUoKSA8ZW0+VG8gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBUT19EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvRGF0ZSgpIDxlbT5UbyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb0RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgdG9EYXRlID0gVE9fREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUaW1lUGVyaW9kSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFRpbWVQZXJpb2QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZyb21EYXRlKCkgewotCQlyZXR1cm4gZnJvbURhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RnJvbURhdGUoT2JqZWN0IG5ld0Zyb21EYXRlKSB7Ci0JCU9iamVjdCBvbGRGcm9tRGF0ZSA9IGZyb21EYXRlOwotCQlmcm9tRGF0ZSA9IG5ld0Zyb21EYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19GUk9NX0RBVEUsIG9sZEZyb21EYXRlLCBmcm9tRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VG9EYXRlKCkgewotCQlyZXR1cm4gdG9EYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvRGF0ZShPYmplY3QgbmV3VG9EYXRlKSB7Ci0JCU9iamVjdCBvbGRUb0RhdGUgPSB0b0RhdGU7Ci0JCXRvRGF0ZSA9IG5ld1RvRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fVE9fREFURSwgb2xkVG9EYXRlLCB0b0RhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX0ZST01fREFURToKLQkJCQlyZXR1cm4gZ2V0RnJvbURhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fVE9fREFURToKLQkJCQlyZXR1cm4gZ2V0VG9EYXRlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19GUk9NX0RBVEU6Ci0JCQkJc2V0RnJvbURhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19UT19EQVRFOgotCQkJCXNldFRvRGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19GUk9NX0RBVEU6Ci0JCQkJc2V0RnJvbURhdGUoRlJPTV9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX1RPX0RBVEU6Ci0JCQkJc2V0VG9EYXRlKFRPX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19GUk9NX0RBVEU6Ci0JCQkJcmV0dXJuIEZST01fREFURV9FREVGQVVMVCA9PSBudWxsID8gZnJvbURhdGUgIT0gbnVsbCA6ICFGUk9NX0RBVEVfRURFRkFVTFQuZXF1YWxzKGZyb21EYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fVE9fREFURToKLQkJCQlyZXR1cm4gVE9fREFURV9FREVGQVVMVCA9PSBudWxsID8gdG9EYXRlICE9IG51bGwgOiAhVE9fREFURV9FREVGQVVMVC5lcXVhbHModG9EYXRlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZyb21EYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmcm9tRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdG9EYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0b0RhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UaW1lUGVyaW9kSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGltZXBoYXNlZERhdGFUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGltZXBoYXNlZERhdGFUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMTU4N2IxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1RpbWVwaGFzZWREYXRhVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRpbWVwaGFzZWREYXRhVHlwZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbCNnZXRVbml0IDxlbT5Vbml0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lcGhhc2VkRGF0YVR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUaW1lcGhhc2VkRGF0YVR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbml0KCkgPGVtPlVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVTklUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaXQoKSA8ZW0+VW5pdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdW5pdCA9IFVOSVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUaW1lcGhhc2VkRGF0YVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGltZXBoYXNlZERhdGFUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIG5ld1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoT2JqZWN0IG5ld1N0YXJ0KSB7Ci0JCU9iamVjdCBvbGRTdGFydCA9IHN0YXJ0OwotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19TVEFSVCwgb2xkU3RhcnQsIHN0YXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGaW5pc2goKSB7Ci0JCXJldHVybiBmaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoKE9iamVjdCBuZXdGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZEZpbmlzaCA9IGZpbmlzaDsKLQkJZmluaXNoID0gbmV3RmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19GSU5JU0gsIG9sZEZpbmlzaCwgZmluaXNoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VW5pdCgpIHsKLQkJcmV0dXJuIHVuaXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5pdChCaWdJbnRlZ2VyIG5ld1VuaXQpIHsKLQkJQmlnSW50ZWdlciBvbGRVbml0ID0gdW5pdDsKLQkJdW5pdCA9IG5ld1VuaXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VOSVQsIG9sZFVuaXQsIHVuaXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1NUQVJUOgotCQkJCXJldHVybiBnZXRTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19VTklUOgotCQkJCXJldHVybiBnZXRVbml0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVFlQRToKLQkJCQlzZXRUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVU5JVDoKLQkJCQlzZXRVbml0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1NUQVJUOgotCQkJCXNldFN0YXJ0KFNUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VOSVQ6Ci0JCQkJc2V0VW5pdChVTklUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19TVEFSVDoKLQkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fRklOSVNIOgotCQkJCXJldHVybiBGSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaCAhPSBudWxsIDogIUZJTklTSF9FREVGQVVMVC5lcXVhbHMoZmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVU5JVDoKLQkJCQlyZXR1cm4gVU5JVF9FREVGQVVMVCA9PSBudWxsID8gdW5pdCAhPSBudWxsIDogIVVOSVRfRURFRkFVTFQuZXF1YWxzKHVuaXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1bml0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1bml0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UaW1lcGhhc2VkRGF0YVR5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZTJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlNGYwMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWUySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFsdWUySW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZTJJbXBsI2dldElEIDxlbT5JRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlMkltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWUySW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZTJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBWYWx1ZTIgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJRCgpIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJRCgpIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGlEID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlMkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZTIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRJRCgpIHsKLQkJcmV0dXJuIGlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElEKEJpZ0ludGVnZXIgbmV3SUQpIHsKLQkJQmlnSW50ZWdlciBvbGRJRCA9IGlEOwotCQlpRCA9IG5ld0lEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fSUQsIG9sZElELCBpRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19JRDoKLQkJCQlyZXR1cm4gZ2V0SUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fSUQ6Ci0JCQkJc2V0SUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19JRDoKLQkJCQlzZXRJRChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaUQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9WYWx1ZTJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMTAzZDA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFsdWVJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUltcGwjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUltcGwjZ2V0UGFyZW50VmFsdWVJRCA8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlSW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFZhbHVlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFZBTFVFX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHZhbHVlSUQgPSBWQUxVRV9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJlbnRWYWx1ZUlEKCkgPGVtPlBhcmVudCBWYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyZW50VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFBBUkVOVF9WQUxVRV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJlbnRWYWx1ZUlEKCkgPGVtPlBhcmVudCBWYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyZW50VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgcGFyZW50VmFsdWVJRCA9IFBBUkVOVF9WQUxVRV9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFsdWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCkgewotCQlyZXR1cm4gdmFsdWVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgbmV3VmFsdWVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFZhbHVlSUQgPSB2YWx1ZUlEOwotCQl2YWx1ZUlEID0gbmV3VmFsdWVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUVfSUQsIG9sZFZhbHVlSUQsIHZhbHVlSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQYXJlbnRWYWx1ZUlEKCkgewotCQlyZXR1cm4gcGFyZW50VmFsdWVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRWYWx1ZUlEKEJpZ0ludGVnZXIgbmV3UGFyZW50VmFsdWVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFBhcmVudFZhbHVlSUQgPSBwYXJlbnRWYWx1ZUlEOwotCQlwYXJlbnRWYWx1ZUlEID0gbmV3UGFyZW50VmFsdWVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fUEFSRU5UX1ZBTFVFX0lELCBvbGRQYXJlbnRWYWx1ZUlELCBwYXJlbnRWYWx1ZUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBnZXRWYWx1ZUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1BBUkVOVF9WQUxVRV9JRDoKLQkJCQlyZXR1cm4gZ2V0UGFyZW50VmFsdWVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1BBUkVOVF9WQUxVRV9JRDoKLQkJCQlzZXRQYXJlbnRWYWx1ZUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRChWQUxVRV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19QQVJFTlRfVkFMVUVfSUQ6Ci0JCQkJc2V0UGFyZW50VmFsdWVJRChQQVJFTlRfVkFMVUVfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gVkFMVUVfSURfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlSUQgIT0gbnVsbCA6ICFWQUxVRV9JRF9FREVGQVVMVC5lcXVhbHModmFsdWVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1BBUkVOVF9WQUxVRV9JRDoKLQkJCQlyZXR1cm4gUEFSRU5UX1ZBTFVFX0lEX0VERUZBVUxUID09IG51bGwgPyBwYXJlbnRWYWx1ZUlEICE9IG51bGwgOiAhUEFSRU5UX1ZBTFVFX0lEX0VERUZBVUxULmVxdWFscyhwYXJlbnRWYWx1ZUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFsdWVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyZW50VmFsdWVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFyZW50VmFsdWVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9WYWx1ZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlTGlzdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjZjMWNlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWYWx1ZUxpc3RJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZSBMaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVMaXN0SW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZUxpc3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBWYWx1ZUxpc3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdmFsdWUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VmFsdWUoKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl2YWx1ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChWYWx1ZTIuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVF9fVkFMVUUpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVF9fVkFMVUU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VmFsdWUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1RfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9MSVNUX19WQUxVRToKLQkJCQlnZXRWYWx1ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VmFsdWUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVF9fVkFMVUU6Ci0JCQkJZ2V0VmFsdWUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1RfX1ZBTFVFOgotCQkJCXJldHVybiB2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1ZhbHVlTGlzdEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2MwZjg0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWYWx1ZXNJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZXNJbXBsI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlc0ltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVmFsdWVzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cCgpIHsKLQkJaWYgKGdyb3VwID09IG51bGwpIHsKLQkJCWdyb3VwID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fR1JPVVApOwotCQl9Ci0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZXNfVmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fR1JPVVA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX1ZBTFVFOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFZhbHVlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fR1JPVVA6Ci0JCQkJZ2V0R3JvdXAoKS5jbGVhcigpOwotCQkJCWdldEdyb3VwKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTX19WQUxVRToKLQkJCQlnZXRWYWx1ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VmFsdWUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fVkFMVUU6Ci0JCQkJZ2V0VmFsdWUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fR1JPVVA6Ci0JCQkJcmV0dXJuIGdyb3VwICE9IG51bGwgJiYgIWdyb3VwLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX1ZBTFVFOgotCQkJCXJldHVybiAhZ2V0VmFsdWUoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXApOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9WYWx1ZXNJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XQlNNYXNrSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV0JTTWFza0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWZkNjIwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XQlNNYXNrSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV0JTTWFza0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzazsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldCUyBNYXNrPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza0ltcGwjZ2V0TGV2ZWwgPGVtPkxldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza0ltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tJbXBsI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza0ltcGwjZ2V0U2VwYXJhdG9yIDxlbT5TZXBhcmF0b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNNYXNrSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV0JTTWFzayB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsKCkgPGVtPkxldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIExFVkVMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsKCkgPGVtPkxldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbGV2ZWwgPSBMRVZFTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGVuZ3RoKCkgPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGVuZ3RoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMRU5HVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGVuZ3RoKCkgPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGVuZ3RoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxlbmd0aCA9IExFTkdUSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXBhcmF0b3IoKSA8ZW0+U2VwYXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXBhcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXBhcmF0b3IoKSA8ZW0+U2VwYXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXBhcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VwYXJhdG9yID0gU0VQQVJBVE9SX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdCU01hc2tJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V0JTTWFzaygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExldmVsKCkgewotCQlyZXR1cm4gbGV2ZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWwoQmlnSW50ZWdlciBuZXdMZXZlbCkgewotCQlCaWdJbnRlZ2VyIG9sZExldmVsID0gbGV2ZWw7Ci0JCWxldmVsID0gbmV3TGV2ZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFVkVMLCBvbGRMZXZlbCwgbGV2ZWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgbmV3VHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChTdHJpbmcgbmV3TGVuZ3RoKSB7Ci0JCVN0cmluZyBvbGRMZW5ndGggPSBsZW5ndGg7Ci0JCWxlbmd0aCA9IG5ld0xlbmd0aDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVOR1RILCBvbGRMZW5ndGgsIGxlbmd0aCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VwYXJhdG9yKCkgewotCQlyZXR1cm4gc2VwYXJhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcGFyYXRvcihTdHJpbmcgbmV3U2VwYXJhdG9yKSB7Ci0JCVN0cmluZyBvbGRTZXBhcmF0b3IgPSBzZXBhcmF0b3I7Ci0JCXNlcGFyYXRvciA9IG5ld1NlcGFyYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fU0VQQVJBVE9SLCBvbGRTZXBhcmF0b3IsIHNlcGFyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVWRUw6Ci0JCQkJcmV0dXJuIGdldExldmVsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVOR1RIOgotCQkJCXJldHVybiBnZXRMZW5ndGgoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fU0VQQVJBVE9SOgotCQkJCXJldHVybiBnZXRTZXBhcmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFVkVMOgotCQkJCXNldExldmVsKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRU5HVEg6Ci0JCQkJc2V0TGVuZ3RoKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fU0VQQVJBVE9SOgotCQkJCXNldFNlcGFyYXRvcigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRVZFTDoKLQkJCQlzZXRMZXZlbChMRVZFTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRU5HVEg6Ci0JCQkJc2V0TGVuZ3RoKExFTkdUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19TRVBBUkFUT1I6Ci0JCQkJc2V0U2VwYXJhdG9yKFNFUEFSQVRPUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFVkVMOgotCQkJCXJldHVybiBMRVZFTF9FREVGQVVMVCA9PSBudWxsID8gbGV2ZWwgIT0gbnVsbCA6ICFMRVZFTF9FREVGQVVMVC5lcXVhbHMobGV2ZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFTkdUSDoKLQkJCQlyZXR1cm4gTEVOR1RIX0VERUZBVUxUID09IG51bGwgPyBsZW5ndGggIT0gbnVsbCA6ICFMRU5HVEhfRURFRkFVTFQuZXF1YWxzKGxlbmd0aCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1NFUEFSQVRPUjoKLQkJCQlyZXR1cm4gU0VQQVJBVE9SX0VERUZBVUxUID09IG51bGwgPyBzZXBhcmF0b3IgIT0gbnVsbCA6ICFTRVBBUkFUT1JfRURFRkFVTFQuZXF1YWxzKHNlcGFyYXRvcik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsZXZlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGV2ZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxlbmd0aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGVuZ3RoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXBhcmF0b3I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlcGFyYXRvcik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dCU01hc2tJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XQlNNYXNrc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dCU01hc2tzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOTFmNTE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dCU01hc2tzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV0JTTWFza3NJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V0JTIE1hc2tzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza3NJbXBsI2lzVmVyaWZ5VW5pcXVlQ29kZXMgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrc0ltcGwjaXNHZW5lcmF0ZUNvZGVzIDxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbCNnZXRXQlNNYXNrIDxlbT5XQlMgTWFzazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdCU01hc2tzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV0JTTWFza3MgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJJRllfVU5JUVVFX0NPREVTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZlcmlmeVVuaXF1ZUNvZGVzID0gVkVSSUZZX1VOSVFVRV9DT0RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVmVyaWZ5IFVuaXF1ZSBDb2RlcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5VW5pcXVlQ29kZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUNvZGVzKCkgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0dlbmVyYXRlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9DT0RFU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUNvZGVzKCkgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0dlbmVyYXRlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlQ29kZXMgPSBHRU5FUkFURV9DT0RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgR2VuZXJhdGUgQ29kZXMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlQ29kZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCA9IFBSRUZJWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdCU01hc2soKSA8ZW0+V0JTIE1hc2s8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V0JTTWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHdCU01hc2sgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdCU01hc2tzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdCU01hc2tzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWZXJpZnlVbmlxdWVDb2RlcygpIHsKLQkJcmV0dXJuIHZlcmlmeVVuaXF1ZUNvZGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcmlmeVVuaXF1ZUNvZGVzKGJvb2xlYW4gbmV3VmVyaWZ5VW5pcXVlQ29kZXMpIHsKLQkJYm9vbGVhbiBvbGRWZXJpZnlVbmlxdWVDb2RlcyA9IHZlcmlmeVVuaXF1ZUNvZGVzOwotCQl2ZXJpZnlVbmlxdWVDb2RlcyA9IG5ld1ZlcmlmeVVuaXF1ZUNvZGVzOwotCQlib29sZWFuIG9sZFZlcmlmeVVuaXF1ZUNvZGVzRVNldCA9IHZlcmlmeVVuaXF1ZUNvZGVzRVNldDsKLQkJdmVyaWZ5VW5pcXVlQ29kZXNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVMsIG9sZFZlcmlmeVVuaXF1ZUNvZGVzLCB2ZXJpZnlVbmlxdWVDb2RlcywgIW9sZFZlcmlmeVVuaXF1ZUNvZGVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VmVyaWZ5VW5pcXVlQ29kZXMoKSB7Ci0JCWJvb2xlYW4gb2xkVmVyaWZ5VW5pcXVlQ29kZXMgPSB2ZXJpZnlVbmlxdWVDb2RlczsKLQkJYm9vbGVhbiBvbGRWZXJpZnlVbmlxdWVDb2Rlc0VTZXQgPSB2ZXJpZnlVbmlxdWVDb2Rlc0VTZXQ7Ci0JCXZlcmlmeVVuaXF1ZUNvZGVzID0gVkVSSUZZX1VOSVFVRV9DT0RFU19FREVGQVVMVDsKLQkJdmVyaWZ5VW5pcXVlQ29kZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVMsIG9sZFZlcmlmeVVuaXF1ZUNvZGVzLCBWRVJJRllfVU5JUVVFX0NPREVTX0VERUZBVUxULCBvbGRWZXJpZnlVbmlxdWVDb2Rlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFZlcmlmeVVuaXF1ZUNvZGVzKCkgewotCQlyZXR1cm4gdmVyaWZ5VW5pcXVlQ29kZXNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVDb2RlcygpIHsKLQkJcmV0dXJuIGdlbmVyYXRlQ29kZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVDb2Rlcyhib29sZWFuIG5ld0dlbmVyYXRlQ29kZXMpIHsKLQkJYm9vbGVhbiBvbGRHZW5lcmF0ZUNvZGVzID0gZ2VuZXJhdGVDb2RlczsKLQkJZ2VuZXJhdGVDb2RlcyA9IG5ld0dlbmVyYXRlQ29kZXM7Ci0JCWJvb2xlYW4gb2xkR2VuZXJhdGVDb2Rlc0VTZXQgPSBnZW5lcmF0ZUNvZGVzRVNldDsKLQkJZ2VuZXJhdGVDb2Rlc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fR0VORVJBVEVfQ09ERVMsIG9sZEdlbmVyYXRlQ29kZXMsIGdlbmVyYXRlQ29kZXMsICFvbGRHZW5lcmF0ZUNvZGVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0R2VuZXJhdGVDb2RlcygpIHsKLQkJYm9vbGVhbiBvbGRHZW5lcmF0ZUNvZGVzID0gZ2VuZXJhdGVDb2RlczsKLQkJYm9vbGVhbiBvbGRHZW5lcmF0ZUNvZGVzRVNldCA9IGdlbmVyYXRlQ29kZXNFU2V0OwotCQlnZW5lcmF0ZUNvZGVzID0gR0VORVJBVEVfQ09ERVNfRURFRkFVTFQ7Ci0JCWdlbmVyYXRlQ29kZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX0dFTkVSQVRFX0NPREVTLCBvbGRHZW5lcmF0ZUNvZGVzLCBHRU5FUkFURV9DT0RFU19FREVGQVVMVCwgb2xkR2VuZXJhdGVDb2Rlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEdlbmVyYXRlQ29kZXMoKSB7Ci0JCXJldHVybiBnZW5lcmF0ZUNvZGVzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIHByZWZpeDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIG5ld1ByZWZpeCkgewotCQlTdHJpbmcgb2xkUHJlZml4ID0gcHJlZml4OwotCQlwcmVmaXggPSBuZXdQcmVmaXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19QUkVGSVgsIG9sZFByZWZpeCwgcHJlZml4KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFdCU01hc2soKSB7Ci0JCWlmICh3QlNNYXNrID09IG51bGwpIHsKLQkJCXdCU01hc2sgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoV0JTTWFzay5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1dCU19NQVNLKTsKLQkJfQotCQlyZXR1cm4gd0JTTWFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19XQlNfTUFTSzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRXQlNNYXNrKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVM6Ci0JCQkJcmV0dXJuIGlzVmVyaWZ5VW5pcXVlQ29kZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19HRU5FUkFURV9DT0RFUzoKLQkJCQlyZXR1cm4gaXNHZW5lcmF0ZUNvZGVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fUFJFRklYOgotCQkJCXJldHVybiBnZXRQcmVmaXgoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1dCU19NQVNLOgotCQkJCXJldHVybiBnZXRXQlNNYXNrKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fVkVSSUZZX1VOSVFVRV9DT0RFUzoKLQkJCQlzZXRWZXJpZnlVbmlxdWVDb2RlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19HRU5FUkFURV9DT0RFUzoKLQkJCQlzZXRHZW5lcmF0ZUNvZGVzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1BSRUZJWDoKLQkJCQlzZXRQcmVmaXgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fV0JTX01BU0s6Ci0JCQkJZ2V0V0JTTWFzaygpLmNsZWFyKCk7Ci0JCQkJZ2V0V0JTTWFzaygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVM6Ci0JCQkJdW5zZXRWZXJpZnlVbmlxdWVDb2RlcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX0dFTkVSQVRFX0NPREVTOgotCQkJCXVuc2V0R2VuZXJhdGVDb2RlcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1BSRUZJWDoKLQkJCQlzZXRQcmVmaXgoUFJFRklYX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19XQlNfTUFTSzoKLQkJCQlnZXRXQlNNYXNrKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVM6Ci0JCQkJcmV0dXJuIGlzU2V0VmVyaWZ5VW5pcXVlQ29kZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX0dFTkVSQVRFX0NPREVTOgotCQkJCXJldHVybiBpc1NldEdlbmVyYXRlQ29kZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1BSRUZJWDoKLQkJCQlyZXR1cm4gUFJFRklYX0VERUZBVUxUID09IG51bGwgPyBwcmVmaXggIT0gbnVsbCA6ICFQUkVGSVhfRURFRkFVTFQuZXF1YWxzKHByZWZpeCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19XQlNfTUFTSzoKLQkJCQlyZXR1cm4gd0JTTWFzayAhPSBudWxsICYmICF3QlNNYXNrLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZlcmlmeVVuaXF1ZUNvZGVzOiAiKTsKLQkJaWYgKHZlcmlmeVVuaXF1ZUNvZGVzRVNldCkgcmVzdWx0LmFwcGVuZCh2ZXJpZnlVbmlxdWVDb2Rlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlQ29kZXM6ICIpOwotCQlpZiAoZ2VuZXJhdGVDb2Rlc0VTZXQpIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVDb2Rlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZWZpeDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlZml4KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV0JTTWFza3NJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV2Vla0RheUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjk3NmRhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV2Vla0RheUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlZWsgRGF5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheUltcGwjZ2V0RGF5VHlwZSA8ZW0+RGF5IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XZWVrRGF5SW1wbCNpc0RheVdvcmtpbmcgPGVtPkRheSBXb3JraW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheUltcGwjZ2V0VGltZVBlcmlvZCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XZWVrRGF5SW1wbCNnZXRXb3JraW5nVGltZXMgPGVtPldvcmtpbmcgVGltZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWVrRGF5SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV2Vla0RheSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERheVR5cGUoKSA8ZW0+RGF5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERheVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEQVlfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXlUeXBlKCkgPGVtPkRheSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkYXlUeXBlID0gREFZX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEYXlXb3JraW5nKCkgPGVtPkRheSBXb3JraW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0RheVdvcmtpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQVlfV09SS0lOR19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEYXlXb3JraW5nKCkgPGVtPkRheSBXb3JraW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0RheVdvcmtpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRheVdvcmtpbmcgPSBEQVlfV09SS0lOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRGF5IFdvcmtpbmcgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRheVdvcmtpbmdFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lUGVyaW9kKCkgPGVtPlRpbWUgUGVyaW9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lUGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGltZVBlcmlvZCB0aW1lUGVyaW9kID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtpbmdUaW1lcygpIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JraW5nVGltZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXb3JraW5nVGltZXMgd29ya2luZ1RpbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXZWVrRGF5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlZWtEYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREYXlUeXBlKCkgewotCQlyZXR1cm4gZGF5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXlUeXBlKEJpZ0ludGVnZXIgbmV3RGF5VHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZERheVR5cGUgPSBkYXlUeXBlOwotCQlkYXlUeXBlID0gbmV3RGF5VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1RZUEUsIG9sZERheVR5cGUsIGRheVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RheVdvcmtpbmcoKSB7Ci0JCXJldHVybiBkYXlXb3JraW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERheVdvcmtpbmcoYm9vbGVhbiBuZXdEYXlXb3JraW5nKSB7Ci0JCWJvb2xlYW4gb2xkRGF5V29ya2luZyA9IGRheVdvcmtpbmc7Ci0JCWRheVdvcmtpbmcgPSBuZXdEYXlXb3JraW5nOwotCQlib29sZWFuIG9sZERheVdvcmtpbmdFU2V0ID0gZGF5V29ya2luZ0VTZXQ7Ci0JCWRheVdvcmtpbmdFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1dPUktJTkcsIG9sZERheVdvcmtpbmcsIGRheVdvcmtpbmcsICFvbGREYXlXb3JraW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RGF5V29ya2luZygpIHsKLQkJYm9vbGVhbiBvbGREYXlXb3JraW5nID0gZGF5V29ya2luZzsKLQkJYm9vbGVhbiBvbGREYXlXb3JraW5nRVNldCA9IGRheVdvcmtpbmdFU2V0OwotCQlkYXlXb3JraW5nID0gREFZX1dPUktJTkdfRURFRkFVTFQ7Ci0JCWRheVdvcmtpbmdFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1dPUktJTkcsIG9sZERheVdvcmtpbmcsIERBWV9XT1JLSU5HX0VERUZBVUxULCBvbGREYXlXb3JraW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RGF5V29ya2luZygpIHsKLQkJcmV0dXJuIGRheVdvcmtpbmdFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUaW1lUGVyaW9kIGdldFRpbWVQZXJpb2QoKSB7Ci0JCXJldHVybiB0aW1lUGVyaW9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRpbWVQZXJpb2QoVGltZVBlcmlvZCBuZXdUaW1lUGVyaW9kLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVRpbWVQZXJpb2Qgb2xkVGltZVBlcmlvZCA9IHRpbWVQZXJpb2Q7Ci0JCXRpbWVQZXJpb2QgPSBuZXdUaW1lUGVyaW9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19USU1FX1BFUklPRCwgb2xkVGltZVBlcmlvZCwgbmV3VGltZVBlcmlvZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGltZVBlcmlvZChUaW1lUGVyaW9kIG5ld1RpbWVQZXJpb2QpIHsKLQkJaWYgKG5ld1RpbWVQZXJpb2QgIT0gdGltZVBlcmlvZCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodGltZVBlcmlvZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0aW1lUGVyaW9kKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1RpbWVQZXJpb2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VGltZVBlcmlvZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9ELCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFRpbWVQZXJpb2QobmV3VGltZVBlcmlvZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19USU1FX1BFUklPRCwgbmV3VGltZVBlcmlvZCwgbmV3VGltZVBlcmlvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JraW5nVGltZXMgZ2V0V29ya2luZ1RpbWVzKCkgewotCQlyZXR1cm4gd29ya2luZ1RpbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMgbmV3V29ya2luZ1RpbWVzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdvcmtpbmdUaW1lcyBvbGRXb3JraW5nVGltZXMgPSB3b3JraW5nVGltZXM7Ci0JCXdvcmtpbmdUaW1lcyA9IG5ld1dvcmtpbmdUaW1lczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUywgb2xkV29ya2luZ1RpbWVzLCBuZXdXb3JraW5nVGltZXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMgbmV3V29ya2luZ1RpbWVzKSB7Ci0JCWlmIChuZXdXb3JraW5nVGltZXMgIT0gd29ya2luZ1RpbWVzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh3b3JraW5nVGltZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpd29ya2luZ1RpbWVzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3V29ya2luZ1RpbWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dvcmtpbmdUaW1lcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1dPUktJTkdfVElNRVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V29ya2luZ1RpbWVzKG5ld1dvcmtpbmdUaW1lcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTLCBuZXdXb3JraW5nVGltZXMsIG5ld1dvcmtpbmdUaW1lcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0Q6Ci0JCQkJCXJldHVybiBiYXNpY1NldFRpbWVQZXJpb2QobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRXb3JraW5nVGltZXMobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9UWVBFOgotCQkJCXJldHVybiBnZXREYXlUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9XT1JLSU5HOgotCQkJCXJldHVybiBpc0RheVdvcmtpbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9EOgotCQkJCXJldHVybiBnZXRUaW1lUGVyaW9kKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1dPUktJTkdfVElNRVM6Ci0JCQkJcmV0dXJuIGdldFdvcmtpbmdUaW1lcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1RZUEU6Ci0JCQkJc2V0RGF5VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfV09SS0lORzoKLQkJCQlzZXREYXlXb3JraW5nKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0Q6Ci0JCQkJc2V0VGltZVBlcmlvZCgoVGltZVBlcmlvZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTOgotCQkJCXNldFdvcmtpbmdUaW1lcygoV29ya2luZ1RpbWVzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfVFlQRToKLQkJCQlzZXREYXlUeXBlKERBWV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9XT1JLSU5HOgotCQkJCXVuc2V0RGF5V29ya2luZygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0Q6Ci0JCQkJc2V0VGltZVBlcmlvZCgoVGltZVBlcmlvZCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1dPUktJTkdfVElNRVM6Ci0JCQkJc2V0V29ya2luZ1RpbWVzKChXb3JraW5nVGltZXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9UWVBFOgotCQkJCXJldHVybiBEQVlfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZGF5VHlwZSAhPSBudWxsIDogIURBWV9UWVBFX0VERUZBVUxULmVxdWFscyhkYXlUeXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1dPUktJTkc6Ci0JCQkJcmV0dXJuIGlzU2V0RGF5V29ya2luZygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19USU1FX1BFUklPRDoKLQkJCQlyZXR1cm4gdGltZVBlcmlvZCAhPSBudWxsOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTOgotCQkJCXJldHVybiB3b3JraW5nVGltZXMgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRheVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRheVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRheVdvcmtpbmc6ICIpOwotCQlpZiAoZGF5V29ya2luZ0VTZXQpIHJlc3VsdC5hcHBlbmQoZGF5V29ya2luZyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9XZWVrRGF5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV2Vla0RheXNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5c0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGY0ZTdlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5c0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdlZWtEYXlzSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2VlayBEYXlzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheXNJbXBsI2dldFdlZWtEYXkgPGVtPldlZWsgRGF5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2Vla0RheXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXZWVrRGF5cyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2Vla0RheSgpIDxlbT5XZWVrIERheTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWVrRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgd2Vla0RheSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2Vla0RheXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2Vla0RheXMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0V2Vla0RheSgpIHsKLQkJaWYgKHdlZWtEYXkgPT0gbnVsbCkgewotCQkJd2Vla0RheSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChXZWVrRGF5LmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZU19fV0VFS19EQVkpOwotCQl9Ci0JCXJldHVybiB3ZWVrRGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVNfX1dFRUtfREFZOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFdlZWtEYXkoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZU19fV0VFS19EQVk6Ci0JCQkJcmV0dXJuIGdldFdlZWtEYXkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlTX19XRUVLX0RBWToKLQkJCQlnZXRXZWVrRGF5KCkuY2xlYXIoKTsKLQkJCQlnZXRXZWVrRGF5KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZU19fV0VFS19EQVk6Ci0JCQkJZ2V0V2Vla0RheSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlTX19XRUVLX0RBWToKLQkJCQlyZXR1cm4gd2Vla0RheSAhPSBudWxsICYmICF3ZWVrRGF5LmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vV2Vla0RheXNJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dvcmtpbmdUaW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjI3ZGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dvcmtpbmdUaW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya2luZ1RpbWVJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmtpbmcgVGltZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lSW1wbCNnZXRGcm9tVGltZSA8ZW0+RnJvbSBUaW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV29ya2luZ1RpbWVJbXBsI2dldFRvVGltZSA8ZW0+VG8gVGltZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtpbmdUaW1lSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV29ya2luZ1RpbWUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcm9tVGltZSgpIDxlbT5Gcm9tIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZyb21UaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGUk9NX1RJTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnJvbVRpbWUoKSA8ZW0+RnJvbSBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGcm9tVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmcm9tVGltZSA9IEZST01fVElNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb1RpbWUoKSA8ZW0+VG8gVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9UaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBUT19USU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvVGltZSgpIDxlbT5UbyBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgdG9UaW1lID0gVE9fVElNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JraW5nVGltZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JraW5nVGltZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RnJvbVRpbWUoKSB7Ci0JCXJldHVybiBmcm9tVGltZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcm9tVGltZShPYmplY3QgbmV3RnJvbVRpbWUpIHsKLQkJT2JqZWN0IG9sZEZyb21UaW1lID0gZnJvbVRpbWU7Ci0JCWZyb21UaW1lID0gbmV3RnJvbVRpbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19GUk9NX1RJTUUsIG9sZEZyb21UaW1lLCBmcm9tVGltZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VG9UaW1lKCkgewotCQlyZXR1cm4gdG9UaW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvVGltZShPYmplY3QgbmV3VG9UaW1lKSB7Ci0JCU9iamVjdCBvbGRUb1RpbWUgPSB0b1RpbWU7Ci0JCXRvVGltZSA9IG5ld1RvVGltZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX1RPX1RJTUUsIG9sZFRvVGltZSwgdG9UaW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fRlJPTV9USU1FOgotCQkJCXJldHVybiBnZXRGcm9tVGltZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fVE9fVElNRToKLQkJCQlyZXR1cm4gZ2V0VG9UaW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fRlJPTV9USU1FOgotCQkJCXNldEZyb21UaW1lKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX1RPX1RJTUU6Ci0JCQkJc2V0VG9UaW1lKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19GUk9NX1RJTUU6Ci0JCQkJc2V0RnJvbVRpbWUoRlJPTV9USU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19UT19USU1FOgotCQkJCXNldFRvVGltZShUT19USU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX0ZST01fVElNRToKLQkJCQlyZXR1cm4gRlJPTV9USU1FX0VERUZBVUxUID09IG51bGwgPyBmcm9tVGltZSAhPSBudWxsIDogIUZST01fVElNRV9FREVGQVVMVC5lcXVhbHMoZnJvbVRpbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fVE9fVElNRToKLQkJCQlyZXR1cm4gVE9fVElNRV9FREVGQVVMVCA9PSBudWxsID8gdG9UaW1lICE9IG51bGwgOiAhVE9fVElNRV9FREVGQVVMVC5lcXVhbHModG9UaW1lKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZyb21UaW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmcm9tVGltZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdG9UaW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0b1RpbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JraW5nVGltZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dvcmtpbmdUaW1lc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dvcmtpbmdUaW1lc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGE0MjczNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JraW5nVGltZXNJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmtpbmcgVGltZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Xb3JraW5nVGltZXNJbXBsI2dldFdvcmtpbmdUaW1lIDxlbT5Xb3JraW5nIFRpbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JraW5nVGltZXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXb3JraW5nVGltZXMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtpbmdUaW1lKCkgPGVtPldvcmtpbmcgVGltZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JraW5nVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHdvcmtpbmdUaW1lID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JraW5nVGltZXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya2luZ1RpbWVzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFdvcmtpbmdUaW1lKCkgewotCQlpZiAod29ya2luZ1RpbWUgPT0gbnVsbCkgewotCQkJd29ya2luZ1RpbWUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoV29ya2luZ1RpbWUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FU19fV09SS0lOR19USU1FKTsKLQkJfQotCQlyZXR1cm4gd29ya2luZ1RpbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRXb3JraW5nVGltZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FU19fV09SS0lOR19USU1FOgotCQkJCXJldHVybiBnZXRXb3JraW5nVGltZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTX19XT1JLSU5HX1RJTUU6Ci0JCQkJZ2V0V29ya2luZ1RpbWUoKS5jbGVhcigpOwotCQkJCWdldFdvcmtpbmdUaW1lKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRToKLQkJCQlnZXRXb3JraW5nVGltZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FU19fV09SS0lOR19USU1FOgotCQkJCXJldHVybiB3b3JraW5nVGltZSAhPSBudWxsICYmICF3b3JraW5nVGltZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1dvcmtpbmdUaW1lc0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL21zcHJvamVjdC5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL21zcHJvamVjdC5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzFlYmQyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9tc3Byb2plY3QuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1NTExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Im1zcHJvamVjdCIKLSAgICBuc1VSST0iaHR0cDovL2VwZi5lY2xpcHNlLm9yZy9tc3Byb2plY3QiIG5zUHJlZml4PSJtc3Byb2plY3QiPgotICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZ1bGwgcHJvamVjdCBzY2hlbWEgZGVmaW5pdGlvbiBmcm9tIHRoZSBwcm9qZWN0IGxldmVsIGRvd24sICYjeEQ7JiN4QTsmI3g5OyYjeDk7c3RhcnRpbmcgd2l0aCBkYXRhIHR5cGUgZGVmaW5pdGlvbnMuIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUFubm90YXRpb25zPgotICAgIDxkZXRhaWxzIGtleT0iYXBwaW5mbyIgdmFsdWU9IlRoZSBNaWNyb3NvZnQgUHJvamVjdCBEYXRhIEludGVyY2hhbmdlIFNjaGVtYSBmb3IgTWljcm9zb2Z0IFByb2plY3QgMTAuJiN4RDsmI3hBOyYjeDk7JiN4OTsiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQWNjcnVlQXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY2NydWVBdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkFjdGl2ZURpcmVjdG9yeUdVSURUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3RpdmVEaXJlY3RvcnlHVUlEXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iMTYiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQWxpYXNUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGlhc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFzc2lnbm1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhc2tVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2VVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJjZW50V29ya0NvbXBsZXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHdvcmsgY29tcGxldGVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3QgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbEZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgZmluaXNoIGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3QgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGFtb3VudCBvZiB3b3JrIGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQUNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbmZpcm1lZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgUmVzb3VyY2UgaGFzIGFjY2VwdGVkIGFsbCBvZiBoaXMgb3IgaGVyIGFzc2lnbm1lbnRzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbmZpcm1lZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0ZWQgb3Igc2NoZWR1bGVkIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RSYXRlVGFibGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db3N0UmF0ZVRhYmxlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb3N0IHJhdGUgdGFibGUgdXNlZCBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFJhdGVUYWJsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNvc3QgYW5kIGJhc2VsaW5lIGNvc3QgZm9yIGEgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY1YiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDViIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlbGF5IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IHRoYXQgdGhlIGFzc2lnbm1lbnQgaXMgZGVsYXllZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWxheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiB0aGUgYXNzaWdubWVudCBmaW5pc2ggZGF0ZSBmcm9tIHRoZSBiYXNlbGluZSBmaW5pc2ggZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2hWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGluayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGl0bGUgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua0FkZHJlc3NUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua1N1YkFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiBhc3NpZ25tZW50IHdvcmsgZnJvbSB0aGUgYmFzZWxpbmUgd29yayBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYXNGaXhlZFJhdGVVbml0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgVW5pdHMgYXJlIEZpeGVkIFJhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSGFzRml4ZWRSYXRlVW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaXhlZE1hdGVyaWFsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBjb25zdW1wdGlvbiBvZiB0aGUgYXNzaWduZWQgbWF0ZXJpYWwgcmVzb3VyY2Ugb2NjdXJzIGluIGEgc2luZ2xlLCBmaXhlZCBhbW91bnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRml4ZWRNYXRlcmlhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nRGVsYXkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWxheSBjYXVzZWQgYnkgbGV2ZWxpbmcuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nRGVsYXlGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9MZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBkZWxheS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgMjA9ZSUsIDIxPW51bGwsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rZWRGaWVsZHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIFByb2plY3QgaXMgbGlua2VkIHRvIGFub3RoZXIgT0xFIG9iamVjdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMaW5rZWRGaWVsZHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaWxlc3RvbmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGFzc2lnbm1lbnQgaXMgYSBtaWxlc3RvbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWlsZXN0b25lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90ZXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGV4dCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTm90ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVyYWxsb2NhdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBhc3NpZ25tZW50IGlzIG92ZXJhbGxvY2F0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcmFsbG9jYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN1bSBvZiB0aGUgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWd1bGFyV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWd1bGFyV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0Nvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgY29tcGxldGluZyB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVDb3N0IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBvdmVydGltZSBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVXb3JrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCB0byBjb21wbGV0ZSB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyB3b3JrIHNjaGVkdWxlZCB0byBjb21wbGV0ZSB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzcG9uc2VQZW5kaW5nIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUcnVlIGlmIGEgcmVzcG9uc2UgaGFzIG5vdCBiZWVuIHJlY2VpdmVkIGZvciBhIFRlYW1Bc3NpZ24gbWVzc2FnZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzcG9uc2VQZW5kaW5nIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdG9wIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgYXNzaWdubWVudCB3YXMgc3RvcHBlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdG9wIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgYXNzaWdubWVudCByZXN1bWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3VtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0VmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiB0aGUgYXNzaWdubWVudCBzdGFydCBkYXRlIGZyb20gdGhlIGJhc2VsaW5lIHN0YXJ0IGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnRWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaXRzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiB1bml0cyBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cGRhdGVOZWVkZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRydWUgaWYgdGhlIHJlc291cmNlIGFzc2lnbmVkIHRvIGEgdGFzayBuZWVkcyB0byBiZSB1cGRhdGVkIGFzIHRvIHRoZSBzdGF0dXMgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVXBkYXRlTmVlZGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idkFDIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBiYXNsaW5lIGNvc3QgYW5kIHRvdGFsIGNvc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVkFDIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygc2NoZWR1bGVkIHdvcmsgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrQ29udG91ciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtDb250b3VyVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3b3JrIGNvbnRvdXIgb2YgdGhlIGFzc2lnbm1lbnQuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1GbGF0LCAxPUJhY2sgTG9hZGVkLCAyPUZyb250IExvYWRlZCwgMz1Eb3VibGUgUGVhaywgND1FYXJseSBQZWFrLCA1PUxhdGUgUGVhaywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICA2PUJlbGwsIDc9VHVydGxlLCA4PUNvbnRvdXJlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtDb250b3VyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgYXNzaWdubWVudCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib29raW5nVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Jvb2tpbmdUeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgYm9va2luZyB0eXBlIG9mIHRoZSBhc3NpZ25tZW50LiAxPUNvbW1pdGVkLCAyPVByb3Bvc2VkJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQm9va2luZ1R5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrUHJvdGVjdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGlvbkRhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBhc3NpZ25tZW50IHdhcyBjcmVhdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZTQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkIElELCBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWxpbmUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQmFzZWxpbmUzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgYmFzZWxpbmUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFzc2lnbm1lbnRzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnRzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaWdubWVudCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Bc3NpZ25tZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgYXNzaWdubWVudCBpbiBlYWNoIEFzc2lnbm1lbnRzIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkF1dGhvclR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF1dGhvcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBdmFpbGFiaWxpdHlQZXJpb2QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmlsaXR5UGVyaW9kXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXZhaWxhYmxlRnJvbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHJlc291cmNlIGJlY29tZXMgYXZhaWxhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlRnJvbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZVRvIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhc3QgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFibGVUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZVVuaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2UgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGR1cmluZyB0aGUgc3BlY2lmaWVkIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlVW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBdmFpbGFiaWxpdHlQZXJpb2RzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJpbGl0eVBlcmlvZHNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdmFpbGFiaWxpdHlQZXJpb2QiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQXZhaWxhYmlsaXR5UGVyaW9kIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmlvZCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFiaWxpdHlQZXJpb2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCYXNlbGluZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzayBiYXNlbGluZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJudW1iZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTnVtYmVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW50ZXJpbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhpcyBpcyBhbiBJbnRlcmltIEJhc2VsaW5lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbnRlcmltIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZHVyYXRpb24gb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIER1cmF0aW9uIG9mIHRoZSBUYXNrIGJhc2VsaW5lLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgMjA9ZSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0ZWREdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgYmFzZWxpbmUgZHVyYXRpb24gb2YgdGhlIHRhc2sgd2FzIGVzdGltYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGVkRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCB3b3JrIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCYXNlbGluZTIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibnVtYmVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIG51bWJlciBvZiB0aGUgYmFzZWxpbmUgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd29yayBhc3NpZ25lZCB0aGUgcmVzb3VyY2Ugd2hlbiB0aGUgYmFzZWxpbmUgaXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3RlZCBjb3N0IGZvciB0aGUgcmVzb3VyY2Ugd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCYXNlbGluZTMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZXBoYXNlZERhdGEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgcGhhc2VkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBCYXNlbGluZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bWJlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIG51bWJlciBvZiB0aGUgYmFzZWxpbmUgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTnVtYmVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIGFtb3VudCBvZiB3b3JrIHNjaGVkdWxlZCBvbiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIHByb2plY3RlZCBjb3N0IG9mIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgYXNzaWdubWVudCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lRm9yRWFybmVkVmFsdWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDcgOCA5IDEwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkJvb2tpbmdUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJvb2tpbmdUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkJvb2tpbmdUeXBlVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCb29raW5nVHlwZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ2FsY3VsYXRpb25UeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGN1bGF0aW9uVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhbGVuZGFyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vTmFtZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgY2FsZW5kYXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0Jhc2VDYWxlbmRhciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgY2FsZW5kYXIgaXMgYSBiYXNlIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc0Jhc2VDYWxlbmRhciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhc2VDYWxlbmRhclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBiYXNlIGNhbGVuZGFyICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIHRoaXMgY2FsZW5kYXIgZGVwZW5kcy4gT25seSBhcHBsaWNhYmxlIGlmIHRoZSBjYWxlbmRhciBpcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYSBiYXNlIGNhbGVuZGFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlQ2FsZW5kYXJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWVrRGF5cyIgZVR5cGU9IiMvL1dlZWtEYXlzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgV2Vla2RheXMgdGhhdCBkZWZpbmVzIHRoaXMgY2FsZW5kYXIuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtEYXlzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2FsZW5kYXJzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhbGVuZGFyIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NhbGVuZGFyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2FsZW5kYXJzIGFyZSB1c2VkIHRvIGRlZmluZSBzdGFuZGFyZCB3b3JraW5nIGFuZCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBub24td29ya2luZyB0aW1lcy4gUHJvamVjdHMgbXVzdCBoYXZlIG9uZSBiYXNlIGNhbGVuZGFyLiBUYXNrcyBhbmQgcmVzb3VyY2VzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIG1heSBoYXZlIHRoZWlyIG93biBub24tYmFzZSBjYWxlbmRhcnMgd2hpY2ggYXJlIGJhc2VkIG9uIGEgYmFzZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDYXRlZ29yeVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhdGVnb3J5Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvZGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb2RlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvbXBhbnlUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb21wYW55Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvbnN0cmFpbnRUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnN0cmFpbnRUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvbnRhY3RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250YWN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvc3RSYXRlVGFibGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFJhdGVUYWJsZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sUG9zaXRpb25fLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkN1cnJlbmN5U3ltYm9sVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVuY3lTeW1ib2xfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSIyMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEYXlUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRheVR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEZWZhdWx0VGFza0VWTWV0aG9kVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrRVZNZXRob2RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGVmYXVsdFRhc2tUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRvY3VtZW50Um9vdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Im1peGVkIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1peGVkIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudFdpbGRjYXJkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IjptaXhlZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ4TUxOU1ByZWZpeE1hcCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmdUb1N0cmluZ01hcEVudHJ5IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ4bWxuczpwcmVmaXgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ieFNJU2NoZW1hTG9jYXRpb24iIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ieHNpOnNjaGVtYUxvY2F0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2plY3QiIHVwcGVyQm91bmQ9Ii0yIgotICAgICAgICBlVHlwZT0iIy8vUHJvamVjdCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0IGlzIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRHVyYXRpb25Gb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTMiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkVhcm5lZFZhbHVlTWV0aG9kVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcm5lZFZhbHVlTWV0aG9kXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkVhcm5lZFZhbHVlTWV0aG9kVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRW1haWxBZGRyZXNzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRW1haWxBZGRyZXNzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkTmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgY3VzdG9tIGZpZWxkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZE5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbGlhcyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0FsaWFzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbGlhcyBvZiB0aGUgY3VzdG9tIGZpZWxkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFsaWFzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGhvbmV0aWNBbGlhcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1Bob25ldGljQWxpYXNUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBob25ldGljIHByb251bmNpYXRpb24gb2YgdGhlIGFsaWFzIG9mIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b20gZmllbGQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGx1cFR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Sb2xsdXBUeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkhvdyByb2xsdXBzIGFyZSBjYWxjdWxhdGVkLiBWYWx1ZXMgYXJlOiAwPU1heGltdW0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9SIGZvciBmbGFnIGZpZWxkcyksIDE9TWluaW11bSAoQU5EIGZvciBmbGFnIGZpZWxkcyksIDI9Q291bnQgYWxsLCAzPVN1bSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgND1BdmVyYWdlLCA1PUF2ZXJhZ2UgRmlyc3QgU3VibGV2ZWwsIDY9Q291bnQgRmlyc3QgU3VibGV2ZWwsIDc9Q291bnQgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uc3VtbWFyaWVzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGx1cFR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWxjdWxhdGlvblR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9DYWxjdWxhdGlvblR5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciByb2xsdXBzIGFyZSBjYWxjdWxhdGVkIGZvciB0YXNrIGFuZCBncm91cCBzdW1tYXJ5IHJvd3MuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9Tm9uZSwgMT1Sb2xsdXAsIDI9Q2FsY3VsYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsY3VsYXRpb25UeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZm9ybXVsYSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybXVsYSB0aGF0IE1pY3Jvc29mdCBQcm9qZWN0IHVzZXMgdG8gcG9wdWxhdGUgdGhlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSB0YXNrIGZpZWxkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGb3JtdWxhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdHJpY3RWYWx1ZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIFJlc3RyaWN0VmFsdWVzPVRydWUgdGhlbiBvbmx5IHZhbHVlcyBpbiB0aGUgbGlzdCBhcmUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCBpbiB0aGUgZmlsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXN0cmljdFZhbHVlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlbGlzdFNvcnRPcmRlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1ZhbHVlbGlzdFNvcnRPcmRlclR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJIb3cgdmFsdWUgbGlzdHMgYXJlIHNvcnRlZC4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD1EZXNjZW5kaW5nLCAxPUFzY2VuZGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZWxpc3RTb3J0T3JkZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcHBlbmROZXdWYWx1ZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIEFwcGVuZE5ld1ZhbHVlcz1UcnVlIHRoZW4gYW55IG5ldyB2YWx1ZXMgYWRkZWQgaW4gYSBwcm9qZWN0ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIHRvIHRoZSBsaXN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBcHBlbmROZXdWYWx1ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgcG9pbnRzIHRvIHRoZSBkZWZhdWx0IHZhbHVlIGluIHRoZSBsaXN0LiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgcHJlc2VudCBpZiBubyBkZWZhdWx0IGlzIHNldC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlTGlzdCIgZVR5cGU9IiMvL1ZhbHVlTGlzdCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZW4gdmFsdWVzIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmllZCBhcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIG9mIGVsZW1lbnRzIGluIHRoZSBzY2hlbWEsIHRoZXkgbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgYnkgdmFsdWVzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGJ5IHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBsaXN0LiAgQXBwbGljYXRpb25zIG1heSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3N1bWUgb3JkZXJpbmcgb2YgdGhlIGxpc3QgYnkgb3JkZXJpbmcgc3BlY2lmaWVkIGhlcmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlTGlzdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlMiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGUzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dCBsb29rdXAgdGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZTQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmllbGQgSUQgaW4gdGhlIGxvY2FsaXNlZCBsYW5ndWFnZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFjaCBvZiB0aGUgaW5kaXZpZHVhbCBlbnRyaWVzIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGVzIGRlZmluaXRpb24gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi4gIFRoZXJlIGFyZSBubyBsaW1pdHMgdG8gdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IG1heSBhcHBlYXIsIGJ1dCBwcm9qZWN0ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIHdpbGwgb25seSB1bmRlcnN0YW5kIEZsYWcxLUZsYWcxMCwgZXRjLiAgVGhpcyBtdXN0IGFwcGVhciBvbmNlIGluIGVhY2ggRXh0ZW5kZWRBdHRyaWJ1dGVzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVybmFsVGFza1Byb2plY3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRml4ZWRDb3N0QWNjcnVhbFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkQ29zdEFjY3J1YWxfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkZZU3RhcnREYXRlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZZU3RhcnREYXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iR3JvdXBUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHcm91cF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtBZGRyZXNzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtBZGRyZXNzVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3NfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua0FkZHJlc3NUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzc18uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3NfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJbml0aWFsc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkluaXRpYWxzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkxhZ0Zvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYWdGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkxldmVsaW5nRGVsYXlGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheUZvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheUZvcm1hdF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik1hbmFnZXJUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYW5hZ2VyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1hc2siPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFza18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGV2ZWwgb2YgdGhlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1R5cGVUeXBlNSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIG1hc2suIFZhbHVlcyBhcmU6IDA9TnVtYmVycywgMT1VcHBlciBDYXNlIExldHRlcnMsIDI9TG93ZXIgQ2FzZSBMZXR0ZXJzLCAzPUNoYXJhY3RlcnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imxlbmd0aCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1heGltdW0gbGVuZ3RoIGluIGNoYXJhY3RlcnMgb2YgdGhlIG91dGxpbmUgY29kZSB2YWx1ZXMuICBJZiBsZW5ndGggaXMgYW55LCB0aGUgdmFsdWUgaXMgemVyby4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGVuZ3RoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VwYXJhdG9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXBhcmF0b3IgdmFsdWUgb2YgdGhlIGNvZGUgdmFsdWVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTZXBhcmF0b3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNYXNrcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXNrc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hc2siIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWFzayIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3VyIGVsZW1lbnRzIG9mIHRoZSBtYXNrIGNvbnN0aXR1dGUgdGhlIGZvcm1hdCBpbiB3aGljaCB0aGUgb3V0bGluZSBjb2RlIG11c3QgYXBwZWFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTWF0ZXJpYWxMYWJlbFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hdGVyaWFsTGFiZWxfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmFtZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmFtZVR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOYW1lVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5hbWVUeXBlMyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZV8uXzNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSIyNTUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmV3VGFza1N0YXJ0RGF0ZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrU3RhcnREYXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5UQWNjb3VudFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5UQWNjb3VudF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRsaW5lQ29kZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29yZXNwb25kcyB0byB0aGUgZmllbGQgbnVtYmVyIG9mIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkTmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgY3VzdG9tIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWxpYXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBob25ldGljQWxpYXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBob25ldGljIHByb251bmNpYXRpb24gb2YgdGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY0FsaWFzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsdWVzIiBlVHlwZT0iIy8vVmFsdWVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlcyBvZiB0aGUgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbnRlcnByaXNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VzdG9tIG91dGxpbmUgY29kZSBpcyBhbiBlbnRlcnByaXNlIGN1c3RvbSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVudGVycHJpc2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW5vdGhlciBjdXN0b20gZmllbGQgZm9yIHdoaWNoIHRoaXMgaXMgYW4gYWxpYXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlIGNhbiBiZSB1c2VkIGJ5IHRoZSBSZXNvdXJjZSBTdWJzdGl0dXRpb24gV2l6YXJkIGluIE1pY3Jvc29mdCBQcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZWFmT25seSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBvciBub3QgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGlzIG91dGxpbmUgY29kZSBmaWVsZCBtdXN0IGJlIGxlYWYgdmFsdWVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZWFmT25seSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsbExldmVsc1JlcXVpcmVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJOZXcgY29kZXMgbXVzdCBoYXZlIGFsbCBsZXZlbHMgcHJlc2VudC4gIE5vdCBhdmFpbGFibGUgZm9yIEVudGVycHJpc2UgQ29kZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFsbExldmVsc1JlcXVpcmVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib25seVRhYmxlVmFsdWVzQWxsb3dlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB2YWx1ZXMgc3BlY2lmaWVkIG11c3QgY29tZSBmcm9tIHZhbHVlcyB0YWJsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT25seVRhYmxlVmFsdWVzQWxsb3dlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hc2tzIiBlVHlwZT0iIy8vTWFza3MiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFibGUgb2YgZW50cmllcyB0aGF0IGRlZmluZSB0aGUgb3V0bGluZSBjb2RlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hc2tzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGUyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBpbiB0aGUgdmFsdWUgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhlIGRlZmluaXRpb24gaW4gdGhlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGUzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBpbiB0aGUgdmFsdWUgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhlIGRlZmluaXRpb24gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2Rlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL091dGxpbmVDb2RlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGluZGl2aWR1YWwgb3V0bGluZSBjb2Rlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJPdXRsaW5lTnVtYmVyVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZU51bWJlcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJPdmVydGltZVJhdGVGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGVGb3JtYXRfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUGhvbmV0aWNBbGlhc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBob25ldGljQWxpYXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJQaG9uZXRpY3NUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJlZGVjZXNzb3JMaW5rIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWRlY2Vzc29yTGlua18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWRlY2Vzc29yVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHByZWRlY2Vzc29yIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWRlY2Vzc29yVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1R5cGVUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsaW5rIHR5cGUuICBWYWx1ZXMgYXJlIDA9RkYsIDE9RlMsIDI9U0YgYW5kIDM9U1MmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyb3NzUHJvamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJlZGVjZXNzb3IgaXMgcGFydCBvZiBhbm90aGVyIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyb3NzUHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyb3NzUHJvamVjdE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4dGVybmFsIHByZWRlY2Vzc29yIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyb3NzUHJvamVjdE5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rTGFnIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGxhZyBpbiB0ZW50aHMgb2YgYSBtaW51dGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxpbmtMYWciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYWdGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9MYWdGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgbGFnIGZvcm1hdC4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxhZ0Zvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlByZWZpeFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWZpeF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2plY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1VJRFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vTmFtZVR5cGUzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0aXRsZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1RpdGxlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aXRsZSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGl0bGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdWJqZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3ViamVjdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3ViamVjdCBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ViamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhdGVnb3J5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ2F0ZWdvcnlUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNhdGVnb3J5IG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYXRlZ29yeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbXBhbnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db21wYW55VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb21wYW55IHRoYXQgb3ducyB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29tcGFueSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hbmFnZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9NYW5hZ2VyVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtYW5hZ2VyIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYW5hZ2VyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQXV0aG9yVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhdXRob3Igb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF1dGhvciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0aW9uRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHByb2plY3Qgd2FzIGNyZWF0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyZWF0aW9uRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJldmlzaW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIHRpbWVzIGEgcHJvamVjdCBoYXMgYmVlbiBzYXZlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmV2aXNpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXN0U2F2ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBwcm9qZWN0IHdhcyBsYXN0IHNhdmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYXN0U2F2ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2hlZHVsZUZyb21TdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJvamVjdCBpcyBzY2hkdWxlZCBmcm9tIHRoZSBzdGFydCBkYXRlIG9yIGZpbmlzaCBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2NoZWR1bGVGcm9tU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgcHJvamVjdC4gUmVxdWlyZWQgaWYgU2NoZWR1bGVGcm9tU3RhcnQgaXMgdHJ1ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHByb2plY3QuIFJlcXVpcmVkIGlmIFNjaGVkdWxlRnJvbVN0YXJ0IGlzIGZhbHNlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZZU3RhcnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRllTdGFydERhdGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRmlzY2FsIFllYXIgc3RhcnRpbmcgbW9udGguIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsxPUphbnVhcnksIDI9RmVicnVhcnksIDM9TWFyY2gsIDQ9QXByaWwsIDU9TWF5LCA2PUp1bmUsIDc9SnVseSwgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5Ozg9QXVndXN0LCA5PVNlcHRlbWJlciwgMTA9T2N0b2JlciwgMTE9Tm92ZW1iZXIsIDEyPURlY2VtYmVyICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGWVN0YXJ0RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyaXRpY2FsU2xhY2tMaW1pdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBkYXlzIHBhc3QgaXRzIGVuZCBkYXRlIHRoYXQgYSB0YXNrIGNhbiBnbyAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7YmVmb3JlIE1pY3Jvc29mdCBQcm9qZWN0IG1hcmtzIHRoYXQgdGFzayBhcyBhIGNyaXRpY2FsIHRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyaXRpY2FsU2xhY2tMaW1pdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbmN5RGlnaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBzeW1ib2wuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5RGlnaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VycmVuY3lTeW1ib2wiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9DdXJyZW5jeVN5bWJvbFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY3VycmVuY3kgc3ltYm9sIHVzZWQgaW4gdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VycmVuY3lTeW1ib2xQb3NpdGlvbiIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0N1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW5jeSBzeW1ib2wuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1CZWZvcmUsIDE9QWZ0ZXIsIDI9QmVmb3JlIFdpdGggU3BhY2UsIDM9QWZ0ZXIgd2l0aCBzcGFjZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVuY3lTeW1ib2xQb3NpdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbGVuZGFyVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdCBjYWxlbmRhci4gIFJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O0NhbGVuZGFycyBlbGVtZW50IG9mIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRTdGFydFRpbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YXJ0IHRpbWUgb2YgbmV3IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0U3RhcnRUaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdEZpbmlzaFRpbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGZpbmlzaCB0aW1lIG9mIG5ldyB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdEZpbmlzaFRpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW51dGVzUGVyRGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgcGVyIGRheS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWludXRlc1BlckRheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbnV0ZXNQZXJXZWVrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgcGVyIHdlZWsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbnV0ZXNQZXJXZWVrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF5c1Blck1vbnRoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIGRheXMgcGVyIG1vbnRoLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEYXlzUGVyTW9udGgiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0VGFza1R5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EZWZhdWx0VGFza1R5cGVUeXBlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIxIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgdHlwZSBvZiBuZXcgdGFza3MuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPUZpeGVkIFVuaXRzLCAxPUZpeGVkIER1cmF0aW9uLCAyPUZpeGVkIFdvcmsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRGaXhlZENvc3RBY2NydWFsIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZnJvbSB3aGVyZSBmaXhlZCBjb3N0cyBhcmUgYWNjcnVlZC4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsxPVN0YXJ0LCAyPVByb3JhdGVkLCAzPUVuZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRTdGFuZGFyZFJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBzdGFuZGFyZCByYXRlIGZvciBuZXcgcmVzb3VyY2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0U3RhbmRhcmRSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdE92ZXJ0aW1lUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IG92ZXJ0aW1lIHJhdGUgZm9yIG5ldyByZXNvdXJjZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRPdmVydGltZVJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7NTM9bnVsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV29ya0Zvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCB3b3JrIHVuaXQgZm9ybWF0LiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlZGl0YWJsZUFjdHVhbENvc3RzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBvciBub3QgYWN0dWFsIGNvc3RzIGFyZSBlZGl0YWJsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWRpdGFibGVBY3R1YWxDb3N0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhvbm9yQ29uc3RyYWludHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGFza3MgaG9ub3VyIHRoZWlyIGNvbnN0cmFpbnQgZGF0ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikhvbm9yQ29uc3RyYWludHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJuZWRWYWx1ZU1ldGhvZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Vhcm5lZFZhbHVlTWV0aG9kVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBtZXRob2QgZm9yIGNhbGN1bGF0aW5nIGVhcm5lZCB2YWx1ZS4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcm5lZFZhbHVlTWV0aG9kIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIGNhbGN1bGF0ZSBzdWJ0YXNrcyBhcyBzdW1tYXJ5IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtdWx0aXBsZUNyaXRpY2FsUGF0aHMiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIG11bHRpcGxlIGNyaXRpY2FsIHBhdGhzIGFyZSBjYWxjdWxhdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNdWx0aXBsZUNyaXRpY2FsUGF0aHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuZXdUYXNrc0VmZm9ydERyaXZlbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBuZXcgdGFza3MgYXJlIGVmZm9ydCBkcml2ZW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5ld1Rhc2tzRWZmb3J0RHJpdmVuIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmV3VGFza3NFc3RpbWF0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdG8gc2hvdyB0aGUgZXN0aW1hdGVkIGR1cmF0aW9uIGJ5IGRlZmF1bHQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5ld1Rhc2tzRXN0aW1hdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIGluLXByb2dyZXNzIHRhc2tzIGNhbiBiZSBzcGxpdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ByZWFkQWN0dWFsQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBhY3R1YWwgY29zdHMgYXJlIHNwcmVhZCB0byB0aGUgc3RhdHVzIGRhdGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNwcmVhZEFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcHJlYWRQZXJjZW50Q29tcGxldGUiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHBlcmNlbnQgY29tcGxldGUgaXMgc3ByZWFkIHRvIHRoZSBzdGF0dXMgZGF0ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ByZWFkUGVyY2VudENvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFza1VwZGF0ZXNSZXNvdXJjZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB1cGRhdGVzIHRvIHRhc2tzIHVwZGF0ZSByZXNvdXJjZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tVcGRhdGVzUmVzb3VyY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaXNjYWxZZWFyU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBmaXNjYWwgeWVhciBudW1iZXJpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmlzY2FsWWVhclN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2Vla1N0YXJ0RGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV2Vla1N0YXJ0RGF5VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN0YXJ0IGRheSBvZiB0aGUgd2Vlay4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9U3VuZGF5LCAxPU1vbmRheSwgMj1UdWVzZGF5LCAzPVdlZG5lc2RheSwgND1UaHVyc2RheSwgNT1GcmlkYXksIDY9U2F0dXJkYXkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla1N0YXJ0RGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW92ZUNvbXBsZXRlZEVuZHNCYWNrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVuZCBvZiBjb21wbGV0ZWQgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGJlZ2luIGFmdGVyIHRoZSAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtzdGF0dXMgZGF0ZSBidXQgYmVndW4gZWFybHkgc2hvdWxkIGJlIG1vdmVkIGJhY2sgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZUNvbXBsZXRlZEVuZHNCYWNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2siCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtTcGVjaWZpZXMgd2hldGhlciB0aGUgYmVnaW5uaW5nIG9mIHJlbWFpbmluZyBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gYmVnaW4gYWZ0ZXIgdGhlICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O3N0YXR1cyBkYXRlIGJ1dCBiZWd1biBlYXJseSBzaG91bGQgYmUgbW92ZWQgYmFjayB0byB0aGUgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJlZ2lubmluZyBvZiByZW1haW5pbmcgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVndW4gbGF0ZSAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtzaG91bGQgYmUgbW92ZWQgdXAgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtTcGVjaWZpZXMgd2hldGhlciB0aGUgZW5kIG9mIGNvbXBsZXRlZCBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gaGF2ZSBiZWVuIGNvbXBsZXRlZCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtiZWZvcmUgdGhlIHN0YXR1cyBkYXRlIGJ1dCBiZWd1biBsYXRlIHNob3VsZCBiZSBtb3ZlZCB1cCB0byB0aGUgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYXNlbGluZUZvckVhcm5lZFZhbHVlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3BlY2lmaWMgYmFzZWxpbmUgdXNlZCB0byBjYWxjdWxhdGUgVmFyaWFuY2UgdmFsdWVzLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9QmFzZWxpbmUsIDE9QmFzZWxpbmUgMSwgMj1CYXNlbGluZSAyLCAzPUJhc2VsaW5lIDMsIDQ9QmFzZWxpbmUgNCwgNT1CYXNlbGluZSA1LCA2PUJhc2VsaW5lIDYsICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTs3PUJhc2VsaW5lIDcsIDg9QmFzZWxpbmUgOCwgOT1CYXNlbGluZSA5LCAxMD1CYXNlbGluZSAxMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZUZvckVhcm5lZFZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgYWRkIG5ldyByZXNvdXJjZXMgdG8gdGhlIHJlc291cmNlIHBvb2wuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXR1c0RhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRlIHVzZWQgZm9yIGNhbGN1bGF0aW9uIGFuZCByZXBvcnRpbmcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXR1c0RhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjdXJyZW50RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzeXN0ZW0gZGF0ZSB0aGF0IHRoZSBYTUwgd2FzIGdlbmVyYXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVudERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkIGJ5IGEgUHJvamVjdCBTZXJ2ZXIgdXNlciBhcyBvcHBvc2VkIHRvIGFuIE5UIHVzZXIuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0b2xpbmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdG8gYXV0b2xpbmsgaW5zZXJ0ZWQgb3IgbW92ZWQgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF1dG9saW5rIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmV3VGFza1N0YXJ0RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL05ld1Rhc2tTdGFydERhdGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZGF0ZSBmb3IgbmV3IHRhc2tzIHN0YXJ0LiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9UHJvamVjdCBTdGFydCBEYXRlLCAxPUN1cnJlbnQgRGF0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrU3RhcnREYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFRhc2tFVk1ldGhvZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RlZmF1bHRUYXNrRVZNZXRob2RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZWFybmVkIHZhbHVlIG1ldGhvZCBmb3IgdGFza3MuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1QZXJjZW50IENvbXBsZXRlLCAxPVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFRhc2tFVk1ldGhvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RFeHRlcm5hbGx5RWRpdGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcm9qZWN0IFhNTCB3YXMgZWRpdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVuZGVkQ3JlYXRpb25EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0ZSB1c2VkIGZvciBjYWxjdWxhdGlvbiBhbmQgcmVwb3J0aW5nLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZENyZWF0aW9uRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbHNJblN5bmMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgYWxsIGFjdHVhbCB3b3JrIGhhcyBiZWVuIHN5bmNocm9uaXplZCB3aXRoIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxzSW5TeW5jIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtb3ZlRmlsZVByb3BlcnRpZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdG8gcmVtb3ZlIGFsbCBmaWxlIHByb3BlcnRpZXMgb24gc2F2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtb3ZlRmlsZVByb3BlcnRpZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZG1pblByb2plY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByb2plY3QgaXMgYW4gYWRtaW5pc3RyYXRpdmUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWRtaW5Qcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0bGluZUNvZGVzIiBlVHlwZT0iIy8vT3V0bGluZUNvZGVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2Ygb3V0bGluZSBjb2RlIGRlZmluaXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4gIFRoZXNlIGNvZGVzIG1heSBiZSBhc3NvY2lhdGVkIG9ubHkgd2l0aCB0aGlzIHByb2plY3QsIG9yIG1heSBiZSBjb21tb24gYW1vbmcgc2V2ZXJhbCBwcm9qZWN0cyAoZW50ZXJwcmlzZSBjb2RlcykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndCU01hc2tzIiBlVHlwZT0iIy8vV0JTTWFza3MiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFibGUgb2YgZW50cmllcyB0aGF0IGRlZmluZSB0aGUgb3V0bGluZSBjb2RlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCU01hc2tzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGVzIiBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgZXh0ZW5kZWQgYXR0cmlidXRlIChjdXN0b20gZmllbGQpIGRlZmluaXRpb25zICYjeEQ7JiN4QTsgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2FsZW5kYXJzIiBlVHlwZT0iIy8vQ2FsZW5kYXJzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgY2FsZW5kYXJzIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSAmI3hEOyYjeEE7ICAgICAgICBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhcnMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXNrcyIgZVR5cGU9IiMvL1Rhc2tzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgdGFza3MgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc291cmNlcyIgZVR5cGU9IiMvL1Jlc291cmNlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIHJlc291cmNlcyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lnbm1lbnRzIiBlVHlwZT0iIy8vQXNzaWdubWVudHMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiBhc3NpZ25tZW50cyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuJiN4RDsmI3hBOyAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSYXRlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYXRlc0Zyb20iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSByYXRlIGJlY29tZXMgZWZmZWN0aXZlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlc0Zyb20iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYXRlc1RvIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhc3QgZGF0ZSB0aGF0IHRoZSByYXRlIGlzIGVmZmVjdGl2ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXNUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhdGVUYWJsZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1JhdGVUYWJsZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJhdGUgdGFibGUgZm9yIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1BLCAxPUIsIDI9QywgMz1ELCA0PUUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZVRhYmxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhbmRhcmQgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIHN0YW5kYXJkIHJhdGUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8sIDc9eSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGVGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvdmVydGltZSByYXRlIGZvciB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwZXJpb2Qgc3BlY2lmaWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVJhdGVGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9PdmVydGltZVJhdGVGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgb3ZlcnRpbWUgcmF0ZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RQZXJVc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb3N0IHBlciB1c2Ugb2YgdGhlIHJlc291cmNlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0UGVyVXNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmF0ZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyYXRlIiB1cHBlckJvdW5kPSIyNSIgZVR5cGU9IiMvL1JhdGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmaW5pdGlvbiBvZiBhIHRpbWUgcGVyaW9kLCBhbmQgdGhlIHJhdGVzIGFwcGxpY2FibGUgZm9yICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXNvdXJjZSBkdXJpbmcgdGhhdCBwZXJpb2QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJSYXRlVGFibGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZVRhYmxlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlc291cmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvc2l0aW9uIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlIHdpdGhpbiB0aGUgbGlzdCBvZiByZXNvdXJjZXMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiByZXNvdXJjZS4gVmFsdWVzIGFyZTogMD1NYXRlcmlhbCwgMT1Xb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc051bGwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBudWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc051bGwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbml0aWFscyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0luaXRpYWxzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpbml0aWFscyBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkluaXRpYWxzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGhvbmV0aWNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUGhvbmV0aWNzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwaG9uZXRpYyBzcGVsbGluZyBvZiB0aGUgcmVzb3VyY2UgbmFtZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciB1c2Ugd2l0aCBKYXBhbmVzZSBvbmx5LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuVEFjY291bnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9OVEFjY291bnRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIE5UIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTlRBY2NvdW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWF0ZXJpYWxMYWJlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL01hdGVyaWFsTGFiZWxUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIG1hdGVyaWFsIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXRlcmlhbExhYmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29kZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0NvZGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvZGUgb3Igb3RoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9Hcm91cFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZ3JvdXAgdG8gd2hpY2ggdGhlIHJlc291cmNlIGJlbG9uZ3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya0dyb3VwIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV29ya0dyb3VwVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHdvcmtncm91cCB0byB3aGljaCB0aGUgcmVzb3VyY2UgYmVsb25ncy4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1EZWZhdWx0LCAxPU5vbmUsIDI9RW1haWwsIDM9V2ViJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtHcm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVtYWlsQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0VtYWlsQWRkcmVzc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVtYWlsQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGluayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1R5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua0FkZHJlc3NUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua1N1YkFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkb2N1bWVudCBib29rbWFyayBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXhVbml0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMS4wIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXRzIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWF4VW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZWFrVW5pdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGFyZ2VzdCBudW1iZXIgb2YgdW5pdHMgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGF0IGFueSB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZWFrVW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVyQWxsb2NhdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSByZXNvdXJjZSBpcyBvdmVyYWxsb2NhdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVyQWxsb2NhdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXZhaWxhYmxlRnJvbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaXJzdCBkYXRlIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlRnJvbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZVRvIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhc3QgZGF0ZSB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFibGVUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FuTGV2ZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHJlc291cmNlIGNhbiBiZSBsZXZlbGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYW5MZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjY3J1ZUF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQWNjcnVlQXQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJIb3cgY29zdCBpcyBhY2NydWVkIGFnYWluc3QgdGhlIHJlc291cmNlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAxPVN0YXJ0LCAyPUVuZCwgMz1Qcm9yYXRlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY2NydWVBdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG90YWwgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZ3VsYXJXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlZ3VsYXJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBvdmVydGltZSB3b3JrIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgYWN0dWFsIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ1dvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHJlbWFpbmluZyB3b3JrIHJlcXVpcmVkIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgYWN0dWFsIG92ZXJ0aW1lIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVXb3JrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiByZW1haW5pbmcgb3ZlcnRpbWUgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmNlbnRXb3JrQ29tcGxldGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIG9mIHdvcmsgY29tcGxldGVkIGFjcm9zcyBhbGwgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFuZGFyZFJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdGFuZGFyZCByYXRlIG9mIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBzdGFuZGFyZCByYXRlLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXksIDg9bWF0ZXJpYWwgcmVzb3VyY2UgcmF0ZSAob3IgYmxhbmsgc3ltYm9sIHNwZWNpZmllZCkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIHByb2plY3QgY29zdCBmb3IgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvdmVydGltZSByYXRlIG9mIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBvdmVydGltZSByYXRlLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG90YWwgb3ZlcnRpbWUgY29zdCBmb3IgdGhlIHJlc291cmNlIGluY2x1ZGluZyBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdFBlclVzZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvc3QgcGVyIHVzZSBvZiB0aGUgcmVzb3VyY2UuIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RQZXJVc2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBpbmN1cnJlZCBieSB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgcmVzb3VyY2UgdG8gY29tcGxldGUgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVDb3N0IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBvdmVydGltZSBjb3N0IG9mIHRoZSByZXNvdXJjZSB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGJhc2VsaW5lIHdvcmsgYW5kIHRoZSB3b3JrIGFzIG1pbnV0ZXMgeCAxMDAwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0VmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBiYXNlbGluZSBjb3N0IGFuZCB0aGUgY29zdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic1YiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYXJuZWQgdmFsdWUgc2NoZWR1bGUgdmFyaWFuY2UsIHRocm91Z2ggdGhlIHByb2plY3Qgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNWIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY1YiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZSwgdGhyb3VnaCB0aGUgcHJvamVjdCBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ1YiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWxlbmRhclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlc291cmNlIGNhbGVuZGFyLlJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgQ2FsZW5kYXJzIGVsZW1lbnQgb2YgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBTY2hlbWEuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90ZXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGV4dCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOb3RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0IGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNHZW5lcmljIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgZ2VuZXJpYy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNHZW5lcmljIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNJbmFjdGl2ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIHNldCB0byBpbmFjdGl2ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNJbmFjdGl2ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRW50ZXJwcmlzZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGFuIEVudGVycHJpc2UgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzRW50ZXJwcmlzZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvb2tpbmdUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQm9va2luZ1R5cGVUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgYm9va2luZyB0eXBlIG9mIHRoZSByZXNvdXJjZS4gMT1Db21taXRlZCwgMj1Qcm9wb3NlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCb29raW5nVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmtQcm90ZWN0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIHdvcmsgaXMgcHJvdGVjdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZlRGlyZWN0b3J5R1VJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0FjdGl2ZURpcmVjdG9yeUdVSURUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIEFjdGl2ZSBEaXJlY3RvcnkgR1VJRCBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3RpdmVEaXJlY3RvcnlHVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRpb25EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyZWF0aW9uRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlbGluZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CYXNlbGluZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYmFzZWxpbmUgdmFsdWVzIGZvciB0aGUgcmVzb3VyY2VzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL091dGxpbmVDb2RlMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBvdXRsaW5lIGNvZGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtIGEgcG9pbnRlciBiYWNrIHRvICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRsaW5lIGNvZGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdmFpbGFiaWxpdHlQZXJpb2RzIiBlVHlwZT0iIy8vQXZhaWxhYmlsaXR5UGVyaW9kcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY29sbGVjdGlvbiBvZiBwZXJpb2RzIGR1cmluZyB3aGljaCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFiaWxpdHlQZXJpb2RzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmF0ZXMiIGVUeXBlPSIjLy9SYXRlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY29sbGVjdGlvbiBvZiBwZXJpb2RzIGFuZCB0aGUgcmF0ZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggb25lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVzb3VyY2VzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc291cmNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1Jlc291cmNlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgcmVzb3VyY2UgaW4gZWFjaCBSZXNvdXJjZXMgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJSb2xsdXBUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGx1cFR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZUZvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlRm9ybWF0Xy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3IDgiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3ViamVjdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YmplY3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3VicHJvamVjdE5hbWVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJwcm9qZWN0TmFtZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9zaXRpb24gaWRlbnRpZmllciBvZiB0aGUgdGFzayB3aXRoaW4gdGhlIGxpc3Qgb2YgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1R5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgdGFzay4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1GaXhlZCBVbml0cywgMT1GaXhlZCBEdXJhdGlvbiwgMj1GaXhlZCBXb3JrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNOdWxsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgdGFzayBpcyBudWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc051bGwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGVEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgdGFzayB3YXMgY3JlYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JlYXRlRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnRhY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db250YWN0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb250YWN0IHBlcnNvbiBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRhY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3QlMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSBjb2RlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3QlNMZXZlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmlnaHRtb3N0IFdCUyBsZXZlbCBvZiB0aGUgdGFzay4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCU0xldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3V0bGluZU51bWJlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL091dGxpbmVOdW1iZXJUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG91dGxpbmUgbnVtYmVyIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lTnVtYmVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3V0bGluZUxldmVsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3V0bGluZSBsZXZlbCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUxldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJpb3JpdHkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcmlvcml0eSBvZiB0aGUgdGFzayBmcm9tIDAgdG8gMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJpb3JpdHkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwbGFubmVkIGR1cmF0aW9uIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlNCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIER1cmF0aW9uIG9mIHRoZSBUYXNrLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBzY2hlZHVsZWQgd29yayBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdG9wIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgdGFzayB3YXMgc3RvcHBlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RvcCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgcmVzdW1lZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzdW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdW1lVmFsaWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgY2FuIGJlIHJlc3VtZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3VtZVZhbGlkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWZmb3J0RHJpdmVuIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGVmZm9ydC1kcml2ZW4uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVmZm9ydERyaXZlbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlY3VycmluZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBhIHJlY3VycmluZyB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWN1cnJpbmciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVyQWxsb2NhdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIG92ZXJhbGxvY2F0ZWQuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBpbmZvcm1hdGlvbmFsIG9ubHkuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJBbGxvY2F0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgZXN0aW1hdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaWxlc3RvbmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgYSBtaWxlc3RvbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbGVzdG9uZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1bW1hcnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgYSBzdW1tYXJ5IHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1bW1hcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcml0aWNhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBpbiB0aGUgY3JpdGljYWwgY2hhaW4uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyaXRpY2FsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTdWJwcm9qZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGFuIGluc2VydGVkIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzU3VicHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3VicHJvamVjdFJlYWRPbmx5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBpbnNlcnRlZCBwcm9qZWN0IGlzIHJlYWQtb25seS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNTdWJwcm9qZWN0UmVhZE9ubHkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdWJwcm9qZWN0TmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N1YnByb2plY3ROYW1lVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGluc2VydGVkIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YnByb2plY3ROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxUYXNrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGV4dGVybmFsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbFRhc2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbFRhc2tQcm9qZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc291cmNlIGxvY2F0aW9uIGFuZCB0YXNrIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVybmFsIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVybmFsVGFza1Byb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJseVN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVhcmx5IHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcmx5U3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJseUZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlYXJseSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybHlGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXRlU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGF0ZSBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYXRlU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXRlRmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhdGUgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxhdGVGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIHRhc2sgc3RhcnQgZGF0ZSBmcm9tICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbGluZSBzdGFydCBkYXRlIGFzIG1pbnV0ZXMgeCAxMDAwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiB0aGUgdGFzayBmaW5pc2ggZGF0ZSBmcm9tICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbGluZSBmaW5pc2ggZGF0ZSBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGFzayB3b3JrIGZyb20gdGhlIGJhc2VsaW5lICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sgd29yayBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1ZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZnJlZVNsYWNrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGZyZWUgc2xhY2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZyZWVTbGFjayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvdGFsU2xhY2siIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgdG90YWwgc2xhY2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvdGFsU2xhY2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaXhlZENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZml4ZWQgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRml4ZWRDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZml4ZWRDb3N0QWNjcnVhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0ZpeGVkQ29zdEFjY3J1YWxUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSG93IHRoZSBmaXhlZCBjb3N0IGlzIGFjY3J1ZWQgYWdhaW5zdCB0aGUgdGFzay4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMT1TdGFydCwgMj1Qcm9yYXRlZCBhbmQgMz1FbmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkQ29zdEFjY3J1YWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJjZW50Q29tcGxldGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIG9mIHRoZSB0YXNrIGR1cmF0aW9uIGNvbXBsZXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVyY2VudENvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyY2VudFdvcmtDb21wbGV0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhc2sgd29yayBjb21wbGV0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdGVkIG9yIHNjaGVkdWxlZCBjb3N0IG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3VtIG9mIHRoZSBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0IG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsRmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsRHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGR1cmF0aW9uIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBvdmVydGltZSBjb3N0IG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB3b3JrIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgb3ZlcnRpbWUgd29yayBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZ3VsYXJXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWd1bGFyV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0R1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiB0aW1lIHJlcXVpcmVkIHRvIGNvbXBsZXRlIHRoZSB1bmZpbmlzaGVkIHBvcnRpb24gb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ0R1cmF0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgY29zdCBvZiBjb21wbGV0aW5nIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ1dvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdPdmVydGltZUNvc3QiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBwcm9qZWN0ZWQgdG8gZmluaXNoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdPdmVydGltZVdvcmsiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIHRvIGZpbmlzaCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYUNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY1YiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ1YiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25zdHJhaW50VHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnN0cmFpbnRUeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb25zdHJhaW50IG9uIHRoZSBzdGFydCBvciBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1BcyBTb29uIEFzIFBvc3NpYmxlLCAxPUFzIExhdGUgQXMgUG9zc2libGUsIDI9TXVzdCBTdGFydCBPbiwgMz1NdXN0IEZpbmlzaCBPbiwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgND1TdGFydCBObyBFYXJsaWVyIFRoYW4sIDU9U3RhcnQgTm8gTGF0ZXIgVGhhbiwgNj1GaW5pc2ggTm8gRWFybGllciBUaGFuIGFuZCA3PUZpbmlzaCBObyBMYXRlciBUaGFuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnN0cmFpbnRUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FsZW5kYXJVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0YXNrIGNhbGVuZGFyLlJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgQ2FsZW5kYXJzIGVsZW1lbnQgb2YgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBTY2hlbWEuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uc3RyYWludERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSBhcmd1bWVudCBmb3IgdGhlIHRhc2sgY29uc3RyYWludCB0eXBlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25zdHJhaW50RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlYWRsaW5lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlYWRsaW5lIGZvciB0aGUgdGFzayB0byBiZSBjb21wbGV0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlYWRsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxBc3NpZ25tZW50cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBsZXZlbGluZyBjYW4gYWRqdXN0IGFzc2lnbm1lbnRzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbEFzc2lnbm1lbnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdDYW5TcGxpdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBsZXZlbGluZyBjYW4gc3BsaXQgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nQ2FuU3BsaXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0RlbGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVsYXkgY2F1c2VkIGJ5IGxldmVsaW5nIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdEZWxheUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0xldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBkZWxheS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVMZXZlbGVkU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzayBiZWZvcmUgaXQgd2FzIGxldmVsZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZUxldmVsZWRTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZUxldmVsZWRGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2sgYmVmb3JlIGl0IHdhcyBsZXZlbGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVMZXZlbGVkRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGl0bGUgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua0FkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua1N1YkFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZ25vcmVSZXNvdXJjZUNhbGVuZGFyIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlnbm9yZXMgdGhlIHJlc291cmNlIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90ZXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGV4dCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5vdGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGlkZUJhciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgR0FOVFQgYmFyIG9mIHRoZSB0YXNrIGlzIGhpZGRlbiB3aGVuIGRpc3BsYXllZCBpbiBNaWNyb3NvZnQgUHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSGlkZUJhciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGx1cCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyByb2xsZWQgdXAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGx1cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIHRhc2sgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBoeXNpY2FsUGVyY2VudENvbXBsZXRlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSBjb21wbGV0ZSB2YWx1ZSBlbnRlcmVkIGJ5IHRoZSBQcm9qZWN0IE1hbmFnZXIuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIGZvciBjYWxjdWxhdGluZyBCQ1dQLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVhcm5lZFZhbHVlTWV0aG9kIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRWFybmVkVmFsdWVNZXRob2RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1ldGhvZCBmb3IgY2FsY3VsYXRpbmcgZWFybmVkIHZhbHVlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlY2Vzc29yTGluayIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QcmVkZWNlc3NvckxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBwcmVkZWNlc3NvciB0YXNrIG9mIHRoZSB0YXNrIHRoYXQgY29udGFpbnMgaXQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWRlY2Vzc29yTGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmtQcm90ZWN0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIHdvcmsgaXMgcHJvdGVjdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEZpZWxkIElELCBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VsaW5lIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Jhc2VsaW5lIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgYmFzZWxpbmUgdmFsdWVzIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL091dGxpbmVDb2RlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBvdXRsaW5lIGNvZGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBvdXRsaW5lIGNvZGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXNrIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2siCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSB0YXNrIGluIGVhY2ggVGFza3MgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFzayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRpbWVQZXJpb2QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZVBlcmlvZF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZyb21EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJlZ2lubmluZyBvZiB0aGUgZXhjZXB0aW9uIHRpbWUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGcm9tRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbmQgb2YgdGhlIGV4Y2VwdGlvbiB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVG9EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGltZXBoYXNlZERhdGFUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmaW5pdGlvbiBvZiB0aGUgdGltZSBwaGFzZWQgZGF0YSBibG9jay4mI3hEOyYjeEE7JiN4OTsmI3g5OyAgICAgICAgIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YVR5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7ICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIHRhc2sgdGltZXBoYXNlZCBkYXRhLiBWYWx1ZXMgYXJlOiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE9QXNzaWdubWVudCBSZW1haW5pbmcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI9QXNzaWdubWVudCBBY3R1YWwgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM9QXNzaWdubWVudCBBY3R1YWwgT3ZlcnRpbWUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ9QXNzaWdubWVudCBCYXNlbGluZSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNT1Bc3NpZ25tZW50IEJhc2VsaW5lIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2PUFzc2lnbm1lbnQgQWN0dWFsIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3PVJlc291cmNlIEJhc2VsaW5lIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA4PVJlc291cmNlIEJhc2VsaW5lIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA5PVRhc2sgQmFzZWxpbmUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDEwPVRhc2sgQmFzZWxpbmUgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDExPVRhc2sgUGVyY2VudCBDb21wbGV0ZSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE2PUFzc2lnbm1lbnQgQmFzZWxpbmUgMSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTc9QXNzaWdubWVudCBCYXNlbGluZSAxIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxOD1UYXNrIEJhc2VsaW5lIDEgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE5PVRhc2sgQmFzZWxpbmUgMSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjA9UmVzb3VyY2UgQmFzZWxpbmUgMSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjE9UmVzb3VyY2UgQmFzZWxpbmUgMSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjI9QXNzaWdubWVudCBCYXNlbGluZSAyIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyMz1Bc3NpZ25tZW50IEJhc2VsaW5lIDIgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI0PVRhc2sgQmFzZWxpbmUgMiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjU9VGFzayBCYXNlbGluZSAyIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyNj1SZXNvdXJjZSBCYXNlbGluZSAyIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyNz1SZXNvdXJjZSBCYXNlbGluZSAyIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyOD1Bc3NpZ25tZW50IEJhc2VsaW5lIDMgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI5PUFzc2lnbm1lbnQgQmFzZWxpbmUgMyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzA9VGFzayBCYXNlbGluZSAzIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzMT1UYXNrIEJhc2VsaW5lIDMgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDMyPVJlc291cmNlIEJhc2VsaW5lIDMgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDMzPVJlc291cmNlIEJhc2VsaW5lIDMgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM0PUFzc2lnbm1lbnQgQmFzZWxpbmUgNCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzU9QXNzaWdubWVudCBCYXNlbGluZSA0IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzNj1UYXNrIEJhc2VsaW5lIDQgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM3PVRhc2sgQmFzZWxpbmUgNCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzg9UmVzb3VyY2UgQmFzZWxpbmUgNCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzk9UmVzb3VyY2UgQmFzZWxpbmUgNCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDA9QXNzaWdubWVudCBCYXNlbGluZSA1IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0MT1Bc3NpZ25tZW50IEJhc2VsaW5lIDUgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQyPVRhc2sgQmFzZWxpbmUgNSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDM9VGFzayBCYXNlbGluZSA1IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0ND1SZXNvdXJjZSBCYXNlbGluZSA1IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0NT1SZXNvdXJjZSBCYXNlbGluZSA1IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0Nj1Bc3NpZ25tZW50IEJhc2VsaW5lIDYgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ3PUFzc2lnbm1lbnQgQmFzZWxpbmUgNiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDg9VGFzayBCYXNlbGluZSA2IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0OT1UYXNrIEJhc2VsaW5lIDYgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUwPVJlc291cmNlIEJhc2VsaW5lIDYgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUxPVJlc291cmNlIEJhc2VsaW5lIDYgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUyPUFzc2lnbm1lbnQgQmFzZWxpbmUgNyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTM9QXNzaWdubWVudCBCYXNlbGluZSA3IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1ND1UYXNrIEJhc2VsaW5lIDcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU1PVRhc2sgQmFzZWxpbmUgNyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTY9UmVzb3VyY2UgQmFzZWxpbmUgNyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTc9UmVzb3VyY2UgQmFzZWxpbmUgNyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTg9QXNzaWdubWVudCBCYXNlbGluZSA4IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1OT1Bc3NpZ25tZW50IEJhc2VsaW5lIDggQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDYwPVRhc2sgQmFzZWxpbmUgOCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjE9VGFzayBCYXNlbGluZSA4IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2Mj1SZXNvdXJjZSBCYXNlbGluZSA4IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2Mz1SZXNvdXJjZSBCYXNlbGluZSA4IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2ND1Bc3NpZ25tZW50IEJhc2VsaW5lIDkgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY1PUFzc2lnbm1lbnQgQmFzZWxpbmUgOSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjY9VGFzayBCYXNlbGluZSA5IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2Nz1UYXNrIEJhc2VsaW5lIDkgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY4PVJlc291cmNlIEJhc2VsaW5lIDkgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY5PVJlc291cmNlIEJhc2VsaW5lIDkgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDcwPUFzc2lnbm1lbnQgQmFzZWxpbmUgMTAgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDcxPUFzc2lnbm1lbnQgQmFzZWxpbmUgMTAgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDcyPVRhc2sgQmFzZWxpbmUgMTAgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDczPVRhc2sgQmFzZWxpbmUgMTAgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDc0PVJlc291cmNlIEJhc2VsaW5lIDEwIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3NT1SZXNvdXJjZSBCYXNlbGluZSAxMCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzY9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHJlY29yZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdGFydCBkYXRlIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaXQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9Vbml0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHVuaXQgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1tLCAxPWgsIDI9ZCwgMz13LCA1PW1vLCA4PXkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVbml0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIHBlciB1bml0IG9mIHRpbWUgZm9yIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVGl0bGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaXRsZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlMyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEgMzIgMzMgMzQgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNDUgNDYgNDcgNDggNDkgNTAgNTEgNTIgNTMgNTQgNTUgNTYgNTcgNTggNTkgNjAgNjEgNjIgNjMgNjQgNjUgNjYgNjcgNjggNjkgNzAgNzEgNzIgNzMgNzQgNzUgNzYiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGU0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGU1IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVJRFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjE2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVuaXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVW5pdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNSA4Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgb3V0bGluZSBjb2RlIHZhbHVlIGFjcm9zcyB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcmVudFZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IG5vZGUgb2YgdGhlIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGFyZW50VmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZXNjcmlwdGlvbiBvZiB0aGlzIHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlMiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVW5pcXVlIElEIG9mIHZhbHVlIGFjcm9zcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdmFsdWUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGxpc3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFsdWVMaXN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlTGlzdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlIiBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1ZhbHVlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZXMgdGhhdCBtYWtlIHVwIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlZhbHVlbGlzdFNvcnRPcmRlclR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZWxpc3RTb3J0T3JkZXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFsdWVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9WYWx1ZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpbmRpdmlkdWFsIHZhbHVlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV0JTTWFzayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWwiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsZXZlbCBvZiB0aGUgbWFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVHlwZVR5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgdGhlIG5vZGUgdmFsdWUuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZXMgYXJlOiAwPU51bWJlcnMsIDE9VXBwZXJjYXNlIExldHRlcnMsIDI9TG93ZXJjYXNlIExldHRlcnMsIDM9Q2hhcmFjdGVycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imxlbmd0aCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWF4aW11bSBsZW5ndGggaW4gY2hhcmFjdGVycy4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBvbWl0dGVkIHdoZW4gbGVuZ3RoIGlzICZxdW90O2FueSZxdW90Oy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGVuZ3RoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VwYXJhdG9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIG9mIHRoZSBub2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTZXBhcmF0b3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXQlNNYXNrcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcmlmeVVuaXF1ZUNvZGVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBXQlMgY29kZXMgYXJlIHVuaXF1ZSBmb3IgbmV3IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWZXJpZnlVbmlxdWVDb2RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlQ29kZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIFdCUyBjb2RlcyBhcmUgZ2VuZXJhdGVkIGZvciBuZXcgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkdlbmVyYXRlQ29kZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVmaXgiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9QcmVmaXhUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByZWZpeCBmb3IgYWxsIFdCUyBjb2Rlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZml4Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id0JTTWFzayIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9XQlNNYXNrIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIFdCUyBNYXNrIHRoYXQgaXMgYXBwbGllZCB0byBhbGwgdGFza3MgaW4gdGhlIFByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCU01hc2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWVrRGF5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtEYXlfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXlUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRGF5VHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiBkYXkuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUV4Y2VwdGlvbiwgMT1Nb25kYXksIDI9VHVlc2RheSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM9V2VkbmVzZGF5LCA0PVRodXJzZGF5LCA1PUZyaWRheSwgNj1TYXR1cmRheSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc9U3VuZGF5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRheVR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXlXb3JraW5nIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBzcGVjaWZpZWQgZGF0ZSBvciBkYXkgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaXMgd29ya2luZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGF5V29ya2luZyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVQZXJpb2QiIGVUeXBlPSIjLy9UaW1lUGVyaW9kIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyBhIGNvbnRpZ3VvdXMgc2V0IG9mIGV4Y2VwdGlvbiBkYXlzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZVBlcmlvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtpbmdUaW1lcyIgZVR5cGU9IiMvL1dvcmtpbmdUaW1lcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIHdvcmtpbmcgdGltZXMgdGhhdCBkZWZpbmUgdGhlIHRpbWUgd29ya2VkICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgd2Vla2RheS4gIE9uZSBvZiB0aGVzZSBtdXN0IGJlIHByZXNlbnQsIGFuZCB0aGVyZSBtYXkgYmUgbm8gbW9yZSB0aGFuIGZpdmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JraW5nVGltZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWVrRGF5cyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5c18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlZWtEYXkiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vV2Vla0RheSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgd2Vla2RheSBlaXRoZXIgZGVmaW5lcyByZWd1bGFyIGRheXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHdlZWsgb3IgZXhjZXB0aW9uIGRheXMgaW4gdGhlIGNhbGVuZGFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV2Vla1N0YXJ0RGF5VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtTdGFydERheV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV29ya0NvbnRvdXJUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0NvbnRvdXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDcgOCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJXb3JrRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV29ya0dyb3VwVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtHcm91cF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya2luZ1RpbWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmcm9tVGltZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9UaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJlZ2lubmluZyBvZiB0aGUgd29ya2luZyB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZyb21UaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9UaW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1RpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW5kIG9mIHRoZSB3b3JraW5nICB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvVGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtpbmdUaW1lcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JraW5nVGltZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JraW5nVGltZSIgdXBwZXJCb3VuZD0iNSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtpbmdUaW1lIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgd29ya2luZyB0aW1lIGR1cmluZyB0aGUgd2Vla2RheS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JraW5nVGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzE2N2ZkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZTNiODBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5YmM2ZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdEFkYXB0ZXJGYWN0b3J5LmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3Nvckxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0QWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1zcHJvamVjdFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNc3Byb2plY3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNc3Byb2plY3RTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgTXNwcm9qZWN0U3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlQXNzaWdubWVudChBc3NpZ25tZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBc3NpZ25tZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXNzaWdubWVudHMoQXNzaWdubWVudHMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFzc2lnbm1lbnRzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXZhaWxhYmlsaXR5UGVyaW9kKEF2YWlsYWJpbGl0eVBlcmlvZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXZhaWxhYmlsaXR5UGVyaW9kQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXZhaWxhYmlsaXR5UGVyaW9kcyhBdmFpbGFiaWxpdHlQZXJpb2RzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2RzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQmFzZWxpbmUoQmFzZWxpbmUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUJhc2VsaW5lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQmFzZWxpbmUyKEJhc2VsaW5lMiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQmFzZWxpbmUyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQmFzZWxpbmUzKEJhc2VsaW5lMyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQmFzZWxpbmUzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ2FsZW5kYXIoQ2FsZW5kYXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNhbGVuZGFyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ2FsZW5kYXJzKENhbGVuZGFycyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ2FsZW5kYXJzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRG9jdW1lbnRSb290KERvY3VtZW50Um9vdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRG9jdW1lbnRSb290QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUoRXh0ZW5kZWRBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUyKEV4dGVuZGVkQXR0cmlidXRlMiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUzKEV4dGVuZGVkQXR0cmlidXRlMyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGU0KEV4dGVuZGVkQXR0cmlidXRlNCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGVzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWFzayhNYXNrIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNYXNrQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWFza3MoTWFza3Mgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1hc2tzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlT3V0bGluZUNvZGUoT3V0bGluZUNvZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2RlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlT3V0bGluZUNvZGUyKE91dGxpbmVDb2RlMiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlT3V0bGluZUNvZGUyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlT3V0bGluZUNvZGUzKE91dGxpbmVDb2RlMyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlT3V0bGluZUNvZGUzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlT3V0bGluZUNvZGVzKE91dGxpbmVDb2RlcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlT3V0bGluZUNvZGVzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUHJlZGVjZXNzb3JMaW5rKFByZWRlY2Vzc29yTGluayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJlZGVjZXNzb3JMaW5rQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUHJvamVjdChQcm9qZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9qZWN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmF0ZShSYXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSYXRlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmF0ZXMoUmF0ZXMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJhdGVzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2UoUmVzb3VyY2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VzKFJlc291cmNlcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVGFzayhUYXNrIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYXNrQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVGFza3MoVGFza3Mgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRhc2tzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVGltZVBlcmlvZChUaW1lUGVyaW9kIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUaW1lUGVyaW9kQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVGltZXBoYXNlZERhdGFUeXBlKFRpbWVwaGFzZWREYXRhVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGltZXBoYXNlZERhdGFUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVmFsdWUoVmFsdWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhbHVlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVmFsdWUyKFZhbHVlMiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVmFsdWUyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVmFsdWVMaXN0KFZhbHVlTGlzdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVmFsdWVMaXN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVmFsdWVzKFZhbHVlcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVmFsdWVzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV0JTTWFzayhXQlNNYXNrIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXQlNNYXNrQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV0JTTWFza3MoV0JTTWFza3Mgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdCU01hc2tzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV2Vla0RheShXZWVrRGF5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXZWVrRGF5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV2Vla0RheXMoV2Vla0RheXMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlZWtEYXlzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV29ya2luZ1RpbWUoV29ya2luZ1RpbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtpbmdUaW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV29ya2luZ1RpbWVzKFdvcmtpbmdUaW1lcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya2luZ1RpbWVzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCA8ZW0+QXNzaWdubWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXNzaWdubWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50cwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBc3NpZ25tZW50c0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXZhaWxhYmlsaXR5UGVyaW9kQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHMgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2RzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJhc2VsaW5lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiA8ZW0+QmFzZWxpbmUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJhc2VsaW5lMkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMgPGVtPkJhc2VsaW5lMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCYXNlbGluZTNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIgPGVtPkNhbGVuZGFyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FsZW5kYXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJzIDxlbT5DYWxlbmRhcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FsZW5kYXJzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb2N1bWVudFJvb3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlM0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlcyA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayA8ZW0+TWFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWFza0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrcyA8ZW0+TWFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNYXNrc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0bGluZUNvZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyIDxlbT5PdXRsaW5lIENvZGUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGxpbmVDb2RlMkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMgPGVtPk91dGxpbmUgQ29kZTM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0bGluZUNvZGUzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlcyA8ZW0+T3V0bGluZSBDb2RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRsaW5lQ29kZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByZWRlY2Vzc29yTGlua0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9qZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUgPGVtPlJhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJhdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXMgPGVtPlJhdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmF0ZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UgPGVtPlJlc291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzIDxlbT5SZXNvdXJjZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3MgPGVtPlRhc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRpbWVQZXJpb2RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlIDxlbT5UaW1lcGhhc2VkIERhdGEgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUaW1lcGhhc2VkRGF0YVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyIDxlbT5WYWx1ZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVmFsdWUyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdCA8ZW0+VmFsdWUgTGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYWx1ZUxpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVmFsdWVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sgPGVtPldCUyBNYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXQlNNYXNrQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzIDxlbT5XQlMgTWFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXQlNNYXNrc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5IDxlbT5XZWVrIERheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2Vla0RheUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5cyA8ZW0+V2VlayBEYXlzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2Vla0RheXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUgPGVtPldvcmtpbmcgVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtpbmdUaW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lcyA8ZW0+V29ya2luZyBUaW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JraW5nVGltZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vTXNwcm9qZWN0QWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQyOTJkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSBGYWN0b3J5PC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsLk1zcHJvamVjdFJlc291cmNlSW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJWE1MUmVzb3VyY2UgcmVzdWx0ID0gbmV3IE1zcHJvamVjdFJlc291cmNlSW1wbCh1cmkpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9TQ0hFTUFfTE9DQVRJT04sIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfSAvL01zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0UmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4YzJiYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0UmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdFJlc291cmNlSW1wbC5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIDwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbC5Nc3Byb2plY3RSZXNvdXJjZUZhY3RvcnlJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNc3Byb2plY3RSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSBuZXcgcmVzb3VyY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNc3Byb2plY3RSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQotCXByb3RlY3RlZCBYTUxIZWxwZXIgY3JlYXRlWE1MSGVscGVyKCl7Ci0JICAgIHJldHVybiBuZXcgTXNwcm9qZWN0WE1MSGVscGVySW1wbCh0aGlzKTsKLQl9Ci19IC8vTXNwcm9qZWN0UmVzb3VyY2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkM2MzMTNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdFN3aXRjaC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3Nvckxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1zcHJvamVjdFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNc3Byb2plY3RQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXNwcm9qZWN0U3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVDogewotCQkJCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IChBc3NpZ25tZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBc3NpZ25tZW50KGFzc2lnbm1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UUzogewotCQkJCUFzc2lnbm1lbnRzIGFzc2lnbm1lbnRzID0gKEFzc2lnbm1lbnRzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBc3NpZ25tZW50cyhhc3NpZ25tZW50cyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0Q6IHsKLQkJCQlBdmFpbGFiaWxpdHlQZXJpb2QgYXZhaWxhYmlsaXR5UGVyaW9kID0gKEF2YWlsYWJpbGl0eVBlcmlvZCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXZhaWxhYmlsaXR5UGVyaW9kKGF2YWlsYWJpbGl0eVBlcmlvZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTOiB7Ci0JCQkJQXZhaWxhYmlsaXR5UGVyaW9kcyBhdmFpbGFiaWxpdHlQZXJpb2RzID0gKEF2YWlsYWJpbGl0eVBlcmlvZHMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUF2YWlsYWJpbGl0eVBlcmlvZHMoYXZhaWxhYmlsaXR5UGVyaW9kcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FOiB7Ci0JCQkJQmFzZWxpbmUgYmFzZWxpbmUgPSAoQmFzZWxpbmUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUJhc2VsaW5lKGJhc2VsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyOiB7Ci0JCQkJQmFzZWxpbmUyIGJhc2VsaW5lMiA9IChCYXNlbGluZTIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUJhc2VsaW5lMihiYXNlbGluZTIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTM6IHsKLQkJCQlCYXNlbGluZTMgYmFzZWxpbmUzID0gKEJhc2VsaW5lMyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQmFzZWxpbmUzKGJhc2VsaW5lMyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSOiB7Ci0JCQkJQ2FsZW5kYXIgY2FsZW5kYXIgPSAoQ2FsZW5kYXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNhbGVuZGFyKGNhbGVuZGFyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTOiB7Ci0JCQkJQ2FsZW5kYXJzIGNhbGVuZGFycyA9IChDYWxlbmRhcnMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNhbGVuZGFycyhjYWxlbmRhcnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UOiB7Ci0JCQkJRG9jdW1lbnRSb290IGRvY3VtZW50Um9vdCA9IChEb2N1bWVudFJvb3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURvY3VtZW50Um9vdChkb2N1bWVudFJvb3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU6IHsKLQkJCQlFeHRlbmRlZEF0dHJpYnV0ZSBleHRlbmRlZEF0dHJpYnV0ZSA9IChFeHRlbmRlZEF0dHJpYnV0ZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUoZXh0ZW5kZWRBdHRyaWJ1dGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyOiB7Ci0JCQkJRXh0ZW5kZWRBdHRyaWJ1dGUyIGV4dGVuZGVkQXR0cmlidXRlMiA9IChFeHRlbmRlZEF0dHJpYnV0ZTIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUV4dGVuZGVkQXR0cmlidXRlMihleHRlbmRlZEF0dHJpYnV0ZTIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzOiB7Ci0JCQkJRXh0ZW5kZWRBdHRyaWJ1dGUzIGV4dGVuZGVkQXR0cmlidXRlMyA9IChFeHRlbmRlZEF0dHJpYnV0ZTMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUV4dGVuZGVkQXR0cmlidXRlMyhleHRlbmRlZEF0dHJpYnV0ZTMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0OiB7Ci0JCQkJRXh0ZW5kZWRBdHRyaWJ1dGU0IGV4dGVuZGVkQXR0cmlidXRlNCA9IChFeHRlbmRlZEF0dHJpYnV0ZTQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUV4dGVuZGVkQXR0cmlidXRlNChleHRlbmRlZEF0dHJpYnV0ZTQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVTOiB7Ci0JCQkJRXh0ZW5kZWRBdHRyaWJ1dGVzIGV4dGVuZGVkQXR0cmlidXRlcyA9IChFeHRlbmRlZEF0dHJpYnV0ZXMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUV4dGVuZGVkQXR0cmlidXRlcyhleHRlbmRlZEF0dHJpYnV0ZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLOiB7Ci0JCQkJTWFzayBtYXNrID0gKE1hc2spdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1hc2sobWFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tTOiB7Ci0JCQkJTWFza3MgbWFza3MgPSAoTWFza3MpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1hc2tzKG1hc2tzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFOiB7Ci0JCQkJT3V0bGluZUNvZGUgb3V0bGluZUNvZGUgPSAoT3V0bGluZUNvZGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU91dGxpbmVDb2RlKG91dGxpbmVDb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMjogewotCQkJCU91dGxpbmVDb2RlMiBvdXRsaW5lQ29kZTIgPSAoT3V0bGluZUNvZGUyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VPdXRsaW5lQ29kZTIob3V0bGluZUNvZGUyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMzogewotCQkJCU91dGxpbmVDb2RlMyBvdXRsaW5lQ29kZTMgPSAoT3V0bGluZUNvZGUzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VPdXRsaW5lQ29kZTMob3V0bGluZUNvZGUzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFUzogewotCQkJCU91dGxpbmVDb2RlcyBvdXRsaW5lQ29kZXMgPSAoT3V0bGluZUNvZGVzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VPdXRsaW5lQ29kZXMob3V0bGluZUNvZGVzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOSzogewotCQkJCVByZWRlY2Vzc29yTGluayBwcmVkZWNlc3NvckxpbmsgPSAoUHJlZGVjZXNzb3JMaW5rKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcmVkZWNlc3NvckxpbmsocHJlZGVjZXNzb3JMaW5rKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVDogewotCQkJCVByb2plY3QgcHJvamVjdCA9IChQcm9qZWN0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcm9qZWN0KHByb2plY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFOiB7Ci0JCQkJUmF0ZSByYXRlID0gKFJhdGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJhdGUocmF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVTOiB7Ci0JCQkJUmF0ZXMgcmF0ZXMgPSAoUmF0ZXMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJhdGVzKHJhdGVzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0U6IHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVzb3VyY2UocmVzb3VyY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRVM6IHsKLQkJCQlSZXNvdXJjZXMgcmVzb3VyY2VzID0gKFJlc291cmNlcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVzb3VyY2VzKHJlc291cmNlcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0s6IHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzayl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGFzayh0YXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS1M6IHsKLQkJCQlUYXNrcyB0YXNrcyA9IChUYXNrcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGFza3ModGFza3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRDogewotCQkJCVRpbWVQZXJpb2QgdGltZVBlcmlvZCA9IChUaW1lUGVyaW9kKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUaW1lUGVyaW9kKHRpbWVQZXJpb2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRTogewotCQkJCVRpbWVwaGFzZWREYXRhVHlwZSB0aW1lcGhhc2VkRGF0YVR5cGUgPSAoVGltZXBoYXNlZERhdGFUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUaW1lcGhhc2VkRGF0YVR5cGUodGltZXBoYXNlZERhdGFUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUU6IHsKLQkJCQlWYWx1ZSB2YWx1ZSA9IChWYWx1ZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVmFsdWUodmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTI6IHsKLQkJCQlWYWx1ZTIgdmFsdWUyID0gKFZhbHVlMil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVmFsdWUyKHZhbHVlMik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1Q6IHsKLQkJCQlWYWx1ZUxpc3QgdmFsdWVMaXN0ID0gKFZhbHVlTGlzdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVmFsdWVMaXN0KHZhbHVlTGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFUzogewotCQkJCVZhbHVlcyB2YWx1ZXMgPSAoVmFsdWVzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VWYWx1ZXModmFsdWVzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0s6IHsKLQkJCQlXQlNNYXNrIHdic01hc2sgPSAoV0JTTWFzayl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV0JTTWFzayh3YnNNYXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTOiB7Ci0JCQkJV0JTTWFza3Mgd2JzTWFza3MgPSAoV0JTTWFza3MpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdCU01hc2tzKHdic01hc2tzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVk6IHsKLQkJCQlXZWVrRGF5IHdlZWtEYXkgPSAoV2Vla0RheSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2Vla0RheSh3ZWVrRGF5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlTOiB7Ci0JCQkJV2Vla0RheXMgd2Vla0RheXMgPSAoV2Vla0RheXMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlZWtEYXlzKHdlZWtEYXlzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FOiB7Ci0JCQkJV29ya2luZ1RpbWUgd29ya2luZ1RpbWUgPSAoV29ya2luZ1RpbWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtpbmdUaW1lKHdvcmtpbmdUaW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FUzogewotCQkJCVdvcmtpbmdUaW1lcyB3b3JraW5nVGltZXMgPSAoV29ya2luZ1RpbWVzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXb3JraW5nVGltZXMod29ya2luZ1RpbWVzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXNzaWdubWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Bc3NpZ25tZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBc3NpZ25tZW50KEFzc2lnbm1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Bc3NpZ25tZW50czwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Bc3NpZ25tZW50czwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXNzaWdubWVudHMoQXNzaWdubWVudHMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUF2YWlsYWJpbGl0eVBlcmlvZChBdmFpbGFiaWxpdHlQZXJpb2Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXZhaWxhYmlsaXR5UGVyaW9kcyhBdmFpbGFiaWxpdHlQZXJpb2RzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUJhc2VsaW5lKEJhc2VsaW5lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmFzZWxpbmUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJhc2VsaW5lMjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQmFzZWxpbmUyKEJhc2VsaW5lMiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJhc2VsaW5lMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CYXNlbGluZTM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUJhc2VsaW5lMyhCYXNlbGluZTMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DYWxlbmRhcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DYWxlbmRhcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ2FsZW5kYXIoQ2FsZW5kYXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DYWxlbmRhcnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2FsZW5kYXJzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDYWxlbmRhcnMoQ2FsZW5kYXJzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEb2N1bWVudFJvb3QoRG9jdW1lbnRSb290IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUoRXh0ZW5kZWRBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuZGVkQXR0cmlidXRlMihFeHRlbmRlZEF0dHJpYnV0ZTIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuZGVkQXR0cmlidXRlMyhFeHRlbmRlZEF0dHJpYnV0ZTMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuZGVkQXR0cmlidXRlNChFeHRlbmRlZEF0dHJpYnV0ZTQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuZGVkQXR0cmlidXRlcyhFeHRlbmRlZEF0dHJpYnV0ZXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NYXNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1hc2s8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1hc2soTWFzayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1hc2tzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1hc2tzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNYXNrcyhNYXNrcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlKE91dGxpbmVDb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0bGluZSBDb2RlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRsaW5lIENvZGUyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZTIoT3V0bGluZUNvZGUyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0bGluZSBDb2RlMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRsaW5lIENvZGUzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZTMoT3V0bGluZUNvZGUzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRsaW5lIENvZGVzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZXMoT3V0bGluZUNvZGVzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcmVkZWNlc3NvckxpbmsoUHJlZGVjZXNzb3JMaW5rIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9qZWN0KFByb2plY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJhdGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJhdGUoUmF0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJhdGVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJhdGVzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSYXRlcyhSYXRlcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZShSZXNvdXJjZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZXM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlcyhSZXNvdXJjZXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRhc2soVGFzayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2tzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2tzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrcyhUYXNrcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRpbWUgUGVyaW9kPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRpbWUgUGVyaW9kPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUaW1lUGVyaW9kKFRpbWVQZXJpb2Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UaW1lcGhhc2VkIERhdGEgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UaW1lcGhhc2VkIERhdGEgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGltZXBoYXNlZERhdGFUeXBlKFRpbWVwaGFzZWREYXRhVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZShWYWx1ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhbHVlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYWx1ZTI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVZhbHVlMihWYWx1ZTIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYWx1ZSBMaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhbHVlIExpc3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVZhbHVlTGlzdChWYWx1ZUxpc3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYWx1ZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWVzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZXMoVmFsdWVzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V0JTIE1hc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V0JTIE1hc2s8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdCU01hc2soV0JTTWFzayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldCUyBNYXNrczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XQlMgTWFza3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdCU01hc2tzKFdCU01hc2tzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2VlayBEYXk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2VlayBEYXk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdlZWtEYXkoV2Vla0RheSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlZWsgRGF5czwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWVrIERheXM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdlZWtEYXlzKFdlZWtEYXlzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmtpbmcgVGltZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV29ya2luZ1RpbWUoV29ya2luZ1RpbWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmtpbmcgVGltZXM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL01zcHJvamVjdFN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0VmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTViYTlkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ODMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNc3Byb2plY3RWYWxpZGF0b3IuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWNDaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUudXRpbC5YTUxUeXBlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+VmFsaWRhdG9yPC9iPiBmb3IgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0VmFsaWRhdG9yIGV4dGVuZHMgRU9iamVjdFZhbGlkYXRvciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNc3Byb2plY3RWYWxpZGF0b3IgSU5TVEFOQ0UgPSBuZXcgTXNwcm9qZWN0VmFsaWRhdG9yKCk7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IGZvciB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljI2dldFNvdXJjZSgpIHNvdXJjZX0gb2YgZGlhZ25vc3RpYyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMjZ2V0Q29kZSgpIGNvZGVzfSBmcm9tIHRoaXMgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMjZ2V0U291cmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljI2dldENvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHTk9TVElDX1NPVVJDRSA9ICJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0IjsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgd2l0aCBhIGZpeGVkIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgYmFzZSB2YWx1ZSBmb3IgYWRkaXRpb25hbCBoYW5kIHdyaXR0ZW4gY29uc3RhbnRzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRU5FUkFURURfRElBR05PU1RJQ19DT0RFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgd2l0aCBhIGZpeGVkIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgYmFzZSB2YWx1ZSBmb3IgYWRkaXRpb25hbCBoYW5kIHdyaXR0ZW4gY29uc3RhbnRzIGluIGEgZGVyaXZlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBESUFHTk9TVElDX0NPREVfQ09VTlQgPSBHRU5FUkFURURfRElBR05PU1RJQ19DT0RFX0NPVU5UOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCBiYXNlIHBhY2thZ2UgdmFsaWRhdG9yLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYTUxUeXBlVmFsaWRhdG9yIHhtbFR5cGVWYWxpZGF0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQkJeG1sVHlwZVZhbGlkYXRvciA9IFhNTFR5cGVWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBvZiB0aGlzIHZhbGlkYXRvciBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCSAgcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPnZhbGlkYXRlWFhYPC9jb2RlPiBmb3IgdGhlIGNvcnJlc29uZGluZyBjbGFzc2lmaWVyIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShpbnQgY2xhc3NpZmllcklELCBPYmplY3QgdmFsdWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UOgotCQkJCXJldHVybiB2YWxpZGF0ZUFzc2lnbm1lbnQoKEFzc2lnbm1lbnQpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVBc3NpZ25tZW50cygoQXNzaWdubWVudHMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EOgotCQkJCXJldHVybiB2YWxpZGF0ZUF2YWlsYWJpbGl0eVBlcmlvZCgoQXZhaWxhYmlsaXR5UGVyaW9kKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQXZhaWxhYmlsaXR5UGVyaW9kcygoQXZhaWxhYmlsaXR5UGVyaW9kcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FOgotCQkJCXJldHVybiB2YWxpZGF0ZUJhc2VsaW5lKChCYXNlbGluZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVCYXNlbGluZTIoKEJhc2VsaW5lMil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVCYXNlbGluZTMoKEJhc2VsaW5lMyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSOgotCQkJCXJldHVybiB2YWxpZGF0ZUNhbGVuZGFyKChDYWxlbmRhcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVDYWxlbmRhcnMoKENhbGVuZGFycyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRG9jdW1lbnRSb290KChEb2N1bWVudFJvb3QpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGUoKEV4dGVuZGVkQXR0cmlidXRlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZTIoKEV4dGVuZGVkQXR0cmlidXRlMil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGUzKChFeHRlbmRlZEF0dHJpYnV0ZTMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0OgotCQkJCXJldHVybiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlNCgoRXh0ZW5kZWRBdHRyaWJ1dGU0KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZXMoKEV4dGVuZGVkQXR0cmlidXRlcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0s6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTWFzaygoTWFzayl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tTOgotCQkJCXJldHVybiB2YWxpZGF0ZU1hc2tzKChNYXNrcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERToKLQkJCQlyZXR1cm4gdmFsaWRhdGVPdXRsaW5lQ29kZSgoT3V0bGluZUNvZGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyOgotCQkJCXJldHVybiB2YWxpZGF0ZU91dGxpbmVDb2RlMigoT3V0bGluZUNvZGUyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVPdXRsaW5lQ29kZTMoKE91dGxpbmVDb2RlMyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlT3V0bGluZUNvZGVzKChPdXRsaW5lQ29kZXMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LOgotCQkJCXJldHVybiB2YWxpZGF0ZVByZWRlY2Vzc29yTGluaygoUHJlZGVjZXNzb3JMaW5rKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVQcm9qZWN0KChQcm9qZWN0KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURToKLQkJCQlyZXR1cm4gdmFsaWRhdGVSYXRlKChSYXRlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURVM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUmF0ZXMoKFJhdGVzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0U6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUmVzb3VyY2UoKFJlc291cmNlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTOgotCQkJCXJldHVybiB2YWxpZGF0ZVJlc291cmNlcygoUmVzb3VyY2VzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTSzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVUYXNrKChUYXNrKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS1M6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVGFza3MoKFRhc2tzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVGltZVBlcmlvZCgoVGltZVBlcmlvZCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVRpbWVwaGFzZWREYXRhVHlwZSgoVGltZXBoYXNlZERhdGFUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVmFsdWUoKFZhbHVlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyOgotCQkJCXJldHVybiB2YWxpZGF0ZVZhbHVlMigoVmFsdWUyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZUxpc3QoKFZhbHVlTGlzdCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZXMoKFZhbHVlcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLOgotCQkJCXJldHVybiB2YWxpZGF0ZVdCU01hc2soKFdCU01hc2spdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1M6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV0JTTWFza3MoKFdCU01hc2tzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVk6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV2Vla0RheSgoV2Vla0RheSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVXZWVrRGF5cygoV2Vla0RheXMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV29ya2luZ1RpbWUoKFdvcmtpbmdUaW1lKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVXb3JraW5nVGltZXMoKFdvcmtpbmdUaW1lcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDQ1JVRV9BVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVBY2NydWVBdCgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDVElWRV9ESVJFQ1RPUllfR1VJRF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BTElBU19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUFsaWFzVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVVUSE9SX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQXV0aG9yVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZTEoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxDVUxBVElPTl9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ2FsY3VsYXRpb25UeXBlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBVEVHT1JZX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ2F0ZWdvcnlUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT0RFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ29kZVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTVBBTllfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVDb21wYW55VHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OU1RSQUlOVF9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ29uc3RyYWludFR5cGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OVEFDVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUNvbnRhY3RUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT1NUX1JBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVDb3N0UmF0ZVRhYmxlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ1VSUkVOQ1lfU1lNQk9MX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EQVlfVFlQRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZURheVR5cGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfRVZfTUVUSE9EX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfVFlQRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZURlZmF1bHRUYXNrVHlwZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUyKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEUzOgotCQkJCXJldHVybiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTMoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTQ6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNCgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGU1KChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVNQUlMX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVFbWFpbEFkZHJlc3NUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFUk5BTF9UQVNLX1BST0pFQ1RfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRklYRURfQ09TVF9BQ0NSVUFMX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRml4ZWRDb3N0QWNjcnVhbFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZZX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVGWVN0YXJ0RGF0ZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5HUk9VUF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUdyb3VwVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUxKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTIoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rVHlwZTEoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMigoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSU5JVElBTFNfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVJbml0aWFsc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkxBR19GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVMYWdGb3JtYXRUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5MRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFOQUdFUl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU1hbmFnZXJUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVRFUklBTF9MQUJFTF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU1hdGVyaWFsTGFiZWxUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTmFtZVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5BTUVfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTmFtZVR5cGUxKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEUyOgotCQkJCXJldHVybiB2YWxpZGF0ZU5hbWVUeXBlMigoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVOYW1lVHlwZTMoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5FV19UQVNLX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVOZXdUYXNrU3RhcnREYXRlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5UX0FDQ09VTlRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVOVEFjY291bnRUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX05VTUJFUl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU91dGxpbmVOdW1iZXJUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDX0FMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUGhvbmV0aWNBbGlhc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDU19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVBob25ldGljc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRUZJWF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVByZWZpeFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVSYXRlVGFibGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUk9MTFVQX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVSb2xsdXBUeXBlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1VCSkVDVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVN1YmplY3RUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVUJQUk9KRUNUX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVTdWJwcm9qZWN0TmFtZVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJVExFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVGl0bGVUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHlwZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZVR5cGVUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHlwZVR5cGUyKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVUeXBlVHlwZTMoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEU0OgotCQkJCXJldHVybiB2YWxpZGF0ZVR5cGVUeXBlNCgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHlwZVR5cGU1KChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVUlEX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVUlEVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVU5JVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVVuaXRUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVMSVNUX1NPUlRfT1JERVJfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19TVEFSVF9EQVlfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVXZWVrU3RhcnREYXlUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19DT05UT1VSX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV29ya0NvbnRvdXJUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVXb3JrRm9ybWF0VHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfR1JPVVBfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVXb3JrR3JvdXBUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQlkZWZhdWx0OiAKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXNzaWdubWVudChBc3NpZ25tZW50IGFzc2lnbm1lbnQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYXNzaWdubWVudCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXNzaWdubWVudHMoQXNzaWdubWVudHMgYXNzaWdubWVudHMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYXNzaWdubWVudHMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUF2YWlsYWJpbGl0eVBlcmlvZChBdmFpbGFiaWxpdHlQZXJpb2QgYXZhaWxhYmlsaXR5UGVyaW9kLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGF2YWlsYWJpbGl0eVBlcmlvZCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXZhaWxhYmlsaXR5UGVyaW9kcyhBdmFpbGFiaWxpdHlQZXJpb2RzIGF2YWlsYWJpbGl0eVBlcmlvZHMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYXZhaWxhYmlsaXR5UGVyaW9kcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQmFzZWxpbmUoQmFzZWxpbmUgYmFzZWxpbmUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYmFzZWxpbmUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJhc2VsaW5lMihCYXNlbGluZTIgYmFzZWxpbmUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGJhc2VsaW5lMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQmFzZWxpbmUzKEJhc2VsaW5lMyBiYXNlbGluZTMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYmFzZWxpbmUzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDYWxlbmRhcihDYWxlbmRhciBjYWxlbmRhciwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChjYWxlbmRhciwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ2FsZW5kYXJzKENhbGVuZGFycyBjYWxlbmRhcnMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoY2FsZW5kYXJzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEb2N1bWVudFJvb3QoRG9jdW1lbnRSb290IGRvY3VtZW50Um9vdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChkb2N1bWVudFJvb3QsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlKEV4dGVuZGVkQXR0cmlidXRlIGV4dGVuZGVkQXR0cmlidXRlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGV4dGVuZGVkQXR0cmlidXRlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZTIoRXh0ZW5kZWRBdHRyaWJ1dGUyIGV4dGVuZGVkQXR0cmlidXRlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChleHRlbmRlZEF0dHJpYnV0ZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlMyhFeHRlbmRlZEF0dHJpYnV0ZTMgZXh0ZW5kZWRBdHRyaWJ1dGUzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGV4dGVuZGVkQXR0cmlidXRlMywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0KEV4dGVuZGVkQXR0cmlidXRlNCBleHRlbmRlZEF0dHJpYnV0ZTQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoZXh0ZW5kZWRBdHRyaWJ1dGU0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZXMoRXh0ZW5kZWRBdHRyaWJ1dGVzIGV4dGVuZGVkQXR0cmlidXRlcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChleHRlbmRlZEF0dHJpYnV0ZXMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1hc2soTWFzayBtYXNrLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KG1hc2ssIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1hc2tzKE1hc2tzIG1hc2tzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KG1hc2tzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdXRsaW5lQ29kZShPdXRsaW5lQ29kZSBvdXRsaW5lQ29kZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChvdXRsaW5lQ29kZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlT3V0bGluZUNvZGUyKE91dGxpbmVDb2RlMiBvdXRsaW5lQ29kZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQob3V0bGluZUNvZGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdXRsaW5lQ29kZTMoT3V0bGluZUNvZGUzIG91dGxpbmVDb2RlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChvdXRsaW5lQ29kZTMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU91dGxpbmVDb2RlcyhPdXRsaW5lQ29kZXMgb3V0bGluZUNvZGVzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KG91dGxpbmVDb2RlcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUHJlZGVjZXNzb3JMaW5rKFByZWRlY2Vzc29yTGluayBwcmVkZWNlc3NvckxpbmssIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQocHJlZGVjZXNzb3JMaW5rLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQcm9qZWN0KFByb2plY3QgcHJvamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChwcm9qZWN0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSYXRlKFJhdGUgcmF0ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChyYXRlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSYXRlcyhSYXRlcyByYXRlcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChyYXRlcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQocmVzb3VyY2UsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJlc291cmNlcyhSZXNvdXJjZXMgcmVzb3VyY2VzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHJlc291cmNlcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVGFzayhUYXNrIHRhc2ssIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodGFzaywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVGFza3MoVGFza3MgdGFza3MsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodGFza3MsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRpbWVQZXJpb2QoVGltZVBlcmlvZCB0aW1lUGVyaW9kLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHRpbWVQZXJpb2QsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRpbWVwaGFzZWREYXRhVHlwZShUaW1lcGhhc2VkRGF0YVR5cGUgdGltZXBoYXNlZERhdGFUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHRpbWVwaGFzZWREYXRhVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWUoVmFsdWUgdmFsdWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlMihWYWx1ZTIgdmFsdWUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHZhbHVlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWVMaXN0KFZhbHVlTGlzdCB2YWx1ZUxpc3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodmFsdWVMaXN0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZXMoVmFsdWVzIHZhbHVlcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh2YWx1ZXMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdCU01hc2soV0JTTWFzayB3YnNNYXNrLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHdic01hc2ssIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdCU01hc2tzKFdCU01hc2tzIHdic01hc2tzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHdic01hc2tzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWVrRGF5KFdlZWtEYXkgd2Vla0RheSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh3ZWVrRGF5LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWVrRGF5cyhXZWVrRGF5cyB3ZWVrRGF5cywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh3ZWVrRGF5cywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya2luZ1RpbWUoV29ya2luZ1RpbWUgd29ya2luZ1RpbWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQod29ya2luZ1RpbWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMgd29ya2luZ1RpbWVzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHdvcmtpbmdUaW1lcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWNjcnVlQXQoQmlnSW50ZWdlciBhY2NydWVBdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQWNjcnVlQXRfRW51bWVyYXRpb24oYWNjcnVlQXQsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUFjY3J1ZUF0X0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEFDQ1JVRV9BVF9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkFjY3J1ZSBBdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFjY3J1ZUF0X0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgYWNjcnVlQXQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBBQ0NSVUVfQVRfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoYWNjcnVlQXQpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjY3J1ZUF0KCksIGFjY3J1ZUF0LCBBQ0NSVUVfQVRfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZShTdHJpbmcgYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlX01heExlbmd0aChhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlX01heExlbmd0aChTdHJpbmcgYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGFjdGl2ZURpcmVjdG9yeUdVSURUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDE2OwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSgpLCBhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSwgbGVuZ3RoLCAxNiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWxpYXNUeXBlKFN0cmluZyBhbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUFsaWFzVHlwZV9NYXhMZW5ndGgoYWxpYXNUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkFsaWFzIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBbGlhc1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBhbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGFsaWFzVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MDsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWxpYXNUeXBlKCksIGFsaWFzVHlwZSwgbGVuZ3RoLCA1MCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXV0aG9yVHlwZShTdHJpbmcgYXV0aG9yVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQXV0aG9yVHlwZV9NYXhMZW5ndGgoYXV0aG9yVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5BdXRob3IgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUF1dGhvclR5cGVfTWF4TGVuZ3RoKFN0cmluZyBhdXRob3JUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBhdXRob3JUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXV0aG9yVHlwZSgpLCBhdXRob3JUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUoQmlnSW50ZWdlciBiYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVfRW51bWVyYXRpb24oYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSgpLCBiYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSwgQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlKEJpZ0ludGVnZXIgYm9va2luZ1R5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVCb29raW5nVHlwZVR5cGVfRW51bWVyYXRpb24oYm9va2luZ1R5cGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVCb29raW5nVHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gQk9PS0lOR19UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Cb29raW5nIFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGJvb2tpbmdUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IEJPT0tJTkdfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGJvb2tpbmdUeXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Qm9va2luZ1R5cGVUeXBlKCksIGJvb2tpbmdUeXBlVHlwZSwgQk9PS0lOR19UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCb29raW5nVHlwZVR5cGUxKEJpZ0ludGVnZXIgYm9va2luZ1R5cGVUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlMV9FbnVtZXJhdGlvbihib29raW5nVHlwZVR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVCb29raW5nVHlwZVR5cGUxX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEJPT0tJTkdfVFlQRV9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkJvb2tpbmcgVHlwZSBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZTFfRW51bWVyYXRpb24oQmlnSW50ZWdlciBib29raW5nVHlwZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQk9PS0lOR19UWVBFX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGJvb2tpbmdUeXBlVHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEJvb2tpbmdUeXBlVHlwZTEoKSwgYm9va2luZ1R5cGVUeXBlMSwgQk9PS0lOR19UWVBFX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ2FsY3VsYXRpb25UeXBlVHlwZShCaWdJbnRlZ2VyIGNhbGN1bGF0aW9uVHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUNhbGN1bGF0aW9uVHlwZVR5cGVfRW51bWVyYXRpb24oY2FsY3VsYXRpb25UeXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlQ2FsY3VsYXRpb25UeXBlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBDQUxDVUxBVElPTl9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5DYWxjdWxhdGlvbiBUeXBlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDYWxjdWxhdGlvblR5cGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgY2FsY3VsYXRpb25UeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IENBTENVTEFUSU9OX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhjYWxjdWxhdGlvblR5cGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYWxjdWxhdGlvblR5cGVUeXBlKCksIGNhbGN1bGF0aW9uVHlwZVR5cGUsIENBTENVTEFUSU9OX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNhdGVnb3J5VHlwZShTdHJpbmcgY2F0ZWdvcnlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDYXRlZ29yeVR5cGVfTWF4TGVuZ3RoKGNhdGVnb3J5VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5DYXRlZ29yeSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ2F0ZWdvcnlUeXBlX01heExlbmd0aChTdHJpbmcgY2F0ZWdvcnlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBjYXRlZ29yeVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXRlZ29yeVR5cGUoKSwgY2F0ZWdvcnlUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29kZVR5cGUoU3RyaW5nIGNvZGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDb2RlVHlwZV9NYXhMZW5ndGgoY29kZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+Q29kZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29kZVR5cGVfTWF4TGVuZ3RoKFN0cmluZyBjb2RlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gY29kZVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb2RlVHlwZSgpLCBjb2RlVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbXBhbnlUeXBlKFN0cmluZyBjb21wYW55VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ29tcGFueVR5cGVfTWF4TGVuZ3RoKGNvbXBhbnlUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkNvbXBhbnkgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbXBhbnlUeXBlX01heExlbmd0aChTdHJpbmcgY29tcGFueVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGNvbXBhbnlUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcGFueVR5cGUoKSwgY29tcGFueVR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb25zdHJhaW50VHlwZVR5cGUoQmlnSW50ZWdlciBjb25zdHJhaW50VHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUNvbnN0cmFpbnRUeXBlVHlwZV9FbnVtZXJhdGlvbihjb25zdHJhaW50VHlwZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUNvbnN0cmFpbnRUeXBlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBDT05TVFJBSU5UX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkNvbnN0cmFpbnQgVHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29uc3RyYWludFR5cGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgY29uc3RyYWludFR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQ09OU1RSQUlOVF9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoY29uc3RyYWludFR5cGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25zdHJhaW50VHlwZVR5cGUoKSwgY29uc3RyYWludFR5cGVUeXBlLCBDT05TVFJBSU5UX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbnRhY3RUeXBlKFN0cmluZyBjb250YWN0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ29udGFjdFR5cGVfTWF4TGVuZ3RoKGNvbnRhY3RUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkNvbnRhY3QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbnRhY3RUeXBlX01heExlbmd0aChTdHJpbmcgY29udGFjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGNvbnRhY3RUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGFjdFR5cGUoKSwgY29udGFjdFR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb3N0UmF0ZVRhYmxlVHlwZShCaWdJbnRlZ2VyIGNvc3RSYXRlVGFibGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDb3N0UmF0ZVRhYmxlVHlwZV9FbnVtZXJhdGlvbihjb3N0UmF0ZVRhYmxlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlQ29zdFJhdGVUYWJsZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gQ09TVF9SQVRFX1RBQkxFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Db3N0IFJhdGUgVGFibGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvc3RSYXRlVGFibGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgY29zdFJhdGVUYWJsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBDT1NUX1JBVEVfVEFCTEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhjb3N0UmF0ZVRhYmxlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29zdFJhdGVUYWJsZVR5cGUoKSwgY29zdFJhdGVUYWJsZVR5cGUsIENPU1RfUkFURV9UQUJMRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUoQmlnSW50ZWdlciBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGVfRW51bWVyYXRpb24oY3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoY3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlKCksIGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlLCBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sVHlwZShTdHJpbmcgY3VycmVuY3lTeW1ib2xUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDdXJyZW5jeVN5bWJvbFR5cGVfTWF4TGVuZ3RoKGN1cnJlbmN5U3ltYm9sVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5DdXJyZW5jeSBTeW1ib2wgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGN1cnJlbmN5U3ltYm9sVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gY3VycmVuY3lTeW1ib2xUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDIwOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXJyZW5jeVN5bWJvbFR5cGUoKSwgY3VycmVuY3lTeW1ib2xUeXBlLCBsZW5ndGgsIDIwLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEYXlUeXBlVHlwZShCaWdJbnRlZ2VyIGRheVR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEYXlUeXBlVHlwZV9FbnVtZXJhdGlvbihkYXlUeXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRGF5VHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gREFZX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkRheSBUeXBlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEYXlUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGRheVR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gREFZX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhkYXlUeXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGF5VHlwZVR5cGUoKSwgZGF5VHlwZVR5cGUsIERBWV9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoQmlnSW50ZWdlciBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbihkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IERFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKSwgZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlLCBERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoQmlnSW50ZWdlciBkZWZhdWx0VGFza0VWTWV0aG9kVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGVfRW51bWVyYXRpb24oZGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZURlZmF1bHRUYXNrRVZNZXRob2RUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURlZmF1bHRUYXNrRVZNZXRob2RUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBERUZBVUxUX1RBU0tfRVZfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmF1bHRUYXNrRVZNZXRob2RUeXBlKCksIGRlZmF1bHRUYXNrRVZNZXRob2RUeXBlLCBERUZBVUxUX1RBU0tfRVZfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEZWZhdWx0VGFza1R5cGVUeXBlKEJpZ0ludGVnZXIgZGVmYXVsdFRhc2tUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRGVmYXVsdFRhc2tUeXBlVHlwZV9FbnVtZXJhdGlvbihkZWZhdWx0VGFza1R5cGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEZWZhdWx0VGFza1R5cGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERFRkFVTFRfVEFTS19UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGVmYXVsdFRhc2tUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGRlZmF1bHRUYXNrVHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBERUZBVUxUX1RBU0tfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGRlZmF1bHRUYXNrVHlwZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmF1bHRUYXNrVHlwZVR5cGUoKSwgZGVmYXVsdFRhc2tUeXBlVHlwZSwgREVGQVVMVF9UQVNLX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZShCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlX0VudW1lcmF0aW9uKGR1cmF0aW9uRm9ybWF0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERVUkFUSU9OX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRFVSQVRJT05fRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZHVyYXRpb25Gb3JtYXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREdXJhdGlvbkZvcm1hdFR5cGUoKSwgZHVyYXRpb25Gb3JtYXRUeXBlLCBEVVJBVElPTl9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTEoQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKGR1cmF0aW9uRm9ybWF0VHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTFfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRFVSQVRJT05fRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTFfRW51bWVyYXRpb24oQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRFVSQVRJT05fRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGR1cmF0aW9uRm9ybWF0VHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldER1cmF0aW9uRm9ybWF0VHlwZTEoKSwgZHVyYXRpb25Gb3JtYXRUeXBlMSwgRFVSQVRJT05fRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMihCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTJfRW51bWVyYXRpb24oZHVyYXRpb25Gb3JtYXRUeXBlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMl9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBEVVJBVElPTl9GT1JNQVRfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMl9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBEVVJBVElPTl9GT1JNQVRfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZHVyYXRpb25Gb3JtYXRUeXBlMik7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMigpLCBkdXJhdGlvbkZvcm1hdFR5cGUyLCBEVVJBVElPTl9GT1JNQVRfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUzKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlM19FbnVtZXJhdGlvbihkdXJhdGlvbkZvcm1hdFR5cGUzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUzX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERVUkFUSU9OX0ZPUk1BVF9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUzX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IERVUkFUSU9OX0ZPUk1BVF9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhkdXJhdGlvbkZvcm1hdFR5cGUzKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREdXJhdGlvbkZvcm1hdFR5cGUzKCksIGR1cmF0aW9uRm9ybWF0VHlwZTMsIERVUkFUSU9OX0ZPUk1BVF9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTQoQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGU0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGU0X0VudW1lcmF0aW9uKGR1cmF0aW9uRm9ybWF0VHlwZTQsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTRfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRFVSQVRJT05fRk9STUFUX1RZUEU0X19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTRfRW51bWVyYXRpb24oQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGU0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRFVSQVRJT05fRk9STUFUX1RZUEU0X19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGR1cmF0aW9uRm9ybWF0VHlwZTQpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldER1cmF0aW9uRm9ybWF0VHlwZTQoKSwgZHVyYXRpb25Gb3JtYXRUeXBlNCwgRFVSQVRJT05fRk9STUFUX1RZUEU0X19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNShCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTVfRW51bWVyYXRpb24oZHVyYXRpb25Gb3JtYXRUeXBlNSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBEVVJBVElPTl9GT1JNQVRfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU1PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBEVVJBVElPTl9GT1JNQVRfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZHVyYXRpb25Gb3JtYXRUeXBlNSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNSgpLCBkdXJhdGlvbkZvcm1hdFR5cGU1LCBEVVJBVElPTl9GT1JNQVRfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoQmlnSW50ZWdlciBlYXJuZWRWYWx1ZU1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZV9FbnVtZXJhdGlvbihlYXJuZWRWYWx1ZU1ldGhvZFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBlYXJuZWRWYWx1ZU1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZWFybmVkVmFsdWVNZXRob2RUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoKSwgZWFybmVkVmFsdWVNZXRob2RUeXBlLCBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxKEJpZ0ludGVnZXIgZWFybmVkVmFsdWVNZXRob2RUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMV9FbnVtZXJhdGlvbihlYXJuZWRWYWx1ZU1ldGhvZFR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGVhcm5lZFZhbHVlTWV0aG9kVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGVhcm5lZFZhbHVlTWV0aG9kVHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEVhcm5lZFZhbHVlTWV0aG9kVHlwZTEoKSwgZWFybmVkVmFsdWVNZXRob2RUeXBlMSwgRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVtYWlsQWRkcmVzc1R5cGUoU3RyaW5nIGVtYWlsQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUVtYWlsQWRkcmVzc1R5cGVfTWF4TGVuZ3RoKGVtYWlsQWRkcmVzc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+RW1haWwgQWRkcmVzcyBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW1haWxBZGRyZXNzVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGVtYWlsQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGVtYWlsQWRkcmVzc1R5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbWFpbEFkZHJlc3NUeXBlKCksIGVtYWlsQWRkcmVzc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZShTdHJpbmcgZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUV4dGVybmFsVGFza1Byb2plY3RUeXBlX01heExlbmd0aChleHRlcm5hbFRhc2tQcm9qZWN0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUV4dGVybmFsVGFza1Byb2plY3RUeXBlX01heExlbmd0aChTdHJpbmcgZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGV4dGVybmFsVGFza1Byb2plY3RUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUoKSwgZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVGaXhlZENvc3RBY2NydWFsVHlwZShTdHJpbmcgZml4ZWRDb3N0QWNjcnVhbFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUZpeGVkQ29zdEFjY3J1YWxUeXBlX0VudW1lcmF0aW9uKGZpeGVkQ29zdEFjY3J1YWxUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBGSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJICIxIiwKLQkJCQkgIjIiLAotCQkJCSAiMyIKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRml4ZWRDb3N0QWNjcnVhbFR5cGVfRW51bWVyYXRpb24oU3RyaW5nIGZpeGVkQ29zdEFjY3J1YWxUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRklYRURfQ09TVF9BQ0NSVUFMX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZml4ZWRDb3N0QWNjcnVhbFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEZpeGVkQ29zdEFjY3J1YWxUeXBlKCksIGZpeGVkQ29zdEFjY3J1YWxUeXBlLCBGSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUZZU3RhcnREYXRlVHlwZShCaWdJbnRlZ2VyIGZ5U3RhcnREYXRlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRllTdGFydERhdGVUeXBlX0VudW1lcmF0aW9uKGZ5U3RhcnREYXRlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRllTdGFydERhdGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEZZX1NUQVJUX0RBVEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkZZIFN0YXJ0IERhdGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUZZU3RhcnREYXRlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGZ5U3RhcnREYXRlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IEZZX1NUQVJUX0RBVEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhmeVN0YXJ0RGF0ZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEZZU3RhcnREYXRlVHlwZSgpLCBmeVN0YXJ0RGF0ZVR5cGUsIEZZX1NUQVJUX0RBVEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUdyb3VwVHlwZShTdHJpbmcgZ3JvdXBUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVHcm91cFR5cGVfTWF4TGVuZ3RoKGdyb3VwVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5Hcm91cCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlR3JvdXBUeXBlX01heExlbmd0aChTdHJpbmcgZ3JvdXBUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBncm91cFR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRHcm91cFR5cGUoKSwgZ3JvdXBUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUoU3RyaW5nIGh5cGVybGlua0FkZHJlc3NUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZV9NYXhMZW5ndGgoaHlwZXJsaW5rQWRkcmVzc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua0FkZHJlc3NUeXBlX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua0FkZHJlc3NUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rQWRkcmVzc1R5cGUoKSwgaHlwZXJsaW5rQWRkcmVzc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTEoU3RyaW5nIGh5cGVybGlua0FkZHJlc3NUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUxX01heExlbmd0aChoeXBlcmxpbmtBZGRyZXNzVHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTFfTWF4TGVuZ3RoKFN0cmluZyBoeXBlcmxpbmtBZGRyZXNzVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua0FkZHJlc3NUeXBlMS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua0FkZHJlc3NUeXBlMSgpLCBoeXBlcmxpbmtBZGRyZXNzVHlwZTEsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTIoU3RyaW5nIGh5cGVybGlua0FkZHJlc3NUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUyX01heExlbmd0aChoeXBlcmxpbmtBZGRyZXNzVHlwZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTJfTWF4TGVuZ3RoKFN0cmluZyBoeXBlcmxpbmtBZGRyZXNzVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua0FkZHJlc3NUeXBlMi5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua0FkZHJlc3NUeXBlMigpLCBoeXBlcmxpbmtBZGRyZXNzVHlwZTIsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZShTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlX01heExlbmd0aChoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua1N1YkFkZHJlc3NUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUoKSwgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEoU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxX01heExlbmd0aChoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEoKSwgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKFN0cmluZyBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMl9NYXhMZW5ndGgoaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMl9NYXhMZW5ndGgoU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKCksIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMiwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1R5cGUoU3RyaW5nIGh5cGVybGlua1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1R5cGVfTWF4TGVuZ3RoKGh5cGVybGlua1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gaHlwZXJsaW5rVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua1R5cGUoKSwgaHlwZXJsaW5rVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1R5cGUxKFN0cmluZyBoeXBlcmxpbmtUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rVHlwZTFfTWF4TGVuZ3RoKGh5cGVybGlua1R5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkh5cGVybGluayBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1R5cGUxX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua1R5cGUxLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rVHlwZTEoKSwgaHlwZXJsaW5rVHlwZTEsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMihTdHJpbmcgaHlwZXJsaW5rVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1R5cGUyX01heExlbmd0aChoeXBlcmxpbmtUeXBlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5IeXBlcmxpbmsgVHlwZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMl9NYXhMZW5ndGgoU3RyaW5nIGh5cGVybGlua1R5cGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBoeXBlcmxpbmtUeXBlMi5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua1R5cGUyKCksIGh5cGVybGlua1R5cGUyLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSW5pdGlhbHNUeXBlKFN0cmluZyBpbml0aWFsc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUluaXRpYWxzVHlwZV9NYXhMZW5ndGgoaW5pdGlhbHNUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkluaXRpYWxzIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVJbml0aWFsc1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBpbml0aWFsc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGluaXRpYWxzVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRpYWxzVHlwZSgpLCBpbml0aWFsc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMYWdGb3JtYXRUeXBlKEJpZ0ludGVnZXIgbGFnRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTGFnRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihsYWdGb3JtYXRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVMYWdGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIExBR19GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkxhZyBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxhZ0Zvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBsYWdGb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gTEFHX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGxhZ0Zvcm1hdFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldExhZ0Zvcm1hdFR5cGUoKSwgbGFnRm9ybWF0VHlwZSwgTEFHX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUoQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVfRW51bWVyYXRpb24obGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSgpLCBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSwgTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEoQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbihsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxKCksIGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSwgTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWFuYWdlclR5cGUoU3RyaW5nIG1hbmFnZXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVNYW5hZ2VyVHlwZV9NYXhMZW5ndGgobWFuYWdlclR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+TWFuYWdlciBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWFuYWdlclR5cGVfTWF4TGVuZ3RoKFN0cmluZyBtYW5hZ2VyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbWFuYWdlclR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRNYW5hZ2VyVHlwZSgpLCBtYW5hZ2VyVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1hdGVyaWFsTGFiZWxUeXBlKFN0cmluZyBtYXRlcmlhbExhYmVsVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTWF0ZXJpYWxMYWJlbFR5cGVfTWF4TGVuZ3RoKG1hdGVyaWFsTGFiZWxUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk1hdGVyaWFsIExhYmVsIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNYXRlcmlhbExhYmVsVHlwZV9NYXhMZW5ndGgoU3RyaW5nIG1hdGVyaWFsTGFiZWxUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBtYXRlcmlhbExhYmVsVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE1hdGVyaWFsTGFiZWxUeXBlKCksIG1hdGVyaWFsTGFiZWxUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGUoU3RyaW5nIG5hbWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVOYW1lVHlwZV9NYXhMZW5ndGgobmFtZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+TmFtZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGVfTWF4TGVuZ3RoKFN0cmluZyBuYW1lVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbmFtZVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lVHlwZSgpLCBuYW1lVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5hbWVUeXBlMShTdHJpbmcgbmFtZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVOYW1lVHlwZTFfTWF4TGVuZ3RoKG5hbWVUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5OYW1lIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGUxX01heExlbmd0aChTdHJpbmcgbmFtZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBuYW1lVHlwZTEubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lVHlwZTEoKSwgbmFtZVR5cGUxLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGUyKFN0cmluZyBuYW1lVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU5hbWVUeXBlMl9NYXhMZW5ndGgobmFtZVR5cGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk5hbWUgVHlwZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOYW1lVHlwZTJfTWF4TGVuZ3RoKFN0cmluZyBuYW1lVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IG5hbWVUeXBlMi5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVUeXBlMigpLCBuYW1lVHlwZTIsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOYW1lVHlwZTMoU3RyaW5nIG5hbWVUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTmFtZVR5cGUzX01heExlbmd0aChuYW1lVHlwZTMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+TmFtZSBUeXBlMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5hbWVUeXBlM19NYXhMZW5ndGgoU3RyaW5nIG5hbWVUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbmFtZVR5cGUzLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDI1NTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZVR5cGUzKCksIG5hbWVUeXBlMywgbGVuZ3RoLCAyNTUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5ld1Rhc2tTdGFydERhdGVUeXBlKEJpZ0ludGVnZXIgbmV3VGFza1N0YXJ0RGF0ZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU5ld1Rhc2tTdGFydERhdGVUeXBlX0VudW1lcmF0aW9uKG5ld1Rhc2tTdGFydERhdGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVOZXdUYXNrU3RhcnREYXRlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBORVdfVEFTS19TVEFSVF9EQVRFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5OZXcgVGFzayBTdGFydCBEYXRlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOZXdUYXNrU3RhcnREYXRlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIG5ld1Rhc2tTdGFydERhdGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKG5ld1Rhc2tTdGFydERhdGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXROZXdUYXNrU3RhcnREYXRlVHlwZSgpLCBuZXdUYXNrU3RhcnREYXRlVHlwZSwgTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTlRBY2NvdW50VHlwZShTdHJpbmcgbnRBY2NvdW50VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTlRBY2NvdW50VHlwZV9NYXhMZW5ndGgobnRBY2NvdW50VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5OVCBBY2NvdW50IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOVEFjY291bnRUeXBlX01heExlbmd0aChTdHJpbmcgbnRBY2NvdW50VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbnRBY2NvdW50VHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE5UQWNjb3VudFR5cGUoKSwgbnRBY2NvdW50VHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU91dGxpbmVOdW1iZXJUeXBlKFN0cmluZyBvdXRsaW5lTnVtYmVyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlT3V0bGluZU51bWJlclR5cGVfTWF4TGVuZ3RoKG91dGxpbmVOdW1iZXJUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk91dGxpbmUgTnVtYmVyIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdXRsaW5lTnVtYmVyVHlwZV9NYXhMZW5ndGgoU3RyaW5nIG91dGxpbmVOdW1iZXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBvdXRsaW5lTnVtYmVyVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGxpbmVOdW1iZXJUeXBlKCksIG91dGxpbmVOdW1iZXJUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZShCaWdJbnRlZ2VyIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVfRW51bWVyYXRpb24ob3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBPVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBvdmVydGltZVJhdGVGb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhvdmVydGltZVJhdGVGb3JtYXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdmVydGltZVJhdGVGb3JtYXRUeXBlKCksIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUsIE9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMShCaWdJbnRlZ2VyIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbihvdmVydGltZVJhdGVGb3JtYXRUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBPVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhvdmVydGltZVJhdGVGb3JtYXRUeXBlMSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKSwgb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEsIE9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGhvbmV0aWNBbGlhc1R5cGUoU3RyaW5nIHBob25ldGljQWxpYXNUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVQaG9uZXRpY0FsaWFzVHlwZV9NYXhMZW5ndGgocGhvbmV0aWNBbGlhc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+UGhvbmV0aWMgQWxpYXMgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBob25ldGljQWxpYXNUeXBlX01heExlbmd0aChTdHJpbmcgcGhvbmV0aWNBbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IHBob25ldGljQWxpYXNUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUwOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaG9uZXRpY0FsaWFzVHlwZSgpLCBwaG9uZXRpY0FsaWFzVHlwZSwgbGVuZ3RoLCA1MCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGhvbmV0aWNzVHlwZShTdHJpbmcgcGhvbmV0aWNzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlUGhvbmV0aWNzVHlwZV9NYXhMZW5ndGgocGhvbmV0aWNzVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5QaG9uZXRpY3MgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBob25ldGljc1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBwaG9uZXRpY3NUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBwaG9uZXRpY3NUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGhvbmV0aWNzVHlwZSgpLCBwaG9uZXRpY3NUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUHJlZml4VHlwZShTdHJpbmcgcHJlZml4VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlUHJlZml4VHlwZV9NYXhMZW5ndGgocHJlZml4VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5QcmVmaXggVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVByZWZpeFR5cGVfTWF4TGVuZ3RoKFN0cmluZyBwcmVmaXhUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBwcmVmaXhUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUwOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmVmaXhUeXBlKCksIHByZWZpeFR5cGUsIGxlbmd0aCwgNTAsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJhdGVUYWJsZVR5cGUoQmlnSW50ZWdlciByYXRlVGFibGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVSYXRlVGFibGVUeXBlX0VudW1lcmF0aW9uKHJhdGVUYWJsZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVJhdGVUYWJsZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gUkFURV9UQUJMRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+UmF0ZSBUYWJsZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmF0ZVRhYmxlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHJhdGVUYWJsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBSQVRFX1RBQkxFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMocmF0ZVRhYmxlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmF0ZVRhYmxlVHlwZSgpLCByYXRlVGFibGVUeXBlLCBSQVRFX1RBQkxFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSb2xsdXBUeXBlVHlwZShCaWdJbnRlZ2VyIHJvbGx1cFR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVSb2xsdXBUeXBlVHlwZV9FbnVtZXJhdGlvbihyb2xsdXBUeXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlUm9sbHVwVHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gUk9MTFVQX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlJvbGx1cCBUeXBlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSb2xsdXBUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHJvbGx1cFR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gUk9MTFVQX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhyb2xsdXBUeXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sbHVwVHlwZVR5cGUoKSwgcm9sbHVwVHlwZVR5cGUsIFJPTExVUF9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlKEJpZ0ludGVnZXIgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihzdGFuZGFyZFJhdGVGb3JtYXRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUoKSwgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZSwgU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxKEJpZ0ludGVnZXIgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFfRW51bWVyYXRpb24oQmlnSW50ZWdlciBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSgpLCBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSwgU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdWJqZWN0VHlwZShTdHJpbmcgc3ViamVjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVN1YmplY3RUeXBlX01heExlbmd0aChzdWJqZWN0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5TdWJqZWN0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdWJqZWN0VHlwZV9NYXhMZW5ndGgoU3RyaW5nIHN1YmplY3RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBzdWJqZWN0VHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFN1YmplY3RUeXBlKCksIHN1YmplY3RUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3VicHJvamVjdE5hbWVUeXBlKFN0cmluZyBzdWJwcm9qZWN0TmFtZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVN1YnByb2plY3ROYW1lVHlwZV9NYXhMZW5ndGgoc3VicHJvamVjdE5hbWVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPlN1YnByb2plY3QgTmFtZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3VicHJvamVjdE5hbWVUeXBlX01heExlbmd0aChTdHJpbmcgc3VicHJvamVjdE5hbWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBzdWJwcm9qZWN0TmFtZVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdWJwcm9qZWN0TmFtZVR5cGUoKSwgc3VicHJvamVjdE5hbWVUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVGl0bGVUeXBlKFN0cmluZyB0aXRsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVRpdGxlVHlwZV9NYXhMZW5ndGgodGl0bGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPlRpdGxlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUaXRsZVR5cGVfTWF4TGVuZ3RoKFN0cmluZyB0aXRsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IHRpdGxlVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFRpdGxlVHlwZSgpLCB0aXRsZVR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZShCaWdJbnRlZ2VyIHR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUeXBlVHlwZV9FbnVtZXJhdGlvbih0eXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB0eXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFRZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh0eXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VHlwZVR5cGUoKSwgdHlwZVR5cGUsIFRZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlMShCaWdJbnRlZ2VyIHR5cGVUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVHlwZVR5cGUxX0VudW1lcmF0aW9uKHR5cGVUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVHlwZVR5cGUxX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFRZUEVfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5UeXBlIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGUxX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgdHlwZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVFlQRV9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh0eXBlVHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFR5cGVUeXBlMSgpLCB0eXBlVHlwZTEsIFRZUEVfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTIoQmlnSW50ZWdlciB0eXBlVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVR5cGVUeXBlMl9FbnVtZXJhdGlvbih0eXBlVHlwZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVR5cGVUeXBlMl9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBUWVBFX1RZUEUyX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VHlwZSBUeXBlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlMl9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHR5cGVUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFRZUEVfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnModHlwZVR5cGUyKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUeXBlVHlwZTIoKSwgdHlwZVR5cGUyLCBUWVBFX1RZUEUyX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGUzKEJpZ0ludGVnZXIgdHlwZVR5cGUzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUeXBlVHlwZTNfRW51bWVyYXRpb24odHlwZVR5cGUzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVUeXBlVHlwZTNfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gVFlQRV9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjU1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1NiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjU4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1OSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjY0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2NSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjY3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2OCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjcwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNzIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjczIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjc2IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlR5cGUgVHlwZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTNfRW51bWVyYXRpb24oQmlnSW50ZWdlciB0eXBlVHlwZTMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBUWVBFX1RZUEUzX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHR5cGVUeXBlMyk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VHlwZVR5cGUzKCksIHR5cGVUeXBlMywgVFlQRV9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlNChCaWdJbnRlZ2VyIHR5cGVUeXBlNCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVHlwZVR5cGU0X0VudW1lcmF0aW9uKHR5cGVUeXBlNCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVHlwZVR5cGU0X0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFRZUEVfVFlQRTRfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5UeXBlIFR5cGU0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGU0X0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgdHlwZVR5cGU0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVFlQRV9UWVBFNF9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh0eXBlVHlwZTQpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFR5cGVUeXBlNCgpLCB0eXBlVHlwZTQsIFRZUEVfVFlQRTRfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTUoQmlnSW50ZWdlciB0eXBlVHlwZTUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVR5cGVUeXBlNV9FbnVtZXJhdGlvbih0eXBlVHlwZTUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVR5cGVUeXBlNV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBUWVBFX1RZUEU1X19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VHlwZSBUeXBlNTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlNV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHR5cGVUeXBlNSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFRZUEVfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnModHlwZVR5cGU1KTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUeXBlVHlwZTUoKSwgdHlwZVR5cGU1LCBUWVBFX1RZUEU1X19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVUlEVHlwZShTdHJpbmcgdWlkVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVUlEVHlwZV9NYXhMZW5ndGgodWlkVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5VSUQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVVJRFR5cGVfTWF4TGVuZ3RoKFN0cmluZyB1aWRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSB1aWRUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDE2OwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRVSURUeXBlKCksIHVpZFR5cGUsIGxlbmd0aCwgMTYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVVuaXRUeXBlKEJpZ0ludGVnZXIgdW5pdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVVuaXRUeXBlX0VudW1lcmF0aW9uKHVuaXRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVVbml0VHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBVTklUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Vbml0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVVbml0VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHVuaXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVU5JVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHVuaXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRVbml0VHlwZSgpLCB1bml0VHlwZSwgVU5JVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWVsaXN0U29ydE9yZGVyVHlwZShCaWdJbnRlZ2VyIHZhbHVlbGlzdFNvcnRPcmRlclR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVZhbHVlbGlzdFNvcnRPcmRlclR5cGVfRW51bWVyYXRpb24odmFsdWVsaXN0U29ydE9yZGVyVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVmFsdWVsaXN0U29ydE9yZGVyVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBWQUxVRUxJU1RfU09SVF9PUkRFUl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXIgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlbGlzdFNvcnRPcmRlclR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB2YWx1ZWxpc3RTb3J0T3JkZXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVkFMVUVMSVNUX1NPUlRfT1JERVJfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh2YWx1ZWxpc3RTb3J0T3JkZXJUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlKCksIHZhbHVlbGlzdFNvcnRPcmRlclR5cGUsIFZBTFVFTElTVF9TT1JUX09SREVSX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWVrU3RhcnREYXlUeXBlKEJpZ0ludGVnZXIgd2Vla1N0YXJ0RGF5VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlV2Vla1N0YXJ0RGF5VHlwZV9FbnVtZXJhdGlvbih3ZWVrU3RhcnREYXlUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVXZWVrU3RhcnREYXlUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFdFRUtfU1RBUlRfREFZX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5XZWVrIFN0YXJ0IERheSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2Vla1N0YXJ0RGF5VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHdlZWtTdGFydERheVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBXRUVLX1NUQVJUX0RBWV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHdlZWtTdGFydERheVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlZWtTdGFydERheVR5cGUoKSwgd2Vla1N0YXJ0RGF5VHlwZSwgV0VFS19TVEFSVF9EQVlfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdvcmtDb250b3VyVHlwZShCaWdJbnRlZ2VyIHdvcmtDb250b3VyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlV29ya0NvbnRvdXJUeXBlX0VudW1lcmF0aW9uKHdvcmtDb250b3VyVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlV29ya0NvbnRvdXJUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFdPUktfQ09OVE9VUl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+V29yayBDb250b3VyIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXb3JrQ29udG91clR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB3b3JrQ29udG91clR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBXT1JLX0NPTlRPVVJfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh3b3JrQ29udG91clR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtDb250b3VyVHlwZSgpLCB3b3JrQ29udG91clR5cGUsIFdPUktfQ09OVE9VUl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya0Zvcm1hdFR5cGUoQmlnSW50ZWdlciB3b3JrRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlV29ya0Zvcm1hdFR5cGVfRW51bWVyYXRpb24od29ya0Zvcm1hdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVdvcmtGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFdPUktfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Xb3JrIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya0Zvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB3b3JrRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFdPUktfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMod29ya0Zvcm1hdFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtGb3JtYXRUeXBlKCksIHdvcmtGb3JtYXRUeXBlLCBXT1JLX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya0dyb3VwVHlwZShCaWdJbnRlZ2VyIHdvcmtHcm91cFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVdvcmtHcm91cFR5cGVfRW51bWVyYXRpb24od29ya0dyb3VwVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlV29ya0dyb3VwVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBXT1JLX0dST1VQX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Xb3JrIEdyb3VwIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXb3JrR3JvdXBUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgd29ya0dyb3VwVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFdPUktfR1JPVVBfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh3b3JrR3JvdXBUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrR3JvdXBUeXBlKCksIHdvcmtHcm91cFR5cGUsIFdPUktfR1JPVVBfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLX0gLy9Nc3Byb2plY3RWYWxpZGF0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFhNTEhlbHBlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFhNTEhlbHBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjVjZDc3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RYTUxIZWxwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsOwotCi1pbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuaW50ZXJuYWwuWE1MQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLnV0aWwuWE1MVHlwZVV0aWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotCi0vKioKLSAqIENyZWF0ZSBhIHNsaWdodGx5IGN1c3RvbWl6ZWQgWE1MSGVscGVySW1wbCBjbGFzcwotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1zcHJvamVjdFhNTEhlbHBlckltcGwgZXh0ZW5kcyBYTUxIZWxwZXJJbXBsIGltcGxlbWVudHMgWE1MSGVscGVyIHsKLQotCSBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERhdGVGb3JtYXQgW10gRURBVEVfRk9STUFUUyA9Ci0JICB7Ci0JCW5ldyBTYWZlU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzIiksCi0JICAgIG5ldyBTYWZlU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWiIpLAotCSAgICBuZXcgU2FmZVNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGRaIikKLQkgIH07Ci0JIAotCSAvKioKLQkgICogQ29uc3RydWN0b3IKLQkgICogQHBhcmFtIHJlc291cmNlCi0JICAqLwotCXB1YmxpYyBNc3Byb2plY3RYTUxIZWxwZXJJbXBsKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN1cGVyKHJlc291cmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBib29sZWFuIHZhbHVlIHRvIGVpdGhlciAiMCIgb3IgIjEiCi0JICogQ29udmVydCBEYXRlVGltZSB2YWx1ZSB0byBiZSBjb21wYXRpYmxlIHdpdGggTVMgcHJvamVjdAotCSAqLwotCSBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRmFjdG9yeSBmYWN0b3J5LCBFRGF0YVR5cGUgZGF0YVR5cGUsIE9iamVjdCB2YWx1ZSkKLQkgIHsKLQkJIAotLy8JCSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuaW1wbC5YTUxUeXBlRmFjdG9yeUltcGwgYUZhY3RvcnkgPSBuZXcgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLmltcGwuWE1MVHlwZUZhY3RvcnlJbXBsKCk7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkJCQgZGF0YVR5cGUgbmFtZSA9ICIgKyBkYXRhVHlwZS5nZXROYW1lKCkpOwotCQkgCi0JCSBpZiAoIkJvb2xlYW4iLmVxdWFsc0lnbm9yZUNhc2UoZGF0YVR5cGUuZ2V0TmFtZSgpKSkgewotLy8JCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgbmVlZCB0byBvdmVycmlkZSB0aGUgQm9vbGVhbjogIiArIHZhbHVlKTsKLQkJCSBpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCSBTdHJpbmcgcnMgPSAiMCI7Ci0JCQkJIHRyeSB7Ci0JCQkJCSBCb29sZWFuIGJPYmplY3QgPSAoQm9vbGVhbil2YWx1ZTsKLQkJCQkJIGlmIChiT2JqZWN0LmJvb2xlYW5WYWx1ZSgpKQotCQkJCQkJIHJzID0gIjEiOwotCQkJCSB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLS8vCQkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBjb252ZXJ0ZWQgc3RyaW5nID0gIiArIHJzKTsKLQkJCQkgcmV0dXJuIHJzOwotCQkJIH0KLQkJCSByZXR1cm4gbnVsbDsgCi0JCSB9IGVsc2UgaWYgKCJEYXRlVGltZSIuZXF1YWxzSWdub3JlQ2FzZShkYXRhVHlwZS5nZXROYW1lKCkpKSB7Ci0vLwkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBuZWVkIHRvIG92ZXJyaWRlIHRoZSBEYXRlVGltZTogIiArIHZhbHVlLmdldENsYXNzKCkgKyAiLCIgKyB2YWx1ZSk7Ci0JCQkgaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkgICBTdHJpbmcgcnMgPSB2YWx1ZS50b1N0cmluZygpOwotCQkJCSAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpCi0JCQkJICAgIHsKLQkJCQkgICAgICBycyA9IEVEQVRFX0ZPUk1BVFNbMF0uZm9ybWF0KChEYXRlKXZhbHVlKTsKLQkJCQkgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFhNTENhbGVuZGFyKXsKLQkJCQkJICBycyA9ICgoWE1MQ2FsZW5kYXIpdmFsdWUpLnRvU3RyaW5nKCk7Ci0JCQkJCSAgaW50IGlkeCA9IHJzLmluZGV4T2YoJy4nKTsKLQkJCQkJICBpZiAoaWR4ID4gMCkKLQkJCQkJCSAgcnMgPSBycy5zdWJzdHJpbmcoMCwgaWR4KTsKLQkJCQkJfQotLy8JCQkJICAgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY29udmVydGVkIHN0cmluZyA9ICIgKyBycyk7Ci0JCQkJICAgcmV0dXJuIHJzOwotCQkJIH0KLQkJCSByZXR1cm4gbnVsbDsgCi0JCSB9Ci0JCSAKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgRUZhY3RvcnksIEVEYXRhVHlwZSwgdmFsdWUgPSAiICsgZmFjdG9yeSArICIsIiArIGRhdGFUeXBlICsgIiwiICsgdmFsdWUpOwotCQkgU3RyaW5nIHJzID0gc3VwZXIuY29udmVydFRvU3RyaW5nKCBmYWN0b3J5LCAgZGF0YVR5cGUsICB2YWx1ZSk7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGNvbnZlcnRlZCBzdHJpbmcgKG91dCkgPSAiICsgcnMpOwotCQkgcmV0dXJuIHJzOwotCSAgfQotCSAKLQkgLyoqCi0JICAqIENvbnZlcnQgdGhlIDEgb3IgMCBib29sZWFuIHZhbHVlIHRvIGFuIEJvb2xlYW4gT2JqZWN0Ci0JICAqIGNvbnZlcnQgdGhlIGRhdGV0aW1lIHN0cmluZyBpbnRvIFhNTENhbGVuZGFyIG9iamVjdC4KLQkgICovCi0JIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRmFjdG9yeSBlRmFjdG9yeSwgRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIHZhbHVlKQotCSAgewotCQkgaWYgKCJCb29sZWFuIi5lcXVhbHNJZ25vcmVDYXNlKGVEYXRhVHlwZS5nZXROYW1lKCkpKSB7Ci0vLwkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBuZWVkIHRvIGNvbnZlcnQgZnJvbSBCb29sZWFuOiAiICsgdmFsdWUpOwotCQkJIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgfHwgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiMSIpKQotCQkJCQkgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJCQkgZWxzZQotCQkJCQkgcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCQkgfQotCQkJIHJldHVybiBudWxsOyAKLQkJIH0gZWxzZSBpZiAoIkRhdGVUaW1lIi5lcXVhbHNJZ25vcmVDYXNlKGVEYXRhVHlwZS5nZXROYW1lKCkpKSB7Ci0vLwkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBuZWVkIHRvIGNvbnZlcnQgZnJvbSBEYXRlVGltZTogIiArIHZhbHVlKTsKLQkJCSBpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCSAgIHJldHVybiBuZXcgWE1MQ2FsZW5kYXIoY29sbGFwc2VXaGl0ZVNwYWNlKHZhbHVlKSwgWE1MQ2FsZW5kYXIuREFURVRJTUUpOwotCQkJIH0KLQkJCSByZXR1cm4gbnVsbDsgCi0JCSB9Ci0JCSAKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgRUZhY3RvcnksIEVEYXRhVHlwZSwgdmFsdWUgPSAiICsgZUZhY3RvcnkgKyAiLCIgKyBlRGF0YVR5cGUgKyAiLCIgKyB2YWx1ZSk7Ci0JCSBPYmplY3Qgcm8gPSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKCBlRmFjdG9yeSwgIGVEYXRhVHlwZSwgIHZhbHVlKTsKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY29udmVydGVkIG9iamVjdCAoaW4pID0gIiArIHJvKTsKLQkJIHJldHVybiBybzsKLQkgIH0KLQkgCi0JIHByb3RlY3RlZCBTdHJpbmcgY29sbGFwc2VXaGl0ZVNwYWNlKFN0cmluZyB2YWx1ZSkKLQkgewotCQkgcmV0dXJuIFhNTFR5cGVVdGlsLm5vcm1hbGl6ZSh2YWx1ZSwgdHJ1ZSk7Ci0JIH0KLQkgIAotCSBwcml2YXRlIHN0YXRpYyBjbGFzcyBTYWZlU2ltcGxlRGF0ZUZvcm1hdCBleHRlbmRzIFNpbXBsZURhdGVGb3JtYXQKLQkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgU2FmZVNpbXBsZURhdGVGb3JtYXQoU3RyaW5nIHBhdHRlcm4pCi0JICAgIHsKLQkgICAgICBzdXBlcihwYXR0ZXJuKTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRGF0ZSBwYXJzZShTdHJpbmcgc291cmNlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLQkgICAgewotCSAgICAgIHJldHVybiBzdXBlci5wYXJzZShzb3VyY2UpOwotCSAgICB9Ci0KLQkgICAgcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXQoRGF0ZSBkYXRlLCBTdHJpbmdCdWZmZXIgdG9BcHBlbmRUbywgRmllbGRQb3NpdGlvbiBwb3MpCi0JICAgIHsKLQkgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gc3VwZXIuZm9ybWF0KGRhdGUsIHRvQXBwZW5kVG8sIHBvcyk7Ci0vLwkgICAgICByZXN1bHQuaW5zZXJ0KHJlc3VsdC5sZW5ndGgoKSAtIDIsICI6Iik7Ci0JICAgICAgcmV0dXJuIHJlc3VsdDsKLQkgICAgfQotCSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZjAzZDg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgTWljcm9zb2Z0IFByb2plY3QgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzgxM2QyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmNWU2MTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlbl9saWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZV9lbi5odG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjIyY2NlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLWZlYXR1cmVOYW1lPUVQRiBQbGF0Zm9ybSBGZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLWRlc2NyaXB0aW9uPUVQRiBQbGF0Zm9ybSBGZWF0dXJlLgotdXBkYXRlU2l0ZU5hbWU9RVBGIEZlYXR1cmUgVXBkYXRlcwotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLWxpY2Vuc2VVUkw9bGljZW5zZV9lbi5odG1sCi1saWNlbnNlVGV4dD1Vc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgdGVybXMgYW5kIGNvbmRpdGlvbnMgd2hpY2ggZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIFByb2R1Y3Qgd2hpY2ggaW5jbHVkZWQgdGhpcyBmZWF0dXJlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliNTZjYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0iCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtIgotICAgICAgb3M9ImxpbnV4LHdpbjMyIgotICAgICAgd3M9Imd0ayx3aW4zMiIKLSAgICAgIGFyY2g9Ing4NiIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2VUZXh0Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMiIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5pYm0uaWN1IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iY29tLmpjcmFmdC5qc2NoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5hbnQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5sdWNlbmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0ud2luMzIueDg2IgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgd3M9IndpbjMyIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmpvYnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbXBhdGliaWxpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMud2luMzIiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICB3cz0id2luMzIiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkuYXV0aCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZHJhdzJkIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uai5zZG8iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuY2hhbmdlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMmVjb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ2VmIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuYXBwc2VydmVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZXh0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmZvcm1zIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaWRlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaW50cm8iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud2luMzIiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICB3cz0id2luMzIiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC53aW4zMi53aW4zMi54ODYiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICB3cz0id2luMzIiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyIgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgd3M9IndpbjMyIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudG9tY2F0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc2VhcmNoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0ubGludXgueDg2IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lmd0ay5saW51eC54ODYiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnNvbGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuYWN0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLmFjdGlvbi5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3BlcnRpZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLmlkZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVuZGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLnJlbmRlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5yZW5kZXIuYXd0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNsaXBib2FyZC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnByb3BlcnRpZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLnByb3ZpZGVycyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVtbDIuY29tbW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudW1sMi5jb21tb24uZWRpdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVtbDIudW1sIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudW1sMi51bWwuZWRpdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUueGVyY2VzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmdlb3NoYXBlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LnJlZ2lzdHJ5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5wcmludGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5wcmludGluZy53aW4zMiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2xpY2Vuc2VfZW4uaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvbGljZW5zZV9lbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvbGljZW5zZV9lbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmVlNzQwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzYzg0MDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmZWF0dXJlUGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Yzk5MDg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2Fib3V0LmluaSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzdkNDk2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotYXBwTmFtZT0lZmVhdHVyZU5hbWUKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jICgkbmwkLyBwcmVmaXggdG8gcGVybWl0IGxvY2FsZS1zcGVjaWZpYyB0cmFuc2xhdGlvbnMgb2YgZW50aXJlIGZpbGUpCi13ZWxjb21lUGFnZT0kbmwkL3dlbGNvbWUueG1sCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2Fib3V0LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YzgzNDIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjIuMSB3aXRoIEVNRiBhbmQgR0VGIAotCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCi1cblwKLVZlcnNpb246IDMuMi4xXG5cCi1CdWlsZCBpZDogTTIwMDYwOTIxLTA5NDVcblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDYuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZVxuXAotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiMDBkNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHdlbGNvbWUueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9lY2xpcHNlMzIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2ZhNjU0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotZmVhdHVyZVBsdWdpbk5hbWU9RVBGIFBsYXRmb3JtIEZlYXR1cmUKLWZlYXR1cmVQbHVnaW5OYW1lTkw9RVBGIFBsYXRmb3JtIEZlYXR1cmUgKE5MMSkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL3dlbGNvbWUueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vd2VsY29tZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwMDkyNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vd2VsY29tZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08d2VsY29tZVBhZ2UgCi0JdGl0bGU9IkVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrIChFTUYpIj4KLQotPGludHJvPkVNRiBpcyBhIEphdmEvWE1MIGZyYW1ld29yayBmb3IgZ2VuZXJhdGluZyB0b29scyBhbmQgb3RoZXIgYXBwbGljYXRpb25zCi1iYXNlZCBvbiBzaW1wbGUgY2xhc3MgbW9kZWxzLgotPC9pbnRybz4KLQotPGl0ZW0+PGI+V2hhdCBpcyBFTUY/PC9iPgotCVJlYWQgdGhlIDx0b3BpYyBocmVmPSIvb3JnLmVjbGlwc2UuZW1mLmRvYy9yZWZlcmVuY2VzL292ZXJ2aWV3L0VNRi5odG1sIj5vdmVydmlldzwvdG9waWM+IGFydGljbGUgdG8gbGVhcm4gYWJvdXQgRU1GLgotCVRoZW4sIGZvbGxvdyB0aGUgPHRvcGljIGhyZWY9Ii9vcmcuZWNsaXBzZS5lbWYuZG9jL3R1dG9yaWFscy9jbGlibW9kL2NsaWJtb2QuaHRtbCI+dHV0b3JpYWw8L3RvcGljPiB0byBzZWUgaG93IGVhc3kgaXQgaXMgdG8gZ2VuZXJhdGUgYSBtb2RlbC4KLTwvaXRlbT4KLQotPGl0ZW0+PGI+TGVhcm4gTW9yZTwvYj4KLQlUaGlzIGlzIHRoZSBvZmZpY2lhbCBzaXRlIG9mIEVNRjogPHRvcGljIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZjwvdG9waWM+Ci08L2l0ZW0+Ci0KLTwvd2VsY29tZVBhZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NjY5MjYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIzZTUxNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBKdW4gMjMgMTE6MDY6MDAgUERUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1N2RhYTY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5QdWJsaXNoZXJQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZywKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OGIxOWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLQkJCSAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9pY29ucy9XZWJQdWJsaXNoLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9pY29ucy9XZWJQdWJsaXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzZkY2YwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvaWNvbnMvV2ViUHVibGlzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4ZGJlNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBQdWJsaXNoZXIgUGx1Zy1pbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLXB1Ymxpc2hlckxhYmVsPVB1Ymxpc2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2ZGEwN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnB1Ymxpc2hlcnMiPgotICAgICAgPHB1Ymxpc2hlcgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvV2ViUHVibGlzaC5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlciIKLSAgICAgICAgICAgIG1hbmFnZXJDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5zZXJ2aWNlcy5FUEZQdWJsaXNoTWFuYWdlciIKLSAgICAgICAgICAgIGxhYmVsPSIlcHVibGlzaGVyTGFiZWwiCi0gICAgICAgICAgICB3aXphcmRDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcud2l6YXJkcy5QdWJsaXNoQ29uZmlndXJhdGlvbldpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGVyL1B1Ymxpc2hlclBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGVyL1B1Ymxpc2hlclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NWZhNDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hlci9QdWJsaXNoZXJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgRVBGIHB1Ymxpc2hlciBwbHVnLWluIGFjdGl2YXRvci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hlclBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElELgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IFB1Ymxpc2hlclBsdWdpbi5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUHVibGlzaGVyUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hlclBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHVibGlzaGVyUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoZXIvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGVyL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmVkYmY1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoZXIvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIFB1Ymxpc2hlciBwbHVnLWluJ3MgbGlmZSBjeWNsZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoZXIvc2VydmljZXMvRVBGUHVibGlzaE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hlci9zZXJ2aWNlcy9FUEZQdWJsaXNoTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNTdhMDM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hlci9zZXJ2aWNlcy9FUEZQdWJsaXNoTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5zZXJ2aWNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgRVBGIHB1Ymxpc2hpbmcgbWFuYWdlci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVQRlB1Ymxpc2hNYW5hZ2VyIGV4dGVuZHMgUHVibGlzaE1hbmFnZXIgewotCi0JcHVibGljIHZvaWQgaW5pdChTdHJpbmcgcHViRGlyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVB1Ymxpc2hPcHRpb25zIG9wdGlvbnMpIHsKLQkJc3VwZXIuaW5pdChwdWJEaXIsIGNvbmZpZywgb3B0aW9ucyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoZXIvc2VydmljZXMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGVyL3NlcnZpY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjUwN2JmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoZXIvc2VydmljZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBwdWJsaXNoaW5nIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzY2U2ZTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmNjMWM2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmc7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwKLSBvcmcuZWNsaXBzZS5oZWxwLmJhc2UKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWksCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMsCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcywKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy53aXphcmRzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0YjgyNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9pY29ucy9SZXBvcnRpbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9pY29ucy9SZXBvcnRpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMzhjYzhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvUmVwb3J0aW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvV2ViUHVibGlzaC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1dlYlB1Ymxpc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NmRjZjBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvV2ViUHVibGlzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL1B1Ymxpc2hDb25maWd1cmF0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjQ5ODMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmOGIzMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgUHVibGlzaGluZyBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgRGVmYXVsdCBmZWVkYmFjayBVUkwKLWZlZWRiYWNrVVJMPWh0dHA6Ly93d3cucHVibGlzaGVkX3dlYnNpdGUuY29tL2ZlZWRiYWNrCi0KLSMgUHVibGlzaCBDb25maWd1cmF0aW9uIEFjdGlvbgotcHVibGlzaENvbmZpZ0FjdGlvbj0mUHVibGlzaC4uLgotcHVibGlzaENvbmZpZ0FjdGlvblRvb2x0aXA9UHVibGlzaCBhIHdlYiBzaXRlIGZvciBhIGNvbmZpZ3VyYXRpb24KLQotIyBQcmVmZXJlbmNlIFBhZ2UKLXB1Ymxpc2hpbmdPcHRpb25zPVB1Ymxpc2hpbmcgT3B0aW9ucwotCi0jIFB1Ymxpc2hpbmcgQWN0aW9ucwotY29uZmlnQWN0aW9uU2V0PUNvbmZpZ3VyYXRpb24KLWNvbmZpZ01lbnU9JkNvbmZpZ3VyYXRpb24KLQotIyBQcmludCBDb25maWd1cmF0aW9uIEFjdGlvbgotcHJpbnRDb25maWdBY3Rpb249UHJpbnQKLQotIyB0aGUgdGl0bGUgZm9yIHRoZSBwdWJsaXNoZWQgc2l0ZQotI2Rvbid0IGRlZmluZSBoZXJlLCBsZXQgdXNlciBzcGVjaWZ5IGl0LgotI3RpdGxlPU9wZW5VUC9CYXNpYwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIERlZmF1bHQgUHVibGlzaCBQYXRoCi1wdWJsaXNoUGF0aD08dXNlci5ob21lPi88YXBwLm5hbWU+L1B1Ymxpc2gKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMzNhMTRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0icHVibGlzaENvbmZpZ1dpemFyZCIKLSAgICAgICAgIG5hbWU9IlB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYWl0b24gV2l6YXJkIEV4dGVuc2lvbiIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL1B1Ymxpc2hDb25maWdXaXphcmQuZXhzZCIgLz4KLQotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icHVibGlzaGVycyIgbmFtZT0iUHVibGlzaGVycyIgc2NoZW1hPSJzY2hlbWEvcHVibGlzaGVycy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5Db25maWdBY3Rpb25TZXQiCi0gICAgICAgICAgICBsYWJlbD0iJWNvbmZpZ0FjdGlvblNldCIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiPgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5tZW51LmNvbmZpZ3VyYXRpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJWNvbmZpZ01lbnUiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiLz4gIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLmFjdGlvbnMuUHVibGlzaENvbmZpZ0FjdGlvbiIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY29uZmlndXJhdGlvbl9wdWJsaXNoX2NvbnRleHQiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9XZWJQdWJsaXNoLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5hY3Rpb25zLlB1Ymxpc2giCi0gICAgICAgICAgICAgICBsYWJlbD0iJXB1Ymxpc2hDb25maWdBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubWVudS5jb25maWd1cmF0aW9uL2FkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIi8+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5yb290cHJlZnBhZ2UiICAgICAgICAgICAgCi0gICAgICAgICAgICBuYW1lPSIlcHVibGlzaGluZ09wdGlvbnMiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8IS0tICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHVibGlzaGVycyI+Ci0gICAgICA8cHVibGlzaGVyCi0gICAgICAgICAgICBpY29uPSJpY29ucy9XZWJQdWJsaXNoLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyIgotICAgICAgICAgICAgbWFuYWdlckNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoTWFuYWdlciIKLSAgICAgICAgICAgIGxhYmVsPSIlcHVibGlzaGVyTGFiZWwiCi0gICAgICAgICAgICB3aXphcmRDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcud2l6YXJkcy5QdWJsaXNoQ29uZmlndXJhdGlvbldpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0gICAtLT4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NjaGVtYS9QdWJsaXNoQ29uZmlnV2l6YXJkLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NjaGVtYS9QdWJsaXNoQ29uZmlnV2l6YXJkLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlNWI4OTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zY2hlbWEvUHVibGlzaENvbmZpZ1dpemFyZC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aSIgaWQ9InB1Ymxpc2hDb25maWdXaXphcmQiIG5hbWU9IlB1Ymxpc2ggTWV0aG9kIENvbmZndXJhdGlvbiBXaXphcmQgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVuYWJsZXMgYSBwbHVnLWluIHRvIGV4dGVuZCB0aGUgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQgYnkgcmVwbGFjaW5nIGV4aXN0aW5nIHdpemFyZCBwYWdlcyBvciBhZGRpbmcgbmV3IG9uZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZEV4dGVuZGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZEV4dGVuZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkUGFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwdWJsaXNoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBleHRlbmRlci4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5JUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuZGVyJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkUGFnZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgd2l6YXJkIHBhZ2UuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiBleHRlbnNpb24gLSAmcXVvdDtyZXBsYWNlJnF1b3Q7IG9yICZxdW90O25ldyZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGJhc2Ugd2l6YXJkIHBhZ2UgdG8gYmUgcmVwbGFjZWQgb3IgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgaW5zZXJ0aW5nIGEgbmV3IHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imluc2VydCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaW5zZXJ0aW9uIHR5cGUgZm9yIGEgbmV3IHdpemFyZCBwYWdlIC0gJnF1b3Q7YmVmb3JlJnF1b3Q7IG9yICZxdW90O2FmdGVyJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwdWJsaXNoZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gcHVibGlzaGVyLiBUaGlzIGNsYXNzIG11c3QgZXh0ZW5kcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZWZydmljZXMuQWJzdHJhY3RQdWJsaXNoTWFuYWdlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRoZSBleHRlbnNpb24gcG9pbnQgY2FuIGJlIHVzZWQ6IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wdWJsaXNoQ29uZmlnV2l6YXJkJnF1b3Q7Jmd0OwotICAgICAgJmx0O3dpemFyZEV4dGVuZGVyCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLk15UHVibGlzaENvbmZpZ1dpemFyZEV4dGVuZGVyJnF1b3Q7Jmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuTXlTZWxlY3RQdWJsaXNoT3B0aW9uc1BhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7cmVwbGFjZSZxdW90OwotICAgICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuU2VsZWN0UHVibGlzaE9wdGlvbnNQYWdlJnF1b3Q7LyZndDsKLSAgICAgICAgICZsdDt3aXphcmRQYWdlCi0gICAgICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLk15TmV3UHVibGlzaFBhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7bmV3JnF1b3Q7Ci0gICAgICAgICAgICAgICB0YXJnZXQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5TZWxlY3RQdWJsaXNoT3B0aW9uc1BhZ2UmcXVvdDsgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIGluc2VydD0mcXVvdDthZnRlciZxdW90Oy8mZ3Q7ICAgICAgICAgICAgICAgCi0gICAgICAgICAmbHQ7cHVibGlzaGVyCi0gICAgICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5NeUNvbmZpZ1B1Ymxpc2hlciZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7L3dpemFyZEV4dGVuZGVyJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc2NoZW1hL3B1Ymxpc2hlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc2NoZW1hL3B1Ymxpc2hlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjVmMjNlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NjaGVtYS9wdWJsaXNoZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpIiBpZD0icHVibGlzaGVycyIgbmFtZT0icHVibGlzaGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBkZWZpbmUgdGhlIGV4dGVuc2lvbiBwb2ludCBmb3IgcHVibGlzaGVycwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwdWJsaXNoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHVibGlzaGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWNvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3aXphcmRDbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYW5hZ2VyQ2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hlckVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hlckVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGRjYTdmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHMuQWJzdHJhY3RQdWJsaXNoV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgYXR0cmlidXRlcyBmb3IgYSBwdWJsaXNoZXIgZXh0ZW5zaW9uIHBvaW50Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGVyRWxlbWVudCB7Ci0JQnVuZGxlIGJ1bmRsZTsKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQlwcml2YXRlIFN0cmluZyBpY29uOwotCXByaXZhdGUgU3RyaW5nIHdpemFyZENsYXNzOwotCXByaXZhdGUgU3RyaW5nIG1hbmFnZXJDbGFzczsJCi0JCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIFB1Ymxpc2hlckVsZW1lbnQgZXh0ZW5zaW9uIHBvaW50Ci0JICogQHBhcmFtIGJ1bmRsZSBCdW5kbGUgdGhlIGJ1bmRsZSB0aGF0IGxhb2QgdGhlIGVsZW1lbnQgZGVmaW5pdGlvbiBmaWxlCi0JICogQHBhcmFtIGlkIFN0cmluZwotCSAqIEBwYXJhbSBsYWJlbCBTdHJpbmcKLQkgKiBAcGFyYW0gaWNvbiBTdHJpbmcgaWNvbiBwYXRoCi0JICogQHBhcmFtIHdpemFyZENsYXNzIFN0cmluZyB0aGUgcHVibGlzaGluZyB3aXphcmQgY2xhc3MuIAotCSAqIFRoaXMgY2xhc3MgbXVzdCBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHMuQWJzdHJhY3RQdWJsaXNoV2l6YXJkIGNsYXNzCi0JICogQHBhcmFtIG1hbmFnZXJDbGFzcyBTdHJpbmcgdGhlIHB1Ymxpc2ggbWFtYWdlciBjbGFzcy4gCi0JICogdGhpcyBjbGFzcyBtdXN0IGV4dGVuZHMgdGhlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXIgY2xhc3MuCi0JICovCi0JcHVibGljIFB1Ymxpc2hlckVsZW1lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBpY29uLCBTdHJpbmcgd2l6YXJkQ2xhc3MsIFN0cmluZyBtYW5hZ2VyQ2xhc3MpIHsKLQkJdGhpcy5idW5kbGUgPSBidW5kbGU7IAotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJdGhpcy5pY29uID0gaWNvbjsKLQkJdGhpcy53aXphcmRDbGFzcyA9IHdpemFyZENsYXNzOwotCQl0aGlzLm1hbmFnZXJDbGFzcyA9IG1hbmFnZXJDbGFzczsJCQotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHB1Ymxpc2ggd2l6YXJkCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFB1Ymxpc2hXaXphcmQKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFB1Ymxpc2hXaXphcmQgZ2V0UHVibGlzaFdpemFyZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlDbGFzcyBjbGF6eiA9IGJ1bmRsZS5sb2FkQ2xhc3Mod2l6YXJkQ2xhc3MpOwotCQlyZXR1cm4gKEFic3RyYWN0UHVibGlzaFdpemFyZCkgY2xhenoubmV3SW5zdGFuY2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwdWJsaXNoIG1hbmFnZXIKLQkgKiAKLQkgKiBAcmV0dXJuIEFic3RyYWN0UHVibGlzaE1hbmFnZXIKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIGdldFB1Ymxpc2hNYW5hZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNsYXNzIGNsYXp6ID0gYnVuZGxlLmxvYWRDbGFzcyhtYW5hZ2VyQ2xhc3MpOwotCQlyZXR1cm4gKEFic3RyYWN0UHVibGlzaE1hbmFnZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgaWQgb2YgdGhlIHB1Ymxpc2hlcgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsgCi0JCXJldHVybiBpZDsgCi0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgbGFiZWwgb2YgdGhlIHB1Ymxpc2hlcgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBwdWJsaXNoZXIgaWNvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlpZiAoIGljb24gPT0gbnVsbCB8fCBpY29uLmxlbmd0aCgpID09IDAgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCVVSTCBpbnN0YWxsVVJMID0gYnVuZGxlLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCVVSTCBpY29uVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBpY29uKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpY29uVVJMKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YjliMmVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuYWN0aW9ucy5QdWJsaXNoQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBjcmVhdGlvbiBvZiBQdWJsaXNoZXIgaW5zdGFuY2VzIGJ5IGxvYWRpbmcgdGhlIHB1Ymxpc2hlciBleHRlbnNpb25zLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gInB1Ymxpc2hlcnMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFB1Ymxpc2hlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JLy8gQSBtYXAgb2YgcHVibGlzaGVyIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBQdWJsaXNoZXJFbGVtZW50PiBwdWJsaXNoZXJNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFB1Ymxpc2hlckVsZW1lbnQ+KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQdWJsaXNoZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChQdWJsaXNoZXJGYWN0b3J5LmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgUHVibGlzaGVyRmFjdG9yeSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFB1Ymxpc2hlckZhY3RvcnkoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCS8vIFByb2Nlc3MgdGhlICJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wdWJsaXNoZXJzIiBleHRlbnNpb24gcG9pbnQKLQkJLy8gY29udHJpYnV0b3JzLgotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFLCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGlkID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyBuYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImxhYmVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyBpY29uID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImljb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIHdpemFyZENsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3aXphcmRDbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgbWFuYWdlckNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJtYW5hZ2VyQ2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKAlpZCAhPSBudWxsICYmIGlkLnRyaW0oKS5sZW5ndGgoKSA+IDAgCi0JCQkJCQkJCSYmIG5hbWUgIT0gbnVsbCAmJiBuYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDAgCi0JCQkJCQkJCSYmIHdpemFyZENsYXNzTmFtZSAhPSBudWxsICYmIHdpemFyZENsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIG1hbmFnZXJDbGFzc05hbWUgIT0gbnVsbCAmJiBtYW5hZ2VyQ2xhc3NOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDAgKSB7Ci0JCQkJCQkJaWYgKCFwdWJsaXNoZXJNYXAuY29udGFpbnNLZXkobmFtZSkpIHsKLQkJCQkJCQkJUHVibGlzaGVyRWxlbWVudCBwcm92aWRlciA9IG5ldyBQdWJsaXNoZXJFbGVtZW50KAotCQkJCQkJCQkJCWJ1bmRsZSwgaWQsIG5hbWUsIGljb24sIHdpemFyZENsYXNzTmFtZSwgbWFuYWdlckNsYXNzTmFtZSk7Ci0JCQkJCQkJCQotCQkJCQkJCQlwdWJsaXNoZXJNYXAucHV0KGlkLCBwcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogZ2V0IHRoZSBwdWJsaXNoZXIgZWxlbWVudCB3aGljaCBkZWZpbmVzIHRoZSBwdWJsaXNoZXIgZXh0ZW5zaW9uCi0JICogCi0JICogQHBhcmFtIGlkIFN0cmluZyBpZCBvZiB0aGUgcHVibGlzaGVyCi0JICogCi0JICogQHJldHVybiBQdWJsaXNoZXJFbGVtZW50Ci0JICovCi0JcHVibGljIFB1Ymxpc2hlckVsZW1lbnQgZ2V0UHVibGlzaGVyRWxlbWVudChTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIChQdWJsaXNoZXJFbGVtZW50KXB1Ymxpc2hlck1hcC5nZXQoaWQpOwotCX0KLSAKLQkvKioKLQkgKiBnZXQgYWxsIHB1Ymxpc2hlciBlbGVtZW50cwotCSAqIAotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgUHVibGlzaGVyRWxlbWVudCBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHVibGlzaGVyRWxlbWVudHMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KHB1Ymxpc2hlck1hcC52YWx1ZXMoKSk7Ci0JfQotCQotCS8qKgotCSAqIGNyZWF0ZSB0aGUgVUkgYWN0aW9ucyBmb3IgdGhlIHB1Ymxpc2hlcnMKLQkgKiAKLQkgKiBAcmV0dXJuIEFjdGlvbltdCi0JICovCi0JcHVibGljIEFjdGlvbltdIGNyZWF0ZVB1Ymxpc2hBY3Rpb25zKCkgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGdldFB1Ymxpc2hlckVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVB1Ymxpc2hlckVsZW1lbnQgZSA9IChQdWJsaXNoZXJFbGVtZW50KWl0Lm5leHQoKTsKLQkJCQotCQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBQdWJsaXNoQWN0aW9uKGUuZ2V0SWQoKSwgZS5nZXRMYWJlbCgpLCBlLmdldEltYWdlRGVzY3JpcHRvcigpKTsKLQkJCWl0ZW1zLmFkZChhY3Rpb24pOwotCQl9IAotCi0JCWludCBzaXplID0gaXRlbXMuc2l6ZSgpOwotCQlBY3Rpb25bXSBhY3Rpb25zID0gbmV3IEFjdGlvbltzaXplXTsKLQkJaXRlbXMudG9BcnJheShhY3Rpb25zKTsKLQkJCi0JCXJldHVybiBhY3Rpb25zOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hpbmdVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGluZ1VJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE4ODQ4YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGluZ1VJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIGZvciB0aGUgcHVibGlzaGluZyBVSSBwbHVnaW4uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFB1Ymxpc2hpbmdVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFB1Ymxpc2hpbmdVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGluZ1VJUmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoaW5nVUlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzc5YWE1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoaW5nVUlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIGNsYXNzIGZvciBwdWJsaXNoaW5nIFVJIHJlc291cmNlcwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQdWJsaXNoaW5nVUlSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNsYXNzCi0JCQkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUHVibGlzaGluZ1VJUmVzb3VyY2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdXaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbnRlbnRXaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29udGVudFdpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaFdlYlNpdGVHcm91cF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpdGxlQW5kTGlua3NHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9va0FuZEZlZWxHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGl0bGVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFubmVySW1hZ2VMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWJvdXRIVE1MTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZlZWRiYWNrVVJMTGFiZWxfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnbG9zc2FyeUFuZEluZGV4R3JvdXBfdGV4dDsJCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoR2xvc3NhcnlMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaEluZGV4TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRpb25Hcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tFeHRlcm5hbExpbmtzTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRCcm9rZW5MaW5rc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFncmFtR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hBY3Rpdml0eURldGFpbERpYWdyYW1zTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hFeHRlbmRlZEFjdGl2aXR5RGlhZ3JhbXNMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGF5b3V0R3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hMaWdodFdlaWdodFRyZWVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaEV4dHJhRGVzY3JpcHRvckluZm9MYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaEVtcHR5Q2F0ZWdvcmllc0xhYmVsX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVzdGluYXRpb25XaXphcmRQYWdlX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlc3RpbmF0aW9uV2l6YXJkUGFnZV90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpckxhYmVsX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2ViQXBwR3JvdXBfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGF0aWNXZWJTaXRlUmFkaW9CdXR0b25fdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkeW5hbWljV2ViQXBwUmFkaW9CdXR0b25fdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmNsdWRlU2VhcmNoQ2hlY2tib3hfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3ZWJBcHBsaWNhdGlvbk5hbWVMYWJlbF90ZXh0OwotCQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc3RpbmF0aW9uRGlyZWN0b3J5R3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhdGhMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXNlRGVmYXVsdFBhdGhDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXNlRGVmYXVsdEZlZWRiYWNrTGFiZWxfdGV4dDsKLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5jbHVkZVNlYXJjaGVzTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsaWVudFNpZGVTZWFyY2hSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyU2lkZVNlYXJjaFJhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0ZVdBUkZpbGVMYWJlbF90ZXh0OwotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1c2VBcHBsZXRDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2l0ZUN1c3RvbWl6YXRpb25XaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2l0ZUN1c3RvbWl6YXRpb25XaXphcmRQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aGVtZUFuZFNraW5Hcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvd0Jhbm5lckNoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RTa2luTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcnlQcm9jZXNzZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRWaWV3c0luZm9fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFZpZXdDb250cmlidXRvckluZm9fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFZpZXdTYW1lVmlld0luZm9fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFZpZXdJbnZhbGlkSW5mb19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlUGFnZV9kZWZhdWx0UGF0aF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpcm1QYXRoRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdmVyd3JpdGVEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbmNlbFB1Ymxpc2hDb25maWdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJldmlld0NvbmZpZ0Vycm9yX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1JlcG9ydEVycm9yX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ1ZpZXdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5ub3RQdWJsaXNoRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFBhdGhFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkUGF0aENoYXJzRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaENvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXZpZXdDb25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3UmVwb3J0RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlRGlyRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkJyb3dzZXJFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3ZWJBcHBOYW1lRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2ViQXBwTmFtZUNoYXJzRXJyb3JfbXNnOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleSBhbmQgZm9ybWF0dGVkCi0JICogd2l0aCBhIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gb2JqZWN0LgotCSAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBrZXksIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIG5ldyBPYmplY3RbXSB7IGRhdGEgfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUxZmY0OTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uIFdpemFyZAotcHVibGlzaENvbmZpZ1dpemFyZF90aXRsZT1QdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uCi0KLSMgU2VsZWN0IE1ldGhvZCBDb25maWd1cmF0aW9uIFdpemFyZCBQYWdlCi1zZWxlY3RDb25maWdXaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBtZXRob2QgY29uZmlndXJhdGlvbgotc2VsZWN0Q29uZmlnV2l6YXJkUGFnZV90ZXh0PVNlbGVjdCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHRoYXQgY29udGFpbnMgdGhlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgd2hpY2ggeW91IHdvdWxkIGxpa2UgdG8gcHVibGlzaC4KLWNvbmZpZ0xhYmVsX3RleHQ9TWV0aG9kIGNvbmZpZ3VyYXRpb246Ci0KLSMgU2VsZWN0IE1ldGhvZCBDb25maWd1cmF0aW9uIENvbnRlbnQgV2l6YXJkIFBhZ2UKLXNlbGVjdENvbnRlbnRXaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBtZXRob2QgY29uZmlndXJhdGlvbiBjb250ZW50Ci1zZWxlY3RDb250ZW50V2l6YXJkUGFnZV90ZXh0PVNlbGVjdCB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29udGVudCB0byBwdWJsaXNoLiBZb3UgY2FuIGNob29zZSB0byBwdWJsaXNoIHRoZSBlbnRpcmUgY29uZmlndXJhdGlvbiBvciBvbmx5IGEgZmV3IHNlbGVjdCBwcm9jZXNzZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCi1wdWJsaXNoQ29uZmlnUmFkaW9CdXR0b25fdGV4dD1QdWJsaXNoIHRoZSBlbnRpcmUgY29uZmlndXJhdGlvbgotcHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uX3RleHQ9UHVibGlzaCBzZWxlY3RlZCBwcm9jZXNzZXM6Ci1pbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94TGFiZWxfdGV4dD1QdWJsaXNoIHJlZmVyZW5jZWQgYmFzZSBwcm9jZXNzZXMKLQotIyBTZWxlY3QgUHVibGlzaGluZyBPcHRpb25zIFdpemFyZCBQYWdlCi1zZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU9U2VsZWN0IHB1Ymxpc2hpbmcgb3B0aW9ucwotc2VsZWN0UHVibGlzaGluZ09wdGlvbnNXaXphcmRQYWdlX3RleHQ9U2VsZWN0IHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMuIFRoZXNlIG9wdGlvbnMgd2lsbCBiZSB1c2VkIHRvIGN1c3RvbWl6ZSB0aGUgbG9vayBhbmQgYmVoYXZpb3Igb2YgdGhlIHB1Ymxpc2hlZCB3ZWJzaXRlLgotdGl0bGVBbmRMaW5rc0dyb3VwX3RleHQ9VGl0bGUgYW5kIExpbmtzCi10aXRsZUxhYmVsX3RleHQ9VGl0bGU6Ci1hYm91dEhUTUxMYWJlbF90ZXh0PUFib3V0IGNvbnRlbnQ6Ci1mZWVkYmFja1VSTExhYmVsX3RleHQ9RmVlZGJhY2sgVVJMOgotZ2xvc3NhcnlBbmRJbmRleEdyb3VwX3RleHQ9R2xvc3NhcnkgYW5kIEluZGV4Ci1wdWJsaXNoR2xvc3NhcnlMYWJlbF90ZXh0PVB1Ymxpc2ggZ2xvc3NhcnkKLXB1Ymxpc2hJbmRleExhYmVsX3RleHQ9UHVibGlzaCBpbmRleAotbG9va0FuZEZlZWxHcm91cF90ZXh0PUxvb2sgYW5kIEZlZWwKLWJhbm5lckltYWdlTGFiZWxfdGV4dD1CYW5uZXIgaW1hZ2U6Ci12YWxpZGF0aW9uR3JvdXBfdGV4dD1WYWxpZGF0aW9uCi1jaGVja0V4dGVybmFsTGlua3NMYWJlbF90ZXh0PUNoZWNrIGV4dGVybmFsIGh5cGVybGlua3MKLWNvbnZlcnRCcm9rZW5MaW5rc0xhYmVsX3RleHQ9Q29udmVydCBicm9rZW4gaHlwZXJsaW5rcyB0byBwbGFpbiB0ZXh0Ci1kaWFncmFtR3JvdXBfdGV4dD1EaWFncmFtcwotcHVibGlzaEFjdGl2aXR5RGV0YWlsRGlhZ3JhbXNMYWJlbF90ZXh0PVB1Ymxpc2ggYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIHRoYXQgaGF2ZSBub3QgYmVlbiBjcmVhdGVkIG1hbnVhbGx5Ci1wdWJsaXNoRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW1zTGFiZWxfdGV4dD1QdWJsaXNoIGFjdGl2aXR5IGRpYWdyYW1zIGZvciB1bm1vZGlmaWVkIGFjdGl2aXR5IGV4dGVuc2lvbnMKLWxheW91dEdyb3VwX3RleHQ9TGF5b3V0Ci1wdWJsaXNoTGlnaHRXZWlnaHRUcmVlTGFiZWxfdGV4dD1HZW5lcmF0ZSBzdWItdHJlZSBzdHJ1Y3R1cmUgZm9yIHRhc2ssIHJvbGUsIHdvcmsgcHJvZHVjdCBhbmQgZGlzY2lwbGluZSBlbGVtZW50cyB3aXRob3V0IHVzaW5nIGZvbGRlcnMKLXB1Ymxpc2hFeHRyYURlc2NyaXB0b3JJbmZvTGFiZWxfdGV4dD1QdWJsaXNoIGRlc2NyaXB0b3JzIHdpdGggdGhlIGNvbXBsZXRlIGNvbnRlbnQgb2YgdGhlIHJlbGF0ZWQgbWV0aG9kIGNvbnRlbnQgZWxlbWVudAotcHVibGlzaEVtcHR5Q2F0ZWdvcmllc0xhYmVsX3RleHQ9UHVibGlzaCBjYXRlZ29yaWVzIHdpdGggbm8gY2F0ZWdvcml6ZWQgZWxlbWVudHMKLQotcHVibGlzaFdlYlNpdGVHcm91cF90ZXh0PVB1Ymxpc2hlZCB3ZWJzaXRlCi0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFdpemFyZCBQYWdlCi1zZWxlY3REZXN0aW5hdGlvbldpemFyZFBhZ2VfdGl0bGU9U2VsZWN0IGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBhbmQgd2Vic2l0ZSBmb3JtYXQKLXNlbGVjdERlc3RpbmF0aW9uV2l6YXJkUGFnZV90ZXh0PVNlbGVjdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGFuZCBmb3JtYXQgZm9yIHRoZSBwdWJsaXNoZWQgd2Vic2l0ZS4KLWRpckxhYmVsX3RleHQ9RGlyZWN0b3J5Ogotd2ViQXBwR3JvdXBfdGV4dD1XZWJzaXRlIGZvcm1hdAotc3RhdGljV2ViU2l0ZVJhZGlvQnV0dG9uX3RleHQ9U3RhdGljIHdlYiBzaXRlCi1keW5hbWljV2ViQXBwUmFkaW9CdXR0b25fdGV4dD1KYXZhIEVFIHdlYiBhcHBsaWNhdGlvbiBwYWNrYWdlZCBpbiBhIFdBUiBmaWxlIChyZXF1aXJlcyBKYXZhIFNlcnZsZXQgMi4zIG9yIGFib3ZlIGNvbXBsaWFudCBzZXJ2bGV0IGNvbnRhaW5lcikKLWluY2x1ZGVTZWFyY2hDaGVja2JveF90ZXh0PUluY2x1ZGUgc2VhcmNoIGNhcGFiaWxpdHkKLXdlYkFwcGxpY2F0aW9uTmFtZUxhYmVsX3RleHQ9V2ViIGFwcGxpY2F0aW9uIG5hbWU6Ci0KLWRlc3RpbmF0aW9uRGlyZWN0b3J5R3JvdXBfdGV4dD1EZXN0aW5hdGlvbiBkaXJlY3RvcnkKLXBhdGhMYWJlbF90ZXh0PVBhdGg6Ci11c2VEZWZhdWx0UGF0aENoZWNrYm94X3RleHQ9VXNlIGRlZmF1bHQgcGF0aAotdXNlRGVmYXVsdEZlZWRiYWNrTGFiZWxfdGV4dD1Vc2UgZGVmYXVsdCBmZWVkYmFjayBVUkwKLQotaW5jbHVkZVNlYXJjaENoZWNrYm94X3RleHQ9SW5jbHVkZSBzZWFyY2ggY2FwYWJpbGl0eSAocmVxdWlyZXMgY29udGFpbmVyIGZvciBzZXJ2bGV0KQotaW5jbHVkZVNlYXJjaGVzTGFiZWxfdGV4dD1JbmNsdWRlIHNlYXJjaCBjYXBhYmlsaXR5Ci1jbGllbnRTaWRlU2VhcmNoUmFkaW9CdXR0b25fdGV4dD0gQ2xpZW50IHNpZGUgc2VhcmNoIChyZXF1aXJlcyBKYXZhIGFwcGxldCBzdXBwb3J0IGluIGJyb3dzZXIpCi1zZXJ2ZXJTaWRlU2VhcmNoUmFkaW9CdXR0b25fdGV4dD0gU2VydmVyIHNpZGUgc2VhcmNoIChyZXF1aXJlcyBDb250YWluZXIgZm9yIHNlcnZsZXQpCi1nZW5lcmF0ZVdBUkZpbGVMYWJlbF90ZXh0PUdlbmVyYXRlIFdBUiAoV2ViIEFSY2hpdmUpIGZpbGUKLQotdXNlQXBwbGV0Q2hlY2tib3hfdGV4dD1TdXBwb3J0IHZpZXcgY3VzdG9taXphdGlvbiAocmVxdWlyZXMgSmF2YSBhcHBsZXQgc3VwcG9ydCBpbiBicm93c2VyKQotCi1zaXRlQ3VzdG9taXphdGlvbldpemFyZFBhZ2VfdGl0bGU9Q3VzdG9taXplIFdlYnNpdGUKLXNpdGVDdXN0b21pemF0aW9uV2l6YXJkUGFnZV90ZXh0PUN1c3RvbWl6ZSBXZWJzaXRlIGxvb2sgYW5kIGZlZWwKLXRoZW1lQW5kU2tpbkdyb3VwX3RleHQ9VGhlbWUgYW5kIFNraW4KLXNob3dCYW5uZXJDaGVja2JveF90ZXh0PVNob3cgYmFubmVyCi1zZWxlY3RTa2luTGFiZWxfdGV4dD1TZWxlY3Qgc2tpbjoKLQotIyBGSVhNRSEgU2hvdWxkIHRoZXNlIGJlIHdhcm5pbmcgbWVzc2FnZXM/Ci0jIEluZm9ybWF0aW9uIE1lc3NhZ2UKLWludmFsaWRWaWV3c0luZm9fbXNnPVRoZSBmb2xsb3dpbmcgdmlldyhzKSBpbiBjb25maWd1cmF0aW9uICcnezB9Jycgd2lsbCBub3QgYmUgcHVibGlzaGVkOgotaW52YWxpZFZpZXdDb250cmlidXRvckluZm9fbXNnPXswfTogVGhlIHZpZXcgaXMgYSBjb250cmlidXRvcgotaW52YWxpZFZpZXdTYW1lVmlld0luZm9fbXNnPXswfTogVGhpcyB2aWV3IGlzIGEgZHVwbGljYXRlIG9mIGFub3RoZXIgdmlldwotaW52YWxpZFZpZXdJbnZhbGlkSW5mb19tc2c9ezB9OiBUaGlzIHZpZXcgaXMgbm90IGEgdmFsaWQgZWxlbWVudCBpbiB0aGUgY29uZmlndXJhdGlvbgotCi1jYXBhYmlsaXR5UGF0dGVybnNfdGV4dD1DYXBhYmlsaXR5IFBhdHRlcm5zCi1kZWxpdmVyeVByb2Nlc3Nlc190ZXh0PURlbGl2ZXJ5IFByb2Nlc3NlcwotCi0jIFB1Ymxpc2hpbmcgUHJlZmVyZW5jZSBQYWdlCi1wcmVmZXJlbmNlUGFnZV9kZWZhdWx0UGF0aF90ZXh0PURlZmF1bHQgcGF0aDoKLQotIyBDb25maXJtYXRpb24gRGlhbG9ncwotcHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZT1QdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uCi1jb25maXJtUGF0aERpYWxvZ190ZXh0PVRoZSBkZXN0aW5hdGlvbiBwYXRoIGhhcyBiZWVuIHJlc29sdmVkIHRvICcnezB9JycuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/Ci1vdmVyd3JpdGVEaWFsb2dfdGV4dD1UaGUgZGVzdGluYXRpb24gcGF0aCAnJ3swfScnIGFscmVhZHkgZXhpc3RzLiBBbGwgZmlsZXMgaW4gdGhlIGZvbGRlciB3aWxsIGJlIGRlbGV0ZWQuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/Ci1jYW5jZWxQdWJsaXNoQ29uZmlnX21zZz1UaGUgcHVibGlzaGluZyBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkLgotCi0jIEVycm9yIERpYWxvZ3MKLXByZXZpZXdDb25maWdFcnJvcl90aXRsZT1QcmV2aWV3IFB1Ymxpc2hlZCBNZXRob2QgQ29uZmlndXJhdGlvbgotdmlld1JlcG9ydEVycm9yX3RpdGxlPVZpZXcgUHVibGlzaGluZyBSZXBvcnQKLQotIyBFcnJvciBNZXNzYWdlcwotbWlzc2luZ1ZpZXdFcnJvcl9tc2c9SVVQUDAxMDBXOiBUaGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgdmlldy4gRWRpdCB0aGUgY29uZmlndXJhdGlvbiBhbmQgYWRkIGEgdmlldywgb3Igc2VsZWN0IGFub3RoZXIgY29uZmlndXJhdGlvbi4KLWNhbm5vdFB1Ymxpc2hFcnJvcl9tc2c9SVVQUDAxMDFFOiBUaGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBjYW5ub3QgYmUgcHVibGlzaGVkLgotaW52YWxpZFBhdGhFcnJvcl9tc2c9SVVQUDAxMDJFOiBUaGUgZGVzdGluYXRpb24gcGF0aCBpcyBibGFuayBvciBpbnZhbGlkLgotaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZz1JVVBQMDEwM0U6IFRoZSBkZXN0aW5hdGlvbiBwYXRoIGNhbm5vdCBjb250YWluIHRoZXNlIGNoYXJhY3RlcnM6IFxcICMgKiA/ICIgPCA+IHwgISAlIC8KLXB1Ymxpc2hDb25maWdFcnJvcl9tc2c9SVVQUDAxMDRFOiBUaGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiB3YXMgbm90IHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHkuCi1wcmV2aWV3Q29uZmlnRXJyb3JfbXNnPUlVUFAwMTA1RTogVW5hYmxlIHRvIG9wZW4gYSBIVE1MIGJyb3dzZXIgdG8gcHJldmlldyB0aGUgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi12aWV3UmVwb3J0RXJyb3JfbXNnPUlVUFAwMTA2RTogVW5hYmxlIHRvIG9wZW4gYSBIVE1MIGJyb3dzZXIgdG8gdmlldyB0aGUgcHVibGlzaGluZyByZXBvcnQuCi13ZWJBcHBOYW1lRXJyb3JfbXNnPUlVUFAwMTA3RTogVGhlIHdlYiBhcHBsaWNhdGlvbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLgotd2ViQXBwTmFtZUNoYXJzRXJyb3JfbXNnPUlVUFAwMTA4RTogVGhlIHdlYiBhcHBsaWNhdGlvbiBuYW1lIGNhbm5vdCBjb250YWluIHRoZXNlIGNoYXJhY3RlcnM6IFxcICMgKiA/ICIgPCA+IHwgISAlIC8KLQotIyBFcnJvciBSZWFzb25zICYgUmVjb21tZW5kZWQgQWN0aW9ucwotcHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbj1JVVBQMDEwN0U6IEFuIGVycm9yIGhhcyBvY2N1cnJlZC4gU2VsZWN0IHRoZSBEZXRhaWxzIGJ1dHRvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVRoZSBkZXN0aW5hdGlvbiBwYXRoICcnezB9JycgY29udGFpbnMgZmlsZXMgdGhhdCBjYW5ub3QgYmUgZGVsZXRlZC5cblxuQ2xvc2UgdGhpcyBkaWFsb2cgYW5kIHNwZWNpZnkgYW5vdGhlciBwYXRoLgotY3JlYXRlRGlyRXJyb3JfcmVhc29uPVRoZSBkZXN0aW5hdGlvbiBwYXRoICcnezB9JycgY2Fubm90IGJlIGNyZWF0ZWQuXG5cbkNsb3NlIHRoaXMgZGlhbG9nIGFuZCBzcGVjaWZ5IGFub3RoZXIgcGF0aC4KLW9wZW5Ccm93c2VyRXJyb3JfcmVhc29uPVRoZSBkZWZhdWx0IEhUTUwgYnJvd3NlciBvbiB0aGlzIHN5c3RlbSBjYW5ub3QgYmUgZGV0ZWN0ZWQgb3IgbG9jYXRlZC5cblxuQ2xvc2UgdGhpcyBkaWFsb2cgYW5kIG9wZW4gdGhlIGZpbGUgJyd7MH0nJyBtYW51YWxseSB3aXRoIGEgSFRNTCBicm93c2VyLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvUHVibGlzaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9QdWJsaXNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFhNGVjN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9QdWJsaXNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLkxpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcud2l6YXJkcy5BYnN0cmFjdFB1Ymxpc2hXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcud2l6YXJkcy5QdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHMuUHVibGlzaGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEludm9rZXMgdGhlIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24gd2l6YXJkLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogVE9ETzogUmVuYW1lIHRoaXMgY2xhc3MgdG8gUHVibGlzaENvbmZpZ3VyYXRpb25BY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2ggaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQlwcml2YXRlIFB1Ymxpc2hPcHRpb25zIHB1Ymxpc2hEYXRhTW9kZWw7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KElXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQkKLQkJaWYgKCAhKGFjdGlvbiBpbnN0YW5jZW9mIFB1Ymxpc2hBY3Rpb24pICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0cnkgewotCQkJU3RyaW5nIGlkID0gKChQdWJsaXNoQWN0aW9uKWFjdGlvbikuZ2V0SWQoKTsKLQkJCVB1Ymxpc2hlckVsZW1lbnQgZSA9IFB1Ymxpc2hlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRQdWJsaXNoZXJFbGVtZW50KGlkKTsJCQotCQkJaWYgKCBlID09IG51bGwgKSB7Ci0JCQkJLy8gc2hvdyBlcnJvciBhbmQgcmV0dXJuCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlzdGFydFB1Ymxpc2goZSk7Ci0JCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCApIHsKLQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCS5sb2dFcnJvcigiRXJyb3IgcHVibGlzaGluZyBjb250ZW50IiwgZXgpOwkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0KLQlwcml2YXRlIHZvaWQgc3RhcnRQdWJsaXNoKFB1Ymxpc2hlckVsZW1lbnQgcHVibGlzaGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLS8vCQlQdWJsaXNoQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQgPSBuZXcgUHVibGlzaENvbmZpZ3VyYXRpb25XaXphcmQoCi0vLwkJcHVibGlzaERhdGFNb2RlbCk7Ci0JCUFic3RyYWN0UHVibGlzaFdpemFyZCB3aXphcmQgPSBwdWJsaXNoZXIuZ2V0UHVibGlzaFdpemFyZCgpOwotCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBzZWxlY3Rpb24pOwotCQlwdWJsaXNoRGF0YU1vZGVsID0gd2l6YXJkLmdldFB1Ymxpc2hPcHRpb25zKCk7Ci0KLQkJLy9wdWJsaXNoRGF0YU1vZGVsID0gbmV3IFB1Ymxpc2hPcHRpb25zKCk7Ci0KLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlTdHJpbmcgbGFzdFB1YlBhdGggPSBzdG9yZQotCQkJCS5nZXRTdHJpbmcoTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MQVNUX1BVQkxJU0hfRk9MREVSKTsKLQkJaWYgKGxhc3RQdWJQYXRoICE9IG51bGwgJiYgbGFzdFB1YlBhdGgubGVuZ3RoKCkgPiAwKQotCQkJcHVibGlzaERhdGFNb2RlbC5zZXRMYXN0UHVibGljYXRpb25QYXRoKGxhc3RQdWJQYXRoKTsKLQotCQkvLyBJbnN0YW50aWF0ZSB0aGUgd2l6YXJkIGNvbnRhaW5lciB3aXRoIHRoZSB3aXphcmQgYW5kIG9wZW4gaXQuCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQotCQlpZiAoIXB1Ymxpc2hEYXRhTW9kZWwuaXNGaW5pc2hQcmVzc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBwdWJsaXNoRGVzdEZvbGRlciA9IHB1Ymxpc2hEYXRhTW9kZWwuZ2V0UHVibGljYXRpb25QYXRoKCk7Ci0JCXN0b3JlLnNldFZhbHVlKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTEFTVF9QVUJMSVNIX0ZPTERFUiwKLQkJCQlwdWJsaXNoRGVzdEZvbGRlcik7Ci0JCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCUFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1nciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc2VsZWNlZENvbmZpZ05hbWUgPSBwdWJsaXNoRGF0YU1vZGVsLmdldFNlbGVjdGVkQ29uZmlnKCk7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIHNlbGVjZWRDb25maWdOYW1lKTsKLQotCQkJcHVibGlzaE1nciA9IHB1Ymxpc2hlci5nZXRQdWJsaXNoTWFuYWdlcigpOwotCQkJcHVibGlzaE1nci5pbml0KHB1Ymxpc2hEZXN0Rm9sZGVyLCBjb25maWcsIHB1Ymxpc2hEYXRhTW9kZWwpOwotCQkJUHVibGlzaGluZ09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgUHVibGlzaGluZ09wZXJhdGlvbihwdWJsaXNoTWdyKTsKLQotCQkJUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZyBkbGcgPSBuZXcgUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZygKLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgcHVibGlzaE1nci5nZXRWaWV3QnVpbGRlcigpKTsKLQotCQkJVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCS5ydW5XaXRoUHJvZ3Jlc3MoCi0JCQkJCQkJb3BlcmF0aW9uLAotCQkJCQkJCWRsZywKLQkJCQkJCQl0cnVlLAotCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKHB1Ymxpc2hNZ3IgIT0gbnVsbCkgewotCQkJCXB1Ymxpc2hNZ3IuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uLCBJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvUHVibGlzaEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9QdWJsaXNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIzZGQ4YzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9QdWJsaXNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci0KLS8qKgotICogZGVmaW5lIHRoZSBQdWJsaXNoIGFjdGlvbgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JCi0JLyoqCi0JICogY3JlYXRlIGEgUHVibGlzaEFjdGlvbiBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSBpZCBTdHJpbmcgdGhlIGlkIG9mIHRoZSBhY3Rpb24KLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbgotCSAqIEBwYXJhbSBpbWFnZSBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBhY3Rpb24gaWNvbgotCSAqLwotCXB1YmxpYyBQdWJsaXNoQWN0aW9uKFN0cmluZyBpZCwgIFN0cmluZyBuYW1lLCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpIHsKLQkJc3VwZXIobmFtZSwgaW1hZ2UpOwkKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGlkIG9mIHRoZSBhY3Rpb24KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0JCi0JLyoqCi0JICogZXhlY3V0ZSB0aGUgYWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJbmV3IFB1Ymxpc2goKS5ydW4odGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9QdWJsaXNoQ29uZmlnQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL1B1Ymxpc2hDb25maWdBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2VhOTkxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL1B1Ymxpc2hDb25maWdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5QdWJsaXNoQ29uZmlnV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBJbnZva2VzIHRoZSBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaENvbmZpZ0FjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KElXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQl0cnkgewotCQkJLy8gSW5zdGFudGlhdGUgYW5kIGluaXRpYWxpemUgdGhlIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYWl0b24KLQkJCS8vIHdpemFyZC4KLQkJCVB1Ymxpc2hDb25maWdXaXphcmQgd2l6YXJkID0gbmV3IFB1Ymxpc2hDb25maWdXaXphcmQoKTsKLQkJCXdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIG51bGwpOwotCi0JCQkvLyBJbnN0YW50aWF0ZSB0aGUgd2l6YXJkIGNvbnRhaW5lciB3aXRoIHRoZSB3aXphcmQgYW5kIG9wZW4gaXQuCi0JCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgcHVibGlzaGluZyBjb250ZW50IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiwgSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL1B1Ymxpc2hDb25maWd1cmF0aW9uQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL1B1Ymxpc2hDb25maWd1cmF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4MTdkM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9QdWJsaXNoQ29uZmlndXJhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLkxpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcud2l6YXJkcy5BYnN0cmFjdFB1Ymxpc2hXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcud2l6YXJkcy5QdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHMuUHVibGlzaGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBJbnZva2VzIHRoZSBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaENvbmZpZ3VyYXRpb25BY3Rpb24gaW1wbGVtZW50cwotCQlJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQoSVdvcmtiZW5jaFdpbmRvdykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKElBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXRyeSB7Ci0JCQkvLyB0aGlzIHdpbGwgbm90IHdvcmssIG5lZWQgdG8gcGljayB1cCB0aGUgY29ycmVjdCBwdWJsaXNoZXIKLQkJCS8vIEppbmh1YSBYaSAxLzEyLzA3Ci0JCQkKLQkJCS8qCi0JCQkvLyBJbnN0YW50aWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhaXRvbgotCQkJLy8gd2l6YXJkLgotCQkJUHVibGlzaENvbmZpZ1dpemFyZCB3aXphcmQgPSBuZXcgUHVibGlzaENvbmZpZ1dpemFyZCgpOwotCQkJd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgbnVsbCk7Ci0KLQkJCS8vIEluc3RhbnRpYXRlIHRoZSB3aXphcmQgY29udGFpbmVyIHdpdGggdGhlIHdpemFyZCBhbmQgb3BlbiBpdC4KLQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCB3aXphcmQpOwotCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCSovCi0JCQkKLQkJCUxpc3QgZWxlbWVudHMgPSBQdWJsaXNoZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0UHVibGlzaGVyRWxlbWVudHMoKTsKLQkJCWlmICggZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50cy5zaXplKCkgPiAwICkgewotCQkJCS8vIHNob3cgZGlhbG9nIHRvIHNlbGVjdCBwdWJsaXNoZXIgaWYgbW9yZSB0aGVuIG9uZSwKLQkJCQkvLyBUT0RPCi0JCQkJUHVibGlzaGVyRWxlbWVudCBlID0gKFB1Ymxpc2hlckVsZW1lbnQpZWxlbWVudHMuZ2V0KDApOwotCQkJCXN0YXJ0UHVibGlzaChlKTsJCQkKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgcHVibGlzaGluZyBjb250ZW50IiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24sIElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFB1Ymxpc2goUHVibGlzaGVyRWxlbWVudCBwdWJsaXNoZXIpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJUHVibGlzaE9wdGlvbnMgcHVibGlzaERhdGFNb2RlbDsKLQotCQlBYnN0cmFjdFB1Ymxpc2hXaXphcmQgd2l6YXJkID0gcHVibGlzaGVyLmdldFB1Ymxpc2hXaXphcmQoKTsKLQkJd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgbnVsbCk7Ci0JCXB1Ymxpc2hEYXRhTW9kZWwgPSB3aXphcmQuZ2V0UHVibGlzaE9wdGlvbnMoKTsKLQotCQkvL3B1Ymxpc2hEYXRhTW9kZWwgPSBuZXcgUHVibGlzaE9wdGlvbnMoKTsKLQotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCVN0cmluZyBsYXN0UHViUGF0aCA9IHN0b3JlCi0JCQkJLmdldFN0cmluZyhMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xBU1RfUFVCTElTSF9GT0xERVIpOwotCQlpZiAobGFzdFB1YlBhdGggIT0gbnVsbCAmJiBsYXN0UHViUGF0aC5sZW5ndGgoKSA+IDApCi0JCQlwdWJsaXNoRGF0YU1vZGVsLnNldExhc3RQdWJsaWNhdGlvblBhdGgobGFzdFB1YlBhdGgpOwotCi0JCS8vIEluc3RhbnRpYXRlIHRoZSB3aXphcmQgY29udGFpbmVyIHdpdGggdGhlIHdpemFyZCBhbmQgb3BlbiBpdC4KLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cub3BlbigpOwotCi0JCWlmICghcHVibGlzaERhdGFNb2RlbC5pc0ZpbmlzaFByZXNzZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIHB1Ymxpc2hEZXN0Rm9sZGVyID0gcHVibGlzaERhdGFNb2RlbC5nZXRQdWJsaWNhdGlvblBhdGgoKTsKLQkJc3RvcmUuc2V0VmFsdWUoTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MQVNUX1BVQkxJU0hfRk9MREVSLAotCQkJCXB1Ymxpc2hEZXN0Rm9sZGVyKTsKLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJQWJzdHJhY3RQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzZWxlY2VkQ29uZmlnTmFtZSA9IHB1Ymxpc2hEYXRhTW9kZWwuZ2V0U2VsZWN0ZWRDb25maWcoKTsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgc2VsZWNlZENvbmZpZ05hbWUpOwotCi0JCQlwdWJsaXNoTWdyID0gcHVibGlzaGVyLmdldFB1Ymxpc2hNYW5hZ2VyKCk7Ci0JCQlwdWJsaXNoTWdyLmluaXQocHVibGlzaERlc3RGb2xkZXIsIGNvbmZpZywgcHVibGlzaERhdGFNb2RlbCk7Ci0JCQlQdWJsaXNoaW5nT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBQdWJsaXNoaW5nT3BlcmF0aW9uKHB1Ymxpc2hNZ3IpOwotCi0JCQlQdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGRsZyA9IG5ldyBQdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKAotCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBwdWJsaXNoTWdyLmdldFZpZXdCdWlsZGVyKCkpOwotCi0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJLnJ1bldpdGhQcm9ncmVzcygKLQkJCQkJCQlvcGVyYXRpb24sCi0JCQkJCQkJZGxnLAotCQkJCQkJCXRydWUsCi0JCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAocHVibGlzaE1nciAhPSBudWxsKSB7Ci0JCQkJcHVibGlzaE1nci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNThlZTA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgYWN0aW9ucyBmb3IgdGhlIHB1Ymxpc2hpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9QdWJsaXNoQ29uZmlnT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9pbnRlcm5hbC93aXphcmRzL1B1Ymxpc2hDb25maWdPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjUxYzc5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9pbnRlcm5hbC93aXphcmRzL1B1Ymxpc2hDb25maWdPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RQdWJsaXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFZpZXdCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uUHJvZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoZSBwdWJsaXNoIGNvbmZpZ3VyYXRpb24gb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoQ29uZmlnT3BlcmF0aW9uIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9SRUFTT04gPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJRVdfQ09ORklHX0VSUk9SX1RJVExFID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnByZXZpZXdDb25maWdFcnJvcl90aXRsZTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJRVdfQ09ORklHX0VSUk9SX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wcmV2aWV3Q29uZmlnRXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVBPUlRfRVJST1JfVElUTEUgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMudmlld1JlcG9ydEVycm9yX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVBPUlRfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnZpZXdSZXBvcnRFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5vcGVuQnJvd3NlckVycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0NBTkNFTF9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2FuY2VsUHVibGlzaENvbmZpZ19tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQWJzdHJhY3RQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyOwotCi0JcHJpdmF0ZSBTdHJpbmcgcHVibGlzaGVkX3VybDsKLQotCXByaXZhdGUgU3RyaW5nIHJlcG9ydF91cmw7Ci0KLQlwcml2YXRlIE1zZ0RpYWxvZyBtc2dEaWFsb2c7Ci0KLQlwcml2YXRlIEV4Y2VwdGlvbiBydW5FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoQ29uZmlnT3BlcmF0aW9uKEFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1ncikgewotCQlzdXBlcigpOwotCQl0aGlzLnB1Ymxpc2hNZ3IgPSBwdWJsaXNoTWdyOwotCQl0aGlzLm1zZ0RpYWxvZyA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB2aWV3IGJ1aWxkZXIuCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFZpZXdCdWlsZGVyCi0JICovCi0JcHVibGljIEFic3RyYWN0Vmlld0J1aWxkZXIgZ2V0Vmlld0J1aWxkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnB1Ymxpc2hNZ3IuZ2V0Vmlld0J1aWxkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHVybCBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hlZFVybCgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hlZF91cmw7Ci0JfQotCi0JLyoqCi0JICogcnVuIHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSB0aGUgcHVibGlzaGluZyB0YXNrLgotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcnVuRXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vbml0b3Iuc2V0VGFza05hbWUoUHVibGlzaGluZ1Jlc291cmNlcy5wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQJCQkKLQkJCXB1Ymxpc2hNZ3IucHVibGlzaChtb25pdG9yKTsKLQotCQkJcHVibGlzaGVkX3VybCA9IHB1Ymxpc2hNZ3IuZ2V0UHVibGlzaGVkVXJsKCk7Ci0JCQlyZXBvcnRfdXJsID0gcHVibGlzaE1nci5nZXRQdWJsaXNoUmVwb3J0VXJsKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlydW5FeGNlcHRpb24gPSBlOwotCQl9Ci0KLQkJZmluYWwgYm9vbGVhbiBjYW5jZWxlZCA9IG1vbml0b3IuaXNDYW5jZWxlZCgpOwotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoY2FuY2VsZWQpIHsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlJbmZvKFBVQkxJU0hfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCVBVQkxJU0hfQ09ORklHX0NBTkNFTF9NU0cpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKHB1Ymxpc2hlZF91cmwgPT0gbnVsbCB8fCByZXBvcnRfdXJsID09IG51bGwpIHsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSwKLQkJCQkJCQlQVUJMSVNIX0NPTkZJR19FUlJPUl9NU0csCi0JCQkJCQkJUFVCTElTSF9DT05GSUdfRVJST1JfUkVBU09OLCBydW5FeGNlcHRpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gTGF1bmNoIGEgSFRNTCBicm93c2VyIHRvIHZpZXcgdGhlIHB1Ymxpc2hlZCBzaXRlLgotCQkJCWlmIChvcGVuQnJvd3NlcihwdWJsaXNoZWRfdXJsKSA9PSBmYWxzZSkgewotCQkJCQlTdHJpbmcgcmVhc29uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBwdWJsaXNoZWRfdXJsIH0pOwotCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFBSRVZJRVdfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCVBSRVZJRVdfQ09ORklHX0VSUk9SX01TRywgcmVhc29uKTsKLQkJCQl9Ci0KLQkJCQkvLyBMYXVuY2ggYSBIVE1MIGJyb3dzZXIgdG8gdmlldyB0aGUgcmVwb3J0IG9uIHRoZSBwdWJsaXNoZWQKLQkJCQkvLyBzaXRlLgotCQkJCWlmIChvcGVuQnJvd3NlcihyZXBvcnRfdXJsKSA9PSBmYWxzZSkgewotCQkJCQlTdHJpbmcgcmVhc29uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyByZXBvcnRfdXJsIH0pOwotCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFZJRVdfUkVQT1JUX0VSUk9SX1RJVExFLAotCQkJCQkJCVZJRVdfUkVQT1JUX0VSUk9SX01TRywgcmVhc29uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIG9wZW4gYSBicm93c2VyIHRvIHNob3cgdGhlIHB1Ymxpc2hlZCBjb250ZW50LgotCSAqIEBwYXJhbSB1cmwgU3RyaW5nIHRoZSBzaXRlIHVybAotCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGJyb3dzZXIgb3BlbmVkIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBvcGVuQnJvd3NlcihmaW5hbCBTdHJpbmcgdXJsKSB7Ci0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQl0cnkgewotCQkJLy8gTGF1bmNoIHRoZSBkZWZhdWx0IEhUTUwgdmlld2VyIHRvIGRpc3BsYXkgdGhlIEhUTUwgcGFnZS4KLQkJCS8vIE9uIExpbnV4LCB0aGlzIGNhbid0IGxhdW5jaCB1cmxzLCBvbmx5IGxvY2FsIGZpbGVzIGNhbiBiZQotCQkJLy8gbGF1bmNoZWQuCi0JCQkvLyBTb3JyeSBJIGhhdmUgdXNlIGludGVybmFsIGNsYXNzIGhlcmUuCi0JCQkvLyBob3BlIEVjbGlwc2Uub3JnIGNhbiBoYXZlIGEgcHVibGljIGFwaSB0byBkbyBzby4KLQkJCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3MgPSBQcm9ncmFtLmxhdW5jaCh1cmwpOwotCQkJfSBlbHNlIHsKLS8vCQkJCUlCcm93c2VyIGJyb3dzZXIgPSBvcmcuZWNsaXBzZS5oZWxwLmludGVybmFsLmJyb3dzZXIuQnJvd3Nlck1hbmFnZXIKLS8vCQkJCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlQnJvd3Nlcih0cnVlKTsKLS8vCQkJCWlmIChicm93c2VyID09IG51bGwpIHsKLS8vCQkJCQl0cnkgewotLy8JCQkJCQlicm93c2VyLmRpc3BsYXlVUkwodXJsKTsKLS8vCQkJCQkJc3VjY2VzcyA9IHRydWU7Ci0vLwkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJCi0JCQkJLy8gMTU1NDkwIC0gQ2Fubm90IGRldGVjdGVkIGRlZmF1bHQgYnJvd3NlciB3aGVuIHByZXZpZXcgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gb24gTGludXgKLQkJCQkvLyBjaGFuZ2VkIHRvIHVzZSBzd3QgYnJvd3NlcgotCQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKQotCQkJCXsKLQkJCQkgICAgcHVibGljIHZvaWQgcnVuKCkKLQkJCQkJewotLy8JCQkJCQkJLy8gb3BlbiBhbm90aGVyIHN3dCBicm93c2VyIHNpbmNlIHdlIGhhdmUgbm8gKHNpbXBsZSkgd2F5IG9mIGNyZWF0aW5nIGEgc3lzdGVtIGRlZmF1bHQgYnJvd3NlcgotLy8JCQkJCQkJLy8gdGhlIEVjbGlwc2UgZ3V5cyBoaWRlIGFsbCB0aGUgZ29vZCBhcGlzIGFzIGludGVybmFsCi0JCQkJCQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJCQkJCQlzaGVsbC5zZXRUZXh0KHVybCk7Ci0JCQkJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQkJCQkJc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkJCQkJQnJvd3NlciBwb3B1cF9icm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJCQkJCQlwb3B1cF9icm93c2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USHxHcmlkRGF0YS5HUkFCX0hPUklaT05UQUx8R3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCQkJCQkJCXBvcHVwX2Jyb3dzZXIuc2V0VXJsKHVybCk7CQkJCQkJCQkJCQkJCQkKLQkJCQkJCQlzaGVsbC5vcGVuKCk7Ci0JCQkJCX0KLQkJCQl9KTsJCQkKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlzdWNjZXNzID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gc3VjY2VzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2ludGVybmFsL3dpemFyZHMvUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuc2lvbk1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2ludGVybmFsL3dpemFyZHMvUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuc2lvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjY5YzRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9pbnRlcm5hbC93aXphcmRzL1B1Ymxpc2hDb25maWdXaXphcmRFeHRlbnNpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5JUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLk5ld1dpemFyZFBhZ2VDb250cmlidXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlICJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wdWJsaXNoQ29uZmlnV2l6YXJkIiBleHRlbnNpb24KLSAqIHBvaW50LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hDb25maWdXaXphcmRFeHRlbnNpb25NYW5hZ2VyIHsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAicHVibGlzaENvbmZpZ1dpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuc2lvbk1hbmFnZXIgaW5zdGFuY2UgPSBuZXcgUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuc2lvbk1hbmFnZXIoKTsKLQotCS8vIEFuIGV4dGVuZGVyIG9mIHRoZSBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZC4KLQlwcml2YXRlIElQdWJsaXNoQ29uZmlnV2l6YXJkRXh0ZW5kZXIgd2l6YXJkRXh0ZW5kZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuc2lvbk1hbmFnZXIoKSB7Ci0JCXByb2Nlc3NFeHRlbnNpb25Qb2ludCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFB1Ymxpc2hDb25maWdXaXphcmRFeHRlbnNpb25NYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIHRoZSAib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHVibGlzaENvbmZpZ1dpemFyZCIKLQkgKiBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0V4dGVuc2lvblBvaW50KCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFLCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQdWJsaXNoQ29uZmlnV2l6YXJkRXh0ZW5kZXIgZXh0ZW5kZXIgPSAoSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlcikgY29uZmlnRWxlbWVudAotCQkJCQkJCQkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKHdpemFyZEV4dGVuZGVyID09IG51bGwpIHsKLQkJCQkJCQl3aXphcmRFeHRlbmRlciA9IGV4dGVuZGVyOwotCi0JCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRDb25maWdFbGVtZW50cyA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRDaGlsZHJlbigid2l6YXJkUGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBjaGlsZENvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZENvbmZpZ0VsZW1lbnQgPSBjaGlsZENvbmZpZ0VsZW1lbnRzW2tdOwotCQkJCQkJCQlJV2l6YXJkUGFnZSB3aXphcmRQYWdlID0gKElXaXphcmRQYWdlKSBjaGlsZENvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCQkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlTdHJpbmcgdHlwZSA9IGNoaWxkQ29uZmlnRWxlbWVudAotCQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlTdHJpbmcgdGFyZ2V0ID0gY2hpbGRDb25maWdFbGVtZW50Ci0JCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgidGFyZ2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJU3RyaW5nIGluc2VydCA9IGNoaWxkQ29uZmlnRWxlbWVudAotCQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImluc2VydCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWlmICh3aXphcmRQYWdlICE9IG51bGwgJiYgdHlwZSAhPSBudWxsCi0JCQkJCQkJCQkJJiYgdHlwZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJCWlmICh0eXBlLmVxdWFscygicmVwbGFjZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQl3aXphcmRFeHRlbmRlcgotCQkJCQkJCQkJCQkJLmFkZFJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uKG5ldyBSZXBsYWNlV2l6YXJkUGFnZUNvbnRyaWJ1dGlvbigKLQkJCQkJCQkJCQkJCQkJd2l6YXJkUGFnZSwgdGFyZ2V0KSk7Ci0JCQkJCQkJCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJuZXciKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJYm9vbGVhbiBpbnNlcnRBZnRlciA9IHRydWU7Ci0JCQkJCQkJCQkJaWYgKGluc2VydCAhPSBudWxsCi0JCQkJCQkJCQkJCQkmJiBpbnNlcnQuZXF1YWxzKCJiZWZvcmUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCWluc2VydEFmdGVyID0gZmFsc2U7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCXdpemFyZEV4dGVuZGVyCi0JCQkJCQkJCQkJCQkuYWRkTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbihuZXcgTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbigKLQkJCQkJCQkJCQkJCQkJd2l6YXJkUGFnZSwgdGFyZ2V0LAotCQkJCQkJCQkJCQkJCQlpbnNlcnRBZnRlcikpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQkJY2hpbGRDb25maWdFbGVtZW50cyA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRDaGlsZHJlbigicHVibGlzaGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoY2hpbGRDb25maWdFbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZENvbmZpZ0VsZW1lbnQgPSBjaGlsZENvbmZpZ0VsZW1lbnRzWzBdOwotCQkJCQkJCQlQdWJsaXNoTWFuYWdlciBwdWJsaXNoZXIgPSAoUHVibGlzaE1hbmFnZXIpIGNoaWxkQ29uZmlnRWxlbWVudAotCQkJCQkJCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCQotCQkJCQkJCQl3aXphcmRFeHRlbmRlci5zZXRQdWJsaXNoZXIocHVibGlzaGVyKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQgZXh0ZW5kZXIgbG9hZGVkIHZpYSB0aGUKLQkgKiAib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHVibGlzaENvbmZpZ1dpemFyZCIgZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIEByZXR1cm4gYW4gRXhwb3J0IE1TUCB3aXphcmQgZXh0ZW5kZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlciBnZXRXaXphcmRFeHRlbmRlcigpIHsKLQkJcmV0dXJuIHdpemFyZEV4dGVuZGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYjczOGZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgbWFuYWdpbmcgdGhlIHB1Ymxpc2hpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvUHVibGlzaGluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9QdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWUyMWExZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9QdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkNvbW1vblByZWZQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIFRoZSBQcmVmZXJlbmNlIHBhZ2UgZm9yIHRoZSBQdWJsaXNoaW5nIFVJLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogQnVncyBmaXhlZDoKLSAqIDx1bD4KLSAqIDxsaT5odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2OTU3PC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBDb21tb25QcmVmUGFnZSBpbXBsZW1lbnRzCi0JCUlXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgU2VsZWN0aW9uTGlzdGVuZXIsIE1vZGlmeUxpc3RlbmVyIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByaXZhdGUgVGV4dCBkZXN0aW5hdGlvblBhdGhUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGZlZWRiYWNrVVJMVGV4dDsKLQotCXByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGV4dHJhRGVzY3JpcHRvckluZm9DdHI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9ERVNDUklQVE9SX0lORk8gPSAib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuZXh0cmFEZXNjcmlwdG9ySW5mbyI7IC8vJE5PTi1OTFMtMSQJCQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBEZXN0aW5hdGlvbiBQYXRoIGdyb3VwLgotCQlHcm91cCBkZXN0aW5hdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQlkZXN0aW5hdGlvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlkZXN0aW5hdGlvbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlkZXN0aW5hdGlvbkdyb3VwCi0JCQkJLnNldFRleHQoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmRlc3RpbmF0aW9uRGlyZWN0b3J5R3JvdXBfdGV4dCk7Ci0KLQkJY3JlYXRlTGFiZWwoZGVzdGluYXRpb25Hcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHJlZmVyZW5jZVBhZ2VfZGVmYXVsdFBhdGhfdGV4dCk7Ci0JCWRlc3RpbmF0aW9uUGF0aFRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQoZGVzdGluYXRpb25Hcm91cCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRlc3RpbmF0aW9uUGF0aFRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoUGF0aCgpKTsKLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihkZXN0aW5hdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5CUk9XU0VfQlVUVE9OX1RFWFQpOwotCi0JCS8vIENyZWF0ZSB0aGUgUHVibGlzaGVkIFdlYnNpdGUgZ3JvdXAuCi0JCUdyb3VwIHdlYlNpdGVHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJd2ViU2l0ZUdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQl3ZWJTaXRlR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXdlYlNpdGVHcm91cC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoV2ViU2l0ZUdyb3VwX3RleHQpOwotCi0JCWNyZWF0ZUxhYmVsKHdlYlNpdGVHcm91cCwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLmZlZWRiYWNrVVJMTGFiZWxfdGV4dCk7Ci0JCWZlZWRiYWNrVVJMVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dCh3ZWJTaXRlR3JvdXAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlmZWVkYmFja1VSTFRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRGZWVkYmFja1VSTCgpKTsKLQkJY3JlYXRlTGFiZWwod2ViU2l0ZUdyb3VwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgdGhlIGxheW91dCBncm91cC4KLQkJR3JvdXAgbGF5b3V0R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCWxheW91dEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlsYXlvdXRHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbGF5b3V0R3JvdXAuc2V0VGV4dChQdWJsaXNoaW5nVUlSZXNvdXJjZXMubGF5b3V0R3JvdXBfdGV4dCk7Ci0KLQkJZXh0cmFEZXNjcmlwdG9ySW5mb0N0ciA9IG5ldyBCdXR0b24obGF5b3V0R3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWV4dHJhRGVzY3JpcHRvckluZm9DdHIKLQkJCQkuc2V0VGV4dChQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaEV4dHJhRGVzY3JpcHRvckluZm9MYWJlbF90ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlleHRyYURlc2NyaXB0b3JJbmZvQ3RyLnNldExheW91dERhdGEoZ2QpOwotCQlleHRyYURlc2NyaXB0b3JJbmZvQ3RyLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRFeHRyYURlc2NyaXB0b3JJbmZvKCkpOwotCi0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQotCQlkZXN0aW5hdGlvblBhdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmICghaXNQYXRoVmFsaWQoZGVzdGluYXRpb25QYXRoVGV4dC5nZXRUZXh0KCkpKSB7Ci0JCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZXRWYWxpZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3BlbkRpcmVjdG9yeURpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlzdG9yZVZhbHVlcygpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zYXZlQWxsUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRQdWJsaXNoUGF0aChkZXN0aW5hdGlvblBhdGhUZXh0LmdldFRleHQoKQotCQkJCS50cmltKCkpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5zZXRGZWVkYmFja1VSTChmZWVkYmFja1VSTFRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldEV4dHJhRGVzY3JpcHRvckluZm8oZXh0cmFEZXNjcmlwdG9ySW5mb0N0cgotCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJLy8gRklYTUUhIFJldmlldyBpbXBsZW1lbnRhdGlvbi4KLQkJLy8gYWxsb3cgdG8gcGFzcyB0aGUgdmFsdWUgdG8gdGhlIGxpYnJhcnkgYnJvd3NpbmcKLQkJLy8gU3lzdGVtLnNldFByb3BlcnR5KEVYVFJBX0RFU0NSSVBUT1JfSU5GTywKLQkJLy8gZXh0cmFEZXNjcmlwdG9ySW5mb0N0ci5nZXRTZWxlY3Rpb24oKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQlEZWZhdWx0Q29udGVudFZhbGlkYXRvcgotCQkJCS5zZXREZWZhdWx0U2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKGV4dHJhRGVzY3JpcHRvckluZm9DdHIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotCQlkZXN0aW5hdGlvblBhdGhUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVmYXVsdFB1Ymxpc2hQYXRoKCkpOwotCQlmZWVkYmFja1VSTFRleHQKLQkJCQkuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXREZWZhdWx0RmVlZGJhY2tVUkwoKSk7Ci0JCWV4dHJhRGVzY3JpcHRvckluZm9DdHIuc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldERlZmF1bHRFeHRyYURlc2NyaXB0b3JJbmZvKCkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlZmF1bHRUZXh0KSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuRGlyZWN0b3J5RGlhbG9nKCkgewotCQl0cnkgewotCQkJRGlyZWN0b3J5RGlhbG9nIGRkID0gbmV3IERpcmVjdG9yeURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSwKLQkJCQkJU1dULk5PTkUpOwotCi0JCQlTdHJpbmcgZGVzdGluYXRpb24gPSBkZC5vcGVuKCk7Ci0JCQlpZiAoZGVzdGluYXRpb24gIT0gbnVsbCkgewotCQkJCWRlc3RpbmF0aW9uUGF0aFRleHQuc2V0VGV4dChkZXN0aW5hdGlvbik7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BhdGhWYWxpZChTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPD0gMCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkUGF0aEVycm9yX21zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUlQYXRoIGVjUGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKHBhdGgpOwotCQlib29sZWFuIGlzVmFsaWQgPSBlY1BhdGguaXNWYWxpZFBhdGgocGF0aCk7Ci0JCWlmICghaXNWYWxpZCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkUGF0aEVycm9yX21zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghU3RyVXRpbC5pc1ZhbGlkUHVibGlzaFBhdGgocGF0aCkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9QdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGI3YTY2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9QdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIFB1Ymxpc2hpbmcgVUkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAgZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2NjMwCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9FTlRJUkVfQ09ORklHID0gInB1Ymxpc2hFbnRpcmVDb25maWciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSBQdWJsaXNoT3B0aW9ucy5USVRMRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQU5ORVJfSU1BR0UgPSBQdWJsaXNoT3B0aW9ucy5CQU5ORVJfSU1BR0U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJPVVRfSFRNTCA9IFB1Ymxpc2hPcHRpb25zLkFCT1VUX0hUTUw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVFREJBQ0tfVVJMID0gUHVibGlzaE9wdGlvbnMuRkVFREJBQ0tfVVJMOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfR0xPU1NBUlkgPSBQdWJsaXNoT3B0aW9ucy5JTkNMVURFX0dMT1NTQVJZOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfSU5ERVggPSBQdWJsaXNoT3B0aW9ucy5JTkNMVURFX0lOREVYOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX0VYVEVSTkFMX0xJTktTID0gUHVibGlzaE9wdGlvbnMuQ0hFQ0tfRVhURVJOQUxfTElOS1M7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVF9CUk9LRU5fTElOS1MgPSBQdWJsaXNoT3B0aW9ucy5DT05WRVJUX0JST0tFTl9MSU5LUzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSUdIVF9XRUlHSFRfVFJFRSA9IFB1Ymxpc2hPcHRpb25zLkxJR0hUX1dFSUdIVF9UUkVFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0RFU0NSSVBUT1JfSU5GTyA9IFB1Ymxpc2hPcHRpb25zLkVYVFJBX0RFU0NSSVBUT1JfSU5GTzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCA9IExpYnJhcnlVSVByZWZlcmVuY2VzLlBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0REOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTiA9IExpYnJhcnlVSVByZWZlcmVuY2VzLlBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX1BBVEggPSBQdWJsaXNoT3B0aW9ucy5QVUJMSVNIX1BBVEg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9TVEFUSUNfV0VCX1NJVEUgPSAicHVibGlzaFN0YXRpY1dlYlNpdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9TRVJWTEVUX1NFQVJDSCA9ICJpbmNsdWRlU2VydmxldFNlYXJjaCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJBUFBfTkFNRSA9IFB1Ymxpc2hPcHRpb25zLldFQkFQUF9OQU1FOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfU0VBUkNIID0gImluY2x1ZGVTZWFyY2giOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVElBTElaRUQgPSAiaW5pdGlhbGl6ZWQiOyAvLyROT04tTkxTLTEkCQotCi0JLy8gVGhlIHBsdWctaW4gc3BlY2lmaWMgcHJlZmVyZW5jZSBzdG9yZS4KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0VGl0bGUgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRCYW5uZXJJbWFnZSA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEFib3V0SFRNTCA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEZlZWRiYWNrVVJMID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0UHVibGlzaFBhdGggPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUFVCTElTSF9FTlRJUkVfQ09ORklHLCB0cnVlKTsKLQotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChUSVRMRSwgZ2V0RGVmYXVsdFRpdGxlKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChCQU5ORVJfSU1BR0UsIGdldERlZmF1bHRCYW5uZXJJbWFnZSgpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoQUJPVVRfSFRNTCwgZ2V0RGVmYXVsdEFib3V0SFRNTCgpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoRkVFREJBQ0tfVVJMLCBnZXREZWZhdWx0RmVlZGJhY2tVUkwoKSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KElOQ0xVREVfR0xPU1NBUlksIHRydWUpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChJTkNMVURFX0lOREVYLCB0cnVlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoQ0hFQ0tfRVhURVJOQUxfTElOS1MsIHRydWUpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChDT05WRVJUX0JST0tFTl9MSU5LUywgdHJ1ZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0RELCB0cnVlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUFVCTElTSF9BRF9GT1JfQUNUSVZJVFlfRVhURU5TSU9OLCB0cnVlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoTElHSFRfV0VJR0hUX1RSRUUsIHRydWUpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChFWFRSQV9ERVNDUklQVE9SX0lORk8sCi0JCQkJZ2V0RGVmYXVsdEV4dHJhRGVzY3JpcHRvckluZm8oKSk7Ci0KLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUFVCTElTSF9QQVRILCBnZXREZWZhdWx0UHVibGlzaFBhdGgoKSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBVQkxJU0hfU1RBVElDX1dFQl9TSVRFLCB0cnVlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoSU5DTFVERV9TRVJWTEVUX1NFQVJDSCwgdHJ1ZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFdFQkFQUF9OQU1FLCAiIik7IC8vJE5PTi1OTFMtMSQJCQkKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoSU5DTFVERV9TRUFSQ0gsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggZW50aXJlIGNvbmZpZ3VyYXRpb24gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hFbnRpcmVDb25maWcoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBQVUJMSVNIX0VOVElSRV9DT05GSUcpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFBVQkxJU0hfRU5USVJFX0NPTkZJRyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIGVudGlyZSBjb25maWd1cmF0aW9ucHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaEVudGlyZUNvbmZpZyhTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBQVUJMSVNIX0VOVElSRV9DT05GSUcsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHRpdGxlIGZvciBhIHB1Ymxpc2hlZCB3ZWJzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdGl0bGUgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0VGl0bGUoKSB7Ci0JCWlmIChkZWZhdWx0VGl0bGUgPT0gbnVsbCkgewotCQkJU3RyaW5nIHVybCA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nKCJ0aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodXJsID09IG51bGwgfHwgdXJsLmxlbmd0aCgpID09IDAgfHwgdXJsLnN0YXJ0c1dpdGgoIlsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWRlZmF1bHRUaXRsZSA9IHVybDsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFRpdGxlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdlYiBzaXRlIHRpdGxlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSB3ZWIgc2l0ZSB0aXRsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRpdGxlKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBUSVRMRSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhUSVRMRSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3ZWIgc2l0ZSB0aXRsZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgd2ViIHNpdGUgdGl0bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIGNvbmZpZ0lkLCBTdHJpbmcgdGl0bGUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgVElUTEUsIHRpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGJhbm5lciBpbWFnZSBmb3IgYSBwdWJsaXNoZWQgd2Vic2l0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGJhbm5lciBpbWFnZSBmb3IgYSBwdWJsaXNoZWQgd2Vic2l0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRCYW5uZXJJbWFnZSgpIHsKLQkJaWYgKGRlZmF1bHRCYW5uZXJJbWFnZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgaW1hZ2UgPSBQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZygKLQkJCQkJImJhbm5lckltYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbWFnZSA9PSBudWxsIHx8IGltYWdlLmxlbmd0aCgpID09IDAgfHwgaW1hZ2Uuc3RhcnRzV2l0aCgiWyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlkZWZhdWx0QmFubmVySW1hZ2UgPSBpbWFnZTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEJhbm5lckltYWdlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGJhbm5lciBpbWFnZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiB0aGUgYmFubmVyIGltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFubmVySW1hZ2UoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIEJBTk5FUl9JTUFHRSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhCQU5ORVJfSU1BR0UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFubmVyIGltYWdlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBiYW5uZXIgaW1hZ2UgVVJMCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEJhbm5lckltYWdlKFN0cmluZyBjb25maWdJZCwgU3RyaW5nIGltYWdlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIEJBTk5FUl9JTUFHRSwKLQkJCQlpbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBhYm91dCBIVE1MIGZvciBhIHB1Ymxpc2hlZCB3ZWJzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgYWJvdXQgSFRNTCBmb3IgYSBwdWJsaXNoZWQgd2Vic2l0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRBYm91dEhUTUwoKSB7Ci0JCWlmIChkZWZhdWx0QWJvdXRIVE1MID09IG51bGwpIHsKLQkJCVN0cmluZyBmaWxlID0gUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0U3RyaW5nKCJhYm91dEhUTUwiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGZpbGUgPT0gbnVsbCB8fCBmaWxlLmxlbmd0aCgpID09IDAgfHwgZmlsZS5zdGFydHNXaXRoKCJbIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWZpbGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZGVmYXVsdEFib3V0SFRNTCA9IGZpbGU7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRBYm91dEhUTUw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWJvdXQgSFRNTCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiB0aGUgYWJvdXQgSFRNTCBmaWxlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBYm91dEhUTUwoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIEFCT1VUX0hUTUwpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoQUJPVVRfSFRNTCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhYm91dCBIVE1MIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIGFib3V0IEhUTUwgZmlsZSBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEFib3V0SFRNTChTdHJpbmcgY29uZmlnSWQsIFN0cmluZyBwYXRoKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIEFCT1VUX0hUTUwsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgZmVlZGJhY2sgVVJMIGZvciBhIHB1Ymxpc2hlZCB3ZWJzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgZmVlZGJhY2sgVVJMIGZvciBhIHB1Ymxpc2hlZCB3ZWJzaXRlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEZlZWRiYWNrVVJMKCkgewotCQlpZiAoZGVmYXVsdEZlZWRiYWNrVVJMID09IG51bGwpIHsKLQkJCWRlZmF1bHRGZWVkYmFja1VSTCA9ICJodHRwOi8vd3d3LnB1Ymxpc2hlZF93ZWJzaXRlLmNvbS9mZWVkYmFjayI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEZlZWRiYWNrVVJMOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGZlZWRiYWNrIFVSTCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZlZWRiYWNrIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZlZWRiYWNrVVJMKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhGRUVEQkFDS19VUkwpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZlZWRiYWNrIFVSTCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIHRoZSBmZWVkYmFjayBVUkwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmVlZGJhY2tVUkwoU3RyaW5nIHVybCkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoRkVFREJBQ0tfVVJMLCB1cmwpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGZlZWRiYWNrIFVSTCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiB0aGUgZmVlZGJhY2sgVVJMCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmVlZGJhY2tVUkwoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIEZFRURCQUNLX1VSTCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhGRUVEQkFDS19VUkwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZmVlZGJhY2sgVVJMIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICB0aGUgZmVlZGJhY2sgVVJMCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZlZWRiYWNrVVJMKFN0cmluZyBjb25maWdJZCwgU3RyaW5nIHVybCkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBGRUVEQkFDS19VUkwsIHVybCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5jbHVkZSBnbG9zc2FyeSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0SW5jbHVkZUdsb3NzYXJ5KFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgSU5DTFVERV9HTE9TU0FSWSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oSU5DTFVERV9HTE9TU0FSWSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNsdWRlIGdsb3NzYXJ5IHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEluY2x1ZGVHbG9zc2FyeShTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5DTFVERV9HTE9TU0FSWSwKLQkJCQl2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5jbHVkZSBpbmRleCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0SW5jbHVkZUluZGV4KFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgSU5DTFVERV9JTkRFWCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oSU5DTFVERV9JTkRFWCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNsdWRlIGluZGV4IHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEluY2x1ZGVJbmRleChTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5DTFVERV9JTkRFWCwKLQkJCQl2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY2hlY2sgZXh0ZXJuYWwgbGlua3MgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldENoZWNrRXh0ZXJuYWxMaW5rcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIENIRUNLX0VYVEVSTkFMX0xJTktTKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihDSEVDS19FWFRFUk5BTF9MSU5LUyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjaGVjayBleHRlcm5hbCBsaW5rcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGVja0V4dGVybmFsTGlua3MoU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgQ0hFQ0tfRVhURVJOQUxfTElOS1MsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb252ZXJ0IGJyb2tlbiBsaW5rcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Q29udmVydEJyb2tlbkxpbmtzKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgQ09OVkVSVF9CUk9LRU5fTElOS1MpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKENPTlZFUlRfQlJPS0VOX0xJTktTKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnZlcnQgYnJva2VuIGxpbmtzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbnZlcnRCcm9rZW5MaW5rcyhTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBDT05WRVJUX0JST0tFTl9MSU5LUywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCB1bm9wZW4gYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKFN0cmluZyBjb25maWdJZCwKLQkJCWJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggYWN0aXZpeSBkaWFncmFtcyBmb3IgYmFzZSBhY3Rpdml0aWVzIHdpdGggdW5tb2RpZmllZAotCSAqIGV4dGVuc2lvbiBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBQVUJMSVNIX0FEX0ZPUl9BQ1RJVklUWV9FWFRFTlNJT04pOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIGFjdGl2aXkgZGlhZ3JhbXMgZm9yIGJhc2UgYWN0aXZpdGllcyB3aXRoIHVubW9kaWZpZWQKLQkgKiBleHRlbnNpb24gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oU3RyaW5nIGNvbmZpZ0lkLAotCQkJYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTiwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpZ2h0IHdlaWdodCB0cmVlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRMaWdodFdlaWdodFRyZWUoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBMSUdIVF9XRUlHSFRfVFJFRSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oTElHSFRfV0VJR0hUX1RSRUUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGlnaHQgd2VpZ2h0IHRyZWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TGlnaHRXZWlnaHRUcmVlKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBMSUdIVF9XRUlHSFRfVFJFRSwKLQkJCQl2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBleHRyYSBkZXNjcmlwdG9yIGluZm8gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0RXh0cmFEZXNjcmlwdG9ySW5mbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXh0cmEgZGVzY3JpcHRvciBpbmZvIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRFeHRyYURlc2NyaXB0b3JJbmZvKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oRVhUUkFfREVTQ1JJUFRPUl9JTkZPKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZWZhdWx0IGV4dHJhIGRlc2NyaXB0b3IgaW5mbyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RXh0cmFEZXNjcmlwdG9ySW5mbyhib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShFWFRSQV9ERVNDUklQVE9SX0lORk8sIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleHRyYSBkZXNjcmlwdG9yIGluZm8gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEV4dHJhRGVzY3JpcHRvckluZm8oU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBFWFRSQV9ERVNDUklQVE9SX0lORk8pOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKEVYVFJBX0RFU0NSSVBUT1JfSU5GTyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHRyYSBkZXNjcmlwdG9yIGluZm8gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RXh0cmFEZXNjcmlwdG9ySW5mbyhTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBFWFRSQV9ERVNDUklQVE9SX0lORk8sIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHBhdGggZm9yIGEgcHVibGlzaGVkIHdlYiBzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgcGF0aCBmb3IgYSBwdWJsaXNoZWQgd2ViIHNpdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFB1Ymxpc2hQYXRoKCkgewotCQlpZiAoZGVmYXVsdFB1Ymxpc2hQYXRoID09IG51bGwpIHsKLQkJCVN0cmluZyB1c2VySG9tZSA9IFN5c3RlbQotCQkJCQkuZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpLnJlcGxhY2UoJ1xcJywgJy8nKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHBhdGggPSBQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZygKLQkJCQkJInB1Ymxpc2hQYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5sZW5ndGgoKSA9PSAwIHx8IHBhdGguc3RhcnRzV2l0aCgiWyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlwYXRoID0gdXNlckhvbWUgKyAiL3B1Ymxpc2giOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHBhdGguc3RhcnRzV2l0aCgiPHVzZXIuaG9tZT4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcGF0aCA9IHVzZXJIb21lICsgcGF0aC5zdWJzdHJpbmcoMTEpOwotCQkJfQotCQkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKS5lcXVhbHMoIlxcIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcGF0aCA9IHBhdGgucmVwbGFjZSgnLycsICdcXCcpOwotCQkJfQotCi0JCQlpbnQgaWR4ID0gLTE7Ci0JCQlpZiAoKGlkeCA9IHBhdGguaW5kZXhPZigiPGFwcC5uYW1lPiIpKSA+PSAwKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgYXBwTmFtZVByb3BlciA9IExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkuZ2V0QXBwbGljYXRpb25TaG9ydE5hbWUoKTsKLQkJCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgaWR4KSArIGFwcE5hbWVQcm9wZXIKLQkJCQkJCSsgcGF0aC5zdWJzdHJpbmcoaWR4ICsgMTApOwotCQkJfQotCi0JCQlkZWZhdWx0UHVibGlzaFBhdGggPSBwYXRoOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0UHVibGlzaFBhdGg7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBwYXRoIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHVibGlzaCBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHVibGlzaFBhdGgoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKFBVQkxJU0hfUEFUSCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBwYXRoIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwdWJsaXNoIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFBVQkxJU0hfUEFUSCwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBwYXRoIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBwdWJsaXNoIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQdWJsaXNoUGF0aChTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgUFVCTElTSF9QQVRIKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKFBVQkxJU0hfUEFUSCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIHBhdGggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgcHVibGlzaCBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFB1Ymxpc2hQYXRoKFN0cmluZyBjb25maWdJZCwgU3RyaW5nIHBhdGgpIHsKLQkJcHJlZlN0b3JlCi0JCQkJLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgUFVCTElTSF9QQVRILCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIHN0YXRpYyB3ZWIgc2l0ZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaFN0YXRpY1dlYlNpdGUoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBQVUJMSVNIX1NUQVRJQ19XRUJfU0lURSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9TVEFUSUNfV0VCX1NJVEUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBzdGF0aWMgd2ViIHNpdGUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaFN0YXRpY1dlYlNpdGUoU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgUFVCTElTSF9TVEFUSUNfV0VCX1NJVEUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmNsdWRlIGFwcGxldCBzZWFyY2ggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEluY2x1ZGVTZXJ2bGV0U2VhcmNoKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgSU5DTFVERV9TRVJWTEVUX1NFQVJDSCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oSU5DTFVERV9TRVJWTEVUX1NFQVJDSCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNsdWRlIHNlcnZsZXQgc2VhcmNoIHByZWZlcmVuY2UgdmFsdWUuLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbmNsdWRlU2VydmxldFNlYXJjaChTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBJTkNMVURFX1NFUlZMRVRfU0VBUkNILCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5jbHVkZSBzZWFyY2ggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEluY2x1ZGVTZWFyY2goU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBJTkNMVURFX1NFQVJDSCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oSU5DTFVERV9TRUFSQ0gpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBzZWFyY2ggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5jbHVkZVNlYXJjaChTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5DTFVERV9TRUFSQ0gsCi0JCQkJdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdlYiBhcHBsaWNhdGlvbiBuYW1lIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V2ViQXBwTmFtZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgV0VCQVBQX05BTUUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoV0VCQVBQX05BTUUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgd2ViIGFwcGxpY2F0aW9uIG5hbWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgd2ViIGFwcGxpY2F0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V2ViQXBwTmFtZShTdHJpbmcgY29uZmlnSWQsIFN0cmluZyBuYW1lKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIFdFQkFQUF9OQU1FLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBwcmVmZXJlbmNlIHByZWZpeC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgcHJlZmVyZW5jZSBwcmVmaXggYXNzaWduZWQgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25maWdQcmVmUHJlZml4KFN0cmluZyBjb25maWdJZCkgewotCQl0cnkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBjb25maWdJZCk7Ci0JCQlyZXR1cm4gY29uZmlnLmdldEd1aWQoKSArICIuIjsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBwcmVmZXJlbmNlcyBpbml0aWFsaXplZCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgSU5JVElBTElaRUQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgcHJlZmVyZW5jZXMgaW5pdGlhbGl6ZWQgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUKLQkJCQkuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTklUSUFMSVpFRCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGFsbCB0aGUgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVBbGxQcmVmZXJlbmNlcygpIHsKLQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyNThjMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciB0aGUgcHVibGlzaGluZyBVSS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL0lQdWJsaXNoQ29uZmlnV2l6YXJkRXh0ZW5kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMGY2ZmZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuSVdpemFyZEV4dGVuZGVyOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGFuIGV4dGVuZGVyIG9mIHRoZSBQdWJsaXNoIENvbmZpZ3VyYXRpb24gd2l6YXJkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuZGVyIGV4dGVuZHMgSVdpemFyZEV4dGVuZGVyIHsKLQotCS8qKgotCSAqIEdpdmVzIHRoZSB3aXphcmQgZXh0ZW5kZXIgYSBjaGFuY2UgdG8gcGVyZm9ybSBzb21lIGluaXRpYWxpemF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB3aXphcmRQYWdlcwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIG9mIDxjb2RlPklXaXphcmRQYWdlPC9jb2RlPiBvd25lZCBieSB0aGUgd2l6YXJkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChMaXN0IHdpemFyZFBhZ2VzKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgdXNlciBzZWxlY3RlZCBjb25maWd1cmF0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb25maWdOYW1lKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlB1Ymxpc2hPcHRpb25zPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wdGlvbnMgZ2V0UHVibGlzaGluZ09wdGlvbnMoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbmZpZ3VyYXRpb24gcHVibGlzaGVyLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoTWFuYWdlciBnZXRQdWJsaXNoZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbmZpZ3VyYXRpb24gcHVibGlzaGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hlcihQdWJsaXNoTWFuYWdlciBwdWJsaXNoZXIpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hDb25maWdXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaENvbmZpZ1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOWQ3YzcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaENvbmZpZ1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLmludGVybmFsLndpemFyZHMuUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuUHVibGlzaGluZ1VJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGd1aWRlcyB0aGUgdXNlciB0byBwdWJsaXNoIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8gYSB3ZWIKLSAqIHNpdGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaENvbmZpZ1dpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBQdWJsaXNoQ29uZmlnV2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCS8vIFRoZSBzZWxlY3QgY29uZmlndXJhdGlvbiB3aXphcmQgcGFnZS4KLQlwcm90ZWN0ZWQgU2VsZWN0Q29uZmlnUGFnZSBzZWxlY3RDb25maWdQYWdlOwotCi0JLy8gVGhlIHNlbGVjdCBjb25maWZ1cmF0aW9uIGNvbnRlbnQgd2l6YXJkIHBhZ2UuCi0JcHJvdGVjdGVkIFNlbGVjdENvbnRlbnRQYWdlIHNlbGVjdENvbnRlbnRQYWdlOwotCi0JLy8gVGhlIHNlbGVjdCBwdWJsaXNoaW5nIG9wdGlvbnMgd2l6YXJkIHBhZ2UuCi0JcHJvdGVjdGVkIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSBzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2U7Ci0KLQkvLyBUaGUgc2VsZWN0IGRlc3RpbmF0aW9uIHdpemFyZCBwYWdlLgotCXByb3RlY3RlZCBTZWxlY3REZXN0aW5hdGlvblBhZ2Ugc2VsZWN0RGVzdGluYXRpb25QYWdlOwotCi0JLy8gQW4gZXh0ZW5kZXIgb2YgdGhpcyB3aXphcmQuCi0JcHJvdGVjdGVkIElQdWJsaXNoQ29uZmlnV2l6YXJkRXh0ZW5kZXIgd2l6YXJkRXh0ZW5kZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoQ29uZmlnV2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ1dpemFyZF90aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXdpemFyZEV4dGVuZGVyID0gUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuc2lvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRXaXphcmRFeHRlbmRlcigpOwotCQlpZiAod2l6YXJkRXh0ZW5kZXIgIT0gbnVsbCkgewotCQkJd2l6YXJkRXh0ZW5kZXIuaW5pdCh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLmFkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyID09IG51bGwpIHsKLQkJCXNlbGVjdENvbmZpZ1BhZ2UgPSBuZXcgU2VsZWN0Q29uZmlnUGFnZSgpOwotCQkJc2VsZWN0Q29udGVudFBhZ2UgPSBuZXcgU2VsZWN0Q29udGVudFBhZ2UoKTsKLQkJCXNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSA9IG5ldyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UoKTsKLQkJCXNlbGVjdERlc3RpbmF0aW9uUGFnZSA9IG5ldyBTZWxlY3REZXN0aW5hdGlvblBhZ2UoKTsKLQkJCXN1cGVyLmFkZFBhZ2Uoc2VsZWN0Q29uZmlnUGFnZSk7Ci0JCQlzdXBlci5hZGRQYWdlKHNlbGVjdENvbnRlbnRQYWdlKTsKLQkJCXN1cGVyLmFkZFBhZ2Uoc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKTsKLQkJCXN1cGVyLmFkZFBhZ2Uoc2VsZWN0RGVzdGluYXRpb25QYWdlKTsKLQkJfSBlbHNlIHsKLQkJCUxpc3Q8SVdpemFyZFBhZ2U+IHdpemFyZFBhZ2VzID0gbmV3IEFycmF5TGlzdDxJV2l6YXJkUGFnZT4oKTsKLQotCQkJSVdpemFyZFBhZ2UgcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShTZWxlY3RDb25maWdQYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RDb25maWdQYWdlID0gbmV3IFNlbGVjdENvbmZpZ1BhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0Q29uZmlnUGFnZSk7Ci0JCQl9Ci0KLQkJCXBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU2VsZWN0Q29udGVudFBhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdENvbnRlbnRQYWdlID0gbmV3IFNlbGVjdENvbnRlbnRQYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHNlbGVjdENvbnRlbnRQYWdlKTsKLQkJCX0KLQotCQkJcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSA9IG5ldyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKTsKLQkJCX0KLQotCQkJcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShTZWxlY3REZXN0aW5hdGlvblBhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdERlc3RpbmF0aW9uUGFnZSA9IG5ldyBTZWxlY3REZXN0aW5hdGlvblBhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0RGVzdGluYXRpb25QYWdlKTsKLQkJCX0KLQotCQkJTGlzdCBjb250cmlidXRpb25zID0gd2l6YXJkRXh0ZW5kZXIuZ2V0TmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbnMoKTsKLQkJCWlmIChjb250cmlidXRpb25zICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29udHJpYnV0aW9ucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5ld1dpemFyZFBhZ2VDb250cmlidXRpb24gZXhldG5zaW9uID0gKE5ld1dpemFyZFBhZ2VDb250cmlidXRpb24pIGl0Ci0JCQkJCQkJLm5leHQoKTsKLQkJCQkJcGFnZSA9IChJV2l6YXJkUGFnZSkgZXhldG5zaW9uLmdldFdpemFyZFBhZ2UoKTsKLQkJCQkJaW50IGluZGV4ID0gd2l6YXJkUGFnZXMuaW5kZXhPZihwYWdlLmdldE5hbWUoKSk7Ci0JCQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGV4ZXRuc2lvbi5nZXRJbnNlcnRBZnRlcigpKSB7Ci0JCQkJCQkJd2l6YXJkUGFnZXMuYWRkKGluZGV4ICsgMSwgcGFnZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXdpemFyZFBhZ2VzLmFkZChpbmRleCwgcGFnZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB3aXphcmRQYWdlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChJV2l6YXJkUGFnZSkgaXQubmV4dCgpOwotCQkJCXN1cGVyLmFkZFBhZ2Uod2l6YXJkUGFnZSk7Ci0JCQl9Ci0KLQkJCXdpemFyZEV4dGVuZGVyLmluaXQod2l6YXJkUGFnZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyICE9IG51bGwgJiYgd2l6YXJkRXh0ZW5kZXIuY2FuRmluaXNoKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpID09IHNlbGVjdERlc3RpbmF0aW9uUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCVB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hlciA9IG51bGw7Ci0JCVN0cmluZyBjb25maWdOYW1lID0gbnVsbDsKLQotCQl0cnkgewotCQkJUHVibGlzaE9wdGlvbnMgb3B0aW9ucyA9IG51bGw7Ci0KLQkJCWlmICh3aXphcmRFeHRlbmRlciAhPSBudWxsKSB7Ci0JCQkJY29uZmlnTmFtZSA9IHdpemFyZEV4dGVuZGVyLmdldENvbmZpZ05hbWUoKTsKLQkJCQlvcHRpb25zID0gd2l6YXJkRXh0ZW5kZXIuZ2V0UHVibGlzaGluZ09wdGlvbnMoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29uZmlnTmFtZSA9IHNlbGVjdENvbmZpZ1BhZ2UuZ2V0Q29uZmlnTmFtZSgpOwotCQkJCW9wdGlvbnMgPSBnZXRQdWJsaXNoaW5nT3B0aW9ucygpOwotCQkJfQotCi0JCQlpZiAoY2hlY2tBbmRDcmVhdGVEaXIob3B0aW9ucykpIHsKLQkJCQlwdWJsaXNoZXIgPSAod2l6YXJkRXh0ZW5kZXIgIT0gbnVsbCkgPyB3aXphcmRFeHRlbmRlcgotCQkJCQkJLmdldFB1Ymxpc2hlcigpIDogbmV3IFB1Ymxpc2hNYW5hZ2VyKCk7Ci0KLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgY29uZmlnTmFtZSk7Ci0KLQkJCQlwdWJsaXNoZXIuaW5pdChvcHRpb25zLmdldFB1YmxpY2F0aW9uUGF0aCgpLCBjb25maWcsIG9wdGlvbnMpOwotCQkJCVB1Ymxpc2hpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFB1Ymxpc2hpbmdPcGVyYXRpb24oCi0JCQkJCQlwdWJsaXNoZXIpOwotCi0JCQkJUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZyBkbGcgPSBuZXcgUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZygKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHB1Ymxpc2hlcgotCQkJCQkJCQkuZ2V0Vmlld0J1aWxkZXIoKSk7Ci0KLQkJCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKG9wZXJhdGlvbiwgZGxnLCB0cnVlLAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGUpOwotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSAhPSBudWxsKSB7Ci0JCQkJc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLnNhdmVQcmVmZXJlbmNlcygpOwotCQkJCXNlbGVjdERlc3RpbmF0aW9uUGFnZS5zYXZlUHJlZmVyZW5jZXMoKTsKLQkJCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnTmFtZSwKLQkJCQkJCXRydWUpOwotCQkJfQotCQkJaWYgKHB1Ymxpc2hlciAhPSBudWxsKSB7Ci0JCQkJcHVibGlzaGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHB1Ymxpc2hpbmcgb3B0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB1c2VyIHNwZWNpZmllZCBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIFB1Ymxpc2hPcHRpb25zIGdldFB1Ymxpc2hpbmdPcHRpb25zKCkgewotCQlQdWJsaXNoT3B0aW9ucyBvcHRpb25zID0gc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlCi0JCQkJLmdldFB1Ymxpc2hpbmdPcHRpb25zKCk7Ci0KLQkJYm9vbGVhbiBwdWJsaXNoQ29uZmlnID0gc2VsZWN0Q29udGVudFBhZ2UuZ2V0UHVibGlzaENvbmZpZ1NlbGVjdGlvbigpOwotCQlvcHRpb25zLnNldFB1Ymxpc2hDb25maWd1cmF0aW9uKHB1Ymxpc2hDb25maWcpOwotCQlvcHRpb25zLnNldFB1Ymxpc2hQcm9jZXNzKCFwdWJsaXNoQ29uZmlnKTsKLQkJb3B0aW9ucy5zZXRQdWJsaWNhdGlvblBhdGgoc2VsZWN0RGVzdGluYXRpb25QYWdlLmdldFB1Ymxpc2hEaXJlY3RvcnkoKSk7Ci0KLQkJaWYgKCFzZWxlY3REZXN0aW5hdGlvblBhZ2UuZ2V0U3RhdGljV2ViU2l0ZVNlbGVjdGlvbigpKSB7Ci0JCQlvcHRpb25zLnNlcnZlclNpZGVTZWFyY2ggPSBzZWxlY3REZXN0aW5hdGlvblBhZ2UKLQkJCQkJLmdldEluY2x1ZGVTZWFyY2hTZWxlY3Rpb24oKTsKLQkJCW9wdGlvbnMud2ViQXBwTmFtZSA9IHNlbGVjdERlc3RpbmF0aW9uUGFnZS5nZXRXZWJBcHBOYW1lKCk7Ci0JCX0KLQotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgYW5kIGNyZWF0ZXMgdGhlIGRlc3RpbmF0aW9uIHBhdGggd2hlcmUgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogd2lsbCBiZSBwdWJsaXNoZWQuCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiAgICAgICAgICAgIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZXN0aW5hdGlvbiBwYXRoIGlzIHZhbGlkLAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrQW5kQ3JlYXRlRGlyKFB1Ymxpc2hPcHRpb25zIG9wdGlvbnMpIHsKLQkJU3RyaW5nIGRpciA9IG9wdGlvbnMucHVibGljYXRpb25QYXRoOwotCQlTdHJpbmcgZGVmYXVsdFB1Ymxpc2hQYXRoID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVmYXVsdFB1Ymxpc2hQYXRoKCk7Ci0JCWJvb2xlYW4gYW5zd2VyID0gZmFsc2U7Ci0KLQkJSVBhdGggZWNQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcoZGlyKTsKLQkJaWYgKCFlY1BhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGRlZmF1bHRQdWJsaXNoUGF0aAotCQkJCQkrIFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKSArIGRpcjsgLy8kTk9OLU5MUy0xJAotCQkJYW5zd2VyID0gUHVibGlzaGluZ1VJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5UHJvbXB0KAotCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jb25maXJtUGF0aERpYWxvZ190ZXh0LAotCQkJCQkJCQkJCQlwYXRoKSk7Ci0KLQkJCWlmIChhbnN3ZXIpIHsKLQkJCQlvcHRpb25zLnNldFB1YmxpY2F0aW9uUGF0aChkaXIpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIpOwotCi0JCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQlGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygpOwotCQkJaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCWFuc3dlciA9IFB1Ymxpc2hpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLm92ZXJ3cml0ZURpYWxvZ190ZXh0LAotCQkJCQkJCQkJCQkJZGlyKSk7Ci0KLQkJCQlpZiAoYW5zd2VyID09IHRydWUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWFuc3dlciA9IEZpbGVVdGlsCi0JCQkJCQkJCS5kZWxldGVBbGxGaWxlcyhmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCWlmIChhbnN3ZXIgPT0gZmFsc2UpIHsKLQkJCQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jYW5ub3RQdWJsaXNoRXJyb3JfbXNnLAotCQkJCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5kZWxldGVGaWxlc0Vycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQkJCWRpcikpOwotCQkJCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNhbm5vdFB1Ymxpc2hFcnJvcl9tc2csCi0JCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJCQkJCQlkaXIpLCBlKTsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWFuc3dlciA9IGZpbGUubWtkaXJzKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2Fubm90UHVibGlzaEVycm9yX21zZywKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY3JlYXRlRGlyRXJyb3JfcmVhc29uLAotCQkJCQkJCQlmaWxlLmdldEFic29sdXRlUGF0aCgpKSwgZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKCFhbnN3ZXIpIHsKLQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNhbm5vdFB1Ymxpc2hFcnJvcl9tc2csCi0JCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNyZWF0ZURpckVycm9yX3JlYXNvbiwKLQkJCQkJCQkJZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhbnN3ZXI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoT3B0aW9uQ29udHJpYnV0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hPcHRpb25Db250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWY4YjNiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hPcHRpb25Db250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLS8qKgotICogTW9kZWxzIGEgInB1Ymxpc2hPcHRpb24iIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBpbiB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wdWJsaXNoQ29uZmlndXJhdGlvbldpemFyZCIgZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hPcHRpb25Db250cmlidXRpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRTZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgZXhwb3J0IG9wdGlvbiBuYW1lCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICB0aGUgZXhwb3J0IG9wdGlvbiBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZWZhdWx0U2VsZWN0aW9uCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQgYnkgZGVmYXVsdAotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3B0aW9uQ29udHJpYnV0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCQlib29sZWFuIGRlZmF1bHRTZWxlY3Rpb24pIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl0aGlzLmRlZmF1bHRTZWxlY3Rpb24gPSBkZWZhdWx0U2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBleHBvcnQgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGV4cG9ydCBvcHRpb24gbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBleHBvcnQgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGV4cG9ydCBvcHRpb24gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZWxlY2l0b24gb2YgdGhpcyBleHBvcnQgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvcHRpb24gc2hvdWxkIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gZGVmYXVsdFNlbGVjdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjMmZlYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFjdGl2aXR5RGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLk5ld0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RWaWV3QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogVGhlIHB1Ymxpc2ggY29uZmlndXJhdGlvbiBwcm9ncmVzcyBkaWFsb2cuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2cgZXh0ZW5kcyBQcm9ncmVzc01vbml0b3JEaWFsb2cgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZGlhZ3JhbVZpZXdlckhvbGRlcjsKLQotCXByaXZhdGUgQWJzdHJhY3RWaWV3QnVpbGRlciB2aWV3QnVpbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2coU2hlbGwgcGFyZW50LAotCQkJQWJzdHJhY3RWaWV3QnVpbGRlciB2aWV3QnVpbGRlcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnZpZXdCdWlsZGVyID0gdmlld0J1aWxkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY3RybCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlpZiAodmlld0J1aWxkZXIgIT0gbnVsbCkgewotCQkJLy8gQ3JlYXRlIHRoZSBkaWFncmFtIHZpZXdlciBob2xkZXIgYW5kIHRoZSBkaWFncmFtIHNlcnZpY2UuCi0JCQlkaWFncmFtVmlld2VySG9sZGVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoMSwgMSkpOwotCQkJZGlhZ3JhbVZpZXdlckhvbGRlci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlkaWFncmFtVmlld2VySG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCQlFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IgPSB2aWV3QnVpbGRlci5nZXRMYXlvdXRNZ3IoKTsKLQkJCVN0cmluZyBuZXdEaWFncmFtcyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoIlBVQkxJU0hfTkVXX0RJQUdSQU0iKTsKLQkJCUJvb2xlYW4gbmV3RGlhZ3JhbSA9IG5ldyBCb29sZWFuKG5ld0RpYWdyYW1zKTsKLQkJCWlmIChuZXdEaWFncmFtLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJTmV3QWN0aXZpdHlEaWFncmFtU2VydmljZSBkaWFncmFtU2VydmljZSA9IG5ldyBOZXdBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKAotCQkJCQkJZGlhZ3JhbVZpZXdlckhvbGRlciwKLQkJCQkJCW5ldyBGaWxlKGxheW91dE1nci5nZXRQdWJsaXNoRGlyKCkpKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoZWRVbkNyZWF0ZWRBREQodmlld0J1aWxkZXIKLQkJCQkJCS5nZXRPcHRpb25zKCkuaXNBdXRvR2VuZXJhdGVBY3Rpdml0eURpYWdyYW1zKCkpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKHZpZXdCdWlsZGVyCi0JCQkJCQkuZ2V0T3B0aW9ucygpLmlzVW5vcGVuRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW0oKSk7Ci0JCQkJbGF5b3V0TWdyLnNldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoZGlhZ3JhbVNlcnZpY2UpOwotCQkJfSBlbHNlIHsKLQkJCQlBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlID0gbmV3IEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoCi0JCQkJCQlkaWFncmFtVmlld2VySG9sZGVyLAotCQkJCQkJbmV3IEZpbGUobGF5b3V0TWdyLmdldFB1Ymxpc2hEaXIoKSkpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hlZFVuQ3JlYXRlZEFERCh2aWV3QnVpbGRlcgotCQkJCQkJLmdldE9wdGlvbnMoKS5pc0F1dG9HZW5lcmF0ZUFjdGl2aXR5RGlhZ3JhbXMoKSk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24odmlld0J1aWxkZXIKLQkJCQkJCS5nZXRPcHRpb25zKCkuaXNVbm9wZW5FeHRlbmRlZEFjdGl2aXR5RGlhZ3JhbSgpKTsKLQkJCQlsYXlvdXRNZ3Iuc2V0QWN0aXZpdHlEaWFncmFtU2VydmljZShkaWFncmFtU2VydmljZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY3RybDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaGluZ09wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoaW5nT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyZjc2ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoaW5nT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RWaWV3QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLlByb2dyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIFBlcmZvcm1zIHRoZSByZWFsIHdvcmsgb2YgcHVibGlzaGluZyBhIE1ldGhvZCBDb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nT3BlcmF0aW9uIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9SRUFTT04gPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJRVdfQ09ORklHX0VSUk9SX1RJVExFID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnByZXZpZXdDb25maWdFcnJvcl90aXRsZTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJRVdfQ09ORklHX0VSUk9SX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wcmV2aWV3Q29uZmlnRXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVBPUlRfRVJST1JfVElUTEUgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMudmlld1JlcG9ydEVycm9yX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVBPUlRfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnZpZXdSZXBvcnRFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5vcGVuQnJvd3NlckVycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0NBTkNFTF9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2FuY2VsUHVibGlzaENvbmZpZ19tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQWJzdHJhY3RQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyOwotCi0JcHJpdmF0ZSBTdHJpbmcgcHVibGlzaGVkX3VybDsKLQotCXByaXZhdGUgU3RyaW5nIHJlcG9ydF91cmw7Ci0KLQlwcml2YXRlIE1zZ0RpYWxvZyBtc2dEaWFsb2c7Ci0KLQlwcml2YXRlIEV4Y2VwdGlvbiBydW5FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nT3BlcmF0aW9uKEFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1ncikgewotCQlzdXBlcigpOwotCQl0aGlzLnB1Ymxpc2hNZ3IgPSBwdWJsaXNoTWdyOwotCQl0aGlzLm1zZ0RpYWxvZyA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB2aWV3IGJ1aWxkZXIuCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFZpZXdCdWlsZGVyCi0JICovCi0JcHVibGljIEFic3RyYWN0Vmlld0J1aWxkZXIgZ2V0Vmlld0J1aWxkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnB1Ymxpc2hNZ3IuZ2V0Vmlld0J1aWxkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHVybCBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hlZFVybCgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hlZF91cmw7Ci0JfQotCi0JLyoqCi0JICogcnVuIHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSB0aGUgcHVibGlzaGluZyB0YXNrLgotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcnVuRXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vbml0b3Iuc2V0VGFza05hbWUoUHVibGlzaGluZ1Jlc291cmNlcy5wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQJCQkKLQkJCXB1Ymxpc2hNZ3IucHVibGlzaChtb25pdG9yKTsKLQotCQkJcHVibGlzaGVkX3VybCA9IHB1Ymxpc2hNZ3IuZ2V0UHVibGlzaGVkVXJsKCk7Ci0JCQlyZXBvcnRfdXJsID0gcHVibGlzaE1nci5nZXRQdWJsaXNoUmVwb3J0VXJsKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlydW5FeGNlcHRpb24gPSBlOwotCQl9Ci0KLQkJZmluYWwgYm9vbGVhbiBjYW5jZWxlZCA9IG1vbml0b3IuaXNDYW5jZWxlZCgpOwotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoY2FuY2VsZWQpIHsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlJbmZvKFBVQkxJU0hfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCVBVQkxJU0hfQ09ORklHX0NBTkNFTF9NU0cpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKHB1Ymxpc2hlZF91cmwgPT0gbnVsbCB8fCByZXBvcnRfdXJsID09IG51bGwpIHsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSwKLQkJCQkJCQlQVUJMSVNIX0NPTkZJR19FUlJPUl9NU0csCi0JCQkJCQkJUFVCTElTSF9DT05GSUdfRVJST1JfUkVBU09OLCBydW5FeGNlcHRpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gTGF1bmNoIGEgSFRNTCBicm93c2VyIHRvIHZpZXcgdGhlIHB1Ymxpc2hlZCBzaXRlLgotCQkJCWlmIChvcGVuQnJvd3NlcihwdWJsaXNoZWRfdXJsKSA9PSBmYWxzZSkgewotCQkJCQlTdHJpbmcgcmVhc29uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBwdWJsaXNoZWRfdXJsIH0pOwotCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFBSRVZJRVdfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCVBSRVZJRVdfQ09ORklHX0VSUk9SX01TRywgcmVhc29uKTsKLQkJCQl9Ci0KLQkJCQkvLyBMYXVuY2ggYSBIVE1MIGJyb3dzZXIgdG8gdmlldyB0aGUgcmVwb3J0IG9uIHRoZSBwdWJsaXNoZWQKLQkJCQkvLyBzaXRlLgotCQkJCWlmIChvcGVuQnJvd3NlcihyZXBvcnRfdXJsKSA9PSBmYWxzZSkgewotCQkJCQlTdHJpbmcgcmVhc29uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyByZXBvcnRfdXJsIH0pOwotCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFZJRVdfUkVQT1JUX0VSUk9SX1RJVExFLAotCQkJCQkJCVZJRVdfUkVQT1JUX0VSUk9SX01TRywgcmVhc29uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIG9wZW4gYSBicm93c2VyIHRvIHNob3cgdGhlIHB1Ymxpc2hlZCBjb250ZW50LgotCSAqIEBwYXJhbSB1cmwgU3RyaW5nIHRoZSBzaXRlIHVybAotCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGJyb3dzZXIgb3BlbmVkIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBvcGVuQnJvd3NlcihmaW5hbCBTdHJpbmcgdXJsKSB7Ci0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQl0cnkgewotCQkJLy8gTGF1bmNoIHRoZSBkZWZhdWx0IEhUTUwgdmlld2VyIHRvIGRpc3BsYXkgdGhlIEhUTUwgcGFnZS4KLQkJCS8vIE9uIExpbnV4LCB0aGlzIGNhbid0IGxhdW5jaCB1cmxzLCBvbmx5IGxvY2FsIGZpbGVzIGNhbiBiZQotCQkJLy8gbGF1bmNoZWQuCi0JCQkvLyBTb3JyeSBJIGhhdmUgdXNlIGludGVybmFsIGNsYXNzIGhlcmUuCi0JCQkvLyBob3BlIEVjbGlwc2Uub3JnIGNhbiBoYXZlIGEgcHVibGljIGFwaSB0byBkbyBzby4KLQkJCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3MgPSBQcm9ncmFtLmxhdW5jaCh1cmwpOwotCQkJfSBlbHNlIHsKLS8vCQkJCUlCcm93c2VyIGJyb3dzZXIgPSBvcmcuZWNsaXBzZS5oZWxwLmludGVybmFsLmJyb3dzZXIuQnJvd3Nlck1hbmFnZXIKLS8vCQkJCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlQnJvd3Nlcih0cnVlKTsKLS8vCQkJCWlmIChicm93c2VyID09IG51bGwpIHsKLS8vCQkJCQl0cnkgewotLy8JCQkJCQlicm93c2VyLmRpc3BsYXlVUkwodXJsKTsKLS8vCQkJCQkJc3VjY2VzcyA9IHRydWU7Ci0vLwkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJCi0JCQkJLy8gMTU1NDkwIC0gQ2Fubm90IGRldGVjdGVkIGRlZmF1bHQgYnJvd3NlciB3aGVuIHByZXZpZXcgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gb24gTGludXgKLQkJCQkvLyBjaGFuZ2VkIHRvIHVzZSBzd3QgYnJvd3NlcgotCQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKQotCQkJCXsKLQkJCQkgICAgcHVibGljIHZvaWQgcnVuKCkKLQkJCQkJewotLy8JCQkJCQkJLy8gb3BlbiBhbm90aGVyIHN3dCBicm93c2VyIHNpbmNlIHdlIGhhdmUgbm8gKHNpbXBsZSkgd2F5IG9mIGNyZWF0aW5nIGEgc3lzdGVtIGRlZmF1bHQgYnJvd3NlcgotLy8JCQkJCQkJLy8gdGhlIEVjbGlwc2UgZ3V5cyBoaWRlIGFsbCB0aGUgZ29vZCBhcGlzIGFzIGludGVybmFsCi0JCQkJCQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJCQkJCQlzaGVsbC5zZXRUZXh0KHVybCk7Ci0JCQkJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQkJCQkJc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkJCQkJQnJvd3NlciBwb3B1cF9icm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJCQkJCQlwb3B1cF9icm93c2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USHxHcmlkRGF0YS5HUkFCX0hPUklaT05UQUx8R3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCQkJCQkJCXBvcHVwX2Jyb3dzZXIuc2V0VXJsKHVybCk7CQkJCQkJCQkJCQkJCQkKLQkJCQkJCQlzaGVsbC5vcGVuKCk7Ci0JCQkJCX0KLQkJCQl9KTsJCQkKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlzdWNjZXNzID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gc3VjY2VzczsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdENvbmZpZ1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0Q29uZmlnUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTRmMTJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0Q29uZmlnUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvCi0gKiBwdWJsaXNoLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdENvbmZpZ1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RDb25maWdQYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciBjb25maWdWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JcHJvdGVjdGVkIExpc3QgcHJvY2Vzc1ZpZXdzOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzZWxlY3RlZENvbmZpZ05hbWU7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLQkJCWltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gY29uZmlnLmdldE5hbWUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdENvbmZpZ1BhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3RDb25maWdXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ1dpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNvbmZpZ0xhYmVsX3RleHQpOwotCi0JCXRhYmxlID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAxMjA7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDI4MDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJY29uZmlnVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9URVhUKTsKLQotCQlicmllZkRlc2NUZXh0ID0gY3JlYXRlVGV4dE11bHRpKGNvbXBvc2l0ZSwgIiIsIDM2MCwgODAsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JCVBsYXRmb3JtVUkKLQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJLnNldEhlbHAoCi0JCQkJCQljb21wb3NpdGUsCi0JCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5DT05GSUdVUkFUSU9OX1BVQkxJU0hfV0laQVJEX0FMTF9QQUdFU19DT05URVhUKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJY29uZmlnVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IENvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlNZXRob2RDb25maWd1cmF0aW9uW10gY29uZmlncyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRJbnB1dChjb25maWdzKTsKLQotCQkvLyBTZWxlY3QgdGhlIGZpcnN0IGNvbmZpZyBhbmQgZGlzcGxheSBpdHMgYnJpZWYgZGVzY3JpcHRpb24uCi0JCWlmIChjb25maWdzLmxlbmd0aCA+IDApIHsKLQkJCXRhYmxlLnNlbGVjdCgwKTsKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24oY29uZmlnc1swXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWNvbmZpZ1ZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCQlPYmplY3RbXSBjb25maWdzID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCQkJCQlzZXRCcmllZkRlc2NyaXB0aW9uKChNZXRob2RDb25maWd1cmF0aW9uKSBjb25maWdzWzBdKTsKLQkJCQkJCX0KLQkJCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJfQotCi0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpbnQgY291bnQgPSB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpOwotCi0JCWlmIChjb3VudCA+IDApIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlzZWxlY3RlZENvbmZpZ05hbWUgPSBpdGVtc1swXS5nZXRUZXh0KCk7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIHNlbGVjdGVkQ29uZmlnTmFtZSk7Ci0JCQlwcm9jZXNzVmlld3MgPSBudWxsOwotCQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQkJcHJvY2Vzc1ZpZXdzID0gZ2V0VmFsaWRDb25maWdWaWV3cyhjb25maWcpOwotCQkJfQotCi0JCQlpZiAocHJvY2Vzc1ZpZXdzICE9IG51bGwgJiYgcHJvY2Vzc1ZpZXdzLnNpemUoKSA+IDApIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJc2V0TWVzc2FnZShudWxsKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCXNldE1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLm1pc3NpbmdWaWV3RXJyb3JfbXNnLAotCQkJCQkJV2l6YXJkUGFnZS5XQVJOSU5HKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCUlXaXphcmRQYWdlIHBhZ2UgPSBnZXRXaXphcmQoKS5nZXROZXh0UGFnZSh0aGlzKTsKLQkJdHJ5IHsKLQkJCSgoQmFzZVdpemFyZFBhZ2UpIHBhZ2UpLm9uRW50ZXJQYWdlKGdldENvbmZpZ05hbWUoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIGxpc3Qgb2YgdmFsaWQgY29uZmlndXJhdGlvbiB2aWV3cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbiB2aWV3cwotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFZhbGlkQ29uZmlnVmlld3MoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJU3RyaW5nIG1zZzsKLQkJU3RyaW5nQnVmZmVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUxpc3Q8Q29udGVudENhdGVnb3J5PiB2aWV3cyA9IG5ldyBBcnJheUxpc3Q8Q29udGVudENhdGVnb3J5PigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSB2aWV3ID0gKENvbnRlbnRDYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250cmlidXRvcih2aWV3KSkgewotCQkJCW1zZyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRWaWV3Q29udHJpYnV0b3JJbmZvX21zZywKLQkJCQkJCXZpZXcuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCQltZXNzYWdlLmFwcGVuZChTdHJVdGlsLlRBQikuYXBwZW5kKG1zZykuYXBwZW5kKAotCQkJCQkJU3RyVXRpbC5MSU5FX0ZFRUQpOwotCQkJfSBlbHNlIHsKLQkJCQl2aWV3ID0gKENvbnRlbnRDYXRlZ29yeSkgQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJLmdldENhbGN1bGF0ZWRFbGVtZW50KHZpZXcsIGNvbmZpZyk7Ci0JCQkJaWYgKHZpZXcgPT0gbnVsbCkgewotCQkJCQltc2cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFZpZXdJbnZhbGlkSW5mb19tc2csCi0JCQkJCQkJdmlldy5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkJCQltZXNzYWdlLmFwcGVuZChTdHJVdGlsLlRBQikuYXBwZW5kKG1zZykuYXBwZW5kKAotCQkJCQkJCVN0clV0aWwuTElORV9GRUVEKTsKLQotCQkJCX0gZWxzZSBpZiAodmlld3MuY29udGFpbnModmlldykpIHsKLQkJCQkJbXNnID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRWaWV3U2FtZVZpZXdJbmZvX21zZywKLQkJCQkJCQl2aWV3LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJCW1lc3NhZ2UuYXBwZW5kKFN0clV0aWwuVEFCKS5hcHBlbmQobXNnKS5hcHBlbmQoCi0JCQkJCQkJU3RyVXRpbC5MSU5FX0ZFRUQpOwotCi0JCQkJfSBlbHNlIHsKLQkJCQkJdmlld3MuYWRkKHZpZXcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChtZXNzYWdlLmxlbmd0aCgpID4gMCkgewotCQkJbXNnID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkVmlld3NJbmZvX21zZywgY29uZmlnCi0JCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQltZXNzYWdlLmluc2VydCgwLCBtc2cgKyBTdHJVdGlsLkxJTkVfRkVFRCArIFN0clV0aWwuTElORV9GRUVEKTsKLQotCQkJLy8gRklYTUUhIFNob3VsZCBub3QgZGlzcGxheSB3YXJuaW5nIG1lc3NhZ2VzIGluIHRoZSBicmllZgotCQkJLy8gZGVzY3JpcHRpb24gZmllbGQuCi0JCQlicmllZkRlc2NUZXh0LnNldFRleHQobWVzc2FnZS50b1N0cmluZygpKTsKLQkJfQotCi0JCXJldHVybiB2aWV3czsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHVzZXIgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnTmFtZSgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkQ29uZmlnTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIEJyaWVmIERlc2NyaXB0aW9uIHRleHQgY29udHJvbCB3aXRoIHRoZSBnaXZlbgotCSAqIGNvbmZpZ3VyYXRpb24ncyBicmllZiBkZXNjcmlwb3Rpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEJyaWVmRGVzY3JpcHRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJYnJpZWZEZXNjVGV4dC5zZXRUZXh0KGNvbmZpZy5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RDb250ZW50UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RDb250ZW50UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDUyNmE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0Q29udGVudFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzLlByb2Nlc3NUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzLlByb2Nlc3NUcmVlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBwdWJsaXNoIHRoZSBlbnRpcmUgbWV0aG9kCi0gKiBjb25maWd1cmF0aW9uIG9yIG9ubHkgc3BlY2lmaWMgcHJvY2Vzc2VzIGluIHRoZSBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdENvbnRlbnRQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RDb250ZW50UGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uOwotCi0JcHJvdGVjdGVkIENoZWNrYm94VHJlZVZpZXdlciBwcm9jZXNzVmlld2VyOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94OwotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJvdGVjdGVkIGNsYXNzIFByb2Nlc3NWaWV3ZXJDb250ZW50UHJvdmlkZXIgZXh0ZW5kcwotCQkJUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXIgewotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBwYXJlbnRFbGVtZW50OwotCQkJCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQkJCUxpc3QgcHJvY2Vzc2VzID0gVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJCQkJaWYgKHByb2Nlc3Nlcy5zaXplKCkgPiAwKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQocGx1Z2luKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCi0JCQl9IGVsc2UgewotCQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdENvbnRlbnRQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0Q29udGVudFdpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0Q29udGVudFdpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCXB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uX3RleHQsIDEsIHRydWUpOwotCi0JCXB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uX3RleHQsIDEsCi0JCQkJZmFsc2UpOwotCi0JCUNvbXBvc2l0ZSBwcm9jZXNzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcHJvY2Vzc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQl8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDEzOwotCQlwcm9jZXNzQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCXByb2Nlc3NWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKHByb2Nlc3NDb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCXByb2Nlc3NWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWluY2x1ZGVCYXNlUHJvY2Vzc2VzQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChwcm9jZXNzQ29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94TGFiZWxfdGV4dCk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlwcm9jZXNzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUHJvY2Vzc1ZpZXdlckNvbnRlbnRQcm92aWRlcigpKTsKLQkJcHJvY2Vzc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBQcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0KLQkJU3RyaW5nIGNvbmZpZ0lkID0gY29uZmlnICE9IG51bGwgPyBjb25maWcuZ2V0R3VpZCgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBwdWJsaXNoQ29uZmlnID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0UHVibGlzaEVudGlyZUNvbmZpZyhjb25maWdJZCk7Ci0JCXB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24ocHVibGlzaENvbmZpZyk7Ci0JCXB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oIXB1Ymxpc2hDb25maWcpOwotCQlwcm9jZXNzVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKCFwdWJsaXNoQ29uZmlnKTsKLQotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgaGFuZGxlcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJcHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlwdWJsaXNoUHJvY2Vzc2VzUmFkaW9CdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCWluY2x1ZGVCYXNlUHJvY2Vzc2VzQ2hlY2tib3guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0KLQkJcHJvY2Vzc1ZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0IGNoZWNrZWRFbGVtZW50ID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCQkJCWJvb2xlYW4gY2hlY2tlZCA9IGV2ZW50LmdldENoZWNrZWQoKTsKLQotCQkJCXByb2Nlc3NWaWV3ZXIuc2V0Q2hlY2tlZChjaGVja2VkRWxlbWVudCwgY2hlY2tlZCk7Ci0JCQkJcHJvY2Vzc1ZpZXdlci5zZXRTdWJ0cmVlQ2hlY2tlZChjaGVja2VkRWxlbWVudCwgY2hlY2tlZCk7Ci0JCQkJaWYgKGluY2x1ZGVCYXNlUHJvY2Vzc2VzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJc2VsZWN0QmFzZVByb2Nlc3NlcygpOwotCQkJCX0KLQkJCQl1cGRhdGVDaGVja2VkU3RhdGVzKCk7Ci0KLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGNoZWNrIHN0YXRlcyBvZiBwcm9jZXNzIHRyZWUgdmlld2VyLgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVDaGVja2VkU3RhdGVzKCkgewotCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjcCA9IChJVHJlZUNvbnRlbnRQcm92aWRlcikgcHJvY2Vzc1ZpZXdlcgotCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBwbHVnaW5zID0gY3AuZ2V0Q2hpbGRyZW4oY29uZmlnKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykgewotCQkJCU9iamVjdFtdIHVpRm9sZGVycyA9IGNwLmdldENoaWxkcmVuKHBsdWdpbnNbaV0pOwotCQkJCWludCB0b3RhbFVJRm9sZGVycyA9IHVpRm9sZGVycy5sZW5ndGg7Ci0JCQkJaW50IGNoZWNrZWRVSUZvbGRlcnMgPSAwOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdWlGb2xkZXJzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCU9iamVjdFtdIHByb2Nlc3NlcyA9IGNwLmdldENoaWxkcmVuKHVpRm9sZGVyc1tqXSk7Ci0JCQkJCWludCB0b3RhbFByb2Nlc3NlcyA9IHByb2Nlc3Nlcy5sZW5ndGg7Ci0JCQkJCWludCBjaGVja2VkUHJvY2Vzc2VzID0gMDsKLQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBwcm9jZXNzZXMubGVuZ3RoOyBrKyspIHsKLQkJCQkJCWlmIChwcm9jZXNzVmlld2VyLmdldENoZWNrZWQocHJvY2Vzc2VzW2tdKSkgewotCQkJCQkJCWNoZWNrZWRQcm9jZXNzZXMrKzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoY2hlY2tlZFByb2Nlc3NlcyA9PSAwKSB7Ci0JCQkJCQlwcm9jZXNzVmlld2VyLnNldEdyYXlDaGVja2VkKHVpRm9sZGVyc1tqXSwgZmFsc2UpOwotCQkJCQl9IGVsc2UgaWYgKGNoZWNrZWRQcm9jZXNzZXMgPT0gdG90YWxQcm9jZXNzZXMpIHsKLQkJCQkJCXByb2Nlc3NWaWV3ZXIuc2V0R3JheWVkKHVpRm9sZGVyc1tqXSwgZmFsc2UpOwotCQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRDaGVja2VkKHVpRm9sZGVyc1tqXSwgdHJ1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcm9jZXNzVmlld2VyLnNldEdyYXlDaGVja2VkKHVpRm9sZGVyc1tqXSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHByb2Nlc3NWaWV3ZXIuZ2V0Q2hlY2tlZCh1aUZvbGRlcnNbal0pKSB7Ci0JCQkJCQljaGVja2VkVUlGb2xkZXJzKys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGNoZWNrZWRVSUZvbGRlcnMgPT0gdG90YWxVSUZvbGRlcnMpIHsKLQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRHcmF5ZWQocGx1Z2luc1tpXSwgZmFsc2UpOwotCQkJCQlwcm9jZXNzVmlld2VyLnNldENoZWNrZWQocGx1Z2luc1tpXSwgdHJ1ZSk7Ci0JCQkJfSBlbHNlIGlmIChjaGVja2VkVUlGb2xkZXJzID09IDApIHsKLQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRHcmF5Q2hlY2tlZChwbHVnaW5zW2ldLCBmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRHcmF5Q2hlY2tlZChwbHVnaW5zW2ldLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3RzIHRoZSByZWZlcmVuY2VkIGJhc2UgcHJvY2Vzc2VzIGluIHRoZSBwcm9jZXNzIHRyZWUgdmlld2VyLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZWxlY3RCYXNlUHJvY2Vzc2VzKCkgewotCQkvLyBHZXQgdGhlIHJlZmVyZW5jZWQgYmFzZSBwcm9jZXNzZXMuCi0JCUxpc3Q8UHJvY2Vzcz4gcHJvY2Vzc2VzID0gZ2V0U2VsZWN0ZWRQcm9jZXNzZXMoKTsKLQkJTGlzdDxQcm9jZXNzPiBiYXNlUHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzPigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvY2Vzc2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0QmFzZVByb2Nlc3NlcygoQWN0aXZpdHkpIGl0Lm5leHQoKSwgY29uZmlnLAotCQkJCQliYXNlUHJvY2Vzc2VzKTsKLQkJfQotCi0JCS8vIFVwZGF0ZSB0aGUgcHJvY2VzcyB0cmVlIHZpZXdlci4KLQkJZm9yIChJdGVyYXRvciBpdCA9IGJhc2VQcm9jZXNzZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQlwcm9jZXNzVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXByb2Nlc3NWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoCi0JCQkJcHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotCQlpZiAoZXZlbnQud2lkZ2V0ID09IGluY2x1ZGVCYXNlUHJvY2Vzc2VzQ2hlY2tib3gpIHsKLQkJCS8vIElmIHNlbGVjdGVkLCBzZWxlY3QgYWxsIHJlZmVyZW5jZWQgYmFzZSBwcm9jZXNzZXMuCi0JCQlzZWxlY3RCYXNlUHJvY2Vzc2VzKCk7Ci0JCQl1cGRhdGVDaGVja2VkU3RhdGVzKCk7Ci0JCX0KLQotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCVN0cmluZyBjb25maWdOYW1lID0gKFN0cmluZykgb2JqOwotCQkJY29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgY29uZmlnTmFtZSk7Ci0JCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQlwcm9jZXNzVmlld2VyLnNldElucHV0KGNvbmZpZyk7Ci0JCQkJcHJvY2Vzc1ZpZXdlci5leHBhbmRBbGwoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBnZXRTZWxlY3RlZFByb2Nlc3NlcygpLnNpemUoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlJV2l6YXJkUGFnZSBwYWdlID0gZ2V0V2l6YXJkKCkuZ2V0TmV4dFBhZ2UodGhpcyk7Ci0JCXRyeSB7Ci0JCQkoKEJhc2VXaXphcmRQYWdlKSBwYWdlKS5vbkVudGVyUGFnZShjb25maWcpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBwYWdlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHNlbGVjdGVkIHByb2Nlc3NlcyB0byBiZSBwdWJsaXNoZWQuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgPGNvZGU+UHJvY2VzczwvY29kZT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRQdWJsaXNoQ29uZmlnU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSB1c2VyIHNlbGVjdGVkIHByb2Nlc3NlcyB0byBiZSBwdWJsaXNoZWQuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgPGNvZGU+UHJvY2VzczwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTGlzdDxQcm9jZXNzPiBnZXRTZWxlY3RlZFByb2Nlc3NlcygpIHsKLQkJTGlzdDxQcm9jZXNzPiBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3M+KCk7Ci0KLQkJT2JqZWN0W10gc2VsZWN0ZWQgPSBwcm9jZXNzVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQlpZiAoc2VsZWN0ZWQgIT0gbnVsbCAmJiBzZWxlY3RlZC5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHNlbGVjdGVkW2ldIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQlwcm9jZXNzZXMuYWRkKChQcm9jZXNzKSBzZWxlY3RlZFtpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0RGVzdGluYXRpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdERlc3RpbmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1M2YyZjMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0RGVzdGluYXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGFuZAotICogZm9ybWF0IGZvciB0aGUgcHVibGlzaGVkIHdlYiBzaXRlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdERlc3RpbmF0aW9uUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdERlc3RpbmF0aW9uUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBTaGVsbCBzaGVsbDsKLQotCXByb3RlY3RlZCBDb21ibyBkaXJDb21ibzsKLQotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBzdGF0aWNXZWJTaXRlUmFkaW9CdXR0b247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHN0YXRpY1dlYlNpdGVDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGphdmFXZWJBcHBSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgamF2YVdlYkFwcENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBMYWJlbCB3ZWJBcHBOYW1lTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gd2ViQXBwTmFtZUNvbWJvOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBpbmNsdWRlU2VhcmNoQ2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcm90ZWN0ZWQgTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBzZWxlY3RlZENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3REZXN0aW5hdGlvblBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3REZXN0aW5hdGlvbldpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0RGVzdGluYXRpb25XaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL1B1Ymxpc2hDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDEpOwotCi0JCUNvbXBvc2l0ZSBkaXJDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlkaXJDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWRpckNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotCQljcmVhdGVMYWJlbChkaXJDb21wb3NpdGUsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy5kaXJMYWJlbF90ZXh0KTsKLQotCQlkaXJDb21ibyA9IGNyZWF0ZUNvbWJvYm94KGRpckNvbXBvc2l0ZSk7Ci0KLQkJYnJvd3NlQnV0dG9uID0gY3JlYXRlQnV0dG9uKGRpckNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQlJPV1NFX0JVVFRPTl9URVhUKTsKLQotCQlHcm91cCB3ZWJBcHBHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJd2ViQXBwR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCXdlYkFwcEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl3ZWJBcHBHcm91cC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVJlc291cmNlcy53ZWJBcHBHcm91cF90ZXh0KTsKLQotCQlzdGF0aWNXZWJTaXRlUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbih3ZWJBcHBHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc3RhdGljV2ViU2l0ZVJhZGlvQnV0dG9uX3RleHQpOwotCi0JCXN0YXRpY1dlYlNpdGVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHdlYkFwcEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXN0YXRpY1dlYlNpdGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXN0YXRpY1dlYlNpdGVDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCSgoR3JpZExheW91dCkgc3RhdGljV2ViU2l0ZUNvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubWFyZ2luVG9wID0gLTM7Ci0JCSgoR3JpZExheW91dCkgc3RhdGljV2ViU2l0ZUNvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDEzOwotCi0JCWphdmFXZWJBcHBSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKHdlYkFwcEdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5keW5hbWljV2ViQXBwUmFkaW9CdXR0b25fdGV4dCk7Ci0KLQkJamF2YVdlYkFwcENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUod2ViQXBwR3JvdXAsIFNXVC5OT05FKTsKLQkJamF2YVdlYkFwcENvbXBvc2l0ZQotCQkJCS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJamF2YVdlYkFwcENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJKChHcmlkTGF5b3V0KSBqYXZhV2ViQXBwQ29tcG9zaXRlLmdldExheW91dCgpKS5tYXJnaW5Ub3AgPSAtMzsKLQkJKChHcmlkTGF5b3V0KSBqYXZhV2ViQXBwQ29tcG9zaXRlLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMTM7Ci0KLQkJaW5jbHVkZVNlYXJjaENoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goamF2YVdlYkFwcENvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW5jbHVkZVNlYXJjaENoZWNrYm94X3RleHQsIDMpOwotCi0JCXdlYkFwcE5hbWVMYWJlbCA9IGNyZWF0ZUxhYmVsKGphdmFXZWJBcHBDb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLndlYkFwcGxpY2F0aW9uTmFtZUxhYmVsX3RleHQpOwotCi0JCXdlYkFwcE5hbWVDb21ibyA9IGNyZWF0ZUNvbWJvYm94KGphdmFXZWJBcHBDb21wb3NpdGUsIDIpOwotCQl3ZWJBcHBOYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkRXZlbnRIYW5kbGVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJU3RyaW5nIGNvbmZpZ0lkID0gY29uZmlnICE9IG51bGwgPyBjb25maWcuZ2V0R3VpZCgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgZGlyID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0UHVibGlzaFBhdGgoY29uZmlnSWQpOwotCQlpZiAoZGlyICE9IG51bGwgJiYgZGlyLmxlbmd0aCgpID4gMCkgewotCQkJZGlyQ29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1tdIHsgZGlyIH0pOwotCQkJZGlyQ29tYm8uc2V0VGV4dChkaXIpOwotCQl9Ci0KLQkJYm9vbGVhbiBwdWJsaXNoU3RhdGljV2ViU2l0ZSA9IFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldFB1Ymxpc2hTdGF0aWNXZWJTaXRlKGNvbmZpZ0lkKTsKLQkJc3RhdGljV2ViU2l0ZVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihwdWJsaXNoU3RhdGljV2ViU2l0ZSk7Ci0JCWphdmFXZWJBcHBSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oIXB1Ymxpc2hTdGF0aWNXZWJTaXRlKTsKLQotCQlpbmNsdWRlU2VhcmNoQ2hlY2tib3guc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldEluY2x1ZGVTZWFyY2goY29uZmlnSWQpKTsKLQotCQlTdHJpbmcgd2ViQXBwTmFtZSA9IFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldFdlYkFwcE5hbWUoY29uZmlnSWQpOwotCQlpZiAod2ViQXBwTmFtZSAhPSBudWxsICYmIHdlYkFwcE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQl3ZWJBcHBOYW1lQ29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1tdIHsgd2ViQXBwTmFtZSB9KTsKLQkJCXdlYkFwcE5hbWVDb21iby5zZXRUZXh0KHdlYkFwcE5hbWUpOwotCQl9Ci0KLQkJdXBkYXRlQ29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFdmVudEhhbmRsZXJzKCkgewotCQlkaXJDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsCi0JCQkJCQkJU1dULk5PTkUpOwotCQkJCQlTdHJpbmcgc2VsZWN0ZWREaXIgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoc2VsZWN0ZWREaXIgIT0gbnVsbCkgewotCQkJCQkJZGlyQ29tYm8uYWRkKHNlbGVjdGVkRGlyLCAwKTsKLQkJCQkJCWRpckNvbWJvLnNldFRleHQoc2VsZWN0ZWREaXIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJamF2YVdlYkFwcFJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlib29sZWFuIHB1Ymxpc2hTdGF0aWNXZWJTaXRlID0gZ2V0U3RhdGljV2ViU2l0ZVNlbGVjdGlvbigpOwotCQl3ZWJBcHBOYW1lTGFiZWwuc2V0RW5hYmxlZCghcHVibGlzaFN0YXRpY1dlYlNpdGUpOwotCQl3ZWJBcHBOYW1lQ29tYm8uc2V0RW5hYmxlZCghcHVibGlzaFN0YXRpY1dlYlNpdGUpOwotCQlpbmNsdWRlU2VhcmNoQ2hlY2tib3guc2V0RW5hYmxlZCghcHVibGlzaFN0YXRpY1dlYlNpdGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBvYmo7Ci0JCQlpZiAoIXNlbGVjdGVkQ29uZmlncy5jb250YWlucyhjb25maWcpKSB7Ci0JCQkJc2VsZWN0ZWRDb25maWdzLmFkZChjb25maWcpOwotCQkJCWluaXRDb250cm9scygpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiBnZXRQdWJsaXNoRGlyZWN0b3J5KCkubGVuZ3RoKCkgPiAwOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBwdWJsaXNoIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hEaXJlY3RvcnkoKSB7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUoZGlyQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCXJldHVybiBkaXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgc3RhdGljIHdlYiBzaXRlIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRTdGF0aWNXZWJTaXRlU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc3RhdGljV2ViU2l0ZVJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGluY2x1ZGUgc2VhcmNoIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRJbmNsdWRlU2VhcmNoU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gaW5jbHVkZVNlYXJjaENoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdlYiBhcGxpY2F0aW9uIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXZWJBcHBOYW1lKCkgewotCQlyZXR1cm4gd2ViQXBwTmFtZUNvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIHVzZXIgc2VsZWN0aW9ucyBpbiB0aGlzIHdpemFyZCBwYWdlIHRvIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCVN0cmluZyBjb25maWdJZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRQdWJsaXNoUGF0aChjb25maWdJZCwKLQkJCQkJZ2V0UHVibGlzaERpcmVjdG9yeSgpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFB1Ymxpc2hTdGF0aWNXZWJTaXRlKGNvbmZpZ0lkLAotCQkJCQlnZXRTdGF0aWNXZWJTaXRlU2VsZWN0aW9uKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0SW5jbHVkZVNlYXJjaChjb25maWdJZCwKLQkJCQkJZ2V0SW5jbHVkZVNlYXJjaFNlbGVjdGlvbigpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFdlYkFwcE5hbWUoY29uZmlnSWQsIGdldFdlYkFwcE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDYzYTFlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMgZm9yIHRoZQotICogZ2VuZXJhdGVkIHdlYiBzaXRlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBUZXh0IHRpdGxlVGV4dDsKLQotCXByb3RlY3RlZCBUZXh0IGJhbm5lckltYWdlVGV4dDsKLQotCXByb3RlY3RlZCBUZXh0IGFib3V0SFRNTFRleHQ7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBmZWVkYmFja1VSTFRleHQ7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHNlbGVjdEltYWdlQnV0dG9uOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBzZWxlY3RIVE1MQnV0dG9uOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaXNoR2xvc3NhcnlDaGVja2JveDsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaEluZGV4Q2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNoZWNrRXh0ZXJuYWxMaW5rc0NoZWNrYm94OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjb252ZXJ0QnJva2VuTGlua3NDaGVja2JveDsKLQotCXByb3RlY3RlZCBCdXR0b24gYXV0b0dlbmVyYXRlQUREQ2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hCYXNlQURDaGVja2JveDsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaExpZ2h0V2VpZ2h0VHJlZUNoZWNrYm94OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBleHRyYURlc2NyaXB0b3JJbmZvQ3RyOwotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQotCXByb3RlY3RlZCBMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IHNlbGVjdGVkQ29uZmlncyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4oKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgd2l6YXJkIHBhZ2UKLQkgKi8KLQlwdWJsaWMgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQlzZXRUaXRsZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0UHVibGlzaGluZ09wdGlvbnNXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9QdWJsaXNoQ29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQkKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UoKSB7Ci0JCXRoaXMoUEFHRV9OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJY3JlYXRlVGl0bGVBbmRMaW5rc0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUdsb3NzYXJ5QW5kSW5kZXhHcm91cChjb21wb3NpdGUpOwkJCi0JCWNyZWF0ZUxvb2tBbmRGZWVsR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlVmFsaWRhdGlvbihjb21wb3NpdGUpOwotCQljcmVhdGVEaWFncmFtR2VuZXJhdGlvbkdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUxheW91dEdyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKGNvbXBvc2l0ZSk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JCVBsYXRmb3JtVUkKLQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJLnNldEhlbHAoCi0JCQkJCQljb21wb3NpdGUsCi0JCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5DT05GSUdVUkFUSU9OX1BVQkxJU0hfV0laQVJEX0FMTF9QQUdFU19DT05URVhUKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGl0bGUgYW5kIGxpbmtzIGdyb3VwLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgZ3JvdXAgY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIEdyb3VwIGNyZWF0ZVRpdGxlQW5kTGlua3NHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIHRpdGxlQW5kTGlua3NHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJdGl0bGVBbmRMaW5rc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQl0aXRsZUFuZExpbmtzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRpdGxlQW5kTGlua3NHcm91cC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVJlc291cmNlcy50aXRsZUFuZExpbmtzR3JvdXBfdGV4dCk7Ci0JCQotCQljcmVhdGVMYWJlbCh0aXRsZUFuZExpbmtzR3JvdXAsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy50aXRsZUxhYmVsX3RleHQpOwotCQl0aXRsZVRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQodGl0bGVBbmRMaW5rc0dyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbCh0aXRsZUFuZExpbmtzR3JvdXAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJY3JlYXRlTGFiZWwodGl0bGVBbmRMaW5rc0dyb3VwLCBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYWJvdXRIVE1MTGFiZWxfdGV4dCk7Ci0JCWFib3V0SFRNTFRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQodGl0bGVBbmRMaW5rc0dyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlzZWxlY3RIVE1MQnV0dG9uID0gbmV3IEJ1dHRvbih0aXRsZUFuZExpbmtzR3JvdXAsIFNXVC5OT05FKTsKLQkJc2VsZWN0SFRNTEJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQpOwotCi0JCWNyZWF0ZUxhYmVsKHRpdGxlQW5kTGlua3NHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZmVlZGJhY2tVUkxMYWJlbF90ZXh0KTsKLQkJZmVlZGJhY2tVUkxUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KHRpdGxlQW5kTGlua3NHcm91cCwgIiIsIDM2MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlTGFiZWwodGl0bGVBbmRMaW5rc0dyb3VwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXJldHVybiB0aXRsZUFuZExpbmtzR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgTG9vayBhbmQgZmVlbCBncm91cC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIGdyb3VwIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCBHcm91cCBjcmVhdGVMb29rQW5kRmVlbEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbG9va0FuZEZlZWxHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJbG9va0FuZEZlZWxHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJbG9va0FuZEZlZWxHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbG9va0FuZEZlZWxHcm91cC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVJlc291cmNlcy5sb29rQW5kRmVlbEdyb3VwX3RleHQpOwotCi0JCWNyZWF0ZUxhYmVsKGxvb2tBbmRGZWVsR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJhbm5lckltYWdlTGFiZWxfdGV4dCk7Ci0JCWJhbm5lckltYWdlVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChsb29rQW5kRmVlbEdyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlzZWxlY3RJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24obG9va0FuZEZlZWxHcm91cCwgU1dULk5PTkUpOwotCQlzZWxlY3RJbWFnZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQpOwotCQkKLQkJcmV0dXJuIGxvb2tBbmRGZWVsR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgR2xvc2FyeSBhbmQgaW5kZXggZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlR2xvc3NhcnlBbmRJbmRleEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgZ2xvc3NhcnlBbmRJbmRleEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQlnbG9zc2FyeUFuZEluZGV4R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJZ2xvc3NhcnlBbmRJbmRleEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlnbG9zc2FyeUFuZEluZGV4R3JvdXAKLQkJCQkuc2V0VGV4dChQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZ2xvc3NhcnlBbmRJbmRleEdyb3VwX3RleHQpOwotCi0JCXB1Ymxpc2hHbG9zc2FyeUNoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goZ2xvc3NhcnlBbmRJbmRleEdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoR2xvc3NhcnlMYWJlbF90ZXh0KTsKLQkJcHVibGlzaEluZGV4Q2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChnbG9zc2FyeUFuZEluZGV4R3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hJbmRleExhYmVsX3RleHQpOwotCi0JCXJldHVybiBnbG9zc2FyeUFuZEluZGV4R3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVmFsaWRhdGlvbiBncm91cC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIGdyb3VwIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCBHcm91cCBjcmVhdGVWYWxpZGF0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgdmFsaWRhdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQl2YWxpZGF0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJdmFsaWRhdGlvbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl2YWxpZGF0aW9uR3JvdXAuc2V0VGV4dChQdWJsaXNoaW5nVUlSZXNvdXJjZXMudmFsaWRhdGlvbkdyb3VwX3RleHQpOwotCi0JCWNoZWNrRXh0ZXJuYWxMaW5rc0NoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3godmFsaWRhdGlvbkdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jaGVja0V4dGVybmFsTGlua3NMYWJlbF90ZXh0KTsKLQotCQljb252ZXJ0QnJva2VuTGlua3NDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KHZhbGlkYXRpb25Hcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY29udmVydEJyb2tlbkxpbmtzTGFiZWxfdGV4dCk7Ci0KLQkJcmV0dXJuIHZhbGlkYXRpb25Hcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBEaWFncmFtIEdlbmVyYXRpb24gZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlRGlhZ3JhbUdlbmVyYXRpb25Hcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGRpYWdyYW1Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJZGlhZ3JhbUdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlkaWFncmFtR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWRpYWdyYW1Hcm91cC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVJlc291cmNlcy5kaWFncmFtR3JvdXBfdGV4dCk7Ci0KLQkJYXV0b0dlbmVyYXRlQUREQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChkaWFncmFtR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hBY3Rpdml0eURldGFpbERpYWdyYW1zTGFiZWxfdGV4dCk7Ci0KLQkJcHVibGlzaEJhc2VBRENoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goZGlhZ3JhbUdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW1zTGFiZWxfdGV4dCk7Ci0KLQkJcmV0dXJuIGRpYWdyYW1Hcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBMYXlvdXQgZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlTGF5b3V0R3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBsYXlvdXRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJbGF5b3V0R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlsYXlvdXRHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbGF5b3V0R3JvdXAuc2V0VGV4dChQdWJsaXNoaW5nVUlSZXNvdXJjZXMubGF5b3V0R3JvdXBfdGV4dCk7Ci0KLQkJcHVibGlzaExpZ2h0V2VpZ2h0VHJlZUNoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3gobGF5b3V0R3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hMaWdodFdlaWdodFRyZWVMYWJlbF90ZXh0KTsKLQotCQlleHRyYURlc2NyaXB0b3JJbmZvQ3RyID0gY3JlYXRlQ2hlY2tib3gobGF5b3V0R3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hFeHRyYURlc2NyaXB0b3JJbmZvTGFiZWxfdGV4dCk7Ci0KLQkJcmV0dXJuIGxheW91dEdyb3VwOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGUgYSBtZWFucyB0byBhZGQgYWRkaXRpb25hbCBvcHRpb25zIHRvIHRoZSBwdWJsaXNoZWQgd2ViIHNpdGUKLQkgKiBncm91cC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluY2x1ZGVBZGRpdGlvbmFsUHVibGlzaGluZ09wdGlvbnMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucyBncm91cHMgdG8gdGhpcyB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVB1Ymxpc2hpbmdPcHRpb25zR3JvdXBzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJU3RyaW5nIGNvbmZpZ0lkID0gY29uZmlnICE9IG51bGwgPyBjb25maWcuZ2V0R3VpZCgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQl0aXRsZVRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRUaXRsZShjb25maWdJZCkpOwotCQliYW5uZXJJbWFnZVRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRCYW5uZXJJbWFnZShjb25maWdJZCkpOwotCQlhYm91dEhUTUxUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0QWJvdXRIVE1MKGNvbmZpZ0lkKSk7Ci0JCWZlZWRiYWNrVVJMVGV4dC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldEZlZWRiYWNrVVJMKGNvbmZpZ0lkKSk7Ci0JCXB1Ymxpc2hHbG9zc2FyeUNoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRJbmNsdWRlR2xvc3NhcnkoY29uZmlnSWQpKTsKLQkJcHVibGlzaEluZGV4Q2hlY2tib3guc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldEluY2x1ZGVJbmRleChjb25maWdJZCkpOwotCQljaGVja0V4dGVybmFsTGlua3NDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0Q2hlY2tFeHRlcm5hbExpbmtzKGNvbmZpZ0lkKSk7Ci0JCWNvbnZlcnRCcm9rZW5MaW5rc0NoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRDb252ZXJ0QnJva2VuTGlua3MoY29uZmlnSWQpKTsKLQkJYXV0b0dlbmVyYXRlQUREQ2hlY2tib3guc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKGNvbmZpZ0lkKSk7Ci0JCXB1Ymxpc2hCYXNlQURDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoY29uZmlnSWQpKTsKLQkJcHVibGlzaExpZ2h0V2VpZ2h0VHJlZUNoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRMaWdodFdlaWdodFRyZWUoY29uZmlnSWQpKTsKLQkJZXh0cmFEZXNjcmlwdG9ySW5mb0N0ci5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RXh0cmFEZXNjcmlwdG9ySW5mbyhjb25maWdJZCkpOwkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlpZiAob2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iajsKLQkJCWlmICghc2VsZWN0ZWRDb25maWdzLmNvbnRhaW5zKGNvbmZpZykpIHsKLQkJCQlzZWxlY3RlZENvbmZpZ3MuYWRkKGNvbmZpZyk7Ci0JCQkJaW5pdENvbnRyb2xzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlJV2l6YXJkUGFnZSBwYWdlID0gZ2V0V2l6YXJkKCkuZ2V0TmV4dFBhZ2UodGhpcyk7Ci0JCXRyeSB7Ci0JCQkoKEJhc2VXaXphcmRQYWdlKSBwYWdlKS5vbkVudGVyUGFnZShjb25maWcpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBwYWdlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVycyBmb3IgdGhlIGNvbnRyb2xzIG9uIHRoaXMgcGFnZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc2VsZWN0SW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCksCi0JCQkJCQkJU1dULk9QRU4pOwotCQkJCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10gewotCQkJCQkJCSIqLmdpZiIsICIqLmpwZyIsICIqLmJtcCIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVN0cmluZyBpbWFnZUZpbGUgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoaW1hZ2VGaWxlICE9IG51bGwpIHsKLQkJCQkJCWJhbm5lckltYWdlVGV4dC5zZXRUZXh0KGltYWdlRmlsZSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJc2VsZWN0SFRNTEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSwKLQkJCQkJCQlTV1QuT1BFTik7Ci0JCQkJCWRpYWxvZwotCQkJCQkJCS5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJCQkiKi5odG0iLCAiKi5odG1sIiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCVN0cmluZyBodG1sRmlsZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChodG1sRmlsZSAhPSBudWxsKSB7Ci0JCQkJCQlhYm91dEhUTUxUZXh0LnNldFRleHQoaHRtbEZpbGUpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI3NldFZpc2libGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmICh2aXNpYmxlKSB7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSB0aXRsZVRleHQuZ2V0RGlzcGxheSgpOwotCQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdGl0bGVUZXh0LnNldEZvY3VzKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc2VsZWN0ZWQgcHVibGlzaGluZyBvcHRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5QdWJsaXNoT3B0aW9uczwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIFB1Ymxpc2hPcHRpb25zIGdldFB1Ymxpc2hpbmdPcHRpb25zKCkgewotCQlQdWJsaXNoT3B0aW9ucyBvcHRpb25zID0gbmV3IFB1Ymxpc2hPcHRpb25zKCk7Ci0KLQkJb3B0aW9ucy5zZXRUaXRsZShnZXRXZWJTaXRlVGl0bGUoKSk7Ci0JCW9wdGlvbnMuc2V0QmFubmVySW1hZ2UoZ2V0QmFubmVySW1hZ2VQYXRoKCkpOwotCQlvcHRpb25zLnNldEFib3V0SFRNTChnZXRBYm91dEhUTUxQYXRoKCkpOwotCQlvcHRpb25zLnNldEZlZWRiYWNrVVJMKGdldEZlZWRiYWNrVVJMKCkpOwotCQlvcHRpb25zLnNldEdlbmVyYXRlR2xvc3NhcnkoZ2V0UHVibGlzaEdsb3NzYXJ5U2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldEdlbmVyYXRlSW5kZXgoZ2V0UHVibGlzaEluZGV4U2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldENoZWNrRXh0TGlua3MoZ2V0Q2hlY2tFeHRlcm5hbExpbmtzU2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldEF1dG9HZW5lcmF0ZUFjdGl2aXR5RGlhZ3JhbXMoZ2V0QXV0b0dlbmVyYXRlQUREU2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldFVub3BlbkV4dGVuZGVkQWN0aXZpdHlEaWFncmFtKGdldFB1Ymxpc2hCYXNlQURTZWxlY3Rpb24oKSk7Ci0JCW9wdGlvbnMuc2V0Q29udmVydEJyb2tlbkxpbmtzKGdldENvbnZlcnRCcm9rZW5MaW5rc1NlbGVjdGlvbigpKTsKLQkJb3B0aW9ucwotCQkJCS5zZXRHZW5lcmF0ZUxpZ2h0V2VpZ2h0VHJlZShnZXRQdWJsaXNoTGlnaHRXZWlnaHRUcmVlU2VsZWN0aW9uKCkpOwotCQlvcHRpb25zCi0JCQkJLnNldFNob3dFeHRyYURlc2NyaXB0b3JJbmZvKGdldFNob3dFeHRyYURlc2NyaXB0b3JJbmZvU2VsZWN0aW9uKCkpOwotCi0JCXJldHVybiBvcHRpb25zOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHdlYiBzaXRlIHRpdGxlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0V2ViU2l0ZVRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgYmFubmVyIGltYWdlIHBhdGguCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRCYW5uZXJJbWFnZVBhdGgoKSB7Ci0JCXJldHVybiBiYW5uZXJJbWFnZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBhYm91dCBIVE1MIHBhdGguCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBYm91dEhUTUxQYXRoKCkgewotCQlyZXR1cm4gYWJvdXRIVE1MVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGZlZWRiYWNrIFVSTC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZlZWRiYWNrVVJMKCkgewotCQlyZXR1cm4gZmVlZGJhY2tVUkxUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgcHVibGlzaCBnbG9zc2FyeSBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0UHVibGlzaEdsb3NzYXJ5U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaEdsb3NzYXJ5Q2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgcHVibGlzaCBpbmRleCBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0UHVibGlzaEluZGV4U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaEluZGV4Q2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgY2hlY2sgZXh0ZXJuYWwgbGlua3Mgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldENoZWNrRXh0ZXJuYWxMaW5rc1NlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGNoZWNrRXh0ZXJuYWxMaW5rc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGNvbnZlcnQgYnJva2VuIGxpbmtzIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRDb252ZXJ0QnJva2VuTGlua3NTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBjb252ZXJ0QnJva2VuTGlua3NDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBhdXRvIGdlbmVyYXRlIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0QXV0b0dlbmVyYXRlQUREU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gYXV0b0dlbmVyYXRlQUREQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgcHVibGlzaCBhY3Rpdml0eSBkaWFncmFtIGZvciBiYXNlIGFjdGl2dGllcyB3aXRoCi0JICogdW5tb2RpZmllZCBleHRlbnNpb25zLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldFB1Ymxpc2hCYXNlQURTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoQmFzZUFEQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZ2VuZXJhdGUgbGlnaHQgd2VpZ2h0IHRyZWUgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldFB1Ymxpc2hMaWdodFdlaWdodFRyZWVTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoTGlnaHRXZWlnaHRUcmVlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgc2hvdyBleHRyYSBkZXNjcmlwdG9yIGluZm8gc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldFNob3dFeHRyYURlc2NyaXB0b3JJbmZvU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gZXh0cmFEZXNjcmlwdG9ySW5mb0N0ci5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgdXNlciBzZWxlY3Rpb25zIGluIHRoaXMgd2l6YXJkIHBhZ2UgdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNvbmZpZ0lkID0gY29uZmlnLmdldEd1aWQoKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFRpdGxlKGNvbmZpZ0lkLCBnZXRXZWJTaXRlVGl0bGUoKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRCYW5uZXJJbWFnZShjb25maWdJZCwKLQkJCQkJZ2V0QmFubmVySW1hZ2VQYXRoKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkJLnNldEFib3V0SFRNTChjb25maWdJZCwgZ2V0QWJvdXRIVE1MUGF0aCgpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJCS5zZXRGZWVkYmFja1VSTChjb25maWdJZCwgZ2V0RmVlZGJhY2tVUkwoKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRJbmNsdWRlR2xvc3NhcnkoY29uZmlnSWQsCi0JCQkJCWdldFB1Ymxpc2hHbG9zc2FyeVNlbGVjdGlvbigpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldEluY2x1ZGVJbmRleChjb25maWdJZCwKLQkJCQkJZ2V0UHVibGlzaEluZGV4U2VsZWN0aW9uKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0Q2hlY2tFeHRlcm5hbExpbmtzKGNvbmZpZ0lkLAotCQkJCQlnZXRDaGVja0V4dGVybmFsTGlua3NTZWxlY3Rpb24oKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRDb252ZXJ0QnJva2VuTGlua3MoY29uZmlnSWQsCi0JCQkJCWdldENvbnZlcnRCcm9rZW5MaW5rc1NlbGVjdGlvbigpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKGNvbmZpZ0lkLAotCQkJCQlnZXRBdXRvR2VuZXJhdGVBRERTZWxlY3Rpb24oKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigKLQkJCQkJY29uZmlnSWQsIGdldFB1Ymxpc2hCYXNlQURTZWxlY3Rpb24oKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRMaWdodFdlaWdodFRyZWUoY29uZmlnSWQsCi0JCQkJCWdldFB1Ymxpc2hMaWdodFdlaWdodFRyZWVTZWxlY3Rpb24oKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRFeHRyYURlc2NyaXB0b3JJbmZvKGNvbmZpZ0lkLAotCQkJCQlnZXRTaG93RXh0cmFEZXNjcmlwdG9ySW5mb1NlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvQWJzdHJhY3RQdWJsaXNoV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy93aXphcmRzL0Fic3RyYWN0UHVibGlzaFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OWE2YjY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvQWJzdHJhY3RQdWJsaXNoV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBYnN0cmFjdCBwdWJsaXNoaW5nIHdpemFyZCBjbGFzcy4gCi0gKiB1c2UgdGhlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnB1Ymxpc2hlcnMgZXh0ZW5zaW9uIHBvaW50IHRvIGV4dGVuZCB0aGlzIGNsYXNzIAotICogaWYgeW91IG5lZWQgdG8gY3VzdG9taXplIHRoZSBwdWJsaXNoaW5nIHVpLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHVibGlzaFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLy8gVGhlIHB1Ymxpc2hpbmcgb3B0aW9ucy4KLQlwcm90ZWN0ZWQgUHVibGlzaE9wdGlvbnMgZGF0YU1vZGVsID0gbnVsbDsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQdWJsaXNoV2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBmaW5pc2ggdGhlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpOwotCi0JLyoqCi0JICogaW5pdGlhbGl6ZSB0aGUgd2l6YXJkLgotCSAqIAotCSAqIEBwYXJhbSB3b3JrYmVuY2ggSVdvcmtiZW5jaAotCSAqIEBwYXJhbSBzZWxlY3Rpb24gSVN0cnVjdHVyZWRTZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pOwotCQotCS8qKgotCSAqIGdldCB0aGUgcHVibGlzaCBvcHRpb25zCi0JICogCi0JICogQHJldHVybiBQdWJsaXNoT3B0aW9ucwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBQdWJsaXNoT3B0aW9ucyBnZXRQdWJsaXNoT3B0aW9ucygpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvd2l6YXJkcy9QdWJsaXNoQ29uZmlnUHVibGlzaE9wdGlvbnNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy93aXphcmRzL1B1Ymxpc2hDb25maWdQdWJsaXNoT3B0aW9uc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Q2NGUxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy93aXphcmRzL1B1Ymxpc2hDb25maWdQdWJsaXNoT3B0aW9uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuUHVibGlzaGluZ1VJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhlIFNlbGVjdCBQdWJsaXNoaW5nIE9wdGlvbnMgcGFnZSBpbiB0aGUgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbgotICogd2l6YXJkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogVE9ETzogUmVuYW1lIHRoaXMgY2xhc3MgdG8gUHVibGlzaENvbmZpZ1NwZWNpZnlPcHRpb25zUGFnZSBmaXggZm9yCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczODE3Ci0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoQ29uZmlnUHVibGlzaE9wdGlvbnNQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBUZXh0IGRlc3RpbmF0aW9uUGF0aFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgdGl0bGVUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGJhbm5lckltYWdlVGV4dDsKLQotCXByaXZhdGUgVGV4dCBhYm91dEhUTUxUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGZlZWRiYWNrVVJMVGV4dDsKLQotCXByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGRlZmF1bHRQYXRoQ2hlY2tib3g7Ci0KLQlwcml2YXRlIEJ1dHRvbiBkZWZhdWx0RmVlZGJhY2tDaGVja2JveDsKLQotCXByaXZhdGUgQnV0dG9uIHNlbGVjdEltYWdlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gc2VsZWN0SFRNTEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGluY2x1ZGVHbG9zc2FyeTsKLQotCXByaXZhdGUgQnV0dG9uIGluY2x1ZGVJbmRleDsKLQotCXByaXZhdGUgQnV0dG9uIGNoZWNrRXh0ZXJuYWxMaW5rczsKLQotCXByaXZhdGUgQnV0dG9uIGNvbnZlcnRCcm9rZW5MaW5rczsKLQotCXByaXZhdGUgQnV0dG9uIGF1dG9HZW5lcmF0ZUFjdGl2aXR5RGlhZ3JhbXM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlzcGxheURlc3RpbmF0aW9uR3JvdXAgPSB0cnVlOwotCi0JcHJpdmF0ZSBCdXR0b24gZXh0cmFEZXNjcmlwdG9ySW5mb0N0cjsKLQotCXByaXZhdGUgQnV0dG9uIGxpZ2h0V2VpZ2h0VHJlZUN0cjsKLQotCS8vIGRvbid0IHdhbnQgdG8gZG8gdGhpcwotCS8vIHByaXZhdGUgQnV0dG9uIGluY2x1ZGVFbXB0eUNhdGVnb3JpZXNDdHI7Ci0KLQlwcm90ZWN0ZWQgUHVibGlzaE9wdGlvbnMgZGF0YU1vZGVsID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgY29uZmlnTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEJ1dHRvbiBwdWJsaXNoVW5PcGVuRXh0ZW5kQWN0aXZpdHlEaWFncmFtOwotCi0JLy8gcHJpdmF0ZSBCdXR0b24gY3JlYXRlV0FSQ2hlY2tCb3g7Ci0JLy8gcHJpdmF0ZSBUZXh0IHdlYkFwcE5hbWVUZXh0OwotCS8vIHByaXZhdGUgTGFiZWwgd2FyTGFiZWw7Ci0JLy8gcHJpdmF0ZSBCdXR0b24gaW5jbHVkZVNlYXJjaDsKLQkvLyBwcml2YXRlIENvbXBvc2l0ZSBzZWFyY2hDb21wb3NpdGU7Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gc2hvd1NlYXJjaENob2ljZSA9IHRydWU7Ci0JLy8gcHJpdmF0ZSBib29sZWFuIHNob3dBcHBsZXRDaG9pY2UgPSB0cnVlOwotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hDb25maWdQdWJsaXNoT3B0aW9uc1BhZ2UoU3RyaW5nIHBhZ2VOYW1lLAotCQkJYm9vbGVhbiBkaXNwbGF5RGVzdGluYXRpb25Hcm91cCwgUHVibGlzaE9wdGlvbnMgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1dpemFyZFBhZ2VfdGV4dCk7Ci0JCXRoaXMuZGlzcGxheURlc3RpbmF0aW9uR3JvdXAgPSBkaXNwbGF5RGVzdGluYXRpb25Hcm91cDsKLQkJdGhpcy5kYXRhTW9kZWwgPSBkYXRhTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaENvbmZpZ1B1Ymxpc2hPcHRpb25zUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0JCQlQdWJsaXNoT3B0aW9ucyBkYXRhTW9kZWwpIHsKLQkJdGhpcyhwYWdlTmFtZSwgdHJ1ZSwgZGF0YU1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gaWYgKFB1Ymxpc2hNYW5hZ2VyLmdldEFwcGxldFNlYXJjaFBhdGgoKT09bnVsbCkgc2hvd1NlYXJjaENob2ljZSA9Ci0JCS8vIGZhbHNlOwotCQkvLyBpZiAoUHVibGlzaE1hbmFnZXIuZ2V0QXBwbGV0UGF0aCgpPT1udWxsKSBzaG93QXBwbGV0Q2hvaWNlID0gZmFsc2U7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgd2lkZ2V0cy4KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotCQlQbGF0Zm9ybVVJCi0JCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCS5zZXRIZWxwKAotCQkJCQkJY29tcG9zaXRlLAotCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09ORklHVVJBVElPTl9QVUJMSVNIX1dJWkFSRF9BTExfUEFHRVNfQ09OVEVYVCk7Ci0KLQkJY3JlYXRlRGVzdGluYXRpb25Hcm91cFVJKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZVB1Ymxpc2hpbmdPcHRpb25zVUkoY29tcG9zaXRlKTsKLQkJY3JlYXRlUHVibGlzaGluZ01pc2NPcHRpb25zVUkoY29tcG9zaXRlKTsKLQkJaW5pdGlhbGl6ZUNvbnRyb2xzKCk7Ci0JCWFkZExpc3RlbmVycyhjb21wb3NpdGUpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXN0aW5hdGlvbkdyb3VwVUkoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpZiAoZGlzcGxheURlc3RpbmF0aW9uR3JvdXApIHsKLQkJCS8vIENyZWF0ZSB0aGUgRGVzdGluYXRpb24gUGF0aCBncm91cC4KLQkJCUdyb3VwIGRlc3RpbmF0aW9uR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCQlkZXN0aW5hdGlvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQkJZGVzdGluYXRpb25Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLQkJCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlkZXN0aW5hdGlvbkdyb3VwCi0JCQkJCS5zZXRUZXh0KFB1Ymxpc2hpbmdVSVJlc291cmNlcy5kZXN0aW5hdGlvbkRpcmVjdG9yeUdyb3VwX3RleHQpOwotCi0JCQljcmVhdGVMYWJlbChkZXN0aW5hdGlvbkdyb3VwLCBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucGF0aExhYmVsX3RleHQpOwotCQkJZGVzdGluYXRpb25QYXRoVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChkZXN0aW5hdGlvbkdyb3VwLAotCQkJCQkiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGRlc3RpbmF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5CUk9XU0VfQlVUVE9OX1RFWFQpOwotCQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQljcmVhdGVMYWJlbChkZXN0aW5hdGlvbkdyb3VwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWRlZmF1bHRQYXRoQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChkZXN0aW5hdGlvbkdyb3VwLAotCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMudXNlRGVmYXVsdFBhdGhDaGVja2JveF90ZXh0LCAyKTsKLQkJCWRlZmF1bHRQYXRoQ2hlY2tib3guc2V0U2VsZWN0aW9uKGRlc3RpbmF0aW9uUGF0aFRleHQuZ2V0VGV4dCgpCi0JCQkJCS5lcXVhbHMoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdFB1Ymxpc2hQYXRoKCkpKTsKLQkJCWRlc3RpbmF0aW9uUGF0aFRleHQuc2V0RW5hYmxlZCghZGVmYXVsdFBhdGhDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJCWlmICghZGVmYXVsdFBhdGhDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHVibGlzaGluZ09wdGlvbnNVSShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIENyZWF0ZSB0aGUgUHVibGlzaGVkIFdlYnNpdGUgZ3JvdXAuCi0JCUdyb3VwIHdlYlNpdGVHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJd2ViU2l0ZUdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQl3ZWJTaXRlR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXdlYlNpdGVHcm91cC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoV2ViU2l0ZUdyb3VwX3RleHQpOwotCi0JCWNyZWF0ZUxhYmVsKHdlYlNpdGVHcm91cCwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLnRpdGxlTGFiZWxfdGV4dCk7Ci0JCXRpdGxlVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dCh3ZWJTaXRlR3JvdXAsICIiLCAzNjAsIDEpOyAvLyROT04tTkxTLTEkCi0JCWNyZWF0ZUxhYmVsKHdlYlNpdGVHcm91cCwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwod2ViU2l0ZUdyb3VwLCBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmFubmVySW1hZ2VMYWJlbF90ZXh0KTsKLQkJYmFubmVySW1hZ2VUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KHdlYlNpdGVHcm91cCwgIiIsIDM2MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJc2VsZWN0SW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKHdlYlNpdGVHcm91cCwgU1dULk5PTkUpOwotCQlzZWxlY3RJbWFnZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQpOwotCi0JCWNyZWF0ZUxhYmVsKHdlYlNpdGVHcm91cCwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLmFib3V0SFRNTExhYmVsX3RleHQpOwotCQlhYm91dEhUTUxUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KHdlYlNpdGVHcm91cCwgIiIsIDM2MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJc2VsZWN0SFRNTEJ1dHRvbiA9IG5ldyBCdXR0b24od2ViU2l0ZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXNlbGVjdEhUTUxCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuU0VMRUNUX0JVVFRPTl9URVhUKTsKLQotCQljcmVhdGVMYWJlbCh3ZWJTaXRlR3JvdXAsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy5mZWVkYmFja1VSTExhYmVsX3RleHQpOwotCQlmZWVkYmFja1VSTFRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQod2ViU2l0ZUdyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbCh3ZWJTaXRlR3JvdXAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbCh3ZWJTaXRlR3JvdXAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkZWZhdWx0RmVlZGJhY2tDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KHdlYlNpdGVHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMudXNlRGVmYXVsdEZlZWRiYWNrTGFiZWxfdGV4dCwgMik7Ci0KLQkJaW5jbHVkZUdsb3NzYXJ5ID0gY3JlYXRlQ2hlY2tib3god2ViU2l0ZUdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoR2xvc3NhcnlMYWJlbF90ZXh0LCAzKTsKLQkJaW5jbHVkZUluZGV4ID0gY3JlYXRlQ2hlY2tib3god2ViU2l0ZUdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoSW5kZXhMYWJlbF90ZXh0LCAzKTsKLQotCQkvLyBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBhZGQgYWRkaXRpb25hbCBvcHRpb25zCi0JCWluY2x1ZGVBZGRpdGlvbmFsUHVibGlzaGluZ09wdGlvbnMod2ViU2l0ZUdyb3VwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbmNsdWRlQWRkaXRpb25hbFB1Ymxpc2hpbmdPcHRpb25zKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQdWJsaXNoaW5nTWlzY09wdGlvbnNVSShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIENyZWF0ZSB0aGUgTWlzYyBncm91cC4KLQkJR3JvdXAgdmFsaWRhdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQl2YWxpZGF0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCXZhbGlkYXRpb25Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdmFsaWRhdGlvbkdyb3VwLnNldFRleHQoUHVibGlzaGluZ1VJUmVzb3VyY2VzLnZhbGlkYXRpb25Hcm91cF90ZXh0KTsKLQotCQljaGVja0V4dGVybmFsTGlua3MgPSBjcmVhdGVDaGVja2JveCh2YWxpZGF0aW9uR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNoZWNrRXh0ZXJuYWxMaW5rc0xhYmVsX3RleHQpOwotCi0JCWNvbnZlcnRCcm9rZW5MaW5rcyA9IGNyZWF0ZUNoZWNrYm94KHZhbGlkYXRpb25Hcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY29udmVydEJyb2tlbkxpbmtzTGFiZWxfdGV4dCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBNaXNjIGdyb3VwLgotCQlHcm91cCBkaWFncmFtR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCWRpYWdyYW1Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJZGlhZ3JhbUdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlkaWFncmFtR3JvdXAuc2V0VGV4dChQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZGlhZ3JhbUdyb3VwX3RleHQpOwotCi0JCWF1dG9HZW5lcmF0ZUFjdGl2aXR5RGlhZ3JhbXMgPSBjcmVhdGVDaGVja2JveChkaWFncmFtR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hBY3Rpdml0eURldGFpbERpYWdyYW1zTGFiZWxfdGV4dCk7Ci0KLQkJcHVibGlzaFVuT3BlbkV4dGVuZEFjdGl2aXR5RGlhZ3JhbSA9IGNyZWF0ZUNoZWNrYm94KGRpYWdyYW1Hcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaEV4dGVuZGVkQWN0aXZpdHlEaWFncmFtc0xhYmVsX3RleHQpOwotCi0JCS8vIENyZWF0ZSB0aGUgbGF5b3V0IGdyb3VwLgotCQlHcm91cCBsYXlvdXRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJbGF5b3V0R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlsYXlvdXRHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbGF5b3V0R3JvdXAuc2V0VGV4dChQdWJsaXNoaW5nVUlSZXNvdXJjZXMubGF5b3V0R3JvdXBfdGV4dCk7Ci0KLQkJbGlnaHRXZWlnaHRUcmVlQ3RyID0gY3JlYXRlQ2hlY2tib3gobGF5b3V0R3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hMaWdodFdlaWdodFRyZWVMYWJlbF90ZXh0KTsKLQotCQlleHRyYURlc2NyaXB0b3JJbmZvQ3RyID0gY3JlYXRlQ2hlY2tib3gobGF5b3V0R3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hFeHRyYURlc2NyaXB0b3JJbmZvTGFiZWxfdGV4dCk7Ci0KLQkJZXh0cmFEZXNjcmlwdG9ySW5mb0N0cgotCQkJCS5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0RXh0cmFEZXNjcmlwdG9ySW5mbygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udHJvbHMoKSB7Ci0JCS8vIGluY2x1ZGVHbG9zc2FyeS5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJLy8gLmdldEluY2x1ZGVHbG9zc2FyeSgpKTsKLQkJLy8gaW5jbHVkZUluZGV4LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRJbmNsdWRlSW5kZXgoKSk7Ci0JCS8vIGNoZWNrRXh0ZXJuYWxMaW5rcy5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJLy8gLmdldENoZWNrRXh0ZXJuYWxMaW5rcygpKTsKLQkJLy8gY29udmVydEJyb2tlbkxpbmtzLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkvLyAuZ2V0Q29udmVydEJyb2tlbkxpbmtzKCkpOwotCQkvLyBhdXRvR2VuZXJhdGVBY3Rpdml0eURpYWdyYW1zLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkvLyAuZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoKSk7Ci0JCS8vIHB1Ymxpc2hVbk9wZW5FeHRlbmRBY3Rpdml0eURpYWdyYW0uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCS8vIC5nZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpKTsKLQkJLy8gbGlnaHRXZWlnaHRUcmVlQ3RyLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkvLyAuZ2V0TGlnaHRXZWlnaHRUcmVlKCkpOwotCQkvLyBleHRyYURlc2NyaXB0b3JJbmZvQ3RyLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkvLyAuZ2V0RXh0cmFEZXNjcmlwdG9ySW5mbygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCXN1cGVyLm9uRW50ZXJQYWdlKG9iaik7Ci0JCWNvbmZpZ05hbWUgPSAoU3RyaW5nKSBvYmo7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgaW5pdFBhdGggPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCQkuZ2V0UHVibGlzaFBhdGgoY29uZmlnTmFtZSk7Ci0JCQlpZiAoaW5pdFBhdGggPT0gbnVsbCB8fCBpbml0UGF0aC5sZW5ndGgoKSA8PSAwKQotCQkJCWluaXRQYXRoID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdFB1Ymxpc2hQYXRoKCk7Ci0JCQlkZXN0aW5hdGlvblBhdGhUZXh0LnNldFRleHQoaW5pdFBhdGgpOwotCQkJZGVmYXVsdFBhdGhDaGVja2JveC5zZXRTZWxlY3Rpb24oZGVzdGluYXRpb25QYXRoVGV4dC5nZXRUZXh0KCkKLQkJCQkJLmVxdWFscyhQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXREZWZhdWx0UHVibGlzaFBhdGgoKSkpOwotCQkJZGVzdGluYXRpb25QYXRoVGV4dC5zZXRFbmFibGVkKCFkZWZhdWx0UGF0aENoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLQotCQkJaWYgKCFkZWZhdWx0UGF0aENoZWNrYm94LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdGl0bGVUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0VGl0bGUoY29uZmlnTmFtZSkpOwotCQliYW5uZXJJbWFnZVRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRCYW5uZXJJbWFnZShjb25maWdOYW1lKSk7Ci0JCWFib3V0SFRNTFRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRBYm91dEhUTUwoY29uZmlnTmFtZSkpOwotCQlTdHJpbmcgZmVlZGJhY2tVUkwgPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRGZWVkYmFja1VSTChjb25maWdOYW1lKTsKLQkJaWYgKGZlZWRiYWNrVVJMID09IG51bGwgfHwgZmVlZGJhY2tVUkwubGVuZ3RoKCkgPD0gMCkKLQkJCWZlZWRiYWNrVVJMID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEZlZWRiYWNrVVJMKCk7Ci0JCWZlZWRiYWNrVVJMVGV4dC5zZXRUZXh0KGZlZWRiYWNrVVJMKTsKLQkJZGVmYXVsdEZlZWRiYWNrQ2hlY2tib3guc2V0U2VsZWN0aW9uKGZlZWRiYWNrVVJMVGV4dC5nZXRUZXh0KCkuZXF1YWxzKAotCQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldERlZmF1bHRGZWVkYmFja1VSTCgpKSk7Ci0JCWZlZWRiYWNrVVJMVGV4dC5zZXRFbmFibGVkKCFkZWZhdWx0RmVlZGJhY2tDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCWluY2x1ZGVHbG9zc2FyeS5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0SW5jbHVkZUdsb3NzYXJ5KGNvbmZpZ05hbWUpKTsKLQkJaW5jbHVkZUluZGV4LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRJbmNsdWRlSW5kZXgoY29uZmlnTmFtZSkpOwotCi0JCS8vIGNyZWF0ZVdBUkNoZWNrQm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRJbmNsdWRlU2VhcmNoKGNvbmZpZ05hbWUpKTsKLQkJLy8gU3RyaW5nIHdlYkFwcE5hbWUgPQotCQkvLyBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRXZWJBcHBOYW1lKGNvbmZpZ05hbWUpOwotCQkvLyBpZiAod2ViQXBwTmFtZSAhPSBudWxsICYmIHdlYkFwcE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCS8vIHdlYkFwcE5hbWVUZXh0LnNldFRleHQod2ViQXBwTmFtZSk7Ci0JCS8vIH0KLQkJLy8gd2ViQXBwTmFtZVRleHQuc2V0RW5hYmxlZChjcmVhdGVXQVJDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCS8vCi0JCS8vIGluY2x1ZGVTZWFyY2guc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldEluY2x1ZGVTZWFyY2goY29uZmlnTmFtZSkpOwotCi0JCWNoZWNrRXh0ZXJuYWxMaW5rcy5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0Q2hlY2tFeHRlcm5hbExpbmtzKGNvbmZpZ05hbWUpKTsKLQkJY29udmVydEJyb2tlbkxpbmtzLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRDb252ZXJ0QnJva2VuTGlua3MoY29uZmlnTmFtZSkpOwotCQlhdXRvR2VuZXJhdGVBY3Rpdml0eURpYWdyYW1zLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZChjb25maWdOYW1lKSk7Ci0JCXB1Ymxpc2hVbk9wZW5FeHRlbmRBY3Rpdml0eURpYWdyYW0uc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKGNvbmZpZ05hbWUpKTsKLQkJbGlnaHRXZWlnaHRUcmVlQ3RyLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRMaWdodFdlaWdodFRyZWUoY29uZmlnTmFtZSkpOwotCQlleHRyYURlc2NyaXB0b3JJbmZvQ3RyLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRFeHRyYURlc2NyaXB0b3JJbmZvKGNvbmZpZ05hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKCFkaXNwbGF5RGVzdGluYXRpb25Hcm91cCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoIWlzVGV4dE5vbkVtcHR5KGRlc3RpbmF0aW9uUGF0aFRleHQpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRQYXRoRXJyb3JfbXNnKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIHBhdGggPSBkZXN0aW5hdGlvblBhdGhUZXh0LmdldFRleHQoKTsKLQkJSVBhdGggZWNQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcocGF0aCk7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IGVjUGF0aC5pc1ZhbGlkUGF0aChwYXRoKTsKLQkJaWYgKCFpc1ZhbGlkKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRQYXRoRXJyb3JfbXNnKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKCFTdHJVdGlsLmlzVmFsaWRQdWJsaXNoUGF0aChwYXRoKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkUGF0aENoYXJzRXJyb3JfbXNnKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lcnMgZm9yIHRoZSBjb250cm9scyBvbiB0aGlzIHBhZ2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycyhmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWlmIChkaXNwbGF5RGVzdGluYXRpb25Hcm91cCkgewotCQkJZGVzdGluYXRpb25QYXRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGNvbXBvc2l0ZQotCQkJCQkJCQkuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQkJCQkJU3RyaW5nIGRlc3RpbmF0aW9uID0gZGQub3BlbigpOwotCQkJCQkJaWYgKGRlc3RpbmF0aW9uICE9IG51bGwpIHsKLQkJCQkJCQlkZXN0aW5hdGlvblBhdGhUZXh0LnNldFRleHQoZGVzdGluYXRpb24pOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQlkZWZhdWx0UGF0aENoZWNrYm94LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQlpZiAoZGVmYXVsdFBhdGhDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJZGVzdGluYXRpb25QYXRoVGV4dC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJCQkJCS5nZXREZWZhdWx0UHVibGlzaFBhdGgoKSk7Ci0JCQkJCQlkZXN0aW5hdGlvblBhdGhUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nIGluaXRQYXRoID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldFB1Ymxpc2hQYXRoKGNvbmZpZ05hbWUpOwotCQkJCQkJaWYgKGluaXRQYXRoID09IG51bGwgfHwgaW5pdFBhdGgubGVuZ3RoKCkgPD0gMCkKLQkJCQkJCQlpbml0UGF0aCA9IFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdFB1Ymxpc2hQYXRoKCk7Ci0JCQkJCQlkZXN0aW5hdGlvblBhdGhUZXh0LnNldFRleHQoaW5pdFBhdGgpOwotCQkJCQkJZGVzdGluYXRpb25QYXRoVGV4dC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCS8vIGNyZWF0ZVdBUkNoZWNrQm94LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJLy8gcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2ViQXBwTmFtZVRleHQuc2V0RW5hYmxlZChjcmVhdGVXQVJDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCS8vIH0KLQkJLy8gfSk7Ci0KLQkJZGVmYXVsdEZlZWRiYWNrQ2hlY2tib3guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZGVmYXVsdEZlZWRiYWNrQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJZmVlZGJhY2tVUkxUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkJCQkuZ2V0RGVmYXVsdEZlZWRiYWNrVVJMKCkpOwotCQkJCQlmZWVkYmFja1VSTFRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIGluaXRVcmwgPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCQkJCS5nZXRGZWVkYmFja1VSTChjb25maWdOYW1lKTsKLQkJCQkJaWYgKGluaXRVcmwgPT0gbnVsbCB8fCBpbml0VXJsLmxlbmd0aCgpIDw9IDApCi0JCQkJCQlpbml0VXJsID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldERlZmF1bHRGZWVkYmFja1VSTCgpOwotCQkJCQlmZWVkYmFja1VSTFRleHQuc2V0VGV4dChpbml0VXJsKTsKLQkJCQkJZmVlZGJhY2tVUkxUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlzZWxlY3RJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSwKLQkJCQkJCQlTV1QuT1BFTik7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJIiouZ2lmIiwgIiouanBnIiwgIiouYm1wIiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJU3RyaW5nIGltYWdlRmlsZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCkgewotCQkJCQkJYmFubmVySW1hZ2VUZXh0LnNldFRleHQoaW1hZ2VGaWxlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlzZWxlY3RIVE1MQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl0cnkgewotCQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGNvbXBvc2l0ZS5nZXRTaGVsbCgpLAotCQkJCQkJCVNXVC5PUEVOKTsKLQkJCQkJZGlhbG9nCi0JCQkJCQkJLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsKLQkJCQkJCQkJCSIqLmh0bSIsICIqLmh0bWwiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJU3RyaW5nIGh0bWxGaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKGh0bWxGaWxlICE9IG51bGwpIHsKLQkJCQkJCWFib3V0SFRNTFRleHQuc2V0VGV4dChodG1sRmlsZSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2Ujc2V0VmlzaWJsZSgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUpIHsKLQkJCURpc3BsYXkgZGlzcGxheSA9IHRpdGxlVGV4dC5nZXREaXNwbGF5KCk7Ci0JCQlpZiAoIShkaXNwbGF5ID09IG51bGwgfHwgZGlzcGxheS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0aXRsZVRleHQuc2V0Rm9jdXMoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHVibGlzaGluZyBvcHRpb25zLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3B0aW9ucyBnZXRQdWJsaXNoaW5nT3B0aW9ucygpIHsKLQkJaWYgKGRpc3BsYXlEZXN0aW5hdGlvbkdyb3VwKSB7Ci0JCQlkYXRhTW9kZWwuc2V0UHVibGljYXRpb25QYXRoKGRlc3RpbmF0aW9uUGF0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCX0KLQkJZGF0YU1vZGVsLnNldFRpdGxlKHRpdGxlVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJZGF0YU1vZGVsLnNldEJhbm5lckltYWdlKGJhbm5lckltYWdlVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJZGF0YU1vZGVsLmFib3V0SFRNTCA9IGFib3V0SFRNTFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJZGF0YU1vZGVsLmZlZWRiYWNrVVJMID0gZmVlZGJhY2tVUkxUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCWRhdGFNb2RlbC5nZW5lcmF0ZUdsb3NzYXJ5ID0gaW5jbHVkZUdsb3NzYXJ5LmdldFNlbGVjdGlvbigpOwotCQlkYXRhTW9kZWwuZ2VuZXJhdGVJbmRleCA9IGluY2x1ZGVJbmRleC5nZXRTZWxlY3Rpb24oKTsKLQkJLy8gZGF0YU1vZGVsLmdlbmVyYXRlU2VhcmNoREIgPSBpbmNsdWRlU2VhcmNoLmdldFNlbGVjdGlvbigpOwotCQlkYXRhTW9kZWwuY2hlY2tFeHRMaW5rcyA9IGNoZWNrRXh0ZXJuYWxMaW5rcy5nZXRTZWxlY3Rpb24oKTsKLQkJZGF0YU1vZGVsLmF1dG9HZW5lcmF0ZUFjdGl2aXR5RGlhZ3JhbXMgPSBhdXRvR2VuZXJhdGVBY3Rpdml0eURpYWdyYW1zCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlkYXRhTW9kZWwKLQkJCQkuc2V0VW5vcGVuRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW0ocHVibGlzaFVuT3BlbkV4dGVuZEFjdGl2aXR5RGlhZ3JhbQotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJZGF0YU1vZGVsLmNvbnZlcnRCcm9rZW5MaW5rcyA9IGNvbnZlcnRCcm9rZW5MaW5rcy5nZXRTZWxlY3Rpb24oKTsKLQkJZGF0YU1vZGVsLnNob3dFeHRyYURlc2NyaXB0b3JJbmZvID0gZXh0cmFEZXNjcmlwdG9ySW5mb0N0cgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJZGF0YU1vZGVsLmdlbmVyYXRlTGlnaHRXZWlnaHRUcmVlID0gbGlnaHRXZWlnaHRUcmVlQ3RyLmdldFNlbGVjdGlvbigpOwotCQkvLyBkYXRhTW9kZWwuaW5jbHVkZUVtcHR5Q2F0ZWdvcmllcyA9Ci0JCS8vIGluY2x1ZGVFbXB0eUNhdGVnb3JpZXNDdHIuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLQkvLyBwdWJsaWMgQ29tcG9zaXRlIGdldFNlYXJjaENvbXBvc2l0ZSgpIHsKLQkvLyByZXR1cm4gc2VhcmNoQ29tcG9zaXRlOwotCS8vIH0KLQkvLwkKLQkvLyBwdWJsaWMgQnV0dG9uIGdldEluY2x1ZGVTZWFyY2goKSB7Ci0JLy8gcmV0dXJuIGluY2x1ZGVTZWFyY2g7Ci0JLy8gfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvUHVibGlzaENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvUHVibGlzaENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGNjMGVmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy93aXphcmRzL1B1Ymxpc2hDb25maWdTZWxlY3RDb25maWdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGUgU2VsZWN0IE1ldGhvZCBDb25maWd1cmF0aW9uIHBhZ2UgaW4gdGhlIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24KLSAqIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoQ29uZmlnU2VsZWN0Q29uZmlnUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZkRlc2M7Ci0KLQlwcml2YXRlIFB1Ymxpc2hPcHRpb25zIGRhdGFNb2RlbCA9IG51bGw7Ci0KLQlwcml2YXRlIExpc3QgdndMaXN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UoU3RyaW5nIHBhZ2VOYW1lLAotCQkJUHVibGlzaE9wdGlvbnMgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ1dpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0Q29uZmlnV2l6YXJkUGFnZV90ZXh0KTsKLQkJdGhpcy5kYXRhTW9kZWwgPSBkYXRhTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB3aWRnZXRzLgotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCWNyZWF0ZUxhYmVsKAotCQkJCWNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY29uZmlnTGFiZWxfdGV4dCk7Ci0KLQkJdGFibGUgPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDEyMDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMjgwOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQl0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IENvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoY29uZmlncyk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fVEVYVCk7Ci0KLQkJY3RybF9icmllZkRlc2MgPSBjcmVhdGVUZXh0TXVsdGkoY29tcG9zaXRlLCAiIiwgMzYwLCA4MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBTZWxlY3QgdGhlIGZpcnN0IGNvbmZpZyBhbmQgZGlzcGxheSBpdHMgYnJpZWYgZGVzY3JpcHRpb24uCi0JCWlmIChjb25maWdzLmxlbmd0aCA+IDApIHsKLQkJCXRhYmxlLnNlbGVjdCgwKTsKLQkJCXNldERpc3BsYXlBdHRyaWJ1dGVzKGNvbmZpZ3NbMF0pOwotCQl9Ci0KLQkJLy8gVE9ETzogU2hvdWxkbid0IHRoaXMgYmUgdGhlIGFwcGxpY2F0aW9uIHNoZWxsIGltYWdlPwotCQlQdWJsaXNoQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQgPSAoUHVibGlzaENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpOwotCQlTaGVsbCBzaGVsbCA9IHdpemFyZC5nZXRDb250YWluZXIoKS5nZXRTaGVsbCgpOwotCQlzaGVsbC5zZXRJbWFnZShMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9DT05GSUdVUkFUT04pOwotCi0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQkJUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkuc2V0SGVscCgKLQkJCQkJCWNvbXBvc2l0ZSwKLQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkNPTkZJR1VSQVRJT05fUFVCTElTSF9XSVpBUkRfQUxMX1BBR0VTX0NPTlRFWFQpOwotCX0KLQotCS8qKgotCSAqIGhhbmRsZSB0aGUgc2VsZWN0aW9uIGNoYW5nZSBldmVudAotCSAqIEBwYXJhbSBldmVudCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBjb25maWdzID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCXNldERpc3BsYXlBdHRyaWJ1dGVzKChNZXRob2RDb25maWd1cmF0aW9uKSBjb25maWdzWzBdKTsKLQkJfQotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBoYW5kbGUgdGhlIGV2ZW50Ci0JICogQHBhcmFtIGV2ZW50IEV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERpc3BsYXlBdHRyaWJ1dGVzKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWN0cmxfYnJpZWZEZXNjLnNldFRleHQoY29uZmlnLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBuZXh0IHdpemFyZCBwYWdlCi0JICogCi0JICogQHJldHVybiBJV2l6YXJkUGFnZQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJZGF0YU1vZGVsLnB1Ymxpc2hDb25maWd1cmF0aW9uID0gdHJ1ZTsKLQkJLy8gSVdpemFyZFBhZ2UgcGFnZSA9IHN1cGVyLmdldE5leHRQYWdlKCk7Ci0KLQkJSVdpemFyZFBhZ2UgcGFnZSA9IGdldFdpemFyZCgpLmdldE5leHRQYWdlKHRoaXMpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgcGFnZSBpcyBjb21wbGV0ZWQgb3Igbm90Ci0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWludCBjb3VudCA9IHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCk7Ci0KLQkJaWYgKGNvdW50ID4gMCkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWRhdGFNb2RlbC5zZXRTZWxlY3RlZENvbmZpZyhpdGVtc1swXS5nZXRUZXh0KCkpOwotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLAotCQkJCQkJCWRhdGFNb2RlbC5zZWxlY3RlZENvbmZpZyk7Ci0JCQl2d0xpc3QgPSBudWxsOwotCQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQkJdndMaXN0ID0gZ2V0VmFsaWRWaWV3cyhjb25maWcpOwotCQkJfQotCQkJCi0JCQkKLQkJCWlmICh2d0xpc3QgIT0gbnVsbCAmJiB2d0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQlzZXRNZXNzYWdlKG51bGwpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJc2V0TWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMubWlzc2luZ1ZpZXdFcnJvcl9tc2csCi0JCQkJCQlXaXphcmRQYWdlLldBUk5JTkcpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRWaWV3cyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkKLQkJU3RyaW5nIG1zZzsKLQkJYm9vbGVhbiB2YWxpZDsKLQkJU3RyaW5nQnVmZmVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUxpc3Qgdmlld3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgdmlldyA9IChDb250ZW50Q2F0ZWdvcnkpaXQubmV4dCgpOwotCQkJaWYgKCBDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udHJpYnV0b3IodmlldykgKSB7Ci0JCQkJbXNnID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFZpZXdDb250cmlidXRvckluZm9fbXNnLAotCQkJCQkJdmlldy5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkJCW1lc3NhZ2UuYXBwZW5kKFN0clV0aWwuVEFCKS5hcHBlbmQobXNnKS5hcHBlbmQoU3RyVXRpbC5MSU5FX0ZFRUQpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQl2aWV3ID0gKENvbnRlbnRDYXRlZ29yeSlDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHZpZXcsIGNvbmZpZyk7Ci0JCQkJaWYgKCB2aWV3ID09IG51bGwgKSB7Ci0JCQkJCW1zZyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkVmlld0ludmFsaWRJbmZvX21zZywKLQkJCQkJCQl2aWV3LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJCW1lc3NhZ2UuYXBwZW5kKFN0clV0aWwuVEFCKS5hcHBlbmQobXNnKS5hcHBlbmQoU3RyVXRpbC5MSU5FX0ZFRUQpOwkJCQotCi0JCQkJfSBlbHNlIGlmICggdmlld3MuY29udGFpbnModmlldykgKSB7Ci0JCQkJCW1zZyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkVmlld1NhbWVWaWV3SW5mb19tc2csCi0JCQkJCQkJdmlldy5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkJCQltZXNzYWdlLmFwcGVuZChTdHJVdGlsLlRBQikuYXBwZW5kKG1zZykuYXBwZW5kKFN0clV0aWwuTElORV9GRUVEKTsJCQkKLQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZpZXdzLmFkZCh2aWV3KTsKLQkJCQl9IAotCQkJfQkKLQkJfQotCQkKLQkJaWYgKCBtZXNzYWdlLmxlbmd0aCgpID4gMCApIHsJCQotCQkJbXNnID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkVmlld3NJbmZvX21zZywKLQkJCQkJY29uZmlnLmdldE5hbWUoKSk7Ci0JCQltZXNzYWdlLmluc2VydCgwLCBtc2cgKyBTdHJVdGlsLkxJTkVfRkVFRCArIFN0clV0aWwuTElORV9GRUVEKTsJCQkKLQotCQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChtZXNzYWdlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gdmlld3M7Ci0JfQotCQotCWNsYXNzIENvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JCQlpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBlbGVtZW50OwotCQkJcmV0dXJuIGNvbmZpZy5nZXROYW1lKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy93aXphcmRzL1B1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwY2Y4YzIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGUgU2VsZWN0IHB1Ymxpc2hpbmcgcHJvY2VzZXMgd2l6YXJkLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cwotCQlMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIEJ1dHRvbiByYWRpb19lbnRpcmVDb25maWc7Ci0KLQlwcml2YXRlIEJ1dHRvbiByYWRpb19wcm9jZXNzZXM7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBwcm9jZXNzQ29udGFpbmVyOwotCi0JcHJpdmF0ZSBCdXR0b24gaW5jbHVkZUJhc2VQcm9jZXNzZXM7Ci0JCi0JLy8gcHJpdmF0ZSBMaXN0IGNoZWNrX3Byb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCU1hcCBjaGVja0JveFRwUHJvY01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlDaGVja2JveFRyZWVWaWV3ZXIgcHJvY1ZpZXdlcjsKLQotCXByaXZhdGUgUHVibGlzaE9wdGlvbnMgZGF0YU1vZGVsID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0JCQlQdWJsaXNoT3B0aW9ucyBkYXRhTW9kZWwpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0Q29udGVudFdpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0Q29udGVudFdpemFyZFBhZ2VfdGV4dCk7Ci0JCXRoaXMuZGF0YU1vZGVsID0gZGF0YU1vZGVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgd2lkZ2V0cy4KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotCQlyYWRpb19lbnRpcmVDb25maWcgPSBjcmVhdGVSYWRpb0J1dHRvbigKLQkJCQljb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbl90ZXh0LCAxLCB0cnVlKTsKLQotCQlyYWRpb19wcm9jZXNzZXMgPSBjcmVhdGVSYWRpb0J1dHRvbigKLQkJCQljb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbl90ZXh0LCAxLCBmYWxzZSk7Ci0KLQkJcHJvY2Vzc0NvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXByb2Nlc3NDb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RICi0JCQkJfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAxMzsKLQkJcHJvY2Vzc0NvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQljcmVhdGVQcm9jZXNzQ29udGFpbmVyKHByb2Nlc3NDb250YWluZXIpOwotCi0JCXJhZGlvX2VudGlyZUNvbmZpZy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJcmFkaW9fcHJvY2Vzc2VzLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCi0JCXByb2Nlc3NDb250YWluZXIuc2V0VmlzaWJsZShyYWRpb19wcm9jZXNzZXMuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9jZXNzQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlVHJlZVZpZXdlcihwYXJlbnQpOwotCQlpbmNsdWRlQmFzZVByb2Nlc3NlcyA9IGNyZWF0ZUNoZWNrYm94KHBhcmVudCwgCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmluY2x1ZGVCYXNlUHJvY2Vzc2VzQ2hlY2tib3hMYWJlbF90ZXh0KTsgCi0JCWluY2x1ZGVCYXNlUHJvY2Vzc2VzLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXByb2NWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKHBhcmVudCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMzAwOwotCQkJcHJvY1ZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJcHJvY1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFByb2Nlc3NDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXByb2NWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgUHJvY2Vzc0xhYmVsUHJvdmlkZXIoKSk7Ci0KLQkJcHJvY1ZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJYm9vbGVhbiBjaGVja2VkID0gZXZlbnQuZ2V0Q2hlY2tlZCgpOwotCQkJCXVwZGF0ZUNoZWNrU3RhdGVzKGV2ZW50LmdldEVsZW1lbnQoKSwgY2hlY2tlZCk7Ci0JCQkJc2VsZWN0YmFzZVByb2Nlc3NlcygpOwotCQkJCQotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0KLQkJCX0KLQkJfSk7Ci0KLQkJU3RyaW5nIHNlbGVjZWRDb25maWdOYW1lID0gZGF0YU1vZGVsLmdldFNlbGVjdGVkQ29uZmlnKCk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oCi0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLAotCQkJCXNlbGVjZWRDb25maWdOYW1lKTsKLQotCQlwcm9jVmlld2VyLnNldElucHV0KGNvbmZpZyk7Ci0KLQkJcHJvY1ZpZXdlci5leHBhbmRBbGwoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2hlY2tTdGF0ZXMoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tlZCkgewotCi0JCS8vIE9iamVjdCBlbGVtZW50ID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCi0JCWlmIChjaGVja2VkID09IHRydWUpIHsKLQkJCUlUcmVlQ29udGVudFByb3ZpZGVyIGNwID0gKElUcmVlQ29udGVudFByb3ZpZGVyKSBwcm9jVmlld2VyCi0JCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCWNoZWNrUGFyZW50KGNwLCBlbGVtZW50KTsKLQkJfSBlbHNlCi0JCQlwcm9jVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgZmFsc2UpOwotCi0JCXNlbGVjdGlvbkNoaWxkcmVuKGVsZW1lbnQsIGNoZWNrZWQpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUGFyZW50KElUcmVlQ29udGVudFByb3ZpZGVyIGNwLCBPYmplY3QgZWxlbWVudCkgewotCQkvLyBpZiAoZWxlbWVudCA9PSBudWxsICkgewotCQkvLyByZXR1cm47Ci0JCS8vIH0KLQkJLy8gT2JqZWN0IHBhcmVudCA9IGNwLmdldFBhcmVudChlbGVtZW50KTsKLQkJLy8gaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCS8vIHByb2NWaWV3ZXIuc2V0Q2hlY2tlZChwYXJlbnQsIHRydWUpOwotCQkvLyBjaGVja1BhcmVudChjcCwgcGFyZW50KTsKLQkJLy8gfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdGlvbkNoaWxkcmVuKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGNoZWNrZWQpIHsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHByb2NWaWV3ZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCU9iamVjdFtdIGNoaWxkcyA9IGNwLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcy5sZW5ndGg7IGkrKykgewotCQkJcHJvY1ZpZXdlci5zZXRDaGVja2VkKGNoaWxkc1tpXSwgY2hlY2tlZCk7Ci0JCQlzZWxlY3Rpb25DaGlsZHJlbihjaGlsZHNbaV0sIGNoZWNrZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaGFuZGxlIHRoZSBldmVudAotCSAqIEBwYXJhbSBldmVudCBFdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0KLQkJaWYgKCBldmVudC53aWRnZXQgPT0gaW5jbHVkZUJhc2VQcm9jZXNzZXMgKSB7Ci0JCQkvLyBpZiBzZWxlY3RlZCwgYWx0byBzZWxlY3QgYWxsIGJhc2UgcHJvY2Vzc2VzCi0JCQlzZWxlY3RiYXNlUHJvY2Vzc2VzKCk7Ci0JCX0KLQotCQlwcm9jZXNzQ29udGFpbmVyLnNldFZpc2libGUocmFkaW9fcHJvY2Vzc2VzLmdldFNlbGVjdGlvbigpKTsKLQotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG5leHQgV2l6YXJkIHBhZ2UKLQkgKiAKLQkgKiBAcmV0dXJuIElXaXphcmRQYWdlCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCi0JCXJldHVybiBzdXBlci5nZXROZXh0UGFnZSgpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBwYWdlIGlzIGNvbXBsZXRlZCBvciBub3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKGdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZGF0YU1vZGVsLnB1Ymxpc2hQcm9jZXNzID0gZmFsc2U7Ci0JCWlmIChyYWRpb19lbnRpcmVDb25maWcuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWRhdGFNb2RlbC5wdWJsaXNoQ29uZmlndXJhdGlvbiA9IHRydWU7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCUxpc3QgcHJvY3MgPSBnZXRTZWxlY3RlZFByb2Nlc3NlcygpOwotCi0JCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrX3Byb2Nlc3Nlcy5zaXplKCk7IGkrKykgewotCQkJLy8gQnV0dG9uIGIgPSAoQnV0dG9uKSBjaGVja19wcm9jZXNzZXMuZ2V0KGkpOwotCQkJLy8gaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCS8vCi0JCQkvLyAvLyBzZXQgdGhlIHNlbGVjdGlvbnMKLQkJCS8vIHByb2NzLmFkZChjaGVja0JveFRwUHJvY01hcC5nZXQoYikpOwotCQkJLy8gfQotCQkJLy8gfQotCi0vLwkJCU9iamVjdFtdIHNlbGVjdGVkID0gcHJvY1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLS8vCQkJaWYgKHNlbGVjdGVkICE9IG51bGwgJiYgc2VsZWN0ZWQubGVuZ3RoID4gMCkgewotLy8JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotLy8JCQkJCWlmIChzZWxlY3RlZFtpXSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgewotLy8JCQkJCQlwcm9jcy5hZGQoc2VsZWN0ZWRbaV0pOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotCQkJaWYgKHByb2NzLnNpemUoKSA+IDApIHsKLQkJCQlkYXRhTW9kZWwucHVibGlzaFByb2Nlc3MgPSB0cnVlOwotCQkJCWRhdGFNb2RlbC5wdWJsaXNoQ29uZmlndXJhdGlvbiA9IGZhbHNlOwotCQkJCWRhdGFNb2RlbC5zZXREZWxpdmVyUHJvY2Vzc0xpc3QocHJvY3MpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRTZWxlY3RlZFByb2Nlc3NlcygpIHsKLQkJTGlzdCBwcm9jcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlPYmplY3RbXSBzZWxlY3RlZCA9IHByb2NWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCWlmIChzZWxlY3RlZCAhPSBudWxsICYmIHNlbGVjdGVkLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc2VsZWN0ZWRbaV0gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHsKLQkJCQkJcHJvY3MuYWRkKHNlbGVjdGVkW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwcm9jczsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdGJhc2VQcm9jZXNzZXMoKSB7Ci0JCWlmICggIWluY2x1ZGVCYXNlUHJvY2Vzc2VzLmdldFNlbGVjdGlvbigpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTdHJpbmcgc2VsZWNlZENvbmZpZ05hbWUgPSBkYXRhTW9kZWwuZ2V0U2VsZWN0ZWRDb25maWcoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksCi0JCQkJc2VsZWNlZENvbmZpZ05hbWUpOwotCi0JCUxpc3QgcHJvY3MgPSBnZXRTZWxlY3RlZFByb2Nlc3NlcygpOwotCQlMaXN0IGJhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvY3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0QmFzZVByb2Nlc3NlcygoQWN0aXZpdHkpaXQubmV4dCgpLCBjb25maWcsIGJhc2VzKTsKLQkJfQotCQkKLQkJLy8gdXBkYXRlIHRoZSBzZWxlY3Rpb25zCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBiYXNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQlwcm9jVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgdHJ1ZSk7Ci0JCQl1cGRhdGVDaGVja1N0YXRlcyhlbGVtZW50LCB0cnVlKTsKLQkJfQkJCi0JfQotCQotCXByaXZhdGUgY2xhc3MgUHJvY2Vzc0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGlucHV0ID0gbnVsbDsKLQotCQlTdHJpbmcgTk9ERV9DUCA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5jYXBhYmlsaXR5UGF0dGVybnNfdGV4dDsKLQotCQlTdHJpbmcgTk9ERV9EUCA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5kZWxpdmVyeVByb2Nlc3Nlc190ZXh0OwotCi0JCVN0cmluZ1tdIERQQ1BfTk9ERVMgPSBuZXcgU3RyaW5nW10geyBOT0RFX0NQLCBOT0RFX0RQIH07Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQlyZXR1cm4gRFBDUF9OT0RFUzsKLQkJCX0gZWxzZSBpZiAoTk9ERV9DUC5lcXVhbHMocGFyZW50RWxlbWVudC50b1N0cmluZygpKQotCQkJCQl8fCBOT0RFX0RQLmVxdWFscyhwYXJlbnRFbGVtZW50LnRvU3RyaW5nKCkpKSB7Ci0JCQkJcmV0dXJuIGdldFBsdWdpbnMocGFyZW50RWxlbWVudCkudG9BcnJheSgpOwotCQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUGx1Z2luTm9kZSkgewotCQkJCU9iamVjdCBwYXJlbnQgPSAoKFBsdWdpbk5vZGUpIHBhcmVudEVsZW1lbnQpLnBhcmVudDsKLQkJCQlpZiAoTk9ERV9DUC5lcXVhbHMocGFyZW50LnRvU3RyaW5nKCkpKSB7Ci0JCQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmdldEFsbENhcGFiaWxpdHlQYXR0ZXJucygKLQkJCQkJCQkoKFBsdWdpbk5vZGUpIHBhcmVudEVsZW1lbnQpLnBsdWdpbiwgaW5wdXQpCi0JCQkJCQkJLnRvQXJyYXkoKTsKLQkJCQl9IGVsc2UgaWYgKE5PREVfRFAuZXF1YWxzKHBhcmVudC50b1N0cmluZygpKSkgewotCQkJCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRBbGxEZWxpdmVyeVByb2Nlc3NlcygKLQkJCQkJCQkoKFBsdWdpbk5vZGUpIHBhcmVudEVsZW1lbnQpLnBsdWdpbiwgaW5wdXQpCi0JCQkJCQkJLnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBuZXcgT2JqZWN0W10ge307Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBsdWdpbk5vZGUpIHsKLQkJCQlyZXR1cm4gKChQbHVnaW5Ob2RlKSBlbGVtZW50KS5wYXJlbnQ7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHsKLQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgZWxlbWVudDsKLQkJCQl3aGlsZSAoKG8gIT0gbnVsbCkgJiYgIShvIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJCQlvID0gby5lQ29udGFpbmVyKCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG87Ci0JCQl9Ci0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUGx1Z2luTm9kZSB8fCBlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlwbHVnaW5Ob2RlTWFwLmNsZWFyKCk7Ci0JCQlpbnB1dCA9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCWlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQlpbnB1dCA9IChNZXRob2RDb25maWd1cmF0aW9uKSBuZXdJbnB1dDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5wdXQgPSBudWxsOwotCQkJfQotCi0JCQlwbHVnaW5Ob2RlTWFwLmNsZWFyKCk7Ci0JCX0KLQotCQlwcml2YXRlIExpc3QgZ2V0UGx1Z2lucyhPYmplY3QgcGFyZW50KSB7Ci0JCQlMaXN0IHZhbGlkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJCUxpc3QgcGx1Z2lucyA9IGlucHV0LmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCQkJTGlzdCBwcm9jcyA9IG51bGw7Ci0JCQkJCWlmIChOT0RFX0NQLmVxdWFscyhwYXJlbnQudG9TdHJpbmcoKSkpIHsKLQkJCQkJCXByb2NzID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRBbGxDYXBhYmlsaXR5UGF0dGVybnMoCi0JCQkJCQkJCXBsdWdpbiwgaW5wdXQpOwotCQkJCQl9IGVsc2UgaWYgKE5PREVfRFAuZXF1YWxzKHBhcmVudC50b1N0cmluZygpKSkgewotCQkJCQkJcHJvY3MgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldEFsbERlbGl2ZXJ5UHJvY2Vzc2VzKAotCQkJCQkJCQlwbHVnaW4sIGlucHV0KTsKLQkJCQkJfQotCi0JCQkJCWlmIChwcm9jcyAhPSBudWxsICYmIHByb2NzLnNpemUoKSA+IDApIHsKLQkJCQkJCXZhbGlkSXRlbXMuYWRkKGdldFBsdWdpbk5vZGUocGFyZW50LCBwbHVnaW4pKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB2YWxpZEl0ZW1zOwotCQl9Ci0KLQkJTWFwIHBsdWdpbk5vZGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByaXZhdGUgUGx1Z2luTm9kZSBnZXRQbHVnaW5Ob2RlKE9iamVjdCBwYXJlbnQsIE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJCVN0cmluZyBrZXkgPSBwYXJlbnQudG9TdHJpbmcoKSArICI6IiArIHBsdWdpbi5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCVBsdWdpbk5vZGUgbm9kZSA9IChQbHVnaW5Ob2RlKSBwbHVnaW5Ob2RlTWFwLmdldChrZXkpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCW5vZGUgPSBuZXcgUGx1Z2luTm9kZShwYXJlbnQsIHBsdWdpbik7Ci0JCQkJcGx1Z2luTm9kZU1hcC5wdXQoa2V5LCBub2RlKTsKLQkJCX0KLQotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQotCQljbGFzcyBQbHVnaW5Ob2RlIHsKLQkJCU9iamVjdCBwYXJlbnQ7Ci0KLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW47Ci0KLQkJCXB1YmxpYyBQbHVnaW5Ob2RlKE9iamVjdCBwYXJlbnQsIE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gcGx1Z2luLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgUHJvY2Vzc0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgewotCQkJCS8vICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKWVsZW1lbnQpLmdldFByZXNlbnRhdGlvbk5hbWUoKQotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgZWxlbWVudDsKLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKHByb2MpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gKGVsZW1lbnQgPT0gbnVsbCkgPyAiIiA6IGVsZW1lbnQudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy93aXphcmRzL1B1Ymxpc2hDb25maWd1cmF0aW9uV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy93aXphcmRzL1B1Ymxpc2hDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0ZGJkNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvd2l6YXJkcy9QdWJsaXNoQ29uZmlndXJhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZDsKLQotLyoqCi0gKiBUaGUgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaENvbmZpZ3VyYXRpb25XaXphcmQgZXh0ZW5kcyBBYnN0cmFjdFB1Ymxpc2hXaXphcmQgewotCi0JLy8gVGhlIHdpemFyZCBwYWdlcy4KLQlwcm90ZWN0ZWQgUHVibGlzaENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2Ugc2VsZWN0Q29uZmlnUGFnZTsKLQotCXByb3RlY3RlZCBQdWJsaXNoQ29uZmlnUHVibGlzaE9wdGlvbnNQYWdlIHB1Ymxpc2hPcHRpb25zUGFnZTsKLQotCXByaXZhdGUgTWFwIGNvbmZpZ1Byb2Nlc3NwYWdlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hDb25maWd1cmF0aW9uV2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ1dpemFyZF90aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIAlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvd2l6YmFuL1B1Ymxpc2hDb25maWd1cmF0aW9uLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwdWJsaXNoIG9wdGlvbnMKLQkgKiBAcmV0dXJuIFB1Ymxpc2hPcHRpb25zCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcHRpb25zIGdldFB1Ymxpc2hPcHRpb25zKCkgewotCQlpZiAoIHN1cGVyLmRhdGFNb2RlbCA9PSBudWxsICkgewotCQkJc3VwZXIuZGF0YU1vZGVsID0gbmV3IFB1Ymxpc2hPcHRpb25zKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5kYXRhTW9kZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLmFkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcigpOwotCi0JCXNlbGVjdENvbmZpZ1BhZ2UgPSBuZXcgUHVibGlzaENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UoCi0JCQkJIlB1Ymxpc2hDb25maWdTZWxlY3RPdmVydmlld1BhZ2UiLCBkYXRhTW9kZWwpOyAvLyROT04tTkxTLTEkCi0JCXNlbGVjdENvbmZpZ1BhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcik7Ci0JCWFkZFBhZ2Uoc2VsZWN0Q29uZmlnUGFnZSk7Ci0KLQkJcHVibGlzaE9wdGlvbnNQYWdlID0gbmV3IFB1Ymxpc2hDb25maWdQdWJsaXNoT3B0aW9uc1BhZ2UoCi0JCQkJIlB1Ymxpc2hDb25maWdQdWJsaXNoT3B0aW9uc1BhZ2UiLCBkYXRhTW9kZWwpOyAvLyROT04tTkxTLTEkCi0JCXB1Ymxpc2hPcHRpb25zUGFnZS5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yKTsKLQkJYWRkUGFnZShwdWJsaXNoT3B0aW9uc1BhZ2UpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgc2VsZWN0IHByb2Nlc3Mgdml6d3JkIHBhZ2UKLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnTmFtZSBTdHJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIAotCSAqIEByZXR1cm4gSVdpemFyZFBhZ2UKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0U2VsUHJvY2Vzc1BhZ2UoU3RyaW5nIGNvbmZpZ05hbWUpIHsKLQotCQlQdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2Ugc2VsZWN0UHJvY2Vzc1BhZ2UgPSAoUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlKSBjb25maWdQcm9jZXNzcGFnZU1hcAotCQkJCS5nZXQoY29uZmlnTmFtZSk7Ci0KLQkJaWYgKHNlbGVjdFByb2Nlc3NQYWdlID09IG51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvd2l6YmFuL1B1Ymxpc2hDb25maWd1cmF0aW9uLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCXNlbGVjdFByb2Nlc3NQYWdlID0gbmV3IFB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZSgKLQkJCQkJIlB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZSIsIGRhdGFNb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQkJCXNlbGVjdENvbmZpZ1BhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcik7Ci0JCQlhZGRQYWdlKHNlbGVjdFByb2Nlc3NQYWdlKTsKLQotCQkJY29uZmlnUHJvY2Vzc3BhZ2VNYXAucHV0KGNvbmZpZ05hbWUsIHNlbGVjdFByb2Nlc3NQYWdlKTsKLQkJfQotCi0JCXJldHVybiBzZWxlY3RQcm9jZXNzUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG5leHQgcGFnZSBmb3IgdGhlIGdpdmVuIHBhZ2UKLQkgKiBAcGFyYW0gcGFnZSBJV2l6YXJkUGFnZQotCSAqIEByZXR1cm4gSVdpemFyZFBhZ2UKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlpZiAocGFnZSA9PSBzZWxlY3RDb25maWdQYWdlKSB7Ci0JCQlpZiAoZGF0YU1vZGVsLmdldFNlbGVjdGVkQ29uZmlnKCkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBjb25maWdOYW1lID0gZGF0YU1vZGVsLmdldFNlbGVjdGVkQ29uZmlnKCk7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGNvbmZpZ05hbWUpOwotCQkJCUxpc3QgcHJvY3MgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldEFsbFByb2Nlc3Nlcyhjb25maWcpOwotCQkJCWlmIChwcm9jcyAhPSBudWxsICYmIHByb2NzLnNpemUoKSA+IDApIHsKLQkJCQkJcmV0dXJuIGdldFNlbFByb2Nlc3NQYWdlKGNvbmZpZ05hbWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCSgoQmFzZVdpemFyZFBhZ2UpcHVibGlzaE9wdGlvbnNQYWdlKS5vbkVudGVyUGFnZSgKLQkJCQkJCQlzdXBlci5kYXRhTW9kZWwuZ2V0U2VsZWN0ZWRDb25maWcoKSk7Ci0JCQkJCXJldHVybiBwdWJsaXNoT3B0aW9uc1BhZ2U7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSBpZiAocGFnZSA9PSBwdWJsaXNoT3B0aW9uc1BhZ2UpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJKChCYXNlV2l6YXJkUGFnZSlwdWJsaXNoT3B0aW9uc1BhZ2UpLm9uRW50ZXJQYWdlKAotCQkJCQlzdXBlci5kYXRhTW9kZWwuZ2V0U2VsZWN0ZWRDb25maWcoKSk7Ci0JCQlyZXR1cm4gcHVibGlzaE9wdGlvbnNQYWdlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJcmV0dXJuICh0aGlzLmdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgPT0gcHVibGlzaE9wdGlvbnNQYWdlICYmIHB1Ymxpc2hPcHRpb25zUGFnZQotCQkJCS5pc1BhZ2VDb21wbGV0ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWRhdGFNb2RlbCA9IHB1Ymxpc2hPcHRpb25zUGFnZS5nZXRQdWJsaXNoaW5nT3B0aW9ucygpOwotCQlib29sZWFuIGFuc3dlciA9IGNoZWNrQW5kQ3JlYXRlRGlyKGRhdGFNb2RlbC5wdWJsaWNhdGlvblBhdGgpOwotCQlpZiAoYW5zd2VyKSB7Ci0JCQlkYXRhTW9kZWwuc2V0RmluaXNoUHJlc3NlZCh0cnVlKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFB1Ymxpc2hQYXRoKGRhdGFNb2RlbC5nZXRTZWxlY3RlZENvbmZpZygpLGRhdGFNb2RlbAotCQkJCQkuZ2V0UHVibGljYXRpb25QYXRoKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0VGl0bGUoZGF0YU1vZGVsLmdldFNlbGVjdGVkQ29uZmlnKCksZGF0YU1vZGVsLmdldFRpdGxlKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0QmFubmVySW1hZ2UoZGF0YU1vZGVsLmdldFNlbGVjdGVkQ29uZmlnKCksZGF0YU1vZGVsLmdldEJhbm5lckltYWdlKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0QWJvdXRIVE1MKGRhdGFNb2RlbC5nZXRTZWxlY3RlZENvbmZpZygpLGRhdGFNb2RlbC5nZXRBYm91dEhUTUwoKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRGZWVkYmFja1VSTChkYXRhTW9kZWwuZ2V0U2VsZWN0ZWRDb25maWcoKSxkYXRhTW9kZWwuZ2V0RmVlZGJhY2tVUkwoKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRJbmNsdWRlR2xvc3NhcnkoZGF0YU1vZGVsLmdldFNlbGVjdGVkQ29uZmlnKCksZGF0YU1vZGVsCi0JCQkJCS5pc0dlbmVyYXRlR2xvc3NhcnkoKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCQkuc2V0SW5jbHVkZUluZGV4KGRhdGFNb2RlbC5nZXRTZWxlY3RlZENvbmZpZygpLGRhdGFNb2RlbC5pc0dlbmVyYXRlSW5kZXgoKSk7Ci0vLwkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldEluY2x1ZGVTZWFyY2goZGF0YU1vZGVsCi0vLwkJCQkJLmlzR2VuZXJhdGVTZWFyY2hEQigpKTsKLS8vCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0SW5jbHVkZVByb2Nlc3NDdXN0b21pemF0aW9uKGRhdGFNb2RlbAotLy8JCQkJCS5pc1VzZUFwcGxldCgpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldENoZWNrRXh0ZXJuYWxMaW5rcyhkYXRhTW9kZWwuZ2V0U2VsZWN0ZWRDb25maWcoKSxkYXRhTW9kZWwKLQkJCQkJLmlzQ2hlY2tFeHRMaW5rcygpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldENvbnZlcnRCcm9rZW5MaW5rcyhkYXRhTW9kZWwuZ2V0U2VsZWN0ZWRDb25maWcoKSxkYXRhTW9kZWwuaXNDb252ZXJ0QnJva2VuTGlua3MoKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRMaWdodFdlaWdodFRyZWUoZGF0YU1vZGVsLmdldFNlbGVjdGVkQ29uZmlnKCksZGF0YU1vZGVsLmlzR2VuZXJhdGVMaWdodFdlaWdodFRyZWUoKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRFeHRyYURlc2NyaXB0b3JJbmZvKGRhdGFNb2RlbC5nZXRTZWxlY3RlZENvbmZpZygpLGRhdGFNb2RlbC5pc1Nob3dFeHRyYURlc2NyaXB0b3JJbmZvKCkpOwotCQkJCi0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZChkYXRhTW9kZWwuZ2V0U2VsZWN0ZWRDb25maWcoKSwgCi0JCQkJCWRhdGFNb2RlbC5pc0F1dG9HZW5lcmF0ZUFjdGl2aXR5RGlhZ3JhbXMoKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihkYXRhTW9kZWwuZ2V0U2VsZWN0ZWRDb25maWcoKSwgCi0JCQkJCWRhdGFNb2RlbC5pc1Vub3BlbkV4dGVuZGVkQWN0aXZpdHlEaWFncmFtKCkpOwotCQkJCi0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zYXZlQWxsUHJlZmVyZW5jZXMoKTsKLQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLnNhdmVBbGxQcmVmZXJlbmNlcygpOwotCQkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlkYXRhTW9kZWwuc2V0RmluaXNoUHJlc3NlZChmYWxzZSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1DYW5jZWwoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0JCWRhdGFNb2RlbC5zZXRGaW5pc2hQcmVzc2VkKGZhbHNlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGFuZCBjcmVhdGVzIHRoZSBkZXN0aW5hdGlvbiBwYXRoLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrQW5kQ3JlYXRlRGlyKFN0cmluZyBkaXIpIHsKLQkJU3RyaW5nIGRlZmF1bHRQdWJsaXNoUGF0aCA9IFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldERlZmF1bHRQdWJsaXNoUGF0aCgpOwotCQlib29sZWFuIGFuc3dlciA9IGZhbHNlOwotCi0JCUlQYXRoIGVjUGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKGRpcik7Ci0JCWlmICghZWNQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJU3RyaW5nIHBhdGggPSBkZWZhdWx0UHVibGlzaFBhdGgKLQkJCQkJKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIikgKyBkaXI7IC8vJE5PTi1OTFMtMSQKLQkJCWFuc3dlciA9IFB1Ymxpc2hpbmdVSVBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5jb25maXJtUGF0aERpYWxvZ190ZXh0LCBwYXRoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGFuc3dlcikgewotCQkJCWRhdGFNb2RlbC5zZXRQdWJsaWNhdGlvblBhdGgoZGlyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyKTsKLQotCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJCWlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCQlhbnN3ZXIgPSBQdWJsaXNoaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5vdmVyd3JpdGVEaWFsb2dfdGV4dCwgZGlyKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWlmIChhbnN3ZXIgPT0gdHJ1ZSkgewotCQkJCQl0cnkgewotCQkJCQkJYW5zd2VyID0gRmlsZVV0aWwKLQkJCQkJCQkJLmRlbGV0ZUFsbEZpbGVzKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQkJaWYgKGFuc3dlciA9PSBmYWxzZSkgewotCQkJCQkJCVB1Ymxpc2hpbmdVSVBsdWdpbgotCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2Fubm90UHVibGlzaEVycm9yX21zZywgLy8kTk9OLU5MUy0xJAkJCQkJCQkKLQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uLCBkaXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2Fubm90UHVibGlzaEVycm9yX21zZywgLy8kTk9OLU5MUy0xJAkJCQkJCQkKLQkJCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZChQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZGVsZXRlRmlsZXNFcnJvcl9yZWFzb24sIGRpciksIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlhbnN3ZXIgPSBmaWxlLm1rZGlycygpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNhbm5vdFB1Ymxpc2hFcnJvcl9tc2csIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNyZWF0ZURpckVycm9yX3JlYXNvbiwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKCFhbnN3ZXIpIHsKLQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNhbm5vdFB1Ymxpc2hFcnJvcl9tc2csIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNyZWF0ZURpckVycm9yX3JlYXNvbiwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGFuc3dlcjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy93aXphcmRzL1B1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZmI0MGQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5OZXdBY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0Vmlld0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIFRoZSBwdWJsaXNoIGNvbmZpZ3VyYXRpb24gcHJvZ3Jlc3MgZGlhbG9nLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGV4dGVuZHMgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGRpYWdyYW1WaWV3ZXJIb2xkZXI7Ci0KLQlwcml2YXRlIEFic3RyYWN0Vmlld0J1aWxkZXIgdmlld0J1aWxkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKFNoZWxsIHBhcmVudCwKLQkJCUFic3RyYWN0Vmlld0J1aWxkZXIgdmlld0J1aWxkZXIpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy52aWV3QnVpbGRlciA9IHZpZXdCdWlsZGVyOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGN0cmwgPSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJaWYgKHZpZXdCdWlsZGVyICE9IG51bGwpIHsKLQkJCS8vIENyZWF0ZSB0aGUgZGlhZ3JhbSB2aWV3ZXIgaG9sZGVyIGFuZCB0aGUgZGlhZ3JhbSBzZXJ2aWNlLgotCQkJZGlhZ3JhbVZpZXdlckhvbGRlciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlkaWFncmFtVmlld2VySG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDEsIDEpKTsKLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJZGlhZ3JhbVZpZXdlckhvbGRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQkJRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWdyID0gdmlld0J1aWxkZXIuZ2V0TGF5b3V0TWdyKCk7Ci0JCQlTdHJpbmcgbmV3RGlhZ3JhbXMgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKCJQVUJMSVNIX05FV19ESUFHUkFNIik7Ci0JCQlCb29sZWFuIG5ld0RpYWdyYW0gPSBuZXcgQm9vbGVhbihuZXdEaWFncmFtcyk7Ci0JCQlpZiAobmV3RGlhZ3JhbS5ib29sZWFuVmFsdWUoKSkgewotCQkJCU5ld0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVNlcnZpY2UgPSBuZXcgTmV3QWN0aXZpdHlEaWFncmFtU2VydmljZSgKLQkJCQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIsCi0JCQkJCQluZXcgRmlsZShsYXlvdXRNZ3IuZ2V0UHVibGlzaERpcigpKSk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaGVkVW5DcmVhdGVkQUREKHZpZXdCdWlsZGVyCi0JCQkJCQkuZ2V0T3B0aW9ucygpLmlzQXV0b0dlbmVyYXRlQWN0aXZpdHlEaWFncmFtcygpKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbih2aWV3QnVpbGRlcgotCQkJCQkJLmdldE9wdGlvbnMoKS5pc1Vub3BlbkV4dGVuZGVkQWN0aXZpdHlEaWFncmFtKCkpOwotCQkJCWxheW91dE1nci5zZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKGRpYWdyYW1TZXJ2aWNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQWN0aXZpdHlEaWFncmFtU2VydmljZSBkaWFncmFtU2VydmljZSA9IG5ldyBBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKAotCQkJCQkJZGlhZ3JhbVZpZXdlckhvbGRlciwKLQkJCQkJCW5ldyBGaWxlKGxheW91dE1nci5nZXRQdWJsaXNoRGlyKCkpKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoZWRVbkNyZWF0ZWRBREQodmlld0J1aWxkZXIKLQkJCQkJCS5nZXRPcHRpb25zKCkuaXNBdXRvR2VuZXJhdGVBY3Rpdml0eURpYWdyYW1zKCkpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKHZpZXdCdWlsZGVyCi0JCQkJCQkuZ2V0T3B0aW9ucygpLmlzVW5vcGVuRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW0oKSk7Ci0JCQkJbGF5b3V0TWdyLnNldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoZGlhZ3JhbVNlcnZpY2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGN0cmw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy93aXphcmRzL1B1Ymxpc2hpbmdPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvUHVibGlzaGluZ09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODM4YTc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvUHVibGlzaGluZ09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1Jlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0Vmlld0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS5Qcm9ncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBQZXJmb3JtcyB0aGUgcmVhbCB3b3JrIG9mIHB1Ymxpc2hpbmcgYSBNZXRob2QgQ29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGluZ09wZXJhdGlvbiBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfRVJST1JfVElUTEUgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0VSUk9SX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfRVJST1JfUkVBU09OID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb247IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVWSUVXX0NPTkZJR19FUlJPUl9USVRMRSA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wcmV2aWV3Q29uZmlnRXJyb3JfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVWSUVXX0NPTkZJR19FUlJPUl9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHJldmlld0NvbmZpZ0Vycm9yX21zZzsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfUkVQT1JUX0VSUk9SX1RJVExFID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnZpZXdSZXBvcnRFcnJvcl90aXRsZTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfUkVQT1JUX0VSUk9SX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy52aWV3UmVwb3J0RXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fQlJPV1NFUl9FUlJPUl9SRUFTT04gPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMub3BlbkJyb3dzZXJFcnJvcl9yZWFzb247IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19DQU5DRUxfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNhbmNlbFB1Ymxpc2hDb25maWdfbXNnOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1ncjsKLQotCXByaXZhdGUgU3RyaW5nIHB1Ymxpc2hlZF91cmw7Ci0KLQlwcml2YXRlIFN0cmluZyByZXBvcnRfdXJsOwotCi0JcHJpdmF0ZSBNc2dEaWFsb2cgbXNnRGlhbG9nOwotCi0JcHJpdmF0ZSBFeGNlcHRpb24gcnVuRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaGluZ09wZXJhdGlvbihBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hNZ3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wdWJsaXNoTWdyID0gcHVibGlzaE1ncjsKLQkJdGhpcy5tc2dEaWFsb2cgPSBQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdmlldyBidWlsZGVyLgotCSAqIAotCSAqIEByZXR1cm4gQWJzdHJhY3RWaWV3QnVpbGRlcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFZpZXdCdWlsZGVyIGdldFZpZXdCdWlsZGVyKCkgewotCQlyZXR1cm4gdGhpcy5wdWJsaXNoTWdyLmdldFZpZXdCdWlsZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB1cmwgZm9yIHRoZSBwdWJsaXNoZWQgc2l0ZQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoZWRVcmwoKSB7Ci0JCXJldHVybiBwdWJsaXNoZWRfdXJsOwotCX0KLQotCS8qKgotCSAqIHJ1biB0aGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gdGhlIHB1Ymxpc2hpbmcgdGFzay4KLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJ1bkV4Y2VwdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb25pdG9yLnNldFRhc2tOYW1lKFB1Ymxpc2hpbmdSZXNvdXJjZXMucHVibGlzaGluZ0NvbmZpZ3VyYXRpb25UYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCQkJCi0JCQlwdWJsaXNoTWdyLnB1Ymxpc2gobW9uaXRvcik7Ci0KLQkJCXB1Ymxpc2hlZF91cmwgPSBwdWJsaXNoTWdyLmdldFB1Ymxpc2hlZFVybCgpOwotCQkJcmVwb3J0X3VybCA9IHB1Ymxpc2hNZ3IuZ2V0UHVibGlzaFJlcG9ydFVybCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcnVuRXhjZXB0aW9uID0gZTsKLQkJfQotCi0JCWZpbmFsIGJvb2xlYW4gY2FuY2VsZWQgPSBtb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGNhbmNlbGVkKSB7Ci0JCQkJCW1zZ0RpYWxvZy5kaXNwbGF5SW5mbyhQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSwKLQkJCQkJCQlQVUJMSVNIX0NPTkZJR19DQU5DRUxfTVNHKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChwdWJsaXNoZWRfdXJsID09IG51bGwgfHwgcmVwb3J0X3VybCA9PSBudWxsKSB7Ci0JCQkJCW1zZ0RpYWxvZy5kaXNwbGF5RXJyb3IoUFVCTElTSF9DT05GSUdfRVJST1JfVElUTEUsCi0JCQkJCQkJUFVCTElTSF9DT05GSUdfRVJST1JfTVNHLAotCQkJCQkJCVBVQkxJU0hfQ09ORklHX0VSUk9SX1JFQVNPTiwgcnVuRXhjZXB0aW9uKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIExhdW5jaCBhIEhUTUwgYnJvd3NlciB0byB2aWV3IHRoZSBwdWJsaXNoZWQgc2l0ZS4KLQkJCQlpZiAob3BlbkJyb3dzZXIocHVibGlzaGVkX3VybCkgPT0gZmFsc2UpIHsKLQkJCQkJU3RyaW5nIHJlYXNvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCU9QRU5fQlJPV1NFUl9FUlJPUl9SRUFTT04sCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgcHVibGlzaGVkX3VybCB9KTsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihQUkVWSUVXX0NPTkZJR19FUlJPUl9USVRMRSwKLQkJCQkJCQlQUkVWSUVXX0NPTkZJR19FUlJPUl9NU0csIHJlYXNvbik7Ci0JCQkJfQotCi0JCQkJLy8gTGF1bmNoIGEgSFRNTCBicm93c2VyIHRvIHZpZXcgdGhlIHJlcG9ydCBvbiB0aGUgcHVibGlzaGVkCi0JCQkJLy8gc2l0ZS4KLQkJCQlpZiAob3BlbkJyb3dzZXIocmVwb3J0X3VybCkgPT0gZmFsc2UpIHsKLQkJCQkJU3RyaW5nIHJlYXNvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCU9QRU5fQlJPV1NFUl9FUlJPUl9SRUFTT04sCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgcmVwb3J0X3VybCB9KTsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihWSUVXX1JFUE9SVF9FUlJPUl9USVRMRSwKLQkJCQkJCQlWSUVXX1JFUE9SVF9FUlJPUl9NU0csIHJlYXNvbik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIGEgYnJvd3NlciB0byBzaG93IHRoZSBwdWJsaXNoZWQgY29udGVudC4KLQkgKiBAcGFyYW0gdXJsIFN0cmluZyB0aGUgc2l0ZSB1cmwKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBicm93c2VyIG9wZW5lZCBzdWNjZXNzZnVsbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gb3BlbkJyb3dzZXIoZmluYWwgU3RyaW5nIHVybCkgewotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCS8vIExhdW5jaCB0aGUgZGVmYXVsdCBIVE1MIHZpZXdlciB0byBkaXNwbGF5IHRoZSBIVE1MIHBhZ2UuCi0JCQkvLyBPbiBMaW51eCwgdGhpcyBjYW4ndCBsYXVuY2ggdXJscywgb25seSBsb2NhbCBmaWxlcyBjYW4gYmUKLQkJCS8vIGxhdW5jaGVkLgotCQkJLy8gU29ycnkgSSBoYXZlIHVzZSBpbnRlcm5hbCBjbGFzcyBoZXJlLgotCQkJLy8gaG9wZSBFY2xpcHNlLm9yZyBjYW4gaGF2ZSBhIHB1YmxpYyBhcGkgdG8gZG8gc28uCi0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdWNjZXNzID0gUHJvZ3JhbS5sYXVuY2godXJsKTsKLQkJCX0gZWxzZSB7Ci0vLwkJCQlJQnJvd3NlciBicm93c2VyID0gb3JnLmVjbGlwc2UuaGVscC5pbnRlcm5hbC5icm93c2VyLkJyb3dzZXJNYW5hZ2VyCi0vLwkJCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUJyb3dzZXIodHJ1ZSk7Ci0vLwkJCQlpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0vLwkJCQkJdHJ5IHsKLS8vCQkJCQkJYnJvd3Nlci5kaXNwbGF5VVJMKHVybCk7Ci0vLwkJCQkJCXN1Y2Nlc3MgPSB0cnVlOwotLy8JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCQotCQkJCS8vIDE1NTQ5MCAtIENhbm5vdCBkZXRlY3RlZCBkZWZhdWx0IGJyb3dzZXIgd2hlbiBwcmV2aWV3IHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIG9uIExpbnV4Ci0JCQkJLy8gY2hhbmdlZCB0byB1c2Ugc3d0IGJyb3dzZXIKLQkJCQlzdWNjZXNzID0gdHJ1ZTsKLQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLQkJCQl7Ci0JCQkJICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0JCQkJCXsKLS8vCQkJCQkJCS8vIG9wZW4gYW5vdGhlciBzd3QgYnJvd3NlciBzaW5jZSB3ZSBoYXZlIG5vIChzaW1wbGUpIHdheSBvZiBjcmVhdGluZyBhIHN5c3RlbSBkZWZhdWx0IGJyb3dzZXIKLS8vCQkJCQkJCS8vIHRoZSBFY2xpcHNlIGd1eXMgaGlkZSBhbGwgdGhlIGdvb2QgYXBpcyBhcyBpbnRlcm5hbAotCQkJCQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JCQkJCQkJc2hlbGwuc2V0VGV4dCh1cmwpOwotCQkJCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCQkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCQkJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJCQkJCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCQkJCQkJCUJyb3dzZXIgcG9wdXBfYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQkJCQkJcG9wdXBfYnJvd3Nlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEh8R3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMfEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQkJCQkJCQlwb3B1cF9icm93c2VyLnNldFVybCh1cmwpOwkJCQkJCQkJCQkJCQkJCi0JCQkJCQkJc2hlbGwub3BlbigpOwotCQkJCQl9Ci0JCQkJfSk7CQkJCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJc3VjY2VzcyA9IGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvd2l6YXJkcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGZjODQ4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpemFyZHMgZm9yIHB1Ymxpc2hpbmcgYSBtZXRob2QgY29uZmlndXJhdGlvbiBhbmQgcHJvY2Vzcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZGYwZjQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNDUxODNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yY3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Yzk5MDg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQuaW5pIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjA0ZjRmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWZlYXR1cmVUZXh0Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1hcHBsaWNhdGlvbl8zMi5naWYKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi1hcHBOYW1lPSVmZWF0dXJlTmFtZQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLXdlbGNvbWVQYWdlPSRubCQvd2VsY29tZS54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5tYXBwaW5ncyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWNhOTUyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLSMgVXN1YWxseSBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZS4KLQotMD1AYnVpbGRJZEAKLTE9MS4yLjAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1MjkwOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ1aWxkIExhYmVsOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG5cCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2FwcGxpY2F0aW9uXzMyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hcHBsaWNhdGlvbl8zMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2FwcGxpY2F0aW9uXzMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjY2VjNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYXBwbGljYXRpb25fMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHdlbGNvbWUueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViOWZlMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgUkNQIEZlYXR1cmUKLWZlYXR1cmVQbHVnaW5OYW1lTkw9RVBGIFJDUCBGZWF0dXJlIChOTDEpCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3Avd2VsY29tZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3Avd2VsY29tZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI2NDBkMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3dlbGNvbWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08d2VsY29tZVBhZ2UgCi0JdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiPgotCi08aW50cm8+V2VsY29tZSB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrCi08L2ludHJvPgotCi08aXRlbT48Yj5XaGF0IGlzIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms/PC9iPgotCQotPC9pdGVtPgotCi08aXRlbT48Yj5MZWFybiBNb3JlPC9iPgotCi08L2l0ZW0+Ci0KLTwvd2VsY29tZVBhZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGM0ZjIwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwZGQ4OTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIFJpY2ggVGV4dCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGI3OWE3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjBlYTkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dAotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogcmljaHRleHQuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24sCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LAotIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLAotIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5wcmVmZXJlbmNlcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmZmJmOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXNvdXJjZS5yaWNodGV4dC5qYXIgPSBzcmMvCi1vdXRwdXQucmljaHRleHQuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcmljaHRleHQuamFyLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcnRlLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRJbWFnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkSW1hZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzA4YThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRJbWFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkTGluay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiMTExOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZExpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRPcmRlcmVkTGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY5YWU0MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRUYWJsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkVGFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMDg4NDYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRUYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkVW5vcmRlcmVkTGlzdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkVW5vcmRlcmVkTGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljNDRlYzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZFVub3JkZXJlZExpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0JvbGQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0JvbGQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZGM1OTg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9Cb2xkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9DbGVhckNvbnRlbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0NsZWFyQ29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlmZjY0MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0NsZWFyQ29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ29weS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ29weS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5YmM2NWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0NvcHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0N1dC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmQ0MzE0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9GaW5kUmVwbGFjZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvRmluZFJlcGxhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOGY4ODcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9GaW5kUmVwbGFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvSW5kZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9JbmRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzZlMTUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9JbmRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0l0YWxpYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvSXRhbGljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzliNWE0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvSXRhbGljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9PdXRkZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9PdXRkZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWRjZGEzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvT3V0ZGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvUGFzdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1Bhc3RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWM3NjY4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvUGFzdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1N1YnNjcmlwdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvU3Vic2NyaXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTdiMzFhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvU3Vic2NyaXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9TdXBlcnNjcmlwdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvU3VwZXJzY3JpcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNGIyNjZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9TdXBlcnNjcmlwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvVW5kZXJsaW5lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9VbmRlcmxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMmE5NjQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9VbmRlcmxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZEltYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRJbWFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA1NDUyMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZEltYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRMaW5lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRMaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2YwOGRjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkTGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkTGluay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5OTE5NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZExpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRPcmRlcmVkTGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI2ODE0YzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRUYWJsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkVGFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzY4ODU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRUYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkVW5vcmRlcmVkTGlzdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkVW5vcmRlcmVkTGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0ZmRmYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZFVub3JkZXJlZExpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0JvbGQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0JvbGQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGRmOWU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9Cb2xkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9DbGVhckNvbnRlbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0NsZWFyQ29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NTgzMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0NsZWFyQ29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ29weS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ29weS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzMmFjZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0NvcHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0N1dC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2U4NjM1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9GaW5kUmVwbGFjZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvRmluZFJlcGxhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMTI1N2VjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9GaW5kUmVwbGFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSW5kZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9JbmRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ODE5NWQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9JbmRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0l0YWxpYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSXRhbGljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQwY2QxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSXRhbGljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5Q2VudGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5Q2VudGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWVhYmYwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUNlbnRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUZ1bGwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlGdWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTkwYTNiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUZ1bGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlMZWZ0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5TGVmdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4NTQ2OWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlMZWZ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5UmlnaHQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlSaWdodC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDVhZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlSaWdodC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvT3V0ZGVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvT3V0ZGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwNmI5NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L091dGRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1Bhc3RlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9QYXN0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0ZDM5YTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1Bhc3RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdHJpa2VUaHJvdWdoLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdHJpa2VUaHJvdWdoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTEwMzU0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvU3RyaWtlVGhyb3VnaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvU3Vic2NyaXB0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdWJzY3JpcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYzBmNzEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdWJzY3JpcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N1cGVyc2NyaXB0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdXBlcnNjcmlwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyODY2MzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N1cGVyc2NyaXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9VbmRlcmxpbmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1VuZGVybGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2NDc2ZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1VuZGVybGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvdGlkeS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvdGlkeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1ZWRlYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L3RpZHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTM3MzI2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgUmljaCBUZXh0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUaGUgSFRNTCBmaWxlIHVzZWQgdG8gcmVuZGVyIHRoZSBSaWNoIFRleHQgRWRpdG9yLgotUmljaFRleHQuZWRpdG9ySFRNTD1ydGUuaHRtCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlNDliNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL2JsYW5rLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ibGFuay5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdkOTcyN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL2JsYW5rLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPHRpdGxlPjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuY3NzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyODhkZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw1MTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi1ib2R5Ci17Ci0JYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotIAlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAJZm9udC1zaXplOiAxMHB0OwotCW1hcmdpbjogM3B4OwotCXBhZGRpbmc6IDBweDsgCQotfQotCi1wCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotfQotCi1oMQotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogbGFyZ2U7Ci19Ci0KLWgyCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNTAlOwotfQotCi1oMwotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotfQotCi1oNCwgaDUsIGg2Ci17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLWE6bGluawotewotCWNvbG9yOiAjMDAzMzk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWE6YWN0aXZlCi17Ci0JY29sb3I6ICMwMDMzOTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hOnZpc2l0ZWQKLXsKLQljb2xvcjogIzAwMzM5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hOmhvdmVyCi17Ci0JY29sb3I6ICNmZjAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1vbAotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7Ci0JbWFyZ2luLWxlZnQ6IDMwcHg7Ci19Ci0KLW9sIGxpCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtYWxpZ246IGxlZnQKLX0KLQotdWwKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JbGlzdC1zdHlsZS10eXBlOiBkaXNjOwotCW1hcmdpbi1sZWZ0OiAzMHB4OwotCW1hcmdpbi10b3A6IDVweDsKLX0KLQotdWwgbGkKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotdGFibGUKLXsKLQliYWNrZ3JvdW5kLWltYWdlOiBub25lOwotCWJhY2tncm91bmQ6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwkKLX0KLQotdGJvZHkKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdmFsaWduOiBiYXNlbGluZTsKLX0KLQotdGgKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotdGQKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXRkIHVsCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCW1hcmdpbi1ib3R0b206IDBweDsKLQltYXJnaW4tbGVmdDogMzBweDsKLX0KLQotLnBhZ2VUaXRsZQotewotCWJhY2tncm91bmQ6ICM5OTk5Y2M7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JcGFkZGluZy1sZWZ0OiAxMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDVweDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0ucGFnZVRpdGxlU2VwYXJhdG9yCi17Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLQlwYWRkaW5nOiAwcHg7Ci19Ci0KLS50YWIKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNWM4MWE3OwotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uYWN0aXZlVGFiCi17Ci0JYmFja2dyb3VuZC1jb2xvcjogI2M4ZDdlMzsKLQljb2xvcjogIzI5M2Q2YjsJCi0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWEudGFiOmxpbmssIGEudGFiOmFjdGl2ZSwgYS50YWI6dmlzaXRlZAotewotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1hLnRhYjpob3ZlcgotewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwkKLX0KLQotLm92ZXJ2aWV3Ci17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JcGFkZGluZy1ib3R0b206IDEwcHg7Ci0JcGFkZGluZy1sZWZ0OiAyMHB4OwotCXBhZGRpbmctcmlnaHQ6IDBweDsKLQlwYWRkaW5nLXRvcDogMTBweDsKLX0KLQotLm92ZXJ2aWV3VGFibGUKLXsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotCXdpZHRoOiAxMDAlOwkKLX0KLQotLm92ZXJ2aWV3VGFibGUgdGQKLXsKLQlwYWRkaW5nLWJvdHRvbTogNXB4OwotCXBhZGRpbmctbGVmdDogNXB4OwotCXBhZGRpbmctcmlnaHQ6IDVweDsKLQlwYWRkaW5nLXRvcDogNXB4OwotfQotCi0ub3ZlcnZpZXdTZXBhcmF0b3IKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotCXBhZGRpbmc6IDBweDsKLX0KLQotLmV4cGFuZENvbGxhcHNlVGV4dAotewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlwYWRkaW5nLWxlZnQ6IDVweDsKLQlwYWRkaW5nLXJpZ2h0OiA1cHg7Ci19Ci0KLS5leHBhbmRDb2xsYXBzZUxpbmsKLXsKLQljb2xvcjogIzMzMzMzMzsKLQlwYWRkaW5nLWJvdHRvbTogNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmV4cGFuZENvbGxhcHNlTGluazpob3ZlcgotewotCWNvbG9yOiAjMDAwMGZmOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uZXhwYW5kQ29sbGFwc2VMaW5rOnZpc2l0ZWQKLXsKLQljb2xvcjogIzMzMzMzMzsKLX0KLQotLnNlY3Rpb25IZWFkaW5nCi17Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk4YjFjNDsKLQljb2xvcjogI2ZmZmZmZjsKLQljdXJzb3I6IGhhbmQ7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXBhZGRpbmctYm90dG9tOiAycHg7Ci0JcGFkZGluZy1sZWZ0OiAycHg7Ci0JcGFkZGluZy10b3A6IDJweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5zZWN0aW9uQ29udGVudAotewotCXBhZGRpbmctYm90dG9tOiAwcHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLS5zZWN0aW9uVGFibGUKLXsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDFweDsKLQlwYWRkaW5nLWJvdHRvbTogMTBweDsKLQlwYWRkaW5nLWxlZnQ6IDEwcHg7Ci0JcGFkZGluZy1yaWdodDogMTBweDsKLQlwYWRkaW5nLXRvcDogMTBweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLnNlY3Rpb25UYWJsZUhlYWRpbmcKLXsKLQliYWNrZ3JvdW5kOiAjZWVlOwotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCWNvbG9yOiAjMzMzMzMzOwotCWhlaWdodDogMjA7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl3aWR0aDogMjAlOwotfQotCi0uc2VjdGlvblRhYmxlQ2VsbAotewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotfQotCi0uYnJlYWtkb3duVGFibGUKLXsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDFweDsKLQlwYWRkaW5nLWJvdHRvbTogMHB4OwotCXBhZGRpbmctbGVmdDogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDBweDsKLQlwYWRkaW5nLXRvcDogMHB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0uYnJlYWtkb3duVGFibGUgdGgKLXsKLQliYWNrZ3JvdW5kOiAjZWVlOwotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCWNvbG9yOiAjMzMzMzMzOwotCWhlaWdodDogMjA7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotLmJyZWFrZG93blRhYmxlIHRkCi17Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci19Ci0KLS5kZWZhdWx0VGFibGUKLXsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLQlwYWRkaW5nLWJvdHRvbTogMHB4OwotCXBhZGRpbmctbGVmdDogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDBweDsKLQlwYWRkaW5nLXRvcDogMHB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0uZGVmYXVsdFRhYmxlIHRkCi17Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotLnN1YlNlY3Rpb25IZWFkaW5nCi17Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnN1YlNlY3Rpb25Db250ZW50Ci17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS5zdGVwSGVhZGluZwotewotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0JY29sb3I6ICMyOTNkNmI7Ci0JY3Vyc29yOiBoYW5kOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQlwYWRkaW5nLWJvdHRvbTogMnB4OwotCXBhZGRpbmctbGVmdDogMnB4OwotCXBhZGRpbmctdG9wOiAycHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uc3RlcENvbnRlbnQKLXsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLQlwYWRkaW5nLWJvdHRvbTogNXB4OwotCXBhZGRpbmctbGVmdDogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDBweDsKLQlwYWRkaW5nLXRvcDogMHB4OwotCXRleHQtYWxpZ246IHJpZ2h0OwotfQotCi0uc3RlcFRhYmxlCi17Ci0JYm9yZGVyLWJvdHRvbTogIzk5OTk5OSBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICM5OTk5OTkgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogIzk5OTk5OSBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogIzk5OTk5OSBzb2xpZCAwcHg7Ci0JcGFkZGluZy1ib3R0b206IDIwcHg7Ci0JcGFkZGluZy1sZWZ0OiAxMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDEwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5zdGVwVGFibGUgdGQKLXsKLQlib3JkZXI6ICNjY2Mgc29saWQgMHB4OwotfQotCi0uc3RlcFNlcGFyYXRvcgotewotCWJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7Ci0JcGFkZGluZzogMHB4OwotfQotCi0uYmFja1RvVG9wTGluawotewotCWNvbG9yOiAjZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7CQotCW1hcmdpbjogMHB4OwotCXBhZGRpbmctYm90dG9tOiAxMHB4OwotCXRleHQtYWxpZ246IG1pZGRsZTsJCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uYmFja1RvVG9wTGluazpob3ZlcgotewotCWNvbG9yOiAjOTY5OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uYmFja1RvVG9wTGluazp2aXNpdGVkCi17Ci0JY29sb3I6ICM1YzgxYTc7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotLmNvcHlyaWdodAotewotCWNvbG9yOiAjNzA4MGIwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCXBhZGRpbmctbGVmdDogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDI1cHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLnZlcnNpb25JbmZvCi17Ci0JY29sb3I6ICM3MDgwYjA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JcGFkZGluZy1sZWZ0OiAxMHB4OwotCXBhZGRpbmctcmlnaHQ6IDBweDsKLQlwYWRkaW5nLXRvcDogMjVweDsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotLnF1b3RlCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLmNvZGVTYW1wbGUKLXsKLQlmb250LWZhbWlseTogY291cmllcjsKLQlmb250LXNpemU6IDEwcHQ7CQkKLX0KLQotLmVsZW1lbnRMaW5rCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwkKLQljb2xvcjogIzAwMDBmZjsKLX0KLQotLmVsZW1lbnRMaW5rV2l0aFR5cGUKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JY29sb3I6ICMwMDAwZmY7Ci19Ci0KLS5lbGVtZW50TGlua1dpdGhVc2VyVGV4dAotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQljb2xvcjogIzAwMDBmZjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjQ1MWNiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08aHRtbD4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCTxoZWFkPgotCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0icnRlLmpzIj48L3NjcmlwdD4JCQotCTwvaGVhZD4KLQk8Ym9keSBsZWZ0TWFyZ2luPSIwIiB0b3BNYXJnaW49IjAiIG1hcmdpbmhlaWdodD0iMCIgbWFyZ2lud2lkdGg9IjAiIHNjcm9sbD0ibm8iIHN0eWxlPSJvdmVyZmxvdzogaGlkZGVuIj4KLQkJPGlmcmFtZSBpZD0icnRlIiBuYW1lPSJydGUiIHN0eWxlPSJib3JkZXI6IG5vbmU7IiBmcmFtZWJvcmRlcj0iMCIgc2Nyb2xsaW5nPSJhdXRvIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj48L2lmcmFtZT4KLQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJaW5pdEVkaXRvcigncnRlJywgJ3J0ZS5jc3MnLCBudWxsKTsKLQkJPC9zY3JpcHQ+Ci0JPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5qcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY4OTlkYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDExMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQGF1dGhvciBLZWx2aW4gTG93Ci0vLyBAc2luY2UgMS4wCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTm90ZTogTW96aWxsYS9GaXJlZm94IGRvZXMgbm90IGFsbG93IHVucHJpdmlsZWdlZCBzY3JpcHRzIHRvIGludm9rZSB0aGUgY3V0LAotLy8gY29weSBhbmQgcGFzdGUgY29tbWFuZHMuIFRoZSBKYXZhc2NyaXB0IG11c3QgZWl0aGVyIGJlIHNpZ25lZAotLy8gKHNlZSBodHRwOi8vd3d3Lm1vemlsbGEub3JnL3Byb2plY3RzL3NlY3VyaXR5L2NvbXBvbmVudHMvc2lnbmVkLXNjcmlwdHMuaHRtbCksCi0vLyBvciB0aGUgdXNlcnMgbXVzdCBjaGFuZ2UgdGhlaXIgcHJlZmVyZW5jZXMKLS8vIChzZWUgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9lZGl0b3IvbWlkYXNkZW1vL3NlY3VyaXR5cHJlZnMuaHRtbCkuCi0vLyBBbHRlcm5hdGl2ZWx5LCB0aGUgdXNlcnMgY2FuIHVzZSB0aGUgY3RybC14LCBjdHJsLWMgYW5kIGN0cmwtdiBrZXlzLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdmFyIFNUQVRVU19OT1AgPSAwOwotdmFyIFNUQVRVU19JTklUSUFMSVpFRCA9IDE7Ci12YXIgU1RBVFVTX01PRElGSUVEID0gMjsKLXZhciBTVEFUVVNfR0VUX1RFWFQgPSAzOwotdmFyIFNUQVRVU19LRVlfRE9XTiA9IDQ7Ci12YXIgU1RBVFVTX0tFWV9VUCA9IDU7Ci12YXIgU1RBVFVTX1NFTEVDVF9URVhUID0gNjsKLXZhciBTVEFUVVNfU0VMRUNUX0NPTlRST0wgPSA3OwotdmFyIFNUQVRVU19TRUxFQ1RfTk9ORSA9IDg7Ci12YXIgU1RBVFVTX0VYRUNfQ01EID0gOTsKLXZhciBTVEFUVVNfUkVGT1JNQVRfTElOS1MgPSAxMDsKLQotdmFyIEtFWV9BUlJPV19ET1dOID0gNDA7Ci12YXIgS0VZX0FSUk9XX0xFRlQgPSAzNzsKLXZhciBLRVlfQVJST1dfUklHSFQgPSAzOTsKLXZhciBLRVlfQVJST1dfVVAgPSAzODsKLXZhciBLRVlfQkFDS1NQQUNFID0gODsKLXZhciBLRVlfRU5EID0gMzU7Ci12YXIgS0VZX0hPTUUgPSAzNjsKLXZhciBLRVlfUEFHRV9ET1dOID0gMzQ7Ci12YXIgS0VZX1BBR0VfVVAgPSAzMzsKLXZhciBLRVlfVEFCID0gOTsKLXZhciBLRVlfQyA9IDY3OwotdmFyIEtFWV9GID0gNzA7Ci12YXIgS0VZX1MgPSA4MzsKLXZhciBLRVlfViA9IDg2OwotdmFyIEtFWV9YID0gODg7Ci12YXIgS0VZX1ogPSA5MDsKLQotdmFyIENNRF9DT1BZID0gImNvcHkiOwotdmFyIENNRF9DVVQgPSAiY3V0IjsKLXZhciBDTURfRklORF9URVhUID0gImZpbmRUZXh0IjsKLXZhciBDTURfUEFTVEUgPSAicGFzdGUiOwotdmFyIENNRF9TQVZFID0gInNhdmUiOwotdmFyIENNRF9TQVZFX0FMTCA9ICJzYXZlQWxsIjsKLQotdmFyIFRBQkxFX0hFQURFUlNfTk9ORSA9IDA7Ci12YXIgVEFCTEVfSEVBREVSU19DT0xTID0gMTsKLXZhciBUQUJMRV9IRUFERVJTX1JPV1MgPSAyOwotdmFyIFRBQkxFX0hFQURFUlNfQk9USCA9IDM7Ci0KLXZhciBCT0xEID0gMTsKLXZhciBJVEFMSUMgPSBCT0xEIDw8IDE7Ci12YXIgVU5ERVJMSU5FID0gSVRBTElDIDw8IDE7Ci12YXIgU1VCU0NSSVBUID0gVU5ERVJMSU5FIDw8IDE7Ci12YXIgU1VQRVJTQ1JJUFQgPSBTVUJTQ1JJUFQgPDwgMTsKLQotCi12YXIgZWRpdG9ySWQ7Ci12YXIgZWRpdG9yQ1NTOwotdmFyIGJhc2VIUkVGOwotdmFyIHN1cHBvcnRSaWNoVGV4dEVkaXRpbmcgPSB0cnVlOwotdmFyIGVkaXRvckRvYzsKLXZhciBzZWxlY3Rpb247Ci12YXIgc2VsZWN0aW9uUmFuZ2U7Ci12YXIgcmVhZE9ubHkgPSBmYWxzZTsKLXZhciBpbml0aWFsaXplZCA9IGZhbHNlOwotdmFyIG1vZGlmaWVkID0gZmFsc2U7Ci0KLS8vIEluaXRpYWxpemVzIHRoZSBlZGl0b3IuCi1mdW5jdGlvbiBpbml0RWRpdG9yKGlkLCBjc3MsIGJhc2VVUkwpIHsKLQllZGl0b3JJZCA9IGlkOwotCWVkaXRvckNTUyA9IGNzczsKLQliYXNlSFJFRiA9IGJhc2VVUkw7Ci0JdHJ5IHsKLQkJZW5hYmxlUmljaFRleHRFZGl0aW5nKCcnKTsKLQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQlzZXRTdGF0dXMoU1RBVFVTX0lOSVRJQUxJWkVELCBudWxsKTsKLQl9Ci0JY2F0Y2ggKGUpIHsKLQkJc3VwcG9ydFJpY2hUZXh0RWRpdGluZyA9IGZhbHNlOwotCX0KLX0KLQotLy8gSGFuZGxlcyB0aGUga2V5IGV2ZW50cy4KLWZ1bmN0aW9uIGtleVByZXNzZWQoZXZlbnQpIHsKLQl2YXIga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0JaWYgKGtleUNvZGUgPT0gMCAmJiAhZG9jdW1lbnQuYWxsKSB7Ci0JCWtleUNvZGUgPSBldmVudC5jaGFyQ29kZTsKLQkJc3dpdGNoIChrZXlDb2RlKSB7Ci0JCQljYXNlIDk5OgotCQkJCWtleUNvZGUgPSBLRVlfQzsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTAyOgotCQkJCWtleUNvZGUgPSBLRVlfRjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTE1OgotCQkJCWtleUNvZGUgPSBLRVlfUzsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTE4OgotCQkJCWtleUNvZGUgPSBLRVlfVjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTIwOgotCQkJCWtleUNvZGUgPSBLRVlfWDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTIyOgotCQkJCWtleUNvZGUgPSBLRVlfWjsKLQkJCQlicmVhazsKLQkJfQotCX0KLQl2YXIgY3RybEtleSA9IGV2ZW50LmN0cmxLZXk7Ci0JdmFyIHNoaWZ0S2V5ID0gZXZlbnQuc2hpZnRLZXk7Ci0JCi0Jc3dpdGNoKGtleUNvZGUpIHsKLQkJY2FzZSBLRVlfQVJST1dfRE9XTjoKLQkJY2FzZSBLRVlfQVJST1dfTEVGVDoKLQkJY2FzZSBLRVlfQVJST1dfUklHSFQ6Ci0JCWNhc2UgS0VZX0FSUk9XX1VQOgotCQljYXNlIEtFWV9FTkQ6Ci0JCWNhc2UgS0VZX0hPTUU6Ci0JCWNhc2UgS0VZX1BBR0VfRE9XTjoKLQkJY2FzZSBLRVlfUEFHRV9VUDoKLQkJY2FzZSBLRVlfVEFCOgotCQkJYnJlYWs7Ci0JCWNhc2UgS0VZX0JBQ0tTUEFDRToKLQkJCWlmICghcmVhZE9ubHkpIHsKLQkJCQlzZXRUaW1lb3V0KCJzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsiLCAxMCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBLRVlfQzoKLQkJCWlmIChjdHJsS2V5KSB7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19LRVlfRE9XTiwgQ01EX0NPUFkpOwotCQkJfQotCQkJZWxzZSBpZiAoIWRvY3VtZW50LmFsbCAmJiByZWFkT25seSkgewotCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlicmVhazsJCQkKLQkJY2FzZSBLRVlfRjoKLQkJCWlmIChjdHJsS2V5KSB7Ci0JCQkJaWYgKGRvY3VtZW50LmFsbCkgewotCQkJCQlldmVudC5rZXlDb2RlID0gLTE7Ci0JCQkJCWV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJCX0KLQkJCQlzZXRTdGF0dXMoU1RBVFVTX0tFWV9ET1dOLCBDTURfRklORF9URVhUKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCFkb2N1bWVudC5hbGwgJiYgcmVhZE9ubHkpIHsKLQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgS0VZX1M6Ci0JCQlpZiAoIXJlYWRPbmx5ICYmIGN0cmxLZXkpIHsKLQkJCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJCWV2ZW50LmtleUNvZGUgPSAtMTsKLQkJCQkJZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQkJfQotCQkJCWlmIChzaGlmdEtleSkgewotCQkJCQlzZXRTdGF0dXMoU1RBVFVTX0tFWV9ET1dOLCBDTURfU0FWRV9BTEwpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2V0U3RhdHVzKFNUQVRVU19LRVlfRE9XTiwgQ01EX1NBVkUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKCFkb2N1bWVudC5hbGwgJiYgcmVhZE9ubHkpIHsKLQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQkJCQotCQkJYnJlYWs7Ci0JCWNhc2UgS0VZX1Y6Ci0JCQlpZiAoY3RybEtleSkgewkJCi0JCQkJaWYgKGRvY3VtZW50LmFsbCkgewotCQkJCQlldmVudC5rZXlDb2RlID0gLTE7Ci0JCQkJCWV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7Ci0JCQkJCWlmICghcmVhZE9ubHkpIHsKLQkJCQkJCXNldFN0YXR1cyhTVEFUVVNfS0VZX0RPV04sIENNRF9QQVNURSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICghcmVhZE9ubHkpIHsKLQkJCQkJCS8vIFdvcmthcm91bmQgTW96aWxsYS9GaXJlZm94IHBhc3RlIGlzc3Vlcy4KLQkJCQkJCXNldFRpbWVvdXQoInNldFN0YXR1cyhTVEFUVVNfS0VZX0RPV04sIENNRF9QQVNURSk7IiwgMTApOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKCFkb2N1bWVudC5hbGwgJiYgcmVhZE9ubHkpIHsKLQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgS0VZX1g6Ci0JCQlpZiAoY3RybEtleSkgewotCQkJCXNldFN0YXR1cyhTVEFUVVNfS0VZX0RPV04sIENNRF9DVVQpOwotCQkJfQotCQkJZWxzZSBpZiAoIWRvY3VtZW50LmFsbCAmJiByZWFkT25seSkgewotCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBLRVlfWjoKLQkJCWlmICghcmVhZE9ubHkgJiYgY3RybEtleSkgewotCQkJCXNldFRpbWVvdXQoInNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOyIsIDEwKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCFkb2N1bWVudC5hbGwgJiYgcmVhZE9ubHkpIHsKLQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQkJCQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoIWRvY3VtZW50LmFsbCAmJiByZWFkT25seSkgewotCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9Ci0JfQotfQotCi1mdW5jdGlvbiBzZWxDaGFuZ2VkKGV2ZW50KSB7Ci0JdXBkYXRlU2VsZWN0aW9uKCk7Ci19Ci0KLWZ1bmN0aW9uIGVuYWJsZVJpY2hUZXh0RWRpdGluZyhodG1sKSB7Ci0JdmFyIGRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvcklkKS5jb250ZW50V2luZG93LmRvY3VtZW50OwotCWRvYy5kZXNpZ25Nb2RlID0gIm9uIjsKLQkKLQl2YXIgaHRtbFNyYyA9ICc8aHRtbD48aGVhZD48dGl0bGU+PC90aXRsZT4nOwotCQotCWlmIChlZGl0b3JDU1MgIT0gbnVsbCAmJiBlZGl0b3JDU1MgIT0gJycpIHsKLQkJaHRtbFNyYyArPSAnPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSInICsgZWRpdG9yQ1NTICsgJyIgdHlwZT0idGV4dC9jc3MiLz4nOwotCX0KLQkKLQlpZiAoYmFzZUhSRUYgIT0gbnVsbCAmJiBiYXNlSFJFRiAhPSAnJykgewkKLQkJaHRtbFNyYyArPSAnPGJhc2UgaHJlZj0iJyArIGJhc2VIUkVGICsgJyIvPic7Ci0JfQotCQotCWlmICghZG9jdW1lbnQuYWxsICYmIGh0bWwgPT0gJycpIHsKLQkJLy8gTW96aWxsYS9GaXJlZm94IHdpbGwgb25seSBkaXNwbGF5IHRoZSBjYXJldCBpZiA8YnIvPiBpcyBhZGRlZCB0byB0aGUgSFRNTCBib2R5LgotCQkvLyBBZGRpbmcgPGJyLz4gYWxzbyBlbmFibGVzIHRoZSBiYWNrc3BhY2UgYW5kIGRlbGV0ZSBrZXkgYnkgZGVmYXVsdC4gT3RoZXJ3aXNlLCB0aGUKLQkJLy8gdXNlciBuZWVkIHRvIGVudGVyIHNvbWUgdGV4dCBiZWZvcmUgdGhlc2UgMiBrZXlzIHN0YXJ0IHRvIGZ1bmN0aW9uLgotCQlodG1sID0gIjxici8+IjsKLQl9Ci0JCi0JaHRtbFNyYyArPSAnPC9oZWFkPjxib2R5PicgKyBodG1sICsgJzwvYm9keT48L2h0bWw+JzsKLQkKLQlkb2Mub3BlbigpOwotCWRvYy53cml0ZShodG1sU3JjKTsKLQlkb2MuY2xvc2UoKTsKLQkKLQltb2RpZmllZCA9IGZhbHNlOwotCi0JaWYgKCJhdHRhY2hFdmVudCIgaW4gZG9jKSB7Ci0JCWRvYy5hdHRhY2hFdmVudCgib25rZXlkb3duIiwga2V5UHJlc3NlZCk7Ci0JCWRvYy5hdHRhY2hFdmVudCgib25zZWxlY3Rpb25jaGFuZ2UiLCBzZWxDaGFuZ2VkKTsKLQl9CQotCWlmICgiYWRkRXZlbnRMaXN0ZW5lciIgaW4gZG9jKSB7Ci0JCWRvYy5hZGRFdmVudExpc3RlbmVyKCJrZXlwcmVzcyIsIGtleVByZXNzZWQsIHRydWUpOwotCQlkb2MuYWRkRXZlbnRMaXN0ZW5lcigia2V5cHJlc3MiLCBzZWxDaGFuZ2VkLCBmYWxzZSk7Ci0JCWRvYy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgc2VsQ2hhbmdlZCwgZmFsc2UpOwotCX0KLQotCi0Jc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci19Ci0KLS8vIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgZWRpdG9yLgotZnVuY3Rpb24gc2V0SGVpZ2h0KGhlaWdodCkgewotCWlmIChpbml0aWFsaXplZCkgewotCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuaGVpZ2h0ID0gaGVpZ2h0ICsgInB4IjsKLQl9Ci19Ci0KLS8vIFNldHMgdGhlIHN0YXR1cy4KLS8vIE5vdGU6IEJ5IGRlZmF1bHQsIEZpcmVmb3ggZGlzYWJsZXMgY2hhbmdlcyB0byB0aGUgc3RhdHVzIGJhci4gRm9yIHRoaXMgdG8gd29yaywgdGhlIHVzZXIKLS8vIG11c3Qgc2V0IHRoZSBnbG9iYWwgcHJlZmVyZW5jZSAiZG9tLmRpc2FibGVfd2luZG93X3N0YXR1c19jaGFuZ2UiIHRvIGZhbHNlLgotLy8gRm9yIEZpcmVmb3ggMS4wLngsIHRoaXMgc2V0dGluZyBjYW4gYmUgbWFkZSBpbiAvdXNyL2ZpcmVmb3gtMS4wLjcvZGVmYXVsdHMvcHJlZi9maXJlZm94LmpzLgotZnVuY3Rpb24gc2V0U3RhdHVzKHR5cGUsIHZhbHVlKSB7Ci0JdmFyIHN0YXR1cyA9ICckJCQnICsgdHlwZTsKLQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSAnJykgewotCQlzdGF0dXMgKz0gKCckJyArIHZhbHVlKTsJCQotCX0KLQl3aW5kb3cuc3RhdHVzID0gc3RhdHVzOwotCXdpbmRvdy5zdGF0dXMgPSAnJCQkJyArIFNUQVRVU19OT1A7Ci19Ci0KLS8vIFJldHVybnMgdGhlIEhUTUwgc291cmNlLgotZnVuY3Rpb24gZ2V0SFRNTCgpIHsKLQl2YXIgaHRtbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvcklkKS5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MOwotCWlmIChodG1sID09ICI8UD4mbmJzcDs8L1A+IikgewotCQlodG1sID0gIiI7Ci0JfQotCWlmIChodG1sICE9IG51bGwgJiYgaHRtbCAhPSAnJykgewotCQl2YXIgcmVnRXggPSBuZXcgUmVnRXhwKCJcImZpbGVcOihbXj1dKikoL3Jlc291cmNlcy8pKC4rKVwiIiwgJ2cnKTsKLQkJaHRtbCA9IGh0bWwucmVwbGFjZShyZWdFeCwgIlwiLi9yZXNvdXJjZXMvJDNcIiIpOwotCQlyZWdFeCA9IG5ldyBSZWdFeHAoIlwiZmlsZVw6KFtePV0qKS8jKC4rKVwiIiwgJ2cnKTsKLQkJaHRtbCA9IGh0bWwucmVwbGFjZShyZWdFeCwgIlwiIyQyXCIiKTsKLQl9Ci0JcmV0dXJuIGh0bWw7Ci19Ci0KLS8vUmV0dXJucyB0aGUgSFRNTCBzb3VyY2UgdG8gdGhlIEphdmEgbGF5ZXIKLWZ1bmN0aW9uIGdldFRleHQoKSB7Ci0JdmFyIGh0bWwgPSBnZXRIVE1MKCk7Ci0Jc2V0U3RhdHVzKFNUQVRVU19HRVRfVEVYVCwgaHRtbCk7Ci0JcmV0dXJuIGh0bWw7Ci19Ci0KLWZ1bmN0aW9uIHNldElubmVySFRNTChodG1sKSB7Ci0JaWYgKGRvY3VtZW50LmFsbCkgewotCQkvLyBJRSBoYXMgcHJvYmxlbSBzZXR0aW5nIGNvbXBsZXggSFRNTCBzZXQgdmlhIGRvYy5ib2R5LmlubmVySFRNTC4KLQkJZW5hYmxlUmljaFRleHRFZGl0aW5nKGh0bWwpOwotCX0KLQllbHNlIHsKLQkJaWYgKGh0bWwgPT0gJycpIHsKLQkJCS8vIE1vemlsbGEvRmlyZWZveCB3aWxsIG9ubHkgZGlzcGxheSB0aGUgY2FyZXQgaWYgPGJyLz4gaXMgYWRkZWQgdG8gdGhlIEhUTUwgYm9keS4KLQkJCWh0bWwgPSAiPGJyLz4iOwotCQl9Ci0JCXZhciBkb2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuY29udGVudFdpbmRvdy5kb2N1bWVudDsKLQkJaWYgKGRvYy5ib2R5ICE9IG51bGwpIHsKLQkJCWRvYy5ib2R5LmlubmVySFRNTCA9IGh0bWw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBNb3ppbGxhL0ZpcmVmb3ggY2FuIHRha2UgYSB3aGlsZSB0byBpbml0aWFsaXplIGRvY3VtZW50LmJvZHkKLQkJCS8vIGFmdGVyIGRvY3VtZW50LndyaXRlKCkuCi0JCQl0cnkgewotCQkJCXNldFRpbWVvdXQoInNldElubmVySFRNTCgnIiArIGh0bWwgKyAiJyk7IiwgMTApOwotCQkJfQotCQkJY2F0Y2ggKGUpIHsKLQkJCX0KLQkJfQotCX0KLX0KLQotLy8gU2V0cyB0aGUgSFRNTCBzb3VyY2UuCi1mdW5jdGlvbiBzZXRUZXh0KGh0bWwpIHsKLQlpZiAoc3VwcG9ydFJpY2hUZXh0RWRpdGluZykgewotCQlodG1sID0gZGVjb2RlU3RyaW5nKGh0bWwpOwotCQlzZXRJbm5lckhUTUwoaHRtbCk7Ci0JCW1vZGlmaWVkID0gZmFsc2U7Ci0JCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCX0KLX0KLQotLy8gRGVjb2RlcyB0aGUgSFRNTCBwYXNzZWQgZnJvbSB0aGUgSmF2YSBsYXllci4KLWZ1bmN0aW9uIGRlY29kZVN0cmluZyhzdHIpIHsKLQlpZiAoc3RyICE9IG51bGwgJiYgc3RyICE9ICcnKSB7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCXN0ciA9IHN0ci5yZXBsYWNlKC8lc3ElL2csICInIik7Ci0JCQlzdHIgPSBzdHIucmVwbGFjZSgvJUVPTCUvZywgIlxuIik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdHIgPSBzdHIucmVwbGFjZSgvJXNxJS9nLCAiJmFwb3M7Iik7Ci0JCQlzdHIgPSBzdHIucmVwbGFjZSgvJUVPTCUvZywgIiIpOwotCQkJc3RyID0gc3RyLnJlcGxhY2UoL1xuL2csICIiKTsKLQkJfQotCX0KLQlyZXR1cm4gc3RyOwotfQotCi0vLyBVcGRhdGVzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhbmQgc2VsZWN0aW9uIHJhbmdlLgotZnVuY3Rpb24gdXBkYXRlU2VsZWN0aW9uKCkgewotCWlmICghc3VwcG9ydFJpY2hUZXh0RWRpdGluZykgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQkKLQljb250ZW50V2luZG93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3c7Ci0JZWRpdG9yRG9jID0gY29udGVudFdpbmRvdy5kb2N1bWVudDsKLQkKLS8vCWNvbnRlbnRXaW5kb3cuZm9jdXMoKTsKLQkKLQl2YXIgdGVtcFNlbFJhbmdlOwotCXZhciBzZWxPZmZzZXRTdGFydCA9IDA7Ci0JdmFyIHNlbGVjdGVkVGV4dCA9ICIiOwotCXZhciBmb250TmFtZSA9ICIiOwotCXZhciBmb250U2l6ZSA9ICIiOwotCXZhciBibG9ja1N0eWxlID0gIiI7Ci0JdmFyIHRleHRGbGFncyA9IDA7Ci0JCi0JCi0JaWYgKGRvY3VtZW50LmFsbCkgewotCQlzZWxlY3Rpb24gPSBlZGl0b3JEb2Muc2VsZWN0aW9uOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7Ci0JCQl0ZW1wU2VsUmFuZ2UgPSBzZWxlY3Rpb25SYW5nZS5kdXBsaWNhdGUoKTsKLQkJCXJlZm9ybWF0RWxlbWVudExpbmtzKCk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCXNlbGVjdGlvbiA9IGNvbnRlbnRXaW5kb3cuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdChzZWxlY3Rpb24ucmFuZ2VDb3VudCAtIDEpLmNsb25lUmFuZ2UoKTsKLQkJCXRlbXBTZWxSYW5nZSA9IHNlbGVjdGlvblJhbmdlLmNsb25lUmFuZ2UoKTsKLQkJfQotCX0KLQotCS8vVE9ETzogdGhpcyBpcyBwcm9iYWJseSBJRSBvbmx5Ci0JaWYgKHRlbXBTZWxSYW5nZSAhPSBudWxsKSB7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCXNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvblJhbmdlLnRleHQ7Ci0JCQkvKiBmb3IgZ2V0dGluZyBzZWxlY3Rpb24gb2Zmc2V0IC0gY29tbWVudGVkIGJlY2F1c2Ugd2UgY2FuJ3Qgc2VsZWN0IHRoZQotCQkJICogcHJvcGVyIGxvY2F0aW9uIGluIHRoZSBIVE1MIHNvdXJjZSB0YWIgYmVjYXVzZSBKVGlkeSdzIHJlZm9ybWF0dGluZyBvZiB0aGUgSFRNTAotCQkJdmFyIGh0bWwgPSBnZXRIVE1MKCk7Ci0gICAgICAgICAgICB2YXIgdGVtcFNlbExlbiA9IHRlbXBTZWxSYW5nZS5odG1sVGV4dC5sZW5ndGg7CQkJCi0gICAgICAgICAgICB0ZW1wU2VsUmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCAtaHRtbC5sZW5ndGgpOwotICAgICAgICAgICAgc2VsT2Zmc2V0U3RhcnQgPSB0ZW1wU2VsUmFuZ2UuaHRtbFRleHQubGVuZ3RoIC0gdGVtcFNlbExlbjsKLSAgICAgICAgICAgICovCi0JCQl2YXIgc2VsUGFyZW50ID0gdGVtcFNlbFJhbmdlLnBhcmVudEVsZW1lbnQoKTsKLQkJCWZvbnROYW1lID0gdGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb250TmFtZScpOwotCQkJZm9udFNpemUgPSB0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ2ZvbnRTaXplJyk7Ci0JCQlibG9ja1N0eWxlID0gdGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb3JtYXRCbG9jaycpOwotCQkJaWYgKGJsb2NrU3R5bGUgPT0gIk5vcm1hbCIpIHsKLQkJCQlpZiAoc2VsUGFyZW50LmNsYXNzTmFtZSA9PSAicXVvdGUiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPHF1b3RlPiI7Ci0JCQkJfSBlbHNlIGlmIChzZWxQYXJlbnQuY2xhc3NOYW1lID09ICJjb2RlU2FtcGxlIikgewotCQkJCQlibG9ja1N0eWxlID0gIjxjb2RlPiI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYmxvY2tTdHlsZSA9ICI8cD4iOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoYmxvY2tTdHlsZSA9PSAiSGVhZGluZyAzIikgewotCQkJCWJsb2NrU3R5bGUgPSAiPGgzPiI7Ci0JCQl9IGVsc2UgaWYgKGJsb2NrU3R5bGUgPT0gIkhlYWRpbmcgNCIpIHsKLQkJCQlibG9ja1N0eWxlID0gIjxoND4iOwotCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICJIZWFkaW5nIDUiKSB7Ci0JCQkJYmxvY2tTdHlsZSA9ICI8aDU+IjsKLQkJCX0KLQkJCWlmICh0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ2JvbGQnKSA9PSB0cnVlKSB7Ci0JCQkJdGV4dEZsYWdzIHw9IEJPTEQ7Ci0JCQl9Ci0JCQlpZiAodGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdpdGFsaWMnKSA9PSB0cnVlKSB7Ci0JCQkJdGV4dEZsYWdzIHw9IElUQUxJQzsKLQkJCX0KLQkJCWlmICh0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ3VuZGVybGluZScpID09IHRydWUpIHsKLQkJCQl0ZXh0RmxhZ3MgfD0gVU5ERVJMSU5FOwotCQkJfQotCQkJaWYgKHRlbXBTZWxSYW5nZS5xdWVyeUNvbW1hbmRWYWx1ZSgnc3Vic2NyaXB0JykgPT0gdHJ1ZSkgewotCQkJCXRleHRGbGFncyB8PSBTVUJTQ1JJUFQ7Ci0JCQl9Ci0JCQlpZiAodGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdzdXBlcnNjcmlwdCcpID09IHRydWUpIHsKLQkJCQl0ZXh0RmxhZ3MgfD0gU1VQRVJTQ1JJUFQ7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChzZWxlY3Rpb25SYW5nZSAhPSBudWxsKSB7Ci0JCQkJCXNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvblJhbmdlLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCXZhciBzZWxQYXJlbnQgPSBzZWxlY3Rpb24uZm9jdXNOb2RlOwotCQkJCWZvbnROYW1lID0gZWRpdG9yRG9jLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb250TmFtZScpOwotCQkJCWlmIChmb250TmFtZSA9PSAiIikgewotCQkJCQlmb250TmFtZSA9ICJkZWZhdWx0IjsKLQkJCQl9Ci0JCQkJZm9udFNpemUgPSBlZGl0b3JEb2MucXVlcnlDb21tYW5kVmFsdWUoJ2ZvbnRTaXplJyk7Ci0JCQkJaWYgKGZvbnRTaXplID09ICIiKSB7Ci0JCQkJCWZvbnRTaXplID0gImRlZmF1bHQiOwotCQkJCX0KLQkJCQlibG9ja1N0eWxlID0gZWRpdG9yRG9jLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb3JtYXRCbG9jaycpOwotCQkJCWlmIChibG9ja1N0eWxlID09ICJwIikgewotCQkJCQlpZiAoc2VsUGFyZW50LnBhcmVudE5vZGUuY2xhc3NOYW1lID09ICJxdW90ZSIpIHsKLQkJCQkJCWJsb2NrU3R5bGUgPSAiPHF1b3RlPiI7Ci0JCQkJCX0gZWxzZSBpZiAoc2VsUGFyZW50LnBhcmVudE5vZGUuY2xhc3NOYW1lID09ICJjb2RlU2FtcGxlIikgewotCQkJCQkJYmxvY2tTdHlsZSA9ICI8Y29kZT4iOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYmxvY2tTdHlsZSA9ICI8cD4iOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICJoMyIpIHsKLQkJCQkJYmxvY2tTdHlsZSA9ICI8aDM+IjsKLQkJCQl9IGVsc2UgaWYgKGJsb2NrU3R5bGUgPT0gImg0IikgewotCQkJCQlibG9ja1N0eWxlID0gIjxoND4iOwotCQkJCX0gZWxzZSBpZiAoYmxvY2tTdHlsZSA9PSAiaDUiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPGg1PiI7Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICIiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPHA+IjsKLQkJCQl9Ci0JCQkJaWYgKGVkaXRvckRvYy5xdWVyeUNvbW1hbmRTdGF0ZSgnYm9sZCcpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IEJPTEQ7Ci0JCQkJfQotCQkJCWlmIChlZGl0b3JEb2MucXVlcnlDb21tYW5kU3RhdGUoJ2l0YWxpYycpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IElUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKGVkaXRvckRvYy5xdWVyeUNvbW1hbmRTdGF0ZSgndW5kZXJsaW5lJykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gVU5ERVJMSU5FOwotCQkJCX0KLQkJCQlpZiAoZWRpdG9yRG9jLnF1ZXJ5Q29tbWFuZFN0YXRlKCdzdWJzY3JpcHQnKSA9PSB0cnVlKSB7Ci0JCQkJCXRleHRGbGFncyB8PSBTVUJTQ1JJUFQ7Ci0JCQkJfQotCQkJCWlmIChlZGl0b3JEb2MucXVlcnlDb21tYW5kU3RhdGUoJ3N1cGVyc2NyaXB0JykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gU1VQRVJTQ1JJUFQ7Ci0JCQkJfQotCQkJfSBjYXRjaCAoZSkgeyAgfQotCQkJCi0JCX0KLQkJCQkJCQotCQlzZXRTdGF0dXMoU1RBVFVTX1NFTEVDVF9URVhULCAvKiBzZWxPZmZzZXRTdGFydCArICIkIiArICovCi0JCQkJZm9udE5hbWUgKyAiJCIgKyBmb250U2l6ZSArICIkIiArIGJsb2NrU3R5bGUgKyAiJCIgKyB0ZXh0RmxhZ3MgKyAiJCIgKyBzZWxlY3RlZFRleHQpOwotCX0JCi0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotLy8gU2V0cyBmb2N1cyB0byB0aGlzIGVkaXRvci4KLWZ1bmN0aW9uIHNldEZvY3VzKCkgewotCWlmICh1cGRhdGVTZWxlY3Rpb24oKSkgewotCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsJCi0JfQotfQotCi0vLyBSZWZvcm1hdHMgZWxlbWVudCBsaW5rcyBjcmVhdGVkIHZpYSBkcmFnICYgZHJvcC4KLWZ1bmN0aW9uIHJlZm9ybWF0RWxlbWVudExpbmtzKCkgewotCXZhciBsaW5rc1JlZm9ybWF0dGVkID0gMDsKLQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ0EnKTsKLQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCWlmIChlbGVtZW50LmNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpID09ICdlbGVtZW50bGlua3dpdGh0eXBlJykgewotIAkJCWlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCAmJiBlbGVtZW50LmZpcnN0Q2hpbGQuZmlyc3RDaGlsZCAhPSBudWxsICYmCi0gCQkJCWVsZW1lbnQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQgIT0gbnVsbCkgewotIAkJCQl2YXIgbGlua1RleHQgPSBlbGVtZW50LmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLm5vZGVWYWx1ZTsKLSAJCQkJZWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50LmZpcnN0Q2hpbGQpOwotIAkJCQllbGVtZW50LmFwcGVuZENoaWxkKGVkaXRvckRvYy5jcmVhdGVUZXh0Tm9kZShsaW5rVGV4dCkpOwotIAkJCQlsaW5rc1JlZm9ybWF0dGVkKys7Ci0gCQkJfQotCQl9Ci0JfQotCWlmIChsaW5rc1JlZm9ybWF0dGVkID4gMCkgewotCQlzZXRTdGF0dXMoU1RBVFVTX1JFRk9STUFUX0xJTktTLCBudWxsKTsKLQl9Ci19Ci0KLS8vIEZvcm1hdHMgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBmb3JtYXRUZXh0KGNvbW1hbmQsIG9wdGlvbikgewotCWlmICghcmVhZE9ubHkgJiYgdXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJaWYgKGVkaXRvckRvYy5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgb3B0aW9uKSkgewotCQkJc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7CQkKLQkJCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCQl9Ci0JfQotfQotCi0vLyBBZGRzIEhUTUwuCi1mdW5jdGlvbiBhZGRIVE1MKGh0bWwpIHsKLQlpZiAoIXJlYWRPbmx5ICYmIGh0bWwgIT0gIiIpICB7Ci0JCWh0bWwgPSBkZWNvZGVTdHJpbmcoaHRtbCk7Ci0JCWlmICh1cGRhdGVTZWxlY3Rpb24oKSkgewotCQkJaWYgKGRvY3VtZW50LmFsbCkgewotCQkJCWlmIChzZWxlY3Rpb25SYW5nZS50ZXh0ICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0aW9uUmFuZ2UucGFzdGVIVE1MKGh0bWwpOwotCQkJCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJCQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2VsZWN0aW9uUmFuZ2UuZGVsZXRlQ29udGVudHMoKTsKLQkJCQl2YXIgZG9jdW1lbnRGcmFnbWVudCA9IHNlbGVjdGlvblJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChodG1sKTsKLQkJCQlzZWxlY3Rpb25SYW5nZS5pbnNlcnROb2RlKGRvY3VtZW50RnJhZ21lbnQpOwotCQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQkJCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vLyBBZGRzIGFuIGltYWdlLgotZnVuY3Rpb24gYWRkSW1hZ2UodXJsLCBoZWlnaHQsIHdpZHRoLCBhbHQpIHsKLQlpZiAodXJsICE9IG51bGwgJiYgdXJsICE9ICcnKSB7Ci0JCWZvcm1hdFRleHQoJ2luc2VydGltYWdlJywgdXJsKTsKLQl9Ci0JaWYgKHVwZGF0ZVNlbGVjdGlvbigpKSB7CQotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnR5cGUgPT0gJ0NvbnRyb2wnICYmIHNlbGVjdGlvblJhbmdlICE9IG51bGwpIHsKLQkJCWlmIChoZWlnaHQgIT0gbnVsbCAmJiBoZWlnaHQgIT0gJycpIHNlbGVjdGlvblJhbmdlLml0ZW0oKS5oZWlnaHQgPSBoZWlnaHQ7Ci0JCQlpZiAod2lkdGggIT0gbnVsbCAmJiB3aWR0aCAhPSAnJykgc2VsZWN0aW9uUmFuZ2UuaXRlbSgpLndpZHRoID0gd2lkdGg7Ci0JCQlpZiAoYWx0ICE9IG51bGwpIHNlbGVjdGlvblJhbmdlLml0ZW0oKS5hbHQgPSBhbHQ7CQkKLQkJfQotCX0KLX0KLQotLy8gQWRkcyBhIGhvcml6b250YWwgbGluZS4KLWZ1bmN0aW9uIGFkZExpbmUoKSB7Ci0JZm9ybWF0VGV4dCgnaW5zZXJ0aG9yaXpvbnRhbHJ1bGUnLCBudWxsKTsKLX0KLQotLy8gQWRkcyBhIGxpbmsuCi1mdW5jdGlvbiBhZGRMaW5rKHVybCkgewotCWlmICghcmVhZE9ubHkgJiYgdXJsICE9IG51bGwgJiYgdXJsICE9ICcnICYmIHVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCWlmIChzZWxlY3Rpb25SYW5nZS50ZXh0ID09IG51bGwgfHwgc2VsZWN0aW9uUmFuZ2UudGV4dCA9PSAnJykgewotCQkJCXNlbGVjdGlvblJhbmdlLnRleHQgPSB1cmw7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzZWxlY3Rpb25SYW5nZS5leGVjQ29tbWFuZCgnY3JlYXRlbGluaycsIGZhbHNlLCB1cmwpKSB7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uID09ICIiKSB7CQkKLQkJCQl2YXIgdXJsVGV4dE5vZGUgPSBlZGl0b3JEb2MuY3JlYXRlVGV4dE5vZGUodXJsKTsKLQkJCQlpbnNlcnROb2RlQXRTZWxlY3Rpb24oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9yRnJhbWVJZCkuY29udGVudFdpbmRvdywgdXJsVGV4dE5vZGUpOwotCQkJfQkJCQotCQkJaWYgKGVkaXRvckRvYy5leGVjQ29tbWFuZCgnY3JlYXRlbGluaycsIGZhbHNlLCB1cmwpKSB7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8vIEFkZHMgYW4gb3JkZXJlZCBsaXN0LgotZnVuY3Rpb24gYWRkT3JkZXJlZExpc3QoKSB7Ci0JZm9ybWF0VGV4dCgnaW5zZXJ0b3JkZXJlZGxpc3QnLCBudWxsKTsKLX0KLQotLy8gQWRkcyBhIHRhYmxlLgotZnVuY3Rpb24gYWRkVGFibGUocm93cywgY29scywgd2lkdGgsIHN1bW1hcnksIGNhcHRpb24sIHRhYmxlaGVhZGVycykgewotCWlmIChyZWFkT25seSkgcmV0dXJuOwotCWlmIChyb3dzID09IDApIHJvd3MgPSAyOwotCWlmIChjb2xzID09IDApIGNvbHMgPSAyOwotCWlmICh3aWR0aCA9PSAwKSB3aWR0aCA9ICI4NSUiOwotCWlmICh1cGRhdGVTZWxlY3Rpb24oKSkgewotCQl2YXIgdGFibGUgPSBlZGl0b3JEb2MuY3JlYXRlRWxlbWVudCgidGFibGUiKTsKLQkJdGFibGUuY2VsbFBhZGRpbmcgPSAiMiI7Ci0JCXRhYmxlLmNlbGxTcGFjaW5nID0gIjAiOwotCQl0YWJsZS5ib3JkZXIgPSAiMSI7Ci0JCXRhYmxlLndpZHRoID0gd2lkdGg7Ci0JCWlmIChzdW1tYXJ5ICE9IG51bGwgJiYgc3VtbWFyeSAhPSAnJykgewotCQkJdGFibGUuc3VtbWFyeSA9IHN1bW1hcnk7Ci0JCX0KLQkJaWYgKGNhcHRpb24gIT0gbnVsbCAmJiBjYXB0aW9uICE9ICcnKSB7Ci0JCQl0YWJsZS5jcmVhdGVDYXB0aW9uKCk7Ci0JCQl2YXIgY2FwdGlvbk5vZGUgPSBlZGl0b3JEb2MuY3JlYXRlVGV4dE5vZGUoY2FwdGlvbik7Ci0JCQl0YWJsZS5jYXB0aW9uLmFwcGVuZENoaWxkKGNhcHRpb25Ob2RlKTsKLQkJfQotCQl0Ym9keSA9IGVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IHJvd3M7IGkrKykgewotCQkJdHIgPSBlZGl0b3JEb2MuY3JlYXRlRWxlbWVudCgidHIiKTsKLQkJCQlmb3IgKHZhciBqID0gMDsgaiA8IGNvbHM7IGorKykgewotCQkJCQlpZiAoaSA9PSAwICYmICh0YWJsZWhlYWRlcnMgPT0gVEFCTEVfSEVBREVSU19DT0xTIHx8IHRhYmxlaGVhZGVycyA9PSBUQUJMRV9IRUFERVJTX0JPVEgpKSB7Ci0JCQkJCXRoID0gZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoInRoIik7Ci0JCQkJCXRoLnNjb3BlID0gImNvbCI7Ci0JCQkJCWlmICghZG9jdW1lbnQuYWxsKSB7Ci0JCQkJCQliciA9IGVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJiciIpOwotCQkJCQkJdGguYXBwZW5kQ2hpbGQoYnIpOwotCQkJCQl9Ci0JCQkJCXRyLmFwcGVuZENoaWxkKHRoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaiA9PSAwICYmICh0YWJsZWhlYWRlcnMgPT0gVEFCTEVfSEVBREVSU19ST1dTIHx8IHRhYmxlaGVhZGVycyA9PSBUQUJMRV9IRUFERVJTX0JPVEgpKSB7Ci0JCQkJCXRoID0gZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoInRoIik7Ci0JCQkJCXRoLnNjb3BlID0gInJvdyI7Ci0JCQkJCWlmICghZG9jdW1lbnQuYWxsKSB7Ci0JCQkJCQliciA9IGVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJiciIpOwotCQkJCQkJdGguYXBwZW5kQ2hpbGQoYnIpOwotCQkJCQl9Ci0JCQkJCXRyLmFwcGVuZENoaWxkKHRoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRkID0gZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0JCQkJCWlmICghZG9jdW1lbnQuYWxsKSB7Ci0JCQkJCQliciA9IGVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJiciIpOwotCQkJCQkJdGQuYXBwZW5kQ2hpbGQoYnIpOwotCQkJCQl9Ci0JCQkJCXRyLmFwcGVuZENoaWxkKHRkKTsKLQkJCQl9Ci0JCQl9Ci0JCQl0Ym9keS5hcHBlbmRDaGlsZCh0cik7Ci0gICAgCX0KLQkJdGFibGUuYXBwZW5kQ2hpbGQodGJvZHkpOwotCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQlzZWxlY3Rpb25SYW5nZS5wYXJlbnRFbGVtZW50KCkuYXBwZW5kQ2hpbGQodGFibGUpOwotCQl9Ci0JCWVsc2UgewotCQkJc2VsZWN0aW9uUmFuZ2UuaW5zZXJ0Tm9kZSh0YWJsZSk7Ci0JCX0KLQkJc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwkJCQotCX0KLX0KLQotLy8gQWRkcyBhbiB1bm9yZGVyZWQgbGlzdC4KLWZ1bmN0aW9uIGFkZFVub3JkZXJlZExpc3QoKSB7Ci0JZm9ybWF0VGV4dCgnaW5zZXJ0dW5vcmRlcmVkbGlzdCcsIG51bGwpOwotfQotCi0vLyBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gYmFja0NvbG9yKGNvbG9yKSB7Ci0JaWYgKGNvbG9yICE9IG51bGwgJiYgY29sb3IgIT0gJycpIHsKLQkJZm9ybWF0VGV4dCgnYmFja2NvbG9yJywgY29sb3IpOwotCX0KLX0KLQotLy8gVG9nZ2xlcyB0aGUgJ2JvbGQnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGJvbGQoKSB7Ci0JZm9ybWF0VGV4dCgnYm9sZCcsIG51bGwpOwotfQotCi0vLyBDb3BpZXMgdGhlIHNlbGVjdGVkIHRleHQgdG8gdGhlIGNsaXBib2FyZC4KLWZ1bmN0aW9uIGNvcHkoKSB7Ci0JaWYgKHVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCWlmIChlZGl0b3JEb2MuZXhlY0NvbW1hbmQoJ2NvcHknLCBmYWxzZSwgbnVsbCkpIHsKLQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQl9Ci0JfQotfQotCi0vLyBDdXRzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuCi1mdW5jdGlvbiBjdXQoKSB7Ci0JZm9ybWF0VGV4dCgnY3V0JywgbnVsbCk7Ci19Ci0KLS8vIERlbGV0ZXMgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBkZWxldGVUZXh0KCkgewotCWZvcm1hdFRleHQoJ2RlbGV0ZScsIG51bGwpOwotfQotCi0vLyBGaW5kcyB0ZXh0LgotZnVuY3Rpb24gZmluZFRleHQodGV4dCwgZGlyLCBvcHRpb25zKSB7Ci0JaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0ID09ICIiKSB7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSB7Ci0JCXRleHQgPSBkZWNvZGVTdHJpbmcodGV4dCk7Ci0JfQotCQotCWlmICh1cGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQlzZWxlY3Rpb25SYW5nZS5jb2xsYXBzZShkaXIgPCAwKTsKLQkJCWlmIChzZWxlY3Rpb25SYW5nZS5maW5kVGV4dCh0ZXh0LCBkaXIsIG9wdGlvbnMpKSB7Ci0JCQkJc2VsZWN0aW9uUmFuZ2Uuc2Nyb2xsSW50b1ZpZXcoKTsKLQkJCQlzZWxlY3Rpb25SYW5nZS5zZWxlY3QoKTsKLQkJCQlzZWxlY3Rpb25SYW5nZS5jb2xsYXBzZShkaXIgPCAwKTsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJCX0KLQkJfQotCQllbHNlIHsJCi0JCQkvLyBmaW5kKHRleHQsIGNhc2VTZW5zaXRpdmUsIGJhY2t3YXJkcywgd3JhcEFyb3VuZCwgd2hvbGVXb3JkLCBzZWFyY2hJbkZyYW1lcywgc2hvd0RpYWxvZykKLQkJCXZhciBjYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKLQkJCXZhciBiYWNrd2FyZHMgPSBmYWxzZTsKLQkJCXZhciB3aG9sZVdvcmQgPSB0cnVlOwotCQkJaWYgKChvcHRpb25zICYgNCkgPT0gMCkgY2FzZVNlbnNpdGl2ZSA9IGZhbHNlOwotCQkJaWYgKGRpciA9PSAtMSkgYmFja3dhcmRzID0gdHJ1ZTsKLQkJCWlmICgob3B0aW9ucyAmIDIpID09IDApIHdob2xlV29yZCA9IGZhbHNlOwotCQkJaWYgKGNvbnRlbnRXaW5kb3cuZmluZCh0ZXh0LCBjYXNlU2Vuc2l0aXZlLCBiYWNrd2FyZHMsIGZhbHNlLCB3aG9sZVdvcmQsIGZhbHNlLCBmYWxzZSkpIHsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLy8gU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGZvcmVDb2xvcihjb2xvcikgewotCWlmIChjb2xvciAhPSBudWxsICYmIGNvbG9yICE9ICcnKSB7Ci0JCWZvcm1hdFRleHQoJ2ZvcmVjb2xvcicsIGNvbG9yKTsKLQl9Ci19Ci0KLS8vIEZvcm1hdHMgdGhlIHNlbGVjdGVkIHRleHQgdXNpbmcgdGhlIGdpdmVuIEhUTUwgaGVhZGluZyB0YWcuCi1mdW5jdGlvbiBmb3JtYXRCbG9jayh0YWcpIHsKLQlpZiAodGFnICE9IG51bGwgJiYgdGFnICE9ICcnKSB7Ci0JCWZvcm1hdFRleHQoJ2Zvcm1hdGJsb2NrJywgdGFnKTsKLQl9Ci19Ci0KLS8vIEluZGVudHMgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBpbmRlbnQoKSB7Ci0JZm9ybWF0VGV4dCgnaW5kZW50JywgbnVsbCk7Ci19Ci0KLS8vIFRvZ2dsZXMgdGhlICdpdGFsaWMnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGl0YWxpYygpIHsKLQlmb3JtYXRUZXh0KCdpdGFsaWMnLCBudWxsKTsKLX0KLQotLy8gQ2VudGVyIGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGp1c3RpZnlDZW50ZXIoKSB7Ci0JZm9ybWF0VGV4dCgnanVzdGlmeWNlbnRlcicsIG51bGwpOwotfQotCi0vLyBGdWxseSBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBqdXN0aWZ5RnVsbCgpIHsKLQlmb3JtYXRUZXh0KCdqdXN0aWZ5ZnVsbCcsIG51bGwpOwotfQotCi0vLyBMZWZ0IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGp1c3RpZnlMZWZ0KCkgewotCWZvcm1hdFRleHQoJ2p1c3RpZnlsZWZ0JywgbnVsbCk7Ci19Ci0KLS8vIFJpZ2h0IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGp1c3RpZnlSaWdodCgpIHsKLQlmb3JtYXRUZXh0KCdqdXN0aWZ5cmlnaHQnLCBudWxsKTsKLX0KLQotLy8gT3V0ZGVudHMgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBvdXRkZW50KCkgewotCWZvcm1hdFRleHQoJ291dGRlbnQnLCBudWxsKTsKLX0KLQotLy8gUGFzdGVzIHRleHQgZnJvbSB0aGUgY2xpcGJvYXJkLgotZnVuY3Rpb24gcGFzdGUoc291cmNlVVJMKSB7Ci0JaWYgKHNvdXJjZVVSTCA9PSBudWxsKSB7Ci0JCXNvdXJjZVVSTCA9ICIiOwotCX0KLQllbHNlIHsKLQkJc291cmNlVVJMID0gZGVjb2RlU3RyaW5nKHNvdXJjZVVSTCk7Ci0JfQotCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJdmFyIFNUQVJUX01BUktFUiA9ICJBXy1fLV8iOwotCQl2YXIgRU5EX01BUktFUiA9ICI6LjouOiI7Ci0JCS8vIG1hcmsgaW1nIGFuZCA8YSAvPiBsaW5rcyB3aXRoIFNUQVJUX01BUktFUiArIHNyYy9ocmVmICsgRU5EX01BUktFUiBpbiB0aGUgaWQsIGZvciBsYXRlciByZWNvdmVyeQotCQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJdmFyIGlkID0gZWxlbWVudC5pZDsKLQkJCWVsZW1lbnQuaWQgPSBTVEFSVF9NQVJLRVIgKyBlbGVtZW50LnNyYyArIEVORF9NQVJLRVIgKyBpZDsKLQkJfQotCQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKTsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCXZhciBpZCA9IGVsZW1lbnQuaWQ7Ci0JCQllbGVtZW50LmlkID0gU1RBUlRfTUFSS0VSICsgZWxlbWVudC5ocmVmICsgRU5EX01BUktFUiArIGlkOwotCQl9Ci0KLQkJLy8gY2hhbmdlIHRoZSA8YmFzZT4gb2YgdGhlIGRvY3VtZW50Ci0JCXZhciBvbGRCYXNlSFJFRiA9IGVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdLmhyZWY7Ci0JCWVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdLmhyZWYgPSBzb3VyY2VVUkw7Ci0KLQkJZm9ybWF0VGV4dCgncGFzdGUnLCBudWxsKTsKLQkJCi0JCS8vIHJlc3RvcmUgPGJhc2U+Ci0JCWVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdLmhyZWYgPSBvbGRCYXNlSFJFRjsKLQl9Ci0JZWxzZSB7Ci0JCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQlzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsKLQl9Ci0JaWYgKHVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCXRyeSB7Ci0JCQl2YXIgcmVnRXhSZXMgPSBuZXcgUmVnRXhwKCJmaWxlXDooW149XSspKC9yZXNvdXJjZXMvKSguKykiLCAnZycpOwotCQkJdmFyIHJlZ0V4ID0gbmV3IFJlZ0V4cCgiZmlsZVw6KFtePV0rKS8oW14vXSspIiwgJ2cnKTsJCi0JCQl2YXIgcmVnRXhJRCA9IG5ldyBSZWdFeHAoU1RBUlRfTUFSS0VSICsgIiguKj8pIiArIEVORF9NQVJLRVIgKyAiKC4qPykiKTsKLQkJCXZhciBlbGVtZW50cyA9IGVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7Ci0JCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQl2YXIgaWQgPSBlbGVtZW50LmlkOwotCQkJCWlmIChpZCAhPSBudWxsICYmIGlkICE9ICcnKSB7Ci0JCQkJCVJlZ0V4cC5sYXN0SW5kZXg9MDsKLQkJCQkJdmFyIG1hdGNoQXJyYXkgPSBpZC5tYXRjaChyZWdFeElEKTsKLQkJCQkJaWYgKG1hdGNoQXJyYXkgIT0gbnVsbCAmJiBtYXRjaEFycmF5Lmxlbmd0aCA+IDEpIHsKLQkJCQkJCWVsZW1lbnQuc3JjID0gbWF0Y2hBcnJheVsxXTsKLQkJCQkJCWlmIChtYXRjaEFycmF5Lmxlbmd0aCA+IDIgJiYgbWF0Y2hBcnJheVsyXS5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJZWxlbWVudC5pZCA9IG1hdGNoQXJyYXlbMl07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXZhciBzcmMgPSBlbGVtZW50LnNyYzsKLQkJCQlpZiAoc3JjICE9IG51bGwgJiYgc3JjICE9ICcnKSB7Ci0JCQkJCWlmIChzcmMuaW5kZXhPZigncmVzb3VyY2VzJykgIT0gLTEpIHsKLQkJCQkJCWVsZW1lbnQuc3JjID0gc3JjLnJlcGxhY2UocmVnRXhSZXMsICIuL3Jlc291cmNlcy8kMyIpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZWxlbWVudC5zcmMgPSBzcmMucmVwbGFjZShyZWdFeCwgIi4vcmVzb3VyY2VzLyQyIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKTsKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCXZhciBpZCA9IGVsZW1lbnQuaWQ7Ci0JCQkJaWYgKGlkICE9IG51bGwgJiYgaWQgIT0gJycpIHsKLQkJCQkJUmVnRXhwLmxhc3RJbmRleD0wOwotCQkJCQl2YXIgbWF0Y2hBcnJheSA9IGlkLm1hdGNoKHJlZ0V4SUQpOwotCQkJCQlpZiAobWF0Y2hBcnJheSAhPSBudWxsICYmIG1hdGNoQXJyYXkubGVuZ3RoID4gMSkgewotCQkJCQkJZWxlbWVudC5ocmVmID0gbWF0Y2hBcnJheVsxXTsKLQkJCQkJCWlmIChtYXRjaEFycmF5Lmxlbmd0aCA+IDIgJiYgbWF0Y2hBcnJheVsyXS5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJZWxlbWVudC5pZCA9IG1hdGNoQXJyYXlbMl07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXZhciBocmVmID0gZWxlbWVudC5ocmVmOwotCQkJCWlmIChocmVmICE9IG51bGwgJiYgaHJlZiAhPSAnJykgewotCQkJCQlpZiAoaHJlZi5pbmRleE9mKCdyZXNvdXJjZXMnKSAhPSAtMSkgewotCQkJCQkJZWxlbWVudC5ocmVmID0gaHJlZi5yZXBsYWNlKHJlZ0V4UmVzLCAiLi9yZXNvdXJjZXMvJDMiKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWVsZW1lbnQuaHJlZiA9IGhyZWYucmVwbGFjZShyZWdFeCwgIi4vcmVzb3VyY2VzLyQyIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKGUpIHsKLQkJfQotCX0KLX0KLQotLy8gUmVkbyB0aGUgcHJldmlvdXMgY29tbWFuZC4KLWZ1bmN0aW9uIHJlZG8oKSB7Ci0JZm9ybWF0VGV4dCgncmVkbycsIG51bGwpOwotfQotCi0vLyBSZWRvIHRoZSBwcmV2aW91cyBjb21tYW5kLgotZnVuY3Rpb24gcmVtb3ZlRm9ybWF0KCkgewotCWZvcm1hdFRleHQoJ3JlbW92ZWZvcm1hdCcsIG51bGwpOwotfQotCi0KLQotZnVuY3Rpb24gX3JlcGxhY2VBbGxUZXh0KGZpbmRUZXh0LCByZXBsYWNlVGV4dCwgb3B0aW9ucykgewotCS8vIHRoaXMgaXMgSUUgb25seQotCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJdmFyIHRlbXBSYW5nZSA9ICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOwotCQl0ZW1wUmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCAtMTAwMDAwMDAwMDApOwotCQl0ZW1wUmFuZ2UuY29sbGFwc2UoKTsKLQkJZG8gewotCQkJaWYgKHRlbXBSYW5nZS5maW5kVGV4dChmaW5kVGV4dCwgMTAwMDAwMDAwMDAsIG9wdGlvbnMpKSB7Ci0JCQkJdGVtcFJhbmdlLnRleHQgPSByZXBsYWNlVGV4dDsKLQkJCQl0ZW1wUmFuZ2Uuc2VsZWN0KCk7Ci0JCQl9IGVsc2UgewkJCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gd2hpbGUgKHRydWUpOwotCX0KLX0KLQotLy8gUmVwbGFjZXMgYWxsIHRleHQuCi1mdW5jdGlvbiByZXBsYWNlQWxsVGV4dChmaW5kVGV4dCwgcmVwbGFjZVRleHQsIG9wdGlvbnMpIHsKLQlpZiAocmVhZE9ubHkgfHwgZmluZFRleHQgPT0gbnVsbCB8fCBmaW5kVGV4dCA9PSAiIikgewotCQlyZXR1cm47Ci0JfQotCWVsc2UgewotCQlmaW5kVGV4dCA9IGRlY29kZVN0cmluZyhmaW5kVGV4dCk7Ci0JfQotCWlmIChyZXBsYWNlVGV4dCA9PSBudWxsKSB7Ci0JCXJlcGxhY2VUZXh0ID0gIiI7Ci0JfQotCWVsc2UgewotCQlyZXBsYWNlVGV4dCA9IGRlY29kZVN0cmluZyhyZXBsYWNlVGV4dCk7Ci0JfQotCQotCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJLy8gVE9ETzogTW92ZSB0aGUgaW5zZXJ0aW9uIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUgSFRNTAotCQkvLyBhbmQgcGVyZm9ybSBhIHNlYXJjaCBhbmQgcmVwbGFjZSBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uIAotCQlfcmVwbGFjZUFsbFRleHQoZmluZFRleHQsIHJlcGxhY2VUZXh0LCBvcHRpb25zKTsKLQl9Ci0JZWxzZSB7Ci0JCS8vIFRPRE86IEVtdWxhdGUgdGhlIElFIGltcGxlbWVudGF0aW9uLgotCQl2YXIgaHRtbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvcklkKS5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MOwotCQl2YXIgb3B0aW9uU3RyID0gIi9nIjsKLQkJaWYgKChvcHRpb25zICYgNCkgPT0gMCkgewotCQkJb3B0aW9uU3RyICs9ICJpIjsKLQkJfQotCQl2YXIgcmVnRXhwID0gZXZhbCgiLyIgKyBmaW5kVGV4dCArIG9wdGlvblN0cik7Ci0JCWh0bWwgPSBodG1sLnJlcGxhY2UocmVnRXhwLCByZXBsYWNlVGV4dCk7Ci0JCXNldFRleHQoaHRtbCk7Ci0JfQotCQotCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotfQotCi0vLyBSZXBsYWNlcyB0ZXh0LgotZnVuY3Rpb24gcmVwbGFjZVRleHQocmVwbGFjZVRleHQsIGRpciwgb3B0aW9ucykgewotCWlmIChyZWFkT25seSB8fCAhdXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAocmVwbGFjZVRleHQgPT0gbnVsbCkgewotCQlyZXBsYWNlVGV4dCA9ICIiOwotCX0KLQllbHNlIHsKLQkJcmVwbGFjZVRleHQgPSBkZWNvZGVTdHJpbmcocmVwbGFjZVRleHQpOwotCX0KLQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCXNlbGVjdGlvblJhbmdlLnRleHQgPSByZXBsYWNlVGV4dDsKLQkJaWYgKHJlcGxhY2VUZXh0ICE9ICIiKSB7Ci0JCQlzZWxlY3Rpb25SYW5nZS5tb3ZlU3RhcnQoIndvcmQiLCAtMSk7Ci0JCQlzZWxlY3Rpb25SYW5nZS5zZWxlY3QoKTsKLQkJCXNlbGVjdGlvblJhbmdlLmNvbGxhcHNlKGRpciA8IDApOwotCQl9Ci0JfQotCWVsc2UgewotCQlzZWxlY3Rpb25SYW5nZS5kZWxldGVDb250ZW50cygpOwotCQlzZWxlY3Rpb25SYW5nZS5pbnNlcnROb2RlKGVkaXRvckRvYy5jcmVhdGVUZXh0Tm9kZShyZXBsYWNlVGV4dCkpOwotCX0KLQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQlzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsKLX0KLQotLy8gU2VsZWN0cyBhbGwgdGV4dC4KLWZ1bmN0aW9uIHNlbGVjdEFsbCgpIHsKLQlpZiAodXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJaWYgKGVkaXRvckRvYy5leGVjQ29tbWFuZCgnc2VsZWN0YWxsJywgZmFsc2UsIG51bGwpKSB7Ci0JCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJfQotCX0KLX0KLQotLy8gU2V0cyB0aGUgZm9udCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIHNldEZvbnROYW1lKG5hbWUpIHsKLQlpZiAodXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJaWYgKG5hbWUgPT0gJycpIHsKLQkJCQlmb3JtYXRUZXh0KCdyZW1vdmVGb3JtYXQnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9ybWF0VGV4dCgnZm9udG5hbWUnLCBuYW1lKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLy8gU2V0cyB0aGUgZm9udCBzaXplIGZvciB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIHNldEZvbnRTaXplKHNpemUpIHsKLQlpZiAodXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJaWYgKHNpemUgIT0gbnVsbCkgewotCQkJaWYgKHNpemUgPT0gJycpIHsKLQkJCQlmb3JtYXRUZXh0KCdyZW1vdmVGb3JtYXQnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9ybWF0VGV4dCgnZm9udHNpemUnLCBzaXplKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLy8gU2V0cyB0aGUgZm9udCBzdHlsZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBzZXRGb250U3R5bGUoc3R5bGUpIHsgCi0JaWYgKCFyZWFkT25seSAmJiBzdHlsZSAhPSBudWxsICYmIHN0eWxlICE9ICcnICYmIHVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJc2VsZWN0aW9uUmFuZ2UuZXhlY0NvbW1hbmQoInJlbW92ZWZvcm1hdCIpOwotCQkJCXNlbGVjdGlvblJhbmdlLnBhcmVudEVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzTmFtZSIpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChlKSB7Ci0JCX0KLQkJaWYgKHN0eWxlID09ICI8cXVvdGU+IikgewotCQkJZm9ybWF0VGV4dCgnZm9ybWF0YmxvY2snLCAnPHA+Jyk7Ci0JCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJc2VsZWN0aW9uUmFuZ2UucGFyZW50RWxlbWVudCgpLmNsYXNzTmFtZSA9ICJxdW90ZSI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZWxlY3Rpb24uZm9jdXNOb2RlLnBhcmVudE5vZGUuY2xhc3NOYW1lID0gInF1b3RlIjsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzdHlsZSA9PSAiPGNvZGU+IikgewotCQkJZm9ybWF0VGV4dCgnZm9ybWF0YmxvY2snLCAnPHA+Jyk7Ci0JCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJc2VsZWN0aW9uUmFuZ2UucGFyZW50RWxlbWVudCgpLmNsYXNzTmFtZSA9ICJjb2RlU2FtcGxlIjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNlbGVjdGlvbi5mb2N1c05vZGUucGFyZW50Tm9kZS5jbGFzc05hbWUgPSAiY29kZVNhbXBsZSI7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoIWRvY3VtZW50LmFsbCAmJiBzdHlsZSA9PSAiPHA+IikgewotCQkJCS8vIEEgaGFjayB0byBnZXQgcmlkIG9mIHRoZSAiY2xhc3NOYW1lIiBhdHRyaWJ1dGUgaW4gTW96aWxsYS9GaXJlZm94LgotCQkJCWZvcm1hdFRleHQoJ2Zvcm1hdGJsb2NrJywgJzxoND4nKTsKLQkJCX0KLQkJCWZvcm1hdFRleHQoJ2Zvcm1hdGJsb2NrJywgc3R5bGUpOwotCQl9Ci0JfQotfQotCi0vLyBTZXRzIHdoZXRoZXIgdGhlIGNvbnRlbnQgY2FuIGJlIGVkaXRlZC4KLWZ1bmN0aW9uIHNldEVkaXRhYmxlKGVkaXRhYmxlKSB7Ci0JdmFyIGRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvcklkKS5jb250ZW50V2luZG93LmRvY3VtZW50OwotICAgIGlmIChlZGl0YWJsZSAhPSBudWxsICYmIGVkaXRhYmxlID09ICd0cnVlJykgewotCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQlkb2MuYm9keS5jb250ZW50RWRpdGFibGUgPSAidHJ1ZSI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkb2MuZGVzaWduTW9kZSA9ICJvbiI7Ci0JCX0KLQkJcmVhZE9ubHkgPSBmYWxzZTsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsJCQotCQkJZG9jLmJvZHkuY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKLQkJfQotCQllbHNlIHsKLQkJCWRvYy5kZXNpZ25Nb2RlID0gIm9mZiI7Ci0JCX0KLQkJcmVhZE9ubHkgPSB0cnVlOwotCX0KLQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsJCi19Ci0KLS8vIFRvZ2dsZXMgdGhlICdzdHJpa2UtdGhyb3VnaCcgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gc3RyaWtlVGhyb3VnaCgpIHsKLQlmb3JtYXRUZXh0KCdzdHJpa2V0aHJvdWdoJywgc2l6ZSk7Ci19Ci0KLS8vIFRvZ2dsZXMgdGhlICdzdWJzY3JpcHQnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIHN1YnNjcmlwdCgpIHsKLQlmb3JtYXRUZXh0KCdzdWJzY3JpcHQnLCBudWxsKTsKLX0KLQotLy8gVG9nZ2xlcyB0aGUgJ3N1cGVyc2NyaXB0JyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBzdXBlcnNjcmlwdCgpIHsKLQlmb3JtYXRUZXh0KCdzdXBlcnNjcmlwdCcsIG51bGwpOwotfQotCi0vLyBUb2dnbGVzIHRoZSAndW5kZXJsaW5lJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiB1bmRlcmxpbmUoKSB7Ci0JZm9ybWF0VGV4dCgndW5kZXJsaW5lJywgbnVsbCk7Ci19Ci0KLS8vIENvbnZlcnRzIGEgbGluayB0byBub3JtYWwgdGV4dC4KLWZ1bmN0aW9uIHVubGluaygpIHsKLQlmb3JtYXRUZXh0KCd1bmxpbmsnLCBudWxsKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUueHNsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ4OTE0ZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9ydGUiPgotCTx4c2w6dmFyaWFibGUgbmFtZT0icnRlX2lkIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+PC94c2w6dmFyaWFibGU+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJydGVfanMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAanMiLz48L3hzbDp2YXJpYWJsZT4KLQk8aHRtbD4KLQkJPGhlYWQ+Ci0JCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ieyRydGVfanN9Ij48L3NjcmlwdD4KLQkJPC9oZWFkPgotCQk8Ym9keSBsZWZ0TWFyZ2luPSIwIiB0b3BNYXJnaW49IjAiIG1hcmdpbmhlaWdodD0iMCIgbWFyZ2lud2lkdGg9IjAiIHNjcm9sbD0ibm8iIHN0eWxlPSJvdmVyZmxvdzogaGlkZGVuIj4KLQkJCTxpZnJhbWUgaWQ9InskcnRlX2lkfSIgbmFtZT0ieyRydGVfaWR9IiBzdHlsZT0iYm9yZGVyOiBub25lOyIgZnJhbWVib3JkZXI9IjAiIHNjcm9sbGluZz0iYXV0byIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+PC9pZnJhbWU+Ci0JCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCWluaXRFZGl0b3IoJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz4nLCAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjc3MiLz4nLCAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBiYXNlVVJMIi8+Jyk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9ib2R5PgotCTwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9JUmljaFRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvSVJpY2hUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0ODI4MzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9JUmljaFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSByaWNoIHRleHQgY29udHJvbC4KLSAqIDxwPgotICogQSByaWNoIHRleHQgY29udHJvbCBpcyBhbiBlZGl0YWJsZSB1c2VyIGludGVyZmFjZSBvYmplY3QgdGhhdCBkaXNwbGF5cyByaWNoCi0gKiB0ZXh0IGFuZCBpbWFnZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJpY2hUZXh0IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAicmljaFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiB0aGlzIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IGRhdGEuCi0JICogCi0JICogQHBhcmFtIGxheW91dERhdGEKLQkgKiAgICAgICAgICAgIHRoZSBsYXlvdXQgZGF0YSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXREYXRhKE9iamVjdCBsYXlvdXREYXRhKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhLgotCSAqIAotCSAqIEByZXR1cm4gdGhpcyBjb250cm9sJ3MgbGF5b3V0IGRhdGEKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExheW91dERhdGEoKTsKLQotCS8qKgotCSAqIFNldHMgZm9jdXMgdG8gdGhpcyBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCk7Ci0KLQkvKioKLQkgKiBUZWxscyB0aGUgY29udHJvbCBpdCBkb2VzIG5vdCBoYXZlIGZvY3VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJsdXIoKTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgY29udHJvbCBoYXMgZm9jdXMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnRyb2wgaGFzIHRoZSB1c2VyLWludGVyZmFjZSBmb2N1cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIHRleHQgYW5kIGltYWdlIGxpbmtzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MgaW4gdGhpcyBjb250cm9sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlUGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdGFibGUgc3RhdGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudCBpcyBlZGlhdGJsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEVkaXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0YWJsZSBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNvbnRlbnQgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE1vZGlmaWVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RpZmllZCBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZWQKLQkgKiAgICAgICAgICAgIHRoZSBtb2RpZmllZCBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVkKGJvb2xlYW4gbW9kaWZpZWQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgZm9ybWF0dGVkIGluIGEgbWFya3VwIGxhbmd1YWdlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByaWNoIHRleHQgY29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHJpY2ggdGV4dCBjb250ZW50IGZvcm1hdHRlZCBpbiBhIG1hcmt1cCBsYW5ndWFnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpOwotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIHJpY2ggdGV4dCBjb250ZW50IGJhY2sgdG8gdGhlIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgcmVzdG9yZVRleHQoKTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBlZGl0b3IgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZC4gSWYgaXQgaGFzIGJlZW4KLQkgKiBtb2RpZmllZCwgbm90aWZ5IHRoZSBtb2RpZnkgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrTW9kaWZ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyB0aGUgY3VycmVudCBzZWxlY3Rpb24KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+UmljaFRleHRTZWxlY3Rpb248L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBSaWNoVGV4dFNlbGVjdGlvbiBnZXRTZWxlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaGFzIG5vdAotCSAqICAgICAgICAgYmVlbiBzZXQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERhdGEoU3RyaW5nIGtleSk7Ci0KLQkvKioKLQkgKiBTZXRzIGFuIGFwcGxpY2F0aW9uIHNwZWNpZmljIHByb3BlcnR5IG5hbWUgYW5kIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kLiBUaGUgc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUKLQkgKiBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcmV0dXJuCWEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kKTsKLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlci4gVGhlCi0JICogc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUgZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHBhcmFtCXBhcmFtCQlhIHBhcmFtZXRlciBmb3IgdGhlIGNvbW1hbmQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuCWEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kLCBTdHJpbmcgcGFyYW0pOwotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kIHdpdGggYW4gYXJyYXkgb2YgcGFyYW1ldGVycy4gVGhlCi0JICogc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUgZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHBhcmFtCXBhcmFtcwkJYW4gYXJyYXkgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGNvbW1hbmQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuCWEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kLCBTdHJpbmdbXSBwYXJhbXMpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kaWZ5IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiBhbiBpdGVyYXRvciBmb3IgcmV0cmlldmluZyB0aGUgbW9kaWZ5IGxpc3RlbmVycwotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRNb2RpZnlMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIGtleXMgYXJlIHByZXNzZWQgYW5kIHJlbGVhc2VkIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkS2V5TGlzdGVuZXIoS2V5TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiBrZXlzIGFyZSBwcmVzc2VkIGFuZCByZWxlYXNlZCB3aXRoaW4gdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVLZXlMaXN0ZW5lcihLZXlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiB0aGUgY29udGVudCBvZiB0aGlzIGNvbnRyb2wgaXMgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiB0aGUgY29udGVudCBvZiB0aGlzIGNvbnRyb2wgaXMgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkIHdoZW4KLQkgKiB0aGlzIGNvbnRyb2wgaXMgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIHRoaXMgY29udHJvbCBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiBoZWxwIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGZvciB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkSGVscExpc3RlbmVyKEhlbHBMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIGhlbHAgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgZm9yIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlSGVscExpc3RlbmVyKEhlbHBMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZCB3aGVuCi0JICogYW4gZXZlbnQgb2YgdGhlIGdpdmVuIHR5cGUgb2NjdXJzIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIGZvcgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudCBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkCi0JICogd2hlbiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgZWNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIHRvCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudAotCSAqICAgICAgICAgICAgb2NjdXJzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoaW50IGV2ZW50VHlwZSwgTGlzdGVuZXIgbGlzdGVuZXIpOwotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBtb2RpZnkgbGlzdGVuZXJzCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiBhbiBpdGVyYXRvciBmb3IgcmV0cmlldmluZyB0aGUgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMKLQkgKiAgICAgICAgIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0TGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIFVSTCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgd2hvc2UgY29udGVudCB3YXMgbGFzdAotCSAqIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhc2UgVVJMIG9mIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgVVJMIGdldENvcHlVUkwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0IGNvcGllZAotCSAqIHRvIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weVVSTCgpOwotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBjb250cm9sIGhhcyBiZWVuIGRpc3Bvc2VkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjb250cm9sIGlzIGRpc3Bvc2VkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250cm9sJ3MgRmluZFJlcGxhY2VBY3Rpb24KLQkgKi8KLQlwdWJsaWMgRmluZFJlcGxhY2VBY3Rpb24gZ2V0RmluZFJlcGxhY2VBY3Rpb24oKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBGaW5kUmVwbGFjZUFjdGlvbiB0byB1c2UKLQkgKiBAcGFyYW0gZmluZFJlcGxhY2VBY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5kUmVwbGFjZUFjdGlvbihGaW5kUmVwbGFjZUFjdGlvbiBmaW5kUmVwbGFjZUFjdGlvbik7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgaW5pdGlhbFRleHQgdmFyaWFibGUsIHdoaWNoIHN0b3JlcyB3aGF0IGlzIHNhdmVkIG9uIGRpc2sKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxUZXh0KFN0cmluZyB0ZXh0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dEVkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9JUmljaFRleHRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDU1ZWFhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSByaWNoIHRleHQgZWRpdG9yLgotICogPHA+Ci0gKiBBIHJpY2ggdGV4dCBlZGl0b3IgaXMgYSBjb21wb3NpdGUgdXNlciBpbnRlcmZhY2Ugb2JqZWN0IHRoYXQgaW5jbHVkZXMgYSB0b29sCi0gKiBiYXIsIGEgdGFiIGZvbGRlciBmb3IgZW50ZXJpbmcgdGhlIHJpY2ggdGV4dCBjb250ZW50LCBhbmQgYSB0YWIgZm9sZGVyIGZvcgotICogdmlld2luZyBhbmQgbW9kaWZ5aW5nIHRoZSByaWNoIHRleHQgY29udGVudCBpbiBhIG1hcmt1cCBsYW5ndWFnZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJpY2hUZXh0RWRpdG9yIGV4dGVuZHMgSVJpY2hUZXh0IHsKLQotCS8qKgotCSAqIEZpbGxzIHRoZSB0b29sIGJhciB3aXRoIHJpY2ggdGV4dCBhY3Rpb24gaXRlbXMuCi0JICogCi0JICogQHBhcmFtIHRvb2xCYXIKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGVkaXRvciB0b29sIGJhcgotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxUb29sQmFyKElSaWNoVGV4dFRvb2xCYXIgdG9vbEJhcik7Ci0KLQkvKioKLQkgKiBTZWxlY3RzIHRoZSByaWNoIHRleHQgb3IgdGhlIG1hcmt1cCBsYW5ndWFnZSB0YWIuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICA8Y29kZT4wPC9jb2RlPiBmb3IgdGhlIHJpY2ggdGV4dCB0YWIsIDxjb2RlPjE8L2NvZGU+IGZvcgotCSAqICAgICAgICAgICAgdGhlIG1hcmt1cCBsYW5ndWFnZSB0YWIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBGaW5kUmVwbGFjZUFjdGlvbiB0byB1c2UKLQkgKiBAcGFyYW0gZmluZFJlcGxhY2VBY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5kUmVwbGFjZUFjdGlvbihGaW5kUmVwbGFjZUFjdGlvbiBmaW5kUmVwbGFjZUFjdGlvbik7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvSVJpY2hUZXh0VG9vbEJhci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9JUmljaFRleHRUb29sQmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdhYmJjMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9JUmljaFRleHRUb29sQmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5JUmljaFRleHRDb21ib0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHJpY2ggdGV4dCBlZGl0b3IgdG9vbGJhci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJpY2hUZXh0VG9vbEJhciB7Ci0KLQkKLQkvKioKLQkgKiBBZGRzIGEgYnV0dG9uIGFjdGlvbiB0byB0aGUgdG9vbCBiYXIuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbgotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbiBhY3Rpb24gdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uKElBY3Rpb24gYWN0aW9uKTsKLQotCS8qKgotCSAqIEFkZHMgYSBjb21ibyBhY3Rpb24gdG8gdGhlIHRvb2wgYmFyLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBjb21ibyBhY3Rpb24gdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uKElSaWNoVGV4dENvbWJvQWN0aW9uIGFjdGlvbik7Ci0KLQkvKioKLQkgKiBBZGRzIGEgc2VwYXJhdG9yIHRvIHRoZSB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXBhcmF0b3IoKTsKLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHRvb2xiYXIgc3RhdGUuCi0JICogPHA+Ci0JICogRW5hYmxlcy9kaXNhYmxlcyBhY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0JICogUmljaFRleHRFZGl0b3IgdGFiIChSaWNoVGV4dCB2cy4gSFRNTCkKLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGFibGUgc3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlIG5vbi1SZWFkT25seSBjb21tYW5kcwotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xCYXIoYm9vbGVhbiBlbmFibGVkKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZDJkOWI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBGb250IFN0eWxlIE5hbWVzCi1mb250U3R5bGVfbm9ybWFsPU5vcm1hbAotZm9udFN0eWxlX3NlY3Rpb25IZWFkaW5nPVNlY3Rpb24gSGVhZGluZwotZm9udFN0eWxlX3N1YnNlY3Rpb25IZWFkaW5nPVN1YnNlY3Rpb24gSGVhZGluZwotZm9udFN0eWxlX3N1YlN1YnNlY3Rpb25IZWFkaW5nPVN1YiBTdWJzZWN0aW9uIEhlYWRpbmcKLWZvbnRTdHlsZV9xdW90ZT1RdW90ZQotZm9udFN0eWxlX2NvZGVTYW1wbGU9Q29kZSBTYW1wbGUKLQotIyBIVE1MIEJsb2NrIFRhZ3MKLWJsb2NrVGFnX3BhcmFncmFwaD1QYXJhZ3JhcGgKLWJsb2NrVGFnX2hlYWRpbmcxPUhlYWRpbmcgMQotYmxvY2tUYWdfaGVhZGluZzI9SGVhZGluZyAyCi1ibG9ja1RhZ19oZWFkaW5nMz1IZWFkaW5nIDMKLWJsb2NrVGFnX2hlYWRpbmc0PUhlYWRpbmcgNAotYmxvY2tUYWdfaGVhZGluZzU9SGVhZGluZyA1Ci1ibG9ja1RhZ19oZWFkaW5nNj1IZWFkaW5nIDYKLWJsb2NrVGFnX2FkZHJlc3M9QWRkcmVzcwotYmxvY2tUYWdfcHJlZm9ybWF0dGVkVGV4dD1QcmVmb3JtYXR0ZWQgVGV4dAotCi0jIEhUTUwgRm9udCBOYW1lcwotZm9udE5hbWVfZGVmYXVsdD1EZWZhdWx0Ci1mb250TmFtZV9hcmlhbD1BcmlhbAotZm9udE5hbWVfY291cmllck5ldz1Db3VyaWVyIE5ldwotZm9udE5hbWVfdGltZXNOZXdSb21hbj1UaW1lcyBOZXcgUm9tYW4KLWZvbnROYW1lX3ZlcmRhbmE9VmVyZGFuYQotCi0jIFJpY2ggVGV4dCBFZGl0b3IgVG9vbCBCdXR0b25zCi1hZGRIb3Jpem9udGFsQmFyQWN0aW9uX3Rvb2xUaXBUZXh0PUFkZCBIb3Jpem9udGFsIEJhcgotYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQ9QWRkIEltYWdlCi1hZGRMaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PUFkZCBMaW5lCi1hZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0PUFkZCBMaW5rCi1hZGRPcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1BZGQgT3JkZXJlZCBMaXN0Ci1hZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dD1BZGQgVGFibGUKLWFkZFVub3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ9QWRkIFVub3JkZXJlZCBMaXN0Ci1ib2xkQWN0aW9uX3Rvb2xUaXBUZXh0PUJvbGQKLWNsZWFyQ29udGVudEFjdGlvbl90b29sVGlwVGV4dD1DbGVhciBDb250ZW50Ci1jb3B5QWN0aW9uX3Rvb2xUaXBUZXh0PUNvcHkKLWN1dEFjdGlvbl90b29sVGlwVGV4dD1DdXQKLWZpbmRSZXBsYWNlQWN0aW9uX3Rvb2xUaXBUZXh0PUZpbmQvUmVwbGFjZQotaW5kZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUluZGVudAotaXRhbGljQWN0aW9uX3Rvb2xUaXBUZXh0PUl0YWxpYwotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1KdXN0aWZ5IENlbnRlcgotanVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQ9SnVzdGlmeSBGdWxsCi1qdXN0aWZ5TGVmdEFjdGlvbl90b29sVGlwVGV4dD1KdXN0aWZ5IExlZnQKLWp1c3RpZnlSaWdodEFjdGlvbl90b29sVGlwVGV4dD1KdXN0aWZ5IFJpZ2h0Ci1vdXRkZW50QWN0aW9uX3Rvb2xUaXBUZXh0PU91dGRlbnQKLXBhc3RlQWN0aW9uX3Rvb2xUaXBUZXh0PVBhc3RlCi1wYXN0ZVBsYWluVGV4dEFjdGlvbl90b29sVGlwVGV4dD1QYXN0ZSBhcyBwbGFpbiB0ZXh0Ci1zdWJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9U3Vic2NyaXB0Ci1zdXBlcnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1TdXBlcnNjcmlwdAotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVVuZGVybGluZQotdGlkeV9jbGVhbl90ZXh0PURlZmF1bHQgQ2xlYW4KLXRpZHlfY2xlYW5lcl90ZXh0PUNsZWFuIE1TIEhUTUwKLXRpZHlfY2xlYW5lc3RfdGV4dD1DbGVhbiBXb3JkIDIwMDAgSFRNTAotdGlkeV9jbGVhbl90b29sVGlwVGV4dD1DbGVhbiB3aXRoIEpUaWR5IHVzaW5nIGRlZmF1bHQgb3B0aW9ucwotdGlkeV9jbGVhbmVyX3Rvb2xUaXBUZXh0PUNsZWFuIEhUTUwgb2YgTVMgSFRNTAotdGlkeV9jbGVhbmVzdF90b29sVGlwVGV4dD1DbGVhbiBXb3JkIDIwMDAgSFRNTAotCi0KLSMgUmljaCBUZXh0IEVkaXRvciBDb21ib2JveGVzCi1mb250U3R5bGVBY3Rpb25fdG9vbFRpcFRleHQ9U2V0IEZvbnQgU3R5bGUKLWJsb2NrVGFnQWN0aW9uX3Rvb2xUaXBUZXh0PVNldCBCbG9jayBUYWcKLWZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0PQotZm9udE5hbWVBY3Rpb25fRGVmYXVsdEZvbnROYW1lPURlZmF1bHQgZm9udAotZm9udFNpemVBY3Rpb25fdG9vbFRpcFRleHQ9U2V0IEZvbnQgU2l6ZQotCi0jIFJpY2ggVGV4dCBFZGl0b3IgQ29udGV4dCBNZW51IEl0ZW1zCi1jdXRBY3Rpb25fdGV4dD0mQ3V0Ci1jb3B5QWN0aW9uX3RleHQ9QyZvcHkKLXBhc3RlQWN0aW9uX3RleHQ9JlBhc3RlCi1wYXN0ZVBsYWluVGV4dEFjdGlvbl90ZXh0PVBhc3RlICZhcyBwbGFpbiB0ZXh0Ci0KLSMgUmljaCBUZXh0IEVkaXRvciBUYWJzCi1yaWNoVGV4dFRhYl90ZXh0PVJpY2ggVGV4dAotcmljaFRleHRUYWJfdG9vbFRpcFRleHQ9RWRpdCBjb250ZW50IGluIHJpY2ggdGV4dAotaHRtbFRhYl90ZXh0PUhUTUwKLWh0bWxUYWJfdG9vbFRpcFRleHQ9RWRpdCBjb250ZW50IGluIEhUTUwKLQotIyBBZGQgRGlhbG9ncwotYWRkSW1hZ2VEaWFsb2dfdGl0bGU9QWRkIEltYWdlCi1hZGRMaW5rRGlhbG9nX3RpdGxlPUFkZCBMaW5rCi1hZGRUYWJsZURpYWxvZ190aXRsZT1BZGQgVGFibGUKLWZpbmRSZXBsYWNlRGlhbG9nX3RpdGxlPUZpbmQvUmVwbGFjZQotdXJsTGFiZWxfdGV4dD1VUkw6Ci1zdW1tYXJ5TGFiZWxfdGV4dD1TdW1tYXJ5OgotY2FwdGlvbkxhYmVsX3RleHQ9Q2FwdGlvbjoKLXJvd3NMYWJlbF90ZXh0PVJvd3M6Ci1jb2x1bW5zTGFiZWxfdGV4dD1Db2x1bW5zOgotd2lkdGhMYWJlbF90ZXh0PVdpZHRoOgotdGFibGVTdHlsZUxhYmVsX3RleHQ9U3R5bGU6Ci10YWJsZUhlYWRlck5vbmVfdGV4dD1UYWJsZSB3aXRoIG5vIGhlYWRlcnMKLXRhYmxlSGVhZGVyQ29sc190ZXh0PVRhYmxlIHdpdGggY29sdW1uIGhlYWRlcnMKLXRhYmxlSGVhZGVyUm93c190ZXh0PVRhYmxlIHdpdGggcm93IGhlYWRlcnMKLXRhYmxlSGVhZGVyQm90aF90ZXh0PVRhYmxlIHdpdGggY29sdW1uIGFuZCByb3cgaGVhZGVycwotYnJvd3NlQnV0dG9uX3RleHQ9QnJvd3NlLi4uCi0KLSMgQ2xlYXIgRWRpdG9yIENvbnRlbnQgRGlhbG9nCi1jbGVhckNvbnRlbnREaWFsb2dfdGl0bGU9Q2xlYXIgRWRpdG9yIENvbnRlbnQgQ29uZmlybWF0aW9uCi1jbGVhckNvbnRlbnREaWFsb2dfdGV4dD1EbyB5b3UgcmVhbGx5IHdhbnQgdG8gY2xlYXIgdGhlIGNvbnRlbnQgb2YgdGhpcyByaWNoIHRleHQgZWRpdG9yPwotCi0jIEZpbmQvUmVwbGFjZSBEaWFsb2cKLWZpbmRMYWJlbF90ZXh0PUZpbmQ6Ci1yZXBsYWNlTGFiZWxfdGV4dD1SZXBsYWNlIHdpdGg6Ci1vcHRpb25zR3JvdXBfdGV4dD1PcHRpb25zCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1DYXNlIHNlbnNpdGl2ZQotd2hvbGVXb3JkQ2hlY2tib3hfdGV4dD1XaG9sZSB3b3JkCi1kaXJlY3Rpb25Hcm91cF90ZXh0PURpcmVjdGlvbgotZm9yd2FyZFJhZGlvQnV0dG9uX3RleHQ9Rm9yd2FyZAotYmFja3dhcmRSYWRpb0J1dHRvbl90ZXh0PUJhY2t3YXJkCi1maW5kQnV0dG9uX3RleHQ9RmluZAotcmVwbGFjZUJ1dHRvbl90ZXh0PVJlcGxhY2UKLXJlcGxhY2VGaW5kQnV0dG9uX3RleHQ9UmVwbGFjZS9GaW5kCi1yZXBsYWNlYWxsQnV0dG9uX3RleHQ9UmVwbGFjZSBBbGwKLSMgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcgotRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWw9U3RyaW5nIE5vdCBGb3VuZAotCi0jIFByZWZlcmVuY2UgUGFnZQotbWF4Q2hhcnNQZXJMaW5lTGFiZWxfdGV4dD1NYXhpbXVtIGNoYXJhY3RlcnMgcGVyIGxpbmU6Ci1pbmRlbnRIVE1MQ2hlY2tib3hfdGV4dD1JbmRlbnQgSFRNTCB0YWdzCi1pbmRlbnRTaXplTGFiZWxfdGV4dD1JbmRlbnQgU2l6ZToKLXVybERpc3BsYXlOYW1lTGFiZWxfdGV4dD1VUkwgRGlzcGxheSBOYW1lOgotCi0jIERPIE5PVCBUUkFOU0xBVEUgQkVMT1cgVEhJUyBMSU5FCi0jIFNUQVJUIE5PLVRSQU5TTEFURQotZm9udE5hbWVBY3Rpb25fQ1NTX0RlZmF1bHQ9YXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZgotZm9udE5hbWVBY3Rpb25fQ1NTX0RlZmF1bHRfTW96aWxsYT1hcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZgotIyBFTkQgTk8tVFJBTlNMQVRFCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2EzOWQzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLmh0bWwuSFRNTEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbC5YU0xUUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZpbmRSZXBsYWNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlBhc3RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlBhc3RlUGxhaW5UZXh0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuU3RhdHVzVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCByaWNoIHRleHQgY29udHJvbCBpbXBsZW1lbnRhdGlvbi4KLSAqIDxwPgotICogVGhlIGRlZmF1bHQgcmljaCB0ZXh0IGVkaXRvciB1c2VzIFhIVE1MIGFzIHRoZSB1bmRlcmx5aW5nIG1hcmt1cCBsYW5ndWFnZSBmb3IKLSAqIHRoZSByaWNoIHRleHQgY29udGVudC4gSXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSBTV1QgPGNvZGU+QnJvd3NlcjwvY29kZT4KLSAqIGNvbnRyb2wgYW5kIERIVE1MIChIVE1MLCBDU1MgYW5kIEphdmFTY3JpcHQpLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHQgaW1wbGVtZW50cyBJUmljaFRleHQgewotCi0JLy8gRW5jb2RlZCBzaW5nbGUgcXVvdGUuIEFsbCBzaW5nbGUgcXVvdGVzIG5lZWQgdG8gYmUgc3BlY2lhbGx5IGVuY29kZWQgdG8KLQkvLyBhdm9pZCBKYXZhU2NyaXB0IGVycm9yIHdoZW4gY2FsbGluZyBCcm93c2UuZXhlY3V0ZUNvbW1hbmQoKS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RFRF9TSU5HTEVfUVVPVEUgPSAiJXNxJSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPREVEX05FV0xJTkUgPSAiJUVPTCUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVFVTX1BSRUZJWCA9ICIkJCQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX1BSRUZJWF9MRU5HVEggPSBTVEFUVVNfUFJFRklYLmxlbmd0aCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19OT1AgPSAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19JTklUSUFMSVpFRCA9IDE7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX01PRElGSUVEID0gMjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfR0VUX1RFWFQgPSAzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19LRVlfRE9XTiA9IDQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0tFWV9VUCA9IDU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX1NFTEVDVF9URVhUID0gNjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfU0VMRUNUX0NPTlRST0wgPSA3OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19TRUxFQ1RfTk9ORSA9IDg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0VYRUNfQ01EID0gOTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfUkVGT1JNQVRfTElOS1MgPSAxMDsKLQotCS8vIFRoZSBkZWZhdWx0IGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MgKDxocmVmPiwgPGltZz4sIGV0Yy4pCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQkFTRV9QQVRIID0gU3lzdGVtCi0JCQkuZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpIC8vJE5PTi1OTFMtMSQKLQkJCSsgU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpICsgInJ0ZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLy8gSWYgdHJ1ZSwgbG9nIGRlYnVnZ2luZyBpbmZvLgotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnOwotCi0JLy8gVGhlIHBsdWctaW4gbG9nZ2VyLgotCXByb3RlY3RlZCBMb2dnZXIgbG9nZ2VyOwotCi0JLy8gVGhlIHVuZGVybHlpbmcgU1dUIEJyb3dzZXIgdXNlZCBmb3IgbG9hZGluZyB0aGUgSmF2YVNjcmlwdC9ESFRNTCBlZGl0b3IuCi0JcHJvdGVjdGVkIEJyb3dzZXIgZWRpdG9yOwotCi0JLy8gVGhlIHVuZGVybHlpbmcgT2xlQ29udHJvbFNpdGUgZm9yIHRoZSBTV1QgQnJvd3NlciAoV2luMzIgb25seSkuCi0JcHJvdGVjdGVkIENvbnRyb2wgZWRpdG9yQ29udHJvbDsKLQotCS8vIFRoZSBiYXNlIFVSTCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgd2hvc2UgY29udGVudCB3YXMgbGFzdAotCS8vIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLgotCXByb3RlY3RlZCBzdGF0aWMgVVJMIGNvcHlVUkw7Ci0KLQkvLyBUaGUgY29udGV4dCBtZW51IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRyb2wuCi0JcHJvdGVjdGVkIE1lbnUgY29udGV4dE1lbnU7Ci0KLQkvLyBUaGUgZm9sZGVyIHRoYXQgY29udGFpbnMgdGhlIHN1cHBvcnRpbmcgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzCi0JcHJvdGVjdGVkIFN0cmluZyBydGVGb2xkZXI7Ci0KLQkvLyBUaGUgVVJMIHRoYXQgcG9pbnRzIHRvIHRoZSBzdXBwb3J0aW5nIENTUyBhbmQgSmF2YVNjcmlwdCBmaWxlcy4KLQlwcm90ZWN0ZWQgU3RyaW5nIHJ0ZVVSTDsKLQotCS8vIFRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzICg8aHJlZj4sIDxpbWc+LCBldGMuKQotCXByb3RlY3RlZCBTdHJpbmcgYmFzZVBhdGg7Ci0KLQkvLyBUaGUgREhUTUwgaW5pdGlhbGl6YXRpb24gZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplZDsKLQotCS8vIFRoZSBpbml0aWFsIGZvY3VzLgotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVkV2l0aEZvY3VzOwotCi0JLy8gVGhlIGNvbnRyb2wncyBpbml0aWFsIHRleHQuIFRoaXMgaXMgdXNlZCB0byBjYWNoZSB0aGUgSFRNTCBzb3VyY2UgcGFzc2VkCi0JLy8gaW4gdmlhIHNldFRleHQoKXdoaWxlIHRoZSBESFRNTCBpbml0aWFsaXphdGlvbiBpcyBoYXBwZW5pbmcuCi0JcHJvdGVjdGVkIFN0cmluZyBpbml0aWFsVGV4dDsKLQotCS8vIFRoZSBjb250cm9sJ3MgY3VycmVudCB0ZXh0LgotCXByb3RlY3RlZCBTdHJpbmcgY3VycmVudFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGNvbnRyb2wncyBlZGl0YWJsZSBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIGVkaXRhYmxlID0gdHJ1ZTsKLQotCS8vIFRoZSBjb250cm9sJ3MgbW9kaWZpY2F0aW9uIGZsYWcuCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW9kaWZpZWQ7Ci0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgYW5kIG9iamVjdCBzZWxlY3Rpb24gZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNTZWxlY3Rpb247Ci0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgc2VsZWN0aW9uCi0JcHJvdGVjdGVkIFJpY2hUZXh0U2VsZWN0aW9uIHJpY2hUZXh0U2VsZWN0aW9uID0gbmV3IFJpY2hUZXh0U2VsZWN0aW9uKCk7Ci0KLQkvLyBKYXZhU2NyaXB0IGNvbW1hbmQgZXhlY3V0aW9uIHN0YXR1cyBjb2RlLgotCXByb3RlY3RlZCBpbnQgc3RhdHVzID0gMDsKLQotCS8vIFRoZSBIVE1MIHNvdXJjZSBmb3JtYXR0ZXIuCi0JcHJvdGVjdGVkIEhUTUxGb3JtYXR0ZXIgaHRtbEZvcm1hdHRlcjsKLQotCS8vIFRoZSBTV1QgZXZlbnQgbGlzdGVuZXJzLgotCXByb3RlY3RlZCBNYXA8TGlzdGVuZXIsIFJpY2hUZXh0TGlzdGVuZXI+IGxpc3RlbmVyczsKLQotCS8vIFRoZSBtb2RpZnkgbGlzdGVuZXJzLgotCXByb3RlY3RlZCBMaXN0PE1vZGlmeUxpc3RlbmVyPiBtb2RpZnlMaXN0ZW5lcnM7Ci0KLQkvLyBUaGUgY29udHJvbCdzIGVkaXQgZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub3RpZnlpbmdNb2RpZnlMaXN0ZW5lcnMgPSBmYWxzZTsKLQotCS8vIFRoZSBjb250cm9scydzIGZvY3VzIGZsYWcuCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzRm9jdXMgPSBmYWxzZTsKLQotCS8vIFRoZSBjb250cm9sJ3MgZmluZC9yZXBsYWNlIHRleHQgYWN0aW9uCi0JcHJvdGVjdGVkIEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGlzIGNvbnRyb2wKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcwotCSAqLwotCXB1YmxpYyBSaWNoVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCkgewotCQlkZWJ1ZyA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQlsb2dnZXIgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JCWZpbmRSZXBsYWNlQWN0aW9uID0gbmV3IEZpbmRSZXBsYWNlQWN0aW9uKHRoaXMpOwotCQlydGVGb2xkZXIgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFBhdGgoKSArICJydGUvIjsgLy8kTk9OLU5MUy0xJAkJCi0JCXJ0ZVVSTCA9IFhNTFV0aWwuZXNjYXBlKCJmaWxlOi8vIiArIHJ0ZUZvbGRlcik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0QmFzZVBhdGgoYmFzZVBhdGgpOwotCi0JCXRyeSB7Ci0JCQllZGl0b3IgPSBuZXcgQnJvd3NlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJSaWNoVGV4dCIsICJiYXNlUGF0aD0iICsgYmFzZVBhdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWVkaXRvci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCWVkaXRvci5zZXREYXRhKFBST1BFUlRZX05BTUUsIHRoaXMpOwotCQkJaW5pdChwYXJlbnQsIHN0eWxlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWVkaXRvciA9IG51bGw7Ci0JCQlTdHJpbmcgbXNnID0gIkZhaWxlZCB0byBjcmVhdGUgUmljaFRleHQgd2l0aCBiYXNlUGF0aD0iICsgYmFzZVBhdGg7IC8vJE5PTi1OTFMtMSQKLQkJCWxvZ2dlci5sb2dFcnJvcihtc2csIGUpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBzdHlsZSBmb3IgdGhpcyBjb250cm9sCi0JICovCi0JcHVibGljIFJpY2hUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQl0aGlzKHBhcmVudCwgc3R5bGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhc2UgcGF0aCBmb3IgcmVzb2x2aW5nIGxpbmtzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEJhc2VQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGgoKSA+IDApIHsKLQkJCWlmIChwYXRoLnN0YXJ0c1dpdGgoRmlsZVV0aWwuVU5DX1BBVEhfUFJFRklYKSkgewotCQkJCWJhc2VQYXRoID0gRmlsZVV0aWwuVU5DX1BBVEhfUFJFRklYCi0JCQkJCQkrIEZpbGVVdGlsLmFwcGVuZFNlcGFyYXRvcihwYXRoLnN1YnN0cmluZygKLQkJCQkJCQkJRmlsZVV0aWwuVU5DX1BBVEhfUFJFRklYX0xFTkdUSCkucmVwbGFjZSgnXFwnLAotCQkJCQkJCQknLycpLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCWJhc2VQYXRoID0gRmlsZVV0aWwuYXBwZW5kU2VwYXJhdG9yKHBhdGgpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJhc2VQYXRoID0gRmlsZVV0aWwuYXBwZW5kU2VwYXJhdG9yKERFRkFVTFRfQkFTRV9QQVRIKS5yZXBsYWNlKAotCQkJCQknXFwnLCAnLycpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgc3R5bGUgZm9yIHRoaXMgY29udHJvbAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgaW5pdGlhbHppbmcgdGhpcyBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJYWRkU3RhdHVzVGV4dExpc3RlbmVyKCk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgiaW5pdCIsICJhZGRlZCBzdGF0dXMgdGV4dCBsaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJU3RyaW5nIGVkaXRvckhUTUwgPSBnZW5lcmF0ZUVkaXRvckhUTUwoKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJpbml0IiwgImdlbmVyYXRlZCBlZGl0b3IgSFRNTCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJZWRpdG9yLnNldFRleHQoZWRpdG9ySFRNTCk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgiaW5pdCIsICJsb2FkZWQgZWRpdG9yIEhUTUwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCWNvbnRleHRNZW51ID0gbmV3IE1lbnUocGFyZW50LmdldFNoZWxsKCksIFNXVC5QT1BfVVApOwotCQkJZWRpdG9yLnNldE1lbnUoY29udGV4dE1lbnUpOwotCQkJZmlsbENvbnRleHRNZW51KGNvbnRleHRNZW51KTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJpbml0IiwgImFkZGVkIGNvbnRleHQgbWVudSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJYWRkTGlzdGVuZXJzKCk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgiaW5pdCIsICJhZGRlZCBsaXN0ZW5lcnMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCWh0bWxGb3JtYXR0ZXIgPSBuZXcgSFRNTEZvcm1hdHRlcigpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImluaXQiLCAiaW5zdGFudGlhdGVkIEhUTUxGb3JtYXR0ZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllZGl0b3IgPSBudWxsOwotCQkJZGlzcG9zZSgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gZWRpdG9yOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxheW91dCBkYXRhLgotCSAqIAotCSAqIEBwYXJhbSBsYXlvdXREYXRhCi0JICogICAgICAgICAgICB0aGUgbGF5b3V0IGRhdGEgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0RGF0YShPYmplY3QgbGF5b3V0RGF0YSkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGF5b3V0IGRhdGEuCi0JICogCi0JICogQHJldHVybiB0aGlzIGNvbnRyb2wncyBsYXlvdXQgZGF0YQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGF5b3V0RGF0YSgpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZWRpdG9yLmdldExheW91dERhdGEoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGZvY3VzIHRvIHRoaXMgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlwcmludERlYnVnTWVzc2FnZSgic2V0Rm9jdXMsIGVkaXRhYmxlPSIgKyBlZGl0YWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWlmIChpbml0aWFsaXplZCkgewotCQkJCWlmICghUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyBXb3JrYXJvdW5kIGZvciBNb3ppbGxhIGFuZCBGaXJlZm94IHJpY2ggdGV4dCBlZGl0b3IgZm9jdXMKLQkJCQkJLy8gaXNzdWUuCi0JCQkJCWVkaXRvci5zZXRGb2N1cygpOwotCQkJCX0KLQkJCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0ZPQ1VTKTsKLQkJCQloYXNGb2N1cyA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWluaXRpYWxpemVkV2l0aEZvY3VzID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRlbGxzIHRoZSBjb250cm9sIGl0IGRvZXMgbm90IGhhdmUgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qmx1cigpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlwcmludERlYnVnTWVzc2FnZSgic2V0Qmx1ciwgZWRpdGFibGU9IiArIGVkaXRhYmxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJaWYgKGluaXRpYWxpemVkKSB7Ci0JCQkJaGFzRm9jdXMgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5pdGlhbGl6ZWRXaXRoRm9jdXMgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgY29udHJvbCBoYXMgZm9jdXMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnRyb2wgaGFzIHRoZSB1c2VyLWludGVyZmFjZSBmb2N1cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiBoYXNGb2N1czsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyB0ZXh0IGFuZCBpbWFnZSBsaW5rcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzIGluIHRoaXMgY29udHJvbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZVBhdGgoKSB7Ci0JCXJldHVybiBiYXNlUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIFVSTCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgd2hvc2UgY29udGVudCB3YXMgbGFzdAotCSAqIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhc2UgVVJMIG9mIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgVVJMIGdldENvcHlVUkwoKSB7Ci0JCXJldHVybiBjb3B5VVJMOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0IGNvcGllZAotCSAqIHRvIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weVVSTCgpIHsKLQkJdHJ5IHsKLQkJCWNvcHlVUkwgPSBuZXcgRmlsZShiYXNlUGF0aCkudG9VUkwoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWNvcHlVUkwgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdGFibGUgc3RhdGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudCBpcyBlZGlhdGJsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEVkaXRhYmxlKCkgewotCQlyZXR1cm4gZWRpdGFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZWRpdGFibGUgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIGVkaXRhYmxlCi0JICogICAgICAgICAgICB0aGUgZWRpdGFibGUgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXRoaXMuZWRpdGFibGUgPSBlZGl0YWJsZTsKLQkJaWYgKGluaXRpYWxpemVkKSB7Ci0JCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0VESVRBQkxFLCAiIiArIGVkaXRhYmxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNvbnRlbnQgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE1vZGlmaWVkKCkgewotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kaWZpZWQgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVkCi0JICogICAgICAgICAgICB0aGUgbW9kaWZpZWQgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RpZmllZChib29sZWFuIG1vZGlmaWVkKSB7Ci0JCXRoaXMubW9kaWZpZWQgPSBtb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByaWNoIHRleHQgY29udGVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByaWNoIHRleHQgY29udGVudCBmb3JtYXR0ZWQgaW4gYSBtYXJrdXAgbGFuZ3VhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBpbml0aWFsaXplZCkgewotCQkJdHJ5IHsKLQkJCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuR0VUX1RFWFQpOwotCQkJCWlmIChjdXJyZW50VGV4dCAhPSBudWxsICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQljdXJyZW50VGV4dCA9IGN1cnJlbnRUZXh0LnJlcGxhY2VBbGwoCi0JCQkJCQkJIjxQPiZuYnNwOzwvUD4iLCAiPGJyLz4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCi0JCQkJCWN1cnJlbnRUZXh0ID0gdGlkeVRleHQoY3VycmVudFRleHQpOwotCQkJCQljdXJyZW50VGV4dCA9IGZvcm1hdEhUTUwoY3VycmVudFRleHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN1cnJlbnRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCXByaW50RGVidWdNZXNzYWdlKCJnZXRUZXh0IiwgInRleHQ9IiwgY3VycmVudFRleHQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJcmV0dXJuIGN1cnJlbnRUZXh0OwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRIVE1MKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBmb3JtYXR0ZWRUZXh0OwotCQl0cnkgewotCQkJLy8gQ2FsbCBKVGlkeSB0byBmb3JtYXQgdGhlIHNvdXJjZSB0byBYSFRNTC4KLQkJCWZvcm1hdHRlZFRleHQgPSBodG1sRm9ybWF0dGVyLmZvcm1hdEhUTUwodGV4dCk7Ci0JCQlpZiAoaHRtbEZvcm1hdHRlci5nZXRMYXN0RXJyb3JTdHIoKSAhPSBudWxsKSB7Ci0JCQkJbG9nZ2VyLmxvZ0Vycm9yKGh0bWxGb3JtYXR0ZXIuZ2V0TGFzdEVycm9yU3RyKCkpOwotCQkJfQotCQkJcmV0dXJuIGZvcm1hdHRlZFRleHQ7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgZm9ybWF0dGVkIGluIGEgbWFya3VwIGxhbmd1YWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJzZXRUZXh0IiwgInRleHQ9IiwgdGV4dCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlTdHJpbmcgbmV3VGV4dCA9IHRleHQ7Ci0JCQlpZiAobmV3VGV4dCAhPSBudWxsICYmIG5ld1RleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJbmV3VGV4dCA9IHRpZHlUZXh0KG5ld1RleHQpOwotCQkJCS8vIENhbGwgSlRpZHkgdG8gZm9ybWF0IHRoZSBzb3VyY2UgdG8gWEhUTUwuCi0JCQkJbmV3VGV4dCA9IGZvcm1hdEhUTUwobmV3VGV4dCk7Ci0JCQl9IGVsc2UgewotCQkJCW5ld1RleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAoaW5pdGlhbGl6ZWQpIHsKLQkJCQltb2RpZmllZCA9ICFuZXdUZXh0LmVxdWFscyhjdXJyZW50VGV4dCk7Ci0JCQl9Ci0JCQlpbml0aWFsVGV4dCA9IG5ld1RleHQ7Ci0KLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJInNldFRleHQiLCAibW9kaWZpZWQ9IiArIG1vZGlmaWVkICsgIiwgbmV3VGV4dD0iLCBuZXdUZXh0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQotCQkJaWYgKGluaXRpYWxpemVkKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9URVhULCBuZXdUZXh0KTsKLQkJCQkJZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9FRElUQUJMRSwgIiIgKyBlZGl0YWJsZSk7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQotCQkJY3VycmVudFRleHQgPSBuZXdUZXh0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIHJpY2ggdGV4dCBjb250ZW50IGJhY2sgdG8gdGhlIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgcmVzdG9yZVRleHQoKSB7Ci0JCXNldFRleHQoaW5pdGlhbFRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlbGVjdGVkIHRleHQgb3IgPGNvZGU+IiI8L2NvZGU+IGlmIHRoZXJlIGlzIG5vCi0JICogICAgICAgICBoYXNTZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkVGV4dCgpIHsKLQkJLy8gZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkdFVF9TRUxFQ1RFRF9URVhUKTsKLQkJcmV0dXJuIHJpY2hUZXh0U2VsZWN0aW9uLmdldFRleHQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQjZ2V0U2VsZWN0ZWQoKQotCSAqLwotCXB1YmxpYyBSaWNoVGV4dFNlbGVjdGlvbiBnZXRTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIHJpY2hUZXh0U2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgcHJvcGVydHkgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGhhcyBub3QKLQkgKiAgICAgICAgIGJlZW4gc2V0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXREYXRhKFN0cmluZyBrZXkpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IuZ2V0RGF0YShrZXkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5zZXREYXRhKGtleSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIEphdmFTY3JpcHQuCi0JICogCi0JICogQHBhcmFtIHNjcmlwdAotCSAqICAgICAgICAgICAgdGhlIEphdmFTY3JpcHQgdG8gZXhlY3V0ZQotCSAqIEByZXR1cm4gYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgc2NyaXB0Ci0JICovCi0JcHJvdGVjdGVkIGludCBleGVjdXRlKFN0cmluZyBzY3JpcHQpIHsKLQkJc3RhdHVzID0gMDsKLQkJaWYgKGVkaXRvciAhPSBudWxsICYmIHNjcmlwdCAhPSBudWxsICYmIHNjcmlwdC5sZW5ndGgoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJZWRpdG9yLmV4ZWN1dGUoc2NyaXB0KTsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImV4ZWN1dGUiLCBzY3JpcHQpOyAvLyROT04tTkxTLTEkCQkJCQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIG1zZyA9ICJGYWlsZWQgdG8gZXhlY3V0ZSAiICsgc2NyaXB0OyAvLyROT04tTkxTLTEkCi0JCQkJbG9nZ2VyLmxvZ0Vycm9yKG1zZywgZSk7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCXByaW50RGVidWdNZXNzYWdlKCJleGVjdXRlIiwgbXNnKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZC4gVGhlIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlCi0JICogZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nLgotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQpIHsKLQkJc3RhdHVzID0gMDsKLQkJaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBjb21tYW5kLmVxdWFscyhSaWNoVGV4dENvbW1hbmQuQ0xFQVJfQ09OVEVOVCkpIHsKLQkJCVN0cmluZyBvbGRJbml0aWFsVGV4dCA9IGluaXRpYWxUZXh0OwotCQkJc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWluaXRpYWxUZXh0ID0gb2xkSW5pdGlhbFRleHQ7Ci0JCQlzdGF0dXMgPSAxOwotCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJbm90aWZ5TW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0dXMgPSBleGVjdXRlKGNvbW1hbmQgKyAiKCk7Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlci4gVGhlCi0JICogc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUgZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHBhcmFtCXBhcmFtCQlhIHBhcmFtZXRlciBmb3IgdGhlIGNvbW1hbmQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuCWEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kLCBTdHJpbmcgcGFyYW0pIHsKLQkJaWYgKHBhcmFtID09IG51bGwpIHsKLQkJCXJldHVybiBleGVjdXRlQ29tbWFuZChjb21tYW5kKTsKLQkJfQotCQlyZXR1cm4gZXhlY3V0ZShjb21tYW5kICsgIignIiArIGZvcm1hdFRleHQocGFyYW0pICsgIicpOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQgd2l0aCBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzLiBUaGUKLQkgKiBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZSBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcGFyYW0JcGFyYW1zCQlhbiBhcnJheSBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgY29tbWFuZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIFN0cmluZ1tdIHBhcmFtcykgewotCQlpZiAocGFyYW1zID09IG51bGwgfHwgcGFyYW1zLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgcGFyYW1zTGVuZ3RoID0gcGFyYW1zLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXNMZW5ndGg7IGkrKykgewotCQkJc2IuYXBwZW5kKCdcJycpLmFwcGVuZChmb3JtYXRUZXh0KHBhcmFtc1tpXSkpLmFwcGVuZCgnXCcnKTsKLQkJCWlmIChpIDwgcGFyYW1zTGVuZ3RoIC0gMSkgewotCQkJCXNiLmFwcGVuZCgnLCcpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBwYXJhbSA9IHNiLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBleGVjdXRlKGNvbW1hbmQgKyAiKCIgKyBwYXJhbSArICIpOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoZSBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChjb250ZXh0TWVudSAhPSBudWxsICYmICFjb250ZXh0TWVudS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWNvbnRleHRNZW51LmRpc3Bvc2UoKTsKLQkJCWNvbnRleHRNZW51ID0gbnVsbDsKLQkJfQotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWxpc3RlbmVycy5jbGVhcigpOwotCQkJbGlzdGVuZXJzID0gbnVsbDsKLQkJfQotCQlpZiAobW9kaWZ5TGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCW1vZGlmeUxpc3RlbmVycy5jbGVhcigpOwotCQkJbW9kaWZ5TGlzdGVuZXJzID0gbnVsbDsKLQkJfQotCQlpZiAoaHRtbEZvcm1hdHRlciAhPSBudWxsKSB7Ci0JCQlodG1sRm9ybWF0dGVyID0gbnVsbDsKLQkJfQotCQlpZiAodGhpcy5maW5kUmVwbGFjZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLmZpbmRSZXBsYWNlQWN0aW9uLmRpc3Bvc2UoKTsKLQkJCXRoaXMuZmluZFJlcGxhY2VBY3Rpb24gPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBjb250cm9sIGhhcyBiZWVuIGRpc3Bvc2VkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjb250cm9sIGlzIGRpc3Bvc2VkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiBlZGl0b3IuaXNEaXNwb3NlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGlmeSBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHJldHJpZXZpbmcgdGhlIG1vZGlmeSBsaXN0ZW5lcnMKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0TW9kaWZ5TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbW9kaWZ5TGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICoga2V5cyBhcmUgcHJlc3NlZCBhbmQgcmVsZWFzZWQgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRLZXlMaXN0ZW5lcihLZXlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5hZGRLZXlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIGtleXMgYXJlIHByZXNzZWQgYW5kIHJlbGVhc2VkIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUtleUxpc3RlbmVyKEtleUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLnJlbW92ZUtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIHRoZSBjb250ZW50IG9mIHRoaXMgY29udHJvbCBpcyBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgbGlzdGVuZXIgIT0gbnVsbAotCQkJCSYmICFtb2RpZnlMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQltb2RpZnlMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhlIGNvbnRlbnQgb2YgdGhpcyBjb250cm9sIGlzIG1vZGlmaWVkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgbGlzdGVuZXIgIT0gbnVsbAotCQkJCSYmIG1vZGlmeUxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCW1vZGlmeUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmZWQgd2hlbgotCSAqIHRoaXMgY29udHJvbCBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLmFkZERpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIHRoaXMgY29udHJvbCBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5yZW1vdmVEaXNwb3NlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICogaGVscCBldmVudHMgYXJlIGdlbmVyYXRlZCBmb3IgdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEhlbHBMaXN0ZW5lcihIZWxwTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IuYWRkSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gaGVscCBldmVudHMgYXJlIGdlbmVyYXRlZCBmb3IgdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLnJlbW92ZUhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZCB3aGVuCi0JICogYW4gZXZlbnQgb2YgdGhlIGdpdmVuIHR5cGUgb2NjdXJzIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIGZvcgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudCBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgIWxpc3RlbmVycy5jb250YWluc0tleShsaXN0ZW5lcikpIHsKLQkJCWlmIChldmVudFR5cGUgIT0gU1dULlNFTEVDVEVEKSB7Ci0JCQkJaWYgKGVkaXRvckNvbnRyb2wgPT0gbnVsbAotCQkJCQkJfHwgKGV2ZW50VHlwZSAhPSBTV1QuQWN0aXZhdGUKLQkJCQkJCQkJJiYgZXZlbnRUeXBlICE9IFNXVC5EZWFjdGl2YXRlCi0JCQkJCQkJCSYmIGV2ZW50VHlwZSAhPSBTV1QuRm9jdXNJbiAmJiBldmVudFR5cGUgIT0gU1dULkZvY3VzT3V0KSkgewotCQkJCQllZGl0b3IuYWRkTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7Ci0JCQkJfQotCQkJfQotCQkJbGlzdGVuZXJzLnB1dChsaXN0ZW5lciwgbmV3IFJpY2hUZXh0TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcikpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZAotCSAqIHdoZW4gYW4gZXZlbnQgb2YgdGhlIGdpdmVuIHR5cGUgb2NjdXJzIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIGZvcgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQgd2hlbiB0aGUgZXZlbnQKLQkgKiAgICAgICAgICAgIG9jY3VycwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKGludCBldmVudFR5cGUsIExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBsaXN0ZW5lcnMuY29udGFpbnNLZXkobGlzdGVuZXIpKSB7Ci0JCQlpZiAoZWRpdG9yQ29udHJvbCA9PSBudWxsCi0JCQkJCXx8IChldmVudFR5cGUgIT0gU1dULkFjdGl2YXRlCi0JCQkJCQkJJiYgZXZlbnRUeXBlICE9IFNXVC5EZWFjdGl2YXRlCi0JCQkJCQkJJiYgZXZlbnRUeXBlICE9IFNXVC5Gb2N1c0luICYmIGV2ZW50VHlwZSAhPSBTV1QuRm9jdXNPdXQpKSB7Ci0JCQkJZWRpdG9yLnJlbW92ZUxpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpOwotCQkJfQotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBldmVudCBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHJldHJpZXZpbmcgdGhlIGV2ZW50IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzCi0JICogICAgICAgICBjb250cm9sCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldExpc3RlbmVycygpIHsKLQkJcmV0dXJuIGxpc3RlbmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIG1vbml0b3IgZXZlbnRzIGFuZCBzdGF0dXMgc2VudCBieSB0aGUgdW5kZXJseWluZwotCSAqIERIVE1MIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0JCWVkaXRvci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoU3RhdHVzVGV4dEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3RyaW5nIGV2ZW50VGV4dCA9IGV2ZW50LnRleHQ7Ci0JCQkJaW50IGV2ZW50VGV4dExlbmd0aCA9IGV2ZW50VGV4dC5sZW5ndGgoKTsKLQkJCQlpZiAoZXZlbnRUZXh0LnN0YXJ0c1dpdGgoU1RBVFVTX1BSRUZJWCkKLQkJCQkJCSYmIGV2ZW50VGV4dExlbmd0aCA+IFNUQVRVU19QUkVGSVhfTEVOR1RIKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbnQgZW5kU3RhdHVzSW5kZXggPSBTVEFUVVNfUFJFRklYX0xFTkdUSCArIDE7Ci0JCQkJCQlpZiAoZXZlbnRUZXh0Lmxlbmd0aCgpID4gU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAxCi0JCQkJCQkJCSYmIENoYXJhY3Rlci5pc0RpZ2l0KGV2ZW50VGV4dAotCQkJCQkJCQkJCS5jaGFyQXQoZW5kU3RhdHVzSW5kZXgpKSkgewotCQkJCQkJCWVuZFN0YXR1c0luZGV4Kys7Ci0JCQkJCQl9Ci0JCQkJCQlpbnQgc3RhdHVzVHlwZSA9IEludGVnZXIucGFyc2VJbnQoZXZlbnRUZXh0LnN1YnN0cmluZygKLQkJCQkJCQkJU1RBVFVTX1BSRUZJWF9MRU5HVEgsIGVuZFN0YXR1c0luZGV4KSk7Ci0JCQkJCQlzd2l0Y2ggKHN0YXR1c1R5cGUpIHsKLQkJCQkJCWNhc2UgU1RBVFVTX05PUDoKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0lOSVRJQUxJWkVEOgotCQkJCQkJCWlmICghaW5pdGlhbGl6ZWQpIHsKLQkJCQkJCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgIlNUQVRVU19JTklUSUFMSVpFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoIVBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCS8vIFdvcmthcm91bmQgTW96aWxsYSdhIElGUkFNRSBoZWlnaHQgaXNzdWUuCi0JCQkJCQkJCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0hFSUdIVCwKLQkJCQkJCQkJCQkJIiIgKyBlZGl0b3IuZ2V0Qm91bmRzKCkuaGVpZ2h0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfVEVYVCwKLQkJCQkJCQkJCQljdXJyZW50VGV4dCk7Ci0JCQkJCQkJCWlmIChpbml0aWFsaXplZFdpdGhGb2N1cykgewotCQkJCQkJCQkJc2V0Rm9jdXMoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoIWVkaXRhYmxlKSB7Ci0JCQkJCQkJCQlleGVjdXRlQ29tbWFuZCgKLQkJCQkJCQkJCQkJUmljaFRleHRDb21tYW5kLlNFVF9FRElUQUJMRSwKLQkJCQkJCQkJCQkJIiIgKyBlZGl0YWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX01PRElGSUVEOgotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgIlNUQVRVU19NT0RJRklFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJY2hlY2tNb2RpZnkoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0dFVF9URVhUOgotCQkJCQkJCWlmIChldmVudFRleHRMZW5ndGggPj0gU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyKSB7Ci0JCQkJCQkJCWN1cnJlbnRUZXh0ID0gZXZlbnRUZXh0Ci0JCQkJCQkJCQkJLnN1YnN0cmluZyhTVEFUVVNfUFJFRklYX0xFTkdUSCArIDIpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWN1cnJlbnRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJCQkJCSJzdGF0dXNUZXh0TGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJIlNUQVRVU19HRVRfVEVYVCwgY3VycmVudFRleHQ9IiwgY3VycmVudFRleHQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfS0VZX0RPV046Ci0JCQkJCQkJaWYgKGV2ZW50VGV4dExlbmd0aCA+PSBTVEFUVVNfUFJFRklYX0xFTkdUSCArIDIpIHsKLQkJCQkJCQkJU3RyaW5nIGNtZCA9IGV2ZW50VGV4dAotCQkJCQkJCQkJCS5zdWJzdHJpbmcoU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyKTsKLQkJCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgic3RhdHVzVGV4dExpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkiU1RBVFVTX0tFWV9ET1dOLCBjbWQ9IiArIGNtZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoY21kLmVxdWFscyhSaWNoVGV4dENvbW1hbmQuQ09QWSkpIHsKLQkJCQkJCQkJCXNldENvcHlVUkwoKTsKLQkJCQkJCQkJfSBlbHNlIGlmIChjbWQuZXF1YWxzKFJpY2hUZXh0Q29tbWFuZC5DVVQpKSB7Ci0JCQkJCQkJCQlzZXRDb3B5VVJMKCk7Ci0JCQkJCQkJCQlDdXRBY3Rpb24gYWN0aW9uID0gbmV3IEN1dEFjdGlvbigKLQkJCQkJCQkJCQkJUmljaFRleHQudGhpcyk7Ci0JCQkJCQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dC50aGlzKTsKLQkJCQkJCQkJfSBlbHNlIGlmIChjbWQKLQkJCQkJCQkJCQkuZXF1YWxzKFJpY2hUZXh0Q29tbWFuZC5GSU5EX1RFWFQpKSB7Ci0JCQkJCQkJCQlnZXRGaW5kUmVwbGFjZUFjdGlvbigpLmV4ZWN1dGUoCi0JCQkJCQkJCQkJCVJpY2hUZXh0LnRoaXMpOwotCQkJCQkJCQl9IGVsc2UgaWYgKGNtZC5lcXVhbHMoUmljaFRleHRDb21tYW5kLlBBU1RFKSkgewotCQkJCQkJCQkJUGFzdGVBY3Rpb24gYWN0aW9uID0gbmV3IFBhc3RlQWN0aW9uKAotCQkJCQkJCQkJCQlSaWNoVGV4dC50aGlzKTsKLQkJCQkJCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0LnRoaXMpOwotCQkJCQkJCQl9IGVsc2UgaWYgKGNtZC5lcXVhbHMoUmljaFRleHRDb21tYW5kLlNBVkUpKSB7Ci0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpCi0JCQkJCQkJCQkJCS5kb1NhdmUobnVsbCk7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoY21kLmVxdWFscyhSaWNoVGV4dENvbW1hbmQuU0FWRV9BTEwpKSB7Ci0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLnNhdmVBbGxFZGl0b3JzKAotCQkJCQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0tFWV9VUDoKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoInN0YXR1c1RleHRMaXN0ZW5lciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiU1RBVFVTX0tFWV9VUCwgbW9kaWZpZWQ9IiArIG1vZGlmaWVkKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQljaGVja01vZGlmeSgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfU0VMRUNUX1RFWFQ6Ci0JCQkJCQkJaWYgKGV2ZW50VGV4dExlbmd0aCA+PSBTVEFUVVNfUFJFRklYX0xFTkdUSCArIDIpIHsKLQkJCQkJCQkJU3RyaW5nW10gc3RyaW5ncyA9IGV2ZW50VGV4dC5zdWJzdHJpbmcoCi0JCQkJCQkJCQkJU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyKS5zcGxpdCgKLQkJCQkJCQkJCQkiXFwkIiwgNSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCS8vIHJpY2hUZXh0U2VsZWN0aW9uLnNldE9mZnNldFN0YXJ0KEludGVnZXIucGFyc2VJbnQoc3RyaW5nc1swXSkpOwotCi0JCQkJCQkJCQlyaWNoVGV4dFNlbGVjdGlvbi5zZXRGb250TmFtZShzdHJpbmdzWzBdKTsKLQkJCQkJCQkJCXJpY2hUZXh0U2VsZWN0aW9uLnNldEZvbnRTaXplKHN0cmluZ3NbMV0pOwotCQkJCQkJCQkJcmljaFRleHRTZWxlY3Rpb24uc2V0QmxvY2tTdHlsZShzdHJpbmdzWzJdKTsKLQkJCQkJCQkJCXJpY2hUZXh0U2VsZWN0aW9uLnNldEZsYWdzKEludGVnZXIKLQkJCQkJCQkJCQkJLnBhcnNlSW50KHN0cmluZ3NbM10pKTsKLQkJCQkJCQkJCXJpY2hUZXh0U2VsZWN0aW9uLnNldFRleHQoc3RyaW5nc1s0XSk7Ci0JCQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkJInNlbGVjdGlvblN0YXR1c0xpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkiY3VycmVudCBzZWxlY3Rpb24gaXM9IiArIHJpY2hUZXh0U2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJaGFzU2VsZWN0aW9uID0gdHJ1ZTsKLQkJCQkJCQkJaWYgKGhhc0ZvY3VzKCkpCi0JCQkJCQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULlNFTEVDVEVELCBuZXcgRXZlbnQoKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmljaFRleHRTZWxlY3Rpb24uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJaGFzU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSJTVEFUVVNfU0VMRUNUX1RFWFQsIHNlbGVjdGVkVGV4dD0iLCByaWNoVGV4dFNlbGVjdGlvbi5nZXRUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfU0VMRUNUX0NPTlRST0w6Ci0JCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKCJzdGF0dXNUZXh0TGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJIlNUQVRVU19TRUxFQ1RfQ09OVFJPTCwgY29udHJvbCBzZWxlY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWhhc1NlbGVjdGlvbiA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFNUQVRVU19TRUxFQ1RfTk9ORToKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoInN0YXR1c1RleHRMaXN0ZW5lciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiU1RBVFVTX1NFTEVDVF9OT05FLCBubyBzZWxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQloYXNTZWxlY3Rpb24gPSBmYWxzZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0VYRUNfQ01EOgotCQkJCQkJCWlmIChldmVudFRleHRMZW5ndGggPj0gU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAzKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlzdGF0dXMgPSBJbnRlZ2VyLnBhcnNlSW50KGV2ZW50VGV4dAotCQkJCQkJCQkJCQkuc3Vic3RyaW5nKAotCQkJCQkJCQkJCQkJCVNUQVRVU19QUkVGSVhfTEVOR1RIICsgMiwKLQkJCQkJCQkJCQkJCQlTVEFUVVNfUFJFRklYX0xFTkdUSCArIDMpKTsKLQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCXN0YXR1cyA9IC0xOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChkZWJ1ZyAmJiBzdGF0dXMgIT0gMSkgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgic3RhdHVzVGV4dExpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSJTVEFUVVNfRVhFQ19DTUQsIHN0YXR1cz0iICsgc3RhdHVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX1JFRk9STUFUX0xJTktTOgotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgIlNUQVRVU19SRUZPUk1BVF9MSU5LUyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJY2hlY2tNb2RpZnkoKTsKLQkJCQkJCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJLy8gV29ya2Fyb3VuZCB0aGUgZHJhZyBhbmQgZHJvcCBpc3N1ZSB3aXRoIERCQ1MgY2hhcmFjdGVycy4KLQkJCQkJCQkJaWYgKG1vZGlmaWVkKSB7Ci0JCQkJCQkJCQlzZXRUZXh0KGdldFRleHQoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgSFRNTCBzb3VyY2UgZm9yIHRoZSBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgSFRNTCBzb3VyY2UgZm9yIHRoZSBlZGl0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRlRWRpdG9ySFRNTCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgZXNjYXBlZEJhc2VQYXRoID0gYmFzZVBhdGg7Ci0JCWlmIChlc2NhcGVkQmFzZVBhdGguc3RhcnRzV2l0aChGaWxlVXRpbC5VTkNfUEFUSF9QUkVGSVgpKQotCQkJZXNjYXBlZEJhc2VQYXRoID0gZXNjYXBlZEJhc2VQYXRoLnJlcGxhY2VGaXJzdCgKLQkJCQkJIl5cXFxcXFxcXCIsICJcXFxcXFxcXFxcXFxcXFxcIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQllc2NhcGVkQmFzZVBhdGggPSBYTUxVdGlsCi0JCQkJLmVzY2FwZSgiZmlsZTovLyIgKyBlc2NhcGVkQmFzZVBhdGgucmVwbGFjZUFsbCgiJyIsICJcXFxcJyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJU3RyaW5nIGVzY2FwZWRSdGVVVEwgPSBydGVVUkwucmVwbGFjZUFsbCgiJmFwb3M7IiwgIiUyNyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlTdHJpbmdCdWZmZXIgcnRlWE1MID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlydGVYTUwuYXBwZW5kKCI8cnRlIGlkPVwiIikuYXBwZW5kKCJydGUiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkuYXBwZW5kKCJcIiBjc3M9XCIiKS5hcHBlbmQoZXNjYXBlZFJ0ZVVUTCArICJydGUuY3NzIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLmFwcGVuZCgiXCIganM9XCIiKS5hcHBlbmQoZXNjYXBlZFJ0ZVVUTCArICJydGUuanMiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkuYXBwZW5kKCJcIiBiYXNlVVJMPVwiIikuYXBwZW5kKGVzY2FwZWRCYXNlUGF0aCkgLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQoIlwiLz4iKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdXcml0ZXIgcmVzdWx0ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlYU0xUUHJvY2Vzc29yLnRyYW5zZm9ybSgKLQkJCQlydGVGb2xkZXIgKyAicnRlLnhzbCIsIHJ0ZVhNTC50b1N0cmluZygpLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgY29udGV4dCBtZW51IHdpdGggbWVudSBpdGVtcy4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dE1lbnUKLQkgKiAgICAgICAgICAgIGEgY29udGV4dCBtZW51IGNvbnRhaW5pbmcgcmljaCB0ZXh0IGFjdGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoTWVudSBjb250ZXh0TWVudSkgewotCQlmaW5hbCBNZW51SXRlbSBjdXRJdGVtID0gbmV3IE1lbnVJdGVtKGNvbnRleHRNZW51LCBTV1QuUFVTSCk7Ci0JCWN1dEl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5jdXRBY3Rpb25fdGV4dCk7Ci0JCWN1dEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUN1dEFjdGlvbiBhY3Rpb24gPSBuZXcgQ3V0QWN0aW9uKFJpY2hUZXh0LnRoaXMpOwotCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0LnRoaXMpOwotCQkJfQotCQl9KTsKLQkJZmluYWwgTWVudUl0ZW0gY29weUl0ZW0gPSBuZXcgTWVudUl0ZW0oY29udGV4dE1lbnUsIFNXVC5QVVNIKTsKLQkJY29weUl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5jb3B5QWN0aW9uX3RleHQpOwotCQljb3B5SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29weUFjdGlvbiBhY3Rpb24gPSBuZXcgQ29weUFjdGlvbihSaWNoVGV4dC50aGlzKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dC50aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIE1lbnVJdGVtIHBhc3RlSXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQlwYXN0ZUl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5wYXN0ZUFjdGlvbl90ZXh0KTsKLQkJcGFzdGVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlQYXN0ZUFjdGlvbiBhY3Rpb24gPSBuZXcgUGFzdGVBY3Rpb24oUmljaFRleHQudGhpcyk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHQudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIE1lbnVJdGVtIHBhc3RlUGxhaW5UZXh0SXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQlwYXN0ZVBsYWluVGV4dEl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5wYXN0ZVBsYWluVGV4dEFjdGlvbl90ZXh0KTsKLQkJcGFzdGVQbGFpblRleHRJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlQYXN0ZVBsYWluVGV4dEFjdGlvbiBhY3Rpb24gPSBuZXcgUGFzdGVQbGFpblRleHRBY3Rpb24oCi0JCQkJCQlSaWNoVGV4dC50aGlzKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dC50aGlzKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51SGlkZGVuKE1lbnVFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJCWdldFNlbGVjdGVkVGV4dCgpOwotCQkJCWN1dEl0ZW0uc2V0RW5hYmxlZChlZGl0YWJsZSAmJiBoYXNTZWxlY3Rpb24pOwotCQkJCWNvcHlJdGVtLnNldEVuYWJsZWQoaGFzU2VsZWN0aW9uKTsKLQkJCQlwYXN0ZUl0ZW0uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJcGFzdGVQbGFpblRleHRJdGVtLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGxpc3RlbmVycyB0byBtYW5hZ2UgdGhlIGFjdGl2YXRpb24gYW5kIGZvY3VzIGV2ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWVkaXRvckNvbnRyb2wgPSBnZXRDb250cm9sU2l0ZShlZGl0b3IpOwotCQlpZiAoZWRpdG9yQ29udHJvbCAhPSBudWxsKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCSJpbml0IiwgImVkaXRvckNvbnRyb2w9IiArIGVkaXRvckNvbnRyb2wuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJZWRpdG9yQ29udHJvbC5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCXByaW50RGVidWdNZXNzYWdlKCJhY3RpdmF0ZUxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzZXRGb2N1cygpOwotCQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULkFjdGl2YXRlLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWVkaXRvckNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCXByaW50RGVidWdNZXNzYWdlKCJkZWFjdGl2YXRlTGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXNldEJsdXIoKTsKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5EZWFjdGl2YXRlLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWVkaXRvckNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULkZvY3VzSW4sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCXByaW50RGVidWdNZXNzYWdlKCJmb2N1c0luTGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWV4ZWN1dGVDb21tYW5kKCJ1cGRhdGVTZWxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAkJCQkJCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuRm9jdXNJbiwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCi0JCQllZGl0b3JDb250cm9sLmFkZExpc3RlbmVyKFNXVC5LZXlVcCwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWludCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKLQkJCQkJaW50IHN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJImtleVVwTGlzdGVuZXIiLCAia2V5Q29kZT0iICsga2V5Q29kZSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkrICIsIHN0YXRlTWFzaz0iICsgc3RhdGVNYXNrICsgIiwgZWRpdGFibGU9IiArIGVkaXRhYmxlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJaWYgKChzdGF0ZU1hc2sgJiBTV1QuQ1RSTCkgPiAwCi0JCQkJCQkJfHwgKHN0YXRlTWFzayAmIFNXVC5BTFQpID4gMAotCQkJCQkJCXx8ICgoc3RhdGVNYXNrICYgU1dULlNISUZUKSA+IDAgJiYga2V5Q29kZSA9PSBzdGF0ZU1hc2spKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKGVkaXRhYmxlKSB7Ci0JCQkJCQlzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHsKLQkJCQkJCWNhc2UgU1dULkFSUk9XX0RPV046Ci0JCQkJCQljYXNlIFNXVC5BUlJPV19MRUZUOgotCQkJCQkJY2FzZSBTV1QuQVJST1dfUklHSFQ6Ci0JCQkJCQljYXNlIFNXVC5BUlJPV19VUDoKLQkJCQkJCWNhc2UgU1dULkVORDoKLQkJCQkJCWNhc2UgU1dULkhPTUU6Ci0JCQkJCQljYXNlIFNXVC5QQUdFX0RPV046Ci0JCQkJCQljYXNlIFNXVC5QQUdFX1VQOgotCQkJCQkJY2FzZSBTV1QuVEFCOgotCQkJCQkJCXJldHVybjsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJY2hlY2tNb2RpZnkoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQllZGl0b3IuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJLy8gRGVhY3RpdmF0ZSB0aGUgbGlua3MgaW4gdGhlIGNvbnRlbnQgcGFnZSBpbiByZWFkb25seQotCQkJCQkvLyBtb2RlLgotCQkJCQlldmVudC5kb2l0ID0gZWRpdGFibGU7Ci0JCQkJfQotCQkJfSk7Ci0JCX0gZWxzZSB7Ci0JCQllZGl0b3IuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlwcmludERlYnVnTWVzc2FnZSgiYWN0aXZhdGVMaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJc2V0Rm9jdXMoKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJZWRpdG9yLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuVEFCKSB7Ci0JCQkJCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULlNISUZUKSAhPSAwKSB7Ci0JCQkJCQkJZWRpdG9yLnRyYXZlcnNlKFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllZGl0b3IudHJhdmVyc2UoU1dULlRSQVZFUlNFX1RBQl9ORVhUKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoIWVkaXRhYmxlKSB7Ci0JCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5DVFJMKSA+IDAKLQkJCQkJCQl8fCAoZS5zdGF0ZU1hc2sgJiBTV1QuQUxUKSA+IDApCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWlmIChlZGl0YWJsZSkgewotCQkJCQkJc3dpdGNoIChlLmtleUNvZGUpIHsKLQkJCQkJCWNhc2UgU1dULkFSUk9XX0RPV046Ci0JCQkJCQljYXNlIFNXVC5BUlJPV19MRUZUOgotCQkJCQkJY2FzZSBTV1QuQVJST1dfUklHSFQ6Ci0JCQkJCQljYXNlIFNXVC5BUlJPV19VUDoKLQkJCQkJCWNhc2UgU1dULkVORDoKLQkJCQkJCWNhc2UgU1dULkhPTUU6Ci0JCQkJCQljYXNlIFNXVC5QQUdFX0RPV046Ci0JCQkJCQljYXNlIFNXVC5QQUdFX1VQOgotCQkJCQkJY2FzZSBTV1QuU0hJRlQ6Ci0JCQkJCQljYXNlIFNXVC5UQUI6Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCWNoZWNrTW9kaWZ5KCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCWVkaXRvci5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCXByaW50RGVidWdNZXNzYWdlKCJkaXNwb3NlTGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQotCQkJCX0KLQkJCQlkaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWxpc3RlbmVycyA9IG5ldyBIYXNodGFibGU8TGlzdGVuZXIsIFJpY2hUZXh0TGlzdGVuZXI+KCk7Ci0JCW1vZGlmeUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8TW9kaWZ5TGlzdGVuZXI+KCk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIHJpY2ggdGV4dCBldmVudCBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIGV2ZW50IHR5cGUKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIHRoZSBTV1QgZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoaW50IGV2ZW50VHlwZSwgRXZlbnQgZXZlbnQpIHsKLQkJaWYgKG5vdGlmeWluZ01vZGlmeUxpc3RlbmVycykgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZXZlbnQuZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlldmVudC53aWRnZXQgPSBlZGl0b3I7Ci0KLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdGVuZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCWlmIChsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSA9PSBldmVudFR5cGUpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkJIm5vdGlmeUxpc3RlbmVycyIsICJub3RpZnlpbmcgbGlzdGVuZXIsICIgKyBsaXN0ZW5lciArICIsIGV2ZW50VHlwZT0iICsgZXZlbnRUeXBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCS8vJE5PTi1OTFMtMyQJCi0JCQkJfQotCQkJCWxpc3RlbmVyLmdldExpc3RlbmVyKCkuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkibm90aWZ5TGlzdGVuZXJzIiwgIm5vdGlmaWVkIGxpc3RlbmVyLCAiICsgbGlzdGVuZXIgKyAiLCBldmVudFR5cGU9IiArIGV2ZW50VHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkvLyROT04tTkxTLTMkCQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBtb2RpZnkgbGlzdGVuZXJzIHRoYXQgdGhlIHJpY2ggdGV4dCBlZGl0b3IgY29udGVudCBoYXMKLQkgKiBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeU1vZGlmeUxpc3RlbmVycygpIHsKLQkJbm90aWZ5aW5nTW9kaWZ5TGlzdGVuZXJzID0gdHJ1ZTsKLQotCQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCQlldmVudC5kaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWV2ZW50LndpZGdldCA9IGVkaXRvcjsKLQotCQlmb3IgKEl0ZXJhdG9yIGkgPSBtb2RpZnlMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IChNb2RpZnlMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCSJub3RpZnlNb2RpZnlMaXN0ZW5lcnMiLCAibm90aWZ5aW5nIGxpc3RlbmVyLCAiICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCi0JCQl9Ci0JCQlsaXN0ZW5lci5tb2RpZnlUZXh0KG5ldyBNb2RpZnlFdmVudChldmVudCkpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkibm90aWZ5TW9kaWZ5TGlzdGVuZXJzIiwgIm5vdGlmaWVkIGxpc3RlbmVyLCAiICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCi0JCQl9Ci0JCX0KLQotCQlub3RpZnlpbmdNb2RpZnlMaXN0ZW5lcnMgPSBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQjY2hlY2tNb2RpZnkoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrTW9kaWZ5KCkgewotCQlpZiAobW9kaWZpZWQpIHsKLQkJCW5vdGlmeU1vZGlmeUxpc3RlbmVycygpOwotCQl9IGVsc2UgewotCQkJaWYgKCFnZXRUZXh0KCkuZXF1YWxzKGluaXRpYWxUZXh0KSkgewotCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQlub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCX0KLQkJfQotCQlpZiAoZGVidWcpIHsKLQkJCXByaW50RGVidWdNZXNzYWdlKCJjaGVja01vZGlmeSIsICJtb2RpZmllZD0iICsgbW9kaWZpZWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IGZvciBhIHN1YiBjbGFzcyB0byB0aWR5IHVwIHRoZSByaWNoIHRleHQuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHJpY2ggdGV4dCBlbmNvZGVkIGluIEhUTUwgZm9ybWF0Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0aWR5VGV4dChTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIHRoZSB0ZXh0IGZvciBjb25zdW1wdGlvbiBieSB0aGUgSmF2YVNjcmlwdC9ESFRNTCBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHJpY2ggdGV4dCBlbmNvZGVkIGluIEhUTUwgZm9ybWF0Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgdGV4dFNpemUgPSB0ZXh0Lmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHRTaXplOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJ1xyJzoKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1x0JzoKLQkJCQlyZXN1bHQuYXBwZW5kKCcgJyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcbic6Ci0JCQkJcmVzdWx0LmFwcGVuZChFTkNPREVEX05FV0xJTkUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXCcnOgotCQkJCXJlc3VsdC5hcHBlbmQoRU5DT0RFRF9TSU5HTEVfUVVPVEUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXFwnOgotCQkJCXJlc3VsdC5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgPGNvZGU+T2xlQ29udHJvbFNpdGU8L2NvZGU+IGNvbnRhaW5lZCB3aXRoaW4gdGhlCi0JICogZ2l2ZW4gPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb2JqZWN0LCBwcmVzdW1hYmx5IGEKLQkgKiAgICAgICAgICAgIDxjb2RlPkJyb3dzZXI8L2NvZGU+Ci0JICogQHJldHVybiBhbiA8Y29kZT5PbGVDb250cm9sU2l0ZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgZ2V0Q29udHJvbFNpdGUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJQ29udHJvbFtdIGNvbnRyb2xzID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGNvbnRyb2xDbGFzcyA9IGNvbnRyb2xzW2ldLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCWlmIChjb250cm9sQ2xhc3MuZXF1YWxzKCJvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5XZWJTaXRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gY29udHJvbHNbaV07Ci0JCQkJfSBlbHNlIGlmIChjb250cm9sc1tpXSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJCQlyZXR1cm4gZ2V0Q29udHJvbFNpdGUoKENvbXBvc2l0ZSkgY29udHJvbHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlYnVnTWVzc2FnZShTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbXNnLCBTdHJpbmcgdGV4dCkgewotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzdHJCdWYuYXBwZW5kKCJSaWNoVGV4dFsiKS5hcHBlbmQoZWRpdG9yLmhhbmRsZSkuYXBwZW5kKCddJykgLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQoJy4nKS5hcHBlbmQobWV0aG9kKTsKLQkJaWYgKG1zZyAhPSBudWxsICYmIG1zZy5sZW5ndGgoKSA+IDApIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoIjogIikuYXBwZW5kKG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKCdcbicpLmFwcGVuZCh0ZXh0KTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyQnVmKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlYnVnTWVzc2FnZShTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbXNnKSB7Ci0JCXByaW50RGVidWdNZXNzYWdlKG1ldGhvZCwgbXNnLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlYnVnTWVzc2FnZShTdHJpbmcgbWV0aG9kKSB7Ci0JCXByaW50RGVidWdNZXNzYWdlKG1ldGhvZCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEZpbmRSZXBsYWNlQWN0aW9uIGdldEZpbmRSZXBsYWNlQWN0aW9uKCkgewotCQlyZXR1cm4gZmluZFJlcGxhY2VBY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmluZFJlcGxhY2VBY3Rpb24oRmluZFJlcGxhY2VBY3Rpb24gZmluZFJlcGxhY2VBY3Rpb24pIHsKLQkJaWYgKGZpbmRSZXBsYWNlQWN0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLmZpbmRSZXBsYWNlQWN0aW9uICE9IG51bGwKLQkJCQkJJiYgdGhpcy5maW5kUmVwbGFjZUFjdGlvbiAhPSBmaW5kUmVwbGFjZUFjdGlvbikgewotCQkJCXRoaXMuZmluZFJlcGxhY2VBY3Rpb24uZGlzcG9zZSgpOwotCQkJfQotCQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbiA9IGZpbmRSZXBsYWNlQWN0aW9uOwotCQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbi5zZXRSaWNoVGV4dCh0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldFRleHQodGV4dCk7Ci0JCWluaXRpYWxUZXh0ID0gdGV4dCA9PSBudWxsID8gIiIgOiB0ZXh0OwotCQltb2RpZmllZCA9IGZhbHNlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NjlmN2ZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi0vKioKLSAqIERlZmluZXMgdGhlIGVkaXRpbmcgY29tbWFuZHMgc3VwcG9ydGVkIGJ5IHRoZSBkZWZhdWx0IHJpY2ggdGV4dCBjb250cm9sIGFuZAotICogZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBBZGRzIGEgSFRNTCBmcmFnbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfSFRNTCA9ICJhZGRIVE1MIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIEFkZHMgYW4gaW1hZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0lNQUdFID0gImFkZEltYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQWRkcyBhIGhvcml6b250YWwgbGluZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfTElORSA9ICJhZGRMaW5lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQWRkcyBhIGxpbmsuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0xJTksgPSAiYWRkTGluayI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluc2VydHMgdGV4dCBvdmVyIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNFUlRfVEVYVCA9ICJpbnNlcnRUZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQWRkcyBhbiBvcmRlcmVkIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX09SREVSRURfTElTVCA9ICJhZGRPcmRlcmVkTGlzdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZHMgYSB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfVEFCTEUgPSAiYWRkVGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGRzIGFuIHVub3JkZXJlZCBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9VTk9SREVSRURfTElTVCA9ICJhZGRVbm9yZGVyZWRMaXN0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLR1JPVU5EX0NPTE9SID0gImJhY2tDb2xvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlICdib2xkJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9MRCA9ICJib2xkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSByaWNoIHRleHQgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUl9DT05URU5UID0gImNsZWFyQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcGllcyB0aGUgc2VsZWN0ZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUFkgPSAiY29weSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEN1dHMgdGhlIHNlbGVjdGVkIHRleHQgdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVQgPSAiY3V0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEUgPSAiZGVsZXRlVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZpbmRzIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklORF9URVhUID0gImZpbmRUZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogR2V0cyB0aGUgSFRNTCBzb3VyY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX1RFWFQgPSAiZ2V0VGV4dCI7IC8vJE5PTi1OTFMtMSQJCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkdST1VORF9DT0xPUiA9ICJmb3JlQ29sb3IiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBGb3JtYXRzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9CTE9DSyA9ICJmb3JtYXRCbG9jayI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX1NFTEVDVEVEX1RFWFQgPSAiZ2V0U2VsZWN0ZWRUZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kZW50cyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlQgPSAiaW5kZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgJ2l0YWxpYycgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElUQUxJQyA9ICJpdGFsaWMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDZW50ZXIganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpVU1RJRllfQ0VOVEVSID0gImp1c3RpZnlDZW50ZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBGdWxseSBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlVTVElGWV9GVUxMID0gImp1c3RpZnlGdWxsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTGVmdCBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlVTVElGWV9MRUZUID0gImp1c3RpZnlMZWZ0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmlnaHQganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpVU1RJRllfUklHSFQgPSAianVzdGlmeVJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogT3V0ZGVudHMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUREVOVCA9ICJvdXRkZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUGFzdGVzIHRleHQgZnJvbSB0aGUgY2xpcGJvYXJkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1RFID0gInBhc3RlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmVwbGFjZXMgYWxsIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTEFDRV9BTExfVEVYVCA9ICJyZXBsYWNlQWxsVGV4dCI7IC8vJE5PTi1OTFMtMSQJCQotCi0JLyoqCi0JICogUmVwbGFjZXMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTEFDRV9URVhUID0gInJlcGxhY2VUZXh0IjsgLy8kTk9OLU5MUy0xJAkJCi0KLQkvKioKLQkgKiBSZWRvZXMgdGhlIHByZXZpb3VzIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVETyA9ICJyZWRvIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgY3VycmVudCBmb3JtYXR0aW5nIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9GT1JNQVQgPSAicmVtb3ZlRm9ybWF0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGVkaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkUgPSAic2F2ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNhdmVzIGFsbCBlZGl0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9BTEwgPSAic2F2ZUFsbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNlbGVjdHMgYWxsIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX0FMTCA9ICJzZWxlY3RBbGwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBmb250IG5hbWUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9GT05UX05BTUUgPSAic2V0Rm9udE5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBmb250IHNpemUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9GT05UX1NJWkUgPSAic2V0Rm9udFNpemUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBmb250IHN0eWxlIGZvciB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfRk9OVF9TVFlMRSA9ICJzZXRGb250U3R5bGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgdGhlIGNvbnRlbnQgY2FuIGJlIGVkaXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfRURJVEFCTEUgPSAic2V0RWRpdGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXRzIGZvY3VzIHRvIHRoaXMgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfRk9DVVMgPSAic2V0Rm9jdXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBoZWlnaHQgb2YgdGhpcyBjb250cm9sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9IRUlHSFQgPSAic2V0SGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2V0cyB0aGUgSFRNTCBzb3VyY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX1RFWFQgPSAic2V0VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlICdzdHJpa2UtdGhyb3VnaCcgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklLRV9USFJPVUdIID0gInN0cmlrZVRocm91Z2giOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSBzdWJzY3JpcHQgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQlNDUklQVCA9ICJzdWJzY3JpcHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSBzdXBlcnNjcmlwdCBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRVJTQ1JJUFQgPSAic3VwZXJzY3JpcHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSB1bmRlcmxpbmUgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOREVSTElORSA9ICJ1bmRlcmxpbmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBVbmRvZXMgdGhlIHByZXZpb3VzIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ETyA9ICJ1bmRvIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29udmVydHMgYSBsaW5rIHRvIG5vcm1hbCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOTElOSyA9ICJ1bmxpbmsiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRFZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDdlZmVhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZpbmRSZXBsYWNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlBhc3RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlBhc3RlUGxhaW5UZXh0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleVNlcXVlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U3Ryb2tlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuU1dUS2V5U3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFZpZXdlclVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmVyaWZ5S2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5IVE1MVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUtleUJpbmRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLklDb250ZXh0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5JSGFuZGxlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkua2V5cy5JQmluZGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkub3BlcmF0aW9ucy5PcGVyYXRpb25IaXN0b3J5QWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5vcGVyYXRpb25zLlJlZG9BY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm9wZXJhdGlvbnMuVW5kb0FjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JQWJzdHJhY3RUZXh0RWRpdG9ySGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JUmVhZE9ubHlEZXBlbmRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkczsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yIGltcGxlbWVudGF0aW9uLgotICogPHA+Ci0gKiBUaGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yIHVzZXMgWEhUTUwgYXMgdGhlIHVuZGVybHlpbmcgbWFya3VwIGxhbmd1YWdlIGZvcgotICogdGhlIHJpY2ggdGV4dCBjb250ZW50LiBJdCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIDxjb2RlPlZpZXdGb3JtPC9jb2RlPgotICogY29udHJvbCB3aXRoIGEgdG9vbCBiYXIgYXQgdGhlIHRvcCwgYSB0YWIgZm9sZGVyIHRoYXQgY29udGFpbnMgYQotICogPGNvZGU+UmljaFRleHQ8L2NvZGU+IGNvbnRyb2wgZm9yIGVudGVyaW5nIHRoZSByaWNoIHRleHQgY29udGVudCwgYW5kIGEgdGFiCi0gKiBmb2xlciB0aGF0IGNvbnRhaW5zIGEgPGNvZGU+U3R5bGVUZXh0PC9jb2RlPiBjb250cm9sIGZvciB2aWV3aW5nIGFuZAotICogbW9kaWZ5aW5nIHRoZSBYSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dEVkaXRvciBpbXBsZW1lbnRzIElSaWNoVGV4dEVkaXRvciB7Ci0KLQkvLyBUaGUgSFRNTCB0YWIgbmFtZS4KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1RBQl9OQU1FID0gUmljaFRleHRSZXNvdXJjZXMuaHRtbFRhYl90ZXh0OwotCi0JLy8gSWYgdHJ1ZSwgbG9nIGRlYnVnZ2luZyBpbmZvLgotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnOwotCi0JLy8gVGhlIHBsdWctaW4gbG9nZ2VyLgotCXByb3RlY3RlZCBMb2dnZXIgbG9nZ2VyOwotCi0JLy8gVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MgKDxocmVmPiwgPGltZz4sIGV0Yy4pLgotCXByb3RlY3RlZCBTdHJpbmcgYmFzZVBhdGg7Ci0KLQkvLyBUaGUgZWRpdG9yIGZvcm0uCi0JcHJvdGVjdGVkIFZpZXdGb3JtIGZvcm07Ci0KLQkvLyBUaGUgZWRpdG9yIHRvb2wgYmFyLgotCXByb3RlY3RlZCBJUmljaFRleHRUb29sQmFyIHRvb2xCYXI7Ci0KLQkvLyBUaGUgZWRpdG9yIGNvbnRlbnQuCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250ZW50OwotCi0JLy8gVGhlIGVkaXRvciB0YWIgZm9sZGVyLgotCXByb3RlY3RlZCBDVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQotCS8vIFRoZSByaWNoIHRleHQgdGFiCi0JcHJvdGVjdGVkIENUYWJJdGVtIHJpY2hUZXh0VGFiOwotCi0JLy8gVGhlIEhUTUwgc291cmNlIHRhYgotCXByb3RlY3RlZCBDVGFiSXRlbSBodG1sVGFiOwotCi0JLy8gVGhlIGVtYmVkZGVkIHJpY2ggdGV4dCBjb250cm9sLgotCXByb3RlY3RlZCBJUmljaFRleHQgcmljaFRleHQ7Ci0KLQkvLyBUaGUgdW5kZXJseWluZyBIVE1MIHRleHQgZWRpdG9yLgotCXByb3RlY3RlZCBUZXh0Vmlld2VyIHNvdXJjZVZpZXdlcjsKLQkKLQlwcm90ZWN0ZWQgSURvY3VtZW50IGN1cnJlbnREb2M7Ci0JCi0JLy8gRHJvcCBzdXBwb3J0Ci0JcHJvdGVjdGVkIERyb3BUYXJnZXQgc291cmNlRWRpdERyb3BUYXJnZXQ7Ci0KLQkvLyBIVE1MIGVkaXRvcidzIGNvbnRleHQgbWVudQotCXByb3RlY3RlZCBNZW51IGNvbnRleHRNZW51OwotCi0JLy8gSGFzIHRoZSBIVE1MIHNvdXJjZSBiZWVuIG1vZGlmaWVkPwotCXByb3RlY3RlZCBib29sZWFuIHNvdXJjZU1vZGlmaWVkID0gZmFsc2U7Ci0KLQkvLyBUaGUgZWRpdG9yJ3MgZWRpdGFibGUgZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZGl0YWJsZSA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBPcGVyYXRpb25IaXN0b3J5QWN0aW9uSGFuZGxlciB1bmRvQWN0aW9uOwotCQotCXByaXZhdGUgT3BlcmF0aW9uSGlzdG9yeUFjdGlvbkhhbmRsZXIgcmVkb0FjdGlvbjsKLQkKLQlwcml2YXRlIElFZGl0b3JTaXRlIGVkaXRvclNpdGU7Ci0KLQkvKiogVGhlIGFjdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBlZGl0b3IuICovCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBJQWN0aW9uPiBmQWN0aW9ucz0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJQWN0aW9uPigxMCk7Ci0JCi0JLyoqIFRoZSB2ZXJpZnkga2V5IGxpc3RlbmVyIGZvciBhY3RpdmF0aW9uIGNvZGUgdHJpZ2dlcmluZy4gKi8KLQlwcml2YXRlIEFjdGl2YXRpb25Db2RlVHJpZ2dlciBmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyPSBuZXcgQWN0aXZhdGlvbkNvZGVUcmlnZ2VyKCk7Ci0JCi0JLyoqIFRoZSBlZGl0b3IncyBhY3Rpb24gYWN0aXZhdGlvbiBjb2Rlcy4gKi8KLQlwcml2YXRlIExpc3QgZkFjdGl2YXRpb25Db2Rlcz0gbmV3IEFycmF5TGlzdCgyKTsKLQkKLQlmaW5hbCBJVW5kb01hbmFnZXIgdW5kb01hbmFnZXI9IG5ldyBUZXh0Vmlld2VyVW5kb01hbmFnZXIoMTApOwotCQotCS8qKgotCSAqIFRoZSBrZXkgYmluZGluZyBzY29wZXMgb2YgdGhpcyBlZGl0b3IuCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gZktleUJpbmRpbmdTY29wZXM7Ci0KLQkKLQlwcm90ZWN0ZWQgSURvY3VtZW50TGlzdGVuZXIgc291cmNlRWRpdERvY3VtZW50TGlzdGVuZXI9IG5ldyBJRG9jdW1lbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJc291cmNlTW9kaWZpZWQgPSB0cnVlOwotCQkJaWYgKHJpY2hUZXh0ICE9IG51bGwgJiYgcmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dCkgewotCQkJCXJpY2hUZXh0Lm5vdGlmeU1vZGlmeUxpc3RlbmVycygpOwotCQkJfQotCQl9Ci0JfTsKLQotCi0JLy8gVGhlIGRlYWN0aXZhdGUgbGlzdGVuZXIgZm9yIHRoZSBzb3VyY2VFZGl0IGNvbnRyb2wuCi0JcHJvdGVjdGVkIExpc3RlbmVyIHNvdXJjZUVkaXREZWFjdGl2YXRlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoc291cmNlTW9kaWZpZWQpIHsKLQkJCQl1cGRhdGVSaWNoVGV4dChzb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldFRleHQoKSk7Ci0JCQkJc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQkJc291cmNlTW9kaWZpZWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvLyBUaGUga2V5IGxpc3RlbmVyIGZvciB0aGUgc291cmNlRWRpdCBjb250cm9sLgotCXByb3RlY3RlZCBLZXlMaXN0ZW5lciBzb3VyY2VFZGl0S2V5TGlzdGVuZXIgPSBuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFkYXB0ZXIoCi0JCQkJCUlCaW5kaW5nU2VydmljZS5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJQmluZGluZ1NlcnZpY2UpIHsKLQkJCQlpbnQgYWNjZWwgPSBTV1RLZXlTdXBwb3J0Ci0JCQkJCQkuY29udmVydEV2ZW50VG9Vbm1vZGlmaWVkQWNjZWxlcmF0b3IoZSk7Ci0JCQkJS2V5U3Ryb2tlIHN0cm9rZSA9IFNXVEtleVN1cHBvcnQKLQkJCQkJCS5jb252ZXJ0QWNjZWxlcmF0b3JUb0tleVN0cm9rZShhY2NlbCk7Ci0JCQkJS2V5U2VxdWVuY2Ugc2VxID0gS2V5U2VxdWVuY2UuZ2V0SW5zdGFuY2Uoc3Ryb2tlKTsKLQkJCQlCaW5kaW5nIGJpbmQgPSAoKElCaW5kaW5nU2VydmljZSkgYWRhcHRlcikuZ2V0UGVyZmVjdE1hdGNoKHNlcSk7Ci0JCQkJaWYgKGJpbmQgIT0gbnVsbCkgewotCQkJCQlQYXJhbWV0ZXJpemVkQ29tbWFuZCBjb21tYW5kID0gYmluZAotCQkJCQkJCS5nZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpOwotCQkJCQlpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgY21kSWQgPSBjb21tYW5kLmdldElkKCk7Ci0JCQkJCQlpZiAoY21kSWQgIT0gbnVsbAotCQkJCQkJCQkmJiBjbWRJZAotCQkJCQkJCQkJCS5lcXVhbHMoIm9yZy5lY2xpcHNlLnVpLmVkaXQuZmluZFJlcGxhY2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmljaFRleHQuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKS5leGVjdXRlKFJpY2hUZXh0RWRpdG9yLnRoaXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0b3Igc3R5bGUKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlKSB7Ci0JCXRoaXMocGFyZW50LCBzdHlsZSwgZWRpdG9yU2l0ZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIGVkaXRvciBzdHlsZQotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlLCBTdHJpbmcgYmFzZVBhdGgpIHsKLQkJdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoOwotCQl0aGlzLmVkaXRvclNpdGUgPSBlZGl0b3JTaXRlOwotCQlkZWJ1ZyA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQlsb2dnZXIgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JCWluaXQocGFyZW50LCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0b3Igc3R5bGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQl0cnkgewotCQkJZm9ybSA9IG5ldyBWaWV3Rm9ybShwYXJlbnQsIHN0eWxlKTsKLQkJCWZvcm0ubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWZvcm0ubWFyZ2luV2lkdGggPSAwOwotCi0JCQl0b29sQmFyID0gbmV3IFJpY2hUZXh0VG9vbEJhcihmb3JtLCBTV1QuRkxBVCwgdGhpcyk7Ci0KLQkJCWNvbnRlbnQgPSBuZXcgQ29tcG9zaXRlKGZvcm0sIFNXVC5GTEFUKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWNvbnRlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCXRhYkZvbGRlciA9IGNyZWF0ZUVkaXRvclRhYkZvbGRlcihjb250ZW50LCBzdHlsZSk7Ci0KLQkJCWZvcm0uc2V0VG9wTGVmdCgoQ29udHJvbCkgdG9vbEJhcik7Ci0JCQlmb3JtLnNldENvbnRlbnQoY29udGVudCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmb3JtIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgZm9ybSBjb250cm9sCi0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGZvcm07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgZW1iZWRkZWQgd2l0aGluIHRoaXMgZWRpdG9yLgotCSAqLwotCXB1YmxpYyBJUmljaFRleHQgZ2V0UmljaFRleHRDb250cm9sKCkgewotCQlyZXR1cm4gcmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IGRhdGEuCi0JICogCi0JICogQHBhcmFtIGxheW91dERhdGEKLQkgKiAgICAgICAgICAgIHRoZSBsYXlvdXQgZGF0YSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXREYXRhKE9iamVjdCBsYXlvdXREYXRhKSB7Ci0JCWlmIChmb3JtICE9IG51bGwpIHsKLQkJCWZvcm0uc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXRvcidzIGxheW91dCBkYXRhCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXlvdXREYXRhKCkgewotCQlpZiAoZm9ybSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZm9ybS5nZXRMYXlvdXREYXRhKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBmb2N1cyB0byB0aGlzIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldEZvY3VzKCk7Ci0JCX0KLQkJc2V0U2VsZWN0aW9uKDApOwotCX0KLQotCS8qKgotCSAqIFRlbGxzIHRoZSBjb250cm9sIGl0IGRvZXMgbm90IGhhdmUgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qmx1cigpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldEJsdXIoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGVkaXRvciBoYXMgZm9jdXMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGVkaXRvciBoYXMgdGhlIHVzZXItaW50ZXJmYWNlIGZvY3VzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmljaFRleHQuaGFzRm9jdXMoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyB0aGUgUmljaCBUZXh0IG9yIEhUTUwgdGFiLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgPGNvZGU+MDwvY29kZT4gZm9yIHRoZSBSaWNoIFRleHQgdGFiLCA8Y29kZT4xPC9jb2RlPiBmb3IKLQkgKiAgICAgICAgICAgIHRoZSBIVE1MIHRhYi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oaW50IGluZGV4KSB7Ci0JCWlmICh0YWJGb2xkZXIgIT0gbnVsbCkgewotCQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbihpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIHRleHQgYW5kIGltYWdlIGxpbmtzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3Mgc3BlY2lmaWVkIHdpdGggPGhyZWY+LAotCSAqICAgICAgICAgPGltZz4sIGV0Yy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VQYXRoKCkgewotCQlyZXR1cm4gYmFzZVBhdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBVUkwgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sIHdob3NlIGNvbnRlbnQgd2FzIGxhc3QKLQkgKiBjb3BpZWQgdG8gdGhlIGNsaXBib2FyZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYXNlIFVSTCBvZiBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIFVSTCBnZXRDb3B5VVJMKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmdldENvcHlVUkwoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYXNlIFVSTCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgd2hvc2UgY29udGVudCB3YXMgbGFzdCBjb3BpZWQKLQkgKiB0byB0aGUgY2xpcGJvYXJkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcHlVUkwoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRDb3B5VVJMKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IGNhbiBiZSBlZGl0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGVkaXRhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVkaXRhYmxlIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZQotCSAqICAgICAgICAgICAgdGhlIGVkaXRhYmxlIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSkgewotCQl0aGlzLmVkaXRhYmxlID0gZWRpdGFibGU7Ci0JCWlmICh0b29sQmFyICE9IG51bGwgJiYgdGFiRm9sZGVyICE9IG51bGwpIHsKLQkJCWlmICh0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkgPT0gcmljaFRleHRUYWIpIHsKLQkJCQl0b29sQmFyLnVwZGF0ZVRvb2xCYXIoZWRpdGFibGUpOwotCQkJfQotCQl9Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQlzb3VyY2VWaWV3ZXIuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNvbnRlbnQgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE1vZGlmaWVkKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmdldE1vZGlmaWVkKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGlmaWVkIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBtb2RpZmllZAotCSAqICAgICAgICAgICAgdGhlIG1vZGlmaWVkIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kaWZpZWQoYm9vbGVhbiBtb2RpZmllZCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0TW9kaWZpZWQobW9kaWZpZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgZm9ybWF0dGVkIGluIFhIVE1MCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlpZiAoc291cmNlTW9kaWZpZWQpIHsKLQkJCXNldFRleHQoZ2V0U291cmNlRWRpdCgpLmdldFRleHQoKSk7Ci0JCQlzZXRNb2RpZmllZCh0cnVlKTsKLQkJCXNvdXJjZU1vZGlmaWVkID0gZmFsc2U7Ci0JCX0KLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5nZXRUZXh0KCk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSByaWNoIHRleHQgY29udGVudCBpbiBYSFRNTCBmb3JtYXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KHRleHQpOwotCQl9Ci0JCXNvdXJjZU1vZGlmaWVkID0gZmFsc2U7Ci0JCWlmICh0YWJGb2xkZXIgIT0gbnVsbCkgewotCQkJaWYgKHRvb2xCYXIgIT0gbnVsbCkgewotCQkJCXRvb2xCYXIudXBkYXRlVG9vbEJhcihlZGl0YWJsZSk7Ci0JCQl9Ci0JCQlpZiAoZ2V0U291cmNlRWRpdCgpICE9IG51bGwpIHsKLQkJCQlyZW1vdmVNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCQljdXJyZW50RG9jLnNldCh0ZXh0KTsKLQkJCQlhZGRNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcnMoKSB7Ci0JCWlmIChjdXJyZW50RG9jICE9IG51bGwpIHsKLQkJCWN1cnJlbnREb2MuYWRkRG9jdW1lbnRMaXN0ZW5lcihzb3VyY2VFZGl0RG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcnMoKSB7Ci0JCWlmIChjdXJyZW50RG9jICE9IG51bGwpIHsKLQkJCWN1cnJlbnREb2MucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihzb3VyY2VFZGl0RG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQjY2hlY2tNb2RpZnkoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrTW9kaWZ5KCkgewotCQlyaWNoVGV4dC5jaGVja01vZGlmeSgpOwotCQlpZiAoc291cmNlTW9kaWZpZWQpIHsKLQkJCW5vdGlmeU1vZGlmeUxpc3RlbmVycygpOwotCQl9Ci0JCWlmIChkZWJ1ZykgewotCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImNoZWNrTW9kaWZ5IiwgIm1vZGlmaWVkPSIgKyBzb3VyY2VNb2RpZmllZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSByaWNoIHRleHQgY29udGVudCBiYWNrIHRvIHRoZSBpbml0aWFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RvcmVUZXh0KCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQucmVzdG9yZVRleHQoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dCNnZXRTZWxlY3RlZCgpCi0JICovCi0JcHVibGljIFJpY2hUZXh0U2VsZWN0aW9uIGdldFNlbGVjdGVkKCkgewotCQlpZiAodGFiRm9sZGVyLmdldFNlbGVjdGlvbigpID09IGh0bWxUYWIpIHsKLQkJCVN0cmluZyBIVE1Mc291cmNlID0gZ2V0U291cmNlRWRpdCgpLmdldFRleHQoKTsKLQkJCVBvaW50IHNlbCA9IHNvdXJjZVZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCQlpbnQgc2VsU3RhcnRJbmRleCA9IHNlbC54OwotCQkJaW50IHNlbEVuZEluZGV4ID0gc2VsLnggKyBzZWwueSAtIDE7Ci0JCQlyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmNsZWFyKCk7Ci0JCQlyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLnNldFRleHQoSFRNTHNvdXJjZS5zdWJzdHJpbmcoc2VsU3RhcnRJbmRleCwgc2VsRW5kSW5kZXggKyAxKSk7Ci0JCX0KLQkJcmV0dXJuIHJpY2hUZXh0LmdldFNlbGVjdGVkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaGFzIG5vdAotCSAqICAgICAgICAgYmVlbiBzZXQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERhdGEoU3RyaW5nIGtleSkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZ2V0RGF0YShrZXkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0RGF0YShrZXksIHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZC4gVGhlIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlCi0JICogZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlci4gVGhlCi0JICogc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUgZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHBhcmFtCXBhcmFtCQlhIHBhcmFtZXRlciBmb3IgdGhlIGNvbW1hbmQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuCWEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kLCBTdHJpbmcgcGFyYW0pIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5leGVjdXRlQ29tbWFuZChjb21tYW5kLCBwYXJhbSk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kIHdpdGggYW4gYXJyYXkgb2YgcGFyYW1ldGVycy4gVGhlCi0JICogc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUgZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHBhcmFtCXBhcmFtcwkJYW4gYXJyYXkgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGNvbW1hbmQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuCWEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kLCBTdHJpbmdbXSBwYXJhbXMpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5leGVjdXRlQ29tbWFuZChjb21tYW5kLCBwYXJhbXMpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBlZGl0b3IuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGNvbnRleHRNZW51ICE9IG51bGwgJiYgIWNvbnRleHRNZW51LmlzRGlzcG9zZWQoKSkgewotCQkJY29udGV4dE1lbnUuZGlzcG9zZSgpOwotCQkJY29udGV4dE1lbnUgPSBudWxsOwotCQl9Ci0JCWlmIChzb3VyY2VFZGl0RHJvcFRhcmdldCAhPSBudWxsKSB7Ci0JCQlzb3VyY2VFZGl0RHJvcFRhcmdldC5kaXNwb3NlKCk7Ci0JCQlzb3VyY2VFZGl0RHJvcFRhcmdldCA9IG51bGw7Ci0JCX0KLQkJaWYgKGZBY3RpdmF0aW9uQ29kZVRyaWdnZXIgIT0gbnVsbCkgewotCQkJZkFjdGl2YXRpb25Db2RlVHJpZ2dlci51bmluc3RhbGwoKTsKLQkJCWZBY3RpdmF0aW9uQ29kZVRyaWdnZXI9IG51bGw7Ci0JCX0KLQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCWlmIChnZXRTb3VyY2VFZGl0KCkgIT0gbnVsbCkgewotCQkJZ2V0U291cmNlRWRpdCgpLnJlbW92ZUxpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQlzb3VyY2VFZGl0RGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQkJCWdldFNvdXJjZUVkaXQoKS5yZW1vdmVLZXlMaXN0ZW5lcihzb3VyY2VFZGl0S2V5TGlzdGVuZXIpOwotCQkJc291cmNlRWRpdERlYWN0aXZhdGVMaXN0ZW5lciA9IG51bGw7Ci0JCQlzb3VyY2VFZGl0S2V5TGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JCQotCQlpZiAoc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCXNvdXJjZVZpZXdlcj0gbnVsbDsKLQkJfQotCi0JCWlmIChmQWN0aW9ucyAhPSBudWxsKSB7Ci0JCQlmQWN0aW9ucy5jbGVhcigpOwotCQkJZkFjdGlvbnM9IG51bGw7Ci0JCX0KLQkJaWYgKGZBY3RpdmF0aW9uQ29kZXMgIT0gbnVsbCkgewotCQkJZkFjdGl2YXRpb25Db2Rlcy5jbGVhcigpOwotCQkJZkFjdGl2YXRpb25Db2Rlcz0gbnVsbDsKLQkJfQotCi0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5kaXNwb3NlKCk7Ci0JCQlyaWNoVGV4dCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGNvbnRyb2wgaGFzIGJlZW4gZGlzcG9zZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnRyb2wgaXMgZGlzcG9zZWQgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5pc0Rpc3Bvc2VkKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kaWZ5IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIGZvciByZXRyaWV2aW5nIHRoZSBtb2RpZnkgbGlzdGVuZXJzCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldE1vZGlmeUxpc3RlbmVycygpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmdldE1vZGlmeUxpc3RlbmVycygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIGtleXMgYXJlIHByZXNzZWQgYW5kIHJlbGVhc2VkIHdpdGhpbiB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRLZXlMaXN0ZW5lcihLZXlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuYWRkS2V5TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiBrZXlzIGFyZSBwcmVzc2VkIGFuZCByZWxlYXNlZCB3aXRoaW4gdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUtleUxpc3RlbmVyKEtleUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5yZW1vdmVLZXlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiB0aGUgY29udGVudCBvZiB0aGlzIGVkaXRvciBpcyBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiB0aGUgY29udGVudCBvZiB0aGlzIGVkaXRvciBpcyBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkIHdoZW4KLQkgKiB0aGlzIGVkaXRvciBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5hZGREaXNwb3NlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiB0aGlzIGVkaXRvciBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIGhlbHAgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgZm9yIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEhlbHBMaXN0ZW5lcihIZWxwTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmFkZEhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIGhlbHAgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgZm9yIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5yZW1vdmVIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmZWQgd2hlbgotCSAqIGFuIGV2ZW50IG9mIHRoZSBnaXZlbiB0eXBlIG9jY3VycyB3aXRoaW4gdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIGZvcgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudCBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuYWRkTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkCi0JICogd2hlbiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGV2ZW50IHRvIGxpc3RlbiBmb3IKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGV2ZW50Ci0JICogICAgICAgICAgICBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQucmVtb3ZlTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBldmVudCBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiBhbiBpdGVyYXRvciBmb3IgcmV0cmlldmluZyB0aGUgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMKLQkgKiAgICAgICAgIGVkaXRvcgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIG1vZGlmeSBsaXN0ZW5lcnMgdGhhdCB0aGUgcmljaCB0ZXh0IGVkaXRvciBjb250ZW50IGhhcwotCSAqIGNoYW5nZWQuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5TW9kaWZ5TGlzdGVuZXJzKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJCWV2ZW50LmRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJCWV2ZW50LndpZGdldCA9IHJpY2hUZXh0LmdldENvbnRyb2woKTsKLQotCQkJZm9yIChJdGVyYXRvciBpID0gZ2V0TW9kaWZ5TGlzdGVuZXJzKCk7IGkgIT0gbnVsbCAmJiBpLmhhc05leHQoKTspIHsKLQkJCQlNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IChNb2RpZnlMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJbGlzdGVuZXIubW9kaWZ5VGV4dChuZXcgTW9kaWZ5RXZlbnQoZXZlbnQpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSB0b29sIGJhciB3aXRoIGFjdGlvbiBpdGVtcy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbEJhcgotCSAqICAgICAgICAgICAgYSB0b29sIGJhciBjb250YWluIHJpY2ggdGV4dCBhY3Rpb25zCi0JICovCi0JcHVibGljIHZvaWQgZmlsbFRvb2xCYXIoSVJpY2hUZXh0VG9vbEJhciB0b29sQmFyKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdW5kZXJseWluZyByaWNoIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzCi0JICovCi0JcHJvdGVjdGVkIElSaWNoVGV4dCBjcmVhdGVSaWNoVGV4dENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLAotCQkJU3RyaW5nIGJhc2VQYXRoKSB7Ci0JCXJldHVybiBuZXcgUmljaFRleHQocGFyZW50LCBzdHlsZSwgYmFzZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXRvciB0YWIgZm9sZGVyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSBuZXcgZWRpdG9yIHRvb2xiYXIKLQkgKi8KLQlwcm90ZWN0ZWQgQ1RhYkZvbGRlciBjcmVhdGVFZGl0b3JUYWJGb2xkZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCUNUYWJGb2xkZXIgZm9sZGVyID0gbmV3IENUYWJGb2xkZXIocGFyZW50LCBTV1QuRkxBVCB8IFNXVC5CT1RUT00pOwotCQlmb2xkZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpKTsKLQkJZm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUNvbXBvc2l0ZSByaWNoVGV4dENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZm9sZGVyLCBTV1QuRkxBVCk7Ci0JCUdyaWRMYXlvdXQgcmljaFRleHRDb21wb3NpdGVMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCXJpY2hUZXh0Q29tcG9zaXRlTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXJpY2hUZXh0Q29tcG9zaXRlTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcmljaFRleHRDb21wb3NpdGUuc2V0TGF5b3V0KHJpY2hUZXh0Q29tcG9zaXRlTGF5b3V0KTsKLQkJcmljaFRleHRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJcmljaFRleHQgPSBjcmVhdGVSaWNoVGV4dENvbnRyb2wocmljaFRleHRDb21wb3NpdGUsIHN0eWxlLCBiYXNlUGF0aCk7Ci0JCXJpY2hUZXh0LnNldERhdGEoUFJPUEVSVFlfTkFNRSwgdGhpcyk7Ci0JCXJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCkuc2V0UmljaFRleHQodGhpcyk7Ci0KLQkJcmljaFRleHRUYWIgPSBuZXcgQ1RhYkl0ZW0oZm9sZGVyLCBTV1QuRkxBVCk7Ci0JCXJpY2hUZXh0VGFiLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMucmljaFRleHRUYWJfdGV4dCk7Ci0JCXJpY2hUZXh0VGFiLnNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnJpY2hUZXh0VGFiX3Rvb2xUaXBUZXh0KTsKLQkJcmljaFRleHRUYWIuc2V0Q29udHJvbChyaWNoVGV4dENvbXBvc2l0ZSk7Ci0KLQkJQ29tcG9zaXRlIGh0bWxDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGZvbGRlciwgU1dULkZMQVQpOwotCQlodG1sQ29tcG9zaXRlLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotCQlzb3VyY2VWaWV3ZXIgPSBuZXcgVGV4dFZpZXdlcihodG1sQ29tcG9zaXRlLCBTV1QuRkxBVCB8IFNXVC5NVUxUSQotCQkJCXwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwpOwotCQlzb3VyY2VWaWV3ZXIuc2V0VW5kb01hbmFnZXIodW5kb01hbmFnZXIpOwotCQlzZXREb2N1bWVudChudWxsKTsKLQkJYWRkTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCWdldFNvdXJjZUVkaXQoKS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgc291cmNlRWRpdERlYWN0aXZhdGVMaXN0ZW5lcik7Ci0JCWdldFNvdXJjZUVkaXQoKS5hZGRLZXlMaXN0ZW5lcihzb3VyY2VFZGl0S2V5TGlzdGVuZXIpOwotCQljb250ZXh0TWVudSA9IG5ldyBNZW51KHBhcmVudC5nZXRTaGVsbCgpLCBTV1QuUE9QX1VQKTsKLQkJZ2V0U291cmNlRWRpdCgpLnNldE1lbnUoY29udGV4dE1lbnUpOwotCQkvLyBGSVhNRSEgVGhpcyBvcGVucyB1cCBhIGNhbiBvZiB3b3JtcywgZXNwZWNpYWxseSB3aXRoIERCQ1MgY2hhcmFjdGVycy4KLQkJLy8gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzk0MzIuIAotCQkvL2FkZERyb3BTdXBwb3J0VG9TdHlsZWRUZXh0KCk7Ci0JCWZpbGxDb250ZXh0TWVudShjb250ZXh0TWVudSk7Ci0JCQotCQkKLQkJaHRtbFRhYiA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQkJaHRtbFRhYi5zZXRUZXh0KEhUTUxfVEFCX05BTUUpOwotCQlodG1sVGFiLnNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmh0bWxUYWJfdG9vbFRpcFRleHQpOyAKLQkJaHRtbFRhYi5zZXRDb250cm9sKGh0bWxDb21wb3NpdGUpOwotCi0JCWZvbGRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ1RhYkl0ZW0gaXRlbSA9IChDVGFiSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQlpZiAoaXRlbS5nZXRUZXh0KCkuZXF1YWxzKEhUTUxfVEFCX05BTUUpKSB7Ci0JCQkJCXJlbW92ZU1vZGlmeUxpc3RlbmVycygpOwotCQkJCQljdXJyZW50RG9jLnNldChnZXRUZXh0KCkpOwotCQkJCQlzb3VyY2VNb2RpZmllZCA9IGZhbHNlOwotCQkJCQlhZGRNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHRvb2xCYXIgIT0gbnVsbCkgewotCQkJCQkJdG9vbEJhci51cGRhdGVUb29sQmFyKGVkaXRhYmxlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXVwZGF0ZVJpY2hUZXh0KGdldFNvdXJjZUVkaXQoKS5nZXRUZXh0KCkpOwotCQkJCQlzZXRNb2RpZmllZCh0cnVlKTsKLQkJCQkJaWYgKHRvb2xCYXIgIT0gbnVsbCkgewotCQkJCQkJdG9vbEJhci51cGRhdGVUb29sQmFyKGVkaXRhYmxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWZpbGxUb29sQmFyKHRvb2xCYXIpOwotCQkKLQkJaW5pdGlhbGl6ZUFjdGl2YXRpb25Db2RlVHJpZ2dlcigpOwotCQljcmVhdGVBY3Rpb25zKCk7Ci0JCQotCQlmb2xkZXIuc2V0U2VsZWN0aW9uKDApOwotCi0JCXJldHVybiBmb2xkZXI7Ci0JfQotCi0JCi0JcHJpdmF0ZSB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQlkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLQkJfQotCQkvLyBjbGVhbiB1cCBvbGQgZG9jCi0JCXVuZG9NYW5hZ2VyLmRpc2Nvbm5lY3QoKTsKLQkJSURvY3VtZW50IG9sZERvYyA9IHNvdXJjZVZpZXdlci5nZXREb2N1bWVudCgpOwotCQlpZiAob2xkRG9jICE9IG51bGwpIHsKLQkJCW9sZERvYy5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHNvdXJjZUVkaXREb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIGhvb2sgdXAgbmV3IGRvYwotCQljdXJyZW50RG9jID0gZG9jOwotCQlzb3VyY2VWaWV3ZXIuc2V0RG9jdW1lbnQoY3VycmVudERvYyk7Ci0JCWN1cnJlbnREb2MuYWRkRG9jdW1lbnRMaXN0ZW5lcihzb3VyY2VFZGl0RG9jdW1lbnRMaXN0ZW5lcik7Ci0JCXVuZG9NYW5hZ2VyLmNvbm5lY3Qoc291cmNlVmlld2VyKTsKLQkJaWYgKHVuZG9BY3Rpb24gIT0gbnVsbCkgewotCQkJdW5kb0FjdGlvbi5zZXRDb250ZXh0KGdldFVuZG9Db250ZXh0KCkpOwotCQl9Ci0JCWlmIChyZWRvQWN0aW9uICE9IG51bGwpIHsKLQkJCXJlZG9BY3Rpb24uc2V0Q29udGV4dChnZXRVbmRvQ29udGV4dCgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBIVE1MIHNvdXJjZSBlZGl0IGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlN0eWxlVGV4dDwvY29kZT4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBTdHlsZWRUZXh0IGdldFNvdXJjZUVkaXQoKSB7Ci0JCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHNvdXJjZVZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0cyB0ZXh0IGF0IHRoZSBzZWxlY3Rpb24gKG92ZXJ3cml0aW5nIHRoZSBzZWxlY3Rpb24pLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEhUTUwoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIAotCQkJcmV0dXJuOwotCQlpZiAodGFiRm9sZGVyLmdldFNlbGVjdGlvbigpID09IHJpY2hUZXh0VGFiKSB7Ci0JCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0hUTUwsIHRleHQpOwotCQl9IGVsc2UgaWYgKHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSA9PSBodG1sVGFiKSB7Ci0JCQlTdHJpbmcgb2xkSFRNTCA9IGdldFNvdXJjZUVkaXQoKS5nZXRUZXh0KCk7Ci0JCQlQb2ludCBzZWwgPSBzb3VyY2VWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpOwotCQkJaW50IHNlbFN0YXJ0SW5kZXggPSBzZWwueDsKLQkJCWludCBzZWxFbmRJbmRleCA9IHNlbC54ICsgc2VsLnkgLSAxOwotCQkJU3RyaW5nIG5ld0hUTUwgPSBvbGRIVE1MLnN1YnN0cmluZygwLCBzZWxTdGFydEluZGV4KSArIHRleHQKLQkJCQkJKyBvbGRIVE1MLnN1YnN0cmluZyhzZWxFbmRJbmRleCArIDEpOwotCQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQljdXJyZW50RG9jLnNldChuZXdIVE1MKTsKLQkJCWFkZE1vZGlmeUxpc3RlbmVycygpOwotCQkJdXBkYXRlUmljaFRleHQobmV3SFRNTCk7Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBJbnNlcnRzIGFuIGltYWdlIGF0IHRoZSBzZWxlY3Rpb24gKG92ZXJ3cml0aW5nIHRoZSBzZWxlY3Rpb24pLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEltYWdlKFN0cmluZyBpbWFnZVVSTCwgU3RyaW5nIGhlaWdodCwgU3RyaW5nIHdpZHRoLCBTdHJpbmcgYWx0VGFnKSB7Ci0JCWlmICh0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkgPT0gcmljaFRleHRUYWIpIHsKLQkJCWV4ZWN1dGVDb21tYW5kKAotCQkJCQlSaWNoVGV4dENvbW1hbmQuQUREX0lNQUdFLAotCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJCWltYWdlVVJMLAotCQkJCQkJCWhlaWdodCwgd2lkdGgsIGFsdFRhZyB9KTsKLQkJfSBlbHNlIGlmICh0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkgPT0gaHRtbFRhYikgewotCQkJU3RyaW5nQnVmZmVyIGltYWdlTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCS8vIG9yZGVyIG9mIHRoZXNlIGF0dHJpYnV0ZXMgaXMgdGhlIHNhbWUgYXMgSlRpZHknZWQgSFRNTAotCQkJaW1hZ2VMaW5rLmFwcGVuZCgiPGltZyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaGVpZ2h0Lmxlbmd0aCgpID4gMCkgewotCQkJCWltYWdlTGluay5hcHBlbmQoIiBoZWlnaHQ9XCIiICsgaGVpZ2h0ICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaWYgKGFsdFRhZy5sZW5ndGgoKSA+IDApIHsKLQkJCQlpbWFnZUxpbmsuYXBwZW5kKCIgYWx0PVwiIiArIGFsdFRhZyArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWltYWdlTGluay5hcHBlbmQoIiBzcmM9XCIiICsgaW1hZ2VVUkwgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAod2lkdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaW1hZ2VMaW5rLmFwcGVuZCgiIHdpZHRoPVwiIiArIHdpZHRoICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaW1hZ2VMaW5rLmFwcGVuZCgiIC8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBvbGRIVE1MID0gZ2V0U291cmNlRWRpdCgpLmdldFRleHQoKTsKLQkJCVBvaW50IHNlbCA9IHNvdXJjZVZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCQlpbnQgc2VsU3RhcnRJbmRleCA9IHNlbC54OwotCQkJaW50IHNlbEVuZEluZGV4ID0gc2VsLnggKyBzZWwueSAtIDE7Ci0JCQlTdHJpbmcgbmV3SFRNTCA9IG9sZEhUTUwuc3Vic3RyaW5nKDAsIHNlbFN0YXJ0SW5kZXgpICsgaW1hZ2VMaW5rLnRvU3RyaW5nKCkKLQkJCQkJKyBvbGRIVE1MLnN1YnN0cmluZyhzZWxFbmRJbmRleCArIDEpOwotCQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQljdXJyZW50RG9jLnNldChuZXdIVE1MKTsKLQkJCWFkZE1vZGlmeUxpc3RlbmVycygpOwotCQkJdXBkYXRlUmljaFRleHQobmV3SFRNTCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgSFRNTCB0YWIgaXMgc2VsZWN0ZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgSFRNTCB0YWIgaXMgc2VsZWN0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIVE1MVGFiU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiAodGFiRm9sZGVyLmdldFNlbGVjdGlvbigpID09IGh0bWxUYWIpOwotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSBjb250ZXh0IG1lbnUgd2l0aCBtZW51IGl0ZW1zLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0TWVudQotCSAqICAgICAgICAgICAgYSBjb250ZXh0IG1lbnUgY29udGFpbmluZyByaWNoIHRleHQgYWN0aW9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxDb250ZXh0TWVudShNZW51IGNvbnRleHRNZW51KSB7Ci0JCWZpbmFsIE1lbnVJdGVtIGN1dEl0ZW0gPSBuZXcgTWVudUl0ZW0oY29udGV4dE1lbnUsIFNXVC5QVVNIKTsKLQkJY3V0SXRlbS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmN1dEFjdGlvbl90ZXh0KTsKLQkJY3V0SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ3V0QWN0aW9uIGFjdGlvbiA9IG5ldyBDdXRBY3Rpb24oUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCQlmaW5hbCBNZW51SXRlbSBjb3B5SXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQljb3B5SXRlbS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmNvcHlBY3Rpb25fdGV4dCk7IAotCQljb3B5SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29weUFjdGlvbiBhY3Rpb24gPSBuZXcgQ29weUFjdGlvbihSaWNoVGV4dEVkaXRvci50aGlzKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dEVkaXRvci50aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIE1lbnVJdGVtIHBhc3RlSXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQlwYXN0ZUl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5wYXN0ZUFjdGlvbl90ZXh0KTsgCi0JCXBhc3RlSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUGFzdGVBY3Rpb24gYWN0aW9uID0gbmV3IFBhc3RlQWN0aW9uKFJpY2hUZXh0RWRpdG9yLnRoaXMpOwotCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0RWRpdG9yLnRoaXMpOwotCQkJfQotCQl9KTsKLQkJCi0JCWZpbmFsIE1lbnVJdGVtIHBhc3RlUGxhaW5UZXh0SXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQlwYXN0ZVBsYWluVGV4dEl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5wYXN0ZVBsYWluVGV4dEFjdGlvbl90ZXh0KTsKLQkJcGFzdGVQbGFpblRleHRJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlQYXN0ZVBsYWluVGV4dEFjdGlvbiBhY3Rpb24gPSBuZXcgUGFzdGVQbGFpblRleHRBY3Rpb24oUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUhpZGRlbihNZW51RXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgc2VsZWN0ZWRUZXh0ID0gZ2V0U2VsZWN0ZWQoKS5nZXRUZXh0KCk7Ci0JCQkJYm9vbGVhbiBzZWxlY3Rpb24gPSBzZWxlY3RlZFRleHQubGVuZ3RoKCkgPiAwOwotCQkJCWN1dEl0ZW0uc2V0RW5hYmxlZChlZGl0YWJsZSAmJiBzZWxlY3Rpb24pOwotCQkJCWNvcHlJdGVtLnNldEVuYWJsZWQoc2VsZWN0aW9uKTsKLQkJCQlwYXN0ZUl0ZW0uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJcGFzdGVQbGFpblRleHRJdGVtLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBjb250ZW50IG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aXRob3V0IHVwZGF0aW5nIHRoZSBIVE1MCi0JICogc291cmNlIGVkaXRvci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBIVE1MIHNvdXJjZSBlZGl0b3IgdG8gc3luYyB1cCBpdHMKLQkgKiBjb250ZW50IHdpdGggdGhlIHJpY2ggdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgaW4gWEhUTUwgZm9ybWF0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVJpY2hUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KHRleHQpOwotCQkJcmljaFRleHQuY2hlY2tNb2RpZnkoKTsKLQkJfQotCQlzb3VyY2VNb2RpZmllZCA9IGZhbHNlOwotCQlpZiAodGFiRm9sZGVyICE9IG51bGwpIHsKLQkJCWlmICh0b29sQmFyICE9IG51bGwpIHsKLQkJCQl0b29sQmFyLnVwZGF0ZVRvb2xCYXIoZWRpdGFibGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGREcm9wU3VwcG9ydFRvU3R5bGVkVGV4dCgpIHsKLQkJLy8gdGhpcyBmdW5jdGlvbiBiYXNlZCBoZWF2aWx5IG9uIHRoZSBleGFtcGxlIGF0OgotCQkvLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtU1dULURORC9ETkQtaW4tU1dULmh0bWwKLQkJCi0JCSAJLy8gQWxsb3cgZGF0YSB0byBiZSBjb3BpZWQgdG8gdGhlIGRyb3AgdGFyZ2V0Ci0JCQlpbnQgb3BlcmF0aW9ucyA9IERORC5EUk9QX01PVkUgfCAgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0RFRkFVTFQ7Ci0JCQlzb3VyY2VFZGl0RHJvcFRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KGdldFNvdXJjZUVkaXQoKSwgb3BlcmF0aW9ucyk7Ci0JCSAKLQkJCS8vIFJlY2VpdmUgZGF0YSBpbiBUZXh0IG9yIEhUTUwgZm9ybWF0Ci0JCQlmaW5hbCBUZXh0VHJhbnNmZXIgdGV4dFRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQlmaW5hbCBIVE1MVHJhbnNmZXIgaHRtbFRyYW5zZmVyID0gSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQlUcmFuc2ZlcltdIHR5cGVzID0gbmV3IFRyYW5zZmVyW10ge2h0bWxUcmFuc2ZlciwgdGV4dFRyYW5zZmVyfTsKLQkJCXNvdXJjZUVkaXREcm9wVGFyZ2V0LnNldFRyYW5zZmVyKHR5cGVzKTsKLQkJCSAKLQkJCXNvdXJjZUVkaXREcm9wVGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldExpc3RlbmVyKCkgewotCQkJICBwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkgICAgIGlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJICAgICAgICAgaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgewotCQkJICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkgICAgICAgICB9IGVsc2UgewotCQkJICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkgICAgICAgICB9Ci0JCQkgICAgIH0KLQkJCSAgICAgaWYgKCFnZXRFZGl0YWJsZSgpKSB7Ci0JCSAgICAgICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJICAgICB9Ci0JCQkgICAgIC8vIHdpbGwgYWNjZXB0IHRleHQgYnV0IHByZWZlciB0byBoYXZlIEhUTUwgZHJvcHBlZAotCQkJICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50LmRhdGFUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJICAgICAgICAgaWYgKGh0bWxUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGVzW2ldKSl7Ci0JCQkgICAgICAgICAgICAgZXZlbnQuY3VycmVudERhdGFUeXBlID0gZXZlbnQuZGF0YVR5cGVzW2ldOwotCQkJICAgICAgICAgICAgIGJyZWFrOwotCQkJICAgICAgICAgfQotCQkJICAgICB9Ci0JCQkgICB9Ci0JCQkgICBwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICAgICAgZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUIHwgRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUiB8IERORC5GRUVEQkFDS19TQ1JPTEw7Ci0JCQkgICAgfQotCQkJICAgIHB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJICAgICAgICBpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCSAgICAgICAgICAgIGlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0NPUFkpICE9IDApIHsKLQkJCSAgICAgICAgICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJICAgICAgICAgICAgfSBlbHNlIHsKLQkJCSAgICAgICAgICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJICAgICAgICAgICAgfQotCQkJICAgICAgICB9Ci0JCQkgICAgfQotCQkJICAgIHB1YmxpYyB2b2lkIGRyYWdMZWF2ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICB9Ci0JCQkgICAgcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICB9Ci0JCQkgICAgcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICAgICAgaWYgKHRleHRUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSB8fCAKLQkJCSAgICAgICAgCQlodG1sVHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpIHsKLQkJCSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gKFN0cmluZylldmVudC5kYXRhOwotCQkJICAgICAgICAgICAgYWRkSFRNTCh0ZXh0KTsKLQkJCSAgICAgICAgfQotCQkJICAgIH0KLQkJCX0pOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnREZWJ1Z01lc3NhZ2UoU3RyaW5nIG1ldGhvZCwgU3RyaW5nIG1zZywgU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3RyQnVmLmFwcGVuZCgiUmljaFRleHRFZGl0b3JbIikuYXBwZW5kKHJpY2hUZXh0LmdldENvbnRyb2woKS5oYW5kbGUpLmFwcGVuZCgnXScpIC8vJE5PTi1OTFMtMSQKLQkJCQkuYXBwZW5kKCcuJykuYXBwZW5kKG1ldGhvZCk7Ci0JCWlmIChtc2cgIT0gbnVsbCAmJiBtc2cubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKCI6ICIpLmFwcGVuZChtc2cpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJc3RyQnVmLmFwcGVuZCgnXG4nKS5hcHBlbmQodGV4dCk7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKHN0ckJ1Zik7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGRlYnVnIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByaW50RGVidWdNZXNzYWdlKFN0cmluZyBtZXRob2QsIFN0cmluZyBtc2cpIHsKLQkJcHJpbnREZWJ1Z01lc3NhZ2UobWV0aG9kLCBtc2csIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgRmluZFJlcGxhY2VBY3Rpb24gZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSB7Ci0JCXJldHVybiByaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbmRSZXBsYWNlQWN0aW9uKEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRGaW5kUmVwbGFjZUFjdGlvbihmaW5kUmVwbGFjZUFjdGlvbik7Ci0JCQlyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLnNldFJpY2hUZXh0KHRoaXMpOwotCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldEluaXRpYWxUZXh0KHRleHQpOwotCQl9Ci0JCWlmIChnZXRTb3VyY2VFZGl0KCkgIT0gbnVsbCkgewotCQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQlzZXREb2N1bWVudChuZXcgRG9jdW1lbnQodGV4dCkpOwotCQkJYWRkTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCX0KLQotCX0KLQkKLQkKLQkvKioKLQkgKiBmcm9tIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI2dldFVuZG9Db250ZXh0KCkKLQkgKiBSZXR1cm5zIHRoaXMgZWRpdG9yJ3Mgdmlld2VyJ3MgdW5kbyBtYW5hZ2VyIHVuZG8gY29udGV4dC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHVuZG8gY29udGV4dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYXZhaWxhYmxlCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgSVVuZG9Db250ZXh0IGdldFVuZG9Db250ZXh0KCkgewotCQlpZiAoc291cmNlVmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb242KSB7Ci0JCQlJVW5kb01hbmFnZXIgdW5kb01hbmFnZXI9ICgoSVRleHRWaWV3ZXJFeHRlbnNpb242KXNvdXJjZVZpZXdlcikuZ2V0VW5kb01hbmFnZXIoKTsKLQkJCWlmICh1bmRvTWFuYWdlciBpbnN0YW5jZW9mIElVbmRvTWFuYWdlckV4dGVuc2lvbikKLQkJCQlyZXR1cm4gKChJVW5kb01hbmFnZXJFeHRlbnNpb24pdW5kb01hbmFnZXIpLmdldFVuZG9Db250ZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCWNyZWF0ZVVuZG9SZWRvQWN0aW9ucygpOwotCQkvLyBzZWxlY3QgYWxsCi0JCUFjdGlvbiBzZWxlY3RBbGxBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZ2V0U291cmNlRWRpdCgpLnNlbGVjdEFsbCgpOwotCQkJfQotCQl9OwotCQlzZWxlY3RBbGxBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzLlNFTEVDVF9BTEwpOwotCQlyZWdpc3RlckFjdGlvbihBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSwgc2VsZWN0QWxsQWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIGZyb20gb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjY3JlYXRlVW5kb1JlZG9BY3Rpb25zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVVbmRvUmVkb0FjdGlvbnMoKSB7Ci0JCUlVbmRvQ29udGV4dCB1bmRvQ29udGV4dD0gZ2V0VW5kb0NvbnRleHQoKTsKLQkJaWYgKHVuZG9Db250ZXh0ICE9IG51bGwpIHsKLQkJCS8vIFVzZSBhY3Rpb25zIHByb3ZpZGVkIGJ5IGdsb2JhbCB1bmRvL3JlZG8KLQkJCQotCQkJLy8gQ3JlYXRlIHRoZSB1bmRvIGFjdGlvbgotCQkJdW5kb0FjdGlvbj0gbmV3IFVuZG9BY3Rpb25IYW5kbGVyKGdldEVkaXRvclNpdGUoKSwgdW5kb0NvbnRleHQpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1bmRvQWN0aW9uLCBJQWJzdHJhY3RUZXh0RWRpdG9ySGVscENvbnRleHRJZHMuVU5ET19BQ1RJT04pOwotCQkJdW5kb0FjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuVU5ETyk7Ci0JCQlyZWdpc3RlckFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPLCB1bmRvQWN0aW9uKTsKLQotCQkJLy8gQ3JlYXRlIHRoZSByZWRvIGFjdGlvbi4KLQkJCXJlZG9BY3Rpb249IG5ldyBSZWRvQWN0aW9uSGFuZGxlcihnZXRFZGl0b3JTaXRlKCksIHVuZG9Db250ZXh0KTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmVkb0FjdGlvbiwgSUFic3RyYWN0VGV4dEVkaXRvckhlbHBDb250ZXh0SWRzLlJFRE9fQUNUSU9OKTsKLQkJCXJlZG9BY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzLlJFRE8pOwotCQkJcmVnaXN0ZXJBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETywgcmVkb0FjdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJRWRpdG9yU2l0ZSBnZXRFZGl0b3JTaXRlKCkgewotCQlyZXR1cm4gZWRpdG9yU2l0ZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gdW5kby9yZWRvIGFjdGlvbiB1bmRlciB0aGUgZ2l2ZW4gSUQgYW5kCi0JICogZW5zdXJlcyB0aGF0IHByZXZpb3VzbHkgaW5zdGFsbGVkIGFjdGlvbnMgZ2V0IGRpc3Bvc2VkLiBJdAotCSAqIGFsc28gdGFrZXMgY2FyZSBvZiByZS1yZWdpc3RlcmluZyB0aGUgbmV3IGFjdGlvbiB3aXRoIHRoZQotCSAqIGdsb2JhbCBhY3Rpb24gaGFuZGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uSWQJdGhlIGFjdGlvbiBpZCB1bmRlciB3aGljaCB0byByZWdpc3RlciB0aGUgYWN0aW9uCi0JICogQHBhcmFtIGFjdGlvbgl0aGUgYWN0aW9uIHRvIHJlZ2lzdGVyCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgdm9pZCByZWdpc3RlckFjdGlvbihTdHJpbmcgYWN0aW9uSWQsIElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlBY3Rpb24gb2xkQWN0aW9uPSBnZXRBY3Rpb24oYWN0aW9uSWQpOwotCQlpZiAob2xkQWN0aW9uIGluc3RhbmNlb2YgT3BlcmF0aW9uSGlzdG9yeUFjdGlvbkhhbmRsZXIpCi0JCQkoKE9wZXJhdGlvbkhpc3RvcnlBY3Rpb25IYW5kbGVyKW9sZEFjdGlvbikuZGlzcG9zZSgpOwotCi0JCXNldEFjdGlvbihhY3Rpb25JZCwgYWN0aW9uKTsKLQkJCi0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnM9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpCi0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoYWN0aW9uSWQsIGFjdGlvbik7Ci0JfQotCi0JCi0JLyoKLQkgKiBAc2VlIElUZXh0RWRpdG9yI2dldEFjdGlvbihTdHJpbmcpCi0JICovCi0JcHVibGljIElBY3Rpb24gZ2V0QWN0aW9uKFN0cmluZyBhY3Rpb25JRCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGFjdGlvbklEKTsKLQkJSUFjdGlvbiBhY3Rpb249IChJQWN0aW9uKSBmQWN0aW9ucy5nZXQoYWN0aW9uSUQpOwotCi0vLwkJaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0vLwkJCWFjdGlvbj0gZmluZENvbnRyaWJ1dGVkQWN0aW9uKGFjdGlvbklEKTsKLS8vCQkJaWYgKGFjdGlvbiAhPSBudWxsKQotLy8JCQkJc2V0QWN0aW9uKGFjdGlvbklELCBhY3Rpb24pOwotLy8JCX0KLQotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qCi0JICogQHNlZSBJVGV4dEVkaXRvciNzZXRBY3Rpb24oU3RyaW5nLCBJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uSUQsIElBY3Rpb24gYWN0aW9uKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoYWN0aW9uSUQpOwotCQlpZiAoYWN0aW9uID09IG51bGwpIHsKLQkJCWFjdGlvbj0gKElBY3Rpb24pIGZBY3Rpb25zLnJlbW92ZShhY3Rpb25JRCk7Ci0JCQlpZiAoYWN0aW9uICE9IG51bGwpCi0JCQkJZkFjdGl2YXRpb25Db2RlVHJpZ2dlci51bnJlZ2lzdGVyQWN0aW9uRnJvbUtleUFjdGl2YXRpb24oYWN0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCWZBY3Rpb25zLnB1dChhY3Rpb25JRCwgYWN0aW9uKTsKLQkJCWZBY3RpdmF0aW9uQ29kZVRyaWdnZXIucmVnaXN0ZXJBY3Rpb25Gb3JLZXlBY3RpdmF0aW9uKGFjdGlvbik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFjdGl2YXRpb24gY29kZSB0cmlnZ2VyLgotCSAqCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQWN0aXZhdGlvbkNvZGVUcmlnZ2VyKCkgewotCQlmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyLmluc3RhbGwoKTsKLQkJZkFjdGl2YXRpb25Db2RlVHJpZ2dlci5zZXRTY29wZXMoZktleUJpbmRpbmdTY29wZXMpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIGtleSB2ZXJpZnkgbGlzdGVuZXIgZm9yIHRyaWdnZXJpbmcgYWN0aW9uIGFjdGl2YXRpb24gY29kZXMuCi0JICovCi0JY2xhc3MgQWN0aXZhdGlvbkNvZGVUcmlnZ2VyIGltcGxlbWVudHMgVmVyaWZ5S2V5TGlzdGVuZXIgewotCi0JCS8qKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHRyaWdnZXIgaGFzIGJlZW4gaW5zdGFsbGVkLiAqLwotCQlwcml2YXRlIGJvb2xlYW4gZklzSW5zdGFsbGVkPSBmYWxzZTsKLQkJLyoqCi0JCSAqIFRoZSBrZXkgYmluZGluZyBzZXJ2aWNlIHRvIHVzZS4KLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHJpdmF0ZSBJS2V5QmluZGluZ1NlcnZpY2UgZktleUJpbmRpbmdTZXJ2aWNlOwotCQkKLQkJLyoKLQkJICogQHNlZSBWZXJpZnlLZXlMaXN0ZW5lciN2ZXJpZnlLZXkob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHZlcmlmeUtleShWZXJpZnlFdmVudCBldmVudCkgewotCi0JCQlBY3Rpb25BY3RpdmF0aW9uQ29kZSBjb2RlPSBudWxsOwotCQkJaW50IHNpemU9IGZBY3RpdmF0aW9uQ29kZXMuc2l6ZSgpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWNvZGU9IChBY3Rpb25BY3RpdmF0aW9uQ29kZSkgZkFjdGl2YXRpb25Db2Rlcy5nZXQoaSk7Ci0JCQkJaWYgKGNvZGUubWF0Y2hlcyhldmVudCkpIHsKLQkJCQkJSUFjdGlvbiBhY3Rpb249IGdldEFjdGlvbihjb2RlLmZBY3Rpb25JZCk7Ci0JCQkJCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCi0JCQkJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSVVwZGF0ZSkKLQkJCQkJCQkoKElVcGRhdGUpIGFjdGlvbikudXBkYXRlKCk7Ci0KLQkJCQkJCWlmICghYWN0aW9uLmlzRW5hYmxlZCgpICYmIGFjdGlvbiBpbnN0YW5jZW9mIElSZWFkT25seURlcGVuZGVudCkgewotCQkJCQkJCUlSZWFkT25seURlcGVuZGVudCBkZXBlbmRlbnQ9IChJUmVhZE9ubHlEZXBlbmRlbnQpIGFjdGlvbjsKLQkJCQkJCQlib29sZWFuIHdyaXRhYmxlPSBkZXBlbmRlbnQuaXNFbmFibGVkKHRydWUpOwotCQkJCQkJCWlmICh3cml0YWJsZSkgewotCQkJCQkJCQlldmVudC5kb2l0PSBmYWxzZTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAoYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCQkJZXZlbnQuZG9pdD0gZmFsc2U7Ci0JCQkJCQkJYWN0aW9uLnJ1bigpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBJbnN0YWxscyB0aGlzIHRyaWdnZXIgb24gdGhlIGVkaXRvcidzIHRleHQgd2lkZ2V0LgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnN0YWxsKCkgewotCQkJaWYgKCFmSXNJbnN0YWxsZWQpIHsKLQotCQkJCWlmIChzb3VyY2VWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbikgewotCQkJCQlJVGV4dFZpZXdlckV4dGVuc2lvbiBlPSAoSVRleHRWaWV3ZXJFeHRlbnNpb24pIHNvdXJjZVZpZXdlcjsKLQkJCQkJZS5wcmVwZW5kVmVyaWZ5S2V5TGlzdGVuZXIodGhpcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3R5bGVkVGV4dCB0ZXh0PSBzb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQkJCQl0ZXh0LmFkZFZlcmlmeUtleUxpc3RlbmVyKHRoaXMpOwotCQkJCX0KLQotCQkJCWZLZXlCaW5kaW5nU2VydmljZT0gZ2V0RWRpdG9yU2l0ZSgpLmdldEtleUJpbmRpbmdTZXJ2aWNlKCk7Ci0JCQkJZklzSW5zdGFsbGVkPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFVuaW5zdGFsbHMgdGhpcyB0cmlnZ2VyIGZyb20gdGhlIGVkaXRvcidzIHRleHQgd2lkZ2V0LgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCQlpZiAoZklzSW5zdGFsbGVkKSB7Ci0KLQkJCQlpZiAoc291cmNlVmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb24pIHsKLQkJCQkJSVRleHRWaWV3ZXJFeHRlbnNpb24gZT0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uKSBzb3VyY2VWaWV3ZXI7Ci0JCQkJCWUucmVtb3ZlVmVyaWZ5S2V5TGlzdGVuZXIodGhpcyk7Ci0JCQkJfSBlbHNlIGlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJCQlTdHlsZWRUZXh0IHRleHQ9IHNvdXJjZVZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgIXRleHQuaXNEaXNwb3NlZCgpKQotCQkJCQkJdGV4dC5yZW1vdmVWZXJpZnlLZXlMaXN0ZW5lcihmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyKTsKLQkJCQl9Ci0KLQkJCQlmSXNJbnN0YWxsZWQ9IGZhbHNlOwotCQkJCWZLZXlCaW5kaW5nU2VydmljZT0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIGFjdGlvbiBmb3Iga2V5IGFjdGl2YXRpb24uCi0JCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiB0byBiZSByZWdpc3RlcmVkCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQWN0aW9uRm9yS2V5QWN0aXZhdGlvbihJQWN0aW9uIGFjdGlvbikgewotCQkJaWYgKGFjdGlvbi5nZXRBY3Rpb25EZWZpbml0aW9uSWQoKSAhPSBudWxsKQotCQkJCWZLZXlCaW5kaW5nU2VydmljZS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBnaXZlbiBhY3Rpb24gaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBmb3Iga2V5IGFjdGl2YXRpb24KLQkJICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHRvIGJlIHVucmVnaXN0ZXJlZAotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQWN0aW9uRnJvbUtleUFjdGl2YXRpb24oSUFjdGlvbiBhY3Rpb24pIHsKLQkJCWlmIChhY3Rpb24uZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkgIT0gbnVsbCkKLQkJCQlmS2V5QmluZGluZ1NlcnZpY2UudW5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIGtleSBiaW5kaW5nIHNjb3BlcyBmb3IgdGhpcyBlZGl0b3IuCi0JCSAqIEBwYXJhbSBrZXlCaW5kaW5nU2NvcGVzIHRoZSBrZXkgYmluZGluZyBzY29wZXMKLQkJICogQHNpbmNlIDIuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U2NvcGVzKFN0cmluZ1tdIGtleUJpbmRpbmdTY29wZXMpIHsKLQkJCWlmIChrZXlCaW5kaW5nU2NvcGVzICE9IG51bGwgJiYga2V5QmluZGluZ1Njb3Blcy5sZW5ndGggPiAwKQotCQkJCWZLZXlCaW5kaW5nU2VydmljZS5zZXRTY29wZXMoa2V5QmluZGluZ1Njb3Blcyk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVwcmVzZW50YXRpb24gb2YgYWN0aW9uIGFjdGl2YXRpb24gY29kZXMuCi0JICovCi0Jc3RhdGljIGNsYXNzIEFjdGlvbkFjdGl2YXRpb25Db2RlIHsKLQotCQkvKiogVGhlIGFjdGlvbiBpZC4gKi8KLQkJcHVibGljIFN0cmluZyBmQWN0aW9uSWQ7Ci0JCS8qKiBUaGUgY2hhcmFjdGVyLiAqLwotCQlwdWJsaWMgY2hhciBmQ2hhcmFjdGVyOwotCQkvKiogVGhlIGtleSBjb2RlLiAqLwotCQlwdWJsaWMgaW50IGZLZXlDb2RlPSAtMTsKLQkJLyoqIFRoZSBzdGF0ZSBtYXNrLiAqLwotCQlwdWJsaWMgaW50IGZTdGF0ZU1hc2s9IFNXVC5ERUZBVUxUOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiBhY3RpdmF0aW9uIGNvZGUgZm9yIHRoZSBnaXZlbiBhY3Rpb24gaWQuCi0JCSAqIEBwYXJhbSBhY3Rpb25JZCB0aGUgYWN0aW9uIGlkCi0JCSAqLwotCQlwdWJsaWMgQWN0aW9uQWN0aXZhdGlvbkNvZGUoU3RyaW5nIGFjdGlvbklkKSB7Ci0JCQlmQWN0aW9uSWQ9IGFjdGlvbklkOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3RpdmF0aW9uIGNvZGUgbWF0Y2hlcyB0aGUgZ2l2ZW4gdmVyaWZ5IGV2ZW50LgotCQkgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50IHRvIHRlc3QgZm9yIG1hdGNoaW5nCi0JCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGFjdGl2YXRpb24gY29kZSBtYXRjaGVzIDxjb2RlPmV2ZW50PC9jb2RlPgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhWZXJpZnlFdmVudCBldmVudCkgewotCQkJcmV0dXJuIChldmVudC5jaGFyYWN0ZXIgPT0gZkNoYXJhY3RlciAmJgotCQkJCQkJKGZLZXlDb2RlID09IC0xIHx8IGV2ZW50LmtleUNvZGUgPT0gZktleUNvZGUpICYmCi0JCQkJCQkoZlN0YXRlTWFzayA9PSBTV1QuREVGQVVMVCB8fCBldmVudC5zdGF0ZU1hc2sgPT0gZlN0YXRlTWFzaykpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0RWRpdG9yRm9ybS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEVkaXRvckZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTg1MWEzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0RWRpdG9yRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotLyoqCi0gKiBBIGNvbXBvc2l0ZSBmb3IgbGF5aW5nIG91dCB0aGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yIGluIGFuIEVjbGlwc2UgZm9ybS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dEVkaXRvckZvcm0gZXh0ZW5kcyBWaWV3Rm9ybSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGlzIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRFZGl0b3JGb3JtKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzI2dldERhdGEoU3RyaW5nIGtleSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERhdGEoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVxdWFscyhGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIpKSB7Ci0JCQkvLyBSZXR1cm4gYSB0ZXh0IGJvcmRlciB0byBnZXQgdGhlIEZvcm1Ub29sa2l0J3MgQm9yZGVyUGFpbnRlciB0bwotCQkJLy8gcGFpbnQgYSBib3JkZXIgZm9yIHRoZSByaWNoIHRleHQgZWRpdG9yLgotCQkJcmV0dXJuIEZvcm1Ub29sa2l0LlRFWFRfQk9SREVSOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREYXRhKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0Rm9ybVRvb2xraXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRGb3JtVG9vbGtpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZWRmMDAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRGb3JtVG9vbGtpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLS8qKgotICogQSBoZWxwZXIgdG9vbGtpdCBmb3IgY3JlYXRpbmcgYSByaWNoIHRleHQgY29udHJvbCBhbmQgZWRpdG9yIHRoYXQgY2FuIGJlCi0gKiBhZGRlZCB0byBhbiBFY2xpcHNlIGZvcm0uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRGb3JtVG9vbGtpdCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGNvbnRyb2wgYW5kIGFkYXB0cyBpdCB0byBiZSB1c2VkIGluIGEgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgdGhlIGZvcm0gdG9vbGtpdAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgaW5pdGlhbCB0ZXh0IGZvciB0aGUgdmlld2VyCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgaW5pdGlhbCBzdHlsZSBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHJlZnMKLQkgKiBAcmV0dXJuIGEgbmV3IDxjb2RlPklSaWNoVGV4dDwvY29kZT4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSaWNoVGV4dCBjcmVhdGVSaWNoVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlJUmljaFRleHQgcmljaFRleHQgPSBuZXcgUmljaFRleHQocGFyZW50LCB0b29sa2l0LmdldEJvcmRlclN0eWxlKCkKLQkJCQl8IHN0eWxlIHwgdG9vbGtpdC5nZXRPcmllbnRhdGlvbigpKTsKLQkJcmljaFRleHQuZ2V0Q29udHJvbCgpLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLAotCQkJCUZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gcmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBlZGl0b3IgYW5kIGFkYXB0cyBpdCB0byBiZSB1c2VkIGluIGEgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgdGhlIGZvcm0gdG9vbGtpdAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgaW5pdGlhbCB0ZXh0IGZvciB0aGUgdmlld2VyCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgaW5pdGlhbCBzdHlsZSBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHJlZnMKLQkgKiBAcmV0dXJuIGEgbmV3IDxjb2RlPklSaWNoVGV4dDwvY29kZT4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSaWNoVGV4dEVkaXRvciBjcmVhdGVSaWNoVGV4dEVkaXRvcihGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSwgSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSkgewotCQlJUmljaFRleHRFZGl0b3IgcmljaFRleHRFZGl0b3IgPSBuZXcgUmljaFRleHRFZGl0b3IocGFyZW50LCB0b29sa2l0Ci0JCQkJLmdldEJvcmRlclN0eWxlKCkKLQkJCQl8IHN0eWxlIHwgdG9vbGtpdC5nZXRPcmllbnRhdGlvbigpLCBlZGl0b3JTaXRlKTsKLQkJcmljaFRleHRFZGl0b3IuZ2V0Q29udHJvbCgpLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLAotCQkJCUZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHRFZGl0b3Iuc2V0SW5pdGlhbFRleHQodGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHJpY2hUZXh0RWRpdG9yOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEltYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OGRmNzMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFNoYXJlZCBpbWFnZXMgdXNlZCBieSB0aGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0SW1hZ2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFVE9PTDE2ID0gImZ1bGwvZXRvb2wxNi8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRPT0wxNiA9ICJmdWxsL2R0b29sMTYvIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJpY2hUZXh0UGx1Z2luIHJpY2hUZXh0UGx1Z2luID0gUmljaFRleHRQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9BRERfSU1BR0UgPSBFVE9PTDE2ICsgIkFkZEltYWdlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9MSU5FID0gRVRPT0wxNiArICJBZGRMaW5lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9MSU5LID0gRVRPT0wxNiArICJBZGRMaW5rLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QgPSBFVE9PTDE2Ci0JCQkrICJBZGRPcmRlcmVkTGlzdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9BRERfVEFCTEUgPSBFVE9PTDE2ICsgIkFkZFRhYmxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9VTk9SREVSRURfTElTVCA9IEVUT09MMTYKLQkJCSsgIkFkZFVub3JkZXJlZExpc3QuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfQk9MRCA9IEVUT09MMTYgKyAiQm9sZC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9DTEVBUl9DT05URU5UID0gRVRPT0wxNgotCQkJKyAiQ2xlYXJDb250ZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9DT1BZID0gRVRPT0wxNiArICJDb3B5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0NVVCA9IEVUT09MMTYgKyAiQ3V0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0ZJTkRfUkVQTEFDRSA9IEVUT09MMTYKLQkJCSsgIkZpbmRSZXBsYWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0lOREVOVCA9IEVUT09MMTYgKyAiSW5kZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0lUQUxJQyA9IEVUT09MMTYgKyAiSXRhbGljLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0pVU1RJRllfQ0VOVEVSID0gRVRPT0wxNgotCQkJKyAiSnVzdGlmeUNlbnRlci5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9KVVNUSUZZX0ZVTEwgPSBFVE9PTDE2Ci0JCQkrICJKdXN0aWZ5RnVsbC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9KVVNUSUZZX0xFRlQgPSBFVE9PTDE2Ci0JCQkrICJKdXN0aWZ5TGVmdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9KVVNUSUZZX1JJR0hUID0gRVRPT0wxNgotCQkJKyAiSnVzdGlmeVJpZ2h0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX09VVERFTlQgPSBFVE9PTDE2ICsgIk91dGRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfUEFTVEUgPSBFVE9PTDE2ICsgIlBhc3RlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX1NUUklLRV9USFJPVUdIID0gRVRPT0wxNgotCQkJKyAiU3RyaWtlVGhyb3VnaC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9TVUJTQ1JJUFQgPSBFVE9PTDE2ICsgIlN1YnNjcmlwdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9TVVBFUlNDUklQVCA9IEVUT09MMTYKLQkJCSsgIlN1cGVyc2NyaXB0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX1VOREVSTElORSA9IEVUT09MMTYgKyAiVW5kZXJsaW5lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX1RJRFkgPSBFVE9PTDE2ICsgInRpZHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUREX0lNQUdFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9BRERfSU1BR0UpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUREX0xJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0FERF9MSU5FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0FERF9MSU5LID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9BRERfTElOSyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19BRERfT1JERVJFRF9MSVNUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9BRERfT1JERVJFRF9MSVNUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0FERF9UQUJMRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQUREX1RBQkxFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0FERF9VTk9SREVSRURfTElTVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQUREX1VOT1JERVJFRF9MSVNUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0JPTEQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0JPTEQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ0xFQVJfQ09OVEVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQ0xFQVJfQ09OVEVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19DT1BZID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9DT1BZKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NVVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQ1VUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0ZJTkRfUkVQTEFDRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfRklORF9SRVBMQUNFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0lOREVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfSU5ERU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0lUQUxJQyA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfSVRBTElDKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0pVU1RJRllfQ0VOVEVSID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9KVVNUSUZZX0NFTlRFUik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19KVVNUSUZZX0ZVTEwgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0pVU1RJRllfRlVMTCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19KVVNUSUZZX0xFRlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0pVU1RJRllfTEVGVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19KVVNUSUZZX1JJR0hUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9KVVNUSUZZX1JJR0hUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX09VVERFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX09VVERFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUEFTVEUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX1BBU1RFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1NUUklLRV9USFJPVUdIID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9TVFJJS0VfVEhST1VHSCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVUJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX1NVQlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVVBFUlNDUklQVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfU1VQRVJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVU5ERVJMSU5FID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9VTkRFUkxJTkUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RJRFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX1RJRFkpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0FERF9JTUFHRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9JTUFHRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19BRERfTElORSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9MSU5FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0FERF9MSU5LID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQUREX0xJTkspOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfQUREX09SREVSRURfTElTVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfQUREX1RBQkxFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQUREX1RBQkxFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0FERF9VTk9SREVSRURfTElTVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9VTk9SREVSRURfTElTVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19CT0xEID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQk9MRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DTEVBUl9DT05URU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQ0xFQVJfQ09OVEVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DT1BZID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQ09QWSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DVVQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9DVVQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfRklORF9SRVBMQUNFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfRklORF9SRVBMQUNFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0lOREVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0lOREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19JVEFMSUMgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9JVEFMSUMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfSlVTVElGWV9DRU5URVIgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9KVVNUSUZZX0NFTlRFUik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19KVVNUSUZZX0ZVTEwgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9KVVNUSUZZX0ZVTEwpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfSlVTVElGWV9MRUZUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfSlVTVElGWV9MRUZUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0pVU1RJRllfUklHSFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9KVVNUSUZZX1JJR0hUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX09VVERFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9PVVRERU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX1BBU1RFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfUEFTVEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfU1RSSUtFX1RIUk9VR0ggPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9TVFJJS0VfVEhST1VHSCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19TVUJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9TVUJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfU1VQRVJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9TVVBFUlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19VTkRFUkxJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9VTkRFUkxJTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfVElEWSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX1RJRFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX0lNQUdFID0gRFRPT0wxNgotCQkJKyAiQWRkSW1hZ2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX0xJTkUgPSBEVE9PTDE2Ci0JCQkrICJBZGRMaW5lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5LID0gRFRPT0wxNgotCQkJKyAiQWRkTGluay5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9BRERfT1JERVJFRF9MSVNUID0gRFRPT0wxNgotCQkJKyAiQWRkT3JkZXJlZExpc3QuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX1RBQkxFID0gRFRPT0wxNgotCQkJKyAiQWRkVGFibGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX1VOT1JERVJFRF9MSVNUID0gRFRPT0wxNgotCQkJKyAiQWRkVW5vcmRlcmVkTGlzdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9CT0xEID0gRFRPT0wxNiArICJCb2xkLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0NMRUFSX0NPTlRFTlQgPSBEVE9PTDE2Ci0JCQkrICJDbGVhckNvbnRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0NPUFkgPSBEVE9PTDE2ICsgIkNvcHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQ1VUID0gRFRPT0wxNiArICJDdXQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfRklORF9SRVBMQUNFID0gRFRPT0wxNgotCQkJKyAiRmluZFJlcGxhY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSU5ERU5UID0gRFRPT0wxNgotCQkJKyAiSW5kZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0lUQUxJQyA9IERUT09MMTYKLQkJCSsgIkl0YWxpYy5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9KVVNUSUZZX0NFTlRFUiA9IERUT09MMTYKLQkJCSsgIkp1c3RpZnlDZW50ZXIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9GVUxMID0gRFRPT0wxNgotCQkJKyAiSnVzdGlmeUZ1bGwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9MRUZUID0gRFRPT0wxNgotCQkJKyAiSnVzdGlmeUxlZnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9SSUdIVCA9IERUT09MMTYKLQkJCSsgIkp1c3RpZnlSaWdodC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9PVVRERU5UID0gRFRPT0wxNgotCQkJKyAiT3V0ZGVudC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9QQVNURSA9IERUT09MMTYgKyAiUGFzdGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfU1RSSUtFX1RIUk9VR0ggPSBEVE9PTDE2Ci0JCQkrICJTdHJpa2VUaHJvdWdoLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX1NVQlNDUklQVCA9IERUT09MMTYKLQkJCSsgIlN1YnNjcmlwdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9TVVBFUlNDUklQVCA9IERUT09MMTYKLQkJCSsgIlN1cGVyc2NyaXB0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX1VOREVSTElORSA9IERUT09MMTYKLQkJCSsgIlVuZGVybGluZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19BRERfSU1BR0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0FERF9JTUFHRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19BRERfTElORSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfQUREX0xJTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQUREX0xJTksgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5LKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0FERF9PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQUREX1RBQkxFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9BRERfVEFCTEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQUREX1VOT1JERVJFRF9MSVNUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9BRERfVU5PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQk9MRCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfQk9MRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19DTEVBUl9DT05URU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9DTEVBUl9DT05URU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0NPUFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0NPUFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQ1VUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9DVVQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfRklORF9SRVBMQUNFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9GSU5EX1JFUExBQ0UpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSU5ERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9JTkRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSVRBTElDID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9JVEFMSUMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSlVTVElGWV9DRU5URVIgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfQ0VOVEVSKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0pVU1RJRllfRlVMTCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9GVUxMKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0pVU1RJRllfTEVGVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9MRUZUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0pVU1RJRllfUklHSFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfUklHSFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfT1VUREVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfT1VUREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19QQVNURSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfUEFTVEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfU1RSSUtFX1RIUk9VR0ggPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX1NUUklLRV9USFJPVUdIKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX1NVQlNDUklQVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfU1VCU0NSSVBUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX1NVUEVSU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9TVVBFUlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19VTkRFUkxJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX1VOREVSTElORSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfSU1BR0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfSU1BR0UpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQUREX0xJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfTElORSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfTElOSyA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5LKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0FERF9PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfT1JERVJFRF9MSVNUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0FERF9UQUJMRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0FERF9UQUJMRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfVU5PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfVU5PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQk9MRCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0JPTEQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQ0xFQVJfQ09OVEVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0NMRUFSX0NPTlRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQ09QWSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0NPUFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQ1VUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfQ1VUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0ZJTkRfUkVQTEFDRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0ZJTkRfUkVQTEFDRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19JTkRFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9JTkRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfSVRBTElDID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSVRBTElDKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0pVU1RJRllfQ0VOVEVSID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9DRU5URVIpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfSlVTVElGWV9GVUxMID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9GVUxMKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0pVU1RJRllfTEVGVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfTEVGVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19KVVNUSUZZX1JJR0hUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9SSUdIVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19PVVRERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfT1VUREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19QQVNURSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX1BBU1RFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1NUUklLRV9USFJPVUdIID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfU1RSSUtFX1RIUk9VR0gpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfU1VCU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfU1VCU0NSSVBUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1NVUEVSU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfU1VQRVJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfVU5ERVJMSU5FID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfVU5ERVJMSU5FKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWYyMjA0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIExpc3RlbnMgdG8gYSByaWNoIHRleHQgZWRpdGluZyBldmVudC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dExpc3RlbmVyIHsKLQotCXByaXZhdGUgaW50IGV2ZW50VHlwZTsKLQotCXByaXZhdGUgTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBldmVudCB0eXBlCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgZXZlbnQgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsKLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IHR5cGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZXZlbnQgdHlwZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgewotCQlyZXR1cm4gZXZlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyBMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OGUwNTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIFJpY2ggVGV4dCBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFJpY2hUZXh0UGx1Z2luIHBsdWdpbjsKLQotCS8vIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhpcyBwbHVnLWluIHdhcyBzdGFydGVkLgotCXByaXZhdGUgRGF0ZSBzdGFydFRpbWU7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBSaWNoVGV4dFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmljaFRleHRQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhpcyBwbHVnLWluIHdhcyBzdGFydGVkLgotCSAqLwotCXB1YmxpYyBEYXRlIGdldFN0YXJ0VGltZSgpIHsKLQkJcmV0dXJuIHN0YXJ0VGltZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmVmM2U1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0UmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgUmljaFRleHQgcmVzb3VyY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmljaFRleHRSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gUmljaFRleHRSZXNvdXJjZXMuY2xhc3MKLQkJLmdldFBhY2thZ2UoKS5nZXROYW1lKCkgKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIFJpY2hUZXh0UmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUuCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVBY3Rpb25fQ1NTX0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVBY3Rpb25fQ1NTX0RlZmF1bHRfTW96aWxsYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZUFjdGlvbl9EZWZhdWx0Rm9udE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udFN0eWxlX25vcm1hbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVfc2VjdGlvbkhlYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udFN0eWxlX3N1YnNlY3Rpb25IZWFkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnRTdHlsZV9zdWJTdWJzZWN0aW9uSGVhZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVfcXVvdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udFN0eWxlX2NvZGVTYW1wbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfcGFyYWdyYXBoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnX2hlYWRpbmcxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnX2hlYWRpbmcyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnX2hlYWRpbmczOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnX2hlYWRpbmc0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnX2hlYWRpbmc1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnX2hlYWRpbmc2OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnX2FkZHJlc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfcHJlZm9ybWF0dGVkVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZV9kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lX2FyaWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lX2NvdXJpZXJOZXc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVfdGltZXNOZXdSb21hbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZV92ZXJkYW5hOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZEhvcml6b250YWxCYXJBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkTGluZUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZFRhYmxlQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZFVub3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYm9sZEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhckNvbnRlbnRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZFJlcGxhY2VBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5kZW50QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGl0YWxpY0FjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBqdXN0aWZ5Q2VudGVyQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGp1c3RpZnlGdWxsQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGp1c3RpZnlMZWZ0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGp1c3RpZnlSaWdodEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRkZW50QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhc3RlQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhc3RlUGxhaW5UZXh0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1YnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBlcnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmRlcmxpbmVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udFN0eWxlQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1dEFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXN0ZUFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhc3RlUGxhaW5UZXh0QWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmljaFRleHRUYWJfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByaWNoVGV4dFRhYl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBodG1sVGFiX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaHRtbFRhYl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRJbWFnZURpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRMaW5rRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZFRhYmxlRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbmRSZXBsYWNlRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVybERpc3BsYXlOYW1lTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cmxMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1bW1hcnlMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcHRpb25MYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvd3NMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbHVtbnNMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpZHRoTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWJsZVN0eWxlTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWJsZUhlYWRlck5vbmVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWJsZUhlYWRlckNvbHNfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWJsZUhlYWRlclJvd3NfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWJsZUhlYWRlckJvdGhfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VCdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhckNvbnRlbnREaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYXJDb250ZW50RGlhbG9nX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZExhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3B0aW9uc0dyb3VwX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hvbGVXb3JkQ2hlY2tib3hfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXJlY3Rpb25Hcm91cF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcndhcmRSYWRpb0J1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUJ1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VGaW5kQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZWFsbEJ1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbmRSZXBsYWNlX1N0YXR1c19ub01hdGNoX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1heENoYXJzUGVyTGluZUxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5kZW50SFRNTENoZWNrYm94X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5kZW50U2l6ZUxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGlkeV9jbGVhbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpZHlfY2xlYW5lcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpZHlfY2xlYW5lc3RfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aWR5X2NsZWFuX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpZHlfY2xlYW5lcl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aWR5X2NsZWFuZXN0X3Rvb2xUaXBUZXh0OwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUmljaFRleHRSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0U2VsZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0U2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0YjdmNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotLyoqCi0gKiBNb2RlbHMgYSB0ZXh0IHNlbGVjdGlvbiBpbiBhIHJpY2ggdGV4dCBjb250cm9sIGFuZCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRTZWxlY3Rpb24gewotCi0JLy8gVGhlIGNvbnRyb2wncyB0ZXh0IHNlbGVjdGlvbi4KLQlwcm90ZWN0ZWQgU3RyaW5nIHRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGNvbnRyb2wncyB0ZXh0IHNlbGVjdGlvbiBvZmZzZXQKLQlwcm90ZWN0ZWQgaW50IG9mZnNldFN0YXJ0ID0gMDsKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBzZWxlY3Rpb24gZm9udAotCXByb3RlY3RlZCBTdHJpbmcgZm9udE5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGNvbnRyb2wncyB0ZXh0IHNlbGVjdGlvbiBmb250IHNpemUKLQkvLyBjb3VsZCBiZSBpbiBwb2ludCBzaXplICgxMnB0KSwgb3IgSFRNTCBzaXplICgxLTcpCi0JcHJvdGVjdGVkIFN0cmluZyBmb250U2l6ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgY3VycmVudCBzdHlsZQotCXByb3RlY3RlZCBTdHJpbmcgYmxvY2tTdHlsZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgY3VycmVudCBmbGFncwotCXByb3RlY3RlZCBpbnQgZmxhZ3MgPSAwOwotCi0JLy8gVGV4dCBzdGF0dXMgZmxhZ3MKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT0xEID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElUQUxJQyA9IEJPTEQgPDwgMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOREVSTElORSA9IElUQUxJQyA8PCAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VCU0NSSVBUID0gVU5ERVJMSU5FIDw8IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVVBFUlNDUklQVCA9IFNVQlNDUklQVCA8PCAxOwotCi0JcHVibGljIFN0cmluZyBnZXRCbG9ja1N0eWxlKCkgewotCQlyZXR1cm4gYmxvY2tTdHlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCbG9ja1N0eWxlKFN0cmluZyBibG9ja1N0eWxlKSB7Ci0JCXRoaXMuYmxvY2tTdHlsZSA9IGJsb2NrU3R5bGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRGbGFncygpIHsKLQkJcmV0dXJuIGZsYWdzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZsYWdzKGludCBmbGFncykgewotCQl0aGlzLmZsYWdzID0gZmxhZ3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGb250TmFtZSgpIHsKLQkJcmV0dXJuIGZvbnROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvbnROYW1lKFN0cmluZyBmb250TmFtZSkgewotCQl0aGlzLmZvbnROYW1lID0gZm9udE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGb250U2l6ZSgpIHsKLQkJcmV0dXJuIGZvbnRTaXplOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvbnRTaXplKFN0cmluZyBmb250U2l6ZSkgewotCQl0aGlzLmZvbnRTaXplID0gZm9udFNpemU7Ci0JfQotCi0JcHVibGljIGludCBnZXRPZmZzZXRTdGFydCgpIHsKLQkJcmV0dXJuIG9mZnNldFN0YXJ0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9mZnNldFN0YXJ0KGludCBvZmZzZXRTdGFydCkgewotCQl0aGlzLm9mZnNldFN0YXJ0ID0gb2Zmc2V0U3RhcnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMudGV4dCA9IHRleHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCb2xkKCkgewotCQlyZXR1cm4gKGZsYWdzICYgQk9MRCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0l0YWxpYygpIHsKLQkJcmV0dXJuIChmbGFncyAmIElUQUxJQykgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1VuZGVyTGluZSgpIHsKLQkJcmV0dXJuIChmbGFncyAmIFVOREVSTElORSkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1YnNjcmlwdCgpIHsKLQkJcmV0dXJuIChmbGFncyAmIFNVQlNDUklQVCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cGVyc2NyaXB0KCkgewotCQlyZXR1cm4gKGZsYWdzICYgU1VQRVJTQ1JJUFQpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBzZWxlY3Rpb24gaW5mbwotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJb2Zmc2V0U3RhcnQgPSAwOwotCQlmb250TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvbnRTaXplID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJYmxvY2tTdHlsZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZsYWdzID0gMDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgc3RyID0gIlRleHQ6ICIgKyB0ZXh0ICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXN0ciArPSAiZm9udE5hbWU6ICIgKyBmb250TmFtZSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzdHIgKz0gImZvbnRTaXplOiAiICsgZm9udFNpemUgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc3RyICs9ICJibG9ja1N0eWxlOiAiICsgYmxvY2tTdHlsZSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzdHIgKz0gImZsYWdzOiAiICsgZmxhZ3MgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRUb29sQmFyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0VG9vbEJhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YjBiYzYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRUb29sQmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5JUmljaFRleHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuSVJpY2hUZXh0Q29tYm9BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUmljaFRleHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IHJpY2ggdGV4dCB0b29sIGJhciBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0VG9vbEJhciBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIElSaWNoVGV4dFRvb2xCYXIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0tFWV9DT0RFID0gImxhc3RLZXlDb2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHBhcmVudCByaWNoIHRleHQgY29udHJvbC4KLQlwcml2YXRlIElSaWNoVGV4dCByaWNoVGV4dDsKLQotCS8vIElmIHRydWUsIGFkZCBhIG5ldyB0b29sIGJhci4KLQlwcml2YXRlIGJvb2xlYW4gYWRkVG9vbEJhciA9IHRydWU7Ci0KLQkvLyBUaGUgY3VycmVudCB0b29sIGJhciBtYW5hZ2VyIHVzZWQgdG8gcG9wdWxhdGUgdGhlIHRvb2wgYWN0aW9ucy4KLQlwcml2YXRlIFRvb2xCYXJNYW5hZ2VyIHRvb2xiYXJNZ3I7Ci0KLQkvLyBUaGUgYWN0aW9uIGl0ZW1zIGluIHRoZSB0b29sIGJhcihzKS4KLQlwcml2YXRlIExpc3QgYWN0aW9uSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGxhc3RXaWR0aCA9IC0xOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHRvb2wgYmFyIHN0eWxlCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIFJpY2hUZXh0VG9vbEJhcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMTAsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXN1cGVyLnNldExheW91dChsYXlvdXQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEFjdGlvbihmaW5hbCBJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFkZFRvb2xCYXIoKTsKLQkJCUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JCQl0b29sYmFyTWdyLmFkZChpdGVtKTsKLQkJCWFjdGlvbkl0ZW1zLmFkZChpdGVtKTsKLQkJCXRvb2xiYXJNZ3IudXBkYXRlKHRydWUpOwotCQkJdXBkYXRlTGFzdFdpZHRoKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgY29tYm8gYWN0aW9uIHRvIHRoZSB0b29sIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogICAgICAgICAgICB0aGUgYWN0aW9uIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFjdGlvbihmaW5hbCBJUmljaFRleHRDb21ib0FjdGlvbiBhY3Rpb24pIHsKLQkJLy8gd2UgY2FuIG9ubHkgYWRkIENvbWJvcyBiZWZvcmUgdGhlIHRvb2xiYXIgaXMgY3JlYXRlZAotCQkvLyBvdGhlcndpc2UgdGhlIGxheW91dCBnZXRzIG1lc3NlZCB1cAotCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgYWRkVG9vbEJhcikgewotCQkJQ0NvbWJvIGNvbWJvID0gbmV3IENDb21ibyh0aGlzLCBTV1QuUkVBRF9PTkxZIHwgU1dULkZMQVQKLQkJCQkJfCBTV1QuQk9SREVSKTsKLQkJCVN0cmluZ1tdIGl0ZW1zID0gYWN0aW9uLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJY29tYm8uYWRkKGl0ZW1zW2ldKTsKLQkJCX0KLQkJCWNvbWJvLnNldFZpc2libGVJdGVtQ291bnQoOCk7Ci0JCQljb21iby5zZWxlY3QoMCk7Ci0JCQljb21iby5zZXRUb29sVGlwVGV4dChhY3Rpb24uZ2V0VG9vbFRpcFRleHQoKSk7Ci0JCQljb21iby5zZXRFbmFibGVkKGFjdGlvbi5nZXRFbmFibGVkKCkpOwotCQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJU3RyaW5nIGxhc3RLZXlDb2RlID0gKFN0cmluZykgZ2V0RGF0YShMQVNUX0tFWV9DT0RFKTsKLQkJCQkJaWYgKGxhc3RLZXlDb2RlID09IG51bGwgfHwgbGFzdEtleUNvZGUuZXF1YWxzKCIiICsgU1dULkNSKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlPYmplY3QgZXZlbnRTcmMgPSBldmVudC5nZXRTb3VyY2UoKTsKLQkJCQkJCWlmIChldmVudFNyYyBpbnN0YW5jZW9mIENDb21ibykgewotCQkJCQkJCWFjdGlvbi5leGVjdXRlKHJpY2hUZXh0LCAoKENDb21ibykgZXZlbnRTcmMpCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc2V0RGF0YShMQVNUX0tFWV9DT0RFLCBudWxsKTsKLQkJCQl9OwotCQkJfSk7Ci0JCQljb21iby5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChldmVudC5rZXlDb2RlID09IFNXVC5DUikgewotCQkJCQkJT2JqZWN0IGV2ZW50U3JjID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQkJCQlpZiAoZXZlbnRTcmMgaW5zdGFuY2VvZiBDQ29tYm8pIHsKLQkJCQkJCQlhY3Rpb24uZXhlY3V0ZShyaWNoVGV4dCwgKChDQ29tYm8pIGV2ZW50U3JjKQotCQkJCQkJCQkJLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNldERhdGEoTEFTVF9LRVlfQ09ERSwgIiIgKyBldmVudC5rZXlDb2RlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX07Ci0JCQl9KTsKLQkJCWFjdGlvbi5zZXRDb21ibyhjb21ibyk7Ci0JCQlhY3Rpb25JdGVtcy5hZGQoY29tYm8pOwotCQkJdXBkYXRlTGFzdFdpZHRoKCk7Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBBZGRzIGEgc2VwYXJhdG9yIHRvIHRoZSB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXBhcmF0b3IoKSB7Ci0JCWFkZFRvb2xCYXIoKTsKLQkJdG9vbGJhck1nci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJdXBkYXRlTGFzdFdpZHRoKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgdG9vbGJhciBzdGF0ZS4KLQkgKiA8cD4KLQkgKiBFbmFibGVzL2Rpc2FibGVzIGFjdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLQkgKiBSaWNoVGV4dEVkaXRvciB0YWIgKFJpY2hUZXh0IHZzLiBIVE1MKQotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZQotCSAqICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlIG5vbi1SZWFkT25seSBjb21tYW5kcwotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xCYXIoYm9vbGVhbiBlZGl0YWJsZSkgewotCQlib29sZWFuIHJpY2hUZXh0TW9kZSA9IHRydWU7Ci0JCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yCi0JCQkJJiYgKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpLmlzSFRNTFRhYlNlbGVjdGVkKCkpIHsKLQkJCXJpY2hUZXh0TW9kZSA9IGZhbHNlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGFjdGlvbkl0ZW1zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0ZW0gPSBpLm5leHQoKTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgVG9vbEl0ZW0pIHsKLQkJCQlib29sZWFuIGVuYWJsZWRUb29sSXRlbSA9IHRydWU7Ci0JCQkJVG9vbEl0ZW0gdG9vbEl0ZW0gPSAoVG9vbEl0ZW0pIGl0ZW07Ci0JCQkJSVJpY2hUZXh0QWN0aW9uIGFjdGlvbiA9IChJUmljaFRleHRBY3Rpb24pIHRvb2xJdGVtLmdldERhdGEoKTsKLQkJCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgIWVkaXRhYmxlCi0JCQkJCQkmJiBhY3Rpb24uZGlzYWJsZUluUmVhZE9ubHlNb2RlKCkpIHsKLQkJCQkJZW5hYmxlZFRvb2xJdGVtID0gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChhY3Rpb24gIT0gbnVsbCAmJiAhcmljaFRleHRNb2RlCi0JCQkJCQkmJiBhY3Rpb24uZGlzYWJsZUluU291cmNlTW9kZSgpKSB7Ci0JCQkJCWVuYWJsZWRUb29sSXRlbSA9IGZhbHNlOwotCQkJCX0KLQkJCQl0b29sSXRlbS5zZXRFbmFibGVkKGVuYWJsZWRUb29sSXRlbSk7Ci0JCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb21ibykgewotCQkJCWlmIChyaWNoVGV4dE1vZGUgJiYgZWRpdGFibGUpIHsKLQkJCQkJKChDb21ibykgaXRlbSkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkoKENvbWJvKSBpdGVtKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7Ci0JCQkJYm9vbGVhbiBlbmFibGVkVG9vbEl0ZW0gPSB0cnVlOwotCQkJCVJpY2hUZXh0QWN0aW9uIGFjdGlvbiA9IChSaWNoVGV4dEFjdGlvbikoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0paXRlbSkuZ2V0QWN0aW9uKCk7Ci0JCQkJaWYgKGFjdGlvbiAhPSBudWxsICYmICFlZGl0YWJsZQotCQkJCQkJJiYgYWN0aW9uLmRpc2FibGVJblJlYWRPbmx5TW9kZSgpKSB7Ci0JCQkJCWVuYWJsZWRUb29sSXRlbSA9IGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgIXJpY2hUZXh0TW9kZQotCQkJCQkJJiYgYWN0aW9uLmRpc2FibGVJblNvdXJjZU1vZGUoKSkgewotCQkJCQllbmFibGVkVG9vbEl0ZW0gPSBmYWxzZTsKLQkJCQl9Ci0JCQkJYWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZFRvb2xJdGVtKTsKLQkJCX0KLQkJfQotCQl1cGRhdGVMYXN0V2lkdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgdG9vbCBiYXIsIGlmIG5lY2Vzc2FyeSwgdG8gY29udGFpbiBhIGJ1dHRvbiBhY3Rpb24gb3Igc2VwYXJhdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRvb2xCYXIoKSB7Ci0JCWlmIChhZGRUb29sQmFyKSB7Ci0JCQl0b29sYmFyTWdyID0gbmV3IFRvb2xCYXJNYW5hZ2VyKGdldFN0eWxlKCkpOwotCQkJdG9vbGJhck1nci5jcmVhdGVDb250cm9sKHRoaXMpOwotCQkJYWRkVG9vbEJhciA9IGZhbHNlOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVMYXN0V2lkdGgoKSB7Ci0JCWxhc3RXaWR0aCA9IGNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSkueDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGFzdFdpZHRoKCkgewotCQlyZXR1cm4gbGFzdFdpZHRoOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZEltYWdlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkSW1hZ2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjEwMjkyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkSW1hZ2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQWRkSW1hZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEFkZHMgYW4gaW1hZ2UgdG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRJbWFnZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFkZEltYWdlQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19BRERfSU1BR0UpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19BRERfSU1BR0UpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRJbWFnZUFjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCUFkZEltYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRJbWFnZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJU3RyaW5nIGltYWdlVVJMID0gZGlhbG9nLmdldEltYWdlKCkuZ2V0VVJMKCk7Ci0JCQkJaWYgKGltYWdlVVJMLmxlbmd0aCgpID4gMCkgewotCQkJCQlyaWNoVGV4dAotCQkJCQkJCS5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0lNQUdFLCBpbWFnZVVSTCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRMaW5lQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkTGluZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1N2NhZGE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRMaW5lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIEFkZHMgYSBob3Jpem9udGFsIGJhciB0byBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZExpbmVBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBZGRMaW5lQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19BRERfTElORSk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZExpbmVBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0xJTkUpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZExpbmtBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRMaW5rQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjNjhlYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZExpbmtBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQWRkTGlua0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQWRkcyBhIGxpbmsgdG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRMaW5rQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQWRkTGlua0FjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX0xJTkspOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19BRERfTElOSyk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZExpbmtBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlBZGRMaW5rRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRMaW5rRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCByaWNoVGV4dC5nZXRCYXNlUGF0aCgpKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlTdHJpbmcgbGlua1VSTCA9IGRpYWxvZy5nZXRMaW5rKCkuZ2V0VVJMKCk7Ci0JCQkJaWYgKGxpbmtVUkwubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5BRERfTElOSywgbGlua1VSTCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkT3JkZXJlZExpc3RBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRPcmRlcmVkTGlzdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZTQyYTAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRPcmRlcmVkTGlzdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBBZGRzIGFuIG9yZGVyZWQgbGlzdCB0byBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZE9yZGVyZWRMaXN0QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQWRkT3JkZXJlZExpc3RBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0FERF9PUkRFUkVEX0xJU1QpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19BRERfT1JERVJFRF9MSVNUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuYWRkT3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5BRERfT1JERVJFRF9MSVNUKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZFRhYmxlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVGFibGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTk2NzE2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVGFibGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQWRkVGFibGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEFkZHMgYSB0YWJsZSB0byBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZFRhYmxlQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQWRkVGFibGVBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0FERF9UQUJMRSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0FERF9UQUJMRSk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZFRhYmxlQWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlBZGRUYWJsZURpYWxvZyBkaWFsb2cgPSBuZXcgQWRkVGFibGVEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJLmdldEFjdGl2ZVNoZWxsKCkpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCVRhYmxlIHRhYmxlID0gZGlhbG9nLmdldFRhYmxlKCk7Ci0JCQkJaW50IHJvd3MgPSB0YWJsZS5nZXRSb3dzKCk7Ci0JCQkJaW50IGNvbHMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCQkJU3RyaW5nIHdpZHRoID0gdGFibGUuZ2V0V2lkdGgoKTsKLQkJCQlpbnQgdGFibGVoZWFkZXJzID0gdGFibGUuZ2V0VGFibGVIZWFkZXJzKCk7Ci0JCQkJU3RyaW5nIHN1bW1hcnkgPSB0YWJsZS5nZXRTdW1tYXJ5KCk7Ci0JCQkJU3RyaW5nIGNhcHRpb24gPSB0YWJsZS5nZXRDYXB0aW9uKCk7Ci0JCQkJaWYgKHJvd3MgPiAwICYmIGNvbHMgPiAwKSB7Ci0JCQkJCXJpY2hUZXh0Ci0JCQkJCQkJLmV4ZWN1dGVDb21tYW5kKAotCQkJCQkJCQkJUmljaFRleHRDb21tYW5kLkFERF9UQUJMRSwKLQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJCQkJCSIiICsgcm93cywgIiIgKyBjb2xzLCAiIiArIHdpZHRoLCBzdW1tYXJ5LCBjYXB0aW9uLCAiIiArIHRhYmxlaGVhZGVycyB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRVbm9yZGVyZWRMaXN0QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVW5vcmRlcmVkTGlzdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MmIwNTU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRVbm9yZGVyZWRMaXN0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIEFkZHMgYW4gdW5vcmRlcmVkIGxpc3QgdG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRVbm9yZGVyZWRMaXN0QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQWRkVW5vcmRlcmVkTGlzdEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX1VOT1JERVJFRF9MSVNUKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQUREX1VOT1JERVJFRF9MSVNUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuYWRkVW5vcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9VTk9SREVSRURfTElTVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CYXNlUmljaFRleHRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CYXNlUmljaFRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGVkNTczNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQmFzZVJpY2hUZXh0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIHJpY2ggdGV4dCBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVJpY2hUZXh0QWN0aW9uIGltcGxlbWVudHMgSUJhc2VSaWNoVGV4dEFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvb2xUaXBUZXh0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBCYXNlUmljaFRleHRBY3Rpb24oKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG9vbCB0aXAgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgdG9vbCB0aXAgdGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiB0b29sVGlwVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sIHRpcCBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFRpcFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0b29sIHRpcCB0ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRvb2xUaXBUZXh0KSB7Ci0JCXRoaXMudG9vbFRpcFRleHQgPSB0b29sVGlwVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmFibGVkIHN0YXR1cyBvZiB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZW5hYmxlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEVuYWJsZWQoKSB7Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGVuYWJsZSB0aGUgYWN0aW9uLiBpZgotCSAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBkaXNhYmxlIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQmxvY2tUYWdBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CbG9ja1RhZ0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4M2FlNTRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CbG9ja1RhZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLkJsb2NrVGFnOwotCi0vKioKLSAqIFNldHMgdGhlIGZvbnQgbmFtZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCbG9ja1RhZ0FjdGlvbiBleHRlbmRzIFJpY2hUZXh0Q29tYm9BY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQmxvY2tUYWdBY3Rpb24oKSB7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JCWFkZEl0ZW0oQmxvY2tUYWcuUEFSQUdSQVBILmdldE5hbWUoKSk7Ci0JCWFkZEl0ZW0oQmxvY2tUYWcuSEVBRElOR18xLmdldE5hbWUoKSk7Ci0JCWFkZEl0ZW0oQmxvY2tUYWcuSEVBRElOR18yLmdldE5hbWUoKSk7Ci0JCWFkZEl0ZW0oQmxvY2tUYWcuSEVBRElOR18zLmdldE5hbWUoKSk7Ci0JCWFkZEl0ZW0oQmxvY2tUYWcuSEVBRElOR180LmdldE5hbWUoKSk7Ci0JCWFkZEl0ZW0oQmxvY2tUYWcuSEVBRElOR181LmdldE5hbWUoKSk7Ci0JCWFkZEl0ZW0oQmxvY2tUYWcuSEVBRElOR182LmdldE5hbWUoKSk7Ci0JCWFkZEl0ZW0oQmxvY2tUYWcuQUREUkVTUy5nZXROYW1lKCkpOwotCQlhZGRJdGVtKEJsb2NrVGFnLlBSRUZPUk1BVFRFRF9URVhULmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IEJsb2NrVGFnLmdldEJsb2NrVGFnKGluZGV4KS5nZXRWYWx1ZSgpOwotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkZPUk1BVF9CTE9DSywgdmFsdWUpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0JvbGRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Cb2xkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3YmM2NDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0JvbGRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSAnYm9sZCcgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQm9sZEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEJvbGRBY3Rpb24oZmluYWwgSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19CT0xEKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQk9MRCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmJvbGRBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQkJLy8gYWRkIGxpc3RlbmVyCi0JCXJpY2hUZXh0LmFkZExpc3RlbmVyKFNXVC5TRUxFQ1RFRCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDaGVja2VkKHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuaXNCb2xkKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQk9MRCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ2xlYXJDb250ZW50QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ2xlYXJDb250ZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlODM1MDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0NsZWFyQ29udGVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogQ2xlYXJzIHRoZSBjb250ZW50IG9mIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2xlYXJDb250ZW50QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ2xlYXJDb250ZW50QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19DTEVBUl9DT05URU5UKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQ0xFQVJfQ09OVEVOVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmNsZWFyQ29udGVudEFjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBzIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWlmIChSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheVByb21wdCgKLQkJCQkJUmljaFRleHRSZXNvdXJjZXMuY2xlYXJDb250ZW50RGlhbG9nX3RpdGxlLAotCQkJCQlSaWNoVGV4dFJlc291cmNlcy5jbGVhckNvbnRlbnREaWFsb2dfdGV4dCkpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQ0xFQVJfQ09OVEVOVCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Db3B5QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ29weUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZmYyZjZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Db3B5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci0KLS8qKgotICogQ29waWVzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wgdG8gdGhlIGNsaXBib2FyZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29weUFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQ09QWSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0NPUFkpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5jb3B5QWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotCSAqIHJpY2ggdGV4dCBlZGl0b3IgaXMgaW4gcmVhZG9ubHkgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5SZWFkT25seU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHNvdXJjZSBlZGl0IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yCi0JCQkJCSYmICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5pc0hUTUxUYWJTZWxlY3RlZCgpKSB7Ci0JCQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpLmdldFNvdXJjZUVkaXQoKTsKLQkJCQlzdHlsZWRUZXh0LmNvcHkoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmljaFRleHQuc2V0Q29weVVSTCgpOwotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5DT1BZKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0N1dEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0N1dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODI4ODgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9DdXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLQotLyoqCi0gKiBDdXRzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIHRoZSByaWNoIHRleHQgY29udHJvbCB0byB0aGUgY2xpcGJvYXJkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEN1dEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEN1dEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQ1VUKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQ1VUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuY3V0QWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHNvdXJjZSBlZGl0IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yCi0JCQkJCSYmICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5pc0hUTUxUYWJTZWxlY3RlZCgpKSB7Ci0JCQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpCi0JCQkJCQkuZ2V0U291cmNlRWRpdCgpOwotCQkJCXN0eWxlZFRleHQuY3V0KCk7Ci0JCQl9IGVsc2UgewotCQkJCXJpY2hUZXh0LnNldENvcHlVUkwoKTsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQ1VUKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9GaW5kUmVwbGFjZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZpbmRSZXBsYWNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJhZTM1ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZpbmRSZXBsYWNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncy5GaW5kUmVwbGFjZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogRmluZHMgYW5kIHJlcGxhY2VzIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGaW5kUmVwbGFjZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIEZpbmRzIHRleHQgc3ViIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5EX1RFWFQgPSAxOwotCi0JLyoqCi0JICogUmVwbGFjZXMgdGV4dCBzdWIgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VfVEVYVCA9IDI7Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyBhbmQgZmluZHMgdGV4dCBzdWIgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VfRklORF9URVhUID0gMzsKLQotCS8qKgotCSAqIFJlcGxhY2VzIGFsbCBzdWIgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VfQUxMX1RFWFQgPSA0OwotCi0JLyoqCi0JICogRmluZCBtYXRjaCBpbiBhIGZvcndhcmQgZGlyZWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUldBUkRfTUFUQ0ggPSAxOwotCi0JLyoqCi0JICogRmluZCBtYXRjaCBpbiBhIGJhY2t3YXJkIGRpcmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQUNLV0FSRF9NQVRDSCA9IC0xOwotCi0JLyoqCi0JICogV2hvbGUgd29yZCBtYXRjaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSE9MRV9XT1JEX01BVENIID0gMjsKLQotCS8qKgotCSAqIENhc2Ugc2Vuc2l0aXZlIG1hdGNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBU0VfU0VOU0lUSVZFX01BVENIID0gNDsKLQotCS8vIEVuY29kZWQgc2luZ2xlIHF1b3RlLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPREVEX1NJTkdMRV9RVU9URSA9ICIlc3ElIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJUmljaFRleHQgcmljaFRleHQ7Ci0KLQlwcml2YXRlIFN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQotCXByb3RlY3RlZCBib29sZWFuIGZvdW5kTWF0Y2ggPSBmYWxzZTsKLQkKLQkvLyB0aGUgZGlhbG9nIGluc3RhbmNlCi0JcHJvdGVjdGVkIEZpbmRSZXBsYWNlRGlhbG9nIGRpYWxvZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEZpbmRSZXBsYWNlQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19GSU5EX1JFUExBQ0UpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19GSU5EX1JFUExBQ0UpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5maW5kUmVwbGFjZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHJlYWRvbmx5IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluUmVhZE9ubHlNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHNvdXJjZSBlZGl0IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHRoaXMucmljaFRleHQgPT0gbnVsbCkKLQkJCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQkJaWYgKHRoaXMucmljaFRleHQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZGlhbG9nICE9IG51bGwpIHsKLQkJCQkJZGlhbG9nLnNldEZpbmRPbmx5KCF0aGlzLnJpY2hUZXh0LmdldEVkaXRhYmxlKCkpOwotCQkJCQlkaWFsb2cub3BlbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRpYWxvZyA9IG5ldyBGaW5kUmVwbGFjZURpYWxvZyhEaXNwbGF5Ci0JCQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0aGlzLCAhdGhpcy5yaWNoVGV4dAotCQkJCQkJCS5nZXRFZGl0YWJsZSgpKTsKLQkJCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBtYXRjaCBpcyBmb3VuZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbWF0Y2ggaXMgZm91bmQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Rm91bmRNYXRjaCgpIHsKLQkJcmV0dXJuIGZvdW5kTWF0Y2g7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc3ViQWN0aW9uCi0JICogICAgICAgICAgICB0aGUgc3ViIGFjdGlvbiB0byBleGVjdXRlCi0JICogQHBhcmFtIGZpbmRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZmluZCB0ZXh0Ci0JICogQHBhcmFtIHJlcGxhY2VUZXh0Ci0JICogICAgICAgICAgICB0aGUgcmVwbGFjZSB0ZXh0Ci0JICogQHBhcmFtIG1hdGNoRGlyCi0JICogICAgICAgICAgICB0aGUgbWF0Y2ggZGlyZWN0aW9uOyB0aGUgdmFsdWUgY2FuIGVpdGhlciBiZQotCSAqICAgICAgICAgICAgPGNvZGU+RklORF9GT1JXQVJEPC9jb2RlPiBvciA8Y29kZT5GSU5EX0JBQ0tXQVJEPC9jb2RlPi4KLQkgKiBAcGFyYW0gbWF0Y2hPcHRpb25zCi0JICogICAgICAgICAgICB0aGUgbWF0Y2ggb3B0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihpbnQgc3ViQWN0aW9uLCBTdHJpbmcgZmluZFRleHQsIFN0cmluZyByZXBsYWNlVGV4dCwKLQkJCWludCBtYXRjaERpciwgaW50IG1hdGNoT3B0aW9ucykgewotCQlzdHlsZWRUZXh0ID0gbnVsbDsKLQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IKLQkJCQkmJiAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuaXNIVE1MVGFiU2VsZWN0ZWQoKSkgewotCQkJc3R5bGVkVGV4dCA9ICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5nZXRTb3VyY2VFZGl0KCk7Ci0JCX0KLQkJaWYgKHN0eWxlZFRleHQgPT0gbnVsbCkgewotCQkJaWYgKGZpbmRUZXh0LmluZGV4T2YoIiciKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZmluZFRleHQgPSBmaW5kVGV4dC5yZXBsYWNlQWxsKCInIiwgRU5DT0RFRF9TSU5HTEVfUVVPVEUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAocmVwbGFjZVRleHQuaW5kZXhPZigiJyIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXBsYWNlVGV4dCA9IHJlcGxhY2VUZXh0LnJlcGxhY2VBbGwoIiciLCBFTkNPREVEX1NJTkdMRV9RVU9URSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJZm91bmRNYXRjaCA9IGZhbHNlOwotCQkJaW50IHN0YXR1cyA9IDA7Ci0JCQlzd2l0Y2ggKHN1YkFjdGlvbikgewotCQkJY2FzZSBGSU5EX1RFWFQ6Ci0JCQkJc3RhdHVzID0gZmluZFRleHQoZmluZFRleHQsIG1hdGNoRGlyLCBtYXRjaE9wdGlvbnMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRVBMQUNFX1RFWFQ6Ci0JCQkJc3RhdHVzID0gcmVwbGFjZVRleHQocmVwbGFjZVRleHQsIG1hdGNoRGlyLCBtYXRjaE9wdGlvbnMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRVBMQUNFX0ZJTkRfVEVYVDoKLQkJCQlzdGF0dXMgPSByZXBsYWNlRmluZFRleHQoZmluZFRleHQsIHJlcGxhY2VUZXh0LCBtYXRjaERpciwKLQkJCQkJCW1hdGNoT3B0aW9ucyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFUExBQ0VfQUxMX1RFWFQ6Ci0JCQkJcmVwbGFjZUFsbChmaW5kVGV4dCwgcmVwbGFjZVRleHQsIG1hdGNoT3B0aW9ucyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoc3RhdHVzID4gMCkKLQkJCQlmb3VuZE1hdGNoID0gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEVzY2FwZXMgdGhlIGdpdmVuIHRleHQuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYmUgZXNjYXBlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgdGV4dFNpemUgPSB0ZXh0Lmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHRTaXplOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJzwnOgotCQkJCXNiLmFwcGVuZChYTUxVdGlsLlhNTF9MVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc+JzoKLQkJCQlzYi5hcHBlbmQoWE1MVXRpbC5YTUxfR1QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnJic6Ci0JCQkJc2IuYXBwZW5kKFhNTFV0aWwuWE1MX0FNUCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZmluZFRleHQoU3RyaW5nIGZpbmRUZXh0LCBpbnQgbWF0Y2hEaXIsIGludCBtYXRjaE9wdGlvbnMpIHsKLQkJaW50IHN0YXR1cyA9IDA7Ci0JCWlmIChzdHlsZWRUZXh0ICE9IG51bGwpIHsKLQkJCXN0YXR1cyA9IHN0eWxlZFRleHRGaW5kVGV4dEFuZFNlbGVjdChmaW5kVGV4dCwgbWF0Y2hEaXIsCi0JCQkJCW1hdGNoT3B0aW9ucyk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0dXMgPSByaWNoVGV4dAotCQkJCQkuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkZJTkRfVEVYVCwgbmV3IFN0cmluZ1tdIHsKLQkJCQkJCQlmaW5kVGV4dCwgIiIgKyBtYXRjaERpciwgIiIgKyBtYXRjaE9wdGlvbnMgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQkKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByaXZhdGUgaW50IHJlcGxhY2VUZXh0KFN0cmluZyByZXBsYWNlVGV4dCwgaW50IG1hdGNoRGlyLCBpbnQgbWF0Y2hPcHRpb25zKSB7Ci0JCWludCBzdGF0dXMgPSAwOwotCQlpZiAoc3R5bGVkVGV4dCAhPSBudWxsKSB7Ci0JCQlzdGF0dXMgPSBzdHlsZWRUZXh0UmVwbGFjZVRleHRBbmRTZWxlY3QocmVwbGFjZVRleHQpOwotCQl9IGVsc2UgewotCQkJc3RhdHVzID0gcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlJFUExBQ0VfVEVYVCwKLQkJCQkJbmV3IFN0cmluZ1tdIHsgcmVwbGFjZVRleHQsCi0JCQkJCQkJIiIgKyBtYXRjaERpciwgIiIgKyBtYXRjaE9wdGlvbnMgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQkJCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIGludCByZXBsYWNlRmluZFRleHQoU3RyaW5nIGZpbmRUZXh0LCBTdHJpbmcgcmVwbGFjZVRleHQsCi0JCQlpbnQgbWF0Y2hEaXIsIGludCBtYXRjaE9wdGlvbnMpIHsKLQkJaW50IHN0YXR1cyA9IDA7Ci0JCWlmIChzdHlsZWRUZXh0ICE9IG51bGwpIHsKLQkJCXN0eWxlZFRleHRSZXBsYWNlVGV4dEFuZFNlbGVjdChyZXBsYWNlVGV4dCk7Ci0JCQlzdGF0dXMgPSBzdHlsZWRUZXh0RmluZFRleHRBbmRTZWxlY3QoZmluZFRleHQsIG1hdGNoRGlyLAotCQkJCQltYXRjaE9wdGlvbnMpOwotCQl9IGVsc2UgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlJFUExBQ0VfVEVYVCwgbmV3IFN0cmluZ1tdIHsKLQkJCQkJcmVwbGFjZVRleHQsICIiICsgbWF0Y2hEaXIsICIiICsgbWF0Y2hPcHRpb25zIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXN0YXR1cyA9IHJpY2hUZXh0Ci0JCQkJCS5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuRklORF9URVhULCBuZXcgU3RyaW5nW10gewotCQkJCQkJCWZpbmRUZXh0LCAiIiArIG1hdGNoRGlyLCAiIiArIG1hdGNoT3B0aW9ucyB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVwbGFjZUFsbChTdHJpbmcgZmluZFRleHQsIFN0cmluZyByZXBsYWNlVGV4dCwKLQkJCWludCBtYXRjaE9wdGlvbnMpIHsKLQkJaWYgKHN0eWxlZFRleHQgIT0gbnVsbCkgewotCQkJc3R5bGVkVGV4dFJlcGxhY2VBbGwoZmluZFRleHQsIHJlcGxhY2VUZXh0LCBtYXRjaE9wdGlvbnMpOwotCQl9IGVsc2UgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlJFUExBQ0VfQUxMX1RFWFQsCi0JCQkJCW5ldyBTdHJpbmdbXSB7IGVzY2FwZShmaW5kVGV4dCksIGVzY2FwZShyZXBsYWNlVGV4dCksCi0JCQkJCQkJIiIgKyBtYXRjaE9wdGlvbnMgfSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IHN0eWxlZFRleHRGaW5kVGV4dEFuZFNlbGVjdChTdHJpbmcgZmluZFRleHQsIGludCBtYXRjaERpciwKLQkJCWludCBtYXRjaE9wdGlvbnMpIHsKLQkJUG9pbnQgc2VsZWN0aW9uT2Zmc2V0ID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpOwotCQlpbnQgZmlyc3RTZWxlY3RlZE9mZnNldCA9IHNlbGVjdGlvbk9mZnNldC54OwotCQlpbnQgbGFzdFNlbGVjdGVkT2Zmc2V0ID0gc2VsZWN0aW9uT2Zmc2V0LnggKyBzZWxlY3Rpb25PZmZzZXQueSAtIDE7Ci0JCVN0cmluZyBodG1sVGV4dCA9IHN0eWxlZFRleHQuZ2V0VGV4dCgpOwotCQlpbnQgaW5kZXhPZk1hdGNoID0gLTE7Ci0JCWlmICgobWF0Y2hPcHRpb25zICYgQ0FTRV9TRU5TSVRJVkVfTUFUQ0gpID09IDApIHsKLQkJCS8vIFRPRE86IHVzZSB0b1VwcGVyQ2FzZShMb2NhbGUpIG9uY2UgbGlicmFyeSBoYXMgbG9jYWxlIGF0dHJpYnV0ZQotCQkJaHRtbFRleHQgPSBodG1sVGV4dC50b1VwcGVyQ2FzZSgpOwotCQkJZmluZFRleHQgPSBmaW5kVGV4dC50b1VwcGVyQ2FzZSgpOwotCQl9Ci0JCWRvIHsKLQkJCWlmIChpbmRleE9mTWF0Y2ggIT0gLTEpIHsKLQkJCQlsYXN0U2VsZWN0ZWRPZmZzZXQgPSBpbmRleE9mTWF0Y2ggKyAxOwotCQkJCWZpcnN0U2VsZWN0ZWRPZmZzZXQgPSBpbmRleE9mTWF0Y2ggLSAxOwotCQkJfQotCQkJaWYgKG1hdGNoRGlyID09IEZPUldBUkRfTUFUQ0gpIHsKLQkJCQlpbmRleE9mTWF0Y2ggPSBodG1sVGV4dC5pbmRleE9mKGZpbmRUZXh0LAotCQkJCQkJbGFzdFNlbGVjdGVkT2Zmc2V0ICsgMSk7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4T2ZNYXRjaCA9IGh0bWxUZXh0Lmxhc3RJbmRleE9mKGZpbmRUZXh0LAotCQkJCQkJZmlyc3RTZWxlY3RlZE9mZnNldCAtIDEpOwotCQkJfQotCQl9IHdoaWxlIChpbmRleE9mTWF0Y2ggIT0gLTEKLQkJCQkmJiAoKG1hdGNoT3B0aW9ucyAmIFdIT0xFX1dPUkRfTUFUQ0gpID09IFdIT0xFX1dPUkRfTUFUQ0gpCi0JCQkJJiYgaXNQYXJ0T2ZXb3JkKGh0bWxUZXh0LCBpbmRleE9mTWF0Y2gsIGZpbmRUZXh0Lmxlbmd0aCgpKSk7Ci0JCWlmIChpbmRleE9mTWF0Y2ggIT0gLTEpIHsKLQkJCXN0eWxlZFRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoaW5kZXhPZk1hdGNoLCBmaW5kVGV4dC5sZW5ndGgoKSk7Ci0JCQlzdHlsZWRUZXh0LnNob3dTZWxlY3Rpb24oKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBzZWxlY3RlZFRleHQgPSBzdHlsZWRUZXh0LmdldFNlbGVjdGlvblRleHQoKTsKLQkJCWlmICgobWF0Y2hPcHRpb25zICYgQ0FTRV9TRU5TSVRJVkVfTUFUQ0gpID09IDApIHsKLQkJCQlzZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJCWlmIChzZWxlY3RlZFRleHQuZXF1YWxzKGZpbmRUZXh0KSkgewotCQkJCWluZGV4T2ZNYXRjaCA9IHN0eWxlZFRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54OwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRleE9mTWF0Y2g7Ci0KLQl9Ci0KLQlwcml2YXRlIGludCBzdHlsZWRUZXh0UmVwbGFjZVRleHRBbmRTZWxlY3QoU3RyaW5nIHJlcGxhY2VUZXh0KSB7Ci0JCVBvaW50IHNlbGVjdGlvbk9mZnNldCA9IHN0eWxlZFRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQkJc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKHNlbGVjdGlvbk9mZnNldC54LCBzZWxlY3Rpb25PZmZzZXQueSwKLQkJCQlyZXBsYWNlVGV4dCk7Ci0JCXN0eWxlZFRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uT2Zmc2V0LngsIHJlcGxhY2VUZXh0Lmxlbmd0aCgpKTsKLQotCQlyZXR1cm4gMTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3R5bGVkVGV4dFJlcGxhY2VBbGwoU3RyaW5nIGZpbmRUZXh0LCBTdHJpbmcgcmVwbGFjZVRleHQsCi0JCQlpbnQgbWF0Y2hPcHRpb25zKSB7Ci0JCXN0eWxlZFRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7Ci0JCXdoaWxlIChzdHlsZWRUZXh0RmluZFRleHRBbmRTZWxlY3QoZmluZFRleHQsIEZPUldBUkRfTUFUQ0gsCi0JCQkJbWF0Y2hPcHRpb25zKSAhPSAtMSkgewotCQkJc3R5bGVkVGV4dFJlcGxhY2VUZXh0QW5kU2VsZWN0KHJlcGxhY2VUZXh0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1dvcmRDaGFyKGNoYXIgYykgewotCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFydE9mV29yZChTdHJpbmcgdGV4dCwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChpbmRleCA+IDApCi0JCQlpZiAoaXNXb3JkQ2hhcih0ZXh0LmNoYXJBdChpbmRleCAtIDEpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHRleHQubGVuZ3RoKCkgPj0gaW5kZXggKyBsZW5ndGgpCi0JCQlpZiAoaXNXb3JkQ2hhcih0ZXh0LmNoYXJBdChpbmRleCArIGxlbmd0aCkpKQotCQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElSaWNoVGV4dCBnZXRSaWNoVGV4dCgpIHsKLQkJcmV0dXJuIHJpY2hUZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJpY2hUZXh0KElSaWNoVGV4dCByaWNoVGV4dCkgewotCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChkaWFsb2cgIT0gbnVsbCkgewotCQkJZGlhbG9nLmNsb3NlKCk7Ci0JCQlkaWFsb2cgPSBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRm9udE5hbWVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250TmFtZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDkyZjRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250TmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBTZXRzIHRoZSBmb250IG5hbWUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250TmFtZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0Q29tYm9BY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRm9udE5hbWVBY3Rpb24oZmluYWwgSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJLy8gZ2V0IHN5c3RlbSBmb250cwotCQlTb3J0ZWRTZXQgZm9udFNldCA9IG5ldyBUcmVlU2V0KCk7Ci0JCUZvbnREYXRhW10gZm9udHMgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRGb250TGlzdChudWxsLCB0cnVlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb250cy5sZW5ndGg7IGkrKykgewotCQkJZm9udFNldC5hZGQoKChGb250RGF0YSkgZm9udHNbaV0pLmdldE5hbWUoKSk7Ci0JCX0KLQkJYWRkSXRlbShSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZUFjdGlvbl9EZWZhdWx0Rm9udE5hbWUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmb250U2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGZvbnROYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlhZGRJdGVtKGZvbnROYW1lKTsKLQkJfQotCQkvLyBhZGQgbGlzdGVuZXIKLQkJcmljaFRleHQuYWRkTGlzdGVuZXIoU1dULlNFTEVDVEVELCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVN0cmluZyBmb250TmFtZSA9IHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuZ2V0Rm9udE5hbWUoKTsKLQkJCQlpZiAoZm9udE5hbWUKLQkJCQkJCS5lcXVhbHMoUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVBY3Rpb25fQ1NTX0RlZmF1bHQpCi0JCQkJCQl8fCBmb250TmFtZQotCQkJCQkJCQkuZXF1YWxzKFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lQWN0aW9uX0NTU19EZWZhdWx0X01vemlsbGEpCi0JCQkJCQl8fCBmb250TmFtZS5lcXVhbHMoImRlZmF1bHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWZvbnROYW1lID0gUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVBY3Rpb25fRGVmYXVsdEZvbnROYW1lOwotCQkJCX0KLQkJCQlpbnQgaW5kZXggPSBmaW5kRm9udE5hbWVJbkl0ZW1zKGZvbnROYW1lKTsKLQkJCQljb21iby5zZWxlY3QoaW5kZXgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIGludCBmaW5kRm9udE5hbWVJbkl0ZW1zKFN0cmluZyBmb250TmFtZSkgewotCQlpbnQgaW5kZXggPSAtMTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgZm9udCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJaW5kZXgrKzsKLQkJCWlmIChmb250LmVxdWFsc0lnbm9yZUNhc2UoZm9udE5hbWUpKSB7Ci0JCQkJcmV0dXJuIGluZGV4OwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQsIGludCBpbmRleCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgaXRlbXMuZ2V0KGluZGV4KTsKLQkJCWlmICh2YWx1ZS5lcXVhbHMoUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVBY3Rpb25fRGVmYXVsdEZvbnROYW1lKSkgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9OVF9OQU1FLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9GT05UX05BTUUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250U2l6ZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZvbnRTaXplQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzZWQ3NjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZvbnRTaXplQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBTZXRzIHRoZSBmb250IHNpemUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250U2l6ZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0Q29tYm9BY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRm9udFNpemVBY3Rpb24oZmluYWwgSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJYWRkSXRlbSgiRGVmYXVsdCIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEl0ZW0oIjEiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRJdGVtKCIyIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkSXRlbSgiMyIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEl0ZW0oIjQiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRJdGVtKCI1Iik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkSXRlbSgiNiIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEl0ZW0oIjciKTsgLy8kTk9OLU5MUy0xJAkJCi0JCS8vIGFkZCBsaXN0ZW5lcgotCQlyaWNoVGV4dC5hZGRMaXN0ZW5lcihTV1QuU0VMRUNURUQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gbW96aWxsYSByZXR1cm5zICJkZWZhdWx0IiBpZiBubyBzaXplIGlzIGFwcGxpZWQKLQkJCQkvLyBJRSByZXR1cm5zIDIgaWYgbm8gc2l6ZSBpcyBhcHBsaWVkCi0JCQkJU3RyaW5nIGZvbnRTaXplID0gcmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5nZXRGb250U2l6ZSgpOwotCQkJCWludCBpbmRleCA9IC0xOwotCQkJCWlmIChmb250U2l6ZS5lcXVhbHMoImRlZmF1bHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWluZGV4ID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQl0cnkgewotCQkJCQkJaW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KGZvbnRTaXplKTsKLQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGxlYXZlIGluZGV4IGF0IC0xIHNvIG5vdGhpbmcgaXMgc2VsZWN0ZWQKLQkJCQkJfQotCQkJCX0KLQkJCQljb21iby5zZWxlY3QoaW5kZXgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQsIGludCBpbmRleCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJaWYgKGluZGV4ID09IDApIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0ZPTlRfU0laRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9OVF9TSVpFLAotCQkJCQkJIiIgKyAoaW5kZXgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZvbnRTdHlsZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZvbnRTdHlsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYjdjMDAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250U3R5bGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogU2V0cyB0aGUgZm9udCBzdHlsZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZvbnRTdHlsZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0Q29tYm9BY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRm9udFN0eWxlQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5mb250U3R5bGVBY3Rpb25fdG9vbFRpcFRleHQpOwotCQlhZGRJdGVtKEZvbnRTdHlsZS5OT1JNQUwuZ2V0TmFtZSgpKTsKLQkJYWRkSXRlbShGb250U3R5bGUuU0VDVElPTl9IRUFESU5HLmdldE5hbWUoKSk7Ci0JCWFkZEl0ZW0oRm9udFN0eWxlLlNVQlNFQ1RJT05fSEVBRElORy5nZXROYW1lKCkpOwotCQlhZGRJdGVtKEZvbnRTdHlsZS5TVUJfU1VCU0VDVElPTl9IRUFESU5HLmdldE5hbWUoKSk7Ci0JCWFkZEl0ZW0oRm9udFN0eWxlLlFVT1RFLmdldE5hbWUoKSk7Ci0JCWFkZEl0ZW0oRm9udFN0eWxlLkNPREVfU0FNUExFLmdldE5hbWUoKSk7Ci0JCS8vIGFkZCBsaXN0ZW5lcgotCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dCkgewotCQkJZmluYWwgUmljaFRleHQgcnRlID0gKFJpY2hUZXh0KSByaWNoVGV4dDsKLQkJCXJ0ZS5hZGRMaXN0ZW5lcihTV1QuU0VMRUNURUQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQlTdHJpbmcgYmxvY2tTdHlsZSA9IHJ0ZS5nZXRTZWxlY3RlZCgpLmdldEJsb2NrU3R5bGUoKTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBGb250U3R5bGUuZ2V0Rm9udFN0eWxlTmFtZShibG9ja1N0eWxlKTsKLQkJCQkJaW50IGluZGV4ID0gaXRlbXMuaW5kZXhPZihuYW1lKTsKLQkJCQkJY29tYm8uc2VsZWN0KGluZGV4KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCwgaW50IGluZGV4KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBGb250U3R5bGUuZ2V0Rm9udFN0eWxlKGluZGV4KS5nZXRWYWx1ZSgpOwotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9GT05UX1NUWUxFLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSUJhc2VSaWNoVGV4dEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lCYXNlUmljaFRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTliYjA0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSUJhc2VSaWNoVGV4dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLS8qKgotICogVGhlIGJhc2UgaW50ZXJmYWNlIGZvciBhIHJpY2ggdGV4dCBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCYXNlUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG9vbCB0aXAgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgdG9vbCB0aXAgdGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHRvb2wgdGlwIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB0b29sVGlwVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRvb2wgdGlwIHRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb29sVGlwVGV4dChTdHJpbmcgdG9vbFRpcFRleHQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVuYWJsZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVkKCk7Ci0KLQkvKioKLQkgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKiAgICAgICAgICAgIElmIDxjb2RlPnRydWU8L2NvZGU+LCBlbmFibGUgdGhlIGFjdGlvbi4gaWYKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgZGlzYWJsZSBpdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lSaWNoVGV4dEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lSaWNoVGV4dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzBhNTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JUmljaFRleHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSByaWNoIHRleHQgYnV0dG9uIGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmljaFRleHRBY3Rpb24gZXh0ZW5kcyBJQmFzZVJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGZvciB0aGUgYWN0aW9uCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbWFnZSBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBmb3IgdGhlIGFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc2FibGVkIGltYWdlIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRpc2FibGVkIGltYWdlIGZvciB0aGUgYWN0aW9uCi0JICovCi0JcHVibGljIEltYWdlIGdldERpc2FibGVkSW1hZ2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGRpc2FibGVkIGltYWdlIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgdGhlIGRpc2FibGVkIGltYWdlIGZvciB0aGUgYWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZWRJbWFnZShJbWFnZSBpbWFnZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotCSAqIHJpY2ggdGV4dCBlZGl0b3IgaXMgaW4gcmVhZG9ubHkgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5SZWFkT25seU1vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiBzb3VyY2UgZWRpdCBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKTsKLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIGFjdGlvbidzIFRvb2xJdGVtCi0JICogQHBhcmFtIHRvb2xJdGVtCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9vbEl0ZW0oVG9vbEl0ZW0gdG9vbEl0ZW0pOwotCQotCS8qKgotCSAqIEdldHMgdGhlIFNXVCBUb29sSXRlbSBTdHlsZSB0byBiZSB1c2VkIGZvciB0aGlzIGFjdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3R5bGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lSaWNoVGV4dENvbWJvQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSVJpY2hUZXh0Q29tYm9BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjhlODNiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSVJpY2hUZXh0Q29tYm9BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHJpY2ggdGV4dCBjb21ibyBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJpY2hUZXh0Q29tYm9BY3Rpb24gZXh0ZW5kcyBJQmFzZVJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIEFkZHMgYW4gaXRlbS4KLQkgKiAKLQkgKiBAcGFyYW0gaXRlbQotCSAqICAgICAgICAgICAgdGhlIGl0ZW0gdG8gYmUgYWRkZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRJdGVtKFN0cmluZyBpdGVtKTsKLQotCS8qKgotCSAqIFJldHVybnMgYWxsIGl0ZW1zLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgaXRlbXMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0SXRlbXMoKTsKLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCwgaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGFjdGlvbidzIENDb21ibyB3aWRnZXQKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21ibyhDQ29tYm8gY29tYm8pOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSW5kZW50QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSW5kZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwZDY0ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0luZGVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBJbmRlbnRzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW5kZW50QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSW5kZW50QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19JTkRFTlQpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19JTkRFTlQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5pbmRlbnRBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSU5ERU5UKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0l0YWxpY0FjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0l0YWxpY0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NTg3YzQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JdGFsaWNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSAnaXRhbGljJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEl0YWxpY0FjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEl0YWxpY0FjdGlvbihmaW5hbCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0lUQUxJQyk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLml0YWxpY0FjdGlvbl90b29sVGlwVGV4dCk7Ci0JCS8vIGFkZCBsaXN0ZW5lcgotCQlyaWNoVGV4dC5hZGRMaXN0ZW5lcihTV1QuU0VMRUNURUQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0Q2hlY2tlZChyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmlzSXRhbGljKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSVRBTElDKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5Q2VudGVyQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUNlbnRlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNjFiOTc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5Q2VudGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIENlbnRlciBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKdXN0aWZ5Q2VudGVyQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSnVzdGlmeUNlbnRlckFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfSlVTVElGWV9DRU5URVIpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5qdXN0aWZ5Q2VudGVyQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkpVU1RJRllfQ0VOVEVSKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlGdWxsQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUZ1bGxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGUyYjExNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUZ1bGxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogRnVsbHkganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnVzdGlmeUZ1bGxBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBKdXN0aWZ5RnVsbEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfSlVTVElGWV9GVUxMKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuanVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSlVTVElGWV9GVUxMKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlMZWZ0QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUxlZnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGQ5MTU5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUxlZnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogTGVmdCBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKdXN0aWZ5TGVmdEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEp1c3RpZnlMZWZ0QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19KVVNUSUZZX0xFRlQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5qdXN0aWZ5TGVmdEFjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5KVVNUSUZZX0xFRlQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeVJpZ2h0QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeVJpZ2h0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczZTA4NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlSaWdodEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBSaWdodCBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKdXN0aWZ5UmlnaHRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBKdXN0aWZ5UmlnaHRBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0pVU1RJRllfUklHSFQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5qdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSlVTVElGWV9SSUdIVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9PdXRkZW50QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvT3V0ZGVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNWE5NTczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9PdXRkZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIEluZGVudHMgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRkZW50QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3V0ZGVudEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfT1VUREVOVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX09VVERFTlQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5vdXRkZW50QWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLk9VVERFTlQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUGFzdGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9QYXN0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNTYxZGVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9QYXN0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkNsaXBib2FyZFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5IVE1MVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBQYXN0ZXMgdGV4dCBmcm9tIHRoZSBjbGlwYm9hcmQgb250byBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBhc3RlQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9VUkwgPSAiU291cmNlVVJMOiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1fRVhUID0gIi5odG0iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9FWFQgPSAiLmh0bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEhSRUZfUkVGRVJFTkNFUyA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiaHJlZlxccyo9XFxzKlwiKC4qPylcIiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaW1hZ2VfcmVmID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSIoPChpbWd8aWZyYW1lKS4qP3NyY1xccyo9XFxzKlwiKSguKj8pKFwiKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgc291cmNlVVJMU3RyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUkVTT1VSQ0VTID0gInJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBhc3RlQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19QQVNURSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX1BBU1RFKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMucGFzdGVBY3Rpb25fdG9vbFRpcFRleHQpOwotCQlsb2dnZXIgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHNvdXJjZSBlZGl0IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWNvcHlMaW5rUmVzb3VyY2VzKHJpY2hUZXh0KTsKLQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yCi0JCQkJCSYmICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5pc0hUTUxUYWJTZWxlY3RlZCgpKSB7Ci0JCQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpCi0JCQkJCQkuZ2V0U291cmNlRWRpdCgpOwotCQkJCXN0eWxlZFRleHQucGFzdGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlBBU1RFLCBzb3VyY2VVUkxTdHIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBsaW5rIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5TGlua1Jlc291cmNlcyhJUmljaFRleHQgcmljaFRleHQpIHsKLQkJdHJ5IHsKLQkJCXNvdXJjZVVSTFN0ciA9IENsaXBib2FyZFV0aWwuZ2V0SFRNTFNvdXJjZVVSTCgpOwotCQkJQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQkJU3RyaW5nIGh0bWwgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHMoSFRNTFRyYW5zZmVyCi0JCQkJCS5nZXRJbnN0YW5jZSgpKTsKLQkJCWlmIChodG1sICE9IG51bGwgJiYgaHRtbC5sZW5ndGgoKSA+IDApIHsKLQkJCQlTdHJpbmcgYmFzZVBhdGggPSByaWNoVGV4dC5nZXRCYXNlUGF0aCgpOwotCQkJCVVSTCBzb3VyY2VVUkwgPSBudWxsOwotCQkJCWlmIChzb3VyY2VVUkxTdHIgPT0gbnVsbCB8fCBzb3VyY2VVUkxTdHIubGVuZ3RoKCkgPT0gMAotCQkJCQkJfHwgc291cmNlVVJMU3RyLmVxdWFscygiYWJvdXQ6YmxhbmsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXNvdXJjZVVSTCA9IHJpY2hUZXh0LmdldENvcHlVUkwoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzb3VyY2VVUkwgPSBuZXcgVVJMKHNvdXJjZVVSTFN0cik7Ci0JCQkJfQotCi0JCQkJTWF0Y2hlciBtYXRjaGVyID0gSFJFRl9SRUZFUkVOQ0VTLm1hdGNoZXIoaHRtbCk7Ci0JCQkJd2hpbGUgKG1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJCVN0cmluZyBocmVmID0gTmV0VXRpbC5kZWNvZGVVUkwobWF0Y2hlci5ncm91cCgxKSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlVUkwgaHJlZlVSTCA9IG5ldyBVUkwoc291cmNlVVJMLCBocmVmKTsKLQkJCQkJCVN0cmluZyBzY2hlbWUgPSBocmVmVVJMLmdldFByb3RvY29sKCk7Ci0JCQkJCQlpZiAoc2NoZW1lICE9IG51bGwKLQkJCQkJCQkJJiYgc2NoZW1lCi0JCQkJCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoTmV0VXRpbC5GSUxFX1NDSEVNRSkpIHsKLQkJCQkJCQlTdHJpbmcgdXJsID0gaHJlZlVSTC5nZXRQYXRoKCk7Ci0JCQkJCQkJRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUodXJsKTsKLQkJCQkJCQlGaWxlIHRndEZpbGUgPSBudWxsOwotCQkJCQkJCUZpbGUgdGd0RGlyID0gbnVsbDsKLQkJCQkJCQlpZiAoaHJlZi5zdGFydHNXaXRoKFJFU09VUkNFUykgfHwgaHJlZi5zdGFydHNXaXRoKCIuLyIgKyBSRVNPVVJDRVMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJdGd0RmlsZSA9IG5ldyBGaWxlKGJhc2VQYXRoLCBocmVmKTsKLQkJCQkJCQkJdGd0RGlyID0gdGd0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJU3RyaW5nIHJlc1BhdGggPSBnZXRTdWJkaXJlY3RvcnlPZlJlc291cmNlcyhocmVmKTsKLQkJCQkJCQkJdGd0RmlsZSA9IG5ldyBGaWxlKGJhc2VQYXRoICsgUkVTT1VSQ0VTLCByZXNQYXRoKTsKLQkJCQkJCQkJdGd0RGlyID0gdGd0RmlsZTsKLQkJCQkJCQl9Ci0JCQkJCQkJdGd0RGlyLm1rZGlycygpOwotCQkJCQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyY0ZpbGUsIHRndERpcik7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQltYXRjaGVyID0gcF9pbWFnZV9yZWYubWF0Y2hlcihodG1sKTsKLQkJCQl3aGlsZSAobWF0Y2hlci5maW5kKCkpIHsKLQkJCQkJU3RyaW5nIHNyYyA9IE5ldFV0aWwuZGVjb2RlVVJMKG1hdGNoZXIuZ3JvdXAoMykpOwotCQkJCQl0cnkgewotCQkJCQkJVVJMIHNyY1VSTCA9IG5ldyBVUkwoc291cmNlVVJMLCBzcmMpOwotCQkJCQkJU3RyaW5nIHNjaGVtZSA9IHNyY1VSTC5nZXRQcm90b2NvbCgpOwotCQkJCQkJaWYgKHNjaGVtZSAhPSBudWxsCi0JCQkJCQkJCSYmIHNjaGVtZS5lcXVhbHNJZ25vcmVDYXNlKE5ldFV0aWwuRklMRV9TQ0hFTUUpKSB7Ci0JCQkJCQkJRmlsZSBzcmNGaWxlID0gbnVsbDsKLQkJCQkJCQlTdHJpbmcgYXV0aG9yaXR5ID0gc3JjVVJMLmdldEF1dGhvcml0eSgpOwotCQkJCQkJCWlmIChhdXRob3JpdHkgIT0gbnVsbCkgewotCQkJCQkJCQlzcmNGaWxlID0gbmV3IEZpbGUoYXV0aG9yaXR5ICsgc3JjVVJMLmdldFBhdGgoKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc3JjRmlsZSA9IG5ldyBGaWxlKHNyY1VSTC5nZXRQYXRoKCkpOwotCQkJCQkJCX0KLQkJCQkJCQlGaWxlIHRndEZpbGUgPSBudWxsOwotCQkJCQkJCUZpbGUgdGd0RGlyID0gbnVsbDsKLQkJCQkJCQlpZiAoc3JjLnN0YXJ0c1dpdGgoUkVTT1VSQ0VTKSB8fCBzcmMuc3RhcnRzV2l0aCgiLi8iICsgUkVTT1VSQ0VTKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXRndEZpbGUgPSBuZXcgRmlsZShiYXNlUGF0aCwgc3JjKTsKLQkJCQkJCQkJdGd0RGlyID0gdGd0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJU3RyaW5nIHJlc1BhdGggPSBnZXRTdWJkaXJlY3RvcnlPZlJlc291cmNlcyhzcmMpOwotCQkJCQkJCQl0Z3RGaWxlID0gbmV3IEZpbGUoYmFzZVBhdGggKyBSRVNPVVJDRVMsIHJlc1BhdGgpOwotCQkJCQkJCQl0Z3REaXIgPSB0Z3RGaWxlOwotCQkJCQkJCX0KLQkJCQkJCQl0Z3REaXIubWtkaXJzKCk7Ci0JCQkJCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjRmlsZSwgdGd0RGlyKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gSFRNTCBjb250ZW50IGZyb20gdGhlIGNsaXBib2FyZCBhbmQgcmV0dXJucyB0aGUgc291cmNlCi0JICogVVJMLgotCSAqIAotCSAqIEBwYXJhbSBodG1sQ29udGVudAotCSAqICAgICAgICAgICAgdGhlIEhUTUwgY29udGVudCBmcm9tIHRoZSBjbGlwYm9hcmQKLQkgKiBAcmV0dXJuIHRoZSBzb3VyY2UgVVJMIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2VVUkwoU3RyaW5nIGh0bWxDb250ZW50KSB7Ci0JCVN0cmluZyBzb3VyY2VVUkwgPSBudWxsOwotCQlpbnQgc291cmNlVVJMSW5kZXggPSBodG1sQ29udGVudC5pbmRleE9mKFNPVVJDRV9VUkwpOwotCQlpZiAoc291cmNlVVJMSW5kZXggPiAwKSB7Ci0JCQlzb3VyY2VVUkwgPSBodG1sQ29udGVudC5zdWJzdHJpbmcoc291cmNlVVJMSW5kZXgKLQkJCQkJKyBTT1VSQ0VfVVJMLmxlbmd0aCgpKTsKLQkJCXNvdXJjZVVSTCA9IHNvdXJjZVVSTC5zdWJzdHJpbmcoMCwgc291cmNlVVJMCi0JCQkJCS5pbmRleE9mKEZpbGVVdGlsLkxJTkVfU0VQKSk7Ci0JCQlpZiAoc291cmNlVVJMLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoSFRNX0VYVCkKLQkJCQkJfHwgc291cmNlVVJMLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoSFRNTF9FWFQpKSB7Ci0JCQkJc291cmNlVVJMID0gc291cmNlVVJMLnN1YnN0cmluZygwLCBzb3VyY2VVUkwuaW5kZXhPZihGaWxlVXRpbAotCQkJCQkJLmdldEZpbGVOYW1lKHNvdXJjZVVSTCkpIC0gMSk7Ci0JCQkJc291cmNlVVJMID0gc291cmNlVVJMLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCX0KLQkJCXNvdXJjZVVSTCA9IEZpbGVVdGlsLmFwcGVuZFNlcGFyYXRvcihzb3VyY2VVUkwsICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc291cmNlVVJMOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3ViZGlyZWN0b3J5T2ZSZXNvdXJjZXMoU3RyaW5nIHBhdGgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCByZXNfaWR4ID0gcGF0aC5pbmRleE9mKFJFU09VUkNFUyk7Ci0JCWlmIChyZXNfaWR4ICE9IC0xKSB7Ci0JCQlTdGFjayBzdGFjayA9IG5ldyBTdGFjaygpOwotCQkJRmlsZSByZWxhdGl2ZSA9IG5ldyBGaWxlKHBhdGgpLmdldFBhcmVudEZpbGUoKTsKLQkJCXdoaWxlICghcmVsYXRpdmUuZ2V0TmFtZSgpLmVxdWFscyhSRVNPVVJDRVMpKSB7Ci0JCQkJc3RhY2sucHVzaChyZWxhdGl2ZS5nZXROYW1lKCkpOwotCQkJCXJlbGF0aXZlID0gcmVsYXRpdmUuZ2V0UGFyZW50RmlsZSgpOwotCQkJfQotCQkJd2hpbGUgKCFzdGFjay5pc0VtcHR5KCkpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQgKyAoU3RyaW5nKXN0YWNrLnBvcCgpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCQl9Ci0JCX0gCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1Bhc3RlUGxhaW5UZXh0QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUGFzdGVQbGFpblRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzNmOTk3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUGFzdGVQbGFpblRleHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLXB1YmxpYyBjbGFzcyBQYXN0ZVBsYWluVGV4dEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQYXN0ZVBsYWluVGV4dEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQkvLyBUT0RPIG5lZWQgaW1hZ2UKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX1BBU1RFKTsKLQkJLy8gVE9ETyBuZWVkIGltYWdlCi0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX1BBU1RFKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMucGFzdGVQbGFpblRleHRBY3Rpb25fdG9vbFRpcFRleHQpOwotCQlzZXRFbmFibGVkKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotCSAqIHJpY2ggdGV4dCBlZGl0b3IgaXMgaW4gc291cmNlIGVkaXQgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgdGV4dCBmcm9tIGNsaXBib2FyZAotCQkJQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHMoVGV4dFRyYW5zZmVyCi0JCQkJCS5nZXRJbnN0YW5jZSgpKTsKLQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQl0ZXh0ID0gU3RyVXRpbC5jb252ZXJ0TmV3bGluZXNUb0hUTUwodGV4dCk7Ci0JCQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IpIHsKLQkJCQkJKChSaWNoVGV4dEVkaXRvcilyaWNoVGV4dCkuYWRkSFRNTCh0ZXh0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0hUTUwsIHRleHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1JpY2hUZXh0QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUmljaFRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjE1ZmJjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUmljaFRleHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIHJpY2ggdGV4dCBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSaWNoVGV4dEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgSVJpY2hUZXh0IHJpY2hUZXh0OwotCQotCXByb3RlY3RlZCBUb29sSXRlbSB0b29sSXRlbTsKLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBmTWVudUFjdGlvbnMgPSBuZXcgTGlua2VkSGFzaFNldDxJQWN0aW9uPigpOwotCQotICAgIHByb3RlY3RlZCBJTWVudUNyZWF0b3IgbWVudUNyZWF0b3IgPSBuZXcgSU1lbnVDcmVhdG9yKCkgewotCi0gICAgCXByaXZhdGUgTWVudU1hbmFnZXIgZHJvcERvd25NZW51TWdyOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIHRoZSBtZW51IG1hbmFnZXIgZm9yIHRoZSBkcm9wLWRvd24uCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlRHJvcERvd25NZW51TWdyKCkgewotICAgICAgICAgICAgaWYgKGRyb3BEb3duTWVudU1nciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZHJvcERvd25NZW51TWdyID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxJQWN0aW9uPiBpdGVyID0gZ2V0TWVudUFjdGlvbnMoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIAlJQWN0aW9uIGl0ZW0gPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgZHJvcERvd25NZW51TWdyLmFkZChpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvciNnZXRNZW51KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVudSBnZXRNZW51KENvbnRyb2wgcGFyZW50KSB7Ci0gICAgICAgICAgICBjcmVhdGVEcm9wRG93bk1lbnVNZ3IoKTsKLSAgICAgICAgICAgIHJldHVybiBkcm9wRG93bk1lbnVNZ3IuY3JlYXRlQ29udGV4dE1lbnUocGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yI2dldE1lbnUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudSkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZW51IGdldE1lbnUoTWVudSBwYXJlbnQpIHsKLSAgICAgICAgICAgIGNyZWF0ZURyb3BEb3duTWVudU1ncigpOwotICAgICAgICAgICAgTWVudSBtZW51ID0gbmV3IE1lbnUocGFyZW50KTsKLSAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBkcm9wRG93bk1lbnVNZ3IuZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0gICAgICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gbmV3SXRlbSA9IGl0ZW07Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0gPSBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGl0ZW0pLmdldEFjdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV3SXRlbS5maWxsKG1lbnUsIC0xKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtZW51OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IjZGlzcG9zZSgpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgaWYgKGRyb3BEb3duTWVudU1nciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZHJvcERvd25NZW51TWdyLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICBkcm9wRG93bk1lbnVNZ3IgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIFJpY2hUZXh0QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKG51bGwsIHN0eWxlKTsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiByZWFkb25seSBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblJlYWRPbmx5TW9kZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHNvdXJjZSBlZGl0IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VG9vbEl0ZW0oVG9vbEl0ZW0gdG9vbEl0ZW0pIHsKLQkJdGhpcy50b29sSXRlbSA9IHRvb2xJdGVtOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWV4ZWN1dGUocmljaFRleHQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uPElBY3Rpb24+IGdldE1lbnVBY3Rpb25zKCkgewotCQlyZXR1cm4gZk1lbnVBY3Rpb25zOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRBY3Rpb25Ub01lbnUoSUFjdGlvbiBhY3Rpb24pIHsKLQkJZk1lbnVBY3Rpb25zLmFkZChhY3Rpb24pOwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUmljaFRleHRDb21ib0FjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1JpY2hUZXh0Q29tYm9BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjUwODNjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUmljaFRleHRDb21ib0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSByaWNoIHRleHQgY29tYm8gYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmljaFRleHRDb21ib0FjdGlvbiBleHRlbmRzIEJhc2VSaWNoVGV4dEFjdGlvbiBpbXBsZW1lbnRzCi0JCUlSaWNoVGV4dENvbWJvQWN0aW9uIHsKLQotCXByb3RlY3RlZCBMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIENDb21ibyBjb21ibzsKLQotCS8qKgotCSAqIEFkZHMgYSBjb21ibyBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBpdGVtVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIGEgY29tYm8gaXRlbQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEl0ZW0oU3RyaW5nIGl0ZW1UZXh0KSB7Ci0JCWl0ZW1zLmFkZChpdGVtVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBjb21ibyBpdGVtcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvbWJvIGl0ZW1zCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEl0ZW1zKCkgewotCQlyZXR1cm4gKFN0cmluZ1tdKSBpdGVtcy50b0FycmF5KG5ldyBTdHJpbmdbaXRlbXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0LCBpbnQgaW5kZXgpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5JUmljaFRleHRDb21ib0FjdGlvbiNzZXRDb21ibyhvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21ibyhDQ29tYm8gY29tYm8pIHsKLQkJdGhpcy5jb21ibyA9IGNvbWJvOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9TdWJzY3JpcHRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9TdWJzY3JpcHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzI1YzBkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvU3Vic2NyaXB0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogVG9nZ2xlcyB0aGUgc3Vic2NyaXB0IGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3Vic2NyaXB0QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3Vic2NyaXB0QWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19DSEVDS19CT1gpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfU1VCU0NSSVBUKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfU1VCU0NSSVBUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuc3Vic2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJLy8gYWRkIGxpc3RlbmVyCi0JCXJpY2hUZXh0LmFkZExpc3RlbmVyKFNXVC5TRUxFQ1RFRCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDaGVja2VkKHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuaXNTdWJzY3JpcHQoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TVUJTQ1JJUFQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1N1cGVyc2NyaXB0QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvU3VwZXJzY3JpcHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDdmNDRlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvU3VwZXJzY3JpcHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSBzdXBlcnNjcmlwdCBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQKLSAqIGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXBlcnNjcmlwdEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN1cGVyc2NyaXB0QWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19DSEVDS19CT1gpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfU1VQRVJTQ1JJUFQpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19TVVBFUlNDUklQVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnN1cGVyc2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJLy8gYWRkIGxpc3RlbmVyCi0JCXJpY2hUZXh0LmFkZExpc3RlbmVyKFNXVC5TRUxFQ1RFRCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDaGVja2VkKHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuaXNTdXBlcnNjcmlwdCgpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNVUEVSU0NSSVBUKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9UaWR5QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvVGlkeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZGY1NjZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9UaWR5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbC5IVE1MRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIFJ1bnMgSlRpZHkgb24gdGhlIEhUTUwKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBUaWR5QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCQotCWJvb2xlYW4gZm9yY2VPdXRwdXQgPSBmYWxzZTsKLQlib29sZWFuIG1ha2VCYXJlID0gZmFsc2U7Ci0JYm9vbGVhbiB3b3JkMjAwMCA9IGZhbHNlOwotCQotCS8vIFRoZSBIVE1MIHNvdXJjZSBmb3JtYXR0ZXIuCi0JcHJvdGVjdGVkIEhUTUxGb3JtYXR0ZXIgaHRtbEZvcm1hdHRlcjsKLQotCQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGlkeUFjdGlvbihJUmljaFRleHQgcmljaFRleHQsIGJvb2xlYW4gZm9yY2VPdXRwdXQsIGJvb2xlYW4gbWFrZUJhcmUsIGJvb2xlYW4gd29yZDIwMDApIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQl0aGlzLmZvcmNlT3V0cHV0ID0gZm9yY2VPdXRwdXQ7Ci0JCXRoaXMubWFrZUJhcmUgPSBtYWtlQmFyZTsKLQkJdGhpcy53b3JkMjAwMCA9IHdvcmQyMDAwOwotCQkvLyBUT0RPIG5lZWQgaW1hZ2UKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX1RJRFkpOwotCQkvLyBUT0RPIG5lZWQgaW1hZ2UKLS8vCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19QQVNURSk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnBhc3RlUGxhaW5UZXh0QWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJaHRtbEZvcm1hdHRlciA9IG5ldyBIVE1MRm9ybWF0dGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJUaWR5IGFjdGlvbiAiICsgZm9yY2VPdXRwdXQgKyAiICIgKyBtYWtlQmFyZSArICIgIiArIHdvcmQyMDAwKTsKLQkJLy8gZ2V0IGN1cnJlbnQgdGV4dAotCQlTdHJpbmcgaHRtbDsKLQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IpIHsKLQkJCWh0bWwgPSAoKFJpY2hUZXh0RWRpdG9yKXJpY2hUZXh0KS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlodG1sID0gcmljaFRleHQuZ2V0VGV4dCgpOwotCQl9Ci0JCS8vIGNhbGwgSlRpZHkgd2l0aCB0aGUgb3B0aW9ucwotCQl0cnkgewotCQkJaHRtbCA9IGh0bWxGb3JtYXR0ZXIuZm9ybWF0SFRNTChodG1sLCBmb3JjZU91dHB1dCwgbWFrZUJhcmUsIHdvcmQyMDAwKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJLy8gc2V0IHRleHQKLQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IpIHsKLQkJCSgoUmljaFRleHRFZGl0b3IpcmljaFRleHQpLnNldFRleHQoaHRtbCk7Ci0JCX0gZWxzZSB7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KGh0bWwpOwotCQl9Ci0JCXJpY2hUZXh0LmNoZWNrTW9kaWZ5KCk7Ci0JCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1RpZHlBY3Rpb25Hcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1RpZHlBY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYjZhMzI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9UaWR5QWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIFJ1bnMgSlRpZHkgb24gdGhlIEhUTUwKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBUaWR5QWN0aW9uR3JvdXAgZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0JCi0JVGlkeUFjdGlvbiB0aWR5QWN0aW9uRGVmYXVsdDsKLQlUaWR5QWN0aW9uIHRpZHlBY3Rpb25DbGVhbk1TOwotCVRpZHlBY3Rpb24gdGlkeUFjdGlvbkNsZWFuV29yZDIwMDA7Ci0KLQlwdWJsaWMgVGlkeUFjdGlvbkdyb3VwKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19EUk9QX0RPV05fTUVOVSk7Ci0JCS8vIFRPRE8gbmVlZCBpbWFnZQotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfVElEWSk7Ci0JCS8vIFRPRE8gbmVlZCBpbWFnZQotLy8JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX1BBU1RFKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMucGFzdGVQbGFpblRleHRBY3Rpb25fdG9vbFRpcFRleHQpOwotCQkKLQkJY3JlYXRlQWN0aW9ucygpOwotCQlzZXRNZW51Q3JlYXRvcihtZW51Q3JlYXRvcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQl0aWR5QWN0aW9uRGVmYXVsdCA9IG5ldyBUaWR5QWN0aW9uKHJpY2hUZXh0LCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotCQl0aWR5QWN0aW9uRGVmYXVsdC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnRpZHlfY2xlYW5fdGV4dCk7Ci0JCXRpZHlBY3Rpb25EZWZhdWx0LnNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnRpZHlfY2xlYW5fdG9vbFRpcFRleHQpOwotCQl0aWR5QWN0aW9uQ2xlYW5NUyA9IG5ldyBUaWR5QWN0aW9uKHJpY2hUZXh0LCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0JCXRpZHlBY3Rpb25DbGVhbk1TLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMudGlkeV9jbGVhbmVyX3RleHQpOwotCQl0aWR5QWN0aW9uQ2xlYW5NUy5zZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy50aWR5X2NsZWFuZXJfdG9vbFRpcFRleHQpOwotCQl0aWR5QWN0aW9uQ2xlYW5Xb3JkMjAwMCA9IG5ldyBUaWR5QWN0aW9uKHJpY2hUZXh0LCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJdGlkeUFjdGlvbkNsZWFuV29yZDIwMDAuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy50aWR5X2NsZWFuZXN0X3RleHQpOwotCQl0aWR5QWN0aW9uQ2xlYW5Xb3JkMjAwMC5zZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy50aWR5X2NsZWFuZXN0X3Rvb2xUaXBUZXh0KTsKLQkJYWRkQWN0aW9uVG9NZW51KHRpZHlBY3Rpb25EZWZhdWx0KTsKLQkJYWRkQWN0aW9uVG9NZW51KHRpZHlBY3Rpb25DbGVhbk1TKTsKLQkJYWRkQWN0aW9uVG9NZW51KHRpZHlBY3Rpb25DbGVhbldvcmQyMDAwKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQkJLy8gY2FsbCBub3JtYWwgY2xlYW4KLQkJdGlkeUFjdGlvbkRlZmF1bHQuZXhlY3V0ZShyaWNoVGV4dCk7Ci0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1VuZGVybGluZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1VuZGVybGluZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZTdkYjA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9VbmRlcmxpbmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSB1bmRlcmxpbmUgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmRlcmxpbmVBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBVbmRlcmxpbmVBY3Rpb24oZmluYWwgSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19VTkRFUkxJTkUpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19VTkRFUkxJTkUpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy51bmRlcmxpbmVBY3Rpb25fdG9vbFRpcFRleHQpOwotCQkvLyBhZGQgbGlzdGVuZXIKLQkJcmljaFRleHQuYWRkTGlzdGVuZXIoU1dULlNFTEVDVEVELCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXNldENoZWNrZWQocmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5pc1VuZGVyTGluZSgpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlVOREVSTElORSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjNkOWU2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZWRpdGluZyBhY3Rpb25zIGZvciB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgYW5kIGVkaXRvci4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkSW1hZ2VEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRJbWFnZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmM2UxYjFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRJbWFnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIGltYWdlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIEhUTUwKLSAqIDxpbWc+IHRhZyBpbiB0aGUgcmljaCB0ZXh0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRJbWFnZURpYWxvZyBleHRlbmRzIEJhc2VEaWFsb2cgewotCi0JcHJvdGVjdGVkIEltYWdlIGltYWdlID0gbmV3IEltYWdlKCk7Ci0KLQlwcm90ZWN0ZWQgVGV4dCB1cmxUZXh0OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uQWRhcHRlciBicm93c2VTZWxlY3Rpb25BZGFwdGVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCQlkaWFsb2cKLQkJCQkJLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsKLQkJCQkJCQkiKi5naWYiLCAiKi5qcGciLCAiKi5ibXAiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJU3RyaW5nIGltYWdlRmlsZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAoaW1hZ2VGaWxlICE9IG51bGwgJiYgaW1hZ2VGaWxlLmxlbmd0aCgpID4gMCkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlRmlsZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIHVybCA9IGZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJCQl1cmxUZXh0LnNldFRleHQodXJsKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciB1cmxUZXh0TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKHVybFRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHBhcmVudCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXB1YmxpYyBBZGRJbWFnZURpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEJhc2VEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQotCQlMYWJlbCB1cmxMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdXJsTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy51cmxMYWJlbF90ZXh0KTsgCi0JCXVybFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCXVybFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXVybFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIodXJsVGV4dExpc3RlbmVyKTsKLQotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5icm93c2VCdXR0b25fdGV4dCk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihicm93c2VTZWxlY3Rpb25BZGFwdGVyKTsKLQotCQlzdXBlci5nZXRTaGVsbCgpLnNldFRleHQoCi0JCQkJUmljaFRleHRSZXNvdXJjZXMuYWRkSW1hZ2VEaWFsb2dfdGl0bGUpOyAKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQmFzZURpYWxvZyNjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCVN0cmluZyB1cmwgPSB1cmxUZXh0LmdldFRleHQoKTsKLQkJaWYgKHVybCAhPSBudWxsICYmIHVybC5sZW5ndGgoKSA+IDApIHsKLQkJCWltYWdlLnNldFVSTCh1cmwpOwotCQl9Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkltYWdlPC9jb2RlPiBvYmplY3QuCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRMaW5rRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkTGlua0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDNlNGUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRMaW5rRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBmaWxlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIEhUTUwgPGE+Ci0gKiB0YWcgaW4gdGhlIHJpY2ggdGV4dCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkTGlua0RpYWxvZyBleHRlbmRzIEJhc2VEaWFsb2cgewotCi0JcHJvdGVjdGVkIExpbmsgbGluayA9IG5ldyBMaW5rKCk7Ci0KLQlwcm90ZWN0ZWQgVGV4dCB1cmxUZXh0OwotCi0JcHJvdGVjdGVkIFN0cmluZyBiYXNlUGF0aDsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIExhYmVsIHVybExhYmVsOwotCi0JcHJvdGVjdGVkIFRleHQgdXJsRGlzcGxheU5hbWVUZXh0OwotCi0JcHJvdGVjdGVkIExhYmVsIHVybERpc3BsYXlOYW1lTGFiZWw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgQWRkTGlua0RpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyBiYXNlUGF0aCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBCYXNlRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCXVybExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl1cmxMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnVybExhYmVsX3RleHQpOyAKLQkJdXJsVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJdXJsVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdXJsVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKHVybFRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQl1cmxEaXNwbGF5TmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl1cmxEaXNwbGF5TmFtZUxhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMudXJsRGlzcGxheU5hbWVMYWJlbF90ZXh0KTsgCi0JCXVybERpc3BsYXlOYW1lVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdyaWREYXRhMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YTIud2lkdGhIaW50ID0gMzAwOwotCQl1cmxEaXNwbGF5TmFtZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YTIpOwotCi0JCXN1cGVyLmdldFNoZWxsKCkuc2V0VGV4dCgKLQkJCQlSaWNoVGV4dFJlc291cmNlcy5hZGRMaW5rRGlhbG9nX3RpdGxlKTsgCi0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEJhc2VEaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKHBhcmVudCk7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlTdHJpbmcgdXJsID0gdXJsVGV4dC5nZXRUZXh0KCk7Ci0JCWlmICh1cmwgIT0gbnVsbCAmJiB1cmwubGVuZ3RoKCkgPiAwKSB7Ci0JCQlsaW5rLnNldFVSTCh1cmwpOwotCQkJbGluay5zZXROYW1lKHVybERpc3BsYXlOYW1lVGV4dC5nZXRUZXh0KCkpOwotCQl9Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkxpbms8L2NvZGU+IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgTGluayBnZXRMaW5rKCkgewotCQlyZXR1cm4gbGluazsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0FkZFRhYmxlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkVGFibGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjljYzE1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkVGFibGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBhdHRyaWJ1dGVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIEhUTUwKLSAqIDx0YWJsZT4gdGFnIGluIHRoZSByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZFRhYmxlRGlhbG9nIGV4dGVuZHMgQmFzZURpYWxvZyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ST1dTID0gMjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPTFVNTlMgPSAyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfV0lEVEggPSAiODUlIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRBQkxFX1NUWUxFX0xBQkVMUyA9IHsKLQkJCVJpY2hUZXh0UmVzb3VyY2VzLnRhYmxlSGVhZGVyTm9uZV90ZXh0LCAKLQkJCVJpY2hUZXh0UmVzb3VyY2VzLnRhYmxlSGVhZGVyQ29sc190ZXh0LCAKLQkJCVJpY2hUZXh0UmVzb3VyY2VzLnRhYmxlSGVhZGVyUm93c190ZXh0LCAKLQkJCVJpY2hUZXh0UmVzb3VyY2VzLnRhYmxlSGVhZGVyQm90aF90ZXh0LCAKLQl9OwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSgpOwotCi0JcHJpdmF0ZSBUZXh0IHJvd3NUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGNvbHNUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IHdpZHRoVGV4dDsKLQotCXByaXZhdGUgQ29tYm8gdGFibGVUeXBlQ29tYm87Ci0KLQlwcml2YXRlIFRleHQgc3VtbWFyeVRleHQ7Ci0KLQlwcml2YXRlIFRleHQgY2FwdGlvblRleHQ7Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWludCByb3dzID0gSW50ZWdlci5wYXJzZUludChyb3dzVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQkJaW50IGNvbHMgPSBJbnRlZ2VyLnBhcnNlSW50KGNvbHNUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQkJCQlTdHJpbmcgd2lkdGggPSB3aWR0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZChyb3dzID4gMCAmJiBjb2xzID4gMCAmJiB3aWR0aC5sZW5ndGgoKSA+IDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgQWRkVGFibGVEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBCYXNlRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlMYWJlbCByb3dzTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXJvd3NMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnJvd3NMYWJlbF90ZXh0KTsgCi0KLQkJcm93c1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlyb3dzVGV4dC5zZXRUZXh0TGltaXQoMik7Ci0JCXJvd3NUZXh0LnNldFRleHQoIiIgKyBERUZBVUxUX1JPV1MpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlyb3dzVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlyb3dzVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJTGFiZWwgY29sc0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb2xzTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5jb2x1bW5zTGFiZWxfdGV4dCk7IAotCi0JCWNvbHNUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJY29sc1RleHQuc2V0VGV4dExpbWl0KDIpOwotCQljb2xzVGV4dC5zZXRUZXh0KCIiICsgREVGQVVMVF9DT0xVTU5TKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJY29sc1RleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY29sc1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0JCUxhYmVsIHdpZHRoTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXdpZHRoTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy53aWR0aExhYmVsX3RleHQpOyAKLQotCQl3aWR0aFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl3aWR0aFRleHQuc2V0VGV4dCgiIiArIERFRkFVTFRfV0lEVEgpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQl3aWR0aFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJd2lkdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQlMYWJlbCBoZWFkZXJUeXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWhlYWRlclR5cGVMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnRhYmxlU3R5bGVMYWJlbF90ZXh0KTsgCi0KLQkJdGFibGVUeXBlQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXRhYmxlVHlwZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl0YWJsZVR5cGVDb21iby5zZXRJdGVtcyhUQUJMRV9TVFlMRV9MQUJFTFMpOwotCQl0YWJsZVR5cGVDb21iby5zZXRUZXh0KFRBQkxFX1NUWUxFX0xBQkVMU1swXSk7Ci0KLQkJTGFiZWwgc3VtbWFyeUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzdW1tYXJ5TGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5zdW1tYXJ5TGFiZWxfdGV4dCk7IAotCQlzdW1tYXJ5VGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlzdW1tYXJ5VGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCUxhYmVsIGNhcHRpb25MYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY2FwdGlvbkxhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuY2FwdGlvbkxhYmVsX3RleHQpOyAKLQkJY2FwdGlvblRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJY2FwdGlvblRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlzdXBlci5nZXRTaGVsbCgpLnNldFRleHQoCi0JCQkJUmljaFRleHRSZXNvdXJjZXMuYWRkVGFibGVEaWFsb2dfdGl0bGUpOyAKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQmFzZURpYWxvZyNjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJU3RyaW5nIHJvd3NWYWx1ZSA9IHJvd3NUZXh0LmdldFRleHQoKTsKLQkJaWYgKHJvd3NWYWx1ZSAhPSBudWxsICYmIHJvd3NWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJaW50IHJvd3MgPSBJbnRlZ2VyLnBhcnNlSW50KHJvd3NWYWx1ZSk7Ci0JCQkJdGFibGUuc2V0Um93cyhyb3dzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGFibGUuc2V0Um93cyhERUZBVUxUX1JPV1MpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGNvbHNWYWx1ZSA9IGNvbHNUZXh0LmdldFRleHQoKTsKLQkJaWYgKGNvbHNWYWx1ZSAhPSBudWxsICYmIGNvbHNWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJaW50IGNvbHMgPSBJbnRlZ2VyLnBhcnNlSW50KGNvbHNWYWx1ZSk7Ci0JCQkJdGFibGUuc2V0Q29sdW1ucyhjb2xzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGFibGUuc2V0Q29sdW1ucyhERUZBVUxUX0NPTFVNTlMpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIHdpZHRoVmFsdWUgPSB3aWR0aFRleHQuZ2V0VGV4dCgpOwotCQlpZiAod2lkdGhWYWx1ZSAhPSBudWxsICYmIHdpZHRoVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0YWJsZS5zZXRXaWR0aCh3aWR0aFZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCXRhYmxlLnNldFdpZHRoKERFRkFVTFRfV0lEVEgpOwotCQl9Ci0KLQkJdGFibGUuc2V0U3VtbWFyeShzdW1tYXJ5VGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJdGFibGUuc2V0Q2FwdGlvbihjYXB0aW9uVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJdGFibGUuc2V0VGFibGVIZWFkZXJzKHRhYmxlVHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPlRhYmxlPC9jb2RlPiBvYmplY3QuCi0JICovCi0JcHVibGljIFRhYmxlIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGFibGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9CYXNlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQmFzZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjFmMGQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9CYXNlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgZGlhbG9ncyB1c2VkIGJ5IHRoZSByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJhc2VEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLy8gVGhlIHBsdWctaW4gbG9nZ2VyLgotCXByb3RlY3RlZCBMb2dnZXIgbG9nZ2VyOwotCi0JLyoqCi0JICogVGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIENhbmNlbCBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgPGNvZGU+QmFzZURpYWxvZzwvY29kZT4gZ2l2ZW4gdGhlIHBhcmVudCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXB1YmxpYyBCYXNlRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQlsb2dnZXIgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGNvbXBvc2l0ZS5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgT0sgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIENyZWF0ZSB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgT0sgYnV0dG9uLgotCQlva0J1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY2FuY2VsQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9GaW5kUmVwbGFjZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0ZpbmRSZXBsYWNlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhODliY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0ZpbmRSZXBsYWNlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIHNlYXJjaCBhbmQgcmVwbGFjZSBzdHJpbmdzL29wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmluZFJlcGxhY2VEaWFsb2cgZXh0ZW5kcyBCYXNlRGlhbG9nIHsKLQotCXByaXZhdGUgRmluZFJlcGxhY2VBY3Rpb24gZmluZFJlcGxhY2VBY3Rpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gZmluZE9ubHk7Ci0KLQlwcml2YXRlIFRleHQgZmluZFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgcmVwbGFjZVRleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBzZWFyY2hGb3J3YXJkUmFkaW9CdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBzZWFyY2hCYWNrd2FyZFJhZGlvQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY2FzZVNlbnNpdGl2ZUNoZWNrYm94OwotCi0JcHJpdmF0ZSBCdXR0b24gd2hvbGVXb3JkQ2hlY2tib3g7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmaW5kQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gcmVwbGFjZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHJlcGxhY2VGaW5kQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gcmVwbGFjZUFsbEJ1dHRvbjsKLQotCXByaXZhdGUgTGFiZWwgc3RhdHVzTGFiZWw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gZmluZFJlcGxhY2VBY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBGaW5kIGFuZCBSZXBsYWNlIGFjdGlvbgotCSAqIEBwYXJhbSBmaW5kT25seQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGRpc2FibGUgdGhlIHJlcGxhY2UgYW5kIHJlcGxhY2UgYWxsCi0JICogICAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMKLQkgKi8KLQlwdWJsaWMgRmluZFJlcGxhY2VEaWFsb2coU2hlbGwgcGFyZW50LCBGaW5kUmVwbGFjZUFjdGlvbiBmaW5kUmVwbGFjZUFjdGlvbiwKLQkJCWJvb2xlYW4gZmluZE9ubHkpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJc2V0U2hlbGxTdHlsZShTV1QuRElBTE9HX1RSSU0gfCBTV1QuTU9ERUxFU1MKLQkJCQl8IGdldERlZmF1bHRPcmllbnRhdGlvbigpKTsKLQkJc2V0QmxvY2tPbk9wZW4oZmFsc2UpOwotCQl0aGlzLmZpbmRSZXBsYWNlQWN0aW9uID0gZmluZFJlcGxhY2VBY3Rpb247Ci0JCXRoaXMuZmluZE9ubHkgPSBmaW5kT25seTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEJhc2VEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQotCQlDb21wb3NpdGUgdGV4dENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXRleHRDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXRleHRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgZmluZExhYmVsID0gbmV3IExhYmVsKHRleHRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZmluZExhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuZmluZExhYmVsX3RleHQpOyAKLQkJZmluZFRleHQgPSBuZXcgVGV4dCh0ZXh0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMjAwOwotCQlmaW5kVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZmluZFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGZpbmRCdXR0b24gIT0gbnVsbCkgewotCQkJCQlmaW5kQnV0dG9uCi0JCQkJCQkJLnNldEVuYWJsZWQoZmluZFRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotCQkJCX0KLQkJCQlpZiAocmVwbGFjZUFsbEJ1dHRvbiAhPSBudWxsICYmICFmaW5kT25seSkgewotCQkJCQlyZXBsYWNlQWxsQnV0dG9uLnNldEVuYWJsZWQoZmluZFRleHQuZ2V0VGV4dCgpLnRyaW0oKQotCQkJCQkJCS5sZW5ndGgoKSA+IDApOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJTGFiZWwgcmVwbGFjZUxhYmVsID0gbmV3IExhYmVsKHRleHRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcmVwbGFjZUxhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMucmVwbGFjZUxhYmVsX3RleHQpOyAKLQkJcmVwbGFjZVRleHQgPSBuZXcgVGV4dCh0ZXh0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJcmVwbGFjZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWlmIChmaW5kT25seSkgewotCQkJcmVwbGFjZVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCXJlcGxhY2VUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChyZXBsYWNlQnV0dG9uICE9IG51bGwpIHsKLQkJCQkJCXJlcGxhY2VCdXR0b24uc2V0RW5hYmxlZChmaW5kUmVwbGFjZUFjdGlvbgotCQkJCQkJCQkuZ2V0Rm91bmRNYXRjaCgpKTsKLQkJCQl9Ci0JCQkJaWYgKHJlcGxhY2VGaW5kQnV0dG9uICE9IG51bGwpIHsKLQkJCQkJcmVwbGFjZUZpbmRCdXR0b24uc2V0RW5hYmxlZChmaW5kUmVwbGFjZUFjdGlvbgotCQkJCQkJCS5nZXRGb3VuZE1hdGNoKCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCX0KLQotCQlDb21wb3NpdGUgb3B0aW9uc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW9wdGlvbnNDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJb3B0aW9uc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlHcm91cCBkaXJlY3Rpb25Hcm91cCA9IG5ldyBHcm91cChvcHRpb25zQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRpcmVjdGlvbkdyb3VwLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuZGlyZWN0aW9uR3JvdXBfdGV4dCk7IAotCQlkaXJlY3Rpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJZGlyZWN0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXNlYXJjaEZvcndhcmRSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24oZGlyZWN0aW9uR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNlYXJjaEZvcndhcmRSYWRpb0J1dHRvbi5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmZvcndhcmRSYWRpb0J1dHRvbl90ZXh0KTsgCi0JCXNlYXJjaEZvcndhcmRSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXNlYXJjaEJhY2t3YXJkUmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uKGRpcmVjdGlvbkdyb3VwLCBTV1QuUkFESU8pOwotCQlzZWFyY2hCYWNrd2FyZFJhZGlvQnV0dG9uLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuYmFja3dhcmRSYWRpb0J1dHRvbl90ZXh0KTsgCi0KLQkJR3JvdXAgb3B0aW9uc0dyb3VwID0gbmV3IEdyb3VwKG9wdGlvbnNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJb3B0aW9uc0dyb3VwLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMub3B0aW9uc0dyb3VwX3RleHQpOyAKLQkJb3B0aW9uc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlvcHRpb25zR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNhc2VTZW5zaXRpdmVDaGVja2JveCA9IG5ldyBCdXR0b24ob3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQljYXNlU2Vuc2l0aXZlQ2hlY2tib3guc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dCk7IAotCQl3aG9sZVdvcmRDaGVja2JveCA9IG5ldyBCdXR0b24ob3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQl3aG9sZVdvcmRDaGVja2JveC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLndob2xlV29yZENoZWNrYm94X3RleHQpOyAKLQotCQlzdGF0dXNMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJc3RhdHVzTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJc3VwZXIuZ2V0U2hlbGwoKQotCQkJCS5zZXRUZXh0KAotCQkJCQkJUmljaFRleHRSZXNvdXJjZXMuZmluZFJlcGxhY2VEaWFsb2dfdGl0bGUpOyAKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQmFzZURpYWxvZyNjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAxLCBSaWNoVGV4dFJlc291cmNlcy5maW5kQnV0dG9uX3RleHQsIHRydWUpOyAKLQkJZmluZEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDEpOwotCQlmaW5kQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZmluZFJlcGxhY2VBY3Rpb24ucnVuKEZpbmRSZXBsYWNlQWN0aW9uLkZJTkRfVEVYVCwKLQkJCQkJCWdldEZpbmRUZXh0KCksIGdldFJlcGxhY2VUZXh0KCksIGdldE1hdGNoRGlyZWN0aW9uKCksCi0JCQkJCQlnZXRNYXRjaE9wdGlvbnMoKSk7Ci0JCQkJaWYgKCFmaW5kT25seSkgewotCQkJCXJlcGxhY2VCdXR0b24uc2V0RW5hYmxlZChmaW5kUmVwbGFjZUFjdGlvbi5nZXRGb3VuZE1hdGNoKCkpOwotCQkJCQlyZXBsYWNlRmluZEJ1dHRvbi5zZXRFbmFibGVkKGZpbmRSZXBsYWNlQWN0aW9uCi0JCQkJCQkJLmdldEZvdW5kTWF0Y2goKSk7Ci0JCQkJfQotCQkJCWlmIChmaW5kUmVwbGFjZUFjdGlvbi5nZXRGb3VuZE1hdGNoKCkpIHsKLQkJCQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiIik7ICAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzdGF0dXNMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLkZpbmRSZXBsYWNlX1N0YXR1c19ub01hdGNoX2xhYmVsKTsgCi0JCQkJfQotCQkJCWZpbmRCdXR0b24uc2V0Rm9jdXMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAyLCBSaWNoVGV4dFJlc291cmNlcy5yZXBsYWNlQnV0dG9uX3RleHQsIGZhbHNlKTsgCi0JCXJlcGxhY2VCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAyKTsKLQkJaWYgKCFmaW5kT25seSkgewotCQkJcmVwbGFjZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJZmluZFJlcGxhY2VBY3Rpb24ucnVuKEZpbmRSZXBsYWNlQWN0aW9uLlJFUExBQ0VfVEVYVCwKLQkJCQkJCQlnZXRGaW5kVGV4dCgpLCBnZXRSZXBsYWNlVGV4dCgpLAotCQkJCQkJCWdldE1hdGNoRGlyZWN0aW9uKCksIGdldE1hdGNoT3B0aW9ucygpKTsKLQkJCQkJcmVwbGFjZUJ1dHRvbi5zZXRGb2N1cygpOwotCQkJCX0KLQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAzLCBSaWNoVGV4dFJlc291cmNlcy5yZXBsYWNlRmluZEJ1dHRvbl90ZXh0LCBmYWxzZSk7IAotCQlyZXBsYWNlRmluZEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDMpOwotCQlpZiAoIWZpbmRPbmx5KSB7Ci0JCQlyZXBsYWNlRmluZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJZmluZFJlcGxhY2VBY3Rpb24ucnVuKEZpbmRSZXBsYWNlQWN0aW9uLlJFUExBQ0VfRklORF9URVhULAotCQkJCQkJCWdldEZpbmRUZXh0KCksIGdldFJlcGxhY2VUZXh0KCksCi0JCQkJCQkJZ2V0TWF0Y2hEaXJlY3Rpb24oKSwgZ2V0TWF0Y2hPcHRpb25zKCkpOwotCQkJCQlyZXBsYWNlQnV0dG9uLnNldEVuYWJsZWQoZmluZFJlcGxhY2VBY3Rpb24uZ2V0Rm91bmRNYXRjaCgpKTsKLQkJCQkJcmVwbGFjZUZpbmRCdXR0b24uc2V0RW5hYmxlZChmaW5kUmVwbGFjZUFjdGlvbgotCQkJCQkJCS5nZXRGb3VuZE1hdGNoKCkpOwotCQkJCQlyZXBsYWNlRmluZEJ1dHRvbi5zZXRGb2N1cygpOwotCQkJCX0KLQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyA0LCBSaWNoVGV4dFJlc291cmNlcy5yZXBsYWNlYWxsQnV0dG9uX3RleHQsIGZhbHNlKTsgCi0JCXJlcGxhY2VBbGxCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyA0KTsKLQkJaWYgKCFmaW5kT25seSkgewotCQkJcmVwbGFjZUFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJZmluZFJlcGxhY2VBY3Rpb24ucnVuKEZpbmRSZXBsYWNlQWN0aW9uLlJFUExBQ0VfQUxMX1RFWFQsCi0JCQkJCQkJZ2V0RmluZFRleHQoKSwgZ2V0UmVwbGFjZVRleHQoKSwKLQkJCQkJCQlnZXRNYXRjaERpcmVjdGlvbigpLCBnZXRNYXRjaE9wdGlvbnMoKSk7Ci0JCQkJCXJlcGxhY2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJlcGxhY2VGaW5kQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZXBsYWNlQWxsQnV0dG9uLnNldEZvY3VzKCk7Ci0JCQkJfQotCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQkvLyBDcmVhdGUgdGhlIENhbmNlbCBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JCWNhbmNlbEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCk7Ci0KLQkJZmluZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVwbGFjZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVwbGFjZUZpbmRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlcGxhY2VBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmluZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmluZFRleHQoKSB7Ci0JCXJldHVybiBmaW5kVGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVwbGFjZSB0ZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwbGFjZVRleHQoKSB7Ci0JCXJldHVybiByZXBsYWNlVGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWF0Y2ggZGlyZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+RklORF9GT1JXQVJEPC9jb2RlPiBvciA8Y29kZT5GSU5EX0JBQ0tXQVJEPC9jb2RlPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF0Y2hEaXJlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWFyY2hGb3J3YXJkUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkgPyBGaW5kUmVwbGFjZUFjdGlvbi5GT1JXQVJEX01BVENICi0JCQkJOiBGaW5kUmVwbGFjZUFjdGlvbi5CQUNLV0FSRF9NQVRDSDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYXRjaCBvcHRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1hdGNoIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1hdGNoT3B0aW9ucygpIHsKLQkJaW50IG9wdGlvbnMgPSAwOwotCQlpZiAod2hvbGVXb3JkQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkgPT0gdHJ1ZSkgewotCQkJb3B0aW9ucyB8PSBGaW5kUmVwbGFjZUFjdGlvbi5XSE9MRV9XT1JEX01BVENIOwotCQl9Ci0JCWlmIChjYXNlU2Vuc2l0aXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkgPT0gdHJ1ZSkgewotCQkJb3B0aW9ucyB8PSBGaW5kUmVwbGFjZUFjdGlvbi5DQVNFX1NFTlNJVElWRV9NQVRDSDsKLQkJfQotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmRPbmx5KCkgewotCQlyZXR1cm4gZmluZE9ubHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmluZE9ubHkoYm9vbGVhbiBmaW5kT25seSkgewotCQl0aGlzLmZpbmRPbmx5ID0gZmluZE9ubHk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmNWRkMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGVkaXRpbmcgZGlhbG9ncyBmb3IgdGhlIHJpY2ggdGV4dCBjb250cm9sIGFuZCBlZGl0b3IuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0Jsb2NrVGFnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvQmxvY2tUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTA5MDJmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvQmxvY2tUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogTW9kZWxzIGEgSFRNTCBibG9jayB0YWcuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmxvY2tUYWcgewotCi0JLy8gVGhlIHVzZXIgZnJpZW5kbHkgbmFtZXMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUEFSQUdSQVBIID0gUmljaFRleHRSZXNvdXJjZXMuYmxvY2tUYWdfcGFyYWdyYXBoOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfMSA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmcxOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfMiA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmcyOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfMyA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmczOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfNCA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmc0OyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfNSA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmc1OyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfNiA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmc2OyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FERFJFU1MgPSBSaWNoVGV4dFJlc291cmNlcy5ibG9ja1RhZ19hZGRyZXNzOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BSRUZPUk1BVFRFRF9URVhUID0gUmljaFRleHRSZXNvdXJjZXMuYmxvY2tUYWdfcHJlZm9ybWF0dGVkVGV4dDsgCi0KLQkvLyBUaGUgaW50ZXJuYWwgdmFsdWVzLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9QQVJBR1JBUEggPSAiPHA+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfMSA9ICI8aDE+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfMiA9ICI8aDI+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfMyA9ICI8aDM+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfNCA9ICI8aDQ+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfNSA9ICI8aDU+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfNiA9ICI8aDY+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0FERFJFU1MgPSAiPGFkZHJlc3M+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1BSRUZPUk1BVFRFRF9URVhUID0gIjxwcmU+IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRW51bWVyYXRpb24gb2YgYWxsIHN1cHBvcnRlZCA8Y29kZT5CbG9ja1RhZzwvY29kZT4uCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBQQVJBR1JBUEggPSBuZXcgQmxvY2tUYWcoTkFNRV9QQVJBR1JBUEgsCi0JCQlWQUxVRV9QQVJBR1JBUEgpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzEgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzEsCi0JCQlWQUxVRV9IRUFESU5HXzEpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzIgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzIsCi0JCQlWQUxVRV9IRUFESU5HXzIpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzMgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzMsCi0JCQlWQUxVRV9IRUFESU5HXzMpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzQgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzQsCi0JCQlWQUxVRV9IRUFESU5HXzQpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzUgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzUsCi0JCQlWQUxVRV9IRUFESU5HXzUpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzYgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzYsCi0JCQlWQUxVRV9IRUFESU5HXzYpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBBRERSRVNTID0gbmV3IEJsb2NrVGFnKE5BTUVfQUREUkVTUywKLQkJCVZBTFVFX0FERFJFU1MpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBQUkVGT1JNQVRURURfVEVYVCA9IG5ldyBCbG9ja1RhZygKLQkJCU5BTUVfUFJFRk9STUFUVEVEX1RFWFQsIFZBTFVFX1BSRUZPUk1BVFRFRF9URVhUKTsKLQotCS8vIEEgbGlzdCBvZiA8Y29kZT5CbG9ja1RhZzwvY29kZT4gb2JqZWN0cy4KLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBMaXN0IEJMT0NLX1RBR1MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jc3RhdGljIHsKLQkJQkxPQ0tfVEFHUy5hZGQoUEFSQUdSQVBIKTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR18xKTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR18yKTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR18zKTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR180KTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR181KTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR182KTsKLQkJQkxPQ0tfVEFHUy5hZGQoQUREUkVTUyk7Ci0JCUJMT0NLX1RBR1MuYWRkKFBSRUZPUk1BVFRFRF9URVhUKTsKLQl9Ci0KLQkvLyBUaGUgYmxvY2sgdGFnIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8vIFRoZSBibG9jayB0YWcgdmFsdWUuCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgYmxvY2sgdGFnIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBibG9jayB0YWcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgQmxvY2tUYWcoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmxvY2sgdGFnIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgYmxvY2sgdGFnIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJsb2NrIHRhZyB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBibG9jayB0YWcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+QmxvY2tUYWc8L2NvZGU+IG9iamVjdCB0aGF0IGlzIG1hcHBlZCB0byB0aGUgZ2l2ZW4KLQkgKiBpbmRleC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGFuIGluZGV4IGludG8gdGhlIDxjb2RlPkJsb2NrVGFnPC9jb2RlPiBsaXN0Ci0JICogQHJldHVybiBhIDxjb2RlPkJsb2NrVGFnPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJsb2NrVGFnIGdldEJsb2NrVGFnKGludCBpbmRleCkgewotCQlCbG9ja1RhZyByZXN1bHQgPSAoQmxvY2tUYWcpIEJMT0NLX1RBR1MuZ2V0KGluZGV4KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBQQVJBR1JBUEg7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0ZvbnROYW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvRm9udE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTcxNjdkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvRm9udE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogTW9kZWxzIGEgSFRNTCBmb250IG5hbWUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRm9udE5hbWUgewotCi0JLy8gVGhlIHVzZXIgZnJpZW5kbHkgbmFtZXMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfREVGQVVMVCA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lX2RlZmF1bHQ7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQVJJQUwgPSBSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZV9hcmlhbDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9DT1VSSUVSX05FVyA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lX2NvdXJpZXJOZXc7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfVElNRVNfTkVXX1JPTUFOID0gUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVfdGltZXNOZXdSb21hbjsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9WRVJEQU5BID0gUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVfdmVyZGFuYTsgCi0KLQkvLyBUaGUgaW50ZXJuYWwgdmFsdWVzLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9ERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9BUklBTCA9ICJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0NPVVJJRVJfTkVXID0gIkNvdXJpZXIgTmV3LCBDb3VyaWVyLCBtb25vIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1RJTUVTX05FV19ST01BTiA9ICJUaW1lcyBOZXcgUm9tYW4sIFRpbWVzLCBzZXJpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9WRVJEQU5BID0gIlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnROYW1lIERFRkFVTFQgPSBuZXcgRm9udE5hbWUoTkFNRV9ERUZBVUxULAotCQkJVkFMVUVfREVGQVVMVCk7Ci0KLQkvKioKLQkgKiBFbnVtZXJhdGlvbiBvZiBhbGwgc3VwcG9ydGVkIDxjb2RlPkhUTUxCbG9ja1RhZzwvY29kZT4uCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBGb250TmFtZSBBUklBTCA9IG5ldyBGb250TmFtZShOQU1FX0FSSUFMLCBWQUxVRV9BUklBTCk7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnROYW1lIENPVVJJRVJfTkVXID0gbmV3IEZvbnROYW1lKE5BTUVfQ09VUklFUl9ORVcsCi0JCQlWQUxVRV9DT1VSSUVSX05FVyk7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnROYW1lIFRJTUVTX05FV19ST01BTiA9IG5ldyBGb250TmFtZSgKLQkJCU5BTUVfVElNRVNfTkVXX1JPTUFOLCBWQUxVRV9USU1FU19ORVdfUk9NQU4pOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBGb250TmFtZSBWRVJEQU5BID0gbmV3IEZvbnROYW1lKE5BTUVfVkVSREFOQSwKLQkJCVZBTFVFX1ZFUkRBTkEpOwotCi0JLy8gQSBsaXN0IG9mIDxjb2RlPkZvbnROYW1lPC9jb2RlPiBvYmplY3RzLgotCXN0YXRpYyBwcml2YXRlIGZpbmFsIExpc3QgRk9OVF9OQU1FUyA9IG5ldyBBcnJheUxpc3QoKTsKLQlzdGF0aWMgewotCQlGT05UX05BTUVTLmFkZChERUZBVUxUKTsKLQkJRk9OVF9OQU1FUy5hZGQoQVJJQUwpOwotCQlGT05UX05BTUVTLmFkZChDT1VSSUVSX05FVyk7Ci0JCUZPTlRfTkFNRVMuYWRkKFRJTUVTX05FV19ST01BTik7Ci0JCUZPTlRfTkFNRVMuYWRkKFZFUkRBTkEpOwotCX0KLQotCS8vIFRoZSBmb250IG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8vIFRoZSBmb250IHZhbHVlLgotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIGZvbnQgbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIGZvbnQgdmFsdWUKLQkgKi8KLQlwdWJsaWMgRm9udE5hbWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZm9udCBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbnQgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZm9udCB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb250IHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkZvbnROYW1lPC9jb2RlPiBvYmplY3QgdGhhdCBpcyBtYXBwZWQgdG8gdGhlIGdpdmVuCi0JICogaW5kZXguCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBhbiBpbmRleCBpbnRvIHRoZSA8Y29kZT5Gb250TmFtZTwvY29kZT4gbGlzdAotCSAqIEByZXR1cm4gYSA8Y29kZT5Gb250TmFtZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBGb250TmFtZSBnZXRGb250TmFtZShpbnQgaW5kZXgpIHsKLQkJRm9udE5hbWUgcmVzdWx0ID0gKEZvbnROYW1lKSBGT05UX05BTUVTLmdldChpbmRleCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gREVGQVVMVDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvRm9udFN0eWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvRm9udFN0eWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxZmIzMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0ZvbnRTdHlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogTW9kZWxzIGEgSFRNTCBmb250IHN0eWxlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZvbnRTdHlsZSB7Ci0KLQkvLyBUaGUgdXNlciBmcmllbmRseSBuYW1lcy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9OT1JNQUwgPSBSaWNoVGV4dFJlc291cmNlcy5mb250U3R5bGVfbm9ybWFsOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1NFQ1RJT05fSEVBRElORyA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTdHlsZV9zZWN0aW9uSGVhZGluZzsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9TVUJTRUNUSU9OX0hFQURJTkcgPSBSaWNoVGV4dFJlc291cmNlcy5mb250U3R5bGVfc3Vic2VjdGlvbkhlYWRpbmc7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfU1VCX1NVQlNFQ1RJT05fSEVBRElORyA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTdHlsZV9zdWJTdWJzZWN0aW9uSGVhZGluZzsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9RVU9URSA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTdHlsZV9xdW90ZTsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9DT0RFX1NBTVBMRSA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTdHlsZV9jb2RlU2FtcGxlOyAKLQotCS8vIFRoZSBpbnRlcm5hbCB2YWx1ZXMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX05PUk1BTCA9ICI8cD4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfU0VDVElPTl9IRUFESU5HID0gIjxoMz4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfU1VCU0VDVElPTl9IRUFESU5HID0gIjxoND4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfU1VCX1NVQlNFQ1RJT05fSEVBRElORyA9ICI8aDU+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1FVT1RFID0gIjxxdW90ZT4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfQ09ERV9TQU1QTEUgPSAiPGNvZGU+IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEVudW1lcmF0aW9uIG9mIGFsbCBzdXBwb3J0ZWQgPGNvZGU+Rm9udFN0eWxlPC9jb2RlPi4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnRTdHlsZSBOT1JNQUwgPSBuZXcgRm9udFN0eWxlKE5BTUVfTk9STUFMLAotCQkJVkFMVUVfTk9STUFMKTsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udFN0eWxlIFNFQ1RJT05fSEVBRElORyA9IG5ldyBGb250U3R5bGUoCi0JCQlOQU1FX1NFQ1RJT05fSEVBRElORywgVkFMVUVfU0VDVElPTl9IRUFESU5HKTsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udFN0eWxlIFNVQlNFQ1RJT05fSEVBRElORyA9IG5ldyBGb250U3R5bGUoCi0JCQlOQU1FX1NVQlNFQ1RJT05fSEVBRElORywgVkFMVUVfU1VCU0VDVElPTl9IRUFESU5HKTsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udFN0eWxlIFNVQl9TVUJTRUNUSU9OX0hFQURJTkcgPSBuZXcgRm9udFN0eWxlKAotCQkJTkFNRV9TVUJfU1VCU0VDVElPTl9IRUFESU5HLCBWQUxVRV9TVUJfU1VCU0VDVElPTl9IRUFESU5HKTsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udFN0eWxlIFFVT1RFID0gbmV3IEZvbnRTdHlsZShOQU1FX1FVT1RFLCBWQUxVRV9RVU9URSk7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnRTdHlsZSBDT0RFX1NBTVBMRSA9IG5ldyBGb250U3R5bGUoTkFNRV9DT0RFX1NBTVBMRSwKLQkJCVZBTFVFX0NPREVfU0FNUExFKTsKLQotCS8vIEEgbGlzdCBvZiA8Y29kZT5Gb250U3R5bGU8L2NvZGU+IG9iamVjdHMuCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgTGlzdCBGT05UX1NUWUxFUyA9IG5ldyBBcnJheUxpc3QoKTsKLQlzdGF0aWMgewotCQlGT05UX1NUWUxFUy5hZGQoTk9STUFMKTsKLQkJRk9OVF9TVFlMRVMuYWRkKFNFQ1RJT05fSEVBRElORyk7Ci0JCUZPTlRfU1RZTEVTLmFkZChTVUJTRUNUSU9OX0hFQURJTkcpOwotCQlGT05UX1NUWUxFUy5hZGQoU1VCX1NVQlNFQ1RJT05fSEVBRElORyk7Ci0JCUZPTlRfU1RZTEVTLmFkZChRVU9URSk7Ci0JCUZPTlRfU1RZTEVTLmFkZChDT0RFX1NBTVBMRSk7Ci0JfQotCi0JLy8gVGhlIGZvbnQgc3R5bGUgbmFtZS4KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JLy8gVGhlIGZvbnQgc3R5bGUgdmFsdWUuCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgZm9udCBzdHlsZSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgZm9udCBzdHlsZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBGb250U3R5bGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZm9udCBzdHlsZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbnQgc3R5bGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZm9udCBzdHlsZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb250IHN0eWxlIHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkZvbnRTdHlsZTwvY29kZT4gb2JqZWN0IHRoYXQgaXMgbWFwcGVkIHRvIHRoZSBnaXZlbgotCSAqIGluZGV4LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgYW4gaW5kZXggaW50byB0aGUgPGNvZGU+Rm9udFN0eWxlPC9jb2RlPiBsaXN0Ci0JICogQHJldHVybiBhIDxjb2RlPkZvbnRTdHlsZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBGb250U3R5bGUgZ2V0Rm9udFN0eWxlKGludCBpbmRleCkgewotCQlGb250U3R5bGUgcmVzdWx0ID0gKEZvbnRTdHlsZSkgRk9OVF9TVFlMRVMuZ2V0KGluZGV4KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBOT1JNQUw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSA8Y29kZT5Gb250U3R5bGU8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSBnaXZlbgotCSAqIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb25lIG9mIHRoZSBGb250U3R5bGVzCi0JICogQHJldHVybiBhIGRpc3BsYXkgbmFtZSBvZiBhIEZvbnRTdHlsZSwgb3IgbnVsbCBpZiBub25lIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9udFN0eWxlTmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gRk9OVF9TVFlMRVMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspeyAKLQkJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpaXRlci5uZXh0KCk7Ci0JCQlpZiAoc3R5bGUuZ2V0VmFsdWUoKS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJcmV0dXJuIHN0eWxlLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvSW1hZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9JbWFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMzBkODg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9JbWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWw7Ci0KLS8qKgotICogTW9kZWxzIGEgc2ltcGxpZmllZCBIVE1MIEltYWdlIHRhZyAoPGltZz4pLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltYWdlIHsKLQotCS8vIFRoZSBpbWFnZSBVUkwuCi0JcHJpdmF0ZSBTdHJpbmcgdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SW1hZ2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBJbWFnZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBVUkwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgVVJMLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0xpbmsuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9MaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVkMDYyODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0xpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sOwotCi0vKioKLSAqIE1vZGVscyBhIHNpbXBsaWZpZWQgSFRNTCBMaW5rIHRhZyAoPGE+KS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rIHsKLQotCS8vIFRoZSBsaW5rIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgbGluayBVUkwuCi0JcHJpdmF0ZSBTdHJpbmcgdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TGluazwvY29kZT4uCi0JICovCi0JcHVibGljIExpbmsoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGluayBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGluayBuYW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaW5rIFVSTC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBoeXBlcmxpbmsgVVJMLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGh5cGVybGluay4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvSFRNTCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL1RhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjhlOWYwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbDsKLQotLyoqCi0gKiBNb2RlbHMgYSBzaW1wbGlmaWVkIEhUTUwgVGFibGUgdGFnICg8YT4pLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlIHsKLQotCS8vIFRoZSBudW1iZXIgb2Ygcm93cy4KLQlwcml2YXRlIGludCByb3dzID0gMjsKLQotCS8vIFRoZSBudW1iZXIgb2YgY29sdW1ucy4KLQlwcml2YXRlIGludCBjb2xzID0gMjsKLQotCS8vIFRoZSB0YWJsZSB3aWR0aC4KLQlwcml2YXRlIFN0cmluZyB3aWR0aCA9ICI4NSUiOwotCi0JLy8gVGhlIHR5cGUgb2YgdGFibGVoZWFkZXJzIGZvciB0aGlzIHRhYmxlLgotCXByaXZhdGUgaW50IHRhYmxlSGVhZGVycyA9IDA7Ci0KLQkvLyBUaGUgdGFibGUgc3VtbWFyeS4KLQlwcml2YXRlIFN0cmluZyBzdW1tYXJ5OwotCi0JLy8gVGhlIHRhYmxlIGNhcHRpb24uCi0JcHJpdmF0ZSBTdHJpbmcgY2FwdGlvbjsKLQotCS8vIEphdmFzY3JpcHQgY29uc3RhbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFCTEVfSEVBREVSU19OT05FID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBQkxFX0hFQURFUlNfQ09MUyA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUJMRV9IRUFERVJTX1JPV1MgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFCTEVfSEVBREVSU19CT1RIID0gMzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGFibGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBUYWJsZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFJvd3MoKSB7Ci0JCXJldHVybiByb3dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG51bWJlciBvZiByb3dzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvd3MoaW50IHJvd3MpIHsKLQkJdGhpcy5yb3dzID0gcm93czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbHVtbnMoKSB7Ci0JCXJldHVybiBjb2xzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG51bWJlciBvZiBjb2x1bW5zLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbnMoaW50IGNvbHMpIHsKLQkJdGhpcy5jb2xzID0gY29sczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YWJsZSB3aWR0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpZHRoKCkgewotCQlyZXR1cm4gd2lkdGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGFibGUgd2lkdGguCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2lkdGgoU3RyaW5nIHdpZHRoKSB7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YWJsZSBjYXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FwdGlvbigpIHsKLQkJcmV0dXJuIGNhcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGFibGUgY2FwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXB0aW9uKFN0cmluZyBjYXB0aW9uKSB7Ci0JCXRoaXMuY2FwdGlvbiA9IGNhcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFibGUgc3VtbWFyeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnkoKSB7Ci0JCXJldHVybiBzdW1tYXJ5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRhYmxlIHN1bW1hcnkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VtbWFyeShTdHJpbmcgc3VtbWFyeSkgewotCQl0aGlzLnN1bW1hcnkgPSBzdW1tYXJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhYmxlIGhlYWRlcnMgdHlwZS4gPGJyIC8+Ci0JICogT25lIG9mOiAJVEFCTEVfSEVBREVSU19OT05FLHYgVEFCTEVfSEVBREVSU19DT0xTLCBUQUJMRV9IRUFERVJTX1JPV1MsIFRBQkxFX0hFQURFUlNfQk9USAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFibGVIZWFkZXJzKCkgewotCQlyZXR1cm4gdGFibGVIZWFkZXJzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRhYmxlIGhlYWRlcnMgdHlwZS4gPGJyIC8+Ci0JICogT25lIG9mOiAJVEFCTEVfSEVBREVSU19OT05FLHYgVEFCTEVfSEVBREVSU19DT0xTLCBUQUJMRV9IRUFERVJTX1JPV1MsIFRBQkxFX0hFQURFUlNfQk9USAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlSGVhZGVycyhpbnQgdGFibGVIZWFkZXJzKSB7Ci0JCXRoaXMudGFibGVIZWFkZXJzID0gdGFibGVIZWFkZXJzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliZDcwN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHRoZSByaWNoIHRleHQgY29udHJvbCBhbmQgZWRpdG9yLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwNGRkYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSByaWNoIHRleHQgY29udHJvbCBhbmQgZWRpdG9yLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvUmljaFRleHRQcmVmZXJlbmNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmOTFiMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogVGhlIFByZWZlcmVuY2UgcGFnZSBmb3IgdGhlIHJpY2ggdGV4dCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLCBTZWxlY3Rpb25MaXN0ZW5lciwgTW9kaWZ5TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlOwotCi0JcHJpdmF0ZSBUZXh0IGxpbmVXaWR0aFRleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBpbmRlbnRDaGVja2JveDsKLQotCXByaXZhdGUgVGV4dCBpbmRlbnRTaXplVGV4dDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXN0b3JlID0gUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIHdpZHRoQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJd2lkdGhDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXdpZHRoQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxpbmVXaWR0aExhYmVsID0gbmV3IExhYmVsKHdpZHRoQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxpbmVXaWR0aExhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMubWF4Q2hhcnNQZXJMaW5lTGFiZWxfdGV4dCk7IAotCi0JCWxpbmVXaWR0aFRleHQgPSBuZXcgVGV4dCh3aWR0aENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWxpbmVXaWR0aFRleHQuc2V0VGV4dChzdG9yZS5nZXRTdHJpbmcoUmljaFRleHRQcmVmZXJlbmNlcy5MSU5FX1dJRFRIKSk7Ci0JCWxpbmVXaWR0aFRleHQuc2V0VGV4dExpbWl0KDMpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyNTsKLQkJbGluZVdpZHRoVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJbGluZVdpZHRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29tcG9zaXRlIGluZGVudENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWluZGVudENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJaW5kZW50Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWluZGVudENoZWNrYm94ID0gbmV3IEJ1dHRvbihpbmRlbnRDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWluZGVudENoZWNrYm94LnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuaW5kZW50SFRNTENoZWNrYm94X3RleHQpOyAKLQkJaW5kZW50Q2hlY2tib3guc2V0U2VsZWN0aW9uKHN0b3JlCi0JCQkJLmdldEJvb2xlYW4oUmljaFRleHRQcmVmZXJlbmNlcy5JTkRFTlQpKTsKLQotCQluZXcgTGFiZWwoaW5kZW50Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJTGFiZWwgaW5kZW50U2l6ZUxhYmVsID0gbmV3IExhYmVsKGluZGVudENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCWluZGVudFNpemVMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaW5kZW50U2l6ZUxhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuaW5kZW50U2l6ZUxhYmVsX3RleHQpOyAKLQotCQlpbmRlbnRTaXplVGV4dCA9IG5ldyBUZXh0KGluZGVudENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWluZGVudFNpemVUZXh0Ci0JCQkJLnNldFRleHQoc3RvcmUuZ2V0U3RyaW5nKFJpY2hUZXh0UHJlZmVyZW5jZXMuSU5ERU5UX1NJWkUpKTsKLQkJaW5kZW50U2l6ZVRleHQuc2V0VGV4dExpbWl0KDEpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAxMDsKLQkJaW5kZW50U2l6ZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWluZGVudFNpemVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZS5wZXJmb3JtRGVmYXVsdHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlsaW5lV2lkdGhUZXh0LnNldFRleHQoc3RvcmUKLQkJCQkuZ2V0RGVmYXVsdFN0cmluZyhSaWNoVGV4dFByZWZlcmVuY2VzLkxJTkVfV0lEVEgpKTsKLQkJaW5kZW50Q2hlY2tib3guc2V0U2VsZWN0aW9uKHN0b3JlCi0JCQkJLmdldERlZmF1bHRCb29sZWFuKFJpY2hUZXh0UHJlZmVyZW5jZXMuSU5ERU5UKSk7Ci0JCWluZGVudFNpemVUZXh0LnNldFRleHQoc3RvcmUKLQkJCQkuZ2V0RGVmYXVsdFN0cmluZyhSaWNoVGV4dFByZWZlcmVuY2VzLklOREVOVF9TSVpFKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlLnBlcmZvcm1PawotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJU3RyaW5nIGxpbmVXaWR0aFZhbHVlID0gbGluZVdpZHRoVGV4dC5nZXRUZXh0KCk7Ci0JCWlmIChsaW5lV2lkdGhWYWx1ZSAhPSBudWxsICYmIGxpbmVXaWR0aFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJdHJ5IHsKLQkJCQlpbnQgbGluZVdpZHRoID0gSW50ZWdlci5wYXJzZUludChsaW5lV2lkdGhWYWx1ZSk7Ci0JCQkJc3RvcmUuc2V0VmFsdWUoUmljaFRleHRQcmVmZXJlbmNlcy5MSU5FX1dJRFRILCBsaW5lV2lkdGgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gaW5kZW50VmFsdWUgPSBpbmRlbnRDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQkJc3RvcmUuc2V0VmFsdWUoUmljaFRleHRQcmVmZXJlbmNlcy5JTkRFTlQsIGluZGVudFZhbHVlKTsKLQotCQlTdHJpbmcgaW5kZW50U2l6ZVZhbHVlID0gaW5kZW50U2l6ZVRleHQuZ2V0VGV4dCgpOwotCQlpZiAoaW5kZW50U2l6ZVZhbHVlICE9IG51bGwgJiYgaW5kZW50U2l6ZVZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJdHJ5IHsKLQkJCQlpbnQgaW5kZW50U2l6ZSA9IEludGVnZXIucGFyc2VJbnQoaW5kZW50U2l6ZVZhbHVlKTsKLQkJCQlzdG9yZS5zZXRWYWx1ZShSaWNoVGV4dFByZWZlcmVuY2VzLklOREVOVF9TSVpFLCBpbmRlbnRTaXplKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIjbW9kaWZ5VGV4dChNb2RpZnlFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvUmljaFRleHRQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0MmVhZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogUHJlZmVyZW5jZXMgZm9yIHRoZSByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0UHJlZmVyZW5jZXMgewotCi0JLyoqCi0JICogcmljaCB0ZXh0IEVkaXRvciBwcmVmZXJlbmNlIGtleXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9XSURUSCA9ICJodG1sRWRpdG9yLmxpbmVXaWR0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVCA9ICJodG1sRWRpdG9yLmluZGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVF9TSVpFID0gImh0bWxFZGl0b3IuaW5kZW50U2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKLQkJc3RvcmUuc2V0RGVmYXVsdChMSU5FX1dJRFRILCAxMjApOwotCQlzdG9yZS5zZXREZWZhdWx0KElOREVOVCwgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSU5ERU5UX1NJWkUsIDQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VzSW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvUmljaFRleHRQcmVmZXJlbmNlc0luaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1OTU2ZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VzSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIFRoZSByaWNoIHRleHQgcHJlZmVyZW5jZXMgaW5pdGlhbGl6ZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRQcmVmZXJlbmNlc0luaXRpYWxpemVyIGV4dGVuZHMKLQkJQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJUmljaFRleHRQcmVmZXJlbmNlcy5pbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKHN0b3JlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1YTc1ZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSByaWNoIHRleHQgY29udHJvbCBhbmQgZWRpdG9yLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhYzk2YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBTZWFyY2ggVUkgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmYTU1MjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiMWMzOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5TZWFyY2hVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwKLSBvcmcuZWNsaXBzZS5zZWFyY2gKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzIxZGM2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFNlYXJjaC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RTZWFyY2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4M2MwZjQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFNlYXJjaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlhOWE2MDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBTZWFyY2ggVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIE1ldGhvZCBTZWFyY2ggRGlhbG9nCi1tZXRob2RTZWFyY2hEaWFsb2dMYWJlbD1NZXRob2QgU2VhcmNoCi0KLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0ZGVlNGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uuc2VhcmNoLnNlYXJjaFBhZ2VzIj4KLSAgICAgIDxwYWdlIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLk1ldGhvZFNlYXJjaFBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5NZXRob2RTZWFyY2hQYWdlIiAgICAgIAotICAgICAgICAgICAgbGFiZWw9IiVtZXRob2RTZWFyY2hEaWFsb2dMYWJlbCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kU2VhcmNoLmdpZiIKLSAgICAgICAgICAgIHNpemVIaW50PSIyNTAsMTYwIgotICAgICAgICAgICAgdGFiUG9zaXRpb249IjAiCi0gICAgICAgICAgICBleHRlbnNpb25zPSIqOjEiCi0gICAgICAgICAgICBzaG93U2NvcGVTZWN0aW9uPSJmYWxzZSIJCQotICAgICAgICAgICAgY2FuU2VhcmNoRW5jbG9zaW5nUHJvamVjdHM9ImZhbHNlIj4KLSAgICAgIDwvcGFnZT4gICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Ik1ldGhvZFNlYXJjaFBhZ2UiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc2VhcmNoLnNlYXJjaFJlc3VsdFZpZXdQYWdlcyI+Ci0gICAgICA8dmlld1BhZ2UKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLk1ldGhvZFNlYXJjaFJlc3VsdFBhZ2UiCi0JCQlzZWFyY2hSZXN1bHRDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5NZXRob2RTZWFyY2hSZXN1bHQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5NZXRob2RTZWFyY2hSZXN1bHRQYWdlIj4KLSAgICAgIDwvdmlld1BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4gICAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvTWV0aG9kU2VhcmNoUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL01ldGhvZFNlYXJjaFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTRmMTk1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvTWV0aG9kU2VhcmNoUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLk1ldGhvZFNlYXJjaElucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuTWV0aG9kU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5NZXRob2RTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLk1ldGhvZFNlYXJjaFNjb3BlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkucHJlZmVyZW5jZXMuU2VhcmNoVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFBhZ2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIE1ldGhvZCBTZWFyY2ggcGFnZSBpbiB0aGUgU2VhcmNoIGRpYWxvZy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hQYWdlIGV4dGVuZHMgRGlhbG9nUGFnZSBpbXBsZW1lbnRzIElTZWFyY2hQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSF9QQUdFX0lEID0gTWV0aG9kU2VhcmNoUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgQ29tYm8gc2VhcmNoU3RyaW5nQ29tYm87Ci0KLQlwcml2YXRlIENvbWJvIG5hbWVQYXR0ZXJuQ29tYm87Ci0KLQlwcml2YXRlIEJ1dHRvbiBjYXNlU2Vuc2l0aXZlQ2hlY2tib3g7Ci0KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFNjb3BlVmlld2VyIHNlYXJjaFNjb3BlVmlld2VyOwotCi0JcHJpdmF0ZSBJU2VhcmNoUGFnZUNvbnRhaW5lciBjb250YWluZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgc2VhcmNoU3RyaW5nTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXNlYXJjaFN0cmluZ0xhYmVsLnNldFRleHQoU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoU3RyaW5nTGFiZWxfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJc2VhcmNoU3RyaW5nQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXNlYXJjaFN0cmluZ0NvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlTdHJpbmcgc2F2ZWRTZWFyY2hTdHJpbmcgPSBTZWFyY2hVSVByZWZlcmVuY2VzLmdldFNlYXJjaFN0cmluZygpOwotCQlpZiAoc2F2ZWRTZWFyY2hTdHJpbmcgIT0gbnVsbCAmJiBzYXZlZFNlYXJjaFN0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCXNlYXJjaFN0cmluZ0NvbWJvLnNldFRleHQoc2F2ZWRTZWFyY2hTdHJpbmcpOwotCQl9Ci0KLQkJY2FzZVNlbnNpdGl2ZUNoZWNrYm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWNhc2VTZW5zaXRpdmVDaGVja2JveC5zZXRUZXh0KFNlYXJjaFVJUmVzb3VyY2VzLmNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQljYXNlU2Vuc2l0aXZlQ2hlY2tib3guc2V0U2VsZWN0aW9uKFNlYXJjaFVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0Q2FzZVNlbnNpdGl2ZSgpKTsKLQotCQlMYWJlbCBlbGVtZW50TmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQllbGVtZW50TmFtZUxhYmVsLnNldFRleHQoU2VhcmNoVUlSZXNvdXJjZXMuZWxlbWVudE5hbWVMYWJlbF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQluYW1lUGF0dGVybkNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQluYW1lUGF0dGVybkNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlTdHJpbmcgc2F2ZWROYW1lUGF0dGVybiA9IFNlYXJjaFVJUHJlZmVyZW5jZXMuZ2V0TmFtZVBhdHRlcm4oKTsKLQkJaWYgKHNhdmVkTmFtZVBhdHRlcm4gIT0gbnVsbCAmJiBzYXZlZE5hbWVQYXR0ZXJuLmxlbmd0aCgpID4gMCkgewotCQkJbmFtZVBhdHRlcm5Db21iby5zZXRUZXh0KHNhdmVkTmFtZVBhdHRlcm4pOwotCQl9IGVsc2UgewotCQkJbmFtZVBhdHRlcm5Db21iby5zZXRUZXh0KCIqIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCW5hbWVQYXR0ZXJuQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY29udGFpbmVyLnNldFBlcmZvcm1BY3Rpb25FbmFibGVkKGdldFNlYXJjaEJ1dHRvbkVuYWJsZWQoKSk7Ci0JCQl9Ci0JCX0pOwotCQluYW1lUGF0dGVybkNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQljb250YWluZXIuc2V0UGVyZm9ybUFjdGlvbkVuYWJsZWQoZ2V0U2VhcmNoQnV0dG9uRW5hYmxlZCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCUdyb3VwIHNlYXJjaFNjb3BlR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXNlYXJjaFNjb3BlR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIHNlYXJjaFNjb3BlR3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZWFyY2hTY29wZUdyb3VwR3JpZERhdGEuaGVpZ2h0SGludCA9IDIwMDsKLQkJc2VhcmNoU2NvcGVHcm91cC5zZXRMYXlvdXREYXRhKHNlYXJjaFNjb3BlR3JvdXBHcmlkRGF0YSk7Ci0JCXNlYXJjaFNjb3BlR3JvdXAuc2V0VGV4dChTZWFyY2hVSVJlc291cmNlcy5zY29wZUdyb3VwX3RleHQpOyAvLyROT04tTkxTLTEkCi0KLQkJc2VhcmNoU2NvcGVWaWV3ZXIgPSBuZXcgTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIoc2VhcmNoU2NvcGVHcm91cCwKLQkJCQlTV1QuTk9ORSk7Ci0KLQkJY29udGFpbmVyLnNldFBlcmZvcm1BY3Rpb25FbmFibGVkKGdldFNlYXJjaEJ1dHRvbkVuYWJsZWQoKSk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFBhZ2UjcGVyZm9ybUFjdGlvbigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUFjdGlvbigpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hFcnJvcl90aXRsZSwgCi0JCQkJCVNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaEVycm9yX21zZywgCi0JCQkJCVNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaEVycm9yX3JlYXNvbik7IAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBzZWFyY2hTdHJpbmcgPSBzZWFyY2hTdHJpbmdDb21iby5nZXRUZXh0KCk7Ci0JCVN0cmluZyBuYW1lUGF0dGVybiA9IG5hbWVQYXR0ZXJuQ29tYm8uZ2V0VGV4dCgpOwotCQlNZXRob2RTZWFyY2hTY29wZSBzZWFyY2hTY29wZSA9IHNlYXJjaFNjb3BlVmlld2VyLmdldFNlYXJjaFNjb3BlKCk7Ci0JCU1ldGhvZFNlYXJjaElucHV0IHNlYXJjaElucHV0ID0gbmV3IE1ldGhvZFNlYXJjaElucHV0KHNlYXJjaFN0cmluZywKLQkJCQluYW1lUGF0dGVybiwgY2FzZVNlbnNpdGl2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpLCBmYWxzZSwKLQkJCQlmYWxzZSwgc2VhcmNoU2NvcGUpOwotCQlNZXRob2RTZWFyY2hRdWVyeSBzZWFyY2hRdWVyeSA9IG5ldyBNZXRob2RTZWFyY2hRdWVyeShzZWFyY2hJbnB1dCk7Ci0JCU5ld1NlYXJjaFVJLmFjdGl2YXRlU2VhcmNoUmVzdWx0VmlldygpOwotCQlOZXdTZWFyY2hVSS5ydW5RdWVyeUluQmFja2dyb3VuZChzZWFyY2hRdWVyeSk7Ci0JCVNlYXJjaFVJUHJlZmVyZW5jZXMuc2V0U2VhcmNoU3RyaW5nKHNlYXJjaFN0cmluZ0NvbWJvLmdldFRleHQoKSk7Ci0JCVNlYXJjaFVJUHJlZmVyZW5jZXMuc2V0TmFtZVBhdHRlcm4obmFtZVBhdHRlcm5Db21iby5nZXRUZXh0KCkpOwotCQlTZWFyY2hVSVByZWZlcmVuY2VzLnNldENhc2VTZW5zaXRpdmUoY2FzZVNlbnNpdGl2ZUNoZWNrYm94Ci0JCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFBhZ2Ujc2V0Q29udGFpbmVyKElTZWFyY2hQYWdlQ29udGFpbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihJU2VhcmNoUGFnZUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVJlcGxhY2VQYWdlI3BlcmZvcm1SZXBsYWNlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtUmVwbGFjZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGVuYWJsZWQgc3RhdHVzIG9mIHRoZSBTZWFyY2ggYnV0dG9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTxjb2RlPiBpZiB0aGUgU2VhcmNoIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBnZXRTZWFyY2hCdXR0b25FbmFibGVkKCkgewotCQlyZXR1cm4gbmFtZVBhdHRlcm5Db21iby5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9NZXRob2RTZWFyY2hSZXN1bHRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvTWV0aG9kU2VhcmNoUmVzdWx0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NjhhMWM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9NZXRob2RTZWFyY2hSZXN1bHRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5Ccm93c2luZ1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29udGVudFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLk1ldGhvZEVsZW1lbnRWaWV3U29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuU2VhcmNoUmVzdWx0TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLlNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIE1ldGhvZCBTZWFyY2ggcmVzdWx0IGluIHRoZSBTZWFyY2ggdmlldy4gVGhlIHNlYXJjaCByZXN1bHQKLSAqIGNhbiBiZSBkaXNwbGF5ZWQgaW4gYSBoaWVyYXJjaGljYWwgb3IgZmxhdCB2aWV3LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaFJlc3VsdFBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZQotCQlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIFNlYXJjaFJlc3VsdExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaFJlc3VsdFBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgU2VhcmNoUmVzdWx0TGFiZWxQcm92aWRlcigpOwotCQkKLQkJLy8gQ2xlYXIgdGhlIHNlYXJjaCByZXN1bHQgd2hlbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBpcyBjbG9zZWQgYnkgdGhlIHVzZXIuCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobmV3IExpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCU1ldGhvZFNlYXJjaFJlc3VsdFBhZ2UudGhpcy5nZXRJbnB1dCgpLnJlbW92ZUFsbCgpOwotCQkJfQkJCQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI2lzTGF5b3V0U3VwcG9ydGVkKGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xheW91dFN1cHBvcnRlZChpbnQgbGF5b3V0KSB7Ci0JCXJldHVybiAoKGxheW91dCAmIEZMQUdfTEFZT1VUX0ZMQVQpICE9IDAgfHwgKGxheW91dCAmIEZMQUdfTEFZT1VUX1RSRUUpICE9IDApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UjY29uZmlndXJlVHJlZVZpZXdlcihUcmVlVmlld2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVRyZWVWaWV3ZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IFNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIoKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldFNvcnRlcihuZXcgTWV0aG9kRWxlbWVudFZpZXdTb3J0ZXIoKSk7Ci0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNjb25maWd1cmVUYWJsZVZpZXdlcihUYWJsZVZpZXdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVUYWJsZVZpZXdlcihUYWJsZVZpZXdlciB2aWV3ZXIpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyKCk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRTb3J0ZXIobmV3IE1ldGhvZEVsZW1lbnRWaWV3U29ydGVyKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UjZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSBvYmplY3RzKSB7Ci0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRlbnRQcm92aWRlciBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIpIHsKLQkJCQkoKFNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIpIGNvbnRlbnRQcm92aWRlcikKLQkJCQkJCS5lbGVtZW50c0NoYW5nZWQob2JqZWN0cyk7Ci0JCQl9IGVsc2UgaWYgKGNvbnRlbnRQcm92aWRlciBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJKChTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlcikgY29udGVudFByb3ZpZGVyKQotCQkJCQkJLmVsZW1lbnRzQ2hhbmdlZChvYmplY3RzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UjY2xlYXIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFyKCkgewotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWlmIChjb250ZW50UHJvdmlkZXIgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJKChTZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXIpLmNsZWFyKCk7Ci0JCQl9IGVsc2UgaWYgKGNvbnRlbnRQcm92aWRlciBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJKChTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlcikgY29udGVudFByb3ZpZGVyKS5jbGVhcigpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNzaG93TWF0Y2goTWF0Y2gsCi0JICogICAgICBpbnQsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93TWF0Y2goTWF0Y2ggbWF0Y2gsIGludCBjdXJyZW50T2Zmc2V0LCBpbnQgY3VycmVudExlbmd0aCwKLQkJCWJvb2xlYW4gYWN0aXZhdGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWlmIChtYXRjaC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIGFjdGl2YXRlKSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgbWF0Y2guZ2V0RWxlbWVudCgpOwotCQkJaWYgKFBlcnNwZWN0aXZlVXRpbAotCQkJCQkuaXNBY3RpdmVQZXJzcGVjdGl2ZShCcm93c2luZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKSkgewotCQkJCVBlcnNwZWN0aXZlVXRpbAotCQkJCQkJLm9wZW5QZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCQlJVmlld1BhcnQgdmlldyA9IGFjdGl2ZVBhZ2UKLQkJCQkJCQkuZmluZFZpZXcoTmV3U2VhcmNoVUkuU0VBUkNIX1ZJRVdfSUQpOwotCQkJCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQkJCQlhY3RpdmVQYWdlLnNob3dWaWV3KE5ld1NlYXJjaFVJLlNFQVJDSF9WSUVXX0lEKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWRpc3BsYXlFZGl0b3IoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgTWV0aG9kIGVkaXRvciBmb3IgdGhlIHNlbGVjdGVkIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3BsYXlFZGl0b3IoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKAotCQkJCQlVbWFVdGlsLmdldFByb2Nlc3NDb21wb25lbnQoZWxlbWVudCkpOwotCQl9IGVsc2UgewotCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAoUGVyc3BlY3RpdmVVdGlsCi0JCQkJLmlzQWN0aXZlUGVyc3BlY3RpdmUoQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCkpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQlPYmplY3RbXSBzZWxlY3RlZEVsZW1lbnRzID0gc2VsLnRvQXJyYXkoKTsKLQkJCQlpZiAoc2VsZWN0ZWRFbGVtZW50cyAhPSBudWxsICYmIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJCQlpZiAoc2VsZWN0ZWRFbGVtZW50c1swXSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZGlzcGxheUhUTUxQYWdlKChNZXRob2RFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnRzWzBdKTsKLQkJCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBIVE1MIGNvbnRlbnQgcGFnZSBmb3IgdGhlIHNlbGVjdGVkIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBDb250ZW50IHZpZXcgY2Fubm90IGJlIGRpc3BsYXllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3BsYXlIVE1MUGFnZShNZXRob2RFbGVtZW50IGVsZW1lbnQpCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbgotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJSVZpZXdQYXJ0IHZpZXcgPSBhY3RpdmVQYWdlLmZpbmRWaWV3KENvbnRlbnRWaWV3LlZJRVdfSUQpOwotCQkJaWYgKHZpZXcgPT0gbnVsbCkgewotCQkJCXZpZXcgPSBhY3RpdmVQYWdlLnNob3dWaWV3KENvbnRlbnRWaWV3LlZJRVdfSUQpOwotCQkJfQotCQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJCSgoQ29udGVudFZpZXcpIHZpZXcpLmRpc3BsYXlIVE1MQ29udGVudFBhZ2UoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODMzMzliYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIE1ldGhvZCBTZWFyY2ggUGFnZQotc2VhcmNoU3RyaW5nTGFiZWxfdGV4dD1UZXh0ICgqID0gYW55IHN0cmluZywgPyA9IGFueSBjaGFyYWN0ZXIpOgotY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQ9Q2FzZSBzZW5zaXRpdmUKLWVsZW1lbnROYW1lTGFiZWxfdGV4dD1NZXRob2QgZWxlbWVudCBuYW1lIG9yIHByZXNlbnRhdGlvbiBuYW1lIHBhdHRlcm46Ci1zY29wZUdyb3VwX3RleHQ9U2NvcGUKLXJvbGVDaGVja2JveF90ZXh0PVJvbGUKLXRhc2tDaGVja2JveF90ZXh0PVRhc2sKLXdvcmtQcm9kdWN0Q2hlY2tib3hfdGV4dD1Xb3JrIFByb2R1Y3QKLQotIyBNZXRob2QgU2VhcmNoIFF1ZXJ5Ci1zZWFyY2hRdWVyeV90ZXh0PU1ldGhvZCBTZWFyY2gKLQotIyBNZXRob2QgU2VhcmNoIFByb2dyZXNzIERpYWxvZwotc2NhbkxpYnJhcnlUYXNrX25hbWU9U2Nhbm5pbmcgbWV0aG9kIGxpYnJhcnkuLi4KLXNjYW5FbGVtZW50VGFza19uYW1lPVNjYW5uaW5nIG1ldGhvZCBlbGVtZW50ICcnezB9JycuLi4KLQotIyBNZXRob2QgU2VhcmNoIEVycm9yIERpYWxvZwotc2VhcmNoRXJyb3JfdGl0bGU9TWV0aG9kIFNlYXJjaAotc2VhcmNoRXJyb3JfbXNnPUlVUFMwMTAwRTogU2VhcmNoIG9wZXJhdGlvbiBjYW5ub3QgcHJvY2VlZC4KLXNlYXJjaEVycm9yX3JlYXNvbj1ObyBtZXRob2QgbGlicmFyeSBpcyBjdXJyZW50bHkgb3BlbmVkLlxuXG5PcGVuIGEgbWV0aG9kIGxpYnJhcnkgYW5kIHRyeSBhZ2Fpbi4KLQotIyBNZXRob2QgU2VhcmNoIFJlc3VsdAotc2VhcmNoUmVzdWx0X21ldGhvZENvbnRlbnQ9TWV0aG9kIENvbnRlbnQKLXNlYXJjaFJlc3VsdF9jb250ZW50UGFja2FnZXM9Q29udGVudCBQYWNrYWdlcwotc2VhcmNoUmVzdWx0X3N0YW5kYXJkQ2F0ZWdvcmllcz1TdGFuZGFyZCBDYXRlZ29yaWVzCi1zZWFyY2hSZXN1bHRfZGlzY2lwbGluZXM9RGlzY2lwbGluZXMKLXNlYXJjaFJlc3VsdF9kb21haW5zPURvbWFpbnMKLXNlYXJjaFJlc3VsdF93b3JrUHJvZHVjdFR5cGVzPVdvcmsgUHJvZHVjdCBUeXBlcwotc2VhcmNoUmVzdWx0X3JvbGVTZXRzPVJvbGUgU2V0cwotc2VhcmNoUmVzdWx0X3Rvb2xzPVRvb2xzCi1zZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllcz1DdXN0b20gQ2F0ZWdvcmllcwotc2VhcmNoUmVzdWx0X3Byb2Nlc3Nlcz1Qcm9jZXNzZXMKLXNlYXJjaFJlc3VsdF9jYXBhYmlsaXR5UGF0dGVybnM9Q2FwYWJpbGl0eSBQYXR0ZXJucwotc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzPURlbGl2ZXJ5IFByb2Nlc3Nlcwotc2VhcmNoUmVzdWx0X21hdGNoPScnezB9JycgLSAxIG1hdGNoCi1zZWFyY2hSZXN1bHRfbWF0Y2hlcz0nJ3swfScnIC0gezF9IG1hdGNoZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9TZWFyY2hVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1NlYXJjaFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmZTQ2OGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1NlYXJjaFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIFNlYXJjaCBVSSBwbHVnLWluIGFjdGl2YXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBTZWFyY2hVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWFyY2hVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlYXJjaFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvU2VhcmNoVUlSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9TZWFyY2hVSVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzBkMzJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9TZWFyY2hVSVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIFNlYXJjaCBVSSByZXNvdXJjZSBidW5kbGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VhcmNoVUlSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gU2VhcmNoVUlSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoU3RyaW5nTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudE5hbWVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2NvcGVHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUNoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFF1ZXJ5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzY2FuTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNjYW5FbGVtZW50VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoRXJyb3JfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfbWV0aG9kQ29udGVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9jb250ZW50UGFja2FnZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X2Rpc2NpcGxpbmVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X2RvbWFpbnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfd29ya1Byb2R1Y3RUeXBlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9yb2xlU2V0czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF90b29sczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9jdXN0b21DYXRlZ29yaWVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X3Byb2Nlc3NlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9jYXBhYmlsaXR5UGF0dGVybnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfZGVsaXZlcnlQcm9jZXNzZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfbWF0Y2g7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfbWF0Y2hlczsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFNlYXJjaFVJUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFNlYXJjaFVJUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUuCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hRdWVyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYzhlZGFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgbWV0aG9kIHNlYXJjaCBxdWVyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RTZWFyY2hRdWVyeSBleHRlbmRzIElTZWFyY2hRdWVyeSB7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSVNlYXJjaFJlc3VsdENvbGxlY3Rvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lTZWFyY2hSZXN1bHRDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwYjUwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSVNlYXJjaFJlc3VsdENvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIG1ldGhvZCBzZWFyY2ggcmVzdWx0IGNvbGxlY3Rvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlYXJjaFJlc3VsdENvbGxlY3RvciB7Ci0KLQkvKioKLQkgKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIG9iamVjdCB0byBzZWUgaWYgdGhlcmUgaXMgYSBtYXRjaCBpbiB0aGUgc2VhcmNoCi0JICogY3JpdGVyaWEuCi0JICogCi0JICogQHBhcmFtIG1hdGNoCi0JICogICAgICAgICAgICBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgbWV0aG9kIGVsZW1lbnQgdG8gbWF0Y2gKLQkgKi8KLQl2b2lkIGFjY2VwdChPYmplY3QgbWF0Y2gpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudFZpZXdTb3J0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50Vmlld1NvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YmM0MWNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50Vmlld1NvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotCi0vKioKLSAqIFNvcnRzIHRoZSBtZXRob2QgZWxlbWVudHMgaW4gYSBzcGVjaWZpYyBvcmRlciBmb3IgZGlzcGxheSBpbiB0aGUgU2VhcmNoCi0gKiB2aWV3LgotICogPHA+Ci0gKiBUaGUgbWV0aG9kIGVsZW1lbnRzIGFyZSBzb3J0ZWQgYnkgdHlwZXMuIFdpdGhpbiBlYWNoIHR5cGUsIHRoZSBlbGVtZW50cyBhcmUKLSAqIHNvcnRlZCBhbHBoYWJldGljYWxseSBieSBuYW1lcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50Vmlld1NvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50Vmlld1NvcnRlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyI2NvbXBhcmUoVmlld2VyLCBPYmplY3QsCi0JICogICAgICBPYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCWlmIChlMSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJaWYgKCEoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmICghKGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgUm9sZSkgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoIShlMiBpbnN0YW5jZW9mIFJvbGUpKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgVGFzaykgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKCEoZTIgaW5zdGFuY2VvZiBUYXNrKSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFJvbGUgfHwgZTIgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKCEoZTIgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBSb2xlIHx8IGUyIGluc3RhbmNlb2YgVGFzawotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKGUyIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQlTdHJpbmcgbmFtZTEgPSBlMS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgbmFtZTIgPSBlMi5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQlpZiAoIW5hbWUxLmVxdWFscyhuYW1lMikpIHsKLQkJCQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUobmFtZTEsIG5hbWUyKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBSb2xlIHx8IGUyIGluc3RhbmNlb2YgVGFzawotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0IHx8IGUyIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeQotCQkJCQkmJiAhKGUyIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKCEoZTEgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQkJJiYgZTIgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0gZWxzZSBpZiAoZTIgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCQlTdHJpbmcgbmFtZTEgPSBlMS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgbmFtZTIgPSBlMi5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQlpZiAoIW5hbWUxLmVxdWFscyhuYW1lMikpIHsKLQkJCQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUobmFtZTEsIG5hbWUyKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoZTIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSAmJiAhKGUyIGluc3RhbmNlb2YgUHJvY2VzcykpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoIShlMiBpbnN0YW5jZW9mIFByb2Nlc3MpKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoZTIgaW5zdGFuY2VvZiBQcm9jZXNzICYmICEoZTEgaW5zdGFuY2VvZiBQcm9jZXNzKSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0gZWxzZSBpZiAoIShlMiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZTIgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQgfHwgZTIgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCQlpZiAoIShlMiBpbnN0YW5jZW9mIFBoYXNlKSkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJCWlmIChlMiBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQlpZiAoIShlMiBpbnN0YW5jZW9mIEl0ZXJhdGlvbikpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWlmIChlMiBpbnN0YW5jZW9mIFBoYXNlIHx8IGUyIGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQlpZiAoIShlMiBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCWlmIChlMiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQlpZiAoIShlMiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCWlmIChlMiBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IGUyIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQlpZiAoIShlMiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGUyIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgZTIgaW5zdGFuY2VvZiBNaWxlc3RvbmUKLQkJCQkJCXx8IGUyIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWlmICghKGUyIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGUyIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgZTIgaW5zdGFuY2VvZiBNaWxlc3RvbmUKLQkJCQkJCXx8IGUyIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IKLQkJCQkJCXx8IGUyIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWlmICghKGUyIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hJbnB1dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaElucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxNGQwNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaElucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgdGhlIHNlYXJjaCBzdHJpbmdzIGFuZCBvcHRpb25zIHRoYXQgYXJlIHVzZWQgYXMgaW5wdXRzIHRvIGEKLSAqIG1ldGhvZCBzZWFyY2guCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VhcmNoSW5wdXQgewotCi0JcHJpdmF0ZSBTdHJpbmcgc2VhcmNoU3RyaW5nOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZVBhdHRlcm47Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZTsKLQotCXByaXZhdGUgYm9vbGVhbiB3aG9sZVdvcmQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVnRXhwOwotCi0JcHJpdmF0ZSBNZXRob2RTZWFyY2hTY29wZSBzZWFyY2hTY29wZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHNlYXJjaFN0cmluZwotCSAqICAgICAgICAgICAgYSBzZWFyY2ggc3RyaW5nCi0JICogQHBhcmFtIG5hbWVQYXR0ZXJuCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50IG5hbWUgcGF0dGVybgotCSAqIEBwYXJhbSBjYXNlU2Vuc2l0aXZlCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgbWFrZSB0aGUgc2VhcmNoIGNhc2Ugc2Vuc2l0aXZlCi0JICogQHBhcmFtIHdob2xlV29yZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHNlYXJjaCBmb3Igd2hvbGUgd29yZCBvbmx5Ci0JICogQHBhcmFtIHJlZ0V4cAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHNlYXJjaCB1c2luZyByZWd1bGFyIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gc2VhcmNoU2NvcGUKLQkgKiAgICAgICAgICAgIGEgc2VhcmNoIHNjb3BlCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaElucHV0KFN0cmluZyBzZWFyY2hTdHJpbmcsIFN0cmluZyBuYW1lUGF0dGVybiwKLQkJCWJvb2xlYW4gY2FzZVNlbnNpdGl2ZSwgYm9vbGVhbiB3aG9sZVdvcmQsIGJvb2xlYW4gcmVnRXhwLAotCQkJTWV0aG9kU2VhcmNoU2NvcGUgc2VhcmNoU2NvcGUpIHsKLQkJdGhpcy5zZWFyY2hTdHJpbmcgPSBzZWFyY2hTdHJpbmc7Ci0JCXRoaXMubmFtZVBhdHRlcm4gPSBuYW1lUGF0dGVybjsKLQkJdGhpcy5jYXNlU2Vuc2l0aXZlID0gY2FzZVNlbnNpdGl2ZTsKLQkJdGhpcy53aG9sZVdvcmQgPSB3aG9sZVdvcmQ7Ci0JCXRoaXMucmVnRXhwID0gcmVnRXhwOwotCQl0aGlzLnNlYXJjaFNjb3BlID0gc2VhcmNoU2NvcGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VhcmNoIHN0cmluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZWFyY2ggc3RyaW5nIHRvIGxvb2sgZm9yIHRoZSBNZXRob2QgZWxlbWVudCBjb250ZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWFyY2hTdHJpbmcoKSB7Ci0JCXJldHVybiBzZWFyY2hTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBwYXR0ZXJuLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgcGF0dGVybiB1c2VkIHRvIG1hdGNoIHRoZSBNZXRob2QgZWxlbWVudCBuYW1lcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVBhdHRlcm4oKSB7Ci0JCXJldHVybiBuYW1lUGF0dGVybjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjYXNlIHNlbnNpdGl2aXR5IG9mIHRoZSBzZWFyY2guCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VhcmNoIGlzIGNhc2Ugc2Vuc2l0aXZlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Q2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIGNhc2VTZW5zaXRpdmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2hvbGUgd29yZCBvcHRpb24gb2YgdGhlIHNlYXJjaC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZWFyY2ggaXMgYmFzZWQgb24gd2hvbGUgd29yZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFdob2xlV29yZCgpIHsKLQkJcmV0dXJuIHdob2xlV29yZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gb3B0aW9uIG9mIHRoZSBzZWFyY2guCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VhcmNoIGlzIGJhc2VkIG9uIHJlZ3VsYXIgZXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFJlZ3VsYXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gcmVnRXhwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlYXJjaCBzY29wZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZWFyY2ggc2NvcGUKLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoU2NvcGUgZ2V0U2VhcmNoU2NvcGUoKSB7Ci0JCXJldHVybiBzZWFyY2hTY29wZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTMzOTM5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwuQWJzdHJhY3RTQVhQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5TZWFyY2hVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLlNlYXJjaFVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqIFBlcmZvcm1zIGEgbWV0aG9kIHNlYXJjaCBieSBpdGVyYXRpbmcgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgYW5kIHBhcnNpbmcKLSAqIHRoZSBjb250ZW50IGVsZW1lbnQgWE1JIGZpbGVzIHdoZXJlIG5lY2Vzc2FyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hPcGVyYXRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDQU5fTElCUkFSWV9URVhUID0gU2VhcmNoVUlSZXNvdXJjZXMuc2NhbkxpYnJhcnlUYXNrX25hbWU7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FOX0VMRU1FTlRfVEVYVCA9IFNlYXJjaFVJUmVzb3VyY2VzLnNjYW5FbGVtZW50VGFza19uYW1lOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGJvb2xlYW4gZGVidWc7Ci0KLQlwcml2YXRlIE1ldGhvZFNlYXJjaElucHV0IHNlYXJjaElucHV0OwotCi0JcHJpdmF0ZSBJU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdDsKLQotCXByaXZhdGUgU3RyaW5nIHNlYXJjaFN0cmluZzsKLQotCXByaXZhdGUgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlOwotCi0JcHJpdmF0ZSBib29sZWFuIHJlZ0V4cDsKLQotCXByaXZhdGUgUGF0dGVybiBzZWFyY2hTdHJpbmdQYXR0ZXJuOwotCi0JcHJpdmF0ZSBQYXR0ZXJuIGVsZW1lbnROYW1lUGF0dGVybjsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudFNjYW5uZXIgZWxlbWVudFNjYW5uZXI7Ci0KLQlwcml2YXRlIExpc3QgcGFyc2VkRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yOwotCi0JLy8gU2NhbnMgdGhlIGNvbnRlbnQgZWxlbWVudCBYTUkgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBNZXRob2QgZWxlbWVudCB0bwotCS8vIGxvb2sgZm9yIHRoZSBzZWFyY2ggc3RyaW5nLgotCXByaXZhdGUgY2xhc3MgTWV0aG9kRWxlbWVudFNjYW5uZXIgZXh0ZW5kcyBBYnN0cmFjdFNBWFBhcnNlciB7Ci0KLQkJcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JCSAqLwotCQlwdWJsaWMgTWV0aG9kRWxlbWVudFNjYW5uZXIoKSB7Ci0JCQlzdXBlcihudWxsLCBmYWxzZSk7Ci0JCX0KLQotCQkvKioKLQkJICogUGFyc2VzIHRoZSBjb250ZW50IFhNSSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gTWV0aG9kIGVsZW1lbnQuCi0JCSAqIAotCQkgKiBAcGFyYW0gZWxlbWVudAotCQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnNlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJCVN0cmluZyBlbGVtZW50Q29udGVudFBhdGggPSBnZXRFbGVtZW50UGF0aChlbGVtZW50KTsKLQkJCVN0cmluZyBicmllZkRlc2NyaXB0aW9uID0gZWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoc2VhcmNoU3RyaW5nUGF0dGVybi5tYXRjaGVyKGJyaWVmRGVzY3JpcHRpb24pLmZpbmQoKSkgewotCQkJCXJlc3VsdC5hY2NlcHQoZWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudENvbnRlbnRQYXRoICE9IG51bGwKLQkJCQkJJiYgIXBhcnNlZEZpbGVzLmNvbnRhaW5zKGVsZW1lbnRDb250ZW50UGF0aCkpIHsKLQkJCQlzdXBlci5wYXJzZShlbGVtZW50Q29udGVudFBhdGgpOwotCQkJCXBhcnNlZEZpbGVzLmFkZChlbGVtZW50Q29udGVudFBhdGgpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgQWJzdHJhY3RTQVhQYXJzZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsCi0JCSAqICAgICAgQXR0cmlidXRlcykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJMLCBTdHJpbmcgbG9jYWxOYW1lLAotCQkJCVN0cmluZyBxbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gYXR0cmlidXRlcy5nZXRRTmFtZShpKTsKLQkJCQlpZiAoIW5hbWUuZXF1YWxzKCJicmllZkRlc2NyaXB0aW9uIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgdmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotCQkJCQlpZiAoc2VhcmNoU3RyaW5nUGF0dGVybi5tYXRjaGVyKHZhbHVlKS5maW5kKCkpIHsKLQkJCQkJCXJlc3VsdC5hY2NlcHQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBBYnN0cmFjdFNBWFBhcnNlciNlbmRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkwsIFN0cmluZyBsb2NhbE5hbWUsCi0JCQkJU3RyaW5nIHFuYW1lKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBzdHJCdWYudG9TdHJpbmcoKTsKLQkJCWlmIChzZWFyY2hTdHJpbmdQYXR0ZXJuLm1hdGNoZXIodmFsdWUpLmZpbmQoKSkgewotCQkJCXJlc3VsdC5hY2NlcHQoZWxlbWVudCk7Ci0JCQl9Ci0JCQlzdHJCdWYuc2V0TGVuZ3RoKDApOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcKLQkgKiAgICAgICAgICAgIGEgc2VhcmNoIHN0cmluZwotCSAqIEBwYXJhbSBuYW1lUGF0dGVybgotCSAqICAgICAgICAgICAgYSBuYW1lIHBhdHRlcm4KLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogICAgICAgICAgICBhIHNlYXJjaCByZXN1bHQgY29sbGVjdG9yCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaE9wZXJhdGlvbihNZXRob2RTZWFyY2hJbnB1dCBzZWFyY2hJbnB1dCwKLQkJCUlTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0KSB7Ci0JCXRoaXMuc2VhcmNoSW5wdXQgPSBzZWFyY2hJbnB1dDsKLQkJdGhpcy5yZXN1bHQgPSByZXN1bHQ7Ci0KLQkJY2FzZVNlbnNpdGl2ZSA9IHNlYXJjaElucHV0LmdldENhc2VTZW5zaXRpdmUoKTsKLQkJcmVnRXhwID0gc2VhcmNoSW5wdXQuZ2V0UmVndWxhckV4cHJlc3Npb24oKTsKLQkJZWxlbWVudE5hbWVQYXR0ZXJuID0gTWV0aG9kU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKHNlYXJjaElucHV0Ci0JCQkJLmdldE5hbWVQYXR0ZXJuKCksIGZhbHNlLCBmYWxzZSk7Ci0KLQkJZGVidWcgPSBTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCQlzZWFyY2hTdHJpbmcgPSBzZWFyY2hJbnB1dC5nZXRTZWFyY2hTdHJpbmcoKTsKLQkJaWYgKHNlYXJjaFN0cmluZyA9PSBudWxsKQotCQkJc2VhcmNoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlYXJjaFN0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCWVsZW1lbnRTY2FubmVyID0gbmV3IE1ldGhvZEVsZW1lbnRTY2FubmVyKCk7Ci0JCQlzZWFyY2hTdHJpbmdQYXR0ZXJuID0gTWV0aG9kU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKAotCQkJCQlzZWFyY2hTdHJpbmcsIGNhc2VTZW5zaXRpdmUsIHJlZ0V4cCk7Ci0JCX0KLQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIk1ldGhvZFNlYXJjaE9wZXJhdGlvbiBjb25zdHJ1Y3Rvcjogc2VhcmNoU3RyaW5nPSIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgc2VhcmNoU3RyaW5nCi0JCQkJCQkJKyAiLCBlbGVtZW50TmFtZVBhdHRlcm49IiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBzZWFyY2hJbnB1dC5nZXROYW1lUGF0dGVybigpCi0JCQkJCQkJKyAiLCBjYXNlU2Vuc2l0aXZlPSIgKyBjYXNlU2Vuc2l0aXZlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIHNlYXJjaCBvcGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQl0aGlzLnByb2dyZXNzTW9uaXRvciA9IHByb2dyZXNzTW9uaXRvcjsKLQkJdGhpcy5wcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKFNDQU5fTElCUkFSWV9URVhULCA3NTAwKTsKLQotCQkvLyBJdGVyYXRlIHRoZSBNZXRob2QgTGlicmFyeSB0byBsb29rIGZvciBlbGVtZW50cyB0aGF0IG1hdGNoIHRoZSBuYW1lCi0JCS8vIHBhdHRlcm4uCi0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJTGlzdCBtZXRob2RQbHVnaW5zID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2lucyhsaWJyYXJ5KTsKLQkJZm9yIChJdGVyYXRvciBpID0gbWV0aG9kUGx1Z2lucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKQotCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGkubmV4dCgpOwotCQkJbWF0Y2hQYXR0ZXJuKG1ldGhvZFBsdWdpbik7Ci0KLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZTsKLQkJCWlmIChzZWFyY2hJbnB1dC5nZXRTZWFyY2hTY29wZSgpLmluY2x1ZGVDb3JlQ29udGVudCgpKSB7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJfQotCi0JCQlpZiAoc2VhcmNoSW5wdXQuZ2V0U2VhcmNoU2NvcGUoKS5pbmNsdWRlKAotCQkJCQlNZXRob2RTZWFyY2hTY29wZS5TVEFOREFSRF9DQVRFR09SWSkpIHsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoKTsKLQkJCQlzZWFyY2hNZXRob2RQYWNrYWdlcyhtZXRob2RQYWNrYWdlKTsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJfQotCi0JCQlpZiAoc2VhcmNoSW5wdXQuZ2V0U2VhcmNoU2NvcGUoKS5pbmNsdWRlKAotCQkJCQlNZXRob2RTZWFyY2hTY29wZS5DVVNUT01fQ0FURUdPUlkpKSB7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJfQotCi0JCQlpZiAoc2VhcmNoSW5wdXQuZ2V0U2VhcmNoU2NvcGUoKS5pbmNsdWRlKAotCQkJCQlNZXRob2RTZWFyY2hTY29wZS5DQVBBQklMSVRZX1BBVFRFUk4pKSB7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJfQotCi0JCQlpZiAoc2VhcmNoSW5wdXQuZ2V0U2VhcmNoU2NvcGUoKS5pbmNsdWRlKAotCQkJCQlNZXRob2RTZWFyY2hTY29wZS5ERUxJVkVSWV9QUk9DRVNTKSkgewotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyBhIE1ldGhvZCBQYWNrYWdlLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQYWNrYWdlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwYWNrYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2VhcmNoTWV0aG9kUGFja2FnZXMoTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlKSB7Ci0JCWlmIChtZXRob2RQYWNrYWdlID09IG51bGwKLQkJCQl8fCBtZXRob2RQYWNrYWdlLmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJLy8gQWRkIHRoZSBhc3NvY2lhdGVkIENhcGFiaWxpdHlQYXR0ZXJuIG9yIERlbGl2ZXJ5UHJvY2VzcyB0byB0aGUKLQkJCS8vIHNlYXJjaCByZXN1bHQuCi0JCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudCkgbWV0aG9kUGFja2FnZTsKLQkJCW1hdGNoUGF0dGVybihwcm9jZXNzQ29tcG9uZW50LmdldFByb2Nlc3MoKSk7Ci0JCX0gZWxzZSBpZiAoIWlzSW50ZXJuYWxQcm9jZXNzUGFja2FnZShtZXRob2RQYWNrYWdlKSkgewotCQkJbWF0Y2hQYXR0ZXJuKG1ldGhvZFBhY2thZ2UpOwotCQl9Ci0KLQkJTGlzdCBjaGlsZFBhY2thZ2VzID0gbWV0aG9kUGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkUGFja2FnZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCkKLQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKSBpLm5leHQoKSk7Ci0JCX0KLQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2UgPSAoQ29udGVudFBhY2thZ2UpIG1ldGhvZFBhY2thZ2U7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IGNvbnRlbnRQYWNrYWdlLmdldENvbnRlbnRFbGVtZW50cygpOwotCQkJZm9yIChJdGVyYXRvciBqID0gY29udGVudEVsZW1lbnRzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpCi0JCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBqLm5leHQoKTsKLQkJCQltYXRjaFBhdHRlcm4oY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCXNlYXJjaENvbnRhaW5lZEFydGlmYWN0cygoQXJ0aWZhY3QpIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9IGVsc2UgaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCQlzZWFyY2hTdWJEaXNjaXBsaW5lcygoRGlzY2lwbGluZSkgY29udGVudEVsZW1lbnQpOwotCQkJCX0gZWxzZSBpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJCQlzZWFyY2hTdWJQcmFjdGljZXMoKFByYWN0aWNlKSBjb250ZW50RWxlbWVudCk7Ci0JCQkJfSBlbHNlIGlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJCQlzZWFyY2hTdWJEb21haW5zKChEb21haW4pIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSA9IChQcm9jZXNzUGFja2FnZSkgbWV0aG9kUGFja2FnZTsKLQkJCUxpc3QgcHJvY2Vzc0VsZW1lbnRzID0gcHJvY2Vzc1BhY2thZ2UuZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGogPSBwcm9jZXNzRWxlbWVudHMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCkKLQkJCQkJJiYgIXByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7KSB7Ci0JCQkJUHJvY2Vzc0VsZW1lbnQgcHJvY2Vzc0VsZW1lbnQgPSAoUHJvY2Vzc0VsZW1lbnQpIGoubmV4dCgpOwotCQkJCWlmICghKHByb2Nlc3NFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJCW1hdGNoUGF0dGVybihwcm9jZXNzRWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGFja2FnZSBpcyBhbiBpbnRlcm5hbCBQcm9jZXNzCi0JICogUGFja2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kUGFja2FnZQotCSAqICAgICAgICAgICAgYSBtZXRob2Qgb3IgcHJvY2VzcyBwYWNrYWdlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGFja2FnZSBpcyBhbiBpbnRlcm5hbCBwcm9jZXNzCi0JICogICAgICAgICBwYWNrYWdlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRlcm5hbFByb2Nlc3NQYWNrYWdlKE1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSkgewotCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlpZiAoVW1hVXRpbC5nZXRQcm9jZXNzQ29tcG9uZW50KG1ldGhvZFBhY2thZ2UpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgdGhlIGNvbnRhaW5lZCBhcnRpZmFjdHMgb2YgYW4gYXJ0aWZhY3QuCi0JICogCi0JICogQHBhcmFtIGFydGlmYWN0Ci0JICogICAgICAgICAgICBhbiBhcnRpZmFjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNlYXJjaENvbnRhaW5lZEFydGlmYWN0cyhBcnRpZmFjdCBhcnRpZmFjdCkgewotCQlpZiAoYXJ0aWZhY3QgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuaXRlcmF0b3IoKTsgaQotCQkJCQkuaGFzTmV4dCgpCi0JCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJCUFydGlmYWN0IGNvbnRhaW5lZEFydGlmYWN0ID0gKEFydGlmYWN0KSBpLm5leHQoKTsKLQkJCQltYXRjaFBhdHRlcm4oY29udGFpbmVkQXJ0aWZhY3QpOwotCQkJCXNlYXJjaENvbnRhaW5lZEFydGlmYWN0cyhjb250YWluZWRBcnRpZmFjdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyB0aGUgc3ViIGRpc2NpcGxpbmVzIG9mIGEgZGlzY2lwbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzY2lwbGluZQotCSAqICAgICAgICAgICAgYSBkaXNjaXBsaW5lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2VhcmNoU3ViRGlzY2lwbGluZXMoRGlzY2lwbGluZSBkaXNjaXBsaW5lKSB7Ci0JCWlmIChkaXNjaXBsaW5lICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGRpc2NpcGxpbmUuZ2V0U3ViZGlzY2lwbGluZSgpLml0ZXJhdG9yKCk7IGkKLQkJCQkJLmhhc05leHQoKQotCQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCQlEaXNjaXBsaW5lIHN1YkRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgaS5uZXh0KCk7Ci0JCQkJbWF0Y2hQYXR0ZXJuKHN1YkRpc2NpcGxpbmUpOwotCQkJCXNlYXJjaFN1YkRpc2NpcGxpbmVzKHN1YkRpc2NpcGxpbmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgdGhlIHN1YiBwcmFjdGljZXMgb2YgYSBwcmFjdGljZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJhY3RpY2UKLQkgKiAgICAgICAgICAgIGEgcHJhY3RpY2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZWFyY2hTdWJQcmFjdGljZXMoUHJhY3RpY2UgcHJhY3RpY2UpIHsKLQkJaWYgKHByYWN0aWNlICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHByYWN0aWNlLmdldFN1YlByYWN0aWNlcygpLml0ZXJhdG9yKCk7IGkKLQkJCQkJLmhhc05leHQoKQotCQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCQlQcmFjdGljZSBzdWJQcmFjdGljZSA9IChQcmFjdGljZSkgaS5uZXh0KCk7Ci0JCQkJbWF0Y2hQYXR0ZXJuKHN1YlByYWN0aWNlKTsKLQkJCQlzZWFyY2hTdWJQcmFjdGljZXMoc3ViUHJhY3RpY2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgdGhlIHN1YiBkb21haW5zIG9mIGEgZG9tYWluLgotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKiAgICAgICAgICAgIGEgZG9tYWluCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2VhcmNoU3ViRG9tYWlucyhEb21haW4gZG9tYWluKSB7Ci0JCWlmIChkb21haW4gIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZG9tYWluLmdldFN1YmRvbWFpbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKQotCQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCQlEb21haW4gc3ViRG9tYWluID0gKERvbWFpbikgaS5uZXh0KCk7Ci0JCQkJbWF0Y2hQYXR0ZXJuKHN1YkRvbWFpbik7Ci0JCQkJc2VhcmNoU3ViRG9tYWlucyhzdWJEb21haW4pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgdG8gdGhlIHNlYXJjaCByZXN1bHQgY29sbGVjdGlvbiBpZiBpdHMgbmFtZQotCSAqIG9yIHByZXNlbnRhdGlvbiBuYW1lIG1hdGNoZXMgdGhlIG5hbWUgcGF0dGVybi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1hdGNoUGF0dGVybihNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWlmIChzZWFyY2hJbnB1dC5nZXRTZWFyY2hTY29wZSgpLmluY2x1ZGUoZWxlbWVudCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyB0YXNrTmFtZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFNDQU5fRUxFTUVOVF9URVhULAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgbmFtZSB9KTsKLQkJCQlwcm9ncmVzc01vbml0b3Iuc2V0VGFza05hbWUodGFza05hbWUpOwotCQkJCWJvb2xlYW4gZm91bmRNYXRjaCA9IGZhbHNlOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJCVN0cmluZyBwcmVzZW50YXRpb25OYW1lID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQkJZm91bmRNYXRjaCA9IChuYW1lICE9IG51bGwgJiYgZWxlbWVudE5hbWVQYXR0ZXJuLm1hdGNoZXIoCi0JCQkJCQkJbmFtZSkubWF0Y2hlcygpKQotCQkJCQkJCXx8IChwcmVzZW50YXRpb25OYW1lICE9IG51bGwgJiYgZWxlbWVudE5hbWVQYXR0ZXJuCi0JCQkJCQkJCQkubWF0Y2hlcihwcmVzZW50YXRpb25OYW1lKS5tYXRjaGVzKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvdW5kTWF0Y2ggPSAobmFtZSAhPSBudWxsICYmIGVsZW1lbnROYW1lUGF0dGVybi5tYXRjaGVyKAotCQkJCQkJCW5hbWUpLm1hdGNoZXMoKSk7Ci0JCQkJfQotCQkJCWlmIChmb3VuZE1hdGNoKSB7Ci0JCQkJCWlmIChzZWFyY2hTdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJcmVzdWx0LmFjY2VwdChlbGVtZW50KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZWxlbWVudFNjYW5uZXIucGFyc2UoZWxlbWVudCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggb2YgdGhlIGNvbnRlbnQgWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGEgbWV0aG9kCi0JICogZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVsZW1lbnRQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZGVzY3JpYmFibGVFbGVtZW50ID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudDsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBkZXNjcmliYWJsZUVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXNvdXJjZSA9IGNvbnRlbnREZXNjcmlwdGlvbi5lUmVzb3VyY2UoKTsKLQkJfSBlbHNlIHsKLQkJCXJlc291cmNlID0gZWxlbWVudC5lUmVzb3VyY2UoKTsKLQkJfQotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJVVJJIHJlc291cmNlVVJJID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQlpZiAocmVzb3VyY2VVUkkgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXNvdXJjZVVSSS50b0ZpbGVTdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUGF0dGVybi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDk3NjExMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBQYXR0ZXJuIGNvbnRydWN0b3IgZm9yIGEgbWV0aG9kIHNlYXJjaC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hQYXR0ZXJuIHsKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFBhdHRlcm4oKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhCi0JICogPGNvZGU+UGF0dGVybjxjb2RlPiBvYmplY3QgZnJvbSB0aGUgcGF0dGVybiBzdHJpbmcgdXNlZCBpbiBNZXRob2QgU2VhcmNoLgotCSAqIAotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBhIHNlYXJjaCBwYXR0ZXJuIHN0cmluZwotCSAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBjcmVhdGUgYSBjYXNlIGluc2Vuc2l0dmUgcGF0dGVybgotCSAqIEBwYXJhbSBpc1JlZ2V4U2VhcmNoCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdHJlYXQgdGhlIHBhdHRlcm4gYXMgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybgotCSAqIEByZXR1cm4gYSBuZXcgPGNvZGU+UGF0dGVybjxjb2RlPiBvYmplY3QKLQkgKiBAdGhyb3dzIDxjb2RlPlBhdHRlcm5TeW50YXhFeGNlcHRpb248L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcGF0dGVybiBoYXMgYSBzeW50YXggZXJyb3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBhdHRlcm4gY3JlYXRlUGF0dGVybihTdHJpbmcgcGF0dGVybiwKLQkJCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLCBib29sZWFuIGlzUmVnZXhTZWFyY2gpCi0JCQl0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbiB7Ci0JCWlmICghaXNSZWdleFNlYXJjaCkgewotCQkJcGF0dGVybiA9IHRvUmVnZXhQYXR0ZXJuKHBhdHRlcm4pOwotCQl9Ci0KLQkJaWYgKCFpc0Nhc2VTZW5zaXRpdmUpIHsKLQkJCXJldHVybiBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFCi0JCQkJCXwgUGF0dGVybi5VTklDT0RFX0NBU0UgfCBQYXR0ZXJuLk1VTFRJTElORSk7Ci0JCX0KLQotCQlyZXR1cm4gUGF0dGVybi5jb21waWxlKHBhdHRlcm4sIFBhdHRlcm4uTVVMVElMSU5FKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIHBhdHRlcm4gc3RyaW5nIHdpdGggJyonIGFuZCAnPycgaW50byBhIHJlZ3VsYXIgZXhwcmVzc2lvbgotCSAqIHBhdHRlcm4gc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBhIHBhdHRlcm4gc3RyaW5nCi0JICogQHJldHVybiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHN0cmluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b1JlZ2V4UGF0dGVybihTdHJpbmcgcGF0dGVybikgewotCQlpbnQgcGF0dGVybkxlbmd0aCA9IHBhdHRlcm4ubGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHBhdHRlcm5MZW5ndGgpOwotCi0JCWJvb2xlYW4gZXNjYXBlZCA9IGZhbHNlOwotCQlib29sZWFuIHF1b3RpbmcgPSBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm5MZW5ndGg7IGkrKykgewotCQkJY2hhciBjaCA9IHBhdHRlcm4uY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnKic6Ci0JCQkJaWYgKCFlc2NhcGVkKSB7Ci0JCQkJCWlmIChxdW90aW5nKSB7Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCJcXEUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcXVvdGluZyA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJlc3VsdC5hcHBlbmQoIi4qIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllc2NhcGVkID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc/JzoKLQkJCQlpZiAoIWVzY2FwZWQpIHsKLQkJCQkJaWYgKHF1b3RpbmcpIHsKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIlxcRSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlxdW90aW5nID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVzdWx0LmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZXNjYXBlZCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXFwnOgotCQkJCWlmICghZXNjYXBlZCkgewotCQkJCQllc2NhcGVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQllc2NhcGVkID0gZmFsc2U7Ci0JCQkJCWlmIChxdW90aW5nKSB7Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCJcXEUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcXVvdGluZyA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJlc3VsdC5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKCFxdW90aW5nKSB7Ci0JCQkJCXJlc3VsdC5hcHBlbmQoIlxcUSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXF1b3RpbmcgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoZXNjYXBlZCAmJiBjaCAhPSAnKicgJiYgY2ggIT0gJz8nICYmIGNoICE9ICdcXCcpIHsKLQkJCQkJcmVzdWx0LmFwcGVuZCgnXFwnKTsKLQkJCQl9Ci0JCQkJcmVzdWx0LmFwcGVuZChjaCk7Ci0JCQkJZXNjYXBlZCA9IChjaCA9PSAnXFwnKTsKLQkJCX0KLQkJfQotCi0JCWlmIChxdW90aW5nKSB7Ci0JCQlyZXN1bHQuYXBwZW5kKCJcXEUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFF1ZXJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjQxMDA0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLlNlYXJjaFVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgc2VhcmNoIHN0cmluZ3MgYW5kIG9wdGlvbnMgZm9yIGEgbWV0aG9kIHNlYXJjaC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hRdWVyeSBpbXBsZW1lbnRzIElTZWFyY2hRdWVyeSB7Ci0KLQlwcml2YXRlIE1ldGhvZFNlYXJjaElucHV0IHNlYXJjaElucHV0OwotCi0JcHJpdmF0ZSBNZXRob2RTZWFyY2hSZXN1bHQgc2VhcmNoUmVzdWx0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VhcmNoU3RyaW5nCi0JICogICAgICAgICAgICBhIHNlYXJjaCBzdHJpbmcKLQkgKiBAcGFyYW0gbmFtZVBhdHRlcm4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQgbmFtZSBwYXR0ZXJuCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaFF1ZXJ5KE1ldGhvZFNlYXJjaElucHV0IHNlYXJjaElucHV0KSB7Ci0JCXRoaXMuc2VhcmNoSW5wdXQgPSBzZWFyY2hJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvY2Vzc01vbml0b3IpIHsKLQkJZmluYWwgTWV0aG9kU2VhcmNoUmVzdWx0IHNlYXJjaFJlc3VsdCA9IChNZXRob2RTZWFyY2hSZXN1bHQpIGdldFNlYXJjaFJlc3VsdCgpOwotCQlzZWFyY2hSZXN1bHQucmVtb3ZlQWxsKCk7Ci0JCUlTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0ID0gbmV3IElTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY2NlcHQoT2JqZWN0IG1hdGNoKSB7Ci0JCQkJaWYgKG1hdGNoIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBtYXRjaCkpIHsKLQkJCQkJc2VhcmNoUmVzdWx0LmFkZE1hdGNoKG5ldyBNYXRjaChtYXRjaCwgTWF0Y2guVU5JVF9MSU5FLCAxLAotCQkJCQkJCTEpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCU1ldGhvZFNlYXJjaE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgTWV0aG9kU2VhcmNoT3BlcmF0aW9uKAotCQkJCXNlYXJjaElucHV0LCByZXN1bHQpOwotCQlvcGVyYXRpb24uZXhlY3V0ZShwcm9jZXNzTW9uaXRvcik7Ci0JCXByb2Nlc3NNb25pdG9yLmRvbmUoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUXVlcnlfdGV4dDsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2NhblJlcnVuKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXJ1bigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2NhblJ1bkluQmFja2dyb3VuZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuSW5CYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjZ2V0U2VhcmNoUmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgSVNlYXJjaFJlc3VsdCBnZXRTZWFyY2hSZXN1bHQoKSB7Ci0JCWlmIChzZWFyY2hSZXN1bHQgPT0gbnVsbCkgewotCQkJc2VhcmNoUmVzdWx0ID0gbmV3IE1ldGhvZFNlYXJjaFJlc3VsdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gc2VhcmNoUmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNnZXRTZWFyY2hSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hJbnB1dCBnZXRTZWFyY2hJbnB1dCgpIHsKLQkJcmV0dXJuIHNlYXJjaElucHV0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFJlc3VsdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjN2ZlMmQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLlNlYXJjaFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklFZGl0b3JNYXRjaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUZpbGVNYXRjaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogVGhlIG1ldGhvZCBzZWFyY2ggcmVzdWx0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaFJlc3VsdCBleHRlbmRzIEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCBpbXBsZW1lbnRzCi0JCUlFZGl0b3JNYXRjaEFkYXB0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BVENIX0xBQkVMID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X21hdGNoOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFUQ0hFU19MQUJFTCA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9tYXRjaGVzOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2VhcmNoIHF1ZXJ5LgotCXByaXZhdGUgTWV0aG9kU2VhcmNoUXVlcnkgc2VhcmNoUXVlcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBzZWFyY2hRdWVyeQotCSAqICAgICAgICAgICAgYSBtZXRob2Qgc2VhcmNoIHF1ZXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaFJlc3VsdChNZXRob2RTZWFyY2hRdWVyeSBzZWFyY2hRdWVyeSkgewotCQl0aGlzLnNlYXJjaFF1ZXJ5ID0gc2VhcmNoUXVlcnk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdCNnZXRRdWVyeSgpCi0JICovCi0JcHVibGljIElTZWFyY2hRdWVyeSBnZXRRdWVyeSgpIHsKLQkJcmV0dXJuIHNlYXJjaFF1ZXJ5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQjZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIFNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvb2JqMTYvTWV0aG9kU2VhcmNoLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdCNnZXRMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJLy8gVE9ETzogRGlzcGxheSBzZWFyY2ggcmVzdWx0IGluIHRoZSBmb3JtOgotCQkvLyAgICAnY2FuZGlkYXRlJyAtIDYgbWF0Y2hlcyBpbiA0IGVsZW1lbnRzLgotCQlTdHJpbmcgc2VhcmNoU3RyaW5nID0gc2VhcmNoUXVlcnkuZ2V0U2VhcmNoSW5wdXQoKS5nZXRTZWFyY2hTdHJpbmcoKTsKLQkJaW50IG1hdGNoQ291bnQgPSBnZXRNYXRjaENvdW50KCk7Ci0JCWlmIChtYXRjaENvdW50ID09IDEpIHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChNQVRDSF9MQUJFTCwKLQkJCQkJbmV3IE9iamVjdFtdIHsgc2VhcmNoU3RyaW5nIH0pOwkJCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTUFUQ0hFU19MQUJFTCwgbmV3IE9iamVjdFtdIHsKLQkJCQkJc2VhcmNoU3RyaW5nLCAiIiArIG1hdGNoQ291bnQgfSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQjZ2V0VG9vbHRpcCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sdGlwKCkgewotCQlyZXR1cm4gZ2V0TGFiZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCNnZXRFZGl0b3JNYXRjaEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBJRWRpdG9yTWF0Y2hBZGFwdGVyIGdldEVkaXRvck1hdGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQjZ2V0RmlsZU1hdGNoQWRhcHRlcigpCi0JICovCi0JcHVibGljIElGaWxlTWF0Y2hBZGFwdGVyIGdldEZpbGVNYXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUVkaXRvck1hdGNoQWRhcHRlciNpc1Nob3duSW5FZGl0b3IoTWF0Y2gsCi0JICogICAgICBJRWRpdG9yUGFydCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3duSW5FZGl0b3IoTWF0Y2ggbWF0Y2gsIElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRWRpdG9yTWF0Y2hBZGFwdGVyI2NvbXB1dGVDb250YWluZWRNYXRjaGVzKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCwKLQkgKiAgICAgIElFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyBNYXRjaFtdIGNvbXB1dGVDb250YWluZWRNYXRjaGVzKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCByZXN1bHQsCi0JCQlJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoU2NvcGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDc1NWFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hTY29wZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNhcGFiaWxpdHlQYXR0ZXJuSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2hlY2tsaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uY2VwdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Eb21haW5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FeGFtcGxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGFuY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkZWxpbmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JdGVyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NaWxlc3RvbmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5PdXRjb21lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGhhc2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlcG9ydEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2FkbWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlbXBsYXRlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbE1lbnRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsOwotCi0vKioKLSAqIFRoZSBtZXRob2Qgc2VhcmNoIHNjb3BlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaFNjb3BlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAiUm9vdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9DT05URU5UID0gTGlicmFyeVVJVGV4dC5URVhUX01FVEhPRF9DT05URU5UOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRSA9IExpYnJhcnlVSVRleHQuVEVYVF9ST0xFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTSyA9IExpYnJhcnlVSVRleHQuVEVYVF9UQVNLOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUID0gTGlicmFyeVVJVGV4dC5URVhUX1dPUktfUFJPRFVDVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURBTkNFID0gTGlicmFyeVVJVGV4dC5URVhUX0dVSURBTkNFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tMSVNUID0gTGlicmFyeVVJVGV4dC5URVhUX0NIRUNLTElTVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkNFUFQgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfQ09OQ0VQVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQU1QTEUgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfRVhBTVBMRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURFTElORSA9IExpYnJhcnlVSVRleHQuVEVYVF9HVUlERUxJTkU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkFDVElDRSA9IExpYnJhcnlVSVRleHQuVEVYVF9QUkFDVElDRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVCA9IExpYnJhcnlVSVRleHQuVEVYVF9SRVBPUlQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVVTQUJMRV9BU1NFVCA9IExpYnJhcnlVSVRleHQuVEVYVF9SRVVTQUJMRV9BU1NFVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPQURNQVAgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUk9BRE1BUDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUFBPUlRJTkdfTUFURVJJQUwgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfU1VQUE9SVElOR19NQVRFUklBTDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFID0gTGlicmFyeVVJVGV4dC5URVhUX1RFTVBMQVRFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9ERUZJTklUSU9OID0gTGlicmFyeVVJVGV4dC5URVhUX1RFUk1fREVGSU5JVElPTjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfTUVOVE9SID0gTGlicmFyeVVJVGV4dC5URVhUX1RPT0xfTUVOVE9SOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hJVEVQQVBFUiA9IExpYnJhcnlVSVRleHQuVEVYVF9XSElURVBBUEVSOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTkRBUkRfQ0FURUdPUlkgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfU1RBTkRBUkRfQ0FURUdPUlk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ0FURUdPUlkgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfQ1VTVE9NX0NBVEVHT1JZOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTUyA9IExpYnJhcnlVSVRleHQuVEVYVF9QUk9DRVNTOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQQUJJTElUWV9QQVRURVJOID0gTGlicmFyeVVJVGV4dC5URVhUX0NBUEFCSUxJVFlfUEFUVEVSTjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElWRVJZX1BST0NFU1MgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfREVMSVZFUllfUFJPQ0VTUzsKLQotCXByaXZhdGUgc3RhdGljIE1hcCBlbGVtZW50U2VhcmNoU2NvcGUgPSBuZXcgSGFzaE1hcCgpOwotCi0Jc3RhdGljIHsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChNZXRob2RQbHVnaW5JbXBsLmNsYXNzLCBST09UKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChDb250ZW50UGFja2FnZUltcGwuY2xhc3MsIE1FVEhPRF9DT05URU5UKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChSb2xlSW1wbC5jbGFzcywgUk9MRSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVGFza0ltcGwuY2xhc3MsIFRBU0spOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KEFydGlmYWN0SW1wbC5jbGFzcywgV09SS19QUk9EVUNUKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChEZWxpdmVyYWJsZUltcGwuY2xhc3MsIFdPUktfUFJPRFVDVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoT3V0Y29tZUltcGwuY2xhc3MsIFdPUktfUFJPRFVDVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoR3VpZGFuY2VJbXBsLmNsYXNzLCBHVUlEQU5DRSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoQ2hlY2tsaXN0SW1wbC5jbGFzcywgQ0hFQ0tMSVNUKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChDb25jZXB0SW1wbC5jbGFzcywgQ09OQ0VQVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbC5jbGFzcywKLQkJCQlFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChFeGFtcGxlSW1wbC5jbGFzcywgRVhBTVBMRSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoR3VpZGVsaW5lSW1wbC5jbGFzcywgR1VJREVMSU5FKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChQcmFjdGljZUltcGwuY2xhc3MsIFBSQUNUSUNFKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChSZXBvcnRJbXBsLmNsYXNzLCBSRVBPUlQpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFJldXNhYmxlQXNzZXRJbXBsLmNsYXNzLCBSRVVTQUJMRV9BU1NFVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoUm9hZG1hcEltcGwuY2xhc3MsIFJPQURNQVApOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFN1cHBvcnRpbmdNYXRlcmlhbEltcGwuY2xhc3MsCi0JCQkJU1VQUE9SVElOR19NQVRFUklBTCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVGVtcGxhdGVJbXBsLmNsYXNzLCBURU1QTEFURSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVGVybURlZmluaXRpb25JbXBsLmNsYXNzLCBURVJNX0RFRklOSVRJT04pOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFRvb2xNZW50b3JJbXBsLmNsYXNzLCBUT09MX01FTlRPUik7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoV2hpdGVwYXBlckltcGwuY2xhc3MsIFdISVRFUEFQRVIpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KENvbnRlbnRDYXRlZ29yeUltcGwuY2xhc3MsIFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChEaXNjaXBsaW5lSW1wbC5jbGFzcywgU1RBTkRBUkRfQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KERpc2NpcGxpbmVHcm91cGluZ0ltcGwuY2xhc3MsIFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChEb21haW5JbXBsLmNsYXNzLCBTVEFOREFSRF9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoV29ya1Byb2R1Y3RUeXBlSW1wbC5jbGFzcywgU1RBTkRBUkRfQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFJvbGVTZXRJbXBsLmNsYXNzLCBTVEFOREFSRF9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoUm9sZVNldEdyb3VwaW5nSW1wbC5jbGFzcywgU1RBTkRBUkRfQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFRvb2xJbXBsLmNsYXNzLCBTVEFOREFSRF9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoQ3VzdG9tQ2F0ZWdvcnlJbXBsLmNsYXNzLCBDVVNUT01fQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFByb2Nlc3NQYWNrYWdlSW1wbC5jbGFzcywgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoUHJvY2Vzc0NvbXBvbmVudEltcGwuY2xhc3MsIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFBoYXNlSW1wbC5jbGFzcywgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoSXRlcmF0aW9uSW1wbC5jbGFzcywgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoTWlsZXN0b25lSW1wbC5jbGFzcywgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoQWN0aXZpdHlJbXBsLmNsYXNzLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChSb2xlRGVzY3JpcHRvckltcGwuY2xhc3MsIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFRhc2tEZXNjcmlwdG9ySW1wbC5jbGFzcywgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5jbGFzcywgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoQ2FwYWJpbGl0eVBhdHRlcm5JbXBsLmNsYXNzLCBDQVBBQklMSVRZX1BBVFRFUk4pOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KERlbGl2ZXJ5UHJvY2Vzc0ltcGwuY2xhc3MsIERFTElWRVJZX1BST0NFU1MpOwotCX0KLQotCXByaXZhdGUgTGlzdCBzZWFyY2hTY29wZSA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaFNjb3BlKE9iamVjdFtdIGVsZW1lbnRUeXBlcykgewotCQlzZWFyY2hTY29wZS5hZGQoUk9PVCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZXNbaV07Ci0JCQlzZWFyY2hTY29wZS5hZGQoZWxlbWVudFR5cGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBjb3JlIG1ldGhvZCBlbGVtZW50IGlzIGluY2x1ZGVkIGluIHRoZSBzZWFyY2ggc2NvcGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIGNvcmUgbWV0aG9kIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gdGhlCi0JICogICAgICAgICBzZWFyY2ggc2NvcGUsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlQ29yZUNvbnRlbnQoKSB7Ci0JCXJldHVybiBzZWFyY2hTY29wZS5jb250YWlucyhST0xFKSB8fCBzZWFyY2hTY29wZS5jb250YWlucyhUQVNLKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFdPUktfUFJPRFVDVCkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhHVUlEQU5DRSkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhDSEVDS0xJU1QpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoQ09OQ0VQVCkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKEVYQU1QTEUpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoR1VJREVMSU5FKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFBSQUNUSUNFKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFJFUE9SVCkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhSRVVTQUJMRV9BU1NFVCkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhST0FETUFQKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFNVUFBPUlRJTkdfTUFURVJJQUwpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoVEVNUExBVEUpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoVEVSTV9ERUZJTklUSU9OKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFRPT0xfTUVOVE9SKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFdISVRFUEFQRVIpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBNZXRob2QgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiB0aGUgc2VhcmNoIHNjb3BlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gdGhlCi0JICogICAgICAgICBzZWFyY2ggc2NvcGUsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgc2VhcmNoU2NvcGVOYW1lID0gKFN0cmluZykgZWxlbWVudFNlYXJjaFNjb3BlLmdldChlbGVtZW50Ci0JCQkJLmdldENsYXNzKCkpOwotCQlyZXR1cm4gc2VhcmNoU2NvcGUuY29udGFpbnMoc2VhcmNoU2NvcGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgdHlwZSBpcyBpbmNsdWRlZCBpbiB0aGUgc2VhcmNoCi0JICogc2NvcGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgdHlwZSBpcyBpbmNsdWRlZAotCSAqICAgICAgICAgaW4gdGhlIHNlYXJjaCBzY29wZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoU3RyaW5nIHNlYXJjaFNjb3BlTmFtZSkgewotCQlyZXR1cm4gc2VhcmNoU2NvcGUuY29udGFpbnMoc2VhcmNoU2NvcGVOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hTY29wZVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFNjb3BlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxZDk5NWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFNjb3BlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIHNlYXJjaGFibGUgbWV0aG9kIGVsZW1lbnRzLCBvcmdhbml6ZWQgYnkgdHlwZXMsIGluIGEgdHJlZSB2aWV3LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaFNjb3BlVmlld2VyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gTWV0aG9kU2VhcmNoU2NvcGUuUk9PVDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfQ09OVEVOVCA9IE1ldGhvZFNlYXJjaFNjb3BlLk1FVEhPRF9DT05URU5UOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEUgPSBNZXRob2RTZWFyY2hTY29wZS5ST0xFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0sgPSBNZXRob2RTZWFyY2hTY29wZS5UQVNLOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfUFJPRFVDVCA9IE1ldGhvZFNlYXJjaFNjb3BlLldPUktfUFJPRFVDVDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEQU5DRSA9IE1ldGhvZFNlYXJjaFNjb3BlLkdVSURBTkNFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLTElTVCA9IE1ldGhvZFNlYXJjaFNjb3BlLkNIRUNLTElTVDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05DRVBUID0gTWV0aG9kU2VhcmNoU2NvcGUuQ09OQ0VQVDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gTWV0aG9kU2VhcmNoU2NvcGUuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWEFNUExFID0gTWV0aG9kU2VhcmNoU2NvcGUuRVhBTVBMRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlERUxJTkUgPSBNZXRob2RTZWFyY2hTY29wZS5HVUlERUxJTkU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJBQ1RJQ0UgPSBNZXRob2RTZWFyY2hTY29wZS5QUkFDVElDRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlQgPSBNZXRob2RTZWFyY2hTY29wZS5SRVBPUlQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVVU0FCTEVfQVNTRVQgPSBNZXRob2RTZWFyY2hTY29wZS5SRVVTQUJMRV9BU1NFVDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST0FETUFQID0gTWV0aG9kU2VhcmNoU2NvcGUuUk9BRE1BUDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQT1JUSU5HX01BVEVSSUFMID0gTWV0aG9kU2VhcmNoU2NvcGUuU1VQUE9SVElOR19NQVRFUklBTDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURSA9IE1ldGhvZFNlYXJjaFNjb3BlLlRFTVBMQVRFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fREVGSU5JVElPTiA9IE1ldGhvZFNlYXJjaFNjb3BlLlRFUk1fREVGSU5JVElPTjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX01FTlRPUiA9IE1ldGhvZFNlYXJjaFNjb3BlLlRPT0xfTUVOVE9SOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdISVRFUEFQRVIgPSBNZXRob2RTZWFyY2hTY29wZS5XSElURVBBUEVSOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQU5EQVJEX0NBVEVHT1JZID0gTWV0aG9kU2VhcmNoU2NvcGUuU1RBTkRBUkRfQ0FURUdPUlk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NBVEVHT1JZID0gTWV0aG9kU2VhcmNoU2NvcGUuQ1VTVE9NX0NBVEVHT1JZOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1MgPSBNZXRob2RTZWFyY2hTY29wZS5QUk9DRVNTOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfUEFUVEVSTiA9IE1ldGhvZFNlYXJjaFNjb3BlLkNBUEFCSUxJVFlfUEFUVEVSTjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJVkVSWV9QUk9DRVNTID0gTWV0aG9kU2VhcmNoU2NvcGUuREVMSVZFUllfUFJPQ0VTUzsKLQotCXByaXZhdGUgc3RhdGljIExpc3Qgcm9vdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jc3RhdGljIHsKLQkJcm9vdExpc3QuYWRkKE1FVEhPRF9DT05URU5UKTsKLQkJcm9vdExpc3QuYWRkKFBST0NFU1MpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3QgbWV0aG9kQ29udGVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jc3RhdGljIHsKLQkJbWV0aG9kQ29udGVudExpc3QuYWRkKFJPTEUpOwotCQltZXRob2RDb250ZW50TGlzdC5hZGQoVEFTSyk7Ci0JCW1ldGhvZENvbnRlbnRMaXN0LmFkZChXT1JLX1BST0RVQ1QpOwotCQltZXRob2RDb250ZW50TGlzdC5hZGQoR1VJREFOQ0UpOwotCQltZXRob2RDb250ZW50TGlzdC5hZGQoU1RBTkRBUkRfQ0FURUdPUlkpOwotCQltZXRob2RDb250ZW50TGlzdC5hZGQoQ1VTVE9NX0NBVEVHT1JZKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGd1aWRhbmNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlzdGF0aWMgewotCQlndWlkYW5jZUxpc3QuYWRkKENIRUNLTElTVCk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoQ09OQ0VQVCk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoRVhBTVBMRSk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoR1VJREVMSU5FKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChQUkFDVElDRSk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoUkVQT1JUKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChSRVVTQUJMRV9BU1NFVCk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoUk9BRE1BUCk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoU1VQUE9SVElOR19NQVRFUklBTCk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoVEVNUExBVEUpOwotCQlndWlkYW5jZUxpc3QuYWRkKFRFUk1fREVGSU5JVElPTik7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoVE9PTF9NRU5UT1IpOwotCQlndWlkYW5jZUxpc3QuYWRkKFdISVRFUEFQRVIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3QgcHJvY2Vzc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jc3RhdGljIHsKLQkJcHJvY2Vzc0xpc3QuYWRkKENBUEFCSUxJVFlfUEFUVEVSTik7Ci0JCXByb2Nlc3NMaXN0LmFkZChERUxJVkVSWV9QUk9DRVNTKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGhhc0NoaWxkcmVuTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlzdGF0aWMgewotCQloYXNDaGlsZHJlbkxpc3QuYWRkKFJPT1QpOwotCQloYXNDaGlsZHJlbkxpc3QuYWRkKE1FVEhPRF9DT05URU5UKTsKLQkJaGFzQ2hpbGRyZW5MaXN0LmFkZChHVUlEQU5DRSk7Ci0JCWhhc0NoaWxkcmVuTGlzdC5hZGQoUFJPQ0VTUyk7Ci0JfQotCi0JcHJpdmF0ZSBDaGVja2JveFRyZWVWaWV3ZXIgdmlld2VyOwotCi0JLyoqCi0JICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSB2aWV3ZXIuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmlld2VyQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JCXByaXZhdGUgZmluYWwgT2JqZWN0W10gRU1QVFlfTElTVCA9IG5ldyBPYmplY3RbMF07Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBwYXJlbnQpIHsKLQkJCWlmIChwYXJlbnQgPT0gUk9PVCkgewotCQkJCXJldHVybiBnZXRDaGlsZHJlbihST09UKTsKLQkJCX0KLQkJCXJldHVybiBnZXRDaGlsZHJlbihwYXJlbnQpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJCWlmIChwYXJlbnQgPT0gUk9PVCkgewotCQkJCXJldHVybiByb290TGlzdC50b0FycmF5KCk7Ci0JCQl9IGVsc2UgaWYgKHBhcmVudCA9PSBNRVRIT0RfQ09OVEVOVCkgewotCQkJCXJldHVybiBtZXRob2RDb250ZW50TGlzdC50b0FycmF5KCk7Ci0JCQl9IGVsc2UgaWYgKHBhcmVudCA9PSBHVUlEQU5DRSkgewotCQkJCXJldHVybiBndWlkYW5jZUxpc3QudG9BcnJheSgpOwotCQkJfSBlbHNlIGlmIChwYXJlbnQgPT0gUFJPQ0VTUykgewotCQkJCXJldHVybiBwcm9jZXNzTGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gRU1QVFlfTElTVDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBjaGlsZCkgewotCQkJaWYgKHJvb3RMaXN0LmNvbnRhaW5zKGNoaWxkKSkgewotCQkJCXJldHVybiBST09UOwotCQkJfQotCQkJaWYgKG1ldGhvZENvbnRlbnRMaXN0LmNvbnRhaW5zKGNoaWxkKSkgewotCQkJCXJldHVybiBNRVRIT0RfQ09OVEVOVDsKLQkJCX0gZWxzZSBpZiAoZ3VpZGFuY2VMaXN0LmNvbnRhaW5zKGNoaWxkKSkgewotCQkJCXJldHVybiBHVUlEQU5DRTsKLQkJCX0gZWxzZSBpZiAocHJvY2Vzc0xpc3QuY29udGFpbnMoY2hpbGQpKSB7Ci0JCQkJcmV0dXJuIFBST0NFU1M7Ci0JCQl9Ci0JCQlyZXR1cm4gRU1QVFlfTElTVDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJCXJldHVybiBoYXNDaGlsZHJlbkxpc3QuY29udGFpbnMocGFyZW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbGFiZWwgcHJvdmlkZXIgZm9yIHRoZSB2aWV3ZXIuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmlld2VyTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hTY29wZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJdmlld2VyID0gbmV3IENoZWNrYm94VHJlZVZpZXdlcihwYXJlbnQsIHN0eWxlKTsKLQkJdmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJdmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVmlld2VyQ29udGVudFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVmlld2VyTGFiZWxQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldElucHV0KFJPT1QpOwotCQl2aWV3ZXIuZXhwYW5kVG9MZXZlbCgyKTsKLQkJdmlld2VyLnNldFN1YnRyZWVDaGVja2VkKE1FVEhPRF9DT05URU5ULCB0cnVlKTsKLQkJdmlld2VyLnNldFN1YnRyZWVDaGVja2VkKFBST0NFU1MsIHRydWUpOwotCQl2aWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBldmVudC5nZXRFbGVtZW50KCk7Ci0JCQkJdmlld2VyLnNldFN1YnRyZWVDaGVja2VkKHNlbGVjdGVkRWxlbWVudCwgZXZlbnQuZ2V0Q2hlY2tlZCgpKTsKLQkJCQlpZiAoIWV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJCQl2aWV3ZXIuc2V0UGFyZW50c0dyYXllZChzZWxlY3RlZEVsZW1lbnQsIHRydWUpOwotCQkJCQl2aWV3ZXIuc2V0R3JheUNoZWNrZWQoc2VsZWN0ZWRFbGVtZW50LCBmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmlld2VyLnNldFBhcmVudHNHcmF5ZWQoc2VsZWN0ZWRFbGVtZW50LCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBtZXRob2QgZWxlbWVudCB0eXBlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHNlbGVjdGVkIG1ldGhvZCBlbGVtZW50IHR5cGVzCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaFNjb3BlIGdldFNlYXJjaFNjb3BlKCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZFNlYXJjaFNjb3BlKHZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODRmYjJjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgbWV0aG9kIHNlYXJjaCByZXN1bHQgdHJlZSBhbmQgdGFibGUgdmlld2Vycy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCW5ldyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlYXJjaFJlc3VsdExhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHRVSUZvbGRlcikgewotCQkJcmV0dXJuICgoU2VhcmNoUmVzdWx0VUlGb2xkZXIpIG9iaikuZ2V0TmFtZSgpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBsYWJlbFByb3ZpZGVyLmdldFRleHQob2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHRVSUZvbGRlcikgewotCQkJcmV0dXJuICgoU2VhcmNoUmVzdWx0VUlGb2xkZXIpIG9iaikuZ2V0SW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXRJbWFnZShvYmopOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWMxMDM0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBtZXRob2Qgc2VhcmNoIHJlc3VsdCB0YWJsZSB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9MSVNUID0gbmV3IE9iamVjdFswXTsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFJlc3VsdCBzZWFyY2hSZXN1bHQ7Ci0KLQkvKioKLQkgKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kU2VhcmNoUmVzdWx0KSB7Ci0JCQlyZXR1cm4gKChNZXRob2RTZWFyY2hSZXN1bHQpIGlucHV0RWxlbWVudCkuZ2V0RWxlbWVudHMoKTsKLQkJfQotCQlyZXR1cm4gRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0ICE9IG51bGwgJiYgbmV3SW5wdXQgaW5zdGFuY2VvZiBNZXRob2RTZWFyY2hSZXN1bHQpIHsKLQkJCXRhYmxlVmlld2VyID0gKFRhYmxlVmlld2VyKSB2aWV3ZXI7Ci0JCQlzZWFyY2hSZXN1bHQgPSAoTWV0aG9kU2VhcmNoUmVzdWx0KSBuZXdJbnB1dDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSB1cGRhdGVkRWxlbWVudHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cGRhdGVkRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzZWFyY2hSZXN1bHQuZ2V0TWF0Y2hDb3VudCh1cGRhdGVkRWxlbWVudHNbaV0pID4gMCkgewotCQkJCWlmICh0YWJsZVZpZXdlci50ZXN0RmluZEl0ZW0odXBkYXRlZEVsZW1lbnRzW2ldKSAhPSBudWxsKSB7Ci0JCQkJCXRhYmxlVmlld2VyLnJlZnJlc2godXBkYXRlZEVsZW1lbnRzW2ldKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0YWJsZVZpZXdlci5hZGQodXBkYXRlZEVsZW1lbnRzW2ldKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXRhYmxlVmlld2VyLnJlbW92ZSh1cGRhdGVkRWxlbWVudHNbaV0pOwotCQkJfQotCQl9Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2VlNWE0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLlNlYXJjaFVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgbWV0aG9kIHNlYXJjaCByZXN1bHQgdHJlZSB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9DT05URU5UID0gIkNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfQ09SRV9DT05URU5UID0gIkNvcmVDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0NBVEVHT1JJRVMgPSAiQ2F0ZWdvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9ESVNDSVBMSU5FUyA9ICJEaXNjaXBsaW5lcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9ET01BSU5TID0gIkRvbWFpbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfV09SS19QUk9EVUNUX1RZUEVTID0gIldQIFR5cGVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX1JPTEVTRVRTID0gIlJvbGVTZXRzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX1RPT0xTID0gIlRvb2xzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0NVU1RPTV9DQVRFR09SSUVTID0gIkN1c3RvbUNhdGVnb3JpZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfQ0FQQUJJTElUWV9QQVRURVJOUyA9ICJDYXBhYmlsaXR5UGF0dGVybnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfREVMSVZFUllfUFJPQ0VTU0VTID0gIkRlbGl2ZXJ5UHJvY2Vzc2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9DT05URU5UID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X21ldGhvZENvbnRlbnQ7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QQUNLQUdFUyA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9jb250ZW50UGFja2FnZXM7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFOREFSRF9DQVRFR09SSUVTID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X3N0YW5kYXJkQ2F0ZWdvcmllczsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NJUExJTkVTID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X2Rpc2NpcGxpbmVzOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9NQUlOUyA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9kb21haW5zOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUX1RZUEVTID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X3dvcmtQcm9kdWN0VHlwZXM7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFU0VUUyA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9yb2xlU2V0czsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xTID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X3Rvb2xzOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NBVEVHT1JJRVMgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllczsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NFUyA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9wcm9jZXNzZXM7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX1BBVFRFUk5TID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X2NhcGFiaWxpdHlQYXR0ZXJuczsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElWRVJZX1BST0NFU1NFUyA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9kZWxpdmVyeVByb2Nlc3NlczsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfTElTVCA9IG5ldyBPYmplY3RbMF07Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXByaXZhdGUgTWV0aG9kU2VhcmNoUmVzdWx0IHNlYXJjaFJlc3VsdDsKLQotCXByaXZhdGUgTWFwIGVsZW1lbnRNYXA7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RTZWFyY2hSZXN1bHQpIHsKLQkJCU9iamVjdFtdIGVsZW1lbnRzID0gKChNZXRob2RTZWFyY2hSZXN1bHQpIGlucHV0RWxlbWVudCkKLQkJCQkJLmdldEVsZW1lbnRzKCk7Ci0JCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHsKLQkJCQlyZXR1cm4gRU1QVFlfTElTVDsKLQkJCX0KLQkJCWVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWluc2VydChlbGVtZW50c1tpXSwgZmFsc2UpOwotCQkJfQotCi0JCQlpbnNlcnRVSUZvbGRlcnMoaW5wdXRFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0ICE9IG51bGwgJiYgbmV3SW5wdXQgaW5zdGFuY2VvZiBNZXRob2RTZWFyY2hSZXN1bHQpIHsKLQkJCXRyZWVWaWV3ZXIgPSAoVHJlZVZpZXdlcikgdmlld2VyOwotCQkJc2VhcmNoUmVzdWx0ID0gKE1ldGhvZFNlYXJjaFJlc3VsdCkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbGVtZW50c0NoYW5nZWQoT2JqZWN0W10gdXBkYXRlZEVsZW1lbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXBkYXRlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc2VhcmNoUmVzdWx0LmdldE1hdGNoQ291bnQodXBkYXRlZEVsZW1lbnRzW2ldKSA+IDApIHsKLQkJCQlpZiAodHJlZVZpZXdlci50ZXN0RmluZEl0ZW0odXBkYXRlZEVsZW1lbnRzW2ldKSAhPSBudWxsKSB7Ci0JCQkJCWluc2VydCh1cGRhdGVkRWxlbWVudHNbaV0sIHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlbW92ZSh1cGRhdGVkRWxlbWVudHNbaV0sIHRydWUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdHJlZVZpZXdlci5yZW1vdmUodXBkYXRlZEVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlpZiAoZWxlbWVudE1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRU1QVFlfTElTVDsKLQkJfQotCQlTZXQgY2hpbGRyZW4gPSAoU2V0KSBlbGVtZW50TWFwLmdldChwYXJlbnRFbGVtZW50KTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCXJldHVybiBFTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHRVSUZvbGRlcikgewotCQkJcmV0dXJuICgoU2VhcmNoUmVzdWx0VUlGb2xkZXIpIGVsZW1lbnQpLmdldFBhcmVudCgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UgPSAoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQ7Ci0JCQlPYmplY3QgcGFyZW50ID0gcHJvY2Vzc1BhY2thZ2UuZUNvbnRhaW5lcigpOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudCkgcGFyZW50OwotCQkJCXJldHVybiBwcm9jZXNzQ29tcG9uZW50LmdldFByb2Nlc3MoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHBhcmVudDsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlID0gKE1ldGhvZFBhY2thZ2UpIGVsZW1lbnQ7Ci0JCQlPYmplY3QgcGFyZW50ID0gbWV0aG9kUGFja2FnZS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIHBhcmVudDsKLQkJCX0KLQkJCU1ldGhvZFBhY2thZ2UgcGFyZW50UGFja2FnZSA9IG1ldGhvZFBhY2thZ2UuZ2V0UGFyZW50UGFja2FnZSgpOwotCQkJcmV0dXJuIHBhcmVudFBhY2thZ2U7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgZWxlbWVudDsKLQkJCUFydGlmYWN0IGNvbnRhaW5lckFydGlmYWN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkJCWlmIChjb250YWluZXJBcnRpZmFjdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGNvbnRhaW5lckFydGlmYWN0OwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gVW1hVXRpbC5nZXRDb250ZW50UGFja2FnZShhcnRpZmFjdCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQlQcmFjdGljZSBwcmFjdGljZSA9IChQcmFjdGljZSkgZWxlbWVudDsKLQkJCXJldHVybiBwcmFjdGljZS5nZXRDb250YWluZXIoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJRGlzY2lwbGluZSBkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gZGlzY2lwbGluZS5nZXRDb250YWluZXIoKTsJCQkKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQlEb21haW4gZG9tYWluID0gKERvbWFpbikgZWxlbWVudDsKLQkJCXJldHVybiBkb21haW4uZ2V0Q29udGFpbmVyKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gVW1hVXRpbC5nZXRDb250ZW50UGFja2FnZSgoQ29udGVudEVsZW1lbnQpIGVsZW1lbnQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlQcm9jZXNzIHByb2Nlc3MgPSAoUHJvY2VzcykgZWxlbWVudDsKLQkJCVByb2Nlc3NQYWNrYWdlIHBhcmVudCA9IChQcm9jZXNzUGFja2FnZSkgcHJvY2Vzcy5lQ29udGFpbmVyKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcGFyZW50LmVDb250YWluZXIoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCVByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlID0gVW1hVXRpbAotCQkJCQkuZ2V0UHJvY2Vzc1BhY2thZ2UoKFByb2Nlc3NFbGVtZW50KSBlbGVtZW50KTsKLQkJCWlmIChwcm9jZXNzUGFja2FnZSAhPSBudWxsKSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGFyZW50UGFja2FnZSA9IChQcm9jZXNzUGFja2FnZSkgcHJvY2Vzc1BhY2thZ2UKLQkJCQkJCS5nZXRQYXJlbnRQYWNrYWdlKCk7Ci0JCQkJaWYgKHBhcmVudFBhY2thZ2UgIT0gbnVsbCkgewotCQkJCQlpZiAocGFyZW50UGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBwYXJlbnRQYWNrYWdlOwotCQkJCQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQkJCQl9Ci0JCQkJCUxpc3QgcHJvY2Vzc0VsZW1lbnRzID0gcGFyZW50UGFja2FnZS5nZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpID0gcHJvY2Vzc0VsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQkJUHJvY2Vzc0VsZW1lbnQgcHJvY2Vzc0VsZW1lbnQgPSAoUHJvY2Vzc0VsZW1lbnQpIGkKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCWlmIChwcm9jZXNzRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJCSYmIHByb2Nlc3NFbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQkJCQkJcGFyZW50UGFja2FnZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJcmV0dXJuIHByb2Nlc3NFbGVtZW50OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UgPSBVbWFVdGlsCi0JCQkJCS5nZXRQcm9jZXNzUGFja2FnZSgoUHJvY2Vzc0VsZW1lbnQpIGVsZW1lbnQpOwotCQkJaWYgKHByb2Nlc3NQYWNrYWdlICE9IG51bGwpIHsKLQkJCQlpZiAocHJvY2Vzc1BhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBwcm9jZXNzUGFja2FnZTsKLQkJCQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQkJCX0KLQkJCQlMaXN0IHByb2Nlc3NFbGVtZW50cyA9IHByb2Nlc3NQYWNrYWdlLmdldFByb2Nlc3NFbGVtZW50cygpOwotCQkJCWZvciAoSXRlcmF0b3IgaSA9IHByb2Nlc3NFbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJUHJvY2Vzc0VsZW1lbnQgcHJvY2Vzc0VsZW1lbnQgPSAoUHJvY2Vzc0VsZW1lbnQpIGkubmV4dCgpOwotCQkJCQlpZiAocHJvY2Vzc0VsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJCSYmIHByb2Nlc3NFbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQkJCQlwcm9jZXNzUGFja2FnZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHByb2Nlc3NQYWNrYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0KE9iamVjdCBjaGlsZCwgYm9vbGVhbiByZWZyZXNoVmlld2VyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQoY2hpbGQpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChpbnNlcnRDaGlsZChwYXJlbnQsIGNoaWxkKSkgewotCQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJCXRyZWVWaWV3ZXIuYWRkKHBhcmVudCwgY2hpbGQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJlZnJlc2hWaWV3ZXIpIHsKLQkJCQkJdHJlZVZpZXdlci5yZWZyZXNoKHBhcmVudCk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoaWxkID0gcGFyZW50OwotCQkJcGFyZW50ID0gZ2V0UGFyZW50KGNoaWxkKTsKLQkJfQotCQlpZiAoaW5zZXJ0Q2hpbGQoc2VhcmNoUmVzdWx0LCBjaGlsZCkpIHsKLQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJdHJlZVZpZXdlci5hZGQoc2VhcmNoUmVzdWx0LCBjaGlsZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnNlcnRDaGlsZChPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKLQkJU2V0IGNoaWxkcmVuID0gKFNldCkgZWxlbWVudE1hcC5nZXQocGFyZW50KTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEhhc2hTZXQoKTsKLQkJCWVsZW1lbnRNYXAucHV0KHBhcmVudCwgY2hpbGRyZW4pOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2UoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkLCBPYmplY3QgbmV3Q2hpbGQpIHsKLQkJaW5zZXJ0KG5ld0NoaWxkLCBmYWxzZSk7Ci0JCWVsZW1lbnRNYXAucHV0KG5ld0NoaWxkLCAoU2V0KSBlbGVtZW50TWFwLmdldChjaGlsZCkpOwotCQllbGVtZW50TWFwLnJlbW92ZShjaGlsZCk7Ci0JCVNldCBjaGlsZHJlbiA9IChTZXQpIGVsZW1lbnRNYXAuZ2V0KHBhcmVudCk7Ci0JCWNoaWxkcmVuLnJlbW92ZShjaGlsZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKE9iamVjdCBlbGVtZW50LCBib29sZWFuIHJlZnJlc2hWaWV3ZXIpIHsKLQkJaWYgKGhhc0NoaWxkcmVuKGVsZW1lbnQpKSB7Ci0JCQlpZiAocmVmcmVzaFZpZXdlcikgewotCQkJCXRyZWVWaWV3ZXIucmVmcmVzaChlbGVtZW50KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChzZWFyY2hSZXN1bHQuZ2V0TWF0Y2hDb3VudChlbGVtZW50KSA9PSAwKSB7Ci0JCQkJZWxlbWVudE1hcC5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChlbGVtZW50KTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJcmVtb3ZlRnJvbVNpYmxpbmdzKGVsZW1lbnQsIHBhcmVudCk7Ci0JCQkJCXJlbW92ZShwYXJlbnQsIHJlZnJlc2hWaWV3ZXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlbW92ZUZyb21TaWJsaW5ncyhlbGVtZW50LCBzZWFyY2hSZXN1bHQpOwotCQkJCQlpZiAocmVmcmVzaFZpZXdlcikgewotCQkJCQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJCXRyZWVWaWV3ZXIucmVmcmVzaChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tU2libGluZ3MoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKLQkJU2V0IHNpYmxpbmdzID0gKFNldCkgZWxlbWVudE1hcC5nZXQocGFyZW50KTsKLQkJaWYgKHNpYmxpbmdzICE9IG51bGwpIHsKLQkJCXNpYmxpbmdzLnJlbW92ZShlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydHMgdGhlIFVJIGZvbGRlcnMgaW50byB0aGUgc2VhcmNoIHJlc3VsdCB0cmVlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluc2VydFVJRm9sZGVycyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJU2VhcmNoUmVzdWx0VUlGb2xkZXIgbWV0aG9kQ29udGVudEZvbGRlciA9IG5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCU1FVEhPRF9DT05URU5ULCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ29udGVudCIpLCBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCVNlYXJjaFJlc3VsdFVJRm9sZGVyIHByb2Nlc3Nlc0ZvbGRlciA9IG5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCVBST0NFU1NFUywgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NlcyIpLCBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCU9iamVjdFtdIG1ldGhvZFBhY2thZ2VzID0gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZXRob2RQYWNrYWdlcy5sZW5ndGg7IGorKykgewotCQkJCQlPYmplY3QgbWV0aG9kUGFja2FnZSA9IG1ldGhvZFBhY2thZ2VzW2pdOwotCQkJCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJCQkJJiYgKChDb250ZW50UGFja2FnZSkgbWV0aG9kUGFja2FnZSkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX0NPTlRFTlQpKSB7Ci0JCQkJCQlPYmplY3RbXSBwYWNrYWdlcyA9IGdldENoaWxkcmVuKG1ldGhvZFBhY2thZ2UpOwotCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBwYWNrYWdlcy5sZW5ndGg7IGsrKykgewotCQkJCQkJCU9iamVjdCBwa2cgPSBwYWNrYWdlc1trXTsKLQkJCQkJCQlpZiAocGtnIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCQkJaWYgKCgoQ29udGVudFBhY2thZ2UpIHBrZykuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCQkJCQlQS0dfTkFNRV9DT1JFX0NPTlRFTlQpKSB7Ci0JCQkJCQkJCQlyZXBsYWNlKAotCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQlwa2csCi0JCQkJCQkJCQkJCW5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCQkJCQkJCQlDT05URU5UX1BBQ0tBR0VTLAotCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMiKSwgbWV0aG9kQ29udGVudEZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0gZWxzZSBpZiAoKChDb250ZW50UGFja2FnZSkgcGtnKS5nZXROYW1lKCkKLQkJCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX0NBVEVHT1JJRVMpKSB7Ci0JCQkJCQkJCQlTZWFyY2hSZXN1bHRVSUZvbGRlciBzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIgPSBuZXcgU2VhcmNoUmVzdWx0VUlGb2xkZXIoCi0JCQkJCQkJCQkJCVNUQU5EQVJEX0NBVEVHT1JJRVMsCi0JCQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1N0YW5kYXJkQ2F0ZWdvcmllcyIpLCBtZXRob2RDb250ZW50Rm9sZGVyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJU2VhcmNoUmVzdWx0VUlGb2xkZXIgY3VzdG9tQ2F0ZWdvcmllc0ZvbGRlciA9IG5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCQkJCQkJQ1VTVE9NX0NBVEVHT1JJRVMsCi0JCQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0N1c3RvbUNhdGVnb3JpZXMiKSwgbWV0aG9kQ29udGVudEZvbGRlcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCU9iamVjdFtdIGNvbnRlbnRQYWNrYWdlcyA9IGdldENoaWxkcmVuKHBrZyk7Ci0JCQkJCQkJCQlmb3IgKGludCBsID0gMDsgbCA8IGNvbnRlbnRQYWNrYWdlcy5sZW5ndGg7IGwrKykgewotCQkJCQkJCQkJCU9iamVjdCBjb250ZW50UGFja2FnZSA9IGNvbnRlbnRQYWNrYWdlc1tsXTsKLQkJCQkJCQkJCQlpZiAoY29udGVudFBhY2thZ2UgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQkJCQkJCQlTdHJpbmcgcGtnTmFtZSA9ICgoQ29udGVudFBhY2thZ2UpIGNvbnRlbnRQYWNrYWdlKQotCQkJCQkJCQkJCQkJCS5nZXROYW1lKCk7Ci0JCQkJCQkJCQkJCWlmIChwa2dOYW1lCi0JCQkJCQkJCQkJCQkJLmVxdWFscyhQS0dfTkFNRV9DVVNUT01fQ0FURUdPUklFUykpIHsKLQkJCQkJCQkJCQkJCWluc2VydChjdXN0b21DYXRlZ29yaWVzRm9sZGVyLAotCQkJCQkJCQkJCQkJCQlmYWxzZSk7Ci0JCQkJCQkJCQkJCQllbGVtZW50TWFwCi0JCQkJCQkJCQkJCQkJCS5wdXQoCi0JCQkJCQkJCQkJCQkJCQkJY3VzdG9tQ2F0ZWdvcmllc0ZvbGRlciwKLQkJCQkJCQkJCQkJCQkJCQkoU2V0KSBlbGVtZW50TWFwCi0JCQkJCQkJCQkJCQkJCQkJCQkuZ2V0KGNvbnRlbnRQYWNrYWdlKSk7Ci0JCQkJCQkJCQkJCX0gZWxzZSBpZiAocGtnTmFtZQotCQkJCQkJCQkJCQkJCS5lcXVhbHMoUEtHX05BTUVfRElTQ0lQTElORVMpKSB7Ci0JCQkJCQkJCQkJCQlpbnNlcnQoCi0JCQkJCQkJCQkJCQkJCXN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlciwKLQkJCQkJCQkJCQkJCQkJZmFsc2UpOwotCQkJCQkJCQkJCQkJcmVwbGFjZSgKLQkJCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkJY29udGVudFBhY2thZ2UsCi0JCQkJCQkJCQkJCQkJCW5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCQkJCQkJCQkJCQlESVNDSVBMSU5FUywKLQkJCQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0Rpc2NpcGxpbmVzIiksIHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCX0gZWxzZSBpZiAocGtnTmFtZQotCQkJCQkJCQkJCQkJCS5lcXVhbHMoUEtHX05BTUVfRE9NQUlOUykpIHsKLQkJCQkJCQkJCQkJCWluc2VydCgKLQkJCQkJCQkJCQkJCQkJc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyLAotCQkJCQkJCQkJCQkJCQlmYWxzZSk7Ci0JCQkJCQkJCQkJCQlyZXBsYWNlKAotCQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCQljb250ZW50UGFja2FnZSwKLQkJCQkJCQkJCQkJCQkJbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCQkJCQkJCQkJCQkJCURPTUFJTlMsCi0JCQkJCQkJCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Eb21haW5zIiksIHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCX0gZWxzZSBpZiAocGtnTmFtZQotCQkJCQkJCQkJCQkJCS5lcXVhbHMoUEtHX05BTUVfV09SS19QUk9EVUNUX1RZUEVTKSkgewotCQkJCQkJCQkJCQkJaW5zZXJ0KAotCQkJCQkJCQkJCQkJCQlzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIsCi0JCQkJCQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQkJCQkJCXJlcGxhY2UoCi0JCQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJCWNvbnRlbnRQYWNrYWdlLAotCQkJCQkJCQkJCQkJCQluZXcgU2VhcmNoUmVzdWx0VUlGb2xkZXIoCi0JCQkJCQkJCQkJCQkJCQkJV09SS19QUk9EVUNUX1RZUEVTLAotCQkJCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlcyIpLCBzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQl9IGVsc2UgaWYgKHBrZ05hbWUKLQkJCQkJCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX1JPTEVTRVRTKSkgewotCQkJCQkJCQkJCQkJaW5zZXJ0KAotCQkJCQkJCQkJCQkJCQlzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIsCi0JCQkJCQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQkJCQkJCXJlcGxhY2UoCi0JCQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJCWNvbnRlbnRQYWNrYWdlLAotCQkJCQkJCQkJCQkJCQluZXcgU2VhcmNoUmVzdWx0VUlGb2xkZXIoCi0JCQkJCQkJCQkJCQkJCQkJUk9MRVNFVFMsCi0JCQkJCQkJCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlcyIpLCBzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQl9IGVsc2UgaWYgKHBrZ05hbWUKLQkJCQkJCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX1RPT0xTKSkgewotCQkJCQkJCQkJCQkJaW5zZXJ0KAotCQkJCQkJCQkJCQkJCQlzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIsCi0JCQkJCQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQkJCQkJCXJlcGxhY2UoCi0JCQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJCWNvbnRlbnRQYWNrYWdlLAotCQkJCQkJCQkJCQkJCQluZXcgU2VhcmNoUmVzdWx0VUlGb2xkZXIoCi0JCQkJCQkJCQkJCQkJCQkJVE9PTFMsCi0JCQkJCQkJCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Ub29scyIpLCBzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxlbWVudE1hcC5yZW1vdmUocGtnKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSBpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UKLQkJCQkJCQkJCSYmICgoUHJvY2Vzc1BhY2thZ2UpIHBrZykuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCQkJCQkJUEtHX05BTUVfQ0FQQUJJTElUWV9QQVRURVJOUykpIHsKLQkJCQkJCQkJcmVwbGFjZSgKLQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCXBrZywKLQkJCQkJCQkJCQluZXcgU2VhcmNoUmVzdWx0VUlGb2xkZXIoCi0JCQkJCQkJCQkJCQlDQVBBQklMSVRZX1BBVFRFUk5TLAotCQkJCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucyIpLCBwcm9jZXNzZXNGb2xkZXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCVNldCBjaGlsZHJlbiA9IChTZXQpIGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpOwotCQkJCQkJY2hpbGRyZW4ucmVtb3ZlKG1ldGhvZFBhY2thZ2UpOwotCQkJCQl9IGVsc2UgaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZQotCQkJCQkJCSYmICgoUHJvY2Vzc1BhY2thZ2UpIG1ldGhvZFBhY2thZ2UpLmdldE5hbWUoKQotCQkJCQkJCQkJLmVxdWFscyhQS0dfTkFNRV9ERUxJVkVSWV9QUk9DRVNTRVMpKSB7Ci0JCQkJCQlyZXBsYWNlKAotCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQltZXRob2RQYWNrYWdlLAotCQkJCQkJCQluZXcgU2VhcmNoUmVzdWx0VUlGb2xkZXIoCi0JCQkJCQkJCQkJREVMSVZFUllfUFJPQ0VTU0VTLAotCQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzZXMiKSwgcHJvY2Vzc2VzRm9sZGVyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9TZWFyY2hSZXN1bHRVSUZvbGRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdFVJRm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljYzkwYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdFVJRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIE1vZGVscyBhIFVJIGZvbGRlciBpbiB0aGUgbWV0aG9kIHNlYXJjaCByZXN1bHQgdHJlZSB2aWV3LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFJlc3VsdFVJRm9sZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlIERFRkFVTFRfSU1BR0UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0ZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIGZvciB0aGUgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBTZWFyY2hSZXN1bHRVSUZvbGRlcihTdHJpbmcgbmFtZSkgewotCQl0aGlzKG5hbWUsIERFRkFVTFRfSU1BR0UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIGZvbGRlcgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIFNlYXJjaFJlc3VsdFVJRm9sZGVyKFN0cmluZyBuYW1lLCBPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMobmFtZSwgREVGQVVMVF9JTUFHRSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBmb2xkZXIKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIGFuIGltYWdlIGZvciB0aGUgZm9sZGVyCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgU2VhcmNoUmVzdWx0VUlGb2xkZXIoU3RyaW5nIG5hbWUsIEltYWdlIGltYWdlLCBPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb2xkZXIgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UuCi0JICogCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZm9yIGEgVUkgZm9sZGVyCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgb2JqZWN0IGZvciB0aGUgZm9sZGVyCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcGFyZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IG9iamVjdAotCSAqIEByZXR1cm4gdGhlIGdpdmVuIHBhcmVudCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgZm9sZGVyIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZmNiYzJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBzZWFyY2hpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGQ1NjEyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBzZWFyY2hpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcHJlZmVyZW5jZXMvU2VhcmNoVUlQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL3ByZWZlcmVuY2VzL1NlYXJjaFVJUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTU1NjE0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcHJlZmVyZW5jZXMvU2VhcmNoVUlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlQbHVnaW47Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgU2VhcmNoIFVJIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFVJUHJlZmVyZW5jZXMgewotCi0JLyoqCi0JICogVGhlIFNlYXJjaCBVSSBwcmVmZXJlbmNlIGtleXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VBUkNIX1NUUklORyA9ICJzZWFyY2hTdHJpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BBVFRFUk4gPSAibmFtZVBhdHRlcm4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVNFX1NFTlNJVElWRSA9ICJjYXNlU2Vuc2l0aXZlIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNhdmVkIHNlYXJjaCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VhcmNoU3RyaW5nKCkgewotCQlyZXR1cm4gU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQlTRUFSQ0hfU1RSSU5HKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY3VycmVudCBzZWFyY2ggc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTZWFyY2hTdHJpbmcoU3RyaW5nIHNlYXJjaFN0cmluZykgewotCQlTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJU0VBUkNIX1NUUklORywgc2VhcmNoU3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzYXZlZCBuYW1lIHBhdHRlcm4gc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVQYXR0ZXJuKCkgewotCQlyZXR1cm4gU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQlOQU1FX1BBVFRFUk4pOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjdXJyZW50IG5hbWUgcGF0dGVybiBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldE5hbWVQYXR0ZXJuKFN0cmluZyBuYW1lUGF0dGVybikgewotCQlTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoTkFNRV9QQVRURVJOLAotCQkJCW5hbWVQYXR0ZXJuKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzYXZlZCBhc2Ugc2Vuc2l0aXZlIG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Q2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIFNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCUNBU0VfU0VOU0lUSVZFKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY3VycmVudCBjYXNlIHNlbnNpdGl2ZSBvcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENhc2VTZW5zaXRpdmUoYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7Ci0JCVNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlDQVNFX1NFTlNJVElWRSwgY2FzZVNlbnNpdGl2ZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUxMDM5ZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHByZWZlcmVuY2Ugc3VwcG9ydCBmb3Igc2VhcmNoaW5nIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmRhNTNhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuc2VhcmNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjIwZDZjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaAotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5TZWFyY2hQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IGNvbS5pYm0uaWN1LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuYXBhY2hlLmx1Y2VuZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5zZWFyY2gsCi0gb3JnLmVjbGlwc2UudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmFuYWx5c2lzLAotIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTdkNmY1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmZjNzAzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFNlYXJjaAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL0dlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2Y2ZTdjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBzZWFyY2ggaW5kZXggZ2VuZXJhdGlvbiBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uIGV4dGVuZHMgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NTM3NDA1MjExNDUxMTc3MTEwTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEdlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIEdlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24gYW5kIHRoZQotCSAqIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlLCBTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIocm9vdENhdXNlLCBlcnJvck1zZyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL0lTZWFyY2hTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvSVNlYXJjaFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjA5YTIxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvSVNlYXJjaFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhpdEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uU2VhcmNoUXVlcnk7Ci0KLS8qKgotICogVGhlIFNlYXJjaCBTZXJ2aWNlIEFQSS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlYXJjaFNlcnZpY2UgewotCi0JLyoqCi0JICogU2VhcmNoZXMgYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHNlYXJjaFF1ZXJ5Ci0JICogICAgICAgICAgICBhIGNvbmZpZ3VyYXRpb24gc2VhcmNoIHF1ZXJ5Ci0JICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5Db25maWd1cmF0aW9uSGl0RW50cnk8L2NvZGU+IG9iamVjdHMKLQkgKiBAdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkhpdEVudHJ5W10gc2VhcmNoQ29uZmlndXJhdGlvbihTdHJpbmcgcGF0aCwKLQkJCUNvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeSBzZWFyY2hRdWVyeSkgdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9JbmRleEJ1aWxkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9JbmRleEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWU4MmZmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvSW5kZXhCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkRpcmVjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5GU0RpcmVjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5SQU1EaXJlY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5hbmFseXNpcy5UZXh0QW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51dGlscy5MSFRNTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnV0aWxzLkphckNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51dGlscy5VTkNVdGlsOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIG1haW4gY2xhc3MgdGhhdCBjcmVhdGVzIHRoZSBJbmRleCBmcm9tIHRoZSBmaWxlCi0gKiBhc3NvY2lhdGlvbnMgaW4gdGhlIHByb2Nlc3MgbGF5b3V0LgotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhCdWlsZGVyIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRklMRV9OQU1FID0gInZlcnNpb24udHh0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9ERUxJTUlURVIgPSAiKiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIERvY3VtZW50IGZpZWxkcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9ERVNDUklQVElPTl9GSUVMRCA9ICJicmllZkRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRklFTEQgPSAiY29udGVudHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRklFTEQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ESUZJRURfRklFTEQgPSAibW9kaWZpZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9GSUVMRCA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfRklFTEQgPSAicm9sZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVU1NQVJZX0ZJRUxEID0gInN1bW1hcnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9GSUVMRCA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9GSUVMRCA9ICJ1cmwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFX0ZJRUxEID0gInRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfRUxFTUVOVF9UWVBFX0ZJRUxEID0gInVtYS50eXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfQ09OVEVOVCA9ICJnZW5lcmFsX2NvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBMaXN0IG9mIFVNQSBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgc2VhcmNoIGluZGV4LgotCXByaXZhdGUgc3RhdGljIExpc3QgTk9fU0VBUkNIRUFCTEVfVU1BX0VMRU1FTlRTID0gbmV3IEFycmF5TGlzdCgpOwotCXN0YXRpYyB7Ci0JCU5PX1NFQVJDSEVBQkxFX1VNQV9FTEVNRU5UUy5hZGQoInN1bW1hcnkiKTsKLQkJTk9fU0VBUkNIRUFCTEVfVU1BX0VMRU1FTlRTLmFkZCgid29ya3Byb2R1Y3RkZXNjcmlwdG9yIik7Ci0JCU5PX1NFQVJDSEVBQkxFX1VNQV9FTEVNRU5UUy5hZGQoInRhc2tkZXNjcmlwdG9yIik7Ci0JCU5PX1NFQVJDSEVBQkxFX1VNQV9FTEVNRU5UUy5hZGQoInJvbGVkZXNjcmlwdG9yIik7Ci0JfQotCi0JLy8gQSBsaXN0IG9mIHRvcCBsZXZlbCBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZSBzZWFyY2gKLQkvLyBpbmRleC4KLQlwcml2YXRlIGphdmEudXRpbC5MaXN0IGRpcnNUb1NraXAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBTdHJpbmcgcERpcmVjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgaW5kZXhGb2xkZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHByb2R1Y3ROYW1lID0gbnVsbDsKLQotCXB1YmxpYyBJbmRleEJ1aWxkZXIoU3RyaW5nIHB1Ymxpc2hEaXIpIHsKLQkJaW50IGFwcGxldEluZGV4ID0gLTE7Ci0JCWlmIChwdWJsaXNoRGlyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJYXBwbGV0SW5kZXggPSBwdWJsaXNoRGlyLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IgKyAiYXBwbGV0Iik7Ci0KLQkJcERpcmVjdG9yeSA9IFVOQ1V0aWwuY29udmVydEZpbGVuYW1lKChhcHBsZXRJbmRleCA+IC0xKSA/IHB1Ymxpc2hEaXIKLQkJCQkuc3Vic3RyaW5nKDAsIGFwcGxldEluZGV4ICsgMSkgOiBwdWJsaXNoRGlyKTsKLQkJU3RyaW5nIHNpdGVOYW1lID0gcERpcmVjdG9yeS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJaW50IGluZGV4ID0gc2l0ZU5hbWUubGVuZ3RoKCk7Ci0JCWlmIChzaXRlTmFtZS5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCWluZGV4ID0gaW5kZXggLSAxOwotCQl9Ci0KLQkJaW50IGluZGV4MiA9IHNpdGVOYW1lLmxhc3RJbmRleE9mKCIvIiwgaW5kZXggLSAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCXByb2R1Y3ROYW1lID0gc2l0ZU5hbWUuc3Vic3RyaW5nKGluZGV4MiArIDEsIGluZGV4KTsKLQotCQkvLyBjcmVhdGUgdGhlIGluZGV4Ci0JCVN0cmluZ0J1ZmZlciBzZWFyY2hGb2xkZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHBEaXJlY3RvcnkpOwotCQlpZiAoIXNlYXJjaEZvbGRlci50b1N0cmluZygpLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJc2VhcmNoRm9sZGVyLmFwcGVuZChGaWxlLnNlcGFyYXRvcik7Ci0JCX0KLQkJc2VhcmNoRm9sZGVyLmFwcGVuZCgic2VhcmNoIik7IC8vJE5PTi1OTFMtMiQKLQotCQlpbmRleEZvbGRlciA9IG5ldyBTdHJpbmdCdWZmZXIoc2VhcmNoRm9sZGVyLnRvU3RyaW5nKCkpOwotCQlpbmRleEZvbGRlci5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpLmFwcGVuZCgiaW5kZXgiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAiYXBwbGV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJjc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgImV4dF9oZWxwIik7IC8vJE5PTi1OTFMtMSQJCQotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgImljb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJpbWFnZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgImluZGV4Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJsb2dzIik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJtYW51YWxzIik7IC8vJE5PTi1OTFMtMSQJCQotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgIm5vYXBwbGV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJwYWdlc19ub3RfaW5zdGFsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJwcm9jZXNzIik7IC8vJE5PTi1OTFMtMSQJCQotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgInNjcmlwdHMiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgInN0eWxlc2hlZXRzIik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJ4bWwiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgInNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY3JlYXRlSW5kZXgoYm9vbGVhbiBqYXJJdCkgdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKEluZGV4QnVpbGRlci5jbGFzcykgewotCi0JCQlpZiAoaW5kZXhGb2xkZXIgPT0gbnVsbCB8fCBwRGlyZWN0b3J5ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotCQkJCQkJIkludmFsaWQgaW5kZXhGb2xkZXIgb3IgcERpcmVjdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJUkFNRGlyZWN0b3J5IHJhbURpciA9IG5ldyBSQU1EaXJlY3RvcnkoKTsKLQotCQkJCUluZGV4V3JpdGVyIGZzV3JpdGVyID0gbmV3IEluZGV4V3JpdGVyKEZTRGlyZWN0b3J5Ci0JCQkJCQkuZ2V0RGlyZWN0b3J5KGluZGV4Rm9sZGVyLnRvU3RyaW5nKCksIHRydWUpLAotCQkJCQkJbmV3IFRleHRBbmFseXplcigpLCB0cnVlKTsKLQotCQkJCUluZGV4V3JpdGVyIHJhbVdyaXRlciA9IG5ldyBJbmRleFdyaXRlcihyYW1EaXIsCi0JCQkJCQluZXcgVGV4dEFuYWx5emVyKCksIHRydWUpOwotCi0JCQkJaWYgKChmc1dyaXRlciAhPSBudWxsKSkgewotCQkJCQkvLyBmc1dyaXRlci5tZXJnZUZhY3RvciA9IDEwMDA7Ci0JCQkJCS8vIGZzV3JpdGVyLm1heE1lcmdlRG9jcyA9IDEwMDAwOwotCQkJCQlmc1dyaXRlci5tYXhGaWVsZExlbmd0aCA9IDEwMDAwMDA7Ci0KLQkJCQkJaW5kZXhEb2NzKG5ldyBGaWxlKHBEaXJlY3RvcnkpLCByYW1Xcml0ZXIpOwotCi0JCQkJCWZzV3JpdGVyLmFkZEluZGV4ZXMobmV3IERpcmVjdG9yeVtdIHsgcmFtRGlyIH0pOwotCQkJCQlmc1dyaXRlci5vcHRpbWl6ZSgpOwotCQkJCQlyYW1Xcml0ZXIuY2xvc2UoKTsKLQkJCQkJZnNXcml0ZXIuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGVJbmRleCIpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaW5kZXggY3JlYXRlZCBzdWNjZXNzZnVsbHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkvLyBjcmVhdGUgdGhlIHZlcnNpb24gZmlsZS4KLQkJCURhdGUgdG9kYXkgPSBuZXcgRGF0ZSgpOwotCQkJbG9uZyBtaWxsaXNlY29uZHMgPSB0b2RheS5nZXRUaW1lKCk7Ci0JCQkKLQkJCWlmICghamFySXQpIHsKLQkJCQl0cnkgewotCQkJCQlGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoaW5kZXhGb2xkZXIgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCSsgVkVSU0lPTl9GSUxFX05BTUUpOwotCQkJCQlCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihmdyk7Ci0JCQkJCWJ3LndyaXRlKHByb2R1Y3ROYW1lICsgVkVSU0lPTl9ERUxJTUlURVIgKyBtaWxsaXNlY29uZHMgKwotCQkJCQkJCSJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJ3LmNsb3NlKCk7Ci0JCQkJCWZ3LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCXRocm93IG5ldyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uKAotCQkJCQkJCVNlYXJjaFJlc291cmNlcy5jcmVhdGVTZWFyY2hJbmRleEVycm9yKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8vIGphciB1cCB0aGUgY3JlYXRlZCBpbmRleC4KLQkJCUphckNyZWF0b3IuamFyRm9sZGVyKGluZGV4Rm9sZGVyLnRvU3RyaW5nKCkpOwotCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImluZGV4IEphcnJlZCBzdWNjZXNzZnVsbHkiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl0cnkgewotCQkJCS8vIGRlbGV0ZSB0aGUgZmlsZXMgbm93IHRoYXQgdGhleSd2ZSBiZWVuIGphcnJlZC4KLQkJCQlGaWxlIGluZGV4RGlyID0gbmV3IEZpbGUoaW5kZXhGb2xkZXIudG9TdHJpbmcoKSk7Ci0JCQkJRmlsZVtdIGZpbGVzID0gaW5kZXhEaXIubGlzdEZpbGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlGaWxlIHRlbXBGaWxlID0gZmlsZXNbaV07Ci0JCQkJCWlmICghdGVtcEZpbGUuZ2V0TmFtZSgpLmVxdWFscyhKYXJDcmVhdG9yLklOREVYX0pBUikpIHsKLQkJCQkJCXRlbXBGaWxlLmRlbGV0ZSgpOwotCQkJCQl9Ci0JCQkJfQkKLQotCQkJCS8vIFN0cmluZyBydXBOYW1lID0gcHVibGlzaERpci5zdWJzdHJpbmcoaW5kZXgpOwotCQkJCUZpbGUgbmV3SW5kZXhKYXIgPSBuZXcgRmlsZShpbmRleEZvbGRlciArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkrIEphckNyZWF0b3IuSU5ERVhfSkFSKTsKLQkJCQlpZiAobmV3SW5kZXhKYXIuZXhpc3RzKCkpIHsKLQkJCQkJU3RyaW5nIGZpbGVTaXplID0gIiIgKyBuZXdJbmRleEphci5sZW5ndGgoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoaW5kZXhGb2xkZXIgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCSsgVkVSU0lPTl9GSUxFX05BTUUpOwotCQkJCQlCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihmdyk7Ci0JCQkJCWJ3LndyaXRlKHByb2R1Y3ROYW1lICsgVkVSU0lPTl9ERUxJTUlURVIgKyBtaWxsaXNlY29uZHMKLQkJCQkJCQkrIFZFUlNJT05fREVMSU1JVEVSICsgZmlsZVNpemUgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlidy5jbG9zZSgpOwotCQkJCQlmdy5jbG9zZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uKAotCQkJCQkJCVNlYXJjaFJlc291cmNlcy5jcmVhdGVTZWFyY2hJbmRleEVycm9yKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQl0aHJvdyBuZXcgU2VhcmNoU2VydmljZUV4Y2VwdGlvbigKLQkJCQkJCVNlYXJjaFJlc291cmNlcy5jcmVhdGVTZWFyY2hJbmRleEVycm9yKTsKLQkJCX0KLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbmRleCB0aGUgYWN0dWFsIGRvY3VtZW50cyBzcGVjaWZpZWQgYnkgdGhlIGZpbGVzIGFuZCByZWN1cnNpdmVseSBnZXQgYWxsCi0JICogZmlsZSBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlciBmaWxlCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluZGV4RG9jcyhGaWxlIGZpbGUsIEluZGV4V3JpdGVyIHdyaXRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChkaXJzVG9Ta2lwLmNvbnRhaW5zKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJU3RyaW5nW10gZmlsZXMgPSBmaWxlLmxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbmRleERvY3MobmV3IEZpbGUoZmlsZSwgZmlsZXNbaV0pLCB3cml0ZXIpOwotCQkJfQotCQl9IGVsc2UgaWYgKGlzSHRtbERvYyhmaWxlKSkgewotCQkJaWYgKHNob3VsZEJlRXhjbHVkZWQoZmlsZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0cnkgewotCQkJCURvY3VtZW50IGRvYyA9IGdldEhUTUxEb2N1bWVudChmaWxlKTsKLQotCQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCQl3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZmlsZS5nZXROYW1lKCkpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaW5kZXhEb2NzIik7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUgc2VhcmNoIGluZGV4LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBUaGUgZmlsZSB0byBiZSB2ZXJpZmllZC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBmaWxlIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZQotCSAqICAgICAgICAgc2VhcmNoIGluZGV4LgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRCZUV4Y2x1ZGVkKEZpbGUgZmlsZSkgewotCQlTdHJpbmcgcGF0aCA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlpZiAocERpcmVjdG9yeS5zdGFydHNXaXRoKHBhdGgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSHRtbERvYyhGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIHBhdGggPSBmaWxlLmdldFBhdGgoKTsKLQkJcmV0dXJuIHBhdGguZW5kc1dpdGgoIi5odG1sIikgfHwgcGF0aC5lbmRzV2l0aCgiLmh0bSIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50IGdldEhUTUxEb2N1bWVudChGaWxlIGZpbGUpIHsKLQkJRG9jdW1lbnQgbHVjZW5lRG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoKTsKLQotCQlTdHJpbmcgdXJsID0gZmlsZS5nZXRQYXRoKCkucmVwbGFjZShGaWxlLnBhdGhTZXBhcmF0b3JDaGFyLCAnLycpOwotCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuVW5JbmRleGVkKFVSTF9GSUVMRCwgdXJsKSk7Ci0KLQkJdHJ5IHsKLQkJCUxIVE1MUGFyc2VyIHBhcnNlciA9IG5ldyBMSFRNTFBhcnNlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCi0JCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSksICJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlSZWFkZXIgcmVhZGVyID0gcGFyc2VyLmdldFJlYWRlcigpOwotCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLlRleHQoQ09OVEVOVF9GSUVMRCwgcmVhZGVyKSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlTdHJpbmcgdGl0bGUgPSBwYXJzZXIuZ2V0VGl0bGUoKTsKLQkJCWlmICh0aXRsZSAhPSBudWxsICYmIHRpdGxlLmxlbmd0aCgpID4gMCkgewotCQkJCS8vIFdvcmthcm91bmQgYSBMaW51eCBzcGVjaWZpYyBpc3N1ZS4KLQkJCQl0aXRsZSA9IHRpdGxlLnJlcGxhY2VBbGwoIlxceGEwIiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLlRleHQoVElUTEVfRklFTEQsIHRpdGxlKSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlTdHJpbmcgc3VtbWFyeSA9IHBhcnNlci5nZXRTdW1tYXJ5KCk7Ci0JCQlpZiAoc3VtbWFyeS5zdGFydHNXaXRoKHRpdGxlKSkgewotCQkJCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5VbkluZGV4ZWQoU1VNTUFSWV9GSUVMRCwgc3VtbWFyeQotCQkJCQkJLnN1YnN0cmluZyh0aXRsZS5sZW5ndGgoKSArIDEpKSk7Ci0JCQl9IGVsc2UKLQkJCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuVW5JbmRleGVkKFNVTU1BUllfRklFTEQsIHBhcnNlcgotCQkJCQkJLmdldFN1bW1hcnkoKSkpOwotCi0JCQlQcm9wZXJ0aWVzIG1ldGFUYWdzID0gcGFyc2VyLmdldE1ldGFUYWdzKCk7Ci0JCQlmb3IgKEVudW1lcmF0aW9uIG5hbWVzID0gbWV0YVRhZ3MucHJvcGVydHlOYW1lcygpOyBuYW1lcwotCQkJCQkuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJU3RyaW5nIHRhZ05hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0RWxlbWVudCgpOwotCQkJCWlmICh0YWdOYW1lICE9IG51bGwpIHsKLQkJCQkJaWYgKHRhZ05hbWUuZXF1YWxzKFJPTEVfRklFTEQpKSB7Ci0JCQkJCQlTdHJpbmcgcm9sZU5hbWUgPSBtZXRhVGFncy5nZXRQcm9wZXJ0eSh0YWdOYW1lKTsKLQkJCQkJCWlmIChyb2xlTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLlRleHQodGFnTmFtZSwgcm9sZU5hbWUpKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZyB0YWdWYWx1ZSA9IG1ldGFUYWdzLmdldFByb3BlcnR5KHRhZ05hbWUpOwotCQkJCQkJaWYgKHRhZ1ZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuVGV4dCh0YWdOYW1lLCB0YWdWYWx1ZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobHVjZW5lRG9jdW1lbnQuZ2V0RmllbGQoUk9MRV9GSUVMRCkgPT0gbnVsbCkgewotCQkJCS8vIERlZmF1bHQgdG8gIm5hIiB0byBzdXBwb3J0IHNlYXJjaGluZyBmb3IgZmlsZXMgd2l0aG91dAotCQkJCS8vIHJvbGUgbWV0YSB0YWdzLgotCQkJCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5UZXh0KFJPTEVfRklFTEQsICJOT1JVUFJPTEUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJRmllbGQgdW1hVHlwZUZpZWxkID0gbHVjZW5lRG9jdW1lbnQKLQkJCQkJLmdldEZpZWxkKFVNQV9FTEVNRU5UX1RZUEVfRklFTEQpOwotCQkJaWYgKHVtYVR5cGVGaWVsZCA9PSBudWxsKSB7Ci0JCQkJLy8gRGVmYXVsdCB0byBnZW5lcmFsIGNvbnRlbnQuCi0JCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLlRleHQoVU1BX0VMRU1FTlRfVFlQRV9GSUVMRCwKLQkJCQkJCUdFTkVSQUxfQ09OVEVOVCkpOwotCQkJfSBlbHNlIGlmIChOT19TRUFSQ0hFQUJMRV9VTUFfRUxFTUVOVFMuY29udGFpbnModW1hVHlwZUZpZWxkCi0JCQkJCS5zdHJpbmdWYWx1ZSgpKSkgewotCQkJCS8vIEV4Y2x1ZGUgbm9uLXNlYXJjaGVhYmxlIGVsZW1lbnRzIGZyb20gdGhlIHNlYXJjaAotCQkJCS8vIGluZGV4LgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwYXJzZXIgPSBudWxsOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsdWNlbmVEb2N1bWVudCA9IG51bGw7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImdldEhUTUxEb2N1bWVudCIpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiBsdWNlbmVEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlNmFiNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIEluZGV4aW5nIHByb2dyZXNzIG1vbml0b3IKLWluZGV4Q29uZmlnRmlsZXNUYXNrX25hbWU9SW5kZXhpbmcgY29uZmlndXJhdGlvbiBmaWxlcy4uLgotCi0jIEVycm9yIERldGFpbHMKLWNyZWF0ZVNlYXJjaEluZGV4RXJyb3I9VGhlIHNlYXJjaCBpbmRleCBmaWxlIHdhcyBub3QgY3JlYXRlZC4KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjkyYTkxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBzZWFyY2ggY29uZmlndXJhdGlvbiBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NTM3NDA1MjExNDUxMTc3MTEwTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIFNlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24gYW5kIHRoZQotCSAqIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlLCBTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIocm9vdENhdXNlLCBlcnJvck1zZyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjZlYWI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgU2VhcmNoIHBsdWctaW4gYWN0aXZhdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlYXJjaFBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBTZWFyY2hQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VhcmNoUGx1Z2luIGdldERlZmF1bHQoKSB7CQotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFJlc291cmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMWI3Yjc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBTZWFyY2ggcmVzb3VyY2UgYnVuZGxlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlYXJjaFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBTZWFyY2hSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVTZWFyY2hJbmRleEVycm9yOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgU2VhcmNoUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFNlYXJjaFJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwNmJlMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLldhclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5aaXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGl0RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2U7Ci0KLQotLyoqCi0gKiBUaGUgU2VhcmNoIFNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoU2VydmljZSBpbXBsZW1lbnRzIElTZWFyY2hTZXJ2aWNlIHsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgU2VhcmNoU2VydmljZSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZWFyY2hTZXJ2aWNlIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChTZWFyY2hTZXJ2aWNlLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgU2VhcmNoU2VydmljZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBTZWFyY2hTZXJ2aWNlKCkgewotCX0KLQotCS8qKgotCSAqIFNlYXJjaGVzIGEgcHVibGlzaGVkIENvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBzZWFyY2hRdWVyeQotCSAqICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gc2VhcmNoIHF1ZXJ5Ci0JICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5Db25maWd1cmF0aW9uSGl0RW50cnk8L2NvZGU+IG9iamVjdHMKLQkgKiBAdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkhpdEVudHJ5W10gc2VhcmNoQ29uZmlndXJhdGlvbihTdHJpbmcgcGF0aCwKLQkJCUNvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeSBzZWFyY2hRdWVyeSkgdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlDb25maWd1cmF0aW9uU2VhcmNoU2VydmljZSBzZXJ2aWNlID0gbmV3IENvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlKAotCQkJCXBhdGgpOwotCQlzZXJ2aWNlLmluZGV4KCk7Ci0JCXJldHVybiBzZXJ2aWNlLnNlYXJjaChzZWFyY2hRdWVyeSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNyZWF0ZUluZGV4KFN0cmluZyBwdWJsaXNoRGlyKSB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCUluZGV4QnVpbGRlciBzZXJ2aWNlID0gbmV3IEluZGV4QnVpbGRlcihwdWJsaXNoRGlyKTsKLQkJcmV0dXJuIHNlcnZpY2UuY3JlYXRlSW5kZXgodHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNyZWF0ZUluZGV4KFN0cmluZyBwdWJsaXNoRGlyLCBib29sZWFuIGphckl0KSB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCUluZGV4QnVpbGRlciBzZXJ2aWNlID0gbmV3IEluZGV4QnVpbGRlcihwdWJsaXNoRGlyKTsKLQkJcmV0dXJuIHNlcnZpY2UuY3JlYXRlSW5kZXgoamFySXQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVXQVIoU3RyaW5nIHB1Ymxpc2hEaXIsIFN0cmluZyB3ZWJBcHBOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdCdWZmZXIgZGlyMndhciA9IG5ldyBTdHJpbmdCdWZmZXIoKHB1Ymxpc2hEaXIuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSA/IAotCQkJCQlwdWJsaXNoRGlyLnN1YnN0cmluZygwLCBwdWJsaXNoRGlyLmxlbmd0aCgpLTEpIDoKLQkJCQkJCXB1Ymxpc2hEaXIpOwotCQkJCi0JCQlkaXIyd2FyLmFwcGVuZCgiX1dBUiIpLmFwcGVuZChGaWxlLnNlcGFyYXRvcik7Ci0JCQlGaWxlIHdhckRpciA9IG5ldyBGaWxlKGRpcjJ3YXIudG9TdHJpbmcoKSk7Ci0JCQlpZiAoIXdhckRpci5leGlzdHMoKSkgewotCQkJCXdhckRpci5ta2RpcnMoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRmlsZVV0aWwuZGVsZXRlQWxsRmlsZXMod2FyRGlyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIHdhckZpbGUgPSBkaXIyd2FyLmFwcGVuZCh3ZWJBcHBOYW1lKS5hcHBlbmQoIi53YXIiKS50b1N0cmluZygpOwotCQkJCQotCQkJV2FyVXRpbC5idWlsZFdhckZpbGUod2FyRmlsZSwgcHVibGlzaERpciwgbnVsbCk7Ci0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFNlcnZpY2VFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hTZXJ2aWNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEyNWEyYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFNlcnZpY2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2g7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGEgU2VhcmNoIFNlcnZpY2Ugb3BlcmF0aW9uIGhhcyBmYWlsZWQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTA2MzMwMjE4MDg2OTE1NzMxNkw7Ci0KLQkvKioKLQkgKiBUaGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBUaHJvd2FibGUgcm9vdENhdXNlOwotCi0JLyoqCi0JICogVGhlIGVycm9yIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlcnJvck1zZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU2VhcmNoU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXRoaXMocm9vdENhdXNlLCByb290Q2F1c2UuZ2V0TWVzc2FnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgU2VhcmNoU2VydmljZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJdGhpcyhudWxsLCBlcnJvck1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uIGFuZCB0aGUKLQkgKiBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSwgU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucm9vdENhdXNlID0gcm9vdENhdXNlOwotCQl0aGlzLmVycm9yTXNnID0gZXJyb3JNc2c7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBUaHJvd2FibGUgZ2V0Um9vdENhdXNlKCkgewotCQlyZXR1cm4gcm9vdENhdXNlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDA1ZmEyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgU2VhcmNoIFN0b3AgV29yZHMKLVNlYXJjaC5zdG9wV29yZHM9XAotYSwgYWJvdXQsIGFuLCBhbmQsIGFyZSwgYXMsIGF0LCBiZSwgYnV0LCBieSwgZm9yLCBmcm9tLCBob3csIFwKLWksIGlmLCBpbiwgaW50bywgaXMsIGl0LCBubywgbm90LCBvZiwgb24sIG9yLCBzLCBzdWNoLCBcCi10LCB0aGF0LCB0aGUsIHRoZWlyLCB0aGVuLCB0aGVyZSwgdGhlc2UsIHRoZXksIHRoaXMsIHRvLCBcCi13YXMsIHdoYXQsIHdoZW4sIHdoZXJlLCB3aG8sIHdpbGwsIHdpdGgKLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dEFuYWx5emVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dEFuYWx5emVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlODAzZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1RleHRBbmFseXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5hbmFseXNpczsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuQW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW5TdHJlYW07Ci0KLS8qKgotICogQSB0ZXh0IGFuYWx5emVyIHRoYXQgaGFuZGxlcyBVbmljb2RlIDQuMSBjaGFyYWN0ZXJzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRleHRBbmFseXplciBleHRlbmRzIEFuYWx5emVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRleHRBbmFseXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkFuYWx5emVyI3Rva2VuU3RyZWFtKFN0cmluZywgUmVhZGVyKQotCSAqLwotCXB1YmxpYyBmaW5hbCBUb2tlblN0cmVhbSB0b2tlblN0cmVhbShTdHJpbmcgZmllbGROYW1lLCBSZWFkZXIgcmVhZGVyKSB7Ci0JCVRva2VuU3RyZWFtIHJlc3VsdCA9IG5ldyBUZXh0VG9rZW5pemVyKHJlYWRlcik7Ci0JCXJldHVybiBuZXcgVGV4dEZpbHRlcihyZXN1bHQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMTlkZGRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmFuYWx5c2lzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlN0b3BBbmFseXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5TdG9wRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuU3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLQotLyoqCi0gKiBBIHRleHQgZmlsdGVyIHRoYXQgaGFuZGxlcyBVbmljb2RlIDQuMSBjaGFyYWN0ZXJzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRleHRGaWx0ZXIgZXh0ZW5kcyBUb2tlbkZpbHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTZXQgc3RvcFdvcmRzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRleHRGaWx0ZXIoVG9rZW5TdHJlYW0gaW4pIHsKLQkJc3VwZXIoaW4pOwotCQlpZiAoc3RvcFdvcmRzID09IG51bGwpIHsKLQkJCWxvYWRTdG9wV29yZHMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW5TdHJlYW0jbmV4dCgpCi0JICovCi0JcHVibGljIGZpbmFsIFRva2VuIG5leHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKFRva2VuIHRva2VuID0gaW5wdXQubmV4dCgpOyB0b2tlbiAhPSBudWxsOyB0b2tlbiA9IGlucHV0Lm5leHQoKSkgewotCQkJU3RyaW5nIHRva2VuVGV4dCA9IHRva2VuLnRlcm1UZXh0KCk7Ci0JCQlpZiAoIXN0b3BXb3Jkcy5jb250YWlucyh0b2tlblRleHQpKSB7Ci0JCQkJcmV0dXJuIHRva2VuOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSBzdG9wIHdvcmRzIGRlZmluZWQgaW4gdGhlIFN0b3BXb3Jkcy5wcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRTdG9wV29yZHMoKSB7Ci0JCVN0cmluZ1tdIHdvcmRzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShUZXh0RmlsdGVyLmNsYXNzCi0JCQkJCS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIi5TdG9wV29yZHMiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCVN0cmluZyBwcm9wZXJ0eSA9IGJ1bmRsZS5nZXRTdHJpbmcoIlNlYXJjaC5zdG9wV29yZHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJd29yZHMgPSBTdHJVdGlsLnNwbGl0KHByb3BlcnR5LCAiICwiKTsgLy8kTk9OLU5MUy0xJAkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl3b3JkcyA9IFN0b3BBbmFseXplci5FTkdMSVNIX1NUT1BfV09SRFM7Ci0JCX0KLQkJc3RvcFdvcmRzID0gU3RvcEZpbHRlci5tYWtlU3RvcFNldCh3b3Jkcyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1RleHRUb2tlbml6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0VG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1ZjMzNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1RleHRUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guYW5hbHlzaXM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW5pemVyOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5CcmVha0l0ZXJhdG9yOwotCi0vKioKLSAqIEEgdGV4dCB0b2tlbml6ZXIgdGhhdCB1c2VzIElDVTRKIHRvIHNlZ21lbnQgdGV4dCBpbnRvIHdvcmRzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRleHRUb2tlbml6ZXIgZXh0ZW5kcyBUb2tlbml6ZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFID0gNDA5NjsKLQotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0KLQlwcml2YXRlIEJyZWFrSXRlcmF0b3IgaXRlcmF0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSByZWFkZXIKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHNvdXJjZQotCSAqLwotCXB1YmxpYyBUZXh0VG9rZW5pemVyKFJlYWRlciByZWFkZXIpIHsKLQkJc3VwZXIocmVhZGVyKTsKLQkJU3RyaW5nQnVmZmVyIHRleHRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKEJVRkZFUl9TSVpFKTsKLQkJY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyW0JVRkZFUl9TSVpFXTsKLQkJaW50IGNoYXJzUmVhZDsKLQkJdHJ5IHsKLQkJCXdoaWxlICgoY2hhcnNSZWFkID0gcmVhZGVyLnJlYWQoYnVmZmVyLCAwLCBCVUZGRVJfU0laRSkpID4gMCkgewotCQkJCXRleHRCdWZmZXIuYXBwZW5kKGJ1ZmZlciwgMCwgY2hhcnNSZWFkKTsKLQkJCX0KLQkJCXRleHQgPSB0ZXh0QnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQlpdGVyYXRvciA9IEJyZWFrSXRlcmF0b3IuZ2V0V29yZEluc3RhbmNlKCk7Ci0JCQlpdGVyYXRvci5zZXRUZXh0KHRleHQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpdGVyYXRvciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuU3RyZWFtI25leHQoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBUb2tlbiBuZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGl0ZXJhdG9yICE9IG51bGwpIHsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJaW50IHN0YXJ0ID0gaXRlcmF0b3IuY3VycmVudCgpOwotCQkJCWludCBlbmQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGVuZCAhPSBCcmVha0l0ZXJhdG9yLkRPTkUpIHsKLQkJCQkJU3RyaW5nIHRva2VuVGV4dCA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCWlmICghdG9rZW5UZXh0LmVxdWFscygiICIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICh0b2tlblRleHQuZW5kc1dpdGgoIidzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXRva2VuVGV4dCA9IHRva2VuVGV4dC5zdWJzdHJpbmcoMCwgdG9rZW5UZXh0Ci0JCQkJCQkJCQkubGVuZ3RoKCkgLSAyKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBuZXcgVG9rZW4odG9rZW5UZXh0LCAwLCB0b2tlblRleHQubGVuZ3RoKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNGY0MmY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgdGV4dCBhbmFseXNlciwgdG9rZW5pemVyIGFuZCBmaWx0ZXIgZm9yIGluZGV4aW5nIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkhpdEVudHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uSGl0RW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTc0ODE1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uSGl0RW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogQSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBzZWFyY2ggaGl0IGVudHJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25IaXRFbnRyeSB7Ci0KLQlwcml2YXRlIFN0cmluZyBpZDsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCi0JcHJpdmF0ZSBTdHJpbmcgYnJpZWZEZXNjOwotCi0JcHJpdmF0ZSBTdHJpbmcgdXJsOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUQuCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgSUQuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICB0aGUgaWQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHR5cGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnJlaWYgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgYnJpZWYgZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJyaWVmRGVzYygpIHsKLQkJcmV0dXJuIGJyaWVmRGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYnJpZWZEZXNjCi0JICogICAgICAgICAgICB0aGUgYnJpZWYgZGVzY3JpcHRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QnJpZWZEZXNjKFN0cmluZyBicmllZkRlc2MpIHsKLQkJdGhpcy5icmllZkRlc2MgPSBicmllZkRlc2M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFVSTAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIFVSTC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICB0aGUgVVJMIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmZmY0ZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotLyoqCi0gKiBUaGUgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gc2VhcmNoIHF1ZXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeSB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX0JSSUVGX0RFU0MgPSAiYnJpZWZEZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDQVRFR09SWV9GVUxMX0RFU0MgPSAiZnVsbERlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX1RZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSGFzaHRhYmxlIHF1ZXJ5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5KCkgewotCQlxdWVyeSA9IG5ldyBIYXNodGFibGUoKTsKLQkJcXVlcnkuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWFyY2ggcXVlcnkgc3RyaW5nLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlYXJjaCBxdWVyeSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUVudW1lcmF0aW9uIGtleXMgPSBxdWVyeS5rZXlzKCk7Ci0KLQkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQlzYi5hcHBlbmQoa2V5ICsgIjooIiArIHF1ZXJ5LmdldChrZXkpICsgIikgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlzYi5hcHBlbmQoIkFORCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRlcm0oU3RyaW5nIHRlcm0sIFN0cmluZyBjcml0KSB7Ci0JCXF1ZXJ5LnB1dChjcml0LCB0ZXJtKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXNldFRlcm0odHlwZSwgQ0FURUdPUllfVFlQRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRUZXJtKG5hbWUsIENBVEVHT1JZX05BTUUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJyaWVmRGVzYyhTdHJpbmcgZGVzYykgewotCQlzZXRUZXJtKGRlc2MsIENBVEVHT1JZX0JSSUVGX0RFU0MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZ1bGxEZXNjKFN0cmluZyBkZXNjKSB7Ci0JCXNldFRlcm0oZGVzYywgQ0FURUdPUllfRlVMTF9ERVNDKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uU2VhcmNoU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vaW50ZXJuYWwvQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGRiMWZkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uU2VhcmNoU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRhdGVGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyeVBhcnNlci5RdWVyeVBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guSGl0czsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guSW5kZXhTZWFyY2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guUXVlcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlNlYXJjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbC5IVE1MUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLlNlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5TZWFyY2hSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5TZWFyY2hTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guYW5hbHlzaXMuVGV4dEFuYWx5emVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGl0RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3Igc2VhcmNoaW5nIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UgewotCi0JLyoqCi0JICogRG9jdW1lbnQgZmllbGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSSUVGX0RFU0NSSVBUSU9OX0ZJRUxEID0gImJyaWVmRGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0ZJRUxEID0gImNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9GSUVMRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGSUVEX0ZJRUxEID0gIm1vZGlmaWVkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9GSUVMRCA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9GSUVMRCA9ICJyb2xlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VNTUFSWV9GSUVMRCA9ICJzdW1tYXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9GSUVMRCA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0ZJRUxEID0gInVybCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBIVE1MIHBhcnNlci4KLQlwcml2YXRlIEhUTUxQYXJzZXIgcGFyc2VyOwotCi0JLy8gVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBkb2N1bWVudHMgdG8gYmUgaW5kZXhlZC4KLQlwcml2YXRlIFN0cmluZyBkb2NEaXIgPSBudWxsOwotCi0JLy8gVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgaW5kZXggZmlsZXMgd2lsbCBiZSBnZW5lcmF0ZWQuCi0JcHJpdmF0ZSBTdHJpbmcgaW5kZXhEaXIgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jRGlyCi0JICogICAgICAgICAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlKFN0cmluZyBkb2NEaXIpIHsKLQkJU3RyaW5nIHVzZXJIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaGFzaENvZGUgPSBNYXRoLmFicyhkb2NEaXIuaGFzaENvZGUoKSk7Ci0JCVN0cmluZyBpbmRleFBhdGggPSB1c2VySG9tZSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJKyAicnVwIiArIEZpbGUuc2VwYXJhdG9yICsgaGFzaENvZGUgKyBGaWxlLnNlcGFyYXRvciArICJpbmRleCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZXREaXJzKGRvY0RpciwgaW5kZXhQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkb2NEaXIKLQkgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gaW5kZXhEaXIKLQkgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBpbmRleGVzCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlKFN0cmluZyBkb2NEaXIsIFN0cmluZyBpbmRleERpcikgewotCQlzZXREaXJzKGRvY0RpciwgaW5kZXhEaXIpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdXAgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIGluZGV4IGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jRGlyCi0JICogICAgICAgICAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGluZGV4RGlyCi0JICogICAgICAgICAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgaW5kZXhlcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpcnMoU3RyaW5nIGRvY0RpciwgU3RyaW5nIGluZGV4RGlyKSB7Ci0JCXRoaXMuZG9jRGlyID0gZG9jRGlyOwotCQl0aGlzLmluZGV4RGlyID0gaW5kZXhEaXI7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgYSBzZWFyY2ggYmFzZWQgb24gdGhlIGdpdmVuIHNlYXJjaCBxdWVyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcXVlcnkKLQkgKiAgICAgICAgICAgIHRoZSBzZWFyY2ggcXVlcnkgc3RyaW5nCi0JICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5Db25maWd1cmF0aW9uSGl0RW50cnk8L2NvZGU+IG9iamVjdHMKLQkgKiBAdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkhpdEVudHJ5W10gc2VhcmNoKENvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeSBxdWVyeSkKLQkJCXRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHNlYXJjaChxdWVyeS5nZXRRdWVyeVN0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBhIHNlYXJjaCBvbiB0aGUgZ2l2ZW4gcXVlcnkgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBxc3RyCi0JICogICAgICAgICAgICBhIEx1Y2VuZSBjb21wYXRpYmxlIHF1ZXJ5IHN0cmluZwotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgPGNvZGU+Q29uZmlndXJhdGlvbkhpdEVudHJ5PC9jb2RlPiBvYmplY3RzCi0JICogQHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25IaXRFbnRyeVtdIHNlYXJjaChTdHJpbmcgcXN0cikKLQkJCXRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJU2VhcmNoZXIgc2VhcmNoZXIgPSBudWxsOwotCQl0cnkgewotCQkJc2VhcmNoZXIgPSBuZXcgSW5kZXhTZWFyY2hlcihpbmRleERpcik7Ci0JCQlRdWVyeSBxdWVyeSA9IFF1ZXJ5UGFyc2VyLnBhcnNlKHFzdHIsIENPTlRFTlRfRklFTEQsCi0JCQkJCW5ldyBUZXh0QW5hbHl6ZXIoKSk7Ci0KLQkJCUhpdHMgbGhpdHMgPSBzZWFyY2hlci5zZWFyY2gocXVlcnkpOwotCQkJQ29uZmlndXJhdGlvbkhpdEVudHJ5W10gaGl0cyA9IG5ldyBDb25maWd1cmF0aW9uSGl0RW50cnlbbGhpdHMKLQkJCQkJLmxlbmd0aCgpXTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBoaXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRG9jdW1lbnQgZG9jID0gbGhpdHMuZG9jKGkpOwotCQkJCWhpdHNbaV0gPSBuZXcgQ29uZmlndXJhdGlvbkhpdEVudHJ5KCk7Ci0JCQkJaGl0c1tpXS5zZXROYW1lKGRvYy5nZXQoTkFNRV9GSUVMRCkpOwotCQkJCWhpdHNbaV0uc2V0VXJsKGRvYy5nZXQoVVJMX0ZJRUxEKSk7Ci0JCQkJaGl0c1tpXS5zZXRCcmllZkRlc2MoZG9jLmdldChCUklFRl9ERVNDUklQVElPTl9GSUVMRCkpOwotCQkJCWhpdHNbaV0uc2V0SWQoZG9jLmdldChJRF9GSUVMRCkpOwotCQkJCWhpdHNbaV0uc2V0VHlwZShkb2MuZ2V0KFRZUEVfRklFTEQpKTsKLQkJCX0KLQkJCXJldHVybiBoaXRzOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFNlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc2VhcmNoZXIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXNlYXJjaGVyLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBvZiB0aGUgaW5kZXggZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaW5kZXggZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbmRleEV4aXN0cygpIHsKLQkJRmlsZVtdIGZpbGVzID0gbmV3IEZpbGUoaW5kZXhEaXIpLmxpc3RGaWxlcygpOwotCQlyZXR1cm4gKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoICE9IDApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHNlYXJjaCBpbmRleC4KLQkgKiAKLQkgKiBAdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmRleCgpIHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaW5kZXgobnVsbCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHNlYXJjaCBpbmRleC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVpbmRleAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHBlcmZvcm1zIGEgcmVpbmRleAotCSAqIEB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGluZGV4KGJvb2xlYW4gcmVpbmRleCkgdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlpbmRleChudWxsLCByZWluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBpbmRleCBkYXRhYmFzZS4KLQkgKiAKLQkgKiBAcGFyYW0gcG0KLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEBwYXJhbSByZWluZGV4Ci0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcGVyZm9ybXMgYSByZWluZGV4Ci0JICogQHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgaW5kZXgoSVByb2dyZXNzTW9uaXRvciBwbSwgYm9vbGVhbiByZWluZGV4KQotCQkJdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKENvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlLmNsYXNzKSB7Ci0JCQlpZiAoaW5kZXhEaXIgPT0gbnVsbCB8fCBkb2NEaXIgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgaW5kZXhEaXIgb3IgZG9jRGlyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKCFyZWluZGV4ICYmIGluZGV4RXhpc3RzKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChwbSAhPSBudWxsKSB7Ci0JCQkJcG0uYmVnaW5UYXNrKFNlYXJjaFJlc291cmNlcy5pbmRleENvbmZpZ0ZpbGVzVGFza19uYW1lLAotCQkJCQkJZ2V0VG90YWxEb2NzVG9JbmRleChkb2NEaXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQl0cnkgewotCQkJCWRlbGV0ZUFsbEluZGV4RGlycygpOwotCQkJCW5ldyBGaWxlKGluZGV4RGlyKS5ta2RpcnMoKTsKLQkJCQlJbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoaW5kZXhEaXIsCi0JCQkJCQluZXcgVGV4dEFuYWx5emVyKCksIHRydWUpOwotCQkJCXdyaXRlci5tYXhGaWVsZExlbmd0aCA9IDEwMDAwMDA7Ci0JCQkJcGFyc2VyID0gbmV3IEhUTUxQYXJzZXIoKTsKLQkJCQlpbmRleERvY3MobmV3IEZpbGUoZG9jRGlyKSwgd3JpdGVyLCBwbSk7Ci0JCQkJd3JpdGVyLm9wdGltaXplKCk7Ci0JCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBHZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAocG0gIT0gbnVsbCkgewotCQkJCQlwbS5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyBhbGwgZXhpc3RpbmcgaW5kZXggZGF0YWJhc2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUFsbEluZGV4RGlycygpIHsKLQkJRmlsZSBwYXJlbnQgPSBuZXcgRmlsZShpbmRleERpcikuZ2V0UGFyZW50RmlsZSgpOwotCQlGaWxlW10gZmlsZXMgPSBwYXJlbnQubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKCJpbmRleCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJRmlsZVtdIGZpbGUgPSBmaWxlc1tpXS5saXN0RmlsZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmaWxlLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlmaWxlW2pdLmRlbGV0ZSgpOwotCQkJCQl9Ci0JCQkJCWZpbGVzW2ldLmRlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBmaWxlcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNlYXJjaCBpbmRleC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzZWFyY2ggaW5kZXgsCi0JICogICAgICAgICBpbmNsdWRpbmcgYWxsIHN1Yi1kaXJlY3RvcmllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFRvdGFsRG9jc1RvSW5kZXgoU3RyaW5nIGRpcikgewotCQlpbnQgdG90YWwgPSAwOwotCQlGaWxlIGRpckZpbGUgPSBuZXcgRmlsZShkaXIpOwotCQlGaWxlIGZpbGVzW10gPSBkaXJGaWxlLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRvdGFsOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpc1hNSURvYyhmaWxlc1tpXSkpIHsKLQkJCQl0b3RhbCsrOwotCQkJfSBlbHNlIGlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJdG90YWwgKz0gZ2V0VG90YWxEb2NzVG9JbmRleChmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRvdGFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBuZWVkcyB0byBiZSBpbmRleGVkLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICB0aGUgZmlsZSB0byBiZSB2ZXJpZmllZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUgbmVlZHMgdG8gYmUgaW5kZXhlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYTUlEb2MoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBmaWxlLmdldFBhdGgoKS5lbmRzV2l0aCgiLnhtaSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIG5lZWRzIHRvIGJlIGluZGV4ZWQuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGJlIHZlcmlmaWVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlsZSBuZWVkcyB0byBiZSBpbmRleGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0h0bWxPclRleHREb2MoRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBwYXRoID0gZmlsZS5nZXRQYXRoKCk7Ci0JCXJldHVybiBwYXRoLmVuZHNXaXRoKCIuaHRtbCIpIHx8IHBhdGguZW5kc1dpdGgoIi5odG0iKSB8fCBwYXRoLmVuZHNXaXRoKCIudHh0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JLyoqCi0JICogQSByZWN1cnNpdmUgZnVuY3Rpb24gdG8gaW5kZXggZmlsZXMuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGEgZGlyZWN0b3J5IG9yIGZpbGUgdG8gYmUgaW5kZXhlZAotCSAqIEBwYXJhbSB3cml0ZXIKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCB3cml0ZXIKLQkgKiBAcGFyYW0gcG0KLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluZGV4RG9jcyhGaWxlIGZpbGUsIEluZGV4V3JpdGVyIHdyaXRlciwgSVByb2dyZXNzTW9uaXRvciBwbSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiYXBwbGV0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZ1tdIGZpbGVzID0gZmlsZS5saXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW5kZXhEb2NzKG5ldyBGaWxlKGZpbGUsIGZpbGVzW2ldKSwgd3JpdGVyLCBwbSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaXNIdG1sT3JUZXh0RG9jKGZpbGUpKSB7Ci0JCQlpZiAocG0gIT0gbnVsbCkgewotCQkJCXBtLnN1YlRhc2soZmlsZS5nZXROYW1lKCkpOwotCQkJCXBtLndvcmtlZCgxKTsKLQkJCX0KLQkJCWlmIChzaG91bGRCZUV4Y2x1ZGVkKGZpbGUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJRG9jdW1lbnQgZG9jID0gZ2V0SFRNTERvY3VtZW50KGZpbGUpOwotCQkJd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxvY2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWxlIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIGluZGV4aW5nLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIGZpbGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWxlIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIGluZGV4aW5nCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQmVFeGNsdWRlZChGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIHAgPSBmaWxlLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJcmV0dXJuIGRvY0Rpci5zdGFydHNXaXRoKHApOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRvY3VtZW50IG9iamVjdCBvZiBhIEhUTUwgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIEhUTUwgZmlsZSB0byBiZSBpbmRleGVkCi0JICogQHJldHVybiBhIGRvY3VtZW50IG9iamVjdAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHBhcnNpbmcgdGhlIEhUTUwgZmlsZQotCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgb3BlcmF0aW9uIGlzIGludGVycnVwdGVkIGJ5IGEgdXNlcgotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRIVE1MRG9jdW1lbnQoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwotCQlkb2MuYWRkKEZpZWxkLlVuSW5kZXhlZChVUkxfRklFTEQsIGZpbGUuZ2V0UGF0aCgpLnJlcGxhY2UoCi0JCQkJRmlsZS5wYXRoU2VwYXJhdG9yQ2hhciwgJy8nKSkpOwotCQlkb2MuYWRkKEZpZWxkLktleXdvcmQoTU9ESUZJRURfRklFTEQsIERhdGVGaWVsZC50aW1lVG9TdHJpbmcoZmlsZQotCQkJCS5sYXN0TW9kaWZpZWQoKSkpKTsKLQotCQl0cnkgewotCQkJcGFyc2VyLnBhcnNlKGZpbGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJZG9jLmFkZChGaWVsZC5UZXh0KENPTlRFTlRfRklFTEQsIHBhcnNlci5nZXRUZXh0KCkpKTsKLQkJZG9jLmFkZChGaWVsZC5VbkluZGV4ZWQoU1VNTUFSWV9GSUVMRCwgcGFyc2VyLmdldFN1bW1hcnkoKSkpOwotCi0JCVByb3BlcnRpZXMgbWV0YVRhZ3MgPSBwYXJzZXIuZ2V0TWV0YVRhZ3MoKTsKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gbWV0YVRhZ3MucHJvcGVydHlOYW1lcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIHRhZ05hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlkb2MuYWRkKEZpZWxkLlRleHQodGFnTmFtZSwgbWV0YVRhZ3MuZ2V0UHJvcGVydHkodGFnTmFtZSkpKTsKLQkJfQotCi0JCWlmIChkb2MuZ2V0RmllbGQoUk9MRV9GSUVMRCkgPT0gbnVsbCkgewotCQkJZG9jLmFkZChGaWVsZC5UZXh0KFJPTEVfRklFTEQsICJOT1JVUFJPTEUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBkb2M7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTA3YWM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3Igc2VhcmNoaW5nIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDdjNGIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHNlYXJjaGluZyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMGZjYTk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdGhlIHNlYXJjaCBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9KYXJDcmVhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvSmFyQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYjE1N2Q5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9KYXJDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEphckNyZWF0b3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfSkFSID0gImluZGV4LmphciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJamFyRm9sZGVyKGFyZ3NbMF0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBqYXJGb2xkZXIoU3RyaW5nIGZvbGRlcm5hbWUpIHsKLQkJdHJ5IHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYXR0ZW1wdGluZyB0byBqYXIgc3R1ZmYiKTsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBqYXJEaXIgPSBuZXcgRmlsZShmb2xkZXJuYW1lKTsKLQkJCUZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKGZvbGRlcm5hbWUgKyBGaWxlLnNlcGFyYXRvciArIElOREVYX0pBUik7Ci0KLQkJCWphckZpbGVzKGphckRpciwgamFyRmlsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gaW4gdGhlIGphciB0aGluZ3kiKTsgLy8kTk9OLU5MUy0xJAotCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBtZXRob2QgdG8gamFyIHRoZSBzcGVjaWZpZWQgZGlyIGludG8gYSBqYXIgZmlsZS4gbm9uLXN1Yi1mb2xkZXJzIHdpbGwgYmUKLQkgKiBqYXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gamFyRGlyCi0JICogQHBhcmFtIGphckZpbGUKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGphckZpbGVzKEZpbGUgamFyRGlyLCBGaWxlIGphckZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVbXSBmaWxlcyA9IGphckRpci5saXN0RmlsZXMoKTsKLQkJaWYgKGphckZpbGUuZXhpc3RzKCkpIHsKLQkJCWphckZpbGUuZGVsZXRlKCk7Ci0JCX0KLQkJQnVmZmVyZWRPdXRwdXRTdHJlYW0gYlN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgKLQkJCQlqYXJGaWxlKSk7Ci0JCVppcE91dHB1dFN0cmVhbSB6aXBwZXJTdHJlYW0gPSBuZXcgWmlwT3V0cHV0U3RyZWFtKGJTdHJlYW0pOwotCi0JCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzQwOTZdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGN1cnJlbnRGaWxlID0gZmlsZXNbaV07Ci0JCQlpZiAoY3VycmVudEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJWmlwRW50cnkgY3VyckVudHJ5ID0gbmV3IFppcEVudHJ5KGN1cnJlbnRGaWxlLmdldE5hbWUoKSk7Ci0JCQl6aXBwZXJTdHJlYW0ucHV0TmV4dEVudHJ5KGN1cnJFbnRyeSk7Ci0JCQlCdWZmZXJlZElucHV0U3RyZWFtIGJpU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbSgKLQkJCQkJY3VycmVudEZpbGUpKTsKLQkJCXdoaWxlIChiaVN0cmVhbS5hdmFpbGFibGUoKSA+IDApIHsKLQkJCQlpbnQgbnVtID0gYmlTdHJlYW0ucmVhZChieXRlcyk7Ci0JCQkJemlwcGVyU3RyZWFtLndyaXRlKGJ5dGVzLCAwLCBudW0pOwotCQkJfQotCQkJYmlTdHJlYW0uY2xvc2UoKTsKLQkJCXppcHBlclN0cmVhbS5jbG9zZUVudHJ5KCk7Ci0JCX0KLQkJemlwcGVyU3RyZWFtLmNsb3NlKCk7Ci0JCWJTdHJlYW0uY2xvc2UoKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3V0aWxzL0xIVE1MUGFyc2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvTEhUTUxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzY2OWIxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvTEhUTUxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLS8qKgotICogQSBIVE1MIHBhcnNlciB1c2VkIGZvciBleHRyYWN0aW5nIHRoZSBtZXRhIHRhZ3MgYW5kIHRleHQgZnJvbSBhIEhUTUwKLSAqIGRvY3VtZW50LgotICogCi0gKiBUT0RPOiBJbXBsZW1lbnQgb3VyIG93biBIVE1MIHBhcnNlci4KLSAqLwotcHVibGljIGNsYXNzIExIVE1MUGFyc2VyIGV4dGVuZHMgb3JnLmFwYWNoZS5sdWNlbmUuZGVtby5odG1sLkhUTUxQYXJzZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTEhUTUxQYXJzZXIoRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJc3VwZXIoZmlsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTEhUTUxQYXJzZXIoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJc3VwZXIoc3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMSFRNTFBhcnNlcihSZWFkZXIgc3RyZWFtKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJc3VwZXIoc3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBIVE1MIG1ldGEgdGFncy4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRNZXRhVGFncygpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0TWV0YVRhZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWFkZXIgZm9yIHRoZSBIVE1MIGNvbnRlbnQuCi0JICovCi0JcHVibGljIFJlYWRlciBnZXRSZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVhZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgSFRNTCB0aXRsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRUaXRsZSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGEgc3VtbWFyeSBvZiB0aGUgSFRMIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0U3VtbWFyeSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvVU5DVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3V0aWxzL1VOQ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmE5NDllYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvVU5DVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLQotcHVibGljIGNsYXNzIFVOQ1V0aWwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQ19GSUxFX1BSRUZJWCA9ICJmaWxlOi8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMVEVSTkFURV9VTkNfRklMRV9QUkVGSVggPSAiZmlsZTovLyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUU0NBUEVfVU5DX0ZJTEVfUFJFRklYID0gImZpbGU6Ly8vIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkNfRklMRV9PTkxZID0gImZpbGU6IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkNfU0VQQVJBVE9SID0gIi8iOwotCi0KLQkvKioKLQkgKiBBY2NvdW50cyBmb3IgbmV0c2NhcGUgdW5jIGZpbGUgcHJlZml4LiBDb252ZXJ0cyB0byBzdGFuZGFyZCBvbmUuCi0JICogSWYgbm90IE5ldHNjYXBlLCBub3RoaW5nIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaGFuZGxlTmV0c2NhcGVGaWxlUHJlZml4KFN0cmluZyBmaWxlbmFtZSkKLQl7Ci0JCVN0cmluZyBjb252ZXJ0ZWROYW1lID0gbnVsbDsKLQotCQlpZiAoZmlsZW5hbWUuc3RhcnRzV2l0aChORVRTQ0FQRV9VTkNfRklMRV9QUkVGSVgpKQotCQl7Ci0JCQljb252ZXJ0ZWROYW1lID0KLQkJCQlBTFRFUk5BVEVfVU5DX0ZJTEVfUFJFRklYCi0JCQkJCSsgZmlsZW5hbWUuc3Vic3RyaW5nKAotCQkJCQkJTkVUU0NBUEVfVU5DX0ZJTEVfUFJFRklYLmxlbmd0aCgpLAotCQkJCQkJZmlsZW5hbWUubGVuZ3RoKCkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJY29udmVydGVkTmFtZSA9IGZpbGVuYW1lOwotCQl9Ci0KLQkJcmV0dXJuIChjb252ZXJ0ZWROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIFVSTCBwYXRocyBmb3IgTW96aWxsYSAoYW5kIG90aGVyIGJyb3dzZXJzKSBvdmVyIFVOQy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBoYW5kbGVVUkxGb3JVTkMoVVJMIG9yaWdpbmFsVXJsKQotCXsKLQkJLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3IgTW96aWxsYSBvdmVyIFVOQwotCQlVUkwgbmV3VXJsID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCWlmIChvcmlnaW5hbFVybC50b1N0cmluZygpLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSkKLQkJCXsKLQkJCQkvLyBjaGFuZ2UgImZpbGU6Ly8iIHRvICJmaWxlOi8vLy8vIgotCQkJCVN0cmluZyBleHRyYWN0ZWRTdHJpbmcgPSBvcmlnaW5hbFVybC50b1N0cmluZygpLnN1YnN0cmluZyg1KTsKLQkJCQluZXdVcmwgPSBuZXcgVVJMKCJmaWxlIiwgIiIsICIvLy8iICsgZXh0cmFjdGVkU3RyaW5nKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQluZXdVcmwgPSBvcmlnaW5hbFVybDsKLQkJCX0KLQkJfQotCQljYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkKLQkJewotCQkJbmV3VXJsID0gb3JpZ2luYWxVcmw7Ci0JCX0KLQotCQlyZXR1cm4gKG5ld1VybCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgdGhlIFVOQyBmaWxlIHRvIGEgcmVndWxhciwgcGxhdGZvcm0tZGVwZW5kZW50IG9uZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0RmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKQotCXsKLQkJU3RyaW5nIGNvbnZlcnRlZE5hbWUgPSBudWxsOwotCi0JCS8vIHJlbW92ZSBhbnkgVVJMIHByZWZpeGVzCi0JCVN0cmluZyB0ZW1wTmFtZSA9IG51bGw7Ci0JCWlmIChmaWxlbmFtZS5zdGFydHNXaXRoKFVOQ19GSUxFX1BSRUZJWCkpCi0JCXsKLQkJCXRlbXBOYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKFVOQ19GSUxFX1BSRUZJWC5sZW5ndGgoKSwgZmlsZW5hbWUubGVuZ3RoKCkpOwotCQkJaW50IGluZGV4ID0gdGVtcE5hbWUuaW5kZXhPZigiOiIpOwotCQkJaWYgKGluZGV4ID09IC0xKQotCQkJewotCQkJCS8vIG9uIFVuaXgsIGFkZCBzZXBhcmF0b3IgYmFjayB0byBmaXJzdCBjaGFyYWN0ZXIKLQkJCQl0ZW1wTmFtZSA9IFVOQ19TRVBBUkFUT1IgKyB0ZW1wTmFtZTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXRlbXBOYW1lID0gZmlsZW5hbWU7Ci0JCX0KLQotCQkvLyBjb252ZXJ0IGFueSBVTkMgc2VwYXJhdG9ycyB0byB0aGUgc3lzdGVtIGRlZmF1bHQgb25lCi0JCWNvbnZlcnRlZE5hbWUgPQotCQkJdGVtcE5hbWUucmVwbGFjZShVTkNfU0VQQVJBVE9SLmNoYXJBdCgwKSwgRmlsZS5zZXBhcmF0b3IuY2hhckF0KDApKTsKLQotCQlyZXR1cm4gKGNvbnZlcnRlZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIHRoZSBmaWxlbmFtZSB0byBhIFVOQyBmaWxlbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0RmlsZW5hbWVUb1VOQyhTdHJpbmcgZmlsZW5hbWUpCi0JewotCQkvLyBjb252ZXJ0IGFueSBVTkMgc2VwYXJhdG9ycyB0byB0aGUgc3lzdGVtIGRlZmF1bHQgb25lCi0JCVN0cmluZyBjb252ZXJ0ZWROYW1lID0KLQkJCWZpbGVuYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3IuY2hhckF0KDApLCBVTkNfU0VQQVJBVE9SLmNoYXJBdCgwKSk7Ci0JCVN0cmluZyBmaW5hbE5hbWUgPSBjb252ZXJ0RmlsZVNlcGFyYXRvcihjb252ZXJ0ZWROYW1lKTsKLQkJcmV0dXJuIChmaW5hbE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIHRoZSBVUkwgdG8gb25lIHdoaWNoIGNhbiB0aGF0IG1hdGNoZXMgYSBVTkMgY29udmVudGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9VTkMoU3RyaW5nIHVybCkKLQl7Ci0JCVN0cmluZyBjb252ZXJ0ZWRVcmwgPSBudWxsOwotCQlpZiAodXJsLnN0YXJ0c1dpdGgoQUxURVJOQVRFX1VOQ19GSUxFX1BSRUZJWCkpCi0JCXsKLQkJCWNvbnZlcnRlZFVybCA9Ci0JCQkJVU5DX0ZJTEVfUFJFRklYCi0JCQkJCSsgdXJsLnN1YnN0cmluZyhBTFRFUk5BVEVfVU5DX0ZJTEVfUFJFRklYLmxlbmd0aCgpLCB1cmwubGVuZ3RoKCkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJY29udmVydGVkVXJsID0gdXJsOwotCQl9Ci0JCXJldHVybiAoY29udmVydGVkVXJsKTsKLQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlICIlMjAiIHRoYXQgaXMgdXNlZCBieSBzb21lIGJyb3dzZXJzIGZvciBzcGFjZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0RmlsZVNwYWNpbmcoU3RyaW5nIGZpbGVuYW1lKQotCXsKLQkJLy8gbm93IHJlbW92ZSBhbnkgIiUyMCIKLQkJaW50IHN0YXJ0ID0gMDsKLQkJU3RyaW5nIG5ld0ZpbGVuYW1lID0gIiI7Ci0JCXdoaWxlIChzdGFydCA8IGZpbGVuYW1lLmxlbmd0aCgpKQotCQl7Ci0JCQlpbnQgaW5kZXggPSBmaWxlbmFtZS5pbmRleE9mKCIlMjAiLCBzdGFydCk7Ci0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQl7Ci0JCQkJaW5kZXggPSBmaWxlbmFtZS5sZW5ndGgoKTsKLQkJCX0KLQkJCW5ld0ZpbGVuYW1lICs9IGZpbGVuYW1lLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwotCQkJbmV3RmlsZW5hbWUgKz0gIiAiOwotCQkJc3RhcnQgPSBpbmRleCArIDM7Ci0JCX0KLQotCQluZXdGaWxlbmFtZSA9IG5ld0ZpbGVuYW1lLnRyaW0oKTsKLQotCQlyZXR1cm4gKG5ld0ZpbGVuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSAiJTVDIiB0aGF0IGlzIHVzZWQgYnkgc29tZSBicm93c2VycyBmb3IgZmlsZSBzZXBhcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEZpbGVTZXBhcmF0b3IoU3RyaW5nIGZpbGVuYW1lKQotCXsKLQkJLy8gcmVtb3ZlIGFueSAiJTVDIgotCQlpbnQgc3RhcnQgPSAwOwotCQlTdHJpbmcgbmV3RmlsZW5hbWUgPSAiIjsKLQkJd2hpbGUgKHN0YXJ0IDwgZmlsZW5hbWUubGVuZ3RoKCkpCi0JCXsKLQkJCWludCBpbmRleCA9IGZpbGVuYW1lLmluZGV4T2YoIiU1QyIsIHN0YXJ0KTsKLQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCXsKLQkJCQkvL2luZGV4ID0gZmlsZW5hbWUubGVuZ3RoKCk7Ci0JCQkJbmV3RmlsZW5hbWUgPSBmaWxlbmFtZS50cmltKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQluZXdGaWxlbmFtZSArPSBmaWxlbmFtZS5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KTsKLQkJCW5ld0ZpbGVuYW1lICs9IFVOQ19TRVBBUkFUT1I7Ci0JCQlzdGFydCA9IGluZGV4ICsgMzsKLQkJfQotCi0JCW5ld0ZpbGVuYW1lID0gbmV3RmlsZW5hbWUudHJpbSgpOwotCi0JCS8vIGFsc28gaWYgZmlsZSBzZXBhcmF0b3IgZXF1YWxzIHVuYyBzZXBhcmF0b3IsIHJlbW92ZSBhbnkgV2luZG93cwotCQkvLyBzcGVjaWZpYyAiXCIKLQkJU3RyaW5nIHdpbmRvd3NGaWxlU2VwYXJhdG9yID0gIlxcIjsKLQkJaWYgKCFGaWxlLnNlcGFyYXRvci5lcXVhbHMod2luZG93c0ZpbGVTZXBhcmF0b3IpCi0JCQkmJiBGaWxlLnNlcGFyYXRvci5lcXVhbHMoVU5DX1NFUEFSQVRPUikpCi0JCXsKLQkJCS8vIG9uIFVuaXgKLQkJCW5ld0ZpbGVuYW1lID0KLQkJCQluZXdGaWxlbmFtZS5yZXBsYWNlKAotCQkJCQl3aW5kb3dzRmlsZVNlcGFyYXRvci5jaGFyQXQoMCksCi0JCQkJCVVOQ19TRVBBUkFUT1IuY2hhckF0KDApKTsKLQkJfQotCQlyZXR1cm4gKG5ld0ZpbGVuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGZpbGUgbmFtZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQotCSAqIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc3VmZml4LiAgQW4gZXhhbXBsZSBvZiBhIAotCSAqIHN1ZmZpeCBpcyAiLmRhdCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgZ2V0RmlsZUxpc3QoU3RyaW5nIGRpcmVjdG9yeSwgU3RyaW5nIHN1ZmZpeCkKLQl7Ci0JCWlmIChkaXJlY3Rvcnkuc3RhcnRzV2l0aCgiaHR0cCIpKQotCQl7Ci0JCQkvLyByZW1vdGUgZGlyZWN0b3J5LCB1c2UgdGhpcyBpbnN0ZWFkCi0JCQlyZXR1cm4gKGdldEZpbGVMaXN0RnJvbVJlbW90ZShkaXJlY3RvcnksIHN1ZmZpeCkpOwotCQl9Ci0KLQkJU3RyaW5nIHRlbXBEaXIgPSBVTkNVdGlsLmNvbnZlcnRGaWxlbmFtZShkaXJlY3RvcnkpOwotCQlGaWxlIGRvY3VtZW50RGlyZWN0b3J5ID0gbmV3IEZpbGUoVU5DVXRpbC5jb252ZXJ0RmlsZVNwYWNpbmcodGVtcERpcikpOwotCQlTdHJpbmdbXSBmaWxlTmFtZUxpc3QgPSBkb2N1bWVudERpcmVjdG9yeS5saXN0KCk7Ci0KLQkJLy8gbm93IHBhcnNlIGFuZCBvbmx5IHRha2UgdGhvc2UgdGhhdCBlbmQgd2l0aCB0aGUgcHJvcGVyIHN1ZmZpeAotCQlWZWN0b3IgZmluYWxMaXN0ID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVOYW1lTGlzdC5sZW5ndGg7IGkrKykKLQkJewotCQkJaWYgKGZpbGVOYW1lTGlzdFtpXS5lbmRzV2l0aChzdWZmaXgpKQotCQkJewotCQkJCWZpbmFsTGlzdC5hZGRFbGVtZW50KGZpbGVOYW1lTGlzdFtpXSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKGZpbmFsTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBhcHBsaWNhYmxlIGRlZmF1bHQgcnVwIGZpbGVzIGZyb20gcmVtb3RlIGRpcmVjdG9yeS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBWZWN0b3IgZ2V0RmlsZUxpc3RGcm9tUmVtb3RlKFN0cmluZyBkaXJlY3RvcnksIFN0cmluZyBzdWZmaXgpCi0JewotCQlWZWN0b3IgZmlsZW5hbWVzID0gbmV3IFZlY3RvcigpOwotCQl0cnkKLQkJewotCQkJLy8gZ2V0IHRoZSBsaXN0aW5nIHVzaW5nIGEgVVJMCi0JCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChkaXJlY3RvcnkpOwotCQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSByZW1vdGVVcmwub3BlblN0cmVhbSgpOwotCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWludCBjOwotCQkJd2hpbGUgKChjID0gaW5TdHJlYW0ucmVhZCgpKSAhPSAtMSkKLQkJCXsKLQkJCQlyZXN1bHQuYXBwZW5kKChjaGFyKSBjKTsKLQkJCX0KLQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0KLQkJCS8vIGNvbnZlcnQgc3RyaW5nIHRvIHVwcGVyIGNhc2UgdG8gaGFuZGxlIG11bHRpcGxlIHNlcnZlciB0eXBlcyBzdWNoIGFzIEFwYWNoZQotCQkJU3RyaW5nIGRpcmVjdG9yeVJlc3VsdCA9IHJlc3VsdC50b1N0cmluZygpOwotCQkJZGlyZWN0b3J5UmVzdWx0ID0gZGlyZWN0b3J5UmVzdWx0LnJlcGxhY2VBbGwoImhyZWYiLCAiSFJFRiIpOwotCQkJZGlyZWN0b3J5UmVzdWx0ID0gZGlyZWN0b3J5UmVzdWx0LnJlcGxhY2VBbGwoIjwvYSIsICI8L0EiKTsKLQkJCWRpcmVjdG9yeVJlc3VsdCA9IGRpcmVjdG9yeVJlc3VsdC5yZXBsYWNlQWxsKCI8dHQ+IiwgIiIpOwotCQkJZGlyZWN0b3J5UmVzdWx0ID0gZGlyZWN0b3J5UmVzdWx0LnJlcGxhY2VBbGwoIjwvdHQ+IiwgIiIpOwotCQkJZGlyZWN0b3J5UmVzdWx0ID0gZGlyZWN0b3J5UmVzdWx0LnJlcGxhY2VBbGwoIjxUVD4iLCAiIik7Ci0JCQlkaXJlY3RvcnlSZXN1bHQgPSBkaXJlY3RvcnlSZXN1bHQucmVwbGFjZUFsbCgiPC9UVD4iLCAiIik7Ci0KLQkJCS8vIHBhcnNlIHRoZSBjb250ZW50Ci0JCQkvL1N0cmluZ1Rva2VuaXplciBsaW5lVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplciggcmVzdWx0LnRvU3RyaW5nKCkgKTsKLQkJCVN0cmluZ1Rva2VuaXplciBsaW5lVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihkaXJlY3RvcnlSZXN1bHQpOwotCQkJVmVjdG9yIGxpbmVzID0gbmV3IFZlY3RvcigpOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJd2hpbGUgKHRydWUpCi0JCQkJewotCQkJCQlsaW5lVG9rZW5pemVyLm5leHRUb2tlbigiUkVGIik7Ci0JCQkJCWxpbmVUb2tlbml6ZXIubmV4dFRva2VuKCJcIiIpOwotCQkJCQlTdHJpbmcgbGluZSA9IGxpbmVUb2tlbml6ZXIubmV4dFRva2VuKCJcIiIpOwotCi0JCQkJCS8vIHN0cmlwIG91dCAiPC9BIjsgbmVlZGVkIHRoaXMgYmVjYXVzZSBTdHJpbmdUb2tlbml6ZXIKLQkJCQkJLy8gaGFzIHByb2JsZW1zIHBhcnNpbmcgZmlsZW5hbWVzIHRoYXQgYmVpbmcgd2l0aCAiQSIKLQkJCQkJaW50IGluZGV4ID0gbGluZS5pbmRleE9mKCI8L0EiKTsKLQkJCQkJaWYgKGluZGV4ICE9IC0xICYmIGluZGV4ICE9IDApCi0JCQkJCXsKLQkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCWxpbmVzLmFkZEVsZW1lbnQoZmlsZW5hbWUpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJbGluZXMuYWRkRWxlbWVudChsaW5lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5lKQotCQkJewotCQkJCS8vIGRvIG5vdGhpbmcsIGVuZCBvZiBjb250ZW50Ci0JCQl9Ci0KLQkJCS8vIHBhcnNlIGVhY2ggbGluZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5zaXplKCk7IGkrKykKLQkJCXsKLQkJCQlTdHJpbmcgbGluZSA9IChTdHJpbmcpIGxpbmVzLmVsZW1lbnRBdChpKTsKLQotCQkJCWlmIChsaW5lLmVuZHNXaXRoKHN1ZmZpeCkpCi0JCQkJewotCQkJCQkvLyB3ZSB3YW50IHRoaXMKLQkJCQkJZmlsZW5hbWVzLmFkZEVsZW1lbnQobGluZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gKGZpbGVuYW1lcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4NTlhN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlNDdkYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbzt2aXNpYmlsaXR5Oj1yZWV4cG9ydAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLAotIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3ZDk4NDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDRmNGMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgVU1BIEVjb3JlIEV4dGVuc2lvbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JTW9kZWxPYmplY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JTW9kZWxPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDUwOGRkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSU1vZGVsT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IGFsbCBVTUEgbW9kZWwgb2JqZWN0cy4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgZHluYW1pYyBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgc3VwcG9ydCBiZXR3ZWVuCi0gKiBtb2RlbCBvYmplY3RzIHRocm91Z2ggdGhlIHVzZSBvZiBvcHBvc2l0ZSBmZWF0dXJlcy4gSXQgYWxzbyBhbGxvd3MgdGhlCi0gKiBkZWZhdWx0IHZhbHVlIG9mIGEgZmVhdHVyZSwgYXMgZGVmaW5lZCBpbiBhIG1ldGFsIG1vZGVsLCB0byBiZSBvdmVyd3JpdHRlbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxPYmplY3QgZXh0ZW5kcyBFRGF0YU9iamVjdCB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgZmVhdHVyZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhIHdheSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZSBkZWZpbmVkIGluIHRoZQotCSAqIG1ldGEtbW9kZWwgZm9yIGEgVU1BIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhIGZlYXR1cmUKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBvcHBvc2l0ZSBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhbiBvcHBvc2l0ZSBmZWF0dXJlCi0JICogQHJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgb3Bwb3NpdGUgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUpOwotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIG9wcG9zaXRlIGZlYXR1cmVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1vZGVsIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBvcHBvc2l0ZSBmZWF0dXJlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE9wcG9zaXRlRmVhdHVyZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lQcm94eVJlc29sdXRpb25MaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lQcm94eVJlc29sdXRpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMGIwN2Y4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmU7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBwcm94eSByZXNvbHV0aW9uIGxpc3RlbmVyIGF0dGFjaGVkIHRvIGEgVU1BIHJlc291cmNlIHNldC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIgewotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIG9mIGFuIGV4Y2VwdGlvbiB0aGF0IGhhcyBvY2N1cnJlZCB3aGlsZSByZXNvbHZpbmcgYQotCSAqIHByb3h5IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiB0aGF0IGhhcyBvY2N1cnJlZAotCSAqLwotCXZvaWQgbm90aWZ5RXhjZXB0aW9uKEV4Y2VwdGlvbiBlKTsKLQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiB0aGF0IGEgcHJveHkgaGFzIGJlZW4gcmVzb2x2ZWQgc3VjY2Vzc2Z1bGx5LgotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqICAgICAgICAgICAgYSBwcm94eSBvYmplY3QKLQkgKiBAcGFyYW0gcmVzb2x2ZWQKLQkgKiAgICAgICAgICAgIHRoZSByZXNvbHZlZCBvYmplY3QKLQkgKi8KLQl2b2lkIHByb3h5UmVzb2x2ZWQoT2JqZWN0IHByb3h5LCBPYmplY3QgcmVzb2x2ZWQpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSVVtYVJlc291cmNlU2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSVVtYVJlc291cmNlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3MDc1YTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lVbWFSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgVU1BIHJlc291cmNlIHNldC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVW1hUmVzb3VyY2VTZXQgZXh0ZW5kcyBSZXNvdXJjZVNldCB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtb2RlbCBvYmplY3QgcmVzb2x2ZWQgYnkgYSBVUkkuCi0JICogCi0JICogQHBhcmFtIHJlc29sdmVyCi0JICogICAgICAgICAgICB0aGUgcHJveHkgcmVzb2x2ZXIKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICB0aGUgVVJJIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJveHkKLQkgKiBAcGFyYW0gbG9hZE9uRGVtYW5kCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgY3JlYXRlIGFuZCBsb2FkIHRoZSByZXNvdXJjZSBpZiBpdAotCSAqICAgICAgICAgICAgZG9lcyBub3QgZXhpc3RzCi0JICogQHJldHVybiB0aGUgbW9kZWwgb2JqZWN0IHJlc29sdmVkIGJ5IHRoZSBVUkkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCNnZXRFT2JqZWN0KEVPYmplY3QsIFVSSSwgYm9vbGVhbikKLQkgKi8KLQlFT2JqZWN0IGdldEVPYmplY3QoRU9iamVjdCByZXNvbHZlciwgVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvUmVzb2x2ZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL1Jlc29sdmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzFhYzcyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvUmVzb2x2ZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSByZXNvbHZpbmcgYSBwcm94eSBvYmplY3QuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvbHZlRXhjZXB0aW9uIGV4dGVuZHMgV3JhcHBlZEV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU4NDEyODE1ODE0NjM2MDgxTDsKLQotCXByaXZhdGUgRU9iamVjdCBwcm94eTsKLQotCXByaXZhdGUgRU9iamVjdCByZXNvbHZlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHByb3h5Ci0JICogICAgICAgICAgICBhIHByb3h5IG9iamVjdAotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIGFuIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gcmVzb2x2ZXIKLQkgKiAgICAgICAgICAgIHRoZSBwcm94eSByZXNvbHZlcgotCSAqLwotCXB1YmxpYyBSZXNvbHZlRXhjZXB0aW9uKEVPYmplY3QgcHJveHksIFN0cmluZyBtc2csIEVPYmplY3QgcmVzb2x2ZXIpIHsKLQkJc3VwZXIobXNnLCBudWxsKTsKLQkJdGhpcy5wcm94eSA9IHByb3h5OwotCQl0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJveHkKLQkgKiAgICAgICAgICAgIGEgcHJveHkgb2JqZWN0Ci0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyB0aHJvd24KLQkgKi8KLQlwdWJsaWMgUmVzb2x2ZUV4Y2VwdGlvbihFT2JqZWN0IHByb3h5LCBFeGNlcHRpb24gZXhjZXB0aW9uLCBFT2JqZWN0IHJlc29sdmVyKSB7Ci0JCXN1cGVyKGV4Y2VwdGlvbik7Ci0JCXRoaXMucHJveHkgPSBwcm94eTsKLQkJdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3h5IG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm94eSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRQcm94eSgpIHsKLQkJcmV0dXJuIHByb3h5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3h5IHJlc29sdmVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb3h5IHJlc29sdmVyCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0UmVzb2x2ZXIoKSB7Ci0JCXJldHVybiByZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlc29sdmVFeGNlcHRpb24pIHsKLQkJCVJlc29sdmVFeGNlcHRpb24gcmUgPSAoUmVzb2x2ZUV4Y2VwdGlvbikgb2JqOwotCQkJaWYgKHJlc29sdmVyID09IHJlLnJlc29sdmVyKSB7Ci0JCQkJaWYgKHByb3h5ID09IHJlLnByb3h5KSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlpZiAocHJveHkgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCQkJVVJJIHVyaSA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcm94eSkuZVByb3h5VVJJKCk7Ci0JCQkJCWlmICh1cmkgIT0gbnVsbCAmJiByZS5wcm94eSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJCQkJcmV0dXJuIHVyaS5lcXVhbHMoKChJbnRlcm5hbEVPYmplY3QpIHJlLnByb3h5KQotCQkJCQkJCQkuZVByb3h5VVJJKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9pbXBsL011bHRpUmVzb3VyY2VFT2JqZWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvaW1wbC9NdWx0aVJlc291cmNlRU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjAzNzlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9pbXBsL011bHRpUmVzb3VyY2VFT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5JbnRlcm5hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmltcGwuRURhdGFPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSVVtYVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuUmVzb2x2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdDsKLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIFVNQSBtb2RlbCBvYmplY3RzLgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCBFTUYgc3RvcmVzIG1vZGVsIG9iamVjdHMgcmVsYXRlZCB2aWEgYSBjb250YWlubWVudCByZWxhdGlvbnNoaXAKLSAqIGluIGEgc2luZ2xlIFhNSSBmaWxlLiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIGRlZmF1bHQgRU1GIHBlcnNpc3RlbmNlIGJlaGF2aW9yCi0gKiBieSBwcm92aWRpbmcgYSBtZWNoYW5pc20gZm9yIHRoZSBjb250YWluaW5nIGFuZCBjb250YWluZWQgb2JqZWN0cyB0byBiZQotICogc3RvcmVkIGluIHNlcGFyYXRlIFhNSSBmaWxlcy4gQ29udGFpbmVkIG9iamVjdHMgYXJlIGxhenkgbG9hZGVkLCB3aGVuCi0gKiByZXF1aXJlZCwgc2ltaWxhciB0byB0aGUgcHJveHkgb2JqZWN0IGJlaGF2aW9yIG9mIEVNRidzIHN0YW5kYXJkIHJlc291cmNlCi0gKiBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGV4dGVuZHMgRURhdGFPYmplY3RJbXBsIGltcGxlbWVudHMKLQkJSU1vZGVsT2JqZWN0IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTgxMjY5NDcxNTMwOTcyNzNMOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBmZWF0dXJlLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIGZvciBtaWdyYXRpb24gdXNlIG9ubHkuIERvIG5vdCBjYWxsIHRoaXMKLQkgKiBtZXRob2QgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYSBmZWF0dXJlIHNpbmNlIGl0IHdpbGwgc2xvdyBkb3duCi0JICogdGhlIGxvYWRpbmcgb2YgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgYSBmZWF0dXJlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBmZWF0dXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNldERlZmF1bHRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCBkZWZhdWx0VmFsdWUpIHsKLQkJZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwLnB1dChmZWF0dXJlLCBkZWZhdWx0VmFsdWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIGZlYXR1cmUuCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgZm9yIG1pZ3JhdGlvbiB1c2Ugb25seS4gRG8gbm90IGNhbGwgdGhpcwotCSAqIG1ldGhvZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIGZlYXR1cmUgc2luY2UgaXQgd2lsbCBzbG93IGRvd24KLQkgKiB0aGUgbG9hZGluZyBvZiBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVtb3ZlRGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcC5yZW1vdmUoZmVhdHVyZSk7Ci0JfQotCQotCS8qKgotCSAqIEEgbWFwIG9mIGVudHJpZXMgb2YgT3Bwb3NpdGVGZWF0dXJlIC8gT3Bwb3NpdGVGZWF0dXJlJ3MgdmFsdWUKLQkgKi8KLQlwcml2YXRlIE1hcCBvcHBvc2l0ZUZlYXR1cmVNYXA7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzT3Bwb3NpdGVGZWF0dXJlID0gdHJ1ZTsKLQotCXByaXZhdGUgQm9vbGVhbiBub3RpZnlPcHBvc2l0ZSA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWQgPSB0cnVlOwotCi0JcHJpdmF0ZSBMaXN0IGZlYXR1cmVzV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZTsKLQotCS8qKgotCSAqIENoZWNrcyB0aGUgdmFsaWRpdHkgb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBpcyB2YWxpZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiB2YWxpZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3Bwb3NpdGVBZGQoT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSwgT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGxpc3QgPSAoTGlzdCkgZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KG9wcG9zaXRlRmVhdHVyZSk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QodGhpcywgb3Bwb3NpdGVGZWF0dXJlKTsKLQkJCWdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChvcHBvc2l0ZUZlYXR1cmUsIGxpc3QpOwotCQl9Ci0JCWlmICghbGlzdC5jb250YWlucyhvYmplY3QpKSB7Ci0JCQlsaXN0LmFkZChvYmplY3QpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wcG9zaXRlUmVtb3ZlKE9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUsIE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBsaXN0ID0gKExpc3QpIGdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmdldChvcHBvc2l0ZUZlYXR1cmUpOwotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IE9wcG9zaXRlRmVhdHVyZVJlc29sdmluZ0VMaXN0KHRoaXMsIG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQlnZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQob3Bwb3NpdGVGZWF0dXJlLCBsaXN0KTsKLQkJfQotCQlsaXN0LnJlbW92ZShvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmVzIHRoZSBnaXZlbiBwcm94eSBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgYSBwcm94eSBvYmplY3QgdG8gcmVzb2x2ZQotCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIG9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgcmVzb2x2ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QKLQkJCQkmJiAoKEludGVybmFsRU9iamVjdCkgb2JqZWN0KS5lSXNQcm94eSgpKSB7Ci0JCQlyZXR1cm4gZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBvYmplY3QpOwotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcGxhY2UoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwKLQkJCUludGVybmFsRU9iamVjdCBuZXdWYWx1ZSkgewotCQlpZiAobmV3VmFsdWUgIT0gbnVsbCAmJiAhbmV3VmFsdWUuZUlzUHJveHkoKSAmJiBuZXdWYWx1ZSAhPSBvbGRWYWx1ZSkgewotCQkJYm9vbGVhbiBub3RpZnkgPSBlRGVsaXZlcigpOwotCQkJdHJ5IHsKLQkJCQllU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJRWNvcmVVdGlsLnJlcGxhY2UodGhpcywgZmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlSZXNvdXJjZUVPYmplY3QucmVwbGFjZSgpOiIpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBvYmplY3Q6ICIgKyB0aGlzKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgZmVhdHVyZTogIiArIGZlYXR1cmUpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBwcm94eTogIiArIG9sZFZhbHVlKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgcmVzb2x2ZWQ6ICIgKyBuZXdWYWx1ZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWVTZXREZWxpdmVyKG5vdGlmeSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5CYXNpY05vdGlmaWVySW1wbCNlTm90aWZ5KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlTm90aWZ5KE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJLyoKLQkJICogaWYoIU9wcG9zaXRlRmVhdHVyZS5pc0RlbGl2ZXJPblJlc29sdmUoKSAmJiBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0KLQkJICogTm90aWZpY2F0aW9uLlJFU09MVkUpIHsgcmV0dXJuOyB9Ci0JCSAqLwotCi0JCWlmIChtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFU09MVkUpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJT2JqZWN0IGYgPSBtc2cuZ2V0RmVhdHVyZSgpOwotCQlpZiAoZiBpbnN0YW5jZW9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmOwotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9IE9wcG9zaXRlRmVhdHVyZQotCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlKGZlYXR1cmUpOwotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJTXVsdGlSZXNvdXJjZUVPYmplY3Qgb2xkT3RoZXJFbmQ7Ci0JCQkJTXVsdGlSZXNvdXJjZUVPYmplY3Qgb3RoZXJFbmQ7Ci0JCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCQkJCQlvbGRPdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJb2xkT3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUob2xkT3RoZXJFbmQpOwotCQkJCQkJfQotCQkJCQkJaWYgKG9sZE90aGVyRW5kICE9IG51bGwpIHsKLQkJCQkJCQlvbGRPdGhlckVuZC5vcHBvc2l0ZVJlbW92ZShvcHBvc2l0ZUZlYXR1cmUsIG1zZwotCQkJCQkJCQkJLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJfQotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUob3RoZXJFbmQpOwotCQkJCQkJCXJlcGxhY2UoZmVhdHVyZSwgbXNnLmdldE5ld1ZhbHVlKCksIG90aGVyRW5kKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChvdGhlckVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJb3RoZXJFbmQub3Bwb3NpdGVBZGQob3Bwb3NpdGVGZWF0dXJlLCBtc2cKLQkJCQkJCQkJCS5nZXROb3RpZmllcigpKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG9iajsKLQkJCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCQkJcmVwbGFjZShmZWF0dXJlLCBvYmosIG90aGVyRW5kKTsKLQkJCQkJCQl9Ci0JCQkJCQkJb3RoZXJFbmQub3Bwb3NpdGVBZGQob3Bwb3NpdGVGZWF0dXJlLCBtc2cKLQkJCQkJCQkJCS5nZXROb3RpZmllcigpKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUob3RoZXJFbmQpOwotCQkJCQkJfQotCQkJCQkJaWYgKG90aGVyRW5kICE9IG51bGwpCi0JCQkJCQkJb3RoZXJFbmQub3Bwb3NpdGVSZW1vdmUob3Bwb3NpdGVGZWF0dXJlLCBtc2cKLQkJCQkJCQkJCS5nZXROb3RpZmllcigpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCkpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQkJfQotCQkJCQkJCW90aGVyRW5kLm9wcG9zaXRlUmVtb3ZlKG9wcG9zaXRlRmVhdHVyZSwgbXNnCi0JCQkJCQkJCQkuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgb2JqOwotCQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUob3RoZXJFbmQpOwotCQkJCQkJCQlyZXBsYWNlKGZlYXR1cmUsIG9iaiwgb3RoZXJFbmQpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAob3RoZXJFbmQgIT0gbnVsbCkgewotCQkJCQkJCQlFT2JqZWN0IG9sZFZhbHVlID0gKEVPYmplY3QpIG90aGVyRW5kCi0JCQkJCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmdldCgKLQkJCQkJCQkJCQkJCW9wcG9zaXRlRmVhdHVyZSk7Ci0JCQkJCQkJCWlmIChvbGRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkvLyByZW1vdmUgb3RoZXJFbmQgZnJvbSB0YXJnZXQgZmVhdHVyZSBvZgotCQkJCQkJCQkJLy8gb2xkVmFsdWUKLQkJCQkJCQkJCSgoQ29sbGVjdGlvbikgb2xkVmFsdWUKLQkJCQkJCQkJCQkJLmVHZXQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZikpCi0JCQkJCQkJCQkJCS5yZW1vdmUob3RoZXJFbmQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCW90aGVyRW5kLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dCgKLQkJCQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmUsIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUob3RoZXJFbmQpOwotCQkJCQkJCX0KLQkJCQkJCQlvdGhlckVuZC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQoCi0JCQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmUsIG51bGwpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQkJcmVwbGFjZShmZWF0dXJlLCBtc2cuZ2V0TmV3VmFsdWUoKSwgb3RoZXJFbmQpOwotCQkJCQkJfQotCQkJCQkJaWYgKG90aGVyRW5kICE9IG51bGwpIHsKLQkJCQkJCQlFT2JqZWN0IG9sZFZhbHVlID0gKEVPYmplY3QpIG90aGVyRW5kCi0JCQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KAotCQkJCQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCQkJCWlmIChvbGRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIHJlbW92ZSBvdGhlckVuZCBmcm9tIHRhcmdldCBmZWF0dXJlIG9mCi0JCQkJCQkJCS8vIG9sZFZhbHVlCi0JCQkJCQkJCSgoQ29sbGVjdGlvbikgb2xkVmFsdWUKLQkJCQkJCQkJCQkuZUdldCgoRVN0cnVjdHVyYWxGZWF0dXJlKSBmKSkKLQkJCQkJCQkJCQkucmVtb3ZlKG90aGVyRW5kKTsKLQkJCQkJCQl9Ci0JCQkJCQkJb3RoZXJFbmQuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KAotCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCQlyZXBsYWNlKGZlYXR1cmUsIG1zZy5nZXROZXdWYWx1ZSgpLCBvdGhlckVuZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAob3RoZXJFbmQgIT0gbnVsbCkgewotCQkJCQkJCUVPYmplY3Qgb2xkVmFsdWUgPSAoRU9iamVjdCkgb3RoZXJFbmQKLQkJCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5nZXQoCi0JCQkJCQkJCQkJCW9wcG9zaXRlRmVhdHVyZSk7Ci0JCQkJCQkJaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gc2V0IHRoZSB0YXJnZXQgZmVhdHVyZSBvZiBvbGRWYWx1ZSB0byBudWxsCi0JCQkJCQkJCW9sZFZhbHVlLmVTZXQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZiwgbnVsbCk7Ci0JCQkJCQkJfQotCQkJCQkJCW90aGVyRW5kLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dCgKLQkJCQkJCQkJCW9wcG9zaXRlRmVhdHVyZSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHRhcmdldEZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmOwotCQkJCQkJCWlmKCF0YXJnZXRGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCW9sZE90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCQkJaWYob2xkT3RoZXJFbmQgIT0gbnVsbCkgewotCQkJCQkJCQkJb2xkT3RoZXJFbmQuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KG9wcG9zaXRlRmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJLy8gY2FzZSBOb3RpZmljYXRpb24uVU5TRVQ6Ci0JCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUob3RoZXJFbmQpOwotCQkJCQkJfQotCQkJCQkJaWYgKG90aGVyRW5kICE9IG51bGwpCi0JCQkJCQkJb3RoZXJFbmQuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KAotCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlLCBudWxsKTsKLQkJCQkJCWJyZWFrOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5lTm90aWZ5KG1zZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkJhc2ljTm90aWZpZXJJbXBsI2VOb3RpZmljYXRpb25SZXF1aXJlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkgewotCQlpZiAoIWVEZWxpdmVyKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgIXJlc291cmNlLmVEZWxpdmVyKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKG5vdGlmeU9wcG9zaXRlID09IG51bGwpIHsKLQkJCWlmIChPcHBvc2l0ZUZlYXR1cmUuZmVhdHVyZU9wcG9zaXRlRmVhdHVyZU1hcC5pc0VtcHR5KCkpIHsKLQkJCQlub3RpZnlPcHBvc2l0ZSA9IEJvb2xlYW4uRkFMU0U7Ci0JCQl9IGVsc2UgewotCQkJCUNvbGxlY3Rpb24gZmVhdHVyZXMgPSBPcHBvc2l0ZUZlYXR1cmUuZmVhdHVyZU9wcG9zaXRlRmVhdHVyZU1hcAotCQkJCQkJLmtleVNldCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJaWYgKGZlYXR1cmVzLmNvbnRhaW5zKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJbm90aWZ5T3Bwb3NpdGUgPSBCb29sZWFuLlRSVUU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobm90aWZ5T3Bwb3NpdGUgPT0gbnVsbCkgewotCQkJCQlub3RpZnlPcHBvc2l0ZSA9IEJvb2xlYW4uRkFMU0U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChub3RpZnlPcHBvc2l0ZS5ib29sZWFuVmFsdWUoKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gc3VwZXIuZU5vdGlmaWNhdGlvblJlcXVpcmVkKCk7Ci0JfQotCi0JLyoKLQkgKiBwcml2YXRlIHZvaWQgcmVtb3ZlQ2hpbGRSZXNvdXJjZXMoKSB7IExpc3QgY2hpbGRyZW4gPSBlQ29udGVudHMoKTsgaW50Ci0JICogc2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkgKiBNdWx0aVJlc291cmNlRU9iamVjdCBjaGlsZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgY2hpbGRyZW4uZ2V0KGkpOwotCSAqIFJlc291cmNlIHJlc291cmNlID0gY2hpbGQuZVJlc291cmNlKCk7IGlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlICE9Ci0JICogZVJlc291cmNlKCkpIHsgY2hpbGQucmVtb3ZlQ2hpbGRSZXNvdXJjZXMoKTsgfSAoKEludGVybmFsRUxpc3QpCi0JICogcmVzb3VyY2UuZ2V0Q29udGVudHMoKSkuYmFzaWNSZW1vdmUodGhpcywgbnVsbCk7Ci0JICogY2hpbGQuZVByb3BlcnRpZXMoKS5zZXRFUmVzb3VyY2UobnVsbCk7IH0gfQotCSovCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QjZUJhc2ljU2V0Q29udGFpbmVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QsCi0JICogICAgICBpbnQsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluKQotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNTZXRDb250YWluZXIoSW50ZXJuYWxFT2JqZWN0IG5ld0NvbnRhaW5lciwKLQkJCWludCBuZXdDb250YWluZXJGZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUmVzb3VyY2UuSW50ZXJuYWwgb2xkUmVzb3VyY2UgPSB0aGlzLmVEaXJlY3RSZXNvdXJjZSgpOwotCQlSZXNvdXJjZS5JbnRlcm5hbCBuZXdSZXNvdXJjZSA9IG5ld0NvbnRhaW5lciA9PSBudWxsID8gbnVsbAotCQkJCTogbmV3Q29udGFpbmVyLmVJbnRlcm5hbFJlc291cmNlKCk7Ci0JCS8vIGlmIChvbGRSZXNvdXJjZSAhPSBuZXdSZXNvdXJjZSAmJiBvbGRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCS8vIHJlbW92ZUNoaWxkUmVzb3VyY2VzKCk7Ci0JCS8vIH0KLQotCQlpbnQgb2xkSW5kZXggPSAtMTsKLQkJaW50IG9sZFNpemUgPSAtMTsKLQkJaWYgKG9sZFJlc291cmNlICE9IG51bGwpIHsKLQkJCW9sZEluZGV4ID0gb2xkUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pbmRleE9mKHRoaXMpOwotCQkJb2xkU2l6ZSA9IG9sZFJlc291cmNlLmdldENvbnRlbnRzKCkuc2l6ZSgpOwotCQl9Ci0KLQkJTm90aWZpY2F0aW9uQ2hhaW4gbWVzc2FnZXMgPSBzdXBlci5lQmFzaWNTZXRDb250YWluZXIobmV3Q29udGFpbmVyLAotCQkJCW5ld0NvbnRhaW5lckZlYXR1cmVJRCwgbXNncyk7Ci0JCWlmIChvbGRSZXNvdXJjZSAhPSBuZXdSZXNvdXJjZSAmJiBvbGRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkvLyByZW1vdmUgYW55IG5ld2x5IGFkZGVkIE1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcnMgZnJvbSB0aGlzCi0JCQkvLyBvYmplY3QncyBhZGFwdGVyIGxpc3QKLQkJCS8vCi0JCQlpZiAobmV3UmVzb3VyY2UgIT0gbnVsbCkKLQkJCQluZXdSZXNvdXJjZS5kZXRhY2hlZCh0aGlzKTsKLQotCQkJLy8gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2VtYW50aWM6IE11bHRpUmVzb3VyY2VFT2JqZWN0IGlzIGFsbG93ZWQgdG8KLQkJCS8vIGJlIG93bmVkIGJ5IGJvdGggY29udGFpbmVyIGFuZCByZXNvdXJjZS4KLQkJCS8vIEFkZCB0aGlzIG9iamVjdCBiYWNrIHRvIHRoZSBvbGQgcmVzb3VyY2UuCi0JCQkvLwotCQkJQmFzaWNFTGlzdCBjb250ZW50cyA9ICgoQmFzaWNFTGlzdCkgb2xkUmVzb3VyY2UuZ2V0Q29udGVudHMoKSk7Ci0JCQlpZiAob2xkU2l6ZSAhPSBjb250ZW50cy5zaXplKCkpIHsKLQkJCQkvLyB0aGlzIG9iamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHJlc291cmNlJ3MgY29udGVudHMKLQkJCQkvLyBhZGQgaXQgYmFjawotCQkJCS8vCi0JCQkJaWYgKGNvbnRlbnRzLmlzRW1wdHkoKSkgewotCQkJCQkvLyB0aGlzIHdpbGwgZmxhZyByZXNvdXJjZSBhcyBsb2FkZWQKLQkJCQkJLy8KLQkJCQkJY29udGVudHMuY2xlYXIoKTsKLQkJCQkJY29udGVudHMuc2V0RGF0YSgxLCBuZXcgT2JqZWN0W10geyB0aGlzIH0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU9iamVjdFtdIGRhdGEgPSBjb250ZW50cy50b0FycmF5KCk7Ci0JCQkJCU9iamVjdFtdIG5ld0RhdGEgPSBuZXcgT2JqZWN0W2RhdGEubGVuZ3RoICsgMV07Ci0JCQkJCWlmIChvbGRJbmRleCA+IDApIHsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgbmV3RGF0YSwgMCwgb2xkSW5kZXgpOwotCQkJCQl9Ci0JCQkJCW5ld0RhdGFbb2xkSW5kZXhdID0gdGhpczsKLQkJCQkJaWYgKG9sZEluZGV4IDwgZGF0YS5sZW5ndGgpIHsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgb2xkSW5kZXgsIG5ld0RhdGEsIG9sZEluZGV4ICsgMSwKLQkJCQkJCQkJZGF0YS5sZW5ndGggLSBvbGRJbmRleCk7Ci0JCQkJCX0KLQkJCQkJY29udGVudHMuc2V0RGF0YShuZXdEYXRhLmxlbmd0aCwgbmV3RGF0YSk7Ci0JCQkJfQotCQkJfQotCQkJZVNldFJlc291cmNlKG9sZFJlc291cmNlKTsKLQkJCS8vIGRvbid0IGhhdmUgdG8gcmUtYXR0YWNoIHRoaXMgb2JqZWN0IHRvIG9sZFJlc291cmNlIHNpbmNlIGl0IHdhcwotCQkJLy8gbm90IGRldHRhY2hlZCBpbiBzdXBlciBtZXRob2QKLQkJCS8vCi0JCQkvLyBvbGRSZXNvdXJjZS5hdHRhY2hlZCh0aGlzKTsKLQotCQkJLy8gaWYobmV3UmVzb3VyY2UgIT0gbnVsbCkgbmV3UmVzb3VyY2UuYXR0YWNoZWQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnRhaW5lciBhbmQgY29udGFpbmVyIGZlYXR1cmUgSUQgZm9yIHRoaXMgb2JqZWN0IG9ubHkgaWYgaXQgaXMKLQkgKiBub3QgY29udGFpbmVkIGJ5IGFueSBjb250YWluZXIuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5CYXNpY0VPYmplY3RJbXBsI2VCYXNpY1NldENvbnRhaW5lcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXRDb250YWluZXIoSW50ZXJuYWxFT2JqZWN0IG5ld0NvbnRhaW5lciwKLQkJCWludCBuZXdDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJaWYgKGVDb250YWluZXIoKSAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlzdXBlci5lQmFzaWNTZXRDb250YWluZXIobmV3Q29udGFpbmVyLCBuZXdDb250YWluZXJGZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuQmFzaWNFT2JqZWN0SW1wbCNlQmFzaWNTZXRDb250YWluZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlQmFzaWNTZXRDb250YWluZXIoSW50ZXJuYWxFT2JqZWN0IG5ld0NvbnRhaW5lciwKLQkJCWludCBuZXdDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJc3VwZXIuZUJhc2ljU2V0Q29udGFpbmVyKG5ld0NvbnRhaW5lciwgbmV3Q29udGFpbmVyRmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb250YWluaW5nIHJlc291cmNlIGZvciB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzCi0JICogICAgICAgICAgICBhIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgZVNldFJlc291cmNlKFJlc291cmNlLkludGVybmFsIHJlcykgewotCQllUHJvcGVydGllcygpLnNldEVSZXNvdXJjZShyZXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuQmFzaWNFT2JqZWN0SW1wbCNlRGlyZWN0UmVzb3VyY2UoKQotCSAqLwotCXB1YmxpYyBJbnRlcm5hbCBlRGlyZWN0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiBzdXBlci5lRGlyZWN0UmVzb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBvYmplY3QgcmVwcmVzZW50ZWQgYnkgcHJveHkuIFByb3h5IGNoYWlucyBhcmUKLQkgKiBmb2xsb3dlZC4gSWYgcmVzb3VyY2VTZXQgaXMgbnVsbCwgdGhlIGdsb2JhbCBwYWNrYWdlIHJlZ2lzdHJ5IGlzCi0JICogY29uc3VsdGVkIHRvIG9idGFpbiBhIHBhY2thZ2UgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBwcm94eSBVUkksIGxlc3MgaXRzCi0JICogZnJhZ21lbnQsIGluIHRoZSBzYW1lIG1hbm5lciBhcyB0aGUgZGVmYXVsdCByZXNvdXJjZSBzZXQgaW1wbGVtZW50YXRpb24ncwotCSAqIGZhbGxiYWNrIGJlaGF2aW91ci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJveHkKLQkgKiAgICAgICAgICAgIHRoZSBwcm94eSB0byBiZSByZXNvbHZlZC4KLQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQKLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSBzZXQgaW4gd2hpY2ggdG8gcmVzb2x2ZS4KLQkgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBvYmplY3QsIG9yIHRoZSBwcm94eSBpZiB1bmFibGUgdG8gcmVzb2x2ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbCNyZXNvbHZlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqLwotCXByaXZhdGUgRU9iamVjdCByZXNvbHZlUHJveHkoRU9iamVjdCBwcm94eSkgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVSZXNvdXJjZSgpICE9IG51bGwgPyBlUmVzb3VyY2UoKQotCQkJCS5nZXRSZXNvdXJjZVNldCgpIDogbnVsbDsKLQotCQlVUkkgcHJveHlVUkkgPSAoKEludGVybmFsRU9iamVjdCkgcHJveHkpLmVQcm94eVVSSSgpOwotCQlpZiAocHJveHlVUkkgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlFT2JqZWN0IHJlc29sdmVkT2JqZWN0ID0gbnVsbDsKLQotCQkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElVbWFSZXNvdXJjZVNldCkgewotCQkJCQkJcmVzb2x2ZWRPYmplY3QgPSAoKElVbWFSZXNvdXJjZVNldCkgcmVzb3VyY2VTZXQpCi0JCQkJCQkJCS5nZXRFT2JqZWN0KHRoaXMsIHByb3h5VVJJLCB0cnVlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc29sdmVkT2JqZWN0ID0gcmVzb3VyY2VTZXQuZ2V0RU9iamVjdChwcm94eVVSSSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlFUGFja2FnZSBlUGFja2FnZSA9IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJCQkJLmdldEVQYWNrYWdlKHByb3h5VVJJLnRyaW1GcmFnbWVudCgpLnRvU3RyaW5nKCkpOwotCQkJCQlpZiAoZVBhY2thZ2UgIT0gbnVsbCkgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlUGFja2FnZS5lUmVzb3VyY2UoKTsKLQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJcmVzb2x2ZWRPYmplY3QgPSByZXNvdXJjZS5nZXRFT2JqZWN0KHByb3h5VVJJCi0JCQkJCQkJCQkuZnJhZ21lbnQoKS50b1N0cmluZygpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChyZXNvbHZlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCWlmKHJlc29sdmVkT2JqZWN0ICE9IHByb3h5KSB7Ci0vLwkJCQkJCXJldHVybiByZXNvbHZlUHJveHkocmVzb2x2ZWRPYmplY3QpOwotCQkJCQkJcmV0dXJuIHJlc29sdmVkT2JqZWN0OwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyKSB7Ci0JCQkJCQkoKElQcm94eVJlc29sdXRpb25MaXN0ZW5lcikgcmVzb3VyY2VTZXQpCi0JCQkJCQkJCS5ub3RpZnlFeGNlcHRpb24obmV3IFJlc29sdmVFeGNlcHRpb24ocHJveHksCi0JCQkJCQkJCQkJKFN0cmluZykgbnVsbCwgdGhpcykpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIpIHsKLQkJCQkJKChJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIpIHJlc291cmNlU2V0KQotCQkJCQkJCS5ub3RpZnlFeGNlcHRpb24obmV3IFJlc29sdmVFeGNlcHRpb24ocHJveHksCi0JCQkJCQkJCQlleGNlcHRpb24sIHRoaXMpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3h5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCNlUmVzb2x2ZVByb3h5KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QpCi0JICovCi0JcHVibGljIEVPYmplY3QgZVJlc29sdmVQcm94eShJbnRlcm5hbEVPYmplY3QgcHJveHkpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSBwcm94eS5lQ29udGFpbmVyKCk7Ci0JCWludCBmZWF0dXJlSUQgPSBwcm94eS5lQ29udGFpbmVyRmVhdHVyZUlEKCk7Ci0JCUVPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQotCQlyZXN1bHQgPSByZXNvbHZlUHJveHkocHJveHkpOwotCi0JCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQgaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdCkgewotCQkJaWYgKHByb3h5LmVJc1Byb3h5KCkgJiYgcmVzdWx0ID09IHByb3h5KSB7Ci0JCQkJLy8gcHJveHkgY291bGQgbm90IGJlIHJlc29sdmVkCi0JCQkJLy8KLQkJCQkoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXN1bHQpLnZhbGlkID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCSgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc3VsdCkudmFsaWQgPSB0cnVlOwotCi0JCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCSgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc3VsdCkuZVNldENvbnRhaW5lcigKLQkJCQkJCQkoSW50ZXJuYWxFT2JqZWN0KSBjb250YWluZXIsIGZlYXR1cmVJRCk7Ci0JCQkJfQotCi0JCQkJLy8gbWVyZ2UgdGhlIG9wcG9zaXRlIGZlYXR1cmUgbWFwCi0JCQkJLy8KLQkJCQlpZiAocmVzdWx0ICE9IHByb3h5KSB7Ci0JCQkJCWlmKHByb3h5IGluc3RhbmNlb2YgTXVsdGlSZXNvdXJjZUVPYmplY3QpIHsKLQkJCQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG15T2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBwcm94eTsKLQotCQkJCQkJaWYgKG15T2JqLm9wcG9zaXRlRmVhdHVyZU1hcCAhPSBudWxsCi0JCQkJCQkJCSYmICFteU9iai5vcHBvc2l0ZUZlYXR1cmVNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJTWFwIG5ld01hcCA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc3VsdCkKLQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbXlPYmouZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkKLQkJCQkJCQkJCS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkgIT0gbnVsbCkgewotCQkJCQkJCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9IChPcHBvc2l0ZUZlYXR1cmUpIGVudHJ5Ci0JCQkJCQkJCQkuZ2V0S2V5KCk7Ci0JCQkJCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCQkJTGlzdCB2YWx1ZXMgPSAoTGlzdCkgbmV3TWFwCi0JCQkJCQkJCQkJLmdldChvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCQkJCQkJCWlmICh2YWx1ZXMgPT0gbnVsbCkgewotCQkJCQkJCQkJCQluZXdNYXAucHV0KG9wcG9zaXRlRmVhdHVyZSwgZW50cnkKLQkJCQkJCQkJCQkJCQkuZ2V0VmFsdWUoKSk7Ci0JCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkJdmFsdWVzLmFkZEFsbCgoQ29sbGVjdGlvbikgZW50cnkKLQkJCQkJCQkJCQkJCQkuZ2V0VmFsdWUoKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQluZXdNYXAucHV0KG9wcG9zaXRlRmVhdHVyZSwgZW50cnkKLQkJCQkJCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlteU9iai5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5jbGVhcigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVSZXNvdXJjZSgpICE9IG51bGwgPyBlUmVzb3VyY2UoKQotCQkJCQkJCS5nZXRSZXNvdXJjZVNldCgpIDogbnVsbDsKLQkJCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyKSB7Ci0JCQkJCQkoKElQcm94eVJlc29sdXRpb25MaXN0ZW5lcikgcmVzb3VyY2VTZXQpLnByb3h5UmVzb2x2ZWQoCi0JCQkJCQkJCXByb3h5LCByZXN1bHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTWFwIGNyZWF0ZU9wcG9zaXRlRmVhdHVyZU1hcCgpIHsKLQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IE9wcG9zaXRlRmVhdHVyZS5jbGFzc09wcG9zaXRlRmVhdHVyZXNNYXAKLQkJCQkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJQ2xhc3MgY2xzID0gKENsYXNzKSBlbnRyeS5nZXRLZXkoKTsKLQkJCWlmIChjbHMuaXNJbnN0YW5jZSh0aGlzKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQltYXAucHV0KGl0ZXJhdG9yLm5leHQoKSwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChtYXAuaXNFbXB0eSgpKSB7Ci0JCQloYXNPcHBvc2l0ZUZlYXR1cmUgPSBmYWxzZTsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIG1hcC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIGNvbnRhaW5pbmcgdGhlIG9wcG9zaXRlIGZlYXR1cmVzIG1hcHBlZCB0byB0aGVpciB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgTWFwIGdldE9wcG9zaXRlRmVhdHVyZU1hcCgpIHsKLQkJaWYgKG9wcG9zaXRlRmVhdHVyZU1hcCA9PSBudWxsICYmIGhhc09wcG9zaXRlRmVhdHVyZSkgewotCQkJb3Bwb3NpdGVGZWF0dXJlTWFwID0gY3JlYXRlT3Bwb3NpdGVGZWF0dXJlTWFwKCk7Ci0JCX0KLQkJaWYob3Bwb3NpdGVGZWF0dXJlTWFwID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCX0KLQkJcmV0dXJuIG9wcG9zaXRlRmVhdHVyZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIG1hcC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIGNvbnRhaW5pbmcgdGhlIG9wcG9zaXRlIGZlYXR1cmVzIG1hcHBlZCB0byB0aGVpciB2YWx1ZXMgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IGRvZXMgbm90IGhhdmUgYW55IG9wcG9zaXRlCi0JICogICAgICAgICBmZWF0dXJlIG9yIHRoZSBtYXAgaGFzIG5vdCBiZWVuIGNyZWF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFwIGJhc2ljR2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkgewotCQlyZXR1cm4gb3Bwb3NpdGVGZWF0dXJlTWFwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHZhbHVlIG9mIGFuIG9wcG9zaXRlIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIGFuIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBmb3IgdGhlIG9wcG9zaXRlIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmdldChmZWF0dXJlKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpUmVzb3VyY2VFT2JqZWN0LmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKCk6Iik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGZlYXR1cmU6ICIgKyBmZWF0dXJlKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgdmFsdWU6ICIgKyB2YWx1ZSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIHRoaXM6ICIgKyB0aGlzKTsKLQotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCX0KLQotCQkJcmV0dXJuICgoT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QpIHZhbHVlKQotCQkJCQkuZ2V0VW5tb2RpZmlhYmxlTGlzdCgpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRU9iamVjdAotCQkJCSYmICgoRU9iamVjdCkgdmFsdWUpLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCWdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChmZWF0dXJlLCBudWxsKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0Ci0JCQkJJiYgKChJbnRlcm5hbEVPYmplY3QpIHZhbHVlKS5lSXNQcm94eSgpKSB7Ci0JCQlFT2JqZWN0IHJlc29sdmVkID0gZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSB2YWx1ZSk7Ci0JCQlpZiAocmVzb2x2ZWQgIT0gdmFsdWUpIHsKLQkJCQlnZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQoZmVhdHVyZSwgcmVzb2x2ZWQpOwotCQkJCXZhbHVlID0gcmVzb2x2ZWQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlc291cmNlIGF0IGEgZ2l2ZW4gbG9jYXRpb24uCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogICAgICAgICAgICB0aGUgcmVzb3VyY2UgbG9jYXRpb24KLQkgKiBAcmV0dXJuIGEgcmVzb3VyY2UgaW4gdGhlIHdvcmtzcGFjZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGdldFJlc291cmNlRm9yTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jYXRpb24pOwotCQlJUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCUZpbGUgZmlsZSA9ICBuZXcgRmlsZShsb2NhdGlvbik7Ci0JCWlmIChmaWxlLmlzRmlsZSgpKSB7Ci0JCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJaWYocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCUlSZXNvdXJjZSBwYXJlbnRSZXNvdXJjZSA9IGdldFJlc291cmNlRm9yTG9jYXRpb24oZmlsZQotCQkJCQkJLmdldFBhcmVudCgpKTsKLQkJCQlpZihwYXJlbnRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwYXJlbnRSZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJfQotCQkJCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRDb250YWluZXJGb3JMb2NhdGlvbihwYXRoKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0vLwkvKiAobm9uLUphdmFkb2MpCi0vLwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotLy8JICovCi0vLwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotLy8JCWlmKGFkYXB0ZXIgPT0gSVJlc291cmNlLmNsYXNzKSB7Ci0vLwkJCVJlc291cmNlIHJlc291cmNlID0gZVJlc291cmNlKCk7Ci0vLwkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLS8vCQkJCXJldHVybiBnZXRSZXNvdXJjZUZvckxvY2F0aW9uKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIGFsbCBvcHBvc2l0ZSBmZWF0dXJlcyByZWdpc3RlcmVkIHdpdGggdGhlIHN5c3RlbS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tQWxsT3Bwb3NpdGVGZWF0dXJlcygpIHsKLQkJLy8gZmluZCBhbGwgZmVhdHVyZXMgdGhhdCBoYXZlIG9wcG9zaXRlIGZlYXR1cmVzIGFuZCBjbGVhciB0aG9zZQotCQkvLyBmZWF0dXJlcy4gVGhpcyB3aWxsIHJlbW92ZSB0aGUgcmVmZXJlbmNlcyB0bwotCQkvLyB1bmxvYWRlZCBvYmplY3QgYnkgdGhvc2Ugb3Bwb3NpdGUgZmVhdHVyZXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUVSZWZlcmVuY2UgcmVmID0gKEVSZWZlcmVuY2UpIGl0ZXIubmV4dCgpOwotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9IE9wcG9zaXRlRmVhdHVyZS5nZXRPcHBvc2l0ZUZlYXR1cmUocmVmKTsKLQkJCWlmKG9wcG9zaXRlRmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJaWYocmVmLmlzTWFueSgpKSB7Ci0JCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBlR2V0KHJlZiwgZmFsc2UpOwkJCQkJCi0JCQkJCWlmKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJaWYoIW9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCWxpc3QuY2xlYXIoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYobGlzdCBpbnN0YW5jZW9mIEludGVybmFsRUxpc3QpIHsKLQkJCQkJCQlMaXN0IGJhc2ljTGlzdCA9ICgoSW50ZXJuYWxFTGlzdClsaXN0KS5iYXNpY0xpc3QoKTsKLQkJCQkJCQlmb3IoaW50IGkgPSBiYXNpY0xpc3Quc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGJhc2ljTGlzdC5nZXQoaSk7Ci0JCQkJCQkJCWlmKCFlLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQkJCWxpc3QucmVtb3ZlKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgZUdldChyZWYsIGZhbHNlKTsKLQkJCQkJaWYoZSAhPSBudWxsICYmICFlLmVJc1Byb3h5KCkpIHsKLQkJCQkJCWVTZXQocmVmLCBudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdCNnZXRPcHBvc2l0ZUZlYXR1cmVzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRPcHBvc2l0ZUZlYXR1cmVzKCkgewotCQlyZXR1cm4gZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkua2V5U2V0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdCNnZXREZWZhdWx0VmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwLmdldChmZWF0dXJlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0RmVhdHVyZXNXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKCkgewotCQlpZiAoZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwLmlzRW1wdHkoKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkKLQkJaWYoZmVhdHVyZXNXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlID09IG51bGwpIHsKLQkJCWZlYXR1cmVzV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCQlpZihlQ2xhc3MoKS5nZXRGZWF0dXJlSUQoZmVhdHVyZSkgIT0gLTEpIHsKLQkJCQkJZmVhdHVyZXNXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlLmFkZChmZWF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihmZWF0dXJlc1dpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUuaXNFbXB0eSgpKSB7Ci0JCQkJZmVhdHVyZXNXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmVhdHVyZXNXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlOwotCX0KLQkKLQkvKioKLQkgKiBVbnJlZ2lzdGVycyBhIGZlYXR1cmUgd2hvc2UgZGVmYXVsdCB2YWx1ZSBoYXMgYmVlbiBvdmVycmlkZW4uCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIGEgZmVhdHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYoZmVhdHVyZXNXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmVhdHVyZXNXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlLnJlbW92ZShmZWF0dXJlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIGFsbCBmZWF0dXJlcyBpZiAKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYXNzaWduRGVmYXVsdFZhbHVlcygpIHsKLQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9IGdldEZlYXR1cmVzV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZSgpOwotCQlpZihmZWF0dXJlcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJZVNldChmZWF0dXJlLCBnZXREZWZhdWx0VmFsdWUoZmVhdHVyZSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoCi0JCQlpbnQgZmVhdHVyZUlEKSB7Ci0JCUNvbGxlY3Rpb24gZmVhdHVyZXMgPSBnZXRGZWF0dXJlc1dpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoKTsKLQkJaWYoIWZlYXR1cmVzLmlzRW1wdHkoKSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBlQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoCi0JCQkJCWZlYXR1cmVJRCk7Ci0JCQlpZihmZWF0dXJlICE9IG51bGwgJiYgZmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCQlyZXR1cm4gZmVhdHVyZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldCgKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCU9iamVjdCBkZWZhdWx0VmFsdWUgPSBnZXREZWZhdWx0VmFsdWUoZmVhdHVyZSk7Ci0JCU9iamVjdCB2YWx1ZSA9IGVHZXQoZmVhdHVyZSwgZmFsc2UpOwotCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlyZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAhKChDb2xsZWN0aW9uKSB2YWx1ZSkuaXNFbXB0eSgpCi0JCQkJCSYmIHZhbHVlICE9IGRlZmF1bHRWYWx1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBkZWZhdWx0VmFsdWUgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhZGVmYXVsdFZhbHVlCi0JCQkJCS5lcXVhbHModmFsdWUpOwotCQl9Ci0JCX0KLQl9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL2ltcGwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL2ltcGwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMmU2MjI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9pbXBsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFVNQSBFY29yZSBleHRlbnNpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1Y2E5MDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB0aGUgVU1BIEVjb3JlIGV4dGVuc2lvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9FT2JqZWN0Q29udGFpbm1lbnRSZXNvbHZpbmdFTGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRU9iamVjdENvbnRhaW5tZW50UmVzb2x2aW5nRUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmNiZTZkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9FT2JqZWN0Q29udGFpbm1lbnRSZXNvbHZpbmdFTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRU9iamVjdENvbnRhaW5tZW50UmVzb2x2aW5nRUxpc3QgZXh0ZW5kcyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MzQ5ODMzNjMwNTUxOTc2NDg4TDsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVW5zZXR0YWJsZSBleHRlbmRzIEVPYmplY3RDb250YWlubWVudFJlc29sdmluZ0VMaXN0IHsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTExNzAwNDE1MTQ3NjUyMjcxOUw7Ci0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXQ7Ci0KLQkJcHVibGljIFVuc2V0dGFibGUoQ2xhc3MgZGF0YUNsYXNzLCBJbnRlcm5hbEVPYmplY3Qgb3duZXIsIGludCBmZWF0dXJlSUQpIHsKLQkJCXN1cGVyKGRhdGFDbGFzcywgb3duZXIsIGZlYXR1cmVJRCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBkaWRDaGFuZ2UoKSB7Ci0JCQlpc1NldCA9IHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1NldCgpIHsKLQkJCXJldHVybiBpc1NldDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuc2V0KCkgewotCQkJc3VwZXIudW5zZXQoKTsKLQkJCWlmIChpc05vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCQlib29sZWFuIG9sZElzU2V0ID0gaXNTZXQ7Ci0JCQkJaXNTZXQgPSBmYWxzZTsKLQkJCQlvd25lci5lTm90aWZ5KGNyZWF0ZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24uVU5TRVQsIG9sZElzU2V0LAotCQkJCQkJZmFsc2UpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaXNTZXQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBFT2JqZWN0Q29udGFpbm1lbnRSZXNvbHZpbmdFTGlzdChDbGFzcyBkYXRhQ2xhc3MsCi0JCQlJbnRlcm5hbEVPYmplY3Qgb3duZXIsIGludCBmZWF0dXJlSUQpIHsKLQkJc3VwZXIoZGF0YUNsYXNzLCBvd25lciwgZmVhdHVyZUlEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNQcm94aWVzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0I3Jlc29sdmUoaW50LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlc29sdmUoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCU11bHRpUmVzb3VyY2VFT2JqZWN0IGVPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUoaW5kZXgsCi0JCQkJKEVPYmplY3QpIG9iamVjdCk7Ci0JCWVPYmouZVNldENvbnRhaW5lcihvd25lciwgSW50ZXJuYWxFT2JqZWN0LkVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQktIGdldEZlYXR1cmVJRCgpKTsKLQkJcmV0dXJuIGVPYmo7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZUVMaXN0I2NvbnRhaW5zKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXNFT2JqZWN0KCkpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIuY29udGFpbnMob2JqZWN0KTsKLQkJCWlmIChoYXNQcm94aWVzKCkgJiYgIXJlc3VsdCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQkJCUVPYmplY3QgZU9iamVjdCA9IHJlc29sdmVQcm94eSgoRU9iamVjdCkgZGF0YVtpXSk7Ci0JCQkJCWlmIChlT2JqZWN0ID09IG9iamVjdCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBzdXBlci5jb250YWlucyhvYmplY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRU9iamVjdENvbnRhaW5tZW50UmVzb2x2aW5nV2l0aEludmVyc2VFTGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRU9iamVjdENvbnRhaW5tZW50UmVzb2x2aW5nV2l0aEludmVyc2VFTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjAzZDEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL0VPYmplY3RDb250YWlubWVudFJlc29sdmluZ1dpdGhJbnZlcnNlRUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRU9iamVjdENvbnRhaW5tZW50UmVzb2x2aW5nV2l0aEludmVyc2VFTGlzdCBleHRlbmRzCi0JCUVPYmplY3RDb250YWlubWVudFJlc29sdmluZ0VMaXN0IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMjIxNzcwODE2NTcxNzE4NTdMOwotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBVbnNldHRhYmxlIGV4dGVuZHMKLQkJCUVPYmplY3RDb250YWlubWVudFJlc29sdmluZ1dpdGhJbnZlcnNlRUxpc3QgewotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MjM5Mjk0NTY4Njc2MjcwMDc4TDsKLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NldDsKLQotCQlwdWJsaWMgVW5zZXR0YWJsZShDbGFzcyBkYXRhQ2xhc3MsIEludGVybmFsRU9iamVjdCBvd25lciwKLQkJCQlpbnQgZmVhdHVyZUlELCBpbnQgaW52ZXJzZUZlYXR1cmVJRCkgewotCQkJc3VwZXIoZGF0YUNsYXNzLCBvd25lciwgZmVhdHVyZUlELCBpbnZlcnNlRmVhdHVyZUlEKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGRpZENoYW5nZSgpIHsKLQkJCWlzU2V0ID0gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzU2V0KCkgewotCQkJcmV0dXJuIGlzU2V0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdW5zZXQoKSB7Ci0JCQlzdXBlci51bnNldCgpOwotCQkJaWYgKGlzTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJCWJvb2xlYW4gb2xkSXNTZXQgPSBpc1NldDsKLQkJCQlpc1NldCA9IGZhbHNlOwotCQkJCW93bmVyLmVOb3RpZnkoY3JlYXRlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbi5VTlNFVCwgb2xkSXNTZXQsCi0JCQkJCQlmYWxzZSkpOwotCQkJfSBlbHNlIHsKLQkJCQlpc1NldCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIGludCBpbnZlcnNlRmVhdHVyZUlEOwotCi0JcHVibGljIEVPYmplY3RDb250YWlubWVudFJlc29sdmluZ1dpdGhJbnZlcnNlRUxpc3QoQ2xhc3MgZGF0YUNsYXNzLAotCQkJSW50ZXJuYWxFT2JqZWN0IG93bmVyLCBpbnQgZmVhdHVyZUlELCBpbnQgaW52ZXJzZUZlYXR1cmVJRCkgewotCQlzdXBlcihkYXRhQ2xhc3MsIG93bmVyLCBmZWF0dXJlSUQpOwotCQl0aGlzLmludmVyc2VGZWF0dXJlSUQgPSBpbnZlcnNlRmVhdHVyZUlEOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGhhc05hdmlnYWJsZUludmVyc2UoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW52ZXJzZUZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIGludmVyc2VGZWF0dXJlSUQ7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldEludmVyc2VGZWF0dXJlQ2xhc3MoKSB7Ci0JCXJldHVybiBkYXRhQ2xhc3M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9FdmVudFR5cGVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9FdmVudFR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2MjE1MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRXZlbnRUeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi0vKioKLSAqIERlZmluZXMgYWRkaXRpb25hbCBub3RpZmljYXRpb24gZXZlbnQgdHlwZXMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRXZlbnRUeXBlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUtFX1BST1hZID0gTm90aWZpY2F0aW9uLkVWRU5UX1RZUEVfQ09VTlQgKyAxOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9PcHBvc2l0ZUZlYXR1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMTQ2MmE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogU3VwcG9ydHMgdGhlIHJldmVyc2UgdHJhdmVyc2FsIG9mIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIG1vZGVsIG9iamVjdHMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wcG9zaXRlRmVhdHVyZSB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgdGFyZ2V0RmVhdHVyZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc01hbnk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZU93bmVyID0gdHJ1ZTsKLQotCXByaXZhdGUgQ2xhc3Mgb3duZXJDbGFzczsKLQotCS8vcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWxpdmVyT25SZXNvbHZlOwotCi0JLyoqCi0JICogTWFwcyBzb3VyY2UgbW9kZWwgb2JqZWN0cyB0byBPcHBvc2l0ZUZlYXR1cmUgb2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1hcCBjbGFzc09wcG9zaXRlRmVhdHVyZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogTWFwcyBFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0cyB0byBPcHBvc2l0ZUZlYXR1cmUgb2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1hcCBmZWF0dXJlT3Bwb3NpdGVGZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG93bmVyQ2xhc3MKLQkgKiAgICAgICAgICAgIHRoZSBtb2RlbCBjbGFzcyB0aGF0IG93bnMgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEBwYXJhbSB0YXJnZXRGZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgZmVhdHVyZSB3aGljaCB0aGlzIG9wcG9zaXRlIGZlYXR1cmUgaXMgYmFzZWQgb24KLQkgKiBAcGFyYW0gaXNNYW55Ci0JICogICAgICAgICAgICBpZiA8dHJ1ZT4sIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIGFzc29jaWF0aW9uIGlzIHVuYm91bmRlZAotCSAqIEBwYXJhbSByZXNvbHZlT3duZXIKLQkgKiAgICAgICAgICAgIGlmIDx0cnVlPiwgcmVzb2x2ZSB0aGUgb3duZXIgY2xhc3MgaWYgaXQgaXMgYSBwcm94eQotCSAqLwotCXB1YmxpYyBPcHBvc2l0ZUZlYXR1cmUoQ2xhc3Mgb3duZXJDbGFzcywgU3RyaW5nIG5hbWUsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgdGFyZ2V0RmVhdHVyZSwgYm9vbGVhbiBpc01hbnksCi0JCQlib29sZWFuIHJlc29sdmVPd25lcikgewotCQl0aGlzLm93bmVyQ2xhc3MgPSBvd25lckNsYXNzOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnRhcmdldEZlYXR1cmUgPSB0YXJnZXRGZWF0dXJlOwotCQl0aGlzLmlzTWFueSA9IGlzTWFueTsKLQkJdGhpcy5yZXNvbHZlT3duZXIgPSByZXNvbHZlT3duZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJDbGFzcwotCSAqICAgICAgICAgICAgdGhlIG1vZGVsIGNsYXNzIHRoYXQgb3ducyB0aGlzIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlCi0JICogQHBhcmFtIHRhcmdldEZlYXR1cmUKLQkgKiAgICAgICAgICAgIHRoZSBmZWF0dXJlIHdoaWNoIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZSBpcyBiYXNlZCBvbgotCSAqIEBwYXJhbSBpc01hbnkKLQkgKiAgICAgICAgICAgIGlmIDx0cnVlPiwgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgYXNzb2NpYXRpb24gaXMgdW5ib3VuZGVkCi0JICovCi0JcHVibGljIE9wcG9zaXRlRmVhdHVyZShDbGFzcyBvd25lckNsYXNzLCBTdHJpbmcgbmFtZSwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSB0YXJnZXRGZWF0dXJlLCBib29sZWFuIGlzTWFueSkgewotCQl0aGlzKG93bmVyQ2xhc3MsIG5hbWUsIHRhcmdldEZlYXR1cmUsIGlzTWFueSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbW9kYWwgY2xhc3MgdGhhdCBvd25zIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2RhbCBjbGFzcyB0aGF0IG93bnMgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlCi0JICovCi0JcHVibGljIENsYXNzIGdldE93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBvd25lckNsYXNzOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBhc3NvY2lhdGlvbiBpcyB1bmJvdW5kZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXNzb2NpYXRpb24gaXMgdW5ib3VuZGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYW55KCkgewotCQlyZXR1cm4gaXNNYW55OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWUgb2YgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9wcG9zaXRlIGZlYXR1cmUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZmVhdHVyZSB3aGljaCB0aGlzIG9wcG9zaXRlIGZlYXR1cmUgaXMgYmFzZWQgb24uCi0JICogCi0JICogQHJldHVybiB0aGUgb3JpZ2luYWwgZmVhdHVyZSBnZW5lcmF0ZWQgYnkgRU1GCi0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRUYXJnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gdGFyZ2V0RmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBJRCBvZiB0aGlzIG9wcG9zaXRlIGZlYXR1cmUuCi0JICogCi0JICogQHJldHVybiB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBJRAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RmVhdHVyZUlEKCkgewotCQlyZXR1cm4gLTEgLSB0YXJnZXRGZWF0dXJlLmdldEZlYXR1cmVJRCgpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBvd25lciBjbGFzcyBvZiB0aGlzIG9wcG9zaXRlIGZlYXR1cmUsIGlmIHByb3hpZWQsCi0JICogc2hvdWxkIGJlIHJlc29sdmVkIHdoZW4gdGhlIHRhcmdldCBmZWF0dXJlIGlzIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIDx0cnVlPiBpZiB0aGUgb3duZXIgY2xhc3MsIGlmIHByb3hpZWQsIHNob3VsZCBiZSByZXNvbHZlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlc29sdmVPd25lcigpIHsKLQkJcmV0dXJuIHJlc29sdmVPd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlcyBvZiB0aGlzCi0JICogICAgICAgICBvcHBvc2l0ZSBmZWF0dXJlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBuYW1lICsgIlt0YXJnZXRGZWF0dXJlPSIgKyB0YXJnZXRGZWF0dXJlIC8vJE5PTi1OTFMtMSQKLQkJCQkrICIsIGlzTWFueT0iICsgaXNNYW55ICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIG9wcG9zaXRlIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIG9wcG9zaXRlRmVhdHVyZQotCSAqICAgICAgICAgICAgdGhlIG9wcG9zaXRlIGZlYXR1cmUgdG8gcmVnaXN0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVnaXN0ZXJPcHBvc2l0ZUZlYXR1cmUoCi0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlKSB7Ci0JCUNsYXNzIGNscyA9IG9wcG9zaXRlRmVhdHVyZS5nZXRPd25lckNsYXNzKCk7Ci0JCVNldCBmZWF0dXJlcyA9IChTZXQpIGNsYXNzT3Bwb3NpdGVGZWF0dXJlc01hcC5nZXQoY2xzKTsKLQkJaWYgKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCWZlYXR1cmVzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWNsYXNzT3Bwb3NpdGVGZWF0dXJlc01hcC5wdXQoY2xzLCBmZWF0dXJlcyk7Ci0JCX0KLQkJZmVhdHVyZXMuYWRkKG9wcG9zaXRlRmVhdHVyZSk7Ci0KLQkJZmVhdHVyZU9wcG9zaXRlRmVhdHVyZU1hcC5wdXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSwKLQkJCQlvcHBvc2l0ZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gYSBwcm94eSBvd25lciBjbGFzcyBpcyByZXNvbHZlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG5vdGlmaWNhdGlvbiBpcyBiZWluZyBzZW50IHdoZW4gYSBwcm94eQotCSAqICAgICAgICAgb3duZXIgY2xhc3MgaXMgcmVzb2x2ZWQKLQkgKi8KLQkvKgotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0RlbGl2ZXJPblJlc29sdmUoKSB7Ci0JCXJldHVybiBkZWxpdmVyT25SZXNvbHZlOwotCX0KLQkqLwotCi0JLyoqCi0JICogRW5hYmxlcyBub3RpZmljYXRpb24gd2hlbiBhIHByb3h5IG93bmVyIGNsYXNzIGlzIHJlc29sdmVkLgotCSAqIAotCSAqIEBwYXJhbSBlbmFibGVOb3RpZmljYXRpb24KLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBzZW5kIG5vdGlmaWNhdGlvbiB3aGVuIGEgcHJveHkgb3duZXIKLQkgKiAgICAgICAgICAgIGNsYXNzIGlzIHJlc29sdmVkCi0JICovCi0JLyoKLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2V0RGVsaXZlck9uUmVzb2x2ZShib29sZWFuIGVuYWJsZU5vdGlmaWNhdGlvbikgewotCQlkZWxpdmVyT25SZXNvbHZlID0gZW5hYmxlTm90aWZpY2F0aW9uOwotCX0KLQkqLwotCi0JLyoqCi0JICogR2V0cyB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBmb3IgdGhlIGdpdmVuIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIGFuIEVNRiA8Y29kZT5FU3RydWN0dXJhbEZlYXR1cmU8L2NvZGU+IGZlYXR1cmUKLQkgKiBAcmV0dXJuIGFuIG9wcG9zaXRlIGZlYXR1cmUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gZmVhdHVyZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIGdldE9wcG9zaXRlRmVhdHVyZSgKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiAoT3Bwb3NpdGVGZWF0dXJlKSBmZWF0dXJlT3Bwb3NpdGVGZWF0dXJlTWFwLmdldChmZWF0dXJlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyMjFiZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci0KLS8qKgotICogTm90aWZpY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCBhbiBvcHBvc2l0ZSBmZWF0dXJlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uIGV4dGVuZHMgTm90aWZpY2F0aW9uSW1wbCB7Ci0KLQlwcml2YXRlIE9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmU7Ci0KLQlwcml2YXRlIE9iamVjdCBub3RpZmllcjsKLQotCS8qKgotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGV2ZW50Ci0JICogQHBhcmFtIG9wcG9zaXRlRmVhdHVyZQotCSAqICAgICAgICAgICAgdGhlIG9wcG9zaXRlIGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm90aWZpY2F0aW9uCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICogICAgICAgICAgICB0aGUgb2xkIHZhbHVlCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgcG9zaXRpdGlvbiBhdCB3aGljaCB0aGUgY2hhbmdlIG9jY3VycmVkCi0JICogQHBhcmFtIHdhc1NldAotCSAqLwotCXB1YmxpYyBPcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24oT2JqZWN0IG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLAotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsCi0JCQlpbnQgcG9zaXRpb24sIGJvb2xlYW4gd2FzU2V0KSB7Ci0JCXN1cGVyKGV2ZW50VHlwZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3NpdGlvbiwgd2FzU2V0KTsKLQkJdGhpcy5ub3RpZmllciA9IG5vdGlmaWVyOwotCQl0aGlzLm9wcG9zaXRlRmVhdHVyZSA9IG9wcG9zaXRlRmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm90aWZpY2F0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9wcG9zaXRlIGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm90aWZpY2F0aW9uCi0JICovCi0JcHVibGljIE9wcG9zaXRlRmVhdHVyZSBnZXRPcHBzaXRlRmVhdHVyZSgpIHsKLQkJcmV0dXJuIG9wcG9zaXRlRmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbCNnZXROb3RpZmllcigpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpIHsKLQkJcmV0dXJuIG5vdGlmaWVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZVJlc29sdmluZ0VMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiNTM0ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZnlpbmdMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiBBIGxpc3QgZm9yIHJlc29sdmluZyBtdWx0aS12YWx1ZWQgb3Bwb3NpdGUgZmVhdHVyZXMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdCBleHRlbmRzIE5vdGlmeWluZ0xpc3RJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM2OTAxOTg3NjMwMDAwNTE3NjhMOwotCi0JcHJpdmF0ZSBNdWx0aVJlc291cmNlRU9iamVjdCBvd25lcjsKLQotCXByaXZhdGUgT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICB0aGUgb3duZXIgb2YgYW4gb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEBwYXJhbSBvcHBvc2l0ZUZlYXR1cmUKLQkgKiAgICAgICAgICAgIGFuIG9wcG9zaXRlIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QoTXVsdGlSZXNvdXJjZUVPYmplY3Qgb3duZXIsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQkJdGhpcy5vcHBvc2l0ZUZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmeWluZ0xpc3RJbXBsI2dldE5vdGlmaWVyKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE5vdGlmaWVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEVPYmplY3QgcmVzb2x2ZVByb3h5KEVPYmplY3QgZU9iamVjdCkgewotCQlyZXR1cm4gZU9iamVjdC5lSXNQcm94eSgpID8gb3duZXIKLQkJCQkuZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBlT2JqZWN0KSA6IGVPYmplY3Q7Ci0JfQotCi0JcHJvdGVjdGVkIE5vdGlmaWNhdGlvbkltcGwgY3JlYXRlTm90aWZpY2F0aW9uKGludCBldmVudFR5cGUsCi0JCQlPYmplY3Qgb2xkT2JqZWN0LCBPYmplY3QgbmV3T2JqZWN0LCBpbnQgaW5kZXgsIGJvb2xlYW4gd2FzU2V0KSB7Ci0JCXJldHVybiBuZXcgT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uKG93bmVyLCBldmVudFR5cGUsCi0JCQkJb3Bwb3NpdGVGZWF0dXJlLCBvbGRPYmplY3QsIG5ld09iamVjdCwgaW5kZXgsIHdhc1NldCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOb3RpZmljYXRpb25SZXF1aXJlZCgpIHsKLQkJcmV0dXJuIG93bmVyLmVOb3RpZmljYXRpb25SZXF1aXJlZCgpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgcmVzb2x2ZShpbnQgaW5kZXgsIE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkpCi0JCQlyZXR1cm4gb2JqZWN0OwotCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlFT2JqZWN0IHJlc29sdmVkID0gcmVzb2x2ZVByb3h5KGVPYmplY3QpOwotCQlpZiAocmVzb2x2ZWQgIT0gZU9iamVjdCkgewotCQkJT2JqZWN0IG9sZE9iamVjdCA9IGRhdGFbaW5kZXhdOwotCQkJYXNzaWduKGluZGV4LCB2YWxpZGF0ZShpbmRleCwgcmVzb2x2ZWQpKTsKLQotCQkJZGlkU2V0KGluZGV4LCByZXNvbHZlZCwgb2xkT2JqZWN0KTsKLQotCQkJLy8gaWYgKGlzTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCS8vIHsKLQkJCS8vIG93bmVyLmVOb3RpZnkoY3JlYXRlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBlT2JqZWN0LAotCQkJLy8gcmVzb2x2ZWQsIGluZGV4LCBmYWxzZSkpOwotCQkJLy8gfQotCi0JCQlyZXR1cm4gcmVzb2x2ZWQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZU9iamVjdDsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZURhbmdsaW5nT2JqZWN0cygpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmouZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSBsaXN0IHRoYXQgc3RvcmVzIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBsaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0VW5tb2RpZmlhYmxlTGlzdCgpIHsKLQkJcmVtb3ZlRGFuZ2xpbmdPYmplY3RzKCk7Ci0JCXJldHVybiBuZXcgVW5tb2RpZmlhYmxlRUxpc3Qoc2l6ZSwgZGF0YSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhZWZlNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgdGhlIFVNQSBFY29yZSBleHRlbnNpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcy9IZWFkZXIuamF2YWpldGluYyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvSGVhZGVyLmphdmFqZXRpbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxMDU2OWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcy9IZWFkZXIuamF2YWpldGluYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL21vZGVsL0NsYXNzLmphdmFqZXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL21vZGVsL0NsYXNzLmphdmFqZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3ZTk1NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcy9tb2RlbC9DbGFzcy5qYXZhamV0CisrKyAvZGV2L251bGwKQEAgLTEsMTgyMSArMCwwIEBACi08JUAgamV0IHBhY2thZ2U9Im9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmVjb3JlLnRlbXBsYXRlcy5tb2RlbCIgaW1wb3J0cz0iamF2YS51dGlsLiogb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uZWNvcmUuZ2VubW9kZWwuKiIgY2xhc3M9IkNsYXNzIiB2ZXJzaW9uPSIkSWQ6IENsYXNzLmphdmFqZXQsdiAxLjQgMjAwNi8wNy8xOCAwMDo1NjowOSBieHUgRXhwICQiICU+Ci08JQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKi8KLSU+Ci08JWZpbmFsIEdlbkNsYXNzIGdlbkNsYXNzID0gKEdlbkNsYXNzKSgoT2JqZWN0W10pYXJndW1lbnQpWzBdOyBmaW5hbCBHZW5QYWNrYWdlIGdlblBhY2thZ2UgPSBnZW5DbGFzcy5nZXRHZW5QYWNrYWdlKCk7IGZpbmFsIEdlbk1vZGVsIGdlbk1vZGVsPWdlblBhY2thZ2UuZ2V0R2VuTW9kZWwoKTslPgotPCVmaW5hbCBib29sZWFuIGlzSW50ZXJmYWNlID0gQm9vbGVhbi5UUlVFLmVxdWFscygoKE9iamVjdFtdKWFyZ3VtZW50KVsxXSk7IGZpbmFsIGJvb2xlYW4gaXNJbXBsZW1lbnRhdGlvbiA9IEJvb2xlYW4uVFJVRS5lcXVhbHMoKChPYmplY3RbXSlhcmd1bWVudClbMl0pOyU+Ci08JWZpbmFsIFN0cmluZyBwdWJsaWNTdGF0aWNGaW5hbEZsYWcgPSBpc0ltcGxlbWVudGF0aW9uID8gInB1YmxpYyBzdGF0aWMgZmluYWwgIiA6ICIiOyU+Ci08JUAgaW5jbHVkZSBmaWxlPSIuLi9IZWFkZXIuamF2YWpldGluYyIlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotcGFja2FnZSA8JT1nZW5QYWNrYWdlLmdldEludGVyZmFjZVBhY2thZ2VOYW1lKCklPjsKLTwlfSBlbHNlIHslPgotcGFja2FnZSA8JT1nZW5QYWNrYWdlLmdldENsYXNzUGFja2FnZU5hbWUoKSU+OwotPCV9JT4KLQotPCVnZW5Nb2RlbC5tYXJrSW1wb3J0TG9jYXRpb24oc3RyaW5nQnVmZmVyLCBnZW5QYWNrYWdlKTslPgotCi08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj48JT1nZW5DbGFzcy5nZXRGb3JtYXR0ZWROYW1lKCklPjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTwlaWYgKGdlbkNsYXNzLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiA8JT1nZW5DbGFzcy5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLTwlfSU+Ci0gKgotPCVpZiAoIWdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotPCVmb3IgKEl0ZXJhdG9yIGk9Z2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpaS5uZXh0KCk7JT4KLSAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkR2V0VmlzaWJpbGl0eSgpKSB7JT4KLSAqICAgPGxpPntAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fTwvbGk+Ci0gIDwlfSU+Ci08JX0lPgotICogPC91bD4KLSAqIDwvcD4KLTwlfSU+Ci0gKgotPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNZXRhRGF0YSgpKSB7JT4KLSAqIEBzZWUgPCU9Z2VuUGFja2FnZS5nZXRRdWFsaWZpZWRQYWNrYWdlSW50ZXJmYWNlTmFtZSgpJT4jZ2V0PCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NpZmllckFjY2Vzc29yTmFtZSgpJT4oKQotPCV9JT4KLTwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTW9kZWxUYWdzKCkpIHsgYm9vbGVhbiBmaXJzdCA9IHRydWU7IGZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2VuQ2xhc3MuZ2V0TW9kZWxJbmZvKCksICJcblxyIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeyBTdHJpbmcgbW9kZWxJbmZvID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOyBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotICogQG1vZGVsIDwlPW1vZGVsSW5mbyU+Ci08JX0gZWxzZSB7JT4KLSAqICAgICAgICA8JT1tb2RlbEluZm8lPgotPCV9fSBpZiAoZmlyc3QpIHslPgotICogQG1vZGVsCi08JX19JT4KLTwlaWYgKGdlbkNsYXNzLm5lZWRzUm9vdEV4dGVuZHNJbnRlcmZhY2VFeHRlbmRzVGFnKCkpIHslPgotICogQGV4dGVuZHMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKGdlbk1vZGVsLmdldFJvb3RFeHRlbmRzSW50ZXJmYWNlKCkpJT4KLTwlfSU+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLTwlfSBlbHNlIHslPgotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPjwlPWdlbkNsYXNzLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci08JWlmICghZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLTwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpaS5uZXh0KCk7JT4KLSAqICAgPGxpPntAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59PC9saT4KLTwlfSU+Ci0gKiA8L3VsPgotPCV9JT4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uKSB7JT4KLXB1YmxpYzwlaWYgKGdlbkNsYXNzLmlzQWJzdHJhY3QoKSkgeyU+IGFic3RyYWN0PCV9JT4gY2xhc3MgPCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NOYW1lKCklPjwlPWdlbkNsYXNzLmdldENsYXNzRXh0ZW5kcygpJT48JT1nZW5DbGFzcy5nZXRDbGFzc0ltcGxlbWVudHMoKSU+Ci08JX0gZWxzZSB7JT4KLXB1YmxpYyBpbnRlcmZhY2UgPCU9Z2VuQ2xhc3MuZ2V0SW50ZXJmYWNlTmFtZSgpJT48JT1nZW5DbGFzcy5nZXRJbnRlcmZhY2VFeHRlbmRzKCklPgotPCV9JT4KLXsKLTwlaWYgKGdlbk1vZGVsLmdldENvcHlyaWdodFRleHQoKSAhPSBudWxsKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQk8JT1wdWJsaWNTdGF0aWNGaW5hbEZsYWclPjwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLlN0cmluZyIpJT4gY29weXJpZ2h0ID0gIjwlPWdlbk1vZGVsLmdldENvcHlyaWdodFRleHQoKSU+Ijs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbk1vZGVsLmdldERyaXZlck51bWJlcigpICE9IG51bGwpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLmxhbmcuU3RyaW5nIiklPiBtb2ZEcml2ZXJOdW1iZXIgPSAiPCU9Z2VuTW9kZWwuZ2V0RHJpdmVyTnVtYmVyKCklPiI7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc0phdmFJT1NlcmlhbGl6YWJsZSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7IFN0cmluZyBlVmlydHVhbFZhbHVlc0ZpZWxkID0gZ2VuQ2xhc3MuZ2V0RVZpcnR1YWxWYWx1ZXNGaWVsZCgpOyU+Ci0gIDwlaWYgKGVWaXJ0dWFsVmFsdWVzRmllbGQgIT0gbnVsbCkgeyU+Ci0JLyoqCi0JICogQW4gYXJyYXkgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBub24tcHJpbWl0aXZlIGZlYXR1cmVzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSA8JT1lVmlydHVhbFZhbHVlc0ZpZWxkJT4gPSBudWxsOwotCi0gIDwlfSU+Ci0gIDwleyBMaXN0IGVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMgPSBnZW5DbGFzcy5nZXRFVmlydHVhbEluZGV4Qml0RmllbGRzKG5ldyBBcnJheUxpc3QoKSk7JT4KLSAgICA8JWlmICghZVZpcnR1YWxJbmRleEJpdEZpZWxkcy5pc0VtcHR5KCkpIHslPgotICAgICAgPCVmb3IgKEl0ZXJhdG9yIGkgPSBlVmlydHVhbEluZGV4Qml0RmllbGRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBTdHJpbmcgZVZpcnR1YWxJbmRleEJpdEZpZWxkID0gKFN0cmluZylpLm5leHQoKTslPgotCS8qKgotCSAqIEEgYml0IGZpZWxkIHJlcHJlc2VudGluZyB0aGUgaW5kaWNlcyBvZiBub24tcHJpbWl0aXZlIGZlYXR1cmUgdmFsdWVzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9ZVZpcnR1YWxJbmRleEJpdEZpZWxkJT4gPSAwOwotCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc01vZGVsUm9vdCgpICYmIGdlbk1vZGVsLmlzQm9vbGVhbkZsYWdzRW5hYmxlZCgpICYmIGdlbk1vZGVsLmdldEJvb2xlYW5GbGFnc1Jlc2VydmVkQml0cygpID09IC0xKSB7JT4KLQkvKioKLQkgKiBBIHNldCBvZiBiaXQgZmxhZ3MgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCB3aGV0aGVyIHVuc2V0dGFibGUgZmVhdHVyZXMgaGF2ZSBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9Z2VuTW9kZWwuZ2V0Qm9vbGVhbkZsYWdzRmllbGQoKSU+ID0gMDsKLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0gIDwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldERlY2xhcmVkRmllbGRHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZGVjbGFyZWRGaWVsZEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSB8fCBnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkSW50ZXJuYWxUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG51bGw7Ci0KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc0FycmF5QWNjZXNzb3JzKCkgJiYgIWdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpICYmICFnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLQkvKioKLQkgKiBUaGUgZW1wdHkgdmFsdWUgZm9yIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFycmF5QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIGFycmF5IGFjY2Vzc29yLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZSgpJT5bXSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUVNUFRZX0FSUkFZID0gbmV3IDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPiBbMF07Ci0KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkgfHwgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiAoIWdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkgfHwgIWdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpKSB7JT4KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUID0gPCU9Z2VuRmVhdHVyZS5nZXRTdGF0aWNEZWZhdWx0VmFsdWUoKSU+OzwlPWdlbk1vZGVsLmdldE5vbk5MUyhnZW5GZWF0dXJlLmdldFN0YXRpY0RlZmF1bHRWYWx1ZSgpKSU+Ci0KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5DbGFzcy5nZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgPiAzMSAmJiBnZW5DbGFzcy5nZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgJSAzMiA9PSAwKSB7JT4KLQkvKioKLQkgKiBBbiBhZGRpdGlvbmFsIHNldCBvZiBiaXQgZmxhZ3MgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCB3aGV0aGVyIHVuc2V0dGFibGUgZmVhdHVyZXMgaGF2ZSBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ID0gMDsKLQotICAgICAgICAgIDwlfSU+Ci0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHID0gMSA8JT0iPDwgIiArIGdlbkNsYXNzLmdldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyICU+OwotCi0gICAgICAgIDwlfSBlbHNlIHslPgotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ7Ci0KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuZ2V0RVNldEZsYWdJbmRleChnZW5GZWF0dXJlKSA+IDMxICYmIGdlbkNsYXNzLmdldEVTZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgJSAzMiA9PSAwKSB7JT4KLQkvKioKLQkgKiBBbiBhZGRpdGlvbmFsIHNldCBvZiBiaXQgZmxhZ3MgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCB3aGV0aGVyIHVuc2V0dGFibGUgZmVhdHVyZXMgaGF2ZSBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiA9IDA7Ci0KLSAgICAgICAgPCV9JT4KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPiA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcgPSAxIDwlPSI8PCAiICsgZ2VuQ2xhc3MuZ2V0RVNldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyICU+OwotCi0gICAgICA8JX0gZWxzZSB7JT4KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIDwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9kZWNsYXJlZEZpZWxkR2VuRmVhdHVyZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9kZWNsYXJlZEZpZWxkR2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgPCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NOYW1lKCklPigpCi0JewotCQlzdXBlcigpOwotICA8JWZvciAoSXRlcmF0b3IgaT1nZW5DbGFzcy5nZXRGbGFnR2VuRmVhdHVyZXMoInRydWUiKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpaS5uZXh0KCk7JT4KLQkJPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsKLSAgPCV9JT4KLSAgCi0gLy9VTUEtLT4KLSAJCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotIC8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcyIpJT4gZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRDbGFzc2lmaWVyQWNjZXNzb3IoKSU+OwotCX0KLQotPCV9JT4KLTwlbmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7JT4KLTwlZm9yIChJdGVyYXRvciBpPShpc0ltcGxlbWVudGF0aW9uID8gZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpIDogZ2VuQ2xhc3MuZ2V0RGVjbGFyZWRHZW5GZWF0dXJlcygpKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpaS5uZXh0KCk7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLSAgPCVpZiAoZ2VuTW9kZWwuaXNBcnJheUFjY2Vzc29ycygpICYmIGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCTwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPltdIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QXJyYXlBY2Nlc3NvcigpJT4oKTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZSgpJT5bXSA8JT1nZW5GZWF0dXJlLmdldEdldEFycmF5QWNjZXNzb3IoKSU+KCkKLQl7Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0JCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+IGxpc3QgPSAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQkJaWYgKGxpc3QuaXNFbXB0eSgpKSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VFTVBUWV9BUlJBWTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPT0gbnVsbCB8fCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5pc0VtcHR5KCkpIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUVNUFRZX0FSUkFZOwotCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPiBsaXN0ID0gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgPCV9JT4KLQkJbGlzdC5zaHJpbmsoKTsKLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZSgpJT5bXSlsaXN0LmRhdGEoKTsKLQl9Ci0KLSAgICA8JX0lPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQk8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZSgpJT4gZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoKSU+IGdldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihpbnQgaW5kZXgpCi0JewotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmdldChpbmRleCk7Ci0JfQotCi0gICAgPCV9JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JaW50IGdldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPkxlbmd0aCgpOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0JcHVibGljIGludCBnZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT5MZW5ndGgoKQotCXsKLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuc2l6ZSgpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9PSBudWxsID8gMCA6IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LnNpemUoKTsKLSAgICAgIDwlfSU+Ci0JfQotCi0gICAgPCV9JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0Jdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoKSU+W10gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoKSU+W10gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikKLQl7Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuc2V0RGF0YShuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+Lmxlbmd0aCwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0JfQotCi0gICAgPCV9JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0Jdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oaW50IGluZGV4LCA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZSgpJT4gZWxlbWVudCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oaW50IGluZGV4LCA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZSgpJT4gZWxlbWVudCkKLQl7Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuc2V0KGluZGV4LCBlbGVtZW50KTsKLQl9Ci0KLSAgICA8JX0lPgotICA8JX0lPgotICA8JWlmIChnZW5GZWF0dXJlLmlzR2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkR2V0VmlzaWJpbGl0eSgpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvYj48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyBHZW5GZWF0dXJlIGtleUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldE1hcEVudHJ5VHlwZUdlbkNsYXNzKCkuZ2V0TWFwRW50cnlLZXlGZWF0dXJlKCk7IEdlbkZlYXR1cmUgdmFsdWVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRNYXBFbnRyeVR5cGVHZW5DbGFzcygpLmdldE1hcEVudHJ5VmFsdWVGZWF0dXJlKCk7ICU+Ci0JICogVGhlIGtleSBpcyBvZiB0eXBlIDwlaWYgKGtleUZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT5saXN0IG9mIHtAbGluayA8JT1rZXlGZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZSgpJT59PCV9IGVsc2UgeyU+e0BsaW5rIDwlPWtleUZlYXR1cmUuZ2V0VHlwZSgpJT59PCV9JT4sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIDwlaWYgKHZhbHVlRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPmxpc3Qgb2Yge0BsaW5rIDwlPXZhbHVlRmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoKSU+fTwlfSBlbHNlIHslPntAbGluayA8JT12YWx1ZUZlYXR1cmUuZ2V0VHlwZSgpJT59PCV9JT4sCi0gICAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSAmJiAhKGdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNZXRhRGF0YSgpICYmICJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKCkpKSkgeyU+Ci0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKCklPn0uCi0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzU2V0RGVmYXVsdFZhbHVlKCkpIHslPgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPjwlPWdlbkZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCklPjwvY29kZT4uCi0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkgIT0gbnVsbCkgeyU+Ci0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgPCU9Z2VuRmVhdHVyZS5nZXRUeXBlR2VuRW51bSgpLmdldFF1YWxpZmllZE5hbWUoKSU+fS4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkgJiYgIWdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpLmdldEdlbkNsYXNzKCkuaXNNYXBFbnRyeSgpKSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUdlbkZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgJT4KLSAgICAgIDwlaWYgKCFyZXZlcnNlR2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIDwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEdlbkNsYXNzKCkuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScuCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICA8JWlmICghZ2VuRmVhdHVyZS5oYXNEb2N1bWVudGF0aW9uKCkpIHslPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLSAgICA8JX0lPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaGFzRG9jdW1lbnRhdGlvbigpKSB7JT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiA8JT1nZW5GZWF0dXJlLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAgICA8JX0lPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0gICAgPCVpZiAoZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRW51bSgpICE9IG51bGwpIHslPgotCSAqIEBzZWUgPCU9Z2VuRmVhdHVyZS5nZXRUeXBlR2VuRW51bSgpLmdldFF1YWxpZmllZE5hbWUoKSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRVbnNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPikKLSAgICA8JX0lPgotICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTWV0YURhdGEoKSkgeyU+Ci0JICogQHNlZSA8JT1nZW5QYWNrYWdlLmdldFF1YWxpZmllZFBhY2thZ2VJbnRlcmZhY2VOYW1lKCklPiNnZXQ8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkgJiYgIWdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpLmdldEdlbkNsYXNzKCkuaXNNYXBFbnRyeSgpKSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUdlbkZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgJT4KLSAgICAgIDwlaWYgKCFyZXZlcnNlR2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1vZGVsVGFncygpKSB7IGJvb2xlYW4gZmlyc3QgPSB0cnVlOyBmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdlbkZlYXR1cmUuZ2V0TW9kZWxJbmZvKCksICJcblxyIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeyBTdHJpbmcgbW9kZWxJbmZvID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOyBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotCSAqIEBtb2RlbCA8JT1tb2RlbEluZm8lPgotICAgIDwlfSBlbHNlIHslPgotCSAqICAgICAgICA8JT1tb2RlbEluZm8lPgotICAgIDwlfX0gaWYgKGZpcnN0KSB7JT4KLQkgKiBAbW9kZWwKLSAgICA8JX19JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCXsKLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCVpZiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLQkJcmV0dXJuIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPig8JX0lPig8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoKSU+KWVHZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCB0cnVlKTwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPikuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpPCV9JT47Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPT0gbnVsbCkKLQkJewotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3IDwlPWdlbkNsYXNzLmdldExpc3RDb25zdHJ1Y3RvcihnZW5GZWF0dXJlKSU+KTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldyA8JT1nZW5DbGFzcy5nZXRMaXN0Q29uc3RydWN0b3IoZ2VuRmVhdHVyZSklPjsKLSAgICAgICAgPCV9JT4KLQkJfQotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JT1nZW5GZWF0dXJlLmlzTWFwVHlwZSgpICYmIGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVTdXBwcmVzc0VNRlR5cGVzKCkgPyAiLm1hcCgpIiA6ICIiJT47Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pIHJldHVybiBudWxsOwotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillQ29udGFpbmVyKCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkpIHslPgotICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JWlmICghZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSkgeyU+LCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ8JX0lPik7Ci0gICAgICAgICAgPCV9JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZUFzRU9iamVjdCgpJT4uZUlzUHJveHkoKSkKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0JCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0Tm9uRU9iamVjdEludGVybmFsVHlwZUNhc3QoKSU+ZVJlc29sdmVQcm94eShvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLQkJCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KQotCQkJewotICAgICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLQkJCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncyA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBudWxsLCBudWxsKTsKLSAgICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyU+Ci0JCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncyA9ICBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbnVsbCk7Ci0gICAgICAgICAgPCV9JT4KLQkJCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKQotCQkJCXsKLSAgICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQkJCW1zZ3MgPSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbnVsbCwgbXNncyk7Ci0gICAgICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTslPgotCQkJCQltc2dzID0gIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VBZGQodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLSAgICAgICAgICA8JX0lPgotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0gICAgICAgICAgPCV9IGVsc2UgaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlJFU09MVkUsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikpOwotICAgICAgICAgIDwlfSU+Ci0JCQl9Ci0JCX0KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpICYmIGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCVpZiAoIWdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPiwgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUPCV9JT4pOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDA7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHsvL3ZvbGF0aWxlJT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LmVJc1Byb3h5KCkgPyA8JT1nZW5GZWF0dXJlLmdldE5vbkVPYmplY3RJbnRlcm5hbFR5cGVDYXN0KCklPmVSZXNvbHZlUHJveHkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pIDogPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPgotICAgICAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuIG5ldyA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkRWZmZWN0aXZlRmVhdHVyZU1hcFdyYXBwZXJDbGFzcygpJT4oKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpLmxpc3QoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KSk7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPikoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4pZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkubGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpLmxpc3QoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5saXN0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KDwlfSU+KDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZSgpJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpLmdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIHRydWUpPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KS48JT1nZW5GZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCk8JX0lPjsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPig8JX0lPig8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoKSU+KWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgdHJ1ZSk8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pLjwlPWdlbkZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKTwlfSU+OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQkvLyBUaGUgbGlzdCBpcyBleHBlY3RlZCB0byBpbXBsZW1lbnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCBhbmQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nCi0JCS8vIHNvIGl0J3MgbGlrZWx5IHRoYXQgYW4gYXBwcm9wcmlhdGUgc3ViY2xhc3Mgb2Ygb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuPCVpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyU+RWNvcmVFTWFwPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpKSB7JT5CYXNpY0ZlYXR1cmVNYXA8JX0gZWxzZSB7JT5FY29yZUVMaXN0PCV9JT4gc2hvdWxkIGJlIHVzZWQuCi0gICAgICAgIDwlfSU+Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9nZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9nZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuRmVhdHVyZS5pc0Jhc2ljR2V0KCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiBiYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0JewotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyU+Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZUludGVybmFsQ29udGFpbmVyKCk7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpLmdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIGZhbHNlKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpLmdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIGZhbHNlKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gLT4gZG8gbm90IHBlcmZvcm0gcHJveHkgcmVzb2x1dGlvbgotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuRmVhdHVyZS5pc0Jhc2ljU2V0KCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRJbnRlcm5hbFR5cGUoKSU+IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG1zZ3MpOwotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnBvc3QuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkJcmV0dXJuIG1zZ3M7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlPYmplY3Qgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IGVWaXJ0dWFsU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+IG5vdGlmaWNhdGlvbiA9IG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZSA/IG51bGwgOiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+IW9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0PCV9JT4pOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+IG5vdGlmaWNhdGlvbiA9IG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IEVWSVJUVUFMX05PX1ZBTFVFID8gbnVsbCA6IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotICAgICAgICA8JX0lPgotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0gICAgICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnBvc3QuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkJcmV0dXJuIG1zZ3M7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5iYXNpY0FkZCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG1zZ3MpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuYmFzaWNBZGQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBtc2dzKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSBjb250YWluZWQgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIC0+IHRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgaW52b2tlZCB0byBrZWVwIHRoZSBjb250YWlubWVudCByZWxhdGlvbnNoaXAgaW4gc3luY2gKLQkJLy8gLT4gZG8gbm90IG1vZGlmeSBvdGhlciBmZWF0dXJlcwotCQkvLyAtPiByZXR1cm4gbXNncywgYWZ0ZXIgYWRkaW5nIGFueSBnZW5lcmF0ZWQgTm90aWZpY2F0aW9uIHRvIGl0IChpZiBpdCBpcyBudWxsLCBhIE5vdGlmaWNhdGlvbkNoYWluIG9iamVjdCBtdXN0IGJlIGNyZWF0ZWQgZmlyc3QpCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNTZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7ICU+Ci0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzRW51bVR5cGUoKSkgeyU+Ci0JICogQHNlZSA8JT1nZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkuZ2V0UXVhbGlmaWVkTmFtZSgpJT4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI2lzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRVbnNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICA8JX0lPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyAlPgotCXZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiB2YWx1ZSk7Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyB2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikKLQl7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCWVTZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5uZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPig8JX0lPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pPCV9JT4pOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+ICYmIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gbnVsbCkpCi0JCXsKLQkJCWlmICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbCIpJT4uaXNBbmNlc3Rvcih0aGlzLCA8JT1nZW5GZWF0dXJlLmdldEVPYmplY3RDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pKQotCQkJCXRocm93IG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKSU+KCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gbnVsbCkKLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KW5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pLmVJbnZlcnNlQWRkKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0gICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KSk7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSB8fCBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlQ29udGFpbnMoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICA8JX0lPgotCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncyA9IG51bGw7Ci0JCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCkKLSAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkpIHslPgotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBudWxsLCBtc2dzKTsKLSAgICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTslPgotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikuZUludmVyc2VBZGQodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLSAgICAgICAgPCV9JT4KLQkJCW1zZ3MgPSBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEludGVybmFsVHlwZUNhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCWVsc2UKLSAgICAJewotICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gZVZpcnR1YWxJc1NldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPik7Ci0gICAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgICAgPCV9JT4KLQkJCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSB0cnVlOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sICFvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCkpOwotICAgICAgICAgIDwlfSU+Ci0gICAgCX0KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMDsKLSAgICAgICAgICA8JX0lPgotCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsgZWxzZSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSB8fCBnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFbnVtVHlwZSgpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVCA6IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQgOiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0SW50ZXJuYWxUeXBlQ2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgICAgICA8JX0lPgotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSB0cnVlOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPmlzU2V0Q2hhbmdlID8gPCVpZiAoZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSkgeyU+bnVsbDwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVDwlfSU+IDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JX0lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPiFvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUUgPyA8JWlmIChnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKSB7JT5udWxsPCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUPCV9JT4gOiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLnBvc3QuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKSkuc2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+bmV3IDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZSgpJT4oPCV9JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KTwlfSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuc2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+bmV3IDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZSgpJT4oPCV9JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KTwlfSU+KTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9zZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL3NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5GZWF0dXJlLmlzQmFzaWNVbnNldCgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljVW5zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGJhc2ljVW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0gICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCU9iamVjdCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gZVZpcnR1YWxVbnNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBudWxsOwotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4gbm90aWZpY2F0aW9uID0gbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5VTlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2UgPyBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+IDogbnVsbDwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgbnVsbCwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0PCV9JT4pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotICAgICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gdW5zZXQgdGhlIGNvbnRhaW5lZCAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gLT4gdGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBpbnZva2VkIHRvIGtlZXAgdGhlIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcCBpbiBzeW5jaAotCQkvLyAtPiBkbyBub3QgbW9kaWZ5IG90aGVyIGZlYXR1cmVzCi0JCS8vIC0+IHJldHVybiBtc2dzLCBhZnRlciBhZGRpbmcgYW55IGdlbmVyYXRlZCBOb3RpZmljYXRpb24gdG8gaXQgKGlmIGl0IGlzIG51bGwsIGEgTm90aWZpY2F0aW9uQ2hhaW4gb2JqZWN0IG11c3QgYmUgY3JlYXRlZCBmaXJzdCkKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljVW5zZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MuYmFzaWNVbnNldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldCgpICYmIChpc0ltcGxlbWVudGF0aW9uIHx8ICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSgpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy91bnNldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICA8JX0lPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLSAgPCVpZiAoIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPikKLSAgPCV9JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0Jdm9pZCB1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCB1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0JewotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCWVVbnNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgICAgPCV9JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwpICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPi5VbnNldHRhYmxlKTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS51bnNldCgpOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkgfHwgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZUNvbnRhaW5zKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgICAgPCV9JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwpCi0JCXsKLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSBudWxsOwotICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG51bGwsIG1zZ3MpOwotICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyU+Ci0JCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICAgICAgICA8JX0lPgotCQkJbXNncyA9IGJhc2ljVW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4obXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZQotICAgIAl7Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gZVZpcnR1YWxJc1NldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPik7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgIDwlfSU+Ci0JCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gZmFsc2U7Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5VTlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG51bGwsIG51bGwsIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0KSk7Ci0gICAgICAgIDwlfSU+Ci0gICAgCX0KLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9ICg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDA7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCU9iamVjdCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gZVZpcnR1YWxVbnNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPik7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG51bGw7Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlVOU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZSA/IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gOiBudWxsPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBudWxsLCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQpIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUc7IGVsc2UgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUc7Ci0gICAgICAgICAgPCV9IGVsc2UgaWYgKCFnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgfHwgZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSB8fCBnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPmlzU2V0Q2hhbmdlID8gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA6IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVDwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxULCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5jbGVhcig8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbClnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5jbGVhcig8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byB1bnNldCB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy91bnNldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChnZW5GZWF0dXJlLmlzSXNTZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzIHNldC4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ2hhbmdlYWJsZSgpICYmICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICN1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgPCV9JT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0gICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmIGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KQotICAgIDwlfSU+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JX0lPgotPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCWJvb2xlYW4gaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIGJvb2xlYW4gaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotCXsKLSAgICA8JWlmIChnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotCQlyZXR1cm4gZUlzU2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICA8JX0lPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT4uVW5zZXR0YWJsZSk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuaXNTZXQoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gZVZpcnR1YWxJc1NldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPik7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gISgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkpLmlzRW1wdHkoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gISgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbClnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5pc0VtcHR5KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB3aGV0aGVyIHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaXMgc2V0Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9pc1NldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuRmVhdHVyZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9nZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9Ly9mb3IlPgotPCV9fS5ydW4oKTslPgotPCVmb3IgKEl0ZXJhdG9yIGk9IChpc0ltcGxlbWVudGF0aW9uID8gZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5PcGVyYXRpb25zKCkgOiBnZW5DbGFzcy5nZXREZWNsYXJlZEdlbk9wZXJhdGlvbnMoKSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IEdlbk9wZXJhdGlvbiBnZW5PcGVyYXRpb24gPSAoR2VuT3BlcmF0aW9uKWkubmV4dCgpOyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5PcGVyYXRpb24ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICA8JWlmIChnZW5PcGVyYXRpb24uaGFzRG9jdW1lbnRhdGlvbigpKSB7JT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiA8JT1nZW5PcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICA8JX0lPgotICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1vZGVsVGFncygpKSB7IGJvb2xlYW4gZmlyc3QgPSB0cnVlOyBmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdlbk9wZXJhdGlvbi5nZXRNb2RlbEluZm8oKSwgIlxuXHIiKTsgc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgKSB7IFN0cmluZyBtb2RlbEluZm8gPSBzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCk7IGlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlOyU+Ci0JICogQG1vZGVsIDwlPW1vZGVsSW5mbyU+Ci0gIDwlfSBlbHNlIHslPgotCSAqICAgICAgICA8JT1tb2RlbEluZm8lPgotICA8JX19IGlmIChmaXJzdCkgeyU+Ci0JICogQG1vZGVsCi0gIDwlfX0lPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQk8JT1nZW5PcGVyYXRpb24uZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5PcGVyYXRpb24uZ2V0TmFtZSgpJT4oPCU9Z2VuT3BlcmF0aW9uLmdldFBhcmFtZXRlcnMoKSU+KTwlPWdlbk9wZXJhdGlvbi5nZXRUaHJvd3MoKSU+OwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgPCU9Z2VuT3BlcmF0aW9uLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuT3BlcmF0aW9uLmdldE5hbWUoKSU+KDwlPWdlbk9wZXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCklPik8JT1nZW5PcGVyYXRpb24uZ2V0VGhyb3dzKCklPgotCXsKLSAgPCVpZiAoZ2VuT3BlcmF0aW9uLmhhc0JvZHkoKSkgeyU+Ci0JCTwlPWdlbk9wZXJhdGlvbi5nZXRCb2R5KGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLSAgPCV9IGVsc2UgaWYgKGdlbk9wZXJhdGlvbi5pc0ludmFyaWFudCgpKSB7R2VuQ2xhc3Mgb3BDbGFzcyA9IGdlbk9wZXJhdGlvbi5nZXRHZW5DbGFzcygpOyBTdHJpbmcgZGlhZ25vc3RpY3MgPSAoKEdlblBhcmFtZXRlcilnZW5PcGVyYXRpb24uZ2V0R2VuUGFyYW1ldGVycygpLmdldCgwKSkuZ2V0TmFtZSgpOyBTdHJpbmcgY29udGV4dCA9ICgoR2VuUGFyYW1ldGVyKWdlbk9wZXJhdGlvbi5nZXRHZW5QYXJhbWV0ZXJzKCkuZ2V0KDEpKS5nZXROYW1lKCk7JT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCS8vIC0+IHNwZWNpZnkgdGhlIGNvbmRpdGlvbiB0aGF0IHZpb2xhdGVzIHRoZSBpbnZhcmlhbnQKLQkJLy8gLT4gdmVyaWZ5IHRoZSBkZXRhaWxzIG9mIHRoZSBkaWFnbm9zdGljLCBpbmNsdWRpbmcgc2V2ZXJpdHkgYW5kIG1lc3NhZ2UKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJaWYgKGZhbHNlKQotCQl7Ci0JCQlpZiAoPCU9ZGlhZ25vc3RpY3MlPiAhPSBudWxsKQotCQkJewotCQkJCTwlPWRpYWdub3N0aWNzJT4uYWRkCi0JCQkJCShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljIiklPgotCQkJCQkJKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMiKSU+LkVSUk9SLAotCQkJCQkJIDwlPW9wQ2xhc3MuZ2V0R2VuUGFja2FnZSgpLmdldEltcG9ydGVkVmFsaWRhdG9yQ2xhc3NOYW1lKCklPi5ESUFHTk9TVElDX1NPVVJDRSwKLQkJCQkJCSA8JT1vcENsYXNzLmdldEdlblBhY2thZ2UoKS5nZXRJbXBvcnRlZFZhbGlkYXRvckNsYXNzTmFtZSgpJT4uPCU9b3BDbGFzcy5nZXRPcGVyYXRpb25JRChnZW5PcGVyYXRpb24pJT4sCi0JCQkJCQkgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luIiklPi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9HZW5lcmljSW52YXJpYW50X2RpYWdub3N0aWMiLCBuZXcgT2JqZWN0W10geyAiPCU9Z2VuT3BlcmF0aW9uLmdldE5hbWUoKSU+IiwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0VmFsaWRhdG9yIiklPi5nZXRPYmplY3RMYWJlbCh0aGlzLCA8JT1jb250ZXh0JT4pIH0pLDwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT48JT1nZW5Nb2RlbC5nZXROb25OTFMoMiklPgotCQkJCQkJIG5ldyBPYmplY3QgW10geyB0aGlzIH0pKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLSAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pbXBsZW1lbnRlZEdlbk9wZXJhdGlvbi5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvaW1wbGVtZW50ZWRHZW5PcGVyYXRpb24udG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5PcGVyYXRpb24uaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvaW1wbGVtZW50ZWRHZW5PcGVyYXRpb24ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0vL2ZvciU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFSW52ZXJzZUFkZEdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gZUludmVyc2VBZGQoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci08JWZvciAoSXRlcmF0b3IgaT1nZW5DbGFzcy5nZXRFSW52ZXJzZUFkZEdlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWkubmV4dCgpOyU+Ci0gIDwlaWYgKCFnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpIHx8IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5jb250YWlucyhnZW5GZWF0dXJlKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPikoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldyk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzQmFzaWNTZXQoKSkgeyU+Ci0JCQkJcmV0dXJuIGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pb3RoZXJFbmQsIG1zZ3MpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG1zZ3MpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPik7Ci0gICAgICA8JX0lPgotCQkJCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKQotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZUNvbnRhaW5zKCkpIHslPgotCQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG51bGwsIG1zZ3MpOwotICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTslPgotCQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICAgICAgPCV9JT4KLQkJCQlyZXR1cm4gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPilvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RUludmVyc2VSZW1vdmVHZW5GZWF0dXJlcygpKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGVJbnZlcnNlUmVtb3ZlKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotPCVmb3IgKEl0ZXJhdG9yIGk9Z2VuQ2xhc3MuZ2V0RUludmVyc2VSZW1vdmVHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotICA8JWlmICghZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSB8fCBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuY29udGFpbnMoZ2VuRmVhdHVyZSkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpICYmIGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVTdXBwcmVzc0VNRlR5cGVzKCkpIHslPgotCQkJCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIiklPi5JbnRlcm5hbE1hcFZpZXcpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+KSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkgJiYgIWdlbkZlYXR1cmUuaXNCYXNpY1NldCgpKSB7JT4KLQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBtc2dzKTsKLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCQkJcmV0dXJuIGJhc2ljVW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4obXNncyk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KG51bGwsIG1zZ3MpOwotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVCYXNpY1JlbW92ZUZyb21Db250YWluZXJHZW5GZWF0dXJlcygpKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpCi0JCXsKLTwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldEVCYXNpY1JlbW92ZUZyb21Db250YWluZXJHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotICA8JUdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyU+Ci0gIDwlaWYgKCFnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpIHx8IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5jb250YWlucyhnZW5GZWF0dXJlKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiAhZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci08JWZvciAoSXRlcmF0b3IgaT1nZW5DbGFzcy5nZXRBbGxHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotICA8JWlmICghZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSB8fCBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuY29udGFpbnMoZ2VuRmVhdHVyZSkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNCb29sZWFuVHlwZSgpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gbmV3IDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldyk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCk7Ci0JCQkJZWxzZSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0JCQkJZWxzZSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5tYXAoKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpOwotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQkJCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmdldFdyYXBwZXIoKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0dldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RVNldEdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci08JWZvciAoSXRlcmF0b3IgaT1nZW5DbGFzcy5nZXRFU2V0R2VuRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpaS5uZXh0KCk7JT4KLSAgPCVpZiAoIWdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkgfHwgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmNvbnRhaW5zKGdlbkZlYXR1cmUpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpKS5zZXQobmV3VmFsdWUpOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuc2V0KG5ld1ZhbHVlKTsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUiKSU+LlNldHRpbmcpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIiklPi5JbnRlcm5hbE1hcFZpZXcpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSIpJT4uU2V0dGluZyk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5zZXQobmV3VmFsdWUpOwotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5jbGVhcigpOwotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuYWRkQWxsKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEudXRpbC5Db2xsZWN0aW9uIiklPiluZXdWYWx1ZSk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJCQlzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKCg8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoKSU+KW5ld1ZhbHVlKS48JT1nZW5GZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCkpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KW5ld1ZhbHVlKTsKLSAgICA8JX0lPgotCQkJCXJldHVybjsKLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotPCV9IGVsc2UgeyU+Ci0JCWVEeW5hbWljU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotPCV9JT4KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci08JWZvciAoSXRlcmF0b3IgaT1nZW5DbGFzcy5nZXRFU2V0R2VuRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpaS5uZXh0KCk7JT4KLSAgPCVpZiAoIWdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkgfHwgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmNvbnRhaW5zKGdlbkZlYXR1cmUpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkuY2xlYXIoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuY2xlYXIoKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJCXVuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPgotCQkJCXNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KW51bGwpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQpOwotICAgIDwlfSU+Ci0JCQkJcmV0dXJuOwotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotPCV9IGVsc2UgeyU+Ci0JCWVEeW5hbWljVW5zZXQoZmVhdHVyZUlEKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmICFnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2VJc1NldC5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsJCi0vL1VNQS0tPgotCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUiKSU+IGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZihmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0vL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci08JWZvciAoSXRlcmF0b3IgaT1nZW5DbGFzcy5nZXRBbGxHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotICA8JWlmICghZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSB8fCBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuY29udGFpbnMoZ2VuRmVhdHVyZSkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0JCQkJcmV0dXJuICEoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkuaXNFbXB0eSgpOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAhPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uZmVhdHVyZU1hcCgpLmlzRW1wdHkoKTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAhPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uaXNFbXB0eSgpOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pOwotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmICE8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5pc0VtcHR5KCk7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuICE8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmlzRW1wdHkoKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCQkJcmV0dXJuIGlzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJcmV0dXJuIGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KSAhPSBudWxsOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gYmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSAhPSBudWxsOwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbDsKLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCXJldHVybiBlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPikgIT0gbnVsbDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgIT0gbnVsbDsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkgfHwgZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwKSAhPSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQlyZXR1cm4gZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVCkgIT0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSAhPSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHsvL2RhdGF0eXBlJT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQgPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgOiAhPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxULmVxdWFscyg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQpOwotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQgPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgOiAhPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxULmVxdWFscyg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQgPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgIT0gbnVsbCA6ICE8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQuZXF1YWxzKDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpOwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChmZWF0dXJlSUQpOwotPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZUlzU2V0Lm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbkNsYXNzLmdldE1peGluR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MpCi0JewotICA8JWZvciAoSXRlcmF0b3IgbT1nZW5DbGFzcy5nZXRNaXhpbkdlbkNsYXNzZXMoKS5pdGVyYXRvcigpOyBtLmhhc05leHQoKTspIHsgR2VuQ2xhc3MgbWl4aW5HZW5DbGFzcyA9IChHZW5DbGFzcyltLm5leHQoKTsgJT4KLQkJaWYgKGJhc2VDbGFzcyA9PSA8JT1taXhpbkdlbkNsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLSAgICA8JWZvciAoSXRlcmF0b3IgZj1taXhpbkdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgZi5oYXNOZXh0KCk7KSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWYubmV4dCgpOyAlPgotCQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46IHJldHVybiA8JT1taXhpbkdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OwotICAgIDwlfSU+Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0gIDwlfSU+Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzKQotCXsKLSAgPCVmb3IgKEl0ZXJhdG9yIG09Z2VuQ2xhc3MuZ2V0TWl4aW5HZW5DbGFzc2VzKCkuaXRlcmF0b3IoKTsgbS5oYXNOZXh0KCk7KSB7IEdlbkNsYXNzIG1peGluR2VuQ2xhc3MgPSAoR2VuQ2xhc3MpbS5uZXh0KCk7ICU+Ci0JCWlmIChiYXNlQ2xhc3MgPT0gPCU9bWl4aW5HZW5DbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0gICAgPCVmb3IgKEl0ZXJhdG9yIGY9bWl4aW5HZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGYuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlmLm5leHQoKTsgJT4KLQkJCQljYXNlIDwlPW1peGluR2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46IHJldHVybiA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjsKLSAgICA8JX0lPgotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotICA8JX0lPgotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHsgU3RyaW5nIGVWaXJ0dWFsVmFsdWVzRmllbGQgPSBnZW5DbGFzcy5nZXRFVmlydHVhbFZhbHVlc0ZpZWxkKCk7JT4KLSAgPCVpZiAoZVZpcnR1YWxWYWx1ZXNGaWVsZCAhPSBudWxsKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZVZpcnR1YWxWYWx1ZXMoKQotCXsKLQkJcmV0dXJuIDwlPWVWaXJ0dWFsVmFsdWVzRmllbGQlPjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlU2V0VmlydHVhbFZhbHVlcyhPYmplY3RbXSBuZXdWYWx1ZXMpCi0JewotCQk8JT1lVmlydHVhbFZhbHVlc0ZpZWxkJT4gPSBuZXdWYWx1ZXM7Ci0JfQotCi0gIDwlfSU+Ci0gIDwleyBMaXN0IGVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMgPSBnZW5DbGFzcy5nZXRFVmlydHVhbEluZGV4Qml0RmllbGRzKG5ldyBBcnJheUxpc3QoKSk7JT4KLSAgICA8JWlmICghZVZpcnR1YWxJbmRleEJpdEZpZWxkcy5pc0VtcHR5KCkpIHsgTGlzdCBhbGxFVmlydHVhbEluZGV4Qml0RmllbGRzID0gZ2VuQ2xhc3MuZ2V0QWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcyhuZXcgQXJyYXlMaXN0KCkpOyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBlVmlydHVhbEluZGV4Qml0cyhpbnQgb2Zmc2V0KQotCXsKLQkJc3dpdGNoIChvZmZzZXQpCi0JCXsKLSAgICAgIDwlZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLnNpemUoKTsgaSsrKSB7JT4KLQkJCWNhc2UgPCU9aSU+IDoKLQkJCQlyZXR1cm4gPCU9YWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5nZXQoaSklPjsKLSAgICAgIDwlfSU+Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZVNldFZpcnR1YWxJbmRleEJpdHMoaW50IG9mZnNldCwgaW50IG5ld0luZGV4Qml0cykKLQl7Ci0JCXN3aXRjaCAob2Zmc2V0KQotCQl7Ci0gICAgICA8JWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5zaXplKCk7IGkrKykgeyU+Ci0JCQljYXNlIDwlPWklPiA6Ci0JCQkJPCU9YWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5nZXQoaSklPiA9IG5ld0luZGV4Qml0czsKLQkJCQlicmVhazsKLSAgICAgIDwlfSU+Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgIWdlbkNsYXNzLmdldFRvU3RyaW5nR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICA8JXsgYm9vbGVhbiBmaXJzdCA9IHRydWU7JT4KLSAgICA8JWZvciAoSXRlcmF0b3IgaT1nZW5DbGFzcy5nZXRUb1N0cmluZ0dlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotICAgICAgPCVpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotCQlyZXN1bHQuYXBwZW5kKCIgKDwlPWdlbkZlYXR1cmUuZ2V0TmFtZSgpJT46ICIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXN1bHQuYXBwZW5kKCIsIDwlPWdlbkZlYXR1cmUuZ2V0TmFtZSgpJT46ICIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCWlmIChlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KSkgcmVzdWx0LmFwcGVuZChlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPikpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWlmICg8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4oPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ8JX0lPikgcmVzdWx0LmFwcGVuZCgoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlpZiAoPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+KDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA8JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0PCV9JT4pIHJlc3VsdC5hcHBlbmQoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXN1bHQuYXBwZW5kKGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCVpZiAoIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKXslPiwgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUPCV9JT4pKTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJcmVzdWx0LmFwcGVuZCgoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwKTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmVzdWx0LmFwcGVuZCg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc01hcEVudHJ5KCkpIHsgR2VuRmVhdHVyZSBrZXlGZWF0dXJlID0gZ2VuQ2xhc3MuZ2V0TWFwRW50cnlLZXlGZWF0dXJlKCk7IEdlbkZlYXR1cmUgdmFsdWVGZWF0dXJlID0gZ2VuQ2xhc3MuZ2V0TWFwRW50cnlWYWx1ZUZlYXR1cmUoKTslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgaGFzaCA9IC0xOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRIYXNoKCkKLQl7Ci0JCWlmIChoYXNoID09IC0xKQotCQl7Ci0JCQlPYmplY3QgdGhlS2V5ID0gZ2V0S2V5KCk7Ci0JCQloYXNoID0gKHRoZUtleSA9PSBudWxsID8gMCA6IHRoZUtleS5oYXNoQ29kZSgpKTsKLQkJfQotCQlyZXR1cm4gaGFzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYXNoKGludCBoYXNoKQotCXsKLQkJdGhpcy5oYXNoID0gaGFzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0JewotICA8JWlmIChrZXlGZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmV0dXJuIG5ldyA8JT1rZXlGZWF0dXJlLmdldE9iamVjdFR5cGUoKSU+KGdldFR5cGVkS2V5KCkpOwotICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGdldFR5cGVkS2V5KCk7Ci0gIDwlfSU+Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5KE9iamVjdCBrZXkpCi0JewotICA8JWlmIChrZXlGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCWdldFR5cGVkS2V5KCkuYWRkQWxsKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEudXRpbC5Db2xsZWN0aW9uIiklPilrZXkpOwotICA8JX0gZWxzZSBpZiAoa2V5RmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXNldFR5cGVkS2V5KCgoPCU9a2V5RmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPilrZXkpLjwlPWtleUZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKSk7Ci0gIDwlfSBlbHNlIHslPgotCQlzZXRUeXBlZEtleSgoPCU9a2V5RmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWtleSk7Ci0gIDwlfSU+Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpCi0JewotICA8JWlmICh2YWx1ZUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPXZhbHVlRmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPihnZXRUeXBlZFZhbHVlKCkpOwotICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGdldFR5cGVkVmFsdWUoKTsKLSAgPCV9JT4KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkKLQl7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IGdldFZhbHVlKCk7Ci0gIDwlaWYgKHZhbHVlRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQlnZXRUeXBlZFZhbHVlKCkuY2xlYXIoKTsKLQkJZ2V0VHlwZWRWYWx1ZSgpLmFkZEFsbCgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpJT4pdmFsdWUpOwotICA8JX0gZWxzZSBpZiAodmFsdWVGZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJc2V0VHlwZWRWYWx1ZSgoKDwlPXZhbHVlRmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPil2YWx1ZSkuPCU9dmFsdWVGZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCkpOwotICA8JX0gZWxzZSB7JT4KLQkJc2V0VHlwZWRWYWx1ZSgoPCU9dmFsdWVGZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pdmFsdWUpOwotICA8JX0lPgotCQlyZXR1cm4gb2xkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+IGdldEVNYXAoKQotCXsKLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIpJT4gY29udGFpbmVyID0gZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gY29udGFpbmVyID09IG51bGwgPyBudWxsIDogKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+KWNvbnRhaW5lci5lR2V0KGVDb250YWlubWVudEZlYXR1cmUoKSk7Ci0JfQotCi08JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLX0gLy88JT1pc0ludGVyZmFjZSA/ICIgIiArIGdlbkNsYXNzLmdldEludGVyZmFjZU5hbWUoKSA6IGdlbkNsYXNzLmdldENsYXNzTmFtZSgpJT4KLTwlLy8gVE9ETyBmaXggdGhlIHNwYWNlIGFib3ZlJT4KLTwlZ2VuTW9kZWwuZW1pdFNvcnRlZEltcG9ydHMoKTslPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvbW9kZWwvQ2xhc3MuamF2YWpldC5vcmcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL21vZGVsL0NsYXNzLmphdmFqZXQub3JnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOWY2ZjAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvbW9kZWwvQ2xhc3MuamF2YWpldC5vcmcKKysrIC9kZXYvbnVsbApAQCAtMSwxODExICswLDAgQEAKLTwlQCBqZXQgcGFja2FnZT0ib3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uZWNvcmUudGVtcGxhdGVzLm1vZGVsIiBpbXBvcnRzPSJqYXZhLnV0aWwuKiBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5lY29yZS5nZW5tb2RlbC4qIiBjbGFzcz0iQ2xhc3MiIHZlcnNpb249IiRJZCQiICU+Ci08JQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKi8KLSU+Ci08JWZpbmFsIEdlbkNsYXNzIGdlbkNsYXNzID0gKEdlbkNsYXNzKSgoT2JqZWN0W10pYXJndW1lbnQpWzBdOyBmaW5hbCBHZW5QYWNrYWdlIGdlblBhY2thZ2UgPSBnZW5DbGFzcy5nZXRHZW5QYWNrYWdlKCk7IGZpbmFsIEdlbk1vZGVsIGdlbk1vZGVsPWdlblBhY2thZ2UuZ2V0R2VuTW9kZWwoKTslPgotPCVmaW5hbCBib29sZWFuIGlzSW50ZXJmYWNlID0gQm9vbGVhbi5UUlVFLmVxdWFscygoKE9iamVjdFtdKWFyZ3VtZW50KVsxXSk7IGZpbmFsIGJvb2xlYW4gaXNJbXBsZW1lbnRhdGlvbiA9IEJvb2xlYW4uVFJVRS5lcXVhbHMoKChPYmplY3RbXSlhcmd1bWVudClbMl0pOyU+Ci08JWZpbmFsIFN0cmluZyBwdWJsaWNTdGF0aWNGaW5hbEZsYWcgPSBpc0ltcGxlbWVudGF0aW9uID8gInB1YmxpYyBzdGF0aWMgZmluYWwgIiA6ICIiOyU+Ci08JUAgaW5jbHVkZSBmaWxlPSIuLi9IZWFkZXIuamF2YWpldGluYyIlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotcGFja2FnZSA8JT1nZW5QYWNrYWdlLmdldEludGVyZmFjZVBhY2thZ2VOYW1lKCklPjsKLTwlfSBlbHNlIHslPgotcGFja2FnZSA8JT1nZW5QYWNrYWdlLmdldENsYXNzUGFja2FnZU5hbWUoKSU+OwotPCV9JT4KLQotPCVnZW5Nb2RlbC5tYXJrSW1wb3J0TG9jYXRpb24oc3RyaW5nQnVmZmVyLCBnZW5QYWNrYWdlKTslPgotCi08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj48JT1nZW5DbGFzcy5nZXRGb3JtYXR0ZWROYW1lKCklPjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTwlaWYgKGdlbkNsYXNzLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiA8JT1nZW5DbGFzcy5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLTwlfSU+Ci0gKgotPCVpZiAoIWdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotPCVmb3IgKEl0ZXJhdG9yIGk9Z2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpaS5uZXh0KCk7JT4KLSAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkR2V0VmlzaWJpbGl0eSgpKSB7JT4KLSAqICAgPGxpPntAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fTwvbGk+Ci0gIDwlfSU+Ci08JX0lPgotICogPC91bD4KLSAqIDwvcD4KLTwlfSU+Ci0gKgotPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNZXRhRGF0YSgpKSB7JT4KLSAqIEBzZWUgPCU9Z2VuUGFja2FnZS5nZXRRdWFsaWZpZWRQYWNrYWdlSW50ZXJmYWNlTmFtZSgpJT4jZ2V0PCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NpZmllckFjY2Vzc29yTmFtZSgpJT4oKQotPCV9JT4KLTwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTW9kZWxUYWdzKCkpIHsgYm9vbGVhbiBmaXJzdCA9IHRydWU7IGZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2VuQ2xhc3MuZ2V0TW9kZWxJbmZvKCksICJcblxyIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeyBTdHJpbmcgbW9kZWxJbmZvID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOyBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotICogQG1vZGVsIDwlPW1vZGVsSW5mbyU+Ci08JX0gZWxzZSB7JT4KLSAqICAgICAgICA8JT1tb2RlbEluZm8lPgotPCV9fSBpZiAoZmlyc3QpIHslPgotICogQG1vZGVsCi08JX19JT4KLTwlaWYgKGdlbkNsYXNzLm5lZWRzUm9vdEV4dGVuZHNJbnRlcmZhY2VFeHRlbmRzVGFnKCkpIHslPgotICogQGV4dGVuZHMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKGdlbk1vZGVsLmdldFJvb3RFeHRlbmRzSW50ZXJmYWNlKCkpJT4KLTwlfSU+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLTwlfSBlbHNlIHslPgotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPjwlPWdlbkNsYXNzLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci08JWlmICghZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLTwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpaS5uZXh0KCk7JT4KLSAqICAgPGxpPntAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59PC9saT4KLTwlfSU+Ci0gKiA8L3VsPgotPCV9JT4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uKSB7JT4KLXB1YmxpYzwlaWYgKGdlbkNsYXNzLmlzQWJzdHJhY3QoKSkgeyU+IGFic3RyYWN0PCV9JT4gY2xhc3MgPCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NOYW1lKCklPjwlPWdlbkNsYXNzLmdldENsYXNzRXh0ZW5kcygpJT48JT1nZW5DbGFzcy5nZXRDbGFzc0ltcGxlbWVudHMoKSU+Ci08JX0gZWxzZSB7JT4KLXB1YmxpYyBpbnRlcmZhY2UgPCU9Z2VuQ2xhc3MuZ2V0SW50ZXJmYWNlTmFtZSgpJT48JT1nZW5DbGFzcy5nZXRJbnRlcmZhY2VFeHRlbmRzKCklPgotPCV9JT4KLXsKLTwlaWYgKGdlbk1vZGVsLmdldENvcHlyaWdodFRleHQoKSAhPSBudWxsKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQk8JT1wdWJsaWNTdGF0aWNGaW5hbEZsYWclPjwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLlN0cmluZyIpJT4gY29weXJpZ2h0ID0gIjwlPWdlbk1vZGVsLmdldENvcHlyaWdodFRleHQoKSU+Ijs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbk1vZGVsLmdldERyaXZlck51bWJlcigpICE9IG51bGwpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLmxhbmcuU3RyaW5nIiklPiBtb2ZEcml2ZXJOdW1iZXIgPSAiPCU9Z2VuTW9kZWwuZ2V0RHJpdmVyTnVtYmVyKCklPiI7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc0phdmFJT1NlcmlhbGl6YWJsZSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7IFN0cmluZyBlVmlydHVhbFZhbHVlc0ZpZWxkID0gZ2VuQ2xhc3MuZ2V0RVZpcnR1YWxWYWx1ZXNGaWVsZCgpOyU+Ci0gIDwlaWYgKGVWaXJ0dWFsVmFsdWVzRmllbGQgIT0gbnVsbCkgeyU+Ci0JLyoqCi0JICogQW4gYXJyYXkgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBub24tcHJpbWl0aXZlIGZlYXR1cmVzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSA8JT1lVmlydHVhbFZhbHVlc0ZpZWxkJT4gPSBudWxsOwotCi0gIDwlfSU+Ci0gIDwleyBMaXN0IGVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMgPSBnZW5DbGFzcy5nZXRFVmlydHVhbEluZGV4Qml0RmllbGRzKG5ldyBBcnJheUxpc3QoKSk7JT4KLSAgICA8JWlmICghZVZpcnR1YWxJbmRleEJpdEZpZWxkcy5pc0VtcHR5KCkpIHslPgotICAgICAgPCVmb3IgKEl0ZXJhdG9yIGkgPSBlVmlydHVhbEluZGV4Qml0RmllbGRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBTdHJpbmcgZVZpcnR1YWxJbmRleEJpdEZpZWxkID0gKFN0cmluZylpLm5leHQoKTslPgotCS8qKgotCSAqIEEgYml0IGZpZWxkIHJlcHJlc2VudGluZyB0aGUgaW5kaWNlcyBvZiBub24tcHJpbWl0aXZlIGZlYXR1cmUgdmFsdWVzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9ZVZpcnR1YWxJbmRleEJpdEZpZWxkJT4gPSAwOwotCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc01vZGVsUm9vdCgpICYmIGdlbk1vZGVsLmlzQm9vbGVhbkZsYWdzRW5hYmxlZCgpICYmIGdlbk1vZGVsLmdldEJvb2xlYW5GbGFnc1Jlc2VydmVkQml0cygpID09IC0xKSB7JT4KLQkvKioKLQkgKiBBIHNldCBvZiBiaXQgZmxhZ3MgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCB3aGV0aGVyIHVuc2V0dGFibGUgZmVhdHVyZXMgaGF2ZSBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9Z2VuTW9kZWwuZ2V0Qm9vbGVhbkZsYWdzRmllbGQoKSU+ID0gMDsKLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0gIDwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldERlY2xhcmVkRmllbGRHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZGVjbGFyZWRGaWVsZEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSB8fCBnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkSW50ZXJuYWxUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG51bGw7Ci0KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc0FycmF5QWNjZXNzb3JzKCkgJiYgIWdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpICYmICFnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLQkvKioKLQkgKiBUaGUgZW1wdHkgdmFsdWUgZm9yIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFycmF5QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIGFycmF5IGFjY2Vzc29yLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZSgpJT5bXSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUVNUFRZX0FSUkFZID0gbmV3IDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPiBbMF07Ci0KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkgfHwgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiAoIWdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkgfHwgIWdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpKSB7JT4KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUID0gPCU9Z2VuRmVhdHVyZS5nZXRTdGF0aWNEZWZhdWx0VmFsdWUoKSU+OzwlPWdlbk1vZGVsLmdldE5vbk5MUyhnZW5GZWF0dXJlLmdldFN0YXRpY0RlZmF1bHRWYWx1ZSgpKSU+Ci0KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5DbGFzcy5nZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgPiAzMSAmJiBnZW5DbGFzcy5nZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgJSAzMiA9PSAwKSB7JT4KLQkvKioKLQkgKiBBbiBhZGRpdGlvbmFsIHNldCBvZiBiaXQgZmxhZ3MgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCB3aGV0aGVyIHVuc2V0dGFibGUgZmVhdHVyZXMgaGF2ZSBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ID0gMDsKLQotICAgICAgICAgIDwlfSU+Ci0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHID0gMSA8JT0iPDwgIiArIGdlbkNsYXNzLmdldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyICU+OwotCi0gICAgICAgIDwlfSBlbHNlIHslPgotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ7Ci0KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuZ2V0RVNldEZsYWdJbmRleChnZW5GZWF0dXJlKSA+IDMxICYmIGdlbkNsYXNzLmdldEVTZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgJSAzMiA9PSAwKSB7JT4KLQkvKioKLQkgKiBBbiBhZGRpdGlvbmFsIHNldCBvZiBiaXQgZmxhZ3MgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCB3aGV0aGVyIHVuc2V0dGFibGUgZmVhdHVyZXMgaGF2ZSBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiA9IDA7Ci0KLSAgICAgICAgPCV9JT4KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPiA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcgPSAxIDwlPSI8PCAiICsgZ2VuQ2xhc3MuZ2V0RVNldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyICU+OwotCi0gICAgICA8JX0gZWxzZSB7JT4KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIDwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9kZWNsYXJlZEZpZWxkR2VuRmVhdHVyZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9kZWNsYXJlZEZpZWxkR2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgPCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NOYW1lKCklPigpCi0JewotCQlzdXBlcigpOwotICA8JWZvciAoSXRlcmF0b3IgaT1nZW5DbGFzcy5nZXRGbGFnR2VuRmVhdHVyZXMoInRydWUiKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpaS5uZXh0KCk7JT4KLQkJPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsKLSAgPCV9JT4KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzIiklPiBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZENsYXNzaWZpZXJBY2Nlc3NvcigpJT47Ci0JfQotCi08JX0lPgotPCVuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHslPgotPCVmb3IgKEl0ZXJhdG9yIGk9KGlzSW1wbGVtZW50YXRpb24gPyBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkgOiBnZW5DbGFzcy5nZXREZWNsYXJlZEdlbkZlYXR1cmVzKCkpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotICA8JWlmIChnZW5Nb2RlbC5pc0FycmF5QWNjZXNzb3JzKCkgJiYgZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpICYmICFnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoKSU+W10gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPltdIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QXJyYXlBY2Nlc3NvcigpJT4oKQotCXsKLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT4gbGlzdCA9ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUVNUFRZX0FSUkFZOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9PSBudWxsIHx8IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LmlzRW1wdHkoKSkgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRU1QVFlfQVJSQVk7Ci0JCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+IGxpc3QgPSAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICA8JX0lPgotCQlsaXN0LnNocmluaygpOwotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPltdKWxpc3QuZGF0YSgpOwotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCTwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPiBnZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oaW50IGluZGV4KTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZSgpJT4gZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCkKLQl7Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuZ2V0KGluZGV4KTsKLQl9Ci0KLSAgICA8JX0lPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQlpbnQgZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+TGVuZ3RoKCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgaW50IGdldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPkxlbmd0aCgpCi0JewotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5zaXplKCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID09IG51bGwgPyAwIDogPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uc2l6ZSgpOwotICAgICAgPCV9JT4KLQl9Ci0KLSAgICA8JX0lPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQl2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZSgpJT5bXSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyB2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZSgpJT5bXSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KQotCXsKLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5zZXREYXRhKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4ubGVuZ3RoLCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLQl9Ci0KLSAgICA8JX0lPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQl2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihpbnQgaW5kZXgsIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPiBlbGVtZW50KTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyB2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihpbnQgaW5kZXgsIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPiBlbGVtZW50KQotCXsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5zZXQoaW5kZXgsIGVsZW1lbnQpOwotCX0KLQotICAgIDwlfSU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNHZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9iPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7IEdlbkZlYXR1cmUga2V5RmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0TWFwRW50cnlUeXBlR2VuQ2xhc3MoKS5nZXRNYXBFbnRyeUtleUZlYXR1cmUoKTsgR2VuRmVhdHVyZSB2YWx1ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldE1hcEVudHJ5VHlwZUdlbkNsYXNzKCkuZ2V0TWFwRW50cnlWYWx1ZUZlYXR1cmUoKTsgJT4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUgPCVpZiAoa2V5RmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPmxpc3Qgb2Yge0BsaW5rIDwlPWtleUZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKCklPn08JX0gZWxzZSB7JT57QGxpbmsgPCU9a2V5RmVhdHVyZS5nZXRUeXBlKCklPn08JX0lPiwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUgPCVpZiAodmFsdWVGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+bGlzdCBvZiB7QGxpbmsgPCU9dmFsdWVGZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZSgpJT59PCV9IGVsc2UgeyU+e0BsaW5rIDwlPXZhbHVlRmVhdHVyZS5nZXRUeXBlKCklPn08JX0lPiwKLSAgICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpICYmICEoZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1ldGFEYXRhKCkgJiYgIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ii5lcXVhbHMoZ2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoKSkpKSB7JT4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoKSU+fS4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNTZXREZWZhdWx0VmFsdWUoKSkgeyU+Ci0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+PCU9Z2VuRmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSU+PC9jb2RlPi4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKSAhPSBudWxsKSB7JT4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayA8JT1nZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkuZ2V0UXVhbGlmaWVkTmFtZSgpJT59LgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSAmJiAhZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCkuZ2V0R2VuQ2xhc3MoKS5pc01hcEVudHJ5KCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlR2VuRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyAlPgotICAgICAgPCVpZiAoIXJldmVyc2VHZW5GZWF0dXJlLmlzU3VwcHJlc3NlZEdldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59Jy4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgIDwlaWYgKCFnZW5GZWF0dXJlLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotICAgIDwlfSU+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5oYXNEb2N1bWVudGF0aW9uKCkpIHslPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIDwlPWdlbkZlYXR1cmUuZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICAgIDwlfSU+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkgIT0gbnVsbCkgeyU+Ci0JICogQHNlZSA8JT1nZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkuZ2V0UXVhbGlmaWVkTmFtZSgpJT4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI2lzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ2hhbmdlYWJsZSgpICYmICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICN1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KQotICAgIDwlfSU+Ci0gICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNZXRhRGF0YSgpKSB7JT4KLQkgKiBAc2VlIDwlPWdlblBhY2thZ2UuZ2V0UXVhbGlmaWVkUGFja2FnZUludGVyZmFjZU5hbWUoKSU+I2dldDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUFjY2Vzc29yTmFtZSgpJT4oKQotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSAmJiAhZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCkuZ2V0R2VuQ2xhc3MoKS5pc01hcEVudHJ5KCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlR2VuRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyAlPgotICAgICAgPCVpZiAoIXJldmVyc2VHZW5GZWF0dXJlLmlzU3VwcHJlc3NlZEdldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSA8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZW5DbGFzcygpLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTW9kZWxUYWdzKCkpIHsgYm9vbGVhbiBmaXJzdCA9IHRydWU7IGZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2VuRmVhdHVyZS5nZXRNb2RlbEluZm8oKSwgIlxuXHIiKTsgc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgKSB7IFN0cmluZyBtb2RlbEluZm8gPSBzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCk7IGlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlOyU+Ci0JICogQG1vZGVsIDwlPW1vZGVsSW5mbyU+Ci0gICAgPCV9IGVsc2UgeyU+Ci0JICogICAgICAgIDwlPW1vZGVsSW5mbyU+Ci0gICAgPCV9fSBpZiAoZmlyc3QpIHslPgotCSAqIEBtb2RlbAotICAgIDwlfX0lPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JewotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICA8JWlmIChnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotCQlyZXR1cm4gPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KDwlfSU+KDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZSgpJT4pZUdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIHRydWUpPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KS48JT1nZW5GZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCk8JX0lPjsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9PSBudWxsKQotCQl7Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQllVmlydHVhbFNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXcgPCU9Z2VuQ2xhc3MuZ2V0TGlzdENvbnN0cnVjdG9yKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3IDwlPWdlbkNsYXNzLmdldExpc3RDb25zdHJ1Y3RvcihnZW5GZWF0dXJlKSU+OwotICAgICAgICA8JX0lPgotCQl9Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjwlPWdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSA/ICIubWFwKCkiIDogIiIlPjsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHslPgotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVDb250YWluZXIoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlaWYgKCFnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKSB7JT4sIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVDwlfSU+KTsKLSAgICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lQXNFT2JqZWN0KCklPi5lSXNQcm94eSgpKQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLQkJCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXROb25FT2JqZWN0SW50ZXJuYWxUeXBlQ2FzdCgpJT5lUmVzb2x2ZVByb3h5KG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotCQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pCi0JCQl7Ci0gICAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZUNvbnRhaW5zKCkpIHslPgotCQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG51bGwsIG51bGwpOwotICAgICAgICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7JT4KLQkJCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBudWxsKTsKLSAgICAgICAgICA8JX0lPgotCQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpCi0JCQkJewotICAgICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCQkJbXNncyA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBudWxsLCBtc2dzKTsKLSAgICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyU+Ci0JCQkJCW1zZ3MgPSAgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW52ZXJzZUFkZCh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICAgICAgICAgIDwlfSU+Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQllVmlydHVhbFNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uUkVTT0xWRSwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLQkJCX0KLQkJfQotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkgJiYgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JWlmICghZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSkgeyU+LCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ8JX0lPik7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2Ugey8vdm9sYXRpbGUlPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gYmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uZUlzUHJveHkoKSA/IDwlPWdlbkZlYXR1cmUuZ2V0Tm9uRU9iamVjdEludGVybmFsVHlwZUNhc3QoKSU+ZVJlc29sdmVQcm94eSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikgOiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRFZmZlY3RpdmVGZWF0dXJlTWFwV3JhcHBlckNsYXNzKCklPigoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkubGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pKTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+KSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5saXN0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkubGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+KWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmxpc3QoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4oPCV9JT4oPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPikoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgdHJ1ZSk8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pLjwlPWdlbkZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKTwlfSU+OwotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KDwlfSU+KDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZSgpJT4pZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKS5nZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCB0cnVlKTwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPikuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpPCV9JT47Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCS8vIFRoZSBsaXN0IGlzIGV4cGVjdGVkIHRvIGltcGxlbWVudCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IGFuZCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcKLQkJLy8gc28gaXQncyBsaWtlbHkgdGhhdCBhbiBhcHByb3ByaWF0ZSBzdWJjbGFzcyBvZiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC48JWlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT5FY29yZUVNYXA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPkJhc2ljRmVhdHVyZU1hcDwlfSBlbHNlIHslPkVjb3JlRUxpc3Q8JX0lPiBzaG91bGQgYmUgdXNlZC4KLSAgICAgICAgPCV9JT4KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2dldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5GZWF0dXJlLmlzQmFzaWNHZXQoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLQl7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pIHJldHVybiBudWxsOwotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillSW50ZXJuYWxDb250YWluZXIoKTsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPikoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgZmFsc2UpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgZmFsc2UpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5GZWF0dXJlLmlzQmFzaWNTZXQoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZEludGVybmFsVHlwZSgpJT4gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbXNncyk7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucG9zdC5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCQlyZXR1cm4gbXNnczsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCU9iamVjdCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gdHJ1ZTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4gbm90aWZpY2F0aW9uID0gbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlID8gbnVsbCA6IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT4hb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPik7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4gbm90aWZpY2F0aW9uID0gbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUUgPyBudWxsIDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0gICAgICAgIDwlfSU+Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLSAgICAgIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucG9zdC5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCQlyZXR1cm4gbXNnczsKLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkpLmJhc2ljQWRkKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbClnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5iYXNpY0FkZCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG1zZ3MpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlIGNvbnRhaW5lZCAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gLT4gdGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBpbnZva2VkIHRvIGtlZXAgdGhlIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcCBpbiBzeW5jaAotCQkvLyAtPiBkbyBub3QgbW9kaWZ5IG90aGVyIGZlYXR1cmVzCi0JCS8vIC0+IHJldHVybiBtc2dzLCBhZnRlciBhZGRpbmcgYW55IGdlbmVyYXRlZCBOb3RpZmljYXRpb24gdG8gaXQgKGlmIGl0IGlzIG51bGwsIGEgTm90aWZpY2F0aW9uQ2hhaW4gb2JqZWN0IG11c3QgYmUgY3JlYXRlZCBmaXJzdCkKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc1NldCgpICYmIChpc0ltcGxlbWVudGF0aW9uIHx8ICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFNldFZpc2liaWxpdHkoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHsgJT4KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFbnVtVHlwZSgpKSB7JT4KLQkgKiBAc2VlIDwlPWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKS5nZXRRdWFsaWZpZWROYW1lKCklPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICN1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7ICU+Ci0Jdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IHZhbHVlKTsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIHZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KQotCXsKLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCVpZiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLQkJZVNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPm5ldyA8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoKSU+KDwlfSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPik8JX0lPik7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7JT4KLQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4gJiYgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKSkKLQkJewotCQkJaWYgKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsIiklPi5pc0FuY2VzdG9yKHRoaXMsIDwlPWdlbkZlYXR1cmUuZ2V0RU9iamVjdENhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikpCi0JCQkJdGhyb3cgbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpJT4oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikuZUludmVyc2VBZGQodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEludGVybmFsVHlwZUNhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLSAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pKTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpIHx8IGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gbnVsbDsKLQkJCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKQotICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG51bGwsIG1zZ3MpOwotICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyU+Ci0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KS5lSW52ZXJzZUFkZCh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICAgICAgICA8JX0lPgotCQkJbXNncyA9IGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW50ZXJuYWxUeXBlQ2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJZWxzZQotICAgIAl7Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSBlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgIW9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAJfQotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSAoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwOwotICAgICAgICAgIDwlfSU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOyBlbHNlIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpIHx8IGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUIDogbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVCA6IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldEludGVybmFsVHlwZUNhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlPYmplY3Qgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IGVWaXJ0dWFsU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgICAgPCV9JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2UgPyA8JWlmIChnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKSB7JT5udWxsPCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUPCV9JT4gOiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjwlfSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+IW9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0PCV9JT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRSA/IDwlaWYgKGdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPm51bGw8JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ8JX0lPiA6IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+PCV9JT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUucG9zdC5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5zZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5uZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPig8JX0lPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pPCV9JT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbClnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5zZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5uZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPig8JX0lPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pPCV9JT4pOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL3NldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNCYXNpY1Vuc2V0KCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gYmFzaWNVbnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLSAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFVuc2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG51bGw7Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gZmFsc2U7Ci0gICAgICA8JX0lPgotICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPiBub3RpZmljYXRpb24gPSBuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlVOU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZSA/IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gOiBudWxsPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBudWxsLCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0gICAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byB1bnNldCB0aGUgY29udGFpbmVkICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiB0aGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8ga2VlcCB0aGUgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwIGluIHN5bmNoCi0JCS8vIC0+IGRvIG5vdCBtb2RpZnkgb3RoZXIgZmVhdHVyZXMKLQkJLy8gLT4gcmV0dXJuIG1zZ3MsIGFmdGVyIGFkZGluZyBhbnkgZ2VuZXJhdGVkIE5vdGlmaWNhdGlvbiB0byBpdCAoaWYgaXQgaXMgbnVsbCwgYSBOb3RpZmljYXRpb25DaGFpbiBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIGZpcnN0KQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy5iYXNpY1Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gIDwlfSU+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotICA8JWlmICghZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KQotICA8JX0lPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQl2b2lkIHVuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyB2b2lkIHVuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLQl7Ci0gICAgPCVpZiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLQkJZVVuc2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCkgKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+LlVuc2V0dGFibGUpPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLnVuc2V0KCk7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSB8fCBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlQ29udGFpbnMoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCkKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncyA9IG51bGw7Ci0gICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbnVsbCwgbXNncyk7Ci0gICAgICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7JT4KLQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgICAgIDwlfSU+Ci0JCQltc2dzID0gYmFzaWNVbnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlCi0gICAgCXsKLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSBlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICAgIDwlfSU+Ci0JCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgPCV9JT4KLQkJCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSBmYWxzZTsKLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlVOU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbnVsbCwgbnVsbCwgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQpKTsKLSAgICAgICAgPCV9JT4KLSAgICAJfQotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMDsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFVuc2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbnVsbDsKLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlID8gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA6IG51bGw8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG51bGwsIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVCkgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsgZWxzZSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSB8fCBnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpIHx8IGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5VTlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2UgPyBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+IDogPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQsIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkpLmNsZWFyKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmNsZWFyKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHVuc2V0IHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL3Vuc2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGVuZCAlPjwlLy9DbGFzcy91bnNldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNJc1NldCgpICYmIChpc0ltcGxlbWVudGF0aW9uIHx8ICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSgpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pc1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaXMgc2V0LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICA8JX0lPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLSAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pCi0gICAgPCV9JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JYm9vbGVhbiBpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgYm9vbGVhbiBpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0JewotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCXJldHVybiBlSXNTZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPik7Ci0gICAgICAgIDwlfSU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPi5VbnNldHRhYmxlKTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5pc1NldCgpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJldHVybiBlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiAhKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKSkuaXNFbXB0eSg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiAhKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmlzRW1wdHkoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pc1NldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHdoZXRoZXIgdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBpcyBzZXQKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2lzU2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9pc1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5GZWF0dXJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2dlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0vL2ZvciU+Ci08JX19LnJ1bigpOyU+Ci08JWZvciAoSXRlcmF0b3IgaT0gKGlzSW1wbGVtZW50YXRpb24gPyBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbk9wZXJhdGlvbnMoKSA6IGdlbkNsYXNzLmdldERlY2xhcmVkR2VuT3BlcmF0aW9ucygpKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuT3BlcmF0aW9uIGdlbk9wZXJhdGlvbiA9IChHZW5PcGVyYXRpb24paS5uZXh0KCk7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gIDwlaWYgKGdlbk9wZXJhdGlvbi5oYXNEb2N1bWVudGF0aW9uKCkpIHslPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIDwlPWdlbk9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gIDwlfSU+Ci0gIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTW9kZWxUYWdzKCkpIHsgYm9vbGVhbiBmaXJzdCA9IHRydWU7IGZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2VuT3BlcmF0aW9uLmdldE1vZGVsSW5mbygpLCAiXG5cciIpOyBzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpOyApIHsgU3RyaW5nIG1vZGVsSW5mbyA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsgaWYgKGZpcnN0KSB7IGZpcnN0ID0gZmFsc2U7JT4KLQkgKiBAbW9kZWwgPCU9bW9kZWxJbmZvJT4KLSAgPCV9IGVsc2UgeyU+Ci0JICogICAgICAgIDwlPW1vZGVsSW5mbyU+Ci0gIDwlfX0gaWYgKGZpcnN0KSB7JT4KLQkgKiBAbW9kZWwKLSAgPCV9fSU+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JX0lPgotPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCTwlPWdlbk9wZXJhdGlvbi5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbk9wZXJhdGlvbi5nZXROYW1lKCklPig8JT1nZW5PcGVyYXRpb24uZ2V0UGFyYW1ldGVycygpJT4pPCU9Z2VuT3BlcmF0aW9uLmdldFRocm93cygpJT47Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyA8JT1nZW5PcGVyYXRpb24uZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5PcGVyYXRpb24uZ2V0TmFtZSgpJT4oPCU9Z2VuT3BlcmF0aW9uLmdldFBhcmFtZXRlcnMoKSU+KTwlPWdlbk9wZXJhdGlvbi5nZXRUaHJvd3MoKSU+Ci0JewotICA8JWlmIChnZW5PcGVyYXRpb24uaGFzQm9keSgpKSB7JT4KLQkJPCU9Z2VuT3BlcmF0aW9uLmdldEJvZHkoZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICA8JX0gZWxzZSBpZiAoZ2VuT3BlcmF0aW9uLmlzSW52YXJpYW50KCkpIHtHZW5DbGFzcyBvcENsYXNzID0gZ2VuT3BlcmF0aW9uLmdldEdlbkNsYXNzKCk7IFN0cmluZyBkaWFnbm9zdGljcyA9ICgoR2VuUGFyYW1ldGVyKWdlbk9wZXJhdGlvbi5nZXRHZW5QYXJhbWV0ZXJzKCkuZ2V0KDApKS5nZXROYW1lKCk7IFN0cmluZyBjb250ZXh0ID0gKChHZW5QYXJhbWV0ZXIpZ2VuT3BlcmF0aW9uLmdldEdlblBhcmFtZXRlcnMoKS5nZXQoMSkpLmdldE5hbWUoKTslPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJLy8gLT4gc3BlY2lmeSB0aGUgY29uZGl0aW9uIHRoYXQgdmlvbGF0ZXMgdGhlIGludmFyaWFudAotCQkvLyAtPiB2ZXJpZnkgdGhlIGRldGFpbHMgb2YgdGhlIGRpYWdub3N0aWMsIGluY2x1ZGluZyBzZXZlcml0eSBhbmQgbWVzc2FnZQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQlpZiAoZmFsc2UpCi0JCXsKLQkJCWlmICg8JT1kaWFnbm9zdGljcyU+ICE9IG51bGwpCi0JCQl7Ci0JCQkJPCU9ZGlhZ25vc3RpY3MlPi5hZGQKLQkJCQkJKG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWMiKSU+Ci0JCQkJCQkoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYyIpJT4uRVJST1IsCi0JCQkJCQkgPCU9b3BDbGFzcy5nZXRHZW5QYWNrYWdlKCkuZ2V0SW1wb3J0ZWRWYWxpZGF0b3JDbGFzc05hbWUoKSU+LkRJQUdOT1NUSUNfU09VUkNFLAotCQkJCQkJIDwlPW9wQ2xhc3MuZ2V0R2VuUGFja2FnZSgpLmdldEltcG9ydGVkVmFsaWRhdG9yQ2xhc3NOYW1lKCklPi48JT1vcENsYXNzLmdldE9wZXJhdGlvbklEKGdlbk9wZXJhdGlvbiklPiwKLQkJCQkJCSA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW4iKSU+LklOU1RBTkNFLmdldFN0cmluZygiX1VJX0dlbmVyaWNJbnZhcmlhbnRfZGlhZ25vc3RpYyIsIG5ldyBPYmplY3RbXSB7ICI8JT1nZW5PcGVyYXRpb24uZ2V0TmFtZSgpJT4iLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RWYWxpZGF0b3IiKSU+LmdldE9iamVjdExhYmVsKHRoaXMsIDwlPWNvbnRleHQlPikgfSksPCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPjwlPWdlbk1vZGVsLmdldE5vbk5MUygyKSU+Ci0JCQkJCQkgbmV3IE9iamVjdCBbXSB7IHRoaXMgfSkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2ltcGxlbWVudGVkR2VuT3BlcmF0aW9uLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9pbXBsZW1lbnRlZEdlbk9wZXJhdGlvbi50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9pbXBsZW1lbnRlZEdlbk9wZXJhdGlvbi5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfS8vZm9yJT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVJbnZlcnNlQWRkR2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBlSW52ZXJzZUFkZCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLTwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldEVJbnZlcnNlQWRkR2VuRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpaS5uZXh0KCk7JT4KLSAgPCVpZiAoIWdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkgfHwgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmNvbnRhaW5zKGdlbkZlYXR1cmUpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+KSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpJT4uSW50ZXJuYWxNYXBWaWV3KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmVNYXAoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHslPgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNCYXNpY1NldCgpKSB7JT4KLQkJCQlyZXR1cm4gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPilvdGhlckVuZCwgbXNncyk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbXNncyk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgIDwlfSU+Ci0JCQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwpCi0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlQ29udGFpbnMoKSkgeyU+Ci0JCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbnVsbCwgbXNncyk7Ci0gICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyU+Ci0JCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgICA8JX0lPgotCQkJCXJldHVybiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KW90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFSW52ZXJzZVJlbW92ZUdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gZUludmVyc2VSZW1vdmUoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci08JWZvciAoSXRlcmF0b3IgaT1nZW5DbGFzcy5nZXRFSW52ZXJzZVJlbW92ZUdlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWkubmV4dCgpOyU+Ci0gIDwlaWYgKCFnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpIHx8IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5jb250YWlucyhnZW5GZWF0dXJlKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPikoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldyk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSAmJiAhZ2VuRmVhdHVyZS5pc0Jhc2ljU2V0KCkpIHslPgotCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG1zZ3MpOwotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJCQlyZXR1cm4gYmFzaWNVbnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihtc2dzKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4obnVsbCwgbXNncyk7Ci0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkKLQkJewotPCVmb3IgKEl0ZXJhdG9yIGk9Z2VuQ2xhc3MuZ2V0RUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckdlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWkubmV4dCgpOyU+Ci0gIDwlR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7JT4KLSAgPCVpZiAoIWdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkgfHwgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmNvbnRhaW5zKGdlbkZlYXR1cmUpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmICFnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLTwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldEFsbEdlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWkubmV4dCgpOyU+Ci0gIDwlaWYgKCFnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpIHx8IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5jb250YWlucyhnZW5GZWF0dXJlKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0Jvb2xlYW5UeXBlKCkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBuZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPig8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQkJCXJldHVybiBiYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVTdXBwcmVzc0VNRlR5cGVzKCkpIHslPgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpJT4uSW50ZXJuYWxNYXBWaWV3KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmVNYXAoKTsKLQkJCQllbHNlIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQkJCQllbHNlIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLm1hcCgpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCk7Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQkJCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZ2V0V3JhcHBlcigpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFU2V0R2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLTwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldEVTZXRHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotICA8JWlmICghZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSB8fCBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuY29udGFpbnMoZ2VuRmVhdHVyZSkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5zZXQobmV3VmFsdWUpOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSIpJT4uU2V0dGluZykoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldyk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIiklPi5TZXR0aW5nKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmNsZWFyKCk7Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5hZGRBbGwoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSU+KW5ld1ZhbHVlKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQkJCXNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoKDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZSgpJT4pbmV3VmFsdWUpLjwlPWdlbkZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKSk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pbmV3VmFsdWUpOwotICAgIDwlfSU+Ci0JCQkJcmV0dXJuOwotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci08JX0gZWxzZSB7JT4KLQkJZUR5bmFtaWNTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci08JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLTwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldEVTZXRHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotICA8JWlmICghZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSB8fCBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuY29udGFpbnMoZ2VuRmVhdHVyZSkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKS5jbGVhcigpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5jbGVhcigpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCQkJdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSkgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pbnVsbCk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVCk7Ci0gICAgPCV9JT4KLQkJCQlyZXR1cm47Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci08JX0gZWxzZSB7JT4KLQkJZUR5bmFtaWNVbnNldChmZWF0dXJlSUQpOwotPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgIWdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZUlzU2V0Lm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotPCVmb3IgKEl0ZXJhdG9yIGk9Z2VuQ2xhc3MuZ2V0QWxsR2VuRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpaS5uZXh0KCk7JT4KLSAgPCVpZiAoIWdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkgfHwgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmNvbnRhaW5zKGdlbkZlYXR1cmUpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotCQkJCXJldHVybiAhKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpLmlzRW1wdHkoKTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgITwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LmZlYXR1cmVNYXAoKS5pc0VtcHR5KCk7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgITwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LmlzRW1wdHkoKTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAhPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uaXNFbXB0eSgpOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiAhPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5pc0VtcHR5KCk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJCXJldHVybiBpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbDsKLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCXJldHVybiBlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPikgIT0gbnVsbDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkgIT0gbnVsbDsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGw7Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQlyZXR1cm4gZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pICE9IG51bGw7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpICE9IG51bGw7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpIHx8IGdlbkZlYXR1cmUuaXNFbnVtVHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiAoKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMCkgIT0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUOwotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFbnVtVHlwZSgpICYmIGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJcmV0dXJuIGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQpICE9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgIT0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUOwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7Ly9kYXRhdHlwZSU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsIDogITwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVC5lcXVhbHMoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUKTsKLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsIDogITwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVC5lcXVhbHMoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpICE9IG51bGwgOiAhPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxULmVxdWFscyg8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZmVhdHVyZUlEKTsKLTwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzL2VJc1NldC5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5DbGFzcy5nZXRNaXhpbkdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzKQotCXsKLSAgPCVmb3IgKEl0ZXJhdG9yIG09Z2VuQ2xhc3MuZ2V0TWl4aW5HZW5DbGFzc2VzKCkuaXRlcmF0b3IoKTsgbS5oYXNOZXh0KCk7KSB7IEdlbkNsYXNzIG1peGluR2VuQ2xhc3MgPSAoR2VuQ2xhc3MpbS5uZXh0KCk7ICU+Ci0JCWlmIChiYXNlQ2xhc3MgPT0gPCU9bWl4aW5HZW5DbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0gICAgPCVmb3IgKEl0ZXJhdG9yIGY9bWl4aW5HZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGYuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlmLm5leHQoKTsgJT4KLQkJCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OiByZXR1cm4gPCU9bWl4aW5HZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjsKLSAgICA8JX0lPgotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotICA8JX0lPgotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcykKLQl7Ci0gIDwlZm9yIChJdGVyYXRvciBtPWdlbkNsYXNzLmdldE1peGluR2VuQ2xhc3NlcygpLml0ZXJhdG9yKCk7IG0uaGFzTmV4dCgpOykgeyBHZW5DbGFzcyBtaXhpbkdlbkNsYXNzID0gKEdlbkNsYXNzKW0ubmV4dCgpOyAlPgotCQlpZiAoYmFzZUNsYXNzID09IDwlPW1peGluR2VuQ2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotICAgIDwlZm9yIChJdGVyYXRvciBmPW1peGluR2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBmLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpZi5uZXh0KCk7ICU+Ci0JCQkJY2FzZSA8JT1taXhpbkdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OiByZXR1cm4gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT47Ci0gICAgPCV9JT4KLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLSAgPCV9JT4KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7IFN0cmluZyBlVmlydHVhbFZhbHVlc0ZpZWxkID0gZ2VuQ2xhc3MuZ2V0RVZpcnR1YWxWYWx1ZXNGaWVsZCgpOyU+Ci0gIDwlaWYgKGVWaXJ0dWFsVmFsdWVzRmllbGQgIT0gbnVsbCkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGVWaXJ0dWFsVmFsdWVzKCkKLQl7Ci0JCXJldHVybiA8JT1lVmlydHVhbFZhbHVlc0ZpZWxkJT47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZVNldFZpcnR1YWxWYWx1ZXMoT2JqZWN0W10gbmV3VmFsdWVzKQotCXsKLQkJPCU9ZVZpcnR1YWxWYWx1ZXNGaWVsZCU+ID0gbmV3VmFsdWVzOwotCX0KLQotICA8JX0lPgotICA8JXsgTGlzdCBlVmlydHVhbEluZGV4Qml0RmllbGRzID0gZ2VuQ2xhc3MuZ2V0RVZpcnR1YWxJbmRleEJpdEZpZWxkcyhuZXcgQXJyYXlMaXN0KCkpOyU+Ci0gICAgPCVpZiAoIWVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuaXNFbXB0eSgpKSB7IExpc3QgYWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcyA9IGdlbkNsYXNzLmdldEFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMobmV3IEFycmF5TGlzdCgpKTslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgZVZpcnR1YWxJbmRleEJpdHMoaW50IG9mZnNldCkKLQl7Ci0JCXN3aXRjaCAob2Zmc2V0KQotCQl7Ci0gICAgICA8JWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5zaXplKCk7IGkrKykgeyU+Ci0JCQljYXNlIDwlPWklPiA6Ci0JCQkJcmV0dXJuIDwlPWFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuZ2V0KGkpJT47Ci0gICAgICA8JX0lPgotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVTZXRWaXJ0dWFsSW5kZXhCaXRzKGludCBvZmZzZXQsIGludCBuZXdJbmRleEJpdHMpCi0JewotCQlzd2l0Y2ggKG9mZnNldCkKLQkJewotICAgICAgPCVmb3IgKGludCBpID0gMDsgaSA8IGFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuc2l6ZSgpOyBpKyspIHslPgotCQkJY2FzZSA8JT1pJT4gOgotCQkJCTwlPWFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuZ2V0KGkpJT4gPSBuZXdJbmRleEJpdHM7Ci0JCQkJYnJlYWs7Ci0gICAgICA8JX0lPgotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmICFnZW5DbGFzcy5nZXRUb1N0cmluZ0dlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgPCV7IGJvb2xlYW4gZmlyc3QgPSB0cnVlOyU+Ci0gICAgPCVmb3IgKEl0ZXJhdG9yIGk9Z2VuQ2xhc3MuZ2V0VG9TdHJpbmdHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpaS5uZXh0KCk7JT4KLSAgICAgIDwlaWYgKGZpcnN0KSB7IGZpcnN0ID0gZmFsc2U7JT4KLQkJcmVzdWx0LmFwcGVuZCgiICg8JT1nZW5GZWF0dXJlLmdldE5hbWUoKSU+OiAiKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmVzdWx0LmFwcGVuZCgiLCA8JT1nZW5GZWF0dXJlLmdldE5hbWUoKSU+OiAiKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlpZiAoZVZpcnR1YWxJc1NldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPikpIHJlc3VsdC5hcHBlbmQoZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlpZiAoPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+KDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA8JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0PCV9JT4pIHJlc3VsdC5hcHBlbmQoKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJaWYgKDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPig8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwPCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDwlfSU+KSByZXN1bHQuYXBwZW5kKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmVzdWx0LmFwcGVuZChlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlaWYgKCFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSl7JT4sIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVDwlfSU+KSk7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCXJlc3VsdC5hcHBlbmQoKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMCk7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJlc3VsdC5hcHBlbmQoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuQ2xhc3MuaXNNYXBFbnRyeSgpKSB7IEdlbkZlYXR1cmUga2V5RmVhdHVyZSA9IGdlbkNsYXNzLmdldE1hcEVudHJ5S2V5RmVhdHVyZSgpOyBHZW5GZWF0dXJlIHZhbHVlRmVhdHVyZSA9IGdlbkNsYXNzLmdldE1hcEVudHJ5VmFsdWVGZWF0dXJlKCk7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGhhc2ggPSAtMTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SGFzaCgpCi0JewotCQlpZiAoaGFzaCA9PSAtMSkKLQkJewotCQkJT2JqZWN0IHRoZUtleSA9IGdldEtleSgpOwotCQkJaGFzaCA9ICh0aGVLZXkgPT0gbnVsbCA/IDAgOiB0aGVLZXkuaGFzaENvZGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGhhc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFzaChpbnQgaGFzaCkKLQl7Ci0JCXRoaXMuaGFzaCA9IGhhc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRLZXkoKQotCXsKLSAgPCVpZiAoa2V5RmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJldHVybiBuZXcgPCU9a2V5RmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPihnZXRUeXBlZEtleSgpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBnZXRUeXBlZEtleSgpOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtleShPYmplY3Qga2V5KQotCXsKLSAgPCVpZiAoa2V5RmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQlnZXRUeXBlZEtleSgpLmFkZEFsbCgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpJT4pa2V5KTsKLSAgPCV9IGVsc2UgaWYgKGtleUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlzZXRUeXBlZEtleSgoKDwlPWtleUZlYXR1cmUuZ2V0T2JqZWN0VHlwZSgpJT4pa2V5KS48JT1rZXlGZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCkpOwotICA8JX0gZWxzZSB7JT4KLQkJc2V0VHlwZWRLZXkoKDwlPWtleUZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPilrZXkpOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKQotCXsKLSAgPCVpZiAodmFsdWVGZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmV0dXJuIG5ldyA8JT12YWx1ZUZlYXR1cmUuZ2V0T2JqZWN0VHlwZSgpJT4oZ2V0VHlwZWRWYWx1ZSgpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBnZXRUeXBlZFZhbHVlKCk7Ci0gIDwlfSU+Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpCi0JewotCQlPYmplY3Qgb2xkVmFsdWUgPSBnZXRWYWx1ZSgpOwotICA8JWlmICh2YWx1ZUZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJZ2V0VHlwZWRWYWx1ZSgpLmNsZWFyKCk7Ci0JCWdldFR5cGVkVmFsdWUoKS5hZGRBbGwoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSU+KXZhbHVlKTsKLSAgPCV9IGVsc2UgaWYgKHZhbHVlRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXNldFR5cGVkVmFsdWUoKCg8JT12YWx1ZUZlYXR1cmUuZ2V0T2JqZWN0VHlwZSgpJT4pdmFsdWUpLjwlPXZhbHVlRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXNldFR5cGVkVmFsdWUoKDwlPXZhbHVlRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KXZhbHVlKTsKLSAgPCV9JT4KLQkJcmV0dXJuIG9sZFZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIiklPiBnZXRFTWFwKCkKLQl7Ci0JCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiKSU+IGNvbnRhaW5lciA9IGVDb250YWluZXIoKTsKLQkJcmV0dXJuIGNvbnRhaW5lciA9PSBudWxsID8gbnVsbCA6ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIiklPiljb250YWluZXIuZUdldChlQ29udGFpbm1lbnRGZWF0dXJlKCkpOwotCX0KLQotPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2luc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci19IC8vPCU9aXNJbnRlcmZhY2UgPyAiICIgKyBnZW5DbGFzcy5nZXRJbnRlcmZhY2VOYW1lKCkgOiBnZW5DbGFzcy5nZXRDbGFzc05hbWUoKSU+Ci08JS8vIFRPRE8gZml4IHRoZSBzcGFjZSBhYm92ZSU+Ci08JWdlbk1vZGVsLmVtaXRTb3J0ZWRJbXBvcnRzKCk7JT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTI1OWVmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OWI2MzdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1DbGFzc1BhdGg6IHVtYWVkaXQuamFyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYTt2aXNpYmlsaXR5Oj1yZWV4cG9ydAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLAotIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbiRJbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyODJlMGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLnVtYWVkaXQuamFyID0gc3JjLwotb3V0cHV0LnVtYWVkaXQuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gdW1hZWRpdC5qYXIsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19BcnRpZmFjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQXJ0aWZhY3RfY29udGFpbmVkQXJ0aWZhY3RzX0FydGlmYWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTAxZDIxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQXJ0aWZhY3RfY29udGFpbmVkQXJ0aWZhY3RzX0FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVCcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9QbGFubmluZ0RhdGEuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUJyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX1BsYW5uaW5nRGF0YS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwMjllMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUJyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX1BsYW5uaW5nRGF0YS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX1NlY3Rpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19TZWN0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTIwNmMyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX1NlY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19TdGVwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfU3RlcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI3OGNkOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19TdGVwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTAxZDIxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMDZiMGZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQ29udGVudERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2ZTg4OTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Sb2xlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YzNiMmI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fVGFza0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTQwZjNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1YmQ0NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmVDYXRlZ29yeS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZUNhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU1M2MxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZUNhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmVHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1NTNjMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmVHcm91cGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRG9tYWluLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Eb21haW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjI4OTI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Eb21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0Q2F0ZWdvcnkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXRDYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0YTNmNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXRDYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldEdyb3VwaW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0R3JvdXBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NGEzZjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0R3JvdXBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1Rvb2wuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1Rvb2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZjFiODVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Ub29sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDM5ZTlmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfVXNlckRlZmluZWRDYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfV29ya1Byb2R1Y3RUeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Xb3JrUHJvZHVjdFR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhN2VjYWMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Xb3JrUHJvZHVjdFR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19BY3Rpdml0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQXJ0aWZhY3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19BcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19BcnRpZmFjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0F0dGFjaG1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19BdHRhY2htZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTc1Njg1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0F0dGFjaG1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DYXBhYmlsaXR5UGF0dGVybi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTVmZmJiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ2hlY2tsaXN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ2hlY2tsaXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGE2NWYyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NoZWNrbGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NvbmNlcHQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Db25jZXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWRmODRkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NvbmNlcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DdXN0b21DYXRlZ29yeS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0N1c3RvbUNhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGY0Nzk4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0N1c3RvbUNhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGVsaXZlcmFibGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EZWxpdmVyYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EZWxpdmVyYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EZWxpdmVyeVByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EaXNjaXBsaW5lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGlzY2lwbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1YmQ0NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EaXNjaXBsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGlzY2lwbGluZUdyb3VwaW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGlzY2lwbGluZUdyb3VwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU1M2MxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0Rpc2NpcGxpbmVHcm91cGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RvbWFpbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Eb21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzI1NTRjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFiMzRjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdNZXRyaWMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nTWV0cmljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzMxZjgzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdNZXRyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nTW9kZWwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NThkYWZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ01vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGZjODRlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0V4YW1wbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19FeGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWI5NDRmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19HdWlkZWxpbmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19HdWlkZWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfR3VpZGVsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfSXRlcmF0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfSXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDMxMWU0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0l0ZXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX091dGNvbWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19PdXRjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTcwMzUxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX091dGNvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19QaGFzZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQ2MGJkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1BoYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUHJhY3RpY2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19QcmFjdGljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19QcmFjdGljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmIwOTVkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzc2MzI1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUmVwb3J0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUmVwb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTVmM2UwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JlcG9ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JldXNhYmxlQXNzZXQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19SZXVzYWJsZUFzc2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjUyY2ZmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JldXNhYmxlQXNzZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2FkbWFwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9hZG1hcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxMWJjNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2FkbWFwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGVTZXQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2xlU2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGVTZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2xlU2V0R3JvdXBpbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2xlU2V0R3JvdXBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NGEzZjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZVNldEdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfU3RlcC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1N0ZXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZTQ3NjI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfU3RlcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1N1cHBvcnRpbmdNYXRlcmlhbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1N1cHBvcnRpbmdNYXRlcmlhbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA1YTIxZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19TdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UYXNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGFzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjM2IyYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UYXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVjaG5pcXVlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVjaG5pcXVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWVkYzViOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RlY2huaXF1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RlbXBsYXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNzYzMjUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZXJtRGVmaW5pdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rlcm1EZWZpbml0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTIxYmZlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rlcm1EZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVG9vbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rvb2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZjFiODVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVG9vbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rvb2xNZW50b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Ub29sTWVudG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGYxYjg1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rvb2xNZW50b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UcmFpbmluZ0NsYXNzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVHJhaW5pbmdDbGFzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAxMzI5NTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UcmFpbmluZ0NsYXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVHJhaW5pbmdNb2R1bGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UcmFpbmluZ01vZHVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0ZjcxNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UcmFpbmluZ01vZHVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGY0Nzk4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19XaGl0ZXBhcGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV2hpdGVwYXBlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1YjQ4MDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19XaGl0ZXBhcGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV29ya1Byb2R1Y3RHdWlkZWxpbmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Xb3JrUHJvZHVjdEd1aWRlbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Xb3JrUHJvZHVjdEd1aWRlbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0VHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0VHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3ZWNhYzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Xb3JrUHJvZHVjdFR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX0N1c3RvbUNhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkMThlYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMDZiMGZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZXNjcmlwdG9yRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OWVkMmM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1Byb2Nlc3NEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Qcm9jZXNzRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1Byb2Nlc3NEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Sb2xlRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Sb2xlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fVGFza0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjM2IyYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fVGFza0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1NDBmM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfUHJvcGVydHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1FbGVtZW50X3Byb3BlcnR5X1Byb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTMyYTdiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfUHJvcGVydHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1MaW5rX3ZpZXdwb3J0X1BvaW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtTGlua192aWV3cG9ydF9Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlNzM0YzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1MaW5rX3ZpZXdwb3J0X1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX25hbWVzcGFjZV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NDVlOWY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX25hbWVzcGFjZV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDgyZjIyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODlmM2FmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX25hbWVzcGFjZV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX3ZpZXdwb2ludF9Qb2ludC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV92aWV3cG9pbnRfUG9pbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZGQ1OGUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX3ZpZXdwb2ludF9Qb2ludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlzY2lwbGluZV9zdWJkaXNjaXBsaW5lX0Rpc2NpcGxpbmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9EaXNjaXBsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI5YjMxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlzY2lwbGluZV9zdWJkaXNjaXBsaW5lX0Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURvbWFpbl9zdWJkb21haW5fRG9tYWluLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEb21haW5fc3ViZG9tYWluX0RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURvbWFpbl9zdWJkb21haW5fRG9tYWluLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEb21haW5fc3ViZG9tYWluc19Eb21haW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURvbWFpbl9zdWJkb21haW5zX0RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURvbWFpbl9zdWJkb21haW5zX0RvbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWxsaXBzZV9jZW50ZXJfUG9pbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVsbGlwc2VfY2VudGVyX1BvaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2E0ZTlhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWxsaXBzZV9jZW50ZXJfUG9pbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25Db25kZXJhdGlvbnNfRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uQ29uZGVyYXRpb25zX0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5NTE2ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25Db25kZXJhdGlvbnNfRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uQ29uZGVyYXRpb25zX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbkNvbmRlcmF0aW9uc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZmM4NGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uQ29uZGVyYXRpb25zX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbk1ldHJpY19Fc3RpbWF0aW5nTWV0cmljLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uTWV0cmljX0VzdGltYXRpbmdNZXRyaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYWQzMGJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uTWV0cmljX0VzdGltYXRpbmdNZXRyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX3VzZWRFc3RpbWF0aW5nUGFyYW1ldGVyX1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX3VzZWRFc3RpbWF0aW5nUGFyYW1ldGVyX1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTFkMGIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV91c2VkRXN0aW1hdGluZ1BhcmFtZXRlcl9TdW1taXRFc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZWRNZXRob2RFbGVtZW50X2VzdGltYXRlX0VzdGltYXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZWRNZXRob2RFbGVtZW50X2VzdGltYXRlX0VzdGltYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjg0NGJmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVkTWV0aG9kRWxlbWVudF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGluZ01vZGVsX293bmVkRXN0aW1hdGluZ1BhcmFtZXRlcl9TdW1taXRFc3RpbWF0aW5nUGFyYW1ldGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0aW5nTW9kZWxfb3duZWRFc3RpbWF0aW5nUGFyYW1ldGVyX1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZTNiOTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0aW5nTW9kZWxfb3duZWRFc3RpbWF0aW5nUGFyYW1ldGVyX1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRpbmdQYXJhbWV0ZXJPd25lcl9vd25lZEVzdGltYXRpbmdQYXJhbWV0ZXJfRXN0aW1hdGluZ1BhcmFtZXRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGluZ1BhcmFtZXRlck93bmVyX293bmVkRXN0aW1hdGluZ1BhcmFtZXRlcl9Fc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDA3MjIwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGluZ1BhcmFtZXRlck93bmVyX293bmVkRXN0aW1hdGluZ1BhcmFtZXRlcl9Fc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaENvbm5lY3Rvcl9wb3NpdGlvbl9Qb2ludC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhDb25uZWN0b3JfcG9zaXRpb25fUG9pbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYzczNjJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaENvbm5lY3Rvcl9wb3NpdGlvbl9Qb2ludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFZGdlX3dheXBvaW50c19Qb2ludC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFZGdlX3dheXBvaW50c19Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxNTRlNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWRnZV93YXlwb2ludHNfUG9pbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9hbmNob3JhZ2VfR3JhcGhDb25uZWN0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9hbmNob3JhZ2VfR3JhcGhDb25uZWN0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMzAzNzYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfYW5jaG9yYWdlX0dyYXBoQ29ubmVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWZlNDBjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9EaWFncmFtLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0RpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOWNkODc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0RpYWdyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRGlhZ3JhbUxpbmsuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRGlhZ3JhbUxpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZjdlZTUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0RpYWdyYW1MaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0VsbGlwc2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRWxsaXBzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlNmU2MjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRWxsaXBzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaENvbm5lY3Rvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaENvbm5lY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzMDM3NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfR3JhcGhDb25uZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfR3JhcGhFZGdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoRWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM4OTE4ODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfR3JhcGhFZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoTm9kZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMDY1MjAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9JbWFnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9JbWFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0Zjk5ZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfSW1hZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUG9seWxpbmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUG9seWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOGYxNWM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1BvbHlsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1Byb3BlcnR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1Byb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTMyYTdiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9Qcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9SZWZlcmVuY2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUmVmZXJlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTMwMzc2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9SZWZlcmVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNDIwNjA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1RleHRFbGVtZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1RleHRFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDA2NTIwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9UZXh0RWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwY2YyN2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9saW5rX0RpYWdyYW1MaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfbGlua19EaWFncmFtTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmN2VlNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9saW5rX0RpYWdyYW1MaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfcG9zaXRpb25fUG9pbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9wb3NpdGlvbl9Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyZDQwN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9wb3NpdGlvbl9Qb2ludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWZlNDBjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0MjA2MDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGNmMjdiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhOb2RlX3NpemVfRGltZW5zaW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaE5vZGVfc2l6ZV9EaW1lbnNpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjY2Q5Mjg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaE5vZGVfc2l6ZV9EaW1lbnNpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZEVsZW1lbnRfbWV0aG9kRWxlbWVudFByb3BlcnR5X01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kRWxlbWVudF9tZXRob2RFbGVtZW50UHJvcGVydHlfTWV0aG9kRWxlbWVudFByb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmIyYzNlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kRWxlbWVudF9tZXRob2RFbGVtZW50UHJvcGVydHlfTWV0aG9kRWxlbWVudFByb3BlcnR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RFbGVtZW50X293bmVkUnVsZXNfQ29uc3RyYWludC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kRWxlbWVudF9vd25lZFJ1bGVzX0NvbnN0cmFpbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiY2QzMmY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RFbGVtZW50X293bmVkUnVsZXNfQ29uc3RyYWludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9tZXRob2RNb2RlbHNfTWV0aG9kTW9kZWwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfbWV0aG9kTW9kZWxzX01ldGhvZE1vZGVsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmI4MmMzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9tZXRob2RNb2RlbHNfTWV0aG9kTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfbWV0aG9kUGx1Z2luc19NZXRob2RQbHVnaW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfbWV0aG9kUGx1Z2luc19NZXRob2RQbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjgyYzM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfTWV0aG9kUGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19NZXRob2RDb25maWd1cmF0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19NZXRob2RDb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfTWV0aG9kQ29uZmlndXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfUHJvY2Vzc0ZhbWlseS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfUHJvY2Vzc0ZhbWlseS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY0NjdkNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX1Byb2Nlc3NGYW1pbHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZE1vZGVsX21ldGhvZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Db250ZW50UGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZE1vZGVsX21ldGhvZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZE1vZGVsX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDhkOGMyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Db250ZW50UGFja2FnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX1Byb2Nlc3NDb21wb25lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX1Byb2Nlc3NQYWNrYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOGQ4YzJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Db250ZW50UGFja2FnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NDb21wb25lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NQYWNrYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOGQ4YzJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvbHlsaW5lX3dheXBvaW50c19Qb2ludC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9seWxpbmVfd2F5cG9pbnRzX1BvaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDM3MDNkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9seWxpbmVfd2F5cG9pbnRzX1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZV9QcmFjdGljZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VfUHJhY3RpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZV9QcmFjdGljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX1ByYWN0aWNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZXNfUHJhY3RpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZXNfUHJhY3RpY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZUlPX1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZVNwZWNpZmljYXRpb25zX1Rhc2tEZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZVNwZWNpZmljYXRpb25zX1Rhc2tEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU0ZTI2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19UYXNrRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNWZmYmIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19EZWxpdmVyeVByb2Nlc3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19EZWxpdmVyeVByb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfRGVsaXZlcnlQcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjA5NWQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOWMxYTA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlmZjIzNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjM2IyYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1NDBmM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9PQlNfT0JTLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9PQlNfT0JTLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzNlOGE2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfT0JTX09CUy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfUEJTX1BCUy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfUEJTX1BCUy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhM2FiNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1BCU19QQlMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1dCU19XQlMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1dCU19XQlMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYTJjYzUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9XQlNfV0JTLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9Xb3JrT3JkZXJfV29ya09yZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9Xb3JrT3JkZXJfV29ya09yZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2NmYWMzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfV29ya09yZGVyX1dvcmtPcmRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfQWN0aXZpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfQWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19DYXBhYmlsaXR5UGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1ZmZiYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19EZWxpdmVyeVByb2Nlc3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfSXRlcmF0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19JdGVyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzExZTQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19JdGVyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX01pbGVzdG9uZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfTWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDk2MTVlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfTWlsZXN0b25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19NaWxlc3RvbmVzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19NaWxlc3RvbmVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDk2MTVlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfTWlsZXN0b25lcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUGhhc2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQ2MGJkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUGhhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiMDk1ZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmOWI3OGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19SZXNvdXJjZURlZmluaXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Jlc291cmNlRGVmaW5pdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3YTg2ZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Jlc291cmNlRGVmaW5pdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUm9sZURlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1JvbGVEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzY4YzdiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUm9sZURlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Rhc2tEZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UYXNrRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1NGUyNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Rhc2tEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UZWFtLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UZWFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGVhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGVhbVByb2ZpbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1RlYW1Qcm9maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGVhbVByb2ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjIxODIyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9kaWFncmFtc19EaWFncmFtLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9kaWFncmFtc19EaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTZkODU1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfZGlhZ3JhbXNfRGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0FjdGl2aXR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19DYXBhYmlsaXR5UGF0dGVybi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTVmZmJiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQ29tcG9zaXRlUm9sZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0NvbXBvc2l0ZVJvbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjAyOTE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQ29tcG9zaXRlUm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19EZWxpdmVyeVByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19JdGVyYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19JdGVyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzExZTQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfSXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfTWlsZXN0b25lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfTWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDk2MTVlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX01pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1BoYXNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUGhhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDYwYmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUGhhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19QbGFubmluZ0RhdGEuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19QbGFubmluZ0RhdGEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MmNlMjYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUGxhbm5pbmdEYXRhLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiMDk1ZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5YzFhMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1JvbGVEZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUm9sZURlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNjhjN2I4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUm9sZURlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19UYXNrRGVzY3JpcHRvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Rhc2tEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU0ZTI2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Rhc2tEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfVGVhbVByb2ZpbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19UZWFtUHJvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19UZWFtUHJvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1dvcmtPcmRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1dvcmtPcmRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiNDFmM2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Xb3JrT3JkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTVmZmJiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19DYXBhYmlsaXR5UGF0dGVybi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19EZWxpdmVyeVByb2Nlc3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfRGVsaXZlcnlQcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19EZWxpdmVyeVByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmIwOTVkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NQbGFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NQbGFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWZkYTU1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzUGxhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmOWI3OGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9UcmFuc2l0aW9uX1RyYW5zaXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9UcmFuc2l0aW9uX1RyYW5zaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNDMxYzU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVHJhbnNpdGlvbl9UcmFuc2l0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1BzZXVkb1N0YXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1BzZXVkb1N0YXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDM2OGU2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9Qc2V1ZG9TdGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9TdGF0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9TdGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjZjUwNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfU3RhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfVmVydGV4LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1ZlcnRleC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjYTM3NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfVmVydGV4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN0aW9uX3N1YlNlY3Rpb25zX1NlY3Rpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3Rpb25fc3ViU2VjdGlvbnNfU2VjdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4M2NlOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3Rpb25fc3ViU2VjdGlvbnNfU2VjdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdGlvbl9zdWJTZWN0aW9uc19TdGVwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN0aW9uX3N1YlNlY3Rpb25zX1N0ZXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YzdlZmM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN0aW9uX3N1YlNlY3Rpb25zX1N0ZXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVN0YXRlTWFjaGluZV9SZWdpb25fUmVnaW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTdGF0ZU1hY2hpbmVfUmVnaW9uX1JlZ2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI2YWI3ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVN0YXRlTWFjaGluZV9SZWdpb25fUmVnaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTdGF0ZV9SZWdpb25fUmVnaW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTdGF0ZV9SZWdpb25fUmVnaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjY3NmRiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU3RhdGVfUmVnaW9uX1JlZ2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGFza19lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGFza19lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY4NDRiZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRhc2tfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRhc2tfc3RlcHNfU3RlcC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGFza19zdGVwc19TdGVwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmRhNDlkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGFza19zdGVwc19TdGVwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUZWFtUHJvZmlsZV9zdWJUZWFtX1RlYW1Qcm9maWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUZWFtUHJvZmlsZV9zdWJUZWFtX1RlYW1Qcm9maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGVhbVByb2ZpbGVfc3ViVGVhbV9UZWFtUHJvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVHJhaW5pbmdDbGFzc190cmFpbmluZ01vZHVsZXNfVHJhaW5pbmdNb2R1bGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRyYWluaW5nQ2xhc3NfdHJhaW5pbmdNb2R1bGVzX1RyYWluaW5nTW9kdWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVmNWVmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVHJhaW5pbmdDbGFzc190cmFpbmluZ01vZHVsZXNfVHJhaW5pbmdNb2R1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fQ29uc3RyYWludC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya0RlZmluaXRpb25fcG9zdGNvbmRpdGlvbl9Db25zdHJhaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmQ5NDRkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya0RlZmluaXRpb25fcG9zdGNvbmRpdGlvbl9Db25zdHJhaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrRGVmaW5pdGlvbl9wcmVjb25kaXRpb25fQ29uc3RyYWludC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya0RlZmluaXRpb25fcHJlY29uZGl0aW9uX0NvbnN0cmFpbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZDk0NGQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrRGVmaW5pdGlvbl9wcmVjb25kaXRpb25fQ29uc3RyYWludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya1Byb2R1Y3RfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtQcm9kdWN0X2VzdGltYXRlX0VzdGltYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjc2ZWIxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya1Byb2R1Y3RfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FnZ3JlZ2F0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FnZ3JlZ2F0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQzZGM1YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BZ2dyZWdhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcnRpZmFjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTAxZDIxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0F0dGFjaG1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BdHRhY2htZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzRhOGFmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0F0dGFjaG1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQnJlYWtkb3duRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhZGFhYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzVlZjg0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNWZmYmIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DaGVja2xpc3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DaGVja2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OGY2ZDhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2tsaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2xhc3NpZmllci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NsYXNzaWZpZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMTdkYzdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2xhc3NpZmllci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbXBvc2l0ZVJvbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db21wb3NpdGVSb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbXBvc2l0ZVJvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25jZXB0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uY2VwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkZjg0ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25jZXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uc3RyYWludC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnN0cmFpbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYjc0MTRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uc3RyYWludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRDYXRlZ29yeS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRDYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1NzMxZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50Q2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50RGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTIyNDYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudEVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50RWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5MTU1OTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50RWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRQYWNrYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudFBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudFBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db3JlRWxlbWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvcmVFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzMzNzBjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvcmVFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExN2RjN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0N1c3RvbUNhdGVnb3J5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyYWJsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2ExMDU2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpYmFibGVFbGVtZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpYmFibGVFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTRhZjhhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaWJhYmxlRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTM2ZTNiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmlwdG9yRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmlwdG9yRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjY5MjU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNGE4YWY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW1FbGVtZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbUVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NTczMWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbUVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtTGluay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW1MaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzY3M2E1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW1MaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGltZW5zaW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGltZW5zaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2RkM2I3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpbWVuc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzViZDQ3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NTUzYzFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZUdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRG9tYWluLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRG9tYWluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RvbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjgwNDFkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FbGxpcHNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRWxsaXBzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwNjg4MWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FbGxpcHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4MmQyMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRlZE1ldGhvZEVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0ZWRNZXRob2RFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTRhZjhhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRlZE1ldGhvZEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZmM4NGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ01ldHJpYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdNZXRyaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOTQwOTc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ01ldHJpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdNb2RlbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdNb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhZjI4MDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nUGFyYW1ldGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ1BhcmFtZXRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0Yzk1M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ1BhcmFtZXRlck93bmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ1BhcmFtZXRlck93bmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTkxNTU5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdQYXJhbWV0ZXJPd25lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmYzg0ZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFiOTQ0ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhDb25uZWN0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaENvbm5lY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczOWViYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaENvbm5lY3Rvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoRWRnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoRWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhOWJjNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaEVkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaEVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMzhmYjhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhOb2RlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTM0NTUxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoaWNQcmltaXRpdmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaGljUHJpbWl0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTBkMjIyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoaWNQcmltaXRpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRlbGluZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRlbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkZWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9JbWFnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0ltYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWY1NmMxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0ltYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDMxMWU0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0xlYWZFbGVtZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTGVhZkVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDY4ODFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTGVhZkVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlODk2MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNGZiMzBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0MTRmZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RFbGVtZW50UHJvcGVydHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGFja2FnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiODJjMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW5fZ3JleS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbl9ncmV5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU2M2FkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbl9ncmV5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kVW5pdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFVuaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTliYzc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kVW5pdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5NjE1ZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmVzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5NjE1ZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZWRFbGVtZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZWRFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTRhZjhhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L05hbWVkRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L05hbWVzcGFjZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L05hbWVzcGFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5ODM2NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9OYW1lc3BhY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PQlMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PQlMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZmI4MmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT0JTLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT3V0Y29tZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L091dGNvbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNzAzNTE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT3V0Y29tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BCUy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BCUy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5ODM2NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QQlMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QYWNrYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwMGFlZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGFja2FnZWFibGVFbGVtZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGFja2FnZWFibGVFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA2ODgxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BhY2thZ2VhYmxlRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BoYXNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDYwYmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QbGFubmluZ0RhdGEuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QbGFubmluZ0RhdGEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NGM5NTNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGxhbm5pbmdEYXRhLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUG9pbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzNTAwZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qb2ludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BvbHlsaW5lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUG9seWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YzJhYWFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUG9seWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ByYWN0aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ByYWN0aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udGV4dC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb250ZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb250ZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjA5NWQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRWxlbWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlseS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NGYW1pbHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjY5MjU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlseS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQYWNrYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOGQ4YzJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGxhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQbGFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjFmOGFmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQbGFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzNmUzYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb3BlcnR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMzZlM2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvcGVydHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qc2V1ZG9TdGF0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BzZXVkb1N0YXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzRmYjMwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BzZXVkb1N0YXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVmZXJlbmNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVmZXJlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzM5ZWJiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlZmVyZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlZ2lvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlZ2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzNjU5NjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZWdpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXBvcnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMjJjODVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVwb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VEZWZpbml0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VEZWZpbml0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOThiMzUxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Jlc291cmNlRGVmaW5pdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JldXNhYmxlQXNzZXQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjUyY2ZmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JldXNhYmxlQXNzZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2FkbWFwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9hZG1hcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxMWJjNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2FkbWFwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2ZTg4OTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlRGVzY3JpcHRvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzY4YzdiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXRDYXRlZ29yeS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXRDYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0YTNmNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0Q2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0R3JvdXBpbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0R3JvdXBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NGEzZjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldEdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2VjdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NlY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MzllYmJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2VjdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzM4NTRlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2IxNzU1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiMTc1NWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YXRlTWFjaGluZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YXRlTWFjaGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhZGFhYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGF0ZU1hY2hpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGVwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RlcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1ZWY4NGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGVwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NTczMWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA1YTIxZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjM2IyYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWMzYjJiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NTRlMjZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWFtLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVhbVByb2ZpbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWFtUHJvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWFtUHJvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlY2huaXF1ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlY2huaXF1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2ODY2ZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWNobmlxdWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzc2MzI1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlbXBsYXRlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNzYzMjUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rlcm1EZWZpbml0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVybURlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjFiZmUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVybURlZmluaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXh0RWxlbWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RleHRFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTM0NTUxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RleHRFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZjFiODVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xNZW50b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sTWVudG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGYxYjg1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xNZW50b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFpbmluZ0NsYXNzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhaW5pbmdDbGFzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwZDEwZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFpbmluZ0NsYXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhaW5pbmdNb2R1bGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFpbmluZ01vZHVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmNTZjMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFpbmluZ01vZHVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYW5zaXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFuc2l0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2JhYzRmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYW5zaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxZjhhZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OWFkNWRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGY0Nzk4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9WYXJpYWJpbGl0eUVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9WYXJpYWJpbGl0eUVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYjc0MTRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVmFyaWFiaWxpdHlFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVmVydGV4LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVmVydGV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGE1YzcwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ZlcnRleC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dCUy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dCUy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmNTZjMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XQlMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XaGl0ZXBhcGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV2hpdGVwYXBlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1YjQ4MDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XaGl0ZXBhcGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya0JyZWFrZG93bkVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrQnJlYWtkb3duRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiYWM0ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrQnJlYWtkb3duRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtEZWZpbml0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya0RlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTI0ZjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya0RlZmluaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrT3JkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrT3JkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYWRhYWIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya09yZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1NDBmM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTU0MGYzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RHdWlkZWxpbmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdEd1aWRlbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk1N2ZhNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdEd1aWRlbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0U2hhcGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFNoYXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTU0MGYzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0U2hhcGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhN2VjYWMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzNmVlNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRU1GIFVNQSBFZGl0IFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0ID0gezB9Ci1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDIgPSB7MX0gezB9Ci1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0KLV9VSV9DcmVhdGVDaGlsZF90b29sdGlwID0gQ3JlYXRlIE5ldyB7MH0gVW5kZXIgezF9IEZlYXR1cmUKLV9VSV9DcmVhdGVDaGlsZF9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBjaGlsZCBvZiB0eXBlIHswfSBmb3IgdGhlIHsxfSBmZWF0dXJlIG9mIHRoZSBzZWxlY3RlZCB7Mn0uCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBzaWJsaW5nIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezJ9LCB1bmRlciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlaXIgcGFyZW50LgotCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gVGhlIHswfSBvZiB0aGUgezF9Ci0KLV9VSV9DbGFzc2lmaWVyX3R5cGUgPSBDbGFzc2lmaWVyCi1fVUlfVHlwZV90eXBlID0gVHlwZQotX1VJX0VsZW1lbnRfdHlwZSA9IEVsZW1lbnQKLV9VSV9OYW1lZEVsZW1lbnRfdHlwZSA9IE5hbWVkIEVsZW1lbnQKLV9VSV9QYWNrYWdlYWJsZUVsZW1lbnRfdHlwZSA9IFBhY2thZ2VhYmxlIEVsZW1lbnQKLV9VSV9QYWNrYWdlX3R5cGUgPSBQYWNrYWdlCi1fVUlfTmFtZXNwYWNlX3R5cGUgPSBOYW1lc3BhY2UKLV9VSV9NZXRob2RFbGVtZW50X3R5cGUgPSBNZXRob2QgRWxlbWVudAotX1VJX0NvbnN0cmFpbnRfdHlwZSA9IENvbnN0cmFpbnQKLV9VSV9Db250ZW50RWxlbWVudF90eXBlID0gQ29udGVudCBFbGVtZW50Ci1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3R5cGUgPSBEZXNjcmliYWJsZSBFbGVtZW50Ci1fVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUgPSBDb250ZW50IERlc2NyaXB0aW9uCi1fVUlfU2VjdGlvbl90eXBlID0gU2VjdGlvbgotX1VJX1JvbGVfdHlwZSA9IFJvbGUKLV9VSV9Xb3JrUHJvZHVjdF90eXBlID0gV29yayBQcm9kdWN0Ci1fVUlfVGFza190eXBlID0gVGFzawotX1VJX1dvcmtEZWZpbml0aW9uX3R5cGUgPSBXb3JrIERlZmluaXRpb24KLV9VSV9TdGVwX3R5cGUgPSBTdGVwCi1fVUlfR3VpZGFuY2VfdHlwZSA9IEd1aWRhbmNlCi1fVUlfQXJ0aWZhY3RfdHlwZSA9IEFydGlmYWN0Ci1fVUlfRGVsaXZlcmFibGVfdHlwZSA9IERlbGl2ZXJhYmxlCi1fVUlfT3V0Y29tZV90eXBlID0gT3V0Y29tZQotX1VJX01ldGhvZFBhY2thZ2VfdHlwZSA9IE1ldGhvZCBQYWNrYWdlCi1fVUlfQ29udGVudFBhY2thZ2VfdHlwZSA9IENvbnRlbnQgUGFja2FnZQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSA9IEFydGlmYWN0IERlc2NyaXB0aW9uCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlID0gV29yayBQcm9kdWN0IERlc2NyaXB0aW9uCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl90eXBlID0gRGVsaXZlcmFibGUgRGVzY3JpcHRpb24KLV9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSA9IFJvbGUgRGVzY3JpcHRpb24KLV9VSV9UYXNrRGVzY3JpcHRpb25fdHlwZSA9IFRhc2sgRGVzY3JpcHRpb24KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUgPSBHdWlkYW5jZSBEZXNjcmlwdGlvbgotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSA9IFByYWN0aWNlIERlc2NyaXB0aW9uCi1fVUlfUG9pbnRfdHlwZSA9IFBvaW50Ci1fVUlfR3JhcGhFbGVtZW50X3R5cGUgPSBHcmFwaCBFbGVtZW50Ci1fVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSA9IERpYWdyYW0gRWxlbWVudAotX1VJX0RpYWdyYW1MaW5rX3R5cGUgPSBEaWFncmFtIExpbmsKLV9VSV9HcmFwaENvbm5lY3Rvcl90eXBlID0gR3JhcGggQ29ubmVjdG9yCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gU2VtYW50aWMgTW9kZWwgQnJpZGdlCi1fVUlfRGltZW5zaW9uX3R5cGUgPSBEaW1lbnNpb24KLV9VSV9SZWZlcmVuY2VfdHlwZSA9IFJlZmVyZW5jZQotX1VJX1Byb3BlcnR5X3R5cGUgPSBQcm9wZXJ0eQotX1VJX0dyYXBoRWRnZV90eXBlID0gR3JhcGggRWRnZQotX1VJX0RpYWdyYW1fdHlwZSA9IERpYWdyYW0KLV9VSV9HcmFwaE5vZGVfdHlwZSA9IEdyYXBoIE5vZGUKLV9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlID0gU2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQKLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBVTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlCi1fVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IENvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlCi1fVUlfTGVhZkVsZW1lbnRfdHlwZSA9IExlYWYgRWxlbWVudAotX1VJX1RleHRFbGVtZW50X3R5cGUgPSBUZXh0IEVsZW1lbnQKLV9VSV9JbWFnZV90eXBlID0gSW1hZ2UKLV9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUgPSBHcmFwaGljIFByaW1pdGl2ZQotX1VJX1BvbHlsaW5lX3R5cGUgPSBQb2x5bGluZQotX1VJX0VsbGlwc2VfdHlwZSA9IEVsbGlwc2UKLV9VSV9BY3Rpdml0eV90eXBlID0gQWN0aXZpdHkKLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF90eXBlID0gV29yayBCcmVha2Rvd24gRWxlbWVudAotX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IEJyZWFrZG93biBFbGVtZW50Ci1fVUlfTWlsZXN0b25lX3R5cGUgPSBNaWxlc3RvbmUKLV9VSV9JdGVyYXRpb25fdHlwZSA9IEl0ZXJhdGlvbgotX1VJX1BoYXNlX3R5cGUgPSBQaGFzZQotX1VJX1RlYW1Qcm9maWxlX3R5cGUgPSBUZWFtIFByb2ZpbGUKLV9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlID0gUm9sZSBEZXNjcmlwdG9yCi1fVUlfV29ya09yZGVyX3R5cGUgPSBXb3JrIE9yZGVyCi1fVUlfUHJvY2Vzc0VsZW1lbnRfdHlwZSA9IFByb2Nlc3MgRWxlbWVudAotX1VJX1BsYW5uaW5nRGF0YV90eXBlID0gUGxhbm5pbmcgRGF0YQotX1VJX0Rlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXB0b3IKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSA9IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi1fVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSA9IFRhc2sgRGVzY3JpcHRvcgotX1VJX0NvbXBvc2l0ZVJvbGVfdHlwZSA9IENvbXBvc2l0ZSBSb2xlCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3R5cGUgPSBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbgotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSA9IEFjdGl2aXR5IERlc2NyaXB0aW9uCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSA9IERlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb24KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdHlwZSA9IFByb2Nlc3MgRGVzY3JpcHRpb24KLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXB0b3IgRGVzY3JpcHRpb24KLV9VSV9Db25jZXB0X3R5cGUgPSBDb25jZXB0Ci1fVUlfQ2hlY2tsaXN0X3R5cGUgPSBDaGVja2xpc3QKLV9VSV9FeGFtcGxlX3R5cGUgPSBFeGFtcGxlCi1fVUlfR3VpZGVsaW5lX3R5cGUgPSBHdWlkZWxpbmUKLV9VSV9SZXBvcnRfdHlwZSA9IFJlcG9ydAotX1VJX1RlbXBsYXRlX3R5cGUgPSBUZW1wbGF0ZQotX1VJX1N1cHBvcnRpbmdNYXRlcmlhbF90eXBlID0gU3VwcG9ydGluZyBNYXRlcmlhbAotX1VJX1Rvb2xNZW50b3JfdHlwZSA9IFRvb2wgTWVudG9yCi1fVUlfV2hpdGVwYXBlcl90eXBlID0gV2hpdGVwYXBlcgotX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUgPSBUZXJtIERlZmluaXRpb24KLV9VSV9QcmFjdGljZV90eXBlID0gUHJhY3RpY2UKLV9VSV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdHlwZSA9IEVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLV9VSV9SZXVzYWJsZUFzc2V0X3R5cGUgPSBSZXVzYWJsZSBBc3NldAotX1VJX1N0YXRlX3R5cGUgPSBTdGF0ZQotX1VJX1ZlcnRleF90eXBlID0gVmVydGV4Ci1fVUlfUmVnaW9uX3R5cGUgPSBSZWdpb24KLV9VSV9TdGF0ZU1hY2hpbmVfdHlwZSA9IFN0YXRlIE1hY2hpbmUKLV9VSV9UcmFuc2l0aW9uX3R5cGUgPSBUcmFuc2l0aW9uCi1fVUlfUHNldWRvU3RhdGVfdHlwZSA9IFBzZXVkbyBTdGF0ZQotX1VJX0Rpc2NpcGxpbmVfdHlwZSA9IERpc2NpcGxpbmUKLV9VSV9Db250ZW50Q2F0ZWdvcnlfdHlwZSA9IENvbnRlbnQgQ2F0ZWdvcnkKLV9VSV9Sb2xlU2V0X3R5cGUgPSBSb2xlIFNldAotX1VJX0RvbWFpbl90eXBlID0gRG9tYWluCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3R5cGUgPSBXb3JrIFByb2R1Y3QgS2luZAotX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlID0gRGlzY2lwbGluZSBHcm91cGluZwotX1VJX1Rvb2xfdHlwZSA9IFRvb2wKLV9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSA9IFJvbGUgU2V0IEdyb3VwaW5nCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSA9IEN1c3RvbSBDYXRlZ29yeQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlID0gRGVsaXZlcnkgUHJvY2VzcwotX1VJX1Byb2Nlc3NfdHlwZSA9IFByb2Nlc3MKLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlID0gQ2FwYWJpbGl0eSBQYXR0ZXJuCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfdHlwZSA9IFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUKLV9VSV9Sb2FkbWFwX3R5cGUgPSBSb2FkbWFwCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlID0gUHJvY2VzcyBDb21wb25lbnQKLV9VSV9Qcm9jZXNzUGFja2FnZV90eXBlID0gUHJvY2VzcyBQYWNrYWdlCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV90eXBlID0gUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfdHlwZSA9IFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IKLV9VSV9NZXRob2RQbHVnaW5fdHlwZSA9IE1ldGhvZCBQbHVnLWluCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUgPSBWYXJpYWJpbGl0eSBFbGVtZW50Ci1fVUlfTWV0aG9kVW5pdF90eXBlID0gTWV0aG9kIFVuaXQKLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUgPSBNZXRob2QgQ29uZmlndXJhdGlvbgotX1VJX1Byb2Nlc3NGYW1pbHlfdHlwZSA9IFByb2Nlc3MgRmFtaWx5Ci1fVUlfTWV0aG9kTGlicmFyeV90eXBlID0gTWV0aG9kIExpYnJhcnkKLV9VSV9Vbmtub3duX3R5cGUgPSBPYmplY3QKLQotX1VJX1Vua25vd25fZGF0YXR5cGU9IFZhbHVlCi0KLV9VSV9OYW1lZEVsZW1lbnRfbmFtZV9mZWF0dXJlID0gTmFtZQotX1VJX01ldGhvZEVsZW1lbnRfZ3VpZF9mZWF0dXJlID0gR1VJRAotX1VJX01ldGhvZEVsZW1lbnRfYnJpZWZEZXNjcmlwdGlvbl9mZWF0dXJlID0gQnJpZWYgRGVzY3JpcHRpb24KLV9VSV9NZXRob2RFbGVtZW50X293bmVkUnVsZXNfZmVhdHVyZSA9IE93bmVkIFJ1bGVzCi1fVUlfTWV0aG9kRWxlbWVudF9zdXBwcmVzc2VkX2ZlYXR1cmUgPSBTdXBwcmVzc2VkCi1fVUlfTWV0aG9kRWxlbWVudF9vcmRlcmluZ0d1aWRlX2ZlYXR1cmUgPSBPcmRlcmluZyBHdWlkZQotX1VJX0NvbnN0cmFpbnRfYm9keV9mZWF0dXJlID0gQm9keQotX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IFN1cHBvcnRpbmcgTWF0ZXJpYWxzCi1fVUlfQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfZmVhdHVyZSA9IENvbmNlcHRzIEFuZCBQYXBlcnMKLV9VSV9Db250ZW50RWxlbWVudF9jaGVja2xpc3RzX2ZlYXR1cmUgPSBDaGVja2xpc3RzCi1fVUlfQ29udGVudEVsZW1lbnRfZ3VpZGVsaW5lc19mZWF0dXJlID0gR3VpZGVsaW5lcwotX1VJX0NvbnRlbnRFbGVtZW50X2V4YW1wbGVzX2ZlYXR1cmUgPSBFeGFtcGxlcwotX1VJX0NvbnRlbnRFbGVtZW50X2Fzc2V0c19mZWF0dXJlID0gQXNzZXRzCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSA9IFByZXNlbnRhdGlvbiBOYW1lCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gUHJlc2VudGF0aW9uCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3NoYXBlaWNvbl9mZWF0dXJlID0gU2hhcGVpY29uCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBOb2RlaWNvbgotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9tYWluRGVzY3JpcHRpb25fZmVhdHVyZSA9IE1haW4gRGVzY3JpcHRpb24KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfZmVhdHVyZSA9IFNlY3Rpb25zCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX2tleUNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBLZXkgQ29uc2lkZXJhdGlvbnMKLV9VSV9TZWN0aW9uX3NlY3Rpb25OYW1lX2ZlYXR1cmUgPSBTZWN0aW9uIE5hbWUKLV9VSV9TZWN0aW9uX3NlY3Rpb25EZXNjcmlwdGlvbl9mZWF0dXJlID0gU2VjdGlvbiBEZXNjcmlwdGlvbgotX1VJX1NlY3Rpb25fc3ViU2VjdGlvbnNfZmVhdHVyZSA9IFN1YiBTZWN0aW9ucwotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IFByZWRlY2Vzc29yCi1fVUlfUm9sZV9tb2RpZmllc19mZWF0dXJlID0gTW9kaWZpZXMKLV9VSV9Sb2xlX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUgPSBSZXNwb25zaWJsZSBGb3IKLV9VSV9Xb3JrUHJvZHVjdF9yZXBvcnRzX2ZlYXR1cmUgPSBSZXBvcnRzCi1fVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUgPSBUZW1wbGF0ZXMKLV9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlID0gVG9vbCBNZW50b3JzCi1fVUlfV29ya1Byb2R1Y3RfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1fVUlfVGFza19wZXJmb3JtZWRCeV9mZWF0dXJlID0gUGVyZm9ybWVkIEJ5Ci1fVUlfVGFza19tYW5kYXRvcnlJbnB1dF9mZWF0dXJlID0gTWFuZGF0b3J5IElucHV0Ci1fVUlfVGFza19vdXRwdXRfZmVhdHVyZSA9IE91dHB1dAotX1VJX1Rhc2tfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSA9IEFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnkKLV9VSV9UYXNrX29wdGlvbmFsSW5wdXRfZmVhdHVyZSA9IE9wdGlvbmFsIElucHV0Ci1fVUlfVGFza19zdGVwc19mZWF0dXJlID0gU3RlcHMKLV9VSV9UYXNrX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBUb29sIE1lbnRvcnMKLV9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucwotX1VJX1dvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9mZWF0dXJlID0gUHJlY29uZGl0aW9uCi1fVUlfV29ya0RlZmluaXRpb25fcG9zdGNvbmRpdGlvbl9mZWF0dXJlID0gUG9zdGNvbmRpdGlvbgotX1VJX0FydGlmYWN0X2NvbnRhaW5lckFydGlmYWN0X2ZlYXR1cmUgPSBDb250YWluZXIgQXJ0aWZhY3QKLV9VSV9BcnRpZmFjdF9jb250YWluZWRBcnRpZmFjdHNfZmVhdHVyZSA9IENvbnRhaW5lZCBBcnRpZmFjdHMKLV9VSV9EZWxpdmVyYWJsZV9kZWxpdmVyZWRXb3JrUHJvZHVjdHNfZmVhdHVyZSA9IERlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzCi1fVUlfTWV0aG9kUGFja2FnZV9nbG9iYWxfZmVhdHVyZSA9IEdsb2JhbAotX1VJX01ldGhvZFBhY2thZ2VfcmV1c2VkUGFja2FnZXNfZmVhdHVyZSA9IFJldXNlZCBQYWNrYWdlcwotX1VJX01ldGhvZFBhY2thZ2VfcGFyZW50UGFja2FnZV9mZWF0dXJlID0gUGFyZW50IFBhY2thZ2UKLV9VSV9NZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfZmVhdHVyZSA9IENoaWxkIFBhY2thZ2VzCi1fVUlfQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX2ZlYXR1cmUgPSBDb250ZW50IEVsZW1lbnRzCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9icmllZk91dGxpbmVfZmVhdHVyZSA9IEJyaWVmIE91dGxpbmUKLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3JlcHJlc2VudGF0aW9uT3B0aW9uc19mZWF0dXJlID0gUmVwcmVzZW50YXRpb24gT3B0aW9ucwotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gRXh0ZXJuYWwgSWQKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFB1cnBvc2UKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2ltcGFjdE9mTm90SGF2aW5nX2ZlYXR1cmUgPSBJbXBhY3QgT2YgTm90IEhhdmluZwotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcmVhc29uc0Zvck5vdE5lZWRpbmdfZmVhdHVyZSA9IFJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9leHRlcm5hbERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBFeHRlcm5hbCBEZXNjcmlwdGlvbgotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSA9IFBhY2thZ2luZyBHdWlkYW5jZQotX1VJX1JvbGVEZXNjcmlwdGlvbl9za2lsbHNfZmVhdHVyZSA9IFNraWxscwotX1VJX1JvbGVEZXNjcmlwdGlvbl9hc3NpZ25tZW50QXBwcm9hY2hlc19mZWF0dXJlID0gQXNzaWdubWVudCBBcHByb2FjaGVzCi1fVUlfUm9sZURlc2NyaXB0aW9uX3N5bm9ueW1zX2ZlYXR1cmUgPSBTeW5vbnltcwotX1VJX1Rhc2tEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBQdXJwb3NlCi1fVUlfVGFza0Rlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gQWx0ZXJuYXRpdmVzCi1fVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl9hdHRhY2htZW50c19mZWF0dXJlID0gQXR0YWNobWVudHMKLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUgPSBBZGRpdGlvbmFsIEluZm8KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3Byb2JsZW1fZmVhdHVyZSA9IFByb2JsZW0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2JhY2tncm91bmRfZmVhdHVyZSA9IEJhY2tncm91bmQKLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2dvYWxzX2ZlYXR1cmUgPSBHb2FscwotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYXBwbGljYXRpb25fZmVhdHVyZSA9IEFwcGxpY2F0aW9uCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9sZXZlbHNPZkFkb3B0aW9uX2ZlYXR1cmUgPSBMZXZlbHMgT2YgQWRvcHRpb24KLV9VSV9Qb2ludF94X2ZlYXR1cmUgPSBYCi1fVUlfUG9pbnRfeV9mZWF0dXJlID0gWQotX1VJX0dyYXBoRWxlbWVudF9wb3NpdGlvbl9mZWF0dXJlID0gUG9zaXRpb24KLV9VSV9HcmFwaEVsZW1lbnRfY29udGFpbmVkX2ZlYXR1cmUgPSBDb250YWluZWQKLV9VSV9HcmFwaEVsZW1lbnRfbGlua19mZWF0dXJlID0gTGluawotX1VJX0dyYXBoRWxlbWVudF9hbmNob3JhZ2VfZmVhdHVyZSA9IEFuY2hvcmFnZQotX1VJX0dyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX2ZlYXR1cmUgPSBTZW1hbnRpYyBNb2RlbAotX1VJX0RpYWdyYW1FbGVtZW50X2lzVmlzaWJsZV9mZWF0dXJlID0gSXMgVmlzaWJsZQotX1VJX0RpYWdyYW1FbGVtZW50X2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGFpbmVyCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUgPSBSZWZlcmVuY2UKLV9VSV9EaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9mZWF0dXJlID0gUHJvcGVydHkKLV9VSV9EaWFncmFtTGlua196b29tX2ZlYXR1cmUgPSBab29tCi1fVUlfRGlhZ3JhbUxpbmtfdmlld3BvcnRfZmVhdHVyZSA9IFZpZXdwb3J0Ci1fVUlfRGlhZ3JhbUxpbmtfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBHcmFwaCBFbGVtZW50Ci1fVUlfRGlhZ3JhbUxpbmtfZGlhZ3JhbV9mZWF0dXJlID0gRGlhZ3JhbQotX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gR3JhcGggRWxlbWVudAotX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWRnZV9mZWF0dXJlID0gR3JhcGggRWRnZQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQcmVzZW50YXRpb24KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gR3JhcGggRWxlbWVudAotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZGlhZ3JhbV9mZWF0dXJlID0gRGlhZ3JhbQotX1VJX0RpbWVuc2lvbl93aWR0aF9mZWF0dXJlID0gV2lkdGgKLV9VSV9EaW1lbnNpb25faGVpZ2h0X2ZlYXR1cmUgPSBIZWlnaHQKLV9VSV9SZWZlcmVuY2VfaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb25fZmVhdHVyZSA9IElzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb24KLV9VSV9SZWZlcmVuY2VfcmVmZXJlbmNlZF9mZWF0dXJlID0gUmVmZXJlbmNlZAotX1VJX1Byb3BlcnR5X2tleV9mZWF0dXJlID0gS2V5Ci1fVUlfUHJvcGVydHlfdmFsdWVfZmVhdHVyZSA9IFZhbHVlCi1fVUlfR3JhcGhFZGdlX2FuY2hvcl9mZWF0dXJlID0gQW5jaG9yCi1fVUlfR3JhcGhFZGdlX3dheXBvaW50c19mZWF0dXJlID0gV2F5cG9pbnRzCi1fVUlfRGlhZ3JhbV96b29tX2ZlYXR1cmUgPSBab29tCi1fVUlfRGlhZ3JhbV92aWV3cG9pbnRfZmVhdHVyZSA9IFZpZXdwb2ludAotX1VJX0RpYWdyYW1fZGlhZ3JhbUxpbmtfZmVhdHVyZSA9IERpYWdyYW0gTGluawotX1VJX0RpYWdyYW1fbmFtZXNwYWNlX2ZlYXR1cmUgPSBOYW1lc3BhY2UKLV9VSV9HcmFwaE5vZGVfc2l6ZV9mZWF0dXJlID0gU2l6ZQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGVJbmZvX2ZlYXR1cmUgPSBUeXBlIEluZm8KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnQKLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUgPSBFbGVtZW50Ci1fVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlID0gVGV4dAotX1VJX0ltYWdlX3VyaV9mZWF0dXJlID0gVXJpCi1fVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSA9IE1pbWUgVHlwZQotX1VJX1BvbHlsaW5lX2Nsb3NlZF9mZWF0dXJlID0gQ2xvc2VkCi1fVUlfUG9seWxpbmVfd2F5cG9pbnRzX2ZlYXR1cmUgPSBXYXlwb2ludHMKLV9VSV9FbGxpcHNlX3JhZGl1c1hfZmVhdHVyZSA9IFJhZGl1cyBYCi1fVUlfRWxsaXBzZV9yYWRpdXNZX2ZlYXR1cmUgPSBSYWRpdXMgWQotX1VJX0VsbGlwc2Vfcm90YXRpb25fZmVhdHVyZSA9IFJvdGF0aW9uCi1fVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUgPSBTdGFydCBBbmdsZQotX1VJX0VsbGlwc2VfZW5kQW5nbGVfZmVhdHVyZSA9IEVuZCBBbmdsZQotX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUgPSBDZW50ZXIKLV9VSV9BY3Rpdml0eV9icmVha2Rvd25FbGVtZW50c19mZWF0dXJlID0gQnJlYWtkb3duIEVsZW1lbnRzCi1fVUlfQWN0aXZpdHlfcm9hZG1hcHNfZmVhdHVyZSA9IFJvYWRtYXBzCi1fVUlfQWN0aXZpdHlfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gU3VwcG9ydGluZyBNYXRlcmlhbHMKLV9VSV9BY3Rpdml0eV9jaGVja2xpc3RzX2ZlYXR1cmUgPSBDaGVja2xpc3RzCi1fVUlfQWN0aXZpdHlfY29uY2VwdHNfZmVhdHVyZSA9IENvbmNlcHRzCi1fVUlfQWN0aXZpdHlfZXhhbXBsZXNfZmVhdHVyZSA9IEV4YW1wbGVzCi1fVUlfQWN0aXZpdHlfZ3VpZGVsaW5lc19mZWF0dXJlID0gR3VpZGVsaW5lcwotX1VJX0FjdGl2aXR5X3JldXNhYmxlQXNzZXRzX2ZlYXR1cmUgPSBSZXVzYWJsZSBBc3NldHMKLV9VSV9BY3Rpdml0eV9pc0VuYWN0YWJsZV9mZWF0dXJlID0gSXMgRW5hY3RhYmxlCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNSZXBlYXRhYmxlX2ZlYXR1cmUgPSBJcyBSZXBlYXRhYmxlCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNPbmdvaW5nX2ZlYXR1cmUgPSBJcyBPbmdvaW5nCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNFdmVudERyaXZlbl9mZWF0dXJlID0gSXMgRXZlbnQgRHJpdmVuCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfbGlua1RvUHJlZGVjZXNzb3JfZmVhdHVyZSA9IExpbmsgVG8gUHJlZGVjZXNzb3IKLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZWZpeF9mZWF0dXJlID0gUHJlZml4Ci1fVUlfQnJlYWtkb3duRWxlbWVudF9pc1BsYW5uZWRfZmVhdHVyZSA9IElzIFBsYW5uZWQKLV9VSV9CcmVha2Rvd25FbGVtZW50X2hhc011bHRpcGxlT2NjdXJyZW5jZXNfZmVhdHVyZSA9IEhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlcwotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlID0gSXMgT3B0aW9uYWwKLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEFmdGVyX2ZlYXR1cmUgPSBQcmVzZW50ZWQgQWZ0ZXIKLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEJlZm9yZV9mZWF0dXJlID0gUHJlc2VudGVkIEJlZm9yZQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX2ZlYXR1cmUgPSBQbGFubmluZyBEYXRhCi1fVUlfQnJlYWtkb3duRWxlbWVudF9zdXBlckFjdGl2aXRpZXNfZmVhdHVyZSA9IFN1cGVyIEFjdGl2aXR5Ci1fVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUgPSBUZWFtIFJvbGVzCi1fVUlfVGVhbVByb2ZpbGVfc3VwZXJUZWFtX2ZlYXR1cmUgPSBTdXBlciBUZWFtCi1fVUlfVGVhbVByb2ZpbGVfc3ViVGVhbV9mZWF0dXJlID0gU3ViIFRlYW0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9Sb2xlX2ZlYXR1cmUgPSBSb2xlCi1fVUlfUm9sZURlc2NyaXB0b3JfbW9kaWZpZXNfZmVhdHVyZSA9IE1vZGlmaWVzCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFJlc3BvbnNpYmxlIEZvcgotX1VJX1dvcmtPcmRlcl9saW5rVHlwZV9mZWF0dXJlID0gTGluayBUeXBlCi1fVUlfV29ya09yZGVyX3ByZWRfZmVhdHVyZSA9IFByZWQKLV9VSV9QbGFubmluZ0RhdGFfc3RhcnREYXRlX2ZlYXR1cmUgPSBTdGFydCBEYXRlCi1fVUlfUGxhbm5pbmdEYXRhX2ZpbmlzaERhdGVfZmVhdHVyZSA9IEZpbmlzaCBEYXRlCi1fVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSA9IFJhbmsKLV9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlID0gSXMgU3luY2hyb25pemVkIFdpdGggU291cmNlCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RW50cnlTdGF0ZV9mZWF0dXJlID0gQWN0aXZpdHkgRW50cnkgU3RhdGUKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFeGl0U3RhdGVfZmVhdHVyZSA9IEFjdGl2aXR5IEV4aXQgU3RhdGUKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3RfZmVhdHVyZSA9IFdvcmsgUHJvZHVjdAotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RlZEJ5X2ZlYXR1cmUgPSBJbXBhY3RlZCBCeQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RzX2ZlYXR1cmUgPSBJbXBhY3RzCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2RlbGl2ZXJhYmxlUGFydHNfZmVhdHVyZSA9IERlbGl2ZXJhYmxlIFBhcnRzCi1fVUlfVGFza0Rlc2NyaXB0b3JfVGFza19mZWF0dXJlID0gVGFzawotX1VJX1Rhc2tEZXNjcmlwdG9yX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBTZWNvbmRhcnkgUGVyZm9ybWVyCi1fVUlfVGFza0Rlc2NyaXB0b3JfYXNzaXN0ZWRCeV9mZWF0dXJlID0gQXNzaXN0ZWQgQnkKLV9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUgPSBFeHRlcm5hbCBJbnB1dAotX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBNYW5kYXRvcnkgSW5wdXQKLV9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBPcHRpb25hbCBJbnB1dAotX1VJX1Rhc2tEZXNjcmlwdG9yX291dHB1dF9mZWF0dXJlID0gT3V0cHV0Ci1fVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSA9IFByaW1hcnkgUGVyZm9ybWVyCi1fVUlfVGFza0Rlc2NyaXB0b3Jfc2VsZWN0ZWRTdGVwc19mZWF0dXJlID0gU2VsZWN0ZWQgU3RlcHMKLV9VSV9Db21wb3NpdGVSb2xlX2FnZ3JlZ2F0ZWRSb2xlc19mZWF0dXJlID0gQWdncmVnYXRlZCBSb2xlcwotX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl91c2FnZUd1aWRhbmNlX2ZlYXR1cmUgPSBVc2FnZSBHdWlkYW5jZQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gUHVycG9zZQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBBbHRlcm5hdGl2ZXMKLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2hvd3RvU3RhZmZfZmVhdHVyZSA9IEhvd3RvIFN0YWZmCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSA9IFNjYWxlCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlID0gUHJvamVjdCBDaGFyYWN0ZXJpc3RpY3MKLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9yaXNrTGV2ZWxfZmVhdHVyZSA9IFJpc2sgTGV2ZWwKLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9lc3RpbWF0aW5nVGVjaG5pcXVlX2ZlYXR1cmUgPSBFc3RpbWF0aW5nIFRlY2huaXF1ZQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IFByb2plY3QgTWVtYmVyIEV4cGVydGlzZQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGVPZkNvbnRyYWN0X2ZlYXR1cmUgPSBUeXBlIE9mIENvbnRyYWN0Ci1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSA9IEV4dGVybmFsIElkCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3Njb3BlX2ZlYXR1cmUgPSBTY29wZQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl91c2FnZU5vdGVzX2ZlYXR1cmUgPSBVc2FnZSBOb3RlcwotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl9yZWZpbmVkRGVzY3JpcHRpb25fZmVhdHVyZSA9IFJlZmluZWQgRGVzY3JpcHRpb24KLV9VSV9QcmFjdGljZV9zdWJQcmFjdGljZXNfZmVhdHVyZSA9IFN1YiBQcmFjdGljZXMKLV9VSV9QcmFjdGljZV9jb250ZW50UmVmZXJlbmNlc19mZWF0dXJlID0gQ29udGVudCBSZWZlcmVuY2VzCi1fVUlfUHJhY3RpY2VfYWN0aXZpdHlSZWZlcmVuY2VzX2ZlYXR1cmUgPSBBY3Rpdml0eSBSZWZlcmVuY2VzCi1fVUlfU3RhdGVfV29ya1Byb2R1Y3RfZmVhdHVyZSA9IFdvcmsgUHJvZHVjdAotX1VJX1N0YXRlX1JlZ2lvbl9mZWF0dXJlID0gUmVnaW9uCi1fVUlfU3RhdGVfc3VibWFjaGluZV9mZWF0dXJlID0gU3VibWFjaGluZQotX1VJX1ZlcnRleF9jb250YWluZXJfZmVhdHVyZSA9IENvbnRhaW5lcgotX1VJX1ZlcnRleF9vdXRnb2luZ19mZWF0dXJlID0gT3V0Z29pbmcKLV9VSV9WZXJ0ZXhfaW5jb21pbmdfZmVhdHVyZSA9IEluY29taW5nCi1fVUlfUmVnaW9uX1ZlcnRleF9mZWF0dXJlID0gVmVydGV4Ci1fVUlfUmVnaW9uX1RyYW5zaXRpb25fZmVhdHVyZSA9IFRyYW5zaXRpb24KLV9VSV9SZWdpb25fU3RhdGVfZmVhdHVyZSA9IFN0YXRlCi1fVUlfUmVnaW9uX1N0YXRlTWFjaGluZV9mZWF0dXJlID0gU3RhdGUgTWFjaGluZQotX1VJX1N0YXRlTWFjaGluZV9SZWdpb25fZmVhdHVyZSA9IFJlZ2lvbgotX1VJX1RyYW5zaXRpb25fV29ya0RlZmluaXRpb25fZmVhdHVyZSA9IFdvcmsgRGVmaW5pdGlvbgotX1VJX1RyYW5zaXRpb25fY29udGFpbmVyX2ZlYXR1cmUgPSBDb250YWluZXIKLV9VSV9UcmFuc2l0aW9uX3NvdXJjZV9mZWF0dXJlID0gU291cmNlCi1fVUlfVHJhbnNpdGlvbl90YXJnZXRfZmVhdHVyZSA9IFRhcmdldAotX1VJX0Rpc2NpcGxpbmVfdGFza3NfZmVhdHVyZSA9IFRhc2tzCi1fVUlfRGlzY2lwbGluZV9zdWJkaXNjaXBsaW5lX2ZlYXR1cmUgPSBTdWJkaXNjaXBsaW5lCi1fVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSA9IFJlZmVyZW5jZSBXb3JrZmxvd3MKLV9VSV9Sb2xlU2V0X3JvbGVzX2ZlYXR1cmUgPSBSb2xlcwotX1VJX0RvbWFpbl93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFdvcmsgUHJvZHVjdHMKLV9VSV9Eb21haW5fc3ViZG9tYWluc19mZWF0dXJlID0gU3ViZG9tYWlucwotX1VJX1dvcmtQcm9kdWN0VHlwZV93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFdvcmsgUHJvZHVjdHMKLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IERpc2NpcGxpbmVzCi1fVUlfVG9vbF90b29sTWVudG9yc19mZWF0dXJlID0gVG9vbCBNZW50b3JzCi1fVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUgPSBSb2xlIFNldHMKLV9VSV9DdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX2ZlYXR1cmUgPSBDYXRlZ29yaXplZCBFbGVtZW50cwotX1VJX0N1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfZmVhdHVyZSA9IFN1YiBDYXRlZ29yaWVzCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2VkdWNhdGlvbk1hdGVyaWFsc19mZWF0dXJlID0gRWR1Y2F0aW9uIE1hdGVyaWFscwotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19jb21tdW5pY2F0aW9uc01hdGVyaWFsc19mZWF0dXJlID0gQ29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzCi1fVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUgPSBJbmNsdWRlcyBQYXR0ZXJucwotX1VJX1Byb2Nlc3NfZGVmYXVsdENvbnRleHRfZmVhdHVyZSA9IERlZmF1bHQgQ29udGV4dAotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBWYWxpZCBDb250ZXh0Ci1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlID0gQmFzZWQgT24gUHJvY2Vzc2VzCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF9pbnRlcmZhY2VzX2ZlYXR1cmUgPSBJbnRlcmZhY2VzCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX2ZlYXR1cmUgPSBQcm9jZXNzCi1fVUlfUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX2ZlYXR1cmUgPSBQcm9jZXNzIEVsZW1lbnRzCi1fVUlfUHJvY2Vzc1BhY2thZ2VfZGlhZ3JhbXNfZmVhdHVyZSA9IERpYWdyYW1zCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19mZWF0dXJlID0gSW50ZXJmYWNlIFNwZWNpZmljYXRpb25zCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VJT19mZWF0dXJlID0gSW50ZXJmYWNlIElPCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlID0gUHJvY2VzcyBDb21wb25lbnQKLV9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSA9IFVzZXIgQ2hhbmdlYWJsZQotX1VJX01ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19mZWF0dXJlID0gTWV0aG9kIFBhY2thZ2VzCi1fVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUgPSBCYXNlcwotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSA9IFZhcmlhYmlsaXR5IFR5cGUKLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlID0gVmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudAotX1VJX01ldGhvZFVuaXRfYXV0aG9yc19mZWF0dXJlID0gQXV0aG9ycwotX1VJX01ldGhvZFVuaXRfY2hhbmdlRGF0ZV9mZWF0dXJlID0gQ2hhbmdlIERhdGUKLV9VSV9NZXRob2RVbml0X2NoYW5nZURlc2NyaXB0aW9uX2ZlYXR1cmUgPSBDaGFuZ2UgRGVzY3JpcHRpb24KLV9VSV9NZXRob2RVbml0X3ZlcnNpb25fZmVhdHVyZSA9IFZlcnNpb24KLV9VSV9NZXRob2RVbml0X2NvcHlyaWdodFN0YXRlbWVudF9mZWF0dXJlID0gQ29weXJpZ2h0IFN0YXRlbWVudAotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fbWV0aG9kUGx1Z2luU2VsZWN0aW9uX2ZlYXR1cmUgPSBNZXRob2QgUGx1Zy1pbiBTZWxlY3Rpb24KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBhY2thZ2VTZWxlY3Rpb25fZmVhdHVyZSA9IE1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbgotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fcHJvY2Vzc1ZpZXdzX2ZlYXR1cmUgPSBQcm9jZXNzIFZpZXdzCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9kZWZhdWx0Vmlld19mZWF0dXJlID0gRGVmYXVsdCBWaWV3Ci1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9iYXNlQ29uZmlndXJhdGlvbnNfZmVhdHVyZSA9IEJhc2UgQ29uZmlndXJhdGlvbnMKLV9VSV9Qcm9jZXNzRmFtaWx5X2RlbGl2ZXJ5UHJvY2Vzc2VzX2ZlYXR1cmUgPSBEZWxpdmVyeSBQcm9jZXNzZXMKLV9VSV9NZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfZmVhdHVyZSA9IE1ldGhvZCBQbHVnLWlucwotX1VJX01ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX2ZlYXR1cmUgPSBQcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zCi1fVUlfVW5rbm93bl9mZWF0dXJlID0gVW5zcGVjaWZpZWQKLQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9TdGFydF9saXRlcmFsID0gZmluaXNoVG9TdGFydAotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9GaW5pc2hfbGl0ZXJhbCA9IGZpbmlzaFRvRmluaXNoCi1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvU3RhcnRfbGl0ZXJhbCA9IHN0YXJ0VG9TdGFydAotX1VJX1dvcmtPcmRlclR5cGVfc3RhcnRUb0ZpbmlzaF9saXRlcmFsID0gc3RhcnRUb0ZpbmlzaAotX1VJX1BzZXVkb1N0YXRlS2luZF9pbml0aWFsX2xpdGVyYWwgPSBpbml0aWFsCi1fVUlfUHNldWRvU3RhdGVLaW5kX2pvaW5fbGl0ZXJhbCA9IGpvaW4KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZm9ya19saXRlcmFsID0gZm9yawotX1VJX1BzZXVkb1N0YXRlS2luZF9qdW5jdGlvbl9saXRlcmFsID0ganVuY3Rpb24KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfY2hvaWNlX2xpdGVyYWwgPSBjaG9pY2UKLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZW50cnlQb2ludF9saXRlcmFsID0gZW50cnlQb2ludAotX1VJX1BzZXVkb1N0YXRlS2luZF9leGl0UG9pbnRfbGl0ZXJhbCA9IGV4aXRQb2ludAotX1VJX1BzZXVkb1N0YXRlS2luZF90ZXJtaW5hdGVfbGl0ZXJhbCA9IHRlcm1pbmF0ZQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9uYV9saXRlcmFsID0gbmEKLV9VSV9WYXJpYWJpbGl0eVR5cGVfY29udHJpYnV0ZXNfbGl0ZXJhbCA9IGNvbnRyaWJ1dGVzCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2V4dGVuZHNfbGl0ZXJhbCA9IGV4dGVuZHMKLV9VSV9WYXJpYWJpbGl0eVR5cGVfcmVwbGFjZXNfbGl0ZXJhbCA9IHJlcGxhY2VzCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsQ29udHJpYnV0aW9uX2xpdGVyYWwgPSBsb2NhbENvbnRyaWJ1dGlvbgotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbFJlcGxhY2VtZW50X2xpdGVyYWwgPSBsb2NhbFJlcGxhY2VtZW50Ci1fVUlfQXJ0aWZhY3REZXNjcmlwdG9yX3R5cGUgPSBBcnRpZmFjdCBEZXNjcmlwdG9yCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBEZWxpdmVyYWJsZSBEZXNjcmlwdG9yCi1fVUlfT3V0Y29tZURlc2NyaXB0b3JfdHlwZSA9IE91dGNvbWUgRGVzY3JpcHRvcgotX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV90eXBlID0gTWV0aG9kIEVsZW1lbnQgUHJvcGVydHkKLV9VSV9NZXRob2RFbGVtZW50X21ldGhvZEVsZW1lbnRQcm9wZXJ0eV9mZWF0dXJlID0gTWV0aG9kIEVsZW1lbnQgUHJvcGVydHkKLV9VSV9NZXRob2RFbGVtZW50UHJvcGVydHlfdmFsdWVfZmVhdHVyZSA9IFZhbHVlCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9zdWJ0cmFjdGVkQ2F0ZWdvcnlfZmVhdHVyZSA9IFN1YnRyYWN0ZWQgQ2F0ZWdvcnkKLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2FkZGVkQ2F0ZWdvcnlfZmVhdHVyZSA9IEFkZGVkIENhdGVnb3J5Ci1fVUlfVmFyaWFiaWxpdHlUeXBlX2V4dGVuZHNSZXBsYWNlc19saXRlcmFsID0gZXh0ZW5kc1JlcGxhY2VzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjRmNzY4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPCEtLQotIDxjb3B5cmlnaHQ+Ci0gPC9jb3B5cmlnaHQ+Ci0KLSAkSWQkCi0tLT4KLQotPHBsdWdpbj4KLSAgICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQuaXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcmllcyI+Ci0gICAgPGZhY3RvcnkgCi0gICAgICAgdXJpID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMy91bWEuZWNvcmUiIAotICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiIAotICAgICAgIHN1cHBvcnRlZFR5cGVzID0gCi0gICAgICAgICAib3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIKLSAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIKLSAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIKLSAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIKLSAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlIiAvPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGQ3OWVlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLQotLyoqCi0gKiBBIGNvbW1hbmQgdGhhdCBjcmVhdGVzIGFuIHVuaW5pdGlhbGl6ZWQgY29weSBvZiBhIG1ldGhvZCBlbGVtZW50LiBUaGUKLSAqIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbiB3aWxsIGJlIGV4ZWN1dGVkIHVzaW5nCi0gKiB7QGxpbmsgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZH0uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVDb3B5Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKiAgICAgICAgICAgIHRoZSBlZGl0aW5nIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCBiZWluZyBjb3BpZWQKLQkgKiBAcGFyYW0gY29weUhlbHBlcgotCSAqICAgICAgICAgICAgYSBoZWxwZXIgY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgY29waWVkIG9iamVjdHMKLQkgKiAgICAgICAgICAgIGFuZCB0aGVpciBhc3NvY2lhdGVkIGNvcGllcwotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlIZWxwZXIgY29weUhlbHBlcikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBjb3B5SGVscGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZXN1bHQgb2YgdGhlIGNvcHkgb3BlcmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGNvcGllZCBtZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBkb0dldFJlc3VsdCgpIHsKLQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gc3VwZXIuZG9HZXRSZXN1bHQoKTsKLQotCQlpZiAoZG9tYWluIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZG9tYWluKS5hZGRDb3B5SW5mbygKLQkJCQkJY29sbGVjdGlvbiwgY29weUhlbHBlcik7Ci0JCX0KLQotCQlyZXR1cm4gY29sbGVjdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MWEzMjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Jbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIEEgY29tbWFuZCB0aGF0IHRha2VzIGFuIHVuaW5pdGlhbGl6ZWQgY29weSBvZiBhIG1ldGhvZCBlbGVtZW50IGFuZCBzZXRzIGEgbmV3Ci0gKiBHVUlELiBJZiB0aGUgb3JpZ2luYWwgZWxlbWVudCBpcyBhIDxjb2RlPkNvbnRlbnRFbGVtZW50PC9jb2RlPiB3aXRoIGEgdmFsaWQKLSAqIDxjb2RlPkNvbnRlbnREZXNjcmlwdGlvbjwvY29kZT4sIGEgY29weSBvZiB0aGUKLSAqIDxjb2RlPkNvbnRlbnREZXNjcmlwdGlvbjwvY29kZT4gaXMgYWxzbyBjcmVhdGVkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZCBleHRlbmRzIEluaXRpYWxpemVDb3B5Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKiAgICAgICAgICAgIHRoZSBlZGl0aW5nIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCBiZWluZyBjb3BpZWQKLQkgKiBAcGFyYW0gY29weUhlbHBlcgotCSAqICAgICAgICAgICAgYSBoZWxwZXIgY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgY29waWVkIG9iamVjdHMKLQkgKiAgICAgICAgICAgIGFuZCB0aGVpciBhc3NvY2lhdGVkIGNvcGllcwotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgY29weUhlbHBlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkluaXRpYWxpemVDb3B5Q29tbWFuZCNkb0V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLQkJLy8gZ2VuZXJhdGUgbmV3IEdVSUQgZm9yIHRoZSBjb3B5Ci0JCS8vCi0JCWlmIChjb3B5IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKChNZXRob2RFbGVtZW50KSBjb3B5KTsKLQkJCWlmIChlIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkJRU9iamVjdCBlQ29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7Ci0JCQkJaWYgKGVDb250YWluZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWUuc2V0R3VpZChVbWFVdGlsLmdlbmVyYXRlR1VJRCgoKE1ldGhvZEVsZW1lbnQpIGVDb250YWluZXIpCi0JCQkJCQkJLmdldEd1aWQoKSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWUuc2V0R3VpZChVbWFVdGlsLmdlbmVyYXRlR1VJRCgpKTsKLQkJCQkJVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5sb2coIk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ6IGVDb250YWluZXIgbm90IGluaXRpYWxpemVkIGZvciAiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWUuc2V0R3VpZChVbWFVdGlsLmdlbmVyYXRlR1VJRCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEl0ZXJhdGVzIG92ZXIgdGhlIHJlZmVyZW5jZXMgb2YgdGhlIG93bmVyIG9iamVjdCBhbmQgc2V0cyB0aGVtCi0JICogYWNjb3JkaW5nbHkgaW4gdGhlIGNvcHkuIEluY2x1ZGVzIGNvcGluZyBvZiBvcHBvc2l0ZSBmZWF0dXJlcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9Db3B5UmVmZXJlbmNlcygpIHsKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQlzdXBlci5jb3B5UmVmZXJlbmNlcygpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgcmVmZXJlbmNlcyA9IGdldFJlZmVyZW5jZXNUb0NvcHkoKS5pdGVyYXRvcigpOyByZWZlcmVuY2VzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUVSZWZlcmVuY2UgcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIHJlZmVyZW5jZXMubmV4dCgpOwotCQkJaWYgKCFyZWZlcmVuY2UuaXNDaGFuZ2VhYmxlKCkgfHwgcmVmZXJlbmNlLmlzRGVyaXZlZCgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCUVSZWZlcmVuY2UgcmV2ZXJzZVJlZmVyZW5jZSA9IHJlZmVyZW5jZS5nZXRFT3Bwb3NpdGUoKTsKLQotCQkJT2JqZWN0IHZhbHVlID0gb3duZXIuZUdldChyZWZlcmVuY2UpOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9IE9wcG9zaXRlRmVhdHVyZQotCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlKHJlZmVyZW5jZSk7Ci0JCQlib29sZWFuIGNvcGllZFRhcmdldFJlcXVpcmVkID0gcmV2ZXJzZVJlZmVyZW5jZSAhPSBudWxsCi0JCQkJCXx8IHJlZmVyZW5jZS5pc0NvbnRhaW5tZW50KCkKLQkJCQkJfHwgKG9wcG9zaXRlRmVhdHVyZSAhPSBudWxsICYmICFvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpOwotCQkJLy8gIm1hbnkiIG9wcG9zaXRlIGZlYXR1cmUgZG9lcyBub3QgcmVxdWlyZSBjb3BpZWQgdGFyZ2V0LCBpdCBpcwotCQkJLy8gdHJlYXRlZCBhcyBhIHJlZ3VsYXIgbm9uLWNvbnRhaW5tZW50IHJlZmVyZW5jZQotCQkJLy8gVE9ETzogYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIGFyZSBub3QgYXV0b21hdGljYWxseSBjb3BpZWQgaW4KLQkJCS8vIEVNRiBpbXBsZW1lbnRhdGlvbgotCQkJaWYgKHJlZmVyZW5jZS5pc01hbnkoKSkgewotCQkJCUxpc3QgdmFsdWVMaXN0ID0gKExpc3QpIHZhbHVlOwotCQkJCWlmICghdmFsdWVMaXN0LmlzRW1wdHkoKSkgewotCQkJCQlFTGlzdCBjb3B5TGlzdCA9IChFTGlzdCkgY29weS5lR2V0KHJlZmVyZW5jZSk7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoSXRlcmF0b3IgdmFsdWVJdGVyID0gdmFsdWVMaXN0Lml0ZXJhdG9yKCk7IHZhbHVlSXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7ICsraW5kZXgpIHsKLQkJCQkJCUVPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJb2JqZWN0ID0gKEVPYmplY3QpIHZhbHVlSXRlci5uZXh0KCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCVVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJfQotCQkJCQkJRU9iamVjdCB0YXJnZXQgPSBjb3B5SGVscGVyLmdldENvcHlUYXJnZXQob2JqZWN0LAotCQkJCQkJCQljb3BpZWRUYXJnZXRSZXF1aXJlZCk7Ci0JCQkJCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQkJCQkJYnJlYWs7IC8vIGlmIG9uZSBpcyBudWxsLCB0aGV5J2xsIGFsbCBiZSBudWxsCi0JCQkJCQlpZiAocmV2ZXJzZVJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJCQkJaW50IHBvc2l0aW9uID0gY29weUxpc3QuaW5kZXhPZih0YXJnZXQpOwotCQkJCQkJCWlmIChwb3NpdGlvbiA9PSAtMSkgewotCQkJCQkJCQljb3B5TGlzdC5hZGQoaW5kZXgsIHRhcmdldCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJY29weUxpc3QubW92ZShpbmRleCwgdGFyZ2V0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNvcHlMaXN0LmFkZCh0YXJnZXQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlFT2JqZWN0IHRhcmdldCA9IGNvcHlIZWxwZXIuZ2V0Q29weVRhcmdldCgoRU9iamVjdCkgdmFsdWUsCi0JCQkJCQljb3BpZWRUYXJnZXRSZXF1aXJlZCk7Ci0JCQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQkJCWNvcHkuZVNldChyZWZlcmVuY2UsIHRhcmdldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weVJlZmVyZW5jZXMoKSB7Ci0JCWRvQ29weVJlZmVyZW5jZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvY29tbWFuZC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2NvbW1hbmQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MDFlYjhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvY29tbWFuZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tYW5kcyBmb3IgY29weWluZyB0aGUgVU1BIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9kb21haW4vVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDg2MWM3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBBIHRyYWNlYWJsZSBhZGFwdGVyIGZhY3RvcnkgZWRpdGluZyBkb21haW4gdXNlZCBmb3IgY29weWluZyBtZXRob2QgZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZXh0ZW5kcwotCQlBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gewotCi0JLy8gTWFwcyBjb3BpZWQgbWV0aG9kIGVsZW1lbnRzIHRvIHRoZWlyIG9yaWdpbmFsIGNvdW50ZXJwYXJ0cy4KLQkvLyBOb3RlOiBDb3BpZWQgZWxlbWVudHMgYXJlIGNvcGllcyBvZiB0aGUgY2xpcGJvYXJkIGNvcGllcy4KLQlwcml2YXRlIEhhc2hNYXAgY29weVRvT3JpZ2luYWxNYXAgPSBudWxsOwotCi0JLy8gTWFwcyBvcmlnaW5hbCBlbGVtZW50cyB0byB0aGVpciBjbGlwYm9hcmQgY29waWVzLgotCXByaXZhdGUgTWFwIG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFkYXB0ZXIgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciB0byB3aGljaCBjYWxscwotCSAqICAgICAgICAgICAgYXJlIGRlbGVnYXRlZAotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIGEgY29tbWFuZCBzdGFjawotCSAqLwotCXB1YmxpYyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2spOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhbiBhZGFwdGVyIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgdG8gd2hpY2ggY2FsbHMKLQkgKiAgICAgICAgICAgIGFyZSBkZWxlZ2F0ZWQKLQkgKiBAcGFyYW0gY29tbWFuZFN0YWNrCi0JICogICAgICAgICAgICBhIGNvbW1hbmQgc3RhY2sKLQkgKiBAcGFyYW0gcmVzb3VyY2VUb1JlYWRPbmx5TWFwCi0JICogICAgICAgICAgICBjb250cm9scyB3aGV0aGVyIHRoZSBkb21haW4gaXMgcmVhZCBvbmx5Ci0JICovCi0JcHVibGljIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIE1hcCByZXNvdXJjZVRvUmVhZE9ubHlNYXApIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgcmVzb3VyY2VUb1JlYWRPbmx5TWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgYW4gYWRhcHRlciBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSBhZGFwdGVyIHRvIHdoaWNoIGNhbGxzCi0JICogICAgICAgICAgICBhcmUgZGVsZWdhdGVkCi0JICogQHBhcmFtIGNvbW1hbmRTdGFjawotCSAqICAgICAgICAgICAgYSBjb21tYW5kIHN0YWNrCi0JICogQHBhcmFtIHJlc291cmNlU2V0Ci0JICogICAgICAgICAgICBhIHJlc291cmNlIHNldAotCSAqLwotCXB1YmxpYyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCByZXNvdXJjZVNldCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG1hcCBjb250YWluaW5nIHRoZSBjb3BpZWQgZWxlbWVudHMgbWFwcGVkIHRvIHRoZWlyIG9yaWdpbmFsCi0JICogY291bnRlcnBhcnRzLgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgY29waWVkIGVsZW1lbnRzIG1hcHBlZCB0byB0aGVpciBvcmlnaW5hbAotCSAqICAgICAgICAgY291bnRlcnBhcnRzCi0JICovCi0JcHVibGljIE1hcCBnZXRDb3B5VG9PcmlnaW5hbE1hcCgpIHsKLQkJaWYgKGNvcHlUb09yaWdpbmFsTWFwID09IG51bGwpIHsKLQkJCWNvcHlUb09yaWdpbmFsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlyZXR1cm4gY29weVRvT3JpZ2luYWxNYXA7Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgZWxlbWVudHMgbWFwcGVkIHRvIHRoZWlyIGNvcGllZCAKLQkgKiBjb3VudGVycGFydHMgb24gY2xpcGJvYXJkCi0JICogCi0JICogQHJldHVybiBhIG1hcCBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBlbGVtZW50cyBtYXBwZWQgdG8gdGhlaXIgY29waWVkIAotCSAqICAgICAgICAgY291bnRlcnBhcnRzCi0JICovCi0JcHVibGljIE1hcCBnZXRPcmlnaW5hbFRvQ2xpcGJvYXJkTWFwKCkgewotCQlpZiAob3JpZ2luYWxUb0NsaXBib2FyZE1hcCA9PSBudWxsKSB7Ci0JCQlvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlyZXR1cm4gb3JpZ2luYWxUb0NsaXBib2FyZE1hcDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGJ5IHRoZSBDcmVhdGVDb3B5Q29tbWFuZC4gQWRkcyBpbmZvbWF0aW9uIHRvIGNvbnN0cnVjdCBtYXBzIHRoYXQKLQkgKiBrZWVwIHRyYWNrIG9mIHRoZSBvcmlnaW5hbCBtZXRob2QgZWxlbWVudHMgYW5kIHRoZWlyIGNvcGllcy4KLQkgKiAKLQkgKiBAcGFyYW0gYwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIHRvIHN0b3JlIHRoZSBtYXBwaW5nIGluZm8KLQkgKiBAcGFyYW0gY29weUhlbHBlcgotCSAqICAgICAgICAgICAgYSBoZWxwZXIgY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgY29waWVkIG9iamVjdHMKLQkgKiAgICAgICAgICAgIGFuZCB0aGVpciBhc3NvY2lhdGVkIGNvcGllcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvcHlJbmZvKENvbGxlY3Rpb24gYywgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJaWYgKGlzTmV3Q29weShjLCBjb3B5SGVscGVyKSkgewotCQkJYWRkTmV3Q29weShjLCBjb3B5SGVscGVyKTsKLQkJCXJldHVybjsKLQkJfSBlbHNlIHsKLQkJCWNoYWluQ29weShjLCBjb3B5SGVscGVyKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgZWxlbWVudCB0aGF0IGlzIGJlaW5nIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGROZXdDb3B5KENvbGxlY3Rpb24gYywgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJLy8gdGhpcyBtZWFucyB3ZSBhcmUgY29weWluZyB0aGUgQ29sbGVjdGlvbiBjIHRvIHRoZSBjbGlwYm9hcmQKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPT0gbnVsbCkKLQkJCW9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlJdGVyYXRvciBpdGVyID0gY29weUhlbHBlci5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBrZXkgPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCB2YWx1ZSA9IGNvcHlIZWxwZXIuZ2V0KGtleSk7Ci0JCQlvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwLnB1dChrZXksIHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBtYXAgZnJvbSB0aGUgY29waWVkIGVsZW1lbnRzIHRvIHRoZWlyIG9yaWdpbmFsIGNvdW50ZXJwYXJ0cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhaW5Db3B5KENvbGxlY3Rpb24gYywgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJLy8gY2hhaW4gdGhlIG1hcHMgLSBjaGFuZ2UgdGhlIGNvcHlUb09yaWdpbmFsTWFwCi0JCWlmIChvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwICE9IG51bGwpIHsKLQkJCWlmIChjb3B5VG9PcmlnaW5hbE1hcCA9PSBudWxsKQotCQkJCWNvcHlUb09yaWdpbmFsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbzJDS2V5ID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IG8yQ1ZhbHVlID0gb3JpZ2luYWxUb0NsaXBib2FyZE1hcC5nZXQobzJDS2V5KTsKLQkJCQlPYmplY3QgY29weVZhbHVlID0gY29weUhlbHBlci5nZXQobzJDVmFsdWUpOwotCQkJCWlmIChjb3B5VmFsdWUgPT0gbnVsbCkgewotCQkJCQkvLyBlcnJvcgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKG8yQ0tleSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQkJCWNvcHlUb09yaWdpbmFsTWFwLnB1dChjb3B5VmFsdWUsIG8yQ0tleSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXdDb3B5KENvbGxlY3Rpb24gYywgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJLy8gb3JpZ2luYWxUb0NsaXBib2FyZE1hcCB3YXMgc2V0IHRvIG51bGwgYXQgc3RhcnQgb2YgY29weSBjb21tYW5kCi0JCWlmIChvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQkvLyBpdGVyYXRlIHRocm91Z2ggY29weUhlbHBlciBtYXAsIHNlZSBpZiBhbnkgY29weUhlbHBlciBrZXlzIGFyZSBvMkMKLQkJLy8gdmFsdWVzLCB3aGljaCBtZWFucyB3ZSBhcmUgY29weWluZyBjbGlwYm9hcmQKLQkJSXRlcmF0b3IgaXRlciA9IGNvcHlIZWxwZXIua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgY2xpcEtleSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwLmNvbnRhaW5zVmFsdWUoY2xpcEtleSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGNvcHkgbWFwcy4gSXQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoaW4gdGhlIGNvcHkgYWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0Q29weU1hcHMoKSB7Ci0JCWlmIChvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwICE9IG51bGwpIHsKLQkJCW9yaWdpbmFsVG9DbGlwYm9hcmRNYXAuY2xlYXIoKTsKLQkJCW9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPSBudWxsOwotCQl9Ci0JCWlmIChjb3B5VG9PcmlnaW5hbE1hcCAhPSBudWxsKSB7Ci0JCQljb3B5VG9PcmlnaW5hbE1hcC5jbGVhcigpOwotCQkJY29weVRvT3JpZ2luYWxNYXAgPSBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyOWVhNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9kb21haW4vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGRlZmF1bHQgZWRpdGluZyBkb21haW4gZm9yIHRoZSBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjMTU5YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFB1cnBvc2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFsdGVybmF0aXZlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSG93dG9TdGFmZlByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHVycG9zZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFB1cnBvc2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBbHRlcm5hdGl2ZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbHRlcm5hdGl2ZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlIiwgIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIb3d0byBTdGFmZiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEhvd3RvU3RhZmZQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkYsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9BY3Rpdml0eURlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEFjdGl2aXR5RGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiNWNkODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRWYXJpYWJpbGl0eVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEJyZWFrZG93bkVsZW1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSb2FkbWFwc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3VwcG9ydGluZ01hdGVyaWFsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ2hlY2tsaXN0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29uY2VwdHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEV4YW1wbGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRHdWlkZWxpbmVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZXVzYWJsZUFzc2V0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSXNFbmFjdGFibGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWYXJpYWJpbGl0eVR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSIsICJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2hlY2tsaXN0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoZWNrbGlzdHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlfY2hlY2tsaXN0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FjdGl2aXR5X2NoZWNrbGlzdHNfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fQ0hFQ0tMSVNUUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb25jZXB0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbmNlcHRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0FjdGl2aXR5X2NvbmNlcHRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWN0aXZpdHlfY29uY2VwdHNfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fQ09OQ0VQVFMsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXhhbXBsZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeGFtcGxlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FjdGl2aXR5X2V4YW1wbGVzX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0VYQU1QTEVTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEd1aWRlbGluZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHdWlkZWxpbmVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0FjdGl2aXR5X2d1aWRlbGluZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eV9ndWlkZWxpbmVzX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0dVSURFTElORVMsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmV1c2FibGUgQXNzZXRzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmV1c2FibGVBc3NldHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlfcmV1c2FibGVBc3NldHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eV9yZXVzYWJsZUFzc2V0c19mZWF0dXJlIiwgIl9VSV9BY3Rpdml0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19SRVVTQUJMRV9BU1NFVFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgRW5hY3RhYmxlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNFbmFjdGFibGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlfaXNFbmFjdGFibGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eV9pc0VuYWN0YWJsZV9mZWF0dXJlIiwgIl9VSV9BY3Rpdml0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19JU19FTkFDVEFCTEUsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTik7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04pOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCcmVha2Rvd25FbGVtZW50c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eV9icmVha2Rvd25FbGVtZW50c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSb2FkbWFwcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJvYWRtYXBzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0FjdGl2aXR5X3JvYWRtYXBzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWN0aXZpdHlfcm9hZG1hcHNfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fUk9BRE1BUFMsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3VwcG9ydGluZyBNYXRlcmlhbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0FjdGl2aXR5X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eV9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUxTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEFjdGl2aXR5LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0FjdGl2aXR5IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEFjdGl2aXR5KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0FjdGl2aXR5X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQWN0aXZpdHkuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19JU19FTkFDVEFCTEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyZTQ3NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJV29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRCcmllZk91dGxpbmVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlcHJlc2VudGF0aW9uT3B0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQnJpZWYgT3V0bGluZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJyaWVmT3V0bGluZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX2JyaWVmT3V0bGluZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fYnJpZWZPdXRsaW5lX2ZlYXR1cmUiLCAiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXByZXNlbnRhdGlvbiBPcHRpb25zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVwcmVzZW50YXRpb25PcHRpb25zUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9yZXByZXNlbnRhdGlvbk9wdGlvbnNfZmVhdHVyZSIsICJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEFydGlmYWN0RGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQXJ0aWZhY3REZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChBcnRpZmFjdERlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcnRpZmFjdEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQXJ0aWZhY3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzM4OWZhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcnRpZmFjdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3R9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0SXRlbVByb3ZpZGVyIGV4dGVuZHMgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBBcnRpZmFjdC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9BcnRpZmFjdCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChBcnRpZmFjdCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQXJ0aWZhY3RfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFydGlmYWN0LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXJ0aWZhY3QoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwYTc4MmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRVc2FnZUd1aWRhbmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBVc2FnZSBHdWlkYW5jZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFVzYWdlR3VpZGFuY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3VzYWdlR3VpZGFuY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZWEwZjFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQcmVmaXhQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZElzUGxhbm5lZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSXNPcHRpb25hbFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUHJlc2VudGVkQWZ0ZXJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFByZXNlbnRlZEJlZm9yZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3VwZXJBY3Rpdml0aWVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcmVmaXggZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcmVmaXhQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9wcmVmaXhfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3ByZWZpeF9mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWCwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBQbGFubmVkIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNQbGFubmVkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNQbGFubmVkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9pc1BsYW5uZWRfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVELAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEhhc011bHRpcGxlT2NjdXJyZW5jZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9oYXNNdWx0aXBsZU9jY3VycmVuY2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9oYXNNdWx0aXBsZU9jY3VycmVuY2VzX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIE9wdGlvbmFsIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNPcHRpb25hbFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X2lzT3B0aW9uYWxfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2lzT3B0aW9uYWxfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcmVzZW50ZWQgQWZ0ZXIgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcmVzZW50ZWRBZnRlclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEFmdGVyX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRBZnRlcl9mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcmVzZW50ZWQgQmVmb3JlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlc2VudGVkQmVmb3JlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQmVmb3JlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRCZWZvcmVfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN1cGVyIEFjdGl2aXRpZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdXBlckFjdGl2aXRpZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9zdXBlckFjdGl2aXRpZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3N1cGVyQWN0aXZpdGllc19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEJyZWFrZG93bkVsZW1lbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQnJlYWtkb3duRWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEJyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBsYW5uaW5nRGF0YSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwMWJkNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgZXh0ZW5kcyBQcm9jZXNzSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDYXBhYmlsaXR5UGF0dGVybi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDYXBhYmlsaXR5UGF0dGVybikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DaGVja2xpc3RJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NoZWNrbGlzdEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZTMzOTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NoZWNrbGlzdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tsaXN0SXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDaGVja2xpc3RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDaGVja2xpc3QuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ2hlY2tsaXN0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENoZWNrbGlzdCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9DaGVja2xpc3RfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NoZWNrbGlzdF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2xhc3NpZmllckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2xhc3NpZmllckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNGRjYTU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NsYXNzaWZpZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NpZmllckl0ZW1Qcm92aWRlciBleHRlbmRzIFR5cGVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDbGFzc2lmaWVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ2xhc3NpZmllci5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9DbGFzc2lmaWVyIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENsYXNzaWZpZXIpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ2xhc3NpZmllcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ2xhc3NpZmllcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYzMyZjBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEFnZ3JlZ2F0ZWRSb2xlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWdncmVnYXRlZCBSb2xlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFnZ3JlZ2F0ZWRSb2xlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db21wb3NpdGVSb2xlX2FnZ3JlZ2F0ZWRSb2xlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbXBvc2l0ZVJvbGVfYWdncmVnYXRlZFJvbGVzX2ZlYXR1cmUiLCAiX1VJX0NvbXBvc2l0ZVJvbGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb21wb3NpdGVSb2xlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvbXBvc2l0ZVJvbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29tcG9zaXRlUm9sZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Db21wb3NpdGVSb2xlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db21wb3NpdGVSb2xlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db25jZXB0SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db25jZXB0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjMTg0MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29uY2VwdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25jZXB0SXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25jZXB0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29uY2VwdC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Db25jZXB0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbmNlcHQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29uY2VwdF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ29uY2VwdF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZGU0NmM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnN0cmFpbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludEl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQm9keVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQm9keSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJvZHlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUiLCAiX1VJX0NvbnN0cmFpbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05TVFJBSU5UX19CT0RZLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbnN0cmFpbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ29uc3RyYWludCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb25zdHJhaW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvbnN0cmFpbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NvbnN0cmFpbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbnN0cmFpbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19CT0RZOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzNmMzhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb250ZW50Q2F0ZWdvcnkuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ29udGVudENhdGVnb3J5IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbnRlbnRDYXRlZ29yeSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Db250ZW50Q2F0ZWdvcnlfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRDYXRlZ29yeV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQ2ZmUzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RVbml0SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTWFpbkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRLZXlDb25zaWRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWFpbiBEZXNjcmlwdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1haW5EZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudERlc2NyaXB0aW9uX21haW5EZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEtleSBDb25zaWRlcmF0aW9ucyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEtleUNvbnNpZGVyYXRpb25zUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9rZXlDb25zaWRlcmF0aW9uc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9rZXlDb25zaWRlcmF0aW9uc19mZWF0dXJlIiwgIl9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbnRlbnREZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Db250ZW50RGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29udGVudERlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb250ZW50RGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3Rpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3RlcCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMwZDA5NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVmFyaWFiaWxpdHlUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25jZXB0c0FuZFBhcGVyc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ2hlY2tsaXN0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkR3VpZGVsaW5lc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRXhhbXBsZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFzc2V0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFyaWFiaWxpdHkgVHlwZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhcmlhYmlsaXR5VHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSIsICJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb25jZXB0cyBBbmQgUGFwZXJzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29uY2VwdHNBbmRQYXBlcnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19mZWF0dXJlIiwgIl9VSV9Db250ZW50RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDaGVja2xpc3RzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hlY2tsaXN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF9jaGVja2xpc3RzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudEVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlIiwgIl9VSV9Db250ZW50RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBHdWlkZWxpbmVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkR3VpZGVsaW5lc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudEVsZW1lbnRfZ3VpZGVsaW5lc19mZWF0dXJlIiwgIl9VSV9Db250ZW50RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeGFtcGxlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4YW1wbGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X2V4YW1wbGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudEVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSIsICJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFzc2V0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFzc2V0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF9hc3NldHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RWxlbWVudF9hc3NldHNfZmVhdHVyZSIsICJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0FTU0VUUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdXBwb3J0aW5nIE1hdGVyaWFscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cHBvcnRpbmdNYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudEVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSIsICJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbnRlbnRFbGVtZW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvbnRlbnRFbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbnRlbnRFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29udGVudEVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZGMyNTc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbnRlbnRQYWNrYWdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvbnRlbnRQYWNrYWdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbnRlbnRQYWNrYWdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvbnRlbnRQYWNrYWdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50UGFja2FnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2soKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFydGlmYWN0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyYWJsZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0Y29tZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uY2VwdCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2hlY2tsaXN0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeGFtcGxlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkZWxpbmUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlcG9ydCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVtcGxhdGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbE1lbnRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2hpdGVwYXBlcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVybURlZmluaXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByYWN0aWNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJldXNhYmxlQXNzZXQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVTZXQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURvbWFpbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRvb2woKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVTZXRHcm91cGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvYWRtYXAoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTQ5ZTAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFbGVtZW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlIiwgIl9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0N1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhNzg2ZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQ2F0ZWdvcml6ZWRFbGVtZW50c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3ViQ2F0ZWdvcmllc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2F0ZWdvcml6ZWQgRWxlbWVudHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDYXRlZ29yaXplZEVsZW1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0N1c3RvbUNhdGVnb3J5X2NhdGVnb3JpemVkRWxlbWVudHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9DdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX2ZlYXR1cmUiLCAiX1VJX0N1c3RvbUNhdGVnb3J5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdWIgQ2F0ZWdvcmllcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1YkNhdGVnb3JpZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0N1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfZmVhdHVyZSIsICJfVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SSUVTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEN1c3RvbUNhdGVnb3J5LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0N1c3RvbUNhdGVnb3J5IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEN1c3RvbUNhdGVnb3J5KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0N1c3RvbUNhdGVnb3J5X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9DdXN0b21DYXRlZ29yeV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDk0ZjU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRXh0ZXJuYWxEZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUGFja2FnaW5nR3VpZGFuY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEV4dGVybmFsIERlc2NyaXB0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXh0ZXJuYWxEZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX2V4dGVybmFsRGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX2V4dGVybmFsRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQYWNrYWdpbmcgR3VpZGFuY2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYWNrYWdpbmdHdWlkYW5jZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3BhY2thZ2luZ0d1aWRhbmNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9wYWNrYWdpbmdHdWlkYW5jZV9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcmFibGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2ZTRkMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcmFibGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciBleHRlbmRzIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGREZWxpdmVyZWRXb3JrUHJvZHVjdHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsaXZlcmVkV29ya1Byb2R1Y3RzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlIiwgIl9VSV9EZWxpdmVyYWJsZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEZWxpdmVyYWJsZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EZWxpdmVyYWJsZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEZWxpdmVyYWJsZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EZWxpdmVyYWJsZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YWQwN2I0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFNjYWxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSaXNrTGV2ZWxQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEVzdGltYXRpbmdUZWNobmlxdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFByb2plY3RNZW1iZXJFeHBlcnRpc2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFR5cGVPZkNvbnRyYWN0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTY2FsZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNjYWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3NjYWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcm9qZWN0IENoYXJhY3RlcmlzdGljcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByb2plY3RDaGFyYWN0ZXJpc3RpY3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RDaGFyYWN0ZXJpc3RpY3NfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSaXNrIExldmVsIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmlza0xldmVsUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXN0aW1hdGluZyBUZWNobmlxdWUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFc3RpbWF0aW5nVGVjaG5pcXVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX2VzdGltYXRpbmdUZWNobmlxdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9lc3RpbWF0aW5nVGVjaG5pcXVlX2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvamVjdE1lbWJlckV4cGVydGlzZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdE1lbWJlckV4cGVydGlzZV9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIE9mIENvbnRyYWN0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZU9mQ29udHJhY3RQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZU9mQ29udHJhY3RfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0U6Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNTI0YmUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc30gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgUHJvY2Vzc0l0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEVkdWNhdGlvbk1hdGVyaWFsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVkdWNhdGlvbiBNYXRlcmlhbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFZHVjYXRpb25NYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzX2VkdWNhdGlvbk1hdGVyaWFsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc19lZHVjYXRpb25NYXRlcmlhbHNfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb21tdW5pY2F0aW9ucyBNYXRlcmlhbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21tdW5pY2F0aW9uc01hdGVyaWFsc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NfY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NfY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUxTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERlbGl2ZXJ5UHJvY2Vzcy5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3MiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGVsaXZlcnlQcm9jZXNzKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVzY3JpYmFibGVFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjE1MGI4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpYmFibGVFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUHJlc2VudGF0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2hhcGVpY29uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGROb2RlaWNvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJlc2VudGF0aW9uIE5hbWUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcmVzZW50YXRpb25OYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSIsICJfVUlfRGVzY3JpYmFibGVFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2hhcGVpY29uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2hhcGVpY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9zaGFwZWljb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUiLCAiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOb2RlaWNvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vZGVpY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9ub2RlaWNvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9ub2RlaWNvbl9mZWF0dXJlIiwgIl9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTik7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERlc2NyaWJhYmxlRWxlbWVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EZXNjcmliYWJsZUVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpYmFibGVFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVzY3JpcHRvckRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiNmJkYjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVzY3JpcHRvckRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSZWZpbmVkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlZmluZWQgRGVzY3JpcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZpbmVkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3JlZmluZWREZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl9yZWZpbmVkRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEZXNjcmlwdG9yRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGVzY3JpcHRvckRlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlc2NyaXB0b3JEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVzY3JpcHRvckRlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNzUyY2M3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvcl9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlIiwgIl9VSV9EZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERlc2NyaXB0b3IuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGVzY3JpcHRvciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEZXNjcmlwdG9yKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0Rlc2NyaXB0b3JfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaXB0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZWIzNWE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNWaXNpYmxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZWZlcmVuY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIFZpc2libGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc1Zpc2libGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUVsZW1lbnRfaXNWaXNpYmxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlhZ3JhbUVsZW1lbnRfaXNWaXNpYmxlX2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlZmVyZW5jZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlZmVyZW5jZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtRWxlbWVudF9yZWZlcmVuY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaWFncmFtRWxlbWVudF9yZWZlcmVuY2VfZmVhdHVyZSIsICJfVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERpYWdyYW1FbGVtZW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0RpYWdyYW1FbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERpYWdyYW1FbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0RpYWdyYW1FbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlhZ3JhbUVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJhNzExMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JhcGhOb2RlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFpvb21Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERpYWdyYW1MaW5rUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBab29tIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkWm9vbVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSIsICJfVUlfRGlhZ3JhbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fX1pPT00sIHRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEaWFncmFtIExpbmsgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaWFncmFtTGlua1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtX2RpYWdyYW1MaW5rX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlhZ3JhbV9kaWFncmFtTGlua19mZWF0dXJlIiwgIl9VSV9EaWFncmFtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fRElBR1JBTV9MSU5LLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19WSUVXUE9JTlQpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19OQU1FU1BBQ0UpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEaWFncmFtLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0RpYWdyYW0iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGlhZ3JhbSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EaWFncmFtX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaWFncmFtLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0U6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fVklFV1BPSU5ULCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVBvaW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fX05BTUVTUEFDRSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19OQU1FU1BBQ0UsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19OQU1FU1BBQ0UsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRAotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fVklFV1BPSU5UCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fTElOSwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fTkFNRVNQQUNFOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUxpbmtJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpYWdyYW1MaW5rSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmZWY3ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUxpbmtJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGlua30gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUxpbmtJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1MaW5rSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkWm9vbVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGlhZ3JhbVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgWm9vbSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFpvb21Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUxpbmtfem9vbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSIsICJfVUlfRGlhZ3JhbUxpbmtfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0xJTktfX1pPT00sIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGlhZ3JhbSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERpYWdyYW1Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUxpbmtfZGlhZ3JhbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSIsICJfVUlfRGlhZ3JhbUxpbmtfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0xJTktfX0RJQUdSQU0sIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fTElOS19fVklFV1BPUlQpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEaWFncmFtTGluay5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EaWFncmFtTGluayIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEaWFncmFtTGluaykgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EaWFncmFtTGlua190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUxpbmtfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpYWdyYW1MaW5rLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19aT09NOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fVklFV1BPUlQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9MSU5LX19WSUVXUE9SVCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb2ludCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGltZW5zaW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaW1lbnNpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGEzN2U0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaW1lbnNpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGltZW5zaW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpbWVuc2lvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFdpZHRoUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRIZWlnaHRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdpZHRoIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV2lkdGhQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUiLCAiX1VJX0RpbWVuc2lvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJTUVOU0lPTl9fV0lEVEgsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSGVpZ2h0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGVpZ2h0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpbWVuc2lvbl9oZWlnaHRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaW1lbnNpb25faGVpZ2h0X2ZlYXR1cmUiLCAiX1VJX0RpbWVuc2lvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJTUVOU0lPTl9fSEVJR0hULCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERpbWVuc2lvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EaW1lbnNpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCURvdWJsZSBsYWJlbFZhbHVlID0gKChEaW1lbnNpb24pIG9iamVjdCkuZ2V0V2lkdGgoKTsKLQkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0RpbWVuc2lvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGltZW5zaW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaW1lbnNpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX1dJRFRIOgotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19IRUlHSFQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3OTFlMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGREaXNjaXBsaW5lc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGlzY2lwbGluZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaXNjaXBsaW5lc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSIsICJfVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGlzY2lwbGluZUdyb3VwaW5nLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0Rpc2NpcGxpbmVHcm91cGluZyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEaXNjaXBsaW5lR3JvdXBpbmcpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzNkOWZlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRUYXNrc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVmZXJlbmNlV29ya2Zsb3dzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYXNrcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRhc2tzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVfdGFza3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaXNjaXBsaW5lX3Rhc2tzX2ZlYXR1cmUiLCAiX1VJX0Rpc2NpcGxpbmVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19UQVNLUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWZlcmVuY2UgV29ya2Zsb3dzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVmZXJlbmNlV29ya2Zsb3dzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVfcmVmZXJlbmNlV29ya2Zsb3dzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSIsICJfVUlfRGlzY2lwbGluZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1MsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkUpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEaXNjaXBsaW5lLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0Rpc2NpcGxpbmUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGlzY2lwbGluZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaXNjaXBsaW5lLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyMjQwNTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW59IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERvbWFpbkl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvbWFpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV29yayBQcm9kdWN0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Eb21haW5fd29ya1Byb2R1Y3RzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRG9tYWluX3dvcmtQcm9kdWN0c19mZWF0dXJlIiwgIl9VSV9Eb21haW5fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU5fX1dPUktfUFJPRFVDVFMsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPTUFJTl9fU1VCRE9NQUlOUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERvbWFpbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Eb21haW4iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRG9tYWluKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0RvbWFpbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRG9tYWluX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEb21haW4uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9NQUlOX19TVUJET01BSU5TLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZURvbWFpbigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YzcwNDA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEVsZW1lbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0VsZW1lbnRfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRWxsaXBzZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRWxsaXBzZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YzY0OTVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VsbGlwc2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVsbGlwc2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHcmFwaGljUHJpbWl0aXZlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWxsaXBzZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFJhZGl1c1hQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJhZGl1c1lQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJvdGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdGFydEFuZ2xlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFbmRBbmdsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmFkaXVzIFggZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSYWRpdXNYUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0VsbGlwc2VfcmFkaXVzWF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VsbGlwc2VfcmFkaXVzWF9mZWF0dXJlIiwgIl9VSV9FbGxpcHNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxMSVBTRV9fUkFESVVTX1gsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmFkaXVzIFkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSYWRpdXNZUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0VsbGlwc2VfcmFkaXVzWV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VsbGlwc2VfcmFkaXVzWV9mZWF0dXJlIiwgIl9VSV9FbGxpcHNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxMSVBTRV9fUkFESVVTX1ksIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm90YXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSb3RhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9FbGxpcHNlX3JvdGF0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9yb3RhdGlvbl9mZWF0dXJlIiwgIl9VSV9FbGxpcHNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxMSVBTRV9fUk9UQVRJT04sIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3RhcnQgQW5nbGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdGFydEFuZ2xlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0VsbGlwc2Vfc3RhcnRBbmdsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VsbGlwc2Vfc3RhcnRBbmdsZV9mZWF0dXJlIiwgIl9VSV9FbGxpcHNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxMSVBTRV9fU1RBUlRfQU5HTEUsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRW5kIEFuZ2xlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW5kQW5nbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VsbGlwc2VfZW5kQW5nbGVfZmVhdHVyZSIsICJfVUlfRWxsaXBzZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkVMTElQU0VfX0VORF9BTkdMRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxMSVBTRV9fQ0VOVEVSKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRWxsaXBzZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9FbGxpcHNlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEVsbGlwc2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRWxsaXBzZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19YOgotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1k6Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19ST1RBVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1NUQVJUX0FOR0xFOgotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fRU5EX0FOR0xFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19DRU5URVIsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlUG9pbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUwZDgyOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FeGFtcGxlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FeGFtcGxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyZWY0NGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRXhhbXBsZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGFtcGxlSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeGFtcGxlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRXhhbXBsZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9FeGFtcGxlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEV4YW1wbGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRXhhbXBsZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRXhhbXBsZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoQ29ubmVjdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI2OGI1YjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlciBleHRlbmRzIEdyYXBoRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoQ29ubmVjdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkR3JhcGhFZGdlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBHcmFwaCBFZGdlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkR3JhcGhFZGdlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWRnZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWRnZV9mZWF0dXJlIiwgIl9VSV9HcmFwaENvbm5lY3Rvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBHcmFwaENvbm5lY3Rvci5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HcmFwaENvbm5lY3RvciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHcmFwaENvbm5lY3Rvcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HcmFwaENvbm5lY3Rvcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhDb25uZWN0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRAotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0xJTksKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoRWRnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhFZGdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxMjg1MjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhFZGdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoRWRnZUl0ZW1Qcm92aWRlciBleHRlbmRzIEdyYXBoRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWRnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEFuY2hvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQW5jaG9yIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5jaG9yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0dyYXBoRWRnZV9hbmNob3JfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HcmFwaEVkZ2VfYW5jaG9yX2ZlYXR1cmUiLCAiX1VJX0dyYXBoRWRnZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VER0VfX0FOQ0hPUiwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRURHRV9fV0FZUE9JTlRTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgR3JhcGhFZGdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0dyYXBoRWRnZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHcmFwaEVkZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfR3JhcGhFZGdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaEVkZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEdyYXBoRWRnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX1dBWVBPSU5UUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FREdFX19XQVlQT0lOVFMsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlUG9pbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRAotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRURHRV9fV0FZUE9JTlRTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fTElOSwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWRkOGJmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04pOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19MSU5LKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgR3JhcGhFbGVtZW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0dyYXBoRWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHcmFwaEVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfR3JhcGhFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaEVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEdyYXBoRWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOgotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSzoKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRToKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvaW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaWFncmFtTGluaygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhDb25uZWN0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlZmVyZW5jZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoRWRnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhOb2RlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaWFncmFtKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRleHRFbGVtZW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbWFnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9seWxpbmUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVsbGlwc2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fTElOSywgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVEaWFncmFtTGluaygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhDb25uZWN0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVECi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fTElOSwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhOb2RlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaE5vZGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODEzNjliNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaE5vZGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoTm9kZUl0ZW1Qcm92aWRlciBleHRlbmRzIEdyYXBoRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoTm9kZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9OT0RFX19TSVpFKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgR3JhcGhOb2RlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0dyYXBoTm9kZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHcmFwaE5vZGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfR3JhcGhOb2RlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaE5vZGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEdyYXBoTm9kZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfTk9ERV9fU0laRSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVEaW1lbnNpb24oKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRAotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0xJTksKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoaWNQcmltaXRpdmVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoaWNQcmltaXRpdmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjQzYTVlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaGljUHJpbWl0aXZlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoaWNQcmltaXRpdmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBMZWFmRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoaWNQcmltaXRpdmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBHcmFwaGljUHJpbWl0aXZlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0dyYXBoaWNQcmltaXRpdmUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3JhcGhpY1ByaW1pdGl2ZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3ZjBmYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEF0dGFjaG1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBdHRhY2htZW50cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF0dGFjaG1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fYXR0YWNobWVudHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX2F0dGFjaG1lbnRzX2ZlYXR1cmUiLCAiX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HdWlkYW5jZURlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEd1aWRhbmNlRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoR3VpZGFuY2VEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0d1aWRhbmNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiYzE2ZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBHdWlkYW5jZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HdWlkYW5jZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHdWlkYW5jZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HdWlkYW5jZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0d1aWRlbGluZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGVsaW5lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkNGYzMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGVsaW5lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkZWxpbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEd1aWRlbGluZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEd1aWRlbGluZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HdWlkZWxpbmUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3VpZGVsaW5lKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0d1aWRlbGluZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3VpZGVsaW5lX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9JbWFnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvSW1hZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZlNzgxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9JbWFnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEltYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMgTGVhZkVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbWFnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFVyaVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTWltZVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFVyaSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFVyaVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9JbWFnZV91cmlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbWFnZV91cmlfZmVhdHVyZSIsICJfVUlfSW1hZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5JTUFHRV9fVVJJLCB0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWltZSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWltZVR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbWFnZV9taW1lVHlwZV9mZWF0dXJlIiwgIl9VSV9JbWFnZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLklNQUdFX19NSU1FX1RZUEUsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSW1hZ2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvSW1hZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoSW1hZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSW1hZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0ltYWdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJbWFnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19VUkk6Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fTUlNRV9UWVBFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9JdGVyYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0l0ZXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYTBkYjc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0l0ZXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEl0ZXJhdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSXRlcmF0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSXRlcmF0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0l0ZXJhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChJdGVyYXRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSXRlcmF0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9JdGVyYXRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9MZWFmRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTGVhZkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDhjNmFiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9MZWFmRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExlYWZFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMZWFmRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIExlYWZFbGVtZW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0xlYWZFbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKExlYWZFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0xlYWZFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9MZWFmRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ODI1ZGQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZFVuaXRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTWV0aG9kUGx1Z2luU2VsZWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRNZXRob2RQYWNrYWdlU2VsZWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcm9jZXNzVmlld3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERlZmF1bHRWaWV3UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRCYXNlQ29uZmlndXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN1YnRyYWN0ZWRDYXRlZ29yeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWRkZWRDYXRlZ29yeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWV0aG9kIFBsdWdpbiBTZWxlY3Rpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRob2RQbHVnaW5TZWxlY3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBsdWdpblNlbGVjdGlvbl9mZWF0dXJlIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1ldGhvZFBhY2thZ2VTZWxlY3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUiLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByb2Nlc3MgVmlld3MgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9jZXNzVmlld3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9wcm9jZXNzVmlld3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFV1MsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVmYXVsdCBWaWV3IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdFZpZXdQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9kZWZhdWx0Vmlld19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fZGVmYXVsdFZpZXdfZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQmFzZSBDb25maWd1cmF0aW9ucyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJhc2VDb25maWd1cmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fYmFzZUNvbmZpZ3VyYXRpb25zX2ZlYXR1cmUiLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdWJ0cmFjdGVkIENhdGVnb3J5IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3VidHJhY3RlZENhdGVnb3J5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fc3VidHJhY3RlZENhdGVnb3J5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9zdWJ0cmFjdGVkQ2F0ZWdvcnlfZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFkZGVkIENhdGVnb3J5IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWRkZWRDYXRlZ29yeVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX2FkZGVkQ2F0ZWdvcnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX2FkZGVkQ2F0ZWdvcnlfZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXRob2RDb25maWd1cmF0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzMDUzODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkR3VpZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQnJpZWZEZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3VwcHJlc3NlZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkT3JkZXJpbmdHdWlkZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgR3VpZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEd1aWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUiLCAiX1VJX01ldGhvZEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fR1VJRCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJyaWVmRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX01ldGhvZEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3VwcHJlc3NlZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cHByZXNzZWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudF9zdXBwcmVzc2VkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kRWxlbWVudF9zdXBwcmVzc2VkX2ZlYXR1cmUiLCAiX1VJX01ldGhvZEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBPcmRlcmluZyBHdWlkZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE9yZGVyaW5nR3VpZGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudF9vcmRlcmluZ0d1aWRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kRWxlbWVudF9vcmRlcmluZ0d1aWRlX2ZlYXR1cmUiLCAiX1VJX01ldGhvZEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTWV0aG9kRWxlbWVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9NZXRob2RFbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kRWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlEOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCS8vIFN0YXJ0IGN1c3RvbSBjb2RlIC8vCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTZjYjU4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHl9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVBhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYWx1ZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV92YWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV92YWx1ZV9mZWF0dXJlIiwgIl9VSV9NZXRob2RFbGVtZW50UHJvcGVydHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTWV0aG9kRWxlbWVudFByb3BlcnR5LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L01ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNZXRob2RFbGVtZW50UHJvcGVydHkpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudFByb3BlcnR5X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50UHJvcGVydHlfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxODk1MzM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kVW5pdEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUyk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE1ldGhvZExpYnJhcnkuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNZXRob2RMaWJyYXJ5KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX01ldGhvZExpYnJhcnlfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZExpYnJhcnlfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1ldGhvZExpYnJhcnkuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlM6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0ZhbWlseSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MDIyZDM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEdsb2JhbFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmV1c2VkUGFja2FnZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEdsb2JhbCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RQYWNrYWdlX2dsb2JhbF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFBhY2thZ2VfZ2xvYmFsX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBhY2thZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJldXNlZCBQYWNrYWdlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJldXNlZFBhY2thZ2VzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFBhY2thZ2VfcmV1c2VkUGFja2FnZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RQYWNrYWdlX3JldXNlZFBhY2thZ2VzX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBhY2thZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTWV0aG9kUGFja2FnZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZFBhY2thZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFja2FnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFja2FnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kUGFja2FnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5OTYwMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kVW5pdEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFVzZXJDaGFuZ2VhYmxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRCYXNlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVXNlciBDaGFuZ2VhYmxlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXNlckNoYW5nZWFibGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGx1Z2luX3VzZXJDaGFuZ2VhYmxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kUGx1Z2luX3VzZXJDaGFuZ2VhYmxlX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBsdWdpbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCYXNlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJhc2VzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFBsdWdpbl9iYXNlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFBsdWdpbl9iYXNlc19mZWF0dXJlIiwgIl9VSV9NZXRob2RQbHVnaW5fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19CQVNFUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE1ldGhvZFBsdWdpbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWV0aG9kUGx1Z2luKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX01ldGhvZFBsdWdpbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGx1Z2luX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RQbHVnaW4uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFVuaXRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFVuaXRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDQwYjJlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RVbml0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFVuaXRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kVW5pdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEF1dGhvcnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENoYW5nZURhdGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENoYW5nZURlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWZXJzaW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb3B5cmlnaHRTdGF0ZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEF1dGhvcnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdXRob3JzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfYXV0aG9yc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfYXV0aG9yc19mZWF0dXJlIiwgIl9VSV9NZXRob2RVbml0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVRfX0FVVEhPUlMsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2hhbmdlIERhdGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGFuZ2VEYXRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfY2hhbmdlRGF0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfY2hhbmdlRGF0ZV9mZWF0dXJlIiwgIl9VSV9NZXRob2RVbml0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENoYW5nZSBEZXNjcmlwdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoYW5nZURlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfY2hhbmdlRGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RVbml0X2NoYW5nZURlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZlcnNpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWZXJzaW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlIiwgIl9VSV9NZXRob2RVbml0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVRfX1ZFUlNJT04sIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29weXJpZ2h0IFN0YXRlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvcHlyaWdodFN0YXRlbWVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RVbml0X2NvcHlyaWdodFN0YXRlbWVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXRob2RVbml0LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L01ldGhvZFVuaXQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWV0aG9kVW5pdCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RVbml0X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RVbml0X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RVbml0LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0YzA3M2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWxlc3RvbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1pbGVzdG9uZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE1pbGVzdG9uZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9NaWxlc3RvbmUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWlsZXN0b25lKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX01pbGVzdG9uZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTWlsZXN0b25lX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9OYW1lZEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL05hbWVkRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYjRmY2Q2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL05hbWVkRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTmFtZWRFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5hbWVkRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSIsICJfVUlfTmFtZWRFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBOYW1lZEVsZW1lbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvTmFtZWRFbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE5hbWVkRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9OYW1lZEVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX05hbWVkRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTmFtZWRFbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTmFtZXNwYWNlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9OYW1lc3BhY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzNlZjE2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9OYW1lc3BhY2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZXNwYWNlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5hbWVzcGFjZUl0ZW1Qcm92aWRlciBleHRlbmRzIE5hbWVkRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5hbWVzcGFjZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE5hbWVzcGFjZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9OYW1lc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTmFtZXNwYWNlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX05hbWVzcGFjZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTmFtZXNwYWNlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9PdXRjb21lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9PdXRjb21lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5NjVlM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvT3V0Y29tZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRjb21lSXRlbVByb3ZpZGVyIGV4dGVuZHMgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPdXRjb21lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgT3V0Y29tZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9PdXRjb21lIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE91dGNvbWUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfT3V0Y29tZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfT3V0Y29tZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjIyNWUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMgTmFtZXNwYWNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBhY2thZ2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUGFja2FnZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUGFja2FnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUGFja2FnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGFja2FnZWFibGVFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QYWNrYWdlYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDZiNDA4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QYWNrYWdlYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIE5hbWVkRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBhY2thZ2VhYmxlRWxlbWVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9QYWNrYWdlYWJsZUVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUGFja2FnZWFibGVFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1BhY2thZ2VhYmxlRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUGFja2FnZWFibGVFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QaGFzZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGhhc2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQ1ZjA5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QaGFzZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQaGFzZUl0ZW1Qcm92aWRlciBleHRlbmRzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGhhc2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQaGFzZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9QaGFzZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQaGFzZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9QaGFzZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUGhhc2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QbGFubmluZ0RhdGFJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzJlNmVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQbGFubmluZ0RhdGFJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRTdGFydERhdGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEZpbmlzaERhdGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJhbmtQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN0YXJ0IERhdGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdGFydERhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUGxhbm5pbmdEYXRhX3N0YXJ0RGF0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BsYW5uaW5nRGF0YV9zdGFydERhdGVfZmVhdHVyZSIsICJfVUlfUGxhbm5pbmdEYXRhX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBGaW5pc2ggRGF0ZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZpbmlzaERhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUGxhbm5pbmdEYXRhX2ZpbmlzaERhdGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QbGFubmluZ0RhdGFfZmluaXNoRGF0ZV9mZWF0dXJlIiwgIl9VSV9QbGFubmluZ0RhdGFfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSYW5rIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmFua1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QbGFubmluZ0RhdGFfcmFua19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BsYW5uaW5nRGF0YV9yYW5rX2ZlYXR1cmUiLCAiX1VJX1BsYW5uaW5nRGF0YV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBMQU5OSU5HX0RBVEFfX1JBTkssIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuSU5URUdSQUxfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBsYW5uaW5nRGF0YS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9QbGFubmluZ0RhdGEiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUGxhbm5pbmdEYXRhKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1BsYW5uaW5nRGF0YV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUGxhbm5pbmdEYXRhX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQbGFubmluZ0RhdGEuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qb2ludEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUG9pbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTAxNTNlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qb2ludEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9pbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRYUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRZUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBYIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkWFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qb2ludF94X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9pbnRfeF9mZWF0dXJlIiwgIl9VSV9Qb2ludF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBPSU5UX19YLCB0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgWSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUG9pbnRfeV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvaW50X3lfZmVhdHVyZSIsICJfVUlfUG9pbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QT0lOVF9fWSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBvaW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1BvaW50IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlEb3VibGUgbGFiZWxWYWx1ZSA9ICgoUG9pbnQpIG9iamVjdCkuZ2V0WCgpOwotCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUG9pbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1BvaW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQb2ludC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19YOgotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlRfX1k6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BvbHlsaW5lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qb2x5bGluZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZmE5NWY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BvbHlsaW5lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvbHlsaW5lSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JhcGhpY1ByaW1pdGl2ZUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvbHlsaW5lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQ2xvc2VkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDbG9zZWQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDbG9zZWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUG9seWxpbmVfY2xvc2VkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9seWxpbmVfY2xvc2VkX2ZlYXR1cmUiLCAiX1VJX1BvbHlsaW5lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUE9MWUxJTkVfX0NMT1NFRCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuUE9MWUxJTkVfX1dBWVBPSU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBvbHlsaW5lLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1BvbHlsaW5lIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBvbHlsaW5lKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1BvbHlsaW5lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qb2x5bGluZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUG9seWxpbmUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fQ0xPU0VEOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19XQVlQT0lOVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUE9MWUxJTkVfX1dBWVBPSU5UUywgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVQb2ludCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NDBkNDk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBZGRpdGlvbmFsSW5mb1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUHJvYmxlbVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQmFja2dyb3VuZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkR29hbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFwcGxpY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRMZXZlbHNPZkFkb3B0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBZGRpdGlvbmFsIEluZm8gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZGRpdGlvbmFsSW5mb1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hZGRpdGlvbmFsSW5mb19mZWF0dXJlIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcm9ibGVtIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvYmxlbVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3Byb2JsZW1fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3Byb2JsZW1fZmVhdHVyZSIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJhY2tncm91bmQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCYWNrZ3JvdW5kUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgR29hbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHb2Fsc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2dvYWxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9nb2Fsc19mZWF0dXJlIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFwcGxpY2F0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXBwbGljYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hcHBsaWNhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYXBwbGljYXRpb25fZmVhdHVyZSIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMZXZlbHMgT2YgQWRvcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMZXZlbHNPZkFkb3B0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fbGV2ZWxzT2ZBZG9wdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fbGV2ZWxzT2ZBZG9wdGlvbl9mZWF0dXJlIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcmFjdGljZURlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1ByYWN0aWNlRGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJhY3RpY2VEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFM6Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QcmFjdGljZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJhY3RpY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTEwOTAyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QcmFjdGljZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByYWN0aWNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQ29udGVudFJlZmVyZW5jZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFjdGl2aXR5UmVmZXJlbmNlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29udGVudCBSZWZlcmVuY2VzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udGVudFJlZmVyZW5jZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJhY3RpY2VfY29udGVudFJlZmVyZW5jZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QcmFjdGljZV9jb250ZW50UmVmZXJlbmNlc19mZWF0dXJlIiwgIl9VSV9QcmFjdGljZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVMsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWN0aXZpdHkgUmVmZXJlbmNlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFjdGl2aXR5UmVmZXJlbmNlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSIsICJfVUlfUHJhY3RpY2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcmFjdGljZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9QcmFjdGljZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcmFjdGljZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9QcmFjdGljZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJhY3RpY2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByYWN0aWNlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2UoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YTJiZjFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQcm9jZXNzQ29tcG9uZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcm9jZXNzIENvbXBvbmVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByb2Nlc3NDb21wb25lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX1Byb2Nlc3NDb21wb25lbnRfZmVhdHVyZSIsICJfVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjlmYTBjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUyk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUzoKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlMsCi0JCQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjBiMjFlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQXV0aG9yc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ2hhbmdlRGF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ2hhbmdlRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvcHlyaWdodFN0YXRlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSW50ZXJmYWNlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXV0aG9ycyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF1dGhvcnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fQVVUSE9SUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDaGFuZ2UgRGF0ZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoYW5nZURhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2hhbmdlIERlc2NyaXB0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfY2hhbmdlRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfTWV0aG9kVW5pdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmVyc2lvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fVkVSU0lPTiwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb3B5cmlnaHQgU3RhdGVtZW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29weXJpZ2h0U3RhdGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9jb3B5cmlnaHRTdGF0ZW1lbnRfZmVhdHVyZSIsICJfVUlfTWV0aG9kVW5pdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEludGVyZmFjZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbnRlcmZhY2VzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRfaW50ZXJmYWNlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Byb2Nlc3NDb21wb25lbnRfaW50ZXJmYWNlc19mZWF0dXJlIiwgIl9VSV9Qcm9jZXNzQ29tcG9uZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb2Nlc3NDb21wb25lbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb2Nlc3NDb21wb25lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyeVByb2Nlc3MoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M7Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYWQwOTI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEV4dGVybmFsSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNjb3BlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRVc2FnZU5vdGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeHRlcm5hbCBJZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVybmFsSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlIiwgIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTY29wZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNjb3BlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9zY29wZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9zY29wZV9mZWF0dXJlIiwgIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBVc2FnZSBOb3RlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFVzYWdlTm90ZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3VzYWdlTm90ZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdXNhZ2VOb3Rlc19mZWF0dXJlIiwgIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9jZXNzRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc0Rlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFByb2Nlc3NEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRToKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0VsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTZkYzFkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9jZXNzRWxlbWVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Qcm9jZXNzRWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9jZXNzRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0VsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzg2YWJjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHl9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZERlbGl2ZXJ5UHJvY2Vzc2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZWxpdmVyeSBQcm9jZXNzZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWxpdmVyeVByb2Nlc3Nlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRmFtaWx5X2RlbGl2ZXJ5UHJvY2Vzc2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc0ZhbWlseV9kZWxpdmVyeVByb2Nlc3Nlc19mZWF0dXJlIiwgIl9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19GQU1JTFlfX0RFTElWRVJZX1BST0NFU1NFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9jZXNzRmFtaWx5LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Byb2Nlc3NGYW1pbHkiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJvY2Vzc0ZhbWlseSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjMjI4NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3N9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJbmNsdWRlc1BhdHRlcm5zUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREZWZhdWx0Q29udGV4dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmFsaWRDb250ZXh0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbmNsdWRlcyBQYXR0ZXJucyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEluY2x1ZGVzUGF0dGVybnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZWZhdWx0IENvbnRleHQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0Q29udGV4dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc19kZWZhdWx0Q29udGV4dF9mZWF0dXJlIiwgIl9VSV9Qcm9jZXNzX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19fREVGQVVMVF9DT05URVhULCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhbGlkIENvbnRleHQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWYWxpZENvbnRleHRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc192YWxpZENvbnRleHRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9jZXNzX3ZhbGlkQ29udGV4dF9mZWF0dXJlIiwgIl9VSV9Qcm9jZXNzX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19fVkFMSURfQ09OVEVYVCwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9jZXNzLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Byb2Nlc3MiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb2Nlc3NfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTE3NmE0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUyk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9jZXNzUGFja2FnZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Qcm9jZXNzUGFja2FnZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9jZXNzUGFja2FnZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzUGFja2FnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc1BhY2thZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb2Nlc3NQYWNrYWdlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTOgotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1pbGVzdG9uZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVhbVByb2ZpbGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBsYW5uaW5nRGF0YSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9zaXRlUm9sZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlhZ3JhbSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4YzQ0MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEJhc2VkT25Qcm9jZXNzZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJhc2VkIE9uIFByb2Nlc3NlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJhc2VkT25Qcm9jZXNzZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX2Jhc2VkT25Qcm9jZXNzZXNfZmVhdHVyZSIsICJfVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb3BlcnR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzMTg5MjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUl0ZW1Qcm92aWRlciBleHRlbmRzIERpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRLZXlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBLZXkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRLZXlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUiLCAiX1VJX1Byb3BlcnR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPUEVSVFlfX0tFWSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhbHVlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlfdmFsdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9wZXJ0eV92YWx1ZV9mZWF0dXJlIiwgIl9VSV9Qcm9wZXJ0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST1BFUlRZX19WQUxVRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9wZXJ0eS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Qcm9wZXJ0eSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9wZXJ0eSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb3BlcnR5LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX0tFWToKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19WQUxVRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHNldWRvU3RhdGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BzZXVkb1N0YXRlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1ZDQyNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHNldWRvU3RhdGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFBzZXVkb1N0YXRlSXRlbVByb3ZpZGVyLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjozOSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHNldWRvU3RhdGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBzZXVkb1N0YXRlSXRlbVByb3ZpZGVyIGV4dGVuZHMgVmVydGV4SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHNldWRvU3RhdGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQc2V1ZG9TdGF0ZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Qc2V1ZG9TdGF0ZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX1BzZXVkb1N0YXRlX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JlZmVyZW5jZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVmZXJlbmNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyYTgzZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVmZXJlbmNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlZmVyZW5jZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZWZlcmVuY2VkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUmVmZXJlbmNlX2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVmZXJlbmNlX2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uX2ZlYXR1cmUiLCAiX1VJX1JlZmVyZW5jZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJFRkVSRU5DRV9fSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWZlcmVuY2VkIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVmZXJlbmNlZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9SZWZlcmVuY2VfcmVmZXJlbmNlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JlZmVyZW5jZV9yZWZlcmVuY2VkX2ZlYXR1cmUiLCAiX1VJX1JlZmVyZW5jZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJFRkVSRU5DRV9fUkVGRVJFTkNFRCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSZWZlcmVuY2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUmVmZXJlbmNlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJlZmVyZW5jZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9SZWZlcmVuY2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1JlZmVyZW5jZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVmZXJlbmNlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9SZWdpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JlZ2lvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMzEyMWVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JlZ2lvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVnaW9uSXRlbVByb3ZpZGVyLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjozOSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlZ2lvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5SRUdJT05fX1ZFUlRFWCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlJFR0lPTl9fVFJBTlNJVElPTik7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJlZ2lvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9SZWdpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRTdHJpbmcoIl9VSV9SZWdpb25fdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVnaW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUkVHSU9OX19WRVJURVg6Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1RSQU5TSVRJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVHSU9OX19WRVJURVgsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlVmVydGV4KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJFR0lPTl9fVkVSVEVYLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVN0YXRlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJFR0lPTl9fVkVSVEVYLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVBzZXVkb1N0YXRlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJFR0lPTl9fVFJBTlNJVElPTiwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVUcmFuc2l0aW9uKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9SZXBvcnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JlcG9ydEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMDVlODA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JlcG9ydEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVwb3J0SXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXBvcnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSZXBvcnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUmVwb3J0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJlcG9ydCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9SZXBvcnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1JlcG9ydF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjAwMWRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJldXNhYmxlQXNzZXQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUmV1c2FibGVBc3NldCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSZXVzYWJsZUFzc2V0KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1JldXNhYmxlQXNzZXRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1JldXNhYmxlQXNzZXRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvYWRtYXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvYWRtYXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjkxZDc3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2FkbWFwSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXB9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvYWRtYXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvYWRtYXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb2FkbWFwLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1JvYWRtYXAiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUm9hZG1hcCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Sb2FkbWFwX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2FkbWFwX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZTI5YjYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkU2tpbGxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBc3NpZ25tZW50QXBwcm9hY2hlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3lub255bXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNraWxscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNraWxsc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRpb25fc2tpbGxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZURlc2NyaXB0aW9uX3NraWxsc19mZWF0dXJlIiwgIl9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXNzaWdubWVudCBBcHByb2FjaGVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXNzaWdubWVudEFwcHJvYWNoZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZURlc2NyaXB0aW9uX2Fzc2lnbm1lbnRBcHByb2FjaGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZURlc2NyaXB0aW9uX2Fzc2lnbm1lbnRBcHByb2FjaGVzX2ZlYXR1cmUiLCAiX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTeW5vbnltcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN5bm9ueW1zUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlIiwgIl9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb2xlRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUm9sZURlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvbGVEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUm9sZURlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTOgotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNTllYjFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSb2xlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRNb2RpZmllc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVzcG9uc2libGVGb3JQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJvbGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSb2xlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1JvbGVEZXNjcmlwdG9yX1JvbGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2xlRGVzY3JpcHRvcl9Sb2xlX2ZlYXR1cmUiLCAiX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVE9SX19ST0xFLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1vZGlmaWVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTW9kaWZpZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZURlc2NyaXB0b3JfbW9kaWZpZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlIiwgIl9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVMsIGZhbHNlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlc3BvbnNpYmxlIEZvciBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlc3BvbnNpYmxlRm9yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1JvbGVEZXNjcmlwdG9yX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSIsICJfVUlfUm9sZURlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb2xlRGVzY3JpcHRvci5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Sb2xlRGVzY3JpcHRvciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSb2xlRGVzY3JpcHRvcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZURlc2NyaXB0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGYyNTAxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2xlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRNb2RpZmllc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVzcG9uc2libGVGb3JQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1vZGlmaWVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTW9kaWZpZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZV9tb2RpZmllc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVfbW9kaWZpZXNfZmVhdHVyZSIsICJfVUlfUm9sZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfX01PRElGSUVTLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXNwb25zaWJsZSBGb3IgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNwb25zaWJsZUZvclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlIiwgIl9VSV9Sb2xlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9fUkVTUE9OU0lCTEVfRk9SLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJvbGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUm9sZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSb2xlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1JvbGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1JvbGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiMTA0YzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSb2xlU2V0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm9sZSBTZXRzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUm9sZVNldHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUiLCAiX1VJX1JvbGVTZXRHcm91cGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUm9sZVNldEdyb3VwaW5nLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1JvbGVTZXRHcm91cGluZyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSb2xlU2V0R3JvdXBpbmcpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUm9sZVNldEdyb3VwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDYxNzJkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlU2V0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUm9sZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJvbGVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUm9sZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZVNldF9yb2xlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVTZXRfcm9sZXNfZmVhdHVyZSIsICJfVUlfUm9sZVNldF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfU0VUX19ST0xFUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb2xlU2V0LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1JvbGVTZXQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUm9sZVNldCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TZWN0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TZWN0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2ZTAwYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU2VjdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIFZhcmlhYmlsaXR5RWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3Rpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRTZWN0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2VjdGlvbkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcmVkZWNlc3NvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VjdGlvbiBOYW1lIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VjdGlvbk5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfU2VjdGlvbl9zZWN0aW9uTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlY3Rpb25fc2VjdGlvbk5hbWVfZmVhdHVyZSIsICJfVUlfU2VjdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlNFQ1RJT05fX1NFQ1RJT05fTkFNRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZWN0aW9uIERlc2NyaXB0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VjdGlvbkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1NlY3Rpb25fc2VjdGlvbkRlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdGlvbl9zZWN0aW9uRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfU2VjdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT04sIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJlZGVjZXNzb3IgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcmVkZWNlc3NvclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9TZWN0aW9uX3ByZWRlY2Vzc29yX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdGlvbl9wcmVkZWNlc3Nvcl9mZWF0dXJlIiwgIl9VSV9TZWN0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuU0VDVElPTl9fUFJFREVDRVNTT1IsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlNFQ1RJT05fX1NVQl9TRUNUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlY3Rpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvU2VjdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTZWN0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NlY3Rpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1NlY3Rpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlY3Rpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUU6Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX0RFU0NSSVBUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5TRUNUSU9OX19TVUJfU0VDVElPTlMsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlU2VjdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5TRUNUSU9OX19TVUJfU0VDVElPTlMsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlU3RlcCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YzJkODAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1NlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciBleHRlbmRzIERpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFByZXNlbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJlc2VudGF0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlc2VudGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9wcmVzZW50YXRpb25fZmVhdHVyZSIsICJfVUlfU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvU2VtYW50aWNNb2RlbEJyaWRnZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTZW1hbnRpY01vZGVsQnJpZGdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxZGQzMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFR5cGVJbmZvUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIEluZm8gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlSW5mb1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlSW5mb19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGVJbmZvX2ZlYXR1cmUiLCAiX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU3RhdGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1N0YXRlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyZmYyMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU3RhdGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFN0YXRlSXRlbVByb3ZpZGVyLmphdmEsdiAxLjQgMjAwNi8wOS8wNyAwMDowNjozOSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0ZUl0ZW1Qcm92aWRlciBleHRlbmRzIFZlcnRleEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0YXRlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkV29ya1Byb2R1Y3RQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN1Ym1hY2hpbmVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdvcmsgUHJvZHVjdCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdvcmtQcm9kdWN0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1N0YXRlX1dvcmtQcm9kdWN0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU3RhdGVfV29ya1Byb2R1Y3RfZmVhdHVyZSIsICJfVUlfU3RhdGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5TVEFURV9fV09SS19QUk9EVUNULCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN1Ym1hY2hpbmUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdWJtYWNoaW5lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1N0YXRlX3N1Ym1hY2hpbmVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TdGF0ZV9zdWJtYWNoaW5lX2ZlYXR1cmUiLCAiX1VJX1N0YXRlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuU1RBVEVfX1NVQk1BQ0hJTkUsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlNUQVRFX19SRUdJT04pOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTdGF0ZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9TdGF0ZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX1N0YXRlX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFN0YXRlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfX1JFR0lPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5TVEFURV9fUkVHSU9OLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVJlZ2lvbigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU3RhdGVNYWNoaW5lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TdGF0ZU1hY2hpbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjQyNTg2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TdGF0ZU1hY2hpbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFN0YXRlTWFjaGluZUl0ZW1Qcm92aWRlci5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6Mzkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGVNYWNoaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlTWFjaGluZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RhdGVNYWNoaW5lSXRlbVByb3ZpZGVyIGV4dGVuZHMgV29ya0RlZmluaXRpb25JdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdGF0ZU1hY2hpbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuU1RBVEVfTUFDSElORV9fUkVHSU9OKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU3RhdGVNYWNoaW5lLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1N0YXRlTWFjaGluZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTdGF0ZU1hY2hpbmUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfU3RhdGVNYWNoaW5lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9TdGF0ZU1hY2hpbmVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFN0YXRlTWFjaGluZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFX01BQ0hJTkVfX1JFR0lPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5TVEFURV9NQUNISU5FX19SRUdJT04sIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlUmVnaW9uKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU3RlcEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU3RlcEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZDg2YzVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1N0ZXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGVwSXRlbVByb3ZpZGVyIGV4dGVuZHMgU2VjdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0ZXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTik7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFN0ZXAuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvU3RlcCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTdGVwKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1N0ZXBfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1N0ZXBfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFN0ZXAuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1N1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzN2M5YTRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1N1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFsIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFN1cHBvcnRpbmdNYXRlcmlhbCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TdXBwb3J0aW5nTWF0ZXJpYWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1N1cHBvcnRpbmdNYXRlcmlhbF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjliMmM0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFB1cnBvc2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFsdGVybmF0aXZlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHVycG9zZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFB1cnBvc2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrRGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFsdGVybmF0aXZlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFsdGVybmF0aXZlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVGFza0Rlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Rhc2tEZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUYXNrRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFRhc2tEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNmVhMzgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlXb3JrQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUYXNrUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQXNzaXN0ZWRCeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRXh0ZXJuYWxJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTWFuZGF0b3J5SW5wdXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE9wdGlvbmFsSW5wdXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE91dHB1dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUGVyZm9ybWVkUHJpbWFyaWx5QnlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNlbGVjdGVkU3RlcHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzU3luY2hyb25pemVkV2l0aFNvdXJjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUiLCAiX1VJX0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFzayBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRhc2tQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3JfVGFza19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX1Rhc2tfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX1RBU0ssIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3JfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlksCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXNzaXN0ZWQgQnkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBc3Npc3RlZEJ5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX2Fzc2lzdGVkQnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl9hc3Npc3RlZEJ5X2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeHRlcm5hbCBJbnB1dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVybmFsSW5wdXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3JfZXh0ZXJuYWxJbnB1dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX2V4dGVybmFsSW5wdXRfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1hbmRhdG9yeSBJbnB1dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1hbmRhdG9yeUlucHV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3JfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBPcHRpb25hbCBJbnB1dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE9wdGlvbmFsSW5wdXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3Jfb3B0aW9uYWxJbnB1dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX29wdGlvbmFsSW5wdXRfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE91dHB1dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE91dHB1dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9vdXRwdXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl9vdXRwdXRfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVCwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQZXJmb3JtZWQgUHJpbWFyaWx5IEJ5IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGVyZm9ybWVkUHJpbWFyaWx5QnlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl9wZXJmb3JtZWRQcmltYXJpbHlCeV9mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZWxlY3RlZCBTdGVwcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbGVjdGVkU3RlcHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3Jfc2VsZWN0ZWRTdGVwc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX3NlbGVjdGVkU3RlcHNfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRhc2tEZXNjcmlwdG9yLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFRhc2tEZXNjcmlwdG9yKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVGFza0Rlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGFza0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGFza0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjVmZDQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rhc2tJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2t9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQZXJmb3JtZWRCeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTWFuZGF0b3J5SW5wdXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE91dHB1dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWRkaXRpb25hbGx5UGVyZm9ybWVkQnlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE9wdGlvbmFsSW5wdXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN0ZXBzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUb29sTWVudG9yc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQZXJmb3JtZWQgQnkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQZXJmb3JtZWRCeVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza19wZXJmb3JtZWRCeV9mZWF0dXJlIiwgIl9VSV9UYXNrX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fUEVSRk9STUVEX0JZLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1hbmRhdG9yeSBJbnB1dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1hbmRhdG9yeUlucHV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUiLCAiX1VJX1Rhc2tfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19NQU5EQVRPUllfSU5QVVQsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgT3V0cHV0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3V0cHV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfb3V0cHV0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza19vdXRwdXRfZmVhdHVyZSIsICJfVUlfVGFza190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX09VVFBVVCwgdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWRkaXRpb25hbGx5UGVyZm9ybWVkQnlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza19hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSIsICJfVUlfVGFza190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlksCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgT3B0aW9uYWwgSW5wdXQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRPcHRpb25hbElucHV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlIiwgIl9VSV9UYXNrX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fT1BUSU9OQUxfSU5QVVQsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3RlcHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdGVwc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza19zdGVwc19mZWF0dXJlIiwgIl9VSV9UYXNrX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fU1RFUFMsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQludWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRvb2wgTWVudG9ycyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRvb2xNZW50b3JzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfdG9vbE1lbnRvcnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrX3Rvb2xNZW50b3JzX2ZlYXR1cmUiLCAiX1VJX1Rhc2tfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19UT09MX01FTlRPUlMsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVzdGltYXRpb25Db25zaWRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUiLCAiX1VJX1Rhc2tfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04pOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVGFzay5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9UYXNrIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFRhc2spIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVGFza190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVGFza190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVGFzay5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RlYW1Qcm9maWxlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZWFtUHJvZmlsZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNWJiNTZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RlYW1Qcm9maWxlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRUZWFtUm9sZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN1cGVyVGVhbVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3ViVGVhbVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGVhbSBSb2xlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRlYW1Sb2xlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UZWFtUHJvZmlsZV90ZWFtUm9sZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UZWFtUHJvZmlsZV90ZWFtUm9sZXNfZmVhdHVyZSIsICJfVUlfVGVhbVByb2ZpbGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5URUFNX1BST0ZJTEVfX1RFQU1fUk9MRVMsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3VwZXIgVGVhbSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cGVyVGVhbVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UZWFtUHJvZmlsZV9zdXBlclRlYW1fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UZWFtUHJvZmlsZV9zdXBlclRlYW1fZmVhdHVyZSIsICJfVUlfVGVhbVByb2ZpbGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0sIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3ViIFRlYW0gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdWJUZWFtUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1RlYW1Qcm9maWxlX3N1YlRlYW1fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UZWFtUHJvZmlsZV9zdWJUZWFtX2ZlYXR1cmUiLCAiX1VJX1RlYW1Qcm9maWxlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVBTV9QUk9GSUxFX19TVUJfVEVBTSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUZWFtUHJvZmlsZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9UZWFtUHJvZmlsZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUZWFtUHJvZmlsZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9UZWFtUHJvZmlsZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVGVhbVByb2ZpbGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RlbXBsYXRlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZW1wbGF0ZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ODYxZGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RlbXBsYXRlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlbXBsYXRlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVGVtcGxhdGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVGVtcGxhdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVGVtcGxhdGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVGVtcGxhdGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1RlbXBsYXRlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWM5ODEwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlcm1EZWZpbml0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRlcm1EZWZpbml0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Rlcm1EZWZpbml0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFRlcm1EZWZpbml0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9UZXJtRGVmaW5pdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RleHRFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUwMGMzN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0RWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIExlYWZFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRUZXh0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUZXh0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGV4dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UZXh0RWxlbWVudF90ZXh0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlIiwgIl9VSV9UZXh0RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRFWFRfRUxFTUVOVF9fVEVYVCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUZXh0RWxlbWVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9UZXh0RWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUZXh0RWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9UZXh0RWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVGV4dEVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFRleHRFbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVYVF9FTEVNRU5UX19URVhUOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Ub29sSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Ub29sSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlMjBiYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVG9vbEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVG9vbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFRvb2xNZW50b3JzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUb29sIE1lbnRvcnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb29sTWVudG9yc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVG9vbF90b29sTWVudG9yc19mZWF0dXJlIiwgIl9VSV9Ub29sX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVE9PTF9fVE9PTF9NRU5UT1JTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRvb2wuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVG9vbCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUb29sKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Rvb2xfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Rvb2xfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rvb2xNZW50b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rvb2xNZW50b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTc3MjkwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Ub29sTWVudG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3J9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRvb2xNZW50b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRvb2xNZW50b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUb29sTWVudG9yLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Rvb2xNZW50b3IiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVG9vbE1lbnRvcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Ub29sTWVudG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Ub29sTWVudG9yX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UcmFuc2l0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UcmFuc2l0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2MjRiYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVHJhbnNpdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVHJhbnNpdGlvbkl0ZW1Qcm92aWRlci5qYXZhLHYgMS40IDIwMDYvMDkvMDcgMDA6MDY6Mzgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNpdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUcmFuc2l0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkV29ya0RlZmluaXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNvdXJjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVGFyZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXb3JrIERlZmluaXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXb3JrRGVmaW5pdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UcmFuc2l0aW9uX1dvcmtEZWZpbml0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVHJhbnNpdGlvbl9Xb3JrRGVmaW5pdGlvbl9mZWF0dXJlIiwgIl9VSV9UcmFuc2l0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVFJBTlNJVElPTl9fV09SS19ERUZJTklUSU9OLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNvdXJjZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNvdXJjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UcmFuc2l0aW9uX3NvdXJjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1RyYW5zaXRpb25fc291cmNlX2ZlYXR1cmUiLCAiX1VJX1RyYW5zaXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UUkFOU0lUSU9OX19TT1VSQ0UsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFyZ2V0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFyZ2V0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1RyYW5zaXRpb25fdGFyZ2V0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVHJhbnNpdGlvbl90YXJnZXRfZmVhdHVyZSIsICJfVUlfVHJhbnNpdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRSQU5TSVRJT05fX1RBUkdFVCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUcmFuc2l0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1RyYW5zaXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRTdHJpbmcoIl9VSV9UcmFuc2l0aW9uX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1R5cGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1R5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWMzZDgwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVHlwZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9UeXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFR5cGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVHlwZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVHlwZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVU1BU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVU1BU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YWYzMDY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1VNQVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1BU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVTUFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUiLCAiX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5VTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVU1BU2VtYW50aWNNb2RlbEJyaWRnZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1VtYUVkaXRQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1VtYUVkaXRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2YyNTliZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9VbWFFZGl0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5FTUZQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBjZW50cmFsIHNpbmdsZXRvbiBmb3IgdGhlIFVtYSBlZGl0IHBsdWdpbi4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVtYUVkaXRQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4gewotCS8qKgotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFVtYUVkaXRQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgVW1hRWRpdFBsdWdpbigpOwotCi0JLyoqCi0JICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYUVkaXRQbHVnaW4oKSB7Ci0JCXN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXSB7fSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCi0JCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgotCQkJLy8KLQkJCXBsdWdpbiA9IHRoaXM7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1VtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYjM0ZmFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1VtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYUFkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4KLSAqIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LgotICogVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4KLSAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgVW1hQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cwotCQlDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOwotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYWNrYWdlSXRlbVByb3ZpZGVyIHBhY2thZ2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYWNrYWdlQWRhcHRlcigpIHsKLQkJaWYgKHBhY2thZ2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcGFja2FnZUl0ZW1Qcm92aWRlciA9IG5ldyBQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBhY2thZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnR9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludEl0ZW1Qcm92aWRlciBjb25zdHJhaW50SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uc3RyYWludEFkYXB0ZXIoKSB7Ci0JCWlmIChjb25zdHJhaW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbnN0cmFpbnRJdGVtUHJvdmlkZXIgPSBuZXcgQ29uc3RyYWludEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb25zdHJhaW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHl9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5QWRhcHRlcigpIHsKLQkJaWYgKG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIgPSBuZXcgTWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZUl0ZW1Qcm92aWRlciByb2xlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCWlmIChyb2xlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVJdGVtUHJvdmlkZXIgPSBuZXcgUm9sZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByb2xlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tJdGVtUHJvdmlkZXIgdGFza0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tBZGFwdGVyKCkgewotCQlpZiAodGFza0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0YXNrSXRlbVByb3ZpZGVyID0gbmV3IFRhc2tJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGFza0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdGVwSXRlbVByb3ZpZGVyIHN0ZXBJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGVwQWRhcHRlcigpIHsKLQkJaWYgKHN0ZXBJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc3RlcEl0ZW1Qcm92aWRlciA9IG5ldyBTdGVwSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHN0ZXBJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0SXRlbVByb3ZpZGVyIGFydGlmYWN0SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0QWRhcHRlcigpIHsKLQkJaWYgKGFydGlmYWN0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFydGlmYWN0SXRlbVByb3ZpZGVyID0gbmV3IEFydGlmYWN0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGFydGlmYWN0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciBkZWxpdmVyYWJsZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKSB7Ci0JCWlmIChkZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkZWxpdmVyYWJsZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPdXRjb21lSXRlbVByb3ZpZGVyIG91dGNvbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRjb21lQWRhcHRlcigpIHsKLQkJaWYgKG91dGNvbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJb3V0Y29tZUl0ZW1Qcm92aWRlciA9IG5ldyBPdXRjb21lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG91dGNvbWVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50SXRlbVByb3ZpZGVyIHBvaW50SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvaW50QWRhcHRlcigpIHsKLQkJaWYgKHBvaW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXBvaW50SXRlbVByb3ZpZGVyID0gbmV3IFBvaW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBvaW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGlua30gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtTGlua0l0ZW1Qcm92aWRlciBkaWFncmFtTGlua0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaWFncmFtTGlua0FkYXB0ZXIoKSB7Ci0JCWlmIChkaWFncmFtTGlua0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkaWFncmFtTGlua0l0ZW1Qcm92aWRlciA9IG5ldyBEaWFncmFtTGlua0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkaWFncmFtTGlua0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3J9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIgZ3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3Rvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhDb25uZWN0b3JBZGFwdGVyKCkgewotCQlpZiAoZ3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZ3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIgPSBuZXcgR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZ3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaW1lbnNpb25JdGVtUHJvdmlkZXIgZGltZW5zaW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaW1lbnNpb25BZGFwdGVyKCkgewotCQlpZiAoZGltZW5zaW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRpbWVuc2lvbkl0ZW1Qcm92aWRlciA9IG5ldyBEaW1lbnNpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGltZW5zaW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2V9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVmZXJlbmNlSXRlbVByb3ZpZGVyIHJlZmVyZW5jZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVmZXJlbmNlQWRhcHRlcigpIHsKLQkJaWYgKHJlZmVyZW5jZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZWZlcmVuY2VJdGVtUHJvdmlkZXIgPSBuZXcgUmVmZXJlbmNlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlZmVyZW5jZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHl9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlJdGVtUHJvdmlkZXIgcHJvcGVydHlJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvcGVydHlBZGFwdGVyKCkgewotCQlpZiAocHJvcGVydHlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvcGVydHlJdGVtUHJvdmlkZXIgPSBuZXcgUHJvcGVydHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvcGVydHlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHcmFwaEVkZ2VJdGVtUHJvdmlkZXIgZ3JhcGhFZGdlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaEVkZ2VBZGFwdGVyKCkgewotCQlpZiAoZ3JhcGhFZGdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWdyYXBoRWRnZUl0ZW1Qcm92aWRlciA9IG5ldyBHcmFwaEVkZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZ3JhcGhFZGdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1JdGVtUHJvdmlkZXIgZGlhZ3JhbUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW19LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpYWdyYW1BZGFwdGVyKCkgewotCQlpZiAoZGlhZ3JhbUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkaWFncmFtSXRlbVByb3ZpZGVyID0gbmV3IERpYWdyYW1JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGlhZ3JhbUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoTm9kZUl0ZW1Qcm92aWRlciBncmFwaE5vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoTm9kZUFkYXB0ZXIoKSB7Ci0JCWlmIChncmFwaE5vZGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZ3JhcGhOb2RlSXRlbVByb3ZpZGVyID0gbmV3IEdyYXBoTm9kZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBncmFwaE5vZGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50QWRhcHRlcigpIHsKLQkJaWYgKHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyID0gbmV3IFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBVTUFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIHVtYVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlQWRhcHRlcigpIHsKLQkJaWYgKHVtYVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdW1hU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciA9IG5ldyBVTUFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiB1bWFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUFkYXB0ZXIoKSB7Ci0JCWlmIChjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciA9IG5ldyBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRleHRFbGVtZW50SXRlbVByb3ZpZGVyIHRleHRFbGVtZW50SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRleHRFbGVtZW50QWRhcHRlcigpIHsKLQkJaWYgKHRleHRFbGVtZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRleHRFbGVtZW50SXRlbVByb3ZpZGVyID0gbmV3IFRleHRFbGVtZW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRleHRFbGVtZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZUl0ZW1Qcm92aWRlciBpbWFnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbWFnZUFkYXB0ZXIoKSB7Ci0JCWlmIChpbWFnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlpbWFnZUl0ZW1Qcm92aWRlciA9IG5ldyBJbWFnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9seWxpbmVJdGVtUHJvdmlkZXIgcG9seWxpbmVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9seWxpbmVBZGFwdGVyKCkgewotCQlpZiAocG9seWxpbmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcG9seWxpbmVJdGVtUHJvdmlkZXIgPSBuZXcgUG9seWxpbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcG9seWxpbmVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2V9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxsaXBzZUl0ZW1Qcm92aWRlciBlbGxpcHNlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxsaXBzZUFkYXB0ZXIoKSB7Ci0JCWlmIChlbGxpcHNlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWVsbGlwc2VJdGVtUHJvdmlkZXIgPSBuZXcgRWxsaXBzZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBlbGxpcHNlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eUl0ZW1Qcm92aWRlciBhY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCWlmIChhY3Rpdml0eUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eUl0ZW1Qcm92aWRlciA9IG5ldyBBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBhY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1pbGVzdG9uZUl0ZW1Qcm92aWRlciBtaWxlc3RvbmVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCWlmIChtaWxlc3RvbmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWlsZXN0b25lSXRlbVByb3ZpZGVyID0gbmV3IE1pbGVzdG9uZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtaWxlc3RvbmVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRpb25JdGVtUHJvdmlkZXIgaXRlcmF0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlpZiAoaXRlcmF0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWl0ZXJhdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBJdGVyYXRpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaXRlcmF0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQaGFzZUl0ZW1Qcm92aWRlciBwaGFzZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCWlmIChwaGFzZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwaGFzZUl0ZW1Qcm92aWRlciA9IG5ldyBQaGFzZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwaGFzZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgdGVhbVByb2ZpbGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkgewotCQlpZiAodGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgPSBuZXcgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGVhbVByb2ZpbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJaWYgKHJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyID0gbmV3IFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJ9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya09yZGVySXRlbVByb3ZpZGVyIHdvcmtPcmRlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya09yZGVyQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtPcmRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrT3JkZXJJdGVtUHJvdmlkZXIgPSBuZXcgV29ya09yZGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdvcmtPcmRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlciBwbGFubmluZ0RhdGFJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGF9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBsYW5uaW5nRGF0YUFkYXB0ZXIoKSB7Ci0JCWlmIChwbGFubmluZ0RhdGFJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyID0gbmV3IFBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwbGFubmluZ0RhdGFJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJaWYgKHRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyID0gbmV3IFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlciBjb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCWlmIChjb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIgPSBuZXcgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBhY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChhY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgQWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gYWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIHByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZGVzY3JpcHRvckRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoZGVzY3JpcHRvckRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBEZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25jZXB0SXRlbVByb3ZpZGVyIGNvbmNlcHRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25jZXB0QWRhcHRlcigpIHsKLQkJaWYgKGNvbmNlcHRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29uY2VwdEl0ZW1Qcm92aWRlciA9IG5ldyBDb25jZXB0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbmNlcHRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDaGVja2xpc3RJdGVtUHJvdmlkZXIgY2hlY2tsaXN0SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCkgewotCQlpZiAoY2hlY2tsaXN0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNoZWNrbGlzdEl0ZW1Qcm92aWRlciA9IG5ldyBDaGVja2xpc3RJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY2hlY2tsaXN0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4YW1wbGVJdGVtUHJvdmlkZXIgZXhhbXBsZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4YW1wbGVBZGFwdGVyKCkgewotCQlpZiAoZXhhbXBsZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlleGFtcGxlSXRlbVByb3ZpZGVyID0gbmV3IEV4YW1wbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZXhhbXBsZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRlbGluZUl0ZW1Qcm92aWRlciBndWlkZWxpbmVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRlbGluZUFkYXB0ZXIoKSB7Ci0JCWlmIChndWlkZWxpbmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZ3VpZGVsaW5lSXRlbVByb3ZpZGVyID0gbmV3IEd1aWRlbGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBndWlkZWxpbmVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc30gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNBZGFwdGVyKCkgewotCQlpZiAoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlciA9IG5ldyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlcG9ydEl0ZW1Qcm92aWRlciByZXBvcnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlcG9ydEFkYXB0ZXIoKSB7Ci0JCWlmIChyZXBvcnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmVwb3J0SXRlbVByb3ZpZGVyID0gbmV3IFJlcG9ydEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByZXBvcnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRlbXBsYXRlSXRlbVByb3ZpZGVyIHRlbXBsYXRlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlbXBsYXRlQWRhcHRlcigpIHsKLQkJaWYgKHRlbXBsYXRlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRlbXBsYXRlSXRlbVByb3ZpZGVyID0gbmV3IFRlbXBsYXRlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWx9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyIHN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsQWRhcHRlcigpIHsKLQkJaWYgKHN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXIgPSBuZXcgU3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3J9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVG9vbE1lbnRvckl0ZW1Qcm92aWRlciB0b29sTWVudG9ySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKSB7Ci0JCWlmICh0b29sTWVudG9ySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRvb2xNZW50b3JJdGVtUHJvdmlkZXIgPSBuZXcgVG9vbE1lbnRvckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0b29sTWVudG9ySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdoaXRlcGFwZXJJdGVtUHJvdmlkZXIgd2hpdGVwYXBlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdoaXRlcGFwZXJBZGFwdGVyKCkgewotCQlpZiAod2hpdGVwYXBlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3aGl0ZXBhcGVySXRlbVByb3ZpZGVyID0gbmV3IFdoaXRlcGFwZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd2hpdGVwYXBlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIgdGVybURlZmluaXRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVybURlZmluaXRpb25BZGFwdGVyKCkgewotCQlpZiAodGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIgPSBuZXcgVGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGVybURlZmluaXRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByYWN0aWNlSXRlbVByb3ZpZGVyIHByYWN0aWNlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByYWN0aWNlQWRhcHRlcigpIHsKLQkJaWYgKHByYWN0aWNlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByYWN0aWNlSXRlbVByb3ZpZGVyID0gbmV3IFByYWN0aWNlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByYWN0aWNlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIgcmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCkgewotCQlpZiAocmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyID0gbmV3IFJldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RhdGVJdGVtUHJvdmlkZXIgc3RhdGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RhdGVBZGFwdGVyKCkgewotCQlpZiAoc3RhdGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc3RhdGVJdGVtUHJvdmlkZXIgPSBuZXcgU3RhdGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc3RhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWZXJ0ZXhJdGVtUHJvdmlkZXIgdmVydGV4SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWZXJ0ZXhBZGFwdGVyKCkgewotCQlpZiAodmVydGV4SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXZlcnRleEl0ZW1Qcm92aWRlciA9IG5ldyBWZXJ0ZXhJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdmVydGV4SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVnaW9uSXRlbVByb3ZpZGVyIHJlZ2lvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVnaW9uQWRhcHRlcigpIHsKLQkJaWYgKHJlZ2lvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZWdpb25JdGVtUHJvdmlkZXIgPSBuZXcgUmVnaW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlZ2lvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGVNYWNoaW5lfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0YXRlTWFjaGluZUl0ZW1Qcm92aWRlciBzdGF0ZU1hY2hpbmVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZU1hY2hpbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0YXRlTWFjaGluZUFkYXB0ZXIoKSB7Ci0JCWlmIChzdGF0ZU1hY2hpbmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc3RhdGVNYWNoaW5lSXRlbVByb3ZpZGVyID0gbmV3IFN0YXRlTWFjaGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzdGF0ZU1hY2hpbmVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNpdGlvbkl0ZW1Qcm92aWRlciB0cmFuc2l0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVHJhbnNpdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmICh0cmFuc2l0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRyYW5zaXRpb25JdGVtUHJvdmlkZXIgPSBuZXcgVHJhbnNpdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0cmFuc2l0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qc2V1ZG9TdGF0ZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQc2V1ZG9TdGF0ZUl0ZW1Qcm92aWRlciBwc2V1ZG9TdGF0ZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBzZXVkb1N0YXRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQc2V1ZG9TdGF0ZUFkYXB0ZXIoKSB7Ci0JCWlmIChwc2V1ZG9TdGF0ZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwc2V1ZG9TdGF0ZUl0ZW1Qcm92aWRlciA9IG5ldyBQc2V1ZG9TdGF0ZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwc2V1ZG9TdGF0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyIGRpc2NpcGxpbmVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lQWRhcHRlcigpIHsKLQkJaWYgKGRpc2NpcGxpbmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGlzY2lwbGluZUl0ZW1Qcm92aWRlciA9IG5ldyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRpc2NpcGxpbmVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXR9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZVNldEl0ZW1Qcm92aWRlciByb2xlU2V0SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEFkYXB0ZXIoKSB7Ci0JCWlmIChyb2xlU2V0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVTZXRJdGVtUHJvdmlkZXIgPSBuZXcgUm9sZVNldEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByb2xlU2V0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW59IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG9tYWluSXRlbVByb3ZpZGVyIGRvbWFpbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9tYWluQWRhcHRlcigpIHsKLQkJaWYgKGRvbWFpbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkb21haW5JdGVtUHJvdmlkZXIgPSBuZXcgRG9tYWluSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRvbWFpbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlciB3b3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZUFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyID0gbmV3IFdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3b3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZ30gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkgewotCQlpZiAoZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUb29sSXRlbVByb3ZpZGVyIHRvb2xJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUb29sQWRhcHRlcigpIHsKLQkJaWYgKHRvb2xJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdG9vbEl0ZW1Qcm92aWRlciA9IG5ldyBUb29sSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRvb2xJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZ30gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgcm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCkgewotCQlpZiAocm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBSb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBjdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDdXN0b21DYXRlZ29yeUFkYXB0ZXIoKSB7Ci0JCWlmIChjdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciA9IG5ldyBDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm59IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlpZiAoY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgPSBuZXcgQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3N9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyIGRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJaWYgKGRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgPSBuZXcgRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXIgcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVBZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvYWRtYXBJdGVtUHJvdmlkZXIgcm9hZG1hcEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXB9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvYWRtYXBBZGFwdGVyKCkgewotCQlpZiAocm9hZG1hcEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyb2FkbWFwSXRlbVByb3ZpZGVyID0gbmV3IFJvYWRtYXBJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcm9hZG1hcEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2V9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgY29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudFBhY2thZ2VBZGFwdGVyKCkgewotCQlpZiAoY29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgPSBuZXcgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnR9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciBwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2V9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgcHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2V9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlciBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3J9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW59IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIG1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGx1Z2luQWRhcHRlcigpIHsKLQkJaWYgKG1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgPSBuZXcgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBjb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChjb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IENvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3Rpb25JdGVtUHJvdmlkZXIgc2VjdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlY3Rpb25BZGFwdGVyKCkgewotCQlpZiAoc2VjdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZWN0aW9uSXRlbVByb3ZpZGVyID0gbmV3IFNlY3Rpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VjdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJYXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBBcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBhcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgd29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAod29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBkZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChkZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciByb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChyb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgdGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAodGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBUYXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZ3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoZ3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlndWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IEd1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGd1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBwcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChwcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgUHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIG1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uQWRhcHRlcigpIHsKLQkJaWYgKG1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIgcHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NGYW1pbHlBZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyIG1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RMaWJyYXJ5QWRhcHRlcigpIHsKLQkJaWYgKG1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciA9IG5ldyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KAotCQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpCi0JCQkJCXx8ICgoKENsYXNzKSB0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9IGFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRpc3Bvc2VzIGFsbCBvZiB0aGUgaXRlbSBwcm92aWRlcnMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkuIAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChwYWNrYWdlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwYWNrYWdlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGNvbnN0cmFpbnRJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWNvbnN0cmFpbnRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAobWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQltZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoY29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQljb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoc2VjdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJc2VjdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChyb2xlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlyb2xlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHRhc2tJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRhc2tJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoc3RlcEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJc3RlcEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChhcnRpZmFjdEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJYXJ0aWZhY3RJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGVsaXZlcmFibGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG91dGNvbWVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCW91dGNvbWVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoY29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJd29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHRhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJdGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGd1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWd1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwb2ludEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcG9pbnRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGlhZ3JhbUxpbmtJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRpYWdyYW1MaW5rSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGdyYXBoQ29ubmVjdG9ySXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlncmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkaW1lbnNpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRpbWVuc2lvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChyZWZlcmVuY2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJlZmVyZW5jZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9wZXJ0eUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvcGVydHlJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZ3JhcGhFZGdlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlncmFwaEVkZ2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGlhZ3JhbUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZGlhZ3JhbUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChncmFwaE5vZGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWdyYXBoTm9kZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodW1hU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJdW1hU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRleHRFbGVtZW50SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGltYWdlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlpbWFnZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwb2x5bGluZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcG9seWxpbmVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZWxsaXBzZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZWxsaXBzZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChhY3Rpdml0eUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJYWN0aXZpdHlJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAobWlsZXN0b25lSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQltaWxlc3RvbmVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoaXRlcmF0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlpdGVyYXRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocGhhc2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXBoYXNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHRlYW1Qcm9maWxlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0ZWFtUHJvZmlsZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChyb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya09yZGVySXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl3b3JrT3JkZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwbGFubmluZ0RhdGFJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGNvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWNvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoYWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJYWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGVzY3JpcHRvckRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoY29uY2VwdEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY29uY2VwdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChjaGVja2xpc3RJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWNoZWNrbGlzdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChleGFtcGxlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlleGFtcGxlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGd1aWRlbGluZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZ3VpZGVsaW5lSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJlcG9ydEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcmVwb3J0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHRlbXBsYXRlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0ZW1wbGF0ZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChzdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0b29sTWVudG9ySXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0b29sTWVudG9ySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHdoaXRlcGFwZXJJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXdoaXRlcGFwZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRlcm1EZWZpbml0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHByYWN0aWNlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcmFjdGljZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChyZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHN0YXRlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlzdGF0ZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh2ZXJ0ZXhJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXZlcnRleEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChyZWdpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJlZ2lvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChzdGF0ZU1hY2hpbmVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXN0YXRlTWFjaGluZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0cmFuc2l0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0cmFuc2l0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHBzZXVkb1N0YXRlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwc2V1ZG9TdGF0ZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkaXNjaXBsaW5lSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvbGVTZXRJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJvbGVTZXRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZG9tYWluSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkb21haW5JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl3b3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodG9vbEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJdG9vbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChyb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChjdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWNhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChyb2FkbWFwSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlyb2FkbWFwSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCW1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChtZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQltZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ZhcmlhYmlsaXR5RWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVmFyaWFiaWxpdHlFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZmM2ExMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVmFyaWFiaWxpdHlFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJpbGl0eUVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVmFyaWFiaWxpdHlUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFyaWFiaWxpdHlUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFZhcmlhYmlsaXR5RWxlbWVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9WYXJpYWJpbGl0eUVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9WZXJ0ZXhJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ZlcnRleEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZDIzMjhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ZlcnRleEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmVydGV4SXRlbVByb3ZpZGVyLmphdmEsdiAxLjQgMjAwNi8wOS8wNyAwMDowNjozOSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXh9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZlcnRleEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWZXJ0ZXhJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRPdXRnb2luZ1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSW5jb21pbmdQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE91dGdvaW5nIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3V0Z29pbmdQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUiLCAiX1VJX1ZlcnRleF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZFUlRFWF9fT1VUR09JTkcsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSW5jb21pbmcgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbmNvbWluZ1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9WZXJ0ZXhfaW5jb21pbmdfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WZXJ0ZXhfaW5jb21pbmdfZmVhdHVyZSIsICJfVUlfVmVydGV4X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVkVSVEVYX19JTkNPTUlORywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBWZXJ0ZXguZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVmVydGV4IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfVmVydGV4X3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1doaXRlcGFwZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1doaXRlcGFwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzIxN2NmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9XaGl0ZXBhcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXJ9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdoaXRlcGFwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb25jZXB0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2hpdGVwYXBlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdoaXRlcGFwZXIuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvV2hpdGVwYXBlciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXaGl0ZXBhcGVyKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1doaXRlcGFwZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1doaXRlcGFwZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MGJkMWJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJc1JlcGVhdGFibGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZElzT25nb2luZ1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSXNFdmVudERyaXZlblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTGlua1RvUHJlZGVjZXNzb3JQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIFJlcGVhdGFibGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc1JlcGVhdGFibGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNSZXBlYXRhYmxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNSZXBlYXRhYmxlX2ZlYXR1cmUiLCAiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBPbmdvaW5nIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNPbmdvaW5nUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzT25nb2luZ19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzT25nb2luZ19mZWF0dXJlIiwgIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgRXZlbnQgRHJpdmVuIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNFdmVudERyaXZlblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc0V2ZW50RHJpdmVuX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNFdmVudERyaXZlbl9mZWF0dXJlIiwgIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMaW5rIFRvIFByZWRlY2Vzc29yIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlua1RvUHJlZGVjZXNzb3JQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfbGlua1RvUHJlZGVjZXNzb3JfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9saW5rVG9QcmVkZWNlc3Nvcl9mZWF0dXJlIiwgIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV29ya0JyZWFrZG93bkVsZW1lbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvV29ya0JyZWFrZG93bkVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV29ya0JyZWFrZG93bkVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya0RlZmluaXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTk3M2U2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya0RlZmluaXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya0RlZmluaXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTik7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtEZWZpbml0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1dvcmtEZWZpbml0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdvcmtEZWZpbml0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dvcmtEZWZpbml0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrRGVmaW5pdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya0RlZmluaXRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya09yZGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrT3JkZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGQwZjZhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrT3JkZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJ9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtPcmRlckl0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTGlua1R5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFByZWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExpbmsgVHlwZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpbmtUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtPcmRlcl9saW5rVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtPcmRlcl9saW5rVHlwZV9mZWF0dXJlIiwgIl9VSV9Xb3JrT3JkZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX09SREVSX19MSU5LX1RZUEUsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJlZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByZWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya09yZGVyX3ByZWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrT3JkZXJfcHJlZF9mZWF0dXJlIiwgIl9VSV9Xb3JrT3JkZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX09SREVSX19QUkVELCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtPcmRlci5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Xb3JrT3JkZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV29ya09yZGVyKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dvcmtPcmRlcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfV29ya09yZGVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrT3JkZXIuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjk0YjlhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRXh0ZXJuYWxJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSW1wYWN0T2ZOb3RIYXZpbmdQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlYXNvbnNGb3JOb3ROZWVkaW5nUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeHRlcm5hbCBJZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVybmFsSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lELAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFB1cnBvc2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQdXJwb3NlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEltcGFjdCBPZiBOb3QgSGF2aW5nIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wYWN0T2ZOb3RIYXZpbmdQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9pbXBhY3RPZk5vdEhhdmluZ19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25faW1wYWN0T2ZOb3RIYXZpbmdfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVhc29ucyBGb3IgTm90IE5lZWRpbmcgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWFzb25zRm9yTm90TmVlZGluZ1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3JlYXNvbnNGb3JOb3ROZWVkaW5nX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9yZWFzb25zRm9yTm90TmVlZGluZ19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMWNlZjg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgRGVzY3JpcHRvckl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEFjdGl2aXR5RW50cnlTdGF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWN0aXZpdHlFeGl0U3RhdGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdvcmtQcm9kdWN0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRJbXBhY3RlZEJ5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRJbXBhY3RzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREZWxpdmVyYWJsZVBhcnRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFjdGl2aXR5RW50cnlTdGF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RW50cnlTdGF0ZV9mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWN0aXZpdHkgRXhpdCBTdGF0ZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFjdGl2aXR5RXhpdFN0YXRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUV4aXRTdGF0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUV4aXRTdGF0ZV9mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXb3JrIFByb2R1Y3QgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXb3JrUHJvZHVjdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3RfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3RfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbXBhY3RlZCBCeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEltcGFjdGVkQnlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdGVkQnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0ZWRCeV9mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlksCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSW1wYWN0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEltcGFjdHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0c19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZWxpdmVyYWJsZSBQYXJ0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlbGl2ZXJhYmxlUGFydHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2RlbGl2ZXJhYmxlUGFydHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfZGVsaXZlcmFibGVQYXJ0c19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDhhYWI2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3R9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFJlcG9ydHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRlbXBsYXRlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVG9vbE1lbnRvcnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEVzdGltYXRpb25Db25zaWRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVwb3J0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlcG9ydHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0X3JlcG9ydHNfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfX1JFUE9SVFMsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGVtcGxhdGVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGVtcGxhdGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0X3RlbXBsYXRlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0X3RlbXBsYXRlc19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fVEVNUExBVEVTLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRvb2wgTWVudG9ycyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRvb2xNZW50b3JzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0X3Rvb2xNZW50b3JzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3RfdG9vbE1lbnRvcnNfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXb3JrUHJvZHVjdC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXb3JrUHJvZHVjdCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlMWM1Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRXb3JrUHJvZHVjdHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdvcmsgUHJvZHVjdHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXb3JrUHJvZHVjdHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlX3dvcmtQcm9kdWN0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0VHlwZV93b3JrUHJvZHVjdHNfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3RUeXBlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV29ya1Byb2R1Y3RUeXBlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXb3JrUHJvZHVjdFR5cGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDNmOGViYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhbmQgZWRpdGluZyB0aGUgVU1BIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZlMjdmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTM0NjJlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi51bWEsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLAotIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzJiYWZkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjIvdW1hLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YTU4MDk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InVtYSIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5pYm0uY29tL3VtYS8xLjAuMi91bWEuZWNvcmUiIG5zUHJlZml4PSJjb20uaWJtLnVtYSI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIwMyIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEYXRlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkRhdGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyBvZiB0aGUgdHlwZSBEYXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVcmkiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm5ldC5VUkkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyB0aGF0IHBvaW50IHRvIHJlc291cmNlcyBzdWNoIGFzIGZpbGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVbmxpbWl0ZWROYXR1cmFsIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3RyaW5nIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlNldCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5TZXQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTZXF1ZW5jZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5MaXN0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSW50ZWdlciIgaW5zdGFuY2VDbGFzc05hbWU9ImludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNsYXNzaWZpZXIiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlR5cGUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lZEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuICBEZWZpbmVkIHRoYXQgZXZlcnkgZWxlbWVudCBoYXMgYSBuYW1lLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9OYW1lc3BhY2UgIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZXNwYWNlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVzcGFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGNsYXNzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzIE1ldGhvZCBFbGVtZW50IGlzIHRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIGNsYXNzZXMgYW5kIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGVsZW1lbnQgdHlwZSBvZiB0aGlzIG1vZGVsLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuICBNZXRob2QgRWxlbWVudCBpbmhlcml0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50J3Mgc3VwZXIgY2xhc3MuICBFdmVyeSBlbGVtZW50IGRlZmluZWQgYXMgYSBVTUEgaW5zdGFuY2UgaXMgZGVyaXZlZCBmcm9tIE1vZGVsIEVsZW1lbnQuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpbi1zdGFuY2UgaXMgYXQgbGVhc3QgZGVmaW5lZCBieSBhIHVuaXF1ZSBpZCwgYSBuYW1lLCBhcyB3ZWxsIGFzIGJyaWVmIGRlc2NyaXB0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJndWlkIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvd25lZFJ1bGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25zdHJhaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBwcmVzc2VkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgRXh0ZW5kcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmRlcmluZ0d1aWRlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25zdHJhaW50IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb25zdHJhaW50IGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvZHkiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIHN0b3JlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50ICMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LiYjeEQ7JiN4QTtDb250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmNlcHRzQW5kUGFwZXJzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25jZXB0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoZWNrbGlzdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NoZWNrbGlzdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJndWlkZWxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HdWlkZWxpbmUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCAjLy9DbGFzc2lmaWVyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliYWJsZSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4mI3hEOyYjeEE7VGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlIChzZWUgU2VjdGlvbiA0LjEuNCkuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gJnF1b3Q7cnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCZxdW90OyB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAmcXVvdDtqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50JnF1b3Q7IHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgJnF1b3Q7QXJjaGl0ZWN0dXJlIERvY3VtZW50JnF1b3Q7LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50YXRpb24iIGVUeXBlPSIjLy9Db250ZW50RGVzY3JpcHRpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNoYXBlaWNvbiIgZVR5cGU9IiMvL1VyaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9kZWljb24iIGVUeXBlPSIjLy9VcmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IERlc2NyaXB0aW9uIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmUgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJLZXkgQ29uc2lkZXJhdGlvbnMgcHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlY3Rpb24iIGVTdXBlclR5cGVzPSIjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgU2VjdGlvbiBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VjdGlvbk5hbWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VjdGlvbkRlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlNlY3Rpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWNlc3NvciIgZVR5cGU9IiMvL1NlY3Rpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgJiN4RDsmI3hBO0EgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGlmaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIFByb2R1Y3QgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuJiN4RDsmI3hBO0Egd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0ZSIgZVR5cGU9IiMvL0VzdGltYXRlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXBvcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXBvcnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVtcGxhdGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UZW1wbGF0ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGFzayBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLiYjeEQ7JiN4QTtBIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAmI3hEOyYjeEE7QSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gJiN4RDsmI3hBO0ZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXZlbG9wIFVzZSBDYXNlIE1vZGVsJnF1b3Q7IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgJnF1b3Q7bWV0aG9kJnF1b3Q7IG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybWVkQnkiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0ZXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdGVwIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIKLSAgICAgICAgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0ZSIgZVR5cGU9IiMvL0VzdGltYXRlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIERlZmluaXRpb24gaXMgYW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4mI3hEOyYjeEE7V29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVjb25kaXRpb24iIGVUeXBlPSIjLy9Db25zdHJhaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0Y29uZGl0aW9uIiBlVHlwZT0iIy8vQ29uc3RyYWludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RlcCIgZVN1cGVyVHlwZXM9IiMvL1NlY3Rpb24gIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgU3RlcCBpcyBhIFNlY3Rpb24gYW5kIFdvcmsgRGVmaW5pdGlvbiB0aGF0IGlzIHVzZWQgdG8gb3JnYW5pemUgVGFza3MgaW50byBwYXJ0cyBvciBzdWJ1bml0cyBvZiB3b3JrLiAgU3RlcHMgaW5oZXJpdCB0aGUgc3ViU2VjdGlvbnMgZGVjb21wb3NpdGlvbiBmcm9tIFNlY3Rpb24gYW5kIGNhbiB0aGVyZWZvcmUgZGVzY3JpYmUgU3ViLVN0ZXBzIG5lc3RlZCBpbnRvIFN0ZXBzLiYjeEQ7JiN4QTtBIFN0ZXAgZGVzY3JpYmVzIGEgbWVhbmluZ2Z1bCBhbmQgY29uc2lzdCBwYXJ0IG9mIHRoZSBvdmVyYWxsIHdvcmsgZGVzY3JpYmVkIGZvciBhIFRhc2suICBUaGUgY29sbGVjdGlvbiBvZiBTdGVwcyBkZWZpbmVkIGZvciBhIFRhc2sgcmVwcmVzZW50cyBhbGwgdGhlIHdvcmsgdGhhdCBzaG91bGQgYmUgZG9uZSB0byBhY2hpZXZlIHRoZSBvdmVyYWxsIGRldmVsb3BtZW50IGdvYWwgb2YgdGhlIFRhc2suICBOb3QgYWxsIHN0ZXBzIGFyZSBuZWNlc3NhcmlseSBwZXJmb3JtZWQgZWFjaCB0aW1lIGEgVGFzayBpcyBpbnZva2VkIGluIGEgUHJvY2VzcyAoc2VlIFRhc2sgRGVzY3JpcHRvciksIHNvIHRoZXkgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGluIHRoZSBmb3JtIG9mIGFsdGVybmF0ZSAnZmxvd3MnIG9mIHdvcmsuICBEaWZmZXJlbnQgd2F5cyBvZiBhY2hpZXZpbmcgdGhlIHNhbWUgZGV2ZWxvcG1lbnQgZ29hbCBjYW4gdGhlbiBiZSAnYXNzZW1ibGVkJyBieSBzZWxlY3RpbmcgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBzdGVwcyB3aGVuIGFwcGx5aW5nIHRoZSBUYXNrIGluIGEgUHJvY2Vzcy4gIFR5cGljYWwga2luZHMgb2Ygc3RlcHMgYSBUYXNrIGF1dGhvciBzaG91bGQgY29uc2lkZXIgYXJlOiBUaGlua2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgdW5kZXJzdGFuZCB0aGUgbmF0dXJlIG9mIHRoZSB0YXNrLCBnYXRoZXJzIGFuZCBleGFtaW5lcyB0aGUgaW5wdXQgYXJ0aWZhY3RzLCBhbmQgZm9ybXVsYXRlcyB0aGUgb3V0Y29tZS4gUGVyZm9ybWluZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgY3JlYXRlIG9yIHVwZGF0ZSBzb21lIGFydGlmYWN0cy4gUmV2aWV3aW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBpbnNwZWN0cyB0aGUgcmVzdWx0cyBhZ2FpbnN0IHNvbWUgY3JpdGVyaWEuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3QiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQXJ0aWZhY3QgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4mI3hEOyYjeEE7QXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICZxdW90O293biZxdW90OyBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXJBcnRpZmFjdCIgZVR5cGU9IiMvL0FydGlmYWN0IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQXJ0aWZhY3QiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0FydGlmYWN0L2NvbnRhaW5lckFydGlmYWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJhYmxlIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVsaXZlcmFibGUgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGNvbWUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gb3V0Y29tZSBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQYWNrYWdlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgUGFja2FnZSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnbG9iYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNlZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcmVudFBhY2thZ2UiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTWV0aG9kUGFja2FnZS9jaGlsZFBhY2thZ2VzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoaWxkUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL01ldGhvZFBhY2thZ2UvcGFyZW50UGFja2FnZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50UGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29udGVudCBQYWNrYWdlIGlzIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnRFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZPdXRsaW5lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXByZXNlbnRhdGlvbk9wdGlvbnMiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW1wYWN0T2ZOb3RIYXZpbmciIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYXNvbnNGb3JOb3ROZWVkaW5nIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFja2FnaW5nR3VpZGFuY2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2tpbGxzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN5bm9ueW1zIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dGFjaG1lbnRzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsSW5mbyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2JsZW0iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFja2dyb3VuZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnb2FscyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFwcGxpY2F0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9pbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zaXRpb24iIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVkIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUVsZW1lbnQvY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpbmsiIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1MaW5rIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtTGluay9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYW5jaG9yYWdlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HcmFwaENvbm5lY3RvciIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbWFudGljTW9kZWwiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2dyYXBoRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNWaXNpYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXIiIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvY29udGFpbmVkIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVmZXJlbmNlIiBlT3Bwb3NpdGU9IiMvL1JlZmVyZW5jZS9yZWZlcmVuY2VkIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb3BlcnR5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbUxpbmsiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Inpvb20iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmlld3BvcnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2xpbmsiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW0iIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbS9kaWFncmFtTGluayIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaENvbm5lY3RvciIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9hbmNob3JhZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFZGdlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HcmFwaEVkZ2UiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFZGdlL2FuY2hvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZW1hbnRpY01vZGVsQnJpZGdlIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9zZW1hbnRpY01vZGVsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW0iIGVUeXBlPSIjLy9EaWFncmFtIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbS9uYW1lc3BhY2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGltZW5zaW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2lkdGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGVpZ2h0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlZmVyZW5jZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZWQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9EaWFncmFtRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9yZWZlcmVuY2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvcGVydHkiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhFZGdlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYW5jaG9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iMiIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBlT3Bwb3NpdGU9IiMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3YXlwb2ludHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIyIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BvaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhOb2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9pbnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbUxpbmsiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1MaW5rIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2RpYWdyYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZXNwYWNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9kaWFncmFtIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoTm9kZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNpemUiIGVUeXBlPSIjLy9EaW1lbnNpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVJbmZvIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMZWFmRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRleHRFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0ZXh0IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW1hZ2UiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVyaSIgZVR5cGU9IiMvL1VyaSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW1lVHlwZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoaWNQcmltaXRpdmUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2x5bGluZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbG9zZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVsbGlwc2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaGljUHJpbWl0aXZlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFkaXVzWCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNZIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvdGF0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0QW5nbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5kQW5nbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2VudGVyIiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5IiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQgIy8vVmFyaWFiaWxpdHlFbGVtZW50ICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBBY3Rpdml0eSBpcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uJiN4RDsmI3hBO0FjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJicmVha2Rvd25FbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdGllcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2FkbWFwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9hZG1hcCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hlY2tsaXN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmNlcHRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25jZXB0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4YW1wbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeGFtcGxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imd1aWRlbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0d1aWRlbGluZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmV1c2FibGVBc3NldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGlzIGEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUmVwZWF0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzT25nb2luZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRXZlbnREcml2ZW4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaW5rVG9QcmVkZWNlc3NvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya09yZGVyIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkJyZWFrZG93biBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAmcXVvdDtTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyZxdW90OyB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAmcXVvdDtTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMmcXVvdDsgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgJnF1b3Q7Q3VzdG9tZXIuQXJjaGl0ZWN0JnF1b3Q7IHdvdWxkIGRlZmluZSBhICZxdW90O0N1c3RvbWVyJnF1b3Q7IHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAmcXVvdDtBcmNoaXRlY3QmcXVvdDsgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNQbGFubmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4mI3hEOyYjeEE7JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJKdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldGFpbCBVc2UgQ2FzZSZxdW90OyB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNPcHRpb25hbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGlzT3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50ZWRBZnRlciIgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGVkQmVmb3JlIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwbGFubmluZ0RhdGEiIGVUeXBlPSIjLy9QbGFubmluZ0RhdGEiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyQWN0aXZpdGllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQWN0aXZpdHkiIGVPcHBvc2l0ZT0iIy8vQWN0aXZpdHkvYnJlYWtkb3duRWxlbWVudHMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWlsZXN0b25lIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWlsZXN0b25lIGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSXRlcmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikl0ZXJhdGlvbiBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEQ7JiN4QTtJdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLikiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGhhc2UiIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUGhhc2UgaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7UGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlYW1Qcm9maWxlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZWFtIFByb2ZpbGUgaXMgYSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLiYjeEQ7JiN4QTtXb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuJiN4RDsmI3hBO0hlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVhbVJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBlclRlYW0iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9UZWFtUHJvZmlsZSIgZU9wcG9zaXRlPSIjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlRlYW0iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUm9sZSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybXNBZGRpdGlvbmFsbHkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1Rhc2tEZXNjcmlwdG9yL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lzdHNJbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vVGFza0Rlc2NyaXB0b3IvYXNzaXN0ZWRCeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3Ivd29ya2VkT25CeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3Jtc0FzT3duZXIiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1Rhc2tEZXNjcmlwdG9yL3BlcmZvcm1lZFByaW1hcmlseUJ5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL3Jlc3BvbnNpYmxlUm9sZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IldvcmtPcmRlclR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgT3JkZXIgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChCKSBiZWxvdykgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChBKSBiZWxvdykgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvU3RhcnQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvRmluaXNoIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb1N0YXJ0IiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb0ZpbmlzaCIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya09yZGVyIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgT3JkZXIgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gICYjeEQ7JiN4QTsoTm90ZSwgV29yayBPcmRlciBpcyBub3QgbW9kZWxlZCBhcyBhbiBBc3NvY2lhdGlvbiBDbGFzcyB0byBwcm92aWRlIGEgc3RyYWlnaHRmb3J3YXJkIG1hcHBpbmcgIHRvIFhNSSBhbmQgRU1GLikmI3hEOyYjeEE7VGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua1R5cGUiIGVUeXBlPSIjLy9Xb3JrT3JkZXJUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmaW5pc2hUb1N0YXJ0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWQiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb2Nlc3MgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLiYjeEQ7JiN4QTtQcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBsYW5uaW5nRGF0YSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQbGFubmluZyBEYXRhIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuJiN4RDsmI3hBO1BsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4mI3hEOyYjeEE7KE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnREYXRlIiBlVHlwZT0iIy8vRGF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaERhdGUiIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhbmsiIGVUeXBlPSIjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLiYjeEQ7JiN4QTtEZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgRGVzY3JpcHRvciBpcyBhIERlc2NyaXB0b3IgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4mI3hEOyYjeEE7QSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJUYXNrIiBlVHlwZT0iIy8vVGFzayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vUm9sZURlc2NyaXB0b3IvcGVyZm9ybXNBZGRpdGlvbmFsbHkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaXN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vUm9sZURlc2NyaXB0b3IvYXNzaXN0c0luIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVybmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dFRvIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0VG8iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9PcHRpb25hbElucHV0VG8iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0cHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL291dHB1dEZyb20iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybWVkUHJpbWFyaWx5QnkiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIKLSAgICAgICAgZU9wcG9zaXRlPSIjLy9Sb2xlRGVzY3JpcHRvci9wZXJmb3Jtc0FzT3duZXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VsZWN0ZWRTdGVwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgJiN4RDsmI3hBO0ZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLiYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IldvcmtQcm9kdWN0IiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZXJuYWxJbnB1dFRvIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9UYXNrRGVzY3JpcHRvci9leHRlcm5hbElucHV0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdGVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbXBhY3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdGVkQnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXRUbyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vVGFza0Rlc2NyaXB0b3IvbWFuZGF0b3J5SW5wdXQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya2VkT25CeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1JvbGVEZXNjcmlwdG9yL21vZGlmaWVzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Ik9wdGlvbmFsSW5wdXRUbyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vVGFza0Rlc2NyaXB0b3Ivb3B0aW9uYWxJbnB1dCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXRGcm9tIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9UYXNrRGVzY3JpcHRvci9vdXRwdXQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL1JvbGVEZXNjcmlwdG9yL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbXBvc2l0ZVJvbGUiIGVTdXBlclR5cGVzPSIjLy9Sb2xlRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb21wb3NpdGUgUm9sZSBpcyBhIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4mI3hEOyYjeEE7QSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFnZ3JlZ2F0ZWRSb2xlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2FnZUd1aWRhbmNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaG93dG9TdGFmZiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2FsZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJpc2tMZXZlbCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGluZ1RlY2huaXF1ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdE1lbWJlckV4cGVydGlzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVPZkNvbnRyYWN0IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbElkIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgZGVsaXZlcnkgcGF0dGVybnMgYW5kIG1vZGVscy4gSXQgaXMgdXNlZCBsaWtlIGEgc3lub255bS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NvcGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2FnZU5vdGVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbmNlcHQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb25jZXB0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2hlY2tsaXN0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ2hlY2tsaXN0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeGFtcGxlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEV4YW1wbGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRlbGluZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIEd1aWRlbGluZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFc3RpbWF0ZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBFc3RpbWF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBwcm92aWRlcyBzaXppbmcgbWVhc3VyZXMsIG9yIHN0YW5kYXJkcyBmb3Igc2l6aW5nIHRoZSB3b3JrIGVmZm9ydCBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIHBhcnRpY3VsYXIgcGllY2Ugb2Ygd29yayBhbmQgaW5zdHJ1Y3Rpb25zIGZvciB0aGVpciBzdWNjZXNzZnVsIHVzZS4gSXQgbWF5IGJlIGNvbXByaXNlZCBvZiBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb25zIGFuZCBlc3RpbWF0aW9uIG1ldHJpY3MuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRpb25NZXRyaWMiIGVUeXBlPSIjLy9Fc3RpbWF0aW5nTWV0cmljIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0aW9uQ29uZGVyYXRpb25zIgotICAgICAgICBlVHlwZT0iIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFc3RpbWF0aW5nTWV0cmljIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVzdGltYXRpb24gTWV0cmljIGRlc2NyaWJlcyBhIG1ldHJpYyBvciBtZWFzdXJlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQgYW5kIHdoaWNoIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSB3b3JrIGVmZm9ydCBhcyB3ZWxsIGFzIGEgcmFuZ2Ugb2YgcG90ZW50aWFsIGxhYm9yLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucyBxdWFsaWZ5IHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlcG9ydCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJlcG9ydCBpcyBhIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGVtcGxhdGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdXBwb3J0aW5nIE1hdGVyaWFscyBpcyBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUb29sTWVudG9yIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVG9vbCBNZW50b3IgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXaGl0ZXBhcGVyIiBlU3VwZXJUeXBlcz0iIy8vQ29uY2VwdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hpdGVwYXBlcnMgYXJlIGEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlcm1EZWZpbml0aW9uIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRlcm1EZWZpbml0aW9ucyBkZWZpbmUgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGhleSBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2UiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcmFjdGljZSByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgJnF1b3Q7TWFuYWdlIFJpc2tzJnF1b3Q7LCAmcXVvdDtDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkmcXVvdDssICZxdW90O0FyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQmcXVvdDssIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViUHJhY3RpY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9QcmFjdGljZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudFJlZmVyZW5jZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQWN0aXZpdHkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmV1c2FibGVBc3NldCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJldXNhYmxlIEFzc2V0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcmI3hEOyYjeEE7aG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LiYjeEQ7JiN4QTtBIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhc2tzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZVdvcmtmbG93cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQWN0aXZpdHkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudENhdGVnb3J5IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IENhdGVnb3J5IGlzIGFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgU2V0IG9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICZxdW90O0FuYWx5c3RzJnF1b3Q7IFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAmcXVvdDtCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QmcXVvdDssICZxdW90O1N5c3RlbSBBbmFseXN0JnF1b3Q7LCBhcyB3ZWxsIGFzICZxdW90O1JlcXVpcmVtZW50cyBTcGVjaWZpZXImcXVvdDsgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2xlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb21haW4iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRvbWFpbiBpcyBhIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4mI3hEOyYjeEE7RG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya1Byb2R1Y3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJkb21haW5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Eb21haW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0VHlwZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBQcm9kdWN0IFR5cGUgaXMgYSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICZxdW90O0NsYXNzIERpYWdyYW0mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY2lwbGluZSBHcm91cGluZ3MgYXJlIHVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgJnF1b3Q7U29mdHdhcmUgRGlzY2lwbGluZXMmcXVvdDsgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgTWFuYWdlbWVudCZxdW90OyBvciAmcXVvdDtUZXN0aW5nJnF1b3Q7OyAmcXVvdDtJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50JnF1b3Q7IHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgJnF1b3Q7SVQgT3BlcmF0aW9uYWwgU2VydmljZXMmcXVvdDssICZxdW90O0lUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMmcXVvdDssIG9yICZxdW90O0lUIEVuYWJsaW5nIFNlcnZpY2VzJnF1b3Q7LiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaXNjaXBsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlzY2lwbGluZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUb29sIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRvb2wgaXMgYSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldEdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvbGVTZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlU2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkN1c3RvbUNhdGVnb3J5IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIEN1c3RvbSBDYXRlZ29yeSBpcyBhIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgJnF1b3Q7VGVzdGluZyZxdW90OyBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYXRlZ29yaXplZEVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViQ2F0ZWdvcmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVsaXZlcnkgUHJvY2Vzc2VzIGlzIGEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLiYjeEQ7JiN4QTtBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWR1Y2F0aW9uTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgaXMgYSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LiYjeEQ7JiN4QTtDb3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY2x1ZGVzUGF0dGVybnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRDb250ZXh0IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWxpZENvbnRleHQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm4iIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuJiN4RDsmI3hBO0EgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOiYjeEQ7JiN4QTstIFRvIHNlcnZlIGFzIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYXNzZW1ibGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMuICBOb3JtYWxseSBkZXZlbG9waW5nIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBub3QgZG9uZSBmcm9tIHNjcmF0Y2ggYnV0IGJ5IHN5c3RlbWF0aWNhbGx5IGFwcGx5aW5nIGFuZCBiaW5kaW5nIHBhdHRlcm5zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHBhdHRlcm4gYXBwbGljYXRpb24gb2YgJ2NvcHktYW5kLW1vZGlmeScsIHdoaWNoIGFsbG93cyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gaXQgaXMgYXBwbGllZCBmb3IsIHRoZSBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIChTZWN0aW9uIDYuMSkgaW50cm9kdWNlcyBldmVuIG1vcmUgc29waGlzdGljYXRlZCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIHRoYXQgc3VwcG9ydCBkeW5hbWljIGJpbmRpbmcgb2YgcGF0dGVybnMgKGkuZS4gdGhlIHBhdHRlcm4gaXMgcmVmZXJlbmNlZCBhbmQgbm90IGNvcGllZCkuICBUaGlzIHVuaXF1ZSBuZXcgd2F5IG9mIHJldXNpbmcgcHJvY2VzcyBrbm93bGVkZ2UgYWxsb3dzIHRvIGZhY3RvciBvdXQgY29tbW9ubHkgcmVvY2N1cnJpbmcgQWN0aXZpdGllcyBpbnRvIHBhdHRlcm5zIGFuZCB0byBhcHBseSB0aGVtIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGEgcHJvY2Vzcy4gIFdoZW4gdGhlIHBhdHRlcm4gaXMgYmVpbmcgcmV2aXNlZCBvciB1cGRhdGVkLCBhbGwgY2hhbmdlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIGFsbCBwYXR0ZXJuIGFwcGxpY2F0aW9uIGluIGFsbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBiaW5kaW5nLiYjeEQ7JiN4QTstIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLiYjeEQ7JiN4QTstIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuJiN4RDsmI3hBO0EgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlZE9uUHJvY2Vzc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvYWRtYXAiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2FkbWFwIGlzIGEgc3BlY2lhbCBHdWlkYW5jZSBUeXBlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuJiN4RDsmI3hBO0FuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NQYWNrYWdlICMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgaXMgYSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLiYjeEQ7JiN4QTtVTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgJnF1b3Q7YmxhY2sgYm94JnF1b3Q7LiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAmcXVvdDtyZWFsaXphdGlvbiZxdW90OyBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2VzcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2Nlc3MiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBQYWNrYWdlIGlzIGEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMsIG9ubHkuJiN4RDsmI3hBO0Ega2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2Vzc0VsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW1zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UgY29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VJTyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUHJvY2VzcyBDb21wb25lbnQgYXBwbGljYXRpb24gaW4gYSBQcm9jZXNzLCBpLmUuIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluaW5nIHRoZSBQcm9jZXNzLiAgVGhlIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgZGV0YWlscyBvZiB0aGUgY29tcG9uZW50IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzIHN1Y2ggYXMgaXQgb3duIHByZWRlY2Vzc29ycyBhbmQgc3VjY2Vzc29ycy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2Nlc3NDb21wb25lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGx1Z2luIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBQbHVnaW4gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuJiN4RDsmI3hBO01ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLiYjeEQ7JiN4QTtTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhcmlhYmlsaXR5RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBjbGFzcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBuZXcgY2FwYWJpbGl0aWVzIGZvciBjb250ZW50IHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIENvbnRlbnQgRWxlbWVudHMgb3IgYW55IG90aGVyIE1ldGhvZCBFbGVtZW50IHRoYXQgZGVyaXZlcyBmcm9tIGl0LiAgSXQgaGFzIGJlZW4gcGxhY2VkIGluLWJldHdlZW4gdGhlIGNsYXNzZXMgTWV0aG9kIEVsZW1lbnQgYW5kIENvbnRlbnQgRWxlbWVudCBpbiB0aGUgb3ZlcmFsbCBVTUEgdGF4b25vbXkgb2YgY2xhc3NlcyB1c2luZyB0aGUgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIG1lY2hhbmlzbS4gIFRoZSBhc3NvY2lhdGlvbiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiBzaGFsbCBvbmx5IGJlIGluc3RhbnRpYXRlZCBiZXR3ZWVuIHR3byBzdWJjbGFzc2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIHNhbWUgdHlwZS4gIFRoZSBlbGVtZW50IG9uIHZhcmFpYmlsaXR5U3BlY2lhbEVsZW1lbnQgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGRlZmluZXMgYSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUgZGVmaW5pbmcgdGhlIG5hdHVyZSBvZiB0aGUgcmVsYXRpb25zaGlwIHVzaW5nIGEgbGl0ZXJhbCBmcm9tIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBtZXRhLW1vZGVsIHBhY2thZ2UgTWV0aG9kIFBsdWdpbnMgYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlcml2ZSBmcm9tIGl0LiAgQnkgZGVmYXVsdCBhbGwgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGUsIFRhc2ssIEd1aWRhbmNlIFR5cGVzLCBvciBBY3Rpdml0aWVzIGFyZSBkZWZpbmVkIHRvIGJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIHByb3ZpZGVzIHVuaXF1ZSBtZWNoYW5pc21zIGZvciBjdXN0b21pemluZyBtZXRob2QgY29udGVudCB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudCwgYnV0IGJ5IGp1c3QgYmUgYWJsZSB0byBkZXNjcmliZSB3aXRoIHNlcGFyYXRlIG9iamVjdHMgdGhlIGRpZmZlcmVuY2VzIChhZGRpdGlvbnMsIGNoYW5nZXMsIG9taXNzaW9ucykgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsLiAgVGhpcyBwbHVnLWluIGNvbmNlcHQgYWxsb3dzIHVzZXJzIHRvIGZhY3RvciB0aGVpciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGludGVycmVsYXRlZCB1bml0cyBhbmQgZXZlbiB0byBhcmNoaXRlY3QgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBsYXllcnMgdGhhdCBleHRlbmQgZWFjaCBvdGhlciB3aXRoIG5ldyBjYXBhYmlsaXRpZXMuICBUaGUgcmVzdWx0aW5nIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNpZ24gY2FuIGJlIGR5bmFtaWNhbGx5IGNvbWJpbmVkIGFuZCBhcHBsaWVkIG9uIGRlbWFuZCB1c2luZyB0aGUgaW50ZXJwcmV0YXRpb24gcnVsZXMgZGVmaW5lZCBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudCBTcGVjaWFsaXphdGlvbnMgYXNzZW1ibGluZyB0byBwcm9jZXNzIHByYWN0aXRpb25lcnMgdGhlIG1vc3QgYWNjdXJhdGUgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2NyaXB0aW9ucyBwb3NzaWJsZS4gIEl0IGFsc28gYWxsb3dzIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0byBleHRlbmRzIGFuZCB0YWlsb3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyB0aGV5IGRvIG5vdCBvd24gYW5kIHRvIGVhc2lseSB1cGdyYWRlIHRvIG5ld2VyIHZlcnNpb25zIGJ5IHNpbXBseSByZWFwcGx5IHRoZWlyIHBlcnNvbmFsIGNoYW5nZXMgdG8gdGhlc2UgdXBncmFkZXMuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyB0d28gdHlwZXMgb2YgdmFyaWFiaWxpdHkgYW5kIG9uZSB0eXBlIG9mIGV4dGVuc2lvbiB3aGljaCBhcmUgZm9ybWFsbHkgZGVmaW5lZCBmb3IgdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5VHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibmEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBpbiBpbnN0YW5jZSBvZiB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGV4aXN0cywgdGhlbiB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IGVuZCBvZiB0aGUgYXNzb2NpYXRpb24gY2hhbmdlcyB0aGUgQ29udGVudCBFbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IGVuZC4gU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5RWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgVHlwZSBpcyBhbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJuYSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iY29udHJpYnV0ZXMiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJleHRlbmRzIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0icmVwbGFjZXMiIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb24iIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29udHJpYnV0aW9uIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZXh0ZXJuYWxseSBkZWZpbmVzIGFkZGl0aW9ucyBhbmQgY2hhbmdlcyB0byBhbiBleGlzdGluZyBQcm9jZXNzIHdpdGhvdXQgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBleGlzdGluZyBQcm9jZXNzLiAgSXQgYWNoaWV2ZXMgdGhpcyBieSBkZXNjcmliaW5nIHRoZXNlIGFkZGl0aW9ucyBhbmQgY2hhbmdlcyBpbiBhIHNlcGFyYXRlIFByb2Nlc3Mgc3RydWN0dXJlLiAgVGhpcyBzdHJ1Y3R1cmUncyBlbGVtZW50cyByZWxhdGUgdG8gdGhlIG90aGVyIFByb2Nlc3MnIGVsZW1lbnRzIHVzaW5nIENvbnRyaWJ1dGVzIGFuZCBSZXBsYWNlIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9ucy4gIFByb2Nlc3MgQ29udHJpYnV0aW9ucyBhcmUgbm9ybWFsbHkgcGFja2FnZWQgd2l0aCBNZXRob2QgUGx1Z2lucyB0aGF0IGV4dGVuZCBleGlzdGluZyBNZXRob2QgUGx1Z2luIHdpdGggbmV3IGNhcGFiaWxpdGllcy4mI3hEOyYjeEE7QSBQcm9jZXNzIENvbnRyaWJ1dGlvbiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGFwcGxpZXMgdGhlIHNlbWFudGljcyBvZiB0aGUgQ29udHJpYnV0ZXMgYW5kIFJlcGxhY2VzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIG9uIFByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBDb250cmlidXRpb24gaXMgYSBraW5kIG9mICdwcm9jZXNzIHBsdWctaW4nIHRoYXQgJ3BsdWdzJyBhZGRpdGlvbmFsIGJyZWFrZG93biBzdHJ1Y3R1cmVzIGludG8gYW4gZXhpdGluZyBwcm9jZXNzIGFuZCB0aGVyZWZvcmUgdXBkYXRlcyBpdCBhLXBvc3Rlcmlvcmkgd2l0aCBuZXcgb3IgY2hhbmdlZCBjYXBhYmlsaXRpZXMuICBUeXBpY2FsIGFwcGxpY2F0aW9ucyBvZiBQcm9jZXNzIENvbnRyaWJ1dGlvbnMgYXJlIE1ldGhvZCBQbHVnaW5zIHRoYXQgYWRkIGNvbnRlbnQgZnJvbSBzcGVjaWZpYyBhcmVhcyB0byBhbiBleGlzdGluZyBkb21haW4uICBJbiBhZGRpdGlvbiB0byBqdXN0IGNvbnRyaWJ1dGluZyBuZXcgbWV0aG9kIGNvbnRlbnQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMsIFByb2Nlc3MgQ29udHJpYnV0aW9ucyBjYW4gYWxzbyBkZWZpbmUgd2hlcmUgaW4gdGhlIFByb2Nlc3NlcyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIHdpdGggdGhpcyBtZXRob2QgY29udGVudCB0aG9zZSBuZXcgYWRkaXRpb25zIHNob3VsZCBiZSBhcHBsaWVkLiAgTW9yZW92ZXIsIGl0IGFsbG93cyBkZWZpbmluZyB3aG9sZSBuZXcgb3IgY2hhbmdlZCBBY3Rpdml0aWVzIHdpdGhpbiB0aGVzZSBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VQcm9jZXNzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2VzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RVbml0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFVuaXQgaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRob3JzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURhdGUiIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvcHlyaWdodFN0YXRlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgQ29uZmlndXJhdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2luU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzVmlld3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0VmlldyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlQ29uZmlndXJhdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0ZhbWlseSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVsaXZlcnkgTW9kZWwgRmFtaWx5IGlzIGEgY29udmVuaWVudCBncm91cGluZyBvZiBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgb2YgaW50ZXJlc3QgdG8gc29tZSBzcGVjaWZpYyB1c2VyIGNvbW11bml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RlbGl2ZXJ5UHJvY2VzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RMaWJyYXJ5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2lucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjIvdW1hLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTY5MDU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIGNvcHlyaWdodFRleHQ9IklCTSBSYXRpb25hbCBTb2Z0d2FyZSIKLSAgICBtb2RlbERpcmVjdG9yeT0iL2NvbS5pYm0udW1hL3NyYyIgZWRpdERpcmVjdG9yeT0iL2NvbS5pYm0udW1hLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9jb20uaWJtLnVtYS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9ImNvbS5pYm0udW1hIiB0ZW1wbGF0ZURpcmVjdG9yeT0iL2NvbS5pYm0udW1hLmVjb3JlL3RlbXBsYXRlcyIgcnVudGltZUphcj0idHJ1ZSIKLSAgICBkeW5hbWljVGVtcGxhdGVzPSJ0cnVlIiBtb2RlbE5hbWU9IlVtYSIgZWRpdFBsdWdpbkNsYXNzPSJjb20uaWJtLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJjb20uaWJtLnVtYS5wcmVzZW50YXRpb24uVW1hRWRpdG9yUGx1Z2luIiBub25OTFNNYXJrZXJzPSJ0cnVlIgotICAgIHJvb3RFeHRlbmRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0IiByb290RXh0ZW5kc0NsYXNzPSJjb20uaWJtLnVtYWYuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdCIKLSAgICByb290SW1wbGVtZW50c0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5JbnRlcm5hbEVEYXRhT2JqZWN0IiBzdXBwcmVzc0VNRlR5cGVzPSJ0cnVlIgotICAgIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJmYWNlPSJjb21tb25qLnNkby5TZXF1ZW5jZSIgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcm5hbEludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkVTZXF1ZW5jZSIKLSAgICBmZWF0dXJlTWFwV3JhcHBlckNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuQmFzaWNFU2VxdWVuY2UiPgotICA8Zm9yZWlnbk1vZGVsPkM6XEhvbWVccGhUTkdcVE5HX2RvY3NcT09BRFxDb250ZW50QXJjaGl0ZWN0dXJlXE1vZGVsc1xVTUEwMlxVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8c3RhdGljUGFja2FnZXM+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9TRE88L3N0YXRpY1BhY2thZ2VzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0NPTU1PTkpfU0RPPW9yZy5lY2xpcHNlLmVtZi5jb21tb25qLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfRUNPUkVfU0RPPW9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJVbWEiIGJhc2VQYWNrYWdlPSJjb20uaWJtIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgZWNvcmVQYWNrYWdlPSJ1bWEuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9TdGFydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL2ZpbmlzaFRvRmluaXNoIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb0ZpbmlzaCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL25hIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9jb250cmlidXRlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvZXh0ZW5kcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvcmVwbGFjZXMiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vRGF0ZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vVXJpIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TdHJpbmciLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1NldCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2VxdWVuY2UiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0ludGVnZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DbGFzc2lmaWVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHlwZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lc3BhY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2d1aWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2JyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vd25lZFJ1bGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9zdXBwcmVzc2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vcmRlcmluZ0d1aWRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnN0cmFpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnN0cmFpbnQvYm9keSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvc3VwcG9ydGluZ01hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NvbmNlcHRzQW5kUGFwZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2Fzc2V0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvc2hhcGVpY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L25vZGVpY29uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL21haW5EZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vc2VjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24va2V5Q29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2VjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlY3Rpb24vc2VjdGlvbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlY3Rpb24vc3ViU2VjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZS9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9lc3RpbWF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3JlcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90ZW1wbGF0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90b29sTWVudG9ycyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3BlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9zdGVwcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svdG9vbE1lbnRvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9lc3RpbWF0ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3ByZWNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N0ZXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkYW5jZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVyQXJ0aWZhY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZS9kZWxpdmVyZWRXb3JrUHJvZHVjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vT3V0Y29tZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ2xvYmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9yZXVzZWRQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL3BhcmVudFBhY2thZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9jaGlsZFBhY2thZ2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UvY29udGVudEVsZW1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vYnJpZWZPdXRsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9yZXByZXNlbnRhdGlvbk9wdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9pbXBhY3RPZk5vdEhhdmluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcmVhc29uc0Zvck5vdE5lZWRpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9leHRlcm5hbERlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9wYWNrYWdpbmdHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9za2lsbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vYXNzaWdubWVudEFwcHJvYWNoZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc3lub255bXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbi9hdHRhY2htZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FkZGl0aW9uYWxJbmZvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9wcm9ibGVtIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9iYWNrZ3JvdW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9nb2FscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYXBwbGljYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2xldmVsc09mQWRvcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUG9pbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvaW50L3giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2ludC95Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9wb3NpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvY29udGFpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9saW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9hbmNob3JhZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L2lzVmlzaWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9yZWZlcmVuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvcHJvcGVydHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL3pvb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvdmlld3BvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3RvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGltZW5zaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vd2lkdGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vaGVpZ2h0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlZmVyZW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvcGVydHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L2tleSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFZGdlL2FuY2hvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVkZ2Uvd2F5cG9pbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW0iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW0vem9vbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL3ZpZXdwb2ludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vZGlhZ3JhbUxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS9uYW1lc3BhY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhOb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhOb2RlL3NpemUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50L3R5cGVJbmZvIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9MZWFmRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RleHRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UZXh0RWxlbWVudC90ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0ltYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9JbWFnZS91cmkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9JbWFnZS9taW1lVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaGljUHJpbWl0aXZlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUG9seWxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvbHlsaW5lL2Nsb3NlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qb2x5bGluZS93YXlwb2ludHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRWxsaXBzZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNYIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNZIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yb3RhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2Uvc3RhcnRBbmdsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvZW5kQW5nbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRWxsaXBzZS9jZW50ZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2JyZWFrZG93bkVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcm9hZG1hcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9zdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2NvbmNlcHRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvZXhhbXBsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9ndWlkZWxpbmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcmV1c2FibGVBc3NldHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzUmVwZWF0YWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzT25nb2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzRXZlbnREcml2ZW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9saW5rVG9QcmVkZWNlc3NvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZWZpeCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNQbGFubmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9oYXNNdWx0aXBsZU9jY3VycmVuY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9pc09wdGlvbmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRBZnRlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlc2VudGVkQmVmb3JlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcGxhbm5pbmdEYXRhIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9zdXBlckFjdGl2aXRpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWlsZXN0b25lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vSXRlcmF0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGhhc2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUvdGVhbVJvbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUvc3ViVGVhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvUm9sZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL3BlcmZvcm1zQWRkaXRpb25hbGx5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvYXNzaXN0c0luIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL3BlcmZvcm1zQXNPd25lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtPcmRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya09yZGVyL2xpbmtUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya09yZGVyL3ByZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9zdGFydERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvZmluaXNoRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9yYW5rIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaXB0b3IvaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9UYXNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hc3Npc3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3BlcmZvcm1lZFByaW1hcmlseUJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivc2VsZWN0ZWRTdGVwcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUVudHJ5U3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvYWN0aXZpdHlFeGl0U3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvV29ya1Byb2R1Y3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dFRvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdGVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dFRvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3Ivd29ya2VkT25CeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9PcHRpb25hbElucHV0VG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3Ivb3V0cHV0RnJvbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9kZWxpdmVyYWJsZVBhcnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL3Jlc3BvbnNpYmxlUm9sZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db21wb3NpdGVSb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db21wb3NpdGVSb2xlL2FnZ3JlZ2F0ZWRSb2xlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi91c2FnZUd1aWRhbmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vYWx0ZXJuYXRpdmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9ob3d0b1N0YWZmIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9zY2FsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9yaXNrTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9lc3RpbWF0aW5nVGVjaG5pcXVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdE1lbWJlckV4cGVydGlzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3R5cGVPZkNvbnRyYWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL2V4dGVybmFsSWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vc2NvcGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vdXNhZ2VOb3RlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi9yZWZpbmVkRGVzY3JpcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29uY2VwdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NoZWNrbGlzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0V4YW1wbGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkZWxpbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Fc3RpbWF0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0VzdGltYXRlL2VzdGltYXRpb25NZXRyaWMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRXN0aW1hdGUvZXN0aW1hdGlvbkNvbmRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Fc3RpbWF0aW5nTWV0cmljIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVwb3J0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVtcGxhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV2hpdGVwYXBlciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rlcm1EZWZpbml0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJhY3RpY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9zdWJQcmFjdGljZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9jb250ZW50UmVmZXJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL2FjdGl2aXR5UmVmZXJlbmNlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlzY2lwbGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS90YXNrcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvcmVmZXJlbmNlV29ya2Zsb3dzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVTZXQvcm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRG9tYWluIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Eb21haW4vd29ya1Byb2R1Y3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi9zdWJkb21haW5zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlL3dvcmtQcm9kdWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZy9kaXNjaXBsaW5lcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Ub29sL3Rvb2xNZW50b3JzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXRHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nL3JvbGVTZXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9jYXRlZ29yaXplZEVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkvc3ViQ2F0ZWdvcmllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9lZHVjYXRpb25NYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9pbmNsdWRlc1BhdHRlcm5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9kZWZhdWx0Q29udGV4dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvdmFsaWRDb250ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlL2Jhc2VkT25Qcm9jZXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9hZG1hcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvaW50ZXJmYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L3Byb2Nlc3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9wcm9jZXNzRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvZGlhZ3JhbXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VJTyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IvUHJvY2Vzc0NvbXBvbmVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi91c2VyQ2hhbmdlYWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vbWV0aG9kUGFja2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vYmFzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbnRyaWJ1dGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbnRyaWJ1dGlvbi9iYXNlUHJvY2VzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RVbml0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2F1dGhvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC92ZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jb3B5cmlnaHRTdGF0ZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQbHVnaW5TZWxlY3Rpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBhY2thZ2VTZWxlY3Rpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL3Byb2Nlc3NWaWV3cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vZGVmYXVsdFZpZXciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2Jhc2VDb25maWd1cmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRmFtaWx5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRmFtaWx5L2RlbGl2ZXJ5UHJvY2Vzc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L21ldGhvZFBsdWdpbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeS9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3Byb3BlcnRpZXMudHh0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3Byb3BlcnRpZXMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZmIzZjljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy9wcm9wZXJ0aWVzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTm9uLU5MUyBNYXJrZXJzOgl0cnVlCi1Db250YWlubWVudCBQcm94aWVzOgl0cnVlCi1TdXBwcmVzcyBFTUYgTWV0YWRhdGE6CWZhbHNlCi1Sb290IEV4dGVuZHMgQ2xhc3M6CW9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdAotUm9vdCBFeHRlbmRzIEludGVyZmFjZToJb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3QKLUNvZGUgRm9ybWF0dGluZzoJdHJ1ZQotRHluYW1pYyBUZW1wbGF0ZXM6CXRydWUKLVRlbXBsYXRlIERpcmVjdG9yeToJL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjMvdW1hLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3VtYS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWRjNTc3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjMvdW1hLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTIyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ1bWEiCi0gICAgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMy91bWEuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYudW1hIj4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IjAzIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRhdGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuRGF0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIG9mIHRoZSB0eXBlIERhdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVyaSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubmV0LlVSSSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIHRoYXQgcG9pbnQgdG8gcmVzb3VyY2VzIHN1Y2ggYXMgZmlsZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVubGltaXRlZE5hdHVyYWwiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdHJpbmciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2V0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLlNldCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlNlcXVlbmNlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJbnRlZ2VyIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRmxvYXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuRmxvYXQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDbGFzc2lmaWVyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1R5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBDbGFzc2lmaWVyLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUeXBlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZWRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LiAgRGVmaW5lZCB0aGF0IGV2ZXJ5IGVsZW1lbnQgaGFzIGEgbmFtZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZXNwYWNlICMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVzcGFjZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lc3BhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiAgRXZlcnkgZWxlbWVudCBkZWZpbmVkIGFzIGEgVU1BIGluc3RhbmNlIGlzIGRlcml2ZWQgZnJvbSBNb2RlbCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaW4tc3RhbmNlIGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQsIGEgbmFtZSwgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3VpZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3duZWRSdWxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uc3RyYWludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VwcHJlc3NlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlIEV4dGVuZHMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3JkZXJpbmdHdWlkZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uc3RyYWludCIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29uc3RyYWludCBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib2R5IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBzdG9yZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4mI3hEOyYjeEE7Q29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25jZXB0c0FuZFBhcGVycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uY2VwdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4YW1wbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeGFtcGxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmV1c2FibGVBc3NldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQgIy8vQ2xhc3NpZmllciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmFibGUgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuJiN4RDsmI3hBO1RoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZSAoc2VlIFNlY3Rpb24gNC4xLjQpLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICZxdW90O3J1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQmcXVvdDsgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgJnF1b3Q7ajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCZxdW90OyB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICZxdW90O0FyY2hpdGVjdHVyZSBEb2N1bWVudCZxdW90Oy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vQ29udGVudERlc2NyaXB0aW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaGFwZWljb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9VcmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vZGVpY29uIiBlVHlwZT0iIy8vVXJpIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBEZXNjcmlwdGlvbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYWluRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIHN0b3JlIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlY3Rpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXlDb25zaWRlcmF0aW9ucyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iS2V5IENvbnNpZGVyYXRpb25zIHByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZWN0aW9uIiBlU3VwZXJUeXBlcz0iIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFNlY3Rpb24gaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25OYW1lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25EZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJTZWN0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZGVjZXNzb3IiIGVUeXBlPSIjLy9TZWN0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gICYjeEQ7JiN4QTtBIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBQcm9kdWN0IGlzIGFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLiYjeEQ7JiN4QTtBIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVwb3J0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVwb3J0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlbXBsYXRlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVtcGxhdGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50ICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4mI3hEOyYjeEE7QSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gJiN4RDsmI3hBO0EgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uICYjeEQ7JiN4QTtGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCZxdW90OyBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICZxdW90O21ldGhvZCZxdW90OyBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1lZEJ5IiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0cHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcHRpb25hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdGVwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3RlcCIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCi0gICAgICAgIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0RlZmluaXRpb24iIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBEZWZpbml0aW9uIGlzIGFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuJiN4RDsmI3hBO1dvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlY29uZGl0aW9uIiBlVHlwZT0iIy8vQ29uc3RyYWludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0ZXAiIGVTdXBlclR5cGVzPSIjLy9TZWN0aW9uICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFN0ZXAgaXMgYSBTZWN0aW9uIGFuZCBXb3JrIERlZmluaXRpb24gdGhhdCBpcyB1c2VkIHRvIG9yZ2FuaXplIFRhc2tzIGludG8gcGFydHMgb3Igc3VidW5pdHMgb2Ygd29yay4gIFN0ZXBzIGluaGVyaXQgdGhlIHN1YlNlY3Rpb25zIGRlY29tcG9zaXRpb24gZnJvbSBTZWN0aW9uIGFuZCBjYW4gdGhlcmVmb3JlIGRlc2NyaWJlIFN1Yi1TdGVwcyBuZXN0ZWQgaW50byBTdGVwcy4mI3hEOyYjeEE7QSBTdGVwIGRlc2NyaWJlcyBhIG1lYW5pbmdmdWwgYW5kIGNvbnNpc3QgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSBUYXNrLiAgVGhlIGNvbGxlY3Rpb24gb2YgU3RlcHMgZGVmaW5lZCBmb3IgYSBUYXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFsbCBkZXZlbG9wbWVudCBnb2FsIG9mIHRoZSBUYXNrLiAgTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkIGVhY2ggdGltZSBhIFRhc2sgaXMgaW52b2tlZCBpbiBhIFByb2Nlc3MgKHNlZSBUYXNrIERlc2NyaXB0b3IpLCBzbyB0aGV5IGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBpbiB0aGUgZm9ybSBvZiBhbHRlcm5hdGUgJ2Zsb3dzJyBvZiB3b3JrLiAgRGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lIGRldmVsb3BtZW50IGdvYWwgY2FuIHRoZW4gYmUgJ2Fzc2VtYmxlZCcgYnkgc2VsZWN0aW5nIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2Ygc3RlcHMgd2hlbiBhcHBseWluZyB0aGUgVGFzayBpbiBhIFByb2Nlc3MuICBUeXBpY2FsIGtpbmRzIG9mIHN0ZXBzIGEgVGFzayBhdXRob3Igc2hvdWxkIGNvbnNpZGVyIGFyZTogVGhpbmtpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIHVuZGVyc3RhbmQgdGhlIG5hdHVyZSBvZiB0aGUgdGFzaywgZ2F0aGVycyBhbmQgZXhhbWluZXMgdGhlIGlucHV0IGFydGlmYWN0cywgYW5kIGZvcm11bGF0ZXMgdGhlIG91dGNvbWUuIFBlcmZvcm1pbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGNyZWF0ZSBvciB1cGRhdGUgc29tZSBhcnRpZmFjdHMuIFJldmlld2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgaW5zcGVjdHMgdGhlIHJlc3VsdHMgYWdhaW5zdCBzb21lIGNyaXRlcmlhLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0IiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFydGlmYWN0IGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuJiN4RDsmI3hBO0FydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAmcXVvdDtvd24mcXVvdDsgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyQXJ0aWZhY3QiIGVUeXBlPSIjLy9BcnRpZmFjdCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0FydGlmYWN0L2NvbnRhaW5lZEFydGlmYWN0cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWRBcnRpZmFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FydGlmYWN0IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9BcnRpZmFjdC9jb250YWluZXJBcnRpZmFjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlbGl2ZXJhYmxlIGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcmVkV29ya1Byb2R1Y3RzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRjb21lIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIG91dGNvbWUgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGFja2FnZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFBhY2thZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2xvYmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJNZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXVzZWRQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGlsZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50UGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29udGVudCBQYWNrYWdlIGlzIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnRFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZPdXRsaW5lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXByZXNlbnRhdGlvbk9wdGlvbnMiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW1wYWN0T2ZOb3RIYXZpbmciIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYXNvbnNGb3JOb3ROZWVkaW5nIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFja2FnaW5nR3VpZGFuY2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2tpbGxzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN5bm9ueW1zIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dGFjaG1lbnRzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsSW5mbyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2JsZW0iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFja2dyb3VuZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnb2FscyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFwcGxpY2F0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9pbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zaXRpb24iIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVkIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUVsZW1lbnQvY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpbmsiIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1MaW5rIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtTGluay9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYW5jaG9yYWdlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HcmFwaENvbm5lY3RvciIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbWFudGljTW9kZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2dyYXBoRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNWaXNpYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXIiIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvY29udGFpbmVkIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVmZXJlbmNlIiBlT3Bwb3NpdGU9IiMvL1JlZmVyZW5jZS9yZWZlcmVuY2VkIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb3BlcnR5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbUxpbmsiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Inpvb20iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmlld3BvcnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2xpbmsiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW0iIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbS9kaWFncmFtTGluayIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaENvbm5lY3RvciIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9hbmNob3JhZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFZGdlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HcmFwaEVkZ2UiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFZGdlL2FuY2hvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZW1hbnRpY01vZGVsQnJpZGdlIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9zZW1hbnRpY01vZGVsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW0iIGVUeXBlPSIjLy9EaWFncmFtIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbS9uYW1lc3BhY2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGltZW5zaW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2lkdGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGVpZ2h0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlZmVyZW5jZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZWQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9EaWFncmFtRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9yZWZlcmVuY2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvcGVydHkiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhFZGdlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYW5jaG9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iMiIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBlT3Bwb3NpdGU9IiMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3YXlwb2ludHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BvaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhOb2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9pbnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbUxpbmsiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1MaW5rIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2RpYWdyYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZXNwYWNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9kaWFncmFtIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoTm9kZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNpemUiIGVUeXBlPSIjLy9EaW1lbnNpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVJbmZvIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50IiBlVHlwZT0iIy8vTWV0aG9kRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMZWFmRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRleHRFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0ZXh0IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW1hZ2UiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVyaSIgZVR5cGU9IiMvL1VyaSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW1lVHlwZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoaWNQcmltaXRpdmUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2x5bGluZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbG9zZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVsbGlwc2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaGljUHJpbWl0aXZlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFkaXVzWCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNZIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvdGF0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0QW5nbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5kQW5nbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2VudGVyIiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5IiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQgIy8vVmFyaWFiaWxpdHlFbGVtZW50ICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBBY3Rpdml0eSBpcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uJiN4RDsmI3hBO0FjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJicmVha2Rvd25FbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdGllcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2FkbWFwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9hZG1hcCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hlY2tsaXN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmNlcHRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25jZXB0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4YW1wbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeGFtcGxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imd1aWRlbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0d1aWRlbGluZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmV1c2FibGVBc3NldCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0VuYWN0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaXMgYSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNSZXBlYXRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNPbmdvaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNFdmVudERyaXZlbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpbmtUb1ByZWRlY2Vzc29yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrT3JkZXIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQnJlYWtkb3duIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVmaXgiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICZxdW90O1NSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzJnF1b3Q7IHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICZxdW90O1NvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyZxdW90OyBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAmcXVvdDtDdXN0b21lci5BcmNoaXRlY3QmcXVvdDsgd291bGQgZGVmaW5lIGEgJnF1b3Q7Q3VzdG9tZXImcXVvdDsgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICZxdW90O0FyY2hpdGVjdCZxdW90OyBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1BsYW5uZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV0YWlsIFVzZSBDYXNlJnF1b3Q7IHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09wdGlvbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNPcHRpb25hbCBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEFmdGVyIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50ZWRCZWZvcmUiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBsYW5uaW5nRGF0YSIgZVR5cGU9IiMvL1BsYW5uaW5nRGF0YSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwZXJBY3Rpdml0aWVzIiBlVHlwZT0iIy8vQWN0aXZpdHkiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vQWN0aXZpdHkvYnJlYWtkb3duRWxlbWVudHMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWlsZXN0b25lIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWlsZXN0b25lIGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSXRlcmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikl0ZXJhdGlvbiBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEQ7JiN4QTtJdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLikiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGhhc2UiIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUGhhc2UgaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7UGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlYW1Qcm9maWxlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZWFtIFByb2ZpbGUgaXMgYSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLiYjeEQ7JiN4QTtXb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuJiN4RDsmI3hBO0hlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVhbVJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBlclRlYW0iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9UZWFtUHJvZmlsZSIgZU9wcG9zaXRlPSIjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlRlYW0iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUm9sZSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kaWZpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IldvcmtPcmRlclR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgT3JkZXIgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChCKSBiZWxvdykgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChBKSBiZWxvdykgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvU3RhcnQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvRmluaXNoIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb1N0YXJ0IiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb0ZpbmlzaCIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya09yZGVyIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgT3JkZXIgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gICYjeEQ7JiN4QTsoTm90ZSwgV29yayBPcmRlciBpcyBub3QgbW9kZWxlZCBhcyBhbiBBc3NvY2lhdGlvbiBDbGFzcyB0byBwcm92aWRlIGEgc3RyYWlnaHRmb3J3YXJkIG1hcHBpbmcgIHRvIFhNSSBhbmQgRU1GLikmI3hEOyYjeEE7VGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua1R5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrT3JkZXJUeXBlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmaW5pc2hUb1N0YXJ0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWQiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb2Nlc3MgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLiYjeEQ7JiN4QTtQcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBsYW5uaW5nRGF0YSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQbGFubmluZyBEYXRhIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuJiN4RDsmI3hBO1BsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4mI3hEOyYjeEE7KE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRGF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhbmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLiYjeEQ7JiN4QTtEZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gICYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4mI3hEOyYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJXb3JrUHJvZHVjdCIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdGVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbXBhY3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdGVkQnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQgIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUYXNrIERlc2NyaXB0b3IgaXMgYSBEZXNjcmlwdG9yIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuJiN4RDsmI3hBO0Ega2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iVGFzayIgZVR5cGU9IiMvL1Rhc2siLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lzdGVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVybmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3JtZWRQcmltYXJpbHlCeSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbGVjdGVkU3RlcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcG9zaXRlUm9sZSIgZVN1cGVyVHlwZXM9IiMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbXBvc2l0ZSBSb2xlIGlzIGEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLiYjeEQ7JiN4QTtBIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWdncmVnYXRlZFJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlR3VpZGFuY2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJob3d0b1N0YWZmIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjYWxlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RDaGFyYWN0ZXJpc3RpY3MiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3MiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmlza0xldmVsIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0aW5nVGVjaG5pcXVlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZU9mQ29udHJhY3QiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBkZWxpdmVyeSBwYXR0ZXJucyBhbmQgbW9kZWxzLiBJdCBpcyB1c2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY29wZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlTm90ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uY2VwdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbmNlcHQgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDaGVja2xpc3QiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDaGVja2xpc3QgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4YW1wbGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGVsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgR3VpZGVsaW5lIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlcG9ydCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJlcG9ydCBpcyBhIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGVtcGxhdGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdXBwb3J0aW5nIE1hdGVyaWFscyBpcyBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUb29sTWVudG9yIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVG9vbCBNZW50b3IgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXaGl0ZXBhcGVyIiBlU3VwZXJUeXBlcz0iIy8vQ29uY2VwdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hpdGVwYXBlcnMgYXJlIGEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlcm1EZWZpbml0aW9uIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRlcm1EZWZpbml0aW9ucyBkZWZpbmUgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGhleSBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2UiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcmFjdGljZSByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgJnF1b3Q7TWFuYWdlIFJpc2tzJnF1b3Q7LCAmcXVvdDtDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkmcXVvdDssICZxdW90O0FyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQmcXVvdDssIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViUHJhY3RpY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9QcmFjdGljZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudFJlZmVyZW5jZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQWN0aXZpdHkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgcXVhbGlmeSB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXVzYWJsZUFzc2V0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmV1c2FibGUgQXNzZXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZyYjeEQ7JiN4QTtob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1ZlcnRleCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IldvcmtQcm9kdWN0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSZWdpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlZ2lvbiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1N0YXRlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1Ym1hY2hpbmUiIGVUeXBlPSIjLy9TdGF0ZU1hY2hpbmUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmVydGV4Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyIiBlVHlwZT0iIy8vUmVnaW9uIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1ZlcnRleCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRnb2luZyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVHJhbnNpdGlvbiIgZU9wcG9zaXRlPSIjLy9UcmFuc2l0aW9uL3NvdXJjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmNvbWluZyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVHJhbnNpdGlvbiIgZU9wcG9zaXRlPSIjLy9UcmFuc2l0aW9uL3RhcmdldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZWdpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJWZXJ0ZXgiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1ZlcnRleCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vVmVydGV4L2NvbnRhaW5lciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJUcmFuc2l0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UcmFuc2l0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9UcmFuc2l0aW9uL2NvbnRhaW5lciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJTdGF0ZSIgZVR5cGU9IiMvL1N0YXRlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU3RhdGUvUmVnaW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlN0YXRlTWFjaGluZSIgZVR5cGU9IiMvL1N0YXRlTWFjaGluZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1N0YXRlTWFjaGluZS9SZWdpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RhdGVNYWNoaW5lIiBlU3VwZXJUeXBlcz0iIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSZWdpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlZ2lvbiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1N0YXRlTWFjaGluZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUcmFuc2l0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iV29ya0RlZmluaXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtEZWZpbml0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1JlZ2lvbiIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1JlZ2lvbi9UcmFuc2l0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvdXJjZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1ZlcnRleCIgZU9wcG9zaXRlPSIjLy9WZXJ0ZXgvb3V0Z29pbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFyZ2V0IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVmVydGV4IiBlT3Bwb3NpdGU9IiMvL1ZlcnRleC9pbmNvbWluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQc2V1ZG9TdGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1ZlcnRleCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iUHNldWRvU3RhdGVLaW5kIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImluaXRpYWwiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImpvaW4iIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmb3JrIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ianVuY3Rpb24iIHZhbHVlPSIzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJjaG9pY2UiIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJlbnRyeVBvaW50IiB2YWx1ZT0iNSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXhpdFBvaW50IiB2YWx1ZT0iNiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0idGVybWluYXRlIiB2YWx1ZT0iNyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNjaXBsaW5lIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuJiN4RDsmI3hBO0EgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFza3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2siLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZGlzY2lwbGluZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlzY2lwbGluZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlV29ya2Zsb3dzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXQiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBTZXQgb3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgJnF1b3Q7QW5hbHlzdHMmcXVvdDsgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICZxdW90O0J1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCZxdW90OywgJnF1b3Q7U3lzdGVtIEFuYWx5c3QmcXVvdDssIGFzIHdlbGwgYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIFNwZWNpZmllciZxdW90OyByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRvbWFpbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRG9tYWluIGlzIGEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LiYjeEQ7JiN4QTtEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YmRvbWFpbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RvbWFpbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIFByb2R1Y3QgVHlwZSBpcyBhIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgJnF1b3Q7Q2xhc3MgRGlhZ3JhbSZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICZxdW90O1NwZWNpZmljYXRpb24mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtQcm9kdWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEaXNjaXBsaW5lIEdyb3VwaW5ncyBhcmUgdXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAmcXVvdDtTb2Z0d2FyZSBEaXNjaXBsaW5lcyZxdW90OyB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICZxdW90O1JlcXVpcmVtZW50cyBNYW5hZ2VtZW50JnF1b3Q7IG9yICZxdW90O1Rlc3RpbmcmcXVvdDs7ICZxdW90O0lUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQmcXVvdDsgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAmcXVvdDtJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyZxdW90OywgJnF1b3Q7SVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyZxdW90Oywgb3IgJnF1b3Q7SVQgRW5hYmxpbmcgU2VydmljZXMmcXVvdDsuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc2NpcGxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaXNjaXBsaW5lIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2wiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVG9vbCBpcyBhIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0R3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZVNldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVTZXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ3VzdG9tIENhdGVnb3J5IGlzIGEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAmcXVvdDtUZXN0aW5nJnF1b3Q7IGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhdGVnb3JpemVkRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJDYXRlZ29yaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBQcm9jZXNzZXMgaXMgYSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuJiN4RDsmI3hBO0EgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlZHVjYXRpb25NYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb21tdW5pY2F0aW9uc01hdGVyaWFscyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3MiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBpcyBhIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuJiN4RDsmI3hBO0NvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVmYXVsdENvbnRleHQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbGlkQ29udGV4dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4mI3hEOyYjeEE7QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6JiN4RDsmI3hBOy0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4mI3hEOyYjeEE7QSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VkT25Qcm9jZXNzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9hZG1hcCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvYWRtYXAgaXMgYSBzcGVjaWFsIEd1aWRhbmNlIFR5cGUgd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4mI3hEOyYjeEE7QW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50IiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc1BhY2thZ2UgIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBpcyBhIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuJiN4RDsmI3hBO1VNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2VzcyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4mI3hEOyYjeEE7QSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2Vzc0VsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZSBjb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZUlPIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBQcm9jZXNzIENvbXBvbmVudCBhcHBsaWNhdGlvbiBpbiBhIFByb2Nlc3MsIGkuZS4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIFByb2Nlc3MuICBUaGUgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBkZXRhaWxzIG9mIHRoZSBjb21wb25lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0byBwcm92aWRlIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMgc3VjaCBhcyBpdCBvd24gcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQbHVnaW4iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFBsdWdpbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4mI3hEOyYjeEE7TWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuJiN4RDsmI3hBO1NwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYXJpYWJpbGl0eUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50IHRoYXQgcHJvdmlkZXMgbmV3IGNhcGFiaWxpdGllcyBmb3IgY29udGVudCB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBDb250ZW50IEVsZW1lbnRzIG9yIGFueSBvdGhlciBNZXRob2QgRWxlbWVudCB0aGF0IGRlcml2ZXMgZnJvbSBpdC4gIEl0IGhhcyBiZWVuIHBsYWNlZCBpbi1iZXR3ZWVuIHRoZSBjbGFzc2VzIE1ldGhvZCBFbGVtZW50IGFuZCBDb250ZW50IEVsZW1lbnQgaW4gdGhlIG92ZXJhbGwgVU1BIHRheG9ub215IG9mIGNsYXNzZXMgdXNpbmcgdGhlIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBtZWNoYW5pc20uICBUaGUgYXNzb2NpYXRpb24gVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gc2hhbGwgb25seSBiZSBpbnN0YW50aWF0ZWQgYmV0d2VlbiB0d28gc3ViY2xhc3NlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBzYW1lIHR5cGUuICBUaGUgZWxlbWVudCBvbiB2YXJhaWJpbGl0eVNwZWNpYWxFbGVtZW50IHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBkZWZpbmVzIGEgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlIGRlZmluaW5nIHRoZSBuYXR1cmUgb2YgdGhlIHJlbGF0aW9uc2hpcCB1c2luZyBhIGxpdGVyYWwgZnJvbSB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4mI3hEOyYjeEE7VmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgbWV0YS1tb2RlbCBwYWNrYWdlIE1ldGhvZCBQbHVnaW5zIGFkZHMgdGhlIGNhcGFiaWxpdGllcyBvZiB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBNZXRob2QgRWxlbWVudHMgdGhhdCBkZXJpdmUgZnJvbSBpdC4gIEJ5IGRlZmF1bHQgYWxsIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlLCBUYXNrLCBHdWlkYW5jZSBUeXBlcywgb3IgQWN0aXZpdGllcyBhcmUgZGVmaW5lZCB0byBiZSBWYXJpYWJpbGl0eSBFbGVtZW50cy4mI3hEOyYjeEE7VmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBwcm92aWRlcyB1bmlxdWUgbWVjaGFuaXNtcyBmb3IgY3VzdG9taXppbmcgbWV0aG9kIGNvbnRlbnQgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIGJ1dCBieSBqdXN0IGJlIGFibGUgdG8gZGVzY3JpYmUgd2l0aCBzZXBhcmF0ZSBvYmplY3RzIHRoZSBkaWZmZXJlbmNlcyAoYWRkaXRpb25zLCBjaGFuZ2VzLCBvbWlzc2lvbnMpIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbC4gIFRoaXMgcGx1Zy1pbiBjb25jZXB0IGFsbG93cyB1c2VycyB0byBmYWN0b3IgdGhlaXIgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBpbnRlcnJlbGF0ZWQgdW5pdHMgYW5kIGV2ZW4gdG8gYXJjaGl0ZWN0IG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gbGF5ZXJzIHRoYXQgZXh0ZW5kIGVhY2ggb3RoZXIgd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiAgVGhlIHJlc3VsdGluZyBtZXRob2QgYW5kIHByb2Nlc3MgZGVzaWduIGNhbiBiZSBkeW5hbWljYWxseSBjb21iaW5lZCBhbmQgYXBwbGllZCBvbiBkZW1hbmQgdXNpbmcgdGhlIGludGVycHJldGF0aW9uIHJ1bGVzIGRlZmluZWQgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnQgU3BlY2lhbGl6YXRpb25zIGFzc2VtYmxpbmcgdG8gcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRoZSBtb3N0IGFjY3VyYXRlIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNjcmlwdGlvbnMgcG9zc2libGUuICBJdCBhbHNvIGFsbG93cyBwcm9jZXNzIHByYWN0aXRpb25lcnMgdG8gZXh0ZW5kcyBhbmQgdGFpbG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgdGhleSBkbyBub3Qgb3duIGFuZCB0byBlYXNpbHkgdXBncmFkZSB0byBuZXdlciB2ZXJzaW9ucyBieSBzaW1wbHkgcmVhcHBseSB0aGVpciBwZXJzb25hbCBjaGFuZ2VzIHRvIHRoZXNlIHVwZ3JhZGVzLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgdHdvIHR5cGVzIG9mIHZhcmlhYmlsaXR5IGFuZCBvbmUgdHlwZSBvZiBleHRlbnNpb24gd2hpY2ggYXJlIGZvcm1hbGx5IGRlZmluZWQgZm9yIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9WYXJpYWJpbGl0eVR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Im5hIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgaW4gaW5zdGFuY2Ugb2YgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbGl6YXRpb24gYXNzb2NpYXRpb24gYmV0d2VlbiB0d28gVmFyaWFiaWxpdHkgRWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZSBleGlzdHMsIHRoZW4gdGhlIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIGhvdyB0aGUgZWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudCBlbmQgb2YgdGhlIGFzc29jaWF0aW9uIGNoYW5nZXMgdGhlIENvbnRlbnQgRWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBlbmQuIFNlZSB0aGUgVmFyaWFiaWxpdHkgVHlwZSBlbnVtZXJhdGlvbiBjbGFzcyBmb3IgZGVmaW5pdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFiaWxpdHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9WYXJpYWJpbGl0eUVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlZhcmlhYmlsaXR5IFR5cGUgaXMgYW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibmEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNvbnRyaWJ1dGVzIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXh0ZW5kcyIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InJlcGxhY2VzIiB2YWx1ZT0iMyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibG9jYWxDb250cmlidXRpb24iIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJsb2NhbFJlcGxhY2VtZW50IiB2YWx1ZT0iNSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RVbml0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFVuaXQgaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRob3JzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvcHlyaWdodFN0YXRlbWVudCIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgQ29uZmlndXJhdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2luU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzVmlld3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0VmlldyIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlQ29uZmlndXJhdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0ZhbWlseSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVsaXZlcnkgTW9kZWwgRmFtaWx5IGlzIGEgY29udmVuaWVudCBncm91cGluZyBvZiBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgb2YgaW50ZXJlc3QgdG8gc29tZSBzcGVjaWZpYyB1c2VyIGNvbW11bml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RlbGl2ZXJ5UHJvY2VzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RMaWJyYXJ5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2lucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy91bWEuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjMvdW1hLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOTcwZTU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy91bWEuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS5lcGYudW1hIiB0ZW1wbGF0ZURpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzIgotICAgIHJ1bnRpbWVKYXI9InRydWUiIGR5bmFtaWNUZW1wbGF0ZXM9InRydWUiIG1vZGVsTmFtZT0iVW1hIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5wcmVzZW50YXRpb24uVW1hRWRpdG9yUGx1Z2luIiBub25OTFNNYXJrZXJzPSJ0cnVlIgotICAgIHJvb3RFeHRlbmRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdCIgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0IgotICAgIHJvb3RJbXBsZW1lbnRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkludGVybmFsRURhdGFPYmplY3QiIHN1cHByZXNzRU1GVHlwZXM9InRydWUiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcmZhY2U9ImNvbW1vbmouc2RvLlNlcXVlbmNlIiBmZWF0dXJlTWFwV3JhcHBlckludGVybmFsSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuRVNlcXVlbmNlIgotICAgIGZlYXR1cmVNYXBXcmFwcGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5CYXNpY0VTZXF1ZW5jZSIgY29kZUZvcm1hdHRpbmc9InRydWUiCi0gICAgY29udGFpbm1lbnRQcm94aWVzPSJ0cnVlIj4KLSAgPGZvcmVpZ25Nb2RlbD5DOlxIb21lXHBoVE5HXFROR19kb2NzXE9PQURcQ29udGVudEFyY2hpdGVjdHVyZVxNb2RlbHNcVU1BMDNcVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZS5tZGw8L2ZvcmVpZ25Nb2RlbD4KLSAgPHN0YXRpY1BhY2thZ2VzPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvU0RPPC9zdGF0aWNQYWNrYWdlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9DT01NT05KX1NETz1vcmcuZWNsaXBzZS5lbWYuY29tbW9uai5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0VDT1JFX1NETz1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iVW1hIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuZXBmIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgZWNvcmVQYWNrYWdlPSJ1bWEuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9TdGFydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL2ZpbmlzaFRvRmluaXNoIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb0ZpbmlzaCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2luaXRpYWwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2pvaW4iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2ZvcmsiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2p1bmN0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9jaG9pY2UiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2VudHJ5UG9pbnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2V4aXRQb2ludCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvdGVybWluYXRlIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbmEiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2NvbnRyaWJ1dGVzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9leHRlbmRzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9yZXBsYWNlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbG9jYWxDb250cmlidXRpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2xvY2FsUmVwbGFjZW1lbnQiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vRGF0ZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vVXJpIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TdHJpbmciLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1NldCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2VxdWVuY2UiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0ludGVnZXIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0Zsb2F0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2xhc3NpZmllciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1R5cGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTmFtZWRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QYWNrYWdlYWJsZUVsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QYWNrYWdlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTmFtZXNwYWNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9ndWlkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9icmllZkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvb3duZWRSdWxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvc3VwcHJlc3NlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvb3JkZXJpbmdHdWlkZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db25zdHJhaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db25zdHJhaW50L2JvZHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3N1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9jb25jZXB0c0FuZFBhcGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NoZWNrbGlzdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9ndWlkZWxpbmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZXhhbXBsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9hc3NldHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvcHJlc2VudGF0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3NoYXBlaWNvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9ub2RlaWNvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9tYWluRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL3NlY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2tleUNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1NlY3Rpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlY3Rpb24vc2VjdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3NlY3Rpb25EZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3N1YlNlY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VjdGlvbi9wcmVkZWNlc3NvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvbW9kaWZpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9yZXBvcnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvdGVtcGxhdGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvdG9vbE1lbnRvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFzayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9wZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svc3RlcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3Rvb2xNZW50b3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wcmVjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24vcG9zdGNvbmRpdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdGVwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BcnRpZmFjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FydGlmYWN0L2NvbnRhaW5lckFydGlmYWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FydGlmYWN0L2NvbnRhaW5lZEFydGlmYWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGUvZGVsaXZlcmVkV29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL091dGNvbWUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL2dsb2JhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvcmV1c2VkUGFja2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9wYXJlbnRQYWNrYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvY2hpbGRQYWNrYWdlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50UGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRQYWNrYWdlL2NvbnRlbnRFbGVtZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL2JyaWVmT3V0bGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vcmVwcmVzZW50YXRpb25PcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vZXh0ZXJuYWxJZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vaW1wYWN0T2ZOb3RIYXZpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3JlYXNvbnNGb3JOb3ROZWVkaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vZXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vcGFja2FnaW5nR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc2tpbGxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL2Fzc2lnbm1lbnRBcHByb2FjaGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3N5bm9ueW1zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vYWx0ZXJuYXRpdmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24vYXR0YWNobWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hZGRpdGlvbmFsSW5mbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vcHJvYmxlbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYmFja2dyb3VuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vZ29hbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FwcGxpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9sZXZlbHNPZkFkb3B0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BvaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2ludC94Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9pbnQveSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvcG9zaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2NvbnRhaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvbGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvYW5jaG9yYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9zZW1hbnRpY01vZGVsIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9pc1Zpc2libGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvY29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvcmVmZXJlbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L3Byb3BlcnR5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW1MaW5rIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay96b29tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL3ZpZXdwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL2RpYWdyYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVkZ2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9ncmFwaEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9kaWFncmFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpbWVuc2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGltZW5zaW9uL3dpZHRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGltZW5zaW9uL2hlaWdodCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZWZlcmVuY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JlZmVyZW5jZS9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZmVyZW5jZS9yZWZlcmVuY2VkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9wZXJ0eS9rZXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9wZXJ0eS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaEVkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWRnZS9hbmNob3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFZGdlL3dheXBvaW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaWFncmFtL3pvb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS92aWV3cG9pbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vbmFtZXNwYWNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoTm9kZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoTm9kZS9zaXplIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC90eXBlSW5mbyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9VTUFTZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9VTUFTZW1hbnRpY01vZGVsQnJpZGdlL2VsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlL2VsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTGVhZkVsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZXh0RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGV4dEVsZW1lbnQvdGV4dCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9JbWFnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vSW1hZ2UvdXJpIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vSW1hZ2UvbWltZVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhpY1ByaW1pdGl2ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BvbHlsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2x5bGluZS9jbG9zZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUG9seWxpbmUvd2F5cG9pbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VsbGlwc2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvcmFkaXVzWCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvcmFkaXVzWSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2Uvcm90YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3N0YXJ0QW5nbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL2VuZEFuZ2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0VsbGlwc2UvY2VudGVyIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FjdGl2aXR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L3JvYWRtYXBzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvc3VwcG9ydGluZ01hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2NoZWNrbGlzdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9jb25jZXB0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2V4YW1wbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvZ3VpZGVsaW5lcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L3JldXNhYmxlQXNzZXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHkvaXNFbmFjdGFibGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzUmVwZWF0YWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzT25nb2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzRXZlbnREcml2ZW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9saW5rVG9QcmVkZWNlc3NvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZWZpeCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNQbGFubmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9oYXNNdWx0aXBsZU9jY3VycmVuY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9pc09wdGlvbmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRBZnRlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlc2VudGVkQmVmb3JlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcGxhbm5pbmdEYXRhIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9zdXBlckFjdGl2aXRpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWlsZXN0b25lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vSXRlcmF0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGhhc2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUvdGVhbVJvbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUvc3ViVGVhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvUm9sZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvbW9kaWZpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9yZXNwb25zaWJsZUZvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtPcmRlci9saW5rVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtPcmRlci9wcmVkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvc3RhcnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL2ZpbmlzaERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvcmFuayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmlwdG9yL2lzU3luY2hyb25pemVkV2l0aFNvdXJjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUVudHJ5U3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvYWN0aXZpdHlFeGl0U3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvV29ya1Byb2R1Y3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2RlbGl2ZXJhYmxlUGFydHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL1Rhc2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2Fzc2lzdGVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9leHRlcm5hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vcHRpb25hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvcGVyZm9ybWVkUHJpbWFyaWx5QnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9zZWxlY3RlZFN0ZXBzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbXBvc2l0ZVJvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbXBvc2l0ZVJvbGUvYWdncmVnYXRlZFJvbGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uL3VzYWdlR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2hvd3RvU3RhZmYiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3NjYWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdENoYXJhY3RlcmlzdGljcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Jpc2tMZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL2VzdGltYXRpbmdUZWNobmlxdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vdHlwZU9mQ29udHJhY3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vZXh0ZXJuYWxJZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9zY29wZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi91c2FnZU5vdGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uL3JlZmluZWREZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db25jZXB0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXhhbXBsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRlbGluZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlcG9ydCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RlbXBsYXRlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVG9vbE1lbnRvciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1doaXRlcGFwZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZXJtRGVmaW5pdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ByYWN0aWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2Uvc3ViUHJhY3RpY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2UvY29udGVudFJlZmVyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9hY3Rpdml0eVJlZmVyZW5jZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmV1c2FibGVBc3NldCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N0YXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TdGF0ZS9Xb3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TdGF0ZS9SZWdpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TdGF0ZS9zdWJtYWNoaW5lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ZlcnRleCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZlcnRleC9jb250YWluZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WZXJ0ZXgvb3V0Z29pbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WZXJ0ZXgvaW5jb21pbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVnaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVnaW9uL1ZlcnRleCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vVHJhbnNpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vU3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVnaW9uL1N0YXRlTWFjaGluZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdGF0ZU1hY2hpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TdGF0ZU1hY2hpbmUvUmVnaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RyYW5zaXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RyYW5zaXRpb24vV29ya0RlZmluaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi9jb250YWluZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UcmFuc2l0aW9uL3NvdXJjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RyYW5zaXRpb24vdGFyZ2V0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlzY2lwbGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS90YXNrcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3N1YmRpc2NpcGxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3JlZmVyZW5jZVdvcmtmbG93cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlU2V0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlU2V0L3JvbGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RvbWFpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRG9tYWluL3dvcmtQcm9kdWN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Eb21haW4vc3ViZG9tYWlucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZS93b3JrUHJvZHVjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmcvZGlzY2lwbGluZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVG9vbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVG9vbC90b29sTWVudG9ycyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVTZXRHcm91cGluZy9yb2xlU2V0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkvY2F0ZWdvcml6ZWRFbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L3N1YkNhdGVnb3JpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvZWR1Y2F0aW9uTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2NvbW11bmljYXRpb25zTWF0ZXJpYWxzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvaW5jbHVkZXNQYXR0ZXJucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvZGVmYXVsdENvbnRleHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL3ZhbGlkQ29udGV4dCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DYXBhYmlsaXR5UGF0dGVybiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS9iYXNlZE9uUHJvY2Vzc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvYWRtYXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L2ludGVyZmFjZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9wcm9jZXNzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvcHJvY2Vzc0VsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlL2RpYWdyYW1zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2ludGVyZmFjZVNwZWNpZmljYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlSU8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yL1Byb2Nlc3NDb21wb25lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vdXNlckNoYW5nZWFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL21ldGhvZFBhY2thZ2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL2Jhc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50L3ZhcmlhYmlsaXR5VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudC92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFVuaXQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvYXV0aG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L3ZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NvcHlyaWdodFN0YXRlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBsdWdpblNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGFja2FnZVNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vcHJvY2Vzc1ZpZXdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9kZWZhdWx0VmlldyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vYmFzZUNvbmZpZ3VyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NGYW1pbHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NGYW1pbHkvZGVsaXZlcnlQcm9jZXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkvbWV0aG9kUGx1Z2lucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L3ByZWRlZmluZWRDb25maWd1cmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGFjZDMzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTIzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ1bWEiCi0gICAgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYudW1hIj4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IjAzIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRhdGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuRGF0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIG9mIHRoZSB0eXBlIERhdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVyaSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubmV0LlVSSSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIHRoYXQgcG9pbnQgdG8gcmVzb3VyY2VzIHN1Y2ggYXMgZmlsZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVubGltaXRlZE5hdHVyYWwiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdHJpbmciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2V0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLlNldCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlNlcXVlbmNlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJbnRlZ2VyIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRmxvYXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuRmxvYXQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDbGFzc2lmaWVyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1R5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBDbGFzc2lmaWVyLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUeXBlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZWRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LiAgRGVmaW5lZCB0aGF0IGV2ZXJ5IGVsZW1lbnQgaGFzIGEgbmFtZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZXNwYWNlICMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVzcGFjZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lc3BhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiAgRXZlcnkgZWxlbWVudCBkZWZpbmVkIGFzIGEgVU1BIGluc3RhbmNlIGlzIGRlcml2ZWQgZnJvbSBNb2RlbCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaW4tc3RhbmNlIGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQsIGEgbmFtZSwgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3VpZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3duZWRSdWxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uc3RyYWludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kRWxlbWVudFByb3BlcnR5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50UHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHByZXNzZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSBFeHRlbmRzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9yZGVyaW5nR3VpZGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnN0cmFpbnQiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnN0cmFpbnQgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9keSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4mI3hEOyYjeEE7Q29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25jZXB0c0FuZFBhcGVycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uY2VwdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4YW1wbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeGFtcGxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmV1c2FibGVBc3NldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQgIy8vQ2xhc3NpZmllciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmFibGUgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuJiN4RDsmI3hBO1RoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZSAoc2VlIFNlY3Rpb24gNC4xLjQpLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICZxdW90O3J1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQmcXVvdDsgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgJnF1b3Q7ajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCZxdW90OyB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICZxdW90O0FyY2hpdGVjdHVyZSBEb2N1bWVudCZxdW90Oy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vQ29udGVudERlc2NyaXB0aW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaGFwZWljb24iIGVUeXBlPSIjLy9VcmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vZGVpY29uIiBlVHlwZT0iIy8vVXJpIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBEZXNjcmlwdGlvbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYWluRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIHN0b3JlIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlY3Rpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXlDb25zaWRlcmF0aW9ucyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iS2V5IENvbnNpZGVyYXRpb25zIHByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZWN0aW9uIiBlU3VwZXJUeXBlcz0iIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFNlY3Rpb24gaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25OYW1lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25EZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJTZWN0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZGVjZXNzb3IiIGVUeXBlPSIjLy9TZWN0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gICYjeEQ7JiN4QTtBIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBQcm9kdWN0IGlzIGFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLiYjeEQ7JiN4QTtBIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVwb3J0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVwb3J0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlbXBsYXRlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVtcGxhdGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50ICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4mI3hEOyYjeEE7QSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gJiN4RDsmI3hBO0EgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uICYjeEQ7JiN4QTtGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCZxdW90OyBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICZxdW90O21ldGhvZCZxdW90OyBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1lZEJ5IiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0cHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcHRpb25hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdGVwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3RlcCIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCi0gICAgICAgIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0RlZmluaXRpb24iIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBEZWZpbml0aW9uIGlzIGFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuJiN4RDsmI3hBO1dvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlY29uZGl0aW9uIiBlVHlwZT0iIy8vQ29uc3RyYWludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0ZXAiIGVTdXBlclR5cGVzPSIjLy9TZWN0aW9uICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFN0ZXAgaXMgYSBTZWN0aW9uIGFuZCBXb3JrIERlZmluaXRpb24gdGhhdCBpcyB1c2VkIHRvIG9yZ2FuaXplIFRhc2tzIGludG8gcGFydHMgb3Igc3VidW5pdHMgb2Ygd29yay4gIFN0ZXBzIGluaGVyaXQgdGhlIHN1YlNlY3Rpb25zIGRlY29tcG9zaXRpb24gZnJvbSBTZWN0aW9uIGFuZCBjYW4gdGhlcmVmb3JlIGRlc2NyaWJlIFN1Yi1TdGVwcyBuZXN0ZWQgaW50byBTdGVwcy4mI3hEOyYjeEE7QSBTdGVwIGRlc2NyaWJlcyBhIG1lYW5pbmdmdWwgYW5kIGNvbnNpc3QgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSBUYXNrLiAgVGhlIGNvbGxlY3Rpb24gb2YgU3RlcHMgZGVmaW5lZCBmb3IgYSBUYXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFsbCBkZXZlbG9wbWVudCBnb2FsIG9mIHRoZSBUYXNrLiAgTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkIGVhY2ggdGltZSBhIFRhc2sgaXMgaW52b2tlZCBpbiBhIFByb2Nlc3MgKHNlZSBUYXNrIERlc2NyaXB0b3IpLCBzbyB0aGV5IGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBpbiB0aGUgZm9ybSBvZiBhbHRlcm5hdGUgJ2Zsb3dzJyBvZiB3b3JrLiAgRGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lIGRldmVsb3BtZW50IGdvYWwgY2FuIHRoZW4gYmUgJ2Fzc2VtYmxlZCcgYnkgc2VsZWN0aW5nIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2Ygc3RlcHMgd2hlbiBhcHBseWluZyB0aGUgVGFzayBpbiBhIFByb2Nlc3MuICBUeXBpY2FsIGtpbmRzIG9mIHN0ZXBzIGEgVGFzayBhdXRob3Igc2hvdWxkIGNvbnNpZGVyIGFyZTogVGhpbmtpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIHVuZGVyc3RhbmQgdGhlIG5hdHVyZSBvZiB0aGUgdGFzaywgZ2F0aGVycyBhbmQgZXhhbWluZXMgdGhlIGlucHV0IGFydGlmYWN0cywgYW5kIGZvcm11bGF0ZXMgdGhlIG91dGNvbWUuIFBlcmZvcm1pbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGNyZWF0ZSBvciB1cGRhdGUgc29tZSBhcnRpZmFjdHMuIFJldmlld2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgaW5zcGVjdHMgdGhlIHJlc3VsdHMgYWdhaW5zdCBzb21lIGNyaXRlcmlhLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0IiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFydGlmYWN0IGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuJiN4RDsmI3hBO0FydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAmcXVvdDtvd24mcXVvdDsgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyQXJ0aWZhY3QiIGVUeXBlPSIjLy9BcnRpZmFjdCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0FydGlmYWN0L2NvbnRhaW5lZEFydGlmYWN0cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWRBcnRpZmFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FydGlmYWN0IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9BcnRpZmFjdC9jb250YWluZXJBcnRpZmFjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlbGl2ZXJhYmxlIGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcmVkV29ya1Byb2R1Y3RzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRjb21lIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIG91dGNvbWUgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGFja2FnZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFBhY2thZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2xvYmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJNZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXVzZWRQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGlsZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50UGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29udGVudCBQYWNrYWdlIGlzIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnRFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZPdXRsaW5lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXByZXNlbnRhdGlvbk9wdGlvbnMiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW1wYWN0T2ZOb3RIYXZpbmciIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYXNvbnNGb3JOb3ROZWVkaW5nIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFja2FnaW5nR3VpZGFuY2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2tpbGxzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN5bm9ueW1zIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dGFjaG1lbnRzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsSW5mbyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2JsZW0iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFja2dyb3VuZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnb2FscyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFwcGxpY2F0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9pbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zaXRpb24iIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVkIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUVsZW1lbnQvY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpbmsiIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1MaW5rIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtTGluay9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYW5jaG9yYWdlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HcmFwaENvbm5lY3RvciIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbWFudGljTW9kZWwiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2dyYXBoRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNWaXNpYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXIiIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvY29udGFpbmVkIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVmZXJlbmNlIiBlT3Bwb3NpdGU9IiMvL1JlZmVyZW5jZS9yZWZlcmVuY2VkIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb3BlcnR5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbUxpbmsiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Inpvb20iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmlld3BvcnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2xpbmsiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW0iIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbS9kaWFncmFtTGluayIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaENvbm5lY3RvciIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9hbmNob3JhZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFZGdlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HcmFwaEVkZ2UiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFZGdlL2FuY2hvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZW1hbnRpY01vZGVsQnJpZGdlIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9zZW1hbnRpY01vZGVsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW0iIGVUeXBlPSIjLy9EaWFncmFtIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbS9uYW1lc3BhY2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGltZW5zaW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2lkdGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGVpZ2h0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlZmVyZW5jZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZWQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9EaWFncmFtRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9yZWZlcmVuY2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvcGVydHkiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhFZGdlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYW5jaG9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iMiIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBlT3Bwb3NpdGU9IiMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3YXlwb2ludHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIyIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BvaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhOb2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9pbnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbUxpbmsiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1MaW5rIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2RpYWdyYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZXNwYWNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9kaWFncmFtIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoTm9kZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNpemUiIGVUeXBlPSIjLy9EaW1lbnNpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVJbmZvIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMZWFmRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRleHRFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0ZXh0IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW1hZ2UiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVyaSIgZVR5cGU9IiMvL1VyaSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW1lVHlwZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoaWNQcmltaXRpdmUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2x5bGluZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbG9zZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVsbGlwc2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaGljUHJpbWl0aXZlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFkaXVzWCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNZIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvdGF0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0QW5nbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5kQW5nbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2VudGVyIiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5IiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQgIy8vVmFyaWFiaWxpdHlFbGVtZW50ICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBBY3Rpdml0eSBpcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uJiN4RDsmI3hBO0FjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJicmVha2Rvd25FbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdGllcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2FkbWFwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9hZG1hcCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hlY2tsaXN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmNlcHRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25jZXB0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4YW1wbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeGFtcGxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imd1aWRlbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0d1aWRlbGluZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmV1c2FibGVBc3NldCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0VuYWN0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaXMgYSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNSZXBlYXRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNPbmdvaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNFdmVudERyaXZlbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpbmtUb1ByZWRlY2Vzc29yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrT3JkZXIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQnJlYWtkb3duIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVmaXgiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICZxdW90O1NSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzJnF1b3Q7IHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICZxdW90O1NvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyZxdW90OyBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAmcXVvdDtDdXN0b21lci5BcmNoaXRlY3QmcXVvdDsgd291bGQgZGVmaW5lIGEgJnF1b3Q7Q3VzdG9tZXImcXVvdDsgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICZxdW90O0FyY2hpdGVjdCZxdW90OyBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1BsYW5uZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV0YWlsIFVzZSBDYXNlJnF1b3Q7IHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09wdGlvbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNPcHRpb25hbCBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEFmdGVyIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50ZWRCZWZvcmUiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBsYW5uaW5nRGF0YSIgZVR5cGU9IiMvL1BsYW5uaW5nRGF0YSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwZXJBY3Rpdml0aWVzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vQWN0aXZpdHkiIGVPcHBvc2l0ZT0iIy8vQWN0aXZpdHkvYnJlYWtkb3duRWxlbWVudHMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWlsZXN0b25lIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWlsZXN0b25lIGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSXRlcmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikl0ZXJhdGlvbiBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEQ7JiN4QTtJdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLikiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGhhc2UiIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUGhhc2UgaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7UGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlYW1Qcm9maWxlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZWFtIFByb2ZpbGUgaXMgYSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLiYjeEQ7JiN4QTtXb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuJiN4RDsmI3hBO0hlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVhbVJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBlclRlYW0iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9UZWFtUHJvZmlsZSIgZU9wcG9zaXRlPSIjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlRlYW0iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUm9sZSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kaWZpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IldvcmtPcmRlclR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgT3JkZXIgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChCKSBiZWxvdykgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChBKSBiZWxvdykgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvU3RhcnQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvRmluaXNoIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb1N0YXJ0IiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb0ZpbmlzaCIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya09yZGVyIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgT3JkZXIgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gICYjeEQ7JiN4QTsoTm90ZSwgV29yayBPcmRlciBpcyBub3QgbW9kZWxlZCBhcyBhbiBBc3NvY2lhdGlvbiBDbGFzcyB0byBwcm92aWRlIGEgc3RyYWlnaHRmb3J3YXJkIG1hcHBpbmcgIHRvIFhNSSBhbmQgRU1GLikmI3hEOyYjeEE7VGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua1R5cGUiIGVUeXBlPSIjLy9Xb3JrT3JkZXJUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmaW5pc2hUb1N0YXJ0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWQiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb2Nlc3MgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLiYjeEQ7JiN4QTtQcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBsYW5uaW5nRGF0YSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQbGFubmluZyBEYXRhIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuJiN4RDsmI3hBO1BsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4mI3hEOyYjeEE7KE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnREYXRlIiBlVHlwZT0iIy8vRGF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaERhdGUiIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhbmsiIGVUeXBlPSIjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLiYjeEQ7JiN4QTtEZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gICYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4mI3hEOyYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJXb3JrUHJvZHVjdCIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdGVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbXBhY3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdGVkQnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQgIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUYXNrIERlc2NyaXB0b3IgaXMgYSBEZXNjcmlwdG9yIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuJiN4RDsmI3hBO0Ega2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iVGFzayIgZVR5cGU9IiMvL1Rhc2siLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lzdGVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVybmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3JtZWRQcmltYXJpbHlCeSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbGVjdGVkU3RlcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcG9zaXRlUm9sZSIgZVN1cGVyVHlwZXM9IiMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbXBvc2l0ZSBSb2xlIGlzIGEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLiYjeEQ7JiN4QTtBIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWdncmVnYXRlZFJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlR3VpZGFuY2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJob3d0b1N0YWZmIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjYWxlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RDaGFyYWN0ZXJpc3RpY3MiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3MiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmlza0xldmVsIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0aW5nVGVjaG5pcXVlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZU9mQ29udHJhY3QiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBkZWxpdmVyeSBwYXR0ZXJucyBhbmQgbW9kZWxzLiBJdCBpcyB1c2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY29wZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlTm90ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uY2VwdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbmNlcHQgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDaGVja2xpc3QiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDaGVja2xpc3QgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4YW1wbGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGVsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgR3VpZGVsaW5lIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlcG9ydCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJlcG9ydCBpcyBhIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGVtcGxhdGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdXBwb3J0aW5nIE1hdGVyaWFscyBpcyBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUb29sTWVudG9yIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVG9vbCBNZW50b3IgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXaGl0ZXBhcGVyIiBlU3VwZXJUeXBlcz0iIy8vQ29uY2VwdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hpdGVwYXBlcnMgYXJlIGEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlcm1EZWZpbml0aW9uIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRlcm1EZWZpbml0aW9ucyBkZWZpbmUgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGhleSBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2UiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcmFjdGljZSByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgJnF1b3Q7TWFuYWdlIFJpc2tzJnF1b3Q7LCAmcXVvdDtDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkmcXVvdDssICZxdW90O0FyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQmcXVvdDssIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViUHJhY3RpY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9QcmFjdGljZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudFJlZmVyZW5jZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQWN0aXZpdHkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgcXVhbGlmeSB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXVzYWJsZUFzc2V0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmV1c2FibGUgQXNzZXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZyYjeEQ7JiN4QTtob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1ZlcnRleCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IldvcmtQcm9kdWN0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSZWdpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlZ2lvbiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1N0YXRlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1Ym1hY2hpbmUiIGVUeXBlPSIjLy9TdGF0ZU1hY2hpbmUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmVydGV4Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyIiBlVHlwZT0iIy8vUmVnaW9uIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1ZlcnRleCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRnb2luZyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVHJhbnNpdGlvbiIgZU9wcG9zaXRlPSIjLy9UcmFuc2l0aW9uL3NvdXJjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmNvbWluZyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVHJhbnNpdGlvbiIgZU9wcG9zaXRlPSIjLy9UcmFuc2l0aW9uL3RhcmdldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZWdpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJWZXJ0ZXgiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1ZlcnRleCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vVmVydGV4L2NvbnRhaW5lciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJUcmFuc2l0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UcmFuc2l0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9UcmFuc2l0aW9uL2NvbnRhaW5lciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJTdGF0ZSIgZVR5cGU9IiMvL1N0YXRlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU3RhdGUvUmVnaW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlN0YXRlTWFjaGluZSIgZVR5cGU9IiMvL1N0YXRlTWFjaGluZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1N0YXRlTWFjaGluZS9SZWdpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RhdGVNYWNoaW5lIiBlU3VwZXJUeXBlcz0iIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSZWdpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlZ2lvbiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1N0YXRlTWFjaGluZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUcmFuc2l0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iV29ya0RlZmluaXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtEZWZpbml0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1JlZ2lvbiIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1JlZ2lvbi9UcmFuc2l0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvdXJjZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1ZlcnRleCIgZU9wcG9zaXRlPSIjLy9WZXJ0ZXgvb3V0Z29pbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFyZ2V0IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVmVydGV4IiBlT3Bwb3NpdGU9IiMvL1ZlcnRleC9pbmNvbWluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQc2V1ZG9TdGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1ZlcnRleCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iUHNldWRvU3RhdGVLaW5kIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImluaXRpYWwiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImpvaW4iIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmb3JrIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ianVuY3Rpb24iIHZhbHVlPSIzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJjaG9pY2UiIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJlbnRyeVBvaW50IiB2YWx1ZT0iNSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXhpdFBvaW50IiB2YWx1ZT0iNiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0idGVybWluYXRlIiB2YWx1ZT0iNyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNjaXBsaW5lIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuJiN4RDsmI3hBO0EgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFza3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2siLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZGlzY2lwbGluZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlzY2lwbGluZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlV29ya2Zsb3dzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXQiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBTZXQgb3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgJnF1b3Q7QW5hbHlzdHMmcXVvdDsgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICZxdW90O0J1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCZxdW90OywgJnF1b3Q7U3lzdGVtIEFuYWx5c3QmcXVvdDssIGFzIHdlbGwgYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIFNwZWNpZmllciZxdW90OyByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRvbWFpbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRG9tYWluIGlzIGEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LiYjeEQ7JiN4QTtEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YmRvbWFpbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RvbWFpbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIFByb2R1Y3QgVHlwZSBpcyBhIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgJnF1b3Q7Q2xhc3MgRGlhZ3JhbSZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICZxdW90O1NwZWNpZmljYXRpb24mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtQcm9kdWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEaXNjaXBsaW5lIEdyb3VwaW5ncyBhcmUgdXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAmcXVvdDtTb2Z0d2FyZSBEaXNjaXBsaW5lcyZxdW90OyB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICZxdW90O1JlcXVpcmVtZW50cyBNYW5hZ2VtZW50JnF1b3Q7IG9yICZxdW90O1Rlc3RpbmcmcXVvdDs7ICZxdW90O0lUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQmcXVvdDsgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAmcXVvdDtJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyZxdW90OywgJnF1b3Q7SVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyZxdW90Oywgb3IgJnF1b3Q7SVQgRW5hYmxpbmcgU2VydmljZXMmcXVvdDsuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc2NpcGxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaXNjaXBsaW5lIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2wiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVG9vbCBpcyBhIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0R3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZVNldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVTZXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ3VzdG9tIENhdGVnb3J5IGlzIGEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAmcXVvdDtUZXN0aW5nJnF1b3Q7IGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhdGVnb3JpemVkRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJDYXRlZ29yaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBQcm9jZXNzZXMgaXMgYSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuJiN4RDsmI3hBO0EgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlZHVjYXRpb25NYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb21tdW5pY2F0aW9uc01hdGVyaWFscyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3MiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBpcyBhIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuJiN4RDsmI3hBO0NvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVmYXVsdENvbnRleHQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbGlkQ29udGV4dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4mI3hEOyYjeEE7QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6JiN4RDsmI3hBOy0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4mI3hEOyYjeEE7QSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VkT25Qcm9jZXNzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9hZG1hcCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvYWRtYXAgaXMgYSBzcGVjaWFsIEd1aWRhbmNlIFR5cGUgd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4mI3hEOyYjeEE7QW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50IiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc1BhY2thZ2UgIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBpcyBhIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuJiN4RDsmI3hBO1VNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2VzcyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4mI3hEOyYjeEE7QSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2Vzc0VsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZSBjb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZUlPIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBQcm9jZXNzIENvbXBvbmVudCBhcHBsaWNhdGlvbiBpbiBhIFByb2Nlc3MsIGkuZS4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIFByb2Nlc3MuICBUaGUgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBkZXRhaWxzIG9mIHRoZSBjb21wb25lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0byBwcm92aWRlIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMgc3VjaCBhcyBpdCBvd24gcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQbHVnaW4iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFBsdWdpbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4mI3hEOyYjeEE7TWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuJiN4RDsmI3hBO1NwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYXJpYWJpbGl0eUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50IHRoYXQgcHJvdmlkZXMgbmV3IGNhcGFiaWxpdGllcyBmb3IgY29udGVudCB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBDb250ZW50IEVsZW1lbnRzIG9yIGFueSBvdGhlciBNZXRob2QgRWxlbWVudCB0aGF0IGRlcml2ZXMgZnJvbSBpdC4gIEl0IGhhcyBiZWVuIHBsYWNlZCBpbi1iZXR3ZWVuIHRoZSBjbGFzc2VzIE1ldGhvZCBFbGVtZW50IGFuZCBDb250ZW50IEVsZW1lbnQgaW4gdGhlIG92ZXJhbGwgVU1BIHRheG9ub215IG9mIGNsYXNzZXMgdXNpbmcgdGhlIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBtZWNoYW5pc20uICBUaGUgYXNzb2NpYXRpb24gVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gc2hhbGwgb25seSBiZSBpbnN0YW50aWF0ZWQgYmV0d2VlbiB0d28gc3ViY2xhc3NlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBzYW1lIHR5cGUuICBUaGUgZWxlbWVudCBvbiB2YXJhaWJpbGl0eVNwZWNpYWxFbGVtZW50IHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBkZWZpbmVzIGEgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlIGRlZmluaW5nIHRoZSBuYXR1cmUgb2YgdGhlIHJlbGF0aW9uc2hpcCB1c2luZyBhIGxpdGVyYWwgZnJvbSB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4mI3hEOyYjeEE7VmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgbWV0YS1tb2RlbCBwYWNrYWdlIE1ldGhvZCBQbHVnaW5zIGFkZHMgdGhlIGNhcGFiaWxpdGllcyBvZiB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBNZXRob2QgRWxlbWVudHMgdGhhdCBkZXJpdmUgZnJvbSBpdC4gIEJ5IGRlZmF1bHQgYWxsIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlLCBUYXNrLCBHdWlkYW5jZSBUeXBlcywgb3IgQWN0aXZpdGllcyBhcmUgZGVmaW5lZCB0byBiZSBWYXJpYWJpbGl0eSBFbGVtZW50cy4mI3hEOyYjeEE7VmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBwcm92aWRlcyB1bmlxdWUgbWVjaGFuaXNtcyBmb3IgY3VzdG9taXppbmcgbWV0aG9kIGNvbnRlbnQgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIGJ1dCBieSBqdXN0IGJlIGFibGUgdG8gZGVzY3JpYmUgd2l0aCBzZXBhcmF0ZSBvYmplY3RzIHRoZSBkaWZmZXJlbmNlcyAoYWRkaXRpb25zLCBjaGFuZ2VzLCBvbWlzc2lvbnMpIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbC4gIFRoaXMgcGx1Zy1pbiBjb25jZXB0IGFsbG93cyB1c2VycyB0byBmYWN0b3IgdGhlaXIgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBpbnRlcnJlbGF0ZWQgdW5pdHMgYW5kIGV2ZW4gdG8gYXJjaGl0ZWN0IG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gbGF5ZXJzIHRoYXQgZXh0ZW5kIGVhY2ggb3RoZXIgd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiAgVGhlIHJlc3VsdGluZyBtZXRob2QgYW5kIHByb2Nlc3MgZGVzaWduIGNhbiBiZSBkeW5hbWljYWxseSBjb21iaW5lZCBhbmQgYXBwbGllZCBvbiBkZW1hbmQgdXNpbmcgdGhlIGludGVycHJldGF0aW9uIHJ1bGVzIGRlZmluZWQgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnQgU3BlY2lhbGl6YXRpb25zIGFzc2VtYmxpbmcgdG8gcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRoZSBtb3N0IGFjY3VyYXRlIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNjcmlwdGlvbnMgcG9zc2libGUuICBJdCBhbHNvIGFsbG93cyBwcm9jZXNzIHByYWN0aXRpb25lcnMgdG8gZXh0ZW5kcyBhbmQgdGFpbG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgdGhleSBkbyBub3Qgb3duIGFuZCB0byBlYXNpbHkgdXBncmFkZSB0byBuZXdlciB2ZXJzaW9ucyBieSBzaW1wbHkgcmVhcHBseSB0aGVpciBwZXJzb25hbCBjaGFuZ2VzIHRvIHRoZXNlIHVwZ3JhZGVzLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgdHdvIHR5cGVzIG9mIHZhcmlhYmlsaXR5IGFuZCBvbmUgdHlwZSBvZiBleHRlbnNpb24gd2hpY2ggYXJlIGZvcm1hbGx5IGRlZmluZWQgZm9yIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIGVUeXBlPSIjLy9WYXJpYWJpbGl0eVR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Im5hIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgaW4gaW5zdGFuY2Ugb2YgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbGl6YXRpb24gYXNzb2NpYXRpb24gYmV0d2VlbiB0d28gVmFyaWFiaWxpdHkgRWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZSBleGlzdHMsIHRoZW4gdGhlIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIGhvdyB0aGUgZWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudCBlbmQgb2YgdGhlIGFzc29jaWF0aW9uIGNoYW5nZXMgdGhlIENvbnRlbnQgRWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBlbmQuIFNlZSB0aGUgVmFyaWFiaWxpdHkgVHlwZSBlbnVtZXJhdGlvbiBjbGFzcyBmb3IgZGVmaW5pdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFiaWxpdHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9WYXJpYWJpbGl0eUVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlZhcmlhYmlsaXR5IFR5cGUgaXMgYW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibmEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNvbnRyaWJ1dGVzIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXh0ZW5kcyIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InJlcGxhY2VzIiB2YWx1ZT0iMyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibG9jYWxDb250cmlidXRpb24iIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJsb2NhbFJlcGxhY2VtZW50IiB2YWx1ZT0iNSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXh0ZW5kc1JlcGxhY2VzIiB2YWx1ZT0iNiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RVbml0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFVuaXQgaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRob3JzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURhdGUiIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvcHlyaWdodFN0YXRlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgQ29uZmlndXJhdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2luU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzVmlld3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0VmlldyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlQ29uZmlndXJhdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VidHJhY3RlZENhdGVnb3J5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkZWRDYXRlZ29yeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NGYW1pbHkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlbGl2ZXJ5IE1vZGVsIEZhbWlseSBpcyBhIGNvbnZlbmllbnQgZ3JvdXBpbmcgb2YgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIG9mIGludGVyZXN0IHRvIHNvbWUgc3BlY2lmaWMgdXNlciBjb21tdW5pdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbGl2ZXJ5UHJvY2Vzc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EZWxpdmVyeVByb2Nlc3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kTGlicmFyeSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBsdWdpbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmdlbm1vZGVsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjBkNDNmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNDk3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjIgotICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuZXBmLnVtYSIgdGVtcGxhdGVEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcyIKLSAgICBydW50aW1lSmFyPSJ0cnVlIiBkeW5hbWljVGVtcGxhdGVzPSJ0cnVlIiBtb2RlbE5hbWU9IlVtYSIgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEucHJlc2VudGF0aW9uLlVtYUVkaXRvclBsdWdpbiIgbm9uTkxTTWFya2Vycz0idHJ1ZSIKLSAgICByb290RXh0ZW5kc0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3QiIHJvb3RFeHRlbmRzQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdCIKLSAgICByb290SW1wbGVtZW50c0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5JbnRlcm5hbEVEYXRhT2JqZWN0IiBzdXBwcmVzc0VNRlR5cGVzPSJ0cnVlIgotICAgIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJmYWNlPSJjb21tb25qLnNkby5TZXF1ZW5jZSIgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcm5hbEludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkVTZXF1ZW5jZSIKLSAgICBmZWF0dXJlTWFwV3JhcHBlckNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuQmFzaWNFU2VxdWVuY2UiIGNvZGVGb3JtYXR0aW5nPSJ0cnVlIgotICAgIGNvbnRhaW5tZW50UHJveGllcz0idHJ1ZSI+Ci0gIDxmb3JlaWduTW9kZWw+QzpcSG9tZVxwaFROR1xUTkdfZG9jc1xPT0FEXENvbnRlbnRBcmNoaXRlY3R1cmVcTW9kZWxzXFVNQTA0XFVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxzdGF0aWNQYWNrYWdlcz5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1NETzwvc3RhdGljUGFja2FnZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfQ09NTU9OSl9TRE89b3JnLmVjbGlwc2UuZW1mLmNvbW1vbmouc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9FQ09SRV9TRE89b3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlVtYSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmVwZiIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGVjb3JlUGFja2FnZT0idW1hLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL2ZpbmlzaFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb0ZpbmlzaCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL3N0YXJ0VG9TdGFydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL3N0YXJ0VG9GaW5pc2giLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZCI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9pbml0aWFsIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9qb2luIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9mb3JrIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9qdW5jdGlvbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvY2hvaWNlIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9lbnRyeVBvaW50Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9leGl0UG9pbnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL3Rlcm1pbmF0ZSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL25hIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9jb250cmlidXRlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvZXh0ZW5kcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvcmVwbGFjZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2xvY2FsQ29udHJpYnV0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9sb2NhbFJlcGxhY2VtZW50Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9leHRlbmRzUmVwbGFjZXMiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vRGF0ZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vVXJpIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TdHJpbmciLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1NldCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2VxdWVuY2UiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0ludGVnZXIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0Zsb2F0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2xhc3NpZmllciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1R5cGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTmFtZWRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QYWNrYWdlYWJsZUVsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QYWNrYWdlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTmFtZXNwYWNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9ndWlkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9icmllZkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvb3duZWRSdWxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L21ldGhvZEVsZW1lbnRQcm9wZXJ0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvc3VwcHJlc3NlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvb3JkZXJpbmdHdWlkZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db25zdHJhaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db25zdHJhaW50L2JvZHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudFByb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50UHJvcGVydHkvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3N1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9jb25jZXB0c0FuZFBhcGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NoZWNrbGlzdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9ndWlkZWxpbmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZXhhbXBsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9hc3NldHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvcHJlc2VudGF0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3NoYXBlaWNvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9ub2RlaWNvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9tYWluRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL3NlY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2tleUNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1NlY3Rpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlY3Rpb24vc2VjdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3NlY3Rpb25EZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3N1YlNlY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VjdGlvbi9wcmVkZWNlc3NvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvbW9kaWZpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9yZXBvcnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvdGVtcGxhdGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvdG9vbE1lbnRvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFzayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9wZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svc3RlcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3Rvb2xNZW50b3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wcmVjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24vcG9zdGNvbmRpdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdGVwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BcnRpZmFjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FydGlmYWN0L2NvbnRhaW5lckFydGlmYWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FydGlmYWN0L2NvbnRhaW5lZEFydGlmYWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGUvZGVsaXZlcmVkV29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL091dGNvbWUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL2dsb2JhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvcmV1c2VkUGFja2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9jaGlsZFBhY2thZ2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UvY29udGVudEVsZW1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vYnJpZWZPdXRsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9yZXByZXNlbnRhdGlvbk9wdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9pbXBhY3RPZk5vdEhhdmluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcmVhc29uc0Zvck5vdE5lZWRpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9leHRlcm5hbERlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9wYWNrYWdpbmdHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9za2lsbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vYXNzaWdubWVudEFwcHJvYWNoZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc3lub255bXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbi9hdHRhY2htZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FkZGl0aW9uYWxJbmZvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9wcm9ibGVtIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9iYWNrZ3JvdW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9nb2FscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYXBwbGljYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2xldmVsc09mQWRvcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUG9pbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvaW50L3giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2ludC95Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9wb3NpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvY29udGFpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9saW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9hbmNob3JhZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L2lzVmlzaWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9yZWZlcmVuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvcHJvcGVydHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL3pvb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvdmlld3BvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3RvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGltZW5zaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vd2lkdGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vaGVpZ2h0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlZmVyZW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvcGVydHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L2tleSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFZGdlL2FuY2hvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVkZ2Uvd2F5cG9pbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW0iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW0vem9vbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL3ZpZXdwb2ludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vZGlhZ3JhbUxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS9uYW1lc3BhY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhOb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhOb2RlL3NpemUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50L3R5cGVJbmZvIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9MZWFmRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RleHRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UZXh0RWxlbWVudC90ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0ltYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9JbWFnZS91cmkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9JbWFnZS9taW1lVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaGljUHJpbWl0aXZlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUG9seWxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvbHlsaW5lL2Nsb3NlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qb2x5bGluZS93YXlwb2ludHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRWxsaXBzZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNYIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNZIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yb3RhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2Uvc3RhcnRBbmdsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvZW5kQW5nbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRWxsaXBzZS9jZW50ZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2JyZWFrZG93bkVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcm9hZG1hcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9zdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2NvbmNlcHRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvZXhhbXBsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9ndWlkZWxpbmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcmV1c2FibGVBc3NldHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9pc0VuYWN0YWJsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNSZXBlYXRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNPbmdvaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNFdmVudERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2xpbmtUb1ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlZml4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9pc1BsYW5uZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2hhc011bHRpcGxlT2NjdXJyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzT3B0aW9uYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRCZWZvcmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wbGFubmluZ0RhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdGllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NaWxlc3RvbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9JdGVyYXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QaGFzZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RlYW1Qcm9maWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS90ZWFtUm9sZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdXBlclRlYW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9Sb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtPcmRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya09yZGVyL2xpbmtUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya09yZGVyL3ByZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9zdGFydERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvZmluaXNoRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9yYW5rIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaXB0b3IvaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RW50cnlTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUV4aXRTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9Xb3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZGVsaXZlcmFibGVQYXJ0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvVGFzayIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYXNzaXN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2V4dGVybmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9wZXJmb3JtZWRQcmltYXJpbHlCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3NlbGVjdGVkU3RlcHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29tcG9zaXRlUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29tcG9zaXRlUm9sZS9hZ2dyZWdhdGVkUm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24vdXNhZ2VHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vaG93dG9TdGFmZiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vc2NhbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcmlza0xldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vZXN0aW1hdGluZ1RlY2huaXF1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RNZW1iZXJFeHBlcnRpc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi90eXBlT2ZDb250cmFjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL3Njb3BlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL3VzYWdlTm90ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24vcmVmaW5lZERlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbmNlcHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DaGVja2xpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FeGFtcGxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVwb3J0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVtcGxhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV2hpdGVwYXBlciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rlcm1EZWZpbml0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJhY3RpY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9zdWJQcmFjdGljZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9jb250ZW50UmVmZXJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL2FjdGl2aXR5UmVmZXJlbmNlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3RhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL1dvcmtQcm9kdWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL1JlZ2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL3N1Ym1hY2hpbmUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVmVydGV4Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmVydGV4L2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZlcnRleC9vdXRnb2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZlcnRleC9pbmNvbWluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZWdpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vVmVydGV4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9UcmFuc2l0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9TdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vU3RhdGVNYWNoaW5lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N0YXRlTWFjaGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlTWFjaGluZS9SZWdpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHJhbnNpdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi9Xb3JrRGVmaW5pdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UcmFuc2l0aW9uL2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RyYW5zaXRpb24vc291cmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi90YXJnZXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3Rhc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvc3ViZGlzY2lwbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvcmVmZXJlbmNlV29ya2Zsb3dzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVTZXQvcm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRG9tYWluIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Eb21haW4vd29ya1Byb2R1Y3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi9zdWJkb21haW5zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlL3dvcmtQcm9kdWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZy9kaXNjaXBsaW5lcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Ub29sL3Rvb2xNZW50b3JzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXRHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nL3JvbGVTZXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9jYXRlZ29yaXplZEVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkvc3ViQ2F0ZWdvcmllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9lZHVjYXRpb25NYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9pbmNsdWRlc1BhdHRlcm5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9kZWZhdWx0Q29udGV4dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvdmFsaWRDb250ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlL2Jhc2VkT25Qcm9jZXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9hZG1hcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvaW50ZXJmYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L3Byb2Nlc3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9wcm9jZXNzRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvZGlhZ3JhbXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VJTyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IvUHJvY2Vzc0NvbXBvbmVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi91c2VyQ2hhbmdlYWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vbWV0aG9kUGFja2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vYmFzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kVW5pdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9hdXRob3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY29weXJpZ2h0U3RhdGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGx1Z2luU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQYWNrYWdlU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9wcm9jZXNzVmlld3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2RlZmF1bHRWaWV3Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9iYXNlQ29uZmlndXJhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL3N1YnRyYWN0ZWRDYXRlZ29yeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vYWRkZWRDYXRlZ29yeSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRmFtaWx5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRmFtaWx5L2RlbGl2ZXJ5UHJvY2Vzc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L21ldGhvZFBsdWdpbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeS9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNzUzOWY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgVU1BCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWViMmRkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZSAKLSAgICAgICAgICAgIHVyaSA9ICJodHRwOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZSIgCi0gICAgICAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UiIC8+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSIKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZSIvPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BY3Rpdml0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0NmQ4YWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4KLSAqIEFjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0QnJlYWtkb3duRWxlbWVudHMgPGVtPkJyZWFrZG93biBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRSb2FkbWFwcyA8ZW0+Um9hZG1hcHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0U3VwcG9ydGluZ01hdGVyaWFscyA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0Q2hlY2tsaXN0cyA8ZW0+Q2hlY2tsaXN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRDb25jZXB0cyA8ZW0+Q29uY2VwdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0RXhhbXBsZXMgPGVtPkV4YW1wbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldEd1aWRlbGluZXMgPGVtPkd1aWRlbGluZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0UmV1c2FibGVBc3NldHMgPGVtPlJldXNhYmxlIEFzc2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHkgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudCwgVmFyaWFiaWxpdHlFbGVtZW50LAotCQlXb3JrRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50fS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0aWVzIDxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0aWVzCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCIgb3Bwb3NpdGU9InN1cGVyQWN0aXZpdGllcyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvYWRtYXBzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9hZG1hcHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfUm9hZG1hcHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXAiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJvYWRtYXBzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfU3VwcG9ydGluZ01hdGVyaWFscygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoZWNrbGlzdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfQ2hlY2tsaXN0cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRDaGVja2xpc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db25jZXB0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmNlcHRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0NvbmNlcHRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRDb25jZXB0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhhbXBsZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGFtcGxlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9FeGFtcGxlcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RXhhbXBsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HdWlkZWxpbmVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3VpZGVsaW5lczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9HdWlkZWxpbmVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEd1aWRlbGluZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfUmV1c2FibGVBc3NldHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJldXNhYmxlQXNzZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIEVuYWN0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFbmFjdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzRW5hY3RhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfSXNFbmFjdGFibGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc0VuYWN0YWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFbmFjdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzRW5hY3RhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0VuYWN0YWJsZShCb29sZWFuIHZhbHVlKTsKLQotfSAvLyBBY3Rpdml0eQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5RGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BY3Rpdml0eURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkYjYxMzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0SG93dG9TdGFmZiA8ZW0+SG93dG8gU3RhZmY8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGl2aXR5RGVzY3JpcHRpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQdXJwb3NlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1cnBvc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdXJwb3NlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsdGVybmF0aXZlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFsdGVybmF0aXZlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWx0ZXJuYXRpdmVzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ib3d0byBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhvd3RvIFN0YWZmPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIb3d0b1N0YWZmKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEhvd3RvU3RhZmYoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3d0b1N0YWZmIDxlbT5Ib3d0byBTdGFmZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SG93dG8gU3RhZmY8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhvd3RvU3RhZmYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhvd3RvU3RhZmYoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBBY3Rpdml0eURlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQXJ0aWZhY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BcnRpZmFjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NDEyYWUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BcnRpZmFjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFydGlmYWN0IGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuCi0gKiBBcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgIm93biIgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lckFydGlmYWN0IDxlbT5Db250YWluZXIgQXJ0aWZhY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVkQXJ0aWZhY3RzIDxlbT5Db250YWluZWQgQXJ0aWZhY3RzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3QoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJ0aWZhY3QgZXh0ZW5kcyBXb3JrUHJvZHVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGFpbmVyIEFydGlmYWN0PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVkQXJ0aWZhY3RzIDxlbT5Db250YWluZWQgQXJ0aWZhY3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29udGFpbmVyQXJ0aWZhY3QoQXJ0aWZhY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3RfQ29udGFpbmVyQXJ0aWZhY3QoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZWRBcnRpZmFjdHMKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRhaW5lZEFydGlmYWN0cyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXJ0aWZhY3QgZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVyQXJ0aWZhY3QgPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnRhaW5lckFydGlmYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb250YWluZXJBcnRpZmFjdChBcnRpZmFjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250YWluZWQgQXJ0aWZhY3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdH0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZXJBcnRpZmFjdCA8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZWQgQXJ0aWZhY3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lckFydGlmYWN0Ci0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QiIG9wcG9zaXRlPSJjb250YWluZXJBcnRpZmFjdCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQotfSAvLyBBcnRpZmFjdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BcnRpZmFjdERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwM2EzYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFydGlmYWN0IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFydGlmYWN0RGVzY3JpcHRpb24gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CcmllZiBPdXRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnJpZWYgT3V0bGluZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QnJpZWZPdXRsaW5lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QnJpZWZPdXRsaW5lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0QnJpZWZPdXRsaW5lIDxlbT5CcmllZiBPdXRsaW5lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBPdXRsaW5lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCcmllZk91dGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJyaWVmT3V0bGluZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIEFydGlmYWN0RGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9CcmVha2Rvd25FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQnJlYWtkb3duRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ODk3NmVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9CcmVha2Rvd25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBCcmVha2Rvd24gRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRBZnRlciA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0aWVzIDxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQnJlYWtkb3duRWxlbWVudCBleHRlbmRzIFByb2Nlc3NFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAiU1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMiIHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICJTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMiIG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICJDdXN0b21lci5BcmNoaXRlY3QiIHdvdWxkIGRlZmluZSBhICJDdXN0b21lciIgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICJBcmNoaXRlY3QiIGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlZml4KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlZml4KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LgotCSAqIAotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQbGFubmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJc1BsYW5uZWQoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SXNQbGFubmVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQbGFubmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc1BsYW5uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzUGxhbm5lZChCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV0YWlsIFVzZSBDYXNlIiB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBpc09wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzT3B0aW9uYWwoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc09wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIE9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc09wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc09wdGlvbmFsKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVzZW50ZWRBZnRlcihCcmVha2Rvd25FbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCcmVha2Rvd25FbGVtZW50IGdldFByZXNlbnRlZEFmdGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRBZnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGVkQWZ0ZXIoQnJlYWtkb3duRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZXNlbnRlZEJlZm9yZShCcmVha2Rvd25FbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQnJlYWtkb3duRWxlbWVudCBnZXRQcmVzZW50ZWRCZWZvcmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByZXNlbnRlZEJlZm9yZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGVkQmVmb3JlKEJyZWFrZG93bkVsZW1lbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQbGFubmluZ0RhdGEoUGxhbm5pbmdEYXRhKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQbGFubmluZ0RhdGEgZ2V0UGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0QnJlYWtkb3duRWxlbWVudHMgPGVtPkJyZWFrZG93biBFbGVtZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3VwZXJBY3Rpdml0aWVzKEFjdGl2aXR5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0aWVzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0QnJlYWtkb3duRWxlbWVudHMKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImJyZWFrZG93bkVsZW1lbnRzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBY3Rpdml0eSBnZXRTdXBlckFjdGl2aXRpZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMgPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFN1cGVyQWN0aXZpdGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3VwZXJBY3Rpdml0aWVzKEFjdGl2aXR5IHZhbHVlKTsKLQotfSAvLyBCcmVha2Rvd25FbGVtZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhOThlOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXNhZ2VHdWlkYW5jZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVzYWdlR3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uI2dldFVzYWdlR3VpZGFuY2UgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXNhZ2VHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXNhZ2VHdWlkYW5jZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NhcGFiaWxpdHlQYXR0ZXJuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2FwYWJpbGl0eVBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjMwZmQ4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2FwYWJpbGl0eVBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhcGFiaWxpdHkgUGF0dGVybjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLSAqIEEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotICogLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLSAqIC0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0gKiAtIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FwYWJpbGl0eVBhdHRlcm4gZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgewotfSAvLyBDYXBhYmlsaXR5UGF0dGVybgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NoZWNrbGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NoZWNrbGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMmY4ZTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DaGVja2xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ2hlY2tsaXN0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDaGVja2xpc3QoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hlY2tsaXN0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBDaGVja2xpc3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DbGFzc2lmaWVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2xhc3NpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMTU0YjkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DbGFzc2lmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DbGFzc2lmaWVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENsYXNzaWZpZXIoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzaWZpZXIgZXh0ZW5kcyBUeXBlIHsKLX0gLy8gQ2xhc3NpZmllcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbXBvc2l0ZVJvbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db21wb3NpdGVSb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2YmRhNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbXBvc2l0ZVJvbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tcG9zaXRlIFJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENvbXBvc2l0ZSBSb2xlIGlzIGEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLgotICogQSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlI2dldEFnZ3JlZ2F0ZWRSb2xlcyA8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbXBvc2l0ZVJvbGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9zaXRlUm9sZSBleHRlbmRzIFJvbGVEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZ2dyZWdhdGVkIFJvbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFnZ3JlZ2F0ZWQgUm9sZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZ2dyZWdhdGVkIFJvbGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRBZ2dyZWdhdGVkUm9sZXMoKTsKLQotfSAvLyBDb21wb3NpdGVSb2xlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29uY2VwdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbmNlcHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTA5MjEzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29uY2VwdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29uY2VwdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbmNlcHQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uY2VwdCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gQ29uY2VwdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnN0cmFpbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhM2M5YWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENvbnN0cmFpbnQgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQjZ2V0Qm9keSA8ZW0+Qm9keTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnN0cmFpbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uc3RyYWludCBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJvZHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBzdG9yZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJvZHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJvZHkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnN0cmFpbnRfQm9keSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Qm9keSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50I2dldEJvZHkgPGVtPkJvZHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJvZHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJvZHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJvZHkoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBDb25zdHJhaW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudENhdGVnb3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudENhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1YjEzYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIENvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeSgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudENhdGVnb3J5IGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotfSAvLyBDb250ZW50Q2F0ZWdvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50RGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2RjOGIzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQ29udGVudCBEZXNjcmlwdGlvbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0U2VjdGlvbnMgPGVtPlNlY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRLZXlDb25zaWRlcmF0aW9ucyA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnREZXNjcmlwdGlvbiBleHRlbmRzIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBzdG9yZSB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYWluRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1haW5EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1haW5EZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VjdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2VjdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEtleSBDb25zaWRlcmF0aW9ucyBwcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRLZXlDb25zaWRlcmF0aW9ucyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRLZXlDb25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0S2V5Q29uc2lkZXJhdGlvbnMoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBDb250ZW50RGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjNDBjZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBDb250ZW50IEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuCi0gKiBDb250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldFN1cHBvcnRpbmdNYXRlcmlhbHMgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldENvbmNlcHRzQW5kUGFwZXJzIDxlbT5Db25jZXB0cyBBbmQgUGFwZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldENoZWNrbGlzdHMgPGVtPkNoZWNrbGlzdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3VpZGVsaW5lcyA8ZW0+R3VpZGVsaW5lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRFeGFtcGxlcyA8ZW0+RXhhbXBsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0QXNzZXRzIDxlbT5Bc3NldHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudEVsZW1lbnQgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQsIFZhcmlhYmlsaXR5RWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbCIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db25jZXB0cyBBbmQgUGFwZXJzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uY2VwdHMgQW5kIFBhcGVyczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdCIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DaGVja2xpc3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3QiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldENoZWNrbGlzdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HdWlkZWxpbmVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3VpZGVsaW5lczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEd1aWRlbGluZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4YW1wbGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhhbXBsZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEV4YW1wbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXNzZXRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzZXRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldCIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0QXNzZXRzKCk7Ci0KLX0gLy8gQ29udGVudEVsZW1lbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50UGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3YTNmMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29udGVudCBQYWNrYWdlIGlzIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZSNnZXRDb250ZW50RWxlbWVudHMgPGVtPkNvbnRlbnQgRWxlbWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50UGFja2FnZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZW50UGFja2FnZSBleHRlbmRzIE1ldGhvZFBhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRlbnQgRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZW50IEVsZW1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0KLX0gLy8gQ29udGVudFBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4NWZmYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSBleHRlbmRzIFNlbWFudGljTW9kZWxCcmlkZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RWxlbWVudChFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWxlbWVudCBnZXRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVsZW1lbnQoRWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DdXN0b21DYXRlZ29yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0N1c3RvbUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEyMjI3OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0N1c3RvbUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkN1c3RvbSBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ3VzdG9tIENhdGVnb3J5IGlzIGEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAiVGVzdGluZyIgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5I2dldENhdGVnb3JpemVkRWxlbWVudHMgPGVtPkNhdGVnb3JpemVkIEVsZW1lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5I2dldFN1YkNhdGVnb3JpZXMgPGVtPlN1YiBDYXRlZ29yaWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ3VzdG9tQ2F0ZWdvcnkgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGVnb3JpemVkIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRlZ29yaXplZCBFbGVtZW50czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldENhdGVnb3JpemVkRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YiBDYXRlZ29yaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgQ2F0ZWdvcmllczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFN1YkNhdGVnb3JpZXMoKTsKLQotfSAvLyBDdXN0b21DYXRlZ29yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzEyMGMzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGRlbGl2ZXJhYmxlIGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlI2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0cyA8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZWxpdmVyYWJsZSBleHRlbmRzIFdvcmtQcm9kdWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWxpdmVyZWQgV29yayBQcm9kdWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKTsKLQotfSAvLyBEZWxpdmVyYWJsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwOTRkZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbiA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYWNrYWdpbmcgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFja2FnaW5nR3VpZGFuY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBhY2thZ2luZ0d1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFja2FnaW5nR3VpZGFuY2UoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcnlQcm9jZXNzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcnlQcm9jZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4OTNlYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJ5UHJvY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBEZWxpdmVyeSBQcm9jZXNzZXMgaXMgYSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuCi0gKiBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRFZHVjYXRpb25NYXRlcmlhbHMgPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWxzIDxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3MoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcnlQcm9jZXNzIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FZHVjYXRpb24gTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWx9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRFZHVjYXRpb25NYXRlcmlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbW11bmljYXRpb25zIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbCIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKTsKLQotfSAvLyBEZWxpdmVyeVByb2Nlc3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5YTE2OWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIDxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRSaXNrTGV2ZWwgPGVtPlJpc2sgTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFR5cGVPZkNvbnRyYWN0IDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gZXh0ZW5kcyBQcm9jZXNzRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogT3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NhbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTY2FsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NhbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzcwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIDxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJpc2sgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBPdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SaXNrIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSaXNrTGV2ZWwoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Umlza0xldmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmlzayBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Umlza0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSaXNrTGV2ZWwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVzdGltYXRpbmdUZWNobmlxdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVzdGltYXRpbmdUZWNobmlxdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIE9mIENvbnRyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlT2ZDb250cmFjdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGVPZkNvbnRyYWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFR5cGVPZkNvbnRyYWN0IDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZU9mQ29udHJhY3QoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaWJhYmxlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaWJhYmxlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MGY4MGFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZXNjcmliYWJsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmliYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRGVzY3JpYmFibGUgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuCi0gKiBUaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UgKHNlZSBTZWN0aW9uIDQuMS40KS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uTmFtZSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRTaGFwZWljb24gPGVtPlNoYXBlaWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0Tm9kZWljb24gPGVtPk5vZGVpY29uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmliYWJsZUVsZW1lbnQgZXh0ZW5kcyBNZXRob2RFbGVtZW50LCBDbGFzc2lmaWVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAicnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCIgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgImoyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQiIHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgIkFyY2hpdGVjdHVyZSBEb2N1bWVudCIuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVzZW50YXRpb25OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uTmFtZSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVzZW50YXRpb25OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudERlc2NyaXB0aW9uIGdldFByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaGFwZWljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNoYXBlaWNvbihVUkkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlVyaSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVVJJIGdldFNoYXBlaWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNoYXBlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2hhcGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTaGFwZWljb24oVVJJIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob2RlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm9kZWljb24oVVJJKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlVyaSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVVJJIGdldE5vZGVpY29uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXROb2RlaWNvbiA8ZW0+Tm9kZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vZGVpY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROb2RlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm9kZWljb24oVVJJIHZhbHVlKTsKLQotfSAvLyBEZXNjcmliYWJsZUVsZW1lbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMDkxZjljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBEZXNjcmlwdG9yIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4KLSAqIERlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdG9yIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShCb29sZWFuIHZhbHVlKTsKLQotfSAvLyBEZXNjcmlwdG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1NjY4N2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpcHRvckRlc2NyaXB0aW9uIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZpbmVkIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVmaW5lZERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWZpbmVkRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZXNjcmlwdG9yRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDA0ZDk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRab29tIDxlbT5ab29tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Vmlld3BvaW50IDxlbT5WaWV3cG9pbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXREaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpYWdyYW0gZXh0ZW5kcyBHcmFwaE5vZGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlpvb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlpvb208L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Wm9vbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Wm9vbShEb3VibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbV9ab29tKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFpvb20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRab29tIDxlbT5ab29tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5ab29tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRab29tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRab29tKERvdWJsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WaWV3cG9pbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZpZXdwb2ludDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WaWV3cG9pbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZpZXdwb2ludChQb2ludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtX1ZpZXdwb2ludCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9pbnQgZ2V0Vmlld3BvaW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Vmlld3BvaW50IDxlbT5WaWV3cG9pbnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZpZXdwb2ludDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Vmlld3BvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWaWV3cG9pbnQoUG9pbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlhZ3JhbSBMaW5rPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGlua30uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXREaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpYWdyYW0gTGluazwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpYWdyYW0gTGluazwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtX0RpYWdyYW1MaW5rKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0RGlhZ3JhbQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rIiBvcHBvc2l0ZT0iZGlhZ3JhbSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGlhZ3JhbUxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVzcGFjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXREaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lc3BhY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE5hbWVzcGFjZShTZW1hbnRpY01vZGVsQnJpZGdlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1fTmFtZXNwYWNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXREaWFncmFtCi0JICogQG1vZGVsIG9wcG9zaXRlPSJkaWFncmFtIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlbWFudGljTW9kZWxCcmlkZ2UgZ2V0TmFtZXNwYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TmFtZXNwYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lc3BhY2UoU2VtYW50aWNNb2RlbEJyaWRnZSB2YWx1ZSk7Ci0KLX0gLy8gRGlhZ3JhbQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RpYWdyYW1FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTg4OGE1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpYWdyYW0gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldElzVmlzaWJsZSA8ZW0+SXMgVmlzaWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpYWdyYW1FbGVtZW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBWaXNpYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFZpc2libGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzVmlzaWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1FbGVtZW50X0lzVmlzaWJsZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SXNWaXNpYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldElzVmlzaWJsZSA8ZW0+SXMgVmlzaWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgVmlzaWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNWaXNpYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1Zpc2libGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0Q29udGFpbmVkIDxlbT5Db250YWluZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGFpbmVyPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZXI8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb250YWluZXIoR3JhcGhFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1FbGVtZW50X0NvbnRhaW5lcigpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRDb250YWluZWQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRhaW5lZCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3JhcGhFbGVtZW50IGdldENvbnRhaW5lcl8oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0Q29udGFpbmVyXyA8ZW0+Q29udGFpbmVyPC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVyPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29udGFpbmVyXygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29udGFpbmVyKEdyYXBoRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZX0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UjZ2V0UmVmZXJlbmNlZCA8ZW0+UmVmZXJlbmNlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUVsZW1lbnRfUmVmZXJlbmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldFJlZmVyZW5jZWQKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UiIG9wcG9zaXRlPSJyZWZlcmVuY2VkIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1FbGVtZW50X1Byb3BlcnR5KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQcm9wZXJ0eSgpOwotCi19IC8vIERpYWdyYW1FbGVtZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbUxpbmsuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNjdiNTg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpYWdyYW0gTGluazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldFpvb20gPGVtPlpvb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Vmlld3BvcnQgPGVtPlZpZXdwb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXREaWFncmFtIDxlbT5EaWFncmFtPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUxpbmsoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlhZ3JhbUxpbmsgZXh0ZW5kcyBEaWFncmFtRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Wm9vbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Wm9vbTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5ab29tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRab29tKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtTGlua19ab29tKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFpvb20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Wm9vbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Wm9vbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Wm9vbShEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Vmlld3BvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZpZXdwb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZpZXdwb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRWaWV3cG9ydChQb2ludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtTGlua19WaWV3cG9ydCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9pbnQgZ2V0Vmlld3BvcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Vmlld3BvcnQgPGVtPlZpZXdwb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WaWV3cG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Vmlld3BvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZpZXdwb3J0KFBvaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0TGluayA8ZW0+TGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtTGlua19HcmFwaEVsZW1lbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0TGluawotCSAqIEBtb2RlbCBvcHBvc2l0ZT0ibGluayIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUdyYXBoRWxlbWVudCBnZXRHcmFwaEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEdyYXBoRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldERpYWdyYW1MaW5rIDxlbT5EaWFncmFtIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaWFncmFtPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREaWFncmFtKERpYWdyYW0pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUxpbmtfRGlhZ3JhbSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0RGlhZ3JhbUxpbmsKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImRpYWdyYW1MaW5rIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlhZ3JhbSBnZXREaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpYWdyYW08L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERpYWdyYW0oRGlhZ3JhbSB2YWx1ZSk7Ci0KLX0gLy8gRGlhZ3JhbUxpbmsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaW1lbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaW1lbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODFhY2JjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGltZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpbWVuc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiNnZXRXaWR0aCA8ZW0+V2lkdGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldEhlaWdodCA8ZW0+SGVpZ2h0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGltZW5zaW9uKCkKLSAqIEBtb2RlbAotICogQGV4dGVuZHMgSU1vZGVsT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGltZW5zaW9uIGV4dGVuZHMgSU1vZGVsT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2lkdGg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2lkdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdpZHRoKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaW1lbnNpb25fV2lkdGgoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0V2lkdGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V2lkdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdpZHRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXaWR0aChEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IZWlnaHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGVpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIZWlnaHQoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpbWVuc2lvbl9IZWlnaHQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0SGVpZ2h0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiNnZXRIZWlnaHQgPGVtPkhlaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGVpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIZWlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhlaWdodChEb3VibGUgdmFsdWUpOwotCi19IC8vIERpbWVuc2lvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rpc2NpcGxpbmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaXNjaXBsaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxNjUyZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rpc2NpcGxpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzY2lwbGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgRGlzY2lwbGluZSBpcyBhIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4KLSAqIEEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0U3ViZGlzY2lwbGluZSA8ZW0+U3ViZGlzY2lwbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lI2dldFJlZmVyZW5jZVdvcmtmbG93cyA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlzY2lwbGluZSBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFza3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFza3M8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX1Rhc2tzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViZGlzY2lwbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWJkaXNjaXBsaW5lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViZGlzY2lwbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U3ViZGlzY2lwbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFdvcmtmbG93czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlIFdvcmtmbG93czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKTsKLQotfSAvLyBEaXNjaXBsaW5lCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlzY2lwbGluZUdyb3VwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlzY2lwbGluZUdyb3VwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2MjNmMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rpc2NpcGxpbmVHcm91cGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lIEdyb3VwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRGlzY2lwbGluZSBHcm91cGluZ3MgYXJlIHVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgIlNvZnR3YXJlIERpc2NpcGxpbmVzIiB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICJSZXF1aXJlbWVudHMgTWFuYWdlbWVudCIgb3IgIlRlc3RpbmciOyAiSVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCIgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAiSVQgT3BlcmF0aW9uYWwgU2VydmljZXMiLCAiSVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyIsIG9yICJJVCBFbmFibGluZyBTZXJ2aWNlcyIuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0RGlzY2lwbGluZXMgPGVtPkRpc2NpcGxpbmVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc2NpcGxpbmVHcm91cGluZyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzY2lwbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzY2lwbGluZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNjaXBsaW5lczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERpc2NpcGxpbmVzKCk7Ci0KLX0gLy8gRGlzY2lwbGluZUdyb3VwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRG9tYWluLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRG9tYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE2ODkwMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RvbWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb21haW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBEb21haW4gaXMgYSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuCi0gKiBEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluI2dldFdvcmtQcm9kdWN0cyA8ZW0+V29yayBQcm9kdWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4jZ2V0U3ViZG9tYWlucyA8ZW0+U3ViZG9tYWluczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERvbWFpbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEb21haW4gZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERvbWFpbl9Xb3JrUHJvZHVjdHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRXb3JrUHJvZHVjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YmRvbWFpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWJkb21haW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViZG9tYWluczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREb21haW5fU3ViZG9tYWlucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFN1YmRvbWFpbnMoKTsKLQotfSAvLyBEb21haW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NjE0YWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBJTW9kZWxPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFbGVtZW50IGV4dGVuZHMgSU1vZGVsT2JqZWN0IHsKLX0gLy8gRWxlbWVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VsbGlwc2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FbGxpcHNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5Y2FkY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VsbGlwc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGxpcHNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSYWRpdXNYIDxlbT5SYWRpdXMgWDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1kgPGVtPlJhZGl1cyBZPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Um90YXRpb24gPGVtPlJvdGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0U3RhcnRBbmdsZSA8ZW0+U3RhcnQgQW5nbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRFbmRBbmdsZSA8ZW0+RW5kIEFuZ2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Q2VudGVyIDxlbT5DZW50ZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFbGxpcHNlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVsbGlwc2UgZXh0ZW5kcyBHcmFwaGljUHJpbWl0aXZlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYWRpdXMgWDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmFkaXVzIFg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFkaXVzIFg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJhZGl1c1goRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfUmFkaXVzWCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvdWJsZSBnZXRSYWRpdXNYKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0UmFkaXVzWCA8ZW0+UmFkaXVzIFg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhZGl1cyBYPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSYWRpdXNYKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSYWRpdXNYKERvdWJsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYWRpdXMgWTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmFkaXVzIFk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFkaXVzIFk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJhZGl1c1koRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfUmFkaXVzWSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvdWJsZSBnZXRSYWRpdXNZKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0UmFkaXVzWSA8ZW0+UmFkaXVzIFk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhZGl1cyBZPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSYWRpdXNZKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSYWRpdXNZKERvdWJsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um90YXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um90YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvdGF0aW9uKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFbGxpcHNlX1JvdGF0aW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFJvdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Um90YXRpb24gPGVtPlJvdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Um90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJvdGF0aW9uKERvdWJsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydCBBbmdsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RhcnQgQW5nbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgQW5nbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0QW5nbGUoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfU3RhcnRBbmdsZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvdWJsZSBnZXRTdGFydEFuZ2xlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0U3RhcnRBbmdsZSA8ZW0+U3RhcnQgQW5nbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IEFuZ2xlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydEFuZ2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydEFuZ2xlKERvdWJsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbmQgQW5nbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVuZCBBbmdsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbmQgQW5nbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVuZEFuZ2xlKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFbGxpcHNlX0VuZEFuZ2xlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldEVuZEFuZ2xlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0RW5kQW5nbGUgPGVtPkVuZCBBbmdsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW5kIEFuZ2xlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFbmRBbmdsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RW5kQW5nbGUoRG91YmxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNlbnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2VudGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNlbnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2VudGVyKFBvaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfQ2VudGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQb2ludCBnZXRDZW50ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRDZW50ZXIgPGVtPkNlbnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2VudGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDZW50ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENlbnRlcihQb2ludCB2YWx1ZSk7Ci0KLX0gLy8gRWxsaXBzZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MTIxNWRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zIHF1YWxpZnkgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRXhhbXBsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0V4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjZiODc0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIEV4YW1wbGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEV4YW1wbGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXhhbXBsZSBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gRXhhbXBsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoQ29ubmVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhDb25uZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzgxMzc3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhDb25uZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggQ29ubmVjdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWRnZSA8ZW0+R3JhcGggRWRnZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoQ29ubmVjdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYXBoQ29ubmVjdG9yIGV4dGVuZHMgR3JhcGhFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldEFuY2hvcmFnZSA8ZW0+QW5jaG9yYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWxlbWVudCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRBbmNob3JhZ2UKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImFuY2hvcmFnZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUdyYXBoRWxlbWVudCBnZXRHcmFwaEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEdyYXBoRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HcmFwaCBFZGdlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2V9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldEFuY2hvciA8ZW0+QW5jaG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyYXBoIEVkZ2U8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFwaCBFZGdlPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWRnZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSNnZXRBbmNob3IKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UiIG9wcG9zaXRlPSJhbmNob3IiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEdyYXBoRWRnZSgpOwotCi19IC8vIEdyYXBoQ29ubmVjdG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhFZGdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhFZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhNjc1MjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoRWRnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaCBFZGdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldEFuY2hvciA8ZW0+QW5jaG9yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSNnZXRXYXlwb2ludHMgPGVtPldheXBvaW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWRnZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBHcmFwaEVkZ2UgZXh0ZW5kcyBHcmFwaEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFuY2hvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3J9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFZGdlIDxlbT5HcmFwaCBFZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFuY2hvcjwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFuY2hvcjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVkZ2VfQW5jaG9yKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFZGdlCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IiIG9wcG9zaXRlPSJncmFwaEVkZ2UiIHVwcGVyPSIyIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRBbmNob3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2F5cG9pbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2F5cG9pbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWRnZV9XYXlwb2ludHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFdheXBvaW50cygpOwotCi19IC8vIEdyYXBoRWRnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZWVjODFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0UG9zaXRpb24gPGVtPlBvc2l0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRDb250YWluZWQgPGVtPkNvbnRhaW5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0TGluayA8ZW0+TGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0QW5jaG9yYWdlIDxlbT5BbmNob3JhZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFNlbWFudGljTW9kZWwgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBHcmFwaEVsZW1lbnQgZXh0ZW5kcyBEaWFncmFtRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc2l0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc2l0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQb3NpdGlvbihQb2ludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVsZW1lbnRfUG9zaXRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBvaW50IGdldFBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRQb3NpdGlvbiA8ZW0+UG9zaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc2l0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQb3NpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UG9zaXRpb24oUG9pbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGFpbmVkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudH0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGFpbmVkPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVkPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWxlbWVudF9Db250YWluZWQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRDb250YWluZXJfCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQiIG9wcG9zaXRlPSJjb250YWluZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0Q29udGFpbmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGlua30uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpbms8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFbGVtZW50X0xpbmsoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayIgb3Bwb3NpdGU9ImdyYXBoRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbmNob3JhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yfS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BbmNob3JhZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbmNob3JhZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFbGVtZW50X0FuY2hvcmFnZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWxlbWVudAotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yIiBvcHBvc2l0ZT0iZ3JhcGhFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEFuY2hvcmFnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VtYW50aWMgTW9kZWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlbWFudGljIE1vZGVsPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlbWFudGljIE1vZGVsPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTZW1hbnRpY01vZGVsKFNlbWFudGljTW9kZWxCcmlkZ2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFbGVtZW50X1NlbWFudGljTW9kZWwoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldEdyYXBoRWxlbWVudAotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZ3JhcGhFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlbWFudGljTW9kZWxCcmlkZ2UgZ2V0U2VtYW50aWNNb2RlbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0U2VtYW50aWNNb2RlbCA8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlbWFudGljIE1vZGVsPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTZW1hbnRpY01vZGVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZW1hbnRpY01vZGVsKFNlbWFudGljTW9kZWxCcmlkZ2UgdmFsdWUpOwotCi19IC8vIEdyYXBoRWxlbWVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTc4ZDQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoIE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoTm9kZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBHcmFwaE5vZGUgZXh0ZW5kcyBHcmFwaEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U2l6ZShEaW1lbnNpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhOb2RlX1NpemUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURpbWVuc2lvbiBnZXRTaXplKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZSNnZXRTaXplIDxlbT5TaXplPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTaXplKERpbWVuc2lvbiB2YWx1ZSk7Ci0KLX0gLy8gR3JhcGhOb2RlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhpY1ByaW1pdGl2ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoaWNQcmltaXRpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjQwYzhjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhpY1ByaW1pdGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGhpYyBQcmltaXRpdmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoaWNQcmltaXRpdmUoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYXBoaWNQcmltaXRpdmUgZXh0ZW5kcyBMZWFmRWxlbWVudCB7Ci19IC8vIEdyYXBoaWNQcmltaXRpdmUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HdWlkYW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZmNmM0NjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkYW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHdWlkYW5jZSgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3VpZGFuY2UgZXh0ZW5kcyBDb250ZW50RWxlbWVudCB7Ci19IC8vIEd1aWRhbmNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3VpZGFuY2VEZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRhbmNlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODMxNDI5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3VpZGFuY2VEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2UgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnRzIDxlbT5BdHRhY2htZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRhbmNlRGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3VpZGFuY2VEZXNjcmlwdGlvbiBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0YWNobWVudHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dGFjaG1lbnRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRhY2htZW50cyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXR0YWNobWVudHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiNnZXRBdHRhY2htZW50cyA8ZW0+QXR0YWNobWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dGFjaG1lbnRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdHRhY2htZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0YWNobWVudHMoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBHdWlkYW5jZURlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3VpZGVsaW5lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3VpZGVsaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNkYjE4ZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRlbGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBHdWlkZWxpbmUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3VpZGVsaW5lKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRlbGluZSBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gR3VpZGVsaW5lCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvSW1hZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9JbWFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzYyZTY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9JbWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW1hZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSNnZXRVcmkgPGVtPlVyaTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSNnZXRNaW1lVHlwZSA8ZW0+TWltZSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0SW1hZ2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW1hZ2UgZXh0ZW5kcyBMZWFmRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Vcmk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVcmkoVVJJKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEltYWdlX1VyaSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlVyaSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVVJJIGdldFVyaSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSNnZXRVcmkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVyaShVUkkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWltZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbWUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWltZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEltYWdlX01pbWVUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNaW1lVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSNnZXRNaW1lVHlwZSA8ZW0+TWltZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NaW1lIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1pbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNaW1lVHlwZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEltYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvSXRlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvSXRlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1YmM2NzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0l0ZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SXRlcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogSXRlcmF0aW9uIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi0gKiBJdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLikKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0SXRlcmF0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZXJhdGlvbiBleHRlbmRzIEFjdGl2aXR5IHsKLX0gLy8gSXRlcmF0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTGVhZkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9MZWFmRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjhmOWUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9MZWFmRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGVhZiBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRMZWFmRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGVhZkVsZW1lbnQgZXh0ZW5kcyBEaWFncmFtRWxlbWVudCB7Ci19IC8vIExlYWZFbGVtZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGE1MmZkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24gPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0UHJvY2Vzc1ZpZXdzIDxlbT5Qcm9jZXNzIFZpZXdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0RGVmYXVsdFZpZXcgPGVtPkRlZmF1bHQgVmlldzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEJhc2VDb25maWd1cmF0aW9ucyA8ZW0+QmFzZSBDb25maWd1cmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSA8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEFkZGVkQ2F0ZWdvcnkgPGVtPkFkZGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RDb25maWd1cmF0aW9uIGV4dGVuZHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4iIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2Nlc3MgVmlld3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZXNzIFZpZXdzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzcyBWaWV3czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQcm9jZXNzVmlld3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmlldzwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVmlldzwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RGVmYXVsdFZpZXcoQ29udGVudENhdGVnb3J5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50Q2F0ZWdvcnkgZ2V0RGVmYXVsdFZpZXcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0VmlldyA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERlZmF1bHRWaWV3KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0VmlldyhDb250ZW50Q2F0ZWdvcnkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBDb25maWd1cmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlIENvbmZpZ3VyYXRpb25zPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDb25maWd1cmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWJ0cmFjdGVkIENhdGVnb3J5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U3VidHJhY3RlZENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkZGVkIENhdGVnb3J5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEFkZGVkQ2F0ZWdvcnkoKTsKLQotfSAvLyBNZXRob2RDb25maWd1cmF0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ4MzA5ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRXZlcnkgY2xhc3MgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gaXMgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMgTWV0aG9kIEVsZW1lbnQgaXMgdGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgY2xhc3NlcyBhbmQgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgZXZlcnkgb3RoZXIgZWxlbWVudCB0eXBlIG9mIHRoaXMgbW9kZWwuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS4gIE1ldGhvZCBFbGVtZW50IGluaGVyaXRzIHRoZSBOYW1lIGF0dHJpYnV0ZSBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQncyBzdXBlciBjbGFzcy4gIEV2ZXJ5IGVsZW1lbnQgZGVmaW5lZCBhcyBhIFVNQSBpbnN0YW5jZSBpcyBkZXJpdmVkIGZyb20gTW9kZWwgRWxlbWVudC4gIEV2ZXJ5IE1ldGhvZCBFbGVtZW50IGluLXN0YW5jZSBpcyBhdCBsZWFzdCBkZWZpbmVkIGJ5IGEgdW5pcXVlIGlkLCBhIG5hbWUsIGFzIHdlbGwgYXMgYnJpZWYgZGVzY3JpcHRpb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEd1aWQgPGVtPkd1aWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRCcmllZkRlc2NyaXB0aW9uIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE93bmVkUnVsZXMgPGVtPk93bmVkIFJ1bGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5IDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFN1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRPcmRlcmluZ0d1aWRlIDxlbT5PcmRlcmluZyBHdWlkZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZEVsZW1lbnQgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRHdWlkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X0d1aWQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEd1aWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRHdWlkIDxlbT5HdWlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHdWlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHdWlkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRCcmllZkRlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRCcmllZkRlc2NyaXB0aW9uIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJyaWVmRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJyaWVmRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk93bmVkIFJ1bGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3duZWQgUnVsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE93bmVkUnVsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlIEV4dGVuZHMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcHJlc3NlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3VwcHJlc3NlZChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldFN1cHByZXNzZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBwcmVzc2VkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdXBwcmVzc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdXBwcmVzc2VkKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlcmluZyBHdWlkZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3JkZXJpbmdHdWlkZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRPcmRlcmluZ0d1aWRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3JkZXJpbmdHdWlkZSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPcmRlcmluZ0d1aWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPcmRlcmluZ0d1aWRlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTWV0aG9kRWxlbWVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMjZhZDdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RFbGVtZW50UHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RFbGVtZW50UHJvcGVydHkgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNZXRob2RFbGVtZW50UHJvcGVydHkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RMaWJyYXJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzRmNmMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBMaWJyYXJ5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZFBsdWdpbnMgPGVtPk1ldGhvZCBQbHVnaW5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkjZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIDxlbT5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kTGlicmFyeSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RMaWJyYXJ5IGV4dGVuZHMgTWV0aG9kVW5pdCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2lufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TWV0aG9kUGx1Z2lucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQotfSAvLyBNZXRob2RMaWJyYXJ5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOThlNGQ3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgTWV0aG9kIFBhY2thZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0R2xvYmFsIDxlbT5HbG9iYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlcyA8ZW0+UmV1c2VkIFBhY2thZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0Q2hpbGRQYWNrYWdlcyA8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQYWNrYWdlIGV4dGVuZHMgTWV0aG9kRWxlbWVudCwKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIE1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdsb2JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0R2xvYmFsKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRHbG9iYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2xvYmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHbG9iYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdsb2JhbChCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXVzZWQgUGFja2FnZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXVzZWQgUGFja2FnZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UmV1c2VkUGFja2FnZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoaWxkIFBhY2thZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoaWxkIFBhY2thZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldENoaWxkUGFja2FnZXMoKTsKLQotCU1ldGhvZFBhY2thZ2UgZ2V0UGFyZW50UGFja2FnZSgpOwotCi19IC8vIE1ldGhvZFBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDIzZjZiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIE1ldGhvZCBQbHVnaW4gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi0gKiBNZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLSAqIFNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0VXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0TWV0aG9kUGFja2FnZXMgPGVtPk1ldGhvZCBQYWNrYWdlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0QmFzZXMgPGVtPkJhc2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZFBsdWdpbiBleHRlbmRzIE1ldGhvZFVuaXQsIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNlciBDaGFuZ2VhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVzZXJDaGFuZ2VhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRVc2VyQ2hhbmdlYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0VXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXNlckNoYW5nZWFibGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNZXRob2RQYWNrYWdlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9CYXNlcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRCYXNlcygpOwotCi19IC8vIE1ldGhvZFBsdWdpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFVuaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RVbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzYTdjZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBVbml0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBNZXRob2QgVW5pdCBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q29weXJpZ2h0U3RhdGVtZW50IDxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kVW5pdCBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhvcnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXRfQXV0aG9ycygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXV0aG9ycygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF1dGhvcnMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2hhbmdlRGF0ZShEYXRlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRhdGUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURhdGUgZ2V0Q2hhbmdlRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2hhbmdlRGF0ZShEYXRlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X1ZlcnNpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb3B5cmlnaHRTdGF0ZW1lbnQoU3VwcG9ydGluZ01hdGVyaWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXRfQ29weXJpZ2h0U3RhdGVtZW50KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3VwcG9ydGluZ01hdGVyaWFsIGdldENvcHlyaWdodFN0YXRlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENvcHlyaWdodFN0YXRlbWVudCA8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3B5cmlnaHRTdGF0ZW1lbnQoU3VwcG9ydGluZ01hdGVyaWFsIHZhbHVlKTsKLQotfSAvLyBNZXRob2RVbml0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWlsZXN0b25lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWlsZXN0b25lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwZWZhMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01pbGVzdG9uZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWlsZXN0b25lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNaWxlc3RvbmUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWlsZXN0b25lIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotfSAvLyBNaWxlc3RvbmUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9OYW1lZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9OYW1lZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODFlMzM0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTmFtZWRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuICBEZWZpbmVkIHRoYXQgZXZlcnkgZWxlbWVudCBoYXMgYSBuYW1lLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXROYW1lZEVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkRWxlbWVudCBleHRlbmRzIEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE5hbWVkRWxlbWVudF9OYW1lKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTmFtZWRFbGVtZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTmFtZXNwYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjZWFhMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL05hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVzcGFjZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TmFtZXNwYWNlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBOYW1lc3BhY2UgZXh0ZW5kcyBOYW1lZEVsZW1lbnQgewotfSAvLyBOYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9PdXRjb21lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvT3V0Y29tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MTM1OTZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9PdXRjb21lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRjb21lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gb3V0Y29tZSBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRPdXRjb21lKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dGNvbWUgZXh0ZW5kcyBXb3JrUHJvZHVjdCB7Ci19IC8vIE91dGNvbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNzQ0NjNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2UuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBhY2thZ2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFja2FnZSBleHRlbmRzIE5hbWVzcGFjZSwgUGFja2FnZWFibGVFbGVtZW50IHsKLX0gLy8gUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BhY2thZ2VhYmxlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BhY2thZ2VhYmxlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Yzk0N2U1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QYWNrYWdlYWJsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhY2thZ2VhYmxlRWxlbWVudCBleHRlbmRzIE5hbWVkRWxlbWVudCB7Ci19IC8vIFBhY2thZ2VhYmxlRWxlbWVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BoYXNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGhhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzgxNzVlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGhhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBoYXNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUGhhc2UgaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLSAqIFBoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQaGFzZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQaGFzZSBleHRlbmRzIEFjdGl2aXR5IHsKLX0gLy8gUGhhc2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QbGFubmluZ0RhdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QbGFubmluZ0RhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTdlYzU4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGxhbm5pbmdEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUGxhbm5pbmcgRGF0YSBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLgotICogUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LgotICogKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRSYW5rIDxlbT5SYW5rPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UGxhbm5pbmdEYXRhKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBsYW5uaW5nRGF0YSBleHRlbmRzIFByb2Nlc3NFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydERhdGUoRGF0ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRGF0ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGF0ZSBnZXRTdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydERhdGUoRGF0ZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2ggRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2hEYXRlKERhdGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5EYXRlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEYXRlIGdldEZpbmlzaERhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoRGF0ZShEYXRlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJhbmsoaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YV9SYW5rKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuSW50ZWdlciIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IGdldFJhbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFJhbmsgPGVtPlJhbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJhbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJhbmsoaW50IHZhbHVlKTsKLQotfSAvLyBQbGFubmluZ0RhdGEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qb2ludC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmMDkyNjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvaW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQjZ2V0WCA8ZW0+WDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCNnZXRZIDxlbT5ZPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UG9pbnQoKQotICogQG1vZGVsCi0gKiBAZXh0ZW5kcyBJTW9kZWxPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQb2ludCBleHRlbmRzIElNb2RlbE9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRYKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQb2ludF9YKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQjZ2V0WCA8ZW0+WDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0WCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0WChEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5ZPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRZKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQb2ludF9ZKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQjZ2V0WSA8ZW0+WTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0WSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0WShEb3VibGUgdmFsdWUpOwotCi19IC8vIFBvaW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUG9seWxpbmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qb2x5bGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NjgyODE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qb2x5bGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb2x5bGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lI2dldENsb3NlZCA8ZW0+Q2xvc2VkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lI2dldFdheXBvaW50cyA8ZW0+V2F5cG9pbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UG9seWxpbmUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9seWxpbmUgZXh0ZW5kcyBHcmFwaGljUHJpbWl0aXZlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbG9zZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xvc2VkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsb3NlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2xvc2VkKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UG9seWxpbmVfQ2xvc2VkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRDbG9zZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUjZ2V0Q2xvc2VkIDxlbT5DbG9zZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsb3NlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2xvc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDbG9zZWQoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XYXlwb2ludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldheXBvaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldheXBvaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQb2x5bGluZV9XYXlwb2ludHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIGxvd2VyPSIyIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRXYXlwb2ludHMoKTsKLQotfSAvLyBQb2x5bGluZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ByYWN0aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJhY3RpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZThiZTQ4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJhY3RpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJhY3RpY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAiTWFuYWdlIFJpc2tzIiwgIkNvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSIsICJBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50IiwgZXRjLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0U3ViUHJhY3RpY2VzIDxlbT5TdWIgUHJhY3RpY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlI2dldENvbnRlbnRSZWZlcmVuY2VzIDxlbT5Db250ZW50IFJlZmVyZW5jZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0QWN0aXZpdHlSZWZlcmVuY2VzIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJhY3RpY2UgZXh0ZW5kcyBHdWlkYW5jZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIFByYWN0aWNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIFByYWN0aWNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBQcmFjdGljZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTdWJQcmFjdGljZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRlbnQgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudCBSZWZlcmVuY2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudCBSZWZlcmVuY2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0Q29udGVudFJlZmVyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdGl2aXR5IFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjdGl2aXR5IFJlZmVyZW5jZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBSZWZlcmVuY2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEFjdGl2aXR5UmVmZXJlbmNlcygpOwotCi19IC8vIFByYWN0aWNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ByYWN0aWNlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjNmNjA5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBZGRpdGlvbmFsSW5mbyA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0UHJvYmxlbSA8ZW0+UHJvYmxlbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEJhY2tncm91bmQgPGVtPkJhY2tncm91bmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscyA8ZW0+R29hbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRMZXZlbHNPZkFkb3B0aW9uIDxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByYWN0aWNlRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWwgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIEluZm88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFkZGl0aW9uYWxJbmZvKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBZGRpdGlvbmFsSW5mbygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFkZGl0aW9uYWxJbmZvIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWRkaXRpb25hbEluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFkZGl0aW9uYWxJbmZvKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9ibGVtPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9ibGVtPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm9ibGVtKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByb2JsZW0oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRQcm9ibGVtIDxlbT5Qcm9ibGVtPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9ibGVtPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcm9ibGVtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm9ibGVtKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYWNrZ3JvdW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRCYWNrZ3JvdW5kKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEJhY2tncm91bmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYWNrZ3JvdW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCYWNrZ3JvdW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCYWNrZ3JvdW5kKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hb2FsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hb2FsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0R29hbHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEdvYWxzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0R29hbHMgPGVtPkdvYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Hb2FsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0R29hbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdvYWxzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBsaWNhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXBwbGljYXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFwcGxpY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBsaWNhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFwcGxpY2F0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbHMgT2YgQWRvcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBPdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExldmVsc09mQWRvcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZXZlbHNPZkFkb3B0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJhY3RpY2VEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkZjYzMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUHJvY2VzcyBpcyBhIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuCi0gKiBDb3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldEluY2x1ZGVzUGF0dGVybnMgPGVtPkluY2x1ZGVzIFBhdHRlcm5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0RGVmYXVsdENvbnRleHQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldFZhbGlkQ29udGV4dCA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3MoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3MgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluY2x1ZGVzIFBhdHRlcm5zPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5jbHVkZXMgUGF0dGVybnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm5zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybiIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW5jbHVkZXNQYXR0ZXJucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0Q29udGV4dChNZXRob2RDb25maWd1cmF0aW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kQ29uZmlndXJhdGlvbiBnZXREZWZhdWx0Q29udGV4dCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRDb250ZXh0KE1ldGhvZENvbmZpZ3VyYXRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWxpZCBDb250ZXh0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWQgQ29udGV4dDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0VmFsaWRDb250ZXh0KCk7Ci0KLX0gLy8gUHJvY2VzcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NDb21wb25lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3NDcwZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFByb2Nlc3MgQ29tcG9uZW50IGlzIGEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4KLSAqIFVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAiYmxhY2sgYm94Ii4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgInJlYWxpemF0aW9uIiBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEludGVyZmFjZXMgPGVtPkludGVyZmFjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzQ29tcG9uZW50IGV4dGVuZHMgUHJvY2Vzc1BhY2thZ2UsIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyZmFjZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJmYWNlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVyZmFjZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2VzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbnRlcmZhY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBnZXRQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgdmFsdWUpOwotCi19IC8vIFByb2Nlc3NDb21wb25lbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1NDgxYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBQcm9jZXNzIENvbXBvbmVudCBhcHBsaWNhdGlvbiBpbiBhIFByb2Nlc3MsIGkuZS4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIFByb2Nlc3MuICBUaGUgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBkZXRhaWxzIG9mIHRoZSBjb21wb25lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0byBwcm92aWRlIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMgc3VjaCBhcyBpdCBvd24gcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IjZ2V0UHJvY2Vzc0NvbXBvbmVudCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciBleHRlbmRzIERlc2NyaXB0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJvY2Vzc0NvbXBvbmVudChQcm9jZXNzQ29tcG9uZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX1Byb2Nlc3NDb21wb25lbnQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0NvbXBvbmVudCBnZXRQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yI2dldFByb2Nlc3NDb21wb25lbnQgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvY2Vzc0NvbXBvbmVudChQcm9jZXNzQ29tcG9uZW50IHZhbHVlKTsKLQotfSAvLyBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViOWU2NzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UgY29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMgPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZUlPIDxlbT5JbnRlcmZhY2UgSU88L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIElPPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIElPPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIElPPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbnRlcmZhY2VJTygpOwotCi19IC8vIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTIxYjViMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NvcGUgPGVtPlNjb3BlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzRGVzY3JpcHRpb24gZXh0ZW5kcyBBY3Rpdml0eURlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBkZWxpdmVyeSBwYXR0ZXJucyBhbmQgbW9kZWxzLiBJdCBpcyB1c2VkIGxpa2UgYSBzeW5vbnltLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX0V4dGVybmFsSWQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEV4dGVybmFsSWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQgPGVtPkV4dGVybmFsIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZXJuYWxJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NvcGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNjb3BlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNjb3BlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjb3BlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NvcGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXNhZ2UgTm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVzYWdlTm90ZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRVc2FnZU5vdGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNhZ2UgTm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVzYWdlTm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVzYWdlTm90ZXMoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcm9jZXNzRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3ZDMzYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBQcm9jZXNzIEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4KLSAqIFByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0VsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NFbGVtZW50IGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50IHsKLX0gLy8gUHJvY2Vzc0VsZW1lbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzRmFtaWx5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0ZhbWlseS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMGYxOTg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzRmFtaWx5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRmFtaWx5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBEZWxpdmVyeSBNb2RlbCBGYW1pbHkgaXMgYSBjb252ZW5pZW50IGdyb3VwaW5nIG9mIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyBvZiBpbnRlcmVzdCB0byBzb21lIHNwZWNpZmljIHVzZXIgY29tbXVuaXR5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseSNnZXREZWxpdmVyeVByb2Nlc3NlcyA8ZW0+RGVsaXZlcnkgUHJvY2Vzc2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0ZhbWlseSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzRmFtaWx5IGV4dGVuZHMgTWV0aG9kQ29uZmlndXJhdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2Vzc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3N9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVsaXZlcnkgUHJvY2Vzc2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsaXZlcnkgUHJvY2Vzc2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NGYW1pbHlfRGVsaXZlcnlQcm9jZXNzZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKTsKLQotfSAvLyBQcm9jZXNzRmFtaWx5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc1BhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NjNmYjVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBQcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLSAqIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudHMgPGVtPlByb2Nlc3MgRWxlbWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0RGlhZ3JhbXMgPGVtPkRpYWdyYW1zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc1BhY2thZ2UgZXh0ZW5kcyBNZXRob2RQYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZXNzIEVsZW1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzcyBFbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFByb2Nlc3NFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlhZ3JhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW19LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlhZ3JhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaWFncmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZV9EaWFncmFtcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREaWFncmFtcygpOwotCi19IC8vIFByb2Nlc3NQYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MWY0MjhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLgotICogQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSNnZXRCYXNlZE9uUHJvY2Vzc2VzIDxlbT5CYXNlZCBPbiBQcm9jZXNzZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZWQgT24gUHJvY2Vzc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2VkIE9uIFByb2Nlc3NlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2VkIE9uIFByb2Nlc3NlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlZE9uUHJvY2Vzc2VzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRCYXNlZE9uUHJvY2Vzc2VzKCk7Ci0KLX0gLy8gUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9wZXJ0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5MjcxZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldEtleSA8ZW0+S2V5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb3BlcnR5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5IGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktleTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPktleTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5LZXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEtleShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvcGVydHlfS2V5KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRLZXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkjZ2V0S2V5IDxlbT5LZXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPktleTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0S2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRLZXkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9wZXJ0eV9WYWx1ZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJvcGVydHkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qc2V1ZG9TdGF0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BzZXVkb1N0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUzMTRkZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BzZXVkb1N0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFBzZXVkb1N0YXRlLmphdmEsdiAxLjMgMjAwNi8wNy8yNCAyMzozNDowOSBieHUgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qc2V1ZG8gU3RhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBzZXVkb1N0YXRlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBzZXVkb1N0YXRlIGV4dGVuZHMgVmVydGV4IHsKLX0gLy8gUHNldWRvU3RhdGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHNldWRvU3RhdGVLaW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHNldWRvU3RhdGVLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzZTgyNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BzZXVkb1N0YXRlS2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHNldWRvU3RhdGVLaW5kLmphdmEsdiAxLjMgMjAwNi8wNy8yNCAyMzozNDowOCBieHUgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5Qc2V1ZG8gU3RhdGUgS2luZDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHNldWRvU3RhdGVLaW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHNldWRvU3RhdGVLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Jbml0aWFsPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Jbml0aWFsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOSVRJQUxfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJpbml0aWFsIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSVRJQUwgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Sm9pbjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Sm9pbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKT0lOX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0iam9pbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKT0lOID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZvcms8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkZvcms8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRk9SS19MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9ImZvcmsiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9SSyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KdW5jdGlvbjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SnVuY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSlVOQ1RJT05fTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJqdW5jdGlvbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKVU5DVElPTiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DaG9pY2U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNob2ljZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDSE9JQ0VfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJjaG9pY2UiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFID0gNDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVudHJ5IFBvaW50PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FbnRyeSBQb2ludDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFTlRSWV9QT0lOVF9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9ImVudHJ5UG9pbnQiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5UUllfUE9JTlQgPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXhpdCBQb2ludDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RXhpdCBQb2ludDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWElUX1BPSU5UX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0iZXhpdFBvaW50IgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYSVRfUE9JTlQgPSA2OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VGVybWluYXRlPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5UZXJtaW5hdGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVEVSTUlOQVRFX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0idGVybWluYXRlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFUk1JTkFURSA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Jbml0aWFsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOSVRJQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBzZXVkb1N0YXRlS2luZCBJTklUSUFMX0xJVEVSQUwgPSBuZXcgUHNldWRvU3RhdGVLaW5kKAotCQkJSU5JVElBTCwgImluaXRpYWwiLCAiaW5pdGlhbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkpvaW48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSk9JTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHNldWRvU3RhdGVLaW5kIEpPSU5fTElURVJBTCA9IG5ldyBQc2V1ZG9TdGF0ZUtpbmQoCi0JCQlKT0lOLCAiam9pbiIsICJqb2luIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Rm9yazwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGT1JLCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQc2V1ZG9TdGF0ZUtpbmQgRk9SS19MSVRFUkFMID0gbmV3IFBzZXVkb1N0YXRlS2luZCgKLQkJCUZPUkssICJmb3JrIiwgImZvcmsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KdW5jdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKVU5DVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHNldWRvU3RhdGVLaW5kIEpVTkNUSU9OX0xJVEVSQUwgPSBuZXcgUHNldWRvU3RhdGVLaW5kKAotCQkJSlVOQ1RJT04sICJqdW5jdGlvbiIsICJqdW5jdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNob2ljZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDSE9JQ0UKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBzZXVkb1N0YXRlS2luZCBDSE9JQ0VfTElURVJBTCA9IG5ldyBQc2V1ZG9TdGF0ZUtpbmQoCi0JCQlDSE9JQ0UsICJjaG9pY2UiLCAiY2hvaWNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RW50cnkgUG9pbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRU5UUllfUE9JTlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBzZXVkb1N0YXRlS2luZCBFTlRSWV9QT0lOVF9MSVRFUkFMID0gbmV3IFBzZXVkb1N0YXRlS2luZCgKLQkJCUVOVFJZX1BPSU5ULCAiZW50cnlQb2ludCIsICJlbnRyeVBvaW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXhpdCBQb2ludDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWElUX1BPSU5UCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQc2V1ZG9TdGF0ZUtpbmQgRVhJVF9QT0lOVF9MSVRFUkFMID0gbmV3IFBzZXVkb1N0YXRlS2luZCgKLQkJCUVYSVRfUE9JTlQsICJleGl0UG9pbnQiLCAiZXhpdFBvaW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VGVybWluYXRlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1RFUk1JTkFURQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHNldWRvU3RhdGVLaW5kIFRFUk1JTkFURV9MSVRFUkFMID0gbmV3IFBzZXVkb1N0YXRlS2luZCgKLQkJCVRFUk1JTkFURSwgInRlcm1pbmF0ZSIsICJ0ZXJtaW5hdGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+UHNldWRvIFN0YXRlIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBzZXVkb1N0YXRlS2luZFtdIFZBTFVFU19BUlJBWSA9IG5ldyBQc2V1ZG9TdGF0ZUtpbmRbXSB7Ci0JCQlJTklUSUFMX0xJVEVSQUwsIEpPSU5fTElURVJBTCwgRk9SS19MSVRFUkFMLCBKVU5DVElPTl9MSVRFUkFMLAotCQkJQ0hPSUNFX0xJVEVSQUwsIEVOVFJZX1BPSU5UX0xJVEVSQUwsIEVYSVRfUE9JTlRfTElURVJBTCwKLQkJCVRFUk1JTkFURV9MSVRFUkFMLCB9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlBzZXVkbyBTdGF0ZSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMKLQkJCS5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlBzZXVkbyBTdGF0ZSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHNldWRvU3RhdGVLaW5kIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUHNldWRvU3RhdGVLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UHNldWRvIFN0YXRlIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBQc2V1ZG9TdGF0ZUtpbmQgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlQc2V1ZG9TdGF0ZUtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlBzZXVkbyBTdGF0ZSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHNldWRvU3RhdGVLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQljYXNlIElOSVRJQUw6Ci0JCQlyZXR1cm4gSU5JVElBTF9MSVRFUkFMOwotCQljYXNlIEpPSU46Ci0JCQlyZXR1cm4gSk9JTl9MSVRFUkFMOwotCQljYXNlIEZPUks6Ci0JCQlyZXR1cm4gRk9SS19MSVRFUkFMOwotCQljYXNlIEpVTkNUSU9OOgotCQkJcmV0dXJuIEpVTkNUSU9OX0xJVEVSQUw7Ci0JCWNhc2UgQ0hPSUNFOgotCQkJcmV0dXJuIENIT0lDRV9MSVRFUkFMOwotCQljYXNlIEVOVFJZX1BPSU5UOgotCQkJcmV0dXJuIEVOVFJZX1BPSU5UX0xJVEVSQUw7Ci0JCWNhc2UgRVhJVF9QT0lOVDoKLQkJCXJldHVybiBFWElUX1BPSU5UX0xJVEVSQUw7Ci0JCWNhc2UgVEVSTUlOQVRFOgotCQkJcmV0dXJuIFRFUk1JTkFURV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFBzZXVkb1N0YXRlS2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vUHNldWRvU3RhdGVLaW5kCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmVmZXJlbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkMDVhMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIDxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRSZWZlcmVuY2VkIDxlbT5SZWZlcmVuY2VkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UmVmZXJlbmNlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlZmVyZW5jZSBleHRlbmRzIERpYWdyYW1FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UmVmZXJlbmNlX0lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24gPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbihCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldFJlZmVyZW5jZSA8ZW0+UmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVmZXJlbmNlZChEaWFncmFtRWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSZWZlcmVuY2VfUmVmZXJlbmNlZCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldFJlZmVyZW5jZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0icmVmZXJlbmNlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlhZ3JhbUVsZW1lbnQgZ2V0UmVmZXJlbmNlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UjZ2V0UmVmZXJlbmNlZCA8ZW0+UmVmZXJlbmNlZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVmZXJlbmNlZChEaWFncmFtRWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gUmVmZXJlbmNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmVnaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzZDZmN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVnaW9uLmphdmEsdiAxLjQgMjAwNi8wNy8yNCAyMzozNDowOSBieHUgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVnaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFZlcnRleCA8ZW0+VmVydGV4PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbiNnZXRUcmFuc2l0aW9uIDxlbT5UcmFuc2l0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbiNnZXRTdGF0ZSA8ZW0+U3RhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFN0YXRlTWFjaGluZSA8ZW0+U3RhdGUgTWFjaGluZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJlZ2lvbigpCi0gKiBAbW9kZWwKLSAqIEBleHRlbmRzIElNb2RlbE9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlZ2lvbiBleHRlbmRzIElNb2RlbE9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVydGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXh9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4I2dldENvbnRhaW5lcl8gPGVtPkNvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJ0ZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJ0ZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UmVnaW9uX1ZlcnRleCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleCNnZXRDb250YWluZXJfCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4IiBvcHBvc2l0ZT0iY29udGFpbmVyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFZlcnRleCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJhbnNpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbn0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldENvbnRhaW5lcl8gPGVtPkNvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UcmFuc2l0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSZWdpb25fVHJhbnNpdGlvbigpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb24jZ2V0Q29udGFpbmVyXwotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb24iIG9wcG9zaXRlPSJjb250YWluZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0VHJhbnNpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhdGU8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZSNnZXRSZWdpb24gPGVtPlJlZ2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdGF0ZTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhdGU8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTdGF0ZShTdGF0ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSZWdpb25fU3RhdGUoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZSNnZXRSZWdpb24KLQkgKiBAbW9kZWwgb3Bwb3NpdGU9IlJlZ2lvbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RhdGUgZ2V0U3RhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFN0YXRlIDxlbT5TdGF0ZTwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXRlPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXRlKFN0YXRlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXRlIE1hY2hpbmU8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZU1hY2hpbmUjZ2V0UmVnaW9uIDxlbT5SZWdpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RhdGUgTWFjaGluZTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhdGUgTWFjaGluZTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFN0YXRlTWFjaGluZShTdGF0ZU1hY2hpbmUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UmVnaW9uX1N0YXRlTWFjaGluZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlTWFjaGluZSNnZXRSZWdpb24KLQkgKiBAbW9kZWwgb3Bwb3NpdGU9IlJlZ2lvbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RhdGVNYWNoaW5lIGdldFN0YXRlTWFjaGluZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24jZ2V0U3RhdGVNYWNoaW5lIDxlbT5TdGF0ZSBNYWNoaW5lPC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhdGUgTWFjaGluZTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFN0YXRlTWFjaGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhdGVNYWNoaW5lKFN0YXRlTWFjaGluZSB2YWx1ZSk7Ci0KLX0gLy8gUmVnaW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JlcG9ydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODg3ZDQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9SZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UmVwb3J0KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlcG9ydCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gUmVwb3J0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmV1c2FibGVBc3NldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JldXNhYmxlQXNzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzA4YjY0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmV1c2FibGVBc3NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFJldXNhYmxlIEFzc2V0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcKLSAqIGhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJldXNhYmxlQXNzZXQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmV1c2FibGVBc3NldCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gUmV1c2FibGVBc3NldApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvYWRtYXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2FkbWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjZTliNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvYWRtYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFJvYWRtYXAgaXMgYSBzcGVjaWFsIEd1aWRhbmNlIFR5cGUgd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4KLSAqIEFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9hZG1hcCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2FkbWFwIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBSb2FkbWFwCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTE1Nzc2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBSb2xlIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gIAotICogQSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUjZ2V0TW9kaWZpZXMgPGVtPk1vZGlmaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZSBleHRlbmRzIENvbnRlbnRFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb2RpZmllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TW9kaWZpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2RpZmllczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlX01vZGlmaWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1vZGlmaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UmVzcG9uc2libGVGb3IoKTsKLQotfSAvLyBSb2xlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZURlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2ZjliM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U2tpbGxzIDxlbT5Ta2lsbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldFN5bm9ueW1zIDxlbT5TeW5vbnltczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNraWxsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIExpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2tpbGxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTa2lsbHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNraWxscygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U2tpbGxzIDxlbT5Ta2lsbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNraWxsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2tpbGxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTa2lsbHMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBc3NpZ25tZW50QXBwcm9hY2hlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN5bm9ueW1zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogTGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN5bm9ueW1zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTeW5vbnltcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTeW5vbnltcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TeW5vbnltczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3lub255bXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN5bm9ueW1zKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUm9sZURlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjgyOTRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFJvbGUgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldE1vZGlmaWVzIDxlbT5Nb2RpZmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZURlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJvbGUoUm9sZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZSBnZXRSb2xlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUgPGVtPlJvbGU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJvbGUoUm9sZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb2RpZmllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1vZGlmaWVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW9kaWZpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0b3JfTW9kaWZpZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1vZGlmaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UmVzcG9uc2libGVGb3IoKTsKLQotfSAvLyBSb2xlRGVzY3JpcHRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVTZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlNmE5NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBTZXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFJvbGUgU2V0IG9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICJBbmFseXN0cyIgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICJCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QiLCAiU3lzdGVtIEFuYWx5c3QiLCBhcyB3ZWxsIGFzICJSZXF1aXJlbWVudHMgU3BlY2lmaWVyIiByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0I2dldFJvbGVzIDxlbT5Sb2xlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZVNldCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9sZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0X1JvbGVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSb2xlcygpOwotCi19IC8vIFJvbGVTZXQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlU2V0R3JvdXBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlU2V0R3JvdXBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2ZlMjlhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZVNldEdyb3VwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgU2V0IEdyb3VwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUm9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nI2dldFJvbGVTZXRzIDxlbT5Sb2xlIFNldHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0R3JvdXBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZVNldEdyb3VwaW5nIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlIFNldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9sZSBTZXRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZSBTZXRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldCIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0Um9sZVNldHMoKTsKLQotfSAvLyBSb2xlU2V0R3JvdXBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZTdjYjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBTZWN0aW9uIGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbkRlc2NyaXB0aW9uIDxlbT5TZWN0aW9uIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbnMgPGVtPlN1YiBTZWN0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VjdGlvbiBleHRlbmRzIFZhcmlhYmlsaXR5RWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlY3Rpb25OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZWN0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25OYW1lIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlY3Rpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlY3Rpb25OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN0aW9uIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN0aW9uIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZWN0aW9uRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uRGVzY3JpcHRpb24gPGVtPlNlY3Rpb24gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlY3Rpb24gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VjdGlvbkRlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgU2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIFNlY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFNlY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fU3ViU2VjdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U3ViU2VjdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlZGVjZXNzb3IoU2VjdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VjdGlvbiBnZXRQcmVkZWNlc3NvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVkZWNlc3NvcihTZWN0aW9uIHZhbHVlKTsKLQotfSAvLyBTZWN0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1NlbWFudGljTW9kZWxCcmlkZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDQxNjBlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXREaWFncmFtIDxlbT5EaWFncmFtPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VtYW50aWNNb2RlbEJyaWRnZSBleHRlbmRzIERpYWdyYW1FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVzZW50YXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFNlbWFudGljTW9kZWxCcmlkZ2VfUHJlc2VudGF0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRTZW1hbnRpY01vZGVsIDxlbT5TZW1hbnRpYyBNb2RlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0dyYXBoRWxlbWVudCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRTZW1hbnRpY01vZGVsCi0JICogQG1vZGVsIG9wcG9zaXRlPSJzZW1hbnRpY01vZGVsIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHcmFwaEVsZW1lbnQgZ2V0R3JhcGhFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEdyYXBoRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXROYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaWFncmFtPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaWFncmFtPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RGlhZ3JhbShEaWFncmFtKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFNlbWFudGljTW9kZWxCcmlkZ2VfRGlhZ3JhbSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlCi0JICogQG1vZGVsIG9wcG9zaXRlPSJuYW1lc3BhY2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURpYWdyYW0gZ2V0RGlhZ3JhbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaWFncmFtPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGlhZ3JhbShEaWFncmFtIHZhbHVlKTsKLQotfSAvLyBTZW1hbnRpY01vZGVsQnJpZGdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYzdiMzBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCNnZXRUeXBlSW5mbyA8ZW0+VHlwZSBJbmZvPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgZXh0ZW5kcyBTZW1hbnRpY01vZGVsQnJpZGdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIEluZm88L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBJbmZvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlSW5mbyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfVHlwZUluZm8oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGVJbmZvKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50I2dldFR5cGVJbmZvIDxlbT5UeXBlIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgSW5mbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZUluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGVJbmZvKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TdGF0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1N0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyZGY4OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1N0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFN0YXRlLmphdmEsdiAxLjMgMjAwNi8wNy8yNCAyMzozNDowOCBieHUgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0YXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGUjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZSNnZXRSZWdpb24gPGVtPlJlZ2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZSNnZXRTdWJtYWNoaW5lIDxlbT5TdWJtYWNoaW5lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U3RhdGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdGUgZXh0ZW5kcyBWZXJ0ZXggewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFN0YXRlX1dvcmtQcm9kdWN0KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWdpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbn0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24jZ2V0U3RhdGUgPGVtPlN0YXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZ2lvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZ2lvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTdGF0ZV9SZWdpb24oKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24jZ2V0U3RhdGUKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24iIG9wcG9zaXRlPSJTdGF0ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSZWdpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1Ym1hY2hpbmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1Ym1hY2hpbmU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VibWFjaGluZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3VibWFjaGluZShTdGF0ZU1hY2hpbmUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U3RhdGVfU3VibWFjaGluZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0YXRlTWFjaGluZSBnZXRTdWJtYWNoaW5lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlI2dldFN1Ym1hY2hpbmUgPGVtPlN1Ym1hY2hpbmU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1Ym1hY2hpbmU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFN1Ym1hY2hpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1Ym1hY2hpbmUoU3RhdGVNYWNoaW5lIHZhbHVlKTsKLQotfSAvLyBTdGF0ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TdGF0ZU1hY2hpbmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TdGF0ZU1hY2hpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTI2NTBiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU3RhdGVNYWNoaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0YXRlIE1hY2hpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZU1hY2hpbmUjZ2V0UmVnaW9uIDxlbT5SZWdpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTdGF0ZU1hY2hpbmUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdGVNYWNoaW5lIGV4dGVuZHMgV29ya0RlZmluaXRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZ2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9ufS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbiNnZXRTdGF0ZU1hY2hpbmUgPGVtPlN0YXRlIE1hY2hpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVnaW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVnaW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFN0YXRlTWFjaGluZV9SZWdpb24oKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24jZ2V0U3RhdGVNYWNoaW5lCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uIiBvcHBvc2l0ZT0iU3RhdGVNYWNoaW5lIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSZWdpb24oKTsKLQotfSAvLyBTdGF0ZU1hY2hpbmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU3RlcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1N0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTNiNWEyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RlcDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgU3RlcCBpcyBhIFNlY3Rpb24gYW5kIFdvcmsgRGVmaW5pdGlvbiB0aGF0IGlzIHVzZWQgdG8gb3JnYW5pemUgVGFza3MgaW50byBwYXJ0cyBvciBzdWJ1bml0cyBvZiB3b3JrLiAgU3RlcHMgaW5oZXJpdCB0aGUgc3ViU2VjdGlvbnMgZGVjb21wb3NpdGlvbiBmcm9tIFNlY3Rpb24gYW5kIGNhbiB0aGVyZWZvcmUgZGVzY3JpYmUgU3ViLVN0ZXBzIG5lc3RlZCBpbnRvIFN0ZXBzLgotICogQSBTdGVwIGRlc2NyaWJlcyBhIG1lYW5pbmdmdWwgYW5kIGNvbnNpc3QgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSBUYXNrLiAgVGhlIGNvbGxlY3Rpb24gb2YgU3RlcHMgZGVmaW5lZCBmb3IgYSBUYXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFsbCBkZXZlbG9wbWVudCBnb2FsIG9mIHRoZSBUYXNrLiAgTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkIGVhY2ggdGltZSBhIFRhc2sgaXMgaW52b2tlZCBpbiBhIFByb2Nlc3MgKHNlZSBUYXNrIERlc2NyaXB0b3IpLCBzbyB0aGV5IGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBpbiB0aGUgZm9ybSBvZiBhbHRlcm5hdGUgJ2Zsb3dzJyBvZiB3b3JrLiAgRGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lIGRldmVsb3BtZW50IGdvYWwgY2FuIHRoZW4gYmUgJ2Fzc2VtYmxlZCcgYnkgc2VsZWN0aW5nIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2Ygc3RlcHMgd2hlbiBhcHBseWluZyB0aGUgVGFzayBpbiBhIFByb2Nlc3MuICBUeXBpY2FsIGtpbmRzIG9mIHN0ZXBzIGEgVGFzayBhdXRob3Igc2hvdWxkIGNvbnNpZGVyIGFyZTogVGhpbmtpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIHVuZGVyc3RhbmQgdGhlIG5hdHVyZSBvZiB0aGUgdGFzaywgZ2F0aGVycyBhbmQgZXhhbWluZXMgdGhlIGlucHV0IGFydGlmYWN0cywgYW5kIGZvcm11bGF0ZXMgdGhlIG91dGNvbWUuIFBlcmZvcm1pbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGNyZWF0ZSBvciB1cGRhdGUgc29tZSBhcnRpZmFjdHMuIFJldmlld2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgaW5zcGVjdHMgdGhlIHJlc3VsdHMgYWdhaW5zdCBzb21lIGNyaXRlcmlhLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTdGVwKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0ZXAgZXh0ZW5kcyBTZWN0aW9uLCBXb3JrRGVmaW5pdGlvbiB7Ci19IC8vIFN0ZXAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TdXBwb3J0aW5nTWF0ZXJpYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TdXBwb3J0aW5nTWF0ZXJpYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODYxMmEzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU3VwcG9ydGluZ01hdGVyaWFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogU3VwcG9ydGluZyBNYXRlcmlhbHMgaXMgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN1cHBvcnRpbmdNYXRlcmlhbCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gU3VwcG9ydGluZ01hdGVyaWFsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGFzay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzkzNGFkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgVGFzayBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLgotICogQSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gCi0gKiBBIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAKLSAqIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCIgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAibWV0aG9kIiBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFBlcmZvcm1lZEJ5IDxlbT5QZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0U3RlcHMgPGVtPlN0ZXBzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2soKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFzayBleHRlbmRzIENvbnRlbnRFbGVtZW50LCBXb3JrRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgQnk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyZm9ybWVkIEJ5PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQZXJmb3JtZWRCeShSb2xlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfUGVyZm9ybWVkQnkoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlIGdldFBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0UGVyZm9ybWVkQnkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyZm9ybWVkIEJ5PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQZXJmb3JtZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyZm9ybWVkQnkoUm9sZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrX01hbmRhdG9yeUlucHV0KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3V0cHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0cHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfT3V0cHV0KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0T3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrX09wdGlvbmFsSW5wdXQoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRPcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGVwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdGVwczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0ZXBzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfU3RlcHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXAiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTdGVwcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrX1Rvb2xNZW50b3JzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRUb29sTWVudG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi19IC8vIFRhc2sKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UYXNrRGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UYXNrRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWMzNTYzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGFza0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2tEZXNjcmlwdGlvbiBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHVycG9zZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1cnBvc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1cnBvc2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFsdGVybmF0aXZlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsdGVybmF0aXZlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBUYXNrRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UYXNrRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2tEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiNDAxYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2tEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFRhc2sgRGVzY3JpcHRvciBpcyBhIERlc2NyaXB0b3IgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLSAqIEEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRUYXNrIDxlbT5UYXNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFzc2lzdGVkQnkgPGVtPkFzc2lzdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEV4dGVybmFsSW5wdXQgPGVtPkV4dGVybmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE1hbmRhdG9yeUlucHV0IDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3B0aW9uYWxJbnB1dCA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0U2VsZWN0ZWRTdGVwcyA8ZW0+U2VsZWN0ZWQgU3RlcHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrRGVzY3JpcHRvciBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50LCBEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXNrPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXNrPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFRhc2soVGFzaykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFzayBnZXRUYXNrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhc2soVGFzayB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3Npc3RlZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXNzaXN0ZWQgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3Npc3RlZCBCeTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0QXNzaXN0ZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RXh0ZXJuYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1hbmRhdG9yeUlucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRPcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PdXRwdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE91dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQZXJmb3JtZWRQcmltYXJpbHlCeShSb2xlRGVzY3JpcHRvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGVEZXNjcmlwdG9yIGdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoUm9sZURlc2NyaXB0b3IgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VsZWN0ZWQgU3RlcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VsZWN0ZWQgU3RlcHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWxlY3RlZCBTdGVwczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTZWxlY3RlZFN0ZXBzKCk7Ci0KLX0gLy8gVGFza0Rlc2NyaXB0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZWFtUHJvZmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1RlYW1Qcm9maWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4ODMzZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1RlYW1Qcm9maWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZWFtIFByb2ZpbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuCi0gKiBXb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuCi0gKiBIZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRUZWFtUm9sZXMgPGVtPlRlYW0gUm9sZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3VwZXJUZWFtIDxlbT5TdXBlciBUZWFtPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0gPGVtPlN1YiBUZWFtPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGVhbVByb2ZpbGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVhbVByb2ZpbGUgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZWFtIFJvbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZWFtIFJvbGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVhbSBSb2xlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRUZWFtUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0gPGVtPlN1YiBUZWFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cGVyIFRlYW08L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwZXIgVGVhbTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3VwZXJUZWFtKFRlYW1Qcm9maWxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0KLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InN1YlRlYW0iIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUZWFtUHJvZmlsZSBnZXRTdXBlclRlYW0oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3VwZXJUZWFtIDxlbT5TdXBlciBUZWFtPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBUZWFtPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTdXBlclRlYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1cGVyVGVhbShUZWFtUHJvZmlsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgVGVhbTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGV9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3VwZXJUZWFtIDxlbT5TdXBlciBUZWFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YiBUZWFtPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFRlYW08L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlIiBvcHBvc2l0ZT0ic3VwZXJUZWFtIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTdWJUZWFtKCk7Ci0KLX0gLy8gVGVhbVByb2ZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZW1wbGF0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1RlbXBsYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwYWRjNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1RlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgVGVtcGxhdGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRlbXBsYXRlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlbXBsYXRlIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBUZW1wbGF0ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rlcm1EZWZpbml0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGVybURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzczZWRjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGVybURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlcm0gRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRlcm1EZWZpbml0aW9ucyBkZWZpbmUgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGhleSBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGVybURlZmluaXRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVybURlZmluaXRpb24gZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFRlcm1EZWZpbml0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGV4dEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZXh0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMDQxODM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZXh0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGV4dCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQjZ2V0VGV4dCA8ZW0+VGV4dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRleHRFbGVtZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRleHRFbGVtZW50IGV4dGVuZHMgTGVhZkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZXh0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRleHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRleHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRleHRFbGVtZW50X1RleHQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRleHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQjZ2V0VGV4dCA8ZW0+VGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGV4dChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFRleHRFbGVtZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVG9vbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTc1YTA5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ub29sPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBUb29sIGlzIGEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sI2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUb29sKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRvb2wgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VG9vbF9Ub29sTWVudG9ycygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvciIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0VG9vbE1lbnRvcnMoKTsKLQotfSAvLyBUb29sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVG9vbE1lbnRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rvb2xNZW50b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGY2ZTk1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVG9vbE1lbnRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFRvb2wgTWVudG9yIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VG9vbE1lbnRvcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUb29sTWVudG9yIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBUb29sTWVudG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVHJhbnNpdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1RyYW5zaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2U4ZjFlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVHJhbnNpdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVHJhbnNpdGlvbi5qYXZhLHYgMS4zIDIwMDYvMDcvMjQgMjM6MzQ6MDggYnh1IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRyYW5zaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldFdvcmtEZWZpbml0aW9uIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VHJhbnNpdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBleHRlbmRzIElNb2RlbE9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyYW5zaXRpb24gZXh0ZW5kcyBJTW9kZWxPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgRGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRyYW5zaXRpb25fV29ya0RlZmluaXRpb24oKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0V29ya0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbiNnZXRUcmFuc2l0aW9uIDxlbT5UcmFuc2l0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRhaW5lcjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVyPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29udGFpbmVyKFJlZ2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUcmFuc2l0aW9uX0NvbnRhaW5lcigpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbiNnZXRUcmFuc2l0aW9uCi0JICogQG1vZGVsIG9wcG9zaXRlPSJUcmFuc2l0aW9uIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVnaW9uIGdldENvbnRhaW5lcl8oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZXI8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb250YWluZXJfKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb250YWluZXIoUmVnaW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4I2dldE91dGdvaW5nIDxlbT5PdXRnb2luZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb3VyY2U8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTb3VyY2UoVmVydGV4KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRyYW5zaXRpb25fU291cmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4I2dldE91dGdvaW5nCi0JICogQG1vZGVsIG9wcG9zaXRlPSJvdXRnb2luZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZlcnRleCBnZXRTb3VyY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNvdXJjZShWZXJ0ZXggdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXgjZ2V0SW5jb21pbmcgPGVtPkluY29taW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhcmdldDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFRhcmdldChWZXJ0ZXgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VHJhbnNpdGlvbl9UYXJnZXQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXgjZ2V0SW5jb21pbmcKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImluY29taW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmVydGV4IGdldFRhcmdldCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRhcmdldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFyZ2V0KFZlcnRleCB2YWx1ZSk7Ci0KLX0gLy8gVHJhbnNpdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYTNjZWFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVU1MIDIuMCBtZXRhLWNsYXNzIFR5cGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFR5cGUoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGUgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnQgewotfSAvLyBUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDFhODk1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBleHRlbmRzIFNlbWFudGljTW9kZWxCcmlkZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RWxlbWVudChNZXRob2RFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVsZW1lbnQoTWV0aG9kRWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gVU1BU2VtYW50aWNNb2RlbEJyaWRnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1VtYUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VbWFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0ODhjZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1VtYUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVtYUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhY2thZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCW9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSBjcmVhdGVQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnN0cmFpbnQgY3JlYXRlQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudERlc2NyaXB0aW9uIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZSBjcmVhdGVSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2sgY3JlYXRlVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdGVwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdGVwPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdGVwIGNyZWF0ZVN0ZXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcnRpZmFjdCBjcmVhdGVBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlbGl2ZXJhYmxlIGNyZWF0ZURlbGl2ZXJhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGNvbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGNvbWU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGNvbWUgY3JlYXRlT3V0Y29tZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcnRpZmFjdERlc2NyaXB0aW9uIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0RGVzY3JpcHRpb24gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlbGl2ZXJhYmxlRGVzY3JpcHRpb24gY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlRGVzY3JpcHRpb24gY3JlYXRlUm9sZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2tEZXNjcmlwdGlvbiBjcmVhdGVUYXNrRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHdWlkYW5jZURlc2NyaXB0aW9uIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcmFjdGljZURlc2NyaXB0aW9uIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9pbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvaW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQb2ludCBjcmVhdGVQb2ludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaWFncmFtIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpYWdyYW0gTGluazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlhZ3JhbUxpbmsgY3JlYXRlRGlhZ3JhbUxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUdyYXBoQ29ubmVjdG9yIGNyZWF0ZUdyYXBoQ29ubmVjdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpbWVuc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGltZW5zaW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaW1lbnNpb24gY3JlYXRlRGltZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlZmVyZW5jZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVmZXJlbmNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZWZlcmVuY2UgY3JlYXRlUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvcGVydHkgY3JlYXRlUHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JhcGggRWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JhcGggRWRnZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3JhcGhFZGdlIGNyZWF0ZUdyYXBoRWRnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaWFncmFtIGNyZWF0ZURpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JhcGggTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JhcGggTm9kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3JhcGhOb2RlIGNyZWF0ZUdyYXBoTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIGNyZWF0ZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRleHQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGV4dCBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUZXh0RWxlbWVudCBjcmVhdGVUZXh0RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbWFnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW1hZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUltYWdlIGNyZWF0ZUltYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvbHlsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb2x5bGluZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9seWxpbmUgY3JlYXRlUG9seWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxsaXBzZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxsaXBzZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWxsaXBzZSBjcmVhdGVFbGxpcHNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NaWxlc3RvbmU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1pbGVzdG9uZSBjcmVhdGVNaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUl0ZXJhdGlvbiBjcmVhdGVJdGVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGhhc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQaGFzZSBjcmVhdGVQaGFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVhbVByb2ZpbGUgY3JlYXRlVGVhbVByb2ZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtPcmRlciBjcmVhdGVXb3JrT3JkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGxhbm5pbmdEYXRhIGNyZWF0ZVBsYW5uaW5nRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFza0Rlc2NyaXB0b3IgY3JlYXRlVGFza0Rlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29tcG9zaXRlUm9sZSBjcmVhdGVDb21wb3NpdGVSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2aXR5RGVzY3JpcHRpb24gY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzRGVzY3JpcHRpb24gY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlc2NyaXB0b3JEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29uY2VwdCBjcmVhdGVDb25jZXB0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDaGVja2xpc3QgY3JlYXRlQ2hlY2tsaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4YW1wbGUgY3JlYXRlRXhhbXBsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3VpZGVsaW5lIGNyZWF0ZUd1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXBvcnQgY3JlYXRlUmVwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3VwcG9ydGluZ01hdGVyaWFsIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRvb2xNZW50b3IgY3JlYXRlVG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXaGl0ZXBhcGVyIGNyZWF0ZVdoaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRlcm1EZWZpbml0aW9uIGNyZWF0ZVRlcm1EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJhY3RpY2UgY3JlYXRlUHJhY3RpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXVzYWJsZUFzc2V0IGNyZWF0ZVJldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3RhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN0YXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdGF0ZSBjcmVhdGVTdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WZXJ0ZXg8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZlcnRleDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmVydGV4IGNyZWF0ZVZlcnRleCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZWdpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlZ2lvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVnaW9uIGNyZWF0ZVJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdGF0ZSBNYWNoaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdGF0ZSBNYWNoaW5lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdGF0ZU1hY2hpbmUgY3JlYXRlU3RhdGVNYWNoaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRyYW5zaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRyYW5zaXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRyYW5zaXRpb24gY3JlYXRlVHJhbnNpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qc2V1ZG8gU3RhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBzZXVkbyBTdGF0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHNldWRvU3RhdGUgY3JlYXRlUHNldWRvU3RhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlzY2lwbGluZSBjcmVhdGVEaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZVNldCBjcmVhdGVSb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb21haW4gY3JlYXRlRG9tYWluKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3RUeXBlIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaXNjaXBsaW5lR3JvdXBpbmcgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2w8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2w8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRvb2wgY3JlYXRlVG9vbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGVTZXRHcm91cGluZyBjcmVhdGVSb2xlU2V0R3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUN1c3RvbUNhdGVnb3J5IGNyZWF0ZUN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlbGl2ZXJ5UHJvY2VzcyBjcmVhdGVEZWxpdmVyeVByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNhcGFiaWxpdHlQYXR0ZXJuIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvYWRtYXAgY3JlYXRlUm9hZG1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NDb21wb25lbnQgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc1BhY2thZ2UgY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0ZhbWlseSBjcmVhdGVQcm9jZXNzRmFtaWx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVtYVBhY2thZ2UgZ2V0VW1hUGFja2FnZSgpOwotCi19IC8vVW1hRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1VtYVBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VbWFQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkOTUwNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1VtYVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAwMwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVtYVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAidW1hIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5lcGYudW1hIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVW1hUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxlbWVudEltcGwgPGVtPkVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVMRU1FTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE5hbWVkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOQU1FRF9FTEVNRU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRURfRUxFTUVOVF9fTkFNRSA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TmFtZWQgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UGFja2FnZWFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBBQ0tBR0VBQkxFX0VMRU1FTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FID0gTkFNRURfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IE5BTUVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UeXBlSW1wbCA8ZW0+VHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFlQRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRZUEVfX05BTUUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVFlQRV9GRUFUVVJFX0NPVU5UID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNsYXNzaWZpZXJJbXBsIDxlbT5DbGFzc2lmaWVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNsYXNzaWZpZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2xhc3NpZmllcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDTEFTU0lGSUVSID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0xBU1NJRklFUl9fTkFNRSA9IFRZUEVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2xhc3NpZmllcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTEFTU0lGSUVSX0ZFQVRVUkVfQ09VTlQgPSBUWVBFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZXNwYWNlSW1wbCA8ZW0+TmFtZXNwYWNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVzcGFjZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXROYW1lc3BhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTkFNRVNQQUNFID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRVNQQUNFX19OQU1FID0gTkFNRURfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5OYW1lc3BhY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRVNQQUNFX0ZFQVRVUkVfQ09VTlQgPSBOQU1FRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGFja2FnZUltcGwgPGVtPlBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGFja2FnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBBQ0tBR0UgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQUNLQUdFX19OQU1FID0gTkFNRVNQQUNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFDS0FHRV9GRUFUVVJFX0NPVU5UID0gTkFNRVNQQUNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19OQU1FID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0dVSUQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnN0cmFpbnRJbXBsIDxlbT5Db25zdHJhaW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnN0cmFpbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05TVFJBSU5UID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19HVUlEID0gTUVUSE9EX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fT1dORURfUlVMRVMgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Cb2R5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fQk9EWSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsIDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX05BTUUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9GRUFUVVJFX0NPVU5UID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fR1VJRCA9IE1FVEhPRF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVmFyaWFiaWxpdHlFbGVtZW50SW1wbCA8ZW0+VmFyaWFiaWxpdHkgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WYXJpYWJpbGl0eUVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlQgPSAxMTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwgPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlQgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19OQU1FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19HVUlEID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFUyA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVMgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwgPGVtPk1ldGhvZCBVbml0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVCA9IDExMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX0dVSUQgPSBNRVRIT0RfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX09XTkVEX1JVTEVTID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19BVVRIT1JTID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19WRVJTSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT04gPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRSA9IE1FVEhPRF9VTklUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19HVUlEID0gTUVUSE9EX1VOSVRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBNRVRIT0RfVU5JVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUyA9IE1FVEhPRF9VTklUX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTiA9IE1FVEhPRF9VTklUX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9FTEVNRU5UX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX0dVSUQgPSBNRVRIT0RfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9FTEVNRU5UX19PV05FRF9SVUxFUyA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwgPGVtPlNlY3Rpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFQ1RJT04gPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fTkFNRSA9IFZBUklBQklMSVRZX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0dVSUQgPSBWQVJJQUJJTElUWV9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBWQVJJQUJJTElUWV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fT1dORURfUlVMRVMgPSBWQVJJQUJJTElUWV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBWQVJJQUJJTElUWV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fU1VQUFJFU1NFRCA9IFZBUklBQklMSVRZX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19PUkRFUklOR19HVUlERSA9IFZBUklBQklMSVRZX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fU0VDVElPTl9OQU1FID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTiA9IFZBUklBQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIFNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19TVUJfU0VDVElPTlMgPSBWQVJJQUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fUFJFREVDRVNTT1IgPSBWQVJJQUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlY3Rpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9GRUFUVVJFX0NPVU5UID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsIDxlbT5Sb2xlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0dVSUQgPSBDT05URU5UX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19DSEVDS0xJU1RTID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0dVSURFTElORVMgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0VYQU1QTEVTID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0FTU0VUUyA9IENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19NT0RJRklFUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1JFU1BPTlNJQkxFX0ZPUiA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCA8ZW0+V29yayBQcm9kdWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVCA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fR1VJRCA9IENPTlRFTlRfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19DSEVDS0xJU1RTID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FUyA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19FWEFNUExFUyA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0FTU0VUUyA9IENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fUkVQT1JUUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVEVNUExBVEVTID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19UT09MX01FTlRPUlMgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsIDxlbT5UYXNrPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0dVSUQgPSBDT05URU5UX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DSEVDS0xJU1RTID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0dVSURFTElORVMgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VYQU1QTEVTID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FTU0VUUyA9IENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRUNPTkRJVElPTiA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUE9TVENPTkRJVElPTiA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QRVJGT1JNRURfQlkgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19NQU5EQVRPUllfSU5QVVQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVVRQVVQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1BUSU9OQUxfSU5QVVQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RlcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NURVBTID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVE9PTF9NRU5UT1JTID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya0RlZmluaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX0dVSUQgPSBNRVRIT0RfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fT1dORURfUlVMRVMgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsIDxlbT5TdGVwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3RlcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVEVQID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX05BTUUgPSBTRUNUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19HVUlEID0gU0VDVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX0JSSUVGX0RFU0NSSVBUSU9OID0gU0VDVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX09XTkVEX1JVTEVTID0gU0VDVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gU0VDVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1NVUFBSRVNTRUQgPSBTRUNUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fT1JERVJJTkdfR1VJREUgPSBTRUNUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fVkFSSUFCSUxJVFlfVFlQRSA9IFNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBTRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1NFQ1RJT05fTkFNRSA9IFNFQ1RJT05fX1NFQ1RJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fU0VDVElPTl9ERVNDUklQVElPTiA9IFNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIFNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19TVUJfU0VDVElPTlMgPSBTRUNUSU9OX19TVUJfU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19QUkVERUNFU1NPUiA9IFNFQ1RJT05fX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1BSRUNPTkRJVElPTiA9IFNFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1BPU1RDT05ESVRJT04gPSBTRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlN0ZXA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9GRUFUVVJFX0NPVU5UID0gU0VDVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlSW1wbCA8ZW0+R3VpZGFuY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGFuY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0UgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19HVUlEID0gQ09OVEVOVF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1NVUFBSRVNTRUQgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19DSEVDS0xJU1RTID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19HVUlERUxJTkVTID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fRVhBTVBMRVMgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0FTU0VUUyA9IENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkd1aWRhbmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdEltcGwgPGVtPkFydGlmYWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFSVElGQUNUID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19OQU1FID0gV09SS19QUk9EVUNUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fR1VJRCA9IFdPUktfUFJPRFVDVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19PV05FRF9SVUxFUyA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1BSRVNFTlRBVElPTiA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19OT0RFSUNPTiA9IFdPUktfUFJPRFVDVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IFdPUktfUFJPRFVDVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fQ0hFQ0tMSVNUUyA9IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fR1VJREVMSU5FUyA9IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0VYQU1QTEVTID0gV09SS19QUk9EVUNUX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19BU1NFVFMgPSBXT1JLX1BST0RVQ1RfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fUkVQT1JUUyA9IFdPUktfUFJPRFVDVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19URU1QTEFURVMgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19UT09MX01FTlRPUlMgPSBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXIgQXJ0aWZhY3Q8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQgQXJ0aWZhY3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUyA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcnRpZmFjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVJbXBsIDxlbT5EZWxpdmVyYWJsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUxJVkVSQUJMRSA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fTkFNRSA9IFdPUktfUFJPRFVDVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0dVSUQgPSBXT1JLX1BST0RVQ1RfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fT1dORURfUlVMRVMgPSBXT1JLX1BST0RVQ1RfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX1BST0RVQ1RfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fU1VQUFJFU1NFRCA9IFdPUktfUFJPRFVDVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19QUkVTRU5UQVRJT04gPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fU0hBUEVJQ09OID0gV09SS19QUk9EVUNUX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fTk9ERUlDT04gPSBXT1JLX1BST0RVQ1RfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVkFSSUFCSUxJVFlfVFlQRSA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IFdPUktfUFJPRFVDVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBXT1JLX1BST0RVQ1RfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0NIRUNLTElTVFMgPSBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0dVSURFTElORVMgPSBXT1JLX1BST0RVQ1RfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19FWEFNUExFUyA9IFdPUktfUFJPRFVDVF9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQVNTRVRTID0gV09SS19QUk9EVUNUX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1JFUE9SVFMgPSBXT1JLX1BST0RVQ1RfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVEVNUExBVEVTID0gV09SS19QUk9EVUNUX19URU1QTEFURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVE9PTF9NRU5UT1JTID0gV09SS19QUk9EVUNUX19UT09MX01FTlRPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUyA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuT3V0Y29tZUltcGwgPGVtPk91dGNvbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuT3V0Y29tZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRPdXRjb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9VVENPTUUgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fTkFNRSA9IFdPUktfUFJPRFVDVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fR1VJRCA9IFdPUktfUFJPRFVDVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fT1dORURfUlVMRVMgPSBXT1JLX1BST0RVQ1RfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fUFJFU0VOVEFUSU9OID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fU0hBUEVJQ09OID0gV09SS19QUk9EVUNUX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19OT0RFSUNPTiA9IFdPUktfUFJPRFVDVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19DT05DRVBUU19BTkRfUEFQRVJTID0gV09SS19QUk9EVUNUX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0NIRUNLTElTVFMgPSBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fR1VJREVMSU5FUyA9IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fRVhBTVBMRVMgPSBXT1JLX1BST0RVQ1RfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fQVNTRVRTID0gV09SS19QUk9EVUNUX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fUkVQT1JUUyA9IFdPUktfUFJPRFVDVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1RFTVBMQVRFUyA9IFdPUktfUFJPRFVDVF9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fVE9PTF9NRU5UT1JTID0gV09SS19QUk9EVUNUX19UT09MX01FTlRPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5PdXRjb21lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfRkVBVFVSRV9DT1VOVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0UgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0dVSUQgPSBNRVRIT0RfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX09XTkVEX1JVTEVTID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUyA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoaWxkIFBhY2thZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwgPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50UGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0UgPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19OQU1FID0gTUVUSE9EX1BBQ0tBR0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fR1VJRCA9IE1FVEhPRF9QQUNLQUdFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19PV05FRF9SVUxFUyA9IE1FVEhPRF9QQUNLQUdFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19TVVBQUkVTU0VEID0gTUVUSE9EX1BBQ0tBR0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fR0xPQkFMID0gTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTID0gTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGlsZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUyA9IE1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTiA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0dVSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCA8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19OQU1FID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fR1VJRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUFVSUE9TRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIE91dGxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT04gPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX05BTUUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19HVUlEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQVVUSE9SUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fVkVSU0lPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnaW5nIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT04gPSAyODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0dVSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ta2lsbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19TS0lMTFMgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3lub255bXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbCA8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGFza0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT04gPSAyOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0dVSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbCA8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0dVSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0YWNobWVudHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFMgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTiA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HVUlEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQVVUSE9SUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fVkVSU0lPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWwgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk8gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2JsZW08L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTSA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hb2FsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9pbnRJbXBsIDxlbT5Qb2ludDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2ludEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQT0lOVCA9IDMyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0lOVF9fWCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPSU5UX19ZID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qb2ludDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0lOVF9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1FbGVtZW50SW1wbCA8ZW0+RGlhZ3JhbSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1FbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpYWdyYW1FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVCA9IDM0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19HVUlEID0gTUVUSE9EX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0UgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpYWdyYW0gRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFbGVtZW50SW1wbCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlQgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fR1VJRCA9IERJQUdSQU1fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gRElBR1JBTV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBESUFHUkFNX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBESUFHUkFNX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IERJQUdSQU1fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX0lTX1ZJU0lCTEUgPSBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FUiA9IERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fUkVGRVJFTkNFID0gRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3NpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX0xJTksgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5jaG9yYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VtYW50aWMgTW9kZWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1MaW5rSW1wbCA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1MaW5rSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpYWdyYW1MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJQUdSQU1fTElOSyA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fR1VJRCA9IERJQUdSQU1fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fQlJJRUZfREVTQ1JJUFRJT04gPSBESUFHUkFNX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX09XTkVEX1JVTEVTID0gRElBR1JBTV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fU1VQUFJFU1NFRCA9IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fT1JERVJJTkdfR1VJREUgPSBESUFHUkFNX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX0lTX1ZJU0lCTEUgPSBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fQ09OVEFJTkVSID0gRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX1JFRkVSRU5DRSA9IERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5ab29tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19aT09NID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZpZXdwb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19WSUVXUE9SVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19ESUFHUkFNID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpYWdyYW0gTGluazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfRkVBVFVSRV9DT1VOVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoQ29ubmVjdG9ySW1wbCA8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoQ29ubmVjdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoQ29ubmVjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUiA9IDM2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX05BTUUgPSBHUkFQSF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0dVSUQgPSBHUkFQSF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19CUklFRl9ERVNDUklQVElPTiA9IEdSQVBIX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX09XTkVEX1JVTEVTID0gR1JBUEhfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHUkFQSF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19TVVBQUkVTU0VEID0gR1JBUEhfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fT1JERVJJTkdfR1VJREUgPSBHUkFQSF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19JU19WSVNJQkxFID0gR1JBUEhfRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19DT05UQUlORVIgPSBHUkFQSF9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX1JFRkVSRU5DRSA9IEdSQVBIX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19QUk9QRVJUWSA9IEdSQVBIX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc2l0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19QT1NJVElPTiA9IEdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19DT05UQUlORUQgPSBHUkFQSF9FTEVNRU5UX19DT05UQUlORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19MSU5LID0gR1JBUEhfRUxFTUVOVF9fTElOSzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbmNob3JhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fQU5DSE9SQUdFID0gR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlbWFudGljIE1vZGVsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19TRU1BTlRJQ19NT0RFTCA9IEdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFZGdlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0UgPSBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfRkVBVFVSRV9DT1VOVCA9IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZW1hbnRpY01vZGVsQnJpZGdlSW1wbCA8ZW0+U2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0UgPSAzNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19OQU1FID0gRElBR1JBTV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dVSUQgPSBESUFHUkFNX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gRElBR1JBTV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19PV05FRF9SVUxFUyA9IERJQUdSQU1fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1NVUFBSRVNTRUQgPSBESUFHUkFNX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX09SREVSSU5HX0dVSURFID0gRElBR1JBTV9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19JU19WSVNJQkxFID0gRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0NPTlRBSU5FUiA9IERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19SRUZFUkVOQ0UgPSBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT04gPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0gPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGltZW5zaW9uSW1wbCA8ZW0+RGltZW5zaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpbWVuc2lvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaW1lbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRElNRU5TSU9OID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESU1FTlNJT05fX1dJRFRIID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESU1FTlNJT05fX0hFSUdIVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGltZW5zaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJTUVOU0lPTl9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZmVyZW5jZUltcGwgPGVtPlJlZmVyZW5jZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWZlcmVuY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFRkVSRU5DRSA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fR1VJRCA9IERJQUdSQU1fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBESUFHUkFNX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX09XTkVEX1JVTEVTID0gRElBR1JBTV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fU1VQUFJFU1NFRCA9IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fT1JERVJJTkdfR1VJREUgPSBESUFHUkFNX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX0lTX1ZJU0lCTEUgPSBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fQ09OVEFJTkVSID0gRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX1JFRkVSRU5DRSA9IERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX1JFRkVSRU5DRUQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVmZXJlbmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9GRUFUVVJFX0NPVU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvcGVydHlJbXBsIDxlbT5Qcm9wZXJ0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9wZXJ0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9QRVJUWSA9IDQwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX0dVSUQgPSBESUFHUkFNX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fQlJJRUZfREVTQ1JJUFRJT04gPSBESUFHUkFNX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fT1dORURfUlVMRVMgPSBESUFHUkFNX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fU1VQUFJFU1NFRCA9IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19PUkRFUklOR19HVUlERSA9IERJQUdSQU1fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19JU19WSVNJQkxFID0gRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fQ09OVEFJTkVSID0gRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fUkVGRVJFTkNFID0gRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX0tFWSA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19WQUxVRSA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9wZXJ0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9GRUFUVVJFX0NPVU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFZGdlSW1wbCA8ZW0+R3JhcGggRWRnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVkZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhFZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdSQVBIX0VER0UgPSA0MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fTkFNRSA9IEdSQVBIX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0dVSUQgPSBHUkFQSF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHUkFQSF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fT1dORURfUlVMRVMgPSBHUkFQSF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHUkFQSF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fU1VQUFJFU1NFRCA9IEdSQVBIX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19PUkRFUklOR19HVUlERSA9IEdSQVBIX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19JU19WSVNJQkxFID0gR1JBUEhfRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fQ09OVEFJTkVSID0gR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fUkVGRVJFTkNFID0gR1JBUEhfRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19QUk9QRVJUWSA9IEdSQVBIX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc2l0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fUE9TSVRJT04gPSBHUkFQSF9FTEVNRU5UX19QT1NJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0NPTlRBSU5FRCA9IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19MSU5LID0gR1JBUEhfRUxFTUVOVF9fTElOSzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbmNob3JhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0FOQ0hPUkFHRSA9IEdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX1NFTUFOVElDX01PREVMID0gR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5jaG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19BTkNIT1IgPSBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fV0FZUE9JTlRTID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HcmFwaCBFZGdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfRkVBVFVSRV9DT1VOVCA9IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaE5vZGVJbXBsIDxlbT5HcmFwaCBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoTm9kZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERSA9IDQzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19OQU1FID0gR1JBUEhfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fR1VJRCA9IEdSQVBIX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19CUklFRl9ERVNDUklQVElPTiA9IEdSQVBIX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19PV05FRF9SVUxFUyA9IEdSQVBIX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdSQVBIX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19TVVBQUkVTU0VEID0gR1JBUEhfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX09SREVSSU5HX0dVSURFID0gR1JBUEhfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX0lTX1ZJU0lCTEUgPSBHUkFQSF9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19DT05UQUlORVIgPSBHUkFQSF9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19SRUZFUkVOQ0UgPSBHUkFQSF9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX1BST1BFUlRZID0gR1JBUEhfRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19QT1NJVElPTiA9IEdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fQ09OVEFJTkVEID0gR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX0xJTksgPSBHUkFQSF9FTEVNRU5UX19MSU5LOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fQU5DSE9SQUdFID0gR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlbWFudGljIE1vZGVsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fU0VNQU5USUNfTU9ERUwgPSBHUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fU0laRSA9IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3JhcGggTm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX0ZFQVRVUkVfQ09VTlQgPSBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUltcGwgPGVtPkRpYWdyYW08L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJQUdSQU0gPSA0MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fTkFNRSA9IEdSQVBIX05PREVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0dVSUQgPSBHUkFQSF9OT0RFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHUkFQSF9OT0RFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fT1dORURfUlVMRVMgPSBHUkFQSF9OT0RFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHUkFQSF9OT0RFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fU1VQUFJFU1NFRCA9IEdSQVBIX05PREVfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19PUkRFUklOR19HVUlERSA9IEdSQVBIX05PREVfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19JU19WSVNJQkxFID0gR1JBUEhfTk9ERV9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fQ09OVEFJTkVSID0gR1JBUEhfTk9ERV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fUkVGRVJFTkNFID0gR1JBUEhfTk9ERV9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19QUk9QRVJUWSA9IEdSQVBIX05PREVfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc2l0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fUE9TSVRJT04gPSBHUkFQSF9OT0RFX19QT1NJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0NPTlRBSU5FRCA9IEdSQVBIX05PREVfX0NPTlRBSU5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19MSU5LID0gR1JBUEhfTk9ERV9fTElOSzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbmNob3JhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0FOQ0hPUkFHRSA9IEdSQVBIX05PREVfX0FOQ0hPUkFHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1NFTUFOVElDX01PREVMID0gR1JBUEhfTk9ERV9fU0VNQU5USUNfTU9ERUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1NJWkUgPSBHUkFQSF9OT0RFX19TSVpFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlpvb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19aT09NID0gR1JBUEhfTk9ERV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WaWV3cG9pbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19WSUVXUE9JTlQgPSBHUkFQSF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW0gTGluazwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fRElBR1JBTV9MSU5LID0gR1JBUEhfTk9ERV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19OQU1FU1BBQ0UgPSBHUkFQSF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpYWdyYW08L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9GRUFUVVJFX0NPVU5UID0gR1JBUEhfTk9ERV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbCA8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlQgPSA0NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX05BTUUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19HVUlEID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fSVNfVklTSUJMRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX0NPTlRBSU5FUiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1JFRkVSRU5DRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fUFJPUEVSVFkgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19HUkFQSF9FTEVNRU5UID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX0RJQUdSQU0gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU07Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTyA9IFNFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0UgPSA0NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fTkFNRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fR1VJRCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fT1dORURfUlVMRVMgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1NVUFBSRVNTRUQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19PUkRFUklOR19HVUlERSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0lTX1ZJU0lCTEUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0NPTlRBSU5FUiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fUkVGRVJFTkNFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BST1BFUlRZID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT04gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIDxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRSA9IDQ2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fTkFNRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dVSUQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fT1dORURfUlVMRVMgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fU1VQUFJFU1NFRCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19PUkRFUklOR19HVUlERSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19JU19WSVNJQkxFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fQ09OVEFJTkVSID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fUkVGRVJFTkNFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUk9QRVJUWSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkxlYWZFbGVtZW50SW1wbCA8ZW0+TGVhZiBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkxlYWZFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldExlYWZFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVCA9IDQ3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fR1VJRCA9IERJQUdSQU1fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBESUFHUkFNX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gRElBR1JBTV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBESUFHUkFNX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX0lTX1ZJU0lCTEUgPSBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fQ09OVEFJTkVSID0gRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX1JFRkVSRU5DRSA9IERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5MZWFmIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXh0RWxlbWVudEltcGwgPGVtPlRleHQgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXh0RWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZXh0RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlQgPSA0ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19OQU1FID0gTEVBRl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX0dVSUQgPSBMRUFGX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gTEVBRl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19PV05FRF9SVUxFUyA9IExFQUZfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBMRUFGX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBMRUFGX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gTEVBRl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19JU19WSVNJQkxFID0gTEVBRl9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX0NPTlRBSU5FUiA9IExFQUZfRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19SRUZFUkVOQ0UgPSBMRUFGX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19QUk9QRVJUWSA9IExFQUZfRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fVEVYVCA9IExFQUZfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZXh0IEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBMRUFGX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JbWFnZUltcGwgPGVtPkltYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkltYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEltYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElNQUdFID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19OQU1FID0gTEVBRl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fR1VJRCA9IExFQUZfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19CUklFRl9ERVNDUklQVElPTiA9IExFQUZfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19PV05FRF9SVUxFUyA9IExFQUZfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IExFQUZfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19TVVBQUkVTU0VEID0gTEVBRl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX09SREVSSU5HX0dVSURFID0gTEVBRl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX0lTX1ZJU0lCTEUgPSBMRUFGX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19DT05UQUlORVIgPSBMRUFGX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19SRUZFUkVOQ0UgPSBMRUFGX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX1BST1BFUlRZID0gTEVBRl9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fVVJJID0gTEVBRl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1pbWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19NSU1FX1RZUEUgPSBMRUFGX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW1hZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfRkVBVFVSRV9DT1VOVCA9IExFQUZfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoaWNQcmltaXRpdmVJbXBsIDxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaGljUHJpbWl0aXZlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoaWNQcmltaXRpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkUgPSA1MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX05BTUUgPSBMRUFGX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19HVUlEID0gTEVBRl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gTEVBRl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX09XTkVEX1JVTEVTID0gTEVBRl9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTEVBRl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX1NVUFBSRVNTRUQgPSBMRUFGX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fT1JERVJJTkdfR1VJREUgPSBMRUFGX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fSVNfVklTSUJMRSA9IExFQUZfRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX0NPTlRBSU5FUiA9IExFQUZfRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX1JFRkVSRU5DRSA9IExFQUZfRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fUFJPUEVSVFkgPSBMRUFGX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkdyYXBoaWMgUHJpbWl0aXZlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgPSBMRUFGX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2x5bGluZUltcGwgPGVtPlBvbHlsaW5lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvbHlsaW5lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBvbHlsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBPTFlMSU5FID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19OQU1FID0gR1JBUEhJQ19QUklNSVRJVkVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19HVUlEID0gR1JBUEhJQ19QUklNSVRJVkVfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHUkFQSElDX1BSSU1JVElWRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19PV05FRF9SVUxFUyA9IEdSQVBISUNfUFJJTUlUSVZFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1JBUEhJQ19QUklNSVRJVkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fU1VQUFJFU1NFRCA9IEdSQVBISUNfUFJJTUlUSVZFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX09SREVSSU5HX0dVSURFID0gR1JBUEhJQ19QUklNSVRJVkVfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fSVNfVklTSUJMRSA9IEdSQVBISUNfUFJJTUlUSVZFX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fQ09OVEFJTkVSID0gR1JBUEhJQ19QUklNSVRJVkVfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19SRUZFUkVOQ0UgPSBHUkFQSElDX1BSSU1JVElWRV9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fUFJPUEVSVFkgPSBHUkFQSElDX1BSSU1JVElWRV9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xvc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX0NMT1NFRCA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX1dBWVBPSU5UUyA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvbHlsaW5lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX0ZFQVRVUkVfQ09VTlQgPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsIDxlbT5FbGxpcHNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RWxsaXBzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTExJUFNFID0gNTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX05BTUUgPSBHUkFQSElDX1BSSU1JVElWRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fR1VJRCA9IEdSQVBISUNfUFJJTUlUSVZFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHUkFQSElDX1BSSU1JVElWRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX09XTkVEX1JVTEVTID0gR1JBUEhJQ19QUklNSVRJVkVfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdSQVBISUNfUFJJTUlUSVZFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fU1VQUFJFU1NFRCA9IEdSQVBISUNfUFJJTUlUSVZFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fT1JERVJJTkdfR1VJREUgPSBHUkFQSElDX1BSSU1JVElWRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX0lTX1ZJU0lCTEUgPSBHUkFQSElDX1BSSU1JVElWRV9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fQ09OVEFJTkVSID0gR1JBUEhJQ19QUklNSVRJVkVfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX1JFRkVSRU5DRSA9IEdSQVBISUNfUFJJTUlUSVZFX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX1BST1BFUlRZID0gR1JBUEhJQ19QUklNSVRJVkVfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhZGl1cyBYPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fUkFESVVTX1ggPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYWRpdXMgWTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX1JBRElVU19ZID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19ST1RBVElPTiA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IEFuZ2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fU1RBUlRfQU5HTEUgPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmQgQW5nbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19FTkRfQU5HTEUgPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DZW50ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19DRU5URVIgPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FbGxpcHNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfRkVBVFVSRV9DT1VOVCA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsIDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0VsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fR1VJRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fU0hBUEVJQ09OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19OT0RFSUNPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UID0gNTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FID0gUFJPQ0VTU19FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fR1VJRCA9IFBST0NFU1NfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFUyA9IFBST0NFU1NfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEID0gUFJPQ0VTU19FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVCA9IDU0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dVSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEgPSBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4gPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCA8ZW0+QWN0aXZpdHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFkgPSA1MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX05BTUUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fR1VJRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX09XTkVEX1JVTEVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fU1VQUFJFU1NFRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fT1JERVJJTkdfR1VJREUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVTRU5UQVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1NIQVBFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19OT0RFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVGSVggPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19QTEFOTkVEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX09QVElPTkFMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRFRF9BRlRFUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRFRF9CRUZPUkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUExBTk5JTkdfREFUQSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TVVBFUl9BQ1RJVklUSUVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX1JFUEVBVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfT05HT0lORyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fTElOS19UT19QUkVERUNFU1NPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVDT05ESVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUE9TVENPTkRJVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1JPQURNQVBTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fQ0hFQ0tMSVNUUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19DT05DRVBUUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19FWEFNUExFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0dVSURFTElORVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19SRVVTQUJMRV9BU1NFVFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWN0aXZpdHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWlsZXN0b25lSW1wbCA8ZW0+TWlsZXN0b25lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FID0gNTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fR1VJRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fT1dORURfUlVMRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1NVUFBSRVNTRUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19PUkRFUklOR19HVUlERSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUFJFU0VOVEFUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fU0hBUEVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19OT0RFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUFJFRklYID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX1BMQU5ORUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19JU19PUFRJT05BTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRFRF9CRUZPUkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BMQU5OSU5HX0RBVEEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1NVUEVSX0FDVElWSVRJRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX1JFUEVBVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX09OR09JTkcgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfRVZFTlRfRFJJVkVOID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fTElOS19UT19QUkVERUNFU1NPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWlsZXN0b25lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9GRUFUVVJFX0NPVU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkl0ZXJhdGlvbkltcGwgPGVtPkl0ZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JdGVyYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0SXRlcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElURVJBVElPTiA9IDU3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX05BTUUgPSBBQ1RJVklUWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19HVUlEID0gQUNUSVZJVFlfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX09XTkVEX1JVTEVTID0gQUNUSVZJVFlfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQUNUSVZJVFlfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1NVUFBSRVNTRUQgPSBBQ1RJVklUWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFU0VOVEFUSU9OID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1NIQVBFSUNPTiA9IEFDVElWSVRZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX05PREVJQ09OID0gQUNUSVZJVFlfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFRklYID0gQUNUSVZJVFlfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19QTEFOTkVEID0gQUNUSVZJVFlfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBBQ1RJVklUWV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19PUFRJT05BTCA9IEFDVElWSVRZX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRFRF9BRlRFUiA9IEFDVElWSVRZX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFU0VOVEVEX0JFRk9SRSA9IEFDVElWSVRZX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BMQU5OSU5HX0RBVEEgPSBBQ1RJVklUWV9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19TVVBFUl9BQ1RJVklUSUVTID0gQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfUkVQRUFUQUJMRSA9IEFDVElWSVRZX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lTX09OR09JTkcgPSBBQ1RJVklUWV9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lTX0VWRU5UX0RSSVZFTiA9IEFDVElWSVRZX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19MSU5LX1RPX1BSRURFQ0VTU09SID0gQUNUSVZJVFlfX0xJTktfVE9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fVkFSSUFCSUxJVFlfVFlQRSA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRUNPTkRJVElPTiA9IEFDVElWSVRZX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUE9TVENPTkRJVElPTiA9IEFDVElWSVRZX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19CUkVBS0RPV05fRUxFTUVOVFMgPSBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1JPQURNQVBTID0gQUNUSVZJVFlfX1JPQURNQVBTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fQ0hFQ0tMSVNUUyA9IEFDVElWSVRZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0NPTkNFUFRTID0gQUNUSVZJVFlfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0VYQU1QTEVTID0gQUNUSVZJVFlfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fR1VJREVMSU5FUyA9IEFDVElWSVRZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19SRVVTQUJMRV9BU1NFVFMgPSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfRU5BQ1RBQkxFID0gQUNUSVZJVFlfX0lTX0VOQUNUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JdGVyYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBoYXNlSW1wbCA8ZW0+UGhhc2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGhhc2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UGhhc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEhBU0UgPSA1ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX05BTUUgPSBBQ1RJVklUWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0dVSUQgPSBBQ1RJVklUWV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19CUklFRl9ERVNDUklQVElPTiA9IEFDVElWSVRZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX09XTkVEX1JVTEVTID0gQUNUSVZJVFlfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBBQ1RJVklUWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19TVVBQUkVTU0VEID0gQUNUSVZJVFlfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRBVElPTiA9IEFDVElWSVRZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1NIQVBFSUNPTiA9IEFDVElWSVRZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fTk9ERUlDT04gPSBBQ1RJVklUWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRUZJWCA9IEFDVElWSVRZX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19QTEFOTkVEID0gQUNUSVZJVFlfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfT1BUSU9OQUwgPSBBQ1RJVklUWV9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRFRF9BRlRFUiA9IEFDVElWSVRZX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVTRU5URURfQkVGT1JFID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QTEFOTklOR19EQVRBID0gQUNUSVZJVFlfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19TVVBFUl9BQ1RJVklUSUVTID0gQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19SRVBFQVRBQkxFID0gQUNUSVZJVFlfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19PTkdPSU5HID0gQUNUSVZJVFlfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX0VWRU5UX0RSSVZFTiA9IEFDVElWSVRZX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0xJTktfVE9fUFJFREVDRVNTT1IgPSBBQ1RJVklUWV9fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1ZBUklBQklMSVRZX1RZUEUgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFQ09ORElUSU9OID0gQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BPU1RDT05ESVRJT04gPSBBQ1RJVklUWV9fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19CUkVBS0RPV05fRUxFTUVOVFMgPSBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUk9BRE1BUFMgPSBBQ1RJVklUWV9fUk9BRE1BUFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQ0hFQ0tMSVNUUyA9IEFDVElWSVRZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQ09OQ0VQVFMgPSBBQ1RJVklUWV9fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19FWEFNUExFUyA9IEFDVElWSVRZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fR1VJREVMSU5FUyA9IEFDVElWSVRZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1JFVVNBQkxFX0FTU0VUUyA9IEFDVElWSVRZX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX0VOQUNUQUJMRSA9IEFDVElWSVRZX19JU19FTkFDVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGhhc2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfRkVBVFVSRV9DT1VOVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFID0gNTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0dVSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fT1dORURfUlVMRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU0hBUEVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NVUEVSX0FDVElWSVRJRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZWFtIFJvbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1RFQU1fUk9MRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBUZWFtPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIFRlYW08L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU1VCX1RFQU0gPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsIDxlbT5EZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERVNDUklQVE9SID0gNjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fR1VJRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX09XTkVEX1JVTEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19OT0RFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19JU19QTEFOTkVEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUiA9IDYwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX05BTUUgPSBERVNDUklQVE9SX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0dVSUQgPSBERVNDUklQVE9SX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTiA9IERFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX09XTkVEX1JVTEVTID0gREVTQ1JJUFRPUl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREUgPSBERVNDUklQVE9SX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IERFU0NSSVBUT1JfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBERVNDUklQVE9SX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRUZJWCA9IERFU0NSSVBUT1JfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19JU19QTEFOTkVEID0gREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IERFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBERVNDUklQVE9SX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUiA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTID0gREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IERFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19ST0xFID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2RpZmllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19NT0RJRklFUyA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUiA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtPcmRlckltcGwgPGVtPldvcmsgT3JkZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya09yZGVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX09SREVSID0gNjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX0dVSUQgPSBQUk9DRVNTX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX09XTkVEX1JVTEVTID0gUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19TVVBQUkVTU0VEID0gUFJPQ0VTU19FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX1NIQVBFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fTk9ERUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX0xJTktfVFlQRSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fUFJFRCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBID0gNjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0dVSUQgPSBQUk9DRVNTX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX09XTkVEX1JVTEVTID0gUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19TVVBQUkVTU0VEID0gUFJPQ0VTU19FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1NIQVBFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fTk9ERUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19TVEFSVF9EQVRFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1JBTksgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwgPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1IgPSA2NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSA2NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX05BTUUgPSBERVNDUklQVE9SX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1VJRCA9IERFU0NSSVBUT1JfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09XTkVEX1JVTEVTID0gREVTQ1JJUFRPUl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IERFU0NSSVBUT1JfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREUgPSBERVNDUklQVE9SX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IERFU0NSSVBUT1JfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19OT0RFSUNPTiA9IERFU0NSSVBUT1JfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVGSVggPSBERVNDUklQVE9SX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JU19QTEFOTkVEID0gREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUiA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQSA9IERFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTID0gREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFeGl0IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdGVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyYWJsZSBQYXJ0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19HVUlEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19PV05FRF9SVUxFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19TSEFQRUlDT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX05PREVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVGSVggPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVTRU5URURfQUZURVIgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVElFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfUkVQRUFUQUJMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfT05HT0lORyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19FVkVOVF9EUklWRU4gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19MSU5LX1RPX1BSRURFQ0VTU09SID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fVEFTSyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3Npc3RlZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWxlY3RlZCBTdGVwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19TRUxFQ1RFRF9TVEVQUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29tcG9zaXRlUm9sZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb21wb3NpdGVSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFID0gNjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19OQU1FID0gUk9MRV9ERVNDUklQVE9SX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fR1VJRCA9IFJPTEVfREVTQ1JJUFRPUl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19CUklFRl9ERVNDUklQVElPTiA9IFJPTEVfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19PV05FRF9SVUxFUyA9IFJPTEVfREVTQ1JJUFRPUl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFJPTEVfREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19TVVBQUkVTU0VEID0gUk9MRV9ERVNDUklQVE9SX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX09SREVSSU5HX0dVSURFID0gUk9MRV9ERVNDUklQVE9SX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QUkVTRU5UQVRJT05fTkFNRSA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRBVElPTiA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19TSEFQRUlDT04gPSBST0xFX0RFU0NSSVBUT1JfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19OT0RFSUNPTiA9IFJPTEVfREVTQ1JJUFRPUl9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRUZJWCA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfUExBTk5FRCA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gUk9MRV9ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfT1BUSU9OQUwgPSBST0xFX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QUkVTRU5URURfQUZURVIgPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRFRF9CRUZPUkUgPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QTEFOTklOR19EQVRBID0gUk9MRV9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fU1VQRVJfQUNUSVZJVElFUyA9IFJPTEVfREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gUk9MRV9ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19ST0xFID0gUk9MRV9ERVNDUklQVE9SX19ST0xFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fTU9ESUZJRVMgPSBST0xFX0RFU0NSSVBUT1JfX01PRElGSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1JFU1BPTlNJQkxFX0ZPUiA9IFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFnZ3JlZ2F0ZWQgUm9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTID0gUk9MRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX0ZFQVRVUkVfQ09VTlQgPSBST0xFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIDxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OID0gNjg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0dVSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwgPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTiA9IDY5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fR1VJRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib3d0byBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NEZXNjcmlwdGlvbkltcGwgPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OID0gNzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX05BTUUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fR1VJRCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fUFVSUE9TRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SG93dG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT04gPSA3MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fTkFNRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0dVSUQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19QVVJQT1NFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib3d0byBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGID0gUFJPQ0VTU19ERVNDUklQVElPTl9fSE9XVE9fU1RBRkY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBOb3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTID0gUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBPZiBDb250cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OID0gNzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fR1VJRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZpbmVkIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25jZXB0SW1wbCA8ZW0+Q29uY2VwdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25jZXB0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbmNlcHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVCA9IDczOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbmNlcHQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DaGVja2xpc3RJbXBsIDxlbT5DaGVja2xpc3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2hlY2tsaXN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENoZWNrbGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDSEVDS0xJU1QgPSA3NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRXhhbXBsZUltcGwgPGVtPkV4YW1wbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRXhhbXBsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFeGFtcGxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYQU1QTEUgPSA3NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fT1dORURfUlVMRVMgPSBHVUlEQU5DRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0NIRUNLTElTVFMgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fQVNTRVRTID0gR1VJREFOQ0VfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FeGFtcGxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGVsaW5lSW1wbCA8ZW0+R3VpZGVsaW5lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRlbGluZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FID0gNzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fT1dORURfUlVMRVMgPSBHVUlEQU5DRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0NIRUNLTElTVFMgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fQVNTRVRTID0gR1VJREFOQ0VfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HdWlkZWxpbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gODQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXBvcnRJbXBsIDxlbT5SZXBvcnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVwb3J0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVBPUlQgPSA3NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlcG9ydDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVtcGxhdGVJbXBsIDxlbT5UZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZW1wbGF0ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZW1wbGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBURU1QTEFURSA9IDc4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fT1dORURfUlVMRVMgPSBHVUlEQU5DRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0NIRUNLTElTVFMgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fQVNTRVRTID0gR1VJREFOQ0VfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZW1wbGF0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTCA9IDc5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sTWVudG9ySW1wbCA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbE1lbnRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUb29sTWVudG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SID0gODA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsIDxlbT5XaGl0ZXBhcGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V2hpdGVwYXBlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXSElURVBBUEVSID0gODE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX05BTUUgPSBDT05DRVBUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19HVUlEID0gQ09OQ0VQVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OQ0VQVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX09XTkVEX1JVTEVTID0gQ09OQ0VQVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OQ0VQVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1NVUFBSRVNTRUQgPSBDT05DRVBUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fT1JERVJJTkdfR1VJREUgPSBDT05DRVBUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OQ0VQVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fUFJFU0VOVEFUSU9OID0gQ09OQ0VQVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1NIQVBFSUNPTiA9IENPTkNFUFRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX05PREVJQ09OID0gQ09OQ0VQVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05DRVBUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OQ0VQVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05DRVBUX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OQ0VQVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19DSEVDS0xJU1RTID0gQ09OQ0VQVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19HVUlERUxJTkVTID0gQ09OQ0VQVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fRVhBTVBMRVMgPSBDT05DRVBUX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0FTU0VUUyA9IENPTkNFUFRfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfRkVBVFVSRV9DT1VOVCA9IENPTkNFUFRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXJtRGVmaW5pdGlvbkltcGwgPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXJtRGVmaW5pdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZXJtRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT04gPSA4MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsIDxlbT5QcmFjdGljZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkFDVElDRSA9IDgzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fT1dORURfUlVMRVMgPSBHVUlEQU5DRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0NIRUNLTElTVFMgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQVNTRVRTID0gR1VJREFOQ0VfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU1VCX1BSQUNUSUNFUyA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUyA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJhY3RpY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmV1c2FibGVBc3NldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVCA9IDg1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVmVydGV4SW1wbCA8ZW0+VmVydGV4PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZlcnRleEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWZXJ0ZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkVSVEVYID0gODc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdGF0ZUltcGwgPGVtPlN0YXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0YXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNUQVRFID0gODY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWdpb25JbXBsIDxlbT5SZWdpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVnaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlZ2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRUdJT04gPSA4ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0YXRlTWFjaGluZUltcGwgPGVtPlN0YXRlIE1hY2hpbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RhdGVNYWNoaW5lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFN0YXRlTWFjaGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVEFURV9NQUNISU5FID0gODk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UcmFuc2l0aW9uSW1wbCA8ZW0+VHJhbnNpdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UcmFuc2l0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRyYW5zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFJBTlNJVElPTiA9IDkwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHNldWRvU3RhdGVJbXBsIDxlbT5Qc2V1ZG8gU3RhdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHNldWRvU3RhdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHNldWRvU3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFNFVURPX1NUQVRFID0gOTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsIDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWSA9IDkzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGwgPGVtPkRpc2NpcGxpbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJU0NJUExJTkUgPSA5MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRJbXBsIDxlbT5Sb2xlIFNldDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVQgPSA5NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGwgPGVtPkRvbWFpbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Eb21haW5JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG9tYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPTUFJTiA9IDk1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbCA8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRSA9IDk2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbCA8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkcgPSA5NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xJbXBsIDxlbT5Ub29sPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUT09MID0gOTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZVNldEdyb3VwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HID0gOTk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDdXN0b21DYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUlkgPSAxMDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbCA8ZW0+UHJvY2VzczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTUyA9IDEwMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTID0gMTAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsIDxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOID0gMTAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEUgPSAxMDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2FkbWFwSW1wbCA8ZW0+Um9hZG1hcDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2FkbWFwSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvYWRtYXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9BRE1BUCA9IDEwNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbCA8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRSA9IDEwNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlQgPSAxMDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0UgPSAxMDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwgPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUiA9IDEwOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwgPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOID0gMTEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkVSVEVYX19DT05UQUlORVIgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWRVJURVhfX09VVEdPSU5HID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZzwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkVSVEVYX19JTkNPTUlORyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VmVydGV4PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZFUlRFWF9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RBVEVfX0NPTlRBSU5FUiA9IFZFUlRFWF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEFURV9fT1VUR09JTkcgPSBWRVJURVhfX09VVEdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEFURV9fSU5DT01JTkcgPSBWRVJURVhfX0lOQ09NSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RBVEVfX1dPUktfUFJPRFVDVCA9IFZFUlRFWF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWdpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNUQVRFX19SRUdJT04gPSBWRVJURVhfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VibWFjaGluZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNUQVRFX19TVUJNQUNISU5FID0gVkVSVEVYX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlN0YXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNUQVRFX0ZFQVRVUkVfQ09VTlQgPSBWRVJURVhfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVydGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUdJT05fX1ZFUlRFWCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVHSU9OX19UUkFOU0lUSU9OID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGF0ZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUdJT05fX1NUQVRFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGF0ZSBNYWNoaW5lPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFR0lPTl9fU1RBVEVfTUFDSElORSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVnaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFR0lPTl9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RBVEVfTUFDSElORV9fTkFNRSA9IFdPUktfREVGSU5JVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RBVEVfTUFDSElORV9fR1VJRCA9IFdPUktfREVGSU5JVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNUQVRFX01BQ0hJTkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19ERUZJTklUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RBVEVfTUFDSElORV9fT1dORURfUlVMRVMgPSBXT1JLX0RFRklOSVRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEFURV9NQUNISU5FX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfREVGSU5JVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNUQVRFX01BQ0hJTkVfX1NVUFBSRVNTRUQgPSBXT1JLX0RFRklOSVRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEFURV9NQUNISU5FX19PUkRFUklOR19HVUlERSA9IFdPUktfREVGSU5JVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RBVEVfTUFDSElORV9fUFJFQ09ORElUSU9OID0gV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNUQVRFX01BQ0hJTkVfX1BPU1RDT05ESVRJT04gPSBXT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVnaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEFURV9NQUNISU5FX19SRUdJT04gPSBXT1JLX0RFRklOSVRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U3RhdGUgTWFjaGluZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEFURV9NQUNISU5FX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX0RFRklOSVRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBEZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUUkFOU0lUSU9OX19XT1JLX0RFRklOSVRJT04gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUUkFOU0lUSU9OX19DT05UQUlORVIgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRSQU5TSVRJT05fX1NPVVJDRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVFJBTlNJVElPTl9fVEFSR0VUID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UcmFuc2l0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRSQU5TSVRJT05fRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBTRVVET19TVEFURV9fQ09OVEFJTkVSID0gVkVSVEVYX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmc8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBTRVVET19TVEFURV9fT1VUR09JTkcgPSBWRVJURVhfX09VVEdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQU0VVRE9fU1RBVEVfX0lOQ09NSU5HID0gVkVSVEVYX19JTkNPTUlORzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qc2V1ZG8gU3RhdGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFNFVURPX1NUQVRFX0ZFQVRVUkVfQ09VTlQgPSBWRVJURVhfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0dVSUQgPSBDT05URU5UX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORVMgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEVTID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0FTU0VUUyA9IENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fR1VJRCA9IENPTlRFTlRfQ0FURUdPUllfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19PV05FRF9SVUxFUyA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fR1VJREVMSU5FUyA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0VYQU1QTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19BU1NFVFMgPSBDT05URU5UX0NBVEVHT1JZX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFza3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1RBU0tTID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWJkaXNjaXBsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgV29ya2Zsb3dzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1dTID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EaXNjaXBsaW5lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19PV05FRF9SVUxFUyA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0dVSURFTElORVMgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19BU1NFVFMgPSBDT05URU5UX0NBVEVHT1JZX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19ST0xFUyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBTZXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fR1VJRCA9IENPTlRFTlRfQ0FURUdPUllfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fT1dORURfUlVMRVMgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0NIRUNLTElTVFMgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fR1VJREVMSU5FUyA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fQVNTRVRTID0gQ09OVEVOVF9DQVRFR09SWV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fV09SS19QUk9EVUNUUyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViZG9tYWluczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19TVUJET01BSU5TID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Eb21haW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19HVUlEID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fT1dORURfUlVMRVMgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0NIRUNLTElTVFMgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19HVUlERUxJTkVTID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0VYQU1QTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fQVNTRVRTID0gQ09OVEVOVF9DQVRFR09SWV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fT1dORURfUlVMRVMgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0NIRUNLTElTVFMgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0dVSURFTElORVMgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19FWEFNUExFUyA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fQVNTRVRTID0gQ09OVEVOVF9DQVRFR09SWV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NpcGxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fR1VJRCA9IENPTlRFTlRfQ0FURUdPUllfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19PV05FRF9SVUxFUyA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fR1VJREVMSU5FUyA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0VYQU1QTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19BU1NFVFMgPSBDT05URU5UX0NBVEVHT1JZX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19UT09MX01FTlRPUlMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRvb2w8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fR1VJRCA9IENPTlRFTlRfQ0FURUdPUllfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19DSEVDS0xJU1RTID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fR1VJREVMSU5FUyA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19FWEFNUExFUyA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0FTU0VUUyA9IENPTlRFTlRfQ0FURUdPUllfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlIFNldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19DSEVDS0xJU1RTID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0dVSURFTElORVMgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0VYQU1QTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0FTU0VUUyA9IENPTlRFTlRfQ0FURUdPUllfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRlZ29yaXplZCBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIENhdGVnb3JpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX05BTUUgPSBBQ1RJVklUWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fR1VJRCA9IEFDVElWSVRZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX09XTkVEX1JVTEVTID0gQUNUSVZJVFlfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEFDVElWSVRZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fU1VQUFJFU1NFRCA9IEFDVElWSVRZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRSA9IEFDVElWSVRZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVTRU5UQVRJT04gPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1NIQVBFSUNPTiA9IEFDVElWSVRZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19OT0RFSUNPTiA9IEFDVElWSVRZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVGSVggPSBBQ1RJVklUWV9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19QTEFOTkVEID0gQUNUSVZJVFlfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQUNUSVZJVFlfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX09QVElPTkFMID0gQUNUSVZJVFlfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUiA9IEFDVElWSVRZX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkUgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUExBTk5JTkdfREFUQSA9IEFDVElWSVRZX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19TVVBFUl9BQ1RJVklUSUVTID0gQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX1JFUEVBVEFCTEUgPSBBQ1RJVklUWV9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfT05HT0lORyA9IEFDVElWSVRZX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX0VWRU5UX0RSSVZFTiA9IEFDVElWSVRZX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fTElOS19UT19QUkVERUNFU1NPUiA9IEFDVElWSVRZX19MSU5LX1RPX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVDT05ESVRJT04gPSBBQ1RJVklUWV9fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QT1NUQ09ORElUSU9OID0gQUNUSVZJVFlfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVFMgPSBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19ST0FETUFQUyA9IEFDVElWSVRZX19ST0FETUFQUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTFMgPSBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fQ0hFQ0tMSVNUUyA9IEFDVElWSVRZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19DT05DRVBUUyA9IEFDVElWSVRZX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fRVhBTVBMRVMgPSBBQ1RJVklUWV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fR1VJREVMSU5FUyA9IEFDVElWSVRZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUkVVU0FCTEVfQVNTRVRTID0gQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19FTkFDVEFCTEUgPSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm5zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOUyA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkVBVFVSRV9DT1VOVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19OQU1FID0gUFJPQ0VTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fR1VJRCA9IFBST0NFU1NfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19PV05FRF9SVUxFUyA9IFBST0NFU1NfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TVVBQUkVTU0VEID0gUFJPQ0VTU19fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TSEFQRUlDT04gPSBQUk9DRVNTX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19OT0RFSUNPTiA9IFBST0NFU1NfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRUZJWCA9IFBST0NFU1NfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfUExBTk5FRCA9IFBST0NFU1NfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gUFJPQ0VTU19fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfT1BUSU9OQUwgPSBQUk9DRVNTX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVTRU5URURfQUZURVIgPSBQUk9DRVNTX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkUgPSBQUk9DRVNTX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QTEFOTklOR19EQVRBID0gUFJPQ0VTU19fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU1VQRVJfQUNUSVZJVElFUyA9IFBST0NFU1NfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX1JFUEVBVEFCTEUgPSBQUk9DRVNTX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19PTkdPSU5HID0gUFJPQ0VTU19fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19FVkVOVF9EUklWRU4gPSBQUk9DRVNTX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fTElOS19UT19QUkVERUNFU1NPUiA9IFBST0NFU1NfX0xJTktfVE9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1ZBUklBQklMSVRZX1RZUEUgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVDT05ESVRJT04gPSBQUk9DRVNTX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BPU1RDT05ESVRJT04gPSBQUk9DRVNTX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlRTID0gUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19ST0FETUFQUyA9IFBST0NFU1NfX1JPQURNQVBTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IFBST0NFU1NfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0NIRUNLTElTVFMgPSBQUk9DRVNTX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19DT05DRVBUUyA9IFBST0NFU1NfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19FWEFNUExFUyA9IFBST0NFU1NfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dVSURFTElORVMgPSBQUk9DRVNTX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUkVVU0FCTEVfQVNTRVRTID0gUFJPQ0VTU19fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX0VOQUNUQUJMRSA9IFBST0NFU1NfX0lTX0VOQUNUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlMgPSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQgPSBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fVkFMSURfQ09OVEVYVCA9IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWR1Y2F0aW9uIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUyA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFMgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19OQU1FID0gUFJPQ0VTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19HVUlEID0gUFJPQ0VTU19fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19PV05FRF9SVUxFUyA9IFBST0NFU1NfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU1VQUFJFU1NFRCA9IFBST0NFU1NfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19TSEFQRUlDT04gPSBQUk9DRVNTX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX05PREVJQ09OID0gUFJPQ0VTU19fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVGSVggPSBQUk9DRVNTX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfUExBTk5FRCA9IFBST0NFU1NfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lTX09QVElPTkFMID0gUFJPQ0VTU19fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVTRU5URURfQUZURVIgPSBQUk9DRVNTX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUExBTk5JTkdfREFUQSA9IFBST0NFU1NfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU1VQRVJfQUNUSVZJVElFUyA9IFBST0NFU1NfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfT05HT0lORyA9IFBST0NFU1NfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19FVkVOVF9EUklWRU4gPSBQUk9DRVNTX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19MSU5LX1RPX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRUNPTkRJVElPTiA9IFBST0NFU1NfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QT1NUQ09ORElUSU9OID0gUFJPQ0VTU19fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fQlJFQUtET1dOX0VMRU1FTlRTID0gUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1JPQURNQVBTID0gUFJPQ0VTU19fUk9BRE1BUFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBQUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0NIRUNLTElTVFMgPSBQUk9DRVNTX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0NPTkNFUFRTID0gUFJPQ0VTU19fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fRVhBTVBMRVMgPSBQUk9DRVNTX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0dVSURFTElORVMgPSBQUk9DRVNTX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19SRVVTQUJMRV9BU1NFVFMgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19FTkFDVEFCTEUgPSBQUk9DRVNTX19JU19FTkFDVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSU5DTFVERVNfUEFUVEVSTlMgPSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0RFRkFVTFRfQ09OVEVYVCA9IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1ZBTElEX0NPTlRFWFQgPSBQUk9DRVNTX19WQUxJRF9DT05URVhUOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX05BTUUgPSBQUk9DRVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HVUlEID0gUFJPQ0VTU19fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX09XTkVEX1JVTEVTID0gUFJPQ0VTU19fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1NVUFBSRVNTRUQgPSBQUk9DRVNTX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1NIQVBFSUNPTiA9IFBST0NFU1NfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX05PREVJQ09OID0gUFJPQ0VTU19fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFRklYID0gUFJPQ0VTU19fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19PUFRJT05BTCA9IFBST0NFU1NfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TVVBFUl9BQ1RJVklUSUVTID0gUFJPQ0VTU19fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX09OR09JTkcgPSBQUk9DRVNTX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX0VWRU5UX0RSSVZFTiA9IFBST0NFU1NfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19MSU5LX1RPX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fVkFSSUFCSUxJVFlfVFlQRSA9IFBST0NFU1NfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRUNPTkRJVElPTiA9IFBST0NFU1NfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUE9TVENPTkRJVElPTiA9IFBST0NFU1NfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CUkVBS0RPV05fRUxFTUVOVFMgPSBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1JPQURNQVBTID0gUFJPQ0VTU19fUk9BRE1BUFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQ0hFQ0tMSVNUUyA9IFBST0NFU1NfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0NPTkNFUFRTID0gUFJPQ0VTU19fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0VYQU1QTEVTID0gUFJPQ0VTU19fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1VJREVMSU5FUyA9IFBST0NFU1NfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19SRVVTQUJMRV9BU1NFVFMgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfRU5BQ1RBQkxFID0gUFJPQ0VTU19fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm5zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JTkNMVURFU19QQVRURVJOUyA9IFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0RFRkFVTFRfQ09OVEVYVCA9IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19WQUxJRF9DT05URVhUID0gUFJPQ0VTU19fVkFMSURfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlZCBPbiBQcm9jZXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUyA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvYWRtYXA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fTkFNRSA9IE1FVEhPRF9QQUNLQUdFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0dVSUQgPSBNRVRIT0RfUEFDS0FHRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fT1dORURfUlVMRVMgPSBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9QQUNLQUdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9QQUNLQUdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0dMT0JBTCA9IE1FVEhPRF9QQUNLQUdFX19HTE9CQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUyA9IE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hpbGQgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMgPSBNRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVMgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX05BTUUgPSBQUk9DRVNTX1BBQ0tBR0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HVUlEID0gUFJPQ0VTU19QQUNLQUdFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX09XTkVEX1JVTEVTID0gUFJPQ0VTU19QQUNLQUdFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX1NVUFBSRVNTRUQgPSBQUk9DRVNTX1BBQ0tBR0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HTE9CQUwgPSBQUk9DRVNTX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19SRVVTRURfUEFDS0FHRVMgPSBQUk9DRVNTX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGlsZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0NISUxEX1BBQ0tBR0VTID0gUFJPQ0VTU19QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTU19FTEVNRU5UUyA9IFBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0RJQUdSQU1TID0gUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlMgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEUgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTiA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT04gPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5UID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0VTID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HVUlEID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX09XTkVEX1JVTEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEFUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1NIQVBFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX05PREVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFRklYID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JU19QTEFOTkVEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JU19PUFRJT05BTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BSRVNFTlRFRF9BRlRFUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEVEX0JFRk9SRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BMQU5OSU5HX0RBVEEgPSBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19TVVBFUl9BQ1RJVklUSUVTID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZSBJTzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU8gPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fTkFNRSA9IERFU0NSSVBUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0dVSUQgPSBERVNDUklQVE9SX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fT1dORURfUlVMRVMgPSBERVNDUklQVE9SX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IERFU0NSSVBUT1JfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19PUkRFUklOR19HVUlERSA9IERFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBERVNDUklQVE9SX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUkVGSVggPSBERVNDUklQVE9SX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0lTX1BMQU5ORUQgPSBERVNDUklQVE9SX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IERFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQSA9IERFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRJRVMgPSBERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IERFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5UID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX05BTUUgPSBNRVRIT0RfVU5JVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fR1VJRCA9IE1FVEhPRF9VTklUX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX09XTkVEX1JVTEVTID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9VTklUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9VTklUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0FVVEhPUlMgPSBNRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NIQU5HRV9EQVRFID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1ZFUlNJT04gPSBNRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IE1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZXIgQ2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0JBU0VTID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT04gPSAxMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19HVUlEID0gTUVUSE9EX1VOSVRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19PV05FRF9SVUxFUyA9IE1FVEhPRF9VTklUX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9VTklUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1VOSVRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQVVUSE9SUyA9IE1FVEhPRF9VTklUX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NIQU5HRV9EQVRFID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fVkVSU0lPTiA9IE1FVEhPRF9VTklUX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IE1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIFZpZXdzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmlldzwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIENvbmZpZ3VyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NGYW1pbHlJbXBsIDxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRmFtaWx5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NGYW1pbHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFkgPSAxMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19OQU1FID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19HVUlEID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19PV05FRF9SVUxFUyA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fQVVUSE9SUyA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0NIQU5HRV9EQVRFID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fVkVSU0lPTiA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04gPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIFZpZXdzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fUFJPQ0VTU19WSUVXUyA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmlldzwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19ERUZBVUxUX1ZJRVcgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19CQVNFX0NPTkZJR1VSQVRJT05TID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VidHJhY3RlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX1NVQlRSQUNURURfQ0FURUdPUlkgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0FEREVEX0NBVEVHT1JZID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3NlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0RFTElWRVJZX1BST0NFU1NFUyA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsIDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZExpYnJhcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUlkgPSAxMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19HVUlEID0gTUVUSE9EX1VOSVRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19PV05FRF9SVUxFUyA9IE1FVEhPRF9VTklUX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9VTklUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1VOSVRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQVVUSE9SUyA9IE1FVEhPRF9VTklUX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0NIQU5HRV9EQVRFID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fVkVSU0lPTiA9IE1FVEhPRF9VTklUX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IE1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlIDxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9UWVBFID0gMTE2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBzZXVkb1N0YXRlS2luZCA8ZW0+UHNldWRvIFN0YXRlIEtpbmQ8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHNldWRvU3RhdGVLaW5kCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHNldWRvU3RhdGVLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBTRVVET19TVEFURV9LSU5EID0gMTE3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfVFlQRSA9IDExODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RGF0ZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEudXRpbC5EYXRlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEQVRFID0gMTE5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Vcmk8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm5ldC5VUkkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVVJJID0gMTIwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5VbmxpbWl0ZWQgTmF0dXJhbDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRVbmxpbWl0ZWROYXR1cmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFVOTElNSVRFRF9OQVRVUkFMID0gMTIxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TdHJpbmc8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3RyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNUUklORyA9IDEyMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U2V0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS51dGlsLlNldAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVQgPSAxMjM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlNlcXVlbmNlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZXF1ZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVFVRU5DRSA9IDEyNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SW50ZWdlcjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRJbnRlZ2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElOVEVHRVIgPSAxMjU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkZsb2F0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLkZsb2F0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RmxvYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRkxPQVQgPSAxMjY7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXIgPGVtPkNsYXNzaWZpZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2xhc3NpZmllcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q2xhc3NpZmllcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCA8ZW0+TmFtZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE5hbWVkRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldE5hbWVkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TmFtZWRFbGVtZW50X05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50IDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGFja2FnZWFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgPGVtPlBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TmFtZXNwYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRHdWlkIDxlbT5HdWlkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R3VpZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRHdWlkKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0d1aWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEJyaWVmRGVzY3JpcHRpb24gPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE93bmVkUnVsZXMgPGVtPk93bmVkIFJ1bGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Pd25lZCBSdWxlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRPd25lZFJ1bGVzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5IDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0U3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0U3VwcHJlc3NlZCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRPcmRlcmluZ0d1aWRlIDxlbT5PcmRlcmluZyBHdWlkZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50IDxlbT5Db25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50I2dldEJvZHkgPGVtPkJvZHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Cb2R5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50I2dldEJvZHkoKQotCSAqIEBzZWUgI2dldENvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnN0cmFpbnRfQm9keSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5I2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldFN1cHBvcnRpbmdNYXRlcmlhbHMoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRDb25jZXB0c0FuZFBhcGVycyA8ZW0+Q29uY2VwdHMgQW5kIFBhcGVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29uY2VwdHMgQW5kIFBhcGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q2hlY2tsaXN0cyA8ZW0+Q2hlY2tsaXN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q2hlY2tsaXN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q2hlY2tsaXN0cygpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldEd1aWRlbGluZXMgPGVtPkd1aWRlbGluZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkd1aWRlbGluZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldEd1aWRlbGluZXMoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRFeGFtcGxlcyA8ZW0+RXhhbXBsZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkV4YW1wbGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRFeGFtcGxlcygpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRBc3NldHMgPGVtPkFzc2V0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXNzZXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRBc3NldHMoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50IDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpYmFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaGFwZWljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRTaGFwZWljb24oKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXROb2RlaWNvbiA8ZW0+Tm9kZWljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ob2RlaWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uKCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24gPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0U2VjdGlvbnMgPGVtPlNlY3Rpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZWN0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldFNlY3Rpb25zKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRLZXlDb25zaWRlcmF0aW9ucyA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gPGVtPlNlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlY3Rpb24gTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uTmFtZSgpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbkRlc2NyaXB0aW9uIDxlbT5TZWN0aW9uIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3Rpb25fU2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFN1YlNlY3Rpb25zIDxlbT5TdWIgU2VjdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YiBTZWN0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTdWJTZWN0aW9ucygpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9TdWJTZWN0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZSA8ZW0+Um9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlI2dldE1vZGlmaWVzIDxlbT5Nb2RpZmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TW9kaWZpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUjZ2V0TW9kaWZpZXMoKQotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVfTW9kaWZpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlI2dldFJlc3BvbnNpYmxlRm9yKCkKLQkgKiBAc2VlICNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFJlcG9ydHMgPGVtPlJlcG9ydHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJlcG9ydHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFJlcG9ydHMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRUZW1wbGF0ZXMgPGVtPlRlbXBsYXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGVtcGxhdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRUZW1wbGF0ZXMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRvb2wgTWVudG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0VG9vbE1lbnRvcnMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRQZXJmb3JtZWRCeSA8ZW0+UGVyZm9ybWVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UGVyZm9ybWVkIEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFBlcmZvcm1lZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE1hbmRhdG9yeUlucHV0IDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRNYW5kYXRvcnlJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3V0cHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE91dHB1dCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19PdXRwdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0T3B0aW9uYWxJbnB1dCA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE9wdGlvbmFsSW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfT3B0aW9uYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRTdGVwcyA8ZW0+U3RlcHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlN0ZXBzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFN0ZXBzKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX1N0ZXBzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRvb2wgTWVudG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRUb29sTWVudG9ycygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19Ub29sTWVudG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QcmVjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uI2dldFByZWNvbmRpdGlvbigpCi0JICogQHNlZSAjZ2V0V29ya0RlZmluaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtEZWZpbml0aW9uX1ByZWNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAc2VlICNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwIDxlbT5TdGVwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN0ZXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFN0ZXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2UgPGVtPkd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkd1aWRhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QgPGVtPkFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXJ0aWZhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVyQXJ0aWZhY3QgPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5Db250YWluZXIgQXJ0aWZhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lckFydGlmYWN0KCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXJ0aWZhY3RfQ29udGFpbmVyQXJ0aWZhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0cyA8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlIDxlbT5EZWxpdmVyYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZSNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGUjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWUgPGVtPk91dGNvbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0T3V0Y29tZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0R2xvYmFsIDxlbT5HbG9iYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HbG9iYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0R2xvYmFsKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlcyA8ZW0+UmV1c2VkIFBhY2thZ2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXVzZWQgUGFja2FnZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0UmV1c2VkUGFja2FnZXMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0Q2hpbGRQYWNrYWdlcyA8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNoaWxkIFBhY2thZ2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldENoaWxkUGFja2FnZXMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZSA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnRQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZSNnZXRDb250ZW50RWxlbWVudHMgPGVtPkNvbnRlbnQgRWxlbWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbnRlbnQgRWxlbWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50cygpCi0JICogQHNlZSAjZ2V0Q29udGVudFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uIDxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0QnJpZWZPdXRsaW5lIDxlbT5CcmllZiBPdXRsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QnJpZWYgT3V0bGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0SW1wYWN0T2ZOb3RIYXZpbmcgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24gPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U2tpbGxzIDxlbT5Ta2lsbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ta2lsbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcyA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldFN5bm9ueW1zIDxlbT5TeW5vbnltczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN5bm9ueW1zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiA8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2tEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVycG9zZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uIDxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24jZ2V0QXR0YWNobWVudHMgPGVtPkF0dGFjaG1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXR0YWNobWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24jZ2V0QXR0YWNobWVudHMoKQotCSAqIEBzZWUgI2dldEd1aWRhbmNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiA8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFkZGl0aW9uYWxJbmZvIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BZGRpdGlvbmFsIEluZm88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QWRkaXRpb25hbEluZm8oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9ibGVtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QmFja2dyb3VuZCA8ZW0+QmFja2dyb3VuZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJhY2tncm91bmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QmFja2dyb3VuZCgpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscyA8ZW0+R29hbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Hb2FsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscygpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXBwbGljYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QXBwbGljYXRpb24oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgPGVtPlBvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UG9pbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCNnZXRYIDxlbT5YPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQjZ2V0WCgpCi0JICogQHNlZSAjZ2V0UG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBvaW50X1goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCNnZXRZIDxlbT5ZPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQjZ2V0WSgpCi0JICogQHNlZSAjZ2V0UG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBvaW50X1koKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3JhcGhFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFBvc2l0aW9uIDxlbT5Qb3NpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBvc2l0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0UG9zaXRpb24oKQotCSAqIEBzZWUgI2dldEdyYXBoRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X1Bvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0Q29udGFpbmVkIDxlbT5Db250YWluZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbnRhaW5lZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldENvbnRhaW5lZCgpCi0JICogQHNlZSAjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfQ29udGFpbmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0TGluayA8ZW0+TGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldExpbmsoKQotCSAqIEBzZWUgI2dldEdyYXBoRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X0xpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRBbmNob3JhZ2UgPGVtPkFuY2hvcmFnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QW5jaG9yYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0QW5jaG9yYWdlKCkKLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9BbmNob3JhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0U2VtYW50aWNNb2RlbCA8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TZW1hbnRpYyBNb2RlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFNlbWFudGljTW9kZWwoKQotCSAqIEBzZWUgI2dldEdyYXBoRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X1NlbWFudGljTW9kZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQgPGVtPkRpYWdyYW0gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREaWFncmFtRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldElzVmlzaWJsZSA8ZW0+SXMgVmlzaWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFZpc2libGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldElzVmlzaWJsZSgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpYWdyYW1FbGVtZW50X0lzVmlzaWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+Q29udGFpbmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRDb250YWluZXJfKCkKLQkgKiBAc2VlICNnZXREaWFncmFtRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUVsZW1lbnRfQ29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRSZWZlcmVuY2UgPGVtPlJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRSZWZlcmVuY2UoKQotCSAqIEBzZWUgI2dldERpYWdyYW1FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9SZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldFByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldFByb3BlcnR5KCkKLQkgKiBAc2VlICNnZXREaWFncmFtRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUVsZW1lbnRfUHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsgPGVtPkRpYWdyYW0gTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaWFncmFtIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREaWFncmFtTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldFpvb20gPGVtPlpvb208L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5ab29tPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRab29tKCkKLQkgKiBAc2VlICNnZXREaWFncmFtTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGlhZ3JhbUxpbmtfWm9vbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldFZpZXdwb3J0IDxlbT5WaWV3cG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlZpZXdwb3J0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRWaWV3cG9ydCgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbUxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1MaW5rX1ZpZXdwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldERpYWdyYW1MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtTGlua19HcmFwaEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXREaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0RGlhZ3JhbSgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbUxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1MaW5rX0RpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IgPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHcmFwaENvbm5lY3RvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAc2VlICNnZXRHcmFwaENvbm5lY3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVkZ2UgPGVtPkdyYXBoIEVkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkdyYXBoIEVkZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWRnZSgpCi0JICogQHNlZSAjZ2V0R3JhcGhDb25uZWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWRnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlIDxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBzZWUgI2dldFNlbWFudGljTW9kZWxCcmlkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlbWFudGljTW9kZWxCcmlkZ2VfUHJlc2VudGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAc2VlICNnZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0dyYXBoRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXREaWFncmFtKCkKLQkgKiBAc2VlICNnZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0RpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uIDxlbT5EaW1lbnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGltZW5zaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERpbWVuc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiNnZXRXaWR0aCA8ZW0+V2lkdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5XaWR0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldFdpZHRoKCkKLQkgKiBAc2VlICNnZXREaW1lbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpbWVuc2lvbl9XaWR0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiNnZXRIZWlnaHQgPGVtPkhlaWdodDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhlaWdodDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldEhlaWdodCgpCi0JICogQHNlZSAjZ2V0RGltZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaW1lbnNpb25fSGVpZ2h0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSA8ZW0+UmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24gPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKQotCSAqIEBzZWUgI2dldFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVmZXJlbmNlX0lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldFJlZmVyZW5jZWQgPGVtPlJlZmVyZW5jZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5SZWZlcmVuY2VkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UjZ2V0UmVmZXJlbmNlZCgpCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2VfUmVmZXJlbmNlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldEtleSA8ZW0+S2V5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+S2V5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eSNnZXRLZXkoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eV9LZXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UgPGVtPkdyYXBoIEVkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3JhcGggRWRnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHcmFwaEVkZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSNnZXRBbmNob3IgPGVtPkFuY2hvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QW5jaG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UjZ2V0QW5jaG9yKCkKLQkgKiBAc2VlICNnZXRHcmFwaEVkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoRWRnZV9BbmNob3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSNnZXRXYXlwb2ludHMgPGVtPldheXBvaW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+V2F5cG9pbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UjZ2V0V2F5cG9pbnRzKCkKLQkgKiBAc2VlICNnZXRHcmFwaEVkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoRWRnZV9XYXlwb2ludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRab29tIDxlbT5ab29tPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Wm9vbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRab29tKCkKLQkgKiBAc2VlICNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaWFncmFtX1pvb20oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldFZpZXdwb2ludCA8ZW0+Vmlld3BvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Vmlld3BvaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldFZpZXdwb2ludCgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbV9WaWV3cG9pbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0RGlhZ3JhbUxpbmsgPGVtPkRpYWdyYW0gTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldERpYWdyYW1MaW5rKCkKLQkgKiBAc2VlICNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtX0RpYWdyYW1MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXROYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk5hbWVzcGFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXROYW1lc3BhY2UoKQotCSAqIEBzZWUgI2dldERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1fTmFtZXNwYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZSA8ZW0+R3JhcGggTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HcmFwaCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEdyYXBoTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZSNnZXRTaXplIDxlbT5TaXplPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U2l6ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlI2dldFNpemUoKQotCSAqIEBzZWUgI2dldEdyYXBoTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0R3JhcGhOb2RlX1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgPGVtPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCNnZXRUeXBlSW5mbyA8ZW0+VHlwZSBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZSBJbmZvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCNnZXRUeXBlSW5mbygpCi0JICogQHNlZSAjZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X1R5cGVJbmZvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2UgPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RWxlbWVudCgpCi0JICogQHNlZSAjZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIDxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50IDxlbT5MZWFmIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TGVhZiBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TGVhZkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQgPGVtPlRleHQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UZXh0IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUZXh0RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50I2dldFRleHQgPGVtPlRleHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UZXh0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudCNnZXRUZXh0KCkKLQkgKiBAc2VlICNnZXRUZXh0RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGV4dEVsZW1lbnRfVGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSA8ZW0+SW1hZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW1hZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJbWFnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldFVyaSA8ZW0+VXJpPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXJpPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSNnZXRVcmkoKQotCSAqIEBzZWUgI2dldEltYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbWFnZV9VcmkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSNnZXRNaW1lVHlwZSA8ZW0+TWltZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWltZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSNnZXRNaW1lVHlwZSgpCi0JICogQHNlZSAjZ2V0SW1hZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEltYWdlX01pbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmUgPGVtPkdyYXBoaWMgUHJpbWl0aXZlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkdyYXBoaWMgUHJpbWl0aXZlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHcmFwaGljUHJpbWl0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lIDxlbT5Qb2x5bGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qb2x5bGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBvbHlsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUjZ2V0Q2xvc2VkIDxlbT5DbG9zZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbG9zZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lI2dldENsb3NlZCgpCi0JICogQHNlZSAjZ2V0UG9seWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBvbHlsaW5lX0Nsb3NlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUjZ2V0V2F5cG9pbnRzIDxlbT5XYXlwb2ludHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldheXBvaW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUjZ2V0V2F5cG9pbnRzKCkKLQkgKiBAc2VlICNnZXRQb2x5bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UG9seWxpbmVfV2F5cG9pbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UgPGVtPkVsbGlwc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RWxsaXBzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RWxsaXBzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0UmFkaXVzWCA8ZW0+UmFkaXVzIFg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SYWRpdXMgWDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSYWRpdXNYKCkKLQkgKiBAc2VlICNnZXRFbGxpcHNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX1JhZGl1c1goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1kgPGVtPlJhZGl1cyBZPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmFkaXVzIFk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0UmFkaXVzWSgpCi0JICogQHNlZSAjZ2V0RWxsaXBzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9SYWRpdXNZKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSb3RhdGlvbiA8ZW0+Um90YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Sb3RhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSb3RhdGlvbigpCi0JICogQHNlZSAjZ2V0RWxsaXBzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9Sb3RhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0U3RhcnRBbmdsZSA8ZW0+U3RhcnQgQW5nbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydCBBbmdsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRTdGFydEFuZ2xlKCkKLQkgKiBAc2VlICNnZXRFbGxpcHNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX1N0YXJ0QW5nbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldEVuZEFuZ2xlIDxlbT5FbmQgQW5nbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbmQgQW5nbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0RW5kQW5nbGUoKQotCSAqIEBzZWUgI2dldEVsbGlwc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVsbGlwc2VfRW5kQW5nbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldENlbnRlciA8ZW0+Q2VudGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2VudGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldENlbnRlcigpCi0JICogQHNlZSAjZ2V0RWxsaXBzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RWxsaXBzZV9DZW50ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkgPGVtPkFjdGl2aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWN0aXZpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldEJyZWFrZG93bkVsZW1lbnRzIDxlbT5CcmVha2Rvd24gRWxlbWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkJyZWFrZG93biBFbGVtZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcHMgPGVtPlJvYWRtYXBzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Sb2FkbWFwczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcHMoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9Sb2FkbWFwcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0U3VwcG9ydGluZ01hdGVyaWFscyA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfU3VwcG9ydGluZ01hdGVyaWFscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0Q2hlY2tsaXN0cyA8ZW0+Q2hlY2tsaXN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q2hlY2tsaXN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0Q2hlY2tsaXN0cygpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFjdGl2aXR5X0NoZWNrbGlzdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldENvbmNlcHRzIDxlbT5Db25jZXB0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29uY2VwdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldENvbmNlcHRzKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfQ29uY2VwdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldEV4YW1wbGVzIDxlbT5FeGFtcGxlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXhhbXBsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldEV4YW1wbGVzKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfRXhhbXBsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldEd1aWRlbGluZXMgPGVtPkd1aWRlbGluZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkd1aWRlbGluZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldEd1aWRlbGluZXMoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9HdWlkZWxpbmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRSZXVzYWJsZUFzc2V0cyA8ZW0+UmV1c2FibGUgQXNzZXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldFJldXNhYmxlQXNzZXRzKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfUmV1c2FibGVBc3NldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgRW5hY3RhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X0lzRW5hY3RhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50IDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzUmVwZWF0YWJsZSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFJlcGVhdGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIE9uZ29pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzT25nb2luZygpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldExpbmtUb1ByZWRlY2Vzc29yIDxlbT5MaW5rIFRvIFByZWRlY2Vzc29yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5MaW5rIFRvIFByZWRlY2Vzc29yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRMaW5rVG9QcmVkZWNlc3NvcigpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZWZpeDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVmaXgoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBQbGFubmVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldElzUGxhbm5lZCgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldElzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRBZnRlciA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEJlZm9yZSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0aWVzIDxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uIDxlbT5JdGVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEl0ZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZSA8ZW0+UGhhc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGhhc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQaGFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSA8ZW0+VGVhbSBQcm9maWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlYW1Qcm9maWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRUZWFtUm9sZXMgPGVtPlRlYW0gUm9sZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRlYW0gUm9sZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFRlYW1Sb2xlcygpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlN1cGVyIFRlYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSgpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3ViVGVhbSA8ZW0+U3ViIFRlYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YiBUZWFtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRTdWJUZWFtKCkKLQkgKiBAc2VlICNnZXRUZWFtUHJvZmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRNb2RpZmllcyA8ZW0+TW9kaWZpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk1vZGlmaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRNb2RpZmllcygpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlRm9yKCkKLQkgKiBAc2VlICNnZXRSb2xlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyIDxlbT5Xb3JrIE9yZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya09yZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaW5rIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjZ2V0V29ya09yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrT3JkZXJfTGlua1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIjZ2V0UHJlZCA8ZW0+UHJlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlByZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRQcmVkKCkKLQkgKiBAc2VlICNnZXRXb3JrT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtPcmRlcl9QcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0IERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRTdGFydERhdGUoKQotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0RmluaXNoRGF0ZSgpCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRSYW5rIDxlbT5SYW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmFuazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFJhbmsoKQotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciA8ZW0+RGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2dldERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFza0Rlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRUYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0VGFzaygpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBc3Npc3RlZEJ5IDxlbT5Bc3Npc3RlZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXNzaXN0ZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFzc2lzdGVkQnkoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0IDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEV4dGVybmFsSW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE1hbmRhdG9yeUlucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3B0aW9uYWxJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXRwdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0U2VsZWN0ZWRTdGVwcyA8ZW0+U2VsZWN0ZWQgU3RlcHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNlbGVjdGVkIFN0ZXBzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTZWxlY3RlZFN0ZXBzKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUVudHJ5U3RhdGUgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUV4aXRTdGF0ZSA8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdGVkQnkgPGVtPkltcGFjdGVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbXBhY3RlZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdGVkQnkoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbXBhY3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0cygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldERlbGl2ZXJhYmxlUGFydHMgPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldERlbGl2ZXJhYmxlUGFydHMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZSA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbXBvc2l0ZVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0QWdncmVnYXRlZFJvbGVzIDxlbT5BZ2dyZWdhdGVkIFJvbGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5BZ2dyZWdhdGVkIFJvbGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlI2dldEFnZ3JlZ2F0ZWRSb2xlcygpCi0JICogQHNlZSAjZ2V0Q29tcG9zaXRlUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIDxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uI2dldFVzYWdlR3VpZGFuY2UoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldFB1cnBvc2UoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0SG93dG9TdGFmZiA8ZW0+SG93dG8gU3RhZmY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ib3d0byBTdGFmZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3d0b1N0YWZmKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NhbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjYWxlKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIDxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJpc2sgTGV2ZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEVzdGltYXRpbmdUZWNobmlxdWUgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFR5cGVPZkNvbnRyYWN0IDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24gPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NvcGUgPGVtPlNjb3BlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NvcGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0VXNhZ2VOb3RlcyA8ZW0+VXNhZ2UgTm90ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0IDxlbT5Db25jZXB0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENoZWNrbGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEV4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEd1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJlcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZSA8ZW0+VGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUZW1wbGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRvb2xNZW50b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXaGl0ZXBhcGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGVybURlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UgPGVtPlByYWN0aWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJhY3RpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlI2dldFN1YlByYWN0aWNlcyA8ZW0+U3ViIFByYWN0aWNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViIFByYWN0aWNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0U3ViUHJhY3RpY2VzKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSNnZXRDb250ZW50UmVmZXJlbmNlcyA8ZW0+Q29udGVudCBSZWZlcmVuY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250ZW50IFJlZmVyZW5jZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlI2dldENvbnRlbnRSZWZlcmVuY2VzKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlI2dldEFjdGl2aXR5UmVmZXJlbmNlcyA8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSZXVzYWJsZUFzc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlIDxlbT5TdGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TdGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFN0YXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZSNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAc2VlICNnZXRTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U3RhdGVfV29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlI2dldFJlZ2lvbiA8ZW0+UmVnaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZWdpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlI2dldFJlZ2lvbigpCi0JICogQHNlZSAjZ2V0U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFN0YXRlX1JlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlI2dldFN1Ym1hY2hpbmUgPGVtPlN1Ym1hY2hpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TdWJtYWNoaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZSNnZXRTdWJtYWNoaW5lKCkKLQkgKiBAc2VlICNnZXRTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U3RhdGVfU3VibWFjaGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXggPGVtPlZlcnRleDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5WZXJ0ZXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VmVydGV4KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+Q29udGFpbmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXgjZ2V0Q29udGFpbmVyXygpCi0JICogQHNlZSAjZ2V0VmVydGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRWZXJ0ZXhfQ29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXgjZ2V0T3V0Z29pbmcgPGVtPk91dGdvaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXRnb2luZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4I2dldE91dGdvaW5nKCkKLQkgKiBAc2VlICNnZXRWZXJ0ZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFZlcnRleF9PdXRnb2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4I2dldEluY29taW5nIDxlbT5JbmNvbWluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5jb21pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleCNnZXRJbmNvbWluZygpCi0JICogQHNlZSAjZ2V0VmVydGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRWZXJ0ZXhfSW5jb21pbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uIDxlbT5SZWdpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVnaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFZlcnRleCA8ZW0+VmVydGV4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5WZXJ0ZXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbiNnZXRWZXJ0ZXgoKQotCSAqIEBzZWUgI2dldFJlZ2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVnaW9uX1ZlcnRleCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFRyYW5zaXRpb24gPGVtPlRyYW5zaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRyYW5zaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbiNnZXRUcmFuc2l0aW9uKCkKLQkgKiBAc2VlICNnZXRSZWdpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlZ2lvbl9UcmFuc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbiNnZXRTdGF0ZSA8ZW0+U3RhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+U3RhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbiNnZXRTdGF0ZSgpCi0JICogQHNlZSAjZ2V0UmVnaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZWdpb25fU3RhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFN0YXRlTWFjaGluZSA8ZW0+U3RhdGUgTWFjaGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5TdGF0ZSBNYWNoaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24jZ2V0U3RhdGVNYWNoaW5lKCkKLQkgKiBAc2VlICNnZXRSZWdpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlZ2lvbl9TdGF0ZU1hY2hpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGVNYWNoaW5lIDxlbT5TdGF0ZSBNYWNoaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN0YXRlIE1hY2hpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlTWFjaGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U3RhdGVNYWNoaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZU1hY2hpbmUjZ2V0UmVnaW9uIDxlbT5SZWdpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlZ2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGVNYWNoaW5lI2dldFJlZ2lvbigpCi0JICogQHNlZSAjZ2V0U3RhdGVNYWNoaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTdGF0ZU1hY2hpbmVfUmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb24gPGVtPlRyYW5zaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VHJhbnNpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VHJhbnNpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiNnZXRXb3JrRGVmaW5pdGlvbiA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb24jZ2V0V29ya0RlZmluaXRpb24oKQotCSAqIEBzZWUgI2dldFRyYW5zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRyYW5zaXRpb25fV29ya0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+Q29udGFpbmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldENvbnRhaW5lcl8oKQotCSAqIEBzZWUgI2dldFRyYW5zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRyYW5zaXRpb25fQ29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiNnZXRTb3VyY2UoKQotCSAqIEBzZWUgI2dldFRyYW5zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRyYW5zaXRpb25fU291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiNnZXRUYXJnZXQgPGVtPlRhcmdldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlRhcmdldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiNnZXRUYXJnZXQoKQotCSAqIEBzZWUgI2dldFRyYW5zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRyYW5zaXRpb25fVGFyZ2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBzZXVkb1N0YXRlIDxlbT5Qc2V1ZG8gU3RhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHNldWRvIFN0YXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qc2V1ZG9TdGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHNldWRvU3RhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lI2dldFRhc2tzIDxlbT5UYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGFza3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0VGFza3MoKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpc2NpcGxpbmVfVGFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0U3ViZGlzY2lwbGluZSA8ZW0+U3ViZGlzY2lwbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViZGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRTdWJkaXNjaXBsaW5lKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0UmVmZXJlbmNlV29ya2Zsb3dzIDxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lI2dldFJlZmVyZW5jZVdvcmtmbG93cygpCi0JICogQHNlZSAjZ2V0RGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5IDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQgPGVtPlJvbGUgU2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0I2dldFJvbGVzIDxlbT5Sb2xlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Um9sZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQjZ2V0Um9sZXMoKQotCSAqIEBzZWUgI2dldFJvbGVTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVTZXRfUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluIDxlbT5Eb21haW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERvbWFpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluI2dldFdvcmtQcm9kdWN0cyA8ZW0+V29yayBQcm9kdWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+V29yayBQcm9kdWN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluI2dldFdvcmtQcm9kdWN0cygpCi0JICogQHNlZSAjZ2V0RG9tYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb21haW5fV29ya1Byb2R1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4jZ2V0U3ViZG9tYWlucyA8ZW0+U3ViZG9tYWluczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViZG9tYWluczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluI2dldFN1YmRvbWFpbnMoKQotCSAqIEBzZWUgI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9tYWluX1N1YmRvbWFpbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZSNnZXRXb3JrUHJvZHVjdHMgPGVtPldvcmsgUHJvZHVjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPldvcmsgUHJvZHVjdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZSNnZXRXb3JrUHJvZHVjdHMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcgPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREaXNjaXBsaW5lR3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZyNnZXREaXNjaXBsaW5lcyA8ZW0+RGlzY2lwbGluZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkRpc2NpcGxpbmVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0RGlzY2lwbGluZXMoKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2wgPGVtPlRvb2w8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VG9vbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbCNnZXRUb29sTWVudG9ycyA8ZW0+VG9vbCBNZW50b3JzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Ub29sIE1lbnRvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2wjZ2V0VG9vbE1lbnRvcnMoKQotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRvb2xfVG9vbE1lbnRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlU2V0R3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZyNnZXRSb2xlU2V0cyA8ZW0+Um9sZSBTZXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Sb2xlIFNldHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZyNnZXRSb2xlU2V0cygpCi0JICogQHNlZSAjZ2V0Um9sZVNldEdyb3VwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDdXN0b21DYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cyA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkNhdGVnb3JpemVkIEVsZW1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkgKiBAc2VlICNnZXRDdXN0b21DYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0U3ViQ2F0ZWdvcmllcyA8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YiBDYXRlZ29yaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRTdWJDYXRlZ29yaWVzKCkKLQkgKiBAc2VlICNnZXRDdXN0b21DYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3MgPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZWxpdmVyeVByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRFZHVjYXRpb25NYXRlcmlhbHMgPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRFZHVjYXRpb25NYXRlcmlhbHMoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWxzIDxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0SW5jbHVkZXNQYXR0ZXJucyA8ZW0+SW5jbHVkZXMgUGF0dGVybnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkluY2x1ZGVzIFBhdHRlcm5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldEluY2x1ZGVzUGF0dGVybnMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0RGVmYXVsdENvbnRleHQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXREZWZhdWx0Q29udGV4dCgpCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXRWYWxpZENvbnRleHQgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlZhbGlkIENvbnRleHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0VmFsaWRDb250ZXh0KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybiA8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUjZ2V0QmFzZWRPblByb2Nlc3NlcyA8ZW0+QmFzZWQgT24gUHJvY2Vzc2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5CYXNlZCBPbiBQcm9jZXNzZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEJhc2VkT25Qcm9jZXNzZXMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlZE9uUHJvY2Vzc2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXAgPGVtPlJvYWRtYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9hZG1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50IDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRJbnRlcmZhY2VzIDxlbT5JbnRlcmZhY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbnRlcmZhY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEludGVyZmFjZXMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0UHJvY2VzcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlIDxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc1BhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlI2dldFByb2Nlc3NFbGVtZW50cyA8ZW0+UHJvY2VzcyBFbGVtZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJvY2VzcyBFbGVtZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0UHJvY2Vzc0VsZW1lbnRzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXREaWFncmFtcyA8ZW0+RGlhZ3JhbXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRpYWdyYW1zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXREaWFncmFtcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NQYWNrYWdlX0RpYWdyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMgPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZUlPIDxlbT5JbnRlcmZhY2UgSU88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkludGVyZmFjZSBJTzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VJTygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VJTygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciA8ZW0+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciNnZXRQcm9jZXNzQ29tcG9uZW50IDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQbHVnaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0VXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldE1ldGhvZFBhY2thZ2VzIDxlbT5NZXRob2QgUGFja2FnZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBQYWNrYWdlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldE1ldGhvZFBhY2thZ2VzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldEJhc2VzIDxlbT5CYXNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QmFzZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRCYXNlcygpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQbHVnaW5fQmFzZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCA8ZW0+TWV0aG9kIFVuaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZFVuaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRob3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQXV0aG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DaGFuZ2UgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q29weXJpZ2h0U3RhdGVtZW50IDxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKQotCSAqIEBzZWUgI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFVuaXRfQ29weXJpZ2h0U3RhdGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFByb2Nlc3NWaWV3cyA8ZW0+UHJvY2VzcyBWaWV3czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJvY2VzcyBWaWV3czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRQcm9jZXNzVmlld3MoKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0VmlldyA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3KCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEJhc2VDb25maWd1cmF0aW9ucyA8ZW0+QmFzZSBDb25maWd1cmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QmFzZSBDb25maWd1cmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRCYXNlQ29uZmlndXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSA8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEFkZGVkQ2F0ZWdvcnkgPGVtPkFkZGVkIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRBZGRlZENhdGVnb3J5KCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseSA8ZW0+UHJvY2VzcyBGYW1pbHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBGYW1pbHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NGYW1pbHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHkjZ2V0RGVsaXZlcnlQcm9jZXNzZXMgPGVtPkRlbGl2ZXJ5IFByb2Nlc3NlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVsaXZlcnkgUHJvY2Vzc2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5I2dldERlbGl2ZXJ5UHJvY2Vzc2VzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzRmFtaWx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzRmFtaWx5X0RlbGl2ZXJ5UHJvY2Vzc2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZFBsdWdpbnMgPGVtPk1ldGhvZCBQbHVnaW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgUGx1Z2luczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RQbHVnaW5zKCkKLQkgKiBAc2VlICNnZXRNZXRob2RMaWJyYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkjZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIDxlbT5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5I2dldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpCi0JICogQHNlZSAjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlIDxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0V29ya09yZGVyVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBzZXVkb1N0YXRlS2luZCA8ZW0+UHNldWRvIFN0YXRlIEtpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5Qc2V1ZG8gU3RhdGUgS2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHNldWRvU3RhdGVLaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFBzZXVkb1N0YXRlS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLnV0aWwuRGF0ZSA8ZW0+RGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEudXRpbC5EYXRlCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEudXRpbC5EYXRlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubmV0LlVSSSA8ZW0+VXJpPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Vcmk8L2VtPicuCi0JICogQHNlZSBqYXZhLm5ldC5VUkkKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5uZXQuVVJJIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VW5saW1pdGVkIE5hdHVyYWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VW5saW1pdGVkIE5hdHVyYWw8L2VtPicuCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImludCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFVubGltaXRlZE5hdHVyYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5TdHJpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlN0cmluZzwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFN0cmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEudXRpbC5TZXQgPGVtPlNldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U2V0PC9lbT4nLgotCSAqIEBzZWUgamF2YS51dGlsLlNldAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLnV0aWwuU2V0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0U2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS51dGlsLkxpc3QgPGVtPlNlcXVlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5TZXF1ZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEudXRpbC5MaXN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0U2VxdWVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5JbnRlZ2VyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkludGVnZXI8L2VtPicuCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImludCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEludGVnZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuRmxvYXQgPGVtPkZsb2F0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5GbG9hdDwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5GbG9hdAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuRmxvYXQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRGbG9hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVW1hRmFjdG9yeSBnZXRVbWFGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DbGFzc2lmaWVySW1wbCA8ZW0+Q2xhc3NpZmllcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DbGFzc2lmaWVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDbGFzc2lmaWVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENMQVNTSUZJRVIgPSBlSU5TVEFOQ0UuZ2V0Q2xhc3NpZmllcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlR5cGVJbXBsIDxlbT5UeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVFlQRSA9IGVJTlNUQU5DRS5nZXRUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxlbWVudEltcGwgPGVtPkVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFTEVNRU5UID0gZUlOU1RBTkNFLmdldEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5OYW1lZEVsZW1lbnRJbXBsIDxlbT5OYW1lZCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TmFtZWRFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE5BTUVEX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTkFNRURfRUxFTUVOVF9fTkFNRSA9IGVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBhY2thZ2VhYmxlRWxlbWVudEltcGwgPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUEFDS0FHRUFCTEVfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlSW1wbCA8ZW0+UGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQYWNrYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0UGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVzcGFjZUltcGwgPGVtPk5hbWVzcGFjZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5OYW1lc3BhY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE5hbWVzcGFjZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBOQU1FU1BBQ0UgPSBlSU5TVEFOQ0UuZ2V0TmFtZXNwYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19HVUlEID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfR3VpZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uc3RyYWludEltcGwgPGVtPkNvbnN0cmFpbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uc3RyYWludEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29uc3RyYWludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05TVFJBSU5UID0gZUlOU1RBTkNFLmdldENvbnN0cmFpbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJvZHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05TVFJBSU5UX19CT0RZID0gZUlOU1RBTkNFLmdldENvbnN0cmFpbnRfQm9keSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsIDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRFTlRfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVTQ1JJQkFCTEVfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsIDxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRFTlRfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwgPGVtPlNlY3Rpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2VjdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRUNUSU9OID0gZUlOU1RBTkNFLmdldFNlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1RJT05fX1NFQ1RJT05fTkFNRSA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIFNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNUSU9OX19TVUJfU0VDVElPTlMgPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9TdWJTZWN0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNUSU9OX19QUkVERUNFU1NPUiA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGwgPGVtPlJvbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFID0gZUlOU1RBTkNFLmdldFJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBST0xFX19NT0RJRklFUyA9IGVJTlNUQU5DRS5nZXRSb2xlX01vZGlmaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfX1JFU1BPTlNJQkxFX0ZPUiA9IGVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsIDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVCA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX19SRVBPUlRTID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX19URU1QTEFURVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwgPGVtPlRhc2s8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGFzaygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUQVNLID0gZUlOU1RBTkNFLmdldFRhc2soKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX01BTkRBVE9SWV9JTlBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX09VVFBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fT1BUSU9OQUxfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGVwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fU1RFUFMgPSBlSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX19UT09MX01FTlRPUlMgPSBlSU5TVEFOQ0UuZ2V0VGFza19Ub29sTWVudG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbCA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrRGVmaW5pdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX0RFRklOSVRJT04gPSBlSU5TVEFOQ0UuZ2V0V29ya0RlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtEZWZpbml0aW9uX1ByZWNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RlcEltcGwgPGVtPlN0ZXA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RlcEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3RlcCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTVEVQID0gZUlOU1RBTkNFLmdldFN0ZXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZUltcGwgPGVtPkd1aWRhbmNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHVUlEQU5DRSA9IGVJTlNUQU5DRS5nZXRHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0SW1wbCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFSVElGQUNUID0gZUlOU1RBTkNFLmdldEFydGlmYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXIgQXJ0aWZhY3Q8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkIEFydGlmYWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVJbXBsIDxlbT5EZWxpdmVyYWJsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVMSVZFUkFCTEUgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuT3V0Y29tZUltcGwgPGVtPk91dGNvbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuT3V0Y29tZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0T3V0Y29tZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBPVVRDT01FID0gZUlOU1RBTkNFLmdldE91dGNvbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGFja2FnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hpbGQgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwgPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudFBhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9QQUNLQUdFID0gZUlOU1RBTkNFLmdldENvbnRlbnRQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwgPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVJUSUZBQ1RfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgT3V0bGluZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FID0gZUlOU1RBTkNFCi0JCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERUxJVkVSQUJMRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhY2thZ2luZyBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwgPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNraWxsczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TeW5vbnltczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TID0gZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdGlvbkltcGwgPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTS19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlRGVzY3JpcHRpb25JbXBsIDxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdVSURBTkNFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dGFjaG1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTID0gZUlOU1RBTkNFCi0JCQkJLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCA8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUkFDVElDRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2JsZW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTSA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdvYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9pbnRJbXBsIDxlbT5Qb2ludDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2ludEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UG9pbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUE9JTlQgPSBlSU5TVEFOQ0UuZ2V0UG9pbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT0lOVF9fWCA9IGVJTlNUQU5DRS5nZXRQb2ludF9YKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5ZPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUE9JTlRfX1kgPSBlSU5TVEFOQ0UuZ2V0UG9pbnRfWSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1JBUEhfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRHcmFwaEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc2l0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0R3JhcGhFbGVtZW50X1Bvc2l0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCA9IGVJTlNUQU5DRQotCQkJCS5nZXRHcmFwaEVsZW1lbnRfQ29udGFpbmVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9FTEVNRU5UX19MSU5LID0gZUlOU1RBTkNFLmdldEdyYXBoRWxlbWVudF9MaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbmNob3JhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRHcmFwaEVsZW1lbnRfQW5jaG9yYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMID0gZUlOU1RBTkNFCi0JCQkJLmdldEdyYXBoRWxlbWVudF9TZW1hbnRpY01vZGVsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUVsZW1lbnRJbXBsIDxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpYWdyYW1FbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJQUdSQU1fRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXREaWFncmFtRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRSA9IGVJTlNUQU5DRQotCQkJCS5nZXREaWFncmFtRWxlbWVudF9Jc1Zpc2libGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUiA9IGVJTlNUQU5DRQotCQkJCS5nZXREaWFncmFtRWxlbWVudF9Db250YWluZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGlhZ3JhbUVsZW1lbnRfUmVmZXJlbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWSA9IGVJTlNUQU5DRQotCQkJCS5nZXREaWFncmFtRWxlbWVudF9Qcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1MaW5rSW1wbCA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1MaW5rSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaWFncmFtTGluaygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESUFHUkFNX0xJTksgPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbUxpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlpvb208L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESUFHUkFNX0xJTktfX1pPT00gPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbUxpbmtfWm9vbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Vmlld3BvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX0xJTktfX1ZJRVdQT1JUID0gZUlOU1RBTkNFLmdldERpYWdyYW1MaW5rX1ZpZXdwb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCA9IGVJTlNUQU5DRQotCQkJCS5nZXREaWFncmFtTGlua19HcmFwaEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX0xJTktfX0RJQUdSQU0gPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbUxpbmtfRGlhZ3JhbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoQ29ubmVjdG9ySW1wbCA8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoQ29ubmVjdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaENvbm5lY3RvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHUkFQSF9DT05ORUNUT1IgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhDb25uZWN0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWRnZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFID0gZUlOU1RBTkNFCi0JCQkJLmdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWRnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIDxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRU1BTlRJQ19NT0RFTF9CUklER0UgPSBlSU5TVEFOQ0UuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9QcmVzZW50YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldFNlbWFudGljTW9kZWxCcmlkZ2VfR3JhcGhFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSA9IGVJTlNUQU5DRQotCQkJCS5nZXRTZW1hbnRpY01vZGVsQnJpZGdlX0RpYWdyYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaW1lbnNpb25JbXBsIDxlbT5EaW1lbnNpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGltZW5zaW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaW1lbnNpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElNRU5TSU9OID0gZUlOU1RBTkNFLmdldERpbWVuc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESU1FTlNJT05fX1dJRFRIID0gZUlOU1RBTkNFLmdldERpbWVuc2lvbl9XaWR0aCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElNRU5TSU9OX19IRUlHSFQgPSBlSU5TVEFOQ0UuZ2V0RGltZW5zaW9uX0hlaWdodCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZmVyZW5jZUltcGwgPGVtPlJlZmVyZW5jZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWZlcmVuY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlZmVyZW5jZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRUZFUkVOQ0UgPSBlSU5TVEFOQ0UuZ2V0UmVmZXJlbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldFJlZmVyZW5jZV9Jc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFRkVSRU5DRV9fUkVGRVJFTkNFRCA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2VfUmVmZXJlbmNlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb3BlcnR5SW1wbCA8ZW0+UHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvcGVydHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb3BlcnR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST1BFUlRZID0gZUlOU1RBTkNFLmdldFByb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5LZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9fS0VZID0gZUlOU1RBTkNFLmdldFByb3BlcnR5X0tleSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlfVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVkZ2VJbXBsIDxlbT5HcmFwaCBFZGdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWRnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhFZGdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdSQVBIX0VER0UgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhFZGdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbmNob3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX0VER0VfX0FOQ0hPUiA9IGVJTlNUQU5DRS5nZXRHcmFwaEVkZ2VfQW5jaG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XYXlwb2ludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX0VER0VfX1dBWVBPSU5UUyA9IGVJTlNUQU5DRS5nZXRHcmFwaEVkZ2VfV2F5cG9pbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUltcGwgPGVtPkRpYWdyYW08L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlhZ3JhbSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESUFHUkFNID0gZUlOU1RBTkNFLmdldERpYWdyYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlpvb208L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESUFHUkFNX19aT09NID0gZUlOU1RBTkNFLmdldERpYWdyYW1fWm9vbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Vmlld3BvaW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElBR1JBTV9fVklFV1BPSU5UID0gZUlOU1RBTkNFLmdldERpYWdyYW1fVmlld3BvaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtIExpbms8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fX0RJQUdSQU1fTElOSyA9IGVJTlNUQU5DRS5nZXREaWFncmFtX0RpYWdyYW1MaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX19OQU1FU1BBQ0UgPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbV9OYW1lc3BhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaE5vZGVJbXBsIDxlbT5HcmFwaCBOb2RlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoTm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhOb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdSQVBIX05PREUgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhOb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfTk9ERV9fU0laRSA9IGVJTlNUQU5DRS5nZXRHcmFwaE5vZGVfU2l6ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbCA8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPID0gZUlOU1RBTkNFCi0JCQkJLmdldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X1R5cGVJbmZvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFID0gZUlOU1RBTkNFCi0JCQkJLmdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCA8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFID0gZUlOU1RBTkNFCi0JCQkJLmdldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkxlYWZFbGVtZW50SW1wbCA8ZW0+TGVhZiBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkxlYWZFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRMZWFmRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBMRUFGX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0TGVhZkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXh0RWxlbWVudEltcGwgPGVtPlRleHQgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXh0RWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGV4dEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEVYVF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldFRleHRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEVYVF9FTEVNRU5UX19URVhUID0gZUlOU1RBTkNFLmdldFRleHRFbGVtZW50X1RleHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JbWFnZUltcGwgPGVtPkltYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkltYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRJbWFnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBJTUFHRSA9IGVJTlNUQU5DRS5nZXRJbWFnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU1BR0VfX1VSSSA9IGVJTlNUQU5DRS5nZXRJbWFnZV9VcmkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1pbWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElNQUdFX19NSU1FX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0SW1hZ2VfTWltZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaGljUHJpbWl0aXZlSW1wbCA8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhpY1ByaW1pdGl2ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhpY1ByaW1pdGl2ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHUkFQSElDX1BSSU1JVElWRSA9IGVJTlNUQU5DRS5nZXRHcmFwaGljUHJpbWl0aXZlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9seWxpbmVJbXBsIDxlbT5Qb2x5bGluZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2x5bGluZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UG9seWxpbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUE9MWUxJTkUgPSBlSU5TVEFOQ0UuZ2V0UG9seWxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsb3NlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPTFlMSU5FX19DTE9TRUQgPSBlSU5TVEFOQ0UuZ2V0UG9seWxpbmVfQ2xvc2VkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XYXlwb2ludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBPTFlMSU5FX19XQVlQT0lOVFMgPSBlSU5TVEFOQ0UuZ2V0UG9seWxpbmVfV2F5cG9pbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwgPGVtPkVsbGlwc2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RWxsaXBzZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFTExJUFNFID0gZUlOU1RBTkNFLmdldEVsbGlwc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJhZGl1cyBYPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUxMSVBTRV9fUkFESVVTX1ggPSBlSU5TVEFOQ0UuZ2V0RWxsaXBzZV9SYWRpdXNYKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SYWRpdXMgWTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVMTElQU0VfX1JBRElVU19ZID0gZUlOU1RBTkNFLmdldEVsbGlwc2VfUmFkaXVzWSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTExJUFNFX19ST1RBVElPTiA9IGVJTlNUQU5DRS5nZXRFbGxpcHNlX1JvdGF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGFydCBBbmdsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVMTElQU0VfX1NUQVJUX0FOR0xFID0gZUlOU1RBTkNFLmdldEVsbGlwc2VfU3RhcnRBbmdsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW5kIEFuZ2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUxMSVBTRV9fRU5EX0FOR0xFID0gZUlOU1RBTkNFLmdldEVsbGlwc2VfRW5kQW5nbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNlbnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVMTElQU0VfX0NFTlRFUiA9IGVJTlNUQU5DRS5nZXRFbGxpcHNlX0NlbnRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCA8ZW0+QWN0aXZpdHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFjdGl2aXR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWSVRZID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBQ1RJVklUWV9fUk9BRE1BUFMgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUm9hZG1hcHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfU3VwcG9ydGluZ01hdGVyaWFscygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQUNUSVZJVFlfX0NIRUNLTElTVFMgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQ2hlY2tsaXN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWSVRZX19DT05DRVBUUyA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Db25jZXB0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWSVRZX19FWEFNUExFUyA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9FeGFtcGxlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQUNUSVZJVFlfX0dVSURFTElORVMgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfR3VpZGVsaW5lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVRTID0gZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X1JldXNhYmxlQXNzZXRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X0lzRW5hY3RhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBCUkVBS0RPV05fRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwgPGVtPk1pbGVzdG9uZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NaWxlc3RvbmVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1pbGVzdG9uZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNSUxFU1RPTkUgPSBlSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSXRlcmF0aW9uSW1wbCA8ZW0+SXRlcmF0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkl0ZXJhdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0SXRlcmF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIElURVJBVElPTiA9IGVJTlNUQU5DRS5nZXRJdGVyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QaGFzZUltcGwgPGVtPlBoYXNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBoYXNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQaGFzZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQSEFTRSA9IGVJTlNUQU5DRS5nZXRQaGFzZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCA8ZW0+VGVhbSBQcm9maWxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZWFtUHJvZmlsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURUFNX1BST0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRlYW0gUm9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBURUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgVGVhbTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEVBTV9QUk9GSUxFX19TVUJfVEVBTSA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfREVTQ1JJUFRPUl9fUk9MRSA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2RpZmllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUk9MRV9ERVNDUklQVE9SX19NT0RJRklFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUiA9IGVJTlNUQU5DRQotCQkJCS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtPcmRlckltcGwgPGVtPldvcmsgT3JkZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya09yZGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19PUkRFUiA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfT1JERVJfX0xJTktfVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXJfTGlua1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX09SREVSX19QUkVEID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9QcmVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsIDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQbGFubmluZ0RhdGEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUExBTk5JTkdfREFUQSA9IGVJTlNUQU5DRS5nZXRQbGFubmluZ0RhdGEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQTEFOTklOR19EQVRBX19TVEFSVF9EQVRFID0gZUlOU1RBTkNFCi0JCQkJLmdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJhbms8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQTEFOTklOR19EQVRBX19SQU5LID0gZUlOU1RBTkNFLmdldFBsYW5uaW5nRGF0YV9SYW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckltcGwgPGVtPkRlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldERlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IGVJTlNUQU5DRQotCQkJCS5nZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCA8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUQVNLX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX1RBU0sgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3Npc3RlZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VsZWN0ZWQgU3RlcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfREVTQ1JJUFRPUl9fU0VMRUNURURfU1RFUFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGFjdGVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGFjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyYWJsZSBQYXJ0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29tcG9zaXRlUm9sZUltcGwgPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbXBvc2l0ZVJvbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09NUE9TSVRFX1JPTEUgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUm9sZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWdncmVnYXRlZCBSb2xlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIDxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwgPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQUNUSVZJVFlfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SG93dG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkYgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY2FsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFID0gZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTID0gZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJpc2sgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMID0gZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGluZyBUZWNobmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRSA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBPZiBDb250cmFjdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsIDxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9FeHRlcm5hbElkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY29wZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgTm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVTQ1JJUFRPUl9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmluZWQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25jZXB0SW1wbCA8ZW0+Q29uY2VwdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25jZXB0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb25jZXB0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTkNFUFQgPSBlSU5TVEFOQ0UuZ2V0Q29uY2VwdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNoZWNrbGlzdEltcGwgPGVtPkNoZWNrbGlzdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DaGVja2xpc3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENoZWNrbGlzdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDSEVDS0xJU1QgPSBlSU5TVEFOQ0UuZ2V0Q2hlY2tsaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRXhhbXBsZUltcGwgPGVtPkV4YW1wbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRXhhbXBsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXhhbXBsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFWEFNUExFID0gZUlOU1RBTkNFLmdldEV4YW1wbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkZWxpbmVJbXBsIDxlbT5HdWlkZWxpbmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGVsaW5lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkZWxpbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1VJREVMSU5FID0gZUlOU1RBTkNFLmdldEd1aWRlbGluZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXBvcnRJbXBsIDxlbT5SZXBvcnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVwb3J0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZXBvcnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVQT1JUID0gZUlOU1RBTkNFLmdldFJlcG9ydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlbXBsYXRlSW1wbCA8ZW0+VGVtcGxhdGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVtcGxhdGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlbXBsYXRlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRFTVBMQVRFID0gZUlOU1RBTkNFLmdldFRlbXBsYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTVVBQT1JUSU5HX01BVEVSSUFMID0gZUlOU1RBTkNFLmdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sTWVudG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUb29sTWVudG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRPT0xfTUVOVE9SID0gZUlOU1RBTkNFLmdldFRvb2xNZW50b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbCA8ZW0+V2hpdGVwYXBlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXaGl0ZXBhcGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdISVRFUEFQRVIgPSBlSU5TVEFOQ0UuZ2V0V2hpdGVwYXBlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbCA8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZXJtRGVmaW5pdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURVJNX0RFRklOSVRJT04gPSBlSU5TVEFOQ0UuZ2V0VGVybURlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGwgPGVtPlByYWN0aWNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcmFjdGljZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUkFDVElDRSA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIFByYWN0aWNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsIDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXVzYWJsZUFzc2V0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZXVzYWJsZUFzc2V0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFVVNBQkxFX0FTU0VUID0gZUlOU1RBTkNFLmdldFJldXNhYmxlQXNzZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdGF0ZUltcGwgPGVtPlN0YXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0YXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTVEFURSA9IGVJTlNUQU5DRS5nZXRTdGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTVEFURV9fV09SS19QUk9EVUNUID0gZUlOU1RBTkNFLmdldFN0YXRlX1dvcmtQcm9kdWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWdpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNUQVRFX19SRUdJT04gPSBlSU5TVEFOQ0UuZ2V0U3RhdGVfUmVnaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWJtYWNoaW5lPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU1RBVEVfX1NVQk1BQ0hJTkUgPSBlSU5TVEFOQ0UuZ2V0U3RhdGVfU3VibWFjaGluZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZlcnRleEltcGwgPGVtPlZlcnRleDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WZXJ0ZXhJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZlcnRleCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBWRVJURVggPSBlSU5TVEFOQ0UuZ2V0VmVydGV4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVkVSVEVYX19DT05UQUlORVIgPSBlSU5TVEFOQ0UuZ2V0VmVydGV4X0NvbnRhaW5lcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmc8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFZFUlRFWF9fT1VUR09JTkcgPSBlSU5TVEFOQ0UuZ2V0VmVydGV4X091dGdvaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZzwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVkVSVEVYX19JTkNPTUlORyA9IGVJTlNUQU5DRS5nZXRWZXJ0ZXhfSW5jb21pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWdpb25JbXBsIDxlbT5SZWdpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVnaW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZWdpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVHSU9OID0gZUlOU1RBTkNFLmdldFJlZ2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVydGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRUdJT05fX1ZFUlRFWCA9IGVJTlNUQU5DRS5nZXRSZWdpb25fVmVydGV4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc2l0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRUdJT05fX1RSQU5TSVRJT04gPSBlSU5TVEFOQ0UuZ2V0UmVnaW9uX1RyYW5zaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0YXRlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFR0lPTl9fU1RBVEUgPSBlSU5TVEFOQ0UuZ2V0UmVnaW9uX1N0YXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGF0ZSBNYWNoaW5lPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFR0lPTl9fU1RBVEVfTUFDSElORSA9IGVJTlNUQU5DRS5nZXRSZWdpb25fU3RhdGVNYWNoaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RhdGVNYWNoaW5lSW1wbCA8ZW0+U3RhdGUgTWFjaGluZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdGF0ZU1hY2hpbmVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFN0YXRlTWFjaGluZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTVEFURV9NQUNISU5FID0gZUlOU1RBTkNFLmdldFN0YXRlTWFjaGluZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVnaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTVEFURV9NQUNISU5FX19SRUdJT04gPSBlSU5TVEFOQ0UuZ2V0U3RhdGVNYWNoaW5lX1JlZ2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRyYW5zaXRpb25JbXBsIDxlbT5UcmFuc2l0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRyYW5zaXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRyYW5zaXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVFJBTlNJVElPTiA9IGVJTlNUQU5DRS5nZXRUcmFuc2l0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIERlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRSQU5TSVRJT05fX1dPUktfREVGSU5JVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRUcmFuc2l0aW9uX1dvcmtEZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVFJBTlNJVElPTl9fQ09OVEFJTkVSID0gZUlOU1RBTkNFLmdldFRyYW5zaXRpb25fQ29udGFpbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUUkFOU0lUSU9OX19TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0VHJhbnNpdGlvbl9Tb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhcmdldDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRSQU5TSVRJT05fX1RBUkdFVCA9IGVJTlNUQU5DRS5nZXRUcmFuc2l0aW9uX1RhcmdldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBzZXVkb1N0YXRlSW1wbCA8ZW0+UHNldWRvIFN0YXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBzZXVkb1N0YXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQc2V1ZG9TdGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQU0VVRE9fU1RBVEUgPSBlSU5TVEFOQ0UuZ2V0UHNldWRvU3RhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCA8ZW0+RGlzY2lwbGluZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaXNjaXBsaW5lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJU0NJUExJTkUgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFza3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJU0NJUExJTkVfX1RBU0tTID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YmRpc2NpcGxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJU0NJUExJTkVfX1NVQkRJU0NJUExJTkUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZV9TdWJkaXNjaXBsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgV29ya2Zsb3dzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1dTID0gZUlOU1RBTkNFCi0JCQkJLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudENhdGVnb3J5SW1wbCA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRDYXRlZ29yeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05URU5UX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRJbXBsIDxlbT5Sb2xlIFNldDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfU0VUID0gZUlOU1RBTkNFLmdldFJvbGVTZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBST0xFX1NFVF9fUk9MRVMgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGwgPGVtPkRvbWFpbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Eb21haW5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvbWFpbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBET01BSU4gPSBlSU5TVEFOQ0UuZ2V0RG9tYWluKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET01BSU5fX1dPUktfUFJPRFVDVFMgPSBlSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViZG9tYWluczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRE9NQUlOX19TVUJET01BSU5TID0gZUlOU1RBTkNFLmdldERvbWFpbl9TdWJkb21haW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbCA8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbCA8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESVNDSVBMSU5FX0dST1VQSU5HID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzY2lwbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkVTID0gZUlOU1RBTkNFCi0JCQkJLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xJbXBsIDxlbT5Ub29sPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRvb2woKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVE9PTCA9IGVJTlNUQU5DRS5nZXRUb29sKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRPT0xfX1RPT0xfTUVOVE9SUyA9IGVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbCA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0R3JvdXBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9TRVRfR1JPVVBJTkcgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlIFNldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsIDxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENVU1RPTV9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIENhdGVnb3JpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyeVByb2Nlc3MoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVMSVZFUllfUFJPQ0VTUyA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ltcGwgPGVtPlByb2Nlc3M8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2VzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTID0gZUlOU1RBTkNFLmdldFByb2Nlc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm5zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX19WQUxJRF9DT05URVhUID0gZUlOU1RBTkNFLmdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsIDxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENhcGFiaWxpdHlQYXR0ZXJuKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENBUEFCSUxJVFlfUEFUVEVSTiA9IGVJTlNUQU5DRS5nZXRDYXBhYmlsaXR5UGF0dGVybigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURSA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZWQgT24gUHJvY2Vzc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZWRPblByb2Nlc3NlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvYWRtYXBJbXBsIDxlbT5Sb2FkbWFwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvYWRtYXBJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvYWRtYXAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9BRE1BUCA9IGVJTlNUQU5DRS5nZXRSb2FkbWFwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19DT01QT05FTlQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsIDxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NQYWNrYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc1BhY2thZ2VfRGlhZ3JhbXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIElPPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX1Byb2Nlc3NDb21wb25lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGx1Z2luKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9QTFVHSU4gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2VyIENoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfUExVR0lOX19CQVNFUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fQmFzZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WYXJpYWJpbGl0eUVsZW1lbnRJbXBsIDxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZhcmlhYmlsaXR5RWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFZBUklBQklMSVRZX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsIDxlbT5NZXRob2QgVW5pdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RVbml0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9VTklUID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVU5JVF9fQVVUSE9SUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0F1dGhvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfQ09ORklHVVJBVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIFZpZXdzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWaWV3PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlIENvbmZpZ3VyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VidHJhY3RlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFkZGVkIENhdGVnb3J5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ZhbWlseUltcGwgPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NGYW1pbHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NGYW1pbHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19GQU1JTFkgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0ZhbWlseSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2Vzc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NGYW1pbHlfRGVsaXZlcnlQcm9jZXNzZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbCA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kTGlicmFyeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfTElCUkFSWSA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZSA8ZW0+V29yayBPcmRlciBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFdPUktfT1JERVJfVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXJUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBzZXVkb1N0YXRlS2luZCA8ZW0+UHNldWRvIFN0YXRlIEtpbmQ8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHNldWRvU3RhdGVLaW5kCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBzZXVkb1N0YXRlS2luZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFBTRVVET19TVEFURV9LSU5EID0gZUlOU1RBTkNFLmdldFBzZXVkb1N0YXRlS2luZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFZBUklBQklMSVRZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5EYXRlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS51dGlsLkRhdGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBEQVRFID0gZUlOU1RBTkNFLmdldERhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlVyaTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubmV0LlVSSQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRVcmkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgVVJJID0gZUlOU1RBTkNFLmdldFVyaSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VW5saW1pdGVkIE5hdHVyYWw8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VW5saW1pdGVkTmF0dXJhbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBVTkxJTUlURURfTkFUVVJBTCA9IGVJTlNUQU5DRS5nZXRVbmxpbWl0ZWROYXR1cmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5TdHJpbmc8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFN0cmluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBTVFJJTkcgPSBlSU5TVEFOQ0UuZ2V0U3RyaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5TZXQ8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLnV0aWwuU2V0Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNldCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBTRVQgPSBlSU5TVEFOQ0UuZ2V0U2V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5TZXF1ZW5jZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlcXVlbmNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNFUVVFTkNFID0gZUlOU1RBTkNFLmdldFNlcXVlbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5JbnRlZ2VyPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEludGVnZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgSU5URUdFUiA9IGVJTlNUQU5DRS5nZXRJbnRlZ2VyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5GbG9hdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5GbG9hdAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRGbG9hdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBGTE9BVCA9IGVJTlNUQU5DRS5nZXRGbG9hdCgpOwotCi0JfQotCi19IC8vVW1hUGFja2FnZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9WYXJpYWJpbGl0eUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9WYXJpYWJpbGl0eUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2VkZGE5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVmFyaWFiaWxpdHlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYXJpYWJpbGl0eSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBjbGFzcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBuZXcgY2FwYWJpbGl0aWVzIGZvciBjb250ZW50IHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIENvbnRlbnQgRWxlbWVudHMgb3IgYW55IG90aGVyIE1ldGhvZCBFbGVtZW50IHRoYXQgZGVyaXZlcyBmcm9tIGl0LiAgSXQgaGFzIGJlZW4gcGxhY2VkIGluLWJldHdlZW4gdGhlIGNsYXNzZXMgTWV0aG9kIEVsZW1lbnQgYW5kIENvbnRlbnQgRWxlbWVudCBpbiB0aGUgb3ZlcmFsbCBVTUEgdGF4b25vbXkgb2YgY2xhc3NlcyB1c2luZyB0aGUgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIG1lY2hhbmlzbS4gIFRoZSBhc3NvY2lhdGlvbiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiBzaGFsbCBvbmx5IGJlIGluc3RhbnRpYXRlZCBiZXR3ZWVuIHR3byBzdWJjbGFzc2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIHNhbWUgdHlwZS4gIFRoZSBlbGVtZW50IG9uIHZhcmFpYmlsaXR5U3BlY2lhbEVsZW1lbnQgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGRlZmluZXMgYSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUgZGVmaW5pbmcgdGhlIG5hdHVyZSBvZiB0aGUgcmVsYXRpb25zaGlwIHVzaW5nIGEgbGl0ZXJhbCBmcm9tIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLgotICogVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgbWV0YS1tb2RlbCBwYWNrYWdlIE1ldGhvZCBQbHVnaW5zIGFkZHMgdGhlIGNhcGFiaWxpdGllcyBvZiB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBNZXRob2QgRWxlbWVudHMgdGhhdCBkZXJpdmUgZnJvbSBpdC4gIEJ5IGRlZmF1bHQgYWxsIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlLCBUYXNrLCBHdWlkYW5jZSBUeXBlcywgb3IgQWN0aXZpdGllcyBhcmUgZGVmaW5lZCB0byBiZSBWYXJpYWJpbGl0eSBFbGVtZW50cy4KLSAqIFZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gcHJvdmlkZXMgdW5pcXVlIG1lY2hhbmlzbXMgZm9yIGN1c3RvbWl6aW5nIG1ldGhvZCBjb250ZW50IHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LCBidXQgYnkganVzdCBiZSBhYmxlIHRvIGRlc2NyaWJlIHdpdGggc2VwYXJhdGUgb2JqZWN0cyB0aGUgZGlmZmVyZW5jZXMgKGFkZGl0aW9ucywgY2hhbmdlcywgb21pc3Npb25zKSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwuICBUaGlzIHBsdWctaW4gY29uY2VwdCBhbGxvd3MgdXNlcnMgdG8gZmFjdG9yIHRoZWlyIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gaW50ZXJyZWxhdGVkIHVuaXRzIGFuZCBldmVuIHRvIGFyY2hpdGVjdCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGxheWVycyB0aGF0IGV4dGVuZCBlYWNoIG90aGVyIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gIFRoZSByZXN1bHRpbmcgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2lnbiBjYW4gYmUgZHluYW1pY2FsbHkgY29tYmluZWQgYW5kIGFwcGxpZWQgb24gZGVtYW5kIHVzaW5nIHRoZSBpbnRlcnByZXRhdGlvbiBydWxlcyBkZWZpbmVkIGZvciBWYXJpYWJpbGl0eSBFbGVtZW50IFNwZWNpYWxpemF0aW9ucyBhc3NlbWJsaW5nIHRvIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0aGUgbW9zdCBhY2N1cmF0ZSBtZXRob2QgYW5kIHByb2Nlc3MgZGVzY3JpcHRpb25zIHBvc3NpYmxlLiAgSXQgYWxzbyBhbGxvd3MgcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRvIGV4dGVuZHMgYW5kIHRhaWxvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHRoZXkgZG8gbm90IG93biBhbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHkgdGhlaXIgcGVyc29uYWwgY2hhbmdlcyB0byB0aGVzZSB1cGdyYWRlcy4KLSAqIFZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyB0d28gdHlwZXMgb2YgdmFyaWFiaWxpdHkgYW5kIG9uZSB0eXBlIG9mIGV4dGVuc2lvbiB3aGljaCBhcmUgZm9ybWFsbHkgZGVmaW5lZCBmb3IgdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBWYXJpYWJpbGl0eUVsZW1lbnQgZXh0ZW5kcyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Im5hIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgaW4gaW5zdGFuY2Ugb2YgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbGl6YXRpb24gYXNzb2NpYXRpb24gYmV0d2VlbiB0d28gVmFyaWFiaWxpdHkgRWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZSBleGlzdHMsIHRoZW4gdGhlIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIGhvdyB0aGUgZWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudCBlbmQgb2YgdGhlIGFzc29jaWF0aW9uIGNoYW5nZXMgdGhlIENvbnRlbnQgRWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBlbmQuIFNlZSB0aGUgVmFyaWFiaWxpdHkgVHlwZSBlbnVtZXJhdGlvbiBjbGFzcyBmb3IgZGVmaW5pdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFiaWxpdHkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJuYSIgdW5pcXVlPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgdmFsdWUpOwotCi19IC8vIFZhcmlhYmlsaXR5RWxlbWVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ZhcmlhYmlsaXR5VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ZhcmlhYmlsaXR5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOWEwNGM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9WYXJpYWJpbGl0eVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFZhcmlhYmlsaXR5IFR5cGUgaXMgYW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFyaWFiaWxpdHlUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OYTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TmE8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTkFfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJuYSIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250cmlidXRlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q29udHJpYnV0ZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVFJJQlVURVNfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJjb250cmlidXRlcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05UUklCVVRFUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FeHRlbmRzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FeHRlbmRzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVORFNfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJleHRlbmRzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVEVORFMgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUExBQ0VTX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0icmVwbGFjZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQTEFDRVMgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgQ29udHJpYnV0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb2NhbCBDb250cmlidXRpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0ibG9jYWxDb250cmlidXRpb24iCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfQ09OVFJJQlVUSU9OID0gNDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIFJlcGxhY2VtZW50PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb2NhbCBSZXBsYWNlbWVudDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9ImxvY2FsUmVwbGFjZW1lbnQiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfUkVQTEFDRU1FTlQgPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kcyBSZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RXh0ZW5kcyBSZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTX1JFUExBQ0VTX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0iZXh0ZW5kc1JlcGxhY2VzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVEVORFNfUkVQTEFDRVMgPSA2OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TmE8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTkEKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBOQV9MSVRFUkFMID0gbmV3IFZhcmlhYmlsaXR5VHlwZShOQSwKLQkJCSJuYSIsICJuYSIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29udHJpYnV0ZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVFJJQlVURVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBDT05UUklCVVRFU19MSVRFUkFMID0gbmV3IFZhcmlhYmlsaXR5VHlwZSgKLQkJCUNPTlRSSUJVVEVTLCAiY29udHJpYnV0ZXMiLCAiY29udHJpYnV0ZXMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhURU5EUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIEVYVEVORFNfTElURVJBTCA9IG5ldyBWYXJpYWJpbGl0eVR5cGUoCi0JCQlFWFRFTkRTLCAiZXh0ZW5kcyIsICJleHRlbmRzIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRVBMQUNFUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIFJFUExBQ0VTX0xJVEVSQUwgPSBuZXcgVmFyaWFiaWxpdHlUeXBlKAotCQkJUkVQTEFDRVMsICJyZXBsYWNlcyIsICJyZXBsYWNlcyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgQ29udHJpYnV0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX0NPTlRSSUJVVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIExPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMID0gbmV3IFZhcmlhYmlsaXR5VHlwZSgKLQkJCUxPQ0FMX0NPTlRSSUJVVElPTiwgImxvY2FsQ29udHJpYnV0aW9uIiwgImxvY2FsQ29udHJpYnV0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfUkVQTEFDRU1FTlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBMT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMID0gbmV3IFZhcmlhYmlsaXR5VHlwZSgKLQkJCUxPQ0FMX1JFUExBQ0VNRU5ULCAibG9jYWxSZXBsYWNlbWVudCIsICJsb2NhbFJlcGxhY2VtZW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kcyBSZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTX1JFUExBQ0VTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgRVhURU5EU19SRVBMQUNFU19MSVRFUkFMID0gbmV3IFZhcmlhYmlsaXR5VHlwZSgKLQkJCUVYVEVORFNfUkVQTEFDRVMsICJleHRlbmRzUmVwbGFjZXMiLCAiZXh0ZW5kc1JlcGxhY2VzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZVtdIFZBTFVFU19BUlJBWSA9IG5ldyBWYXJpYWJpbGl0eVR5cGVbXSB7Ci0JCQlOQV9MSVRFUkFMLCBDT05UUklCVVRFU19MSVRFUkFMLCBFWFRFTkRTX0xJVEVSQUwsIFJFUExBQ0VTX0xJVEVSQUwsCi0JCQlMT0NBTF9DT05UUklCVVRJT05fTElURVJBTCwgTE9DQUxfUkVQTEFDRU1FTlRfTElURVJBTCwKLQkJCUVYVEVORFNfUkVQTEFDRVNfTElURVJBTCwgfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMKLQkJCS5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQljYXNlIE5BOgotCQkJcmV0dXJuIE5BX0xJVEVSQUw7Ci0JCWNhc2UgQ09OVFJJQlVURVM6Ci0JCQlyZXR1cm4gQ09OVFJJQlVURVNfTElURVJBTDsKLQkJY2FzZSBFWFRFTkRTOgotCQkJcmV0dXJuIEVYVEVORFNfTElURVJBTDsKLQkJY2FzZSBSRVBMQUNFUzoKLQkJCXJldHVybiBSRVBMQUNFU19MSVRFUkFMOwotCQljYXNlIExPQ0FMX0NPTlRSSUJVVElPTjoKLQkJCXJldHVybiBMT0NBTF9DT05UUklCVVRJT05fTElURVJBTDsKLQkJY2FzZSBMT0NBTF9SRVBMQUNFTUVOVDoKLQkJCXJldHVybiBMT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMOwotCQljYXNlIEVYVEVORFNfUkVQTEFDRVM6Ci0JCQlyZXR1cm4gRVhURU5EU19SRVBMQUNFU19MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZhcmlhYmlsaXR5VHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vVmFyaWFiaWxpdHlUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVmVydGV4LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVmVydGV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjYjJiNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ZlcnRleC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WZXJ0ZXg8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXgjZ2V0Q29udGFpbmVyXyA8ZW0+Q29udGFpbmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleCNnZXRPdXRnb2luZyA8ZW0+T3V0Z29pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4I2dldEluY29taW5nIDxlbT5JbmNvbWluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFZlcnRleCgpCi0gKiBAbW9kZWwKLSAqIEBleHRlbmRzIElNb2RlbE9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZlcnRleCBleHRlbmRzIElNb2RlbE9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFZlcnRleCA8ZW0+VmVydGV4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRhaW5lcjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVyPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29udGFpbmVyKFJlZ2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRWZXJ0ZXhfQ29udGFpbmVyKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFZlcnRleAotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iVmVydGV4IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZWdpb24gZ2V0Q29udGFpbmVyXygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXgjZ2V0Q29udGFpbmVyXyA8ZW0+Q29udGFpbmVyPC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVyPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29udGFpbmVyXygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29udGFpbmVyKFJlZ2lvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRnb2luZzwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbn0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk91dGdvaW5nPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0Z29pbmc8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VmVydGV4X091dGdvaW5nKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiNnZXRTb3VyY2UKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uIiBvcHBvc2l0ZT0ic291cmNlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRPdXRnb2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5jb21pbmc8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb259LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiNnZXRUYXJnZXQgPGVtPlRhcmdldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmNvbWluZzwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluY29taW5nPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFZlcnRleF9JbmNvbWluZygpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb24jZ2V0VGFyZ2V0Ci0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiIgb3Bwb3NpdGU9InRhcmdldCIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW5jb21pbmcoKTsKLQotfSAvLyBWZXJ0ZXgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV2hpdGVwYXBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1doaXRlcGFwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjFlNmQyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV2hpdGVwYXBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFdoaXRlcGFwZXJzIGFyZSBhIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXaGl0ZXBhcGVyKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdoaXRlcGFwZXIgZXh0ZW5kcyBDb25jZXB0IHsKLX0gLy8gV2hpdGVwYXBlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtCcmVha2Rvd25FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya0JyZWFrZG93bkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQxYTk5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya0JyZWFrZG93bkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaXMgYSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzUmVwZWF0YWJsZSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldExpbmtUb1ByZWRlY2Vzc29yIDxlbT5MaW5rIFRvIFByZWRlY2Vzc29yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtCcmVha2Rvd25FbGVtZW50IGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFJlcGVhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzUmVwZWF0YWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzUmVwZWF0YWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFJlcGVhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzUmVwZWF0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNSZXBlYXRhYmxlKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE9uZ29pbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzT25nb2luZyhCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzT25nb2luZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIE9uZ29pbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzT25nb2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNPbmdvaW5nKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuCi0JICogCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SXNFdmVudERyaXZlbihCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc0V2ZW50RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0V2ZW50RHJpdmVuKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rIFRvIFByZWRlY2Vzc29yPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0KLX0gLy8gV29ya0JyZWFrZG93bkVsZW1lbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrRGVmaW5pdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjYjk4NzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBXb3JrIERlZmluaXRpb24gaXMgYW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4KLSAqIFdvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrRGVmaW5pdGlvbigpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya0RlZmluaXRpb24gZXh0ZW5kcyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZWNvbmRpdGlvbihDb25zdHJhaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtEZWZpbml0aW9uX1ByZWNvbmRpdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29uc3RyYWludCBnZXRQcmVjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVjb25kaXRpb24oQ29uc3RyYWludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IHZhbHVlKTsKLQotfSAvLyBXb3JrRGVmaW5pdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtPcmRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtPcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMmI5YWM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrT3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgT3JkZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBXb3JrIE9yZGVyIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAKLSAqIChOb3RlLCBXb3JrIE9yZGVyIGlzIG5vdCBtb2RlbGVkIGFzIGFuIEFzc29jaWF0aW9uIENsYXNzIHRvIHByb3ZpZGUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyAgdG8gWE1JIGFuZCBFTUYuKQotICogVGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRQcmVkIDxlbT5QcmVkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtPcmRlciBleHRlbmRzIFByb2Nlc3NFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaW5rIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmluaXNoVG9TdGFydCI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZQotCSAqIEBzZWUgI3NldExpbmtUeXBlKFdvcmtPcmRlclR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyX0xpbmtUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmluaXNoVG9TdGFydCIgdW5pcXVlPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya09yZGVyVHlwZSBnZXRMaW5rVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZQotCSAqIEBzZWUgI2dldExpbmtUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaW5rVHlwZShXb3JrT3JkZXJUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlZChXb3JrQnJlYWtkb3duRWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXJfUHJlZCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrQnJlYWtkb3duRWxlbWVudCBnZXRQcmVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRQcmVkIDxlbT5QcmVkPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVkKFdvcmtCcmVha2Rvd25FbGVtZW50IHZhbHVlKTsKLQotfSAvLyBXb3JrT3JkZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrT3JkZXJUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya09yZGVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDFkMzkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrT3JkZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFdvcmsgT3JkZXIgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChCKSBiZWxvdykgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChBKSBiZWxvdykgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlclR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXb3JrT3JkZXJUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkZpbmlzaCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGSU5JU0hfVE9fU1RBUlRfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJmaW5pc2hUb1N0YXJ0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTklTSF9UT19TVEFSVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5GaW5pc2ggVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19GSU5JU0hfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJmaW5pc2hUb0ZpbmlzaCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5JU0hfVE9fRklOSVNIID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TdGFydCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFSVF9UT19TVEFSVF9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9InN0YXJ0VG9TdGFydCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9UT19TVEFSVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlN0YXJ0IFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFSVF9UT19GSU5JU0hfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJzdGFydFRvRmluaXNoIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RPX0ZJTklTSCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRklOSVNIX1RPX1NUQVJUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBXb3JrT3JkZXJUeXBlIEZJTklTSF9UT19TVEFSVF9MSVRFUkFMID0gbmV3IFdvcmtPcmRlclR5cGUoCi0JCQlGSU5JU0hfVE9fU1RBUlQsICJmaW5pc2hUb1N0YXJ0IiwgImZpbmlzaFRvU3RhcnQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRklOSVNIX1RPX0ZJTklTSAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgV29ya09yZGVyVHlwZSBGSU5JU0hfVE9fRklOSVNIX0xJVEVSQUwgPSBuZXcgV29ya09yZGVyVHlwZSgKLQkJCUZJTklTSF9UT19GSU5JU0gsICJmaW5pc2hUb0ZpbmlzaCIsICJmaW5pc2hUb0ZpbmlzaCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3RhcnQgVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBUlRfVE9fU1RBUlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdvcmtPcmRlclR5cGUgU1RBUlRfVE9fU1RBUlRfTElURVJBTCA9IG5ldyBXb3JrT3JkZXJUeXBlKAotCQkJU1RBUlRfVE9fU1RBUlQsICJzdGFydFRvU3RhcnQiLCAic3RhcnRUb1N0YXJ0Iik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBUlRfVE9fRklOSVNICi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBXb3JrT3JkZXJUeXBlIFNUQVJUX1RPX0ZJTklTSF9MSVRFUkFMID0gbmV3IFdvcmtPcmRlclR5cGUoCi0JCQlTVEFSVF9UT19GSU5JU0gsICJzdGFydFRvRmluaXNoIiwgInN0YXJ0VG9GaW5pc2giKTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFdvcmtPcmRlclR5cGVbXSBWQUxVRVNfQVJSQVkgPSBuZXcgV29ya09yZGVyVHlwZVtdIHsKLQkJCUZJTklTSF9UT19TVEFSVF9MSVRFUkFMLCBGSU5JU0hfVE9fRklOSVNIX0xJVEVSQUwsCi0JCQlTVEFSVF9UT19TVEFSVF9MSVRFUkFMLCBTVEFSVF9UT19GSU5JU0hfTElURVJBTCwgfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cwotCQkJLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVdvcmtPcmRlclR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXJUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJV29ya09yZGVyVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJY2FzZSBGSU5JU0hfVE9fU1RBUlQ6Ci0JCQlyZXR1cm4gRklOSVNIX1RPX1NUQVJUX0xJVEVSQUw7Ci0JCWNhc2UgRklOSVNIX1RPX0ZJTklTSDoKLQkJCXJldHVybiBGSU5JU0hfVE9fRklOSVNIX0xJVEVSQUw7Ci0JCWNhc2UgU1RBUlRfVE9fU1RBUlQ6Ci0JCQlyZXR1cm4gU1RBUlRfVE9fU1RBUlRfTElURVJBTDsKLQkJY2FzZSBTVEFSVF9UT19GSU5JU0g6Ci0JCQlyZXR1cm4gU1RBUlRfVE9fRklOSVNIX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgV29ya09yZGVyVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vV29ya09yZGVyVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTg2ODNhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFdvcmsgUHJvZHVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLSAqIEEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0UmVwb3J0cyA8ZW0+UmVwb3J0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRUZW1wbGF0ZXMgPGVtPlRlbXBsYXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRUb29sTWVudG9ycyA8ZW0+VG9vbCBNZW50b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdCBleHRlbmRzIENvbnRlbnRFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwb3J0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcG9ydHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSZXBvcnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRlbXBsYXRlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBsYXRlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRUZW1wbGF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3IiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFRvb2xNZW50b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi19IC8vIFdvcmtQcm9kdWN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTMyMjUxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0SW1wYWN0T2ZOb3RIYXZpbmcgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4dGVybmFsSWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXh0ZXJuYWxJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQgPGVtPkV4dGVybmFsIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZXJuYWxJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1cnBvc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHVycG9zZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1cnBvc2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEltcGFjdE9mTm90SGF2aW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbXBhY3RPZk5vdEhhdmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEltcGFjdE9mTm90SGF2aW5nIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbXBhY3RPZk5vdEhhdmluZyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWFzb25zRm9yTm90TmVlZGluZyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzgzZGQyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RlZEJ5IDxlbT5JbXBhY3RlZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0cyA8ZW0+SW1wYWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RGVsaXZlcmFibGVQYXJ0cyA8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGV4dGVuZHMgRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgCi0JICogRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0aXZpdHlFbnRyeVN0YXRlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdGl2aXR5RW50cnlTdGF0ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLgotCSAqIEZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0aXZpdHlFeGl0U3RhdGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZpdHlFeGl0U3RhdGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V29ya1Byb2R1Y3QoV29ya1Byb2R1Y3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3QgZ2V0V29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtQcm9kdWN0KFdvcmtQcm9kdWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcGFjdGVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdHMgPGVtPkltcGFjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW1wYWN0ZWQgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3RlZCBCeTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBvcHBvc2l0ZT0iaW1wYWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW1wYWN0ZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW1wYWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RlZEJ5IDxlbT5JbXBhY3RlZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbXBhY3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RlZEJ5Ci0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBvcHBvc2l0ZT0iaW1wYWN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW1wYWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsaXZlcmFibGUgUGFydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlbGl2ZXJhYmxlUGFydHMoKTsKLQotfSAvLyBXb3JrUHJvZHVjdERlc2NyaXB0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWE0NTlkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3RUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogV29yayBQcm9kdWN0IFR5cGUgaXMgYSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICJDbGFzcyBEaWFncmFtIiwgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICJTcGVjaWZpY2F0aW9uIiwgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZSNnZXRXb3JrUHJvZHVjdHMgPGVtPldvcmsgUHJvZHVjdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdFR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3RUeXBlIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0V29ya1Byb2R1Y3RzKCk7Ci0KLX0gLy8gV29ya1Byb2R1Y3RUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BY3Rpdml0eURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY1ZmNlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BY3Rpdml0eURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwjZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwjZ2V0SG93dG9TdGFmZiA8ZW0+SG93dG8gU3RhZmY8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwKLQkJaW1wbGVtZW50cyBBY3Rpdml0eURlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVUlBPU0VfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwdXJwb3NlID0gUFVSUE9TRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRlcm5hdGl2ZXMoKSA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMVEVSTkFUSVZFU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWx0ZXJuYXRpdmVzKCkgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFsdGVybmF0aXZlcyA9IEFMVEVSTkFUSVZFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb3d0b1N0YWZmKCkgPGVtPkhvd3RvIFN0YWZmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIb3d0b1N0YWZmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIT1dUT19TVEFGRl9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG93dG9TdGFmZigpIDxlbT5Ib3d0byBTdGFmZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SG93dG9TdGFmZigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBob3d0b1N0YWZmID0gSE9XVE9fU1RBRkZfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVycG9zZSgpIHsKLQkJcmV0dXJuIHB1cnBvc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVycG9zZShTdHJpbmcgbmV3UHVycG9zZSkgewotCQlTdHJpbmcgb2xkUHVycG9zZSA9IHB1cnBvc2U7Ci0JCXB1cnBvc2UgPSBuZXdQdXJwb3NlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFLCBvbGRQdXJwb3NlLAotCQkJCQlwdXJwb3NlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbHRlcm5hdGl2ZXMoKSB7Ci0JCXJldHVybiBhbHRlcm5hdGl2ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWx0ZXJuYXRpdmVzKFN0cmluZyBuZXdBbHRlcm5hdGl2ZXMpIHsKLQkJU3RyaW5nIG9sZEFsdGVybmF0aXZlcyA9IGFsdGVybmF0aXZlczsKLQkJYWx0ZXJuYXRpdmVzID0gbmV3QWx0ZXJuYXRpdmVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMsCi0JCQkJCW9sZEFsdGVybmF0aXZlcywgYWx0ZXJuYXRpdmVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIb3d0b1N0YWZmKCkgewotCQlyZXR1cm4gaG93dG9TdGFmZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb3d0b1N0YWZmKFN0cmluZyBuZXdIb3d0b1N0YWZmKSB7Ci0JCVN0cmluZyBvbGRIb3d0b1N0YWZmID0gaG93dG9TdGFmZjsKLQkJaG93dG9TdGFmZiA9IG5ld0hvd3RvU3RhZmY7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGLAotCQkJCQlvbGRIb3d0b1N0YWZmLCBob3d0b1N0YWZmKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlyZXR1cm4gZ2V0UHVycG9zZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCXJldHVybiBnZXRBbHRlcm5hdGl2ZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRjoKLQkJCXJldHVybiBnZXRIb3d0b1N0YWZmKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJc2V0UHVycG9zZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJc2V0QWx0ZXJuYXRpdmVzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRjoKLQkJCXNldEhvd3RvU3RhZmYoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJc2V0UHVycG9zZShQVVJQT1NFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlzZXRBbHRlcm5hdGl2ZXMoQUxURVJOQVRJVkVTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRjoKLQkJCXNldEhvd3RvU3RhZmYoSE9XVE9fU1RBRkZfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlyZXR1cm4gUFVSUE9TRV9FREVGQVVMVCA9PSBudWxsID8gcHVycG9zZSAhPSBudWxsCi0JCQkJCTogIVBVUlBPU0VfRURFRkFVTFQuZXF1YWxzKHB1cnBvc2UpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCXJldHVybiBBTFRFUk5BVElWRVNfRURFRkFVTFQgPT0gbnVsbCA/IGFsdGVybmF0aXZlcyAhPSBudWxsCi0JCQkJCTogIUFMVEVSTkFUSVZFU19FREVGQVVMVC5lcXVhbHMoYWx0ZXJuYXRpdmVzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRjoKLQkJCXJldHVybiBIT1dUT19TVEFGRl9FREVGQVVMVCA9PSBudWxsID8gaG93dG9TdGFmZiAhPSBudWxsCi0JCQkJCTogIUhPV1RPX1NUQUZGX0VERUZBVUxULmVxdWFscyhob3d0b1N0YWZmKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwdXJwb3NlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHB1cnBvc2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsdGVybmF0aXZlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhbHRlcm5hdGl2ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhvd3RvU3RhZmY6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaG93dG9TdGFmZik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BY3Rpdml0eUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FjdGl2aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZGZmOTE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FjdGl2aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRCcmVha2Rvd25FbGVtZW50cyA8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFJvYWRtYXBzIDxlbT5Sb2FkbWFwczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRDaGVja2xpc3RzIDxlbT5DaGVja2xpc3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldENvbmNlcHRzIDxlbT5Db25jZXB0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRFeGFtcGxlcyA8ZW0+RXhhbXBsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0R3VpZGVsaW5lcyA8ZW0+R3VpZGVsaW5lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRSZXVzYWJsZUFzc2V0cyA8ZW0+UmV1c2FibGUgQXNzZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldElzRW5hY3RhYmxlIDxlbT5JcyBFbmFjdGFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUltcGwgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cyBBY3Rpdml0eSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA9IFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlFbGVtZW50IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludCBwcmVjb25kaXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludCBwb3N0Y29uZGl0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJyZWFrZG93bkVsZW1lbnRzKCkgPGVtPkJyZWFrZG93biBFbGVtZW50czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvYWRtYXBzKCkgPGVtPlJvYWRtYXBzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvYWRtYXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgcm9hZG1hcHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc3VwcG9ydGluZ01hdGVyaWFscyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGVja2xpc3RzKCkgPGVtPkNoZWNrbGlzdHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hlY2tsaXN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNoZWNrbGlzdHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uY2VwdHMoKSA8ZW0+Q29uY2VwdHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uY2VwdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb25jZXB0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGFtcGxlcygpIDxlbT5FeGFtcGxlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGFtcGxlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGV4YW1wbGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEd1aWRlbGluZXMoKSA8ZW0+R3VpZGVsaW5lczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHdWlkZWxpbmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZ3VpZGVsaW5lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXVzYWJsZUFzc2V0cygpIDxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV1c2FibGVBc3NldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXVzYWJsZUFzc2V0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNFbmFjdGFibGUoKSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc0VuYWN0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX0VOQUNUQUJMRV9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0VuYWN0YWJsZSgpIDxlbT5JcyBFbmFjdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzRW5hY3RhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc0VuYWN0YWJsZSA9IElTX0VOQUNUQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldENoZWNrbGlzdHMoKSB7Ci0JCWlmIChjaGVja2xpc3RzID09IG51bGwpIHsKLQkJCWNoZWNrbGlzdHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KENoZWNrbGlzdC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fQ0hFQ0tMSVNUUyk7Ci0JCX0KLQkJcmV0dXJuIGNoZWNrbGlzdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29uY2VwdHMoKSB7Ci0JCWlmIChjb25jZXB0cyA9PSBudWxsKSB7Ci0JCQljb25jZXB0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoQ29uY2VwdC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fQ09OQ0VQVFMpOwotCQl9Ci0JCXJldHVybiBjb25jZXB0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIG5ld1ZhcmlhYmlsaXR5VHlwZSkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQl2YXJpYWJpbGl0eVR5cGUgPSBuZXdWYXJpYWJpbGl0eVR5cGUgPT0gbnVsbCA/IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQKLQkJCQk6IG5ld1ZhcmlhYmlsaXR5VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRSwgb2xkVmFyaWFiaWxpdHlUeXBlLAotCQkJCQl2YXJpYWJpbGl0eVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50IGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCWlmICh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGwKLQkJCQkmJiAoKEVPYmplY3QpIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlUmVzb2x2ZVByb3h5KG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpOwotCQkJaWYgKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJCQlvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LAotCQkJCQkJCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50IGJhc2ljR2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsCi0JCQkJCW9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBnZXRQcmVjb25kaXRpb24oKSB7Ci0JCWlmIChwcmVjb25kaXRpb24gIT0gbnVsbCAmJiAoKEVPYmplY3QpIHByZWNvbmRpdGlvbikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCXByZWNvbmRpdGlvbiA9IChDb25zdHJhaW50KSBlUmVzb2x2ZVByb3h5KG9sZFByZWNvbmRpdGlvbik7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG9sZFByZWNvbmRpdGlvbikgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdQcmVjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb247Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFByZWNvbmRpdGlvbgotCQkJCQkJLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sIG51bGwsIG51bGwpOwotCQkJCWlmIChuZXdQcmVjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UHJlY29uZGl0aW9uLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sIG51bGwsCi0JCQkJCQkJbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgb2xkUHJlY29uZGl0aW9uLAotCQkJCQkJCXByZWNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgYmFzaWNHZXRQcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlY29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UHJlY29uZGl0aW9uLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb25zdHJhaW50IG9sZFByZWNvbmRpdGlvbiA9IHByZWNvbmRpdGlvbjsKLQkJcHJlY29uZGl0aW9uID0gbmV3UHJlY29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sCi0JCQkJCW9sZFByZWNvbmRpdGlvbiwgbmV3UHJlY29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbikgewotCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IHByZWNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb24pCi0JCQkJCQkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQcmVjb25kaXRpb24pCi0JCQkJCQkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVjb25kaXRpb24obmV3UHJlY29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OLCBuZXdQcmVjb25kaXRpb24sCi0JCQkJCW5ld1ByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQlwb3N0Y29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBvbGRQb3N0Y29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Bvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQb3N0Y29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbnVsbCwKLQkJCQkJCW51bGwpOwotCQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1Bvc3Rjb25kaXRpb24uZUludmVyc2VBZGQodGhpcywKLQkJCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT04sIG51bGwsCi0JCQkJCQkJbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT04sCi0JCQkJCQkJb2xkUG9zdGNvbmRpdGlvbiwgcG9zdGNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUG9zdGNvbmRpdGlvbiA9IHBvc3Rjb25kaXRpb247Ci0JCXBvc3Rjb25kaXRpb24gPSBuZXdQb3N0Y29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OLAotCQkJCQlvbGRQb3N0Y29uZGl0aW9uLCBuZXdQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IHBvc3Rjb25kaXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1Bvc3Rjb25kaXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdGNvbmRpdGlvbihuZXdQb3N0Y29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbmV3UG9zdGNvbmRpdGlvbiwKLQkJCQkJbmV3UG9zdGNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEJyZWFrZG93bkVsZW1lbnRzKCkgewotCQlpZiAoYnJlYWtkb3duRWxlbWVudHMgPT0gbnVsbCkgewotCQkJYnJlYWtkb3duRWxlbWVudHMgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QoCi0JCQkJCUJyZWFrZG93bkVsZW1lbnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUywKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUyk7Ci0JCX0KLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJvYWRtYXBzKCkgewotCQlpZiAocm9hZG1hcHMgPT0gbnVsbCkgewotCQkJcm9hZG1hcHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFJvYWRtYXAuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVBTKTsKLQkJfQotCQlyZXR1cm4gcm9hZG1hcHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpIHsKLQkJaWYgKHN1cHBvcnRpbmdNYXRlcmlhbHMgPT0gbnVsbCkgewotCQkJc3VwcG9ydGluZ01hdGVyaWFscyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTFMpOwotCQl9Ci0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4YW1wbGVzKCkgewotCQlpZiAoZXhhbXBsZXMgPT0gbnVsbCkgewotCQkJZXhhbXBsZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KEV4YW1wbGUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX0VYQU1QTEVTKTsKLQkJfQotCQlyZXR1cm4gZXhhbXBsZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0R3VpZGVsaW5lcygpIHsKLQkJaWYgKGd1aWRlbGluZXMgPT0gbnVsbCkgewotCQkJZ3VpZGVsaW5lcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoR3VpZGVsaW5lLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19HVUlERUxJTkVTKTsKLQkJfQotCQlyZXR1cm4gZ3VpZGVsaW5lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXVzYWJsZUFzc2V0cygpIHsKLQkJaWYgKHJldXNhYmxlQXNzZXRzID09IG51bGwpIHsKLQkJCXJldXNhYmxlQXNzZXRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChSZXVzYWJsZUFzc2V0LmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLkFDVElWSVRZX19SRVVTQUJMRV9BU1NFVFMpOwotCQl9Ci0JCXJldHVybiByZXVzYWJsZUFzc2V0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc0VuYWN0YWJsZSgpIHsKLQkJcmV0dXJuIGlzRW5hY3RhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzRW5hY3RhYmxlKEJvb2xlYW4gbmV3SXNFbmFjdGFibGUpIHsKLQkJQm9vbGVhbiBvbGRJc0VuYWN0YWJsZSA9IGlzRW5hY3RhYmxlOwotCQlpc0VuYWN0YWJsZSA9IG5ld0lzRW5hY3RhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19JU19FTkFDVEFCTEUsIG9sZElzRW5hY3RhYmxlLAotCQkJCQlpc0VuYWN0YWJsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0QnJlYWtkb3duRWxlbWVudHMoKSkuYmFzaWNBZGQob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFByZWNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRCcmVha2Rvd25FbGVtZW50cygpKS5iYXNpY1JlbW92ZSgKLQkJCQkJb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlY29uZGl0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVjb25kaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFBvc3Rjb25kaXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFBvc3Rjb25kaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlyZXR1cm4gZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQUzoKLQkJCXJldHVybiBnZXRSb2FkbWFwcygpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUxTOgotCQkJcmV0dXJuIGdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19DSEVDS0xJU1RTOgotCQkJcmV0dXJuIGdldENoZWNrbGlzdHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19DT05DRVBUUzoKLQkJCXJldHVybiBnZXRDb25jZXB0cygpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0VYQU1QTEVTOgotCQkJcmV0dXJuIGdldEV4YW1wbGVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1VJREVMSU5FUzoKLQkJCXJldHVybiBnZXRHdWlkZWxpbmVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVRTOgotCQkJcmV0dXJuIGdldFJldXNhYmxlQXNzZXRzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOgotCQkJcmV0dXJuIGdldElzRW5hY3RhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJc2V0VmFyaWFiaWxpdHlUeXBlKChWYXJpYWJpbGl0eVR5cGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlnZXRCcmVha2Rvd25FbGVtZW50cygpLmNsZWFyKCk7Ci0JCQlnZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVBTOgotCQkJZ2V0Um9hZG1hcHMoKS5jbGVhcigpOwotCQkJZ2V0Um9hZG1hcHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0NIRUNLTElTVFM6Ci0JCQlnZXRDaGVja2xpc3RzKCkuY2xlYXIoKTsKLQkJCWdldENoZWNrbGlzdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19DT05DRVBUUzoKLQkJCWdldENvbmNlcHRzKCkuY2xlYXIoKTsKLQkJCWdldENvbmNlcHRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fRVhBTVBMRVM6Ci0JCQlnZXRFeGFtcGxlcygpLmNsZWFyKCk7Ci0JCQlnZXRFeGFtcGxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dVSURFTElORVM6Ci0JCQlnZXRHdWlkZWxpbmVzKCkuY2xlYXIoKTsKLQkJCWdldEd1aWRlbGluZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19SRVVTQUJMRV9BU1NFVFM6Ci0JCQlnZXRSZXVzYWJsZUFzc2V0cygpLmNsZWFyKCk7Ci0JCQlnZXRSZXVzYWJsZUFzc2V0cygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRToKLQkJCXNldElzRW5hY3RhYmxlKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlzZXRWYXJpYWJpbGl0eVR5cGUoVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOgotCQkJZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVBTOgotCQkJZ2V0Um9hZG1hcHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUxTOgotCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQ0hFQ0tMSVNUUzoKLQkJCWdldENoZWNrbGlzdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0NPTkNFUFRTOgotCQkJZ2V0Q29uY2VwdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0VYQU1QTEVTOgotCQkJZ2V0RXhhbXBsZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dVSURFTElORVM6Ci0JCQlnZXRHdWlkZWxpbmVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19SRVVTQUJMRV9BU1NFVFM6Ci0JCQlnZXRSZXVzYWJsZUFzc2V0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOgotCQkJc2V0SXNFbmFjdGFibGUoSVNfRU5BQ1RBQkxFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZSAhPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBwcmVjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJcmV0dXJuIHBvc3Rjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlyZXR1cm4gYnJlYWtkb3duRWxlbWVudHMgIT0gbnVsbCAmJiAhYnJlYWtkb3duRWxlbWVudHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVBTOgotCQkJcmV0dXJuIHJvYWRtYXBzICE9IG51bGwgJiYgIXJvYWRtYXBzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWxzICE9IG51bGwKLQkJCQkJJiYgIXN1cHBvcnRpbmdNYXRlcmlhbHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0NIRUNLTElTVFM6Ci0JCQlyZXR1cm4gY2hlY2tsaXN0cyAhPSBudWxsICYmICFjaGVja2xpc3RzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19DT05DRVBUUzoKLQkJCXJldHVybiBjb25jZXB0cyAhPSBudWxsICYmICFjb25jZXB0cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fRVhBTVBMRVM6Ci0JCQlyZXR1cm4gZXhhbXBsZXMgIT0gbnVsbCAmJiAhZXhhbXBsZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dVSURFTElORVM6Ci0JCQlyZXR1cm4gZ3VpZGVsaW5lcyAhPSBudWxsICYmICFndWlkZWxpbmVzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19SRVVTQUJMRV9BU1NFVFM6Ci0JCQlyZXR1cm4gcmV1c2FibGVBc3NldHMgIT0gbnVsbCAmJiAhcmV1c2FibGVBc3NldHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRToKLQkJCXJldHVybiBJU19FTkFDVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IGlzRW5hY3RhYmxlICE9IG51bGwKLQkJCQkJOiAhSVNfRU5BQ1RBQkxFX0VERUZBVUxULmVxdWFscyhpc0VuYWN0YWJsZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFyaWFiaWxpdHlUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5VHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNFbmFjdGFibGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNFbmFjdGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BY3Rpdml0eUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BcnRpZmFjdERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NTFiMzgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgQXJ0aWZhY3REZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZPdXRsaW5lKCkgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJyaWVmT3V0bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfT1VUTElORV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZPdXRsaW5lKCkgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJyaWVmT3V0bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBicmllZk91dGxpbmUgPSBCUklFRl9PVVRMSU5FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVwcmVzZW50YXRpb25PcHRpb25zID0gUkVQUkVTRU5UQVRJT05fT1BUSU9OU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZk91dGxpbmUoKSB7Ci0JCXJldHVybiBicmllZk91dGxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnJpZWZPdXRsaW5lKFN0cmluZyBuZXdCcmllZk91dGxpbmUpIHsKLQkJU3RyaW5nIG9sZEJyaWVmT3V0bGluZSA9IGJyaWVmT3V0bGluZTsKLQkJYnJpZWZPdXRsaW5lID0gbmV3QnJpZWZPdXRsaW5lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FLAotCQkJCQlvbGRCcmllZk91dGxpbmUsIGJyaWVmT3V0bGluZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgewotCQlyZXR1cm4gcmVwcmVzZW50YXRpb25PcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhTdHJpbmcgbmV3UmVwcmVzZW50YXRpb25PcHRpb25zKSB7Ci0JCVN0cmluZyBvbGRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPSByZXByZXNlbnRhdGlvbk9wdGlvbnM7Ci0JCXJlcHJlc2VudGF0aW9uT3B0aW9ucyA9IG5ld1JlcHJlc2VudGF0aW9uT3B0aW9uczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUywKLQkJCQkJb2xkUmVwcmVzZW50YXRpb25PcHRpb25zLCByZXByZXNlbnRhdGlvbk9wdGlvbnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCXJldHVybiBnZXRCcmllZk91dGxpbmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJcmV0dXJuIGdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCXNldEJyaWVmT3V0bGluZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCXNldFJlcHJlc2VudGF0aW9uT3B0aW9ucygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkU6Ci0JCQlzZXRCcmllZk91dGxpbmUoQlJJRUZfT1VUTElORV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCXNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJcmV0dXJuIEJSSUVGX09VVExJTkVfRURFRkFVTFQgPT0gbnVsbCA/IGJyaWVmT3V0bGluZSAhPSBudWxsCi0JCQkJCTogIUJSSUVGX09VVExJTkVfRURFRkFVTFQuZXF1YWxzKGJyaWVmT3V0bGluZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCXJldHVybiBSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUID09IG51bGwgPyByZXByZXNlbnRhdGlvbk9wdGlvbnMgIT0gbnVsbAotCQkJCQk6ICFSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhyZXByZXNlbnRhdGlvbk9wdGlvbnMpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGJyaWVmT3V0bGluZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChicmllZk91dGxpbmUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlcHJlc2VudGF0aW9uT3B0aW9uczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyZXByZXNlbnRhdGlvbk9wdGlvbnMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BcnRpZmFjdERlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXJ0aWZhY3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BcnRpZmFjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODdlMGFhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BcnRpZmFjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFydGlmYWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3RJbXBsI2dldENvbnRhaW5lckFydGlmYWN0IDxlbT5Db250YWluZXIgQXJ0aWZhY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdEltcGwjZ2V0Q29udGFpbmVkQXJ0aWZhY3RzIDxlbT5Db250YWluZWQgQXJ0aWZhY3RzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RJbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3RJbXBsIGltcGxlbWVudHMgQXJ0aWZhY3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkgPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY29udGFpbmVkQXJ0aWZhY3RzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkFSVElGQUNUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdCBnZXRDb250YWluZXJBcnRpZmFjdCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQXJ0aWZhY3QpIGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3QgYmFzaWNHZXRDb250YWluZXJBcnRpZmFjdCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQXJ0aWZhY3QpIGVJbnRlcm5hbENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbnRhaW5lckFydGlmYWN0KAotCQkJQXJ0aWZhY3QgbmV3Q29udGFpbmVyQXJ0aWZhY3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdDb250YWluZXJBcnRpZmFjdCwKLQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1QsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250YWluZXJBcnRpZmFjdChBcnRpZmFjdCBuZXdDb250YWluZXJBcnRpZmFjdCkgewotCQlpZiAobmV3Q29udGFpbmVyQXJ0aWZhY3QgIT0gZUludGVybmFsQ29udGFpbmVyKCkKLQkJCQl8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1QgJiYgbmV3Q29udGFpbmVyQXJ0aWZhY3QgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCAoRU9iamVjdCkgbmV3Q29udGFpbmVyQXJ0aWZhY3QpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3Q29udGFpbmVyQXJ0aWZhY3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0NvbnRhaW5lckFydGlmYWN0KS5lSW52ZXJzZUFkZCgKLQkJCQkJCXRoaXMsIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMsCi0JCQkJCQlBcnRpZmFjdC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb250YWluZXJBcnRpZmFjdChuZXdDb250YWluZXJBcnRpZmFjdCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCwKLQkJCQkJbmV3Q29udGFpbmVyQXJ0aWZhY3QsIG5ld0NvbnRhaW5lckFydGlmYWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkgewotCQlpZiAoY29udGFpbmVkQXJ0aWZhY3RzID09IG51bGwpIHsKLQkJCWNvbnRhaW5lZEFydGlmYWN0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0LlJlc29sdmluZygKLQkJCQkJQXJ0aWZhY3QuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMsCi0JCQkJCVVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lZEFydGlmYWN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVDoKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0Q29udGFpbmVyQXJ0aWZhY3QoKEFydGlmYWN0KSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldENvbnRhaW5lZEFydGlmYWN0cygpKS5iYXNpY0FkZChvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUOgotCQkJcmV0dXJuIGJhc2ljU2V0Q29udGFpbmVyQXJ0aWZhY3QobnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldENvbnRhaW5lZEFydGlmYWN0cygpKS5iYXNpY1JlbW92ZSgKLQkJCQkJb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVDoKLQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTLCBBcnRpZmFjdC5jbGFzcywKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1Q6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkJCXJldHVybiBiYXNpY0dldENvbnRhaW5lckFydGlmYWN0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUzoKLQkJCXJldHVybiBnZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVDoKLQkJCXNldENvbnRhaW5lckFydGlmYWN0KChBcnRpZmFjdCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFM6Ci0JCQlnZXRDb250YWluZWRBcnRpZmFjdHMoKS5jbGVhcigpOwotCQkJZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVDoKLQkJCXNldENvbnRhaW5lckFydGlmYWN0KChBcnRpZmFjdCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUzoKLQkJCWdldENvbnRhaW5lZEFydGlmYWN0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUOgotCQkJcmV0dXJuIGJhc2ljR2V0Q29udGFpbmVyQXJ0aWZhY3QoKSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFM6Ci0JCQlyZXR1cm4gY29udGFpbmVkQXJ0aWZhY3RzICE9IG51bGwgJiYgIWNvbnRhaW5lZEFydGlmYWN0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0FydGlmYWN0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDk3ODE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCNnZXRVc2FnZUd1aWRhbmNlIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZUd1aWRhbmNlKCkgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0FHRV9HVUlEQU5DRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VHdWlkYW5jZSgpIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2FnZUd1aWRhbmNlID0gVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVc2FnZUd1aWRhbmNlKCkgewotCQlyZXR1cm4gdXNhZ2VHdWlkYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2FnZUd1aWRhbmNlKFN0cmluZyBuZXdVc2FnZUd1aWRhbmNlKSB7Ci0JCVN0cmluZyBvbGRVc2FnZUd1aWRhbmNlID0gdXNhZ2VHdWlkYW5jZTsKLQkJdXNhZ2VHdWlkYW5jZSA9IG5ld1VzYWdlR3VpZGFuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFLAotCQkJCQlvbGRVc2FnZUd1aWRhbmNlLCB1c2FnZUd1aWRhbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJcmV0dXJuIGdldFVzYWdlR3VpZGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJc2V0VXNhZ2VHdWlkYW5jZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJc2V0VXNhZ2VHdWlkYW5jZShVU0FHRV9HVUlEQU5DRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQlyZXR1cm4gVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHVzYWdlR3VpZGFuY2UgIT0gbnVsbAotCQkJCQk6ICFVU0FHRV9HVUlEQU5DRV9FREVGQVVMVC5lcXVhbHModXNhZ2VHdWlkYW5jZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXNhZ2VHdWlkYW5jZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh1c2FnZUd1aWRhbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkYzk1NzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldElzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldElzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFByZXNlbnRlZEJlZm9yZSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFN1cGVyQWN0aXZpdGllcyA8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJyZWFrZG93bkVsZW1lbnRJbXBsIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWZpeCgpIDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXggPSBQUkVGSVhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNQbGFubmVkKCkgPGVtPklzIFBsYW5uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzUGxhbm5lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX1BMQU5ORURfRURFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1BsYW5uZWQoKSA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNQbGFubmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc1BsYW5uZWQgPSBJU19QTEFOTkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKSA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKSA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzT3B0aW9uYWwoKSA8ZW0+SXMgT3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19PUFRJT05BTF9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc09wdGlvbmFsKCkgPGVtPklzIE9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc09wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc09wdGlvbmFsID0gSVNfT1BUSU9OQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50ZWRBZnRlcigpIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRlZEFmdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudCBwcmVzZW50ZWRBZnRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50ZWRCZWZvcmUoKSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudCBwcmVzZW50ZWRCZWZvcmUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGxhbm5pbmdEYXRhKCkgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBsYW5uaW5nRGF0YSBwbGFubmluZ0RhdGEgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cGVyQWN0aXZpdGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5IHN1cGVyQWN0aXZpdGllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gcHJlZml4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgbmV3UHJlZml4KSB7Ci0JCVN0cmluZyBvbGRQcmVmaXggPSBwcmVmaXg7Ci0JCXByZWZpeCA9IG5ld1ByZWZpeDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYLCBvbGRQcmVmaXgsIHByZWZpeCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzUGxhbm5lZCgpIHsKLQkJcmV0dXJuIGlzUGxhbm5lZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1BsYW5uZWQoQm9vbGVhbiBuZXdJc1BsYW5uZWQpIHsKLQkJQm9vbGVhbiBvbGRJc1BsYW5uZWQgPSBpc1BsYW5uZWQ7Ci0JCWlzUGxhbm5lZCA9IG5ld0lzUGxhbm5lZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCwgb2xkSXNQbGFubmVkLAotCQkJCQlpc1BsYW5uZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgewotCQlyZXR1cm4gaGFzTXVsdGlwbGVPY2N1cnJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKEJvb2xlYW4gbmV3SGFzTXVsdGlwbGVPY2N1cnJlbmNlcykgewotCQlCb29sZWFuIG9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzOwotCQloYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gbmV3SGFzTXVsdGlwbGVPY2N1cnJlbmNlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLAotCQkJCQlvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzLCBoYXNNdWx0aXBsZU9jY3VycmVuY2VzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIGlzT3B0aW9uYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNPcHRpb25hbChCb29sZWFuIG5ld0lzT3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGRJc09wdGlvbmFsID0gaXNPcHRpb25hbDsKLQkJaXNPcHRpb25hbCA9IG5ld0lzT3B0aW9uYWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMLCBvbGRJc09wdGlvbmFsLAotCQkJCQlpc09wdGlvbmFsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0UHJlc2VudGVkQWZ0ZXIoKSB7Ci0JCWlmIChwcmVzZW50ZWRBZnRlciAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlc2VudGVkQWZ0ZXIpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQcmVzZW50ZWRBZnRlciA9IChJbnRlcm5hbEVPYmplY3QpIHByZXNlbnRlZEFmdGVyOwotCQkJcHJlc2VudGVkQWZ0ZXIgPSAoQnJlYWtkb3duRWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRQcmVzZW50ZWRBZnRlcik7Ci0JCQlpZiAocHJlc2VudGVkQWZ0ZXIgIT0gb2xkUHJlc2VudGVkQWZ0ZXIpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiwKLQkJCQkJCQlvbGRQcmVzZW50ZWRBZnRlciwgcHJlc2VudGVkQWZ0ZXIpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlc2VudGVkQWZ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnQgYmFzaWNHZXRQcmVzZW50ZWRBZnRlcigpIHsKLQkJcmV0dXJuIHByZXNlbnRlZEFmdGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRlZEFmdGVyKEJyZWFrZG93bkVsZW1lbnQgbmV3UHJlc2VudGVkQWZ0ZXIpIHsKLQkJQnJlYWtkb3duRWxlbWVudCBvbGRQcmVzZW50ZWRBZnRlciA9IHByZXNlbnRlZEFmdGVyOwotCQlwcmVzZW50ZWRBZnRlciA9IG5ld1ByZXNlbnRlZEFmdGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIsCi0JCQkJCW9sZFByZXNlbnRlZEFmdGVyLCBwcmVzZW50ZWRBZnRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50IGdldFByZXNlbnRlZEJlZm9yZSgpIHsKLQkJaWYgKHByZXNlbnRlZEJlZm9yZSAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlc2VudGVkQmVmb3JlKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlc2VudGVkQmVmb3JlID0gKEludGVybmFsRU9iamVjdCkgcHJlc2VudGVkQmVmb3JlOwotCQkJcHJlc2VudGVkQmVmb3JlID0gKEJyZWFrZG93bkVsZW1lbnQpIGVSZXNvbHZlUHJveHkob2xkUHJlc2VudGVkQmVmb3JlKTsKLQkJCWlmIChwcmVzZW50ZWRCZWZvcmUgIT0gb2xkUHJlc2VudGVkQmVmb3JlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFLAotCQkJCQkJCW9sZFByZXNlbnRlZEJlZm9yZSwgcHJlc2VudGVkQmVmb3JlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZXNlbnRlZEJlZm9yZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudCBiYXNpY0dldFByZXNlbnRlZEJlZm9yZSgpIHsKLQkJcmV0dXJuIHByZXNlbnRlZEJlZm9yZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50ZWRCZWZvcmUoQnJlYWtkb3duRWxlbWVudCBuZXdQcmVzZW50ZWRCZWZvcmUpIHsKLQkJQnJlYWtkb3duRWxlbWVudCBvbGRQcmVzZW50ZWRCZWZvcmUgPSBwcmVzZW50ZWRCZWZvcmU7Ci0JCXByZXNlbnRlZEJlZm9yZSA9IG5ld1ByZXNlbnRlZEJlZm9yZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSwKLQkJCQkJb2xkUHJlc2VudGVkQmVmb3JlLCBwcmVzZW50ZWRCZWZvcmUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGxhbm5pbmdEYXRhIGdldFBsYW5uaW5nRGF0YSgpIHsKLQkJaWYgKHBsYW5uaW5nRGF0YSAhPSBudWxsICYmICgoRU9iamVjdCkgcGxhbm5pbmdEYXRhKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUGxhbm5pbmdEYXRhID0gKEludGVybmFsRU9iamVjdCkgcGxhbm5pbmdEYXRhOwotCQkJcGxhbm5pbmdEYXRhID0gKFBsYW5uaW5nRGF0YSkgZVJlc29sdmVQcm94eShvbGRQbGFubmluZ0RhdGEpOwotCQkJaWYgKHBsYW5uaW5nRGF0YSAhPSBvbGRQbGFubmluZ0RhdGEpIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UGxhbm5pbmdEYXRhID0gKEludGVybmFsRU9iamVjdCkgcGxhbm5pbmdEYXRhOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQbGFubmluZ0RhdGEuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLAotCQkJCQkJbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1BsYW5uaW5nRGF0YS5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQbGFubmluZ0RhdGEKLQkJCQkJCQkuZUludmVyc2VBZGQoCi0JCQkJCQkJCQl0aGlzLAotCQkJCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJCQktIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsCi0JCQkJCQkJCQludWxsLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSwKLQkJCQkJCQlvbGRQbGFubmluZ0RhdGEsIHBsYW5uaW5nRGF0YSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwbGFubmluZ0RhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBsYW5uaW5nRGF0YSBiYXNpY0dldFBsYW5uaW5nRGF0YSgpIHsKLQkJcmV0dXJuIHBsYW5uaW5nRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQbGFubmluZ0RhdGEoUGxhbm5pbmdEYXRhIG5ld1BsYW5uaW5nRGF0YSwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUGxhbm5pbmdEYXRhIG9sZFBsYW5uaW5nRGF0YSA9IHBsYW5uaW5nRGF0YTsKLQkJcGxhbm5pbmdEYXRhID0gbmV3UGxhbm5pbmdEYXRhOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLAotCQkJCQlvbGRQbGFubmluZ0RhdGEsIG5ld1BsYW5uaW5nRGF0YSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQbGFubmluZ0RhdGEoUGxhbm5pbmdEYXRhIG5ld1BsYW5uaW5nRGF0YSkgewotCQlpZiAobmV3UGxhbm5pbmdEYXRhICE9IHBsYW5uaW5nRGF0YSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocGxhbm5pbmdEYXRhICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwbGFubmluZ0RhdGEpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1BsYW5uaW5nRGF0YSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UGxhbm5pbmdEYXRhKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBsYW5uaW5nRGF0YShuZXdQbGFubmluZ0RhdGEsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLAotCQkJCQluZXdQbGFubmluZ0RhdGEsIG5ld1BsYW5uaW5nRGF0YSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eSBnZXRTdXBlckFjdGl2aXRpZXMoKSB7Ci0JCWlmIChzdXBlckFjdGl2aXRpZXMgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHN1cGVyQWN0aXZpdGllcykuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFN1cGVyQWN0aXZpdGllcyA9IChJbnRlcm5hbEVPYmplY3QpIHN1cGVyQWN0aXZpdGllczsKLQkJCXN1cGVyQWN0aXZpdGllcyA9IChBY3Rpdml0eSkgZVJlc29sdmVQcm94eShvbGRTdXBlckFjdGl2aXRpZXMpOwotCQkJaWYgKHN1cGVyQWN0aXZpdGllcyAhPSBvbGRTdXBlckFjdGl2aXRpZXMpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMsCi0JCQkJCQkJb2xkU3VwZXJBY3Rpdml0aWVzLCBzdXBlckFjdGl2aXRpZXMpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXJBY3Rpdml0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eSBiYXNpY0dldFN1cGVyQWN0aXZpdGllcygpIHsKLQkJcmV0dXJuIHN1cGVyQWN0aXZpdGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdXBlckFjdGl2aXRpZXMoCi0JCQlBY3Rpdml0eSBuZXdTdXBlckFjdGl2aXRpZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQWN0aXZpdHkgb2xkU3VwZXJBY3Rpdml0aWVzID0gc3VwZXJBY3Rpdml0aWVzOwotCQlzdXBlckFjdGl2aXRpZXMgPSBuZXdTdXBlckFjdGl2aXRpZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMsCi0JCQkJCW9sZFN1cGVyQWN0aXZpdGllcywgbmV3U3VwZXJBY3Rpdml0aWVzKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cGVyQWN0aXZpdGllcyhBY3Rpdml0eSBuZXdTdXBlckFjdGl2aXRpZXMpIHsKLQkJaWYgKG5ld1N1cGVyQWN0aXZpdGllcyAhPSBzdXBlckFjdGl2aXRpZXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHN1cGVyQWN0aXZpdGllcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc3VwZXJBY3Rpdml0aWVzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTLAotCQkJCQkJQWN0aXZpdHkuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1N1cGVyQWN0aXZpdGllcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3U3VwZXJBY3Rpdml0aWVzKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTLAotCQkJCQkJQWN0aXZpdHkuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U3VwZXJBY3Rpdml0aWVzKG5ld1N1cGVyQWN0aXZpdGllcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMsCi0JCQkJCW5ld1N1cGVyQWN0aXZpdGllcywgbmV3U3VwZXJBY3Rpdml0aWVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOgotCQkJaWYgKHN1cGVyQWN0aXZpdGllcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc3VwZXJBY3Rpdml0aWVzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTLAotCQkJCQkJQWN0aXZpdHkuY2xhc3MsIG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0U3VwZXJBY3Rpdml0aWVzKChBY3Rpdml0eSkgb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQlyZXR1cm4gYmFzaWNTZXRQbGFubmluZ0RhdGEobnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzoKLQkJCXJldHVybiBiYXNpY1NldFN1cGVyQWN0aXZpdGllcyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCXJldHVybiBnZXRQcmVmaXgoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJcmV0dXJuIGdldElzUGxhbm5lZCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJCXJldHVybiBnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw6Ci0JCQlyZXR1cm4gZ2V0SXNPcHRpb25hbCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQcmVzZW50ZWRBZnRlcigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJlc2VudGVkQWZ0ZXIoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZXNlbnRlZEJlZm9yZSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJlc2VudGVkQmVmb3JlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQbGFubmluZ0RhdGEoKTsKLQkJCXJldHVybiBiYXNpY0dldFBsYW5uaW5nRGF0YSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCXNldFByZWZpeCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDoKLQkJCXNldElzUGxhbm5lZCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJCXNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCXNldElzT3B0aW9uYWwoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI6Ci0JCQlzZXRQcmVzZW50ZWRBZnRlcigoQnJlYWtkb3duRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU6Ci0JCQlzZXRQcmVzZW50ZWRCZWZvcmUoKEJyZWFrZG93bkVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJc2V0UGxhbm5pbmdEYXRhKChQbGFubmluZ0RhdGEpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOgotCQkJc2V0U3VwZXJBY3Rpdml0aWVzKChBY3Rpdml0eSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg6Ci0JCQlzZXRQcmVmaXgoUFJFRklYX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJc2V0SXNQbGFubmVkKElTX1BMQU5ORURfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJCXNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCXNldElzT3B0aW9uYWwoSVNfT1BUSU9OQUxfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjoKLQkJCXNldFByZXNlbnRlZEFmdGVyKChCcmVha2Rvd25FbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOgotCQkJc2V0UHJlc2VudGVkQmVmb3JlKChCcmVha2Rvd25FbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJc2V0UGxhbm5pbmdEYXRhKChQbGFubmluZ0RhdGEpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM6Ci0JCQlzZXRTdXBlckFjdGl2aXRpZXMoKEFjdGl2aXR5KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg6Ci0JCQlyZXR1cm4gUFJFRklYX0VERUZBVUxUID09IG51bGwgPyBwcmVmaXggIT0gbnVsbCA6ICFQUkVGSVhfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhwcmVmaXgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCQlyZXR1cm4gSVNfUExBTk5FRF9FREVGQVVMVCA9PSBudWxsID8gaXNQbGFubmVkICE9IG51bGwKLQkJCQkJOiAhSVNfUExBTk5FRF9FREVGQVVMVC5lcXVhbHMoaXNQbGFubmVkKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM6Ci0JCQlyZXR1cm4gSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxUID09IG51bGwgPyBoYXNNdWx0aXBsZU9jY3VycmVuY2VzICE9IG51bGwKLQkJCQkJOiAhSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhoYXNNdWx0aXBsZU9jY3VycmVuY2VzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCXJldHVybiBJU19PUFRJT05BTF9FREVGQVVMVCA9PSBudWxsID8gaXNPcHRpb25hbCAhPSBudWxsCi0JCQkJCTogIUlTX09QVElPTkFMX0VERUZBVUxULmVxdWFscyhpc09wdGlvbmFsKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI6Ci0JCQlyZXR1cm4gcHJlc2VudGVkQWZ0ZXIgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOgotCQkJcmV0dXJuIHByZXNlbnRlZEJlZm9yZSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQlyZXR1cm4gcGxhbm5pbmdEYXRhICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzoKLQkJCXJldHVybiBzdXBlckFjdGl2aXRpZXMgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVmaXg6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHJlZml4KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc1BsYW5uZWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNQbGFubmVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoYXNNdWx0aXBsZU9jY3VycmVuY2VzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGhhc011bHRpcGxlT2NjdXJyZW5jZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzT3B0aW9uYWw6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNPcHRpb25hbCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0JyZWFrZG93bkVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DYXBhYmlsaXR5UGF0dGVybkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZjU3MzlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhcGFiaWxpdHkgUGF0dGVybjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENhcGFiaWxpdHlQYXR0ZXJuSW1wbCBleHRlbmRzIFByb2Nlc3NJbXBsIGltcGxlbWVudHMKLQkJQ2FwYWJpbGl0eVBhdHRlcm4gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENhcGFiaWxpdHlQYXR0ZXJuSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ0FQQUJJTElUWV9QQVRURVJOOwotCX0KLQotfSAvL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ2hlY2tsaXN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ2hlY2tsaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MjY1NDIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NoZWNrbGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tsaXN0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIENoZWNrbGlzdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hlY2tsaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ0hFQ0tMSVNUOwotCX0KLQotfSAvL0NoZWNrbGlzdEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NsYXNzaWZpZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DbGFzc2lmaWVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YzAzM2ZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NsYXNzaWZpZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DbGFzc2lmaWVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NpZmllckltcGwgZXh0ZW5kcyBUeXBlSW1wbCBpbXBsZW1lbnRzIENsYXNzaWZpZXIgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzaWZpZXJJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DTEFTU0lGSUVSOwotCX0KLQotfSAvL0NsYXNzaWZpZXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29tcG9zaXRlUm9sZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzJiYjEzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wb3NpdGUgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsI2dldEFnZ3JlZ2F0ZWRSb2xlcyA8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZVJvbGVJbXBsIGV4dGVuZHMgUm9sZURlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMKLQkJQ29tcG9zaXRlUm9sZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZ2dyZWdhdGVkUm9sZXMoKSA8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZ2dyZWdhdGVkUm9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhZ2dyZWdhdGVkUm9sZXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZVJvbGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT01QT1NJVEVfUk9MRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZ2dyZWdhdGVkUm9sZXMoKSB7Ci0JCWlmIChhZ2dyZWdhdGVkUm9sZXMgPT0gbnVsbCkgewotCQkJYWdncmVnYXRlZFJvbGVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChSb2xlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTKTsKLQkJfQotCQlyZXR1cm4gYWdncmVnYXRlZFJvbGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTOgotCQkJcmV0dXJuIGdldEFnZ3JlZ2F0ZWRSb2xlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFUzoKLQkJCWdldEFnZ3JlZ2F0ZWRSb2xlcygpLmNsZWFyKCk7Ci0JCQlnZXRBZ2dyZWdhdGVkUm9sZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFUzoKLQkJCWdldEFnZ3JlZ2F0ZWRSb2xlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFUzoKLQkJCXJldHVybiBhZ2dyZWdhdGVkUm9sZXMgIT0gbnVsbCAmJiAhYWdncmVnYXRlZFJvbGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vQ29tcG9zaXRlUm9sZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbmNlcHRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db25jZXB0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MDM1M2VlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbmNlcHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29uY2VwdEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBDb25jZXB0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25jZXB0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OQ0VQVDsKLQl9Ci0KLX0gLy9Db25jZXB0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29uc3RyYWludEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnN0cmFpbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlOGQ2OTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29uc3RyYWludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25zdHJhaW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uc3RyYWludEltcGwjZ2V0Qm9keSA8ZW0+Qm9keTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnN0cmFpbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cyBDb25zdHJhaW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCb2R5KCkgPGVtPkJvZHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJvZHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJPRFlfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvZHkoKSA8ZW0+Qm9keTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Qm9keSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBib2R5ID0gQk9EWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OU1RSQUlOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvZHkoKSB7Ci0JCXJldHVybiBib2R5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvZHkoU3RyaW5nIG5ld0JvZHkpIHsKLQkJU3RyaW5nIG9sZEJvZHkgPSBib2R5OwotCQlib2R5ID0gbmV3Qm9keTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT05TVFJBSU5UX19CT0RZLCBvbGRCb2R5LCBib2R5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fQk9EWToKLQkJCXJldHVybiBnZXRCb2R5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX0JPRFk6Ci0JCQlzZXRCb2R5KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19CT0RZOgotCQkJc2V0Qm9keShCT0RZX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX0JPRFk6Ci0JCQlyZXR1cm4gQk9EWV9FREVGQVVMVCA9PSBudWxsID8gYm9keSAhPSBudWxsIDogIUJPRFlfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhib2R5KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChib2R5OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGJvZHkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db25zdHJhaW50SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjU4YTc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRDYXRlZ29yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRDYXRlZ29yeUltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRDYXRlZ29yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfQ0FURUdPUlk7Ci0JfQotCi19IC8vQ29udGVudENhdGVnb3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTlmMWFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnREZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRTZWN0aW9ucyA8ZW0+U2VjdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgTWV0aG9kVW5pdEltcGwgaW1wbGVtZW50cwotCQlDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1haW5EZXNjcmlwdGlvbigpIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1haW5EZXNjcmlwdGlvbigpIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFpbkRlc2NyaXB0aW9uID0gTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25zKCkgPGVtPlNlY3Rpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY3Rpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VjdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtleUNvbnNpZGVyYXRpb25zKCkgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRLZXlDb25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBrZXlDb25zaWRlcmF0aW9ucyA9IEtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFpbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbWFpbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1haW5EZXNjcmlwdGlvbihTdHJpbmcgbmV3TWFpbkRlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRNYWluRGVzY3JpcHRpb24gPSBtYWluRGVzY3JpcHRpb247Ci0JCW1haW5EZXNjcmlwdGlvbiA9IG5ld01haW5EZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OLAotCQkJCQlvbGRNYWluRGVzY3JpcHRpb24sIG1haW5EZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlY3Rpb25zKCkgewotCQlpZiAoc2VjdGlvbnMgPT0gbnVsbCkgewotCQkJc2VjdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nKFNlY3Rpb24uY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMpOwotCQl9Ci0JCXJldHVybiBzZWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEtleUNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4ga2V5Q29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5Q29uc2lkZXJhdGlvbnMoU3RyaW5nIG5ld0tleUNvbnNpZGVyYXRpb25zKSB7Ci0JCVN0cmluZyBvbGRLZXlDb25zaWRlcmF0aW9ucyA9IGtleUNvbnNpZGVyYXRpb25zOwotCQlrZXlDb25zaWRlcmF0aW9ucyA9IG5ld0tleUNvbnNpZGVyYXRpb25zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUywKLQkJCQkJb2xkS2V5Q29uc2lkZXJhdGlvbnMsIGtleUNvbnNpZGVyYXRpb25zKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0U2VjdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldE1haW5EZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM6Ci0JCQlyZXR1cm4gZ2V0U2VjdGlvbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBnZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJc2V0TWFpbkRlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOgotCQkJZ2V0U2VjdGlvbnMoKS5jbGVhcigpOwotCQkJZ2V0U2VjdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJCXNldEtleUNvbnNpZGVyYXRpb25zKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJc2V0TWFpbkRlc2NyaXB0aW9uKE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM6Ci0JCQlnZXRTZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM6Ci0JCQlzZXRLZXlDb25zaWRlcmF0aW9ucyhLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjoKLQkJCXJldHVybiBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBtYWluRGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQk6ICFNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhtYWluRGVzY3JpcHRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM6Ci0JCQlyZXR1cm4gc2VjdGlvbnMgIT0gbnVsbCAmJiAhc2VjdGlvbnMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIEtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVCA9PSBudWxsID8ga2V5Q29uc2lkZXJhdGlvbnMgIT0gbnVsbAotCQkJCQk6ICFLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQuZXF1YWxzKGtleUNvbnNpZGVyYXRpb25zKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtYWluRGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWFpbkRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBrZXlDb25zaWRlcmF0aW9uczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChrZXlDb25zaWRlcmF0aW9ucyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnRlbnREZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmYmE2MGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRDb25jZXB0c0FuZFBhcGVycyA8ZW0+Q29uY2VwdHMgQW5kIFBhcGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRDaGVja2xpc3RzIDxlbT5DaGVja2xpc3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldEd1aWRlbGluZXMgPGVtPkd1aWRlbGluZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0RXhhbXBsZXMgPGVtPkV4YW1wbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldEFzc2V0cyA8ZW0+QXNzZXRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudEVsZW1lbnRJbXBsIGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIENvbnRlbnRFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUID0gVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eUVsZW1lbnQgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cHBvcnRpbmdNYXRlcmlhbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzdXBwb3J0aW5nTWF0ZXJpYWxzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmNlcHRzQW5kUGFwZXJzKCkgPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb25jZXB0c0FuZFBhcGVycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGVja2xpc3RzKCkgPGVtPkNoZWNrbGlzdHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hlY2tsaXN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNoZWNrbGlzdHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3VpZGVsaW5lcygpIDxlbT5HdWlkZWxpbmVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEd1aWRlbGluZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBndWlkZWxpbmVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4YW1wbGVzKCkgPGVtPkV4YW1wbGVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4YW1wbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXhhbXBsZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzZXRzKCkgPGVtPkFzc2V0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhc3NldHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgbmV3VmFyaWFiaWxpdHlUeXBlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSBvbGRWYXJpYWJpbGl0eVR5cGUgPSB2YXJpYWJpbGl0eVR5cGU7Ci0JCXZhcmlhYmlsaXR5VHlwZSA9IG5ld1ZhcmlhYmlsaXR5VHlwZSA9PSBudWxsID8gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVAotCQkJCTogbmV3VmFyaWFiaWxpdHlUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSwKLQkJCQkJb2xkVmFyaWFiaWxpdHlUeXBlLCB2YXJpYWJpbGl0eVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50IGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCWlmICh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGwKLQkJCQkmJiAoKEVPYmplY3QpIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlUmVzb2x2ZVByb3h5KG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpOwotCQkJaWYgKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJCQlvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LAotCQkJCQkJCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50IGJhc2ljR2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQlvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKSB7Ci0JCWlmIChjb25jZXB0c0FuZFBhcGVycyA9PSBudWxsKSB7Ci0JCQljb25jZXB0c0FuZFBhcGVycyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoQ29uY2VwdC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlMpOwotCQl9Ci0JCXJldHVybiBjb25jZXB0c0FuZFBhcGVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDaGVja2xpc3RzKCkgewotCQlpZiAoY2hlY2tsaXN0cyA9PSBudWxsKSB7Ci0JCQljaGVja2xpc3RzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChDaGVja2xpc3QuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTKTsKLQkJfQotCQlyZXR1cm4gY2hlY2tsaXN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRHdWlkZWxpbmVzKCkgewotCQlpZiAoZ3VpZGVsaW5lcyA9PSBudWxsKSB7Ci0JCQlndWlkZWxpbmVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChHdWlkZWxpbmUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTKTsKLQkJfQotCQlyZXR1cm4gZ3VpZGVsaW5lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeGFtcGxlcygpIHsKLQkJaWYgKGV4YW1wbGVzID09IG51bGwpIHsKLQkJCWV4YW1wbGVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChFeGFtcGxlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVMpOwotCQl9Ci0JCXJldHVybiBleGFtcGxlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBc3NldHMoKSB7Ci0JCWlmIChhc3NldHMgPT0gbnVsbCkgewotCQkJYXNzZXRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChSZXVzYWJsZUFzc2V0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQVNTRVRTKTsKLQkJfQotCQlyZXR1cm4gYXNzZXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOgotCQkJcmV0dXJuIGdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzoKLQkJCXJldHVybiBnZXRDb25jZXB0c0FuZFBhcGVycygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOgotCQkJcmV0dXJuIGdldENoZWNrbGlzdHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzoKLQkJCXJldHVybiBnZXRHdWlkZWxpbmVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOgotCQkJcmV0dXJuIGdldEV4YW1wbGVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0FTU0VUUzoKLQkJCXJldHVybiBnZXRBc3NldHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJc2V0VmFyaWFiaWxpdHlUeXBlKChWYXJpYWJpbGl0eVR5cGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTOgotCQkJZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKS5jbGVhcigpOwotCQkJZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUzoKLQkJCWdldENoZWNrbGlzdHMoKS5jbGVhcigpOwotCQkJZ2V0Q2hlY2tsaXN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTOgotCQkJZ2V0R3VpZGVsaW5lcygpLmNsZWFyKCk7Ci0JCQlnZXRHdWlkZWxpbmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOgotCQkJZ2V0RXhhbXBsZXMoKS5jbGVhcigpOwotCQkJZ2V0RXhhbXBsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQVNTRVRTOgotCQkJZ2V0QXNzZXRzKCkuY2xlYXIoKTsKLQkJCWdldEFzc2V0cygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXNldFZhcmlhYmlsaXR5VHlwZShWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOgotCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlM6Ci0JCQlnZXRDb25jZXB0c0FuZFBhcGVycygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM6Ci0JCQlnZXRDaGVja2xpc3RzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzoKLQkJCWdldEd1aWRlbGluZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzoKLQkJCWdldEV4YW1wbGVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQVNTRVRTOgotCQkJZ2V0QXNzZXRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXJldHVybiB2YXJpYWJpbGl0eVR5cGUgIT0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOgotCQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbHMgIT0gbnVsbAotCQkJCQkmJiAhc3VwcG9ydGluZ01hdGVyaWFscy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlM6Ci0JCQlyZXR1cm4gY29uY2VwdHNBbmRQYXBlcnMgIT0gbnVsbCAmJiAhY29uY2VwdHNBbmRQYXBlcnMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOgotCQkJcmV0dXJuIGNoZWNrbGlzdHMgIT0gbnVsbCAmJiAhY2hlY2tsaXN0cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM6Ci0JCQlyZXR1cm4gZ3VpZGVsaW5lcyAhPSBudWxsICYmICFndWlkZWxpbmVzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVM6Ci0JCQlyZXR1cm4gZXhhbXBsZXMgIT0gbnVsbCAmJiAhZXhhbXBsZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM6Ci0JCQlyZXR1cm4gYXNzZXRzICE9IG51bGwgJiYgIWFzc2V0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKSB7Ci0JCWlmIChzdXBwb3J0aW5nTWF0ZXJpYWxzID09IG51bGwpIHsKLQkJCXN1cHBvcnRpbmdNYXRlcmlhbHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KAotCQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCX0KLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IFZhcmlhYmlsaXR5RWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IFZhcmlhYmlsaXR5RWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YXJpYWJpbGl0eVR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZQotCS8vCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbCNzZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAocHJlc2VudGF0aW9uID09IG51bGwpIHsKLQkJCXN1cGVyLnNldE5hbWUobmV3TmFtZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCXN1cGVyLnNldE5hbWUobmV3TmFtZSk7Ci0JCWlmIChuZXdOYW1lICE9IG51bGwgJiYgIW5ld05hbWUuZXF1YWxzKG9sZE5hbWUpKSB7Ci0JCQlwcmVzZW50YXRpb24uc2V0TmFtZShVbWFVdGlsLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbk5hbWUodGhpcykpOwotCQl9Ci0JfQotCi19IC8vQ29udGVudEVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50UGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZTcwYzBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbCNnZXRDb250ZW50RWxlbWVudHMgPGVtPkNvbnRlbnQgRWxlbWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50UGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSW1wbCBpbXBsZW1lbnRzCi0JCUNvbnRlbnRQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRlbnRFbGVtZW50cygpIDxlbT5Db250ZW50IEVsZW1lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbnRlbnRFbGVtZW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29udGVudEVsZW1lbnRzKCkgewotCQlpZiAoY29udGVudEVsZW1lbnRzID09IG51bGwpIHsKLQkJCWNvbnRlbnRFbGVtZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoCi0JCQkJCUNvbnRlbnRFbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0Q29udGVudEVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTOgotCQkJcmV0dXJuIGdldENvbnRlbnRFbGVtZW50cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM6Ci0JCQlnZXRDb250ZW50RWxlbWVudHMoKS5jbGVhcigpOwotCQkJZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTOgotCQkJZ2V0Q29udGVudEVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzoKLQkJCXJldHVybiBjb250ZW50RWxlbWVudHMgIT0gbnVsbCAmJiAhY29udGVudEVsZW1lbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vQ29udGVudFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjNmNjE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIGV4dGVuZHMgU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkJaW1wbGVtZW50cyBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbGVtZW50KCkgPGVtPkVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIGVsZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRFbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgZWxlbWVudDsKLQkJCWVsZW1lbnQgPSAoRWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRFbGVtZW50KTsKLQkJCWlmIChlbGVtZW50ICE9IG9sZEVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQsCi0JCQkJCQkJb2xkRWxlbWVudCwgZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbGVtZW50IGJhc2ljR2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJRWxlbWVudCBvbGRFbGVtZW50ID0gZWxlbWVudDsKLQkJZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQsIG9sZEVsZW1lbnQsCi0JCQkJCWVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJc2V0RWxlbWVudCgoRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJc2V0RWxlbWVudCgoRWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVDoKLQkJCXJldHVybiBlbGVtZW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ3VzdG9tQ2F0ZWdvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DdXN0b21DYXRlZ29yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmE0NzhmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DdXN0b21DYXRlZ29yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q3VzdG9tIENhdGVnb3J5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsI2dldENhdGVnb3JpemVkRWxlbWVudHMgPGVtPkNhdGVnb3JpemVkIEVsZW1lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsI2dldFN1YkNhdGVnb3JpZXMgPGVtPlN1YiBDYXRlZ29yaWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzCi0JCUN1c3RvbUNhdGVnb3J5IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGVnb3JpemVkRWxlbWVudHMoKSA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNhdGVnb3JpemVkRWxlbWVudHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViQ2F0ZWdvcmllcygpIDxlbT5TdWIgQ2F0ZWdvcmllczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJDYXRlZ29yaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc3ViQ2F0ZWdvcmllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ3VzdG9tQ2F0ZWdvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUlk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpIHsKLQkJaWYgKGNhdGVnb3JpemVkRWxlbWVudHMgPT0gbnVsbCkgewotCQkJY2F0ZWdvcml6ZWRFbGVtZW50cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCURlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTKTsKLQkJfQotCQlyZXR1cm4gY2F0ZWdvcml6ZWRFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTdWJDYXRlZ29yaWVzKCkgewotCQlpZiAoc3ViQ2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0JCQlzdWJDYXRlZ29yaWVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChDb250ZW50Q2F0ZWdvcnkuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUyk7Ci0JCX0KLQkJcmV0dXJuIHN1YkNhdGVnb3JpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUzoKLQkJCXJldHVybiBnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SSUVTOgotCQkJcmV0dXJuIGdldFN1YkNhdGVnb3JpZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUzoKLQkJCWdldENhdGVnb3JpemVkRWxlbWVudHMoKS5jbGVhcigpOwotCQkJZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUzoKLQkJCWdldFN1YkNhdGVnb3JpZXMoKS5jbGVhcigpOwotCQkJZ2V0U3ViQ2F0ZWdvcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM6Ci0JCQlnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVM6Ci0JCQlnZXRTdWJDYXRlZ29yaWVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM6Ci0JCQlyZXR1cm4gY2F0ZWdvcml6ZWRFbGVtZW50cyAhPSBudWxsCi0JCQkJCSYmICFjYXRlZ29yaXplZEVsZW1lbnRzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVM6Ci0JCQlyZXR1cm4gc3ViQ2F0ZWdvcmllcyAhPSBudWxsICYmICFzdWJDYXRlZ29yaWVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vQ3VzdG9tQ2F0ZWdvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTdkMmRjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbiA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCNnZXRQYWNrYWdpbmdHdWlkYW5jZSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbAotCQlpbXBsZW1lbnRzIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKSA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkgPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dGVybmFsRGVzY3JpcHRpb24gPSBFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFja2FnaW5nR3VpZGFuY2UgPSBQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGV4dGVybmFsRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbihTdHJpbmcgbmV3RXh0ZXJuYWxEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRXh0ZXJuYWxEZXNjcmlwdGlvbiA9IGV4dGVybmFsRGVzY3JpcHRpb247Ci0JCWV4dGVybmFsRGVzY3JpcHRpb24gPSBuZXdFeHRlcm5hbERlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTiwKLQkJCQkJb2xkRXh0ZXJuYWxEZXNjcmlwdGlvbiwgZXh0ZXJuYWxEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnaW5nR3VpZGFuY2UoKSB7Ci0JCXJldHVybiBwYWNrYWdpbmdHdWlkYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWNrYWdpbmdHdWlkYW5jZShTdHJpbmcgbmV3UGFja2FnaW5nR3VpZGFuY2UpIHsKLQkJU3RyaW5nIG9sZFBhY2thZ2luZ0d1aWRhbmNlID0gcGFja2FnaW5nR3VpZGFuY2U7Ci0JCXBhY2thZ2luZ0d1aWRhbmNlID0gbmV3UGFja2FnaW5nR3VpZGFuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRSwKLQkJCQkJb2xkUGFja2FnaW5nR3VpZGFuY2UsIHBhY2thZ2luZ0d1aWRhbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldEV4dGVybmFsRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQlyZXR1cm4gZ2V0UGFja2FnaW5nR3VpZGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJc2V0UGFja2FnaW5nR3VpZGFuY2UoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTjoKLQkJCXNldEV4dGVybmFsRGVzY3JpcHRpb24oRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRToKLQkJCXNldFBhY2thZ2luZ0d1aWRhbmNlKFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVybmFsRGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQk6ICFFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMoZXh0ZXJuYWxEZXNjcmlwdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJcmV0dXJuIFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVCA9PSBudWxsID8gcGFja2FnaW5nR3VpZGFuY2UgIT0gbnVsbAotCQkJCQk6ICFQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQuZXF1YWxzKHBhY2thZ2luZ0d1aWRhbmNlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChleHRlcm5hbERlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGV4dGVybmFsRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhY2thZ2luZ0d1aWRhbmNlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHBhY2thZ2luZ0d1aWRhbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJhYmxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcmFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhMDBmNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcmFibGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzIDxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJhYmxlSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0SW1wbCBpbXBsZW1lbnRzIERlbGl2ZXJhYmxlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpIDxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZWxpdmVyZWRXb3JrUHJvZHVjdHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJhYmxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUkFCTEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkgewotCQlpZiAoZGVsaXZlcmVkV29ya1Byb2R1Y3RzID09IG51bGwpIHsKLQkJCWRlbGl2ZXJlZFdvcmtQcm9kdWN0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCVdvcmtQcm9kdWN0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUyk7Ci0JCX0KLQkJcmV0dXJuIGRlbGl2ZXJlZFdvcmtQcm9kdWN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUzoKLQkJCWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLmNsZWFyKCk7Ci0JCQlnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFM6Ci0JCQlnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1RTOgotCQkJcmV0dXJuIGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyAhPSBudWxsCi0JCQkJCSYmICFkZWxpdmVyZWRXb3JrUHJvZHVjdHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9EZWxpdmVyYWJsZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2YjBlNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBQcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjYWxlKCkgPGVtPlNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NBTEVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjYWxlKCkgPGVtPlNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzY2FsZSA9IFNDQUxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPSBQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSaXNrTGV2ZWwoKSA8ZW0+UmlzayBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Umlza0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSSVNLX0xFVkVMX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSaXNrTGV2ZWwoKSA8ZW0+UmlzayBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Umlza0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJpc2tMZXZlbCA9IFJJU0tfTEVWRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXN0aW1hdGluZ1RlY2huaXF1ZSA9IEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3RNZW1iZXJFeHBlcnRpc2UgPSBQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZU9mQ29udHJhY3QoKSA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZU9mQ29udHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVPZkNvbnRyYWN0KCkgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVPZkNvbnRyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGVPZkNvbnRyYWN0ID0gVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTY2FsZSgpIHsKLQkJcmV0dXJuIHNjYWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjYWxlKFN0cmluZyBuZXdTY2FsZSkgewotCQlTdHJpbmcgb2xkU2NhbGUgPSBzY2FsZTsKLQkJc2NhbGUgPSBuZXdTY2FsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSwgb2xkU2NhbGUsCi0JCQkJCXNjYWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkgewotCQlyZXR1cm4gcHJvamVjdENoYXJhY3RlcmlzdGljczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKFN0cmluZyBuZXdQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKSB7Ci0JCVN0cmluZyBvbGRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzID0gcHJvamVjdENoYXJhY3RlcmlzdGljczsKLQkJcHJvamVjdENoYXJhY3RlcmlzdGljcyA9IG5ld1Byb2plY3RDaGFyYWN0ZXJpc3RpY3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQl0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTLAotCQkJCQlvbGRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzLCBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSaXNrTGV2ZWwoKSB7Ci0JCXJldHVybiByaXNrTGV2ZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Umlza0xldmVsKFN0cmluZyBuZXdSaXNrTGV2ZWwpIHsKLQkJU3RyaW5nIG9sZFJpc2tMZXZlbCA9IHJpc2tMZXZlbDsKLQkJcmlza0xldmVsID0gbmV3Umlza0xldmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwsCi0JCQkJCW9sZFJpc2tMZXZlbCwgcmlza0xldmVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkgewotCQlyZXR1cm4gZXN0aW1hdGluZ1RlY2huaXF1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKFN0cmluZyBuZXdFc3RpbWF0aW5nVGVjaG5pcXVlKSB7Ci0JCVN0cmluZyBvbGRFc3RpbWF0aW5nVGVjaG5pcXVlID0gZXN0aW1hdGluZ1RlY2huaXF1ZTsKLQkJZXN0aW1hdGluZ1RlY2huaXF1ZSA9IG5ld0VzdGltYXRpbmdUZWNobmlxdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQl0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFLAotCQkJCQlvbGRFc3RpbWF0aW5nVGVjaG5pcXVlLCBlc3RpbWF0aW5nVGVjaG5pcXVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkgewotCQlyZXR1cm4gcHJvamVjdE1lbWJlckV4cGVydGlzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKFN0cmluZyBuZXdQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKSB7Ci0JCVN0cmluZyBvbGRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlID0gcHJvamVjdE1lbWJlckV4cGVydGlzZTsKLQkJcHJvamVjdE1lbWJlckV4cGVydGlzZSA9IG5ld1Byb2plY3RNZW1iZXJFeHBlcnRpc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQl0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSwKLQkJCQkJb2xkUHJvamVjdE1lbWJlckV4cGVydGlzZSwgcHJvamVjdE1lbWJlckV4cGVydGlzZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU9mQ29udHJhY3QoKSB7Ci0JCXJldHVybiB0eXBlT2ZDb250cmFjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlT2ZDb250cmFjdChTdHJpbmcgbmV3VHlwZU9mQ29udHJhY3QpIHsKLQkJU3RyaW5nIG9sZFR5cGVPZkNvbnRyYWN0ID0gdHlwZU9mQ29udHJhY3Q7Ci0JCXR5cGVPZkNvbnRyYWN0ID0gbmV3VHlwZU9mQ29udHJhY3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVCwKLQkJCQkJb2xkVHlwZU9mQ29udHJhY3QsIHR5cGVPZkNvbnRyYWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEU6Ci0JCQlyZXR1cm4gZ2V0U2NhbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTOgotCQkJcmV0dXJuIGdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQlyZXR1cm4gZ2V0Umlza0xldmVsKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRToKLQkJCXJldHVybiBnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0U6Ci0JCQlyZXR1cm4gZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVDoKLQkJCXJldHVybiBnZXRUeXBlT2ZDb250cmFjdCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCXNldFNjYWxlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTOgotCQkJc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJc2V0Umlza0xldmVsKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJc2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0U6Ci0JCQlzZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQlzZXRUeXBlT2ZDb250cmFjdCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEU6Ci0JCQlzZXRTY2FsZShTQ0FMRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUzoKLQkJCXNldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTDoKLQkJCXNldFJpc2tMZXZlbChSSVNLX0xFVkVMX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJc2V0RXN0aW1hdGluZ1RlY2huaXF1ZShFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0U6Ci0JCQlzZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJc2V0VHlwZU9mQ29udHJhY3QoVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCXJldHVybiBTQ0FMRV9FREVGQVVMVCA9PSBudWxsID8gc2NhbGUgIT0gbnVsbCA6ICFTQ0FMRV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHNjYWxlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTOgotCQkJcmV0dXJuIFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUID09IG51bGwgPyBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzICE9IG51bGwKLQkJCQkJOiAhUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKHByb2plY3RDaGFyYWN0ZXJpc3RpY3MpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTDoKLQkJCXJldHVybiBSSVNLX0xFVkVMX0VERUZBVUxUID09IG51bGwgPyByaXNrTGV2ZWwgIT0gbnVsbAotCQkJCQk6ICFSSVNLX0xFVkVMX0VERUZBVUxULmVxdWFscyhyaXNrTGV2ZWwpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQlyZXR1cm4gRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQgPT0gbnVsbCA/IGVzdGltYXRpbmdUZWNobmlxdWUgIT0gbnVsbAotCQkJCQk6ICFFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMoZXN0aW1hdGluZ1RlY2huaXF1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0U6Ci0JCQlyZXR1cm4gUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFX0VERUZBVUxUID09IG51bGwgPyBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlICE9IG51bGwKLQkJCQkJOiAhUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQlyZXR1cm4gVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVCA9PSBudWxsID8gdHlwZU9mQ29udHJhY3QgIT0gbnVsbAotCQkJCQk6ICFUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxULmVxdWFscyh0eXBlT2ZDb250cmFjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2NhbGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2NhbGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb2plY3RDaGFyYWN0ZXJpc3RpY3M6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHJvamVjdENoYXJhY3RlcmlzdGljcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmlza0xldmVsOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJpc2tMZXZlbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXN0aW1hdGluZ1RlY2huaXF1ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlc3RpbWF0aW5nVGVjaG5pcXVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHByb2plY3RNZW1iZXJFeHBlcnRpc2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGVPZkNvbnRyYWN0OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHR5cGVPZkNvbnRyYWN0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQzZWJlZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcnlQcm9jZXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwjZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzIDxlbT5FZHVjYXRpb24gTWF0ZXJpYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscyA8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcnlQcm9jZXNzSW1wbCBleHRlbmRzIFByb2Nlc3NJbXBsIGltcGxlbWVudHMgRGVsaXZlcnlQcm9jZXNzIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVkdWNhdGlvbk1hdGVyaWFscygpIDxlbT5FZHVjYXRpb24gTWF0ZXJpYWxzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVkdWNhdGlvbk1hdGVyaWFscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVkdWNhdGlvbk1hdGVyaWFscyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpIDxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb21tdW5pY2F0aW9uc01hdGVyaWFscyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcnlQcm9jZXNzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFZHVjYXRpb25NYXRlcmlhbHMoKSB7Ci0JCWlmIChlZHVjYXRpb25NYXRlcmlhbHMgPT0gbnVsbCkgewotCQkJZWR1Y2F0aW9uTWF0ZXJpYWxzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdCgKLQkJCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFMpOwotCQl9Ci0JCXJldHVybiBlZHVjYXRpb25NYXRlcmlhbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSB7Ci0JCWlmIChjb21tdW5pY2F0aW9uc01hdGVyaWFscyA9PSBudWxsKSB7Ci0JCQljb21tdW5pY2F0aW9uc01hdGVyaWFscyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFMpOwotCQl9Ci0JCXJldHVybiBjb21tdW5pY2F0aW9uc01hdGVyaWFsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUxTOgotCQkJcmV0dXJuIGdldEVkdWNhdGlvbk1hdGVyaWFscygpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUxTOgotCQkJcmV0dXJuIGdldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFM6Ci0JCQlnZXRFZHVjYXRpb25NYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFM6Ci0JCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpLmNsZWFyKCk7Ci0JCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFM6Ci0JCQlnZXRFZHVjYXRpb25NYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUxTOgotCQkJZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUzoKLQkJCXJldHVybiBlZHVjYXRpb25NYXRlcmlhbHMgIT0gbnVsbCAmJiAhZWR1Y2F0aW9uTWF0ZXJpYWxzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUzoKLQkJCXJldHVybiBjb21tdW5pY2F0aW9uc01hdGVyaWFscyAhPSBudWxsCi0JCQkJCSYmICFjb21tdW5pY2F0aW9uc01hdGVyaWFscy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaWJhYmxlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaWJhYmxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmRhZjI5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmliYWJsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmliYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXRQcmVzZW50YXRpb25OYW1lIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXROb2RlaWNvbiA8ZW0+Tm9kZWljb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBEZXNjcmliYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbk5hbWUoKSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbk5hbWUoKSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGF0aW9uKCkgPGVtPlByZXNlbnRhdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudERlc2NyaXB0aW9uIHByZXNlbnRhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2hhcGVpY29uKCkgPGVtPlNoYXBlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2hhcGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVSSSBTSEFQRUlDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2hhcGVpY29uKCkgPGVtPlNoYXBlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2hhcGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVVJJIHNoYXBlaWNvbiA9IFNIQVBFSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb2RlaWNvbigpIDxlbT5Ob2RlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm9kZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVVJJIE5PREVJQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vZGVpY29uKCkgPGVtPk5vZGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb2RlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFVSSSBub2RlaWNvbiA9IE5PREVJQ09OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaWJhYmxlRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVzZW50YXRpb25OYW1lKCkgewotCQlyZXR1cm4gcHJlc2VudGF0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50YXRpb25OYW1lKFN0cmluZyBuZXdQcmVzZW50YXRpb25OYW1lKSB7Ci0JCVN0cmluZyBvbGRQcmVzZW50YXRpb25OYW1lID0gcHJlc2VudGF0aW9uTmFtZTsKLQkJcHJlc2VudGF0aW9uTmFtZSA9IG5ld1ByZXNlbnRhdGlvbk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUsCi0JCQkJCW9sZFByZXNlbnRhdGlvbk5hbWUsIHByZXNlbnRhdGlvbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVzZW50YXRpb24oCi0JCQlDb250ZW50RGVzY3JpcHRpb24gbmV3UHJlc2VudGF0aW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnRlbnREZXNjcmlwdGlvbiBvbGRQcmVzZW50YXRpb24gPSBwcmVzZW50YXRpb247Ci0JCXByZXNlbnRhdGlvbiA9IG5ld1ByZXNlbnRhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJCW9sZFByZXNlbnRhdGlvbiwgbmV3UHJlc2VudGF0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVUkkgZ2V0U2hhcGVpY29uKCkgewotCQlyZXR1cm4gc2hhcGVpY29uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNoYXBlaWNvbihVUkkgbmV3U2hhcGVpY29uKSB7Ci0JCVVSSSBvbGRTaGFwZWljb24gPSBzaGFwZWljb247Ci0JCXNoYXBlaWNvbiA9IG5ld1NoYXBlaWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04sIG9sZFNoYXBlaWNvbiwKLQkJCQkJc2hhcGVpY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBnZXROb2RlaWNvbigpIHsKLQkJcmV0dXJuIG5vZGVpY29uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVpY29uKFVSSSBuZXdOb2RlaWNvbikgewotCQlVUkkgb2xkTm9kZWljb24gPSBub2RlaWNvbjsKLQkJbm9kZWljb24gPSBuZXdOb2RlaWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTiwgb2xkTm9kZWljb24sCi0JCQkJCW5vZGVpY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFByZXNlbnRhdGlvbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlyZXR1cm4gZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZXNlbnRhdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJlc2VudGF0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT046Ci0JCQlyZXR1cm4gZ2V0U2hhcGVpY29uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjoKLQkJCXJldHVybiBnZXROb2RlaWNvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCXNldFByZXNlbnRhdGlvbk5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOgotCQkJc2V0UHJlc2VudGF0aW9uKChDb250ZW50RGVzY3JpcHRpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCXNldFNoYXBlaWNvbigoVVJJKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjoKLQkJCXNldE5vZGVpY29uKChVUkkpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCXNldFByZXNlbnRhdGlvbk5hbWUoUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOgotCQkJc2V0UHJlc2VudGF0aW9uKChDb250ZW50RGVzY3JpcHRpb24pIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJc2V0U2hhcGVpY29uKFNIQVBFSUNPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjoKLQkJCXNldE5vZGVpY29uKE5PREVJQ09OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJcmV0dXJuIFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwcmVzZW50YXRpb25OYW1lICE9IG51bGwKLQkJCQkJOiAhUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQuZXF1YWxzKHByZXNlbnRhdGlvbk5hbWUpOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOgotCQkJcmV0dXJuIHByZXNlbnRhdGlvbiAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJcmV0dXJuIFNIQVBFSUNPTl9FREVGQVVMVCA9PSBudWxsID8gc2hhcGVpY29uICE9IG51bGwKLQkJCQkJOiAhU0hBUEVJQ09OX0VERUZBVUxULmVxdWFscyhzaGFwZWljb24pOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT046Ci0JCQlyZXR1cm4gTk9ERUlDT05fRURFRkFVTFQgPT0gbnVsbCA/IG5vZGVpY29uICE9IG51bGwKLQkJCQkJOiAhTk9ERUlDT05fRURFRkFVTFQuZXF1YWxzKG5vZGVpY29uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVzZW50YXRpb25OYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHByZXNlbnRhdGlvbk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNoYXBlaWNvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzaGFwZWljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vZGVpY29uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG5vZGVpY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZQotCS8vCi0KLQlwdWJsaWMgQ29udGVudERlc2NyaXB0aW9uIGJhc2ljR2V0UHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gcHJlc2VudGF0aW9uOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldFByZXNlbnRhdGlvbigpCi0JICovCi0JcHVibGljIENvbnRlbnREZXNjcmlwdGlvbiBnZXRQcmVzZW50YXRpb24oKSB7Ci0JCWlmIChwcmVzZW50YXRpb24gaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJJiYgKChFT2JqZWN0KSBwcmVzZW50YXRpb24pLmVJc1Byb3h5KCkpIHsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBvbGRQcmVzZW50YXRpb24gPSBwcmVzZW50YXRpb247Ci0JCQlwcmVzZW50YXRpb24gPSAoQ29udGVudERlc2NyaXB0aW9uKSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHByZXNlbnRhdGlvbik7Ci0JCQlpZiAocHJlc2VudGF0aW9uICE9IG9sZFByZXNlbnRhdGlvbikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJCQkJb2xkUHJlc2VudGF0aW9uLCBwcmVzZW50YXRpb24pKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcmVzZW50YXRpb24gPT0gbnVsbCkgewotCQkJLy8JCQlzZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24odGhpcykpOwotCQkJaWYgKGVtcHR5UHJlc2VudGF0aW9uID09IG51bGwpIHsKLQkJCQllbXB0eVByZXNlbnRhdGlvbiA9IENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJCS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24odGhpcyk7Ci0JCQkJZW1wdHlQcmVzZW50YXRpb24uZUFkYXB0ZXJzKCkuYWRkKGNoYW5nZUxpc3RlbmVyKTsKLQkJCX0KLQkJCXJldHVybiBlbXB0eVByZXNlbnRhdGlvbjsKLQkJfQotCi0JCXJldHVybiBwcmVzZW50YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uIG5ld1ByZXNlbnRhdGlvbikgewotCQlpZiAobmV3UHJlc2VudGF0aW9uICE9IHByZXNlbnRhdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlc2VudGF0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVzZW50YXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVzZW50YXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1ByZXNlbnRhdGlvbikuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlc2VudGF0aW9uKG5ld1ByZXNlbnRhdGlvbiwgbXNncyk7Ci0KLQkJCS8vIGN1c3RvbSBjb2RlCi0JCQkvLwotCQkJZW1wdHlQcmVzZW50YXRpb24gPSBudWxsOwotCi0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCQluZXdQcmVzZW50YXRpb24sIG5ld1ByZXNlbnRhdGlvbikpOwotCX0KLQotCXByaXZhdGUgQ29udGVudERlc2NyaXB0aW9uIGVtcHR5UHJlc2VudGF0aW9uOwotCi0JcHJpdmF0ZSBBZGFwdGVyIGNoYW5nZUxpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGdldFRhcmdldCgpOwotCQkJCWNvbnRlbnQuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCi0JCQkJLy8gZW1wdHlQcmVzZW50YXRpb24gaXMgbW9kaWZpZWQsIGNvbnZlcnQgaXQgdG8gcmVhbCBwcmVzZW50YXRpb24gaWYgbm8gcHJlc2VudGF0aW9uIGlzIHNldCB5ZXQgCi0JCQkJLy8gZm9yIHRoZSBQcm9jZXNzRWxlbWVudAotCQkJCS8vCi0JCQkJaWYgKHByZXNlbnRhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCXNldFByZXNlbnRhdGlvbihjb250ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotfSAvL0Rlc2NyaWJhYmxlRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzA4OTgyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbAotCQlpbXBsZW1lbnRzIERlc2NyaXB0b3JEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkgPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkgPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZWZpbmVkRGVzY3JpcHRpb24gPSBSRUZJTkVEX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSVBUT1JfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWZpbmVkRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiByZWZpbmVkRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmaW5lZERlc2NyaXB0aW9uKFN0cmluZyBuZXdSZWZpbmVkRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZFJlZmluZWREZXNjcmlwdGlvbiA9IHJlZmluZWREZXNjcmlwdGlvbjsKLQkJcmVmaW5lZERlc2NyaXB0aW9uID0gbmV3UmVmaW5lZERlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04sCi0JCQkJCW9sZFJlZmluZWREZXNjcmlwdGlvbiwgcmVmaW5lZERlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCXJldHVybiBnZXRSZWZpbmVkRGVzY3JpcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCXNldFJlZmluZWREZXNjcmlwdGlvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCXNldFJlZmluZWREZXNjcmlwdGlvbihSRUZJTkVEX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gcmVmaW5lZERlc2NyaXB0aW9uICE9IG51bGwKLQkJCQkJOiAhUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMocmVmaW5lZERlc2NyaXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyZWZpbmVkRGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmVmaW5lZERlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVzY3JpcHRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmYzNiZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckltcGwjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZXNjcmlwdG9ySW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUID0gQm9vbGVhbi5UUlVFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShCb29sZWFuIG5ld0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSkgewotCQlCb29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSwKLQkJCQkJb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlLCBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlyZXR1cm4gZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCXNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCXNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJcmV0dXJuIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCA9PSBudWxsID8gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlICE9IG51bGwKLQkJCQkJOiAhSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZXNjcmlwdG9ySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlhZ3JhbUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTljMGFhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpYWdyYW0gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1FbGVtZW50SW1wbCNnZXRJc1Zpc2libGUgPGVtPklzIFZpc2libGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwjZ2V0Q29udGFpbmVyXyA8ZW0+Q29udGFpbmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUVsZW1lbnRJbXBsI2dldFJlZmVyZW5jZSA8ZW0+UmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUVsZW1lbnRJbXBsI2dldFByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERpYWdyYW1FbGVtZW50SW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJRGlhZ3JhbUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzVmlzaWJsZSgpIDxlbT5JcyBWaXNpYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1Zpc2libGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19WSVNJQkxFX0VERUZBVUxUID0gQm9vbGVhbi5UUlVFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNWaXNpYmxlKCkgPGVtPklzIFZpc2libGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzVmlzaWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNWaXNpYmxlID0gSVNfVklTSUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyZW5jZSgpIDxlbT5SZWZlcmVuY2U8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVmZXJlbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnR5KCkgPGVtPlByb3BlcnR5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcHJvcGVydHkgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1FbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzVmlzaWJsZSgpIHsKLQkJcmV0dXJuIGlzVmlzaWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1Zpc2libGUoQm9vbGVhbiBuZXdJc1Zpc2libGUpIHsKLQkJQm9vbGVhbiBvbGRJc1Zpc2libGUgPSBpc1Zpc2libGU7Ci0JCWlzVmlzaWJsZSA9IG5ld0lzVmlzaWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEUsIG9sZElzVmlzaWJsZSwKLQkJCQkJaXNWaXNpYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBnZXRDb250YWluZXJfKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBiYXNpY0dldENvbnRhaW5lcigpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUikKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEdyYXBoRWxlbWVudCkgZUludGVybmFsQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udGFpbmVyKEdyYXBoRWxlbWVudCBuZXdDb250YWluZXIsCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGFpbmVyLAotCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVIsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoR3JhcGhFbGVtZW50IG5ld0NvbnRhaW5lcikgewotCQlpZiAobmV3Q29udGFpbmVyICE9IGVJbnRlcm5hbENvbnRhaW5lcigpCi0JCQkJfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUiAmJiBuZXdDb250YWluZXIgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCAoRU9iamVjdCkgbmV3Q29udGFpbmVyKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0NvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGFpbmVyKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJCQlHcmFwaEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29udGFpbmVyKG5ld0NvbnRhaW5lciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVIsIG5ld0NvbnRhaW5lciwKLQkJCQkJbmV3Q29udGFpbmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVmZXJlbmNlKCkgewotCQlpZiAocmVmZXJlbmNlID09IG51bGwpIHsKLQkJCXJlZmVyZW5jZSA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdChSZWZlcmVuY2UuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0UsCi0JCQkJCVVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VEKTsKLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5KCkgewotCQlpZiAocHJvcGVydHkgPT0gbnVsbCkgewotCQkJcHJvcGVydHkgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nKFByb3BlcnR5LmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFkpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI6Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldENvbnRhaW5lcigoR3JhcGhFbGVtZW50KSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldFJlZmVyZW5jZSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjoKLQkJCXJldHVybiBiYXNpY1NldENvbnRhaW5lcihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0UmVmZXJlbmNlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRQcm9wZXJ0eSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSgKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjoKLQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwgR3JhcGhFbGVtZW50LmNsYXNzLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOgotCQkJcmV0dXJuIGdldElzVmlzaWJsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyXygpOwotCQkJcmV0dXJuIGJhc2ljR2V0Q29udGFpbmVyKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRToKLQkJCXJldHVybiBnZXRSZWZlcmVuY2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk6Ci0JCQlyZXR1cm4gZ2V0UHJvcGVydHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOgotCQkJc2V0SXNWaXNpYmxlKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjoKLQkJCXNldENvbnRhaW5lcigoR3JhcGhFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRToKLQkJCWdldFJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQlnZXRSZWZlcmVuY2UoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk6Ci0JCQlnZXRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQlnZXRQcm9wZXJ0eSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRToKLQkJCXNldElzVmlzaWJsZShJU19WSVNJQkxFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOgotCQkJc2V0Q29udGFpbmVyKChHcmFwaEVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U6Ci0JCQlnZXRSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWToKLQkJCWdldFByb3BlcnR5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRToKLQkJCXJldHVybiBJU19WSVNJQkxFX0VERUZBVUxUID09IG51bGwgPyBpc1Zpc2libGUgIT0gbnVsbAotCQkJCQk6ICFJU19WSVNJQkxFX0VERUZBVUxULmVxdWFscyhpc1Zpc2libGUpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI6Ci0JCQlyZXR1cm4gYmFzaWNHZXRDb250YWluZXIoKSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U6Ci0JCQlyZXR1cm4gcmVmZXJlbmNlICE9IG51bGwgJiYgIXJlZmVyZW5jZS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOgotCQkJcmV0dXJuIHByb3BlcnR5ICE9IG51bGwgJiYgIXByb3BlcnR5LmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpc1Zpc2libGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNWaXNpYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGlhZ3JhbUVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlhZ3JhbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWE2YTRjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbCNnZXRab29tIDxlbT5ab29tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUltcGwjZ2V0Vmlld3BvaW50IDxlbT5WaWV3cG9pbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbCNnZXREaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUltcGwjZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSW1wbCBleHRlbmRzIEdyYXBoTm9kZUltcGwgaW1wbGVtZW50cyBEaWFncmFtIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRab29tKCkgPGVtPlpvb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFpvb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRG91YmxlIFpPT01fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Wm9vbSgpIDxlbT5ab29tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRab29tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG91YmxlIHpvb20gPSBaT09NX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Vmlld3BvaW50KCkgPGVtPlZpZXdwb2ludDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Vmlld3BvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgdmlld3BvaW50ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpYWdyYW1MaW5rKCkgPGVtPkRpYWdyYW0gTGluazwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaWFncmFtTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpYWdyYW1MaW5rID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZSgpIDxlbT5OYW1lc3BhY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVzcGFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZXNwYWNlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG91YmxlIGdldFpvb20oKSB7Ci0JCXJldHVybiB6b29tOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFpvb20oRG91YmxlIG5ld1pvb20pIHsKLQkJRG91YmxlIG9sZFpvb20gPSB6b29tOwotCQl6b29tID0gbmV3Wm9vbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19aT09NLCBvbGRab29tLCB6b29tKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGdldFZpZXdwb2ludCgpIHsKLQkJaWYgKHZpZXdwb2ludCAhPSBudWxsICYmICgoRU9iamVjdCkgdmlld3BvaW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVmlld3BvaW50ID0gKEludGVybmFsRU9iamVjdCkgdmlld3BvaW50OwotCQkJdmlld3BvaW50ID0gKFBvaW50KSBlUmVzb2x2ZVByb3h5KG9sZFZpZXdwb2ludCk7Ci0JCQlpZiAodmlld3BvaW50ICE9IG9sZFZpZXdwb2ludCkgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdWaWV3cG9pbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSB2aWV3cG9pbnQ7Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFZpZXdwb2ludC5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5ULAotCQkJCQkJbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1ZpZXdwb2ludC5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdWaWV3cG9pbnQKLQkJCQkJCQkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLkRJQUdSQU1fX1ZJRVdQT0lOVCwgbnVsbCwgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5ULCBvbGRWaWV3cG9pbnQsCi0JCQkJCQkJdmlld3BvaW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZpZXdwb2ludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgYmFzaWNHZXRWaWV3cG9pbnQoKSB7Ci0JCXJldHVybiB2aWV3cG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Vmlld3BvaW50KFBvaW50IG5ld1ZpZXdwb2ludCwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUG9pbnQgb2xkVmlld3BvaW50ID0gdmlld3BvaW50OwotCQl2aWV3cG9pbnQgPSBuZXdWaWV3cG9pbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5ULAotCQkJCQlvbGRWaWV3cG9pbnQsIG5ld1ZpZXdwb2ludCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3cG9pbnQoUG9pbnQgbmV3Vmlld3BvaW50KSB7Ci0JCWlmIChuZXdWaWV3cG9pbnQgIT0gdmlld3BvaW50KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh2aWV3cG9pbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHZpZXdwb2ludCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLkRJQUdSQU1fX1ZJRVdQT0lOVCwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ZpZXdwb2ludCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Vmlld3BvaW50KS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5ULAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRWaWV3cG9pbnQobmV3Vmlld3BvaW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQsIG5ld1ZpZXdwb2ludCwgbmV3Vmlld3BvaW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGlhZ3JhbUxpbmsoKSB7Ci0JCWlmIChkaWFncmFtTGluayA9PSBudWxsKSB7Ci0JCQlkaWFncmFtTGluayA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdCgKLQkJCQkJRGlhZ3JhbUxpbmsuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LLAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fRElBR1JBTSk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW1MaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZW1hbnRpY01vZGVsQnJpZGdlIGdldE5hbWVzcGFjZSgpIHsKLQkJaWYgKG5hbWVzcGFjZSAhPSBudWxsICYmICgoRU9iamVjdCkgbmFtZXNwYWNlKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkTmFtZXNwYWNlID0gKEludGVybmFsRU9iamVjdCkgbmFtZXNwYWNlOwotCQkJbmFtZXNwYWNlID0gKFNlbWFudGljTW9kZWxCcmlkZ2UpIGVSZXNvbHZlUHJveHkob2xkTmFtZXNwYWNlKTsKLQkJCWlmIChuYW1lc3BhY2UgIT0gb2xkTmFtZXNwYWNlKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld05hbWVzcGFjZSA9IChJbnRlcm5hbEVPYmplY3QpIG5hbWVzcGFjZTsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkTmFtZXNwYWNlLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSwKLQkJCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsIG51bGwpOwotCQkJCWlmIChuZXdOYW1lc3BhY2UuZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3TmFtZXNwYWNlLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0sCi0JCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFLCBvbGROYW1lc3BhY2UsCi0JCQkJCQkJbmFtZXNwYWNlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWVzcGFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VtYW50aWNNb2RlbEJyaWRnZSBiYXNpY0dldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXROYW1lc3BhY2UoCi0JCQlTZW1hbnRpY01vZGVsQnJpZGdlIG5ld05hbWVzcGFjZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlTZW1hbnRpY01vZGVsQnJpZGdlIG9sZE5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkJbmFtZXNwYWNlID0gbmV3TmFtZXNwYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRSwKLQkJCQkJb2xkTmFtZXNwYWNlLCBuZXdOYW1lc3BhY2UpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFNlbWFudGljTW9kZWxCcmlkZ2UgbmV3TmFtZXNwYWNlKSB7Ci0JCWlmIChuZXdOYW1lc3BhY2UgIT0gbmFtZXNwYWNlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5hbWVzcGFjZSkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNLAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3TmFtZXNwYWNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdOYW1lc3BhY2UpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSwKLQkJCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TmFtZXNwYWNlKG5ld05hbWVzcGFjZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFLCBuZXdOYW1lc3BhY2UsIG5ld05hbWVzcGFjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTks6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXREaWFncmFtTGluaygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0U6Ci0JCQlpZiAobmFtZXNwYWNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuYW1lc3BhY2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldE5hbWVzcGFjZSgoU2VtYW50aWNNb2RlbEJyaWRnZSkgb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5UOgotCQkJcmV0dXJuIGJhc2ljU2V0Vmlld3BvaW50KG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RGlhZ3JhbUxpbmsoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFOgotCQkJcmV0dXJuIGJhc2ljU2V0TmFtZXNwYWNlKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19aT09NOgotCQkJcmV0dXJuIGdldFpvb20oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX1ZJRVdQT0lOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRWaWV3cG9pbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldFZpZXdwb2ludCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LOgotCQkJcmV0dXJuIGdldERpYWdyYW1MaW5rKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0U6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0TmFtZXNwYWNlKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXROYW1lc3BhY2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTToKLQkJCXNldFpvb20oKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5UOgotCQkJc2V0Vmlld3BvaW50KChQb2ludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LOgotCQkJZ2V0RGlhZ3JhbUxpbmsoKS5jbGVhcigpOwotCQkJZ2V0RGlhZ3JhbUxpbmsoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCXNldE5hbWVzcGFjZSgoU2VtYW50aWNNb2RlbEJyaWRnZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX1pPT006Ci0JCQlzZXRab29tKFpPT01fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5UOgotCQkJc2V0Vmlld3BvaW50KChQb2ludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTks6Ci0JCQlnZXREaWFncmFtTGluaygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0U6Ci0JCQlzZXROYW1lc3BhY2UoKFNlbWFudGljTW9kZWxCcmlkZ2UpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTToKLQkJCXJldHVybiBaT09NX0VERUZBVUxUID09IG51bGwgPyB6b29tICE9IG51bGwgOiAhWk9PTV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHpvb20pOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5UOgotCQkJcmV0dXJuIHZpZXdwb2ludCAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LOgotCQkJcmV0dXJuIGRpYWdyYW1MaW5rICE9IG51bGwgJiYgIWRpYWdyYW1MaW5rLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCXJldHVybiBuYW1lc3BhY2UgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh6b29tOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHpvb20pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EaWFncmFtSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlhZ3JhbUxpbmtJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtTGlua0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWJhYWQzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtTGlua0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbSBMaW5rPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUxpbmtJbXBsI2dldFpvb20gPGVtPlpvb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwjZ2V0Vmlld3BvcnQgPGVtPlZpZXdwb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUxpbmtJbXBsI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1MaW5rSW1wbCNnZXREaWFncmFtIDxlbT5EaWFncmFtPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUxpbmtJbXBsIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJbXBsIGltcGxlbWVudHMgRGlhZ3JhbUxpbmsgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFpvb20oKSA8ZW0+Wm9vbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Wm9vbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgWk9PTV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRab29tKCkgPGVtPlpvb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFpvb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgem9vbSA9IFpPT01fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWaWV3cG9ydCgpIDxlbT5WaWV3cG9ydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Vmlld3BvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCB2aWV3cG9ydCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaWFncmFtKCkgPGVtPkRpYWdyYW08L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtIGRpYWdyYW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1MaW5rSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9MSU5LOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0Wm9vbSgpIHsKLQkJcmV0dXJuIHpvb207Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Wm9vbShEb3VibGUgbmV3Wm9vbSkgewotCQlEb3VibGUgb2xkWm9vbSA9IHpvb207Ci0JCXpvb20gPSBuZXdab29tOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fWk9PTSwgb2xkWm9vbSwgem9vbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRWaWV3cG9ydCgpIHsKLQkJaWYgKHZpZXdwb3J0ICE9IG51bGwgJiYgKChFT2JqZWN0KSB2aWV3cG9ydCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFZpZXdwb3J0ID0gKEludGVybmFsRU9iamVjdCkgdmlld3BvcnQ7Ci0JCQl2aWV3cG9ydCA9IChQb2ludCkgZVJlc29sdmVQcm94eShvbGRWaWV3cG9ydCk7Ci0JCQlpZiAodmlld3BvcnQgIT0gb2xkVmlld3BvcnQpIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3Vmlld3BvcnQgPSAoSW50ZXJuYWxFT2JqZWN0KSB2aWV3cG9ydDsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkVmlld3BvcnQKLQkJCQkJCS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1ZJRVdQT1JULCBudWxsLCBudWxsKTsKLQkJCQlpZiAobmV3Vmlld3BvcnQuZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3Vmlld3BvcnQuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCS0gVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1ZJRVdQT1JULCBudWxsLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1ZJRVdQT1JULCBvbGRWaWV3cG9ydCwKLQkJCQkJCQl2aWV3cG9ydCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2aWV3cG9ydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgYmFzaWNHZXRWaWV3cG9ydCgpIHsKLQkJcmV0dXJuIHZpZXdwb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFZpZXdwb3J0KFBvaW50IG5ld1ZpZXdwb3J0LAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQb2ludCBvbGRWaWV3cG9ydCA9IHZpZXdwb3J0OwotCQl2aWV3cG9ydCA9IG5ld1ZpZXdwb3J0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fVklFV1BPUlQsCi0JCQkJCW9sZFZpZXdwb3J0LCBuZXdWaWV3cG9ydCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3cG9ydChQb2ludCBuZXdWaWV3cG9ydCkgewotCQlpZiAobmV3Vmlld3BvcnQgIT0gdmlld3BvcnQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHZpZXdwb3J0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSB2aWV3cG9ydCkKLQkJCQkJCS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1ZJRVdQT1JULCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWaWV3cG9ydCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Vmlld3BvcnQpCi0JCQkJCQkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRWaWV3cG9ydChuZXdWaWV3cG9ydCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVCwgbmV3Vmlld3BvcnQsIG5ld1ZpZXdwb3J0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBnZXRHcmFwaEVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBiYXNpY0dldEdyYXBoRWxlbWVudCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChHcmFwaEVsZW1lbnQpIGVJbnRlcm5hbENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgbmV3R3JhcGhFbGVtZW50LAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCwKLQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgbmV3R3JhcGhFbGVtZW50KSB7Ci0JCWlmIChuZXdHcmFwaEVsZW1lbnQgIT0gZUludGVybmFsQ29udGFpbmVyKCkKLQkJCQl8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCAmJiBuZXdHcmFwaEVsZW1lbnQgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCAoRU9iamVjdCkgbmV3R3JhcGhFbGVtZW50KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0dyYXBoRWxlbWVudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3R3JhcGhFbGVtZW50KS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LLCBHcmFwaEVsZW1lbnQuY2xhc3MsCi0JCQkJCQltc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEdyYXBoRWxlbWVudChuZXdHcmFwaEVsZW1lbnQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCwgbmV3R3JhcGhFbGVtZW50LAotCQkJCQluZXdHcmFwaEVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlpZiAoZGlhZ3JhbSAhPSBudWxsICYmICgoRU9iamVjdCkgZGlhZ3JhbSkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZERpYWdyYW0gPSAoSW50ZXJuYWxFT2JqZWN0KSBkaWFncmFtOwotCQkJZGlhZ3JhbSA9IChEaWFncmFtKSBlUmVzb2x2ZVByb3h5KG9sZERpYWdyYW0pOwotCQkJaWYgKGRpYWdyYW0gIT0gb2xkRGlhZ3JhbSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU0sIG9sZERpYWdyYW0sCi0JCQkJCQkJZGlhZ3JhbSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtIGJhc2ljR2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RGlhZ3JhbShEaWFncmFtIG5ld0RpYWdyYW0sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURpYWdyYW0gb2xkRGlhZ3JhbSA9IGRpYWdyYW07Ci0JCWRpYWdyYW0gPSBuZXdEaWFncmFtOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fRElBR1JBTSwKLQkJCQkJb2xkRGlhZ3JhbSwgbmV3RGlhZ3JhbSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaWFncmFtKERpYWdyYW0gbmV3RGlhZ3JhbSkgewotCQlpZiAobmV3RGlhZ3JhbSAhPSBkaWFncmFtKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChkaWFncmFtICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBkaWFncmFtKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTkssIERpYWdyYW0uY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0RpYWdyYW0gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0RpYWdyYW0pLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSywgRGlhZ3JhbS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXREaWFncmFtKG5ld0RpYWdyYW0sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fRElBR1JBTSwgbmV3RGlhZ3JhbSwgbmV3RGlhZ3JhbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlpZiAoZGlhZ3JhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgZGlhZ3JhbSkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LLCBEaWFncmFtLmNsYXNzLCBtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldERpYWdyYW0oKERpYWdyYW0pIG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fVklFV1BPUlQ6Ci0JCQlyZXR1cm4gYmFzaWNTZXRWaWV3cG9ydChudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVDoKLQkJCXJldHVybiBiYXNpY1NldEdyYXBoRWxlbWVudChudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fRElBR1JBTToKLQkJCXJldHVybiBiYXNpY1NldERpYWdyYW0obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSgKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LLCBHcmFwaEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1pPT006Ci0JCQlyZXR1cm4gZ2V0Wm9vbSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRWaWV3cG9ydCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0Vmlld3BvcnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRHcmFwaEVsZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldEdyYXBoRWxlbWVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldERpYWdyYW0oKTsKLQkJCXJldHVybiBiYXNpY0dldERpYWdyYW0oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19aT09NOgotCQkJc2V0Wm9vbSgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1ZJRVdQT1JUOgotCQkJc2V0Vmlld3BvcnQoKFBvaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlzZXRHcmFwaEVsZW1lbnQoKEdyYXBoRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNOgotCQkJc2V0RGlhZ3JhbSgoRGlhZ3JhbSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fWk9PTToKLQkJCXNldFpvb20oWk9PTV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1ZJRVdQT1JUOgotCQkJc2V0Vmlld3BvcnQoKFBvaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVDoKLQkJCXNldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fRElBR1JBTToKLQkJCXNldERpYWdyYW0oKERpYWdyYW0pIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19aT09NOgotCQkJcmV0dXJuIFpPT01fRURFRkFVTFQgPT0gbnVsbCA/IHpvb20gIT0gbnVsbCA6ICFaT09NX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoem9vbSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1ZJRVdQT1JUOgotCQkJcmV0dXJuIHZpZXdwb3J0ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gYmFzaWNHZXRHcmFwaEVsZW1lbnQoKSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNOgotCQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh6b29tOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHpvb20pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EaWFncmFtTGlua0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpbWVuc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpbWVuc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2RiNGUxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaW1lbnNpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGltZW5zaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGltZW5zaW9uSW1wbCNnZXRXaWR0aCA8ZW0+V2lkdGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaW1lbnNpb25JbXBsI2dldEhlaWdodCA8ZW0+SGVpZ2h0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGltZW5zaW9uSW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMgRGltZW5zaW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXaWR0aCgpIDxlbT5XaWR0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2lkdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRG91YmxlIFdJRFRIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdpZHRoKCkgPGVtPldpZHRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXaWR0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSB3aWR0aCA9IFdJRFRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlaWdodCgpIDxlbT5IZWlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgSEVJR0hUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlaWdodCgpIDxlbT5IZWlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSBoZWlnaHQgPSBIRUlHSFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElNRU5TSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiB3aWR0aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChEb3VibGUgbmV3V2lkdGgpIHsKLQkJRG91YmxlIG9sZFdpZHRoID0gd2lkdGg7Ci0JCXdpZHRoID0gbmV3V2lkdGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElNRU5TSU9OX19XSURUSCwgb2xkV2lkdGgsIHdpZHRoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRIZWlnaHQoKSB7Ci0JCXJldHVybiBoZWlnaHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KERvdWJsZSBuZXdIZWlnaHQpIHsKLQkJRG91YmxlIG9sZEhlaWdodCA9IGhlaWdodDsKLQkJaGVpZ2h0ID0gbmV3SGVpZ2h0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJTUVOU0lPTl9fSEVJR0hULCBvbGRIZWlnaHQsIGhlaWdodCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fV0lEVEg6Ci0JCQlyZXR1cm4gZ2V0V2lkdGgoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fSEVJR0hUOgotCQkJcmV0dXJuIGdldEhlaWdodCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX1dJRFRIOgotCQkJc2V0V2lkdGgoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19IRUlHSFQ6Ci0JCQlzZXRIZWlnaHQoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fV0lEVEg6Ci0JCQlzZXRXaWR0aChXSURUSF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX0hFSUdIVDoKLQkJCXNldEhlaWdodChIRUlHSFRfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19XSURUSDoKLQkJCXJldHVybiBXSURUSF9FREVGQVVMVCA9PSBudWxsID8gd2lkdGggIT0gbnVsbCA6ICFXSURUSF9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHdpZHRoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fSEVJR0hUOgotCQkJcmV0dXJuIEhFSUdIVF9FREVGQVVMVCA9PSBudWxsID8gaGVpZ2h0ICE9IG51bGwgOiAhSEVJR0hUX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoaGVpZ2h0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh3aWR0aDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh3aWR0aCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaGVpZ2h0OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGhlaWdodCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RpbWVuc2lvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2FhNzdlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzY2lwbGluZSBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwjZ2V0RGlzY2lwbGluZXMgPGVtPkRpc2NpcGxpbmVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUdyb3VwaW5nSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cwotCQlEaXNjaXBsaW5lR3JvdXBpbmcgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzY2lwbGluZXMoKSA8ZW0+RGlzY2lwbGluZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzY2lwbGluZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNjaXBsaW5lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlzY2lwbGluZUdyb3VwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNjaXBsaW5lcygpIHsKLQkJaWYgKGRpc2NpcGxpbmVzID09IG51bGwpIHsKLQkJCWRpc2NpcGxpbmVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChEaXNjaXBsaW5lLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkVTKTsKLQkJfQotCQlyZXR1cm4gZGlzY2lwbGluZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVM6Ci0JCQlyZXR1cm4gZ2V0RGlzY2lwbGluZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVM6Ci0JCQlnZXREaXNjaXBsaW5lcygpLmNsZWFyKCk7Ci0JCQlnZXREaXNjaXBsaW5lcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkVTOgotCQkJZ2V0RGlzY2lwbGluZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVM6Ci0JCQlyZXR1cm4gZGlzY2lwbGluZXMgIT0gbnVsbCAmJiAhZGlzY2lwbGluZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaXNjaXBsaW5lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlzY2lwbGluZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmYzY2E5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaXNjaXBsaW5lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0U3ViZGlzY2lwbGluZSA8ZW0+U3ViZGlzY2lwbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsI2dldFJlZmVyZW5jZVdvcmtmbG93cyA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIERpc2NpcGxpbmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFza3MoKSA8ZW0+VGFza3M8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0YXNrcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJkaXNjaXBsaW5lKCkgPGVtPlN1YmRpc2NpcGxpbmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViZGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHN1YmRpc2NpcGxpbmUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCkgPGVtPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVmZXJlbmNlV29ya2Zsb3dzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNjaXBsaW5lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUYXNrcygpIHsKLQkJaWYgKHRhc2tzID09IG51bGwpIHsKLQkJCXRhc2tzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChUYXNrLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0tTKTsKLQkJfQotCQlyZXR1cm4gdGFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U3ViZGlzY2lwbGluZSgpIHsKLQkJaWYgKHN1YmRpc2NpcGxpbmUgPT0gbnVsbCkgewotCQkJc3ViZGlzY2lwbGluZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoCi0JCQkJCURpc2NpcGxpbmUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORSk7Ci0JCX0KLQkJcmV0dXJuIHN1YmRpc2NpcGxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCkgewotCQlpZiAocmVmZXJlbmNlV29ya2Zsb3dzID09IG51bGwpIHsKLQkJCXJlZmVyZW5jZVdvcmtmbG93cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoQWN0aXZpdHkuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUyk7Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZVdvcmtmbG93czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldFN1YmRpc2NpcGxpbmUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19UQVNLUzoKLQkJCXJldHVybiBnZXRUYXNrcygpOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORToKLQkJCXJldHVybiBnZXRTdWJkaXNjaXBsaW5lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1dTOgotCQkJcmV0dXJuIGdldFJlZmVyZW5jZVdvcmtmbG93cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19UQVNLUzoKLQkJCWdldFRhc2tzKCkuY2xlYXIoKTsKLQkJCWdldFRhc2tzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJZ2V0U3ViZGlzY2lwbGluZSgpLmNsZWFyKCk7Ci0JCQlnZXRTdWJkaXNjaXBsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1dTOgotCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCkuY2xlYXIoKTsKLQkJCWdldFJlZmVyZW5jZVdvcmtmbG93cygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0tTOgotCQkJZ2V0VGFza3MoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORToKLQkJCWdldFN1YmRpc2NpcGxpbmUoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUzoKLQkJCWdldFJlZmVyZW5jZVdvcmtmbG93cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19UQVNLUzoKLQkJCXJldHVybiB0YXNrcyAhPSBudWxsICYmICF0YXNrcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJcmV0dXJuIHN1YmRpc2NpcGxpbmUgIT0gbnVsbCAmJiAhc3ViZGlzY2lwbGluZS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1dTOgotCQkJcmV0dXJuIHJlZmVyZW5jZVdvcmtmbG93cyAhPSBudWxsICYmICFyZWZlcmVuY2VXb3JrZmxvd3MuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9EaXNjaXBsaW5lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRG9tYWluSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRG9tYWluSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhM2RhZDRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RvbWFpbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvbWFpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGwjZ2V0V29ya1Byb2R1Y3RzIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRG9tYWluSW1wbCNnZXRTdWJkb21haW5zIDxlbT5TdWJkb21haW5zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBEb21haW4gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1Byb2R1Y3RzKCkgPGVtPldvcmsgUHJvZHVjdHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgd29ya1Byb2R1Y3RzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YmRvbWFpbnMoKSA8ZW0+U3ViZG9tYWluczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJkb21haW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc3ViZG9tYWlucyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG9tYWluSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9NQUlOOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdvcmtQcm9kdWN0cygpIHsKLQkJaWYgKHdvcmtQcm9kdWN0cyA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFdvcmtQcm9kdWN0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUUyk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTdWJkb21haW5zKCkgewotCQlpZiAoc3ViZG9tYWlucyA9PSBudWxsKSB7Ci0JCQlzdWJkb21haW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZyhEb21haW4uY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU5TKTsKLQkJfQotCQlyZXR1cm4gc3ViZG9tYWluczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU5TOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0U3ViZG9tYWlucygpKQotCQkJCQkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3RzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM6Ci0JCQlyZXR1cm4gZ2V0U3ViZG9tYWlucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVFM6Ci0JCQlnZXRXb3JrUHJvZHVjdHMoKS5jbGVhcigpOwotCQkJZ2V0V29ya1Byb2R1Y3RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM6Ci0JCQlnZXRTdWJkb21haW5zKCkuY2xlYXIoKTsKLQkJCWdldFN1YmRvbWFpbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVFM6Ci0JCQlnZXRXb3JrUHJvZHVjdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU5TOgotCQkJZ2V0U3ViZG9tYWlucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gd29ya1Byb2R1Y3RzICE9IG51bGwgJiYgIXdvcmtQcm9kdWN0cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM6Ci0JCQlyZXR1cm4gc3ViZG9tYWlucyAhPSBudWxsICYmICFzdWJkb21haW5zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vRG9tYWluSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwNjcxMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWxlbWVudEltcGwgZXh0ZW5kcyBNdWx0aVJlc291cmNlRU9iamVjdCBpbXBsZW1lbnRzCi0JCUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FTEVNRU5UOwotCX0KLQotfSAvL0VsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FbGxpcHNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRWxsaXBzZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2E3ZWU5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FbGxpcHNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGxpcHNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwjZ2V0UmFkaXVzWCA8ZW0+UmFkaXVzIFg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbCNnZXRSYWRpdXNZIDxlbT5SYWRpdXMgWTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsI2dldFJvdGF0aW9uIDxlbT5Sb3RhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsI2dldFN0YXJ0QW5nbGUgPGVtPlN0YXJ0IEFuZ2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwjZ2V0RW5kQW5nbGUgPGVtPkVuZCBBbmdsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsI2dldENlbnRlciA8ZW0+Q2VudGVyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWxsaXBzZUltcGwgZXh0ZW5kcyBHcmFwaGljUHJpbWl0aXZlSW1wbCBpbXBsZW1lbnRzIEVsbGlwc2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhZGl1c1goKSA8ZW0+UmFkaXVzIFg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhZGl1c1goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRG91YmxlIFJBRElVU19YX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhZGl1c1goKSA8ZW0+UmFkaXVzIFg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhZGl1c1goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgcmFkaXVzWCA9IFJBRElVU19YX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhZGl1c1koKSA8ZW0+UmFkaXVzIFk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhZGl1c1koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRG91YmxlIFJBRElVU19ZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhZGl1c1koKSA8ZW0+UmFkaXVzIFk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhZGl1c1koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgcmFkaXVzWSA9IFJBRElVU19ZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvdGF0aW9uKCkgPGVtPlJvdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgUk9UQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um90YXRpb24oKSA8ZW0+Um90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG91YmxlIHJvdGF0aW9uID0gUk9UQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnRBbmdsZSgpIDxlbT5TdGFydCBBbmdsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnRBbmdsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgU1RBUlRfQU5HTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnRBbmdsZSgpIDxlbT5TdGFydCBBbmdsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnRBbmdsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSBzdGFydEFuZ2xlID0gU1RBUlRfQU5HTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5kQW5nbGUoKSA8ZW0+RW5kIEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbmRBbmdsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgRU5EX0FOR0xFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuZEFuZ2xlKCkgPGVtPkVuZCBBbmdsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW5kQW5nbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgZW5kQW5nbGUgPSBFTkRfQU5HTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDZW50ZXIoKSA8ZW0+Q2VudGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDZW50ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBjZW50ZXIgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVsbGlwc2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0UmFkaXVzWCgpIHsKLQkJcmV0dXJuIHJhZGl1c1g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFkaXVzWChEb3VibGUgbmV3UmFkaXVzWCkgewotCQlEb3VibGUgb2xkUmFkaXVzWCA9IHJhZGl1c1g7Ci0JCXJhZGl1c1ggPSBuZXdSYWRpdXNYOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19YLCBvbGRSYWRpdXNYLCByYWRpdXNYKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRSYWRpdXNZKCkgewotCQlyZXR1cm4gcmFkaXVzWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSYWRpdXNZKERvdWJsZSBuZXdSYWRpdXNZKSB7Ci0JCURvdWJsZSBvbGRSYWRpdXNZID0gcmFkaXVzWTsKLQkJcmFkaXVzWSA9IG5ld1JhZGl1c1k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1ksIG9sZFJhZGl1c1ksIHJhZGl1c1kpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG91YmxlIGdldFJvdGF0aW9uKCkgewotCQlyZXR1cm4gcm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um90YXRpb24oRG91YmxlIG5ld1JvdGF0aW9uKSB7Ci0JCURvdWJsZSBvbGRSb3RhdGlvbiA9IHJvdGF0aW9uOwotCQlyb3RhdGlvbiA9IG5ld1JvdGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkVMTElQU0VfX1JPVEFUSU9OLCBvbGRSb3RhdGlvbiwgcm90YXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG91YmxlIGdldFN0YXJ0QW5nbGUoKSB7Ci0JCXJldHVybiBzdGFydEFuZ2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0QW5nbGUoRG91YmxlIG5ld1N0YXJ0QW5nbGUpIHsKLQkJRG91YmxlIG9sZFN0YXJ0QW5nbGUgPSBzdGFydEFuZ2xlOwotCQlzdGFydEFuZ2xlID0gbmV3U3RhcnRBbmdsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5FTExJUFNFX19TVEFSVF9BTkdMRSwgb2xkU3RhcnRBbmdsZSwgc3RhcnRBbmdsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0RW5kQW5nbGUoKSB7Ci0JCXJldHVybiBlbmRBbmdsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRBbmdsZShEb3VibGUgbmV3RW5kQW5nbGUpIHsKLQkJRG91YmxlIG9sZEVuZEFuZ2xlID0gZW5kQW5nbGU7Ci0JCWVuZEFuZ2xlID0gbmV3RW5kQW5nbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRUxMSVBTRV9fRU5EX0FOR0xFLCBvbGRFbmRBbmdsZSwgZW5kQW5nbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0Q2VudGVyKCkgewotCQlpZiAoY2VudGVyICE9IG51bGwgJiYgKChFT2JqZWN0KSBjZW50ZXIpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRDZW50ZXIgPSAoSW50ZXJuYWxFT2JqZWN0KSBjZW50ZXI7Ci0JCQljZW50ZXIgPSAoUG9pbnQpIGVSZXNvbHZlUHJveHkob2xkQ2VudGVyKTsKLQkJCWlmIChjZW50ZXIgIT0gb2xkQ2VudGVyKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld0NlbnRlciA9IChJbnRlcm5hbEVPYmplY3QpIGNlbnRlcjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkQ2VudGVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVIsCi0JCQkJCQludWxsLCBudWxsKTsKLQkJCQlpZiAobmV3Q2VudGVyLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld0NlbnRlci5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJLSBVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUiwgbnVsbCwgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuRUxMSVBTRV9fQ0VOVEVSLCBvbGRDZW50ZXIsIGNlbnRlcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjZW50ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGJhc2ljR2V0Q2VudGVyKCkgewotCQlyZXR1cm4gY2VudGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENlbnRlcihQb2ludCBuZXdDZW50ZXIsCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBvaW50IG9sZENlbnRlciA9IGNlbnRlcjsKLQkJY2VudGVyID0gbmV3Q2VudGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUiwgb2xkQ2VudGVyLAotCQkJCQluZXdDZW50ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2VudGVyKFBvaW50IG5ld0NlbnRlcikgewotCQlpZiAobmV3Q2VudGVyICE9IGNlbnRlcikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2VudGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBjZW50ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVIsCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDZW50ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0NlbnRlcikuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2VudGVyKG5ld0NlbnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRUxMSVBTRV9fQ0VOVEVSLCBuZXdDZW50ZXIsIG5ld0NlbnRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVI6Ci0JCQlyZXR1cm4gYmFzaWNTZXRDZW50ZXIobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19YOgotCQkJcmV0dXJuIGdldFJhZGl1c1goKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19ZOgotCQkJcmV0dXJuIGdldFJhZGl1c1koKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JPVEFUSU9OOgotCQkJcmV0dXJuIGdldFJvdGF0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19TVEFSVF9BTkdMRToKLQkJCXJldHVybiBnZXRTdGFydEFuZ2xlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19FTkRfQU5HTEU6Ci0JCQlyZXR1cm4gZ2V0RW5kQW5nbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDZW50ZXIoKTsKLQkJCXJldHVybiBiYXNpY0dldENlbnRlcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWDoKLQkJCXNldFJhZGl1c1goKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1k6Ci0JCQlzZXRSYWRpdXNZKChEb3VibGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JPVEFUSU9OOgotCQkJc2V0Um90YXRpb24oKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fU1RBUlRfQU5HTEU6Ci0JCQlzZXRTdGFydEFuZ2xlKChEb3VibGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0VORF9BTkdMRToKLQkJCXNldEVuZEFuZ2xlKChEb3VibGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUjoKLQkJCXNldENlbnRlcigoUG9pbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWDoKLQkJCXNldFJhZGl1c1goUkFESVVTX1hfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1k6Ci0JCQlzZXRSYWRpdXNZKFJBRElVU19ZX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JPVEFUSU9OOgotCQkJc2V0Um90YXRpb24oUk9UQVRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fU1RBUlRfQU5HTEU6Ci0JCQlzZXRTdGFydEFuZ2xlKFNUQVJUX0FOR0xFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0VORF9BTkdMRToKLQkJCXNldEVuZEFuZ2xlKEVORF9BTkdMRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVI6Ci0JCQlzZXRDZW50ZXIoKFBvaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19YOgotCQkJcmV0dXJuIFJBRElVU19YX0VERUZBVUxUID09IG51bGwgPyByYWRpdXNYICE9IG51bGwKLQkJCQkJOiAhUkFESVVTX1hfRURFRkFVTFQuZXF1YWxzKHJhZGl1c1gpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1k6Ci0JCQlyZXR1cm4gUkFESVVTX1lfRURFRkFVTFQgPT0gbnVsbCA/IHJhZGl1c1kgIT0gbnVsbAotCQkJCQk6ICFSQURJVVNfWV9FREVGQVVMVC5lcXVhbHMocmFkaXVzWSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19ST1RBVElPTjoKLQkJCXJldHVybiBST1RBVElPTl9FREVGQVVMVCA9PSBudWxsID8gcm90YXRpb24gIT0gbnVsbAotCQkJCQk6ICFST1RBVElPTl9FREVGQVVMVC5lcXVhbHMocm90YXRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fU1RBUlRfQU5HTEU6Ci0JCQlyZXR1cm4gU1RBUlRfQU5HTEVfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0QW5nbGUgIT0gbnVsbAotCQkJCQk6ICFTVEFSVF9BTkdMRV9FREVGQVVMVC5lcXVhbHMoc3RhcnRBbmdsZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19FTkRfQU5HTEU6Ci0JCQlyZXR1cm4gRU5EX0FOR0xFX0VERUZBVUxUID09IG51bGwgPyBlbmRBbmdsZSAhPSBudWxsCi0JCQkJCTogIUVORF9BTkdMRV9FREVGQVVMVC5lcXVhbHMoZW5kQW5nbGUpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fQ0VOVEVSOgotCQkJcmV0dXJuIGNlbnRlciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJhZGl1c1g6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmFkaXVzWCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmFkaXVzWTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyYWRpdXNZKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByb3RhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyb3RhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhcnRBbmdsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzdGFydEFuZ2xlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbmRBbmdsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlbmRBbmdsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0VsbGlwc2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxYWViZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzCi0JCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQl9Ci0KLX0gLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FeGFtcGxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRXhhbXBsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDc0NzZhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FeGFtcGxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4YW1wbGVJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgRXhhbXBsZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXhhbXBsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVYQU1QTEU7Ci0JfQotCi19IC8vRXhhbXBsZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoQ29ubmVjdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhDb25uZWN0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY5NzRjOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhDb25uZWN0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggQ29ubmVjdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhDb25uZWN0b3JJbXBsI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoQ29ubmVjdG9ySW1wbCNnZXRHcmFwaEVkZ2UgPGVtPkdyYXBoIEVkZ2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaENvbm5lY3RvckltcGwgZXh0ZW5kcyBHcmFwaEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJR3JhcGhDb25uZWN0b3IgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JhcGhFZGdlKCkgPGVtPkdyYXBoIEVkZ2U8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JhcGhFZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZ3JhcGhFZGdlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHcmFwaENvbm5lY3RvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0NPTk5FQ1RPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhFbGVtZW50IGdldEdyYXBoRWxlbWVudCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChHcmFwaEVsZW1lbnQpIGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhFbGVtZW50IGJhc2ljR2V0R3JhcGhFbGVtZW50KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEdyYXBoRWxlbWVudCkgZUludGVybmFsQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCBuZXdHcmFwaEVsZW1lbnQsCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3R3JhcGhFbGVtZW50LAotCQkJCVVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5ULCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCBuZXdHcmFwaEVsZW1lbnQpIHsKLQkJaWYgKG5ld0dyYXBoRWxlbWVudCAhPSBlSW50ZXJuYWxDb250YWluZXIoKQotCQkJCXx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UICYmIG5ld0dyYXBoRWxlbWVudCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIChFT2JqZWN0KSBuZXdHcmFwaEVsZW1lbnQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3R3JhcGhFbGVtZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdHcmFwaEVsZW1lbnQpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRSwKLQkJCQkJCUdyYXBoRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRHcmFwaEVsZW1lbnQobmV3R3JhcGhFbGVtZW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQsIG5ld0dyYXBoRWxlbWVudCwKLQkJCQkJbmV3R3JhcGhFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0R3JhcGhFZGdlKCkgewotCQlpZiAoZ3JhcGhFZGdlID09IG51bGwpIHsKLQkJCWdyYXBoRWRnZSA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdC5NYW55SW52ZXJzZSgKLQkJCQkJR3JhcGhFZGdlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRSwKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FREdFX19BTkNIT1IpOwotCQl9Ci0JCXJldHVybiBncmFwaEVkZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVDoKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEdyYXBoRWRnZSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gYmFzaWNTZXRHcmFwaEVsZW1lbnQobnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0U6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRHcmFwaEVkZ2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFLCBHcmFwaEVsZW1lbnQuY2xhc3MsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0R3JhcGhFbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRHcmFwaEVsZW1lbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRToKLQkJCXJldHVybiBnZXRHcmFwaEVkZ2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UOgotCQkJc2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRToKLQkJCWdldEdyYXBoRWRnZSgpLmNsZWFyKCk7Ci0JCQlnZXRHcmFwaEVkZ2UoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlzZXRHcmFwaEVsZW1lbnQoKEdyYXBoRWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0U6Ci0JCQlnZXRHcmFwaEVkZ2UoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGJhc2ljR2V0R3JhcGhFbGVtZW50KCkgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRToKLQkJCXJldHVybiBncmFwaEVkZ2UgIT0gbnVsbCAmJiAhZ3JhcGhFZGdlLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vR3JhcGhDb25uZWN0b3JJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaEVkZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaEVkZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiMmM5MDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhFZGdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoIEVkZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVkZ2VJbXBsI2dldEFuY2hvciA8ZW0+QW5jaG9yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFZGdlSW1wbCNnZXRXYXlwb2ludHMgPGVtPldheXBvaW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoRWRnZUltcGwgZXh0ZW5kcyBHcmFwaEVsZW1lbnRJbXBsIGltcGxlbWVudHMgR3JhcGhFZGdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFuY2hvcigpIDxlbT5BbmNob3I8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QW5jaG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYW5jaG9yID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdheXBvaW50cygpIDxlbT5XYXlwb2ludHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2F5cG9pbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgd2F5cG9pbnRzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHcmFwaEVkZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FREdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFuY2hvcigpIHsKLQkJaWYgKGFuY2hvciA9PSBudWxsKSB7Ci0JCQlhbmNob3IgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QuTWFueUludmVyc2UoCi0JCQkJCUdyYXBoQ29ubmVjdG9yLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX0FOQ0hPUiwKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0UpOwotCQl9Ci0JCXJldHVybiBhbmNob3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2F5cG9pbnRzKCkgewotCQlpZiAod2F5cG9pbnRzID09IG51bGwpIHsKLQkJCXdheXBvaW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoUG9pbnQuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fV0FZUE9JTlRTKTsKLQkJfQotCQlyZXR1cm4gd2F5cG9pbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19BTkNIT1I6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRBbmNob3IoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0QW5jaG9yKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX1dBWVBPSU5UUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldFdheXBvaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX0FOQ0hPUjoKLQkJCXJldHVybiBnZXRBbmNob3IoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX1dBWVBPSU5UUzoKLQkJCXJldHVybiBnZXRXYXlwb2ludHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SOgotCQkJZ2V0QW5jaG9yKCkuY2xlYXIoKTsKLQkJCWdldEFuY2hvcigpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fV0FZUE9JTlRTOgotCQkJZ2V0V2F5cG9pbnRzKCkuY2xlYXIoKTsKLQkJCWdldFdheXBvaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX0FOQ0hPUjoKLQkJCWdldEFuY2hvcigpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19XQVlQT0lOVFM6Ci0JCQlnZXRXYXlwb2ludHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SOgotCQkJcmV0dXJuIGFuY2hvciAhPSBudWxsICYmICFhbmNob3IuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fV0FZUE9JTlRTOgotCQkJcmV0dXJuIHdheXBvaW50cyAhPSBudWxsICYmICF3YXlwb2ludHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9HcmFwaEVkZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2ZTM2ZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwjZ2V0UG9zaXRpb24gPGVtPlBvc2l0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFbGVtZW50SW1wbCNnZXRDb250YWluZWQgPGVtPkNvbnRhaW5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwjZ2V0TGluayA8ZW0+TGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwjZ2V0QW5jaG9yYWdlIDxlbT5BbmNob3JhZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsI2dldFNlbWFudGljTW9kZWwgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR3JhcGhFbGVtZW50SW1wbCBleHRlbmRzIERpYWdyYW1FbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUdyYXBoRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3NpdGlvbigpIDxlbT5Qb3NpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBwb3NpdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250YWluZWQoKSA8ZW0+Q29udGFpbmVkPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRhaW5lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbnRhaW5lZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rKCkgPGVtPkxpbms8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGxpbmsgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QW5jaG9yYWdlKCkgPGVtPkFuY2hvcmFnZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbmNob3JhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhbmNob3JhZ2UgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VtYW50aWNNb2RlbCgpIDxlbT5TZW1hbnRpYyBNb2RlbDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VtYW50aWNNb2RlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFNlbWFudGljTW9kZWxCcmlkZ2Ugc2VtYW50aWNNb2RlbCA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3JhcGhFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0UG9zaXRpb24oKSB7Ci0JCWlmIChwb3NpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcG9zaXRpb24pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQb3NpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc2l0aW9uOwotCQkJcG9zaXRpb24gPSAoUG9pbnQpIGVSZXNvbHZlUHJveHkob2xkUG9zaXRpb24pOwotCQkJaWYgKHBvc2l0aW9uICE9IG9sZFBvc2l0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Bvc2l0aW9uID0gKEludGVybmFsRU9iamVjdCkgcG9zaXRpb247Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFBvc2l0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTiwgbnVsbCwKLQkJCQkJCW51bGwpOwotCQkJCWlmIChuZXdQb3NpdGlvbi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQb3NpdGlvbi5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJLSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OLCBudWxsLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTiwgb2xkUG9zaXRpb24sCi0JCQkJCQkJcG9zaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGJhc2ljR2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBwb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3NpdGlvbihQb2ludCBuZXdQb3NpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUG9pbnQgb2xkUG9zaXRpb24gPSBwb3NpdGlvbjsKLQkJcG9zaXRpb24gPSBuZXdQb3NpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTiwKLQkJCQkJb2xkUG9zaXRpb24sIG5ld1Bvc2l0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc2l0aW9uKFBvaW50IG5ld1Bvc2l0aW9uKSB7Ci0JCWlmIChuZXdQb3NpdGlvbiAhPSBwb3NpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocG9zaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBvc2l0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04sIG51bGwsCi0JCQkJCQltc2dzKTsKLQkJCWlmIChuZXdQb3NpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UG9zaXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTiwgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zaXRpb24obmV3UG9zaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OLCBuZXdQb3NpdGlvbiwKLQkJCQkJbmV3UG9zaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb250YWluZWQoKSB7Ci0JCWlmIChjb250YWluZWQgPT0gbnVsbCkgewotCQkJY29udGFpbmVkID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QuUmVzb2x2aW5nKAotCQkJCQlEaWFncmFtRWxlbWVudC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVIpOwotCQl9Ci0JCXJldHVybiBjb250YWluZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TGluaygpIHsKLQkJaWYgKGxpbmsgPT0gbnVsbCkgewotCQkJbGluayA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0LlJlc29sdmluZygKLQkJCQkJRGlhZ3JhbUxpbmsuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSywKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQpOwotCQl9Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFuY2hvcmFnZSgpIHsKLQkJaWYgKGFuY2hvcmFnZSA9PSBudWxsKSB7Ci0JCQlhbmNob3JhZ2UgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdC5SZXNvbHZpbmcoCi0JCQkJCUdyYXBoQ29ubmVjdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRSwKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQpOwotCQl9Ci0JCXJldHVybiBhbmNob3JhZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlbWFudGljTW9kZWxCcmlkZ2UgZ2V0U2VtYW50aWNNb2RlbCgpIHsKLQkJaWYgKHNlbWFudGljTW9kZWwgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHNlbWFudGljTW9kZWwpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRTZW1hbnRpY01vZGVsID0gKEludGVybmFsRU9iamVjdCkgc2VtYW50aWNNb2RlbDsKLQkJCXNlbWFudGljTW9kZWwgPSAoU2VtYW50aWNNb2RlbEJyaWRnZSkgZVJlc29sdmVQcm94eShvbGRTZW1hbnRpY01vZGVsKTsKLQkJCWlmIChzZW1hbnRpY01vZGVsICE9IG9sZFNlbWFudGljTW9kZWwpIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3U2VtYW50aWNNb2RlbCA9IChJbnRlcm5hbEVPYmplY3QpIHNlbWFudGljTW9kZWw7Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFNlbWFudGljTW9kZWwuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5ULAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbnVsbCk7Ci0JCQkJaWYgKG5ld1NlbWFudGljTW9kZWwuZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3U2VtYW50aWNNb2RlbC5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5ULAotCQkJCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCQkJCW9sZFNlbWFudGljTW9kZWwsIHNlbWFudGljTW9kZWwpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VtYW50aWNNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VtYW50aWNNb2RlbEJyaWRnZSBiYXNpY0dldFNlbWFudGljTW9kZWwoKSB7Ci0JCXJldHVybiBzZW1hbnRpY01vZGVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlbWFudGljTW9kZWwoCi0JCQlTZW1hbnRpY01vZGVsQnJpZGdlIG5ld1NlbWFudGljTW9kZWwsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJU2VtYW50aWNNb2RlbEJyaWRnZSBvbGRTZW1hbnRpY01vZGVsID0gc2VtYW50aWNNb2RlbDsKLQkJc2VtYW50aWNNb2RlbCA9IG5ld1NlbWFudGljTW9kZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsCi0JCQkJCW9sZFNlbWFudGljTW9kZWwsIG5ld1NlbWFudGljTW9kZWwpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VtYW50aWNNb2RlbChTZW1hbnRpY01vZGVsQnJpZGdlIG5ld1NlbWFudGljTW9kZWwpIHsKLQkJaWYgKG5ld1NlbWFudGljTW9kZWwgIT0gc2VtYW50aWNNb2RlbCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc2VtYW50aWNNb2RlbCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc2VtYW50aWNNb2RlbCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5ULAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3U2VtYW50aWNNb2RlbCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3U2VtYW50aWNNb2RlbCkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5ULAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTZW1hbnRpY01vZGVsKG5ld1NlbWFudGljTW9kZWwsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLCBuZXdTZW1hbnRpY01vZGVsLAotCQkJCQluZXdTZW1hbnRpY01vZGVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldENvbnRhaW5lZCgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0TGluaygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRBbmNob3JhZ2UoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlpZiAoc2VtYW50aWNNb2RlbCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc2VtYW50aWNNb2RlbCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRTZW1hbnRpY01vZGVsKChTZW1hbnRpY01vZGVsQnJpZGdlKSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFBvc2l0aW9uKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0Q29udGFpbmVkKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0xJTks6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRMaW5rKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEFuY2hvcmFnZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDoKLQkJCXJldHVybiBiYXNpY1NldFNlbWFudGljTW9kZWwobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFBvc2l0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQb3NpdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOgotCQkJcmV0dXJuIGdldENvbnRhaW5lZCgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSzoKLQkJCXJldHVybiBnZXRMaW5rKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U6Ci0JCQlyZXR1cm4gZ2V0QW5jaG9yYWdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRTZW1hbnRpY01vZGVsKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOgotCQkJc2V0UG9zaXRpb24oKFBvaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCQlnZXRDb250YWluZWQoKS5jbGVhcigpOwotCQkJZ2V0Q29udGFpbmVkKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LOgotCQkJZ2V0TGluaygpLmNsZWFyKCk7Ci0JCQlnZXRMaW5rKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U6Ci0JCQlnZXRBbmNob3JhZ2UoKS5jbGVhcigpOwotCQkJZ2V0QW5jaG9yYWdlKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDoKLQkJCXNldFNlbWFudGljTW9kZWwoKFNlbWFudGljTW9kZWxCcmlkZ2UpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTjoKLQkJCXNldFBvc2l0aW9uKChQb2ludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCQlnZXRDb250YWluZWQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSzoKLQkJCWdldExpbmsoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQkJZ2V0QW5jaG9yYWdlKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOgotCQkJc2V0U2VtYW50aWNNb2RlbCgoU2VtYW50aWNNb2RlbEJyaWRnZSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTjoKLQkJCXJldHVybiBwb3NpdGlvbiAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOgotCQkJcmV0dXJuIGNvbnRhaW5lZCAhPSBudWxsICYmICFjb250YWluZWQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSzoKLQkJCXJldHVybiBsaW5rICE9IG51bGwgJiYgIWxpbmsuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQkJcmV0dXJuIGFuY2hvcmFnZSAhPSBudWxsICYmICFhbmNob3JhZ2UuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlyZXR1cm4gc2VtYW50aWNNb2RlbCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9HcmFwaEVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaE5vZGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaE5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4YTBhOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhOb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaCBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhOb2RlSW1wbCNnZXRTaXplIDxlbT5TaXplPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhOb2RlSW1wbCBleHRlbmRzIEdyYXBoRWxlbWVudEltcGwgaW1wbGVtZW50cyBHcmFwaE5vZGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2l6ZSgpIDxlbT5TaXplPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIHNpemUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX05PREU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBnZXRTaXplKCkgewotCQlpZiAoc2l6ZSAhPSBudWxsICYmICgoRU9iamVjdCkgc2l6ZSkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNpemUgPSAoSW50ZXJuYWxFT2JqZWN0KSBzaXplOwotCQkJc2l6ZSA9IChEaW1lbnNpb24pIGVSZXNvbHZlUHJveHkob2xkU2l6ZSk7Ci0JCQlpZiAoc2l6ZSAhPSBvbGRTaXplKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1NpemUgPSAoSW50ZXJuYWxFT2JqZWN0KSBzaXplOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRTaXplLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5HUkFQSF9OT0RFX19TSVpFLAotCQkJCQkJbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1NpemUuZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3U2l6ZS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJLSBVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkUsIG51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkUsIG9sZFNpemUsIHNpemUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGltZW5zaW9uIGJhc2ljR2V0U2l6ZSgpIHsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2l6ZShEaW1lbnNpb24gbmV3U2l6ZSwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRGltZW5zaW9uIG9sZFNpemUgPSBzaXplOwotCQlzaXplID0gbmV3U2l6ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5HUkFQSF9OT0RFX19TSVpFLCBvbGRTaXplLAotCQkJCQluZXdTaXplKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpemUoRGltZW5zaW9uIG5ld1NpemUpIHsKLQkJaWYgKG5ld1NpemUgIT0gc2l6ZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc2l6ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc2l6ZSkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkUsCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTaXplICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdTaXplKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRSwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U2l6ZShuZXdTaXplLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9OT0RFX19TSVpFLCBuZXdTaXplLCBuZXdTaXplKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkU6Ci0JCQlyZXR1cm4gYmFzaWNTZXRTaXplKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9OT0RFX19TSVpFOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFNpemUoKTsKLQkJCXJldHVybiBiYXNpY0dldFNpemUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRToKLQkJCXNldFNpemUoKERpbWVuc2lvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkU6Ci0JCQlzZXRTaXplKChEaW1lbnNpb24pIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRToKLQkJCXJldHVybiBzaXplICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0dyYXBoTm9kZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoaWNQcmltaXRpdmVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaGljUHJpbWl0aXZlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWExMmQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoaWNQcmltaXRpdmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaGljIFByaW1pdGl2ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEdyYXBoaWNQcmltaXRpdmVJbXBsIGV4dGVuZHMgTGVhZkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJR3JhcGhpY1ByaW1pdGl2ZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3JhcGhpY1ByaW1pdGl2ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBISUNfUFJJTUlUSVZFOwotCX0KLQotfSAvL0dyYXBoaWNQcmltaXRpdmVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkYW5jZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZThkNjEyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkYW5jZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwjZ2V0QXR0YWNobWVudHMgPGVtPkF0dGFjaG1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMKLQkJR3VpZGFuY2VEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0YWNobWVudHMoKSA8ZW0+QXR0YWNobWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dGFjaG1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRBQ0hNRU5UU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0YWNobWVudHMoKSA8ZW0+QXR0YWNobWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dGFjaG1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dGFjaG1lbnRzID0gQVRUQUNITUVOVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdVSURBTkNFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0YWNobWVudHMoKSB7Ci0JCXJldHVybiBhdHRhY2htZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRhY2htZW50cyhTdHJpbmcgbmV3QXR0YWNobWVudHMpIHsKLQkJU3RyaW5nIG9sZEF0dGFjaG1lbnRzID0gYXR0YWNobWVudHM7Ci0JCWF0dGFjaG1lbnRzID0gbmV3QXR0YWNobWVudHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTLAotCQkJCQlvbGRBdHRhY2htZW50cywgYXR0YWNobWVudHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFM6Ci0JCQlyZXR1cm4gZ2V0QXR0YWNobWVudHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTOgotCQkJc2V0QXR0YWNobWVudHMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUzoKLQkJCXNldEF0dGFjaG1lbnRzKEFUVEFDSE1FTlRTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUzoKLQkJCXJldHVybiBBVFRBQ0hNRU5UU19FREVGQVVMVCA9PSBudWxsID8gYXR0YWNobWVudHMgIT0gbnVsbAotCQkJCQk6ICFBVFRBQ0hNRU5UU19FREVGQVVMVC5lcXVhbHMoYXR0YWNobWVudHMpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dGFjaG1lbnRzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGF0dGFjaG1lbnRzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0d1aWRhbmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGFuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1YWJiZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGFuY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHdWlkYW5jZUltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlHdWlkYW5jZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGFuY2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRTsKLQl9Ci0KLX0gLy9HdWlkYW5jZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0d1aWRlbGluZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0d1aWRlbGluZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWVlMTlhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkZWxpbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRlbGluZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBHdWlkZWxpbmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRlbGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdVSURFTElORTsKLQl9Ci0KLX0gLy9HdWlkZWxpbmVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9JbWFnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0ltYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMWUxMTlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0ltYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbWFnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkltYWdlSW1wbCNnZXRVcmkgPGVtPlVyaTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkltYWdlSW1wbCNnZXRNaW1lVHlwZSA8ZW0+TWltZSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VJbXBsIGV4dGVuZHMgTGVhZkVsZW1lbnRJbXBsIGltcGxlbWVudHMgSW1hZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVyaSgpIDxlbT5Vcmk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgVVJJX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVyaSgpIDxlbT5Vcmk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFVSSSB1cmkgPSBVUklfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWltZVR5cGUoKSA8ZW0+TWltZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9UWVBFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaW1lVHlwZSgpIDxlbT5NaW1lIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1pbWVUeXBlID0gTUlNRV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuSU1BR0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBnZXRVcmkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpKFVSSSBuZXdVcmkpIHsKLQkJVVJJIG9sZFVyaSA9IHVyaTsKLQkJdXJpID0gbmV3VXJpOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLklNQUdFX19VUkksIG9sZFVyaSwgdXJpKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKLQkJcmV0dXJuIG1pbWVUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbWVUeXBlKFN0cmluZyBuZXdNaW1lVHlwZSkgewotCQlTdHJpbmcgb2xkTWltZVR5cGUgPSBtaW1lVHlwZTsKLQkJbWltZVR5cGUgPSBuZXdNaW1lVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5JTUFHRV9fTUlNRV9UWVBFLCBvbGRNaW1lVHlwZSwgbWltZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fVVJJOgotCQkJcmV0dXJuIGdldFVyaSgpOwotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0VfX01JTUVfVFlQRToKLQkJCXJldHVybiBnZXRNaW1lVHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fVVJJOgotCQkJc2V0VXJpKChVUkkpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19NSU1FX1RZUEU6Ci0JCQlzZXRNaW1lVHlwZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0VfX1VSSToKLQkJCXNldFVyaShVUklfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0VfX01JTUVfVFlQRToKLQkJCXNldE1pbWVUeXBlKE1JTUVfVFlQRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fVVJJOgotCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxUCi0JCQkJCS5lcXVhbHModXJpKTsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19NSU1FX1RZUEU6Ci0JCQlyZXR1cm4gTUlNRV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBtaW1lVHlwZSAhPSBudWxsCi0JCQkJCTogIU1JTUVfVFlQRV9FREVGQVVMVC5lcXVhbHMobWltZVR5cGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVyaTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh1cmkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1pbWVUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1pbWVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSW1hZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9JdGVyYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9JdGVyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkMjIzOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JdGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVyYXRpb25JbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMgSXRlcmF0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5JVEVSQVRJT047Ci0JfQotCi19IC8vSXRlcmF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTGVhZkVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9MZWFmRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzc1N2EyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9MZWFmRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5MZWFmIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMZWFmRWxlbWVudEltcGwgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlMZWFmRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGVhZkVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5MRUFGX0VMRU1FTlQ7Ci0JfQotCi19IC8vTGVhZkVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kQ29uZmlndXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDhhODUyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uIDxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRQcm9jZXNzVmlld3MgPGVtPlByb2Nlc3MgVmlld3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXREZWZhdWx0VmlldyA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0QmFzZUNvbmZpZ3VyYXRpb25zIDxlbT5CYXNlIENvbmZpZ3VyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0U3VidHJhY3RlZENhdGVnb3J5IDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0QWRkZWRDYXRlZ29yeSA8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uSW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kUGx1Z2luU2VsZWN0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RQYWNrYWdlU2VsZWN0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2Nlc3NWaWV3cygpIDxlbT5Qcm9jZXNzIFZpZXdzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2Nlc3NWaWV3cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByb2Nlc3NWaWV3cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0VmlldygpIDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRWaWV3KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudENhdGVnb3J5IGRlZmF1bHRWaWV3ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VDb25maWd1cmF0aW9ucygpIDxlbT5CYXNlIENvbmZpZ3VyYXRpb25zPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VDb25maWd1cmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGJhc2VDb25maWd1cmF0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKSA8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzdWJ0cmFjdGVkQ2F0ZWdvcnkgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkZWRDYXRlZ29yeSgpIDxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRlZENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYWRkZWRDYXRlZ29yeSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpIHsKLQkJaWYgKG1ldGhvZFBsdWdpblNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQltZXRob2RQbHVnaW5TZWxlY3Rpb24gPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KAotCQkJCQlNZXRob2RQbHVnaW4uY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGx1Z2luU2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSB7Ci0JCWlmIChtZXRob2RQYWNrYWdlU2VsZWN0aW9uID09IG51bGwpIHsKLQkJCW1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KAotCQkJCQlNZXRob2RQYWNrYWdlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04pOwotCQl9Ci0JCXJldHVybiBtZXRob2RQYWNrYWdlU2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb2Nlc3NWaWV3cygpIHsKLQkJaWYgKHByb2Nlc3NWaWV3cyA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzVmlld3MgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KENvbnRlbnRDYXRlZ29yeS5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUyk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NWaWV3czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudENhdGVnb3J5IGdldERlZmF1bHRWaWV3KCkgewotCQlpZiAoZGVmYXVsdFZpZXcgIT0gbnVsbCAmJiAoKEVPYmplY3QpIGRlZmF1bHRWaWV3KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkRGVmYXVsdFZpZXcgPSAoSW50ZXJuYWxFT2JqZWN0KSBkZWZhdWx0VmlldzsKLQkJCWRlZmF1bHRWaWV3ID0gKENvbnRlbnRDYXRlZ29yeSkgZVJlc29sdmVQcm94eShvbGREZWZhdWx0Vmlldyk7Ci0JCQlpZiAoZGVmYXVsdFZpZXcgIT0gb2xkRGVmYXVsdFZpZXcpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVywKLQkJCQkJCQlvbGREZWZhdWx0VmlldywgZGVmYXVsdFZpZXcpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdFZpZXc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yeSBiYXNpY0dldERlZmF1bHRWaWV3KCkgewotCQlyZXR1cm4gZGVmYXVsdFZpZXc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZpZXcoQ29udGVudENhdGVnb3J5IG5ld0RlZmF1bHRWaWV3KSB7Ci0JCUNvbnRlbnRDYXRlZ29yeSBvbGREZWZhdWx0VmlldyA9IGRlZmF1bHRWaWV3OwotCQlkZWZhdWx0VmlldyA9IG5ld0RlZmF1bHRWaWV3OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcsCi0JCQkJCW9sZERlZmF1bHRWaWV3LCBkZWZhdWx0VmlldykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEJhc2VDb25maWd1cmF0aW9ucygpIHsKLQkJaWYgKGJhc2VDb25maWd1cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQliYXNlQ29uZmlndXJhdGlvbnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KAotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpIHsKLQkJaWYgKHN1YnRyYWN0ZWRDYXRlZ29yeSA9PSBudWxsKSB7Ci0JCQlzdWJ0cmFjdGVkQ2F0ZWdvcnkgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KAotCQkJCQlDb250ZW50Q2F0ZWdvcnkuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlkpOwotCQl9Ci0JCXJldHVybiBzdWJ0cmFjdGVkQ2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWRkZWRDYXRlZ29yeSgpIHsKLQkJaWYgKGFkZGVkQ2F0ZWdvcnkgPT0gbnVsbCkgewotCQkJYWRkZWRDYXRlZ29yeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoQ29udGVudENhdGVnb3J5LmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSk7Ci0JCX0KLQkJcmV0dXJuIGFkZGVkQ2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJcmV0dXJuIGdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCXJldHVybiBnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUzoKLQkJCXJldHVybiBnZXRQcm9jZXNzVmlld3MoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZpZXcoKTsKLQkJCXJldHVybiBiYXNpY0dldERlZmF1bHRWaWV3KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUzoKLQkJCXJldHVybiBnZXRCYXNlQ29uZmlndXJhdGlvbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJcmV0dXJuIGdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZOgotCQkJcmV0dXJuIGdldEFkZGVkQ2F0ZWdvcnkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY2xlYXIoKTsKLQkJCWdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCWdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFV1M6Ci0JCQlnZXRQcm9jZXNzVmlld3MoKS5jbGVhcigpOwotCQkJZ2V0UHJvY2Vzc1ZpZXdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJc2V0RGVmYXVsdFZpZXcoKENvbnRlbnRDYXRlZ29yeSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTlM6Ci0JCQlnZXRCYXNlQ29uZmlndXJhdGlvbnMoKS5jbGVhcigpOwotCQkJZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWToKLQkJCWdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQlnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWToKLQkJCWdldEFkZGVkQ2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJZ2V0QWRkZWRDYXRlZ29yeSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCWdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUzoKLQkJCWdldFByb2Nlc3NWaWV3cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJc2V0RGVmYXVsdFZpZXcoKENvbnRlbnRDYXRlZ29yeSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUzoKLQkJCWdldEJhc2VDb25maWd1cmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWToKLQkJCWdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk6Ci0JCQlnZXRBZGRlZENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCXJldHVybiBtZXRob2RQbHVnaW5TZWxlY3Rpb24gIT0gbnVsbAotCQkJCQkmJiAhbWV0aG9kUGx1Z2luU2VsZWN0aW9uLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT046Ci0JCQlyZXR1cm4gbWV0aG9kUGFja2FnZVNlbGVjdGlvbiAhPSBudWxsCi0JCQkJCSYmICFtZXRob2RQYWNrYWdlU2VsZWN0aW9uLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTOgotCQkJcmV0dXJuIHByb2Nlc3NWaWV3cyAhPSBudWxsICYmICFwcm9jZXNzVmlld3MuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVzoKLQkJCXJldHVybiBkZWZhdWx0VmlldyAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTlM6Ci0JCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb25zICE9IG51bGwgJiYgIWJhc2VDb25maWd1cmF0aW9ucy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWToKLQkJCXJldHVybiBzdWJ0cmFjdGVkQ2F0ZWdvcnkgIT0gbnVsbCAmJiAhc3VidHJhY3RlZENhdGVnb3J5LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWToKLQkJCXJldHVybiBhZGRlZENhdGVnb3J5ICE9IG51bGwgJiYgIWFkZGVkQ2F0ZWdvcnkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9NZXRob2RDb25maWd1cmF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjYTUxZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRHdWlkIDxlbT5HdWlkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRPd25lZFJ1bGVzIDxlbT5Pd25lZCBSdWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0T3JkZXJpbmdHdWlkZSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXRob2RFbGVtZW50SW1wbCBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHdWlkKCkgPGVtPkd1aWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEd1aWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURfRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3VpZCgpIDxlbT5HdWlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHdWlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGd1aWQgPSBHVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJyaWVmRGVzY3JpcHRpb24oKSA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJyaWVmRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJyaWVmRGVzY3JpcHRpb24oKSA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJyaWVmRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnJpZWZEZXNjcmlwdGlvbiA9IEJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3duZWRSdWxlcygpIDxlbT5Pd25lZCBSdWxlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPd25lZFJ1bGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgb3duZWRSdWxlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kRWxlbWVudFByb3BlcnR5ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBwcmVzc2VkKCkgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cHByZXNzZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBTVVBQUkVTU0VEX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1cHByZXNzZWQoKSA8ZW0+U3VwcHJlc3NlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VwcHJlc3NlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3VwcHJlc3NlZCA9IFNVUFBSRVNTRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJpbmdHdWlkZSgpIDxlbT5PcmRlcmluZyBHdWlkZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3JkZXJpbmdHdWlkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVJJTkdfR1VJREVfRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJpbmdHdWlkZSgpIDxlbT5PcmRlcmluZyBHdWlkZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3JkZXJpbmdHdWlkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBvcmRlcmluZ0d1aWRlID0gT1JERVJJTkdfR1VJREVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRHdWlkKCkgewotCQlpZiAoZ3VpZCA9PSBudWxsIHx8IGd1aWQubGVuZ3RoKCkgPT0gMCkgewotCQkJZ3VpZCA9IFVtYVV0aWwuZ2VuZXJhdGVHVUlEKCk7Ci0JCX0KLQkJcmV0dXJuIGd1aWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHdWlkKFN0cmluZyBuZXdHdWlkKSB7Ci0JCVN0cmluZyBvbGRHdWlkID0gZ3VpZDsKLQkJZ3VpZCA9IG5ld0d1aWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dVSUQsIG9sZEd1aWQsIGd1aWQpKTsKLQotCQkvLyBzeW5jaCB1cCB0aGUgcmVzb3VyY2UncyBJRFRvRU9iamVjdE1hcCBhbmQgRU9iamVjdFRvSURNYXAgd2l0aCBuZXdHdWlkCi0JCS8vCi0JCWlmIChlUmVzb3VyY2UoKSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKSB7Ci0JCQlYTUxSZXNvdXJjZSByZXNvdXJjZSA9ICgoWE1MUmVzb3VyY2UpIGVSZXNvdXJjZSgpKTsKLQkJCXJlc291cmNlLnNldElEKHRoaXMsIG5ld0d1aWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYnJpZWZEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCcmllZkRlc2NyaXB0aW9uKFN0cmluZyBuZXdCcmllZkRlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRCcmllZkRlc2NyaXB0aW9uID0gYnJpZWZEZXNjcmlwdGlvbjsKLQkJYnJpZWZEZXNjcmlwdGlvbiA9IG5ld0JyaWVmRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OLAotCQkJCQlvbGRCcmllZkRlc2NyaXB0aW9uLCBicmllZkRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0T3duZWRSdWxlcygpIHsKLQkJaWYgKG93bmVkUnVsZXMgPT0gbnVsbCkgewotCQkJb3duZWRSdWxlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoCi0JCQkJCUNvbnN0cmFpbnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTKTsKLQkJfQotCQlyZXR1cm4gb3duZWRSdWxlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSB7Ci0JCWlmIChtZXRob2RFbGVtZW50UHJvcGVydHkgPT0gbnVsbCkgewotCQkJbWV0aG9kRWxlbWVudFByb3BlcnR5ID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZygKLQkJCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRTdXBwcmVzc2VkKCkgewotCQlyZXR1cm4gc3VwcHJlc3NlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc2VkKEJvb2xlYW4gbmV3U3VwcHJlc3NlZCkgewotCQlCb29sZWFuIG9sZFN1cHByZXNzZWQgPSBzdXBwcmVzc2VkOwotCQlzdXBwcmVzc2VkID0gbmV3U3VwcHJlc3NlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCwgb2xkU3VwcHJlc3NlZCwKLQkJCQkJc3VwcHJlc3NlZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJpbmdHdWlkZSgpIHsKLQkJcmV0dXJuIG9yZGVyaW5nR3VpZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3JkZXJpbmdHdWlkZShTdHJpbmcgbmV3T3JkZXJpbmdHdWlkZSkgewotCQlTdHJpbmcgb2xkT3JkZXJpbmdHdWlkZSA9IG9yZGVyaW5nR3VpZGU7Ci0JCW9yZGVyaW5nR3VpZGUgPSBuZXdPcmRlcmluZ0d1aWRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERSwKLQkJCQkJb2xkT3JkZXJpbmdHdWlkZSwgb3JkZXJpbmdHdWlkZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRPd25lZFJ1bGVzKCkpCi0JCQkJCS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSkuYmFzaWNSZW1vdmUoCi0JCQkJCW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dVSUQ6Ci0JCQlyZXR1cm4gZ2V0R3VpZCgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzoKLQkJCXJldHVybiBnZXRPd25lZFJ1bGVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJCXJldHVybiBnZXRTdXBwcmVzc2VkKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQlyZXR1cm4gZ2V0T3JkZXJpbmdHdWlkZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1VJRDoKLQkJCXNldEd1aWQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOgotCQkJc2V0QnJpZWZEZXNjcmlwdGlvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM6Ci0JCQlnZXRPd25lZFJ1bGVzKCkuY2xlYXIoKTsKLQkJCWdldE93bmVkUnVsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQlnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJc2V0U3VwcHJlc3NlZCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJc2V0T3JkZXJpbmdHdWlkZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dVSUQ6Ci0JCQlzZXRHdWlkKEdVSURfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOgotCQkJc2V0QnJpZWZEZXNjcmlwdGlvbihCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM6Ci0JCQlnZXRPd25lZFJ1bGVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJCXNldFN1cHByZXNzZWQoU1VQUFJFU1NFRF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQlzZXRPcmRlcmluZ0d1aWRlKE9SREVSSU5HX0dVSURFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlEOgotCQkJcmV0dXJuIEdVSURfRURFRkFVTFQgPT0gbnVsbCA/IGd1aWQgIT0gbnVsbCA6ICFHVUlEX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoZ3VpZCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGJyaWVmRGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQk6ICFCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoYnJpZWZEZXNjcmlwdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM6Ci0JCQlyZXR1cm4gb3duZWRSdWxlcyAhPSBudWxsICYmICFvd25lZFJ1bGVzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCXJldHVybiBtZXRob2RFbGVtZW50UHJvcGVydHkgIT0gbnVsbAotCQkJCQkmJiAhbWV0aG9kRWxlbWVudFByb3BlcnR5LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJcmV0dXJuIFNVUFBSRVNTRURfRURFRkFVTFQgPT0gbnVsbCA/IHN1cHByZXNzZWQgIT0gbnVsbAotCQkJCQk6ICFTVVBQUkVTU0VEX0VERUZBVUxULmVxdWFscyhzdXBwcmVzc2VkKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCXJldHVybiBPUkRFUklOR19HVUlERV9FREVGQVVMVCA9PSBudWxsID8gb3JkZXJpbmdHdWlkZSAhPSBudWxsCi0JCQkJCTogIU9SREVSSU5HX0dVSURFX0VERUZBVUxULmVxdWFscyhvcmRlcmluZ0d1aWRlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChndWlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGd1aWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJyaWVmRGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYnJpZWZEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3VwcHJlc3NlZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzdXBwcmVzc2VkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvcmRlcmluZ0d1aWRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG9yZGVyaW5nR3VpZGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NGFkM2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsIGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRToKLQkJCXNldFZhbHVlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQKLQkJCQkJLmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RMaWJyYXJ5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kTGlicmFyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2M0NjI2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RMaWJyYXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgTGlicmFyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsI2dldE1ldGhvZFBsdWdpbnMgPGVtPk1ldGhvZCBQbHVnaW5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwjZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIDxlbT5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUltcGwgZXh0ZW5kcyBNZXRob2RVbml0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZExpYnJhcnkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGx1Z2lucygpIDxlbT5NZXRob2QgUGx1Z2luczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kUGx1Z2lucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSA8ZW0+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnlJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RQbHVnaW5zKCkgewotCQlpZiAobWV0aG9kUGx1Z2lucyA9PSBudWxsKSB7Ci0JCQltZXRob2RQbHVnaW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZygKLQkJCQkJTWV0aG9kUGx1Z2luLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBsdWdpbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkgewotCQlpZiAocHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zID09IG51bGwpIHsKLQkJCXByZWRlZmluZWRDb25maWd1cmF0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoCi0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMpOwotCQl9Ci0JCXJldHVybiBwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldE1ldGhvZFBsdWdpbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSkuYmFzaWNSZW1vdmUoCi0JCQkJCW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TOgotCQkJcmV0dXJuIGdldE1ldGhvZFBsdWdpbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TOgotCQkJcmV0dXJuIGdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlM6Ci0JCQlnZXRNZXRob2RQbHVnaW5zKCkuY2xlYXIoKTsKLQkJCWdldE1ldGhvZFBsdWdpbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TOgotCQkJZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuY2xlYXIoKTsKLQkJCWdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzoKLQkJCWdldE1ldGhvZFBsdWdpbnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM6Ci0JCQlnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TOgotCQkJcmV0dXJuIG1ldGhvZFBsdWdpbnMgIT0gbnVsbCAmJiAhbWV0aG9kUGx1Z2lucy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzoKLQkJCXJldHVybiBwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMgIT0gbnVsbAotCQkJCQkmJiAhcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vTWV0aG9kTGlicmFyeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MDg4NDdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2dldEdsb2JhbCA8ZW0+R2xvYmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwjZ2V0UmV1c2VkUGFja2FnZXMgPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2dldENoaWxkUGFja2FnZXMgPGVtPkNoaWxkIFBhY2thZ2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWV0aG9kUGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU1ldGhvZFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdsb2JhbCgpIDxlbT5HbG9iYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdsb2JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIEdMT0JBTF9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHbG9iYWwoKSA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHbG9iYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGdsb2JhbCA9IEdMT0JBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJldXNlZFBhY2thZ2VzKCkgPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXVzZWRQYWNrYWdlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJldXNlZFBhY2thZ2VzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoaWxkUGFja2FnZXMoKSA8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hpbGRQYWNrYWdlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNoaWxkUGFja2FnZXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRHbG9iYWwoKSB7Ci0JCXJldHVybiBnbG9iYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2xvYmFsKEJvb2xlYW4gbmV3R2xvYmFsKSB7Ci0JCUJvb2xlYW4gb2xkR2xvYmFsID0gZ2xvYmFsOwotCQlnbG9iYWwgPSBuZXdHbG9iYWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCwgb2xkR2xvYmFsLCBnbG9iYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXVzZWRQYWNrYWdlcygpIHsKLQkJaWYgKHJldXNlZFBhY2thZ2VzID09IG51bGwpIHsKLQkJCXJldXNlZFBhY2thZ2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChNZXRob2RQYWNrYWdlLmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVMpOwotCQl9Ci0JCXJldHVybiByZXVzZWRQYWNrYWdlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZFBhY2thZ2VzKCkgewotCQlpZiAoY2hpbGRQYWNrYWdlcyA9PSBudWxsKSB7Ci0JCQljaGlsZFBhY2thZ2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZygKLQkJCQkJTWV0aG9kUGFja2FnZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZFBhY2thZ2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRDaGlsZFBhY2thZ2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDoKLQkJCXJldHVybiBnZXRHbG9iYWwoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gZ2V0UmV1c2VkUGFja2FnZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzoKLQkJCXJldHVybiBnZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQlzZXRHbG9iYWwoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVM6Ci0JCQlnZXRSZXVzZWRQYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQlnZXRSZXVzZWRQYWNrYWdlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJZ2V0Q2hpbGRQYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQlnZXRDaGlsZFBhY2thZ2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDoKLQkJCXNldEdsb2JhbChHTE9CQUxfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzoKLQkJCWdldFJldXNlZFBhY2thZ2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzoKLQkJCWdldENoaWxkUGFja2FnZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDoKLQkJCXJldHVybiBHTE9CQUxfRURFRkFVTFQgPT0gbnVsbCA/IGdsb2JhbCAhPSBudWxsIDogIUdMT0JBTF9FREVGQVVMVAotCQkJCQkuZXF1YWxzKGdsb2JhbCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOgotCQkJcmV0dXJuIHJldXNlZFBhY2thZ2VzICE9IG51bGwgJiYgIXJldXNlZFBhY2thZ2VzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzoKLQkJCXJldHVybiBjaGlsZFBhY2thZ2VzICE9IG51bGwgJiYgIWNoaWxkUGFja2FnZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdsb2JhbDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChnbG9iYWwpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0UGFyZW50UGFja2FnZSgpCi0JICovCi0JcHVibGljIE1ldGhvZFBhY2thZ2UgZ2V0UGFyZW50UGFja2FnZSgpIHsKLQkJRU9iamVjdCBwYXJlbnQgPSBlQ29udGFpbmVyKCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gKE1ldGhvZFBhY2thZ2UpIHBhcmVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9NZXRob2RQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kUGx1Z2luSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kUGx1Z2luSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYjg2YzQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFBsdWdpbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsI2dldFVzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsI2dldE1ldGhvZFBhY2thZ2VzIDxlbT5NZXRob2QgUGFja2FnZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsI2dldEJhc2VzIDxlbT5CYXNlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBsdWdpbkltcGwgZXh0ZW5kcyBNZXRob2RVbml0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZFBsdWdpbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNlckNoYW5nZWFibGUoKSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFVTRVJfQ0hBTkdFQUJMRV9FREVGQVVMVCA9IEJvb2xlYW4uVFJVRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzZXJDaGFuZ2VhYmxlKCkgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIHVzZXJDaGFuZ2VhYmxlID0gVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGFja2FnZXMoKSA8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kUGFja2FnZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZXMoKSA8ZW0+QmFzZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBiYXNlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kUGx1Z2luSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRVc2VyQ2hhbmdlYWJsZSgpIHsKLQkJcmV0dXJuIHVzZXJDaGFuZ2VhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZXJDaGFuZ2VhYmxlKEJvb2xlYW4gbmV3VXNlckNoYW5nZWFibGUpIHsKLQkJQm9vbGVhbiBvbGRVc2VyQ2hhbmdlYWJsZSA9IHVzZXJDaGFuZ2VhYmxlOwotCQl1c2VyQ2hhbmdlYWJsZSA9IG5ld1VzZXJDaGFuZ2VhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSwKLQkJCQkJb2xkVXNlckNoYW5nZWFibGUsIHVzZXJDaGFuZ2VhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kUGFja2FnZXMoKSB7Ci0JCWlmIChtZXRob2RQYWNrYWdlcyA9PSBudWxsKSB7Ci0JCQltZXRob2RQYWNrYWdlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoCi0JCQkJCU1ldGhvZFBhY2thZ2UuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGFja2FnZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QmFzZXMoKSB7Ci0JCWlmIChiYXNlcyA9PSBudWxsKSB7Ci0JCQliYXNlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoTWV0aG9kUGx1Z2luLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX0JBU0VTKTsKLQkJfQotCQlyZXR1cm4gYmFzZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldE1ldGhvZFBhY2thZ2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJcmV0dXJuIGdldFVzZXJDaGFuZ2VhYmxlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUGFja2FnZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX0JBU0VTOgotCQkJcmV0dXJuIGdldEJhc2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCXNldFVzZXJDaGFuZ2VhYmxlKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVM6Ci0JCQlnZXRNZXRob2RQYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQlnZXRNZXRob2RQYWNrYWdlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fQkFTRVM6Ci0JCQlnZXRCYXNlcygpLmNsZWFyKCk7Ci0JCQlnZXRCYXNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCXNldFVzZXJDaGFuZ2VhYmxlKFVTRVJfQ0hBTkdFQUJMRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVM6Ci0JCQlnZXRNZXRob2RQYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19CQVNFUzoKLQkJCWdldEJhc2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCXJldHVybiBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IHVzZXJDaGFuZ2VhYmxlICE9IG51bGwKLQkJCQkJOiAhVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxULmVxdWFscyh1c2VyQ2hhbmdlYWJsZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gbWV0aG9kUGFja2FnZXMgIT0gbnVsbCAmJiAhbWV0aG9kUGFja2FnZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fQkFTRVM6Ci0JCQlyZXR1cm4gYmFzZXMgIT0gbnVsbCAmJiAhYmFzZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVzZXJDaGFuZ2VhYmxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHVzZXJDaGFuZ2VhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kUGx1Z2luSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kVW5pdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFVuaXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyNWQwNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kVW5pdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFVuaXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldENvcHlyaWdodFN0YXRlbWVudCA8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1ldGhvZFVuaXRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlNZXRob2RVbml0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUlNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhvcnMoKSA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdXRob3JzID0gQVVUSE9SU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEYXRlKCkgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERhdGUgQ0hBTkdFX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERhdGUgY2hhbmdlRGF0ZSA9IENIQU5HRV9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjaGFuZ2VEZXNjcmlwdGlvbiA9IENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodFN0YXRlbWVudCgpIDxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0U3RhdGVtZW50ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RVbml0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRob3JzKCkgewotCQlyZXR1cm4gYXV0aG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRob3JzKFN0cmluZyBuZXdBdXRob3JzKSB7Ci0JCVN0cmluZyBvbGRBdXRob3JzID0gYXV0aG9yczsKLQkJYXV0aG9ycyA9IG5ld0F1dGhvcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlMsIG9sZEF1dGhvcnMsIGF1dGhvcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGF0ZSBnZXRDaGFuZ2VEYXRlKCkgewotCQlyZXR1cm4gY2hhbmdlRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VEYXRlKERhdGUgbmV3Q2hhbmdlRGF0ZSkgewotCQlEYXRlIG9sZENoYW5nZURhdGUgPSBjaGFuZ2VEYXRlOwotCQljaGFuZ2VEYXRlID0gbmV3Q2hhbmdlRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUsIG9sZENoYW5nZURhdGUsCi0JCQkJCWNoYW5nZURhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENoYW5nZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY2hhbmdlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGVzY3JpcHRpb24oU3RyaW5nIG5ld0NoYW5nZURlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRDaGFuZ2VEZXNjcmlwdGlvbiA9IGNoYW5nZURlc2NyaXB0aW9uOwotCQljaGFuZ2VEZXNjcmlwdGlvbiA9IG5ld0NoYW5nZURlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04sCi0JCQkJCW9sZENoYW5nZURlc2NyaXB0aW9uLCBjaGFuZ2VEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSB7Ci0JCWlmIChjb3B5cmlnaHRTdGF0ZW1lbnQgIT0gbnVsbAotCQkJCSYmICgoRU9iamVjdCkgY29weXJpZ2h0U3RhdGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkQ29weXJpZ2h0U3RhdGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgY29weXJpZ2h0U3RhdGVtZW50OwotCQkJY29weXJpZ2h0U3RhdGVtZW50ID0gKFN1cHBvcnRpbmdNYXRlcmlhbCkgZVJlc29sdmVQcm94eShvbGRDb3B5cmlnaHRTdGF0ZW1lbnQpOwotCQkJaWYgKGNvcHlyaWdodFN0YXRlbWVudCAhPSBvbGRDb3B5cmlnaHRTdGF0ZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQsCi0JCQkJCQkJb2xkQ29weXJpZ2h0U3RhdGVtZW50LCBjb3B5cmlnaHRTdGF0ZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29weXJpZ2h0U3RhdGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgYmFzaWNHZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSB7Ci0JCXJldHVybiBjb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0U3RhdGVtZW50KFN1cHBvcnRpbmdNYXRlcmlhbCBuZXdDb3B5cmlnaHRTdGF0ZW1lbnQpIHsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIG9sZENvcHlyaWdodFN0YXRlbWVudCA9IGNvcHlyaWdodFN0YXRlbWVudDsKLQkJY29weXJpZ2h0U3RhdGVtZW50ID0gbmV3Q29weXJpZ2h0U3RhdGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5ULAotCQkJCQlvbGRDb3B5cmlnaHRTdGF0ZW1lbnQsIGNvcHlyaWdodFN0YXRlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQkJcmV0dXJuIGdldEF1dGhvcnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJCXJldHVybiBnZXRDaGFuZ2VEYXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldENvcHlyaWdodFN0YXRlbWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCXNldEF1dGhvcnMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJc2V0Q2hhbmdlRGF0ZSgoRGF0ZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCXNldENoYW5nZURlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJc2V0VmVyc2lvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCXNldENvcHlyaWdodFN0YXRlbWVudCgoU3VwcG9ydGluZ01hdGVyaWFsKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQlzZXRBdXRob3JzKEFVVEhPUlNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJc2V0Q2hhbmdlRGF0ZShDSEFOR0VfREFURV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJc2V0Q29weXJpZ2h0U3RhdGVtZW50KChTdXBwb3J0aW5nTWF0ZXJpYWwpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQlyZXR1cm4gQVVUSE9SU19FREVGQVVMVCA9PSBudWxsID8gYXV0aG9ycyAhPSBudWxsCi0JCQkJCTogIUFVVEhPUlNfRURFRkFVTFQuZXF1YWxzKGF1dGhvcnMpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJcmV0dXJuIENIQU5HRV9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjaGFuZ2VEYXRlICE9IG51bGwKLQkJCQkJOiAhQ0hBTkdFX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNoYW5nZURhdGUpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCXJldHVybiBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGNoYW5nZURlc2NyaXB0aW9uICE9IG51bGwKLQkJCQkJOiAhQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhjaGFuZ2VEZXNjcmlwdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwKLQkJCQkJOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCXJldHVybiBjb3B5cmlnaHRTdGF0ZW1lbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdXRob3JzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGF1dGhvcnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNoYW5nZURhdGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY2hhbmdlRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY2hhbmdlRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFVuaXRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NaWxlc3RvbmVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NaWxlc3RvbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyZTcyMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWlsZXN0b25lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NaWxlc3RvbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWxlc3RvbmVJbXBsIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTWlsZXN0b25lIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNaWxlc3RvbmVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NSUxFU1RPTkU7Ci0JfQotCi19IC8vTWlsZXN0b25lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTmFtZWRFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTmFtZWRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZmQ4ZGQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL05hbWVkRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVkIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5OYW1lZEVsZW1lbnRJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOYW1lZEVsZW1lbnRJbXBsIGV4dGVuZHMgRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlOYW1lZEVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5hbWVkRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FOgotCQkJc2V0TmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FOgotCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTmFtZWRFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTmFtZXNwYWNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTmFtZXNwYWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMGIyMzE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL05hbWVzcGFjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmFtZXNwYWNlSW1wbCBleHRlbmRzIE5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlOYW1lc3BhY2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5hbWVzcGFjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVTUEFDRTsKLQl9Ci0KLX0gLy9OYW1lc3BhY2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9PdXRjb21lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvT3V0Y29tZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTY5ZjlhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9PdXRjb21lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0Y29tZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGNvbWVJbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3RJbXBsIGltcGxlbWVudHMgT3V0Y29tZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0Y29tZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk9VVENPTUU7Ci0JfQotCi19IC8vT3V0Y29tZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTZlY2RiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlSW1wbCBleHRlbmRzIE5hbWVzcGFjZUltcGwgaW1wbGVtZW50cwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QQUNLQUdFOwotCX0KLQotfSAvL1BhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QYWNrYWdlYWJsZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QYWNrYWdlYWJsZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczYWNlOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFja2FnZWFibGVFbGVtZW50SW1wbCBleHRlbmRzIE5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhY2thZ2VhYmxlRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBBQ0tBR0VBQkxFX0VMRU1FTlQ7Ci0JfQotCi19IC8vUGFja2FnZWFibGVFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGhhc2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QaGFzZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTU0OGU4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QaGFzZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QaGFzZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBoYXNlSW1wbCBleHRlbmRzIEFjdGl2aXR5SW1wbCBpbXBsZW1lbnRzIFBoYXNlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQaGFzZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBIQVNFOwotCX0KLQotfSAvL1BoYXNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGxhbm5pbmdEYXRhSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGxhbm5pbmdEYXRhSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZjI3NmI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BsYW5uaW5nRGF0YUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBsYW5uaW5nRGF0YUltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlQbGFubmluZ0RhdGEgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0RGF0ZSgpIDxlbT5TdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0ZSBTVEFSVF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0RGF0ZSgpIDxlbT5TdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEYXRlIHN0YXJ0RGF0ZSA9IFNUQVJUX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoRGF0ZSgpIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEYXRlIEZJTklTSF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaERhdGUoKSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEYXRlIGZpbmlzaERhdGUgPSBGSU5JU0hfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5rKCkgPGVtPlJhbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFJBTktfRURFRkFVTFQgPSAwOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFuaygpIDxlbT5SYW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHJhbmsgPSBSQU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBsYW5uaW5nRGF0YUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBMQU5OSU5HX0RBVEE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGUgZ2V0U3RhcnREYXRlKCkgewotCQlyZXR1cm4gc3RhcnREYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0RGF0ZShEYXRlIG5ld1N0YXJ0RGF0ZSkgewotCQlEYXRlIG9sZFN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTsKLQkJc3RhcnREYXRlID0gbmV3U3RhcnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUsIG9sZFN0YXJ0RGF0ZSwKLQkJCQkJc3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGUgZ2V0RmluaXNoRGF0ZSgpIHsKLQkJcmV0dXJuIGZpbmlzaERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoRGF0ZShEYXRlIG5ld0ZpbmlzaERhdGUpIHsKLQkJRGF0ZSBvbGRGaW5pc2hEYXRlID0gZmluaXNoRGF0ZTsKLQkJZmluaXNoRGF0ZSA9IG5ld0ZpbmlzaERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUsIG9sZEZpbmlzaERhdGUsCi0JCQkJCWZpbmlzaERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJhbmsoKSB7Ci0JCXJldHVybiByYW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhbmsoaW50IG5ld1JhbmspIHsKLQkJaW50IG9sZFJhbmsgPSByYW5rOwotCQlyYW5rID0gbmV3UmFuazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LLCBvbGRSYW5rLCByYW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCXJldHVybiBnZXRTdGFydERhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFOgotCQkJcmV0dXJuIGdldEZpbmlzaERhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0UmFuaygpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCXNldFN0YXJ0RGF0ZSgoRGF0ZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQlzZXRGaW5pc2hEYXRlKChEYXRlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJc2V0UmFuaygoKEludGVnZXIpIG5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQkJc2V0U3RhcnREYXRlKFNUQVJUX0RBVEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQlzZXRGaW5pc2hEYXRlKEZJTklTSF9EQVRFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlzZXRSYW5rKFJBTktfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCXJldHVybiBTVEFSVF9EQVRFX0VERUZBVUxUID09IG51bGwgPyBzdGFydERhdGUgIT0gbnVsbAotCQkJCQk6ICFTVEFSVF9EQVRFX0VERUZBVUxULmVxdWFscyhzdGFydERhdGUpOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQlyZXR1cm4gRklOSVNIX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaERhdGUgIT0gbnVsbAotCQkJCQk6ICFGSU5JU0hfREFURV9FREVGQVVMVC5lcXVhbHMoZmluaXNoRGF0ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJcmV0dXJuIHJhbmsgIT0gUkFOS19FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzdGFydERhdGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc3RhcnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2hEYXRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGZpbmlzaERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJhbms6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmFuayk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BsYW5uaW5nRGF0YUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BvaW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUG9pbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2MjMzNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUG9pbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb2ludDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvaW50SW1wbCNnZXRYIDxlbT5YPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9pbnRJbXBsI2dldFkgPGVtPlk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb2ludEltcGwgZXh0ZW5kcyBNdWx0aVJlc291cmNlRU9iamVjdCBpbXBsZW1lbnRzIFBvaW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYKCkgPGVtPlg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRG91YmxlIFhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WCgpIDxlbT5YPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG91YmxlIHggPSBYX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFkoKSA8ZW0+WTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRZKCkgPGVtPlk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgeSA9IFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QT0lOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG91YmxlIGdldFgoKSB7Ci0JCXJldHVybiB4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFgoRG91YmxlIG5ld1gpIHsKLQkJRG91YmxlIG9sZFggPSB4OwotCQl4ID0gbmV3WDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QT0lOVF9fWCwgb2xkWCwgeCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0WSgpIHsKLQkJcmV0dXJuIHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0WShEb3VibGUgbmV3WSkgewotCQlEb3VibGUgb2xkWSA9IHk7Ci0JCXkgPSBuZXdZOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBPSU5UX19ZLCBvbGRZLCB5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlRfX1g6Ci0JCQlyZXR1cm4gZ2V0WCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlRfX1k6Ci0JCQlyZXR1cm4gZ2V0WSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWDoKLQkJCXNldFgoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlRfX1k6Ci0JCQlzZXRZKChEb3VibGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWDoKLQkJCXNldFgoWF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWToKLQkJCXNldFkoWV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWDoKLQkJCXJldHVybiBYX0VERUZBVUxUID09IG51bGwgPyB4ICE9IG51bGwgOiAhWF9FREVGQVVMVC5lcXVhbHMoeCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWToKLQkJCXJldHVybiBZX0VERUZBVUxUID09IG51bGwgPyB5ICE9IG51bGwgOiAhWV9FREVGQVVMVC5lcXVhbHMoeSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoeDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh4KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB5OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qb2ludEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BvbHlsaW5lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUG9seWxpbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmNzhmY2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUG9seWxpbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvbHlsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9seWxpbmVJbXBsI2dldENsb3NlZCA8ZW0+Q2xvc2VkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9seWxpbmVJbXBsI2dldFdheXBvaW50cyA8ZW0+V2F5cG9pbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9seWxpbmVJbXBsIGV4dGVuZHMgR3JhcGhpY1ByaW1pdGl2ZUltcGwgaW1wbGVtZW50cyBQb2x5bGluZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xvc2VkKCkgPGVtPkNsb3NlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xvc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gQ0xPU0VEX0VERUZBVUxUID0gQm9vbGVhbi5UUlVFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xvc2VkKCkgPGVtPkNsb3NlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xvc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBjbG9zZWQgPSBDTE9TRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXYXlwb2ludHMoKSA8ZW0+V2F5cG9pbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdheXBvaW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHdheXBvaW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9seWxpbmVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QT0xZTElORTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRDbG9zZWQoKSB7Ci0JCXJldHVybiBjbG9zZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xvc2VkKEJvb2xlYW4gbmV3Q2xvc2VkKSB7Ci0JCUJvb2xlYW4gb2xkQ2xvc2VkID0gY2xvc2VkOwotCQljbG9zZWQgPSBuZXdDbG9zZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUE9MWUxJTkVfX0NMT1NFRCwgb2xkQ2xvc2VkLCBjbG9zZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXYXlwb2ludHMoKSB7Ci0JCWlmICh3YXlwb2ludHMgPT0gbnVsbCkgewotCQkJd2F5cG9pbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZyhQb2ludC5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5QT0xZTElORV9fV0FZUE9JTlRTKTsKLQkJfQotCQlyZXR1cm4gd2F5cG9pbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fV0FZUE9JTlRTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0V2F5cG9pbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX0NMT1NFRDoKLQkJCXJldHVybiBnZXRDbG9zZWQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19XQVlQT0lOVFM6Ci0JCQlyZXR1cm4gZ2V0V2F5cG9pbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19DTE9TRUQ6Ci0JCQlzZXRDbG9zZWQoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19XQVlQT0lOVFM6Ci0JCQlnZXRXYXlwb2ludHMoKS5jbGVhcigpOwotCQkJZ2V0V2F5cG9pbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX0NMT1NFRDoKLQkJCXNldENsb3NlZChDTE9TRURfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUzoKLQkJCWdldFdheXBvaW50cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fQ0xPU0VEOgotCQkJcmV0dXJuIENMT1NFRF9FREVGQVVMVCA9PSBudWxsID8gY2xvc2VkICE9IG51bGwgOiAhQ0xPU0VEX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoY2xvc2VkKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19XQVlQT0lOVFM6Ci0JCQlyZXR1cm4gd2F5cG9pbnRzICE9IG51bGwgJiYgIXdheXBvaW50cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY2xvc2VkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNsb3NlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BvbHlsaW5lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1ByYWN0aWNlRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjYmUxN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmFjdGljZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldEFkZGl0aW9uYWxJbmZvIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRQcm9ibGVtIDxlbT5Qcm9ibGVtPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0QmFja2dyb3VuZCA8ZW0+QmFja2dyb3VuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzCi0JCVByYWN0aWNlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkZGl0aW9uYWxJbmZvKCkgPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRkaXRpb25hbEluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFERElUSU9OQUxfSU5GT19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbEluZm8oKSA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IEFERElUSU9OQUxfSU5GT19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9ibGVtKCkgPGVtPlByb2JsZW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2JsZW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0JMRU1fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2JsZW0oKSA8ZW0+UHJvYmxlbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvYmxlbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9ibGVtID0gUFJPQkxFTV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYWNrZ3JvdW5kKCkgPGVtPkJhY2tncm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhY2tncm91bmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkRfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhY2tncm91bmQoKSA8ZW0+QmFja2dyb3VuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFja2dyb3VuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBiYWNrZ3JvdW5kID0gQkFDS0dST1VORF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHb2FscygpIDxlbT5Hb2FsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R29hbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdPQUxTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHb2FscygpIDxlbT5Hb2FsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R29hbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ29hbHMgPSBHT0FMU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcHBsaWNhdGlvbigpIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcHBsaWNhdGlvbigpIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXBwbGljYXRpb24gPSBBUFBMSUNBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkgPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkgPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsZXZlbHNPZkFkb3B0aW9uID0gTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByYWN0aWNlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxJbmZvKCkgewotCQlyZXR1cm4gYWRkaXRpb25hbEluZm87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWRkaXRpb25hbEluZm8oU3RyaW5nIG5ld0FkZGl0aW9uYWxJbmZvKSB7Ci0JCVN0cmluZyBvbGRBZGRpdGlvbmFsSW5mbyA9IGFkZGl0aW9uYWxJbmZvOwotCQlhZGRpdGlvbmFsSW5mbyA9IG5ld0FkZGl0aW9uYWxJbmZvOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk8sCi0JCQkJCW9sZEFkZGl0aW9uYWxJbmZvLCBhZGRpdGlvbmFsSW5mbykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvYmxlbSgpIHsKLQkJcmV0dXJuIHByb2JsZW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvYmxlbShTdHJpbmcgbmV3UHJvYmxlbSkgewotCQlTdHJpbmcgb2xkUHJvYmxlbSA9IHByb2JsZW07Ci0JCXByb2JsZW0gPSBuZXdQcm9ibGVtOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNLCBvbGRQcm9ibGVtLAotCQkJCQlwcm9ibGVtKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gYmFja2dyb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKFN0cmluZyBuZXdCYWNrZ3JvdW5kKSB7Ci0JCVN0cmluZyBvbGRCYWNrZ3JvdW5kID0gYmFja2dyb3VuZDsKLQkJYmFja2dyb3VuZCA9IG5ld0JhY2tncm91bmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQsIG9sZEJhY2tncm91bmQsCi0JCQkJCWJhY2tncm91bmQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEdvYWxzKCkgewotCQlyZXR1cm4gZ29hbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R29hbHMoU3RyaW5nIG5ld0dvYWxzKSB7Ci0JCVN0cmluZyBvbGRHb2FscyA9IGdvYWxzOwotCQlnb2FscyA9IG5ld0dvYWxzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUywgb2xkR29hbHMsIGdvYWxzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uKFN0cmluZyBuZXdBcHBsaWNhdGlvbikgewotCQlTdHJpbmcgb2xkQXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKLQkJYXBwbGljYXRpb24gPSBuZXdBcHBsaWNhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT04sCi0JCQkJCW9sZEFwcGxpY2F0aW9uLCBhcHBsaWNhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpIHsKLQkJcmV0dXJuIGxldmVsc09mQWRvcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWxzT2ZBZG9wdGlvbihTdHJpbmcgbmV3TGV2ZWxzT2ZBZG9wdGlvbikgewotCQlTdHJpbmcgb2xkTGV2ZWxzT2ZBZG9wdGlvbiA9IGxldmVsc09mQWRvcHRpb247Ci0JCWxldmVsc09mQWRvcHRpb24gPSBuZXdMZXZlbHNPZkFkb3B0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04sCi0JCQkJCW9sZExldmVsc09mQWRvcHRpb24sIGxldmVsc09mQWRvcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPOgotCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxJbmZvKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTToKLQkJCXJldHVybiBnZXRQcm9ibGVtKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCXJldHVybiBnZXRCYWNrZ3JvdW5kKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFM6Ci0JCQlyZXR1cm4gZ2V0R29hbHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTjoKLQkJCXJldHVybiBnZXRBcHBsaWNhdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCXJldHVybiBnZXRMZXZlbHNPZkFkb3B0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQlzZXRBZGRpdGlvbmFsSW5mbygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTToKLQkJCXNldFByb2JsZW0oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCQlzZXRCYWNrZ3JvdW5kKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJCXNldEdvYWxzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTjoKLQkJCXNldEFwcGxpY2F0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQlzZXRMZXZlbHNPZkFkb3B0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPOgotCQkJc2V0QWRkaXRpb25hbEluZm8oQURESVRJT05BTF9JTkZPX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJc2V0UHJvYmxlbShQUk9CTEVNX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EOgotCQkJc2V0QmFja2dyb3VuZChCQUNLR1JPVU5EX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJCXNldEdvYWxzKEdPQUxTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTjoKLQkJCXNldEFwcGxpY2F0aW9uKEFQUExJQ0FUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQlzZXRMZXZlbHNPZkFkb3B0aW9uKExFVkVMU19PRl9BRE9QVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPOgotCQkJcmV0dXJuIEFERElUSU9OQUxfSU5GT19FREVGQVVMVCA9PSBudWxsID8gYWRkaXRpb25hbEluZm8gIT0gbnVsbAotCQkJCQk6ICFBRERJVElPTkFMX0lORk9fRURFRkFVTFQuZXF1YWxzKGFkZGl0aW9uYWxJbmZvKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJcmV0dXJuIFBST0JMRU1fRURFRkFVTFQgPT0gbnVsbCA/IHByb2JsZW0gIT0gbnVsbAotCQkJCQk6ICFQUk9CTEVNX0VERUZBVUxULmVxdWFscyhwcm9ibGVtKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EOgotCQkJcmV0dXJuIEJBQ0tHUk9VTkRfRURFRkFVTFQgPT0gbnVsbCA/IGJhY2tncm91bmQgIT0gbnVsbAotCQkJCQk6ICFCQUNLR1JPVU5EX0VERUZBVUxULmVxdWFscyhiYWNrZ3JvdW5kKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJCXJldHVybiBHT0FMU19FREVGQVVMVCA9PSBudWxsID8gZ29hbHMgIT0gbnVsbCA6ICFHT0FMU19FREVGQVVMVAotCQkJCQkuZXF1YWxzKGdvYWxzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTjoKLQkJCXJldHVybiBBUFBMSUNBVElPTl9FREVGQVVMVCA9PSBudWxsID8gYXBwbGljYXRpb24gIT0gbnVsbAotCQkJCQk6ICFBUFBMSUNBVElPTl9FREVGQVVMVC5lcXVhbHMoYXBwbGljYXRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCXJldHVybiBMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsc09mQWRvcHRpb24gIT0gbnVsbAotCQkJCQk6ICFMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQuZXF1YWxzKGxldmVsc09mQWRvcHRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGFkZGl0aW9uYWxJbmZvOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGFkZGl0aW9uYWxJbmZvKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm9ibGVtOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHByb2JsZW0pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJhY2tncm91bmQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYmFja2dyb3VuZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ29hbHM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ29hbHMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFwcGxpY2F0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGFwcGxpY2F0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbHNPZkFkb3B0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxldmVsc09mQWRvcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QcmFjdGljZURlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJhY3RpY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTE5NjVhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmFjdGljZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlSW1wbCNnZXRTdWJQcmFjdGljZXMgPGVtPlN1YiBQcmFjdGljZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGwjZ2V0Q29udGVudFJlZmVyZW5jZXMgPGVtPkNvbnRlbnQgUmVmZXJlbmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlSW1wbCNnZXRBY3Rpdml0eVJlZmVyZW5jZXMgPGVtPkFjdGl2aXR5IFJlZmVyZW5jZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBQcmFjdGljZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJQcmFjdGljZXMoKSA8ZW0+U3ViIFByYWN0aWNlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJQcmFjdGljZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzdWJQcmFjdGljZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGVudFJlZmVyZW5jZXMoKSA8ZW0+Q29udGVudCBSZWZlcmVuY2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRlbnRSZWZlcmVuY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY29udGVudFJlZmVyZW5jZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCkgPGVtPkFjdGl2aXR5IFJlZmVyZW5jZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYWN0aXZpdHlSZWZlcmVuY2VzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcmFjdGljZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN1YlByYWN0aWNlcygpIHsKLQkJaWYgKHN1YlByYWN0aWNlcyA9PSBudWxsKSB7Ci0JCQlzdWJQcmFjdGljZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nKAotCQkJCQlQcmFjdGljZS5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUyk7Ci0JCX0KLQkJcmV0dXJuIHN1YlByYWN0aWNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb250ZW50UmVmZXJlbmNlcygpIHsKLQkJaWYgKGNvbnRlbnRSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWNvbnRlbnRSZWZlcmVuY2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChDb250ZW50RWxlbWVudC5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTKTsKLQkJfQotCQlyZXR1cm4gY29udGVudFJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCkgewotCQlpZiAoYWN0aXZpdHlSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWFjdGl2aXR5UmVmZXJlbmNlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoQWN0aXZpdHkuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVMpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eVJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0U3ViUHJhY3RpY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlyZXR1cm4gZ2V0U3ViUHJhY3RpY2VzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTOgotCQkJcmV0dXJuIGdldENvbnRlbnRSZWZlcmVuY2VzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUzoKLQkJCXJldHVybiBnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlnZXRTdWJQcmFjdGljZXMoKS5jbGVhcigpOwotCQkJZ2V0U3ViUHJhY3RpY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTOgotCQkJZ2V0Q29udGVudFJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJZ2V0Q29udGVudFJlZmVyZW5jZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTOgotCQkJZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCWdldEFjdGl2aXR5UmVmZXJlbmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTOgotCQkJZ2V0U3ViUHJhY3RpY2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVM6Ci0JCQlnZXRDb250ZW50UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUzoKLQkJCWdldEFjdGl2aXR5UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUzoKLQkJCXJldHVybiBzdWJQcmFjdGljZXMgIT0gbnVsbCAmJiAhc3ViUHJhY3RpY2VzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVM6Ci0JCQlyZXR1cm4gY29udGVudFJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhY29udGVudFJlZmVyZW5jZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVM6Ci0JCQlyZXR1cm4gYWN0aXZpdHlSZWZlcmVuY2VzICE9IG51bGwgJiYgIWFjdGl2aXR5UmVmZXJlbmNlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1ByYWN0aWNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGRlNDcxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbCNnZXRQcm9jZXNzQ29tcG9uZW50IDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbCBleHRlbmRzIERlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMKLQkJUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpIDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50IGdldFByb2Nlc3NDb21wb25lbnQoKSB7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50ICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcm9jZXNzQ29tcG9uZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJvY2Vzc0NvbXBvbmVudCA9IChJbnRlcm5hbEVPYmplY3QpIHByb2Nlc3NDb21wb25lbnQ7Ci0JCQlwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIGVSZXNvbHZlUHJveHkob2xkUHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQlpZiAocHJvY2Vzc0NvbXBvbmVudCAhPSBvbGRQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJCQl0aGlzLAotCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQsCi0JCQkJCQkJb2xkUHJvY2Vzc0NvbXBvbmVudCwgcHJvY2Vzc0NvbXBvbmVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50IGJhc2ljR2V0UHJvY2Vzc0NvbXBvbmVudCgpIHsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvY2Vzc0NvbXBvbmVudChQcm9jZXNzQ29tcG9uZW50IG5ld1Byb2Nlc3NDb21wb25lbnQpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudCBvbGRQcm9jZXNzQ29tcG9uZW50ID0gcHJvY2Vzc0NvbXBvbmVudDsKLQkJcHJvY2Vzc0NvbXBvbmVudCA9IG5ld1Byb2Nlc3NDb21wb25lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQsCi0JCQkJCW9sZFByb2Nlc3NDb21wb25lbnQsIHByb2Nlc3NDb21wb25lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5UOgotCQkJc2V0UHJvY2Vzc0NvbXBvbmVudCgoUHJvY2Vzc0NvbXBvbmVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5UOgotCQkJc2V0UHJvY2Vzc0NvbXBvbmVudCgoUHJvY2Vzc0NvbXBvbmVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVDoKLQkJCXJldHVybiBwcm9jZXNzQ29tcG9uZW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyOWJmZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQgPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRJbnRlcmZhY2VzIDxlbT5JbnRlcmZhY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJbXBsIGV4dGVuZHMgUHJvY2Vzc1BhY2thZ2VJbXBsIGltcGxlbWVudHMKLQkJUHJvY2Vzc0NvbXBvbmVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9ycygpIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXV0aG9ycyA9IEFVVEhPUlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEYXRlIENIQU5HRV9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURhdGUoKSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEYXRlIGNoYW5nZURhdGUgPSBDSEFOR0VfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2hhbmdlRGVzY3JpcHRpb24gPSBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSA8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodFN0YXRlbWVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcmZhY2VzKCkgPGVtPkludGVyZmFjZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW50ZXJmYWNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGludGVyZmFjZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvY2VzcygpIDxlbT5Qcm9jZXNzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF1dGhvcnMoKSB7Ci0JCXJldHVybiBhdXRob3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhvcnMoU3RyaW5nIG5ld0F1dGhvcnMpIHsKLQkJU3RyaW5nIG9sZEF1dGhvcnMgPSBhdXRob3JzOwotCQlhdXRob3JzID0gbmV3QXV0aG9yczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUywgb2xkQXV0aG9ycywgYXV0aG9ycykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEYXRlIGdldENoYW5nZURhdGUoKSB7Ci0JCXJldHVybiBjaGFuZ2VEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURhdGUoRGF0ZSBuZXdDaGFuZ2VEYXRlKSB7Ci0JCURhdGUgb2xkQ2hhbmdlRGF0ZSA9IGNoYW5nZURhdGU7Ci0JCWNoYW5nZURhdGUgPSBuZXdDaGFuZ2VEYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURSwgb2xkQ2hhbmdlRGF0ZSwKLQkJCQkJY2hhbmdlRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBjaGFuZ2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgbmV3Q2hhbmdlRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZENoYW5nZURlc2NyaXB0aW9uID0gY2hhbmdlRGVzY3JpcHRpb247Ci0JCWNoYW5nZURlc2NyaXB0aW9uID0gbmV3Q2hhbmdlRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTiwKLQkJCQkJb2xkQ2hhbmdlRGVzY3JpcHRpb24sIGNoYW5nZURlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGdldENvcHlyaWdodFN0YXRlbWVudCgpIHsKLQkJaWYgKGNvcHlyaWdodFN0YXRlbWVudCAhPSBudWxsCi0JCQkJJiYgKChFT2JqZWN0KSBjb3B5cmlnaHRTdGF0ZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRDb3B5cmlnaHRTdGF0ZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBjb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JCQljb3B5cmlnaHRTdGF0ZW1lbnQgPSAoU3VwcG9ydGluZ01hdGVyaWFsKSBlUmVzb2x2ZVByb3h5KG9sZENvcHlyaWdodFN0YXRlbWVudCk7Ci0JCQlpZiAoY29weXJpZ2h0U3RhdGVtZW50ICE9IG9sZENvcHlyaWdodFN0YXRlbWVudCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCwKLQkJCQkJCQlvbGRDb3B5cmlnaHRTdGF0ZW1lbnQsIGNvcHlyaWdodFN0YXRlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBiYXNpY0dldENvcHlyaWdodFN0YXRlbWVudCgpIHsKLQkJcmV0dXJuIGNvcHlyaWdodFN0YXRlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5cmlnaHRTdGF0ZW1lbnQoU3VwcG9ydGluZ01hdGVyaWFsIG5ld0NvcHlyaWdodFN0YXRlbWVudCkgewotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgb2xkQ29weXJpZ2h0U3RhdGVtZW50ID0gY29weXJpZ2h0U3RhdGVtZW50OwotCQljb3B5cmlnaHRTdGF0ZW1lbnQgPSBuZXdDb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVF9TVEFURU1FTlQsCi0JCQkJCW9sZENvcHlyaWdodFN0YXRlbWVudCwgY29weXJpZ2h0U3RhdGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW50ZXJmYWNlcygpIHsKLQkJaWYgKGludGVyZmFjZXMgPT0gbnVsbCkgewotCQkJaW50ZXJmYWNlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRVMpOwotCQl9Ci0JCXJldHVybiBpbnRlcmZhY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJaWYgKHByb2Nlc3MgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHByb2Nlc3MpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQcm9jZXNzID0gKEludGVybmFsRU9iamVjdCkgcHJvY2VzczsKLQkJCXByb2Nlc3MgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBlUmVzb2x2ZVByb3h5KG9sZFByb2Nlc3MpOwotCQkJaWYgKHByb2Nlc3MgIT0gb2xkUHJvY2VzcykgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdQcm9jZXNzID0gKEludGVybmFsRU9iamVjdCkgcHJvY2VzczsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUHJvY2Vzcy5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG51bGwsCi0JCQkJCQludWxsKTsKLQkJCQlpZiAobmV3UHJvY2Vzcy5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQcm9jZXNzCi0JCQkJCQkJLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJCS0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywKLQkJCQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLCBvbGRQcm9jZXNzLAotCQkJCQkJCXByb2Nlc3MpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIGJhc2ljR2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJvY2VzcygKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBuZXdQcm9jZXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBvbGRQcm9jZXNzID0gcHJvY2VzczsKLQkJcHJvY2VzcyA9IG5ld1Byb2Nlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsCi0JCQkJCW9sZFByb2Nlc3MsIG5ld1Byb2Nlc3MpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgbmV3UHJvY2VzcykgewotCQlpZiAobmV3UHJvY2VzcyAhPSBwcm9jZXNzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcm9jZXNzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcm9jZXNzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG51bGwsCi0JCQkJCQltc2dzKTsKLQkJCWlmIChuZXdQcm9jZXNzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQcm9jZXNzKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG51bGwsCi0JCQkJCQltc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByb2Nlc3MobmV3UHJvY2VzcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG5ld1Byb2Nlc3MsCi0JCQkJCW5ld1Byb2Nlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQlyZXR1cm4gYmFzaWNTZXRQcm9jZXNzKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJCXJldHVybiBnZXRBdXRob3JzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU6Ci0JCQlyZXR1cm4gZ2V0Q2hhbmdlRGF0ZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCXJldHVybiBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVF9TVEFURU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0VTOgotCQkJcmV0dXJuIGdldEludGVyZmFjZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByb2Nlc3MoKTsKLQkJCXJldHVybiBiYXNpY0dldFByb2Nlc3MoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQlzZXRBdXRob3JzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCXNldENoYW5nZURhdGUoKERhdGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQlzZXRDaGFuZ2VEZXNjcmlwdGlvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCXNldFZlcnNpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVF9TVEFURU1FTlQ6Ci0JCQlzZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKFN1cHBvcnRpbmdNYXRlcmlhbCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRVM6Ci0JCQlnZXRJbnRlcmZhY2VzKCkuY2xlYXIoKTsKLQkJCWdldEludGVyZmFjZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJc2V0UHJvY2Vzcygob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQlzZXRBdXRob3JzKEFVVEhPUlNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJc2V0Q2hhbmdlRGF0ZShDSEFOR0VfREFURV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJc2V0Q29weXJpZ2h0U3RhdGVtZW50KChTdXBwb3J0aW5nTWF0ZXJpYWwpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRVM6Ci0JCQlnZXRJbnRlcmZhY2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJc2V0UHJvY2Vzcygob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJcmV0dXJuIEFVVEhPUlNfRURFRkFVTFQgPT0gbnVsbCA/IGF1dGhvcnMgIT0gbnVsbAotCQkJCQk6ICFBVVRIT1JTX0VERUZBVUxULmVxdWFscyhhdXRob3JzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCXJldHVybiBDSEFOR0VfREFURV9FREVGQVVMVCA9PSBudWxsID8gY2hhbmdlRGF0ZSAhPSBudWxsCi0JCQkJCTogIUNIQU5HRV9EQVRFX0VERUZBVUxULmVxdWFscyhjaGFuZ2VEYXRlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBjaGFuZ2VEZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCTogIUNIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGVzY3JpcHRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsCi0JCQkJCTogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVF9TVEFURU1FTlQ6Ci0JCQlyZXR1cm4gY29weXJpZ2h0U3RhdGVtZW50ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUzoKLQkJCXJldHVybiBpbnRlcmZhY2VzICE9IG51bGwgJiYgIWludGVyZmFjZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQlyZXR1cm4gcHJvY2VzcyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gTWV0aG9kVW5pdC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVF9TVEFURU1FTlQ6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IE1ldGhvZFVuaXQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXV0aG9yczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhdXRob3JzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjaGFuZ2VEYXRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNoYW5nZURlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzQ29tcG9uZW50SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlZWE1ZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsI2dldEludGVyZmFjZVNwZWNpZmljYXRpb25zIDxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCNnZXRJbnRlcmZhY2VJTyA8ZW0+SW50ZXJmYWNlIElPPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKSA8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJmYWNlSU8oKSA8ZW0+SW50ZXJmYWNlIElPPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyZmFjZUlPKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW50ZXJmYWNlSU8gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKSB7Ci0JCWlmIChpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyA9PSBudWxsKSB7Ci0JCQlpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoCi0JCQkJCVRhc2tEZXNjcmlwdG9yLmNsYXNzLAotCQkJCQl0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW50ZXJmYWNlSU8oKSB7Ci0JCWlmIChpbnRlcmZhY2VJTyA9PSBudWxsKSB7Ci0JCQlpbnRlcmZhY2VJTyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyk7Ci0JCX0KLQkJcmV0dXJuIGludGVyZmFjZUlPOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEludGVyZmFjZUlPKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlM6Ci0JCQlyZXR1cm4gZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJcmV0dXJuIGdldEludGVyZmFjZUlPKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TOgotCQkJZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKS5jbGVhcigpOwotCQkJZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJZ2V0SW50ZXJmYWNlSU8oKS5jbGVhcigpOwotCQkJZ2V0SW50ZXJmYWNlSU8oKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUzoKLQkJCWdldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJZ2V0SW50ZXJmYWNlSU8oKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlM6Ci0JCQlyZXR1cm4gaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMgIT0gbnVsbAotCQkJCQkmJiAhaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQlyZXR1cm4gaW50ZXJmYWNlSU8gIT0gbnVsbCAmJiAhaW50ZXJmYWNlSU8uaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0N2MxMjhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldEV4dGVybmFsSWQgPGVtPkV4dGVybmFsIElkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBleHRlbmRzIEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMKLQkJUHJvY2Vzc0Rlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbElkKCkgPGVtPkV4dGVybmFsIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9JRF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxJZCgpIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRlcm5hbElkID0gRVhURVJOQUxfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NvcGUoKSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NvcGUoKSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNjb3BlID0gU0NPUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VOb3RlcygpIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0VfTk9URVNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzYWdlTm90ZXMoKSA8ZW0+VXNhZ2UgTm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzYWdlTm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXNhZ2VOb3RlcyA9IFVTQUdFX05PVEVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbElkKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxJZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbElkKFN0cmluZyBuZXdFeHRlcm5hbElkKSB7Ci0JCVN0cmluZyBvbGRFeHRlcm5hbElkID0gZXh0ZXJuYWxJZDsKLQkJZXh0ZXJuYWxJZCA9IG5ld0V4dGVybmFsSWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQsIG9sZEV4dGVybmFsSWQsCi0JCQkJCWV4dGVybmFsSWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjb3BlKCkgewotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIG5ld1Njb3BlKSB7Ci0JCVN0cmluZyBvbGRTY29wZSA9IHNjb3BlOwotCQlzY29wZSA9IG5ld1Njb3BlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFLCBvbGRTY29wZSwgc2NvcGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVzYWdlTm90ZXMoKSB7Ci0JCXJldHVybiB1c2FnZU5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzYWdlTm90ZXMoU3RyaW5nIG5ld1VzYWdlTm90ZXMpIHsKLQkJU3RyaW5nIG9sZFVzYWdlTm90ZXMgPSB1c2FnZU5vdGVzOwotCQl1c2FnZU5vdGVzID0gbmV3VXNhZ2VOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUywgb2xkVXNhZ2VOb3RlcywKLQkJCQkJdXNhZ2VOb3RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJcmV0dXJuIGdldEV4dGVybmFsSWQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJcmV0dXJuIGdldFNjb3BlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzoKLQkJCXJldHVybiBnZXRVc2FnZU5vdGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJc2V0RXh0ZXJuYWxJZCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRToKLQkJCXNldFNjb3BlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJc2V0VXNhZ2VOb3RlcygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQlzZXRFeHRlcm5hbElkKEVYVEVSTkFMX0lEX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJc2V0U2NvcGUoU0NPUEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQlzZXRVc2FnZU5vdGVzKFVTQUdFX05PVEVTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJcmV0dXJuIEVYVEVSTkFMX0lEX0VERUZBVUxUID09IG51bGwgPyBleHRlcm5hbElkICE9IG51bGwKLQkJCQkJOiAhRVhURVJOQUxfSURfRURFRkFVTFQuZXF1YWxzKGV4dGVybmFsSWQpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEU6Ci0JCQlyZXR1cm4gU0NPUEVfRURFRkFVTFQgPT0gbnVsbCA/IHNjb3BlICE9IG51bGwgOiAhU0NPUEVfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhzY29wZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzoKLQkJCXJldHVybiBVU0FHRV9OT1RFU19FREVGQVVMVCA9PSBudWxsID8gdXNhZ2VOb3RlcyAhPSBudWxsCi0JCQkJCTogIVVTQUdFX05PVEVTX0VERUZBVUxULmVxdWFscyh1c2FnZU5vdGVzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChleHRlcm5hbElkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGV4dGVybmFsSWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNjb3BlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNjb3BlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1c2FnZU5vdGVzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHVzYWdlTm90ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjEzYzRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2Nlc3NFbGVtZW50SW1wbCBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBQcm9jZXNzRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0VsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0VMRU1FTlQ7Ci0JfQotCi19IC8vUHJvY2Vzc0VsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRmFtaWx5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0ZhbWlseUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjFmYmMyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRmFtaWx5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRmFtaWx5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ZhbWlseUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzZXMgPGVtPkRlbGl2ZXJ5IFByb2Nlc3NlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NGYW1pbHlJbXBsIGV4dGVuZHMgTWV0aG9kQ29uZmlndXJhdGlvbkltcGwgaW1wbGVtZW50cwotCQlQcm9jZXNzRmFtaWx5IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlbGl2ZXJ5UHJvY2Vzc2VzKCkgPGVtPkRlbGl2ZXJ5IFByb2Nlc3NlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlbGl2ZXJ5UHJvY2Vzc2VzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzRmFtaWx5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19GQU1JTFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKSB7Ci0JCWlmIChkZWxpdmVyeVByb2Nlc3NlcyA9PSBudWxsKSB7Ci0JCQlkZWxpdmVyeVByb2Nlc3NlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCURlbGl2ZXJ5UHJvY2Vzcy5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTKTsKLQkJfQotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19GQU1JTFlfX0RFTElWRVJZX1BST0NFU1NFUzoKLQkJCXJldHVybiBnZXREZWxpdmVyeVByb2Nlc3NlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTOgotCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKS5jbGVhcigpOwotCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTOgotCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19GQU1JTFlfX0RFTElWRVJZX1BST0NFU1NFUzoKLQkJCXJldHVybiBkZWxpdmVyeVByb2Nlc3NlcyAhPSBudWxsICYmICFkZWxpdmVyeVByb2Nlc3Nlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1Byb2Nlc3NGYW1pbHlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzYwNTBiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NJbXBsI2dldEluY2x1ZGVzUGF0dGVybnMgPGVtPkluY2x1ZGVzIFBhdHRlcm5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ltcGwjZ2V0RGVmYXVsdENvbnRleHQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NJbXBsI2dldFZhbGlkQ29udGV4dCA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2Nlc3NJbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY2x1ZGVzUGF0dGVybnMoKSA8ZW0+SW5jbHVkZXMgUGF0dGVybnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5jbHVkZXNQYXR0ZXJucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluY2x1ZGVzUGF0dGVybnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdENvbnRleHQoKSA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0Q29udGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbnRleHQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsaWRDb250ZXh0KCkgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsaWRDb250ZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdmFsaWRDb250ZXh0ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbmNsdWRlc1BhdHRlcm5zKCkgewotCQlpZiAoaW5jbHVkZXNQYXR0ZXJucyA9PSBudWxsKSB7Ci0JCQlpbmNsdWRlc1BhdHRlcm5zID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdCgKLQkJCQkJQ2FwYWJpbGl0eVBhdHRlcm4uY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlMpOwotCQl9Ci0JCXJldHVybiBpbmNsdWRlc1BhdHRlcm5zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldERlZmF1bHRDb250ZXh0KCkgewotCQlpZiAoZGVmYXVsdENvbnRleHQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIGRlZmF1bHRDb250ZXh0KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkRGVmYXVsdENvbnRleHQgPSAoSW50ZXJuYWxFT2JqZWN0KSBkZWZhdWx0Q29udGV4dDsKLQkJCWRlZmF1bHRDb250ZXh0ID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVSZXNvbHZlUHJveHkob2xkRGVmYXVsdENvbnRleHQpOwotCQkJaWYgKGRlZmF1bHRDb250ZXh0ICE9IG9sZERlZmF1bHRDb250ZXh0KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCwKLQkJCQkJCQlvbGREZWZhdWx0Q29udGV4dCwgZGVmYXVsdENvbnRleHQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdENvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gYmFzaWNHZXREZWZhdWx0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRDb250ZXh0KE1ldGhvZENvbmZpZ3VyYXRpb24gbmV3RGVmYXVsdENvbnRleHQpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBvbGREZWZhdWx0Q29udGV4dCA9IGRlZmF1bHRDb250ZXh0OwotCQlkZWZhdWx0Q29udGV4dCA9IG5ld0RlZmF1bHRDb250ZXh0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCwgb2xkRGVmYXVsdENvbnRleHQsCi0JCQkJCWRlZmF1bHRDb250ZXh0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VmFsaWRDb250ZXh0KCkgewotCQlpZiAodmFsaWRDb250ZXh0ID09IG51bGwpIHsKLQkJCXZhbGlkQ29udGV4dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUKTsKLQkJfQotCQlyZXR1cm4gdmFsaWRDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TOgotCQkJcmV0dXJuIGdldEluY2x1ZGVzUGF0dGVybnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXREZWZhdWx0Q29udGV4dCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0RGVmYXVsdENvbnRleHQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQ6Ci0JCQlyZXR1cm4gZ2V0VmFsaWRDb250ZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TOgotCQkJZ2V0SW5jbHVkZXNQYXR0ZXJucygpLmNsZWFyKCk7Ci0JCQlnZXRJbmNsdWRlc1BhdHRlcm5zKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ6Ci0JCQlzZXREZWZhdWx0Q29udGV4dCgoTWV0aG9kQ29uZmlndXJhdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCWdldFZhbGlkQ29udGV4dCgpLmNsZWFyKCk7Ci0JCQlnZXRWYWxpZENvbnRleHQoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOUzoKLQkJCWdldEluY2x1ZGVzUGF0dGVybnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJc2V0RGVmYXVsdENvbnRleHQoKE1ldGhvZENvbmZpZ3VyYXRpb24pIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCWdldFZhbGlkQ29udGV4dCgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOUzoKLQkJCXJldHVybiBpbmNsdWRlc1BhdHRlcm5zICE9IG51bGwgJiYgIWluY2x1ZGVzUGF0dGVybnMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJcmV0dXJuIGRlZmF1bHRDb250ZXh0ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJcmV0dXJuIHZhbGlkQ29udGV4dCAhPSBudWxsICYmICF2YWxpZENvbnRleHQuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc1BhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjYzMmQ4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsI2dldFByb2Nlc3NFbGVtZW50cyA8ZW0+UHJvY2VzcyBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbCNnZXREaWFncmFtcyA8ZW0+RGlhZ3JhbXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSW1wbCBpbXBsZW1lbnRzCi0JCVByb2Nlc3NQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2Nlc3NFbGVtZW50cygpIDxlbT5Qcm9jZXNzIEVsZW1lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2Nlc3NFbGVtZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByb2Nlc3NFbGVtZW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaWFncmFtcygpIDxlbT5EaWFncmFtczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaWFncmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpYWdyYW1zID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9jZXNzRWxlbWVudHMoKSB7Ci0JCWlmIChwcm9jZXNzRWxlbWVudHMgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0VsZW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZygKLQkJCQkJUHJvY2Vzc0VsZW1lbnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTKTsKLQkJfQotCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERpYWdyYW1zKCkgewotCQlpZiAoZGlhZ3JhbXMgPT0gbnVsbCkgewotCQkJZGlhZ3JhbXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nKERpYWdyYW0uY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUyk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW1zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRQcm9jZXNzRWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldERpYWdyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTOgotCQkJcmV0dXJuIGdldFByb2Nlc3NFbGVtZW50cygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUzoKLQkJCXJldHVybiBnZXREaWFncmFtcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFM6Ci0JCQlnZXRQcm9jZXNzRWxlbWVudHMoKS5jbGVhcigpOwotCQkJZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TOgotCQkJZ2V0RGlhZ3JhbXMoKS5jbGVhcigpOwotCQkJZ2V0RGlhZ3JhbXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFM6Ci0JCQlnZXRQcm9jZXNzRWxlbWVudHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUzoKLQkJCWdldERpYWdyYW1zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJCXJldHVybiBwcm9jZXNzRWxlbWVudHMgIT0gbnVsbCAmJiAhcHJvY2Vzc0VsZW1lbnRzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVM6Ci0JCQlyZXR1cm4gZGlhZ3JhbXMgIT0gbnVsbCAmJiAhZGlhZ3JhbXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjZmM1N2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwjZ2V0QmFzZWRPblByb2Nlc3NlcyA8ZW0+QmFzZWQgT24gUHJvY2Vzc2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIGV4dGVuZHMgUHJvY2Vzc0ltcGwgaW1wbGVtZW50cwotCQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlZE9uUHJvY2Vzc2VzKCkgPGVtPkJhc2VkIE9uIFByb2Nlc3NlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlZE9uUHJvY2Vzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYmFzZWRPblByb2Nlc3NlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEJhc2VkT25Qcm9jZXNzZXMoKSB7Ci0JCWlmIChiYXNlZE9uUHJvY2Vzc2VzID09IG51bGwpIHsKLQkJCWJhc2VkT25Qcm9jZXNzZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KAotCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRURfT05fUFJPQ0VTU0VTKTsKLQkJfQotCQlyZXR1cm4gYmFzZWRPblByb2Nlc3NlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVM6Ci0JCQlyZXR1cm4gZ2V0QmFzZWRPblByb2Nlc3NlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVM6Ci0JCQlnZXRCYXNlZE9uUHJvY2Vzc2VzKCkuY2xlYXIoKTsKLQkJCWdldEJhc2VkT25Qcm9jZXNzZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVM6Ci0JCQlnZXRCYXNlZE9uUHJvY2Vzc2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUzoKLQkJCXJldHVybiBiYXNlZE9uUHJvY2Vzc2VzICE9IG51bGwgJiYgIWJhc2VkT25Qcm9jZXNzZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb3BlcnR5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlODBlNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvcGVydHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvcGVydHlJbXBsI2dldEtleSA8ZW0+S2V5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvcGVydHlJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5SW1wbCBleHRlbmRzIERpYWdyYW1FbGVtZW50SW1wbCBpbXBsZW1lbnRzIFByb3BlcnR5IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLZXkoKSA8ZW0+S2V5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2V5KCkgPGVtPktleTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0S2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGtleSA9IEtFWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST1BFUlRZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4ga2V5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcgbmV3S2V5KSB7Ci0JCVN0cmluZyBvbGRLZXkgPSBrZXk7Ci0JCWtleSA9IG5ld0tleTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9QRVJUWV9fS0VZLCBvbGRLZXksIGtleSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fS0VZOgotCQkJcmV0dXJuIGdldEtleSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19LRVk6Ci0JCQlzZXRLZXkoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJc2V0VmFsdWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19LRVk6Ci0JCQlzZXRLZXkoS0VZX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19WQUxVRToKLQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19LRVk6Ci0JCQlyZXR1cm4gS0VZX0VERUZBVUxUID09IG51bGwgPyBrZXkgIT0gbnVsbCA6ICFLRVlfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhrZXkpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxUCi0JCQkJCS5lcXVhbHModmFsdWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGtleTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChrZXkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvcGVydHlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qc2V1ZG9TdGF0ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BzZXVkb1N0YXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMTUwOTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BzZXVkb1N0YXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQc2V1ZG9TdGF0ZUltcGwuamF2YSx2IDEuNCAyMDA2LzA5LzA3IDAwOjA2OjIwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHNldWRvU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHNldWRvIFN0YXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHNldWRvU3RhdGVJbXBsIGV4dGVuZHMgVmVydGV4SW1wbCBpbXBsZW1lbnRzIFBzZXVkb1N0YXRlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQc2V1ZG9TdGF0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBTRVVET19TVEFURTsKLQl9Ci0KLX0gLy9Qc2V1ZG9TdGF0ZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZWZlcmVuY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZWZlcmVuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyNzVlZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZmVyZW5jZUltcGwjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24gPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWZlcmVuY2VJbXBsI2dldFJlZmVyZW5jZWQgPGVtPlJlZmVyZW5jZWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VJbXBsIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJbXBsIGltcGxlbWVudHMgUmVmZXJlbmNlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpIDxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKSA8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uID0gSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyZW5jZWQoKSA8ZW0+UmVmZXJlbmNlZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1FbGVtZW50IHJlZmVyZW5jZWQgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlZmVyZW5jZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJFRkVSRU5DRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKAotCQkJQm9vbGVhbiBuZXdJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbikgewotCQlCb29sZWFuIG9sZElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uID0gaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb247Ci0JCWlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uID0gbmV3SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OLAotCQkJCQlvbGRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiwgaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVsZW1lbnQgZ2V0UmVmZXJlbmNlZCgpIHsKLQkJaWYgKHJlZmVyZW5jZWQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHJlZmVyZW5jZWQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRSZWZlcmVuY2VkID0gKEludGVybmFsRU9iamVjdCkgcmVmZXJlbmNlZDsKLQkJCXJlZmVyZW5jZWQgPSAoRGlhZ3JhbUVsZW1lbnQpIGVSZXNvbHZlUHJveHkob2xkUmVmZXJlbmNlZCk7Ci0JCQlpZiAocmVmZXJlbmNlZCAhPSBvbGRSZWZlcmVuY2VkKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRCwgb2xkUmVmZXJlbmNlZCwKLQkJCQkJCQlyZWZlcmVuY2VkKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1FbGVtZW50IGJhc2ljR2V0UmVmZXJlbmNlZCgpIHsKLQkJcmV0dXJuIHJlZmVyZW5jZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVmZXJlbmNlZChEaWFncmFtRWxlbWVudCBuZXdSZWZlcmVuY2VkLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEaWFncmFtRWxlbWVudCBvbGRSZWZlcmVuY2VkID0gcmVmZXJlbmNlZDsKLQkJcmVmZXJlbmNlZCA9IG5ld1JlZmVyZW5jZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VELAotCQkJCQlvbGRSZWZlcmVuY2VkLCBuZXdSZWZlcmVuY2VkKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWQoRGlhZ3JhbUVsZW1lbnQgbmV3UmVmZXJlbmNlZCkgewotCQlpZiAobmV3UmVmZXJlbmNlZCAhPSByZWZlcmVuY2VkKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZWZlcmVuY2VkICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSByZWZlcmVuY2VkKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSwKLQkJCQkJCURpYWdyYW1FbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdSZWZlcmVuY2VkICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdSZWZlcmVuY2VkKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSwKLQkJCQkJCURpYWdyYW1FbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlZmVyZW5jZWQobmV3UmVmZXJlbmNlZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VELCBuZXdSZWZlcmVuY2VkLAotCQkJCQluZXdSZWZlcmVuY2VkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRDoKLQkJCWlmIChyZWZlcmVuY2VkICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSByZWZlcmVuY2VkKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSwKLQkJCQkJCURpYWdyYW1FbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldFJlZmVyZW5jZWQoKERpYWdyYW1FbGVtZW50KSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQ6Ci0JCQlyZXR1cm4gYmFzaWNTZXRSZWZlcmVuY2VkKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRSZWZlcmVuY2VkKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRSZWZlcmVuY2VkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTjoKLQkJCXNldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQ6Ci0JCQlzZXRSZWZlcmVuY2VkKChEaWFncmFtRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTjoKLQkJCXNldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKElTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VEOgotCQkJc2V0UmVmZXJlbmNlZCgoRGlhZ3JhbUVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OOgotCQkJcmV0dXJuIElTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uICE9IG51bGwKLQkJCQkJOiAhSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTl9FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMoaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VEOgotCQkJcmV0dXJuIHJlZmVyZW5jZWQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1JlZmVyZW5jZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlZ2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlZ2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDQ2MWZmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZWdpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZWdpb25JbXBsLmphdmEsdiAxLjUgMjAwNi8wOS8wNyAwMDowNjoyMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlZ2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZ2lvbkltcGwjZ2V0VmVydGV4IDxlbT5WZXJ0ZXg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWdpb25JbXBsI2dldFRyYW5zaXRpb24gPGVtPlRyYW5zaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWdpb25JbXBsI2dldFN0YXRlIDxlbT5TdGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZ2lvbkltcGwjZ2V0U3RhdGVNYWNoaW5lIDxlbT5TdGF0ZSBNYWNoaW5lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uSW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMgUmVnaW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnRleCgpIDxlbT5WZXJ0ZXg8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVydGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdmVydGV4ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zaXRpb24oKSA8ZW0+VHJhbnNpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUcmFuc2l0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdHJhbnNpdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVnaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVHSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFZlcnRleCgpIHsKLQkJaWYgKHZlcnRleCA9PSBudWxsKSB7Ci0JCQl2ZXJ0ZXggPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdC5SZXNvbHZpbmcoCi0JCQkJCVZlcnRleC5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5SRUdJT05fX1ZFUlRFWCwKLQkJCQkJVW1hUGFja2FnZS5WRVJURVhfX0NPTlRBSU5FUik7Ci0JCX0KLQkJcmV0dXJuIHZlcnRleDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUcmFuc2l0aW9uKCkgewotCQlpZiAodHJhbnNpdGlvbiA9PSBudWxsKSB7Ci0JCQl0cmFuc2l0aW9uID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QuUmVzb2x2aW5nKAotCQkJCQlUcmFuc2l0aW9uLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlJFR0lPTl9fVFJBTlNJVElPTiwKLQkJCQkJVW1hUGFja2FnZS5UUkFOU0lUSU9OX19DT05UQUlORVIpOwotCQl9Ci0JCXJldHVybiB0cmFuc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdGF0ZSBnZXRTdGF0ZSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoU3RhdGUpIGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RhdGUgYmFzaWNHZXRTdGF0ZSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoU3RhdGUpIGVJbnRlcm5hbENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFN0YXRlKFN0YXRlIG5ld1N0YXRlLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld1N0YXRlLAotCQkJCVVtYVBhY2thZ2UuUkVHSU9OX19TVEFURSwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXRlKFN0YXRlIG5ld1N0YXRlKSB7Ci0JCWlmIChuZXdTdGF0ZSAhPSBlSW50ZXJuYWxDb250YWluZXIoKQotCQkJCXx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuUkVHSU9OX19TVEFURSAmJiBuZXdTdGF0ZSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIChFT2JqZWN0KSBuZXdTdGF0ZSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdTdGF0ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3U3RhdGUpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlNUQVRFX19SRUdJT04sIFN0YXRlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFN0YXRlKG5ld1N0YXRlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFLCBuZXdTdGF0ZSwgbmV3U3RhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RhdGVNYWNoaW5lIGdldFN0YXRlTWFjaGluZSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFX01BQ0hJTkUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChTdGF0ZU1hY2hpbmUpIGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RhdGVNYWNoaW5lIGJhc2ljR2V0U3RhdGVNYWNoaW5lKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEVfTUFDSElORSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKFN0YXRlTWFjaGluZSkgZUludGVybmFsQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3RhdGVNYWNoaW5lKFN0YXRlTWFjaGluZSBuZXdTdGF0ZU1hY2hpbmUsCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3U3RhdGVNYWNoaW5lLAotCQkJCVVtYVBhY2thZ2UuUkVHSU9OX19TVEFURV9NQUNISU5FLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdGVNYWNoaW5lKFN0YXRlTWFjaGluZSBuZXdTdGF0ZU1hY2hpbmUpIHsKLQkJaWYgKG5ld1N0YXRlTWFjaGluZSAhPSBlSW50ZXJuYWxDb250YWluZXIoKQotCQkJCXx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuUkVHSU9OX19TVEFURV9NQUNISU5FICYmIG5ld1N0YXRlTWFjaGluZSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIChFT2JqZWN0KSBuZXdTdGF0ZU1hY2hpbmUpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3U3RhdGVNYWNoaW5lICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdTdGF0ZU1hY2hpbmUpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlNUQVRFX01BQ0hJTkVfX1JFR0lPTiwgU3RhdGVNYWNoaW5lLmNsYXNzLAotCQkJCQkJbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTdGF0ZU1hY2hpbmUobmV3U3RhdGVNYWNoaW5lLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFX01BQ0hJTkUsIG5ld1N0YXRlTWFjaGluZSwKLQkJCQkJbmV3U3RhdGVNYWNoaW5lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fVkVSVEVYOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0VmVydGV4KCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fVFJBTlNJVElPTjoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldFRyYW5zaXRpb24oKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVHSU9OX19TVEFURToKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0U3RhdGUoKFN0YXRlKSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFX01BQ0hJTkU6Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldFN0YXRlTWFjaGluZSgoU3RhdGVNYWNoaW5lKSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1ZFUlRFWDoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldFZlcnRleCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1RSQU5TSVRJT046Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRUcmFuc2l0aW9uKCkpCi0JCQkJCS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFOgotCQkJcmV0dXJuIGJhc2ljU2V0U3RhdGUobnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFX01BQ0hJTkU6Ci0JCQlyZXR1cm4gYmFzaWNTZXRTdGF0ZU1hY2hpbmUobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSgKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuU1RBVEVfX1JFR0lPTiwgU3RhdGUuY2xhc3MsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVHSU9OX19TVEFURV9NQUNISU5FOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuU1RBVEVfTUFDSElORV9fUkVHSU9OLCBTdGF0ZU1hY2hpbmUuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1ZFUlRFWDoKLQkJCXJldHVybiBnZXRWZXJ0ZXgoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fVFJBTlNJVElPTjoKLQkJCXJldHVybiBnZXRUcmFuc2l0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFN0YXRlKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRTdGF0ZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVHSU9OX19TVEFURV9NQUNISU5FOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFN0YXRlTWFjaGluZSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0U3RhdGVNYWNoaW5lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fVkVSVEVYOgotCQkJZ2V0VmVydGV4KCkuY2xlYXIoKTsKLQkJCWdldFZlcnRleCgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUkVHSU9OX19UUkFOU0lUSU9OOgotCQkJZ2V0VHJhbnNpdGlvbigpLmNsZWFyKCk7Ci0JCQlnZXRUcmFuc2l0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFOgotCQkJc2V0U3RhdGUoKFN0YXRlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFX01BQ0hJTkU6Ci0JCQlzZXRTdGF0ZU1hY2hpbmUoKFN0YXRlTWFjaGluZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fVkVSVEVYOgotCQkJZ2V0VmVydGV4KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fVFJBTlNJVElPTjoKLQkJCWdldFRyYW5zaXRpb24oKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUkVHSU9OX19TVEFURToKLQkJCXNldFN0YXRlKChTdGF0ZSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFX01BQ0hJTkU6Ci0JCQlzZXRTdGF0ZU1hY2hpbmUoKFN0YXRlTWFjaGluZSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1ZFUlRFWDoKLQkJCXJldHVybiB2ZXJ0ZXggIT0gbnVsbCAmJiAhdmVydGV4LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fVFJBTlNJVElPTjoKLQkJCXJldHVybiB0cmFuc2l0aW9uICE9IG51bGwgJiYgIXRyYW5zaXRpb24uaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVHSU9OX19TVEFURToKLQkJCXJldHVybiBiYXNpY0dldFN0YXRlKCkgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEVfTUFDSElORToKLQkJCXJldHVybiBiYXNpY0dldFN0YXRlTWFjaGluZSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1JlZ2lvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZXBvcnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZXBvcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3NDk5NWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUmVwb3J0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvcnRJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUmVwb3J0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXBvcnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5SRVBPUlQ7Ci0JfQotCi19IC8vUmVwb3J0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUmV1c2FibGVBc3NldEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JldXNhYmxlQXNzZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliMWU1MmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUmV1c2FibGVBc3NldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmV1c2FibGVBc3NldEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBSZXVzYWJsZUFzc2V0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXVzYWJsZUFzc2V0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVVU0FCTEVfQVNTRVQ7Ci0JfQotCi19IC8vUmV1c2FibGVBc3NldEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvYWRtYXBJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2FkbWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MDYwZThiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvYWRtYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9hZG1hcEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBSb2FkbWFwIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2FkbWFwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9BRE1BUDsKLQl9Ci0KLX0gLy9Sb2FkbWFwSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDA3MGYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcyA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCNnZXRTeW5vbnltcyA8ZW0+U3lub255bXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzCi0JCVJvbGVEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2tpbGxzKCkgPGVtPlNraWxsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2tpbGxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lMTFNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNraWxscygpIDxlbT5Ta2lsbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNraWxscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBza2lsbHMgPSBTS0lMTFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKSA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTSUdOTUVOVF9BUFBST0FDSEVTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFzc2lnbm1lbnRBcHByb2FjaGVzID0gQVNTSUdOTUVOVF9BUFBST0FDSEVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5bm9ueW1zKCkgPGVtPlN5bm9ueW1zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTeW5vbnltcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOT05ZTVNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5bm9ueW1zKCkgPGVtPlN5bm9ueW1zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTeW5vbnltcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzeW5vbnltcyA9IFNZTk9OWU1TX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTa2lsbHMoKSB7Ci0JCXJldHVybiBza2lsbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2tpbGxzKFN0cmluZyBuZXdTa2lsbHMpIHsKLQkJU3RyaW5nIG9sZFNraWxscyA9IHNraWxsczsKLQkJc2tpbGxzID0gbmV3U2tpbGxzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUywgb2xkU2tpbGxzLCBza2lsbHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkgewotCQlyZXR1cm4gYXNzaWdubWVudEFwcHJvYWNoZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoU3RyaW5nIG5ld0Fzc2lnbm1lbnRBcHByb2FjaGVzKSB7Ci0JCVN0cmluZyBvbGRBc3NpZ25tZW50QXBwcm9hY2hlcyA9IGFzc2lnbm1lbnRBcHByb2FjaGVzOwotCQlhc3NpZ25tZW50QXBwcm9hY2hlcyA9IG5ld0Fzc2lnbm1lbnRBcHByb2FjaGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUywKLQkJCQkJb2xkQXNzaWdubWVudEFwcHJvYWNoZXMsIGFzc2lnbm1lbnRBcHByb2FjaGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeW5vbnltcygpIHsKLQkJcmV0dXJuIHN5bm9ueW1zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bm9ueW1zKFN0cmluZyBuZXdTeW5vbnltcykgewotCQlTdHJpbmcgb2xkU3lub255bXMgPSBzeW5vbnltczsKLQkJc3lub255bXMgPSBuZXdTeW5vbnltczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUywgb2xkU3lub255bXMsCi0JCQkJCXN5bm9ueW1zKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTOgotCQkJcmV0dXJuIGdldFNraWxscygpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJcmV0dXJuIGdldEFzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUzoKLQkJCXJldHVybiBnZXRTeW5vbnltcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQlzZXRTa2lsbHMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQlzZXRTeW5vbnltcygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTOgotCQkJc2V0U2tpbGxzKFNLSUxMU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVM6Ci0JCQlzZXRBc3NpZ25tZW50QXBwcm9hY2hlcyhBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQlzZXRTeW5vbnltcyhTWU5PTllNU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQlyZXR1cm4gU0tJTExTX0VERUZBVUxUID09IG51bGwgPyBza2lsbHMgIT0gbnVsbCA6ICFTS0lMTFNfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhza2lsbHMpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJcmV0dXJuIEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVCA9PSBudWxsID8gYXNzaWdubWVudEFwcHJvYWNoZXMgIT0gbnVsbAotCQkJCQk6ICFBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGFzc2lnbm1lbnRBcHByb2FjaGVzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJcmV0dXJuIFNZTk9OWU1TX0VERUZBVUxUID09IG51bGwgPyBzeW5vbnltcyAhPSBudWxsCi0JCQkJCTogIVNZTk9OWU1TX0VERUZBVUxULmVxdWFscyhzeW5vbnltcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2tpbGxzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNraWxscyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXNzaWdubWVudEFwcHJvYWNoZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYXNzaWdubWVudEFwcHJvYWNoZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN5bm9ueW1zOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHN5bm9ueW1zKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUm9sZURlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZURlc2NyaXB0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDQ3OTNiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCNnZXRNb2RpZmllcyA8ZW0+TW9kaWZpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9ySW1wbCBleHRlbmRzIERlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMKLQkJUm9sZURlc2NyaXB0b3IgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZSgpIDxlbT5Sb2xlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZSByb2xlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3BvbnNpYmxlRm9yKCkgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNwb25zaWJsZUZvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc3BvbnNpYmxlRm9yID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlRGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZSBnZXRSb2xlKCkgewotCQlpZiAocm9sZSAhPSBudWxsICYmICgoRU9iamVjdCkgcm9sZSkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFJvbGUgPSAoSW50ZXJuYWxFT2JqZWN0KSByb2xlOwotCQkJcm9sZSA9IChSb2xlKSBlUmVzb2x2ZVByb3h5KG9sZFJvbGUpOwotCQkJaWYgKHJvbGUgIT0gb2xkUm9sZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEUsIG9sZFJvbGUsIHJvbGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZSBiYXNpY0dldFJvbGUoKSB7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGUoUm9sZSBuZXdSb2xlKSB7Ci0JCVJvbGUgb2xkUm9sZSA9IHJvbGU7Ci0JCXJvbGUgPSBuZXdSb2xlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRSwgb2xkUm9sZSwgcm9sZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIExpc3QgZ2V0TW9kaWZpZXMoKSB7Ci0JCUxpc3QgcGVyZm9ybXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHRoaXMpOwotCQlJbnRlcm5hbEVMaXN0IG1vZGlmaWVzID0gbmV3IEJhc2ljSW50ZXJuYWxFTGlzdCgKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MpOwotCQlpZiAocGVyZm9ybXMgIT0gbnVsbCAmJiBwZXJmb3Jtcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBwZXJmb3Jtcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaS5uZXh0KCk7Ci0KLQkJCQkvLyBmb3IgZWFjaCB0YXNrLCBnZXQgb3V0cHV0IHdvcmsgcHJvZHVjdDsKLQkJCQlMaXN0IG91dHB1dFdQcyA9IHRkLmdldE91dHB1dCgpOwotCQkJCWlmIChvdXRwdXRXUHMgIT0gbnVsbCAmJiBvdXRwdXRXUHMuc2l6ZSgpID4gMCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gb3V0cHV0V1BzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdAotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJaWYgKHdwZCAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKCFtb2RpZmllcy5jb250YWlucyh3cGQpKSB7Ci0JCQkJCQkJCW1vZGlmaWVzLmFkZCh3cGQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzcG9uc2libGVGb3IoKSB7Ci0JCWlmIChyZXNwb25zaWJsZUZvciA9PSBudWxsKSB7Ci0JCQlyZXNwb25zaWJsZUZvciA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUik7Ci0JCX0KLQkJcmV0dXJuIHJlc3BvbnNpYmxlRm9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRSb2xlKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRSb2xlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX01PRElGSUVTOgotCQkJcmV0dXJuIGdldE1vZGlmaWVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCXJldHVybiBnZXRSZXNwb25zaWJsZUZvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQlzZXRSb2xlKChSb2xlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJc2V0Um9sZSgoUm9sZSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCXJldHVybiByb2xlICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX01PRElGSUVTOgotCQkJcmV0dXJuICFnZXRNb2RpZmllcygpLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJcmV0dXJuIHJlc3BvbnNpYmxlRm9yICE9IG51bGwgJiYgIXJlc3BvbnNpYmxlRm9yLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUm9sZURlc2NyaXB0b3JJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGM4NjdkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlSW1wbCNnZXRNb2RpZmllcyA8ZW0+TW9kaWZpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlSW1wbCNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBSb2xlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3BvbnNpYmxlRm9yKCkgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNwb25zaWJsZUZvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc3BvbnNpYmxlRm9yID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1vZGlmaWVzKCkgewotCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0TW9kaWZpZWRXb3JrUHJvZHVjdHModGhpcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzcG9uc2libGVGb3IoKSB7Ci0JCWlmIChyZXNwb25zaWJsZUZvciA9PSBudWxsKSB7Ci0JCQlyZXNwb25zaWJsZUZvciA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SKTsKLQkJfQotCQlyZXR1cm4gcmVzcG9uc2libGVGb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fTU9ESUZJRVM6Ci0JCQlyZXR1cm4gZ2V0TW9kaWZpZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCXJldHVybiBnZXRSZXNwb25zaWJsZUZvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1I6Ci0JCQlnZXRSZXNwb25zaWJsZUZvcigpLmNsZWFyKCk7Ci0JCQlnZXRSZXNwb25zaWJsZUZvcigpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX01PRElGSUVTOgotCQkJcmV0dXJuICFnZXRNb2RpZmllcygpLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCXJldHVybiByZXNwb25zaWJsZUZvciAhPSBudWxsICYmICFyZXNwb25zaWJsZUZvci5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1JvbGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlU2V0R3JvdXBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlU2V0R3JvdXBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2MTFhMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZVNldEdyb3VwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgU2V0IEdyb3VwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbCNnZXRSb2xlU2V0cyA8ZW0+Um9sZSBTZXRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEdyb3VwaW5nSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cwotCQlSb2xlU2V0R3JvdXBpbmcgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZVNldHMoKSA8ZW0+Um9sZSBTZXRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGVTZXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgcm9sZVNldHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVTZXRHcm91cGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfU0VUX0dST1VQSU5HOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJvbGVTZXRzKCkgewotCQlpZiAocm9sZVNldHMgPT0gbnVsbCkgewotCQkJcm9sZVNldHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFJvbGVTZXQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUyk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVTZXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFM6Ci0JCQlyZXR1cm4gZ2V0Um9sZVNldHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUzoKLQkJCWdldFJvbGVTZXRzKCkuY2xlYXIoKTsKLQkJCWdldFJvbGVTZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUzoKLQkJCWdldFJvbGVTZXRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFM6Ci0JCQlyZXR1cm4gcm9sZVNldHMgIT0gbnVsbCAmJiAhcm9sZVNldHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Sb2xlU2V0R3JvdXBpbmdJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlU2V0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZVNldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzYxZDMxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlU2V0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRJbXBsI2dldFJvbGVzIDxlbT5Sb2xlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIFJvbGVTZXQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZXMoKSA8ZW0+Um9sZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByb2xlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZVNldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfU0VUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJvbGVzKCkgewotCQlpZiAocm9sZXMgPT0gbnVsbCkgewotCQkJcm9sZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFJvbGUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEVTKTsKLQkJfQotCQlyZXR1cm4gcm9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEVTOgotCQkJcmV0dXJuIGdldFJvbGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFUzoKLQkJCWdldFJvbGVzKCkuY2xlYXIoKTsKLQkJCWdldFJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEVTOgotCQkJZ2V0Um9sZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEVTOgotCQkJcmV0dXJuIHJvbGVzICE9IG51bGwgJiYgIXJvbGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUm9sZVNldEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlY3Rpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TZWN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYmIxYTY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uIDxlbT5TZWN0aW9uIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0U3ViU2VjdGlvbnMgPGVtPlN1YiBTZWN0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlY3Rpb25JbXBsI2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25JbXBsIGV4dGVuZHMgVmFyaWFiaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNlY3Rpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25OYW1lKCkgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1RJT05fTkFNRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdGlvbk5hbWUoKSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZWN0aW9uTmFtZSA9IFNFQ1RJT05fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSA8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNUSU9OX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSA8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlY3Rpb25EZXNjcmlwdGlvbiA9IFNFQ1RJT05fREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJTZWN0aW9ucygpIDxlbT5TdWIgU2VjdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViU2VjdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzdWJTZWN0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVkZWNlc3NvcigpIDxlbT5QcmVkZWNlc3NvcjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTZWN0aW9uIHByZWRlY2Vzc29yID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuU0VDVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VjdGlvbk5hbWUoU3RyaW5nIG5ld1NlY3Rpb25OYW1lKSB7Ci0JCVN0cmluZyBvbGRTZWN0aW9uTmFtZSA9IHNlY3Rpb25OYW1lOwotCQlzZWN0aW9uTmFtZSA9IG5ld1NlY3Rpb25OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRSwgb2xkU2VjdGlvbk5hbWUsCi0JCQkJCXNlY3Rpb25OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBzZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VjdGlvbkRlc2NyaXB0aW9uKFN0cmluZyBuZXdTZWN0aW9uRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZFNlY3Rpb25EZXNjcmlwdGlvbiA9IHNlY3Rpb25EZXNjcmlwdGlvbjsKLQkJc2VjdGlvbkRlc2NyaXB0aW9uID0gbmV3U2VjdGlvbkRlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT04sCi0JCQkJCW9sZFNlY3Rpb25EZXNjcmlwdGlvbiwgc2VjdGlvbkRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U3ViU2VjdGlvbnMoKSB7Ci0JCWlmIChzdWJTZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQlzdWJTZWN0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoU2VjdGlvbi5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTlMpOwotCQl9Ci0JCXJldHVybiBzdWJTZWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBnZXRQcmVkZWNlc3NvcigpIHsKLQkJaWYgKHByZWRlY2Vzc29yICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcmVkZWNlc3NvcikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByZWRlY2Vzc29yID0gKEludGVybmFsRU9iamVjdCkgcHJlZGVjZXNzb3I7Ci0JCQlwcmVkZWNlc3NvciA9IChTZWN0aW9uKSBlUmVzb2x2ZVByb3h5KG9sZFByZWRlY2Vzc29yKTsKLQkJCWlmIChwcmVkZWNlc3NvciAhPSBvbGRQcmVkZWNlc3NvcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUiwgb2xkUHJlZGVjZXNzb3IsCi0JCQkJCQkJcHJlZGVjZXNzb3IpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlZGVjZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3Rpb24gYmFzaWNHZXRQcmVkZWNlc3NvcigpIHsKLQkJcmV0dXJuIHByZWRlY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWRlY2Vzc29yKFNlY3Rpb24gbmV3UHJlZGVjZXNzb3IpIHsKLQkJU2VjdGlvbiBvbGRQcmVkZWNlc3NvciA9IHByZWRlY2Vzc29yOwotCQlwcmVkZWNlc3NvciA9IG5ld1ByZWRlY2Vzc29yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SLCBvbGRQcmVkZWNlc3NvciwKLQkJCQkJcHJlZGVjZXNzb3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT05TOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0U3ViU2VjdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUU6Ci0JCQlyZXR1cm4gZ2V0U2VjdGlvbk5hbWUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTlM6Ci0JCQlyZXR1cm4gZ2V0U3ViU2VjdGlvbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZWRlY2Vzc29yKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVkZWNlc3NvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUU6Ci0JCQlzZXRTZWN0aW9uTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX0RFU0NSSVBUSU9OOgotCQkJc2V0U2VjdGlvbkRlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUzoKLQkJCWdldFN1YlNlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCWdldFN1YlNlY3Rpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCXNldFByZWRlY2Vzc29yKChTZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJc2V0U2VjdGlvbk5hbWUoU0VDVElPTl9OQU1FX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT046Ci0JCQlzZXRTZWN0aW9uRGVzY3JpcHRpb24oU0VDVElPTl9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTlM6Ci0JCQlnZXRTdWJTZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCXNldFByZWRlY2Vzc29yKChTZWN0aW9uKSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCXJldHVybiBTRUNUSU9OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHNlY3Rpb25OYW1lICE9IG51bGwKLQkJCQkJOiAhU0VDVElPTl9OQU1FX0VERUZBVUxULmVxdWFscyhzZWN0aW9uTmFtZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIFNFQ1RJT05fREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHNlY3Rpb25EZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCTogIVNFQ1RJT05fREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKHNlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTlM6Ci0JCQlyZXR1cm4gc3ViU2VjdGlvbnMgIT0gbnVsbCAmJiAhc3ViU2VjdGlvbnMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1I6Ci0JCQlyZXR1cm4gcHJlZGVjZXNzb3IgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzZWN0aW9uTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzZWN0aW9uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2VjdGlvbkRlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlY3Rpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU2VtYW50aWNNb2RlbEJyaWRnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmVlMDYzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZW1hbnRpY01vZGVsQnJpZGdlSW1wbCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlbWFudGljTW9kZWxCcmlkZ2VJbXBsI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlbWFudGljTW9kZWxCcmlkZ2VJbXBsI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCBleHRlbmRzIERpYWdyYW1FbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIFNlbWFudGljTW9kZWxCcmlkZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbigpIDxlbT5QcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VOVEFUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb24oKSA8ZW0+UHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlc2VudGF0aW9uID0gUFJFU0VOVEFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlbWFudGljTW9kZWxCcmlkZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TRU1BTlRJQ19NT0RFTF9CUklER0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiBwcmVzZW50YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VudGF0aW9uKFN0cmluZyBuZXdQcmVzZW50YXRpb24pIHsKLQkJU3RyaW5nIG9sZFByZXNlbnRhdGlvbiA9IHByZXNlbnRhdGlvbjsKLQkJcHJlc2VudGF0aW9uID0gbmV3UHJlc2VudGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OLAotCQkJCQlvbGRQcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgZ2V0R3JhcGhFbGVtZW50KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEdyYXBoRWxlbWVudCkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgYmFzaWNHZXRHcmFwaEVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlSW50ZXJuYWxDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG5ld0dyYXBoRWxlbWVudCwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdHcmFwaEVsZW1lbnQsCi0JCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG5ld0dyYXBoRWxlbWVudCkgewotCQlpZiAobmV3R3JhcGhFbGVtZW50ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpCi0JCQkJfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQgJiYgbmV3R3JhcGhFbGVtZW50ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgKEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdHcmFwaEVsZW1lbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsCi0JCQkJCQlHcmFwaEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0R3JhcGhFbGVtZW50KG5ld0dyYXBoRWxlbWVudCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5ULAotCQkJCQluZXdHcmFwaEVsZW1lbnQsIG5ld0dyYXBoRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRGlhZ3JhbSkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtIGJhc2ljR2V0RGlhZ3JhbSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0pCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEaWFncmFtKSBlSW50ZXJuYWxDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREaWFncmFtKERpYWdyYW0gbmV3RGlhZ3JhbSwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdEaWFncmFtLAotCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlhZ3JhbShEaWFncmFtIG5ld0RpYWdyYW0pIHsKLQkJaWYgKG5ld0RpYWdyYW0gIT0gZUludGVybmFsQ29udGFpbmVyKCkKLQkJCQl8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSAmJiBuZXdEaWFncmFtICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgKEVPYmplY3QpIG5ld0RpYWdyYW0pKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RGlhZ3JhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RGlhZ3JhbSkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFLCBEaWFncmFtLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldERpYWdyYW0obmV3RGlhZ3JhbSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNLCBuZXdEaWFncmFtLAotCQkJCQluZXdEaWFncmFtKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDoKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTToKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0RGlhZ3JhbSgoRGlhZ3JhbSkgb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGJhc2ljU2V0R3JhcGhFbGVtZW50KG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJcmV0dXJuIGJhc2ljU2V0RGlhZ3JhbShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDoKLQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCQlHcmFwaEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFLCBEaWFncmFtLmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0R3JhcGhFbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRHcmFwaEVsZW1lbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXREaWFncmFtKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXREaWFncmFtKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OOgotCQkJc2V0UHJlc2VudGF0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDoKLQkJCXNldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU06Ci0JCQlzZXREaWFncmFtKChEaWFncmFtKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT046Ci0JCQlzZXRQcmVzZW50YXRpb24oUFJFU0VOVEFUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDoKLQkJCXNldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTToKLQkJCXNldERpYWdyYW0oKERpYWdyYW0pIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gUFJFU0VOVEFUSU9OX0VERUZBVUxUID09IG51bGwgPyBwcmVzZW50YXRpb24gIT0gbnVsbAotCQkJCQk6ICFQUkVTRU5UQVRJT05fRURFRkFVTFQuZXF1YWxzKHByZXNlbnRhdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gYmFzaWNHZXRHcmFwaEVsZW1lbnQoKSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJcmV0dXJuIGJhc2ljR2V0RGlhZ3JhbSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlc2VudGF0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHByZXNlbnRhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlbWFudGljTW9kZWxCcmlkZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTVhMzJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbCNnZXRUeXBlSW5mbyA8ZW0+VHlwZSBJbmZvPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsIGV4dGVuZHMgU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkJaW1wbGVtZW50cyBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUluZm8oKSA8ZW0+VHlwZSBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JTkZPX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlSW5mbygpIDxlbT5UeXBlIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGVJbmZvID0gVFlQRV9JTkZPX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlSW5mbygpIHsKLQkJcmV0dXJuIHR5cGVJbmZvOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVJbmZvKFN0cmluZyBuZXdUeXBlSW5mbykgewotCQlTdHJpbmcgb2xkVHlwZUluZm8gPSB0eXBlSW5mbzsKLQkJdHlwZUluZm8gPSBuZXdUeXBlSW5mbzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPLAotCQkJCQlvbGRUeXBlSW5mbywgdHlwZUluZm8pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPOgotCQkJcmV0dXJuIGdldFR5cGVJbmZvKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk86Ci0JCQlzZXRUeXBlSW5mbygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTzoKLQkJCXNldFR5cGVJbmZvKFRZUEVfSU5GT19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPOgotCQkJcmV0dXJuIFRZUEVfSU5GT19FREVGQVVMVCA9PSBudWxsID8gdHlwZUluZm8gIT0gbnVsbAotCQkJCQk6ICFUWVBFX0lORk9fRURFRkFVTFQuZXF1YWxzKHR5cGVJbmZvKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlSW5mbzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0eXBlSW5mbyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3RhdGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TdGF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAyYTYxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TdGF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFN0YXRlSW1wbC5qYXZhLHYgMS41IDIwMDYvMDkvMDcgMDA6MDY6MjAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZU1hY2hpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdGF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0YXRlSW1wbCNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RhdGVJbXBsI2dldFJlZ2lvbiA8ZW0+UmVnaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RhdGVJbXBsI2dldFN1Ym1hY2hpbmUgPGVtPlN1Ym1hY2hpbmU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0ZUltcGwgZXh0ZW5kcyBWZXJ0ZXhJbXBsIGltcGxlbWVudHMgU3RhdGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1Byb2R1Y3QoKSA8ZW0+V29yayBQcm9kdWN0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgd29ya1Byb2R1Y3QgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVnaW9uKCkgPGVtPlJlZ2lvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWdpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZWdpb24gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VibWFjaGluZSgpIDxlbT5TdWJtYWNoaW5lPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJtYWNoaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RhdGVNYWNoaW5lIHN1Ym1hY2hpbmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0YXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuU1RBVEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0V29ya1Byb2R1Y3QoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdCA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuU1RBVEVfX1dPUktfUFJPRFVDVCk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlZ2lvbigpIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZWdpb24gPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdC5SZXNvbHZpbmcoCi0JCQkJCVJlZ2lvbi5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5TVEFURV9fUkVHSU9OLAotCQkJCQlVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEUpOwotCQl9Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0YXRlTWFjaGluZSBnZXRTdWJtYWNoaW5lKCkgewotCQlpZiAoc3VibWFjaGluZSAhPSBudWxsICYmICgoRU9iamVjdCkgc3VibWFjaGluZSkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFN1Ym1hY2hpbmUgPSAoSW50ZXJuYWxFT2JqZWN0KSBzdWJtYWNoaW5lOwotCQkJc3VibWFjaGluZSA9IChTdGF0ZU1hY2hpbmUpIGVSZXNvbHZlUHJveHkob2xkU3VibWFjaGluZSk7Ci0JCQlpZiAoc3VibWFjaGluZSAhPSBvbGRTdWJtYWNoaW5lKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlNUQVRFX19TVUJNQUNISU5FLCBvbGRTdWJtYWNoaW5lLAotCQkJCQkJCXN1Ym1hY2hpbmUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VibWFjaGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RhdGVNYWNoaW5lIGJhc2ljR2V0U3VibWFjaGluZSgpIHsKLQkJcmV0dXJuIHN1Ym1hY2hpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VibWFjaGluZShTdGF0ZU1hY2hpbmUgbmV3U3VibWFjaGluZSkgewotCQlTdGF0ZU1hY2hpbmUgb2xkU3VibWFjaGluZSA9IHN1Ym1hY2hpbmU7Ci0JCXN1Ym1hY2hpbmUgPSBuZXdTdWJtYWNoaW5lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNUQVRFX19TVUJNQUNISU5FLCBvbGRTdWJtYWNoaW5lLCBzdWJtYWNoaW5lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFX19SRUdJT046Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRSZWdpb24oKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfX1JFR0lPTjoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldFJlZ2lvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFX19XT1JLX1BST0RVQ1Q6Ci0JCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3QoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFX19SRUdJT046Ci0JCQlyZXR1cm4gZ2V0UmVnaW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEFURV9fU1VCTUFDSElORToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRTdWJtYWNoaW5lKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRTdWJtYWNoaW5lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFX19XT1JLX1BST0RVQ1Q6Ci0JCQlnZXRXb3JrUHJvZHVjdCgpLmNsZWFyKCk7Ci0JCQlnZXRXb3JrUHJvZHVjdCgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfX1JFR0lPTjoKLQkJCWdldFJlZ2lvbigpLmNsZWFyKCk7Ci0JCQlnZXRSZWdpb24oKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFX19TVUJNQUNISU5FOgotCQkJc2V0U3VibWFjaGluZSgoU3RhdGVNYWNoaW5lKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfX1dPUktfUFJPRFVDVDoKLQkJCWdldFdvcmtQcm9kdWN0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFX19SRUdJT046Ci0JCQlnZXRSZWdpb24oKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfX1NVQk1BQ0hJTkU6Ci0JCQlzZXRTdWJtYWNoaW5lKChTdGF0ZU1hY2hpbmUpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfX1dPUktfUFJPRFVDVDoKLQkJCXJldHVybiB3b3JrUHJvZHVjdCAhPSBudWxsICYmICF3b3JrUHJvZHVjdC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEFURV9fUkVHSU9OOgotCQkJcmV0dXJuIHJlZ2lvbiAhPSBudWxsICYmICFyZWdpb24uaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfX1NVQk1BQ0hJTkU6Ci0JCQlyZXR1cm4gc3VibWFjaGluZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9TdGF0ZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TdGF0ZU1hY2hpbmVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TdGF0ZU1hY2hpbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiMDE0ZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3RhdGVNYWNoaW5lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU3RhdGVNYWNoaW5lSW1wbC5qYXZhLHYgMS41IDIwMDYvMDkvMDcgMDA6MDY6MjAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdGF0ZSBNYWNoaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RhdGVNYWNoaW5lSW1wbCNnZXRSZWdpb24gPGVtPlJlZ2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0YXRlTWFjaGluZUltcGwgZXh0ZW5kcyBXb3JrRGVmaW5pdGlvbkltcGwgaW1wbGVtZW50cwotCQlTdGF0ZU1hY2hpbmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVnaW9uKCkgPGVtPlJlZ2lvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWdpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZWdpb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0YXRlTWFjaGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNUQVRFX01BQ0hJTkU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVnaW9uKCkgewotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJlZ2lvbiA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0LlJlc29sdmluZygKLQkJCQkJUmVnaW9uLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlNUQVRFX01BQ0hJTkVfX1JFR0lPTiwKLQkJCQkJVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFX01BQ0hJTkUpOwotCQl9Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFX01BQ0hJTkVfX1JFR0lPTjoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldFJlZ2lvbigpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEFURV9NQUNISU5FX19SRUdJT046Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRSZWdpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEFURV9NQUNISU5FX19SRUdJT046Ci0JCQlyZXR1cm4gZ2V0UmVnaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFX01BQ0hJTkVfX1JFR0lPTjoKLQkJCWdldFJlZ2lvbigpLmNsZWFyKCk7Ci0JCQlnZXRSZWdpb24oKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEFURV9NQUNISU5FX19SRUdJT046Ci0JCQlnZXRSZWdpb24oKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfTUFDSElORV9fUkVHSU9OOgotCQkJcmV0dXJuIHJlZ2lvbiAhPSBudWxsICYmICFyZWdpb24uaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9TdGF0ZU1hY2hpbmVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3RlcEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1N0ZXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgwODc2ZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3RlcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0ZXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdGVwSW1wbCNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGVwSW1wbCBleHRlbmRzIFNlY3Rpb25JbXBsIGltcGxlbWVudHMgU3RlcCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjb25kaXRpb24oKSA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50IHByZWNvbmRpdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50IHBvc3Rjb25kaXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0ZXBJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TVEVQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFByZWNvbmRpdGlvbigpIHsKLQkJaWYgKHByZWNvbmRpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlY29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJcHJlY29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUHJlY29uZGl0aW9uKTsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gb2xkUHJlY29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1ByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUHJlY29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBudWxsKTsKLQkJCQlpZiAobmV3UHJlY29uZGl0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1ByZWNvbmRpdGlvbgotCQkJCQkJCS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT04sIG9sZFByZWNvbmRpdGlvbiwKLQkJCQkJCQlwcmVjb25kaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQcmVjb25kaXRpb24gPSBwcmVjb25kaXRpb247Ci0JCXByZWNvbmRpdGlvbiA9IG5ld1ByZWNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT04sCi0JCQkJCW9sZFByZWNvbmRpdGlvbiwgbmV3UHJlY29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbikgewotCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IHByZWNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1ByZWNvbmRpdGlvbikuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlY29uZGl0aW9uKG5ld1ByZWNvbmRpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OLCBuZXdQcmVjb25kaXRpb24sCi0JCQkJCW5ld1ByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQlwb3N0Y29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBvbGRQb3N0Y29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Bvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQb3N0Y29uZGl0aW9uCi0JCQkJCQkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTiwgbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UG9zdGNvbmRpdGlvbi5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJCS0gVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OLCBudWxsLAotCQkJCQkJCW1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT04sIG9sZFBvc3Rjb25kaXRpb24sCi0JCQkJCQkJcG9zdGNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUG9zdGNvbmRpdGlvbiA9IHBvc3Rjb25kaXRpb247Ci0JCXBvc3Rjb25kaXRpb24gPSBuZXdQb3N0Y29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT04sCi0JCQkJCW9sZFBvc3Rjb25kaXRpb24sIG5ld1Bvc3Rjb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gcG9zdGNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbikKLQkJCQkJCS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQb3N0Y29uZGl0aW9uKQotCQkJCQkJLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdGNvbmRpdGlvbihuZXdQb3N0Y29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OLCBuZXdQb3N0Y29uZGl0aW9uLAotCQkJCQluZXdQb3N0Y29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFByZWNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlY29uZGl0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVjb25kaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT046Ci0JCQlzZXRQcmVjb25kaXRpb24oKENvbnN0cmFpbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQlzZXRQb3N0Y29uZGl0aW9uKChDb25zdHJhaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQlzZXRQb3N0Y29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBwcmVjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gcG9zdGNvbmRpdGlvbiAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLX0gLy9TdGVwSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTU3ZGE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1N1cHBvcnRpbmdNYXRlcmlhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN1cHBvcnRpbmdNYXRlcmlhbEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN1cHBvcnRpbmdNYXRlcmlhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNVUFBPUlRJTkdfTUFURVJJQUw7Ci0JfQotCi19IC8vU3VwcG9ydGluZ01hdGVyaWFsSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNTBiM2E5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cwotCQlUYXNrRGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVSUE9TRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1cnBvc2UgPSBQVVJQT1NFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRJVkVTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRlcm5hdGl2ZXMoKSA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWx0ZXJuYXRpdmVzID0gQUxURVJOQVRJVkVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwgcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gYWx0ZXJuYXRpdmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgbmV3QWx0ZXJuYXRpdmVzKSB7Ci0JCVN0cmluZyBvbGRBbHRlcm5hdGl2ZXMgPSBhbHRlcm5hdGl2ZXM7Ci0JCWFsdGVybmF0aXZlcyA9IG5ld0FsdGVybmF0aXZlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMsIG9sZEFsdGVybmF0aXZlcywKLQkJCQkJYWx0ZXJuYXRpdmVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXJldHVybiBnZXRQdXJwb3NlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlyZXR1cm4gZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlzZXRQdXJwb3NlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCXNldEFsdGVybmF0aXZlcygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlzZXRBbHRlcm5hdGl2ZXMoQUxURVJOQVRJVkVTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlyZXR1cm4gUFVSUE9TRV9FREVGQVVMVCA9PSBudWxsID8gcHVycG9zZSAhPSBudWxsCi0JCQkJCTogIVBVUlBPU0VfRURFRkFVTFQuZXF1YWxzKHB1cnBvc2UpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJcmV0dXJuIEFMVEVSTkFUSVZFU19FREVGQVVMVCA9PSBudWxsID8gYWx0ZXJuYXRpdmVzICE9IG51bGwKLQkJCQkJOiAhQUxURVJOQVRJVkVTX0VERUZBVUxULmVxdWFscyhhbHRlcm5hdGl2ZXMpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHB1cnBvc2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHVycG9zZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWx0ZXJuYXRpdmVzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGFsdGVybmF0aXZlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Rhc2tEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0Rlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdkNGJmNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0Rlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRUYXNrIDxlbT5UYXNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldEFzc2lzdGVkQnkgPGVtPkFzc2lzdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldEV4dGVybmFsSW5wdXQgPGVtPkV4dGVybmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldE1hbmRhdG9yeUlucHV0IDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0T3B0aW9uYWxJbnB1dCA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0U2VsZWN0ZWRTdGVwcyA8ZW0+U2VsZWN0ZWQgU3RlcHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvckltcGwgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlUYXNrRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDQxOTQxNDY2NDI3MzkxMDg2M0w7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUID0gQm9vbGVhbi5UUlVFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXNrKCkgPGVtPlRhc2s8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrIHRhc2sgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc2lzdGVkQnkoKSA8ZW0+QXNzaXN0ZWQgQnk8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzaXN0ZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFzc2lzdGVkQnkgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxJbnB1dCgpIDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbElucHV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXh0ZXJuYWxJbnB1dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYW5kYXRvcnlJbnB1dCgpIDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFuZGF0b3J5SW5wdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtYW5kYXRvcnlJbnB1dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpb25hbElucHV0KCkgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wdGlvbmFsSW5wdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBvcHRpb25hbElucHV0ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dHB1dCgpIDxlbT5PdXRwdXQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0cHV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgb3V0cHV0ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZURlc2NyaXB0b3IgcGVyZm9ybWVkUHJpbWFyaWx5QnkgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VsZWN0ZWRTdGVwcygpIDxlbT5TZWxlY3RlZCBTdGVwczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWxlY3RlZFN0ZXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VsZWN0ZWRTdGVwcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShCb29sZWFuIG5ld0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSkgewotCQlCb29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLAotCQkJCQlvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UsIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrIGdldFRhc2soKSB7Ci0JCWlmICh0YXNrICE9IG51bGwgJiYgKChFT2JqZWN0KSB0YXNrKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVGFzayA9IChJbnRlcm5hbEVPYmplY3QpIHRhc2s7Ci0JCQl0YXNrID0gKFRhc2spIGVSZXNvbHZlUHJveHkob2xkVGFzayk7Ci0JCQlpZiAodGFzayAhPSBvbGRUYXNrKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSywgb2xkVGFzaywgdGFzaykpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrIGJhc2ljR2V0VGFzaygpIHsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFzayhUYXNrIG5ld1Rhc2spIHsKLQkJVGFzayBvbGRUYXNrID0gdGFzazsKLQkJdGFzayA9IG5ld1Rhc2s7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLLCBvbGRUYXNrLCB0YXNrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCWlmIChhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA9PSBudWxsKSB7Ci0JCQlhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCVJvbGVEZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JCX0KLQkJcmV0dXJuIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFzc2lzdGVkQnkoKSB7Ci0JCWlmIChhc3Npc3RlZEJ5ID09IG51bGwpIHsKLQkJCWFzc2lzdGVkQnkgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFJvbGVEZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlkpOwotCQl9Ci0JCXJldHVybiBhc3Npc3RlZEJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4dGVybmFsSW5wdXQoKSB7Ci0JCWlmIChleHRlcm5hbElucHV0ID09IG51bGwpIHsKLQkJCWV4dGVybmFsSW5wdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KAotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVybmFsSW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWFuZGF0b3J5SW5wdXQoKSB7Ci0JCWlmIChtYW5kYXRvcnlJbnB1dCA9PSBudWxsKSB7Ci0JCQltYW5kYXRvcnlJbnB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCk7Ci0JCX0KLQkJcmV0dXJuIG1hbmRhdG9yeUlucHV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE9wdGlvbmFsSW5wdXQoKSB7Ci0JCWlmIChvcHRpb25hbElucHV0ID09IG51bGwpIHsKLQkJCW9wdGlvbmFsSW5wdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KAotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVCk7Ci0JCX0KLQkJcmV0dXJuIG9wdGlvbmFsSW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0T3V0cHV0KCkgewotCQlpZiAob3V0cHV0ID09IG51bGwpIHsKLQkJCW91dHB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUKTsKLQkJfQotCQlyZXR1cm4gb3V0cHV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvciBnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpIHsKLQkJaWYgKHBlcmZvcm1lZFByaW1hcmlseUJ5ICE9IG51bGwKLQkJCQkmJiAoKEVPYmplY3QpIHBlcmZvcm1lZFByaW1hcmlseUJ5KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUGVyZm9ybWVkUHJpbWFyaWx5QnkgPSAoSW50ZXJuYWxFT2JqZWN0KSBwZXJmb3JtZWRQcmltYXJpbHlCeTsKLQkJCXBlcmZvcm1lZFByaW1hcmlseUJ5ID0gKFJvbGVEZXNjcmlwdG9yKSBlUmVzb2x2ZVByb3h5KG9sZFBlcmZvcm1lZFByaW1hcmlseUJ5KTsKLQkJCWlmIChwZXJmb3JtZWRQcmltYXJpbHlCeSAhPSBvbGRQZXJmb3JtZWRQcmltYXJpbHlCeSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlksCi0JCQkJCQkJb2xkUGVyZm9ybWVkUHJpbWFyaWx5QnksIHBlcmZvcm1lZFByaW1hcmlseUJ5KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZFByaW1hcmlseUJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvciBiYXNpY0dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkgewotCQlyZXR1cm4gcGVyZm9ybWVkUHJpbWFyaWx5Qnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoUm9sZURlc2NyaXB0b3IgbmV3UGVyZm9ybWVkUHJpbWFyaWx5QnkpIHsKLQkJUm9sZURlc2NyaXB0b3Igb2xkUGVyZm9ybWVkUHJpbWFyaWx5QnkgPSBwZXJmb3JtZWRQcmltYXJpbHlCeTsKLQkJcGVyZm9ybWVkUHJpbWFyaWx5QnkgPSBuZXdQZXJmb3JtZWRQcmltYXJpbHlCeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlksCi0JCQkJCW9sZFBlcmZvcm1lZFByaW1hcmlseUJ5LCBwZXJmb3JtZWRQcmltYXJpbHlCeSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGVkU3RlcHMoKSB7Ci0JCWlmIChzZWxlY3RlZFN0ZXBzID09IG51bGwpIHsKLQkJCXNlbGVjdGVkU3RlcHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFNlY3Rpb24uY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TRUxFQ1RFRF9TVEVQUyk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkU3RlcHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlyZXR1cm4gZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0VGFzaygpOwotCQkJcmV0dXJuIGJhc2ljR2V0VGFzaygpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJcmV0dXJuIGdldEFzc2lzdGVkQnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQlyZXR1cm4gZ2V0RXh0ZXJuYWxJbnB1dCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQlyZXR1cm4gZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQlyZXR1cm4gZ2V0T3B0aW9uYWxJbnB1dCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQlyZXR1cm4gZ2V0T3V0cHV0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJCXJldHVybiBiYXNpY0dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTOgotCQkJcmV0dXJuIGdldFNlbGVjdGVkU3RlcHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCXNldFRhc2soKFRhc2spIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJZ2V0QXNzaXN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQlnZXRBc3Npc3RlZEJ5KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQkJZ2V0RXh0ZXJuYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQlnZXRFeHRlcm5hbElucHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCWdldE1hbmRhdG9yeUlucHV0KCkuY2xlYXIoKTsKLQkJCWdldE1hbmRhdG9yeUlucHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQlnZXRPcHRpb25hbElucHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCWdldE91dHB1dCgpLmNsZWFyKCk7Ci0JCQlnZXRPdXRwdXQoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCXNldFBlcmZvcm1lZFByaW1hcmlseUJ5KChSb2xlRGVzY3JpcHRvcikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TRUxFQ1RFRF9TVEVQUzoKLQkJCWdldFNlbGVjdGVkU3RlcHMoKS5jbGVhcigpOwotCQkJZ2V0U2VsZWN0ZWRTdGVwcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQlzZXRUYXNrKChUYXNrKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQlnZXRBc3Npc3RlZEJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQlnZXRFeHRlcm5hbElucHV0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkJc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKFJvbGVEZXNjcmlwdG9yKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU0VMRUNURURfU1RFUFM6Ci0JCQlnZXRTZWxlY3RlZFN0ZXBzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJcmV0dXJuIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCA9PSBudWxsID8gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlICE9IG51bGwKLQkJCQkJOiAhSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJcmV0dXJuIHRhc2sgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCXJldHVybiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSAhPSBudWxsCi0JCQkJCSYmICFhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJcmV0dXJuIGFzc2lzdGVkQnkgIT0gbnVsbCAmJiAhYXNzaXN0ZWRCeS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQkJcmV0dXJuIGV4dGVybmFsSW5wdXQgIT0gbnVsbCAmJiAhZXh0ZXJuYWxJbnB1dC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCXJldHVybiBtYW5kYXRvcnlJbnB1dCAhPSBudWxsICYmICFtYW5kYXRvcnlJbnB1dC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJcmV0dXJuIG9wdGlvbmFsSW5wdXQgIT0gbnVsbCAmJiAhb3B0aW9uYWxJbnB1dC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCXJldHVybiBvdXRwdXQgIT0gbnVsbCAmJiAhb3V0cHV0LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCXJldHVybiBwZXJmb3JtZWRQcmltYXJpbHlCeSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TRUxFQ1RFRF9TVEVQUzoKLQkJCXJldHVybiBzZWxlY3RlZFN0ZXBzICE9IG51bGwgJiYgIXNlbGVjdGVkU3RlcHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gRGVzY3JpcHRvci5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBEZXNjcmlwdG9yLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gQmVnaW4gb2YgY3VzdG9tIGNvZGUgCi0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3QjZ2V0RmVhdHVyZXNXaXRoT3ZlcnJpZGVuRGVmYXVsVmFsdWUoKQotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldEZlYXR1cmVzV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmVzV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3QjZ2V0RGVmYXVsdFZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZSkpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfUExBTk5FRDoKLQkJCXJldHVybiBJU19QTEFOTkVEX0RFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBmZWF0dXJlc1dpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUgPSBDb2xsZWN0aW9ucwotCQkJLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19QTEFOTkVEX0RFRkFVTFQgPSBCb29sZWFuLkZBTFNFOwotCi19IC8vVGFza0Rlc2NyaXB0b3JJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWU3OGRiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0UGVyZm9ybWVkQnkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldE1hbmRhdG9yeUlucHV0IDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0T3B0aW9uYWxJbnB1dCA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRTdGVwcyA8ZW0+U3RlcHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRUb29sTWVudG9ycyA8ZW0+VG9vbCBNZW50b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0ltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBUYXNrIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcHJlY29uZGl0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcG9zdGNvbmRpdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJmb3JtZWRCeSgpIDxlbT5QZXJmb3JtZWQgQnk8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmZvcm1lZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZSBwZXJmb3JtZWRCeSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYW5kYXRvcnlJbnB1dCgpIDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFuZGF0b3J5SW5wdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtYW5kYXRvcnlJbnB1dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRwdXQoKSA8ZW0+T3V0cHV0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dHB1dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG91dHB1dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3B0aW9uYWxJbnB1dCgpIDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcHRpb25hbElucHV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgb3B0aW9uYWxJbnB1dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb29sTWVudG9ycygpIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9vbE1lbnRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0b29sTWVudG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFByZWNvbmRpdGlvbigpIHsKLQkJaWYgKHByZWNvbmRpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlY29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJcHJlY29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUHJlY29uZGl0aW9uKTsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gb2xkUHJlY29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1ByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUHJlY29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBudWxsKTsKLQkJCQlpZiAobmV3UHJlY29uZGl0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1ByZWNvbmRpdGlvbgotCQkJCQkJCS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sIG9sZFByZWNvbmRpdGlvbiwKLQkJCQkJCQlwcmVjb25kaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQcmVjb25kaXRpb24gPSBwcmVjb25kaXRpb247Ci0JCXByZWNvbmRpdGlvbiA9IG5ld1ByZWNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sCi0JCQkJCW9sZFByZWNvbmRpdGlvbiwgbmV3UHJlY29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbikgewotCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IHByZWNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1ByZWNvbmRpdGlvbikuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlY29uZGl0aW9uKG5ld1ByZWNvbmRpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OLCBuZXdQcmVjb25kaXRpb24sCi0JCQkJCW5ld1ByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQlwb3N0Y29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBvbGRQb3N0Y29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Bvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQb3N0Y29uZGl0aW9uCi0JCQkJCQkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTiwgbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UG9zdGNvbmRpdGlvbi5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJCS0gVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBudWxsLAotCQkJCQkJCW1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sIG9sZFBvc3Rjb25kaXRpb24sCi0JCQkJCQkJcG9zdGNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUG9zdGNvbmRpdGlvbiA9IHBvc3Rjb25kaXRpb247Ci0JCXBvc3Rjb25kaXRpb24gPSBuZXdQb3N0Y29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sCi0JCQkJCW9sZFBvc3Rjb25kaXRpb24sIG5ld1Bvc3Rjb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gcG9zdGNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbikKLQkJCQkJCS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQb3N0Y29uZGl0aW9uKQotCQkJCQkJLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdGNvbmRpdGlvbihuZXdQb3N0Y29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBuZXdQb3N0Y29uZGl0aW9uLAotCQkJCQluZXdQb3N0Y29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGUgZ2V0UGVyZm9ybWVkQnkoKSB7Ci0JCWlmIChwZXJmb3JtZWRCeSAhPSBudWxsICYmICgoRU9iamVjdCkgcGVyZm9ybWVkQnkpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQZXJmb3JtZWRCeSA9IChJbnRlcm5hbEVPYmplY3QpIHBlcmZvcm1lZEJ5OwotCQkJcGVyZm9ybWVkQnkgPSAoUm9sZSkgZVJlc29sdmVQcm94eShvbGRQZXJmb3JtZWRCeSk7Ci0JCQlpZiAocGVyZm9ybWVkQnkgIT0gb2xkUGVyZm9ybWVkQnkpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZLCBvbGRQZXJmb3JtZWRCeSwKLQkJCQkJCQlwZXJmb3JtZWRCeSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwZXJmb3JtZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZSBiYXNpY0dldFBlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gcGVyZm9ybWVkQnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyZm9ybWVkQnkoUm9sZSBuZXdQZXJmb3JtZWRCeSkgewotCQlSb2xlIG9sZFBlcmZvcm1lZEJ5ID0gcGVyZm9ybWVkQnk7Ci0JCXBlcmZvcm1lZEJ5ID0gbmV3UGVyZm9ybWVkQnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZLCBvbGRQZXJmb3JtZWRCeSwgcGVyZm9ybWVkQnkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNYW5kYXRvcnlJbnB1dCgpIHsKLQkJaWYgKG1hbmRhdG9yeUlucHV0ID09IG51bGwpIHsKLQkJCW1hbmRhdG9yeUlucHV0ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChXb3JrUHJvZHVjdC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQpOwotCQl9Ci0JCXJldHVybiBtYW5kYXRvcnlJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRPdXRwdXQoKSB7Ci0JCWlmIChvdXRwdXQgPT0gbnVsbCkgewotCQkJb3V0cHV0ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChXb3JrUHJvZHVjdC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19PVVRQVVQpOwotCQl9Ci0JCXJldHVybiBvdXRwdXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCWlmIChhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA9PSBudWxsKSB7Ci0JCQlhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoUm9sZS5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQkJfQotCQlyZXR1cm4gYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0T3B0aW9uYWxJbnB1dCgpIHsKLQkJaWYgKG9wdGlvbmFsSW5wdXQgPT0gbnVsbCkgewotCQkJb3B0aW9uYWxJbnB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQpOwotCQl9Ci0JCXJldHVybiBvcHRpb25hbElucHV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U3RlcHMoKSB7Ci0JCXJldHVybiBnZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFRvb2xNZW50b3JzKCkgewotCQlpZiAodG9vbE1lbnRvcnMgPT0gbnVsbCkgewotCQkJdG9vbE1lbnRvcnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFRvb2xNZW50b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1JTKTsKLQkJfQotCQlyZXR1cm4gdG9vbE1lbnRvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlpZiAoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID09IG51bGwpIHsKLQkJCWVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQlyZXR1cm4gYmFzaWNTZXRQcmVjb25kaXRpb24obnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZWNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJlY29uZGl0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFBvc3Rjb25kaXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFBvc3Rjb25kaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQZXJmb3JtZWRCeSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0UGVyZm9ybWVkQnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCXJldHVybiBnZXRNYW5kYXRvcnlJbnB1dCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1VUUFVUOgotCQkJcmV0dXJuIGdldE91dHB1dCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCXJldHVybiBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQlyZXR1cm4gZ2V0T3B0aW9uYWxJbnB1dCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fU1RFUFM6Ci0JCQlyZXR1cm4gZ2V0U3RlcHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1RPT0xfTUVOVE9SUzoKLQkJCXJldHVybiBnZXRUb29sTWVudG9ycygpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJc2V0UGVyZm9ybWVkQnkoKFJvbGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCWdldE1hbmRhdG9yeUlucHV0KCkuY2xlYXIoKTsKLQkJCWdldE1hbmRhdG9yeUlucHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJZ2V0T3V0cHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5jbGVhcigpOwotCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQlnZXRPcHRpb25hbElucHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUlM6Ci0JCQlnZXRUb29sTWVudG9ycygpLmNsZWFyKCk7Ci0JCQlnZXRUb29sTWVudG9ycygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQlzZXRQcmVjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJc2V0UGVyZm9ybWVkQnkoKFJvbGUpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fTUFOREFUT1JZX0lOUFVUOgotCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1VUUFVUOgotCQkJZ2V0T3V0cHV0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PUFRJT05BTF9JTlBVVDoKLQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQlyZXR1cm4gcHJlY29uZGl0aW9uICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJcmV0dXJuIHBvc3Rjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCXJldHVybiBwZXJmb3JtZWRCeSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fTUFOREFUT1JZX0lOUFVUOgotCQkJcmV0dXJuIG1hbmRhdG9yeUlucHV0ICE9IG51bGwgJiYgIW1hbmRhdG9yeUlucHV0LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCXJldHVybiBvdXRwdXQgIT0gbnVsbCAmJiAhb3V0cHV0LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQlyZXR1cm4gYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgIT0gbnVsbAotCQkJCQkmJiAhYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQlyZXR1cm4gb3B0aW9uYWxJbnB1dCAhPSBudWxsICYmICFvcHRpb25hbElucHV0LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1NURVBTOgotCQkJcmV0dXJuICFnZXRTdGVwcygpLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1RPT0xfTUVOVE9SUzoKLQkJCXJldHVybiB0b29sTWVudG9ycyAhPSBudWxsICYmICF0b29sTWVudG9ycy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyAhPSBudWxsCi0JCQkJCSYmICFlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLX0gLy9UYXNrSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGVhbVByb2ZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZWFtUHJvZmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTVlMmQ2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZWFtUHJvZmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlYW0gUHJvZmlsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCNnZXRUZWFtUm9sZXMgPGVtPlRlYW0gUm9sZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0U3VwZXJUZWFtIDxlbT5TdXBlciBUZWFtPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsI2dldFN1YlRlYW0gPGVtPlN1YiBUZWFtPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGVhbVByb2ZpbGVJbXBsIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlUZWFtUHJvZmlsZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZWFtUm9sZXMoKSA8ZW0+VGVhbSBSb2xlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUZWFtUm9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0ZWFtUm9sZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VwZXJUZWFtKCkgPGVtPlN1cGVyIFRlYW08L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cGVyVGVhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRlYW1Qcm9maWxlIHN1cGVyVGVhbSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJUZWFtKCkgPGVtPlN1YiBUZWFtPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YlRlYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzdWJUZWFtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZWFtUHJvZmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFQU1fUFJPRklMRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUZWFtUm9sZXMoKSB7Ci0JCWlmICh0ZWFtUm9sZXMgPT0gbnVsbCkgewotCQkJdGVhbVJvbGVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChSb2xlRGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1RFQU1fUk9MRVMpOwotCQl9Ci0JCXJldHVybiB0ZWFtUm9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlYW1Qcm9maWxlIGdldFN1cGVyVGVhbSgpIHsKLQkJaWYgKHN1cGVyVGVhbSAhPSBudWxsICYmICgoRU9iamVjdCkgc3VwZXJUZWFtKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU3VwZXJUZWFtID0gKEludGVybmFsRU9iamVjdCkgc3VwZXJUZWFtOwotCQkJc3VwZXJUZWFtID0gKFRlYW1Qcm9maWxlKSBlUmVzb2x2ZVByb3h5KG9sZFN1cGVyVGVhbSk7Ci0JCQlpZiAoc3VwZXJUZWFtICE9IG9sZFN1cGVyVGVhbSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0sIG9sZFN1cGVyVGVhbSwKLQkJCQkJCQlzdXBlclRlYW0pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXJUZWFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZSBiYXNpY0dldFN1cGVyVGVhbSgpIHsKLQkJcmV0dXJuIHN1cGVyVGVhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdXBlclRlYW0oVGVhbVByb2ZpbGUgbmV3U3VwZXJUZWFtLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlUZWFtUHJvZmlsZSBvbGRTdXBlclRlYW0gPSBzdXBlclRlYW07Ci0JCXN1cGVyVGVhbSA9IG5ld1N1cGVyVGVhbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0sCi0JCQkJCW9sZFN1cGVyVGVhbSwgbmV3U3VwZXJUZWFtKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cGVyVGVhbShUZWFtUHJvZmlsZSBuZXdTdXBlclRlYW0pIHsKLQkJaWYgKG5ld1N1cGVyVGVhbSAhPSBzdXBlclRlYW0pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHN1cGVyVGVhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc3VwZXJUZWFtKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNLCBUZWFtUHJvZmlsZS5jbGFzcywKLQkJCQkJCW1zZ3MpOwotCQkJaWYgKG5ld1N1cGVyVGVhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3U3VwZXJUZWFtKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNLCBUZWFtUHJvZmlsZS5jbGFzcywKLQkJCQkJCW1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U3VwZXJUZWFtKG5ld1N1cGVyVGVhbSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNLCBuZXdTdXBlclRlYW0sCi0JCQkJCW5ld1N1cGVyVGVhbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN1YlRlYW0oKSB7Ci0JCWlmIChzdWJUZWFtID09IG51bGwpIHsKLQkJCXN1YlRlYW0gPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QoVGVhbVByb2ZpbGUuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTSwKLQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0pOwotCQl9Ci0JCXJldHVybiBzdWJUZWFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU06Ci0JCQlpZiAoc3VwZXJUZWFtICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBzdXBlclRlYW0pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU0sIFRlYW1Qcm9maWxlLmNsYXNzLAotCQkJCQkJbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRTdXBlclRlYW0oKFRlYW1Qcm9maWxlKSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0U3ViVGVhbSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU06Ci0JCQlyZXR1cm4gYmFzaWNTZXRTdXBlclRlYW0obnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0U3ViVGVhbSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUzoKLQkJCXJldHVybiBnZXRUZWFtUm9sZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRTdXBlclRlYW0oKTsKLQkJCXJldHVybiBiYXNpY0dldFN1cGVyVGVhbSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCXJldHVybiBnZXRTdWJUZWFtKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUzoKLQkJCWdldFRlYW1Sb2xlcygpLmNsZWFyKCk7Ci0JCQlnZXRUZWFtUm9sZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCXNldFN1cGVyVGVhbSgoVGVhbVByb2ZpbGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQlnZXRTdWJUZWFtKCkuY2xlYXIoKTsKLQkJCWdldFN1YlRlYW0oKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1RFQU1fUk9MRVM6Ci0JCQlnZXRUZWFtUm9sZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJc2V0U3VwZXJUZWFtKChUZWFtUHJvZmlsZSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJZ2V0U3ViVGVhbSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1RFQU1fUk9MRVM6Ci0JCQlyZXR1cm4gdGVhbVJvbGVzICE9IG51bGwgJiYgIXRlYW1Sb2xlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU06Ci0JCQlyZXR1cm4gc3VwZXJUZWFtICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJcmV0dXJuIHN1YlRlYW0gIT0gbnVsbCAmJiAhc3ViVGVhbS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1RlYW1Qcm9maWxlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGVtcGxhdGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZW1wbGF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjkyYWEyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZW1wbGF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFRlbXBsYXRlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZW1wbGF0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFTVBMQVRFOwotCX0KLQotfSAvL1RlbXBsYXRlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGVybURlZmluaXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZXJtRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTE5YjZjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZXJtRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXJtIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXJtRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBUZXJtRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVybURlZmluaXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5URVJNX0RFRklOSVRJT047Ci0JfQotCi19IC8vVGVybURlZmluaXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZXh0RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjEyN2RhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXh0IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXh0RWxlbWVudEltcGwjZ2V0VGV4dCA8ZW0+VGV4dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRleHRFbGVtZW50SW1wbCBleHRlbmRzIExlYWZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRleHRFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZXh0KCkgPGVtPlRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRleHQoKSA8ZW0+VGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0ZXh0ID0gVEVYVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZXh0RWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFWFRfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJU3RyaW5nIG9sZFRleHQgPSB0ZXh0OwotCQl0ZXh0ID0gbmV3VGV4dDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQsIG9sZFRleHQsIHRleHQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQ6Ci0JCQlyZXR1cm4gZ2V0VGV4dCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQ6Ci0JCQlzZXRUZXh0KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQ6Ci0JCQlzZXRUZXh0KFRFWFRfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVYVF9FTEVNRU5UX19URVhUOgotCQkJcmV0dXJuIFRFWFRfRURFRkFVTFQgPT0gbnVsbCA/IHRleHQgIT0gbnVsbCA6ICFURVhUX0VERUZBVUxUCi0JCQkJCS5lcXVhbHModGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGV4dDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0ZXh0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGV4dEVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Ub29sSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVG9vbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjYzNGMwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Ub29sSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ub29sPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbEltcGwjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRvb2xJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIFRvb2wgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9vbE1lbnRvcnMoKSA8ZW0+VG9vbCBNZW50b3JzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvb2xNZW50b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdG9vbE1lbnRvcnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRvb2xJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UT09MOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFRvb2xNZW50b3JzKCkgewotCQlpZiAodG9vbE1lbnRvcnMgPT0gbnVsbCkgewotCQkJdG9vbE1lbnRvcnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFRvb2xNZW50b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1JTKTsKLQkJfQotCQlyZXR1cm4gdG9vbE1lbnRvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1JTOgotCQkJcmV0dXJuIGdldFRvb2xNZW50b3JzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX1RPT0xfTUVOVE9SUzoKLQkJCWdldFRvb2xNZW50b3JzKCkuY2xlYXIoKTsKLQkJCWdldFRvb2xNZW50b3JzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1JTOgotCQkJcmV0dXJuIHRvb2xNZW50b3JzICE9IG51bGwgJiYgIXRvb2xNZW50b3JzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vVG9vbEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xNZW50b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Ub29sTWVudG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZTgwZDg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xNZW50b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRvb2xNZW50b3JJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgVG9vbE1lbnRvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVG9vbE1lbnRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRPT0xfTUVOVE9SOwotCX0KLQotfSAvL1Rvb2xNZW50b3JJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UcmFuc2l0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVHJhbnNpdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWEzZWQ0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UcmFuc2l0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVHJhbnNpdGlvbkltcGwuamF2YSx2IDEuNSAyMDA2LzA5LzA3IDAwOjA2OjIwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHJhbnNpdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRyYW5zaXRpb25JbXBsI2dldFdvcmtEZWZpbml0aW9uIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UcmFuc2l0aW9uSW1wbCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UcmFuc2l0aW9uSW1wbCNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRyYW5zaXRpb25JbXBsI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNpdGlvbkltcGwgZXh0ZW5kcyBNdWx0aVJlc291cmNlRU9iamVjdCBpbXBsZW1lbnRzIFRyYW5zaXRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya0RlZmluaXRpb24oKSA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtEZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgd29ya0RlZmluaXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlKCkgPGVtPlNvdXJjZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmVydGV4IHNvdXJjZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXQoKSA8ZW0+VGFyZ2V0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXJnZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWZXJ0ZXggdGFyZ2V0ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUcmFuc2l0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVFJBTlNJVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXb3JrRGVmaW5pdGlvbigpIHsKLQkJaWYgKHdvcmtEZWZpbml0aW9uID09IG51bGwpIHsKLQkJCXdvcmtEZWZpbml0aW9uID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChXb3JrRGVmaW5pdGlvbi5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5UUkFOU0lUSU9OX19XT1JLX0RFRklOSVRJT04pOwotCQl9Ci0JCXJldHVybiB3b3JrRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVnaW9uIGdldENvbnRhaW5lcl8oKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fQ09OVEFJTkVSKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoUmVnaW9uKSBlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlZ2lvbiBiYXNpY0dldENvbnRhaW5lcigpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5UUkFOU0lUSU9OX19DT05UQUlORVIpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChSZWdpb24pIGVJbnRlcm5hbENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbnRhaW5lcihSZWdpb24gbmV3Q29udGFpbmVyLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0NvbnRhaW5lciwKLQkJCQlVbWFQYWNrYWdlLlRSQU5TSVRJT05fX0NPTlRBSU5FUiwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihSZWdpb24gbmV3Q29udGFpbmVyKSB7Ci0JCWlmIChuZXdDb250YWluZXIgIT0gZUludGVybmFsQ29udGFpbmVyKCkKLQkJCQl8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX0NPTlRBSU5FUiAmJiBuZXdDb250YWluZXIgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCAoRU9iamVjdCkgbmV3Q29udGFpbmVyKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0NvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGFpbmVyKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5SRUdJT05fX1RSQU5TSVRJT04sIFJlZ2lvbi5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb250YWluZXIobmV3Q29udGFpbmVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UUkFOU0lUSU9OX19DT05UQUlORVIsIG5ld0NvbnRhaW5lciwKLQkJCQkJbmV3Q29udGFpbmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZlcnRleCBnZXRTb3VyY2UoKSB7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHNvdXJjZSkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNvdXJjZSA9IChJbnRlcm5hbEVPYmplY3QpIHNvdXJjZTsKLQkJCXNvdXJjZSA9IChWZXJ0ZXgpIGVSZXNvbHZlUHJveHkob2xkU291cmNlKTsKLQkJCWlmIChzb3VyY2UgIT0gb2xkU291cmNlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1NPVVJDRSwgb2xkU291cmNlLCBzb3VyY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWZXJ0ZXggYmFzaWNHZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U291cmNlKFZlcnRleCBuZXdTb3VyY2UsCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVZlcnRleCBvbGRTb3VyY2UgPSBzb3VyY2U7Ci0JCXNvdXJjZSA9IG5ld1NvdXJjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UUkFOU0lUSU9OX19TT1VSQ0UsIG9sZFNvdXJjZSwKLQkJCQkJbmV3U291cmNlKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShWZXJ0ZXggbmV3U291cmNlKSB7Ci0JCWlmIChuZXdTb3VyY2UgIT0gc291cmNlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHNvdXJjZSkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuVkVSVEVYX19PVVRHT0lORywgVmVydGV4LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdTb3VyY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1NvdXJjZSkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuVkVSVEVYX19PVVRHT0lORywgVmVydGV4LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNvdXJjZShuZXdTb3VyY2UsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1NPVVJDRSwgbmV3U291cmNlLCBuZXdTb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmVydGV4IGdldFRhcmdldCgpIHsKLQkJaWYgKHRhcmdldCAhPSBudWxsICYmICgoRU9iamVjdCkgdGFyZ2V0KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVGFyZ2V0ID0gKEludGVybmFsRU9iamVjdCkgdGFyZ2V0OwotCQkJdGFyZ2V0ID0gKFZlcnRleCkgZVJlc29sdmVQcm94eShvbGRUYXJnZXQpOwotCQkJaWYgKHRhcmdldCAhPSBvbGRUYXJnZXQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuVFJBTlNJVElPTl9fVEFSR0VULCBvbGRUYXJnZXQsIHRhcmdldCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZlcnRleCBiYXNpY0dldFRhcmdldCgpIHsKLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUYXJnZXQoVmVydGV4IG5ld1RhcmdldCwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJVmVydGV4IG9sZFRhcmdldCA9IHRhcmdldDsKLQkJdGFyZ2V0ID0gbmV3VGFyZ2V0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1RBUkdFVCwgb2xkVGFyZ2V0LAotCQkJCQluZXdUYXJnZXQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0KFZlcnRleCBuZXdUYXJnZXQpIHsKLQkJaWYgKG5ld1RhcmdldCAhPSB0YXJnZXQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHRhcmdldCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgdGFyZ2V0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5WRVJURVhfX0lOQ09NSU5HLCBWZXJ0ZXguY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1RhcmdldCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3VGFyZ2V0KS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5WRVJURVhfX0lOQ09NSU5HLCBWZXJ0ZXguY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VGFyZ2V0KG5ld1RhcmdldCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVFJBTlNJVElPTl9fVEFSR0VULCBuZXdUYXJnZXQsIG5ld1RhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UUkFOU0lUSU9OX19DT05UQUlORVI6Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldENvbnRhaW5lcigoUmVnaW9uKSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UUkFOU0lUSU9OX19TT1VSQ0U6Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBzb3VyY2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlZFUlRFWF9fT1VUR09JTkcsIFZlcnRleC5jbGFzcywgbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRTb3VyY2UoKFZlcnRleCkgb3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fVEFSR0VUOgotCQkJaWYgKHRhcmdldCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgdGFyZ2V0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5WRVJURVhfX0lOQ09NSU5HLCBWZXJ0ZXguY2xhc3MsIG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0VGFyZ2V0KChWZXJ0ZXgpIG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX0NPTlRBSU5FUjoKLQkJCXJldHVybiBiYXNpY1NldENvbnRhaW5lcihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1NPVVJDRToKLQkJCXJldHVybiBiYXNpY1NldFNvdXJjZShudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1RBUkdFVDoKLQkJCXJldHVybiBiYXNpY1NldFRhcmdldChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX0NPTlRBSU5FUjoKLQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlJFR0lPTl9fVFJBTlNJVElPTiwgUmVnaW9uLmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fV09SS19ERUZJTklUSU9OOgotCQkJcmV0dXJuIGdldFdvcmtEZWZpbml0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UUkFOU0lUSU9OX19DT05UQUlORVI6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyXygpOwotCQkJcmV0dXJuIGJhc2ljR2V0Q29udGFpbmVyKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UUkFOU0lUSU9OX19TT1VSQ0U6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRTb3VyY2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1RBUkdFVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRUYXJnZXQoKTsKLQkJCXJldHVybiBiYXNpY0dldFRhcmdldCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UUkFOU0lUSU9OX19XT1JLX0RFRklOSVRJT046Ci0JCQlnZXRXb3JrRGVmaW5pdGlvbigpLmNsZWFyKCk7Ci0JCQlnZXRXb3JrRGVmaW5pdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fQ09OVEFJTkVSOgotCQkJc2V0Q29udGFpbmVyKChSZWdpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1NPVVJDRToKLQkJCXNldFNvdXJjZSgoVmVydGV4KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UUkFOU0lUSU9OX19UQVJHRVQ6Ci0JCQlzZXRUYXJnZXQoKFZlcnRleCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1dPUktfREVGSU5JVElPTjoKLQkJCWdldFdvcmtEZWZpbml0aW9uKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX0NPTlRBSU5FUjoKLQkJCXNldENvbnRhaW5lcigoUmVnaW9uKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1NPVVJDRToKLQkJCXNldFNvdXJjZSgoVmVydGV4KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1RBUkdFVDoKLQkJCXNldFRhcmdldCgoVmVydGV4KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1dPUktfREVGSU5JVElPTjoKLQkJCXJldHVybiB3b3JrRGVmaW5pdGlvbiAhPSBudWxsICYmICF3b3JrRGVmaW5pdGlvbi5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UUkFOU0lUSU9OX19DT05UQUlORVI6Ci0JCQlyZXR1cm4gYmFzaWNHZXRDb250YWluZXIoKSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fU09VUkNFOgotCQkJcmV0dXJuIHNvdXJjZSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fVEFSR0VUOgotCQkJcmV0dXJuIHRhcmdldCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9UcmFuc2l0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1R5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzM2Q3M2U0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1R5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHlwZUltcGwgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgVHlwZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRZUEU7Ci0JfQotCi19IC8vVHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1VNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YzM1N2NmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1VNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCBleHRlbmRzIFNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JCWltcGxlbWVudHMgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbGVtZW50KCkgPGVtPkVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5VTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwgJiYgKChFT2JqZWN0KSBlbGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkRWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIGVsZW1lbnQ7Ci0JCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGVSZXNvbHZlUHJveHkob2xkRWxlbWVudCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBvbGRFbGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQsCi0JCQkJCQkJb2xkRWxlbWVudCwgZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGJhc2ljR2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChNZXRob2RFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJTWV0aG9kRWxlbWVudCBvbGRFbGVtZW50ID0gZWxlbWVudDsKLQkJZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCwgb2xkRWxlbWVudCwKLQkJCQkJZWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5VTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJc2V0RWxlbWVudCgoTWV0aG9kRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQ6Ci0JCQlzZXRFbGVtZW50KChNZXRob2RFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVW1hRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1VtYUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzYmE4MGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVW1hRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qc2V1ZG9TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBzZXVkb1N0YXRlS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGVNYWNoaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgVW1hRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVW1hRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJVW1hRmFjdG9yeSB0aGVVbWFGYWN0b3J5ID0gKFVtYUZhY3RvcnkpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJCS5nZXRFRmFjdG9yeSgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIpOyAvLyROT04tTkxTLTEkIAotCQkJaWYgKHRoZVVtYUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVVbWFGYWN0b3J5OwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IFVtYUZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBBQ0tBR0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVBhY2thZ2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlQ6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNvbnN0cmFpbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlU2VjdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUm9sZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTSzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGFzaygpOwotCQljYXNlIFVtYVBhY2thZ2UuU1RFUDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlU3RlcCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1Q6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUFydGlmYWN0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRGVsaXZlcmFibGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk9VVENPTUU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU91dGNvbWUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ29udGVudFBhY2thZ2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSb2xlRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUG9pbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOSzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRGlhZ3JhbUxpbmsoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlR3JhcGhDb25uZWN0b3IoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRGltZW5zaW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJlZmVyZW5jZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFk6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVByb3BlcnR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVHcmFwaEVkZ2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU06Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURpYWdyYW0oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX05PREU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUdyYXBoTm9kZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5VTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFWFRfRUxFTUVOVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGV4dEVsZW1lbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVJbWFnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVBvbHlsaW5lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVFbGxpcHNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQWN0aXZpdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1JTEVTVE9ORToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlTWlsZXN0b25lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5JVEVSQVRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUl0ZXJhdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUEhBU0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVBoYXNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVRlYW1Qcm9maWxlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1I6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJvbGVEZXNjcmlwdG9yKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVXb3JrT3JkZXIoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEE6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVBsYW5uaW5nRGF0YSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1I6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUYXNrRGVzY3JpcHRvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNvbXBvc2l0ZVJvbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTkNFUFQ6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNvbmNlcHQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNIRUNLTElTVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ2hlY2tsaXN0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FWEFNUExFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVFeGFtcGxlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlERUxJTkU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUd1aWRlbGluZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVQT1JUOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSZXBvcnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFTVBMQVRFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUZW1wbGF0ZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX01FTlRPUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVG9vbE1lbnRvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuV0hJVEVQQVBFUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlV2hpdGVwYXBlcigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUZXJtRGVmaW5pdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVByYWN0aWNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSZXVzYWJsZUFzc2V0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEFURToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlU3RhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlZFUlRFWDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVmVydGV4KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJlZ2lvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfTUFDSElORToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlU3RhdGVNYWNoaW5lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UUkFOU0lUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUcmFuc2l0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QU0VVRE9fU1RBVEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVBzZXVkb1N0YXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEaXNjaXBsaW5lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUm9sZVNldCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEb21haW4oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVXb3JrUHJvZHVjdFR5cGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkc6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpOwotCQljYXNlIFVtYVBhY2thZ2UuVE9PTDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVG9vbCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkc6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJvbGVTZXRHcm91cGluZygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVDdXN0b21DYXRlZ29yeSgpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTUzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DQVBBQklMSVRZX1BBVFRFUk46Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9BRE1BUDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUm9hZG1hcCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlQ6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU46Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzRmFtaWx5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfVFlQRToKLQkJCXJldHVybiBjcmVhdGVXb3JrT3JkZXJUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QU0VVRE9fU1RBVEVfS0lORDoKLQkJCXJldHVybiBjcmVhdGVQc2V1ZG9TdGF0ZUtpbmRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX1RZUEU6Ci0JCQlyZXR1cm4gY3JlYXRlVmFyaWFiaWxpdHlUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5EQVRFOgotCQkJcmV0dXJuIGNyZWF0ZURhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlVSSToKLQkJCXJldHVybiBjcmVhdGVVcmlGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlVOTElNSVRFRF9OQVRVUkFMOgotCQkJcmV0dXJuIGNyZWF0ZVVubGltaXRlZE5hdHVyYWxGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUUklORzoKLQkJCXJldHVybiBjcmVhdGVTdHJpbmdGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFVDoKLQkJCXJldHVybiBjcmVhdGVTZXRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFUVVFTkNFOgotCQkJcmV0dXJuIGNyZWF0ZVNlcXVlbmNlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTlRFR0VSOgotCQkJcmV0dXJuIGNyZWF0ZUludGVnZXJGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkZMT0FUOgotCQkJcmV0dXJuIGNyZWF0ZUZsb2F0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9UWVBFOgotCQkJcmV0dXJuIGNvbnZlcnRXb3JrT3JkZXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBTRVVET19TVEFURV9LSU5EOgotCQkJcmV0dXJuIGNvbnZlcnRQc2V1ZG9TdGF0ZUtpbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfVFlQRToKLQkJCXJldHVybiBjb252ZXJ0VmFyaWFiaWxpdHlUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRBVEU6Ci0JCQlyZXR1cm4gY29udmVydERhdGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuVVJJOgotCQkJcmV0dXJuIGNvbnZlcnRVcmlUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuVU5MSU1JVEVEX05BVFVSQUw6Ci0JCQlyZXR1cm4gY29udmVydFVubGltaXRlZE5hdHVyYWxUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuU1RSSU5HOgotCQkJcmV0dXJuIGNvbnZlcnRTdHJpbmdUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VUOgotCQkJcmV0dXJuIGNvbnZlcnRTZXRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VRVUVOQ0U6Ci0JCQlyZXR1cm4gY29udmVydFNlcXVlbmNlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLklOVEVHRVI6Ci0JCQlyZXR1cm4gY29udmVydEludGVnZXJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuRkxPQVQ6Ci0JCQlyZXR1cm4gY29udmVydEZsb2F0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgY3JlYXRlUGFja2FnZSgpIHsKLQkJUGFja2FnZUltcGwgcGFja2FnZV8gPSBuZXcgUGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIHBhY2thZ2VfOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGNyZWF0ZUNvbnN0cmFpbnQoKSB7Ci0JCUNvbnN0cmFpbnRJbXBsIGNvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludEltcGwoKTsKLQkJcmV0dXJuIGNvbnN0cmFpbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwgbWV0aG9kRWxlbWVudFByb3BlcnR5ID0gbmV3IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudERlc2NyaXB0aW9uIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigpIHsKLQkJQ29udGVudERlc2NyaXB0aW9uSW1wbCBjb250ZW50RGVzY3JpcHRpb24gPSBuZXcgQ29udGVudERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oKSB7Ci0JCVNlY3Rpb25JbXBsIHNlY3Rpb24gPSBuZXcgU2VjdGlvbkltcGwoKTsKLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGUgY3JlYXRlUm9sZSgpIHsKLQkJUm9sZUltcGwgcm9sZSA9IG5ldyBSb2xlSW1wbCgpOwotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFzayBjcmVhdGVUYXNrKCkgewotCQlUYXNrSW1wbCB0YXNrID0gbmV3IFRhc2tJbXBsKCk7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdGVwIGNyZWF0ZVN0ZXAoKSB7Ci0JCVN0ZXBJbXBsIHN0ZXAgPSBuZXcgU3RlcEltcGwoKTsKLQkJcmV0dXJuIHN0ZXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCkgewotCQlBcnRpZmFjdEltcGwgYXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3RJbXBsKCk7Ci0JCXJldHVybiBhcnRpZmFjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGUgY3JlYXRlRGVsaXZlcmFibGUoKSB7Ci0JCURlbGl2ZXJhYmxlSW1wbCBkZWxpdmVyYWJsZSA9IG5ldyBEZWxpdmVyYWJsZUltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPdXRjb21lIGNyZWF0ZU91dGNvbWUoKSB7Ci0JCU91dGNvbWVJbXBsIG91dGNvbWUgPSBuZXcgT3V0Y29tZUltcGwoKTsKLQkJcmV0dXJuIG91dGNvbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRQYWNrYWdlIGNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkgewotCQlDb250ZW50UGFja2FnZUltcGwgY29udGVudFBhY2thZ2UgPSBuZXcgQ29udGVudFBhY2thZ2VJbXBsKCk7Ci0JCXJldHVybiBjb250ZW50UGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3REZXNjcmlwdGlvbiBjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uKCkgewotCQlBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCBhcnRpZmFjdERlc2NyaXB0aW9uID0gbmV3IEFydGlmYWN0RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBhcnRpZmFjdERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIHdvcmtQcm9kdWN0RGVzY3JpcHRpb24gPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbigpIHsKLQkJRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwgZGVsaXZlcmFibGVEZXNjcmlwdGlvbiA9IG5ldyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0aW9uIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpIHsKLQkJUm9sZURlc2NyaXB0aW9uSW1wbCByb2xlRGVzY3JpcHRpb24gPSBuZXcgUm9sZURlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gcm9sZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRpb24gY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCkgewotCQlUYXNrRGVzY3JpcHRpb25JbXBsIHRhc2tEZXNjcmlwdGlvbiA9IG5ldyBUYXNrRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEd1aWRhbmNlRGVzY3JpcHRpb24gY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpIHsKLQkJR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgZ3VpZGFuY2VEZXNjcmlwdGlvbiA9IG5ldyBHdWlkYW5jZURlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZ3VpZGFuY2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJhY3RpY2VEZXNjcmlwdGlvbiBjcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uKCkgewotCQlQcmFjdGljZURlc2NyaXB0aW9uSW1wbCBwcmFjdGljZURlc2NyaXB0aW9uID0gbmV3IFByYWN0aWNlRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBwcmFjdGljZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBjcmVhdGVQb2ludCgpIHsKLQkJUG9pbnRJbXBsIHBvaW50ID0gbmV3IFBvaW50SW1wbCgpOwotCQlyZXR1cm4gcG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1MaW5rIGNyZWF0ZURpYWdyYW1MaW5rKCkgewotCQlEaWFncmFtTGlua0ltcGwgZGlhZ3JhbUxpbmsgPSBuZXcgRGlhZ3JhbUxpbmtJbXBsKCk7Ci0JCXJldHVybiBkaWFncmFtTGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhDb25uZWN0b3IgY3JlYXRlR3JhcGhDb25uZWN0b3IoKSB7Ci0JCUdyYXBoQ29ubmVjdG9ySW1wbCBncmFwaENvbm5lY3RvciA9IG5ldyBHcmFwaENvbm5lY3RvckltcGwoKTsKLQkJcmV0dXJuIGdyYXBoQ29ubmVjdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaW1lbnNpb24gY3JlYXRlRGltZW5zaW9uKCkgewotCQlEaW1lbnNpb25JbXBsIGRpbWVuc2lvbiA9IG5ldyBEaW1lbnNpb25JbXBsKCk7Ci0JCXJldHVybiBkaW1lbnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlZmVyZW5jZSBjcmVhdGVSZWZlcmVuY2UoKSB7Ci0JCVJlZmVyZW5jZUltcGwgcmVmZXJlbmNlID0gbmV3IFJlZmVyZW5jZUltcGwoKTsKLQkJcmV0dXJuIHJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvcGVydHkgY3JlYXRlUHJvcGVydHkoKSB7Ci0JCVByb3BlcnR5SW1wbCBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eUltcGwoKTsKLQkJcmV0dXJuIHByb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVkZ2UgY3JlYXRlR3JhcGhFZGdlKCkgewotCQlHcmFwaEVkZ2VJbXBsIGdyYXBoRWRnZSA9IG5ldyBHcmFwaEVkZ2VJbXBsKCk7Ci0JCXJldHVybiBncmFwaEVkZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW0gY3JlYXRlRGlhZ3JhbSgpIHsKLQkJRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IG5ldyBEaWFncmFtSW1wbCgpOwotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhOb2RlIGNyZWF0ZUdyYXBoTm9kZSgpIHsKLQkJR3JhcGhOb2RlSW1wbCBncmFwaE5vZGUgPSBuZXcgR3JhcGhOb2RlSW1wbCgpOwotCQlyZXR1cm4gZ3JhcGhOb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCBjcmVhdGVTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpIHsKLQkJU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50ID0gbmV3IFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpIHsKLQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgdW1hU2VtYW50aWNNb2RlbEJyaWRnZSA9IG5ldyBVTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCgpOwotCQlyZXR1cm4gdW1hU2VtYW50aWNNb2RlbEJyaWRnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UgY3JlYXRlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKSB7Ci0JCUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZSA9IG5ldyBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwoKTsKLQkJcmV0dXJuIGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZXh0RWxlbWVudCBjcmVhdGVUZXh0RWxlbWVudCgpIHsKLQkJVGV4dEVsZW1lbnRJbXBsIHRleHRFbGVtZW50ID0gbmV3IFRleHRFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gdGV4dEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltYWdlIGNyZWF0ZUltYWdlKCkgewotCQlJbWFnZUltcGwgaW1hZ2UgPSBuZXcgSW1hZ2VJbXBsKCk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9seWxpbmUgY3JlYXRlUG9seWxpbmUoKSB7Ci0JCVBvbHlsaW5lSW1wbCBwb2x5bGluZSA9IG5ldyBQb2x5bGluZUltcGwoKTsKLQkJcmV0dXJuIHBvbHlsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbGxpcHNlIGNyZWF0ZUVsbGlwc2UoKSB7Ci0JCUVsbGlwc2VJbXBsIGVsbGlwc2UgPSBuZXcgRWxsaXBzZUltcGwoKTsKLQkJcmV0dXJuIGVsbGlwc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KCkgewotCQlBY3Rpdml0eUltcGwgYWN0aXZpdHkgPSBuZXcgQWN0aXZpdHlJbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWlsZXN0b25lIGNyZWF0ZU1pbGVzdG9uZSgpIHsKLQkJTWlsZXN0b25lSW1wbCBtaWxlc3RvbmUgPSBuZXcgTWlsZXN0b25lSW1wbCgpOwotCQlyZXR1cm4gbWlsZXN0b25lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJdGVyYXRpb24gY3JlYXRlSXRlcmF0aW9uKCkgewotCQlJdGVyYXRpb25JbXBsIGl0ZXJhdGlvbiA9IG5ldyBJdGVyYXRpb25JbXBsKCk7Ci0JCXJldHVybiBpdGVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBoYXNlIGNyZWF0ZVBoYXNlKCkgewotCQlQaGFzZUltcGwgcGhhc2UgPSBuZXcgUGhhc2VJbXBsKCk7Ci0JCXJldHVybiBwaGFzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVhbVByb2ZpbGUgY3JlYXRlVGVhbVByb2ZpbGUoKSB7Ci0JCVRlYW1Qcm9maWxlSW1wbCB0ZWFtUHJvZmlsZSA9IG5ldyBUZWFtUHJvZmlsZUltcGwoKTsKLQkJcmV0dXJuIHRlYW1Qcm9maWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvciBjcmVhdGVSb2xlRGVzY3JpcHRvcigpIHsKLQkJUm9sZURlc2NyaXB0b3JJbXBsIHJvbGVEZXNjcmlwdG9yID0gbmV3IFJvbGVEZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gcm9sZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtPcmRlciBjcmVhdGVXb3JrT3JkZXIoKSB7Ci0JCVdvcmtPcmRlckltcGwgd29ya09yZGVyID0gbmV3IFdvcmtPcmRlckltcGwoKTsKLQkJcmV0dXJuIHdvcmtPcmRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGxhbm5pbmdEYXRhIGNyZWF0ZVBsYW5uaW5nRGF0YSgpIHsKLQkJUGxhbm5pbmdEYXRhSW1wbCBwbGFubmluZ0RhdGEgPSBuZXcgUGxhbm5pbmdEYXRhSW1wbCgpOwotCQlyZXR1cm4gcGxhbm5pbmdEYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRvciBjcmVhdGVUYXNrRGVzY3JpcHRvcigpIHsKLQkJVGFza0Rlc2NyaXB0b3JJbXBsIHRhc2tEZXNjcmlwdG9yID0gbmV3IFRhc2tEZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgd29ya1Byb2R1Y3REZXNjcmlwdG9yID0gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlUm9sZSBjcmVhdGVDb21wb3NpdGVSb2xlKCkgewotCQlDb21wb3NpdGVSb2xlSW1wbCBjb21wb3NpdGVSb2xlID0gbmV3IENvbXBvc2l0ZVJvbGVJbXBsKCk7Ci0JCXJldHVybiBjb21wb3NpdGVSb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkgewotCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiA9IG5ldyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGVzY3JpcHRpb24gY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbigpIHsKLQkJQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwgYWN0aXZpdHlEZXNjcmlwdGlvbiA9IG5ldyBBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gYWN0aXZpdHlEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiA9IG5ldyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzRGVzY3JpcHRpb24gY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uKCkgewotCQlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIHByb2Nlc3NEZXNjcmlwdGlvbiA9IG5ldyBQcm9jZXNzRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKSB7Ci0JCURlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgZGVzY3JpcHRvckRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uY2VwdCBjcmVhdGVDb25jZXB0KCkgewotCQlDb25jZXB0SW1wbCBjb25jZXB0ID0gbmV3IENvbmNlcHRJbXBsKCk7Ci0JCXJldHVybiBjb25jZXB0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDaGVja2xpc3QgY3JlYXRlQ2hlY2tsaXN0KCkgewotCQlDaGVja2xpc3RJbXBsIGNoZWNrbGlzdCA9IG5ldyBDaGVja2xpc3RJbXBsKCk7Ci0JCXJldHVybiBjaGVja2xpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4YW1wbGUgY3JlYXRlRXhhbXBsZSgpIHsKLQkJRXhhbXBsZUltcGwgZXhhbXBsZSA9IG5ldyBFeGFtcGxlSW1wbCgpOwotCQlyZXR1cm4gZXhhbXBsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGVsaW5lIGNyZWF0ZUd1aWRlbGluZSgpIHsKLQkJR3VpZGVsaW5lSW1wbCBndWlkZWxpbmUgPSBuZXcgR3VpZGVsaW5lSW1wbCgpOwotCQlyZXR1cm4gZ3VpZGVsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsIGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IG5ldyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsKCk7Ci0JCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlcG9ydCBjcmVhdGVSZXBvcnQoKSB7Ci0JCVJlcG9ydEltcGwgcmVwb3J0ID0gbmV3IFJlcG9ydEltcGwoKTsKLQkJcmV0dXJuIHJlcG9ydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoKSB7Ci0JCVRlbXBsYXRlSW1wbCB0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZUltcGwoKTsKLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCkgewotCQlTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsIHN1cHBvcnRpbmdNYXRlcmlhbCA9IG5ldyBTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsKCk7Ci0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRvb2xNZW50b3IgY3JlYXRlVG9vbE1lbnRvcigpIHsKLQkJVG9vbE1lbnRvckltcGwgdG9vbE1lbnRvciA9IG5ldyBUb29sTWVudG9ySW1wbCgpOwotCQlyZXR1cm4gdG9vbE1lbnRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2hpdGVwYXBlciBjcmVhdGVXaGl0ZXBhcGVyKCkgewotCQlXaGl0ZXBhcGVySW1wbCB3aGl0ZXBhcGVyID0gbmV3IFdoaXRlcGFwZXJJbXBsKCk7Ci0JCXJldHVybiB3aGl0ZXBhcGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZXJtRGVmaW5pdGlvbiBjcmVhdGVUZXJtRGVmaW5pdGlvbigpIHsKLQkJVGVybURlZmluaXRpb25JbXBsIHRlcm1EZWZpbml0aW9uID0gbmV3IFRlcm1EZWZpbml0aW9uSW1wbCgpOwotCQlyZXR1cm4gdGVybURlZmluaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByYWN0aWNlIGNyZWF0ZVByYWN0aWNlKCkgewotCQlQcmFjdGljZUltcGwgcHJhY3RpY2UgPSBuZXcgUHJhY3RpY2VJbXBsKCk7Ci0JCXJldHVybiBwcmFjdGljZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmV1c2FibGVBc3NldCBjcmVhdGVSZXVzYWJsZUFzc2V0KCkgewotCQlSZXVzYWJsZUFzc2V0SW1wbCByZXVzYWJsZUFzc2V0ID0gbmV3IFJldXNhYmxlQXNzZXRJbXBsKCk7Ci0JCXJldHVybiByZXVzYWJsZUFzc2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdGF0ZSBjcmVhdGVTdGF0ZSgpIHsKLQkJU3RhdGVJbXBsIHN0YXRlID0gbmV3IFN0YXRlSW1wbCgpOwotCQlyZXR1cm4gc3RhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZlcnRleCBjcmVhdGVWZXJ0ZXgoKSB7Ci0JCVZlcnRleEltcGwgdmVydGV4ID0gbmV3IFZlcnRleEltcGwoKTsKLQkJcmV0dXJuIHZlcnRleDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVnaW9uIGNyZWF0ZVJlZ2lvbigpIHsKLQkJUmVnaW9uSW1wbCByZWdpb24gPSBuZXcgUmVnaW9uSW1wbCgpOwotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdGF0ZU1hY2hpbmUgY3JlYXRlU3RhdGVNYWNoaW5lKCkgewotCQlTdGF0ZU1hY2hpbmVJbXBsIHN0YXRlTWFjaGluZSA9IG5ldyBTdGF0ZU1hY2hpbmVJbXBsKCk7Ci0JCXJldHVybiBzdGF0ZU1hY2hpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRyYW5zaXRpb24gY3JlYXRlVHJhbnNpdGlvbigpIHsKLQkJVHJhbnNpdGlvbkltcGwgdHJhbnNpdGlvbiA9IG5ldyBUcmFuc2l0aW9uSW1wbCgpOwotCQlyZXR1cm4gdHJhbnNpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHNldWRvU3RhdGUgY3JlYXRlUHNldWRvU3RhdGUoKSB7Ci0JCVBzZXVkb1N0YXRlSW1wbCBwc2V1ZG9TdGF0ZSA9IG5ldyBQc2V1ZG9TdGF0ZUltcGwoKTsKLQkJcmV0dXJuIHBzZXVkb1N0YXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lIGNyZWF0ZURpc2NpcGxpbmUoKSB7Ci0JCURpc2NpcGxpbmVJbXBsIGRpc2NpcGxpbmUgPSBuZXcgRGlzY2lwbGluZUltcGwoKTsKLQkJcmV0dXJuIGRpc2NpcGxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVTZXQgY3JlYXRlUm9sZVNldCgpIHsKLQkJUm9sZVNldEltcGwgcm9sZVNldCA9IG5ldyBSb2xlU2V0SW1wbCgpOwotCQlyZXR1cm4gcm9sZVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG9tYWluIGNyZWF0ZURvbWFpbigpIHsKLQkJRG9tYWluSW1wbCBkb21haW4gPSBuZXcgRG9tYWluSW1wbCgpOwotCQlyZXR1cm4gZG9tYWluOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGUgY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCkgewotCQlXb3JrUHJvZHVjdFR5cGVJbXBsIHdvcmtQcm9kdWN0VHlwZSA9IG5ldyBXb3JrUHJvZHVjdFR5cGVJbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZyBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKSB7Ci0JCURpc2NpcGxpbmVHcm91cGluZ0ltcGwgZGlzY2lwbGluZUdyb3VwaW5nID0gbmV3IERpc2NpcGxpbmVHcm91cGluZ0ltcGwoKTsKLQkJcmV0dXJuIGRpc2NpcGxpbmVHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVG9vbCBjcmVhdGVUb29sKCkgewotCQlUb29sSW1wbCB0b29sID0gbmV3IFRvb2xJbXBsKCk7Ci0JCXJldHVybiB0b29sOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlU2V0R3JvdXBpbmcgY3JlYXRlUm9sZVNldEdyb3VwaW5nKCkgewotCQlSb2xlU2V0R3JvdXBpbmdJbXBsIHJvbGVTZXRHcm91cGluZyA9IG5ldyBSb2xlU2V0R3JvdXBpbmdJbXBsKCk7Ci0JCXJldHVybiByb2xlU2V0R3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5IGNyZWF0ZUN1c3RvbUNhdGVnb3J5KCkgewotCQlDdXN0b21DYXRlZ29yeUltcGwgY3VzdG9tQ2F0ZWdvcnkgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlJbXBsKCk7Ci0JCXJldHVybiBjdXN0b21DYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzIGNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpIHsKLQkJRGVsaXZlcnlQcm9jZXNzSW1wbCBkZWxpdmVyeVByb2Nlc3MgPSBuZXcgRGVsaXZlcnlQcm9jZXNzSW1wbCgpOwotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYXBhYmlsaXR5UGF0dGVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpIHsKLQkJQ2FwYWJpbGl0eVBhdHRlcm5JbXBsIGNhcGFiaWxpdHlQYXR0ZXJuID0gbmV3IENhcGFiaWxpdHlQYXR0ZXJuSW1wbCgpOwotCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkgewotCQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwgcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgPSBuZXcgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9hZG1hcCBjcmVhdGVSb2FkbWFwKCkgewotCQlSb2FkbWFwSW1wbCByb2FkbWFwID0gbmV3IFJvYWRtYXBJbXBsKCk7Ci0JCXJldHVybiByb2FkbWFwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50IGNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKSB7Ci0JCVByb2Nlc3NDb21wb25lbnRJbXBsIHByb2Nlc3NDb21wb25lbnQgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlIGNyZWF0ZVByb2Nlc3NQYWNrYWdlKCkgewotCQlQcm9jZXNzUGFja2FnZUltcGwgcHJvY2Vzc1BhY2thZ2UgPSBuZXcgUHJvY2Vzc1BhY2thZ2VJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBjcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkgewotCQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlID0gbmV3IFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsIHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yID0gbmV3IFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbiBjcmVhdGVNZXRob2RQbHVnaW4oKSB7Ci0JCU1ldGhvZFBsdWdpbkltcGwgbWV0aG9kUGx1Z2luID0gbmV3IE1ldGhvZFBsdWdpbkltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZFBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uSW1wbCBtZXRob2RDb25maWd1cmF0aW9uID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsKCk7Ci0JCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzRmFtaWx5IGNyZWF0ZVByb2Nlc3NGYW1pbHkoKSB7Ci0JCVByb2Nlc3NGYW1pbHlJbXBsIHByb2Nlc3NGYW1pbHkgPSBuZXcgUHJvY2Vzc0ZhbWlseUltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NGYW1pbHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgY3JlYXRlTWV0aG9kTGlicmFyeSgpIHsKLQkJTWV0aG9kTGlicmFyeUltcGwgbWV0aG9kTGlicmFyeSA9IG5ldyBNZXRob2RMaWJyYXJ5SW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kTGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyVHlwZSBjcmVhdGVXb3JrT3JkZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlXb3JrT3JkZXJUeXBlIHJlc3VsdCA9IFdvcmtPcmRlclR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya09yZGVyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHNldWRvU3RhdGVLaW5kIGNyZWF0ZVBzZXVkb1N0YXRlS2luZEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJUHNldWRvU3RhdGVLaW5kIHJlc3VsdCA9IFBzZXVkb1N0YXRlS2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQc2V1ZG9TdGF0ZUtpbmRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5VHlwZSBjcmVhdGVWYXJpYWJpbGl0eVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSByZXN1bHQgPSBWYXJpYWJpbGl0eVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFyaWFiaWxpdHlUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEYXRlIGNyZWF0ZURhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChEYXRlKSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREYXRlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVUkkgY3JlYXRlVXJpRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoVVJJKSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRVcmlUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVnZXIgY3JlYXRlVW5saW1pdGVkTmF0dXJhbEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChJbnRlZ2VyKSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRVbmxpbWl0ZWROYXR1cmFsVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVN0cmluZ0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFN0cmluZ1RvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNldCBjcmVhdGVTZXRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTZXQpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNldFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBjcmVhdGVTZXF1ZW5jZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChMaXN0KSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTZXF1ZW5jZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVnZXIgY3JlYXRlSW50ZWdlckZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChJbnRlZ2VyKSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJbnRlZ2VyVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmxvYXQgY3JlYXRlRmxvYXRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChGbG9hdCkgc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RmxvYXRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYVBhY2thZ2UgZ2V0VW1hUGFja2FnZSgpIHsKLQkJcmV0dXJuIChVbWFQYWNrYWdlKSBnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBVbWFQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9VbWFGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVW1hUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1VtYVBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmOWJkNDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVW1hUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qc2V1ZG9TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBzZXVkb1N0YXRlS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBVbWFQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjbGFzc2lmaWVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBuYW1lZEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGFja2FnZWFibGVFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbmFtZXNwYWNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29uc3RyYWludEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZWN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrRGVmaW5pdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzdGVwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGd1aWRhbmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFydGlmYWN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlbGl2ZXJhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG91dGNvbWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kUGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50UGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0Rlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwb2ludEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBncmFwaEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlhZ3JhbUVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlhZ3JhbUxpbmtFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3JhcGhDb25uZWN0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaW1lbnNpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmVmZXJlbmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb3BlcnR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGdyYXBoRWRnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaWFncmFtRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGdyYXBoTm9kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB1bWFTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxlYWZFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRleHRFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGltYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGdyYXBoaWNQcmltaXRpdmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcG9seWxpbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWxsaXBzZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3Rpdml0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBicmVha2Rvd25FbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1pbGVzdG9uZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpdGVyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGhhc2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGVhbVByb2ZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZURlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya09yZGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBsYW5uaW5nRGF0YUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhc2tEZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb21wb3NpdGVSb2xlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29uY2VwdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjaGVja2xpc3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXhhbXBsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBndWlkZWxpbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlcG9ydEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZW1wbGF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdG9vbE1lbnRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3aGl0ZXBhcGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRlcm1EZWZpbml0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByYWN0aWNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJldXNhYmxlQXNzZXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc3RhdGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdmVydGV4RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlZ2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzdGF0ZU1hY2hpbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdHJhbnNpdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwc2V1ZG9TdGF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaXNjaXBsaW5lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRlbnRDYXRlZ29yeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlU2V0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRvbWFpbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdFR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRvb2xFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZVNldEdyb3VwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGN1c3RvbUNhdGVnb3J5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvYWRtYXBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0NvbXBvbmVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzUGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFBsdWdpbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kVW5pdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NGYW1pbHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kTGlicmFyeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHdvcmtPcmRlclR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHBzZXVkb1N0YXRlS2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gdmFyaWFiaWxpdHlUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZGF0ZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB1cmlFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdW5saW1pdGVkTmF0dXJhbEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzdHJpbmdFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc2V0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHNlcXVlbmNlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGludGVnZXJFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZmxvYXRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBVbWFQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBVbWFQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkKLQkJCXJldHVybiAoVW1hUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkJLmdldEVQYWNrYWdlKFVtYVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlVbWFQYWNrYWdlSW1wbCB0aGVVbWFQYWNrYWdlID0gKFVtYVBhY2thZ2VJbXBsKSAoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBVbWFQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJLmdldEVQYWNrYWdlKGVOU19VUkkpCi0JCQkJOiBuZXcgVW1hUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVVtYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVVbWFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZVVtYVBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZVVtYVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDbGFzc2lmaWVyKCkgewotCQlyZXR1cm4gY2xhc3NpZmllckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXROYW1lZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBuYW1lZEVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TmFtZWRFbGVtZW50X05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbmFtZWRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gcGFja2FnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfR3VpZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb25zdHJhaW50KCkgewotCQlyZXR1cm4gY29uc3RyYWludEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25zdHJhaW50X0JvZHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgY29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gY29udGVudEVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkgewotCQlyZXR1cm4gZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBjb250ZW50RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VjdGlvbigpIHsKLQkJcmV0dXJuIHNlY3Rpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3Rpb25fU3ViU2VjdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZSgpIHsKLQkJcmV0dXJuIHJvbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZV9Nb2RpZmllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFzaygpIHsKLQkJcmV0dXJuIHRhc2tFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19QZXJmb3JtZWRCeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19PdXRwdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfT3B0aW9uYWxJbnB1dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19TdGVwcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19Ub29sTWVudG9ycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya0RlZmluaXRpb24oKSB7Ci0JCXJldHVybiB3b3JrRGVmaW5pdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya0RlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtEZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTdGVwKCkgewotCQlyZXR1cm4gc3RlcEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEd1aWRhbmNlKCkgewotCQlyZXR1cm4gZ3VpZGFuY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcnRpZmFjdCgpIHsKLQkJcmV0dXJuIGFydGlmYWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFydGlmYWN0X0NvbnRhaW5lckFydGlmYWN0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFydGlmYWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFydGlmYWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZWxpdmVyYWJsZSgpIHsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkZWxpdmVyYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0Y29tZSgpIHsKLQkJcmV0dXJuIG91dGNvbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RQYWNrYWdlKCkgewotCQlyZXR1cm4gbWV0aG9kUGFja2FnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnRQYWNrYWdlKCkgewotCQlyZXR1cm4gY29udGVudFBhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHJvbGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSByb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgKLQkJCQkxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcm9sZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYXNrRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgdGFza0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB0YXNrRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgKLQkJCQkxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEd1aWRhbmNlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQb2ludCgpIHsKLQkJcmV0dXJuIHBvaW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvaW50X1goKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcG9pbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb2ludF9ZKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHBvaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHcmFwaEVsZW1lbnQoKSB7Ci0JCXJldHVybiBncmFwaEVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X1Bvc2l0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9Db250YWluZWQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X0xpbmsoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X0FuY2hvcmFnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfU2VtYW50aWNNb2RlbCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpYWdyYW1FbGVtZW50KCkgewotCQlyZXR1cm4gZGlhZ3JhbUVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlhZ3JhbUVsZW1lbnRfSXNWaXNpYmxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRpYWdyYW1FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUVsZW1lbnRfQ29udGFpbmVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUVsZW1lbnRfUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUVsZW1lbnRfUHJvcGVydHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpYWdyYW1MaW5rKCkgewotCQlyZXR1cm4gZGlhZ3JhbUxpbmtFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlhZ3JhbUxpbmtfWm9vbSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkaWFncmFtTGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERpYWdyYW1MaW5rX1ZpZXdwb3J0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1MaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUxpbmtfR3JhcGhFbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1MaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUxpbmtfRGlhZ3JhbSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaWFncmFtTGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3JhcGhDb25uZWN0b3IoKSB7Ci0JCXJldHVybiBncmFwaENvbm5lY3RvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhDb25uZWN0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVkZ2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhDb25uZWN0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlbWFudGljTW9kZWxCcmlkZ2UoKSB7Ci0JCXJldHVybiBzZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlbWFudGljTW9kZWxCcmlkZ2VfUHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0dyYXBoRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBzZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9EaWFncmFtKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpbWVuc2lvbigpIHsKLQkJcmV0dXJuIGRpbWVuc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaW1lbnNpb25fV2lkdGgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGltZW5zaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGltZW5zaW9uX0hlaWdodCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkaW1lbnNpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIHJlZmVyZW5jZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZWZlcmVuY2VfSXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcmVmZXJlbmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlX1JlZmVyZW5jZWQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcmVmZXJlbmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIHByb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X0tleSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHcmFwaEVkZ2UoKSB7Ci0JCXJldHVybiBncmFwaEVkZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhFZGdlX0FuY2hvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaEVkZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVkZ2VfV2F5cG9pbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoRWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGRpYWdyYW1FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlhZ3JhbV9ab29tKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRpYWdyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtX1ZpZXdwb2ludCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaWFncmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbV9EaWFncmFtTGluaygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaWFncmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbV9OYW1lc3BhY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3JhcGhOb2RlKCkgewotCQlyZXR1cm4gZ3JhcGhOb2RlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoTm9kZV9TaXplKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoTm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKSB7Ci0JCXJldHVybiBzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF9UeXBlSW5mbygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpIHsKLQkJcmV0dXJuIHVtYVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHVtYVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkgewotCQlyZXR1cm4gY29yZVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TGVhZkVsZW1lbnQoKSB7Ci0JCXJldHVybiBsZWFmRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRleHRFbGVtZW50KCkgewotCQlyZXR1cm4gdGV4dEVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGV4dEVsZW1lbnRfVGV4dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB0ZXh0RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBpbWFnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbWFnZV9VcmkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgaW1hZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbWFnZV9NaW1lVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBpbWFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3JhcGhpY1ByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuIGdyYXBoaWNQcmltaXRpdmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQb2x5bGluZSgpIHsKLQkJcmV0dXJuIHBvbHlsaW5lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvbHlsaW5lX0Nsb3NlZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwb2x5bGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBvbHlsaW5lX1dheXBvaW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwb2x5bGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RWxsaXBzZSgpIHsKLQkJcmV0dXJuIGVsbGlwc2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9SYWRpdXNYKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGVsbGlwc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX1JhZGl1c1koKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZWxsaXBzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVsbGlwc2VfUm90YXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZWxsaXBzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVsbGlwc2VfU3RhcnRBbmdsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBlbGxpcHNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9FbmRBbmdsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBlbGxpcHNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RWxsaXBzZV9DZW50ZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZWxsaXBzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZpdHkoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFjdGl2aXR5X1JvYWRtYXBzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfU3VwcG9ydGluZ01hdGVyaWFscygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFjdGl2aXR5X0NoZWNrbGlzdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9Db25jZXB0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFjdGl2aXR5X0V4YW1wbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfR3VpZGVsaW5lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFjdGl2aXR5X1JldXNhYmxlQXNzZXRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfSXNFbmFjdGFibGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkgewotCQlyZXR1cm4gd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50KCkgewotCQlyZXR1cm4gYnJlYWtkb3duRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0aWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1pbGVzdG9uZSgpIHsKLQkJcmV0dXJuIG1pbGVzdG9uZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEl0ZXJhdGlvbigpIHsKLQkJcmV0dXJuIGl0ZXJhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBoYXNlKCkgewotCQlyZXR1cm4gcGhhc2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUZWFtUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRlYW1Qcm9maWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGVhbVByb2ZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gcm9sZURlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByb2xlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcm9sZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtPcmRlcigpIHsKLQkJcmV0dXJuIHdvcmtPcmRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrT3JkZXJfTGlua1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgd29ya09yZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya09yZGVyX1ByZWQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya09yZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzRWxlbWVudCgpIHsKLQkJcmV0dXJuIHByb2Nlc3NFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGxhbm5pbmdEYXRhKCkgewotCQlyZXR1cm4gcGxhbm5pbmdEYXRhRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcGxhbm5pbmdEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcGxhbm5pbmdEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcGxhbm5pbmdEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYXNrRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29tcG9zaXRlUm9sZSgpIHsKLQkJcmV0dXJuIGNvbXBvc2l0ZVJvbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgY29tcG9zaXRlUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29uY2VwdCgpIHsKLQkJcmV0dXJuIGNvbmNlcHRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDaGVja2xpc3QoKSB7Ci0JCXJldHVybiBjaGVja2xpc3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeGFtcGxlKCkgewotCQlyZXR1cm4gZXhhbXBsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEd1aWRlbGluZSgpIHsKLQkJcmV0dXJuIGd1aWRlbGluZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlcG9ydCgpIHsKLQkJcmV0dXJuIHJlcG9ydEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gdGVtcGxhdGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUb29sTWVudG9yKCkgewotCQlyZXR1cm4gdG9vbE1lbnRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdoaXRlcGFwZXIoKSB7Ci0JCXJldHVybiB3aGl0ZXBhcGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGVybURlZmluaXRpb24oKSB7Ci0JCXJldHVybiB0ZXJtRGVmaW5pdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByYWN0aWNlKCkgewotCQlyZXR1cm4gcHJhY3RpY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByYWN0aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJhY3RpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJhY3RpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiByZXVzYWJsZUFzc2V0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U3RhdGUoKSB7Ci0JCXJldHVybiBzdGF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTdGF0ZV9Xb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBzdGF0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFN0YXRlX1JlZ2lvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBzdGF0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFN0YXRlX1N1Ym1hY2hpbmUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgc3RhdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFZlcnRleCgpIHsKLQkJcmV0dXJuIHZlcnRleEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRWZXJ0ZXhfQ29udGFpbmVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHZlcnRleEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFZlcnRleF9PdXRnb2luZygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB2ZXJ0ZXhFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRWZXJ0ZXhfSW5jb21pbmcoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdmVydGV4RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZWdpb24oKSB7Ci0JCXJldHVybiByZWdpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVnaW9uX1ZlcnRleCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByZWdpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWdpb25fVHJhbnNpdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByZWdpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWdpb25fU3RhdGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcmVnaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVnaW9uX1N0YXRlTWFjaGluZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByZWdpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFN0YXRlTWFjaGluZSgpIHsKLQkJcmV0dXJuIHN0YXRlTWFjaGluZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTdGF0ZU1hY2hpbmVfUmVnaW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHN0YXRlTWFjaGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VHJhbnNpdGlvbigpIHsKLQkJcmV0dXJuIHRyYW5zaXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VHJhbnNpdGlvbl9Xb3JrRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0cmFuc2l0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VHJhbnNpdGlvbl9Db250YWluZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdHJhbnNpdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRyYW5zaXRpb25fU291cmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRyYW5zaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUcmFuc2l0aW9uX1RhcmdldCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0cmFuc2l0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQc2V1ZG9TdGF0ZSgpIHsKLQkJcmV0dXJuIHBzZXVkb1N0YXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlzY2lwbGluZSgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9UYXNrcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9TdWJkaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjb250ZW50Q2F0ZWdvcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlU2V0KCkgewotCQlyZXR1cm4gcm9sZVNldEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlU2V0X1JvbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVTZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERvbWFpbigpIHsKLQkJcmV0dXJuIGRvbWFpbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb21haW5fV29ya1Byb2R1Y3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRvbWFpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvbWFpbl9TdWJkb21haW5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRvbWFpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RUeXBlKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaXNjaXBsaW5lR3JvdXBpbmcoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VG9vbCgpIHsKLQkJcmV0dXJuIHRvb2xFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VG9vbF9Ub29sTWVudG9ycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0b29sRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlU2V0R3JvdXBpbmcoKSB7Ci0JCXJldHVybiByb2xlU2V0R3JvdXBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVTZXRHcm91cGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q3VzdG9tQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjdXN0b21DYXRlZ29yeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGN1c3RvbUNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcmllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzKCkgewotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGVsaXZlcnlQcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDYXBhYmlsaXR5UGF0dGVybigpIHsKLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSB7Ci0JCXJldHVybiBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlZE9uUHJvY2Vzc2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2FkbWFwKCkgewotCQlyZXR1cm4gcm9hZG1hcEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnQoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NQYWNrYWdlKCkgewotCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfRGlhZ3JhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc1BhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RQbHVnaW4oKSB7Ci0JCXJldHVybiBtZXRob2RQbHVnaW5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RQbHVnaW5fQmFzZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kUGx1Z2luRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRWYXJpYWJpbGl0eUVsZW1lbnQoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZFVuaXQoKSB7Ci0JCXJldHVybiBtZXRob2RVbml0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQXV0aG9ycygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X1ZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFVuaXRfQ29weXJpZ2h0U3RhdGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzRmFtaWx5KCkgewotCQlyZXR1cm4gcHJvY2Vzc0ZhbWlseUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzRmFtaWx5X0RlbGl2ZXJ5UHJvY2Vzc2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NGYW1pbHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZExpYnJhcnkoKSB7Ci0JCXJldHVybiBtZXRob2RMaWJyYXJ5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RMaWJyYXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRXb3JrT3JkZXJUeXBlKCkgewotCQlyZXR1cm4gd29ya09yZGVyVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRQc2V1ZG9TdGF0ZUtpbmQoKSB7Ci0JCXJldHVybiBwc2V1ZG9TdGF0ZUtpbmRFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREYXRlKCkgewotCQlyZXR1cm4gZGF0ZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFVyaSgpIHsKLQkJcmV0dXJuIHVyaUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFVubGltaXRlZE5hdHVyYWwoKSB7Ci0JCXJldHVybiB1bmxpbWl0ZWROYXR1cmFsRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U3RyaW5nKCkgewotCQlyZXR1cm4gc3RyaW5nRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U2V0KCkgewotCQlyZXR1cm4gc2V0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U2VxdWVuY2UoKSB7Ci0JCXJldHVybiBzZXF1ZW5jZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEludGVnZXIoKSB7Ci0JCXJldHVybiBpbnRlZ2VyRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RmxvYXQoKSB7Ci0JCXJldHVybiBmbG9hdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hRmFjdG9yeSBnZXRVbWFGYWN0b3J5KCkgewotCQlyZXR1cm4gKFVtYUZhY3RvcnkpIGdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKQotCQkJcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQljbGFzc2lmaWVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKENMQVNTSUZJRVIpOwotCi0JCXR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVFlQRSk7Ci0KLQkJZWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFTEVNRU5UKTsKLQotCQluYW1lZEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTkFNRURfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobmFtZWRFbGVtZW50RUNsYXNzLCBOQU1FRF9FTEVNRU5UX19OQU1FKTsKLQotCQlwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFDS0FHRUFCTEVfRUxFTUVOVCk7Ci0KLQkJcGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQQUNLQUdFKTsKLQotCQluYW1lc3BhY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTkFNRVNQQUNFKTsKLQotCQltZXRob2RFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fR1VJRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsCi0JCQkJTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFKTsKLQotCQljb25zdHJhaW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlNUUkFJTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnN0cmFpbnRFQ2xhc3MsIENPTlNUUkFJTlRfX0JPRFkpOwotCi0JCW1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzLAotCQkJCU1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRSk7Ci0KLQkJY29udGVudEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9FTEVNRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RWxlbWVudEVDbGFzcywKLQkJCQlDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RWxlbWVudEVDbGFzcywKLQkJCQlDT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19BU1NFVFMpOwotCi0JCWRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERVNDUklCQUJMRV9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsCi0JCQkJREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTik7Ci0KLQkJY29udGVudERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMpOwotCi0JCXNlY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fU0VDVElPTl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19TRUNUSU9OX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19TVUJfU0VDVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1BSRURFQ0VTU09SKTsKLQotCQlyb2xlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVFQ2xhc3MsIFJPTEVfX01PRElGSUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyb2xlRUNsYXNzLCBST0xFX19SRVNQT05TSUJMRV9GT1IpOwotCi0JCXdvcmtQcm9kdWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fUkVQT1JUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fVEVNUExBVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19UT09MX01FTlRPUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtQcm9kdWN0RUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0KLQkJdGFza0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19QRVJGT1JNRURfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tFQ2xhc3MsIFRBU0tfX01BTkRBVE9SWV9JTlBVVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fT1VUUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19PUFRJT05BTF9JTlBVVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fU1RFUFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tFQ2xhc3MsIFRBU0tfX1RPT0xfTUVOVE9SUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0KLQkJd29ya0RlZmluaXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19ERUZJTklUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrRGVmaW5pdGlvbkVDbGFzcywgV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtEZWZpbml0aW9uRUNsYXNzLCBXT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04pOwotCi0JCXN0ZXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1RFUCk7Ci0KLQkJZ3VpZGFuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1VJREFOQ0UpOwotCi0JCWFydGlmYWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSVElGQUNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcnRpZmFjdEVDbGFzcywgQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXJ0aWZhY3RFQ2xhc3MsIEFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTKTsKLQotCQlkZWxpdmVyYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSQUJMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGVsaXZlcmFibGVFQ2xhc3MsCi0JCQkJREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1RTKTsKLQotCQlvdXRjb21lRUNsYXNzID0gY3JlYXRlRUNsYXNzKE9VVENPTUUpOwotCi0JCW1ldGhvZFBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1BBQ0tBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIE1FVEhPRF9QQUNLQUdFX19HTE9CQUwpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIE1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUyk7Ci0KLQkJY29udGVudFBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9QQUNLQUdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50UGFja2FnZUVDbGFzcywKLQkJCQlDT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMpOwotCi0JCWFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJUSUZBQ1RfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMpOwotCi0JCXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyk7Ci0KLQkJZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSQUJMRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRSk7Ci0KLQkJcm9sZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEZXNjcmlwdGlvbkVDbGFzcywgUk9MRV9ERVNDUklQVElPTl9fU0tJTExTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRpb25FQ2xhc3MsIFJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TKTsKLQotCQl0YXNrRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFTS19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0aW9uRUNsYXNzLCBUQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRpb25FQ2xhc3MsIFRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyk7Ci0KLQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHVUlEQU5DRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlHVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFMpOwotCi0JCXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJBQ1RJQ0VfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlQUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlQUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlQUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OKTsKLQotCQlwb2ludEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT0lOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9pbnRFQ2xhc3MsIFBPSU5UX19YKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb2ludEVDbGFzcywgUE9JTlRfX1kpOwotCi0JCWdyYXBoRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHUkFQSF9FTEVNRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaEVsZW1lbnRFQ2xhc3MsIEdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaEVsZW1lbnRFQ2xhc3MsIEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhFbGVtZW50RUNsYXNzLCBHUkFQSF9FTEVNRU5UX19MSU5LKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaEVsZW1lbnRFQ2xhc3MsIEdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhFbGVtZW50RUNsYXNzLCBHUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCk7Ci0KLQkJZGlhZ3JhbUVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElBR1JBTV9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaWFncmFtRWxlbWVudEVDbGFzcywgRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaWFncmFtRWxlbWVudEVDbGFzcywgRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1FbGVtZW50RUNsYXNzLCBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUVsZW1lbnRFQ2xhc3MsIERJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFkpOwotCi0JCWRpYWdyYW1MaW5rRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJQUdSQU1fTElOSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlhZ3JhbUxpbmtFQ2xhc3MsIERJQUdSQU1fTElOS19fWk9PTSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUxpbmtFQ2xhc3MsIERJQUdSQU1fTElOS19fVklFV1BPUlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1MaW5rRUNsYXNzLCBESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1MaW5rRUNsYXNzLCBESUFHUkFNX0xJTktfX0RJQUdSQU0pOwotCi0JCWdyYXBoQ29ubmVjdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdSQVBIX0NPTk5FQ1RPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhDb25uZWN0b3JFQ2xhc3MsIEdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhDb25uZWN0b3JFQ2xhc3MsIEdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRSk7Ci0KLQkJc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRU1BTlRJQ19NT0RFTF9CUklER0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLAotCQkJCVNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSk7Ci0KLQkJZGltZW5zaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJTUVOU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGltZW5zaW9uRUNsYXNzLCBESU1FTlNJT05fX1dJRFRIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaW1lbnNpb25FQ2xhc3MsIERJTUVOU0lPTl9fSEVJR0hUKTsKLQotCQlyZWZlcmVuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVGRVJFTkNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZWZlcmVuY2VFQ2xhc3MsCi0JCQkJUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZWZlcmVuY2VFQ2xhc3MsIFJFRkVSRU5DRV9fUkVGRVJFTkNFRCk7Ci0KLQkJcHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RUNsYXNzLCBQUk9QRVJUWV9fS0VZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eUVDbGFzcywgUFJPUEVSVFlfX1ZBTFVFKTsKLQotCQlncmFwaEVkZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1JBUEhfRURHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhFZGdlRUNsYXNzLCBHUkFQSF9FREdFX19BTkNIT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWRnZUVDbGFzcywgR1JBUEhfRURHRV9fV0FZUE9JTlRTKTsKLQotCQlkaWFncmFtRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJQUdSQU0pOwotCQljcmVhdGVFQXR0cmlidXRlKGRpYWdyYW1FQ2xhc3MsIERJQUdSQU1fX1pPT00pOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1FQ2xhc3MsIERJQUdSQU1fX1ZJRVdQT0lOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUVDbGFzcywgRElBR1JBTV9fRElBR1JBTV9MSU5LKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaWFncmFtRUNsYXNzLCBESUFHUkFNX19OQU1FU1BBQ0UpOwotCi0JCWdyYXBoTm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHUkFQSF9OT0RFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaE5vZGVFQ2xhc3MsIEdSQVBIX05PREVfX1NJWkUpOwotCi0JCXNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEVDbGFzcywKLQkJCQlTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPKTsKLQotCQl1bWFTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKHVtYVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCk7Ci0KLQkJY29yZVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLAotCQkJCUNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UKTsKLQotCQlsZWFmRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMRUFGX0VMRU1FTlQpOwotCi0JCXRleHRFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFWFRfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGV4dEVsZW1lbnRFQ2xhc3MsIFRFWFRfRUxFTUVOVF9fVEVYVCk7Ci0KLQkJaW1hZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU1BR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGltYWdlRUNsYXNzLCBJTUFHRV9fVVJJKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbWFnZUVDbGFzcywgSU1BR0VfX01JTUVfVFlQRSk7Ci0KLQkJZ3JhcGhpY1ByaW1pdGl2ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHUkFQSElDX1BSSU1JVElWRSk7Ci0KLQkJcG9seWxpbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUE9MWUxJTkUpOwotCQljcmVhdGVFQXR0cmlidXRlKHBvbHlsaW5lRUNsYXNzLCBQT0xZTElORV9fQ0xPU0VEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwb2x5bGluZUVDbGFzcywgUE9MWUxJTkVfX1dBWVBPSU5UUyk7Ci0KLQkJZWxsaXBzZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFTExJUFNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbGxpcHNlRUNsYXNzLCBFTExJUFNFX19SQURJVVNfWCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWxsaXBzZUVDbGFzcywgRUxMSVBTRV9fUkFESVVTX1kpOwotCQljcmVhdGVFQXR0cmlidXRlKGVsbGlwc2VFQ2xhc3MsIEVMTElQU0VfX1JPVEFUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbGxpcHNlRUNsYXNzLCBFTExJUFNFX19TVEFSVF9BTkdMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWxsaXBzZUVDbGFzcywgRUxMSVBTRV9fRU5EX0FOR0xFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbGxpcHNlRUNsYXNzLCBFTExJUFNFX19DRU5URVIpOwotCi0JCWFjdGl2aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKEFDVElWSVRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19ST0FETUFQUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19DSEVDS0xJU1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0NPTkNFUFRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0VYQU1QTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0dVSURFTElORVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSk7Ci0KLQkJd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19CUkVBS0RPV05fRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SKTsKLQotCQlicmVha2Rvd25FbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEJSRUFLRE9XTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwpOwotCQljcmVhdGVFUmVmZXJlbmNlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUyk7Ci0KLQkJbWlsZXN0b25lRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1JTEVTVE9ORSk7Ci0KLQkJaXRlcmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElURVJBVElPTik7Ci0KLQkJcGhhc2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEhBU0UpOwotCi0JCXRlYW1Qcm9maWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFQU1fUFJPRklMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fU1VCX1RFQU0pOwotCi0JCXJvbGVEZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZURlc2NyaXB0b3JFQ2xhc3MsIFJPTEVfREVTQ1JJUFRPUl9fUk9MRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZURlc2NyaXB0b3JFQ2xhc3MsIFJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVEZXNjcmlwdG9yRUNsYXNzLCBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUik7Ci0KLQkJd29ya09yZGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfT1JERVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtPcmRlckVDbGFzcywgV09SS19PUkRFUl9fTElOS19UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrT3JkZXJFQ2xhc3MsIFdPUktfT1JERVJfX1BSRUQpOwotCi0JCXByb2Nlc3NFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfRUxFTUVOVCk7Ci0KLQkJcGxhbm5pbmdEYXRhRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBMQU5OSU5HX0RBVEEpOwotCQljcmVhdGVFQXR0cmlidXRlKHBsYW5uaW5nRGF0YUVDbGFzcywgUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGxhbm5pbmdEYXRhRUNsYXNzLCBQTEFOTklOR19EQVRBX19GSU5JU0hfREFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGxhbm5pbmdEYXRhRUNsYXNzLCBQTEFOTklOR19EQVRBX19SQU5LKTsKLQotCQlkZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFU0NSSVBUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFKTsKLQotCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUyk7Ci0KLQkJdGFza0Rlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFTS19ERVNDUklQVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19UQVNLKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywKLQkJCQlUQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywKLQkJCQlUQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTKTsKLQotCQljb21wb3NpdGVSb2xlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTVBPU0lURV9ST0xFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb21wb3NpdGVSb2xlRUNsYXNzLCBDT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFUyk7Ci0KLQkJYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFKTsKLQotCQlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFDVElWSVRZX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGKTsKLQotCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QpOwotCi0JCXByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUyk7Ci0KLQkJZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFU0NSSVBUT1JfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OKTsKLQotCQljb25jZXB0RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTkNFUFQpOwotCi0JCWNoZWNrbGlzdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDSEVDS0xJU1QpOwotCi0JCWV4YW1wbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVhBTVBMRSk7Ci0KLQkJZ3VpZGVsaW5lRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdVSURFTElORSk7Ci0KLQkJcmVwb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFUE9SVCk7Ci0KLQkJdGVtcGxhdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVNUExBVEUpOwotCi0JCXN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVVBQT1JUSU5HX01BVEVSSUFMKTsKLQotCQl0b29sTWVudG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRPT0xfTUVOVE9SKTsKLQotCQl3aGl0ZXBhcGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdISVRFUEFQRVIpOwotCi0JCXRlcm1EZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFUk1fREVGSU5JVElPTik7Ci0KLQkJcHJhY3RpY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJBQ1RJQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByYWN0aWNlRUNsYXNzLCBQUkFDVElDRV9fU1VCX1BSQUNUSUNFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJhY3RpY2VFQ2xhc3MsIFBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByYWN0aWNlRUNsYXNzLCBQUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUyk7Ci0KLQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCi0JCXJldXNhYmxlQXNzZXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVVU0FCTEVfQVNTRVQpOwotCi0JCXN0YXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNUQVRFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzdGF0ZUVDbGFzcywgU1RBVEVfX1dPUktfUFJPRFVDVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc3RhdGVFQ2xhc3MsIFNUQVRFX19SRUdJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHN0YXRlRUNsYXNzLCBTVEFURV9fU1VCTUFDSElORSk7Ci0KLQkJdmVydGV4RUNsYXNzID0gY3JlYXRlRUNsYXNzKFZFUlRFWCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodmVydGV4RUNsYXNzLCBWRVJURVhfX0NPTlRBSU5FUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodmVydGV4RUNsYXNzLCBWRVJURVhfX09VVEdPSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh2ZXJ0ZXhFQ2xhc3MsIFZFUlRFWF9fSU5DT01JTkcpOwotCi0JCXJlZ2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRUdJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlZ2lvbkVDbGFzcywgUkVHSU9OX19WRVJURVgpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlZ2lvbkVDbGFzcywgUkVHSU9OX19UUkFOU0lUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZWdpb25FQ2xhc3MsIFJFR0lPTl9fU1RBVEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlZ2lvbkVDbGFzcywgUkVHSU9OX19TVEFURV9NQUNISU5FKTsKLQotCQlzdGF0ZU1hY2hpbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1RBVEVfTUFDSElORSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc3RhdGVNYWNoaW5lRUNsYXNzLCBTVEFURV9NQUNISU5FX19SRUdJT04pOwotCi0JCXRyYW5zaXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVFJBTlNJVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodHJhbnNpdGlvbkVDbGFzcywgVFJBTlNJVElPTl9fV09SS19ERUZJTklUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0cmFuc2l0aW9uRUNsYXNzLCBUUkFOU0lUSU9OX19DT05UQUlORVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRyYW5zaXRpb25FQ2xhc3MsIFRSQU5TSVRJT05fX1NPVVJDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodHJhbnNpdGlvbkVDbGFzcywgVFJBTlNJVElPTl9fVEFSR0VUKTsKLQotCQlwc2V1ZG9TdGF0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQU0VVRE9fU1RBVEUpOwotCi0JCWRpc2NpcGxpbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElTQ0lQTElORSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fVEFTS1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpc2NpcGxpbmVFQ2xhc3MsIERJU0NJUExJTkVfX1NVQkRJU0NJUExJTkUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpc2NpcGxpbmVFQ2xhc3MsIERJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1MpOwotCi0JCWNvbnRlbnRDYXRlZ29yeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX0NBVEVHT1JZKTsKLQotCQlyb2xlU2V0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfU0VUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyb2xlU2V0RUNsYXNzLCBST0xFX1NFVF9fUk9MRVMpOwotCi0JCWRvbWFpbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhET01BSU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvbWFpbkVDbGFzcywgRE9NQUlOX19XT1JLX1BST0RVQ1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb21haW5FQ2xhc3MsIERPTUFJTl9fU1VCRE9NQUlOUyk7Ci0KLQkJd29ya1Byb2R1Y3RUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdFR5cGVFQ2xhc3MsCi0JCQkJV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFMpOwotCi0JCWRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhESVNDSVBMSU5FX0dST1VQSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MsCi0JCQkJRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMpOwotCi0JCXRvb2xFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVE9PTCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodG9vbEVDbGFzcywgVE9PTF9fVE9PTF9NRU5UT1JTKTsKLQotCQlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9TRVRfR1JPVVBJTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVTZXRHcm91cGluZ0VDbGFzcywgUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUyk7Ci0KLQkJY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ1VTVE9NX0NBVEVHT1JZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjdXN0b21DYXRlZ29yeUVDbGFzcywKLQkJCQlDVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjdXN0b21DYXRlZ29yeUVDbGFzcywgQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUyk7Ci0KLQkJZGVsaXZlcnlQcm9jZXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFTElWRVJZX1BST0NFU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUxTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkZWxpdmVyeVByb2Nlc3NFQ2xhc3MsCi0JCQkJREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUxTKTsKLQotCQlwcm9jZXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzRUNsYXNzLCBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX1ZBTElEX0NPTlRFWFQpOwotCi0JCWNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzID0gY3JlYXRlRUNsYXNzKENBUEFCSUxJVFlfUEFUVEVSTik7Ci0KLQkJcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19QTEFOTklOR19URU1QTEFURSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MsCi0JCQkJUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRURfT05fUFJPQ0VTU0VTKTsKLQotCQlyb2FkbWFwRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPQURNQVApOwotCi0JCXByb2Nlc3NDb21wb25lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19DT01QT05FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyk7Ci0KLQkJcHJvY2Vzc1BhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19QQUNLQUdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzUGFja2FnZUVDbGFzcywKLQkJCQlQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NQYWNrYWdlRUNsYXNzLCBQUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TKTsKLQotCQlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywKLQkJCQlQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywKLQkJCQlQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyk7Ci0KLQkJcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQpOwotCi0JCW1ldGhvZFBsdWdpbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfUExVR0lOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQbHVnaW5FQ2xhc3MsIE1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGx1Z2luRUNsYXNzLCBNRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFBsdWdpbkVDbGFzcywgTUVUSE9EX1BMVUdJTl9fQkFTRVMpOwotCi0JCXZhcmlhYmlsaXR5RWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhWQVJJQUJJTElUWV9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MsCi0JCQkJVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzLAotCQkJCVZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQpOwotCi0JCW1ldGhvZFVuaXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1VOSVQpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19BVVRIT1JTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19WRVJTSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCk7Ci0KLQkJbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfQ09ORklHVVJBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywKLQkJCQlNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsCi0JCQkJTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywKLQkJCQlNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywKLQkJCQlNRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSk7Ci0KLQkJcHJvY2Vzc0ZhbWlseUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0ZBTUlMWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0ZhbWlseUVDbGFzcywKLQkJCQlQUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTKTsKLQotCQltZXRob2RMaWJyYXJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9MSUJSQVJZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RMaWJyYXJ5RUNsYXNzLCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZExpYnJhcnlFQ2xhc3MsCi0JCQkJTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQl3b3JrT3JkZXJUeXBlRUVudW0gPSBjcmVhdGVFRW51bShXT1JLX09SREVSX1RZUEUpOwotCQlwc2V1ZG9TdGF0ZUtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKFBTRVVET19TVEFURV9LSU5EKTsKLQkJdmFyaWFiaWxpdHlUeXBlRUVudW0gPSBjcmVhdGVFRW51bShWQVJJQUJJTElUWV9UWVBFKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQlkYXRlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKERBVEUpOwotCQl1cmlFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoVVJJKTsKLQkJdW5saW1pdGVkTmF0dXJhbEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShVTkxJTUlURURfTkFUVVJBTCk7Ci0JCXN0cmluZ0VEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShTVFJJTkcpOwotCQlzZXRFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoU0VUKTsKLQkJc2VxdWVuY2VFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoU0VRVUVOQ0UpOwotCQlpbnRlZ2VyRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKElOVEVHRVIpOwotCQlmbG9hdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShGTE9BVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkKLQkJCXJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQljbGFzc2lmaWVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VHlwZSgpKTsKLQkJdHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJbmFtZWRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RWxlbWVudCgpKTsKLQkJcGFja2FnZWFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TmFtZWRFbGVtZW50KCkpOwotCQlwYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TmFtZXNwYWNlKCkpOwotCQlwYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQluYW1lc3BhY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROYW1lZEVsZW1lbnQoKSk7Ci0JCW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSk7Ci0JCWNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQltZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSk7Ci0JCWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFZhcmlhYmlsaXR5RWxlbWVudCgpKTsKLQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q2xhc3NpZmllcigpKTsKLQkJY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJc2VjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFZhcmlhYmlsaXR5RWxlbWVudCgpKTsKLQkJcm9sZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQl0YXNrRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCXRhc2tFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrRGVmaW5pdGlvbigpKTsKLQkJd29ya0RlZmluaXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQlzdGVwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U2VjdGlvbigpKTsKLQkJc3RlcEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtEZWZpbml0aW9uKCkpOwotCQlndWlkYW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQlhcnRpZmFjdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtQcm9kdWN0KCkpOwotCQlkZWxpdmVyYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtQcm9kdWN0KCkpOwotCQlvdXRjb21lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCW1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQltZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGFja2FnZSgpKTsKLQkJY29udGVudFBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RQYWNrYWdlKCkpOwotCQlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpKTsKLQkJd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCXJvbGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpCi0JCQkJLmFkZCh0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJdGFza0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkKLQkJCQkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlncmFwaEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREaWFncmFtRWxlbWVudCgpKTsKLQkJZGlhZ3JhbUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQlkaWFncmFtTGlua0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERpYWdyYW1FbGVtZW50KCkpOwotCQlncmFwaENvbm5lY3RvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEdyYXBoRWxlbWVudCgpKTsKLQkJc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpCi0JCQkJLmFkZCh0aGlzLmdldERpYWdyYW1FbGVtZW50KCkpOwotCQlyZWZlcmVuY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREaWFncmFtRWxlbWVudCgpKTsKLQkJcHJvcGVydHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREaWFncmFtRWxlbWVudCgpKTsKLQkJZ3JhcGhFZGdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3JhcGhFbGVtZW50KCkpOwotCQlkaWFncmFtRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3JhcGhOb2RlKCkpOwotCQlncmFwaE5vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHcmFwaEVsZW1lbnQoKSk7Ci0JCXNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpKTsKLQkJdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldFNlbWFudGljTW9kZWxCcmlkZ2UoKSk7Ci0JCWNvcmVTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpKTsKLQkJbGVhZkVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREaWFncmFtRWxlbWVudCgpKTsKLQkJdGV4dEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMZWFmRWxlbWVudCgpKTsKLQkJaW1hZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMZWFmRWxlbWVudCgpKTsKLQkJZ3JhcGhpY1ByaW1pdGl2ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExlYWZFbGVtZW50KCkpOwotCQlwb2x5bGluZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEdyYXBoaWNQcmltaXRpdmUoKSk7Ci0JCWVsbGlwc2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHcmFwaGljUHJpbWl0aXZlKCkpOwotCQlhY3Rpdml0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQlhY3Rpdml0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFZhcmlhYmlsaXR5RWxlbWVudCgpKTsKLQkJYWN0aXZpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrRGVmaW5pdGlvbigpKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc0VsZW1lbnQoKSk7Ci0JCW1pbGVzdG9uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQlpdGVyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBY3Rpdml0eSgpKTsKLQkJcGhhc2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBY3Rpdml0eSgpKTsKLQkJdGVhbVByb2ZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlyb2xlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaXB0b3IoKSk7Ci0JCXdvcmtPcmRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3NFbGVtZW50KCkpOwotCQlwcm9jZXNzRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaWJhYmxlRWxlbWVudCgpKTsKLQkJcGxhbm5pbmdEYXRhRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc0VsZW1lbnQoKSk7Ci0JCWRlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmlwdG9yKCkpOwotCQl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaXB0b3IoKSk7Ci0JCWNvbXBvc2l0ZVJvbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpKTsKLQkJYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpKTsKLQkJZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQljb25jZXB0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWNoZWNrbGlzdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlleGFtcGxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWd1aWRlbGluZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlyZXBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJdGVtcGxhdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJc3VwcG9ydGluZ01hdGVyaWFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRvb2xNZW50b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJd2hpdGVwYXBlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbmNlcHQoKSk7Ci0JCXRlcm1EZWZpbml0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXByYWN0aWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlyZXVzYWJsZUFzc2V0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXN0YXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VmVydGV4KCkpOwotCQlzdGF0ZU1hY2hpbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrRGVmaW5pdGlvbigpKTsKLQkJcHNldWRvU3RhdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRWZXJ0ZXgoKSk7Ci0JCWRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWNvbnRlbnRDYXRlZ29yeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQlyb2xlU2V0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlkb21haW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCXdvcmtQcm9kdWN0VHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkKLQkJCQkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQl0b29sRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWN1c3RvbUNhdGVnb3J5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlkZWxpdmVyeVByb2Nlc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzKCkpOwotCQlwcm9jZXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWN0aXZpdHkoKSk7Ci0JCWNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2VzcygpKTsKLQkJcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzKCkpOwotCQlyb2FkbWFwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzUGFja2FnZSgpKTsKLQkJcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFVuaXQoKSk7Ci0JCXByb2Nlc3NQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCXByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0RGVzY3JpcHRvcigpKTsKLQkJbWV0aG9kUGx1Z2luRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJbWV0aG9kUGx1Z2luRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGFja2FnZSgpKTsKLQkJdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQlwcm9jZXNzRmFtaWx5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFVuaXQoKSk7Ci0JCW1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoCi0JCQkJY2xhc3NpZmllckVDbGFzcywKLQkJCQlDbGFzc2lmaWVyLmNsYXNzLAotCQkJCSJDbGFzc2lmaWVyIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHR5cGVFQ2xhc3MsIFR5cGUuY2xhc3MsCi0JCQkJIlR5cGUiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZWxlbWVudEVDbGFzcywKLQkJCQlFbGVtZW50LmNsYXNzLAotCQkJCSJFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW5hbWVkRWxlbWVudEVDbGFzcywKLQkJCQlOYW1lZEVsZW1lbnQuY2xhc3MsCi0JCQkJIk5hbWVkRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkibmFtZSIsICIiLCAwLCAxLCBOYW1lZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcGFja2FnZWFibGVFbGVtZW50RUNsYXNzLAotCQkJCVBhY2thZ2VhYmxlRWxlbWVudC5jbGFzcywKLQkJCQkiUGFja2FnZWFibGVFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXBhY2thZ2VFQ2xhc3MsCi0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlLmNsYXNzLAotCQkJCSJQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQluYW1lc3BhY2VFQ2xhc3MsCi0JCQkJTmFtZXNwYWNlLmNsYXNzLAotCQkJCSJOYW1lc3BhY2UiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJbWV0aG9kRWxlbWVudEVDbGFzcywKLQkJCQlNZXRob2RFbGVtZW50LmNsYXNzLAotCQkJCSJNZXRob2RFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiZ3VpZCIsICIiLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYnJpZWZEZXNjcmlwdGlvbiIsICIiLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGVzKCksCi0JCQkJdGhpcy5nZXRDb25zdHJhaW50KCksCi0JCQkJbnVsbCwKLQkJCQkib3duZWRSdWxlcyIsIG51bGwsIDAsIC0xLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCksCi0JCQkJdGhpcy5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSwKLQkJCQludWxsLAotCQkJCSJtZXRob2RFbGVtZW50UHJvcGVydHkiLCBudWxsLCAwLCAtMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW5PYmplY3QoKSwKLQkJCQkic3VwcHJlc3NlZCIsICJmYWxzZSIsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJvcmRlcmluZ0d1aWRlIiwgIiIsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY29uc3RyYWludEVDbGFzcywKLQkJCQlDb25zdHJhaW50LmNsYXNzLAotCQkJCSJDb25zdHJhaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldENvbnN0cmFpbnRfQm9keSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImJvZHkiLCAiIiwgMCwgMSwgQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MsCi0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzLAotCQkJCSJNZXRob2RFbGVtZW50UHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkidmFsdWUiLCAiIiwgMCwgMSwgTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNvbnRlbnRFbGVtZW50RUNsYXNzLAotCQkJCUNvbnRlbnRFbGVtZW50LmNsYXNzLAotCQkJCSJDb250ZW50RWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQl0aGlzLmdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLAotCQkJCW51bGwsCi0JCQkJInN1cHBvcnRpbmdNYXRlcmlhbHMiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJdGhpcy5nZXRDb25jZXB0KCksCi0JCQkJbnVsbCwKLQkJCQkiY29uY2VwdHNBbmRQYXBlcnMiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQl0aGlzLmdldENoZWNrbGlzdCgpLAotCQkJCW51bGwsCi0JCQkJImNoZWNrbGlzdHMiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQl0aGlzLmdldEd1aWRlbGluZSgpLAotCQkJCW51bGwsCi0JCQkJImd1aWRlbGluZXMiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJdGhpcy5nZXRFeGFtcGxlKCksCi0JCQkJbnVsbCwKLQkJCQkiZXhhbXBsZXMiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCXRoaXMuZ2V0UmV1c2FibGVBc3NldCgpLAotCQkJCW51bGwsCi0JCQkJImFzc2V0cyIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsCi0JCQkJIkRlc2NyaWJhYmxlRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicHJlc2VudGF0aW9uTmFtZSIsICIiLCAwLCAxLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCksCi0JCQkJdGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSwKLQkJCQludWxsLAotCQkJCSJwcmVzZW50YXRpb24iLCBudWxsLCAwLCAxLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCksCi0JCQkJdGhpcy5nZXRVcmkoKSwKLQkJCQkic2hhcGVpY29uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpLAotCQkJCXRoaXMuZ2V0VXJpKCksCi0JCQkJIm5vZGVpY29uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJDb250ZW50RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJIm1haW5EZXNjcmlwdGlvbiIsICIiLCAwLCAxLCBDb250ZW50RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKSwKLQkJCQl0aGlzLmdldFNlY3Rpb24oKSwKLQkJCQludWxsLAotCQkJCSJzZWN0aW9ucyIsIG51bGwsIDAsIC0xLCBDb250ZW50RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkia2V5Q29uc2lkZXJhdGlvbnMiLCAiIiwgMCwgMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXNlY3Rpb25FQ2xhc3MsCi0JCQkJU2VjdGlvbi5jbGFzcywKLQkJCQkiU2VjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkic2VjdGlvbk5hbWUiLCAiIiwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFNlY3Rpb25fU2VjdGlvbkRlc2NyaXB0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkic2VjdGlvbkRlc2NyaXB0aW9uIiwgIiIsIDAsIDEsIFNlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRTZWN0aW9uX1N1YlNlY3Rpb25zKCksCi0JCQkJdGhpcy5nZXRTZWN0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkic3ViU2VjdGlvbnMiLCBudWxsLCAwLCAtMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCksCi0JCQkJdGhpcy5nZXRTZWN0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkicHJlZGVjZXNzb3IiLCBudWxsLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlyb2xlRUNsYXNzLAotCQkJCVJvbGUuY2xhc3MsCi0JCQkJIlJvbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Um9sZV9Nb2RpZmllcygpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQludWxsLAotCQkJCSJtb2RpZmllcyIsIG51bGwsIDAsIC0xLCBSb2xlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQludWxsLAotCQkJCSJyZXNwb25zaWJsZUZvciIsIG51bGwsIDAsIC0xLCBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd29ya1Byb2R1Y3RFQ2xhc3MsCi0JCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkJIldvcmtQcm9kdWN0IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLAotCQkJCXRoaXMuZ2V0UmVwb3J0KCksCi0JCQkJbnVsbCwKLQkJCQkicmVwb3J0cyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCksCi0JCQkJdGhpcy5nZXRUZW1wbGF0ZSgpLAotCQkJCW51bGwsCi0JCQkJInRlbXBsYXRlcyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKSwKLQkJCQl0aGlzLmdldFRvb2xNZW50b3IoKSwKLQkJCQludWxsLAotCQkJCSJ0b29sTWVudG9ycyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksCi0JCQkJdGhpcy5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQludWxsLAotCQkJCSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0YXNrRUNsYXNzLAotCQkJCVRhc2suY2xhc3MsCi0JCQkJIlRhc2siLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19QZXJmb3JtZWRCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZSgpLAotCQkJCW51bGwsCi0JCQkJInBlcmZvcm1lZEJ5IiwgbnVsbCwgMCwgMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrX01hbmRhdG9yeUlucHV0KCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIm1hbmRhdG9yeUlucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tfT3V0cHV0KCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIm91dHB1dCIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJdGhpcy5nZXRSb2xlKCksCi0JCQkJbnVsbCwKLQkJCQkiYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19PcHRpb25hbElucHV0KCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIm9wdGlvbmFsSW5wdXQiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19TdGVwcygpLAotCQkJCXRoaXMuZ2V0U3RlcCgpLAotCQkJCW51bGwsCi0JCQkJInN0ZXBzIiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrX1Rvb2xNZW50b3JzKCksCi0JCQkJdGhpcy5nZXRUb29sTWVudG9yKCksCi0JCQkJbnVsbCwKLQkJCQkidG9vbE1lbnRvcnMiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQl0aGlzLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLAotCQkJCW51bGwsCi0JCQkJImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd29ya0RlZmluaXRpb25FQ2xhc3MsCi0JCQkJV29ya0RlZmluaXRpb24uY2xhc3MsCi0JCQkJIldvcmtEZWZpbml0aW9uIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCksCi0JCQkJdGhpcy5nZXRDb25zdHJhaW50KCksCi0JCQkJbnVsbCwKLQkJCQkicHJlY29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgV29ya0RlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCksCi0JCQkJdGhpcy5nZXRDb25zdHJhaW50KCksCi0JCQkJbnVsbCwKLQkJCQkicG9zdGNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIFdvcmtEZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXN0ZXBFQ2xhc3MsCi0JCQkJU3RlcC5jbGFzcywKLQkJCQkiU3RlcCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3VpZGFuY2VFQ2xhc3MsCi0JCQkJR3VpZGFuY2UuY2xhc3MsCi0JCQkJIkd1aWRhbmNlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWFydGlmYWN0RUNsYXNzLAotCQkJCUFydGlmYWN0LmNsYXNzLAotCQkJCSJBcnRpZmFjdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpLAotCQkJCXRoaXMuZ2V0QXJ0aWZhY3QoKSwKLQkJCQl0aGlzLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCSJjb250YWluZXJBcnRpZmFjdCIsIG51bGwsIDAsIDEsIEFydGlmYWN0LmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCksCi0JCQkJdGhpcy5nZXRBcnRpZmFjdCgpLAotCQkJCXRoaXMuZ2V0QXJ0aWZhY3RfQ29udGFpbmVyQXJ0aWZhY3QoKSwKLQkJCQkiY29udGFpbmVkQXJ0aWZhY3RzIiwgbnVsbCwgMCwgLTEsIEFydGlmYWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkZWxpdmVyYWJsZUVDbGFzcywKLQkJCQlEZWxpdmVyYWJsZS5jbGFzcywKLQkJCQkiRGVsaXZlcmFibGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJImRlbGl2ZXJlZFdvcmtQcm9kdWN0cyIsIG51bGwsIDAsIC0xLCBEZWxpdmVyYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW91dGNvbWVFQ2xhc3MsCi0JCQkJT3V0Y29tZS5jbGFzcywKLQkJCQkiT3V0Y29tZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJbWV0aG9kUGFja2FnZUVDbGFzcywKLQkJCQlNZXRob2RQYWNrYWdlLmNsYXNzLAotCQkJCSJNZXRob2RQYWNrYWdlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW5PYmplY3QoKSwKLQkJCQkiZ2xvYmFsIiwgImZhbHNlIiwgMCwgMSwgTWV0aG9kUGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZXMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSwKLQkJCQludWxsLAotCQkJCSJyZXVzZWRQYWNrYWdlcyIsIG51bGwsIDAsIC0xLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSwKLQkJCQludWxsLAotCQkJCSJjaGlsZFBhY2thZ2VzIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNvbnRlbnRQYWNrYWdlRUNsYXNzLAotCQkJCUNvbnRlbnRQYWNrYWdlLmNsYXNzLAotCQkJCSJDb250ZW50UGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRFbGVtZW50KCksCi0JCQkJbnVsbCwKLQkJCQkiY29udGVudEVsZW1lbnRzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIkFydGlmYWN0RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJicmllZk91dGxpbmUiLCAiIiwgMCwgMSwgQXJ0aWZhY3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicmVwcmVzZW50YXRpb25PcHRpb25zIiwgIiIsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImV4dGVybmFsSWQiLCAiIiwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInB1cnBvc2UiLCAiIiwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJpbXBhY3RPZk5vdEhhdmluZyIsICIiLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInJlYXNvbnNGb3JOb3ROZWVkaW5nIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImV4dGVybmFsRGVzY3JpcHRpb24iLCAiIiwgMCwgMSwgRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwYWNrYWdpbmdHdWlkYW5jZSIsICIiLCAwLCAxLCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJvbGVEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlSb2xlRGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIlJvbGVEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkic2tpbGxzIiwgIiIsIDAsIDEsIFJvbGVEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImFzc2lnbm1lbnRBcHByb2FjaGVzIiwgIiIsIDAsIDEsIFJvbGVEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInN5bm9ueW1zIiwgIiIsIDAsIDEsIFJvbGVEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0YXNrRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJVGFza0Rlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJUYXNrRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwdXJwb3NlIiwgIiIsIDAsIDEsIFRhc2tEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhbHRlcm5hdGl2ZXMiLCAiIiwgMCwgMSwgVGFza0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJR3VpZGFuY2VEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiR3VpZGFuY2VEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYXR0YWNobWVudHMiLCAiIiwgMCwgMSwgR3VpZGFuY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIlByYWN0aWNlRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImFkZGl0aW9uYWxJbmZvIiwgIiIsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwcm9ibGVtIiwgIiIsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJiYWNrZ3JvdW5kIiwgIiIsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiZ29hbHMiLCAiIiwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhcHBsaWNhdGlvbiIsICIiLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkibGV2ZWxzT2ZBZG9wdGlvbiIsICIiLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXBvaW50RUNsYXNzLAotCQkJCVBvaW50LmNsYXNzLAotCQkJCSJQb2ludCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQb2ludF9YKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVEb3VibGVPYmplY3QoKSwKLQkJCQkieCIsIG51bGwsIDAsIDEsIFBvaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFBvaW50X1koKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RURvdWJsZU9iamVjdCgpLAotCQkJCSJ5IiwgbnVsbCwgMCwgMSwgUG9pbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWdyYXBoRWxlbWVudEVDbGFzcywKLQkJCQlHcmFwaEVsZW1lbnQuY2xhc3MsCi0JCQkJIkdyYXBoRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoRWxlbWVudF9Qb3NpdGlvbigpLAotCQkJCXRoaXMuZ2V0UG9pbnQoKSwKLQkJCQludWxsLAotCQkJCSJwb3NpdGlvbiIsIG51bGwsIDAsIDEsIEdyYXBoRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoRWxlbWVudF9Db250YWluZWQoKSwKLQkJCQl0aGlzLmdldERpYWdyYW1FbGVtZW50KCksCi0JCQkJdGhpcy5nZXREaWFncmFtRWxlbWVudF9Db250YWluZXIoKSwKLQkJCQkiY29udGFpbmVkIiwgbnVsbCwgMCwgLTEsIEdyYXBoRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaEVsZW1lbnRfTGluaygpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUxpbmsoKSwKLQkJCQl0aGlzLmdldERpYWdyYW1MaW5rX0dyYXBoRWxlbWVudCgpLAotCQkJCSJsaW5rIiwgbnVsbCwgMCwgLTEsIEdyYXBoRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaEVsZW1lbnRfQW5jaG9yYWdlKCksCi0JCQkJdGhpcy5nZXRHcmFwaENvbm5lY3RvcigpLAotCQkJCXRoaXMuZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFbGVtZW50KCksCi0JCQkJImFuY2hvcmFnZSIsIG51bGwsIDAsIC0xLCBHcmFwaEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhFbGVtZW50X1NlbWFudGljTW9kZWwoKSwKLQkJCQl0aGlzLmdldFNlbWFudGljTW9kZWxCcmlkZ2UoKSwKLQkJCQl0aGlzLmdldFNlbWFudGljTW9kZWxCcmlkZ2VfR3JhcGhFbGVtZW50KCksCi0JCQkJInNlbWFudGljTW9kZWwiLCBudWxsLCAxLCAxLCBHcmFwaEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGlhZ3JhbUVsZW1lbnRFQ2xhc3MsCi0JCQkJRGlhZ3JhbUVsZW1lbnQuY2xhc3MsCi0JCQkJIkRpYWdyYW1FbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGlhZ3JhbUVsZW1lbnRfSXNWaXNpYmxlKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuT2JqZWN0KCksCi0JCQkJImlzVmlzaWJsZSIsICJ0cnVlIiwgMCwgMSwgRGlhZ3JhbUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtRWxlbWVudF9Db250YWluZXIoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFbGVtZW50X0NvbnRhaW5lZCgpLAotCQkJCSJjb250YWluZXIiLCBudWxsLCAwLCAxLCBEaWFncmFtRWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1FbGVtZW50X1JlZmVyZW5jZSgpLAotCQkJCXRoaXMuZ2V0UmVmZXJlbmNlKCksCi0JCQkJdGhpcy5nZXRSZWZlcmVuY2VfUmVmZXJlbmNlZCgpLAotCQkJCSJyZWZlcmVuY2UiLCBudWxsLCAwLCAtMSwgRGlhZ3JhbUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1FbGVtZW50X1Byb3BlcnR5KCksCi0JCQkJdGhpcy5nZXRQcm9wZXJ0eSgpLAotCQkJCW51bGwsCi0JCQkJInByb3BlcnR5IiwgbnVsbCwgMCwgLTEsIERpYWdyYW1FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkaWFncmFtTGlua0VDbGFzcywKLQkJCQlEaWFncmFtTGluay5jbGFzcywKLQkJCQkiRGlhZ3JhbUxpbmsiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGlhZ3JhbUxpbmtfWm9vbSgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFRG91YmxlT2JqZWN0KCksCi0JCQkJInpvb20iLCBudWxsLCAwLCAxLCBEaWFncmFtTGluay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtTGlua19WaWV3cG9ydCgpLAotCQkJCXRoaXMuZ2V0UG9pbnQoKSwKLQkJCQludWxsLAotCQkJCSJ2aWV3cG9ydCIsIG51bGwsIDAsIDEsIERpYWdyYW1MaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlhZ3JhbUxpbmtfR3JhcGhFbGVtZW50KCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWxlbWVudF9MaW5rKCksCi0JCQkJImdyYXBoRWxlbWVudCIsIG51bGwsIDEsIDEsIERpYWdyYW1MaW5rLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlhZ3JhbUxpbmtfRGlhZ3JhbSgpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbSgpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbV9EaWFncmFtTGluaygpLAotCQkJCSJkaWFncmFtIiwgbnVsbCwgMSwgMSwgRGlhZ3JhbUxpbmsuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWdyYXBoQ29ubmVjdG9yRUNsYXNzLAotCQkJCUdyYXBoQ29ubmVjdG9yLmNsYXNzLAotCQkJCSJHcmFwaENvbm5lY3RvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFbGVtZW50X0FuY2hvcmFnZSgpLAotCQkJCSJncmFwaEVsZW1lbnQiLCBudWxsLCAxLCAxLCBHcmFwaENvbm5lY3Rvci5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWRnZSgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFZGdlKCksCi0JCQkJdGhpcy5nZXRHcmFwaEVkZ2VfQW5jaG9yKCksCi0JCQkJImdyYXBoRWRnZSIsIG51bGwsIDAsIC0xLCBHcmFwaENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywKLQkJCQkiU2VtYW50aWNNb2RlbEJyaWRnZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFNlbWFudGljTW9kZWxCcmlkZ2VfUHJlc2VudGF0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicHJlc2VudGF0aW9uIiwgIiIsIDAsIDEsIFNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0dyYXBoRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFbGVtZW50KCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnRfU2VtYW50aWNNb2RlbCgpLAotCQkJCSJncmFwaEVsZW1lbnQiLCBudWxsLCAwLCAxLCBTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9EaWFncmFtKCksCi0JCQkJdGhpcy5nZXREaWFncmFtKCksCi0JCQkJdGhpcy5nZXREaWFncmFtX05hbWVzcGFjZSgpLAotCQkJCSJkaWFncmFtIiwgbnVsbCwgMCwgMSwgU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkaW1lbnNpb25FQ2xhc3MsCi0JCQkJRGltZW5zaW9uLmNsYXNzLAotCQkJCSJEaW1lbnNpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGltZW5zaW9uX1dpZHRoKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVEb3VibGVPYmplY3QoKSwKLQkJCQkid2lkdGgiLCBudWxsLCAwLCAxLCBEaW1lbnNpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGltZW5zaW9uX0hlaWdodCgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFRG91YmxlT2JqZWN0KCksCi0JCQkJImhlaWdodCIsIG51bGwsIDAsIDEsIERpbWVuc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcmVmZXJlbmNlRUNsYXNzLAotCQkJCVJlZmVyZW5jZS5jbGFzcywKLQkJCQkiUmVmZXJlbmNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFJlZmVyZW5jZV9Jc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLAotCQkJCSJpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIsIG51bGwsIDAsIDEsIFJlZmVyZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSZWZlcmVuY2VfUmVmZXJlbmNlZCgpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldERpYWdyYW1FbGVtZW50X1JlZmVyZW5jZSgpLAotCQkJCSJyZWZlcmVuY2VkIiwgbnVsbCwgMSwgMSwgUmVmZXJlbmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9wZXJ0eUVDbGFzcywKLQkJCQlQcm9wZXJ0eS5jbGFzcywKLQkJCQkiUHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJvcGVydHlfS2V5KCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkia2V5IiwgIiIsIDAsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJvcGVydHlfVmFsdWUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJ2YWx1ZSIsICIiLCAwLCAxLCBQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlncmFwaEVkZ2VFQ2xhc3MsCi0JCQkJR3JhcGhFZGdlLmNsYXNzLAotCQkJCSJHcmFwaEVkZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhFZGdlX0FuY2hvcigpLAotCQkJCXRoaXMuZ2V0R3JhcGhDb25uZWN0b3IoKSwKLQkJCQl0aGlzLmdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWRnZSgpLAotCQkJCSJhbmNob3IiLCBudWxsLCAyLCAyLCBHcmFwaEVkZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoRWRnZV9XYXlwb2ludHMoKSwKLQkJCQl0aGlzLmdldFBvaW50KCksCi0JCQkJbnVsbCwKLQkJCQkid2F5cG9pbnRzIiwgbnVsbCwgMiwgLTEsIEdyYXBoRWRnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGlhZ3JhbUVDbGFzcywKLQkJCQlEaWFncmFtLmNsYXNzLAotCQkJCSJEaWFncmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERpYWdyYW1fWm9vbSgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFRG91YmxlT2JqZWN0KCksCi0JCQkJInpvb20iLCBudWxsLCAwLCAxLCBEaWFncmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1fVmlld3BvaW50KCksCi0JCQkJdGhpcy5nZXRQb2ludCgpLAotCQkJCW51bGwsCi0JCQkJInZpZXdwb2ludCIsIG51bGwsIDAsIDEsIERpYWdyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtX0RpYWdyYW1MaW5rKCksCi0JCQkJdGhpcy5nZXREaWFncmFtTGluaygpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUxpbmtfRGlhZ3JhbSgpLAotCQkJCSJkaWFncmFtTGluayIsIG51bGwsIDAsIC0xLCBEaWFncmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtX05hbWVzcGFjZSgpLAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpLAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9EaWFncmFtKCksCi0JCQkJIm5hbWVzcGFjZSIsIG51bGwsIDEsIDEsIERpYWdyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3JhcGhOb2RlRUNsYXNzLAotCQkJCUdyYXBoTm9kZS5jbGFzcywKLQkJCQkiR3JhcGhOb2RlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoTm9kZV9TaXplKCksCi0JCQkJdGhpcy5nZXREaW1lbnNpb24oKSwKLQkJCQludWxsLAotCQkJCSJzaXplIiwgbnVsbCwgMCwgMSwgR3JhcGhOb2RlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzLAotCQkJCVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmNsYXNzLAotCQkJCSJTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF9UeXBlSW5mbygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInR5cGVJbmZvIiwgIiIsIDAsIDEsIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXVtYVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywKLQkJCQkiVU1BU2VtYW50aWNNb2RlbEJyaWRnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKSwKLQkJCQl0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJlbGVtZW50IiwgbnVsbCwgMSwgMSwgVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY29yZVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsCi0JCQkJIkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJlbGVtZW50IiwgbnVsbCwgMSwgMSwgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWxlYWZFbGVtZW50RUNsYXNzLAotCQkJCUxlYWZFbGVtZW50LmNsYXNzLAotCQkJCSJMZWFmRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0ZXh0RWxlbWVudEVDbGFzcywKLQkJCQlUZXh0RWxlbWVudC5jbGFzcywKLQkJCQkiVGV4dEVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0VGV4dEVsZW1lbnRfVGV4dCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInRleHQiLCAiIiwgMCwgMSwgVGV4dEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJaW1hZ2VFQ2xhc3MsCi0JCQkJSW1hZ2UuY2xhc3MsCi0JCQkJIkltYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEltYWdlX1VyaSgpLAotCQkJCXRoaXMuZ2V0VXJpKCksCi0JCQkJInVyaSIsIG51bGwsIDAsIDEsIEltYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEltYWdlX01pbWVUeXBlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkibWltZVR5cGUiLCAiIiwgMCwgMSwgSW1hZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3JhcGhpY1ByaW1pdGl2ZUVDbGFzcywKLQkJCQlHcmFwaGljUHJpbWl0aXZlLmNsYXNzLAotCQkJCSJHcmFwaGljUHJpbWl0aXZlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXBvbHlsaW5lRUNsYXNzLAotCQkJCVBvbHlsaW5lLmNsYXNzLAotCQkJCSJQb2x5bGluZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQb2x5bGluZV9DbG9zZWQoKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW5PYmplY3QoKSwKLQkJCQkiY2xvc2VkIiwgInRydWUiLCAwLCAxLCBQb2x5bGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFBvbHlsaW5lX1dheXBvaW50cygpLAotCQkJCXRoaXMuZ2V0UG9pbnQoKSwKLQkJCQludWxsLAotCQkJCSJ3YXlwb2ludHMiLCBudWxsLCAyLCAtMSwgUG9seWxpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWVsbGlwc2VFQ2xhc3MsCi0JCQkJRWxsaXBzZS5jbGFzcywKLQkJCQkiRWxsaXBzZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRFbGxpcHNlX1JhZGl1c1goKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RURvdWJsZU9iamVjdCgpLAotCQkJCSJyYWRpdXNYIiwgbnVsbCwgMCwgMSwgRWxsaXBzZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRFbGxpcHNlX1JhZGl1c1koKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RURvdWJsZU9iamVjdCgpLAotCQkJCSJyYWRpdXNZIiwgbnVsbCwgMCwgMSwgRWxsaXBzZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRFbGxpcHNlX1JvdGF0aW9uKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVEb3VibGVPYmplY3QoKSwKLQkJCQkicm90YXRpb24iLCBudWxsLCAwLCAxLCBFbGxpcHNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEVsbGlwc2VfU3RhcnRBbmdsZSgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFRG91YmxlT2JqZWN0KCksCi0JCQkJInN0YXJ0QW5nbGUiLCBudWxsLCAwLCAxLCBFbGxpcHNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEVsbGlwc2VfRW5kQW5nbGUoKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RURvdWJsZU9iamVjdCgpLAotCQkJCSJlbmRBbmdsZSIsIG51bGwsIDAsIDEsIEVsbGlwc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RWxsaXBzZV9DZW50ZXIoKSwKLQkJCQl0aGlzLmdldFBvaW50KCksCi0JCQkJbnVsbCwKLQkJCQkiY2VudGVyIiwgbnVsbCwgMCwgMSwgRWxsaXBzZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlhY3Rpdml0eUVDbGFzcywKLQkJCQlBY3Rpdml0eS5jbGFzcywKLQkJCQkiQWN0aXZpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0aWVzKCksCi0JCQkJImJyZWFrZG93bkVsZW1lbnRzIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBY3Rpdml0eV9Sb2FkbWFwcygpLAotCQkJCXRoaXMuZ2V0Um9hZG1hcCgpLAotCQkJCW51bGwsCi0JCQkJInJvYWRtYXBzIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBY3Rpdml0eV9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJdGhpcy5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSwKLQkJCQludWxsLAotCQkJCSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBY3Rpdml0eV9DaGVja2xpc3RzKCksCi0JCQkJdGhpcy5nZXRDaGVja2xpc3QoKSwKLQkJCQludWxsLAotCQkJCSJjaGVja2xpc3RzIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBY3Rpdml0eV9Db25jZXB0cygpLAotCQkJCXRoaXMuZ2V0Q29uY2VwdCgpLAotCQkJCW51bGwsCi0JCQkJImNvbmNlcHRzIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBY3Rpdml0eV9FeGFtcGxlcygpLAotCQkJCXRoaXMuZ2V0RXhhbXBsZSgpLAotCQkJCW51bGwsCi0JCQkJImV4YW1wbGVzIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBY3Rpdml0eV9HdWlkZWxpbmVzKCksCi0JCQkJdGhpcy5nZXRHdWlkZWxpbmUoKSwKLQkJCQludWxsLAotCQkJCSJndWlkZWxpbmVzIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBY3Rpdml0eV9SZXVzYWJsZUFzc2V0cygpLAotCQkJCXRoaXMuZ2V0UmV1c2FibGVBc3NldCgpLAotCQkJCW51bGwsCi0JCQkJInJldXNhYmxlQXNzZXRzIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRBY3Rpdml0eV9Jc0VuYWN0YWJsZSgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLAotCQkJCSJpc0VuYWN0YWJsZSIsICJmYWxzZSIsIDAsIDEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLAotCQkJCSJXb3JrQnJlYWtkb3duRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLAotCQkJCSJpc1JlcGVhdGFibGUiLCAiZmFsc2UiLCAwLCAxLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLAotCQkJCSJpc09uZ29pbmciLCAiZmFsc2UiLCAwLCAxLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW5PYmplY3QoKSwKLQkJCQkiaXNFdmVudERyaXZlbiIsICJmYWxzZSIsIDAsIDEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQl0aGlzLmdldFdvcmtPcmRlcigpLAotCQkJCW51bGwsCi0JCQkJImxpbmtUb1ByZWRlY2Vzc29yIiwgbnVsbCwgMCwgLTEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCcmVha2Rvd25FbGVtZW50LmNsYXNzLAotCQkJCSJCcmVha2Rvd25FbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwcmVmaXgiLCAiIiwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuT2JqZWN0KCksCi0JCQkJImlzUGxhbm5lZCIsICJ0cnVlIiwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLAotCQkJCSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiwgImZhbHNlIiwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLAotCQkJCSJpc09wdGlvbmFsIiwgImZhbHNlIiwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKSwKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJwcmVzZW50ZWRBZnRlciIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKSwKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJwcmVzZW50ZWRCZWZvcmUiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCksCi0JCQkJdGhpcy5nZXRQbGFubmluZ0RhdGEoKSwKLQkJCQludWxsLAotCQkJCSJwbGFubmluZ0RhdGEiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKSwKLQkJCQl0aGlzLmdldEFjdGl2aXR5KCksCi0JCQkJdGhpcy5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkJCSJzdXBlckFjdGl2aXRpZXMiLCBudWxsLCAxLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltaWxlc3RvbmVFQ2xhc3MsCi0JCQkJTWlsZXN0b25lLmNsYXNzLAotCQkJCSJNaWxlc3RvbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWl0ZXJhdGlvbkVDbGFzcywKLQkJCQlJdGVyYXRpb24uY2xhc3MsCi0JCQkJIkl0ZXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcGhhc2VFQ2xhc3MsCi0JCQkJUGhhc2UuY2xhc3MsCi0JCQkJIlBoYXNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0ZWFtUHJvZmlsZUVDbGFzcywKLQkJCQlUZWFtUHJvZmlsZS5jbGFzcywKLQkJCQkiVGVhbVByb2ZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJdGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJInRlYW1Sb2xlcyIsIG51bGwsIDAsIC0xLCBUZWFtUHJvZmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCksCi0JCQkJdGhpcy5nZXRUZWFtUHJvZmlsZSgpLAotCQkJCXRoaXMuZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpLAotCQkJCSJzdXBlclRlYW0iLCBudWxsLCAxLCAxLCBUZWFtUHJvZmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCksCi0JCQkJdGhpcy5nZXRUZWFtUHJvZmlsZSgpLAotCQkJCXRoaXMuZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCksCi0JCQkJInN1YlRlYW0iLCBudWxsLCAwLCAtMSwgVGVhbVByb2ZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlyb2xlRGVzY3JpcHRvckVDbGFzcywKLQkJCQlSb2xlRGVzY3JpcHRvci5jbGFzcywKLQkJCQkiUm9sZURlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpLAotCQkJCXRoaXMuZ2V0Um9sZSgpLAotCQkJCW51bGwsCi0JCQkJIlJvbGUiLCBudWxsLCAwLCAxLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkibW9kaWZpZXMiLCBudWxsLCAwLCAtMSwgUm9sZURlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkicmVzcG9uc2libGVGb3IiLCBudWxsLCAwLCAtMSwgUm9sZURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl3b3JrT3JkZXJFQ2xhc3MsCi0JCQkJV29ya09yZGVyLmNsYXNzLAotCQkJCSJXb3JrT3JkZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya09yZGVyX0xpbmtUeXBlKCksCi0JCQkJdGhpcy5nZXRXb3JrT3JkZXJUeXBlKCksCi0JCQkJImxpbmtUeXBlIiwgImZpbmlzaFRvU3RhcnQiLCAwLCAxLCBXb3JrT3JkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrT3JkZXJfUHJlZCgpLAotCQkJCXRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJwcmVkIiwgbnVsbCwgMSwgMSwgV29ya09yZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzRWxlbWVudEVDbGFzcywKLQkJCQlQcm9jZXNzRWxlbWVudC5jbGFzcywKLQkJCQkiUHJvY2Vzc0VsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcGxhbm5pbmdEYXRhRUNsYXNzLAotCQkJCVBsYW5uaW5nRGF0YS5jbGFzcywKLQkJCQkiUGxhbm5pbmdEYXRhIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKSwKLQkJCQl0aGlzLmdldERhdGUoKSwKLQkJCQkic3RhcnREYXRlIiwgbnVsbCwgMCwgMSwgUGxhbm5pbmdEYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCksCi0JCQkJdGhpcy5nZXREYXRlKCksCi0JCQkJImZpbmlzaERhdGUiLCBudWxsLCAwLCAxLCBQbGFubmluZ0RhdGEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKSwKLQkJCQl0aGlzLmdldEludGVnZXIoKSwKLQkJCQkicmFuayIsIG51bGwsIDAsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGVzY3JpcHRvckVDbGFzcywKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IuY2xhc3MsCi0JCQkJIkRlc2NyaXB0b3IiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLAotCQkJCSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLCAidHJ1ZSIsIDAsIDEsIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJCSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImFjdGl2aXR5RW50cnlTdGF0ZSIsICIiLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhY3Rpdml0eUV4aXRTdGF0ZSIsICIiLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkiV29ya1Byb2R1Y3QiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSwKLQkJCQkiaW1wYWN0ZWRCeSIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCksCi0JCQkJImltcGFjdHMiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkiZGVsaXZlcmFibGVQYXJ0cyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0YXNrRGVzY3JpcHRvckVDbGFzcywKLQkJCQlUYXNrRGVzY3JpcHRvci5jbGFzcywKLQkJCQkiVGFza0Rlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpLAotCQkJCXRoaXMuZ2V0VGFzaygpLAotCQkJCW51bGwsCi0JCQkJIlRhc2siLCBudWxsLCAwLCAxLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJhc3Npc3RlZEJ5IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJleHRlcm5hbElucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkibWFuZGF0b3J5SW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJIm9wdGlvbmFsSW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkib3V0cHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJwZXJmb3JtZWRQcmltYXJpbHlCeSIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwKLQkJCQl0aGlzLmdldFNlY3Rpb24oKSwKLQkJCQludWxsLAotCQkJCSJzZWxlY3RlZFN0ZXBzIiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY29tcG9zaXRlUm9sZUVDbGFzcywKLQkJCQlDb21wb3NpdGVSb2xlLmNsYXNzLAotCQkJCSJDb21wb3NpdGVSb2xlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCksCi0JCQkJdGhpcy5nZXRSb2xlKCksCi0JCQkJbnVsbCwKLQkJCQkiYWdncmVnYXRlZFJvbGVzIiwgbnVsbCwgMCwgLTEsIENvbXBvc2l0ZVJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJ1c2FnZUd1aWRhbmNlIiwgIiIsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFjdGl2aXR5RGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIkFjdGl2aXR5RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicHVycG9zZSIsICIiLCAwLCAxLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhbHRlcm5hdGl2ZXMiLCAiIiwgMCwgMSwgQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImhvd3RvU3RhZmYiLCAiIiwgMCwgMSwgQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJzY2FsZSIsICIiLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiwgIiIsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicmlza0xldmVsIiwgIiIsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImVzdGltYXRpbmdUZWNobmlxdWUiLCAiIiwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicHJvamVjdE1lbWJlckV4cGVydGlzZSIsICIiLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkidHlwZU9mQ29udHJhY3QiLCAiIiwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiUHJvY2Vzc0Rlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByb2Nlc3NEZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiZXh0ZXJuYWxJZCIsICIiLCAwLCAxLCBQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJzY29wZSIsICIiLCAwLCAxLCBQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInVzYWdlTm90ZXMiLCAiIiwgMCwgMSwgUHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlEZXNjcmlwdG9yRGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIkRlc2NyaXB0b3JEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicmVmaW5lZERlc2NyaXB0aW9uIiwgIiIsIDAsIDEsIERlc2NyaXB0b3JEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb25jZXB0RUNsYXNzLAotCQkJCUNvbmNlcHQuY2xhc3MsCi0JCQkJIkNvbmNlcHQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNoZWNrbGlzdEVDbGFzcywKLQkJCQlDaGVja2xpc3QuY2xhc3MsCi0JCQkJIkNoZWNrbGlzdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZXhhbXBsZUVDbGFzcywKLQkJCQlFeGFtcGxlLmNsYXNzLAotCQkJCSJFeGFtcGxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlndWlkZWxpbmVFQ2xhc3MsCi0JCQkJR3VpZGVsaW5lLmNsYXNzLAotCQkJCSJHdWlkZWxpbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJlcG9ydEVDbGFzcywKLQkJCQlSZXBvcnQuY2xhc3MsCi0JCQkJIlJlcG9ydCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJdGVtcGxhdGVFQ2xhc3MsCi0JCQkJVGVtcGxhdGUuY2xhc3MsCi0JCQkJIlRlbXBsYXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MsCi0JCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLAotCQkJCSJTdXBwb3J0aW5nTWF0ZXJpYWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRvb2xNZW50b3JFQ2xhc3MsCi0JCQkJVG9vbE1lbnRvci5jbGFzcywKLQkJCQkiVG9vbE1lbnRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd2hpdGVwYXBlckVDbGFzcywKLQkJCQlXaGl0ZXBhcGVyLmNsYXNzLAotCQkJCSJXaGl0ZXBhcGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0ZXJtRGVmaW5pdGlvbkVDbGFzcywKLQkJCQlUZXJtRGVmaW5pdGlvbi5jbGFzcywKLQkJCQkiVGVybURlZmluaXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByYWN0aWNlRUNsYXNzLAotCQkJCVByYWN0aWNlLmNsYXNzLAotCQkJCSJQcmFjdGljZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcmFjdGljZV9TdWJQcmFjdGljZXMoKSwKLQkJCQl0aGlzLmdldFByYWN0aWNlKCksCi0JCQkJbnVsbCwKLQkJCQkic3ViUHJhY3RpY2VzIiwgbnVsbCwgMCwgLTEsIFByYWN0aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksCi0JCQkJdGhpcy5nZXRDb250ZW50RWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJImNvbnRlbnRSZWZlcmVuY2VzIiwgbnVsbCwgMCwgLTEsIFByYWN0aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZXMoKSwKLQkJCQl0aGlzLmdldEFjdGl2aXR5KCksCi0JCQkJbnVsbCwKLQkJCQkiYWN0aXZpdHlSZWZlcmVuY2VzIiwgbnVsbCwgMCwgLTEsIFByYWN0aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzLAotCQkJCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5jbGFzcywKLQkJCQkiRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlyZXVzYWJsZUFzc2V0RUNsYXNzLAotCQkJCVJldXNhYmxlQXNzZXQuY2xhc3MsCi0JCQkJIlJldXNhYmxlQXNzZXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXN0YXRlRUNsYXNzLAotCQkJCVN0YXRlLmNsYXNzLAotCQkJCSJTdGF0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRTdGF0ZV9Xb3JrUHJvZHVjdCgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQludWxsLAotCQkJCSJXb3JrUHJvZHVjdCIsIG51bGwsIDEsIC0xLCBTdGF0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0U3RhdGVfUmVnaW9uKCksCi0JCQkJdGhpcy5nZXRSZWdpb24oKSwKLQkJCQl0aGlzLmdldFJlZ2lvbl9TdGF0ZSgpLAotCQkJCSJSZWdpb24iLCBudWxsLCAwLCAtMSwgU3RhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0U3RhdGVfU3VibWFjaGluZSgpLAotCQkJCXRoaXMuZ2V0U3RhdGVNYWNoaW5lKCksCi0JCQkJbnVsbCwKLQkJCQkic3VibWFjaGluZSIsIG51bGwsIDAsIDEsIFN0YXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl2ZXJ0ZXhFQ2xhc3MsCi0JCQkJVmVydGV4LmNsYXNzLAotCQkJCSJWZXJ0ZXgiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VmVydGV4X0NvbnRhaW5lcigpLAotCQkJCXRoaXMuZ2V0UmVnaW9uKCksCi0JCQkJdGhpcy5nZXRSZWdpb25fVmVydGV4KCksCi0JCQkJImNvbnRhaW5lciIsIG51bGwsIDAsIDEsIFZlcnRleC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFZlcnRleF9PdXRnb2luZygpLAotCQkJCXRoaXMuZ2V0VHJhbnNpdGlvbigpLAotCQkJCXRoaXMuZ2V0VHJhbnNpdGlvbl9Tb3VyY2UoKSwKLQkJCQkib3V0Z29pbmciLCBudWxsLCAwLCAtMSwgVmVydGV4LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRWZXJ0ZXhfSW5jb21pbmcoKSwKLQkJCQl0aGlzLmdldFRyYW5zaXRpb24oKSwKLQkJCQl0aGlzLmdldFRyYW5zaXRpb25fVGFyZ2V0KCksCi0JCQkJImluY29taW5nIiwgbnVsbCwgMCwgLTEsIFZlcnRleC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJlZ2lvbkVDbGFzcywKLQkJCQlSZWdpb24uY2xhc3MsCi0JCQkJIlJlZ2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSZWdpb25fVmVydGV4KCksCi0JCQkJdGhpcy5nZXRWZXJ0ZXgoKSwKLQkJCQl0aGlzLmdldFZlcnRleF9Db250YWluZXIoKSwKLQkJCQkiVmVydGV4IiwgbnVsbCwgMCwgLTEsIFJlZ2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSZWdpb25fVHJhbnNpdGlvbigpLAotCQkJCXRoaXMuZ2V0VHJhbnNpdGlvbigpLAotCQkJCXRoaXMuZ2V0VHJhbnNpdGlvbl9Db250YWluZXIoKSwKLQkJCQkiVHJhbnNpdGlvbiIsIG51bGwsIDAsIC0xLCBSZWdpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UmVnaW9uX1N0YXRlKCksCi0JCQkJdGhpcy5nZXRTdGF0ZSgpLAotCQkJCXRoaXMuZ2V0U3RhdGVfUmVnaW9uKCksCi0JCQkJIlN0YXRlIiwgbnVsbCwgMCwgMSwgUmVnaW9uLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UmVnaW9uX1N0YXRlTWFjaGluZSgpLAotCQkJCXRoaXMuZ2V0U3RhdGVNYWNoaW5lKCksCi0JCQkJdGhpcy5nZXRTdGF0ZU1hY2hpbmVfUmVnaW9uKCksCi0JCQkJIlN0YXRlTWFjaGluZSIsIG51bGwsIDAsIDEsIFJlZ2lvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlzdGF0ZU1hY2hpbmVFQ2xhc3MsCi0JCQkJU3RhdGVNYWNoaW5lLmNsYXNzLAotCQkJCSJTdGF0ZU1hY2hpbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0U3RhdGVNYWNoaW5lX1JlZ2lvbigpLAotCQkJCXRoaXMuZ2V0UmVnaW9uKCksCi0JCQkJdGhpcy5nZXRSZWdpb25fU3RhdGVNYWNoaW5lKCksCi0JCQkJIlJlZ2lvbiIsIG51bGwsIDEsIC0xLCBTdGF0ZU1hY2hpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRyYW5zaXRpb25FQ2xhc3MsCi0JCQkJVHJhbnNpdGlvbi5jbGFzcywKLQkJCQkiVHJhbnNpdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUcmFuc2l0aW9uX1dvcmtEZWZpbml0aW9uKCksCi0JCQkJdGhpcy5nZXRXb3JrRGVmaW5pdGlvbigpLAotCQkJCW51bGwsCi0JCQkJIldvcmtEZWZpbml0aW9uIiwgbnVsbCwgMSwgLTEsIFRyYW5zaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRyYW5zaXRpb25fQ29udGFpbmVyKCksCi0JCQkJdGhpcy5nZXRSZWdpb24oKSwKLQkJCQl0aGlzLmdldFJlZ2lvbl9UcmFuc2l0aW9uKCksCi0JCQkJImNvbnRhaW5lciIsIG51bGwsIDEsIDEsIFRyYW5zaXRpb24uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUcmFuc2l0aW9uX1NvdXJjZSgpLAotCQkJCXRoaXMuZ2V0VmVydGV4KCksCi0JCQkJdGhpcy5nZXRWZXJ0ZXhfT3V0Z29pbmcoKSwKLQkJCQkic291cmNlIiwgbnVsbCwgMSwgMSwgVHJhbnNpdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUcmFuc2l0aW9uX1RhcmdldCgpLAotCQkJCXRoaXMuZ2V0VmVydGV4KCksCi0JCQkJdGhpcy5nZXRWZXJ0ZXhfSW5jb21pbmcoKSwKLQkJCQkidGFyZ2V0IiwgbnVsbCwgMSwgMSwgVHJhbnNpdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHNldWRvU3RhdGVFQ2xhc3MsCi0JCQkJUHNldWRvU3RhdGUuY2xhc3MsCi0JCQkJIlBzZXVkb1N0YXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkaXNjaXBsaW5lRUNsYXNzLAotCQkJCURpc2NpcGxpbmUuY2xhc3MsCi0JCQkJIkRpc2NpcGxpbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlzY2lwbGluZV9UYXNrcygpLAotCQkJCXRoaXMuZ2V0VGFzaygpLAotCQkJCW51bGwsCi0JCQkJInRhc2tzIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpc2NpcGxpbmVfU3ViZGlzY2lwbGluZSgpLAotCQkJCXRoaXMuZ2V0RGlzY2lwbGluZSgpLAotCQkJCW51bGwsCi0JCQkJInN1YmRpc2NpcGxpbmUiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpLAotCQkJCXRoaXMuZ2V0QWN0aXZpdHkoKSwKLQkJCQludWxsLAotCQkJCSJyZWZlcmVuY2VXb3JrZmxvd3MiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNvbnRlbnRDYXRlZ29yeUVDbGFzcywKLQkJCQlDb250ZW50Q2F0ZWdvcnkuY2xhc3MsCi0JCQkJIkNvbnRlbnRDYXRlZ29yeSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlyb2xlU2V0RUNsYXNzLAotCQkJCVJvbGVTZXQuY2xhc3MsCi0JCQkJIlJvbGVTZXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Um9sZVNldF9Sb2xlcygpLAotCQkJCXRoaXMuZ2V0Um9sZSgpLAotCQkJCW51bGwsCi0JCQkJInJvbGVzIiwgbnVsbCwgMCwgLTEsIFJvbGVTZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkb21haW5FQ2xhc3MsCi0JCQkJRG9tYWluLmNsYXNzLAotCQkJCSJEb21haW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQludWxsLAotCQkJCSJ3b3JrUHJvZHVjdHMiLCBudWxsLCAwLCAtMSwgRG9tYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREb21haW5fU3ViZG9tYWlucygpLAotCQkJCXRoaXMuZ2V0RG9tYWluKCksCi0JCQkJbnVsbCwKLQkJCQkic3ViZG9tYWlucyIsIG51bGwsIDAsIC0xLCBEb21haW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtQcm9kdWN0VHlwZUVDbGFzcywKLQkJCQlXb3JrUHJvZHVjdFR5cGUuY2xhc3MsCi0JCQkJIldvcmtQcm9kdWN0VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIndvcmtQcm9kdWN0cyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MsCi0JCQkJRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLAotCQkJCSJEaXNjaXBsaW5lR3JvdXBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCksCi0JCQkJdGhpcy5nZXREaXNjaXBsaW5lKCksCi0JCQkJbnVsbCwKLQkJCQkiZGlzY2lwbGluZXMiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJdG9vbEVDbGFzcywKLQkJCQlUb29sLmNsYXNzLAotCQkJCSJUb29sIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRvb2xfVG9vbE1lbnRvcnMoKSwKLQkJCQl0aGlzLmdldFRvb2xNZW50b3IoKSwKLQkJCQludWxsLAotCQkJCSJ0b29sTWVudG9ycyIsIG51bGwsIDAsIC0xLCBUb29sLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcm9sZVNldEdyb3VwaW5nRUNsYXNzLAotCQkJCVJvbGVTZXRHcm91cGluZy5jbGFzcywKLQkJCQkiUm9sZVNldEdyb3VwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpLAotCQkJCXRoaXMuZ2V0Um9sZVNldCgpLAotCQkJCW51bGwsCi0JCQkJInJvbGVTZXRzIiwgbnVsbCwgMCwgLTEsIFJvbGVTZXRHcm91cGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWN1c3RvbUNhdGVnb3J5RUNsYXNzLAotCQkJCUN1c3RvbUNhdGVnb3J5LmNsYXNzLAotCQkJCSJDdXN0b21DYXRlZ29yeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCksCi0JCQkJdGhpcy5nZXREZXNjcmliYWJsZUVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJjYXRlZ29yaXplZEVsZW1lbnRzIiwgbnVsbCwgMCwgLTEsIEN1c3RvbUNhdGVnb3J5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCksCi0JCQkJdGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSwKLQkJCQludWxsLAotCQkJCSJzdWJDYXRlZ29yaWVzIiwgbnVsbCwgMCwgLTEsIEN1c3RvbUNhdGVnb3J5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGVsaXZlcnlQcm9jZXNzRUNsYXNzLAotCQkJCURlbGl2ZXJ5UHJvY2Vzcy5jbGFzcywKLQkJCQkiRGVsaXZlcnlQcm9jZXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbHMoKSwKLQkJCQl0aGlzLmdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLAotCQkJCW51bGwsCi0JCQkJImVkdWNhdGlvbk1hdGVyaWFscyIsIG51bGwsIDAsIC0xLCBEZWxpdmVyeVByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFscygpLAotCQkJCXRoaXMuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCksCi0JCQkJbnVsbCwKLQkJCQkiY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiLCBudWxsLCAwLCAtMSwgRGVsaXZlcnlQcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0VDbGFzcywKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MuY2xhc3MsCi0JCQkJIlByb2Nlc3MiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybnMoKSwKLQkJCQl0aGlzLmdldENhcGFiaWxpdHlQYXR0ZXJuKCksCi0JCQkJbnVsbCwKLQkJCQkiaW5jbHVkZXNQYXR0ZXJucyIsIG51bGwsIDAsIC0xLCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKSwKLQkJCQl0aGlzLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwKLQkJCQludWxsLAotCQkJCSJkZWZhdWx0Q29udGV4dCIsIG51bGwsIDEsIDEsIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpLAotCQkJCXRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInZhbGlkQ29udGV4dCIsIG51bGwsIDAsIC0xLCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljYXBhYmlsaXR5UGF0dGVybkVDbGFzcywKLQkJCQlDYXBhYmlsaXR5UGF0dGVybi5jbGFzcywKLQkJCQkiQ2FwYWJpbGl0eVBhdHRlcm4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLAotCQkJCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmNsYXNzLAotCQkJCSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlZE9uUHJvY2Vzc2VzKCksCi0JCQkJdGhpcy5nZXRQcm9jZXNzKCksCi0JCQkJbnVsbCwKLQkJCQkiYmFzZWRPblByb2Nlc3NlcyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJvYWRtYXBFQ2xhc3MsCi0JCQkJUm9hZG1hcC5jbGFzcywKLQkJCQkiUm9hZG1hcCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0NvbXBvbmVudEVDbGFzcywKLQkJCQlQcm9jZXNzQ29tcG9uZW50LmNsYXNzLAotCQkJCSJQcm9jZXNzQ29tcG9uZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlcygpLAotCQkJCXRoaXMuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpLAotCQkJCW51bGwsCi0JCQkJImludGVyZmFjZXMiLCBudWxsLCAxLCAtMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCksCi0JCQkJdGhpcy5nZXRQcm9jZXNzKCksCi0JCQkJbnVsbCwKLQkJCQkicHJvY2VzcyIsIG51bGwsIDEsIDEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc1BhY2thZ2VFQ2xhc3MsCi0JCQkJUHJvY2Vzc1BhY2thZ2UuY2xhc3MsCi0JCQkJIlByb2Nlc3NQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50cygpLAotCQkJCXRoaXMuZ2V0UHJvY2Vzc0VsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJwcm9jZXNzRWxlbWVudHMiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc1BhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc1BhY2thZ2VfRGlhZ3JhbXMoKSwKLQkJCQl0aGlzLmdldERpYWdyYW0oKSwKLQkJCQludWxsLAotCQkJCSJkaWFncmFtcyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzUGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywKLQkJCQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLAotCQkJCSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKSwKLQkJCQl0aGlzLmdldFRhc2tEZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkiaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJpbnRlcmZhY2VJTyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckVDbGFzcywKLQkJCQlQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5jbGFzcywKLQkJCQkiUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudCgpLAotCQkJCXRoaXMuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpLAotCQkJCW51bGwsCi0JCQkJIlByb2Nlc3NDb21wb25lbnQiLCBudWxsLCAxLCAxLCBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJbWV0aG9kUGx1Z2luRUNsYXNzLAotCQkJCU1ldGhvZFBsdWdpbi5jbGFzcywKLQkJCQkiTWV0aG9kUGx1Z2luIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLAotCQkJCSJ1c2VyQ2hhbmdlYWJsZSIsICJ0cnVlIiwgMCwgMSwgTWV0aG9kUGx1Z2luLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2VzKCksCi0JCQkJdGhpcy5nZXRNZXRob2RQYWNrYWdlKCksCi0JCQkJbnVsbCwKLQkJCQkibWV0aG9kUGFja2FnZXMiLCBudWxsLCAxLCAtMSwgTWV0aG9kUGx1Z2luLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZFBsdWdpbl9CYXNlcygpLAotCQkJCXRoaXMuZ2V0TWV0aG9kUGx1Z2luKCksCi0JCQkJbnVsbCwKLQkJCQkiYmFzZXMiLCBudWxsLCAwLCAtMSwgTWV0aG9kUGx1Z2luLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzLAotCQkJCVZhcmlhYmlsaXR5RWxlbWVudC5jbGFzcywKLQkJCQkiVmFyaWFiaWxpdHlFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpLAotCQkJCXRoaXMuZ2V0VmFyaWFiaWxpdHlUeXBlKCksCi0JCQkJInZhcmlhYmlsaXR5VHlwZSIsICJuYSIsIDAsIDEsIFZhcmlhYmlsaXR5RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksCi0JCQkJdGhpcy5nZXRWYXJpYWJpbGl0eUVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiwgbnVsbCwgMSwgMSwgVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RVbml0RUNsYXNzLAotCQkJCU1ldGhvZFVuaXQuY2xhc3MsCi0JCQkJIk1ldGhvZFVuaXQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RVbml0X0F1dGhvcnMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhdXRob3JzIiwgIiIsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKSwKLQkJCQl0aGlzLmdldERhdGUoKSwKLQkJCQkiY2hhbmdlRGF0ZSIsIG51bGwsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImNoYW5nZURlc2NyaXB0aW9uIiwgIiIsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RVbml0X1ZlcnNpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJ2ZXJzaW9uIiwgIiIsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpLAotCQkJCXRoaXMuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCksCi0JCQkJbnVsbCwKLQkJCQkiY29weXJpZ2h0U3RhdGVtZW50IiwgbnVsbCwgMSwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLAotCQkJCSJNZXRob2RDb25maWd1cmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksCi0JCQkJdGhpcy5nZXRNZXRob2RQbHVnaW4oKSwKLQkJCQludWxsLAotCQkJCSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iLCBudWxsLCAxLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksCi0JCQkJdGhpcy5nZXRNZXRob2RQYWNrYWdlKCksCi0JCQkJbnVsbCwKLQkJCQkibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIsIG51bGwsIDEsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpLAotCQkJCXRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCksCi0JCQkJbnVsbCwKLQkJCQkicHJvY2Vzc1ZpZXdzIiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLAotCQkJCW51bGwsCi0JCQkJImRlZmF1bHRWaWV3IiwgbnVsbCwgMSwgMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9ucygpLAotCQkJCXRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLAotCQkJCW51bGwsCi0JCQkJImJhc2VDb25maWd1cmF0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpLAotCQkJCXRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCksCi0JCQkJbnVsbCwKLQkJCQkic3VidHJhY3RlZENhdGVnb3J5IiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpLAotCQkJCXRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCksCi0JCQkJbnVsbCwKLQkJCQkiYWRkZWRDYXRlZ29yeSIsIG51bGwsIDAsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0ZhbWlseUVDbGFzcywKLQkJCQlQcm9jZXNzRmFtaWx5LmNsYXNzLAotCQkJCSJQcm9jZXNzRmFtaWx5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NGYW1pbHlfRGVsaXZlcnlQcm9jZXNzZXMoKSwKLQkJCQl0aGlzLmdldERlbGl2ZXJ5UHJvY2VzcygpLAotCQkJCW51bGwsCi0JCQkJImRlbGl2ZXJ5UHJvY2Vzc2VzIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NGYW1pbHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RMaWJyYXJ5RUNsYXNzLAotCQkJCU1ldGhvZExpYnJhcnkuY2xhc3MsCi0JCQkJIk1ldGhvZExpYnJhcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCksCi0JCQkJdGhpcy5nZXRNZXRob2RQbHVnaW4oKSwKLQkJCQludWxsLAotCQkJCSJtZXRob2RQbHVnaW5zIiwgbnVsbCwgMCwgLTEsIE1ldGhvZExpYnJhcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwKLQkJCQludWxsLAotCQkJCSJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kTGlicmFyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bSh3b3JrT3JkZXJUeXBlRUVudW0sIFdvcmtPcmRlclR5cGUuY2xhc3MsICJXb3JrT3JkZXJUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwKLQkJCQlXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwKLQkJCQlXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0hfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh3b3JrT3JkZXJUeXBlRUVudW0sCi0JCQkJV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwKLQkJCQlXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX0ZJTklTSF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0ocHNldWRvU3RhdGVLaW5kRUVudW0sIFBzZXVkb1N0YXRlS2luZC5jbGFzcywKLQkJCQkiUHNldWRvU3RhdGVLaW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHBzZXVkb1N0YXRlS2luZEVFbnVtLCBQc2V1ZG9TdGF0ZUtpbmQuSU5JVElBTF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHBzZXVkb1N0YXRlS2luZEVFbnVtLCBQc2V1ZG9TdGF0ZUtpbmQuSk9JTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHBzZXVkb1N0YXRlS2luZEVFbnVtLCBQc2V1ZG9TdGF0ZUtpbmQuRk9SS19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHBzZXVkb1N0YXRlS2luZEVFbnVtLCBQc2V1ZG9TdGF0ZUtpbmQuSlVOQ1RJT05fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwc2V1ZG9TdGF0ZUtpbmRFRW51bSwgUHNldWRvU3RhdGVLaW5kLkNIT0lDRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHBzZXVkb1N0YXRlS2luZEVFbnVtLAotCQkJCVBzZXVkb1N0YXRlS2luZC5FTlRSWV9QT0lOVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHBzZXVkb1N0YXRlS2luZEVFbnVtLAotCQkJCVBzZXVkb1N0YXRlS2luZC5FWElUX1BPSU5UX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHNldWRvU3RhdGVLaW5kRUVudW0sIFBzZXVkb1N0YXRlS2luZC5URVJNSU5BVEVfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuY2xhc3MsCi0JCQkJIlZhcmlhYmlsaXR5VHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sCi0JCQkJVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLAotCQkJCVZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwKLQkJCQlWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwKLQkJCQlWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFU19MSVRFUkFMKTsKLQotCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLQkJaW5pdEVEYXRhVHlwZShkYXRlRURhdGFUeXBlLCBEYXRlLmNsYXNzLAotCQkJCSJEYXRlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHVyaUVEYXRhVHlwZSwgamF2YS5uZXQuVVJJLmNsYXNzLAotCQkJCSJVcmkiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoCi0JCQkJdW5saW1pdGVkTmF0dXJhbEVEYXRhVHlwZSwKLQkJCQlpbnQuY2xhc3MsCi0JCQkJIlVubGltaXRlZE5hdHVyYWwiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoc3RyaW5nRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsCi0JCQkJIlN0cmluZyIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShzZXRFRGF0YVR5cGUsIFNldC5jbGFzcywKLQkJCQkiU2V0IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHNlcXVlbmNlRURhdGFUeXBlLCBMaXN0LmNsYXNzLAotCQkJCSJTZXF1ZW5jZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShpbnRlZ2VyRURhdGFUeXBlLCBpbnQuY2xhc3MsCi0JCQkJIkludGVnZXIiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoZmxvYXRFRGF0YVR5cGUsIEZsb2F0LmNsYXNzLAotCQkJCSJGbG9hdCIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vVW1hUGFja2FnZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9WYXJpYWJpbGl0eUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9WYXJpYWJpbGl0eUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3ODgyOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVmFyaWFiaWxpdHlFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYXJpYWJpbGl0eSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVmFyaWFiaWxpdHlFbGVtZW50SW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WYXJpYWJpbGl0eUVsZW1lbnRJbXBsI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYXJpYWJpbGl0eUVsZW1lbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBWYXJpYWJpbGl0eUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQgPSBWYXJpYWJpbGl0eVR5cGUuTkFfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5RWxlbWVudCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgbmV3VmFyaWFiaWxpdHlUeXBlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSBvbGRWYXJpYWJpbGl0eVR5cGUgPSB2YXJpYWJpbGl0eVR5cGU7Ci0JCXZhcmlhYmlsaXR5VHlwZSA9IG5ld1ZhcmlhYmlsaXR5VHlwZSA9PSBudWxsID8gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVAotCQkJCTogbmV3VmFyaWFiaWxpdHlUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCW9sZFZhcmlhYmlsaXR5VHlwZSwgdmFyaWFiaWxpdHlUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudCBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlpZiAodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsCi0JCQkJJiYgKChFT2JqZWN0KSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJCWlmICh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJCW9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsCi0JCQkJCQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnQgYmFzaWNHZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXNldFZhcmlhYmlsaXR5VHlwZSgoVmFyaWFiaWxpdHlUeXBlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXNldFZhcmlhYmlsaXR5VHlwZShWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXJldHVybiB2YXJpYWJpbGl0eVR5cGUgIT0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhcmlhYmlsaXR5VHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2YXJpYWJpbGl0eVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9WYXJpYWJpbGl0eUVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9WZXJ0ZXhJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9WZXJ0ZXhJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxMTllOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVmVydGV4SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZlcnRleDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZlcnRleEltcGwjZ2V0Q29udGFpbmVyXyA8ZW0+Q29udGFpbmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVmVydGV4SW1wbCNnZXRPdXRnb2luZyA8ZW0+T3V0Z29pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WZXJ0ZXhJbXBsI2dldEluY29taW5nIDxlbT5JbmNvbWluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZlcnRleEltcGwgZXh0ZW5kcyBNdWx0aVJlc291cmNlRU9iamVjdCBpbXBsZW1lbnRzIFZlcnRleCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRnb2luZygpIDxlbT5PdXRnb2luZzwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRnb2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG91dGdvaW5nID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY29taW5nKCkgPGVtPkluY29taW5nPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluY29taW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5jb21pbmcgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFZlcnRleEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlZFUlRFWDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVnaW9uIGdldENvbnRhaW5lcl8oKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuVkVSVEVYX19DT05UQUlORVIpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChSZWdpb24pIGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVnaW9uIGJhc2ljR2V0Q29udGFpbmVyKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlZFUlRFWF9fQ09OVEFJTkVSKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoUmVnaW9uKSBlSW50ZXJuYWxDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb250YWluZXIoUmVnaW9uIG5ld0NvbnRhaW5lciwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdDb250YWluZXIsCi0JCQkJVW1hUGFja2FnZS5WRVJURVhfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihSZWdpb24gbmV3Q29udGFpbmVyKSB7Ci0JCWlmIChuZXdDb250YWluZXIgIT0gZUludGVybmFsQ29udGFpbmVyKCkKLQkJCQl8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlZFUlRFWF9fQ09OVEFJTkVSICYmIG5ld0NvbnRhaW5lciAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIChFT2JqZWN0KSBuZXdDb250YWluZXIpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3Q29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdDb250YWluZXIpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlJFR0lPTl9fVkVSVEVYLCBSZWdpb24uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29udGFpbmVyKG5ld0NvbnRhaW5lciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVkVSVEVYX19DT05UQUlORVIsIG5ld0NvbnRhaW5lciwgbmV3Q29udGFpbmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0T3V0Z29pbmcoKSB7Ci0JCWlmIChvdXRnb2luZyA9PSBudWxsKSB7Ci0JCQlvdXRnb2luZyA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdChUcmFuc2l0aW9uLmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLlZFUlRFWF9fT1VUR09JTkcsCi0JCQkJCVVtYVBhY2thZ2UuVFJBTlNJVElPTl9fU09VUkNFKTsKLQkJfQotCQlyZXR1cm4gb3V0Z29pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW5jb21pbmcoKSB7Ci0JCWlmIChpbmNvbWluZyA9PSBudWxsKSB7Ci0JCQlpbmNvbWluZyA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdChUcmFuc2l0aW9uLmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLlZFUlRFWF9fSU5DT01JTkcsCi0JCQkJCVVtYVBhY2thZ2UuVFJBTlNJVElPTl9fVEFSR0VUKTsKLQkJfQotCQlyZXR1cm4gaW5jb21pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlZFUlRFWF9fQ09OVEFJTkVSOgotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRDb250YWluZXIoKFJlZ2lvbikgb3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuVkVSVEVYX19PVVRHT0lORzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldE91dGdvaW5nKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlZFUlRFWF9fSU5DT01JTkc6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRJbmNvbWluZygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WRVJURVhfX0NPTlRBSU5FUjoKLQkJCXJldHVybiBiYXNpY1NldENvbnRhaW5lcihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlZFUlRFWF9fT1VUR09JTkc6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRPdXRnb2luZygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5WRVJURVhfX0lOQ09NSU5HOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0SW5jb21pbmcoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkVSVEVYX19DT05UQUlORVI6Ci0JCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJVW1hUGFja2FnZS5SRUdJT05fX1ZFUlRFWCwgUmVnaW9uLmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkVSVEVYX19DT05UQUlORVI6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyXygpOwotCQkJcmV0dXJuIGJhc2ljR2V0Q29udGFpbmVyKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5WRVJURVhfX09VVEdPSU5HOgotCQkJcmV0dXJuIGdldE91dGdvaW5nKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5WRVJURVhfX0lOQ09NSU5HOgotCQkJcmV0dXJuIGdldEluY29taW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlZFUlRFWF9fQ09OVEFJTkVSOgotCQkJc2V0Q29udGFpbmVyKChSZWdpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlZFUlRFWF9fT1VUR09JTkc6Ci0JCQlnZXRPdXRnb2luZygpLmNsZWFyKCk7Ci0JCQlnZXRPdXRnb2luZygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVkVSVEVYX19JTkNPTUlORzoKLQkJCWdldEluY29taW5nKCkuY2xlYXIoKTsKLQkJCWdldEluY29taW5nKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkVSVEVYX19DT05UQUlORVI6Ci0JCQlzZXRDb250YWluZXIoKFJlZ2lvbikgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5WRVJURVhfX09VVEdPSU5HOgotCQkJZ2V0T3V0Z29pbmcoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVkVSVEVYX19JTkNPTUlORzoKLQkJCWdldEluY29taW5nKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlZFUlRFWF9fQ09OVEFJTkVSOgotCQkJcmV0dXJuIGJhc2ljR2V0Q29udGFpbmVyKCkgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlZFUlRFWF9fT1VUR09JTkc6Ci0JCQlyZXR1cm4gb3V0Z29pbmcgIT0gbnVsbCAmJiAhb3V0Z29pbmcuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVkVSVEVYX19JTkNPTUlORzoKLQkJCXJldHVybiBpbmNvbWluZyAhPSBudWxsICYmICFpbmNvbWluZy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1ZlcnRleEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9XaGl0ZXBhcGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV2hpdGVwYXBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDBjZDVhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9XaGl0ZXBhcGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdoaXRlcGFwZXJJbXBsIGV4dGVuZHMgQ29uY2VwdEltcGwgaW1wbGVtZW50cyBXaGl0ZXBhcGVyIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXaGl0ZXBhcGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV0hJVEVQQVBFUjsKLQl9Ci0KLX0gLy9XaGl0ZXBhcGVySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzA3YWUxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0SXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsI2dldElzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNnZXRJc0V2ZW50RHJpdmVuIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0TGlua1RvUHJlZGVjZXNzb3IgPGVtPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIFdvcmtCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1JlcGVhdGFibGUoKSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSVNfUkVQRUFUQUJMRV9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1JlcGVhdGFibGUoKSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc1JlcGVhdGFibGUgPSBJU19SRVBFQVRBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzT25nb2luZygpIDxlbT5JcyBPbmdvaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc09uZ29pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19PTkdPSU5HX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzT25nb2luZygpIDxlbT5JcyBPbmdvaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc09uZ29pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzT25nb2luZyA9IElTX09OR09JTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNFdmVudERyaXZlbigpIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzRXZlbnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19FVkVOVF9EUklWRU5fRURFRkFVTFQgPSBCb29sZWFuLkZBTFNFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNFdmVudERyaXZlbigpIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzRXZlbnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzRXZlbnREcml2ZW4gPSBJU19FVkVOVF9EUklWRU5fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rVG9QcmVkZWNlc3NvcigpIDxlbT5MaW5rIFRvIFByZWRlY2Vzc29yPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtUb1ByZWRlY2Vzc29yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbGlua1RvUHJlZGVjZXNzb3IgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc1JlcGVhdGFibGUoKSB7Ci0JCXJldHVybiBpc1JlcGVhdGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNSZXBlYXRhYmxlKEJvb2xlYW4gbmV3SXNSZXBlYXRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkSXNSZXBlYXRhYmxlID0gaXNSZXBlYXRhYmxlOwotCQlpc1JlcGVhdGFibGUgPSBuZXdJc1JlcGVhdGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSwKLQkJCQkJb2xkSXNSZXBlYXRhYmxlLCBpc1JlcGVhdGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc09uZ29pbmcoKSB7Ci0JCXJldHVybiBpc09uZ29pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNPbmdvaW5nKEJvb2xlYW4gbmV3SXNPbmdvaW5nKSB7Ci0JCUJvb2xlYW4gb2xkSXNPbmdvaW5nID0gaXNPbmdvaW5nOwotCQlpc09uZ29pbmcgPSBuZXdJc09uZ29pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORywKLQkJCQkJb2xkSXNPbmdvaW5nLCBpc09uZ29pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc0V2ZW50RHJpdmVuKCkgewotCQlyZXR1cm4gaXNFdmVudERyaXZlbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0V2ZW50RHJpdmVuKEJvb2xlYW4gbmV3SXNFdmVudERyaXZlbikgewotCQlCb29sZWFuIG9sZElzRXZlbnREcml2ZW4gPSBpc0V2ZW50RHJpdmVuOwotCQlpc0V2ZW50RHJpdmVuID0gbmV3SXNFdmVudERyaXZlbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4sCi0JCQkJCW9sZElzRXZlbnREcml2ZW4sIGlzRXZlbnREcml2ZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMaW5rVG9QcmVkZWNlc3NvcigpIHsKLQkJaWYgKGxpbmtUb1ByZWRlY2Vzc29yID09IG51bGwpIHsKLQkJCWxpbmtUb1ByZWRlY2Vzc29yID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChXb3JrT3JkZXIuY2xhc3MsCi0JCQkJCXRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUik7Ci0JCX0KLQkJcmV0dXJuIGxpbmtUb1ByZWRlY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCQlyZXR1cm4gZ2V0SXNSZXBlYXRhYmxlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJcmV0dXJuIGdldElzT25nb2luZygpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJcmV0dXJuIGdldElzRXZlbnREcml2ZW4oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1I6Ci0JCQlyZXR1cm4gZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJCXNldElzUmVwZWF0YWJsZSgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCXNldElzT25nb2luZygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJc2V0SXNFdmVudERyaXZlbigoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjoKLQkJCWdldExpbmtUb1ByZWRlY2Vzc29yKCkuY2xlYXIoKTsKLQkJCWdldExpbmtUb1ByZWRlY2Vzc29yKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJCXNldElzUmVwZWF0YWJsZShJU19SRVBFQVRBQkxFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCQlzZXRJc09uZ29pbmcoSVNfT05HT0lOR19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlzZXRJc0V2ZW50RHJpdmVuKElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJCXJldHVybiBJU19SRVBFQVRBQkxFX0VERUZBVUxUID09IG51bGwgPyBpc1JlcGVhdGFibGUgIT0gbnVsbAotCQkJCQk6ICFJU19SRVBFQVRBQkxFX0VERUZBVUxULmVxdWFscyhpc1JlcGVhdGFibGUpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCXJldHVybiBJU19PTkdPSU5HX0VERUZBVUxUID09IG51bGwgPyBpc09uZ29pbmcgIT0gbnVsbAotCQkJCQk6ICFJU19PTkdPSU5HX0VERUZBVUxULmVxdWFscyhpc09uZ29pbmcpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJcmV0dXJuIElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVCA9PSBudWxsID8gaXNFdmVudERyaXZlbiAhPSBudWxsCi0JCQkJCTogIUlTX0VWRU5UX0RSSVZFTl9FREVGQVVMVC5lcXVhbHMoaXNFdmVudERyaXZlbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJcmV0dXJuIGxpbmtUb1ByZWRlY2Vzc29yICE9IG51bGwgJiYgIWxpbmtUb1ByZWRlY2Vzc29yLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpc1JlcGVhdGFibGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNSZXBlYXRhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc09uZ29pbmc6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNPbmdvaW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc0V2ZW50RHJpdmVuOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzRXZlbnREcml2ZW4pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtEZWZpbml0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya0RlZmluaXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0YWU0NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya0RlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbCNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbCNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV29ya0RlZmluaXRpb25JbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlXb3JrRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjb25kaXRpb24oKSA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50IHByZWNvbmRpdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50IHBvc3Rjb25kaXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtEZWZpbml0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFByZWNvbmRpdGlvbigpIHsKLQkJaWYgKHByZWNvbmRpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlY29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJcHJlY29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUHJlY29uZGl0aW9uKTsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gb2xkUHJlY29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1ByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUHJlY29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG51bGwpOwotCQkJCWlmIChuZXdQcmVjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UHJlY29uZGl0aW9uLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCQkJCW9sZFByZWNvbmRpdGlvbiwgcHJlY29uZGl0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBiYXNpY0dldFByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVjb25kaXRpb24oQ29uc3RyYWludCBuZXdQcmVjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUHJlY29uZGl0aW9uID0gcHJlY29uZGl0aW9uOwotCQlwcmVjb25kaXRpb24gPSBuZXdQcmVjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJCW9sZFByZWNvbmRpdGlvbiwgbmV3UHJlY29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbikgewotCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IHByZWNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZWNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UHJlY29uZGl0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByZWNvbmRpdGlvbihuZXdQcmVjb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLCBuZXdQcmVjb25kaXRpb24sCi0JCQkJCW5ld1ByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQlwb3N0Y29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBvbGRQb3N0Y29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Bvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQb3N0Y29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJCQludWxsLCBudWxsKTsKLQkJCQlpZiAobmV3UG9zdGNvbmRpdGlvbi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQb3N0Y29uZGl0aW9uCi0JCQkJCQkJLmVJbnZlcnNlQWRkKAotCQkJCQkJCQkJdGhpcywKLQkJCQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJCQkJLSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQkJCQlvbGRQb3N0Y29uZGl0aW9uLCBwb3N0Y29uZGl0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgYmFzaWNHZXRQb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UG9zdGNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQb3N0Y29uZGl0aW9uID0gcG9zdGNvbmRpdGlvbjsKLQkJcG9zdGNvbmRpdGlvbiA9IG5ld1Bvc3Rjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCQlvbGRQb3N0Y29uZGl0aW9uLCBuZXdQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IHBvc3Rjb25kaXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQb3N0Y29uZGl0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKG5ld1Bvc3Rjb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQkJbmV3UG9zdGNvbmRpdGlvbiwgbmV3UG9zdGNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFByZWNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFBvc3Rjb25kaXRpb24obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZWNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJlY29uZGl0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCXNldFByZWNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQlyZXR1cm4gcHJlY29uZGl0aW9uICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gcG9zdGNvbmRpdGlvbiAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Xb3JrRGVmaW5pdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtPcmRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtPcmRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzE0NThlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrT3JkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgT3JkZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsI2dldFByZWQgPGVtPlByZWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrT3JkZXJJbXBsIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnRJbXBsIGltcGxlbWVudHMgV29ya09yZGVyIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rVHlwZSgpIDxlbT5MaW5rIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFdvcmtPcmRlclR5cGUgTElOS19UWVBFX0VERUZBVUxUID0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlRfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUeXBlKCkgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrT3JkZXJUeXBlIGxpbmtUeXBlID0gTElOS19UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZCgpIDxlbT5QcmVkPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya09yZGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19PUkRFUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyVHlwZSBnZXRMaW5rVHlwZSgpIHsKLQkJcmV0dXJuIGxpbmtUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmtUeXBlKFdvcmtPcmRlclR5cGUgbmV3TGlua1R5cGUpIHsKLQkJV29ya09yZGVyVHlwZSBvbGRMaW5rVHlwZSA9IGxpbmtUeXBlOwotCQlsaW5rVHlwZSA9IG5ld0xpbmtUeXBlID09IG51bGwgPyBMSU5LX1RZUEVfRURFRkFVTFQgOiBuZXdMaW5rVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEUsIG9sZExpbmtUeXBlLCBsaW5rVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrQnJlYWtkb3duRWxlbWVudCBnZXRQcmVkKCkgewotCQlpZiAocHJlZCAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlZCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByZWQgPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVkOwotCQkJcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRQcmVkKTsKLQkJCWlmIChwcmVkICE9IG9sZFByZWQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuV09SS19PUkRFUl9fUFJFRCwgb2xkUHJlZCwgcHJlZCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrQnJlYWtkb3duRWxlbWVudCBiYXNpY0dldFByZWQoKSB7Ci0JCXJldHVybiBwcmVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWQoV29ya0JyZWFrZG93bkVsZW1lbnQgbmV3UHJlZCkgewotCQlXb3JrQnJlYWtkb3duRWxlbWVudCBvbGRQcmVkID0gcHJlZDsKLQkJcHJlZCA9IG5ld1ByZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19PUkRFUl9fUFJFRCwgb2xkUHJlZCwgcHJlZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRToKLQkJCXJldHVybiBnZXRMaW5rVHlwZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fUFJFRDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQcmVkKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRToKLQkJCXNldExpbmtUeXBlKChXb3JrT3JkZXJUeXBlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVEOgotCQkJc2V0UHJlZCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEU6Ci0JCQlzZXRMaW5rVHlwZShMSU5LX1RZUEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fUFJFRDoKLQkJCXNldFByZWQoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRToKLQkJCXJldHVybiBsaW5rVHlwZSAhPSBMSU5LX1RZUEVfRURFRkFVTFQ7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVEOgotCQkJcmV0dXJuIHByZWQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsaW5rVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsaW5rVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtPcmRlckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NGI0ZTQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwjZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxJZCgpIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfSURfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsSWQoKSA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZXJuYWxJZCA9IEVYVEVSTkFMX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVSUE9TRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1cnBvc2UgPSBQVVJQT1NFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGFjdE9mTm90SGF2aW5nKCkgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbXBhY3RPZk5vdEhhdmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QQUNUX09GX05PVF9IQVZJTkdfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGFjdE9mTm90SGF2aW5nKCkgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbXBhY3RPZk5vdEhhdmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpbXBhY3RPZk5vdEhhdmluZyA9IElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZWFzb25zRm9yTm90TmVlZGluZyA9IFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbElkKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxJZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbElkKFN0cmluZyBuZXdFeHRlcm5hbElkKSB7Ci0JCVN0cmluZyBvbGRFeHRlcm5hbElkID0gZXh0ZXJuYWxJZDsKLQkJZXh0ZXJuYWxJZCA9IG5ld0V4dGVybmFsSWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCwKLQkJCQkJb2xkRXh0ZXJuYWxJZCwgZXh0ZXJuYWxJZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVycG9zZSgpIHsKLQkJcmV0dXJuIHB1cnBvc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVycG9zZShTdHJpbmcgbmV3UHVycG9zZSkgewotCQlTdHJpbmcgb2xkUHVycG9zZSA9IHB1cnBvc2U7Ci0JCXB1cnBvc2UgPSBuZXdQdXJwb3NlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwKLQkJCQkJcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKSB7Ci0JCXJldHVybiBpbXBhY3RPZk5vdEhhdmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbXBhY3RPZk5vdEhhdmluZyhTdHJpbmcgbmV3SW1wYWN0T2ZOb3RIYXZpbmcpIHsKLQkJU3RyaW5nIG9sZEltcGFjdE9mTm90SGF2aW5nID0gaW1wYWN0T2ZOb3RIYXZpbmc7Ci0JCWltcGFjdE9mTm90SGF2aW5nID0gbmV3SW1wYWN0T2ZOb3RIYXZpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORywKLQkJCQkJb2xkSW1wYWN0T2ZOb3RIYXZpbmcsIGltcGFjdE9mTm90SGF2aW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIHsKLQkJcmV0dXJuIHJlYXNvbnNGb3JOb3ROZWVkaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFN0cmluZyBuZXdSZWFzb25zRm9yTm90TmVlZGluZykgewotCQlTdHJpbmcgb2xkUmVhc29uc0Zvck5vdE5lZWRpbmcgPSByZWFzb25zRm9yTm90TmVlZGluZzsKLQkJcmVhc29uc0Zvck5vdE5lZWRpbmcgPSBuZXdSZWFzb25zRm9yTm90TmVlZGluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORywKLQkJCQkJb2xkUmVhc29uc0Zvck5vdE5lZWRpbmcsIHJlYXNvbnNGb3JOb3ROZWVkaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCXJldHVybiBnZXRFeHRlcm5hbElkKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlyZXR1cm4gZ2V0UHVycG9zZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJCXJldHVybiBnZXRJbXBhY3RPZk5vdEhhdmluZygpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCXJldHVybiBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJc2V0RXh0ZXJuYWxJZCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlzZXRQdXJwb3NlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCQlzZXRJbXBhY3RPZk5vdEhhdmluZygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQlzZXRFeHRlcm5hbElkKEVYVEVSTkFMX0lEX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJc2V0SW1wYWN0T2ZOb3RIYXZpbmcoSU1QQUNUX09GX05PVF9IQVZJTkdfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCXNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQlyZXR1cm4gRVhURVJOQUxfSURfRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVybmFsSWQgIT0gbnVsbAotCQkJCQk6ICFFWFRFUk5BTF9JRF9FREVGQVVMVC5lcXVhbHMoZXh0ZXJuYWxJZCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlyZXR1cm4gUFVSUE9TRV9FREVGQVVMVCA9PSBudWxsID8gcHVycG9zZSAhPSBudWxsCi0JCQkJCTogIVBVUlBPU0VfRURFRkFVTFQuZXF1YWxzKHB1cnBvc2UpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJCXJldHVybiBJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVCA9PSBudWxsID8gaW1wYWN0T2ZOb3RIYXZpbmcgIT0gbnVsbAotCQkJCQk6ICFJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVC5lcXVhbHMoaW1wYWN0T2ZOb3RIYXZpbmcpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCXJldHVybiBSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVCA9PSBudWxsID8gcmVhc29uc0Zvck5vdE5lZWRpbmcgIT0gbnVsbAotCQkJCQk6ICFSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMocmVhc29uc0Zvck5vdE5lZWRpbmcpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGV4dGVybmFsSWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZXh0ZXJuYWxJZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVycG9zZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwdXJwb3NlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbXBhY3RPZk5vdEhhdmluZzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpbXBhY3RPZk5vdEhhdmluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhc29uc0Zvck5vdE5lZWRpbmc6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmVhc29uc0Zvck5vdE5lZWRpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlODk0MzAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEltcGFjdGVkQnkgPGVtPkltcGFjdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXREZWxpdmVyYWJsZVBhcnRzIDxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgZXh0ZW5kcyBEZXNjcmlwdG9ySW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2aXR5RW50cnlTdGF0ZSA9IEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2aXR5RXhpdFN0YXRlID0gQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtQcm9kdWN0KCkgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBhY3RlZEJ5KCkgPGVtPkltcGFjdGVkIEJ5PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcGFjdGVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbXBhY3RlZEJ5ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGFjdHMoKSA8ZW0+SW1wYWN0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbXBhY3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW1wYWN0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWxpdmVyYWJsZVBhcnRzKCkgPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGl2ZXJhYmxlUGFydHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZWxpdmVyYWJsZVBhcnRzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGl2aXR5RW50cnlTdGF0ZSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RW50cnlTdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eUVudHJ5U3RhdGUoU3RyaW5nIG5ld0FjdGl2aXR5RW50cnlTdGF0ZSkgewotCQlTdHJpbmcgb2xkQWN0aXZpdHlFbnRyeVN0YXRlID0gYWN0aXZpdHlFbnRyeVN0YXRlOwotCQlhY3Rpdml0eUVudHJ5U3RhdGUgPSBuZXdBY3Rpdml0eUVudHJ5U3RhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFLAotCQkJCQlvbGRBY3Rpdml0eUVudHJ5U3RhdGUsIGFjdGl2aXR5RW50cnlTdGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUV4aXRTdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eUV4aXRTdGF0ZShTdHJpbmcgbmV3QWN0aXZpdHlFeGl0U3RhdGUpIHsKLQkJU3RyaW5nIG9sZEFjdGl2aXR5RXhpdFN0YXRlID0gYWN0aXZpdHlFeGl0U3RhdGU7Ci0JCWFjdGl2aXR5RXhpdFN0YXRlID0gbmV3QWN0aXZpdHlFeGl0U3RhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUsCi0JCQkJCW9sZEFjdGl2aXR5RXhpdFN0YXRlLCBhY3Rpdml0eUV4aXRTdGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdCBnZXRXb3JrUHJvZHVjdCgpIHsKLQkJaWYgKHdvcmtQcm9kdWN0ICE9IG51bGwgJiYgKChFT2JqZWN0KSB3b3JrUHJvZHVjdCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFdvcmtQcm9kdWN0ID0gKEludGVybmFsRU9iamVjdCkgd29ya1Byb2R1Y3Q7Ci0JCQl3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCkgZVJlc29sdmVQcm94eShvbGRXb3JrUHJvZHVjdCk7Ci0JCQlpZiAod29ya1Byb2R1Y3QgIT0gb2xkV29ya1Byb2R1Y3QpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCwKLQkJCQkJCQlvbGRXb3JrUHJvZHVjdCwgd29ya1Byb2R1Y3QpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gd29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0IGJhc2ljR2V0V29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCBuZXdXb3JrUHJvZHVjdCkgewotCQlXb3JrUHJvZHVjdCBvbGRXb3JrUHJvZHVjdCA9IHdvcmtQcm9kdWN0OwotCQl3b3JrUHJvZHVjdCA9IG5ld1dvcmtQcm9kdWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QsCi0JCQkJCW9sZFdvcmtQcm9kdWN0LCB3b3JrUHJvZHVjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEltcGFjdGVkQnkoKSB7Ci0JCWlmIChpbXBhY3RlZEJ5ID09IG51bGwpIHsKLQkJCWltcGFjdGVkQnkgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QuTWFueUludmVyc2UoCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlksCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMpOwotCQl9Ci0JCXJldHVybiBpbXBhY3RlZEJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEltcGFjdHMoKSB7Ci0JCWlmIChpbXBhY3RzID09IG51bGwpIHsKLQkJCWltcGFjdHMgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QuTWFueUludmVyc2UoCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkpOwotCQl9Ci0JCXJldHVybiBpbXBhY3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlbGl2ZXJhYmxlUGFydHMoKSB7Ci0JCWlmIChkZWxpdmVyYWJsZVBhcnRzID09IG51bGwpIHsKLQkJCWRlbGl2ZXJhYmxlUGFydHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KAotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTKTsKLQkJfQotCQlyZXR1cm4gZGVsaXZlcmFibGVQYXJ0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0SW1wYWN0ZWRCeSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEltcGFjdHMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0SW1wYWN0ZWRCeSgpKQotCQkJCQkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRJbXBhY3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJcmV0dXJuIGdldEFjdGl2aXR5RW50cnlTdGF0ZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQlyZXR1cm4gZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCXJldHVybiBiYXNpY0dldFdvcmtQcm9kdWN0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQlyZXR1cm4gZ2V0SW1wYWN0ZWRCeSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQlyZXR1cm4gZ2V0SW1wYWN0cygpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJcmV0dXJuIGdldERlbGl2ZXJhYmxlUGFydHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJc2V0QWN0aXZpdHlFbnRyeVN0YXRlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJc2V0QWN0aXZpdHlFeGl0U3RhdGUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCXNldFdvcmtQcm9kdWN0KChXb3JrUHJvZHVjdCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJZ2V0SW1wYWN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQlnZXRJbXBhY3RlZEJ5KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCWdldEltcGFjdHMoKS5jbGVhcigpOwotCQkJZ2V0SW1wYWN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmNsZWFyKCk7Ci0JCQlnZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJc2V0QWN0aXZpdHlFbnRyeVN0YXRlKEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJc2V0QWN0aXZpdHlFeGl0U3RhdGUoQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJc2V0V29ya1Byb2R1Y3QoKFdvcmtQcm9kdWN0KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCWdldEltcGFjdGVkQnkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQlnZXRJbXBhY3RzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUzoKLQkJCWdldERlbGl2ZXJhYmxlUGFydHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJcmV0dXJuIEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUID09IG51bGwgPyBhY3Rpdml0eUVudHJ5U3RhdGUgIT0gbnVsbAotCQkJCQk6ICFBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVC5lcXVhbHMoYWN0aXZpdHlFbnRyeVN0YXRlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJcmV0dXJuIEFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2aXR5RXhpdFN0YXRlICE9IG51bGwKLQkJCQkJOiAhQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVC5lcXVhbHMoYWN0aXZpdHlFeGl0U3RhdGUpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCXJldHVybiB3b3JrUHJvZHVjdCAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJcmV0dXJuIGltcGFjdGVkQnkgIT0gbnVsbCAmJiAhaW1wYWN0ZWRCeS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCXJldHVybiBpbXBhY3RzICE9IG51bGwgJiYgIWltcGFjdHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJcmV0dXJuIGRlbGl2ZXJhYmxlUGFydHMgIT0gbnVsbCAmJiAhZGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWN0aXZpdHlFbnRyeVN0YXRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGFjdGl2aXR5RW50cnlTdGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0aXZpdHlFeGl0U3RhdGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYWN0aXZpdHlFeGl0U3RhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzdjZDdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsI2dldFJlcG9ydHMgPGVtPlJlcG9ydHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0VGVtcGxhdGVzIDxlbT5UZW1wbGF0ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXb3JrUHJvZHVjdEltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlXb3JrUHJvZHVjdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBvcnRzKCkgPGVtPlJlcG9ydHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwb3J0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlcG9ydHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGVtcGxhdGVzKCkgPGVtPlRlbXBsYXRlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUZW1wbGF0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0ZW1wbGF0ZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9vbE1lbnRvcnMoKSA8ZW0+VG9vbCBNZW50b3JzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvb2xNZW50b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdG9vbE1lbnRvcnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1vZGlmaWVkQnkoKSB7Ci0JCUxpc3Qgb3V0cHV0RnJvbSA9IEFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dHRpbmdUYXNrcyh0aGlzKTsgLy90aGlzLmdldE91dHB1dEZyb20oKTsKLQkJTGlzdCBtb2RpZmllcyA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0JCWlmIChvdXRwdXRGcm9tICE9IG51bGwgJiYgb3V0cHV0RnJvbS5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gb3V0cHV0RnJvbS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJLy8JZm9yIGVhY2ggdGFzayBnZXQsIGdldCBwcmltYXJ5IHBlcmZvcm1lciByb2xlCi0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlSb2xlIG1vZGlmaWVkQnlSb2xlID0gdGFzay5nZXRQZXJmb3JtZWRCeSgpOwotCQkJCWlmIChtb2RpZmllZEJ5Um9sZSAhPSBudWxsKSB7Ci0JCQkJCWlmICghbW9kaWZpZXMuY29udGFpbnMobW9kaWZpZWRCeVJvbGUpKSB7Ci0JCQkJCQltb2RpZmllcy5hZGQobW9kaWZpZWRCeVJvbGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXBvcnRzKCkgewotCQlpZiAocmVwb3J0cyA9PSBudWxsKSB7Ci0JCQlyZXBvcnRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChSZXBvcnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlRTKTsKLQkJfQotCQlyZXR1cm4gcmVwb3J0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUZW1wbGF0ZXMoKSB7Ci0JCWlmICh0ZW1wbGF0ZXMgPT0gbnVsbCkgewotCQkJdGVtcGxhdGVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChUZW1wbGF0ZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFUyk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUb29sTWVudG9ycygpIHsKLQkJaWYgKHRvb2xNZW50b3JzID09IG51bGwpIHsKLQkJCXRvb2xNZW50b3JzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChUb29sTWVudG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTKTsKLQkJfQotCQlyZXR1cm4gdG9vbE1lbnRvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlpZiAoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID09IG51bGwpIHsKLQkJCWVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCQl9Ci0JCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlRTOgotCQkJcmV0dXJuIGdldFJlcG9ydHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEVTOgotCQkJcmV0dXJuIGdldFRlbXBsYXRlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19UT09MX01FTlRPUlM6Ci0JCQlyZXR1cm4gZ2V0VG9vbE1lbnRvcnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlRTOgotCQkJZ2V0UmVwb3J0cygpLmNsZWFyKCk7Ci0JCQlnZXRSZXBvcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzoKLQkJCWdldFRlbXBsYXRlcygpLmNsZWFyKCk7Ci0JCQlnZXRUZW1wbGF0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJZ2V0VG9vbE1lbnRvcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1JFUE9SVFM6Ci0JCQlnZXRSZXBvcnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEVTOgotCQkJZ2V0VGVtcGxhdGVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUUzoKLQkJCXJldHVybiByZXBvcnRzICE9IG51bGwgJiYgIXJlcG9ydHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19URU1QTEFURVM6Ci0JCQlyZXR1cm4gdGVtcGxhdGVzICE9IG51bGwgJiYgIXRlbXBsYXRlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUzoKLQkJCXJldHVybiB0b29sTWVudG9ycyAhPSBudWxsICYmICF0b29sTWVudG9ycy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zICE9IG51bGwKLQkJCQkJJiYgIWVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1dvcmtQcm9kdWN0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3RUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3RUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwN2Y0MjZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsI2dldFdvcmtQcm9kdWN0cyA8ZW0+V29yayBQcm9kdWN0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VHlwZUltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMKLQkJV29ya1Byb2R1Y3RUeXBlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtQcm9kdWN0cygpIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHdvcmtQcm9kdWN0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0V29ya1Byb2R1Y3RzKCkgewotCQlpZiAod29ya1Byb2R1Y3RzID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFMpOwotCQl9Ci0JCXJldHVybiB3b3JrUHJvZHVjdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3RzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTOgotCQkJZ2V0V29ya1Byb2R1Y3RzKCkuY2xlYXIoKTsKLQkJCWdldFdvcmtQcm9kdWN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTOgotCQkJZ2V0V29ya1Byb2R1Y3RzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTOgotCQkJcmV0dXJuIHdvcmtQcm9kdWN0cyAhPSBudWxsICYmICF3b3JrUHJvZHVjdHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdFR5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmMGZiNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgVU1BIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjNDQzODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB0aGUgVU1BIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvQXNzb2NpYXRpb25IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL0Fzc29jaWF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliODA3ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvQXNzb2NpYXRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBuYXZpZ2F0aW5nIGFuZCBxdWVyeWluZyBiaWRpcmVjdGlvbmFsIGFzc29jaWF0aW9ucyBhbW9uZwotICogdGhlIG1vZGVsIG9iamVjdHMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFzc29jaWF0aW9uSGVscGVyIHsKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZGlzY2lwbGluZXMgd2hpY2ggYSB0YXNrIGlzCi0JICogY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgVGFza19EaXNjaXBsaW5lcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlUYXNrLmNsYXNzLAotCQkJIlRhc2tfRGlzY2lwbGluZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2tzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggYXJlCi0JICogY3JlYXRlZCBmcm9tIGEgc3BlY2lmaWMgdGFzay4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBUYXNrX1Rhc2tEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlUYXNrLmNsYXNzLAotCQkJIlRhc2tfVGFza0Rlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZG9tYWlucyB3aGljaCBhIHdvcmsgcHJvZHVjdAotCSAqIGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X0RvbWFpbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3RfRG9tYWlucyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFza3Mgd2hpY2ggcHJvZHVjZSBhIHdvcmsKLQkgKiBwcm9kdWN0IGFzIGFuIG91dHB1dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdF9PdXRwdXRGcm9tX1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrcyB3aGljaCB1c2UgYSB3b3JrCi0JICogcHJvZHVjdCBhcyBhIG1hbmRhdG9yeSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdF9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X0lucHV0VG9fVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHdvcmsgcHJvZHVjdCB0eXBlcyB3aGljaCBhCi0JICogd29yayBwcm9kdWN0IGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X1dvcmtQcm9kdWN0VHlwZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3RUeXBlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcmVzcG9uc2libGUgcm9sZXMgZm9yIGEgd29yawotCSAqIHByb2R1Y3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdC5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkZWxpdmVyYWJsZXMgd2hpY2ggYSB3b3JrCi0JICogcHJvZHVjdCBpcyBjb250YWluZWQgaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3RfRGVsaXZlcmFibGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X0RlbGl2ZXJhYmxlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrcyB0aGF0IHVzZSBhIHdvcmsgcHJvZHVjdAotCSAqIGFzIGFuIG9wdGlvbmFsIGlucHV0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X09wdGlvbmFsSW5wdXRUb19UYXNrcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdC5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdF9PcHRpb25hbElucHV0VG9fVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JICogd2hpY2ggYXJlIGNyZWF0ZWQgZnJvbSBhIHdvcmsgcHJvZHVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdF9Xb3JrUHJvZHVjdERlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X1dvcmtQcm9kdWN0RGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHByaW1hcnkgdGFza3Mgb2YgYSByb2xlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVfUHJpbWFyeV9UYXNrcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlLmNsYXNzLAotCQkJIlJvbGVfUHJpbWFyeV9UYXNrcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgc2Vjb25kYXJ5IHRhc2tzIG9mIGEgcm9sZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlX1NlY29uZGFyeV9UYXNrcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlLmNsYXNzLAotCQkJIlJvbGVfU2Vjb25kYXJ5X1Rhc2tzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSByb2xlIHNldHMgd2hpY2ggYSByb2xlIGlzCi0JICogY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZV9Sb2xlU2V0cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlLmNsYXNzLAotCQkJIlJvbGVfUm9sZVNldHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbXBvc2l0ZSByb2xlcyB3aGljaAotCSAqIGluY2x1ZGVzIGEgcm9sZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlX0NvbXBvc2l0ZVJvbGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGUuY2xhc3MsCi0JCQkiUm9sZV9Db21wb3NpdGVSb2xlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHJvbGUgZGVzY3JpcHRvcnMgd2hpY2ggYXJlCi0JICogY3JlYXRlZCBmcm9tIGEgcm9sZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlX1JvbGVEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlLmNsYXNzLAotCQkJIlJvbGVfUm9sZURlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY29udGVudCBlbGVtZW50cyB3aGljaCBhCi0JICogY2hlY2tsaXN0IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBDaGVja2xpc3RfQ29udGVudEVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUNoZWNrbGlzdC5jbGFzcywKLQkJCSJDaGVja2xpc3RfQ29udGVudEVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBhY3Rpdml0aWVzIHdoaWNoIGEgY29uY2VwdCBpcwotCSAqIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBDb25jZXB0X0FjdGl2aXRpZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ29uY2VwdC5jbGFzcywKLQkJCSJDb25jZXB0X0FjdGl2aXRpZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Db25jZXB0cygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY29udGVudCBlbGVtZW50cyB3aGljaCBhCi0JICogY29uY2VwdCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgQ29uY2VwdF9Db250ZW50RWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ29uY2VwdC5jbGFzcywKLQkJCSJDb25jZXB0X0NvbnRlbnRFbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbnRlbnQgZWxlbWVudHMgd2hpY2ggYW4KLQkgKiBleGFtcGxlIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBFeGFtcGxlX0NvbnRlbnRFbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlFeGFtcGxlLmNsYXNzLAotCQkJIkV4YW1wbGVfQ29udGVudEVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY29udGVudCBlbGVtZW50cyB3aGljaCBhCi0JICogcmVwb3J0IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSZXBvcnRfV29ya1Byb2R1Y3RzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJlcG9ydC5jbGFzcywKLQkJCSJSZXBvcnRfV29ya1Byb2R1Y3RzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBjb250ZW50IGVsZW1lbnRzIHdoaWNoIGEKLQkgKiByZXVzYWJsZSBhc3NldCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUmV1c2FibGVBc3NldF9Db250ZW50RWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUmV1c2FibGVBc3NldC5jbGFzcywKLQkJCSJSZXVzYWJsZUFzc2V0X0NvbnRlbnRFbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBhY3Rpdml0aWVzIHdoaWNoIGEgcm9hZG1hcCBpcwotCSAqIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2FkbWFwX0FjdGl2aXRlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2FkbWFwLmNsYXNzLAotCQkJIlJvYWRtYXBfQWN0aXZpdGVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUm9hZG1hcHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWN0aXZpdGllcyB3aGljaCBhIHN1cHBvcnRpbmcKLQkgKiBtYXRlcmlhbCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgU3VwcG9ydGluZ01hdGVyaWFsX0FjdGl2aXRpZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLAotCQkJIlN1cHBvcnRpbmdNYXRlcmlhbF9BY3Rpdml0aWVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfU3VwcG9ydGluZ01hdGVyaWFscygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY29udGVudCBlbGVtZW50cyB3aGljaCBhCi0JICogc3VwcG9ydGluZyBtYXRlcmlhbCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgU3VwcG9ydGluZ01hdGVyaWFsX0NvbnRlbnRFbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsCi0JCQkiU3VwcG9ydGluZ01hdGVyaWFsX0NvbnRlbnRFbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZGVsaXZlcnkgcHJvY2Vzc2VzIHdoaWNoIGEKLQkgKiBjb21tdW5pY2F0aW9uIHN1cHBvcnRpbmcgbWF0ZXJpYWwgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFN1cHBvcnRpbmdNYXRlcmlhbF9Db21tdW5pY2F0aW9uc19EZWxpdmVyeVByb2Nlc3NlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsCi0JCQkiU3VwcG9ydGluZ01hdGVyaWFsX0NvbW11bmljYXRpb25zX0RlbGl2ZXJ5UHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRlbGl2ZXJ5IHByb2Nlc3NlcyB3aGljaCBhbgotCSAqIGVkdWNhdGlvbiBzdXBwb3J0aW5nIG1hdGVyaWFsIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTdXBwb3J0aW5nTWF0ZXJpYWxfRWR1Y2F0aW9uX0RlbGl2ZXJ5UHJvY2Vzc2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywKLQkJCSJTdXBwb3J0aW5nTWF0ZXJpYWxfRWR1Y2F0aW9uX0RlbGl2ZXJ5UHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBtZXRob2QgdW5pdHMgd2hpY2ggYQotCSAqIGNvcHlyaWdodCBzdXBwb3J0aW5nIG1hdGVyaWFsIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTdXBwb3J0aW5nTWF0ZXJpYWxfQ29weXJpZ2h0U3RhdGVtZW50X01ldGhvZFVuaXRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywKLQkJCSJTdXBwb3J0aW5nTWF0ZXJpYWxfQ29weXJpZ2h0U3RhdGVtZW50X01ldGhvZFBsdWdpbnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBjb250ZW50IGVsZW1lbnRzIHdoaWNoIGEKLQkgKiBndWlkZWxpbmUgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEd1aWRlbGluZV9Db250ZW50RWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJR3VpZGVsaW5lLmNsYXNzLAotCQkJIkd1aWRlbGluZV9Db250ZW50RWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFjdGl2aXRpZXMgd2hpY2ggYSBndWlkZWxpbmUKLQkgKiBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgR3VpZGVsaW5lX0FjdGl2aXRpZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJR3VpZGVsaW5lLmNsYXNzLAotCQkJIkd1aWRlbGluZV9BY3Rpdml0aWVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfR3VpZGVsaW5lcygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgd29yayBwcm9kdWN0cyB3aGljaCBhCi0JICogdGVtcGxhdGUgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFRlbXBsYXRlX1dvcmtQcm9kdWN0cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlUZW1wbGF0ZS5jbGFzcywKLQkJCSJUZW1wbGF0ZV9Xb3JrUHJvZHVjdHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdG9vbCB3aGljaCBhIHRvb2wgbWVudG9yIGlzCi0JICogY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgVG9vbE1lbnRvcl9Ub29sID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVRvb2xNZW50b3IuY2xhc3MsCi0JCQkiVG9vbE1lbnRvcl9Ub29sIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFza3Mgd2hpY2ggYSB0b29sIG1lbnRvciBpcwotCSAqIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBUb29sTWVudG9yX1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVRvb2xNZW50b3IuY2xhc3MsCi0JCQkiVG9vbE1lbnRvcl9UYXNrcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcnMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgd29yayBwcm9kdWN0cyB3aGljaCBhIHRvb2wKLQkgKiBtZW50b3IgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFRvb2xNZW50b3JfV29ya1Byb2R1Y3RzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVRlbXBsYXRlLmNsYXNzLAotCQkJIlRvb2xNZW50b3JfV29ya1Byb2R1Y3RzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQJCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGN1c3RvbSBjYXRlZ29yaWVzIHdoaWNoIGEKLQkgKiBkZXNjcmliYWJsZSBlbGVtZW50IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBEZXNjcmliYWJsZUVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsCi0JCQkiQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcHJhY3RpY2VzIHJlZmVyZW5jZWQgYnkgYQotCSAqIGNvbnRlbnQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBDb250ZW50RWxlbWVudF9QcmFjdGljZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ29udGVudEVsZW1lbnQuY2xhc3MsCi0JCQkiQ29udGVudEVsZW1lbnRfUHJhY3RpY2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgbWV0aG9kIHBsdWctaW5zIHJlZmVyZW5jZWQgYnkKLQkgKiBhIG1ldGhvZCBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIE1ldGhvZFBsdWdpbl9EaXJlY3RFeHRlbnNpb25zID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCU1ldGhvZFBsdWdpbi5jbGFzcywKLQkJCSJNZXRob2RQbHVnaW5fRGlyZWN0RXh0ZW5zaW9ucyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9CYXNlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbnMgd2hpY2gKLQkgKiBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgbWV0aG9kIHBsdWctaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgTWV0aG9kUGx1Z2luX01ldGhvZENvbmZpZ3VyYXRpb25zID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCU1ldGhvZFBsdWdpbi5jbGFzcywKLQkJCSJNZXRob2RQbHVnaW5fTWV0aG9kQ29uZmlndXJhdGlvbnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBtZXRob2QgcGFja2FnZXMKLQkgKiB1c2VkL3JlZmVyZW5jZWQgYnkgYSBtZXRob2QgcGFja2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBNZXRob2RQYWNrYWdlX1VzaW5nUGFja2FnZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJTWV0aG9kUGFja2FnZS5jbGFzcywKLQkJCSJNZXRob2RQYWNrYWdlX1VzaW5nUGFja2FnZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2VzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9ucyB3aGljaAotCSAqIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSBtZXRob2QgcGFja2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBNZXRob2RQYWNrYWdlX01ldGhvZENvbmZpZ3VyYXRpb25zID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCU1ldGhvZFBhY2thZ2UuY2xhc3MsCi0JCQkiTWV0aG9kUGFja2FnZV9NZXRob2RDb25maWd1cmF0aW9ucyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbnMgd2hpY2gKLQkgKiBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgQ3VzdG9tQ2F0ZWdvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgQ3VzdG9tQ2F0ZWdvcnlfTWV0aG9kQ29uZmlndXJhdGlvbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsCi0JCQkiQ3VzdG9tQ2F0ZWdvcnlfTWV0aG9kQ29uZmlndXJhdGlvbnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkaXNjaXBsaW5lIGdyb3VwaW5ncyB3aGljaAotCSAqIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSBkaXNjaXBsaW5lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIERpc2NpcGxpbmVfRGlzY2lwbGluZUdyb3VwaW5ncyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlEaXNjaXBsaW5lLmNsYXNzLAotCQkJIkRpc2NpcGxpbmVfRGlzY2lwbGluZUdyb3VwaW5ncyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSByb2xlIHNldCBncm91cGluZ3Mgd2hpY2gKLQkgKiBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgcm9sZSBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZVNldF9Sb2xlU2V0R3JvdXBwaW5ncyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlU2V0LmNsYXNzLAotCQkJIlJvbGVTZXRfUm9sZVNldEdyb3VwcGluZ3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgc3VjY2Vzc29yIG9mIGEgd29yayBvcmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrT3JkZXJfU3VjY2Vzc29yID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtPcmRlci5jbGFzcywKLQkJCSJXb3JrT3JkZXJfU3VjY2Vzc29yIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHN1Y2Nlc3NvciBsaW5rIG9mIGEgd29yawotCSAqIGJyZWFrZG93biBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1N1Y2Nlc3NvciA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywKLQkJCSJXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9TdWNjZXNzb3IiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrT3JkZXJfUHJlZCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBpbW1lZGlhdGUgdmFyaWF0aWVzIG9mIGEKLQkgKiB2YXJpYWJpbGl0eSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFZhcmlhYmlsaXR5RWxlbWVudF9JbW1lZGlhdGVWYXJpZXRpZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzLAotCQkJIlZhcmlhYmlsaXR5RWxlbWVudF9JbW1lZGlhdGVWYXJpZXRpZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBzdWNjZXNzb3JzIHRvIGEgc2VjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTZWN0aW9uX1N1Y2Nlc3NvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJU2VjdGlvbi5jbGFzcywKLQkJCSJTZWN0aW9uX1N1Y2Nlc3NvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggYQotCSAqIHNlY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFNlY3Rpb25fVGFza0Rlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVNlY3Rpb24uY2xhc3MsCi0JCQkiU2VjdGlvbl9UYXNrRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0ZWFtIHByb2ZpbGVzIHdoaWNoIGluY2x1ZGVzCi0JICogYSBzcGVjaWZpYyByb2xlIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZURlc2NyaXB0b3JfVGVhbVByb2ZpbGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGVEZXNjcmlwdG9yLmNsYXNzLAotCQkJIlJvbGVEZXNjcmlwdG9yX1RlYW1Qcm9maWxlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBwcmltYXJ5IHRhc2sgZGVzY3JpcHRvcnMKLQkgKiBwZXJmb3JtZWQgYnkgYSByb2xlIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlRGVzY3JpcHRvci5jbGFzcywKLQkJCSJSb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWRkaXRpb25hbCB0YXNrIGRlc2NyaXB0b3JzCi0JICogcGVyZm9ybWVkIGJ5IGEgcm9sZSBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVEZXNjcmlwdG9yX0FkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0JCQkiUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFzc2lzdGluZyB0YXNrIGRlc2NyaXB0b3JzCi0JICogcGVyZm9ybWVkIGJ5IGEgcm9sZSBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVEZXNjcmlwdG9yX0Fzc2lzdHNJbl9UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0JCQkiUm9sZURlc2NyaXB0b3JfQXNzaXN0c0luX1Rhc2tEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZGVwZW5kZW50IHByb2Nlc3NlcwotCSAqIHJlZmVyZW5jZWQgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBNZXRob2RDb25maWd1cmF0aW9uX0RlcGVuZGVudFByb2Nlc3NlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLAotCQkJIk1ldGhvZENvbmZpZ3VyYXRpb25fRGVwZW5kZW50UHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB2YWxpZCBwcm9jZXNzZXMgcmVmZXJlbmNlZCBpbgotCSAqIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgTWV0aG9kQ29uZmlndXJhdGlvbl9WYWxpZENvbnRleHRfUHJvY2Vzc2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsCi0JCQkiTWV0aG9kQ29uZmlndXJhdGlvbl9WYWxpZENvbnRleHRfUHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaAotCSAqIHByb2R1Y2UgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBhbiBvdXRwdXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCB1c2UgYQotCSAqIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGFzIGFuIG9wdGlvbmFsIGlucHV0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCB1c2UgYQotCSAqIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGFzIGFuIG1hbmRhdG9yeSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUb19UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyIsIC8vJE5PTi1OTFMtMSQKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksIHRydWUpOwotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoIHVzZSBhCi0JICogd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgYW4gZXh0ZXJuYWwgaW5wdXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzIiwgLy8kTk9OLU5MUy0xJAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpLCB0cnVlKTsKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcm9sZSBkZXNjcmlwdG9ycyB3aGljaCBhcmUKLQkgKiByZXNwb25zaWJsZSBmb3IgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JfUmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycyIsIC8vJE5PTi1OTFMtMSQKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksIHRydWUpOwotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkZWxpdmVyYWJsZSBkZXNjcmlwdG9ycyB3aGljaAotCSAqIGNvbnRhaW4gYSBzcGVjaWZpYyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkaXNjaXBsaW5lcyB3aGljaCBhbiBhY3Rpdml0eQotCSAqIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBBY3Rpdml0eV9EaXNjaXBsaW5lcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlBY3Rpdml0eS5jbGFzcywKLQkJCSJBY3Rpdml0eV9EaXNjaXBsaW5lcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHByYWN0aWNlcyB3aGljaCBhbiBhY3Rpdml0eQotCSAqIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBBY3Rpdml0eV9QcmF0aWNlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlBY3Rpdml0eS5jbGFzcywKLQkJCSJBY3Rpdml0eV9QcmF0aWNlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBwcm9jZXNzIHBsYW5uaW5nIHRlbXBsYXRlcwotCSAqIHdoaWNoIGEgcHJvY2VzcyBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUHJvY2Vzcy5jbGFzcywKLQkJCSJQcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VkT25Qcm9jZXNzZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcHJvY2VzZXNzIHdoaWNoIHJlZmVyZW5jZXMgYQotCSAqIGNhcGFiaWxpdHkgcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBDYXBhYmlsaXR5UGF0dGVybl9Db25zdW1pbmdQcm9jZXNzZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ2FwYWJpbGl0eVBhdHRlcm4uY2xhc3MsCi0JCQkiQ2FwYWJpbGl0eVBhdHRlcm5fQ29uc3VtaW5nUHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm5zKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGJyZWFrZG93biBlbGVtZW50IHdoaWNoIGlzCi0JICogZGlzcGxheWVkIGJlZm9yZSBhIGJyZWFrZG93biBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUJyZWFrZG93bkVsZW1lbnQuY2xhc3MsCi0JCQkiQnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUiLCAvLyROT04tTkxTLTEkCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCksIHRydWUsCi0JCQlmYWxzZSk7Ci0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGJyZWFrZG93biBlbGVtZW50IHdoaWNoIGlzCi0JICogZGlzcGxheWVkIGFmdGVyIGEgYnJlYWtkb3duIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgQnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlciA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlCcmVha2Rvd25FbGVtZW50LmNsYXNzLAotCQkJIkJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIiLCAvLyROT04tTkxTLTEkCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpLCB0cnVlLAotCQkJZmFsc2UpOwotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBVTUEgc2VtYXRpYyBtb2RlbCBicmlkZ2VzCi0JICogcmVmZXJlbmNlZCBieSBhIG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIE1ldGhvZEVsZW1lbnRfVU1BU2VtYXRpY01vZGVsQnJpZGdlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlNZXRob2RFbGVtZW50LmNsYXNzLAotCQkJIk1ldGhvZEVsZW1lbnRfVU1BU2VtYXRpY01vZGVsQnJpZGdlcyIsIC8vJE5PTi1OTFMtMSQKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpLCB0cnVlLAotCQkJZmFsc2UpOwotCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IHByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzOwotCi0Jc3RhdGljIHsKLQkJcmVnaXN0ZXJQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGUgcHJlZGVmaW5lZCBvcHBvc2l0ZSBmZWF0dXJlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVnaXN0ZXJQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpIHsKLQkJcHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFzc29jaWF0aW9uSGVscGVyIG9iamVjdCA9IG5ldyBBc3NvY2lhdGlvbkhlbHBlcigpOwotCQlGaWVsZFtdIGZpZWxkcyA9IG9iamVjdC5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJCWludCBtb2QgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsKLQkJCWlmIChNb2RpZmllci5pc1B1YmxpYyhtb2QpICYmIE1vZGlmaWVyLmlzU3RhdGljKG1vZCkKLQkJCQkJJiYgTW9kaWZpZXIuaXNGaW5hbChtb2QpCi0JCQkJCSYmIGZpZWxkLmdldFR5cGUoKSA9PSBPcHBvc2l0ZUZlYXR1cmUuY2xhc3MpIHsKLQkJCQl0cnkgewotCQkJCQlwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcy5hZGQoZmllbGQuZ2V0KG9iamVjdCkpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogU3lzdGVtLm91dAotCQkgKiAucHJpbnRsbigiQXNzb2NpYXRpb25IZWxwZXIucmVnaXN0ZXJQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpOgotCQkgKiBkZWZpbmVkIG9wcG9zaXRlIGZlYXR1cmVzOiAiICsgcHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMuc2l6ZSgpKTsKLQkJICogLy8kTk9OLU5MUy0xJCBTeXN0ZW0ub3V0LnByaW50bG4ocHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMpOwotCQkgKi8KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlID0gKE9wcG9zaXRlRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUucmVnaXN0ZXJPcHBvc2l0ZUZlYXR1cmUoZmVhdHVyZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwcmVkZWZpbmVkIG9wcG9zaXRlIGZlYXR1cmVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWRlZmluZWQgb3Bwb3NpdGUgZmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0UHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMoKSB7Ci0JCXJldHVybiBwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWxpdmVyYWJsZSBkZXNjcmlwdG9ycyB3aGljaCBjb250YWluIHRoZSBnaXZlbiB3b3JrIHByb2R1Y3QKLQkgKiBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSB3cGQKLQkgKiAgICAgICAgICAgIGEgd29yayBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgZGVsaXZlcmFibGUgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdG9ycyhXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3BkKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCB1c2UgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBhbgotCSAqIGV4dGVybmFsIGlucHV0LgotCSAqIAotCSAqIEBwYXJhbSB3cGQKLQkgKiAgICAgICAgICAgIGEgd29yayBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRFeHRlcm5hbElucHV0VG8oV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHdwZCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggdXNlIGEgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgYQotCSAqIG1hbmRhdG9yeSBpbnB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogICAgICAgICAgICBhIHdvcmsgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TWFuZGF0b3J5SW5wdXRUbyhXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3BkKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUb19UYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggdXNlIGEgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgYW4KLQkgKiBvcHRpb25hbCBpbnB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogICAgICAgICAgICBhIHdvcmsgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3B0aW9uYWxJbnB1dFRvKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cGQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoIHdoaWNoIHByb2R1Y2UgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotCSAqIGFzIGFuIG91dHB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogICAgICAgICAgICBhIHdvcmsgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3V0cHV0RnJvbShXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3BkKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvbGUgZGVzY3JpcHRvcnMgd2hpY2ggYXJlIHJlc3BvbnNpYmxlIGZvciBhIHdvcmsgcHJvZHVjdAotCSAqIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIHdwZAotCSAqICAgICAgICAgICAgYSB3b3JrIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiByb2xlIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQpIHsKLQkJcmV0dXJuIChMaXN0KSB3cGQKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0aGUgZGVwZW5kZW50IHByb2Nlc3NlcyByZWZlcmVuY2VkIGluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9jZXNzZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGVwZW5kZW50UHJvY2Vzc2VzKE1ldGhvZENvbmZpZ3VyYXRpb24gZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKE1ldGhvZENvbmZpZ3VyYXRpb25fRGVwZW5kZW50UHJvY2Vzc2VzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZWFtIHByb2ZpbGVzIHdoaWNoIGluY2x1ZGVzIGEgc3BlY2lmaWMgcm9sZSBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHJvbGUgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRlYW0gcHJvZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VGVhbVByb2ZpbGVzKFJvbGVEZXNjcmlwdG9yIGUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlRGVzY3JpcHRvcl9UZWFtUHJvZmlsZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHByYWN0aWNlcyByZWZlcmVuY2VkIGJ5IGEgY29udGVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIGNvbnRlbnQgZWxlbWVudAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByYWN0aWNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRQcmFjdGljZXMoQ29udGVudEVsZW1lbnQgZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKENvbnRlbnRFbGVtZW50X1ByYWN0aWNlcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdG9vbCB3aGljaCBhIHRvb2wgbWVudG9yIGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHRvb2wgbWVudG9yCi0JICogQHJldHVybiBhIHRvb2wKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRvb2wgZ2V0VG9vbChUb29sTWVudG9yIHRvb2xNZW50b3IpIHsKLQkJcmV0dXJuIChUb29sKSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB0b29sTWVudG9yKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShUb29sTWVudG9yX1Rvb2wpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1Y2Nlc3NvcnMgdG8gYSBzZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHNlY3Rpb24KLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBzZWN0aW9ucyB0aGF0IGFyZSBwb3N0aW9uZWQgYWZ0ZXIgdGhlIGdpdmVuIHNlY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U3VjY2Vzc29ycyhTZWN0aW9uIHNlY3Rpb24pIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBzZWN0aW9uKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShTZWN0aW9uX1N1Y2Nlc3NvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGltbWVkaWF0ZSB2YXJpYXRpZXMgb2YgYSB2YXJpYWJpbGl0eSBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHZhcmlhYmlsaXR5IGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBpbW1lZGlhdGUgdmFyaWF0aWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEltbWVkaWF0ZVZhcmlldGllcyhWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFZhcmlhYmlsaXR5RWxlbWVudF9JbW1lZGlhdGVWYXJpZXRpZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHByaW1hcnkgdGFza3Mgb2YgYSByb2xlLgotCSAqIAotCSAqIEBwYXJhbSByb2xlCi0JICogICAgICAgICAgICBhIHJvbGUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRQcmltYXJ5VGFza3MoUm9sZSByb2xlKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcm9sZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoUm9sZV9QcmltYXJ5X1Rhc2tzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzZWNvbmRhcnkgdGFza3Mgb2YgYSByb2xlLgotCSAqIAotCSAqIEBwYXJhbSByb2xlCi0JICogICAgICAgICAgICBhIHJvbGUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTZWNvbmRhcnlUYXNrcyhSb2xlIHJvbGUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByb2xlKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlX1NlY29uZGFyeV9UYXNrcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3VjY2Vzc29yIGxpbmsgb2YgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIGJyZWFrIGRvd24gZWxlbWVudAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGxpbmtzIHRvIHdvcmsgYnJlYWtkb3duIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldExpbmtUb1N1Y2Nlc3NvcihCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9TdWNjZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1Y2Nlc3NvciBvZiBhIHdvcmsgb3JkZXIuCi0JICogCi0JICogQHBhcmFtIHdvcmtPcmRlcgotCSAqICAgICAgICAgICAgYSB3b3JrIG9yZGVyCi0JICogQHJldHVybiBhIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtCcmVha2Rvd25FbGVtZW50IGdldFN1Y2Nlc3NvcihXb3JrT3JkZXIgd29ya09yZGVyKSB7Ci0JCXJldHVybiAoV29ya0JyZWFrZG93bkVsZW1lbnQpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHdvcmtPcmRlcikKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya09yZGVyX1N1Y2Nlc3Nvcik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFza3Mgd2hpY2ggcHJvZHVjZSBhIHdvcmsgcHJvZHVjdCBhcyBhbiBvdXRwdXQuCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIHdvcmsgcHJvZHVjdAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2tzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE91dHB1dHRpbmdUYXNrcyhXb3JrUHJvZHVjdCB3cCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHdwKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdF9PdXRwdXRGcm9tX1Rhc2tzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YXNrcyB3aGljaCB1c2UgYSB3b3JrIHByb2R1Y3QgYXMgYSBtYW5kYXRvcnkgaW5wdXQuCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIHdvcmsgcHJvZHVjdAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2tzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE1hbmRhdG9yeUlucHV0VG9UYXNrcyhXb3JrUHJvZHVjdCB3cCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHdwKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdF9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZXNwb25zaWJsZSByb2xlcyBmb3IgYSB3b3JrIHByb2R1Y3QuCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIHdvcmsgcHJvZHVjdAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHJvbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFJlc3BvbnNpYmxlUm9sZXMoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJcmV0dXJuIChMaXN0KSB3cC5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3b3JrIHByb2R1Y3RzIG1vZGlmaWVkIGJ5IGEgcm9sZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZQotCSAqICAgICAgICAgICAgYSByb2xlCi0JICogQHJldHVybiBhIGxpc3Qgb2Ygd29yayBwcm9kdWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRNb2RpZmllZFdvcmtQcm9kdWN0cyhSb2xlIHJvbGUpIHsKLQkJTGlzdCBwZXJmb3JtcyA9IGdldFByaW1hcnlUYXNrcyhyb2xlKTsKLQkJTGlzdCBtb2RpZmllcyA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0JCWlmIChwZXJmb3JtcyAhPSBudWxsICYmIHBlcmZvcm1zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHBlcmZvcm1zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpLm5leHQoKTsKLQotCQkJCS8vIGZvciBlYWNoIHRhc2ssIGdldCBvdXRwdXQgd29yayBwcm9kdWN0OwotCQkJCUxpc3Qgb3V0cHV0V1BzID0gdGFzay5nZXRPdXRwdXQoKTsKLQkJCQlpZiAob3V0cHV0V1BzICE9IG51bGwgJiYgb3V0cHV0V1BzLnNpemUoKSA+IDApIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IG91dHB1dFdQcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgaXQubmV4dCgpOwotCQkJCQkJaWYgKHdwICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoIW1vZGlmaWVzLmNvbnRhaW5zKHdwKSkgewotCQkJCQkJCQltb2RpZmllcy5hZGQod3ApOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZXM7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByb2xlcyB0aGF0IG1vZGlmeSBhIHdvcmsgcHJvZHVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiAgICAgICAgICAgIGEgd29yayBwcm9kdWN0Ci0JICogQHJldHVybiBhIGxpc3Qgb2Ygcm9sZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TW9kaWZpZWRCeShXb3JrUHJvZHVjdCB3cCkgewotCQlMaXN0IG91dHB1dEZyb20gPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRPdXRwdXR0aW5nVGFza3Mod3ApOyAvLyB0aGlzLmdldE91dHB1dEZyb20oKTsKLQkJamF2YS51dGlsLkFycmF5TGlzdCBtb2RpZmllcyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0JCWlmIChvdXRwdXRGcm9tICE9IG51bGwgJiYgb3V0cHV0RnJvbS5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gb3V0cHV0RnJvbS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJLy8gZm9yIGVhY2ggdGFzayBnZXQsIGdldCBwcmltYXJ5IHBlcmZvcm1lciByb2xlCi0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlSb2xlIG1vZGlmaWVkQnlSb2xlID0gdGFzay5nZXRQZXJmb3JtZWRCeSgpOwotCQkJCWlmIChtb2RpZmllZEJ5Um9sZSAhPSBudWxsKSB7Ci0JCQkJCWlmICghbW9kaWZpZXMuY29udGFpbnMobW9kaWZpZWRCeVJvbGUpKSB7Ci0JCQkJCQltb2RpZmllcy5hZGQobW9kaWZpZWRCeVJvbGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNjaXBsaW5lIGdyb3VwaW5ncyB3aGljaCBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgZGlzY2lwbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzY2lwbGluZQotCSAqICAgICAgICAgICAgYSBkaXNjaXBsaW5lCi0JICogQHJldHVybiBhIGxpc3Qgb2YgZGlzY2lwbGluZSBncm91cGluZ3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGlzY2lwbGluZUdyb3VwcyhEaXNjaXBsaW5lIGRpc2NpcGxpbmUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBkaXNjaXBsaW5lKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShEaXNjaXBsaW5lX0Rpc2NpcGxpbmVHcm91cGluZ3MpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRvbWFpbnMgd2hpY2ggYSB3b3JrIHByb2R1Y3QgaXMgY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIHdvcmsgcHJvZHVjdAotCSAqIEByZXR1cm4gYSBkb21haW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RG9tYWlucyhXb3JrUHJvZHVjdCB3cCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHdwKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdF9Eb21haW5zKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByb2xlIHNldCBncm91cGluZ3Mgd2hpY2ggY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIHJvbGUgc2V0LgotCSAqIAotCSAqIEBwYXJhbSByb2xlU2V0Ci0JICogICAgICAgICAgICBhIHJvbGUgc2V0Ci0JICogQHJldHVybiBhIGxpc3Qgb2Ygcm9sZSBzZXQgZ3JvdXBpbmdzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFJvbGVTZXRHcm91cHMoUm9sZVNldCByb2xlU2V0KSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcm9sZVNldCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoUm9sZVNldF9Sb2xlU2V0R3JvdXBwaW5ncyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9sZSBzZXRzIHdoaWNoIGEgcm9sZSBpcyBjYXRlZ29yaXplZCB1bmRlci4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZQotCSAqICAgICAgICAgICAgYSByb2xlCi0JICogQHJldHVybiBhIGxpc3Qgb2Ygcm9sZSBzZXRzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFJvbGVTZXRzKFJvbGUgcm9sZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJvbGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFJvbGVfUm9sZVNldHMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggaGF2ZSBiZWVuIGNyZWF0ZWQgZnJvbSBhIHRhc2suCi0JICogCi0JICogQHBhcmFtIHRhc2sKLQkgKiAgICAgICAgICAgIGEgdGFzawotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VGFza0Rlc2NyaXB0b3JzKFRhc2sgdGFzaykgewotCQlyZXR1cm4gKExpc3QpIHRhc2suZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoVGFza19UYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc2NpcGxpbmVzIHdoaWNoIGEgdGFzayBpcyBjYXRlZ29yaXplZCB1bmRlci4KLQkgKiAKLQkgKiBAcGFyYW0gdGFzawotCSAqICAgICAgICAgICAgYSB0YXNrCi0JICogQHJldHVybiBhIGxpc3Qgb2YgZGlzY2lwbGluZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGlzY2lwbGluZXMoVGFzayB0YXNrKSB7Ci0JCXJldHVybiAoTGlzdCkgdGFzay5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShUYXNrX0Rpc2NpcGxpbmVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNjaXBsaW5lcyB3aGljaCBhbiBhY3Rpdml0eSBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogICAgICAgICAgICBhbiBhY3Rpdml0eQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGRpc2NpcGxpbmVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldERpc2NpcGxpbmVzKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCXJldHVybiAoTGlzdCkgYWN0aXZpdHkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoQWN0aXZpdHlfRGlzY2lwbGluZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHByaW1hcnkgdGFzayBkZXNjcmlwdG9ycyBwZXJmb3JtZWQgYnkgYSByb2xlIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIHJvbGVEZXNjCi0JICogICAgICAgICAgICBhIHJvbGUgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhSb2xlRGVzY3JpcHRvciByb2xlRGVzYykgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJvbGVEZXNjKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGRpdGlvbmFsIHRhc2sgZGVzY3JpcHRvcnMgcGVyZm9ybWVkIGJ5IGEgcm9sZSBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSByb2xlRGVzYwotCSAqICAgICAgICAgICAgYSByb2xlIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMoUm9sZURlc2NyaXB0b3Igcm9sZURlc2MpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByb2xlRGVzYykKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYXNzaXN0aW5nIHRhc2sgZGVzY3JpcHRvcnMgcGVyZm9ybWVkIGJ5IGEgcm9sZSBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSByb2xlRGVzYwotCSAqICAgICAgICAgICAgYSByb2xlIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFzc2lzdGVkVGFza0Rlc2NyaXB0b3JzKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcm9sZURlc2MpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFJvbGVEZXNjcmlwdG9yX0Fzc2lzdHNJbl9UYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdvcmsgcHJvZHVjdCB0eXBlcyB3aGljaCBhIHdvcmsgcHJvZHVjdCBpcyBjYXRlZ29yaXplZCB1bmRlci4KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiAgICAgICAgICAgIGEgd29yayBwcm9kdWN0Ci0JICogQHJldHVybiBhIGxpc3Qgb2Ygd29yayBwcm9kdWN0IHR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFdvcmtQcm9kdWN0VHlwZXMoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3RUeXBlcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY3VzdG9tIGNhdGVnb3JpZXMgd2hpY2ggYSBkZXNjcmliYWJsZSBlbGVtZW50IGlzIGFzc29jaWF0ZWQKLQkgKiB3aXRoLgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSBkZXNjcmliYWJsZSBlbGVtZW50Ci0JICogQHJldHVybiBhIGxpc3Qgb2YgY3VzdG9tIGNhdGVnb3JpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhEZXNjcmliYWJsZUVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKERlc2NyaWJhYmxlRWxlbWVudF9DdXN0b21DYXRlZ29yaWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBEZWxpdmVyYWJsZXMgd2hpY2ggYSBXb3JrUHJvZHVjdCBlbGVtZW50IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiAgICAgICAgICAgIGEgV29ya1Byb2R1Y3QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIERlbGl2ZXJhYmxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXREZWxpdmVyYWJsZXMoV29ya1Byb2R1Y3QgZWxlbWVudCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0X0RlbGl2ZXJhYmxlcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIHBsdWctaW5zIHJlZmVyZW5jZWQgYnkgYSBtZXRob2QgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwbHVnLWluCi0JICogQHJldHVybiBhIGxpc3Qgb2YgbWV0aG9kIHBsdWctaW5zCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFBsdWdpbkRpcmVjdEV4dGVuc2lvbnMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHBsdWdpbikKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoTWV0aG9kUGx1Z2luX0RpcmVjdEV4dGVuc2lvbnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSByZWZlcmVuY2VzIHRvIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBtZXRob2QgZWxlbWVudCByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFJlZmVyZW5jZXMoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVNldCByZWZlcmVuY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgZU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudDsKLQotCQlpZiAoZU9iai5iYXNpY0dldE9wcG9zaXRlRmVhdHVyZU1hcCgpID09IG51bGwpCi0JCQlyZXR1cm4gcmVmZXJlbmNlczsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlT2JqLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSAoKE9wcG9zaXRlRmVhdHVyZSkgZW50cnkuZ2V0S2V5KCkpOwotCQkJb3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKTsKLQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlyZWZlcmVuY2VzLmFkZEFsbCgoQ29sbGVjdGlvbikgZU9iagotCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSkpOwotCQkJfSBlbHNlIHsKLQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBlT2JqCi0JCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKTsKLQkJCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCQkJcmVmZXJlbmNlcy5hZGQob2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgcmVmZXJlbmNlcyB0byBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIG1hcCBjb250YWluaW5nIG1ldGhvZCBlbGVtZW50IHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRSZWZlcmVuY2VNYXAoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCU1hcCBvYmplY3RUb0ZlYXR1cmVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNdWx0aVJlc291cmNlRU9iamVjdCBlT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50OwotCi0JCWlmIChlT2JqLmJhc2ljR2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG9iamVjdFRvRmVhdHVyZXNNYXA7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlT2JqLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSAoKE9wcG9zaXRlRmVhdHVyZSkgZW50cnkuZ2V0S2V5KCkpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENvbGxlY3Rpb24pIGVPYmoKLQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBvYmplY3QgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gKENvbGxlY3Rpb24pIG9iamVjdFRvRmVhdHVyZXNNYXAKLQkJCQkJCQkuZ2V0KG9iamVjdCk7Ci0JCQkJCWlmIChmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkJCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCW9iamVjdFRvRmVhdHVyZXNNYXAucHV0KG9iamVjdCwgZmVhdHVyZXMpOwotCQkJCQl9Ci0JCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQl9Ci0JCQkJOwotCQkJfSBlbHNlIHsKLQkJCQlFT2JqZWN0IG9iamVjdCA9IChFT2JqZWN0KSBlT2JqCi0JCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKTsKLQkJCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9IChDb2xsZWN0aW9uKSBvYmplY3RUb0ZlYXR1cmVzTWFwCi0JCQkJCQkJLmdldChvYmplY3QpOwotCQkJCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJCQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlvYmplY3RUb0ZlYXR1cmVzTWFwLnB1dChvYmplY3QsIGZlYXR1cmVzKTsKLQkJCQkJfQotCQkJCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9iamVjdFRvRmVhdHVyZXNNYXA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGluaXQoKSB7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBzZXQgb2YgZWxlbWVudHMsIHJldHVybnMgdGhlIHNldCBvZiB0aG9zZSBlbGVtZW50cyBwbHVzIGFueQotCSAqIHZhcmlhYmlsaXR5IGVsZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50U2V0Ci0JICogICAgICAgICAgICBhIHNldCBvZiBtZXRob2QgZWxlbWVudHMgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJpbGl0eQotCSAqICAgICAgICAgICAgZWxlbWVudHMKLQkgKiBAcGFyYW0gZ2V0QmFzZXMKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCByZWN1cnNlIGludG8gdGhlIHZhcmlhYmlsaXR5IGJhc2UKLQkgKiAgICAgICAgICAgIGVsZW1lbnRzICgidXAgdGhlIHRyZWUiKQotCSAqIEBwYXJhbSBnZXRDaGlsZHJlbgotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHJlY3Vyc2UgaW50byB0aGUgdmFyaWV0aWVzICgiZG93biB0aGUKLQkgKiAgICAgICAgICAgIHRyZWUiKQotCSAqIEByZXR1cm4gYSBjb2xsZWN0aXZlIHNldCBvZiBtZXRob2QgZWxlbWVudHMgcGx1cyB0aGUgYXNzb2NpYXRlZAotCSAqICAgICAgICAgdmFyaWFiaWxpdHkgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNldCBnZXRWYXJpYWJpbGl0eUVsZW1lbnRzKFNldCBlbGVtZW50U2V0LCBib29sZWFuIGdldEJhc2VzLAotCQkJYm9vbGVhbiBnZXRDaGlsZHJlbikgewotCQlpZiAoZWxlbWVudFNldCAhPSBudWxsICYmICFlbGVtZW50U2V0LmlzRW1wdHkoKSkgewotCQkJU2V0IHZhclNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50U2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvOwotCQkJCQlpZiAoZ2V0Q2hpbGRyZW4pCi0JCQkJCQl2YXJTZXQuYWRkQWxsKGdldEltbWVkaWF0ZVZhcmlldGllcyhlbGVtZW50KSk7Ci0JCQkJCWlmIChnZXRCYXNlcwotCQkJCQkJCSYmIGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpCi0JCQkJCQl2YXJTZXQuYWRkKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodmFyU2V0LmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZWxlbWVudFNldDsKLQkJCWlmIChlbGVtZW50U2V0LmNvbnRhaW5zQWxsKHZhclNldCkpCi0JCQkJcmV0dXJuIGVsZW1lbnRTZXQ7Ci0JCQllbGVtZW50U2V0LmFkZEFsbCh2YXJTZXQpOwotCQkJZWxlbWVudFNldC5hZGRBbGwoZ2V0VmFyaWFiaWxpdHlFbGVtZW50cyhlbGVtZW50U2V0LCBnZXRCYXNlcywKLQkJCQkJZ2V0Q2hpbGRyZW4pKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudFNldDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjODk1Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGNyZWF0aW9uIG9mIGNvbnRlbnQgZGVzY3JpcHRpb25zLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeSB7Ci0KLQkvLyBNYXBzIENvbnRlbnRFbGVtZW50IGltcGxlbWVudGF0aW9uIENsYXNzIHRvIENvbnRlbnREZXNjaXB0aW9uSW5mby4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgY29udGVudERlc2NDbGFzc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlzdGF0aWMgewotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2soKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlbXBsYXRlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXhhbXBsZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJldXNhYmxlQXNzZXQoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXaGl0ZXBhcGVyKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3QoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGNvbWUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkpOwotCi0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkpOwotCi0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0KLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRJdGVyYXRpb24oKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaGFzZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENhcGFiaWxpdHlQYXR0ZXJuKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3MoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRUNsYXNzIGdldENvbnRlbnREZXNjcmlwdGlvblR5cGUoRUNsYXNzIGRlc2NyaWJhYmxlRWxlbWVudFR5cGUpIHsKLQkJcmV0dXJuIChFQ2xhc3MpIGNvbnRlbnREZXNjQ2xhc3NNYXAuZ2V0KGRlc2NyaWJhYmxlRWxlbWVudFR5cGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29udGVudERlc2NyaXB0aW9uIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBlKSB7Ci0JCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBjb250ZW50RGVzY0NsYXNzTWFwLmdldChlLmVDbGFzcygpKTsKLQkJaWYgKGVDbGFzcyA9PSBudWxsKSB7Ci0JCQllQ2xhc3MgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJfQotCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZShlQ2xhc3MpOwotCQljb250ZW50LnNldE5hbWUoVW1hVXRpbC5jcmVhdGVDb250ZW50RGVzY3JpcHRpb25OYW1lKGUpKTsKLQkJY29udGVudC5zZXRHdWlkKFVtYVV0aWwuZ2VuZXJhdGVHVUlEKGUuZ2V0R3VpZCgpKSk7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQ29udGVudERlc2NyaXB0aW9uIG9iamVjdCBmb3IgdGhlIGdpdmVuIENvbnRlbnRFbGVtZW50IGFuZAotCSAqIHNhdmUgaXQgdG8gYSBmaWxlCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICogQGRlcHJlY2F0ZWQgdXNlIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihEZXNjcmliYWJsZUVsZW1lbnQgZSkgaW5zdGVhZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udGVudERlc2NyaXB0aW9uIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihDb250ZW50RWxlbWVudCBlKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIHNhdmVDb250ZW50T25seQotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKERlc2NyaWJhYmxlRWxlbWVudCBlKSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHN0YXRpYyBDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKAotCQkJRGVzY3JpYmFibGVFbGVtZW50IGUsIGJvb2xlYW4gc2F2ZUNvbnRlbnRPbmx5KSB7Ci0JCS8vIGlmICggZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KQotCQkvLyB7Ci0JCS8vIHJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKENvbnRlbnRFbGVtZW50KWUsIHNhdmVDb250ZW50T25seSk7Ci0JCS8vIH0KLQkJLy8JCQotCQkvLyByZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKGUpOwotCi0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKENvbnRlbnRFbGVtZW50IGUsCi0JCQlib29sZWFuIHNhdmVDb250ZW50T25seSkgewotCQlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKERlc2NyaWJhYmxlRWxlbWVudCkgZSk7Ci0KLQkJLy8gU2V0IGRlc2NyaXB0aW9ucyA9IChTZXQpCi0JCS8vIGNvbnRlbnREZXNjcmlwdGlvbnNNYXAuZ2V0KGRlc2NJbmZvLnBhY2thZ2VOYW1lKTsKLQkJLy8gaWYoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJLy8gZGVzY3JpcHRpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJLy8gY29udGVudERlc2NyaXB0aW9uc01hcC5wdXQoZGVzY0luZm8ucGFja2FnZU5hbWUsIGRlc2NyaXB0aW9ucyk7Ci0JCS8vIH0KLQkJLy8gZGVzY3JpcHRpb25zLmFkZChkZXNjcmlwdGlvbik7Ci0KLQkJLy8gc2F2aW5nIENvbnRlbnREZXNjcmlwdGlvbiByaWdodCBhZnRlciBpdHMgY3JlYXRpb24gaXQgbm8gbG9uZ2VyCi0JCS8vIG5lZWRlZCBzaW5jZSBDb250ZW50RGVzY3JpcHRpb24gaXMKLQkJLy8gbm93IGNvbnRhaW5lZCBieSBhIERlc2NyaWJhYmxlRWxlbWVudAotCQkvLwotCQkvLyBpZihsaWJQZXJzaXN0ZXIgIT0gbnVsbCkgewotCQkvLyBsaWJQZXJzaXN0ZXIuc2F2ZShlLCBkZXNjcmlwdGlvbiwgc2F2ZUNvbnRlbnRPbmx5KTsKLQkJLy8gfQotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBNYXAgZ2V0Q29udGVudERlc2NyaXB0aW9uc01hcCgpIHsKLQkvLyByZXR1cm4gY29udGVudERlc2NyaXB0aW9uc01hcDsKLQkvLyB9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUHJlc2VudGF0aW9uKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50SW1wbCkgewotCQkJcmV0dXJuICgoQ29udGVudEVsZW1lbnRJbXBsKSBlKS5iYXNpY0dldFByZXNlbnRhdGlvbigpICE9IG51bGw7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50SW1wbCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0VsZW1lbnRJbXBsKSBlKS5iYXNpY0dldFByZXNlbnRhdGlvbigpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRUNsYXNzIGdldENvbnRlbnREZXNjcmlwdGlvbkVDbGFzcyhEZXNjcmliYWJsZUVsZW1lbnQgZSkgewotCQlyZXR1cm4gKEVDbGFzcykgY29udGVudERlc2NDbGFzc01hcC5nZXQoZS5lQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIE1lc3NhZ2VEaWdlc3QgbWQ1ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7Ci0JCVN0cmluZyBpbnB1dCA9IGFyZ3NbMF07Ci0JCS8vIGJ5dGVbXSBoYXNoID0gbWQ1LmRpZ2VzdChpbnB1dC5nZXRCeXRlcygpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJpbnB1dDogJyIgKyBpbnB1dCArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkphdmEncyBoYXNoIGNvZGU6ICIgKyBpbnB1dC5oYXNoQ29kZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhhc2ggbGVuZ3RoOiAiICsgaGFzaC5sZW5ndGgpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImJhc2U2NCBlbmNvZGVkOiAiICsKLQkJLy8gRGF0YVZhbHVlLkJhc2U2NC5lbmNvZGUoaGFzaCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5ldyBHVUlEOiAiICsgVW1hVXRpbC5nZW5lcmF0ZUdVSUQoaW5wdXQpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL01lc3NhZ2VFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL01lc3NhZ2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjRhODhiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9NZXNzYWdlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBtZXRob2QgbGlicmFyeSBwZXJzaXN0ZW5jZSBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VFeGNlcHRpb24gZXh0ZW5kcyBXcmFwcGVkRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4Y2VwdGlvbiBEVU1NWV9FWENFUFRJT04gPSBuZXcgRXhjZXB0aW9uKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzOTA0NjgyNjU2NjgzMDEzNDMzTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIGFuIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0JCXN1cGVyKG1zZywgRFVNTVlfRVhDRVBUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBhbiBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgYW4gZXhjZXB0aW9uIG9iamVjdAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCXN1cGVyKG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTAyODYyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLWNvcHlyaWdodD1JQk0gQ29ycG9yYXRpb24KLWVycl9jYW5ub3RNb2RpZnkwPUNhbm5vdCBtb2RpZnkgJyd7MH0nJwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmNDJlNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHNldWRvU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZU1hY2hpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCi0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVW1hUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYUFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBVbWFTd2l0Y2ggbW9kZWxTd2l0Y2ggPSBuZXcgVW1hU3dpdGNoKCkgewotCQlwdWJsaWMgT2JqZWN0IGNhc2VDbGFzc2lmaWVyKENsYXNzaWZpZXIgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ2xhc3NpZmllckFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVR5cGUoVHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUeXBlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRWxlbWVudChFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VOYW1lZEVsZW1lbnQoTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU5hbWVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVBhY2thZ2VhYmxlRWxlbWVudChQYWNrYWdlYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUGFja2FnZWFibGVFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUGFja2FnZShvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUGFja2FnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZU5hbWVzcGFjZShOYW1lc3BhY2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTmFtZXNwYWNlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kRWxlbWVudChNZXRob2RFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25zdHJhaW50KENvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29uc3RyYWludEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eShNZXRob2RFbGVtZW50UHJvcGVydHkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlQ29udGVudEVsZW1lbnQoQ29udGVudEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29udGVudEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoRGVzY3JpYmFibGVFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURlc2NyaWJhYmxlRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRlbnREZXNjcmlwdGlvbihDb250ZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlU2VjdGlvbihTZWN0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNlY3Rpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlKFJvbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUm9sZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0KFdvcmtQcm9kdWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlVGFzayhUYXNrIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRhc2tBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrRGVmaW5pdGlvbihXb3JrRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXb3JrRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVN0ZXAoU3RlcCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVTdGVwQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlR3VpZGFuY2UoR3VpZGFuY2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VBcnRpZmFjdChBcnRpZmFjdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVBcnRpZmFjdEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURlbGl2ZXJhYmxlKERlbGl2ZXJhYmxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURlbGl2ZXJhYmxlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlT3V0Y29tZShPdXRjb21lIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU91dGNvbWVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RQYWNrYWdlKE1ldGhvZFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kUGFja2FnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRlbnRQYWNrYWdlKENvbnRlbnRQYWNrYWdlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnRQYWNrYWdlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlQXJ0aWZhY3REZXNjcmlwdGlvbihBcnRpZmFjdERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUm9sZURlc2NyaXB0aW9uKFJvbGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSb2xlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrRGVzY3JpcHRpb24oVGFza0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUd1aWRhbmNlRGVzY3JpcHRpb24oR3VpZGFuY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUHJhY3RpY2VEZXNjcmlwdGlvbihQcmFjdGljZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VQb2ludChQb2ludCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQb2ludEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlR3JhcGhFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRGlhZ3JhbUVsZW1lbnQoRGlhZ3JhbUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGlhZ3JhbUVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEaWFncmFtTGluayhEaWFncmFtTGluayBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEaWFncmFtTGlua0FkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUdyYXBoQ29ubmVjdG9yKEdyYXBoQ29ubmVjdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUdyYXBoQ29ubmVjdG9yQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlU2VtYW50aWNNb2RlbEJyaWRnZShTZW1hbnRpY01vZGVsQnJpZGdlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEaW1lbnNpb24oRGltZW5zaW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURpbWVuc2lvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVJlZmVyZW5jZShSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUmVmZXJlbmNlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUHJvcGVydHkoUHJvcGVydHkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJvcGVydHlBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VHcmFwaEVkZ2UoR3JhcGhFZGdlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUdyYXBoRWRnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURpYWdyYW0oRGlhZ3JhbSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEaWFncmFtQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlR3JhcGhOb2RlKEdyYXBoTm9kZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHcmFwaE5vZGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgKLQkJCQlTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoQ29yZVNlbWFudGljTW9kZWxCcmlkZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VMZWFmRWxlbWVudChMZWFmRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVMZWFmRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVRleHRFbGVtZW50KFRleHRFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRleHRFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlSW1hZ2UoSW1hZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSW1hZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VHcmFwaGljUHJpbWl0aXZlKEdyYXBoaWNQcmltaXRpdmUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlR3JhcGhpY1ByaW1pdGl2ZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVBvbHlsaW5lKFBvbHlsaW5lIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVBvbHlsaW5lQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRWxsaXBzZShFbGxpcHNlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVsbGlwc2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VBY3Rpdml0eShBY3Rpdml0eSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KFdvcmtCcmVha2Rvd25FbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlQnJlYWtkb3duRWxlbWVudChCcmVha2Rvd25FbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VNaWxlc3RvbmUoTWlsZXN0b25lIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUl0ZXJhdGlvbihJdGVyYXRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUGhhc2UoUGhhc2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUGhhc2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VUZWFtUHJvZmlsZShUZWFtUHJvZmlsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlV29ya09yZGVyKFdvcmtPcmRlciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXb3JrT3JkZXJBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzRWxlbWVudChQcm9jZXNzRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUGxhbm5pbmdEYXRhQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRvcihEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0b3IoV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVRhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlQ29tcG9zaXRlUm9sZShDb21wb3NpdGVSb2xlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oCi0JCQkJQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oQWN0aXZpdHlEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oCi0JCQkJRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzRGVzY3JpcHRpb24oUHJvY2Vzc0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0b3JEZXNjcmlwdGlvbihEZXNjcmlwdG9yRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlQ29uY2VwdChDb25jZXB0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbmNlcHRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VDaGVja2xpc3QoQ2hlY2tsaXN0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNoZWNrbGlzdEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUV4YW1wbGUoRXhhbXBsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFeGFtcGxlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlR3VpZGVsaW5lKEd1aWRlbGluZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHdWlkZWxpbmVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXBvcnQoUmVwb3J0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJlcG9ydEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVRlbXBsYXRlKFRlbXBsYXRlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRlbXBsYXRlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlU3VwcG9ydGluZ01hdGVyaWFsKFN1cHBvcnRpbmdNYXRlcmlhbCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWxBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VUb29sTWVudG9yKFRvb2xNZW50b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVdoaXRlcGFwZXIoV2hpdGVwYXBlciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXaGl0ZXBhcGVyQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlVGVybURlZmluaXRpb24oVGVybURlZmluaXRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVGVybURlZmluaXRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VQcmFjdGljZShQcmFjdGljZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcmFjdGljZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygKLQkJCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUmV1c2FibGVBc3NldChSZXVzYWJsZUFzc2V0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VTdGF0ZShTdGF0ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVTdGF0ZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVZlcnRleChWZXJ0ZXggb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVmVydGV4QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUmVnaW9uKFJlZ2lvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSZWdpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VTdGF0ZU1hY2hpbmUoU3RhdGVNYWNoaW5lIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVN0YXRlTWFjaGluZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVRyYW5zaXRpb24oVHJhbnNpdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUcmFuc2l0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUHNldWRvU3RhdGUoUHNldWRvU3RhdGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHNldWRvU3RhdGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEaXNjaXBsaW5lKERpc2NpcGxpbmUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRlbnRDYXRlZ29yeShDb250ZW50Q2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29udGVudENhdGVnb3J5QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUm9sZVNldChSb2xlU2V0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEb21haW4oRG9tYWluIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0VHlwZShXb3JrUHJvZHVjdFR5cGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3RUeXBlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRGlzY2lwbGluZUdyb3VwaW5nKERpc2NpcGxpbmVHcm91cGluZyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VUb29sKFRvb2wgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVG9vbEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVTZXRHcm91cGluZyhSb2xlU2V0R3JvdXBpbmcgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUm9sZVNldEdyb3VwaW5nQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEZWxpdmVyeVByb2Nlc3MoRGVsaXZlcnlQcm9jZXNzIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VDYXBhYmlsaXR5UGF0dGVybihDYXBhYmlsaXR5UGF0dGVybiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUm9hZG1hcChSb2FkbWFwIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJvYWRtYXBBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NQYWNrYWdlKFByb2Nlc3NQYWNrYWdlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgKLQkJCQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigKLQkJCQlQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kUGx1Z2luQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVWYXJpYWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RVbml0KE1ldGhvZFVuaXQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kVW5pdEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUHJvY2Vzc0ZhbWlseShQcm9jZXNzRmFtaWx5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NGYW1pbHlBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlcikgbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpIHRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXIgPGVtPkNsYXNzaWZpZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNsYXNzaWZpZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCA8ZW0+TmFtZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVOYW1lZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50IDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIDxlbT5QYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZXNwYWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5hbWVzcGFjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50IDxlbT5NZXRob2QgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50IDxlbT5Db25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25zdHJhaW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpYmFibGVFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiA8ZW0+U2VjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrRGVmaW5pdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwIDxlbT5TdGVwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGVwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlIDxlbT5HdWlkYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0IDxlbT5BcnRpZmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlIDxlbT5EZWxpdmVyYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJhYmxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWUgPGVtPk91dGNvbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGNvbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UgPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24gPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24gPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24gPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiA8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiA8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiA8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgPGVtPlBvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9pbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCA8ZW0+RGlhZ3JhbSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlhZ3JhbUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsgPGVtPkRpYWdyYW0gTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpYWdyYW1MaW5rQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yIDxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaENvbm5lY3RvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlIDxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uIDxlbT5EaW1lbnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGltZW5zaW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSA8ZW0+UmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlZmVyZW5jZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9wZXJ0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UgPGVtPkdyYXBoIEVkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhFZGdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpYWdyYW1BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlIDxlbT5HcmFwaCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCA8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlIDxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIDxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50IDxlbT5MZWFmIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMZWFmRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudCA8ZW0+VGV4dCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGV4dEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UgPGVtPkltYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW1hZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZSA8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoaWNQcmltaXRpdmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUgPGVtPlBvbHlsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9seWxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSA8ZW0+RWxsaXBzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxsaXBzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSA8ZW0+QWN0aXZpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb24gPGVtPkl0ZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2UgPGVtPlBoYXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUgPGVtPlRlYW0gUHJvZmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIgPGVtPldvcmsgT3JkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya09yZGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGxhbm5pbmdEYXRhQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IgPGVtPkRlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IgPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGUgPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wb3NpdGVSb2xlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiA8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24gPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbmNlcHRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hlY2tsaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4YW1wbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGVsaW5lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVwb3J0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlIDxlbT5UZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlbXBsYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWxBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xNZW50b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2hpdGVwYXBlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbiA8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVybURlZmluaXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UgPGVtPlByYWN0aWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGUgPGVtPlN0YXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RhdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4IDxlbT5WZXJ0ZXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXgKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVmVydGV4QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbiA8ZW0+UmVnaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlZ2lvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZU1hY2hpbmUgPGVtPlN0YXRlIE1hY2hpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZU1hY2hpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RhdGVNYWNoaW5lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb24gPGVtPlRyYW5zaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRyYW5zaXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHNldWRvU3RhdGUgPGVtPlBzZXVkbyBTdGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBzZXVkb1N0YXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBzZXVkb1N0YXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUgPGVtPkRpc2NpcGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5IDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0IDxlbT5Sb2xlIFNldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4gPGVtPkRvbWFpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb21haW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sIDxlbT5Ub29sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUb29sQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZyA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEdyb3VwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5IDxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDdXN0b21DYXRlZ29yeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3MgPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm4gPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcCA8ZW0+Um9hZG1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9hZG1hcEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50IDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSA8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVmFyaWFiaWxpdHlFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQgPGVtPk1ldGhvZCBVbml0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RVbml0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHkgPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzRmFtaWx5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RMaWJyYXJ5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1VtYUFkYXB0ZXJGYWN0b3J5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hUmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWFmYzg0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIFVNQSByZXNvdXJjZSBidW5kbGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVW1hUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFVtYVJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFVtYVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyX2Nhbm5vdE1vZGlmeTA7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBVbWFSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNmQ1ZDcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBzZXVkb1N0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGVNYWNoaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVW1hUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYVN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfSBlbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybiBlU3VwZXJUeXBlcy5pc0VtcHR5KCkgPyBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6IGRvU3dpdGNoKAotCQkJCQkoRUNsYXNzKSBlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ0xBU1NJRklFUjogewotCQkJQ2xhc3NpZmllciBjbGFzc2lmaWVyID0gKENsYXNzaWZpZXIpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY2xhc3NpZmllcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoY2xhc3NpZmllcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjbGFzc2lmaWVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNsYXNzaWZpZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNsYXNzaWZpZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVFlQRTogewotCQkJVHlwZSB0eXBlID0gKFR5cGUpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVR5cGUodHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0eXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRUxFTUVOVDogewotCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UOiB7Ci0JCQlOYW1lZEVsZW1lbnQgbmFtZWRFbGVtZW50ID0gKE5hbWVkRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG5hbWVkRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobmFtZWRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBBQ0tBR0VBQkxFX0VMRU1FTlQ6IHsKLQkJCVBhY2thZ2VhYmxlRWxlbWVudCBwYWNrYWdlYWJsZUVsZW1lbnQgPSAoUGFja2FnZWFibGVFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocGFja2FnZWFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBhY2thZ2VhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocGFja2FnZWFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBBQ0tBR0U6IHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSBwYWNrYWdlXyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBhY2thZ2UocGFja2FnZV8pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lc3BhY2UocGFja2FnZV8pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocGFja2FnZV8pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocGFja2FnZV8pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHBhY2thZ2VfKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVTUEFDRTogewotCQkJTmFtZXNwYWNlIG5hbWVzcGFjZSA9IChOYW1lc3BhY2UpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShuYW1lc3BhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobmFtZXNwYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChuYW1lc3BhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlQ6IHsKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlQ6IHsKLQkJCUNvbnN0cmFpbnQgY29uc3RyYWludCA9IChDb25zdHJhaW50KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb25zdHJhaW50KGNvbnN0cmFpbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29uc3RyYWludCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb25zdHJhaW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb25zdHJhaW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZOiB7Ci0JCQlNZXRob2RFbGVtZW50UHJvcGVydHkgbWV0aG9kRWxlbWVudFByb3BlcnR5ID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudFByb3BlcnR5KG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kRWxlbWVudFByb3BlcnR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UOiB7Ci0JCQlDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlQ6IHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZXNjcmliYWJsZUVsZW1lbnQgPSAoRGVzY3JpYmFibGVFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OOiB7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gKENvbnRlbnREZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT046IHsKLQkJCVNlY3Rpb24gc2VjdGlvbiA9IChTZWN0aW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZWN0aW9uKHNlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoc2VjdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoc2VjdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChzZWN0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHNlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHNlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUk9MRTogewotCQkJUm9sZSByb2xlID0gKFJvbGUpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJvbGUocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1Q6IHsKLQkJCVdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLOiB7Ci0JCQlUYXNrIHRhc2sgPSAoVGFzaykgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGFzayh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudCh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT046IHsKLQkJCVdvcmtEZWZpbml0aW9uIHdvcmtEZWZpbml0aW9uID0gKFdvcmtEZWZpbml0aW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbih3b3JrRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlNURVA6IHsKLQkJCVN0ZXAgc3RlcCA9IChTdGVwKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTdGVwKHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VTZWN0aW9uKHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc3RlcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFOiB7Ci0JCQlHdWlkYW5jZSBndWlkYW5jZSA9IChHdWlkYW5jZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlR3VpZGFuY2UoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1Q6IHsKLQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcnRpZmFjdChhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFOiB7Ci0JCQlEZWxpdmVyYWJsZSBkZWxpdmVyYWJsZSA9IChEZWxpdmVyYWJsZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGVsaXZlcmFibGUoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdChkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5PVVRDT01FOiB7Ci0JCQlPdXRjb21lIG91dGNvbWUgPSAoT3V0Y29tZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3V0Y29tZShvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3Qob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRTogewotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlID0gKE1ldGhvZFBhY2thZ2UpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UobWV0aG9kUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2UobWV0aG9kUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZXNwYWNlKG1ldGhvZFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0U6IHsKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQYWNrYWdlID0gKENvbnRlbnRQYWNrYWdlKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb250ZW50UGFja2FnZShjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UoY29udGVudFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZShjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29udGVudFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT046IHsKLQkJCUFydGlmYWN0RGVzY3JpcHRpb24gYXJ0aWZhY3REZXNjcmlwdGlvbiA9IChBcnRpZmFjdERlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcnRpZmFjdERlc2NyaXB0aW9uKGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OOiB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHdvcmtQcm9kdWN0RGVzY3JpcHRpb24gPSAoV29ya1Byb2R1Y3REZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbih3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OOiB7Ci0JCQlEZWxpdmVyYWJsZURlc2NyaXB0aW9uIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPSAoRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGVsaXZlcmFibGVEZXNjcmlwdGlvbihkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbihkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT046IHsKLQkJCVJvbGVEZXNjcmlwdGlvbiByb2xlRGVzY3JpcHRpb24gPSAoUm9sZURlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSb2xlRGVzY3JpcHRpb24ocm9sZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHJvbGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQocm9sZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT046IHsKLQkJCVRhc2tEZXNjcmlwdGlvbiB0YXNrRGVzY3JpcHRpb24gPSAoVGFza0Rlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYXNrRGVzY3JpcHRpb24odGFza0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHRhc2tEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQodGFza0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGFza0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodGFza0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OOiB7Ci0JCQlHdWlkYW5jZURlc2NyaXB0aW9uIGd1aWRhbmNlRGVzY3JpcHRpb24gPSAoR3VpZGFuY2VEZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlR3VpZGFuY2VEZXNjcmlwdGlvbihndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OOiB7Ci0JCQlQcmFjdGljZURlc2NyaXB0aW9uIHByYWN0aWNlRGVzY3JpcHRpb24gPSAoUHJhY3RpY2VEZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJhY3RpY2VEZXNjcmlwdGlvbihwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UOiB7Ci0JCQlQb2ludCBwb2ludCA9IChQb2ludCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUG9pbnQocG9pbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVDogewotCQkJR3JhcGhFbGVtZW50IGdyYXBoRWxlbWVudCA9IChHcmFwaEVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUdyYXBoRWxlbWVudChncmFwaEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChncmFwaEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGdyYXBoRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChncmFwaEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3JhcGhFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChncmFwaEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UOiB7Ci0JCQlEaWFncmFtRWxlbWVudCBkaWFncmFtRWxlbWVudCA9IChEaWFncmFtRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZGlhZ3JhbUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRpYWdyYW1FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpYWdyYW1FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRpYWdyYW1FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkaWFncmFtRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTks6IHsKLQkJCURpYWdyYW1MaW5rIGRpYWdyYW1MaW5rID0gKERpYWdyYW1MaW5rKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEaWFncmFtTGluayhkaWFncmFtTGluayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGRpYWdyYW1MaW5rKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkaWFncmFtTGluayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkaWFncmFtTGluayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkaWFncmFtTGluayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGlhZ3JhbUxpbmspOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SOiB7Ci0JCQlHcmFwaENvbm5lY3RvciBncmFwaENvbm5lY3RvciA9IChHcmFwaENvbm5lY3RvcikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlR3JhcGhDb25uZWN0b3IoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHcmFwaEVsZW1lbnQoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChncmFwaENvbm5lY3Rvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGdyYXBoQ29ubmVjdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRTogewotCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBzZW1hbnRpY01vZGVsQnJpZGdlID0gKFNlbWFudGljTW9kZWxCcmlkZ2UpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlbWFudGljTW9kZWxCcmlkZ2Uoc2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KHNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChzZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTjogewotCQkJRGltZW5zaW9uIGRpbWVuc2lvbiA9IChEaW1lbnNpb24pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZURpbWVuc2lvbihkaW1lbnNpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFOiB7Ci0JCQlSZWZlcmVuY2UgcmVmZXJlbmNlID0gKFJlZmVyZW5jZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVmZXJlbmNlKHJlZmVyZW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KHJlZmVyZW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocmVmZXJlbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJlZmVyZW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyZWZlcmVuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJlZmVyZW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWTogewotCQkJUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb3BlcnR5KHByb3BlcnR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQocHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb3BlcnR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb3BlcnR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb3BlcnR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFOiB7Ci0JCQlHcmFwaEVkZ2UgZ3JhcGhFZGdlID0gKEdyYXBoRWRnZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlR3JhcGhFZGdlKGdyYXBoRWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUdyYXBoRWxlbWVudChncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGdyYXBoRWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3JhcGhFZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTTogewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZURpYWdyYW0oZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUdyYXBoTm9kZShkaWFncmFtKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3JhcGhFbGVtZW50KGRpYWdyYW0pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChkaWFncmFtKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkaWFncmFtKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpYWdyYW0pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9OT0RFOiB7Ci0JCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gKEdyYXBoTm9kZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlR3JhcGhOb2RlKGdyYXBoTm9kZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUdyYXBoRWxlbWVudChncmFwaE5vZGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChncmFwaE5vZGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGdyYXBoTm9kZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChncmFwaE5vZGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3JhcGhOb2RlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChncmFwaE5vZGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlQ6IHsKLQkJCVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50ID0gKFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVNlbWFudGljTW9kZWxCcmlkZ2Uoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0U6IHsKLQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgdW1hU2VtYW50aWNNb2RlbEJyaWRnZSA9IChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VVTUFTZW1hbnRpY01vZGVsQnJpZGdlKHVtYVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VTZW1hbnRpY01vZGVsQnJpZGdlKHVtYVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudCh1bWFTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh1bWFTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHVtYVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodW1hU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodW1hU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRTogewotCQkJQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UgY29yZVNlbWFudGljTW9kZWxCcmlkZ2UgPSAoQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlU2VtYW50aWNNb2RlbEJyaWRnZShjb3JlU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb3JlU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb3JlU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb3JlU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29yZVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTEVBRl9FTEVNRU5UOiB7Ci0JCQlMZWFmRWxlbWVudCBsZWFmRWxlbWVudCA9IChMZWFmRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTGVhZkVsZW1lbnQobGVhZkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChsZWFmRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobGVhZkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobGVhZkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobGVhZkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGxlYWZFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRFWFRfRUxFTUVOVDogewotCQkJVGV4dEVsZW1lbnQgdGV4dEVsZW1lbnQgPSAoVGV4dEVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRleHRFbGVtZW50KHRleHRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTGVhZkVsZW1lbnQodGV4dEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudCh0ZXh0RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGV4dEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGV4dEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGV4dEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRleHRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFOiB7Ci0JCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSW1hZ2UoaW1hZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VMZWFmRWxlbWVudChpbWFnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChpbWFnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChpbWFnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChpbWFnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoaW1hZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhJQ19QUklNSVRJVkU6IHsKLQkJCUdyYXBoaWNQcmltaXRpdmUgZ3JhcGhpY1ByaW1pdGl2ZSA9IChHcmFwaGljUHJpbWl0aXZlKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VHcmFwaGljUHJpbWl0aXZlKGdyYXBoaWNQcmltaXRpdmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VMZWFmRWxlbWVudChncmFwaGljUHJpbWl0aXZlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZ3JhcGhpY1ByaW1pdGl2ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3JhcGhpY1ByaW1pdGl2ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChncmFwaGljUHJpbWl0aXZlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGdyYXBoaWNQcmltaXRpdmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGdyYXBoaWNQcmltaXRpdmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkU6IHsKLQkJCVBvbHlsaW5lIHBvbHlsaW5lID0gKFBvbHlsaW5lKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQb2x5bGluZShwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUdyYXBoaWNQcmltaXRpdmUocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VMZWFmRWxlbWVudChwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KHBvbHlsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRTogewotCQkJRWxsaXBzZSBlbGxpcHNlID0gKEVsbGlwc2UpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVsbGlwc2UoZWxsaXBzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUdyYXBoaWNQcmltaXRpdmUoZWxsaXBzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUxlYWZFbGVtZW50KGVsbGlwc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGVsbGlwc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZWxsaXBzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZWxsaXBzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWTogewotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVDogewotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd29ya0JyZWFrZG93bkVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVDogewotCQkJQnJlYWtkb3duRWxlbWVudCBicmVha2Rvd25FbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FOiB7Ci0JCQlNaWxlc3RvbmUgbWlsZXN0b25lID0gKE1pbGVzdG9uZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWlsZXN0b25lKG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuSVRFUkFUSU9OOiB7Ci0JCQlJdGVyYXRpb24gaXRlcmF0aW9uID0gKEl0ZXJhdGlvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSXRlcmF0aW9uKGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBIQVNFOiB7Ci0JCQlQaGFzZSBwaGFzZSA9IChQaGFzZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUGhhc2UocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VBY3Rpdml0eShwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24ocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRTogewotCQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSAoVGVhbVByb2ZpbGUpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRlYW1Qcm9maWxlKHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1I6IHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSb2xlRGVzY3JpcHRvcihyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaXB0b3Iocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVI6IHsKLQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXb3JrT3JkZXIod29ya09yZGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQod29ya09yZGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya09yZGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya09yZGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya09yZGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19FTEVNRU5UOiB7Ci0JCQlQcm9jZXNzRWxlbWVudCBwcm9jZXNzRWxlbWVudCA9IChQcm9jZXNzRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwcm9jZXNzRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEE6IHsKLQkJCVBsYW5uaW5nRGF0YSBwbGFubmluZ0RhdGEgPSAoUGxhbm5pbmdEYXRhKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQbGFubmluZ0RhdGEocGxhbm5pbmdEYXRhKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUjogewotCQkJRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKERlc2NyaXB0b3IpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1I6IHsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3b3JrUHJvZHVjdERlc2NyaXB0b3IgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0b3Iod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpcHRvcih3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUjogewotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRhc2tEZXNjcmlwdG9yKHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRTogewotCQkJQ29tcG9zaXRlUm9sZSBjb21wb3NpdGVSb2xlID0gKENvbXBvc2l0ZVJvbGUpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbXBvc2l0ZVJvbGUoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVJvbGVEZXNjcmlwdG9yKGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OOiB7Ci0JCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uID0gKEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTjogewotCQkJQWN0aXZpdHlEZXNjcmlwdGlvbiBhY3Rpdml0eURlc2NyaXB0aW9uID0gKEFjdGl2aXR5RGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT046IHsKLQkJCURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uID0gKERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTjogewotCQkJUHJvY2Vzc0Rlc2NyaXB0aW9uIHByb2Nlc3NEZXNjcmlwdGlvbiA9IChQcm9jZXNzRGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTjogewotCQkJRGVzY3JpcHRvckRlc2NyaXB0aW9uIGRlc2NyaXB0b3JEZXNjcmlwdGlvbiA9IChEZXNjcmlwdG9yRGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZURlc2NyaXB0b3JEZXNjcmlwdGlvbihkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNPTkNFUFQ6IHsKLQkJCUNvbmNlcHQgY29uY2VwdCA9IChDb25jZXB0KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb25jZXB0KGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNIRUNLTElTVDogewotCQkJQ2hlY2tsaXN0IGNoZWNrbGlzdCA9IChDaGVja2xpc3QpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNoZWNrbGlzdChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRVhBTVBMRTogewotCQkJRXhhbXBsZSBleGFtcGxlID0gKEV4YW1wbGUpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUV4YW1wbGUoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuR1VJREVMSU5FOiB7Ci0JCQlHdWlkZWxpbmUgZ3VpZGVsaW5lID0gKEd1aWRlbGluZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlR3VpZGVsaW5lKGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5SRVBPUlQ6IHsKLQkJCVJlcG9ydCByZXBvcnQgPSAoUmVwb3J0KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXBvcnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2UocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRFTVBMQVRFOiB7Ci0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGVtcGxhdGUodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZSh0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5TVVBQT1JUSU5HX01BVEVSSUFMOiB7Ci0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgc3VwcG9ydGluZ01hdGVyaWFsID0gKFN1cHBvcnRpbmdNYXRlcmlhbCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU3VwcG9ydGluZ01hdGVyaWFsKHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX01FTlRPUjogewotCQkJVG9vbE1lbnRvciB0b29sTWVudG9yID0gKFRvb2xNZW50b3IpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRvb2xNZW50b3IodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuV0hJVEVQQVBFUjogewotCQkJV2hpdGVwYXBlciB3aGl0ZXBhcGVyID0gKFdoaXRlcGFwZXIpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdoaXRlcGFwZXIod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbmNlcHQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OOiB7Ci0JCQlUZXJtRGVmaW5pdGlvbiB0ZXJtRGVmaW5pdGlvbiA9IChUZXJtRGVmaW5pdGlvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGVybURlZmluaXRpb24odGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZSh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRTogewotCQkJUHJhY3RpY2UgcHJhY3RpY2UgPSAoUHJhY3RpY2UpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByYWN0aWNlKHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2UocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzogewotCQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IChFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyhlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQ6IHsKLQkJCVJldXNhYmxlQXNzZXQgcmV1c2FibGVBc3NldCA9IChSZXVzYWJsZUFzc2V0KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXVzYWJsZUFzc2V0KHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFOiB7Ci0JCQlTdGF0ZSBzdGF0ZSA9IChTdGF0ZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU3RhdGUoc3RhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWZXJ0ZXgoc3RhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVkVSVEVYOiB7Ci0JCQlWZXJ0ZXggdmVydGV4ID0gKFZlcnRleCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVmVydGV4KHZlcnRleCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT046IHsKLQkJCVJlZ2lvbiByZWdpb24gPSAoUmVnaW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZWdpb24ocmVnaW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFX01BQ0hJTkU6IHsKLQkJCVN0YXRlTWFjaGluZSBzdGF0ZU1hY2hpbmUgPSAoU3RhdGVNYWNoaW5lKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTdGF0ZU1hY2hpbmUoc3RhdGVNYWNoaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24oc3RhdGVNYWNoaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChzdGF0ZU1hY2hpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc3RhdGVNYWNoaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHN0YXRlTWFjaGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoc3RhdGVNYWNoaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT046IHsKLQkJCVRyYW5zaXRpb24gdHJhbnNpdGlvbiA9IChUcmFuc2l0aW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUcmFuc2l0aW9uKHRyYW5zaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFNFVURPX1NUQVRFOiB7Ci0JCQlQc2V1ZG9TdGF0ZSBwc2V1ZG9TdGF0ZSA9IChQc2V1ZG9TdGF0ZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHNldWRvU3RhdGUocHNldWRvU3RhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWZXJ0ZXgocHNldWRvU3RhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORTogewotCQkJRGlzY2lwbGluZSBkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZURpc2NpcGxpbmUoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUlk6IHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjb250ZW50Q2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUOiB7Ci0JCQlSb2xlU2V0IHJvbGVTZXQgPSAoUm9sZVNldCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUm9sZVNldChyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOOiB7Ci0JCQlEb21haW4gZG9tYWluID0gKERvbWFpbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRG9tYWluKGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEU6IHsKLQkJCVdvcmtQcm9kdWN0VHlwZSB3b3JrUHJvZHVjdFR5cGUgPSAoV29ya1Byb2R1Y3RUeXBlKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdFR5cGUod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HOiB7Ci0JCQlEaXNjaXBsaW5lR3JvdXBpbmcgZGlzY2lwbGluZUdyb3VwaW5nID0gKERpc2NpcGxpbmVHcm91cGluZykgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGlzY2lwbGluZUdyb3VwaW5nKGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVE9PTDogewotCQkJVG9vbCB0b29sID0gKFRvb2wpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRvb2wodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeSh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HOiB7Ci0JCQlSb2xlU2V0R3JvdXBpbmcgcm9sZVNldEdyb3VwaW5nID0gKFJvbGVTZXRHcm91cGluZykgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUm9sZVNldEdyb3VwaW5nKHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZOiB7Ci0JCQlDdXN0b21DYXRlZ29yeSBjdXN0b21DYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ3VzdG9tQ2F0ZWdvcnkoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTUzogewotCQkJRGVsaXZlcnlQcm9jZXNzIGRlbGl2ZXJ5UHJvY2VzcyA9IChEZWxpdmVyeVByb2Nlc3MpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZURlbGl2ZXJ5UHJvY2VzcyhkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzKGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1M6IHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jZXNzID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvY2Vzcyhwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHkocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNBUEFCSUxJVFlfUEFUVEVSTjogewotCQkJQ2FwYWJpbGl0eVBhdHRlcm4gY2FwYWJpbGl0eVBhdHRlcm4gPSAoQ2FwYWJpbGl0eVBhdHRlcm4pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNhcGFiaWxpdHlQYXR0ZXJuKGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2VzcyhjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURTogewotCQkJUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgPSAoUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzcyhwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUk9BRE1BUDogewotCQkJUm9hZG1hcCByb2FkbWFwID0gKFJvYWRtYXApIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJvYWRtYXAocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlQ6IHsKLQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcm9jZXNzQ29tcG9uZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzUGFja2FnZShwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZShwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lc3BhY2UocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRTogewotCQkJUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UgPSAoUHJvY2Vzc1BhY2thZ2UpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb2Nlc3NQYWNrYWdlKHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc1BhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlKHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZXNwYWNlKHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0U6IHsKLQkJCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA9IChQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1I6IHsKLQkJCVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yID0gKFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcihwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaXB0b3IocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU46IHsKLQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2RQbHVnaW4obWV0aG9kUGx1Z2luKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RQbHVnaW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlKG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kUGx1Z2luKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZXNwYWNlKG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RQbHVnaW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kUGx1Z2luKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RQbHVnaW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVDogewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZhcmlhYmlsaXR5RWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudCh2YXJpYWJpbGl0eUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHZhcmlhYmlsaXR5RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh2YXJpYWJpbGl0eUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodmFyaWFiaWxpdHlFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh2YXJpYWJpbGl0eUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVQ6IHsKLQkJCU1ldGhvZFVuaXQgbWV0aG9kVW5pdCA9IChNZXRob2RVbml0KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KG1ldGhvZFVuaXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kVW5pdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RVbml0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RVbml0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OOiB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZ3VyYXRpb24gPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kQ29uZmlndXJhdGlvbihtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0ZBTUlMWTogewotCQkJUHJvY2Vzc0ZhbWlseSBwcm9jZXNzRmFtaWx5ID0gKFByb2Nlc3NGYW1pbHkpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb2Nlc3NGYW1pbHkocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZENvbmZpZ3VyYXRpb24ocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzRmFtaWx5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NGYW1pbHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NGYW1pbHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUlk6IHsKLQkJCU1ldGhvZExpYnJhcnkgbWV0aG9kTGlicmFyeSA9IChNZXRob2RMaWJyYXJ5KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2RMaWJyYXJ5KG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlKG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lc3BhY2UobWV0aG9kTGlicmFyeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNsYXNzaWZpZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2xhc3NpZmllcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ2xhc3NpZmllcihDbGFzc2lmaWVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUeXBlKFR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVsZW1lbnQoRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTmFtZWRFbGVtZW50KE5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUGFja2FnZWFibGVFbGVtZW50KFBhY2thZ2VhYmxlRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUGFja2FnZShvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZXNwYWNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VOYW1lc3BhY2UoTmFtZXNwYWNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29uc3RyYWludChDb25zdHJhaW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eShNZXRob2RFbGVtZW50UHJvcGVydHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb250ZW50RWxlbWVudChDb250ZW50RWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpYmFibGVFbGVtZW50KERlc2NyaWJhYmxlRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29udGVudERlc2NyaXB0aW9uKENvbnRlbnREZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VjdGlvbihTZWN0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlKFJvbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGFzayhUYXNrIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV29ya0RlZmluaXRpb24oV29ya0RlZmluaXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGVwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0ZXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVN0ZXAoU3RlcCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VHdWlkYW5jZShHdWlkYW5jZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBcnRpZmFjdChBcnRpZmFjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZWxpdmVyYWJsZShEZWxpdmVyYWJsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGNvbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlT3V0Y29tZShPdXRjb21lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBhY2thZ2UoTWV0aG9kUGFja2FnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRlbnRQYWNrYWdlKENvbnRlbnRQYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFydGlmYWN0RGVzY3JpcHRpb24oQXJ0aWZhY3REZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZWxpdmVyYWJsZURlc2NyaXB0aW9uKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVEZXNjcmlwdGlvbihSb2xlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRhc2tEZXNjcmlwdGlvbihUYXNrRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlR3VpZGFuY2VEZXNjcmlwdGlvbihHdWlkYW5jZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByYWN0aWNlRGVzY3JpcHRpb24oUHJhY3RpY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvaW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQb2ludChQb2ludCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlR3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpYWdyYW0gRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURpYWdyYW1FbGVtZW50KERpYWdyYW1FbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpYWdyYW0gTGluazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGlhZ3JhbUxpbmsoRGlhZ3JhbUxpbmsgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VHcmFwaENvbm5lY3RvcihHcmFwaENvbm5lY3RvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlbWFudGljTW9kZWxCcmlkZ2UoU2VtYW50aWNNb2RlbEJyaWRnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpbWVuc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaW1lbnNpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURpbWVuc2lvbihEaW1lbnNpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWZlcmVuY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZWZlcmVuY2UoUmVmZXJlbmNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb3BlcnR5KFByb3BlcnR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggRWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBFZGdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VHcmFwaEVkZ2UoR3JhcGhFZGdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEaWFncmFtKERpYWdyYW0gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIE5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUdyYXBoTm9kZShHcmFwaE5vZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoCi0JCQlTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVU1BU2VtYW50aWNNb2RlbEJyaWRnZShVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKENvcmVTZW1hbnRpY01vZGVsQnJpZGdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGVhZiBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxlYWYgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTGVhZkVsZW1lbnQoTGVhZkVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXh0IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGV4dCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUZXh0RWxlbWVudChUZXh0RWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkltYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkltYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJbWFnZShJbWFnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoaWMgUHJpbWl0aXZlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoaWMgUHJpbWl0aXZlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VHcmFwaGljUHJpbWl0aXZlKEdyYXBoaWNQcmltaXRpdmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb2x5bGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb2x5bGluZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUG9seWxpbmUoUG9seWxpbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGxpcHNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsbGlwc2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVsbGlwc2UoRWxsaXBzZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBY3Rpdml0eShBY3Rpdml0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoV29ya0JyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQnJlYWtkb3duRWxlbWVudChCcmVha2Rvd25FbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWlsZXN0b25lKE1pbGVzdG9uZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUl0ZXJhdGlvbihJdGVyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUGhhc2UoUGhhc2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUZWFtUHJvZmlsZShUZWFtUHJvZmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrT3JkZXIoV29ya09yZGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvY2Vzc0VsZW1lbnQoUHJvY2Vzc0VsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0b3IoRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvcihXb3JrUHJvZHVjdERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29tcG9zaXRlUm9sZShDb21wb3NpdGVSb2xlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigKLQkJCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKEFjdGl2aXR5RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKAotCQkJRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0b3JEZXNjcmlwdGlvbihEZXNjcmlwdG9yRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbmNlcHQoQ29uY2VwdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNoZWNrbGlzdChDaGVja2xpc3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUV4YW1wbGUoRXhhbXBsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUd1aWRlbGluZShHdWlkZWxpbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyhFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXBvcnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZXBvcnQoUmVwb3J0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRlbXBsYXRlKFRlbXBsYXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTdXBwb3J0aW5nTWF0ZXJpYWwoU3VwcG9ydGluZ01hdGVyaWFsIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRvb2xNZW50b3IoVG9vbE1lbnRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2hpdGVwYXBlcihXaGl0ZXBhcGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGVybURlZmluaXRpb24oVGVybURlZmluaXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJhY3RpY2UoUHJhY3RpY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmV1c2FibGVBc3NldChSZXVzYWJsZUFzc2V0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RhdGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVN0YXRlKFN0YXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmVydGV4PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZlcnRleDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVmVydGV4KFZlcnRleCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlZ2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWdpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlZ2lvbihSZWdpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGF0ZSBNYWNoaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0YXRlIE1hY2hpbmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVN0YXRlTWFjaGluZShTdGF0ZU1hY2hpbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UcmFuc2l0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRyYW5zaXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRyYW5zaXRpb24oVHJhbnNpdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBzZXVkbyBTdGF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qc2V1ZG8gU3RhdGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVBzZXVkb1N0YXRlKFBzZXVkb1N0YXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEaXNjaXBsaW5lKERpc2NpcGxpbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRlbnRDYXRlZ29yeShDb250ZW50Q2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUm9sZVNldChSb2xlU2V0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRG9tYWluKERvbWFpbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdFR5cGUoV29ya1Byb2R1Y3RUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEaXNjaXBsaW5lR3JvdXBpbmcoRGlzY2lwbGluZUdyb3VwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUb29sKFRvb2wgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUm9sZVNldEdyb3VwaW5nKFJvbGVTZXRHcm91cGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZWxpdmVyeVByb2Nlc3MoRGVsaXZlcnlQcm9jZXNzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNhcGFiaWxpdHlQYXR0ZXJuKENhcGFiaWxpdHlQYXR0ZXJuIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZShQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUm9hZG1hcChSb2FkbWFwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NDb21wb25lbnQoUHJvY2Vzc0NvbXBvbmVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NQYWNrYWdlKFByb2Nlc3NQYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZShQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigKLQkJCVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFyaWFiaWxpdHkgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFVuaXQoTWV0aG9kVW5pdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvY2Vzc0ZhbWlseShQcm9jZXNzRmFtaWx5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vVW1hU3dpdGNoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNzQ1Y2YxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgYWNjZXNzaW5nIGFuZCB1cGRhdGluZyB0aGUgVU1BIG1vZGVsIG9iamVjdHMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVtYVV0aWwgewotCi0JLyoqCi0JICogUmVwbGFjZXMgdGhlIGZlYXR1cmUgdmFsdWVzIG9mIGFuIG9sZCBtZXRob2QgZWxlbWVudCB3aXRoIHRoZQotCSAqIGNvcnJlc3BvbmRpbmcgZmVhdHVyZSB2YWx1ZXMgb2YgYSBuZXcgbWV0aG9kIGVsZW1lbnQuCi0JICogPHA+Ci0JICogTm90ZTogQWxsIGZlYXR1cmVzIGFyZSB1cGRhdGVkIGV4Y2VwdCBmb3IgdGhlIEdVSUQgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkRWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIG9sZCBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBuZXdFbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgbmV3IG1ldGhvZCBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2UoTWV0aG9kRWxlbWVudCBvbGRFbGVtZW50LAotCQkJTWV0aG9kRWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JCUxpc3QgZmVhdHVyZXMgPSBvbGRFbGVtZW50LmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gZmVhdHVyZXMuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCQkuZ2V0KGkpOwotCQkJCWlmIChmZWF0dXJlICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfR3VpZCgpKSB7Ci0JCQkJCS8vIGRvbid0IHJlcGxhY2UgR1VJRAotCQkJCQlPYmplY3QgbmV3VmFsdWUgPSBuZXdFbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQkJCW9sZEVsZW1lbnQuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1vZGVsIG9iamVjdCBoYXMgYSBkaXJlY3QgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbW9kZWwgb2JqZWN0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIG1vZGVsIG9iamVjdCBpcyBjb250YWluZWQgYnkKLQkgKiAgICAgICAgIGEgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzRGlyZWN0UmVzb3VyY2UoRU9iamVjdCBlKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZS5lUmVzb3VyY2UoKTsKLQkJcmV0dXJuIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldENvbnRlbnRzKCkuY29udGFpbnMoZSkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGFsbCByZXNvdXJjZXMgb3duZWQgYnkgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZXNvdXJjZXMoRU9iamVjdCBlKSB7Ci0JCUhhc2hTZXQ8UmVzb3VyY2U+IHJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQlnZXRSZXNvdXJjZXMoZSwgcmVzb3VyY2VzKTsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFJlc291cmNlcyhFT2JqZWN0IGUsIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcykgewotCQlpZiAoVW1hVXRpbC5oYXNEaXJlY3RSZXNvdXJjZShlKSkgewotCQkJcmVzb3VyY2VzLmFkZChlLmVSZXNvdXJjZSgpKTsKLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGUuZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJZ2V0UmVzb3VyY2VzKChFT2JqZWN0KSBpdGVyLm5leHQoKSwgcmVzb3VyY2VzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgYSBzcGVjaWZpYyB0eXBlIG9mIGFkYXB0ZXIgYXNzb2NpYXRlZCB3aXRoIGEgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIGVPYmoKLQkgKiAgICAgICAgICAgIGEgbm90aWZpZXIKLQkgKiBAcGFyYW0gY2xzCi0JICogICAgICAgICAgICB0aGUgYWRhcHRlciBjbGFzcwotCSAqIEByZXR1cm4gYW4gPGNvZGU+QWRhcHRlcjxjb2RlPiBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBZGFwdGVyKEVPYmplY3QgZU9iaiwgQ2xhc3MgY2xzKSB7Ci0JCWZvciAoSXRlcmF0b3IgYWRhcHRlcnMgPSBlT2JqLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGFkYXB0ZXJzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBhZGFwdGVycy5uZXh0KCk7Ci0JCQlpZiAoY2xzLmlzSW5zdGFuY2UoYWRhcHRlcikpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgcGFja2FnZSB3aXRoIGEgc3BlY2lmaWMgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kUGFja2FnZXMKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBtZXRob2QgcGFja2FnZXMKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgcGFja2FnZSBuYW1lCi0JICogQHJldHVybiBhIG1ldGhvZCBwYWNrYWdlIHdpdGggdGhlIG1hdGNoaW5nIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBhY2thZ2UgZmluZE1ldGhvZFBhY2thZ2UoTGlzdCBtZXRob2RQYWNrYWdlcywKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSBtZXRob2RQYWNrYWdlcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IG9iaiA9IG1ldGhvZFBhY2thZ2VzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSkgb2JqOwotCQkJCWlmIChuYW1lLmVxdWFscyhwa2cuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gcGtnOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgcGFja2FnZSB3aXRoIGEgc3BlY2lmaWMgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kUGx1Z2luCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwbHVnLWluCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIG1ldGhvZCBlbGVtZW50IHBhdGggZnJhZ21lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBwYWNrYWdlIHdpdGggdGhlIG1hdGNoaW5nIHBhdGggb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBhY2thZ2UgZmluZE1ldGhvZFBhY2thZ2UoTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiwKLQkJCVN0cmluZ1tdIHBhdGgpIHsKLQkJTWV0aG9kUGFja2FnZSBwa2cgPSBudWxsOwotCQlMaXN0IGxpc3QgPSBtZXRob2RQbHVnaW4uZ2V0TWV0aG9kUGFja2FnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlwa2cgPSBmaW5kTWV0aG9kUGFja2FnZShsaXN0LCBwYXRoW2ldKTsKLQkJCWlmIChwa2cgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHBrZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgYWN0aXZpdHkgb2YgYSBicmVha2Rvd24gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBicmVha2Rvd24gZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBhY3Rpdml0eSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgZ2V0UGFyZW50QWN0aXZpdHkoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCXJldHVybiBlLmdldFN1cGVyQWN0aXZpdGllcygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHBhcmVudCBhY3Rpdml0eSBvZiBhIHdvcmsgb3JkZXIuCi0JICogCi0JICogQHBhcmFtIHdvcmtPcmRlcgotCSAqICAgICAgICAgICAgYSB3b3JrIG9yZGVyCi0JICogQHJldHVybiB0aGUgcGFyZW50IGFjdGl2aXR5IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBnZXRPd25pbmdBY3Rpdml0eShXb3JrT3JkZXIgd29ya09yZGVyKSB7Ci0JCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgd29ya09yZGVyLmVDb250YWluZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXR1cm4gKEFjdGl2aXR5KSBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRlbnQgcGFja2FnZSB3aXRoIGEgc3BlY2lmaWMgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kUGFja2FnZXMKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBtZXRob2QgcGFja2FnZXMKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBjb250ZW50IHBhY2thZ2UgbmFtZQotCSAqIEByZXR1cm4gYSBjb250ZW50IHBhY2thZ2Ugd2l0aCB0aGUgbWF0aGNpbmcgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udGVudFBhY2thZ2UgZmluZENvbnRlbnRQYWNrYWdlKExpc3QgbWV0aG9kUGFja2FnZXMsCi0JCQlTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gbWV0aG9kUGFja2FnZXMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCU9iamVjdCBvYmogPSBtZXRob2RQYWNrYWdlcy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpIG9iajsKLQkJCQlpZiAobmFtZS5lcXVhbHMocGtnLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIHBrZzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCBwYWNrYWdlIHdpdGggYSBzcGVjaWZpYyBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgbWV0aG9kIGVsZW1lbnQgcGF0aCBmcmFnbWVudHMKLQkgKiBAcmV0dXJuIGEgY29udGVudCBwYWNrYWdlIHdpdGggdGhlIG1hdGNoaW5nIHBhdGggb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnRlbnRQYWNrYWdlIGZpbmRDb250ZW50UGFja2FnZShNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luLAotCQkJU3RyaW5nW10gcGF0aCkgewotCQlDb250ZW50UGFja2FnZSBwa2cgPSBudWxsOwotCQlMaXN0IGxpc3QgPSBtZXRob2RQbHVnaW4uZ2V0TWV0aG9kUGFja2FnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlwa2cgPSBmaW5kQ29udGVudFBhY2thZ2UobGlzdCwgcGF0aFtpXSk7Ci0JCQlpZiAocGtnID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWxpc3QgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQl9Ci0JCXJldHVybiBwa2c7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IG1ldGhvZCBwbHVnLWluIG9mIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgTWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgbWV0aG9kIHBsdWctaW4gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBsdWdpbiBnZXRNZXRob2RQbHVnaW4oRU9iamVjdCBlbGVtZW50KSB7Ci0JCWZvciAoRU9iamVjdCBvYmogPSBlbGVtZW50OyBvYmogIT0gbnVsbDsgb2JqID0gb2JqLmVDb250YWluZXIoKSkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiAoTWV0aG9kUGx1Z2luKSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IG1ldGhvZCBsaWJyYXJ5IG9mIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgbWV0aG9kIGxpYnJhcnkgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZExpYnJhcnkgZ2V0TWV0aG9kTGlicmFyeShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQ7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCXJldHVybiAoTWV0aG9kTGlicmFyeSkgb2JqOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgZ2V0VG9wQ29udGFpbmVyKEVPYmplY3QgZWxlbWVudCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IG51bGw7Ci0JCWZvciAoRU9iamVjdCBvYmogPSBlbGVtZW50LmVDb250YWluZXIoKTsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWNvbnRhaW5lciA9IG9iajsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwkJCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IGNvbnRlbnQgcGFja2FnZSBvZiBhIGNvbnRlbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBjb250ZW50IGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgY29udGVudCBwYWNrYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb250ZW50UGFja2FnZSBnZXRDb250ZW50UGFja2FnZShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQ7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlyZXR1cm4gKENvbnRlbnRQYWNrYWdlKSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IHByb2Nlc3MgcGFja2FnZSBvZiBhIHByb2Nlc3MgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBQcm9jZXNzIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgcHJvY2VzcyBwYWNrYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzUGFja2FnZSBnZXRQcm9jZXNzUGFja2FnZShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQ7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZXR1cm4gKFByb2Nlc3NQYWNrYWdlKSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IGRpYWdyYW0gb2YgYSBkaWFncmFtIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgZGlhZ3JhbSBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgcGFyZW50IGRpYWdyYW0gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpYWdyYW0gZ2V0RGlhZ3JhbShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQ7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCXJldHVybiAoRGlhZ3JhbSkgb2JqOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGVsZW1lbnQgaXMgY29udGFpbmVkIGJ5IGEgc3BlY2lmaWMgY29udGVudAotCSAqIHBhY2thZ2UuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29udGVudFBhY2thZ2UKLQkgKiAgICAgICAgICAgIGEgY29udGVudCBwYWNrYWdlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgaXMgY29udGFpbmVkIGJ5IHRoZQotCSAqICAgICAgICAgY29udGVudCBwYWNrYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGFpbmVkQnlDb250ZW50UGFja2FnZShFT2JqZWN0IGVsZW1lbnQsCi0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGFja2FnZSkgewotCQlyZXR1cm4gaXNDb250YWluZWRCeShlbGVtZW50LCBjb250ZW50UGFja2FnZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtb2RlbCBvYmplY3QgaXMgY29udGFpbmVkIGJ5IGEgc3BlY2lmaWMgY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBlT2JqCi0JICogICAgICAgICAgICBhIG1vZGVsIG9iamVjdAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiAgICAgICAgICAgIGEgY29udGFpbmVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbW9kZWwgb2JqZWN0IGlzIGNvbnRhaW5lZCBieSB0aGUKLQkgKiAgICAgICAgIGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5lZEJ5KEVPYmplY3QgZU9iaiwgT2JqZWN0IGNvbnRhaW5lcikgewotCQlpZiAoZU9iaiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVPYmouZUNvbnRhaW5lcigpOyBvYmogIT0gbnVsbDsgb2JqID0gb2JqCi0JCQkJLmVDb250YWluZXIoKSkgewotCQkJaWYgKG9iaiA9PSBjb250YWluZXIpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIGFuZCByZXR1cm5zIGEgdW5pcXVlIElELgotCSAqIAotCSAqIEByZXR1cm4gYSB1bmlxdWUgSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0ZUdVSUQoKSB7Ci0JCXJldHVybiBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudCBkZXNjcmlwdGlvbiBuYW1lIG9mIGEgZ2l2ZW4gbWV0aG9kCi0JICogZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBzdWl0YWJsZSBjb250ZW50IGRlc2NyaXB0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25OYW1lKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gZS5nZXROYW1lKCkgKyAnLCcgKyBlLmdldEd1aWQoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0QWxsU3VwZXJzKExpc3Qgc3VwZXJzLCBWYXJpYWJpbGl0eUVsZW1lbnQgZSwKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWlmIChiYXNlICE9IG51bGwgJiYgZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSB0eXBlCi0JCQkJJiYgIXN1cGVycy5jb250YWlucyhiYXNlKSkgewotCQkJc3VwZXJzLmFkZChiYXNlKTsKLQkJCWdldEFsbFN1cGVycyhzdXBlcnMsIGJhc2UsIHR5cGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEFsbFN1cGVyc0JvdGgoTGlzdCBzdXBlcnMsIFZhcmlhYmlsaXR5RWxlbWVudCBlLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUxLCBWYXJpYWJpbGl0eVR5cGUgdHlwZTIpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKGJhc2UgIT0gbnVsbAotCQkJCSYmIChlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IHR5cGUxIHx8IGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gdHlwZTIpCi0JCQkJJiYgIXN1cGVycy5jb250YWlucyhiYXNlKSkgewotCQkJc3VwZXJzLmFkZChiYXNlKTsKLQkJCWdldEFsbFN1cGVyc0JvdGgoc3VwZXJzLCBiYXNlLCB0eXBlMSwgdHlwZTIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY2xhc3Mgb2YgYSBjb250ZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRFbGVtZW50Ci0JICogICAgICAgICAgICBhIGNvbnRlbnQgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgZWxlbWVudCBjbGFzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0Q2xhc3NPZkNvbnRlbnRFbGVtZW50KENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50KSB7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJvbGUpCi0JCQlyZXR1cm4gUm9sZS5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGFzaykKLQkJCXJldHVybiBUYXNrLmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkKLQkJCXJldHVybiBXb3JrUHJvZHVjdC5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgR3VpZGFuY2UpCi0JCQlyZXR1cm4gR3VpZGFuY2UuY2xhc3M7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIERvbWFpbikKLQkJCXJldHVybiBEb21haW4uY2xhc3M7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIERpc2NpcGxpbmUpCi0JCQlyZXR1cm4gRGlzY2lwbGluZS5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKQotCQkJcmV0dXJuIERpc2NpcGxpbmVHcm91cGluZy5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZVNldCkKLQkJCXJldHVybiBSb2xlU2V0LmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpCi0JCQlyZXR1cm4gUm9sZVNldEdyb3VwaW5nLmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpCi0JCQlyZXR1cm4gV29ya1Byb2R1Y3RUeXBlLmNsYXNzOwotCQlyZXR1cm4gT2JqZWN0LmNsYXNzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkZWZhdWx0IHdvcmsgb3JkZXIgZm9yIHR3byB3b3JrIGJyZWFrZG93biBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHBhcmFtIHByZWRlY2Vzc29yCi0JICogICAgICAgICAgICB0aGUgcHJlZGVjZXNzb3Igd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgd29yayBvcmRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyIGNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoV29ya0JyZWFrZG93bkVsZW1lbnQgc3VjYywKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQpIHsKLQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoc3VjYywgcHJlZCwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyIGNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoV29ya0JyZWFrZG93bkVsZW1lbnQgc3VjYywKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQsIGJvb2xlYW4gbGluaykgewotCQlXb3JrT3JkZXIgd28gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKTsKLQkJd28uc2V0UHJlZChwcmVkKTsKLQkJd28uc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIX0xJVEVSQUwpOwotCQlpZihsaW5rKSB7Ci0JCQlzdWNjLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuYWRkKHdvKTsKLQkJfQotCQlyZXR1cm4gd287Ci0JfQkKLQotCS8qKgotCSAqIExvY2F0ZXMgdGhlIHdvcmsgb3JkZXIgYXNzb2NpYXRlZCB3aXRoIHR3byB3b3JrIGJyZWFrZG93biBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHBhcmFtIHByZWRlY2Vzc29yCi0JICogICAgICAgICAgICB0aGUgcHJlZGVjZXNzb3Igd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqIEByZXR1cm4gYSB3b3JrIG9yZGVyIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgZmluZFdvcmtPcmRlcihXb3JrQnJlYWtkb3duRWxlbWVudCBlLAotCQkJT2JqZWN0IHByZWRlY2Vzc29yKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCWlmICh3b3JrT3JkZXIuZ2V0UHJlZCgpID09IHByZWRlY2Vzc29yKQotCQkJCXJldHVybiB3b3JrT3JkZXI7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSB3b3JrIG9yZGVyIGFzc29jaWF0ZWQgd2l0aCB0d28gd29yayBicmVha2Rvd24gZWxlbWVudHMuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqIEBwYXJhbSBwcmVkZWNlc3NvcgotCSAqICAgICAgICAgICAgdGhlIHByZWRlY2Vzc29yIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSByZW1vdmVkIHdvcmsgb3JkZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlciByZW1vdmVXb3JrT3JkZXIoV29ya0JyZWFrZG93bkVsZW1lbnQgZSwKLQkJCU9iamVjdCBwcmVkZWNlc3NvcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVdvcmtPcmRlciBvcmRlciA9IChXb3JrT3JkZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvcmRlci5nZXRQcmVkKCkgPT0gcHJlZGVjZXNzb3IpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQlyZXR1cm4gb3JkZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IHByb2Nlc3MgY29tcG9uZW50IG9mIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQsIHR5cGljYWxseSBhIHByb2Nlc3MgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBwcm9jZXNzIGNvbXBvbmVudCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvY2Vzc0NvbXBvbmVudCBnZXRQcm9jZXNzQ29tcG9uZW50KE1ldGhvZEVsZW1lbnQgZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lcjsKLQkJZm9yIChjb250YWluZXIgPSBlOyBjb250YWluZXIgIT0gbnVsbAotCQkJCSYmICEoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCS5lQ29udGFpbmVyKCkpCi0JCQk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudCkgY29udGFpbmVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgbWV0aG9kIHVuaXQgb2YgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBtZXRob2QgdW5pdCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kVW5pdCBnZXRNZXRob2RVbml0KE1ldGhvZEVsZW1lbnQgZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lcjsKLQkJZm9yIChjb250YWluZXIgPSBlOyBjb250YWluZXIgIT0gbnVsbAotCQkJCSYmICEoY29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kVW5pdCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCS5lQ29udGFpbmVyKCkpCi0JCQk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuICgoTWV0aG9kVW5pdCkgY29udGFpbmVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIHBsdWctaW4gaGFzIG1ldGhvZCBlbGVtZW50cyB0aGF0IHJlZmVyZW5jZQotCSAqIGVsZW1lbnRzIGluIGEgYmFzZSBwbHVnLWluLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgaXMgYSBleHBlbnNpdmUgY2FsbCB0byBtYWtlIGZvciBhIGxhcmdlIG1ldGhvZCBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcGFyYW0gYmFzZQotCSAqICAgICAgICAgICAgYSBiYXNlIG1ldGhvZCBwbHVnLWluCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIG1ldGhvZCBwbHVnLWluIGNvbnRhaW4KLQkgKiAgICAgICAgIG1ldGhvZCBlbGVtZW50cyB0aGF0IHJlZmVyZW5jZSBlbGVtZW50cyBpbiBhIGJhc2UgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUmVmZXJlbmNlKE1ldGhvZFBsdWdpbiBwbHVnaW4sIE1ldGhvZFBsdWdpbiBiYXNlKSB7Ci0JCWZvciAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yIGZlYXR1cmVJdGVyYXRvciA9IChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IpIHBsdWdpbgotCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgZmVhdHVyZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgcmVmID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IGZlYXR1cmVJdGVyYXRvci5mZWF0dXJlKCk7Ci0KLQkJCWlmIChmICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9CYXNlcygpCi0JCQkJCSYmIFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHJlZikgPT0gYmFzZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGx1Z2luLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQotCQkJLy8gaWdub3JlIFByb2Nlc3NFbGVtZW50IGIvYyBpdCBjYW4gcmVmZXJlbmNlcyBhbnl0aGluZwotCQkJLy8KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCByZWYgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChnZXRNZXRob2RQbHVnaW4ocmVmKSA9PSBiYXNlKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbGwgZWxlbWVudCByZWZlcmVuY2VzIGluIGEgbWV0aG9kIHBsdWctaW4gdGhhdCBwb2ludCB0byBlbGVtZW50cwotCSAqIGluIGEgYmFzZSBwbHVnLWluLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgaXMgYSBleHBlbnNpdmUgY2FsbCB0byBtYWtlIGZvciBhIGxhcmdlIG1ldGhvZCBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcGFyYW0gYmFzZQotCSAqICAgICAgICAgICAgdGhlIGJhc2UgbWV0aG9kIHBsdWctaW4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVSZWZlcmVuY2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4sCi0JCQlNZXRob2RQbHVnaW4gYmFzZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwbHVnaW4uZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCi0JCQkvLyBpZ25vcmUgUHJvY2Vzc0VsZW1lbnQgYi9jIGl0IGNhbiByZWZlcmVuY2VzIGFueXRoaW5nCi0JCQkvLwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yKSBlbGVtZW50Ci0JCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgZmVhdHVyZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IHJlZiA9IChFT2JqZWN0KSBmZWF0dXJlSXRlcmF0b3IubmV4dCgpOwotCi0JCQkJaWYgKGdldE1ldGhvZFBsdWdpbihyZWYpID09IGJhc2UpIHsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBmZWF0dXJlSXRlcmF0b3IuZmVhdHVyZSgpOwotCQkJCQlpZiAoZi5pc01hbnkoKSkgewotCQkJCQkJKChDb2xsZWN0aW9uKSBlbGVtZW50LmVHZXQoZikpLnJlbW92ZShyZWYpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudC5lU2V0KGYsIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nIG1zZyA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcihtc2cpOwotCQkJSVN0YXR1cyBzdGF0dXNlc1tdID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1c2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZCgnXG4nKS5hcHBlbmQoc3RhdHVzZXNbaV0uZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJCW1zZyA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQl9Ci0JCWlmIChtc2cgIT0gbnVsbCAmJiBtc2cudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCW1zZyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIG1zZzsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgYSBHVUlEIHVzaW5nIGEgYmFzZSBHVUlELgotCSAqIAotCSAqIEBwYXJhbSBiYXNlR1VJRAotCSAqICAgICAgICAgICAgYSBiYXNlIEdVSUQKLQkgKiBAcmV0dXJuIGEgdW5pcXVlIElECi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2VuZXJhdGVHVUlEKFN0cmluZyBiYXNlR1VJRCkgewotCQlyZXR1cm4gR1VJRC5nZW5lcmF0ZShiYXNlR1VJRCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR1VJRCB7Ci0JCXByaXZhdGUgc3RhdGljIE1lc3NhZ2VEaWdlc3QgbWQ1ID0gbnVsbDsKLQotCQlwcml2YXRlIHN0YXRpYyBNZXNzYWdlRGlnZXN0IGdldE1ENSgpIHsKLQkJCWlmIChtZDUgPT0gbnVsbCkgewotCQkJCXN5bmNocm9uaXplZCAoR1VJRC5jbGFzcykgewotCQkJCQlpZiAobWQ1ID09IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbWQ1ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtZDU7Ci0JCX0KLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZW5lcmF0ZShTdHJpbmcgYmFzZUdVSUQpIHsKLQkJCU1lc3NhZ2VEaWdlc3QgbWQ1ID0gZ2V0TUQ1KCk7Ci0JCQltZDUudXBkYXRlKGJhc2VHVUlELmdldEJ5dGVzKCkpOwotCQkJYnl0ZVtdIGhhc2ggPSBtZDUuZGlnZXN0KCk7Ci0JCQljaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbMjNdOwotCQkJYnVmZmVyWzBdID0gJy0nOwotCi0JCQkvLyBEbyBhIGJhc2UgNjQgY29udmVyc2lvbiBieSB0dXJuaW5nIGV2ZXJ5IDMgYnl0ZXMgaW50byA0IGJhc2UgNjQKLQkJCS8vIGNoYXJhY3RlcnMKLQkJCS8vCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewotCQkJCWJ1ZmZlcls0ICogaSArIDFdID0gQkFTRTY0X0RJR0lUU1soaGFzaFtpICogM10gPj4gMikgJiAweDNGXTsKLQkJCQlidWZmZXJbNCAqIGkgKyAyXSA9IEJBU0U2NF9ESUdJVFNbKChoYXNoW2kgKiAzXSA8PCA0KSAmIDB4MzApCi0JCQkJCQl8ICgoaGFzaFtpICogMyArIDFdID4+IDQpICYgMHhGKV07Ci0JCQkJYnVmZmVyWzQgKiBpICsgM10gPSBCQVNFNjRfRElHSVRTWygoaGFzaFtpICogMyArIDFdIDw8IDIpICYgMHgzQykKLQkJCQkJCXwgKChoYXNoW2kgKiAzICsgMl0gPj4gNikgJiAweDMpXTsKLQkJCQlidWZmZXJbNCAqIGkgKyA0XSA9IEJBU0U2NF9ESUdJVFNbaGFzaFtpICogMyArIDJdICYgMHgzRl07Ci0JCQl9Ci0KLQkJCS8vIEhhbmRsZSB0aGUgbGFzdCBieXRlIGF0IHRoZSBlbmQuCi0JCQkvLwotCQkJYnVmZmVyWzIxXSA9IEJBU0U2NF9ESUdJVFNbKGhhc2hbMTVdID4+IDIpICYgMHgzRl07Ci0JCQlidWZmZXJbMjJdID0gQkFTRTY0X0RJR0lUU1soaGFzaFsxNV0gPDwgNCkgJiAweDMwXTsKLQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyKTsKLQkJfQotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBCQVNFNjRfRElHSVRTID0geyAnQScsICdCJywgJ0MnLCAnRCcsICdFJywKLQkJCQknRicsICdHJywgJ0gnLCAnSScsICdKJywgJ0snLCAnTCcsICdNJywgJ04nLCAnTycsICdQJywgJ1EnLAotCQkJCSdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWicsICdhJywgJ2InLCAnYycsCi0JCQkJJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJywgJ20nLCAnbicsICdvJywKLQkJCQkncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6JywgJzAnLAotCQkJCScxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICctJywgJ18nIH07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODM3NzZlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBhY2Nlc3NpbmcgdGhlIFVNQSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGIxNjRiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9InJ1bnRpbWUiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjMzJhOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi54bWwudW1hPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkMzg5OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNXZWQgTWFyIDI4IDEwOjU0OjAzIFBEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDYwOTA3MTMzNC54c2Q9VVRGOAotZW5jb2RpbmcvL3NyYy9tb2RlbC9VTUEueHNkPVVURjgKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MjkxNzEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEsCi0gb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYjE0YmY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgPGNvcHlyaWdodD4KLSMgPC9jb3B5cmlnaHQ+Ci0jCi0jICRJZDogYnVpbGQucHJvcGVydGllcyx2IDEuNiAyMDA2LzA2LzI0IDAwOjA1OjE3IGp4aSBFeHAgJAotCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbAotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTkyYjY3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0PgotIyA8L2NvcHlyaWdodD4KLSMKLSMgJElkOiBwbHVnaW4ucHJvcGVydGllcyx2IDEuNCAyMDA3LzAzLzA2IDIxOjA0OjQ0IHNrYW5ub29yaSBFeHAgJAotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1wbHVnaW5OYW1lID0gRVBGIFhtbCBVTUEgTW9kZWwKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllZDNiNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPCEtLQotIDxjb3B5cmlnaHQ+Ci0gPC9jb3B5cmlnaHQ+Ci0KLSAkSWQ6IHBsdWdpbi54bWwsdiAxLjQgMjAwNi8wNi8yMyAwMDowMToyNyBqeGkgRXhwICQKLS0tPgotCi08cGx1Z2luPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgPHBhY2thZ2UgCi0gICAgICAgdXJpID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyIgCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSIgLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgotICAgIDxwYXJzZXIgCi0gICAgICAgdHlwZT0idW1hIiAKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudXRpbC5VbWFSZXNvdXJjZUZhY3RvcnlJbXBsIiAvPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNjA4MzAwNzM2LnhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNjA4MzAwNzM2LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTdiYzQ1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDYwODMwMDczNi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIEVQRiBVTUEgWE1MIERhdGEgSW50ZXJjaGFuZ2UgU2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIj4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb0ZpbmlzaCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvRmluaXNoIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5hIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb250cmlidXRlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5kcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmVwbGFjZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsQ29udHJpYnV0aW9uIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbFJlcGxhY2VtZW50Ii8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVkRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpOYW1lZEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIERlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3duZWRSdWxlIiB0eXBlPSJ1bWE6Q29uc3RyYWludCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBhY2thZ2luZyBydWxlcyBmb3IgdGhpcyBNZXRob2QgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3VwcHJlc3NlZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlICJleHRlbmRzIiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcmRlcmluZ0d1aWRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uc3RyYWludCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0b3JlcyB0aGUgbWFpbiBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlY3Rpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViU2VjdGlvbiIgdHlwZT0idW1hOlNlY3Rpb24iIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlZGVjZXNzb3IiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWN0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlZGVjZXNzb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kVW5pdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29weXJpZ2h0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdXRob3JzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYWluRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0b3JlcyB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iS2V5Q29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2VjdGlvbiIgdHlwZT0idW1hOlNlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgR3VpZGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmFjdGljZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJhY3RpY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsSW5mbyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBcHBsaWNhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYWNrZ3JvdW5kIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHb2FscyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMZXZlbHNPZkFkb3B0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvYmxlbSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBXb3JrIFByb2R1Y3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RPZk5vdEhhdmluZyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWFzb25zRm9yTm90TmVlZGluZyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXh0ZXJuYWxJZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFydGlmYWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJyaWVmT3V0bGluZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcHJlc2VudGF0aW9uT3B0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnaW5nR3VpZGFuY2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBSb2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXNzaWdubWVudEFwcHJvYWNoZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNraWxscyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3lub255bXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2tEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBbHRlcm5hdGl2ZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLgotVGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50YXRpb24iIHR5cGU9InVtYTpDb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gInJ1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQiIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICJqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50IiB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICJBcmNoaXRlY3R1cmUgRG9jdW1lbnQiLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXBlaWNvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibm9kZWljb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50RWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4KLUNvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpYmFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaGVja2xpc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25jZXB0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXhhbXBsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikd1aWRlbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNhYmxlQXNzZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXaGl0ZXBhcGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGFuY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+R3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbmNlcHQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDaGVja2xpc3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkV4YW1wbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRlbGluZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBwcm92aWRlcyBzaXppbmcgbWVhc3VyZXMsIG9yIHN0YW5kYXJkcyBmb3Igc2l6aW5nIHRoZSB3b3JrIGVmZm9ydCBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIHBhcnRpY3VsYXIgcGllY2Ugb2Ygd29yayBhbmQgaW5zdHJ1Y3Rpb25zIGZvciB0aGVpciBzdWNjZXNzZnVsIHVzZS4gSXQgbWF5IGJlIGNvbXByaXNlZCBvZiBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb25zIGFuZCBlc3RpbWF0aW9uIG1ldHJpY3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uTWV0cmljIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGluZ01ldHJpYyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHF1YWxpZmllcyB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2FkbWFwIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLgotQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXBvcnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZW1wbGF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbE1lbnRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BICBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXaGl0ZXBhcGVyIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb25jZXB0Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVybURlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgZGVmaW5lcyBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUZXJtRGVmaW5pdGlvbnMgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByYWN0aWNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAiTWFuYWdlIFJpc2tzIiwgIkNvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSIsICJBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50IiwgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWN0aXZpdHlSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlByYWN0aWNlIiB0eXBlPSJ1bWE6UHJhY3RpY2UiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmV1c2FibGVBc3NldCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nCi1ob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLUEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwb3J0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcnRpZmFjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLgotQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICJvd24iIGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWluZWRBcnRpZmFjdCIgdHlwZT0idW1hOkFydGlmYWN0Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJhYmxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJlZFdvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik91dGNvbWUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gIAotQSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlRm9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2siPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4KLUEgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuIAotQSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gCi1Gb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldmVsb3AgVXNlIENhc2UgTW9kZWwiIGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgIm1ldGhvZCIgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrRGVmaW5pdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpc2NpcGxpbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuCi1BIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGFzayIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViRGlzY2lwbGluZSIgdHlwZT0idW1hOkRpc2NpcGxpbmUiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZVdvcmtmbG93IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICJTb2Z0d2FyZSBEaXNjaXBsaW5lcyIgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAiUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQiIG9yICJUZXN0aW5nIjsgIklUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQiIHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgIklUIE9wZXJhdGlvbmFsIFNlcnZpY2VzIiwgIklUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMiLCBvciAiSVQgRW5hYmxpbmcgU2VydmljZXMiLiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRpc2NpcGxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRG9tYWluIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LgotRG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViZG9tYWluIiB0eXBlPSJ1bWE6RG9tYWluIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVTZXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+T3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgIkFuYWx5c3RzIiBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgIkJ1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCIsICJTeXN0ZW0gQW5hbHlzdCIsIGFzIHdlbGwgYXMgIlJlcXVpcmVtZW50cyBTcGVjaWZpZXIiIHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVTZXRHcm91cGluZyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Sb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZVNldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUb29sIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICJDbGFzcyBEaWFncmFtIiwgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICJTcGVjaWZpY2F0aW9uIiwgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDdXN0b21DYXRlZ29yeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgIlRlc3RpbmciIGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2F0ZWdvcml6ZWRFbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJDYXRlZ29yeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNlZFBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2UiIHR5cGU9InVtYTpNZXRob2RQYWNrYWdlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imdsb2JhbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50UGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRFbGVtZW50IiB0eXBlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudENhdGVnb3J5UGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBvbmx5IGNvbnRhaW5zIENvbnRlbnQgQ2F0ZWdvcnkgRWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgdHlwZT0idW1hOkNvbnRlbnRDYXRlZ29yeSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLgotUHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpYmFibGVFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGxhbm5pbmdEYXRhIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgUHJvY2VzcyBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLgotUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LgotKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCk8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdGFydERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImZpbmlzaERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyYW5rIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnJlYWtkb3duRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRlZEFmdGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRlZEJlZm9yZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQbGFubmluZ0RhdGEiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwZXJBY3Rpdml0eSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICJTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyIgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgIlNvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyIgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgIkN1c3RvbWVyLkFyY2hpdGVjdCIgd291bGQgZGVmaW5lIGEgIkN1c3RvbWVyIiBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgIkFyY2hpdGVjdCIgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1BsYW5uZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldGFpbCBVc2UgQ2FzZSIgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNPcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya09yZGVyIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gIAotVGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZ2xvYmFsIHVuaXF1ZSBpZCBmb3IgYSB3b3JrIG9yZGVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImxpbmtUeXBlIiB0eXBlPSJ1bWE6V29ya09yZGVyVHlwZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWRlY2Vzc29yIiB0eXBlPSJ1bWE6V29ya09yZGVyIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzUmVwZWF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNPbmdvaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc0V2ZW50RHJpdmVuIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNaWxlc3RvbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY3Rpdml0eSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uCi1BY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiB0eXBlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoZWNrbGlzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmNlcHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeGFtcGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3VpZGVsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9hZG1hcCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNhYmxlQXNzZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXaGl0ZXBhcGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iSXNFbmFjdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGhhc2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotUGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1JdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLik8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzYWdlR3VpZGFuY2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBbHRlcm5hdGl2ZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJIb3dUb1N0YWZmIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmluZWREZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEFjdGl2aXR5IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNjb3BlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlVzYWdlTm90ZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXh0ZXJuYWxJZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgZGVsaXZlcnkgcGF0dGVybnMgYW5kIG1vZGVscy4gSXQgaXMgdXNlZCBsaWtlIGEgc3lub255bS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFByb2Nlc3MgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJ5IFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY2FsZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvamVjdENoYXJhY3RlcmlzdGljcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzczwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmlza0xldmVsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGluZ1RlY2huaXF1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2plY3RNZW1iZXJFeHBlcnRpc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVHlwZU9mQ29udHJhY3QiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvSSdtIGNoYUknbSBudHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLgotRGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaXB0b3IiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZVJvbGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbElucHV0VG8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RlZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0cyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0VG8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0VG8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXRGcm9tIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVsaXZlcmFibGVQYXJ0cyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAKLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4KLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaXB0b3IiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlRm9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFza0Rlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLUEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRhc2siIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGVyZm9ybWVkUHJpbWFyaWx5QnkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFzc2lzdGVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0ZXAiIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbXBvc2l0ZVJvbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuCi1BIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlJvbGVEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFnZ3JlZ2F0ZWRSb2xlIiB0eXBlPSJ1bWE6Um9sZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZWFtUHJvZmlsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuCi1Xb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuCi1IZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cGVyVGVhbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViVGVhbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4KLUNvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW5jbHVkZXNQYXR0ZXJuIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWZhdWx0Q29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJWYWxpZENvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuCi1BIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRWR1Y2F0aW9uTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLgotQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6Ci0tIFRvIHNlcnZlIGFzIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYXNzZW1ibGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMuICBOb3JtYWxseSBkZXZlbG9waW5nIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBub3QgZG9uZSBmcm9tIHNjcmF0Y2ggYnV0IGJ5IHN5c3RlbWF0aWNhbGx5IGFwcGx5aW5nIGFuZCBiaW5kaW5nIHBhdHRlcm5zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHBhdHRlcm4gYXBwbGljYXRpb24gb2YgJ2NvcHktYW5kLW1vZGlmeScsIHdoaWNoIGFsbG93cyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gaXQgaXMgYXBwbGllZCBmb3IsIHRoZSBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIChTZWN0aW9uIDYuMSkgaW50cm9kdWNlcyBldmVuIG1vcmUgc29waGlzdGljYXRlZCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIHRoYXQgc3VwcG9ydCBkeW5hbWljIGJpbmRpbmcgb2YgcGF0dGVybnMgKGkuZS4gdGhlIHBhdHRlcm4gaXMgcmVmZXJlbmNlZCBhbmQgbm90IGNvcGllZCkuICBUaGlzIHVuaXF1ZSBuZXcgd2F5IG9mIHJldXNpbmcgcHJvY2VzcyBrbm93bGVkZ2UgYWxsb3dzIHRvIGZhY3RvciBvdXQgY29tbW9ubHkgcmVvY2N1cnJpbmcgQWN0aXZpdGllcyBpbnRvIHBhdHRlcm5zIGFuZCB0byBhcHBseSB0aGVtIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGEgcHJvY2Vzcy4gIFdoZW4gdGhlIHBhdHRlcm4gaXMgYmVpbmcgcmV2aXNlZCBvciB1cGRhdGVkLCBhbGwgY2hhbmdlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIGFsbCBwYXR0ZXJuIGFwcGxpY2F0aW9uIGluIGFsbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBiaW5kaW5nLgotLSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4KLS0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLgotQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhc2VQcm9jZXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMsIG9ubHkuCi1BIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzRWxlbWVudCIgdHlwZT0idW1hOlByb2Nlc3NFbGVtZW50Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlU3BlY2lmaWNhdGlvbiIgdHlwZT0idW1hOlRhc2tEZXNjcmlwdG9yIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2VJTyIgdHlwZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzQ29tcG9uZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4KLVVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAiYmxhY2sgYm94Ii4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgInJlYWxpemF0aW9uIiBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzUGFja2FnZSI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvcHlyaWdodCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2UiIHR5cGU9InVtYTpQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3MiIHR5cGU9InVtYTpQcm9jZXNzIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXV0aG9ycyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kUGx1Z2luIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGFja2FnZSIgdHlwZT0idW1hOk1ldGhvZFBhY2thZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZUNvbmZpZ3VyYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpblNlbGVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGFja2FnZVNlbGVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVmYXVsdFZpZXciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2Vzc1ZpZXciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIHR5cGU9InVtYTpNZXRob2RDb25maWd1cmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZExpYnJhcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luIiB0eXBlPSJ1bWE6TWV0aG9kUGx1Z2luIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kTGlicmFyeSIgdHlwZT0idW1hOk1ldGhvZExpYnJhcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA2MDkwNzEzMzQueHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA2MDkwNzEzMzQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNzg0MDJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNjA5MDcxMzM0LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0MDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gRVBGIFVNQSBYTUwgRGF0YSBJbnRlcmNoYW5nZSBTY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJXb3JrT3JkZXJUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmlzaFRvU3RhcnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmlzaFRvRmluaXNoIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvU3RhcnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9GaW5pc2giLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmEiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbnRyaWJ1dGVzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbmRzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXBsYWNlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxDb250cmlidXRpb24iLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsUmVwbGFjZW1lbnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuZHNSZXBsYWNlcyIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOYW1lZEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TmFtZWRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBEZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UGFja2FnZWFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik93bmVkUnVsZSIgdHlwZT0idW1hOkNvbnN0cmFpbnQiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwYWNrYWdpbmcgcnVsZXMgZm9yIHRoaXMgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InN1cHByZXNzZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSAiZXh0ZW5kcyIgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24sIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JkZXJpbmdHdWlkZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnN0cmFpbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdG9yZXMgdGhlIG1haW4gZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWN0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWRlY2Vzc29yIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VjdGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWRlY2Vzc29yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFVuaXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvcHlyaWdodCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXV0aG9ycyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdG9yZXMgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IktleUNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEd1aWRhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByYWN0aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbEluZm8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXBwbGljYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFja2dyb3VuZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR29hbHMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTGV2ZWxzT2ZBZG9wdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSk8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2JsZW0iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgV29yayBQcm9kdWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0T2ZOb3RIYXZpbmciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVhc29uc0Zvck5vdE5lZWRpbmciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsSWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBcnRpZmFjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcmllZk91dGxpbmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXByZXNlbnRhdGlvbk9wdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyYWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2luZ0d1aWRhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFzc2lnbm1lbnRBcHByb2FjaGVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTa2lsbHMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN5bm9ueW1zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWx0ZXJuYXRpdmVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLVRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlc2VudGF0aW9uIiB0eXBlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICJydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50IiB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAiajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCIgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAiQXJjaGl0ZWN0dXJlIERvY3VtZW50Ii48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaGFwZWljb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im5vZGVpY29uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuCi1Db250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2hlY2tsaXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29uY2VwdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4YW1wbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHdWlkZWxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzYWJsZUFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV2hpdGVwYXBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRhbmNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25jZXB0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2hlY2tsaXN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFeGFtcGxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkZWxpbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgc2l6aW5nIG1lYXN1cmVzLCBvciBzdGFuZGFyZHMgZm9yIHNpemluZyB0aGUgd29yayBlZmZvcnQgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgYSBwYXJ0aWN1bGFyIHBpZWNlIG9mIHdvcmsgYW5kIGluc3RydWN0aW9ucyBmb3IgdGhlaXIgc3VjY2Vzc2Z1bCB1c2UuIEl0IG1heSBiZSBjb21wcmlzZWQgb2YgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9ucyBhbmQgZXN0aW1hdGlvbiBtZXRyaWNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbk1ldHJpYyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRpbmdNZXRyaWMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgZGVzY3JpYmVzIGEgbWV0cmljIG9yIG1lYXN1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCBhbmQgd2hpY2ggaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHdvcmsgZWZmb3J0IGFzIHdlbGwgYXMgYSByYW5nZSBvZiBwb3RlbnRpYWwgbGFib3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBxdWFsaWZpZXMgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9hZG1hcCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2Ugd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4KLUFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmVwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVtcGxhdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRvb2xNZW50b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSAgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV2hpdGVwYXBlciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29uY2VwdCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlcm1EZWZpbml0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGRlZmluZXMgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGVybURlZmluaXRpb25zIGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmFjdGljZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgIk1hbmFnZSBSaXNrcyIsICJDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkiLCAiQXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCIsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFjdGl2aXR5UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJQcmFjdGljZSIgdHlwZT0idW1hOlByYWN0aWNlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJldXNhYmxlQXNzZXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZwotaG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuCi1BIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcG9ydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXJ0aWZhY3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4KLUFydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAib3duIiBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFpbmVkQXJ0aWZhY3QiIHR5cGU9InVtYTpBcnRpZmFjdCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyYWJsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyZWRXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPdXRjb21lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAKLUEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZUZvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uCi1BIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAKLUEgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uIAotRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXZlbG9wIFVzZSBDYXNlIE1vZGVsIiBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICJtZXRob2QiIG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0RlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4KLVdvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudENhdGVnb3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LgotQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRhc2siIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YkRpc2NpcGxpbmUiIHR5cGU9InVtYTpEaXNjaXBsaW5lIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VXb3JrZmxvdyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAiU29mdHdhcmUgRGlzY2lwbGluZXMiIHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgIlJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IiBvciAiVGVzdGluZyI7ICJJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50IiB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICJJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyIsICJJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzIiwgb3IgIklUIEVuYWJsaW5nIFNlcnZpY2VzIi4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEaXNjaXBsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRvbWFpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLURvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YmRvbWFpbiIgdHlwZT0idW1hOkRvbWFpbiIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPk9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICJBbmFseXN0cyIgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICJCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QiLCAiU3lzdGVtIEFuYWx5c3QiLCBhcyB3ZWxsIGFzICJSZXF1aXJlbWVudHMgU3BlY2lmaWVyIiByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0R3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Um9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGVTZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAiQ2xhc3MgRGlhZ3JhbSIsIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAiU3BlY2lmaWNhdGlvbiIsIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICJUZXN0aW5nIiBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNhdGVnb3JpemVkRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViQ2F0ZWdvcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzZWRQYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnbG9iYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudFBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50RWxlbWVudCIgdHlwZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgb25seSBjb250YWlucyBDb250ZW50IENhdGVnb3J5IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIHR5cGU9InVtYTpDb250ZW50Q2F0ZWdvcnkiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4KLVByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBsYW5uaW5nRGF0YSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFByb2Nlc3MgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4KLVBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4KLShOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RhcnREYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmaW5pc2hEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icmFuayIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50ZWRBZnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50ZWRCZWZvcmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGxhbm5pbmdEYXRhIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cGVyQWN0aXZpdHkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5QcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAiU1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMiIHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICJTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMiIG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICJDdXN0b21lci5BcmNoaXRlY3QiIHdvdWxkIGRlZmluZSBhICJDdXN0b21lciIgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICJBcmNoaXRlY3QiIGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNQbGFubmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5KdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXRhaWwgVXNlIENhc2UiIHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzT3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtPcmRlciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAKLVRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGdsb2JhbCB1bmlxdWUgaWQgZm9yIGEgd29yayBvcmRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsaW5rVHlwZSIgdHlwZT0idW1hOldvcmtPcmRlclR5cGUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVkZWNlc3NvciIgdHlwZT0idW1hOldvcmtPcmRlciIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1JlcGVhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzT25nb2luZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNFdmVudERyaXZlbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWlsZXN0b25lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLgotQWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgdHlwZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaGVja2xpc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25jZXB0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXhhbXBsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikd1aWRlbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvYWRtYXAiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzYWJsZUFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV2hpdGVwYXBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IklzRW5hY3RhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBoYXNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLVBoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotSXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEJyZWFrZG93biBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1c2FnZUd1aWRhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWx0ZXJuYXRpdmVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSG93VG9TdGFmZiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZpbmVkRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBBY3Rpdml0eSBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY29wZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJVc2FnZU5vdGVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsSWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGRlbGl2ZXJ5IHBhdHRlcm5zIGFuZCBtb2RlbHMuIEl0IGlzIHVzZWQgbGlrZSBhIHN5bm9ueW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBQcm9jZXNzIERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2NhbGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2plY3RDaGFyYWN0ZXJpc3RpY3MiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3M8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJpc2tMZXZlbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpbmdUZWNobmlxdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlR5cGVPZkNvbnRyYWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb0knbSBjaGFJJ20gbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4KLURlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0ZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdHMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0RnJvbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJhYmxlUGFydHMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZUZvciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2tEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi1BIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUYXNrIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBlcmZvcm1lZFByaW1hcmlseUJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBc3Npc3RlZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdGVwIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb21wb3NpdGVSb2xlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLgotQSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpSb2xlRGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZ2dyZWdhdGVkUm9sZSIgdHlwZT0idW1hOlJvbGUiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVhbVByb2ZpbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLgotV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLgotSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBlclRlYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlRlYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2VzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuCi1Db3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkluY2x1ZGVzUGF0dGVybiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVmYXVsdENvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVmFsaWRDb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLgotQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbW11bmljYXRpb25zTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVkdWNhdGlvbk1hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLUEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLS0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0tIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLUEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNlUHJvY2VzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LgotQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiIHR5cGU9InVtYTpQcm9jZXNzRWxlbWVudCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZVNwZWNpZmljYXRpb24iIHR5cGU9InVtYTpUYXNrRGVzY3JpcHRvciIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlSU8iIHR5cGU9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuCi1VTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgImJsYWNrIGJveCIuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICJyZWFsaXphdGlvbiIgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc1BhY2thZ2UiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlIiB0eXBlPSJ1bWE6UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzIiB0eXBlPSJ1bWE6UHJvY2VzcyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFBsdWdpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZWRNZXRob2RQbHVnaW4iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2UiIHR5cGU9InVtYTpNZXRob2RQYWNrYWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNlckNoYW5nZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW4iIHR5cGU9InVtYTpNZXRob2RQbHVnaW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhc2VDb25maWd1cmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW5TZWxlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlZmF1bHRWaWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3NWaWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0b29sIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0b29sIHRoYXQgZ2VuZXJhdGVkIHRoZSBYTUwgZmlsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZExpYnJhcnkiIHR5cGU9InVtYTpNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTE5MzcxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyNzU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InVtYSIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiBuc1ByZWZpeD0idW1hIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uJiN4RDsmI3hBO0FjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZpdHkiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWNvbmRpdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlY29uZGl0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvc3Rjb25kaXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBvc3Rjb25kaXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjYiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYnJlYWtkb3duRWxlbWVudCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJyZWFrZG93bkVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGVja2xpc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDaGVja2xpc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25jZXB0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uY2VwdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI2Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4YW1wbGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeGFtcGxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjYiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3VpZGVsaW5lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3VpZGVsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjYiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9hZG1hcCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvYWRtYXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXVzYWJsZUFzc2V0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmV1c2FibGVBc3NldCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI2Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI2Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndoaXRlcGFwZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXaGl0ZXBhcGVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjYiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNFbmFjdGFibGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzRW5hY3RhYmxlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9WYXJpYWJpbGl0eVR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Im5hIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaG93VG9TdGFmZiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIb3dUb1N0YWZmIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHVycG9zZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnRpZmFjdCIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLiYjeEQ7JiN4QTtBcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgJnF1b3Q7b3duJnF1b3Q7IGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBcnRpZmFjdCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVkQXJ0aWZhY3QiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQXJ0aWZhY3QiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGFpbmVkQXJ0aWZhY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBcnRpZmFjdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFydGlmYWN0RGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJyaWVmT3V0bGluZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCcmllZk91dGxpbmUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVwcmVzZW50YXRpb25PcHRpb25zIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVwcmVzZW50YXRpb25PcHRpb25zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQnJlYWtkb3duRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlc2VudGVkQmVmb3JlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBsYW5uaW5nRGF0YSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGxhbm5pbmdEYXRhIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cGVyQWN0aXZpdHkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cGVyQWN0aXZpdHkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09wdGlvbmFsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc09wdGlvbmFsIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUGxhbm5lZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc1BsYW5uZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICZxdW90O1NSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzJnF1b3Q7IHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICZxdW90O1NvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyZxdW90OyBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAmcXVvdDtDdXN0b21lci5BcmNoaXRlY3QmcXVvdDsgd291bGQgZGVmaW5lIGEgJnF1b3Q7Q3VzdG9tZXImcXVvdDsgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICZxdW90O0FyY2hpdGVjdCZxdW90OyBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InByZWZpeCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlR3VpZGFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idXNhZ2VHdWlkYW5jZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4mI3hEOyYjeEE7QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6JiN4RDsmI3hBOy0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNoZWNrbGlzdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNoZWNrbGlzdCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcG9zaXRlUm9sZSIgZVN1cGVyVHlwZXM9IiMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4mI3hEOyYjeEE7QSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb21wb3NpdGVSb2xlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZ2dyZWdhdGVkUm9sZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Sb2xlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFnZ3JlZ2F0ZWRSb2xlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uY2VwdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25jZXB0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25zdHJhaW50IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnN0cmFpbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdG9yZXMgdGhlIG1haW4gZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJtYWluRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudENhdGVnb3J5IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgb25seSBjb250YWlucyBDb250ZW50IENhdGVnb3J5IEVsZW1lbnRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudENhdGVnb3J5UGFja2FnZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MTEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudENhdGVnb3J5IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250ZW50Q2F0ZWdvcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudERlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3RvcmVzIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1haW5EZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXlDb25zaWRlcmF0aW9ucyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iS2V5Q29uc2lkZXJhdGlvbnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdGlvbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNlY3Rpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LiYjeEQ7JiN4QTtDb250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRlbnRFbGVtZW50Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGVja2xpc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDaGVja2xpc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25jZXB0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uY2VwdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjExIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4YW1wbGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeGFtcGxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3VpZGVsaW5lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3VpZGVsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmV1c2FibGVBc3NldCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJldXNhYmxlQXNzZXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3aGl0ZXBhcGVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2hpdGVwYXBlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjExIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9WYXJpYWJpbGl0eVR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Im5hIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudFBhY2thZ2UiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjExIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnRFbGVtZW50IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnRlbnRFbGVtZW50IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRlbnRFbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAmcXVvdDtUZXN0aW5nJnF1b3Q7IGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXN0b21DYXRlZ29yeSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2F0ZWdvcml6ZWRFbGVtZW50IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2F0ZWdvcml6ZWRFbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ViQ2F0ZWdvcnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJDYXRlZ29yeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJhYmxlIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlbGl2ZXJhYmxlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlbGl2ZXJlZFdvcmtQcm9kdWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyYWJsZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVybmFsRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFja2FnaW5nR3VpZGFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQYWNrYWdpbmdHdWlkYW5jZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4mI3hEOyYjeEE7QSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWxpdmVyeVByb2Nlc3MiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjQyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbW11bmljYXRpb25zTWF0ZXJpYWwiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb21tdW5pY2F0aW9uc01hdGVyaWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6NDIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWR1Y2F0aW9uTWF0ZXJpYWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFZHVjYXRpb25NYXRlcmlhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjQyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIFByb2Nlc3MgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJ5IFByb2Nlc3MuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NhbGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTY2FsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3MiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdENoYXJhY3RlcmlzdGljcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyaXNrTGV2ZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmlza0xldmVsIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpbmdUZWNobmlxdWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGluZ1RlY2huaXF1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVPZkNvbnRyYWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvSSdtIGNoYUknbSBudHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlT2ZDb250cmFjdCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuJiN4RDsmI3hBO1RoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmliYWJsZUVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRhdGlvbiIgZVR5cGU9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVzZW50YXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9kZWljb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJub2RlaWNvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icHJlc2VudGF0aW9uTmFtZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaGFwZWljb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InNoYXBlaWNvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLiYjeEQ7JiN4QTtEZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdG9yIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlc2NyaXB0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWZpbmVkRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuJiN4RDsmI3hBO0EgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRpc2NpcGxpbmUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhc2siIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViRGlzY2lwbGluZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EaXNjaXBsaW5lIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YkRpc2NpcGxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvdyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlZmVyZW5jZVdvcmtmbG93Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVc2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICZxdW90O1NvZnR3YXJlIERpc2NpcGxpbmVzJnF1b3Q7IHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQmcXVvdDsgb3IgJnF1b3Q7VGVzdGluZyZxdW90OzsgJnF1b3Q7SVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCZxdW90OyB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICZxdW90O0lUIE9wZXJhdGlvbmFsIFNlcnZpY2VzJnF1b3Q7LCAmcXVvdDtJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzJnF1b3Q7LCBvciAmcXVvdDtJVCBFbmFibGluZyBTZXJ2aWNlcyZxdW90Oy4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRpc2NpcGxpbmVHcm91cGluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGlzY2lwbGluZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRpc2NpcGxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb2N1bWVudFJvb3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJtaXhlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaXhlZCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRXaWxkY2FyZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSI6bWl4ZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ieE1MTlNQcmVmaXhNYXAiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ieG1sbnM6cHJlZml4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InhTSVNjaGVtYUxvY2F0aW9uIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InhzaTpzY2hlbWFMb2NhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RDb25maWd1cmF0aW9uIiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZExpYnJhcnkiIHVwcGVyQm91bmQ9Ii0yIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kTGlicmFyeSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RMaWJyYXJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2luIiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuJiN4RDsmI3hBO01ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLiYjeEQ7JiN4QTtTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQbHVnaW4iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb21haW4iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LiYjeEQ7JiN4QTtEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRG9tYWluIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrUHJvZHVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtQcm9kdWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZG9tYWluIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0RvbWFpbiIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJkb21haW4iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZW1wdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgc2l6aW5nIG1lYXN1cmVzLCBvciBzdGFuZGFyZHMgZm9yIHNpemluZyB0aGUgd29yayBlZmZvcnQgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgYSBwYXJ0aWN1bGFyIHBpZWNlIG9mIHdvcmsgYW5kIGluc3RydWN0aW9ucyBmb3IgdGhlaXIgc3VjY2Vzc2Z1bCB1c2UuIEl0IG1heSBiZSBjb21wcmlzZWQgb2YgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9ucyBhbmQgZXN0aW1hdGlvbiBtZXRyaWNzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpb25NZXRyaWMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0aW9uTWV0cmljIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGluZ01ldHJpYyIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRpbmdNZXRyaWMiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBxdWFsaWZpZXMgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXhhbXBsZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4YW1wbGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3VpZGFuY2UiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgR3VpZGFuY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHdWlkYW5jZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdHRhY2htZW50IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXR0YWNobWVudCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkZWxpbmUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikd1aWRlbGluZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSXRlcmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7SXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJdGVyYXRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhc2VDb25maWd1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZUNvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWV0aG9kUGx1Z2luU2VsZWN0aW9uIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGx1Z2luU2VsZWN0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQYWNrYWdlU2VsZWN0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRWaWV3IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VmlldyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9jZXNzVmlldyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3NWaWV3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIERlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RFbGVtZW50Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3duZWRSdWxlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnN0cmFpbnQiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBwYWNrYWdpbmcgcnVsZXMgZm9yIHRoaXMgTWV0aG9kIEVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik93bmVkUnVsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImJyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmRlcmluZ0d1aWRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ib3JkZXJpbmdHdWlkZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBwcmVzc2VkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgJnF1b3Q7ZXh0ZW5kcyZxdW90OyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJzdXBwcmVzc2VkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZExpYnJhcnkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZExpYnJhcnkiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBsdWdpbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGx1Z2luIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZENvbmZpZ3VyYXRpb24iIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvb2wiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGFja2FnZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAxIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6NyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXVzZWRQYWNrYWdlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmV1c2VkUGFja2FnZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZFBhY2thZ2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDo3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdsb2JhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJnbG9iYWwiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGx1Z2luIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4mI3hEOyYjeEE7TWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuJiN4RDsmI3hBO1NwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQbHVnaW4iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmVyZW5jZWRNZXRob2RQbHVnaW4iCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQYWNrYWdlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ1c2VyQ2hhbmdlYWJsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RVbml0IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kVW5pdCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29weXJpZ2h0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3B5cmlnaHQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9ycyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYXV0aG9ycyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjaGFuZ2VEYXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZlcnNpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWlsZXN0b25lIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbGVzdG9uZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZWRFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVkRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZW1wdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJuYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGNvbWUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIFByb2R1Y3QgdGhhdCBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0Y29tZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQYWNrYWdlYWJsZUVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBoYXNlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7UGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaGFzZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGxhbm5pbmdEYXRhIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLiYjeEQ7JiN4QTtQbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuJiN4RDsmI3hBOyhOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQbGFubmluZ0RhdGEiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJmaW5pc2hEYXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhbmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJyYW5rIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ic3RhcnREYXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJhY3RpY2UiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZpdHlSZWZlcmVuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudFJlZmVyZW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlByYWN0aWNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1ByYWN0aWNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YlByYWN0aWNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcmFjdGljZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByYWN0aWNlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBZGRpdGlvbmFsSW5mbyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcHBsaWNhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXBwbGljYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFja2dyb3VuZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhY2tncm91bmQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ29hbHMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkdvYWxzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsc09mQWRvcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxzT2ZBZG9wdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9ibGVtIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvYmxlbSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4mI3hEOyYjeEE7Q29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2VzcyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJuIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW5jbHVkZXNQYXR0ZXJuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRDb250ZXh0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0Q29udGV4dCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWxpZENvbnRleHQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWxpZENvbnRleHQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuJiN4RDsmI3hBO1VNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3NDb21wb25lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvcHlyaWdodCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29weXJpZ2h0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZSIgZVR5cGU9IiMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW50ZXJmYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3MiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9ycyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYXV0aG9ycyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjaGFuZ2VEYXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZlcnNpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxOSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9uIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgotICAgICAgICBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkludGVyZmFjZVNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxOSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VJTyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW50ZXJmYWNlSU8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxOSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIEFjdGl2aXR5IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcm9jZXNzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY29wZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2NvcGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VOb3RlcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVc2FnZU5vdGVzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGRlbGl2ZXJ5IHBhdHRlcm5zIGFuZCBtb2RlbHMuIEl0IGlzIHVzZWQgbGlrZSBhIHN5bm9ueW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZXh0ZXJuYWxJZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4mI3hEOyYjeEE7UHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2Vzc0VsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4mI3hEOyYjeEE7QSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3NQYWNrYWdlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzRWxlbWVudCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzRWxlbWVudCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzRWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjExIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuJiN4RDsmI3hBO0EgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjQyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhc2VQcm9jZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZVByb2Nlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDo0MiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXBvcnQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVwb3J0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXVzYWJsZUFzc2V0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcmI3hEOyYjeEE7aG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJldXNhYmxlQXNzZXQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvYWRtYXAiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuJiN4RDsmI3hBO0FuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvYWRtYXAiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgJiN4RDsmI3hBO0EgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3BvbnNpYmxlRm9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFJvbGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudEFwcHJvYWNoZXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2tpbGxzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2tpbGxzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN5bm9ueW1zIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTeW5vbnltcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sZURlc2NyaXB0b3IiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNwb25zaWJsZUZvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAmcXVvdDtBbmFseXN0cyZxdW90OyBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgJnF1b3Q7QnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0JnF1b3Q7LCAmcXVvdDtTeXN0ZW0gQW5hbHlzdCZxdW90OywgYXMgd2VsbCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgU3BlY2lmaWVyJnF1b3Q7IHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGVTZXQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGUiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldEdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlU2V0R3JvdXBpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGVTZXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlU2V0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VjdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VjdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViU2VjdGlvbiIgZVR5cGU9IiMvL1NlY3Rpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ViU2VjdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVkZWNlc3NvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZGVjZXNzb3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uTmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ic2VjdGlvbk5hbWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5VHlwZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibmEiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2YXJpYWJpbGl0eVR5cGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLiYjeEQ7JiN4QTtBIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAmI3hEOyYjeEE7QSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gJiN4RDsmI3hBO0ZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXZlbG9wIFVzZSBDYXNlIE1vZGVsJnF1b3Q7IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgJnF1b3Q7bWV0aG9kJnF1b3Q7IG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2siLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWNvbmRpdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlY29uZGl0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvc3Rjb25kaXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBvc3Rjb25kaXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyZm9ybWVkQnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdXRwdXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRwdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik9wdGlvbmFsSW5wdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9vbE1lbnRvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvb2xNZW50b3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgVGFzay4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tEZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWx0ZXJuYXRpdmVzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQdXJwb3NlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuJiN4RDsmI3hBO0Ega2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tEZXNjcmlwdG9yIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXNrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJmb3JtZWRQcmltYXJpbHlCeSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjYiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXNzaXN0ZWRCeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lzdGVkQnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbElucHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWxJbnB1dCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI2Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcHRpb25hbElucHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3B0aW9uYWxJbnB1dCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI2Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im91dHB1dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dHB1dCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI2Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0ZXAiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGVwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlYW1Qcm9maWxlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLiYjeEQ7JiN4QTtXb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuJiN4RDsmI3hBO0hlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRlYW1Qcm9maWxlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxOSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xlIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cGVyVGVhbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cGVyVGVhbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1YlRlYW0iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJUZWFtIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUZW1wbGF0ZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVybURlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgZGVmaW5lcyBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUZXJtRGVmaW5pdGlvbnMgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUZXJtRGVmaW5pdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvb2wiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvb2xNZW50b3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb29sTWVudG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbE1lbnRvciIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBICBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVG9vbE1lbnRvciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhcmlhYmlsaXR5VHlwZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibmEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNvbnRyaWJ1dGVzIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXh0ZW5kcyIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InJlcGxhY2VzIiB2YWx1ZT0iMyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibG9jYWxDb250cmlidXRpb24iIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJsb2NhbFJlcGxhY2VtZW50IiB2YWx1ZT0iNSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGVPYmplY3QiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYXJpYWJpbGl0eVR5cGU6T2JqZWN0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iVmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldoaXRlcGFwZXIiIGVTdXBlclR5cGVzPSIjLy9Db25jZXB0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2hpdGVwYXBlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjE5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlY2Vzc29yIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtPcmRlciIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRXZlbnREcml2ZW4iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaXNFdmVudERyaXZlbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09uZ29pbmciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzT25nb2luZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1JlcGVhdGFibGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzUmVwZWF0YWJsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuJiN4RDsmI3hBO1dvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtEZWZpbml0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVjb25kaXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWNvbmRpdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3N0Y29uZGl0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQb3N0Y29uZGl0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtPcmRlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgJiN4RDsmI3hBO1RoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrT3JkZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9InNpbXBsZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IjowIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9InNpbXBsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtPcmRlclR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZpbmlzaFRvU3RhcnQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJsaW5rVHlwZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJXb3JrT3JkZXJUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya09yZGVyVHlwZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9TdGFydCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9GaW5pc2giIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvU3RhcnQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvRmluaXNoIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJXb3JrT3JkZXJUeXBlT2JqZWN0IiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya09yZGVyVHlwZTpPYmplY3QiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJXb3JrT3JkZXJUeXBlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLiYjeEQ7JiN4QTtBIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtQcm9kdWN0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVwb3J0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVwb3J0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGVtcGxhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUZW1wbGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvb2xNZW50b3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb29sTWVudG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBXb3JrIFByb2R1Y3QuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbXBhY3RPZk5vdEhhdmluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlB1cnBvc2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlYXNvbnNGb3JOb3ROZWVkaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImV4dGVybmFsSWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtQcm9kdWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBhY3RlZEJ5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW1wYWN0ZWRCeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjIyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGFjdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbXBhY3RzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlbGl2ZXJhYmxlUGFydHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gICYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYWN0aXZpdHlFbnRyeVN0YXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLiYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYWN0aXZpdHlFeGl0U3RhdGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgJnF1b3Q7Q2xhc3MgRGlhZ3JhbSZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICZxdW90O1NwZWNpZmljYXRpb24mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdFR5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtQcm9kdWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1Byb2R1Y3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmZDM4NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvVU1BLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNDA2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEiIHRlbXBsYXRlRGlyZWN0b3J5PSIiIG1vZGVsTmFtZT0iVU1BIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmVkaXQuVU1BRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuZWRpdG9yLlVNQUVkaXRvclBsdWdpbiIgcm9vdEV4dGVuZHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3QiCi0gICAgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5pbXBsLkVEYXRhT2JqZWN0SW1wbCIgcm9vdEltcGxlbWVudHNJbnRlcmZhY2U9IiIKLSAgICB0ZXN0U3VpdGVDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudGVzdHMuVU1BQWxsVGVzdHMiIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLnhzZC5lY29yZS5pbXBvcnRlciI+Ci0gIDxmb3JlaWduTW9kZWw+ZmlsZTovRDovc2hhcmVzL3htbC11bWEtdjEwL0VQRl9TY2hlbWFfMjAwNjA2MTkxMTAwLnhzZDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJVbWEiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYueG1sIiByZXNvdXJjZT0iWE1MIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgZWNvcmVQYWNrYWdlPSJVTUEuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iVU1BLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL25hIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9jb250cmlidXRlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJVTUEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvZXh0ZW5kcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJVTUEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvcmVwbGFjZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2xvY2FsQ29udHJpYnV0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9sb2NhbFJlcGxhY2VtZW50Ii8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJVTUEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9GaW5pc2giLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvRmluaXNoIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZU9iamVjdCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZU9iamVjdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0FjdGl2aXR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9wcmVjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHkvY2hlY2tsaXN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHkvY29uY2VwdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L2V4YW1wbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9ndWlkZWxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9yb2FkbWFwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHkvcmV1c2FibGVBc3NldCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L3N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L3doaXRlcGFwZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9pc0VuYWN0YWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2hvd1RvU3RhZmYiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQXJ0aWZhY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BcnRpZmFjdC9ncm91cDMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9icmllZk91dGxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL3JlcHJlc2VudGF0aW9uT3B0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRCZWZvcmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3BsYW5uaW5nRGF0YSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNPcHRpb25hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNQbGFubmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVmaXgiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24vdXNhZ2VHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9DYXBhYmlsaXR5UGF0dGVybiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NoZWNrbGlzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NvbXBvc2l0ZVJvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db21wb3NpdGVSb2xlL2dyb3VwMSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Db21wb3NpdGVSb2xlL2FnZ3JlZ2F0ZWRSb2xlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NvbmNlcHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db25zdHJhaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db25zdHJhaW50L21haW5EZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db250ZW50Q2F0ZWdvcnlQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudENhdGVnb3J5UGFja2FnZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vQ29udGVudENhdGVnb3J5UGFja2FnZS9jb250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vbWFpbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2tleUNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9zZWN0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZ3JvdXAxIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY2hlY2tsaXN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY29uY2VwdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2V4YW1wbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9ndWlkZWxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9yZXVzYWJsZUFzc2V0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvc3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvd2hpdGVwYXBlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ29udGVudFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50UGFja2FnZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vQ29udGVudFBhY2thZ2UvY29udGVudEVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9jYXRlZ29yaXplZEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9zdWJDYXRlZ29yeSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9EZWxpdmVyYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlL2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlL2RlbGl2ZXJlZFdvcmtQcm9kdWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vZXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vcGFja2FnaW5nR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9jb21tdW5pY2F0aW9uc01hdGVyaWFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2VkdWNhdGlvbk1hdGVyaWFsIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9zY2FsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9yaXNrTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9lc3RpbWF0aW5nVGVjaG5pcXVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdE1lbWJlckV4cGVydGlzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3R5cGVPZkNvbnRyYWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvbm9kZWljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvcHJlc2VudGF0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9zaGFwZWljb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVzY3JpcHRvci9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24vcmVmaW5lZERlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0Rpc2NpcGxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EaXNjaXBsaW5lL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rpc2NpcGxpbmUvdGFzayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9EaXNjaXBsaW5lL3N1YkRpc2NpcGxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EaXNjaXBsaW5lL3JlZmVyZW5jZVdvcmtmbG93Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZy9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmcvZGlzY2lwbGluZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Eb2N1bWVudFJvb3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Eb2N1bWVudFJvb3QvbWl4ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vRG9jdW1lbnRSb290L3hNTE5TUHJlZml4TWFwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0RvY3VtZW50Um9vdC94U0lTY2hlbWFMb2NhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Eb2N1bWVudFJvb3QvbWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Eb2N1bWVudFJvb3QvbWV0aG9kTGlicmFyeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Eb2N1bWVudFJvb3QvbWV0aG9kUGx1Z2luIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0RvbWFpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RvbWFpbi9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Eb21haW4vd29ya1Byb2R1Y3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vRG9tYWluL3N1YmRvbWFpbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9FbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRXN0aW1hdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Fc3RpbWF0ZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Fc3RpbWF0ZS9lc3RpbWF0aW9uTWV0cmljIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRXN0aW1hdGUvZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0VzdGltYXRpbmdNZXRyaWMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9FeGFtcGxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vR3VpZGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9HdWlkYW5jZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9HdWlkYW5jZURlc2NyaXB0aW9uL2F0dGFjaG1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vSXRlcmF0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9iYXNlQ29uZmlndXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGx1Z2luU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQYWNrYWdlU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9kZWZhdWx0VmlldyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vcHJvY2Vzc1ZpZXciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZEVsZW1lbnQvZ3JvdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vd25lZFJ1bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2JyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vcmRlcmluZ0d1aWRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9zdXBwcmVzc2VkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL01ldGhvZExpYnJhcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L21ldGhvZFBsdWdpbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L21ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ3JvdXAxIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9yZXVzZWRQYWNrYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL01ldGhvZFBhY2thZ2UvbWV0aG9kUGFja2FnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ2xvYmFsIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL01ldGhvZFBsdWdpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kUGx1Z2luL3JlZmVyZW5jZWRNZXRob2RQbHVnaW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vTWV0aG9kUGx1Z2luL21ldGhvZFBhY2thZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RQbHVnaW4vdXNlckNoYW5nZWFibGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kVW5pdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kVW5pdC9jb3B5cmlnaHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RVbml0L2F1dGhvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kVW5pdC92ZXJzaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL01pbGVzdG9uZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL05hbWVkRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vT3V0Y29tZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1BhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1BoYXNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUGxhbm5pbmdEYXRhIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QbGFubmluZ0RhdGEvZmluaXNoRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1BsYW5uaW5nRGF0YS9yYW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3N0YXJ0RGF0ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9QcmFjdGljZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlL2FjdGl2aXR5UmVmZXJlbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJhY3RpY2UvY29udGVudFJlZmVyZW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9QcmFjdGljZS9zdWJQcmFjdGljZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FkZGl0aW9uYWxJbmZvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hcHBsaWNhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYmFja2dyb3VuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vZ29hbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2xldmVsc09mQWRvcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL3Byb2JsZW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzcy9pbmNsdWRlc1BhdHRlcm4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzL2RlZmF1bHRDb250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzcy92YWxpZENvbnRleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9jb3B5cmlnaHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9pbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9wcm9jZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9hdXRob3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9jaGFuZ2VEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9jaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvdmVyc2lvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9ncm91cDEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlSU8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vc2NvcGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vdXNhZ2VOb3RlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Byb2Nlc3NFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvcHJvY2Vzc0VsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS9ncm91cDMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS9iYXNlUHJvY2VzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9SZXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUm9hZG1hcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGUvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vYXNzaWdubWVudEFwcHJvYWNoZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc2tpbGxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3N5bm9ueW1zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9yb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUm9sZVNldCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGVTZXQvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZVNldC9yb2xlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvbGVTZXRHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGVTZXRHcm91cGluZy9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmcvcm9sZVNldCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9TZWN0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vU2VjdGlvbi9zdWJTZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vU2VjdGlvbi9wcmVkZWNlc3NvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1NlY3Rpb24vZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9TZWN0aW9uL3ByZWRlY2Vzc29yMSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1NlY3Rpb24vc2VjdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9TZWN0aW9uL3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9TZWN0aW9uL3ZhcmlhYmlsaXR5VHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9UYXNrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL3ByZWNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svcG9zdGNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svcGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9vdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9vcHRpb25hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9lc3RpbWF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay90b29sTWVudG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci90YXNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvcGVyZm9ybWVkUHJpbWFyaWx5QnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hc3Npc3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9zdGVwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1RlYW1Qcm9maWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGVhbVByb2ZpbGUvZ3JvdXAxIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGVhbVByb2ZpbGUvcm9sZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vVGVtcGxhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9UZXJtRGVmaW5pdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Rvb2wiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Ub29sL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rvb2wvdG9vbE1lbnRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vV2hpdGVwYXBlciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvZ3JvdXAxIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L3ByZWRlY2Vzc29yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNFdmVudERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzT25nb2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzUmVwZWF0YWJsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya0RlZmluaXRpb24vcHJlY29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya0RlZmluaXRpb24vcG9zdGNvbmRpdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Xb3JrT3JkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtPcmRlci92YWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtPcmRlci9saW5rVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0L2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0L2VzdGltYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3QvZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3QvcmVwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3QvdGVtcGxhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90b29sTWVudG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vaW1wYWN0T2ZOb3RIYXZpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3JlYXNvbnNGb3JOb3ROZWVkaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL3dvcmtQcm9kdWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL3Jlc3BvbnNpYmxlUm9sZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZ3JvdXAxIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2V4dGVybmFsSW5wdXRUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvbWFuZGF0b3J5SW5wdXRUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9vcHRpb25hbElucHV0VG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3Ivb3V0cHV0RnJvbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9kZWxpdmVyYWJsZVBhcnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RW50cnlTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUV4aXRTdGF0ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlL3dvcmtQcm9kdWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS54c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YjhlODdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIEVQRiBVTUEgWE1MIERhdGEgSW50ZXJjaGFuZ2UgU2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgeG1sbnM6dW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIj4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb0ZpbmlzaCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvRmluaXNoIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5hIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb250cmlidXRlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5kcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmVwbGFjZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsQ29udHJpYnV0aW9uIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbFJlcGxhY2VtZW50Ii8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVkRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpOYW1lZEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIERlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3duZWRSdWxlIiB0eXBlPSJ1bWE6Q29uc3RyYWludCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBhY2thZ2luZyBydWxlcyBmb3IgdGhpcyBNZXRob2QgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3VwcHJlc3NlZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlICJleHRlbmRzIiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcmRlcmluZ0d1aWRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uc3RyYWludCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0b3JlcyB0aGUgbWFpbiBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlY3Rpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdWJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmVkZWNlc3NvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWN0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFVuaXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29weXJpZ2h0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXV0aG9ycyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNYWluRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdG9yZXMgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iS2V5Q29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEd1aWRhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByYWN0aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBZGRpdGlvbmFsSW5mbyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBcHBsaWNhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCYWNrZ3JvdW5kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJHb2FscyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMZXZlbHNPZkFkb3B0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSk8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvYmxlbSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgV29yayBQcm9kdWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJbXBhY3RPZk5vdEhhdmluZyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWFzb25zRm9yTm90TmVlZGluZyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsSWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBcnRpZmFjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJyaWVmT3V0bGluZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlcHJlc2VudGF0aW9uT3B0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyYWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkV4dGVybmFsRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFja2FnaW5nR3VpZGFuY2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQXNzaWdubWVudEFwcHJvYWNoZXMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNraWxscyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3lub255bXMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBbHRlcm5hdGl2ZXMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLVRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlc2VudGF0aW9uIiB0eXBlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICJydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50IiB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAiajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCIgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAiQXJjaGl0ZWN0dXJlIERvY3VtZW50Ii48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaGFwZWljb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im5vZGVpY29uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuCi1Db250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2hlY2tsaXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29uY2VwdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4YW1wbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHdWlkZWxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzYWJsZUFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV2hpdGVwYXBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRhbmNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25jZXB0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2hlY2tsaXN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFeGFtcGxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkZWxpbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgc2l6aW5nIG1lYXN1cmVzLCBvciBzdGFuZGFyZHMgZm9yIHNpemluZyB0aGUgd29yayBlZmZvcnQgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgYSBwYXJ0aWN1bGFyIHBpZWNlIG9mIHdvcmsgYW5kIGluc3RydWN0aW9ucyBmb3IgdGhlaXIgc3VjY2Vzc2Z1bCB1c2UuIEl0IG1heSBiZSBjb21wcmlzZWQgb2YgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9ucyBhbmQgZXN0aW1hdGlvbiBtZXRyaWNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbk1ldHJpYyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRpbmdNZXRyaWMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgZGVzY3JpYmVzIGEgbWV0cmljIG9yIG1lYXN1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCBhbmQgd2hpY2ggaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHdvcmsgZWZmb3J0IGFzIHdlbGwgYXMgYSByYW5nZSBvZiBwb3RlbnRpYWwgbGFib3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBxdWFsaWZpZXMgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9hZG1hcCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2Ugd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4KLUFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmVwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVtcGxhdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRvb2xNZW50b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSAgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV2hpdGVwYXBlciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29uY2VwdCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlcm1EZWZpbml0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGRlZmluZXMgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGVybURlZmluaXRpb25zIGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmFjdGljZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgIk1hbmFnZSBSaXNrcyIsICJDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkiLCAiQXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCIsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIj4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFjdGl2aXR5UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJQcmFjdGljZSIgdHlwZT0idW1hOlByYWN0aWNlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJldXNhYmxlQXNzZXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZwotaG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuCi1BIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcG9ydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXJ0aWZhY3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4KLUFydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAib3duIiBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFpbmVkQXJ0aWZhY3QiIHR5cGU9InVtYTpBcnRpZmFjdCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyYWJsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyZWRXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPdXRjb21lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAKLUEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZUZvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uCi1BIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAKLUEgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uIAotRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXZlbG9wIFVzZSBDYXNlIE1vZGVsIiBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICJtZXRob2QiIG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0RlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4KLVdvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudENhdGVnb3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LgotQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRhc2siIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YkRpc2NpcGxpbmUiIHR5cGU9InVtYTpEaXNjaXBsaW5lIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VXb3JrZmxvdyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAiU29mdHdhcmUgRGlzY2lwbGluZXMiIHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgIlJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IiBvciAiVGVzdGluZyI7ICJJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50IiB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICJJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyIsICJJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzIiwgb3IgIklUIEVuYWJsaW5nIFNlcnZpY2VzIi4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEaXNjaXBsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRvbWFpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLURvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YmRvbWFpbiIgdHlwZT0idW1hOkRvbWFpbiIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPk9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICJBbmFseXN0cyIgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICJCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QiLCAiU3lzdGVtIEFuYWx5c3QiLCBhcyB3ZWxsIGFzICJSZXF1aXJlbWVudHMgU3BlY2lmaWVyIiByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0R3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Um9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGVTZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAiQ2xhc3MgRGlhZ3JhbSIsIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAiU3BlY2lmaWNhdGlvbiIsIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICJUZXN0aW5nIiBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNhdGVnb3JpemVkRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViQ2F0ZWdvcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzZWRQYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnbG9iYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudFBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50RWxlbWVudCIgdHlwZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgb25seSBjb250YWlucyBDb250ZW50IENhdGVnb3J5IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIHR5cGU9InVtYTpDb250ZW50Q2F0ZWdvcnkiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4KLVByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBsYW5uaW5nRGF0YSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFByb2Nlc3MgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4KLVBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4KLShOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RhcnREYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmaW5pc2hEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icmFuayIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByZXNlbnRlZEFmdGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByZXNlbnRlZEJlZm9yZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQbGFubmluZ0RhdGEiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cGVyQWN0aXZpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gIlNSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzIiB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAiU29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzIiBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAiQ3VzdG9tZXIuQXJjaGl0ZWN0IiB3b3VsZCBkZWZpbmUgYSAiQ3VzdG9tZXIiIHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAiQXJjaGl0ZWN0IiBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzUGxhbm5lZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV0YWlsIFVzZSBDYXNlIiB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc09wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrT3JkZXIiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgCi1UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6c2ltcGxlQ29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImxpbmtUeXBlIiB0eXBlPSJ1bWE6V29ya09yZGVyVHlwZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWRlY2Vzc29yIiB0eXBlPSJ1bWE6V29ya09yZGVyIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzUmVwZWF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNPbmdvaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc0V2ZW50RHJpdmVuIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNaWxlc3RvbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY3Rpdml0eSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uCi1BY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiB0eXBlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoZWNrbGlzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmNlcHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeGFtcGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3VpZGVsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9hZG1hcCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNhYmxlQXNzZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXaGl0ZXBhcGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iSXNFbmFjdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGhhc2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotUGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1JdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLik8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzYWdlR3VpZGFuY2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFsdGVybmF0aXZlcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikhvd1RvU3RhZmYiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmluZWREZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEFjdGl2aXR5IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2NvcGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVXNhZ2VOb3RlcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXh0ZXJuYWxJZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgZGVsaXZlcnkgcGF0dGVybnMgYW5kIG1vZGVscy4gSXQgaXMgdXNlZCBsaWtlIGEgc3lub255bS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFByb2Nlc3MgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJ5IFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNjYWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzczwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSaXNrTGV2ZWwiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFc3RpbWF0aW5nVGVjaG5pcXVlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvamVjdE1lbWJlckV4cGVydGlzZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUeXBlT2ZDb250cmFjdCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvSSdtIGNoYUknbSBudHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLgotRGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaXB0b3IiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdGVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVsaXZlcmFibGVQYXJ0cyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAKLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4KLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaXB0b3IiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlc3BvbnNpYmxlRm9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFza0Rlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLUEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGFzayIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQZXJmb3JtZWRQcmltYXJpbHlCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFzc2lzdGVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IlN0ZXAiIHR5cGU9InVtYTpTZWN0aW9uIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbXBvc2l0ZVJvbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuCi1BIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlJvbGVEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFnZ3JlZ2F0ZWRSb2xlIiB0eXBlPSJ1bWE6Um9sZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZWFtUHJvZmlsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuCi1Xb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuCi1IZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cGVyVGVhbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViVGVhbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4KLUNvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iSW5jbHVkZXNQYXR0ZXJuIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRlZmF1bHRDb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJWYWxpZENvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuCi1BIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRWR1Y2F0aW9uTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLgotQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6Ci0tIFRvIHNlcnZlIGFzIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYXNzZW1ibGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMuICBOb3JtYWxseSBkZXZlbG9waW5nIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBub3QgZG9uZSBmcm9tIHNjcmF0Y2ggYnV0IGJ5IHN5c3RlbWF0aWNhbGx5IGFwcGx5aW5nIGFuZCBiaW5kaW5nIHBhdHRlcm5zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHBhdHRlcm4gYXBwbGljYXRpb24gb2YgJ2NvcHktYW5kLW1vZGlmeScsIHdoaWNoIGFsbG93cyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gaXQgaXMgYXBwbGllZCBmb3IsIHRoZSBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIChTZWN0aW9uIDYuMSkgaW50cm9kdWNlcyBldmVuIG1vcmUgc29waGlzdGljYXRlZCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIHRoYXQgc3VwcG9ydCBkeW5hbWljIGJpbmRpbmcgb2YgcGF0dGVybnMgKGkuZS4gdGhlIHBhdHRlcm4gaXMgcmVmZXJlbmNlZCBhbmQgbm90IGNvcGllZCkuICBUaGlzIHVuaXF1ZSBuZXcgd2F5IG9mIHJldXNpbmcgcHJvY2VzcyBrbm93bGVkZ2UgYWxsb3dzIHRvIGZhY3RvciBvdXQgY29tbW9ubHkgcmVvY2N1cnJpbmcgQWN0aXZpdGllcyBpbnRvIHBhdHRlcm5zIGFuZCB0byBhcHBseSB0aGVtIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGEgcHJvY2Vzcy4gIFdoZW4gdGhlIHBhdHRlcm4gaXMgYmVpbmcgcmV2aXNlZCBvciB1cGRhdGVkLCBhbGwgY2hhbmdlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIGFsbCBwYXR0ZXJuIGFwcGxpY2F0aW9uIGluIGFsbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBiaW5kaW5nLgotLSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4KLS0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLgotQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIj4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhc2VQcm9jZXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMsIG9ubHkuCi1BIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzRWxlbWVudCIgdHlwZT0idW1hOlByb2Nlc3NFbGVtZW50Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlU3BlY2lmaWNhdGlvbiIgdHlwZT0idW1hOlRhc2tEZXNjcmlwdG9yIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2VJTyIgdHlwZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzQ29tcG9uZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4KLVVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAiYmxhY2sgYm94Ii4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgInJlYWxpemF0aW9uIiBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzUGFja2FnZSI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29weXJpZ2h0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkludGVyZmFjZSIgdHlwZT0idW1hOlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3MiIHR5cGU9InVtYTpQcm9jZXNzIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXV0aG9ycyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kUGx1Z2luIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iTWV0aG9kUGFja2FnZSIgdHlwZT0idW1hOk1ldGhvZFBhY2thZ2UiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iQmFzZUNvbmZpZ3VyYXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1ldGhvZFBsdWdpblNlbGVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iTWV0aG9kUGFja2FnZVNlbGVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEZWZhdWx0VmlldyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvY2Vzc1ZpZXciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIHR5cGU9InVtYTpNZXRob2RDb25maWd1cmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZExpYnJhcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iTWV0aG9kUGx1Z2luIiB0eXBlPSJ1bWE6TWV0aG9kUGx1Z2luIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kTGlicmFyeSIgdHlwZT0idW1hOk1ldGhvZExpYnJhcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQWN0aXZpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE4MDQ5OWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFjdGl2aXR5LmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uCi0gKiBBY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldEJyZWFrZG93bkVsZW1lbnQgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRDaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0Q29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0R3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFJvYWRtYXAgPGVtPlJvYWRtYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFdoaXRlcGFwZXIgPGVtPldoaXRlcGFwZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2lzSXNFbmFjdGFibGUgPGVtPklzIEVuYWN0YWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBY3Rpdml0eScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGl2aXR5IGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlY29uZGl0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfUHJlY29uZGl0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZWNvbmRpdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlY29uZGl0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBvc3Rjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9Qb3N0Y29uZGl0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Bvc3Rjb25kaXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UG9zdGNvbmRpdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI2JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JyZWFrZG93bkVsZW1lbnQnIGdyb3VwPScjZ3JvdXA6MjYnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfQ2hlY2tsaXN0KCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NoZWNrbGlzdCcgZ3JvdXA9JyNncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENoZWNrbGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uY2VwdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmNlcHQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0NvbmNlcHQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29uY2VwdCcgZ3JvdXA9JyNncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGFtcGxlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9FeGFtcGxlKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4YW1wbGUnIGdyb3VwPScjZ3JvdXA6MjYnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkd1aWRlbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkd1aWRlbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfR3VpZGVsaW5lKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0d1aWRlbGluZScgZ3JvdXA9JyNncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEd1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9hZG1hcDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvYWRtYXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X1JvYWRtYXAoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUm9hZG1hcCcgZ3JvdXA9JyNncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFJvYWRtYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9SZXVzYWJsZUFzc2V0KCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JldXNhYmxlQXNzZXQnIGdyb3VwPScjZ3JvdXA6MjYnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSZXVzYWJsZUFzc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfU3VwcG9ydGluZ01hdGVyaWFsKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1cHBvcnRpbmdNYXRlcmlhbCcgZ3JvdXA9JyNncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2hpdGVwYXBlcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldoaXRlcGFwZXI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X1doaXRlcGFwZXIoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2hpdGVwYXBlcicgZ3JvdXA9JyNncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFdoaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgRW5hY3RhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEVuYWN0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjdW5zZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjc2V0SXNFbmFjdGFibGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfSXNFbmFjdGFibGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nSXNFbmFjdGFibGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNFbmFjdGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2lzSXNFbmFjdGFibGUgPGVtPklzIEVuYWN0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRW5hY3RhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICN1bnNldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNpc0lzRW5hY3RhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0VuYWN0YWJsZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNpc0lzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNzZXRJc0VuYWN0YWJsZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNFbmFjdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFbmFjdGFibGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNpc0lzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNzZXRJc0VuYWN0YWJsZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNFbmFjdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4ibmEiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0ibmEiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmFyaWFiaWxpdHlUeXBlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotfSAvLyBBY3Rpdml0eQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FjdGl2aXR5RGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FjdGl2aXR5RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmVlNzUzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BY3Rpdml0eURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBY3Rpdml0eURlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNyBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBY3Rpdml0eS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEhvd1RvU3RhZmYgPGVtPkhvdyBUbyBTdGFmZjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FjdGl2aXR5RGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBY3Rpdml0eURlc2NyaXB0aW9uIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsdGVybmF0aXZlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWx0ZXJuYXRpdmVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWx0ZXJuYXRpdmVzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFsdGVybmF0aXZlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SG93IFRvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ib3cgVG8gU3RhZmY8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEhvd1RvU3RhZmYoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd1RvU3RhZmYoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSG93VG9TdGFmZiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIb3dUb1N0YWZmKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEhvd1RvU3RhZmYgPGVtPkhvdyBUbyBTdGFmZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SG93IFRvIFN0YWZmPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIb3dUb1N0YWZmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIb3dUb1N0YWZmKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQdXJwb3NlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1B1cnBvc2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHVycG9zZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdXJwb3NlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQWN0aXZpdHlEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BcnRpZmFjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4N2Y2ZjQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFydGlmYWN0LmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLgotICogQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICJvd24iIGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0IDxlbT5Db250YWluZWQgQXJ0aWZhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3QoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FydGlmYWN0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJ0aWZhY3QgZXh0ZW5kcyBXb3JrUHJvZHVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0X0dyb3VwMygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lZCBBcnRpZmFjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdCIgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbnRhaW5lZEFydGlmYWN0JyBncm91cD0nI2dyb3VwOjI3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKTsKLQotfSAvLyBBcnRpZmFjdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzY0OWM1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BcnRpZmFjdERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFydGlmYWN0RGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI3IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFydGlmYWN0IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBcnRpZmFjdC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXJ0aWZhY3REZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFydGlmYWN0RGVzY3JpcHRpb24gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CcmllZiBPdXRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBPdXRsaW5lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRCcmllZk91dGxpbmUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCcmllZk91dGxpbmUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QnJpZWZPdXRsaW5lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QnJpZWYgT3V0bGluZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCcmllZk91dGxpbmUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVwcmVzZW50YXRpb25PcHRpb25zJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQXJ0aWZhY3REZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0JyZWFrZG93bkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0JyZWFrZG93bkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmU1ZDdjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9CcmVha2Rvd25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCcmVha2Rvd25FbGVtZW50LmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNyBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXR5IDxlbT5TdXBlciBBY3Rpdml0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0JyZWFrZG93bkVsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCcmVha2Rvd25FbGVtZW50IGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlc2VudGVkQWZ0ZXIoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZXNlbnRlZEFmdGVyJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZXNlbnRlZEFmdGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRlZEFmdGVyKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZXNlbnRlZEJlZm9yZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZXNlbnRlZEJlZm9yZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVzZW50ZWRCZWZvcmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRlZEJlZm9yZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQbGFubmluZ0RhdGEoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQbGFubmluZ0RhdGEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQbGFubmluZ0RhdGEoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3VwZXJBY3Rpdml0eShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0eSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3VwZXJBY3Rpdml0eSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTdXBlckFjdGl2aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cGVyQWN0aXZpdHkgPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3VwZXJBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3VwZXJBY3Rpdml0eShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBKdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXRhaWwgVXNlIENhc2UiIHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQHNlZSAjdW5zZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICN1bnNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI3NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI3NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjdW5zZXRJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNzZXRJc09wdGlvbmFsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpc09wdGlvbmFsJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjdW5zZXRJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNpc0lzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzT3B0aW9uYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNpc0lzT3B0aW9uYWwoKQotCSAqIEBzZWUgI3NldElzT3B0aW9uYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBPcHRpb25hbDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjaXNJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNzZXRJc09wdGlvbmFsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc09wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNQbGFubmVkKCkKLQkgKiBAc2VlICN1bnNldElzUGxhbm5lZCgpCi0JICogQHNlZSAjc2V0SXNQbGFubmVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lzUGxhbm5lZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc1BsYW5uZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNQbGFubmVkKCkKLQkgKiBAc2VlICN1bnNldElzUGxhbm5lZCgpCi0JICogQHNlZSAjaXNJc1BsYW5uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzUGxhbm5lZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc1BsYW5uZWQoKQotCSAqIEBzZWUgI2lzSXNQbGFubmVkKCkKLQkgKiBAc2VlICNzZXRJc1BsYW5uZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzUGxhbm5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQbGFubmVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1BsYW5uZWQoKQotCSAqIEBzZWUgI2lzSXNQbGFubmVkKCkKLQkgKiBAc2VlICNzZXRJc1BsYW5uZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzUGxhbm5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAiU1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMiIHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICJTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMiIG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICJDdXN0b21lci5BcmNoaXRlY3QiIHdvdWxkIGRlZmluZSBhICJDdXN0b21lciIgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICJBcmNoaXRlY3QiIGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlZml4KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdwcmVmaXgnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlZml4KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlZml4KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQnJlYWtkb3duRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3ZDNkMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEJyZWFrZG93biBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiNnZXRVc2FnZUd1aWRhbmNlIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXNhZ2VHdWlkYW5jZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndXNhZ2VHdWlkYW5jZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRVc2FnZUd1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVc2FnZUd1aWRhbmNlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ2FwYWJpbGl0eVBhdHRlcm4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NhcGFiaWxpdHlQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmNWQzNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ2FwYWJpbGl0eVBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ2FwYWJpbGl0eVBhdHRlcm4uamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI3IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhcGFiaWxpdHkgUGF0dGVybjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLSAqIEEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotICogLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLSAqIC0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0gKiAtIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENhcGFiaWxpdHlQYXR0ZXJuKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDYXBhYmlsaXR5UGF0dGVybicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhcGFiaWxpdHlQYXR0ZXJuIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB7Ci19IC8vIENhcGFiaWxpdHlQYXR0ZXJuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ2hlY2tsaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DaGVja2xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmI4NDQwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DaGVja2xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ2hlY2tsaXN0LmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNyBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENoZWNrbGlzdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ2hlY2tsaXN0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hlY2tsaXN0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBDaGVja2xpc3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db21wb3NpdGVSb2xlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db21wb3NpdGVSb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhOWZhNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29tcG9zaXRlUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb3NpdGVSb2xlLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tcG9zaXRlIFJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4KLSAqIEEgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0QWdncmVnYXRlZFJvbGUgPGVtPkFnZ3JlZ2F0ZWQgUm9sZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb21wb3NpdGVSb2xlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb21wb3NpdGVSb2xlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9zaXRlUm9sZSBleHRlbmRzIFJvbGVEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29tcG9zaXRlUm9sZV9Hcm91cDEoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyMiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZ2dyZWdhdGVkIFJvbGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFnZ3JlZ2F0ZWQgUm9sZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFnZ3JlZ2F0ZWQgUm9sZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBZ2dyZWdhdGVkUm9sZScgZ3JvdXA9JyNncm91cDoyMiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEFnZ3JlZ2F0ZWRSb2xlKCk7Ci0KLX0gLy8gQ29tcG9zaXRlUm9sZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbmNlcHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbmNlcHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDVjY2RjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db25jZXB0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbmNlcHQuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI3IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb25jZXB0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb25jZXB0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uY2VwdCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gQ29uY2VwdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnN0cmFpbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGVkOTY1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnN0cmFpbnQuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQjZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnN0cmFpbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnN0cmFpbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25zdHJhaW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3RvcmVzIHRoZSBtYWluIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1haW5EZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnN0cmFpbnRfTWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nbWFpbkRlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1haW5EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludCNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQ29uc3RyYWludApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRDYXRlZ29yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudENhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2MjQ2YmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudENhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRDYXRlZ29yeS5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudENhdGVnb3J5KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb250ZW50Q2F0ZWdvcnknIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZW50Q2F0ZWdvcnkgZXh0ZW5kcyBDb250ZW50RWxlbWVudCB7Ci19IC8vIENvbnRlbnRDYXRlZ29yeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2QzZWE0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50Q2F0ZWdvcnlQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRDYXRlZ29yeVBhY2thZ2UuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBvbmx5IGNvbnRhaW5zIENvbnRlbnQgQ2F0ZWdvcnkgRWxlbWVudHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSNnZXRDb250ZW50Q2F0ZWdvcnkgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29udGVudENhdGVnb3J5UGFja2FnZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UgZXh0ZW5kcyBNZXRob2RQYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZW50IENhdGVnb3J5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeSIgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbnRlbnRDYXRlZ29yeScgZ3JvdXA9JyNncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENvbnRlbnRDYXRlZ29yeSgpOwotCi19IC8vIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50RGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnREZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzZmZDdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnREZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudERlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRTZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29udGVudERlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudERlc2NyaXB0aW9uIGV4dGVuZHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3RvcmVzIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1haW5EZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWFpbkRlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1haW5EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYWluRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0S2V5Q29uc2lkZXJhdGlvbnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nS2V5Q29uc2lkZXJhdGlvbnMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRLZXlDb25zaWRlcmF0aW9ucyA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEtleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRLZXlDb25zaWRlcmF0aW9ucyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VjdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3Rpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9uKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NlY3Rpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRTZWN0aW9uKCk7Ci0KLX0gLy8gQ29udGVudERlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1YTNhODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRFbGVtZW50LmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuCi0gKiBDb250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldENvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldEV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldEd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRSZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnRlbnRFbGVtZW50JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudEVsZW1lbnQgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9Hcm91cDEoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0KCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NoZWNrbGlzdCcgZ3JvdXA9JyNncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENoZWNrbGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uY2VwdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmNlcHQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0NvbmNlcHQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29uY2VwdCcgZ3JvdXA9JyNncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGFtcGxlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4YW1wbGUnIGdyb3VwPScjZ3JvdXA6MTEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkd1aWRlbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkd1aWRlbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0d1aWRlbGluZScgZ3JvdXA9JyNncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEd1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmV1c2FibGVBc3NldCcgZ3JvdXA9JyNncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFJldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3VwcG9ydGluZ01hdGVyaWFsJyBncm91cD0nI2dyb3VwOjExJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2hpdGVwYXBlcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfV2hpdGVwYXBlcigpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXaGl0ZXBhcGVyJyBncm91cD0nI2dyb3VwOjExJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0V2hpdGVwYXBlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJuYSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjaXNTZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJuYSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2YXJpYWJpbGl0eVR5cGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjaXNTZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpOwotCi19IC8vIENvbnRlbnRFbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudFBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyMmM0OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudFBhY2thZ2UuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudFBhY2thZ2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnRlbnRQYWNrYWdlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudFBhY2thZ2UgZXh0ZW5kcyBNZXRob2RQYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudFBhY2thZ2VfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MTEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29udGVudEVsZW1lbnQnIGdyb3VwPScjZ3JvdXA6MTEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRDb250ZW50RWxlbWVudCgpOwotCi19IC8vIENvbnRlbnRQYWNrYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ3VzdG9tQ2F0ZWdvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0N1c3RvbUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NTQ5ZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ3VzdG9tQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ3VzdG9tQ2F0ZWdvcnkuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DdXN0b20gQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgIlRlc3RpbmciIGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5I2dldENhdGVnb3JpemVkRWxlbWVudCA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0U3ViQ2F0ZWdvcnkgPGVtPlN1YiBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ3VzdG9tQ2F0ZWdvcnknIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDdXN0b21DYXRlZ29yeSBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEN1c3RvbUNhdGVnb3J5X0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRlZ29yaXplZCBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2F0ZWdvcml6ZWRFbGVtZW50JyBncm91cD0nI2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgQ2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YiBDYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBDYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcnkoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ViQ2F0ZWdvcnknIGdyb3VwPScjZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRTdWJDYXRlZ29yeSgpOwotCi19IC8vIEN1c3RvbUNhdGVnb3J5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcmFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlYzVjNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVsaXZlcmFibGUuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyYWJsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0RlbGl2ZXJhYmxlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcmFibGUgZXh0ZW5kcyBXb3JrUHJvZHVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlX0dyb3VwMygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdCgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWxpdmVyZWRXb3JrUHJvZHVjdCcgZ3JvdXA9JyNncm91cDoyNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCk7Ci0KLX0gLy8gRGVsaXZlcmFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyNTExNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNyBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyYWJsZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldEV4dGVybmFsRGVzY3JpcHRpb24gPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVsaXZlcmFibGVEZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVybmFsRGVzY3JpcHRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4dGVybmFsRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhY2thZ2luZyBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhY2thZ2luZ0d1aWRhbmNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQYWNrYWdpbmdHdWlkYW5jZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYWNrYWdpbmdHdWlkYW5jZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyeVByb2Nlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJ5UHJvY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1N2U0ZWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJ5UHJvY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyeVByb2Nlc3MuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuCi0gKiBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsIDxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEVkdWNhdGlvbk1hdGVyaWFsIDxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWxpdmVyeVByb2Nlc3MnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZWxpdmVyeVByb2Nlc3MgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzX0dyb3VwMygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjQyJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb21tdW5pY2F0aW9uc01hdGVyaWFsJyBncm91cD0nI2dyb3VwOjQyJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWR1Y2F0aW9uIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbCgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFZHVjYXRpb25NYXRlcmlhbCcgZ3JvdXA9JyNncm91cDo0MiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVkdWNhdGlvbk1hdGVyaWFsKCk7Ci0KLX0gLy8gRGVsaXZlcnlQcm9jZXNzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1MGZiMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBQcm9jZXNzIERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gZXh0ZW5kcyBQcm9jZXNzRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2FsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NjYWxlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNjYWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NhbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBDaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogT3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmlzayBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Umlza0xldmVsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jpc2tMZXZlbCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSaXNrTGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmlzayBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Umlza0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSaXNrTGV2ZWwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXN0aW1hdGluZ1RlY2huaXF1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGluZ1RlY2huaXF1ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVzdGltYXRpbmdUZWNobmlxdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJvamVjdE1lbWJlckV4cGVydGlzZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBPZiBDb250cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29JJ20gY2hhSSdtIG50cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGVPZkNvbnRyYWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVHlwZU9mQ29udHJhY3QnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFR5cGVPZkNvbnRyYWN0IDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZU9mQ29udHJhY3QoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rlc2NyaWJhYmxlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpYmFibGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5NWE0MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpYmFibGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmliYWJsZUVsZW1lbnQuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuCi0gKiBUaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZXNjcmliYWJsZUVsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmliYWJsZUVsZW1lbnQgZXh0ZW5kcyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlc2VudGF0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudERlc2NyaXB0aW9uIGdldFByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGF0aW9uKENvbnRlbnREZXNjcmlwdGlvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm9kZWljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vZGVpY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nbm9kZWljb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Tm9kZWljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXROb2RlaWNvbiA8ZW0+Tm9kZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vZGVpY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROb2RlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm9kZWljb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gInJ1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQiIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICJqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50IiB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICJBcmNoaXRlY3R1cmUgRG9jdW1lbnQiLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ncHJlc2VudGF0aW9uTmFtZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uTmFtZSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVzZW50YXRpb25OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2hhcGVpY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTaGFwZWljb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nc2hhcGVpY29uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNoYXBlaWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaGFwZWljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNoYXBlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2hhcGVpY29uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVzY3JpYmFibGVFbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNWM5N2JlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpcHRvci5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4KLSAqIERlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpcHRvcigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVzY3JpcHRvcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlc2NyaXB0b3IgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICN1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lzU3luY2hyb25pemVkV2l0aFNvdXJjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotfSAvLyBEZXNjcmlwdG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmlwdG9yRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWQ2OGRmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmlwdG9yRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVzY3JpcHRvci4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24jZ2V0UmVmaW5lZERlc2NyaXB0aW9uIDxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpcHRvckRlc2NyaXB0aW9uIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZpbmVkIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlZmluZWREZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWZpbmVkRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVmaW5lZERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVzY3JpcHRvckRlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGlzY2lwbGluZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGlzY2lwbGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTc4NDE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rpc2NpcGxpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERpc2NpcGxpbmUuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuCi0gKiBBIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRUYXNrIDxlbT5UYXNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFN1YkRpc2NpcGxpbmUgPGVtPlN1YiBEaXNjaXBsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFJlZmVyZW5jZVdvcmtmbG93IDxlbT5SZWZlcmVuY2UgV29ya2Zsb3c8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGlzY2lwbGluZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc2NpcGxpbmUgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX1Rhc2soKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFzaycgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YiBEaXNjaXBsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgRGlzY2lwbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBEaXNjaXBsaW5lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX1N1YkRpc2NpcGxpbmUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lIiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ViRGlzY2lwbGluZScgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFN1YkRpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBXb3JrZmxvdzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlIFdvcmtmbG93PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlIFdvcmtmbG93PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93KCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlZmVyZW5jZVdvcmtmbG93JyBncm91cD0nI2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmVmZXJlbmNlV29ya2Zsb3coKTsKLQotfSAvLyBEaXNjaXBsaW5lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGlzY2lwbGluZUdyb3VwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EaXNjaXBsaW5lR3JvdXBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTgxYmUzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EaXNjaXBsaW5lR3JvdXBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGlzY2lwbGluZUdyb3VwaW5nLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzY2lwbGluZSBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgIlNvZnR3YXJlIERpc2NpcGxpbmVzIiB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICJSZXF1aXJlbWVudHMgTWFuYWdlbWVudCIgb3IgIlRlc3RpbmciOyAiSVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCIgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAiSVQgT3BlcmF0aW9uYWwgU2VydmljZXMiLCAiSVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyIsIG9yICJJVCBFbmFibGluZyBTZXJ2aWNlcyIuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0RGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Rpc2NpcGxpbmVHcm91cGluZycga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc2NpcGxpbmVHcm91cGluZyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNjaXBsaW5lPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzY2lwbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmUoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGlzY2lwbGluZScgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERpc2NpcGxpbmUoKTsKLQotfSAvLyBEaXNjaXBsaW5lR3JvdXBpbmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Eb2N1bWVudFJvb3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RvY3VtZW50Um9vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MzFhMTg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RvY3VtZW50Um9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9jdW1lbnRSb290LmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvY3VtZW50IFJvb3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZExpYnJhcnkgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvY3VtZW50Um9vdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nJyBraW5kPSdtaXhlZCciCi0gKiBAZXh0ZW5kcyBFRGF0YU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50Um9vdCBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X01peGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50V2lsZGNhcmQnIG5hbWU9JzptaXhlZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0TWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKQotCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIGtleVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlVHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3htbG5zOnByZWZpeCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIGtleVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlVHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3hzaTpzY2hlbWFMb2NhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X01ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdXBwZXI9Ii0yIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RDb25maWd1cmF0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIExpYnJhcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb2N1bWVudFJvb3RfTWV0aG9kTGlicmFyeSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB1cHBlcj0iLTIiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01ldGhvZExpYnJhcnknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RMaWJyYXJ5IGdldE1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RMaWJyYXJ5IDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1ldGhvZExpYnJhcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotCSAqIE1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotCSAqIFNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvY3VtZW50Um9vdF9NZXRob2RQbHVnaW4oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdXBwZXI9Ii0yIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RQbHVnaW4nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RQbHVnaW4gZ2V0TWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gdmFsdWUpOwotCi19IC8vIERvY3VtZW50Um9vdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RvbWFpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRG9tYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1NTc2NmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRG9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERvbWFpbi5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MDAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvbWFpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LgotICogRG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0U3ViZG9tYWluIDxlbT5TdWJkb21haW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9tYWluKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEb21haW4nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEb21haW4gZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb21haW5fR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvbWFpbl9Xb3JrUHJvZHVjdCgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrUHJvZHVjdCcgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWJkb21haW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViZG9tYWluPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViZG9tYWluPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb21haW5fU3ViZG9tYWluKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluIiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ViZG9tYWluJyBncm91cD0nI2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0U3ViZG9tYWluKCk7Ci0KLX0gLy8gRG9tYWluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YTk1YjdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRWxlbWVudC5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0VsZW1lbnQnIGtpbmQ9J2VtcHR5JyIKLSAqIEBleHRlbmRzIEVEYXRhT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWxlbWVudCBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLX0gLy8gRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Fc3RpbWF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYTNjN2QyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVzdGltYXRlLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBwcm92aWRlcyBzaXppbmcgbWVhc3VyZXMsIG9yIHN0YW5kYXJkcyBmb3Igc2l6aW5nIHRoZSB3b3JrIGVmZm9ydCBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIHBhcnRpY3VsYXIgcGllY2Ugb2Ygd29yayBhbmQgaW5zdHJ1Y3Rpb25zIGZvciB0aGVpciBzdWNjZXNzZnVsIHVzZS4gSXQgbWF5IGJlIGNvbXByaXNlZCBvZiBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb25zIGFuZCBlc3RpbWF0aW9uIG1ldHJpY3MuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25NZXRyaWMgPGVtPkVzdGltYXRpb24gTWV0cmljPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RXN0aW1hdGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0VzdGltYXRlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXN0aW1hdGUgZXh0ZW5kcyBHdWlkYW5jZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVzdGltYXRlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gTWV0cmljPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIE1ldHJpYzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gTWV0cmljPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uTWV0cmljKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRpb25NZXRyaWMnIGdyb3VwPScjZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFc3RpbWF0aW9uTWV0cmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRpb25Db25zaWRlcmF0aW9ucycgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi19IC8vIEVzdGltYXRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXN0aW1hdGluZ01ldHJpYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXN0aW1hdGluZ01ldHJpYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMDAwN2Y5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRpbmdNZXRyaWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGluZ01ldHJpYy5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGluZyBNZXRyaWM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVzdGltYXRpbmdNZXRyaWMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0VzdGltYXRpbmdNZXRyaWMnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFc3RpbWF0aW5nTWV0cmljIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBFc3RpbWF0aW5nTWV0cmljClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzVjMWFkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcXVhbGlmaWVzIHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0VzdGltYXRpb25Db25zaWRlcmF0aW9ucycga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXhhbXBsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMDQ2OTRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0V4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXhhbXBsZS5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RXhhbXBsZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXhhbXBsZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4YW1wbGUgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIEV4YW1wbGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkYW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvR3VpZGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmRmNjE5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkYW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBHdWlkYW5jZS5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBHdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRhbmNlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdHdWlkYW5jZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRhbmNlIGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotfSAvLyBHdWlkYW5jZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRhbmNlRGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRhbmNlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzZmMWUyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkYW5jZURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEd1aWRhbmNlRGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBHdWlkYW5jZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnQgPGVtPkF0dGFjaG1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nR3VpZGFuY2VEZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRhbmNlRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dGFjaG1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0YWNobWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0YWNobWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdHRhY2htZW50JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF0dGFjaG1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24jZ2V0QXR0YWNobWVudCA8ZW0+QXR0YWNobWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0YWNobWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0YWNobWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0YWNobWVudChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEd1aWRhbmNlRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkZWxpbmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRlbGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MTEwOWU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRlbGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBHdWlkZWxpbmUuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI3IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRHdWlkZWxpbmUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0d1aWRlbGluZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRlbGluZSBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gR3VpZGVsaW5lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvSXRlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9JdGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWUwZDBmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9JdGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogSXRlcmF0aW9uLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JdGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi0gKiBJdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLikKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEl0ZXJhdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSXRlcmF0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlcmF0aW9uIGV4dGVuZHMgQWN0aXZpdHkgewotfSAvLyBJdGVyYXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1YWYxMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRCYXNlQ29uZmlndXJhdGlvbiA8ZW0+QmFzZSBDb25maWd1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0UHJvY2Vzc1ZpZXcgPGVtPlByb2Nlc3MgVmlldzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNZXRob2RDb25maWd1cmF0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kQ29uZmlndXJhdGlvbiBleHRlbmRzIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBDb25maWd1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDb25maWd1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9uKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Jhc2VDb25maWd1cmF0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QmFzZUNvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RQbHVnaW5TZWxlY3Rpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kUGFja2FnZVNlbGVjdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmlldzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVmlldzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVmYXVsdFZpZXcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRWaWV3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRWaWV3KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVmlldzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdFZpZXcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRWaWV3KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzIFZpZXc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2Nlc3MgVmlldzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3MgVmlldzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlldygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9jZXNzVmlldyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFByb2Nlc3NWaWV3KCk7Ci0KLX0gLy8gTWV0aG9kQ29uZmlndXJhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2FmN2ZlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RFbGVtZW50LmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBEZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE93bmVkUnVsZSA8ZW0+T3duZWQgUnVsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRCcmllZkRlc2NyaXB0aW9uIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3JkZXJpbmdHdWlkZSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjaXNTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZEVsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RFbGVtZW50IGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9Hcm91cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSBwYWNrYWdpbmcgcnVsZXMgZm9yIHRoaXMgTWV0aG9kIEVsZW1lbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk93bmVkIFJ1bGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludCIgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J093bmVkUnVsZScgZ3JvdXA9JyNncm91cDoxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0T3duZWRSdWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJyaWVmRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdicmllZkRlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCcmllZkRlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9JZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lkJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPcmRlcmluZ0d1aWRlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nb3JkZXJpbmdHdWlkZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRPcmRlcmluZ0d1aWRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlcmluZyBHdWlkZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3JkZXJpbmdHdWlkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3JkZXJpbmdHdWlkZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlICJleHRlbmRzIiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcHJlc3NlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICN1bnNldFN1cHByZXNzZWQoKQotCSAqIEBzZWUgI3NldFN1cHByZXNzZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3N1cHByZXNzZWQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNpc1N1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3VwcHJlc3NlZCgpCi0JICogQHNlZSAjdW5zZXRTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICNpc1N1cHByZXNzZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1cHByZXNzZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjaXNTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFN1cHByZXNzZWQoKQotCSAqIEBzZWUgI2lzU3VwcHJlc3NlZCgpCi0JICogQHNlZSAjc2V0U3VwcHJlc3NlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2lzU3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcHJlc3NlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U3VwcHJlc3NlZCgpCi0JICogQHNlZSAjaXNTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICNzZXRTdXBwcmVzc2VkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTdXBwcmVzc2VkKCk7Ci0KLX0gLy8gTWV0aG9kRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZExpYnJhcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZExpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWQzYzQ1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZExpYnJhcnkuamF2YSx2IDEuMyAyMDA2LzA5LzA4IDAwOjU5OjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgTGlicmFyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldFRvb2wgPGVtPlRvb2w8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kTGlicmFyeSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTWV0aG9kTGlicmFyeScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZExpYnJhcnkgZXh0ZW5kcyBNZXRob2RVbml0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2lufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbigpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01ldGhvZFBsdWdpbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnlfTWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RDb25maWd1cmF0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG9vbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9vbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUb29sKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kTGlicmFyeV9Ub29sKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUb29sKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldFRvb2wgPGVtPlRvb2w8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRvb2w8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRvb2woU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNZXRob2RMaWJyYXJ5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjE4YzU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZFBhY2thZ2UuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlIDxlbT5SZXVzZWQgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNpc0dsb2JhbCA8ZW0+R2xvYmFsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZFBhY2thZ2UnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQYWNrYWdlIGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2VfR3JvdXAxKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6NyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmV1c2VkIFBhY2thZ2U8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXVzZWQgUGFja2FnZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JldXNlZFBhY2thZ2UnIGdyb3VwPScjZ3JvdXA6NyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFJldXNlZFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlX01ldGhvZFBhY2thZ2UoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kUGFja2FnZScgZ3JvdXA9JyNncm91cDo3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWV0aG9kUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBNZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HbG9iYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0R2xvYmFsKCkKLQkgKiBAc2VlICN1bnNldEdsb2JhbCgpCi0JICogQHNlZSAjc2V0R2xvYmFsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2dsb2JhbCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNHbG9iYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjaXNHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2xvYmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEdsb2JhbCgpCi0JICogQHNlZSAjdW5zZXRHbG9iYWwoKQotCSAqIEBzZWUgI2lzR2xvYmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHbG9iYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjaXNHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRHbG9iYWwoKQotCSAqIEBzZWUgI2lzR2xvYmFsKCkKLQkgKiBAc2VlICNzZXRHbG9iYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEdsb2JhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2lzR2xvYmFsIDxlbT5HbG9iYWw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdsb2JhbDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0R2xvYmFsKCkKLQkgKiBAc2VlICNpc0dsb2JhbCgpCi0JICogQHNlZSAjc2V0R2xvYmFsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRHbG9iYWwoKTsKLQotfSAvLyBNZXRob2RQYWNrYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTg0NTdkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZFBsdWdpbi5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotICogTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi0gKiBTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIDxlbT5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQbHVnaW4oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZFBsdWdpbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZFBsdWdpbiBleHRlbmRzIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQbHVnaW5fUmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZWZlcmVuY2VkTWV0aG9kUGx1Z2luJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01ldGhvZFBhY2thZ2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2VyIENoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI3Vuc2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI3NldFVzZXJDaGFuZ2VhYmxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd1c2VyQ2hhbmdlYWJsZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNVc2VyQ2hhbmdlYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAc2VlICN1bnNldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAc2VlICNpc1VzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVc2VyQ2hhbmdlYWJsZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjaXNVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjc2V0VXNlckNoYW5nZWFibGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFVzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNpc1VzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI2lzVXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI3NldFVzZXJDaGFuZ2VhYmxlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRVc2VyQ2hhbmdlYWJsZSgpOwotCi19IC8vIE1ldGhvZFBsdWdpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFVuaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjM1N2Y3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RVbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RVbml0LmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNyBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgVW5pdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZFVuaXQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RVbml0IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db3B5cmlnaHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3B5cmlnaHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0NvcHlyaWdodCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3B5cmlnaHQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29weXJpZ2h0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3B5cmlnaHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29weXJpZ2h0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhvcnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0F1dGhvcnMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdhdXRob3JzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF1dGhvcnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdjaGFuZ2VEYXRlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldENoYW5nZURhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdjaGFuZ2VEZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X1ZlcnNpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2ZXJzaW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1ldGhvZFVuaXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NaWxlc3RvbmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01pbGVzdG9uZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZDU1Nzg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01pbGVzdG9uZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNaWxlc3RvbmUuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1pbGVzdG9uZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTWlsZXN0b25lJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWlsZXN0b25lIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotfSAvLyBNaWxlc3RvbmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9OYW1lZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL05hbWVkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZWY0YTQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL05hbWVkRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBOYW1lZEVsZW1lbnQuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVkIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE5hbWVkRWxlbWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTmFtZWRFbGVtZW50JyBraW5kPSdlbXB0eSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWRFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TmFtZWRFbGVtZW50X05hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSduYW1lJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTmFtZWRFbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvT3V0Y29tZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvT3V0Y29tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTJhZTAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL091dGNvbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogT3V0Y29tZS5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0Y29tZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgV29yayBQcm9kdWN0IHRoYXQgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE91dGNvbWUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J091dGNvbWUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBPdXRjb21lIGV4dGVuZHMgV29ya1Byb2R1Y3QgewotfSAvLyBPdXRjb21lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUGFja2FnZWFibGVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QYWNrYWdlYWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTNhODA5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QYWNrYWdlYWJsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUGFja2FnZWFibGVFbGVtZW50LmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UGFja2FnZWFibGVFbGVtZW50KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQYWNrYWdlYWJsZUVsZW1lbnQnIGtpbmQ9J2VtcHR5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQYWNrYWdlYWJsZUVsZW1lbnQgZXh0ZW5kcyBOYW1lZEVsZW1lbnQgewotfSAvLyBQYWNrYWdlYWJsZUVsZW1lbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QaGFzZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUGhhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmU5MDkwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QaGFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQaGFzZS5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGhhc2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi0gKiBQaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFBoYXNlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQaGFzZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBoYXNlIGV4dGVuZHMgQWN0aXZpdHkgewotfSAvLyBQaGFzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1BsYW5uaW5nRGF0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUGxhbm5pbmdEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxYzk0N2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUGxhbm5pbmdEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQbGFubmluZ0RhdGEuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI3IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFByb2Nlc3MgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4KLSAqIFBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4KLSAqIChOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQbGFubmluZ0RhdGEoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1BsYW5uaW5nRGF0YScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBsYW5uaW5nRGF0YSBleHRlbmRzIFByb2Nlc3NFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2ggRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2hEYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2ZpbmlzaERhdGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RmluaXNoRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmFuayhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YV9SYW5rKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ncmFuayciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSYW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFuazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmFuaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmFuayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnREYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nc3RhcnREYXRlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydERhdGUoT2JqZWN0IHZhbHVlKTsKLQotfSAvLyBQbGFubmluZ0RhdGEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QcmFjdGljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJhY3RpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2IzNWNiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QcmFjdGljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJhY3RpY2UuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmFjdGljZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAiTWFuYWdlIFJpc2tzIiwgIkNvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSIsICJBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50IiwgZXRjLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRBY3Rpdml0eVJlZmVyZW5jZSA8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRDb250ZW50UmVmZXJlbmNlIDxlbT5Db250ZW50IFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0U3ViUHJhY3RpY2UgPGVtPlN1YiBQcmFjdGljZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJhY3RpY2UnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcmFjdGljZSBleHRlbmRzIEd1aWRhbmNlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdGl2aXR5UmVmZXJlbmNlJyBncm91cD0nI2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QWN0aXZpdHlSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRlbnQgUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250ZW50IFJlZmVyZW5jZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQgUmVmZXJlbmNlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbnRlbnRSZWZlcmVuY2UnIGdyb3VwPScjZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRDb250ZW50UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgUHJhY3RpY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgUHJhY3RpY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlX1N1YlByYWN0aWNlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdWJQcmFjdGljZScgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFN1YlByYWN0aWNlKCk7Ci0KLX0gLy8gUHJhY3RpY2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QcmFjdGljZURlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QcmFjdGljZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3OTc5ZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJhY3RpY2UgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByYWN0aWNlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QWRkaXRpb25hbEluZm8gPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QmFja2dyb3VuZCA8ZW0+QmFja2dyb3VuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscyA8ZW0+R29hbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0TGV2ZWxzT2ZBZG9wdGlvbiA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJhY3RpY2VEZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByYWN0aWNlRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWwgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWRkaXRpb25hbEluZm8oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FkZGl0aW9uYWxJbmZvJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFkZGl0aW9uYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFkZGl0aW9uYWxJbmZvIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWRkaXRpb25hbEluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFkZGl0aW9uYWxJbmZvKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBcHBsaWNhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXBwbGljYXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBsaWNhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFwcGxpY2F0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhY2tncm91bmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJhY2tncm91bmQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFja2dyb3VuZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRCYWNrZ3JvdW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEJhY2tncm91bmQgPGVtPkJhY2tncm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhY2tncm91bmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJhY2tncm91bmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJhY2tncm91bmQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdvYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R29hbHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEdvYWxzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdHb2FscyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRHb2FscygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscyA8ZW0+R29hbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdvYWxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHb2FscygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R29hbHMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogT3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZXZlbHNPZkFkb3B0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsc09mQWRvcHRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRMZXZlbHNPZkFkb3B0aW9uIDxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWxzT2ZBZG9wdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvYmxlbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9ibGVtPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm9ibGVtKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Byb2JsZW0nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvYmxlbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRQcm9ibGVtIDxlbT5Qcm9ibGVtPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9ibGVtPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcm9ibGVtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm9ibGVtKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJhY3RpY2VEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTVhNzEwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3MuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotICogQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0SW5jbHVkZXNQYXR0ZXJuIDxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0VmFsaWRDb250ZXh0IDxlbT5WYWxpZCBDb250ZXh0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3MoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2Nlc3MnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzIGV4dGVuZHMgQWN0aXZpdHkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluY2x1ZGVzIFBhdHRlcm48L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybigpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbmNsdWRlc1BhdHRlcm4nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRJbmNsdWRlc1BhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVmYXVsdENvbnRleHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRDb250ZXh0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRDb250ZXh0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWxpZCBDb250ZXh0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWQgQ29udGV4dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsaWRDb250ZXh0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VmFsaWRDb250ZXh0KCk7Ci0KLX0gLy8gUHJvY2VzcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NDb21wb25lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTlkZDU0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzQ29tcG9uZW50LmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4KLSAqIFVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAiYmxhY2sgYm94Ii4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgInJlYWxpemF0aW9uIiBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRJbnRlcmZhY2UgPGVtPkludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2Nlc3NDb21wb25lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzQ29tcG9uZW50IGV4dGVuZHMgUHJvY2Vzc1BhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvcHlyaWdodDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29weXJpZ2h0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9Db3B5cmlnaHQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29weXJpZ2h0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvcHlyaWdodCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvcHlyaWdodChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJmYWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmZhY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2UoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW50ZXJmYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBnZXRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0SW50ZXJmYWNlIDxlbT5JbnRlcmZhY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkludGVyZmFjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9jZXNzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBnZXRQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhvcnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X0F1dGhvcnMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdhdXRob3JzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF1dGhvcnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdjaGFuZ2VEYXRlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldENoYW5nZURhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdjaGFuZ2VEZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X1ZlcnNpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2ZXJzaW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIFByb2Nlc3NDb21wb25lbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjMzg5YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQ29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZVNwZWNpZmljYXRpb24gPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZUlPIDxlbT5JbnRlcmZhY2UgSU88L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9Hcm91cDEoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxOSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW50ZXJmYWNlU3BlY2lmaWNhdGlvbicgZ3JvdXA9JyNncm91cDoxOSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEludGVyZmFjZVNwZWNpZmljYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyZmFjZSBJTzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgSU88L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgSU88L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbnRlcmZhY2VJTycgZ3JvdXA9JyNncm91cDoxOSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEludGVyZmFjZUlPKCk7Ci0KLX0gLy8gUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFhZmNkYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzRGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIEFjdGl2aXR5IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcm9jZXNzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQgPGVtPkV4dGVybmFsIElkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc0Rlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0Rlc2NyaXB0aW9uIGV4dGVuZHMgQWN0aXZpdHlEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY29wZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NvcGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU2NvcGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2NvcGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjb3BlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NvcGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXNhZ2VOb3RlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VzYWdlTm90ZXMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VXNhZ2VOb3RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXNhZ2VOb3RlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBkZWxpdmVyeSBwYXR0ZXJucyBhbmQgbW9kZWxzLiBJdCBpcyB1c2VkIGxpa2UgYSBzeW5vbnltLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NEZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nZXh0ZXJuYWxJZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeHRlcm5hbElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlcm5hbElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJvY2Vzc0Rlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk5MmZiMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc0VsZW1lbnQuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuCi0gKiBQcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc0VsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzRWxlbWVudCBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudCB7Ci19IC8vIFByb2Nlc3NFbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc1BhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhYmM0MGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc1BhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc1BhY2thZ2UuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LgotICogQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0UHJvY2Vzc0VsZW1lbnQgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc1BhY2thZ2UnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzUGFja2FnZSBleHRlbmRzIE1ldGhvZFBhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9jZXNzRWxlbWVudCcgZ3JvdXA9JyNncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFByb2Nlc3NFbGVtZW50KCk7Ci0KLX0gLy8gUHJvY2Vzc1BhY2thZ2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FiMjVmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MDAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLSAqIEEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSNnZXRCYXNlUHJvY2VzcyA8ZW0+QmFzZSBQcm9jZXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0dyb3VwMygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjQyJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgUHJvY2VzczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBQcm9jZXNzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9jZXNzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlUHJvY2VzcygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYXNlUHJvY2VzcycgZ3JvdXA9JyNncm91cDo0MiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEJhc2VQcm9jZXNzKCk7Ci0KLX0gLy8gUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9SZXBvcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NjJiMjAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JlcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXBvcnQuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJlcG9ydCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmVwb3J0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVwb3J0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBSZXBvcnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9SZXVzYWJsZUFzc2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9SZXVzYWJsZUFzc2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4MDFiYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUmV1c2FibGVBc3NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXVzYWJsZUFzc2V0LmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNyBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcKLSAqIGhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSZXVzYWJsZUFzc2V0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSZXVzYWJsZUFzc2V0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmV1c2FibGVBc3NldCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gUmV1c2FibGVBc3NldApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvYWRtYXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvYWRtYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTUzNjFiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2FkbWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvYWRtYXAuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2Ugd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4KLSAqIEFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvYWRtYXAoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvYWRtYXAnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2FkbWFwIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBSb2FkbWFwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmM3ZmU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZS5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MDAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAKLSAqIEEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZSNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlIGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3BvbnNpYmxlRm9yJyBncm91cD0nI2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmVzcG9uc2libGVGb3IoKTsKLQotfSAvLyBSb2xlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZURlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODBhODMxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUm9sZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUm9sZURlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZURlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBc3NpZ25tZW50QXBwcm9hY2hlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBc3NpZ25tZW50QXBwcm9hY2hlcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFzc2lnbm1lbnRBcHByb2FjaGVzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ta2lsbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIExpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2tpbGxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTa2lsbHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NraWxscyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTa2lsbHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2tpbGxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNraWxscyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3lub255bXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIExpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TeW5vbnltczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3lub255bXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3lub255bXMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3lub255bXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTeW5vbnltcyA8ZW0+U3lub255bXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN5bm9ueW1zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTeW5vbnltcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3lub255bXMoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBSb2xlRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzM3NjAzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlRGVzY3JpcHRvci5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUgPGVtPlJvbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0b3IoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGVEZXNjcmlwdG9yJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZURlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Um9sZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um9sZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3BvbnNpYmxlRm9yJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmVzcG9uc2libGVGb3IoKTsKLQotfSAvLyBSb2xlRGVzY3JpcHRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVTZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWU2ZWUzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVTZXQuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIE9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICJBbmFseXN0cyIgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICJCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QiLCAiU3lzdGVtIEFuYWx5c3QiLCBhcyB3ZWxsIGFzICJSZXF1aXJlbWVudHMgU3BlY2lmaWVyIiByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGVTZXQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlU2V0IGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldF9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldF9Sb2xlKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGUnIGdyb3VwPScjZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSb2xlKCk7Ci0KLX0gLy8gUm9sZVNldApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVTZXRHcm91cGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZVNldEdyb3VwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkOTE3OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZVNldEdyb3VwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVTZXRHcm91cGluZy5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MDAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgU2V0IEdyb3VwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUm9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nI2dldFJvbGVTZXQgPGVtPlJvbGUgU2V0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXRHcm91cGluZygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUm9sZVNldEdyb3VwaW5nJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZVNldEdyb3VwaW5nIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldEdyb3VwaW5nX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGUgU2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlIFNldDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGUgU2V0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldCgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSb2xlU2V0JyBncm91cD0nI2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Um9sZVNldCgpOwotCi19IC8vIFJvbGVTZXRHcm91cGluZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1NlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTI1MWIxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTZWN0aW9uLmphdmEsdiAxLjMgMjAwNi8wNi8zMCAwMDo0MDoxMSBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRTdWJTZWN0aW9uIDxlbT5TdWIgU2VjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25OYW1lIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nU2VjdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlY3Rpb24gZXh0ZW5kcyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgU2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIFNlY3Rpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFNlY3Rpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFN1YlNlY3Rpb24oU2VjdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9TdWJTZWN0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YlNlY3Rpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN0aW9uIGdldFN1YlNlY3Rpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbiA8ZW0+U3ViIFNlY3Rpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBTZWN0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTdWJTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdWJTZWN0aW9uKFNlY3Rpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVkZWNlc3NvcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fUHJlZGVjZXNzb3IoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlZGVjZXNzb3InIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlZGVjZXNzb3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWRlY2Vzc29yKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Rlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3Rpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VjdGlvbk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nc2VjdGlvbk5hbWUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZWN0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VjdGlvbk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Im5hIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlICNpc1NldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjdW5zZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fVmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0ibmEiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmFyaWFiaWxpdHlUeXBlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjaXNTZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotfSAvLyBTZWN0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvU3VwcG9ydGluZ01hdGVyaWFsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9TdXBwb3J0aW5nTWF0ZXJpYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWVkMTYzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9TdXBwb3J0aW5nTWF0ZXJpYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU3VwcG9ydGluZ01hdGVyaWFsLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdTdXBwb3J0aW5nTWF0ZXJpYWwnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTdXBwb3J0aW5nTWF0ZXJpYWwgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFN1cHBvcnRpbmdNYXRlcmlhbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2Q0ZmQ3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uCi0gKiBBIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAKLSAqIEEgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uIAotICogRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXZlbG9wIFVzZSBDYXNlIE1vZGVsIiBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICJtZXRob2QiIG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0UGVyZm9ybWVkQnkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldEVzdGltYXRlIDxlbT5Fc3RpbWF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFzaygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGFzaycga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2sgZXh0ZW5kcyBDb250ZW50RWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX1ByZWNvbmRpdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVjb25kaXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlY29uZGl0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBvc3Rjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX1Bvc3Rjb25kaXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUG9zdGNvbmRpdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBvc3Rjb25kaXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyZm9ybWVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGVyZm9ybWVkQnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX1BlcmZvcm1lZEJ5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BlcmZvcm1lZEJ5JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBlcmZvcm1lZEJ5IDxlbT5QZXJmb3JtZWQgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGVyZm9ybWVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBlcmZvcm1lZEJ5KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYW5kYXRvcnlJbnB1dCcgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1hbmRhdG9yeUlucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk91dHB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dHB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19PdXRwdXQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0cHV0JyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0T3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19PcHRpb25hbElucHV0KCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J09wdGlvbmFsSW5wdXQnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRPcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXN0aW1hdGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0ZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Fc3RpbWF0ZSgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFc3RpbWF0ZScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVzdGltYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3I8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Ub29sTWVudG9yKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Rvb2xNZW50b3InIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUb29sTWVudG9yKCk7Ci0KLX0gLy8gVGFzawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFza0Rlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzZDY0ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFza0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgVGFzay4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGFza0Rlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFza0Rlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FsdGVybmF0aXZlcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQdXJwb3NlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHVycG9zZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVycG9zZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFRhc2tEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UYXNrRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDM0YWI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrRGVzY3JpcHRvci5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MDAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi0gKiBBIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFzc2lzdGVkQnkgPGVtPkFzc2lzdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0IDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3B0aW9uYWxJbnB1dCA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTdGVwIDxlbT5TdGVwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUYXNrRGVzY3JpcHRvcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2tEZXNjcmlwdG9yIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFzayhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX1Rhc2soKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFzayciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUYXNrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRUYXNrIDxlbT5UYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYXNrKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBlcmZvcm1lZFByaW1hcmlseUJ5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVyZm9ybWVkUHJpbWFyaWx5QnknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWRkaXRpb25hbGx5UGVyZm9ybWVkQnknIGdyb3VwPScjZ3JvdXA6MjYnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXNzaXN0ZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFzc2lzdGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaXN0ZWQgQnk8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXNzaXN0ZWRCeScgZ3JvdXA9JyNncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEFzc2lzdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVybmFsSW5wdXQnIGdyb3VwPScjZ3JvdXA6MjYnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeHRlcm5hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWFuZGF0b3J5SW5wdXQnIGdyb3VwPScjZ3JvdXA6MjYnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRNYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3B0aW9uYWxJbnB1dCcgZ3JvdXA9JyNncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE9wdGlvbmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3V0cHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0cHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0cHV0JyBncm91cD0nI2dyb3VwOjI2JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0T3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGVwPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdGVwPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RlcDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGVwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0U3RlcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI3NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNTeW5jaHJvbml6ZWRXaXRoU291cmNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi19IC8vIFRhc2tEZXNjcmlwdG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVhbVByb2ZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1RlYW1Qcm9maWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxNDQ0ODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVhbVByb2ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRlYW1Qcm9maWxlLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVhbSBQcm9maWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLgotICogV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLgotICogSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0gPGVtPlN1cGVyIFRlYW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0gPGVtPlN1YiBUZWFtPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUZWFtUHJvZmlsZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlYW1Qcm9maWxlIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX0dyb3VwMSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjE5JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUZWFtUHJvZmlsZV9Sb2xlKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGUnIGdyb3VwPScjZ3JvdXA6MTknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBlciBUZWFtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBlciBUZWFtPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwZXIgVGVhbTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1cGVyVGVhbScgZ3JvdXA9JyNncm91cDoxOSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFN1cGVyVGVhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIFRlYW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YiBUZWFtPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFRlYW08L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX1N1YlRlYW0oKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ViVGVhbScgZ3JvdXA9JyNncm91cDoxOSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFN1YlRlYW0oKTsKLQotfSAvLyBUZWFtUHJvZmlsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1RlbXBsYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjN2IzYjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1RlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRlbXBsYXRlLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGVtcGxhdGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1RlbXBsYXRlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVtcGxhdGUgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFRlbXBsYXRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVybURlZmluaXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rlcm1EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyYWU3ZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVybURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGVybURlZmluaXRpb24uamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlcm0gRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGRlZmluZXMgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGVybURlZmluaXRpb25zIGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGVybURlZmluaXRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Rlcm1EZWZpbml0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVybURlZmluaXRpb24gZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFRlcm1EZWZpbml0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVG9vbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZTUxYWJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVG9vbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MDAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VG9vbCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVG9vbCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRvb2wgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUb29sX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUb29sX1Rvb2xNZW50b3IoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVG9vbE1lbnRvcicgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRvb2xNZW50b3IoKTsKLQotfSAvLyBUb29sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVG9vbE1lbnRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVG9vbE1lbnRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NDQxNmU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rvb2xNZW50b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVG9vbE1lbnRvci5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBICBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VG9vbE1lbnRvcigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVG9vbE1lbnRvcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRvb2xNZW50b3IgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFRvb2xNZW50b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9VbWFGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9VbWFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0M2VhOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVW1hRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVW1hRmFjdG9yeS5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVtYUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZpdHlEZXNjcmlwdGlvbiBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXJ0aWZhY3QgY3JlYXRlQXJ0aWZhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcnRpZmFjdERlc2NyaXB0aW9uIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCcmVha2Rvd25FbGVtZW50IGNyZWF0ZUJyZWFrZG93bkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDYXBhYmlsaXR5UGF0dGVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2hlY2tsaXN0IGNyZWF0ZUNoZWNrbGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbXBvc2l0ZVJvbGUgY3JlYXRlQ29tcG9zaXRlUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb25jZXB0IGNyZWF0ZUNvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29uc3RyYWludCBjcmVhdGVDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnRlbnRDYXRlZ29yeSBjcmVhdGVDb250ZW50Q2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgY3JlYXRlQ29udGVudENhdGVnb3J5UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50RWxlbWVudCBjcmVhdGVDb250ZW50RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUN1c3RvbUNhdGVnb3J5IGNyZWF0ZUN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcmFibGUgY3JlYXRlRGVsaXZlcmFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZWxpdmVyYWJsZURlc2NyaXB0aW9uIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcnlQcm9jZXNzIGNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXNjcmliYWJsZUVsZW1lbnQgY3JlYXRlRGVzY3JpYmFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlc2NyaXB0b3IgY3JlYXRlRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXNjcmlwdG9yRGVzY3JpcHRpb24gY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc2NpcGxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc2NpcGxpbmU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURpc2NpcGxpbmUgY3JlYXRlRGlzY2lwbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaXNjaXBsaW5lR3JvdXBpbmcgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvY3VtZW50Um9vdCBjcmVhdGVEb2N1bWVudFJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Eb21haW48L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvbWFpbiBjcmVhdGVEb21haW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWxlbWVudCBjcmVhdGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Fc3RpbWF0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXN0aW1hdGUgY3JlYXRlRXN0aW1hdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFc3RpbWF0aW5nTWV0cmljIGNyZWF0ZUVzdGltYXRpbmdNZXRyaWMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFeGFtcGxlIGNyZWF0ZUV4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRhbmNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHdWlkYW5jZSBjcmVhdGVHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUd1aWRhbmNlRGVzY3JpcHRpb24gY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3VpZGVsaW5lIGNyZWF0ZUd1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSXRlcmF0aW9uIGNyZWF0ZUl0ZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZEVsZW1lbnQgY3JlYXRlTWV0aG9kRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZExpYnJhcnkgY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZFBhY2thZ2UgY3JlYXRlTWV0aG9kUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBVbml0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kVW5pdCBjcmVhdGVNZXRob2RVbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU5hbWVkRWxlbWVudCBjcmVhdGVOYW1lZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0Y29tZSBjcmVhdGVPdXRjb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBhY2thZ2VhYmxlRWxlbWVudCBjcmVhdGVQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGhhc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQaGFzZSBjcmVhdGVQaGFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQbGFubmluZ0RhdGEgY3JlYXRlUGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJhY3RpY2UgY3JlYXRlUHJhY3RpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcmFjdGljZURlc2NyaXB0aW9uIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBjcmVhdGVQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0NvbXBvbmVudCBjcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0Rlc2NyaXB0aW9uIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0VsZW1lbnQgY3JlYXRlUHJvY2Vzc0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NQYWNrYWdlIGNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXBvcnQgY3JlYXRlUmVwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmV1c2FibGVBc3NldCBjcmVhdGVSZXVzYWJsZUFzc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvYWRtYXAgY3JlYXRlUm9hZG1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlIGNyZWF0ZVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZURlc2NyaXB0aW9uIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZURlc2NyaXB0b3IgY3JlYXRlUm9sZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlU2V0IGNyZWF0ZVJvbGVTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlU2V0R3JvdXBpbmcgY3JlYXRlUm9sZVNldEdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlY3Rpb24gY3JlYXRlU2VjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2sgY3JlYXRlVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrRGVzY3JpcHRpb24gY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrRGVzY3JpcHRvciBjcmVhdGVUYXNrRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVhbVByb2ZpbGUgY3JlYXRlVGVhbVByb2ZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUZW1wbGF0ZSBjcmVhdGVUZW1wbGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVybURlZmluaXRpb24gY3JlYXRlVGVybURlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVG9vbCBjcmVhdGVUb29sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVG9vbE1lbnRvciBjcmVhdGVUb29sTWVudG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdoaXRlcGFwZXIgY3JlYXRlV2hpdGVwYXBlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrQnJlYWtkb3duRWxlbWVudCBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya0RlZmluaXRpb24gY3JlYXRlV29ya0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya09yZGVyIGNyZWF0ZVdvcmtPcmRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3QgY3JlYXRlV29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0RGVzY3JpcHRpb24gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdFR5cGUgY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVtYVBhY2thZ2UgZ2V0VW1hUGFja2FnZSgpOwotCi19IC8vVW1hRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVW1hUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVW1hUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMjliNjk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1VtYVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNjA3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVW1hUGFja2FnZS5qYXZhLHYgMS42IDIwMDYvMDkvMDggMDA6NTk6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBVbWFQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gInVtYSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJ1bWEiOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVsZW1lbnRJbXBsIDxlbT5FbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVMRU1FTlQgPSAyODsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbCA8ZW0+TmFtZWQgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXROYW1lZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTkFNRURfRUxFTUVOVCA9IDQ0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FRF9FTEVNRU5UX19OQU1FID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5BTUVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEFDS0FHRUFCTEVfRUxFTUVOVCA9IDQ2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FID0gTkFNRURfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IE5BTUVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19OQU1FID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0dST1VQID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0lEID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsIDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fR1JPVVAgPSBNRVRIT0RfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1dORURfUlVMRSA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19JRCA9IE1FVEhPRF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NFbGVtZW50SW1wbCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0VsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UID0gNTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fR1JPVVAgPSBERVNDUklCQUJMRV9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX09XTkVEX1JVTEUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19JRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19OT0RFSUNPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fU0hBUEVJQ09OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUCA9IFBST0NFU1NfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEUgPSBQUk9DRVNTX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0lEID0gUFJPQ0VTU19FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEID0gUFJPQ0VTU19FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFkgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlQgPSA3NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFID0gQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCA8ZW0+QWN0aXZpdHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVklUWSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0dST1VQID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX09XTkVEX1JVTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19PUkRFUklOR19HVUlERSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fU1VQUFJFU1NFRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRBVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19OT0RFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1NIQVBFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QTEFOTklOR19EQVRBID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TVVBFUl9BQ1RJVklUWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfT1BUSU9OQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX1BMQU5ORUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVGSVggPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fR1JPVVAxID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFREVDRVNTT1IgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfRVZFTlRfRFJJVkVOID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfT05HT0lORyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19SRVBFQVRBQkxFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFQ09ORElUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BPU1RDT05ESVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0dST1VQMiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fQ0hFQ0tMSVNUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fQ09OQ0VQVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0VYQU1QTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0dVSURFTElORSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1JPQURNQVAgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1dISVRFUEFQRVIgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWN0aXZpdHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsIDxlbT5NZXRob2QgVW5pdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVCA9IDQyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fR1JPVVAgPSBNRVRIT0RfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX09XTkVEX1JVTEUgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19JRCA9IE1FVEhPRF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19BVVRIT1JTID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19WRVJTSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwgPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT04gPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRSA9IE1FVEhPRF9VTklUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19HUk9VUCA9IE1FVEhPRF9VTklUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0lEID0gTUVUSE9EX1VOSVRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIDxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT04gPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19HUk9VUCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT04gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fR1JPVVAgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fU0VDVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib3cgVG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fR1JPVVAgPSBERVNDUklCQUJMRV9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19JRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19HUk9VUDEgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1QgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVIgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCA8ZW0+V29yayBQcm9kdWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUID0gODA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19PV05FRF9SVUxFID0gQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fR1JPVVAxID0gQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVCA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fQ09OQ0VQVCA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0VYQU1QTEUgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0dVSURFTElORSA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19XSElURVBBUEVSID0gQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fR1JPVVAyID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0VTVElNQVRFID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fUkVQT1JUID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwgPGVtPkFydGlmYWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1QgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fTkFNRSA9IFdPUktfUFJPRFVDVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dST1VQID0gV09SS19QUk9EVUNUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fSUQgPSBXT1JLX1BST0RVQ1RfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1BSRVNFTlRBVElPTiA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX05PREVJQ09OID0gV09SS19QUk9EVUNUX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1NIQVBFSUNPTiA9IFdPUktfUFJPRFVDVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dST1VQMSA9IFdPUktfUFJPRFVDVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0NIRUNLTElTVCA9IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19DT05DRVBUID0gV09SS19QUk9EVUNUX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19FWEFNUExFID0gV09SS19QUk9EVUNUX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dVSURFTElORSA9IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fUkVVU0FCTEVfQVNTRVQgPSBXT1JLX1BST0RVQ1RfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19TVVBQT1JUSU5HX01BVEVSSUFMID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19XSElURVBBUEVSID0gV09SS19QUk9EVUNUX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fR1JPVVAyID0gV09SS19QUk9EVUNUX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19FU1RJTUFURSA9IFdPUktfUFJPRFVDVF9fRVNUSU1BVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fUkVQT1JUID0gV09SS19QUk9EVUNUX19SRVBPUlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19URU1QTEFURSA9IFdPUktfUFJPRFVDVF9fVEVNUExBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19UT09MX01FTlRPUiA9IFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fR1JPVVAzID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZCBBcnRpZmFjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcnRpZmFjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OID0gODE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fR1JPVVAgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU0VDVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCA8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT04gPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0dST1VQID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQVVUSE9SUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fVkVSU0lPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBPdXRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0ltcGwgPGVtPlByb2Nlc3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTUyA9IDUxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19OQU1FID0gQUNUSVZJVFlfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0dST1VQID0gQUNUSVZJVFlfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX09XTkVEX1JVTEUgPSBBQ1RJVklUWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSUQgPSBBQ1RJVklUWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fU1VQUFJFU1NFRCA9IEFDVElWSVRZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRVNFTlRBVElPTiA9IEFDVElWSVRZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19OT0RFSUNPTiA9IEFDVElWSVRZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1NIQVBFSUNPTiA9IEFDVElWSVRZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRSA9IEFDVElWSVRZX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QTEFOTklOR19EQVRBID0gQUNUSVZJVFlfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19TVVBFUl9BQ1RJVklUWSA9IEFDVElWSVRZX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBBQ1RJVklUWV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfT1BUSU9OQUwgPSBBQ1RJVklUWV9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX1BMQU5ORUQgPSBBQ1RJVklUWV9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVGSVggPSBBQ1RJVklUWV9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fR1JPVVAxID0gQUNUSVZJVFlfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFREVDRVNTT1IgPSBBQ1RJVklUWV9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfT05HT0lORyA9IEFDVElWSVRZX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19SRVBFQVRBQkxFID0gQUNUSVZJVFlfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFQ09ORElUSU9OID0gQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUE9TVENPTkRJVElPTiA9IEFDVElWSVRZX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fR1JPVVAyID0gQUNUSVZJVFlfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlQgPSBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19DSEVDS0xJU1QgPSBBQ1RJVklUWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0NPTkNFUFQgPSBBQ1RJVklUWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19FWEFNUExFID0gQUNUSVZJVFlfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19HVUlERUxJTkUgPSBBQ1RJVklUWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1JPQURNQVAgPSBBQ1RJVklUWV9fUk9BRE1BUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUkVVU0FCTEVfQVNTRVQgPSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTCA9IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1dISVRFUEFQRVIgPSBBQ1RJVklUWV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19FTkFDVEFCTEUgPSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1ZBUklBQklMSVRZX1RZUEUgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fREVGQVVMVF9DT05URVhUID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fVkFMSURfQ09OVEVYVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsIDxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNhcGFiaWxpdHlQYXR0ZXJuSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDYXBhYmlsaXR5UGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk4gPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX05BTUUgPSBQUk9DRVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0dST1VQID0gUFJPQ0VTU19fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19PV05FRF9SVUxFID0gUFJPQ0VTU19fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSUQgPSBQUk9DRVNTX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19TVVBQUkVTU0VEID0gUFJPQ0VTU19fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1NIQVBFSUNPTiA9IFBST0NFU1NfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QTEFOTklOR19EQVRBID0gUFJPQ0VTU19fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU1VQRVJfQUNUSVZJVFkgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfT1BUSU9OQUwgPSBQUk9DRVNTX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRUZJWCA9IFBST0NFU1NfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fR1JPVVAxID0gUFJPQ0VTU19fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19FVkVOVF9EUklWRU4gPSBQUk9DRVNTX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfT05HT0lORyA9IFBST0NFU1NfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVDT05ESVRJT04gPSBQUk9DRVNTX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUE9TVENPTkRJVElPTiA9IFBST0NFU1NfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0dST1VQMiA9IFBST0NFU1NfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19CUkVBS0RPV05fRUxFTUVOVCA9IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19DSEVDS0xJU1QgPSBQUk9DRVNTX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19DT05DRVBUID0gUFJPQ0VTU19fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0VYQU1QTEUgPSBQUk9DRVNTX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19HVUlERUxJTkUgPSBQUk9DRVNTX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19ST0FETUFQID0gUFJPQ0VTU19fUk9BRE1BUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19SRVVTQUJMRV9BU1NFVCA9IFBST0NFU1NfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU1VQUE9SVElOR19NQVRFUklBTCA9IFBST0NFU1NfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19XSElURVBBUEVSID0gUFJPQ0VTU19fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lTX0VOQUNUQUJMRSA9IFBST0NFU1NfX0lTX0VOQUNUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lOQ0xVREVTX1BBVFRFUk4gPSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fREVGQVVMVF9DT05URVhUID0gUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fVkFMSURfQ09OVEVYVCA9IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZUltcGwgPGVtPkd1aWRhbmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0UgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX09XTkVEX1JVTEUgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19HUk9VUDEgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19DSEVDS0xJU1QgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fQ09OQ0VQVCA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fRVhBTVBMRSA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19HVUlERUxJTkUgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fV0hJVEVQQVBFUiA9IENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkd1aWRhbmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ2hlY2tsaXN0SW1wbCA8ZW0+Q2hlY2tsaXN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DaGVja2xpc3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENoZWNrbGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDSEVDS0xJU1QgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpcHRvckltcGwgPGVtPkRlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUiA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0dST1VQID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX09XTkVEX1JVTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19OT0RFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1IgPSA2MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19OQU1FID0gREVTQ1JJUFRPUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19HUk9VUCA9IERFU0NSSVBUT1JfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fT1dORURfUlVMRSA9IERFU0NSSVBUT1JfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0lEID0gREVTQ1JJUFRPUl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IERFU0NSSVBUT1JfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX05PREVJQ09OID0gREVTQ1JJUFRPUl9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19TSEFQRUlDT04gPSBERVNDUklQVE9SX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVTRU5URURfQUZURVIgPSBERVNDUklQVE9SX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRSA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQSA9IERFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRZID0gREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IERFU0NSSVBUT1JfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVGSVggPSBERVNDUklQVE9SX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUk9MRSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUiA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbXBvc2l0ZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEUgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fTkFNRSA9IFJPTEVfREVTQ1JJUFRPUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0dST1VQID0gUk9MRV9ERVNDUklQVE9SX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fT1dORURfUlVMRSA9IFJPTEVfREVTQ1JJUFRPUl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19CUklFRl9ERVNDUklQVElPTiA9IFJPTEVfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSUQgPSBST0xFX0RFU0NSSVBUT1JfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX09SREVSSU5HX0dVSURFID0gUk9MRV9ERVNDUklQVE9SX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NVUFBSRVNTRUQgPSBST0xFX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRBVElPTiA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX05PREVJQ09OID0gUk9MRV9ERVNDUklQVE9SX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QUkVTRU5UQVRJT05fTkFNRSA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NIQVBFSUNPTiA9IFJPTEVfREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QUkVTRU5URURfQUZURVIgPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRFRF9CRUZPUkUgPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QTEFOTklOR19EQVRBID0gUk9MRV9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NVUEVSX0FDVElWSVRZID0gUk9MRV9ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gUk9MRV9ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfT1BUSU9OQUwgPSBST0xFX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfUExBTk5FRCA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUFJFRklYID0gUk9MRV9ERVNDUklQVE9SX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUk9MRSA9IFJPTEVfREVTQ1JJUFRPUl9fUk9MRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19SRVNQT05TSUJMRV9GT1IgPSBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19HUk9VUDEgPSBST0xFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWdncmVnYXRlZCBSb2xlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFID0gUk9MRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX0ZFQVRVUkVfQ09VTlQgPSBST0xFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uY2VwdEltcGwgPGVtPkNvbmNlcHQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbmNlcHRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbmNlcHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVCA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db25jZXB0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnN0cmFpbnRJbXBsIDxlbT5Db25zdHJhaW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db25zdHJhaW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlNUUkFJTlQgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19HUk9VUCA9IE1FVEhPRF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19PV05FRF9SVUxFID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX0lEID0gTUVUSE9EX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5SW1wbCA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWSA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMSA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVCA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVIgPSBDT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19HUk9VUCA9IE1FVEhPRF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRSA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0lEID0gTUVUSE9EX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0dST1VQMSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCA8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRSA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUCA9IE1FVEhPRF9QQUNLQUdFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX09XTkVEX1JVTEUgPSBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0lEID0gTUVUSE9EX1BBQ0tBR0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9QQUNLQUdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19TVVBQUkVTU0VEID0gTUVUSE9EX1BBQ0tBR0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQMSA9IE1FVEhPRF9QQUNLQUdFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UgPSBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0UgPSBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HTE9CQUwgPSBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDIgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IENhdGVnb3J5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlkgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwgPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRSA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19HUk9VUCA9IE1FVEhPRF9QQUNLQUdFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX09XTkVEX1JVTEUgPSBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0lEID0gTUVUSE9EX1BBQ0tBR0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9QQUNLQUdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19TVVBQUkVTU0VEID0gTUVUSE9EX1BBQ0tBR0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0dST1VQMSA9IE1FVEhPRF9QQUNLQUdFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UgPSBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0UgPSBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19HTE9CQUwgPSBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19HUk9VUDIgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsIDxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDdXN0b21DYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUlkgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fT1dORURfUlVMRSA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWSA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwgPGVtPkRlbGl2ZXJhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEUgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX05BTUUgPSBXT1JLX1BST0RVQ1RfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HUk9VUCA9IFdPUktfUFJPRFVDVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX09XTkVEX1JVTEUgPSBXT1JLX1BST0RVQ1RfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0lEID0gV09SS19QUk9EVUNUX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19QUkVTRU5UQVRJT04gPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19OT0RFSUNPTiA9IFdPUktfUFJPRFVDVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HUk9VUDEgPSBXT1JLX1BST0RVQ1RfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19DSEVDS0xJU1QgPSBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQ09OQ0VQVCA9IFdPUktfUFJPRFVDVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRVhBTVBMRSA9IFdPUktfUFJPRFVDVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HVUlERUxJTkUgPSBXT1JLX1BST0RVQ1RfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1JFVVNBQkxFX0FTU0VUID0gV09SS19QUk9EVUNUX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IFdPUktfUFJPRFVDVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fV0hJVEVQQVBFUiA9IFdPUktfUFJPRFVDVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0dST1VQMiA9IFdPUktfUFJPRFVDVF9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRVNUSU1BVEUgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1JFUE9SVCA9IFdPUktfUFJPRFVDVF9fUkVQT1JUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVEVNUExBVEUgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVE9PTF9NRU5UT1IgPSBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0dST1VQMyA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTiA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0dST1VQID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQVVUSE9SUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fVkVSU0lPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdpbmcgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyeVByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTUyA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19OQU1FID0gUFJPQ0VTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fR1JPVVAgPSBQUk9DRVNTX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19PV05FRF9SVUxFID0gUFJPQ0VTU19fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JRCA9IFBST0NFU1NfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU1VQUFJFU1NFRCA9IFBST0NFU1NfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU0hBUEVJQ09OID0gUFJPQ0VTU19fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU1VQRVJfQUNUSVZJVFkgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19PUFRJT05BTCA9IFBST0NFU1NfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVGSVggPSBQUk9DRVNTX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19HUk9VUDEgPSBQUk9DRVNTX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOID0gUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19PTkdPSU5HID0gUFJPQ0VTU19fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFQ09ORElUSU9OID0gUFJPQ0VTU19fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QT1NUQ09ORElUSU9OID0gUFJPQ0VTU19fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dST1VQMiA9IFBST0NFU1NfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlQgPSBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0NIRUNLTElTVCA9IFBST0NFU1NfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19DT05DRVBUID0gUFJPQ0VTU19fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19FWEFNUExFID0gUFJPQ0VTU19fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dVSURFTElORSA9IFBST0NFU1NfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19ST0FETUFQID0gUFJPQ0VTU19fUk9BRE1BUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUkVVU0FCTEVfQVNTRVQgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMID0gUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19XSElURVBBUEVSID0gUFJPQ0VTU19fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19FTkFDVEFCTEUgPSBQUk9DRVNTX19JU19FTkFDVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JTkNMVURFU19QQVRURVJOID0gUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQgPSBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fVkFMSURfQ09OVEVYVCA9IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19HUk9VUDMgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWR1Y2F0aW9uIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUwgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsIDxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX05BTUUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fR1JPVVAgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19JRCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQVVUSE9SUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fVkVSU0lPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvdyBUbyBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY29wZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgTm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT04gPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fTkFNRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0dST1VQID0gUFJPQ0VTU19ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fSUQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQVVUSE9SUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVkVSU0lPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvdyBUbyBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFVSUE9TRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBPZiBDb250cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsIDxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fR1JPVVAgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQVVUSE9SUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fVkVSU0lPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZpbmVkIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwgPGVtPkRpc2NpcGxpbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORSA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fR1JPVVAgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19JRCA9IENPTlRFTlRfQ0FURUdPUllfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1RBU0sgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBEaXNjaXBsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORSA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFdvcmtmbG93PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1cgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX09XTkVEX1JVTEUgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDEgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fRVhBTVBMRSA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzY2lwbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORSA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1QgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fTUlYRUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIExpYnJhcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU4gPSA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9GRUFUVVJFX0NPVU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsIDxlbT5Eb21haW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvbWFpbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG9tYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPTUFJTiA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fSUQgPSBDT05URU5UX0NBVEVHT1JZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19DT05DRVBUID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0NBVEVHT1JZX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1dPUktfUFJPRFVDVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViZG9tYWluPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NVQkRPTUFJTiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RG9tYWluPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0ZUltcGwgPGVtPkVzdGltYXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXN0aW1hdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEUgPSAyOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0dST1VQMiA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gTWV0cmljPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fRVNUSU1BVElPTl9NRVRSSUMgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVzdGltYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW5nTWV0cmljSW1wbCA8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRpbmdNZXRyaWNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpbmdNZXRyaWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUMgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkV4YW1wbGVJbXBsIDxlbT5FeGFtcGxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FeGFtcGxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFeGFtcGxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYQU1QTEUgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0dST1VQID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fU0VDVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0YWNobWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkZWxpbmVJbXBsIDxlbT5HdWlkZWxpbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRlbGluZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGVsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdVSURFTElORSA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3VpZGVsaW5lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuSXRlcmF0aW9uSW1wbCA8ZW0+SXRlcmF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5JdGVyYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEl0ZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJVEVSQVRJT04gPSAzNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19OQU1FID0gQUNUSVZJVFlfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fR1JPVVAgPSBBQ1RJVklUWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19PV05FRF9SVUxFID0gQUNUSVZJVFlfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JRCA9IEFDVElWSVRZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU1VQUFJFU1NFRCA9IEFDVElWSVRZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFU0VOVEFUSU9OID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fTk9ERUlDT04gPSBBQ1RJVklUWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU0hBUEVJQ09OID0gQUNUSVZJVFlfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRFRF9BRlRFUiA9IEFDVElWSVRZX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFU0VOVEVEX0JFRk9SRSA9IEFDVElWSVRZX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BMQU5OSU5HX0RBVEEgPSBBQ1RJVklUWV9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU1VQRVJfQUNUSVZJVFkgPSBBQ1RJVklUWV9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBBQ1RJVklUWV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19PUFRJT05BTCA9IEFDVElWSVRZX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19QTEFOTkVEID0gQUNUSVZJVFlfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVGSVggPSBBQ1RJVklUWV9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19HUk9VUDEgPSBBQ1RJVklUWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRURFQ0VTU09SID0gQUNUSVZJVFlfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19PTkdPSU5HID0gQUNUSVZJVFlfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfUkVQRUFUQUJMRSA9IEFDVElWSVRZX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFQ09ORElUSU9OID0gQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QT1NUQ09ORElUSU9OID0gQUNUSVZJVFlfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0dST1VQMiA9IEFDVElWSVRZX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fQlJFQUtET1dOX0VMRU1FTlQgPSBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0NIRUNLTElTVCA9IEFDVElWSVRZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19DT05DRVBUID0gQUNUSVZJVFlfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19FWEFNUExFID0gQUNUSVZJVFlfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0dVSURFTElORSA9IEFDVElWSVRZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19ST0FETUFQID0gQUNUSVZJVFlfX1JPQURNQVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUkVVU0FCTEVfQVNTRVQgPSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19XSElURVBBUEVSID0gQUNUSVZJVFlfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19FTkFDVEFCTEUgPSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19WQVJJQUJJTElUWV9UWVBFID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SXRlcmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwgPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19HUk9VUCA9IE1FVEhPRF9VTklUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fT1dORURfUlVMRSA9IE1FVEhPRF9VTklUX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0lEID0gTUVUSE9EX1VOSVRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1VOSVRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9VTklUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DT1BZUklHSFQgPSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQVVUSE9SUyA9IE1FVEhPRF9VTklUX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NIQU5HRV9EQVRFID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fVkVSU0lPTiA9IE1FVEhPRF9VTklUX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZpZXc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBWaWV3PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsIDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWSA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTkFNRSA9IE1FVEhPRF9VTklUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fR1JPVVAgPSBNRVRIT0RfVU5JVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX09XTkVEX1JVTEUgPSBNRVRIT0RfVU5JVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19JRCA9IE1FVEhPRF9VTklUX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQ09QWVJJR0hUID0gTUVUSE9EX1VOSVRfX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0FVVEhPUlMgPSBNRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX1ZFUlNJT04gPSBNRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX0NPTkZJR1VSQVRJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX1RPT0wgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTiA9IDQxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0dST1VQID0gTUVUSE9EX1VOSVRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX09XTkVEX1JVTEUgPSBNRVRIT0RfVU5JVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fSUQgPSBNRVRIT0RfVU5JVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9VTklUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NPUFlSSUdIVCA9IE1FVEhPRF9VTklUX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0FVVEhPUlMgPSBNRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NIQU5HRV9EQVRFID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1ZFUlNJT04gPSBNRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1JFRkVSRU5DRURfTUVUSE9EX1BMVUdJTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZXIgQ2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWlsZXN0b25lSW1wbCA8ZW0+TWlsZXN0b25lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NaWxlc3RvbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1pbGVzdG9uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNSUxFU1RPTkUgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19HUk9VUCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fT1dORURfUlVMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX09SREVSSU5HX0dVSURFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fU1VQUFJFU1NFRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVTRU5UQVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX05PREVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19TSEFQRUlDT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVTRU5URURfQUZURVIgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUFJFU0VOVEVEX0JFRk9SRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUExBTk5JTkdfREFUQSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1NVUEVSX0FDVElWSVRZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX09QVElPTkFMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfUExBTk5FRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVGSVggPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0dST1VQMSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVERUNFU1NPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfRVZFTlRfRFJJVkVOID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX09OR09JTkcgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX1JFUEVBVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfRkVBVFVSRV9DT1VOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuT3V0Y29tZUltcGwgPGVtPk91dGNvbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk91dGNvbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE91dGNvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUQ09NRSA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19OQU1FID0gV09SS19QUk9EVUNUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19HUk9VUCA9IFdPUktfUFJPRFVDVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0lEID0gV09SS19QUk9EVUNUX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fU1VQUFJFU1NFRCA9IFdPUktfUFJPRFVDVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19QUkVTRU5UQVRJT04gPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX05PREVJQ09OID0gV09SS19QUk9EVUNUX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0dST1VQMSA9IFdPUktfUFJPRFVDVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fQ0hFQ0tMSVNUID0gV09SS19QUk9EVUNUX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fQ09OQ0VQVCA9IFdPUktfUFJPRFVDVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19FWEFNUExFID0gV09SS19QUk9EVUNUX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fR1VJREVMSU5FID0gV09SS19QUk9EVUNUX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1JFVVNBQkxFX0FTU0VUID0gV09SS19QUk9EVUNUX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19TVVBQT1JUSU5HX01BVEVSSUFMID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1dISVRFUEFQRVIgPSBXT1JLX1BST0RVQ1RfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19HUk9VUDIgPSBXT1JLX1BST0RVQ1RfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fRVNUSU1BVEUgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19SRVBPUlQgPSBXT1JLX1BST0RVQ1RfX1JFUE9SVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fVEVNUExBVEUgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19UT09MX01FTlRPUiA9IFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+T3V0Y29tZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGhhc2VJbXBsIDxlbT5QaGFzZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGhhc2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBoYXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBIQVNFID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19OQU1FID0gQUNUSVZJVFlfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19HUk9VUCA9IEFDVElWSVRZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fT1dORURfUlVMRSA9IEFDVElWSVRZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lEID0gQUNUSVZJVFlfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX09SREVSSU5HX0dVSURFID0gQUNUSVZJVFlfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fU1VQUFJFU1NFRCA9IEFDVElWSVRZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVTRU5UQVRJT04gPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX05PREVJQ09OID0gQUNUSVZJVFlfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19TSEFQRUlDT04gPSBBQ1RJVklUWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVTRU5URURfQUZURVIgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFU0VOVEVEX0JFRk9SRSA9IEFDVElWSVRZX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUExBTk5JTkdfREFUQSA9IEFDVElWSVRZX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1NVUEVSX0FDVElWSVRZID0gQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBBQ1RJVklUWV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX09QVElPTkFMID0gQUNUSVZJVFlfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfUExBTk5FRCA9IEFDVElWSVRZX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVGSVggPSBBQ1RJVklUWV9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0dST1VQMSA9IEFDVElWSVRZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVERUNFU1NPUiA9IEFDVElWSVRZX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX09OR09JTkcgPSBBQ1RJVklUWV9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX1JFUEVBVEFCTEUgPSBBQ1RJVklUWV9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFQ09ORElUSU9OID0gQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BPU1RDT05ESVRJT04gPSBBQ1RJVklUWV9fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19HUk9VUDIgPSBBQ1RJVklUWV9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQlJFQUtET1dOX0VMRU1FTlQgPSBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQ0hFQ0tMSVNUID0gQUNUSVZJVFlfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQ09OQ0VQVCA9IEFDVElWSVRZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19FWEFNUExFID0gQUNUSVZJVFlfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fR1VJREVMSU5FID0gQUNUSVZJVFlfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUk9BRE1BUCA9IEFDVElWSVRZX19ST0FETUFQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUkVVU0FCTEVfQVNTRVQgPSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fV0hJVEVQQVBFUiA9IEFDVElWSVRZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19FTkFDVEFCTEUgPSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fVkFSSUFCSUxJVFlfVFlQRSA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBoYXNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX0ZFQVRVUkVfQ09VTlQgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBID0gNDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0dST1VQID0gUFJPQ0VTU19FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19PV05FRF9SVUxFID0gUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fSUQgPSBQUk9DRVNTX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19TVVBQUkVTU0VEID0gUFJPQ0VTU19FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fTk9ERUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1NIQVBFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1JBTksgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VJbXBsIDxlbT5QcmFjdGljZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBSQUNUSUNFID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19HUk9VUDIgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0UgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IFJlZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIFByYWN0aWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU1VCX1BSQUNUSUNFID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJhY3RpY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTiA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HUk9VUCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWwgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk8gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdvYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbHMgT2YgQWRvcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ibGVtPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbCA8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFID0gNTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fTkFNRSA9IE1FVEhPRF9QQUNLQUdFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0dST1VQID0gTUVUSE9EX1BBQ0tBR0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fT1dORURfUlVMRSA9IE1FVEhPRF9QQUNLQUdFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fSUQgPSBNRVRIT0RfUEFDS0FHRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1NVUFBSRVNTRUQgPSBNRVRIT0RfUEFDS0FHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fR1JPVVAxID0gTUVUSE9EX1BBQ0tBR0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19SRVVTRURfUEFDS0FHRSA9IE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19NRVRIT0RfUEFDS0FHRSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0dMT0JBTCA9IE1FVEhPRF9QQUNLQUdFX19HTE9CQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0dST1VQMiA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlQgPSA1MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX05BTUUgPSBQUk9DRVNTX1BBQ0tBR0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HUk9VUCA9IFBST0NFU1NfUEFDS0FHRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX09XTkVEX1JVTEUgPSBQUk9DRVNTX1BBQ0tBR0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0lEID0gUFJPQ0VTU19QQUNLQUdFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfUEFDS0FHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19TVVBQUkVTU0VEID0gUFJPQ0VTU19QQUNLQUdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0dST1VQMSA9IFBST0NFU1NfUEFDS0FHRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUkVVU0VEX1BBQ0tBR0UgPSBQUk9DRVNTX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fTUVUSE9EX1BBQ0tBR0UgPSBQUk9DRVNTX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HTE9CQUwgPSBQUk9DRVNTX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HUk9VUDIgPSBQUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTX0VMRU1FTlQgPSBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUyA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURSA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTiA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fT1dORURfUlVMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BSRVNFTlRBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX05PREVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1NIQVBFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5URURfQUZURVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BSRVNFTlRFRF9CRUZPUkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QTEFOTklOR19EQVRBID0gQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1NVUEVSX0FDVElWSVRZID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSVNfT1BUSU9OQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSVNfUExBTk5FRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFRklYID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAxID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgSU88L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURSA9IDU3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19OQU1FID0gUFJPQ0VTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVAgPSBQUk9DRVNTX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19PV05FRF9SVUxFID0gUFJPQ0VTU19fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JRCA9IFBST0NFU1NfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU1VQUFJFU1NFRCA9IFBST0NFU1NfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU0hBUEVJQ09OID0gUFJPQ0VTU19fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU1VQRVJfQUNUSVZJVFkgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19PUFRJT05BTCA9IFBST0NFU1NfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVGSVggPSBQUk9DRVNTX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDEgPSBQUk9DRVNTX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfRVZFTlRfRFJJVkVOID0gUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19PTkdPSU5HID0gUFJPQ0VTU19fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFQ09ORElUSU9OID0gUFJPQ0VTU19fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QT1NUQ09ORElUSU9OID0gUFJPQ0VTU19fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQMiA9IFBST0NFU1NfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQlJFQUtET1dOX0VMRU1FTlQgPSBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0NIRUNLTElTVCA9IFBST0NFU1NfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19DT05DRVBUID0gUFJPQ0VTU19fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19FWEFNUExFID0gUFJPQ0VTU19fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dVSURFTElORSA9IFBST0NFU1NfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19ST0FETUFQID0gUFJPQ0VTU19fUk9BRE1BUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUkVVU0FCTEVfQVNTRVQgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19XSElURVBBUEVSID0gUFJPQ0VTU19fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19FTkFDVEFCTEUgPSBQUk9DRVNTX19JU19FTkFDVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JTkNMVURFU19QQVRURVJOID0gUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19ERUZBVUxUX0NPTlRFWFQgPSBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fVkFMSURfQ09OVEVYVCA9IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDMgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvY2VzczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmVwb3J0SW1wbCA8ZW0+UmVwb3J0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5SZXBvcnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVBPUlQgPSA1ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlcG9ydDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsIDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmV1c2FibGVBc3NldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVCA9IDU5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvYWRtYXBJbXBsIDxlbT5Sb2FkbWFwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2FkbWFwSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2FkbWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPQURNQVAgPSA2MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvYWRtYXA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZUltcGwgPGVtPlJvbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRSA9IDYxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0dST1VQMSA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fQ09OQ0VQVCA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19FWEFNUExFID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fR1VJREVMSU5FID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1dISVRFUEFQRVIgPSBDT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19HUk9VUDIgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19SRVNQT05TSUJMRV9GT1IgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTiA9IDYyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fR1JPVVAgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2tpbGxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fU0tJTExTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TeW5vbnltczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEltcGwgPGVtPlJvbGUgU2V0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfU0VUID0gNjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX09XTkVEX1JVTEUgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fSUQgPSBDT05URU5UX0NBVEVHT1JZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19HUk9VUDEgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19DT05DRVBUID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fRVhBTVBMRSA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0NBVEVHT1JZX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19ST0xFID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIFNldDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0R3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkcgPSA2NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fR1JPVVAgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fT1dORURfUlVMRSA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19JRCA9IENPTlRFTlRfQ0FURUdPUllfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZSBTZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwgPGVtPlNlY3Rpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VDVElPTiA9IDY2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0dST1VQID0gTUVUSE9EX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX09XTkVEX1JVTEUgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fSUQgPSBNRVRIT0RfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBTZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fU1VCX1NFQ1RJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1BSRURFQ0VTU09SID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1NFQ1RJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZWN0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUwgPSA2NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwgPGVtPlRhc2s8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFTSyA9IDY4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0dST1VQMSA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ0hFQ0tMSVNUID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OQ0VQVCA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FWEFNUExFID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fR1VJREVMSU5FID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1dISVRFUEFQRVIgPSBDT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFQ09ORElUSU9OID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QT1NUQ09ORElUSU9OID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BFUkZPUk1FRF9CWSA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0dST1VQMiA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX01BTkRBVE9SWV9JTlBVVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09VVFBVVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PUFRJT05BTF9JTlBVVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVNUSU1BVEUgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVE9PTF9NRU5UT1IgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2tEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OID0gNjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19HUk9VUCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fU0VDVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCA8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SID0gNzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fR1JPVVAgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09XTkVEX1JVTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19PUkRFUklOR19HVUlERSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19OT0RFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19PUFRJT05BTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX1BMQU5ORUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFRklYID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19HUk9VUDEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFREVDRVNTT1IgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX0VWRU5UX0RSSVZFTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19PTkdPSU5HID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19SRVBFQVRBQkxFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19UQVNLID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fR1JPVVAyID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2lzdGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19PVVRQVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0ZXA8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU1RFUCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwgPGVtPlRlYW0gUHJvZmlsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlYW1Qcm9maWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRSA9IDcxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19HUk9VUCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX09XTkVEX1JVTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19OT0RFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBFUl9BQ1RJVklUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRUZJWCA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0dST1VQMSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUk9MRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBUZWFtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NVQl9URUFNID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVtcGxhdGVJbXBsIDxlbT5UZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVtcGxhdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlbXBsYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRFTVBMQVRFID0gNzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZW1wbGF0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZXJtRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT04gPSA3MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xJbXBsIDxlbT5Ub29sPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Ub29sSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUb29sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRPT0wgPSA3NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fT1dORURfUlVMRSA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fSUQgPSBDT05URU5UX0NBVEVHT1JZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0NIRUNLTElTVCA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19DT05DRVBUID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0dVSURFTElORSA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0NBVEVHT1JZX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19XSElURVBBUEVSID0gQ09OVEVOVF9DQVRFR09SWV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fR1JPVVAyID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fVE9PTF9NRU5UT1IgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRvb2w8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Ub29sTWVudG9ySW1wbCA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRvb2xNZW50b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1IgPSA3NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbCA8ZW0+V2hpdGVwYXBlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV2hpdGVwYXBlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V2hpdGVwYXBlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXSElURVBBUEVSID0gNzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX05BTUUgPSBDT05DRVBUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19HUk9VUCA9IENPTkNFUFRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX09XTkVEX1JVTEUgPSBDT05DRVBUX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05DRVBUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0lEID0gQ09OQ0VQVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19PUkRFUklOR19HVUlERSA9IENPTkNFUFRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19TVVBQUkVTU0VEID0gQ09OQ0VQVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19QUkVTRU5UQVRJT04gPSBDT05DRVBUX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19OT0RFSUNPTiA9IENPTkNFUFRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05DRVBUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19TSEFQRUlDT04gPSBDT05DRVBUX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19HUk9VUDEgPSBDT05DRVBUX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19DSEVDS0xJU1QgPSBDT05DRVBUX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fQ09OQ0VQVCA9IENPTkNFUFRfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fRVhBTVBMRSA9IENPTkNFUFRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19HVUlERUxJTkUgPSBDT05DRVBUX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1JFVVNBQkxFX0FTU0VUID0gQ09OQ0VQVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTkNFUFRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fV0hJVEVQQVBFUiA9IENPTkNFUFRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05DRVBUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19WQVJJQUJJTElUWV9UWVBFID0gQ09OQ0VQVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfRkVBVFVSRV9DT1VOVCA9IENPTkNFUFRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT04gPSA3ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fR1JPVVAgPSBNRVRIT0RfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19PV05FRF9SVUxFID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19JRCA9IE1FVEhPRF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtPcmRlckltcGwgPGVtPldvcmsgT3JkZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtPcmRlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfT1JERVIgPSA3OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19MSU5LX1RZUEUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgT3JkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSA4MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX05BTUUgPSBERVNDUklQVE9SX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAgPSBERVNDUklQVE9SX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1dORURfUlVMRSA9IERFU0NSSVBUT1JfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JRCA9IERFU0NSSVBUT1JfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX05PREVJQ09OID0gREVTQ1JJUFRPUl9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVTRU5URURfQUZURVIgPSBERVNDUklQVE9SX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRZID0gREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IERFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JU19PUFRJT05BTCA9IERFU0NSSVBUT1JfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IERFU0NSSVBUT1JfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BSRUZJWCA9IERFU0NSSVBUT1JfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0ZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0czwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJhYmxlIFBhcnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFeGl0IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRSA9IDgzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0NIRUNLTElTVCA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0dVSURFTElORSA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19XSElURVBBUEVSID0gQ09OVEVOVF9DQVRFR09SWV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1QgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfVFlQRSA9IDg0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlIDxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX09SREVSX1RZUEUgPSA4NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX1RZUEVfT0JKRUNUID0gODY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPldvcmsgT3JkZXIgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlclR5cGVPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9UWVBFX09CSkVDVCA9IDg3OwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSA8ZW0+QWN0aXZpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWN0aXZpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9QcmVjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfUG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50IDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRDaGVja2xpc3QoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9DaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRDb25jZXB0IDxlbT5Db25jZXB0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0Q29uY2VwdCgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X0NvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0RXhhbXBsZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X0V4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0R3VpZGVsaW5lKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfR3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcCA8ZW0+Um9hZG1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFJvYWRtYXAoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Sb2FkbWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UmV1c2FibGVBc3NldCgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1JldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9TdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0V2hpdGVwYXBlcigpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1doaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgRW5hY3RhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X0lzRW5hY3RhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcygpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3dUb1N0YWZmIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ib3cgVG8gU3RhZmY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEhvd1RvU3RhZmYoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93VG9TdGFmZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0IDxlbT5BcnRpZmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0I2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdCNnZXRHcm91cDMoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdF9Hcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZWRBcnRpZmFjdCA8ZW0+Q29udGFpbmVkIEFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250YWluZWQgQXJ0aWZhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZWRBcnRpZmFjdCgpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uIDxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFydGlmYWN0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CcmllZiBPdXRsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cGVyQWN0aXZpdHkgPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3VwZXIgQWN0aXZpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cGVyQWN0aXZpdHkoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBPcHRpb25hbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNQbGFubmVkKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlZml4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVmaXgoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uI2dldFVzYWdlR3VpZGFuY2UgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2FwYWJpbGl0eVBhdHRlcm4gPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q2hlY2tsaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbXBvc2l0ZVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlI2dldEdyb3VwMSgpCi0JICogQHNlZSAjZ2V0Q29tcG9zaXRlUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29tcG9zaXRlUm9sZV9Hcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlI2dldEFnZ3JlZ2F0ZWRSb2xlIDxlbT5BZ2dyZWdhdGVkIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkFnZ3JlZ2F0ZWQgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0QWdncmVnYXRlZFJvbGUoKQotCSAqIEBzZWUgI2dldENvbXBvc2l0ZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQgPGVtPkNvbnN0cmFpbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludCNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludCNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldENvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnN0cmFpbnRfTWFpbkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnkgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlIDxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UjZ2V0Q29udGVudENhdGVnb3J5IDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSNnZXRDb250ZW50Q2F0ZWdvcnkoKQotCSAqIEBzZWUgI2dldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24gPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRLZXlDb25zaWRlcmF0aW9ucyA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRTZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldFNlY3Rpb24oKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldEdyb3VwMSgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRDaGVja2xpc3QoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRDb25jZXB0IDxlbT5Db25jZXB0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q29uY2VwdCgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0NvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0RXhhbXBsZSgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0V4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3VpZGVsaW5lKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0UmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0UmV1c2FibGVBc3NldCgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0V2hpdGVwYXBlcigpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1doaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldENvbnRlbnRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50UGFja2FnZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSNnZXRDb250ZW50RWxlbWVudCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQHNlZSAjZ2V0Q29udGVudFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSA8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDdXN0b21DYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDdXN0b21DYXRlZ29yeV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRDYXRlZ29yaXplZEVsZW1lbnQgPGVtPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRDYXRlZ29yaXplZEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRTdWJDYXRlZ29yeSA8ZW0+U3ViIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5TdWIgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRTdWJDYXRlZ29yeSgpCi0JICogQHNlZSAjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSA8ZW0+RGVsaXZlcmFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVsaXZlcmFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUjZ2V0R3JvdXAzKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVfR3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzIDxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJ5UHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEdyb3VwMygpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NfR3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWwgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEVkdWNhdGlvbk1hdGVyaWFsIDxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVkdWNhdGlvbiBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRFZHVjYXRpb25NYXRlcmlhbCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NhbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRSaXNrTGV2ZWwgPGVtPlJpc2sgTGV2ZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SaXNrIExldmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0Umlza0xldmVsKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEVzdGltYXRpbmdUZWNobmlxdWUgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRUeXBlT2ZDb250cmFjdCA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpYmFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0Tm9kZWljb24gPGVtPk5vZGVpY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm9kZWljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0Tm9kZWljb24oKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb25OYW1lIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2hhcGVpY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yIDxlbT5EZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2dldERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lIDxlbT5EaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc2NpcGxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc2NpcGxpbmVfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRUYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRUYXNrKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lX1Rhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFN1YkRpc2NpcGxpbmUgPGVtPlN1YiBEaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWIgRGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUjZ2V0U3ViRGlzY2lwbGluZSgpCi0JICogQHNlZSAjZ2V0RGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9TdWJEaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRSZWZlcmVuY2VXb3JrZmxvdyA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZWZlcmVuY2UgV29ya2Zsb3c8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFJlZmVyZW5jZVdvcmtmbG93KCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcgPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0RGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZyNnZXREaXNjaXBsaW5lKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RG9jdW1lbnRSb290KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWl4ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWl4ZWQoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RG9jdW1lbnRSb290X01peGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X01ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZExpYnJhcnkgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X01ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluIDxlbT5Eb21haW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREb21haW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RG9tYWluX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBzZWUgI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluI2dldFN1YmRvbWFpbiA8ZW0+U3ViZG9tYWluPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWJkb21haW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0U3ViZG9tYWluKCkKLQkgKiBAc2VlICNnZXREb21haW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvbWFpbl9TdWJkb21haW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlIDxlbT5Fc3RpbWF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Fc3RpbWF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFc3RpbWF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldEVzdGltYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFc3RpbWF0ZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRFc3RpbWF0aW9uTWV0cmljIDxlbT5Fc3RpbWF0aW9uIE1ldHJpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBNZXRyaWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRFc3RpbWF0aW9uTWV0cmljKCkKLQkgKiBAc2VlICNnZXRFc3RpbWF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbk1ldHJpYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0RXN0aW1hdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVzdGltYXRlX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYyA8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFc3RpbWF0aW5nTWV0cmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZSA8ZW0+R3VpZGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24gPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnQgPGVtPkF0dGFjaG1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdHRhY2htZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiNnZXRBdHRhY2htZW50KCkKLQkgKiBAc2VlICNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb24gPGVtPkl0ZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEl0ZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRCYXNlQ29uZmlndXJhdGlvbiA8ZW0+QmFzZSBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5CYXNlIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEJhc2VDb25maWd1cmF0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24gPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3KCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRQcm9jZXNzVmlldyA8ZW0+UHJvY2VzcyBWaWV3PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Qcm9jZXNzIFZpZXc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFByb2Nlc3NWaWV3KCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50IDxlbT5NZXRob2QgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRPd25lZFJ1bGUgPGVtPk93bmVkIFJ1bGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk93bmVkIFJ1bGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE93bmVkUnVsZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRCcmllZkRlc2NyaXB0aW9uIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0SWQoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRPcmRlcmluZ0d1aWRlIDxlbT5PcmRlcmluZyBHdWlkZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRPcmRlcmluZ0d1aWRlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNpc1N1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdXBwcmVzc2VkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNpc1N1cHByZXNzZWQoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZFBsdWdpbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0VG9vbCA8ZW0+VG9vbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvb2w8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldFRvb2woKQotCSAqIEBzZWUgI2dldE1ldGhvZExpYnJhcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZExpYnJhcnlfVG9vbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRHcm91cDEoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfR3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlIDxlbT5SZXVzZWQgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UmV1c2VkIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2dldFJldXNlZFBhY2thZ2UoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQYWNrYWdlX01ldGhvZFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNpc0dsb2JhbCA8ZW0+R2xvYmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2xvYmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNpc0dsb2JhbCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQbHVnaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbiA8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQbHVnaW5fUmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jaXNVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0IDxlbT5NZXRob2QgVW5pdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZFVuaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvcHlyaWdodDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0Q29weXJpZ2h0KCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NvcHlyaWdodCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRob3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRBdXRob3JzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0F1dGhvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TmFtZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudCNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXROYW1lZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE5hbWVkRWxlbWVudF9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5PdXRjb21lIDxlbT5PdXRjb21lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk91dGNvbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5PdXRjb21lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRjb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQgPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBhY2thZ2VhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGFja2FnZWFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QaGFzZSA8ZW0+UGhhc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGhhc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QaGFzZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGhhc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQbGFubmluZ0RhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0RmluaXNoRGF0ZSgpCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuaygpCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfUmFuaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRTdGFydERhdGUoKQotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UgPGVtPlByYWN0aWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByYWN0aWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldEFjdGl2aXR5UmVmZXJlbmNlIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkFjdGl2aXR5IFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldEFjdGl2aXR5UmVmZXJlbmNlKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRDb250ZW50UmVmZXJlbmNlIDxlbT5Db250ZW50IFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Q29udGVudCBSZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRDb250ZW50UmVmZXJlbmNlKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldFN1YlByYWN0aWNlIDxlbT5TdWIgUHJhY3RpY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YiBQcmFjdGljZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldFN1YlByYWN0aWNlKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24gPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFkZGl0aW9uYWxJbmZvIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BZGRpdGlvbmFsIEluZm88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFkZGl0aW9uYWxJbmZvKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXBwbGljYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QmFja2dyb3VuZCA8ZW0+QmFja2dyb3VuZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJhY2tncm91bmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEJhY2tncm91bmQoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdvYWxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscygpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0UHJvYmxlbSA8ZW0+UHJvYmxlbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2JsZW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0SW5jbHVkZXNQYXR0ZXJuIDxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXRJbmNsdWRlc1BhdHRlcm4oKQotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0RGVmYXVsdENvbnRleHQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldFZhbGlkQ29udGV4dCA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+VmFsaWQgQ29udGV4dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0VmFsaWRDb250ZXh0KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q29weXJpZ2h0IDxlbT5Db3B5cmlnaHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3B5cmlnaHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENvcHlyaWdodCgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9Db3B5cmlnaHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRJbnRlcmZhY2UgPGVtPkludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0SW50ZXJmYWNlKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Qcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0aG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0QXV0aG9ycygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9BdXRob3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DaGFuZ2UgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9WZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0R3JvdXAxKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0dyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbiA8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZUlPIDxlbT5JbnRlcmZhY2UgSU88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkludGVyZmFjZSBJTzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlSU8oKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiA8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjb3BlIDxlbT5TY29wZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNjb3BlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjb3BlKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0VXNhZ2VOb3RlcyA8ZW0+VXNhZ2UgTm90ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSA8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzUGFja2FnZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEdyb3VwMygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0dyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEJhc2VQcm9jZXNzIDxlbT5CYXNlIFByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkJhc2UgUHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEJhc2VQcm9jZXNzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZVByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXAgPGVtPlJvYWRtYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvYWRtYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVfUmVzcG9uc2libGVGb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNraWxsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3lub255bXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCA8ZW0+Um9sZSBTZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFJvbGVTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVTZXRfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRSb2xlKCkKLQkgKiBAc2VlICNnZXRSb2xlU2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlU2V0X1JvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVTZXRHcm91cGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0Um9sZVNldEdyb3VwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlU2V0R3JvdXBpbmdfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nI2dldFJvbGVTZXQgPGVtPlJvbGUgU2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyNnZXRSb2xlU2V0KCkKLQkgKiBAc2VlICNnZXRSb2xlU2V0R3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbiA8ZW0+U3ViIFNlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TdWIgU2VjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbigpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9TdWJTZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFByZWRlY2Vzc29yKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlY3Rpb24gTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3Rpb25fU2VjdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBlcmZvcm1lZEJ5IDxlbT5QZXJmb3JtZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJmb3JtZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBlcmZvcm1lZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE1hbmRhdG9yeUlucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+T3V0cHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRPdXRwdXQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfT3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0T3B0aW9uYWxJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19PcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0ZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Fc3RpbWF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRUb29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFRvb2xNZW50b3IoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfVG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2tEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2tEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0VGFzaygpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBc3Npc3RlZEJ5IDxlbT5Bc3Npc3RlZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QXNzaXN0ZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBc3Npc3RlZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEV4dGVybmFsSW5wdXQgPGVtPkV4dGVybmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEV4dGVybmFsSW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE9wdGlvbmFsSW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk91dHB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFN0ZXAgPGVtPlN0ZXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN0ZXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTdGVwKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlYW1Qcm9maWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldEdyb3VwMSgpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX0dyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRSb2xlKCkKLQkgKiBAc2VlICNnZXRUZWFtUHJvZmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGVhbVByb2ZpbGVfUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+U3VwZXIgVGVhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSgpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0gPGVtPlN1YiBUZWFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5TdWIgVGVhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0oKQotCSAqIEBzZWUgI2dldFRlYW1Qcm9maWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZSA8ZW0+VGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVybURlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlcm1EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sIDxlbT5Ub29sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRvb2w8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUb29sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRvb2xfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCNnZXRUb29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sI2dldFRvb2xNZW50b3IoKQotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRvb2xfVG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sTWVudG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUb29sTWVudG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXaGl0ZXBhcGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldEdyb3VwMSgpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRQcmVkZWNlc3NvcigpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIE9uZ29pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzT25nb2luZygpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzUmVwZWF0YWJsZSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFJlcGVhdGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24gPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFdvcmtEZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAc2VlICNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyIDxlbT5Xb3JrIE9yZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtPcmRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFdvcmtPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya09yZGVyX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGluayBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldExpbmtUeXBlKCkKLQkgKiBAc2VlICNnZXRXb3JrT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFdvcmtPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya09yZGVyX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0RXN0aW1hdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZXBvcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRSZXBvcnQoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9SZXBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRUZW1wbGF0ZSA8ZW0+VGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0VGVtcGxhdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFRvb2xNZW50b3IoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEltcGFjdE9mTm90SGF2aW5nIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRQdXJwb3NlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRXb3JrUHJvZHVjdCgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRHcm91cDEoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0dyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RlZEJ5IDxlbT5JbXBhY3RlZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SW1wYWN0ZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5JbXBhY3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdHMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RGVsaXZlcmFibGVQYXJ0cyA8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldERlbGl2ZXJhYmxlUGFydHMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0VHlwZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlIDxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFdvcmtPcmRlclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhcmlhYmlsaXR5VHlwZTpPYmplY3QnIGJhc2VUeXBlPSdWYXJpYWJpbGl0eVR5cGUnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFZhcmlhYmlsaXR5VHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUgPGVtPldvcmsgT3JkZXIgVHlwZSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPldvcmsgT3JkZXIgVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtPcmRlclR5cGU6T2JqZWN0JyBiYXNlVHlwZT0nV29ya09yZGVyVHlwZSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0V29ya09yZGVyVHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVW1hRmFjdG9yeSBnZXRVbWFGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCA8ZW0+QWN0aXZpdHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQUNUSVZJVFkgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19QUkVDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUHJlY29uZGl0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX1BPU1RDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUG9zdGNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19DSEVDS0xJU1QgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQ2hlY2tsaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fQ09OQ0VQVCA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Db25jZXB0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fRVhBTVBMRSA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9FeGFtcGxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19HVUlERUxJTkUgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfR3VpZGVsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fUk9BRE1BUCA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Sb2FkbWFwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X1JldXNhYmxlQXNzZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X1N1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX1dISVRFUEFQRVIgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfV2hpdGVwYXBlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Jc0VuYWN0YWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRSA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9WYXJpYWJpbGl0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwgPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBQ1RJVklUWV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ib3cgVG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93VG9TdGFmZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwgPGVtPkFydGlmYWN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFSVElGQUNUID0gZUlOU1RBTkNFLmdldEFydGlmYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSVElGQUNUX19HUk9VUDMgPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfR3JvdXAzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQgQXJ0aWZhY3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1QgPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwgPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBUlRJRkFDVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CcmllZiBPdXRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUgPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUyA9IGVJTlNUQU5DRS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEJSRUFLRE9XTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwgPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDYXBhYmlsaXR5UGF0dGVybigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDQVBBQklMSVRZX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ2hlY2tsaXN0SW1wbCA8ZW0+Q2hlY2tsaXN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DaGVja2xpc3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDaGVja2xpc3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ0hFQ0tMSVNUID0gZUlOU1RBTkNFLmdldENoZWNrbGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb21wb3NpdGVSb2xlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTVBPU0lURV9ST0xFID0gZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9TSVRFX1JPTEVfX0dST1VQMSA9IGVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlX0dyb3VwMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWdncmVnYXRlZCBSb2xlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFID0gZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uY2VwdEltcGwgPGVtPkNvbmNlcHQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbmNlcHRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb25jZXB0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTkNFUFQgPSBlSU5TVEFOQ0UuZ2V0Q29uY2VwdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db25zdHJhaW50SW1wbCA8ZW0+Q29uc3RyYWludDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uc3RyYWludEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnN0cmFpbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRDb25zdHJhaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRDb25zdHJhaW50X01haW5EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsIDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwgPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFID0gZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsIDxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsIDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEUgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORSA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUiA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9XaGl0ZXBhcGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbCA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRQYWNrYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRFTlRfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX1BBQ0tBR0VfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsIDxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ1VTVE9NX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENVU1RPTV9DQVRFR09SWV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcml6ZWQgRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwgPGVtPkRlbGl2ZXJhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJhYmxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJBQkxFID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJBQkxFX19HUk9VUDMgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfR3JvdXAzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVCA9IGVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJBQkxFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnaW5nIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRSA9IGVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERUxJVkVSWV9QUk9DRVNTID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX19HUk9VUDMgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzX0dyb3VwMygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FZHVjYXRpb24gTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTCA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlIE9mIENvbnRyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVCA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsIDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVTQ1JJQkFCTEVfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IGVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IGVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpcHRvckltcGwgPGVtPkRlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gZUlOU1RBTkNFLmdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERVNDUklQVE9SX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmaW5lZCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCA8ZW0+RGlzY2lwbGluZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElTQ0lQTElORSA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJU0NJUExJTkVfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElTQ0lQTElORV9fVEFTSyA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2soKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBEaXNjaXBsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORSA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1N1YkRpc2NpcGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBXb3JrZmxvdzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3coKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbCA8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJU0NJUExJTkVfR1JPVVBJTkcgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvY3VtZW50Um9vdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBET0NVTUVOVF9ST09UID0gZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERPQ1VNRU5UX1JPT1RfX01JWEVEID0gZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9NaXhlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVAgPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT04gPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X01ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBMaWJyYXJ5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlkgPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X01ldGhvZExpYnJhcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOID0gZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9NZXRob2RQbHVnaW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9tYWluSW1wbCA8ZW0+RG9tYWluPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREb21haW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRE9NQUlOID0gZUlOU1RBTkNFLmdldERvbWFpbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBET01BSU5fX0dST1VQMiA9IGVJTlNUQU5DRS5nZXREb21haW5fR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERPTUFJTl9fV09SS19QUk9EVUNUID0gZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViZG9tYWluPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET01BSU5fX1NVQkRPTUFJTiA9IGVJTlNUQU5DRS5nZXREb21haW5fU3ViZG9tYWluKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVsZW1lbnRJbXBsIDxlbT5FbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFTEVNRU5UID0gZUlOU1RBTkNFLmdldEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsIDxlbT5Fc3RpbWF0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFc3RpbWF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFU1RJTUFURSA9IGVJTlNUQU5DRS5nZXRFc3RpbWF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFU1RJTUFURV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldEVzdGltYXRlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBNZXRyaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQyA9IGVJTlNUQU5DRS5nZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uTWV0cmljKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRS5nZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGluZ01ldHJpY0ltcGwgPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW5nTWV0cmljSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXN0aW1hdGluZ01ldHJpYygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFU1RJTUFUSU5HX01FVFJJQyA9IGVJTlNUQU5DRS5nZXRFc3RpbWF0aW5nTWV0cmljKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FeGFtcGxlSW1wbCA8ZW0+RXhhbXBsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXhhbXBsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEV4YW1wbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVhBTVBMRSA9IGVJTlNUQU5DRS5nZXRFeGFtcGxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlSW1wbCA8ZW0+R3VpZGFuY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGFuY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1VJREFOQ0UgPSBlSU5TVEFOQ0UuZ2V0R3VpZGFuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHVUlEQU5DRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRhY2htZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQgPSBlSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRlbGluZUltcGwgPGVtPkd1aWRlbGluZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGVsaW5lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGVsaW5lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdVSURFTElORSA9IGVJTlNUQU5DRS5nZXRHdWlkZWxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuSXRlcmF0aW9uSW1wbCA8ZW0+SXRlcmF0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5JdGVyYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRJdGVyYXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSVRFUkFUSU9OID0gZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9DT05GSUdVUkFUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZpZXc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgVmlldzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVyA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsIDxlbT5NZXRob2QgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19HUk9VUCA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0dyb3VwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X093bmVkUnVsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19JRCA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kTGlicmFyeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfTElCUkFSWSA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfQ09ORklHVVJBVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfTElCUkFSWV9fVE9PTCA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5X1Rvb2woKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGFja2FnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QQUNLQUdFX19HUk9VUDEgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9Hcm91cDEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfTWV0aG9kUGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQbHVnaW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX1BMVUdJTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOID0gZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9SZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzZXIgQ2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwgPGVtPk1ldGhvZCBVbml0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kVW5pdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfVU5JVCA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQ29weXJpZ2h0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX0FVVEhPUlMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19DSEFOR0VfREFURSA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19WRVJTSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NaWxlc3RvbmVJbXBsIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1pbGVzdG9uZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNSUxFU1RPTkUgPSBlSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE5hbWVkRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBOQU1FRF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE5BTUVEX0VMRU1FTlRfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuT3V0Y29tZUltcGwgPGVtPk91dGNvbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk91dGNvbWVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRPdXRjb21lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE9VVENPTUUgPSBlSU5TVEFOQ0UuZ2V0T3V0Y29tZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsIDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUEFDS0FHRUFCTEVfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGhhc2VJbXBsIDxlbT5QaGFzZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGhhc2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQaGFzZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQSEFTRSA9IGVJTlNUQU5DRS5nZXRQaGFzZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQbGFubmluZ0RhdGEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUExBTk5JTkdfREFUQSA9IGVJTlNUQU5DRS5nZXRQbGFubmluZ0RhdGEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUgPSBlSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJhbms8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQTEFOTklOR19EQVRBX19SQU5LID0gZUlOU1RBTkNFLmdldFBsYW5uaW5nRGF0YV9SYW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSA9IGVJTlNUQU5DRS5nZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbCA8ZW0+UHJhY3RpY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJBQ1RJQ0UgPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IFJlZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudCBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBSQUNUSUNFX19TVUJfUFJBQ1RJQ0UgPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUkFDVElDRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdvYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04gPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9ibGVtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0gPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NJbXBsIDxlbT5Qcm9jZXNzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2VzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTID0gZUlOU1RBTkNFLmdldFByb2Nlc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX19WQUxJRF9DT05URVhUID0gZUlOU1RBTkNFLmdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19DT01QT05FTlQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50X0NvcHlyaWdodCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRfQXV0aG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEUgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50X1ZlcnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwgPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HUk9VUDEgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9Hcm91cDEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIElPPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NEZXNjcmlwdGlvbkltcGwgPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsIDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0VsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19FTEVNRU5UID0gZUlOU1RBTkNFLmdldFByb2Nlc3NFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbCA8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NQYWNrYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX1BBQ0tBR0VfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEUgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVAzID0gZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0dyb3VwMygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9jZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFX1BST0NFU1MgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZVByb2Nlc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmVwb3J0SW1wbCA8ZW0+UmVwb3J0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5SZXBvcnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZXBvcnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVQT1JUID0gZUlOU1RBTkNFLmdldFJlcG9ydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5SZXVzYWJsZUFzc2V0SW1wbCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZXVzYWJsZUFzc2V0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFVVNBQkxFX0FTU0VUID0gZUlOU1RBTkNFLmdldFJldXNhYmxlQXNzZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9hZG1hcEltcGwgPGVtPlJvYWRtYXA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvYWRtYXBJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2FkbWFwKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPQURNQVAgPSBlSU5TVEFOQ0UuZ2V0Um9hZG1hcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlSW1wbCA8ZW0+Um9sZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRSA9IGVJTlNUQU5DRS5nZXRSb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRSb2xlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX19SRVNQT05TSUJMRV9GT1IgPSBlSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsIDxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUyA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNraWxsczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TeW5vbnltczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwgPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX0RFU0NSSVBUT1JfX1JPTEUgPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUiA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0SW1wbCA8ZW0+Um9sZSBTZXQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfU0VUID0gZUlOU1RBTkNFLmdldFJvbGVTZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9TRVRfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0X0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9TRVRfX1JPTEUgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGwgPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0R3JvdXBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9TRVRfR1JPVVBJTkcgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfU0VUX0dST1VQSU5HX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZSBTZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVCA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCA8ZW0+U2VjdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlY3Rpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VDVElPTiA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgU2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1RJT05fX1NVQl9TRUNUSU9OID0gZUlOU1RBTkNFLmdldFNlY3Rpb25fU3ViU2VjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNUSU9OX19QUkVERUNFU1NPUiA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1RJT05fX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFNlY3Rpb25fRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1RJT05fX1NFQ1RJT05fTkFNRSA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFID0gZUlOU1RBTkNFLmdldFNlY3Rpb25fVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTVVBQT1JUSU5HX01BVEVSSUFMID0gZUlOU1RBTkNFLmdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCA8ZW0+VGFzazwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2soKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTSyA9IGVJTlNUQU5DRS5nZXRUYXNrKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX19QUkVDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0VGFza19QcmVjb25kaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX19QT1NUQ09ORElUSU9OID0gZUlOU1RBTkNFLmdldFRhc2tfUG9zdGNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fUEVSRk9STUVEX0JZID0gZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fR1JPVVAyID0gZUlOU1RBTkNFLmdldFRhc2tfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX01BTkRBVE9SWV9JTlBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX09VVFBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fT1BUSU9OQUxfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fRVNUSU1BVEUgPSBlSU5TVEFOQ0UuZ2V0VGFza19Fc3RpbWF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX1RPT0xfTUVOVE9SID0gZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTS19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwgPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUQVNLX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX1RBU0sgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXNzaXN0ZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlkgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX09VVFBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0ZXA8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfREVTQ1JJUFRPUl9fU1RFUCA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9TdGVwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVhbVByb2ZpbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEVBTV9QUk9GSUxFID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRFQU1fUFJPRklMRV9fR1JPVVAxID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX0dyb3VwMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEVBTV9QUk9GSUxFX19ST0xFID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1JvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBUZWFtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBURUFNX1BST0ZJTEVfX1NVQl9URUFNID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVtcGxhdGVJbXBsIDxlbT5UZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVtcGxhdGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZW1wbGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURU1QTEFURSA9IGVJTlNUQU5DRS5nZXRUZW1wbGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZXJtRGVmaW5pdGlvbkltcGwgPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZXJtRGVmaW5pdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURVJNX0RFRklOSVRJT04gPSBlSU5TVEFOQ0UuZ2V0VGVybURlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbEltcGwgPGVtPlRvb2w8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUb29sKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRPT0wgPSBlSU5TVEFOQ0UuZ2V0VG9vbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUT09MX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0VG9vbF9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUT09MX19UT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbE1lbnRvckltcGwgPGVtPlRvb2wgTWVudG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Ub29sTWVudG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbE1lbnRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRUb29sTWVudG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsIDxlbT5XaGl0ZXBhcGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V2hpdGVwYXBlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXSElURVBBUEVSID0gZUlOU1RBTkNFLmdldFdoaXRlcGFwZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfQlJFQUtET1dOX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4gPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcgPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSA9IGVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya0RlZmluaXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19ERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldFdvcmtEZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiA9IGVJTlNUQU5DRS5nZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsIDxlbT5Xb3JrIE9yZGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19PUkRFUiA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19PUkRFUl9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyX1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaW5rIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX09SREVSX19MSU5LX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyX0xpbmtUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfT1JERVJfX0lEID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1QgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19FU1RJTUFURSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfX1JFUE9SVCA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9SZXBvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19UT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9FeHRlcm5hbElkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAxID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Hcm91cDEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGFjdGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGFjdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyYWJsZSBQYXJ0czwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFeGl0IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9UWVBFX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFZBUklBQklMSVRZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlIDxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlclR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBXT1JLX09SREVSX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZhcmlhYmlsaXR5VHlwZU9iamVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBWQVJJQUJJTElUWV9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRWYXJpYWJpbGl0eVR5cGVPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPldvcmsgT3JkZXIgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXJUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFdPUktfT1JERVJfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyVHlwZU9iamVjdCgpOwotCi0JfQotCi19IC8vVW1hUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVmFyaWFiaWxpdHlUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9WYXJpYWJpbGl0eVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTc2Y2FkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9WYXJpYWJpbGl0eVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhcmlhYmlsaXR5VHlwZS5qYXZhLHYgMS4zIDIwMDcvMDMvMjggMTg6MjM6MTAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRWYXJpYWJpbGl0eVR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWYXJpYWJpbGl0eVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5hPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OYTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOQV9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9Im5hIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRyaWJ1dGVzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Db250cmlidXRlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05UUklCVVRFU19MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9ImNvbnRyaWJ1dGVzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRSSUJVVEVTID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZHM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkV4dGVuZHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhURU5EU19MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9ImV4dGVuZHMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhURU5EUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVQTEFDRVNfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJyZXBsYWNlcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBDb250cmlidXRpb248L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxvY2FsIENvbnRyaWJ1dGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9DT05UUklCVVRJT05fTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJsb2NhbENvbnRyaWJ1dGlvbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9DT05UUklCVVRJT04gPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxvY2FsIFJlcGxhY2VtZW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX1JFUExBQ0VNRU5UX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0ibG9jYWxSZXBsYWNlbWVudCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9SRVBMQUNFTUVOVCA9IDU7Ci0JCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kcyBSZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RXh0ZW5kcyBSZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTX1JFUExBQ0VTX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0iZXh0ZW5kc1JlcGxhY2VzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVEVORFNfUkVQTEFDRVMgPSA2OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TmE8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTkEKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBOQV9MSVRFUkFMID0gbmV3IFZhcmlhYmlsaXR5VHlwZShOQSwgIm5hIiwgIm5hIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250cmlidXRlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05UUklCVVRFUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIENPTlRSSUJVVEVTX0xJVEVSQUwgPSBuZXcgVmFyaWFiaWxpdHlUeXBlKENPTlRSSUJVVEVTLCAiY29udHJpYnV0ZXMiLCAiY29udHJpYnV0ZXMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhURU5EUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIEVYVEVORFNfTElURVJBTCA9IG5ldyBWYXJpYWJpbGl0eVR5cGUoRVhURU5EUywgImV4dGVuZHMiLCAiZXh0ZW5kcyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVQTEFDRVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBSRVBMQUNFU19MSVRFUkFMID0gbmV3IFZhcmlhYmlsaXR5VHlwZShSRVBMQUNFUywgInJlcGxhY2VzIiwgInJlcGxhY2VzIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBDb250cmlidXRpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfQ09OVFJJQlVUSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUwgPSBuZXcgVmFyaWFiaWxpdHlUeXBlKExPQ0FMX0NPTlRSSUJVVElPTiwgImxvY2FsQ29udHJpYnV0aW9uIiwgImxvY2FsQ29udHJpYnV0aW9uIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBSZXBsYWNlbWVudDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9SRVBMQUNFTUVOVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIExPQ0FMX1JFUExBQ0VNRU5UX0xJVEVSQUwgPSBuZXcgVmFyaWFiaWxpdHlUeXBlKExPQ0FMX1JFUExBQ0VNRU5ULCAibG9jYWxSZXBsYWNlbWVudCIsICJsb2NhbFJlcGxhY2VtZW50Iik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FeHRlbmRzIFJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVORFNfUkVQTEFDRVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBFWFRFTkRTX1JFUExBQ0VTX0xJVEVSQUwgPSBuZXcgVmFyaWFiaWxpdHlUeXBlKAotCQkJRVhURU5EU19SRVBMQUNFUywgImV4dGVuZHNSZXBsYWNlcyIsICJleHRlbmRzUmVwbGFjZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgVmFyaWFiaWxpdHlUeXBlW10gewotCQkJTkFfTElURVJBTCwKLQkJCUNPTlRSSUJVVEVTX0xJVEVSQUwsCi0JCQlFWFRFTkRTX0xJVEVSQUwsCi0JCQlSRVBMQUNFU19MSVRFUkFMLAotCQkJTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUwsCi0JCQlMT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMLAotCQkJRVhURU5EU19SRVBMQUNFU19MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBOQTogcmV0dXJuIE5BX0xJVEVSQUw7Ci0JCQljYXNlIENPTlRSSUJVVEVTOiByZXR1cm4gQ09OVFJJQlVURVNfTElURVJBTDsKLQkJCWNhc2UgRVhURU5EUzogcmV0dXJuIEVYVEVORFNfTElURVJBTDsKLQkJCWNhc2UgUkVQTEFDRVM6IHJldHVybiBSRVBMQUNFU19MSVRFUkFMOwotCQkJY2FzZSBMT0NBTF9DT05UUklCVVRJT046IHJldHVybiBMT0NBTF9DT05UUklCVVRJT05fTElURVJBTDsKLQkJCWNhc2UgTE9DQUxfUkVQTEFDRU1FTlQ6IHJldHVybiBMT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL1ZhcmlhYmlsaXR5VHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV2hpdGVwYXBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV2hpdGVwYXBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzA1Y2NmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1doaXRlcGFwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV2hpdGVwYXBlci5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXaGl0ZXBhcGVyKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXaGl0ZXBhcGVyJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2hpdGVwYXBlciBleHRlbmRzIENvbmNlcHQgewotfSAvLyBXaGl0ZXBhcGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya0JyZWFrZG93bkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtCcmVha2Rvd25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3ZGMzNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya0JyZWFrZG93bkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtCcmVha2Rvd25FbGVtZW50LmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBCcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc0V2ZW50RHJpdmVuIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNPbmdvaW5nIDxlbT5JcyBPbmdvaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzUmVwZWF0YWJsZSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya0JyZWFrZG93bkVsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrQnJlYWtkb3duRWxlbWVudCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Hcm91cDEoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxOSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcigpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciIgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZWRlY2Vzc29yJyBncm91cD0nI2dyb3VwOjE5JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UHJlZGVjZXNzb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFdmVudCBEcml2ZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjdW5zZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNzZXRJc0V2ZW50RHJpdmVuKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNFdmVudERyaXZlbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc0V2ZW50RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI3Vuc2V0SXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjaXNJc0V2ZW50RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0V2ZW50RHJpdmVuKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNpc0lzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI3NldElzRXZlbnREcml2ZW4oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzRXZlbnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc0V2ZW50RHJpdmVuIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjaXNJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNzZXRJc0V2ZW50RHJpdmVuKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc0V2ZW50RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT25nb2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc09uZ29pbmcoKQotCSAqIEBzZWUgI3Vuc2V0SXNPbmdvaW5nKCkKLQkgKiBAc2VlICNzZXRJc09uZ29pbmcoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lzT25nb2luZyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc09uZ29pbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNPbmdvaW5nIDxlbT5JcyBPbmdvaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBPbmdvaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzT25nb2luZygpCi0JICogQHNlZSAjdW5zZXRJc09uZ29pbmcoKQotCSAqIEBzZWUgI2lzSXNPbmdvaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc09uZ29pbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNPbmdvaW5nIDxlbT5JcyBPbmdvaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzT25nb2luZygpCi0JICogQHNlZSAjaXNJc09uZ29pbmcoKQotCSAqIEBzZWUgI3NldElzT25nb2luZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNPbmdvaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNPbmdvaW5nIDxlbT5JcyBPbmdvaW5nPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBPbmdvaW5nPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc09uZ29pbmcoKQotCSAqIEBzZWUgI2lzSXNPbmdvaW5nKCkKLQkgKiBAc2VlICNzZXRJc09uZ29pbmcoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzT25nb2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFJlcGVhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAc2VlICN1bnNldElzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjc2V0SXNSZXBlYXRhYmxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpc1JlcGVhdGFibGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNSZXBlYXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzUmVwZWF0YWJsZSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI3Vuc2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAc2VlICNpc0lzUmVwZWF0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNSZXBlYXRhYmxlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzUmVwZWF0YWJsZSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI2lzSXNSZXBlYXRhYmxlKCkKLQkgKiBAc2VlICNzZXRJc1JlcGVhdGFibGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzUmVwZWF0YWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzUmVwZWF0YWJsZSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAc2VlICNpc0lzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjc2V0SXNSZXBlYXRhYmxlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc1JlcGVhdGFibGUoKTsKLQotfSAvLyBXb3JrQnJlYWtkb3duRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtEZWZpbml0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOTNjZmE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtEZWZpbml0aW9uLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotICogV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtEZWZpbml0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrRGVmaW5pdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtEZWZpbml0aW9uIGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlY29uZGl0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZWNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVjb25kaXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UG9zdGNvbmRpdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUG9zdGNvbmRpdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQb3N0Y29uZGl0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gV29ya0RlZmluaXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrT3JkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtPcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZmNkZjgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtPcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya09yZGVyLmphdmEsdiAxLjMgMjAwNi8wOC8yNSAyMjo1OToxNCBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgT3JkZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBSZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAKLSAqIFRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrT3JkZXInIGtpbmQ9J3NpbXBsZSciCi0gKiBAZXh0ZW5kcyBFRGF0YU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtPcmRlciBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9JzowJyBraW5kPSdzaW1wbGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpbmsgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmaW5pc2hUb1N0YXJ0IjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAc2VlICNpc1NldExpbmtUeXBlKCkKLQkgKiBAc2VlICN1bnNldExpbmtUeXBlKCkKLQkgKiBAc2VlICNzZXRMaW5rVHlwZShXb3JrT3JkZXJUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXJfTGlua1R5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmaW5pc2hUb1N0YXJ0IiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2xpbmtUeXBlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya09yZGVyVHlwZSBnZXRMaW5rVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpbmsgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQHNlZSAjaXNTZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjdW5zZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpbmtUeXBlKFdvcmtPcmRlclR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBzZWUgI3NldExpbmtUeXBlKFdvcmtPcmRlclR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRMaW5rVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBzZWUgI3NldExpbmtUeXBlKFdvcmtPcmRlclR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMaW5rVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlcl9JZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXb3JrT3JkZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrT3JkZXJUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrT3JkZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljMjg4ZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya09yZGVyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya09yZGVyVHlwZS5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBSZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlclR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXb3JrT3JkZXJUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkZpbmlzaCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGSU5JU0hfVE9fU1RBUlRfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJmaW5pc2hUb1N0YXJ0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTklTSF9UT19TVEFSVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5GaW5pc2ggVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19GSU5JU0hfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJmaW5pc2hUb0ZpbmlzaCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5JU0hfVE9fRklOSVNIID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TdGFydCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFSVF9UT19TVEFSVF9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9InN0YXJ0VG9TdGFydCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9UT19TVEFSVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlN0YXJ0IFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFSVF9UT19GSU5JU0hfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJzdGFydFRvRmluaXNoIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RPX0ZJTklTSCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRklOSVNIX1RPX1NUQVJUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBXb3JrT3JkZXJUeXBlIEZJTklTSF9UT19TVEFSVF9MSVRFUkFMID0gbmV3IFdvcmtPcmRlclR5cGUoRklOSVNIX1RPX1NUQVJULCAiZmluaXNoVG9TdGFydCIsICJmaW5pc2hUb1N0YXJ0Iik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19GSU5JU0gKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdvcmtPcmRlclR5cGUgRklOSVNIX1RPX0ZJTklTSF9MSVRFUkFMID0gbmV3IFdvcmtPcmRlclR5cGUoRklOSVNIX1RPX0ZJTklTSCwgImZpbmlzaFRvRmluaXNoIiwgImZpbmlzaFRvRmluaXNoIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFSVF9UT19TVEFSVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgV29ya09yZGVyVHlwZSBTVEFSVF9UT19TVEFSVF9MSVRFUkFMID0gbmV3IFdvcmtPcmRlclR5cGUoU1RBUlRfVE9fU1RBUlQsICJzdGFydFRvU3RhcnQiLCAic3RhcnRUb1N0YXJ0Iik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBUlRfVE9fRklOSVNICi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBXb3JrT3JkZXJUeXBlIFNUQVJUX1RPX0ZJTklTSF9MSVRFUkFMID0gbmV3IFdvcmtPcmRlclR5cGUoU1RBUlRfVE9fRklOSVNILCAic3RhcnRUb0ZpbmlzaCIsICJzdGFydFRvRmluaXNoIik7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBXb3JrT3JkZXJUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFdvcmtPcmRlclR5cGVbXSB7Ci0JCQlGSU5JU0hfVE9fU1RBUlRfTElURVJBTCwKLQkJCUZJTklTSF9UT19GSU5JU0hfTElURVJBTCwKLQkJCVNUQVJUX1RPX1NUQVJUX0xJVEVSQUwsCi0JCQlTVEFSVF9UT19GSU5JU0hfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlclR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlXb3JrT3JkZXJUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVdvcmtPcmRlclR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlclR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIEZJTklTSF9UT19TVEFSVDogcmV0dXJuIEZJTklTSF9UT19TVEFSVF9MSVRFUkFMOwotCQkJY2FzZSBGSU5JU0hfVE9fRklOSVNIOiByZXR1cm4gRklOSVNIX1RPX0ZJTklTSF9MSVRFUkFMOwotCQkJY2FzZSBTVEFSVF9UT19TVEFSVDogcmV0dXJuIFNUQVJUX1RPX1NUQVJUX0xJVEVSQUw7Ci0JCQljYXNlIFNUQVJUX1RPX0ZJTklTSDogcmV0dXJuIFNUQVJUX1RPX0ZJTklTSF9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXb3JrT3JkZXJUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9Xb3JrT3JkZXJUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQ1MTcxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3QuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLSAqIEEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0UmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFRlbXBsYXRlIDxlbT5UZW1wbGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3QoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtQcm9kdWN0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3QgZXh0ZW5kcyBDb250ZW50RWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0X0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0ZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFc3RpbWF0ZScgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVzdGltYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRpb25Db25zaWRlcmF0aW9ucycgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBvcnQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBvcnQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0X1JlcG9ydCgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXBvcnQnIGdyb3VwPScjZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSZXBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW1wbGF0ZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBsYXRlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZSgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUZW1wbGF0ZScgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3I8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcigpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUb29sTWVudG9yJyBncm91cD0nI2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VG9vbE1lbnRvcigpOwotCi19IC8vIFdvcmtQcm9kdWN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjI3ZTA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgV29yayBQcm9kdWN0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0SW1wYWN0T2ZOb3RIYXZpbmcgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQgPGVtPkV4dGVybmFsIElkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtQcm9kdWN0RGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEltcGFjdE9mTm90SGF2aW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbXBhY3RPZk5vdEhhdmluZyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbXBhY3RPZk5vdEhhdmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbXBhY3RPZk5vdEhhdmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW1wYWN0T2ZOb3RIYXZpbmcoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1cnBvc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHVycG9zZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1cnBvc2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZWFzb25zRm9yTm90TmVlZGluZyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeHRlcm5hbElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nZXh0ZXJuYWxJZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeHRlcm5hbElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQgPGVtPkV4dGVybmFsIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZXJuYWxJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMTkyYmE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RGVsaXZlcmFibGVQYXJ0cyA8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUVudHJ5U3RhdGUgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrUHJvZHVjdERlc2NyaXB0b3InIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdERlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmtQcm9kdWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtQcm9kdWN0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya1Byb2R1Y3QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfR3JvdXAxKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjInIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW1wYWN0ZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkltcGFjdGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0ZWQgQnk8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ltcGFjdGVkQnknIGdyb3VwPScjZ3JvdXA6MjInIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRJbXBhY3RlZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBhY3RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbXBhY3RzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0czwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW1wYWN0cycgZ3JvdXA9JyNncm91cDoyMiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEltcGFjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlbGl2ZXJhYmxlIFBhcnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWxpdmVyYWJsZVBhcnRzJyBncm91cD0nI2dyb3VwOjIyJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVsaXZlcmFibGVQYXJ0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAKLQkgKiBGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3Rpdml0eUVudHJ5U3RhdGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nYWN0aXZpdHlFbnRyeVN0YXRlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFjdGl2aXR5RW50cnlTdGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdGl2aXR5RW50cnlTdGF0ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi0JICogRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3Rpdml0eUV4aXRTdGF0ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2FjdGl2aXR5RXhpdFN0YXRlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFjdGl2aXR5RXhpdFN0YXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3Rpdml0eUV4aXRTdGF0ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3RUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI3NmVlNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3RUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0VHlwZS5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MDAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICJDbGFzcyBEaWFncmFtIiwgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICJTcGVjaWZpY2F0aW9uIiwgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZSNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya1Byb2R1Y3RUeXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3RUeXBlIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RUeXBlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3QoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29ya1Byb2R1Y3QnIGdyb3VwPScjZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRXb3JrUHJvZHVjdCgpOwotCi19IC8vIFdvcmtQcm9kdWN0VHlwZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWNhZGM3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBY3Rpdml0eURlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCNnZXRIb3dUb1N0YWZmIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwjZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIEFjdGl2aXR5RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRlcm5hdGl2ZXMoKSA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMVEVSTkFUSVZFU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRlcm5hdGl2ZXMoKSA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWx0ZXJuYXRpdmVzID0gQUxURVJOQVRJVkVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhvd1RvU3RhZmYoKSA8ZW0+SG93IFRvIFN0YWZmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIb3dUb1N0YWZmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIT1dfVE9fU1RBRkZfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG93VG9TdGFmZigpIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvd1RvU3RhZmYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaG93VG9TdGFmZiA9IEhPV19UT19TVEFGRl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVUlBPU0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1cnBvc2UgPSBQVVJQT1NFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsdGVybmF0aXZlcygpIHsKLQkJcmV0dXJuIGFsdGVybmF0aXZlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nIG5ld0FsdGVybmF0aXZlcykgewotCQlTdHJpbmcgb2xkQWx0ZXJuYXRpdmVzID0gYWx0ZXJuYXRpdmVzOwotCQlhbHRlcm5hdGl2ZXMgPSBuZXdBbHRlcm5hdGl2ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUywgb2xkQWx0ZXJuYXRpdmVzLCBhbHRlcm5hdGl2ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhvd1RvU3RhZmYoKSB7Ci0JCXJldHVybiBob3dUb1N0YWZmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhvd1RvU3RhZmYoU3RyaW5nIG5ld0hvd1RvU3RhZmYpIHsKLQkJU3RyaW5nIG9sZEhvd1RvU3RhZmYgPSBob3dUb1N0YWZmOwotCQlob3dUb1N0YWZmID0gbmV3SG93VG9TdGFmZjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGLCBvbGRIb3dUb1N0YWZmLCBob3dUb1N0YWZmKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0UsIG9sZFB1cnBvc2UsIHB1cnBvc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlyZXR1cm4gZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjoKLQkJCQlyZXR1cm4gZ2V0SG93VG9TdGFmZigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXJldHVybiBnZXRQdXJwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXNldEFsdGVybmF0aXZlcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjoKLQkJCQlzZXRIb3dUb1N0YWZmKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlzZXRQdXJwb3NlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlzZXRBbHRlcm5hdGl2ZXMoQUxURVJOQVRJVkVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjoKLQkJCQlzZXRIb3dUb1N0YWZmKEhPV19UT19TVEFGRl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlyZXR1cm4gQUxURVJOQVRJVkVTX0VERUZBVUxUID09IG51bGwgPyBhbHRlcm5hdGl2ZXMgIT0gbnVsbCA6ICFBTFRFUk5BVElWRVNfRURFRkFVTFQuZXF1YWxzKGFsdGVybmF0aXZlcyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjoKLQkJCQlyZXR1cm4gSE9XX1RPX1NUQUZGX0VERUZBVUxUID09IG51bGwgPyBob3dUb1N0YWZmICE9IG51bGwgOiAhSE9XX1RPX1NUQUZGX0VERUZBVUxULmVxdWFscyhob3dUb1N0YWZmKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlyZXR1cm4gUFVSUE9TRV9FREVGQVVMVCA9PSBudWxsID8gcHVycG9zZSAhPSBudWxsIDogIVBVUlBPU0VfRURFRkFVTFQuZXF1YWxzKHB1cnBvc2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWx0ZXJuYXRpdmVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbHRlcm5hdGl2ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhvd1RvU3RhZmY6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGhvd1RvU3RhZmYpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1cnBvc2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHB1cnBvc2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BY3Rpdml0eURlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQWN0aXZpdHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FjdGl2aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3M2Y0ODBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQWN0aXZpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBY3Rpdml0eUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0QnJlYWtkb3duRWxlbWVudCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRDb25jZXB0IDxlbT5Db25jZXB0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0Um9hZG1hcCA8ZW0+Um9hZG1hcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0UmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0V2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUltcGwgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cyBBY3Rpdml0eSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFQ09ORElUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVjb25kaXRpb24gPSBQUkVDT05ESVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NUQ09ORElUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwb3N0Y29uZGl0aW9uID0gUE9TVENPTkRJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDIgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNFbmFjdGFibGUoKSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzRW5hY3RhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfRU5BQ1RBQkxFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzRW5hY3RhYmxlKCkgPGVtPklzIEVuYWN0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc0VuYWN0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFjdGFibGUgPSBJU19FTkFDVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIEVuYWN0YWJsZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFjdGFibGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUID0gVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFZhcmlhYmlsaXR5IFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhcmlhYmlsaXR5VHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihTdHJpbmcgbmV3UHJlY29uZGl0aW9uKSB7Ci0JCVN0cmluZyBvbGRQcmVjb25kaXRpb24gPSBwcmVjb25kaXRpb247Ci0JCXByZWNvbmRpdGlvbiA9IG5ld1ByZWNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OLCBvbGRQcmVjb25kaXRpb24sIHByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdGNvbmRpdGlvbihTdHJpbmcgbmV3UG9zdGNvbmRpdGlvbikgewotCQlTdHJpbmcgb2xkUG9zdGNvbmRpdGlvbiA9IHBvc3Rjb25kaXRpb247Ci0JCXBvc3Rjb25kaXRpb24gPSBuZXdQb3N0Y29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OLCBvbGRQb3N0Y29uZGl0aW9uLCBwb3N0Y29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRCcmVha2Rvd25FbGVtZW50KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q2hlY2tsaXN0KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0NIRUNLTElTVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbmNlcHQoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fQ09OQ0VQVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fRVhBTVBMRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEd1aWRlbGluZSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19HVUlERUxJTkUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSb2FkbWFwKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX1JPQURNQVApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZXVzYWJsZUFzc2V0KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRXaGl0ZXBhcGVyKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX1dISVRFUEFQRVIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNFbmFjdGFibGUoKSB7Ci0JCXJldHVybiBpc0VuYWN0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0VuYWN0YWJsZShib29sZWFuIG5ld0lzRW5hY3RhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkSXNFbmFjdGFibGUgPSBpc0VuYWN0YWJsZTsKLQkJaXNFbmFjdGFibGUgPSBuZXdJc0VuYWN0YWJsZTsKLQkJYm9vbGVhbiBvbGRJc0VuYWN0YWJsZUVTZXQgPSBpc0VuYWN0YWJsZUVTZXQ7Ci0JCWlzRW5hY3RhYmxlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSwgb2xkSXNFbmFjdGFibGUsIGlzRW5hY3RhYmxlLCAhb2xkSXNFbmFjdGFibGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc0VuYWN0YWJsZSgpIHsKLQkJYm9vbGVhbiBvbGRJc0VuYWN0YWJsZSA9IGlzRW5hY3RhYmxlOwotCQlib29sZWFuIG9sZElzRW5hY3RhYmxlRVNldCA9IGlzRW5hY3RhYmxlRVNldDsKLQkJaXNFbmFjdGFibGUgPSBJU19FTkFDVEFCTEVfRURFRkFVTFQ7Ci0JCWlzRW5hY3RhYmxlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSwgb2xkSXNFbmFjdGFibGUsIElTX0VOQUNUQUJMRV9FREVGQVVMVCwgb2xkSXNFbmFjdGFibGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0VuYWN0YWJsZSgpIHsKLQkJcmV0dXJuIGlzRW5hY3RhYmxlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nIG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJU3RyaW5nIG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgbmV3VmFyaWFiaWxpdHlUeXBlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSBvbGRWYXJpYWJpbGl0eVR5cGUgPSB2YXJpYWJpbGl0eVR5cGU7Ci0JCXZhcmlhYmlsaXR5VHlwZSA9IG5ld1ZhcmlhYmlsaXR5VHlwZSA9PSBudWxsID8gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA6IG5ld1ZhcmlhYmlsaXR5VHlwZTsKLQkJYm9vbGVhbiBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0ID0gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQkJdmFyaWFiaWxpdHlUeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEUsIG9sZFZhcmlhYmlsaXR5VHlwZSwgdmFyaWFiaWxpdHlUeXBlLCAhb2xkVmFyaWFiaWxpdHlUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQlib29sZWFuIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQgPSB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCQl2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCQl2YXJpYWJpbGl0eVR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRSwgb2xkVmFyaWFiaWxpdHlUeXBlLCBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxULCBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRCcmVha2Rvd25FbGVtZW50KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIGdldFByZWNvbmRpdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRCcmVha2Rvd25FbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0NIRUNLTElTVDoKLQkJCQlyZXR1cm4gZ2V0Q2hlY2tsaXN0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0NPTkNFUFQ6Ci0JCQkJcmV0dXJuIGdldENvbmNlcHQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fRVhBTVBMRToKLQkJCQlyZXR1cm4gZ2V0RXhhbXBsZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19HVUlERUxJTkU6Ci0JCQkJcmV0dXJuIGdldEd1aWRlbGluZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQOgotCQkJCXJldHVybiBnZXRSb2FkbWFwKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUOgotCQkJCXJldHVybiBnZXRSZXVzYWJsZUFzc2V0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJcmV0dXJuIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19XSElURVBBUEVSOgotCQkJCXJldHVybiBnZXRXaGl0ZXBhcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRToKLQkJCQlyZXR1cm4gaXNJc0VuYWN0YWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQkJc2V0UHJlY29uZGl0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCQlzZXRQb3N0Y29uZGl0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOgotCQkJCWdldEJyZWFrZG93bkVsZW1lbnQoKS5jbGVhcigpOwotCQkJCWdldEJyZWFrZG93bkVsZW1lbnQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQ0hFQ0tMSVNUOgotCQkJCWdldENoZWNrbGlzdCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q2hlY2tsaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0NPTkNFUFQ6Ci0JCQkJZ2V0Q29uY2VwdCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29uY2VwdCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19FWEFNUExFOgotCQkJCWdldEV4YW1wbGUoKS5jbGVhcigpOwotCQkJCWdldEV4YW1wbGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1VJREVMSU5FOgotCQkJCWdldEd1aWRlbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0R3VpZGVsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVA6Ci0JCQkJZ2V0Um9hZG1hcCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Um9hZG1hcCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlnZXRSZXVzYWJsZUFzc2V0KCkuY2xlYXIoKTsKLQkJCQlnZXRSZXVzYWJsZUFzc2V0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fV0hJVEVQQVBFUjoKLQkJCQlnZXRXaGl0ZXBhcGVyKCkuY2xlYXIoKTsKLQkJCQlnZXRXaGl0ZXBhcGVyKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRToKLQkJCQlzZXRJc0VuYWN0YWJsZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJc2V0VmFyaWFiaWxpdHlUeXBlKChWYXJpYWJpbGl0eVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCQlzZXRQcmVjb25kaXRpb24oUFJFQ09ORElUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQkJc2V0UG9zdGNvbmRpdGlvbihQT1NUQ09ORElUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ6Ci0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19DSEVDS0xJU1Q6Ci0JCQkJZ2V0Q2hlY2tsaXN0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0NPTkNFUFQ6Ci0JCQkJZ2V0Q29uY2VwdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19FWEFNUExFOgotCQkJCWdldEV4YW1wbGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1VJREVMSU5FOgotCQkJCWdldEd1aWRlbGluZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQOgotCQkJCWdldFJvYWRtYXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQ6Ci0JCQkJZ2V0UmV1c2FibGVBc3NldCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19XSElURVBBUEVSOgotCQkJCWdldFdoaXRlcGFwZXIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOgotCQkJCXVuc2V0SXNFbmFjdGFibGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJdW5zZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBQUkVDT05ESVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHByZWNvbmRpdGlvbiAhPSBudWxsIDogIVBSRUNPTkRJVElPTl9FREVGQVVMVC5lcXVhbHMocHJlY29uZGl0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gUE9TVENPTkRJVElPTl9FREVGQVVMVCA9PSBudWxsID8gcG9zdGNvbmRpdGlvbiAhPSBudWxsIDogIVBPU1RDT05ESVRJT05fRURFRkFVTFQuZXF1YWxzKHBvc3Rjb25kaXRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gIWdldEJyZWFrZG93bkVsZW1lbnQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0NIRUNLTElTVDoKLQkJCQlyZXR1cm4gIWdldENoZWNrbGlzdCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQ09OQ0VQVDoKLQkJCQlyZXR1cm4gIWdldENvbmNlcHQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0VYQU1QTEU6Ci0JCQkJcmV0dXJuICFnZXRFeGFtcGxlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19HVUlERUxJTkU6Ci0JCQkJcmV0dXJuICFnZXRHdWlkZWxpbmUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVA6Ci0JCQkJcmV0dXJuICFnZXRSb2FkbWFwKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlyZXR1cm4gIWdldFJldXNhYmxlQXNzZXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJcmV0dXJuICFnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1dISVRFUEFQRVI6Ci0JCQkJcmV0dXJuICFnZXRXaGl0ZXBhcGVyKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19JU19FTkFDVEFCTEU6Ci0JCQkJcmV0dXJuIGlzU2V0SXNFbmFjdGFibGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsIDogIVZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlY29uZGl0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVjb25kaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBvc3Rjb25kaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBvc3Rjb25kaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc0VuYWN0YWJsZTogIik7Ci0JCWlmIChpc0VuYWN0YWJsZUVTZXQpIHJlc3VsdC5hcHBlbmQoaXNFbmFjdGFibGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YXJpYWJpbGl0eVR5cGU6ICIpOwotCQlpZiAodmFyaWFiaWxpdHlUeXBlRVNldCkgcmVzdWx0LmFwcGVuZCh2YXJpYWJpbGl0eVR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQWN0aXZpdHlJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BcnRpZmFjdERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BcnRpZmFjdERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMTdhYzMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFydGlmYWN0IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgQXJ0aWZhY3REZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJyaWVmT3V0bGluZSgpIDxlbT5CcmllZiBPdXRsaW5lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmllZk91dGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJSSUVGX09VVExJTkVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZPdXRsaW5lKCkgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJyaWVmT3V0bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBicmllZk91dGxpbmUgPSBCUklFRl9PVVRMSU5FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXByZXNlbnRhdGlvbk9wdGlvbnMgPSBSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJyaWVmT3V0bGluZSgpIHsKLQkJcmV0dXJuIGJyaWVmT3V0bGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCcmllZk91dGxpbmUoU3RyaW5nIG5ld0JyaWVmT3V0bGluZSkgewotCQlTdHJpbmcgb2xkQnJpZWZPdXRsaW5lID0gYnJpZWZPdXRsaW5lOwotCQlicmllZk91dGxpbmUgPSBuZXdCcmllZk91dGxpbmU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUsIG9sZEJyaWVmT3V0bGluZSwgYnJpZWZPdXRsaW5lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKSB7Ci0JCXJldHVybiByZXByZXNlbnRhdGlvbk9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFN0cmluZyBuZXdSZXByZXNlbnRhdGlvbk9wdGlvbnMpIHsKLQkJU3RyaW5nIG9sZFJlcHJlc2VudGF0aW9uT3B0aW9ucyA9IHJlcHJlc2VudGF0aW9uT3B0aW9uczsKLQkJcmVwcmVzZW50YXRpb25PcHRpb25zID0gbmV3UmVwcmVzZW50YXRpb25PcHRpb25zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TLCBvbGRSZXByZXNlbnRhdGlvbk9wdGlvbnMsIHJlcHJlc2VudGF0aW9uT3B0aW9ucykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCQlyZXR1cm4gZ2V0QnJpZWZPdXRsaW5lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlM6Ci0JCQkJcmV0dXJuIGdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkU6Ci0JCQkJc2V0QnJpZWZPdXRsaW5lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCQlzZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCQlzZXRCcmllZk91dGxpbmUoQlJJRUZfT1VUTElORV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJCXNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCQlyZXR1cm4gQlJJRUZfT1VUTElORV9FREVGQVVMVCA9PSBudWxsID8gYnJpZWZPdXRsaW5lICE9IG51bGwgOiAhQlJJRUZfT1VUTElORV9FREVGQVVMVC5lcXVhbHMoYnJpZWZPdXRsaW5lKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCQlyZXR1cm4gUkVQUkVTRU5UQVRJT05fT1BUSU9OU19FREVGQVVMVCA9PSBudWxsID8gcmVwcmVzZW50YXRpb25PcHRpb25zICE9IG51bGwgOiAhUkVQUkVTRU5UQVRJT05fT1BUSU9OU19FREVGQVVMVC5lcXVhbHMocmVwcmVzZW50YXRpb25PcHRpb25zKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGJyaWVmT3V0bGluZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYnJpZWZPdXRsaW5lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXByZXNlbnRhdGlvbk9wdGlvbnM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlcHJlc2VudGF0aW9uT3B0aW9ucyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BcnRpZmFjdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQXJ0aWZhY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmZjdiMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BcnRpZmFjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFydGlmYWN0SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3RJbXBsI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0SW1wbCNnZXRDb250YWluZWRBcnRpZmFjdCA8ZW0+Q29udGFpbmVkIEFydGlmYWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RJbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3RJbXBsIGltcGxlbWVudHMgQXJ0aWZhY3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMygpIDxlbT5Hcm91cDM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAzKCkgewotCQlpZiAoZ3JvdXAzID09IG51bGwpIHsKLQkJCWdyb3VwMyA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5BUlRJRkFDVF9fR1JPVVAzKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb250YWluZWRBcnRpZmFjdCgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDMoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fR1JPVVAzOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0dST1VQMzoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDMoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVDoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19HUk9VUDM6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUOgotCQkJCWdldENvbnRhaW5lZEFydGlmYWN0KCkuY2xlYXIoKTsKLQkJCQlnZXRDb250YWluZWRBcnRpZmFjdCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fR1JPVVAzOgotCQkJCWdldEdyb3VwMygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1Q6Ci0JCQkJZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19HUk9VUDM6Ci0JCQkJcmV0dXJuIGdyb3VwMyAhPSBudWxsICYmICFncm91cDMuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1Q6Ci0JCQkJcmV0dXJuICFnZXRDb250YWluZWRBcnRpZmFjdCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQXJ0aWZhY3RJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2ZhNzY1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsI2dldFVzYWdlR3VpZGFuY2UgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZUd1aWRhbmNlKCkgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0FHRV9HVUlEQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZUd1aWRhbmNlKCkgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVzYWdlR3VpZGFuY2UgPSBVU0FHRV9HVUlEQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVzYWdlR3VpZGFuY2UoKSB7Ci0JCXJldHVybiB1c2FnZUd1aWRhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzYWdlR3VpZGFuY2UoU3RyaW5nIG5ld1VzYWdlR3VpZGFuY2UpIHsKLQkJU3RyaW5nIG9sZFVzYWdlR3VpZGFuY2UgPSB1c2FnZUd1aWRhbmNlOwotCQl1c2FnZUd1aWRhbmNlID0gbmV3VXNhZ2VHdWlkYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UsIG9sZFVzYWdlR3VpZGFuY2UsIHVzYWdlR3VpZGFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJCXJldHVybiBnZXRVc2FnZUd1aWRhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQkJc2V0VXNhZ2VHdWlkYW5jZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCQlzZXRVc2FnZUd1aWRhbmNlKFVTQUdFX0dVSURBTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQkJcmV0dXJuIFVTQUdFX0dVSURBTkNFX0VERUZBVUxUID09IG51bGwgPyB1c2FnZUd1aWRhbmNlICE9IG51bGwgOiAhVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQuZXF1YWxzKHVzYWdlR3VpZGFuY2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXNhZ2VHdWlkYW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXNhZ2VHdWlkYW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkZmZjMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQnJlYWtkb3duRWxlbWVudEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFN1cGVyQWN0aXZpdHkgPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2lzSXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjaXNJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50SW1wbCBleHRlbmRzIFByb2Nlc3NFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50ZWRBZnRlcigpIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRlZEFmdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5URURfQUZURVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGVkQWZ0ZXIoKSA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRBZnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVzZW50ZWRBZnRlciA9IFBSRVNFTlRFRF9BRlRFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50ZWRCZWZvcmUoKSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5URURfQkVGT1JFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRlZEJlZm9yZSgpIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlc2VudGVkQmVmb3JlID0gUFJFU0VOVEVEX0JFRk9SRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQbGFubmluZ0RhdGEoKSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFOTklOR19EQVRBX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBsYW5uaW5nRGF0YSgpIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGxhbm5pbmdEYXRhID0gUExBTk5JTkdfREFUQV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBlckFjdGl2aXR5KCkgPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdXBlckFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUl9BQ1RJVklUWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBlckFjdGl2aXR5KCkgPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdXBlckFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN1cGVyQWN0aXZpdHkgPSBTVVBFUl9BQ1RJVklUWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA9IEhBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSGFzIE11bHRpcGxlIE9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNPcHRpb25hbCgpIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc09wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfT1BUSU9OQUxfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNPcHRpb25hbCgpIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc09wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09wdGlvbmFsID0gSVNfT1BUSU9OQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIE9wdGlvbmFsIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09wdGlvbmFsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNQbGFubmVkKCkgPGVtPklzIFBsYW5uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNQbGFubmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfUExBTk5FRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1BsYW5uZWQoKSA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1BsYW5uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUGxhbm5lZCA9IElTX1BMQU5ORURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFBsYW5uZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUGxhbm5lZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVmaXgoKSA8ZW0+UHJlZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVmaXgoKSA8ZW0+UHJlZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlZml4ID0gUFJFRklYX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRlZEFmdGVyKCkgewotCQlyZXR1cm4gcHJlc2VudGVkQWZ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VudGVkQWZ0ZXIoU3RyaW5nIG5ld1ByZXNlbnRlZEFmdGVyKSB7Ci0JCVN0cmluZyBvbGRQcmVzZW50ZWRBZnRlciA9IHByZXNlbnRlZEFmdGVyOwotCQlwcmVzZW50ZWRBZnRlciA9IG5ld1ByZXNlbnRlZEFmdGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIsIG9sZFByZXNlbnRlZEFmdGVyLCBwcmVzZW50ZWRBZnRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlc2VudGVkQmVmb3JlKCkgewotCQlyZXR1cm4gcHJlc2VudGVkQmVmb3JlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRlZEJlZm9yZShTdHJpbmcgbmV3UHJlc2VudGVkQmVmb3JlKSB7Ci0JCVN0cmluZyBvbGRQcmVzZW50ZWRCZWZvcmUgPSBwcmVzZW50ZWRCZWZvcmU7Ci0JCXByZXNlbnRlZEJlZm9yZSA9IG5ld1ByZXNlbnRlZEJlZm9yZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSwgb2xkUHJlc2VudGVkQmVmb3JlLCBwcmVzZW50ZWRCZWZvcmUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsYW5uaW5nRGF0YSgpIHsKLQkJcmV0dXJuIHBsYW5uaW5nRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQbGFubmluZ0RhdGEoU3RyaW5nIG5ld1BsYW5uaW5nRGF0YSkgewotCQlTdHJpbmcgb2xkUGxhbm5pbmdEYXRhID0gcGxhbm5pbmdEYXRhOwotCQlwbGFubmluZ0RhdGEgPSBuZXdQbGFubmluZ0RhdGE7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsIG9sZFBsYW5uaW5nRGF0YSwgcGxhbm5pbmdEYXRhKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdXBlckFjdGl2aXR5KCkgewotCQlyZXR1cm4gc3VwZXJBY3Rpdml0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdXBlckFjdGl2aXR5KFN0cmluZyBuZXdTdXBlckFjdGl2aXR5KSB7Ci0JCVN0cmluZyBvbGRTdXBlckFjdGl2aXR5ID0gc3VwZXJBY3Rpdml0eTsKLQkJc3VwZXJBY3Rpdml0eSA9IG5ld1N1cGVyQWN0aXZpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZLCBvbGRTdXBlckFjdGl2aXR5LCBzdXBlckFjdGl2aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgewotCQlyZXR1cm4gaGFzTXVsdGlwbGVPY2N1cnJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKGJvb2xlYW4gbmV3SGFzTXVsdGlwbGVPY2N1cnJlbmNlcykgewotCQlib29sZWFuIG9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzOwotCQloYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gbmV3SGFzTXVsdGlwbGVPY2N1cnJlbmNlczsKLQkJYm9vbGVhbiBvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldCA9IGhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0OwotCQloYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywgb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlcywgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcywgIW9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgewotCQlib29sZWFuIG9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzOwotCQlib29sZWFuIG9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0ID0gaGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQ7Ci0JCWhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQ7Ci0JCWhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLCBvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzLCBIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQsIG9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgewotCQlyZXR1cm4gaGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc09wdGlvbmFsKCkgewotCQlyZXR1cm4gaXNPcHRpb25hbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc09wdGlvbmFsKGJvb2xlYW4gbmV3SXNPcHRpb25hbCkgewotCQlib29sZWFuIG9sZElzT3B0aW9uYWwgPSBpc09wdGlvbmFsOwotCQlpc09wdGlvbmFsID0gbmV3SXNPcHRpb25hbDsKLQkJYm9vbGVhbiBvbGRJc09wdGlvbmFsRVNldCA9IGlzT3B0aW9uYWxFU2V0OwotCQlpc09wdGlvbmFsRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMLCBvbGRJc09wdGlvbmFsLCBpc09wdGlvbmFsLCAhb2xkSXNPcHRpb25hbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzT3B0aW9uYWwoKSB7Ci0JCWJvb2xlYW4gb2xkSXNPcHRpb25hbCA9IGlzT3B0aW9uYWw7Ci0JCWJvb2xlYW4gb2xkSXNPcHRpb25hbEVTZXQgPSBpc09wdGlvbmFsRVNldDsKLQkJaXNPcHRpb25hbCA9IElTX09QVElPTkFMX0VERUZBVUxUOwotCQlpc09wdGlvbmFsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMLCBvbGRJc09wdGlvbmFsLCBJU19PUFRJT05BTF9FREVGQVVMVCwgb2xkSXNPcHRpb25hbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiBpc09wdGlvbmFsRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzUGxhbm5lZCgpIHsKLQkJcmV0dXJuIGlzUGxhbm5lZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1BsYW5uZWQoYm9vbGVhbiBuZXdJc1BsYW5uZWQpIHsKLQkJYm9vbGVhbiBvbGRJc1BsYW5uZWQgPSBpc1BsYW5uZWQ7Ci0JCWlzUGxhbm5lZCA9IG5ld0lzUGxhbm5lZDsKLQkJYm9vbGVhbiBvbGRJc1BsYW5uZWRFU2V0ID0gaXNQbGFubmVkRVNldDsKLQkJaXNQbGFubmVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQsIG9sZElzUGxhbm5lZCwgaXNQbGFubmVkLCAhb2xkSXNQbGFubmVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNQbGFubmVkKCkgewotCQlib29sZWFuIG9sZElzUGxhbm5lZCA9IGlzUGxhbm5lZDsKLQkJYm9vbGVhbiBvbGRJc1BsYW5uZWRFU2V0ID0gaXNQbGFubmVkRVNldDsKLQkJaXNQbGFubmVkID0gSVNfUExBTk5FRF9FREVGQVVMVDsKLQkJaXNQbGFubmVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQsIG9sZElzUGxhbm5lZCwgSVNfUExBTk5FRF9FREVGQVVMVCwgb2xkSXNQbGFubmVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNQbGFubmVkKCkgewotCQlyZXR1cm4gaXNQbGFubmVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIHByZWZpeDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIG5ld1ByZWZpeCkgewotCQlTdHJpbmcgb2xkUHJlZml4ID0gcHJlZml4OwotCQlwcmVmaXggPSBuZXdQcmVmaXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWCwgb2xkUHJlZml4LCBwcmVmaXgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjoKLQkJCQlyZXR1cm4gZ2V0UHJlc2VudGVkQWZ0ZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCQlyZXR1cm4gZ2V0UHJlc2VudGVkQmVmb3JlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQkJcmV0dXJuIGdldFBsYW5uaW5nRGF0YSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWToKLQkJCQlyZXR1cm4gZ2V0U3VwZXJBY3Rpdml0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM6Ci0JCQkJcmV0dXJuIGlzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw6Ci0JCQkJcmV0dXJuIGlzSXNPcHRpb25hbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDoKLQkJCQlyZXR1cm4gaXNJc1BsYW5uZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCQlyZXR1cm4gZ2V0UHJlZml4KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJCXNldFByZXNlbnRlZEFmdGVyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCQlzZXRQcmVzZW50ZWRCZWZvcmUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJCXNldFBsYW5uaW5nRGF0YSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOgotCQkJCXNldFN1cGVyQWN0aXZpdHkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM6Ci0JCQkJc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJCXNldElzT3B0aW9uYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJCXNldElzUGxhbm5lZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCQlzZXRQcmVmaXgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJCXNldFByZXNlbnRlZEFmdGVyKFBSRVNFTlRFRF9BRlRFUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOgotCQkJCXNldFByZXNlbnRlZEJlZm9yZShQUkVTRU5URURfQkVGT1JFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQkJc2V0UGxhbm5pbmdEYXRhKFBMQU5OSU5HX0RBVEFfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk6Ci0JCQkJc2V0U3VwZXJBY3Rpdml0eShTVVBFUl9BQ1RJVklUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM6Ci0JCQkJdW5zZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCQl1bnNldElzT3B0aW9uYWwoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCQkJdW5zZXRJc1BsYW5uZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCQlzZXRQcmVmaXgoUFJFRklYX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJCXJldHVybiBQUkVTRU5URURfQUZURVJfRURFRkFVTFQgPT0gbnVsbCA/IHByZXNlbnRlZEFmdGVyICE9IG51bGwgOiAhUFJFU0VOVEVEX0FGVEVSX0VERUZBVUxULmVxdWFscyhwcmVzZW50ZWRBZnRlcik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU6Ci0JCQkJcmV0dXJuIFBSRVNFTlRFRF9CRUZPUkVfRURFRkFVTFQgPT0gbnVsbCA/IHByZXNlbnRlZEJlZm9yZSAhPSBudWxsIDogIVBSRVNFTlRFRF9CRUZPUkVfRURFRkFVTFQuZXF1YWxzKHByZXNlbnRlZEJlZm9yZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQkJcmV0dXJuIFBMQU5OSU5HX0RBVEFfRURFRkFVTFQgPT0gbnVsbCA/IHBsYW5uaW5nRGF0YSAhPSBudWxsIDogIVBMQU5OSU5HX0RBVEFfRURFRkFVTFQuZXF1YWxzKHBsYW5uaW5nRGF0YSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOgotCQkJCXJldHVybiBTVVBFUl9BQ1RJVklUWV9FREVGQVVMVCA9PSBudWxsID8gc3VwZXJBY3Rpdml0eSAhPSBudWxsIDogIVNVUEVSX0FDVElWSVRZX0VERUZBVUxULmVxdWFscyhzdXBlckFjdGl2aXR5KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJCXJldHVybiBpc1NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw6Ci0JCQkJcmV0dXJuIGlzU2V0SXNPcHRpb25hbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJCXJldHVybiBpc1NldElzUGxhbm5lZCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg6Ci0JCQkJcmV0dXJuIFBSRUZJWF9FREVGQVVMVCA9PSBudWxsID8gcHJlZml4ICE9IG51bGwgOiAhUFJFRklYX0VERUZBVUxULmVxdWFscyhwcmVmaXgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlc2VudGVkQWZ0ZXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZXNlbnRlZEFmdGVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmVzZW50ZWRCZWZvcmU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZXNlbnRlZEJlZm9yZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGxhbm5pbmdEYXRhOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwbGFubmluZ0RhdGEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1cGVyQWN0aXZpdHk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN1cGVyQWN0aXZpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhhc011bHRpcGxlT2NjdXJyZW5jZXM6ICIpOwotCQlpZiAoaGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQpIHJlc3VsdC5hcHBlbmQoaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzT3B0aW9uYWw6ICIpOwotCQlpZiAoaXNPcHRpb25hbEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNPcHRpb25hbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzUGxhbm5lZDogIik7Ci0JCWlmIChpc1BsYW5uZWRFU2V0KSByZXN1bHQuYXBwZW5kKGlzUGxhbm5lZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZWZpeDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlZml4KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQnJlYWtkb3duRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DYXBhYmlsaXR5UGF0dGVybkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDY5MTAwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDYXBhYmlsaXR5UGF0dGVybkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2FwYWJpbGl0eVBhdHRlcm5JbXBsIGV4dGVuZHMgUHJvY2Vzc0ltcGwgaW1wbGVtZW50cyBDYXBhYmlsaXR5UGF0dGVybiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENhcGFiaWxpdHlQYXR0ZXJuSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ0FQQUJJTElUWV9QQVRURVJOOwotCX0KLQotfSAvL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ2hlY2tsaXN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwYjgxNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENoZWNrbGlzdEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENoZWNrbGlzdEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBDaGVja2xpc3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDaGVja2xpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DSEVDS0xJU1Q7Ci0JfQotCi19IC8vQ2hlY2tsaXN0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29tcG9zaXRlUm9sZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29tcG9zaXRlUm9sZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWE1YWQxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbXBvc2l0ZVJvbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb3NpdGVSb2xlSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wb3NpdGUgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCNnZXRBZ2dyZWdhdGVkUm9sZSA8ZW0+QWdncmVnYXRlZCBSb2xlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZUltcGwgZXh0ZW5kcyBSb2xlRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cyBDb21wb3NpdGVSb2xlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDEoKSA8ZW0+R3JvdXAxPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAxID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGVSb2xlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JPTEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAxKCkgewotCQlpZiAoZ3JvdXAxID09IG51bGwpIHsKLQkJCWdyb3VwMSA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fR1JPVVAxKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAxOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBZ2dyZWdhdGVkUm9sZSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDEoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fR1JPVVAxOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAxKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QWdncmVnYXRlZFJvbGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0dST1VQMToKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDEoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRToKLQkJCQlyZXR1cm4gZ2V0QWdncmVnYXRlZFJvbGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19HUk9VUDE6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFOgotCQkJCWdldEFnZ3JlZ2F0ZWRSb2xlKCkuY2xlYXIoKTsKLQkJCQlnZXRBZ2dyZWdhdGVkUm9sZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEU6Ci0JCQkJZ2V0QWdncmVnYXRlZFJvbGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19HUk9VUDE6Ci0JCQkJcmV0dXJuIGdyb3VwMSAhPSBudWxsICYmICFncm91cDEuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEU6Ci0JCQkJcmV0dXJuICFnZXRBZ2dyZWdhdGVkUm9sZSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAxKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29tcG9zaXRlUm9sZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbmNlcHRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbmNlcHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3NzczYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db25jZXB0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb25jZXB0SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25jZXB0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIENvbmNlcHQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25jZXB0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OQ0VQVDsKLQl9Ci0KLX0gLy9Db25jZXB0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29uc3RyYWludEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29uc3RyYWludEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjdhY2E2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnN0cmFpbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb25zdHJhaW50SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25zdHJhaW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnN0cmFpbnRJbXBsI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnN0cmFpbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cyBDb25zdHJhaW50IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkgPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYWluRGVzY3JpcHRpb24oKSA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1haW5EZXNjcmlwdGlvbiA9IE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlNUUkFJTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYWluRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBtYWluRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZyBuZXdNYWluRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZE1haW5EZXNjcmlwdGlvbiA9IG1haW5EZXNjcmlwdGlvbjsKLQkJbWFpbkRlc2NyaXB0aW9uID0gbmV3TWFpbkRlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX01BSU5fREVTQ1JJUFRJT04sIG9sZE1haW5EZXNjcmlwdGlvbiwgbWFpbkRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX01BSU5fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldE1haW5EZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTjoKLQkJCQlzZXRNYWluRGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXNldE1haW5EZXNjcmlwdGlvbihNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBtYWluRGVzY3JpcHRpb24gIT0gbnVsbCA6ICFNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhtYWluRGVzY3JpcHRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWFpbkRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYWluRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db25zdHJhaW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExNzE0OTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRDYXRlZ29yeUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudENhdGVnb3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9DQVRFR09SWTsKLQl9Ci0KLX0gLy9Db250ZW50Q2F0ZWdvcnlJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNTc0YmVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnkgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCBleHRlbmRzIE1ldGhvZFBhY2thZ2VJbXBsIGltcGxlbWVudHMgQ29udGVudENhdGVnb3J5UGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb250ZW50Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19DT05URU5UX0NBVEVHT1JZOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGVudENhdGVnb3J5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRDYXRlZ29yeSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlk6Ci0JCQkJZ2V0Q29udGVudENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50Q2F0ZWdvcnkoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19DT05URU5UX0NBVEVHT1JZOgotCQkJCWdldENvbnRlbnRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWToKLQkJCQlyZXR1cm4gIWdldENvbnRlbnRDYXRlZ29yeSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnREZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMDY2MTRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRLZXlDb25zaWRlcmF0aW9ucyA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0U2VjdGlvbiA8ZW0+U2VjdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBNZXRob2RVbml0SW1wbCBpbXBsZW1lbnRzIENvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1haW5EZXNjcmlwdGlvbigpIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkgPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYWluRGVzY3JpcHRpb24gPSBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtleUNvbnNpZGVyYXRpb25zKCkgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLZXlDb25zaWRlcmF0aW9ucygpIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEtleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGtleUNvbnNpZGVyYXRpb25zID0gS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdGlvbigpIDxlbT5TZWN0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZWN0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFpbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbWFpbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1haW5EZXNjcmlwdGlvbihTdHJpbmcgbmV3TWFpbkRlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRNYWluRGVzY3JpcHRpb24gPSBtYWluRGVzY3JpcHRpb247Ci0JCW1haW5EZXNjcmlwdGlvbiA9IG5ld01haW5EZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OLCBvbGRNYWluRGVzY3JpcHRpb24sIG1haW5EZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiBrZXlDb25zaWRlcmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZXlDb25zaWRlcmF0aW9ucyhTdHJpbmcgbmV3S2V5Q29uc2lkZXJhdGlvbnMpIHsKLQkJU3RyaW5nIG9sZEtleUNvbnNpZGVyYXRpb25zID0ga2V5Q29uc2lkZXJhdGlvbnM7Ci0JCWtleUNvbnNpZGVyYXRpb25zID0gbmV3S2V5Q29uc2lkZXJhdGlvbnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TLCBvbGRLZXlDb25zaWRlcmF0aW9ucywga2V5Q29uc2lkZXJhdGlvbnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VjdGlvbigpIHsKLQkJaWYgKHNlY3Rpb24gPT0gbnVsbCkgewotCQkJc2VjdGlvbiA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZWN0aW9uLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT04pOwotCQl9Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjoKLQkJCQlyZXR1cm4gZ2V0U2VjdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjoKLQkJCQlzZXRNYWluRGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJCQlzZXRLZXlDb25zaWRlcmF0aW9ucygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjoKLQkJCQlnZXRTZWN0aW9uKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQkJc2V0TWFpbkRlc2NyaXB0aW9uKE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM6Ci0JCQkJc2V0S2V5Q29uc2lkZXJhdGlvbnMoS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjoKLQkJCQlnZXRTZWN0aW9uKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBtYWluRGVzY3JpcHRpb24gIT0gbnVsbCA6ICFNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhtYWluRGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUID09IG51bGwgPyBrZXlDb25zaWRlcmF0aW9ucyAhPSBudWxsIDogIUtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVC5lcXVhbHMoa2V5Q29uc2lkZXJhdGlvbnMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT046Ci0JCQkJcmV0dXJuIHNlY3Rpb24gIT0gbnVsbCAmJiAhc2VjdGlvbi5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtYWluRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1haW5EZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwga2V5Q29uc2lkZXJhdGlvbnM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGtleUNvbnNpZGVyYXRpb25zKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29udGVudERlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDQyYjhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb250ZW50RWxlbWVudEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0Q2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldENvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldEV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldEd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRSZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0U3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudEltcGwgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMSgpIDxlbT5Hcm91cDE8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDEgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA9IFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YXJpYWJpbGl0eVR5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAxKCkgewotCQlpZiAoZ3JvdXAxID09IG51bGwpIHsKLQkJCWdyb3VwMSA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dST1VQMSk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q2hlY2tsaXN0KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMSgpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb25jZXB0KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMSgpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXhhbXBsZSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDEoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEd1aWRlbGluZSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDEoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmV1c2FibGVBc3NldCgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDEoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAxKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRXaGl0ZXBhcGVyKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMSgpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nIG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJU3RyaW5nIG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsIG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIG5ld1ZhcmlhYmlsaXR5VHlwZSkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQl2YXJpYWJpbGl0eVR5cGUgPSBuZXdWYXJpYWJpbGl0eVR5cGUgPT0gbnVsbCA/IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQgOiBuZXdWYXJpYWJpbGl0eVR5cGU7Ci0JCWJvb2xlYW4gb2xkVmFyaWFiaWxpdHlUeXBlRVNldCA9IHZhcmlhYmlsaXR5VHlwZUVTZXQ7Ci0JCXZhcmlhYmlsaXR5VHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSwgb2xkVmFyaWFiaWxpdHlUeXBlLCB2YXJpYWJpbGl0eVR5cGUsICFvbGRWYXJpYWJpbGl0eVR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSBvbGRWYXJpYWJpbGl0eVR5cGUgPSB2YXJpYWJpbGl0eVR5cGU7Ci0JCWJvb2xlYW4gb2xkVmFyaWFiaWxpdHlUeXBlRVNldCA9IHZhcmlhYmlsaXR5VHlwZUVTZXQ7Ci0JCXZhcmlhYmlsaXR5VHlwZSA9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0JCXZhcmlhYmlsaXR5VHlwZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSwgb2xkVmFyaWFiaWxpdHlUeXBlLCBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxULCBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dST1VQMToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dST1VQMToKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDEoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1Q6Ci0JCQkJcmV0dXJuIGdldENoZWNrbGlzdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDoKLQkJCQlyZXR1cm4gZ2V0Q29uY2VwdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRToKLQkJCQlyZXR1cm4gZ2V0RXhhbXBsZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOgotCQkJCXJldHVybiBnZXRHdWlkZWxpbmUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOgotCQkJCXJldHVybiBnZXRSZXVzYWJsZUFzc2V0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCXJldHVybiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVI6Ci0JCQkJcmV0dXJuIGdldFdoaXRlcGFwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDoKLQkJCQlnZXRDaGVja2xpc3QoKS5jbGVhcigpOwotCQkJCWdldENoZWNrbGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDoKLQkJCQlnZXRDb25jZXB0KCkuY2xlYXIoKTsKLQkJCQlnZXRDb25jZXB0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOgotCQkJCWdldEV4YW1wbGUoKS5jbGVhcigpOwotCQkJCWdldEV4YW1wbGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORToKLQkJCQlnZXRHdWlkZWxpbmUoKS5jbGVhcigpOwotCQkJCWdldEd1aWRlbGluZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ6Ci0JCQkJZ2V0UmV1c2FibGVBc3NldCgpLmNsZWFyKCk7Ci0JCQkJZ2V0UmV1c2FibGVBc3NldCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCQlnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKS5jbGVhcigpOwotCQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjoKLQkJCQlnZXRXaGl0ZXBhcGVyKCkuY2xlYXIoKTsKLQkJCQlnZXRXaGl0ZXBhcGVyKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlzZXRWYXJpYWJpbGl0eVR5cGUoKFZhcmlhYmlsaXR5VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dST1VQMToKLQkJCQlnZXRHcm91cDEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDoKLQkJCQlnZXRDaGVja2xpc3QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFQ6Ci0JCQkJZ2V0Q29uY2VwdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRToKLQkJCQlnZXRFeGFtcGxlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU6Ci0JCQkJZ2V0R3VpZGVsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlnZXRSZXVzYWJsZUFzc2V0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjoKLQkJCQlnZXRXaGl0ZXBhcGVyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQl1bnNldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOgotCQkJCXJldHVybiBncm91cDEgIT0gbnVsbCAmJiAhZ3JvdXAxLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDoKLQkJCQlyZXR1cm4gIWdldENoZWNrbGlzdCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFQ6Ci0JCQkJcmV0dXJuICFnZXRDb25jZXB0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRToKLQkJCQlyZXR1cm4gIWdldEV4YW1wbGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU6Ci0JCQkJcmV0dXJuICFnZXRHdWlkZWxpbmUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlyZXR1cm4gIWdldFJldXNhYmxlQXNzZXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCXJldHVybiAhZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjoKLQkJCQlyZXR1cm4gIWdldFdoaXRlcGFwZXIoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGwgOiAhVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHModmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAxOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhcmlhYmlsaXR5VHlwZTogIik7Ci0JCWlmICh2YXJpYWJpbGl0eVR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5VHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db250ZW50RWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50UGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjEzZTNkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudFBhY2thZ2VJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbCNnZXRDb250ZW50RWxlbWVudCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFBhY2thZ2VJbXBsIGV4dGVuZHMgTWV0aG9kUGFja2FnZUltcGwgaW1wbGVtZW50cyBDb250ZW50UGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbnRlbnRFbGVtZW50KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0Q29udGVudEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQ6Ci0JCQkJZ2V0Q29udGVudEVsZW1lbnQoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnRFbGVtZW50KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UOgotCQkJCWdldENvbnRlbnRFbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICFnZXRDb250ZW50RWxlbWVudCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29udGVudFBhY2thZ2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DdXN0b21DYXRlZ29yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ3VzdG9tQ2F0ZWdvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJhMWFmMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DdXN0b21DYXRlZ29yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEN1c3RvbUNhdGVnb3J5SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q3VzdG9tIENhdGVnb3J5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50IDxlbT5DYXRlZ29yaXplZCBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbCNnZXRTdWJDYXRlZ29yeSA8ZW0+U3ViIENhdGVnb3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIEN1c3RvbUNhdGVnb3J5IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDdXN0b21DYXRlZ29yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDYXRlZ29yaXplZEVsZW1lbnQoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTdWJDYXRlZ29yeSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldFN1YkNhdGVnb3J5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVDoKLQkJCQlnZXRDYXRlZ29yaXplZEVsZW1lbnQoKS5jbGVhcigpOwotCQkJCWdldENhdGVnb3JpemVkRWxlbWVudCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZOgotCQkJCWdldFN1YkNhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCQlnZXRTdWJDYXRlZ29yeSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlQ6Ci0JCQkJZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUlk6Ci0JCQkJZ2V0U3ViQ2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICFnZXRDYXRlZ29yaXplZEVsZW1lbnQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuICFnZXRTdWJDYXRlZ29yeSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ3VzdG9tQ2F0ZWdvcnlJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MTBjYzA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsI2dldEV4dGVybmFsRGVzY3JpcHRpb24gPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKSA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKSA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZXJuYWxEZXNjcmlwdGlvbiA9IEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhY2thZ2luZ0d1aWRhbmNlID0gUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBleHRlcm5hbERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsRGVzY3JpcHRpb24oU3RyaW5nIG5ld0V4dGVybmFsRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZEV4dGVybmFsRGVzY3JpcHRpb24gPSBleHRlcm5hbERlc2NyaXB0aW9uOwotCQlleHRlcm5hbERlc2NyaXB0aW9uID0gbmV3RXh0ZXJuYWxEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04sIG9sZEV4dGVybmFsRGVzY3JpcHRpb24sIGV4dGVybmFsRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2luZ0d1aWRhbmNlKCkgewotCQlyZXR1cm4gcGFja2FnaW5nR3VpZGFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFja2FnaW5nR3VpZGFuY2UoU3RyaW5nIG5ld1BhY2thZ2luZ0d1aWRhbmNlKSB7Ci0JCVN0cmluZyBvbGRQYWNrYWdpbmdHdWlkYW5jZSA9IHBhY2thZ2luZ0d1aWRhbmNlOwotCQlwYWNrYWdpbmdHdWlkYW5jZSA9IG5ld1BhY2thZ2luZ0d1aWRhbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UsIG9sZFBhY2thZ2luZ0d1aWRhbmNlLCBwYWNrYWdpbmdHdWlkYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldEV4dGVybmFsRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJCXJldHVybiBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJCXNldEV4dGVybmFsRGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQkJc2V0UGFja2FnaW5nR3VpZGFuY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQkJc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbihFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQkJc2V0UGFja2FnaW5nR3VpZGFuY2UoUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBleHRlcm5hbERlc2NyaXB0aW9uICE9IG51bGwgOiAhRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGV4dGVybmFsRGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQkJcmV0dXJuIFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVCA9PSBudWxsID8gcGFja2FnaW5nR3VpZGFuY2UgIT0gbnVsbCA6ICFQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQuZXF1YWxzKHBhY2thZ2luZ0d1aWRhbmNlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGV4dGVybmFsRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4dGVybmFsRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhY2thZ2luZ0d1aWRhbmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYWNrYWdpbmdHdWlkYW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyYWJsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcmFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwZmU3M2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyYWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlbGl2ZXJhYmxlSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcmFibGVJbXBsI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbCNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCA8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJhYmxlSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0SW1wbCBpbXBsZW1lbnRzIERlbGl2ZXJhYmxlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDMoKSA8ZW0+R3JvdXAzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMygpIHsKLQkJaWYgKGdyb3VwMyA9PSBudWxsKSB7Ci0JCQlncm91cDMgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0dST1VQMyk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAzKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19HUk9VUDM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0dST1VQMzoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDMoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1Q6Ci0JCQkJcmV0dXJuIGdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fR1JPVVAzOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1Q6Ci0JCQkJZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QoKS5jbGVhcigpOwotCQkJCWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19HUk9VUDM6Ci0JCQkJZ2V0R3JvdXAzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1Q6Ci0JCQkJZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19HUk9VUDM6Ci0JCQkJcmV0dXJuIGdyb3VwMyAhPSBudWxsICYmICFncm91cDMuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUOgotCQkJCXJldHVybiAhZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJhYmxlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYWMwNWE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBQcm9jZXNzRGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2FsZSgpIDxlbT5TY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NhbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDQUxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjYWxlKCkgPGVtPlNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzY2FsZSA9IFNDQUxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdENoYXJhY3RlcmlzdGljcyA9IFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJpc2tMZXZlbCgpIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJJU0tfTEVWRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Umlza0xldmVsKCkgPGVtPlJpc2sgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJpc2tMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByaXNrTGV2ZWwgPSBSSVNLX0xFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXN0aW1hdGluZ1RlY2huaXF1ZSA9IEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdE1lbWJlckV4cGVydGlzZSA9IFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlT2ZDb250cmFjdCgpIDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlT2ZDb250cmFjdCgpIDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlT2ZDb250cmFjdCA9IFRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2NhbGUoKSB7Ci0JCXJldHVybiBzY2FsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY2FsZShTdHJpbmcgbmV3U2NhbGUpIHsKLQkJU3RyaW5nIG9sZFNjYWxlID0gc2NhbGU7Ci0JCXNjYWxlID0gbmV3U2NhbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUsIG9sZFNjYWxlLCBzY2FsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpIHsKLQkJcmV0dXJuIHByb2plY3RDaGFyYWN0ZXJpc3RpY3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhTdHJpbmcgbmV3UHJvamVjdENoYXJhY3RlcmlzdGljcykgewotCQlTdHJpbmcgb2xkUHJvamVjdENoYXJhY3RlcmlzdGljcyA9IHByb2plY3RDaGFyYWN0ZXJpc3RpY3M7Ci0JCXByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPSBuZXdQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTLCBvbGRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzLCBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSaXNrTGV2ZWwoKSB7Ci0JCXJldHVybiByaXNrTGV2ZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Umlza0xldmVsKFN0cmluZyBuZXdSaXNrTGV2ZWwpIHsKLQkJU3RyaW5nIG9sZFJpc2tMZXZlbCA9IHJpc2tMZXZlbDsKLQkJcmlza0xldmVsID0gbmV3Umlza0xldmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwsIG9sZFJpc2tMZXZlbCwgcmlza0xldmVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkgewotCQlyZXR1cm4gZXN0aW1hdGluZ1RlY2huaXF1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKFN0cmluZyBuZXdFc3RpbWF0aW5nVGVjaG5pcXVlKSB7Ci0JCVN0cmluZyBvbGRFc3RpbWF0aW5nVGVjaG5pcXVlID0gZXN0aW1hdGluZ1RlY2huaXF1ZTsKLQkJZXN0aW1hdGluZ1RlY2huaXF1ZSA9IG5ld0VzdGltYXRpbmdUZWNobmlxdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUsIG9sZEVzdGltYXRpbmdUZWNobmlxdWUsIGVzdGltYXRpbmdUZWNobmlxdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKSB7Ci0JCXJldHVybiBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoU3RyaW5nIG5ld1Byb2plY3RNZW1iZXJFeHBlcnRpc2UpIHsKLQkJU3RyaW5nIG9sZFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPSBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCQlwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlID0gbmV3UHJvamVjdE1lbWJlckV4cGVydGlzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0UsIG9sZFByb2plY3RNZW1iZXJFeHBlcnRpc2UsIHByb2plY3RNZW1iZXJFeHBlcnRpc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVPZkNvbnRyYWN0KCkgewotCQlyZXR1cm4gdHlwZU9mQ29udHJhY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZU9mQ29udHJhY3QoU3RyaW5nIG5ld1R5cGVPZkNvbnRyYWN0KSB7Ci0JCVN0cmluZyBvbGRUeXBlT2ZDb250cmFjdCA9IHR5cGVPZkNvbnRyYWN0OwotCQl0eXBlT2ZDb250cmFjdCA9IG5ld1R5cGVPZkNvbnRyYWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QsIG9sZFR5cGVPZkNvbnRyYWN0LCB0eXBlT2ZDb250cmFjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCQlyZXR1cm4gZ2V0U2NhbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUzoKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQkJcmV0dXJuIGdldFJpc2tMZXZlbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJCXJldHVybiBnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFOgotCQkJCXJldHVybiBnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVDoKLQkJCQlyZXR1cm4gZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQkJCXNldFNjYWxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUzoKLQkJCQlzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJCXNldFJpc2tMZXZlbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQkJc2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFOgotCQkJCXNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQkJc2V0VHlwZU9mQ29udHJhY3QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCQlzZXRTY2FsZShTQ0FMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTOgotCQkJCXNldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJCXNldFJpc2tMZXZlbChSSVNLX0xFVkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQkJc2V0RXN0aW1hdGluZ1RlY2huaXF1ZShFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCQlzZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQkJc2V0VHlwZU9mQ29udHJhY3QoVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEU6Ci0JCQkJcmV0dXJuIFNDQUxFX0VERUZBVUxUID09IG51bGwgPyBzY2FsZSAhPSBudWxsIDogIVNDQUxFX0VERUZBVUxULmVxdWFscyhzY2FsZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQkJcmV0dXJuIFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUID09IG51bGwgPyBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzICE9IG51bGwgOiAhUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQuZXF1YWxzKHByb2plY3RDaGFyYWN0ZXJpc3RpY3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQkJcmV0dXJuIFJJU0tfTEVWRUxfRURFRkFVTFQgPT0gbnVsbCA/IHJpc2tMZXZlbCAhPSBudWxsIDogIVJJU0tfTEVWRUxfRURFRkFVTFQuZXF1YWxzKHJpc2tMZXZlbCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQkJcmV0dXJuIEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUID09IG51bGwgPyBlc3RpbWF0aW5nVGVjaG5pcXVlICE9IG51bGwgOiAhRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQuZXF1YWxzKGVzdGltYXRpbmdUZWNobmlxdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCQlyZXR1cm4gUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFX0VERUZBVUxUID09IG51bGwgPyBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlICE9IG51bGwgOiAhUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFX0VERUZBVUxULmVxdWFscyhwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJCXJldHVybiBUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUID09IG51bGwgPyB0eXBlT2ZDb250cmFjdCAhPSBudWxsIDogIVRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQuZXF1YWxzKHR5cGVPZkNvbnRyYWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNjYWxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzY2FsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvamVjdENoYXJhY3RlcmlzdGljczogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJvamVjdENoYXJhY3RlcmlzdGljcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmlza0xldmVsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyaXNrTGV2ZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVzdGltYXRpbmdUZWNobmlxdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVzdGltYXRpbmdUZWNobmlxdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb2plY3RNZW1iZXJFeHBlcnRpc2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByb2plY3RNZW1iZXJFeHBlcnRpc2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGVPZkNvbnRyYWN0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlT2ZDb250cmFjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcnlQcm9jZXNzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4MjRmNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCA8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCNnZXRFZHVjYXRpb25NYXRlcmlhbCA8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcnlQcm9jZXNzSW1wbCBleHRlbmRzIFByb2Nlc3NJbXBsIGltcGxlbWVudHMgRGVsaXZlcnlQcm9jZXNzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDMoKSA8ZW0+R3JvdXAzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyeVByb2Nlc3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMygpIHsKLQkJaWYgKGdyb3VwMyA9PSBudWxsKSB7Ci0JCQlncm91cDMgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fR1JPVVAzKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMygpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFZHVjYXRpb25NYXRlcmlhbCgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDMoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0dST1VQMzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19HUk9VUDM6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAzKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMOgotCQkJCXJldHVybiBnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMOgotCQkJCXJldHVybiBnZXRFZHVjYXRpb25NYXRlcmlhbCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fR1JPVVAzOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUw6Ci0JCQkJZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTDoKLQkJCQlnZXRFZHVjYXRpb25NYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fR1JPVVAzOgotCQkJCWdldEdyb3VwMygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMOgotCQkJCWdldENvbW11bmljYXRpb25zTWF0ZXJpYWwoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUw6Ci0JCQkJZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0dST1VQMzoKLQkJCQlyZXR1cm4gZ3JvdXAzICE9IG51bGwgJiYgIWdyb3VwMy5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUw6Ci0JCQkJcmV0dXJuICFnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTDoKLQkJCQlyZXR1cm4gIWdldEVkdWNhdGlvbk1hdGVyaWFsKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZWxpdmVyeVByb2Nlc3NJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmliYWJsZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaWJhYmxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjNmYmM3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaWJhYmxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlc2NyaWJhYmxlRWxlbWVudEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmliYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXROb2RlaWNvbiA8ZW0+Tm9kZWljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXRQcmVzZW50YXRpb25OYW1lIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpYmFibGVFbGVtZW50SW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRGVzY3JpYmFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb24oKSA8ZW0+UHJlc2VudGF0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RGVzY3JpcHRpb24gcHJlc2VudGF0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb2RlaWNvbigpIDxlbT5Ob2RlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm9kZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVJQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vZGVpY29uKCkgPGVtPk5vZGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb2RlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBub2RlaWNvbiA9IE5PREVJQ09OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbk5hbWUoKSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbk5hbWUoKSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNoYXBlaWNvbigpIDxlbT5TaGFwZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNoYXBlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUEVJQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNoYXBlaWNvbigpIDxlbT5TaGFwZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNoYXBlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzaGFwZWljb24gPSBTSEFQRUlDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpYmFibGVFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudERlc2NyaXB0aW9uIGdldFByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIHByZXNlbnRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uIG5ld1ByZXNlbnRhdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb250ZW50RGVzY3JpcHRpb24gb2xkUHJlc2VudGF0aW9uID0gcHJlc2VudGF0aW9uOwotCQlwcmVzZW50YXRpb24gPSBuZXdQcmVzZW50YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLCBvbGRQcmVzZW50YXRpb24sIG5ld1ByZXNlbnRhdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VudGF0aW9uKENvbnRlbnREZXNjcmlwdGlvbiBuZXdQcmVzZW50YXRpb24pIHsKLQkJaWYgKG5ld1ByZXNlbnRhdGlvbiAhPSBwcmVzZW50YXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByZXNlbnRhdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwcmVzZW50YXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJlc2VudGF0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ByZXNlbnRhdGlvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByZXNlbnRhdGlvbihuZXdQcmVzZW50YXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sIG5ld1ByZXNlbnRhdGlvbiwgbmV3UHJlc2VudGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlaWNvbigpIHsKLQkJcmV0dXJuIG5vZGVpY29uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVpY29uKFN0cmluZyBuZXdOb2RlaWNvbikgewotCQlTdHJpbmcgb2xkTm9kZWljb24gPSBub2RlaWNvbjsKLQkJbm9kZWljb24gPSBuZXdOb2RlaWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTiwgb2xkTm9kZWljb24sIG5vZGVpY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVzZW50YXRpb25OYW1lKCkgewotCQlyZXR1cm4gcHJlc2VudGF0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50YXRpb25OYW1lKFN0cmluZyBuZXdQcmVzZW50YXRpb25OYW1lKSB7Ci0JCVN0cmluZyBvbGRQcmVzZW50YXRpb25OYW1lID0gcHJlc2VudGF0aW9uTmFtZTsKLQkJcHJlc2VudGF0aW9uTmFtZSA9IG5ld1ByZXNlbnRhdGlvbk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUsIG9sZFByZXNlbnRhdGlvbk5hbWUsIHByZXNlbnRhdGlvbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNoYXBlaWNvbigpIHsKLQkJcmV0dXJuIHNoYXBlaWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaGFwZWljb24oU3RyaW5nIG5ld1NoYXBlaWNvbikgewotCQlTdHJpbmcgb2xkU2hhcGVpY29uID0gc2hhcGVpY29uOwotCQlzaGFwZWljb24gPSBuZXdTaGFwZWljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OLCBvbGRTaGFwZWljb24sIHNoYXBlaWNvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UHJlc2VudGF0aW9uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOgotCQkJCXJldHVybiBnZXRQcmVzZW50YXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjoKLQkJCQlyZXR1cm4gZ2V0Tm9kZWljb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCQlyZXR1cm4gZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCQlyZXR1cm4gZ2V0U2hhcGVpY29uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQkJc2V0UHJlc2VudGF0aW9uKChDb250ZW50RGVzY3JpcHRpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjoKLQkJCQlzZXROb2RlaWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJc2V0UHJlc2VudGF0aW9uTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJCXNldFNoYXBlaWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCQlzZXRQcmVzZW50YXRpb24oKENvbnRlbnREZXNjcmlwdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT046Ci0JCQkJc2V0Tm9kZWljb24oTk9ERUlDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCQlzZXRQcmVzZW50YXRpb25OYW1lKFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJCXNldFNoYXBlaWNvbihTSEFQRUlDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCQlyZXR1cm4gcHJlc2VudGF0aW9uICE9IG51bGw7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT046Ci0JCQkJcmV0dXJuIE5PREVJQ09OX0VERUZBVUxUID09IG51bGwgPyBub2RlaWNvbiAhPSBudWxsIDogIU5PREVJQ09OX0VERUZBVUxULmVxdWFscyhub2RlaWNvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJcmV0dXJuIFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwcmVzZW50YXRpb25OYW1lICE9IG51bGwgOiAhUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQuZXF1YWxzKHByZXNlbnRhdGlvbk5hbWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCQlyZXR1cm4gU0hBUEVJQ09OX0VERUZBVUxUID09IG51bGwgPyBzaGFwZWljb24gIT0gbnVsbCA6ICFTSEFQRUlDT05fRURFRkFVTFQuZXF1YWxzKHNoYXBlaWNvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChub2RlaWNvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm9kZWljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZXNlbnRhdGlvbk5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZXNlbnRhdGlvbk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNoYXBlaWNvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2hhcGVpY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVzY3JpYmFibGVFbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzYzg1ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgRGVzY3JpcHRvckRlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkgPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKSA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlZmluZWREZXNjcmlwdGlvbiA9IFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUl9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmluZWREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHJlZmluZWREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nIG5ld1JlZmluZWREZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkUmVmaW5lZERlc2NyaXB0aW9uID0gcmVmaW5lZERlc2NyaXB0aW9uOwotCQlyZWZpbmVkRGVzY3JpcHRpb24gPSBuZXdSZWZpbmVkRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiwgb2xkUmVmaW5lZERlc2NyaXB0aW9uLCByZWZpbmVkRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJCXNldFJlZmluZWREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT046Ci0JCQkJc2V0UmVmaW5lZERlc2NyaXB0aW9uKFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJlZmluZWREZXNjcmlwdGlvbiAhPSBudWxsIDogIVJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKHJlZmluZWREZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyZWZpbmVkRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlZmluZWREZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaXB0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4MTE0ZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpcHRvckltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbCNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvckltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIERlc2NyaXB0b3IgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuIG5ld0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSkgewotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlLCAhb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJYm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldDsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUOwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxULCBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQl1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQlyZXR1cm4gaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTogIik7Ci0JCWlmIChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0KSByZXN1bHQuYXBwZW5kKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZXNjcmlwdG9ySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGlzY2lwbGluZUdyb3VwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5Mjc5NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzY2lwbGluZSBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwjZ2V0RGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0ltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgRGlzY2lwbGluZUdyb3VwaW5nIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX0dST1VQSU5HOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkU6Ci0JCQkJcmV0dXJuIGdldERpc2NpcGxpbmUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkU6Ci0JCQkJZ2V0RGlzY2lwbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzY2lwbGluZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORToKLQkJCQlnZXREaXNjaXBsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkU6Ci0JCQkJcmV0dXJuICFnZXREaXNjaXBsaW5lKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EaXNjaXBsaW5lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EaXNjaXBsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzM2YTU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGlzY2lwbGluZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERpc2NpcGxpbmVJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCNnZXRTdWJEaXNjaXBsaW5lIDxlbT5TdWIgRGlzY2lwbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCNnZXRSZWZlcmVuY2VXb3JrZmxvdyA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgRGlzY2lwbGluZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlzY2lwbGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRhc2soKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19UQVNLKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U3ViRGlzY2lwbGluZSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmVmZXJlbmNlV29ya2Zsb3coKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1cpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U3ViRGlzY2lwbGluZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0s6Ci0JCQkJcmV0dXJuIGdldFRhc2soKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORToKLQkJCQlyZXR1cm4gZ2V0U3ViRGlzY2lwbGluZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPVzoKLQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlV29ya2Zsb3coKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0s6Ci0JCQkJZ2V0VGFzaygpLmNsZWFyKCk7Ci0JCQkJZ2V0VGFzaygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FOgotCQkJCWdldFN1YkRpc2NpcGxpbmUoKS5jbGVhcigpOwotCQkJCWdldFN1YkRpc2NpcGxpbmUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1c6Ci0JCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3coKS5jbGVhcigpOwotCQkJCWdldFJlZmVyZW5jZVdvcmtmbG93KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19UQVNLOgotCQkJCWdldFRhc2soKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORToKLQkJCQlnZXRTdWJEaXNjaXBsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XOgotCQkJCWdldFJlZmVyZW5jZVdvcmtmbG93KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0s6Ci0JCQkJcmV0dXJuICFnZXRUYXNrKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FOgotCQkJCXJldHVybiAhZ2V0U3ViRGlzY2lwbGluZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1c6Ci0JCQkJcmV0dXJuICFnZXRSZWZlcmVuY2VXb3JrZmxvdygpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGlzY2lwbGluZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RvY3VtZW50Um9vdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTdmMDdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9jdW1lbnRSb290SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmltcGwuRURhdGFPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZUVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb2N1bWVudCBSb290PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0TWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFJvb3RJbXBsIGV4dGVuZHMgRURhdGFPYmplY3RJbXBsIGltcGxlbWVudHMgRG9jdW1lbnRSb290IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaXhlZCgpIDxlbT5NaXhlZDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaXhlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgbWl4ZWQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WE1MTlNQcmVmaXhNYXAoKSA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTWFwIHhNTE5TUHJlZml4TWFwID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkgPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4U0lTY2hlbWFMb2NhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRSb290SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRNaXhlZCgpIHsKLQkJaWYgKG1peGVkID09IG51bGwpIHsKLQkJCW1peGVkID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEKTsKLQkJfQotCQlyZXR1cm4gbWl4ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKSB7Ci0JCWlmICh4TUxOU1ByZWZpeE1hcCA9PSBudWxsKSB7Ci0JCQl4TUxOU1ByZWZpeE1hcCA9IG5ldyBFY29yZUVNYXAoRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkdfVE9fU1RSSU5HX01BUF9FTlRSWSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVApOwotCQl9Ci0JCXJldHVybiB4TUxOU1ByZWZpeE1hcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU1hcCBnZXRYU0lTY2hlbWFMb2NhdGlvbigpIHsKLQkJaWYgKHhTSVNjaGVtYUxvY2F0aW9uID09IG51bGwpIHsKLQkJCXhTSVNjaGVtYUxvY2F0aW9uID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTik7Ci0JCX0KLQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiAoTWV0aG9kQ29uZmlndXJhdGlvbilnZXRNaXhlZCgpLmdldChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gbmV3TWV0aG9kQ29uZmlndXJhdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmJhc2ljQWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT04sIG5ld01ldGhvZENvbmZpZ3VyYXRpb24sIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBuZXdNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTiwgbmV3TWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TWV0aG9kTGlicmFyeSgpIHsKLQkJcmV0dXJuIChNZXRob2RMaWJyYXJ5KWdldE1peGVkKCkuZ2V0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlksIHRydWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBuZXdNZXRob2RMaWJyYXJ5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuYmFzaWNBZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWSwgbmV3TWV0aG9kTGlicmFyeSwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IG5ld01ldGhvZExpYnJhcnkpIHsKLQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZLCBuZXdNZXRob2RMaWJyYXJ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbigpIHsKLQkJcmV0dXJuIChNZXRob2RQbHVnaW4pZ2V0TWl4ZWQoKS5nZXQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luIG5ld01ldGhvZFBsdWdpbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmJhc2ljQWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX1BMVUdJTiwgbmV3TWV0aG9kUGx1Z2luLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luIG5ld01ldGhvZFBsdWdpbikgewotCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX1BMVUdJTiwgbmV3TWV0aG9kUGx1Z2luKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNaXhlZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFhNTE5TUHJlZml4TWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBiYXNpY1NldE1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlk6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TWV0aG9kTGlicmFyeShudWxsLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiBiYXNpY1NldE1ldGhvZFBsdWdpbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldE1peGVkKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRYTUxOU1ByZWZpeE1hcCgpOwotCQkJCWVsc2UgcmV0dXJuIGdldFhNTE5TUHJlZml4TWFwKCkubWFwKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwotCQkJCWVsc2UgcmV0dXJuIGdldFhTSVNjaGVtYUxvY2F0aW9uKCkubWFwKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJcmV0dXJuIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWToKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kTGlicmFyeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU46Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBsdWdpbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZylnZXRYTUxOU1ByZWZpeE1hcCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJc2V0TWV0aG9kQ29uZmlndXJhdGlvbigoTWV0aG9kQ29uZmlndXJhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZOgotCQkJCXNldE1ldGhvZExpYnJhcnkoKE1ldGhvZExpYnJhcnkpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOOgotCQkJCXNldE1ldGhvZFBsdWdpbigoTWV0aG9kUGx1Z2luKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKChNZXRob2RDb25maWd1cmF0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWToKLQkJCQlzZXRNZXRob2RMaWJyYXJ5KChNZXRob2RMaWJyYXJ5KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOOgotCQkJCXNldE1ldGhvZFBsdWdpbigoTWV0aG9kUGx1Z2luKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCXJldHVybiBtaXhlZCAhPSBudWxsICYmICFtaXhlZC5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlyZXR1cm4geE1MTlNQcmVmaXhNYXAgIT0gbnVsbCAmJiAheE1MTlNQcmVmaXhNYXAuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uICE9IG51bGwgJiYgIXhTSVNjaGVtYUxvY2F0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpICE9IG51bGw7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlk6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZExpYnJhcnkoKSAhPSBudWxsOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU46Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBsdWdpbigpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtaXhlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWl4ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Eb2N1bWVudFJvb3RJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Eb21haW5JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RvbWFpbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDZkMThhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RvbWFpbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERvbWFpbkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb21haW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9tYWluSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9tYWluSW1wbCNnZXRTdWJkb21haW4gPGVtPlN1YmRvbWFpbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERvbWFpbkltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgRG9tYWluIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEb21haW5JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ET01BSU5fX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0V29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU5fX1dPUktfUFJPRFVDVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFN1YmRvbWFpbigpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPTUFJTl9fU1VCRE9NQUlOKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U3ViZG9tYWluKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVDoKLQkJCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTjoKLQkJCQlyZXR1cm4gZ2V0U3ViZG9tYWluKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUOgotCQkJCWdldFdvcmtQcm9kdWN0KCkuY2xlYXIoKTsKLQkJCQlnZXRXb3JrUHJvZHVjdCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOOgotCQkJCWdldFN1YmRvbWFpbigpLmNsZWFyKCk7Ci0JCQkJZ2V0U3ViZG9tYWluKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUOgotCQkJCWdldFdvcmtQcm9kdWN0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU46Ci0JCQkJZ2V0U3ViZG9tYWluKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19XT1JLX1BST0RVQ1Q6Ci0JCQkJcmV0dXJuICFnZXRXb3JrUHJvZHVjdCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTjoKLQkJCQlyZXR1cm4gIWdldFN1YmRvbWFpbigpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRG9tYWluSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmU3OTU3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVsZW1lbnRJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5pbXBsLkVEYXRhT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudEltcGwgZXh0ZW5kcyBFRGF0YU9iamVjdEltcGwgaW1wbGVtZW50cyBFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVMRU1FTlQ7Ci0JfQotCi19IC8vRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDhkNTJiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGVJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0ZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsI2dldEVzdGltYXRpb25NZXRyaWMgPGVtPkVzdGltYXRpb24gTWV0cmljPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRlSW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFc3RpbWF0ZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBFc3RpbWF0ZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXN0aW1hdGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFURTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkVTVElNQVRFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVzdGltYXRpb25NZXRyaWMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFURV9fRVNUSU1BVElPTl9NRVRSSUMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fTUVUUklDOgotCQkJCXJldHVybiBnZXRFc3RpbWF0aW9uTWV0cmljKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQzoKLQkJCQlnZXRFc3RpbWF0aW9uTWV0cmljKCkuY2xlYXIoKTsKLQkJCQlnZXRFc3RpbWF0aW9uTWV0cmljKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9NRVRSSUM6Ci0JCQkJZ2V0RXN0aW1hdGlvbk1ldHJpYygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fTUVUUklDOgotCQkJCXJldHVybiAhZ2V0RXN0aW1hdGlvbk1ldHJpYygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gIWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRXN0aW1hdGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0aW5nTWV0cmljSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0aW5nTWV0cmljSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMDI1MThmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXN0aW1hdGluZ01ldHJpY0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGluZ01ldHJpY0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Fc3RpbWF0aW5nIE1ldHJpYzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVzdGltYXRpbmdNZXRyaWNJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgRXN0aW1hdGluZ01ldHJpYyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVzdGltYXRpbmdNZXRyaWNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFUSU5HX01FVFJJQzsKLQl9Ci0KLX0gLy9Fc3RpbWF0aW5nTWV0cmljSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUwYjNlMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQl9Ci0KLX0gLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9FeGFtcGxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9FeGFtcGxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkODI3YjJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXhhbXBsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXhhbXBsZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXhhbXBsZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBFeGFtcGxlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXhhbXBsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVYQU1QTEU7Ci0JfQotCi19IC8vRXhhbXBsZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0d1aWRhbmNlRGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0d1aWRhbmNlRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4MDVhZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9HdWlkYW5jZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2UgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwjZ2V0QXR0YWNobWVudCA8ZW0+QXR0YWNobWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIEd1aWRhbmNlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRhY2htZW50KCkgPGVtPkF0dGFjaG1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dGFjaG1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVEFDSE1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0YWNobWVudCgpIDxlbT5BdHRhY2htZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRhY2htZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dGFjaG1lbnQgPSBBVFRBQ0hNRU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRhbmNlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dGFjaG1lbnQoKSB7Ci0JCXJldHVybiBhdHRhY2htZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dGFjaG1lbnQoU3RyaW5nIG5ld0F0dGFjaG1lbnQpIHsKLQkJU3RyaW5nIG9sZEF0dGFjaG1lbnQgPSBhdHRhY2htZW50OwotCQlhdHRhY2htZW50ID0gbmV3QXR0YWNobWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVCwgb2xkQXR0YWNobWVudCwgYXR0YWNobWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVDoKLQkJCQlyZXR1cm4gZ2V0QXR0YWNobWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQ6Ci0JCQkJc2V0QXR0YWNobWVudCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UOgotCQkJCXNldEF0dGFjaG1lbnQoQVRUQUNITUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQ6Ci0JCQkJcmV0dXJuIEFUVEFDSE1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGF0dGFjaG1lbnQgIT0gbnVsbCA6ICFBVFRBQ0hNRU5UX0VERUZBVUxULmVxdWFscyhhdHRhY2htZW50KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dGFjaG1lbnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dGFjaG1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9HdWlkYW5jZURlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGFuY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0d1aWRhbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMjQxMjBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGFuY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEd1aWRhbmNlSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkYW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEd1aWRhbmNlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGFuY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRTsKLQl9Ci0KLX0gLy9HdWlkYW5jZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0d1aWRlbGluZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGVsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YmFkYWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGVsaW5lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBHdWlkZWxpbmVJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkZWxpbmVJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgR3VpZGVsaW5lIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGVsaW5lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1VJREVMSU5FOwotCX0KLQotfSAvL0d1aWRlbGluZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0l0ZXJhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYWZkNWRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBJdGVyYXRpb25JbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JdGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVyYXRpb25JbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMgSXRlcmF0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuSVRFUkFUSU9OOwotCX0KLQotfSAvL0l0ZXJhdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2MTM0OTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kQ29uZmlndXJhdGlvbkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0QmFzZUNvbmZpZ3VyYXRpb24gPGVtPkJhc2UgQ29uZmlndXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24gPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXREZWZhdWx0VmlldyA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldFByb2Nlc3NWaWV3IDxlbT5Qcm9jZXNzIFZpZXc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uSW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMgTWV0aG9kQ29uZmlndXJhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZUNvbmZpZ3VyYXRpb24oKSA8ZW0+QmFzZSBDb25maWd1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYmFzZUNvbmZpZ3VyYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkgPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGhvZFBsdWdpblNlbGVjdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkgPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kUGFja2FnZVNlbGVjdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFZpZXcoKSA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VmlldygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WSUVXX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRWaWV3KCkgPGVtPkRlZmF1bHQgVmlldzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFZpZXcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZpZXcgPSBERUZBVUxUX1ZJRVdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9jZXNzVmlldygpIDxlbT5Qcm9jZXNzIFZpZXc8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvY2Vzc1ZpZXcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwcm9jZXNzVmlldyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRCYXNlQ29uZmlndXJhdGlvbigpIHsKLQkJaWYgKGJhc2VDb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCWJhc2VDb25maWd1cmF0aW9uID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OKTsKLQkJfQotCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpIHsKLQkJaWYgKG1ldGhvZFBsdWdpblNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQltZXRob2RQbHVnaW5TZWxlY3Rpb24gPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTik7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBsdWdpblNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpIHsKLQkJaWYgKG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJbWV0aG9kUGFja2FnZVNlbGVjdGlvbiA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTik7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBhY2thZ2VTZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmlldygpIHsKLQkJcmV0dXJuIGRlZmF1bHRWaWV3OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWaWV3KFN0cmluZyBuZXdEZWZhdWx0VmlldykgewotCQlTdHJpbmcgb2xkRGVmYXVsdFZpZXcgPSBkZWZhdWx0VmlldzsKLQkJZGVmYXVsdFZpZXcgPSBuZXdEZWZhdWx0VmlldzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXLCBvbGREZWZhdWx0VmlldywgZGVmYXVsdFZpZXcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UHJvY2Vzc1ZpZXcoKSB7Ci0JCWlmIChwcm9jZXNzVmlldyA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzVmlldyA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVyk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NWaWV3OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBnZXRCYXNlQ29uZmlndXJhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWaWV3KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVzoKLQkJCQlyZXR1cm4gZ2V0UHJvY2Vzc1ZpZXcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT046Ci0JCQkJZ2V0QmFzZUNvbmZpZ3VyYXRpb24oKS5jbGVhcigpOwotCQkJCWdldEJhc2VDb25maWd1cmF0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJCWdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCQlnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVzoKLQkJCQlzZXREZWZhdWx0VmlldygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVzoKLQkJCQlnZXRQcm9jZXNzVmlldygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvY2Vzc1ZpZXcoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTjoKLQkJCQlnZXRCYXNlQ29uZmlndXJhdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCQlnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJCWdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJCXNldERlZmF1bHRWaWV3KERFRkFVTFRfVklFV19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVc6Ci0JCQkJZ2V0UHJvY2Vzc1ZpZXcoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT046Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uICE9IG51bGwgJiYgIWJhc2VDb25maWd1cmF0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT046Ci0JCQkJcmV0dXJuIG1ldGhvZFBsdWdpblNlbGVjdGlvbiAhPSBudWxsICYmICFtZXRob2RQbHVnaW5TZWxlY3Rpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT046Ci0JCQkJcmV0dXJuIG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gIT0gbnVsbCAmJiAhbWV0aG9kUGFja2FnZVNlbGVjdGlvbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVzoKLQkJCQlyZXR1cm4gREVGQVVMVF9WSUVXX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0VmlldyAhPSBudWxsIDogIURFRkFVTFRfVklFV19FREVGQVVMVC5lcXVhbHMoZGVmYXVsdFZpZXcpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVc6Ci0JCQkJcmV0dXJuIHByb2Nlc3NWaWV3ICE9IG51bGwgJiYgIXByb2Nlc3NWaWV3LmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGJhc2VDb25maWd1cmF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChiYXNlQ29uZmlndXJhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWV0aG9kUGx1Z2luU2VsZWN0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtZXRob2RQbHVnaW5TZWxlY3Rpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1ldGhvZFBhY2thZ2VTZWxlY3Rpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRWaWV3OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0Vmlldyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvY2Vzc1ZpZXc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByb2Nlc3NWaWV3KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kQ29uZmlndXJhdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1YjNmNjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kRWxlbWVudEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRPd25lZFJ1bGUgPGVtPk93bmVkIFJ1bGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2lzU3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRJbXBsIGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwKCkgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBicmllZkRlc2NyaXB0aW9uID0gQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmRlcmluZ0d1aWRlKCkgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcmRlcmluZ0d1aWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRFUklOR19HVUlERV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmRlcmluZ0d1aWRlKCkgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcmRlcmluZ0d1aWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG9yZGVyaW5nR3VpZGUgPSBPUkRFUklOR19HVUlERV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N1cHByZXNzZWQoKSA8ZW0+U3VwcHJlc3NlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTdXBwcmVzc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1VQUFJFU1NFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdXBwcmVzc2VkKCkgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3VwcHJlc3NlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcHJlc3NlZCA9IFNVUFBSRVNTRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFN1cHByZXNzZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN1cHByZXNzZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwKCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkgewotCQkJZ3JvdXAgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE93bmVkUnVsZSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QnJpZWZEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGJyaWVmRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihTdHJpbmcgbmV3QnJpZWZEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkQnJpZWZEZXNjcmlwdGlvbiA9IGJyaWVmRGVzY3JpcHRpb247Ci0JCWJyaWVmRGVzY3JpcHRpb24gPSBuZXdCcmllZkRlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiwgb2xkQnJpZWZEZXNjcmlwdGlvbiwgYnJpZWZEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9yZGVyaW5nR3VpZGUoKSB7Ci0JCXJldHVybiBvcmRlcmluZ0d1aWRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9yZGVyaW5nR3VpZGUoU3RyaW5nIG5ld09yZGVyaW5nR3VpZGUpIHsKLQkJU3RyaW5nIG9sZE9yZGVyaW5nR3VpZGUgPSBvcmRlcmluZ0d1aWRlOwotCQlvcmRlcmluZ0d1aWRlID0gbmV3T3JkZXJpbmdHdWlkZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUsIG9sZE9yZGVyaW5nR3VpZGUsIG9yZGVyaW5nR3VpZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHByZXNzZWQoKSB7Ci0JCXJldHVybiBzdXBwcmVzc2VkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cHByZXNzZWQoYm9vbGVhbiBuZXdTdXBwcmVzc2VkKSB7Ci0JCWJvb2xlYW4gb2xkU3VwcHJlc3NlZCA9IHN1cHByZXNzZWQ7Ci0JCXN1cHByZXNzZWQgPSBuZXdTdXBwcmVzc2VkOwotCQlib29sZWFuIG9sZFN1cHByZXNzZWRFU2V0ID0gc3VwcHJlc3NlZEVTZXQ7Ci0JCXN1cHByZXNzZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCwgb2xkU3VwcHJlc3NlZCwgc3VwcHJlc3NlZCwgIW9sZFN1cHByZXNzZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTdXBwcmVzc2VkKCkgewotCQlib29sZWFuIG9sZFN1cHByZXNzZWQgPSBzdXBwcmVzc2VkOwotCQlib29sZWFuIG9sZFN1cHByZXNzZWRFU2V0ID0gc3VwcHJlc3NlZEVTZXQ7Ci0JCXN1cHByZXNzZWQgPSBTVVBQUkVTU0VEX0VERUZBVUxUOwotCQlzdXBwcmVzc2VkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQsIG9sZFN1cHByZXNzZWQsIFNVUFBSRVNTRURfRURFRkFVTFQsIG9sZFN1cHByZXNzZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTdXBwcmVzc2VkKCkgewotCQlyZXR1cm4gc3VwcHJlc3NlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HUk9VUDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE93bmVkUnVsZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1JPVVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRToKLQkJCQlyZXR1cm4gZ2V0T3duZWRSdWxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCQlyZXR1cm4gZ2V0T3JkZXJpbmdHdWlkZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJCXJldHVybiBpc1N1cHByZXNzZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1JPVVA6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOgotCQkJCWdldE93bmVkUnVsZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0T3duZWRSdWxlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOgotCQkJCXNldEJyaWVmRGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJCXNldE9yZGVyaW5nR3VpZGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJCXNldFN1cHByZXNzZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1JPVVA6Ci0JCQkJZ2V0R3JvdXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRToKLQkJCQlnZXRPd25lZFJ1bGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQkJc2V0QnJpZWZEZXNjcmlwdGlvbihCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCQlzZXRPcmRlcmluZ0d1aWRlKE9SREVSSU5HX0dVSURFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCQkJdW5zZXRTdXBwcmVzc2VkKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dST1VQOgotCQkJCXJldHVybiBncm91cCAhPSBudWxsICYmICFncm91cC5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU6Ci0JCQkJcmV0dXJuICFnZXRPd25lZFJ1bGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gYnJpZWZEZXNjcmlwdGlvbiAhPSBudWxsIDogIUJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhicmllZkRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJCXJldHVybiBPUkRFUklOR19HVUlERV9FREVGQVVMVCA9PSBudWxsID8gb3JkZXJpbmdHdWlkZSAhPSBudWxsIDogIU9SREVSSU5HX0dVSURFX0VERUZBVUxULmVxdWFscyhvcmRlcmluZ0d1aWRlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJCQlyZXR1cm4gaXNTZXRTdXBwcmVzc2VkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJyaWVmRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJyaWVmRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3JkZXJpbmdHdWlkZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3JkZXJpbmdHdWlkZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3VwcHJlc3NlZDogIik7Ci0JCWlmIChzdXBwcmVzc2VkRVNldCkgcmVzdWx0LmFwcGVuZChzdXBwcmVzc2VkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZEVsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RMaWJyYXJ5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RMaWJyYXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNTI3NTE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kTGlicmFyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZExpYnJhcnlJbXBsLmphdmEsdiAxLjQgMjAwNi8wOS8wOCAwMDo1OToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIExpYnJhcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwjZ2V0TWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsI2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsI2dldFRvb2wgPGVtPlRvb2w8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5SW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMgTWV0aG9kTGlicmFyeSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGx1Z2luKCkgPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kUGx1Z2luID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKSA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGhvZENvbmZpZ3VyYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvb2woKSA8ZW0+VG9vbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9vbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb29sKCkgPGVtPlRvb2w8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdG9vbCA9IFRPT0xfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXRob2RQbHVnaW4oKSB7Ci0JCWlmIChtZXRob2RQbHVnaW4gPT0gbnVsbCkgewotCQkJbWV0aG9kUGx1Z2luID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1ldGhvZFBsdWdpbi5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTik7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJaWYgKG1ldGhvZENvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJbWV0aG9kQ29uZmlndXJhdGlvbiA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfQ09ORklHVVJBVElPTik7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sKCkgewotCQlyZXR1cm4gdG9vbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb29sKFN0cmluZyBuZXdUb29sKSB7Ci0JCVN0cmluZyBvbGRUb29sID0gdG9vbDsKLQkJdG9vbCA9IG5ld1Rvb2w7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1RPT0wsIG9sZFRvb2wsIHRvb2wpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU46Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RQbHVnaW4oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU46Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBsdWdpbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19UT09MOgotCQkJCXJldHVybiBnZXRUb29sKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTjoKLQkJCQlnZXRNZXRob2RQbHVnaW4oKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBsdWdpbigpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1RPT0w6Ci0JCQkJc2V0VG9vbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOOgotCQkJCWdldE1ldGhvZFBsdWdpbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1RPT0w6Ci0JCQkJc2V0VG9vbChUT09MX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTjoKLQkJCQlyZXR1cm4gbWV0aG9kUGx1Z2luICE9IG51bGwgJiYgIW1ldGhvZFBsdWdpbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uICE9IG51bGwgJiYgIW1ldGhvZENvbmZpZ3VyYXRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19UT09MOgotCQkJCXJldHVybiBUT09MX0VERUZBVUxUID09IG51bGwgPyB0b29sICE9IG51bGwgOiAhVE9PTF9FREVGQVVMVC5lcXVhbHModG9vbCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0b29sOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0b29sKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kTGlicmFyeUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMzRhMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kUGFja2FnZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2dldFJldXNlZFBhY2thZ2UgPGVtPlJldXNlZCBQYWNrYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2dldE1ldGhvZFBhY2thZ2UgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2lzR2xvYmFsIDxlbT5HbG9iYWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQYWNrYWdlSW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgTWV0aG9kUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAxKCkgPGVtPkdyb3VwMTwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHbG9iYWwoKSA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0dsb2JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdMT0JBTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHbG9iYWwoKSA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0dsb2JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2xvYmFsID0gR0xPQkFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBHbG9iYWwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdsb2JhbEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAxKCkgewotCQlpZiAoZ3JvdXAxID09IG51bGwpIHsKLQkJCWdyb3VwMSA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR1JPVVAxKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAxOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZXVzZWRQYWNrYWdlKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMSgpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0aG9kUGFja2FnZSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDEoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKSB7Ci0JCXJldHVybiBnbG9iYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2xvYmFsKGJvb2xlYW4gbmV3R2xvYmFsKSB7Ci0JCWJvb2xlYW4gb2xkR2xvYmFsID0gZ2xvYmFsOwotCQlnbG9iYWwgPSBuZXdHbG9iYWw7Ci0JCWJvb2xlYW4gb2xkR2xvYmFsRVNldCA9IGdsb2JhbEVTZXQ7Ci0JCWdsb2JhbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUwsIG9sZEdsb2JhbCwgZ2xvYmFsLCAhb2xkR2xvYmFsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0R2xvYmFsKCkgewotCQlib29sZWFuIG9sZEdsb2JhbCA9IGdsb2JhbDsKLQkJYm9vbGVhbiBvbGRHbG9iYWxFU2V0ID0gZ2xvYmFsRVNldDsKLQkJZ2xvYmFsID0gR0xPQkFMX0VERUZBVUxUOwotCQlnbG9iYWxFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMLCBvbGRHbG9iYWwsIEdMT0JBTF9FREVGQVVMVCwgb2xkR2xvYmFsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0R2xvYmFsKCkgewotCQlyZXR1cm4gZ2xvYmFsRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dST1VQMToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kUGFja2FnZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR1JPVVAxOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMSgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuIGdldFJldXNlZFBhY2thZ2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBhY2thZ2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJCXJldHVybiBpc0dsb2JhbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HUk9VUDE6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0U6Ci0JCQkJZ2V0UmV1c2VkUGFja2FnZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0UmV1c2VkUGFja2FnZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRToKLQkJCQlnZXRNZXRob2RQYWNrYWdlKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RQYWNrYWdlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDoKLQkJCQlzZXRHbG9iYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRToKLQkJCQlnZXRSZXVzZWRQYWNrYWdlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOgotCQkJCWdldE1ldGhvZFBhY2thZ2UoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJCXVuc2V0R2xvYmFsKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dST1VQMToKLQkJCQlyZXR1cm4gZ3JvdXAxICE9IG51bGwgJiYgIWdyb3VwMS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFOgotCQkJCXJldHVybiAhZ2V0UmV1c2VkUGFja2FnZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuICFnZXRNZXRob2RQYWNrYWdlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQkJcmV0dXJuIGlzU2V0R2xvYmFsKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ2xvYmFsOiAiKTsKLQkJaWYgKGdsb2JhbEVTZXQpIHJlc3VsdC5hcHBlbmQoZ2xvYmFsKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFBhY2thZ2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RQbHVnaW5JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFBsdWdpbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGUxMWIxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFBsdWdpbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZFBsdWdpbkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwjZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbiA8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwjZ2V0TWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCNpc1VzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQbHVnaW5JbXBsIGV4dGVuZHMgTWV0aG9kVW5pdEltcGwgaW1wbGVtZW50cyBNZXRob2RQbHVnaW4gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKSA8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZWZlcmVuY2VkTWV0aG9kUGx1Z2luID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBhY2thZ2UoKSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGhvZFBhY2thZ2UgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlckNoYW5nZWFibGUoKSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1VzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VzZXJDaGFuZ2VhYmxlKCkgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNVc2VyQ2hhbmdlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlckNoYW5nZWFibGUgPSBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFVzZXIgQ2hhbmdlYWJsZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlckNoYW5nZWFibGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kUGx1Z2luSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpIHsKLQkJaWYgKHJlZmVyZW5jZWRNZXRob2RQbHVnaW4gPT0gbnVsbCkgewotCQkJcmVmZXJlbmNlZE1ldGhvZFBsdWdpbiA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOKTsKLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlZE1ldGhvZFBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0aG9kUGFja2FnZSgpIHsKLQkJaWYgKG1ldGhvZFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbWV0aG9kUGFja2FnZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXRob2RQYWNrYWdlLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzZXJDaGFuZ2VhYmxlKCkgewotCQlyZXR1cm4gdXNlckNoYW5nZWFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlckNoYW5nZWFibGUoYm9vbGVhbiBuZXdVc2VyQ2hhbmdlYWJsZSkgewotCQlib29sZWFuIG9sZFVzZXJDaGFuZ2VhYmxlID0gdXNlckNoYW5nZWFibGU7Ci0JCXVzZXJDaGFuZ2VhYmxlID0gbmV3VXNlckNoYW5nZWFibGU7Ci0JCWJvb2xlYW4gb2xkVXNlckNoYW5nZWFibGVFU2V0ID0gdXNlckNoYW5nZWFibGVFU2V0OwotCQl1c2VyQ2hhbmdlYWJsZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSwgb2xkVXNlckNoYW5nZWFibGUsIHVzZXJDaGFuZ2VhYmxlLCAhb2xkVXNlckNoYW5nZWFibGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRVc2VyQ2hhbmdlYWJsZSgpIHsKLQkJYm9vbGVhbiBvbGRVc2VyQ2hhbmdlYWJsZSA9IHVzZXJDaGFuZ2VhYmxlOwotCQlib29sZWFuIG9sZFVzZXJDaGFuZ2VhYmxlRVNldCA9IHVzZXJDaGFuZ2VhYmxlRVNldDsKLQkJdXNlckNoYW5nZWFibGUgPSBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQ7Ci0JCXVzZXJDaGFuZ2VhYmxlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFLCBvbGRVc2VyQ2hhbmdlYWJsZSwgVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxULCBvbGRVc2VyQ2hhbmdlYWJsZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFVzZXJDaGFuZ2VhYmxlKCkgewotCQlyZXR1cm4gdXNlckNoYW5nZWFibGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZFBhY2thZ2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiBnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBhY2thZ2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEU6Ci0JCQkJcmV0dXJuIGlzVXNlckNoYW5nZWFibGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU46Ci0JCQkJZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFOgotCQkJCWdldE1ldGhvZFBhY2thZ2UoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBhY2thZ2UoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEU6Ci0JCQkJc2V0VXNlckNoYW5nZWFibGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU46Ci0JCQkJZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFOgotCQkJCWdldE1ldGhvZFBhY2thZ2UoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEU6Ci0JCQkJdW5zZXRVc2VyQ2hhbmdlYWJsZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1JFRkVSRU5DRURfTUVUSE9EX1BMVUdJTjoKLQkJCQlyZXR1cm4gcmVmZXJlbmNlZE1ldGhvZFBsdWdpbiAhPSBudWxsICYmICFyZWZlcmVuY2VkTWV0aG9kUGx1Z2luLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRToKLQkJCQlyZXR1cm4gbWV0aG9kUGFja2FnZSAhPSBudWxsICYmICFtZXRob2RQYWNrYWdlLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEU6Ci0JCQkJcmV0dXJuIGlzU2V0VXNlckNoYW5nZWFibGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJlZmVyZW5jZWRNZXRob2RQbHVnaW46ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlZmVyZW5jZWRNZXRob2RQbHVnaW4pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVzZXJDaGFuZ2VhYmxlOiAiKTsKLQkJaWYgKHVzZXJDaGFuZ2VhYmxlRVNldCkgcmVzdWx0LmFwcGVuZCh1c2VyQ2hhbmdlYWJsZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RQbHVnaW5JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RVbml0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RVbml0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOTlkZTc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kVW5pdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZFVuaXRJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBVbml0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kVW5pdEltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5cmlnaHQoKSA8ZW0+Q29weXJpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPUFlSSUdIVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5cmlnaHQoKSA8ZW0+Q29weXJpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29weXJpZ2h0ID0gQ09QWVJJR0hUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhvcnMoKSA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXV0aG9ycyA9IEFVVEhPUlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQ0hBTkdFX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjaGFuZ2VEYXRlID0gQ0hBTkdFX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2hhbmdlRGVzY3JpcHRpb24gPSBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RVbml0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb3B5cmlnaHQoKSB7Ci0JCXJldHVybiBjb3B5cmlnaHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0KFN0cmluZyBuZXdDb3B5cmlnaHQpIHsKLQkJU3RyaW5nIG9sZENvcHlyaWdodCA9IGNvcHlyaWdodDsKLQkJY29weXJpZ2h0ID0gbmV3Q29weXJpZ2h0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFQsIG9sZENvcHlyaWdodCwgY29weXJpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRob3JzKCkgewotCQlyZXR1cm4gYXV0aG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRob3JzKFN0cmluZyBuZXdBdXRob3JzKSB7Ci0JCVN0cmluZyBvbGRBdXRob3JzID0gYXV0aG9yczsKLQkJYXV0aG9ycyA9IG5ld0F1dGhvcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlMsIG9sZEF1dGhvcnMsIGF1dGhvcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENoYW5nZURhdGUoKSB7Ci0JCXJldHVybiBjaGFuZ2VEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURhdGUoT2JqZWN0IG5ld0NoYW5nZURhdGUpIHsKLQkJT2JqZWN0IG9sZENoYW5nZURhdGUgPSBjaGFuZ2VEYXRlOwotCQljaGFuZ2VEYXRlID0gbmV3Q2hhbmdlRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUsIG9sZENoYW5nZURhdGUsIGNoYW5nZURhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENoYW5nZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY2hhbmdlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGVzY3JpcHRpb24oU3RyaW5nIG5ld0NoYW5nZURlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRDaGFuZ2VEZXNjcmlwdGlvbiA9IGNoYW5nZURlc2NyaXB0aW9uOwotCQljaGFuZ2VEZXNjcmlwdGlvbiA9IG5ld0NoYW5nZURlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04sIG9sZENoYW5nZURlc2NyaXB0aW9uLCBjaGFuZ2VEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFQ6Ci0JCQkJcmV0dXJuIGdldENvcHlyaWdodCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQkJCXJldHVybiBnZXRBdXRob3JzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJCXJldHVybiBnZXRDaGFuZ2VEYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVDoKLQkJCQlzZXRDb3B5cmlnaHQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQkJCXNldEF1dGhvcnMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJCQlzZXRDaGFuZ2VEYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXNldENoYW5nZURlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVDoKLQkJCQlzZXRDb3B5cmlnaHQoQ09QWVJJR0hUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQkJc2V0QXV0aG9ycyhBVVRIT1JTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJCXNldENoYW5nZURhdGUoQ0hBTkdFX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXNldENoYW5nZURlc2NyaXB0aW9uKENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVDoKLQkJCQlyZXR1cm4gQ09QWVJJR0hUX0VERUZBVUxUID09IG51bGwgPyBjb3B5cmlnaHQgIT0gbnVsbCA6ICFDT1BZUklHSFRfRURFRkFVTFQuZXF1YWxzKGNvcHlyaWdodCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQkJcmV0dXJuIEFVVEhPUlNfRURFRkFVTFQgPT0gbnVsbCA/IGF1dGhvcnMgIT0gbnVsbCA6ICFBVVRIT1JTX0VERUZBVUxULmVxdWFscyhhdXRob3JzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJcmV0dXJuIENIQU5HRV9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjaGFuZ2VEYXRlICE9IG51bGwgOiAhQ0hBTkdFX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNoYW5nZURhdGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gY2hhbmdlRGVzY3JpcHRpb24gIT0gbnVsbCA6ICFDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29weXJpZ2h0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3B5cmlnaHQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF1dGhvcnM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF1dGhvcnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNoYW5nZURhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNoYW5nZURlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFVuaXRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NaWxlc3RvbmVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01pbGVzdG9uZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDc4NDdiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01pbGVzdG9uZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWlsZXN0b25lSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWlsZXN0b25lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWlsZXN0b25lSW1wbCBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1pbGVzdG9uZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1pbGVzdG9uZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1JTEVTVE9ORTsKLQl9Ci0KLX0gLy9NaWxlc3RvbmVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9OYW1lZEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL05hbWVkRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFlYTY2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL05hbWVkRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE5hbWVkRWxlbWVudEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5hbWVkRWxlbWVudEltcGwgZXh0ZW5kcyBFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE5hbWVkRWxlbWVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTmFtZWRFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTmFtZWRFbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvT3V0Y29tZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvT3V0Y29tZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGYxNjM3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL091dGNvbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGNvbWVJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0Y29tZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGNvbWVJbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3RJbXBsIGltcGxlbWVudHMgT3V0Y29tZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGNvbWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5PVVRDT01FOwotCX0KLQotfSAvL091dGNvbWVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QYWNrYWdlYWJsZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BhY2thZ2VhYmxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2IwZTM5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BhY2thZ2VhYmxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFja2FnZWFibGUgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VhYmxlRWxlbWVudEltcGwgZXh0ZW5kcyBOYW1lZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgUGFja2FnZWFibGVFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFja2FnZWFibGVFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUEFDS0FHRUFCTEVfRUxFTUVOVDsKLQl9Ci0KLX0gLy9QYWNrYWdlYWJsZUVsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QaGFzZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUGhhc2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkNDRkODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QaGFzZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUGhhc2VJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBoYXNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGhhc2VJbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMgUGhhc2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQaGFzZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBIQVNFOwotCX0KLQotfSAvL1BoYXNlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUGxhbm5pbmdEYXRhSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QbGFubmluZ0RhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkNzBkMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QbGFubmluZ0RhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQbGFubmluZ0RhdGFJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBsYW5uaW5nRGF0YUltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cyBQbGFubmluZ0RhdGEgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hEYXRlKCkgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hEYXRlKCkgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaERhdGUgPSBGSU5JU0hfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5rKCkgPGVtPlJhbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFuaygpIDxlbT5SYW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJhbmsgPSBSQU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0RGF0ZSgpIDxlbT5TdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFNUQVJUX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnREYXRlKCkgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzdGFydERhdGUgPSBTVEFSVF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBsYW5uaW5nRGF0YUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBMQU5OSU5HX0RBVEE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGaW5pc2hEYXRlKCkgewotCQlyZXR1cm4gZmluaXNoRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2hEYXRlKE9iamVjdCBuZXdGaW5pc2hEYXRlKSB7Ci0JCU9iamVjdCBvbGRGaW5pc2hEYXRlID0gZmluaXNoRGF0ZTsKLQkJZmluaXNoRGF0ZSA9IG5ld0ZpbmlzaERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUsIG9sZEZpbmlzaERhdGUsIGZpbmlzaERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJhbmsoKSB7Ci0JCXJldHVybiByYW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhbmsoU3RyaW5nIG5ld1JhbmspIHsKLQkJU3RyaW5nIG9sZFJhbmsgPSByYW5rOwotCQlyYW5rID0gbmV3UmFuazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LLCBvbGRSYW5rLCByYW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGFydERhdGUoKSB7Ci0JCXJldHVybiBzdGFydERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnREYXRlKE9iamVjdCBuZXdTdGFydERhdGUpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTsKLQkJc3RhcnREYXRlID0gbmV3U3RhcnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUsIG9sZFN0YXJ0RGF0ZSwgc3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFOgotCQkJCXJldHVybiBnZXRGaW5pc2hEYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fUkFOSzoKLQkJCQlyZXR1cm4gZ2V0UmFuaygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0RGF0ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQkJc2V0RmluaXNoRGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fUkFOSzoKLQkJCQlzZXRSYW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQkJCXNldFN0YXJ0RGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFOgotCQkJCXNldEZpbmlzaERhdGUoRklOSVNIX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJCXNldFJhbmsoUkFOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEU6Ci0JCQkJc2V0U3RhcnREYXRlKFNUQVJUX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFOgotCQkJCXJldHVybiBGSU5JU0hfREFURV9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoRGF0ZSAhPSBudWxsIDogIUZJTklTSF9EQVRFX0VERUZBVUxULmVxdWFscyhmaW5pc2hEYXRlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJCXJldHVybiBSQU5LX0VERUZBVUxUID09IG51bGwgPyByYW5rICE9IG51bGwgOiAhUkFOS19FREVGQVVMVC5lcXVhbHMocmFuayk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCQlyZXR1cm4gU1RBUlRfREFURV9FREVGQVVMVCA9PSBudWxsID8gc3RhcnREYXRlICE9IG51bGwgOiAhU1RBUlRfREFURV9FREVGQVVMVC5lcXVhbHMoc3RhcnREYXRlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZpbmlzaERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpbmlzaERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJhbms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJhbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0RGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUGxhbm5pbmdEYXRhSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDdlZGRlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1ByYWN0aWNlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmFjdGljZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRBZGRpdGlvbmFsSW5mbyA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRMZXZlbHNPZkFkb3B0aW9uIDxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0UHJvYmxlbSA8ZW0+UHJvYmxlbTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIFByYWN0aWNlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZGRpdGlvbmFsSW5mbygpIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBRERJVElPTkFMX0lORk9fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbEluZm8oKSA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IEFERElUSU9OQUxfSU5GT19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcHBsaWNhdGlvbigpIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2F0aW9uKCkgPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhcHBsaWNhdGlvbiA9IEFQUExJQ0FUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhY2tncm91bmQoKSA8ZW0+QmFja2dyb3VuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFja2dyb3VuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0dST1VORF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYWNrZ3JvdW5kKCkgPGVtPkJhY2tncm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhY2tncm91bmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYmFja2dyb3VuZCA9IEJBQ0tHUk9VTkRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R29hbHMoKSA8ZW0+R29hbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdvYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHT0FMU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHb2FscygpIDxlbT5Hb2FsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R29hbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ29hbHMgPSBHT0FMU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkgPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsc09mQWRvcHRpb24oKSA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxldmVsc09mQWRvcHRpb24gPSBMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvYmxlbSgpIDxlbT5Qcm9ibGVtPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9ibGVtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9CTEVNX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2JsZW0oKSA8ZW0+UHJvYmxlbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvYmxlbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9ibGVtID0gUFJPQkxFTV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcmFjdGljZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsSW5mbygpIHsKLQkJcmV0dXJuIGFkZGl0aW9uYWxJbmZvOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxJbmZvKFN0cmluZyBuZXdBZGRpdGlvbmFsSW5mbykgewotCQlTdHJpbmcgb2xkQWRkaXRpb25hbEluZm8gPSBhZGRpdGlvbmFsSW5mbzsKLQkJYWRkaXRpb25hbEluZm8gPSBuZXdBZGRpdGlvbmFsSW5mbzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPLCBvbGRBZGRpdGlvbmFsSW5mbywgYWRkaXRpb25hbEluZm8pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gYXBwbGljYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb24oU3RyaW5nIG5ld0FwcGxpY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGRBcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOwotCQlhcHBsaWNhdGlvbiA9IG5ld0FwcGxpY2F0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiwgb2xkQXBwbGljYXRpb24sIGFwcGxpY2F0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gYmFja2dyb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKFN0cmluZyBuZXdCYWNrZ3JvdW5kKSB7Ci0JCVN0cmluZyBvbGRCYWNrZ3JvdW5kID0gYmFja2dyb3VuZDsKLQkJYmFja2dyb3VuZCA9IG5ld0JhY2tncm91bmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQsIG9sZEJhY2tncm91bmQsIGJhY2tncm91bmQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEdvYWxzKCkgewotCQlyZXR1cm4gZ29hbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R29hbHMoU3RyaW5nIG5ld0dvYWxzKSB7Ci0JCVN0cmluZyBvbGRHb2FscyA9IGdvYWxzOwotCQlnb2FscyA9IG5ld0dvYWxzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUywgb2xkR29hbHMsIGdvYWxzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMZXZlbHNPZkFkb3B0aW9uKCkgewotCQlyZXR1cm4gbGV2ZWxzT2ZBZG9wdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbHNPZkFkb3B0aW9uKFN0cmluZyBuZXdMZXZlbHNPZkFkb3B0aW9uKSB7Ci0JCVN0cmluZyBvbGRMZXZlbHNPZkFkb3B0aW9uID0gbGV2ZWxzT2ZBZG9wdGlvbjsKLQkJbGV2ZWxzT2ZBZG9wdGlvbiA9IG5ld0xldmVsc09mQWRvcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTiwgb2xkTGV2ZWxzT2ZBZG9wdGlvbiwgbGV2ZWxzT2ZBZG9wdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvYmxlbSgpIHsKLQkJcmV0dXJuIHByb2JsZW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvYmxlbShTdHJpbmcgbmV3UHJvYmxlbSkgewotCQlTdHJpbmcgb2xkUHJvYmxlbSA9IHByb2JsZW07Ci0JCXByb2JsZW0gPSBuZXdQcm9ibGVtOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNLCBvbGRQcm9ibGVtLCBwcm9ibGVtKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxJbmZvKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJCXJldHVybiBnZXRBcHBsaWNhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EOgotCQkJCXJldHVybiBnZXRCYWNrZ3JvdW5kKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJCXJldHVybiBnZXRHb2FscygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQkJcmV0dXJuIGdldExldmVsc09mQWRvcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTToKLQkJCQlyZXR1cm4gZ2V0UHJvYmxlbSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCQlzZXRBZGRpdGlvbmFsSW5mbygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJCXNldEFwcGxpY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCQlzZXRCYWNrZ3JvdW5kKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFM6Ci0JCQkJc2V0R29hbHMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQkJc2V0TGV2ZWxzT2ZBZG9wdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCQkJc2V0UHJvYmxlbSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQkJc2V0QWRkaXRpb25hbEluZm8oQURESVRJT05BTF9JTkZPX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJCXNldEFwcGxpY2F0aW9uKEFQUExJQ0FUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCQkJc2V0QmFja2dyb3VuZChCQUNLR1JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJCXNldEdvYWxzKEdPQUxTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCQlzZXRMZXZlbHNPZkFkb3B0aW9uKExFVkVMU19PRl9BRE9QVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJCXNldFByb2JsZW0oUFJPQkxFTV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCQlyZXR1cm4gQURESVRJT05BTF9JTkZPX0VERUZBVUxUID09IG51bGwgPyBhZGRpdGlvbmFsSW5mbyAhPSBudWxsIDogIUFERElUSU9OQUxfSU5GT19FREVGQVVMVC5lcXVhbHMoYWRkaXRpb25hbEluZm8pOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTjoKLQkJCQlyZXR1cm4gQVBQTElDQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGFwcGxpY2F0aW9uICE9IG51bGwgOiAhQVBQTElDQVRJT05fRURFRkFVTFQuZXF1YWxzKGFwcGxpY2F0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCQlyZXR1cm4gQkFDS0dST1VORF9FREVGQVVMVCA9PSBudWxsID8gYmFja2dyb3VuZCAhPSBudWxsIDogIUJBQ0tHUk9VTkRfRURFRkFVTFQuZXF1YWxzKGJhY2tncm91bmQpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJCQlyZXR1cm4gR09BTFNfRURFRkFVTFQgPT0gbnVsbCA/IGdvYWxzICE9IG51bGwgOiAhR09BTFNfRURFRkFVTFQuZXF1YWxzKGdvYWxzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJCXJldHVybiBMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsc09mQWRvcHRpb24gIT0gbnVsbCA6ICFMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQuZXF1YWxzKGxldmVsc09mQWRvcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJCXJldHVybiBQUk9CTEVNX0VERUZBVUxUID09IG51bGwgPyBwcm9ibGVtICE9IG51bGwgOiAhUFJPQkxFTV9FREVGQVVMVC5lcXVhbHMocHJvYmxlbSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhZGRpdGlvbmFsSW5mbzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWRkaXRpb25hbEluZm8pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFwcGxpY2F0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhcHBsaWNhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmFja2dyb3VuZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYmFja2dyb3VuZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ29hbHM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdvYWxzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbHNPZkFkb3B0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbHNPZkFkb3B0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm9ibGVtOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcm9ibGVtKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1ByYWN0aWNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QcmFjdGljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzhhMjJiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1ByYWN0aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJhY3RpY2VJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmFjdGljZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VJbXBsI2dldEFjdGl2aXR5UmVmZXJlbmNlIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VJbXBsI2dldENvbnRlbnRSZWZlcmVuY2UgPGVtPkNvbnRlbnQgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbCNnZXRTdWJQcmFjdGljZSA8ZW0+U3ViIFByYWN0aWNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUHJhY3RpY2UgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDIgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByYWN0aWNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5QUkFDVElDRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBY3Rpdml0eVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb250ZW50UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U3ViUHJhY3RpY2UoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9fU1VCX1BSQUNUSUNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFN1YlByYWN0aWNlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuIGdldEFjdGl2aXR5UmVmZXJlbmNlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFOgotCQkJCXJldHVybiBnZXRDb250ZW50UmVmZXJlbmNlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRToKLQkJCQlyZXR1cm4gZ2V0U3ViUHJhY3RpY2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFOgotCQkJCWdldEFjdGl2aXR5UmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlnZXRBY3Rpdml0eVJlZmVyZW5jZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRToKLQkJCQlnZXRDb250ZW50UmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50UmVmZXJlbmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRToKLQkJCQlnZXRTdWJQcmFjdGljZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3ViUHJhY3RpY2UoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFOgotCQkJCWdldEFjdGl2aXR5UmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFOgotCQkJCWdldENvbnRlbnRSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFOgotCQkJCWdldFN1YlByYWN0aWNlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFOgotCQkJCXJldHVybiAhZ2V0QWN0aXZpdHlSZWZlcmVuY2UoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFOgotCQkJCXJldHVybiAhZ2V0Q29udGVudFJlZmVyZW5jZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFOgotCQkJCXJldHVybiAhZ2V0U3ViUHJhY3RpY2UoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1ByYWN0aWNlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2VhMmYyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzQ29tcG9uZW50SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0Q29weXJpZ2h0IDxlbT5Db3B5cmlnaHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0SW50ZXJmYWNlIDxlbT5JbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJbXBsIGV4dGVuZHMgUHJvY2Vzc1BhY2thZ2VJbXBsIGltcGxlbWVudHMgUHJvY2Vzc0NvbXBvbmVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodCgpIDxlbT5Db3B5cmlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWVJJR0hUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodCgpIDxlbT5Db3B5cmlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb3B5cmlnaHQgPSBDT1BZUklHSFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcmZhY2UoKSA8ZW0+SW50ZXJmYWNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIGludGVyZmFjZV8gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvY2VzcygpIDxlbT5Qcm9jZXNzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBwcm9jZXNzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUlNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9ycygpIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF1dGhvcnMgPSBBVVRIT1JTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURhdGUoKSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IENIQU5HRV9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURhdGUoKSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY2hhbmdlRGF0ZSA9IENIQU5HRV9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNoYW5nZURlc2NyaXB0aW9uID0gQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0NvbXBvbmVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29weXJpZ2h0KCkgewotCQlyZXR1cm4gY29weXJpZ2h0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcHlyaWdodChTdHJpbmcgbmV3Q29weXJpZ2h0KSB7Ci0JCVN0cmluZyBvbGRDb3B5cmlnaHQgPSBjb3B5cmlnaHQ7Ci0JCWNvcHlyaWdodCA9IG5ld0NvcHlyaWdodDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hULCBvbGRDb3B5cmlnaHQsIGNvcHlyaWdodCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIGdldEludGVyZmFjZSgpIHsKLQkJcmV0dXJuIGludGVyZmFjZV87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW50ZXJmYWNlKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgbmV3SW50ZXJmYWNlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2Ugb2xkSW50ZXJmYWNlID0gaW50ZXJmYWNlXzsKLQkJaW50ZXJmYWNlXyA9IG5ld0ludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFLCBvbGRJbnRlcmZhY2UsIG5ld0ludGVyZmFjZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW50ZXJmYWNlKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgbmV3SW50ZXJmYWNlKSB7Ci0JCWlmIChuZXdJbnRlcmZhY2UgIT0gaW50ZXJmYWNlXykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaW50ZXJmYWNlXyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbnRlcmZhY2VfKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdJbnRlcmZhY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW50ZXJmYWNlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEludGVyZmFjZShuZXdJbnRlcmZhY2UsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFLCBuZXdJbnRlcmZhY2UsIG5ld0ludGVyZmFjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBuZXdQcm9jZXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3Mgb2xkUHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXByb2Nlc3MgPSBuZXdQcm9jZXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLCBvbGRQcm9jZXNzLCBuZXdQcm9jZXNzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgbmV3UHJvY2VzcykgewotCQlpZiAobmV3UHJvY2VzcyAhPSBwcm9jZXNzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcm9jZXNzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXByb2Nlc3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcm9jZXNzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Byb2Nlc3MpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByb2Nlc3MobmV3UHJvY2VzcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLCBuZXdQcm9jZXNzLCBuZXdQcm9jZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRob3JzKCkgewotCQlyZXR1cm4gYXV0aG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRob3JzKFN0cmluZyBuZXdBdXRob3JzKSB7Ci0JCVN0cmluZyBvbGRBdXRob3JzID0gYXV0aG9yczsKLQkJYXV0aG9ycyA9IG5ld0F1dGhvcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlMsIG9sZEF1dGhvcnMsIGF1dGhvcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENoYW5nZURhdGUoKSB7Ci0JCXJldHVybiBjaGFuZ2VEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURhdGUoT2JqZWN0IG5ld0NoYW5nZURhdGUpIHsKLQkJT2JqZWN0IG9sZENoYW5nZURhdGUgPSBjaGFuZ2VEYXRlOwotCQljaGFuZ2VEYXRlID0gbmV3Q2hhbmdlRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEUsIG9sZENoYW5nZURhdGUsIGNoYW5nZURhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENoYW5nZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY2hhbmdlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGVzY3JpcHRpb24oU3RyaW5nIG5ld0NoYW5nZURlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRDaGFuZ2VEZXNjcmlwdGlvbiA9IGNoYW5nZURlc2NyaXB0aW9uOwotCQljaGFuZ2VEZXNjcmlwdGlvbiA9IG5ld0NoYW5nZURlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT04sIG9sZENoYW5nZURlc2NyaXB0aW9uLCBjaGFuZ2VEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SW50ZXJmYWNlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJCXJldHVybiBiYXNpY1NldFByb2Nlc3MobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUOgotCQkJCXJldHVybiBnZXRDb3B5cmlnaHQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFOgotCQkJCXJldHVybiBnZXRJbnRlcmZhY2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCQlyZXR1cm4gZ2V0UHJvY2VzcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJCXJldHVybiBnZXRBdXRob3JzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJCXJldHVybiBnZXRDaGFuZ2VEYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVDoKLQkJCQlzZXRDb3B5cmlnaHQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0U6Ci0JCQkJc2V0SW50ZXJmYWNlKChQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQkJc2V0UHJvY2Vzcygob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJCXNldEF1dGhvcnMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCQlzZXRDaGFuZ2VEYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXNldENoYW5nZURlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVDoKLQkJCQlzZXRDb3B5cmlnaHQoQ09QWVJJR0hUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRToKLQkJCQlzZXRJbnRlcmZhY2UoKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJCXNldFByb2Nlc3MoKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJCXNldEF1dGhvcnMoQVVUSE9SU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCQlzZXRDaGFuZ2VEYXRlKENIQU5HRV9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlzZXRDaGFuZ2VEZXNjcmlwdGlvbihDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQ6Ci0JCQkJcmV0dXJuIENPUFlSSUdIVF9FREVGQVVMVCA9PSBudWxsID8gY29weXJpZ2h0ICE9IG51bGwgOiAhQ09QWVJJR0hUX0VERUZBVUxULmVxdWFscyhjb3B5cmlnaHQpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGludGVyZmFjZV8gIT0gbnVsbDsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCQlyZXR1cm4gcHJvY2VzcyAhPSBudWxsOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJCXJldHVybiBBVVRIT1JTX0VERUZBVUxUID09IG51bGwgPyBhdXRob3JzICE9IG51bGwgOiAhQVVUSE9SU19FREVGQVVMVC5lcXVhbHMoYXV0aG9ycyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJCXJldHVybiBDSEFOR0VfREFURV9FREVGQVVMVCA9PSBudWxsID8gY2hhbmdlRGF0ZSAhPSBudWxsIDogIUNIQU5HRV9EQVRFX0VERUZBVUxULmVxdWFscyhjaGFuZ2VEYXRlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGNoYW5nZURlc2NyaXB0aW9uICE9IG51bGwgOiAhQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhjaGFuZ2VEZXNjcmlwdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIFZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHZlcnNpb24gIT0gbnVsbCA6ICFWRVJTSU9OX0VERUZBVUxULmVxdWFscyh2ZXJzaW9uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvcHlyaWdodDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29weXJpZ2h0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdXRob3JzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdXRob3JzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjaGFuZ2VEYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjaGFuZ2VEZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2hhbmdlRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzQ29tcG9uZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzZlZDM2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbiA8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwjZ2V0SW50ZXJmYWNlSU8gPGVtPkludGVyZmFjZSBJTzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDEoKSA8ZW0+R3JvdXAxPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAxID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMSgpIHsKLQkJaWYgKGdyb3VwMSA9PSBudWxsKSB7Ci0JCQlncm91cDEgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HUk9VUDEpOwotCQl9Ci0JCXJldHVybiBncm91cDE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEludGVyZmFjZVNwZWNpZmljYXRpb24oKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAxKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SW50ZXJmYWNlSU8oKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAxKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAxOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAxKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbnRlcmZhY2VJTygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMToKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDEoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTjoKLQkJCQlyZXR1cm4gZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJCXJldHVybiBnZXRJbnRlcmZhY2VJTygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HUk9VUDE6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OOgotCQkJCWdldEludGVyZmFjZVNwZWNpZmljYXRpb24oKS5jbGVhcigpOwotCQkJCWdldEludGVyZmFjZVNwZWNpZmljYXRpb24oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCQlnZXRJbnRlcmZhY2VJTygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW50ZXJmYWNlSU8oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HUk9VUDE6Ci0JCQkJZ2V0R3JvdXAxKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTjoKLQkJCQlnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQkJZ2V0SW50ZXJmYWNlSU8oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAxOgotCQkJCXJldHVybiBncm91cDEgIT0gbnVsbCAmJiAhZ3JvdXAxLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OOgotCQkJCXJldHVybiAhZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCQlyZXR1cm4gIWdldEludGVyZmFjZUlPKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAxOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDEpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiOTc3MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFNjb3BlIDxlbT5TY29wZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBQcm9jZXNzRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY29wZSgpIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjb3BlKCkgPGVtPlNjb3BlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzY29wZSA9IFNDT1BFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzYWdlTm90ZXMoKSA8ZW0+VXNhZ2UgTm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzYWdlTm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQUdFX05PVEVTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzYWdlTm90ZXMoKSA8ZW0+VXNhZ2UgTm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzYWdlTm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXNhZ2VOb3RlcyA9IFVTQUdFX05PVEVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsSWQoKSA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsSWQoKSA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZXJuYWxJZCA9IEVYVEVSTkFMX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIHNjb3BlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBuZXdTY29wZSkgewotCQlTdHJpbmcgb2xkU2NvcGUgPSBzY29wZTsKLQkJc2NvcGUgPSBuZXdTY29wZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSwgb2xkU2NvcGUsIHNjb3BlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVc2FnZU5vdGVzKCkgewotCQlyZXR1cm4gdXNhZ2VOb3RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2FnZU5vdGVzKFN0cmluZyBuZXdVc2FnZU5vdGVzKSB7Ci0JCVN0cmluZyBvbGRVc2FnZU5vdGVzID0gdXNhZ2VOb3RlczsKLQkJdXNhZ2VOb3RlcyA9IG5ld1VzYWdlTm90ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMsIG9sZFVzYWdlTm90ZXMsIHVzYWdlTm90ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsSWQoKSB7Ci0JCXJldHVybiBleHRlcm5hbElkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsSWQoU3RyaW5nIG5ld0V4dGVybmFsSWQpIHsKLQkJU3RyaW5nIG9sZEV4dGVybmFsSWQgPSBleHRlcm5hbElkOwotCQlleHRlcm5hbElkID0gbmV3RXh0ZXJuYWxJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCwgb2xkRXh0ZXJuYWxJZCwgZXh0ZXJuYWxJZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRToKLQkJCQlyZXR1cm4gZ2V0U2NvcGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzoKLQkJCQlyZXR1cm4gZ2V0VXNhZ2VOb3RlcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJCXJldHVybiBnZXRFeHRlcm5hbElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRToKLQkJCQlzZXRTY29wZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQkJc2V0VXNhZ2VOb3RlcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQkJc2V0RXh0ZXJuYWxJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJCXNldFNjb3BlKFNDT1BFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQkJc2V0VXNhZ2VOb3RlcyhVU0FHRV9OT1RFU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJCXNldEV4dGVybmFsSWQoRVhURVJOQUxfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJCXJldHVybiBTQ09QRV9FREVGQVVMVCA9PSBudWxsID8gc2NvcGUgIT0gbnVsbCA6ICFTQ09QRV9FREVGQVVMVC5lcXVhbHMoc2NvcGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJCXJldHVybiBVU0FHRV9OT1RFU19FREVGQVVMVCA9PSBudWxsID8gdXNhZ2VOb3RlcyAhPSBudWxsIDogIVVTQUdFX05PVEVTX0VERUZBVUxULmVxdWFscyh1c2FnZU5vdGVzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCQlyZXR1cm4gRVhURVJOQUxfSURfRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVybmFsSWQgIT0gbnVsbCA6ICFFWFRFUk5BTF9JRF9FREVGQVVMVC5lcXVhbHMoZXh0ZXJuYWxJZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzY29wZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2NvcGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVzYWdlTm90ZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVzYWdlTm90ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4dGVybmFsSWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4dGVybmFsSWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3NWMyMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc0VsZW1lbnRJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFbGVtZW50SW1wbCBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBQcm9jZXNzRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19FTEVNRU5UOwotCX0KLQotfSAvL1Byb2Nlc3NFbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY5ODYwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXRJbmNsdWRlc1BhdHRlcm4gPGVtPkluY2x1ZGVzIFBhdHRlcm48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0ltcGwjZ2V0RGVmYXVsdENvbnRleHQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXRWYWxpZENvbnRleHQgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzSW1wbCBleHRlbmRzIEFjdGl2aXR5SW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY2x1ZGVzUGF0dGVybigpIDxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluY2x1ZGVzUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluY2x1ZGVzUGF0dGVybiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdENvbnRleHQoKSA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0Q29udGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05URVhUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRDb250ZXh0KCkgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENvbnRleHQgPSBERUZBVUxUX0NPTlRFWFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWxpZENvbnRleHQoKSA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWxpZENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB2YWxpZENvbnRleHQgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbmNsdWRlc1BhdHRlcm4oKSB7Ci0JCWlmIChpbmNsdWRlc1BhdHRlcm4gPT0gbnVsbCkgewotCQkJaW5jbHVkZXNQYXR0ZXJuID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOKTsKLQkJfQotCQlyZXR1cm4gaW5jbHVkZXNQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbnRleHQoKSB7Ci0JCXJldHVybiBkZWZhdWx0Q29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0Q29udGV4dChTdHJpbmcgbmV3RGVmYXVsdENvbnRleHQpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRDb250ZXh0ID0gZGVmYXVsdENvbnRleHQ7Ci0JCWRlZmF1bHRDb250ZXh0ID0gbmV3RGVmYXVsdENvbnRleHQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhULCBvbGREZWZhdWx0Q29udGV4dCwgZGVmYXVsdENvbnRleHQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VmFsaWRDb250ZXh0KCkgewotCQlpZiAodmFsaWRDb250ZXh0ID09IG51bGwpIHsKLQkJCXZhbGlkQ29udGV4dCA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVCk7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjoKLQkJCQlyZXR1cm4gZ2V0SW5jbHVkZXNQYXR0ZXJuKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJCXJldHVybiBnZXREZWZhdWx0Q29udGV4dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQ6Ci0JCQkJcmV0dXJuIGdldFZhbGlkQ29udGV4dCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjoKLQkJCQlnZXRJbmNsdWRlc1BhdHRlcm4oKS5jbGVhcigpOwotCQkJCWdldEluY2x1ZGVzUGF0dGVybigpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCQlzZXREZWZhdWx0Q29udGV4dCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCQlnZXRWYWxpZENvbnRleHQoKS5jbGVhcigpOwotCQkJCWdldFZhbGlkQ29udGV4dCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOOgotCQkJCWdldEluY2x1ZGVzUGF0dGVybigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCQlzZXREZWZhdWx0Q29udGV4dChERUZBVUxUX0NPTlRFWFRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJCWdldFZhbGlkQ29udGV4dCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjoKLQkJCQlyZXR1cm4gaW5jbHVkZXNQYXR0ZXJuICE9IG51bGwgJiYgIWluY2x1ZGVzUGF0dGVybi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJCXJldHVybiBERUZBVUxUX0NPTlRFWFRfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRDb250ZXh0ICE9IG51bGwgOiAhREVGQVVMVF9DT05URVhUX0VERUZBVUxULmVxdWFscyhkZWZhdWx0Q29udGV4dCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCQlyZXR1cm4gdmFsaWRDb250ZXh0ICE9IG51bGwgJiYgIXZhbGlkQ29udGV4dC5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpbmNsdWRlc1BhdHRlcm46ICIpOwotCQlyZXN1bHQuYXBwZW5kKGluY2x1ZGVzUGF0dGVybik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdENvbnRleHQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRDb250ZXh0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWxpZENvbnRleHQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbGlkQ29udGV4dCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2Nlc3NJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc1BhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0YzlkYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NQYWNrYWdlSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0VsZW1lbnQgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQYWNrYWdlSW1wbCBleHRlbmRzIE1ldGhvZFBhY2thZ2VJbXBsIGltcGxlbWVudHMgUHJvY2Vzc1BhY2thZ2UgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDIgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFByb2Nlc3NFbGVtZW50KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQcm9jZXNzRWxlbWVudCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldFByb2Nlc3NFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UOgotCQkJCWdldFByb2Nlc3NFbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9jZXNzRWxlbWVudCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVDoKLQkJCQlnZXRQcm9jZXNzRWxlbWVudCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UOgotCQkJCXJldHVybiAhZ2V0UHJvY2Vzc0VsZW1lbnQoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2Nlc3NQYWNrYWdlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDU4ZjY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCNnZXRCYXNlUHJvY2VzcyA8ZW0+QmFzZSBQcm9jZXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIGV4dGVuZHMgUHJvY2Vzc0ltcGwgaW1wbGVtZW50cyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAzKCkgPGVtPkdyb3VwMzwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMygpIHsKLQkJaWYgKGdyb3VwMyA9PSBudWxsKSB7Ci0JCQlncm91cDMgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVAzKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRCYXNlUHJvY2VzcygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDMoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQMzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDM6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAzKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUzoKLQkJCQlyZXR1cm4gZ2V0QmFzZVByb2Nlc3MoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQMzoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAzKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUzoKLQkJCQlnZXRCYXNlUHJvY2VzcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzZVByb2Nlc3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVAzOgotCQkJCWdldEdyb3VwMygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUzoKLQkJCQlnZXRCYXNlUHJvY2VzcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVAzOgotCQkJCXJldHVybiBncm91cDMgIT0gbnVsbCAmJiAhZ3JvdXAzLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFX1BST0NFU1M6Ci0JCQkJcmV0dXJuICFnZXRCYXNlUHJvY2VzcygpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9SZXBvcnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGI3MjcwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVwb3J0SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVwb3J0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFJlcG9ydCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlcG9ydEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJFUE9SVDsKLQl9Ci0KLX0gLy9SZXBvcnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9SZXVzYWJsZUFzc2V0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9SZXVzYWJsZUFzc2V0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZGRjYjFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUmV1c2FibGVBc3NldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmV1c2FibGVBc3NldEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJldXNhYmxlQXNzZXRJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUmV1c2FibGVBc3NldCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJldXNhYmxlQXNzZXRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5SRVVTQUJMRV9BU1NFVDsKLQl9Ci0KLX0gLy9SZXVzYWJsZUFzc2V0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9hZG1hcEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9hZG1hcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjY3YzdlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvYWRtYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvYWRtYXBJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvYWRtYXBJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUm9hZG1hcCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvYWRtYXBJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0FETUFQOwotCX0KLQotfSAvL1JvYWRtYXBJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlRGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODkyYWUyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwjZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBSb2xlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKSA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhc3NpZ25tZW50QXBwcm9hY2hlcyA9IEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTa2lsbHMoKSA8ZW0+U2tpbGxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSUxMU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTa2lsbHMoKSA8ZW0+U2tpbGxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2tpbGxzID0gU0tJTExTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5bm9ueW1zKCkgPGVtPlN5bm9ueW1zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTeW5vbnltcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOT05ZTVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3lub255bXMoKSA8ZW0+U3lub255bXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN5bm9ueW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN5bm9ueW1zID0gU1lOT05ZTVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkgewotCQlyZXR1cm4gYXNzaWdubWVudEFwcHJvYWNoZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoU3RyaW5nIG5ld0Fzc2lnbm1lbnRBcHByb2FjaGVzKSB7Ci0JCVN0cmluZyBvbGRBc3NpZ25tZW50QXBwcm9hY2hlcyA9IGFzc2lnbm1lbnRBcHByb2FjaGVzOwotCQlhc3NpZ25tZW50QXBwcm9hY2hlcyA9IG5ld0Fzc2lnbm1lbnRBcHByb2FjaGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUywgb2xkQXNzaWdubWVudEFwcHJvYWNoZXMsIGFzc2lnbm1lbnRBcHByb2FjaGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTa2lsbHMoKSB7Ci0JCXJldHVybiBza2lsbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2tpbGxzKFN0cmluZyBuZXdTa2lsbHMpIHsKLQkJU3RyaW5nIG9sZFNraWxscyA9IHNraWxsczsKLQkJc2tpbGxzID0gbmV3U2tpbGxzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUywgb2xkU2tpbGxzLCBza2lsbHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5bm9ueW1zKCkgewotCQlyZXR1cm4gc3lub255bXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lub255bXMoU3RyaW5nIG5ld1N5bm9ueW1zKSB7Ci0JCVN0cmluZyBvbGRTeW5vbnltcyA9IHN5bm9ueW1zOwotCQlzeW5vbnltcyA9IG5ld1N5bm9ueW1zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TLCBvbGRTeW5vbnltcywgc3lub255bXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJCXJldHVybiBnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCQlyZXR1cm4gZ2V0U2tpbGxzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQkJcmV0dXJuIGdldFN5bm9ueW1zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVM6Ci0JCQkJc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCQlzZXRTa2lsbHMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJCXNldFN5bm9ueW1zKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJCXNldEFzc2lnbm1lbnRBcHByb2FjaGVzKEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCQlzZXRTa2lsbHMoU0tJTExTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQkJc2V0U3lub255bXMoU1lOT05ZTVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUzoKLQkJCQlyZXR1cm4gQVNTSUdOTUVOVF9BUFBST0FDSEVTX0VERUZBVUxUID09IG51bGwgPyBhc3NpZ25tZW50QXBwcm9hY2hlcyAhPSBudWxsIDogIUFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVC5lcXVhbHMoYXNzaWdubWVudEFwcHJvYWNoZXMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCQlyZXR1cm4gU0tJTExTX0VERUZBVUxUID09IG51bGwgPyBza2lsbHMgIT0gbnVsbCA6ICFTS0lMTFNfRURFRkFVTFQuZXF1YWxzKHNraWxscyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQkJcmV0dXJuIFNZTk9OWU1TX0VERUZBVUxUID09IG51bGwgPyBzeW5vbnltcyAhPSBudWxsIDogIVNZTk9OWU1TX0VERUZBVUxULmVxdWFscyhzeW5vbnltcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhc3NpZ25tZW50QXBwcm9hY2hlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXNzaWdubWVudEFwcHJvYWNoZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNraWxsczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2tpbGxzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzeW5vbnltczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3lub255bXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Sb2xlRGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlRGVzY3JpcHRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZURlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlmYWQ4YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVEZXNjcmlwdG9ySW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cyBSb2xlRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGUoKSA8ZW0+Um9sZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlKCkgPGVtPlJvbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcm9sZSA9IFJPTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNwb25zaWJsZUZvcigpIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNwb25zaWJsZUZvciA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZURlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX0RFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSb2xlKCkgewotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xlKFN0cmluZyBuZXdSb2xlKSB7Ci0JCVN0cmluZyBvbGRSb2xlID0gcm9sZTsKLQkJcm9sZSA9IG5ld1JvbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFLCBvbGRSb2xlLCByb2xlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJlc3BvbnNpYmxlRm9yKCkgewotCQlpZiAocmVzcG9uc2libGVGb3IgPT0gbnVsbCkgewotCQkJcmVzcG9uc2libGVGb3IgPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SKTsKLQkJfQotCQlyZXR1cm4gcmVzcG9uc2libGVGb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCQlyZXR1cm4gZ2V0Um9sZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCXJldHVybiBnZXRSZXNwb25zaWJsZUZvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJCXNldFJvbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNwb25zaWJsZUZvcigpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQkJc2V0Um9sZShST0xFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCQlyZXR1cm4gUk9MRV9FREVGQVVMVCA9PSBudWxsID8gcm9sZSAhPSBudWxsIDogIVJPTEVfRURFRkFVTFQuZXF1YWxzKHJvbGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCXJldHVybiByZXNwb25zaWJsZUZvciAhPSBudWxsICYmICFyZXNwb25zaWJsZUZvci5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyb2xlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyb2xlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXNwb25zaWJsZUZvcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVzcG9uc2libGVGb3IpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Sb2xlRGVzY3JpcHRvckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyODQzN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlSW1wbCNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBSb2xlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlJPTEVfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmVzcG9uc2libGVGb3IoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX19SRVNQT05TSUJMRV9GT1IpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJcmV0dXJuIGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCXJldHVybiAhZ2V0UmVzcG9uc2libGVGb3IoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1JvbGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlU2V0R3JvdXBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRHcm91cGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI0NGQyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRHcm91cGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVTZXRHcm91cGluZ0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldCBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGwjZ2V0Um9sZVNldCA8ZW0+Um9sZSBTZXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0R3JvdXBpbmdJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIFJvbGVTZXRHcm91cGluZyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZVNldEdyb3VwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfR1JPVVBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSb2xlU2V0KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQ6Ci0JCQkJcmV0dXJuIGdldFJvbGVTZXQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQ6Ci0JCQkJZ2V0Um9sZVNldCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Um9sZVNldCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVDoKLQkJCQlnZXRSb2xlU2V0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQ6Ci0JCQkJcmV0dXJuICFnZXRSb2xlU2V0KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Sb2xlU2V0R3JvdXBpbmdJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlU2V0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlU2V0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MmU2YTkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZVNldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVTZXRJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgU2V0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRJbXBsI2dldFJvbGUgPGVtPlJvbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0SW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBSb2xlU2V0IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlU2V0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ST0xFX1NFVF9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSb2xlKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfX1JPTEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFOgotCQkJCXJldHVybiBnZXRSb2xlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEU6Ci0JCQkJZ2V0Um9sZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0Um9sZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFOgotCQkJCWdldFJvbGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFOgotCQkJCXJldHVybiAhZ2V0Um9sZSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUm9sZVNldEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1NlY3Rpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1NlY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzZDUyZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9TZWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU2VjdGlvbkltcGwuamF2YSx2IDEuNCAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRTdWJTZWN0aW9uIDxlbT5TdWIgU2VjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsI2dldFNlY3Rpb25OYW1lIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN0aW9uSW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgU2VjdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViU2VjdGlvbigpIDxlbT5TdWIgU2VjdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViU2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3Rpb24gc3ViU2VjdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZGVjZXNzb3IoKSA8ZW0+UHJlZGVjZXNzb3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVERUNFU1NPUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVkZWNlc3NvcigpIDxlbT5QcmVkZWNlc3NvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlZGVjZXNzb3IgPSBQUkVERUNFU1NPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25OYW1lKCkgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1RJT05fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9uTmFtZSgpIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY3Rpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlY3Rpb25OYW1lID0gU0VDVElPTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA9IFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YXJpYWJpbGl0eVR5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNFQ1RJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3Rpb24gZ2V0U3ViU2VjdGlvbigpIHsKLQkJcmV0dXJuIHN1YlNlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3ViU2VjdGlvbihTZWN0aW9uIG5ld1N1YlNlY3Rpb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJU2VjdGlvbiBvbGRTdWJTZWN0aW9uID0gc3ViU2VjdGlvbjsKLQkJc3ViU2VjdGlvbiA9IG5ld1N1YlNlY3Rpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT04sIG9sZFN1YlNlY3Rpb24sIG5ld1N1YlNlY3Rpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1YlNlY3Rpb24oU2VjdGlvbiBuZXdTdWJTZWN0aW9uKSB7Ci0JCWlmIChuZXdTdWJTZWN0aW9uICE9IHN1YlNlY3Rpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHN1YlNlY3Rpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc3ViU2VjdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT04sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1N1YlNlY3Rpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U3ViU2VjdGlvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U3ViU2VjdGlvbihuZXdTdWJTZWN0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT04sIG5ld1N1YlNlY3Rpb24sIG5ld1N1YlNlY3Rpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWRlY2Vzc29yKCkgewotCQlyZXR1cm4gcHJlZGVjZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZGVjZXNzb3IoU3RyaW5nIG5ld1ByZWRlY2Vzc29yKSB7Ci0JCVN0cmluZyBvbGRQcmVkZWNlc3NvciA9IHByZWRlY2Vzc29yOwotCQlwcmVkZWNlc3NvciA9IG5ld1ByZWRlY2Vzc29yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SLCBvbGRQcmVkZWNlc3NvciwgcHJlZGVjZXNzb3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlNFQ1RJT05fX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VjdGlvbk5hbWUoU3RyaW5nIG5ld1NlY3Rpb25OYW1lKSB7Ci0JCVN0cmluZyBvbGRTZWN0aW9uTmFtZSA9IHNlY3Rpb25OYW1lOwotCQlzZWN0aW9uTmFtZSA9IG5ld1NlY3Rpb25OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRSwgb2xkU2VjdGlvbk5hbWUsIHNlY3Rpb25OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFN0cmluZyBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSB7Ci0JCVN0cmluZyBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgbmV3VmFyaWFiaWxpdHlUeXBlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSBvbGRWYXJpYWJpbGl0eVR5cGUgPSB2YXJpYWJpbGl0eVR5cGU7Ci0JCXZhcmlhYmlsaXR5VHlwZSA9IG5ld1ZhcmlhYmlsaXR5VHlwZSA9PSBudWxsID8gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA6IG5ld1ZhcmlhYmlsaXR5VHlwZTsKLQkJYm9vbGVhbiBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0ID0gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQkJdmFyaWFiaWxpdHlUeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRSwgb2xkVmFyaWFiaWxpdHlUeXBlLCB2YXJpYWJpbGl0eVR5cGUsICFvbGRWYXJpYWJpbGl0eVR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSBvbGRWYXJpYWJpbGl0eVR5cGUgPSB2YXJpYWJpbGl0eVR5cGU7Ci0JCWJvb2xlYW4gb2xkVmFyaWFiaWxpdHlUeXBlRVNldCA9IHZhcmlhYmlsaXR5VHlwZUVTZXQ7Ci0JCXZhcmlhYmlsaXR5VHlwZSA9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0JCXZhcmlhYmlsaXR5VHlwZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEUsIG9sZFZhcmlhYmlsaXR5VHlwZSwgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCwgb2xkVmFyaWFiaWxpdHlUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT046Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U3ViU2VjdGlvbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OOgotCQkJCXJldHVybiBnZXRTdWJTZWN0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1I6Ci0JCQkJcmV0dXJuIGdldFByZWRlY2Vzc29yKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJCXJldHVybiBnZXRTZWN0aW9uTmFtZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OOgotCQkJCXNldFN1YlNlY3Rpb24oKFNlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCQlzZXRQcmVkZWNlc3NvcigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCQlzZXRTZWN0aW9uTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXNldFZhcmlhYmlsaXR5VHlwZSgoVmFyaWFiaWxpdHlUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OOgotCQkJCXNldFN1YlNlY3Rpb24oKFNlY3Rpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SOgotCQkJCXNldFByZWRlY2Vzc29yKFBSRURFQ0VTU09SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUU6Ci0JCQkJc2V0U2VjdGlvbk5hbWUoU0VDVElPTl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXVuc2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT046Ci0JCQkJcmV0dXJuIHN1YlNlY3Rpb24gIT0gbnVsbDsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCQlyZXR1cm4gUFJFREVDRVNTT1JfRURFRkFVTFQgPT0gbnVsbCA/IHByZWRlY2Vzc29yICE9IG51bGwgOiAhUFJFREVDRVNTT1JfRURFRkFVTFQuZXF1YWxzKHByZWRlY2Vzc29yKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUU6Ci0JCQkJcmV0dXJuIFNFQ1RJT05fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc2VjdGlvbk5hbWUgIT0gbnVsbCA6ICFTRUNUSU9OX05BTUVfRURFRkFVTFQuZXF1YWxzKHNlY3Rpb25OYW1lKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGwgOiAhVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHModmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHByZWRlY2Vzc29yOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVkZWNlc3Nvcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZWN0aW9uTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2VjdGlvbk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhcmlhYmlsaXR5VHlwZTogIik7Ci0JCWlmICh2YXJpYWJpbGl0eVR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5VHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZWN0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ4OWE0ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFN1cHBvcnRpbmdNYXRlcmlhbEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgU3VwcG9ydGluZ01hdGVyaWFsIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3VwcG9ydGluZ01hdGVyaWFsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuU1VQUE9SVElOR19NQVRFUklBTDsKLQl9Ci0KLX0gLy9TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrRGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQ4ZWM4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdGlvbkltcGwjZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbCNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBUYXNrRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRlcm5hdGl2ZXMoKSA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMVEVSTkFUSVZFU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRlcm5hdGl2ZXMoKSA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWx0ZXJuYXRpdmVzID0gQUxURVJOQVRJVkVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVSUE9TRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVycG9zZSA9IFBVUlBPU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsdGVybmF0aXZlcygpIHsKLQkJcmV0dXJuIGFsdGVybmF0aXZlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nIG5ld0FsdGVybmF0aXZlcykgewotCQlTdHJpbmcgb2xkQWx0ZXJuYXRpdmVzID0gYWx0ZXJuYXRpdmVzOwotCQlhbHRlcm5hdGl2ZXMgPSBuZXdBbHRlcm5hdGl2ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTLCBvbGRBbHRlcm5hdGl2ZXMsIGFsdGVybmF0aXZlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVycG9zZSgpIHsKLQkJcmV0dXJuIHB1cnBvc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVycG9zZShTdHJpbmcgbmV3UHVycG9zZSkgewotCQlTdHJpbmcgb2xkUHVycG9zZSA9IHB1cnBvc2U7Ci0JCXB1cnBvc2UgPSBuZXdQdXJwb3NlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0UsIG9sZFB1cnBvc2UsIHB1cnBvc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXJldHVybiBnZXRBbHRlcm5hdGl2ZXMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXJldHVybiBnZXRQdXJwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQkJc2V0QWx0ZXJuYXRpdmVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXNldFB1cnBvc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQkJc2V0QWx0ZXJuYXRpdmVzKEFMVEVSTkFUSVZFU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJc2V0UHVycG9zZShQVVJQT1NFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQkJcmV0dXJuIEFMVEVSTkFUSVZFU19FREVGQVVMVCA9PSBudWxsID8gYWx0ZXJuYXRpdmVzICE9IG51bGwgOiAhQUxURVJOQVRJVkVTX0VERUZBVUxULmVxdWFscyhhbHRlcm5hdGl2ZXMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJcmV0dXJuIFBVUlBPU0VfRURFRkFVTFQgPT0gbnVsbCA/IHB1cnBvc2UgIT0gbnVsbCA6ICFQVVJQT1NFX0VERUZBVUxULmVxdWFscyhwdXJwb3NlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGFsdGVybmF0aXZlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWx0ZXJuYXRpdmVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwdXJwb3NlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwdXJwb3NlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGFza0Rlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGFza0Rlc2NyaXB0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOGNlYTFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGFza0Rlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrRGVzY3JpcHRvckltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0QXNzaXN0ZWRCeSA8ZW0+QXNzaXN0ZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldEV4dGVybmFsSW5wdXQgPGVtPkV4dGVybmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldFN0ZXAgPGVtPlN0ZXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvckltcGwgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cyBUYXNrRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhc2soKSA8ZW0+VGFzazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXNrKCkgPGVtPlRhc2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFzayA9IFRBU0tfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSA8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUkZPUk1FRF9QUklNQVJJTFlfQllfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSA8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGVyZm9ybWVkUHJpbWFyaWx5QnkgPSBQRVJGT1JNRURfUFJJTUFSSUxZX0JZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGVwKCkgPGVtPlN0ZXA8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RlcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHN0ZXAgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgU3luY2hyb25pemVkIFdpdGggU291cmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXNrKCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrKFN0cmluZyBuZXdUYXNrKSB7Ci0JCVN0cmluZyBvbGRUYXNrID0gdGFzazsKLQkJdGFzayA9IG5ld1Rhc2s7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLLCBvbGRUYXNrLCB0YXNrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpIHsKLQkJcmV0dXJuIHBlcmZvcm1lZFByaW1hcmlseUJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcmZvcm1lZFByaW1hcmlseUJ5KFN0cmluZyBuZXdQZXJmb3JtZWRQcmltYXJpbHlCeSkgewotCQlTdHJpbmcgb2xkUGVyZm9ybWVkUHJpbWFyaWx5QnkgPSBwZXJmb3JtZWRQcmltYXJpbHlCeTsKLQkJcGVyZm9ybWVkUHJpbWFyaWx5QnkgPSBuZXdQZXJmb3JtZWRQcmltYXJpbHlCeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlksIG9sZFBlcmZvcm1lZFByaW1hcmlseUJ5LCBwZXJmb3JtZWRQcmltYXJpbHlCeSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXNzaXN0ZWRCeSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFeHRlcm5hbElucHV0KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1hbmRhdG9yeUlucHV0KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRPcHRpb25hbElucHV0KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE91dHB1dCgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U3RlcCgpIHsKLQkJaWYgKHN0ZXAgPT0gbnVsbCkgewotCQkJc3RlcCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZWN0aW9uLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU1RFUCk7Ci0JCX0KLQkJcmV0dXJuIHN0ZXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKSB7Ci0JCWJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBuZXdJc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQ7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLCBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UsIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgIW9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJYm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQ7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVDsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxULCBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TVEVQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U3RlcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQkJcmV0dXJuIGdldFRhc2soKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQkJcmV0dXJuIGdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlyZXR1cm4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJCXJldHVybiBnZXRBc3Npc3RlZEJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQlyZXR1cm4gZ2V0RXh0ZXJuYWxJbnB1dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCXJldHVybiBnZXRNYW5kYXRvcnlJbnB1dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJcmV0dXJuIGdldE9wdGlvbmFsSW5wdXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQlyZXR1cm4gZ2V0T3V0cHV0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TVEVQOgotCQkJCXJldHVybiBnZXRTdGVwKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJCXNldFRhc2soKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCQlzZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5jbGVhcigpOwotCQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCQlnZXRBc3Npc3RlZEJ5KCkuY2xlYXIoKTsKLQkJCQlnZXRBc3Npc3RlZEJ5KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQlnZXRFeHRlcm5hbElucHV0KCkuY2xlYXIoKTsKLQkJCQlnZXRFeHRlcm5hbElucHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJCWdldE1hbmRhdG9yeUlucHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCQlnZXRPcHRpb25hbElucHV0KCkuY2xlYXIoKTsKLQkJCQlnZXRPcHRpb25hbElucHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQkJZ2V0T3V0cHV0KCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRwdXQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NURVA6Ci0JCQkJZ2V0U3RlcCgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3RlcCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCQlzZXRUYXNrKFRBU0tfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQkJc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoUEVSRk9STUVEX1BSSU1BUklMWV9CWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQkJZ2V0QXNzaXN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJZ2V0RXh0ZXJuYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCWdldE1hbmRhdG9yeUlucHV0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCQlnZXRPcHRpb25hbElucHV0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQkJZ2V0T3V0cHV0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TVEVQOgotCQkJCWdldFN0ZXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQl1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCQlyZXR1cm4gVEFTS19FREVGQVVMVCA9PSBudWxsID8gdGFzayAhPSBudWxsIDogIVRBU0tfRURFRkFVTFQuZXF1YWxzKHRhc2spOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCQlyZXR1cm4gUEVSRk9STUVEX1BSSU1BUklMWV9CWV9FREVGQVVMVCA9PSBudWxsID8gcGVyZm9ybWVkUHJpbWFyaWx5QnkgIT0gbnVsbCA6ICFQRVJGT1JNRURfUFJJTUFSSUxZX0JZX0VERUZBVUxULmVxdWFscyhwZXJmb3JtZWRQcmltYXJpbHlCeSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlyZXR1cm4gIWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQkJcmV0dXJuICFnZXRBc3Npc3RlZEJ5KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJcmV0dXJuICFnZXRFeHRlcm5hbElucHV0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCXJldHVybiAhZ2V0TWFuZGF0b3J5SW5wdXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCQlyZXR1cm4gIWdldE9wdGlvbmFsSW5wdXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQkJcmV0dXJuICFnZXRPdXRwdXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TVEVQOgotCQkJCXJldHVybiBzdGVwICE9IG51bGwgJiYgIXN0ZXAuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXJldHVybiBpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGFzazogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFzayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyZm9ybWVkUHJpbWFyaWx5Qnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBlcmZvcm1lZFByaW1hcmlseUJ5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOiAiKTsKLQkJaWYgKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQpIHJlc3VsdC5hcHBlbmQoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Rhc2tEZXNjcmlwdG9ySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGFza0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGFza0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzc5NmNmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldFBlcmZvcm1lZEJ5IDxlbT5QZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRFc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0ltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBUYXNrIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWNvbmRpdGlvbiA9IFBSRUNPTkRJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvc3Rjb25kaXRpb24gPSBQT1NUQ09ORElUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmZvcm1lZEJ5KCkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyZm9ybWVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUkZPUk1FRF9CWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJmb3JtZWRCeSgpIDxlbT5QZXJmb3JtZWQgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmZvcm1lZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBlcmZvcm1lZEJ5ID0gUEVSRk9STUVEX0JZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlY29uZGl0aW9uKFN0cmluZyBuZXdQcmVjb25kaXRpb24pIHsKLQkJU3RyaW5nIG9sZFByZWNvbmRpdGlvbiA9IHByZWNvbmRpdGlvbjsKLQkJcHJlY29uZGl0aW9uID0gbmV3UHJlY29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTiwgb2xkUHJlY29uZGl0aW9uLCBwcmVjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oU3RyaW5nIG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJU3RyaW5nIG9sZFBvc3Rjb25kaXRpb24gPSBwb3N0Y29uZGl0aW9uOwotCQlwb3N0Y29uZGl0aW9uID0gbmV3UG9zdGNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBvbGRQb3N0Y29uZGl0aW9uLCBwb3N0Y29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQZXJmb3JtZWRCeSgpIHsKLQkJcmV0dXJuIHBlcmZvcm1lZEJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcmZvcm1lZEJ5KFN0cmluZyBuZXdQZXJmb3JtZWRCeSkgewotCQlTdHJpbmcgb2xkUGVyZm9ybWVkQnkgPSBwZXJmb3JtZWRCeTsKLQkJcGVyZm9ybWVkQnkgPSBuZXdQZXJmb3JtZWRCeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlksIG9sZFBlcmZvcm1lZEJ5LCBwZXJmb3JtZWRCeSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuVEFTS19fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNYW5kYXRvcnlJbnB1dCgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX01BTkRBVE9SWV9JTlBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE91dHB1dCgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX09VVFBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE9wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19PUFRJT05BTF9JTlBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVzdGltYXRlKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fRVNUSU1BVEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VG9vbE1lbnRvcigpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX1RPT0xfTUVOVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gZ2V0UHJlY29uZGl0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCQlyZXR1cm4gZ2V0UGVyZm9ybWVkQnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlyZXR1cm4gZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQkJcmV0dXJuIGdldE91dHB1dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJcmV0dXJuIGdldE9wdGlvbmFsSW5wdXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFURToKLQkJCQlyZXR1cm4gZ2V0RXN0aW1hdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCXJldHVybiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUjoKLQkJCQlyZXR1cm4gZ2V0VG9vbE1lbnRvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQkJCXNldFByZWNvbmRpdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTjoKLQkJCQlzZXRQb3N0Y29uZGl0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlk6Ci0JCQkJc2V0UGVyZm9ybWVkQnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQkJZ2V0T3V0cHV0KCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRwdXQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFURToKLQkJCQlnZXRFc3RpbWF0ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXN0aW1hdGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1I6Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmNsZWFyKCk7Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQkJc2V0UHJlY29uZGl0aW9uKFBSRUNPTkRJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQkJc2V0UG9zdGNvbmRpdGlvbihQT1NUQ09ORElUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJCXNldFBlcmZvcm1lZEJ5KFBFUkZPUk1FRF9CWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQkJZ2V0T3V0cHV0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFURToKLQkJCQlnZXRFc3RpbWF0ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1I6Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBQUkVDT05ESVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHByZWNvbmRpdGlvbiAhPSBudWxsIDogIVBSRUNPTkRJVElPTl9FREVGQVVMVC5lcXVhbHMocHJlY29uZGl0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBQT1NUQ09ORElUSU9OX0VERUZBVUxUID09IG51bGwgPyBwb3N0Y29uZGl0aW9uICE9IG51bGwgOiAhUE9TVENPTkRJVElPTl9FREVGQVVMVC5lcXVhbHMocG9zdGNvbmRpdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJCXJldHVybiBQRVJGT1JNRURfQllfRURFRkFVTFQgPT0gbnVsbCA/IHBlcmZvcm1lZEJ5ICE9IG51bGwgOiAhUEVSRk9STUVEX0JZX0VERUZBVUxULmVxdWFscyhwZXJmb3JtZWRCeSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJcmV0dXJuICFnZXRNYW5kYXRvcnlJbnB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQkJcmV0dXJuICFnZXRPdXRwdXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlyZXR1cm4gIWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJCXJldHVybiAhZ2V0T3B0aW9uYWxJbnB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFURToKLQkJCQlyZXR1cm4gIWdldEVzdGltYXRlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuICFnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuICFnZXRUb29sTWVudG9yKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlY29uZGl0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVjb25kaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBvc3Rjb25kaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBvc3Rjb25kaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBlcmZvcm1lZEJ5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwZXJmb3JtZWRCeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UYXNrSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVhbVByb2ZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1RlYW1Qcm9maWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMGUyMWNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVhbVByb2ZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUZWFtUHJvZmlsZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlYW0gUHJvZmlsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsI2dldFJvbGUgPGVtPlJvbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0U3ViVGVhbSA8ZW0+U3ViIFRlYW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZWFtUHJvZmlsZUltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRlYW1Qcm9maWxlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDEoKSA8ZW0+R3JvdXAxPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAxID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZWFtUHJvZmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFQU1fUFJPRklMRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDEoKSB7Ci0JCWlmIChncm91cDEgPT0gbnVsbCkgewotCQkJZ3JvdXAxID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fR1JPVVAxKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAxOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSb2xlKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMSgpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVBTV9QUk9GSUxFX19ST0xFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U3VwZXJUZWFtKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMSgpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U3ViVGVhbSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDEoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRFQU1fUFJPRklMRV9fU1VCX1RFQU0pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX0dST1VQMToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX0dST1VQMToKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDEoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19ST0xFOgotCQkJCXJldHVybiBnZXRSb2xlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJCXJldHVybiBnZXRTdXBlclRlYW0oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJCXJldHVybiBnZXRTdWJUZWFtKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX0dST1VQMToKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fUk9MRToKLQkJCQlnZXRSb2xlKCkuY2xlYXIoKTsKLQkJCQlnZXRSb2xlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJCWdldFN1cGVyVGVhbSgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3VwZXJUZWFtKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCQlnZXRTdWJUZWFtKCkuY2xlYXIoKTsKLQkJCQlnZXRTdWJUZWFtKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fUk9MRToKLQkJCQlnZXRSb2xlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJCWdldFN1cGVyVGVhbSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQkJZ2V0U3ViVGVhbSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19HUk9VUDE6Ci0JCQkJcmV0dXJuIGdyb3VwMSAhPSBudWxsICYmICFncm91cDEuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fUk9MRToKLQkJCQlyZXR1cm4gIWdldFJvbGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJCXJldHVybiAhZ2V0U3VwZXJUZWFtKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQkJcmV0dXJuICFnZXRTdWJUZWFtKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAxOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDEpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UZWFtUHJvZmlsZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1RlbXBsYXRlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZW1wbGF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTg1MzcxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1RlbXBsYXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUZW1wbGF0ZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBUZW1wbGF0ZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRlbXBsYXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVNUExBVEU7Ci0JfQotCi19IC8vVGVtcGxhdGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZXJtRGVmaW5pdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVybURlZmluaXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiNTBiYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZXJtRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGVybURlZmluaXRpb25JbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlcm0gRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlcm1EZWZpbml0aW9uSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFRlcm1EZWZpbml0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVybURlZmluaXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5URVJNX0RFRklOSVRJT047Ci0JfQotCi19IC8vVGVybURlZmluaXRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Ub29sSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Ub29sSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZDQ4MmZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVG9vbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRvb2xJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbEltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbEltcGwjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBUb29sIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUb29sSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVE9PTDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlRPT0xfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VG9vbE1lbnRvcigpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRPT0xfX1RPT0xfTUVOVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuIGdldFRvb2xNZW50b3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX1RPT0xfTUVOVE9SOgotCQkJCWdldFRvb2xNZW50b3IoKS5jbGVhcigpOwotCQkJCWdldFRvb2xNZW50b3IoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX1RPT0xfTUVOVE9SOgotCQkJCWdldFRvb2xNZW50b3IoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuICFnZXRUb29sTWVudG9yKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Ub29sSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVG9vbE1lbnRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVG9vbE1lbnRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTYzM2E4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rvb2xNZW50b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRvb2xNZW50b3JJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sTWVudG9ySW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFRvb2xNZW50b3IgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUb29sTWVudG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVE9PTF9NRU5UT1I7Ci0JfQotCi19IC8vVG9vbE1lbnRvckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1VtYUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1VtYUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhYWI3ZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9VbWFGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYUZhY3RvcnlJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgVW1hRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVW1hRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJVW1hRmFjdG9yeSB0aGVVbWFGYWN0b3J5ID0gKFVtYUZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyIpOyAKLQkJCWlmICh0aGVVbWFGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlVW1hRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBVbWFGYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFk6IHJldHVybiAoRU9iamVjdCljcmVhdGVBY3Rpdml0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQXJ0aWZhY3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUJyZWFrZG93bkVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNBUEFCSUxJVFlfUEFUVEVSTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ0hFQ0tMSVNUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ2hlY2tsaXN0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb21wb3NpdGVSb2xlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OQ0VQVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbmNlcHQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29uc3RyYWludCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb250ZW50Q2F0ZWdvcnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbnRlbnRFbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29udGVudFBhY2thZ2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVDdXN0b21DYXRlZ29yeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVsaXZlcmFibGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURlc2NyaWJhYmxlRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVEZXNjcmlwdG9yKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkU6IHJldHVybiAoRU9iamVjdCljcmVhdGVEaXNjaXBsaW5lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVEb2N1bWVudFJvb3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU46IHJldHVybiAoRU9iamVjdCljcmVhdGVEb21haW4oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRXN0aW1hdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU5HX01FVFJJQzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVzdGltYXRpbmdNZXRyaWMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVhBTVBMRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUV4YW1wbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUd1aWRhbmNlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREVMSU5FOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlR3VpZGVsaW5lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuSVRFUkFUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlSXRlcmF0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RMaWJyYXJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RQYWNrYWdlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWV0aG9kVW5pdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1JTEVTVE9ORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1pbGVzdG9uZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVOYW1lZEVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5PVVRDT01FOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlT3V0Y29tZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBBQ0tBR0VBQkxFX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QSEFTRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVBoYXNlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVBsYW5uaW5nRGF0YSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJhY3RpY2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvY2VzcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvY2Vzc0VsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJFUE9SVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJlcG9ydCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmV1c2FibGVBc3NldCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPQURNQVA6IHJldHVybiAoRU9iamVjdCljcmVhdGVSb2FkbWFwKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJvbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUm9sZURlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUm9sZURlc2NyaXB0b3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJvbGVTZXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJvbGVTZXRHcm91cGluZygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVTZWN0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0s6IHJldHVybiAoRU9iamVjdCljcmVhdGVUYXNrKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVRhc2tEZXNjcmlwdG9yKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVGVhbVByb2ZpbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URU1QTEFURTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVRlbXBsYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVGVybURlZmluaXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVG9vbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfTUVOVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVG9vbE1lbnRvcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldISVRFUEFQRVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVXaGl0ZXBhcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV29ya0RlZmluaXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV29ya09yZGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV29ya1Byb2R1Y3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVWYXJpYWJpbGl0eVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtPcmRlclR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY3JlYXRlVmFyaWFiaWxpdHlUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY3JlYXRlV29ya09yZGVyVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VmFyaWFiaWxpdHlUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRXb3JrT3JkZXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydFZhcmlhYmlsaXR5VHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydFdvcmtPcmRlclR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KCkgewotCQlBY3Rpdml0eUltcGwgYWN0aXZpdHkgPSBuZXcgQWN0aXZpdHlJbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXNjcmlwdGlvbiBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCkgewotCQlBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCBhY3Rpdml0eURlc2NyaXB0aW9uID0gbmV3IEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdCBjcmVhdGVBcnRpZmFjdCgpIHsKLQkJQXJ0aWZhY3RJbXBsIGFydGlmYWN0ID0gbmV3IEFydGlmYWN0SW1wbCgpOwotCQlyZXR1cm4gYXJ0aWZhY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0RGVzY3JpcHRpb24gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpIHsKLQkJQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwgYXJ0aWZhY3REZXNjcmlwdGlvbiA9IG5ldyBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gYXJ0aWZhY3REZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudCBjcmVhdGVCcmVha2Rvd25FbGVtZW50KCkgewotCQlCcmVha2Rvd25FbGVtZW50SW1wbCBicmVha2Rvd25FbGVtZW50ID0gbmV3IEJyZWFrZG93bkVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkgewotCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiA9IG5ldyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhcGFiaWxpdHlQYXR0ZXJuIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCkgewotCQlDYXBhYmlsaXR5UGF0dGVybkltcGwgY2FwYWJpbGl0eVBhdHRlcm4gPSBuZXcgQ2FwYWJpbGl0eVBhdHRlcm5JbXBsKCk7Ci0JCXJldHVybiBjYXBhYmlsaXR5UGF0dGVybjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2hlY2tsaXN0IGNyZWF0ZUNoZWNrbGlzdCgpIHsKLQkJQ2hlY2tsaXN0SW1wbCBjaGVja2xpc3QgPSBuZXcgQ2hlY2tsaXN0SW1wbCgpOwotCQlyZXR1cm4gY2hlY2tsaXN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVSb2xlIGNyZWF0ZUNvbXBvc2l0ZVJvbGUoKSB7Ci0JCUNvbXBvc2l0ZVJvbGVJbXBsIGNvbXBvc2l0ZVJvbGUgPSBuZXcgQ29tcG9zaXRlUm9sZUltcGwoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZVJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbmNlcHQgY3JlYXRlQ29uY2VwdCgpIHsKLQkJQ29uY2VwdEltcGwgY29uY2VwdCA9IG5ldyBDb25jZXB0SW1wbCgpOwotCQlyZXR1cm4gY29uY2VwdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBjcmVhdGVDb25zdHJhaW50KCkgewotCQlDb25zdHJhaW50SW1wbCBjb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnRJbXBsKCk7Ci0JCXJldHVybiBjb25zdHJhaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcnkgY3JlYXRlQ29udGVudENhdGVnb3J5KCkgewotCQlDb250ZW50Q2F0ZWdvcnlJbXBsIGNvbnRlbnRDYXRlZ29yeSA9IG5ldyBDb250ZW50Q2F0ZWdvcnlJbXBsKCk7Ci0JCXJldHVybiBjb250ZW50Q2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UgY3JlYXRlQ29udGVudENhdGVnb3J5UGFja2FnZSgpIHsKLQkJQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwgY29udGVudENhdGVnb3J5UGFja2FnZSA9IG5ldyBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gY29udGVudENhdGVnb3J5UGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudERlc2NyaXB0aW9uIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigpIHsKLQkJQ29udGVudERlc2NyaXB0aW9uSW1wbCBjb250ZW50RGVzY3JpcHRpb24gPSBuZXcgQ29udGVudERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudCBjcmVhdGVDb250ZW50RWxlbWVudCgpIHsKLQkJQ29udGVudEVsZW1lbnRJbXBsIGNvbnRlbnRFbGVtZW50ID0gbmV3IENvbnRlbnRFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRQYWNrYWdlIGNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkgewotCQlDb250ZW50UGFja2FnZUltcGwgY29udGVudFBhY2thZ2UgPSBuZXcgQ29udGVudFBhY2thZ2VJbXBsKCk7Ci0JCXJldHVybiBjb250ZW50UGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnkgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKSB7Ci0JCUN1c3RvbUNhdGVnb3J5SW1wbCBjdXN0b21DYXRlZ29yeSA9IG5ldyBDdXN0b21DYXRlZ29yeUltcGwoKTsKLQkJcmV0dXJuIGN1c3RvbUNhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZSBjcmVhdGVEZWxpdmVyYWJsZSgpIHsKLQkJRGVsaXZlcmFibGVJbXBsIGRlbGl2ZXJhYmxlID0gbmV3IERlbGl2ZXJhYmxlSW1wbCgpOwotCQlyZXR1cm4gZGVsaXZlcmFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbigpIHsKLQkJRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwgZGVsaXZlcmFibGVEZXNjcmlwdGlvbiA9IG5ldyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzIGNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpIHsKLQkJRGVsaXZlcnlQcm9jZXNzSW1wbCBkZWxpdmVyeVByb2Nlc3MgPSBuZXcgRGVsaXZlcnlQcm9jZXNzSW1wbCgpOwotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpIHsKLQkJRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uID0gbmV3IERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaWJhYmxlRWxlbWVudCBjcmVhdGVEZXNjcmliYWJsZUVsZW1lbnQoKSB7Ci0JCURlc2NyaWJhYmxlRWxlbWVudEltcGwgZGVzY3JpYmFibGVFbGVtZW50ID0gbmV3IERlc2NyaWJhYmxlRWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIGRlc2NyaWJhYmxlRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRvciBjcmVhdGVEZXNjcmlwdG9yKCkgewotCQlEZXNjcmlwdG9ySW1wbCBkZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9yRGVzY3JpcHRpb24gY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uKCkgewotCQlEZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsIGRlc2NyaXB0b3JEZXNjcmlwdGlvbiA9IG5ldyBEZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBkZXNjcmlwdG9yRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc2NpcGxpbmUgY3JlYXRlRGlzY2lwbGluZSgpIHsKLQkJRGlzY2lwbGluZUltcGwgZGlzY2lwbGluZSA9IG5ldyBEaXNjaXBsaW5lSW1wbCgpOwotCQlyZXR1cm4gZGlzY2lwbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUdyb3VwaW5nIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpIHsKLQkJRGlzY2lwbGluZUdyb3VwaW5nSW1wbCBkaXNjaXBsaW5lR3JvdXBpbmcgPSBuZXcgRGlzY2lwbGluZUdyb3VwaW5nSW1wbCgpOwotCQlyZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb2N1bWVudFJvb3QgY3JlYXRlRG9jdW1lbnRSb290KCkgewotCQlEb2N1bWVudFJvb3RJbXBsIGRvY3VtZW50Um9vdCA9IG5ldyBEb2N1bWVudFJvb3RJbXBsKCk7Ci0JCXJldHVybiBkb2N1bWVudFJvb3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvbWFpbiBjcmVhdGVEb21haW4oKSB7Ci0JCURvbWFpbkltcGwgZG9tYWluID0gbmV3IERvbWFpbkltcGwoKTsKLQkJcmV0dXJuIGRvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkgewotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gbmV3IEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFc3RpbWF0ZSBjcmVhdGVFc3RpbWF0ZSgpIHsKLQkJRXN0aW1hdGVJbXBsIGVzdGltYXRlID0gbmV3IEVzdGltYXRlSW1wbCgpOwotCQlyZXR1cm4gZXN0aW1hdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVzdGltYXRpbmdNZXRyaWMgY3JlYXRlRXN0aW1hdGluZ01ldHJpYygpIHsKLQkJRXN0aW1hdGluZ01ldHJpY0ltcGwgZXN0aW1hdGluZ01ldHJpYyA9IG5ldyBFc3RpbWF0aW5nTWV0cmljSW1wbCgpOwotCQlyZXR1cm4gZXN0aW1hdGluZ01ldHJpYzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPSBuZXcgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCgpOwotCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeGFtcGxlIGNyZWF0ZUV4YW1wbGUoKSB7Ci0JCUV4YW1wbGVJbXBsIGV4YW1wbGUgPSBuZXcgRXhhbXBsZUltcGwoKTsKLQkJcmV0dXJuIGV4YW1wbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEd1aWRhbmNlIGNyZWF0ZUd1aWRhbmNlKCkgewotCQlHdWlkYW5jZUltcGwgZ3VpZGFuY2UgPSBuZXcgR3VpZGFuY2VJbXBsKCk7Ci0JCXJldHVybiBndWlkYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VEZXNjcmlwdGlvbiBjcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCkgewotCQlHdWlkYW5jZURlc2NyaXB0aW9uSW1wbCBndWlkYW5jZURlc2NyaXB0aW9uID0gbmV3IEd1aWRhbmNlRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBndWlkYW5jZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkZWxpbmUgY3JlYXRlR3VpZGVsaW5lKCkgewotCQlHdWlkZWxpbmVJbXBsIGd1aWRlbGluZSA9IG5ldyBHdWlkZWxpbmVJbXBsKCk7Ci0JCXJldHVybiBndWlkZWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEl0ZXJhdGlvbiBjcmVhdGVJdGVyYXRpb24oKSB7Ci0JCUl0ZXJhdGlvbkltcGwgaXRlcmF0aW9uID0gbmV3IEl0ZXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGl0ZXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uSW1wbCBtZXRob2RDb25maWd1cmF0aW9uID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsKCk7Ci0JCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGNyZWF0ZU1ldGhvZEVsZW1lbnQoKSB7Ci0JCU1ldGhvZEVsZW1lbnRJbXBsIG1ldGhvZEVsZW1lbnQgPSBuZXcgTWV0aG9kRWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgY3JlYXRlTWV0aG9kTGlicmFyeSgpIHsKLQkJTWV0aG9kTGlicmFyeUltcGwgbWV0aG9kTGlicmFyeSA9IG5ldyBNZXRob2RMaWJyYXJ5SW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kTGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFja2FnZSBjcmVhdGVNZXRob2RQYWNrYWdlKCkgewotCQlNZXRob2RQYWNrYWdlSW1wbCBtZXRob2RQYWNrYWdlID0gbmV3IE1ldGhvZFBhY2thZ2VJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKCkgewotCQlNZXRob2RQbHVnaW5JbXBsIG1ldGhvZFBsdWdpbiA9IG5ldyBNZXRob2RQbHVnaW5JbXBsKCk7Ci0JCXJldHVybiBtZXRob2RQbHVnaW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFVuaXQgY3JlYXRlTWV0aG9kVW5pdCgpIHsKLQkJTWV0aG9kVW5pdEltcGwgbWV0aG9kVW5pdCA9IG5ldyBNZXRob2RVbml0SW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kVW5pdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWlsZXN0b25lIGNyZWF0ZU1pbGVzdG9uZSgpIHsKLQkJTWlsZXN0b25lSW1wbCBtaWxlc3RvbmUgPSBuZXcgTWlsZXN0b25lSW1wbCgpOwotCQlyZXR1cm4gbWlsZXN0b25lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOYW1lZEVsZW1lbnQgY3JlYXRlTmFtZWRFbGVtZW50KCkgewotCQlOYW1lZEVsZW1lbnRJbXBsIG5hbWVkRWxlbWVudCA9IG5ldyBOYW1lZEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBuYW1lZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGNvbWUgY3JlYXRlT3V0Y29tZSgpIHsKLQkJT3V0Y29tZUltcGwgb3V0Y29tZSA9IG5ldyBPdXRjb21lSW1wbCgpOwotCQlyZXR1cm4gb3V0Y29tZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFja2FnZWFibGVFbGVtZW50IGNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudCgpIHsKLQkJUGFja2FnZWFibGVFbGVtZW50SW1wbCBwYWNrYWdlYWJsZUVsZW1lbnQgPSBuZXcgUGFja2FnZWFibGVFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gcGFja2FnZWFibGVFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQaGFzZSBjcmVhdGVQaGFzZSgpIHsKLQkJUGhhc2VJbXBsIHBoYXNlID0gbmV3IFBoYXNlSW1wbCgpOwotCQlyZXR1cm4gcGhhc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBsYW5uaW5nRGF0YSBjcmVhdGVQbGFubmluZ0RhdGEoKSB7Ci0JCVBsYW5uaW5nRGF0YUltcGwgcGxhbm5pbmdEYXRhID0gbmV3IFBsYW5uaW5nRGF0YUltcGwoKTsKLQkJcmV0dXJuIHBsYW5uaW5nRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJhY3RpY2UgY3JlYXRlUHJhY3RpY2UoKSB7Ci0JCVByYWN0aWNlSW1wbCBwcmFjdGljZSA9IG5ldyBQcmFjdGljZUltcGwoKTsKLQkJcmV0dXJuIHByYWN0aWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmFjdGljZURlc2NyaXB0aW9uIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKSB7Ci0JCVByYWN0aWNlRGVzY3JpcHRpb25JbXBsIHByYWN0aWNlRGVzY3JpcHRpb24gPSBuZXcgUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHByYWN0aWNlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgY3JlYXRlUHJvY2VzcygpIHsKLQkJUHJvY2Vzc0ltcGwgcHJvY2VzcyA9IG5ldyBQcm9jZXNzSW1wbCgpOwotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudCBjcmVhdGVQcm9jZXNzQ29tcG9uZW50KCkgewotCQlQcm9jZXNzQ29tcG9uZW50SW1wbCBwcm9jZXNzQ29tcG9uZW50ID0gbmV3IFByb2Nlc3NDb21wb25lbnRJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSB7Ci0JCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgcHJvY2Vzc0Rlc2NyaXB0aW9uID0gbmV3IFByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnQgY3JlYXRlUHJvY2Vzc0VsZW1lbnQoKSB7Ci0JCVByb2Nlc3NFbGVtZW50SW1wbCBwcm9jZXNzRWxlbWVudCA9IG5ldyBQcm9jZXNzRWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzUGFja2FnZSgpIHsKLQkJUHJvY2Vzc1BhY2thZ2VJbXBsIHByb2Nlc3NQYWNrYWdlID0gbmV3IFByb2Nlc3NQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkgewotCQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwgcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgPSBuZXcgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVwb3J0IGNyZWF0ZVJlcG9ydCgpIHsKLQkJUmVwb3J0SW1wbCByZXBvcnQgPSBuZXcgUmVwb3J0SW1wbCgpOwotCQlyZXR1cm4gcmVwb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXVzYWJsZUFzc2V0IGNyZWF0ZVJldXNhYmxlQXNzZXQoKSB7Ci0JCVJldXNhYmxlQXNzZXRJbXBsIHJldXNhYmxlQXNzZXQgPSBuZXcgUmV1c2FibGVBc3NldEltcGwoKTsKLQkJcmV0dXJuIHJldXNhYmxlQXNzZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvYWRtYXAgY3JlYXRlUm9hZG1hcCgpIHsKLQkJUm9hZG1hcEltcGwgcm9hZG1hcCA9IG5ldyBSb2FkbWFwSW1wbCgpOwotCQlyZXR1cm4gcm9hZG1hcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZSBjcmVhdGVSb2xlKCkgewotCQlSb2xlSW1wbCByb2xlID0gbmV3IFJvbGVJbXBsKCk7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRpb24gY3JlYXRlUm9sZURlc2NyaXB0aW9uKCkgewotCQlSb2xlRGVzY3JpcHRpb25JbXBsIHJvbGVEZXNjcmlwdGlvbiA9IG5ldyBSb2xlRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkgewotCQlSb2xlRGVzY3JpcHRvckltcGwgcm9sZURlc2NyaXB0b3IgPSBuZXcgUm9sZURlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVNldCBjcmVhdGVSb2xlU2V0KCkgewotCQlSb2xlU2V0SW1wbCByb2xlU2V0ID0gbmV3IFJvbGVTZXRJbXBsKCk7Ci0JCXJldHVybiByb2xlU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlU2V0R3JvdXBpbmcgY3JlYXRlUm9sZVNldEdyb3VwaW5nKCkgewotCQlSb2xlU2V0R3JvdXBpbmdJbXBsIHJvbGVTZXRHcm91cGluZyA9IG5ldyBSb2xlU2V0R3JvdXBpbmdJbXBsKCk7Ci0JCXJldHVybiByb2xlU2V0R3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3Rpb24gY3JlYXRlU2VjdGlvbigpIHsKLQkJU2VjdGlvbkltcGwgc2VjdGlvbiA9IG5ldyBTZWN0aW9uSW1wbCgpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpIHsKLQkJU3VwcG9ydGluZ01hdGVyaWFsSW1wbCBzdXBwb3J0aW5nTWF0ZXJpYWwgPSBuZXcgU3VwcG9ydGluZ01hdGVyaWFsSW1wbCgpOwotCQlyZXR1cm4gc3VwcG9ydGluZ01hdGVyaWFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrIGNyZWF0ZVRhc2soKSB7Ci0JCVRhc2tJbXBsIHRhc2sgPSBuZXcgVGFza0ltcGwoKTsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdGlvbiBjcmVhdGVUYXNrRGVzY3JpcHRpb24oKSB7Ci0JCVRhc2tEZXNjcmlwdGlvbkltcGwgdGFza0Rlc2NyaXB0aW9uID0gbmV3IFRhc2tEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0b3IgY3JlYXRlVGFza0Rlc2NyaXB0b3IoKSB7Ci0JCVRhc2tEZXNjcmlwdG9ySW1wbCB0YXNrRGVzY3JpcHRvciA9IG5ldyBUYXNrRGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZSBjcmVhdGVUZWFtUHJvZmlsZSgpIHsKLQkJVGVhbVByb2ZpbGVJbXBsIHRlYW1Qcm9maWxlID0gbmV3IFRlYW1Qcm9maWxlSW1wbCgpOwotCQlyZXR1cm4gdGVhbVByb2ZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlbXBsYXRlIGNyZWF0ZVRlbXBsYXRlKCkgewotCQlUZW1wbGF0ZUltcGwgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGVJbXBsKCk7Ci0JCXJldHVybiB0ZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVybURlZmluaXRpb24gY3JlYXRlVGVybURlZmluaXRpb24oKSB7Ci0JCVRlcm1EZWZpbml0aW9uSW1wbCB0ZXJtRGVmaW5pdGlvbiA9IG5ldyBUZXJtRGVmaW5pdGlvbkltcGwoKTsKLQkJcmV0dXJuIHRlcm1EZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUb29sIGNyZWF0ZVRvb2woKSB7Ci0JCVRvb2xJbXBsIHRvb2wgPSBuZXcgVG9vbEltcGwoKTsKLQkJcmV0dXJuIHRvb2w7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRvb2xNZW50b3IgY3JlYXRlVG9vbE1lbnRvcigpIHsKLQkJVG9vbE1lbnRvckltcGwgdG9vbE1lbnRvciA9IG5ldyBUb29sTWVudG9ySW1wbCgpOwotCQlyZXR1cm4gdG9vbE1lbnRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2hpdGVwYXBlciBjcmVhdGVXaGl0ZXBhcGVyKCkgewotCQlXaGl0ZXBhcGVySW1wbCB3aGl0ZXBhcGVyID0gbmV3IFdoaXRlcGFwZXJJbXBsKCk7Ci0JCXJldHVybiB3aGl0ZXBhcGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrQnJlYWtkb3duRWxlbWVudCBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudCgpIHsKLQkJV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIHdvcmtCcmVha2Rvd25FbGVtZW50ID0gbmV3IFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gd29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtEZWZpbml0aW9uIGNyZWF0ZVdvcmtEZWZpbml0aW9uKCkgewotCQlXb3JrRGVmaW5pdGlvbkltcGwgd29ya0RlZmluaXRpb24gPSBuZXcgV29ya0RlZmluaXRpb25JbXBsKCk7Ci0JCXJldHVybiB3b3JrRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyIGNyZWF0ZVdvcmtPcmRlcigpIHsKLQkJV29ya09yZGVySW1wbCB3b3JrT3JkZXIgPSBuZXcgV29ya09yZGVySW1wbCgpOwotCQlyZXR1cm4gd29ya09yZGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdCBjcmVhdGVXb3JrUHJvZHVjdCgpIHsKLQkJV29ya1Byb2R1Y3RJbXBsIHdvcmtQcm9kdWN0ID0gbmV3IFdvcmtQcm9kdWN0SW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwgd29ya1Byb2R1Y3REZXNjcmlwdGlvbiA9IG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCB3b3JrUHJvZHVjdERlc2NyaXB0b3IgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGUgY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCkgewotCQlXb3JrUHJvZHVjdFR5cGVJbXBsIHdvcmtQcm9kdWN0VHlwZSA9IG5ldyBXb3JrUHJvZHVjdFR5cGVJbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5VHlwZSBjcmVhdGVWYXJpYWJpbGl0eVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIHJlc3VsdCA9IFZhcmlhYmlsaXR5VHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFyaWFiaWxpdHlUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtPcmRlclR5cGUgY3JlYXRlV29ya09yZGVyVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlXb3JrT3JkZXJUeXBlIHJlc3VsdCA9IFdvcmtPcmRlclR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFdvcmtPcmRlclR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGNyZWF0ZVZhcmlhYmlsaXR5VHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFZhcmlhYmlsaXR5VHlwZSljcmVhdGVWYXJpYWJpbGl0eVR5cGVGcm9tU3RyaW5nKFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydFZhcmlhYmlsaXR5VHlwZVRvU3RyaW5nKFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtPcmRlclR5cGUgY3JlYXRlV29ya09yZGVyVHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFdvcmtPcmRlclR5cGUpY3JlYXRlV29ya09yZGVyVHlwZUZyb21TdHJpbmcoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX09SREVSX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya09yZGVyVHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBjb252ZXJ0V29ya09yZGVyVHlwZVRvU3RyaW5nKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19PUkRFUl9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hUGFja2FnZSBnZXRVbWFQYWNrYWdlKCkgewotCQlyZXR1cm4gKFVtYVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVW1hUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vVW1hRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVW1hUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVW1hUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWRjM2UzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1VtYVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVW1hUGFja2FnZUltcGwuamF2YSx2IDEuNiAyMDA2LzA5LzA4IDAwOjU5OjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpbmdNZXRyaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBVbWFQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3Rpdml0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFydGlmYWN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2hlY2tsaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbXBvc2l0ZVJvbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29uY2VwdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb25zdHJhaW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRlbnRDYXRlZ29yeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50UGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjdXN0b21DYXRlZ29yeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyYWJsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlzY2lwbGluZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZG9jdW1lbnRSb290RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRvbWFpbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVzdGltYXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVzdGltYXRpbmdNZXRyaWNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4YW1wbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3VpZGFuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBndWlkZWxpbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaXRlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RMaWJyYXJ5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFBhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kUGx1Z2luRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFVuaXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWlsZXN0b25lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG5hbWVkRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvdXRjb21lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwaGFzZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwbGFubmluZ0RhdGFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJhY3RpY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NDb21wb25lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0VsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc1BhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmVwb3J0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJldXNhYmxlQXNzZXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9hZG1hcEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlRGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlU2V0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVTZXRHcm91cGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZWN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhc2tEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrRGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZWFtUHJvZmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZW1wbGF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZXJtRGVmaW5pdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0b29sRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRvb2xNZW50b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2hpdGVwYXBlckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrRGVmaW5pdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrT3JkZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3RUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gdmFyaWFiaWxpdHlUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB3b3JrT3JkZXJUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdmFyaWFiaWxpdHlUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHdvcmtPcmRlclR5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVW1hUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIFVtYUZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVW1hUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoVW1hUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShVbWFQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJVW1hUGFja2FnZUltcGwgdGhlVW1hUGFja2FnZSA9IChVbWFQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBVbWFQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IFVtYVBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVVtYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVVbWFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZVVtYVBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZVVtYVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBY3Rpdml0eSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfUG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9DaGVja2xpc3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X0NvbmNlcHQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X0V4YW1wbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X0d1aWRlbGluZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfUm9hZG1hcCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfUmV1c2FibGVBc3NldCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfU3VwcG9ydGluZ01hdGVyaWFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfV2hpdGVwYXBlcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X0lzRW5hY3RhYmxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3dUb1N0YWZmKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFydGlmYWN0KCkgewotCQlyZXR1cm4gYXJ0aWZhY3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3RfR3JvdXAzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJ0aWZhY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFydGlmYWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJyZWFrZG93bkVsZW1lbnQoKSB7Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENhcGFiaWxpdHlQYXR0ZXJuKCkgewotCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDaGVja2xpc3QoKSB7Ci0JCXJldHVybiBjaGVja2xpc3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb21wb3NpdGVSb2xlKCkgewotCQlyZXR1cm4gY29tcG9zaXRlUm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb21wb3NpdGVSb2xlX0dyb3VwMSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBvc2l0ZVJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29tcG9zaXRlUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29uY2VwdCgpIHsKLQkJcmV0dXJuIGNvbmNlcHRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb25zdHJhaW50KCkgewotCQlyZXR1cm4gY29uc3RyYWludEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25zdHJhaW50X01haW5EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRDYXRlZ29yeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKSB7Ci0JCXJldHVybiBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjb250ZW50RWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9Hcm91cDEoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9SZXVzYWJsZUFzc2V0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1doaXRlcGFwZXIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50UGFja2FnZSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRQYWNrYWdlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb250ZW50UGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q3VzdG9tQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjdXN0b21DYXRlZ29yeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDdXN0b21DYXRlZ29yeV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWN1c3RvbUNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcmFibGUoKSB7Ci0JCXJldHVybiBkZWxpdmVyYWJsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZV9Hcm91cDMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcmFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzKCkgewotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc19Hcm91cDMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyeVByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZXNjcmliYWJsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlzY2lwbGluZSgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzY2lwbGluZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzY2lwbGluZV9UYXNrKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGlzY2lwbGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERpc2NpcGxpbmVfU3ViRGlzY2lwbGluZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGlzY2lwbGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkgewotCQlyZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RG9jdW1lbnRSb290KCkgewotCQlyZXR1cm4gZG9jdW1lbnRSb290RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERvY3VtZW50Um9vdF9NaXhlZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9NZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X01ldGhvZExpYnJhcnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTWV0aG9kUGx1Z2luKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREb21haW4oKSB7Ci0JCXJldHVybiBkb21haW5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG9tYWluX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRvbWFpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERvbWFpbl9Xb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRvbWFpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvbWFpbl9TdWJkb21haW4oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb21haW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXN0aW1hdGUoKSB7Ci0JCXJldHVybiBlc3RpbWF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFc3RpbWF0ZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllc3RpbWF0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVzdGltYXRlX0VzdGltYXRpb25NZXRyaWMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllc3RpbWF0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVzdGltYXRlX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVzdGltYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFc3RpbWF0aW5nTWV0cmljKCkgewotCQlyZXR1cm4gZXN0aW1hdGluZ01ldHJpY0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBleGFtcGxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3VpZGFuY2UoKSB7Ci0JCXJldHVybiBndWlkYW5jZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEd1aWRhbmNlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEd1aWRlbGluZSgpIHsKLQkJcmV0dXJuIGd1aWRlbGluZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEl0ZXJhdGlvbigpIHsKLQkJcmV0dXJuIGl0ZXJhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlldygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfR3JvdXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZExpYnJhcnkoKSB7Ci0JCXJldHVybiBtZXRob2RMaWJyYXJ5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2luKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZExpYnJhcnlfTWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RMaWJyYXJ5X1Rvb2woKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RMaWJyYXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RQYWNrYWdlKCkgewotCQlyZXR1cm4gbWV0aG9kUGFja2FnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQYWNrYWdlX0dyb3VwMSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGFja2FnZV9NZXRob2RQYWNrYWdlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kUGx1Z2luKCkgewotCQlyZXR1cm4gbWV0aG9kUGx1Z2luRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBsdWdpbl9SZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kUGx1Z2luRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZFVuaXQoKSB7Ci0JCXJldHVybiBtZXRob2RVbml0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ29weXJpZ2h0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQXV0aG9ycygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X1ZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNaWxlc3RvbmUoKSB7Ci0JCXJldHVybiBtaWxlc3RvbmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXROYW1lZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBuYW1lZEVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TmFtZWRFbGVtZW50X05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSluYW1lZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE91dGNvbWUoKSB7Ci0JCXJldHVybiBvdXRjb21lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGFja2FnZWFibGVFbGVtZW50KCkgewotCQlyZXR1cm4gcGFja2FnZWFibGVFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGhhc2UoKSB7Ci0JCXJldHVybiBwaGFzZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBsYW5uaW5nRGF0YSgpIHsKLQkJcmV0dXJuIHBsYW5uaW5nRGF0YUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBsYW5uaW5nRGF0YUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9SYW5rKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGxhbm5pbmdEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBsYW5uaW5nRGF0YUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJhY3RpY2UoKSB7Ci0JCXJldHVybiBwcmFjdGljZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJhY3RpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJhY3RpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcmFjdGljZV9TdWJQcmFjdGljZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByYWN0aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3MoKSB7Ci0JCXJldHVybiBwcm9jZXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJuKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzQ29tcG9uZW50KCkgewotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0NvcHlyaWdodCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9BdXRob3JzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfR3JvdXAxKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NFbGVtZW50KCkgewotCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzUGFja2FnZSgpIHsKLQkJcmV0dXJuIHByb2Nlc3NQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NQYWNrYWdlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwcm9jZXNzUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSB7Ci0JCXJldHVybiBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9Hcm91cDMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VQcm9jZXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlcG9ydCgpIHsKLQkJcmV0dXJuIHJlcG9ydEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiByZXVzYWJsZUFzc2V0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9hZG1hcCgpIHsKLQkJcmV0dXJuIHJvYWRtYXBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlKCkgewotCQlyZXR1cm4gcm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcm9sZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gcm9sZURlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZVNldCgpIHsKLQkJcmV0dXJuIHJvbGVTZXRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZVNldF9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlU2V0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZVNldF9Sb2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZVNldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZVNldEdyb3VwaW5nKCkgewotCQlyZXR1cm4gcm9sZVNldEdyb3VwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVTZXRHcm91cGluZ19Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVTZXRHcm91cGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VjdGlvbigpIHsKLQkJcmV0dXJuIHNlY3Rpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9TdWJTZWN0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3Rpb25fVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2soKSB7Ci0JCXJldHVybiB0YXNrRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19PdXRwdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX09wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Fc3RpbWF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1Rvb2xNZW50b3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFza0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGFza0Rlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFza0Rlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUZWFtUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRlYW1Qcm9maWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX0dyb3VwMSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGVhbVByb2ZpbGVfUm9sZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGVhbVByb2ZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGVhbVByb2ZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gdGVtcGxhdGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUZXJtRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRlcm1EZWZpbml0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VG9vbCgpIHsKLQkJcmV0dXJuIHRvb2xFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VG9vbF9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0b29sRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VG9vbF9Ub29sTWVudG9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdG9vbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VG9vbE1lbnRvcigpIHsKLQkJcmV0dXJuIHRvb2xNZW50b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXaGl0ZXBhcGVyKCkgewotCQlyZXR1cm4gd2hpdGVwYXBlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkgewotCQlyZXR1cm4gd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfR3JvdXAxKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya0RlZmluaXRpb24oKSB7Ci0JCXJldHVybiB3b3JrRGVmaW5pdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya09yZGVyKCkgewotCQlyZXR1cm4gd29ya09yZGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtPcmRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtPcmRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtPcmRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X0VzdGltYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X1JlcG9ydCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0dyb3VwMSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0VHlwZSgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0VHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdFR5cGVfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRXb3JrT3JkZXJUeXBlKCkgewotCQlyZXR1cm4gd29ya09yZGVyVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0V29ya09yZGVyVHlwZU9iamVjdCgpIHsKLQkJcmV0dXJuIHdvcmtPcmRlclR5cGVPYmplY3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYUZhY3RvcnkgZ2V0VW1hRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChVbWFGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWFjdGl2aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKEFDVElWSVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1BSRUNPTkRJVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19QT1NUQ09ORElUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0dST1VQMik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19DSEVDS0xJU1QpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fQ09OQ0VQVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19FWEFNUExFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0dVSURFTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19ST0FETUFQKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fV0hJVEVQQVBFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19JU19FTkFDVEFCTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFKTsKLQotCQlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFDVElWSVRZX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLCBBQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLCBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSk7Ci0KLQkJYXJ0aWZhY3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJUSUZBQ1QpOwotCQljcmVhdGVFQXR0cmlidXRlKGFydGlmYWN0RUNsYXNzLCBBUlRJRkFDVF9fR1JPVVAzKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcnRpZmFjdEVDbGFzcywgQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVCk7Ci0KLQkJYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUlRJRkFDVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsIEFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TKTsKLQotCQlicmVha2Rvd25FbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEJSRUFLRE9XTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWCk7Ci0KLQkJYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSk7Ci0KLQkJY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0FQQUJJTElUWV9QQVRURVJOKTsKLQotCQljaGVja2xpc3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hFQ0tMSVNUKTsKLQotCQljb21wb3NpdGVSb2xlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTVBPU0lURV9ST0xFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb21wb3NpdGVSb2xlRUNsYXNzLCBDT01QT1NJVEVfUk9MRV9fR1JPVVAxKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb21wb3NpdGVSb2xlRUNsYXNzLCBDT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFKTsKLQotCQljb25jZXB0RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTkNFUFQpOwotCi0JCWNvbnN0cmFpbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29uc3RyYWludEVDbGFzcywgQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTik7Ci0KLQkJY29udGVudENhdGVnb3J5RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfQ0FURUdPUlkpOwotCi0JCWNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzLCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQMik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcywgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19DT05URU5UX0NBVEVHT1JZKTsKLQotCQljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLCBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsIENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLCBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OKTsKLQotCQljb250ZW50RWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX0dST1VQMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFKTsKLQotCQljb250ZW50UGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX1BBQ0tBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRQYWNrYWdlRUNsYXNzLCBDT05URU5UX1BBQ0tBR0VfX0dST1VQMik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudFBhY2thZ2VFQ2xhc3MsIENPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UKTsKLQotCQljdXN0b21DYXRlZ29yeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDVVNUT01fQ0FURUdPUlkpOwotCQljcmVhdGVFQXR0cmlidXRlKGN1c3RvbUNhdGVnb3J5RUNsYXNzLCBDVVNUT01fQ0FURUdPUllfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MsIENVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MsIENVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZKTsKLQotCQlkZWxpdmVyYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcmFibGVFQ2xhc3MsIERFTElWRVJBQkxFX19HUk9VUDMpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJhYmxlRUNsYXNzLCBERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVCk7Ci0KLQkJZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSQUJMRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcywgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFKTsKLQotCQlkZWxpdmVyeVByb2Nlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUllfUFJPQ0VTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX19HUk9VUDMpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywgREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywgREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMKTsKLQotCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QpOwotCi0JCWRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERVNDUklCQUJMRV9FTEVNRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsIERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLCBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLCBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLCBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04pOwotCi0JCWRlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRvckVDbGFzcywgREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFKTsKLQotCQlkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRPUl9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OKTsKLQotCQlkaXNjaXBsaW5lRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJU0NJUExJTkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRpc2NpcGxpbmVFQ2xhc3MsIERJU0NJUExJTkVfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fVEFTSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fU1VCX0RJU0NJUExJTkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRpc2NpcGxpbmVFQ2xhc3MsIERJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPVyk7Ci0KLQkJZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJU0NJUExJTkVfR1JPVVBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcywgRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MsIERJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkUpOwotCi0JCWRvY3VtZW50Um9vdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhET0NVTUVOVF9ST09UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX01JWEVEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvY3VtZW50Um9vdEVDbGFzcywgRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOKTsKLQotCQlkb21haW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRE9NQUlOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkb21haW5FQ2xhc3MsIERPTUFJTl9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkb21haW5FQ2xhc3MsIERPTUFJTl9fV09SS19QUk9EVUNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb21haW5FQ2xhc3MsIERPTUFJTl9fU1VCRE9NQUlOKTsKLQotCQllbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVMRU1FTlQpOwotCi0JCWVzdGltYXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVTVElNQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlc3RpbWF0ZUVDbGFzcywgRVNUSU1BVEVfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXN0aW1hdGVFQ2xhc3MsIEVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXN0aW1hdGVFQ2xhc3MsIEVTVElNQVRFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQotCQllc3RpbWF0aW5nTWV0cmljRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVTVElNQVRJTkdfTUVUUklDKTsKLQotCQllc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0KLQkJZXhhbXBsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFWEFNUExFKTsKLQotCQlndWlkYW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHVUlEQU5DRSk7Ci0KLQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHVUlEQU5DRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcywgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQpOwotCi0JCWd1aWRlbGluZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHVUlERUxJTkUpOwotCi0JCWl0ZXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJVEVSQVRJT04pOwotCi0JCW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX0NPTkZJR1VSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsIE1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsIE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVyk7Ci0KLQkJbWV0aG9kRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX0dST1VQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQpOwotCi0JCW1ldGhvZExpYnJhcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX0xJQlJBUlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZExpYnJhcnlFQ2xhc3MsIE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RMaWJyYXJ5RUNsYXNzLCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX0NPTkZJR1VSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZExpYnJhcnlFQ2xhc3MsIE1FVEhPRF9MSUJSQVJZX19UT09MKTsKLQotCQltZXRob2RQYWNrYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9QQUNLQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQYWNrYWdlRUNsYXNzLCBNRVRIT0RfUEFDS0FHRV9fR1JPVVAxKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQYWNrYWdlRUNsYXNzLCBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCk7Ci0KLQkJbWV0aG9kUGx1Z2luRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9QTFVHSU4pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFBsdWdpbkVDbGFzcywgTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQbHVnaW5FQ2xhc3MsIE1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQbHVnaW5FQ2xhc3MsIE1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSk7Ci0KLQkJbWV0aG9kVW5pdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfVU5JVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX0NPUFlSSUdIVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX0FVVEhPUlMpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19DSEFOR0VfREFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX1ZFUlNJT04pOwotCi0JCW1pbGVzdG9uZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSUxFU1RPTkUpOwotCi0JCW5hbWVkRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOQU1FRF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShuYW1lZEVsZW1lbnRFQ2xhc3MsIE5BTUVEX0VMRU1FTlRfX05BTUUpOwotCi0JCW91dGNvbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1VUQ09NRSk7Ci0KLQkJcGFja2FnZWFibGVFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBQ0tBR0VBQkxFX0VMRU1FTlQpOwotCi0JCXBoYXNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBIQVNFKTsKLQotCQlwbGFubmluZ0RhdGFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUExBTk5JTkdfREFUQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGxhbm5pbmdEYXRhRUNsYXNzLCBQTEFOTklOR19EQVRBX19GSU5JU0hfREFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGxhbm5pbmdEYXRhRUNsYXNzLCBQTEFOTklOR19EQVRBX19SQU5LKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwbGFubmluZ0RhdGFFQ2xhc3MsIFBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUpOwotCi0JCXByYWN0aWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBSQUNUSUNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZUVDbGFzcywgUFJBQ1RJQ0VfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VFQ2xhc3MsIFBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRUNsYXNzLCBQUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByYWN0aWNlRUNsYXNzLCBQUkFDVElDRV9fU1VCX1BSQUNUSUNFKTsKLQotCQlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBSQUNUSUNFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNKTsKLQotCQlwcm9jZXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk4pOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0VDbGFzcywgUFJPQ0VTU19fVkFMSURfQ09OVEVYVCk7Ci0KLQkJcHJvY2Vzc0NvbXBvbmVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0NPTVBPTkVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OKTsKLQotCQlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HUk9VUDEpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPKTsKLQotCQlwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBQUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCk7Ci0KLQkJcHJvY2Vzc0VsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19FTEVNRU5UKTsKLQotCQlwcm9jZXNzUGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX1BBQ0tBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NQYWNrYWdlRUNsYXNzLCBQUk9DRVNTX1BBQ0tBR0VfX0dST1VQMik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc1BhY2thZ2VFQ2xhc3MsIFBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UKTsKLQotCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcywgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVAzKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcywgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTKTsKLQotCQlyZXBvcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVQT1JUKTsKLQotCQlyZXVzYWJsZUFzc2V0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFVVNBQkxFX0FTU0VUKTsKLQotCQlyb2FkbWFwRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPQURNQVApOwotCi0JCXJvbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZUVDbGFzcywgUk9MRV9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRUNsYXNzLCBST0xFX19SRVNQT05TSUJMRV9GT1IpOwotCi0JCXJvbGVEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRpb25FQ2xhc3MsIFJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZURlc2NyaXB0aW9uRUNsYXNzLCBST0xFX0RFU0NSSVBUSU9OX19TS0lMTFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEZXNjcmlwdGlvbkVDbGFzcywgUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVMpOwotCi0JCXJvbGVEZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZURlc2NyaXB0b3JFQ2xhc3MsIFJPTEVfREVTQ1JJUFRPUl9fUk9MRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZURlc2NyaXB0b3JFQ2xhc3MsIFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SKTsKLQotCQlyb2xlU2V0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfU0VUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlU2V0RUNsYXNzLCBST0xFX1NFVF9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlU2V0RUNsYXNzLCBST0xFX1NFVF9fUk9MRSk7Ci0KLQkJcm9sZVNldEdyb3VwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfU0VUX0dST1VQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlU2V0R3JvdXBpbmdFQ2xhc3MsIFJPTEVfU0VUX0dST1VQSU5HX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVTZXRHcm91cGluZ0VDbGFzcywgUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUKTsKLQotCQlzZWN0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFQ1RJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1NVQl9TRUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19QUkVERUNFU1NPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1NFQ1RJT05fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRSk7Ci0KLQkJc3VwcG9ydGluZ01hdGVyaWFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNVUFBPUlRJTkdfTUFURVJJQUwpOwotCi0JCXRhc2tFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFTSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fUFJFQ09ORElUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19QT1NUQ09ORElUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19QRVJGT1JNRURfQlkpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fTUFOREFUT1JZX0lOUFVUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19PVVRQVVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX09QVElPTkFMX0lOUFVUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19FU1RJTUFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fVE9PTF9NRU5UT1IpOwotCi0JCXRhc2tEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRpb25FQ2xhc3MsIFRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0aW9uRUNsYXNzLCBUQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFKTsKLQotCQl0YXNrRGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX1RBU0spOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlkpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlkpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19PVVRQVVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX1NURVApOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSk7Ci0KLQkJdGVhbVByb2ZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVBTV9QUk9GSUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19HUk9VUDEpOwotCQljcmVhdGVFQXR0cmlidXRlKHRlYW1Qcm9maWxlRUNsYXNzLCBURUFNX1BST0ZJTEVfX1JPTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHRlYW1Qcm9maWxlRUNsYXNzLCBURUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0pOwotCQljcmVhdGVFQXR0cmlidXRlKHRlYW1Qcm9maWxlRUNsYXNzLCBURUFNX1BST0ZJTEVfX1NVQl9URUFNKTsKLQotCQl0ZW1wbGF0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhURU1QTEFURSk7Ci0KLQkJdGVybURlZmluaXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVSTV9ERUZJTklUSU9OKTsKLQotCQl0b29sRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRPT0wpOwotCQljcmVhdGVFQXR0cmlidXRlKHRvb2xFQ2xhc3MsIFRPT0xfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodG9vbEVDbGFzcywgVE9PTF9fVE9PTF9NRU5UT1IpOwotCi0JCXRvb2xNZW50b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVE9PTF9NRU5UT1IpOwotCi0JCXdoaXRlcGFwZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0hJVEVQQVBFUik7Ci0KLQkJd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19CUkVBS0RPV05fRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUpOwotCi0JCXdvcmtEZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfREVGSU5JVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya0RlZmluaXRpb25FQ2xhc3MsIFdPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrRGVmaW5pdGlvbkVDbGFzcywgV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OKTsKLQotCQl3b3JrT3JkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19PUkRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya09yZGVyRUNsYXNzLCBXT1JLX09SREVSX19WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya09yZGVyRUNsYXNzLCBXT1JLX09SREVSX19MSU5LX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtPcmRlckVDbGFzcywgV09SS19PUkRFUl9fSUQpOwotCi0JCXdvcmtQcm9kdWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19FU1RJTUFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fUkVQT1JUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19URU1QTEFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1IpOwotCi0JCXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQpOwotCi0JCXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUDEpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUpOwotCi0JCXdvcmtQcm9kdWN0VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3RUeXBlRUNsYXNzLCBXT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdFR5cGVFQ2xhc3MsIFdPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1QpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQl2YXJpYWJpbGl0eVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFZBUklBQklMSVRZX1RZUEUpOwotCQl3b3JrT3JkZXJUeXBlRUVudW0gPSBjcmVhdGVFRW51bShXT1JLX09SREVSX1RZUEUpOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCXZhcmlhYmlsaXR5VHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShWQVJJQUJJTElUWV9UWVBFX09CSkVDVCk7Ci0JCXdvcmtPcmRlclR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoV09SS19PUkRFUl9UWVBFX09CSkVDVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJYWN0aXZpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpKTsKLQkJYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQkJYXJ0aWZhY3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQljYXBhYmlsaXR5UGF0dGVybkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCWNoZWNrbGlzdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQljb21wb3NpdGVSb2xlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Um9sZURlc2NyaXB0b3IoKSk7Ci0JCWNvbmNlcHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJY29uc3RyYWludEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCWNvbnRlbnRDYXRlZ29yeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQljb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmliYWJsZUVsZW1lbnQoKSk7Ci0JCWNvbnRlbnRQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWRlbGl2ZXJhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkpOwotCQlkZWxpdmVyeVByb2Nlc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzKCkpOwotCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJZGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQkJZGlzY2lwbGluZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlkb21haW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWVzdGltYXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWVzdGltYXRpbmdNZXRyaWNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWV4YW1wbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZ3VpZGFuY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJZ3VpZGVsaW5lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWl0ZXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFjdGl2aXR5KCkpOwotCQltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFVuaXQoKSk7Ci0JCW1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQltZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQltZXRob2RVbml0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbWlsZXN0b25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCW5hbWVkRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVsZW1lbnQoKSk7Ci0JCW91dGNvbWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJcGFja2FnZWFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TmFtZWRFbGVtZW50KCkpOwotCQlwaGFzZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFjdGl2aXR5KCkpOwotCQlwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJcHJhY3RpY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJcHJvY2Vzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFjdGl2aXR5KCkpOwotCQlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc1BhY2thZ2UoKSk7Ci0JCXByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkpOwotCQlwcm9jZXNzRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaWJhYmxlRWxlbWVudCgpKTsKLQkJcHJvY2Vzc1BhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RQYWNrYWdlKCkpOwotCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCXJlcG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlyZXVzYWJsZUFzc2V0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXJvYWRtYXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJcm9sZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQlyb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCXJvbGVEZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpcHRvcigpKTsKLQkJcm9sZVNldEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJcm9sZVNldEdyb3VwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlzZWN0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJc3VwcG9ydGluZ01hdGVyaWFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRhc2tFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJdGFza0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQl0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCXRlbXBsYXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRlcm1EZWZpbml0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRvb2xFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCXRvb2xNZW50b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJd2hpdGVwYXBlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbmNlcHQoKSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJd29ya0RlZmluaXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQl3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmlwdG9yKCkpOwotCQl3b3JrUHJvZHVjdFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhhY3Rpdml0eUVDbGFzcywgQWN0aXZpdHkuY2xhc3MsICJBY3Rpdml0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfUHJlY29uZGl0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlY29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9Qb3N0Y29uZGl0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicG9zdGNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCksIHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpLCBudWxsLCAiYnJlYWtkb3duRWxlbWVudCIsIG51bGwsIDAsIC0xLCBBY3Rpdml0eS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfQ2hlY2tsaXN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2hlY2tsaXN0IiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfQ29uY2VwdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNvbmNlcHQiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9FeGFtcGxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXhhbXBsZSIsIG51bGwsIDAsIC0xLCBBY3Rpdml0eS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X0d1aWRlbGluZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImd1aWRlbGluZSIsIG51bGwsIDAsIC0xLCBBY3Rpdml0eS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X1JvYWRtYXAoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyb2FkbWFwIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfUmV1c2FibGVBc3NldCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJldXNhYmxlQXNzZXQiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9TdXBwb3J0aW5nTWF0ZXJpYWwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzdXBwb3J0aW5nTWF0ZXJpYWwiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9XaGl0ZXBhcGVyKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAid2hpdGVwYXBlciIsIG51bGwsIDAsIC0xLCBBY3Rpdml0eS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X0lzRW5hY3RhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzRW5hY3RhYmxlIiwgbnVsbCwgMCwgMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiwgbnVsbCwgMCwgMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9WYXJpYWJpbGl0eVR5cGUoKSwgdGhpcy5nZXRWYXJpYWJpbGl0eVR5cGUoKSwgInZhcmlhYmlsaXR5VHlwZSIsICJuYSIsIDAsIDEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywgQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcywgIkFjdGl2aXR5RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWx0ZXJuYXRpdmVzIiwgbnVsbCwgMCwgMSwgQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93VG9TdGFmZigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImhvd1RvU3RhZmYiLCBudWxsLCAwLCAxLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHVycG9zZSIsIG51bGwsIDAsIDEsIEFjdGl2aXR5RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXJ0aWZhY3RFQ2xhc3MsIEFydGlmYWN0LmNsYXNzLCAiQXJ0aWZhY3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFydGlmYWN0X0dyb3VwMygpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAzIiwgbnVsbCwgMCwgLTEsIEFydGlmYWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKSwgdGhpcy5nZXRBcnRpZmFjdCgpLCBudWxsLCAiY29udGFpbmVkQXJ0aWZhY3QiLCBudWxsLCAwLCAtMSwgQXJ0aWZhY3QuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLCBBcnRpZmFjdERlc2NyaXB0aW9uLmNsYXNzLCAiQXJ0aWZhY3REZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJicmllZk91dGxpbmUiLCBudWxsLCAwLCAxLCBBcnRpZmFjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXByZXNlbnRhdGlvbk9wdGlvbnMiLCBudWxsLCAwLCAxLCBBcnRpZmFjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICJCcmVha2Rvd25FbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlc2VudGVkQWZ0ZXIiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcmVzZW50ZWRCZWZvcmUiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwbGFubmluZ0RhdGEiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXR5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3VwZXJBY3Rpdml0eSIsIG51bGwsIDEsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJpc09wdGlvbmFsIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNQbGFubmVkIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcmVmaXgiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcywgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmNsYXNzLCAiQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInVzYWdlR3VpZGFuY2UiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MsIENhcGFiaWxpdHlQYXR0ZXJuLmNsYXNzLCAiQ2FwYWJpbGl0eVBhdHRlcm4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhjaGVja2xpc3RFQ2xhc3MsIENoZWNrbGlzdC5jbGFzcywgIkNoZWNrbGlzdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNvbXBvc2l0ZVJvbGVFQ2xhc3MsIENvbXBvc2l0ZVJvbGUuY2xhc3MsICJDb21wb3NpdGVSb2xlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wb3NpdGVSb2xlX0dyb3VwMSgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAxIiwgbnVsbCwgMCwgLTEsIENvbXBvc2l0ZVJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlKCksIHRoaXMuZ2V0Um9sZSgpLCBudWxsLCAiYWdncmVnYXRlZFJvbGUiLCBudWxsLCAwLCAtMSwgQ29tcG9zaXRlUm9sZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbmNlcHRFQ2xhc3MsIENvbmNlcHQuY2xhc3MsICJDb25jZXB0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY29uc3RyYWludEVDbGFzcywgQ29uc3RyYWludC5jbGFzcywgIkNvbnN0cmFpbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnN0cmFpbnRfTWFpbkRlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFpbkRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb250ZW50Q2F0ZWdvcnlFQ2xhc3MsIENvbnRlbnRDYXRlZ29yeS5jbGFzcywgIkNvbnRlbnRDYXRlZ29yeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MsIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UuY2xhc3MsICJDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpLCB0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLCBudWxsLCAiY29udGVudENhdGVnb3J5IiwgbnVsbCwgMCwgLTEsIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIkNvbnRlbnREZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1haW5EZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImtleUNvbnNpZGVyYXRpb25zIiwgbnVsbCwgMCwgMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb24oKSwgdGhpcy5nZXRTZWN0aW9uKCksIG51bGwsICJzZWN0aW9uIiwgbnVsbCwgMCwgLTEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDb250ZW50RWxlbWVudC5jbGFzcywgIkNvbnRlbnRFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9Hcm91cDEoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMSIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNoZWNrbGlzdCIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X0NvbmNlcHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb25jZXB0IiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImV4YW1wbGUiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJndWlkZWxpbmUiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9SZXVzYWJsZUFzc2V0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmV1c2FibGVBc3NldCIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInN1cHBvcnRpbmdNYXRlcmlhbCIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X1doaXRlcGFwZXIoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3aGl0ZXBhcGVyIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLCBudWxsLCAwLCAxLCBDb250ZW50RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpLCB0aGlzLmdldFZhcmlhYmlsaXR5VHlwZSgpLCAidmFyaWFiaWxpdHlUeXBlIiwgIm5hIiwgMCwgMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb250ZW50UGFja2FnZUVDbGFzcywgQ29udGVudFBhY2thZ2UuY2xhc3MsICJDb250ZW50UGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudFBhY2thZ2VfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgQ29udGVudFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudCgpLCB0aGlzLmdldENvbnRlbnRFbGVtZW50KCksIG51bGwsICJjb250ZW50RWxlbWVudCIsIG51bGwsIDAsIC0xLCBDb250ZW50UGFja2FnZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGN1c3RvbUNhdGVnb3J5RUNsYXNzLCBDdXN0b21DYXRlZ29yeS5jbGFzcywgIkN1c3RvbUNhdGVnb3J5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDdXN0b21DYXRlZ29yeV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBDdXN0b21DYXRlZ29yeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNhdGVnb3JpemVkRWxlbWVudCIsIG51bGwsIDAsIC0xLCBDdXN0b21DYXRlZ29yeS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3J5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3ViQ2F0ZWdvcnkiLCBudWxsLCAwLCAtMSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGVsaXZlcmFibGVFQ2xhc3MsIERlbGl2ZXJhYmxlLmNsYXNzLCAiRGVsaXZlcmFibGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJhYmxlX0dyb3VwMygpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAzIiwgbnVsbCwgMCwgLTEsIERlbGl2ZXJhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZWxpdmVyZWRXb3JrUHJvZHVjdCIsIG51bGwsIDAsIC0xLCBEZWxpdmVyYWJsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmNsYXNzLCAiRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXh0ZXJuYWxEZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicGFja2FnaW5nR3VpZGFuY2UiLCBudWxsLCAwLCAxLCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywgRGVsaXZlcnlQcm9jZXNzLmNsYXNzLCAiRGVsaXZlcnlQcm9jZXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NfR3JvdXAzKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDMiLCBudWxsLCAwLCAtMSwgRGVsaXZlcnlQcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb21tdW5pY2F0aW9uc01hdGVyaWFsIiwgbnVsbCwgMCwgLTEsIERlbGl2ZXJ5UHJvY2Vzcy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVkdWNhdGlvbk1hdGVyaWFsIiwgbnVsbCwgMCwgLTEsIERlbGl2ZXJ5UHJvY2Vzcy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzY2FsZSIsIG51bGwsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByb2plY3RDaGFyYWN0ZXJpc3RpY3MiLCBudWxsLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJpc2tMZXZlbCIsIG51bGwsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVzdGltYXRpbmdUZWNobmlxdWUiLCBudWxsLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiwgbnVsbCwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInR5cGVPZkNvbnRyYWN0IiwgbnVsbCwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICJEZXNjcmliYWJsZUVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKSwgdGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSwgbnVsbCwgInByZXNlbnRhdGlvbiIsIG51bGwsIDAsIDEsIERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibm9kZWljb24iLCBudWxsLCAwLCAxLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZXNlbnRhdGlvbk5hbWUiLCBudWxsLCAwLCAxLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2hhcGVpY29uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlc2NyaXB0b3JFQ2xhc3MsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IuY2xhc3MsICJEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLCBudWxsLCAwLCAxLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLCBEZXNjcmlwdG9yRGVzY3JpcHRpb24uY2xhc3MsICJEZXNjcmlwdG9yRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZWZpbmVkRGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBEZXNjcmlwdG9yRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGlzY2lwbGluZUVDbGFzcywgRGlzY2lwbGluZS5jbGFzcywgIkRpc2NpcGxpbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERpc2NpcGxpbmVfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERpc2NpcGxpbmVfVGFzaygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRhc2siLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERpc2NpcGxpbmVfU3ViRGlzY2lwbGluZSgpLCB0aGlzLmdldERpc2NpcGxpbmUoKSwgbnVsbCwgInN1YkRpc2NpcGxpbmUiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvdygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlZmVyZW5jZVdvcmtmbG93IiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLCBEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MsICJEaXNjaXBsaW5lR3JvdXBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRpc2NpcGxpbmUiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRvY3VtZW50Um9vdEVDbGFzcywgRG9jdW1lbnRSb290LmNsYXNzLCAiRG9jdW1lbnRSb290IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREb2N1bWVudFJvb3RfTWl4ZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgIm1peGVkIiwgbnVsbCwgMCwgLTEsIG51bGwsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIG51bGwsICJ4TUxOU1ByZWZpeE1hcCIsIG51bGwsIDAsIC0xLCBudWxsLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhTSVNjaGVtYUxvY2F0aW9uIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X01ldGhvZENvbmZpZ3VyYXRpb24oKSwgdGhpcy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCksIG51bGwsICJtZXRob2RDb25maWd1cmF0aW9uIiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvY3VtZW50Um9vdF9NZXRob2RMaWJyYXJ5KCksIHRoaXMuZ2V0TWV0aG9kTGlicmFyeSgpLCBudWxsLCAibWV0aG9kTGlicmFyeSIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb2N1bWVudFJvb3RfTWV0aG9kUGx1Z2luKCksIHRoaXMuZ2V0TWV0aG9kUGx1Z2luKCksIG51bGwsICJtZXRob2RQbHVnaW4iLCBudWxsLCAwLCAtMiwgbnVsbCwgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRvbWFpbkVDbGFzcywgRG9tYWluLmNsYXNzLCAiRG9tYWluIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREb21haW5fR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgRG9tYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAid29ya1Byb2R1Y3QiLCBudWxsLCAwLCAtMSwgRG9tYWluLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9tYWluX1N1YmRvbWFpbigpLCB0aGlzLmdldERvbWFpbigpLCBudWxsLCAic3ViZG9tYWluIiwgbnVsbCwgMCwgLTEsIERvbWFpbi5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVsZW1lbnRFQ2xhc3MsIEVsZW1lbnQuY2xhc3MsICJFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoZXN0aW1hdGVFQ2xhc3MsIEVzdGltYXRlLmNsYXNzLCAiRXN0aW1hdGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVzdGltYXRlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIEVzdGltYXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbk1ldHJpYygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVzdGltYXRpb25NZXRyaWMiLCBudWxsLCAwLCAtMSwgRXN0aW1hdGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgRXN0aW1hdGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXN0aW1hdGluZ01ldHJpY0VDbGFzcywgRXN0aW1hdGluZ01ldHJpYy5jbGFzcywgIkVzdGltYXRpbmdNZXRyaWMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3MsIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5jbGFzcywgIkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGV4YW1wbGVFQ2xhc3MsIEV4YW1wbGUuY2xhc3MsICJFeGFtcGxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoZ3VpZGFuY2VFQ2xhc3MsIEd1aWRhbmNlLmNsYXNzLCAiR3VpZGFuY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLCBHdWlkYW5jZURlc2NyaXB0aW9uLmNsYXNzLCAiR3VpZGFuY2VEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXR0YWNobWVudCIsIG51bGwsIDAsIDEsIEd1aWRhbmNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZ3VpZGVsaW5lRUNsYXNzLCBHdWlkZWxpbmUuY2xhc3MsICJHdWlkZWxpbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhpdGVyYXRpb25FQ2xhc3MsIEl0ZXJhdGlvbi5jbGFzcywgIkl0ZXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICJNZXRob2RDb25maWd1cmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYmFzZUNvbmZpZ3VyYXRpb24iLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWV0aG9kUGx1Z2luU2VsZWN0aW9uIiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVmYXVsdFZpZXciLCBudWxsLCAwLCAxLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlldygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByb2Nlc3NWaWV3IiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kRWxlbWVudEVDbGFzcywgTWV0aG9kRWxlbWVudC5jbGFzcywgIk1ldGhvZEVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZSgpLCB0aGlzLmdldENvbnN0cmFpbnQoKSwgbnVsbCwgIm93bmVkUnVsZSIsIG51bGwsIDAsIC0xLCBNZXRob2RFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJicmllZkRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJvcmRlcmluZ0d1aWRlIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJzdXBwcmVzc2VkIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZExpYnJhcnlFQ2xhc3MsIE1ldGhvZExpYnJhcnkuY2xhc3MsICJNZXRob2RMaWJyYXJ5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbigpLCB0aGlzLmdldE1ldGhvZFBsdWdpbigpLCBudWxsLCAibWV0aG9kUGx1Z2luIiwgbnVsbCwgMCwgLTEsIE1ldGhvZExpYnJhcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZExpYnJhcnlfTWV0aG9kQ29uZmlndXJhdGlvbigpLCB0aGlzLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgIm1ldGhvZENvbmZpZ3VyYXRpb24iLCBudWxsLCAwLCAtMSwgTWV0aG9kTGlicmFyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kTGlicmFyeV9Ub29sKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidG9vbCIsIG51bGwsIDAsIDEsIE1ldGhvZExpYnJhcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RQYWNrYWdlRUNsYXNzLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAiTWV0aG9kUGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGFja2FnZV9Hcm91cDEoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMSIsIG51bGwsIDAsIC0xLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmV1c2VkUGFja2FnZSIsIG51bGwsIDAsIC0xLCBNZXRob2RQYWNrYWdlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUGFja2FnZV9NZXRob2RQYWNrYWdlKCksIHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpLCBudWxsLCAibWV0aG9kUGFja2FnZSIsIG51bGwsIDAsIC0xLCBNZXRob2RQYWNrYWdlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJnbG9iYWwiLCBudWxsLCAwLCAxLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kUGx1Z2luRUNsYXNzLCBNZXRob2RQbHVnaW4uY2xhc3MsICJNZXRob2RQbHVnaW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBsdWdpbl9SZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIsIG51bGwsIDAsIC0xLCBNZXRob2RQbHVnaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZSgpLCB0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSwgbnVsbCwgIm1ldGhvZFBhY2thZ2UiLCBudWxsLCAwLCAtMSwgTWV0aG9kUGx1Z2luLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAidXNlckNoYW5nZWFibGUiLCBudWxsLCAwLCAxLCBNZXRob2RQbHVnaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RVbml0RUNsYXNzLCBNZXRob2RVbml0LmNsYXNzLCAiTWV0aG9kVW5pdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb3B5cmlnaHQiLCBudWxsLCAwLCAxLCBNZXRob2RVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXV0aG9ycyIsIG51bGwsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0RGF0ZVRpbWUoKSwgImNoYW5nZURhdGUiLCBudWxsLCAwLCAxLCBNZXRob2RVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNoYW5nZURlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFVuaXRfVmVyc2lvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBNZXRob2RVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1pbGVzdG9uZUVDbGFzcywgTWlsZXN0b25lLmNsYXNzLCAiTWlsZXN0b25lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MobmFtZWRFbGVtZW50RUNsYXNzLCBOYW1lZEVsZW1lbnQuY2xhc3MsICJOYW1lZEVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE5hbWVkRWxlbWVudF9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIE5hbWVkRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhvdXRjb21lRUNsYXNzLCBPdXRjb21lLmNsYXNzLCAiT3V0Y29tZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcywgUGFja2FnZWFibGVFbGVtZW50LmNsYXNzLCAiUGFja2FnZWFibGVFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocGhhc2VFQ2xhc3MsIFBoYXNlLmNsYXNzLCAiUGhhc2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhwbGFubmluZ0RhdGFFQ2xhc3MsIFBsYW5uaW5nRGF0YS5jbGFzcywgIlBsYW5uaW5nRGF0YSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0RGF0ZVRpbWUoKSwgImZpbmlzaERhdGUiLCBudWxsLCAwLCAxLCBQbGFubmluZ0RhdGEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQbGFubmluZ0RhdGFfUmFuaygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJhbmsiLCBudWxsLCAwLCAxLCBQbGFubmluZ0RhdGEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldERhdGVUaW1lKCksICJzdGFydERhdGUiLCBudWxsLCAwLCAxLCBQbGFubmluZ0RhdGEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJhY3RpY2VFQ2xhc3MsIFByYWN0aWNlLmNsYXNzLCAiUHJhY3RpY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFByYWN0aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhY3Rpdml0eVJlZmVyZW5jZSIsIG51bGwsIDAsIC0xLCBQcmFjdGljZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb250ZW50UmVmZXJlbmNlIiwgbnVsbCwgMCwgLTEsIFByYWN0aWNlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2UoKSwgdGhpcy5nZXRQcmFjdGljZSgpLCBudWxsLCAic3ViUHJhY3RpY2UiLCBudWxsLCAwLCAtMSwgUHJhY3RpY2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAiUHJhY3RpY2VEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFkZGl0aW9uYWxJbmZvIiwgbnVsbCwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhcHBsaWNhdGlvbiIsIG51bGwsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJiYWNrZ3JvdW5kIiwgbnVsbCwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJnb2FscyIsIG51bGwsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJsZXZlbHNPZkFkb3B0aW9uIiwgbnVsbCwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByb2JsZW0iLCBudWxsLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb2Nlc3NFQ2xhc3MsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MuY2xhc3MsICJQcm9jZXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImluY2x1ZGVzUGF0dGVybiIsIG51bGwsIDAsIC0xLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlZmF1bHRDb250ZXh0IiwgbnVsbCwgMCwgMSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsaWRDb250ZXh0IiwgbnVsbCwgMCwgLTEsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIlByb2Nlc3NDb21wb25lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NDb21wb25lbnRfQ29weXJpZ2h0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29weXJpZ2h0IiwgbnVsbCwgMCwgMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlKCksIHRoaXMuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpLCBudWxsLCAiaW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCksIHRoaXMuZ2V0UHJvY2VzcygpLCBudWxsLCAicHJvY2VzcyIsIG51bGwsIDEsIDEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NDb21wb25lbnRfQXV0aG9ycygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImF1dGhvcnMiLCBudWxsLCAwLCAxLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEYXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldERhdGVUaW1lKCksICJjaGFuZ2VEYXRlIiwgbnVsbCwgMCwgMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjaGFuZ2VEZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzQ29tcG9uZW50X1ZlcnNpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2ZXJzaW9uIiwgbnVsbCwgMCwgMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLCAiUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9Hcm91cDEoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMSIsIG51bGwsIDAsIC0xLCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCksIHRoaXMuZ2V0VGFza0Rlc2NyaXB0b3IoKSwgbnVsbCwgImludGVyZmFjZVNwZWNpZmljYXRpb24iLCBudWxsLCAwLCAtMSwgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VJTygpLCB0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLCBudWxsLCAiaW50ZXJmYWNlSU8iLCBudWxsLCAwLCAtMSwgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgUHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAiUHJvY2Vzc0Rlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzY29wZSIsIG51bGwsIDAsIDEsIFByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidXNhZ2VOb3RlcyIsIG51bGwsIDAsIDEsIFByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NEZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXh0ZXJuYWxJZCIsIG51bGwsIDAsIDEsIFByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcm9jZXNzRWxlbWVudEVDbGFzcywgUHJvY2Vzc0VsZW1lbnQuY2xhc3MsICJQcm9jZXNzRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHByb2Nlc3NQYWNrYWdlRUNsYXNzLCBQcm9jZXNzUGFja2FnZS5jbGFzcywgIlByb2Nlc3NQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzUGFja2FnZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBQcm9jZXNzUGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50KCksIHRoaXMuZ2V0UHJvY2Vzc0VsZW1lbnQoKSwgbnVsbCwgInByb2Nlc3NFbGVtZW50IiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQYWNrYWdlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MsIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmNsYXNzLCAiUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0dyb3VwMygpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAzIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZVByb2Nlc3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJiYXNlUHJvY2VzcyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyZXBvcnRFQ2xhc3MsIFJlcG9ydC5jbGFzcywgIlJlcG9ydCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHJldXNhYmxlQXNzZXRFQ2xhc3MsIFJldXNhYmxlQXNzZXQuY2xhc3MsICJSZXVzYWJsZUFzc2V0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Mocm9hZG1hcEVDbGFzcywgUm9hZG1hcC5jbGFzcywgIlJvYWRtYXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhyb2xlRUNsYXNzLCBSb2xlLmNsYXNzLCAiUm9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlc3BvbnNpYmxlRm9yIiwgbnVsbCwgMCwgLTEsIFJvbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mocm9sZURlc2NyaXB0aW9uRUNsYXNzLCBSb2xlRGVzY3JpcHRpb24uY2xhc3MsICJSb2xlRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFzc2lnbm1lbnRBcHByb2FjaGVzIiwgbnVsbCwgMCwgMSwgUm9sZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNraWxscyIsIG51bGwsIDAsIDEsIFJvbGVEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInN5bm9ueW1zIiwgbnVsbCwgMCwgMSwgUm9sZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJvbGVEZXNjcmlwdG9yRUNsYXNzLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgIlJvbGVEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicm9sZSIsIG51bGwsIDAsIDEsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXNwb25zaWJsZUZvciIsIG51bGwsIDAsIC0xLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyb2xlU2V0RUNsYXNzLCBSb2xlU2V0LmNsYXNzLCAiUm9sZVNldCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZVNldF9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBSb2xlU2V0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZVNldF9Sb2xlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicm9sZSIsIG51bGwsIDAsIC0xLCBSb2xlU2V0LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJvbGVTZXRHcm91cGluZ0VDbGFzcywgUm9sZVNldEdyb3VwaW5nLmNsYXNzLCAiUm9sZVNldEdyb3VwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlU2V0R3JvdXBpbmdfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgUm9sZVNldEdyb3VwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyb2xlU2V0IiwgbnVsbCwgMCwgLTEsIFJvbGVTZXRHcm91cGluZy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZWN0aW9uRUNsYXNzLCBTZWN0aW9uLmNsYXNzLCAiU2VjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdGlvbl9TdWJTZWN0aW9uKCksIHRoaXMuZ2V0U2VjdGlvbigpLCBudWxsLCAic3ViU2VjdGlvbiIsIG51bGwsIDAsIDEsIFNlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcmVkZWNlc3NvciIsIG51bGwsIDAsIDEsIFNlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN0aW9uX0Rlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNlY3Rpb25OYW1lIiwgbnVsbCwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3Rpb25fVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLCBudWxsLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eVR5cGUoKSwgdGhpcy5nZXRWYXJpYWJpbGl0eVR5cGUoKSwgInZhcmlhYmlsaXR5VHlwZSIsICJuYSIsIDAsIDEsIFNlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MsIFN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywgIlN1cHBvcnRpbmdNYXRlcmlhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHRhc2tFQ2xhc3MsIFRhc2suY2xhc3MsICJUYXNrIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX1ByZWNvbmRpdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZWNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX1Bvc3Rjb25kaXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwb3N0Y29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfUGVyZm9ybWVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwZXJmb3JtZWRCeSIsIG51bGwsIDAsIDEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX01hbmRhdG9yeUlucHV0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFuZGF0b3J5SW5wdXQiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfT3V0cHV0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib3V0cHV0IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm9wdGlvbmFsSW5wdXQiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfRXN0aW1hdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlc3RpbWF0ZSIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfVG9vbE1lbnRvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRvb2xNZW50b3IiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0YXNrRGVzY3JpcHRpb25FQ2xhc3MsIFRhc2tEZXNjcmlwdGlvbi5jbGFzcywgIlRhc2tEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFsdGVybmF0aXZlcyIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHVycG9zZSIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0YXNrRGVzY3JpcHRvckVDbGFzcywgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICJUYXNrRGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRhc2siLCBudWxsLCAwLCAxLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicGVyZm9ybWVkUHJpbWFyaWx5QnkiLCBudWxsLCAwLCAxLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhc3Npc3RlZEJ5IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImV4dGVybmFsSW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hbmRhdG9yeUlucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm9wdGlvbmFsSW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJvdXRwdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRUYXNrRGVzY3JpcHRvcl9TdGVwKCksIHRoaXMuZ2V0U2VjdGlvbigpLCBudWxsLCAic3RlcCIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3ModGVhbVByb2ZpbGVFQ2xhc3MsIFRlYW1Qcm9maWxlLmNsYXNzLCAiVGVhbVByb2ZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRlYW1Qcm9maWxlX0dyb3VwMSgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAxIiwgbnVsbCwgMCwgLTEsIFRlYW1Qcm9maWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGVhbVByb2ZpbGVfUm9sZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJvbGUiLCBudWxsLCAwLCAtMSwgVGVhbVByb2ZpbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzdXBlclRlYW0iLCBudWxsLCAwLCAtMSwgVGVhbVByb2ZpbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3ViVGVhbSIsIG51bGwsIDAsIC0xLCBUZWFtUHJvZmlsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0ZW1wbGF0ZUVDbGFzcywgVGVtcGxhdGUuY2xhc3MsICJUZW1wbGF0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHRlcm1EZWZpbml0aW9uRUNsYXNzLCBUZXJtRGVmaW5pdGlvbi5jbGFzcywgIlRlcm1EZWZpbml0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3ModG9vbEVDbGFzcywgVG9vbC5jbGFzcywgIlRvb2wiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRvb2xfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgVG9vbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRvb2xfVG9vbE1lbnRvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRvb2xNZW50b3IiLCBudWxsLCAwLCAtMSwgVG9vbC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0b29sTWVudG9yRUNsYXNzLCBUb29sTWVudG9yLmNsYXNzLCAiVG9vbE1lbnRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHdoaXRlcGFwZXJFQ2xhc3MsIFdoaXRlcGFwZXIuY2xhc3MsICJXaGl0ZXBhcGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Mod29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAiV29ya0JyZWFrZG93bkVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMSgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAxIiwgbnVsbCwgMCwgLTEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3IoKSwgdGhpcy5nZXRXb3JrT3JkZXIoKSwgbnVsbCwgInByZWRlY2Vzc29yIiwgbnVsbCwgMCwgLTEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzRXZlbnREcml2ZW4iLCBudWxsLCAwLCAxLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzT25nb2luZyIsIG51bGwsIDAsIDEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNSZXBlYXRhYmxlIiwgbnVsbCwgMCwgMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrRGVmaW5pdGlvbkVDbGFzcywgV29ya0RlZmluaXRpb24uY2xhc3MsICJXb3JrRGVmaW5pdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlY29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgV29ya0RlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicG9zdGNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIFdvcmtEZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdvcmtPcmRlckVDbGFzcywgV29ya09yZGVyLmNsYXNzLCAiV29ya09yZGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrT3JkZXJfVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIFdvcmtPcmRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpLCB0aGlzLmdldFdvcmtPcmRlclR5cGUoKSwgImxpbmtUeXBlIiwgImZpbmlzaFRvU3RhcnQiLCAwLCAxLCBXb3JrT3JkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtPcmRlcl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgV29ya09yZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod29ya1Byb2R1Y3RFQ2xhc3MsIFdvcmtQcm9kdWN0LmNsYXNzLCAiV29ya1Byb2R1Y3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0X0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlc3RpbWF0ZSIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0X1JlcG9ydCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlcG9ydCIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0X1RlbXBsYXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidGVtcGxhdGUiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3QuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9yKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidG9vbE1lbnRvciIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzLCAiV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImltcGFjdE9mTm90SGF2aW5nIiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInB1cnBvc2UiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlYXNvbnNGb3JOb3ROZWVkaW5nIiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImV4dGVybmFsSWQiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAiV29ya1Byb2R1Y3REZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3b3JrUHJvZHVjdCIsIG51bGwsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Hcm91cDEoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMSIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImltcGFjdGVkQnkiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpbXBhY3RzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVsaXZlcmFibGVQYXJ0cyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWN0aXZpdHlFbnRyeVN0YXRlIiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWN0aXZpdHlFeGl0U3RhdGUiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod29ya1Byb2R1Y3RUeXBlRUNsYXNzLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MsICJXb3JrUHJvZHVjdFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0VHlwZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3b3JrUHJvZHVjdCIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bSh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLmNsYXNzLCAiVmFyaWFiaWxpdHlUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlRfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5jbGFzcywgIldvcmtPcmRlclR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh3b3JrT3JkZXJUeXBlRUVudW0sIFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5TVEFSVF9UT19GSU5JU0hfTElURVJBTCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUodmFyaWFiaWxpdHlUeXBlT2JqZWN0RURhdGFUeXBlLCBWYXJpYWJpbGl0eVR5cGUuY2xhc3MsICJWYXJpYWJpbGl0eVR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFRGF0YVR5cGUod29ya09yZGVyVHlwZU9iamVjdEVEYXRhVHlwZSwgV29ya09yZGVyVHlwZS5jbGFzcywgIldvcmtPcmRlclR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSBhbm5vdGF0aW9ucwotCQkvLyBodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEKLQkJY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGE8L2I+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpIHsKLQkJU3RyaW5nIHNvdXJjZSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFjdGl2aXR5RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJBY3Rpdml0eSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlfUHJlY29uZGl0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByZWNvbmRpdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9Qb3N0Y29uZGl0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlBvc3Rjb25kaXRpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkJyZWFrZG93bkVsZW1lbnQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjYiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlfQ2hlY2tsaXN0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNoZWNrbGlzdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9Db25jZXB0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvbmNlcHQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjYiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlfRXhhbXBsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFeGFtcGxlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI2IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X0d1aWRlbGluZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJHdWlkZWxpbmUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjYiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlfUm9hZG1hcCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSb2FkbWFwIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI2IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X1JldXNhYmxlQXNzZXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmV1c2FibGVBc3NldCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9TdXBwb3J0aW5nTWF0ZXJpYWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3VwcG9ydGluZ01hdGVyaWFsIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI2IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X1doaXRlcGFwZXIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiV2hpdGVwYXBlciIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9Jc0VuYWN0YWJsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgIklzRW5hY3RhYmxlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5VHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZhcmlhYmlsaXR5VHlwZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQWN0aXZpdHlEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFsdGVybmF0aXZlcyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3dUb1N0YWZmKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkhvd1RvU3RhZmYiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQdXJwb3NlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhcnRpZmFjdEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQXJ0aWZhY3QiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFydGlmYWN0X0dyb3VwMygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29udGFpbmVkQXJ0aWZhY3QiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjciCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkFydGlmYWN0RGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJCcmllZk91dGxpbmUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJlcHJlc2VudGF0aW9uT3B0aW9ucyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQnJlYWtkb3duRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcmVzZW50ZWRBZnRlciIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcmVzZW50ZWRCZWZvcmUiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUGxhbm5pbmdEYXRhIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0eSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdXBlckFjdGl2aXR5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpc09wdGlvbmFsIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzUGxhbm5lZCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJwcmVmaXgiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ1c2FnZUd1aWRhbmNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjYXBhYmlsaXR5UGF0dGVybkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ2FwYWJpbGl0eVBhdHRlcm4iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjaGVja2xpc3RFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNoZWNrbGlzdCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbXBvc2l0ZVJvbGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNvbXBvc2l0ZVJvbGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbXBvc2l0ZVJvbGVfR3JvdXAxKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyMiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFnZ3JlZ2F0ZWRSb2xlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIyIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjb25jZXB0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDb25jZXB0IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY29uc3RyYWludEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29uc3RyYWludCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnN0cmFpbnRfTWFpbkRlc2NyaXB0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibWFpbkRlc2NyaXB0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjb250ZW50Q2F0ZWdvcnlFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNvbnRlbnRDYXRlZ29yeSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDb250ZW50Q2F0ZWdvcnkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTEiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29udGVudERlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNYWluRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJLZXlDb25zaWRlcmF0aW9ucyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTZWN0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjb250ZW50RWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29udGVudEVsZW1lbnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MTEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNoZWNrbGlzdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9Db25jZXB0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvbmNlcHQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFeGFtcGxlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjExIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJHdWlkZWxpbmUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfUmV1c2FibGVBc3NldCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXVzYWJsZUFzc2V0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjExIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdXBwb3J0aW5nTWF0ZXJpYWwiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfV2hpdGVwYXBlcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJXaGl0ZXBhcGVyIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjExIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZhcmlhYmlsaXR5VHlwZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY29udGVudFBhY2thZ2VFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNvbnRlbnRQYWNrYWdlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50UGFja2FnZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjExIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvbnRlbnRFbGVtZW50IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjExIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjdXN0b21DYXRlZ29yeUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ3VzdG9tQ2F0ZWdvcnkiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEN1c3RvbUNhdGVnb3J5X0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNhdGVnb3JpemVkRWxlbWVudCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdWJDYXRlZ29yeSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGVsaXZlcmFibGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRlbGl2ZXJhYmxlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyYWJsZV9Hcm91cDMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkRlbGl2ZXJlZFdvcmtQcm9kdWN0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI3IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkV4dGVybmFsRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUGFja2FnaW5nR3VpZGFuY2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVsaXZlcnlQcm9jZXNzIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NfR3JvdXAzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDo0MiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDb21tdW5pY2F0aW9uc01hdGVyaWFsIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjQyIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFZHVjYXRpb25NYXRlcmlhbCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDo0MiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU2NhbGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJvamVjdENoYXJhY3RlcmlzdGljcyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJpc2tMZXZlbCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFc3RpbWF0aW5nVGVjaG5pcXVlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByb2plY3RNZW1iZXJFeHBlcnRpc2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlR5cGVPZkNvbnRyYWN0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRlc2NyaWJhYmxlRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcmVzZW50YXRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgIm5vZGVpY29uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInByZXNlbnRhdGlvbk5hbWUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJzaGFwZWljb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlc2NyaXB0b3JFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRlc2NyaXB0b3IiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRlc2NyaXB0b3JEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVmaW5lZERlc2NyaXB0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkaXNjaXBsaW5lRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEaXNjaXBsaW5lIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREaXNjaXBsaW5lX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGlzY2lwbGluZV9UYXNrKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlRhc2siLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGlzY2lwbGluZV9TdWJEaXNjaXBsaW5lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1YkRpc2NpcGxpbmUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvdygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZWZlcmVuY2VXb3JrZmxvdyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEaXNjaXBsaW5lR3JvdXBpbmciLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjIxIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkRpc2NpcGxpbmUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZG9jdW1lbnRSb290RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICIiLAotCQkJICJraW5kIiwgIm1peGVkIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9NaXhlZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50V2lsZGNhcmQiLAotCQkJICJuYW1lIiwgIjptaXhlZCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ4bWxuczpwcmVmaXgiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAieHNpOnNjaGVtYUxvY2F0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfTWV0aG9kQ29uZmlndXJhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RDb25maWd1cmF0aW9uIiwKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfTWV0aG9kTGlicmFyeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RMaWJyYXJ5IiwKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfTWV0aG9kUGx1Z2luKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZFBsdWdpbiIsCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZG9tYWluRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEb21haW4iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvbWFpbl9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjIxIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvbWFpbl9Xb3JrUHJvZHVjdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJXb3JrUHJvZHVjdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb21haW5fU3ViZG9tYWluKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1YmRvbWFpbiIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZW1wdHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVzdGltYXRlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJFc3RpbWF0ZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RXN0aW1hdGVfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uTWV0cmljKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkVzdGltYXRpb25NZXRyaWMiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXN0aW1hdGluZ01ldHJpY0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRXN0aW1hdGluZ01ldHJpYyIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXhhbXBsZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRXhhbXBsZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGd1aWRhbmNlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJHdWlkYW5jZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkd1aWRhbmNlRGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQXR0YWNobWVudCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ3VpZGVsaW5lRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJHdWlkZWxpbmUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChpdGVyYXRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkl0ZXJhdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIk1ldGhvZENvbmZpZ3VyYXRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQmFzZUNvbmZpZ3VyYXRpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kUGx1Z2luU2VsZWN0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RQYWNrYWdlU2VsZWN0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRGVmYXVsdFZpZXciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlldygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcm9jZXNzVmlldyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWV0aG9kRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9Hcm91cCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiT3duZWRSdWxlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjEiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImJyaWVmRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZEVsZW1lbnRfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpZCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAib3JkZXJpbmdHdWlkZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAic3VwcHJlc3NlZCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kTGlicmFyeUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWV0aG9kTGlicmFyeSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kUGx1Z2luIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZExpYnJhcnlfTWV0aG9kQ29uZmlndXJhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RDb25maWd1cmF0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RQYWNrYWdlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNZXRob2RQYWNrYWdlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQYWNrYWdlX0dyb3VwMSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6NyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmV1c2VkUGFja2FnZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDo3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBhY2thZ2VfTWV0aG9kUGFja2FnZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RQYWNrYWdlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjciCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiZ2xvYmFsIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RQbHVnaW5FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIk1ldGhvZFBsdWdpbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kUGx1Z2luX1JlZmVyZW5jZWRNZXRob2RQbHVnaW4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RQYWNrYWdlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInVzZXJDaGFuZ2VhYmxlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RVbml0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNZXRob2RVbml0IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RVbml0X0NvcHlyaWdodCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDb3B5cmlnaHQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFVuaXRfQXV0aG9ycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImF1dGhvcnMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImNoYW5nZURhdGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJjaGFuZ2VEZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmVyc2lvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWlsZXN0b25lRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNaWxlc3RvbmUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChuYW1lZEVsZW1lbnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIk5hbWVkRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZW1wdHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJuYW1lIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChvdXRjb21lRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJPdXRjb21lIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocGFja2FnZWFibGVFbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQYWNrYWdlYWJsZUVsZW1lbnQiLAotCQkJICJraW5kIiwgImVtcHR5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwaGFzZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUGhhc2UiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwbGFubmluZ0RhdGFFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlBsYW5uaW5nRGF0YSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiZmluaXNoRGF0ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJyYW5rIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAic3RhcnREYXRlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcmFjdGljZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJhY3RpY2UiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWN0aXZpdHlSZWZlcmVuY2UiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDb250ZW50UmVmZXJlbmNlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIxIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlX1N1YlByYWN0aWNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1YlByYWN0aWNlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIxIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcmFjdGljZURlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBZGRpdGlvbmFsSW5mbyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBcHBsaWNhdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkJhY2tncm91bmQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiR29hbHMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJMZXZlbHNPZkFkb3B0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJvYmxlbSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocHJvY2Vzc0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvY2VzcyIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiSW5jbHVkZXNQYXR0ZXJuIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRGVmYXVsdENvbnRleHQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiVmFsaWRDb250ZXh0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzQ29tcG9uZW50IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzQ29tcG9uZW50X0NvcHlyaWdodCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDb3B5cmlnaHQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiSW50ZXJmYWNlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcm9jZXNzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzQ29tcG9uZW50X0F1dGhvcnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJhdXRob3JzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURhdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJjaGFuZ2VEYXRlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURlc2NyaXB0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiY2hhbmdlRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRfVmVyc2lvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZlcnNpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfR3JvdXAxKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxOSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiSW50ZXJmYWNlU3BlY2lmaWNhdGlvbiIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxOSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkludGVyZmFjZUlPIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByb2Nlc3NEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTY29wZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiVXNhZ2VOb3RlcyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJleHRlcm5hbElkIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9jZXNzRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvY2Vzc0VsZW1lbnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9jZXNzUGFja2FnZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvY2Vzc1BhY2thZ2UiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NQYWNrYWdlX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MTEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJvY2Vzc0VsZW1lbnQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTEiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfR3JvdXAzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDo0MiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlUHJvY2VzcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJCYXNlUHJvY2VzcyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDo0MiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocmVwb3J0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJSZXBvcnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZXVzYWJsZUFzc2V0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJSZXVzYWJsZUFzc2V0IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocm9hZG1hcEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUm9hZG1hcCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJvbGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJvbGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJlc3BvbnNpYmxlRm9yIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIxIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyb2xlRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJvbGVEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBc3NpZ25tZW50QXBwcm9hY2hlcyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTa2lsbHMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTeW5vbnltcyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocm9sZURlc2NyaXB0b3JFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJvbGVEZXNjcmlwdG9yIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJvbGUiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVzcG9uc2libGVGb3IiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJvbGVTZXRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJvbGVTZXQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVTZXRfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSb2xlU2V0X1JvbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUm9sZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocm9sZVNldEdyb3VwaW5nRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJSb2xlU2V0R3JvdXBpbmciLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVTZXRHcm91cGluZ19Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjIxIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJvbGVTZXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlY3Rpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlNlY3Rpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fU3ViU2VjdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdWJTZWN0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlZGVjZXNzb3IiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fU2VjdGlvbk5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJzZWN0aW9uTmFtZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fVmFyaWFiaWxpdHlUeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmFyaWFiaWxpdHlUeXBlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlN1cHBvcnRpbmdNYXRlcmlhbCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRhc2tFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRhc2siLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfUHJlY29uZGl0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByZWNvbmRpdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrX1Bvc3Rjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUG9zdGNvbmRpdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrX1BlcmZvcm1lZEJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlBlcmZvcm1lZEJ5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrX01hbmRhdG9yeUlucHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1hbmRhdG9yeUlucHV0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfT3V0cHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk91dHB1dCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJPcHRpb25hbElucHV0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfRXN0aW1hdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfVG9vbE1lbnRvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJUb29sTWVudG9yIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0YXNrRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRhc2tEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWx0ZXJuYXRpdmVzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQdXJwb3NlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0YXNrRGVzY3JpcHRvckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGFza0Rlc2NyaXB0b3IiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiVGFzayIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQZXJmb3JtZWRQcmltYXJpbHlCeSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI2IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI2IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQXNzaXN0ZWRCeSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkV4dGVybmFsSW5wdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjYiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWFuZGF0b3J5SW5wdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjYiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJPcHRpb25hbElucHV0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI2IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJPdXRwdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjYiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdGVwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodGVhbVByb2ZpbGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRlYW1Qcm9maWxlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUZWFtUHJvZmlsZV9Hcm91cDEoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjE5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRlYW1Qcm9maWxlX1JvbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUm9sZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxOSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3VwZXJUZWFtIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3ViVGVhbSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxOSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodGVtcGxhdGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRlbXBsYXRlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodGVybURlZmluaXRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRlcm1EZWZpbml0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodG9vbEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVG9vbCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VG9vbF9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjIxIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRvb2xfVG9vbE1lbnRvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJUb29sTWVudG9yIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIxIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0b29sTWVudG9yRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJUb29sTWVudG9yIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodmFyaWFiaWxpdHlUeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlZhcmlhYmlsaXR5VHlwZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh2YXJpYWJpbGl0eVR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlZhcmlhYmlsaXR5VHlwZTpPYmplY3QiLAotCQkJICJiYXNlVHlwZSIsICJWYXJpYWJpbGl0eVR5cGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdoaXRlcGFwZXJFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldoaXRlcGFwZXIiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya0JyZWFrZG93bkVsZW1lbnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MTkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3IoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlZGVjZXNzb3IiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpc0V2ZW50RHJpdmVuIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpc09uZ29pbmciCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzUmVwZWF0YWJsZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod29ya0RlZmluaXRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldvcmtEZWZpbml0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlY29uZGl0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUG9zdGNvbmRpdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod29ya09yZGVyRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrT3JkZXIiLAotCQkJICJraW5kIiwgInNpbXBsZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrT3JkZXJfVmFsdWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiOjAiLAotCQkJICJraW5kIiwgInNpbXBsZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya09yZGVyX0xpbmtUeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibGlua1R5cGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtPcmRlclR5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya09yZGVyVHlwZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrT3JkZXJUeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrT3JkZXJUeXBlOk9iamVjdCIsCi0JCQkgImJhc2VUeXBlIiwgIldvcmtPcmRlclR5cGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtQcm9kdWN0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrUHJvZHVjdCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3RfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFc3RpbWF0ZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIxIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0X1JlcG9ydCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXBvcnQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiVGVtcGxhdGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJUb29sTWVudG9yIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIxIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbXBhY3RPZk5vdEhhdmluZyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlB1cnBvc2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVhc29uc0Zvck5vdE5lZWRpbmciCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImV4dGVybmFsSWQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya1Byb2R1Y3REZXNjcmlwdG9yIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiV29ya1Byb2R1Y3QiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0dyb3VwMSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjIiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiSW1wYWN0ZWRCeSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbXBhY3RzIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIyIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkRlbGl2ZXJhYmxlUGFydHMiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjIiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJhY3Rpdml0eUVudHJ5U3RhdGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImFjdGl2aXR5RXhpdFN0YXRlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrUHJvZHVjdFR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldvcmtQcm9kdWN0VHlwZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3RUeXBlX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIldvcmtQcm9kdWN0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIxIgotCQkgICB9KTsKLQl9Ci0KLX0gLy9VbWFQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9XaGl0ZXBhcGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9XaGl0ZXBhcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzAzNTNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV2hpdGVwYXBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV2hpdGVwYXBlckltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldoaXRlcGFwZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2hpdGVwYXBlckltcGwgZXh0ZW5kcyBDb25jZXB0SW1wbCBpbXBsZW1lbnRzIFdoaXRlcGFwZXIgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXaGl0ZXBhcGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV0hJVEVQQVBFUjsKLQl9Ci0KLX0gLy9XaGl0ZXBhcGVySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjU3MTZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNpc0lzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsI2lzSXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cyBXb3JrQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAxKCkgPGVtPkdyb3VwMTwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0V2ZW50RHJpdmVuKCkgPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc0V2ZW50RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzRXZlbnREcml2ZW4oKSA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzRXZlbnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRXZlbnREcml2ZW4gPSBJU19FVkVOVF9EUklWRU5fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIEV2ZW50IERyaXZlbiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFdmVudERyaXZlbkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzT25nb2luZygpIDxlbT5JcyBPbmdvaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzT25nb2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX09OR09JTkdfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNPbmdvaW5nKCkgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNPbmdvaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZ29pbmcgPSBJU19PTkdPSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBPbmdvaW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZ29pbmdFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1JlcGVhdGFibGUoKSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1JlcGVhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19SRVBFQVRBQkxFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzUmVwZWF0YWJsZSgpIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzUmVwZWF0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXBlYXRhYmxlID0gSVNfUkVQRUFUQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgUmVwZWF0YWJsZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXBlYXRhYmxlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDEoKSB7Ci0JCWlmIChncm91cDEgPT0gbnVsbCkgewotCQkJZ3JvdXAxID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMSk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UHJlZGVjZXNzb3IoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAxKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc0V2ZW50RHJpdmVuKCkgewotCQlyZXR1cm4gaXNFdmVudERyaXZlbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0V2ZW50RHJpdmVuKGJvb2xlYW4gbmV3SXNFdmVudERyaXZlbikgewotCQlib29sZWFuIG9sZElzRXZlbnREcml2ZW4gPSBpc0V2ZW50RHJpdmVuOwotCQlpc0V2ZW50RHJpdmVuID0gbmV3SXNFdmVudERyaXZlbjsKLQkJYm9vbGVhbiBvbGRJc0V2ZW50RHJpdmVuRVNldCA9IGlzRXZlbnREcml2ZW5FU2V0OwotCQlpc0V2ZW50RHJpdmVuRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOLCBvbGRJc0V2ZW50RHJpdmVuLCBpc0V2ZW50RHJpdmVuLCAhb2xkSXNFdmVudERyaXZlbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzRXZlbnREcml2ZW4oKSB7Ci0JCWJvb2xlYW4gb2xkSXNFdmVudERyaXZlbiA9IGlzRXZlbnREcml2ZW47Ci0JCWJvb2xlYW4gb2xkSXNFdmVudERyaXZlbkVTZXQgPSBpc0V2ZW50RHJpdmVuRVNldDsKLQkJaXNFdmVudERyaXZlbiA9IElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVDsKLQkJaXNFdmVudERyaXZlbkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiwgb2xkSXNFdmVudERyaXZlbiwgSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxULCBvbGRJc0V2ZW50RHJpdmVuRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNFdmVudERyaXZlbigpIHsKLQkJcmV0dXJuIGlzRXZlbnREcml2ZW5FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNPbmdvaW5nKCkgewotCQlyZXR1cm4gaXNPbmdvaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzT25nb2luZyhib29sZWFuIG5ld0lzT25nb2luZykgewotCQlib29sZWFuIG9sZElzT25nb2luZyA9IGlzT25nb2luZzsKLQkJaXNPbmdvaW5nID0gbmV3SXNPbmdvaW5nOwotCQlib29sZWFuIG9sZElzT25nb2luZ0VTZXQgPSBpc09uZ29pbmdFU2V0OwotCQlpc09uZ29pbmdFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HLCBvbGRJc09uZ29pbmcsIGlzT25nb2luZywgIW9sZElzT25nb2luZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzT25nb2luZygpIHsKLQkJYm9vbGVhbiBvbGRJc09uZ29pbmcgPSBpc09uZ29pbmc7Ci0JCWJvb2xlYW4gb2xkSXNPbmdvaW5nRVNldCA9IGlzT25nb2luZ0VTZXQ7Ci0JCWlzT25nb2luZyA9IElTX09OR09JTkdfRURFRkFVTFQ7Ci0JCWlzT25nb2luZ0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcsIG9sZElzT25nb2luZywgSVNfT05HT0lOR19FREVGQVVMVCwgb2xkSXNPbmdvaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNPbmdvaW5nKCkgewotCQlyZXR1cm4gaXNPbmdvaW5nRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzUmVwZWF0YWJsZSgpIHsKLQkJcmV0dXJuIGlzUmVwZWF0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1JlcGVhdGFibGUoYm9vbGVhbiBuZXdJc1JlcGVhdGFibGUpIHsKLQkJYm9vbGVhbiBvbGRJc1JlcGVhdGFibGUgPSBpc1JlcGVhdGFibGU7Ci0JCWlzUmVwZWF0YWJsZSA9IG5ld0lzUmVwZWF0YWJsZTsKLQkJYm9vbGVhbiBvbGRJc1JlcGVhdGFibGVFU2V0ID0gaXNSZXBlYXRhYmxlRVNldDsKLQkJaXNSZXBlYXRhYmxlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSwgb2xkSXNSZXBlYXRhYmxlLCBpc1JlcGVhdGFibGUsICFvbGRJc1JlcGVhdGFibGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc1JlcGVhdGFibGUoKSB7Ci0JCWJvb2xlYW4gb2xkSXNSZXBlYXRhYmxlID0gaXNSZXBlYXRhYmxlOwotCQlib29sZWFuIG9sZElzUmVwZWF0YWJsZUVTZXQgPSBpc1JlcGVhdGFibGVFU2V0OwotCQlpc1JlcGVhdGFibGUgPSBJU19SRVBFQVRBQkxFX0VERUZBVUxUOwotCQlpc1JlcGVhdGFibGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFLCBvbGRJc1JlcGVhdGFibGUsIElTX1JFUEVBVEFCTEVfRURFRkFVTFQsIG9sZElzUmVwZWF0YWJsZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzUmVwZWF0YWJsZSgpIHsKLQkJcmV0dXJuIGlzUmVwZWF0YWJsZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFREVDRVNTT1I6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQcmVkZWNlc3NvcigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAxKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDEoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOgotCQkJCXJldHVybiBnZXRQcmVkZWNlc3NvcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjoKLQkJCQlyZXR1cm4gaXNJc0V2ZW50RHJpdmVuKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCQkJcmV0dXJuIGlzSXNPbmdvaW5nKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCQkJcmV0dXJuIGlzSXNSZXBlYXRhYmxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDEoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFREVDRVNTT1I6Ci0JCQkJZ2V0UHJlZGVjZXNzb3IoKS5jbGVhcigpOwotCQkJCWdldFByZWRlY2Vzc29yKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJCXNldElzRXZlbnREcml2ZW4oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCQkJc2V0SXNPbmdvaW5nKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJCXNldElzUmVwZWF0YWJsZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMToKLQkJCQlnZXRHcm91cDEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjoKLQkJCQlnZXRQcmVkZWNlc3NvcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjoKLQkJCQl1bnNldElzRXZlbnREcml2ZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCQl1bnNldElzT25nb2luZygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJCXVuc2V0SXNSZXBlYXRhYmxlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOgotCQkJCXJldHVybiBncm91cDEgIT0gbnVsbCAmJiAhZ3JvdXAxLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjoKLQkJCQlyZXR1cm4gIWdldFByZWRlY2Vzc29yKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjoKLQkJCQlyZXR1cm4gaXNTZXRJc0V2ZW50RHJpdmVuKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCQlyZXR1cm4gaXNTZXRJc09uZ29pbmcoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJCXJldHVybiBpc1NldElzUmVwZWF0YWJsZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAxOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzRXZlbnREcml2ZW46ICIpOwotCQlpZiAoaXNFdmVudERyaXZlbkVTZXQpIHJlc3VsdC5hcHBlbmQoaXNFdmVudERyaXZlbik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzT25nb2luZzogIik7Ci0JCWlmIChpc09uZ29pbmdFU2V0KSByZXN1bHQuYXBwZW5kKGlzT25nb2luZyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzUmVwZWF0YWJsZTogIik7Ci0JCWlmIChpc1JlcGVhdGFibGVFU2V0KSByZXN1bHQuYXBwZW5kKGlzUmVwZWF0YWJsZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtEZWZpbml0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTc0YzA2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtEZWZpbml0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya0RlZmluaXRpb25JbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbCNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya0RlZmluaXRpb25JbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cyBXb3JrRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFQ09ORElUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVjb25kaXRpb24gPSBQUkVDT05ESVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NUQ09ORElUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwb3N0Y29uZGl0aW9uID0gUE9TVENPTkRJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrRGVmaW5pdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVjb25kaXRpb24oU3RyaW5nIG5ld1ByZWNvbmRpdGlvbikgewotCQlTdHJpbmcgb2xkUHJlY29uZGl0aW9uID0gcHJlY29uZGl0aW9uOwotCQlwcmVjb25kaXRpb24gPSBuZXdQcmVjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sIG9sZFByZWNvbmRpdGlvbiwgcHJlY29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0Y29uZGl0aW9uKFN0cmluZyBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCVN0cmluZyBvbGRQb3N0Y29uZGl0aW9uID0gcG9zdGNvbmRpdGlvbjsKLQkJcG9zdGNvbmRpdGlvbiA9IG5ld1Bvc3Rjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLCBvbGRQb3N0Y29uZGl0aW9uLCBwb3N0Y29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBnZXRQcmVjb25kaXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIGdldFBvc3Rjb25kaXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXNldFByZWNvbmRpdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJCXNldFBvc3Rjb25kaXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCQlzZXRQcmVjb25kaXRpb24oUFJFQ09ORElUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJCXNldFBvc3Rjb25kaXRpb24oUE9TVENPTkRJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFBSRUNPTkRJVElPTl9FREVGQVVMVCA9PSBudWxsID8gcHJlY29uZGl0aW9uICE9IG51bGwgOiAhUFJFQ09ORElUSU9OX0VERUZBVUxULmVxdWFscyhwcmVjb25kaXRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gUE9TVENPTkRJVElPTl9FREVGQVVMVCA9PSBudWxsID8gcG9zdGNvbmRpdGlvbiAhPSBudWxsIDogIVBPU1RDT05ESVRJT05fRURFRkFVTFQuZXF1YWxzKHBvc3Rjb25kaXRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlY29uZGl0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVjb25kaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBvc3Rjb25kaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBvc3Rjb25kaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrRGVmaW5pdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtPcmRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya09yZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNmE1NDY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya09yZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya09yZGVySW1wbC5qYXZhLHYgMS40IDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmltcGwuRURhdGFPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIE9yZGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtPcmRlckltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtPcmRlckltcGwjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtPcmRlckltcGwgZXh0ZW5kcyBFRGF0YU9iamVjdEltcGwgaW1wbGVtZW50cyBXb3JrT3JkZXIgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUeXBlKCkgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgV29ya09yZGVyVHlwZSBMSU5LX1RZUEVfRURFRkFVTFQgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVF9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlua1R5cGUoKSA8ZW0+TGluayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtPcmRlclR5cGUgbGlua1R5cGUgPSBMSU5LX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIExpbmsgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGlua1R5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrT3JkZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX09SREVSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXJUeXBlIGdldExpbmtUeXBlKCkgewotCQlyZXR1cm4gbGlua1R5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSBuZXdMaW5rVHlwZSkgewotCQlXb3JrT3JkZXJUeXBlIG9sZExpbmtUeXBlID0gbGlua1R5cGU7Ci0JCWxpbmtUeXBlID0gbmV3TGlua1R5cGUgPT0gbnVsbCA/IExJTktfVFlQRV9FREVGQVVMVCA6IG5ld0xpbmtUeXBlOwotCQlib29sZWFuIG9sZExpbmtUeXBlRVNldCA9IGxpbmtUeXBlRVNldDsKLQkJbGlua1R5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEUsIG9sZExpbmtUeXBlLCBsaW5rVHlwZSwgIW9sZExpbmtUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TGlua1R5cGUoKSB7Ci0JCVdvcmtPcmRlclR5cGUgb2xkTGlua1R5cGUgPSBsaW5rVHlwZTsKLQkJYm9vbGVhbiBvbGRMaW5rVHlwZUVTZXQgPSBsaW5rVHlwZUVTZXQ7Ci0JCWxpbmtUeXBlID0gTElOS19UWVBFX0VERUZBVUxUOwotCQlsaW5rVHlwZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRSwgb2xkTGlua1R5cGUsIExJTktfVFlQRV9FREVGQVVMVCwgb2xkTGlua1R5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMaW5rVHlwZSgpIHsKLQkJcmV0dXJuIGxpbmtUeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfT1JERVJfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJCXJldHVybiBnZXRMaW5rVHlwZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRToKLQkJCQlzZXRMaW5rVHlwZSgoV29ya09yZGVyVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEU6Ci0JCQkJdW5zZXRMaW5rVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJCXJldHVybiBpc1NldExpbmtUeXBlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpbmtUeXBlOiAiKTsKLQkJaWYgKGxpbmtUeXBlRVNldCkgcmVzdWx0LmFwcGVuZChsaW5rVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtPcmRlckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ2NzUwZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsI2dldEltcGFjdE9mTm90SGF2aW5nIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBhY3RPZk5vdEhhdmluZygpIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGFjdE9mTm90SGF2aW5nKCkgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbXBhY3RPZk5vdEhhdmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpbXBhY3RPZk5vdEhhdmluZyA9IElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVSUE9TRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVycG9zZSA9IFBVUlBPU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKSA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVhc29uc0Zvck5vdE5lZWRpbmcgPSBSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbElkKCkgPGVtPkV4dGVybmFsIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbElkKCkgPGVtPkV4dGVybmFsIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dGVybmFsSWQgPSBFWFRFUk5BTF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKSB7Ci0JCXJldHVybiBpbXBhY3RPZk5vdEhhdmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbXBhY3RPZk5vdEhhdmluZyhTdHJpbmcgbmV3SW1wYWN0T2ZOb3RIYXZpbmcpIHsKLQkJU3RyaW5nIG9sZEltcGFjdE9mTm90SGF2aW5nID0gaW1wYWN0T2ZOb3RIYXZpbmc7Ci0JCWltcGFjdE9mTm90SGF2aW5nID0gbmV3SW1wYWN0T2ZOb3RIYXZpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORywgb2xkSW1wYWN0T2ZOb3RIYXZpbmcsIGltcGFjdE9mTm90SGF2aW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFLCBvbGRQdXJwb3NlLCBwdXJwb3NlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIHsKLQkJcmV0dXJuIHJlYXNvbnNGb3JOb3ROZWVkaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFN0cmluZyBuZXdSZWFzb25zRm9yTm90TmVlZGluZykgewotCQlTdHJpbmcgb2xkUmVhc29uc0Zvck5vdE5lZWRpbmcgPSByZWFzb25zRm9yTm90TmVlZGluZzsKLQkJcmVhc29uc0Zvck5vdE5lZWRpbmcgPSBuZXdSZWFzb25zRm9yTm90TmVlZGluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HLCBvbGRSZWFzb25zRm9yTm90TmVlZGluZywgcmVhc29uc0Zvck5vdE5lZWRpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsSWQoKSB7Ci0JCXJldHVybiBleHRlcm5hbElkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsSWQoU3RyaW5nIG5ld0V4dGVybmFsSWQpIHsKLQkJU3RyaW5nIG9sZEV4dGVybmFsSWQgPSBleHRlcm5hbElkOwotCQlleHRlcm5hbElkID0gbmV3RXh0ZXJuYWxJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lELCBvbGRFeHRlcm5hbElkLCBleHRlcm5hbElkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCQkJcmV0dXJuIGdldEltcGFjdE9mTm90SGF2aW5nKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXJldHVybiBnZXRQdXJwb3NlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCQlyZXR1cm4gZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJCXJldHVybiBnZXRFeHRlcm5hbElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJCXNldEltcGFjdE9mTm90SGF2aW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJc2V0UHVycG9zZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCQlzZXRSZWFzb25zRm9yTm90TmVlZGluZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCQlzZXRFeHRlcm5hbElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJCQlzZXRJbXBhY3RPZk5vdEhhdmluZyhJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlzZXRQdXJwb3NlKFBVUlBPU0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJCXNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCQlzZXRFeHRlcm5hbElkKEVYVEVSTkFMX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJCXJldHVybiBJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVCA9PSBudWxsID8gaW1wYWN0T2ZOb3RIYXZpbmcgIT0gbnVsbCA6ICFJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVC5lcXVhbHMoaW1wYWN0T2ZOb3RIYXZpbmcpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlyZXR1cm4gUFVSUE9TRV9FREVGQVVMVCA9PSBudWxsID8gcHVycG9zZSAhPSBudWxsIDogIVBVUlBPU0VfRURFRkFVTFQuZXF1YWxzKHB1cnBvc2UpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc6Ci0JCQkJcmV0dXJuIFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUID09IG51bGwgPyByZWFzb25zRm9yTm90TmVlZGluZyAhPSBudWxsIDogIVJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxULmVxdWFscyhyZWFzb25zRm9yTm90TmVlZGluZyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCQlyZXR1cm4gRVhURVJOQUxfSURfRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVybmFsSWQgIT0gbnVsbCA6ICFFWFRFUk5BTF9JRF9FREVGQVVMVC5lcXVhbHMoZXh0ZXJuYWxJZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpbXBhY3RPZk5vdEhhdmluZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW1wYWN0T2ZOb3RIYXZpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1cnBvc2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHB1cnBvc2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlYXNvbnNGb3JOb3ROZWVkaW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWFzb25zRm9yTm90TmVlZGluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXh0ZXJuYWxJZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXh0ZXJuYWxJZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTRlZWY4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRJbXBhY3RlZEJ5IDxlbT5JbXBhY3RlZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEltcGFjdHMgPGVtPkltcGFjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXREZWxpdmVyYWJsZVBhcnRzIDxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEFjdGl2aXR5RW50cnlTdGF0ZSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRBY3Rpdml0eUV4aXRTdGF0ZSA8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgZXh0ZW5kcyBEZXNjcmlwdG9ySW1wbCBpbXBsZW1lbnRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtQcm9kdWN0KCkgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfUFJPRFVDVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrUHJvZHVjdCgpIDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHdvcmtQcm9kdWN0ID0gV09SS19QUk9EVUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAxKCkgPGVtPkdyb3VwMTwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2aXR5RW50cnlTdGF0ZSA9IEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2aXR5RXhpdFN0YXRlID0gQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya1Byb2R1Y3QoU3RyaW5nIG5ld1dvcmtQcm9kdWN0KSB7Ci0JCVN0cmluZyBvbGRXb3JrUHJvZHVjdCA9IHdvcmtQcm9kdWN0OwotCQl3b3JrUHJvZHVjdCA9IG5ld1dvcmtQcm9kdWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QsIG9sZFdvcmtQcm9kdWN0LCB3b3JrUHJvZHVjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMSgpIHsKLQkJaWYgKGdyb3VwMSA9PSBudWxsKSB7Ci0JCQlncm91cDEgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMSk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SW1wYWN0ZWRCeSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDEoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEltcGFjdHMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAxKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlbGl2ZXJhYmxlUGFydHMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAxKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkgewotCQlyZXR1cm4gYWN0aXZpdHlFbnRyeVN0YXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RW50cnlTdGF0ZShTdHJpbmcgbmV3QWN0aXZpdHlFbnRyeVN0YXRlKSB7Ci0JCVN0cmluZyBvbGRBY3Rpdml0eUVudHJ5U3RhdGUgPSBhY3Rpdml0eUVudHJ5U3RhdGU7Ci0JCWFjdGl2aXR5RW50cnlTdGF0ZSA9IG5ld0FjdGl2aXR5RW50cnlTdGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUsIG9sZEFjdGl2aXR5RW50cnlTdGF0ZSwgYWN0aXZpdHlFbnRyeVN0YXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RXhpdFN0YXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RXhpdFN0YXRlKFN0cmluZyBuZXdBY3Rpdml0eUV4aXRTdGF0ZSkgewotCQlTdHJpbmcgb2xkQWN0aXZpdHlFeGl0U3RhdGUgPSBhY3Rpdml0eUV4aXRTdGF0ZTsKLQkJYWN0aXZpdHlFeGl0U3RhdGUgPSBuZXdBY3Rpdml0eUV4aXRTdGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSwgb2xkQWN0aXZpdHlFeGl0U3RhdGUsIGFjdGl2aXR5RXhpdFN0YXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUDE6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAxOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMSgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQkJcmV0dXJuIGdldEltcGFjdGVkQnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCQlyZXR1cm4gZ2V0SW1wYWN0cygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUzoKLQkJCQlyZXR1cm4gZ2V0RGVsaXZlcmFibGVQYXJ0cygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCQlyZXR1cm4gZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQkJcmV0dXJuIGdldEFjdGl2aXR5RXhpdFN0YXRlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJCXNldFdvcmtQcm9kdWN0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAxOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDEoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJCWdldEltcGFjdGVkQnkoKS5jbGVhcigpOwotCQkJCWdldEltcGFjdGVkQnkoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCQlnZXRJbXBhY3RzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbXBhY3RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJCWdldERlbGl2ZXJhYmxlUGFydHMoKS5jbGVhcigpOwotCQkJCWdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEU6Ci0JCQkJc2V0QWN0aXZpdHlFbnRyeVN0YXRlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCQlzZXRBY3Rpdml0eUV4aXRTdGF0ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQkJc2V0V29ya1Byb2R1Y3QoV09SS19QUk9EVUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMToKLQkJCQlnZXRHcm91cDEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQkJZ2V0SW1wYWN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJCWdldEltcGFjdHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQkJZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCQlzZXRBY3Rpdml0eUVudHJ5U3RhdGUoQUNUSVZJVFlfRU5UUllfU1RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCQlzZXRBY3Rpdml0eUV4aXRTdGF0ZShBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJCXJldHVybiBXT1JLX1BST0RVQ1RfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmtQcm9kdWN0ICE9IG51bGwgOiAhV09SS19QUk9EVUNUX0VERUZBVUxULmVxdWFscyh3b3JrUHJvZHVjdCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMToKLQkJCQlyZXR1cm4gZ3JvdXAxICE9IG51bGwgJiYgIWdyb3VwMS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJCXJldHVybiAhZ2V0SW1wYWN0ZWRCeSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCQlyZXR1cm4gIWdldEltcGFjdHMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJCXJldHVybiAhZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEU6Ci0JCQkJcmV0dXJuIEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUID09IG51bGwgPyBhY3Rpdml0eUVudHJ5U3RhdGUgIT0gbnVsbCA6ICFBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVC5lcXVhbHMoYWN0aXZpdHlFbnRyeVN0YXRlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCQlyZXR1cm4gQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVCA9PSBudWxsID8gYWN0aXZpdHlFeGl0U3RhdGUgIT0gbnVsbCA6ICFBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxULmVxdWFscyhhY3Rpdml0eUV4aXRTdGF0ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh3b3JrUHJvZHVjdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29ya1Byb2R1Y3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwMTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAxKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3Rpdml0eUVudHJ5U3RhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdGl2aXR5RW50cnlTdGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0aXZpdHlFeGl0U3RhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdGl2aXR5RXhpdFN0YXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYTRmODA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrUHJvZHVjdEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsI2dldEVzdGltYXRlIDxlbT5Fc3RpbWF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRSZXBvcnQgPGVtPlJlcG9ydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0VGVtcGxhdGUgPGVtPlRlbXBsYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRUb29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0SW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFdvcmtQcm9kdWN0IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFc3RpbWF0ZSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fRVNUSU1BVEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZXBvcnQoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfX1JFUE9SVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19URU1QTEFURSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRvb2xNZW50b3IoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVEU6Ci0JCQkJcmV0dXJuIGdldEVzdGltYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCXJldHVybiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1JFUE9SVDoKLQkJCQlyZXR1cm4gZ2V0UmVwb3J0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19URU1QTEFURToKLQkJCQlyZXR1cm4gZ2V0VGVtcGxhdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SOgotCQkJCXJldHVybiBnZXRUb29sTWVudG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVEU6Ci0JCQkJZ2V0RXN0aW1hdGUoKS5jbGVhcigpOwotCQkJCWdldEVzdGltYXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlQ6Ci0JCQkJZ2V0UmVwb3J0KCkuY2xlYXIoKTsKLQkJCQlnZXRSZXBvcnQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFOgotCQkJCWdldFRlbXBsYXRlKCkuY2xlYXIoKTsKLQkJCQlnZXRUZW1wbGF0ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I6Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmNsZWFyKCk7Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRFOgotCQkJCWdldEVzdGltYXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUOgotCQkJCWdldFJlcG9ydCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEU6Ci0JCQkJZ2V0VGVtcGxhdGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SOgotCQkJCWdldFRvb2xNZW50b3IoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRFOgotCQkJCXJldHVybiAhZ2V0RXN0aW1hdGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCXJldHVybiAhZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUOgotCQkJCXJldHVybiAhZ2V0UmVwb3J0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEU6Ci0JCQkJcmV0dXJuICFnZXRUZW1wbGF0ZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SOgotCQkJCXJldHVybiAhZ2V0VG9vbE1lbnRvcigpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3RJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTlkMTY1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0VHlwZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VHlwZUltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgV29ya1Byb2R1Y3RUeXBlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdFR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVDoKLQkJCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUOgotCQkJCWdldFdvcmtQcm9kdWN0KCkuY2xlYXIoKTsKLQkJCQlnZXRXb3JrUHJvZHVjdCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1Q6Ci0JCQkJZ2V0V29ya1Byb2R1Y3QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1Q6Ci0JCQkJcmV0dXJuICFnZXRXb3JrUHJvZHVjdCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3RUeXBlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlZTI4ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFhNTCBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0NmExOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBVTUEgWE1MIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNzVmMjVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFBZGFwdGVyRmFjdG9yeS5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MDAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVW1hUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYUFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVtYVN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBVbWFTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBY3Rpdml0eShBY3Rpdml0eSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKEFjdGl2aXR5RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcnRpZmFjdChBcnRpZmFjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcnRpZmFjdERlc2NyaXB0aW9uKEFydGlmYWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VCcmVha2Rvd25FbGVtZW50KEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDYXBhYmlsaXR5UGF0dGVybihDYXBhYmlsaXR5UGF0dGVybiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDaGVja2xpc3QoQ2hlY2tsaXN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wb3NpdGVSb2xlKENvbXBvc2l0ZVJvbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25jZXB0KENvbmNlcHQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbmNlcHRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25zdHJhaW50KENvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnN0cmFpbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb250ZW50Q2F0ZWdvcnkoQ29udGVudENhdGVnb3J5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb250ZW50Q2F0ZWdvcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKENvbnRlbnRDYXRlZ29yeVBhY2thZ2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb250ZW50RGVzY3JpcHRpb24oQ29udGVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb250ZW50RWxlbWVudChDb250ZW50RWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29udGVudEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb250ZW50UGFja2FnZShDb250ZW50UGFja2FnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29udGVudFBhY2thZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZWxpdmVyYWJsZShEZWxpdmVyYWJsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVsaXZlcmFibGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZWxpdmVyYWJsZURlc2NyaXB0aW9uKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZWxpdmVyeVByb2Nlc3MoRGVsaXZlcnlQcm9jZXNzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbihEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoRGVzY3JpYmFibGVFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdG9yKERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdG9yRGVzY3JpcHRpb24oRGVzY3JpcHRvckRlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEaXNjaXBsaW5lKERpc2NpcGxpbmUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEaXNjaXBsaW5lR3JvdXBpbmcoRGlzY2lwbGluZUdyb3VwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEb2N1bWVudFJvb3QoRG9jdW1lbnRSb290IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEb2N1bWVudFJvb3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEb21haW4oRG9tYWluIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEb21haW5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFbGVtZW50KEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFc3RpbWF0ZShFc3RpbWF0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXN0aW1hdGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFc3RpbWF0aW5nTWV0cmljKEVzdGltYXRpbmdNZXRyaWMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVzdGltYXRpbmdNZXRyaWNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeGFtcGxlKEV4YW1wbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4YW1wbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VHdWlkYW5jZShHdWlkYW5jZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VHdWlkYW5jZURlc2NyaXB0aW9uKEd1aWRhbmNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VHdWlkZWxpbmUoR3VpZGVsaW5lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVHdWlkZWxpbmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJdGVyYXRpb24oSXRlcmF0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RQYWNrYWdlKE1ldGhvZFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFBhY2thZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RVbml0KE1ldGhvZFVuaXQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFVuaXRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNaWxlc3RvbmUoTWlsZXN0b25lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VOYW1lZEVsZW1lbnQoTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVOYW1lZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRjb21lKE91dGNvbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU91dGNvbWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoUGFja2FnZWFibGVFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQYWNrYWdlYWJsZUVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQaGFzZShQaGFzZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUGhhc2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQbGFubmluZ0RhdGEoUGxhbm5pbmdEYXRhIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQbGFubmluZ0RhdGFBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcmFjdGljZShQcmFjdGljZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcmFjdGljZURlc2NyaXB0aW9uKFByYWN0aWNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3Mgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzRGVzY3JpcHRpb24oUHJvY2Vzc0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzRWxlbWVudChQcm9jZXNzRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0VsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzUGFja2FnZShQcm9jZXNzUGFja2FnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZShQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXBvcnQoUmVwb3J0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZXBvcnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXVzYWJsZUFzc2V0KFJldXNhYmxlQXNzZXQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSb2FkbWFwKFJvYWRtYXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvYWRtYXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlKFJvbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlRGVzY3JpcHRpb24oUm9sZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlRGVzY3JpcHRvcihSb2xlRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlU2V0KFJvbGVTZXQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlU2V0R3JvdXBpbmcoUm9sZVNldEdyb3VwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN0aW9uKFNlY3Rpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlY3Rpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTdXBwb3J0aW5nTWF0ZXJpYWwoU3VwcG9ydGluZ01hdGVyaWFsIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWxBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrKFRhc2sgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRhc2tBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrRGVzY3JpcHRpb24oVGFza0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYXNrRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUZWFtUHJvZmlsZShUZWFtUHJvZmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUZW1wbGF0ZShUZW1wbGF0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGVtcGxhdGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUZXJtRGVmaW5pdGlvbihUZXJtRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGVybURlZmluaXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUb29sKFRvb2wgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRvb2xBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUb29sTWVudG9yKFRvb2xNZW50b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRvb2xNZW50b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXaGl0ZXBhcGVyKFdoaXRlcGFwZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdoaXRlcGFwZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChXb3JrQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrRGVmaW5pdGlvbihXb3JrRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya0RlZmluaXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrT3JkZXIoV29ya09yZGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrT3JkZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0b3IoV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdFR5cGUoV29ya1Byb2R1Y3RUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkgPGVtPkFjdGl2aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uIDxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0IDxlbT5BcnRpZmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcnRpZmFjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiA8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50IDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiA8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2FwYWJpbGl0eVBhdHRlcm4gPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2hlY2tsaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNoZWNrbGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZSA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wb3NpdGVSb2xlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0IDxlbT5Db25jZXB0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uY2VwdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludCA8ZW0+Q29uc3RyYWludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnN0cmFpbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeSA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudENhdGVnb3J5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlIDxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50Q2F0ZWdvcnlQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24gPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQgPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2UgPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50UGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDdXN0b21DYXRlZ29yeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUgPGVtPkRlbGl2ZXJhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJhYmxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiA8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50IDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IgPGVtPkRlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZyA8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvY3VtZW50Um9vdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluIDxlbT5Eb21haW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlIDxlbT5Fc3RpbWF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFc3RpbWF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYyA8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFc3RpbWF0aW5nTWV0cmljQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4YW1wbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlIDxlbT5HdWlkYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiA8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkZWxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGVsaW5lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb24gPGVtPkl0ZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RMaWJyYXJ5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGx1Z2luQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0IDxlbT5NZXRob2QgVW5pdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFVuaXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudCA8ZW0+TmFtZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTmFtZWRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5PdXRjb21lIDxlbT5PdXRjb21lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0Y29tZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50IDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBhY2thZ2VhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYWNrYWdlYWJsZUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlIDxlbT5QaGFzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QaGFzZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQbGFubmluZ0RhdGFBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlIDxlbT5QcmFjdGljZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmFjdGljZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiA8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24gPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2UgPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXBvcnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmV1c2FibGVBc3NldEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcCA8ZW0+Um9hZG1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2FkbWFwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvYWRtYXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24gPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IgPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCA8ZW0+Um9sZSBTZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmcgPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24gPGVtPlNlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiA8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciA8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSA8ZW0+VGVhbSBQcm9maWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZSA8ZW0+VGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVtcGxhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVtcGxhdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVybURlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVybURlZmluaXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wgPGVtPlRvb2w8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUb29sQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sTWVudG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xNZW50b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldoaXRlcGFwZXIgPGVtPldoaXRlcGFwZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV2hpdGVwYXBlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXaGl0ZXBhcGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24gPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrRGVmaW5pdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyIDxlbT5Xb3JrIE9yZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrT3JkZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24gPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1VtYUFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNDE3YmQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIEZhY3Rvcnk8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsLlVtYVJlc291cmNlSW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hUmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYVJlc291cmNlRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJWE1MUmVzb3VyY2UgcmVzdWx0ID0gbmV3IFVtYVJlc291cmNlSW1wbCh1cmkpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9TQ0hFTUFfTE9DQVRJT04sIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0xFWElDQUxfSEFORExFUiwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0gLy9VbWFSZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTJmYzhkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFSZXNvdXJjZUltcGwuamF2YSx2IDEuMSAyMDA2LzA1LzAxIDE5OjUwOjAwIGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFNhdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIDwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWwuVW1hUmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgbmV3IHJlc291cmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBjdXN0b21pemF0aW9uIGhlcmUsIEppbmh1YSBYaSAwNC8yOC8yMDA2Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlci5zYXZlKG9wdGlvbnMpOwotCX0KLQotCXByb3RlY3RlZCBYTUxTYXZlIGNyZWF0ZVhNTFNhdmUoKSB7Ci0JCS8vIHJldHVybiBzdXBlci5jcmVhdGVYTUxTYXZlKCk7Ci0JCXJldHVybiBuZXcgVW1hWE1MU2F2ZUltcGwoY3JlYXRlWE1MSGVscGVyKCkpOwotCX0KLQkKLX0gLy9VbWFSZXNvdXJjZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTcwZjNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDgzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVW1hU3dpdGNoLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpbmdNZXRyaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYVN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBVbWFQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFk6IHsKLQkJCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQWN0aXZpdHkoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChhY3Rpdml0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhY3Rpdml0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChhY3Rpdml0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OOiB7Ci0JCQkJQWN0aXZpdHlEZXNjcmlwdGlvbiBhY3Rpdml0eURlc2NyaXB0aW9uID0gKEFjdGl2aXR5RGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVDogewotCQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcnRpZmFjdChhcnRpZmFjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3QoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGFydGlmYWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhcnRpZmFjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFydGlmYWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGFydGlmYWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT046IHsKLQkJCQlBcnRpZmFjdERlc2NyaXB0aW9uIGFydGlmYWN0RGVzY3JpcHRpb24gPSAoQXJ0aWZhY3REZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXJ0aWZhY3REZXNjcmlwdGlvbihhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVDogewotCQkJCUJyZWFrZG93bkVsZW1lbnQgYnJlYWtkb3duRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT046IHsKLQkJCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uID0gKEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNBUEFCSUxJVFlfUEFUVEVSTjogewotCQkJCUNhcGFiaWxpdHlQYXR0ZXJuIGNhcGFiaWxpdHlQYXR0ZXJuID0gKENhcGFiaWxpdHlQYXR0ZXJuKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDYXBhYmlsaXR5UGF0dGVybihjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2VzcyhjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWN0aXZpdHkoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNIRUNLTElTVDogewotCQkJCUNoZWNrbGlzdCBjaGVja2xpc3QgPSAoQ2hlY2tsaXN0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDaGVja2xpc3QoY2hlY2tsaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShjaGVja2xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjaGVja2xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjaGVja2xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjaGVja2xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEU6IHsKLQkJCQlDb21wb3NpdGVSb2xlIGNvbXBvc2l0ZVJvbGUgPSAoQ29tcG9zaXRlUm9sZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29tcG9zaXRlUm9sZShjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSb2xlRGVzY3JpcHRvcihjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05DRVBUOiB7Ci0JCQkJQ29uY2VwdCBjb25jZXB0ID0gKENvbmNlcHQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbmNlcHQoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb25jZXB0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UOiB7Ci0JCQkJQ29uc3RyYWludCBjb25zdHJhaW50ID0gKENvbnN0cmFpbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbnN0cmFpbnQoY29uc3RyYWludCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29uc3RyYWludCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29uc3RyYWludCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUlk6IHsKLQkJCQlDb250ZW50Q2F0ZWdvcnkgY29udGVudENhdGVnb3J5ID0gKENvbnRlbnRDYXRlZ29yeSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0U6IHsKLQkJCQlDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgPSAoQ29udGVudENhdGVnb3J5UGFja2FnZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5UGFja2FnZShjb250ZW50Q2F0ZWdvcnlQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RQYWNrYWdlKGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudENhdGVnb3J5UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb250ZW50Q2F0ZWdvcnlQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OOiB7Ci0JCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IChDb250ZW50RGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihjb250ZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlQ6IHsKLQkJCQlDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCA9IChDb250ZW50RWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0U6IHsKLQkJCQlDb250ZW50UGFja2FnZSBjb250ZW50UGFja2FnZSA9IChDb250ZW50UGFja2FnZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29udGVudFBhY2thZ2UoY29udGVudFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UoY29udGVudFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZOiB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUN1c3RvbUNhdGVnb3J5KGN1c3RvbUNhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEU6IHsKLQkJCQlEZWxpdmVyYWJsZSBkZWxpdmVyYWJsZSA9IChEZWxpdmVyYWJsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGVsaXZlcmFibGUoZGVsaXZlcmFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OOiB7Ci0JCQkJRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uID0gKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbihkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTUzogewotCQkJCURlbGl2ZXJ5UHJvY2VzcyBkZWxpdmVyeVByb2Nlc3MgPSAoRGVsaXZlcnlQcm9jZXNzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEZWxpdmVyeVByb2Nlc3MoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzKGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWN0aXZpdHkoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT046IHsKLQkJCQlEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiA9IChEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVDogewotCQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZXNjcmliYWJsZUVsZW1lbnQgPSAoRGVzY3JpYmFibGVFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SOiB7Ci0JCQkJRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKERlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT046IHsKLQkJCQlEZXNjcmlwdG9yRGVzY3JpcHRpb24gZGVzY3JpcHRvckRlc2NyaXB0aW9uID0gKERlc2NyaXB0b3JEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGVzY3JpcHRvckRlc2NyaXB0aW9uKGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkU6IHsKLQkJCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGlzY2lwbGluZShkaXNjaXBsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoZGlzY2lwbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HOiB7Ci0JCQkJRGlzY2lwbGluZUdyb3VwaW5nIGRpc2NpcGxpbmVHcm91cGluZyA9IChEaXNjaXBsaW5lR3JvdXBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURpc2NpcGxpbmVHcm91cGluZyhkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVDogewotCQkJCURvY3VtZW50Um9vdCBkb2N1bWVudFJvb3QgPSAoRG9jdW1lbnRSb290KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEb2N1bWVudFJvb3QoZG9jdW1lbnRSb290KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOOiB7Ci0JCQkJRG9tYWluIGRvbWFpbiA9IChEb21haW4pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURvbWFpbihkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGRvbWFpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRvbWFpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZG9tYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRUxFTUVOVDogewotCQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFbGVtZW50KGVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURTogewotCQkJCUVzdGltYXRlIGVzdGltYXRlID0gKEVzdGltYXRlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFc3RpbWF0ZShlc3RpbWF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGVzdGltYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChlc3RpbWF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGVzdGltYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGVzdGltYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVElOR19NRVRSSUM6IHsKLQkJCQlFc3RpbWF0aW5nTWV0cmljIGVzdGltYXRpbmdNZXRyaWMgPSAoRXN0aW1hdGluZ01ldHJpYyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXN0aW1hdGluZ01ldHJpYyhlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGVzdGltYXRpbmdNZXRyaWMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM6IHsKLQkJCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gKEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkVYQU1QTEU6IHsKLQkJCQlFeGFtcGxlIGV4YW1wbGUgPSAoRXhhbXBsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXhhbXBsZShleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZXhhbXBsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZXhhbXBsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGV4YW1wbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZXhhbXBsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFOiB7Ci0JCQkJR3VpZGFuY2UgZ3VpZGFuY2UgPSAoR3VpZGFuY2UpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGd1aWRhbmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChndWlkYW5jZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGd1aWRhbmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGd1aWRhbmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkYW5jZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChndWlkYW5jZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OOiB7Ci0JCQkJR3VpZGFuY2VEZXNjcmlwdGlvbiBndWlkYW5jZURlc2NyaXB0aW9uID0gKEd1aWRhbmNlRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUd1aWRhbmNlRGVzY3JpcHRpb24oZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURFTElORTogewotCQkJCUd1aWRlbGluZSBndWlkZWxpbmUgPSAoR3VpZGVsaW5lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VHdWlkZWxpbmUoZ3VpZGVsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuSVRFUkFUSU9OOiB7Ci0JCQkJSXRlcmF0aW9uIGl0ZXJhdGlvbiA9IChJdGVyYXRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUl0ZXJhdGlvbihpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTjogewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlndXJhdGlvbiA9IChNZXRob2RDb25maWd1cmF0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2RDb25maWd1cmF0aW9uKG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UOiB7Ci0JCQkJTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWTogewotCQkJCU1ldGhvZExpYnJhcnkgbWV0aG9kTGlicmFyeSA9IChNZXRob2RMaWJyYXJ5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2RMaWJyYXJ5KG1ldGhvZExpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQobWV0aG9kTGlicmFyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kTGlicmFyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kTGlicmFyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFOiB7Ci0JCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlID0gKE1ldGhvZFBhY2thZ2UpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UobWV0aG9kUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU46IHsKLQkJCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kUGx1Z2luKG1ldGhvZFBsdWdpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RQbHVnaW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kUGx1Z2luKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kUGx1Z2luKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kUGx1Z2luKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUOiB7Ci0JCQkJTWV0aG9kVW5pdCBtZXRob2RVbml0ID0gKE1ldGhvZFVuaXQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQobWV0aG9kVW5pdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RVbml0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kVW5pdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kVW5pdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk1JTEVTVE9ORTogewotCQkJCU1pbGVzdG9uZSBtaWxlc3RvbmUgPSAoTWlsZXN0b25lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNaWxlc3RvbmUobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlQ6IHsKLQkJCQlOYW1lZEVsZW1lbnQgbmFtZWRFbGVtZW50ID0gKE5hbWVkRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG5hbWVkRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChuYW1lZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5PVVRDT01FOiB7Ci0JCQkJT3V0Y29tZSBvdXRjb21lID0gKE91dGNvbWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU91dGNvbWUob3V0Y29tZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3Qob3V0Y29tZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQob3V0Y29tZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KG91dGNvbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQob3V0Y29tZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG91dGNvbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KG91dGNvbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QQUNLQUdFQUJMRV9FTEVNRU5UOiB7Ci0JCQkJUGFja2FnZWFibGVFbGVtZW50IHBhY2thZ2VhYmxlRWxlbWVudCA9IChQYWNrYWdlYWJsZUVsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwYWNrYWdlYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwYWNrYWdlYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocGFja2FnZWFibGVFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUEhBU0U6IHsKLQkJCQlQaGFzZSBwaGFzZSA9IChQaGFzZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUGhhc2UocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBOiB7Ci0JCQkJUGxhbm5pbmdEYXRhIHBsYW5uaW5nRGF0YSA9IChQbGFubmluZ0RhdGEpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBsYW5uaW5nRGF0YShwbGFubmluZ0RhdGEpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0U6IHsKLQkJCQlQcmFjdGljZSBwcmFjdGljZSA9IChQcmFjdGljZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJhY3RpY2UocHJhY3RpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChwcmFjdGljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJhY3RpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcmFjdGljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwcmFjdGljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OOiB7Ci0JCQkJUHJhY3RpY2VEZXNjcmlwdGlvbiBwcmFjdGljZURlc2NyaXB0aW9uID0gKFByYWN0aWNlRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByYWN0aWNlRGVzY3JpcHRpb24ocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1M6IHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIHByb2Nlc3MgPSAob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvY2Vzcyhwcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBY3Rpdml0eShwcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChwcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlQ6IHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvY2Vzc0NvbXBvbmVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzUGFja2FnZShwcm9jZXNzQ29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RQYWNrYWdlKHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0U6IHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPSAoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTjogewotCQkJCVByb2Nlc3NEZXNjcmlwdGlvbiBwcm9jZXNzRGVzY3JpcHRpb24gPSAoUHJvY2Vzc0Rlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcm9jZXNzRGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRUxFTUVOVDogewotCQkJCVByb2Nlc3NFbGVtZW50IHByb2Nlc3NFbGVtZW50ID0gKFByb2Nlc3NFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRTogewotCQkJCVByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlID0gKFByb2Nlc3NQYWNrYWdlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcm9jZXNzUGFja2FnZShwcm9jZXNzUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShwcm9jZXNzUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc1BhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc1BhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFOiB7Ci0JCQkJUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgPSAoUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBY3Rpdml0eShwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUkVQT1JUOiB7Ci0JCQkJUmVwb3J0IHJlcG9ydCA9IChSZXBvcnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlcG9ydChyZXBvcnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyZXBvcnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5SRVVTQUJMRV9BU1NFVDogewotCQkJCVJldXNhYmxlQXNzZXQgcmV1c2FibGVBc3NldCA9IChSZXVzYWJsZUFzc2V0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXVzYWJsZUFzc2V0KHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9BRE1BUDogewotCQkJCVJvYWRtYXAgcm9hZG1hcCA9IChSb2FkbWFwKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSb2FkbWFwKHJvYWRtYXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHJvYWRtYXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvYWRtYXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2FkbWFwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvYWRtYXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2FkbWFwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyb2FkbWFwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRTogewotCQkJCVJvbGUgcm9sZSA9IChSb2xlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSb2xlKHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTjogewotCQkJCVJvbGVEZXNjcmlwdGlvbiByb2xlRGVzY3JpcHRpb24gPSAoUm9sZURlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSb2xlRGVzY3JpcHRpb24ocm9sZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24ocm9sZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SOiB7Ci0JCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IgPSAoUm9sZURlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJvbGVEZXNjcmlwdG9yKHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUOiB7Ci0JCQkJUm9sZVNldCByb2xlU2V0ID0gKFJvbGVTZXQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJvbGVTZXQocm9sZVNldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlU2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlU2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZVNldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyb2xlU2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkc6IHsKLQkJCQlSb2xlU2V0R3JvdXBpbmcgcm9sZVNldEdyb3VwaW5nID0gKFJvbGVTZXRHcm91cGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUm9sZVNldEdyb3VwaW5nKHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OOiB7Ci0JCQkJU2VjdGlvbiBzZWN0aW9uID0gKFNlY3Rpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlY3Rpb24oc2VjdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChzZWN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc2VjdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHNlY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoc2VjdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlNVUFBPUlRJTkdfTUFURVJJQUw6IHsKLQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwgc3VwcG9ydGluZ01hdGVyaWFsID0gKFN1cHBvcnRpbmdNYXRlcmlhbCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU3VwcG9ydGluZ01hdGVyaWFsKHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2Uoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0s6IHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzayl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGFzayh0YXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0YXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0YXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRhc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT046IHsKLQkJCQlUYXNrRGVzY3JpcHRpb24gdGFza0Rlc2NyaXB0aW9uID0gKFRhc2tEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGFza0Rlc2NyaXB0aW9uKHRhc2tEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHRhc2tEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdCh0YXNrRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGFza0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGFza0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGFza0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUjogewotCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYXNrRGVzY3JpcHRvcih0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFOiB7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSAoVGVhbVByb2ZpbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRlYW1Qcm9maWxlKHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRFTVBMQVRFOiB7Ci0JCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSAoVGVtcGxhdGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRlbXBsYXRlKHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZSh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQodGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT046IHsKLQkJCQlUZXJtRGVmaW5pdGlvbiB0ZXJtRGVmaW5pdGlvbiA9IChUZXJtRGVmaW5pdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGVybURlZmluaXRpb24odGVybURlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0w6IHsKLQkJCQlUb29sIHRvb2wgPSAoVG9vbCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVG9vbCh0b29sKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkodG9vbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodG9vbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodG9vbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0b29sKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX01FTlRPUjogewotCQkJCVRvb2xNZW50b3IgdG9vbE1lbnRvciA9IChUb29sTWVudG9yKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUb29sTWVudG9yKHRvb2xNZW50b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHRvb2xNZW50b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuV0hJVEVQQVBFUjogewotCQkJCVdoaXRlcGFwZXIgd2hpdGVwYXBlciA9IChXaGl0ZXBhcGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXaGl0ZXBhcGVyKHdoaXRlcGFwZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbmNlcHQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2Uod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UOiB7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd29ya0JyZWFrZG93bkVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTjogewotCQkJCVdvcmtEZWZpbml0aW9uIHdvcmtEZWZpbml0aW9uID0gKFdvcmtEZWZpbml0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbih3b3JrRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSOiB7Ci0JCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtPcmRlcih3b3JrT3JkZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1Q6IHsKLQkJCQlXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3Qod29ya1Byb2R1Y3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OOiB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdGlvbiB3b3JrUHJvZHVjdERlc2NyaXB0aW9uID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24od29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SOiB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdvcmtQcm9kdWN0RGVzY3JpcHRvciA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0b3Iod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRTogewotCQkJCVdvcmtQcm9kdWN0VHlwZSB3b3JrUHJvZHVjdFR5cGUgPSAoV29ya1Byb2R1Y3RUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdFR5cGUod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBY3Rpdml0eShBY3Rpdml0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKEFjdGl2aXR5RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXJ0aWZhY3QoQXJ0aWZhY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXJ0aWZhY3REZXNjcmlwdGlvbihBcnRpZmFjdERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUJyZWFrZG93bkVsZW1lbnQoQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ2FwYWJpbGl0eVBhdHRlcm4oQ2FwYWJpbGl0eVBhdHRlcm4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDaGVja2xpc3QoQ2hlY2tsaXN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBvc2l0ZVJvbGUoQ29tcG9zaXRlUm9sZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29uY2VwdChDb25jZXB0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb25zdHJhaW50KENvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRlbnRDYXRlZ29yeShDb250ZW50Q2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKENvbnRlbnRDYXRlZ29yeVBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRlbnREZXNjcmlwdGlvbihDb250ZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb250ZW50RWxlbWVudChDb250ZW50RWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRlbnRQYWNrYWdlKENvbnRlbnRQYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyYWJsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyYWJsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVsaXZlcmFibGUoRGVsaXZlcmFibGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVsaXZlcmFibGVEZXNjcmlwdGlvbihEZWxpdmVyYWJsZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZWxpdmVyeVByb2Nlc3MoRGVsaXZlcnlQcm9jZXNzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbihEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpYmFibGVFbGVtZW50KERlc2NyaWJhYmxlRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRvcihEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdG9yRGVzY3JpcHRpb24oRGVzY3JpcHRvckRlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEaXNjaXBsaW5lKERpc2NpcGxpbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURpc2NpcGxpbmVHcm91cGluZyhEaXNjaXBsaW5lR3JvdXBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURvY3VtZW50Um9vdChEb2N1bWVudFJvb3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb21haW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEb21haW4oRG9tYWluIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFbGVtZW50KEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXN0aW1hdGUoRXN0aW1hdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXN0aW1hdGluZ01ldHJpYyhFc3RpbWF0aW5nTWV0cmljIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeGFtcGxlKEV4YW1wbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlR3VpZGFuY2UoR3VpZGFuY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlR3VpZGFuY2VEZXNjcmlwdGlvbihHdWlkYW5jZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlR3VpZGVsaW5lKEd1aWRlbGluZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUl0ZXJhdGlvbihJdGVyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWV0aG9kUGFja2FnZShNZXRob2RQYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFVuaXQoTWV0aG9kVW5pdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NaWxlc3RvbmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1pbGVzdG9uZShNaWxlc3RvbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU5hbWVkRWxlbWVudChOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRjb21lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGNvbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU91dGNvbWUoT3V0Y29tZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUGFja2FnZWFibGVFbGVtZW50KFBhY2thZ2VhYmxlRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQaGFzZShQaGFzZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUGxhbm5pbmdEYXRhKFBsYW5uaW5nRGF0YSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcmFjdGljZShQcmFjdGljZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcmFjdGljZURlc2NyaXB0aW9uKFByYWN0aWNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzRWxlbWVudChQcm9jZXNzRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NQYWNrYWdlKFByb2Nlc3NQYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZShQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXBvcnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlcG9ydChSZXBvcnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmV1c2FibGVBc3NldChSZXVzYWJsZUFzc2V0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSb2FkbWFwKFJvYWRtYXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJvbGUoUm9sZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUm9sZURlc2NyaXB0aW9uKFJvbGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVTZXQoUm9sZVNldCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlU2V0R3JvdXBpbmcoUm9sZVNldEdyb3VwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN0aW9uKFNlY3Rpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVN1cHBvcnRpbmdNYXRlcmlhbChTdXBwb3J0aW5nTWF0ZXJpYWwgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRhc2soVGFzayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGFza0Rlc2NyaXB0aW9uKFRhc2tEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGVhbVByb2ZpbGUoVGVhbVByb2ZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGVtcGxhdGUoVGVtcGxhdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUZXJtRGVmaW5pdGlvbihUZXJtRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRvb2w8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVG9vbChUb29sIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRvb2xNZW50b3IoVG9vbE1lbnRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2hpdGVwYXBlcihXaGl0ZXBhcGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChXb3JrQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtEZWZpbml0aW9uKFdvcmtEZWZpbml0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrT3JkZXIoV29ya09yZGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV29ya1Byb2R1Y3QoV29ya1Byb2R1Y3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdG9yKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdFR5cGUoV29ya1Byb2R1Y3RUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9VbWFTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hWE1MUHJvY2Vzc29yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVhNTFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMWY5MzZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hWE1MUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYVhNTFByb2Nlc3Nvci5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MDAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkudXRpbC5YTUxQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlciBtZXRob2RzIHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgWE1MIGRvY3VtZW50cwotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hWE1MUHJvY2Vzc29yIGV4dGVuZHMgWE1MUHJvY2Vzc29yIHsKLQkvKioKLQkgKiBQdWJsaWMgY29uc3RydWN0b3IgdG8gaW5zdGFudGlhdGUgdGhlIGhlbHBlci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hWE1MUHJvY2Vzc29yKCkgewotCQlzdXBlcigoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UpKTsKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIGZvciAiKiIgYW5kICJ4bWwiIGZpbGUgZXh0ZW5zaW9ucyB0aGUgVW1hUmVzb3VyY2VGYWN0b3J5SW1wbCBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0UmVnaXN0cmF0aW9ucygpIHsKLQkJaWYgKHJlZ2lzdHJhdGlvbnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UmVnaXN0cmF0aW9ucygpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoWE1MX0VYVEVOU0lPTiwgbmV3IFVtYVJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JCQlyZWdpc3RyYXRpb25zLnB1dChTVEFSX0VYVEVOU0lPTiwgbmV3IFVtYVJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lzdHJhdGlvbnM7Ci0JfQotCi19IC8vVW1hWE1MUHJvY2Vzc29yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVhNTFNhdmVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVhNTFNhdmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2YWM2YzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFYTUxTYXZlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFNhdmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuVmVyc2lvblV0aWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjdXN0b21pemUgdGhlIFhNTFNhdmVJbXBsIHRvIHNhdmUgdGhlIHN0cmluZyB0YWdzIGFzIENEQVRBCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVW1hWE1MU2F2ZUltcGwgZXh0ZW5kcyBYTUxTYXZlSW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgY2RhdGFGZWF0dXJlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jc3RhdGljIHsKLQkJCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiYWx0ZXJuYXRpdmVzIik7Ci0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgibWFpbkRlc2NyaXB0aW9uIik7Ci0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiaG93VG9TdGFmZiIpOwotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImtleUNvbnNpZGVyYXRpb25zIik7Ci0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicHVycG9zZSIpOwkKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJzY29wZSIpOwkJCQkJLy8gUHJvY2Vzc0Rlc2NyaXB0aW9uCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgidXNhZ2VOb3RlcyIpOwkJCS8vIFByb2Nlc3NEZXNjcmlwdGlvbgotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNDREFUQUZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGYsIGJvb2xlYW4gaXNBdHRyaWJ1dGUpIHsKLQkJCi0JCWlmICggaXNBdHRyaWJ1dGUgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0vLwkJaWYgKCBmID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpIAotLy8JCQl8fCBmID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKQotLy8JCQl8fCBmID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3Rpb25fRGVzY3JpcHRpb24oKQotLy8JCSkgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oInRlc3QiKTsKLS8vCQl9Ci0JCQotCQlyZXR1cm4gY2RhdGFGZWF0dXJlTmFtZXMuY29udGFpbnMoZi5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gaGVscGVyCi0JICovCi0JcHVibGljIFVtYVhNTFNhdmVJbXBsKFhNTEhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIoaGVscGVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9ucyBNYXAKLQkgKiBAcGFyYW0gaGVscGVyIFhNTEhlbHBlcgotCSAqIEBwYXJhbSBlbmNvZGluZyBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgVW1hWE1MU2F2ZUltcGwoTWFwIG9wdGlvbnMsIFhNTEhlbHBlciBoZWxwZXIsIFN0cmluZyBlbmNvZGluZykgewotCQlzdXBlcihvcHRpb25zLCBoZWxwZXIsIGVuY29kaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGF0eXBlVmFsdWUoT2JqZWN0IHZhbHVlLCBFU3RydWN0dXJhbEZlYXR1cmUgZiwKLQkJCWJvb2xlYW4gaXNBdHRyaWJ1dGUpIHsJCi0JCQotCQlpZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUudG9TdHJpbmcoKS5lcXVhbHMoIiIpICkgewotCQkJcmV0dXJuICIiOwotCQl9CQkJCQotCQkKLQkJaWYgKCBpc0NEQVRBRmVhdHVyZShmLCBpc0F0dHJpYnV0ZSkgKSB7Ci0JCQlTdHJpbmcgc3RyID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJCVN0cmluZyByZXBsYWNlZCA9ICJdXT4iOwkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5pbmRleE9mKHJlcGxhY2VkKSA+PSAwKSB7Ci0JCQkJc3RyID0gc3RyLnJlcGxhY2VBbGwocmVwbGFjZWQsICJdXV1dPjwhW0NEQVRBWz4iICk7CS8vJE5PTi1OTFMtMSQJLy8xNzUzOTUKLQkJCX0KLQkJCXJldHVybiAiPCFbQ0RBVEFbIiArIHN0ciArICJdXT4iOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0RGF0YXR5cGVWYWx1ZSh2YWx1ZSwgZiwgaXNBdHRyaWJ1dGUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlNTlmY2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBhY2Nlc3NpbmcgdGhlIFhNTCBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==